ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDZkYzM5ZWIuLjU3MGZiZjggMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMTAwLDkgKzEwMCwxMSBAQAogCWNvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQ2FsbGJhY2suYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhIZWFkc2V0LmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoUGJhcC5haWRsIFwKKwljb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDbGlwYm9hcmQuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ29udGVudFNlcnZpY2UuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JSW50ZW50UmVjZWl2ZXIuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JSW50ZW50U2VuZGVyLmFpZGwgXAorCWNvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JU3luY0FkYXB0ZXIuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JU3luY0NvbnRleHQuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JU3luY1N0YXR1c09ic2VydmVyLmFpZGwgXApAQCAtMTI5LDcgKzEzMSw2IEBACiAgICAgY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvSVdhbGxwYXBlckNvbm5lY3Rpb24uYWlkbCBcCiAgICAgY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvSVdhbGxwYXBlckVuZ2luZS5haWRsIFwKICAgICBjb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3dhbGxwYXBlci9JV2FsbHBhcGVyU2VydmljZS5haWRsIFwKLQljb3JlL2phdmEvYW5kcm9pZC90ZXh0L0lDbGlwYm9hcmQuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5TWFuYWdlci5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50LmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSUFwcGxpY2F0aW9uVG9rZW4uYWlkbCBcCkBAIC0xNTksNiArMTYwLDcgQEAKIAljb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9JSW5wdXRNZXRob2RDbGllbnQuYWlkbCBcCiAJY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvSUlucHV0TWV0aG9kTWFuYWdlci5haWRsIFwKIAljb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9JSW5wdXRNZXRob2RTZXNzaW9uLmFpZGwgXAorCWNvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvSVJlbW90ZVZpZXdzRmFjdG9yeS5haWRsIFwKIAljb3JlL2phdmEvY29tL3RydXN0ZWRsb2dpYy90cnVzdGVkbmZjL2FuZHJvaWQvSUxsY3BDb25uZWN0aW9ubGVzc1NvY2tldC5haWRsIFwKIAljb3JlL2phdmEvY29tL3RydXN0ZWRsb2dpYy90cnVzdGVkbmZjL2FuZHJvaWQvSUxsY3BTZXJ2aWNlU29ja2V0LmFpZGwgXAogCWNvcmUvamF2YS9jb20vdHJ1c3RlZGxvZ2ljL3RydXN0ZWRuZmMvYW5kcm9pZC9JTGxjcFNvY2tldC5haWRsIFwKQEAgLTE2Nyw2ICsxNjksOCBAQAogCWNvcmUvamF2YS9jb20vdHJ1c3RlZGxvZ2ljL3RydXN0ZWRuZmMvYW5kcm9pZC9JTmZjVGFnLmFpZGwgXAogCWNvcmUvamF2YS9jb20vdHJ1c3RlZGxvZ2ljL3RydXN0ZWRuZmMvYW5kcm9pZC9JUDJwSW5pdGlhdG9yLmFpZGwgXAogCWNvcmUvamF2YS9jb20vdHJ1c3RlZGxvZ2ljL3RydXN0ZWRuZmMvYW5kcm9pZC9JUDJwVGFyZ2V0LmFpZGwgXAorCWxvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JQ291bnRyeURldGVjdG9yLmFpZGwgXAorCWxvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JQ291bnRyeUxpc3RlbmVyLmFpZGwgXAogCWxvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JR2VvY29kZVByb3ZpZGVyLmFpZGwgXAogCWxvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JR3BzU3RhdHVzTGlzdGVuZXIuYWlkbCBcCiAJbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lHcHNTdGF0dXNQcm92aWRlci5haWRsIFwKQEAgLTM1Niw3ICszNjAsNyBAQAogCQkJZnJhbWV3b3JrIFwKIAogZnJhbWV3b3JrX2RvY3NfTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEpBVkFfTElCUkFSSUVTCi1mcmFtZXdvcmtfZG9jc19MT0NBTF9EUk9JRERPQ19IVE1MX0RJUiA6PSAkKExPQ0FMX1BBVEgpL2RvY3MvaHRtbCAkKE9VVF9ET0NTKS9nZW4KK2ZyYW1ld29ya19kb2NzX0xPQ0FMX0RST0lERE9DX0hUTUxfRElSIDo9IGRvY3MvaHRtbAogIyBUaGUgc2luY2UgZmxhZyAoLXNpbmNlIE4ueG1sIEFQSV9MRVZFTCkgaXMgdXNlZCB0byBhZGQgQVBJIExldmVsIGluZm9ybWF0aW9uCiAjIHRvIHRoZSByZWZlcmVuY2UgZG9jdW1lbnRhdGlvbi4gTXVzdCBiZSBpbiBvcmRlciBvZiBvbGRlc3QgdG8gbmV3ZXN0LgogZnJhbWV3b3JrX2RvY3NfTE9DQUxfRFJPSURET0NfT1BUSU9OUyA6PSBcCkBAIC0zNjksOCArMzczLDkgQEAKICAgICAtc2luY2UgLi9mcmFtZXdvcmtzL2Jhc2UvYXBpLzYueG1sIDYgXAogICAgIC1zaW5jZSAuL2ZyYW1ld29ya3MvYmFzZS9hcGkvNy54bWwgNyBcCiAgICAgLXNpbmNlIC4vZnJhbWV3b3Jrcy9iYXNlL2FwaS84LnhtbCA4IFwKLSAgICAtd2Vycm9yIC1oaWRlIDEzIFwKLSAgICAtb3ZlcnZpZXcgJChMT0NBTF9QQVRIKS9jb3JlL2phdmEvb3ZlcnZpZXcuaHRtbAorICAgIC1zaW5jZSAuL2ZyYW1ld29ya3MvYmFzZS9hcGkvY3VycmVudC54bWwgSEMgXAorCQktd2Vycm9yIC1oaWRlIDExMyBcCisJCS1vdmVydmlldyAkKExPQ0FMX1BBVEgpL2NvcmUvamF2YS9vdmVydmlldy5odG1sCiAKIGZyYW1ld29ya19kb2NzX0xPQ0FMX0FERElUSU9OQUxfSkFWQV9ESVI6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEpBVkFfTElCUkFSSUVTLGZyYW1ld29yaykKIApAQCAtNDI4LDcgKzQzMyw5IEBACiAJCS1zYW1wbGVjb2RlICQoc2FtcGxlX2RpcikvV2lrdGlvbmFyeVNpbXBsZSBcCiAJCSAgICAgICAgICAgIHJlc291cmNlcy9zYW1wbGVzL1dpa3Rpb25hcnlTaW1wbGUgIldpa3Rpb25hcnkgKFNpbXBsaWZpZWQpIiBcCiAJCS1zYW1wbGVjb2RlICQoc2FtcGxlX2RpcikvVm9pY2VSZWNvZ25pdGlvblNlcnZpY2UgXAotCQkgICAgICAgICAgICByZXNvdXJjZXMvc2FtcGxlcy9Wb2ljZVJlY29nbml0aW9uU2VydmljZSAiVm9pY2UgUmVjb2duaXRpb24gU2VydmljZSIKKwkJICAgICAgICAgICAgcmVzb3VyY2VzL3NhbXBsZXMvVm9pY2VSZWNvZ25pdGlvblNlcnZpY2UgIlZvaWNlIFJlY29nbml0aW9uIFNlcnZpY2UiIFwKKwkJLXNhbXBsZWNvZGUgJChzYW1wbGVfZGlyKS9YbWxBZGFwdGVycyBcCisJCSAgICAgICAgICAgIHJlc291cmNlcy9zYW1wbGVzL1htbEFkYXB0ZXJzICJYTUwgQWRhcHRlcnMiCiAKICMjIFNESyB2ZXJzaW9uIGlkZW50aWZpZXJzIHVzZWQgaW4gdGhlIHB1Ymxpc2hlZCBkb2NzCiAgICMgbWFqb3JbLm1pbm9yXSB2ZXJzaW9uIGZvciBjdXJyZW50IFNESy4gKGZ1bGwgcmVsZWFzZXMgb25seSkKQEAgLTQ2MywxMSArNDcwLDEzIEBACiAJCS1ub2RvY3MKIAogTE9DQUxfRFJPSURET0NfQ1VTVE9NX1RFTVBMQVRFX0RJUjo9YnVpbGQvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNkawotTE9DQUxfRFJPSURET0NfQ1VTVE9NX0FTU0VUX0RJUjo9YXNzZXRzLXNkaworCitMT0NBTF9VTklOU1RBTExBQkxFX01PRFVMRSA6PSB0cnVlCiAKIGluY2x1ZGUgJChCVUlMRF9EUk9JRERPQykKIAotJChmdWxsX3RhcmdldCk6ICQoZnJhbWV3b3JrX2J1aWx0KQorIyAkKGdlbiksIGkuZS4gZnJhbWV3b3JrLmFpZGwsIGlzIGFsc28gbmVlZGVkIHdoaWxlIGJ1aWxkaW5nIGFnYWluc3QgdGhlIGN1cnJlbnQgc3R1Yi4KKyQoZnVsbF90YXJnZXQpOiAkKGZyYW1ld29ya19idWlsdCkgJChnZW4pCiAkKElOVEVSTkFMX1BMQVRGT1JNX0FQSV9GSUxFKTogJChmdWxsX3RhcmdldCkKICQoY2FsbCBkaXN0LWZvci1nb2FscyxzZGssJChJTlRFUk5BTF9QTEFURk9STV9BUElfRklMRSkpCiAKQEAgLTQ5MCw3ICs0OTksOCBAQAogCQktcGFyc2Vjb21tZW50cwogCiBMT0NBTF9EUk9JRERPQ19DVVNUT01fVEVNUExBVEVfRElSOj1idWlsZC90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2RrCi1MT0NBTF9EUk9JRERPQ19DVVNUT01fQVNTRVRfRElSOj1hc3NldHMtc2RrCisKK0xPQ0FMX1VOSU5TVEFMTEFCTEVfTU9EVUxFIDo9IHRydWUKIAogaW5jbHVkZSAkKEJVSUxEX0RST0lERE9DKQogCkBAIC01MjEsMTQgKzUzMSwxMyBAQAogCQktcHJvb2ZyZWFkICQoT1VUX0RPQ1MpLyQoTE9DQUxfTU9EVUxFKS1wcm9vZnJlYWQudHh0IFwKIAkJLXRvZG8gJChPVVRfRE9DUykvJChMT0NBTF9NT0RVTEUpLWRvY3MtdG9kby5odG1sIFwKIAkJLXNka3ZhbHVlcyAkKE9VVF9ET0NTKSBcCi0JCS1oZGYgYW5kcm9pZC53aGljaGRvYyBvZmZsaW5lIAorCQktaGRmIGFuZHJvaWQud2hpY2hkb2Mgb2ZmbGluZQogCiBpZmVxICgkKGZyYW1ld29ya19kb2NzX1NES19QUkVWSUVXKSx0cnVlKQogICBMT0NBTF9EUk9JRERPQ19PUFRJT05TICs9IC1oZGYgc2RrLnByZXZpZXcgdHJ1ZQogZW5kaWYKIAogTE9DQUxfRFJPSURET0NfQ1VTVE9NX1RFTVBMQVRFX0RJUjo9YnVpbGQvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNkawotTE9DQUxfRFJPSURET0NfQ1VTVE9NX0FTU0VUX0RJUjo9YXNzZXRzLXNkawogCiBpbmNsdWRlICQoQlVJTERfRFJPSURET0MpCiAKQEAgLTU0MSw3ICs1NTAsNiBAQAogJChmdWxsX3RhcmdldCk6ICQoc3RhdGljX2RvY19pbmRleF9yZWRpcmVjdCkKICQoZnVsbF90YXJnZXQpOiAkKGZyYW1ld29ya19idWlsdCkKIAotCiAjID09PT0gZG9jcyBmb3IgdGhlIHdlYiAob24gdGhlIGdvb2dsZSBhcHAgZW5naW5lIHNlcnZlcikgPT09PT09PT09PT09PT09PT09PT09PT0KIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCkBAIC01NjUsMTIgKzU3MywxMSBAQAogCQktaGRmIHRlbXBsYXRlLnNob3dMYW5ndWFnZU1lbnUgdHJ1ZQogCiBMT0NBTF9EUk9JRERPQ19DVVNUT01fVEVNUExBVEVfRElSOj1idWlsZC90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2RrCi1MT0NBTF9EUk9JRERPQ19DVVNUT01fQVNTRVRfRElSOj1hc3NldHMtc2RrCiAKIGluY2x1ZGUgJChCVUlMRF9EUk9JRERPQykKIAogIyBleHBsaWNpdGx5IHNwZWNpZnkgdGhhdCBvbmxpbmUtc2RrIGRlcGVuZHMgb24gZnJhbWV3b3JrLXJlcyBhbmQgYW55IGdlbmVyYXRlZCBkb2NzCi0kKGZ1bGxfdGFyZ2V0KTogZnJhbWV3b3JrLXJlcy1wYWNrYWdlLXRhcmdldCAkKEFMTF9HRU5FUkFURURfRE9DUykKKyQoZnVsbF90YXJnZXQpOiBmcmFtZXdvcmstcmVzLXBhY2thZ2UtdGFyZ2V0CiAKICMgPT09PSBkb2NzIHRoYXQgaGF2ZSBhbGwgb2YgdGhlIHN0dWZmIHRoYXQncyBAaGlkZGVuID09PT09PT09PT09PT09PT09PT09PT09CiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKQEAgLTU4NywxMSArNTk0LDEwIEBACiBMT0NBTF9NT0RVTEUgOj0gaGlkZGVuCiBMT0NBTF9EUk9JRERPQ19PUFRJT05TOj1cCiAJCSQoZnJhbWV3b3JrX2RvY3NfTE9DQUxfRFJPSURET0NfT1BUSU9OUykgXAotICAgICAgICAtdGl0bGUgIkFuZHJvaWQgU0RLIC0gSW5jbHVkaW5nIGhpZGRlbiBBUElzLiIKLSMgICAgICAgIC1oaWRkZW4KKwkJLXRpdGxlICJBbmRyb2lkIFNESyAtIEluY2x1ZGluZyBoaWRkZW4gQVBJcy4iCisjCQktaGlkZGVuCiAKIExPQ0FMX0RST0lERE9DX0NVU1RPTV9URU1QTEFURV9ESVI6PWJ1aWxkL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zZGsKLUxPQ0FMX0RST0lERE9DX0NVU1RPTV9BU1NFVF9ESVI6PWFzc2V0cy1zZGsKIAogaW5jbHVkZSAkKEJVSUxEX0RST0lERE9DKQogCkBAIC02MDEsMTAgKzYwNywxNCBAQAogZXh0X2RpcnMgOj0gXAogCS4uLy4uL2V4dGVybmFsL25pc3Qtc2lwL2phdmEgXAogCS4uLy4uL2V4dGVybmFsL2FwYWNoZS1odHRwL3NyYyBcCi0JLi4vLi4vZXh0ZXJuYWwvdGFnc291cC9zcmMKKwkuLi8uLi9leHRlcm5hbC90YWdzb3VwL3NyYyBcCisJLi4vLi4vZXh0ZXJuYWwvbGlicGhvbmVudW1iZXIvamF2YS9zcmMKIAogZXh0X3NyY19maWxlcyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsJChleHRfZGlycykpCiAKK2V4dF9yZXNfZGlycyA6PSBcCisJLi4vLi4vZXh0ZXJuYWwvbGlicGhvbmVudW1iZXIvamF2YS9zcmMKKwogIyA9PT09ICB0aGUgbGlicmFyeSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCkBAIC02MTIsNiArNjIyLDcgQEAKIAogTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTIDo9IHRydWUKIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGNvcmUKK0xPQ0FMX0pBVkFfUkVTT1VSQ0VfRElSUyA6PSAkKGV4dF9yZXNfZGlycykKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiBMT0NBTF9NT0RVTEUgOj0gZXh0CiAKZGlmZiAtLWdpdCBhL0NsZWFuU3BlYy5tayBiL0NsZWFuU3BlYy5tawppbmRleCA1NjE4ZWFhLi5lNWYxZjkwIDEwMDY0NAotLS0gYS9DbGVhblNwZWMubWsKKysrIGIvQ2xlYW5TcGVjLm1rCkBAIC02Nyw3ICs2NywyMCBAQAogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGlicmV2ZXJiX2ludGVybWVkaWF0ZXMpCiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJyZXZlcmJ0ZXN0X2ludGVybWVkaWF0ZXMpCiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL3NvdW5kZngvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBmaW5kIC4gLXR5cGUgZiAtbmFtZSAiKi5ycyIgLXByaW50MCB8IHhhcmdzIC0wIHRvdWNoKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGliYW5kcm9pZF9ydW50aW1lX2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovbGliL2xpYmFuZHJvaWRfcnVudGltZS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5bWJvbHMvc3lzdGVtL2xpYi9saWJhbmRyb2lkX3J1bnRpbWUuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYmFuZHJvaWRfcnVudGltZS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TSEFSRURfTElCUkFSSUVTL2xpYmh3dWlfaW50ZXJtZWRpYXRlcykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9saWIvbGliaHd1aS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5bWJvbHMvc3lzdGVtL2xpYi9saWJod3VpLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9saWJod3VpLnNvKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9mcmFtZXdvcmtfaW50ZXJtZWRpYXRlcy9zcmMvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS8qKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9mcmFtZXdvcmtfaW50ZXJtZWRpYXRlcy9zcmMvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ2xpcGJvYXJkLlApCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2ZyYW1ld29ya19pbnRlcm1lZGlhdGVzL3NyYy90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueVJlZ2lzdHJ5LlApCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2FuZHJvaWRfc3R1YnNfY3VycmVudF9pbnRlcm1lZGlhdGVzKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgb3V0L3RhcmdldC9jb21tb24vZG9jcy9hcGktc3R1YnMqKQogCiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKZGlmZiAtLWdpdCBhL2FwaS85LnhtbCBiL2FwaS85LnhtbAppbmRleCA5ZmYxMjg3Li4zZTc2NTNjIDEwMDY0NAotLS0gYS9hcGkvOS54bWwKKysrIGIvYXBpLzkueG1sCkBAIC0xNTg0NSwxNyArMTU4NDUsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRJbnN0YW5jZUNvdW50IgotIHJldHVybj0ibG9uZyIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEludGVudCIKICByZXR1cm49ImFuZHJvaWQuY29udGVudC5JbnRlbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTg1NzEsMTYgKzU4NTYwLDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYml0bWFwIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Ci08Y29uc3RydWN0b3IgbmFtZT0iQ2FudmFzIgotIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZ2wiIHR5cGU9ImphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMIj4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iY2xpcFBhdGgiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU5NDk3LDE3ICs1OTQ3Niw2IEBACiA8cGFyYW1ldGVyIG5hbWU9InBhaW50IiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLlBhaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImZyZWVHbENhY2hlcyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRDbGlwQm91bmRzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01OTU1NCwxNyArNTk1MjIsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRHTCIKLSByZXR1cm49ImphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEhlaWdodCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01OTkyOCwyMSArNTk4ODUsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJtYXRyaXgiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldFZpZXdwb3J0IgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0id2lkdGgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iaGVpZ2h0IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2tldyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNzQxNDgsNyArNzQwOTAsNyBAQAogIHR5cGU9ImZsb2F0IgogIHRyYW5zaWVudD0iZmFsc2UiCiAgdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIwLjAwMTBmIgorIHZhbHVlPSIwLjAwMWYiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtMTQ3NzYwLDE3ICsxNDc3MDIsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvY29uc3RydWN0b3I+Ci08bWV0aG9kIG5hbWU9ImFib3J0VXBkYXRlcyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2xvc2UiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0Nzc4MiwzMCArMTQ3NzEzLDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iY29tbWl0VXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iY29tbWl0VXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDs/IGV4dGVuZHMgamF2YS5sYW5nLkxvbmcsID8gZXh0ZW5kcyBqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QmZ3Q7Jmd0OyI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjb3B5U3RyaW5nVG9CdWZmZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0NzgzMiwxNyArMTQ3NzM5LDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZGVsZXRlUm93IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRCbG9iIgogIHJldHVybj0iYnl0ZVtdIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0ODAzOSwxNyArMTQ3OTM1LDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iaGFzVXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNBZnRlckxhc3QiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0ODI1MywxNyArMTQ4MTM4LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3VwcG9ydHNVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ1bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNDgyOTAsMTI0ICsxNDgxNjQsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJvYnNlcnZlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlQmxvYiIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJieXRlW10iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlRG91YmxlIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImRvdWJsZSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVGbG9hdCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJmbG9hdCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVJbnQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUxvbmciCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0ibG9uZyI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVTaG9ydCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJzaG9ydCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVTdHJpbmciCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVUb051bGwiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ik1vY2tEaWFsb2dJbnRlcmZhY2UiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTE2NDY3NCw3ICsxNjQ0MzAsNyBAQAogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKICB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IiZxdW90OygoYWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoYml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfChjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KGVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KGdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KGluZm98aW50fGlbZGVsbW5vcXJzdF0pfChqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfChtaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KG5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KG9yZ3xvbSl8KHByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KHRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCh4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC16Y2t6YWgpfHlbZXR1XXx6W2Ftd10pJnF1b3Q7IgorIHZhbHVlPSImcXVvdDsoKGFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KGJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoY2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfChlZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfChnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfChpbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoam9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwobWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfChuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfChvcmd8b20pfChwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCh0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoeG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtbWdiYWFtN2E4aHx4blxcLVxcLW1nYmVycDRhNWQ0YXJ8eG5cXC1cXC13Z2JoMWN8eG5cXC1cXC16Y2t6YWgpfHlbZXRdfHpbYW13XSkmcXVvdDsiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtMTY0Njg1LDcgKzE2NDQ0MSw3IEBACiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgogIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iJnF1b3Q7KD86KD86YWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoPzpiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KD86Y2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfCg/OmVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KD86Z292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoPzppbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoPzpqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfCg/Om1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwoPzpuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfCg/Om9yZ3xvbSl8KD86cHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwoPzp0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoPzp4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC16Y2t6YWgpfHlbZXR1XXx6W2Ftd10pKSZxdW90OyIKKyB2YWx1ZT0iJnF1b3Q7KD86KD86YWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoPzpiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KD86Y2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfCg/OmVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KD86Z292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoPzppbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoPzpqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfCg/Om1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwoPzpuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfCg/Om9yZ3xvbSl8KD86cHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwoPzp0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoPzp4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCl8eVtldF18elthbXddKSkmcXVvdDsiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtMTk1NTk2LDYgKzE5NTM1MiwzOSBAQAogPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9NVUxUSVBMRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfTk9ORSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfU0lOR0xFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxtZXRob2QgbmFtZT0iYWZ0ZXJUZXh0Q2hhbmdlZCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA0MDUyLDM5ICsyMDM4NDEsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ5IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9NVUxUSVBMRSIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjIiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfTk9ORSIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjAiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfU0lOR0xFIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTGlzdFZpZXcuRml4ZWRWaWV3SW5mbyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgpkaWZmIC0tZ2l0IGEvYXBpL2N1cnJlbnQueG1sIGIvYXBpL2N1cnJlbnQueG1sCmluZGV4IGM0YzE5YzkuLjA4ZTg2NzAgMTAwNjQ0Ci0tLSBhL2FwaS9jdXJyZW50LnhtbAorKysgYi9hcGkvY3VycmVudC54bWwKQEAgLTE0NzEsNiArMTQ3MSwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYW5pbWF0b3JfZmFkZV9pbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE3NDMyNjA5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFuaW1hdG9yX2ZhZGVfb3V0IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTc0MzI2MTAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iYW50aWNpcGF0ZV9pbnRlcnBvbGF0b3IiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMDc3LDYgKzIwOTksMTcxIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25CYXJTaXplIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NjciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uQmFyU3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25CYXJUYWJCYXJTdHlsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTc2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbkJhclRhYlN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NzUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uQmFyVGFiVGV4dFN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NzciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uQnV0dG9uUGFkZGluZyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQ3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbkJ1dHRvblN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uRHJvcERvd25TdHlsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQ0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbkxheW91dCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTg0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbk1vZGVCYWNrZ3JvdW5kIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uTW9kZUNsb3NlQnV0dG9uU3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU4MCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25Nb2RlQ2xvc2VEcmF3YWJsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTUwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbk92ZXJmbG93QnV0dG9uU3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU3OCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25WaWV3Q2xhc3MiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU4NSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3RpdmF0ZWRCYWNrZ3JvdW5kSW5kaWNhdG9yIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1ODYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iYWN0aXZpdHlDbG9zZUVudGVyQW5pbWF0aW9uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjEyMSw2ICsyMzA4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhZGFwdGVyIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iYWRkU3RhdGVzRnJvbUNoaWxkcmVuIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjE1NCw2ICsyMzUyLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhbGxDb250YWN0c05hbWUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJhbGxvd0JhY2t1cCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIyNDIsNiArMjQ1MSwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYW5pbWF0ZUZpcnN0VmlldyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFuaW1hdGVMYXlvdXRDaGFuZ2VzIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NzQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iYW5pbWF0ZU9uQ2xpY2siCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMzMwLDYgKzI1NjEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFzIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iYXV0aG9yIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjU2MSw2ICsyODAzLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJicmVhZENydW1iU2hvcnRUaXRsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTkzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImJyZWFkQ3J1bWJUaXRsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTkyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImJ1ZmZlclR5cGUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yOTkwLDYgKzMyNTQsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImNvbHVtbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTMwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImNvbHVtbkRlbGF5IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzEzMyw2ICszNDA4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJjdXN0b21OYXZpZ2F0aW9uTGF5b3V0IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iY3ljbGVzIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzM5Nyw2ICszNjgzLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJkaXNwbGF5T3B0aW9ucyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImRpdGhlciIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTM1OTUsNiArMzg5MiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZHJvcERvd25TcGlubmVyU3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJkcm9wRG93blZlcnRpY2FsT2Zmc2V0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNDE1Niw2ICs0NDY0LDEwNSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJhZ21lbnQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1NyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmcmFnbWVudENsb3NlRW50ZXJBbmltYXRpb24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU2MSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmcmFnbWVudENsb3NlRXhpdEFuaW1hdGlvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTYyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyYWdtZW50TmV4dEVudGVyQW5pbWF0aW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJhZ21lbnROZXh0RXhpdEFuaW1hdGlvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTY0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyYWdtZW50T3BlbkVudGVyQW5pbWF0aW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJhZ21lbnRPcGVuRXhpdEFuaW1hdGlvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTYwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyYWdtZW50UHJldkVudGVyQW5pbWF0aW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NjUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJhZ21lbnRQcmV2RXhpdEFuaW1hdGlvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTY2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImZyZWV6ZXNUZXh0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNDE2Nyw2ICs0NTc0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmcm9tIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iZnJvbUFscGhhIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNDE4OSw2ICs0NjA3LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmcm9tVmFsdWUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyOCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJmcm9tWERlbHRhIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNDQ3NSw2ICs0OTA0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJoYXJkd2FyZUFjY2VsZXJhdGVkIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iaGFzQ29kZSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQ1OTYsNiArNTAzNiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iaWNvbmlmaWVkQnlEZWZhdWx0IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1ODMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iaWQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC00NzA2LDYgKzUxNTcsNTAgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImltZVN1YnR5cGVFeHRyYVZhbHVlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NzAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iaW1lU3VidHlwZUxvY2FsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTY4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImltZVN1YnR5cGVNb2RlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NjkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iaW1tZXJzaXZlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM0NTYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iaW5BbmltYXRpb24iCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC01MDQ3LDYgKzU1NDIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Iml0ZW1QYWRkaW5nIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NzkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iaXRlbVRleHRBcHBlYXJhbmNlIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNjMxMiw2ICs2ODE4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJsaXN0Q2hvaWNlQmFja2dyb3VuZEluZGljYXRvciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTcyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JNdWx0aXBsZSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTYzNDUsNiArNjg2MiwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ibGlzdERpdmlkZXJBbGVydERpYWxvZyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTk0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Imxpc3RQb3B1cFdpbmRvd1N0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1ODgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ibGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC02NDAwLDYgKzY5MzksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImxvZ28iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzQ1NCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJsb25nQ2xpY2thYmxlIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNjQxMSw2ICs2OTYxLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJsb29wVmlld3MiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU5NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJtYW5hZ2VTcGFjZUFjdGl2aXR5IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNjU2NSw2ICs3MTI2LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJtZWFzdXJlV2l0aExhcmdlc3RDaGlsZCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Im1lbnVDYXRlZ29yeSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTY2OTcsNiArNzI2OSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ibmF2aWdhdGlvbk1vZGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzNiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJuZWdhdGl2ZUJ1dHRvblRleHQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC02ODYyLDYgKzc0NDUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Im9yZGVyaW5nIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ib3JkZXJpbmdGcm9tWG1sIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNjg5NSwzOSArNzQ4OSw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJvdmVyc2Nyb2xsRm9vdGVyIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMTY4NDM0NTkiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0ib3ZlcnNjcm9sbEhlYWRlciIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjE2ODQzNDU4IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9Im92ZXJzY3JvbGxNb2RlIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMTY4NDM0NTciCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+CiA8ZmllbGQgbmFtZT0icGFkZGluZyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTcyMTQsNiArNzc3NSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0icG9wdXBNZW51U3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU4OSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJwb3B1cFdpbmRvd1N0eWxlIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNzMwMiw2ICs3ODc0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJwcmV2aWV3SW1hZ2UiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0OCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJwcmlvcml0eSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTc0NTYsNiArODAzOSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0icHJvcGVydHlOYW1lIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0icHJvdGVjdGlvbkxldmVsIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtODIyNiw2ICs4ODIwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzZWxlY3Rpb24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJzZXR0aW5nc0FjdGl2aXR5IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtODMzNiw2ICs4OTQxLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzaG93QXNBY3Rpb24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJzaG93RGVmYXVsdCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTg0MTMsNiArOTAyOSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic29ydE9yZGVyIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic291bmRFZmZlY3RzRW5hYmxlZCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTg0NTcsNiArOTA4NCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic3Bpbm5lck1vZGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU3MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJzcGlubmVyU3R5bGUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC04NDY4LDYgKzkxMDYsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNwbGl0TW90aW9uRXZlbnRzIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NzEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic3JjIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtODU1Niw2ICs5MjA1LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzdGF0ZV9hY3RpdmF0ZWQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU4NyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJzdGF0ZV9hY3RpdmUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC04NzY1LDYgKzk0MjUsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InN1YnRpdGxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic3VidGl0bGVUZXh0U3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU4MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJzdWdnZXN0QWN0aW9uTXNnIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtOTEzOSw2ICs5ODIxLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ0ZXh0QXBwZWFyYW5jZUxhcmdlUG9wdXBNZW51IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1OTAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idGV4dEFwcGVhcmFuY2VNZWRpdW0iCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC05MjA1LDYgKzk4OTgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InRleHRBcHBlYXJhbmNlU21hbGxQb3B1cE1lbnUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU5MSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJ0ZXh0Q2hlY2tNYXJrIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtOTIzOCw2ICs5OTQyLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ0ZXh0Q29sb3JBbGVydERpYWxvZ0xpc3RJdGVtIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1OTUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idGV4dENvbG9ySGlnaGxpZ2h0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtOTY0NSw2ICsxMDM2MCwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idGl0bGVUZXh0U3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU4MSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ0byIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTI2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InRvQWxwaGEiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC05NjY3LDYgKzEwNDA0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ0b1ZhbHVlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idG9YRGVsdGEiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC05ODQzLDYgKzEwNTkxLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ1cmkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJ1c2VMZXZlbCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTk4NzYsNiArMTA2MzUsMzkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InZhbHVlRnJvbSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTUyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InZhbHVlVG8iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ2YWx1ZVR5cGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1NCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJ2YXJpYWJsZVBhZGRpbmciCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xMDE4NCw2ICsxMDk3NiwzOSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0id2luZG93QWN0aW9uQmFyIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0id2luZG93QWN0aW9uQmFyT3ZlcmxheSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTU4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IndpbmRvd0FjdGlvbk1vZGVPdmVybGF5IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0id2luZG93QW5pbWF0aW9uU3R5bGUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xMDM5Myw2ICsxMTIxOCwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0id2l0aENsYXNzIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0id2l0aEV4cHJlc3Npb24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJ3cml0ZVBlcm1pc3Npb24iCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNDA0Miw2ICsxNDg4OSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iaG9tZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTA4MzUzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Imljb24iCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNDQyNyw2ICsxNTI4NSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic2VsZWN0VGV4dE1vZGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjkwODM1NCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJzZWxlY3RlZEljb24iCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNDk2Nyw2ICsxNTgzNiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ibGlzdF9jb250ZW50IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTczNjcwNzMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0icHJlZmVyZW5jZV9jYXRlZ29yeSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE1MDc3LDYgKzE1OTU3LDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzaW1wbGVfbGlzdF9pdGVtX2FjdGl2YXRlZF8xIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTczNjcwNzUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic2ltcGxlX2xpc3RfaXRlbV9hY3RpdmF0ZWRfMiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE3MzY3MDc2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNpbXBsZV9saXN0X2l0ZW1fY2hlY2tlZCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE1MTEwLDYgKzE2MDEyLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzaW1wbGVfc2VsZWN0YWJsZV9saXN0X2l0ZW0iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNzM2NzA3NCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJzaW1wbGVfc3Bpbm5lcl9kcm9wZG93bl9pdGVtIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTUxNTUsNiArMTYwNjgsMjMgQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlIubWVudSIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlIubWVudSIKKyB0eXBlPSJhbmRyb2lkLlIubWVudSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJSLnBsdXJhbHMiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNTUzNSw2ICsxNjQ2NSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic2VsZWN0VGV4dE1vZGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNzAzOTM5MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJ1bmtub3duTmFtZSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE1OTU5LDYgKzE2OTAwLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUZXh0QXBwZWFyYW5jZV9XaWRnZXRfUG9wdXBNZW51X0xhcmdlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5ODQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGV4dEFwcGVhcmFuY2VfV2lkZ2V0X1BvcHVwTWVudV9TbWFsbCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTg1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlRleHRBcHBlYXJhbmNlX1dpZGdldF9UYWJXaWRnZXQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNjA2OSw2ICsxNzAzMiw1MCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGhlbWVfRGlhbG9nX05vRnJhbWUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUaGVtZV9Ib2xvIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5NzQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGhlbWVfSG9sb19Ob0FjdGlvbkJhciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTc2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRoZW1lX0hvbG9fTm9BY3Rpb25CYXJfRnVsbHNjcmVlbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTc3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlRoZW1lX0lucHV0TWV0aG9kIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTYwOTEsNiArMTcwOTgsMzkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRoZW1lX0xpZ2h0X0hvbG8iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3NSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUaGVtZV9MaWdodF9Ib2xvX05vQWN0aW9uQmFyIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5NzgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGhlbWVfTGlnaHRfSG9sb19Ob0FjdGlvbkJhcl9GdWxsc2NyZWVuIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5NzkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iVGhlbWVfTGlnaHRfTm9UaXRsZUJhciIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE2MTY4LDYgKzE3MjA4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUaGVtZV9Ob1RpdGxlQmFyX092ZXJsYXlBY3Rpb25Nb2RlcyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTczIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlRoZW1lX1BhbmVsIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTYyNTYsNiArMTczMDcsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRoZW1lX1dpdGhBY3Rpb25CYXIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk2OSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJXaWRnZXQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNjI3OCw2ICsxNzM0MCwzOSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iV2lkZ2V0X0FjdGlvbkJ1dHRvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTcxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IldpZGdldF9BY3Rpb25CdXR0b25fQ2xvc2VNb2RlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5ODMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iV2lkZ2V0X0FjdGlvbkJ1dHRvbl9PdmVyZmxvdyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTgyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IldpZGdldF9BdXRvQ29tcGxldGVUZXh0VmlldyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE2NDIxLDYgKzE3NTE2LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJXaWRnZXRfRnJhZ21lbnRCcmVhZENydW1icyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTg2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IldpZGdldF9HYWxsZXJ5IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTY0NzYsNiArMTc1ODIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IldpZGdldF9MaXN0UG9wdXBXaW5kb3ciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk4MCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJXaWRnZXRfTGlzdFZpZXciCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNjUyMCw2ICsxNzYzNywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iV2lkZ2V0X1BvcHVwTWVudSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTgxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IldpZGdldF9Qb3B1cFdpbmRvdyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE2NjUyLDYgKzE3NzgwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJXaWRnZXRfU3Bpbm5lcl9Ecm9wRG93biIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTcwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IldpZGdldF9UYWJXaWRnZXQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xOTAzMiw4ICsyMDE3MSwyNTkyIEBACiA8L2NvbnN0cnVjdG9yPgogPC9jbGFzcz4KIDwvcGFja2FnZT4KKzxwYWNrYWdlIG5hbWU9ImFuZHJvaWQuYW5pbWF0aW9uIgorPgorPGNsYXNzIG5hbWU9IkFuaW1hdG9yIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5sYW5nLkNsb25lYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iQW5pbWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYWRkTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjYW5jZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNsb25lIgorIHJldHVybj0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5kIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREdXJhdGlvbiIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRMaXN0ZW5lcnMiCisgcmV0dXJuPSJqYXZhLnV0aWwuQXJyYXlMaXN0Jmx0O2FuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yLkFuaW1hdG9yTGlzdGVuZXImZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN0YXJ0RGVsYXkiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNSdW5uaW5nIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZUFsbExpc3RlbmVycyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREdXJhdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW50ZXJwb2xhdG9yIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RhcnREZWxheSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnREZWxheSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUYXJnZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YXJnZXQiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0dXBFbmRWYWx1ZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldHVwU3RhcnRWYWx1ZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25DYW5jZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25FbmQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25SZXBlYXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25TdGFydCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iQW5pbWF0b3JJbmZsYXRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQW5pbWF0b3JJbmZsYXRlciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvckluZmxhdGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImxvYWRBbmltYXRvciIKKyByZXR1cm49ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24iIHR5cGU9ImFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25DYW5jZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQW5pbWF0aW9uRW5kIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkFuaW1hdGlvblJlcGVhdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25TdGFydCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQW5pbWF0b3JTZXQiCisgZXh0ZW5kcz0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFuaW1hdG9yU2V0IgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yU2V0IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldENoaWxkQW5pbWF0aW9ucyIKKyByZXR1cm49ImphdmEudXRpbC5BcnJheUxpc3QmbHQ7YW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3ImZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldER1cmF0aW9uIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdGFydERlbGF5IgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1J1bm5pbmciCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBsYXkiCisgcmV0dXJuPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvclNldC5CdWlsZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwbGF5U2VxdWVudGlhbGx5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbXMiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yLi4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBsYXlUb2dldGhlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW1zIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREdXJhdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEludGVycG9sYXRvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVycG9sYXRvciIgdHlwZT0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RhcnREZWxheSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0RGVsYXkiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQW5pbWF0b3JTZXQuQnVpbGRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImFmdGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbSIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWZ0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkZWxheSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJiZWZvcmUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ3aXRoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbSIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iRG91YmxlRXZhbHVhdG9yIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuYW5pbWF0aW9uLlR5cGVFdmFsdWF0b3IiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkRvdWJsZUV2YWx1YXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5Eb3VibGVFdmFsdWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZXZhbHVhdGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0VmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkZsb2F0RXZhbHVhdG9yIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuYW5pbWF0aW9uLlR5cGVFdmFsdWF0b3IiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkZsb2F0RXZhbHVhdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkZsb2F0RXZhbHVhdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImV2YWx1YXRlIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJJbnRFdmFsdWF0b3IiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5hbmltYXRpb24uVHlwZUV2YWx1YXRvciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iSW50RXZhbHVhdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkludEV2YWx1YXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJldmFsdWF0ZSIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kVmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iS2V5ZnJhbWUiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5sYW5nLkNsb25lYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iS2V5ZnJhbWUiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uS2V5ZnJhbWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJLZXlmcmFtZSIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5LZXlmcmFtZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5GbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iS2V5ZnJhbWUiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uS2V5ZnJhbWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuSW50ZWdlciI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iS2V5ZnJhbWUiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uS2V5ZnJhbWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuRG91YmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJLZXlmcmFtZSIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5LZXlmcmFtZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iS2V5ZnJhbWUiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uS2V5ZnJhbWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iS2V5ZnJhbWUiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uS2V5ZnJhbWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJkb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJjbG9uZSIKKyByZXR1cm49ImFuZHJvaWQuYW5pbWF0aW9uLktleWZyYW1lIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEZyYWN0aW9uIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SW50ZXJwb2xhdG9yIgorIHJldHVybj0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKKyByZXR1cm49ImphdmEubGFuZy5DbGFzcyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWYWx1ZSIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RnJhY3Rpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW50ZXJwb2xhdG9yIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZXJwb2xhdG9yIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRWYWx1ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkxheW91dFRyYW5zaXRpb24iCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkxheW91dFRyYW5zaXRpb24iCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uTGF5b3V0VHJhbnNpdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhZGRDaGlsZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmVudCIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXdHcm91cCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2hpbGQiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFkZFRyYW5zaXRpb25MaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5MYXlvdXRUcmFuc2l0aW9uLlRyYW5zaXRpb25MaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBbmltYXRvciIKKyByZXR1cm49ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0aW9uVHlwZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldER1cmF0aW9uIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdGlvblR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJbnRlcnBvbGF0b3IiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdGlvblR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdGFnZ2VyIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdGlvblR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdGFydERlbGF5IgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdGlvblR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUcmFuc2l0aW9uTGlzdGVuZXJzIgorIHJldHVybj0iamF2YS51dGlsLkxpc3QmbHQ7YW5kcm9pZC5hbmltYXRpb24uTGF5b3V0VHJhbnNpdGlvbi5UcmFuc2l0aW9uTGlzdGVuZXImZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImhpZGVDaGlsZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmVudCIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXdHcm91cCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2hpbGQiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZUNoaWxkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlld0dyb3VwIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjaGlsZCIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlVHJhbnNpdGlvbkxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb24uVHJhbnNpdGlvbkxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEFuaW1hdG9yIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdGlvblR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0b3IiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldER1cmF0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RHVyYXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0aW9uVHlwZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkdXJhdGlvbiIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJbnRlcnBvbGF0b3IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0aW9uVHlwZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlcnBvbGF0b3IiIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN0YWdnZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0aW9uVHlwZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkdXJhdGlvbiIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdGFydERlbGF5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdGlvblR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVsYXkiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvd0NoaWxkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlld0dyb3VwIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjaGlsZCIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJBUFBFQVJJTkciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNIQU5HRV9BUFBFQVJJTkciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNIQU5HRV9ESVNBUFBFQVJJTkciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkRJU0FQUEVBUklORyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJMYXlvdXRUcmFuc2l0aW9uLlRyYW5zaXRpb25MaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iZW5kVHJhbnNpdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uTGF5b3V0VHJhbnNpdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlld0dyb3VwIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdGlvblR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydFRyYW5zaXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb24iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXdHcm91cCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXRpb25UeXBlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9Ik9iamVjdEFuaW1hdG9yIgorIGV4dGVuZHM9ImFuZHJvaWQuYW5pbWF0aW9uLlZhbHVlQW5pbWF0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9Ik9iamVjdEFuaW1hdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iT2JqZWN0QW5pbWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkdXJhdGlvbiIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFyZ2V0IiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwcm9wZXJ0eU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iVC4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iT2JqZWN0QW5pbWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkdXJhdGlvbiIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFyZ2V0IiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5VmFsdWVzSG9sZGVyLi4uIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0UHJvcGVydHlOYW1lIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUYXJnZXQiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFByb3BlcnR5TmFtZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByb3BlcnR5TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJQcm9wZXJ0eVZhbHVlc0hvbGRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmxhbmcuQ2xvbmVhYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQcm9wZXJ0eVZhbHVlc0hvbGRlciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eVZhbHVlc0hvbGRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iVC4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iUHJvcGVydHlWYWx1ZXNIb2xkZXIiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlWYWx1ZXNIb2xkZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcm9wZXJ0eU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iVC4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImNsb25lIgorIHJldHVybj0iYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlWYWx1ZXNIb2xkZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0R2V0dGVyIgorIHJldHVybj0iamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByb3BlcnR5TmFtZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2V0dGVyIgorIHJldHVybj0iamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEV2YWx1YXRvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImV2YWx1YXRvciIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uVHlwZUV2YWx1YXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRHZXR0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJnZXR0ZXIiIHR5cGU9ImphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQcm9wZXJ0eU5hbWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcm9wZXJ0eU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2V0dGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2V0dGVyIiB0eXBlPSJqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VmFsdWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJULi4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlJHQkV2YWx1YXRvciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJSR0JFdmFsdWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uUkdCRXZhbHVhdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImV2YWx1YXRlIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iVHlwZUV2YWx1YXRvciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImV2YWx1YXRlIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0VmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJWYWx1ZUFuaW1hdG9yIgorIGV4dGVuZHM9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iVmFsdWVBbmltYXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iVmFsdWVBbmltYXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iVC4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImFkZFVwZGF0ZUxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlZhbHVlQW5pbWF0b3IuQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBbmltYXRlZFZhbHVlIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBbmltYXRlZFZhbHVlIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvcGVydHlOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEN1cnJlbnRQbGF5VGltZSIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RHVyYXRpb24iCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEZyYW1lRGVsYXkiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SW50ZXJwb2xhdG9yIgorIHJldHVybj0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UmVwZWF0Q291bnQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UmVwZWF0TW9kZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdGFydERlbGF5IgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWYWx1ZXMiCisgcmV0dXJuPSJhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eVZhbHVlc0hvbGRlcltdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzUnVubmluZyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlQWxsVXBkYXRlTGlzdGVuZXJzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVVcGRhdGVMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmV2ZXJzZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q3VycmVudFBsYXlUaW1lIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGxheVRpbWUiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RHVyYXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkdXJhdGlvbiIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFdmFsdWF0b3IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uVHlwZUV2YWx1YXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRGcmFtZURlbGF5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFtZURlbGF5IiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEludGVycG9sYXRvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSZXBlYXRDb3VudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UmVwZWF0TW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RhcnREZWxheSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0RGVsYXkiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VmFsdWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eVZhbHVlc0hvbGRlci4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRWYWx1ZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9IlQuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJJTkZJTklURSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0xIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlJFU1RBUlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlJFVkVSU0UiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iVmFsdWVBbmltYXRvci5BbmltYXRvclVwZGF0ZUxpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbkFuaW1hdGlvblVwZGF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImFuZHJvaWQuYXBwIgogPgorPGNsYXNzIG5hbWU9IkFjdGlvbkJhciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBY3Rpb25CYXIiCisgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImFkZFRhYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFiIiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuVGFiIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFkZFRhYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFiIiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuVGFiIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEN1c3RvbU5hdmlnYXRpb25WaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREaXNwbGF5T3B0aW9ucyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEhlaWdodCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGVkVGFiIgorIHJldHVybj0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN1YnRpdGxlIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRpdGxlIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImhpZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNTaG93aW5nIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5ld1RhYiIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVUYWIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhYiIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVUYWJBdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZWxlY3RUYWIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhYiIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRCYWNrZ3JvdW5kRHJhd2FibGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImQiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERpc3BsYXlPcHRpb25zIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcHRpb25zIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RGlzcGxheU9wdGlvbnMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9wdGlvbnMiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWFzayIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERyb3Bkb3duTmF2aWdhdGlvbk1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkYXB0ZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlNwaW5uZXJBZGFwdGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLk5hdmlnYXRpb25DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREcm9wZG93bk5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5TcGlubmVyQWRhcHRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5OYXZpZ2F0aW9uQ2FsbGJhY2siPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZmF1bHRTZWxlY3RlZFBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN1YnRpdGxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdWJ0aXRsZSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdWJ0aXRsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUYWJOYXZpZ2F0aW9uTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUaXRsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGl0bGUiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGl0bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvdyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkRJU1BMQVlfSElERV9IT01FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJESVNQTEFZX1VTRV9MT0dPIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOQVZJR0FUSU9OX01PREVfQ1VTVE9NIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOQVZJR0FUSU9OX01PREVfVEFCUyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJBY3Rpb25CYXIuTmF2aWdhdGlvbkNhbGxiYWNrIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbk5hdmlnYXRpb25JdGVtU2VsZWN0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW1Qb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtSWQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IkFjdGlvbkJhci5UYWIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBY3Rpb25CYXIuVGFiIgorIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0Q3VzdG9tVmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SWNvbiIKKyByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQb3NpdGlvbiIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRhZyIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUZXh0IgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNlbGVjdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDdXN0b21WaWV3IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJY29uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpY29uIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRhYkxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYkxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRhZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib2JqIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRleHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJJTlZBTElEX1BPU0lUSU9OIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJBY3Rpb25CYXIuVGFiTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uVGFiU2VsZWN0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhYiIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25UYWJVbnNlbGVjdGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YWIiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZ0IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJBY3Rpdml0eSIKICBleHRlbmRzPSJhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTA0Niw3ICsyMjc2OSw3IEBACiA8L2ltcGxlbWVudHM+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnZpZXcuS2V5RXZlbnQuQ2FsbGJhY2siPgogPC9pbXBsZW1lbnRzPgotPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyLkZhY3RvcnkiPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyLkZhY3RvcnkyIj4KIDwvaW1wbGVtZW50cz4KIDxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQudmlldy5WaWV3Lk9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lciI+CiA8L2ltcGxlbWVudHM+CkBAIC0xOTE3OSw2ICsyMjkwMiw0OSBAQAogPHBhcmFtZXRlciBuYW1lPSJldiIgdHlwZT0iYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImR1bXAiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmZCIgdHlwZT0iamF2YS5pby5GaWxlRGVzY3JpcHRvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0id3JpdGVyIiB0eXBlPSJqYXZhLmlvLlByaW50V3JpdGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmluZEZyYWdtZW50QnlJZCIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmluZEZyYWdtZW50QnlUYWciCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZmluZFZpZXdCeUlkIgogIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkyNDQsNiArMjMwMTAsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY2hpbGQiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGl2aXR5Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFjdGlvbkJhciIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkFjdGlvbkJhciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRBcHBsaWNhdGlvbiIKICByZXR1cm49ImFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MzEwLDEyICsyMzA4NywxMiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRJbnN0YW5jZUNvdW50IgotIHJldHVybj0ibG9uZyIKKzxtZXRob2QgbmFtZT0iZ2V0RnJhZ21lbnRNYW5hZ2VyIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRNYW5hZ2VyIgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKQEAgLTE5MzU0LDYgKzIzMTMxLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExvYWRlck1hbmFnZXIiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5Mb2FkZXJNYW5hZ2VyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldExvY2FsQ2xhc3NOYW1lIgogIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTQ4OCw2ICsyMzI3NiwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbnZhbGlkYXRlT3B0aW9uc01lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzQ2hhbmdpbmdDb25maWd1cmF0aW9ucyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNDaGlsZCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk1MjgsNyArMjMzMzgsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgpAQCAtMTk1NzIsNiArMjMzODIsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkF0dGFjaEZyYWdtZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uQXR0YWNoZWRUb1dpbmRvdyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk4MDEsNiArMjM2MjQsMjUgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVWaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmVudCIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvbkRlc3Ryb3kiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwMTU4LDYgKzI0MDAwLDE5IEBACiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uU3RhcnRBY3Rpb25Nb2RlIgorIHJldHVybj0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZS5DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvblN0b3AiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwMjcxLDYgKzI0MTI2LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5GcmFnbWVudFRyYW5zYWN0aW9uIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9wZW5PcHRpb25zTWVudSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjAyOTcsNiArMjQxNjMsNDcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZXhpdEFuaW0iIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb3BCYWNrU3RhY2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9wQmFja1N0YWNrIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvcEJhY2tTdGFjayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJyZWdpc3RlckZvckNvbnRleHRNZW51IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDY4OCw2ICsyNDU5NSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydEFjdGlvbk1vZGUiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aXZpdHlGb3JSZXN1bHQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNzIwLDYgKzI0NjQwLDIzIEBACiA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RDb2RlIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRBY3Rpdml0eUZyb21GcmFnbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0Q29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aXZpdHlJZk5lZWRlZCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA3OTQsNyArMjQ3MzEsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KQEAgLTIwODM5LDcgKzI0Nzc2LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJjIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+CkBAIC0yMDk1Miw2ICsyNDg4OSwxNyBAQAogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJSRVNVTFRfQ0FOQ0VMRUQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMjgyMiw2ICsyNjc3MCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDb250ZXh0IgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0QWRhcHRlciIKICByZXR1cm49ImFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nLkJ1aWxkZXIiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjM2NTQsNiArMjc2MTMsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBY3Rpb25CYXIiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0Q29udGV4dCIKICByZXR1cm49ImFuZHJvaWQuY29udGVudC5Db250ZXh0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIzNzMxLDYgKzI3NzAxLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImludmFsaWRhdGVPcHRpb25zTWVudSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNTaG93aW5nIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNDA5Miw2ICsyODA3MywxOSBAQAogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblN0YXJ0QWN0aW9uTW9kZSIKKyByZXR1cm49ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUuQ2FsbGJhY2siPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib25TdG9wIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNDUwMCw2ICsyODQ5NCwyNTEgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkRpYWxvZ0ZyYWdtZW50IgorIGV4dGVuZHM9ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlLk9uQ2FuY2VsTGlzdGVuZXIiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZS5PbkRpc21pc3NMaXN0ZW5lciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iRGlhbG9nRnJhZ21lbnQiCisgdHlwZT0iYW5kcm9pZC5hcHAuRGlhbG9nRnJhZ21lbnQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZGlzbWlzcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q2FuY2VsYWJsZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RGlhbG9nIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRGlhbG9nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNob3dzRGlhbG9nIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUaGVtZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNhbmNlbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRpYWxvZyIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZURpYWxvZyIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkRpYWxvZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2F2ZWRJbnN0YW5jZVN0YXRlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkRpc21pc3MiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkaWFsb2ciIHR5cGU9ImFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q2FuY2VsYWJsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbmNlbGFibGUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2hvd3NEaWFsb2ciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzaG93c0RpYWxvZyIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdHlsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0eWxlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRoZW1lIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvdyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWN0aXZpdHkiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGl2aXR5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvdyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1hbmFnZXIiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3ciCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zYWN0aW9uIiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJTVFlMRV9OT1JNQUwiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUWUxFX05PX0ZSQU1FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVFlMRV9OT19JTlBVVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RZTEVfTk9fVElUTEUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJEb3dubG9hZE1hbmFnZXIiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNTMyMCw2ICsyOTU1OSwxNDE5IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJGcmFnbWVudCIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50Q2FsbGJhY2tzIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQudmlldy5WaWV3Lk9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iRnJhZ21lbnQiCisgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZHVtcCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByZWZpeCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmQiIHR5cGU9ImphdmEuaW8uRmlsZURlc2NyaXB0b3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9IndyaXRlciIgdHlwZT0iamF2YS5pby5QcmludFdyaXRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImVxdWFscyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBY3Rpdml0eSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkFjdGl2aXR5IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QXJndW1lbnRzIgorIHJldHVybj0iYW5kcm9pZC5vcy5CdW5kbGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRGcmFnbWVudE1hbmFnZXIiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJZCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExvYWRlck1hbmFnZXIiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5Mb2FkZXJNYW5hZ2VyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJldGFpbkluc3RhbmNlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRhZyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUYXJnZXRGcmFnbWVudCIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGFyZ2V0UmVxdWVzdENvZGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzaENvZGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbnN0YW50aWF0ZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbnN0YW50aWF0ZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNBZGRlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0hpZGRlbiIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0luTGF5b3V0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzUmVzdW1lZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1Zpc2libGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BY3Rpdml0eUNyZWF0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzYXZlZEluc3RhbmNlU3RhdGUiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQWN0aXZpdHlSZXN1bHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0Q29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZXN1bHRDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BdHRhY2giCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhY3Rpdml0eSIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aXZpdHkiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Db25maWd1cmF0aW9uQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld0NvbmZpZyIgdHlwZT0iYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ29udGV4dEl0ZW1TZWxlY3RlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQudmlldy5NZW51SXRlbSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNhdmVkSW5zdGFuY2VTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVBbmltYXRvciIKKyByZXR1cm49ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVudGVyIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXh0QW5pbSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlQ29udGV4dE1lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtZW51IiB0eXBlPSJhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InYiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtZW51SW5mbyIgdHlwZT0iYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZU9wdGlvbnNNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImluZmxhdGVyIiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlVmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbmZsYXRlciIgdHlwZT0iYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXIiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3R3JvdXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNhdmVkSW5zdGFuY2VTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EZXN0cm95IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkRlc3Ryb3lWaWV3IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkRldGFjaCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25IaWRkZW5DaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaGlkZGVuIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uSW5mbGF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzYXZlZEluc3RhbmNlU3RhdGUiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uTG93TWVtb3J5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbk9wdGlvbnNJdGVtU2VsZWN0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtIiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudUl0ZW0iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25PcHRpb25zTWVudUNsb3NlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1lbnUiIHR5cGU9ImFuZHJvaWQudmlldy5NZW51Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUGF1c2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUHJlcGFyZU9wdGlvbnNNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25SZXN1bWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uU2F2ZUluc3RhbmNlU3RhdGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvdXRTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25TdGFydCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25TdG9wIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZWdpc3RlckZvckNvbnRleHRNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QXJndW1lbnRzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SGFzT3B0aW9uc01lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJoYXNNZW51IiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJldGFpbkluc3RhbmNlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmV0YWluIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRhcmdldEZyYWdtZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0Q29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aXZpdHkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRBY3Rpdml0eUZvclJlc3VsdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1bnJlZ2lzdGVyRm9yQ29udGV4dE1lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJGcmFnbWVudC5JbnN0YW50aWF0aW9uRXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQudXRpbC5BbmRyb2lkUnVudGltZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iRnJhZ21lbnQuSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudC5JbnN0YW50aWF0aW9uRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibXNnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLkV4Y2VwdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkZyYWdtZW50QnJlYWRDcnVtYnMiCisgZXh0ZW5kcz0iYW5kcm9pZC52aWV3LlZpZXdHcm91cCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnRNYW5hZ2VyLk9uQmFja1N0YWNrQ2hhbmdlZExpc3RlbmVyIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJGcmFnbWVudEJyZWFkQ3J1bWJzIgorIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50QnJlYWRDcnVtYnMiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iRnJhZ21lbnRCcmVhZENydW1icyIKKyB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudEJyZWFkQ3J1bWJzIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJGcmFnbWVudEJyZWFkQ3J1bWJzIgorIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50QnJlYWRDcnVtYnMiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJvbkJhY2tTdGFja0NoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uTGF5b3V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2hhbmdlZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InIiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEFjdGl2aXR5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYSIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aXZpdHkiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGl0bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aXRsZSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2hvcnRUaXRsZSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iRnJhZ21lbnRNYW5hZ2VyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iYWRkT25CYWNrU3RhY2tDaGFuZ2VkTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXIuT25CYWNrU3RhY2tDaGFuZ2VkTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY291bnRCYWNrU3RhY2tFbnRyaWVzIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZHVtcCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJlZml4IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmZCIgdHlwZT0iamF2YS5pby5GaWxlRGVzY3JpcHRvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0id3JpdGVyIiB0eXBlPSJqYXZhLmlvLlByaW50V3JpdGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmluZEZyYWdtZW50QnlJZCIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmluZEZyYWdtZW50QnlUYWciCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QmFja1N0YWNrRW50cnkiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXIuQmFja1N0YWNrRW50cnkiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRGcmFnbWVudCIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJ1bmRsZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuVHJhbnNhY3Rpb24iCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9wQmFja1N0YWNrIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvcEJhY2tTdGFjayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb3BCYWNrU3RhY2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icHV0RnJhZ21lbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJ1bmRsZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZU9uQmFja1N0YWNrQ2hhbmdlZExpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnRNYW5hZ2VyLk9uQmFja1N0YWNrQ2hhbmdlZExpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJGcmFnbWVudE1hbmFnZXIuQmFja1N0YWNrRW50cnkiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImdldEJyZWFkQ3J1bWJTaG9ydFRpdGxlIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEJyZWFkQ3J1bWJUaXRsZSIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJZCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzxpbnRlcmZhY2UgbmFtZT0iRnJhZ21lbnRNYW5hZ2VyLk9uQmFja1N0YWNrQ2hhbmdlZExpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbkJhY2tTdGFja0NoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJGcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iYWRkIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhZGQiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRhaW5lclZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWRkIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXJWaWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWRkVG9CYWNrU3RhY2siCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29tbWl0IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGlkZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzRW1wdHkiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVwbGFjZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGFpbmVyVmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZXBsYWNlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXJWaWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QnJlYWRDcnVtYlNob3J0VGl0bGUiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlcyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEJyZWFkQ3J1bWJTaG9ydFRpdGxlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0ZXh0IiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEJyZWFkQ3J1bWJUaXRsZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QnJlYWRDcnVtYlRpdGxlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0ZXh0IiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEN1c3RvbUFuaW1hdGlvbnMiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVudGVyIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV4aXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUcmFuc2l0aW9uIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VHJhbnNpdGlvblN0eWxlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdHlsZVJlcyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3ciCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfRU5URVJfTUFTSyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQwOTYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9FWElUX01BU0siCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI4MTkyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfRlJBR01FTlRfQ0xPU0UiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI4MTk0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfRlJBR01FTlRfTkVYVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQwOTkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9GUkFHTUVOVF9PUEVOIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNDA5NyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX0ZSQUdNRU5UX1BSRVYiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI4MTk2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfTk9ORSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9VTlNFVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0xIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iSW5zdHJ1bWVudGF0aW9uIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjY3NjksNiArMzI0MjEsMzczIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJMaXN0RnJhZ21lbnQiCisgZXh0ZW5kcz0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMaXN0RnJhZ21lbnQiCisgdHlwZT0iYW5kcm9pZC5hcHAuTGlzdEZyYWdtZW50IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldExpc3RBZGFwdGVyIgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TGlzdFZpZXciCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5MaXN0VmlldyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3RlZEl0ZW1JZCIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24iCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25MaXN0SXRlbUNsaWNrIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibCIgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdFZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InYiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFbXB0eVRleHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0ZXh0IiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldExpc3RBZGFwdGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TGlzdFNob3duIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2hvd24iIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TGlzdFNob3duTm9BbmltYXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzaG93biIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZWxlY3Rpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJMb2FkZXJNYW5hZ2VyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iZ2V0TG9hZGVyIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImluaXRMb2FkZXIiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC5hcHAuTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3MmbHQ7RCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVzdGFydExvYWRlciIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLmFwcC5Mb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrcyZsdDtEJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdG9wTG9hZGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzxpbnRlcmZhY2UgbmFtZT0iTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3MiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlTG9hZGVyIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkxvYWRGaW5pc2hlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibG9hZGVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJEIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJMb2FkZXJNYW5hZ2luZ0ZyYWdtZW50IgorIGV4dGVuZHM9ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXIuT25Mb2FkQ29tcGxldGVMaXN0ZW5lciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iTG9hZGVyTWFuYWdpbmdGcmFnbWVudCIKKyB0eXBlPSJhbmRyb2lkLmFwcC5Mb2FkZXJNYW5hZ2luZ0ZyYWdtZW50IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldExvYWRlciIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVMb2FkZXIiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uSW5pdGlhbGl6ZUxvYWRlcnMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Mb2FkQ29tcGxldGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxvYWRlciIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iRCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkxvYWRGaW5pc2hlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibG9hZGVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJEIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0TG9hZGluZyIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0b3BMb2FkaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJMb2NhbEFjdGl2aXR5TWFuYWdlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI3MjUyLDYgKzMzMjcxLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGTEFHX0hJR0hfUFJJT1JJVFkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMjgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iRkxBR19JTlNJU1RFTlQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yNzQ1OCw2ICszMzQ4OCwyNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idGlja2VySWNvbnMiCisgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBbXSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0ibnVsbCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InRpY2tlclN1YnRpdGxlIgorIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJ0aWNrZXJUZXh0IgogIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTI3NDY4LDYgKzMzNTE5LDE2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ0aWNrZXJUaXRsZSIKKyB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idmlicmF0ZSIKICB0eXBlPSJsb25nW10iCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTI4NDQyLDYgKzM0NTAzLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGTEFHX1FVRVJZX1JFRklORU1FTlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IklOVEVOVF9BQ1RJT05fR0xPQkFMX1NFQVJDSCIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yODU0MSw2ICszNDYxMywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1VHR0VTVF9DT0xVTU5fRkxBR1MiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7c3VnZ2VzdF9mbGFncyZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJTVUdHRVNUX0NPTFVNTl9GT1JNQVQiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzA0ODIsNiArMzY1NjUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlVTRVNfUE9MSUNZX1NFVFNfR0xPQkFMX1BST1hZIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJVU0VTX1BPTElDWV9XQVRDSF9MT0dJTiIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTMwNzcxLDYgKzM2ODY1LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEdsb2JhbFByb3h5QWRtaW4iCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRNYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDc5Nyw2ICszNjkwMiwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNYXhpbXVtTGVuZ3RoIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwODIzLDYgKzM2OTQxLDg0IEBACiA8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZFF1YWxpdHkiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzA4OTksNiArMzcwOTUsMjMgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRHbG9iYWxQcm94eSIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByb3h5U3BlYyIgdHlwZT0iamF2YS5uZXQuUHJveHkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV4Y2x1c2lvbkxpc3QiIHR5cGU9ImphdmEudXRpbC5MaXN0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldE1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDkyOSw2ICszNzE0MiwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJ0aW1lTXMiIHR5cGU9ImxvbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZE1pbmltdW1MZW5ndGgiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwOTQ0LDYgKzM3MTcyLDk2IEBACiA8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bUxldHRlcnMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkUXVhbGl0eSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzEwMzgsNiArMzczNTYsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjM5MzIxNiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJQQVNTV09SRF9RVUFMSVRZX05VTUVSSUMiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0zMjAyMSw2ICszODM1MCw2NiBAQAogPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcHBXaWRnZXRJZHMiIHR5cGU9ImludFtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcHBXaWRnZXRJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcHBXaWRnZXRJZHMiIHR5cGU9ImludFtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3cyIgdHlwZT0iYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGFydGlhbGx5VXBkYXRlQXBwV2lkZ2V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYXBwV2lkZ2V0SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld3MiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InVwZGF0ZUFwcFdpZGdldCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzI0MzcsNiArMzg4MjYsMTExIEBACiA8L3BhY2thZ2U+CiA8cGFja2FnZSBuYW1lPSJhbmRyb2lkLmJsdWV0b290aCIKID4KKzxjbGFzcyBuYW1lPSJCbHVldG9vdGhBMmRwIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZSI+Cis8L2ltcGxlbWVudHM+Cis8bWV0aG9kIG5hbWU9ImdldENvbm5lY3RlZERldmljZXMiCisgcmV0dXJuPSJqYXZhLnV0aWwuU2V0Jmx0O2FuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q29ubmVjdGlvblN0YXRlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkZXZpY2UiIHR5cGU9ImFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzIgorIHJldHVybj0iamF2YS51dGlsLlNldCZsdDthbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2UmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdGF0ZXMiIHR5cGU9ImludFtdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzQTJkcFBsYXlpbmciCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkZXZpY2UiIHR5cGU9ImFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YW5kcm9pZC5ibHVldG9vdGguYTJkcC5wcm9maWxlLmFjdGlvbi5DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQUNUSU9OX1BMQVlJTkdfU1RBVEVfQ0hBTkdFRCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthbmRyb2lkLmJsdWV0b290aC5hMmRwLnByb2ZpbGUuYWN0aW9uLlBMQVlJTkdfU1RBVEVfQ0hBTkdFRCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVEFURV9OT1RfUExBWUlORyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjExIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFX1BMQVlJTkciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQmx1ZXRvb3RoQWRhcHRlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMyNDY5LDYgKzM4OTYzLDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9ImFkZHJlc3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2xvc2VQcm9maWxlUHJveHkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcm9maWxlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByb3h5IiB0eXBlPSJhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQcm9maWxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImRpc2FibGUiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMyNTM1LDYgKzM5MDQ0LDIzIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByb2ZpbGVQcm94eSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZS5TZXJ2aWNlTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByb2ZpbGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRSZW1vdGVEZXZpY2UiCiAgcmV0dXJuPSJhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2UiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzI2MzMsNiArMzkxNTksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJBQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FuZHJvaWQuYmx1ZXRvb3RoLmFkYXB0ZXIuYWN0aW9uLkNPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJBQ1RJT05fRElTQ09WRVJZX0ZJTklTSEVEIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTMyNzIxLDYgKzM5MjU4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJFWFRSQV9DT05ORUNUSU9OX1NUQVRFIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FuZHJvaWQuYmx1ZXRvb3RoLmFkYXB0ZXIuZXh0cmEuQ09OTkVDVElPTl9TVEFURSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJFWFRSQV9ESVNDT1ZFUkFCTEVfRFVSQVRJT04iCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzI3NDMsNiArMzkyOTEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkVYVFJBX1BSRVZJT1VTX0NPTk5FQ1RJT05fU1RBVEUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YW5kcm9pZC5ibHVldG9vdGguYWRhcHRlci5leHRyYS5QUkVWSU9VU19DT05ORUNUSU9OX1NUQVRFJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkVYVFJBX1BSRVZJT1VTX1NDQU5fTU9ERSIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0zMjgyMCw2ICszOTM3OSw1MCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVfQ09OTkVDVEVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVEFURV9DT05ORUNUSU5HIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVEFURV9ESVNDT05ORUNURUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFX0RJU0NPTk5FQ1RJTkciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlNUQVRFX09GRiIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTM0MDYxLDYgKzQwNjY0LDMwNiBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQmx1ZXRvb3RoSGVhZHNldCIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGUiPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJnZXRDb25uZWN0ZWREZXZpY2VzIgorIHJldHVybj0iamF2YS51dGlsLlNldCZsdDthbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2UmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENvbm5lY3Rpb25TdGF0ZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGV2aWNlIiB0eXBlPSJhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RGV2aWNlc01hdGNoaW5nQ29ubmVjdGlvblN0YXRlcyIKKyByZXR1cm49ImphdmEudXRpbC5TZXQmbHQ7YW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhdGVzIiB0eXBlPSJpbnRbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0F1ZGlvQ29ubmVjdGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGV2aWNlIiB0eXBlPSJhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRWb2ljZVJlY29nbml0aW9uIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGV2aWNlIiB0eXBlPSJhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RvcFZvaWNlUmVjb2duaXRpb24iCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkZXZpY2UiIHR5cGU9ImFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkFDVElPTl9BVURJT19TVEFURV9DSEFOR0VEIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FuZHJvaWQuYmx1ZXRvb3RoLmhlYWRzZXQucHJvZmlsZS5hY3Rpb24uQVVESU9fU1RBVEVfQ0hBTkdFRCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJBQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FuZHJvaWQuYmx1ZXRvb3RoLmhlYWRzZXQucHJvZmlsZS5hY3Rpb24uQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFX0FVRElPX0NPTk5FQ1RFRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFX0FVRElPX0RJU0NPTk5FQ1RFRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjExIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iQmx1ZXRvb3RoUHJvZmlsZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImdldENvbm5lY3RlZERldmljZXMiCisgcmV0dXJuPSJqYXZhLnV0aWwuU2V0Jmx0O2FuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZSZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDb25uZWN0aW9uU3RhdGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGV2aWNlIiB0eXBlPSJhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RGV2aWNlc01hdGNoaW5nQ29ubmVjdGlvblN0YXRlcyIKKyByZXR1cm49ImphdmEudXRpbC5TZXQmbHQ7YW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdGF0ZXMiIHR5cGU9ImludFtdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQTJEUCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRVhUUkFfUFJFVklPVVNfU1RBVEUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YW5kcm9pZC5ibHVldG9vdGgucHJvZmlsZS5leHRyYS5QUkVWSU9VU19TVEFURSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJFWFRSQV9TVEFURSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthbmRyb2lkLmJsdWV0b290aC5wcm9maWxlLmV4dHJhLlNUQVRFJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkhFQURTRVQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFX0NPTk5FQ1RFRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVfQ09OTkVDVElORyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVfRElTQ09OTkVDVEVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVEFURV9ESVNDT05ORUNUSU5HIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJCbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25TZXJ2aWNlQ29ubmVjdGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcm9maWxlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByb3h5IiB0eXBlPSJhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQcm9maWxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uU2VydmljZURpc2Nvbm5lY3RlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvZmlsZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJCbHVldG9vdGhTZXJ2ZXJTb2NrZXQiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zNDYzMiw2ICs0MTUzNSw3MSBAQAogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBc3luY1Rhc2tMb2FkZXIiCisgZXh0ZW5kcz0iYW5kcm9pZC5jb250ZW50LkxvYWRlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQXN5bmNUYXNrTG9hZGVyIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5Bc3luY1Rhc2tMb2FkZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImNhbmNlbExvYWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZvcmNlTG9hZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZEluQmFja2dyb3VuZCIKKyByZXR1cm49IkQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNhbmNlbGxlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9IkQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQnJvYWRjYXN0UmVjZWl2ZXIiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM0ODYyLDYgKzQxODMwLDU3MSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQ2xpcERhdGEiCisgZXh0ZW5kcz0iYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNsaXBEYXRhIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWNvbiIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YS5JdGVtIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYWRkSXRlbSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YS5JdGVtIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEljb24iCisgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJdGVtIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhLkl0ZW0iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SXRlbUNvdW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5ld0ludGVudCIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsYWJlbCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWNvbiIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXdQbGFpblRleHQiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGFiZWwiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imljb24iIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0ZXh0IiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5ld1Jhd1VyaSIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsYWJlbCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWNvbiIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5ld1VyaSIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXNvbHZlciIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGFiZWwiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imljb24iIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkNSRUFUT1IiCisgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3IiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkNsaXBEYXRhLkl0ZW0iCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ2xpcERhdGEuSXRlbSIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEuSXRlbSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNsaXBEYXRhLkl0ZW0iCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhLkl0ZW0iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNsaXBEYXRhLkl0ZW0iCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhLkl0ZW0iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ2xpcERhdGEuSXRlbSIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEuSXRlbSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJjb2VyY2VUb1RleHQiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJbnRlbnQiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRleHQiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFVyaSIKKyByZXR1cm49ImFuZHJvaWQubmV0LlVyaSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJDbGlwRGVzY3JpcHRpb24iCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDbGlwRGVzY3JpcHRpb24iCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ2xpcERlc2NyaXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERlc2NyaXB0aW9uIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iY29tcGFyZU1pbWVUeXBlcyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29uY3JldGVUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZXNpcmVkVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXNjcmliZUNvbnRlbnRzIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZpbHRlck1pbWVUeXBlcyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TGFiZWwiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE1pbWVUeXBlIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRNaW1lVHlwZUNvdW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc01pbWVUeXBlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0id3JpdGVUb1BhcmNlbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRlc3QiIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQ1JFQVRPUiIKKyB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvciIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNSU1FVFlQRV9URVhUX0lOVEVOVCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDt0ZXh0L3ZuZC5hbmRyb2lkLmludGVudCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNSU1FVFlQRV9URVhUX1BMQUlOIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3RleHQvcGxhaW4mcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTUlNRVRZUEVfVEVYVF9VUklMSVNUIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3RleHQvdXJpLWxpc3QmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkNsaXBib2FyZE1hbmFnZXIiCisgZXh0ZW5kcz0iYW5kcm9pZC50ZXh0LkNsaXBib2FyZE1hbmFnZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iYWRkUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ3aGF0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcGJvYXJkTWFuYWdlci5PblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByaW1hcnlDbGlwIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByaW1hcnlDbGlwRGVzY3JpcHRpb24iCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERlc2NyaXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRleHQiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzUHJpbWFyeUNsaXAiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc1RleHQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ3aGF0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcGJvYXJkTWFuYWdlci5PblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFByaW1hcnlDbGlwIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2xpcCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRleHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkNsaXBib2FyZE1hbmFnZXIuT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25QcmltYXJ5Q2xpcENoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGludGVyZmFjZSBuYW1lPSJDb21wb25lbnRDYWxsYmFja3MiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTM1MjM1LDYgKzQyNzY4LDIxIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN0cmVhbVR5cGVzIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZ1tdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGVGaWx0ZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNTM3MSw2ICs0MjkxOSw0OCBAQAogPGV4Y2VwdGlvbiBuYW1lPSJGaWxlTm90Rm91bmRFeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5QaXBlSGVscGVyIgorIHJldHVybj0iYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvcHRzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iVCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnVuYyIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlci5QaXBlRGF0YVdyaXRlciZsdDtUJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iRmlsZU5vdEZvdW5kRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuVHlwZWRBc3NldEZpbGUiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZUZpbHRlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib3B0cyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icXVlcnkiCiAgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM1NDMxLDYgKzQzMDIxLDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9InBlcm1pc3Npb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2h1dGRvd24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InVwZGF0ZSIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM1NDUxLDYgKzQzMDUyLDM1IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iQ29udGVudFByb3ZpZGVyLlBpcGVEYXRhV3JpdGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJ3cml0ZURhdGFUb1BpcGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im91dHB1dCIgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvcHRzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iVCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iQ29udGVudFByb3ZpZGVyQ2xpZW50IgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzU1MjMsNiArNDMxNTMsMjMgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3RyZWFtVHlwZXMiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVybCIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZUZpbHRlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iUmVtb3RlRXhjZXB0aW9uIiB0eXBlPSJhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgogIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zNTU5Myw2ICs0MzI0MCwyNyBAQAogPGV4Y2VwdGlvbiBuYW1lPSJSZW1vdGVFeGNlcHRpb24iIHR5cGU9ImFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3IiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvcHRzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iRmlsZU5vdEZvdW5kRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzxleGNlcHRpb24gbmFtZT0iUmVtb3RlRXhjZXB0aW9uIiB0eXBlPSJhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJxdWVyeSIKICByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM2MzYzLDYgKzQ0MDMxLDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9ImF1dGhvcml0eSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdHJlYW1UeXBlcyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJsIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlRmlsdGVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFN5bmNBZGFwdGVyVHlwZXMiCiAgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuU3luY0FkYXB0ZXJUeXBlW10iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzY1NjAsNiArNDQyNDMsMjUgQEAKIDxleGNlcHRpb24gbmFtZT0iRmlsZU5vdEZvdW5kRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib3B0cyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icXVlcnkiCiAgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zNzIyNSw2ICs0NDkyNywxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ia2V5U2V0IgorIHJldHVybj0iamF2YS51dGlsLlNldCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJwdXQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM4Mjc1LDYgKzQ1OTg4LDI1IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3Blbk9yQ3JlYXRlRGF0YWJhc2UiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9ySGFuZGxlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJwZWVrV2FsbHBhcGVyIgogIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTM5NzEzLDYgKzQ3NDQ1LDI1IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3Blbk9yQ3JlYXRlRGF0YWJhc2UiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvckhhbmRsZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icGVla1dhbGxwYXBlciIKICByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNDAwMzksNiArNDc3OTAsMjQwIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJDdXJzb3JMb2FkZXIiCisgZXh0ZW5kcz0iYW5kcm9pZC5jb250ZW50LkFzeW5jVGFza0xvYWRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkN1cnNvckxvYWRlciIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ3Vyc29yTG9hZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwcm9qZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzb3J0T3JkZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJkZWxpdmVyUmVzdWx0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY3Vyc29yIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXN0cm95IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQcm9qZWN0aW9uIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZ1tdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGlvbiIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0aW9uQXJncyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTb3J0T3JkZXIiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFVyaSIKKyByZXR1cm49ImFuZHJvaWQubmV0LlVyaSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsb2FkSW5CYWNrZ3JvdW5kIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DYW5jZWxsZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3IiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlZ2lzdGVyQ29udGVudE9ic2VydmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY3Vyc29yIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib2JzZXJ2ZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFByb2plY3Rpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcm9qZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2VsZWN0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNlbGVjdGlvbkFyZ3MiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb25BcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U29ydE9yZGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic29ydE9yZGVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFVyaSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0TG9hZGluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RvcExvYWRpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGludGVyZmFjZSBuYW1lPSJEaWFsb2dJbnRlcmZhY2UiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTQyNjE4LDYgKzUwNjAzLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJBQ1RJT05fUEFTVEUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YW5kcm9pZC5pbnRlbnQuYWN0aW9uLlBBU1RFJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkFDVElPTl9QSUNLIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQyOTU5LDYgKzUwOTU1LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDQVRFR09SWV9BUFBfTUFSS0VUIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkFQUF9NQVJLRVQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iQ0FURUdPUllfQlJPV1NBQkxFIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQ1MDE2LDYgKzUzMDIzLDE4MyBAQAogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJMb2FkZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTG9hZGVyIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImRlbGl2ZXJSZXN1bHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJEIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRlc3Ryb3kiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZm9yY2VMb2FkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENvbnRleHQiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJZCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNvbnRlbnRDaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZWdpc3Rlckxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXIuT25Mb2FkQ29tcGxldGVMaXN0ZW5lciZsdDtEJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydExvYWRpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RvcExvYWRpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idW5yZWdpc3Rlckxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXIuT25Mb2FkQ29tcGxldGVMaXN0ZW5lciZsdDtEJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJMb2FkZXIuRm9yY2VMb2FkQ29udGVudE9ic2VydmVyIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMb2FkZXIuRm9yY2VMb2FkQ29udGVudE9ic2VydmVyIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXIuRm9yY2VMb2FkQ29udGVudE9ic2VydmVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJMb2FkZXIuT25Mb2FkQ29tcGxldGVMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25Mb2FkQ29tcGxldGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxvYWRlciIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iRCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iTXV0YWJsZUNvbnRleHRXcmFwcGVyIgogIGV4dGVuZHM9ImFuZHJvaWQuY29udGVudC5Db250ZXh0V3JhcHBlciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC00NTU1NSw2ICs1MzczOSwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJkZWZWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdHJpbmdTZXQiCisgcmV0dXJuPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmVmFsdWVzIiB0eXBlPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InJlZ2lzdGVyT25TaGFyZWRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtNDU2OTcsNiArNTM4OTYsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icHV0U3RyaW5nU2V0IgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzLkVkaXRvciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iamF2YS51dGlsLlNldCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJyZW1vdmUiCiAgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXMuRWRpdG9yIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtNDY0MTQsNiArNTQ2MjgsMTQ1IEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJYbWxEb2N1bWVudFByb3ZpZGVyIgorIGV4dGVuZHM9ImFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJYbWxEb2N1bWVudFByb3ZpZGVyIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5YbWxEb2N1bWVudFByb3ZpZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImRlbGV0ZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJlc291cmNlWG1sUHVsbFBhcnNlciIKKyByZXR1cm49Im9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc291cmNlVXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFVyaVhtbFB1bGxQYXJzZXIiCisgcmV0dXJuPSJvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW5zZXJ0IgorIHJldHVybj0iYW5kcm9pZC5uZXQuVXJpIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icXVlcnkiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByb2plY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb25BcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNvcnRPcmRlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1cGRhdGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImFuZHJvaWQuY29udGVudC5wbSIKID4KQEAgLTQ2Njc5LDYgKzU1MDMyLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAyNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGTEFHX0lNTUVSU0lWRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjUxMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJGTEFHX01VTFRJUFJPQ0VTUyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQ3MjIxLDYgKzU1NTk2LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGTEFHX1NVUFBPUlRTX1hMQVJHRV9TQ1JFRU5TIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNTI0Mjg4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkZMQUdfU1lTVEVNIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNTI0NTYsNiArNjA4NDIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNDUkVFTkxBWU9VVF9TSVpFX1hMQVJHRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iVE9VQ0hTQ1JFRU5fRklOR0VSIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNTQzMzYsNiArNjI3MzMsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Tm90aWZpY2F0aW9uVXJpIgorIHJldHVybj0iYW5kcm9pZC5uZXQuVXJpIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFBvc2l0aW9uIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU0MzczLDYgKzYyNzgxLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbiIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFVwZGF0ZWRGaWVsZCIKICByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTQzODAsNyArNjI4MDEsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNTQ0NDgsNyArNjI4NjksNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgpAQCAtNTQ3MzQsNyArNjMxNTUsNyBAQAogIHZvbGF0aWxlPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvZmllbGQ+CkBAIC01NDg3MCw3ICs2MzI5MSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+CkBAIC01NDg4Myw3ICs2MzMwNCw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+CkBAIC01NDg5Niw3ICs2MzMxNyw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+CkBAIC01NDkyMiw3ICs2MzM0Myw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+CkBAIC01NTM5Niw2ICs2MzgxNywxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRXYW50c0FsbE9uTW92ZUNhbGxzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTU1NjM2LDYgKzY0MDcwLDYxIEBACiA8cGFyYW1ldGVyIG5hbWU9Im9ic2VydmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkZJRUxEX1RZUEVfQkxPQiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRklFTERfVFlQRV9GTE9BVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRklFTERfVFlQRV9JTlRFR0VSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGSUVMRF9UWVBFX05VTEwiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZJRUxEX1RZUEVfU1RSSU5HIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkN1cnNvckluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iCiAgZXh0ZW5kcz0iamF2YS5sYW5nLkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iCkBAIC01NTk5Myw2ICs2NDQ4MiwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJjb2wiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyb3ciIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNCbG9iIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NjAwMCw3ICs2NDUwNCw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0icm93IiB0eXBlPSJpbnQiPgpAQCAtNTYwMTUsNyArNjQ1MTksNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InJvdyIgdHlwZT0iaW50Ij4KQEAgLTU2MDMwLDcgKzY0NTM0LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJyb3ciIHR5cGU9ImludCI+CkBAIC01NjA0NSw3ICs2NDU0OSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0icm93IiB0eXBlPSJpbnQiPgpAQCAtNTYwNjAsNyArNjQ1NjQsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InJvdyIgdHlwZT0iaW50Ij4KQEAgLTU2NDcxLDYgKzY0OTc1LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRXYW50c0FsbE9uTW92ZUNhbGxzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NjQ4Miw2ICs2NDk5OSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRXcmFwcGVkQ3Vyc29yIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNBZnRlckxhc3QiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU2NzkwLDYgKzY1MzE4LDI3IEBACiA+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkRhdGFiYXNlRXJyb3JIYW5kbGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25Db3JydXB0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYk9iaiIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkRhdGFiYXNlVXRpbHMiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NjgyMSw2ICs2NTM3MCwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJzcWxTdHJpbmciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYXBwZW5kU2VsZWN0aW9uQXJncyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbFZhbHVlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXdWYWx1ZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJhcHBlbmRWYWx1ZVRvU3FsIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01Njg1Myw2ICs2NTQxNywzOCBAQAogPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJibG9iRmlsZURlc2NyaXB0b3JGb3JRdWVyeSIKKyByZXR1cm49ImFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJxdWVyeSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJsb2JGaWxlRGVzY3JpcHRvckZvclF1ZXJ5IgorIHJldHVybj0iYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcm9nIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVTdGF0ZW1lbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjcmVhdGVEYkZyb21TcWxTdGF0ZW1lbnRzIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NzI5MCw2ICs2NTg4NiwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNxbFN0YXRlbWVudFR5cGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3FsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImxvbmdGb3JRdWVyeSIKICByZXR1cm49ImxvbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTc0NzYsNiArNjYwODUsMTE2IEBACiA8cGFyYW1ldGVyIG5hbWU9ImUiIHR5cGU9ImphdmEubGFuZy5FeGNlcHRpb24iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJTVEFURU1FTlRfQUJPUlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFTUVOVF9BVFRBQ0giCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFTUVOVF9CRUdJTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX0NPTU1JVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX0RETCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX09USEVSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iOTkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX1BSQUdNQSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX1NFTEVDVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX1VOUFJFUEFSRUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFTUVOVF9VUERBVEUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJEYXRhYmFzZVV0aWxzLkluc2VydEhlbHBlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgpAQCAtNTc3MTAsNiArNjY0MjksMzggQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlciIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJvbkNvcnJ1cHRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYk9iaiIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTWF0cml4Q3Vyc29yIgogIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2UuQWJzdHJhY3RDdXJzb3IiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTgxOTMsNiArNjY5NDQsMTE0IEBACiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iU1FMaXRlQ2xvc2FibGUiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTU4MzA0LDcgKzY3MTYzLDcgQEAKICB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDdXJzb3IiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImRiIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSI+CkBAIC01ODMxNiw2ICs2NzE3NSwyMCBAQAogPHBhcmFtZXRlciBuYW1lPSJxdWVyeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlUXVlcnkiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZUN1cnNvciIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDdXJzb3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkcml2ZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUN1cnNvckRyaXZlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZWRpdFRhYmxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJxdWVyeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlUXVlcnkiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJnZXRDb2x1bW5OYW1lcyIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODQ1Myw2ICs2NzMyNiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJiZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODQ2Niw2ICs2NzM1MCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2FjdGlvbkxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJlZ2luVHJhbnNhY3Rpb25XaXRoTGlzdGVuZXJOb25FeGNsdXNpdmUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2FjdGlvbkxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNsb3NlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODUyMiw2ICs2NzQxOSwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJ3aGVyZUFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbmFibGVXcml0ZUFoZWFkTG9nZ2luZyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZW5kVHJhbnNhY3Rpb24iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU4NTc4LDYgKzY3NDg2LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9InRhYmxlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBdHRhY2hlZERicyIKKyByZXR1cm49ImphdmEudXRpbC5BcnJheUxpc3QmbHQ7YW5kcm9pZC51dGlsLlBhaXImbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZyZndDsmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldE1heGltdW1TaXplIgogIHJldHVybj0ibG9uZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODYxOCw3ICs2NzUzNyw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgpAQCAtNTg2OTksNiArNjc2MTgsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29uZmxpY3RBbGdvcml0aG0iIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0RhdGFiYXNlSW50ZWdyaXR5T2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzRGJMb2NrZWRCeUN1cnJlbnRUaHJlYWQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU4NzUwLDcgKzY3NjgwLDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJ0YWJsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CkBAIC01ODc2NSw3ICs2NzY5NSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0idGFibGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgpAQCAtNTg4MTYsNiArNjc3NDYsMjUgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuRGF0YWJhc2UiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvckhhbmRsZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib3Blbk9yQ3JlYXRlRGF0YWJhc2UiCiAgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODg0Niw2ICs2Nzc5NSwyMyBAQAogPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5PckNyZWF0ZURhdGFiYXNlIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3JIYW5kbGVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InF1ZXJ5IgogIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTkwNjUsNiArNjgwMzEsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ibG9ja2luZ0VuYWJsZWQiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TWF4U3FsQ2FjaGVTaXplIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FjaGVTaXplIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TWF4aW11bVNpemUiCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU5MjY3LDYgKzY4MjQ2LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNQVhfU1FMX0NBQ0hFX1NJWkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iTk9fTE9DQUxJWkVEX0NPTExBVE9SUyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTU5MzY2LDYgKzY4MzU2LDYwIEBACiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJTUUxpdGVEaXNrSU9FeGNlcHRpb24iCiAgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU5NTI1LDYgKzY4NTY5LDI0IEBACiA8cGFyYW1ldGVyIG5hbWU9InZlcnNpb24iIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlT3BlbkhlbHBlciIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPcGVuSGVscGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZlcnNpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3JIYW5kbGVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iY2xvc2UiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU5NjAyLDYgKzY4NjY0LDMzIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbiIKKyBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJTUUxpdGVQcm9ncmFtIgogIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNsb3NhYmxlIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtNTk2MTAsNiArNjg2OTksMTkgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8bWV0aG9kIG5hbWU9ImJpbmRBbGxBcmdzQXNTdHJpbmdzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYmluZEFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJiaW5kQmxvYiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTk3MjcsNyArNjg4MjksNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgpAQCAtNjAxNTAsNiArNjkyNTIsMzMgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJTUUxpdGVTdGF0ZW1lbnQiCiAgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlUHJvZ3JhbSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC02MDE4MCw2ICs2OTMwOSwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJleGVjdXRlVXBkYXRlRGVsZXRlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNpbXBsZVF1ZXJ5Rm9yQmxvYkZpbGVEZXNjcmlwdG9yIgorIHJldHVybj0iYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzaW1wbGVRdWVyeUZvckxvbmciCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTYwMjAzLDYgKzY5MzU0LDMzIEBACiA+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+CiA8aW50ZXJmYWNlIG5hbWU9IlNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTY0NzY4LDYgKzczOTQ2LDE0NiBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQml0bWFwUmVnaW9uRGVjb2RlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iZGVjb2RlUmVnaW9uIgorIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlY3QiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuUmVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib3B0aW9ucyIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5Lk9wdGlvbnMiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SGVpZ2h0IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFdpZHRoIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzUmVjeWNsZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV3SW5zdGFuY2UiCisgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFJlZ2lvbkRlY29kZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iYnl0ZVtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlzU2hhcmVhYmxlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXdJbnN0YW5jZSIKKyByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwUmVnaW9uRGVjb2RlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmZCIgdHlwZT0iamF2YS5pby5GaWxlRGVzY3JpcHRvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaXNTaGFyZWFibGUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5ld0luc3RhbmNlIgorIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBSZWdpb25EZWNvZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlzIiB0eXBlPSJqYXZhLmlvLklucHV0U3RyZWFtIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpc1NoYXJlYWJsZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV3SW5zdGFuY2UiCisgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFJlZ2lvbkRlY29kZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGF0aE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImlzU2hhcmVhYmxlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZWN5Y2xlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJCaXRtYXBTaGFkZXIiCiAgZXh0ZW5kcz0iYW5kcm9pZC5ncmFwaGljcy5TaGFkZXIiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNjUwMDksMTYgKzc0MzI3LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYml0bWFwIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Ci08Y29uc3RydWN0b3IgbmFtZT0iQ2FudmFzIgotIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZ2wiIHR5cGU9ImphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMIj4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iY2xpcFBhdGgiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTY1NzkyLDcgKzc1MTAwLDcgQEAKIDxtZXRob2QgbmFtZT0iZHJhd1RleHQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgpAQCAtNjU5MzUsMTcgKzc1MjQzLDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icGFpbnQiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZnJlZUdsQ2FjaGVzIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldENsaXBCb3VuZHMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTY1OTk5LDggKzc1Mjk2LDggQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRIZWlnaHQiCkBAIC02NjA2MCw2ICs3NTM1NywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0hhcmR3YXJlQWNjZWxlcmF0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzT3BhcXVlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC02NjM2NiwyMSArNzU2NzQsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJtYXRyaXgiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldFZpZXdwb3J0IgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0id2lkdGgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iaGVpZ2h0IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2tldyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNjk3NzgsNyArNzkwNzEsNyBAQAogPG1ldGhvZCBuYW1lPSJzZXRTaGFkb3dMYXllciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCkBAIC03NTc0NSw2ICs4NTAzOCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjb21wdXRlQ29uc3RhbnRTaXplIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTc2NjM5LDYgKzg1OTQzLDM2IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJNaXBtYXBEcmF3YWJsZSIKKyBleHRlbmRzPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlQ29udGFpbmVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTWlwbWFwRHJhd2FibGUiCisgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5NaXBtYXBEcmF3YWJsZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhZGREcmF3YWJsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRyYXdhYmxlIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9Ik5pbmVQYXRjaERyYXdhYmxlIgogIGV4dGVuZHM9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtODE5MDEsNiArOTEyMzUsMTkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DdXJyZW50SW5wdXRNZXRob2RTdWJ0eXBlQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld1N1YnR5cGUiIHR5cGU9ImFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZFN1YnR5cGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib25EaXNwbGF5Q29tcGxldGlvbnMiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTgyNTA0LDYgKzkxODUxLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImJpbmRpbmciIHR5cGU9ImFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dEJpbmRpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2hhbmdlSW5wdXRNZXRob2RTdWJ0eXBlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3VidHlwZSIgdHlwZT0iYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kU3VidHlwZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJoaWRlU29mdElucHV0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC04MjgxMSw2ICs5MjE3MSwyNCBAQAogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9Im1vZGVJZCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ3aWR0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJoZWlnaHQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iS2V5Ym9hcmQiCisgdHlwZT0iYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuS2V5Ym9hcmQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieG1sTGF5b3V0UmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZUlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPGNvbnN0cnVjdG9yIG5hbWU9IktleWJvYXJkIgogIHR5cGU9ImFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLktleWJvYXJkIgpAQCAtODk1ODUsNiArOTg5NjMsNzggQEAKIDxwYXJhbWV0ZXIgbmFtZT0icXVhbGl0eSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc1Byb2ZpbGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InF1YWxpdHkiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNQcm9maWxlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYW1lcmFJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJxdWFsaXR5IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJRVUFMSVRZXzEwODBQIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJRVUFMSVRZXzQ4MFAiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlFVQUxJVFlfNzIwUCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUVVBTElUWV9DSUYiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlFVQUxJVFlfSElHSCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTg5NjA3LDYgKzk5MDU3LDk0IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJRVUFMSVRZX1FDSUYiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlFVQUxJVFlfVElNRV9MQVBTRV8xMDgwUCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMDYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUVVBTElUWV9USU1FX0xBUFNFXzQ4MFAiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDA0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlFVQUxJVFlfVElNRV9MQVBTRV83MjBQIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAwNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJRVUFMSVRZX1RJTUVfTEFQU0VfQ0lGIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAwMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJRVUFMSVRZX1RJTUVfTEFQU0VfSElHSCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMDEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUVVBTElUWV9USU1FX0xBUFNFX0xPVyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMDAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUVVBTElUWV9USU1FX0xBUFNFX1FDSUYiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDAyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImF1ZGlvQml0UmF0ZSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTkxNzAzLDYgKzEwMTI0MSwzMiBAQAogPGV4Y2VwdGlvbiBuYW1lPSJJbGxlZ2FsU3RhdGVFeGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QXV4aWxpYXJ5T3V0cHV0RmlsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZkIiB0eXBlPSJqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEF1eGlsaWFyeU91dHB1dEZpbGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldENhbWVyYSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtOTE3MTYsNiArMTAxMjgwLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENhcHR1cmVSYXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnBzIiB0eXBlPSJkb3VibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TWF4RHVyYXRpb24iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTk4NjY1LDcgKzEwODI0Miw3IEBACiAgdHlwZT0iYW5kcm9pZC5uZXQuU1NMQ2VydGlmaWNhdGVTb2NrZXRGYWN0b3J5IgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJoYW5kc2hha2VUaW1lb3V0TWlsbGlzIiB0eXBlPSJpbnQiPgpAQCAtOTkxNDAsNiArMTA4NzE3LDIxIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEJvb2xlYW5RdWVyeVBhcmFtZXRlciIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmYXVsdFZhbHVlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEVuY29kZWRBdXRob3JpdHkiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtOTkyOTYsNiArMTA4ODg4LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRRdWVyeVBhcmFtZXRlck5hbWVzIgorIHJldHVybj0iamF2YS51dGlsLlNldCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRRdWVyeVBhcmFtZXRlcnMiCiAgcmV0dXJuPSJqYXZhLnV0aWwuTGlzdCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC05OTU0Miw2ICsxMDkxNDUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2xlYXJRdWVyeSIKKyByZXR1cm49ImFuZHJvaWQubmV0LlVyaS5CdWlsZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImVuY29kZWRBdXRob3JpdHkiCiAgcmV0dXJuPSJhbmRyb2lkLm5ldC5VcmkuQnVpbGRlciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMDA3NjUsNyArMTEwMzc5LDcgQEAKICB0eXBlPSJhbmRyb2lkLm5ldC5odHRwLlNzbENlcnRpZmljYXRlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJpc3N1ZWRUbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CkBAIC0xMDA4MzIsNyArMTEwNDQ2LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+CkBAIC0xMDA4NTQsNyArMTEwNDY4LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+CkBAIC0xMjMwMjYsNiArMTMyNjQwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJIT05FWUNPTUIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDAwMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQnVuZGxlIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCkBAIC0xMjkwNzIsNiArMTM4Njk3LDE5IEBACiA8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNyZWF0ZVBpcGUiCisgcmV0dXJuPSJhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZGVzY3JpYmVDb250ZW50cyIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMjkwODMsNiArMTM4NzIxLDIzIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZyb21EYXRhIgorIHJldHVybj0iYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJieXRlW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImZyb21Tb2NrZXQiCiAgcmV0dXJuPSJhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEzMTM5Myw2ICsxNDEwNDgsNTMgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlN0b3JhZ2VFdmVudExpc3RlbmVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlN0b3JhZ2VFdmVudExpc3RlbmVyIgorIHR5cGU9ImFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlRXZlbnRMaXN0ZW5lciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJvblN0b3JhZ2VTdGF0ZUNoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvbGRTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3U3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Vc2JNYXNzU3RvcmFnZUNvbm5lY3Rpb25DaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29ubmVjdGVkIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlN0b3JhZ2VNYW5hZ2VyIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTMxNDAxLDYgKzE0MTEwMywyOCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxtZXRob2QgbmFtZT0iZGlzYWJsZVVzYk1hc3NTdG9yYWdlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbmFibGVVc2JNYXNzU3RvcmFnZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0TW91bnRlZE9iYlBhdGgiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEzMTQyOSw2ICsxNDExNTMsMjggQEAKIDxleGNlcHRpb24gbmFtZT0iSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzVXNiTWFzc1N0b3JhZ2VDb25uZWN0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzVXNiTWFzc1N0b3JhZ2VFbmFibGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJtb3VudE9iYiIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTMxNDQ2LDYgKzE0MTE5MiwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5vcy5zdG9yYWdlLk9uT2JiU3RhdGVDaGFuZ2VMaXN0ZW5lciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZWdpc3Rlckxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlRXZlbnRMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ1bm1vdW50T2JiIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMzE0NjMsNiArMTQxMjIyLDEyNCBAQAogPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5vcy5zdG9yYWdlLk9uT2JiU3RhdGVDaGFuZ2VMaXN0ZW5lciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1bnJlZ2lzdGVyTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VFdmVudExpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlN0b3JhZ2VSZXN1bHRDb2RlIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTdG9yYWdlUmVzdWx0Q29kZSIKKyB0eXBlPSJhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZVJlc3VsdENvZGUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25GYWlsZWRJbnRlcm5hbEVycm9yIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uRmFpbGVkTWVkaWFCbGFuayIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0zIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZE1lZGlhQ29ycnVwdCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii00IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZE5vTWVkaWEiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25GYWlsZWRTdG9yYWdlQnVzeSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii03IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZFN0b3JhZ2VNb3VudGVkIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uRmFpbGVkU3RvcmFnZU5vdE1vdW50ZWQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25TdWNjZWVkZWQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9jbGFzcz4KIDwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImFuZHJvaWQucHJlZmVyZW5jZSIKQEAgLTEzMjI1OCw2ICsxNDIxMzUsMTQ4IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIgorIGV4dGVuZHM9ImFuZHJvaWQucHJlZmVyZW5jZS5EaWFsb2dQcmVmZXJlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSIKKyB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSIKKyB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZmluZEluZGV4T2ZWYWx1ZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RW50cmllcyIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRFbnRyeVZhbHVlcyIKKyByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWYWx1ZXMiCisgcmV0dXJuPSJqYXZhLnV0aWwuU2V0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEVudHJpZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbnRyaWVzIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RW50cmllcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVudHJpZXNSZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEVudHJ5VmFsdWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW50cnlWYWx1ZXMiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFbnRyeVZhbHVlcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVudHJ5VmFsdWVzUmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRWYWx1ZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iUHJlZmVyZW5jZSIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEzMjM3Niw2ICsxNDIzOTUsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RXh0cmFzIgorIHJldHVybj0iYW5kcm9pZC5vcy5CdW5kbGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RnJhZ21lbnQiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEludGVudCIKICByZXR1cm49ImFuZHJvaWQuY29udGVudC5JbnRlbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTMyODA4LDYgKzE0Mjg0OSwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJkZWZhdWx0VmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGVla0V4dHJhcyIKKyByZXR1cm49ImFuZHJvaWQub3MuQnVuZGxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InBlcnNpc3RCb29sZWFuIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMzI5MzgsNiArMTQyOTkwLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZWQiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RnJhZ21lbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRJbnRlbnQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEzMzI1Niw2ICsxNDMzMjEsOCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlRnJhZ21lbnQuT25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudENhbGxiYWNrIj4KKzwvaW1wbGVtZW50cz4KIDxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQWN0aXZpdHkiCiAgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMTMzMjcxLDYgKzE0MzMzOCw2MjIgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByZWZlcmVuY2VzUmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmaW5kUHJlZmVyZW5jZSIKKyByZXR1cm49ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQcmVmZXJlbmNlTWFuYWdlciIKKyByZXR1cm49ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByZWZlcmVuY2VTY3JlZW4iCisgcmV0dXJuPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc0hlYWRlcnMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImludmFsaWRhdGVIZWFkZXJzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc011bHRpUGFuZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZEhlYWRlcnNGcm9tUmVzb3VyY2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXNpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YXJnZXQiIHR5cGU9ImphdmEudXRpbC5MaXN0Jmx0O2FuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHkuSGVhZGVyJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkJ1aWxkSGVhZGVycyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS51dGlsLkxpc3QmbHQ7YW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eS5IZWFkZXImZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uR2V0SW5pdGlhbEhlYWRlciIKKyByZXR1cm49ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHkuSGVhZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uR2V0TmV3SGVhZGVyIgorIHJldHVybj0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eS5IZWFkZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25IZWFkZXJDbGljayIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImhlYWRlciIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eS5IZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Jc0hpZGluZ0hlYWRlcnMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uSXNNdWx0aVBhbmUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUHJlZmVyZW5jZVN0YXJ0RnJhZ21lbnQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsZXIiIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByZWYiIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUHJlZmVyZW5jZVRyZWVDbGljayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJlZmVyZW5jZVNjcmVlbiIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VTY3JlZW4iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByZWZlcmVuY2UiIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldExpc3RGb290ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQcmVmZXJlbmNlU2NyZWVuIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcmVmZXJlbmNlU2NyZWVuIiB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93QnJlYWRDcnVtYnMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aXRsZSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2hvcnRUaXRsZSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydFByZWZlcmVuY2VGcmFnbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHVzaCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydFByZWZlcmVuY2VGcmFnbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRXaXRoRnJhZ21lbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN3aXRjaFRvSGVhZGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnROYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzd2l0Y2hUb0hlYWRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImhlYWRlciIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eS5IZWFkZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3dpdGNoVG9IZWFkZXJJbm5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5leHQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJFWFRSQV9OT19IRUFERVJTIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90OzphbmRyb2lkOm5vX2hlYWRlcnMmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRVhUUkFfU0hPV19GUkFHTUVOVCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDs6YW5kcm9pZDpzaG93X2ZyYWdtZW50JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkVYVFJBX1NIT1dfRlJBR01FTlRfQVJHVU1FTlRTIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90OzphbmRyb2lkOnNob3dfZnJhZ21lbnRfYXJncyZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJIRUFERVJfSURfVU5ERUZJTkVEIgorIHR5cGU9ImxvbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0xTCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUHJlZmVyZW5jZUFjdGl2aXR5LkhlYWRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQWN0aXZpdHkuSGVhZGVyIgorIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHkuSGVhZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImRlc2NyaWJlQ29udGVudHMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVhZEZyb21QYXJjZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbiIgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWwiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0id3JpdGVUb1BhcmNlbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRlc3QiIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQ1JFQVRPUiIKKyB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvciIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJicmVhZENydW1iU2hvcnRUaXRsZSIKKyB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYnJlYWRDcnVtYlRpdGxlIgorIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJleHRyYXMiCisgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmcmFnbWVudCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJhZ21lbnRBcmd1bWVudHMiCisgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJpY29uUmVzIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImlkIgorIHR5cGU9ImxvbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJpbnRlbnQiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InN1bW1hcnkiCisgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InRpdGxlIgorIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUHJlZmVyZW5jZUNhdGVnb3J5IgorIGV4dGVuZHM9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlR3JvdXAiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQ2F0ZWdvcnkiCisgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VDYXRlZ29yeSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iUHJlZmVyZW5jZUNhdGVnb3J5IgorIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ2F0ZWdvcnkiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByZWZlcmVuY2VDYXRlZ29yeSIKKyB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNhdGVnb3J5IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJQcmVmZXJlbmNlRnJhZ21lbnQiCisgZXh0ZW5kcz0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByZWZlcmVuY2VGcmFnbWVudCIKKyB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUZyYWdtZW50IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImFkZFByZWZlcmVuY2VzRnJvbUludGVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CkBAIC0xMzMzNTQsNTEgKzE0NDAzNywyOSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Ci08Y2xhc3MgbmFtZT0iUHJlZmVyZW5jZUNhdGVnb3J5IgotIGV4dGVuZHM9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlR3JvdXAiCi0gYWJzdHJhY3Q9ImZhbHNlIgorPGludGVyZmFjZSBuYW1lPSJQcmVmZXJlbmNlRnJhZ21lbnQuT25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudENhbGxiYWNrIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvblByZWZlcmVuY2VTdGFydEZyYWdtZW50IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPGNvbnN0cnVjdG9yIG5hbWU9IlByZWZlcmVuY2VDYXRlZ29yeSIKLSB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNhdGVnb3J5IgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsZXIiIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlRnJhZ21lbnQiPgogPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzxwYXJhbWV0ZXIgbmFtZT0icHJlZiIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UiPgogPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L2NvbnN0cnVjdG9yPgotPGNvbnN0cnVjdG9yIG5hbWU9IlByZWZlcmVuY2VDYXRlZ29yeSIKLSB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNhdGVnb3J5IgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KLTxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQ2F0ZWdvcnkiCi0gdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VDYXRlZ29yeSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KLTwvY2xhc3M+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IlByZWZlcmVuY2VHcm91cCIKICBleHRlbmRzPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTEzNDM1OSw5ICsxNDUwMjAsOSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0iYyIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0icyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8cGFyYW1ldGVyIG5hbWU9InN0cmluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ0cnVuY2F0ZUhpc3RvcnkiCkBAIC0xMzQ3NDUsNyArMTQ1NDA2LDcgQEAKICB2YWx1ZT0iJnF1b3Q7dXJsJnF1b3Q7IgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+CkBAIC0xMzc4MDQsNiArMTQ4NDY1LDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJESVJFQ1RPUllfUEFSQU1fS0VZIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2RpcmVjdG9yeSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJMSU1JVF9QQVJBTV9LRVkiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7bGltaXQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuQWdncmVnYXRpb25FeGNlcHRpb25zIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCkBAIC0xMzgwNzksNiArMTQ4NzYyLDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9InR5cGUiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkFERFJFU1MiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7ZGF0YTEmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iQ09OVEVOVF9GSUxURVJfVVJJIgogIHR5cGU9ImFuZHJvaWQubmV0LlVyaSIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTM5OTEzLDYgKzE1MDYwNyw5MSBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdE5hbWVDb2x1bW5zIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPGZpZWxkIG5hbWU9IkRJU1BMQVlfTkFNRV9BTFRFUk5BVElWRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtkaXNwbGF5X25hbWVfYWx0JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkRJU1BMQVlfTkFNRV9QUklNQVJZIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2Rpc3BsYXlfbmFtZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJESVNQTEFZX05BTUVfU09VUkNFIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2Rpc3BsYXlfbmFtZV9zb3VyY2UmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUEhPTkVUSUNfTkFNRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtwaG9uZXRpY19uYW1lJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBIT05FVElDX05BTUVfU1RZTEUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7cGhvbmV0aWNfbmFtZV9zdHlsZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTT1JUX0tFWV9BTFRFUk5BVElWRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtzb3J0X2tleV9hbHQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU09SVF9LRVlfUFJJTUFSWSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtzb3J0X2tleSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvaW50ZXJmYWNlPgogPGludGVyZmFjZSBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkNvbnRhY3RPcHRpb25zQ29sdW1ucyIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9InRydWUiCkBAIC0xMzk5ODMsNiArMTUwNzYyLDE3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgorPGZpZWxkIG5hbWU9IkNPTlRBQ1RfQ0hBVF9DQVBBQklMSVRZIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2NvbnRhY3RfY2hhdF9jYXBhYmlsaXR5JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkNPTlRBQ1RfUFJFU0VOQ0UiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQwMDYwLDYgKzE1MDg1MCw4IEBACiA+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zIj4KIDwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0TmFtZUNvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgogPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RPcHRpb25zQ29sdW1ucyI+CiA8L2ltcGxlbWVudHM+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdFN0YXR1c0NvbHVtbnMiPgpAQCAtMTQwMjU1LDYgKzE1MTA0NywxMCBAQAogPgogPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucyI+CiA8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdE9wdGlvbnNDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0U3RhdHVzQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHNDb2x1bW5zIj4KIDwvaW1wbGVtZW50cz4KIDxmaWVsZCBuYW1lPSJDT05URU5UX0RJUkVDVE9SWSIKQEAgLTE0MDI5Myw2ICsxNTEwODksNjggQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHMuRW50aXR5IgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5CYXNlU3luY0NvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3ROYW1lQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdE9wdGlvbnNDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0U3RhdHVzQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHNDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHNDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5TdGF0dXNDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5TeW5jQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+Cis8ZmllbGQgbmFtZT0iQ09OVEVOVF9ESVJFQ1RPUlkiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7ZW50aXRpZXMmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iREFUQV9JRCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtkYXRhX2lkJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlJBV19DT05UQUNUX0lEIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3Jhd19jb250YWN0X2lkJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkNvbnRhY3RzLlBob3RvIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTQwMzAzLDcgKzE1MTE2MSw3IEBACiA+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zIj4KIDwvaW1wbGVtZW50cz4KLTxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhQ29sdW1ucyI+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YUNvbHVtbnNXaXRoSm9pbnMiPgogPC9pbXBsZW1lbnRzPgogPGZpZWxkIG5hbWU9IkNPTlRFTlRfRElSRUNUT1JZIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCkBAIC0xNDAzMTYsNiArMTUxMTc0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQSE9UTyIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtkYXRhMTUmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2NsYXNzPgogPGludGVyZmFjZSBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkNvbnRhY3RzQ29sdW1ucyIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTE0MDM3OSw2ICsxNTEyNDgsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBIT1RPX1RIVU1CTkFJTF9VUkkiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7cGhvdG9fdGh1bWJfdXJpJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBIT1RPX1VSSSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtwaG90b191cmkmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkRhdGEiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTE0MDYyMSw2ICsxNTE1MTIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IklTX1JFQURfT05MWSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtpc19yZWFkX29ubHkmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iSVNfU1VQRVJfUFJJTUFSWSIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNDA3MDgsNiArMTUxNjEwLDggQEAKID4KIDxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMiPgogPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3ROYW1lQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdE9wdGlvbnNDb2x1bW5zIj4KIDwvaW1wbGVtZW50cz4KIDxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0U3RhdHVzQ29sdW1ucyI+CkBAIC0xNDA3MjEsNiArMTUxNjI1LDQ0MSBAQAogPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlN0YXR1c0NvbHVtbnMiPgogPC9pbXBsZW1lbnRzPgogPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iQ29udGFjdHNDb250cmFjdC5EaXJlY3RvcnkiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJub3RpZnlEaXJlY3RvcnlDaGFuZ2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc29sdmVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQUNDT1VOVF9OQU1FIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FjY291bnROYW1lJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkFDQ09VTlRfVFlQRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthY2NvdW50VHlwZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDT05URU5UX0lURU1fVFlQRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDt2bmQuYW5kcm9pZC5jdXJzb3IuaXRlbS9jb250YWN0X2RpcmVjdG9yeSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDT05URU5UX1RZUEUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7dm5kLmFuZHJvaWQuY3Vyc29yLmRpci9jb250YWN0X2RpcmVjdG9yaWVzJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNPTlRFTlRfVVJJIgorIHR5cGU9ImFuZHJvaWQubmV0LlVyaSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJERUZBVUxUIgorIHR5cGU9ImxvbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjBMIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkRJUkVDVE9SWV9BVVRIT1JJVFkiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YXV0aG9yaXR5JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkRJU1BMQVlfTkFNRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtkaXNwbGF5TmFtZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJFWFBPUlRfU1VQUE9SVCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtleHBvcnRTdXBwb3J0JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkVYUE9SVF9TVVBQT1JUX0FOWV9BQ0NPVU5UIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJFWFBPUlRfU1VQUE9SVF9OT05FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJFWFBPUlRfU1VQUE9SVF9TQU1FX0FDQ09VTlRfT05MWSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTE9DQUxfSU5WSVNJQkxFIgorIHR5cGU9ImxvbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjFMIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBBQ0tBR0VfTkFNRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtwYWNrYWdlTmFtZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQSE9UT19TVVBQT1JUIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3Bob3RvU3VwcG9ydCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQSE9UT19TVVBQT1JUX0ZVTEwiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBIT1RPX1NVUFBPUlRfRlVMTF9TSVpFX09OTFkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBIT1RPX1NVUFBPUlRfTk9ORSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUEhPVE9fU1VQUE9SVF9USFVNQk5BSUxfT05MWSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU0hPUlRDVVRfU1VQUE9SVCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtzaG9ydGN1dFN1cHBvcnQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU0hPUlRDVVRfU1VQUE9SVF9EQVRBX0lURU1TX09OTFkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNIT1JUQ1VUX1NVUFBPUlRfRlVMTCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU0hPUlRDVVRfU1VQUE9SVF9OT05FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUWVBFX1JFU09VUkNFX0lEIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3R5cGVSZXNvdXJjZUlkJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iQ29udGFjdHNDb250cmFjdC5EaXNwbGF5TmFtZVNvdXJjZXMiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZmllbGQgbmFtZT0iRU1BSUwiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOSUNLTkFNRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjM1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9SR0FOSVpBVElPTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBIT05FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RSVUNUVVJFRF9OQU1FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNDAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVU5ERUZJTkVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkZ1bGxOYW1lU3R5bGUiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZmllbGQgbmFtZT0iQ0hJTkVTRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ0pLIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJKQVBBTkVTRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iS09SRUFOIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJVTkRFRklORUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IldFU1RFUk4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iQ29udGFjdHNDb250cmFjdC5Hcm91cHMiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNDA3OTgsNiArMTUyMTM3LDE3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgorPGZpZWxkIG5hbWU9IkFVVE9fQUREIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2F1dG9fYWRkJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkRFTEVURUQiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQwODA5LDYgKzE1MjE1OSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkFWT1JJVEVTIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2Zhdm9yaXRlcyZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJHUk9VUF9WSVNJQkxFIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE0MTM2Myw2ICsxNTI3MjQsNTggQEAKID4KIDwvZmllbGQ+CiA8L2ludGVyZmFjZT4KKzxpbnRlcmZhY2UgbmFtZT0iQ29udGFjdHNDb250cmFjdC5QaG9uZXRpY05hbWVTdHlsZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxmaWVsZCBuYW1lPSJKQVBBTkVTRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iS09SRUFOIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQSU5ZSU4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlVOREVGSU5FRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJDb250YWN0c0NvbnRyYWN0LlByZXNlbmNlIgogIGV4dGVuZHM9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5TdGF0dXNVcGRhdGVzIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0MTU0NSw2ICsxNTI5NTgsOCBAQAogPgogPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucyI+CiA8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdE5hbWVDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KIDxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0T3B0aW9uc0NvbHVtbnMiPgogPC9pbXBsZW1lbnRzPgogPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzQ29sdW1ucyI+CkBAIC0xNDE2MDgsNyArMTUzMDIzLDcgQEAKICB2YWx1ZT0iMSIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgpAQCAtMTQxNzU1LDYgKzE1MzE3MCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUkFXX0NPTlRBQ1RfSVNfUkVBRF9PTkxZIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3Jhd19jb250YWN0X2lzX3JlYWRfb25seSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHNFbnRpdHkiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTE0MTk2MCw2ICsxNTMzODYsNTAgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNBUEFCSUxJVFlfSEFTX0NBTUVSQSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ0FQQUJJTElUWV9IQVNfVklERU8iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNBUEFCSUxJVFlfSEFTX1ZPSUNFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDSEFUX0NBUEFCSUxJVFkiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7Y2hhdF9jYXBhYmlsaXR5JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkRPX05PVF9ESVNUVVJCIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQzNDAyLDYgKzE1NDg3MiwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJ2b2x1bWVOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENvbnRlbnRVcmlGb3JBdWRpb0lkIgorIHJldHVybj0iYW5kcm9pZC5uZXQuVXJpIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZvbHVtZU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF1ZGlvSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPGZpZWxkIG5hbWU9IkNPTlRFTlRfVFlQRSIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNDYyNzksNiArMTU3NzY0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTRUxFQ1RFRF9JTlBVVF9NRVRIT0RfU1VCVFlQRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtzZWxlY3RlZF9pbnB1dF9tZXRob2Rfc3VidHlwZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJTRVRUSU5HU19DTEFTU05BTUUiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQ3MDAwLDYgKzE1ODQ5NiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQVVUT19USU1FX1pPTkUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YXV0b190aW1lX3pvbmUmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iQkxVRVRPT1RIX0RJU0NPVkVSQUJJTElUWSIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNTA4NjksNyArMTYyMzc2LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImFuZHJvaWQudGV4dC5FZGl0YWJsZSI+Cis8cGFyYW1ldGVyIG5hbWU9InMiIHR5cGU9ImFuZHJvaWQudGV4dC5FZGl0YWJsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJiZWZvcmVUZXh0Q2hhbmdlZCIKQEAgLTE1NTcxMSw2ICsxNjcyMTgsMzYgQEAKID4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJMb2FkZXJUZXN0Q2FzZSIKKyBleHRlbmRzPSJhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTG9hZGVyVGVzdENhc2UiCisgdHlwZT0iYW5kcm9pZC50ZXN0LkxvYWRlclRlc3RDYXNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldExvYWRlclJlc3VsdFN5bmNocm9ub3VzbHkiCisgcmV0dXJuPSJUIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsb2FkZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7VCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTW9yZUFzc2VydHMiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNTg2MzEsNiArMTcwMTY4LDI1IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3Blbk9yQ3JlYXRlRGF0YWJhc2UiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvckhhbmRsZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icGVla1dhbGxwYXBlciIKICByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTU4OTc1LDE3ICsxNzA1MzEsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvY29uc3RydWN0b3I+Ci08bWV0aG9kIG5hbWU9ImFib3J0VXBkYXRlcyIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2xvc2UiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE1ODk5NywzMCArMTcwNTQyLDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iY29tbWl0VXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iY29tbWl0VXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iamF2YS51dGlsLk1hcCZsdDs/IGV4dGVuZHMgamF2YS5sYW5nLkxvbmcsID8gZXh0ZW5kcyBqYXZhLnV0aWwuTWFwJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QmZ3Q7Jmd0OyI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjb3B5U3RyaW5nVG9CdWZmZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE1OTA0NywxNyArMTcwNTY4LDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZGVsZXRlUm93IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRCbG9iIgogIHJldHVybj0iYnl0ZVtdIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE1OTI0Myw4ICsxNzA3NTMsOCBAQAogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMiCi0gcmV0dXJuPSJib29sZWFuIgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCkBAIC0xNTkyNTMsOCArMTcwNzYzLDEwIEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9Imhhc1VwZGF0ZXMiCis8bWV0aG9kIG5hbWU9ImdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgpAQCAtMTU5NDY4LDE3ICsxNzA5ODAsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzdXBwb3J0c1VwZGF0ZXMiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE1OTUwNSwxMjQgKzE3MTAwNiw2IEBACiA8cGFyYW1ldGVyIG5hbWU9Im9ic2VydmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVCbG9iIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImJ5dGVbXSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVEb3VibGUiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZG91YmxlIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUZsb2F0IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImZsb2F0Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUludCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlTG9uZyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJsb25nIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZVNob3J0IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9InNob3J0Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZVN0cmluZyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZVRvTnVsbCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTW9ja0RpYWxvZ0ludGVyZmFjZSIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgpAQCAtMTYxNzc1LDE1ICsxNzMxNTgsMjMgQEAKIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iQ2xpcGJvYXJkTWFuYWdlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgotIGFic3RyYWN0PSJmYWxzZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDbGlwYm9hcmRNYW5hZ2VyIgorIHR5cGU9ImFuZHJvaWQudGV4dC5DbGlwYm9hcmRNYW5hZ2VyIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImdldFRleHQiCiAgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgotIGFic3RyYWN0PSJmYWxzZSIKKyBhYnN0cmFjdD0idHJ1ZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTE2MTc5NCw3ICsxNzMxODUsNyBAQAogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Imhhc1RleHQiCiAgcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKKyBhYnN0cmFjdD0idHJ1ZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTE2MTgwNSw3ICsxNzMxOTYsNyBAQAogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFRleHQiCiAgcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKKyBhYnN0cmFjdD0idHJ1ZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTE2NDYzMCw2ICsxNzYwMjEsMjkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ia2luZCIgdHlwZT0iamF2YS5sYW5nLkNsYXNzJmx0O1QmZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRleHRSdW5DdXJzb3IiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHRTdGFydCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0RW5kIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3JPcHQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5QYWludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpbnNlcnQiCiAgcmV0dXJuPSJhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNjU2OTAsNyArMTc3MTA0LDcgQEAKID4KIDxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0icCIgdHlwZT0iYW5kcm9pZC50ZXh0LlRleHRQYWludCI+Cis8cGFyYW1ldGVyIG5hbWU9InBhaW50IiB0eXBlPSJhbmRyb2lkLnRleHQuVGV4dFBhaW50Ij4KIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJhdmFpbCIgdHlwZT0iZmxvYXQiPgogPC9wYXJhbWV0ZXI+CkBAIC0xNzQwNzcsNiArMTg1NDkxLDE4IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLlRocm93YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQW5kcm9pZEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLnV0aWwuQW5kcm9pZEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+CiA8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuRXhjZXB0aW9uIj4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KQEAgLTE3NDExNCw2ICsxODU1NDAsMTggQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBbmRyb2lkUnVudGltZUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLnV0aWwuQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgogPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLkV4Y2VwdGlvbiI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CkBAIC0xNzUxMjIsNyArMTg2NTYwLDcgQEAKICBhYnN0cmFjdD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8Y29uc3RydWN0b3IgbmFtZT0iRXZlbnRMb2dUYWdzIgpAQCAtMTc1Mjc3LDYgKzE4NjcxNSw0ODMgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ikpzb25SZWFkZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmlvLkNsb3NlYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iSnNvblJlYWRlciIKKyB0eXBlPSJhbmRyb2lkLnV0aWwuSnNvblJlYWRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluIiB0eXBlPSJqYXZhLmlvLlJlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImJlZ2luQXJyYXkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJiZWdpbk9iamVjdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNsb3NlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5kQXJyYXkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbmRPYmplY3QiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNOZXh0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV4dEJvb2xlYW4iCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0RG91YmxlIgorIHJldHVybj0iZG91YmxlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0SW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0TG9uZyIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5leHROYW1lIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV4dE51bGwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0U3RyaW5nIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGVlayIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uVG9rZW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldExlbmllbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsZW5pZW50IiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNraXBWYWx1ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN5bnRheEVycm9yIgorIHJldHVybj0iamF2YS5pby5JT0V4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVzc2FnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iSnNvblRva2VuIgorIGV4dGVuZHM9ImphdmEubGFuZy5FbnVtIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0idmFsdWVPZiIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uVG9rZW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ2YWx1ZXMiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvblRva2VuW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ikpzb25Xcml0ZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmlvLkNsb3NlYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iSnNvbldyaXRlciIKKyB0eXBlPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im91dCIgdHlwZT0iamF2YS5pby5Xcml0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJiZWdpbkFycmF5IgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJlZ2luT2JqZWN0IgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNsb3NlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5kQXJyYXkiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5kT2JqZWN0IgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZsdXNoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmFtZSIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJudWxsVmFsdWUiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW5kZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5kZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InZhbHVlIgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ2YWx1ZSIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idmFsdWUiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImRvdWJsZSI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idmFsdWUiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkxvZyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE3NjAwMiw3ICsxODc5MTcsNyBAQAogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKICB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IiZxdW90OygoYWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoYml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfChjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KGVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KGdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KGluZm98aW50fGlbZGVsbW5vcXJzdF0pfChqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfChtaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KG5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KG9yZ3xvbSl8KHByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KHRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCh4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC16Y2t6YWgpfHlbZXR1XXx6W2Ftd10pJnF1b3Q7IgorIHZhbHVlPSImcXVvdDsoKGFlcm98YXJwYXxhc2lhfGFbY2RlZmdpbG1ub3Fyc3R1d3h6XSl8KGJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoY2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfChlZHV8ZVtjZWdyc3R1XSl8Zltpamttb3JdfChnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfChpbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoam9ic3xqW2Vtb3BdKXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXwobWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfChuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfChvcmd8b20pfChwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCh0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoeG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtbWdiYWFtN2E4aHx4blxcLVxcLW1nYmVycDRhNWQ0YXJ8eG5cXC1cXC13Z2JoMWN8eG5cXC1cXC16Y2t6YWgpfHlbZXRdfHpbYW13XSkmcXVvdDsiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtMTc2MDEzLDcgKzE4NzkyOCw3IEBACiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgogIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iJnF1b3Q7KD86KD86YWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoPzpiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KD86Y2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfCg/OmVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KD86Z292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoPzppbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoPzpqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfCg/Om1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwoPzpuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfCg/Om9yZ3xvbSl8KD86cHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwoPzp0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoPzp4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC16Y2t6YWgpfHlbZXR1XXx6W2Ftd10pKSZxdW90OyIKKyB2YWx1ZT0iJnF1b3Q7KD86KD86YWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoPzpiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KD86Y2F0fGNvbXxjb29wfGNbYWNkZmdoaWtsbW5vcnV2eHl6XSl8ZFtlamttb3pdfCg/OmVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KD86Z292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoPzppbmZvfGludHxpW2RlbG1ub3Fyc3RdKXwoPzpqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfCg/Om1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwoPzpuYW1lfG5ldHxuW2FjZWZnaWxvcHJ1el0pfCg/Om9yZ3xvbSl8KD86cHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwoPzp0ZWx8dHJhdmVsfHRbY2RmZ2hqa2xtbm9wcnR2d3pdKXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXwoPzp4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCl8eVtldF18elthbXddKSkmcXVvdDsiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtMTc2MjgwLDYgKzE4ODE5NSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVBdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0VmFsdWVBdCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTc3ODg1LDYgKzE4OTgxMywyMzEgQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFjdGlvbk1vZGUiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWN0aW9uTW9kZSIKKyB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJmaW5pc2giCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q3VzdG9tVmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TWVudSIKKyByZXR1cm49ImFuZHJvaWQudmlldy5NZW51IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TWVudUluZmxhdGVyIgorIHJldHVybj0iYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN1YnRpdGxlIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRpdGxlIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImludmFsaWRhdGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q3VzdG9tVmlldyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3VidGl0bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN1YnRpdGxlIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN1YnRpdGxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRpdGxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aXRsZSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUaXRsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iQWN0aW9uTW9kZS5DYWxsYmFjayIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25BY3Rpb25JdGVtQ2xpY2tlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQudmlldy5NZW51SXRlbSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZUFjdGlvbk1vZGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtZW51IiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkRlc3Ryb3lBY3Rpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblByZXBhcmVBY3Rpb25Nb2RlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGludGVyZmFjZSBuYW1lPSJDb250ZXh0TWVudSIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMTc4MTM1LDYgKzE5MDI4OCwyMTkgQEAKID4KIDwvZmllbGQ+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkRyYWdFdmVudCIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLm9zLlBhcmNlbGFibGUiPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJkZXNjcmliZUNvbnRlbnRzIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFjdGlvbiIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDbGlwRGF0YSIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDbGlwRGVzY3JpcHRpb24iCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERlc2NyaXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFgiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRZIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib2J0YWluIgorIHJldHVybj0iYW5kcm9pZC52aWV3LkRyYWdFdmVudCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhY3Rpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InkiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9idGFpbiIKKyByZXR1cm49ImFuZHJvaWQudmlldy5EcmFnRXZlbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic291cmNlIiB0eXBlPSJhbmRyb2lkLnZpZXcuRHJhZ0V2ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlY3ljbGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0id3JpdGVUb1BhcmNlbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRlc3QiIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQUNUSU9OX0RSQUdfRU5ERUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkFDVElPTl9EUkFHX0VOVEVSRUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkFDVElPTl9EUkFHX0VYSVRFRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQUNUSU9OX0RSQUdfTE9DQVRJT04iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkFDVElPTl9EUkFHX1NUQVJURUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkFDVElPTl9EUk9QIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDUkVBVE9SIgorIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJGb2N1c0ZpbmRlciIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4MjM2MSw2ICsxOTQ3MjcsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RmFjdG9yeTIiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIuRmFjdG9yeTIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRGaWx0ZXIiCiAgcmV0dXJuPSJhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIuRmlsdGVyIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4MjQ1Myw2ICsxOTQ4MzAsMjUgQEAKIDxleGNlcHRpb24gbmFtZT0iQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5sYW5nLkNsYXNzTm90Rm91bmRFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVWaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmVudCIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRGYWN0b3J5IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODI0NjYsNiArMTk0ODYyLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlci5GYWN0b3J5Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEZhY3RvcnkyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyLkZhY3RvcnkyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEZpbHRlciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTgyNTA1LDYgKzE5NDkxNCwzNSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJMYXlvdXRJbmZsYXRlci5GYWN0b3J5MiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlci5GYWN0b3J5Ij4KKzwvaW1wbGVtZW50cz4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVWaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iTGF5b3V0SW5mbGF0ZXIuRmlsdGVyIgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0idHJ1ZSIKQEAgLTE4MzAzMiw2ICsxOTU0NzAsMTcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8bWV0aG9kIG5hbWU9ImdldEFjdGlvblZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEFscGhhYmV0aWNTaG9ydGN1dCIKICByZXR1cm49ImNoYXIiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0xODMyMDgsNiArMTk1NjU3LDE5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEFjdGlvblZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuTWVudUl0ZW0iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0QWxwaGFiZXRpY1Nob3J0Y3V0IgogIHJldHVybj0iYW5kcm9pZC52aWV3Lk1lbnVJdGVtIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMTgzMzQwLDYgKzE5NTgwMiwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJhbHBoYUNoYXIiIHR5cGU9ImNoYXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2hvd0FzQWN0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhY3Rpb25FbnVtIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0VGl0bGUiCiAgcmV0dXJuPSJhbmRyb2lkLnZpZXcuTWVudUl0ZW0iCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0xODMzOTIsNiArMTk1ODY3LDM5IEBACiA8cGFyYW1ldGVyIG5hbWU9InZpc2libGUiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJTSE9XX0FTX0FDVElPTl9BTFdBWVMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNIT1dfQVNfQUNUSU9OX0lGX1JPT00iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNIT1dfQVNfQUNUSU9OX05FVkVSIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvaW50ZXJmYWNlPgogPGludGVyZmFjZSBuYW1lPSJNZW51SXRlbS5Pbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTE4NDM4Miw2ICsxOTY4OTAsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ieSIgdHlwZT0iZmxvYXQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idHJhbnNmb3JtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtYXRyaXgiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9IndyaXRlVG9QYXJjZWwiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4NDk5Niw2ICsxOTc1MTcsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q3VycmVudFNwYW5YIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q3VycmVudFNwYW5ZIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0RXZlbnRUaW1lIgogIHJldHVybj0ibG9uZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODUwNDAsNiArMTk3NTgzLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByZXZpb3VzU3BhblgiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQcmV2aW91c1NwYW5ZIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0U2NhbGVGYWN0b3IiCiAgcmV0dXJuPSJmbG9hdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODY2MTksNiArMTk5MTg0LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZvY3VzYWJsZU1vZGUiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhZGRPbkxheW91dENoYW5nZUxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Lk9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iYWRkVG91Y2hhYmxlcyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg2ODc5LDYgKzE5OTQ1NywxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJoaW50IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGlzcGF0Y2hEcmFnRXZlbnQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJldmVudCIgdHlwZT0iYW5kcm9pZC52aWV3LkRyYWdFdmVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJkaXNwYXRjaERyYXciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4Njk3MCw2ICsxOTk1NjEsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXkmbHQ7YW5kcm9pZC5vcy5QYXJjZWxhYmxlJmd0OyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkaXNwYXRjaFNldEFjdGl2YXRlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFjdGl2YXRlZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJkaXNwYXRjaFNldFByZXNzZWQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4NzE3Niw2ICsxOTk3ODAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QWxwaGEiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRBbmltYXRpb24iCiAgcmV0dXJuPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODc2MjAsNiArMjAwMjM1LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJpbnRbXSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRNYXRyaXgiCisgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRNZWFzdXJlZEhlaWdodCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODc2OTcsOCArMjAwMzIzLDggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0T3ZlcnNjcm9sbE1vZGUiCi0gcmV0dXJuPSJpbnQiCis8bWV0aG9kIG5hbWU9ImdldE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXJzIgorIHJldHVybj0iamF2YS51dGlsLkxpc3QmbHQ7YW5kcm9pZC52aWV3LlZpZXcuT25MYXlvdXRDaGFuZ2VMaXN0ZW5lciZndDsiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKQEAgLTE4Nzc2Myw2ICsyMDAzODksMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGl2b3RYIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGl2b3RZIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0UmVzb3VyY2VzIgogIHJldHVybj0iYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg3ODE4LDYgKzIwMDQ2Niw2MSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSb3RhdGlvbiIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJvdGF0aW9uWCIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJvdGF0aW9uWSIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNjYWxlWCIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNjYWxlWSIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFNjcm9sbEJhclN0eWxlIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4Nzk2Myw2ICsyMDA2NjYsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHJhbnNsYXRpb25YIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHJhbnNsYXRpb25ZIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0VmVydGljYWxGYWRpbmdFZGdlTGVuZ3RoIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4ODA2NCw2ICsyMDA3ODksMjggQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib3V0UmVjdCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5SZWN0Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFgiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRZIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaGFzRm9jdXMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4ODE5Niw2ICsyMDA5NDMsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZHJhd2FibGUiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNBY3RpdmF0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzQ2xpY2thYmxlIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODgyODQsNiArMjAxMDQyLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzSGFyZHdhcmVBY2NlbGVyYXRlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNIb3Jpem9udGFsRmFkaW5nRWRnZUVuYWJsZWQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4ODM5NCw2ICsyMDExNjMsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNTYXZlRnJvbVBhcmVudEVuYWJsZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzU2Nyb2xsYmFyRmFkaW5nRW5hYmxlZCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg4NjU1LDYgKzIwMTQzNSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJoaW50IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EcmFnRXZlbnQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJldmVudCIgdHlwZT0iYW5kcm9pZC52aWV3LkRyYWdFdmVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvbkRyYXciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4ODY2OCw2ICsyMDE0NjEsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY2FudmFzIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkRyYXdEcmFnVGh1bWJuYWlsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FudmFzIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvbkRyYXdTY3JvbGxCYXJzIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODg4NjEsNyArMjAxNjY3LDcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iaGVpZ2h0TWVhc3VyZVNwZWMiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJvbk92ZXJzY3JvbGxlZCIKKzxtZXRob2QgbmFtZT0ib25NZWFzdXJlRHJhZ1RodW1ibmFpbCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCkBAIC0xODg4NzEsMTQgKzIwMTY3Nyw2IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgotPHBhcmFtZXRlciBuYW1lPSJzY3JvbGxYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InNjcm9sbFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iY2xhbXBlZFgiIHR5cGU9ImJvb2xlYW4iPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImNsYW1wZWRZIiB0eXBlPSJib29sZWFuIj4KLTwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uUmVzdG9yZUluc3RhbmNlU3RhdGUiCiAgcmV0dXJuPSJ2b2lkIgpAQCAtMTg5MDMzLDM1ICsyMDE4MzEsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ2aXNpYmlsaXR5IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ib3ZlcnNjcm9sbEJ5IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InByb3RlY3RlZCIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iZGVsdGFYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImRlbHRhWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJzY3JvbGxYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InNjcm9sbFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ic2Nyb2xsUmFuZ2VYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InNjcm9sbFJhbmdlWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtYXhPdmVyc2Nyb2xsWCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtYXhPdmVyc2Nyb2xsWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJpc1RvdWNoRXZlbnQiIHR5cGU9ImJvb2xlYW4iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icGVyZm9ybUNsaWNrIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODkyNDEsNiArMjAyMDEwLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImFjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlJ1bm5hYmxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZU9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXcuT25MYXlvdXRDaGFuZ2VMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJyZXF1ZXN0Rm9jdXMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4OTQ0NCw2ICsyMDIyMjYsMzIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZXZlbnQiIHR5cGU9ImFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBY3RpdmF0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhY3RpdmF0ZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QWxwaGEiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbHBoYSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0QW5pbWF0aW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODk0OTYsNiArMjAyMzA0LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9InJlc2lkIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Qm90dG9tIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJib3R0b20iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRDbGlja2FibGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4OTUyMiw2ICsyMDIzNDMsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERyYWdUaHVtYm5haWxEaW1lbnNpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndpZHRoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImhlaWdodCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldERyYXdpbmdDYWNoZUJhY2tncm91bmRDb2xvciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg5NzE3LDYgKzIwMjU1MywxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJwYXJhbXMiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldExlZnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxlZnQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRMb25nQ2xpY2thYmxlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODk5MDEsMTkgKzIwMjc1MCw2IEBACiA8cGFyYW1ldGVyIG5hbWU9ImwiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Lk9uVG91Y2hMaXN0ZW5lciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRPdmVyc2Nyb2xsTW9kZSIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9Im92ZXJzY3JvbGxNb2RlIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0UGFkZGluZyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg5OTMzLDYgKzIwMjc2OSwzMiBAQAogPHBhcmFtZXRlciBuYW1lPSJib3R0b20iIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQaXZvdFgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwaXZvdFgiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBpdm90WSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBpdm90WSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0UHJlc3NlZCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg5OTQ2LDYgKzIwMjgwOCw1OCBAQAogPHBhcmFtZXRlciBuYW1lPSJwcmVzc2VkIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJpZ2h0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyaWdodCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJvdGF0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icm90YXRpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJvdGF0aW9uWCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJvdGF0aW9uWCIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Um90YXRpb25ZIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icm90YXRpb25ZIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRTYXZlRW5hYmxlZCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg5OTU5LDYgKzIwMjg3Myw0NSBAQAogPHBhcmFtZXRlciBuYW1lPSJlbmFibGVkIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNhdmVGcm9tUGFyZW50RW5hYmxlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2NhbGVYIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2NhbGVYIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTY2FsZVkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzY2FsZVkiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFNjcm9sbEJhclN0eWxlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTAwNTIsNiArMjAzMDA1LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUb3AiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRvcCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFRvdWNoRGVsZWdhdGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MDA2NSw2ICsyMDMwMzEsMzIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZGVsZWdhdGUiIHR5cGU9ImFuZHJvaWQudmlldy5Ub3VjaERlbGVnYXRlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRyYW5zbGF0aW9uWCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zbGF0aW9uWCIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VHJhbnNsYXRpb25ZIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNsYXRpb25ZIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRWZXJ0aWNhbEZhZGluZ0VkZ2VFbmFibGVkIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTAxMzAsNiArMjAzMTIyLDMyIEBACiA8cGFyYW1ldGVyIG5hbWU9IndpbGxOb3REcmF3IiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ4IiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRZIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ieSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2hvd0NvbnRleHRNZW51IgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTAxNDEsNiArMjAzMTU5LDE5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aW9uTW9kZSIKKyByZXR1cm49ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUuQ2FsbGJhY2siPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3RhcnRBbmltYXRpb24iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MDUzNiwzOSArMjAzNTY3LDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgotPGZpZWxkIG5hbWU9Ik9WRVJTQ1JPTExfQUxXQVlTIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJPVkVSU0NST0xMX0lGX0NPTlRFTlRfU0NST0xMUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjEiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iT1ZFUlNDUk9MTF9ORVZFUiIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjIiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iUFJFU1NFRF9FTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VUIgogIHR5cGU9ImludFtdIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xOTA4ODQsNiArMjAzODgyLDUzIEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJWaWV3LkRyYWdUaHVtYm5haWxCdWlsZGVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlZpZXcuRHJhZ1RodW1ibmFpbEJ1aWxkZXIiCisgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXcuRHJhZ1RodW1ibmFpbEJ1aWxkZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9Im9uRHJhd1RodW1ibmFpbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbnZhcyIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5DYW52YXMiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Qcm92aWRlVGh1bWJuYWlsTWV0cmljcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRodW1ibmFpbFNpemUiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRodW1ibmFpbFRvdWNoUG9pbnQiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iVmlldy5NZWFzdXJlU3BlYyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MTA4Miw2ICsyMDQxMjcsNDMgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KKzxpbnRlcmZhY2UgbmFtZT0iVmlldy5PbkxheW91dENoYW5nZUxpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbkxheW91dENoYW5nZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idiIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImxlZnQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idG9wIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJpZ2h0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImJvdHRvbSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvbGRMZWZ0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9sZFRvcCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvbGRSaWdodCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvbGRCb3R0b20iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8aW50ZXJmYWNlIG5hbWU9IlZpZXcuT25Mb25nQ2xpY2tMaXN0ZW5lciIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9InRydWUiCkBAIC0xOTEzMzEsMjggKzIwNDQxMyw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFNjYWxlZE92ZXJmbGluZ0Rpc3RhbmNlIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFNjYWxlZE92ZXJzY3JvbGxEaXN0YW5jZSIKLSByZXR1cm49ImludCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRTY2FsZWRQYWdpbmdUb3VjaFNsb3AiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkyMTA3LDYgKzIwNTE2NywxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXIiIHR5cGU9ImFuZHJvaWQudXRpbC5TcGFyc2VBcnJheSZsdDthbmRyb2lkLm9zLlBhcmNlbGFibGUmZ3Q7Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRpc3BhdGNoU2V0QWN0aXZhdGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWN0aXZhdGVkIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImRpc3BhdGNoU2V0U2VsZWN0ZWQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MjE1MCw2ICsyMDUyMjMsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZHJhd2luZ1RpbWUiIHR5cGU9ImxvbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZW5kVmlld1RyYW5zaXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJmb2N1c1NlYXJjaCIKICByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MjM2MCw2ICsyMDU0NDYsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TGF5b3V0VHJhbnNpdGlvbiIKKyByZXR1cm49ImFuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0UGVyc2lzdGVudERyYXdpbmdDYWNoZSIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTI0NTgsNiArMjA1NTU1LDE3IEBACiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzTW90aW9uRXZlbnRTcGxpdHRpbmdFbmFibGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJtZWFzdXJlQ2hpbGQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MjkyMSw2ICsyMDYwMjksMzIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uTGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldExheW91dFRyYW5zaXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5MYXlvdXRUcmFuc2l0aW9uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE1vdGlvbkV2ZW50U3BsaXR0aW5nRW5hYmxlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNwbGl0IiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldE9uSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5Mjk3Myw2ICsyMDYxMDcsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWxWaWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydEFjdGlvbk1vZGVGb3JDaGlsZCIKKyByZXR1cm49ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbFZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUuQ2FsbGJhY2siPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3RhcnRMYXlvdXRBbmltYXRpb24iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5Mjk4NCw2ICsyMDYxMzMsMTkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRWaWV3VHJhbnNpdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InVwZGF0ZVZpZXdMYXlvdXQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MzY2Myw2ICsyMDY4MjUsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWxWaWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydEFjdGlvbk1vZGVGb3JDaGlsZCIKKyByZXR1cm49ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsVmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZS5DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iVmlld1N0dWIiCiAgZXh0ZW5kcz0iYW5kcm9pZC52aWV3LlZpZXciCkBAIC0xOTQzMzksNiArMjA3NTE2LDE5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc0ZlYXR1cmUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmZWF0dXJlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaGFzU29mdElucHV0TW9kZSIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk0MzUwLDYgKzIwNzU0MCwxOSBAQAogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbnZhbGlkYXRlUGFuZWxNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmZWF0dXJlSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc0FjdGl2ZSIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk0OTExLDYgKzIwODExNCwyNSBAQAogPHBhcmFtZXRlciBuYW1lPSJhcHBOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFdpbmRvd01hbmFnZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ3bSIgdHlwZT0iYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFwcFRva2VuIiB0eXBlPSJhbmRyb2lkLm9zLklCaW5kZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFwcE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImhhcmR3YXJlQWNjZWxlcmF0ZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3VwZXJEaXNwYXRjaEtleUV2ZW50IgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTE5NTAxNSw2ICsyMDgyMzcsMzkgQEAKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZFQVRVUkVfQUNUSU9OX0JBUiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkVBVFVSRV9BQ1RJT05fQkFSX09WRVJMQVkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZFQVRVUkVfQUNUSU9OX01PREVfT1ZFUkxBWSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkZFQVRVUkVfQ09OVEVYVF9NRU5VIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTk1Mzk2LDYgKzIwODY1MSwxOSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblN0YXJ0QWN0aW9uTW9kZSIKKyByZXR1cm49ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZS5DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvbldpbmRvd0F0dHJpYnV0ZXNDaGFuZ2VkIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTE5NTg4NSw2ICsyMDkxNTMsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMjE0NzQ4MzY0OCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJGTEFHX0lHTk9SRV9DSEVFS19QUkVTU0VTIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTk3NzcxLDYgKzIxMTA1MCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTY2FsZUZhY3RvciIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFN0YXJ0T2Zmc2V0IgogIHJldHVybj0ibG9uZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTc4MDgsNiArMjExMDk4LDIzIEBACiA8cGFyYW1ldGVyIG5hbWU9Im91dFRyYW5zZm9ybWF0aW9uIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRyYW5zZm9ybWF0aW9uIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY3VycmVudFRpbWUiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im91dFRyYW5zZm9ybWF0aW9uIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzY2FsZSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0WkFkanVzdG1lbnQiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjAxNzgxLDYgKzIxNTA4OCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJiaW5kaW5nIiB0eXBlPSJhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRCaW5kaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNoYW5nZUlucHV0TWV0aG9kU3VidHlwZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3VidHlwZSIgdHlwZT0iYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kU3VidHlwZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjcmVhdGVTZXNzaW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTIwMjEwNCw2ICsyMTU0MjQsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3VidHlwZXMiCisgcmV0dXJuPSJqYXZhLnV0aWwuQXJyYXlMaXN0Jmx0O2FuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZFN1YnR5cGUmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImxvYWRJY29uIgogIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDIzNzYsNiArMjE1NzA3LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3dJbnB1dE1ldGhvZFN1YnR5cGVQaWNrZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNob3dTb2Z0SW5wdXQiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwMjc5MCw2ICsyMTYxMzIsMTA4IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iSW5wdXRNZXRob2RTdWJ0eXBlIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxtZXRob2QgbmFtZT0iZGVzY3JpYmVDb250ZW50cyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRFeHRyYVZhbHVlIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJY29uUmVzSWQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TG9jYWxlIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRNb2RlUmVzSWQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TmFtZVJlc0lkIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9IndyaXRlVG9QYXJjZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkZXN0IiB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyY2VsYWJsZUZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJDUkVBVE9SIgorIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KIDwvcGFja2FnZT4KIDxwYWNrYWdlIG5hbWU9ImFuZHJvaWQud2Via2l0IgogPgpAQCAtMjA1MTcxLDYgKzIxODYxNSwxNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxtZXRob2QgbmFtZT0iZW5hYmxlU21vb3RoVHJhbnNpdGlvbiIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0QWxsb3dGaWxlQWNjZXNzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDU0NTMsNyArMjE4OTA4LDcgQEAKICBzeW5jaHJvbml6ZWQ9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KQEAgLTIwNTU0NSwxNyArMjE5MDAwLDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0VXNlV2ViVmlld0JhY2tncm91bmRGb3JPdmVyc2Nyb2xsQmFja2dyb3VuZCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0VXNlV2lkZVZpZXdQb3J0IgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDU3OTcsNiArMjE5MjQxLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZsYWciIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RW5hYmxlU21vb3RoVHJhbnNpdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRGYW50YXN5Rm9udEZhbWlseSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA1OTk5LDcgKzIxOTQ1Niw3IEBACiAgc3luY2hyb25pemVkPSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJmbGFnIiB0eXBlPSJib29sZWFuIj4KQEAgLTIwNjE0OCwxOSArMjE5NjA1LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idXNlIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldFVzZVdlYlZpZXdCYWNrZ3JvdW5kRm9yT3ZlcnNjcm9sbEJhY2tncm91bmQiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJib29sZWFuIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFVzZVdpZGVWaWV3UG9ydCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA2NzQyLDYgKzIyMDE4NiwyMiBAQAogPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJXZWJWaWV3IgorIHR5cGU9ImFuZHJvaWQud2Via2l0LldlYlZpZXciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByaXZhdGVCcm93c2luZyIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImFkZEphdmFzY3JpcHRJbnRlcmZhY2UiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNjc5Miw2ICsyMjAyNTIsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2FuWm9vbUluIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjYW5ab29tT3V0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjYXB0dXJlUGljdHVyZSIKICByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDcxNTEsNiArMjIwNjMzLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZpc2libGVUaXRsZUhlaWdodCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRab29tQ29udHJvbHMiCiAgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDcyMDgsNiArMjIwNzAxLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibG9hZERhdGEiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNzUyNyw2ICsyMjEwMzEsMzYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib3V0U3RhdGUiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNhdmVXZWJBcmNoaXZlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZmlsZW5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2F2ZVdlYkFyY2hpdmUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJiYXNlbmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXV0b25hbWUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLndlYmtpdC5WYWx1ZUNhbGxiYWNrJmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldENlcnRpZmljYXRlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDc2NzYsNiArMjIxMjEwLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNsaWVudCIgdHlwZT0iYW5kcm9pZC53ZWJraXQuV2ViVmlld0NsaWVudCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93RmluZERpYWxvZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3RvcExvYWRpbmciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwODEyNCw3ICsyMjE2NzEsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQud2Via2l0LldlYlZpZXciPgpAQCAtMjA4NTMxLDYgKzIyMjA3OCwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJhZnRlciIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNsZWFyQ2hvaWNlcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2xlYXJUZXh0RmlsdGVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDg1NTMsNiArMjIyMTExLDYxIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENoZWNrZWRJdGVtQ291bnQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q2hlY2tlZEl0ZW1JZHMiCisgcmV0dXJuPSJsb25nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbiIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDaGVja2VkSXRlbVBvc2l0aW9ucyIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXkiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q2hvaWNlTW9kZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRMaXN0UGFkZGluZ0JvdHRvbSIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDg2OTYsNiArMjIyMzA5LDE5IEBACiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzSXRlbUNoZWNrZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzU2Nyb2xsaW5nQ2FjaGVFbmFibGVkIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDg3NzUsNiArMjIyNDAxLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25SZW1vdGVBZGFwdGVyRGlzY29ubmVjdGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvblJlc3RvcmVJbnN0YW5jZVN0YXRlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDg4NzQsNiArMjIyNTIyLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9InZpZXdzIiB0eXBlPSJqYXZhLnV0aWwuTGlzdCZsdDthbmRyb2lkLnZpZXcuVmlldyZndDsiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QWRhcHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkYXB0ZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldENhY2hlQ29sb3JIaW50IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDg4ODcsNiArMjIyNTQ4LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbG9yIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q2hvaWNlTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNob2ljZU1vZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXREcmF3U2VsZWN0b3JPblRvcCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA4OTI2LDYgKzIyMjYwMCwzNCBAQAogPHBhcmFtZXRlciBuYW1lPSJmaWx0ZXJUZXh0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEl0ZW1DaGVja2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcuTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0T25TY3JvbGxMaXN0ZW5lciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA4OTUyLDYgKzIyMjY1NCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcuUmVjeWNsZXJMaXN0ZW5lciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSZW1vdGVWaWV3c0FkYXB0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0U2Nyb2xsSW5kaWNhdG9ycyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA5MTAxLDYgKzIyMjgxNiwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJib3VuZFBvc2l0aW9uIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic21vb3RoU2Nyb2xsVG9Qb3NpdGlvbkZyb21Ub3AiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ2ZXJpZnlEcmF3YWJsZSIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA5MTE0LDYgKzIyMjg0NCw1MCBAQAogPHBhcmFtZXRlciBuYW1lPSJkciIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX01VTFRJUExFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfTk9ORSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfU0lOR0xFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJUUkFOU0NSSVBUX01PREVfQUxXQVlTX1NDUk9MTCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIwOTIwNSw2ICsyMjI5NzksMzUgQEAKIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KIDwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkFic0xpc3RWaWV3Lk11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUuQ2FsbGJhY2siPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJvbkl0ZW1DaGVja2VkU3RhdGVDaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNoZWNrZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGludGVyZmFjZSBuYW1lPSJBYnNMaXN0Vmlldy5PblNjcm9sbExpc3RlbmVyIgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0idHJ1ZSIKQEAgLTIxMDM4MSw2ICsyMjQxODQsNTgyIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iQWRhcHRlclZpZXdBbmltYXRvciIKKyBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWRhcHRlclZpZXdBbmltYXRvciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlld0FuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFkYXB0ZXJWaWV3QW5pbWF0b3IiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXdBbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldEFkYXB0ZXIiCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEN1cnJlbnRWaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RGlzcGxheWVkQ2hpbGQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SW5BbmltYXRpb24iCisgcmV0dXJuPSJhbmRyb2lkLmFuaW1hdGlvbi5PYmplY3RBbmltYXRvciZsdDs/Jmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRPdXRBbmltYXRpb24iCisgcmV0dXJuPSJhbmRyb2lkLmFuaW1hdGlvbi5PYmplY3RBbmltYXRvciZsdDs/Jmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3RlZFZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblJlbW90ZUFkYXB0ZXJDb25uZWN0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUmVtb3RlQWRhcHRlckRpc2Nvbm5lY3RlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25SZXN0b3JlSW5zdGFuY2VTdGF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXRlIiB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbGFibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25TYXZlSW5zdGFuY2VTdGF0ZSIKKyByZXR1cm49ImFuZHJvaWQub3MuUGFyY2VsYWJsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBZGFwdGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBbmltYXRlRmlyc3RWaWV3IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREaXNwbGF5ZWRDaGlsZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndoaWNoQ2hpbGQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJbkFuaW1hdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluQW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5PYmplY3RBbmltYXRvciZsdDs/Jmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJbkFuaW1hdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZXNvdXJjZUlEIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T3V0QW5pbWF0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3V0QW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5PYmplY3RBbmltYXRvciZsdDs/Jmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRPdXRBbmltYXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzb3VyY2VJRCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJlbW90ZVZpZXdzQWRhcHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZWxlY3Rpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3dOZXh0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93UHJldmlvdXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFkYXB0ZXJWaWV3RmxpcHBlciIKKyBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlld0FuaW1hdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWRhcHRlclZpZXdGbGlwcGVyIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3RmxpcHBlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBZGFwdGVyVmlld0ZsaXBwZXIiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXdGbGlwcGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iaXNBdXRvU3RhcnQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzRmxpcHBpbmciCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEF1dG9TdGFydCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImF1dG9TdGFydCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRGbGlwSW50ZXJ2YWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtaWxsaXNlY29uZHMiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydEZsaXBwaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdG9wRmxpcHBpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFkYXB0ZXJzIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBZGFwdGVycyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVycyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJsb2FkQWRhcHRlciIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0LkJhc2VBZGFwdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Li4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImxvYWRDdXJzb3JBZGFwdGVyIgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Li4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImxvYWRDdXJzb3JBZGFwdGVyIgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY3Vyc29yIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdC4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBZGFwdGVycy5DdXJzb3JCaW5kZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBZGFwdGVycy5DdXJzb3JCaW5kZXIiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yQmluZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zZm9ybWF0aW9uIiB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImJpbmQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3IiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0ibUNvbnRleHQiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Im1UcmFuc2Zvcm1hdGlvbiIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbiIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb24iCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9InRyYW5zZm9ybSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY3Vyc29yIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0cmFuc2Zvcm1Ub1Jlc291cmNlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3IiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0ibUNvbnRleHQiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJBbHBoYWJldEluZGV4ZXIiCiAgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjEyMzY4LDYgKzIyNjc0NywyMCBAQAogPHBhcmFtZXRlciBuYW1lPSJhdXRvUmVxdWVyeSIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ3Vyc29yQWRhcHRlciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iYmluZFZpZXciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjEyNTE1LDYgKzIyNjkwOCwyMyBAQAogPHBhcmFtZXRlciBuYW1lPSJhdXRvUmVxdWVyeSIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbml0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im5ld0Ryb3BEb3duVmlldyIKICByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxMjU4Niw2ICsyMjY5OTYsMjggQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmlsdGVyUXVlcnlQcm92aWRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuRmlsdGVyUXVlcnlQcm92aWRlciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkZMQUdfQVVUT19SRVFVRVJZIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJDdXJzb3JUcmVlQWRhcHRlciIKICBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyIgpAQCAtMjE1MDI1LDcgKzIyOTQ1Nyw3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFN0cmV0Y2hNb2RlIgorPG1ldGhvZCBuYW1lPSJnZXROdW1Db2x1bW5zIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgpAQCAtMjE1MDM2LDggKzIyOTQ2OCw4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldEFkYXB0ZXIiCi0gcmV0dXJuPSJ2b2lkIgorPG1ldGhvZCBuYW1lPSJnZXRTdHJldGNoTW9kZSIKKyByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCiAgbmF0aXZlPSJmYWxzZSIKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgpAQCAtMjE1MDQ2LDggKzIyOTQ3OCw2IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciI+Ci08L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRDb2x1bW5XaWR0aCIKICByZXR1cm49InZvaWQiCkBAIC0yMTUxNDAsNiArMjI5NTcwLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9InZlcnRpY2FsU3BhY2luZyIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNtb290aFNjcm9sbEJ5T2Zmc2V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxmaWVsZCBuYW1lPSJBVVRPX0ZJVCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIxNjIxMSw2ICsyMzA2NTQsMjAgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkxpbmVhckxheW91dCIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJnZXRCYXNlbGluZUFsaWduZWRDaGlsZEluZGV4IgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNjI1NSw2ICsyMzA3MTIsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNNZWFzdXJlV2l0aExhcmdlc3RDaGlsZEVuYWJsZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uTGF5b3V0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTYzMjgsNiArMjMwNzk2LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9Imhvcml6b250YWxHcmF2aXR5IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGRFbmFibGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRPcmllbnRhdGlvbiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE2NTI0LDYgKzIzMTAwNSw2OTEgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJMaXN0UG9wdXBXaW5kb3ciCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9Ikxpc3RQb3B1cFdpbmRvdyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0UG9wdXBXaW5kb3ciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iTGlzdFBvcHVwV2luZG93IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iTGlzdFBvcHVwV2luZG93IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGVBdHRyIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9Ikxpc3RQb3B1cFdpbmRvdyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0UG9wdXBXaW5kb3ciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlQXR0ciIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZVJlcyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iY2xlYXJMaXN0U2VsZWN0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkaXNtaXNzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBbmNob3JWaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QW5pbWF0aW9uU3R5bGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QmFja2dyb3VuZCIKKyByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SGVpZ2h0IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEhvcml6b250YWxPZmZzZXQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SW5wdXRNZXRob2RNb2RlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExpc3RWaWV3IgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuTGlzdFZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UHJvbXB0UG9zaXRpb24iCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWRJdGVtIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3RlZEl0ZW1JZCIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24iCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWRWaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U29mdElucHV0TW9kZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWZXJ0aWNhbE9mZnNldCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRXaWR0aCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0lucHV0TWV0aG9kTm90TmVlZGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc01vZGFsIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1Nob3dpbmciCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uS2V5RG93biIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleUNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXZlbnQiIHR5cGU9ImFuZHJvaWQudmlldy5LZXlFdmVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbktleVByZUltZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleUNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXZlbnQiIHR5cGU9ImFuZHJvaWQudmlldy5LZXlFdmVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbktleVVwIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5Q29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJldmVudCIgdHlwZT0iYW5kcm9pZC52aWV3LktleUV2ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBlcmZvcm1JdGVtQ2xpY2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvc3RTaG93IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBZGFwdGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QW5jaG9yVmlldyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuY2hvciIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QW5pbWF0aW9uU3R5bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb25TdHlsZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEJhY2tncm91bmREcmF3YWJsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImQiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q29udGVudFdpZHRoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0id2lkdGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRIZWlnaHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJoZWlnaHQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRIb3Jpem9udGFsT2Zmc2V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW5wdXRNZXRob2RNb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldExpc3RTZWxlY3RvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdG9yIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE1vZGFsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kYWwiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T25EaXNtaXNzTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3cuT25EaXNtaXNzTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T25JdGVtQ2xpY2tMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNsaWNrTGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGVkTGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UHJvbXB0UG9zaXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFByb21wdFZpZXciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcm9tcHQiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNlbGVjdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U29mdElucHV0TW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRWZXJ0aWNhbE9mZnNldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFdpZHRoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0id2lkdGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IklOUFVUX01FVEhPRF9GUk9NX0ZPQ1VTQUJMRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iSU5QVVRfTUVUSE9EX05FRURFRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iSU5QVVRfTUVUSE9EX05PVF9ORUVERUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik1BVENIX1BBUkVOVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0xIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBPU0lUSU9OX1BST01QVF9BQk9WRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUE9TSVRJT05fUFJPTVBUX0JFTE9XIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJXUkFQX0NPTlRFTlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTGlzdFZpZXciCiAgZXh0ZW5kcz0iYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE2NjI4LDE3ICsyMzE3OTQsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ2IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJjbGVhckNob2ljZXMiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImZpbmRWaWV3VHJhdmVyc2FsIgogIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE2NjgzLDUxICsyMzE4MzgsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldENoZWNrZWRJdGVtSWRzIgotIHJldHVybj0ibG9uZ1tdIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldENoZWNrZWRJdGVtUG9zaXRpb24iCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbnMiCi0gcmV0dXJuPSJhbmRyb2lkLnV0aWwuU3BhcnNlQm9vbGVhbkFycmF5IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldENob2ljZU1vZGUiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgpAQCAtMjE2Nzk3LDQxICsyMzE5MDgsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRPdmVyc2Nyb2xsRm9vdGVyIgotIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRPdmVyc2Nyb2xsSGVhZGVyIgotIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJpc0l0ZW1DaGVja2VkIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJyZW1vdmVGb290ZXJWaWV3IgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTY4NTgsMzIgKzIzMTkzNCw2IEBACiA8cGFyYW1ldGVyIG5hbWU9InYiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldEFkYXB0ZXIiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRDaG9pY2VNb2RlIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY2hvaWNlTW9kZSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldERpdmlkZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNjkzNiwyMSArMjMxOTg2LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iaGVhZGVyRGl2aWRlcnNFbmFibGVkIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldEl0ZW1DaGVja2VkIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImJvb2xlYW4iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0SXRlbXNDYW5Gb2N1cyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE2OTY0LDMyICsyMzE5OTksNiBAQAogPHBhcmFtZXRlciBuYW1lPSJpdGVtc0NhbkZvY3VzIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldE92ZXJzY3JvbGxGb290ZXIiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJmb290ZXIiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0T3ZlcnNjcm9sbEhlYWRlciIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImhlYWRlciIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRTZWxlY3Rpb24iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNzAyOSwzOSArMjMyMDM4LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9InkiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX01VTFRJUExFIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCis8bWV0aG9kIG5hbWU9InNtb290aFNjcm9sbEJ5T2Zmc2V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfTk9ORSIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjAiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfU0lOR0xFIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KKzxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTGlzdFZpZXcuRml4ZWRWaWV3SW5mbyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgpAQCAtMjE3NTYxLDcgKzIzMjU1MCw3IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9pbnRlcmZhY2U+Ci08Y2xhc3MgbmFtZT0iT3ZlclNjcm9sbGVyIgorPGNsYXNzIG5hbWU9IlBvcHVwTWVudSIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMjE3NTY5LDggKzIzMjU1OCw4IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPGNvbnN0cnVjdG9yIG5hbWU9Ik92ZXJTY3JvbGxlciIKLSB0eXBlPSJhbmRyb2lkLndpZGdldC5PdmVyU2Nyb2xsZXIiCis8Y29uc3RydWN0b3IgbmFtZT0iUG9wdXBNZW51IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlBvcHVwTWVudSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKQEAgLTIxNzU3OCwzNiArMjMyNTY3LDEwIEBACiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KIDwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KLTxjb25zdHJ1Y3RvciBuYW1lPSJPdmVyU2Nyb2xsZXIiCi0gdHlwZT0iYW5kcm9pZC53aWRnZXQuT3ZlclNjcm9sbGVyIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImludGVycG9sYXRvciIgdHlwZT0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IiPgorPHBhcmFtZXRlciBuYW1lPSJhbmNob3IiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KLTxjb25zdHJ1Y3RvciBuYW1lPSJPdmVyU2Nyb2xsZXIiCi0gdHlwZT0iYW5kcm9pZC53aWRnZXQuT3ZlclNjcm9sbGVyIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImludGVycG9sYXRvciIgdHlwZT0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImJvdW5jZUNvZWZmaWNpZW50WCIgdHlwZT0iZmxvYXQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImJvdW5jZUNvZWZmaWNpZW50WSIgdHlwZT0iZmxvYXQiPgotPC9wYXJhbWV0ZXI+Ci08L2NvbnN0cnVjdG9yPgotPG1ldGhvZCBuYW1lPSJhYm9ydEFuaW1hdGlvbiIKKzxtZXRob2QgbmFtZT0iZGlzbWlzcyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCkBAIC0yMTc2MTgsOCArMjMyNTgxLDggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iY29tcHV0ZVNjcm9sbE9mZnNldCIKLSByZXR1cm49ImJvb2xlYW4iCis8bWV0aG9kIG5hbWU9ImdldE1lbnUiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuTWVudSIKICBhYnN0cmFjdD0iZmFsc2UiCiAgbmF0aXZlPSJmYWxzZSIKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgpAQCAtMjE3NjI5LDcgKzIzMjU5MiwxOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJmbGluZyIKKzxtZXRob2QgbmFtZT0iZ2V0TWVudUluZmxhdGVyIgorIHJldHVybj0iYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCkBAIC0yMTc2MzksMjQgKzIzMjYxMywxMCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0WSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2ZWxvY2l0eVgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmVsb2NpdHlZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im1pblgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWF4WCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtaW5ZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im1heFkiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5Qb3B1cE1lbnUuT25NZW51SXRlbUNsaWNrTGlzdGVuZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZmxpbmciCis8bWV0aG9kIG5hbWU9InNob3ciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgpAQCAtMjE3NjY2LDIyNiArMjMyNjI2LDI5IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJzdGFydFgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZlbG9jaXR5WCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2ZWxvY2l0eVkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWluWCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtYXhYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im1pblkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWF4WSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJvdmVyWCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJvdmVyWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImZvcmNlRmluaXNoZWQiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImZpbmlzaGVkIiB0eXBlPSJib29sZWFuIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldEN1cnJYIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0Q3VyclkiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRGaW5hbFgiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRGaW5hbFkiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRTdGFydFgiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRTdGFydFkiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJpc0ZpbmlzaGVkIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImlzT3ZlcnNjcm9sbGVkIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJub3RpZnlIb3Jpem9udGFsRWRnZVJlYWNoZWQiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJzdGFydFgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZmluYWxYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im92ZXJYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ibm90aWZ5VmVydGljYWxFZGdlUmVhY2hlZCIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0WSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJmaW5hbFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib3ZlclkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzcHJpbmdiYWNrIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0WSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtaW5YIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im1heFgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWluWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtYXhZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3RhcnRTY3JvbGwiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJzdGFydFgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImR4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImR5IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3RhcnRTY3JvbGwiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJzdGFydFgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImR4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImR5IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IlBvcHVwTWVudS5Pbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25NZW51SXRlbUNsaWNrIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtIiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudUl0ZW0iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IlBvcHVwV2luZG93IgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE3OTM3LDYgKzIzMjcwMCwyMiBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZUF0dHIiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGVSZXMiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iUG9wdXBXaW5kb3ciCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3ciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgogPC9jb25zdHJ1Y3Rvcj4KIDxjb25zdHJ1Y3RvciBuYW1lPSJQb3B1cFdpbmRvdyIKICB0eXBlPSJhbmRyb2lkLndpZGdldC5Qb3B1cFdpbmRvdyIKQEAgLTIxODk2Niw2ICsyMzM3NDUsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZXhjbHVkZU1pbWVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW1hZ2VUb0RlZmF1bHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldE1vZGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIyMDEwMiw2ICsyMzQ4OTIsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImRvdWJsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFbXB0eVZpZXciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW1wdHlWaWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRGbG9hdCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjIwMTgxLDYgKzIzNDk4NiwyMyBAQAogPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEludGVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtZXRob2ROYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRMb25nIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMjAxOTgsNiArMjM1MDIwLDM2IEBACiA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJsb25nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE9uQ2xpY2tFeHRyYXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXh0cmFzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRPbkNsaWNrRmlsbEluSW50ZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZpbGxJbkludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRPbkNsaWNrUGVuZGluZ0ludGVudCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjIwMjEzLDYgKzIzNTA2NSwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJwZW5kaW5nSW50ZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBlbmRpbmdJbnRlbnRUZW1wbGF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwZW5kaW5nSW50ZW50VGVtcGxhdGUiIHR5cGU9ImFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0UHJvZ3Jlc3NCYXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIyMDIzMiw2ICsyMzUwOTksNTEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iaW5kZXRlcm1pbmF0ZSIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSZWxhdGl2ZVNjcm9sbFBvc2l0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJlbW90ZUFkYXB0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNjcm9sbFBvc2l0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0U2hvcnQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIyMDMyOCw2ICsyMzUyNDAsMzIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmlzaWJpbGl0eSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3dOZXh0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvd1ByZXZpb3VzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0id3JpdGVUb1BhcmNlbCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjIwMzk0LDYgKzIzNTMzMiwxNjAgQEAKIDxpbXBsZW1lbnRzIG5hbWU9ImphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24iPgogPC9pbXBsZW1lbnRzPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJSZW1vdGVWaWV3c1NlcnZpY2UiCisgZXh0ZW5kcz0iYW5kcm9pZC5hcHAuU2VydmljZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iUmVtb3RlVmlld3NTZXJ2aWNlIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzU2VydmljZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJvbkJpbmQiCisgcmV0dXJuPSJhbmRyb2lkLm9zLklCaW5kZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkdldFZpZXdGYWN0b3J5IgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3NTZXJ2aWNlLlJlbW90ZVZpZXdzRmFjdG9yeSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IlJlbW90ZVZpZXdzU2VydmljZS5SZW1vdGVWaWV3c0ZhY3RvcnkiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImdldENvdW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SXRlbUlkIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExvYWRpbmdWaWV3IgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWaWV3QXQiCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZpZXdUeXBlQ291bnQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNTdGFibGVJZHMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EYXRhU2V0Q2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkRlc3Ryb3kiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IlJlc291cmNlQ3Vyc29yQWRhcHRlciIKICBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjIwNDMyLDYgKzIzNTUyNCwyMiBAQAogPHBhcmFtZXRlciBuYW1lPSJhdXRvUmVxdWVyeSIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iUmVzb3VyY2VDdXJzb3JBZGFwdGVyIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlJlc291cmNlQ3Vyc29yQWRhcHRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsYXlvdXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYyIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJuZXdWaWV3IgogIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjIxMDYwLDYgKzIzNjE2OCwyNzcgQEAKID4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTZWFyY2hWaWV3IgorIGV4dGVuZHM9ImFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNlYXJjaFZpZXciCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuU2VhcmNoVmlldyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTZWFyY2hWaWV3IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlNlYXJjaFZpZXciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRTdWdnZXN0aW9uc0FkYXB0ZXIiCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzSWNvbmZpZWRCeURlZmF1bHQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzSWNvbmlmaWVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1F1ZXJ5UmVmaW5lbWVudEVuYWJsZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzU3VibWl0QnV0dG9uRW5hYmxlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SWNvbmlmaWVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWNvbmlmeSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJY29uaWZpZWRCeURlZmF1bHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpY29uaWZpZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T25DbG9zZUxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlNlYXJjaFZpZXcuT25DbG9zZUxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE9uUXVlcnlDaGFuZ2VMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5TZWFyY2hWaWV3Lk9uUXVlcnlDaGFuZ2VMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRRdWVyeSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InF1ZXJ5IiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdWJtaXQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UXVlcnlIaW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaGludCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRRdWVyeVJlZmluZW1lbnRFbmFibGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNlYXJjaGFibGVJbmZvIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VhcmNoYWJsZSIgdHlwZT0iYW5kcm9pZC5hcHAuU2VhcmNoYWJsZUluZm8iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3VibWl0QnV0dG9uRW5hYmxlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3VnZ2VzdGlvbnNBZGFwdGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iU2VhcmNoVmlldy5PbkNsb3NlTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uQ2xvc2UiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJTZWFyY2hWaWV3Lk9uUXVlcnlDaGFuZ2VMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25RdWVyeVRleHRDaGFuZ2VkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuZXdUZXh0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uU3VibWl0UXVlcnkiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InF1ZXJ5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iU2VjdGlvbkluZGV4ZXIiCiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTIyMjQ0Myw2ICsyMzc4MjIsMTggQEAKID4KIDxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgogPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU3Bpbm5lciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5TcGlubmVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KQEAgLTIyMjQ2MCw2ICsyMzc4NTEsMjIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGUiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU3Bpbm5lciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5TcGlubmVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJnZXRQcm9tcHQiCiAgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIyMjUxMiw2ICsyMzc5MTksMjggQEAKIDxwYXJhbWV0ZXIgbmFtZT0icHJvbXB0SWQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9Ik1PREVfRElBTE9HIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJNT0RFX0RST1BET1dOIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvY2xhc3M+CiA8aW50ZXJmYWNlIG5hbWU9IlNwaW5uZXJBZGFwdGVyIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjIyNTQwLDYgKzIzNzk2OSwzNyBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IlN0YWNrVmlldyIKKyBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlld0FuaW1hdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU3RhY2tWaWV3IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlN0YWNrVmlldyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTdGFja1ZpZXciCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuU3RhY2tWaWV3IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iVGFiSG9zdCIKICBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMzQxNzgsNyArMjQ5NjM4LDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9ImZpbGVOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzxwYXJhbWV0ZXIgbmFtZT0icGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDxleGNlcHRpb24gbmFtZT0iRmlsZU5vdEZvdW5kRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KQEAgLTIzNDMwMSw3ICsyNDk3NjEsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0iZmlsZW5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPHBhcmFtZXRlciBuYW1lPSJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPGV4Y2VwdGlvbiBuYW1lPSJGaWxlTm90Rm91bmRFeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgpAQCAtMjM0MzEzLDcgKzI0OTc3Myw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJmaWxlbmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8cGFyYW1ldGVyIG5hbWU9InBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9ImFwcGVuZCIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KQEAgLTIzNDk4NCw3ICsyNTA0NDQsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0iYiIgdHlwZT0iYnl0ZVtdIj4KKzxwYXJhbWV0ZXIgbmFtZT0iYnVmZmVyIiB0eXBlPSJieXRlW10iPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgpAQCAtMjcwMDYxLDkgKzI4NTUyMSw5IEBACiA+CiA8cGFyYW1ldGVyIG5hbWU9ImRzdCIgdHlwZT0iYnl0ZVtdIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJvZmYiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImRzdE9mZnNldCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJsZW4iIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImJ5dGVDb3VudCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldCIKQEAgLTI3MDMwNyw5ICsyODU3NjcsOSBAQAogPgogPHBhcmFtZXRlciBuYW1lPSJzcmMiIHR5cGU9ImJ5dGVbXSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2ZmIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJzcmNPZmZzZXQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJieXRlQ291bnQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJwdXQiCkBAIC0yNzA1NDYsNyArMjg2MDA2LDcgQEAKIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJzdGFydCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJsZW4iIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImJ5dGVDb3VudCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgpAQCAtMjcwNzc5LDkgKzI4NjIzOSw5IEBACiA+CiA8cGFyYW1ldGVyIG5hbWU9ImRzdCIgdHlwZT0iY2hhcltdIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJvZmYiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImRzdE9mZnNldCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJsZW4iIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImNoYXJDb3VudCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldCIKQEAgLTI3MDg3OSw5ICsyODYzMzksOSBAQAogPgogPHBhcmFtZXRlciBuYW1lPSJzcmMiIHR5cGU9ImNoYXJbXSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2ZmIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJzcmNPZmZzZXQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJjaGFyQ291bnQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJwdXQiCkBAIC0yNzEwMTAsNyArMjg2NDcwLDcgQEAKIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJzdGFydCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJsZW4iIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImNoYXJDb3VudCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9IndyYXAiCkBAIC0yNzExNzEsOSArMjg2NjMxLDkgQEAKID4KIDxwYXJhbWV0ZXIgbmFtZT0iZHN0IiB0eXBlPSJkb3VibGVbXSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2ZmIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJkc3RPZmZzZXQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJkb3VibGVDb3VudCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldCIKQEAgLTI3MTI2MCw5ICsyODY3MjAsOSBAQAogPgogPHBhcmFtZXRlciBuYW1lPSJzcmMiIHR5cGU9ImRvdWJsZVtdIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJvZmYiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9InNyY09mZnNldCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJsZW4iIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImRvdWJsZUNvdW50IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icHV0IgpAQCAtMjcxMzMxLDcgKzI4Njc5MSw3IEBACiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0ic3RhcnQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJkb3VibGVDb3VudCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgpAQCAtMjcxNDYyLDkgKzI4NjkyMiw5IEBACiA+CiA8cGFyYW1ldGVyIG5hbWU9ImRzdCIgdHlwZT0iZmxvYXRbXSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2ZmIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJkc3RPZmZzZXQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJmbG9hdENvdW50IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0IgpAQCAtMjcxNTUxLDkgKzI4NzAxMSw5IEBACiA+CiA8cGFyYW1ldGVyIG5hbWU9InNyYyIgdHlwZT0iZmxvYXRbXSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2ZmIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJzcmNPZmZzZXQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJmbG9hdENvdW50IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icHV0IgpAQCAtMjcxNjIyLDcgKzI4NzA4Miw3IEBACiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0ic3RhcnQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJmbG9hdENvdW50IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+CkBAIC0yNzE3NTMsOSArMjg3MjEzLDkgQEAKID4KIDxwYXJhbWV0ZXIgbmFtZT0iZHN0IiB0eXBlPSJpbnRbXSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2ZmIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJkc3RPZmZzZXQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJpbnRDb3VudCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldCIKQEAgLTI3MTg0Miw5ICsyODczMDIsOSBAQAogPgogPHBhcmFtZXRlciBuYW1lPSJzcmMiIHR5cGU9ImludFtdIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJvZmYiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9InNyY09mZnNldCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJsZW4iIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImludENvdW50IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icHV0IgpAQCAtMjcxOTEzLDcgKzI4NzM3Myw3IEBACiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0ic3RhcnQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJpbnRDb3VudCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgpAQCAtMjcyMDYxLDkgKzI4NzUyMSw5IEBACiA+CiA8cGFyYW1ldGVyIG5hbWU9ImRzdCIgdHlwZT0ibG9uZ1tdIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJvZmYiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImRzdE9mZnNldCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJsZW4iIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImxvbmdDb3VudCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldCIKQEAgLTI3MjE1MCw5ICsyODc2MTAsOSBAQAogPgogPHBhcmFtZXRlciBuYW1lPSJzcmMiIHR5cGU9ImxvbmdbXSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2ZmIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJzcmNPZmZzZXQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJsb25nQ291bnQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJwdXQiCkBAIC0yNzIyMjEsNyArMjg3NjgxLDcgQEAKIDwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJzdGFydCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJsZW4iIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9ImxvbmdDb3VudCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgpAQCAtMjcyNDExLDkgKzI4Nzg3MSw5IEBACiA+CiA8cGFyYW1ldGVyIG5hbWU9ImRzdCIgdHlwZT0ic2hvcnRbXSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2ZmIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJkc3RPZmZzZXQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJzaG9ydENvdW50IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0IgpAQCAtMjcyNTAwLDkgKzI4Nzk2MCw5IEBACiA+CiA8cGFyYW1ldGVyIG5hbWU9InNyYyIgdHlwZT0ic2hvcnRbXSI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib2ZmIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJzcmNPZmZzZXQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJzaG9ydENvdW50IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icHV0IgpAQCAtMjcyNTcxLDcgKzI4ODAzMSw3IEBACiA8L3BhcmFtZXRlcj4KIDxwYXJhbWV0ZXIgbmFtZT0ic3RhcnQiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibGVuIiB0eXBlPSJpbnQiPgorPHBhcmFtZXRlciBuYW1lPSJzaG9ydENvdW50IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+CkBAIC00MTQzODgsNyArNDI5ODQ4LDcgQEAKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxtZXRob2QgbmFtZT0iZ2V0TGVuZ3RoIgpAQCAtNDE0ODc3LDcgKzQzMDMzNyw3IEBACiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8bWV0aG9kIG5hbWU9ImNoYXJhY3RlcnMiCkBAIC00MTUwOTIsNyArNDMwNTUyLDcgQEAKICBhYnN0cmFjdD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8aW1wbGVtZW50cyBuYW1lPSJvcmcueG1sLnNheC5EVERIYW5kbGVyIj4KQEAgLTQxNTU1OSw3ICs0MzEwMTksNyBAQAogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPG1ldGhvZCBuYW1lPSJwYXJzZSIKQEAgLTQxNjk5MSw3ICs0MzI0NTEsNyBAQAogIGFic3RyYWN0PSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxpbXBsZW1lbnRzIG5hbWU9Im9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3QiPgpAQCAtNDE4NDgwLDcgKzQzMzk0MCw3IEBACiAgYWJzdHJhY3Q9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPG1ldGhvZCBuYW1lPSJtYWtlUGFyc2VyIgpkaWZmIC0tZ2l0IGEvY21kcy9hbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvYW0vQW0uamF2YSBiL2NtZHMvYW0vc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL2FtL0FtLmphdmEKaW5kZXggZjJhYTkxZi4uYjA3MzAwNCAxMDA2NDQKLS0tIGEvY21kcy9hbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvYW0vQW0uamF2YQorKysgYi9jbWRzL2FtL3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9hbS9BbS5qYXZhCkBAIC0xMDIsNiArMTAyLDggQEAKICAgICAgICAgICAgIHNlbmRCcm9hZGNhc3QoKTsKICAgICAgICAgfSBlbHNlIGlmIChvcC5lcXVhbHMoInByb2ZpbGUiKSkgewogICAgICAgICAgICAgcnVuUHJvZmlsZSgpOworICAgICAgICB9IGVsc2UgaWYgKG9wLmVxdWFscygiZHVtcGhlYXAiKSkgeworICAgICAgICAgICAgcnVuRHVtcEhlYXAoKTsKICAgICAgICAgfSBlbHNlIGlmIChvcC5lcXVhbHMoIm1vbml0b3IiKSkgewogICAgICAgICAgICAgcnVuTW9uaXRvcigpOwogICAgICAgICB9IGVsc2UgewpAQCAtMTQ2LDYgKzE0OCwzMSBAQAogICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG5leHRBcmdSZXF1aXJlZCgpOwogICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShrZXksIEludGVnZXIudmFsdWVPZih2YWx1ZSkpOwogICAgICAgICAgICAgICAgIGhhc0ludGVudEluZm8gPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChvcHQuZXF1YWxzKCItLWVpYSIpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IG5leHRBcmdSZXF1aXJlZCgpOworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG5leHRBcmdSZXF1aXJlZCgpOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHN0cmluZ3MgPSB2YWx1ZS5zcGxpdCgiLCIpOworICAgICAgICAgICAgICAgIGludFtdIGxpc3QgPSBuZXcgaW50W3N0cmluZ3MubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdFtpXSA9IEludGVnZXIudmFsdWVPZihzdHJpbmdzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKGtleSwgbGlzdCk7CisgICAgICAgICAgICAgICAgaGFzSW50ZW50SW5mbyA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdC5lcXVhbHMoIi0tZWwiKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBuZXh0QXJnUmVxdWlyZWQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBuZXh0QXJnUmVxdWlyZWQoKTsKKyAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoa2V5LCBMb25nLnZhbHVlT2YodmFsdWUpKTsKKyAgICAgICAgICAgICAgICBoYXNJbnRlbnRJbmZvID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0LmVxdWFscygiLS1lbGEiKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBuZXh0QXJnUmVxdWlyZWQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBuZXh0QXJnUmVxdWlyZWQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBzdHJpbmdzID0gdmFsdWUuc3BsaXQoIiwiKTsKKyAgICAgICAgICAgICAgICBsb25nW10gbGlzdCA9IG5ldyBsb25nW3N0cmluZ3MubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdFtpXSA9IExvbmcudmFsdWVPZihzdHJpbmdzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKGtleSwgbGlzdCk7CisgICAgICAgICAgICAgICAgaGFzSW50ZW50SW5mbyA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdC5lcXVhbHMoIi0tZXoiKSkgewogICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBuZXh0QXJnUmVxdWlyZWQoKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBuZXh0QXJnUmVxdWlyZWQoKTsKQEAgLTQzMCw2ICs0NTcsMjggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBydW5EdW1wSGVhcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBib29sZWFuIG1hbmFnZWQgPSAhIi1uIi5lcXVhbHMobmV4dE9wdGlvbigpKTsKKyAgICAgICAgU3RyaW5nIHByb2Nlc3MgPSBuZXh0QXJnUmVxdWlyZWQoKTsKKyAgICAgICAgU3RyaW5nIGhlYXBGaWxlID0gbmV4dEFyZ1JlcXVpcmVkKCk7CisgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmQgPSBQYXJjZWxGaWxlRGVzY3JpcHRvci5vcGVuKAorICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShoZWFwRmlsZSksCisgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfQ1JFQVRFIHwKKyAgICAgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IuTU9ERV9UUlVOQ0FURSB8CisgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfUkVBRF9XUklURSk7CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yOiBVbmFibGUgdG8gb3BlbiBmaWxlOiAiICsgaGVhcEZpbGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtQW0uZHVtcEhlYXAocHJvY2VzcywgbWFuYWdlZCwgaGVhcEZpbGUsIGZkKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFuZHJvaWRFeGNlcHRpb24oIkhFQVAgRFVNUCBGQUlMRUQgb24gcHJvY2VzcyAiICsgcHJvY2Vzcyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBjbGFzcyBNeUFjdGl2aXR5Q29udHJvbGxlciBleHRlbmRzIElBY3Rpdml0eUNvbnRyb2xsZXIuU3R1YiB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBtR2RiUG9ydDsKIApAQCAtODk0LDggKzk0MywxNSBAQAogICAgICAgICAgICAgICAgICIgICAgICAgIC1wIDxGSUxFPjogd3JpdGUgcHJvZmlsaW5nIGRhdGEgdG8gPEZJTEU+XG4iICsKICAgICAgICAgICAgICAgICAiICAgICAgICAtdzogd2FpdCBmb3IgaW5zdHJ1bWVudGF0aW9uIHRvIGZpbmlzaCBiZWZvcmUgcmV0dXJuaW5nXG4iICsKICAgICAgICAgICAgICAgICAiXG4iICsKKyAgICAgICAgICAgICAgICAiICAgIHJ1biBhIHRlc3QgcGFja2FnZSBhZ2FpbnN0IGFuIGFwcGxpY2F0aW9uOiBhbSBpbnN0cnVtZW50IFtmbGFnc10gPFRFU1RfUEFDS0FHRT4vPFJVTk5FUl9DTEFTUz5cbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIC1lIDx0ZXN0cnVubmVyX2ZsYWc+IDx0ZXN0cnVubmVyX3ZhbHVlPiBbLDx0ZXN0cnVubmVyX3ZhbHVlPl1cbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIC13IHdhaXQgZm9yIHRoZSB0ZXN0IHRvIGZpbmlzaCAocmVxdWlyZWQpXG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICAtciB1c2Ugd2l0aCAtZSBwZXJmIHRydWUgdG8gZ2VuZXJhdGUgcmF3IG91dHB1dCBmb3IgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnRzXG4iICsKKyAgICAgICAgICAgICAgICAiXG4iICsKICAgICAgICAgICAgICAgICAiICAgIHN0YXJ0IHByb2ZpbGluZzogYW0gcHJvZmlsZSA8UFJPQ0VTUz4gc3RhcnQgPEZJTEU+XG4iICsKICAgICAgICAgICAgICAgICAiICAgIHN0b3AgcHJvZmlsaW5nOiBhbSBwcm9maWxlIDxQUk9DRVNTPiBzdG9wXG4iICsKKyAgICAgICAgICAgICAgICAiICAgIGR1bXAgaGVhcDogYW0gZHVtcGhlYXAgW2ZsYWdzXSA8UFJPQ0VTUz4gPEZJTEU+XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICAtbjogZHVtcCBuYXRpdmUgaGVhcCBpbnN0ZWFkIG9mIG1hbmFnZWQgaGVhcFxuIiArCiAgICAgICAgICAgICAgICAgIlxuIiArCiAgICAgICAgICAgICAgICAgIiAgICBzdGFydCBtb25pdG9yaW5nOiBhbSBtb25pdG9yIFstLWdkYiA8cG9ydD5dXG4iICsKICAgICAgICAgICAgICAgICAiICAgICAgICAtLWdkYjogc3RhcnQgZ2Ric2VydiBvbiB0aGUgZ2l2ZW4gcG9ydCBhdCBjcmFzaC9BTlJcbiIgKwpAQCAtOTA2LDcgKzk2MiwxMCBAQAogICAgICAgICAgICAgICAgICIgICAgICAgIFstZXwtLWVzIDxFWFRSQV9LRVk+IDxFWFRSQV9TVFJJTkdfVkFMVUU+IC4uLl1cbiIgKwogICAgICAgICAgICAgICAgICIgICAgICAgIFstLWVzbiA8RVhUUkFfS0VZPiAuLi5dXG4iICsKICAgICAgICAgICAgICAgICAiICAgICAgICBbLS1leiA8RVhUUkFfS0VZPiA8RVhUUkFfQk9PTEVBTl9WQUxVRT4gLi4uXVxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgWy1lfC0tZWkgPEVYVFJBX0tFWT4gPEVYVFJBX0lOVF9WQUxVRT4gLi4uXVxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgICAgWy0tZWkgPEVYVFJBX0tFWT4gPEVYVFJBX0lOVF9WQUxVRT4gLi4uXVxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgICAgWy0tZWwgPEVYVFJBX0tFWT4gPEVYVFJBX0xPTkdfVkFMVUU+IC4uLl1cbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIFstLWVpYSA8RVhUUkFfS0VZPiA8RVhUUkFfSU5UX1ZBTFVFPlssPEVYVFJBX0lOVF9WQUxVRS4uLl1dXG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICBbLS1lbGEgPEVYVFJBX0tFWT4gPEVYVFJBX0xPTkdfVkFMVUU+Wyw8RVhUUkFfTE9OR19WQUxVRS4uLl1dXG4iICsKICAgICAgICAgICAgICAgICAiICAgICAgICBbLW4gPENPTVBPTkVOVD5dIFstZiA8RkxBR1M+XVxuIiArCiAgICAgICAgICAgICAgICAgIiAgICAgICAgWy0tZ3JhbnQtcmVhZC11cmktcGVybWlzc2lvbl0gWy0tZ3JhbnQtd3JpdGUtdXJpLXBlcm1pc3Npb25dXG4iICsKICAgICAgICAgICAgICAgICAiICAgICAgICBbLS1kZWJ1Zy1sb2ctcmVzb2x1dGlvbl1cbiIgKwpkaWZmIC0tZ2l0IGEvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmMgYi9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuYwppbmRleCA4MjJmNjJkLi42N2JkOWY3IDEwMDY0NAotLS0gYS9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuYworKysgYi9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuYwpAQCAtMzksNiArMzksOCBAQAogc3RhdGljIGNoYXIgY21kbGluZV9idWZbMTYzODRdID0gIih1bmtub3duKSI7CiBzdGF0aWMgY29uc3QgY2hhciAqZHVtcF90cmFjZXNfcGF0aCA9IE5VTEw7CiAKK3N0YXRpYyBjaGFyIHNjcmVlbnNob3RfcGF0aFtQQVRIX01BWF0gPSAiIjsKKwogLyogZHVtcHMgdGhlIGN1cnJlbnQgc3lzdGVtIHN0YXRlIHRvIHN0ZG91dCAqLwogc3RhdGljIHZvaWQgZHVtcHN0YXRlKCkgewogICAgIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwpAQCAtNzYsNiArNzgsMTIgQEAKICAgICBkdW1wX2ZpbGUoIlNMQUIgSU5GTyIsICIvcHJvYy9zbGFiaW5mbyIpOwogICAgIGR1bXBfZmlsZSgiWk9ORUlORk8iLCAiL3Byb2Mvem9uZWluZm8iKTsKIAorICAgIGlmIChzY3JlZW5zaG90X3BhdGhbMF0pIHsKKyAgICAgICAgTE9HSSgidGFraW5nIHNjcmVlbnNob3RcbiIpOworICAgICAgICBydW5fY29tbWFuZChOVUxMLCA1LCAic3UiLCAicm9vdCIsICJzY3JlZW5zaG90Iiwgc2NyZWVuc2hvdF9wYXRoLCBOVUxMKTsKKyAgICAgICAgTE9HSSgid3JvdGUgc2NyZWVuc2hvdDogJXNcbiIsIHNjcmVlbnNob3RfcGF0aCk7CisgICAgfQorCiAgICAgcnVuX2NvbW1hbmQoIlNZU1RFTSBMT0ciLCAyMCwgImxvZ2NhdCIsICItdiIsICJ0aW1lIiwgIi1kIiwgIio6diIsIE5VTEwpOwogCiAgICAgLyogc2hvdyB0aGUgdHJhY2VzIHdlIGNvbGxlY3RlZCBpbiBtYWluKCksIGlmIHRoYXQgd2FzIGRvbmUgKi8KQEAgLTEwMyw3ICsxMTEsMTIgQEAKICAgICBkdW1wX2ZpbGUoIk5FVFdPUksgUk9VVEVTIiwgIi9wcm9jL25ldC9yb3V0ZSIpOwogICAgIGR1bXBfZmlsZSgiQVJQIENBQ0hFIiwgIi9wcm9jL25ldC9hcnAiKTsKIAorICAgIHJ1bl9jb21tYW5kKCJXSUZJIE5FVFdPUktTIiwgMjAsCisgICAgICAgICAgICAic3UiLCAicm9vdCIsICJ3cGFfY2xpIiwgImxpc3RfbmV0d29ya3MiLCBOVUxMKTsKKwogI2lmZGVmIEZXRFVNUF9iY200MzI5CisgICAgcnVuX2NvbW1hbmQoIkRVTVAgV0lGSSBTVEFUVVMiLCAyMCwKKyAgICAgICAgICAgICJzdSIsICJyb290IiwgImRoZHV0aWwiLCAiLWkiLCAiZXRoMCIsICJkdW1wIiwgTlVMTCk7CiAgICAgcnVuX2NvbW1hbmQoIkRVTVAgV0lGSSBGSVJNV0FSRSBMT0ciLCA2MCwKICAgICAgICAgICAgICJzdSIsICJyb290IiwgImRoZHV0aWwiLCAiLWkiLCAiZXRoMCIsICJ1cGxvYWQiLCAiL2RhdGEvbG9jYWwvdG1wL3dsYW5fY3Jhc2guZHVtcCIsIE5VTEwpOwogI2VuZGlmCkBAIC0xNjQsMTggKzE3NywyNSBAQAogfQogCiBzdGF0aWMgdm9pZCB1c2FnZSgpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBkdW1wc3RhdGUgWy1kXSBbLW8gZmlsZV0gWy1zXSBbLXpdXG4iCi0gICAgICAgICAgICAiICAtZDogYXBwZW5kIGRhdGUgdG8gZmlsZW5hbWUgKHJlcXVpcmVzIC1vKVxuIgorICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6IGR1bXBzdGF0ZSBbLWIgc291bmRmaWxlXSBbLWUgc291bmRmaWxlXSBbLW8gZmlsZSBbLWRdIFstcF0gWy16XV0gWy1zXVxuIgogICAgICAgICAgICAgIiAgLW86IHdyaXRlIHRvIGZpbGUgKGluc3RlYWQgb2Ygc3Rkb3V0KVxuIgorICAgICAgICAgICAgIiAgLWQ6IGFwcGVuZCBkYXRlIHRvIGZpbGVuYW1lIChyZXF1aXJlcyAtbylcbiIKKyAgICAgICAgICAgICIgIC16OiBnemlwIG91dHB1dCAocmVxdWlyZXMgLW8pXG4iCisgICAgICAgICAgICAiICAtcDogY2FwdHVyZSBzY3JlZW5zaG90IHRvIGZpbGVuYW1lLnBuZyAocmVxdWlyZXMgLW8pXG4iCiAgICAgICAgICAgICAiICAtczogd3JpdGUgb3V0cHV0IHRvIGNvbnRyb2wgc29ja2V0IChmb3IgaW5pdClcbiIKLSAgICAgICAgICAgICIgIC16OiBnemlwIG91dHB1dCAocmVxdWlyZXMgLW8pXG4iKTsKKyAgICAgICAgICAgICIgIC1iOiBwbGF5IHNvdW5kIGZpbGUgaW5zdGVhZCBvZiB2aWJyYXRlLCBhdCBiZWdpbm5pbmcgb2Ygam9iXG4iCisgICAgICAgICAgICAiICAtZTogcGxheSBzb3VuZCBmaWxlIGluc3RlYWQgb2YgdmlicmF0ZSwgYXQgZW5kIG9mIGpvYlxuIgorCQkpOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgICAgaW50IGRvX2FkZF9kYXRlID0gMDsKICAgICBpbnQgZG9fY29tcHJlc3MgPSAwOwogICAgIGNoYXIqIHVzZV9vdXRmaWxlID0gMDsKKyAgICBjaGFyKiBiZWdpbl9zb3VuZCA9IDA7CisgICAgY2hhciogZW5kX3NvdW5kID0gMDsKICAgICBpbnQgdXNlX3NvY2tldCA9IDA7CisgICAgaW50IGRvX2ZiID0gMDsKIAogICAgIExPR0koImJlZ2luXG4iKTsKIApAQCAtMTkxLDEzICsyMTEsMTYgQEAKICAgICBkdW1wX3RyYWNlc19wYXRoID0gZHVtcF92bV90cmFjZXMoKTsKIAogICAgIGludCBjOwotICAgIHdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiZGhvOnN2eiIpKSAhPSAtMSkgeworICAgIHdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiYjpkZTpobzpzdnpwIikpICE9IC0xKSB7CiAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnYic6IGJlZ2luX3NvdW5kID0gb3B0YXJnOyAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdkJzogZG9fYWRkX2RhdGUgPSAxOyAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2UnOiBlbmRfc291bmQgPSBvcHRhcmc7ICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnbyc6IHVzZV9vdXRmaWxlID0gb3B0YXJnOyAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdzJzogdXNlX3NvY2tldCA9IDE7ICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ3YnOiBicmVhazsgIC8vIGNvbXBhdGliaWxpdHkgbm8tb3AKICAgICAgICAgICAgIGNhc2UgJ3onOiBkb19jb21wcmVzcyA9IDY7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAncCc6IGRvX2ZiID0gMTsgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICc/JzogcHJpbnRmKCJcbiIpOwogICAgICAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgICAgICAgdXNhZ2UoKTsKQEAgLTI0NCw2ICsyNjcsMTAgQEAKICAgICAgICAgICAgIHN0cmZ0aW1lKGRhdGUsIHNpemVvZihkYXRlKSwgIi0lWS0lbS0lZC0lSC0lTS0lUyIsIGxvY2FsdGltZSgmbm93KSk7CiAgICAgICAgICAgICBzdHJsY2F0KHBhdGgsIGRhdGUsIHNpemVvZihwYXRoKSk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGRvX2ZiKSB7CisgICAgICAgICAgICBzdHJsY3B5KHNjcmVlbnNob3RfcGF0aCwgcGF0aCwgc2l6ZW9mKHNjcmVlbnNob3RfcGF0aCkpOworICAgICAgICAgICAgc3RybGNhdChzY3JlZW5zaG90X3BhdGgsICIucG5nIiwgc2l6ZW9mKHNjcmVlbnNob3RfcGF0aCkpOworICAgICAgICB9CiAgICAgICAgIHN0cmxjYXQocGF0aCwgIi50eHQiLCBzaXplb2YocGF0aCkpOwogICAgICAgICBpZiAoZG9fY29tcHJlc3MpIHN0cmxjYXQocGF0aCwgIi5neiIsIHNpemVvZihwYXRoKSk7CiAgICAgICAgIHN0cmxjcHkodG1wX3BhdGgsIHBhdGgsIHNpemVvZih0bXBfcGF0aCkpOwpAQCAtMjUxLDE2ICsyNzgsMTggQEAKICAgICAgICAgZ3ppcF9waWQgPSByZWRpcmVjdF90b19maWxlKHN0ZG91dCwgdG1wX3BhdGgsIGRvX2NvbXByZXNzKTsKICAgICB9CiAKLSAgICAvKiBienp6enp6ICovCi0gICAgaWYgKHZpYnJhdG9yKSB7CisgICAgaWYgKGJlZ2luX3NvdW5kKSB7CisgICAgICAgIHBsYXlfc291bmQoYmVnaW5fc291bmQpOworICAgIH0gZWxzZSBpZiAodmlicmF0b3IpIHsKICAgICAgICAgZnB1dHMoIjE1MCIsIHZpYnJhdG9yKTsKICAgICAgICAgZmZsdXNoKHZpYnJhdG9yKTsKICAgICB9CiAKICAgICBkdW1wc3RhdGUoKTsKIAotICAgIC8qIGJ6enogYnp6eiBienp6ICovCi0gICAgaWYgKHZpYnJhdG9yKSB7CisgICAgaWYgKGVuZF9zb3VuZCkgeworICAgICAgICBwbGF5X3NvdW5kKGVuZF9zb3VuZCk7CisgICAgfSBlbHNlIGlmICh2aWJyYXRvcikgewogICAgICAgICBpbnQgaTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogICAgICAgICAgICAgZnB1dHMoIjc1XG4iLCB2aWJyYXRvcik7CmRpZmYgLS1naXQgYS9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuaCBiL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5oCmluZGV4IDY4MmVhZmQuLjgzYjFkMTEgMTAwNjQ0Ci0tLSBhL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5oCisrKyBiL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5oCkBAIC00NCw0ICs0NCw3IEBACiAvKiBEaXNwbGF5cyBhIGJsb2NrZWQgcHJvY2Vzc2VzIGluLWtlcm5lbCB3YWl0IGNoYW5uZWwgKi8KIHZvaWQgc2hvd193Y2hhbihpbnQgcGlkLCBjb25zdCBjaGFyICpuYW1lKTsKIAorLyogUGxheSBhIHNvdW5kIHZpYSBTdGFnZWZyaWdodCAqLwordm9pZCBwbGF5X3NvdW5kKGNvbnN0IGNoYXIqIHBhdGgpOworCiAjZW5kaWYgLyogX0RVTVBTVEFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvY21kcy9kdW1wc3RhdGUvdXRpbHMuYyBiL2NtZHMvZHVtcHN0YXRlL3V0aWxzLmMKaW5kZXggYzdhNzhjYy4uZjkyYWNiYmIgMTAwNjQ0Ci0tLSBhL2NtZHMvZHVtcHN0YXRlL3V0aWxzLmMKKysrIGIvY21kcy9kdW1wc3RhdGUvdXRpbHMuYwpAQCAtNDI5LDMgKzQyOSw3IEBACiAgICAgcmVuYW1lKGFucl90cmFjZXNfcGF0aCwgdHJhY2VzX3BhdGgpOwogICAgIHJldHVybiBkdW1wX3RyYWNlc19wYXRoOwogfQorCit2b2lkIHBsYXlfc291bmQoY29uc3QgY2hhciogcGF0aCkgeworICAgIHJ1bl9jb21tYW5kKE5VTEwsIDUsICIvc3lzdGVtL2Jpbi9zdGFnZWZyaWdodCIsICItbyIsICItYSIsIHBhdGgsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvY21kcy9wbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvcG0vUG0uamF2YSBiL2NtZHMvcG0vc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL3BtL1BtLmphdmEKaW5kZXggOWI4YjBhYy4uMDQwNDIxYSAxMDA2NDQKLS0tIGEvY21kcy9wbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvcG0vUG0uamF2YQorKysgYi9jbWRzL3BtL3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9wbS9QbS5qYXZhCkBAIC0yMzMsNyArMjMzLDcgQEAKICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxyYXdMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgbGlzdC5hZGQocmF3TGlzdFtpXSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAorCiAKICAgICAgICAgICAgIC8vIFNvcnQgYnkgbmFtZQogICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0LCBuZXcgQ29tcGFyYXRvcjxGZWF0dXJlSW5mbz4oKSB7CkBAIC05MDksNiArOTA5LDkgQEAKICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJUaGUgbGlzdCBpbnN0cnVtZW50YXRpb24gY29tbWFuZCBwcmludHMgYWxsIGluc3RydW1lbnRhdGlvbnMsIik7CiAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigib3Igb25seSB0aG9zZSB0aGF0IHRhcmdldCBhIHNwZWNpZmllZCBwYWNrYWdlLiAgT3B0aW9uczoiKTsKICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgIC1mOiBzZWUgdGhlaXIgYXNzb2NpYXRlZCBmaWxlLiIpOworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIihVc2UgdGhpcyBjb21tYW5kIHRvIGxpc3QgYWxsIHRlc3QgcGFja2FnZXMsIG9yIHVzZSA8VEFSR0VULVBBQ0tBR0U+ICIpOworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiB0byBsaXN0IHRoZSB0ZXN0IHBhY2thZ2VzIGZvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb24uIFRoZSAtZiAiKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgb3B0aW9uIGxpc3RzIHRoZSAuYXBrIGZpbGUgZm9yIHRoZSB0ZXN0IHBhY2thZ2UuKSIpOwogICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiIpOwogICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlRoZSBsaXN0IGZlYXR1cmVzIGNvbW1hbmQgcHJpbnRzIGFsbCBmZWF0dXJlcyBvZiB0aGUgc3lzdGVtLiIpOwogICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiIpOwpkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5zaG90L0FuZHJvaWQubWsgYi9jbWRzL3NjcmVlbnNob3QvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWM3YWViCi0tLSAvZGV2L251bGwKKysrIGIvY21kcy9zY3JlZW5zaG90L0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNiBAQAoraWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IHNjcmVlbnNob3QuYworCitMT0NBTF9NT0RVTEUgOj0gc2NyZWVuc2hvdAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN1dGlscyBsaWJ6CitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYnBuZworTE9DQUxfQ19JTkNMVURFUyArPSBleHRlcm5hbC96bGliCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5zaG90L3NjcmVlbnNob3QuYyBiL2NtZHMvc2NyZWVuc2hvdC9zY3JlZW5zaG90LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4NjM2YwotLS0gL2Rldi9udWxsCisrKyBiL2NtZHMvc2NyZWVuc2hvdC9zY3JlZW5zaG90LmMKQEAgLTAsMCArMSwxNzEgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNpbmNsdWRlIDx6bGliLmg+CisjaW5jbHVkZSA8bGlicG5nL3BuZy5oPgorCisjaW5jbHVkZSAicHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmgiCisKKyNkZWZpbmUgTE9HX1RBRyAic2NyZWVuc2hvdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwordm9pZCB0YWtlX3NjcmVlbnNob3QoRklMRSAqZmJfaW4sIEZJTEUgKmZiX291dCkgeworICAgIGludCBmYjsKKyAgICBjaGFyIGltZ2J1ZlsweDEwMDAwXTsKKyAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmluZm87CisgICAgcG5nX3N0cnVjdHAgcG5nOworICAgIHBuZ19pbmZvcCBpbmZvOworICAgIHVuc2lnbmVkIGludCByLGMscm93bGVuOworICAgIHVuc2lnbmVkIGludCBieXRlc3BwLG9mZnNldDsKKworICAgIGZiID0gZmlsZW5vKGZiX2luKTsKKyAgICBpZihmYiA8IDApIHsKKyAgICAgICAgTE9HRSgiZmFpbGVkIHRvIG9wZW4gZnJhbWVidWZmZXJcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZiX2luID0gZmRvcGVuKGZiLCAiciIpOworCisgICAgaWYoaW9jdGwoZmIsIEZCSU9HRVRfVlNDUkVFTklORk8sICZ2aW5mbykgPCAwKSB7CisgICAgICAgIExPR0UoImZhaWxlZCB0byBnZXQgZnJhbWVidWZmZXIgaW5mb1xuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmNudGwoZmIsIEZfU0VURkQsIEZEX0NMT0VYRUMpOworCisgICAgcG5nID0gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAocG5nID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiZmFpbGVkIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0XG4iKTsKKyAgICAgICAgZmNsb3NlKGZiX2luKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBuZ19pbml0X2lvKHBuZywgZmJfb3V0KTsKKyAgICBpbmZvID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmcpOworICAgIGlmIChpbmZvID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiZmFpbGVkIHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3RcbiIpOworICAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZywgTlVMTCk7CisgICAgICAgIGZjbG9zZShmYl9pbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZykpKSB7CisgICAgICAgIExPR0UoImZhaWxlZCBwbmcgc2V0am1wXG4iKTsKKyAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmcsIE5VTEwpOworICAgICAgICBmY2xvc2UoZmJfaW4pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYnl0ZXNwcCA9IHZpbmZvLmJpdHNfcGVyX3BpeGVsIC8gODsKKyAgICBwbmdfc2V0X0lIRFIocG5nLCBpbmZvLAorICAgICAgICB2aW5mby54cmVzLCB2aW5mby55cmVzLCB2aW5mby5iaXRzX3Blcl9waXhlbCAvIDQsIAorICAgICAgICBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEEsIFBOR19JTlRFUkxBQ0VfTk9ORSwKKyAgICAgICAgUE5HX0NPTVBSRVNTSU9OX1RZUEVfQkFTRSwgUE5HX0ZJTFRFUl9UWVBFX0JBU0UpOworICAgIHBuZ193cml0ZV9pbmZvKHBuZywgaW5mbyk7CisKKyAgICByb3dsZW49dmluZm8ueHJlcyAqIGJ5dGVzcHA7CisgICAgaWYgKHJvd2xlbiA+IHNpemVvZihpbWdidWYpKSB7CisgICAgICAgIExPR0UoImNyYXp5IHJvd2xlbjogJWRcbiIsIHJvd2xlbik7CisgICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nLCBOVUxMKTsKKyAgICAgICAgZmNsb3NlKGZiX2luKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG9mZnNldCA9IHZpbmZvLnhvZmZzZXQgKiBieXRlc3BwICsgdmluZm8ueHJlcyAqIHZpbmZvLnlvZmZzZXQgKiBieXRlc3BwOworICAgIGZzZWVrKGZiX2luLCBvZmZzZXQsIFNFRUtfU0VUKTsKKworICAgIGZvcihyPTA7IHI8dmluZm8ueXJlczsgcisrKSB7CisgICAgICAgIGludCBsZW4gPSBmcmVhZChpbWdidWYsIDEsIHJvd2xlbiwgZmJfaW4pOworICAgICAgICBpZiAobGVuIDw9IDApIGJyZWFrOworICAgICAgICBwbmdfd3JpdGVfcm93KHBuZywgKHBuZ19ieXRlcClpbWdidWYpOworICAgIH0KKworICAgIHBuZ193cml0ZV9lbmQocG5nLCBpbmZvKTsKKyAgICBmY2xvc2UoZmJfaW4pOworICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nLCBOVUxMKTsKK30KKwordm9pZCBmb3JrX3NvdW5kKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgICBwaWRfdCBwaWQgPSBmb3JrKCk7CisgICAgaWYgKHBpZCA9PSAwKSB7CisgICAgICAgIGV4ZWNsKCIvc3lzdGVtL2Jpbi9zdGFnZWZyaWdodCIsICJzdGFnZWZyaWdodCIsICItbyIsICItYSIsIHBhdGgsIE5VTEwpOworICAgIH0KK30KKwordm9pZCB1c2FnZSgpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJ1c2FnZTogc2NyZWVuc2hvdCBbLXMgc291bmRmaWxlXSBmaWxlbmFtZS5wbmdcbiIKKyAgICAgICAgICAgICIgICAtczogcGxheSBhIHNvdW5kIGVmZmVjdCB0byBzaWduYWwgc3VjY2Vzc1xuIgorICAgICAgICAgICAgIiAgIC1pOiBhdXRvaW5jcmVtZW50IHRvIGF2b2lkIG92ZXJ3cml0aW5nIGZpbGVuYW1lLnBuZ1xuIgorICAgICk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiphcmd2KSB7CisgICAgRklMRSAqcG5nID0gTlVMTDsKKyAgICBGSUxFICpmYl9pbiA9IE5VTEw7CisgICAgY2hhciBvdXRmaWxlW1BBVEhfTUFYXSA9ICIiOworCisgICAgY2hhciAqIHNvdW5kZmlsZSA9IE5VTEw7CisgICAgaW50IGRvX2luY3JlbWVudCA9IDA7CisKKyAgICBpbnQgYzsKKyAgICB3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgInM6aSIpKSAhPSAtMSkgeworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ3MnOiBzb3VuZGZpbGUgPSBvcHRhcmc7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnaSc6IGRvX2luY3JlbWVudCA9IDE7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnPyc6CisgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgICAgICB1c2FnZSgpOyBleGl0KDEpOworICAgICAgICB9CisgICAgfQorICAgIGFyZ2MgLT0gb3B0aW5kOworICAgIGFyZ3YgKz0gb3B0aW5kOworCisgICAgaWYgKGFyZ2MgPCAxKSB7CisgICAgICAgIHVzYWdlKCk7IGV4aXQoMSk7CisgICAgfQorCisgICAgc3RybGNweShvdXRmaWxlLCBhcmd2WzBdLCBQQVRIX01BWCk7CisgICAgaWYgKGRvX2luY3JlbWVudCkgeworICAgICAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICAgICAgY2hhciBiYXNlW1BBVEhfTUFYXSA9ICIiOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIHdoaWxlIChzdGF0KG91dGZpbGUsICZzdCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFiYXNlWzBdKSB7CisgICAgICAgICAgICAgICAgY2hhciAqcCA9IHN0cnJjaHIob3V0ZmlsZSwgJy4nKTsKKyAgICAgICAgICAgICAgICBpZiAocCkgKnAgPSAnXDAnOworICAgICAgICAgICAgICAgIHN0cmNweShiYXNlLCBvdXRmaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNucHJpbnRmKG91dGZpbGUsIFBBVEhfTUFYLCAiJXMtJWQucG5nIiwgYmFzZSwgKytpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZiX2luID0gZm9wZW4oIi9kZXYvZ3JhcGhpY3MvZmIwIiwgInIiKTsKKyAgICBpZiAoIWZiX2luKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3I6IGNvdWxkIG5vdCByZWFkIGZyYW1lYnVmZmVyXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICAvKiBzd2l0Y2ggdG8gbm9uLXJvb3QgdXNlciBhbmQgZ3JvdXAgKi8KKyAgICBnaWRfdCBncm91cHNbXSA9IHsgQUlEX0xPRywgQUlEX1NEQ0FSRF9SVyB9OworICAgIHNldGdyb3VwcyhzaXplb2YoZ3JvdXBzKS9zaXplb2YoZ3JvdXBzWzBdKSwgZ3JvdXBzKTsKKyAgICBzZXR1aWQoQUlEX1NIRUxMKTsKKworICAgIHBuZyA9IGZvcGVuKG91dGZpbGUsICJ3Iik7CisgICAgaWYgKCFwbmcpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvcjogd3JpdGluZyBmaWxlICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBvdXRmaWxlLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIHRha2Vfc2NyZWVuc2hvdChmYl9pbiwgcG5nKTsKKworICAgIGlmIChzb3VuZGZpbGUpIHsKKyAgICAgICAgZm9ya19zb3VuZChzb3VuZGZpbGUpOworICAgIH0KKworICAgIGV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsgYi9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKaW5kZXggOWE5NzI4NC4uY2JkZjExOSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpAQCAtNTMsNiArNTMsMzEgQEAKIAogTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICBcCiAgICAgICAgIFNpbmVTb3VyY2UuY3BwICAgIFwKKyAgICAgICAgcmVjb3JkdmlkZW8uY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYnN0YWdlZnJpZ2h0IGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIKKworTE9DQUxfQ19JTkNMVURFUzo9IFwKKwkkKEpOSV9IX0lOQ0xVREUpIFwKKwlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAorCSQoVE9QKS9leHRlcm5hbC9vcGVuY29yZS9leHRlcm5fbGlic192Mi9raHJvbm9zL29wZW5tYXgvaW5jbHVkZQorCitMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gZGVidWcKKworTE9DQUxfTU9EVUxFOj0gcmVjb3JkdmlkZW8KKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgXAorICAgICAgICBTaW5lU291cmNlLmNwcCAgICBcCiAgICAgICAgIGF1ZGlvbG9vcC5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZHZpZGVvLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkdmlkZW8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMGZiYzIKLS0tIC9kZXYvbnVsbAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZHZpZGVvLmNwcApAQCAtMCwwICsxLDMwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJTaW5lU291cmNlLmgiCisKKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyBwcmludCB1c2FnZSBzaG93aW5nIGhvdyB0byB1c2UgdGhpcyB1dGlsaXR5IHRvIHJlY29yZCB2aWRlb3MKK3N0YXRpYyB2b2lkIHVzYWdlKGNvbnN0IGNoYXIgKm1lKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXNcbiIsIG1lKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtaChlbHApXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtYiBiaXQgcmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQgKGRlZmF1bHQgMzAwMDAwKVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWMgWVVWNDIwIGNvbG9yIGZvcm1hdDogWzBdIHNlbWkgcGxhbmFyIG9yIFsxXSBwbGFuYXIgKGRlZmF1bHQgMSlcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1mIGZyYW1lIHJhdGUgaW4gZnJhbWVzIHBlciBzZWNvbmQgKGRlZmF1bHQgMzApXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtaSBJIGZyYW1lIGludGVydmFsIGluIHNlY29uZHMgKGRlZmF1bHQgMSlcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1uIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgcmVjb3JkZWQgKGRlZmF1bHQgMzAwKVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXcgd2lkdGggaW4gcGl4ZWxzIChkZWZhdWx0IDE3NilcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC10IGhlaWdodCBpbiBwaXhlbHMgKGRlZmF1bHQgMTQ0KVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXYgdmlkZW8gY29kZWM6IFswXSBBVkMgWzFdIE00ViBbMl0gSDI2MyAoZGVmYXVsdCAwKVxuIik7CisgICAgZXhpdCgxKTsKK30KKworY2xhc3MgRHVtbXlTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgeworCitwdWJsaWM6CisgICAgRHVtbXlTb3VyY2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbkZyYW1lcywgaW50IGZwcywgaW50IGNvbG9yRm9ybWF0KQorICAgICAgICA6IG1XaWR0aCh3aWR0aCksCisgICAgICAgICAgbUhlaWdodChoZWlnaHQpLAorICAgICAgICAgIG1NYXhOdW1GcmFtZXMobkZyYW1lcyksCisgICAgICAgICAgbUZyYW1lUmF0ZShmcHMpLAorICAgICAgICAgIG1Db2xvckZvcm1hdChjb2xvckZvcm1hdCksCisgICAgICAgICAgbVNpemUoKHdpZHRoICogaGVpZ2h0ICogMykgLyAyKSB7CisgICAgICAgIG1Hcm91cC5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihtU2l6ZSkpOworCisgICAgICAgIC8vIENoZWNrIHRoZSBjb2xvciBmb3JtYXQgdG8gbWFrZSBzdXJlCisgICAgICAgIC8vIHRoYXQgdGhlIGJ1ZmZlciBzaXplIG1TaXplIGl0IHNldCBjb3JyZWN0bHkgYWJvdmUuCisgICAgICAgIENIRUNLKGNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyIHx8CisgICAgICAgICAgICAgIGNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOworICAgIH0KKworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpIHsKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgbVdpZHRoKTsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgbUhlaWdodCk7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgbUNvbG9yRm9ybWF0KTsKKyAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyk7CisKKyAgICAgICAgcmV0dXJuIG1ldGE7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworCisgICAgICAgIGlmIChtTnVtRnJhbWVzT3V0cHV0ICUgMTAgPT0gMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1OdW1GcmFtZXNPdXRwdXQgPT0gbU1heE51bUZyYW1lcykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAuYWNxdWlyZV9idWZmZXIoYnVmZmVyKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIGNoYXIgeCA9IChjaGFyKSgoZG91YmxlKXJhbmQoKSAvIFJBTkRfTUFYICogMjU1KTsKKyAgICAgICAgbWVtc2V0KCgqYnVmZmVyKS0+ZGF0YSgpLCB4LCBtU2l6ZSk7CisgICAgICAgICgqYnVmZmVyKS0+c2V0X3JhbmdlKDAsIG1TaXplKTsKKyAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+Y2xlYXIoKTsKKyAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCisgICAgICAgICAgICAgICAga0tleVRpbWUsIChtTnVtRnJhbWVzT3V0cHV0ICogMTAwMDAwMCkgLyBtRnJhbWVSYXRlKTsKKyAgICAgICAgKyttTnVtRnJhbWVzT3V0cHV0OworCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5EdW1teVNvdXJjZSgpIHt9CisKK3ByaXZhdGU6CisgICAgTWVkaWFCdWZmZXJHcm91cCBtR3JvdXA7CisgICAgaW50IG1XaWR0aCwgbUhlaWdodDsKKyAgICBpbnQgbU1heE51bUZyYW1lczsKKyAgICBpbnQgbUZyYW1lUmF0ZTsKKyAgICBpbnQgbUNvbG9yRm9ybWF0OworICAgIHNpemVfdCBtU2l6ZTsKKyAgICBpbnQ2NF90IG1OdW1GcmFtZXNPdXRwdXQ7OworCisgICAgRHVtbXlTb3VyY2UoY29uc3QgRHVtbXlTb3VyY2UgJik7CisgICAgRHVtbXlTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBEdW1teVNvdXJjZSAmKTsKK307CisKK3NwPE1lZGlhU291cmNlPiBjcmVhdGVTb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKKyAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlOworCisgICAgc3A8TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9CisgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUobmV3IEZpbGVTb3VyY2UoZmlsZW5hbWUpKTsKKyAgICBpZiAoZXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc2l6ZV90IG51bV90cmFja3MgPSBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisKKyAgICBzcDxNZXRhRGF0YT4gbWV0YTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV90cmFja3M7ICsraSkgeworICAgICAgICBtZXRhID0gZXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKGkpOworICAgICAgICBDSEVDSyhtZXRhLmdldCgpICE9IE5VTEwpOworCisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgIGlmICghbWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzb3VyY2UgPSBleHRyYWN0b3ItPmdldFRyYWNrKGkpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gc291cmNlOworfQorCitlbnVtIHsKKyAgICBrWVVWNDIwU1AgPSAwLAorICAgIGtZVVY0MjBQICA9IDEsCit9OworCisvLyByZXR1cm5zIC0xIGlmIG1hcHBpbmcgb2YgdGhlIGdpdmVuIGNvbG9yIGlzIHVuc3VjY2Vzc2Z1bAorLy8gcmV0dXJucyBhbiBvbXggY29sb3IgZW51bSB2YWx1ZSBvdGhlcndpc2UKK3N0YXRpYyBpbnQgdHJhbnNsYXRlQ29sb3JUb09teEVudW1WYWx1ZShpbnQgY29sb3IpIHsKKyAgICBzd2l0Y2ggKGNvbG9yKSB7CisgICAgICAgIGNhc2Uga1lVVjQyMFNQOgorICAgICAgICAgICAgcmV0dXJuIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOworICAgICAgICBjYXNlIGtZVVY0MjBQOgorICAgICAgICAgICAgcmV0dXJuIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuc3VwcG9ydGVkIGNvbG9yOiAlZFxuIiwgY29sb3IpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisKKyAgICAvLyBEZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHByb2dyYW0gaWYgbm90IG92ZXJ3cml0dGVuCisgICAgaW50IGZyYW1lUmF0ZUZwcyA9IDMwOworICAgIGludCB3aWR0aCA9IDE3NjsKKyAgICBpbnQgaGVpZ2h0ID0gMTQ0OworICAgIGludCBiaXRSYXRlQnBzID0gMzAwMDAwOworICAgIGludCBpRnJhbWVzSW50ZXJ2YWxTZWNvbmRzID0gMTsKKyAgICBpbnQgY29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOworICAgIGludCBuRnJhbWVzID0gMzAwOworICAgIGludCBjb2RlYyA9IDA7CisgICAgY29uc3QgY2hhciAqZmlsZU5hbWUgPSAiL3NkY2FyZC9vdXRwdXQubXA0IjsKKworICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKyAgICBpbnQgcmVzOworICAgIHdoaWxlICgocmVzID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJiOmM6ZjppOm46dzp0OnY6bzpoIikpID49IDApIHsKKyAgICAgICAgc3dpdGNoIChyZXMpIHsKKyAgICAgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJpdFJhdGVCcHMgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbG9yRm9ybWF0ID0gdHJhbnNsYXRlQ29sb3JUb09teEVudW1WYWx1ZShhdG9pKG9wdGFyZykpOworICAgICAgICAgICAgICAgIGlmIChjb2xvckZvcm1hdCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZyYW1lUmF0ZUZwcyA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaUZyYW1lc0ludGVydmFsU2Vjb25kcyA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbkZyYW1lcyA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAndyc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2lkdGggPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhlaWdodCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAndic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29kZWMgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGNvZGVjIDwgMCB8fCBjb2RlYyA+IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPTVhDbGllbnQgY2xpZW50OworICAgIENIRUNLX0VRKGNsaWVudC5jb25uZWN0KCksIE9LKTsKKworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIHNwPE1lZGlhU291cmNlPiBkZWNvZGVyID0gbmV3IER1bW15U291cmNlKHdpZHRoLCBoZWlnaHQsIG5GcmFtZXMsIGZyYW1lUmF0ZUZwcywgY29sb3JGb3JtYXQpOworCisgICAgc3A8TWV0YURhdGE+IGVuY19tZXRhID0gbmV3IE1ldGFEYXRhOworICAgIHN3aXRjaCAoY29kZWMpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKKyAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKyAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIGZyYW1lUmF0ZUZwcyk7CisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlCaXRSYXRlLCBiaXRSYXRlQnBzKTsKKyAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVN0cmlkZSwgd2lkdGgpOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5U2xpY2VIZWlnaHQsIGhlaWdodCk7CisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlJRnJhbWVzSW50ZXJ2YWwsIGlGcmFtZXNJbnRlcnZhbFNlY29uZHMpOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIGNvbG9yRm9ybWF0KTsKKworICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyID0KKyAgICAgICAgT01YQ29kZWM6OkNyZWF0ZSgKKyAgICAgICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksIGVuY19tZXRhLCB0cnVlIC8qIGNyZWF0ZUVuY29kZXIgKi8sIGRlY29kZXIpOworCisgICAgc3A8TVBFRzRXcml0ZXI+IHdyaXRlciA9IG5ldyBNUEVHNFdyaXRlcihmaWxlTmFtZSk7CisgICAgd3JpdGVyLT5hZGRTb3VyY2UoZW5jb2Rlcik7CisgICAgaW50NjRfdCBzdGFydCA9IHN5c3RlbVRpbWUoKTsKKyAgICBDSEVDS19FUShPSywgd3JpdGVyLT5zdGFydCgpKTsKKyAgICB3aGlsZSAoIXdyaXRlci0+cmVhY2hlZEVPUygpKSB7CisgICAgfQorICAgIGVyciA9IHdyaXRlci0+c3RvcCgpOworICAgIGludDY0X3QgZW5kID0gc3lzdGVtVGltZSgpOworCisgICAgcHJpbnRmKCIkXG4iKTsKKyAgICBjbGllbnQuZGlzY29ubmVjdCgpOworCisgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInJlY29yZCBmYWlsZWQ6ICVkXG4iLCBlcnIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZnByaW50ZihzdGRlcnIsICJlbmNvZGluZyAlZCBmcmFtZXMgaW4gJWxsZCB1c1xuIiwgbkZyYW1lcywgKGVuZC1zdGFydCkvMTAwMCk7CisgICAgZnByaW50ZihzdGRlcnIsICJlbmNvZGluZyBzcGVlZCBpczogJS4yZiBmcHNcbiIsIChuRnJhbWVzICogMUU5KSAvIChlbmQtc3RhcnQpKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FjY291bnRzL0FjY291bnRNYW5hZ2VyU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYWNjb3VudHMvQWNjb3VudE1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggMWQ5ZTBmMS4uZTZiMWMwOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYWNjb3VudHMvQWNjb3VudE1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYWNjb3VudHMvQWNjb3VudE1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTM5OSwxOSArMzk5LDE5IEBACiAKICAgICBwcml2YXRlIGJvb2xlYW4gaW5zZXJ0QWNjb3VudEludG9EYXRhYmFzZShBY2NvdW50IGFjY291bnQsIFN0cmluZyBwYXNzd29yZCwgQnVuZGxlIGV4dHJhcykgewogICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGJvb2xlYW4gbm9Ccm9hZGNhc3QgPSBhY2NvdW50LnR5cGUuZXF1YWxzKEdPT0dMRV9BQ0NPVU5UX1RZUEUpCisgICAgICAgICAgICAgICAgJiYgZXh0cmFzICE9IG51bGwgJiYgZXh0cmFzLmdldEJvb2xlYW4oTk9fQlJPQURDQVNUX0ZMQUcsIGZhbHNlKTsKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSAnbm9icm9hZGNhc3QnIGZsYWcgc2luY2Ugd2UgZG9uJ3Qgd2FudCBpdCB0byBwZXJzaXN0IGluIHRoZSBkYi4gSXQgaXMgaW5zdGVhZAorICAgICAgICAvLyB1c2VkIGFzIGEgY29udHJvbCBzaWduYWwgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBpbnNlcnRpb24gc2hvdWxkIHJlc3VsdCBpbgorICAgICAgICAvLyBhbiBhY2NvdW50cyBjaGFuZ2VkIGJyb2FkY2FzdCBiZWluZyBzZW50LgorICAgICAgICBpZiAoZXh0cmFzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGV4dHJhcy5yZW1vdmUoTk9fQlJPQURDQVNUX0ZMQUcpOworICAgICAgICB9CiAgICAgICAgIGRiLmJlZ2luVHJhbnNhY3Rpb24oKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChhY2NvdW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sZWFuIG5vQnJvYWRjYXN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoYWNjb3VudC50eXBlLmVxdWFscyhHT09HTEVfQUNDT1VOVF9UWVBFKSkgewotICAgICAgICAgICAgICAgIC8vIExvb2sgZm9yIHRoZSAnbm9icm9hZGNhc3QnIGZsYWcgYW5kIHJlbW92ZSBpdCBzaW5jZSB3ZSBkb24ndCB3YW50IGl0IHRvIHBlcnNpc3QKLSAgICAgICAgICAgICAgICAvLyBpbiB0aGUgZGIuCi0gICAgICAgICAgICAgICAgbm9Ccm9hZGNhc3QgPSBleHRyYXMuZ2V0Qm9vbGVhbihOT19CUk9BRENBU1RfRkxBRywgZmFsc2UpOwotICAgICAgICAgICAgICAgIGV4dHJhcy5yZW1vdmUoTk9fQlJPQURDQVNUX0ZMQUcpOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBsb25nIG51bU1hdGNoZXMgPSBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShkYiwKICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBUQUJMRV9BQ0NPVU5UUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBXSEVSRSAiICsgQUNDT1VOVFNfTkFNRSArICI9PyBBTkQgIiArIEFDQ09VTlRTX1RZUEUrICI9PyIsCkBAIC00MzYsMTMgKzQzNiwxMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRiLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOwotICAgICAgICAgICAgaWYgKCFub0Jyb2FkY2FzdCkgewotICAgICAgICAgICAgICAgIHNlbmRBY2NvdW50c0NoYW5nZWRCcm9hZGNhc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgZGIuZW5kVHJhbnNhY3Rpb24oKTsKICAgICAgICAgfQorICAgICAgICBpZiAoIW5vQnJvYWRjYXN0KSB7CisgICAgICAgICAgICBzZW5kQWNjb3VudHNDaGFuZ2VkQnJvYWRjYXN0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBsb25nIGluc2VydEV4dHJhKFNRTGl0ZURhdGFiYXNlIGRiLCBsb25nIGFjY291bnRJZCwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CkBAIC0xNjU3LDcgKzE2NTcsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRzUHJvdmlzaW9uaW5nOwogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG5lZWRzUHJvdmlzaW9uaW5nID0gdGVsZXBob255LmdldENkbWFOZWVkc1Byb3Zpc2lvbmluZygpOworICAgICAgICAgICAgICAgICAgICBuZWVkc1Byb3Zpc2lvbmluZyA9IHRlbGVwaG9ueS5uZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJleGNlcHRpb24gd2hpbGUgY2hlY2tpbmcgcHJvdmlzaW9uaW5nIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gTk9UIHdpcGluZyBvdXQgdGhlIHBhc3N3b3JkcwpAQCAtMTY4MSwxMSArMTY4MSwxMSBAQAogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIGRiLmV4ZWNTUUwoIkRFTEVURSBmcm9tICIgKyBUQUJMRV9BVVRIVE9LRU5TKTsKICAgICAgICAgICAgICAgICAgICAgZGIuZXhlY1NRTCgiVVBEQVRFICIgKyBUQUJMRV9BQ0NPVU5UUyArICIgU0VUICIgKyBBQ0NPVU5UU19QQVNTV09SRCArICIgPSAnJyIpOwotICAgICAgICAgICAgICAgICAgICBzZW5kQWNjb3VudHNDaGFuZ2VkQnJvYWRjYXN0KCk7CiAgICAgICAgICAgICAgICAgICAgIGRiLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOwogICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgIGRiLmVuZFRyYW5zYWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbmRBY2NvdW50c0NoYW5nZWRCcm9hZGNhc3QoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNldE1ldGFWYWx1ZSgiaW1zaSIsIGltc2kpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZGE2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3IuamF2YQpAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogVGhpcyBpcyB0aGUgc3VwZXJjbGFzcyBmb3IgY2xhc3NlcyB3aGljaCBwcm92aWRlIGJhc2ljIHN1cHBvcnQgZm9yIGFuaW1hdGlvbnMgd2hpY2ggY2FuIGJlCisgKiBzdGFydGVkLCBlbmRlZCwgYW5kIGhhdmUgPGNvZGU+QW5pbWF0b3JMaXN0ZW5lcnM8L2NvZGU+IGFkZGVkIHRvIHRoZW0uCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBbmltYXRvciBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgbGlzdGVuZXJzIHRvIGJlIHNlbnQgZXZlbnRzIHRocm91Z2ggdGhlIGxpZmUgb2YgYW4gYW5pbWF0aW9uLgorICAgICAqLworICAgIEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPiBtTGlzdGVuZXJzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFN0YXJ0cyB0aGlzIGFuaW1hdGlvbi4gSWYgdGhlIGFuaW1hdGlvbiBoYXMgYSBub256ZXJvIHN0YXJ0RGVsYXksIHRoZSBhbmltYXRpb24gd2lsbCBzdGFydAorICAgICAqIHJ1bm5pbmcgYWZ0ZXIgdGhhdCBkZWxheSBlbGFwc2VzLiBOb3RlIHRoYXQgdGhlIGFuaW1hdGlvbiBkb2VzIG5vdCBzdGFydCBzeW5jaHJvbm91c2x5IHdpdGgKKyAgICAgKiB0aGlzIGNhbGwsIGJlY2F1c2UgYWxsIGFuaW1hdGlvbiBldmVudHMgYXJlIHBvc3RlZCB0byBhIGNlbnRyYWwgdGltaW5nIGxvb3Agc28gdGhhdCBhbmltYXRpb24KKyAgICAgKiB0aW1lcyBhcmUgYWxsIHN5bmNocm9uaXplZCBvbiBhIHNpbmdsZSB0aW1pbmcgcHVsc2Ugb24gdGhlIFVJIHRocmVhZC4gU28gdGhlIGFuaW1hdGlvbiB3aWxsCisgICAgICogc3RhcnQgdGhlIG5leHQgdGltZSB0aGF0IGV2ZW50IGhhbmRsZXIgcHJvY2Vzc2VzIGV2ZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWxzIHRoZSBhbmltYXRpb24uIFVubGlrZSB7QGxpbmsgI2VuZCgpfSwgPGNvZGU+Y2FuY2VsKCk8L2NvZGU+IGNhdXNlcyB0aGUgYW5pbWF0aW9uIHRvCisgICAgICogc3RvcCBpbiBpdHMgdHJhY2tzLCBzZW5kaW5nIGFuIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci5BbmltYXRvckxpc3RlbmVyI29uQW5pbWF0aW9uQ2FuY2VsKEFuaW1hdG9yKX0gdG8KKyAgICAgKiBpdHMgbGlzdGVuZXJzLCBmb2xsb3dlZCBieSBhbiB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lciNvbkFuaW1hdGlvbkVuZChBbmltYXRvcil9IG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2FuY2VsKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZHMgdGhlIGFuaW1hdGlvbi4gVGhpcyBjYXVzZXMgdGhlIGFuaW1hdGlvbiB0byBhc3NpZ24gdGhlIGVuZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgYmVpbmcKKyAgICAgKiBhbmltYXRlZCwgdGhlbiBjYWxsaW5nIHRoZSB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lciNvbkFuaW1hdGlvbkVuZChBbmltYXRvcil9IG1ldGhvZCBvbgorICAgICAqIGl0cyBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byBkZWxheSBzdGFydGluZyB0aGUgYW5pbWF0aW9uIGFmdGVyCisgICAgICoge0BsaW5rICNzdGFydCgpfSBpcyBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IHJ1bm5pbmcgdGhlIGFuaW1hdGlvbgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIGdldFN0YXJ0RGVsYXkoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byBkZWxheSBzdGFydGluZyB0aGUgYW5pbWF0aW9uIGFmdGVyCisgICAgICoge0BsaW5rICNzdGFydCgpfSBpcyBjYWxsZWQuCisKKyAgICAgKiBAcGFyYW0gc3RhcnREZWxheSBUaGUgYW1vdW50IG9mIHRoZSBkZWxheSwgaW4gbWlsbGlzZWNvbmRzCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3RhcnREZWxheShsb25nIHN0YXJ0RGVsYXkpOworCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREdXJhdGlvbihsb25nIGR1cmF0aW9uKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXREdXJhdGlvbigpOworCisgICAgLyoqCisgICAgICogVGhlIHRpbWUgaW50ZXJwb2xhdG9yIHVzZWQgaW4gY2FsY3VsYXRpbmcgdGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhpcyBhbmltYXRpb24uIFRoZQorICAgICAqIGludGVycG9sYXRvciBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGFuaW1hdGlvbiBydW5zIHdpdGggbGluZWFyIG9yIG5vbi1saW5lYXIgbW90aW9uLAorICAgICAqIHN1Y2ggYXMgYWNjZWxlcmF0aW9uIGFuZCBkZWNlbGVyYXRpb24uIFRoZSBkZWZhdWx0IHZhbHVlIGlzCisgICAgICoge0BsaW5rIGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3J9CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGludGVycG9sYXRvciB0byBiZSB1c2VkIGJ5IHRoaXMgYW5pbWF0aW9uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SW50ZXJwb2xhdG9yKEludGVycG9sYXRvciB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBBbmltYXRvciBpcyBjdXJyZW50bHkgcnVubmluZyAoaGF2aW5nIGJlZW4gc3RhcnRlZCBhbmQgbm90IHlldCBlbmRlZCkuCisgICAgICogQHJldHVybiBXaGV0aGVyIHRoZSBBbmltYXRvciBpcyBydW5uaW5nLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUnVubmluZygpOworCisgICAgLyoqCisgICAgICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBzZXQgb2YgbGlzdGVuZXJzIHRoYXQgYXJlIHNlbnQgZXZlbnRzIHRocm91Z2ggdGhlIGxpZmUgb2YgYW4KKyAgICAgKiBhbmltYXRpb24sIHN1Y2ggYXMgc3RhcnQsIHJlcGVhdCwgYW5kIGVuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gYmUgYWRkZWQgdG8gdGhlIGN1cnJlbnQgc2V0IG9mIGxpc3RlbmVycyBmb3IgdGhpcyBhbmltYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoQW5pbWF0b3JMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobUxpc3RlbmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPigpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgc2V0IGxpc3RlbmluZyB0byB0aGlzIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBjdXJyZW50IHNldCBvZiBsaXN0ZW5lcnMgZm9yIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKEFuaW1hdG9yTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lcnMgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc2V0IG9mIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci5BbmltYXRvckxpc3RlbmVyfSBvYmplY3RzIHRoYXQgYXJlIGN1cnJlbnRseQorICAgICAqIGxpc3RlbmluZyBmb3IgZXZlbnRzIG9uIHRoaXMgPGNvZGU+QW5pbWF0b3I8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+IFRoZSBzZXQgb2YgbGlzdGVuZXJzLgorICAgICAqLworICAgIHB1YmxpYyBBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJzKCkgeworICAgICAgICByZXR1cm4gbUxpc3RlbmVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFsbCBsaXN0ZW5lcnMgZnJvbSB0aGlzIG9iamVjdC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAgICAgKiA8Y29kZT5nZXRMaXN0ZW5lcnMoKTwvY29kZT4gZm9sbG93ZWQgYnkgY2FsbGluZyA8Y29kZT5jbGVhcigpPC9jb2RlPiBvbiB0aGUKKyAgICAgKiByZXR1cm5lZCBsaXN0IG9mIGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBbGxMaXN0ZW5lcnMoKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1MaXN0ZW5lcnMgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFuaW1hdG9yIGNsb25lKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgQW5pbWF0b3IgYW5pbSA9IChBbmltYXRvcikgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4gb2xkTGlzdGVuZXJzID0gbUxpc3RlbmVyczsKKyAgICAgICAgICAgICAgICBhbmltLm1MaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+KCk7CisgICAgICAgICAgICAgICAgaW50IG51bUxpc3RlbmVycyA9IG9sZExpc3RlbmVycy5zaXplKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1MaXN0ZW5lcnM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBhbmltLm1MaXN0ZW5lcnMuYWRkKG9sZExpc3RlbmVycy5nZXQoaSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBhbmltOworICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgdGVsbHMgdGhlIG9iamVjdCB0byB1c2UgYXBwcm9wcmlhdGUgaW5mb3JtYXRpb24gdG8gZXh0cmFjdAorICAgICAqIHN0YXJ0aW5nIHZhbHVlcyBmb3IgdGhlIGFuaW1hdGlvbi4gRm9yIGV4YW1wbGUsIGEgQW5pbWF0b3JTZXQgb2JqZWN0IHdpbGwgcGFzcworICAgICAqIHRoaXMgY2FsbCB0byBpdHMgY2hpbGQgb2JqZWN0cyB0byB0ZWxsIHRoZW0gdG8gc2V0IHVwIHRoZSB2YWx1ZXMuIEEKKyAgICAgKiBPYmplY3RBbmltYXRvciBvYmplY3Qgd2lsbCB1c2UgdGhlIGluZm9ybWF0aW9uIGl0IGhhcyBhYm91dCBpdHMgdGFyZ2V0IG9iamVjdAorICAgICAqIGFuZCBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzIHRvIGdldCB0aGUgc3RhcnQgdmFsdWVzIGZvciBpdHMgcHJvcGVydGllcy4KKyAgICAgKiBBbiBWYWx1ZUFuaW1hdG9yIG9iamVjdCB3aWxsIGlnbm9yZSB0aGUgcmVxdWVzdCBzaW5jZSBpdCBkb2VzIG5vdCBoYXZlIGVub3VnaAorICAgICAqIGluZm9ybWF0aW9uIChzdWNoIGFzIGEgdGFyZ2V0IG9iamVjdCkgdG8gZ2F0aGVyIHRoZXNlIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXR1cFN0YXJ0VmFsdWVzKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHRlbGxzIHRoZSBvYmplY3QgdG8gdXNlIGFwcHJvcHJpYXRlIGluZm9ybWF0aW9uIHRvIGV4dHJhY3QKKyAgICAgKiBlbmRpbmcgdmFsdWVzIGZvciB0aGUgYW5pbWF0aW9uLiBGb3IgZXhhbXBsZSwgYSBBbmltYXRvclNldCBvYmplY3Qgd2lsbCBwYXNzCisgICAgICogdGhpcyBjYWxsIHRvIGl0cyBjaGlsZCBvYmplY3RzIHRvIHRlbGwgdGhlbSB0byBzZXQgdXAgdGhlIHZhbHVlcy4gQQorICAgICAqIE9iamVjdEFuaW1hdG9yIG9iamVjdCB3aWxsIHVzZSB0aGUgaW5mb3JtYXRpb24gaXQgaGFzIGFib3V0IGl0cyB0YXJnZXQgb2JqZWN0CisgICAgICogYW5kIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMgdG8gZ2V0IHRoZSBzdGFydCB2YWx1ZXMgZm9yIGl0cyBwcm9wZXJ0aWVzLgorICAgICAqIEFuIFZhbHVlQW5pbWF0b3Igb2JqZWN0IHdpbGwgaWdub3JlIHRoZSByZXF1ZXN0IHNpbmNlIGl0IGRvZXMgbm90IGhhdmUgZW5vdWdoCisgICAgICogaW5mb3JtYXRpb24gKHN1Y2ggYXMgYSB0YXJnZXQgb2JqZWN0KSB0byBnYXRoZXIgdGhlc2UgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldHVwRW5kVmFsdWVzKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRhcmdldCBvYmplY3Qgd2hvc2UgcHJvcGVydHkgd2lsbCBiZSBhbmltYXRlZCBieSB0aGlzIGFuaW1hdGlvbi4gTm90IGFsbCBzdWJjbGFzc2VzCisgICAgICogb3BlcmF0ZSBvbiB0YXJnZXQgb2JqZWN0cyAoZm9yIGV4YW1wbGUsIHtAbGluayBWYWx1ZUFuaW1hdG9yfSwgYnV0IHRoaXMgbWV0aG9kCisgICAgICogaXMgb24gdGhlIHN1cGVyY2xhc3MgZm9yIHRoZSBjb252ZW5pZW5jZSBvZiBkZWFsaW5nIGdlbmVyaWNhbGx5IHdpdGggdGhvc2Ugc3ViY2xhc3NlcworICAgICAqIHRoYXQgZG8gaGFuZGxlIHRhcmdldHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3QgYmVpbmcgYW5pbWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoT2JqZWN0IHRhcmdldCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkFuIGFuaW1hdGlvbiBsaXN0ZW5lciByZWNlaXZlcyBub3RpZmljYXRpb25zIGZyb20gYW4gYW5pbWF0aW9uLgorICAgICAqIE5vdGlmaWNhdGlvbnMgaW5kaWNhdGUgYW5pbWF0aW9uIHJlbGF0ZWQgZXZlbnRzLCBzdWNoIGFzIHRoZSBlbmQgb3IgdGhlCisgICAgICogcmVwZXRpdGlvbiBvZiB0aGUgYW5pbWF0aW9uLjwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBBbmltYXRvckxpc3RlbmVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPk5vdGlmaWVzIHRoZSBzdGFydCBvZiB0aGUgYW5pbWF0aW9uLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW1hdGlvbiBUaGUgc3RhcnRlZCBhbmltYXRpb24uCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0b3IgYW5pbWF0aW9uKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Tm90aWZpZXMgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLiBUaGlzIGNhbGxiYWNrIGlzIG5vdCBpbnZva2VkCisgICAgICAgICAqIGZvciBhbmltYXRpb25zIHdpdGggcmVwZWF0IGNvdW50IHNldCB0byBJTkZJTklURS48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltYXRpb24gVGhlIGFuaW1hdGlvbiB3aGljaCByZWFjaGVkIGl0cyBlbmQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdG9yIGFuaW1hdGlvbik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPk5vdGlmaWVzIHRoZSBjYW5jZWxsYXRpb24gb2YgdGhlIGFuaW1hdGlvbi4gVGhpcyBjYWxsYmFjayBpcyBub3QgaW52b2tlZAorICAgICAgICAgKiBmb3IgYW5pbWF0aW9ucyB3aXRoIHJlcGVhdCBjb3VudCBzZXQgdG8gSU5GSU5JVEUuPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYW5pbWF0aW9uIFRoZSBhbmltYXRpb24gd2hpY2ggd2FzIGNhbmNlbGVkLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBvbkFuaW1hdGlvbkNhbmNlbChBbmltYXRvciBhbmltYXRpb24pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5Ob3RpZmllcyB0aGUgcmVwZXRpdGlvbiBvZiB0aGUgYW5pbWF0aW9uLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIHdoaWNoIHdhcyByZXBlYXRlZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0b3IgYW5pbWF0aW9uKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3JJbmZsYXRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdG9ySW5mbGF0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDE2NDU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdG9ySW5mbGF0ZXIuamF2YQpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBpbnN0YW50aWF0ZSBtZW51IFhNTCBmaWxlcyBpbnRvIEFuaW1hdG9yIG9iamVjdHMuCisgKiA8cD4KKyAqIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBtZW51IGluZmxhdGlvbiByZWxpZXMgaGVhdmlseSBvbiBwcmUtcHJvY2Vzc2luZyBvZgorICogWE1MIGZpbGVzIHRoYXQgaXMgZG9uZSBhdCBidWlsZCB0aW1lLiBUaGVyZWZvcmUsIGl0IGlzIG5vdCBjdXJyZW50bHkgcG9zc2libGUKKyAqIHRvIHVzZSBNZW51SW5mbGF0ZXIgd2l0aCBhbiBYbWxQdWxsUGFyc2VyIG92ZXIgYSBwbGFpbiBYTUwgZmlsZSBhdCBydW50aW1lOworICogaXQgb25seSB3b3JrcyB3aXRoIGFuIFhtbFB1bGxQYXJzZXIgcmV0dXJuZWQgZnJvbSBhIGNvbXBpbGVkIHJlc291cmNlIChSLgorICogPGVtPnNvbWV0aGluZzwvZW0+IGZpbGUuKQorICovCitwdWJsaWMgY2xhc3MgQW5pbWF0b3JJbmZsYXRlciB7CisKKyAgICAvKioKKyAgICAgKiBUaGVzZSBmbGFncyBhcmUgdXNlZCB3aGVuIHBhcnNpbmcgQW5pbWF0b3JTZXQgb2JqZWN0cworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT0dFVEhFUiA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFUVVFTlRJQUxMWSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBFbnVtIHZhbHVlcyB1c2VkIGluIFhNTCBhdHRyaWJ1dGVzIHRvIGluZGljYXRlIHRoZSB2YWx1ZSBmb3IgbVZhbHVlVHlwZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxVRV9UWVBFX0ZMT0FUICAgICAgID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfVFlQRV9JTlQgICAgICAgICA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTFVFX1RZUEVfRE9VQkxFICAgICAgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxVRV9UWVBFX0NPTE9SICAgICAgID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfVFlQRV9DVVNUT00gICAgICA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhbiB7QGxpbmsgQW5pbWF0b3J9IG9iamVjdCBmcm9tIGEgcmVzb3VyY2UKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IEFwcGxpY2F0aW9uIGNvbnRleHQgdXNlZCB0byBhY2Nlc3MgcmVzb3VyY2VzCisgICAgICogQHBhcmFtIGlkIFRoZSByZXNvdXJjZSBpZCBvZiB0aGUgYW5pbWF0aW9uIHRvIGxvYWQKKyAgICAgKiBAcmV0dXJuIFRoZSBhbmltYXRvciBvYmplY3QgcmVmZXJlbmNlIGJ5IHRoZSBzcGVjaWZpZWQgaWQKKyAgICAgKiBAdGhyb3dzIGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uIHdoZW4gdGhlIGFuaW1hdGlvbiBjYW5ub3QgYmUgbG9hZGVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBbmltYXRvciBsb2FkQW5pbWF0b3IoQ29udGV4dCBjb250ZXh0LCBpbnQgaWQpCisgICAgICAgICAgICB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24geworCisgICAgICAgIFhtbFJlc291cmNlUGFyc2VyIHBhcnNlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXJzZXIgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldEFuaW1hdGlvbihpZCk7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlQW5pbWF0b3JGcm9tWG1sKGNvbnRleHQsIHBhcnNlcik7CisgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiBybmYgPQorICAgICAgICAgICAgICAgICAgICBuZXcgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uKCJDYW4ndCBsb2FkIGFuaW1hdGlvbiByZXNvdXJjZSBJRCAjMHgiICsKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhpZCkpOworICAgICAgICAgICAgcm5mLmluaXRDYXVzZShleCk7CisgICAgICAgICAgICB0aHJvdyBybmY7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24gcm5mID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbigiQ2FuJ3QgbG9hZCBhbmltYXRpb24gcmVzb3VyY2UgSUQgIzB4IiArCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9IZXhTdHJpbmcoaWQpKTsKKyAgICAgICAgICAgIHJuZi5pbml0Q2F1c2UoZXgpOworICAgICAgICAgICAgdGhyb3cgcm5mOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHBhcnNlciAhPSBudWxsKSBwYXJzZXIuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEFuaW1hdG9yIGNyZWF0ZUFuaW1hdG9yRnJvbVhtbChDb250ZXh0IGMsIFhtbFB1bGxQYXJzZXIgcGFyc2VyKQorICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICByZXR1cm4gY3JlYXRlQW5pbWF0b3JGcm9tWG1sKGMsIHBhcnNlciwgWG1sLmFzQXR0cmlidXRlU2V0KHBhcnNlciksIG51bGwsIDApOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEFuaW1hdG9yIGNyZWF0ZUFuaW1hdG9yRnJvbVhtbChDb250ZXh0IGMsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgQXR0cmlidXRlU2V0IGF0dHJzLCBBbmltYXRvclNldCBwYXJlbnQsIGludCBzZXF1ZW5jZU9yZGVyaW5nKQorICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBBbmltYXRvciBhbmltID0gbnVsbDsKKyAgICAgICAgQXJyYXlMaXN0PEFuaW1hdG9yPiBjaGlsZEFuaW1zID0gbnVsbDsKKworICAgICAgICAvLyBNYWtlIHN1cmUgd2UgYXJlIG9uIGEgc3RhcnQgdGFnLgorICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgaW50IGRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisKKyAgICAgICAgd2hpbGUgKCgodHlwZT1wYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcgfHwgcGFyc2VyLmdldERlcHRoKCkgPiBkZXB0aCkKKyAgICAgICAgICAgICAgICYmIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKworICAgICAgICAgICAgaWYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nICBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKworICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJvYmplY3RBbmltYXRvciIpKSB7CisgICAgICAgICAgICAgICAgYW5pbSA9IGxvYWRPYmplY3RBbmltYXRvcihjLCBhdHRycyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJhbmltYXRvciIpKSB7CisgICAgICAgICAgICAgICAgYW5pbSA9IGxvYWRBbmltYXRvcihjLCBhdHRycywgbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJzZXQiKSkgeworICAgICAgICAgICAgICAgIGFuaW0gPSBuZXcgQW5pbWF0b3JTZXQoKTsKKyAgICAgICAgICAgICAgICBUeXBlZEFycmF5IGEgPSBjLm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvclNldCk7CisgICAgICAgICAgICAgICAgaW50IG9yZGVyaW5nID0gYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JTZXRfb3JkZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBUT0dFVEhFUik7CisgICAgICAgICAgICAgICAgY3JlYXRlQW5pbWF0b3JGcm9tWG1sKGMsIHBhcnNlciwgYXR0cnMsIChBbmltYXRvclNldCkgYW5pbSwgIG9yZGVyaW5nKTsKKyAgICAgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVua25vd24gYW5pbWF0b3IgbmFtZTogIiArIHBhcnNlci5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGRBbmltcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkQW5pbXMgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yPigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGlsZEFuaW1zLmFkZChhbmltKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocGFyZW50ICE9IG51bGwgJiYgY2hpbGRBbmltcyAhPSBudWxsKSB7CisgICAgICAgICAgICBBbmltYXRvcltdIGFuaW1zQXJyYXkgPSBuZXcgQW5pbWF0b3JbY2hpbGRBbmltcy5zaXplKCldOworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIGZvciAoQW5pbWF0b3IgYSA6IGNoaWxkQW5pbXMpIHsKKyAgICAgICAgICAgICAgICBhbmltc0FycmF5W2luZGV4KytdID0gYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZXF1ZW5jZU9yZGVyaW5nID09IFRPR0VUSEVSKSB7CisgICAgICAgICAgICAgICAgcGFyZW50LnBsYXlUb2dldGhlcihhbmltc0FycmF5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFyZW50LnBsYXlTZXF1ZW50aWFsbHkoYW5pbXNBcnJheSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYW5pbTsKKworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdEFuaW1hdG9yIGxvYWRPYmplY3RBbmltYXRvcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykKKyAgICAgICAgICAgIHRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgT2JqZWN0QW5pbWF0b3IgYW5pbSA9IG5ldyBPYmplY3RBbmltYXRvcigpOworCisgICAgICAgIGxvYWRBbmltYXRvcihjb250ZXh0LCBhdHRycywgYW5pbSk7CisKKyAgICAgICAgVHlwZWRBcnJheSBhID0KKyAgICAgICAgICAgICAgICBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByb3BlcnR5QW5pbWF0b3IpOworCisgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5Qcm9wZXJ0eUFuaW1hdG9yX3Byb3BlcnR5TmFtZSk7CisKKyAgICAgICAgYW5pbS5zZXRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKTsKKworICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICByZXR1cm4gYW5pbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGFuaW1hdGlvbiB3aG9zZSBwYXJhbWV0ZXJzIGNvbWUgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbnRleHQgYW5kCisgICAgICogYXR0cmlidXRlcyBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgYXBwbGljYXRpb24gZW52aXJvbm1lbnQKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIHNldCBvZiBhdHRyaWJ1dGVzIGhvbGRpbmcgdGhlIGFuaW1hdGlvbiBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgVmFsdWVBbmltYXRvciBsb2FkQW5pbWF0b3IoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIFZhbHVlQW5pbWF0b3IgYW5pbSkKKyAgICAgICAgICAgIHRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgVHlwZWRBcnJheSBhID0KKyAgICAgICAgICAgICAgICBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yKTsKKworICAgICAgICBsb25nIGR1cmF0aW9uID0gYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfZHVyYXRpb24sIDApOworCisgICAgICAgIGxvbmcgc3RhcnREZWxheSA9IGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3N0YXJ0T2Zmc2V0LCAwKTsKKworICAgICAgICBpbnQgdmFsdWVUeXBlID0gYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVUeXBlLAorICAgICAgICAgICAgICAgIFZBTFVFX1RZUEVfRkxPQVQpOworCisgICAgICAgIE9iamVjdCB2YWx1ZUZyb20gPSBudWxsOworICAgICAgICBPYmplY3QgdmFsdWVUbyA9IG51bGw7CisgICAgICAgIFR5cGVFdmFsdWF0b3IgZXZhbHVhdG9yID0gbnVsbDsKKworICAgICAgICBzd2l0Y2ggKHZhbHVlVHlwZSkgeworICAgICAgICAgICAgY2FzZSBWQUxVRV9UWVBFX0ZMT0FUOgorICAgICAgICAgICAgICAgIGlmIChhLmhhc1ZhbHVlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlRnJvbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVGcm9tID0gYS5nZXRGbG9hdChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZUZyb20sIDBmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGEuaGFzVmFsdWUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVUbykpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVUbyA9IGEuZ2V0RmxvYXQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVUbywgMGYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVkFMVUVfVFlQRV9DT0xPUjoKKyAgICAgICAgICAgICAgICBldmFsdWF0b3IgPSBuZXcgUkdCRXZhbHVhdG9yKCk7CisgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIHRvIHBpY2sgdXAgdmFsdWVzCisgICAgICAgICAgICBjYXNlIFZBTFVFX1RZUEVfSU5UOgorICAgICAgICAgICAgICAgIGlmIChhLmhhc1ZhbHVlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlRnJvbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVGcm9tID0gYS5nZXRJbnRlZ2VyKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlRnJvbSwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhLmhhc1ZhbHVlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlVG8gPSBhLmdldEludGVnZXIoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVUbywgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWQUxVRV9UWVBFX0RPVUJMRToKKyAgICAgICAgICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZUZyb20pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlRnJvbSA9IChEb3VibGUpKChGbG9hdCkoYS5nZXRGbG9hdChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZUZyb20sIDBmKSkpLmRvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhLmhhc1ZhbHVlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlVG8gPSAoRG91YmxlKSgoRmxvYXQpYS5nZXRGbG9hdChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZVRvLCAwZikpLmRvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWQUxVRV9UWVBFX0NVU1RPTToKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBIb3cgdG8gZ2V0IGFuICdPYmplY3QnIHZhbHVlPworICAgICAgICAgICAgICAgIGlmIChhLmhhc1ZhbHVlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlRnJvbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVGcm9tID0gYS5nZXRGbG9hdChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZUZyb20sIDBmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGEuaGFzVmFsdWUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVUbykpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVUbyA9IGEuZ2V0RmxvYXQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVUbywgMGYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhbmltID09IG51bGwpIHsKKyAgICAgICAgICAgIGFuaW0gPSBuZXcgVmFsdWVBbmltYXRvcihkdXJhdGlvbiwgdmFsdWVGcm9tLCB2YWx1ZVRvKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFuaW0uc2V0RHVyYXRpb24oZHVyYXRpb24pOworICAgICAgICAgICAgYW5pbS5zZXRWYWx1ZXModmFsdWVGcm9tLCB2YWx1ZVRvKTsKKyAgICAgICAgfQorCisgICAgICAgIGFuaW0uc2V0U3RhcnREZWxheShzdGFydERlbGF5KTsKKworICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl9yZXBlYXRDb3VudCkpIHsKKyAgICAgICAgICAgIGFuaW0uc2V0UmVwZWF0Q291bnQoCisgICAgICAgICAgICAgICAgICAgIGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3JlcGVhdENvdW50LCAwKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGEuaGFzVmFsdWUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfcmVwZWF0TW9kZSkpIHsKKyAgICAgICAgICAgIGFuaW0uc2V0UmVwZWF0TW9kZSgKKyAgICAgICAgICAgICAgICAgICAgYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfcmVwZWF0TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUFuaW1hdG9yLlJFU1RBUlQpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXZhbHVhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFuaW0uc2V0RXZhbHVhdG9yKGV2YWx1YXRvcik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgcmVzSUQgPQorICAgICAgICAgICAgICAgIGEuZ2V0UmVzb3VyY2VJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl9pbnRlcnBvbGF0b3IsIDApOworICAgICAgICBpZiAocmVzSUQgPiAwKSB7CisgICAgICAgICAgICBhbmltLnNldEludGVycG9sYXRvcihBbmltYXRpb25VdGlscy5sb2FkSW50ZXJwb2xhdG9yKGNvbnRleHQsIHJlc0lEKSk7CisgICAgICAgIH0KKyAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgcmV0dXJuIGFuaW07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdG9yTGlzdGVuZXJBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWQ3MGE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdG9yTGlzdGVuZXJBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKKy8qKgorICogVGhpcyBhZGFwdGVyIGNsYXNzIHByb3ZpZGVzIGVtcHR5IGltcGxlbWVudGF0aW9ucyBvZiB0aGUgbWV0aG9kcyBmcm9tIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci5BbmltYXRvckxpc3RlbmVyfS4KKyAqIEFueSBjdXN0b20gbGlzdGVuZXIgdGhhdCBjYXJlcyBvbmx5IGFib3V0IGEgc3Vic2V0IG9mIHRoZSBtZXRob2RzIG9mIHRoaXMgbGlzdGVuZXIgY2FuCisgKiBzaW1wbHkgc3ViY2xhc3MgdGhpcyBhZGFwdGVyIGNsYXNzIGluc3RlYWQgb2YgaW1wbGVtZW50aW5nIHRoZSBpbnRlcmZhY2UgZGlyZWN0bHkuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBbmltYXRvckxpc3RlbmVyQWRhcHRlciBpbXBsZW1lbnRzIEFuaW1hdG9yLkFuaW1hdG9yTGlzdGVuZXIgeworCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uQ2FuY2VsKEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3JTZXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRvclNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4Mzg1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3JTZXQuamF2YQpAQCAtMCwwICsxLDkzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogVGhpcyBjbGFzcyBwbGF5cyBhIHNldCBvZiB7QGxpbmsgQW5pbWF0b3J9IG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBvcmRlci4gQW5pbWF0aW9ucworICogY2FuIGJlIHNldCB1cCB0byBwbGF5IHRvZ2V0aGVyLCBpbiBzZXF1ZW5jZSwgb3IgYWZ0ZXIgYSBzcGVjaWZpZWQgZGVsYXkuCisgKgorICogPHA+VGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgYXBwcm9hY2hlcyB0byBhZGRpbmcgYW5pbWF0aW9ucyB0byBhIDxjb2RlPkFuaW1hdG9yU2V0PC9jb2RlPjoKKyAqIGVpdGhlciB0aGUge0BsaW5rIEFuaW1hdG9yU2V0I3BsYXlUb2dldGhlcihBbmltYXRvcltdKSBwbGF5VG9nZXRoZXIoKX0gb3IKKyAqIHtAbGluayBBbmltYXRvclNldCNwbGF5U2VxdWVudGlhbGx5KEFuaW1hdG9yW10pIHBsYXlTZXF1ZW50aWFsbHkoKX0gbWV0aG9kcyBjYW4gYmUgY2FsbGVkIHRvIGFkZAorICogYSBzZXQgb2YgYW5pbWF0aW9ucyBhbGwgYXQgb25jZSwgb3IgdGhlIHtAbGluayBBbmltYXRvclNldCNwbGF5KEFuaW1hdG9yKX0gY2FuIGJlCisgKiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggbWV0aG9kcyBpbiB0aGUge0BsaW5rIEFuaW1hdG9yU2V0LkJ1aWxkZXIgQnVpbGRlcn0KKyAqIGNsYXNzIHRvIGFkZCBhbmltYXRpb25zCisgKiBvbmUgYnkgb25lLjwvcD4KKyAqCisgKiA8cD5JdCBpcyBwb3NzaWJsZSB0byBzZXQgdXAgYSA8Y29kZT5BbmltYXRvclNldDwvY29kZT4gd2l0aCBjaXJjdWxhciBkZXBlbmRlbmNpZXMgYmV0d2VlbgorICogaXRzIGFuaW1hdGlvbnMuIEZvciBleGFtcGxlLCBhbiBhbmltYXRpb24gYTEgY291bGQgYmUgc2V0IHVwIHRvIHN0YXJ0IGJlZm9yZSBhbmltYXRpb24gYTIsIGEyCisgKiBiZWZvcmUgYTMsIGFuZCBhMyBiZWZvcmUgYTEuIFRoZSByZXN1bHRzIG9mIHRoaXMgY29uZmlndXJhdGlvbiBhcmUgdW5kZWZpbmVkLCBidXQgd2lsbCB0eXBpY2FsbHkKKyAqIHJlc3VsdCBpbiBub25lIG9mIHRoZSBhZmZlY3RlZCBhbmltYXRpb25zIGJlaW5nIHBsYXllZC4gQmVjYXVzZSBvZiB0aGlzIChhbmQgYmVjYXVzZQorICogY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGRvIG5vdCBtYWtlIGxvZ2ljYWwgc2Vuc2UgYW55d2F5KSwgY2lyY3VsYXIgZGVwZW5kZW5jaWVzCisgKiBzaG91bGQgYmUgYXZvaWRlZCwgYW5kIHRoZSBkZXBlbmRlbmN5IGZsb3cgb2YgYW5pbWF0aW9ucyBzaG91bGQgb25seSBiZSBpbiBvbmUgZGlyZWN0aW9uLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQW5pbWF0b3JTZXQgZXh0ZW5kcyBBbmltYXRvciB7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCB2YXJpYWJsZXMKKyAgICAgKiBOT1RFOiBUaGlzIG9iamVjdCBpbXBsZW1lbnRzIHRoZSBjbG9uZSgpIG1ldGhvZCwgbWFraW5nIGEgZGVlcCBjb3B5IG9mIGFueSByZWZlcmVuY2VkCisgICAgICogb2JqZWN0cy4gQXMgb3RoZXIgbm9uLXRyaXZpYWwgZmllbGRzIGFyZSBhZGRlZCB0byB0aGlzIGNsYXNzLCBtYWtlIHN1cmUgdG8gYWRkIGxvZ2ljCisgICAgICogdG8gY2xvbmUoKSB0byBtYWtlIGRlZXAgY29waWVzIG9mIHRoZW0uCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBUcmFja3MgYW5pbWF0aW9ucyBjdXJyZW50bHkgYmVpbmcgcGxheWVkLCBzbyB0aGF0IHdlIGtub3cgd2hhdCB0bworICAgICAqIGNhbmNlbCBvciBlbmQgd2hlbiBjYW5jZWwoKSBvciBlbmQoKSBpcyBjYWxsZWQgb24gdGhpcyBBbmltYXRvclNldAorICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0PEFuaW1hdG9yPiBtUGxheWluZ1NldCA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0b3I+KCk7CisKKyAgICAvKioKKyAgICAgKiBDb250YWlucyBhbGwgbm9kZXMsIG1hcHBlZCB0byB0aGVpciByZXNwZWN0aXZlIEFuaW1hdG9ycy4gV2hlbiBuZXcKKyAgICAgKiBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGlzIGFkZGVkIGZvciBhbiBBbmltYXRvciwgd2Ugd2FudCB0byBhZGQgaXQKKyAgICAgKiB0byBhIHNpbmdsZSBub2RlIHJlcHJlc2VudGluZyB0aGF0IEFuaW1hdG9yLCBub3QgY3JlYXRlIGEgbmV3IE5vZGUKKyAgICAgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwPEFuaW1hdG9yLCBOb2RlPiBtTm9kZU1hcCA9IG5ldyBIYXNoTWFwPEFuaW1hdG9yLCBOb2RlPigpOworCisgICAgLyoqCisgICAgICogU2V0IG9mIGFsbCBub2RlcyBjcmVhdGVkIGZvciB0aGlzIEFuaW1hdG9yU2V0LiBUaGlzIGxpc3QgaXMgdXNlZCB1cG9uCisgICAgICogc3RhcnRpbmcgdGhlIHNldCwgYW5kIHRoZSBub2RlcyBhcmUgcGxhY2VkIGluIHNvcnRlZCBvcmRlciBpbnRvIHRoZQorICAgICAqIHNvcnRlZE5vZGVzIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8Tm9kZT4gbU5vZGVzID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworCisgICAgLyoqCisgICAgICogVGhlIHNvcnRlZCBsaXN0IG9mIG5vZGVzLiBUaGlzIGlzIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgYW5pbWF0aW9ucyB3aWxsCisgICAgICogYmUgcGxheWVkLiBUaGUgZGV0YWlscyBhYm91dCB3aGVuIGV4YWN0bHkgdGhleSB3aWxsIGJlIHBsYXllZCBkZXBlbmQKKyAgICAgKiBvbiB0aGUgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXBzIG9mIHRoZSBub2Rlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxOb2RlPiBtU29ydGVkTm9kZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgbm9kZXMgc2hvdWxkIGJlIHNvcnRlZCBwcmlvciB0byBwbGF5aW5nLiBUaGlzCisgICAgICogZmxhZyBhbGxvd3MgdXMgdG8gY2FjaGUgdGhlIHByZXZpb3VzIHNvcnRlZCBub2RlcyBzbyB0aGF0IGlmIHRoZSBzZXF1ZW5jZQorICAgICAqIGlzIHJlcGxheWVkIHdpdGggbm8gY2hhbmdlcywgaXQgZG9lcyBub3QgaGF2ZSB0byByZS1zb3J0IHRoZSBub2RlcyBhZ2Fpbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRzU29ydCA9IHRydWU7CisKKyAgICBwcml2YXRlIEFuaW1hdG9yU2V0TGlzdGVuZXIgbVNldExpc3RlbmVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBBbmltYXRvclNldCBoYXMgYmVlbiBjYW5jZWxlZCAoYnkgY2FsbGluZyBjYW5jZWwoKSBvciBlbmQoKSkuCisgICAgICogVGhpcyBmbGFnIGlzIHVzZWQgdG8gYXZvaWQgc3RhcnRpbmcgb3RoZXIgYW5pbWF0aW9ucyB3aGVuIGN1cnJlbnRseS1wbGF5aW5nCisgICAgICogY2hpbGQgYW5pbWF0aW9ucyBvZiB0aGlzIEFuaW1hdG9yU2V0IGVuZC4KKyAgICAgKi8KKyAgICBib29sZWFuIG1DYW5jZWxlZCA9IGZhbHNlOworCisgICAgLy8gVGhlIGFtb3VudCBvZiB0aW1lIGluIG1zIHRvIGRlbGF5IHN0YXJ0aW5nIHRoZSBhbmltYXRpb24gYWZ0ZXIgc3RhcnQoKSBpcyBjYWxsZWQKKyAgICBwcml2YXRlIGxvbmcgbVN0YXJ0RGVsYXkgPSAwOworCisKKyAgICAvLyBIb3cgbG9uZyB0aGUgY2hpbGQgYW5pbWF0aW9ucyBzaG91bGQgbGFzdCBpbiBtcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgbmVnYXRpdmUsIHdoaWNoCisgICAgLy8gc2ltcGx5IG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gZHVyYXRpb24gc2V0IG9uIHRoZSBBbmltYXRvclNldC4gV2hlbiBhIHJlYWwgZHVyYXRpb24gaXMKKyAgICAvLyBzZXQsIGl0IGlzIHBhc3NlZCBhbG9uZyB0byB0aGUgY2hpbGQgYW5pbWF0aW9ucy4KKyAgICBwcml2YXRlIGxvbmcgbUR1cmF0aW9uID0gLTE7CisKKworICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhpcyBBbmltYXRvclNldCB0byBwbGF5IGFsbCBvZiB0aGUgc3VwcGxpZWQgYW5pbWF0aW9ucyBhdCB0aGUgc2FtZSB0aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZW1zIFRoZSBhbmltYXRpb25zIHRoYXQgd2lsbCBiZSBzdGFydGVkIHNpbXVsdGFuZW91c2x5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBsYXlUb2dldGhlcihBbmltYXRvci4uLiBpdGVtcykgeworICAgICAgICBpZiAoaXRlbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbU5lZWRzU29ydCA9IHRydWU7CisgICAgICAgICAgICBCdWlsZGVyIGJ1aWxkZXIgPSBwbGF5KGl0ZW1zWzBdKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLndpdGgoaXRlbXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGlzIEFuaW1hdG9yU2V0IHRvIHBsYXkgZWFjaCBvZiB0aGUgc3VwcGxpZWQgYW5pbWF0aW9ucyB3aGVuIHRoZQorICAgICAqIHByZXZpb3VzIGFuaW1hdGlvbiBlbmRzLgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZW1zIFRoZSBhbmlhbXRpb25zIHRoYXQgd2lsbCBiZSBzdGFydGVkIG9uZSBhZnRlciBhbm90aGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBsYXlTZXF1ZW50aWFsbHkoQW5pbWF0b3IuLi4gaXRlbXMpIHsKKyAgICAgICAgaWYgKGl0ZW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1OZWVkc1NvcnQgPSB0cnVlOworICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgcGxheShpdGVtc1swXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoIC0gMTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIHBsYXkoaXRlbXNbaV0pLmJlZm9yZShpdGVtc1tpKzFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxpc3Qgb2YgY2hpbGQgQW5pbWF0b3Igb2JqZWN0cyBjb250cm9sbGVkIGJ5IHRoaXMKKyAgICAgKiBBbmltYXRvclNldC4gVGhpcyBpcyBhIGNvcHkgb2YgdGhlIGludGVybmFsIGxpc3Q7IG1vZGlmaWNhdGlvbnMgdG8gdGhlIHJldHVybmVkIGxpc3QKKyAgICAgKiB3aWxsIG5vdCBhZmZlY3QgdGhlIEFuaW1hdG9yU2V0LCBhbHRob3VnaCBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIEFuaW1hdG9yIG9iamVjdHMKKyAgICAgKiB3aWxsIGFmZmVjdCB0aG9zZSBvYmplY3RzIGJlaW5nIG1hbmFnZWQgYnkgdGhlIEFuaW1hdG9yU2V0LgorICAgICAqCisgICAgICogQHJldHVybiBBcnJheUxpc3Q8QW5pbWF0b3I+IFRoZSBsaXN0IG9mIGNoaWxkIGFuaW1hdGlvbnMgb2YgdGhpcyBBbmltYXRvclNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXJyYXlMaXN0PEFuaW1hdG9yPiBnZXRDaGlsZEFuaW1hdGlvbnMoKSB7CisgICAgICAgIEFycmF5TGlzdDxBbmltYXRvcj4gY2hpbGRMaXN0ID0gbmV3IEFycmF5TGlzdDxBbmltYXRvcj4oKTsKKyAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtTm9kZXMpIHsKKyAgICAgICAgICAgIGNoaWxkTGlzdC5hZGQobm9kZS5hbmltYXRpb24pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjaGlsZExpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGFyZ2V0IG9iamVjdCBmb3IgYWxsIGN1cnJlbnQge0BsaW5rICNnZXRDaGlsZEFuaW1hdGlvbnMoKSBjaGlsZCBhbmltYXRpb25zfQorICAgICAqIG9mIHRoaXMgQW5pbWF0b3JTZXQgdGhhdCB0YWtlIHRhcmdldHMgKHtAbGluayBPYmplY3RBbmltYXRvcn0gYW5kCisgICAgICogQW5pbWF0b3JTZXQpLgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IGJlaW5nIGFuaW1hdGVkCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE9iamVjdCB0YXJnZXQpIHsKKyAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtTm9kZXMpIHsKKyAgICAgICAgICAgIEFuaW1hdG9yIGFuaW1hdGlvbiA9IG5vZGUuYW5pbWF0aW9uOworICAgICAgICAgICAgaWYgKGFuaW1hdGlvbiBpbnN0YW5jZW9mIEFuaW1hdG9yU2V0KSB7CisgICAgICAgICAgICAgICAgKChBbmltYXRvclNldClhbmltYXRpb24pLnNldFRhcmdldCh0YXJnZXQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhbmltYXRpb24gaW5zdGFuY2VvZiBPYmplY3RBbmltYXRvcikgeworICAgICAgICAgICAgICAgICgoT2JqZWN0QW5pbWF0b3IpYW5pbWF0aW9uKS5zZXRUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIEludGVycG9sYXRvciBmb3IgYWxsIGN1cnJlbnQge0BsaW5rICNnZXRDaGlsZEFuaW1hdGlvbnMoKSBjaGlsZCBhbmltYXRpb25zfQorICAgICAqIG9mIHRoaXMgQW5pbWF0b3JTZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ZXJwb2xhdG9yIHRoZSBpbnRlcnBvbGF0b3IgdG8gYmUgdXNlZCBieSBlYWNoIGNoaWxkIGFuaW1hdGlvbiBvZiB0aGlzIEFuaW1hdG9yU2V0CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0SW50ZXJwb2xhdG9yKEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IpIHsKKyAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtTm9kZXMpIHsKKyAgICAgICAgICAgIG5vZGUuYW5pbWF0aW9uLnNldEludGVycG9sYXRvcihpbnRlcnBvbGF0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdCwgd2hpY2ggaXMgdXNlZCB0bworICAgICAqIHNldCB1cCBwbGF5aW5nIGNvbnN0cmFpbnRzLiBUaGlzIGluaXRpYWwgPGNvZGU+cGxheSgpPC9jb2RlPiBtZXRob2QKKyAgICAgKiB0ZWxscyB0aGUgPGNvZGU+QnVpbGRlcjwvY29kZT4gdGhlIGFuaW1hdGlvbiB0aGF0IGlzIHRoZSBkZXBlbmRlbmN5IGZvcgorICAgICAqIHRoZSBzdWNjZWVkaW5nIGNvbW1hbmRzIHRvIHRoZSA8Y29kZT5CdWlsZGVyPC9jb2RlPi4gRm9yIGV4YW1wbGUsCisgICAgICogY2FsbGluZyA8Y29kZT5wbGF5KGExKS53aXRoKGEyKTwvY29kZT4gc2V0cyB1cCB0aGUgQW5pbWF0b3JTZXQgdG8gcGxheQorICAgICAqIDxjb2RlPmExPC9jb2RlPiBhbmQgPGNvZGU+YTI8L2NvZGU+IGF0IHRoZSBzYW1lIHRpbWUsCisgICAgICogPGNvZGU+cGxheShhMSkuYmVmb3JlKGEyKTwvY29kZT4gc2V0cyB1cCB0aGUgQW5pbWF0b3JTZXQgdG8gcGxheQorICAgICAqIDxjb2RlPmExPC9jb2RlPiBmaXJzdCwgZm9sbG93ZWQgYnkgPGNvZGU+YTI8L2NvZGU+LCBhbmQKKyAgICAgKiA8Y29kZT5wbGF5KGExKS5hZnRlcihhMik8L2NvZGU+IHNldHMgdXAgdGhlIEFuaW1hdG9yU2V0IHRvIHBsYXkKKyAgICAgKiA8Y29kZT5hMjwvY29kZT4gZmlyc3QsIGZvbGxvd2VkIGJ5IDxjb2RlPmExPC9jb2RlPi4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCA8Y29kZT5wbGF5KCk8L2NvZGU+IGlzIHRoZSBvbmx5IHdheSB0byB0ZWxsIHRoZQorICAgICAqIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IHRoZSBhbmltYXRpb24gdXBvbiB3aGljaCB0aGUgZGVwZW5kZW5jeSBpcyBjcmVhdGVkLAorICAgICAqIHNvIHN1Y2Nlc3NpdmUgY2FsbHMgdG8gdGhlIHZhcmlvdXMgZnVuY3Rpb25zIGluIDxjb2RlPkJ1aWxkZXI8L2NvZGU+CisgICAgICogd2lsbCBhbGwgcmVmZXIgdG8gdGhlIGluaXRpYWwgcGFyYW1ldGVyIHN1cHBsaWVkIGluIDxjb2RlPnBsYXkoKTwvY29kZT4KKyAgICAgKiBhcyB0aGUgZGVwZW5kZW5jeSBvZiB0aGUgb3RoZXIgYW5pbWF0aW9ucy4gRm9yIGV4YW1wbGUsIGNhbGxpbmcKKyAgICAgKiA8Y29kZT5wbGF5KGExKS5iZWZvcmUoYTIpLmJlZm9yZShhMyk8L2NvZGU+IHdpbGwgcGxheSBib3RoIDxjb2RlPmEyPC9jb2RlPgorICAgICAqIGFuZCA8Y29kZT5hMzwvY29kZT4gd2hlbiBhMSBlbmRzOyBpdCBkb2VzIG5vdCBzZXQgdXAgYSBkZXBlbmRlbmN5IGJldHdlZW4KKyAgICAgKiA8Y29kZT5hMjwvY29kZT4gYW5kIDxjb2RlPmEzPC9jb2RlPi48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gYW5pbSBUaGUgYW5pbWF0aW9uIHRoYXQgaXMgdGhlIGRlcGVuZGVuY3kgdXNlZCBpbiBsYXRlciBjYWxscyB0byB0aGUKKyAgICAgKiBtZXRob2RzIGluIHRoZSByZXR1cm5lZCA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QuIEEgbnVsbCBwYXJhbWV0ZXIgd2lsbCByZXN1bHQKKyAgICAgKiBpbiBhIG51bGwgPGNvZGU+QnVpbGRlcjwvY29kZT4gcmV0dXJuIHZhbHVlLgorICAgICAqIEByZXR1cm4gQnVpbGRlciBUaGUgb2JqZWN0IHRoYXQgY29uc3RydWN0cyB0aGUgQW5pbWF0b3JTZXQgYmFzZWQgb24gdGhlIGRlcGVuZGVuY2llcworICAgICAqIG91dGxpbmVkIGluIHRoZSBjYWxscyB0byA8Y29kZT5wbGF5PC9jb2RlPiBhbmQgdGhlIG90aGVyIG1ldGhvZHMgaW4gdGhlCisgICAgICogPGNvZGU+QnVpbGRlcjwvY29kZSBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIEJ1aWxkZXIgcGxheShBbmltYXRvciBhbmltKSB7CisgICAgICAgIGlmIChhbmltICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1OZWVkc1NvcnQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKGFuaW0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCBjYW5jZWxpbmcgYSA8Y29kZT5BbmltYXRvclNldDwvY29kZT4gYWxzbyBjYW5jZWxzIGFsbCBvZiB0aGUgYW5pbWF0aW9ucyB0aGF0IGl0IGlzCisgICAgICogcmVzcG9uc2libGUgZm9yLjwvcD4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7CisgICAgICAgIG1DYW5jZWxlZCA9IHRydWU7CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPiB0bXBMaXN0ZW5lcnMgPQorICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+KSBtTGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgICAgICBmb3IgKEFuaW1hdG9yTGlzdGVuZXIgbGlzdGVuZXIgOiB0bXBMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkFuaW1hdGlvbkNhbmNlbCh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobVNvcnRlZE5vZGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoTm9kZSBub2RlIDogbVNvcnRlZE5vZGVzKSB7CisgICAgICAgICAgICAgICAgbm9kZS5hbmltYXRpb24uY2FuY2VsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgZW5kaW5nIGEgPGNvZGU+QW5pbWF0b3JTZXQ8L2NvZGU+IGFsc28gZW5kcyBhbGwgb2YgdGhlIGFuaW1hdGlvbnMgdGhhdCBpdCBpcworICAgICAqIHJlc3BvbnNpYmxlIGZvci48L3A+CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZW5kKCkgeworICAgICAgICBtQ2FuY2VsZWQgPSB0cnVlOworICAgICAgICBpZiAobVNvcnRlZE5vZGVzLnNpemUoKSAhPSBtTm9kZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAvLyBoYXNuJ3QgYmVlbiBzdGFydGVkIHlldCAtIHNvcnQgdGhlIG5vZGVzIG5vdywgdGhlbiBlbmQgdGhlbQorICAgICAgICAgICAgc29ydE5vZGVzKCk7CisgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Tb3J0ZWROb2RlcykgeworICAgICAgICAgICAgICAgIGlmIChtU2V0TGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU2V0TGlzdGVuZXIgPSBuZXcgQW5pbWF0b3JTZXRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9kZS5hbmltYXRpb24uYWRkTGlzdGVuZXIobVNldExpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobVNvcnRlZE5vZGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoTm9kZSBub2RlIDogbVNvcnRlZE5vZGVzKSB7CisgICAgICAgICAgICAgICAgbm9kZS5hbmltYXRpb24uZW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW55IG9mIHRoZSBjaGlsZCBhbmltYXRpb25zIG9mIHRoaXMgQW5pbWF0b3JTZXQgaGF2ZSBiZWVuIHN0YXJ0ZWQgYW5kIGhhdmUgbm90CisgICAgICogeWV0IGVuZGVkLgorICAgICAqIEByZXR1cm4gV2hldGhlciB0aGlzIEFuaW1hdG9yU2V0IGhhcyBiZWVuIHN0YXJ0ZWQgYW5kIGhhcyBub3QgeWV0IGVuZGVkLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKKyAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtTm9kZXMpIHsKKyAgICAgICAgICAgIGlmIChub2RlLmFuaW1hdGlvbi5pc1J1bm5pbmcoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gZGVsYXkgc3RhcnRpbmcgdGhlIGFuaW1hdGlvbiBhZnRlcgorICAgICAqIHtAbGluayAjc3RhcnQoKX0gaXMgY2FsbGVkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBydW5uaW5nIHRoZSBhbmltYXRpb24KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRTdGFydERlbGF5KCkgeworICAgICAgICByZXR1cm4gbVN0YXJ0RGVsYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRvIGRlbGF5IHN0YXJ0aW5nIHRoZSBhbmltYXRpb24gYWZ0ZXIKKyAgICAgKiB7QGxpbmsgI3N0YXJ0KCl9IGlzIGNhbGxlZC4KKworICAgICAqIEBwYXJhbSBzdGFydERlbGF5IFRoZSBhbW91bnQgb2YgdGhlIGRlbGF5LCBpbiBtaWxsaXNlY29uZHMKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydERlbGF5KGxvbmcgc3RhcnREZWxheSkgeworICAgICAgICBtU3RhcnREZWxheSA9IHN0YXJ0RGVsYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGVuZ3RoIG9mIGVhY2ggb2YgdGhlIGNoaWxkIGFuaW1hdGlvbnMgb2YgdGhpcyBBbmltYXRvclNldC4gVGhpcyB2YWx1ZSBtYXkKKyAgICAgKiBiZSBsZXNzIHRoYW4gMCwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgbm8gZHVyYXRpb24gaGFzIGJlZW4gc2V0IG9uIHRoaXMgQW5pbWF0b3JTZXQKKyAgICAgKiBhbmQgZWFjaCBvZiB0aGUgY2hpbGQgYW5pbWF0aW9ucyB3aWxsIHVzZSB0aGVpciBvd24gZHVyYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLCBvZiBlYWNoIG9mIHRoZSBjaGlsZAorICAgICAqIGFuaW1hdGlvbnMgb2YgdGhpcyBBbmltYXRvclNldC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXREdXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1EdXJhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsZW5ndGggb2YgZWFjaCBvZiB0aGUgY3VycmVudCBjaGlsZCBhbmltYXRpb25zIG9mIHRoaXMgQW5pbWF0b3JTZXQuIEJ5IGRlZmF1bHQsCisgICAgICogZWFjaCBjaGlsZCBhbmltYXRpb24gd2lsbCB1c2UgaXRzIG93biBkdXJhdGlvbi4gSWYgdGhlIGR1cmF0aW9uIGlzIHNldCBvbiB0aGUgQW5pbWF0b3JTZXQsCisgICAgICogdGhlbiBlYWNoIGNoaWxkIGFuaW1hdGlvbiBpbmhlcml0cyB0aGlzIGR1cmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLCBvZiBlYWNoIG9mIHRoZSBjaGlsZAorICAgICAqIGFuaW1hdGlvbnMgb2YgdGhpcyBBbmltYXRvclNldC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXREdXJhdGlvbihsb25nIGR1cmF0aW9uKSB7CisgICAgICAgIGlmIChkdXJhdGlvbiA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cmF0aW9uIG11c3QgYmUgYSB2YWx1ZSBvZiB6ZXJvIG9yIGdyZWF0ZXIiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Ob2RlcykgeworICAgICAgICAgICAgLy8gVE9ETzogZG9uJ3Qgc2V0IHRoZSBkdXJhdGlvbiBvZiB0aGUgdGltaW5nLW9ubHkgbm9kZXMgY3JlYXRlZCBieSBBbmltYXRvclNldCB0bworICAgICAgICAgICAgLy8gaW5zZXJ0ICJwbGF5LWFmdGVyIiBkZWxheXMKKyAgICAgICAgICAgIG5vZGUuYW5pbWF0aW9uLnNldER1cmF0aW9uKGR1cmF0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBtRHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICoKKyAgICAgKiA8cD5TdGFydGluZyB0aGlzIDxjb2RlPkFuaW1hdG9yU2V0PC9jb2RlPiB3aWxsLCBpbiB0dXJuLCBzdGFydCB0aGUgYW5pbWF0aW9ucyBmb3Igd2hpY2gKKyAgICAgKiBpdCBpcyByZXNwb25zaWJsZS4gVGhlIGRldGFpbHMgb2Ygd2hlbiBleGFjdGx5IHRob3NlIGFuaW1hdGlvbnMgYXJlIHN0YXJ0ZWQgZGVwZW5kcyBvbgorICAgICAqIHRoZSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcHMgdGhhdCBoYXZlIGJlZW4gc2V0IHVwIGJldHdlZW4gdGhlIGFuaW1hdGlvbnMuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIG1DYW5jZWxlZCA9IGZhbHNlOworCisgICAgICAgIC8vIEZpcnN0LCBzb3J0IHRoZSBub2RlcyAoaWYgbmVjZXNzYXJ5KS4gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHNvcnRlZE5vZGVzCisgICAgICAgIC8vIGNvbnRhaW5zIHRoZSBhbmltYXRpb24gbm9kZXMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuCisgICAgICAgIHNvcnROb2RlcygpOworCisgICAgICAgIC8vIG5vZGVzVG9TdGFydCBob2xkcyB0aGUgbGlzdCBvZiBub2RlcyB0byBiZSBzdGFydGVkIGltbWVkaWF0ZWx5LiBXZSBkb24ndCB3YW50IHRvCisgICAgICAgIC8vIHN0YXJ0IHRoZSBhbmltYXRpb25zIGluIHRoZSBsb29wIGRpcmVjdGx5IGJlY2F1c2Ugd2UgZmlyc3QgbmVlZCB0byBzZXQgdXAKKyAgICAgICAgLy8gZGVwZW5kZW5jaWVzIG9uIGFsbCBvZiB0aGUgbm9kZXMuIEZvciBleGFtcGxlLCB3ZSBkb24ndCB3YW50IHRvIHN0YXJ0IGFuIGFuaW1hdGlvbgorICAgICAgICAvLyB3aGVuIHNvbWUgb3RoZXIgYW5pbWF0aW9uIGFsc28gd2FudHMgdG8gc3RhcnQgd2hlbiB0aGUgZmlyc3QgYW5pbWF0aW9uIGJlZ2lucy4KKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PE5vZGU+IG5vZGVzVG9TdGFydCA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKyAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtU29ydGVkTm9kZXMpIHsKKyAgICAgICAgICAgIGlmIChtU2V0TGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TZXRMaXN0ZW5lciA9IG5ldyBBbmltYXRvclNldExpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5vZGUuZGVwZW5kZW5jaWVzID09IG51bGwgfHwgbm9kZS5kZXBlbmRlbmNpZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBub2Rlc1RvU3RhcnQuYWRkKG5vZGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKERlcGVuZGVuY3kgZGVwZW5kZW5jeSA6IG5vZGUuZGVwZW5kZW5jaWVzKSB7CisgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kubm9kZS5hbmltYXRpb24uYWRkTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlcGVuZGVuY3lMaXN0ZW5lcih0aGlzLCBub2RlLCBkZXBlbmRlbmN5LnJ1bGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9kZS50bXBEZXBlbmRlbmNpZXMgPSAoQXJyYXlMaXN0PERlcGVuZGVuY3k+KSBub2RlLmRlcGVuZGVuY2llcy5jbG9uZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZS5hbmltYXRpb24uYWRkTGlzdGVuZXIobVNldExpc3RlbmVyKTsKKyAgICAgICAgfQorICAgICAgICAvLyBOb3cgdGhhdCBhbGwgZGVwZW5kZW5jaWVzIGFyZSBzZXQgdXAsIHN0YXJ0IHRoZSBhbmltYXRpb25zIHRoYXQgc2hvdWxkIGJlIHN0YXJ0ZWQuCisgICAgICAgIGlmIChtU3RhcnREZWxheSA8PSAwKSB7CisgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG5vZGVzVG9TdGFydCkgeworICAgICAgICAgICAgICAgIG5vZGUuYW5pbWF0aW9uLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgbVBsYXlpbmdTZXQuYWRkKG5vZGUuYW5pbWF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE86IE5lZWQgdG8gY2FuY2VsIG91dCBvZiB0aGUgZGVsYXkgYXBwcm9wcmlhdGVseQorICAgICAgICAgICAgVmFsdWVBbmltYXRvciBkZWxheUFuaW0gPSBuZXcgVmFsdWVBbmltYXRvcihtU3RhcnREZWxheSwgMGYsIDFmKTsKKyAgICAgICAgICAgIGRlbGF5QW5pbS5hZGRMaXN0ZW5lcihuZXcgQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0b3IgYW5pbSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG5vZGVzVG9TdGFydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5hbmltYXRpb24uc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5aW5nU2V0LmFkZChub2RlLmFuaW1hdGlvbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4gdG1wTGlzdGVuZXJzID0KKyAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPikgbUxpc3RlbmVycy5jbG9uZSgpOworICAgICAgICAgICAgZm9yIChBbmltYXRvckxpc3RlbmVyIGxpc3RlbmVyIDogdG1wTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIub25BbmltYXRpb25TdGFydCh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbmltYXRvclNldCBjbG9uZSgpIHsKKyAgICAgICAgZmluYWwgQW5pbWF0b3JTZXQgYW5pbSA9IChBbmltYXRvclNldCkgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIGJhc2ljIGNsb25lKCkgb3BlcmF0aW9uIGNvcGllcyBhbGwgaXRlbXMuIFRoaXMgZG9lc24ndCB3b3JrIHZlcnkgd2VsbCBmb3IKKyAgICAgICAgICogQW5pbWF0b3JTZXQsIGJlY2F1c2UgaXQgd2lsbCBjb3B5IHJlZmVyZW5jZXMgdGhhdCBuZWVkIHRvIGJlIHJlY3JlYXRlZCBhbmQgc3RhdGUKKyAgICAgICAgICogdGhhdCBtYXkgbm90IGFwcGx5LiBXaGF0IHdlIG5lZWQgdG8gZG8gbm93IGlzIHB1dCB0aGUgY2xvbmUgaW4gYW4gdW5pbml0aWFsaXplZAorICAgICAgICAgKiBzdGF0ZSwgd2l0aCBmcmVzaCwgZW1wdHkgZGF0YSBzdHJ1Y3R1cmVzLiBUaGVuIHdlIHdpbGwgYnVpbGQgdXAgdGhlIG5vZGVzIGxpc3QKKyAgICAgICAgICogbWFudWFsbHksIGFzIHdlIGNsb25lIGVhY2ggTm9kZSAoYW5kIGl0cyBhbmltYXRpb24pLiBUaGUgY2xvbmUgd2lsbCB0aGVuIGJlIHNvcnRlZCwKKyAgICAgICAgICogYW5kIHdpbGwgcG9wdWxhdGUgYW55IGFwcHJvcHJpYXRlIGxpc3RzLCB3aGVuIGl0IGlzIHN0YXJ0ZWQuCisgICAgICAgICAqLworICAgICAgICBhbmltLm1OZWVkc1NvcnQgPSB0cnVlOworICAgICAgICBhbmltLm1DYW5jZWxlZCA9IGZhbHNlOworICAgICAgICBhbmltLm1QbGF5aW5nU2V0ID0gbmV3IEFycmF5TGlzdDxBbmltYXRvcj4oKTsKKyAgICAgICAgYW5pbS5tTm9kZU1hcCA9IG5ldyBIYXNoTWFwPEFuaW1hdG9yLCBOb2RlPigpOworICAgICAgICBhbmltLm1Ob2RlcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKyAgICAgICAgYW5pbS5tU29ydGVkTm9kZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisKKyAgICAgICAgLy8gV2FsayB0aHJvdWdoIHRoZSBvbGQgbm9kZXMgbGlzdCwgY2xvbmluZyBlYWNoIG5vZGUgYW5kIGFkZGluZyBpdCB0byB0aGUgbmV3IG5vZGVtYXAuCisgICAgICAgIC8vIE9uZSBwcm9ibGVtIGlzIHRoYXQgdGhlIG9sZCBub2RlIGRlcGVuZGVuY2llcyBwb2ludCB0byBub2RlcyBpbiB0aGUgb2xkIEFuaW1hdG9yU2V0LgorICAgICAgICAvLyBXZSBuZWVkIHRvIHRyYWNrIHRoZSBvbGQvbmV3IG5vZGVzIGluIG9yZGVyIHRvIHJlY29uc3RydWN0IHRoZSBkZXBlbmRlbmNpZXMgaW4gdGhlIGNsb25lLgorICAgICAgICBIYXNoTWFwPE5vZGUsIE5vZGU+IG5vZGVDbG9uZU1hcCA9IG5ldyBIYXNoTWFwPE5vZGUsIE5vZGU+KCk7IC8vIDxvbGQsIG5ldz4KKyAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtTm9kZXMpIHsKKyAgICAgICAgICAgIE5vZGUgbm9kZUNsb25lID0gbm9kZS5jbG9uZSgpOworICAgICAgICAgICAgbm9kZUNsb25lTWFwLnB1dChub2RlLCBub2RlQ2xvbmUpOworICAgICAgICAgICAgYW5pbS5tTm9kZXMuYWRkKG5vZGVDbG9uZSk7CisgICAgICAgICAgICBhbmltLm1Ob2RlTWFwLnB1dChub2RlQ2xvbmUuYW5pbWF0aW9uLCBub2RlQ2xvbmUpOworICAgICAgICAgICAgLy8gQ2xlYXIgb3V0IHRoZSBkZXBlbmRlbmNpZXMgaW4gdGhlIGNsb25lOyB3ZSdsbCBzZXQgdGhlc2UgdXAgbWFudWFsbHkgbGF0ZXIKKyAgICAgICAgICAgIG5vZGVDbG9uZS5kZXBlbmRlbmNpZXMgPSBudWxsOworICAgICAgICAgICAgbm9kZUNsb25lLnRtcERlcGVuZGVuY2llcyA9IG51bGw7CisgICAgICAgICAgICBub2RlQ2xvbmUubm9kZURlcGVuZGVudHMgPSBudWxsOworICAgICAgICAgICAgbm9kZUNsb25lLm5vZGVEZXBlbmRlbmNpZXMgPSBudWxsOworICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGFueSBsaXN0ZW5lcnMgdGhhdCB3ZXJlIHNldCB1cCBieSB0aGUgQW5pbWF0b3JTZXQ7IHRoZXNlIHdpbGwKKyAgICAgICAgICAgIC8vIGJlIHNldCB1cCB3aGVuIHRoZSBjbG9uZSdzIG5vZGVzIGFyZSBzb3J0ZWQKKyAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPiBjbG9uZUxpc3RlbmVycyA9IG5vZGVDbG9uZS5hbmltYXRpb24uZ2V0TGlzdGVuZXJzKCk7CisgICAgICAgICAgICBpZiAoY2xvbmVMaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPiBsaXN0ZW5lcnNUb1JlbW92ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgZm9yIChBbmltYXRvckxpc3RlbmVyIGxpc3RlbmVyIDogY2xvbmVMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgQW5pbWF0b3JTZXRMaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1RvUmVtb3ZlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyc1RvUmVtb3ZlLmFkZChsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1RvUmVtb3ZlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChBbmltYXRvckxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzVG9SZW1vdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gTm93IHRoYXQgd2UndmUgY2xvbmVkIGFsbCBvZiB0aGUgbm9kZXMsIHdlJ3JlIHJlYWR5IHRvIHdhbGsgdGhyb3VnaCB0aGVpcgorICAgICAgICAvLyBkZXBlbmRlbmNpZXMsIG1hcHBpbmcgdGhlIG9sZCBkZXBlbmRlbmNpZXMgdG8gdGhlIG5ldyBub2RlcworICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Ob2RlcykgeworICAgICAgICAgICAgTm9kZSBub2RlQ2xvbmUgPSBub2RlQ2xvbmVNYXAuZ2V0KG5vZGUpOworICAgICAgICAgICAgaWYgKG5vZGUuZGVwZW5kZW5jaWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKERlcGVuZGVuY3kgZGVwZW5kZW5jeSA6IG5vZGUuZGVwZW5kZW5jaWVzKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGUgY2xvbmVkRGVwZW5kZW5jeU5vZGUgPSBub2RlQ2xvbmVNYXAuZ2V0KGRlcGVuZGVuY3kubm9kZSk7CisgICAgICAgICAgICAgICAgICAgIERlcGVuZGVuY3kgY2xvbmVEZXBlbmRlbmN5ID0gbmV3IERlcGVuZGVuY3koY2xvbmVkRGVwZW5kZW5jeU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeS5ydWxlKTsKKyAgICAgICAgICAgICAgICAgICAgbm9kZUNsb25lLmFkZERlcGVuZGVuY3koY2xvbmVEZXBlbmRlbmN5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYW5pbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGlzIHRoZSBtZWNoYW5pc20gYnkgd2hpY2ggYW5pbWF0aW9ucyBhcmUgc3RhcnRlZCBiYXNlZCBvbiBldmVudHMgaW4gb3RoZXIKKyAgICAgKiBhbmltYXRpb25zLiBJZiBhbiBhbmltYXRpb24gaGFzIG11bHRpcGxlIGRlcGVuZGVuY2llcyBvbiBvdGhlciBhbmltYXRpb25zLCB0aGVuCisgICAgICogYWxsIGRlcGVuZGVuY2llcyBtdXN0IGJlIHNhdGlzZmllZCBiZWZvcmUgdGhlIGFuaW1hdGlvbiBpcyBzdGFydGVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERlcGVuZGVuY3lMaXN0ZW5lciBpbXBsZW1lbnRzIEFuaW1hdG9yTGlzdGVuZXIgeworCisgICAgICAgIHByaXZhdGUgQW5pbWF0b3JTZXQgbUFuaW1hdG9yU2V0OworCisgICAgICAgIC8vIFRoZSBub2RlIHVwb24gd2hpY2ggdGhlIGRlcGVuZGVuY3kgaXMgYmFzZWQuCisgICAgICAgIHByaXZhdGUgTm9kZSBtTm9kZTsKKworICAgICAgICAvLyBUaGUgRGVwZW5kZW5jeSBydWxlIChXSVRIIG9yIEFGVEVSKSB0aGF0IHRoZSBsaXN0ZW5lciBzaG91bGQgd2FpdCBmb3Igb24KKyAgICAgICAgLy8gdGhlIG5vZGUKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVJ1bGU7CisKKyAgICAgICAgcHVibGljIERlcGVuZGVuY3lMaXN0ZW5lcihBbmltYXRvclNldCBhbmltYXRvclNldCwgTm9kZSBub2RlLCBpbnQgcnVsZSkgeworICAgICAgICAgICAgdGhpcy5tQW5pbWF0b3JTZXQgPSBhbmltYXRvclNldDsKKyAgICAgICAgICAgIHRoaXMubU5vZGUgPSBub2RlOworICAgICAgICAgICAgdGhpcy5tUnVsZSA9IHJ1bGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSWdub3JlIGNhbmNlbCBldmVudHMgZm9yIG5vdy4gV2UgbWF5IHdhbnQgdG8gaGFuZGxlIHRoaXMgZXZlbnR1YWxseSwKKyAgICAgICAgICogdG8gcHJldmVudCBmb2xsb3ctb24gYW5pbWF0aW9ucyBmcm9tIHJ1bm5pbmcgd2hlbiBzb21lIGRlcGVuZGVuY3kKKyAgICAgICAgICogYW5pbWF0aW9uIGlzIGNhbmNlbGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25DYW5jZWwoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQW4gZW5kIGV2ZW50IGlzIHJlY2VpdmVkIC0gc2VlIGlmIHRoaXMgaXMgYW4gZXZlbnQgd2UgYXJlIGxpc3RlbmluZyBmb3IKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaWYgKG1SdWxlID09IERlcGVuZGVuY3kuQUZURVIpIHsKKyAgICAgICAgICAgICAgICBzdGFydElmUmVhZHkoYW5pbWF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJZ25vcmUgcmVwZWF0IGV2ZW50cyBmb3Igbm93CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIHN0YXJ0IGV2ZW50IGlzIHJlY2VpdmVkIC0gc2VlIGlmIHRoaXMgaXMgYW4gZXZlbnQgd2UgYXJlIGxpc3RlbmluZyBmb3IKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgICAgICBpZiAobVJ1bGUgPT0gRGVwZW5kZW5jeS5XSVRIKSB7CisgICAgICAgICAgICAgICAgc3RhcnRJZlJlYWR5KGFuaW1hdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2sgd2hldGhlciB0aGUgZXZlbnQgcmVjZWl2ZWQgaXMgb25lIHRoYXQgdGhlIG5vZGUgd2FzIHdhaXRpbmcgZm9yLgorICAgICAgICAgKiBJZiBzbywgbWFyayBpdCBhcyBjb21wbGV0ZSBhbmQgc2VlIHdoZXRoZXIgaXQncyB0aW1lIHRvIHN0YXJ0CisgICAgICAgICAqIHRoZSBhbmltYXRpb24uCisgICAgICAgICAqIEBwYXJhbSBkZXBlbmRlbmN5QW5pbWF0aW9uIHRoZSBhbmltYXRpb24gdGhhdCBzZW50IHRoZSBldmVudC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBzdGFydElmUmVhZHkoQW5pbWF0b3IgZGVwZW5kZW5jeUFuaW1hdGlvbikgeworICAgICAgICAgICAgaWYgKG1BbmltYXRvclNldC5tQ2FuY2VsZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGFyZW50IEFuaW1hdG9yU2V0IHdhcyBjYW5jZWxlZCwgdGhlbiBkb24ndCBzdGFydCBhbnkgZGVwZW5kZW50IGFuaW1zCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGVwZW5kZW5jeSBkZXBlbmRlbmN5VG9SZW1vdmUgPSBudWxsOworICAgICAgICAgICAgZm9yIChEZXBlbmRlbmN5IGRlcGVuZGVuY3kgOiBtTm9kZS50bXBEZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jeS5ydWxlID09IG1SdWxlICYmCisgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5Lm5vZGUuYW5pbWF0aW9uID09IGRlcGVuZGVuY3lBbmltYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcnVsZSBmaXJlZCAtIHJlbW92ZSB0aGUgZGVwZW5kZW5jeSBhbmQgbGlzdGVuZXIgYW5kIGNoZWNrIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIHNlZSB3aGV0aGVyIGl0J3MgdGltZSB0byBzdGFydCB0aGUgYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lUb1JlbW92ZSA9IGRlcGVuZGVuY3k7CisgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lBbmltYXRpb24ucmVtb3ZlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Ob2RlLnRtcERlcGVuZGVuY2llcy5yZW1vdmUoZGVwZW5kZW5jeVRvUmVtb3ZlKTsKKyAgICAgICAgICAgIGlmIChtTm9kZS50bXBEZXBlbmRlbmNpZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBhbGwgZGVwZW5kZW5jaWVzIHNhdGlzZmllZDogc3RhcnQgdGhlIGFuaW1hdGlvbgorICAgICAgICAgICAgICAgIG1Ob2RlLmFuaW1hdGlvbi5zdGFydCgpOworICAgICAgICAgICAgICAgIG1BbmltYXRvclNldC5tUGxheWluZ1NldC5hZGQobU5vZGUuYW5pbWF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBBbmltYXRvclNldExpc3RlbmVyIGltcGxlbWVudHMgQW5pbWF0b3JMaXN0ZW5lciB7CisKKyAgICAgICAgcHJpdmF0ZSBBbmltYXRvclNldCBtQW5pbWF0b3JTZXQ7CisKKyAgICAgICAgQW5pbWF0b3JTZXRMaXN0ZW5lcihBbmltYXRvclNldCBhbmltYXRvclNldCkgeworICAgICAgICAgICAgbUFuaW1hdG9yU2V0ID0gYW5pbWF0b3JTZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkNhbmNlbChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChtUGxheWluZ1NldC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChBbmltYXRvckxpc3RlbmVyIGxpc3RlbmVyIDogbUxpc3RlbmVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIub25BbmltYXRpb25DYW5jZWwobUFuaW1hdG9yU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGFuaW1hdGlvbi5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIG1QbGF5aW5nU2V0LnJlbW92ZShhbmltYXRpb24pOworICAgICAgICAgICAgTm9kZSBhbmltTm9kZSA9IG1BbmltYXRvclNldC5tTm9kZU1hcC5nZXQoYW5pbWF0aW9uKTsKKyAgICAgICAgICAgIGFuaW1Ob2RlLmRvbmUgPSB0cnVlOworICAgICAgICAgICAgQXJyYXlMaXN0PE5vZGU+IHNvcnRlZE5vZGVzID0gbUFuaW1hdG9yU2V0Lm1Tb3J0ZWROb2RlczsKKyAgICAgICAgICAgIGJvb2xlYW4gYWxsRG9uZSA9IHRydWU7CisgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IHNvcnRlZE5vZGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFub2RlLmRvbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsRG9uZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWxsRG9uZSkgeworICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgd2FzIHRoZSBsYXN0IGNoaWxkIGFuaW1hdGlvbiB0byBlbmQsIHRoZW4gbm90aWZ5IGxpc3RlbmVycyB0aGF0IHRoaXMKKyAgICAgICAgICAgICAgICAvLyBBbmltYXRvclNldCBoYXMgZW5kZWQKKyAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPiB0bXBMaXN0ZW5lcnMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4pIG1MaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChBbmltYXRvckxpc3RlbmVyIGxpc3RlbmVyIDogdG1wTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkFuaW1hdGlvbkVuZChtQW5pbWF0b3JTZXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTm90aGluZyB0byBkbworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8KKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2Qgc29ydHMgdGhlIGN1cnJlbnQgc2V0IG9mIG5vZGVzLCBpZiBuZWVkZWQuIFRoZSBzb3J0IGlzIGEgc2ltcGxlCisgICAgICogRGVwZW5kZW5jeUdyYXBoIHNvcnQsIHdoaWNoIGdvZXMgbGlrZSB0aGlzOgorICAgICAqIC0gQWxsIG5vZGVzIHdpdGhvdXQgZGVwZW5kZW5jaWVzIGJlY29tZSAncm9vdHMnCisgICAgICogLSB3aGlsZSByb290cyBsaXN0IGlzIG5vdCBudWxsCisgICAgICogLSAgIGZvciBlYWNoIHJvb3QgcgorICAgICAqIC0gICAgIGFkZCByIHRvIHNvcnRlZCBsaXN0CisgICAgICogLSAgICAgcmVtb3ZlIHIgYXMgYSBkZXBlbmRlbmN5IGZyb20gYW55IG90aGVyIG5vZGUKKyAgICAgKiAtICAgYW55IG5vZGVzIHdpdGggbm8gZGVwZW5kZW5jaWVzIGFyZSBhZGRlZCB0byB0aGUgcm9vdHMgbGlzdAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzb3J0Tm9kZXMoKSB7CisgICAgICAgIGlmIChtTmVlZHNTb3J0KSB7CisgICAgICAgICAgICBtU29ydGVkTm9kZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIEFycmF5TGlzdDxOb2RlPiByb290cyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKyAgICAgICAgICAgIGZvciAoTm9kZSBub2RlIDogbU5vZGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKG5vZGUuZGVwZW5kZW5jaWVzID09IG51bGwgfHwgbm9kZS5kZXBlbmRlbmNpZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcm9vdHMuYWRkKG5vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFycmF5TGlzdDxOb2RlPiB0bXBSb290cyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKyAgICAgICAgICAgIHdoaWxlIChyb290cy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChOb2RlIHJvb3QgOiByb290cykgeworICAgICAgICAgICAgICAgICAgICBtU29ydGVkTm9kZXMuYWRkKHJvb3QpOworICAgICAgICAgICAgICAgICAgICBpZiAocm9vdC5ub2RlRGVwZW5kZW50cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IHJvb3Qubm9kZURlcGVuZGVudHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVEZXBlbmRlbmNpZXMucmVtb3ZlKHJvb3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVEZXBlbmRlbmNpZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wUm9vdHMuYWRkKG5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByb290cy5jbGVhcigpOworICAgICAgICAgICAgICAgIHJvb3RzLmFkZEFsbCh0bXBSb290cyk7CisgICAgICAgICAgICAgICAgdG1wUm9vdHMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1OZWVkc1NvcnQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtU29ydGVkTm9kZXMuc2l6ZSgpICE9IG1Ob2Rlcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDaXJjdWxhciBkZXBlbmRlbmNpZXMgY2Fubm90IGV4aXN0IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGluIEFuaW1hdG9yU2V0Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBEb2Vzbid0IG5lZWQgc29ydGluZywgYnV0IHN0aWxsIG5lZWQgdG8gYWRkIGluIHRoZSBub2RlRGVwZW5kZW5jaWVzIGxpc3QKKyAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlc2UgZ2V0IHJlbW92ZWQgYXMgdGhlIGV2ZW50IGxpc3RlbmVycyBmaXJlIGFuZCB0aGUgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAvLyBhcmUgc2F0aXNmaWVkCisgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Ob2RlcykgeworICAgICAgICAgICAgICAgIGlmIChub2RlLmRlcGVuZGVuY2llcyAhPSBudWxsICYmIG5vZGUuZGVwZW5kZW5jaWVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChEZXBlbmRlbmN5IGRlcGVuZGVuY3kgOiBub2RlLmRlcGVuZGVuY2llcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZURlcGVuZGVuY2llcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2RlRGVwZW5kZW5jaWVzID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLm5vZGVEZXBlbmRlbmNpZXMuY29udGFpbnMoZGVwZW5kZW5jeS5ub2RlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubm9kZURlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeS5ub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub2RlLmRvbmUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlcGVuZGVuY3kgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5vZGUgdGhhdCBzb21lIG90aGVyIG5vZGUgaXMKKyAgICAgKiBkZXBlbmRlbnQgdXBvbiBhbmQgdGhlIG5hdHVyZSBvZiB0aGF0IGRlcGVuZGVuY3kuCisgICAgICoKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEZXBlbmRlbmN5IHsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBXSVRIID0gMDsgLy8gZGVwZW5kZW50IG5vZGUgbXVzdCBzdGFydCB3aXRoIHRoaXMgZGVwZW5kZW5jeSBub2RlCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQUZURVIgPSAxOyAvLyBkZXBlbmRlbnQgbm9kZSBtdXN0IHN0YXJ0IHdoZW4gdGhpcyBkZXBlbmRlbmN5IG5vZGUgZmluaXNoZXMKKworICAgICAgICAvLyBUaGUgbm9kZSB0aGF0IHRoZSBvdGhlciBub2RlIHdpdGggdGhpcyBEZXBlbmRlbmN5IGlzIGRlcGVuZGVudCB1cG9uCisgICAgICAgIHB1YmxpYyBOb2RlIG5vZGU7CisKKyAgICAgICAgLy8gVGhlIG5hdHVyZSBvZiB0aGUgZGVwZW5kZW5jeSAoV0lUSCBvciBBRlRFUikKKyAgICAgICAgcHVibGljIGludCBydWxlOworCisgICAgICAgIHB1YmxpYyBEZXBlbmRlbmN5KE5vZGUgbm9kZSwgaW50IHJ1bGUpIHsKKyAgICAgICAgICAgIHRoaXMubm9kZSA9IG5vZGU7CisgICAgICAgICAgICB0aGlzLnJ1bGUgPSBydWxlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBOb2RlIGlzIGFuIGVtYm9kaW1lbnQgb2YgYm90aCB0aGUgQW5pbWF0b3IgdGhhdCBpdCB3cmFwcyBhcyB3ZWxsIGFzCisgICAgICogYW55IGRlcGVuZGVuY2llcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBBbmltYXRpb24uIFRoaXMgaW5jbHVkZXMKKyAgICAgKiBib3RoIGRlcGVuZGVuY2llcyB1cG9uIG90aGVyIG5vZGVzIChpbiB0aGUgZGVwZW5kZW5jaWVzIGxpc3QpIGFzCisgICAgICogd2VsbCBhcyBkZXBlbmRlbmNpZXMgb2Ygb3RoZXIgbm9kZXMgdXBvbiB0aGlzIChpbiB0aGUgbm9kZURlcGVuZGVudHMgbGlzdCkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9kZSBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisgICAgICAgIHB1YmxpYyBBbmltYXRvciBhbmltYXRpb247CisKKyAgICAgICAgLyoqCisgICAgICAgICAqICBUaGVzZSBhcmUgdGhlIGRlcGVuZGVuY2llcyB0aGF0IHRoaXMgbm9kZSdzIGFuaW1hdGlvbiBoYXMgb24gb3RoZXIKKyAgICAgICAgICogIG5vZGVzLiBGb3IgZXhhbXBsZSwgaWYgdGhpcyBub2RlJ3MgYW5pbWF0aW9uIHNob3VsZCBiZWdpbiB3aXRoIHNvbWUKKyAgICAgICAgICogIG90aGVyIGFuaW1hdGlvbiBlbmRzLCB0aGVuIHRoZXJlIHdpbGwgYmUgYW4gaXRlbSBpbiB0aGlzIG5vZGUncworICAgICAgICAgKiAgZGVwZW5kZW5jaWVzIGxpc3QgZm9yIHRoYXQgb3RoZXIgYW5pbWF0aW9uJ3Mgbm9kZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBcnJheUxpc3Q8RGVwZW5kZW5jeT4gZGVwZW5kZW5jaWVzID0gbnVsbDsKKworICAgICAgICAvKioKKyAgICAgICAgICogdG1wRGVwZW5kZW5jaWVzIGlzIGEgcnVudGltZSBkZXRhaWwuIFdlIHVzZSB0aGUgZGVwZW5kZW5jaWVzIGxpc3QgZm9yIHNvcnRpbmcuCisgICAgICAgICAqIEJ1dCB3ZSBhbHNvIHVzZSB0aGUgbGlzdCB0byBrZWVwIHRyYWNrIG9mIHdoZW4gbXVsdGlwbGUgZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQsCisgICAgICAgICAqIGJ1dCByZW1vdmluZyBlYWNoIGRlcGVuZGVuY3kgYXMgaXQgaXMgc2F0aXNmaWVkLiBXZSBkbyBub3Qgd2FudCB0byByZW1vdmUKKyAgICAgICAgICogdGhlIGRlcGVuZGVuY3kgaXRzZWxmIGZyb20gdGhlIGxpc3QsIGJlY2F1c2Ugd2UgbmVlZCB0byByZXRhaW4gdGhhdCBpbmZvcm1hdGlvbgorICAgICAgICAgKiBpZiB0aGUgQW5pbWF0b3JTZXQgaXMgbGF1bmNoZWQgaW4gdGhlIGZ1dHVyZS4gU28gd2UgY3JlYXRlIGEgY29weSBvZiB0aGUgZGVwZW5kZW5jeQorICAgICAgICAgKiBsaXN0IHdoZW4gdGhlIEFuaW1hdG9yU2V0IHN0YXJ0cyBhbmQgdXNlIHRoaXMgdG1wRGVwZW5kZW5jaWVzIGxpc3QgdG8gdHJhY2sgdGhlCisgICAgICAgICAqIGxpc3Qgb2Ygc2F0aXNmaWVkIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBcnJheUxpc3Q8RGVwZW5kZW5jeT4gdG1wRGVwZW5kZW5jaWVzID0gbnVsbDsKKworICAgICAgICAvKioKKyAgICAgICAgICogbm9kZURlcGVuZGVuY2llcyBpcyBqdXN0IGEgbGlzdCBvZiB0aGUgbm9kZXMgdGhhdCB0aGlzIE5vZGUgaXMgZGVwZW5kZW50IHVwb24uCisgICAgICAgICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBpbiBzb3J0Tm9kZXMoKSwgdG8gZGV0ZXJtaW5lIHdoZW4gYSBub2RlIGlzIGEgcm9vdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBcnJheUxpc3Q8Tm9kZT4gbm9kZURlcGVuZGVuY2llcyA9IG51bGw7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIG5vZGVEZXBkZW5kZW50cyBpcyB0aGUgbGlzdCBvZiBub2RlcyB0aGF0IGhhdmUgdGhpcyBub2RlIGFzIGEgZGVwZW5kZW5jeS4gVGhpcworICAgICAgICAgKiBpcyBhIHV0aWxpdHkgZmllbGQgdXNlZCBpbiBzb3J0Tm9kZXMgdG8gZmFjaWxpdGF0ZSByZW1vdmluZyB0aGlzIG5vZGUgYXMgYQorICAgICAgICAgKiBkZXBlbmRlbmN5IHdoZW4gaXQgaXMgYSByb290IG5vZGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQXJyYXlMaXN0PE5vZGU+IG5vZGVEZXBlbmRlbnRzID0gbnVsbDsKKworICAgICAgICAvKioKKyAgICAgICAgICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGFuaW1hdGlvbiBpbiB0aGlzIG5vZGUgaXMgZmluaXNoZWQuIFRoaXMgZmxhZworICAgICAgICAgKiBpcyB1c2VkIGJ5IEFuaW1hdG9yU2V0IHRvIGNoZWNrLCBhcyBlYWNoIGFuaW1hdGlvbiBlbmRzLCB3aGV0aGVyIGFsbCBjaGlsZCBhbmltYXRpb25zCisgICAgICAgICAqIGFyZSBkb25lIGFuZCBpdCdzIHRpbWUgdG8gc2VuZCBvdXQgYW4gZW5kIGV2ZW50IGZvciB0aGUgZW50aXJlIEFuaW1hdG9yU2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZG9uZSA9IGZhbHNlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIHRoZSBOb2RlIHdpdGggdGhlIGFuaW1hdGlvbiB0aGF0IGl0IGVuY2Fwc3VsYXRlcy4gQSBOb2RlIGhhcyBubworICAgICAgICAgKiBkZXBlbmRlbmNpZXMgYnkgZGVmYXVsdDsgZGVwZW5kZW5jaWVzIGFyZSBhZGRlZCB2aWEgdGhlIGFkZERlcGVuZGVuY3koKQorICAgICAgICAgKiBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltYXRpb24gVGhlIGFuaW1hdGlvbiB0aGF0IHRoZSBOb2RlIGVuY2Fwc3VsYXRlcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBOb2RlKEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgdGhpcy5hbmltYXRpb24gPSBhbmltYXRpb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgZGVwZW5kZW5jeSB0byB0aGlzIE5vZGUuIFRoZSBkZXBlbmRlbmN5IGluY2x1ZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgICAgICAgKiBub2RlIHRoYXQgdGhpcyBub2RlIGlzIGRlcGVuZGVuY3kgdXBvbiBhbmQgdGhlIG5hdHVyZSBvZiB0aGUgZGVwZW5kZW5jeS4KKyAgICAgICAgICogQHBhcmFtIGRlcGVuZGVuY3kKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZERlcGVuZGVuY3koRGVwZW5kZW5jeSBkZXBlbmRlbmN5KSB7CisgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXlMaXN0PERlcGVuZGVuY3k+KCk7CisgICAgICAgICAgICAgICAgbm9kZURlcGVuZGVuY2llcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7CisgICAgICAgICAgICBpZiAoIW5vZGVEZXBlbmRlbmNpZXMuY29udGFpbnMoZGVwZW5kZW5jeS5ub2RlKSkgeworICAgICAgICAgICAgICAgIG5vZGVEZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kubm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBOb2RlIGRlcGVuZGVuY3lOb2RlID0gZGVwZW5kZW5jeS5ub2RlOworICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3lOb2RlLm5vZGVEZXBlbmRlbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXBlbmRlbmN5Tm9kZS5ub2RlRGVwZW5kZW50cyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlcGVuZGVuY3lOb2RlLm5vZGVEZXBlbmRlbnRzLmFkZCh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTm9kZSBjbG9uZSgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIHN1cGVyLmNsb25lKCk7CisgICAgICAgICAgICAgICAgbm9kZS5hbmltYXRpb24gPSAoQW5pbWF0b3IpIGFuaW1hdGlvbi5jbG9uZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+QnVpbGRlcjwvY29kZT4gb2JqZWN0IGlzIGEgdXRpbGl0eSBjbGFzcyB0byBmYWNpbGl0YXRlIGFkZGluZyBhbmltYXRpb25zIHRvIGEKKyAgICAgKiA8Y29kZT5BbmltYXRvclNldDwvY29kZT4gYWxvbmcgd2l0aCB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZSB2YXJpb3VzIGFuaW1hdGlvbnMuIFRoZQorICAgICAqIGludGVudGlvbiBvZiB0aGUgPGNvZGU+QnVpbGRlcjwvY29kZT4gbWV0aG9kcywgYWxvbmcgd2l0aCB0aGUge0BsaW5rCisgICAgICogQW5pbWF0b3JTZXQjcGxheShBbmltYXRvcikgcGxheSgpfSBtZXRob2Qgb2YgPGNvZGU+QW5pbWF0b3JTZXQ8L2NvZGU+IGlzIHRvIG1ha2UgaXQgcG9zc2libGUgdG8KKyAgICAgKiBleHByZXNzIHRoZSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcHMgb2YgYW5pbWF0aW9ucyBpbiBhIG5hdHVyYWwgd2F5LiBEZXZlbG9wZXJzIGNhbiBhbHNvIHVzZQorICAgICAqIHRoZSB7QGxpbmsgQW5pbWF0b3JTZXQjcGxheVRvZ2V0aGVyKEFuaW1hdG9yW10pIHBsYXlUb2dldGhlcigpfSBhbmQge0BsaW5rCisgICAgICogQW5pbWF0b3JTZXQjcGxheVNlcXVlbnRpYWxseShBbmltYXRvcltdKSBwbGF5U2VxdWVudGlhbGx5KCl9IG1ldGhvZHMgaWYgdGhlc2Ugc3VpdCB0aGUgbmVlZCwKKyAgICAgKiBidXQgaXQgbWlnaHQgYmUgZWFzaWVyIGluIHNvbWUgc2l0dWF0aW9ucyB0byBleHByZXNzIHRoZSBBbmltYXRvclNldCBvZiBhbmltYXRpb25zIGluIHBhaXJzLgorICAgICAqIDxwLz4KKyAgICAgKiA8cD5UaGUgPGNvZGU+QnVpbGRlcjwvY29kZT4gb2JqZWN0IGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSwgYnV0IGlzIHJhdGhlciBjb25zdHJ1Y3RlZAorICAgICAqIGludGVybmFsbHkgdmlhIGEgY2FsbCB0byB7QGxpbmsgQW5pbWF0b3JTZXQjcGxheShBbmltYXRvcil9LjwvcD4KKyAgICAgKiA8cC8+CisgICAgICogPHA+Rm9yIGV4YW1wbGUsIHRoaXMgc2V0cyB1cCBhIEFuaW1hdG9yU2V0IHRvIHBsYXkgYW5pbTEgYW5kIGFuaW0yIGF0IHRoZSBzYW1lIHRpbWUsIGFuaW0zIHRvCisgICAgICogcGxheSB3aGVuIGFuaW0yIGZpbmlzaGVzLCBhbmQgYW5pbTQgdG8gcGxheSB3aGVuIGFuaW0zIGZpbmlzaGVzOjwvcD4KKyAgICAgKiA8cHJlPgorICAgICAqICAgICBBbmltYXRvclNldCBzID0gbmV3IEFuaW1hdG9yU2V0KCk7CisgICAgICogICAgIHMucGxheShhbmltMSkud2l0aChhbmltMik7CisgICAgICogICAgIHMucGxheShhbmltMikuYmVmb3JlKGFuaW0zKTsKKyAgICAgKiAgICAgcy5wbGF5KGFuaW00KS5hZnRlcihhbmltMyk7CisgICAgICogPC9wcmU+CisgICAgICogPHAvPgorICAgICAqIDxwPk5vdGUgaW4gdGhlIGV4YW1wbGUgdGhhdCBib3RoIHtAbGluayBCdWlsZGVyI2JlZm9yZShBbmltYXRvcil9IGFuZCB7QGxpbmsKKyAgICAgKiBCdWlsZGVyI2FmdGVyKEFuaW1hdG9yKX0gYXJlIHVzZWQuIFRoZXNlIGFyZSBqdXN0IGRpZmZlcmVudCB3YXlzIG9mIGV4cHJlc3NpbmcgdGhlIHNhbWUKKyAgICAgKiByZWxhdGlvbnNoaXAgYW5kIGFyZSBwcm92aWRlZCB0byBtYWtlIGl0IGVhc2llciB0byBzYXkgdGhpbmdzIGluIGEgd2F5IHRoYXQgaXMgbW9yZSBuYXR1cmFsLAorICAgICAqIGRlcGVuZGluZyBvbiB0aGUgc2l0dWF0aW9uLjwvcD4KKyAgICAgKiA8cC8+CisgICAgICogPHA+SXQgaXMgcG9zc2libGUgdG8gbWFrZSBzZXZlcmFsIGNhbGxzIGludG8gdGhlIHNhbWUgPGNvZGU+QnVpbGRlcjwvY29kZT4gb2JqZWN0IHRvIGV4cHJlc3MKKyAgICAgKiBtdWx0aXBsZSByZWxhdGlvbnNoaXBzLiBIb3dldmVyLCBub3RlIHRoYXQgaXQgaXMgb25seSB0aGUgYW5pbWF0aW9uIHBhc3NlZCBpbnRvIHRoZSBpbml0aWFsCisgICAgICoge0BsaW5rIEFuaW1hdG9yU2V0I3BsYXkoQW5pbWF0b3IpfSBtZXRob2QgdGhhdCBpcyB0aGUgZGVwZW5kZW5jeSBpbiBhbnkgb2YgdGhlIHN1Y2Nlc3NpdmUKKyAgICAgKiBjYWxscyB0byB0aGUgPGNvZGU+QnVpbGRlcjwvY29kZT4gb2JqZWN0LiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIHN0YXJ0cyBib3RoIGFuaW0yCisgICAgICogYW5kIGFuaW0zIHdoZW4gYW5pbTEgZW5kczsgdGhlcmUgaXMgbm8gZGlyZWN0IGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwIGJldHdlZW4gYW5pbTIgYW5kCisgICAgICogYW5pbTM6CisgICAgICogPHByZT4KKyAgICAgKiAgIEFuaW1hdG9yU2V0IHMgPSBuZXcgQW5pbWF0b3JTZXQoKTsKKyAgICAgKiAgIHMucGxheShhbmltMSkuYmVmb3JlKGFuaW0yKS5iZWZvcmUoYW5pbTMpOworICAgICAqIDwvcHJlPgorICAgICAqIElmIHRoZSBkZXNpcmVkIHJlc3VsdCBpcyB0byBwbGF5IGFuaW0xIHRoZW4gYW5pbTIgdGhlbiBhbmltMywgdGhpcyBjb2RlIGV4cHJlc3NlcyB0aGUKKyAgICAgKiByZWxhdGlvbnNoaXAgY29ycmVjdGx5OjwvcD4KKyAgICAgKiA8cHJlPgorICAgICAqICAgQW5pbWF0b3JTZXQgcyA9IG5ldyBBbmltYXRvclNldCgpOworICAgICAqICAgcy5wbGF5KGFuaW0xKS5iZWZvcmUoYW5pbTIpOworICAgICAqICAgcy5wbGF5KGFuaW0yKS5iZWZvcmUoYW5pbTMpOworICAgICAqIDwvcHJlPgorICAgICAqIDxwLz4KKyAgICAgKiA8cD5Ob3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gZXhwcmVzcyByZWxhdGlvbnNoaXBzIHRoYXQgY2Fubm90IGJlIHJlc29sdmVkIGFuZCB3aWxsIG5vdAorICAgICAqIHJlc3VsdCBpbiBzZW5zaWJsZSByZXN1bHRzLiBGb3IgZXhhbXBsZSwgPGNvZGU+cGxheShhbmltMSkuYWZ0ZXIoYW5pbTEpPC9jb2RlPiBtYWtlcyBubworICAgICAqIHNlbnNlLiBJbiBnZW5lcmFsLCBjaXJjdWxhciBkZXBlbmRlbmNpZXMgbGlrZSB0aGlzIG9uZSAob3IgbW9yZSBpbmRpcmVjdCBvbmVzIHdoZXJlIGEgZGVwZW5kcworICAgICAqIG9uIGIsIHdoaWNoIGRlcGVuZHMgb24gYywgd2hpY2ggZGVwZW5kcyBvbiBhKSBzaG91bGQgYmUgYXZvaWRlZC4gT25seSBjcmVhdGUgQW5pbWF0b3JTZXRzCisgICAgICogdGhhdCBjYW4gYm9pbCBkb3duIHRvIGEgc2ltcGxlLCBvbmUtd2F5IHJlbGF0aW9uc2hpcCBvZiBhbmltYXRpb25zIHN0YXJ0aW5nIHdpdGgsIGJlZm9yZSwgYW5kCisgICAgICogYWZ0ZXIgb3RoZXIsIGRpZmZlcmVudCwgYW5pbWF0aW9ucy48L3A+CisgICAgICovCisgICAgcHVibGljIGNsYXNzIEJ1aWxkZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIHRyYWNrcyB0aGUgY3VycmVudCBub2RlIGJlaW5nIHByb2Nlc3NlZC4gSXQgaXMgc3VwcGxpZWQgdG8gdGhlIHBsYXkoKSBtZXRob2QKKyAgICAgICAgICogb2YgQW5pbWF0b3JTZXQgYW5kIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciBvZiBCdWlsZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBOb2RlIG1DdXJyZW50Tm9kZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogcGFja2FnZS1wcml2YXRlIGNvbnN0cnVjdG9yLiBCdWlsZGVycyBhcmUgb25seSBjb25zdHJ1Y3RlZCBieSBBbmltYXRvclNldCwgd2hlbiB0aGUKKyAgICAgICAgICogcGxheSgpIG1ldGhvZCBpcyBjYWxsZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltIFRoZSBhbmltYXRpb24gdGhhdCBpcyB0aGUgZGVwZW5kZW5jeSBmb3IgdGhlIG90aGVyIGFuaW1hdGlvbnMgcGFzc2VkIGludG8KKyAgICAgICAgICogdGhlIG90aGVyIG1ldGhvZHMgb2YgdGhpcyBCdWlsZGVyIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIEJ1aWxkZXIoQW5pbWF0b3IgYW5pbSkgeworICAgICAgICAgICAgbUN1cnJlbnROb2RlID0gbU5vZGVNYXAuZ2V0KGFuaW0pOworICAgICAgICAgICAgaWYgKG1DdXJyZW50Tm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnROb2RlID0gbmV3IE5vZGUoYW5pbSk7CisgICAgICAgICAgICAgICAgbU5vZGVNYXAucHV0KGFuaW0sIG1DdXJyZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgbU5vZGVzLmFkZChtQ3VycmVudE5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdXAgdGhlIGdpdmVuIGFuaW1hdGlvbiB0byBwbGF5IGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIGFuaW1hdGlvbiBzdXBwbGllZCBpbiB0aGUKKyAgICAgICAgICoge0BsaW5rIEFuaW1hdG9yU2V0I3BsYXkoQW5pbWF0b3IpfSBjYWxsIHRoYXQgY3JlYXRlZCB0aGlzIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW0gVGhlIGFuaW1hdGlvbiB0aGF0IHdpbGwgcGxheSB3aGVuIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgdG8gdGhlCisgICAgICAgICAqIHtAbGluayBBbmltYXRvclNldCNwbGF5KEFuaW1hdG9yKX0gbWV0aG9kIHN0YXJ0cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHdpdGgoQW5pbWF0b3IgYW5pbSkgeworICAgICAgICAgICAgTm9kZSBub2RlID0gbU5vZGVNYXAuZ2V0KGFuaW0pOworICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5vZGUgPSBuZXcgTm9kZShhbmltKTsKKyAgICAgICAgICAgICAgICBtTm9kZU1hcC5wdXQoYW5pbSwgbm9kZSk7CisgICAgICAgICAgICAgICAgbU5vZGVzLmFkZChub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IG5ldyBEZXBlbmRlbmN5KG1DdXJyZW50Tm9kZSwgRGVwZW5kZW5jeS5XSVRIKTsKKyAgICAgICAgICAgIG5vZGUuYWRkRGVwZW5kZW5jeShkZXBlbmRlbmN5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHVwIHRoZSBnaXZlbiBhbmltYXRpb24gdG8gcGxheSB3aGVuIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgaW4gdGhlCisgICAgICAgICAqIHtAbGluayBBbmltYXRvclNldCNwbGF5KEFuaW1hdG9yKX0gY2FsbCB0aGF0IGNyZWF0ZWQgdGhpcyA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QKKyAgICAgICAgICogZW5kcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW0gVGhlIGFuaW1hdGlvbiB0aGF0IHdpbGwgcGxheSB3aGVuIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgdG8gdGhlCisgICAgICAgICAqIHtAbGluayBBbmltYXRvclNldCNwbGF5KEFuaW1hdG9yKX0gbWV0aG9kIGVuZHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBiZWZvcmUoQW5pbWF0b3IgYW5pbSkgeworICAgICAgICAgICAgTm9kZSBub2RlID0gbU5vZGVNYXAuZ2V0KGFuaW0pOworICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5vZGUgPSBuZXcgTm9kZShhbmltKTsKKyAgICAgICAgICAgICAgICBtTm9kZU1hcC5wdXQoYW5pbSwgbm9kZSk7CisgICAgICAgICAgICAgICAgbU5vZGVzLmFkZChub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IG5ldyBEZXBlbmRlbmN5KG1DdXJyZW50Tm9kZSwgRGVwZW5kZW5jeS5BRlRFUik7CisgICAgICAgICAgICBub2RlLmFkZERlcGVuZGVuY3koZGVwZW5kZW5jeSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB1cCB0aGUgZ2l2ZW4gYW5pbWF0aW9uIHRvIHBsYXkgd2hlbiB0aGUgYW5pbWF0aW9uIHN1cHBsaWVkIGluIHRoZQorICAgICAgICAgKiB7QGxpbmsgQW5pbWF0b3JTZXQjcGxheShBbmltYXRvcil9IGNhbGwgdGhhdCBjcmVhdGVkIHRoaXMgPGNvZGU+QnVpbGRlcjwvY29kZT4gb2JqZWN0CisgICAgICAgICAqIHRvIHN0YXJ0IHdoZW4gdGhlIGFuaW1hdGlvbiBzdXBwbGllZCBpbiB0aGlzIG1ldGhvZCBjYWxsIGVuZHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltIFRoZSBhbmltYXRpb24gd2hvc2UgZW5kIHdpbGwgY2F1c2UgdGhlIGFuaW1hdGlvbiBzdXBwbGllZCB0byB0aGUKKyAgICAgICAgICoge0BsaW5rIEFuaW1hdG9yU2V0I3BsYXkoQW5pbWF0b3IpfSBtZXRob2QgdG8gcGxheS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyKEFuaW1hdG9yIGFuaW0pIHsKKyAgICAgICAgICAgIE5vZGUgbm9kZSA9IG1Ob2RlTWFwLmdldChhbmltKTsKKyAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBub2RlID0gbmV3IE5vZGUoYW5pbSk7CisgICAgICAgICAgICAgICAgbU5vZGVNYXAucHV0KGFuaW0sIG5vZGUpOworICAgICAgICAgICAgICAgIG1Ob2Rlcy5hZGQobm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSBuZXcgRGVwZW5kZW5jeShub2RlLCBEZXBlbmRlbmN5LkFGVEVSKTsKKyAgICAgICAgICAgIG1DdXJyZW50Tm9kZS5hZGREZXBlbmRlbmN5KGRlcGVuZGVuY3kpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdXAgdGhlIGFuaW1hdGlvbiBzdXBwbGllZCBpbiB0aGUKKyAgICAgICAgICoge0BsaW5rIEFuaW1hdG9yU2V0I3BsYXkoQW5pbWF0b3IpfSBjYWxsIHRoYXQgY3JlYXRlZCB0aGlzIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdAorICAgICAgICAgKiB0byBwbGF5IHdoZW4gdGhlIGdpdmVuIGFtb3VudCBvZiB0aW1lIGVsYXBzZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkZWxheSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IHNob3VsZCBlbGFwc2UgYmVmb3JlIHRoZQorICAgICAgICAgKiBhbmltYXRpb24gc3RhcnRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXIobG9uZyBkZWxheSkgeworICAgICAgICAgICAgLy8gc2V0dXAgZHVtbXkgVmFsdWVBbmltYXRvciBqdXN0IHRvIHJ1biB0aGUgY2xvY2sKKyAgICAgICAgICAgIGFmdGVyKG5ldyBWYWx1ZUFuaW1hdG9yKGRlbGF5LCAwZiwgMWYpKTsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vRG91YmxlRXZhbHVhdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vRG91YmxlRXZhbHVhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ2ZWIzNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9Eb3VibGVFdmFsdWF0b3IuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworLyoqCisgKiBUaGlzIGV2YWx1YXRvciBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIHR5cGUgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIDxjb2RlPmRvdWJsZTwvY29kZT4gdmFsdWVzLgorICovCitwdWJsaWMgY2xhc3MgRG91YmxlRXZhbHVhdG9yIGltcGxlbWVudHMgVHlwZUV2YWx1YXRvciB7CisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXN1bHQgb2YgbGluZWFybHkgaW50ZXJwb2xhdGluZyB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMsIHdpdGgKKyAgICAgKiA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBwcm9wb3J0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiBUaGUKKyAgICAgKiBjYWxjdWxhdGlvbiBpcyBhIHNpbXBsZSBwYXJhbWV0cmljIGNhbGN1bGF0aW9uOiA8Y29kZT5yZXN1bHQgPSB4MCArIHQgKiAodjEgLSB2MCk8L2NvZGU+LAorICAgICAqIHdoZXJlIDxjb2RlPngwPC9jb2RlPiBpcyA8Y29kZT5zdGFydFZhbHVlPC9jb2RlPiwgPGNvZGU+eDE8L2NvZGU+IGlzIDxjb2RlPmVuZFZhbHVlPC9jb2RlPiwKKyAgICAgKiBhbmQgPGNvZGU+dDwvY29kZT4gaXMgPGNvZGU+ZnJhY3Rpb248L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uICAgVGhlIGZyYWN0aW9uIGZyb20gdGhlIHN0YXJ0aW5nIHRvIHRoZSBlbmRpbmcgdmFsdWVzCisgICAgICogQHBhcmFtIHN0YXJ0VmFsdWUgVGhlIHN0YXJ0IHZhbHVlOyBzaG91bGQgYmUgb2YgdHlwZSA8Y29kZT5kb3VibGU8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgPGNvZGU+RG91YmxlPC9jb2RlPgorICAgICAqIEBwYXJhbSBlbmRWYWx1ZSAgIFRoZSBlbmQgdmFsdWU7IHNob3VsZCBiZSBvZiB0eXBlIDxjb2RlPmRvdWJsZTwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICA8Y29kZT5Eb3VibGU8L2NvZGU+CisgICAgICogQHJldHVybiBBIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLCBnaXZlbiB0aGUKKyAgICAgKiAgICAgICAgIDxjb2RlPmZyYWN0aW9uPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShmbG9hdCBmcmFjdGlvbiwgT2JqZWN0IHN0YXJ0VmFsdWUsIE9iamVjdCBlbmRWYWx1ZSkgeworICAgICAgICBkb3VibGUgc3RhcnREb3VibGUgPSAoKE51bWJlcikgc3RhcnRWYWx1ZSkuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIHN0YXJ0RG91YmxlICsgZnJhY3Rpb24gKiAoKChOdW1iZXIpIGVuZFZhbHVlKS5kb3VibGVWYWx1ZSgpIC0gc3RhcnREb3VibGUpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vRmxvYXRFdmFsdWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9GbG9hdEV2YWx1YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMjA1NGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vRmxvYXRFdmFsdWF0b3IuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworLyoqCisgKiBUaGlzIGV2YWx1YXRvciBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIHR5cGUgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIDxjb2RlPmZsb2F0PC9jb2RlPiB2YWx1ZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBGbG9hdEV2YWx1YXRvciBpbXBsZW1lbnRzIFR5cGVFdmFsdWF0b3IgeworCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXN1bHQgb2YgbGluZWFybHkgaW50ZXJwb2xhdGluZyB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMsIHdpdGgKKyAgICAgKiA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBwcm9wb3J0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiBUaGUKKyAgICAgKiBjYWxjdWxhdGlvbiBpcyBhIHNpbXBsZSBwYXJhbWV0cmljIGNhbGN1bGF0aW9uOiA8Y29kZT5yZXN1bHQgPSB4MCArIHQgKiAodjEgLSB2MCk8L2NvZGU+LAorICAgICAqIHdoZXJlIDxjb2RlPngwPC9jb2RlPiBpcyA8Y29kZT5zdGFydFZhbHVlPC9jb2RlPiwgPGNvZGU+eDE8L2NvZGU+IGlzIDxjb2RlPmVuZFZhbHVlPC9jb2RlPiwKKyAgICAgKiBhbmQgPGNvZGU+dDwvY29kZT4gaXMgPGNvZGU+ZnJhY3Rpb248L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uICAgVGhlIGZyYWN0aW9uIGZyb20gdGhlIHN0YXJ0aW5nIHRvIHRoZSBlbmRpbmcgdmFsdWVzCisgICAgICogQHBhcmFtIHN0YXJ0VmFsdWUgVGhlIHN0YXJ0IHZhbHVlOyBzaG91bGQgYmUgb2YgdHlwZSA8Y29kZT5mbG9hdDwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICA8Y29kZT5GbG9hdDwvY29kZT4KKyAgICAgKiBAcGFyYW0gZW5kVmFsdWUgICBUaGUgZW5kIHZhbHVlOyBzaG91bGQgYmUgb2YgdHlwZSA8Y29kZT5mbG9hdDwvY29kZT4gb3IgPGNvZGU+RmxvYXQ8L2NvZGU+CisgICAgICogQHJldHVybiBBIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLCBnaXZlbiB0aGUKKyAgICAgKiAgICAgICAgIDxjb2RlPmZyYWN0aW9uPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShmbG9hdCBmcmFjdGlvbiwgT2JqZWN0IHN0YXJ0VmFsdWUsIE9iamVjdCBlbmRWYWx1ZSkgeworICAgICAgICBmbG9hdCBzdGFydEZsb2F0ID0gKChOdW1iZXIpIHN0YXJ0VmFsdWUpLmZsb2F0VmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIHN0YXJ0RmxvYXQgKyBmcmFjdGlvbiAqICgoKE51bWJlcikgZW5kVmFsdWUpLmZsb2F0VmFsdWUoKSAtIHN0YXJ0RmxvYXQpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vSW50RXZhbHVhdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vSW50RXZhbHVhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI4ODkyNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9JbnRFdmFsdWF0b3IuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworLyoqCisgKiBUaGlzIGV2YWx1YXRvciBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIHR5cGUgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIDxjb2RlPmludDwvY29kZT4gdmFsdWVzLgorICovCitwdWJsaWMgY2xhc3MgSW50RXZhbHVhdG9yIGltcGxlbWVudHMgVHlwZUV2YWx1YXRvciB7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlc3VsdCBvZiBsaW5lYXJseSBpbnRlcnBvbGF0aW5nIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgd2l0aAorICAgICAqIDxjb2RlPmZyYWN0aW9uPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIHByb3BvcnRpb24gYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMuIFRoZQorICAgICAqIGNhbGN1bGF0aW9uIGlzIGEgc2ltcGxlIHBhcmFtZXRyaWMgY2FsY3VsYXRpb246IDxjb2RlPnJlc3VsdCA9IHgwICsgdCAqICh2MSAtIHYwKTwvY29kZT4sCisgICAgICogd2hlcmUgPGNvZGU+eDA8L2NvZGU+IGlzIDxjb2RlPnN0YXJ0VmFsdWU8L2NvZGU+LCA8Y29kZT54MTwvY29kZT4gaXMgPGNvZGU+ZW5kVmFsdWU8L2NvZGU+LAorICAgICAqIGFuZCA8Y29kZT50PC9jb2RlPiBpcyA8Y29kZT5mcmFjdGlvbjwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gICBUaGUgZnJhY3Rpb24gZnJvbSB0aGUgc3RhcnRpbmcgdG8gdGhlIGVuZGluZyB2YWx1ZXMKKyAgICAgKiBAcGFyYW0gc3RhcnRWYWx1ZSBUaGUgc3RhcnQgdmFsdWU7IHNob3VsZCBiZSBvZiB0eXBlIDxjb2RlPmludDwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICA8Y29kZT5JbnRlZ2VyPC9jb2RlPgorICAgICAqIEBwYXJhbSBlbmRWYWx1ZSAgIFRoZSBlbmQgdmFsdWU7IHNob3VsZCBiZSBvZiB0eXBlIDxjb2RlPmludDwvY29kZT4gb3IgPGNvZGU+SW50ZWdlcjwvY29kZT4KKyAgICAgKiBAcmV0dXJuIEEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMsIGdpdmVuIHRoZQorICAgICAqICAgICAgICAgPGNvZGU+ZnJhY3Rpb248L2NvZGU+IHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKGZsb2F0IGZyYWN0aW9uLCBPYmplY3Qgc3RhcnRWYWx1ZSwgT2JqZWN0IGVuZFZhbHVlKSB7CisgICAgICAgIGludCBzdGFydEludCA9ICgoTnVtYmVyKSBzdGFydFZhbHVlKS5pbnRWYWx1ZSgpOworICAgICAgICByZXR1cm4gKGludCkgKHN0YXJ0SW50ICsgZnJhY3Rpb24gKiAoKChOdW1iZXIpIGVuZFZhbHVlKS5pbnRWYWx1ZSgpIC0gc3RhcnRJbnQpKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0tleWZyYW1lLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vS2V5ZnJhbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTJiYTVjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0tleWZyYW1lLmphdmEKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7CisKKy8qKgorICogVGhpcyBjbGFzcyBob2xkcyBhIHRpbWUvdmFsdWUgcGFpciBmb3IgYW4gYW5pbWF0aW9uLiBUaGUgS2V5ZnJhbWUgY2xhc3MgaXMgdXNlZAorICogYnkge0BsaW5rIFZhbHVlQW5pbWF0b3J9IHRvIGRlZmluZSB0aGUgdmFsdWVzIHRoYXQgdGhlIGFuaW1hdGlvbiB0YXJnZXQgd2lsbCBoYXZlIG92ZXIgdGhlIGNvdXJzZQorICogb2YgdGhlIGFuaW1hdGlvbi4gQXMgdGhlIHRpbWUgcHJvY2VlZHMgZnJvbSBvbmUga2V5ZnJhbWUgdG8gdGhlIG90aGVyLCB0aGUgdmFsdWUgb2YgdGhlCisgKiB0YXJnZXQgb2JqZWN0IHdpbGwgYW5pbWF0ZSBiZXR3ZWVuIHRoZSB2YWx1ZSBhdCB0aGUgcHJldmlvdXMga2V5ZnJhbWUgYW5kIHRoZSB2YWx1ZSBhdCB0aGUKKyAqIG5leHQga2V5ZnJhbWUuIEVhY2gga2V5ZnJhbWUgYWxzbyBob2xkcyBhbiBvcHRpb24ge0BsaW5rIGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yfQorICogb2JqZWN0LCB3aGljaCBkZWZpbmVzIHRoZSB0aW1lIGludGVycG9sYXRpb24gb3ZlciB0aGUgaW50ZXJ2YWx1ZSBwcmVjZWRpbmcgdGhlIGtleWZyYW1lLgorICovCitwdWJsaWMgY2xhc3MgS2V5ZnJhbWUgaW1wbGVtZW50cyBDbG9uZWFibGUgeworICAgIC8qKgorICAgICAqIFRoZSB0aW1lIGF0IHdoaWNoIG1WYWx1ZSB3aWxsIGhvbGQgdHJ1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1GcmFjdGlvbjsKKworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgYW5pbWF0aW9uIGF0IHRoZSB0aW1lIG1GcmFjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBtVmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgaW4gdGhpcyBLZXlmcmFtZS4gVGhpcyB0eXBlIGlzIGRldGVybWluZWQgYXQgY29uc3RydWN0aW9uIHRpbWUsCisgICAgICogYmFzZWQgb24gdGhlIHR5cGUgb2YgdGhlIDxjb2RlPnZhbHVlPC9jb2RlPiBvYmplY3QgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHByaXZhdGUgQ2xhc3MgbVZhbHVlVHlwZTsKKworICAgIC8qKgorICAgICAqIFRoZSBvcHRpb25hbCB0aW1lIGludGVycG9sYXRvciBmb3IgdGhlIGludGVydmFsIHByZWNlZGluZyB0aGlzIGtleWZyYW1lLiBBIG51bGwgaW50ZXJwb2xhdG9yCisgICAgICogKHRoZSBkZWZhdWx0KSByZXN1bHRzIGluIGxpbmVhciBpbnRlcnBvbGF0aW9uIG92ZXIgdGhlIGludGVydmFsLgorICAgICAqLworICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1JbnRlcnBvbGF0b3IgPSBudWxsOworCisgICAgLyoqCisgICAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciwgY2FsbGVkIGZyb20gdGhlIHB1YmxpYyBjb25zdHJ1Y3RvcnMgd2l0aCB0aGUgYWRkaXRpb25hbAorICAgICAqIDxjb2RlPnZhbHVlVHlwZTwvY29kZT4gcGFyYW1ldGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSB0aW1lLCBleHByZXNzZWQgYXMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIHJlcHJlc2VudGluZyB0aGUgZnJhY3Rpb24KKyAgICAgKiBvZiB0aW1lIGVsYXBzZWQgb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uIGR1cmF0aW9uLgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgb2JqZWN0IHdpbGwgYW5pbWF0ZSB0byBhcyB0aGUgYW5pbWF0aW9uIHRpbWUgYXBwcm9hY2hlcworICAgICAqIHRoZSB0aW1lIGluIHRoaXMga2V5ZnJhbWUsIGFuZCB0aGUgdGhlIHZhbHVlIGFuaW1hdGVkIGZyb20gYXMgdGhlIHRpbWUgcGFzc2VzIHRoZSB0aW1lIGluCisgICAgICogdGhpcyBrZXlmcmFtZS4KKyAgICAgKiBAcGFyYW0gdmFsdWVUeXBlIFRoZSB0eXBlIG9mIHRoZSA8Y29kZT52YWx1ZTwvY29kZT4gb2JqZWN0LiBUaGlzIGlzIHVzZWQgYnkgdGhlCisgICAgICoge0BsaW5rICNnZXRWYWx1ZSgpfSBmdW5jdGlvbm0sIHdoaWNoIGlzIHF1ZXJpZWQgYnkge0BsaW5rIFZhbHVlQW5pbWF0b3J9IHRvIGRldGVybWluZQorICAgICAqIHRoZSB0eXBlIG9mIHtAbGluayBUeXBlRXZhbHVhdG9yfSB0byB1c2UgdG8gaW50ZXJwb2xhdGUgYmV0d2VlbiB2YWx1ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBLZXlmcmFtZShmbG9hdCBmcmFjdGlvbiwgT2JqZWN0IHZhbHVlLCBDbGFzcyB2YWx1ZVR5cGUpIHsKKyAgICAgICAgbUZyYWN0aW9uID0gZnJhY3Rpb247CisgICAgICAgIG1WYWx1ZSA9IHZhbHVlOworICAgICAgICBtVmFsdWVUeXBlID0gdmFsdWVUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBLZXlmcmFtZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdGltZSBhbmQgdmFsdWUuIFRoZSB0aW1lIGRlZmluZXMgdGhlCisgICAgICogdGltZSwgYXMgYSBwcm9wb3J0aW9uIG9mIGFuIG92ZXJhbGwgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGF0IHdoaWNoIHRoZSB2YWx1ZSB3aWxsIGhvbGQgdHJ1ZQorICAgICAqIGZvciB0aGUgYW5pbWF0aW9uLiBUaGUgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24gYmV0d2VlbiBrZXlmcmFtZXMgd2lsbCBiZSBjYWxjdWxhdGVkIGFzCisgICAgICogYW4gaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSB2YWx1ZXMgYXQgdGhvc2Uga2V5ZnJhbWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSB0aW1lLCBleHByZXNzZWQgYXMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIHJlcHJlc2VudGluZyB0aGUgZnJhY3Rpb24KKyAgICAgKiBvZiB0aW1lIGVsYXBzZWQgb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uIGR1cmF0aW9uLgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgb2JqZWN0IHdpbGwgYW5pbWF0ZSB0byBhcyB0aGUgYW5pbWF0aW9uIHRpbWUgYXBwcm9hY2hlcworICAgICAqIHRoZSB0aW1lIGluIHRoaXMga2V5ZnJhbWUsIGFuZCB0aGUgdGhlIHZhbHVlIGFuaW1hdGVkIGZyb20gYXMgdGhlIHRpbWUgcGFzc2VzIHRoZSB0aW1lIGluCisgICAgICogdGhpcyBrZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgS2V5ZnJhbWUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCB2YWx1ZSkgeworICAgICAgICB0aGlzKGZyYWN0aW9uLCB2YWx1ZSwgKHZhbHVlICE9IG51bGwpID8gdmFsdWUuZ2V0Q2xhc3MoKSA6IE9iamVjdC5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIEtleWZyYW1lIG9iamVjdCB3aXRoIHRoZSBnaXZlbiB0aW1lIGFuZCBmbG9hdCB2YWx1ZS4gVGhlIHRpbWUgZGVmaW5lcyB0aGUKKyAgICAgKiB0aW1lLCBhcyBhIHByb3BvcnRpb24gb2YgYW4gb3ZlcmFsbCBhbmltYXRpb24ncyBkdXJhdGlvbiwgYXQgd2hpY2ggdGhlIHZhbHVlIHdpbGwgaG9sZCB0cnVlCisgICAgICogZm9yIHRoZSBhbmltYXRpb24uIFRoZSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbiBiZXR3ZWVuIGtleWZyYW1lcyB3aWxsIGJlIGNhbGN1bGF0ZWQgYXMKKyAgICAgKiBhbiBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHZhbHVlcyBhdCB0aG9zZSBrZXlmcmFtZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIHRpbWUsIGV4cHJlc3NlZCBhcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgcmVwcmVzZW50aW5nIHRoZSBmcmFjdGlvbgorICAgICAqIG9mIHRpbWUgZWxhcHNlZCBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24gZHVyYXRpb24uCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBvYmplY3Qgd2lsbCBhbmltYXRlIHRvIGFzIHRoZSBhbmltYXRpb24gdGltZSBhcHByb2FjaGVzCisgICAgICogdGhlIHRpbWUgaW4gdGhpcyBrZXlmcmFtZSwgYW5kIHRoZSB0aGUgdmFsdWUgYW5pbWF0ZWQgZnJvbSBhcyB0aGUgdGltZSBwYXNzZXMgdGhlIHRpbWUgaW4KKyAgICAgKiB0aGlzIGtleWZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBLZXlmcmFtZShmbG9hdCBmcmFjdGlvbiwgRmxvYXQgdmFsdWUpIHsKKyAgICAgICAgdGhpcyhmcmFjdGlvbiwgdmFsdWUsIEZsb2F0LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgS2V5ZnJhbWUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHRpbWUgYW5kIGludGVnZXIgdmFsdWUuIFRoZSB0aW1lIGRlZmluZXMgdGhlCisgICAgICogdGltZSwgYXMgYSBwcm9wb3J0aW9uIG9mIGFuIG92ZXJhbGwgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGF0IHdoaWNoIHRoZSB2YWx1ZSB3aWxsIGhvbGQgdHJ1ZQorICAgICAqIGZvciB0aGUgYW5pbWF0aW9uLiBUaGUgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24gYmV0d2VlbiBrZXlmcmFtZXMgd2lsbCBiZSBjYWxjdWxhdGVkIGFzCisgICAgICogYW4gaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSB2YWx1ZXMgYXQgdGhvc2Uga2V5ZnJhbWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSB0aW1lLCBleHByZXNzZWQgYXMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIHJlcHJlc2VudGluZyB0aGUgZnJhY3Rpb24KKyAgICAgKiBvZiB0aW1lIGVsYXBzZWQgb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uIGR1cmF0aW9uLgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgb2JqZWN0IHdpbGwgYW5pbWF0ZSB0byBhcyB0aGUgYW5pbWF0aW9uIHRpbWUgYXBwcm9hY2hlcworICAgICAqIHRoZSB0aW1lIGluIHRoaXMga2V5ZnJhbWUsIGFuZCB0aGUgdGhlIHZhbHVlIGFuaW1hdGVkIGZyb20gYXMgdGhlIHRpbWUgcGFzc2VzIHRoZSB0aW1lIGluCisgICAgICogdGhpcyBrZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgS2V5ZnJhbWUoZmxvYXQgZnJhY3Rpb24sIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgdGhpcyhmcmFjdGlvbiwgdmFsdWUsIEludGVnZXIuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBLZXlmcmFtZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdGltZSBhbmQgZG91YmxlIHZhbHVlLiBUaGUgdGltZSBkZWZpbmVzIHRoZQorICAgICAqIHRpbWUsIGFzIGEgcHJvcG9ydGlvbiBvZiBhbiBvdmVyYWxsIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBhdCB3aGljaCB0aGUgdmFsdWUgd2lsbCBob2xkIHRydWUKKyAgICAgKiBmb3IgdGhlIGFuaW1hdGlvbi4gVGhlIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uIGJldHdlZW4ga2V5ZnJhbWVzIHdpbGwgYmUgY2FsY3VsYXRlZCBhcworICAgICAqIGFuIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgdmFsdWVzIGF0IHRob3NlIGtleWZyYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgdGltZSwgZXhwcmVzc2VkIGFzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCByZXByZXNlbnRpbmcgdGhlIGZyYWN0aW9uCisgICAgICogb2YgdGltZSBlbGFwc2VkIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIG9iamVjdCB3aWxsIGFuaW1hdGUgdG8gYXMgdGhlIGFuaW1hdGlvbiB0aW1lIGFwcHJvYWNoZXMKKyAgICAgKiB0aGUgdGltZSBpbiB0aGlzIGtleWZyYW1lLCBhbmQgdGhlIHRoZSB2YWx1ZSBhbmltYXRlZCBmcm9tIGFzIHRoZSB0aW1lIHBhc3NlcyB0aGUgdGltZSBpbgorICAgICAqIHRoaXMga2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIEtleWZyYW1lKGZsb2F0IGZyYWN0aW9uLCBEb3VibGUgdmFsdWUpIHsKKyAgICAgICAgdGhpcyhmcmFjdGlvbiwgdmFsdWUsIERvdWJsZS5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIEtleWZyYW1lIG9iamVjdCB3aXRoIHRoZSBnaXZlbiB0aW1lIGFuZCBpbnRlZ2VyIHZhbHVlLiBUaGUgdGltZSBkZWZpbmVzIHRoZQorICAgICAqIHRpbWUsIGFzIGEgcHJvcG9ydGlvbiBvZiBhbiBvdmVyYWxsIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBhdCB3aGljaCB0aGUgdmFsdWUgd2lsbCBob2xkIHRydWUKKyAgICAgKiBmb3IgdGhlIGFuaW1hdGlvbi4gVGhlIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uIGJldHdlZW4ga2V5ZnJhbWVzIHdpbGwgYmUgY2FsY3VsYXRlZCBhcworICAgICAqIGFuIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgdmFsdWVzIGF0IHRob3NlIGtleWZyYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgdGltZSwgZXhwcmVzc2VkIGFzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCByZXByZXNlbnRpbmcgdGhlIGZyYWN0aW9uCisgICAgICogb2YgdGltZSBlbGFwc2VkIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIG9iamVjdCB3aWxsIGFuaW1hdGUgdG8gYXMgdGhlIGFuaW1hdGlvbiB0aW1lIGFwcHJvYWNoZXMKKyAgICAgKiB0aGUgdGltZSBpbiB0aGlzIGtleWZyYW1lLCBhbmQgdGhlIHRoZSB2YWx1ZSBhbmltYXRlZCBmcm9tIGFzIHRoZSB0aW1lIHBhc3NlcyB0aGUgdGltZSBpbgorICAgICAqIHRoaXMga2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIEtleWZyYW1lKGZsb2F0IGZyYWN0aW9uLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgdGhpcyhmcmFjdGlvbiwgdmFsdWUsIGludC5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIEtleWZyYW1lIG9iamVjdCB3aXRoIHRoZSBnaXZlbiB0aW1lIGFuZCBmbG9hdCB2YWx1ZS4gVGhlIHRpbWUgZGVmaW5lcyB0aGUKKyAgICAgKiB0aW1lLCBhcyBhIHByb3BvcnRpb24gb2YgYW4gb3ZlcmFsbCBhbmltYXRpb24ncyBkdXJhdGlvbiwgYXQgd2hpY2ggdGhlIHZhbHVlIHdpbGwgaG9sZCB0cnVlCisgICAgICogZm9yIHRoZSBhbmltYXRpb24uIFRoZSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbiBiZXR3ZWVuIGtleWZyYW1lcyB3aWxsIGJlIGNhbGN1bGF0ZWQgYXMKKyAgICAgKiBhbiBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHZhbHVlcyBhdCB0aG9zZSBrZXlmcmFtZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIHRpbWUsIGV4cHJlc3NlZCBhcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgcmVwcmVzZW50aW5nIHRoZSBmcmFjdGlvbgorICAgICAqIG9mIHRpbWUgZWxhcHNlZCBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24gZHVyYXRpb24uCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBvYmplY3Qgd2lsbCBhbmltYXRlIHRvIGFzIHRoZSBhbmltYXRpb24gdGltZSBhcHByb2FjaGVzCisgICAgICogdGhlIHRpbWUgaW4gdGhpcyBrZXlmcmFtZSwgYW5kIHRoZSB0aGUgdmFsdWUgYW5pbWF0ZWQgZnJvbSBhcyB0aGUgdGltZSBwYXNzZXMgdGhlIHRpbWUgaW4KKyAgICAgKiB0aGlzIGtleWZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBLZXlmcmFtZShmbG9hdCBmcmFjdGlvbiwgZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgdGhpcyhmcmFjdGlvbiwgdmFsdWUsIGZsb2F0LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgS2V5ZnJhbWUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHRpbWUgYW5kIGRvdWJsZSB2YWx1ZS4gVGhlIHRpbWUgZGVmaW5lcyB0aGUKKyAgICAgKiB0aW1lLCBhcyBhIHByb3BvcnRpb24gb2YgYW4gb3ZlcmFsbCBhbmltYXRpb24ncyBkdXJhdGlvbiwgYXQgd2hpY2ggdGhlIHZhbHVlIHdpbGwgaG9sZCB0cnVlCisgICAgICogZm9yIHRoZSBhbmltYXRpb24uIFRoZSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbiBiZXR3ZWVuIGtleWZyYW1lcyB3aWxsIGJlIGNhbGN1bGF0ZWQgYXMKKyAgICAgKiBhbiBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHZhbHVlcyBhdCB0aG9zZSBrZXlmcmFtZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIHRpbWUsIGV4cHJlc3NlZCBhcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgcmVwcmVzZW50aW5nIHRoZSBmcmFjdGlvbgorICAgICAqIG9mIHRpbWUgZWxhcHNlZCBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24gZHVyYXRpb24uCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBvYmplY3Qgd2lsbCBhbmltYXRlIHRvIGFzIHRoZSBhbmltYXRpb24gdGltZSBhcHByb2FjaGVzCisgICAgICogdGhlIHRpbWUgaW4gdGhpcyBrZXlmcmFtZSwgYW5kIHRoZSB0aGUgdmFsdWUgYW5pbWF0ZWQgZnJvbSBhcyB0aGUgdGltZSBwYXNzZXMgdGhlIHRpbWUgaW4KKyAgICAgKiB0aGlzIGtleWZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBLZXlmcmFtZShmbG9hdCBmcmFjdGlvbiwgZG91YmxlIHZhbHVlKSB7CisgICAgICAgIHRoaXMoZnJhY3Rpb24sIHZhbHVlLCBkb3VibGUuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIGZvciB0aGlzIEtleWZyYW1lLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdmFsdWUgZm9yIHRoaXMgS2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhpcyBLZXlmcmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSBmb3IgdGhpcyBLZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgbVZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdGltZSBmb3IgdGhpcyBrZXlmcmFtZSwgYXMgYSBmcmFjdGlvbiBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24gZHVyYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGtleWZyYW1lLCBhcyBhIGZyYWN0aW9uIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbgorICAgICAqIGR1cmF0aW9uLiBUaGlzIHNob3VsZCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0RnJhY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBtRnJhY3Rpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGltZSBmb3IgdGhpcyBrZXlmcmFtZSwgYXMgYSBmcmFjdGlvbiBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24gZHVyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gdGltZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXlmcmFtZSwgYXMgYSBmcmFjdGlvbiBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24KKyAgICAgKiBkdXJhdGlvbi4gVGhpcyBzaG91bGQgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RnJhY3Rpb24oZmxvYXQgZnJhY3Rpb24pIHsKKyAgICAgICAgbUZyYWN0aW9uID0gZnJhY3Rpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgb3B0aW9uYWwgaW50ZXJwb2xhdG9yIGZvciB0aGlzIEtleWZyYW1lLiBBIHZhbHVlIG9mIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRlcworICAgICAqIHRoYXQgdGhlcmUgaXMgbm8gaW50ZXJwb2xhdGlvbiwgd2hpY2ggaXMgdGhlIHNhbWUgYXMgbGluZWFyIGludGVycG9sYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBvcHRpb25hbCBpbnRlcnBvbGF0b3IgZm9yIHRoaXMgS2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIEludGVycG9sYXRvciBnZXRJbnRlcnBvbGF0b3IoKSB7CisgICAgICAgIHJldHVybiBtSW50ZXJwb2xhdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG9wdGlvbmFsIGludGVycG9sYXRvciBmb3IgdGhpcyBLZXlmcmFtZS4gQSB2YWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0ZXMKKyAgICAgKiB0aGF0IHRoZXJlIGlzIG5vIGludGVycG9sYXRpb24sIHdoaWNoIGlzIHRoZSBzYW1lIGFzIGxpbmVhciBpbnRlcnBvbGF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgb3B0aW9uYWwgaW50ZXJwb2xhdG9yIGZvciB0aGlzIEtleWZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEludGVycG9sYXRvcihJbnRlcnBvbGF0b3IgaW50ZXJwb2xhdG9yKSB7CisgICAgICAgIG1JbnRlcnBvbGF0b3IgPSBpbnRlcnBvbGF0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdHlwZSBvZiBrZXlmcmFtZS4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGJ5IFZhbHVlQW5pbWF0b3IgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mCisgICAgICoge0BsaW5rIFR5cGVFdmFsdWF0b3J9IHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHZhbHVlcyBiZXR3ZWVuIGtleWZyYW1lcy4gVGhlIHR5cGUgaXMgYmFzZWQKKyAgICAgKiBvbiB0aGUgdHlwZSBvZiBLZXlmcmFtZSBjcmVhdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBLZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZVR5cGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEtleWZyYW1lIGNsb25lKCkgeworICAgICAgICBLZXlmcmFtZSBrZkNsb25lID0gbmV3IEtleWZyYW1lKG1GcmFjdGlvbiwgbVZhbHVlLCBtVmFsdWVUeXBlKTsKKyAgICAgICAga2ZDbG9uZS5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcik7CisgICAgICAgIHJldHVybiBrZkNsb25lOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9LZXlmcmFtZVNldC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0tleWZyYW1lU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY0N2ExNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9LZXlmcmFtZVNldC5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yOworCisvKioKKyAqIFRoaXMgY2xhc3MgaG9sZHMgYSBjb2xsZWN0aW9uIG9mIEtleWZyYW1lIG9iamVjdHMgYW5kIGlzIGNhbGxlZCBieSBWYWx1ZUFuaW1hdG9yIHRvIGNhbGN1bGF0ZQorICogdmFsdWVzIGJldHdlZW4gdGhvc2Uga2V5ZnJhbWVzIGZvciBhIGdpdmVuIGFuaW1hdGlvbi4gVGhlIGNsYXNzIGludGVybmFsIHRvIHRoZSBhbmltYXRpb24KKyAqIHBhY2thZ2UgYmVjYXVzZSBpdCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgaG93IEtleWZyYW1lcyBhcmUgc3RvcmVkIGFuZCB1c2VkLgorICovCitjbGFzcyBLZXlmcmFtZVNldCB7CisKKyAgICBwcml2YXRlIGludCBtTnVtS2V5ZnJhbWVzOworCisgICAgQXJyYXlMaXN0PEtleWZyYW1lPiBtS2V5ZnJhbWVzOworCisgICAgcHVibGljIEtleWZyYW1lU2V0KEtleWZyYW1lLi4uIGtleWZyYW1lcykgeworICAgICAgICBtS2V5ZnJhbWVzID0gbmV3IEFycmF5TGlzdDxLZXlmcmFtZT4oKTsKKyAgICAgICAgZm9yIChLZXlmcmFtZSBrZXlmcmFtZSA6IGtleWZyYW1lcykgeworICAgICAgICAgICAgbUtleWZyYW1lcy5hZGQoa2V5ZnJhbWUpOworICAgICAgICB9CisgICAgICAgIG1OdW1LZXlmcmFtZXMgPSBtS2V5ZnJhbWVzLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhbmltYXRlZCB2YWx1ZSwgZ2l2ZW4gdGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhlIGFuaW1hdGlvbiAoaW50ZXJwb2xhdGVkIGJ5IHRoZQorICAgICAqIGFuaW1hdGlvbidzIGludGVycG9sYXRvcikgYW5kIHRoZSBldmFsdWF0b3IgdXNlZCB0byBjYWxjdWxhdGUgaW4tYmV0d2VlbiB2YWx1ZXMuIFRoaXMKKyAgICAgKiBmdW5jdGlvbiBtYXBzIHRoZSBpbnB1dCBmcmFjdGlvbiB0byB0aGUgYXBwcm9wcmlhdGUga2V5ZnJhbWUgaW50ZXJ2YWwgYW5kIGEgZnJhY3Rpb24KKyAgICAgKiBiZXR3ZWVuIHRoZW0gYW5kIHJldHVybnMgdGhlIGludGVycG9sYXRlZCB2YWx1ZS4gTm90ZSB0aGF0IHRoZSBpbnB1dCBmcmFjdGlvbiBtYXkgZmFsbAorICAgICAqIG91dHNpZGUgdGhlIFswLTFdIGJvdW5kcywgaWYgdGhlIGFuaW1hdGlvbidzIGludGVycG9sYXRvciBtYWRlIHRoYXQgaGFwcGVuIChlLmcuLCBhCisgICAgICogc3ByaW5nIGludGVycG9sYXRpb24gdGhhdCBtaWdodCBzZW5kIHRoZSBmcmFjdGlvbiBwYXN0IDEuMCkuIFdlIGhhbmRsZSB0aGlzIHNpdHVhdGlvbiBieQorICAgICAqIGp1c3QgdXNpbmcgdGhlIHR3byBrZXlmcmFtZXMgYXQgdGhlIGFwcHJvcHJpYXRlIGVuZCB3aGVuIHRoZSB2YWx1ZSBpcyBvdXRzaWRlIHRob3NlIGJvdW5kcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgZWxhcHNlZCBmcmFjdGlvbiBvZiB0aGUgYW5pbWF0aW9uCisgICAgICogQHBhcmFtIGV2YWx1YXRvciBUaGUgdHlwZSBldmFsdWF0b3IgdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIGludGVycG9sYXRlZCB2YWx1ZXMuCisgICAgICogQHJldHVybiBUaGUgYW5pbWF0ZWQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShmbG9hdCBmcmFjdGlvbiwgVHlwZUV2YWx1YXRvciBldmFsdWF0b3IpIHsKKyAgICAgICAgLy8gVE9ETzogc3BlY2lhbC1jYXNlIDIta2V5ZnJhbWUgY29tbW9uIGNhc2UKKworICAgICAgICBpZiAoZnJhY3Rpb24gPD0gMGYpIHsKKyAgICAgICAgICAgIGZpbmFsIEtleWZyYW1lIHByZXZLZXlmcmFtZSA9IG1LZXlmcmFtZXMuZ2V0KDApOworICAgICAgICAgICAgZmluYWwgS2V5ZnJhbWUgbmV4dEtleWZyYW1lID0gbUtleWZyYW1lcy5nZXQoMSk7CisgICAgICAgICAgICBmaW5hbCBJbnRlcnBvbGF0b3IgaW50ZXJwb2xhdG9yID0gbmV4dEtleWZyYW1lLmdldEludGVycG9sYXRvcigpOworICAgICAgICAgICAgaWYgKGludGVycG9sYXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSBpbnRlcnBvbGF0b3IuZ2V0SW50ZXJwb2xhdGlvbihmcmFjdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbG9hdCBpbnRlcnZhbEZyYWN0aW9uID0gKGZyYWN0aW9uIC0gcHJldktleWZyYW1lLmdldEZyYWN0aW9uKCkpIC8KKyAgICAgICAgICAgICAgICAobmV4dEtleWZyYW1lLmdldEZyYWN0aW9uKCkgLSBwcmV2S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSk7CisgICAgICAgICAgICByZXR1cm4gZXZhbHVhdG9yLmV2YWx1YXRlKGludGVydmFsRnJhY3Rpb24sIHByZXZLZXlmcmFtZS5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICBuZXh0S2V5ZnJhbWUuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoZnJhY3Rpb24gPj0gMWYpIHsKKyAgICAgICAgICAgIGZpbmFsIEtleWZyYW1lIHByZXZLZXlmcmFtZSA9IG1LZXlmcmFtZXMuZ2V0KG1OdW1LZXlmcmFtZXMgLSAyKTsKKyAgICAgICAgICAgIGZpbmFsIEtleWZyYW1lIG5leHRLZXlmcmFtZSA9IG1LZXlmcmFtZXMuZ2V0KG1OdW1LZXlmcmFtZXMgLSAxKTsKKyAgICAgICAgICAgIGZpbmFsIEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IgPSBuZXh0S2V5ZnJhbWUuZ2V0SW50ZXJwb2xhdG9yKCk7CisgICAgICAgICAgICBpZiAoaW50ZXJwb2xhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IGludGVycG9sYXRvci5nZXRJbnRlcnBvbGF0aW9uKGZyYWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZsb2F0IGludGVydmFsRnJhY3Rpb24gPSAoZnJhY3Rpb24gLSBwcmV2S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSkgLworICAgICAgICAgICAgICAgIChuZXh0S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSAtIHByZXZLZXlmcmFtZS5nZXRGcmFjdGlvbigpKTsKKyAgICAgICAgICAgIHJldHVybiBldmFsdWF0b3IuZXZhbHVhdGUoaW50ZXJ2YWxGcmFjdGlvbiwgcHJldktleWZyYW1lLmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgIG5leHRLZXlmcmFtZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBLZXlmcmFtZSBwcmV2S2V5ZnJhbWUgPSBtS2V5ZnJhbWVzLmdldCgwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtTnVtS2V5ZnJhbWVzOyArK2kpIHsKKyAgICAgICAgICAgIEtleWZyYW1lIG5leHRLZXlmcmFtZSA9IG1LZXlmcmFtZXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGZyYWN0aW9uIDwgbmV4dEtleWZyYW1lLmdldEZyYWN0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnRlcnBvbGF0b3IgaW50ZXJwb2xhdG9yID0gbmV4dEtleWZyYW1lLmdldEludGVycG9sYXRvcigpOworICAgICAgICAgICAgICAgIGlmIChpbnRlcnBvbGF0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IGludGVycG9sYXRvci5nZXRJbnRlcnBvbGF0aW9uKGZyYWN0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmxvYXQgaW50ZXJ2YWxGcmFjdGlvbiA9IChmcmFjdGlvbiAtIHByZXZLZXlmcmFtZS5nZXRGcmFjdGlvbigpKSAvCisgICAgICAgICAgICAgICAgICAgIChuZXh0S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSAtIHByZXZLZXlmcmFtZS5nZXRGcmFjdGlvbigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXZhbHVhdG9yLmV2YWx1YXRlKGludGVydmFsRnJhY3Rpb24sIHByZXZLZXlmcmFtZS5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEtleWZyYW1lLmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldktleWZyYW1lID0gbmV4dEtleWZyYW1lOworICAgICAgICB9CisgICAgICAgIC8vIHNob3VsZG4ndCBnZXQgaGVyZQorICAgICAgICByZXR1cm4gbUtleWZyYW1lcy5nZXQobU51bUtleWZyYW1lcyAtIDEpLmdldFZhbHVlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0xheW91dFRyYW5zaXRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9MYXlvdXRUcmFuc2l0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJmMGYxNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9MYXlvdXRUcmFuc2l0aW9uLmphdmEKQEAgLTAsMCArMSw4MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uRGVjZWxlcmF0ZUludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBlbmFibGVzIGF1dG9tYXRpYyBhbmltYXRpb25zIG9uIGxheW91dCBjaGFuZ2VzIGluIFZpZXdHcm91cCBvYmplY3RzLiBUbyBlbmFibGUKKyAqIHRyYW5zaXRpb25zIGZvciBhIGxheW91dCBjb250YWluZXIsIGNyZWF0ZSBhIExheW91dFRyYW5zaXRpb24gb2JqZWN0IGFuZCBzZXQgaXQgb24gYW55CisgKiBWaWV3R3JvdXAgYnkgY2FsbGluZyB7QGxpbmsgVmlld0dyb3VwI3NldExheW91dFRyYW5zaXRpb24oTGF5b3V0VHJhbnNpdGlvbil9LiBUaGlzIHdpbGwgY2F1c2UKKyAqIGRlZmF1bHQgYW5pbWF0aW9ucyB0byBydW4gd2hlbmV2ZXIgaXRlbXMgYXJlIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGF0IGNvbnRhaW5lci4gVG8gc3BlY2lmeQorICogY3VzdG9tIGFuaW1hdGlvbnMsIHVzZSB0aGUge0BsaW5rIExheW91dFRyYW5zaXRpb24jc2V0QW5pbWF0b3IoaW50LCBBbmltYXRvcikKKyAqIHNldEFuaW1hdG9yKCl9IG1ldGhvZC4KKyAqCisgKiA8cD5PbmUgb2YgdGhlIGNvcmUgY29uY2VwdHMgb2YgdGhlc2UgdHJhbnNpdGlvbiBhbmltYXRpb25zIGlzIHRoYXQgdGhlcmUgYXJlIHR3byBjb3JlCisgKiBjaGFuZ2VzIHRoYXQgY2F1c2UgdGhlIHRyYW5zaXRpb24gYW5kIGZvdXIgZGlmZmVyZW50IGFuaW1hdGlvbnMgdGhhdCBydW4gYmVjYXVzZSBvZgorICogdGhvc2UgY2hhbmdlcy4gVGhlIGNoYW5nZXMgdGhhdCB0cmlnZ2VyIHRoZSB0cmFuc2l0aW9uIGFyZSBpdGVtcyBiZWluZyBhZGRlZCB0byBhIGNvbnRhaW5lcgorICogKHJlZmVycmVkIHRvIGFzIGFuICJhcHBlYXJpbmciIHRyYW5zaXRpb24pIG9yIHJlbW92ZWQgZnJvbSBhIGNvbnRhaW5lciAoYWxzbyBrbm93biBhcworICogImRpc2FwcGVhcmluZyIpLiBUaGUgYW5pbWF0aW9ucyB0aGF0IHJ1biBkdWUgdG8gdGhvc2UgZXZlbnRzIGFyZSBvbmUgdGhhdCBhbmltYXRlcworICogaXRlbXMgYmVpbmcgYWRkZWQsIG9uZSB0aGF0IGFuaW1hdGVzIGl0ZW1zIGJlaW5nIHJlbW92ZWQsIGFuZCB0d28gdGhhdCBhbmltYXRlIHRoZSBvdGhlcgorICogaXRlbXMgaW4gdGhlIGNvbnRhaW5lciB0aGF0IGNoYW5nZSBkdWUgdG8gdGhlIGFkZC9yZW1vdmUgb2NjdXJyZW5jZS4gVXNlcnMgb2YKKyAqIHRoZSB0cmFuc2l0aW9uIG1heSB3YW50IGRpZmZlcmVudCBhbmltYXRpb25zIGZvciB0aGUgY2hhbmdpbmcgaXRlbXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIKKyAqIHRoZXkgYXJlIGNoYW5naW5nIGR1ZSB0byBhbmFwcGVhcmluZyBvciBkaXNhcHBlYXJpbmcgZXZlbnQsIHNvIHRoZXJlIGlzIG9uZSBhbmltYXRpb24gZm9yCisgKiBlYWNoIG9mIHRoZXNlIHZhcmlhdGlvbnMgb2YgdGhlIGNoYW5naW5nIGV2ZW50LiBNb3N0IG9mIHRoZSBBUEkgb2YgdGhpcyBjbGFzcyBpcyBjb25jZXJuZWQKKyAqIHdpdGggc2V0dGluZyB1cCB0aGUgYmFzaWMgcHJvcGVydGllcyBvZiB0aGUgYW5pbWF0aW9ucyB1c2VkIGluIHRoZXNlIGZvdXIgc2l0dWF0aW9ucywKKyAqIG9yIHdpdGggc2V0dGluZyB1cCBjdXN0b20gYW5pbWF0aW9ucyBmb3IgYW55IG9yIGFsbCBvZiB0aGUgZm91ci48L3A+CisgKgorICogPHA+VGhlIGFuaW1hdGlvbnMgc3BlY2lmaWVkIGZvciB0aGUgdHJhbnNpdGlvbiwgYm90aCB0aGUgZGVmYXVsdHMgYW5kIGFueSBjdXN0b20gYW5pbWF0aW9ucworICogc2V0IG9uIHRoZSB0cmFuc2l0aW9uIG9iamVjdCwgYXJlIHRlbXBsYXRlcyBvbmx5LiBUaGF0IGlzLCB0aGVzZSBhbmltYXRpb25zIGV4aXN0IHRvIGhvbGQgdGhlCisgKiBiYXNpYyBhbmltYXRpb24gcHJvcGVydGllcywgc3VjaCBhcyB0aGUgZHVyYXRpb24sIHN0YXJ0IGRlbGF5LCBhbmQgcHJvcGVydGllcyBiZWluZyBhbmltYXRlZC4KKyAqIEJ1dCB0aGUgYWN0dWFsIHRhcmdldCBvYmplY3QsIGFzIHdlbGwgYXMgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzIGZvciB0aG9zZSBwcm9wZXJ0aWVzLCBhcmUKKyAqIHNldCBhdXRvbWF0aWNhbGx5IGluIHRoZSBwcm9jZXNzIG9mIHNldHRpbmcgdXAgdGhlIHRyYW5zaXRpb24gZWFjaCB0aW1lIGl0IHJ1bnMuIEVhY2ggb2YgdGhlCisgKiBhbmltYXRpb25zIGlzIGNsb25lZCBmcm9tIHRoZSBvcmlnaW5hbCBjb3B5IGFuZCB0aGUgY2xvbmUgaXMgdGhlbiBwb3B1bGF0ZWQgd2l0aCB0aGUgZHluYW1pYworICogdmFsdWVzIG9mIHRoZSB0YXJnZXQgYmVpbmcgYW5pbWF0ZWQgKHN1Y2ggYXMgb25lIG9mIHRoZSBpdGVtcyBpbiBhIGxheW91dCBjb250YWluZXIgdGhhdCBpcworICogbW92aW5nIGFzIGEgcmVzdWx0IG9mIHRoZSBsYXlvdXQgZXZlbnQpIGFzIHdlbGwgYXMgdGhlIHZhbHVlcyB0aGF0IGFyZSBjaGFuZ2luZyAoc3VjaCBhcyB0aGUKKyAqIHBvc2l0aW9uIGFuZCBzaXplIG9mIHRoYXQgb2JqZWN0KS4gVGhlIGFjdHVhbCB2YWx1ZXMgdGhhdCBhcmUgcHVzaGVkIHRvIGVhY2ggYW5pbWF0aW9uCisgKiBkZXBlbmRzIG9uIHdoYXQgcHJvcGVydGllcyBhcmUgc3BlY2lmaWVkIGZvciB0aGUgYW5pbWF0aW9uLiBGb3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQKKyAqIENIQU5HRV9BUFBFQVJJTkcgYW5pbWF0aW9uIGFuaW1hdGVzIDxjb2RlPmxlZnQ8L2NvZGU+LCA8Y29kZT50b3A8L2NvZGU+LCA8Y29kZT5yaWdodDwvY29kZT4sCisgKiBhbmQgPGNvZGU+Ym90dG9tPC9jb2RlPi4gVmFsdWVzIGZvciB0aGVzZSBwcm9wZXJ0aWVzIGFyZSB1cGRhdGVkIHdpdGggdGhlIHByZS0gYW5kIHBvc3QtbGF5b3V0CisgKiB2YWx1ZXMgd2hlbiB0aGUgdHJhbnNpdGlvbiBiZWdpbnMuIEN1c3RvbSBhbmltYXRpb25zIHdpbGwgYmUgc2ltaWxhcmx5IHBvcHVsYXRlZCB3aXRoCisgKiB0aGUgdGFyZ2V0IGFuZCB2YWx1ZXMgYmVpbmcgYW5pbWF0ZWQsIGFzc3VtaW5nIHRoZXkgdXNlIE9iamVjdEFuaW1hdG9yIG9iamVjdHMgd2l0aAorICogcHJvcGVydHkgbmFtZXMgdGhhdCBhcmUga25vd24gb24gdGhlIHRhcmdldCBvYmplY3QuPC9wPgorICovCitwdWJsaWMgY2xhc3MgTGF5b3V0VHJhbnNpdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBBIGZsYWcgaW5kaWNhdGluZyB0aGUgYW5pbWF0aW9uIHRoYXQgcnVucyBvbiB0aG9zZSBpdGVtcyB0aGF0IGFyZSBjaGFuZ2luZworICAgICAqIGR1ZSB0byBhIG5ldyBpdGVtIGFwcGVhcmluZyBpbiB0aGUgY29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9BUFBFQVJJTkcgPSAwOworCisgICAgLyoqCisgICAgICogQSBmbGFnIGluZGljYXRpbmcgdGhlIGFuaW1hdGlvbiB0aGF0IHJ1bnMgb24gdGhvc2UgaXRlbXMgdGhhdCBhcmUgY2hhbmdpbmcKKyAgICAgKiBkdWUgdG8gYSBuZXcgaXRlbSBkaXNhcHBlYXJpbmcgZnJvbSB0aGUgY29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9ESVNBUFBFQVJJTkcgPSAxOworCisgICAgLyoqCisgICAgICogQSBmbGFnIGluZGljYXRpbmcgdGhlIGFuaW1hdGlvbiB0aGF0IHJ1bnMgb24gdGhvc2UgaXRlbXMgdGhhdCBhcmUgY2hhbmdpbmcKKyAgICAgKiBkdWUgdG8gYSBuZXcgaXRlbSBhcHBlYXJpbmcgaW4gdGhlIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBFQVJJTkcgPSAyOworCisgICAgLyoqCisgICAgICogQSBmbGFnIGluZGljYXRpbmcgdGhlIGFuaW1hdGlvbiB0aGF0IHJ1bnMgb24gdGhvc2UgaXRlbXMgdGhhdCBhcmUgY2hhbmdpbmcKKyAgICAgKiBkdWUgdG8gYSBuZXcgaXRlbSBhcHBlYXJpbmcgaW4gdGhlIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNBUFBFQVJJTkcgPSAzOworCisgICAgLyoqCisgICAgICogVGhlc2UgdmFyaWFibGVzIGhvbGQgdGhlIGFuaW1hdGlvbnMgdGhhdCBhcmUgY3VycmVudGx5IHVzZWQgdG8gcnVuIHRoZSB0cmFuc2l0aW9uIGVmZmVjdHMuCisgICAgICogVGhlc2UgYW5pbWF0aW9ucyBhcmUgc2V0IHRvIGRlZmF1bHRzLCBidXQgY2FuIGJlIGNoYW5nZWQgdG8gY3VzdG9tIGFuaW1hdGlvbnMgYnkKKyAgICAgKiBjYWxscyB0byBzZXRBbmltYXRvcigpLgorICAgICAqLworICAgIHByaXZhdGUgQW5pbWF0b3IgbURpc2FwcGVhcmluZ0FuaW0gPSBudWxsOworICAgIHByaXZhdGUgQW5pbWF0b3IgbUFwcGVhcmluZ0FuaW0gPSBudWxsOworICAgIHByaXZhdGUgQW5pbWF0b3IgbUNoYW5naW5nQXBwZWFyaW5nQW5pbSA9IG51bGw7CisgICAgcHJpdmF0ZSBBbmltYXRvciBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdBbmltID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZXNlIGFyZSB0aGUgZGVmYXVsdCBhbmltYXRpb25zLCBkZWZpbmVkIGluIHRoZSBjb25zdHJ1Y3RvciwgdGhhdCB3aWxsIGJlIHVzZWQKKyAgICAgKiB1bmxlc3MgdGhlIHVzZXIgc3BlY2lmaWVzIGN1c3RvbSBhbmltYXRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdEFuaW1hdG9yIGRlZmF1bHRDaGFuZ2VJbjsKKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3RBbmltYXRvciBkZWZhdWx0Q2hhbmdlT3V0OworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdEFuaW1hdG9yIGRlZmF1bHRGYWRlSW47CisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0QW5pbWF0b3IgZGVmYXVsdEZhZGVPdXQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBkdXJhdGlvbiB1c2VkIGJ5IGFsbCBhbmltYXRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgREVGQVVMVF9EVVJBVElPTiA9IDMwMDsKKworICAgIC8qKgorICAgICAqIFRoZSBkdXJhdGlvbnMgb2YgdGhlIGZvdXIgZGlmZmVyZW50IGFuaW1hdGlvbnMKKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgbUNoYW5naW5nQXBwZWFyaW5nRHVyYXRpb24gPSBERUZBVUxUX0RVUkFUSU9OOworICAgIHByaXZhdGUgbG9uZyBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdEdXJhdGlvbiA9IERFRkFVTFRfRFVSQVRJT047CisgICAgcHJpdmF0ZSBsb25nIG1BcHBlYXJpbmdEdXJhdGlvbiA9IERFRkFVTFRfRFVSQVRJT047CisgICAgcHJpdmF0ZSBsb25nIG1EaXNhcHBlYXJpbmdEdXJhdGlvbiA9IERFRkFVTFRfRFVSQVRJT047CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RhcnQgZGVsYXlzIG9mIHRoZSBmb3VyIGRpZmZlcmVudCBhbmltYXRpb25zLiBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YKKyAgICAgKiB0aGUgYXBwZWFyaW5nIGl0ZW0gaXMgdGhlIGRlZmF1bHQgZHVyYXRpb24sIHNpbmNlIGl0IHNob3VsZCB3YWl0IGZvciB0aGUgaXRlbXMgdG8gbW92ZQorICAgICAqIGJlZm9yZSBmYWRpbmcgaXQuIFNhbWUgZm9yIHRoZSBjaGFuZ2luZyBhbmltYXRpb24gd2hlbiBkaXNhcHBlYXJpbmc7IGl0IHdhaXRzIGZvciB0aGUgaXRlbQorICAgICAqIHRvIGZhZGUgb3V0IGJlZm9yZSBtb3ZpbmcgdGhlIG90aGVyIGl0ZW1zLgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBtQXBwZWFyaW5nRGVsYXkgPSBERUZBVUxUX0RVUkFUSU9OOworICAgIHByaXZhdGUgbG9uZyBtRGlzYXBwZWFyaW5nRGVsYXkgPSAwOworICAgIHByaXZhdGUgbG9uZyBtQ2hhbmdpbmdBcHBlYXJpbmdEZWxheSA9IDA7CisgICAgcHJpdmF0ZSBsb25nIG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0RlbGF5ID0gREVGQVVMVF9EVVJBVElPTjsKKworICAgIC8qKgorICAgICAqIFRoZSBpbnRlci1hbmltYXRpb24gZGVsYXlzIHVzZWQgb24gdGhlIHR3byBjaGFuZ2luZyBhbmltYXRpb25zCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIG1DaGFuZ2luZ0FwcGVhcmluZ1N0YWdnZXIgPSAwOworICAgIHByaXZhdGUgbG9uZyBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdTdGFnZ2VyID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGludGVycG9sYXRvcnMgdXNlZCBmb3IgdGhlIGFuaW1hdGlvbnMKKyAgICAgKi8KKyAgICBwcml2YXRlIEludGVycG9sYXRvciBtQXBwZWFyaW5nSW50ZXJwb2xhdG9yID0gbmV3IEFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yKCk7CisgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbURpc2FwcGVhcmluZ0ludGVycG9sYXRvciA9IG5ldyBBY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcigpOworICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1DaGFuZ2luZ0FwcGVhcmluZ0ludGVycG9sYXRvciA9IG5ldyBEZWNlbGVyYXRlSW50ZXJwb2xhdG9yKCk7CisgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUNoYW5naW5nRGlzYXBwZWFyaW5nSW50ZXJwb2xhdG9yID0gbmV3IERlY2VsZXJhdGVJbnRlcnBvbGF0b3IoKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaGFzaG1hcCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBhbmltYXRpb25zIHRoYXQgYXJlIGN1cnJlbnRseSBydW5uaW5nIGFzIHBhcnQgb2YKKyAgICAgKiB0aGUgdHJhbnNpdGlvbi4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IGEgZnVydGhlciBsYXlvdXQgZXZlbnQgc2hvdWxkIGNhdXNlCisgICAgICogZXhpc3RpbmcgYW5pbWF0aW9ucyB0byBzdG9wIHdoZXJlIHRoZXkgYXJlIHByaW9yIHRvIHN0YXJ0aW5nIG5ldyBhbmltYXRpb25zLiBTbworICAgICAqIHdlIGNhY2hlIGFsbCBvZiB0aGUgY3VycmVudCBhbmltYXRpb25zIGluIHRoaXMgbWFwIGZvciBwb3NzaWJsZSBjYW5jZWxsYXRpb24gb24KKyAgICAgKiBhbm90aGVyIGxheW91dCBldmVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXA8VmlldywgQW5pbWF0b3I+IGN1cnJlbnRBbmltYXRpb25zID0gbmV3IEhhc2hNYXA8VmlldywgQW5pbWF0b3I+KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGhhc2htYXAgaXMgdXNlZCB0byB0cmFjayB0aGUgbGlzdGVuZXJzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBjaGlsZHJlbiBvZgorICAgICAqIGEgY29udGFpbmVyLiBXaGVuIGEgbGF5b3V0IGNoYW5nZSBvY2N1cnMsIGFuIGFuaW1hdGlvbiBpcyBjcmVhdGVkIGZvciBlYWNoIFZpZXcsIHNvIHRoYXQKKyAgICAgKiB0aGUgcHJlLWxheW91dCB2YWx1ZXMgY2FuIGJlIGNhY2hlZCBpbiB0aGF0IGFuaW1hdGlvbi4gVGhlbiBhIGxpc3RlbmVyIGlzIGFkZGVkIHRvIHRoZQorICAgICAqIHZpZXcgdG8gc2VlIHdoZXRoZXIgdGhlIGxheW91dCBjaGFuZ2VzIHRoZSBib3VuZHMgb2YgdGhhdCB2aWV3LiBJZiBzbywgdGhlIGFuaW1hdGlvbgorICAgICAqIGlzIHNldCB3aXRoIHRoZSBmaW5hbCB2YWx1ZXMgYW5kIHRoZW4gcnVuLiBJZiBub3QsIHRoZSBhbmltYXRpb24gaXMgbm90IHN0YXJ0ZWQuIFdoZW4KKyAgICAgKiB0aGUgcHJvY2VzcyBvZiBzZXR0aW5nIHVwIGFuZCBydW5uaW5nIGFsbCBhcHByb3ByaWF0ZSBhbmltYXRpb25zIGlzIGRvbmUsIHdlIG5lZWQgdG8KKyAgICAgKiByZW1vdmUgdGhlc2UgbGlzdGVuZXJzIGFuZCBjbGVhciBvdXQgdGhlIG1hcC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXA8VmlldywgVmlldy5PbkxheW91dENoYW5nZUxpc3RlbmVyPiBsYXlvdXRDaGFuZ2VMaXN0ZW5lck1hcCA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxWaWV3LCBWaWV3Lk9uTGF5b3V0Q2hhbmdlTGlzdGVuZXI+KCk7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHRyYWNrIHRoZSBjdXJyZW50IGRlbGF5IGJlaW5nIGFzc2lnbmVkIHRvIHN1Y2Nlc3NpdmUgYW5pbWF0aW9ucyBhcyB0aGV5IGFyZQorICAgICAqIHN0YXJ0ZWQuIFRoaXMgdmFsdWUgaXMgaW5jcmVtZW50ZWQgZm9yIGVhY2ggbmV3IGFuaW1hdGlvbiwgdGhlbiB6ZXJvZWQgYmVmb3JlIHRoZSBuZXh0CisgICAgICogdHJhbnNpdGlvbiBiZWdpbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIHN0YWdnZXJEZWxheTsKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgbGlzdGVuZXJzIHRoYXQgc2hvdWxkIGJlIG5vdGlmaWVkIHdoZW4gQVBQRUFSSU5HL0RJU0FQUEVBUklORyB0cmFuc2l0aW9ucworICAgICAqIHN0YXJ0IGFuZCBlbmQuCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8VHJhbnNpdGlvbkxpc3RlbmVyPiBtTGlzdGVuZXJzOworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgTGF5b3V0VHJhbnNpdGlvbiBvYmplY3QuIEJ5IGRlZmF1bHQsIHRoZSBvYmplY3Qgd2lsbCBsaXN0ZW4gdG8gbGF5b3V0CisgICAgICogZXZlbnRzIG9uIGFueSBWaWV3R3JvdXAgdGhhdCBpdCBpcyBzZXQgb24gYW5kIHdpbGwgcnVuIGRlZmF1bHQgYW5pbWF0aW9ucyBmb3IgZWFjaAorICAgICAqIHR5cGUgb2YgbGF5b3V0IGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyBMYXlvdXRUcmFuc2l0aW9uKCkgeworICAgICAgICBpZiAoZGVmYXVsdENoYW5nZUluID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vICJsZWZ0IiBpcyBqdXN0IGEgcGxhY2Vob2xkZXI7IHdlJ2xsIHB1dCByZWFsIHByb3BlcnRpZXMvdmFsdWVzIGluIHdoZW4gbmVlZGVkCisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxJbnRlZ2VyPiBwdmhMZWZ0ID0gbmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyPEludGVnZXI+KCJsZWZ0IiwgMCwgMSk7CisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxJbnRlZ2VyPiBwdmhUb3AgPSBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8SW50ZWdlcj4oInRvcCIsIDAsIDEpOworICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXI8SW50ZWdlcj4gcHZoUmlnaHQgPSBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8SW50ZWdlcj4oInJpZ2h0IiwgMCwgMSk7CisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxJbnRlZ2VyPiBwdmhCb3R0b20gPSBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8SW50ZWdlcj4oImJvdHRvbSIsIDAsIDEpOworICAgICAgICAgICAgZGVmYXVsdENoYW5nZUluID0gbmV3IE9iamVjdEFuaW1hdG9yPFByb3BlcnR5VmFsdWVzSG9sZGVyPihERUZBVUxUX0RVUkFUSU9OLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICBwdmhMZWZ0LCBwdmhUb3AsIHB2aFJpZ2h0LCBwdmhCb3R0b20pOworICAgICAgICAgICAgZGVmYXVsdENoYW5nZUluLnNldFN0YXJ0RGVsYXkobUNoYW5naW5nQXBwZWFyaW5nRGVsYXkpOworICAgICAgICAgICAgZGVmYXVsdENoYW5nZUluLnNldEludGVycG9sYXRvcihtQ2hhbmdpbmdBcHBlYXJpbmdJbnRlcnBvbGF0b3IpOworICAgICAgICAgICAgZGVmYXVsdENoYW5nZU91dCA9IGRlZmF1bHRDaGFuZ2VJbi5jbG9uZSgpOworICAgICAgICAgICAgZGVmYXVsdENoYW5nZU91dC5zZXRTdGFydERlbGF5KG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0RlbGF5KTsKKyAgICAgICAgICAgIGRlZmF1bHRDaGFuZ2VPdXQuc2V0SW50ZXJwb2xhdG9yKG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0ludGVycG9sYXRvcik7CisgICAgICAgICAgICBkZWZhdWx0RmFkZUluID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdEFuaW1hdG9yPEZsb2F0PihERUZBVUxUX0RVUkFUSU9OLCB0aGlzLCAiYWxwaGEiLCAwZiwgMWYpOworICAgICAgICAgICAgZGVmYXVsdEZhZGVJbi5zZXRTdGFydERlbGF5KG1BcHBlYXJpbmdEZWxheSk7CisgICAgICAgICAgICBkZWZhdWx0RmFkZUluLnNldEludGVycG9sYXRvcihtQXBwZWFyaW5nSW50ZXJwb2xhdG9yKTsKKyAgICAgICAgICAgIGRlZmF1bHRGYWRlT3V0ID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdEFuaW1hdG9yPEZsb2F0PihERUZBVUxUX0RVUkFUSU9OLCB0aGlzLCAiYWxwaGEiLCAxZiwgMGYpOworICAgICAgICAgICAgZGVmYXVsdEZhZGVPdXQuc2V0U3RhcnREZWxheShtRGlzYXBwZWFyaW5nRGVsYXkpOworICAgICAgICAgICAgZGVmYXVsdEZhZGVPdXQuc2V0SW50ZXJwb2xhdG9yKG1EaXNhcHBlYXJpbmdJbnRlcnBvbGF0b3IpOworICAgICAgICB9CisgICAgICAgIG1DaGFuZ2luZ0FwcGVhcmluZ0FuaW0gPSBkZWZhdWx0Q2hhbmdlSW47CisgICAgICAgIG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0FuaW0gPSBkZWZhdWx0Q2hhbmdlT3V0OworICAgICAgICBtQXBwZWFyaW5nQW5pbSA9IGRlZmF1bHRGYWRlSW47CisgICAgICAgIG1EaXNhcHBlYXJpbmdBbmltID0gZGVmYXVsdEZhZGVPdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZHVyYXRpb24gdG8gYmUgdXNlZCBieSBhbGwgYW5pbWF0aW9ucyBvZiB0aGlzIHRyYW5zaXRpb24gb2JqZWN0LiBJZiB5b3Ugd2FudCB0bworICAgICAqIHNldCB0aGUgZHVyYXRpb24gb2YganVzdCBvbmUgb2YgdGhlIGFuaW1hdGlvbnMgaW4gcGFydGljdWxhciwgdXNlIHRoZQorICAgICAqIHtAbGluayAjc2V0RHVyYXRpb24oaW50LCBsb25nKX0gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0aGF0IHRoZSB0cmFuc2l0aW9uIGFuaW1hdGlvbnMKKyAgICAgKiBzaG91bGQgbGFzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREdXJhdGlvbihsb25nIGR1cmF0aW9uKSB7CisgICAgICAgIG1DaGFuZ2luZ0FwcGVhcmluZ0R1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgIG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0R1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgIG1BcHBlYXJpbmdEdXJhdGlvbiA9IGR1cmF0aW9uOworICAgICAgICBtRGlzYXBwZWFyaW5nRHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzdGFydCBkZWxheSBvbiBvbmUgb2YgdGhlIGFuaW1hdGlvbiBvYmplY3RzIHVzZWQgYnkgdGhpcyB0cmFuc2l0aW9uLiBUaGUKKyAgICAgKiA8Y29kZT50cmFuc2l0aW9uVHlwZTwvY29kZT4gcGFyYW1ldGVyIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZSBzdGFydCBkZWxheQorICAgICAqIGlzIGJlaW5nIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uVHlwZSBvbmUgb2Yge0BsaW5rICNDSEFOR0VfQVBQRUFSSU5HfSwge0BsaW5rICNDSEFOR0VfRElTQVBQRUFSSU5HfSwKKyAgICAgKiB7QGxpbmsgI0FQUEVBUklOR30sIG9yIHtAbGluayAjRElTQVBQRUFSSU5HfSwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgYW5pbWF0aW9uIHdob3NlIHN0YXJ0CisgICAgICogZGVsYXkgaXMgYmVpbmcgc2V0LgorICAgICAqIEBwYXJhbSBkZWxheSBUaGUgbGVuZ3RoIG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gZGVsYXkgYmVmb3JlIHN0YXJ0aW5nIHRoZSBhbmltYXRpb24uCisgICAgICogQHNlZSBBbmltYXRvciNzZXRTdGFydERlbGF5KGxvbmcpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhcnREZWxheShpbnQgdHJhbnNpdGlvblR5cGUsIGxvbmcgZGVsYXkpIHsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICAgICAgY2FzZSBDSEFOR0VfQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIG1DaGFuZ2luZ0FwcGVhcmluZ0RlbGF5ID0gZGVsYXk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9ESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUNoYW5naW5nRGlzYXBwZWFyaW5nRGVsYXkgPSBkZWxheTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIG1BcHBlYXJpbmdEZWxheSA9IGRlbGF5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbURpc2FwcGVhcmluZ0RlbGF5ID0gZGVsYXk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBzdGFydCBkZWxheSBvbiBvbmUgb2YgdGhlIGFuaW1hdGlvbiBvYmplY3RzIHVzZWQgYnkgdGhpcyB0cmFuc2l0aW9uLiBUaGUKKyAgICAgKiA8Y29kZT50cmFuc2l0aW9uVHlwZTwvY29kZT4gcGFyYW1ldGVyIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZSBzdGFydCBkZWxheQorICAgICAqIGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25UeXBlIG9uZSBvZiB7QGxpbmsgI0NIQU5HRV9BUFBFQVJJTkd9LCB7QGxpbmsgI0NIQU5HRV9ESVNBUFBFQVJJTkd9LAorICAgICAqIHtAbGluayAjQVBQRUFSSU5HfSwgb3Ige0BsaW5rICNESVNBUFBFQVJJTkd9LCB3aGljaCBkZXRlcm1pbmVzIHRoZSBhbmltYXRpb24gd2hvc2Ugc3RhcnQKKyAgICAgKiBkZWxheSBpcyByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIGxvbmcgVGhlIHN0YXJ0IGRlbGF5IG9mIHRoZSBzcGVjaWZpZWQgYW5pbWF0aW9uLgorICAgICAqIEBzZWUgQW5pbWF0b3IjZ2V0U3RhcnREZWxheSgpCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0U3RhcnREZWxheShpbnQgdHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICAgICAgY2FzZSBDSEFOR0VfQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQ2hhbmdpbmdBcHBlYXJpbmdEdXJhdGlvbjsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0RJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNoYW5naW5nRGlzYXBwZWFyaW5nRHVyYXRpb247CisgICAgICAgICAgICBjYXNlIEFQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbUFwcGVhcmluZ0R1cmF0aW9uOworICAgICAgICAgICAgY2FzZSBESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1EaXNhcHBlYXJpbmdEdXJhdGlvbjsKKyAgICAgICAgfQorICAgICAgICAvLyBzaG91bGRuJ3QgcmVhY2ggaGVyZQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkdXJhdGlvbiBvbiBvbmUgb2YgdGhlIGFuaW1hdGlvbiBvYmplY3RzIHVzZWQgYnkgdGhpcyB0cmFuc2l0aW9uLiBUaGUKKyAgICAgKiA8Y29kZT50cmFuc2l0aW9uVHlwZTwvY29kZT4gcGFyYW1ldGVyIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZSBkdXJhdGlvbgorICAgICAqIGlzIGJlaW5nIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uVHlwZSBvbmUgb2Yge0BsaW5rICNDSEFOR0VfQVBQRUFSSU5HfSwge0BsaW5rICNDSEFOR0VfRElTQVBQRUFSSU5HfSwKKyAgICAgKiB7QGxpbmsgI0FQUEVBUklOR30sIG9yIHtAbGluayAjRElTQVBQRUFSSU5HfSwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgYW5pbWF0aW9uIHdob3NlCisgICAgICogZHVyYXRpb24gaXMgYmVpbmcgc2V0LgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdGhhdCB0aGUgc3BlY2lmaWVkIGFuaW1hdGlvbiBzaG91bGQgcnVuLgorICAgICAqIEBzZWUgQW5pbWF0b3Ijc2V0RHVyYXRpb24obG9uZykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREdXJhdGlvbihpbnQgdHJhbnNpdGlvblR5cGUsIGxvbmcgZHVyYXRpb24pIHsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICAgICAgY2FzZSBDSEFOR0VfQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIG1DaGFuZ2luZ0FwcGVhcmluZ0R1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9ESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUNoYW5naW5nRGlzYXBwZWFyaW5nRHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIG1BcHBlYXJpbmdEdXJhdGlvbiA9IGR1cmF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbURpc2FwcGVhcmluZ0R1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBkdXJhdGlvbiBvbiBvbmUgb2YgdGhlIGFuaW1hdGlvbiBvYmplY3RzIHVzZWQgYnkgdGhpcyB0cmFuc2l0aW9uLiBUaGUKKyAgICAgKiA8Y29kZT50cmFuc2l0aW9uVHlwZTwvY29kZT4gcGFyYW1ldGVyIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZSBkdXJhdGlvbgorICAgICAqIGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25UeXBlIG9uZSBvZiB7QGxpbmsgI0NIQU5HRV9BUFBFQVJJTkd9LCB7QGxpbmsgI0NIQU5HRV9ESVNBUFBFQVJJTkd9LAorICAgICAqIHtAbGluayAjQVBQRUFSSU5HfSwgb3Ige0BsaW5rICNESVNBUFBFQVJJTkd9LCB3aGljaCBkZXRlcm1pbmVzIHRoZSBhbmltYXRpb24gd2hvc2UKKyAgICAgKiBkdXJhdGlvbiBpcyByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIGxvbmcgVGhlIGR1cmF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgYW5pbWF0aW9uLgorICAgICAqIEBzZWUgQW5pbWF0b3IjZ2V0RHVyYXRpb24oKQorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldER1cmF0aW9uKGludCB0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICBzd2l0Y2ggKHRyYW5zaXRpb25UeXBlKSB7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9BUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1DaGFuZ2luZ0FwcGVhcmluZ0R1cmF0aW9uOworICAgICAgICAgICAgY2FzZSBDSEFOR0VfRElTQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdEdXJhdGlvbjsKKyAgICAgICAgICAgIGNhc2UgQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQXBwZWFyaW5nRHVyYXRpb247CisgICAgICAgICAgICBjYXNlIERJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbURpc2FwcGVhcmluZ0R1cmF0aW9uOworICAgICAgICB9CisgICAgICAgIC8vIHNob3VsZG4ndCByZWFjaCBoZXJlCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxlbmd0aCBvZiB0aW1lIHRvIGRlbGF5IGJldHdlZW4gc3RhcnRpbmcgZWFjaCBhbmltYXRpb24gZHVyaW5nIG9uZSBvZiB0aGUKKyAgICAgKiBDSEFOR0UgYW5pbWF0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uVHlwZSBBIHZhbHVlIG9mIHtAbGluayAjQ0hBTkdFX0FQUEVBUklOR30gb3IgQGxpbmsgI0NIQU5HRV9ESVNBUFBFQVJJTkd9LgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gZGVsYXkgYmVmb3JlIGxhdW5jaGluZyB0aGUgbmV4dAorICAgICAqIGFuaW1hdGlvbiBpbiB0aGUgc2VxdWVuY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhZ2dlcihpbnQgdHJhbnNpdGlvblR5cGUsIGxvbmcgZHVyYXRpb24pIHsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICAgICAgY2FzZSBDSEFOR0VfQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIG1DaGFuZ2luZ0FwcGVhcmluZ1N0YWdnZXIgPSBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0RJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdTdGFnZ2VyID0gZHVyYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBub29wIG90aGVyIGNhc2VzCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXRzIHRoZSBsZW5ndGggb2YgdGltZSB0byBkZWxheSBiZXR3ZWVuIHN0YXJ0aW5nIGVhY2ggYW5pbWF0aW9uIGR1cmluZyBvbmUgb2YgdGhlCisgICAgICogQ0hBTkdFIGFuaW1hdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNpdGlvblR5cGUgQSB2YWx1ZSBvZiB7QGxpbmsgI0NIQU5HRV9BUFBFQVJJTkd9IG9yIEBsaW5rICNDSEFOR0VfRElTQVBQRUFSSU5HfS4KKyAgICAgKiBAcmV0dXJuIGxvbmcgVGhlIGxlbmd0aCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRvIGRlbGF5IGJlZm9yZSBsYXVuY2hpbmcgdGhlIG5leHQKKyAgICAgKiBhbmltYXRpb24gaW4gdGhlIHNlcXVlbmNlLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFN0YWdnZXIoaW50IHRyYW5zaXRpb25UeXBlKSB7CisgICAgICAgIHN3aXRjaCAodHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNoYW5naW5nQXBwZWFyaW5nU3RhZ2dlcjsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0RJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNoYW5naW5nRGlzYXBwZWFyaW5nU3RhZ2dlcjsKKyAgICAgICAgfQorICAgICAgICAvLyBzaG91bGRuJ3QgcmVhY2ggaGVyZQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBpbnRlcnBvbGF0b3Igb24gb25lIG9mIHRoZSBhbmltYXRpb24gb2JqZWN0cyB1c2VkIGJ5IHRoaXMgdHJhbnNpdGlvbi4gVGhlCisgICAgICogPGNvZGU+dHJhbnNpdGlvblR5cGU8L2NvZGU+IHBhcmFtZXRlciBkZXRlcm1pbmVzIHRoZSBhbmltYXRpb24gd2hvc2UgaW50ZXJwb2xhdG9yCisgICAgICogaXMgYmVpbmcgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25UeXBlIG9uZSBvZiB7QGxpbmsgI0NIQU5HRV9BUFBFQVJJTkd9LCB7QGxpbmsgI0NIQU5HRV9ESVNBUFBFQVJJTkd9LAorICAgICAqIHtAbGluayAjQVBQRUFSSU5HfSwgb3Ige0BsaW5rICNESVNBUFBFQVJJTkd9LCB3aGljaCBkZXRlcm1pbmVzIHRoZSBhbmltYXRpb24gd2hvc2UKKyAgICAgKiBkdXJhdGlvbiBpcyBiZWluZyBzZXQuCisgICAgICogQHBhcmFtIGludGVycG9sYXRvciBUaGUgaW50ZXJwb2xhdG9yIHRoYXQgdGhlIHNwZWNpZmllZCBhbmltYXRpb24gc2hvdWxkIHVzZS4KKyAgICAgKiBAc2VlIEFuaW1hdG9yI3NldEludGVycG9sYXRvcihhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRlcnBvbGF0b3IoaW50IHRyYW5zaXRpb25UeXBlLCBJbnRlcnBvbGF0b3IgaW50ZXJwb2xhdG9yKSB7CisgICAgICAgIHN3aXRjaCAodHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICBtQ2hhbmdpbmdBcHBlYXJpbmdJbnRlcnBvbGF0b3IgPSBpbnRlcnBvbGF0b3I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9ESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUNoYW5naW5nRGlzYXBwZWFyaW5nSW50ZXJwb2xhdG9yID0gaW50ZXJwb2xhdG9yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUFwcGVhcmluZ0ludGVycG9sYXRvciA9IGludGVycG9sYXRvcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRElTQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIG1EaXNhcHBlYXJpbmdJbnRlcnBvbGF0b3IgPSBpbnRlcnBvbGF0b3I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBpbnRlcnBvbGF0b3Igb24gb25lIG9mIHRoZSBhbmltYXRpb24gb2JqZWN0cyB1c2VkIGJ5IHRoaXMgdHJhbnNpdGlvbi4gVGhlCisgICAgICogPGNvZGU+dHJhbnNpdGlvblR5cGU8L2NvZGU+IHBhcmFtZXRlciBkZXRlcm1pbmVzIHRoZSBhbmltYXRpb24gd2hvc2UgaW50ZXJwb2xhdG9yCisgICAgICogaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNpdGlvblR5cGUgb25lIG9mIHtAbGluayAjQ0hBTkdFX0FQUEVBUklOR30sIHtAbGluayAjQ0hBTkdFX0RJU0FQUEVBUklOR30sCisgICAgICoge0BsaW5rICNBUFBFQVJJTkd9LCBvciB7QGxpbmsgI0RJU0FQUEVBUklOR30sIHdoaWNoIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZQorICAgICAqIGR1cmF0aW9uIGlzIGJlaW5nIHNldC4KKyAgICAgKiBAcmV0dXJuIEludGVycG9sYXRvciBUaGUgaW50ZXJwb2xhdG9yIHRoYXQgdGhlIHNwZWNpZmllZCBhbmltYXRpb24gdXNlcy4KKyAgICAgKiBAc2VlIEFuaW1hdG9yI3NldEludGVycG9sYXRvcihhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcikKKyAgICAgKi8KKyAgICBwdWJsaWMgSW50ZXJwb2xhdG9yIGdldEludGVycG9sYXRvcihpbnQgdHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICAgICAgY2FzZSBDSEFOR0VfQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQ2hhbmdpbmdBcHBlYXJpbmdJbnRlcnBvbGF0b3I7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9ESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0ludGVycG9sYXRvcjsKKyAgICAgICAgICAgIGNhc2UgQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQXBwZWFyaW5nSW50ZXJwb2xhdG9yOworICAgICAgICAgICAgY2FzZSBESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1EaXNhcHBlYXJpbmdJbnRlcnBvbGF0b3I7CisgICAgICAgIH0KKyAgICAgICAgLy8gc2hvdWxkbid0IHJlYWNoIGhlcmUKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYW5pbWF0aW9uIHVzZWQgZHVyaW5nIG9uZSBvZiB0aGUgdHJhbnNpdGlvbiB0eXBlcyB0aGF0IG1heSBydW4uIEFueQorICAgICAqIEFuaW1hdG9yIG9iamVjdCBjYW4gYmUgdXNlZCwgYnV0IHRvIGJlIG1vc3QgdXNlZnVsIGluIHRoZSBjb250ZXh0IG9mIGxheW91dAorICAgICAqIHRyYW5zaXRpb25zLCB0aGUgYW5pbWF0aW9uIHNob3VsZCBlaXRoZXIgYmUgYSBPYmplY3RBbmltYXRvciBvciBhIEFuaW1hdG9yU2V0CisgICAgICogb2YgYW5pbWF0aW9ucyBpbmNsdWRpbmcgUHJvcGVydHlBbmltYXRvcnMuIEFsc28sIHRoZXNlIE9iamVjdEFuaW1hdG9yIG9iamVjdHMKKyAgICAgKiBzaG91bGQgYmUgYWJsZSB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb24gdGhlaXIgdGFyZ2V0IG9iamVjdHMgYXV0b21hdGljYWxseS4gRm9yCisgICAgICogZXhhbXBsZSwgYSBPYmplY3RBbmltYXRvciB0aGF0IGFuaW1hdGVzIHRoZSBwcm9wZXJ0eSAibGVmdCIgaXMgYWJsZSB0byBzZXQgYW5kIGdldCB0aGUKKyAgICAgKiA8Y29kZT5sZWZ0PC9jb2RlPiBwcm9wZXJ0eSBmcm9tIHRoZSBWaWV3IG9iamVjdHMgYmVpbmcgYW5pbWF0ZWQgYnkgdGhlIGxheW91dAorICAgICAqIHRyYW5zaXRpb24uIFRoZSB0cmFuc2l0aW9uIHdvcmtzIGJ5IHNldHRpbmcgdGFyZ2V0IG9iamVjdHMgYW5kIHByb3BlcnRpZXMKKyAgICAgKiBkeW5hbWljYWxseSwgYWNjb3JkaW5nIHRvIHRoZSBwcmUtIGFuZCBwb3N0LWxheW9vdXQgdmFsdWVzIG9mIHRob3NlIG9iamVjdHMsIHNvCisgICAgICogaGF2aW5nIGFuaW1hdGlvbnMgdGhhdCBjYW4gaGFuZGxlIHRob3NlIHByb3BlcnRpZXMgYXBwcm9wcmlhdGVseSB3aWxsIHdvcmsgYmVzdAorICAgICAqIGZvciBjdXN0b20gYW5pbWF0aW9uLiBUaGUgZHluYW1pYyBzZXR0aW5nIG9mIHZhbHVlcyBpcyBvbmx5IHRoZSBjYXNlIGZvciB0aGUKKyAgICAgKiBDSEFOR0UgYW5pbWF0aW9uczsgdGhlIEFQUEVBUklORyBhbmQgRElTQVBQRUFSSU5HIGFuaW1hdGlvbnMgYXJlIHNpbXBseSBydW4gd2l0aAorICAgICAqIHRoZSB2YWx1ZXMgdGhleSBoYXZlLgorICAgICAqCisgICAgICogPHA+SXQgaXMgYWxzbyB3b3J0aCBub3RpbmcgdGhhdCBhbnkgYW5kIGFsbCBhbmltYXRpb25zIChhbmQgdGhlaXIgdW5kZXJseWluZworICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMpIHdpbGwgaGF2ZSB0aGVpciBzdGFydCBhbmQgZW5kIHZhbHVlcyBzZXQgYWNjb3JkaW5nCisgICAgICogdG8gdGhlIHByZS0gYW5kIHBvc3QtbGF5b3V0IHZhbHVlcy4gU28sIGZvciBleGFtcGxlLCBhIGN1c3RvbSBhbmltYXRpb24gb24gImFscGhhIgorICAgICAqIGFzIHRoZSBDSEFOR0VfQVBQRUFSSU5HIGFuaW1hdGlvbiB3aWxsIGluaGVyaXQgdGhlIHJlYWwgdmFsdWUgb2YgYWxwaGEgb24gdGhlIHRhcmdldAorICAgICAqIG9iamVjdCAocHJlc3VtYWJseSAxKSBhcyBpdHMgc3RhcnRpbmcgYW5kIGVuZGluZyB2YWx1ZSB3aGVuIHRoZSBhbmltYXRpb24gYmVnaW5zLgorICAgICAqIEFuaW1hdGlvbnMgd2hpY2ggbmVlZCB0byB1c2UgdmFsdWVzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCB0aGF0IG1heSBub3QgbWF0Y2ggdGhlCisgICAgICogdmFsdWVzIHF1ZXJpZWQgd2hlbiB0aGUgdHJhbnNpdGlvbiBiZWdpbnMgbWF5IG5lZWQgdG8gdXNlIGEgZGlmZmVyZW50IG1lY2hhbmlzbQorICAgICAqIHRoYW4gYSBzdGFuZGFyZCBPYmplY3RBbmltYXRvciBvYmplY3QuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25UeXBlIG9uZSBvZiB7QGxpbmsgI0NIQU5HRV9BUFBFQVJJTkd9LCB7QGxpbmsgI0NIQU5HRV9ESVNBUFBFQVJJTkd9LAorICAgICAqIHtAbGluayAjQVBQRUFSSU5HfSwgb3Ige0BsaW5rICNESVNBUFBFQVJJTkd9LCB3aGljaCBkZXRlcm1pbmVzIHRoZSBhbmltYXRpb24gd2hvc2UKKyAgICAgKiBkdXJhdGlvbiBpcyBiZWluZyBzZXQuCisgICAgICogQHBhcmFtIGFuaW1hdG9yIFRoZSBhbmltYXRpb24gYmVpbmcgYXNzaWduZWQuIEEgdmFsdWUgb2YgPGNvZGU+bnVsbDwvY29kZT4gbWVhbnMgdGhhdCBubworICAgICAqIGFuaW1hdGlvbiB3aWxsIGJlIHJ1biBmb3IgdGhlIHNwZWNpZmllZCB0cmFuc2l0aW9uVHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbmltYXRvcihpbnQgdHJhbnNpdGlvblR5cGUsIEFuaW1hdG9yIGFuaW1hdG9yKSB7CisgICAgICAgIHN3aXRjaCAodHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICBtQ2hhbmdpbmdBcHBlYXJpbmdBbmltID0gYW5pbWF0b3I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9ESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUNoYW5naW5nRGlzYXBwZWFyaW5nQW5pbSA9IGFuaW1hdG9yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUFwcGVhcmluZ0FuaW0gPSBhbmltYXRvcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRElTQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIG1EaXNhcHBlYXJpbmdBbmltID0gYW5pbWF0b3I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhbmltYXRpb24gdXNlZCBkdXJpbmcgb25lIG9mIHRoZSB0cmFuc2l0aW9uIHR5cGVzIHRoYXQgbWF5IHJ1bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uVHlwZSBvbmUgb2Yge0BsaW5rICNDSEFOR0VfQVBQRUFSSU5HfSwge0BsaW5rICNDSEFOR0VfRElTQVBQRUFSSU5HfSwKKyAgICAgKiB7QGxpbmsgI0FQUEVBUklOR30sIG9yIHtAbGluayAjRElTQVBQRUFSSU5HfSwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgYW5pbWF0aW9uIHdob3NlCisgICAgICogZHVyYXRpb24gaXMgYmVpbmcgc2V0LgorICAgICAqIEByZXR1cm4gQW5pbWF0b3IgVGhlIGFuaW1hdGlvbiBiZWluZyB1c2VkIGZvciB0aGUgZ2l2ZW4gdHJhbnNpdGlvbiB0eXBlLgorICAgICAqIEBzZWUgI3NldEFuaW1hdG9yKGludCwgQW5pbWF0b3IpCisgICAgICovCisgICAgcHVibGljIEFuaW1hdG9yIGdldEFuaW1hdG9yKGludCB0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICBzd2l0Y2ggKHRyYW5zaXRpb25UeXBlKSB7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9BUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1DaGFuZ2luZ0FwcGVhcmluZ0FuaW07CisgICAgICAgICAgICBjYXNlIENIQU5HRV9ESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0FuaW07CisgICAgICAgICAgICBjYXNlIEFQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbUFwcGVhcmluZ0FuaW07CisgICAgICAgICAgICBjYXNlIERJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbURpc2FwcGVhcmluZ0FuaW07CisgICAgICAgIH0KKyAgICAgICAgLy8gc2hvdWxkbid0IHJlYWNoIGhlcmUKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiBzZXRzIHVwIHJ1bnMgYW5pbWF0aW9ucyBvbiBhbGwgb2YgdGhlIHZpZXdzIHRoYXQgY2hhbmdlIGR1cmluZyBsYXlvdXQuCisgICAgICogRm9yIGV2ZXJ5IGNoaWxkIGluIHRoZSBwYXJlbnQsIHdlIGNyZWF0ZSBhIGNoYW5nZSBhbmltYXRpb24gb2YgdGhlIGFwcHJvcHJpYXRlCisgICAgICogdHlwZSAoYXBwZWFyaW5nIG9yIGRpc2FwcGVhcmluZykgYW5kIGFzayBpdCB0byBwb3B1bGF0ZSBpdHMgc3RhcnQgdmFsdWVzIGZyb20gaXRzCisgICAgICogdGFyZ2V0IHZpZXcuIFdlIGFkZCBsYXlvdXQgbGlzdGVuZXJzIHRvIGFsbCBjaGlsZCB2aWV3cyBhbmQgbGlzdGVuIGZvciBjaGFuZ2VzLiBGb3IKKyAgICAgKiB0aG9zZSB2aWV3cyB0aGF0IGNoYW5nZSwgd2UgcG9wdWxhdGUgdGhlIGVuZCB2YWx1ZXMgZm9yIHRob3NlIGFuaW1hdGlvbnMgYW5kIHN0YXJ0IHRoZW0uCisgICAgICogQW5pbWF0aW9ucyBhcmUgbm90IHJ1biBvbiB1bmNoYW5naW5nIHZpZXdzLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgY29udGFpbmVyIHdoaWNoIGlzIHVuZGVyZ29pbmcgYW4gYXBwZWFyaW5nIG9yIGRpc2FwcGVhcmluZyBjaGFuZ2UuCisgICAgICogQHBhcmFtIG5ld1ZpZXcgVGhlIHZpZXcgYmVpbmcgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoZSBwYXJlbnQuCisgICAgICogQHBhcmFtIGNoYW5nZVJlYXNvbiBBIHZhbHVlIG9mIEFQUEVBUklORyBvciBESVNBUFBFQVJJTkcsIGluZGljYXRpbmcgd2hldGhlciB0aGUKKyAgICAgKiB0cmFuc2l0aW9uIGlzIG9jY3VyaW5nIGJlY2F1c2UgYW4gaXRlbSBpcyBiZWluZyBhZGRlZCB0byBvciByZW1vdmVkIGZyb20gdGhlIHBhcmVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcnVuQ2hhbmdlVHJhbnNpdGlvbihmaW5hbCBWaWV3R3JvdXAgcGFyZW50LCBWaWV3IG5ld1ZpZXcsIGZpbmFsIGludCBjaGFuZ2VSZWFzb24pIHsKKworICAgICAgICBBbmltYXRvciBiYXNlQW5pbWF0b3IgPSAoY2hhbmdlUmVhc29uID09IEFQUEVBUklORykgPworICAgICAgICAgICAgICAgIG1DaGFuZ2luZ0FwcGVhcmluZ0FuaW0gOiBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdBbmltOworICAgICAgICAvLyBJZiB0aGUgYW5pbWF0aW9uIGlzIG51bGwsIHRoZXJlJ3Mgbm90aGluZyB0byBkbworICAgICAgICBpZiAoYmFzZUFuaW1hdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlc2V0IHRoZSBpbnRlci1hbmltYXRpb24gZGVsYXksIGluIGNhc2Ugd2UgdXNlIGl0IGxhdGVyCisgICAgICAgIHN0YWdnZXJEZWxheSA9IDA7CisKKyAgICAgICAgZmluYWwgVmlld1RyZWVPYnNlcnZlciBvYnNlcnZlciA9IHBhcmVudC5nZXRWaWV3VHJlZU9ic2VydmVyKCk7IC8vIHVzZWQgZm9yIGxhdGVyIGNsZWFudXAKKyAgICAgICAgaWYgKCFvYnNlcnZlci5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBvYnNlcnZlcidzIG5vdCBpbiBhIGdvb2Qgc3RhdGUsIHNraXAgdGhlIHRyYW5zaXRpb24KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQgbnVtQ2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRDb3VudCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2hpbGRyZW47ICsraSkgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IHBhcmVudC5nZXRDaGlsZEF0KGkpOworCisgICAgICAgICAgICAvLyBvbmx5IGFuaW1hdGUgdGhlIHZpZXdzIG5vdCBiZWluZyBhZGRlZCBvciByZW1vdmVkCisgICAgICAgICAgICBpZiAoY2hpbGQgIT0gbmV3VmlldykgeworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhbiBhbmltYXRpb24gcnVubmluZyBvbiB0aGlzIHZpZXcgYWxyZWFkeSwgY2FuY2VsIGl0CisgICAgICAgICAgICAgICAgQW5pbWF0b3IgY3VycmVudEFuaW1hdGlvbiA9IGN1cnJlbnRBbmltYXRpb25zLmdldChjaGlsZCk7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRBbmltYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50QW5pbWF0aW9uLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50QW5pbWF0aW9ucy5yZW1vdmUoY2hpbGQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBhcHByb3ByaWF0ZSBhbmltYXRpb24KKyAgICAgICAgICAgICAgICBmaW5hbCBBbmltYXRvciBhbmltID0gYmFzZUFuaW1hdG9yLmNsb25lKCk7CisKKyAgICAgICAgICAgICAgICAvLyBDYWNoZSB0aGUgYW5pbWF0aW9uIGluIGNhc2Ugd2UgbmVlZCB0byBjYW5jZWwgaXQgbGF0ZXIKKyAgICAgICAgICAgICAgICBjdXJyZW50QW5pbWF0aW9ucy5wdXQoY2hpbGQsIGFuaW0pOworCisgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSB0YXJnZXQgb2JqZWN0IGZvciB0aGUgYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgYW5pbS5zZXRUYXJnZXQoY2hpbGQpOworCisgICAgICAgICAgICAgICAgLy8gQSBPYmplY3RBbmltYXRvciAob3IgQW5pbWF0b3JTZXQgb2YgdGhlbSkgY2FuIGV4dHJhY3Qgc3RhcnQgdmFsdWVzIGZyb20KKyAgICAgICAgICAgICAgICAvLyBpdHMgdGFyZ2V0IG9iamVjdAorICAgICAgICAgICAgICAgIGFuaW0uc2V0dXBTdGFydFZhbHVlcygpOworCisgICAgICAgICAgICAgICAgLy8gQWRkIGEgbGlzdGVuZXIgdG8gdHJhY2sgbGF5b3V0IGNoYW5nZXMgb24gdGhpcyB2aWV3LiBJZiB3ZSBkb24ndCBnZXQgYSBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAvLyB0aGVuIHRoZXJlJ3Mgbm90aGluZyB0byBhbmltYXRlLgorICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcuT25MYXlvdXRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBWaWV3Lk9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTGF5b3V0Q2hhbmdlKFZpZXcgdiwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2xkTGVmdCwgaW50IG9sZFRvcCwgaW50IG9sZFJpZ2h0LCBpbnQgb2xkQm90dG9tKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlbGwgdGhlIGFuaW1hdGlvbiB0byBleHRyYWN0IGVuZCB2YWx1ZXMgZnJvbSB0aGUgY2hhbmdlZCBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0uc2V0dXBFbmRWYWx1ZXMoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBzdGFydERlbGF5OworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VSZWFzb24gPT0gQVBQRUFSSU5HKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREZWxheSA9IG1DaGFuZ2luZ0FwcGVhcmluZ0RlbGF5ICsgc3RhZ2dlckRlbGF5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdnZXJEZWxheSArPSBtQ2hhbmdpbmdBcHBlYXJpbmdTdGFnZ2VyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gbUNoYW5naW5nQXBwZWFyaW5nRHVyYXRpb247CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RGVsYXkgPSBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdEZWxheSArIHN0YWdnZXJEZWxheTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZ2VyRGVsYXkgKz0gbUNoYW5naW5nRGlzYXBwZWFyaW5nU3RhZ2dlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0R1cmF0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5zZXRTdGFydERlbGF5KHN0YXJ0RGVsYXkpOworICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5zZXREdXJhdGlvbihkdXJhdGlvbik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmltIGluc3RhbmNlb2YgT2JqZWN0QW5pbWF0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9iamVjdEFuaW1hdG9yKSBhbmltKS5zZXRDdXJyZW50UGxheVRpbWUoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhbmltLnN0YXJ0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgb25seSByZW1vdmVzIGxpc3RlbmVycyB3aG9zZSB2aWV3cyBjaGFuZ2VkIC0gbXVzdCBjbGVhciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyIGxpc3RlbmVycyBsYXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucmVtb3ZlT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dENoYW5nZUxpc3RlbmVyTWFwLnJlbW92ZShjaGlsZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYW5pbWF0aW9uIGZyb20gdGhlIGNhY2hlIHdoZW4gaXQgZW5kcworICAgICAgICAgICAgICAgIGFuaW0uYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2FuY2VsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25DYW5jZWwoQW5pbWF0b3IgYW5pbWF0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHJlbW92ZSBjYW5jZWxlZCBhbmltYXRpb25zIGltbWVkaWF0ZWx5LCBub3QgaGVyZQorICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucmVtb3ZlT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRDaGFuZ2VMaXN0ZW5lck1hcC5yZW1vdmUoY2hpbGQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdG9yIGFuaW1hdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEFuaW1hdGlvbnMucmVtb3ZlKGNoaWxkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgY2hpbGQuYWRkT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgLy8gY2FjaGUgdGhlIGxpc3RlbmVyIGZvciBsYXRlciByZW1vdmFsCisgICAgICAgICAgICAgICAgbGF5b3V0Q2hhbmdlTGlzdGVuZXJNYXAucHV0KGNoaWxkLCBsaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgY2xlYW51cCBzdGVwLiBXaGVuIHdlIGdldCB0aGlzIHJlbmRlcmluZyBldmVudCwgd2Uga25vdyB0aGF0IGFsbCBvZgorICAgICAgICAvLyB0aGUgYXBwcm9wcmlhdGUgYW5pbWF0aW9ucyBoYXZlIGJlZW4gc2V0IHVwIGFuZCBydW4uIE5vdyB3ZSBjYW4gY2xlYXIgb3V0IHRoZQorICAgICAgICAvLyBsYXlvdXQgbGlzdGVuZXJzLgorICAgICAgICBvYnNlcnZlci5hZGRPblByZURyYXdMaXN0ZW5lcihuZXcgVmlld1RyZWVPYnNlcnZlci5PblByZURyYXdMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uUHJlRHJhdygpIHsKKyAgICAgICAgICAgICAgICBwYXJlbnQuZ2V0Vmlld1RyZWVPYnNlcnZlcigpLnJlbW92ZU9uUHJlRHJhd0xpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIGludCBudW1DaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DaGlsZHJlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBwYXJlbnQuZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQucmVtb3ZlT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcihsYXlvdXRDaGFuZ2VMaXN0ZW5lck1hcC5nZXQoY2hpbGQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGF5b3V0Q2hhbmdlTGlzdGVuZXJNYXAuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgcnVucyB0aGUgYW5pbWF0aW9uIHRoYXQgbWFrZXMgYW4gYWRkZWQgaXRlbSBhcHBlYXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBWaWV3R3JvdXAgdG8gd2hpY2ggdGhlIFZpZXcgaXMgYmVpbmcgYWRkZWQuCisgICAgICogQHBhcmFtIGNoaWxkIFRoZSBWaWV3IGJlaW5nIGFkZGVkIHRvIHRoZSBWaWV3R3JvdXAuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJ1bkFwcGVhcmluZ1RyYW5zaXRpb24oZmluYWwgVmlld0dyb3VwIHBhcmVudCwgZmluYWwgVmlldyBjaGlsZCkgeworICAgICAgICBpZiAobUFwcGVhcmluZ0FuaW0gPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoVHJhbnNpdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogbUxpc3RlbmVycykgeworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5lbmRUcmFuc2l0aW9uKExheW91dFRyYW5zaXRpb24udGhpcywgcGFyZW50LCBjaGlsZCwgQVBQRUFSSU5HKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQW5pbWF0b3IgYW5pbSA9IG1BcHBlYXJpbmdBbmltLmNsb25lKCk7CisgICAgICAgIGFuaW0uc2V0VGFyZ2V0KGNoaWxkKTsKKyAgICAgICAgYW5pbS5zZXRTdGFydERlbGF5KG1BcHBlYXJpbmdEZWxheSk7CisgICAgICAgIGFuaW0uc2V0RHVyYXRpb24obUFwcGVhcmluZ0R1cmF0aW9uKTsKKyAgICAgICAgaWYgKGFuaW0gaW5zdGFuY2VvZiBPYmplY3RBbmltYXRvcikgeworICAgICAgICAgICAgKChPYmplY3RBbmltYXRvcikgYW5pbSkuc2V0Q3VycmVudFBsYXlUaW1lKDApOworICAgICAgICB9CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFuaW0uYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKFRyYW5zaXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IG1MaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmVuZFRyYW5zaXRpb24oTGF5b3V0VHJhbnNpdGlvbi50aGlzLCBwYXJlbnQsIGNoaWxkLCBBUFBFQVJJTkcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgYW5pbS5zdGFydCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHJ1bnMgdGhlIGFuaW1hdGlvbiB0aGF0IG1ha2VzIGEgcmVtb3ZlZCBpdGVtIGRpc2FwcGVhci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIFZpZXdHcm91cCBmcm9tIHdoaWNoIHRoZSBWaWV3IGlzIGJlaW5nIHJlbW92ZWQuCisgICAgICogQHBhcmFtIGNoaWxkIFRoZSBWaWV3IGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgVmlld0dyb3VwLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBydW5EaXNhcHBlYXJpbmdUcmFuc2l0aW9uKGZpbmFsIFZpZXdHcm91cCBwYXJlbnQsIGZpbmFsIFZpZXcgY2hpbGQpIHsKKyAgICAgICAgaWYgKG1EaXNhcHBlYXJpbmdBbmltID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFRyYW5zaXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IG1MaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuZW5kVHJhbnNpdGlvbihMYXlvdXRUcmFuc2l0aW9uLnRoaXMsIHBhcmVudCwgY2hpbGQsIERJU0FQUEVBUklORyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEFuaW1hdG9yIGFuaW0gPSBtRGlzYXBwZWFyaW5nQW5pbS5jbG9uZSgpOworICAgICAgICBhbmltLnNldFN0YXJ0RGVsYXkobURpc2FwcGVhcmluZ0RlbGF5KTsKKyAgICAgICAgYW5pbS5zZXREdXJhdGlvbihtRGlzYXBwZWFyaW5nRHVyYXRpb24pOworICAgICAgICBhbmltLnNldFRhcmdldChjaGlsZCk7CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFuaW0uYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdG9yIGFuaW0pIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChUcmFuc2l0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiBtTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5lbmRUcmFuc2l0aW9uKExheW91dFRyYW5zaXRpb24udGhpcywgcGFyZW50LCBjaGlsZCwgRElTQVBQRUFSSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIGlmIChhbmltIGluc3RhbmNlb2YgT2JqZWN0QW5pbWF0b3IpIHsKKyAgICAgICAgICAgICgoT2JqZWN0QW5pbWF0b3IpIGFuaW0pLnNldEN1cnJlbnRQbGF5VGltZSgwKTsKKyAgICAgICAgfQorICAgICAgICBhbmltLnN0YXJ0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFZpZXdHcm91cCB3aGVuIGEgY2hpbGQgdmlldyBpcyBhYm91dCB0byBiZSBhZGRlZCB0byB0aGUKKyAgICAgKiBjb250YWluZXIuIFRoaXMgY2FsbGJhY2sgc3RhcnRzIHRoZSBwcm9jZXNzIG9mIGEgdHJhbnNpdGlvbjsgd2UgZ3JhYiB0aGUgc3RhcnRpbmcKKyAgICAgKiB2YWx1ZXMsIGxpc3RlbiBmb3IgY2hhbmdlcyB0byBhbGwgb2YgdGhlIGNoaWxkcmVuIG9mIHRoZSBjb250YWluZXIsIGFuZCBzdGFydCBhcHByb3ByaWF0ZQorICAgICAqIGFuaW1hdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBWaWV3R3JvdXAgdG8gd2hpY2ggdGhlIFZpZXcgaXMgYmVpbmcgYWRkZWQuCisgICAgICogQHBhcmFtIGNoaWxkIFRoZSBWaWV3IGJlaW5nIGFkZGVkIHRvIHRoZSBWaWV3R3JvdXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ2hpbGQoVmlld0dyb3VwIHBhcmVudCwgVmlldyBjaGlsZCkgeworICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKFRyYW5zaXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IG1MaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5zdGFydFRyYW5zaXRpb24odGhpcywgcGFyZW50LCBjaGlsZCwgQVBQRUFSSU5HKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBydW5DaGFuZ2VUcmFuc2l0aW9uKHBhcmVudCwgY2hpbGQsIEFQUEVBUklORyk7CisgICAgICAgIHJ1bkFwcGVhcmluZ1RyYW5zaXRpb24ocGFyZW50LCBjaGlsZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFZpZXdHcm91cCB3aGVuIGEgY2hpbGQgdmlldyBpcyBhYm91dCB0byBiZSBhZGRlZCB0byB0aGUKKyAgICAgKiBjb250YWluZXIuIFRoaXMgY2FsbGJhY2sgc3RhcnRzIHRoZSBwcm9jZXNzIG9mIGEgdHJhbnNpdGlvbjsgd2UgZ3JhYiB0aGUgc3RhcnRpbmcKKyAgICAgKiB2YWx1ZXMsIGxpc3RlbiBmb3IgY2hhbmdlcyB0byBhbGwgb2YgdGhlIGNoaWxkcmVuIG9mIHRoZSBjb250YWluZXIsIGFuZCBzdGFydCBhcHByb3ByaWF0ZQorICAgICAqIGFuaW1hdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBWaWV3R3JvdXAgdG8gd2hpY2ggdGhlIFZpZXcgaXMgYmVpbmcgYWRkZWQuCisgICAgICogQHBhcmFtIGNoaWxkIFRoZSBWaWV3IGJlaW5nIGFkZGVkIHRvIHRoZSBWaWV3R3JvdXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2hvd0NoaWxkKFZpZXdHcm91cCBwYXJlbnQsIFZpZXcgY2hpbGQpIHsKKyAgICAgICAgYWRkQ2hpbGQocGFyZW50LCBjaGlsZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFZpZXdHcm91cCB3aGVuIGEgY2hpbGQgdmlldyBpcyBhYm91dCB0byBiZSByZW1vdmVkIGZyb20gdGhlCisgICAgICogY29udGFpbmVyLiBUaGlzIGNhbGxiYWNrIHN0YXJ0cyB0aGUgcHJvY2VzcyBvZiBhIHRyYW5zaXRpb247IHdlIGdyYWIgdGhlIHN0YXJ0aW5nCisgICAgICogdmFsdWVzLCBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8gYWxsIG9mIHRoZSBjaGlsZHJlbiBvZiB0aGUgY29udGFpbmVyLCBhbmQgc3RhcnQgYXBwcm9wcmlhdGUKKyAgICAgKiBhbmltYXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgVmlld0dyb3VwIGZyb20gd2hpY2ggdGhlIFZpZXcgaXMgYmVpbmcgcmVtb3ZlZC4KKyAgICAgKiBAcGFyYW0gY2hpbGQgVGhlIFZpZXcgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBWaWV3R3JvdXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoVmlld0dyb3VwIHBhcmVudCwgVmlldyBjaGlsZCkgeworICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKFRyYW5zaXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IG1MaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5zdGFydFRyYW5zaXRpb24odGhpcywgcGFyZW50LCBjaGlsZCwgRElTQVBQRUFSSU5HKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBydW5DaGFuZ2VUcmFuc2l0aW9uKHBhcmVudCwgY2hpbGQsIERJU0FQUEVBUklORyk7CisgICAgICAgIHJ1bkRpc2FwcGVhcmluZ1RyYW5zaXRpb24ocGFyZW50LCBjaGlsZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFZpZXdHcm91cCB3aGVuIGEgY2hpbGQgdmlldyBpcyBhYm91dCB0byBiZSByZW1vdmVkIGZyb20gdGhlCisgICAgICogY29udGFpbmVyLiBUaGlzIGNhbGxiYWNrIHN0YXJ0cyB0aGUgcHJvY2VzcyBvZiBhIHRyYW5zaXRpb247IHdlIGdyYWIgdGhlIHN0YXJ0aW5nCisgICAgICogdmFsdWVzLCBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8gYWxsIG9mIHRoZSBjaGlsZHJlbiBvZiB0aGUgY29udGFpbmVyLCBhbmQgc3RhcnQgYXBwcm9wcmlhdGUKKyAgICAgKiBhbmltYXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgVmlld0dyb3VwIGZyb20gd2hpY2ggdGhlIFZpZXcgaXMgYmVpbmcgcmVtb3ZlZC4KKyAgICAgKiBAcGFyYW0gY2hpbGQgVGhlIFZpZXcgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBWaWV3R3JvdXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGlkZUNoaWxkKFZpZXdHcm91cCBwYXJlbnQsIFZpZXcgY2hpbGQpIHsKKyAgICAgICAgcmVtb3ZlQ2hpbGQocGFyZW50LCBjaGlsZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBib3VuZHMgb2YgdGhlIHZpZXcgY2hhbmdlIGR1ZSB0bworICAgICAqIGxheW91dCBwcm9jZXNzaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gbGF5b3V0IGJvdW5kcyBjaGFuZ2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVHJhbnNpdGlvbkxpc3RlbmVyKFRyYW5zaXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobUxpc3RlbmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxUcmFuc2l0aW9uTGlzdGVuZXI+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpc3RlbmVyIGZvciBsYXlvdXQgY2hhbmdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgZm9yIGxheW91dCBib3VuZHMgY2hhbmdlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRyYW5zaXRpb25MaXN0ZW5lcihUcmFuc2l0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGxpc3Qgb2YgbGlzdGVuZXJzIGZvciBsYXlvdXQgY2hhbmdlcy4KKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIExpc3Q8VHJhbnNpdGlvbkxpc3RlbmVyPiBnZXRUcmFuc2l0aW9uTGlzdGVuZXJzKCkgeworICAgICAgICByZXR1cm4gbUxpc3RlbmVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGZvciBsaXN0ZW5pbmcgdG8gc3RhcnRpbmcgYW5kIGVuZGluZyBldmVudHMgZm9yIHRyYW5zaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgVHJhbnNpdGlvbkxpc3RlbmVyIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBldmVudCBpcyBzZW50IHRvIGxpc3RlbmVycyB3aGVuIGFuIEFQUEVBUklORyBvciBESVNBUFBFQVJJTkcgdHJhbnNpdGlvbgorICAgICAgICAgKiBiZWdpbnMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uIFRoZSBMYXlvdXRUcmFuc2l0aW9uIHNlbmRpbmcgb3V0IHRoZSBldmVudC4KKyAgICAgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgVmlld0dyb3VwIG9uIHdoaWNoIHRoZSB0cmFuc2l0aW9uIGlzIHBsYXlpbmcuCisgICAgICAgICAqIEBwYXJhbSB2aWV3IFRoZSBWaWV3IG9iamVjdCBiZWluZyBhZGRlZCBvciByZW1vdmVkIGZyb20gaXRzIHBhcmVudC4KKyAgICAgICAgICogQHBhcmFtIHRyYW5zaXRpb25UeXBlIFRoZSB0eXBlIG9mIHRyYW5zaXRpb24gdGhhdCBpcyBiZWdpbm5pbmcsIGVpdGhlcgorICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uTGF5b3V0VHJhbnNpdGlvbiNBUFBFQVJJTkd9IG9yCisgICAgICAgICAqIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5MYXlvdXRUcmFuc2l0aW9uI0RJU0FQUEVBUklOR30uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFRyYW5zaXRpb24oTGF5b3V0VHJhbnNpdGlvbiB0cmFuc2l0aW9uLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgICAgIFZpZXcgdmlldywgaW50IHRyYW5zaXRpb25UeXBlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBldmVudCBpcyBzZW50IHRvIGxpc3RlbmVycyB3aGVuIGFuIEFQUEVBUklORyBvciBESVNBUFBFQVJJTkcgdHJhbnNpdGlvbiBlbmRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdHJhbnNpdGlvbiBUaGUgTGF5b3V0VHJhbnNpdGlvbiBzZW5kaW5nIG91dCB0aGUgZXZlbnQuCisgICAgICAgICAqIEBwYXJhbSBjb250YWluZXIgVGhlIFZpZXdHcm91cCBvbiB3aGljaCB0aGUgdHJhbnNpdGlvbiBpcyBwbGF5aW5nLgorICAgICAgICAgKiBAcGFyYW0gdmlldyBUaGUgVmlldyBvYmplY3QgYmVpbmcgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQuCisgICAgICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uVHlwZSBUaGUgdHlwZSBvZiB0cmFuc2l0aW9uIHRoYXQgaXMgZW5kaW5nLCBlaXRoZXIKKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb24jQVBQRUFSSU5HfSBvcgorICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uTGF5b3V0VHJhbnNpdGlvbiNESVNBUFBFQVJJTkd9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgZW5kVHJhbnNpdGlvbihMYXlvdXRUcmFuc2l0aW9uIHRyYW5zaXRpb24sIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgVmlldyB2aWV3LCBpbnQgdHJhbnNpdGlvblR5cGUpOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9PYmplY3RBbmltYXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL09iamVjdEFuaW1hdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFkZGIwYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9PYmplY3RBbmltYXRvci5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKKy8qKgorICogVGhpcyBzdWJjbGFzcyBvZiB7QGxpbmsgVmFsdWVBbmltYXRvcn0gcHJvdmlkZXMgc3VwcG9ydCBmb3IgYW5pbWF0aW5nIHByb3BlcnRpZXMgb24gdGFyZ2V0IG9iamVjdHMuCisgKiBUaGUgY29uc3RydWN0b3JzIG9mIHRoaXMgY2xhc3MgdGFrZSBwYXJhbWV0ZXJzIHRvIGRlZmluZSB0aGUgdGFyZ2V0IG9iamVjdCB0aGF0IHdpbGwgYmUgYW5pbWF0ZWQKKyAqIGFzIHdlbGwgYXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBhbmltYXRlZC4gQXBwcm9wcmlhdGUgc2V0L2dldCBmdW5jdGlvbnMKKyAqIGFyZSB0aGVuIGRldGVybWluZWQgaW50ZXJuYWxseSBhbmQgdGhlIGFuaW1hdGlvbiB3aWxsIGNhbGwgdGhlc2UgZnVuY3Rpb25zIGFzIG5lY2Vzc2FyeSB0bworICogYW5pbWF0ZSB0aGUgcHJvcGVydHkuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBPYmplY3RBbmltYXRvcjxUPiBleHRlbmRzIFZhbHVlQW5pbWF0b3I8VD4geworCisgICAgLy8gVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIHByb3BlcnR5IGV4aXN0cywgc2V0IGluIHRoZSBjb25zdHJ1Y3RvcgorICAgIHByaXZhdGUgT2JqZWN0IG1UYXJnZXQ7CisKKyAgICBwcml2YXRlIFN0cmluZyBtUHJvcGVydHlOYW1lOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBUaGlzIG5hbWUgaXMgdXNlZCB0byBkZXJpdmUKKyAgICAgKiBhIHNldHRlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHRvIHNldCBhbmltYXRlZCB2YWx1ZXMuCisgICAgICogRm9yIGV4YW1wbGUsIGEgcHJvcGVydHkgbmFtZSBvZiA8Y29kZT5mb288L2NvZGU+IHdpbGwgcmVzdWx0CisgICAgICogaW4gYSBjYWxsIHRvIHRoZSBmdW5jdGlvbiA8Y29kZT5zZXRGb28oKTwvY29kZT4gb24gdGhlIHRhcmdldCBvYmplY3QuIElmIGVpdGhlcgorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gb3IgPGNvZGU+dmFsdWVUbzwvY29kZT4gaXMgbnVsbCwgdGhlbiBhIGdldHRlciBmdW5jdGlvbiB3aWxsCisgICAgICogYWxzbyBiZSBkZXJpdmVkIGFuZCBjYWxsZWQuCisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIHNldHRlciBmdW5jdGlvbiBkZXJpdmVkIGZyb20gdGhpcyBwcm9wZXJ0eSBuYW1lCisgICAgICogbXVzdCB0YWtlIHRoZSBzYW1lIHBhcmFtZXRlciB0eXBlIGFzIHRoZQorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gYW5kIDxjb2RlPnZhbHVlVG88L2NvZGU+IHByb3BlcnRpZXMsIG90aGVyd2lzZSB0aGUgY2FsbCB0bworICAgICAqIHRoZSBzZXR0ZXIgZnVuY3Rpb24gd2lsbCBmYWlsLjwvcD4KKyAgICAgKgorICAgICAqIDxwPklmIHRoaXMgT2JqZWN0QW5pbWF0b3IgaGFzIGJlZW4gc2V0IHVwIHRvIGFuaW1hdGUgc2V2ZXJhbCBwcm9wZXJ0aWVzIHRvZ2V0aGVyLAorICAgICAqIHVzaW5nIG1vcmUgdGhhbiBvbmUgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cywgdGhlbiBzZXR0aW5nIHRoZSBwcm9wZXJ0eU5hbWUgc2ltcGx5CisgICAgICogc2V0cyB0aGUgcHJvcGVydHlOYW1lIGluIHRoZSBmaXJzdCBvZiB0aG9zZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisgICAgICAgIC8vIG1WYWx1ZXMgY291bGQgYmUgbnVsbCBpZiB0aGlzIGlzIGJlaW5nIGNvbnN0cnVjdGVkIHBpZWNlbWVhbC4gSnVzdCByZWNvcmQgdGhlCisgICAgICAgIC8vIHByb3BlcnR5TmFtZSB0byBiZSB1c2VkIGxhdGVyIHdoZW4gc2V0VmFsdWVzKCkgaXMgY2FsbGVkIGlmIHNvLgorICAgICAgICBpZiAobVZhbHVlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciB2YWx1ZXNIb2xkZXIgPSBtVmFsdWVzWzBdOworICAgICAgICAgICAgU3RyaW5nIG9sZE5hbWUgPSB2YWx1ZXNIb2xkZXIuZ2V0UHJvcGVydHlOYW1lKCk7CisgICAgICAgICAgICB2YWx1ZXNIb2xkZXIuc2V0UHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSk7CisgICAgICAgICAgICBtVmFsdWVzTWFwLnJlbW92ZShvbGROYW1lKTsKKyAgICAgICAgICAgIG1WYWx1ZXNNYXAucHV0KHByb3BlcnR5TmFtZSwgdmFsdWVzSG9sZGVyKTsKKyAgICAgICAgfQorICAgICAgICBtUHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOworICAgICAgICAvLyBOZXcgcHJvcGVydHkvdmFsdWVzL3RhcmdldCBzaG91bGQgY2F1c2UgcmUtaW5pdGlhbGl6YXRpb24gcHJpb3IgdG8gc3RhcnRpbmcKKyAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBUaGlzIG5hbWUgd2lsbCBiZSB1c2VkIHRvIGRlcml2ZQorICAgICAqIGEgc2V0dGVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgdG8gc2V0IGFuaW1hdGVkIHZhbHVlcy4KKyAgICAgKiBGb3IgZXhhbXBsZSwgYSBwcm9wZXJ0eSBuYW1lIG9mIDxjb2RlPmZvbzwvY29kZT4gd2lsbCByZXN1bHQKKyAgICAgKiBpbiBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIDxjb2RlPnNldEZvbygpPC9jb2RlPiBvbiB0aGUgdGFyZ2V0IG9iamVjdC4gSWYgZWl0aGVyCisgICAgICogPGNvZGU+dmFsdWVGcm9tPC9jb2RlPiBvciA8Y29kZT52YWx1ZVRvPC9jb2RlPiBpcyBudWxsLCB0aGVuIGEgZ2V0dGVyIGZ1bmN0aW9uIHdpbGwKKyAgICAgKiBhbHNvIGJlIGRlcml2ZWQgYW5kIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9wZXJ0eU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHRoZSBzZXR0ZXIgb3IgZ2V0dGVyIGZ1bmN0aW9uIHVzaW5nIHRoZSBKYXZhQmVhbnMgY29udmVudGlvbiBvZiBzZXRGb28gb3IKKyAgICAgKiBnZXRGb28gZm9yIGEgcHJvcGVydHkgbmFtZWQgJ2ZvbycuIFRoaXMgZnVuY3Rpb24gZmlndXJlcyBvdXQgd2hhdCB0aGUgbmFtZSBvZiB0aGUKKyAgICAgKiBmdW5jdGlvbiBzaG91bGQgYmUgYW5kIHVzZXMgcmVmbGVjdGlvbiB0byBmaW5kIHRoZSBNZXRob2Qgd2l0aCB0aGF0IG5hbWUgb24gdGhlCisgICAgICogdGFyZ2V0IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXggInNldCIgb3IgImdldCIsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIG5lZWQgYSBzZXR0ZXIgb3IgZ2V0dGVyLgorICAgICAqIEByZXR1cm4gTWV0aG9kIHRoZSBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIG1Qcm9wZXJ0eU5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBNZXRob2QgZ2V0UHJvcGVydHlGdW5jdGlvbihTdHJpbmcgcHJlZml4LCBDbGFzcyB2YWx1ZVR5cGUpIHsKKyAgICAgICAgLy8gVE9ETzogZmFzdGVyIGltcGxlbWVudGF0aW9uLi4uCisgICAgICAgIE1ldGhvZCByZXR1cm5WYWwgPSBudWxsOworICAgICAgICBTdHJpbmcgZmlyc3RMZXR0ZXIgPSBtUHJvcGVydHlOYW1lLnN1YnN0cmluZygwLCAxKTsKKyAgICAgICAgU3RyaW5nIHRoZVJlc3QgPSBtUHJvcGVydHlOYW1lLnN1YnN0cmluZygxKTsKKyAgICAgICAgZmlyc3RMZXR0ZXIgPSBmaXJzdExldHRlci50b1VwcGVyQ2FzZSgpOworICAgICAgICBTdHJpbmcgc2V0dGVyTmFtZSA9IHByZWZpeCArIGZpcnN0TGV0dGVyICsgdGhlUmVzdDsKKyAgICAgICAgQ2xhc3MgYXJnc1tdID0gbnVsbDsKKyAgICAgICAgaWYgKHZhbHVlVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICBhcmdzID0gbmV3IENsYXNzWzFdOworICAgICAgICAgICAgYXJnc1swXSA9IHZhbHVlVHlwZTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuVmFsID0gbVRhcmdldC5nZXRDbGFzcygpLmdldE1ldGhvZChzZXR0ZXJOYW1lLCBhcmdzKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKCJPYmplY3RBbmltYXRvciIsCisgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBmaW5kIHNldHRlci9nZXR0ZXIgZm9yIHByb3BlcnR5ICIgKyBtUHJvcGVydHlOYW1lICsgIjogIiArIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR1cm5WYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBPYmplY3RBbmltYXRvciBvYmplY3QuIFRoaXMgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBwcmltYXJpbHkgZm9yCisgICAgICogdXNlIGludGVybmFsbHk7IHRoZSBvdGhlciBjb25zdHJ1Y3RvcnMgd2hpY2ggdGFrZSBwYXJhbWV0ZXJzIGFyZSBtb3JlIGdlbmVyYWxseQorICAgICAqIHVzZWZ1bC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0QW5pbWF0b3IoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEgc2luZ2xlIHByb3BlcnR5IG5hbWUgYW5kIHNldCBvZiB2YWx1ZXMuIFRoaXMgY29uc3RydWN0b3IgaXMKKyAgICAgKiB1c2VkIGluIHRoZSBzaW1wbGUgY2FzZSBvZiBhbmltYXRpbmcgYSBzaW5nbGUgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gVGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLCBpbiBtaWxsaXNlY29uZHMuCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IHdob3NlIHByb3BlcnR5IGlzIHRvIGJlIGFuaW1hdGVkLiBUaGlzIG9iamVjdCBzaG91bGQKKyAgICAgKiBoYXZlIGEgcHVibGljIG1ldGhvZCBvbiBpdCBjYWxsZWQgPGNvZGU+c2V0TmFtZSgpPC9jb2RlPiwgd2hlcmUgPGNvZGU+bmFtZTwvY29kZT4gaXMKKyAgICAgKiB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4gcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLgorICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHNldCBvZiB2YWx1ZXMgdG8gYW5pbWF0ZSBiZXR3ZWVuLiBJZiB0aGVyZSBpcyBvbmx5IG9uZSB2YWx1ZSwgaXQKKyAgICAgKiBpcyBhc3N1bWVkIHRvIGJlIHRoZSBmaW5hbCB2YWx1ZSBiZWluZyBhbmltYXRlZCB0bywgYW5kIHRoZSBpbml0aWFsIHZhbHVlIHdpbGwgYmUKKyAgICAgKiBkZXJpdmVkIG9uIHRoZSBmbHkuCisgICAgICovCisgICAgcHVibGljIE9iamVjdEFuaW1hdG9yKGxvbmcgZHVyYXRpb24sIE9iamVjdCB0YXJnZXQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIFQuLi52YWx1ZXMpIHsKKyAgICAgICAgc3VwZXIoZHVyYXRpb24sIChUW10pIHZhbHVlcyk7CisgICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7CisgICAgICAgIHNldFByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyA8Y29kZT5Qcm9wZXJ0eVZhbHVlSG9sZGVyPC9jb2RlPiB2YWx1ZXMuIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkCisgICAgICogYmUgdXNlZCB3aGVuIGFuaW1hdGluZyBzZXZlcmFsIHByb3BlcnRpZXMgYXQgb25jZSB3aXRoIHRoZSBzYW1lIE9iamVjdEFuaW1hdG9yLCBzaW5jZQorICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyIGFsbG93cyB5b3UgdG8gYXNzb2NpYXRlIGEgc2V0IG9mIGFuaW1hdGlvbiB2YWx1ZXMgd2l0aCBhIHByb3BlcnR5CisgICAgICogbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydHkgaXMgdG8gYmUgYW5pbWF0ZWQuIFRoaXMgb2JqZWN0IHNob3VsZAorICAgICAqIGhhdmUgcHVibGljIG1ldGhvZHMgb24gaXQgY2FsbGVkIDxjb2RlPnNldE5hbWUoKTwvY29kZT4sIHdoZXJlIDxjb2RlPm5hbWU8L2NvZGU+IGlzCisgICAgICogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHBhc3NlZCBpbiBhcyB0aGUgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBwYXJhbWV0ZXIgZm9yCisgICAgICogZWFjaCBvZiB0aGUgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cy4KKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzIHdoaWNoIGhvbGQgZWFjaCB0aGUgcHJvcGVydHkgbmFtZSBhbmQgdmFsdWVzCisgICAgICogdG8gYW5pbWF0ZSB0aGF0IHByb3BlcnR5IGJldHdlZW4uCisgICAgICovCisgICAgcHVibGljIE9iamVjdEFuaW1hdG9yKGxvbmcgZHVyYXRpb24sIE9iamVjdCB0YXJnZXQsIFByb3BlcnR5VmFsdWVzSG9sZGVyLi4udmFsdWVzKSB7CisgICAgICAgIHN1cGVyKGR1cmF0aW9uKTsKKyAgICAgICAgc2V0VmFsdWVzKHZhbHVlcyk7CisgICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWVzKFQuLi4gdmFsdWVzKSB7CisgICAgICAgIGlmIChtVmFsdWVzID09IG51bGwgfHwgbVZhbHVlcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgLy8gTm8gdmFsdWVzIHlldCAtIHRoaXMgYW5pbWF0b3IgaXMgYmVpbmcgY29uc3RydWN0ZWQgcGllY2VtZWFsLiBJbml0IHRoZSB2YWx1ZXMgd2l0aAorICAgICAgICAgICAgLy8gd2hhdGV2ZXIgdGhlIGN1cnJlbnQgcHJvcGVydHlOYW1lIGlzCisgICAgICAgICAgICBzZXRWYWx1ZXMobmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyW117CisgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcihtUHJvcGVydHlOYW1lLCAoT2JqZWN0W10pdmFsdWVzKX0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VwZXIuc2V0VmFsdWVzKChUW10pIHZhbHVlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgZmlyc3QgYW5pbWF0aW9uCisgICAgICogZnJhbWUgb2YgYW4gYW5pbWF0aW9uLiBJZiB0aGVyZSBpcyBhIG5vbnplcm8gPGNvZGU+c3RhcnREZWxheTwvY29kZT4sIHRoZQorICAgICAqIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGF0IGRlbGF5IGVuZHMuCisgICAgICogSXQgdGFrZXMgY2FyZSBvZiB0aGUgZmluYWwgaW5pdGlhbGl6YXRpb24gc3RlcHMgZm9yIHRoZQorICAgICAqIGFuaW1hdGlvbi4gVGhpcyBpbmNsdWRlcyBzZXR0aW5nIG1FdmFsdWF0b3IsIGlmIHRoZSB1c2VyIGhhcyBub3QgeWV0CisgICAgICogc2V0IGl0IHVwLCBhbmQgdGhlIHNldHRlci9nZXR0ZXIgbWV0aG9kcywgaWYgdGhlIHVzZXIgZGlkIG5vdCBzdXBwbHkKKyAgICAgKiB0aGVtLgorICAgICAqCisgICAgICogIDxwPk92ZXJyaWRlcnMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNhbGwgdGhlIHN1cGVyY2xhc3MgbWV0aG9kIHRvIGNhdXNlCisgICAgICogIGludGVybmFsIG1lY2hhbmlzbXMgdG8gYmUgc2V0IHVwIGNvcnJlY3RseS48L3A+CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBpbml0QW5pbWF0aW9uKCkgeworICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICAgICAgLy8gbVZhbHVlVHlwZSBtYXkgY2hhbmdlIGR1ZSB0byBzZXR0ZXIvZ2V0dGVyIHNldHVwOyBkbyB0aGlzIGJlZm9yZSBjYWxsaW5nIHN1cGVyLmluaXQoKSwKKyAgICAgICAgICAgIC8vIHdoaWNoIHVzZXMgbVZhbHVlVHlwZSB0byBzZXQgdXAgdGhlIGRlZmF1bHQgdHlwZSBldmFsdWF0b3IuCisgICAgICAgICAgICBpbnQgbnVtVmFsdWVzID0gbVZhbHVlcy5sZW5ndGg7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICAgICAgbVZhbHVlc1tpXS5zZXR1cFNldHRlckFuZEdldHRlcihtVGFyZ2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1cGVyLmluaXRBbmltYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHRhcmdldCBvYmplY3Qgd2hvc2UgcHJvcGVydHkgd2lsbCBiZSBhbmltYXRlZCBieSB0aGlzIGFuaW1hdGlvbgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgb2JqZWN0IGJlaW5nIGFuaW1hdGVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRUYXJnZXQoKSB7CisgICAgICAgIHJldHVybiBtVGFyZ2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRhcmdldCBvYmplY3Qgd2hvc2UgcHJvcGVydHkgd2lsbCBiZSBhbmltYXRlZCBieSB0aGlzIGFuaW1hdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IGJlaW5nIGFuaW1hdGVkCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE9iamVjdCB0YXJnZXQpIHsKKyAgICAgICAgbVRhcmdldCA9IHRhcmdldDsKKyAgICAgICAgLy8gTmV3IHByb3BlcnR5L3ZhbHVlcy90YXJnZXQgc2hvdWxkIGNhdXNlIHJlLWluaXRpYWxpemF0aW9uIHByaW9yIHRvIHN0YXJ0aW5nCisgICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldHVwU3RhcnRWYWx1ZXMoKSB7CisgICAgICAgIGluaXRBbmltYXRpb24oKTsKKyAgICAgICAgaW50IG51bVZhbHVlcyA9IG1WYWx1ZXMubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICBtVmFsdWVzW2ldLnNldHVwU3RhcnRWYWx1ZShtVGFyZ2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldHVwRW5kVmFsdWVzKCkgeworICAgICAgICBpbml0QW5pbWF0aW9uKCk7CisgICAgICAgIGludCBudW1WYWx1ZXMgPSBtVmFsdWVzLmxlbmd0aDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7ICsraSkgeworICAgICAgICAgICAgbVZhbHVlc1tpXS5zZXR1cEVuZFZhbHVlKG1UYXJnZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggdGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhlIGFuaW1hdGlvbiBkdXJpbmcgZXZlcnkKKyAgICAgKiBhbmltYXRpb24gZnJhbWUuIFRoaXMgZnVuY3Rpb24gdHVybnMgdGhlIGVsYXBzZWQgZnJhY3Rpb24gaW50byBhbiBpbnRlcnBvbGF0ZWQgZnJhY3Rpb24KKyAgICAgKiBhbmQgdGhlbiBpbnRvIGFuIGFuaW1hdGVkIHZhbHVlIChmcm9tIHRoZSBldmFsdWF0b3IuIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgbW9zdGx5IGR1cmluZworICAgICAqIGFuaW1hdGlvbiB1cGRhdGVzLCBidXQgaXQgaXMgYWxzbyBjYWxsZWQgd2hlbiB0aGUgPGNvZGU+ZW5kKCk8L2NvZGU+CisgICAgICogZnVuY3Rpb24gaXMgY2FsbGVkLCB0byBzZXQgdGhlIGZpbmFsIHZhbHVlIG9uIHRoZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPk92ZXJyaWRlcyBvZiB0aGlzIG1ldGhvZCBtdXN0IGNhbGwgdGhlIHN1cGVyY2xhc3MgdG8gcGVyZm9ybSB0aGUgY2FsY3VsYXRpb24KKyAgICAgKiBvZiB0aGUgYW5pbWF0ZWQgdmFsdWUuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSBlbGFwc2VkIGZyYWN0aW9uIG9mIHRoZSBhbmltYXRpb24uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBhbmltYXRlVmFsdWUoZmxvYXQgZnJhY3Rpb24pIHsKKyAgICAgICAgc3VwZXIuYW5pbWF0ZVZhbHVlKGZyYWN0aW9uKTsKKyAgICAgICAgaW50IG51bVZhbHVlcyA9IG1WYWx1ZXMubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICBtVmFsdWVzW2ldLnNldEFuaW1hdGVkVmFsdWUobVRhcmdldCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0QW5pbWF0b3IgY2xvbmUoKSB7CisgICAgICAgIGZpbmFsIE9iamVjdEFuaW1hdG9yIGFuaW0gPSAoT2JqZWN0QW5pbWF0b3IpIHN1cGVyLmNsb25lKCk7CisgICAgICAgIHJldHVybiBhbmltOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9Qcm9wZXJ0eVZhbHVlc0hvbGRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1Byb3BlcnR5VmFsdWVzSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0NjEyMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9Qcm9wZXJ0eVZhbHVlc0hvbGRlci5qYXZhCkBAIC0wLDAgKzEsNTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7CisKKy8qKgorICogVGhpcyBjbGFzcyBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBhIHByb3BlcnR5IGFuZCB0aGUgdmFsdWVzIHRoYXQgdGhhdCBwcm9wZXJ0eQorICogc2hvdWxkIHRha2Ugb24gZHVyaW5nIGFuIGFuaW1hdGlvbi4gUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cyBjYW4gYmUgdXNlZCB0byBjcmVhdGUKKyAqIGFuaW1hdGlvbnMgd2l0aCBWYWx1ZUFuaW1hdG9yIG9yIE9iamVjdEFuaW1hdG9yIHRoYXQgb3BlcmF0ZSBvbiBzZXZlcmFsIGRpZmZlcmVudCBwcm9wZXJ0aWVzCisgKiBpbiBwYXJhbGxlbC4KKyAqLworcHVibGljIGNsYXNzIFByb3BlcnR5VmFsdWVzSG9sZGVyPFQ+IGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGggdGhlIHZhbHVlcy4gVGhpcyBuZWVkIG5vdCBiZSBhIHJlYWwgcHJvcGVydHksCisgICAgICogdW5sZXNzIHRoaXMgb2JqZWN0IGlzIGJlaW5nIHVzZWQgd2l0aCBPYmplY3RBbmltYXRvci4gQnV0IHRoaXMgaXMgdGhlIG5hbWUgYnkgd2hpY2gKKyAgICAgKiBhbmlhbXRlZCB2YWx1ZXMgYXJlIGxvb2tlZCB1cCB3aXRoIGdldEFuaW1hdGVkVmFsdWUoU3RyaW5nKSBpbiBWYWx1ZUFuaW1hdG9yLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1Qcm9wZXJ0eU5hbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0dGVyIGZ1bmN0aW9uLCBpZiBuZWVkZWQuIE9iamVjdEFuaW1hdG9yIGhhbmRzIG9mZiB0aGlzIGZ1bmN0aW9uYWxpdHkgdG8KKyAgICAgKiBQcm9wZXJ0eVZhbHVlc0hvbGRlciwgc2luY2UgaXQgaG9sZHMgYWxsIG9mIHRoZSBwZXItcHJvcGVydHkgaW5mb3JtYXRpb24uIFRoaXMKKyAgICAgKiBwcm9wZXJ0eSBjYW4gYmUgbWFudWFsbHkgc2V0IHZpYSBzZXRTZXR0ZXIoKS4gT3RoZXJ3aXNlLCBpdCBpcyBhdXRvbWF0aWNhbGx5CisgICAgICogZGVyaXZlZCB3aGVuIHRoZSBhbmltYXRpb24gc3RhcnRzIGluIHNldHVwU2V0dGVyQW5kR2V0dGVyKCkgaWYgdXNpbmcgT2JqZWN0QW5pbWF0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBNZXRob2QgbVNldHRlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZ2V0dGVyIGZ1bmN0aW9uLCBpZiBuZWVkZWQuIE9iamVjdEFuaW1hdG9yIGhhbmRzIG9mZiB0aGlzIGZ1bmN0aW9uYWxpdHkgdG8KKyAgICAgKiBQcm9wZXJ0eVZhbHVlc0hvbGRlciwgc2luY2UgaXQgaG9sZHMgYWxsIG9mIHRoZSBwZXItcHJvcGVydHkgaW5mb3JtYXRpb24uIFRoaXMKKyAgICAgKiBwcm9wZXJ0eSBjYW4gYmUgbWFudWFsbHkgc2V0IHZpYSBzZXRTZXR0ZXIoKS4gT3RoZXJ3aXNlLCBpdCBpcyBhdXRvbWF0aWNhbGx5CisgICAgICogZGVyaXZlZCB3aGVuIHRoZSBhbmltYXRpb24gc3RhcnRzIGluIHNldHVwU2V0dGVyQW5kR2V0dGVyKCkgaWYgdXNpbmcgT2JqZWN0QW5pbWF0b3IuCisgICAgICogVGhlIGdldHRlciBpcyBvbmx5IGRlcml2ZWQgYW5kIHVzZWQgaWYgb25lIG9mIHRoZSB2YWx1ZXMgaXMgbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1ldGhvZCBtR2V0dGVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHZhbHVlcyBzdXBwbGllZC4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGJvdGggaW4gZGVyaXZpbmcgdGhlIHNldHRlci9nZXR0ZXIKKyAgICAgKiBmdW5jdGlvbnMgYW5kIGluIGRlcml2aW5nIHRoZSB0eXBlIG9mIFR5cGVFdmFsdWF0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzcyBtVmFsdWVUeXBlOworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBrZXlmcmFtZXMgKHRpbWUvdmFsdWUgcGFpcnMpIHRoYXQgZGVmaW5lIHRoaXMgYW5pbWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgS2V5ZnJhbWVTZXQgbUtleWZyYW1lU2V0ID0gbnVsbDsKKworCisgICAgLy8gdHlwZSBldmFsdWF0b3JzIGZvciB0aGUgdGhyZWUgcHJpbWl0aXZlIHR5cGVzIGhhbmRsZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVFdmFsdWF0b3Igc0ludEV2YWx1YXRvciA9IG5ldyBJbnRFdmFsdWF0b3IoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlRXZhbHVhdG9yIHNGbG9hdEV2YWx1YXRvciA9IG5ldyBGbG9hdEV2YWx1YXRvcigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVFdmFsdWF0b3Igc0RvdWJsZUV2YWx1YXRvciA9IG5ldyBEb3VibGVFdmFsdWF0b3IoKTsKKworICAgIC8vIFdlIHRyeSBzZXZlcmFsIGRpZmZlcmVudCB0eXBlcyB3aGVuIHNlYXJjaGluZyBmb3IgYXBwcm9wcmlhdGUgc2V0dGVyL2dldHRlciBmdW5jdGlvbnMuCisgICAgLy8gVGhlIGNhbGxlciBtYXkgaGF2ZSBzdXBwbGllZCB2YWx1ZXMgaW4gYSB0eXBlIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIHNldHRlci9nZXR0ZXIKKyAgICAvLyBmdW5jdGlvbnMgKHN1Y2ggYXMgdGhlIGludGVnZXJzIDAgYW5kIDEgdG8gcmVwcmVzZW50IGZsb2F0aW5nIHBvaW50IHZhbHVlcyBmb3IgYWxwaGEpLgorICAgIC8vIEFsc28sIHRoZSB1c2Ugb2YgZ2VuZXJpY3MgaW4gY29uc3RydWN0b3JzIG1lYW5zIHRoYXQgd2UgZW5kIHVwIHdpdGggdGhlIE9iamVjdCB2ZXJzaW9ucworICAgIC8vIG9mIHByaW1pdGl2ZSB0eXBlcyAoRmxvYXQgdnMuIGZsb2F0KS4gQnV0IG1vc3QgbGlrZWx5LCB0aGUgc2V0dGVyL2dldHRlciBmdW5jdGlvbnMKKyAgICAvLyB3aWxsIHRha2UgcHJpbWl0aXZlIHR5cGVzIGluc3RlYWQuCisgICAgLy8gU28gd2Ugc3VwcGx5IGFuIG9yZGVyZWQgYXJyYXkgb2Ygb3RoZXIgdHlwZXMgdG8gdHJ5IGJlZm9yZSBnaXZpbmcgdXAuCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NbXSBGTE9BVF9WQVJJQU5UUyA9IHtmbG9hdC5jbGFzcywgRmxvYXQuY2xhc3MsIGRvdWJsZS5jbGFzcywgaW50LmNsYXNzLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLCBJbnRlZ2VyLmNsYXNzfTsKKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzc1tdIElOVEVHRVJfVkFSSUFOVFMgPSB7aW50LmNsYXNzLCBJbnRlZ2VyLmNsYXNzLCBmbG9hdC5jbGFzcywgZG91YmxlLmNsYXNzLAorICAgICAgICAgICAgRmxvYXQuY2xhc3MsIERvdWJsZS5jbGFzc307CisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NbXSBET1VCTEVfVkFSSUFOVFMgPSB7ZG91YmxlLmNsYXNzLCBEb3VibGUuY2xhc3MsIGZsb2F0LmNsYXNzLCBpbnQuY2xhc3MsCisgICAgICAgICAgICBGbG9hdC5jbGFzcywgSW50ZWdlci5jbGFzc307CisKKyAgICAvLyBUaGVzZSBtYXBzIGhvbGQgYWxsIHByb3BlcnR5IGVudHJpZXMgZm9yIGEgcGFydGljdWxhciBjbGFzcy4gVGhpcyBtYXAKKyAgICAvLyBpcyB1c2VkIHRvIHNwZWVkIHVwIHByb3BlcnR5L3NldHRlci9nZXR0ZXIgbG9va3VwcyBmb3IgYSBnaXZlbiBjbGFzcy9wcm9wZXJ0eQorICAgIC8vIGNvbWJpbmF0aW9uLiBObyBuZWVkIHRvIHVzZSByZWZsZWN0aW9uIG9uIHRoZSBjb21iaW5hdGlvbiBtb3JlIHRoYW4gb25jZS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPENsYXNzLCBIYXNoTWFwPFN0cmluZywgTWV0aG9kPj4gc1NldHRlclByb3BlcnR5TWFwID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPENsYXNzLCBIYXNoTWFwPFN0cmluZywgTWV0aG9kPj4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPENsYXNzLCBIYXNoTWFwPFN0cmluZywgTWV0aG9kPj4gc0dldHRlclByb3BlcnR5TWFwID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPENsYXNzLCBIYXNoTWFwPFN0cmluZywgTWV0aG9kPj4oKTsKKworICAgIC8vIFRoaXMgbG9jayBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IG9ubHkgb25lIHRocmVhZCBpcyBhY2Nlc3NpbmcgdGhlIHByb3BlcnR5IG1hcHMKKyAgICAvLyBhdCBhIHRpbWUuCisgICAgcHJpdmF0ZSBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIHByb3BlcnR5TWFwTG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisKKyAgICAvLyBVc2VkIHRvIHBhc3Mgc2luZ2xlIHZhbHVlIHRvIHZhcmFyZ3MgcGFyYW1ldGVyIGluIHNldHRlciBpbnZvY2F0aW9uCisgICAgcHJpdmF0ZSBPYmplY3RbXSBtVG1wVmFsdWVBcnJheSA9IG5ldyBPYmplY3RbMV07CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBldmFsdWF0b3IgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGFuaW1hdGVkIHZhbHVlcy4gVGhpcyBldmFsdWF0b3IgaXMgZGV0ZXJtaW5lZAorICAgICAqIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhlIHR5cGUgb2YgdGhlIHN0YXJ0L2VuZCBvYmplY3RzIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciwKKyAgICAgKiBidXQgdGhlIHN5c3RlbSBvbmx5IGtub3dzIGFib3V0IHRoZSBwcmltaXRpdmUgdHlwZXMgaW50LCBkb3VibGUsIGFuZCBmbG9hdC4gQW55IG90aGVyCisgICAgICogdHlwZSB3aWxsIG5lZWQgdG8gc2V0IHRoZSBldmFsdWF0b3IgdG8gYSBjdXN0b20gZXZhbHVhdG9yIGZvciB0aGF0IHR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBUeXBlRXZhbHVhdG9yIG1FdmFsdWF0b3I7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgbW9zdCByZWNlbnRseSBjYWxjdWxhdGVkIGJ5IGNhbGN1bGF0ZVZhbHVlKCkuIFRoaXMgaXMgc2V0IGR1cmluZworICAgICAqIHRoYXQgZnVuY3Rpb24gYW5kIG1pZ2h0IGJlIHJldHJpZXZlZCBsYXRlciBlaXRoZXIgYnkgVmFsdWVBbmltYXRvci5hbmltYXRlZFZhbHVlKCkgb3IKKyAgICAgKiBieSB0aGUgcHJvcGVydHktc2V0dGluZyBsb2dpYyBpbiBPYmplY3RBbmltYXRvci5hbmltYXRlZFZhbHVlKCkuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgbUFuaW1hdGVkVmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0IHdpdGgganVzdCBhIHNldCBvZiB2YWx1ZXMuIFRoaXMgY29uc3RydWN0b3IKKyAgICAgKiBpcyB0eXBpY2FsbHkgbm90IHVzZWQgd2hlbiBhbmltYXRpbmcgb2JqZWN0cyB3aXRoIE9iamVjdEFuaW1hdG9yLCBiZWNhdXNlIHRoYXQKKyAgICAgKiBvYmplY3QgbmVlZHMgZGlzdGluY3QgYW5kIG1lYW5pbmdmdWwgcHJvcGVydHkgbmFtZXMuIFNpbXBsZXIgYW5pbWF0aW9ucyBvZiBvbmUKKyAgICAgKiBzZXQgb2YgdmFsdWVzIHVzaW5nIFZhbHVlQW5pbWF0b3IgbWF5IHVzZSB0aGlzIGNvbnN0cnVjdG9yLCBob3dldmVyLCBiZWNhdXNlIG5vCisgICAgICogZGlzdGluZ3Vpc2hpbmcgbmFtZSBpcyBuZWVkZWQuCisgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgc2V0IG9mIHZhbHVlcyB0byBhbmltYXRlIGJldHdlZW4uIElmIHRoZXJlIGlzIG9ubHkgb25lIHZhbHVlLCBpdAorICAgICAqIGlzIGFzc3VtZWQgdG8gYmUgdGhlIGZpbmFsIHZhbHVlIGJlaW5nIGFuaW1hdGVkIHRvLCBhbmQgdGhlIGluaXRpYWwgdmFsdWUgd2lsbCBiZQorICAgICAqIGRlcml2ZWQgb24gdGhlIGZseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydHlWYWx1ZXNIb2xkZXIoVC4uLnZhbHVlcykgeworICAgICAgICB0aGlzKG51bGwsIHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgbmFtZSBhbmQgc2V0IG9mCisgICAgICogdmFsdWVzLiBUaGVzZSB2YWx1ZXMgY2FuIGJlIG9mIGFueSB0eXBlLCBidXQgdGhlIHR5cGUgc2hvdWxkIGJlIGNvbnNpc3RlbnQgc28gdGhhdAorICAgICAqIGFuIGFwcHJvcHJpYXRlIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yfSBjYW4gYmUgZm91bmQgdGhhdCBtYXRjaGVzCisgICAgICogdGhlIGNvbW1vbiB0eXBlLgorICAgICAqIDxwPklmIHRoZXJlIGlzIG9ubHkgb25lIHZhbHVlLCBpdCBpcyBhc3N1bWVkIHRvIGJlIHRoZSBlbmQgdmFsdWUgb2YgYW4gYW5pbWF0aW9uLAorICAgICAqIGFuZCBhbiBpbml0aWFsIHZhbHVlIHdpbGwgYmUgZGVyaXZlZCwgaWYgcG9zc2libGUsIGJ5IGNhbGxpbmcgYSBnZXR0ZXIgZnVuY3Rpb24KKyAgICAgKiBvbiB0aGUgb2JqZWN0LiBBbHNvLCBpZiBhbnkgdmFsdWUgaXMgbnVsbCwgdGhlIHZhbHVlIHdpbGwgYmUgZmlsbGVkIGluIHdoZW4gdGhlIGFuaW1hdGlvbgorICAgICAqIHN0YXJ0cyBpbiB0aGUgc2FtZSB3YXkuIFRoaXMgbWVjaGFuaXNtIG9mIGF1dG9tYXRpY2FsbHkgZ2V0dGluZyBudWxsIHZhbHVlcyBvbmx5IHdvcmtzCisgICAgICogaWYgdGhlIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdCBpcyB1c2VkIGluIGNvbmp1bmN0aW9uCisgICAgICoge0BsaW5rIE9iamVjdEFuaW1hdG9yfSwgYW5kIHdpdGggYSBnZXR0ZXIgZnVuY3Rpb24gZWl0aGVyCisgICAgICogZGVyaXZlZCBhdXRvbWF0aWNhbGx5IGZyb20gPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBvciBzZXQgZXhwbGljaXRseSB2aWEKKyAgICAgKiB7QGxpbmsgI3NldEdldHRlcihqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpfSwgc2luY2Ugb3RoZXJ3aXNlIFByb3BlcnR5VmFsdWVzSG9sZGVyIGhhcworICAgICAqIG5vIHdheSBvZiBkZXRlcm1pbmluZyB3aGF0IHRoZSB2YWx1ZSBzaG91bGQgYmUuCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2V0IG9mIHZhbHVlcy4gVGhpcworICAgICAqIGNhbiBiZSB0aGUgYWN0dWFsIHByb3BlcnR5IG5hbWUgdG8gYmUgdXNlZCB3aGVuIHVzaW5nIGEgT2JqZWN0QW5pbWF0b3Igb2JqZWN0LCBvcgorICAgICAqIGp1c3QgYSBuYW1lIHVzZWQgdG8gZ2V0IGFuaW1hdGVkIHZhbHVlcywgc3VjaCBhcyBpZiB0aGlzIG9iamVjdCBpcyB1c2VkIHdpdGggYW4KKyAgICAgKiBWYWx1ZUFuaW1hdG9yIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBzZXQgb2YgdmFsdWVzIHRvIGFuaW1hdGUgYmV0d2Vlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydHlWYWx1ZXNIb2xkZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgVC4uLiB2YWx1ZXMpIHsKKyAgICAgICAgbVByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKKyAgICAgICAgc2V0VmFsdWVzKHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWVzIGJlaW5nIGFuaW1hdGVkIGJldHdlZW4uCisgICAgICogSWYgdGhlcmUgaXMgb25seSBvbmUgdmFsdWUsIGl0IGlzIGFzc3VtZWQgdG8gYmUgdGhlIGVuZCB2YWx1ZSBvZiBhbiBhbmltYXRpb24sCisgICAgICogYW5kIGFuIGluaXRpYWwgdmFsdWUgd2lsbCBiZSBkZXJpdmVkLCBpZiBwb3NzaWJsZSwgYnkgY2FsbGluZyBhIGdldHRlciBmdW5jdGlvbgorICAgICAqIG9uIHRoZSBvYmplY3QuIEFsc28sIGlmIGFueSB2YWx1ZSBpcyBudWxsLCB0aGUgdmFsdWUgd2lsbCBiZSBmaWxsZWQgaW4gd2hlbiB0aGUgYW5pbWF0aW9uCisgICAgICogc3RhcnRzIGluIHRoZSBzYW1lIHdheS4gVGhpcyBtZWNoYW5pc20gb2YgYXV0b21hdGljYWxseSBnZXR0aW5nIG51bGwgdmFsdWVzIG9ubHkgd29ya3MKKyAgICAgKiBpZiB0aGUgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0IGlzIHVzZWQgaW4gY29uanVuY3Rpb24KKyAgICAgKiB7QGxpbmsgT2JqZWN0QW5pbWF0b3J9LCBhbmQgd2l0aCBhIGdldHRlciBmdW5jdGlvbiBlaXRoZXIKKyAgICAgKiBkZXJpdmVkIGF1dG9tYXRpY2FsbHkgZnJvbSA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+IG9yIHNldCBleHBsaWNpdGx5IHZpYQorICAgICAqIHtAbGluayAjc2V0R2V0dGVyKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCl9LCBzaW5jZSBvdGhlcndpc2UgUHJvcGVydHlWYWx1ZXNIb2xkZXIgaGFzCisgICAgICogbm8gd2F5IG9mIGRldGVybWluaW5nIHdoYXQgdGhlIHZhbHVlIHNob3VsZCBiZS4KKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBzZXQgb2YgdmFsdWVzIHRvIGFuaW1hdGUgYmV0d2Vlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoVC4uLiB2YWx1ZXMpIHsKKyAgICAgICAgaW50IG51bUtleWZyYW1lcyA9IHZhbHVlcy5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtS2V5ZnJhbWVzOyArK2kpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZXNbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENsYXNzIHRoaXNWYWx1ZVR5cGUgPSB2YWx1ZXNbaV0uZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgICAgICBpZiAobVZhbHVlVHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1WYWx1ZVR5cGUgPSB0aGlzVmFsdWVUeXBlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzVmFsdWVUeXBlICE9IG1WYWx1ZVR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVmFsdWVUeXBlID09IEludGVnZXIuY2xhc3MgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXNWYWx1ZVR5cGUgPT0gRmxvYXQuY2xhc3MgfHwgdGhpc1ZhbHVlVHlwZSA9PSBEb3VibGUuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZhbHVlVHlwZSA9IHRoaXNWYWx1ZVR5cGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1WYWx1ZVR5cGUgPT0gRmxvYXQuY2xhc3MgJiYgdGhpc1ZhbHVlVHlwZSA9PSBEb3VibGUuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmFsdWVUeXBlID0gdGhpc1ZhbHVlVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBLZXlmcmFtZSBrZXlmcmFtZXNbXSA9IG5ldyBLZXlmcmFtZVtNYXRoLm1heChudW1LZXlmcmFtZXMsMildOworICAgICAgICBpZiAobVZhbHVlVHlwZS5lcXVhbHMoS2V5ZnJhbWUuY2xhc3MpKSB7CisgICAgICAgICAgICBtVmFsdWVUeXBlID0gKChLZXlmcmFtZSl2YWx1ZXNbMF0pLmdldFR5cGUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtS2V5ZnJhbWVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBrZXlmcmFtZXNbaV0gPSAoS2V5ZnJhbWUpdmFsdWVzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG51bUtleWZyYW1lcyA9PSAxKSB7CisgICAgICAgICAgICAgICAga2V5ZnJhbWVzWzBdID0gbmV3IEtleWZyYW1lKDBmLCAoT2JqZWN0KSBudWxsKTsKKyAgICAgICAgICAgICAgICBrZXlmcmFtZXNbMV0gPSBuZXcgS2V5ZnJhbWUoMWYsIHZhbHVlc1swXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGtleWZyYW1lc1swXSA9IG5ldyBLZXlmcmFtZSgwZiwgdmFsdWVzWzBdKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG51bUtleWZyYW1lczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNbaV0gIT0gbnVsbCAmJiAodmFsdWVzW2ldLmdldENsYXNzKCkgIT0gbVZhbHVlVHlwZSkpIHsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGtleWZyYW1lc1tpXSA9IG5ldyBLZXlmcmFtZSgoZmxvYXQpIGkgLyAobnVtS2V5ZnJhbWVzIC0gMSksIHZhbHVlc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1LZXlmcmFtZVNldCA9IG5ldyBLZXlmcmFtZVNldChrZXlmcmFtZXMpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgdGhlIHNldHRlciBvciBnZXR0ZXIgZnVuY3Rpb24gdXNpbmcgdGhlIEphdmFCZWFucyBjb252ZW50aW9uIG9mIHNldEZvbyBvcgorICAgICAqIGdldEZvbyBmb3IgYSBwcm9wZXJ0eSBuYW1lZCAnZm9vJy4gVGhpcyBmdW5jdGlvbiBmaWd1cmVzIG91dCB3aGF0IHRoZSBuYW1lIG9mIHRoZQorICAgICAqIGZ1bmN0aW9uIHNob3VsZCBiZSBhbmQgdXNlcyByZWZsZWN0aW9uIHRvIGZpbmQgdGhlIE1ldGhvZCB3aXRoIHRoYXQgbmFtZSBvbiB0aGUKKyAgICAgKiB0YXJnZXQgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldENsYXNzIFRoZSBjbGFzcyB0byBzZWFyY2ggZm9yIHRoZSBtZXRob2QKKyAgICAgKiBAcGFyYW0gcHJlZml4ICJzZXQiIG9yICJnZXQiLCBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSBuZWVkIGEgc2V0dGVyIG9yIGdldHRlci4KKyAgICAgKiBAcGFyYW0gdmFsdWVUeXBlIFRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgKGluIHRoZSBjYXNlIG9mIGEgc2V0dGVyKS4gVGhpcyB0eXBlCisgICAgICogaXMgZGVyaXZlZCBmcm9tIHRoZSB2YWx1ZXMgc2V0IG9uIHRoaXMgUHJvcGVydHlWYWx1ZXNIb2xkZXIuIFRoaXMgdHlwZSBpcyB1c2VkIGFzCisgICAgICogYSBmaXJzdCBndWVzcyBhdCB0aGUgcGFyYW1ldGVyIHR5cGUsIGJ1dCB3ZSBjaGVjayBmb3IgbWV0aG9kcyB3aXRoIHNldmVyYWwgZGlmZmVyZW50CisgICAgICogdHlwZXMgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBzbGlnaHQgbWlzLW1hdGNoZXMgYmV0d2VlbiBzdXBwbGllZCB2YWx1ZXMgYW5kIGFjdHVhbAorICAgICAqIHZhbHVlIHR5cGVzIHVzZWQgb24gdGhlIHNldHRlci4KKyAgICAgKiBAcmV0dXJuIE1ldGhvZCB0aGUgbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCBtUHJvcGVydHlOYW1lLgorICAgICAqLworICAgIHByaXZhdGUgTWV0aG9kIGdldFByb3BlcnR5RnVuY3Rpb24oQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcmVmaXgsIENsYXNzIHZhbHVlVHlwZSkgeworICAgICAgICAvLyBUT0RPOiBmYXN0ZXIgaW1wbGVtZW50YXRpb24uLi4KKyAgICAgICAgTWV0aG9kIHJldHVyblZhbCA9IG51bGw7CisgICAgICAgIFN0cmluZyBmaXJzdExldHRlciA9IG1Qcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsIDEpOworICAgICAgICBTdHJpbmcgdGhlUmVzdCA9IG1Qcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpOworICAgICAgICBmaXJzdExldHRlciA9IGZpcnN0TGV0dGVyLnRvVXBwZXJDYXNlKCk7CisgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gcHJlZml4ICsgZmlyc3RMZXR0ZXIgKyB0aGVSZXN0OworICAgICAgICBDbGFzcyBhcmdzW10gPSBudWxsOworICAgICAgICBpZiAodmFsdWVUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuVmFsID0gdGFyZ2V0Q2xhc3MuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIGFyZ3MpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZSgiUHJvcGVydHlWYWx1ZXNIb2xkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgbm8tYXJnIG1ldGhvZCBmb3IgcHJvcGVydHkgIiArIG1Qcm9wZXJ0eU5hbWUgKyAiOiAiICsgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhcmdzID0gbmV3IENsYXNzWzFdOworICAgICAgICAgICAgQ2xhc3MgdHlwZVZhcmlhbnRzW107CisgICAgICAgICAgICBpZiAobVZhbHVlVHlwZS5lcXVhbHMoRmxvYXQuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgdHlwZVZhcmlhbnRzID0gRkxPQVRfVkFSSUFOVFM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1WYWx1ZVR5cGUuZXF1YWxzKEludGVnZXIuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgdHlwZVZhcmlhbnRzID0gSU5URUdFUl9WQVJJQU5UUzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVZhbHVlVHlwZS5lcXVhbHMoRG91YmxlLmNsYXNzKSkgeworICAgICAgICAgICAgICAgIHR5cGVWYXJpYW50cyA9IERPVUJMRV9WQVJJQU5UUzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHlwZVZhcmlhbnRzID0gbmV3IENsYXNzWzFdOworICAgICAgICAgICAgICAgIHR5cGVWYXJpYW50c1swXSA9IG1WYWx1ZVR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKENsYXNzIHR5cGVWYXJpYW50IDogdHlwZVZhcmlhbnRzKSB7CisgICAgICAgICAgICAgICAgYXJnc1swXSA9IHR5cGVWYXJpYW50OworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbCA9IHRhcmdldENsYXNzLmdldE1ldGhvZChtZXRob2ROYW1lLCBhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB2YWx1ZSB0eXBlIHRvIHN1aXQKKyAgICAgICAgICAgICAgICAgICAgbVZhbHVlVHlwZSA9IHR5cGVWYXJpYW50OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFN3YWxsb3cgdGhlIGVycm9yIGFuZCBrZWVwIHRyeWluZyBvdGhlciB2YXJpYW50cworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIHdlIGdvdCBoZXJlLCB0aGVuIG5vIGFwcHJvcHJpYXRlIGZ1bmN0aW9uIHdhcyBmb3VuZAorICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5VmFsdWVzSG9sZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgc2V0dGVyL2dldHRlciBmb3IgcHJvcGVydHkgIiArIG1Qcm9wZXJ0eU5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIHZhbHVlIHR5cGUgIisgbVZhbHVlVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0dXJuVmFsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0dGVyIG9yIGdldHRlciByZXF1ZXN0ZWQuIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB0aGUKKyAgICAgKiByZXF1ZXN0ZWQgbWV0aG9kIGV4aXN0cyBpbiB0aGUgcHJvcGVydHlNYXBNYXAgY2FjaGUuIElmIG5vdCwgaXQgY2FsbHMgYW5vdGhlcgorICAgICAqIHV0aWxpdHkgZnVuY3Rpb24gdG8gcmVxdWVzdCB0aGUgTWV0aG9kIGZyb20gdGhlIHRhcmdldENsYXNzIGRpcmVjdGx5LgorICAgICAqIEBwYXJhbSB0YXJnZXRDbGFzcyBUaGUgQ2xhc3Mgb24gd2hpY2ggdGhlIHJlcXVlc3RlZCBtZXRob2Qgc2hvdWxkIGV4aXN0LgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU1hcE1hcCBUaGUgY2FjaGUgb2Ygc2V0dGVycy9nZXR0ZXJzIGRlcml2ZWQgc28gZmFyLgorICAgICAqIEBwYXJhbSBwcmVmaXggInNldCIgb3IgImdldCIsIGZvciB0aGUgc2V0dGVyIG9yIGdldHRlci4KKyAgICAgKiBAcGFyYW0gdmFsdWVUeXBlIFRoZSB0eXBlIG9mIHBhcmFtZXRlciBwYXNzZWQgaW50byB0aGUgbWV0aG9kIChudWxsIGZvciBnZXR0ZXIpLgorICAgICAqIEByZXR1cm4gTWV0aG9kIHRoZSBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIG1Qcm9wZXJ0eU5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBNZXRob2Qgc2V0dXBTZXR0ZXJPckdldHRlcihDbGFzcyB0YXJnZXRDbGFzcywKKyAgICAgICAgICAgIEhhc2hNYXA8Q2xhc3MsIEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+PiBwcm9wZXJ0eU1hcE1hcCwKKyAgICAgICAgICAgIFN0cmluZyBwcmVmaXgsIENsYXNzIHZhbHVlVHlwZSkgeworICAgICAgICBNZXRob2Qgc2V0dGVyT3JHZXR0ZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSGF2ZSB0byBsb2NrIHByb3BlcnR5IG1hcCBwcmlvciB0byByZWFkaW5nIGl0LCB0byBndWFyZCBhZ2FpbnN0CisgICAgICAgICAgICAvLyBhbm90aGVyIHRocmVhZCBwdXR0aW5nIHNvbWV0aGluZyBpbiB0aGVyZSBhZnRlciB3ZSd2ZSBjaGVja2VkIGl0CisgICAgICAgICAgICAvLyBidXQgYmVmb3JlIHdlJ3ZlIGFkZGVkIGFuIGVudHJ5IHRvIGl0CisgICAgICAgICAgICAvLyBUT0RPOiBjYW4gd2Ugc3RvcmUgdGhlIHNldHRlci9nZXR0ZXIgcGVyIENsYXNzIGluc3RlYWQgb2YgcGVyIE9iamVjdD8KKyAgICAgICAgICAgIHByb3BlcnR5TWFwTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgTWV0aG9kPiBwcm9wZXJ0eU1hcCA9IHByb3BlcnR5TWFwTWFwLmdldCh0YXJnZXRDbGFzcyk7CisgICAgICAgICAgICBpZiAocHJvcGVydHlNYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldHRlck9yR2V0dGVyID0gcHJvcGVydHlNYXAuZ2V0KG1Qcm9wZXJ0eU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNldHRlck9yR2V0dGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXR0ZXJPckdldHRlciA9IGdldFByb3BlcnR5RnVuY3Rpb24odGFyZ2V0Q2xhc3MsIHByZWZpeCwgdmFsdWVUeXBlKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlNYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kPigpOworICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU1hcE1hcC5wdXQodGFyZ2V0Q2xhc3MsIHByb3BlcnR5TWFwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KG1Qcm9wZXJ0eU5hbWUsIHNldHRlck9yR2V0dGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHByb3BlcnR5TWFwTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2V0dGVyT3JHZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBmdW5jdGlvbiB0byBnZXQgdGhlIHNldHRlciBmcm9tIHRhcmdldENsYXNzCisgICAgICogQHBhcmFtIHRhcmdldENsYXNzIFRoZSBDbGFzcyBvbiB3aGljaCB0aGUgcmVxdWVzdGVkIG1ldGhvZCBzaG91bGQgZXhpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwU2V0dGVyKENsYXNzIHRhcmdldENsYXNzKSB7CisgICAgICAgIG1TZXR0ZXIgPSBzZXR1cFNldHRlck9yR2V0dGVyKHRhcmdldENsYXNzLCBzU2V0dGVyUHJvcGVydHlNYXAsICJzZXQiLCBtVmFsdWVUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGdldCB0aGUgZ2V0dGVyIGZyb20gdGFyZ2V0Q2xhc3MKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0dXBHZXR0ZXIoQ2xhc3MgdGFyZ2V0Q2xhc3MpIHsKKyAgICAgICAgbUdldHRlciA9IHNldHVwU2V0dGVyT3JHZXR0ZXIodGFyZ2V0Q2xhc3MsIHNHZXR0ZXJQcm9wZXJ0eU1hcCwgImdldCIsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIGZ1bmN0aW9uIChjYWxsZWQgZnJvbSBPYmplY3RBbmltYXRvcikgdG8gc2V0IHVwIHRoZSBzZXR0ZXIgYW5kIGdldHRlcgorICAgICAqIHByaW9yIHRvIHJ1bm5pbmcgdGhlIGFuaW1hdGlvbi4gSWYgdGhlIHNldHRlciBoYXMgbm90IGJlZW4gbWFudWFsbHkgc2V0IGZvciB0aGlzCisgICAgICogb2JqZWN0LCBpdCB3aWxsIGJlIGRlcml2ZWQgYXV0b21hdGljYWxseSBnaXZlbiB0aGUgcHJvcGVydHkgbmFtZSwgdGFyZ2V0IG9iamVjdCwgYW5kCisgICAgICogdHlwZXMgb2YgdmFsdWVzIHN1cHBsaWVkLiBJZiBubyBnZXR0ZXIgaGFzIGJlZW4gc2V0LCBpdCB3aWxsIGJlIHN1cHBsaWVkIGlmZiBhbnkgb2YgdGhlCisgICAgICogc3VwcGxpZWQgdmFsdWVzIHdhcyBudWxsLiBJZiB0aGVyZSBpcyBhIG51bGwgdmFsdWUsIHRoZW4gdGhlIGdldHRlciAoc3VwcGxpZWQgb3IgZGVyaXZlZCkKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCB0byBzZXQgdGhvc2UgbnVsbCB2YWx1ZXMgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5CisgICAgICogb24gdGhlIHRhcmdldCBvYmplY3QuCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBzZXR0ZXIgKGFuZCBwb3NzaWJseSBnZXR0ZXIpIGV4aXN0LgorICAgICAqLworICAgIHZvaWQgc2V0dXBTZXR0ZXJBbmRHZXR0ZXIoT2JqZWN0IHRhcmdldCkgeworICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IHRhcmdldC5nZXRDbGFzcygpOworICAgICAgICBpZiAobVNldHRlciA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXR1cFNldHRlcih0YXJnZXRDbGFzcyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChLZXlmcmFtZSBrZiA6IG1LZXlmcmFtZVNldC5tS2V5ZnJhbWVzKSB7CisgICAgICAgICAgICBpZiAoa2YuZ2V0VmFsdWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG1HZXR0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzZXR1cEdldHRlcih0YXJnZXRDbGFzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGtmLnNldFZhbHVlKChUKSBtR2V0dGVyLmludm9rZSh0YXJnZXQpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5VmFsdWVzSG9sZGVyIiwgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5VmFsdWVzSG9sZGVyIiwgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIHNldCB0aGUgdmFsdWUgc3RvcmVkIGluIGEgcGFydGljdWxhciBLZXlmcmFtZS4gVGhlIHZhbHVlIHVzZWQgaXMKKyAgICAgKiB3aGF0ZXZlciB0aGUgdmFsdWUgaXMgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lIHNwZWNpZmllZCBpbiB0aGUga2V5ZnJhbWUgb24gdGhlIHRhcmdldCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGN1cnJlbnQgdmFsdWUgc2hvdWxkIGJlIGV4dHJhY3RlZC4KKyAgICAgKiBAcGFyYW0ga2YgVGhlIGtleWZyYW1lIHdoaWNoIGhvbGRzIHRoZSBwcm9wZXJ0eSBuYW1lIGFuZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0dXBWYWx1ZShPYmplY3QgdGFyZ2V0LCBLZXlmcmFtZSBrZikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG1HZXR0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gdGFyZ2V0LmdldENsYXNzKCk7CisgICAgICAgICAgICAgICAgc2V0dXBHZXR0ZXIodGFyZ2V0Q2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAga2Yuc2V0VmFsdWUoKFQpIG1HZXR0ZXIuaW52b2tlKHRhcmdldCkpOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKCJQcm9wZXJ0eVZhbHVlc0hvbGRlciIsIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5VmFsdWVzSG9sZGVyIiwgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IE9iamVjdEFuaW1hdG9yIHdoZW4gc2V0dGluZyB0aGUgc3RhcnQgdmFsdWVzIGZvciBhbiBhbmltYXRpb24uCisgICAgICogVGhlIHN0YXJ0IHZhbHVlcyBhcmUgc2V0IGFjY29yZGluZyB0byB0aGUgY3VycmVudCB2YWx1ZXMgaW4gdGhlIHRhcmdldCBvYmplY3QuIFRoZQorICAgICAqIHByb3BlcnR5IHdob3NlIHZhbHVlIGlzIGV4dHJhY3RlZCBpcyB3aGF0ZXZlciBpcyBzcGVjaWZpZWQgYnkgdGhlIHByb3BlcnR5TmFtZSBvZiB0aGlzCisgICAgICogUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IHdoaWNoIGhvbGRzIHRoZSBzdGFydCB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgc2V0LgorICAgICAqLworICAgIHZvaWQgc2V0dXBTdGFydFZhbHVlKE9iamVjdCB0YXJnZXQpIHsKKyAgICAgICAgc2V0dXBWYWx1ZSh0YXJnZXQsIG1LZXlmcmFtZVNldC5tS2V5ZnJhbWVzLmdldCgwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgT2JqZWN0QW5pbWF0b3Igd2hlbiBzZXR0aW5nIHRoZSBlbmQgdmFsdWVzIGZvciBhbiBhbmltYXRpb24uCisgICAgICogVGhlIGVuZCB2YWx1ZXMgYXJlIHNldCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgdmFsdWVzIGluIHRoZSB0YXJnZXQgb2JqZWN0LiBUaGUKKyAgICAgKiBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyBleHRyYWN0ZWQgaXMgd2hhdGV2ZXIgaXMgc3BlY2lmaWVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUgb2YgdGhpcworICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB3aGljaCBob2xkcyB0aGUgc3RhcnQgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIHNldC4KKyAgICAgKi8KKyAgICB2b2lkIHNldHVwRW5kVmFsdWUoT2JqZWN0IHRhcmdldCkgeworICAgICAgICBzZXR1cFZhbHVlKHRhcmdldCwgbUtleWZyYW1lU2V0Lm1LZXlmcmFtZXMuZ2V0KG1LZXlmcmFtZVNldC5tS2V5ZnJhbWVzLnNpemUoKSAtIDEpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUHJvcGVydHlWYWx1ZXNIb2xkZXIgY2xvbmUoKSB7CisgICAgICAgIEFycmF5TGlzdDxLZXlmcmFtZT4ga2V5ZnJhbWVzID0gbUtleWZyYW1lU2V0Lm1LZXlmcmFtZXM7CisgICAgICAgIGludCBudW1LZXlmcmFtZXMgPSBtS2V5ZnJhbWVTZXQubUtleWZyYW1lcy5zaXplKCk7CisgICAgICAgIEtleWZyYW1lW10gbmV3S2V5ZnJhbWVzID0gbmV3IEtleWZyYW1lW251bUtleWZyYW1lc107CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtS2V5ZnJhbWVzOyArK2kpIHsKKyAgICAgICAgICAgIG5ld0tleWZyYW1lc1tpXSA9IGtleWZyYW1lcy5nZXQoaSkuY2xvbmUoKTsKKyAgICAgICAgfQorICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmhDbG9uZSA9IG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcihtUHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgIChPYmplY3RbXSkgbmV3S2V5ZnJhbWVzKTsKKyAgICAgICAgcmV0dXJuIHB2aENsb25lOworICAgIH0KKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBzZXQgdGhlIHZhbHVlIG9uIHRoZSB0YXJnZXQgb2JqZWN0LCB1c2luZyB0aGUgc2V0dGVyIHNldCB1cAorICAgICAqIGVhcmxpZXIgb24gdGhpcyBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3QuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IE9iamVjdEFuaW1hdG9yCisgICAgICogdG8gaGFuZGxlIHR1cm5pbmcgdGhlIHZhbHVlIGNhbGN1bGF0ZWQgYnkgVmFsdWVBbmltYXRvciBpbnRvIGEgdmFsdWUgc2V0IG9uIHRoZSBvYmplY3QKKyAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIHZhbHVlIGlzIHNldAorICAgICAqLworICAgIHZvaWQgc2V0QW5pbWF0ZWRWYWx1ZShPYmplY3QgdGFyZ2V0KSB7CisgICAgICAgIGlmIChtU2V0dGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVRtcFZhbHVlQXJyYXlbMF0gPSBtQW5pbWF0ZWRWYWx1ZTsKKyAgICAgICAgICAgICAgICBtU2V0dGVyLmludm9rZSh0YXJnZXQsIG1UbXBWYWx1ZUFycmF5KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKCJQcm9wZXJ0eVZhbHVlc0hvbGRlciIsIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZSgiUHJvcGVydHlWYWx1ZXNIb2xkZXIiLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgZnVuY3Rpb24sIGNhbGxlZCBieSBWYWx1ZUFuaW1hdG9yLCB0byBzZXQgdXAgdGhlIFR5cGVFdmFsdWF0b3IgdGhhdCB3aWxsIGJlIHVzZWQKKyAgICAgKiB0byBjYWxjdWxhdGUgYW5pbWF0ZWQgdmFsdWVzLgorICAgICAqLworICAgIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgaWYgKG1FdmFsdWF0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgbUV2YWx1YXRvciA9IChtVmFsdWVUeXBlID09IGludC5jbGFzcyB8fCBtVmFsdWVUeXBlID09IEludGVnZXIuY2xhc3MpID8gc0ludEV2YWx1YXRvciA6CisgICAgICAgICAgICAgICAgKG1WYWx1ZVR5cGUgPT0gZG91YmxlLmNsYXNzIHx8IG1WYWx1ZVR5cGUgPT0gRG91YmxlLmNsYXNzKSA/IHNEb3VibGVFdmFsdWF0b3IgOgorICAgICAgICAgICAgICAgICAgICAgICAgc0Zsb2F0RXZhbHVhdG9yOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIFR5cGVFdmFsdWF0b3Igd2lsbCB0aGUgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHZhbHVlcworICAgICAqIHN1cHBsaWVkIHRvIFByb3BlcnR5VmFsdWVzSG9sZGVyLiBUaGUgZXZhbHVhdG9yIGNhbiBiZSBtYW51YWxseSBzZXQsIGhvd2V2ZXIsIGlmIHNvCisgICAgICogZGVzaXJlZC4gVGhpcyBtYXkgYmUgaW1wb3J0YW50IGluIGNhc2VzIHdoZXJlIGVpdGhlciB0aGUgdHlwZSBvZiB0aGUgdmFsdWVzIHN1cHBsaWVkCisgICAgICogZG8gbm90IG1hdGNoIHRoZSB3YXkgdGhhdCB0aGV5IHNob3VsZCBiZSBpbnRlcnBvbGF0ZWQgYmV0d2Vlbiwgb3IgaWYgdGhlIHZhbHVlcworICAgICAqIGFyZSBvZiBhIGN1c3RvbSB0eXBlIG9yIG9uZSBub3QgY3VycmVudGx5IHVuZGVyc3Rvb2QgYnkgdGhlIGFuaW1hdGlvbiBzeXN0ZW0uIEN1cnJlbnRseSwKKyAgICAgKiBvbmx5IHZhbHVlcyBvZiB0eXBlIGZsb2F0LCBkb3VibGUsIGFuZCBpbnQgKGFuZCB0aGVpciBPYmplY3QgZXF1aXZhbGVudHMsIEZsb2F0LCBEb3VibGUsCisgICAgICogYW5kIEludGVnZXIpIGFyZSAgY29ycmVjdGx5IGludGVycG9sYXRlZDsgYWxsIG90aGVyIHR5cGVzIHJlcXVpcmUgc2V0dGluZyBhIFR5cGVFdmFsdWF0b3IuCisgICAgICogQHBhcmFtIGV2YWx1YXRvcgorICAgICAqLworCXB1YmxpYyB2b2lkIHNldEV2YWx1YXRvcihUeXBlRXZhbHVhdG9yIGV2YWx1YXRvcikgeworICAgICAgICBtRXZhbHVhdG9yID0gZXZhbHVhdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bmN0aW9uIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGV2YWx1YXRvciBzZXQgdXAgZm9yCisgICAgICogdGhpcyBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3QuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IFZhbHVlQW5pbWF0b3IuYW5pbWF0ZVZhbHVlKCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIGVsYXBzZWQsIGludGVycG9sYXRlZCBmcmFjdGlvbiBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqIEByZXR1cm4gVGhlIGNhbGN1bGF0ZWQgdmFsdWUgYXQgdGhpcyBwb2ludCBpbiB0aGUgYW5pbWF0aW9uLgorICAgICAqLworICAgIE9iamVjdCBjYWxjdWxhdGVWYWx1ZShmbG9hdCBmcmFjdGlvbikgeworICAgICAgICBtQW5pbWF0ZWRWYWx1ZSA9IG1LZXlmcmFtZVNldC5nZXRWYWx1ZShmcmFjdGlvbiwgbUV2YWx1YXRvcik7CisgICAgICAgIHJldHVybiBtQW5pbWF0ZWRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSA8Y29kZT5NZXRob2Q8L2NvZGU+IHRoYXQgaXMgY2FsbGVkIHdpdGggdGhlIGFuaW1hdGVkIHZhbHVlcyBjYWxjdWxhdGVkCisgICAgICogZHVyaW5nIHRoZSBhbmltYXRpb24uIFNldHRpbmcgdGhlIHNldHRlciBtZXRob2QgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gc3VwcGx5aW5nIGEKKyAgICAgKiB7QGxpbmsgI3NldFByb3BlcnR5TmFtZShTdHJpbmcpIHByb3BlcnR5TmFtZX0gZnJvbSB3aGljaCB0aGUgbWV0aG9kIGlzIGRlcml2ZWQuIFRoaXMKKyAgICAgKiBhcHByb2FjaCBpcyBtb3JlIGRpcmVjdCwgYW5kIGlzIGVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gYSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB0aGF0IGRvZXMKKyAgICAgKiBub3QgY29ycmVzcG9uZCB0byB0aGUgY29udmVudGlvbiBvZiA8Y29kZT5zZXROYW1lKCk8L2NvZGU+LiBGb3IgZXhhbXBsZSwgaWYgYSBmdW5jdGlvbgorICAgICAqIGNhbGxlZCA8Y29kZT5vZmZzZXQoKTwvY29kZT4gaXMgdG8gYmUgY2FsbGVkIHdpdGggdGhlIGFuaW1hdGVkIHZhbHVlcywgdGhlcmUgaXMgbm8gd2F5CisgICAgICogdG8gdGVsbCA8Y29kZT5PYmplY3RBbmltYXRvcjwvY29kZT4gaG93IHRvIGNhbGwgdGhhdCBmdW5jdGlvbiBzaW1wbHkgdGhyb3VnaCBhIHByb3BlcnR5CisgICAgICogbmFtZSwgc28gYSBzZXR0ZXIgbWV0aG9kIHNob3VsZCBiZSBzdXBwbGllZCBpbnN0ZWFkLgorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IHRoZSBzZXR0ZXIgZnVuY3Rpb24gbXVzdCB0YWtlIHRoZSBzYW1lIHBhcmFtZXRlciB0eXBlIGFzIHRoZQorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gYW5kIDxjb2RlPnZhbHVlVG88L2NvZGU+IHByb3BlcnRpZXMsIG90aGVyd2lzZSB0aGUgY2FsbCB0bworICAgICAqIHRoZSBzZXR0ZXIgZnVuY3Rpb24gd2lsbCBmYWlsLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXR0ZXIgVGhlIHNldHRlciBtZXRob2QgdGhhdCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGFuaW1hdGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXR0ZXIoTWV0aG9kIHNldHRlcikgeworICAgICAgICBtU2V0dGVyID0gc2V0dGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIDxjb2RlPk1ldGhvZDwvY29kZT4gdGhhdCBpcyBjYWxsZWQgd2l0aCB0aGUgYW5pbWF0ZWQgdmFsdWVzIGNhbGN1bGF0ZWQKKyAgICAgKiBkdXJpbmcgdGhlIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kIGdldFNldHRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1TZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgPGNvZGU+TWV0aG9kPC9jb2RlPiB0aGF0IGlzIGNhbGxlZCB0byBnZXQgdW5zdXBwbGllZCA8Y29kZT52YWx1ZUZyb208L2NvZGU+IG9yCisgICAgICogPGNvZGU+dmFsdWVUbzwvY29kZT4gcHJvcGVydGllcy4gU2V0dGluZyB0aGUgZ2V0dGVyIG1ldGhvZCBpcyBhbiBhbHRlcm5hdGl2ZSB0byBzdXBwbHlpbmcgYQorICAgICAqIHtAbGluayAjc2V0UHJvcGVydHlOYW1lKFN0cmluZykgcHJvcGVydHlOYW1lfSBmcm9tIHdoaWNoIHRoZSBtZXRob2QgaXMgZGVyaXZlZC4gVGhpcworICAgICAqIGFwcHJvYWNoIGlzIG1vcmUgZGlyZWN0LCBhbmQgaXMgZXNwZWNpYWxseSB1c2VmdWwgd2hlbiBhIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHRoYXQgZG9lcworICAgICAqIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBjb252ZW50aW9uIG9mIDxjb2RlPnNldE5hbWUoKTwvY29kZT4uIEZvciBleGFtcGxlLCBpZiBhIGZ1bmN0aW9uCisgICAgICogY2FsbGVkIDxjb2RlPm9mZnNldCgpPC9jb2RlPiBpcyB0byBiZSBjYWxsZWQgdG8gZ2V0IGFuIGluaXRpYWwgdmFsdWUsIHRoZXJlIGlzIG5vIHdheQorICAgICAqIHRvIHRlbGwgPGNvZGU+T2JqZWN0QW5pbWF0b3I8L2NvZGU+IGhvdyB0byBjYWxsIHRoYXQgZnVuY3Rpb24gc2ltcGx5IHRocm91Z2ggYSBwcm9wZXJ0eQorICAgICAqIG5hbWUsIHNvIGEgZ2V0dGVyIG1ldGhvZCBzaG91bGQgYmUgc3VwcGxpZWQgaW5zdGVhZC4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCB0aGUgZ2V0dGVyIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCB3aGV0aGVyIHN1cHBsaWVkIGhlcmUgb3IgZGVyaXZlZAorICAgICAqIGZyb20gdGhlIHByb3BlcnR5IG5hbWUsIGlmIG9uZSBvZiA8Y29kZT52YWx1ZUZyb208L2NvZGU+IG9yIDxjb2RlPnZhbHVlVG88L2NvZGU+IGFyZQorICAgICAqIG51bGwuIElmIGJvdGggb2YgdGhvc2UgdmFsdWVzIGFyZSBub24tbnVsbCwgdGhlbiB0aGVyZSBpcyBubyBuZWVkIHRvIGdldCBvbmUgb2YgdGhlCisgICAgICogdmFsdWVzIGFuZCB0aGUgZ2V0dGVyIGlzIG5vdCBjYWxsZWQuCisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIGdldHRlciBmdW5jdGlvbiBtdXN0IHJldHVybiB0aGUgc2FtZSBwYXJhbWV0ZXIgdHlwZSBhcyB0aGUKKyAgICAgKiA8Y29kZT52YWx1ZUZyb208L2NvZGU+IGFuZCA8Y29kZT52YWx1ZVRvPC9jb2RlPiBwcm9wZXJ0aWVzICh3aGljaGV2ZXIgb2YgdGhlbSBhcmUKKyAgICAgKiBub24tbnVsbCksIG90aGVyd2lzZSB0aGUgY2FsbCB0byB0aGUgZ2V0dGVyIGZ1bmN0aW9uIHdpbGwgZmFpbC48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZ2V0dGVyIFRoZSBnZXR0ZXIgbWV0aG9kIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB0byBnZXQgaW5pdGlhbCBhbmltYXRpb24gdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEdldHRlcihNZXRob2QgZ2V0dGVyKSB7CisgICAgICAgIG1HZXR0ZXIgPSBnZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgPGNvZGU+TWV0aG9kPC9jb2RlPiB0aGF0IGlzIGNhbGxlZCB0byBnZXQgdW5zdXBwbGllZCA8Y29kZT52YWx1ZUZyb208L2NvZGU+IG9yCisgICAgICogPGNvZGU+dmFsdWVUbzwvY29kZT4gcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kIGdldEdldHRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1HZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBUaGlzIG5hbWUgaXMgdXNlZCB0byBkZXJpdmUKKyAgICAgKiBhIHNldHRlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHRvIHNldCBhbmltYXRlZCB2YWx1ZXMuCisgICAgICogRm9yIGV4YW1wbGUsIGEgcHJvcGVydHkgbmFtZSBvZiA8Y29kZT5mb288L2NvZGU+IHdpbGwgcmVzdWx0CisgICAgICogaW4gYSBjYWxsIHRvIHRoZSBmdW5jdGlvbiA8Y29kZT5zZXRGb28oKTwvY29kZT4gb24gdGhlIHRhcmdldCBvYmplY3QuIElmIGVpdGhlcgorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gb3IgPGNvZGU+dmFsdWVUbzwvY29kZT4gaXMgbnVsbCwgdGhlbiBhIGdldHRlciBmdW5jdGlvbiB3aWxsCisgICAgICogYWxzbyBiZSBkZXJpdmVkIGFuZCBjYWxsZWQuCisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIHNldHRlciBmdW5jdGlvbiBkZXJpdmVkIGZyb20gdGhpcyBwcm9wZXJ0eSBuYW1lCisgICAgICogbXVzdCB0YWtlIHRoZSBzYW1lIHBhcmFtZXRlciB0eXBlIGFzIHRoZQorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gYW5kIDxjb2RlPnZhbHVlVG88L2NvZGU+IHByb3BlcnRpZXMsIG90aGVyd2lzZSB0aGUgY2FsbCB0bworICAgICAqIHRoZSBzZXR0ZXIgZnVuY3Rpb24gd2lsbCBmYWlsLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisgICAgICAgIG1Qcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBUaGlzIG5hbWUgd2lsbCBiZSB1c2VkIHRvIGRlcml2ZQorICAgICAqIGEgc2V0dGVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgdG8gc2V0IGFuaW1hdGVkIHZhbHVlcy4KKyAgICAgKiBGb3IgZXhhbXBsZSwgYSBwcm9wZXJ0eSBuYW1lIG9mIDxjb2RlPmZvbzwvY29kZT4gd2lsbCByZXN1bHQKKyAgICAgKiBpbiBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIDxjb2RlPnNldEZvbygpPC9jb2RlPiBvbiB0aGUgdGFyZ2V0IG9iamVjdC4gSWYgZWl0aGVyCisgICAgICogPGNvZGU+dmFsdWVGcm9tPC9jb2RlPiBvciA8Y29kZT52YWx1ZVRvPC9jb2RlPiBpcyBudWxsLCB0aGVuIGEgZ2V0dGVyIGZ1bmN0aW9uIHdpbGwKKyAgICAgKiBhbHNvIGJlIGRlcml2ZWQgYW5kIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9wZXJ0eU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgZnVuY3Rpb24sIGNhbGxlZCBieSBWYWx1ZUFuaW1hdG9yIGFuZCBPYmplY3RBbmltYXRvciwgdG8gcmV0cmlldmUgdGhlIHZhbHVlCisgICAgICogbW9zdCByZWNlbnRseSBjYWxjdWxhdGVkIGluIGNhbGN1bGF0ZVZhbHVlKCkuCisgICAgICogQHJldHVybgorICAgICAqLworICAgIE9iamVjdCBnZXRBbmltYXRlZFZhbHVlKCkgeworICAgICAgICByZXR1cm4gbUFuaW1hdGVkVmFsdWU7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9SR0JFdmFsdWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9SR0JFdmFsdWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWUwYWYwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1JHQkV2YWx1YXRvci5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCisvKioKKyAqIFRoaXMgZXZhbHVhdG9yIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gdHlwZSBpbnRlcnBvbGF0aW9uIGJldHdlZW4gaW50ZWdlcgorICogdmFsdWVzIHRoYXQgcmVwcmVzZW50IEFSR0IgY29sb3JzLgorICovCitwdWJsaWMgY2xhc3MgUkdCRXZhbHVhdG9yIGltcGxlbWVudHMgVHlwZUV2YWx1YXRvciB7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNhbGN1bGF0ZWQgaW4tYmV0d2VlbiB2YWx1ZSBmb3IgYSBjb2xvcgorICAgICAqIGdpdmVuIGludGVnZXJzIHRoYXQgcmVwcmVzZW50IHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcyBpbiB0aGUgZm91cgorICAgICAqIGJ5dGVzIG9mIHRoZSAzMi1iaXQgaW50LiBFYWNoIGNoYW5uZWwgaXMgc2VwYXJhdGVseSBsaW5lYXJseSBpbnRlcnBvbGF0ZWQKKyAgICAgKiBhbmQgdGhlIHJlc3VsdGluZyBjYWxjdWxhdGVkIHZhbHVlcyBhcmUgcmVjb21iaW5lZCBpbnRvIHRoZSByZXR1cm4gdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIGZyYWN0aW9uIGZyb20gdGhlIHN0YXJ0aW5nIHRvIHRoZSBlbmRpbmcgdmFsdWVzCisgICAgICogQHBhcmFtIHN0YXJ0VmFsdWUgQSAzMi1iaXQgaW50IHZhbHVlIHJlcHJlc2VudGluZyBjb2xvcnMgaW4gdGhlCisgICAgICogc2VwYXJhdGUgYnl0ZXMgb2YgdGhlIHBhcmFtZXRlcgorICAgICAqIEBwYXJhbSBlbmRWYWx1ZSBBIDMyLWJpdCBpbnQgdmFsdWUgcmVwcmVzZW50aW5nIGNvbG9ycyBpbiB0aGUKKyAgICAgKiBzZXBhcmF0ZSBieXRlcyBvZiB0aGUgcGFyYW1ldGVyCisgICAgICogQHJldHVybiBBIHZhbHVlIHRoYXQgaXMgY2FsY3VsYXRlZCB0byBiZSB0aGUgbGluZWFybHkgaW50ZXJwb2xhdGVkCisgICAgICogcmVzdWx0LCBkZXJpdmVkIGJ5IHNlcGFyYXRpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzIGludG8gc2VwYXJhdGUKKyAgICAgKiBjb2xvciBjaGFubmVscyBhbmQgaW50ZXJwb2xhdGluZyBlYWNoIG9uZSBzZXBhcmF0ZWx5LCByZWNvbWJpbmluZyB0aGUKKyAgICAgKiByZXN1bHRpbmcgdmFsdWVzIGluIHRoZSBzYW1lIHdheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKGZsb2F0IGZyYWN0aW9uLCBPYmplY3Qgc3RhcnRWYWx1ZSwgT2JqZWN0IGVuZFZhbHVlKSB7CisgICAgICAgIGludCBzdGFydEludCA9IChJbnRlZ2VyKSBzdGFydFZhbHVlOworICAgICAgICBpbnQgc3RhcnRBID0gKHN0YXJ0SW50ID4+IDI0KTsKKyAgICAgICAgaW50IHN0YXJ0UiA9IChzdGFydEludCA+PiAxNikgJiAweGZmOworICAgICAgICBpbnQgc3RhcnRHID0gKHN0YXJ0SW50ID4+IDgpICYgMHhmZjsKKyAgICAgICAgaW50IHN0YXJ0QiA9IHN0YXJ0SW50ICYgMHhmZjsKKworICAgICAgICBpbnQgZW5kSW50ID0gKEludGVnZXIpIGVuZFZhbHVlOworICAgICAgICBpbnQgZW5kQSA9IChlbmRJbnQgPj4gMjQpOworICAgICAgICBpbnQgZW5kUiA9IChlbmRJbnQgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgaW50IGVuZEcgPSAoZW5kSW50ID4+IDgpICYgMHhmZjsKKyAgICAgICAgaW50IGVuZEIgPSBlbmRJbnQgJiAweGZmOworCisgICAgICAgIHJldHVybiAoaW50KSgoc3RhcnRBICsgKGludCkoZnJhY3Rpb24gKiAoZW5kQSAtIHN0YXJ0QSkpKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgIChpbnQpKChzdGFydFIgKyAoaW50KShmcmFjdGlvbiAqIChlbmRSIC0gc3RhcnRSKSkpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgKGludCkoKHN0YXJ0RyArIChpbnQpKGZyYWN0aW9uICogKGVuZEcgLSBzdGFydEcpKSkgPDwgOCkgfAorICAgICAgICAgICAgICAgIChpbnQpKChzdGFydEIgKyAoaW50KShmcmFjdGlvbiAqIChlbmRCIC0gc3RhcnRCKSkpKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1R5cGVFdmFsdWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9UeXBlRXZhbHVhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0OTE3NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9UeXBlRXZhbHVhdG9yLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKKy8qKgorICogSW50ZXJmYWNlIGZvciB1c2Ugd2l0aCB0aGUge0BsaW5rIFZhbHVlQW5pbWF0b3Ijc2V0RXZhbHVhdG9yKFR5cGVFdmFsdWF0b3IpfSBmdW5jdGlvbi4gRXZhbHVhdG9ycworICogYWxsb3cgZGV2ZWxvcGVycyB0byBjcmVhdGUgYW5pbWF0aW9ucyBvbiBhcmJpdHJhcnkgcHJvcGVydHkgdHlwZXMsIGJ5IGFsbG93aW5nIHRoZW0gdG8gc3VwcGx5CisgKiBjdXN0b20gZXZhdWxhdG9ycyBmb3IgdHlwZXMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgdW5kZXJzdG9vZCBhbmQgdXNlZCBieSB0aGUgYW5pbWF0aW9uCisgKiBzeXN0ZW0uCisgKgorICogQHNlZSBWYWx1ZUFuaW1hdG9yI3NldEV2YWx1YXRvcihUeXBlRXZhbHVhdG9yKQorICovCitwdWJsaWMgaW50ZXJmYWNlIFR5cGVFdmFsdWF0b3IgeworCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXN1bHQgb2YgbGluZWFybHkgaW50ZXJwb2xhdGluZyB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMsIHdpdGgKKyAgICAgKiA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBwcm9wb3J0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiBUaGUKKyAgICAgKiBjYWxjdWxhdGlvbiBpcyBhIHNpbXBsZSBwYXJhbWV0cmljIGNhbGN1bGF0aW9uOiA8Y29kZT5yZXN1bHQgPSB4MCArIHQgKiAodjEgLSB2MCk8L2NvZGU+LAorICAgICAqIHdoZXJlIDxjb2RlPngwPC9jb2RlPiBpcyA8Y29kZT5zdGFydFZhbHVlPC9jb2RlPiwgPGNvZGU+eDE8L2NvZGU+IGlzIDxjb2RlPmVuZFZhbHVlPC9jb2RlPiwKKyAgICAgKiBhbmQgPGNvZGU+dDwvY29kZT4gaXMgPGNvZGU+ZnJhY3Rpb248L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uICAgVGhlIGZyYWN0aW9uIGZyb20gdGhlIHN0YXJ0aW5nIHRvIHRoZSBlbmRpbmcgdmFsdWVzCisgICAgICogQHBhcmFtIHN0YXJ0VmFsdWUgVGhlIHN0YXJ0IHZhbHVlLgorICAgICAqIEBwYXJhbSBlbmRWYWx1ZSAgIFRoZSBlbmQgdmFsdWUuCisgICAgICogQHJldHVybiBBIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLCBnaXZlbiB0aGUKKyAgICAgKiAgICAgICAgIDxjb2RlPmZyYWN0aW9uPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShmbG9hdCBmcmFjdGlvbiwgT2JqZWN0IHN0YXJ0VmFsdWUsIE9iamVjdCBlbmRWYWx1ZSk7CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vVmFsdWVBbmltYXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1ZhbHVlQW5pbWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mODFiMWVhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1ZhbHVlQW5pbWF0b3IuamF2YQpAQCAtMCwwICsxLDEwMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBzaW1wbGUgdGltaW5nIGVuZ2luZSBmb3IgcnVubmluZyBhbmltYXRpb25zCisgKiB3aGljaCBjYWxjdWxhdGUgYW5pbWF0ZWQgdmFsdWVzIGFuZCBzZXQgdGhlbSBvbiB0YXJnZXQgb2JqZWN0cy4KKyAqCisgKiA8cD5UaGVyZSBpcyBhIHNpbmdsZSB0aW1pbmcgcHVsc2UgdGhhdCBhbGwgYW5pbWF0aW9ucyB1c2UuIEl0IHJ1bnMgaW4gYQorICogY3VzdG9tIGhhbmRsZXIgdG8gZW5zdXJlIHRoYXQgcHJvcGVydHkgY2hhbmdlcyBoYXBwZW4gb24gdGhlIFVJIHRocmVhZC48L3A+CisgKgorICogPHA+QnkgZGVmYXVsdCwgVmFsdWVBbmltYXRvciB1c2VzIG5vbi1saW5lYXIgdGltZSBpbnRlcnBvbGF0aW9uLCB2aWEgdGhlCisgKiB7QGxpbmsgQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3J9IGNsYXNzLCB3aGljaCBhY2NlbGVyYXRlcyBpbnRvIGFuZCBkZWNlbGVyYXRlcworICogb3V0IG9mIGFuIGFuaW1hdGlvbi4gVGhpcyBiZWhhdmlvciBjYW4gYmUgY2hhbmdlZCBieSBjYWxsaW5nCisgKiB7QGxpbmsgVmFsdWVBbmltYXRvciNzZXRJbnRlcnBvbGF0b3IoSW50ZXJwb2xhdG9yKX0uPC9wPgorICovCitwdWJsaWMgY2xhc3MgVmFsdWVBbmltYXRvcjxUPiBleHRlbmRzIEFuaW1hdG9yIHsKKworICAgIC8qKgorICAgICAqIEludGVybmFsIGNvbnN0YW50cworICAgICAqLworCisgICAgLyoKKyAgICAgKiBUaGUgZGVmYXVsdCBhbW91bnQgb2YgdGltZSBpbiBtcyBiZXR3ZWVuIGFuaW1hdGlvbiBmcmFtZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfRlJBTUVfREVMQVkgPSAzMDsKKworICAgIC8qKgorICAgICAqIE1lc3NhZ2VzIHNlbnQgdG8gdGltaW5nIGhhbmRsZXI6IFNUQVJUIGlzIHNlbnQgd2hlbiBhbiBhbmltYXRpb24gZmlyc3QgYmVnaW5zLCBGUkFNRSBpcyBzZW50CisgICAgICogYnkgdGhlIGhhbmRsZXIgdG8gaXRzZWxmIHRvIHByb2Nlc3MgdGhlIG5leHQgYW5pbWF0aW9uIGZyYW1lCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFOSU1BVElPTl9TVEFSVCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFOSU1BVElPTl9GUkFNRSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZXMgdXNlZCB3aXRoIGludGVybmFsIHZhcmlhYmxlIG1QbGF5aW5nU3RhdGUgdG8gaW5kaWNhdGUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYW4KKyAgICAgKiBhbmltYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUT1BQRUQgICAgPSAwOyAvLyBOb3QgeWV0IHBsYXlpbmcKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOTklORyAgICA9IDE7IC8vIFBsYXlpbmcgbm9ybWFsbHkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FOQ0VMRUQgICA9IDI7IC8vIGNhbmNlbCgpIGNhbGxlZCAtIG5lZWQgdG8gZW5kIGl0CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOREVEICAgICAgPSAzOyAvLyBlbmQoKSBjYWxsZWQgLSBuZWVkIHRvIGVuZCBpdAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUVLRUQgICAgID0gNDsgLy8gU2Vla2VkIHRvIHNvbWUgdGltZSB2YWx1ZQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgdmFyaWFibGVzCisgICAgICogTk9URTogVGhpcyBvYmplY3QgaW1wbGVtZW50cyB0aGUgY2xvbmUoKSBtZXRob2QsIG1ha2luZyBhIGRlZXAgY29weSBvZiBhbnkgcmVmZXJlbmNlZAorICAgICAqIG9iamVjdHMuIEFzIG90aGVyIG5vbi10cml2aWFsIGZpZWxkcyBhcmUgYWRkZWQgdG8gdGhpcyBjbGFzcywgbWFrZSBzdXJlIHRvIGFkZCBsb2dpYworICAgICAqIHRvIGNsb25lKCkgdG8gbWFrZSBkZWVwIGNvcGllcyBvZiB0aGVtLgorICAgICAqLworCisgICAgLy8gVGhlIGZpcnN0IHRpbWUgdGhhdCB0aGUgYW5pbWF0aW9uJ3MgYW5pbWF0ZUZyYW1lKCkgbWV0aG9kIGlzIGNhbGxlZC4gVGhpcyB0aW1lIGlzIHVzZWQgdG8KKyAgICAvLyBkZXRlcm1pbmUgZWxhcHNlZCB0aW1lIChhbmQgdGhlcmVmb3JlIHRoZSBlbGFwc2VkIGZyYWN0aW9uKSBpbiBzdWJzZXF1ZW50IGNhbGxzCisgICAgLy8gdG8gYW5pbWF0ZUZyYW1lKCkKKyAgICBwcml2YXRlIGxvbmcgbVN0YXJ0VGltZTsKKworICAgIC8qKgorICAgICAqIFNldCB3aGVuIHNldEN1cnJlbnRQbGF5VGltZSgpIGlzIGNhbGxlZC4gSWYgbmVnYXRpdmUsIGFuaW1hdGlvbiBpcyBub3QgY3VycmVudGx5IHNlZWtlZAorICAgICAqIHRvIGEgdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIG1TZWVrVGltZSA9IC0xOworCisgICAgLy8gVGhlIHN0YXRpYyBzQW5pbWF0aW9uSGFuZGxlciBwcm9jZXNzZXMgdGhlIGludGVybmFsIHRpbWluZyBsb29wIG9uIHdoaWNoIGFsbCBhbmltYXRpb25zCisgICAgLy8gYXJlIGJhc2VkCisgICAgcHJpdmF0ZSBzdGF0aWMgQW5pbWF0aW9uSGFuZGxlciBzQW5pbWF0aW9uSGFuZGxlcjsKKworICAgIC8vIFRoZSBzdGF0aWMgbGlzdCBvZiBhbGwgYWN0aXZlIGFuaW1hdGlvbnMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8VmFsdWVBbmltYXRvcj4gc0FuaW1hdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFZhbHVlQW5pbWF0b3I+KCk7CisKKyAgICAvLyBUaGUgc2V0IG9mIGFuaW1hdGlvbnMgdG8gYmUgc3RhcnRlZCBvbiB0aGUgbmV4dCBhbmltYXRpb24gZnJhbWUKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8VmFsdWVBbmltYXRvcj4gc1BlbmRpbmdBbmltYXRpb25zID0gbmV3IEFycmF5TGlzdDxWYWx1ZUFuaW1hdG9yPigpOworCisgICAgLy8gVGhlIHRpbWUgaW50ZXJwb2xhdG9yIHRvIGJlIHVzZWQgaWYgbm9uZSBpcyBzZXQgb24gdGhlIGFuaW1hdGlvbgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEludGVycG9sYXRvciBzRGVmYXVsdEludGVycG9sYXRvciA9IG5ldyBBY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcigpOworCisgICAgLy8gdHlwZSBldmFsdWF0b3JzIGZvciB0aGUgdGhyZWUgcHJpbWl0aXZlIHR5cGVzIGhhbmRsZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVFdmFsdWF0b3Igc0ludEV2YWx1YXRvciA9IG5ldyBJbnRFdmFsdWF0b3IoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlRXZhbHVhdG9yIHNGbG9hdEV2YWx1YXRvciA9IG5ldyBGbG9hdEV2YWx1YXRvcigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVFdmFsdWF0b3Igc0RvdWJsZUV2YWx1YXRvciA9IG5ldyBEb3VibGVFdmFsdWF0b3IoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgYW5pbWF0aW9uIGlzIGN1cnJlbnRseSBwbGF5aW5nIGluIHJldmVyc2UuIFRoaXMgY2F1c2VzIHRoZQorICAgICAqIGVsYXBzZWQgZnJhY3Rpb24gdG8gYmUgaW52ZXJ0ZWQgdG8gY2FsY3VsYXRlIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1QbGF5aW5nQmFja3dhcmRzID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHZhcmlhYmxlIHRyYWNrcyB0aGUgY3VycmVudCBpdGVyYXRpb24gdGhhdCBpcyBwbGF5aW5nLiBXaGVuIG1DdXJyZW50SXRlcmF0aW9uIGV4Y2VlZHMgdGhlCisgICAgICogcmVwZWF0Q291bnQgKGlmIHJlcGVhdENvdW50IT1JTkZJTklURSksIHRoZSBhbmltYXRpb24gZW5kcworICAgICAqLworICAgIHByaXZhdGUgaW50IG1DdXJyZW50SXRlcmF0aW9uID0gMDsKKworICAgIC8qKgorICAgICAqIFRyYWNrcyB3aGV0aGVyIGEgc3RhcnREZWxheSdkIGFuaW1hdGlvbiBoYXMgYmVndW4gcGxheWluZyB0aHJvdWdoIHRoZSBzdGFydERlbGF5LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhcnRlZERlbGF5ID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUcmFja3MgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIGFuaW1hdGlvbiBiZWdhbiBwbGF5aW5nIHRocm91Z2ggaXRzIHN0YXJ0RGVsYXkuIFRoaXMgaXMKKyAgICAgKiBkaWZmZXJlbnQgZnJvbSB0aGUgbVN0YXJ0VGltZSB2YXJpYWJsZSwgd2hpY2ggaXMgdXNlZCB0byB0cmFjayB3aGVuIHRoZSBhbmltYXRpb24gYmVjYW1lCisgICAgICogYWN0aXZlICh3aGljaCBpcyB3aGVuIHRoZSBzdGFydERlbGF5IGV4cGlyZWQgYW5kIHRoZSBhbmltYXRpb24gd2FzIGFkZGVkIHRvIHRoZSBhY3RpdmUKKyAgICAgKiBhbmltYXRpb25zIGxpc3QpLgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBtRGVsYXlTdGFydFRpbWU7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYW5pbWF0aW9uLiBVc2VkIHRvIGZpZ3VyZSBvdXQgd2hlbiB0byBzdGFydAorICAgICAqIGFuIGFuaW1hdGlvbiAoaWYgc3RhdGUgPT0gU1RPUFBFRCkuIEFsc28gdXNlZCB0byBlbmQgYW4gYW5pbWF0aW9uIHRoYXQKKyAgICAgKiBoYXMgYmVlbiBjYW5jZWwoKSdkIG9yIGVuZCgpJ2Qgc2luY2UgdGhlIGxhc3QgYW5pbWF0aW9uIGZyYW1lLiBQb3NzaWJsZSB2YWx1ZXMgYXJlCisgICAgICogU1RPUFBFRCwgUlVOTklORywgRU5ERUQsIENBTkNFTEVELgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1QbGF5aW5nU3RhdGUgPSBTVE9QUEVEOworCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgY29sbGVjdGlvbnMgdXNlZCB0byBhdm9pZCBzZXQgY29sbGlzaW9ucyBhcyBhbmltYXRpb25zIHN0YXJ0IGFuZCBlbmQgd2hpbGUgYmVpbmcKKyAgICAgKiBwcm9jZXNzZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PFZhbHVlQW5pbWF0b3I+IHNFbmRpbmdBbmltcyA9IG5ldyBBcnJheUxpc3Q8VmFsdWVBbmltYXRvcj4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8VmFsdWVBbmltYXRvcj4gc0RlbGF5ZWRBbmltcyA9IG5ldyBBcnJheUxpc3Q8VmFsdWVBbmltYXRvcj4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8VmFsdWVBbmltYXRvcj4gc1JlYWR5QW5pbXMgPSBuZXcgQXJyYXlMaXN0PFZhbHVlQW5pbWF0b3I+KCk7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRoYXQgZGVub3RlcyB3aGV0aGVyIHRoZSBhbmltYXRpb24gaXMgc2V0IHVwIGFuZCByZWFkeSB0byBnby4gVXNlZCB0bworICAgICAqIHNldCB1cCBhbmltYXRpb24gdGhhdCBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQuCisgICAgICovCisgICAgYm9vbGVhbiBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgIC8vCisgICAgLy8gQmFja2luZyB2YXJpYWJsZXMKKyAgICAvLworCisgICAgLy8gSG93IGxvbmcgdGhlIGFuaW1hdGlvbiBzaG91bGQgbGFzdCBpbiBtcworICAgIHByaXZhdGUgbG9uZyBtRHVyYXRpb247CisKKyAgICAvLyBUaGUgYW1vdW50IG9mIHRpbWUgaW4gbXMgdG8gZGVsYXkgc3RhcnRpbmcgdGhlIGFuaW1hdGlvbiBhZnRlciBzdGFydCgpIGlzIGNhbGxlZAorICAgIHByaXZhdGUgbG9uZyBtU3RhcnREZWxheSA9IDA7CisKKyAgICAvLyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGFuaW1hdGlvbiBmcmFtZXMKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIHNGcmFtZURlbGF5ID0gREVGQVVMVF9GUkFNRV9ERUxBWTsKKworICAgIC8vIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFuaW1hdGlvbiB3aWxsIHJlcGVhdC4gVGhlIGRlZmF1bHQgaXMgMCwgd2hpY2ggbWVhbnMgdGhlIGFuaW1hdGlvbgorICAgIC8vIHdpbGwgcGxheSBvbmx5IG9uY2UKKyAgICBwcml2YXRlIGludCBtUmVwZWF0Q291bnQgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgcmVwZXRpdGlvbiB0aGF0IHdpbGwgb2NjdXIgd2hlbiByZXBlYXRNb2RlIGlzIG5vbnplcm8uIFJFU1RBUlQgbWVhbnMgdGhlCisgICAgICogYW5pbWF0aW9uIHdpbGwgc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIG9uIGV2ZXJ5IG5ldyBjeWNsZS4gUkVWRVJTRSBtZWFucyB0aGUgYW5pbWF0aW9uCisgICAgICogd2lsbCByZXZlcnNlIGRpcmVjdGlvbnMgb24gZWFjaCBpdGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbVJlcGVhdE1vZGUgPSBSRVNUQVJUOworCisgICAgLyoqCisgICAgICogVGhlIHRpbWUgaW50ZXJwb2xhdG9yIHRvIGJlIHVzZWQuIFRoZSBlbGFwc2VkIGZyYWN0aW9uIG9mIHRoZSBhbmltYXRpb24gd2lsbCBiZSBwYXNzZWQKKyAgICAgKiB0aHJvdWdoIHRoaXMgaW50ZXJwb2xhdG9yIHRvIGNhbGN1bGF0ZSB0aGUgaW50ZXJwb2xhdGVkIGZyYWN0aW9uLCB3aGljaCBpcyB0aGVuIHVzZWQgdG8KKyAgICAgKiBjYWxjdWxhdGUgdGhlIGFuaW1hdGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEludGVycG9sYXRvciBtSW50ZXJwb2xhdG9yID0gc0RlZmF1bHRJbnRlcnBvbGF0b3I7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIGxpc3RlbmVycyB0byBiZSBzZW50IGV2ZW50cyB0aHJvdWdoIHRoZSBsaWZlIG9mIGFuIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxBbmltYXRvclVwZGF0ZUxpc3RlbmVyPiBtVXBkYXRlTGlzdGVuZXJzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBwcm9wZXJ0eS92YWx1ZSBzZXRzIGJlaW5nIGFuaW1hdGVkLgorICAgICAqLworICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyW10gbVZhbHVlczsKKworICAgIC8qKgorICAgICAqIEEgaGFzaG1hcCBvZiB0aGUgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cy4gVGhpcyBtYXAgaXMgdXNlZCB0byBsb29rdXAgYW5pbWF0ZWQgdmFsdWVzCisgICAgICogYnkgcHJvcGVydHkgbmFtZSBkdXJpbmcgY2FsbHMgdG8gZ2V0QW5pbWF0ZWRWYWx1ZShTdHJpbmcpLgorICAgICAqLworICAgIEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eVZhbHVlc0hvbGRlcj4gbVZhbHVlc01hcDsKKworICAgIC8qKgorICAgICAqIFB1YmxpYyBjb25zdGFudHMKKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIFdoZW4gdGhlIGFuaW1hdGlvbiByZWFjaGVzIHRoZSBlbmQgYW5kIDxjb2RlPnJlcGVhdENvdW50PC9jb2RlPiBpcyBJTkZJTklURQorICAgICAqIG9yIGEgcG9zaXRpdmUgdmFsdWUsIHRoZSBhbmltYXRpb24gcmVzdGFydHMgZnJvbSB0aGUgYmVnaW5uaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1RBUlQgPSAxOworICAgIC8qKgorICAgICAqIFdoZW4gdGhlIGFuaW1hdGlvbiByZWFjaGVzIHRoZSBlbmQgYW5kIDxjb2RlPnJlcGVhdENvdW50PC9jb2RlPiBpcyBJTkZJTklURQorICAgICAqIG9yIGEgcG9zaXRpdmUgdmFsdWUsIHRoZSBhbmltYXRpb24gcmV2ZXJzZXMgZGlyZWN0aW9uIG9uIGV2ZXJ5IGl0ZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVZFUlNFID0gMjsKKyAgICAvKioKKyAgICAgKiBUaGlzIHZhbHVlIHVzZWQgdXNlZCB3aXRoIHRoZSB7QGxpbmsgI3NldFJlcGVhdENvdW50KGludCl9IHByb3BlcnR5IHRvIHJlcGVhdAorICAgICAqIHRoZSBhbmltYXRpb24gaW5kZWZpbml0ZWx5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORklOSVRFID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IFZhbHVlQW5pbWF0b3Igb2JqZWN0LiBUaGlzIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgcHJpbWFyaWx5IGZvcgorICAgICAqIHVzZSBpbnRlcm5hbGx5OyB0aGUgb3RoZXIgY29uc3RydWN0b3JzIHdoaWNoIHRha2UgcGFyYW1ldGVycyBhcmUgbW9yZSBnZW5lcmFsbHkKKyAgICAgKiB1c2VmdWwuCisgICAgICovCisgICAgcHVibGljIFZhbHVlQW5pbWF0b3IoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBWYWx1ZUFuaW1hdG9yIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgZHVyYXRpb24gYW5kIHNldCBvZgorICAgICAqIHZhbHVlcy4gSWYgdGhlIHZhbHVlcyBhcmUgYSBzZXQgb2YgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cywgdGhlbiB0aGVzZSBvYmplY3RzCisgICAgICogZGVmaW5lIHRoZSBwb3RlbnRpYWxseSBtdWx0aXBsZSBwcm9wZXJ0aWVzIGJlaW5nIGFuaW1hdGVkIGFuZCB0aGUgdmFsdWVzIHRoZSBwcm9wZXJ0aWVzIGFyZQorICAgICAqIGFuaW1hdGVkIGJldHdlZW4uIE90aGVyd2lzZSwgdGhlIHZhbHVlcyBkZWZpbmUgYSBzaW5nbGUgc2V0IG9mIHZhbHVlcyBhbmltYXRlZCBiZXR3ZWVuLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHNldCBvZiB2YWx1ZXMgdG8gYW5pbWF0ZSBiZXR3ZWVuLiBJZiB0aGVzZSB2YWx1ZXMgYXJlIG5vdAorICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMsIHRoZW4gdGhlcmUgc2hvdWxkIGJlIG1vcmUgdGhhbiBvbmUgdmFsdWUsIHNpbmNlIHRoZSB2YWx1ZXMKKyAgICAgKiBkZXRlcm1pbmUgdGhlIGludGVydmFsIHRvIGFuaW1hdGUgYmV0d2Vlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsdWVBbmltYXRvcihsb25nIGR1cmF0aW9uLCBULi4udmFsdWVzKSB7CisgICAgICAgIG1EdXJhdGlvbiA9IGR1cmF0aW9uOworICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIHNldFZhbHVlcyh2YWx1ZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWVzLCBwZXIgcHJvcGVydHksIGJlaW5nIGFuaW1hdGVkIGJldHdlZW4uIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGludGVybmFsbHkKKyAgICAgKiBieSB0aGUgY29uc3RydWN0b3JzIG9mIFZhbHVlQW5pbWF0b3IgdGhhdCB0YWtlIGEgbGlzdCBvZiB2YWx1ZXMuIEJ1dCBhbiBWYWx1ZUFuaW1hdG9yIGNhbgorICAgICAqIGJlIGNvbnN0cnVjdGVkIHdpdGhvdXQgdmFsdWVzIGFuZCB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIHNldCB0aGUgdmFsdWVzIG1hbnVhbGx5CisgICAgICogaW5zdGVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHNldCBvZiB2YWx1ZXMsIHBlciBwcm9wZXJ0eSwgYmVpbmcgYW5pbWF0ZWQgYmV0d2Vlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoUHJvcGVydHlWYWx1ZXNIb2xkZXIuLi4gdmFsdWVzKSB7CisgICAgICAgIGludCBudW1WYWx1ZXMgPSB2YWx1ZXMubGVuZ3RoOworICAgICAgICBtVmFsdWVzID0gdmFsdWVzOworICAgICAgICBtVmFsdWVzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eVZhbHVlc0hvbGRlcj4obnVtVmFsdWVzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7ICsraSkgeworICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIgdmFsdWVzSG9sZGVyID0gKFByb3BlcnR5VmFsdWVzSG9sZGVyKSB2YWx1ZXNbaV07CisgICAgICAgICAgICBtVmFsdWVzTWFwLnB1dCh2YWx1ZXNIb2xkZXIuZ2V0UHJvcGVydHlOYW1lKCksIHZhbHVlc0hvbGRlcik7CisgICAgICAgIH0KKyAgICAgICAgLy8gTmV3IHByb3BlcnR5L3ZhbHVlcy90YXJnZXQgc2hvdWxkIGNhdXNlIHJlLWluaXRpYWxpemF0aW9uIHByaW9yIHRvIHN0YXJ0aW5nCisgICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlcyB0aGF0IHRoaXMgVmFsdWVBbmltYXRvciBhbmltYXRlcyBiZXR3ZWVuLiBUaGVzZSB2YWx1ZXMgYXJlIHN0b3JlZCBpbgorICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMsIGV2ZW4gaWYgdGhlIFZhbHVlQW5pbWF0b3Igd2FzIGNyZWF0ZWQgd2l0aCBhIHNpbXBsZSBsaXN0CisgICAgICogb2YgdmFsdWUgb2JqZWN0cyBpbnN0ZWFkLgorICAgICAqCisgICAgICogQHJldHVybiBQcm9wZXJ0eVZhbHVlc0hvbGRlcltdIEFuIGFycmF5IG9mIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMgd2hpY2ggaG9sZCB0aGUKKyAgICAgKiB2YWx1ZXMsIHBlciBwcm9wZXJ0eSwgdGhhdCBkZWZpbmUgdGhlIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydHlWYWx1ZXNIb2xkZXJbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgIHJldHVybiBtVmFsdWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlcyB0byBhbmltYXRlIGJldHdlZW4gZm9yIHRoaXMgYW5pbWF0aW9uLiBJZiA8Y29kZT52YWx1ZXM8L2NvZGU+IGlzCisgICAgICogYSBzZXQgb2YgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cywgdGhlc2Ugb2JqZWN0cyB3aWxsIGJlY29tZSB0aGUgc2V0IG9mIHByb3BlcnRpZXMKKyAgICAgKiBhbmltYXRlZCBhbmQgdGhlIHZhbHVlcyB0aGF0IHRob3NlIHByb3BlcnRpZXMgYXJlIGFuaW1hdGVkIGJldHdlZW4uIE90aGVyd2lzZSwgdGhpcyBtZXRob2QKKyAgICAgKiB3aWxsIHNldCBvbmx5IG9uZSBzZXQgb2YgdmFsdWVzIGZvciB0aGUgVmFsdWVBbmltYXRvci4gQWxzbywgaWYgdGhlIHZhbHVlcyBhcmUgbm90CisgICAgICogUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cyBhbmQgaWYgdGhlcmUgYXJlIGFscmVhZHkgbXVsdGlwbGUgc2V0cyBvZgorICAgICAqIHZhbHVlcyBkZWZpbmVkIGZvciB0aGlzIFZhbHVlQW5pbWF0b3IgdmlhCisgICAgICogbW9yZSB0aGFuIG9uZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzLCB0aGlzIG1ldGhvZCB3aWxsIHNldCB0aGUgdmFsdWVzIGZvcgorICAgICAqIHRoZSBmaXJzdCBvZiB0aG9zZSBvYmplY3RzLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgc2V0IG9mIHZhbHVlcyB0byBhbmltYXRlIGJldHdlZW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWVzKFQuLi4gdmFsdWVzKSB7CisgICAgICAgIGlmIChtVmFsdWVzID09IG51bGwgfHwgbVZhbHVlcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgc2V0VmFsdWVzKG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcltdeworICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXIoIiIsIChPYmplY3RbXSl2YWx1ZXMpfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciB2YWx1ZXNIb2xkZXIgPSBtVmFsdWVzWzBdOworICAgICAgICAgICAgdmFsdWVzSG9sZGVyLnNldFZhbHVlcyh2YWx1ZXMpOworICAgICAgICB9CisgICAgICAgIC8vIE5ldyBwcm9wZXJ0eS92YWx1ZXMvdGFyZ2V0IHNob3VsZCBjYXVzZSByZS1pbml0aWFsaXphdGlvbiBwcmlvciB0byBzdGFydGluZworICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgZmlyc3QgYW5pbWF0aW9uCisgICAgICogZnJhbWUgb2YgYW4gYW5pbWF0aW9uLiBJZiB0aGVyZSBpcyBhIG5vbnplcm8gPGNvZGU+c3RhcnREZWxheTwvY29kZT4sIHRoZQorICAgICAqIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGF0IGRlbGF5IGVuZHMuCisgICAgICogSXQgdGFrZXMgY2FyZSBvZiB0aGUgZmluYWwgaW5pdGlhbGl6YXRpb24gc3RlcHMgZm9yIHRoZQorICAgICAqIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqICA8cD5PdmVycmlkZXMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNhbGwgdGhlIHN1cGVyY2xhc3MgbWV0aG9kIHRvIGVuc3VyZQorICAgICAqICB0aGF0IGludGVybmFsIG1lY2hhbmlzbXMgZm9yIHRoZSBhbmltYXRpb24gYXJlIHNldCB1cCBjb3JyZWN0bHkuPC9wPgorICAgICAqLworICAgIHZvaWQgaW5pdEFuaW1hdGlvbigpIHsKKyAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIGludCBudW1WYWx1ZXMgPSBtVmFsdWVzLmxlbmd0aDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBtVmFsdWVzW2ldLmluaXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DdXJyZW50SXRlcmF0aW9uID0gMDsKKyAgICAgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldER1cmF0aW9uKGxvbmcgZHVyYXRpb24pIHsKKyAgICAgICAgbUR1cmF0aW9uID0gZHVyYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldER1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gbUR1cmF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBhbmltYXRpb24gdG8gdGhlIHNwZWNpZmllZCBwb2ludCBpbiB0aW1lLiBUaGlzIHRpbWUgc2hvdWxkCisgICAgICogYmUgYmV0d2VlbiAwIGFuZCB0aGUgdG90YWwgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiwgaW5jbHVkaW5nIGFueSByZXBldGl0aW9uLiBJZgorICAgICAqIHRoZSBhbmltYXRpb24gaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkLCB0aGVuIGl0IHdpbGwgbm90IGFkdmFuY2UgZm9yd2FyZCBhZnRlciBpdCBpcworICAgICAqIHNldCB0byB0aGlzIHRpbWU7IGl0IHdpbGwgc2ltcGx5IHNldCB0aGUgdGltZSB0byB0aGlzIHZhbHVlIGFuZCBwZXJmb3JtIGFueSBhcHByb3ByaWF0ZQorICAgICAqIGFjdGlvbnMgYmFzZWQgb24gdGhhdCB0aW1lLiBJZiB0aGUgYW5pbWF0aW9uIGlzIGFscmVhZHkgcnVubmluZywgdGhlbiBzZXRDdXJyZW50UGxheVRpbWUoKQorICAgICAqIHdpbGwgc2V0IHRoZSBjdXJyZW50IHBsYXlpbmcgdGltZSB0byB0aGlzIHZhbHVlIGFuZCBjb250aW51ZSBwbGF5aW5nIGZyb20gdGhhdCBwb2ludC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwbGF5VGltZSBUaGUgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byB3aGljaCB0aGUgYW5pbWF0aW9uIGlzIGFkdmFuY2VkIG9yIHJld291bmQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFBsYXlUaW1lKGxvbmcgcGxheVRpbWUpIHsKKyAgICAgICAgaW5pdEFuaW1hdGlvbigpOworICAgICAgICBsb25nIGN1cnJlbnRUaW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKKyAgICAgICAgaWYgKG1QbGF5aW5nU3RhdGUgIT0gUlVOTklORykgeworICAgICAgICAgICAgbVNlZWtUaW1lID0gcGxheVRpbWU7CisgICAgICAgICAgICBtUGxheWluZ1N0YXRlID0gU0VFS0VEOworICAgICAgICB9CisgICAgICAgIG1TdGFydFRpbWUgPSBjdXJyZW50VGltZSAtIHBsYXlUaW1lOworICAgICAgICBhbmltYXRpb25GcmFtZShjdXJyZW50VGltZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGluIHRpbWUsIHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBjdXJyZW50CisgICAgICogdGltZSBtaW51cyB0aGUgdGltZSB0aGF0IHRoZSBhbmltYXRpb24gc3RhcnRlZC4gQW4gYW5pbWF0aW9uIHRoYXQgaXMgbm90IHlldCBzdGFydGVkIHdpbGwKKyAgICAgKiByZXR1cm4gYSB2YWx1ZSBvZiB6ZXJvLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aW1lIG9mIHRoZSBhbmltYXRpb24uCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFBsYXlUaW1lKCkgeworICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCB8fCBtUGxheWluZ1N0YXRlID09IFNUT1BQRUQpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpIC0gbVN0YXJ0VGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGN1c3RvbSwgc3RhdGljIGhhbmRsZXIgaGFuZGxlcyB0aGUgdGltaW5nIHB1bHNlIHRoYXQgaXMgc2hhcmVkIGJ5CisgICAgICogYWxsIGFjdGl2ZSBhbmltYXRpb25zLiBUaGlzIGFwcHJvYWNoIGVuc3VyZXMgdGhhdCB0aGUgc2V0dGluZyBvZiBhbmltYXRpb24KKyAgICAgKiB2YWx1ZXMgd2lsbCBoYXBwZW4gb24gdGhlIFVJIHRocmVhZCBhbmQgdGhhdCBhbGwgYW5pbWF0aW9ucyB3aWxsIHNoYXJlCisgICAgICogdGhlIHNhbWUgdGltZXMgZm9yIGNhbGN1bGF0aW5nIHRoZWlyIHZhbHVlcywgd2hpY2ggbWFrZXMgc3luY2hyb25pemluZworICAgICAqIGFuaW1hdGlvbnMgcG9zc2libGUuCisgICAgICoKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBbmltYXRpb25IYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGVyZSBhcmUgb25seSB0d28gbWVzc2FnZXMgdGhhdCB3ZSBjYXJlIGFib3V0OiBBTklNQVRJT05fU1RBUlQgYW5kCisgICAgICAgICAqIEFOSU1BVElPTl9GUkFNRS4gVGhlIFNUQVJUIG1lc3NhZ2UgaXMgc2VudCB3aGVuIGFuIGFuaW1hdGlvbidzIHN0YXJ0KCkKKyAgICAgICAgICogbWV0aG9kIGlzIGNhbGxlZC4gSXQgY2Fubm90IHN0YXJ0IHN5bmNocm9ub3VzbHkgd2hlbiBzdGFydCgpIGlzIGNhbGxlZAorICAgICAgICAgKiBiZWNhdXNlIHRoZSBjYWxsIG1heSBiZSBvbiB0aGUgd3JvbmcgdGhyZWFkLCBhbmQgaXQgd291bGQgYWxzbyBub3QgYmUKKyAgICAgICAgICogc3luY2hyb25pemVkIHdpdGggb3RoZXIgYW5pbWF0aW9ucyBiZWNhdXNlIGl0IHdvdWxkIG5vdCBzdGFydCBvbiBhIGNvbW1vbgorICAgICAgICAgKiB0aW1pbmcgcHVsc2UuIFNvIGVhY2ggYW5pbWF0aW9uIHNlbmRzIGEgU1RBUlQgbWVzc2FnZSB0byB0aGUgaGFuZGxlciwgd2hpY2gKKyAgICAgICAgICogY2F1c2VzIHRoZSBoYW5kbGVyIHRvIHBsYWNlIHRoZSBhbmltYXRpb24gb24gdGhlIGFjdGl2ZSBhbmltYXRpb25zIHF1ZXVlIGFuZAorICAgICAgICAgKiBzdGFydCBwcm9jZXNzaW5nIGZyYW1lcyBmb3IgdGhhdCBhbmltYXRpb24uCisgICAgICAgICAqIFRoZSBGUkFNRSBtZXNzYWdlIGlzIHRoZSBvbmUgdGhhdCBpcyBzZW50IG92ZXIgYW5kIG92ZXIgd2hpbGUgdGhlcmUgYXJlIGFueQorICAgICAgICAgKiBhY3RpdmUgYW5pbWF0aW9ucyB0byBwcm9jZXNzLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gY2FsbEFnYWluID0gdHJ1ZTsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYXZvaWQgc2VuZGluZyBmcmFtZSBtZXNzYWdlIHdoZW4gc3RhcnRpbmcgaWYgd2UKKyAgICAgICAgICAgICAgICAvLyB3ZXJlIGFscmVhZHkgcnVubmluZz8KKyAgICAgICAgICAgICAgICBjYXNlIEFOSU1BVElPTl9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNBbmltYXRpb25zLnNpemUoKSA+IDAgfHwgc0RlbGF5ZWRBbmltcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsQWdhaW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBwZW5kaW5nQW5pbXMgaG9sZHMgYW55IGFuaW1hdGlvbnMgdGhhdCBoYXZlIHJlcXVlc3RlZCB0byBiZSBzdGFydGVkCisgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGNsZWFyIHNQZW5kaW5nQW5pbWF0aW9ucywgYnV0IHN0YXJ0aW5nIGFuaW1hdGlvbiBtYXkKKyAgICAgICAgICAgICAgICAgICAgLy8gY2F1c2UgbW9yZSB0byBiZSBhZGRlZCB0byB0aGUgcGVuZGluZyBsaXN0IChmb3IgZXhhbXBsZSwgaWYgb25lIGFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICAvLyBzdGFydGluZyB0cmlnZ2VycyBhbm90aGVyIHN0YXJ0aW5nKS4gU28gd2UgbG9vcCB1bnRpbCBzUGVuZGluZ0FuaW1hdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgLy8gaXMgZW1wdHkuCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzUGVuZGluZ0FuaW1hdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFZhbHVlQW5pbWF0b3I+IHBlbmRpbmdDb3B5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxWYWx1ZUFuaW1hdG9yPikgc1BlbmRpbmdBbmltYXRpb25zLmNsb25lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzUGVuZGluZ0FuaW1hdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IHBlbmRpbmdDb3B5LnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlQW5pbWF0b3IgYW5pbSA9IHBlbmRpbmdDb3B5LmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYW5pbWF0aW9uIGhhcyBhIHN0YXJ0RGVsYXksIHBsYWNlIGl0IG9uIHRoZSBkZWxheWVkIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5pbS5tU3RhcnREZWxheSA9PSAwIHx8IGFuaW0ubVBsYXlpbmdTdGF0ZSA9PSBFTkRFRCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5tUGxheWluZ1N0YXRlID09IENBTkNFTEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0uc3RhcnRBbmltYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRGVsYXllZEFuaW1zLmFkZChhbmltKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIHRvIHByb2Nlc3MgZmlyc3QgZnJhbWUgb2YgbmV3IGFuaW1hdGlvbnMKKyAgICAgICAgICAgICAgICBjYXNlIEFOSU1BVElPTl9GUkFNRToKKyAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudFRpbWUgaG9sZHMgdGhlIGNvbW1vbiB0aW1lIGZvciBhbGwgYW5pbWF0aW9ucyBwcm9jZXNzZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gZHVyaW5nIHRoaXMgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBjdXJyZW50VGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QsIHByb2Nlc3MgYW5pbWF0aW9ucyBjdXJyZW50bHkgc2l0dGluZyBvbiB0aGUgZGVsYXllZCBxdWV1ZSwgYWRkaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZW0gdG8gdGhlIGFjdGl2ZSBhbmltYXRpb25zIGlmIHRoZXkgYXJlIHJlYWR5CisgICAgICAgICAgICAgICAgICAgIGludCBudW1EZWxheWVkQW5pbXMgPSBzRGVsYXllZEFuaW1zLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1EZWxheWVkQW5pbXM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVBbmltYXRvciBhbmltID0gc0RlbGF5ZWRBbmltcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5pbS5kZWxheWVkQW5pbWF0aW9uRnJhbWUoY3VycmVudFRpbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1JlYWR5QW5pbXMuYWRkKGFuaW0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBudW1SZWFkeUFuaW1zID0gc1JlYWR5QW5pbXMuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAobnVtUmVhZHlBbmltcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVhZHlBbmltczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVBbmltYXRvciBhbmltID0gc1JlYWR5QW5pbXMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0uc3RhcnRBbmltYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzRGVsYXllZEFuaW1zLnJlbW92ZShhbmltKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNSZWFkeUFuaW1zLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBOb3cgcHJvY2VzcyBhbGwgYWN0aXZlIGFuaW1hdGlvbnMuIFRoZSByZXR1cm4gdmFsdWUgZnJvbSBhbmltYXRpb25GcmFtZSgpCisgICAgICAgICAgICAgICAgICAgIC8vIHRlbGxzIHRoZSBoYW5kbGVyIHdoZXRoZXIgaXQgc2hvdWxkIG5vdyBiZSBlbmRlZAorICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQW5pbXMgPSBzQW5pbWF0aW9ucy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQW5pbXM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVBbmltYXRvciBhbmltID0gc0FuaW1hdGlvbnMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW0uYW5pbWF0aW9uRnJhbWUoY3VycmVudFRpbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0VuZGluZ0FuaW1zLmFkZChhbmltKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc0VuZGluZ0FuaW1zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc0VuZGluZ0FuaW1zLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0VuZGluZ0FuaW1zLmdldChpKS5lbmRBbmltYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNFbmRpbmdBbmltcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIHN0aWxsIGFjdGl2ZSBvciBkZWxheWVkIGFuaW1hdGlvbnMsIGNhbGwgdGhlIGhhbmRsZXIgYWdhaW4KKyAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgdGhlIGZyYW1lRGVsYXkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxBZ2FpbiAmJiAoIXNBbmltYXRpb25zLmlzRW1wdHkoKSB8fCAhc0RlbGF5ZWRBbmltcy5pc0VtcHR5KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRW1wdHlNZXNzYWdlRGVsYXllZChBTklNQVRJT05fRlJBTUUsIHNGcmFtZURlbGF5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byBkZWxheSBzdGFydGluZyB0aGUgYW5pbWF0aW9uIGFmdGVyCisgICAgICoge0BsaW5rICNzdGFydCgpfSBpcyBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IHJ1bm5pbmcgdGhlIGFuaW1hdGlvbgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFN0YXJ0RGVsYXkoKSB7CisgICAgICAgIHJldHVybiBtU3RhcnREZWxheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gZGVsYXkgc3RhcnRpbmcgdGhlIGFuaW1hdGlvbiBhZnRlcgorICAgICAqIHtAbGluayAjc3RhcnQoKX0gaXMgY2FsbGVkLgorCisgICAgICogQHBhcmFtIHN0YXJ0RGVsYXkgVGhlIGFtb3VudCBvZiB0aGUgZGVsYXksIGluIG1pbGxpc2Vjb25kcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0YXJ0RGVsYXkobG9uZyBzdGFydERlbGF5KSB7CisgICAgICAgIHRoaXMubVN0YXJ0RGVsYXkgPSBzdGFydERlbGF5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCBiZXR3ZWVuIGVhY2ggZnJhbWUgb2YgdGhlIGFuaW1hdGlvbi4gVGhpcyBpcyBhCisgICAgICogcmVxdWVzdGVkIHRpbWUgdGhhdCB0aGUgYW5pbWF0aW9uIHdpbGwgYXR0ZW1wdCB0byBob25vciwgYnV0IHRoZSBhY3R1YWwgZGVsYXkgYmV0d2VlbgorICAgICAqIGZyYW1lcyBtYXkgYmUgZGlmZmVyZW50LCBkZXBlbmRpbmcgb24gc3lzdGVtIGxvYWQgYW5kIGNhcGFiaWxpdGllcy4gVGhpcyBpcyBhIHN0YXRpYworICAgICAqIGZ1bmN0aW9uIGJlY2F1c2UgdGhlIHNhbWUgZGVsYXkgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBhbmltYXRpb25zLCBzaW5jZSB0aGV5IGFyZSBhbGwKKyAgICAgKiBydW4gb2ZmIG9mIGEgc2luZ2xlIHRpbWluZyBsb29wLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIHRpbWUgYmV0d2VlbiBmcmFtZXMsIGluIG1pbGxpc2Vjb25kcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRGcmFtZURlbGF5KCkgeworICAgICAgICByZXR1cm4gc0ZyYW1lRGVsYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIGJldHdlZW4gZWFjaCBmcmFtZSBvZiB0aGUgYW5pbWF0aW9uLiBUaGlzIGlzIGEKKyAgICAgKiByZXF1ZXN0ZWQgdGltZSB0aGF0IHRoZSBhbmltYXRpb24gd2lsbCBhdHRlbXB0IHRvIGhvbm9yLCBidXQgdGhlIGFjdHVhbCBkZWxheSBiZXR3ZWVuCisgICAgICogZnJhbWVzIG1heSBiZSBkaWZmZXJlbnQsIGRlcGVuZGluZyBvbiBzeXN0ZW0gbG9hZCBhbmQgY2FwYWJpbGl0aWVzLiBUaGlzIGlzIGEgc3RhdGljCisgICAgICogZnVuY3Rpb24gYmVjYXVzZSB0aGUgc2FtZSBkZWxheSB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIGFuaW1hdGlvbnMsIHNpbmNlIHRoZXkgYXJlIGFsbAorICAgICAqIHJ1biBvZmYgb2YgYSBzaW5nbGUgdGltaW5nIGxvb3AuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhbWVEZWxheSB0aGUgcmVxdWVzdGVkIHRpbWUgYmV0d2VlbiBmcmFtZXMsIGluIG1pbGxpc2Vjb25kcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGcmFtZURlbGF5KGxvbmcgZnJhbWVEZWxheSkgeworICAgICAgICBzRnJhbWVEZWxheSA9IGZyYW1lRGVsYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1vc3QgcmVjZW50IHZhbHVlIGNhbGN1bGF0ZWQgYnkgdGhpcyA8Y29kZT5WYWx1ZUFuaW1hdG9yPC9jb2RlPiB3aGVuIHRoZXJlIGlzIGp1c3Qgb25lCisgICAgICogcHJvcGVydHkgYmVpbmcgYW5pbWF0ZWQuIFRoaXMgdmFsdWUgaXMgb25seSBzZW5zaWJsZSB3aGlsZSB0aGUgYW5pbWF0aW9uIGlzIHJ1bm5pbmcuIFRoZSBtYWluCisgICAgICogcHVycG9zZSBmb3IgdGhpcyByZWFkLW9ubHkgcHJvcGVydHkgaXMgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGZyb20gdGhlIDxjb2RlPlZhbHVlQW5pbWF0b3I8L2NvZGU+CisgICAgICogZHVyaW5nIGEgY2FsbCB0byB7QGxpbmsgQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciNvbkFuaW1hdGlvblVwZGF0ZShWYWx1ZUFuaW1hdG9yKX0sIHdoaWNoCisgICAgICogaXMgY2FsbGVkIGR1cmluZyBlYWNoIGFuaW1hdGlvbiBmcmFtZSwgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHZhbHVlIGlzIGNhbGN1bGF0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuaW1hdGVkVmFsdWUgVGhlIHZhbHVlIG1vc3QgcmVjZW50bHkgY2FsY3VsYXRlZCBieSB0aGlzIDxjb2RlPlZhbHVlQW5pbWF0b3I8L2NvZGU+IGZvcgorICAgICAqIHRoZSBzaW5nbGUgcHJvcGVydHkgYmVpbmcgYW5pbWF0ZWQuIElmIHRoZXJlIGFyZSBzZXZlcmFsIHByb3BlcnRpZXMgYmVpbmcgYW5pbWF0ZWQKKyAgICAgKiAoc3BlY2lmaWVkIGJ5IHNldmVyYWwgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cyBpbiB0aGUgY29uc3RydWN0b3IpLCB0aGlzIGZ1bmN0aW9uCisgICAgICogcmV0dXJucyB0aGUgYW5pbWF0ZWQgdmFsdWUgZm9yIHRoZSBmaXJzdCBvZiB0aG9zZSBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0QW5pbWF0ZWRWYWx1ZSgpIHsKKyAgICAgICAgaWYgKG1WYWx1ZXMgIT0gbnVsbCAmJiBtVmFsdWVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiBtVmFsdWVzWzBdLmdldEFuaW1hdGVkVmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBTaG91bGRuJ3QgZ2V0IGhlcmU7IHNob3VsZCBhbHdheXMgaGF2ZSB2YWx1ZXMgdW5sZXNzIFZhbHVlQW5pbWF0b3Igd2FzIHNldCB1cCB3cm9uZworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbW9zdCByZWNlbnQgdmFsdWUgY2FsY3VsYXRlZCBieSB0aGlzIDxjb2RlPlZhbHVlQW5pbWF0b3I8L2NvZGU+IGZvciA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+LgorICAgICAqIFRoZSBtYWluIHB1cnBvc2UgZm9yIHRoaXMgcmVhZC1vbmx5IHByb3BlcnR5IGlzIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBmcm9tIHRoZQorICAgICAqIDxjb2RlPlZhbHVlQW5pbWF0b3I8L2NvZGU+IGR1cmluZyBhIGNhbGwgdG8KKyAgICAgKiB7QGxpbmsgQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciNvbkFuaW1hdGlvblVwZGF0ZShWYWx1ZUFuaW1hdG9yKX0sIHdoaWNoCisgICAgICogaXMgY2FsbGVkIGR1cmluZyBlYWNoIGFuaW1hdGlvbiBmcmFtZSwgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHZhbHVlIGlzIGNhbGN1bGF0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuaW1hdGVkVmFsdWUgVGhlIHZhbHVlIG1vc3QgcmVjZW50bHkgY2FsY3VsYXRlZCBmb3IgdGhlIG5hbWVkIHByb3BlcnR5CisgICAgICogYnkgdGhpcyA8Y29kZT5WYWx1ZUFuaW1hdG9yPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEFuaW1hdGVkVmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciB2YWx1ZXNIb2xkZXIgPSBtVmFsdWVzTWFwLmdldChwcm9wZXJ0eU5hbWUpOworICAgICAgICBpZiAodmFsdWVzSG9sZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZXNIb2xkZXIuZ2V0QW5pbWF0ZWRWYWx1ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQXQgbGVhc3QgYXZvaWQgY3Jhc2hpbmcgaWYgY2FsbGVkIHdpdGggYm9ndXMgcHJvcGVydHlOYW1lCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgaG93IG1hbnkgdGltZXMgdGhlIGFuaW1hdGlvbiBzaG91bGQgYmUgcmVwZWF0ZWQuIElmIHRoZSByZXBlYXQKKyAgICAgKiBjb3VudCBpcyAwLCB0aGUgYW5pbWF0aW9uIGlzIG5ldmVyIHJlcGVhdGVkLiBJZiB0aGUgcmVwZWF0IGNvdW50IGlzCisgICAgICogZ3JlYXRlciB0aGFuIDAgb3Ige0BsaW5rICNJTkZJTklURX0sIHRoZSByZXBlYXQgbW9kZSB3aWxsIGJlIHRha2VuCisgICAgICogaW50byBhY2NvdW50LiBUaGUgcmVwZWF0IGNvdW50IGlzIDAgYnkgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhbmltYXRpb24gc2hvdWxkIGJlIHJlcGVhdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVwZWF0Q291bnQoaW50IHZhbHVlKSB7CisgICAgICAgIG1SZXBlYXRDb3VudCA9IHZhbHVlOworICAgIH0KKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIGhvdyBtYW55IHRpbWVzIHRoZSBhbmltYXRpb24gc2hvdWxkIHJlcGVhdC4gVGhlIGRlZmF1bHQgdmFsdWUKKyAgICAgKiBpcyAwLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhbmltYXRpb24gc2hvdWxkIHJlcGVhdCwgb3Ige0BsaW5rICNJTkZJTklURX0KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFJlcGVhdENvdW50KCkgeworICAgICAgICByZXR1cm4gbVJlcGVhdENvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgd2hhdCB0aGlzIGFuaW1hdGlvbiBzaG91bGQgZG8gd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQuIFRoaXMKKyAgICAgKiBzZXR0aW5nIGlzIGFwcGxpZWQgb25seSB3aGVuIHRoZSByZXBlYXQgY291bnQgaXMgZWl0aGVyIGdyZWF0ZXIgdGhhbgorICAgICAqIDAgb3Ige0BsaW5rICNJTkZJTklURX0uIERlZmF1bHRzIHRvIHtAbGluayAjUkVTVEFSVH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUge0BsaW5rICNSRVNUQVJUfSBvciB7QGxpbmsgI1JFVkVSU0V9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZShpbnQgdmFsdWUpIHsKKyAgICAgICAgbVJlcGVhdE1vZGUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHdoYXQgdGhpcyBhbmltYXRpb24gc2hvdWxkIGRvIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kLgorICAgICAqCisgICAgICogQHJldHVybiBlaXRoZXIgb25lIG9mIHtAbGluayAjUkVWRVJTRX0gb3Ige0BsaW5rICNSRVNUQVJUfQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0TW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXBlYXRNb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgc2V0IG9mIGxpc3RlbmVycyB0aGF0IGFyZSBzZW50IHVwZGF0ZSBldmVudHMgdGhyb3VnaCB0aGUgbGlmZSBvZgorICAgICAqIGFuIGFuaW1hdGlvbi4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFsbCBsaXN0ZW5lcnMgZm9yIGV2ZXJ5IGZyYW1lIG9mIHRoZSBhbmltYXRpb24sCisgICAgICogYWZ0ZXIgdGhlIHZhbHVlcyBmb3IgdGhlIGFuaW1hdGlvbiBoYXZlIGJlZW4gY2FsY3VsYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gYmUgYWRkZWQgdG8gdGhlIGN1cnJlbnQgc2V0IG9mIGxpc3RlbmVycyBmb3IgdGhpcyBhbmltYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVXBkYXRlTGlzdGVuZXIoQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobVVwZGF0ZUxpc3RlbmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtVXBkYXRlTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxBbmltYXRvclVwZGF0ZUxpc3RlbmVyPigpOworICAgICAgICB9CisgICAgICAgIG1VcGRhdGVMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFsbCBsaXN0ZW5lcnMgZnJvbSB0aGUgc2V0IGxpc3RlbmluZyB0byBmcmFtZSB1cGRhdGVzIGZvciB0aGlzIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBbGxVcGRhdGVMaXN0ZW5lcnMoKSB7CisgICAgICAgIGlmIChtVXBkYXRlTGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtVXBkYXRlTGlzdGVuZXJzLmNsZWFyKCk7CisgICAgICAgIG1VcGRhdGVMaXN0ZW5lcnMgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBzZXQgbGlzdGVuaW5nIHRvIGZyYW1lIHVwZGF0ZXMgZm9yIHRoaXMgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkIGZyb20gdGhlIGN1cnJlbnQgc2V0IG9mIHVwZGF0ZSBsaXN0ZW5lcnMKKyAgICAgKiBmb3IgdGhpcyBhbmltYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVXBkYXRlTGlzdGVuZXIoQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobVVwZGF0ZUxpc3RlbmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbVVwZGF0ZUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworICAgICAgICBpZiAobVVwZGF0ZUxpc3RlbmVycy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgbVVwZGF0ZUxpc3RlbmVycyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSB0aW1lIGludGVycG9sYXRvciB1c2VkIGluIGNhbGN1bGF0aW5nIHRoZSBlbGFwc2VkIGZyYWN0aW9uIG9mIHRoaXMgYW5pbWF0aW9uLiBUaGUKKyAgICAgKiBpbnRlcnBvbGF0b3IgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBhbmltYXRpb24gcnVucyB3aXRoIGxpbmVhciBvciBub24tbGluZWFyIG1vdGlvbiwKKyAgICAgKiBzdWNoIGFzIGFjY2VsZXJhdGlvbiBhbmQgZGVjZWxlcmF0aW9uLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcworICAgICAqIHtAbGluayBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yfQorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBpbnRlcnBvbGF0b3IgdG8gYmUgdXNlZCBieSB0aGlzIGFuaW1hdGlvbgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEludGVycG9sYXRvcihJbnRlcnBvbGF0b3IgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1JbnRlcnBvbGF0b3IgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRpbWluZyBpbnRlcnBvbGF0b3IgdGhhdCB0aGlzIFZhbHVlQW5pbWF0b3IgdXNlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHRpbWluZyBpbnRlcnBvbGF0b3IgZm9yIHRoaXMgVmFsdWVBbmltYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW50ZXJwb2xhdG9yIGdldEludGVycG9sYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG1JbnRlcnBvbGF0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgZXZhbHVhdG9yIHRvIGJlIHVzZWQgd2hlbiBjYWxjdWxhdGluZyB0aGUgYW5pbWF0ZWQgdmFsdWVzIG9mIHRoaXMgYW5pbWF0aW9uLgorICAgICAqIFRoZSBzeXN0ZW0gd2lsbCBhdXRvbWF0aWNhbGx5IGFzc2lnbiBhIGZsb2F0LCBpbnQsIG9yIGRvdWJsZSBldmFsdWF0b3IgYmFzZWQgb24gdGhlIHR5cGUKKyAgICAgKiBvZiA8Y29kZT5zdGFydFZhbHVlPC9jb2RlPiBhbmQgPGNvZGU+ZW5kVmFsdWU8L2NvZGU+IGluIHRoZSBjb25zdHJ1Y3Rvci4gQnV0IGlmIHRoZXNlIHZhbHVlcworICAgICAqIGFyZSBub3Qgb25lIG9mIHRoZXNlIHByaW1pdGl2ZSB0eXBlcywgb3IgaWYgZGlmZmVyZW50IGV2YWx1YXRpb24gaXMgZGVzaXJlZCAoc3VjaCBhcyBpcworICAgICAqIG5lY2Vzc2FyeSB3aXRoIGludCB2YWx1ZXMgdGhhdCByZXByZXNlbnQgY29sb3JzKSwgYSBjdXN0b20gZXZhbHVhdG9yIG5lZWRzIHRvIGJlIGFzc2lnbmVkLgorICAgICAqIEZvciBleGFtcGxlLCB3aGVuIHJ1bm5pbmcgYW4gYW5pbWF0aW9uIG9uIGNvbG9yIHZhbHVlcywgdGhlIHtAbGluayBSR0JFdmFsdWF0b3J9CisgICAgICogc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IGNvcnJlY3QgUkdCIGNvbG9yIGludGVycG9sYXRpb24uCisgICAgICoKKyAgICAgKiA8cD5JZiB0aGlzIFZhbHVlQW5pbWF0b3IgaGFzIG9ubHkgb25lIHNldCBvZiB2YWx1ZXMgYmVpbmcgYW5pbWF0ZWQgYmV0d2VlbiwgdGhpcyBldmFsdWF0b3IKKyAgICAgKiB3aWxsIGJlIHVzZWQgZm9yIHRoYXQgc2V0LiBJZiB0aGVyZSBhcmUgc2V2ZXJhbCBzZXRzIG9mIHZhbHVlcyBiZWluZyBhbmltYXRlZCwgd2hpY2ggaXMKKyAgICAgKiB0aGUgY2FzZSBpZiBQcm9wZXJ0eVZhbHVlc0hPbGRlciBvYmplY3RzIHdlcmUgc2V0IG9uIHRoZSBWYWx1ZUFuaW1hdG9yLCB0aGVuIHRoZSBldmFsdWF0b3IKKyAgICAgKiBpcyBhc3NpZ25lZCBqdXN0IHRvIHRoZSBmaXJzdCBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3QuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBldmFsdWF0b3IgdG8gYmUgdXNlZCB0aGlzIGFuaW1hdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV2YWx1YXRvcihUeXBlRXZhbHVhdG9yIHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIG1WYWx1ZXMgIT0gbnVsbCAmJiBtVmFsdWVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIG1WYWx1ZXNbMF0uc2V0RXZhbHVhdG9yKHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IHRoZSBhbmltYXRpb24gcGxheWluZy4gVGhpcyB2ZXJzaW9uIG9mIHN0YXJ0KCkgdGFrZXMgYSBib29sZWFuIGZsYWcgdGhhdCBpbmRpY2F0ZXMKKyAgICAgKiB3aGV0aGVyIHRoZSBhbmltYXRpb24gc2hvdWxkIHBsYXkgaW4gcmV2ZXJzZS4gVGhlIGZsYWcgaXMgdXN1YWxseSBmYWxzZSwgYnV0IG1heSBiZSBzZXQKKyAgICAgKiB0byB0cnVlIGlmIGNhbGxlZCBmcm9tIHRoZSByZXZlcnNlKCkgbWV0aG9kLworICAgICAqCisgICAgICogQHBhcmFtIHBsYXlCYWNrd2FyZHMgV2hldGhlciB0aGUgVmFsdWVBbmltYXRvciBzaG91bGQgc3RhcnQgcGxheWluZyBpbiByZXZlcnNlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzdGFydChib29sZWFuIHBsYXlCYWNrd2FyZHMpIHsKKyAgICAgICAgbVBsYXlpbmdCYWNrd2FyZHMgPSBwbGF5QmFja3dhcmRzOworICAgICAgICBMb29wZXIgbG9vcGVyID0gTG9vcGVyLmdldE1haW5Mb29wZXIoKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc1VpVGhyZWFkOworICAgICAgICBpZiAobG9vcGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlzVWlUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpID09IGxvb3Blci5nZXRUaHJlYWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZSBjaGVjayBpZiB3ZSBkb24ndCBoYXZlIGEgTG9vcGVyICh0aGlzIGlzbid0IGFuIEFjdGl2aXR5KQorICAgICAgICAgICAgaXNVaVRocmVhZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChtU3RhcnREZWxheSA9PSAwKSAmJiBpc1VpVGhyZWFkKSB7CisgICAgICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+IHRtcExpc3RlbmVycyA9CisgICAgICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+KSBtTGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgICAgICAgICAgZm9yIChBbmltYXRvckxpc3RlbmVyIGxpc3RlbmVyIDogdG1wTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uU3RhcnQodGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVGhpcyBzZXRzIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBhbmltYXRpb24sIHByaW9yIHRvIGFjdHVhbGx5IHN0YXJ0aW5nIGl0IHJ1bm5pbmcKKyAgICAgICAgICAgIHNldEN1cnJlbnRQbGF5VGltZShnZXRDdXJyZW50UGxheVRpbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgbVBsYXlpbmdTdGF0ZSA9IFNUT1BQRUQ7CisgICAgICAgIG1TdGFydGVkRGVsYXkgPSBmYWxzZTsKKyAgICAgICAgc1BlbmRpbmdBbmltYXRpb25zLmFkZCh0aGlzKTsKKyAgICAgICAgaWYgKHNBbmltYXRpb25IYW5kbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHNBbmltYXRpb25IYW5kbGVyID0gbmV3IEFuaW1hdGlvbkhhbmRsZXIoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBkb2VzIHRoaXMgcHV0IHRvbyBtYW55IG1lc3NhZ2VzIG9uIHRoZSBxdWV1ZSBpZiB0aGUgaGFuZGxlcgorICAgICAgICAvLyBpcyBhbHJlYWR5IHJ1bm5pbmc/CisgICAgICAgIHNBbmltYXRpb25IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoQU5JTUFUSU9OX1NUQVJUKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgc3RhcnQoZmFsc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+IHRtcExpc3RlbmVycyA9CisgICAgICAgICAgICAgICAgICAgIChBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4pIG1MaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgICAgIGZvciAoQW5pbWF0b3JMaXN0ZW5lciBsaXN0ZW5lciA6IHRtcExpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uQ2FuY2VsKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIEp1c3Qgc2V0IHRoZSBDQU5DRUxFRCBmbGFnIC0gdGhpcyBjYXVzZXMgdGhlIGFuaW1hdGlvbiB0byBlbmQgdGhlIG5leHQgdGltZSBhIGZyYW1lCisgICAgICAgIC8vIGlzIHByb2Nlc3NlZC4KKyAgICAgICAgbVBsYXlpbmdTdGF0ZSA9IENBTkNFTEVEOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKKyAgICAgICAgaWYgKCFzQW5pbWF0aW9ucy5jb250YWlucyh0aGlzKSAmJiAhc1BlbmRpbmdBbmltYXRpb25zLmNvbnRhaW5zKHRoaXMpKSB7CisgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgaWYgdGhlIGFuaW1hdGlvbiBoYXMgbm90IHlldCBzdGFydGVkOyBnZXQgaXQgcmVhZHkgZm9yIGVuZGluZworICAgICAgICAgICAgbVN0YXJ0ZWREZWxheSA9IGZhbHNlOworICAgICAgICAgICAgc1BlbmRpbmdBbmltYXRpb25zLmFkZCh0aGlzKTsKKyAgICAgICAgICAgIGlmIChzQW5pbWF0aW9uSGFuZGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc0FuaW1hdGlvbkhhbmRsZXIgPSBuZXcgQW5pbWF0aW9uSGFuZGxlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc0FuaW1hdGlvbkhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShBTklNQVRJT05fU1RBUlQpOworICAgICAgICB9CisgICAgICAgIC8vIEp1c3Qgc2V0IHRoZSBFTkRFRCBmbGFnIC0gdGhpcyBjYXVzZXMgdGhlIGFuaW1hdGlvbiB0byBlbmQgdGhlIG5leHQgdGltZSBhIGZyYW1lCisgICAgICAgIC8vIGlzIHByb2Nlc3NlZC4KKyAgICAgICAgbVBsYXlpbmdTdGF0ZSA9IEVOREVEOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKKyAgICAgICAgLy8gRU5ERUQgb3IgQ0FOQ0VMRUQgaW5kaWNhdGUgdGhhdCBpdCBoYXMgYmVlbiBlbmRlZCBvciBjYW5jZWxlZCwgYnV0IG5vdCBwcm9jZXNzZWQgeWV0CisgICAgICAgIHJldHVybiAobVBsYXlpbmdTdGF0ZSA9PSBSVU5OSU5HIHx8IG1QbGF5aW5nU3RhdGUgPT0gRU5ERUQgfHwgbVBsYXlpbmdTdGF0ZSA9PSBDQU5DRUxFRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGxheXMgdGhlIFZhbHVlQW5pbWF0b3IgaW4gcmV2ZXJzZS4gSWYgdGhlIGFuaW1hdGlvbiBpcyBhbHJlYWR5IHJ1bm5pbmcsCisgICAgICogaXQgd2lsbCBzdG9wIGl0c2VsZiBhbmQgcGxheSBiYWNrd2FyZHMgZnJvbSB0aGUgcG9pbnQgcmVhY2hlZCB3aGVuIHJldmVyc2Ugd2FzIGNhbGxlZC4KKyAgICAgKiBJZiB0aGUgYW5pbWF0aW9uIGlzIG5vdCBjdXJyZW50bHkgcnVubmluZywgdGhlbiBpdCB3aWxsIHN0YXJ0IGZyb20gdGhlIGVuZCBhbmQKKyAgICAgKiBwbGF5IGJhY2t3YXJkcy4gVGhpcyBiZWhhdmlvciBpcyBvbmx5IHNldCBmb3IgdGhlIGN1cnJlbnQgYW5pbWF0aW9uOyBmdXR1cmUgcGxheWluZworICAgICAqIG9mIHRoZSBhbmltYXRpb24gd2lsbCB1c2UgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgcGxheWluZyBmb3J3YXJkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJldmVyc2UoKSB7CisgICAgICAgIG1QbGF5aW5nQmFja3dhcmRzID0gIW1QbGF5aW5nQmFja3dhcmRzOworICAgICAgICBpZiAobVBsYXlpbmdTdGF0ZSA9PSBSVU5OSU5HKSB7CisgICAgICAgICAgICBsb25nIGN1cnJlbnRUaW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGxvbmcgY3VycmVudFBsYXlUaW1lID0gY3VycmVudFRpbWUgLSBtU3RhcnRUaW1lOworICAgICAgICAgICAgbG9uZyB0aW1lTGVmdCA9IG1EdXJhdGlvbiAtIGN1cnJlbnRQbGF5VGltZTsKKyAgICAgICAgICAgIG1TdGFydFRpbWUgPSBjdXJyZW50VGltZSAtIHRpbWVMZWZ0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhcnQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgaW50ZXJuYWxseSB0byBlbmQgYW4gYW5pbWF0aW9uIGJ5IHJlbW92aW5nIGl0IGZyb20gdGhlIGFuaW1hdGlvbnMgbGlzdC4gTXVzdCBiZQorICAgICAqIGNhbGxlZCBvbiB0aGUgVUkgdGhyZWFkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBlbmRBbmltYXRpb24oKSB7CisgICAgICAgIHNBbmltYXRpb25zLnJlbW92ZSh0aGlzKTsKKyAgICAgICAgbVBsYXlpbmdTdGF0ZSA9IFNUT1BQRUQ7CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPiB0bXBMaXN0ZW5lcnMgPQorICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+KSBtTGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgICAgICBmb3IgKEFuaW1hdG9yTGlzdGVuZXIgbGlzdGVuZXIgOiB0bXBMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkFuaW1hdGlvbkVuZCh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBpbnRlcm5hbGx5IHRvIHN0YXJ0IGFuIGFuaW1hdGlvbiBieSBhZGRpbmcgaXQgdG8gdGhlIGFjdGl2ZSBhbmltYXRpb25zIGxpc3QuIE11c3QgYmUKKyAgICAgKiBjYWxsZWQgb24gdGhlIFVJIHRocmVhZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3RhcnRBbmltYXRpb24oKSB7CisgICAgICAgIGluaXRBbmltYXRpb24oKTsKKyAgICAgICAgc0FuaW1hdGlvbnMuYWRkKHRoaXMpOworICAgICAgICBpZiAobVN0YXJ0RGVsYXkgPiAwICYmIG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTGlzdGVuZXJzIHdlcmUgYWxyZWFkeSBub3RpZmllZCBpbiBzdGFydCgpIGlmIHN0YXJ0RGVsYXkgaXMgMDsgdGhpcyBpcworICAgICAgICAgICAgLy8ganVzdCBmb3IgZGVsYXllZCBhbmltYXRpb25zCisgICAgICAgICAgICBBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4gdG1wTGlzdGVuZXJzID0KKyAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPikgbUxpc3RlbmVycy5jbG9uZSgpOworICAgICAgICAgICAgZm9yIChBbmltYXRvckxpc3RlbmVyIGxpc3RlbmVyIDogdG1wTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIub25BbmltYXRpb25TdGFydCh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIGZ1bmN0aW9uIGNhbGxlZCB0byBwcm9jZXNzIGFuIGFuaW1hdGlvbiBmcmFtZSBvbiBhbiBhbmltYXRpb24gdGhhdCBpcyBjdXJyZW50bHkKKyAgICAgKiBzbGVlcGluZyB0aHJvdWdoIGl0cyA8Y29kZT5zdGFydERlbGF5PC9jb2RlPiBwaGFzZS4gVGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlciBpdAorICAgICAqIHNob3VsZCBiZSB3b2tlbiB1cCBhbmQgcHV0IG9uIHRoZSBhY3RpdmUgYW5pbWF0aW9ucyBxdWV1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdXJyZW50VGltZSBUaGUgY3VycmVudCBhbmltYXRpb24gdGltZSwgdXNlZCB0byBjYWxjdWxhdGUgd2hldGhlciB0aGUgYW5pbWF0aW9uCisgICAgICogaGFzIGV4Y2VlZGVkIGl0cyA8Y29kZT5zdGFydERlbGF5PC9jb2RlPiBhbmQgc2hvdWxkIGJlIHN0YXJ0ZWQuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBhbmltYXRpb24ncyA8Y29kZT5zdGFydERlbGF5PC9jb2RlPiBoYXMgYmVlbiBleGNlZWRlZCBhbmQgdGhlIGFuaW1hdGlvbgorICAgICAqIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgc2V0IG9mIGFjdGl2ZSBhbmltYXRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkZWxheWVkQW5pbWF0aW9uRnJhbWUobG9uZyBjdXJyZW50VGltZSkgeworICAgICAgICBpZiAobVBsYXlpbmdTdGF0ZSA9PSBDQU5DRUxFRCB8fCBtUGxheWluZ1N0YXRlID09IEVOREVEKSB7CisgICAgICAgICAgICAvLyBlbmQgdGhlIGRlbGF5LCBwcm9jZXNzIGFuIGFuaW1hdGlvbiBmcmFtZSB0byBhY3R1YWxseSBjYW5jZWwgaXQKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICghbVN0YXJ0ZWREZWxheSkgeworICAgICAgICAgICAgbVN0YXJ0ZWREZWxheSA9IHRydWU7CisgICAgICAgICAgICBtRGVsYXlTdGFydFRpbWUgPSBjdXJyZW50VGltZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvbmcgZGVsdGFUaW1lID0gY3VycmVudFRpbWUgLSBtRGVsYXlTdGFydFRpbWU7CisgICAgICAgICAgICBpZiAoZGVsdGFUaW1lID4gbVN0YXJ0RGVsYXkpIHsKKyAgICAgICAgICAgICAgICAvLyBzdGFydERlbGF5IGVuZGVkIC0gc3RhcnQgdGhlIGFuaW0gYW5kIHJlY29yZCB0aGUKKyAgICAgICAgICAgICAgICAvLyBtU3RhcnRUaW1lIGFwcHJvcHJpYXRlbHkKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lID0gY3VycmVudFRpbWUgLSAoZGVsdGFUaW1lIC0gbVN0YXJ0RGVsYXkpOworICAgICAgICAgICAgICAgIG1QbGF5aW5nU3RhdGUgPSBSVU5OSU5HOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGludGVybmFsIGZ1bmN0aW9uIHByb2Nlc3NlcyBhIHNpbmdsZSBhbmltYXRpb24gZnJhbWUgZm9yIGEgZ2l2ZW4gYW5pbWF0aW9uLiBUaGUKKyAgICAgKiBjdXJyZW50VGltZSBwYXJhbWV0ZXIgaXMgdGhlIHRpbWluZyBwdWxzZSBzZW50IGJ5IHRoZSBoYW5kbGVyLCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUKKyAgICAgKiBlbGFwc2VkIGR1cmF0aW9uLCBhbmQgdGhlcmVmb3JlCisgICAgICogdGhlIGVsYXBzZWQgZnJhY3Rpb24sIG9mIHRoZSBhbmltYXRpb24uIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFuaW1hdGlvbgorICAgICAqIHNob3VsZCBiZSBlbmRlZCAod2hpY2ggaGFwcGVucyB3aGVuIHRoZSBlbGFwc2VkIHRpbWUgb2YgdGhlIGFuaW1hdGlvbiBleGNlZWRzIHRoZQorICAgICAqIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBpbmNsdWRpbmcgdGhlIHJlcGVhdENvdW50KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdXJyZW50VGltZSBUaGUgY3VycmVudCB0aW1lLCBhcyB0cmFja2VkIGJ5IHRoZSBzdGF0aWMgdGltaW5nIGhhbmRsZXIKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBpbmNsdWRpbmcgYW55IHJlcGV0aXRpb25zIGR1ZSB0bworICAgICAqIDxjb2RlPnJlcGVhdENvdW50PC9jb2RlPiBoYXMgYmVlbiBleGNlZWRlZCBhbmQgdGhlIGFuaW1hdGlvbiBzaG91bGQgYmUgZW5kZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGFuaW1hdGlvbkZyYW1lKGxvbmcgY3VycmVudFRpbWUpIHsKKyAgICAgICAgYm9vbGVhbiBkb25lID0gZmFsc2U7CisKKyAgICAgICAgaWYgKG1QbGF5aW5nU3RhdGUgPT0gU1RPUFBFRCkgeworICAgICAgICAgICAgbVBsYXlpbmdTdGF0ZSA9IFJVTk5JTkc7CisgICAgICAgICAgICBpZiAobVNlZWtUaW1lIDwgMCkgeworICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgPSBjdXJyZW50VGltZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lIC0gbVNlZWtUaW1lOworICAgICAgICAgICAgICAgIC8vIE5vdyB0aGF0IHdlJ3JlIHBsYXlpbmcsIHJlc2V0IHRoZSBzZWVrIHRpbWUKKyAgICAgICAgICAgICAgICBtU2Vla1RpbWUgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG1QbGF5aW5nU3RhdGUpIHsKKyAgICAgICAgY2FzZSBSVU5OSU5HOgorICAgICAgICBjYXNlIFNFRUtFRDoKKyAgICAgICAgICAgIGZsb2F0IGZyYWN0aW9uID0gKGZsb2F0KShjdXJyZW50VGltZSAtIG1TdGFydFRpbWUpIC8gbUR1cmF0aW9uOworICAgICAgICAgICAgaWYgKGZyYWN0aW9uID49IDFmKSB7CisgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50SXRlcmF0aW9uIDwgbVJlcGVhdENvdW50IHx8IG1SZXBlYXRDb3VudCA9PSBJTkZJTklURSkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaW1lIHRvIHJlcGVhdAorICAgICAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEFuaW1hdG9yTGlzdGVuZXIgbGlzdGVuZXIgOiBtTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIub25BbmltYXRpb25SZXBlYXQodGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKyttQ3VycmVudEl0ZXJhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXBlYXRNb2RlID09IFJFVkVSU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5aW5nQmFja3dhcmRzID0gbVBsYXlpbmdCYWNrd2FyZHMgPyBmYWxzZSA6IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZG9lc24ndCBhY2NvdW50IGZvciBmcmFjdGlvbiBnb2luZyBXYXl5eXl5IG92ZXIgMSwgbGlrZSAyKworICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IGZyYWN0aW9uIC0gMWY7CisgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgKz0gbUR1cmF0aW9uOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IE1hdGgubWluKGZyYWN0aW9uLCAxLjBmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVBsYXlpbmdCYWNrd2FyZHMpIHsKKyAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IDFmIC0gZnJhY3Rpb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbmltYXRlVmFsdWUoZnJhY3Rpb24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU5ERUQ6CisgICAgICAgICAgICAvLyBUaGUgZmluYWwgdmFsdWUgc2V0IG9uIHRoZSB0YXJnZXQgdmFyaWVzLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgYW5pbWF0aW9uCisgICAgICAgICAgICAvLyB3YXMgc3VwcG9zZWQgdG8gcmVwZWF0IGFuIG9kZCBudW1iZXIgb2YgdGltZXMKKyAgICAgICAgICAgIGlmIChtUmVwZWF0Q291bnQgPiAwICYmIChtUmVwZWF0Q291bnQgJiAweDAxKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgYW5pbWF0ZVZhbHVlKDBmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYW5pbWF0ZVZhbHVlKDFmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBzZXQgZG9uZSBmbGFnCisgICAgICAgIGNhc2UgQ0FOQ0VMRUQ6CisgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgIG1QbGF5aW5nU3RhdGUgPSBTVE9QUEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZG9uZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGUgZWxhcHNlZCBmcmFjdGlvbiBvZiB0aGUgYW5pbWF0aW9uIGR1cmluZyBldmVyeQorICAgICAqIGFuaW1hdGlvbiBmcmFtZS4gVGhpcyBmdW5jdGlvbiB0dXJucyB0aGUgZWxhcHNlZCBmcmFjdGlvbiBpbnRvIGFuIGludGVycG9sYXRlZCBmcmFjdGlvbgorICAgICAqIGFuZCB0aGVuIGludG8gYW4gYW5pbWF0ZWQgdmFsdWUgKGZyb20gdGhlIGV2YWx1YXRvci4gVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBtb3N0bHkgZHVyaW5nCisgICAgICogYW5pbWF0aW9uIHVwZGF0ZXMsIGJ1dCBpdCBpcyBhbHNvIGNhbGxlZCB3aGVuIHRoZSA8Y29kZT5lbmQoKTwvY29kZT4KKyAgICAgKiBmdW5jdGlvbiBpcyBjYWxsZWQsIHRvIHNldCB0aGUgZmluYWwgdmFsdWUgb24gdGhlIHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+T3ZlcnJpZGVzIG9mIHRoaXMgbWV0aG9kIG11c3QgY2FsbCB0aGUgc3VwZXJjbGFzcyB0byBwZXJmb3JtIHRoZSBjYWxjdWxhdGlvbgorICAgICAqIG9mIHRoZSBhbmltYXRlZCB2YWx1ZS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhlIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIGFuaW1hdGVWYWx1ZShmbG9hdCBmcmFjdGlvbikgeworICAgICAgICBmcmFjdGlvbiA9IG1JbnRlcnBvbGF0b3IuZ2V0SW50ZXJwb2xhdGlvbihmcmFjdGlvbik7CisgICAgICAgIGludCBudW1WYWx1ZXMgPSBtVmFsdWVzLmxlbmd0aDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7ICsraSkgeworICAgICAgICAgICAgbVZhbHVlc1tpXS5jYWxjdWxhdGVWYWx1ZShmcmFjdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1VcGRhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IG51bUxpc3RlbmVycyA9IG1VcGRhdGVMaXN0ZW5lcnMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1MaXN0ZW5lcnM7ICsraSkgeworICAgICAgICAgICAgICAgIG1VcGRhdGVMaXN0ZW5lcnMuZ2V0KGkpLm9uQW5pbWF0aW9uVXBkYXRlKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZhbHVlQW5pbWF0b3IgY2xvbmUoKSB7CisgICAgICAgIGZpbmFsIFZhbHVlQW5pbWF0b3IgYW5pbSA9IChWYWx1ZUFuaW1hdG9yKSBzdXBlci5jbG9uZSgpOworICAgICAgICBpZiAobVVwZGF0ZUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8QW5pbWF0b3JVcGRhdGVMaXN0ZW5lcj4gb2xkTGlzdGVuZXJzID0gbVVwZGF0ZUxpc3RlbmVyczsKKyAgICAgICAgICAgIGFuaW0ubVVwZGF0ZUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0b3JVcGRhdGVMaXN0ZW5lcj4oKTsKKyAgICAgICAgICAgIGludCBudW1MaXN0ZW5lcnMgPSBvbGRMaXN0ZW5lcnMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1MaXN0ZW5lcnM7ICsraSkgeworICAgICAgICAgICAgICAgIGFuaW0ubVVwZGF0ZUxpc3RlbmVycy5hZGQob2xkTGlzdGVuZXJzLmdldChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYW5pbS5tU2Vla1RpbWUgPSAtMTsKKyAgICAgICAgYW5pbS5tUGxheWluZ0JhY2t3YXJkcyA9IGZhbHNlOworICAgICAgICBhbmltLm1DdXJyZW50SXRlcmF0aW9uID0gMDsKKyAgICAgICAgYW5pbS5tSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgYW5pbS5tUGxheWluZ1N0YXRlID0gU1RPUFBFRDsKKyAgICAgICAgYW5pbS5tU3RhcnRlZERlbGF5ID0gZmFsc2U7CisgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyW10gb2xkVmFsdWVzID0gbVZhbHVlczsKKyAgICAgICAgaWYgKG9sZFZhbHVlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgbnVtVmFsdWVzID0gb2xkVmFsdWVzLmxlbmd0aDsKKyAgICAgICAgICAgIGFuaW0ubVZhbHVlcyA9IG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcltudW1WYWx1ZXNdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7ICsraSkgeworICAgICAgICAgICAgICAgIGFuaW0ubVZhbHVlc1tpXSA9IG9sZFZhbHVlc1tpXS5jbG9uZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYW5pbS5tVmFsdWVzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eVZhbHVlc0hvbGRlcj4obnVtVmFsdWVzKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciB2YWx1ZXNIb2xkZXIgPSBtVmFsdWVzW2ldOworICAgICAgICAgICAgICAgIGFuaW0ubVZhbHVlc01hcC5wdXQodmFsdWVzSG9sZGVyLmdldFByb3BlcnR5TmFtZSgpLCB2YWx1ZXNIb2xkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmltOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudG9ycyBvZiB0aGlzIGludGVyZmFjZSBjYW4gYWRkIHRoZW1zZWx2ZXMgYXMgdXBkYXRlIGxpc3RlbmVycworICAgICAqIHRvIGFuIDxjb2RlPlZhbHVlQW5pbWF0b3I8L2NvZGU+IGluc3RhbmNlIHRvIHJlY2VpdmUgY2FsbGJhY2tzIG9uIGV2ZXJ5IGFuaW1hdGlvbgorICAgICAqIGZyYW1lLCBhZnRlciB0aGUgY3VycmVudCBmcmFtZSdzIHZhbHVlcyBoYXZlIGJlZW4gY2FsY3VsYXRlZCBmb3IgdGhhdAorICAgICAqIDxjb2RlPlZhbHVlQW5pbWF0b3I8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEFuaW1hdG9yVXBkYXRlTGlzdGVuZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Tm90aWZpZXMgdGhlIG9jY3VycmVuY2Ugb2YgYW5vdGhlciBmcmFtZSBvZiB0aGUgYW5pbWF0aW9uLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIHdoaWNoIHdhcyByZXBlYXRlZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25BbmltYXRpb25VcGRhdGUoVmFsdWVBbmltYXRvciBhbmltYXRpb24pOworCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9wYWNrYWdlLmh0bWwgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NjY2OWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsNiBAQAorPGh0bWw+Cis8Ym9keT4KK1Byb3ZpZGVzIGNsYXNzZXMgZm9yIGFuaW1hdGluZyB2YWx1ZXMgb3ZlciB0aW1lLCBhbmQgc2V0dGluZyB0aG9zZSB2YWx1ZXMgb24gdGFyZ2V0CitvYmplY3RzLgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGlvbkJhci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGlvbkJhci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZjJlMzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aW9uQmFyLmphdmEKQEAgLTAsMCArMSw0NzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwOworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNwaW5uZXJBZGFwdGVyOworCisvKioKKyAqIFRoaXMgaXMgdGhlIHB1YmxpYyBpbnRlcmZhY2UgdG8gdGhlIGNvbnRleHR1YWwgQWN0aW9uQmFyLgorICogVGhlIEFjdGlvbkJhciBhY3RzIGFzIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSB0aXRsZSBiYXIgaW4gQWN0aXZpdGllcy4KKyAqIEl0IHByb3ZpZGVzIGZhY2lsaXRpZXMgZm9yIGNyZWF0aW5nIHRvb2xiYXIgYWN0aW9ucyBhcyB3ZWxsIGFzCisgKiBtZXRob2RzIG9mIG5hdmlnYXRpbmcgYXJvdW5kIGFuIGFwcGxpY2F0aW9uLiAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFjdGlvbkJhciB7CisgICAgLyoqCisgICAgICogU3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlLiBDb25zaXN0cyBvZiBlaXRoZXIgYSBsb2dvIG9yIGljb24KKyAgICAgKiBhbmQgdGl0bGUgdGV4dCB3aXRoIGFuIG9wdGlvbmFsIHN1YnRpdGxlLiBDbGlja2luZyBhbnkgb2YgdGhlc2UgZWxlbWVudHMKKyAgICAgKiB3aWxsIGRpc3BhdGNoIG9uQWN0aW9uSXRlbVNlbGVjdGVkIHRvIHRoZSByZWdpc3RlcmVkIENhbGxiYWNrIHdpdGgKKyAgICAgKiBhIE1lbnVJdGVtIHdpdGggaXRlbSBJRCBhbmRyb2lkLlIuaWQuaG9tZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQVZJR0FUSU9OX01PREVfU1RBTkRBUkQgPSAwOworICAgIAorICAgIC8qKgorICAgICAqIERyb3Bkb3duIGxpc3QgbmF2aWdhdGlvbiBtb2RlLiBJbnN0ZWFkIG9mIHN0YXRpYyB0aXRsZSB0ZXh0IHRoaXMgbW9kZQorICAgICAqIHByZXNlbnRzIGEgZHJvcGRvd24gbWVudSBmb3IgbmF2aWdhdGlvbiB3aXRoaW4gdGhlIGFjdGl2aXR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUID0gMTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUYWIgbmF2aWdhdGlvbiBtb2RlLiBJbnN0ZWFkIG9mIHN0YXRpYyB0aXRsZSB0ZXh0IHRoaXMgbW9kZQorICAgICAqIHByZXNlbnRzIGEgc2VyaWVzIG9mIHRhYnMgZm9yIG5hdmlnYXRpb24gd2l0aGluIHRoZSBhY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQVZJR0FUSU9OX01PREVfVEFCUyA9IDI7CisgICAgCisgICAgLyoqCisgICAgICogQ3VzdG9tIG5hdmlnYXRpb24gbW9kZS4gVGhpcyBuYXZpZ2F0aW9uIG1vZGUgaXMgc2V0IGltcGxpY2l0bHkgd2hlbmV2ZXIKKyAgICAgKiBhIGN1c3RvbSBuYXZpZ2F0aW9uIHZpZXcgaXMgc2V0LiBTZWUge0BsaW5rICNzZXRDdXN0b21OYXZpZ2F0aW9uTW9kZShWaWV3KX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFWSUdBVElPTl9NT0RFX0NVU1RPTSA9IDM7CisKKyAgICAvKioKKyAgICAgKiBVc2UgbG9nbyBpbnN0ZWFkIG9mIGljb24gaWYgYXZhaWxhYmxlLiBUaGlzIGZsYWcgd2lsbCBjYXVzZSBhcHByb3ByaWF0ZQorICAgICAqIG5hdmlnYXRpb24gbW9kZXMgdG8gdXNlIGEgd2lkZXIgbG9nbyBpbiBwbGFjZSBvZiB0aGUgc3RhbmRhcmQgaWNvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNQTEFZX1VTRV9MT0dPID0gMHgxOworICAgIAorICAgIC8qKgorICAgICAqIEhpZGUgJ2hvbWUnIGVsZW1lbnRzIGluIHRoaXMgYWN0aW9uIGJhciwgbGVhdmluZyBtb3JlIHNwYWNlIGZvciBvdGhlcgorICAgICAqIG5hdmlnYXRpb24gZWxlbWVudHMuIFRoaXMgaW5jbHVkZXMgbG9nbyBhbmQgaWNvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNQTEFZX0hJREVfSE9NRSA9IDB4MjsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIGN1c3RvbSBuYXZpZ2F0aW9uIG1vZGUsIHN1cHBseWluZyBhIHZpZXcKKyAgICAgKiBmb3IgY3VzdG9tIG5hdmlnYXRpb24uCisgICAgICogCisgICAgICogQ3VzdG9tIG5hdmlnYXRpb24gdmlld3MgYXBwZWFyIGJldHdlZW4gdGhlIGFwcGxpY2F0aW9uIGljb24gYW5kCisgICAgICogYW55IGFjdGlvbiBidXR0b25zIGFuZCBtYXkgdXNlIGFueSBzcGFjZSBhdmFpbGFibGUgdGhlcmUuIENvbW1vbgorICAgICAqIHVzZSBjYXNlcyBmb3IgY3VzdG9tIG5hdmlnYXRpb24gdmlld3MgbWlnaHQgaW5jbHVkZSBhbiBhdXRvLXN1Z2dlc3RpbmcKKyAgICAgKiBhZGRyZXNzIGJhciBmb3IgYSBicm93c2VyIG9yIG90aGVyIG5hdmlnYXRpb24gbWVjaGFuaXNtcyB0aGF0IGRvIG5vdAorICAgICAqIHRyYW5zbGF0ZSB3ZWxsIHRvIHByb3ZpZGVkIG5hdmlnYXRpb24gbW9kZXMuCisgICAgICogCisgICAgICogQHBhcmFtIHZpZXcgQ3VzdG9tIG5hdmlnYXRpb24gdmlldyB0byBwbGFjZSBpbiB0aGUgQWN0aW9uQmFyLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEN1c3RvbU5hdmlnYXRpb25Nb2RlKFZpZXcgdmlldyk7CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyIGludG8gZHJvcGRvd24gbmF2aWdhdGlvbiBtb2RlIGFuZCBzdXBwbHkgYW4gYWRhcHRlcgorICAgICAqIHRoYXQgd2lsbCBwcm92aWRlIHZpZXdzIGZvciBuYXZpZ2F0aW9uIGNob2ljZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFkYXB0ZXIgQW4gYWRhcHRlciB0aGF0IHdpbGwgcHJvdmlkZSB2aWV3cyBib3RoIHRvIGRpc3BsYXkKKyAgICAgKiAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBuYXZpZ2F0aW9uIHNlbGVjdGlvbiBhbmQgcG9wdWxhdGUgdmlld3MKKyAgICAgKiAgICAgICAgICAgICAgICB3aXRoaW4gdGhlIGRyb3Bkb3duIG5hdmlnYXRpb24gbWVudS4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBOYXZpZ2F0aW9uQ2FsbGJhY2sgdGhhdCB3aWxsIHJlY2VpdmUgZXZlbnRzIHdoZW4gdGhlIHVzZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgc2VsZWN0cyBhIG5hdmlnYXRpb24gaXRlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREcm9wZG93bk5hdmlnYXRpb25Nb2RlKFNwaW5uZXJBZGFwdGVyIGFkYXB0ZXIsCisgICAgICAgICAgICBOYXZpZ2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2spOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyIGludG8gZHJvcGRvd24gbmF2aWdhdGlvbiBtb2RlIGFuZCBzdXBwbHkgYW4gYWRhcHRlciB0aGF0IHdpbGwKKyAgICAgKiBwcm92aWRlIHZpZXdzIGZvciBuYXZpZ2F0aW9uIGNob2ljZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBBbiBhZGFwdGVyIHRoYXQgd2lsbCBwcm92aWRlIHZpZXdzIGJvdGggdG8gZGlzcGxheSB0aGUgY3VycmVudAorICAgICAqICAgICAgICAgICAgICAgIG5hdmlnYXRpb24gc2VsZWN0aW9uIGFuZCBwb3B1bGF0ZSB2aWV3cyB3aXRoaW4gdGhlIGRyb3Bkb3duCisgICAgICogICAgICAgICAgICAgICAgbmF2aWdhdGlvbiBtZW51LgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIE5hdmlnYXRpb25DYWxsYmFjayB0aGF0IHdpbGwgcmVjZWl2ZSBldmVudHMgd2hlbiB0aGUgdXNlcgorICAgICAqICAgICAgICAgICAgICAgICBzZWxlY3RzIGEgbmF2aWdhdGlvbiBpdGVtLgorICAgICAqIEBwYXJhbSBkZWZhdWx0U2VsZWN0ZWRQb3NpdGlvbiBQb3NpdGlvbiB3aXRoaW4gdGhlIHByb3ZpZGVkIGFkYXB0ZXIgdGhhdCBzaG91bGQgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgZnJvbSB0aGUgb3V0c2V0LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERyb3Bkb3duTmF2aWdhdGlvbk1vZGUoU3Bpbm5lckFkYXB0ZXIgYWRhcHRlciwKKyAgICAgICAgICAgIE5hdmlnYXRpb25DYWxsYmFjayBjYWxsYmFjaywgaW50IGRlZmF1bHRTZWxlY3RlZFBvc2l0aW9uKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2VsZWN0ZWQgbmF2aWdhdGlvbiBpdGVtIGluIGRyb3Bkb3duIG9yIHRhYmJlZCBuYXZpZ2F0aW9uIG1vZGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFBvc2l0aW9uIG9mIHRoZSBpdGVtIHRvIHNlbGVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTZWxlY3RlZE5hdmlnYXRpb25JdGVtKGludCBwb3NpdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBzZWxlY3RlZCBuYXZpZ2F0aW9uIGl0ZW0gaW4gZHJvcGRvd24gb3IgdGFiYmVkIG5hdmlnYXRpb24gbW9kZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFBvc2l0aW9uIG9mIHRoZSBzZWxlY3RlZCBpdGVtLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbSgpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyIGludG8gc3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlLCB1c2luZyB0aGUgY3VycmVudGx5IHNldCB0aXRsZQorICAgICAqIGFuZC9vciBzdWJ0aXRsZS4KKyAgICAgKgorICAgICAqIFN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZSBpcyBkZWZhdWx0LiBUaGUgdGl0bGUgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gdGhlIG5hbWUgb2YKKyAgICAgKiB5b3VyIEFjdGl2aXR5IG9uIHN0YXJ0dXAgaWYgYW4gYWN0aW9uIGJhciBpcyBwcmVzZW50LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhcidzIHRpdGxlLiBUaGlzIHdpbGwgb25seSBiZSBkaXNwbGF5ZWQgaW4gc3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIHRpdGxlIFRpdGxlIHRvIHNldAorICAgICAqCisgICAgICogQHNlZSAjc2V0VGl0bGUoaW50KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIncyB0aXRsZS4gVGhpcyB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGluIHN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNJZCBSZXNvdXJjZSBJRCBvZiB0aXRsZSBzdHJpbmcgdG8gc2V0CisgICAgICoKKyAgICAgKiBAc2VlICNzZXRUaXRsZShDaGFyU2VxdWVuY2UpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGl0bGUoaW50IHJlc0lkKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhcidzIHN1YnRpdGxlLiBUaGlzIHdpbGwgb25seSBiZSBkaXNwbGF5ZWQgaW4gc3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlLgorICAgICAqIFNldCB0byBudWxsIHRvIGRpc2FibGUgdGhlIHN1YnRpdGxlIGVudGlyZWx5LgorICAgICAqCisgICAgICogQHBhcmFtIHN1YnRpdGxlIFN1YnRpdGxlIHRvIHNldAorICAgICAqCisgICAgICogQHNlZSAjc2V0U3VidGl0bGUoaW50KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFN1YnRpdGxlKENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIncyBzdWJ0aXRsZS4gVGhpcyB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGluIHN0YW5kYXJkIG5hdmlnYXRpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNJZCBSZXNvdXJjZSBJRCBvZiBzdWJ0aXRsZSBzdHJpbmcgdG8gc2V0CisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2UpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3VidGl0bGUoaW50IHJlc0lkKTsKKworICAgIC8qKgorICAgICAqIFNldCBkaXNwbGF5IG9wdGlvbnMuIFRoaXMgY2hhbmdlcyBhbGwgZGlzcGxheSBvcHRpb24gYml0cyBhdCBvbmNlLiBUbyBjaGFuZ2UKKyAgICAgKiBhIGxpbWl0ZWQgc3Vic2V0IG9mIGRpc3BsYXkgb3B0aW9ucywgc2VlIHtAbGluayAjc2V0RGlzcGxheU9wdGlvbnMoaW50LCBpbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBBIGNvbWJpbmF0aW9uIG9mIHRoZSBiaXRzIGRlZmluZWQgYnkgdGhlIERJU1BMQVlfIGNvbnN0YW50cworICAgICAqICAgICAgICAgICAgICAgIGRlZmluZWQgaW4gQWN0aW9uQmFyLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERpc3BsYXlPcHRpb25zKGludCBvcHRpb25zKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgc2VsZWN0ZWQgZGlzcGxheSBvcHRpb25zLiBPbmx5IHRoZSBvcHRpb25zIHNwZWNpZmllZCBieSBtYXNrIHdpbGwgYmUgY2hhbmdlZC4KKyAgICAgKiBUbyBjaGFuZ2UgYWxsIGRpc3BsYXkgb3B0aW9uIGJpdHMgYXQgb25jZSwgc2VlIHtAbGluayAjc2V0RGlzcGxheU9wdGlvbnMoaW50KX0uCisgICAgICogCisgICAgICogPHA+RXhhbXBsZTogc2V0RGlzcGxheU9wdGlvbnMoMCwgRElTUExBWV9ISURFX0hPTUUpIHdpbGwgZGlzYWJsZSB0aGUKKyAgICAgKiB7QGxpbmsgI0RJU1BMQVlfSElERV9IT01FfSBvcHRpb24uCisgICAgICogc2V0RGlzcGxheU9wdGlvbnMoRElTUExBWV9ISURFX0hPTUUsIERJU1BMQVlfSElERV9IT01FIHwgRElTUExBWV9VU0VfTE9HTykKKyAgICAgKiB3aWxsIGVuYWJsZSB7QGxpbmsgI0RJU1BMQVlfSElERV9IT01FfSBhbmQgZGlzYWJsZSB7QGxpbmsgI0RJU1BMQVlfVVNFX0xPR099LgorICAgICAqIAorICAgICAqIEBwYXJhbSBvcHRpb25zIEEgY29tYmluYXRpb24gb2YgdGhlIGJpdHMgZGVmaW5lZCBieSB0aGUgRElTUExBWV8gY29uc3RhbnRzCisgICAgICogICAgICAgICAgICAgICAgZGVmaW5lZCBpbiBBY3Rpb25CYXIuCisgICAgICogQHBhcmFtIG1hc2sgQSBiaXQgbWFzayBkZWNsYXJpbmcgd2hpY2ggZGlzcGxheSBvcHRpb25zIHNob3VsZCBiZSBjaGFuZ2VkLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERpc3BsYXlPcHRpb25zKGludCBvcHRpb25zLCBpbnQgbWFzayk7CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBBY3Rpb25CYXIncyBiYWNrZ3JvdW5kLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkIEJhY2tncm91bmQgZHJhd2FibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUgZCk7CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBjdXN0b20gbmF2aWdhdGlvbiB2aWV3LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBWaWV3IGdldEN1c3RvbU5hdmlnYXRpb25WaWV3KCk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBBY3Rpb25CYXIgdGl0bGUgaW4gc3RhbmRhcmQgbW9kZS4KKyAgICAgKiBSZXR1cm5zIG51bGwgaWYge0BsaW5rICNnZXROYXZpZ2F0aW9uTW9kZSgpfSB3b3VsZCBub3QgcmV0dXJuCisgICAgICoge0BsaW5rICNOQVZJR0FUSU9OX01PREVfU1RBTkRBUkR9LiAKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgQWN0aW9uQmFyIHRpdGxlIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgQWN0aW9uQmFyIHN1YnRpdGxlIGluIHN0YW5kYXJkIG1vZGUuCisgICAgICogUmV0dXJucyBudWxsIGlmIHtAbGluayAjZ2V0TmF2aWdhdGlvbk1vZGUoKX0gd291bGQgbm90IHJldHVybgorICAgICAqIHtAbGluayAjTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEfS4gCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IEFjdGlvbkJhciBzdWJ0aXRsZSBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBDaGFyU2VxdWVuY2UgZ2V0U3VidGl0bGUoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IG5hdmlnYXRpb24gbW9kZS4gVGhlIHJlc3VsdCB3aWxsIGJlIG9uZSBvZjoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEfTwvbGk+CisgICAgICogPGxpPntAbGluayAjTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1R9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNOQVZJR0FUSU9OX01PREVfVEFCU308L2xpPgorICAgICAqIDxsaT57QGxpbmsgI05BVklHQVRJT05fTU9ERV9DVVNUT019PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBuYXZpZ2F0aW9uIG1vZGUuCisgICAgICogCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSgpCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UpCisgICAgICogQHNlZSAjc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZShDaGFyU2VxdWVuY2UsIENoYXJTZXF1ZW5jZSkKKyAgICAgKiBAc2VlICNzZXREcm9wZG93bk5hdmlnYXRpb25Nb2RlKFNwaW5uZXJBZGFwdGVyKQorICAgICAqIEBzZWUgI3NldFRhYk5hdmlnYXRpb25Nb2RlKCkKKyAgICAgKiBAc2VlICNzZXRDdXN0b21OYXZpZ2F0aW9uTW9kZShWaWV3KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TmF2aWdhdGlvbk1vZGUoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNldCBvZiBkaXNwbGF5IG9wdGlvbnMuIAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RGlzcGxheU9wdGlvbnMoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhciBpbnRvIHRhYmJlZCBuYXZpZ2F0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiBAc2VlICNhZGRUYWIoVGFiKQorICAgICAqIEBzZWUgI2luc2VydFRhYihUYWIsIGludCkKKyAgICAgKiBAc2VlICNyZW1vdmVUYWIoVGFiKQorICAgICAqIEBzZWUgI3JlbW92ZVRhYkF0KGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUYWJOYXZpZ2F0aW9uTW9kZSgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcge0BsaW5rIFRhYn0uCisgICAgICogVGhpcyB0YWIgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIGFjdGlvbiBiYXIgdW50aWwgaXQgaXMgYWRkZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgbmV3IFRhYgorICAgICAqCisgICAgICogQHNlZSAjYWRkVGFiKFRhYikKKyAgICAgKiBAc2VlICNpbnNlcnRUYWIoVGFiLCBpbnQpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFRhYiBuZXdUYWIoKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhIHRhYiBmb3IgdXNlIGluIHRhYmJlZCBuYXZpZ2F0aW9uIG1vZGUuIFRoZSB0YWIgd2lsbCBiZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHRhYiBUYWIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgYWRkVGFiKFRhYiB0YWIpOworCisgICAgLyoqCisgICAgICogQWRkIGEgdGFiIGZvciB1c2UgaW4gdGFiYmVkIG5hdmlnYXRpb24gbW9kZS4gVGhlIHRhYiB3aWxsIGJlIGluc2VydGVkIGF0CisgICAgICogPGNvZGU+cG9zaXRpb248L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHRhYiBUaGUgdGFiIHRvIGFkZAorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgbmV3IHBvc2l0aW9uIG9mIHRoZSB0YWIKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRUYWIoVGFiIHRhYiwgaW50IHBvc2l0aW9uKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHRhYiBmcm9tIHRoZSBhY3Rpb24gYmFyLgorICAgICAqCisgICAgICogQHBhcmFtIHRhYiBUaGUgdGFiIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZVRhYihUYWIgdGFiKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHRhYiBmcm9tIHRoZSBhY3Rpb24gYmFyLgorICAgICAqCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFBvc2l0aW9uIG9mIHRoZSB0YWIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlVGFiQXQoaW50IHBvc2l0aW9uKTsKKworICAgIC8qKgorICAgICAqIFNlbGVjdCB0aGUgc3BlY2lmaWVkIHRhYi4gSWYgaXQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBhY3Rpb24gYmFyIGl0IHdpbGwgYmUgYWRkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFiIFRhYiB0byBzZWxlY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZWxlY3RUYWIoVGFiIHRhYik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGFiIGlmIGluIHRhYmJlZCBuYXZpZ2F0aW9uIG1vZGUgYW5kIHRoZXJlIGlzIGF0IGxlYXN0CisgICAgICogb25lIHRhYiBwcmVzZW50LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHRhYiBvciBudWxsCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFRhYiBnZXRTZWxlY3RlZFRhYigpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgaGVpZ2h0IG9mIHRoZSBBY3Rpb25CYXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBBY3Rpb25CYXIncyBoZWlnaHQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEhlaWdodCgpOworCisgICAgLyoqCisgICAgICogU2hvdyB0aGUgQWN0aW9uQmFyIGlmIGl0IGlzIG5vdCBjdXJyZW50bHkgc2hvd2luZy4KKyAgICAgKiBJZiB0aGUgd2luZG93IGhvc3RpbmcgdGhlIEFjdGlvbkJhciBkb2VzIG5vdCBoYXZlIHRoZSBmZWF0dXJlCisgICAgICoge0BsaW5rIFdpbmRvdyNGRUFUVVJFX0FDVElPTl9CQVJfT1ZFUkxBWX0gaXQgd2lsbCByZXNpemUgYXBwbGljYXRpb24KKyAgICAgKiBjb250ZW50IHRvIGZpdCB0aGUgbmV3IHNwYWNlIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzaG93KCk7CisKKyAgICAvKioKKyAgICAgKiBIaWRlIHRoZSBBY3Rpb25CYXIgaWYgaXQgaXMgbm90IGN1cnJlbnRseSBzaG93aW5nLgorICAgICAqIElmIHRoZSB3aW5kb3cgaG9zdGluZyB0aGUgQWN0aW9uQmFyIGRvZXMgbm90IGhhdmUgdGhlIGZlYXR1cmUKKyAgICAgKiB7QGxpbmsgV2luZG93I0ZFQVRVUkVfQUNUSU9OX0JBUl9PVkVSTEFZfSBpdCB3aWxsIHJlc2l6ZSBhcHBsaWNhdGlvbgorICAgICAqIGNvbnRlbnQgdG8gZml0IHRoZSBuZXcgc3BhY2UgYXZhaWxhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGhpZGUoKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEFjdGlvbkJhciBpcyBzaG93aW5nLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzU2hvd2luZygpOworCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgaW50ZXJmYWNlIGZvciBBY3Rpb25CYXIgbmF2aWdhdGlvbiBldmVudHMuIAorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgTmF2aWdhdGlvbkNhbGxiYWNrIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciBhIG5hdmlnYXRpb24gaXRlbSBpbiB5b3VyIGFjdGlvbiBiYXIKKyAgICAgICAgICogaXMgc2VsZWN0ZWQuCisgICAgICAgICAqICAgIAorICAgICAgICAgKiBAcGFyYW0gaXRlbVBvc2l0aW9uIFBvc2l0aW9uIG9mIHRoZSBpdGVtIGNsaWNrZWQuCisgICAgICAgICAqIEBwYXJhbSBpdGVtSWQgSUQgb2YgdGhlIGl0ZW0gY2xpY2tlZC4KKyAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25OYXZpZ2F0aW9uSXRlbVNlbGVjdGVkKGludCBpdGVtUG9zaXRpb24sIGxvbmcgaXRlbUlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHRhYiBpbiB0aGUgYWN0aW9uIGJhci4KKyAgICAgKgorICAgICAqIDxwPlRhYnMgbWFuYWdlIHRoZSBoaWRpbmcgYW5kIHNob3dpbmcgb2Yge0BsaW5rIEZyYWdtZW50fXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBUYWIgeworICAgICAgICAvKioKKyAgICAgICAgICogQW4gaW52YWxpZCBwb3NpdGlvbiBmb3IgYSB0YWIuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgI2dldFBvc2l0aW9uKCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUE9TSVRJT04gPSAtMTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoaXMgdGFiIGluIHRoZSBhY3Rpb24gYmFyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIEN1cnJlbnQgcG9zaXRpb24sIG9yIHtAbGluayAjSU5WQUxJRF9QT1NJVElPTn0gaWYgdGhpcyB0YWIgaXMgbm90IGN1cnJlbnRseSBpbgorICAgICAgICAgKiAgICAgICAgIHRoZSBhY3Rpb24gYmFyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRQb3NpdGlvbigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIGljb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGFiLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSB0YWIncyBpY29uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgRHJhd2FibGUgZ2V0SWNvbigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIHRleHQgb2YgdGhpcyB0YWIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIHRhYidzIHRleHQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBDaGFyU2VxdWVuY2UgZ2V0VGV4dCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIGljb24gZGlzcGxheWVkIG9uIHRoaXMgdGFiLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaWNvbiBUaGUgZHJhd2FibGUgdG8gdXNlIGFzIGFuIGljb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEljb24oRHJhd2FibGUgaWNvbik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgdGV4dCBkaXNwbGF5ZWQgb24gdGhpcyB0YWIuIFRleHQgbWF5IGJlIHRydW5jYXRlZCBpZiB0aGVyZSBpcyBub3QKKyAgICAgICAgICogcm9vbSB0byBkaXNwbGF5IHRoZSBlbnRpcmUgc3RyaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0byBkaXNwbGF5CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGEgY3VzdG9tIHZpZXcgdG8gYmUgdXNlZCBmb3IgdGhpcyB0YWIuIFRoaXMgb3ZlcnJpZGVzIHZhbHVlcyBzZXQgYnkKKyAgICAgICAgICoge0BsaW5rICNzZXRUZXh0KENoYXJTZXF1ZW5jZSl9IGFuZCB7QGxpbmsgI3NldEljb24oRHJhd2FibGUpfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZpZXcgQ3VzdG9tIHZpZXcgdG8gYmUgdXNlZCBhcyBhIHRhYi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEN1c3RvbVZpZXcoVmlldyB2aWV3KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IHNldCBjdXN0b20gdmlldyBmb3IgdGhpcyB0YWIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIGN1c3RvbSB2aWV3IHNldCBieSB7QGxpbmsgI3NldEN1c3RvbVZpZXcoVmlldyl9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IFZpZXcgZ2V0Q3VzdG9tVmlldygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHaXZlIHRoaXMgVGFiIGFuIGFyYml0cmFyeSBvYmplY3QgdG8gaG9sZCBmb3IgbGF0ZXIgdXNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb2JqIE9iamVjdCB0byBzdG9yZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGFnKE9iamVjdCBvYmopOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIFRoaXMgVGFiJ3MgdGFnIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0VGFnKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUge0BsaW5rIFRhYkxpc3RlbmVyfSB0aGF0IHdpbGwgaGFuZGxlIHN3aXRjaGluZyB0byBhbmQgZnJvbSB0aGlzIHRhYi4KKyAgICAgICAgICogQWxsIHRhYnMgbXVzdCBoYXZlIGEgVGFiTGlzdGVuZXIgc2V0IGJlZm9yZSBiZWluZyBhZGRlZCB0byB0aGUgQWN0aW9uQmFyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbGlzdGVuZXIgTGlzdGVuZXIgdG8gaGFuZGxlIHRhYiBzZWxlY3Rpb24gZXZlbnRzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUYWJMaXN0ZW5lcihUYWJMaXN0ZW5lciBsaXN0ZW5lcik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNlbGVjdCB0aGlzIHRhYi4gT25seSB2YWxpZCBpZiB0aGUgdGFiIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBhY3Rpb24gYmFyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2VsZWN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgaW50ZXJmYWNlIGludm9rZWQgd2hlbiBhIHRhYiBpcyBmb2N1c2VkLCB1bmZvY3VzZWQsIGFkZGVkLCBvciByZW1vdmVkLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgVGFiTGlzdGVuZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSB0YWIgZW50ZXJzIHRoZSBzZWxlY3RlZCBzdGF0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRhYiBUaGUgdGFiIHRoYXQgd2FzIHNlbGVjdGVkCisgICAgICAgICAqIEBwYXJhbSBmdCBBIHtAbGluayBGcmFnbWVudFRyYW5zYWN0aW9ufSBmb3IgcXVldWluZyBmcmFnbWVudCBvcGVyYXRpb25zIHRvIGV4ZWN1dGUKKyAgICAgICAgICogICAgICAgIGR1cmluZyBhIHRhYiBzd2l0Y2guIFRoZSBwcmV2aW91cyB0YWIncyB1bnNlbGVjdCBhbmQgdGhpcyB0YWIncyBzZWxlY3Qgd2lsbCBiZQorICAgICAgICAgKiAgICAgICAgZXhlY3V0ZWQgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblRhYlNlbGVjdGVkKFRhYiB0YWIsIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIHRhYiBleGl0cyB0aGUgc2VsZWN0ZWQgc3RhdGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0YWIgVGhlIHRhYiB0aGF0IHdhcyB1bnNlbGVjdGVkCisgICAgICAgICAqIEBwYXJhbSBmdCBBIHtAbGluayBGcmFnbWVudFRyYW5zYWN0aW9ufSBmb3IgcXVldWluZyBmcmFnbWVudCBvcGVyYXRpb25zIHRvIGV4ZWN1dGUKKyAgICAgICAgICogICAgICAgIGR1cmluZyBhIHRhYiBzd2l0Y2guIFRoaXMgdGFiJ3MgdW5zZWxlY3QgYW5kIHRoZSBuZXdseSBzZWxlY3RlZCB0YWIncyBzZWxlY3QKKyAgICAgICAgICogICAgICAgIHdpbGwgYmUgZXhlY3V0ZWQgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblRhYlVuc2VsZWN0ZWQoVGFiIHRhYiwgRnJhZ21lbnRUcmFuc2FjdGlvbiBmdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQppbmRleCA3MmJmODI1Li5lZTQ5ZDk3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YQpAQCAtMTYsMTkgKzE2LDIyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hcHA7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWN0aW9uQmFySW1wbDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuUG9saWN5TWFuYWdlcjsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnRDYWxsYmFja3M7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DdXJzb3JMb2FkZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LklJbnRlbnRTZW5kZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CkBAIC0zOSw2ICs0Miw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKQEAgLTQ5LDcgKzUzLDkgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKQEAgLTU4LDE4ICs2NCwxOCBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKIAoraW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogCkBAIC0xMTAsNiArMTE2LDcgQEAKICAqIAogICogPHA+VG9waWNzIGNvdmVyZWQgaGVyZToKICAqIDxvbD4KKyAqIDxsaT48YSBocmVmPSIjRnJhZ21lbnRzIj5GcmFnbWVudHM8L2E+CiAgKiA8bGk+PGEgaHJlZj0iI0FjdGl2aXR5TGlmZWN5Y2xlIj5BY3Rpdml0eSBMaWZlY3ljbGU8L2E+CiAgKiA8bGk+PGEgaHJlZj0iI0NvbmZpZ3VyYXRpb25DaGFuZ2VzIj5Db25maWd1cmF0aW9uIENoYW5nZXM8L2E+CiAgKiA8bGk+PGEgaHJlZj0iI1N0YXJ0aW5nQWN0aXZpdGllcyI+U3RhcnRpbmcgQWN0aXZpdGllcyBhbmQgR2V0dGluZyBSZXN1bHRzPC9hPgpAQCAtMTE4LDYgKzEyNSwxNCBAQAogICogPGxpPjxhIGhyZWY9IiNQcm9jZXNzTGlmZWN5Y2xlIj5Qcm9jZXNzIExpZmVjeWNsZTwvYT4KICAqIDwvb2w+CiAgKiAKKyAqIDxhIG5hbWU9IkZyYWdtZW50cyI+PC9hPgorICogPGgzPkZyYWdtZW50czwvaDM+CisgKgorICogPHA+U3RhcnRpbmcgd2l0aCB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQn0sIEFjdGl2aXR5CisgKiBpbXBsZW1lbnRhdGlvbnMgY2FuIG1ha2UgdXNlIG9mIHRoZSB7QGxpbmsgRnJhZ21lbnR9IGNsYXNzIHRvIGJldHRlcgorICogbW9kdWxhcml6ZSB0aGVpciBjb2RlLCBidWlsZCBtb3JlIHNvcGhpc3RpY2F0ZWQgdXNlciBpbnRlcmZhY2VzIGZvciBsYXJnZXIKKyAqIHNjcmVlbnMsIGFuZCBoZWxwIHNjYWxlIHRoZWlyIGFwcGxpY2F0aW9uIGJldHdlZW4gc21hbGwgYW5kIGxhcmdlIHNjcmVlbnMuCisgKgogICogPGEgbmFtZT0iQWN0aXZpdHlMaWZlY3ljbGUiPjwvYT4KICAqIDxoMz5BY3Rpdml0eSBMaWZlY3ljbGU8L2gzPgogICoKQEAgLTU5Miw3ICs2MDcsNyBAQAogICogb3IgZmluaXNoZWQuCiAgKi8KIHB1YmxpYyBjbGFzcyBBY3Rpdml0eSBleHRlbmRzIENvbnRleHRUaGVtZVdyYXBwZXIKLSAgICAgICAgaW1wbGVtZW50cyBMYXlvdXRJbmZsYXRlci5GYWN0b3J5LAorICAgICAgICBpbXBsZW1lbnRzIExheW91dEluZmxhdGVyLkZhY3RvcnkyLAogICAgICAgICBXaW5kb3cuQ2FsbGJhY2ssIEtleUV2ZW50LkNhbGxiYWNrLAogICAgICAgICBPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIsIENvbXBvbmVudENhbGxiYWNrcyB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBY3Rpdml0eSI7CkBAIC02MDQsOSArNjE5LDggQEAKICAgICAvKiogU3RhcnQgb2YgdXNlci1kZWZpbmVkIGFjdGl2aXR5IHJlc3VsdHMuICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX0ZJUlNUX1VTRVIgICA9IDE7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIHNJbnN0YW5jZUNvdW50ID0gMDsKLQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSU5ET1dfSElFUkFSQ0hZX1RBRyA9ICJhbmRyb2lkOnZpZXdIaWVyYXJjaHlTdGF0ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUdNRU5UU19UQUcgPSAiYW5kcm9pZDpmcmFnbWVudHMiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9ESUFMT0dfSURTX0tFWSA9ICJhbmRyb2lkOnNhdmVkRGlhbG9nSWRzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfRElBTE9HU19UQUcgPSAiYW5kcm9pZDpzYXZlZERpYWxvZ3MiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9ESUFMT0dfS0VZX1BSRUZJWCA9ICJhbmRyb2lkOmRpYWxvZ18iOwpAQCAtNjI4LDE4ICs2NDIsMjggQEAKICAgICBwcml2YXRlIENvbXBvbmVudE5hbWUgbUNvbXBvbmVudDsKICAgICAvKnBhY2thZ2UqLyBBY3Rpdml0eUluZm8gbUFjdGl2aXR5SW5mbzsKICAgICAvKnBhY2thZ2UqLyBBY3Rpdml0eVRocmVhZCBtTWFpblRocmVhZDsKLSAgICAvKnBhY2thZ2UqLyBPYmplY3QgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2U7Ci0gICAgLypwYWNrYWdlKi8gSGFzaE1hcDxTdHJpbmcsT2JqZWN0PiBtTGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlczsKICAgICBBY3Rpdml0eSBtUGFyZW50OwogICAgIGJvb2xlYW4gbUNhbGxlZDsKKyAgICBib29sZWFuIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcjsKKyAgICBib29sZWFuIG1TdGFydGVkOwogICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzdW1lZDsKICAgICBwcml2YXRlIGJvb2xlYW4gbVN0b3BwZWQ7CiAgICAgYm9vbGVhbiBtRmluaXNoZWQ7CiAgICAgYm9vbGVhbiBtU3RhcnRlZEFjdGl2aXR5OworICAgIC8qKiB0cnVlIGlmIHRoZSBhY3Rpdml0eSBpcyBiZWluZyBkZXN0cm95ZWQgaW4gb3JkZXIgdG8gcmVjcmVhdGUgaXQgd2l0aCBhIG5ldyBjb25maWd1cmF0aW9uICovCisgICAgLypwYWNrYWdlKi8gYm9vbGVhbiBtQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IGZhbHNlOwogICAgIC8qcGFja2FnZSovIGludCBtQ29uZmlnQ2hhbmdlRmxhZ3M7CiAgICAgLypwYWNrYWdlKi8gQ29uZmlndXJhdGlvbiBtQ3VycmVudENvbmZpZzsKICAgICBwcml2YXRlIFNlYXJjaE1hbmFnZXIgbVNlYXJjaE1hbmFnZXI7CiAKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyB7CisgICAgICAgIE9iamVjdCBhY3Rpdml0eTsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gY2hpbGRyZW47CisgICAgICAgIEFycmF5TGlzdDxGcmFnbWVudD4gZnJhZ21lbnRzOworICAgICAgICBTcGFyc2VBcnJheTxMb2FkZXJNYW5hZ2VySW1wbD4gbG9hZGVyczsKKyAgICB9CisgICAgLyogcGFja2FnZSAqLyBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlczsKKyAgICAKICAgICBwcml2YXRlIFdpbmRvdyBtV2luZG93OwogCiAgICAgcHJpdmF0ZSBXaW5kb3dNYW5hZ2VyIG1XaW5kb3dNYW5hZ2VyOwpAQCAtNjQ3LDEwICs2NzEsMTYgQEAKICAgICAvKnBhY2thZ2UqLyBib29sZWFuIG1XaW5kb3dBZGRlZCA9IGZhbHNlOwogICAgIC8qcGFja2FnZSovIGJvb2xlYW4gbVZpc2libGVGcm9tU2VydmVyID0gZmFsc2U7CiAgICAgLypwYWNrYWdlKi8gYm9vbGVhbiBtVmlzaWJsZUZyb21DbGllbnQgPSB0cnVlOworICAgIC8qcGFja2FnZSovIEFjdGlvbkJhckltcGwgbUFjdGlvbkJhciA9IG51bGw7CiAKICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGU7CiAgICAgcHJpdmF0ZSBpbnQgbVRpdGxlQ29sb3IgPSAwOwogCisgICAgZmluYWwgRnJhZ21lbnRNYW5hZ2VySW1wbCBtRnJhZ21lbnRzID0gbmV3IEZyYWdtZW50TWFuYWdlckltcGwoKTsKKyAgICAKKyAgICBTcGFyc2VBcnJheTxMb2FkZXJNYW5hZ2VySW1wbD4gbUFsbExvYWRlck1hbmFnZXJzOworICAgIExvYWRlck1hbmFnZXJJbXBsIG1Mb2FkZXJNYW5hZ2VyOworICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE1hbmFnZWRDdXJzb3IgewogICAgICAgICBNYW5hZ2VkQ3Vyc29yKEN1cnNvciBjdXJzb3IpIHsKICAgICAgICAgICAgIG1DdXJzb3IgPSBjdXJzb3I7CkBAIC02NzcsMjQgKzcwNyw3IEBACiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBGT0NVU0VEX1NUQVRFX1NFVCA9IHtjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuc3RhdGVfZm9jdXNlZH07CiAKICAgICBwcml2YXRlIFRocmVhZCBtVWlUaHJlYWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKLQotICAgIC8vIFVzZWQgZm9yIGRlYnVnIG9ubHkKLSAgICAvKgotICAgIHB1YmxpYyBBY3Rpdml0eSgpIHsKLSAgICAgICAgKytzSW5zdGFuY2VDb3VudDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgICAgICAtLXNJbnN0YW5jZUNvdW50OwotICAgIH0KLSAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBsb25nIGdldEluc3RhbmNlQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBzSW5zdGFuY2VDb3VudDsKLSAgICB9CisgICAgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CiAKICAgICAvKiogUmV0dXJuIHRoZSBpbnRlbnQgdGhhdCBzdGFydGVkIHRoaXMgYWN0aXZpdHkuICovCiAgICAgcHVibGljIEludGVudCBnZXRJbnRlbnQoKSB7CkBAIC03NDgsNiArNzYxLDMwIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBMb2FkZXJNYW5hZ2VyIGZvciB0aGlzIGZyYWdtZW50LCBjcmVhdGluZyBpdCBpZiBuZWVkZWQuCisgICAgICovCisgICAgcHVibGljIExvYWRlck1hbmFnZXIgZ2V0TG9hZGVyTWFuYWdlcigpIHsKKyAgICAgICAgaWYgKG1Mb2FkZXJNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTG9hZGVyTWFuYWdlcjsKKyAgICAgICAgfQorICAgICAgICBtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIgPSB0cnVlOworICAgICAgICBtTG9hZGVyTWFuYWdlciA9IGdldExvYWRlck1hbmFnZXIoLTEsIG1TdGFydGVkLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1Mb2FkZXJNYW5hZ2VyOworICAgIH0KKyAgICAKKyAgICBMb2FkZXJNYW5hZ2VySW1wbCBnZXRMb2FkZXJNYW5hZ2VyKGludCBpbmRleCwgYm9vbGVhbiBzdGFydGVkLCBib29sZWFuIGNyZWF0ZSkgeworICAgICAgICBpZiAobUFsbExvYWRlck1hbmFnZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1BbGxMb2FkZXJNYW5hZ2VycyA9IG5ldyBTcGFyc2VBcnJheTxMb2FkZXJNYW5hZ2VySW1wbD4oKTsKKyAgICAgICAgfQorICAgICAgICBMb2FkZXJNYW5hZ2VySW1wbCBsbSA9IG1BbGxMb2FkZXJNYW5hZ2Vycy5nZXQoaW5kZXgpOworICAgICAgICBpZiAobG0gPT0gbnVsbCAmJiBjcmVhdGUpIHsKKyAgICAgICAgICAgIGxtID0gbmV3IExvYWRlck1hbmFnZXJJbXBsKHN0YXJ0ZWQpOworICAgICAgICAgICAgbUFsbExvYWRlck1hbmFnZXJzLnB1dChpbmRleCwgbG0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsbTsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogQ2FsbHMge0BsaW5rIGFuZHJvaWQudmlldy5XaW5kb3cjZ2V0Q3VycmVudEZvY3VzfSBvbiB0aGUKICAgICAgKiBXaW5kb3cgb2YgdGhpcyBBY3Rpdml0eSB0byByZXR1cm4gdGhlIGN1cnJlbnRseSBmb2N1c2VkIHZpZXcuCiAgICAgICogCkBAIC04MDEsNiArODM4LDE1IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBtVmlzaWJsZUZyb21DbGllbnQgPSAhbVdpbmRvdy5nZXRXaW5kb3dTdHlsZSgpLmdldEJvb2xlYW4oCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93X3dpbmRvd05vRGlzcGxheSwgZmFsc2UpOworICAgICAgICBpZiAobUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BbGxMb2FkZXJNYW5hZ2VycyA9IG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5sb2FkZXJzOworICAgICAgICB9CisgICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgUGFyY2VsYWJsZSBwID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldFBhcmNlbGFibGUoRlJBR01FTlRTX1RBRyk7CisgICAgICAgICAgICBtRnJhZ21lbnRzLnJlc3RvcmVBbGxTdGF0ZShwLCBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICA/IG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5mcmFnbWVudHMgOiBudWxsKTsKKyAgICAgICAgfQorICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoQ3JlYXRlKCk7CiAgICAgICAgIG1DYWxsZWQgPSB0cnVlOwogICAgIH0KIApAQCAtOTMzLDYgKzk3OSwxMyBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIG9uU3RhcnQoKSB7CiAgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9hZGVyTWFuYWdlci5kb1N0YXJ0KCk7CisgICAgICAgIH0gZWxzZSBpZiAoIW1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcikgeworICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBnZXRMb2FkZXJNYW5hZ2VyKC0xLCBtU3RhcnRlZCwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlciA9IHRydWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDg1LDYgKzExMzgsMTAgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgewogICAgICAgICBvdXRTdGF0ZS5wdXRCdW5kbGUoV0lORE9XX0hJRVJBUkNIWV9UQUcsIG1XaW5kb3cuc2F2ZUhpZXJhcmNoeVN0YXRlKCkpOworICAgICAgICBQYXJjZWxhYmxlIHAgPSBtRnJhZ21lbnRzLnNhdmVBbGxTdGF0ZSgpOworICAgICAgICBpZiAocCAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRQYXJjZWxhYmxlKEZSQUdNRU5UU19UQUcsIHApOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNDA4LDcgKzE0NjUsOCBAQAogICAgICAqIHtAbGluayAjb25SZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2UoKX0uCiAgICAgICovCiAgICAgcHVibGljIE9iamVjdCBnZXRMYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2U7CisgICAgICAgIHJldHVybiBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgIT0gbnVsbAorICAgICAgICAgICAgICAgID8gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLmFjdGl2aXR5IDogbnVsbDsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xNDIwLDYgKzE0NzgsMTEgQEAKICAgICAgKiB7QGxpbmsgI2dldExhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UoKX0gaW4gdGhlIG5ldyBhY3Rpdml0eQogICAgICAqIGluc3RhbmNlLgogICAgICAqIAorICAgICAqIDxlbT5JZiB5b3UgYXJlIHRhcmdldGluZyB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQn0KKyAgICAgKiBvciBsYXRlciwgY29uc2lkZXIgaW5zdGVhZCB1c2luZyBhIHtAbGluayBGcmFnbWVudH0gd2l0aAorICAgICAqIHtAbGluayBGcmFnbWVudCNzZXRSZXRhaW5JbnN0YW5jZShib29sZWFuKQorICAgICAqIEZyYWdtZW50LnNldFJldGFpbkluc3RhbmNlKGJvb2xlYW59LjwvZW0+CisgICAgICoKICAgICAgKiA8cD5UaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwdXJlbHkgYXMgYW4gb3B0aW1pemF0aW9uLCBhbmQgeW91IG11c3QKICAgICAgKiBub3QgcmVseSBvbiBpdCBiZWluZyBjYWxsZWQuICBXaGVuIGl0IGlzIGNhbGxlZCwgYSBudW1iZXIgb2YgZ3VhcmFudGVlcwogICAgICAqIHdpbGwgYmUgbWFkZSB0byBoZWxwIG9wdGltaXplIGNvbmZpZ3VyYXRpb24gc3dpdGNoaW5nOgpAQCAtMTQ3NSw4ICsxNTM4LDkgQEAKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG9iamVjdCBwcmV2aW91c2x5IHJldHVybmVkIGJ5CiAgICAgICoge0BsaW5rICNvblJldGFpbk5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpfQogICAgICAqLwotICAgIEhhc2hNYXA8U3RyaW5nLE9iamVjdD4gZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpIHsKLSAgICAgICAgcmV0dXJuIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzOworICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGdldExhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKSB7CisgICAgICAgIHJldHVybiBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgIT0gbnVsbAorICAgICAgICAgICAgICAgID8gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLmNoaWxkcmVuIDogbnVsbDsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xNDkwLDE3ICsxNTU0LDg4IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KICAgICAKKyAgICBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzIHJldGFpbk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMoKSB7CisgICAgICAgIE9iamVjdCBhY3Rpdml0eSA9IG9uUmV0YWluTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCk7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGNoaWxkcmVuID0gb25SZXRhaW5Ob25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKTsKKyAgICAgICAgQXJyYXlMaXN0PEZyYWdtZW50PiBmcmFnbWVudHMgPSBtRnJhZ21lbnRzLnJldGFpbk5vbkNvbmZpZygpOworICAgICAgICBib29sZWFuIHJldGFpbkxvYWRlcnMgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1BbGxMb2FkZXJNYW5hZ2VycyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBwcnVuZSBvdXQgYW55IGxvYWRlciBtYW5hZ2VycyB0aGF0IHdlcmUgYWxyZWFkeSBzdG9wcGVkIGFuZCBzbworICAgICAgICAgICAgLy8gaGF2ZSBub3RoaW5nIHVzZWZ1bCB0byByZXRhaW4uCisgICAgICAgICAgICBmb3IgKGludCBpPW1BbGxMb2FkZXJNYW5hZ2Vycy5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgTG9hZGVyTWFuYWdlckltcGwgbG0gPSBtQWxsTG9hZGVyTWFuYWdlcnMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAobG0ubVJldGFpbmluZykgeworICAgICAgICAgICAgICAgICAgICByZXRhaW5Mb2FkZXJzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsbS5kb0Rlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICAgICAgbUFsbExvYWRlck1hbmFnZXJzLnJlbW92ZUF0KGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYWN0aXZpdHkgPT0gbnVsbCAmJiBjaGlsZHJlbiA9PSBudWxsICYmIGZyYWdtZW50cyA9PSBudWxsICYmICFyZXRhaW5Mb2FkZXJzKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBuY2kgPSBuZXcgTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcygpOworICAgICAgICBuY2kuYWN0aXZpdHkgPSBhY3Rpdml0eTsKKyAgICAgICAgbmNpLmNoaWxkcmVuID0gY2hpbGRyZW47CisgICAgICAgIG5jaS5mcmFnbWVudHMgPSBmcmFnbWVudHM7CisgICAgICAgIG5jaS5sb2FkZXJzID0gbUFsbExvYWRlck1hbmFnZXJzOworICAgICAgICByZXR1cm4gbmNpOworICAgIH0KKyAgICAKICAgICBwdWJsaWMgdm9pZCBvbkxvd01lbW9yeSgpIHsKICAgICAgICAgbUNhbGxlZCA9IHRydWU7CiAgICAgfQogICAgIAogICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgRnJhZ21lbnRNYW5hZ2VyIGZvciBpbnRlcmFjdGluZyB3aXRoIGZyYWdtZW50cyBhc3NvY2lhdGVkCisgICAgICogd2l0aCB0aGlzIGFjdGl2aXR5LgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudE1hbmFnZXIgZ2V0RnJhZ21lbnRNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBhIHNlcmllcyBvZiBlZGl0IG9wZXJhdGlvbnMgb24gdGhlIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGlzIGFjdGl2aXR5LgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldEZyYWdtZW50TWFuYWdlcn0uCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBvcGVuRnJhZ21lbnRUcmFuc2FjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudHMub3BlblRyYW5zYWN0aW9uKCk7CisgICAgfQorICAgIAorICAgIHZvaWQgaW52YWxpZGF0ZUZyYWdtZW50SW5kZXgoaW50IGluZGV4KSB7CisgICAgICAgIC8vTG9nLnYoVEFHLCAiaW52YWxpZGF0ZUZyYWdtZW50SW5kZXg6IGluZGV4PSIgKyBpbmRleCk7CisgICAgICAgIGlmIChtQWxsTG9hZGVyTWFuYWdlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgTG9hZGVyTWFuYWdlckltcGwgbG0gPSBtQWxsTG9hZGVyTWFuYWdlcnMuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgIGlmIChsbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG0uZG9EZXN0cm95KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQWxsTG9hZGVyTWFuYWdlcnMucmVtb3ZlKGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBhIEZyYWdtZW50IGlzIGJlaW5nIGF0dGFjaGVkIHRvIHRoaXMgYWN0aXZpdHksIGltbWVkaWF0ZWx5CisgICAgICogYWZ0ZXIgdGhlIGNhbGwgdG8gaXRzIHtAbGluayBGcmFnbWVudCNvbkF0dGFjaCBGcmFnbWVudC5vbkF0dGFjaCgpfQorICAgICAqIG1ldGhvZCBhbmQgYmVmb3JlIHtAbGluayBGcmFnbWVudCNvbkNyZWF0ZSBGcmFnbWVudC5vbkNyZWF0ZSgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaEZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50KSB7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIFdyYXBwZXIgYXJvdW5kCiAgICAgICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNxdWVyeShhbmRyb2lkLm5ldC5VcmkgLCBTdHJpbmdbXSwgU3RyaW5nLCBTdHJpbmdbXSwgU3RyaW5nKX0KICAgICAgKiB0aGF0IGdpdmVzIHRoZSByZXN1bHRpbmcge0BsaW5rIEN1cnNvcn0gdG8gY2FsbAogICAgICAqIHtAbGluayAjc3RhcnRNYW5hZ2luZ0N1cnNvcn0gc28gdGhhdCB0aGUgYWN0aXZpdHkgd2lsbCBtYW5hZ2UgaXRzCiAgICAgICogbGlmZWN5Y2xlIGZvciB5b3UuCiAgICAgICogCisgICAgICogPGVtPklmIHlvdSBhcmUgdGFyZ2V0aW5nIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjSE9ORVlDT01CfQorICAgICAqIG9yIGxhdGVyLCBjb25zaWRlciBpbnN0ZWFkIHVzaW5nIHtAbGluayBMb2FkZXJNYW5hZ2VyfSBpbnN0ZWFkLCBhdmFpbGFibGUKKyAgICAgKiB2aWEge0BsaW5rICNnZXRMb2FkZXJNYW5hZ2VyKCl9LjwvZW0+CisgICAgICoKICAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGNvbnRlbnQgcHJvdmlkZXIgdG8gcXVlcnkuCiAgICAgICogQHBhcmFtIHByb2plY3Rpb24gTGlzdCBvZiBjb2x1bW5zIHRvIHJldHVybi4KICAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIFNRTCBXSEVSRSBjbGF1c2UuCkBAIC0xNTExLDEyICsxNjQ2LDEyIEBACiAgICAgICogQHNlZSBDb250ZW50UmVzb2x2ZXIjcXVlcnkoYW5kcm9pZC5uZXQuVXJpICwgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nW10sIFN0cmluZykKICAgICAgKiBAc2VlICNzdGFydE1hbmFnaW5nQ3Vyc29yCiAgICAgICogQGhpZGUKKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgQ3Vyc29yTG9hZGVyfSBpbnN0ZWFkLgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBDdXJzb3IgbWFuYWdlZFF1ZXJ5KFVyaSB1cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcHJvamVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb3J0T3JkZXIpCi0gICAgeworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGZpbmFsIEN1cnNvciBtYW5hZ2VkUXVlcnkoVXJpIHVyaSwgU3RyaW5nW10gcHJvamVjdGlvbiwgU3RyaW5nIHNlbGVjdGlvbiwKKyAgICAgICAgICAgIFN0cmluZyBzb3J0T3JkZXIpIHsKICAgICAgICAgQ3Vyc29yIGMgPSBnZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSh1cmksIHByb2plY3Rpb24sIHNlbGVjdGlvbiwgbnVsbCwgc29ydE9yZGVyKTsKICAgICAgICAgaWYgKGMgIT0gbnVsbCkgewogICAgICAgICAgICAgc3RhcnRNYW5hZ2luZ0N1cnNvcihjKTsKQEAgLTE1MzEsNiArMTY2NiwxMCBAQAogICAgICAqIHtAbGluayAjc3RhcnRNYW5hZ2luZ0N1cnNvcn0gc28gdGhhdCB0aGUgYWN0aXZpdHkgd2lsbCBtYW5hZ2UgaXRzCiAgICAgICogbGlmZWN5Y2xlIGZvciB5b3UuCiAgICAgICogCisgICAgICogPGVtPklmIHlvdSBhcmUgdGFyZ2V0aW5nIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjSE9ORVlDT01CfQorICAgICAqIG9yIGxhdGVyLCBjb25zaWRlciBpbnN0ZWFkIHVzaW5nIHtAbGluayBMb2FkZXJNYW5hZ2VyfSBpbnN0ZWFkLCBhdmFpbGFibGUKKyAgICAgKiB2aWEge0BsaW5rICNnZXRMb2FkZXJNYW5hZ2VyKCl9LjwvZW0+CisgICAgICoKICAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGNvbnRlbnQgcHJvdmlkZXIgdG8gcXVlcnkuCiAgICAgICogQHBhcmFtIHByb2plY3Rpb24gTGlzdCBvZiBjb2x1bW5zIHRvIHJldHVybi4KICAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIFNRTCBXSEVSRSBjbGF1c2UuCkBAIC0xNTQxLDEzICsxNjgwLDEyIEBACiAgICAgICogCiAgICAgICogQHNlZSBDb250ZW50UmVzb2x2ZXIjcXVlcnkoYW5kcm9pZC5uZXQuVXJpICwgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nW10sIFN0cmluZykKICAgICAgKiBAc2VlICNzdGFydE1hbmFnaW5nQ3Vyc29yCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEN1cnNvckxvYWRlcn0gaW5zdGVhZC4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgQ3Vyc29yIG1hbmFnZWRRdWVyeShVcmkgdXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHByb2plY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb3J0T3JkZXIpCi0gICAgeworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGZpbmFsIEN1cnNvciBtYW5hZ2VkUXVlcnkoVXJpIHVyaSwgU3RyaW5nW10gcHJvamVjdGlvbiwgU3RyaW5nIHNlbGVjdGlvbiwKKyAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIpIHsKICAgICAgICAgQ3Vyc29yIGMgPSBnZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSh1cmksIHByb2plY3Rpb24sIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgc29ydE9yZGVyKTsKICAgICAgICAgaWYgKGMgIT0gbnVsbCkgewogICAgICAgICAgICAgc3RhcnRNYW5hZ2luZ0N1cnNvcihjKTsKQEAgLTE1NTYsNDAgKzE2OTQsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyYXBwZXIgYXJvdW5kIHtAbGluayBDdXJzb3IjY29tbWl0VXBkYXRlcygpfSB0aGF0IHRha2VzIGNhcmUgb2Ygbm90aW5nCi0gICAgICogdGhhdCB0aGUgQ3Vyc29yIG5lZWRzIHRvIGJlIHJlcXVlcmllZC4gIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBpbgotICAgICAqIHtAbGluayAjb25QYXVzZX0gb3Ige0BsaW5rICNvblN0b3B9IHRvIGhhdmUgdGhlIHN5c3RlbSBjYWxsCi0gICAgICoge0BsaW5rIEN1cnNvciNyZXF1ZXJ5fSBmb3IgeW91IGlmIHRoZSBhY3Rpdml0eSBpcyBsYXRlciByZXN1bWVkLiAgVGhpcwotICAgICAqIGFsbG93cyB5b3UgdG8gYXZvaWQgZGV0ZXJtaW5nIHdoZW4gdG8gZG8gdGhlIHJlcXVlcnkgeW91cnNlbGYgKHdoaWNoIGlzCi0gICAgICogcmVxdWlyZWQgZm9yIHRoZSBDdXJzb3IgdG8gc2VlIGFueSBkYXRhIGNoYW5nZXMgdGhhdCB3ZXJlIGNvbW1pdHRlZCB3aXRoCi0gICAgICogaXQpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjIFRoZSBDdXJzb3Igd2hvc2UgY2hhbmdlcyBhcmUgdG8gYmUgY29tbWl0dGVkLgotICAgICAqIAotICAgICAqIEBzZWUgI21hbmFnZWRRdWVyeShhbmRyb2lkLm5ldC5VcmkgLCBTdHJpbmdbXSwgU3RyaW5nLCBTdHJpbmdbXSwgU3RyaW5nKQotICAgICAqIEBzZWUgI3N0YXJ0TWFuYWdpbmdDdXJzb3IKLSAgICAgKiBAc2VlIEN1cnNvciNjb21taXRVcGRhdGVzKCkKLSAgICAgKiBAc2VlIEN1cnNvciNyZXF1ZXJ5Ci0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyB2b2lkIG1hbmFnZWRDb21taXRVcGRhdGVzKEN1cnNvciBjKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobU1hbmFnZWRDdXJzb3JzKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1NYW5hZ2VkQ3Vyc29ycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTWFuYWdlZEN1cnNvciBtYyA9IG1NYW5hZ2VkQ3Vyc29ycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1jLm1DdXJzb3IgPT0gYykgewotICAgICAgICAgICAgICAgICAgICBjLmNvbW1pdFVwZGF0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgbWMubVVwZGF0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIkN1cnNvciAiICsgYyArICIgaXMgbm90IGN1cnJlbnRseSBtYW5hZ2VkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgdGhlIGFjdGl2aXR5IHRvIHRha2UgY2FyZSBvZiBtYW5hZ2luZyB0aGUgZ2l2ZW4KICAgICAgKiB7QGxpbmsgQ3Vyc29yfSdzIGxpZmVjeWNsZSBmb3IgeW91IGJhc2VkIG9uIHRoZSBhY3Rpdml0eSdzIGxpZmVjeWNsZS4KICAgICAgKiBUaGF0IGlzLCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBzdG9wcGVkIGl0IHdpbGwgYXV0b21hdGljYWxseSBjYWxsCkBAIC0xNTk3LDExICsxNzAxLDE4IEBACiAgICAgICogaXQgd2lsbCBjYWxsIHtAbGluayBDdXJzb3IjcmVxdWVyeX0gZm9yIHlvdS4gIFdoZW4gdGhlIGFjdGl2aXR5IGlzCiAgICAgICogZGVzdHJveWVkLCBhbGwgbWFuYWdlZCBDdXJzb3JzIHdpbGwgYmUgY2xvc2VkIGF1dG9tYXRpY2FsbHkuCiAgICAgICogCisgICAgICogPGVtPklmIHlvdSBhcmUgdGFyZ2V0aW5nIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjSE9ORVlDT01CfQorICAgICAqIG9yIGxhdGVyLCBjb25zaWRlciBpbnN0ZWFkIHVzaW5nIHtAbGluayBMb2FkZXJNYW5hZ2VyfSBpbnN0ZWFkLCBhdmFpbGFibGUKKyAgICAgKiB2aWEge0BsaW5rICNnZXRMb2FkZXJNYW5hZ2VyKCl9LjwvZW0+CisgICAgICoKICAgICAgKiBAcGFyYW0gYyBUaGUgQ3Vyc29yIHRvIGJlIG1hbmFnZWQuCiAgICAgICogCiAgICAgICogQHNlZSAjbWFuYWdlZFF1ZXJ5KGFuZHJvaWQubmV0LlVyaSAsIFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmcpCiAgICAgICogQHNlZSAjc3RvcE1hbmFnaW5nQ3Vyc29yCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEN1cnNvckxvYWRlcn0gaW5zdGVhZC4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHN0YXJ0TWFuYWdpbmdDdXJzb3IoQ3Vyc29yIGMpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtTWFuYWdlZEN1cnNvcnMpIHsKICAgICAgICAgICAgIG1NYW5hZ2VkQ3Vyc29ycy5hZGQobmV3IE1hbmFnZWRDdXJzb3IoYykpOwpAQCAtMTYxNiw3ICsxNzI3LDEwIEBACiAgICAgICogQHBhcmFtIGMgVGhlIEN1cnNvciB0aGF0IHdhcyBiZWluZyBtYW5hZ2VkLgogICAgICAqIAogICAgICAqIEBzZWUgI3N0YXJ0TWFuYWdpbmdDdXJzb3IKKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgQ3Vyc29yTG9hZGVyfSBpbnN0ZWFkLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc3RvcE1hbmFnaW5nQ3Vyc29yKEN1cnNvciBjKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobU1hbmFnZWRDdXJzb3JzKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1NYW5hZ2VkQ3Vyc29ycy5zaXplKCk7CkBAIC0xNjcxLDcgKzE3ODUsNTQgQEAKICAgICBwdWJsaWMgVmlldyBmaW5kVmlld0J5SWQoaW50IGlkKSB7CiAgICAgICAgIHJldHVybiBnZXRXaW5kb3coKS5maW5kVmlld0J5SWQoaWQpOwogICAgIH0KLQorICAgIAorICAgIC8qKgorICAgICAqIFJldHJpZXZlIGEgcmVmZXJlbmNlIHRvIHRoaXMgYWN0aXZpdHkncyBBY3Rpb25CYXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBBY3Rpdml0eSdzIEFjdGlvbkJhciwgb3IgbnVsbCBpZiBpdCBkb2VzIG5vdCBoYXZlIG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uQmFyIGdldEFjdGlvbkJhcigpIHsKKyAgICAgICAgaW5pdEFjdGlvbkJhcigpOworICAgICAgICByZXR1cm4gbUFjdGlvbkJhcjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBBY3Rpb25CYXIsIGxvY2F0ZXMgdGhlIGluZmxhdGVkIEFjdGlvbkJhclZpZXcsCisgICAgICogaW5pdGlhbGl6ZXMgdGhlIEFjdGlvbkJhciB3aXRoIHRoZSB2aWV3LCBhbmQgc2V0cyBtQWN0aW9uQmFyLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0QWN0aW9uQmFyKCkgeworICAgICAgICBXaW5kb3cgd2luZG93ID0gZ2V0V2luZG93KCk7CisgICAgICAgIGlmIChpc0NoaWxkKCkgfHwgIXdpbmRvdy5oYXNGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX0FDVElPTl9CQVIpIHx8IG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtQWN0aW9uQmFyID0gbmV3IEFjdGlvbkJhckltcGwodGhpcyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEZpbmRzIGEgZnJhZ21lbnQgdGhhdCB3YXMgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gaWQgZWl0aGVyIHdoZW4gaW5mbGF0ZWQKKyAgICAgKiBmcm9tIFhNTCBvciBhcyB0aGUgY29udGFpbmVyIElEIHdoZW4gYWRkZWQgaW4gYSB0cmFuc2FjdGlvbi4gIFRoaXMgb25seQorICAgICAqIHJldHVybnMgZnJhZ21lbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBhZGRlZCB0byB0aGUgYWN0aXZpdHkncyBjb250ZW50LgorICAgICAqIEByZXR1cm4gVGhlIGZyYWdtZW50IGlmIGZvdW5kIG9yIG51bGwgb3RoZXJ3aXNlLgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldEZyYWdtZW50TWFuYWdlcn0uCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgRnJhZ21lbnQgZmluZEZyYWdtZW50QnlJZChpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudHMuZmluZEZyYWdtZW50QnlJZChpZCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEZpbmRzIGEgZnJhZ21lbnQgdGhhdCB3YXMgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gdGFnIGVpdGhlciB3aGVuIGluZmxhdGVkCisgICAgICogZnJvbSBYTUwgb3IgYXMgc3VwcGxpZWQgd2hlbiBhZGRlZCBpbiBhIHRyYW5zYWN0aW9uLiAgVGhpcyBvbmx5CisgICAgICogcmV0dXJucyBmcmFnbWVudHMgdGhhdCBhcmUgY3VycmVudGx5IGFkZGVkIHRvIHRoZSBhY3Rpdml0eSdzIGNvbnRlbnQuCisgICAgICogQHJldHVybiBUaGUgZnJhZ21lbnQgaWYgZm91bmQgb3IgbnVsbCBvdGhlcndpc2UuCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0RnJhZ21lbnRNYW5hZ2VyfS4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBGcmFnbWVudCBmaW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcgdGFnKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnRzLmZpbmRGcmFnbWVudEJ5VGFnKHRhZyk7CisgICAgfQorICAgIAogICAgIC8qKgogICAgICAqIFNldCB0aGUgYWN0aXZpdHkgY29udGVudCBmcm9tIGEgbGF5b3V0IHJlc291cmNlLiAgVGhlIHJlc291cmNlIHdpbGwgYmUKICAgICAgKiBpbmZsYXRlZCwgYWRkaW5nIGFsbCB0b3AtbGV2ZWwgdmlld3MgdG8gdGhlIGFjdGl2aXR5LgpAQCAtMTY4MCw2ICsxODQxLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VmlldyhpbnQgbGF5b3V0UmVzSUQpIHsKICAgICAgICAgZ2V0V2luZG93KCkuc2V0Q29udGVudFZpZXcobGF5b3V0UmVzSUQpOworICAgICAgICBpbml0QWN0aW9uQmFyKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjkxLDYgKzE4NTMsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRWaWV3KFZpZXcgdmlldykgewogICAgICAgICBnZXRXaW5kb3coKS5zZXRDb250ZW50Vmlldyh2aWV3KTsKKyAgICAgICAgaW5pdEFjdGlvbkJhcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTcwMyw2ICsxODY2LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VmlldyhWaWV3IHZpZXcsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zKSB7CiAgICAgICAgIGdldFdpbmRvdygpLnNldENvbnRlbnRWaWV3KHZpZXcsIHBhcmFtcyk7CisgICAgICAgIGluaXRBY3Rpb25CYXIoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE3MTQsNiArMTg3OCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQ29udGVudFZpZXcoVmlldyB2aWV3LCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHBhcmFtcykgewogICAgICAgICBnZXRXaW5kb3coKS5hZGRDb250ZW50Vmlldyh2aWV3LCBwYXJhbXMpOworICAgICAgICBpbml0QWN0aW9uQmFyKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xOTM3LDEyICsyMTAyLDY1IEBACiAgICAgfQogICAgIAogICAgIC8qKgorICAgICAqIEZsYWcgZm9yIHtAbGluayAjcG9wQmFja1N0YWNrKFN0cmluZywgaW50KX0KKyAgICAgKiBhbmQge0BsaW5rICNwb3BCYWNrU3RhY2soaW50LCBpbnQpfTogSWYgc2V0LCBhbmQgdGhlIG5hbWUgb3IgSUQgb2YKKyAgICAgKiBhIGJhY2sgc3RhY2sgZW50cnkgaGFzIGJlZW4gc3VwcGxpZWQsIHRoZW4gYWxsIG1hdGNoaW5nIGVudHJpZXMgd2lsbAorICAgICAqIGJlIGNvbnN1bWVkIHVudGlsIG9uZSB0aGF0IGRvZXNuJ3QgbWF0Y2ggaXMgZm91bmQgb3IgdGhlIGJvdHRvbSBvZgorICAgICAqIHRoZSBzdGFjayBpcyByZWFjaGVkLiAgT3RoZXJ3aXNlLCBhbGwgZW50cmllcyB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGF0IGVudHJ5CisgICAgICogd2lsbCBiZSByZW1vdmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSA9IDE8PDA7CisKKyAgICAvKioKKyAgICAgKiBQb3AgdGhlIHRvcCBzdGF0ZSBvZmYgdGhlIGJhY2sgc3RhY2suICBSZXR1cm5zIHRydWUgaWYgdGhlcmUgd2FzIG9uZQorICAgICAqIHRvIHBvcCwgZWxzZSBmYWxzZS4KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRGcmFnbWVudE1hbmFnZXJ9LgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGJvb2xlYW4gcG9wQmFja1N0YWNrKCkgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5wb3BCYWNrU3RhY2soKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3AgdGhlIGxhc3QgZnJhZ21lbnQgdHJhbnNpdGlvbiBmcm9tIHRoZSBsb2NhbCBhY3Rpdml0eSdzIGZyYWdtZW50CisgICAgICogYmFjayBzdGFjay4gIElmIHRoZXJlIGlzIG5vdGhpbmcgdG8gcG9wLCBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0gbmFtZSBJZiBub24tbnVsbCwgdGhpcyBpcyB0aGUgbmFtZSBvZiBhIHByZXZpb3VzIGJhY2sgc3RhdGUKKyAgICAgKiB0byBsb29rIGZvcjsgaWYgZm91bmQsIGFsbCBzdGF0ZXMgdXAgdG8gdGhhdCBzdGF0ZSB3aWxsIGJlIHBvcHBlZC4gIFRoZQorICAgICAqIHtAbGluayAjUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFfSBmbGFnIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgd2hldGhlcgorICAgICAqIHRoZSBuYW1lZCBzdGF0ZSBpdHNlbGYgaXMgcG9wcGVkLiBJZiBudWxsLCBvbmx5IHRoZSB0b3Agc3RhdGUgaXMgcG9wcGVkLgorICAgICAqIEBwYXJhbSBmbGFncyBFaXRoZXIgMCBvciB7QGxpbmsgI1BPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRX0uCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0RnJhZ21lbnRNYW5hZ2VyfS4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBib29sZWFuIHBvcEJhY2tTdGFjayhTdHJpbmcgbmFtZSwgaW50IGZsYWdzKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnRzLnBvcEJhY2tTdGFjayhuYW1lLCBmbGFncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wIGFsbCBiYWNrIHN0YWNrIHN0YXRlcyB1cCB0byB0aGUgb25lIHdpdGggdGhlIGdpdmVuIGlkZW50aWZpZXIuCisgICAgICogQHBhcmFtIGlkIElkZW50aWZpZXIgb2YgdGhlIHN0YXRlZCB0byBiZSBwb3BwZWQuIElmIG5vIGlkZW50aWZpZXIgZXhpc3RzLAorICAgICAqIGZhbHNlIGlzIHJldHVybmVkLgorICAgICAqIFRoZSBpZGVudGlmaWVyIGlzIHRoZSBudW1iZXIgcmV0dXJuZWQgYnkKKyAgICAgKiB7QGxpbmsgRnJhZ21lbnRUcmFuc2FjdGlvbiNjb21taXQoKSBGcmFnbWVudFRyYW5zYWN0aW9uLmNvbW1pdCgpfS4gIFRoZQorICAgICAqIHtAbGluayAjUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFfSBmbGFnIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgd2hldGhlcgorICAgICAqIHRoZSBuYW1lZCBzdGF0ZSBpdHNlbGYgaXMgcG9wcGVkLgorICAgICAqIEBwYXJhbSBmbGFncyBFaXRoZXIgMCBvciB7QGxpbmsgI1BPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRX0uCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0RnJhZ21lbnRNYW5hZ2VyfS4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBib29sZWFuIHBvcEJhY2tTdGFjayhpbnQgaWQsIGludCBmbGFncykgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5wb3BCYWNrU3RhY2soaWQsIGZsYWdzKTsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGhhcyBkZXRlY3RlZCB0aGUgdXNlcidzIHByZXNzIG9mIHRoZSBiYWNrCiAgICAgICoga2V5LiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IGZpbmlzaGVzIHRoZSBjdXJyZW50IGFjdGl2aXR5LAogICAgICAqIGJ1dCB5b3UgY2FuIG92ZXJyaWRlIHRoaXMgdG8gZG8gd2hhdGV2ZXIgeW91IHdhbnQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgb25CYWNrUHJlc3NlZCgpIHsKLSAgICAgICAgZmluaXNoKCk7CisgICAgICAgIGlmICghbUZyYWdtZW50cy5wb3BCYWNrU3RhY2soKSkgeworICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0yMTgwLDcgKzIzOTgsOSBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlUGFuZWxNZW51KGludCBmZWF0dXJlSWQsIE1lbnUgbWVudSkgewogICAgICAgICBpZiAoZmVhdHVyZUlkID09IFdpbmRvdy5GRUFUVVJFX09QVElPTlNfUEFORUwpIHsKLSAgICAgICAgICAgIHJldHVybiBvbkNyZWF0ZU9wdGlvbnNNZW51KG1lbnUpOworICAgICAgICAgICAgYm9vbGVhbiBzaG93ID0gb25DcmVhdGVPcHRpb25zTWVudShtZW51KTsKKyAgICAgICAgICAgIHNob3cgfD0gbUZyYWdtZW50cy5kaXNwYXRjaENyZWF0ZU9wdGlvbnNNZW51KG1lbnUsIGdldE1lbnVJbmZsYXRlcigpKTsKKyAgICAgICAgICAgIHJldHVybiBzaG93OwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0yMTk3LDYgKzI0MTcsNyBAQAogICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZVBhbmVsKGludCBmZWF0dXJlSWQsIFZpZXcgdmlldywgTWVudSBtZW51KSB7CiAgICAgICAgIGlmIChmZWF0dXJlSWQgPT0gV2luZG93LkZFQVRVUkVfT1BUSU9OU19QQU5FTCAmJiBtZW51ICE9IG51bGwpIHsKICAgICAgICAgICAgIGJvb2xlYW4gZ29mb3JpdCA9IG9uUHJlcGFyZU9wdGlvbnNNZW51KG1lbnUpOworICAgICAgICAgICAgZ29mb3JpdCB8PSBtRnJhZ21lbnRzLmRpc3BhdGNoUHJlcGFyZU9wdGlvbnNNZW51KG1lbnUpOwogICAgICAgICAgICAgcmV0dXJuIGdvZm9yaXQgJiYgbWVudS5oYXNWaXNpYmxlSXRlbXMoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTIyMjcsMTEgKzI0NDgsMTcgQEAKICAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IGNhbGwgdGhyb3VnaCB0byBzdXBlcmNsYXNzJ3MgaW1wbG1lZW50YXRpb24gb2YgZWFjaAogICAgICAgICAgICAgICAgIC8vIG9mIHRoZXNlIG1ldGhvZHMgYmVsb3cKICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KDUwMDAwLCAwLCBpdGVtLmdldFRpdGxlQ29uZGVuc2VkKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoaXRlbSk7CisgICAgICAgICAgICAgICAgaWYgKG9uT3B0aW9uc0l0ZW1TZWxlY3RlZChpdGVtKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1GcmFnbWVudHMuZGlzcGF0Y2hPcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgY2FzZSBXaW5kb3cuRkVBVFVSRV9DT05URVhUX01FTlU6CiAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudCg1MDAwMCwgMSwgaXRlbS5nZXRUaXRsZUNvbmRlbnNlZCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb25Db250ZXh0SXRlbVNlbGVjdGVkKGl0ZW0pOworICAgICAgICAgICAgICAgIGlmIChvbkNvbnRleHRJdGVtU2VsZWN0ZWQoaXRlbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtRnJhZ21lbnRzLmRpc3BhdGNoQ29udGV4dEl0ZW1TZWxlY3RlZChpdGVtKTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjI1MCw2ICsyNDc3LDcgQEAKICAgICBwdWJsaWMgdm9pZCBvblBhbmVsQ2xvc2VkKGludCBmZWF0dXJlSWQsIE1lbnUgbWVudSkgewogICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJZCkgewogICAgICAgICAgICAgY2FzZSBXaW5kb3cuRkVBVFVSRV9PUFRJT05TX1BBTkVMOgorICAgICAgICAgICAgICAgIG1GcmFnbWVudHMuZGlzcGF0Y2hPcHRpb25zTWVudUNsb3NlZChtZW51KTsKICAgICAgICAgICAgICAgICBvbk9wdGlvbnNNZW51Q2xvc2VkKG1lbnUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIApAQCAtMjI2MCw2ICsyNDg4LDE1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRGVjbGFyZSB0aGF0IHRoZSBvcHRpb25zIG1lbnUgaGFzIGNoYW5nZWQsIHNvIHNob3VsZCBiZSByZWNyZWF0ZWQuCisgICAgICogVGhlIHtAbGluayAjb25DcmVhdGVPcHRpb25zTWVudShNZW51KX0gbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHRoZSBuZXh0CisgICAgICogdGltZSBpdCBuZWVkcyB0byBiZSBkaXNwbGF5ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZU9wdGlvbnNNZW51KCkgeworICAgICAgICBtV2luZG93LmludmFsaWRhdGVQYW5lbE1lbnUoV2luZG93LkZFQVRVUkVfT1BUSU9OU19QQU5FTCk7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIEluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mIHRoZSBBY3Rpdml0eSdzIHN0YW5kYXJkIG9wdGlvbnMgbWVudS4gIFlvdQogICAgICAqIHNob3VsZCBwbGFjZSB5b3VyIG1lbnUgaXRlbXMgaW4gdG8gPHZhcj5tZW51PC92YXI+LgogICAgICAqIApAQCAtMjQ4Miw2ICsyNzE5LDkgQEAKICAgICAgKiBieSB0aGUgYWN0aXZpdHkuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscyB0aHJvdWdoIHRvCiAgICAgICoge0BsaW5rICNvbkNyZWF0ZURpYWxvZyhpbnQpfSBmb3IgY29tcGF0aWJpbGl0eS4KICAgICAgKgorICAgICAqIDxlbT5JZiB5b3UgYXJlIHRhcmdldGluZyB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQn0KKyAgICAgKiBvciBsYXRlciwgY29uc2lkZXIgaW5zdGVhZCB1c2luZyBhIHtAbGluayBEaWFsb2dGcmFnbWVudH0gaW5zdGVhZC48L2VtPgorICAgICAqCiAgICAgICogPHA+SWYgeW91IHVzZSB7QGxpbmsgI3Nob3dEaWFsb2coaW50KX0sIHRoZSBhY3Rpdml0eSB3aWxsIGNhbGwgdGhyb3VnaCB0bwogICAgICAqIHRoaXMgbWV0aG9kIHRoZSBmaXJzdCB0aW1lLCBhbmQgaGFuZyBvbnRvIGl0IHRoZXJlYWZ0ZXIuICBBbnkgZGlhbG9nCiAgICAgICogdGhhdCBpcyBjcmVhdGVkIGJ5IHRoaXMgbWV0aG9kIHdpbGwgYXV0b21hdGljYWxseSBiZSBzYXZlZCBhbmQgcmVzdG9yZWQKQEAgLTI1NTQsNiArMjc5NCw5IEBACiAgICAgICogd2lsbCBiZSBtYWRlIHdpdGggdGhlIHNhbWUgaWQgdGhlIGZpcnN0IHRpbWUgdGhpcyBpcyBjYWxsZWQgZm9yIGEgZ2l2ZW4KICAgICAgKiBpZC4gIEZyb20gdGhlcmVhZnRlciwgdGhlIGRpYWxvZyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc2F2ZWQgYW5kIHJlc3RvcmVkLgogICAgICAqCisgICAgICogPGVtPklmIHlvdSBhcmUgdGFyZ2V0aW5nIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjSE9ORVlDT01CfQorICAgICAqIG9yIGxhdGVyLCBjb25zaWRlciBpbnN0ZWFkIHVzaW5nIGEge0BsaW5rIERpYWxvZ0ZyYWdtZW50fSBpbnN0ZWFkLjwvZW0+CisgICAgICoKICAgICAgKiA8cD5FYWNoIHRpbWUgYSBkaWFsb2cgaXMgc2hvd24sIHtAbGluayAjb25QcmVwYXJlRGlhbG9nKGludCwgRGlhbG9nLCBCdW5kbGUpfSB3aWxsCiAgICAgICogYmUgbWFkZSB0byBwcm92aWRlIGFuIG9wcG9ydHVuaXR5IHRvIGRvIGFueSB0aW1lbHkgcHJlcGFyYXRpb24uCiAgICAgICoKQEAgLTMxMDEsNiArMzM0NCwzNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSBGcmFnbWVudCBpbiB0aGlzIGFjdGl2aXR5IGNhbGxzIGl0cyAKKyAgICAgKiB7QGxpbmsgRnJhZ21lbnQjc3RhcnRBY3Rpdml0eX0gb3Ige0BsaW5rIEZyYWdtZW50I3N0YXJ0QWN0aXZpdHlGb3JSZXN1bHR9CisgICAgICogbWV0aG9kLgorICAgICAqIAorICAgICAqIDxwPlRoaXMgbWV0aG9kIHRocm93cyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb259CisgICAgICogaWYgdGhlcmUgd2FzIG5vIEFjdGl2aXR5IGZvdW5kIHRvIHJ1biB0aGUgZ2l2ZW4gSW50ZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgbWFraW5nIHRoZSBjYWxsLgorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGludGVudCB0byBzdGFydC4KKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvZGUgUmVwbHkgcmVxdWVzdCBjb2RlLiAgPCAwIGlmIHJlcGx5IGlzIG5vdCByZXF1ZXN0ZWQuIAorICAgICAqIAorICAgICAqIEB0aHJvd3MgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24KKyAgICAgKiAKKyAgICAgKiBAc2VlIEZyYWdtZW50I3N0YXJ0QWN0aXZpdHkgCisgICAgICogQHNlZSBGcmFnbWVudCNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0IAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIEludGVudCBpbnRlbnQsIAorICAgICAgICAgICAgaW50IHJlcXVlc3RDb2RlKSB7CisgICAgICAgIEluc3RydW1lbnRhdGlvbi5BY3Rpdml0eVJlc3VsdCBhciA9CisgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmV4ZWNTdGFydEFjdGl2aXR5KAorICAgICAgICAgICAgICAgIHRoaXMsIG1NYWluVGhyZWFkLmdldEFwcGxpY2F0aW9uVGhyZWFkKCksIG1Ub2tlbiwgZnJhZ21lbnQsCisgICAgICAgICAgICAgICAgaW50ZW50LCByZXF1ZXN0Q29kZSk7CisgICAgICAgIGlmIChhciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTWFpblRocmVhZC5zZW5kQWN0aXZpdHlSZXN1bHQoCisgICAgICAgICAgICAgICAgbVRva2VuLCBmcmFnbWVudC5tV2hvLCByZXF1ZXN0Q29kZSwKKyAgICAgICAgICAgICAgICBhci5nZXRSZXN1bHRDb2RlKCksIGFyLmdldFJlc3VsdERhdGEoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBMaWtlIHtAbGluayAjc3RhcnRBY3Rpdml0eUZyb21DaGlsZChBY3Rpdml0eSwgSW50ZW50LCBpbnQpfSwgYnV0CiAgICAgICogdGFraW5nIGEgSW50ZW50U2VuZGVyOyBzZWUKICAgICAgKiB7QGxpbmsgI3N0YXJ0SW50ZW50U2VuZGVyRm9yUmVzdWx0KEludGVudFNlbmRlciwgaW50LCBJbnRlbnQsIGludCwgaW50LCBpbnQpfQpAQCAtMzI1OSw2ICszNTMyLDE5IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhpcyBhY3Rpdml0eSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkZXN0cm95ZWQgaW4gb3JkZXIgdG8gYmUKKyAgICAgKiByZWNyZWF0ZWQgd2l0aCBhIG5ldyBjb25maWd1cmF0aW9uLiBUaGlzIGlzIG9mdGVuIHVzZWQgaW4KKyAgICAgKiB7QGxpbmsgI29uU3RvcH0gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHN0YXRlIG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAgb3Igd2lsbCBiZSBwYXNzZWQKKyAgICAgKiBvbiB0byB0aGUgbmV4dCBpbnN0YW5jZSBvZiB0aGUgYWN0aXZpdHkgdmlhIHtAbGluayAjb25SZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2UoKX0uCisgICAgICogCisgICAgICogQHJldHVybiBJZiB0aGUgYWN0aXZpdHkgaXMgYmVpbmcgdG9ybiBkb3duIGluIG9yZGVyIHRvIGJlIHJlY3JlYXRlZCB3aXRoIGEgbmV3IGNvbmZpZ3VyYXRpb24sCisgICAgICogcmV0dXJucyB0cnVlOyBlbHNlIHJldHVybnMgZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKCkgeworICAgICAgICByZXR1cm4gbUNoYW5naW5nQ29uZmlndXJhdGlvbnM7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2FsbCB0aGlzIHdoZW4geW91ciBhY3Rpdml0eSBpcyBkb25lIGFuZCBzaG91bGQgYmUgY2xvc2VkLiAgVGhlCiAgICAgICogQWN0aXZpdHlSZXN1bHQgaXMgcHJvcGFnYXRlZCBiYWNrIHRvIHdob2V2ZXIgbGF1bmNoZWQgeW91IHZpYQogICAgICAqIG9uQWN0aXZpdHlSZXN1bHQoKS4KQEAgLTMzNTksOCArMzY0NSw3IEBACiAgICAgICogQHNlZSAjY3JlYXRlUGVuZGluZ1Jlc3VsdAogICAgICAqIEBzZWUgI3NldFJlc3VsdChpbnQpCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgb25BY3Rpdml0eVJlc3VsdChpbnQgcmVxdWVzdENvZGUsIGludCByZXN1bHRDb2RlLAotICAgICAgICAgICAgSW50ZW50IGRhdGEpIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNzQ0LDkgKzQwMjksMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTdHViIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIuRmFjdG9yeSNvbkNyZWF0ZVZpZXd9IHVzZWQgd2hlbgotICAgICAqIGluZmxhdGluZyB3aXRoIHRoZSBMYXlvdXRJbmZsYXRlciByZXR1cm5lZCBieSB7QGxpbmsgI2dldFN5c3RlbVNlcnZpY2V9LiAgVGhpcwotICAgICAqIGltcGxlbWVudGF0aW9uIHNpbXBseSByZXR1cm5zIG51bGwgZm9yIGFsbCB2aWV3IG5hbWVzLgorICAgICAqIFN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mCisgICAgICoge0BsaW5rIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlci5GYWN0b3J5I29uQ3JlYXRlVmlld30gdXNlZCB3aGVuCisgICAgICogaW5mbGF0aW5nIHdpdGggdGhlIExheW91dEluZmxhdGVyIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3lzdGVtU2VydmljZX0uCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcgYW5kIGlzIGZvcgorICAgICAqIHByZS17QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQn0gYXBwcy4gIE5ld2VyIGFwcHMKKyAgICAgKiBzaG91bGQgdXNlIHtAbGluayAjb25DcmVhdGVWaWV3KFZpZXcsIFN0cmluZywgQ29udGV4dCwgQXR0cmlidXRlU2V0KX0uCiAgICAgICoKICAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciNjcmVhdGVWaWV3CiAgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuV2luZG93I2dldExheW91dEluZmxhdGVyCkBAIC0zNzU1LDYgKzQwNDMsMTcyIEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mCisgICAgICoge0BsaW5rIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlci5GYWN0b3J5MiNvbkNyZWF0ZVZpZXcoVmlldywgU3RyaW5nLCBDb250ZXh0LCBBdHRyaWJ1dGVTZXQpfQorICAgICAqIHVzZWQgd2hlbiBpbmZsYXRpbmcgd2l0aCB0aGUgTGF5b3V0SW5mbGF0ZXIgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTeXN0ZW1TZXJ2aWNlfS4KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGhhbmRsZXMgPGZyYWdtZW50PiB0YWdzIHRvIGVtYmVkIGZyYWdtZW50cyBpbnNpZGUKKyAgICAgKiBvZiB0aGUgYWN0aXZpdHkuCisgICAgICoKKyAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlciNjcmVhdGVWaWV3CisgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuV2luZG93I2dldExheW91dEluZmxhdGVyCisgICAgICovCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KFZpZXcgcGFyZW50LCBTdHJpbmcgbmFtZSwgQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgaWYgKCEiZnJhZ21lbnQiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIG9uQ3JlYXRlVmlldyhuYW1lLCBjb250ZXh0LCBhdHRycyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFN0cmluZyBmbmFtZSA9IGF0dHJzLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJjbGFzcyIpOworICAgICAgICBUeXBlZEFycmF5IGEgPSAKKyAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnQpOworICAgICAgICBpZiAoZm5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgZm5hbWUgPSBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudF9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgaWQgPSBhLmdldFJlc291cmNlSWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnRfaWQsIFZpZXcuTk9fSUQpOworICAgICAgICBTdHJpbmcgdGFnID0gYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnRfdGFnKTsKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgICAgIAorICAgICAgICBpbnQgY29udGFpbmVySWQgPSBwYXJlbnQgIT0gbnVsbCA/IHBhcmVudC5nZXRJZCgpIDogMDsKKyAgICAgICAgaWYgKGNvbnRhaW5lcklkID09IFZpZXcuTk9fSUQgJiYgaWQgPT0gVmlldy5OT19JRCAmJiB0YWcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihhdHRycy5nZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiOiBNdXN0IHNwZWNpZnkgdW5pcXVlIGFuZHJvaWQ6aWQsIGFuZHJvaWQ6dGFnLCBvciBoYXZlIGEgcGFyZW50IHdpdGggYW4gaWQgZm9yICIgKyBmbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB3ZSByZXN0b3JlZCBmcm9tIGEgcHJldmlvdXMgc3RhdGUsIHdlIG1heSBhbHJlYWR5IGhhdmUKKyAgICAgICAgLy8gaW5zdGFudGlhdGVkIHRoaXMgZnJhZ21lbnQgZnJvbSB0aGUgc3RhdGUgYW5kIHNob3VsZCB1c2UKKyAgICAgICAgLy8gdGhhdCBpbnN0YW5jZSBpbnN0ZWFkIG9mIG1ha2luZyBhIG5ldyBvbmUuCisgICAgICAgIEZyYWdtZW50IGZyYWdtZW50ID0gaWQgIT0gVmlldy5OT19JRCA/IG1GcmFnbWVudHMuZmluZEZyYWdtZW50QnlJZChpZCkgOiBudWxsOworICAgICAgICBpZiAoZnJhZ21lbnQgPT0gbnVsbCAmJiB0YWcgIT0gbnVsbCkgeworICAgICAgICAgICAgZnJhZ21lbnQgPSBtRnJhZ21lbnRzLmZpbmRGcmFnbWVudEJ5VGFnKHRhZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyYWdtZW50ID09IG51bGwgJiYgY29udGFpbmVySWQgIT0gVmlldy5OT19JRCkgeworICAgICAgICAgICAgZnJhZ21lbnQgPSBtRnJhZ21lbnRzLmZpbmRGcmFnbWVudEJ5SWQoY29udGFpbmVySWQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KFRBRywgIm9uQ3JlYXRlVmlldzogaWQ9MHgiCisgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGlkKSArICIgZm5hbWU9IiArIGZuYW1lCisgICAgICAgICAgICAgICAgKyAiIGV4aXN0aW5nPSIgKyBmcmFnbWVudCk7CisgICAgICAgIGlmIChmcmFnbWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICBmcmFnbWVudCA9IEZyYWdtZW50Lmluc3RhbnRpYXRlKHRoaXMsIGZuYW1lKTsKKyAgICAgICAgICAgIGZyYWdtZW50Lm1Gcm9tTGF5b3V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZyYWdtZW50Lm1GcmFnbWVudElkID0gaWQgIT0gMCA/IGlkIDogY29udGFpbmVySWQ7CisgICAgICAgICAgICBmcmFnbWVudC5tQ29udGFpbmVySWQgPSBjb250YWluZXJJZDsKKyAgICAgICAgICAgIGZyYWdtZW50Lm1UYWcgPSB0YWc7CisgICAgICAgICAgICBmcmFnbWVudC5tSW5MYXlvdXQgPSB0cnVlOworICAgICAgICAgICAgZnJhZ21lbnQubUltbWVkaWF0ZUFjdGl2aXR5ID0gdGhpczsKKyAgICAgICAgICAgIGZyYWdtZW50Lm1GcmFnbWVudE1hbmFnZXIgPSBtRnJhZ21lbnRzOworICAgICAgICAgICAgZnJhZ21lbnQub25JbmZsYXRlKGF0dHJzLCBmcmFnbWVudC5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgIG1GcmFnbWVudHMuYWRkRnJhZ21lbnQoZnJhZ21lbnQsIHRydWUpOworCisgICAgICAgIH0gZWxzZSBpZiAoZnJhZ21lbnQubUluTGF5b3V0KSB7CisgICAgICAgICAgICAvLyBBIGZyYWdtZW50IGFscmVhZHkgZXhpc3RzIGFuZCBpdCBpcyBub3Qgb25lIHdlIHJlc3RvcmVkIGZyb20KKyAgICAgICAgICAgIC8vIHByZXZpb3VzIHN0YXRlLgorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihhdHRycy5nZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiOiBEdXBsaWNhdGUgaWQgMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhpZCkKKyAgICAgICAgICAgICAgICAgICAgKyAiLCB0YWcgIiArIHRhZyArICIsIG9yIHBhcmVudCBpZCAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNvbnRhaW5lcklkKQorICAgICAgICAgICAgICAgICAgICArICIgd2l0aCBhbm90aGVyIGZyYWdtZW50IGZvciAiICsgZm5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGhpcyBmcmFnbWVudCB3YXMgcmV0YWluZWQgZnJvbSBhIHByZXZpb3VzIGluc3RhbmNlOyBnZXQgaXQKKyAgICAgICAgICAgIC8vIGdvaW5nIG5vdy4KKyAgICAgICAgICAgIGZyYWdtZW50Lm1JbkxheW91dCA9IHRydWU7CisgICAgICAgICAgICBmcmFnbWVudC5tSW1tZWRpYXRlQWN0aXZpdHkgPSB0aGlzOworICAgICAgICAgICAgLy8gSWYgdGhpcyBmcmFnbWVudCBpcyBuZXdseSBpbnN0YW50aWF0ZWQgKGVpdGhlciByaWdodCBub3csIG9yCisgICAgICAgICAgICAvLyBmcm9tIGxhc3Qgc2F2ZWQgc3RhdGUpLCB0aGVuIGdpdmUgaXQgdGhlIGF0dHJpYnV0ZXMgdG8KKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgaXRzZWxmLgorICAgICAgICAgICAgaWYgKCFmcmFnbWVudC5tUmV0YWluaW5nKSB7CisgICAgICAgICAgICAgICAgZnJhZ21lbnQub25JbmZsYXRlKGF0dHJzLCBmcmFnbWVudC5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1GcmFnbWVudHMubW92ZVRvU3RhdGUoZnJhZ21lbnQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmbmFtZQorICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjcmVhdGUgYSB2aWV3LiIpOworICAgICAgICB9CisgICAgICAgIGlmIChpZCAhPSAwKSB7CisgICAgICAgICAgICBmcmFnbWVudC5tVmlldy5zZXRJZChpZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyYWdtZW50Lm1WaWV3LmdldFRhZygpID09IG51bGwpIHsKKyAgICAgICAgICAgIGZyYWdtZW50Lm1WaWV3LnNldFRhZyh0YWcpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmcmFnbWVudC5tVmlldzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCB0aGUgQWN0aXZpdHkncyBzdGF0ZSBpbnRvIHRoZSBnaXZlbiBzdHJlYW0uICBUaGlzIGdldHMgaW52b2tlZCBpZgorICAgICAqIHlvdSBydW4gImFkYiBzaGVsbCBkdW1wc3lzIGFjdGl2aXR5IDx5b3VyYWN0aXZpdHluYW1lPiIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmQgVGhlIHJhdyBmaWxlIGRlc2NyaXB0b3IgdGhhdCB0aGUgZHVtcCBpcyBiZWluZyBzZW50IHRvLgorICAgICAqIEBwYXJhbSB3cml0ZXIgVGhlIFByaW50V3JpdGVyIHRvIHdoaWNoIHlvdSBzaG91bGQgZHVtcCB5b3VyIHN0YXRlLiAgVGhpcyB3aWxsIGJlCisgICAgICogY2xvc2VkIGZvciB5b3UgYWZ0ZXIgeW91IHJldHVybi4KKyAgICAgKiBAcGFyYW0gYXJncyBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0byB0aGUgZHVtcCByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nW10gYXJncykgeworICAgICAgICBtRnJhZ21lbnRzLmR1bXAoIiIsIGZkLCB3cml0ZXIsIGFyZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJpdCBpbmRpY2F0aW5nIHRoYXQgdGhpcyBhY3Rpdml0eSBpcyAiaW1tZXJzaXZlIiBhbmQgc2hvdWxkIG5vdCBiZQorICAgICAqIGludGVycnVwdGVkIGJ5IG5vdGlmaWNhdGlvbnMgaWYgcG9zc2libGUuCisgICAgICoKKyAgICAgKiBUaGlzIHZhbHVlIGlzIGluaXRpYWxseSBzZXQgYnkgdGhlIG1hbmlmZXN0IHByb3BlcnR5CisgICAgICogPGNvZGU+YW5kcm9pZDppbW1lcnNpdmU8L2NvZGU+IGJ1dCBtYXkgYmUgY2hhbmdlZCBhdCBydW50aW1lIGJ5CisgICAgICoge0BsaW5rICNzZXRJbW1lcnNpdmV9LgorICAgICAqCisgICAgICogQHNlZSBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvI0ZMQUdfSU1NRVJTSVZFCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ltbWVyc2l2ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLmlzSW1tZXJzaXZlKG1Ub2tlbik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGp1c3QgdGhlIGN1cnJlbnQgaW1tZXJzaXZlIG1vZGUgc2V0dGluZy4KKyAgICAgKiAKKyAgICAgKiBOb3RlIHRoYXQgY2hhbmdpbmcgdGhpcyB2YWx1ZSB3aWxsIGhhdmUgbm8gZWZmZWN0IG9uIHRoZSBhY3Rpdml0eSdzCisgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm99IHN0cnVjdHVyZTsgdGhhdCBpcywgaWYKKyAgICAgKiA8Y29kZT5hbmRyb2lkOmltbWVyc2l2ZTwvY29kZT4gaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+CisgICAgICogaW4gdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3QgZW50cnkgZm9yIHRoaXMgYWN0aXZpdHksIHRoZSB7QGxpbmsKKyAgICAgKiBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvI2ZsYWdzIEFjdGl2aXR5SW5mby5mbGFnc30gbWVtYmVyIHdpbGwKKyAgICAgKiBhbHdheXMgaGF2ZSBpdHMge0BsaW5rIGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm8jRkxBR19JTU1FUlNJVkUKKyAgICAgKiBGTEFHX0lNTUVSU0lWRX0gYml0IHNldC4KKyAgICAgKgorICAgICAqIEBzZWUgI2lzSW1tZXJzaXZlCisgICAgICogQHNlZSBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvI0ZMQUdfSU1NRVJTSVZFCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbW1lcnNpdmUoYm9vbGVhbiBpKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLnNldEltbWVyc2l2ZShtVG9rZW4sIGkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gcGFzcworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYSBjb250ZXh0IG1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgdGhhdCB3aWxsIG1hbmFnZSBsaWZlY3ljbGUgZXZlbnRzIGZvciB0aGlzIGNvbnRleHQgbW9kZQorICAgICAqIEByZXR1cm4gVGhlIENvbnRleHRNb2RlIHRoYXQgd2FzIHN0YXJ0ZWQsIG9yIG51bGwgaWYgaXQgd2FzIGNhbmNlbGVkCisgICAgICoKKyAgICAgKiBAc2VlIEFjdGlvbk1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGUoQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXREZWNvclZpZXcoKS5zdGFydEFjdGlvbk1vZGUoY2FsbGJhY2spOworICAgIH0KKworICAgIHB1YmxpYyBBY3Rpb25Nb2RlIG9uU3RhcnRBY3Rpb25Nb2RlKEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgaW5pdEFjdGlvbkJhcigpOworICAgICAgICBpZiAobUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvbkJhci5zdGFydEFjdGlvbk1vZGUoY2FsbGJhY2spOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKwogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBJbnRlcm5hbCBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgCiAgICAgZmluYWwgdm9pZCBzZXRQYXJlbnQoQWN0aXZpdHkgcGFyZW50KSB7CkBAIC0zNzYzLDI4ICs0MjE3LDMwIEBACiAKICAgICBmaW5hbCB2b2lkIGF0dGFjaChDb250ZXh0IGNvbnRleHQsIEFjdGl2aXR5VGhyZWFkIGFUaHJlYWQsIEluc3RydW1lbnRhdGlvbiBpbnN0ciwgSUJpbmRlciB0b2tlbiwKICAgICAgICAgICAgIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBJbnRlbnQgaW50ZW50LCBBY3Rpdml0eUluZm8gaW5mbywgQ2hhclNlcXVlbmNlIHRpdGxlLCAKLSAgICAgICAgICAgIEFjdGl2aXR5IHBhcmVudCwgU3RyaW5nIGlkLCBPYmplY3QgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwKKyAgICAgICAgICAgIEFjdGl2aXR5IHBhcmVudCwgU3RyaW5nIGlkLCBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLAogICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcpIHsKICAgICAgICAgYXR0YWNoKGNvbnRleHQsIGFUaHJlYWQsIGluc3RyLCB0b2tlbiwgMCwgYXBwbGljYXRpb24sIGludGVudCwgaW5mbywgdGl0bGUsIHBhcmVudCwgaWQsCi0gICAgICAgICAgICBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlLCBudWxsLCBjb25maWcpOworICAgICAgICAgICAgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMsIGNvbmZpZyk7CiAgICAgfQogICAgIAogICAgIGZpbmFsIHZvaWQgYXR0YWNoKENvbnRleHQgY29udGV4dCwgQWN0aXZpdHlUaHJlYWQgYVRocmVhZCwKICAgICAgICAgICAgIEluc3RydW1lbnRhdGlvbiBpbnN0ciwgSUJpbmRlciB0b2tlbiwgaW50IGlkZW50LAogICAgICAgICAgICAgQXBwbGljYXRpb24gYXBwbGljYXRpb24sIEludGVudCBpbnRlbnQsIEFjdGl2aXR5SW5mbyBpbmZvLAogICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlLCBBY3Rpdml0eSBwYXJlbnQsIFN0cmluZyBpZCwKLSAgICAgICAgICAgIE9iamVjdCBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlLAotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsT2JqZWN0PiBsYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzLAorICAgICAgICAgICAgTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcywKICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CiAgICAgICAgIGF0dGFjaEJhc2VDb250ZXh0KGNvbnRleHQpOwogCisgICAgICAgIG1GcmFnbWVudHMuYXR0YWNoQWN0aXZpdHkodGhpcyk7CisgICAgICAgIAogICAgICAgICBtV2luZG93ID0gUG9saWN5TWFuYWdlci5tYWtlTmV3V2luZG93KHRoaXMpOwogICAgICAgICBtV2luZG93LnNldENhbGxiYWNrKHRoaXMpOworICAgICAgICBtV2luZG93LmdldExheW91dEluZmxhdGVyKCkuc2V0RmFjdG9yeTIodGhpcyk7CiAgICAgICAgIGlmIChpbmZvLnNvZnRJbnB1dE1vZGUgIT0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9TVEFURV9VTlNQRUNJRklFRCkgewogICAgICAgICAgICAgbVdpbmRvdy5zZXRTb2Z0SW5wdXRNb2RlKGluZm8uc29mdElucHV0TW9kZSk7CiAgICAgICAgIH0KICAgICAgICAgbVVpVGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLQorICAgICAgICAKICAgICAgICAgbU1haW5UaHJlYWQgPSBhVGhyZWFkOwogICAgICAgICBtSW5zdHJ1bWVudGF0aW9uID0gaW5zdHI7CiAgICAgICAgIG1Ub2tlbiA9IHRva2VuOwpAQCAtMzc5NiwxMCArNDI1MiwxMCBAQAogICAgICAgICBtVGl0bGUgPSB0aXRsZTsKICAgICAgICAgbVBhcmVudCA9IHBhcmVudDsKICAgICAgICAgbUVtYmVkZGVkSUQgPSBpZDsKLSAgICAgICAgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlOwotICAgICAgICBtTGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcyA9IGxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXM7CisgICAgICAgIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzOwogCi0gICAgICAgIG1XaW5kb3cuc2V0V2luZG93TWFuYWdlcihudWxsLCBtVG9rZW4sIG1Db21wb25lbnQuZmxhdHRlblRvU3RyaW5nKCkpOworICAgICAgICBtV2luZG93LnNldFdpbmRvd01hbmFnZXIobnVsbCwgbVRva2VuLCBtQ29tcG9uZW50LmZsYXR0ZW5Ub1N0cmluZygpLAorICAgICAgICAgICAgICAgIChpbmZvLmZsYWdzICYgQWN0aXZpdHlJbmZvLkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQpICE9IDApOwogICAgICAgICBpZiAobVBhcmVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICBtV2luZG93LnNldENvbnRhaW5lcihtUGFyZW50LmdldFdpbmRvdygpKTsKICAgICAgICAgfQpAQCAtMzgxMSwyMyArNDI2Nyw0MSBAQAogICAgICAgICByZXR1cm4gbVBhcmVudCAhPSBudWxsID8gbVBhcmVudC5nZXRBY3Rpdml0eVRva2VuKCkgOiBtVG9rZW47CiAgICAgfQogCisgICAgZmluYWwgdm9pZCBwZXJmb3JtQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgb25DcmVhdGUoaWNpY2xlKTsKKyAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaEFjdGl2aXR5Q3JlYXRlZCgpOworICAgIH0KKyAgICAKICAgICBmaW5hbCB2b2lkIHBlcmZvcm1TdGFydCgpIHsKKyAgICAgICAgbUZyYWdtZW50cy5tU3RhdGVTYXZlZCA9IGZhbHNlOwogICAgICAgICBtQ2FsbGVkID0gZmFsc2U7CisgICAgICAgIG1GcmFnbWVudHMuZXhlY1BlbmRpbmdBY3Rpb25zKCk7CiAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uY2FsbEFjdGl2aXR5T25TdGFydCh0aGlzKTsKICAgICAgICAgaWYgKCFtQ2FsbGVkKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgIkFjdGl2aXR5ICIgKyBtQ29tcG9uZW50LnRvU2hvcnRTdHJpbmcoKSArCiAgICAgICAgICAgICAgICAgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblN0YXJ0KCkiKTsKICAgICAgICAgfQorICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoU3RhcnQoKTsKKyAgICAgICAgaWYgKG1BbGxMb2FkZXJNYW5hZ2VycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPW1BbGxMb2FkZXJNYW5hZ2Vycy5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgbUFsbExvYWRlck1hbmFnZXJzLnZhbHVlQXQoaSkuZmluaXNoUmV0YWluKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgZmluYWwgdm9pZCBwZXJmb3JtUmVzdGFydCgpIHsKKyAgICAgICAgbUZyYWdtZW50cy5tU3RhdGVTYXZlZCA9IGZhbHNlOworCiAgICAgICAgIHN5bmNocm9uaXplZCAobU1hbmFnZWRDdXJzb3JzKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1NYW5hZ2VkQ3Vyc29ycy5zaXplKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgTWFuYWdlZEN1cnNvciBtYyA9IG1NYW5hZ2VkQ3Vyc29ycy5nZXQoaSk7CiAgICAgICAgICAgICAgICAgaWYgKG1jLm1SZWxlYXNlZCB8fCBtYy5tVXBkYXRlZCkgewotICAgICAgICAgICAgICAgICAgICBtYy5tQ3Vyc29yLnJlcXVlcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtYy5tQ3Vyc29yLnJlcXVlcnkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyeWluZyB0byByZXF1ZXJ5IGFuIGFscmVhZHkgY2xvc2VkIGN1cnNvciIpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1jLm1SZWxlYXNlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBtYy5tVXBkYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KQEAgLTM4NTAsNyArNDMyNCw5IEBACiAgICAgZmluYWwgdm9pZCBwZXJmb3JtUmVzdW1lKCkgewogICAgICAgICBwZXJmb3JtUmVzdGFydCgpOwogICAgICAgICAKLSAgICAgICAgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBudWxsOworICAgICAgICBtRnJhZ21lbnRzLmV4ZWNQZW5kaW5nQWN0aW9ucygpOworICAgICAgICAKKyAgICAgICAgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzID0gbnVsbDsKICAgICAgICAgCiAgICAgICAgIC8vIEZpcnN0IGNhbGwgb25SZXN1bWUoKSAtYmVmb3JlLSBzZXR0aW5nIG1SZXN1bWVkLCBzbyB3ZSBkb24ndAogICAgICAgICAvLyBzZW5kIG91dCBhbnkgc3RhdHVzIGJhciAvIG1lbnUgbm90aWZpY2F0aW9ucyB0aGUgY2xpZW50IG1ha2VzLgpAQCAtMzg2NSw2ICs0MzQxLDEwIEBACiAgICAgICAgIC8vIE5vdyByZWFsbHkgcmVzdW1lLCBhbmQgaW5zdGFsbCB0aGUgY3VycmVudCBzdGF0dXMgYmFyIGFuZCBtZW51LgogICAgICAgICBtUmVzdW1lZCA9IHRydWU7CiAgICAgICAgIG1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIG1GcmFnbWVudHMuZGlzcGF0Y2hSZXN1bWUoKTsKKyAgICAgICAgbUZyYWdtZW50cy5leGVjUGVuZGluZ0FjdGlvbnMoKTsKKyAgICAgICAgCiAgICAgICAgIG9uUG9zdFJlc3VtZSgpOwogICAgICAgICBpZiAoIW1DYWxsZWQpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigKQEAgLTM4NzQsNiArNDM1NCw3IEBACiAgICAgfQogCiAgICAgZmluYWwgdm9pZCBwZXJmb3JtUGF1c2UoKSB7CisgICAgICAgIG1GcmFnbWVudHMuZGlzcGF0Y2hQYXVzZSgpOwogICAgICAgICBtQ2FsbGVkID0gZmFsc2U7CiAgICAgICAgIG9uUGF1c2UoKTsKICAgICAgICAgaWYgKCFtQ2FsbGVkICYmIGdldEFwcGxpY2F0aW9uSW5mbygpLnRhcmdldFNka1ZlcnNpb24KQEAgLTM4OTAsMTEgKzQzNzEsMjQgQEAKICAgICB9CiAgICAgCiAgICAgZmluYWwgdm9pZCBwZXJmb3JtU3RvcCgpIHsKKyAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKG1Mb2FkZXJNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvU3RvcCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvUmV0YWluKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAogICAgICAgICBpZiAoIW1TdG9wcGVkKSB7CiAgICAgICAgICAgICBpZiAobVdpbmRvdyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVdpbmRvdy5jbG9zZUFsbFBhbmVscygpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoU3RvcCgpOworICAgICAgICAgICAgCiAgICAgICAgICAgICBtQ2FsbGVkID0gZmFsc2U7CiAgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmNhbGxBY3Rpdml0eU9uU3RvcCh0aGlzKTsKICAgICAgICAgICAgIGlmICghbUNhbGxlZCkgewpAQCAtMzkxOSw2ICs0NDEzLDE1IEBACiAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CiAgICAgfQogCisgICAgZmluYWwgdm9pZCBwZXJmb3JtRGVzdHJveSgpIHsKKyAgICAgICAgbVdpbmRvdy5kZXN0cm95KCk7CisgICAgICAgIG1GcmFnbWVudHMuZGlzcGF0Y2hEZXN0cm95KCk7CisgICAgICAgIG9uRGVzdHJveSgpOworICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9EZXN0cm95KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCiAgICAgZmluYWwgYm9vbGVhbiBpc1Jlc3VtZWQoKSB7CiAgICAgICAgIHJldHVybiBtUmVzdW1lZDsKICAgICB9CkBAIC0zOTI4LDggKzQ0MzEsMTQgQEAKICAgICAgICAgaWYgKENvbmZpZy5MT0dWKSBMb2cudigKICAgICAgICAgICAgIFRBRywgIkRpc3BhdGNoaW5nIHJlc3VsdDogd2hvPSIgKyB3aG8gKyAiLCByZXFDb2RlPSIgKyByZXF1ZXN0Q29kZQogICAgICAgICAgICAgKyAiLCByZXNDb2RlPSIgKyByZXN1bHRDb2RlICsgIiwgZGF0YT0iICsgZGF0YSk7CisgICAgICAgIG1GcmFnbWVudHMubVN0YXRlU2F2ZWQgPSBmYWxzZTsKICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CiAgICAgICAgICAgICBvbkFjdGl2aXR5UmVzdWx0KHJlcXVlc3RDb2RlLCByZXN1bHRDb2RlLCBkYXRhKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZyYWdtZW50IGZyYWcgPSBtRnJhZ21lbnRzLmZpbmRGcmFnbWVudEJ5V2hvKHdobyk7CisgICAgICAgICAgICBpZiAoZnJhZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZnJhZy5vbkFjdGl2aXR5UmVzdWx0KHJlcXVlc3RDb2RlLCByZXN1bHRDb2RlLCBkYXRhKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXJOYXRpdmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXJOYXRpdmUuamF2YQppbmRleCA4OTgxMmFiLi5iMzRjMjQzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlck5hdGl2ZS5qYXZhCkBAIC0xMjYxLDYgKzEyNjEsMzIgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBJU19JTU1FUlNJVkVfVFJBTlNBQ1RJT046IHsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgSUJpbmRlciB0b2tlbiA9IGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpOworICAgICAgICAgICAgYm9vbGVhbiBpc2l0ID0gaXNJbW1lcnNpdmUodG9rZW4pOworICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoaXNpdCA/IDEgOiAwKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRVRfSU1NRVJTSVZFX1RSQU5TQUNUSU9OOiB7CisgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIElCaW5kZXIgdG9rZW4gPSBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gaW1tID0gZGF0YS5yZWFkSW50KCkgPT0gMTsKKyAgICAgICAgICAgIHNldEltbWVyc2l2ZSh0b2tlbiwgaW1tKTsKKyAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBjYXNlIElTX1RPUF9BQ1RJVklUWV9JTU1FUlNJVkVfVFJBTlNBQ1RJT046IHsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgYm9vbGVhbiBpc2l0ID0gaXNUb3BBY3Rpdml0eUltbWVyc2l2ZSgpOworICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoaXNpdCA/IDEgOiAwKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBDUkFTSF9BUFBMSUNBVElPTl9UUkFOU0FDVElPTjogewogICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CiAgICAgICAgICAgICBpbnQgdWlkID0gZGF0YS5yZWFkSW50KCk7CkBAIC0xMzE1LDYgKzEzNDEsMzEgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBDSEVDS19HUkFOVF9VUklfUEVSTUlTU0lPTl9UUkFOU0FDVElPTjogeworICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CisgICAgICAgICAgICBpbnQgY2FsbGluZ1VpZCA9IGRhdGEucmVhZEludCgpOworICAgICAgICAgICAgU3RyaW5nIHRhcmdldFBrZyA9IGRhdGEucmVhZFN0cmluZygpOworICAgICAgICAgICAgVXJpIHVyaSA9IFVyaS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoZGF0YSk7CisgICAgICAgICAgICBpbnQgbW9kZUZsYWdzID0gZGF0YS5yZWFkSW50KCk7CisgICAgICAgICAgICBpbnQgcmVzID0gY2hlY2tHcmFudFVyaVBlcm1pc3Npb24oY2FsbGluZ1VpZCwgdGFyZ2V0UGtnLCB1cmksIG1vZGVGbGFncyk7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS53cml0ZUludChyZXMpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERVTVBfSEVBUF9UUkFOU0FDVElPTjogeworICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CisgICAgICAgICAgICBTdHJpbmcgcHJvY2VzcyA9IGRhdGEucmVhZFN0cmluZygpOworICAgICAgICAgICAgYm9vbGVhbiBtYW5hZ2VkID0gZGF0YS5yZWFkSW50KCkgIT0gMDsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCA9IGRhdGEucmVhZEludCgpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgPyBkYXRhLnJlYWRGaWxlRGVzY3JpcHRvcigpIDogbnVsbDsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVzID0gZHVtcEhlYXAocHJvY2VzcywgbWFuYWdlZCwgcGF0aCwgZmQpOworICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQocmVzID8gMSA6IDApOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKwogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICByZXR1cm4gc3VwZXIub25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwpAQCAtMjg0MSw2ICsyODkyLDQ2IEBACiAgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKICAgICB9CiAgICAgCisgICAgcHVibGljIHZvaWQgc2V0SW1tZXJzaXZlKElCaW5kZXIgdG9rZW4sIGJvb2xlYW4gaW1tZXJzaXZlKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHRva2VuKTsKKyAgICAgICAgZGF0YS53cml0ZUludChpbW1lcnNpdmUgPyAxIDogMCk7CisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoU0VUX0lNTUVSU0lWRV9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIGRhdGEucmVjeWNsZSgpOworICAgICAgICByZXBseS5yZWN5Y2xlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNJbW1lcnNpdmUoSUJpbmRlciB0b2tlbikKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcih0b2tlbik7CisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoSVNfSU1NRVJTSVZFX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7CisgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgYm9vbGVhbiByZXMgPSByZXBseS5yZWFkSW50KCkgPT0gMTsKKyAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RvcEFjdGl2aXR5SW1tZXJzaXZlKCkKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgbVJlbW90ZS50cmFuc2FjdChJU19UT1BfQUNUSVZJVFlfSU1NRVJTSVZFX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7CisgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgYm9vbGVhbiByZXMgPSByZXBseS5yZWFkSW50KCkgPT0gMTsKKyAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBjcmFzaEFwcGxpY2F0aW9uKGludCB1aWQsIGludCBpbml0aWFsUGlkLCBTdHJpbmcgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOwpAQCAtMjkxOCw2ICszMDA5LDQ1IEBACiAgICAgICAgIGRhdGEucmVjeWNsZSgpOwogICAgICAgICByZXBseS5yZWN5Y2xlKCk7CiAgICAgfQorCisgICAgcHVibGljIGludCBjaGVja0dyYW50VXJpUGVybWlzc2lvbihpbnQgY2FsbGluZ1VpZCwgU3RyaW5nIHRhcmdldFBrZywKKyAgICAgICAgICAgIFVyaSB1cmksIGludCBtb2RlRmxhZ3MpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgZGF0YS53cml0ZUludChjYWxsaW5nVWlkKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZyh0YXJnZXRQa2cpOworICAgICAgICB1cmkud3JpdGVUb1BhcmNlbChkYXRhLCAwKTsKKyAgICAgICAgZGF0YS53cml0ZUludChtb2RlRmxhZ3MpOworICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KENIRUNLX0dSQU5UX1VSSV9QRVJNSVNTSU9OX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7CisgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgaW50IHJlcyA9IHJlcGx5LnJlYWRJbnQoKTsKKyAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBkdW1wSGVhcChTdHJpbmcgcHJvY2VzcywgYm9vbGVhbiBtYW5hZ2VkLAorICAgICAgICAgICAgU3RyaW5nIHBhdGgsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcocHJvY2Vzcyk7CisgICAgICAgIGRhdGEud3JpdGVJbnQobWFuYWdlZCA/IDEgOiAwKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZyhwYXRoKTsKKyAgICAgICAgaWYgKGZkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQoMSk7CisgICAgICAgICAgICBmZC53cml0ZVRvUGFyY2VsKGRhdGEsIFBhcmNlbGFibGUuUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YS53cml0ZUludCgwKTsKKyAgICAgICAgfQorICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KERVTVBfSEVBUF9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIGJvb2xlYW4gcmVzID0gcmVwbHkucmVhZEludCgpICE9IDA7CisgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQogICAgIAogICAgIHByaXZhdGUgSUJpbmRlciBtUmVtb3RlOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YQppbmRleCA2M2E1ZmY2Li5mM2Y3ZWU3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5JUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkluc3RydW1lbnRhdGlvbkluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlByb3ZpZGVySW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CkBAIC02Myw2ICs2NCw3IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZ1ByaW50ZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkhhcmR3YXJlUmVuZGVyZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld01hbmFnZXI7CkBAIC0xOTksOCArMjAxLDcgQEAKICAgICAgICAgV2luZG93IHdpbmRvdzsKICAgICAgICAgQWN0aXZpdHkgcGFyZW50OwogICAgICAgICBTdHJpbmcgZW1iZWRkZWRJRDsKLSAgICAgICAgT2JqZWN0IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2U7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLE9iamVjdD4gbGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlczsKKyAgICAgICAgQWN0aXZpdHkuTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlczsKICAgICAgICAgYm9vbGVhbiBwYXVzZWQ7CiAgICAgICAgIGJvb2xlYW4gc3RvcHBlZDsKICAgICAgICAgYm9vbGVhbiBoaWRlRm9yTm93OwpAQCAtMzM1LDkgKzMzNiw5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEdW1wU2VydmljZUluZm8geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIER1bXBDb21wb25lbnRJbmZvIHsKICAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQ7Ci0gICAgICAgIElCaW5kZXIgc2VydmljZTsKKyAgICAgICAgSUJpbmRlciB0b2tlbjsKICAgICAgICAgU3RyaW5nW10gYXJnczsKICAgICAgICAgYm9vbGVhbiBkdW1wZWQ7CiAgICAgfQpAQCAtMzYxLDEyICszNjIsMTcgQEAKICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQ7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRHVtcEhlYXBEYXRhIHsKKyAgICAgICAgU3RyaW5nIHBhdGg7CisgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkOworICAgIH0KKwogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQXBwbGljYXRpb25UaHJlYWQgZXh0ZW5kcyBBcHBsaWNhdGlvblRocmVhZE5hdGl2ZSB7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFQX0NPTFVNTiA9ICIlMTdzICU4cyAlOHMgJThzICU4cyI7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVfQ09VTlRfQ09MVU1OID0gIiUxN3MgJThkIjsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRXT19DT1VOVF9DT0xVTU5TID0gIiUxN3MgJThkICUxN3MgJThkIjsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRXT19DT1VOVF9DT0xVTU5TX0RCID0gIiUyMHMgJThkICUyMHMgJThkIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX0lORk9fRk9STUFUID0gIiAgJThkICU4ZCAlMTRkICAlcyI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9JTkZPX0ZPUk1BVCA9ICIgICU4cyAlOHMgJTE0cyAlMTRzICAlcyI7CiAKICAgICAgICAgLy8gRm9ybWF0dGluZyBmb3IgY2hlY2tpbiBzZXJ2aWNlIC0gdXBkYXRlIHZlcnNpb24gaWYgcm93IGZvcm1hdCBjaGFuZ2VzCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1RJVklUWV9USFJFQURfQ0hFQ0tJTl9WRVJTSU9OID0gMTsKQEAgLTU4Nyw5ICs1OTMsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgZHVtcFNlcnZpY2UoRmlsZURlc2NyaXB0b3IgZmQsIElCaW5kZXIgc2VydmljZXRva2VuLCBTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgICAgICBEdW1wU2VydmljZUluZm8gZGF0YSA9IG5ldyBEdW1wU2VydmljZUluZm8oKTsKKyAgICAgICAgICAgIER1bXBDb21wb25lbnRJbmZvIGRhdGEgPSBuZXcgRHVtcENvbXBvbmVudEluZm8oKTsKICAgICAgICAgICAgIGRhdGEuZmQgPSBmZDsKLSAgICAgICAgICAgIGRhdGEuc2VydmljZSA9IHNlcnZpY2V0b2tlbjsKKyAgICAgICAgICAgIGRhdGEudG9rZW4gPSBzZXJ2aWNldG9rZW47CiAgICAgICAgICAgICBkYXRhLmFyZ3MgPSBhcmdzOwogICAgICAgICAgICAgZGF0YS5kdW1wZWQgPSBmYWxzZTsKICAgICAgICAgICAgIHF1ZXVlT3JTZW5kTWVzc2FnZShILkRVTVBfU0VSVklDRSwgZGF0YSk7CkBAIC02MjksNiArNjM1LDEzIEBACiAgICAgICAgICAgICBxdWV1ZU9yU2VuZE1lc3NhZ2UoSC5QUk9GSUxFUl9DT05UUk9MLCBwY2QsIHN0YXJ0ID8gMSA6IDApOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgZHVtcEhlYXAoYm9vbGVhbiBtYW5hZ2VkLCBTdHJpbmcgcGF0aCwgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQpIHsKKyAgICAgICAgICAgIER1bXBIZWFwRGF0YSBkaGQgPSBuZXcgRHVtcEhlYXBEYXRhKCk7CisgICAgICAgICAgICBkaGQucGF0aCA9IHBhdGg7CisgICAgICAgICAgICBkaGQuZmQgPSBmZDsKKyAgICAgICAgICAgIHF1ZXVlT3JTZW5kTWVzc2FnZShILkRVTVBfSEVBUCwgZGhkLCBtYW5hZ2VkID8gMSA6IDApOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgc2V0U2NoZWR1bGluZ0dyb3VwKGludCBncm91cCkgewogICAgICAgICAgICAgLy8gTm90ZTogZG8gdGhpcyBpbW1lZGlhdGVseSwgc2luY2UgZ29pbmcgaW50byB0aGUgZm9yZWdyb3VuZAogICAgICAgICAgICAgLy8gc2hvdWxkIGhhcHBlbiByZWdhcmRsZXNzIG9mIHdoYXQgcGVuZGluZyB3b3JrIHdlIGhhdmUgdG8gZG8KQEAgLTY1Miw2ICs2NjUsMjUgQEAKICAgICAgICAgcHVibGljIHZvaWQgc2NoZWR1bGVDcmFzaChTdHJpbmcgbXNnKSB7CiAgICAgICAgICAgICBxdWV1ZU9yU2VuZE1lc3NhZ2UoSC5TQ0hFRFVMRV9DUkFTSCwgbXNnKTsKICAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGR1bXBBY3Rpdml0eShGaWxlRGVzY3JpcHRvciBmZCwgSUJpbmRlciBhY3Rpdml0eXRva2VuLCBTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgICAgICBEdW1wQ29tcG9uZW50SW5mbyBkYXRhID0gbmV3IER1bXBDb21wb25lbnRJbmZvKCk7CisgICAgICAgICAgICBkYXRhLmZkID0gZmQ7CisgICAgICAgICAgICBkYXRhLnRva2VuID0gYWN0aXZpdHl0b2tlbjsKKyAgICAgICAgICAgIGRhdGEuYXJncyA9IGFyZ3M7CisgICAgICAgICAgICBkYXRhLmR1bXBlZCA9IGZhbHNlOworICAgICAgICAgICAgcXVldWVPclNlbmRNZXNzYWdlKEguRFVNUF9BQ1RJVklUWSwgZGF0YSk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGRhdGEpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIWRhdGEuZHVtcGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLndhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlLCB3ZSB3aWxsIGtlZXAgd2FpdGluZyB1bnRpbAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVtcGVkIGlzIHNldAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZHVtcChGaWxlRGVzY3JpcHRvciBmZCwgUHJpbnRXcml0ZXIgcHcsIFN0cmluZ1tdIGFyZ3MpIHsKQEAgLTY3NywxNCArNzA5LDE0IEBACiAgICAgICAgICAgICBsb25nIGRhbHZpa0FsbG9jYXRlZCA9IGRhbHZpa01heCAtIGRhbHZpa0ZyZWU7CiAgICAgICAgICAgICBsb25nIHZpZXdJbnN0YW5jZUNvdW50ID0gVmlld0RlYnVnLmdldFZpZXdJbnN0YW5jZUNvdW50KCk7CiAgICAgICAgICAgICBsb25nIHZpZXdSb290SW5zdGFuY2VDb3VudCA9IFZpZXdEZWJ1Zy5nZXRWaWV3Um9vdEluc3RhbmNlQ291bnQoKTsKLSAgICAgICAgICAgIGxvbmcgYXBwQ29udGV4dEluc3RhbmNlQ291bnQgPSBDb250ZXh0SW1wbC5nZXRJbnN0YW5jZUNvdW50KCk7Ci0gICAgICAgICAgICBsb25nIGFjdGl2aXR5SW5zdGFuY2VDb3VudCA9IEFjdGl2aXR5LmdldEluc3RhbmNlQ291bnQoKTsKKyAgICAgICAgICAgIGxvbmcgYXBwQ29udGV4dEluc3RhbmNlQ291bnQgPSBEZWJ1Zy5jb3VudEluc3RhbmNlc09mQ2xhc3MoQ29udGV4dEltcGwuY2xhc3MpOworICAgICAgICAgICAgbG9uZyBhY3Rpdml0eUluc3RhbmNlQ291bnQgPSBEZWJ1Zy5jb3VudEluc3RhbmNlc09mQ2xhc3MoQWN0aXZpdHkuY2xhc3MpOwogICAgICAgICAgICAgaW50IGdsb2JhbEFzc2V0Q291bnQgPSBBc3NldE1hbmFnZXIuZ2V0R2xvYmFsQXNzZXRDb3VudCgpOwogICAgICAgICAgICAgaW50IGdsb2JhbEFzc2V0TWFuYWdlckNvdW50ID0gQXNzZXRNYW5hZ2VyLmdldEdsb2JhbEFzc2V0TWFuYWdlckNvdW50KCk7CiAgICAgICAgICAgICBpbnQgYmluZGVyTG9jYWxPYmplY3RDb3VudCA9IERlYnVnLmdldEJpbmRlckxvY2FsT2JqZWN0Q291bnQoKTsKICAgICAgICAgICAgIGludCBiaW5kZXJQcm94eU9iamVjdENvdW50ID0gRGVidWcuZ2V0QmluZGVyUHJveHlPYmplY3RDb3VudCgpOwogICAgICAgICAgICAgaW50IGJpbmRlckRlYXRoT2JqZWN0Q291bnQgPSBEZWJ1Zy5nZXRCaW5kZXJEZWF0aE9iamVjdENvdW50KCk7Ci0gICAgICAgICAgICBpbnQgb3BlblNzbFNvY2tldENvdW50ID0gT3BlblNTTFNvY2tldEltcGwuZ2V0SW5zdGFuY2VDb3VudCgpOworICAgICAgICAgICAgbG9uZyBvcGVuU3NsU29ja2V0Q291bnQgPSBEZWJ1Zy5jb3VudEluc3RhbmNlc09mQ2xhc3MoT3BlblNTTFNvY2tldEltcGwuY2xhc3MpOwogICAgICAgICAgICAgbG9uZyBzcWxpdGVBbGxvY2F0ZWQgPSBTUUxpdGVEZWJ1Zy5nZXRIZWFwQWxsb2NhdGVkU2l6ZSgpIC8gMTAyNDsKICAgICAgICAgICAgIFNRTGl0ZURlYnVnLlBhZ2VyU3RhdHMgc3RhdHMgPSBTUUxpdGVEZWJ1Zy5nZXREYXRhYmFzZUluZm8oKTsKIApAQCAtNzY2LDcgKzc5OCw3IEBACiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0cy5kYlN0YXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIERiU3RhdHMgZGJTdGF0cyA9IHN0YXRzLmRiU3RhdHMuZ2V0KGkpOwogICAgICAgICAgICAgICAgICAgICBwcmludFJvdyhwdywgREJfSU5GT19GT1JNQVQsIGRiU3RhdHMucGFnZVNpemUsIGRiU3RhdHMuZGJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiU3RhdHMubG9va2FzaWRlLCBkYlN0YXRzLmRiTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJTdGF0cy5sb29rYXNpZGUsIGRiU3RhdHMuY2FjaGUsIGRiU3RhdHMuZGJOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoJywnKTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTgxNywxMSArODQ5LDE1IEBACiAgICAgICAgICAgICBpbnQgTiA9IHN0YXRzLmRiU3RhdHMuc2l6ZSgpOwogICAgICAgICAgICAgaWYgKE4gPiAwKSB7CiAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiIERBVEFCQVNFUyIpOwotICAgICAgICAgICAgICAgIHByaW50Um93KHB3LCAiICAlOHMgJThzICUxNHMgICVzIiwgInBnc3oiLCAiZGJzeiIsICJMb29rYXNpZGUoYikiLCAiRGJuYW1lIik7CisgICAgICAgICAgICAgICAgcHJpbnRSb3cocHcsICIgICU4cyAlOHMgJTE0cyAlMTRzICAlcyIsICJwZ3N6IiwgImRic3oiLCAiTG9va2FzaWRlKGIpIiwgImNhY2hlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJEYm5hbWUiKTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgICAgICAgICAgICAgICBEYlN0YXRzIGRiU3RhdHMgPSBzdGF0cy5kYlN0YXRzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRSb3cocHcsIERCX0lORk9fRk9STUFULCBkYlN0YXRzLnBhZ2VTaXplLCBkYlN0YXRzLmRiU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzLmxvb2thc2lkZSwgZGJTdGF0cy5kYk5hbWUpOworICAgICAgICAgICAgICAgICAgICBwcmludFJvdyhwdywgREJfSU5GT19GT1JNQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRiU3RhdHMucGFnZVNpemUgPiAwKSA/IFN0cmluZy52YWx1ZU9mKGRiU3RhdHMucGFnZVNpemUpIDogIiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYlN0YXRzLmRiU2l6ZSA+IDApID8gU3RyaW5nLnZhbHVlT2YoZGJTdGF0cy5kYlNpemUpIDogIiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYlN0YXRzLmxvb2thc2lkZSA+IDApID8gU3RyaW5nLnZhbHVlT2YoZGJTdGF0cy5sb29rYXNpZGUpIDogIiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiU3RhdHMuY2FjaGUsIGRiU3RhdHMuZGJOYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTg3NSw2ICs5MTEsOCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkFCTEVfSklUICAgICAgICAgICAgICA9IDEzMjsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUEFUQ0hfUEFDS0FHRV9CUk9BRENBU1QgPSAxMzM7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDSEVEVUxFX0NSQVNIICAgICAgICAgID0gMTM0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEVU1QX0hFQVAgICAgICAgICAgICAgICA9IDEzNTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFVNUF9BQ1RJVklUWSAgICAgICAgICAgPSAxMzY7CiAgICAgICAgIFN0cmluZyBjb2RlVG9TdHJpbmcoaW50IGNvZGUpIHsKICAgICAgICAgICAgIGlmIChERUJVR19NRVNTQUdFUykgewogICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgewpAQCAtOTEzLDYgKzk1MSw4IEBACiAgICAgICAgICAgICAgICAgICAgIGNhc2UgRU5BQkxFX0pJVDogcmV0dXJuICJFTkFCTEVfSklUIjsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBESVNQQVRDSF9QQUNLQUdFX0JST0FEQ0FTVDogcmV0dXJuICJESVNQQVRDSF9QQUNLQUdFX0JST0FEQ0FTVCI7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgU0NIRURVTEVfQ1JBU0g6IHJldHVybiAiU0NIRURVTEVfQ1JBU0giOworICAgICAgICAgICAgICAgICAgICBjYXNlIERVTVBfSEVBUDogcmV0dXJuICJEVU1QX0hFQVAiOworICAgICAgICAgICAgICAgICAgICBjYXNlIERVTVBfQUNUSVZJVFk6IHJldHVybiAiRFVNUF9BQ1RJVklUWSI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuICIodW5rbm93bikiOwpAQCAtMTAwOCw3ICsxMDQ4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVHY0lkbGVyKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgRFVNUF9TRVJWSUNFOgotICAgICAgICAgICAgICAgICAgICBoYW5kbGVEdW1wU2VydmljZSgoRHVtcFNlcnZpY2VJbmZvKW1zZy5vYmopOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVEdW1wU2VydmljZSgoRHVtcENvbXBvbmVudEluZm8pbXNnLm9iaik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgTE9XX01FTU9SWToKICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTG93TWVtb3J5KCk7CkBAIC0xMDM5LDE0ICsxMDc5LDM5IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0NIRURVTEVfQ1JBU0g6CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVTZXJ2aWNlRXhjZXB0aW9uKChTdHJpbmcpbXNnLm9iaik7CisgICAgICAgICAgICAgICAgY2FzZSBEVU1QX0hFQVA6CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUR1bXBIZWFwKG1zZy5hcmcxICE9IDAsIChEdW1wSGVhcERhdGEpbXNnLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRFVNUF9BQ1RJVklUWToKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlRHVtcEFjdGl2aXR5KChEdW1wQ29tcG9uZW50SW5mbyltc2cub2JqKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoREVCVUdfTUVTU0FHRVMpIFNsb2cudihUQUcsICI8PDwgZG9uZTogIiArIG1zZy53aGF0KTsKICAgICAgICAgfQogCiAgICAgICAgIHZvaWQgbWF5YmVTbmFwc2hvdCgpIHsKICAgICAgICAgICAgIGlmIChtQm91bmRBcHBsaWNhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLndyaXRlU25hcHNob3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBtQm91bmRBcHBsaWNhdGlvbi5wcm9jZXNzTmFtZSk7CisgICAgICAgICAgICAgICAgLy8gY29udmVydCB0aGUgKnByaXZhdGUqIEFjdGl2aXR5VGhyZWFkLlBhY2thZ2VJbmZvIHRvICpwdWJsaWMqIGtub3duCisgICAgICAgICAgICAgICAgLy8gYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvCisgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gbUJvdW5kQXBwbGljYXRpb24uaW5mby5tUGFja2FnZU5hbWU7CisgICAgICAgICAgICAgICAgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvIHBhY2thZ2VJbmZvID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRTeXN0ZW1Db250ZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiY2Fubm90IGdldCBhIHZhbGlkIGNvbnRleHQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYocG0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiY2Fubm90IGdldCBhIHZhbGlkIFBhY2thZ2VNYW5hZ2VyIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZUluZm8gPSBwbS5nZXRQYWNrYWdlSW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgUGFja2FnZU1hbmFnZXIuR0VUX0FDVElWSVRJRVMpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImNhbm5vdCBnZXQgcGFja2FnZSBpbmZvIGZvciAiICsgcGFja2FnZU5hbWUsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24ud3JpdGVTbmFwc2hvdChtQm91bmRBcHBsaWNhdGlvbi5wcm9jZXNzTmFtZSwgcGFja2FnZUluZm8pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTQzNyw3ICsxNTAyLDcgQEAKIAogICAgIHB1YmxpYyBmaW5hbCBBY3Rpdml0eSBzdGFydEFjdGl2aXR5Tm93KEFjdGl2aXR5IHBhcmVudCwgU3RyaW5nIGlkLAogICAgICAgICBJbnRlbnQgaW50ZW50LCBBY3Rpdml0eUluZm8gYWN0aXZpdHlJbmZvLCBJQmluZGVyIHRva2VuLCBCdW5kbGUgc3RhdGUsCi0gICAgICAgIE9iamVjdCBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKSB7CisgICAgICAgIEFjdGl2aXR5Lk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMpIHsKICAgICAgICAgQWN0aXZpdHlDbGllbnRSZWNvcmQgciA9IG5ldyBBY3Rpdml0eUNsaWVudFJlY29yZCgpOwogICAgICAgICAgICAgci50b2tlbiA9IHRva2VuOwogICAgICAgICAgICAgci5pZGVudCA9IDA7CkBAIC0xNDQ2LDcgKzE1MTEsNyBAQAogICAgICAgICAgICAgci5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICByLmVtYmVkZGVkSUQgPSBpZDsKICAgICAgICAgICAgIHIuYWN0aXZpdHlJbmZvID0gYWN0aXZpdHlJbmZvOwotICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlID0gbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZTsKKyAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlczsKICAgICAgICAgaWYgKGxvY2FsTE9HVikgewogICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBjb21wbmFtZSA9IGludGVudC5nZXRDb21wb25lbnQoKTsKICAgICAgICAgICAgIFN0cmluZyBuYW1lOwpAQCAtMTU2OCwxNCArMTYzMywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyByLmFjdGl2aXR5SW5mby5uYW1lICsgIiB3aXRoIGNvbmZpZyAiICsgY29uZmlnKTsKICAgICAgICAgICAgICAgICBhY3Rpdml0eS5hdHRhY2goYXBwQ29udGV4dCwgdGhpcywgZ2V0SW5zdHJ1bWVudGF0aW9uKCksIHIudG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICByLmlkZW50LCBhcHAsIHIuaW50ZW50LCByLmFjdGl2aXR5SW5mbywgdGl0bGUsIHIucGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgci5lbWJlZGRlZElELCByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMsIGNvbmZpZyk7CisgICAgICAgICAgICAgICAgICAgICAgICByLmVtYmVkZGVkSUQsIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMsIGNvbmZpZyk7CiAKICAgICAgICAgICAgICAgICBpZiAoY3VzdG9tSW50ZW50ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkubUludGVudCA9IGN1c3RvbUludGVudDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMgPSBudWxsOworICAgICAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgPSBudWxsOwogICAgICAgICAgICAgICAgIGFjdGl2aXR5Lm1TdGFydGVkQWN0aXZpdHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBpbnQgdGhlbWUgPSByLmFjdGl2aXR5SW5mby5nZXRUaGVtZVJlc291cmNlKCk7CiAgICAgICAgICAgICAgICAgaWYgKHRoZW1lICE9IDApIHsKQEAgLTE5ODgsOSArMjA1MSw5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlRHVtcFNlcnZpY2UoRHVtcFNlcnZpY2VJbmZvIGluZm8pIHsKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlRHVtcFNlcnZpY2UoRHVtcENvbXBvbmVudEluZm8gaW5mbykgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZSBzID0gbVNlcnZpY2VzLmdldChpbmZvLnNlcnZpY2UpOworICAgICAgICAgICAgU2VydmljZSBzID0gbVNlcnZpY2VzLmdldChpbmZvLnRva2VuKTsKICAgICAgICAgICAgIGlmIChzICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShpbmZvLmZkKSk7CiAgICAgICAgICAgICAgICAgcy5kdW1wKGluZm8uZmQsIHB3LCBpbmZvLmFyZ3MpOwpAQCAtMjAwNCw2ICsyMDY3LDIyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlRHVtcEFjdGl2aXR5KER1bXBDb21wb25lbnRJbmZvIGluZm8pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFjdGl2aXR5Q2xpZW50UmVjb3JkIHIgPSBtQWN0aXZpdGllcy5nZXQoaW5mby50b2tlbik7CisgICAgICAgICAgICBpZiAociAhPSBudWxsICYmIHIuYWN0aXZpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGluZm8uZmQpKTsKKyAgICAgICAgICAgICAgICByLmFjdGl2aXR5LmR1bXAoaW5mby5mZCwgcHcsIGluZm8uYXJncyk7CisgICAgICAgICAgICAgICAgcHcuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoaW5mbykgeworICAgICAgICAgICAgICAgIGluZm8uZHVtcGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpbmZvLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGhhbmRsZVNlcnZpY2VBcmdzKFNlcnZpY2VBcmdzRGF0YSBkYXRhKSB7CiAgICAgICAgIFNlcnZpY2UgcyA9IG1TZXJ2aWNlcy5nZXQoZGF0YS50b2tlbik7CiAgICAgICAgIGlmIChzICE9IG51bGwpIHsKQEAgLTI1NTIsNiArMjYzMSw5IEBACiAgICAgICAgICAgICBpZiAoZmluaXNoaW5nKSB7CiAgICAgICAgICAgICAgICAgci5hY3Rpdml0eS5tRmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdldE5vbkNvbmZpZ0luc3RhbmNlKSB7CisgICAgICAgICAgICAgICAgci5hY3Rpdml0eS5tQ2hhbmdpbmdDb25maWd1cmF0aW9ucyA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIXIucGF1c2VkKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgci5hY3Rpdml0eS5tQ2FsbGVkID0gZmFsc2U7CkBAIC0yNTkyLDggKzI2NzQsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGdldE5vbkNvbmZpZ0luc3RhbmNlKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSByLmFjdGl2aXR5Lm9uUmV0YWluTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHIuYWN0aXZpdHkucmV0YWluTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcygpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbUluc3RydW1lbnRhdGlvbi5vbkV4Y2VwdGlvbihyLmFjdGl2aXR5LCBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCkBAIC0yNjAyLDIyICsyNjg0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogIiArIGUudG9TdHJpbmcoKSwgZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSByLmFjdGl2aXR5Lm9uUmV0YWluTm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtSW5zdHJ1bWVudGF0aW9uLm9uRXhjZXB0aW9uKHIuYWN0aXZpdHksIGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByZXRhaW4gY2hpbGQgYWN0aXZpdGllcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2FmZVRvQ29tcG9uZW50U2hvcnRTdHJpbmcoci5pbnRlbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogIiArIGUudG9TdHJpbmcoKSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgci5hY3Rpdml0eS5tQ2FsbGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgci5hY3Rpdml0eS5vbkRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmNhbGxBY3Rpdml0eU9uRGVzdHJveShyLmFjdGl2aXR5KTsKICAgICAgICAgICAgICAgICBpZiAoIXIuYWN0aXZpdHkubUNhbGxlZCkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAiQWN0aXZpdHkgIiArIHNhZmVUb0NvbXBvbmVudFNob3J0U3RyaW5nKHIuaW50ZW50KSArCkBAIC0zMDI5LDYgKzMwOTksMjUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGZpbmFsIHZvaWQgaGFuZGxlRHVtcEhlYXAoYm9vbGVhbiBtYW5hZ2VkLCBEdW1wSGVhcERhdGEgZGhkKSB7CisgICAgICAgIGlmIChtYW5hZ2VkKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIERlYnVnLmR1bXBIcHJvZkRhdGEoZGhkLnBhdGgsIGRoZC5mZC5nZXRGaWxlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiTWFuYWdlZCBoZWFwIGR1bXAgZmFpbGVkIG9uIHBhdGggIiArIGRoZC5wYXRoCisgICAgICAgICAgICAgICAgICAgICAgICArICIgLS0gY2FuIHRoZSBwcm9jZXNzIGFjY2VzcyB0aGlzIHBhdGg/Iik7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGRoZC5mZC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkZhaWx1cmUgY2xvc2luZyBwcm9maWxlIGZkIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRGVidWcuZHVtcE5hdGl2ZUhlYXAoZGhkLmZkLmdldEZpbGVEZXNjcmlwdG9yKCkpOworICAgICAgICB9CisgICAgfQorCiAgICAgZmluYWwgdm9pZCBoYW5kbGVEaXNwYXRjaFBhY2thZ2VCcm9hZGNhc3QoaW50IGNtZCwgU3RyaW5nW10gcGFja2FnZXMpIHsKICAgICAgICAgYm9vbGVhbiBoYXNQa2dJbmZvID0gZmFsc2U7CiAgICAgICAgIGlmIChwYWNrYWdlcyAhPSBudWxsKSB7CkBAIC0zNjExLDYgKzM3MDAsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWN0aXZpdHlUaHJlYWQgc3lzdGVtTWFpbigpIHsKKyAgICAgICAgSGFyZHdhcmVSZW5kZXJlci5kaXNhYmxlKCk7CiAgICAgICAgIEFjdGl2aXR5VGhyZWFkIHRocmVhZCA9IG5ldyBBY3Rpdml0eVRocmVhZCgpOwogICAgICAgICB0aHJlYWQuYXR0YWNoKHRydWUpOwogICAgICAgICByZXR1cm4gdGhyZWFkOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FsZXJ0RGlhbG9nLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWxlcnREaWFsb2cuamF2YQppbmRleCA2MWE4ZmMzLi5mMDQ3N2U1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWxlcnREaWFsb2cuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWxlcnREaWFsb2cuamF2YQpAQCAtMTYsMTIgKzE2LDE2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hcHA7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuQWxlcnRDb250cm9sbGVyOworCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKQEAgLTMwLDggKzM0LDYgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5BbGVydENvbnRyb2xsZXI7Ci0KIC8qKgogICogQSBzdWJjbGFzcyBvZiBEaWFsb2cgdGhhdCBjYW4gZGlzcGxheSBvbmUsIHR3byBvciB0aHJlZSBidXR0b25zLiBJZiB5b3Ugb25seSB3YW50IHRvCiAgKiBkaXNwbGF5IGEgU3RyaW5nIGluIHRoaXMgZGlhbG9nIGJveCwgdXNlIHRoZSBzZXRNZXNzYWdlKCkgbWV0aG9kLiAgSWYgeW91CkBAIC01Niw3ICs1OCwxMCBAQAogICAgIHByaXZhdGUgQWxlcnRDb250cm9sbGVyIG1BbGVydDsKIAogICAgIHByb3RlY3RlZCBBbGVydERpYWxvZyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0RpYWxvZ19BbGVydCk7CisgICAgICAgIHRoaXMoY29udGV4dCwKKyAgICAgICAgICAgICAgICBjb250ZXh0LmdldEFwcGxpY2F0aW9uSW5mbygpLnRhcmdldFNka1ZlcnNpb24gPj0gQnVpbGQuVkVSU0lPTl9DT0RFUy5IT05FWUNPTUIKKyAgICAgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9Ib2xvX0RpYWxvZ19BbGVydAorICAgICAgICAgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0RpYWxvZ19BbGVydCk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIEFsZXJ0RGlhbG9nKENvbnRleHQgY29udGV4dCwgaW50IHRoZW1lKSB7CkBAIC02NSw3ICs3MCwxMCBAQAogICAgIH0KIAogICAgIHByb3RlY3RlZCBBbGVydERpYWxvZyhDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gY2FuY2VsYWJsZSwgT25DYW5jZWxMaXN0ZW5lciBjYW5jZWxMaXN0ZW5lcikgewotICAgICAgICBzdXBlcihjb250ZXh0LCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0RpYWxvZ19BbGVydCk7CisgICAgICAgIHN1cGVyKGNvbnRleHQsCisgICAgICAgICAgICAgICAgY29udGV4dC5nZXRBcHBsaWNhdGlvbkluZm8oKS50YXJnZXRTZGtWZXJzaW9uID49IEJ1aWxkLlZFUlNJT05fQ09ERVMuSE9ORVlDT01CCisgICAgICAgICAgICAgICAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0hvbG9fRGlhbG9nX0FsZXJ0CisgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0RpYWxvZ19BbGVydCk7CiAgICAgICAgIHNldENhbmNlbGFibGUoY2FuY2VsYWJsZSk7CiAgICAgICAgIHNldE9uQ2FuY2VsTGlzdGVuZXIoY2FuY2VsTGlzdGVuZXIpOwogICAgICAgICBtQWxlcnQgPSBuZXcgQWxlcnRDb250cm9sbGVyKGNvbnRleHQsIHRoaXMsIGdldFdpbmRvdygpKTsKQEAgLTI2NiwxMiArMjc0LDE2IEBACiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBBbGVydENvbnRyb2xsZXIuQWxlcnRQYXJhbXMgUDsKICAgICAgICAgcHJpdmF0ZSBpbnQgbVRoZW1lOworICAgICAgICBwcml2YXRlIENvbnRleHQgbVdyYXBwZWRDb250ZXh0OwogICAgICAgICAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENvbnN0cnVjdG9yIHVzaW5nIGEgY29udGV4dCBmb3IgdGhpcyBidWlsZGVyIGFuZCB0aGUge0BsaW5rIEFsZXJ0RGlhbG9nfSBpdCBjcmVhdGVzLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEJ1aWxkZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICB0aGlzKGNvbnRleHQsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfRGlhbG9nX0FsZXJ0KTsKKyAgICAgICAgICAgIHRoaXMoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRBcHBsaWNhdGlvbkluZm8oKS50YXJnZXRTZGtWZXJzaW9uID49IEJ1aWxkLlZFUlNJT05fQ09ERVMuSE9ORVlDT01CCisgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9Ib2xvX0RpYWxvZ19BbGVydAorICAgICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfRGlhbG9nX0FsZXJ0KTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMjg0LDYgKzI5NiwyMSBAQAogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhIHtAbGluayBDb250ZXh0fSB3aXRoIHRoZSBhcHByb3ByaWF0ZSB0aGVtZSBmb3IgZGlhbG9ncyBjcmVhdGVkIGJ5IHRoaXMgQnVpbGRlci4KKyAgICAgICAgICogQXBwbGljYXRpb25zIHNob3VsZCB1c2UgdGhpcyBDb250ZXh0IGZvciBvYnRhaW5pbmcgTGF5b3V0SW5mbGF0ZXJzIGZvciBpbmZsYXRpbmcgdmlld3MKKyAgICAgICAgICogdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIHJlc3VsdGluZyBkaWFsb2dzLCBhcyBpdCB3aWxsIGNhdXNlIHZpZXdzIHRvIGJlIGluZmxhdGVkIHdpdGgKKyAgICAgICAgICogdGhlIGNvcnJlY3QgdGhlbWUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gQSBDb250ZXh0IGZvciBidWlsdCBEaWFsb2dzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgICAgIGlmIChtV3JhcHBlZENvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1XcmFwcGVkQ29udGV4dCA9IG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKFAubUNvbnRleHQsIG1UaGVtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZWRDb250ZXh0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFNldCB0aGUgdGl0bGUgdXNpbmcgdGhlIGdpdmVuIHJlc291cmNlIGlkLgogICAgICAgICAgKgogICAgICAgICAgKiBAcmV0dXJuIFRoaXMgQnVpbGRlciBvYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluaW5nIG9mIGNhbGxzIHRvIHNldCBtZXRob2RzCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQXBwbGljYXRpb25FcnJvclJlcG9ydC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uRXJyb3JSZXBvcnQuamF2YQppbmRleCAyMzgyNTk2Li4xZTAxMmViIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQXBwbGljYXRpb25FcnJvclJlcG9ydC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkVycm9yUmVwb3J0LmphdmEKQEAgLTE4NCw3ICsxODQsNyBAQAogICAgICAgICBjYW5kaWRhdGUgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChERUZBVUxUX0VSUk9SX1JFQ0VJVkVSX1BST1BFUlRZKTsKICAgICAgICAgcmV0dXJuIGdldEVycm9yUmVwb3J0UmVjZWl2ZXIocG0sIHBhY2thZ2VOYW1lLCBjYW5kaWRhdGUpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiBhY3Rpdml0eSBpbiByZWNlaXZlclBhY2thZ2UgdGhhdCBoYW5kbGVzIEFDVElPTl9BUFBfRVJST1IuCiAgICAgICoKQEAgLTU4MSw2ICs1ODEsOSBAQAogICAgICAgICAgICAgY2FzZSBUWVBFX0JBVFRFUlk6CiAgICAgICAgICAgICAgICAgYmF0dGVyeUluZm8uZHVtcChwdywgcHJlZml4KTsKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9SVU5OSU5HX1NFUlZJQ0U6CisgICAgICAgICAgICAgICAgcnVubmluZ1NlcnZpY2VJbmZvLmR1bXAocHcsIHByZWZpeCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQXBwbGljYXRpb25UaHJlYWROYXRpdmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvblRocmVhZE5hdGl2ZS5qYXZhCmluZGV4IDFjMjAwNjIuLjk1Njg5ZmMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvblRocmVhZE5hdGl2ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvblRocmVhZE5hdGl2ZS5qYXZhCkBAIC00MDMsNiArNDAzLDMyIEBACiAgICAgICAgICAgICBzY2hlZHVsZUNyYXNoKG1zZyk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQorCisgICAgICAgIGNhc2UgRFVNUF9IRUFQX1RSQU5TQUNUSU9OOgorICAgICAgICB7CisgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUFwcGxpY2F0aW9uVGhyZWFkLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgYm9vbGVhbiBtYW5hZ2VkID0gZGF0YS5yZWFkSW50KCkgIT0gMDsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCA9IGRhdGEucmVhZEludCgpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgPyBkYXRhLnJlYWRGaWxlRGVzY3JpcHRvcigpIDogbnVsbDsKKyAgICAgICAgICAgIGR1bXBIZWFwKG1hbmFnZWQsIHBhdGgsIGZkKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBEVU1QX0FDVElWSVRZX1RSQU5TQUNUSU9OOiB7CisgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUFwcGxpY2F0aW9uVGhyZWFkLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQgPSBkYXRhLnJlYWRGaWxlRGVzY3JpcHRvcigpOworICAgICAgICAgICAgZmluYWwgSUJpbmRlciBhY3Rpdml0eSA9IGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gYXJncyA9IGRhdGEucmVhZFN0cmluZ0FycmF5KCk7CisgICAgICAgICAgICBpZiAoZmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGR1bXBBY3Rpdml0eShmZC5nZXRGaWxlRGVzY3JpcHRvcigpLCBhY3Rpdml0eSwgYXJncyk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CkBAIC04MjksNSArODU1LDMzIEBACiAgICAgICAgIGRhdGEucmVjeWNsZSgpOwogICAgICAgICAKICAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wSGVhcChib29sZWFuIG1hbmFnZWQsIFN0cmluZyBwYXRoLAorICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBcHBsaWNhdGlvblRocmVhZC5kZXNjcmlwdG9yKTsKKyAgICAgICAgZGF0YS53cml0ZUludChtYW5hZ2VkID8gMSA6IDApOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nKHBhdGgpOworICAgICAgICBpZiAoZmQgIT0gbnVsbCkgeworICAgICAgICAgICAgZGF0YS53cml0ZUludCgxKTsKKyAgICAgICAgICAgIGZkLndyaXRlVG9QYXJjZWwoZGF0YSwgUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50KDApOworICAgICAgICB9CisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoRFVNUF9IRUFQX1RSQU5TQUNUSU9OLCBkYXRhLCBudWxsLAorICAgICAgICAgICAgICAgIElCaW5kZXIuRkxBR19PTkVXQVkpOworICAgICAgICBkYXRhLnJlY3ljbGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wQWN0aXZpdHkoRmlsZURlc2NyaXB0b3IgZmQsIElCaW5kZXIgdG9rZW4sIFN0cmluZ1tdIGFyZ3MpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXBwbGljYXRpb25UaHJlYWQuZGVzY3JpcHRvcik7CisgICAgICAgIGRhdGEud3JpdGVGaWxlRGVzY3JpcHRvcihmZCk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIodG9rZW4pOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nQXJyYXkoYXJncyk7CisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoRFVNUF9BQ1RJVklUWV9UUkFOU0FDVElPTiwgZGF0YSwgbnVsbCwgMCk7CisgICAgICAgIGRhdGEucmVjeWNsZSgpOworICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0JhY2tTdGFja1JlY29yZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0JhY2tTdGFja1JlY29yZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2Y2MwZjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQmFja1N0YWNrUmVjb3JkLmphdmEKQEAgLTAsMCArMSw1NjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwOworCitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ZpbmFsIGNsYXNzIEJhY2tTdGFja1N0YXRlIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgZmluYWwgaW50W10gbU9wczsKKyAgICBmaW5hbCBpbnQgbVRyYW5zaXRpb247CisgICAgZmluYWwgaW50IG1UcmFuc2l0aW9uU3R5bGU7CisgICAgZmluYWwgU3RyaW5nIG1OYW1lOworICAgIGZpbmFsIGludCBtSW5kZXg7CisgICAgZmluYWwgaW50IG1CcmVhZENydW1iVGl0bGVSZXM7CisgICAgZmluYWwgQ2hhclNlcXVlbmNlIG1CcmVhZENydW1iVGl0bGVUZXh0OworICAgIGZpbmFsIGludCBtQnJlYWRDcnVtYlNob3J0VGl0bGVSZXM7CisgICAgZmluYWwgQ2hhclNlcXVlbmNlIG1CcmVhZENydW1iU2hvcnRUaXRsZVRleHQ7CisKKyAgICBwdWJsaWMgQmFja1N0YWNrU3RhdGUoRnJhZ21lbnRNYW5hZ2VySW1wbCBmbSwgQmFja1N0YWNrUmVjb3JkIGJzZSkgeworICAgICAgICBpbnQgbnVtUmVtb3ZlZCA9IDA7CisgICAgICAgIEJhY2tTdGFja1JlY29yZC5PcCBvcCA9IGJzZS5tSGVhZDsKKyAgICAgICAgd2hpbGUgKG9wICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChvcC5yZW1vdmVkICE9IG51bGwpIG51bVJlbW92ZWQgKz0gb3AucmVtb3ZlZC5zaXplKCk7CisgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgbU9wcyA9IG5ldyBpbnRbYnNlLm1OdW1PcCo1ICsgbnVtUmVtb3ZlZF07CisKKyAgICAgICAgaWYgKCFic2UubUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3Qgb24gYmFjayBzdGFjayIpOworICAgICAgICB9CisKKyAgICAgICAgb3AgPSBic2UubUhlYWQ7CisgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICB3aGlsZSAob3AgIT0gbnVsbCkgeworICAgICAgICAgICAgbU9wc1twb3MrK10gPSBvcC5jbWQ7CisgICAgICAgICAgICBtT3BzW3BvcysrXSA9IG9wLmZyYWdtZW50Lm1JbmRleDsKKyAgICAgICAgICAgIG1PcHNbcG9zKytdID0gb3AuZW50ZXJBbmltOworICAgICAgICAgICAgbU9wc1twb3MrK10gPSBvcC5leGl0QW5pbTsKKyAgICAgICAgICAgIGlmIChvcC5yZW1vdmVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG9wLnJlbW92ZWQuc2l6ZSgpOworICAgICAgICAgICAgICAgIG1PcHNbcG9zKytdID0gTjsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG1PcHNbcG9zKytdID0gb3AucmVtb3ZlZC5nZXQoaSkubUluZGV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU9wc1twb3MrK10gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICB9CisgICAgICAgIG1UcmFuc2l0aW9uID0gYnNlLm1UcmFuc2l0aW9uOworICAgICAgICBtVHJhbnNpdGlvblN0eWxlID0gYnNlLm1UcmFuc2l0aW9uU3R5bGU7CisgICAgICAgIG1OYW1lID0gYnNlLm1OYW1lOworICAgICAgICBtSW5kZXggPSBic2UubUluZGV4OworICAgICAgICBtQnJlYWRDcnVtYlRpdGxlUmVzID0gYnNlLm1CcmVhZENydW1iVGl0bGVSZXM7CisgICAgICAgIG1CcmVhZENydW1iVGl0bGVUZXh0ID0gYnNlLm1CcmVhZENydW1iVGl0bGVUZXh0OworICAgICAgICBtQnJlYWRDcnVtYlNob3J0VGl0bGVSZXMgPSBic2UubUJyZWFkQ3J1bWJTaG9ydFRpdGxlUmVzOworICAgICAgICBtQnJlYWRDcnVtYlNob3J0VGl0bGVUZXh0ID0gYnNlLm1CcmVhZENydW1iU2hvcnRUaXRsZVRleHQ7CisgICAgfQorCisgICAgcHVibGljIEJhY2tTdGFja1N0YXRlKFBhcmNlbCBpbikgeworICAgICAgICBtT3BzID0gaW4uY3JlYXRlSW50QXJyYXkoKTsKKyAgICAgICAgbVRyYW5zaXRpb24gPSBpbi5yZWFkSW50KCk7CisgICAgICAgIG1UcmFuc2l0aW9uU3R5bGUgPSBpbi5yZWFkSW50KCk7CisgICAgICAgIG1OYW1lID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICBtSW5kZXggPSBpbi5yZWFkSW50KCk7CisgICAgICAgIG1CcmVhZENydW1iVGl0bGVSZXMgPSBpbi5yZWFkSW50KCk7CisgICAgICAgIG1CcmVhZENydW1iVGl0bGVUZXh0ID0gVGV4dFV0aWxzLkNIQVJfU0VRVUVOQ0VfQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgbUJyZWFkQ3J1bWJTaG9ydFRpdGxlUmVzID0gaW4ucmVhZEludCgpOworICAgICAgICBtQnJlYWRDcnVtYlNob3J0VGl0bGVUZXh0ID0gVGV4dFV0aWxzLkNIQVJfU0VRVUVOQ0VfQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmFja1N0YWNrUmVjb3JkIGluc3RhbnRpYXRlKEZyYWdtZW50TWFuYWdlckltcGwgZm0pIHsKKyAgICAgICAgQmFja1N0YWNrUmVjb3JkIGJzZSA9IG5ldyBCYWNrU3RhY2tSZWNvcmQoZm0pOworICAgICAgICBpbnQgcG9zID0gMDsKKyAgICAgICAgd2hpbGUgKHBvcyA8IG1PcHMubGVuZ3RoKSB7CisgICAgICAgICAgICBCYWNrU3RhY2tSZWNvcmQuT3Agb3AgPSBuZXcgQmFja1N0YWNrUmVjb3JkLk9wKCk7CisgICAgICAgICAgICBvcC5jbWQgPSBtT3BzW3BvcysrXTsKKyAgICAgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihGcmFnbWVudE1hbmFnZXJJbXBsLlRBRywKKyAgICAgICAgICAgICAgICAgICAgIkJTRSAiICsgYnNlICsgIiBzZXQgYmFzZSBmcmFnbWVudCAjIiArIG1PcHNbcG9zXSk7CisgICAgICAgICAgICBGcmFnbWVudCBmID0gZm0ubUFjdGl2ZS5nZXQobU9wc1twb3MrK10pOworICAgICAgICAgICAgb3AuZnJhZ21lbnQgPSBmOworICAgICAgICAgICAgb3AuZW50ZXJBbmltID0gbU9wc1twb3MrK107CisgICAgICAgICAgICBvcC5leGl0QW5pbSA9IG1PcHNbcG9zKytdOworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtT3BzW3BvcysrXTsKKyAgICAgICAgICAgIGlmIChOID4gMCkgeworICAgICAgICAgICAgICAgIG9wLnJlbW92ZWQgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PihOKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihGcmFnbWVudE1hbmFnZXJJbXBsLlRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlNFICIgKyBic2UgKyAiIHNldCByZW1vdmUgZnJhZ21lbnQgIyIgKyBtT3BzW3Bvc10pOworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCByID0gZm0ubUFjdGl2ZS5nZXQobU9wc1twb3MrK10pOworICAgICAgICAgICAgICAgICAgICBvcC5yZW1vdmVkLmFkZChyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBic2UuYWRkT3Aob3ApOworICAgICAgICB9CisgICAgICAgIGJzZS5tVHJhbnNpdGlvbiA9IG1UcmFuc2l0aW9uOworICAgICAgICBic2UubVRyYW5zaXRpb25TdHlsZSA9IG1UcmFuc2l0aW9uU3R5bGU7CisgICAgICAgIGJzZS5tTmFtZSA9IG1OYW1lOworICAgICAgICBic2UubUluZGV4ID0gbUluZGV4OworICAgICAgICBic2UubUFkZFRvQmFja1N0YWNrID0gdHJ1ZTsKKyAgICAgICAgYnNlLm1CcmVhZENydW1iVGl0bGVSZXMgPSBtQnJlYWRDcnVtYlRpdGxlUmVzOworICAgICAgICBic2UubUJyZWFkQ3J1bWJUaXRsZVRleHQgPSBtQnJlYWRDcnVtYlRpdGxlVGV4dDsKKyAgICAgICAgYnNlLm1CcmVhZENydW1iU2hvcnRUaXRsZVJlcyA9IG1CcmVhZENydW1iU2hvcnRUaXRsZVJlczsKKyAgICAgICAgYnNlLm1CcmVhZENydW1iU2hvcnRUaXRsZVRleHQgPSBtQnJlYWRDcnVtYlNob3J0VGl0bGVUZXh0OworICAgICAgICBic2UuYnVtcEJhY2tTdGFja05lc3RpbmcoMSk7CisgICAgICAgIHJldHVybiBic2U7CisgICAgfQorCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgZGVzdC53cml0ZUludEFycmF5KG1PcHMpOworICAgICAgICBkZXN0LndyaXRlSW50KG1UcmFuc2l0aW9uKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtTmFtZSk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUluZGV4KTsKKyAgICAgICAgZGVzdC53cml0ZUludChtQnJlYWRDcnVtYlRpdGxlUmVzKTsKKyAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwobUJyZWFkQ3J1bWJUaXRsZVRleHQsIGRlc3QsIDApOworICAgICAgICBkZXN0LndyaXRlSW50KG1CcmVhZENydW1iU2hvcnRUaXRsZVJlcyk7CisgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKG1CcmVhZENydW1iU2hvcnRUaXRsZVRleHQsIGRlc3QsIDApOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPEJhY2tTdGFja1N0YXRlPiBDUkVBVE9SCisgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8QmFja1N0YWNrU3RhdGU+KCkgeworICAgICAgICBwdWJsaWMgQmFja1N0YWNrU3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQmFja1N0YWNrU3RhdGUoaW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJhY2tTdGFja1N0YXRlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQmFja1N0YWNrU3RhdGVbc2l6ZV07CisgICAgICAgIH0KKyAgICB9OworfQorCisvKioKKyAqIEBoaWRlIEVudHJ5IG9mIGFuIG9wZXJhdGlvbiBvbiB0aGUgZnJhZ21lbnQgYmFjayBzdGFjay4KKyAqLworZmluYWwgY2xhc3MgQmFja1N0YWNrUmVjb3JkIGltcGxlbWVudHMgRnJhZ21lbnRUcmFuc2FjdGlvbiwKKyAgICAgICAgRnJhZ21lbnRNYW5hZ2VyLkJhY2tTdGFja0VudHJ5LCBSdW5uYWJsZSB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmFja1N0YWNrRW50cnkiOworCisgICAgZmluYWwgRnJhZ21lbnRNYW5hZ2VySW1wbCBtTWFuYWdlcjsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BfTlVMTCA9IDA7CisgICAgc3RhdGljIGZpbmFsIGludCBPUF9BREQgPSAxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BfUkVQTEFDRSA9IDI7CisgICAgc3RhdGljIGZpbmFsIGludCBPUF9SRU1PVkUgPSAzOworICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BfSElERSA9IDQ7CisgICAgc3RhdGljIGZpbmFsIGludCBPUF9TSE9XID0gNTsKKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBPcCB7CisgICAgICAgIE9wIG5leHQ7CisgICAgICAgIE9wIHByZXY7CisgICAgICAgIGludCBjbWQ7CisgICAgICAgIEZyYWdtZW50IGZyYWdtZW50OworICAgICAgICBpbnQgZW50ZXJBbmltOworICAgICAgICBpbnQgZXhpdEFuaW07CisgICAgICAgIEFycmF5TGlzdDxGcmFnbWVudD4gcmVtb3ZlZDsKKyAgICB9CisKKyAgICBPcCBtSGVhZDsKKyAgICBPcCBtVGFpbDsKKyAgICBpbnQgbU51bU9wOworICAgIGludCBtRW50ZXJBbmltOworICAgIGludCBtRXhpdEFuaW07CisgICAgaW50IG1UcmFuc2l0aW9uOworICAgIGludCBtVHJhbnNpdGlvblN0eWxlOworICAgIGJvb2xlYW4gbUFkZFRvQmFja1N0YWNrOworICAgIFN0cmluZyBtTmFtZTsKKyAgICBib29sZWFuIG1Db21taXR0ZWQ7CisgICAgaW50IG1JbmRleDsKKworICAgIGludCBtQnJlYWRDcnVtYlRpdGxlUmVzOworICAgIENoYXJTZXF1ZW5jZSBtQnJlYWRDcnVtYlRpdGxlVGV4dDsKKyAgICBpbnQgbUJyZWFkQ3J1bWJTaG9ydFRpdGxlUmVzOworICAgIENoYXJTZXF1ZW5jZSBtQnJlYWRDcnVtYlNob3J0VGl0bGVUZXh0OworCisgICAgcHVibGljIEJhY2tTdGFja1JlY29yZChGcmFnbWVudE1hbmFnZXJJbXBsIG1hbmFnZXIpIHsKKyAgICAgICAgbU1hbmFnZXIgPSBtYW5hZ2VyOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBtSW5kZXg7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRCcmVhZENydW1iVGl0bGUoKSB7CisgICAgICAgIGlmIChtQnJlYWRDcnVtYlRpdGxlUmVzICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBtTWFuYWdlci5tQWN0aXZpdHkuZ2V0VGV4dChtQnJlYWRDcnVtYlRpdGxlUmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUJyZWFkQ3J1bWJUaXRsZVRleHQ7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRCcmVhZENydW1iU2hvcnRUaXRsZSgpIHsKKyAgICAgICAgaWYgKG1CcmVhZENydW1iU2hvcnRUaXRsZVJlcyAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbU1hbmFnZXIubUFjdGl2aXR5LmdldFRleHQobUJyZWFkQ3J1bWJTaG9ydFRpdGxlUmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUJyZWFkQ3J1bWJTaG9ydFRpdGxlVGV4dDsKKyAgICB9CisKKyAgICB2b2lkIGFkZE9wKE9wIG9wKSB7CisgICAgICAgIGlmIChtSGVhZCA9PSBudWxsKSB7CisgICAgICAgICAgICBtSGVhZCA9IG1UYWlsID0gb3A7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcC5wcmV2ID0gbVRhaWw7CisgICAgICAgICAgICBtVGFpbC5uZXh0ID0gb3A7CisgICAgICAgICAgICBtVGFpbCA9IG9wOworICAgICAgICB9CisgICAgICAgIG9wLmVudGVyQW5pbSA9IG1FbnRlckFuaW07CisgICAgICAgIG9wLmV4aXRBbmltID0gbUV4aXRBbmltOworICAgICAgICBtTnVtT3ArKzsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGQoRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgZG9BZGRPcCgwLCBmcmFnbWVudCwgdGFnLCBPUF9BREQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGQoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgZG9BZGRPcChjb250YWluZXJWaWV3SWQsIGZyYWdtZW50LCBudWxsLCBPUF9BREQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGQoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgZG9BZGRPcChjb250YWluZXJWaWV3SWQsIGZyYWdtZW50LCB0YWcsIE9QX0FERCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb0FkZE9wKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50LCBTdHJpbmcgdGFnLCBpbnQgb3BjbWQpIHsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCBhbHJlYWR5IGFkZGVkOiAiICsgZnJhZ21lbnQpOworICAgICAgICB9CisgICAgICAgIGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9IG1NYW5hZ2VyLm1BY3Rpdml0eTsKKyAgICAgICAgZnJhZ21lbnQubUZyYWdtZW50TWFuYWdlciA9IG1NYW5hZ2VyOworCisgICAgICAgIGlmICh0YWcgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1UYWcgIT0gbnVsbCAmJiAhdGFnLmVxdWFscyhmcmFnbWVudC5tVGFnKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbid0IGNoYW5nZSB0YWcgb2YgZnJhZ21lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBmcmFnbWVudCArICI6IHdhcyAiICsgZnJhZ21lbnQubVRhZworICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vdyAiICsgdGFnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYWdtZW50Lm1UYWcgPSB0YWc7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29udGFpbmVyVmlld0lkICE9IDApIHsKKyAgICAgICAgICAgIGlmIChmcmFnbWVudC5tRnJhZ21lbnRJZCAhPSAwICYmIGZyYWdtZW50Lm1GcmFnbWVudElkICE9IGNvbnRhaW5lclZpZXdJZCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbid0IGNoYW5nZSBjb250YWluZXIgSUQgb2YgZnJhZ21lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBmcmFnbWVudCArICI6IHdhcyAiICsgZnJhZ21lbnQubUZyYWdtZW50SWQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBub3cgIiArIGNvbnRhaW5lclZpZXdJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmFnbWVudC5tQ29udGFpbmVySWQgPSBmcmFnbWVudC5tRnJhZ21lbnRJZCA9IGNvbnRhaW5lclZpZXdJZDsKKyAgICAgICAgfQorCisgICAgICAgIE9wIG9wID0gbmV3IE9wKCk7CisgICAgICAgIG9wLmNtZCA9IG9wY21kOworICAgICAgICBvcC5mcmFnbWVudCA9IGZyYWdtZW50OworICAgICAgICBhZGRPcChvcCk7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVwbGFjZShpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICByZXR1cm4gcmVwbGFjZShjb250YWluZXJWaWV3SWQsIGZyYWdtZW50LCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiByZXBsYWNlKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50LCBTdHJpbmcgdGFnKSB7CisgICAgICAgIGlmIChjb250YWluZXJWaWV3SWQgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTXVzdCB1c2Ugbm9uLXplcm8gY29udGFpbmVyVmlld0lkIik7CisgICAgICAgIH0KKworICAgICAgICBkb0FkZE9wKGNvbnRhaW5lclZpZXdJZCwgZnJhZ21lbnQsIHRhZywgT1BfUkVQTEFDRSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHJlbW92ZShGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICBpZiAoZnJhZ21lbnQubUltbWVkaWF0ZUFjdGl2aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdtZW50IG5vdCBhZGRlZDogIiArIGZyYWdtZW50KTsKKyAgICAgICAgfQorICAgICAgICBmcmFnbWVudC5tSW1tZWRpYXRlQWN0aXZpdHkgPSBudWxsOworCisgICAgICAgIE9wIG9wID0gbmV3IE9wKCk7CisgICAgICAgIG9wLmNtZCA9IE9QX1JFTU9WRTsKKyAgICAgICAgb3AuZnJhZ21lbnQgPSBmcmFnbWVudDsKKyAgICAgICAgYWRkT3Aob3ApOworCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGhpZGUoRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCBub3QgYWRkZWQ6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIH0KKworICAgICAgICBPcCBvcCA9IG5ldyBPcCgpOworICAgICAgICBvcC5jbWQgPSBPUF9ISURFOworICAgICAgICBvcC5mcmFnbWVudCA9IGZyYWdtZW50OworICAgICAgICBhZGRPcChvcCk7CisKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2hvdyhGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICBpZiAoZnJhZ21lbnQubUltbWVkaWF0ZUFjdGl2aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdtZW50IG5vdCBhZGRlZDogIiArIGZyYWdtZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIE9wIG9wID0gbmV3IE9wKCk7CisgICAgICAgIG9wLmNtZCA9IE9QX1NIT1c7CisgICAgICAgIG9wLmZyYWdtZW50ID0gZnJhZ21lbnQ7CisgICAgICAgIGFkZE9wKG9wKTsKKworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzZXRDdXN0b21BbmltYXRpb25zKGludCBlbnRlciwgaW50IGV4aXQpIHsKKyAgICAgICAgbUVudGVyQW5pbSA9IGVudGVyOworICAgICAgICBtRXhpdEFuaW0gPSBleGl0OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzZXRUcmFuc2l0aW9uKGludCB0cmFuc2l0aW9uKSB7CisgICAgICAgIG1UcmFuc2l0aW9uID0gdHJhbnNpdGlvbjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0VHJhbnNpdGlvblN0eWxlKGludCBzdHlsZVJlcykgeworICAgICAgICBtVHJhbnNpdGlvblN0eWxlID0gc3R5bGVSZXM7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGFkZFRvQmFja1N0YWNrKFN0cmluZyBuYW1lKSB7CisgICAgICAgIG1BZGRUb0JhY2tTdGFjayA9IHRydWU7CisgICAgICAgIG1OYW1lID0gbmFtZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0QnJlYWRDcnVtYlRpdGxlKGludCByZXMpIHsKKyAgICAgICAgbUJyZWFkQ3J1bWJUaXRsZVJlcyA9IHJlczsKKyAgICAgICAgbUJyZWFkQ3J1bWJUaXRsZVRleHQgPSBudWxsOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzZXRCcmVhZENydW1iVGl0bGUoQ2hhclNlcXVlbmNlIHRleHQpIHsKKyAgICAgICAgbUJyZWFkQ3J1bWJUaXRsZVJlcyA9IDA7CisgICAgICAgIG1CcmVhZENydW1iVGl0bGVUZXh0ID0gdGV4dDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0QnJlYWRDcnVtYlNob3J0VGl0bGUoaW50IHJlcykgeworICAgICAgICBtQnJlYWRDcnVtYlNob3J0VGl0bGVSZXMgPSByZXM7CisgICAgICAgIG1CcmVhZENydW1iU2hvcnRUaXRsZVRleHQgPSBudWxsOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzZXRCcmVhZENydW1iU2hvcnRUaXRsZShDaGFyU2VxdWVuY2UgdGV4dCkgeworICAgICAgICBtQnJlYWRDcnVtYlNob3J0VGl0bGVSZXMgPSAwOworICAgICAgICBtQnJlYWRDcnVtYlNob3J0VGl0bGVUZXh0ID0gdGV4dDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgdm9pZCBidW1wQmFja1N0YWNrTmVzdGluZyhpbnQgYW10KSB7CisgICAgICAgIGlmICghbUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KFRBRywgIkJ1bXAgbmVzdGluZyBpbiAiICsgdGhpcworICAgICAgICAgICAgICAgICsgIiBieSAiICsgYW10KTsKKyAgICAgICAgT3Agb3AgPSBtSGVhZDsKKyAgICAgICAgd2hpbGUgKG9wICE9IG51bGwpIHsKKyAgICAgICAgICAgIG9wLmZyYWdtZW50Lm1CYWNrU3RhY2tOZXN0aW5nICs9IGFtdDsKKyAgICAgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihUQUcsICJCdW1wIG5lc3Rpbmcgb2YgIgorICAgICAgICAgICAgICAgICAgICArIG9wLmZyYWdtZW50ICsgIiB0byAiICsgb3AuZnJhZ21lbnQubUJhY2tTdGFja05lc3RpbmcpOworICAgICAgICAgICAgaWYgKG9wLnJlbW92ZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9b3AucmVtb3ZlZC5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IHIgPSBvcC5yZW1vdmVkLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgci5tQmFja1N0YWNrTmVzdGluZyArPSBhbXQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihUQUcsICJCdW1wIG5lc3Rpbmcgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgciArICIgdG8gIiArIHIubUJhY2tTdGFja05lc3RpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgY29tbWl0KCkgeworICAgICAgICBpZiAobUNvbW1pdHRlZCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY29tbWl0IGFscmVhZHkgY2FsbGVkIik7CisgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihUQUcsICJDb21taXQ6ICIgKyB0aGlzKTsKKyAgICAgICAgbUNvbW1pdHRlZCA9IHRydWU7CisgICAgICAgIGlmIChtQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgIG1JbmRleCA9IG1NYW5hZ2VyLmFsbG9jQmFja1N0YWNrSW5kZXgodGhpcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW5kZXggPSAtMTsKKyAgICAgICAgfQorICAgICAgICBtTWFuYWdlci5lbnF1ZXVlQWN0aW9uKHRoaXMpOworICAgICAgICByZXR1cm4gbUluZGV4OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KFRBRywgIlJ1bjogIiArIHRoaXMpOworCisgICAgICAgIGlmIChtQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgIGlmIChtSW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkVG9CYWNrU3RhY2soKSBjYWxsZWQgYWZ0ZXIgY29tbWl0KCkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJ1bXBCYWNrU3RhY2tOZXN0aW5nKDEpOworCisgICAgICAgIE9wIG9wID0gbUhlYWQ7CisgICAgICAgIHdoaWxlIChvcCAhPSBudWxsKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wLmNtZCkgeworICAgICAgICAgICAgICAgIGNhc2UgT1BfQUREOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgZi5tTmV4dEFuaW0gPSBvcC5lbnRlckFuaW07CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmFkZEZyYWdtZW50KGYsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfUkVQTEFDRTogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChtTWFuYWdlci5tQWRkZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1NYW5hZ2VyLm1BZGRlZC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IG9sZCA9IG1NYW5hZ2VyLm1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KFRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPUF9SRVBMQUNFOiBhZGRpbmc9IiArIGYgKyAiIG9sZD0iICsgb2xkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkLm1Db250YWluZXJJZCA9PSBmLm1Db250YWluZXJJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AucmVtb3ZlZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC5yZW1vdmVkID0gbmV3IEFycmF5TGlzdDxGcmFnbWVudD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC5yZW1vdmVkLmFkZChvbGQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQubU5leHRBbmltID0gb3AuZXhpdEFuaW07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZC5tQmFja1N0YWNrTmVzdGluZyArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KFRBRywgIkJ1bXAgbmVzdGluZyBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb2xkICsgIiB0byAiICsgb2xkLm1CYWNrU3RhY2tOZXN0aW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5yZW1vdmVGcmFnbWVudChvbGQsIG1UcmFuc2l0aW9uLCBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZi5tTmV4dEFuaW0gPSBvcC5lbnRlckFuaW07CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmFkZEZyYWdtZW50KGYsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfUkVNT1ZFOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgZi5tTmV4dEFuaW0gPSBvcC5leGl0QW5pbTsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIucmVtb3ZlRnJhZ21lbnQoZiwgbVRyYW5zaXRpb24sIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9ISURFOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgZi5tTmV4dEFuaW0gPSBvcC5leGl0QW5pbTsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIuaGlkZUZyYWdtZW50KGYsIG1UcmFuc2l0aW9uLCBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfU0hPVzogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGYubU5leHRBbmltID0gb3AuZW50ZXJBbmltOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5zaG93RnJhZ21lbnQoZiwgbVRyYW5zaXRpb24sIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGNtZDogIiArIG9wLmNtZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgIH0KKworICAgICAgICBtTWFuYWdlci5tb3ZlVG9TdGF0ZShtTWFuYWdlci5tQ3VyU3RhdGUsIG1UcmFuc2l0aW9uLAorICAgICAgICAgICAgICAgIG1UcmFuc2l0aW9uU3R5bGUsIHRydWUpOworCisgICAgICAgIGlmIChtQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgIG1NYW5hZ2VyLmFkZEJhY2tTdGFja1N0YXRlKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9wRnJvbUJhY2tTdGFjayhib29sZWFuIGRvU3RhdGVNb3ZlKSB7CisgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihUQUcsICJwb3BGcm9tQmFja1N0YWNrOiAiICsgdGhpcyk7CisKKyAgICAgICAgYnVtcEJhY2tTdGFja05lc3RpbmcoLTEpOworCisgICAgICAgIE9wIG9wID0gbVRhaWw7CisgICAgICAgIHdoaWxlIChvcCAhPSBudWxsKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wLmNtZCkgeworICAgICAgICAgICAgICAgIGNhc2UgT1BfQUREOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgZi5tSW1tZWRpYXRlQWN0aXZpdHkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5yZW1vdmVGcmFnbWVudChmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwucmV2ZXJzZVRyYW5zaXQobVRyYW5zaXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9SRVBMQUNFOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgZi5tSW1tZWRpYXRlQWN0aXZpdHkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5yZW1vdmVGcmFnbWVudChmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwucmV2ZXJzZVRyYW5zaXQobVRyYW5zaXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgICAgICBpZiAob3AucmVtb3ZlZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8b3AucmVtb3ZlZC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IG9sZCA9IG9wLnJlbW92ZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubUltbWVkaWF0ZUFjdGl2aXR5ID0gbU1hbmFnZXIubUFjdGl2aXR5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmFkZEZyYWdtZW50KG9sZCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1JFTU9WRTogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGYubUltbWVkaWF0ZUFjdGl2aXR5ID0gbU1hbmFnZXIubUFjdGl2aXR5OworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5hZGRGcmFnbWVudChmLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX0hJREU6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5zaG93RnJhZ21lbnQoZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXJJbXBsLnJldmVyc2VUcmFuc2l0KG1UcmFuc2l0aW9uKSwgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX1NIT1c6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5oaWRlRnJhZ21lbnQoZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXJJbXBsLnJldmVyc2VUcmFuc2l0KG1UcmFuc2l0aW9uKSwgbVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gY21kOiAiICsgb3AuY21kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9wID0gb3AucHJldjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkb1N0YXRlTW92ZSkgeworICAgICAgICAgICAgbU1hbmFnZXIubW92ZVRvU3RhdGUobU1hbmFnZXIubUN1clN0YXRlLAorICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXJJbXBsLnJldmVyc2VUcmFuc2l0KG1UcmFuc2l0aW9uKSwgbVRyYW5zaXRpb25TdHlsZSwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUluZGV4ID49IDApIHsKKyAgICAgICAgICAgIG1NYW5hZ2VyLmZyZWVCYWNrU3RhY2tJbmRleChtSW5kZXgpOworICAgICAgICAgICAgbUluZGV4ID0gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFRyYW5zaXRpb24oKSB7CisgICAgICAgIHJldHVybiBtVHJhbnNpdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFRyYW5zaXRpb25TdHlsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UcmFuc2l0aW9uU3R5bGU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIG1OdW1PcCA9PSAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0NvbnRleHRJbXBsLmphdmEKaW5kZXggM2MyYTdiOC4uOTE4ZWNmMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0NvbnRleHRJbXBsLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0NvbnRleHRJbXBsLmphdmEKQEAgLTU2LDExICs1NiwxNCBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeURldGVjdG9yOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uSUNvdW50cnlEZXRlY3RvcjsKIGltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLklMb2NhdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CkBAIC03Miw2ICs3NSw3IEBACiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5JV2lmaU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuRHJvcEJveE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKQEAgLTg4LDcgKzkyLDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkZpbGVVdGlscy5GaWxlU3RhdHVzOwogaW1wb3J0IGFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudGV4dC5DbGlwYm9hcmRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwYm9hcmRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BbmRyb2lkUnVudGltZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOwpAQCAtMTcwLDYgKzE3NCw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgVGhyb3R0bGVNYW5hZ2VyIHNUaHJvdHRsZU1hbmFnZXI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgV2lmaU1hbmFnZXIgc1dpZmlNYW5hZ2VyOwogICAgIHByaXZhdGUgc3RhdGljIExvY2F0aW9uTWFuYWdlciBzTG9jYXRpb25NYW5hZ2VyOworICAgIHByaXZhdGUgc3RhdGljIENvdW50cnlEZXRlY3RvciBzQ291bnRyeURldGVjdG9yOwogICAgIHByaXZhdGUgc3RhdGljIE5mY01hbmFnZXIgc05mY01hbmFnZXI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFNoYXJlZFByZWZlcmVuY2VzSW1wbD4gc1NoYXJlZFByZWZzID0KICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgU2hhcmVkUHJlZmVyZW5jZXNJbXBsPigpOwpAQCAtMjEyLDIzICsyMTcsOCBAQAogICAgIHByaXZhdGUgRmlsZSBtRXh0ZXJuYWxGaWxlc0RpcjsKICAgICBwcml2YXRlIEZpbGUgbUV4dGVybmFsQ2FjaGVEaXI7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIHNJbnN0YW5jZUNvdW50ID0gMDsKLQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX0ZJTEVfTElTVCA9IHt9OwogCi0gICAgLy8gRm9yIGRlYnVnIG9ubHkKLSAgICAvKgotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgICAgIC0tc0luc3RhbmNlQ291bnQ7Ci0gICAgfQotICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0SW5zdGFuY2VDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIHNJbnN0YW5jZUNvdW50OwotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBBc3NldE1hbmFnZXIgZ2V0QXNzZXRzKCkgewogICAgICAgICByZXR1cm4gbVJlc291cmNlcy5nZXRBc3NldHMoKTsKQEAgLTU0NSw2ICs1MzUsMTUgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUsIGludCBtb2RlLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksCisgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgRmlsZSBmID0gdmFsaWRhdGVGaWxlUGF0aChuYW1lLCB0cnVlKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShmLmdldFBhdGgoKSwgZmFjdG9yeSwgZXJyb3JIYW5kbGVyKTsKKyAgICAgICAgc2V0RmlsZVBlcm1pc3Npb25zRnJvbU1vZGUoZi5nZXRQYXRoKCksIG1vZGUsIDApOworICAgICAgICByZXR1cm4gZGI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZGVsZXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEZpbGUgZiA9IHZhbGlkYXRlRmlsZVBhdGgobmFtZSwgZmFsc2UpOwpAQCAtNjIyLDcgKzYyMSw4IEBACiAgICAgICAgICAgICAgICAgICAgICsgIiBJcyB0aGlzIHJlYWxseSB3aGF0IHlvdSB3YW50PyIpOwogICAgICAgICB9CiAgICAgICAgIG1NYWluVGhyZWFkLmdldEluc3RydW1lbnRhdGlvbigpLmV4ZWNTdGFydEFjdGl2aXR5KAotICAgICAgICAgICAgZ2V0T3V0ZXJDb250ZXh0KCksIG1NYWluVGhyZWFkLmdldEFwcGxpY2F0aW9uVGhyZWFkKCksIG51bGwsIG51bGwsIGludGVudCwgLTEpOworICAgICAgICAgICAgZ2V0T3V0ZXJDb250ZXh0KCksIG1NYWluVGhyZWFkLmdldEFwcGxpY2F0aW9uVGhyZWFkKCksIG51bGwsCisgICAgICAgICAgICAoQWN0aXZpdHkpbnVsbCwgaW50ZW50LCAtMSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC05NDYsNiArOTQ2LDggQEAKICAgICAgICAgICAgIHJldHVybiBBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZSh0aGlzKTsKICAgICAgICAgfSBlbHNlIGlmIChMT0NBVElPTl9TRVJWSUNFLmVxdWFscyhuYW1lKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldExvY2F0aW9uTWFuYWdlcigpOworICAgICAgICB9IGVsc2UgaWYgKENPVU5UUllfREVURUNUT1IuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q291bnRyeURldGVjdG9yKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoU0VBUkNIX1NFUlZJQ0UuZXF1YWxzKG5hbWUpKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0U2VhcmNoTWFuYWdlcigpOwogICAgICAgICB9IGVsc2UgaWYgKFNFTlNPUl9TRVJWSUNFLmVxdWFscyhuYW1lKSkgewpAQCAtMTA2Niw4ICsxMDY4LDEzIEBACiAgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25NYW5hZ2VyIGdldE5vdGlmaWNhdGlvbk1hbmFnZXIoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmMpIHsKICAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uTWFuYWdlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ29udGV4dCBvdXRlckNvbnRleHQgPSBnZXRPdXRlckNvbnRleHQoKTsKICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlciA9IG5ldyBOb3RpZmljYXRpb25NYW5hZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoZ2V0T3V0ZXJDb250ZXh0KCksIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfRGlhbG9nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKG91dGVyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXJDb250ZXh0LmdldEFwcGxpY2F0aW9uSW5mbygpLnRhcmdldFNka1ZlcnNpb24gPj0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkLlZFUlNJT05fQ09ERVMuSE9ORVlDT01CCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9Ib2xvX0RpYWxvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfRGlhbG9nKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1NYWluVGhyZWFkLmdldEhhbmRsZXIoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTExMTQsNiArMTEyMSwxNyBAQAogICAgICAgICByZXR1cm4gc0xvY2F0aW9uTWFuYWdlcjsKICAgICB9CiAKKyAgICBwcml2YXRlIENvdW50cnlEZXRlY3RvciBnZXRDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc1N5bmMpIHsKKyAgICAgICAgICAgIGlmIChzQ291bnRyeURldGVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENPVU5UUllfREVURUNUT1IpOworICAgICAgICAgICAgICAgIElDb3VudHJ5RGV0ZWN0b3Igc2VydmljZSA9IElDb3VudHJ5RGV0ZWN0b3IuU3R1Yi5hc0ludGVyZmFjZShiKTsKKyAgICAgICAgICAgICAgICBzQ291bnRyeURldGVjdG9yID0gbmV3IENvdW50cnlEZXRlY3RvcihzZXJ2aWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc0NvdW50cnlEZXRlY3RvcjsKKyAgICB9CisKICAgICBwcml2YXRlIFNlYXJjaE1hbmFnZXIgZ2V0U2VhcmNoTWFuYWdlcigpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewogICAgICAgICAgICAgaWYgKG1TZWFyY2hNYW5hZ2VyID09IG51bGwpIHsKQEAgLTE1MDIsOCArMTUyMCw2IEBACiAgICAgfQogCiAgICAgQ29udGV4dEltcGwoKSB7Ci0gICAgICAgIC8vIEZvciBkZWJ1ZyBvbmx5Ci0gICAgICAgIC8vKytzSW5zdGFuY2VDb3VudDsKICAgICAgICAgbU91dGVyQ29udGV4dCA9IHRoaXM7CiAgICAgfQogCkBAIC0xNTE0LDcgKzE1MzAsNiBAQAogICAgICAqIEBwYXJhbSBjb250ZXh0IEV4aXN0aW5nIGFwcGxpY2F0aW9uIGNvbnRleHQuCiAgICAgICovCiAgICAgcHVibGljIENvbnRleHRJbXBsKENvbnRleHRJbXBsIGNvbnRleHQpIHsKLSAgICAgICAgKytzSW5zdGFuY2VDb3VudDsKICAgICAgICAgbVBhY2thZ2VJbmZvID0gY29udGV4dC5tUGFja2FnZUluZm87CiAgICAgICAgIG1SZXNvdXJjZXMgPSBjb250ZXh0Lm1SZXNvdXJjZXM7CiAgICAgICAgIG1NYWluVGhyZWFkID0gY29udGV4dC5tTWFpblRocmVhZDsKQEAgLTI4MjAsNiArMjgzNSwxMyBAQAogICAgICAgICAgICAgICAgIHJldHVybiB2ICE9IG51bGwgPyB2IDogZGVmVmFsdWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRTdHJpbmdTZXQoU3RyaW5nIGtleSwgU2V0PFN0cmluZz4gZGVmVmFsdWVzKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiB2ID0gKFNldDxTdHJpbmc+KSBtTWFwLmdldChrZXkpOworICAgICAgICAgICAgICAgIHJldHVybiB2ICE9IG51bGwgPyB2IDogZGVmVmFsdWVzOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGludCBnZXRJbnQoU3RyaW5nIGtleSwgaW50IGRlZlZhbHVlKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKQEAgLTI4ODEsNiArMjkwMywxMiBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgRWRpdG9yIHB1dFN0cmluZ1NldChTdHJpbmcga2V5LCBTZXQ8U3RyaW5nPiB2YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1vZGlmaWVkLnB1dChrZXksIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHB1YmxpYyBFZGl0b3IgcHV0SW50KFN0cmluZyBrZXksIGludCB2YWx1ZSkgewogICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgICAgICAgICBtTW9kaWZpZWQucHV0KGtleSwgdmFsdWUpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0RhdGVQaWNrZXJEaWFsb2cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EYXRlUGlja2VyRGlhbG9nLmphdmEKaW5kZXggOGJhNDgwZC4uMzdmODczOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0RhdGVQaWNrZXJEaWFsb2cuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGF0ZVBpY2tlckRpYWxvZy5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHMuVHJ1bmNhdGVBdDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CkBAIC04Miw3ICs4Myw5IEBACiAgICAgICAgICAgICBpbnQgeWVhciwKICAgICAgICAgICAgIGludCBtb250aE9mWWVhciwKICAgICAgICAgICAgIGludCBkYXlPZk1vbnRoKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9EaWFsb2dfQWxlcnQsCisgICAgICAgIHRoaXMoY29udGV4dCwgY29udGV4dC5nZXRBcHBsaWNhdGlvbkluZm8oKS50YXJnZXRTZGtWZXJzaW9uID49IEJ1aWxkLlZFUlNJT05fQ09ERVMuSE9ORVlDT01CCisgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfSG9sb19EaWFsb2dfQWxlcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIDogY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9EaWFsb2dfQWxlcnQsCiAgICAgICAgICAgICAgICAgY2FsbEJhY2ssIHllYXIsIG1vbnRoT2ZZZWFyLCBkYXlPZk1vbnRoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EaWFsb2cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EaWFsb2cuamF2YQppbmRleCBkYThjOWU1Li5hMTc4YzA0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGlhbG9nLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0RpYWxvZy5qYXZhCkBAIC0xNiwxOCArMTYsMjIgQEAKIAogcGFja2FnZSBhbmRyb2lkLmFwcDsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5BY3Rpb25CYXJJbXBsOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5Qb2xpY3lNYW5hZ2VyOwogCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwpAQCAtMzYsMTMgKzQwLDEyIEBACiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CkBAIC03Niw2ICs3OSw3IEBACiAgICAgZmluYWwgV2luZG93TWFuYWdlciBtV2luZG93TWFuYWdlcjsKICAgICBXaW5kb3cgbVdpbmRvdzsKICAgICBWaWV3IG1EZWNvcjsKKyAgICBwcml2YXRlIEFjdGlvbkJhckltcGwgbUFjdGlvbkJhcjsKICAgICAvKioKICAgICAgKiBUaGlzIGZpZWxkIHNob3VsZCBiZSBtYWRlIHByaXZhdGUsIHNvIGl0IGlzIGhpZGRlbiBmcm9tIHRoZSBTREsuCiAgICAgICoge0BoaWRlfQpAQCAtMTM3LDcgKzE0MSwxMCBAQAogICAgICAqLwogICAgIHB1YmxpYyBEaWFsb2coQ29udGV4dCBjb250ZXh0LCBpbnQgdGhlbWUpIHsKICAgICAgICAgbUNvbnRleHQgPSBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcigKLSAgICAgICAgICAgIGNvbnRleHQsIHRoZW1lID09IDAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0RpYWxvZyA6IHRoZW1lKTsKKyAgICAgICAgICAgIGNvbnRleHQsIHRoZW1lID09IDAgPyAKKyAgICAgICAgICAgICAgICAgICAgKGNvbnRleHQuZ2V0QXBwbGljYXRpb25JbmZvKCkudGFyZ2V0U2RrVmVyc2lvbiA+PSBCdWlsZC5WRVJTSU9OX0NPREVTLkhPTkVZQ09NQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9Ib2xvX0RpYWxvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0RpYWxvZykgOiB0aGVtZSk7CiAgICAgICAgIG1XaW5kb3dNYW5hZ2VyID0gKFdpbmRvd01hbmFnZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOwogICAgICAgICBXaW5kb3cgdyA9IFBvbGljeU1hbmFnZXIubWFrZU5ld1dpbmRvdyhtQ29udGV4dCk7CiAgICAgICAgIG1XaW5kb3cgPSB3OwpAQCAtMTcwLDEzICsxNzcsMjIgQEAKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgQ29udGV4dCB0aGlzIERpYWxvZyBpcyBydW5uaW5nIGluLgogICAgICAqIAotICAgICAqIEByZXR1cm4gQ29udGV4dCBUaGUgQ29udGV4dCB0aGF0IHdhcyBzdXBwbGllZCB0byB0aGUgY29uc3RydWN0b3IuCisgICAgICogQHJldHVybiBDb250ZXh0IFRoZSBDb250ZXh0IHVzZWQgYnkgdGhlIERpYWxvZy4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgQ29udGV4dCBnZXRDb250ZXh0KCkgewogICAgICAgICByZXR1cm4gbUNvbnRleHQ7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIHtAbGluayBBY3Rpb25CYXJ9IGF0dGFjaGVkIHRvIHRoaXMgZGlhbG9nLCBpZiBwcmVzZW50LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgQWN0aW9uQmFyIGF0dGFjaGVkIHRvIHRoZSBkaWFsb2cgb3IgbnVsbCBpZiBubyBBY3Rpb25CYXIgaXMgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uQmFyIGdldEFjdGlvbkJhcigpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25CYXI7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0cyB0aGUgQWN0aXZpdHkgdGhhdCBvd25zIHRoaXMgZGlhbG9nLiBBbiBleGFtcGxlIHVzZTogVGhpcyBEaWFsb2cgd2lsbAogICAgICAqIHVzZSB0aGUgc3VnZ2VzdGVkIHZvbHVtZSBjb250cm9sIHN0cmVhbSBvZiB0aGUgQWN0aXZpdHkuCiAgICAgICogCkBAIC0yMTYsNiArMjMyLDkgQEAKICAgICBwdWJsaWMgdm9pZCBzaG93KCkgewogICAgICAgICBpZiAobVNob3dpbmcpIHsKICAgICAgICAgICAgIGlmIChtRGVjb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtV2luZG93Lmhhc0ZlYXR1cmUoV2luZG93LkZFQVRVUkVfQUNUSU9OX0JBUikpIHsKKyAgICAgICAgICAgICAgICAgICAgbVdpbmRvdy5pbnZhbGlkYXRlUGFuZWxNZW51KFdpbmRvdy5GRUFUVVJFX0FDVElPTl9CQVIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtRGVjb3Iuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMjI3LDYgKzI0NiwxMSBAQAogCiAgICAgICAgIG9uU3RhcnQoKTsKICAgICAgICAgbURlY29yID0gbVdpbmRvdy5nZXREZWNvclZpZXcoKTsKKworICAgICAgICBpZiAobUFjdGlvbkJhciA9PSBudWxsICYmIG1XaW5kb3cuaGFzRmVhdHVyZShXaW5kb3cuRkVBVFVSRV9BQ1RJT05fQkFSKSkgeworICAgICAgICAgICAgbUFjdGlvbkJhciA9IG5ldyBBY3Rpb25CYXJJbXBsKHRoaXMpOworICAgICAgICB9CisKICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbCA9IG1XaW5kb3cuZ2V0QXR0cmlidXRlcygpOwogICAgICAgICBpZiAoKGwuc29mdElucHV0TW9kZQogICAgICAgICAgICAgICAgICYgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9JU19GT1JXQVJEX05BVklHQVRJT04pID09IDApIHsKQEAgLTMxMCw3ICszMzQsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNpbWlsYXIgdG8ge0BsaW5rIEFjdGl2aXR5I29uQ3JlYXRlfSwgeW91IHNob3VsZCBpbml0aWFsaXplZCB5b3VyIGRpYWxvZworICAgICAqIFNpbWlsYXIgdG8ge0BsaW5rIEFjdGl2aXR5I29uQ3JlYXRlfSwgeW91IHNob3VsZCBpbml0aWFsaXplIHlvdXIgZGlhbG9nCiAgICAgICogaW4gdGhpcyBtZXRob2QsIGluY2x1ZGluZyBjYWxsaW5nIHtAbGluayAjc2V0Q29udGVudFZpZXd9LgogICAgICAqIEBwYXJhbSBzYXZlZEluc3RhbmNlU3RhdGUgSWYgdGhpcyBkaWFsb2cgaXMgYmVpbmcgcmVpbml0YWxpemVkIGFmdGVyIGEKICAgICAgKiAgICAgdGhlIGhvc3RpbmcgYWN0aXZpdHkgd2FzIHByZXZpb3VzbHkgc2h1dCBkb3duLCBob2xkcyB0aGUgcmVzdWx0IGZyb20KQEAgLTc3NSw2ICs3OTksMTMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBAc2VlIEFjdGl2aXR5I2ludmFsaWRhdGVPcHRpb25zTWVudSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZU9wdGlvbnNNZW51KCkgeworICAgICAgICBtV2luZG93LmludmFsaWRhdGVQYW5lbE1lbnUoV2luZG93LkZFQVRVUkVfT1BUSU9OU19QQU5FTCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQHNlZSBBY3Rpdml0eSNvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51LCBWaWV3LCBDb250ZXh0TWVudUluZm8pCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51LCBWaWV3IHYsIENvbnRleHRNZW51SW5mbyBtZW51SW5mbykgewpAQCAtODMyLDggKzg2MywxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIEFjdGlvbk1vZGUgb25TdGFydEFjdGlvbk1vZGUoQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBpZiAobUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvbkJhci5zdGFydEFjdGlvbk1vZGUoY2FsbGJhY2spOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKwogICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGFjdGl2aXR5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRpYWxvZywgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBhc3NvY2FpdGVkIGFjdGl2aXR5LgorICAgICAqIEByZXR1cm4gVGhlIGFjdGl2aXR5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRpYWxvZywgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIGFjdGl2aXR5LgogICAgICAqLwogICAgIHByaXZhdGUgQ29tcG9uZW50TmFtZSBnZXRBc3NvY2lhdGVkQWN0aXZpdHkoKSB7CiAgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gbU93bmVyQWN0aXZpdHk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGlhbG9nRnJhZ21lbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EaWFsb2dGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMjM4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGlhbG9nRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDQ1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CisKKy8qKgorICogQSBmcmFnbWVudCB0aGF0IGRpc3BsYXlzIGEgZGlhbG9nIHdpbmRvdywgZmxvYXRpbmcgb24gdG9wIG9mIGl0cworICogYWN0aXZpdHkncyB3aW5kb3cuICBUaGlzIGZyYWdtZW50IGNvbnRhaW5zIGEgRGlhbG9nIG9iamVjdCwgd2hpY2ggaXQKKyAqIGRpc3BsYXlzIGFzIGFwcHJvcHJpYXRlIGJhc2VkIG9uIHRoZSBmcmFnbWVudCdzIHN0YXRlLiAgQ29udHJvbCBvZgorICogdGhlIGRpYWxvZyAoZGVjaWRpbmcgd2hlbiB0byBzaG93LCBoaWRlLCBkaXNtaXNzIGl0KSBzaG91bGQgYmUgZG9uZSB0aHJvdWdoCisgKiB0aGUgQVBJIGhlcmUsIG5vdCB3aXRoIGRpcmVjdCBjYWxscyBvbiB0aGUgZGlhbG9nLgorICoKKyAqIDxwPkltcGxlbWVudGF0aW9ucyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBjbGFzcyBhbmQgaW1wbGVtZW50CisgKiB7QGxpbmsgI29uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciwgVmlld0dyb3VwLCBCdW5kbGUpfSB0byBzdXBwbHkgdGhlCisgKiBjb250ZW50IG9mIHRoZSBkaWFsb2cuICBBbHRlcm5hdGl2ZWx5LCB0aGV5IGNhbiBvdmVycmlkZQorICoge0BsaW5rICNvbkNyZWF0ZURpYWxvZyhCdW5kbGUpfSB0byBjcmVhdGUgYW4gZW50aXJlbHkgY3VzdG9tIGRpYWxvZywgc3VjaAorICogYXMgYW4gQWxlcnREaWFsb2csIHdpdGggaXRzIG93biBjb250ZW50LgorICoKKyAqIDxwPlRvcGljcyBjb3ZlcmVkIGhlcmU6CisgKiA8b2w+CisgKiA8bGk+PGEgaHJlZj0iI0xpZmVjeWNsZSI+TGlmZWN5Y2xlPC9hPgorICogPGxpPjxhIGhyZWY9IiNCYXNpY0RpYWxvZyI+QmFzaWMgRGlhbG9nPC9hPgorICogPGxpPjxhIGhyZWY9IiNBbGVydERpYWxvZyI+QWxlcnQgRGlhbG9nPC9hPgorICogPGxpPjxhIGhyZWY9IiNEaWFsb2dPckVtYmVkIj5TZWxlY3RpbmcgQmV0d2VlbiBEaWFsb2cgb3IgRW1iZWRkaW5nPC9hPgorICogPC9vbD4KKyAqCisgKiA8YSBuYW1lPSJMaWZlY3ljbGUiPjwvYT4KKyAqIDxoMz5MaWZlY3ljbGU8L2gzPgorICoKKyAqIDxwPkRpYWxvZ0ZyYWdtZW50IGRvZXMgdmFyaW91cyB0aGluZ3MgdG8ga2VlcCB0aGUgZnJhZ21lbnQncyBsaWZlY3ljbGUKKyAqIGRyaXZpbmcgaXQsIGluc3RlYWQgb2YgdGhlIERpYWxvZy4gIE5vdGUgdGhhdCBkaWFsb2dzIGFyZSBnZW5lcmFsbHkKKyAqIGF1dG9ub21vdXMgZW50aXRpZXMgLS0gdGhleSBhcmUgdGhlaXIgb3duIHdpbmRvdywgcmVjZWl2aW5nIHRoZWlyIG93bgorICogaW5wdXQgZXZlbnRzLCBhbmQgb2Z0ZW4gZGVjaWRpbmcgb24gdGhlaXIgb3duIHdoZW4gdG8gZGlzYXBwZWFyIChieQorICogcmVjZWl2aW5nIGEgYmFjayBrZXkgZXZlbnQgb3IgdGhlIHVzZXIgY2xpY2tpbmcgb24gYSBidXR0b24pLgorICoKKyAqIDxwPkRpYWxvZ0ZyYWdtZW50IG5lZWRzIHRvIGVuc3VyZSB0aGF0IHdoYXQgaXMgaGFwcGVuaW5nIHdpdGggdGhlIEZyYWdtZW50CisgKiBhbmQgRGlhbG9nIHN0YXRlcyByZW1haW5zIGNvbnNpc3RlbnQuICBUbyBkbyB0aGlzLCBpdCB3YXRjaGVzIGZvciBkaXNtaXNzCisgKiBldmVudHMgZnJvbSB0aGUgZGlhbG9nIGFuZCB0YWtlcyBhcmUgb2YgcmVtb3ZpbmcgaXRzIG93biBzdGF0ZSB3aGVuIHRoZXkKKyAqIGhhcHBlbi4gIFRoaXMgbWVhbnMgeW91IHNob3VsZCB1c2Uge0BsaW5rICNzaG93KEZyYWdtZW50TWFuYWdlciwgU3RyaW5nKX0KKyAqIG9yIHtAbGluayAjc2hvdyhGcmFnbWVudFRyYW5zYWN0aW9uLCBTdHJpbmcpfSB0byBhZGQgYW4gaW5zdGFuY2Ugb2YKKyAqIERpYWxvZ0ZyYWdtZW50IHRvIHlvdXIgVUksIGFzIHRoZXNlIGtlZXAgdHJhY2sgb2YgaG93IERpYWxvZ0ZyYWdtZW50IHNob3VsZAorICogcmVtb3ZlIGl0c2VsZiB3aGVuIHRoZSBkaWFsb2cgaXMgZGlzbWlzc2VkLgorICoKKyAqIDxhIG5hbWU9IkJhc2ljRGlhbG9nIj48L2E+CisgKiA8aDM+QmFzaWMgRGlhbG9nPC9oMz4KKyAqCisgKiA8cD5UaGUgc2ltcGxlc3QgdXNlIG9mIERpYWxvZ0ZyYWdtZW50IGlzIGFzIGEgZmxvYXRpbmcgY29udGFpbmVyIGZvciB0aGUKKyAqIGZyYWdtZW50J3MgdmlldyBoaWVyYXJjaHkuICBBIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBtYXkgbG9vayBsaWtlIHRoaXM6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZy5qYXZhCisgKiAgICAgIGRpYWxvZ30KKyAqCisgKiA8cD5BbiBleGFtcGxlIHNob3dEaWFsb2coKSBtZXRob2Qgb24gdGhlIEFjdGl2aXR5IGNvdWxkIGJlOgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnREaWFsb2cuamF2YQorICogICAgICBhZGRfZGlhbG9nfQorICoKKyAqIDxwPlRoaXMgcmVtb3ZlcyBhbnkgY3VycmVudGx5IHNob3duIGRpYWxvZywgY3JlYXRlcyBhIG5ldyBEaWFsb2dGcmFnbWVudAorICogd2l0aCBhbiBhcmd1bWVudCwgYW5kIHNob3dzIGl0IGFzIGEgbmV3IHN0YXRlIG9uIHRoZSBiYWNrIHN0YWNrLiAgV2hlbiB0aGUKKyAqIHRyYW5zYWN0aW9uIGlzIHBvcHBlZCwgdGhlIGN1cnJlbnQgRGlhbG9nRnJhZ21lbnQgYW5kIGl0cyBEaWFsb2cgd2lsbCBiZQorICogZGVzdHJveWVkLCBhbmQgdGhlIHByZXZpb3VzIG9uZSAoaWYgYW55KSByZS1zaG93bi4gIE5vdGUgdGhhdCBpbiB0aGlzIGNhc2UKKyAqIERpYWxvZ0ZyYWdtZW50IHdpbGwgdGFrZSBjYXJlIG9mIHBvcHBpbmcgdGhlIHRyYW5zYWN0aW9uIG9mIHRoZSBEaWFsb2cKKyAqIGlzIGRpc21pc3NlZCBzZXBhcmF0ZWx5IGZyb20gaXQuCisgKgorICogPGEgbmFtZT0iQWxlcnREaWFsb2ciPjwvYT4KKyAqIDxoMz5BbGVydCBEaWFsb2c8L2gzPgorICoKKyAqIDxwPkluc3RlYWQgb2YgKG9yIGluIGFkZGl0aW9uIHRvKSBpbXBsZW1lbnRpbmcge0BsaW5rICNvbkNyZWF0ZVZpZXd9IHRvCisgKiBnZW5lcmF0ZSB0aGUgdmlldyBoaWVyYXJjaHkgaW5zaWRlIG9mIGEgZGlhbG9nLCB5b3UgbWF5IGltcGxlbWVudAorICoge0BsaW5rICNvbkNyZWF0ZURpYWxvZyhCdW5kbGUpfSB0byBjcmVhdGUgeW91ciBvd24gY3VzdG9tIERpYWxvZyBvYmplY3QuCisgKgorICogPHA+VGhpcyBpcyBtb3N0IHVzZWZ1bCBmb3IgY3JlYXRpbmcgYW4ge0BsaW5rIEFsZXJ0RGlhbG9nfSwgYWxsb3dpbmcgeW91CisgKiB0byBkaXNwbGF5IHN0YW5kYXJkIGFsZXJ0cyB0byB0aGUgdXNlciB0aGF0IGFyZSBtYW5hZ2VkIGJ5IGEgZnJhZ21lbnQuCisgKiBBIHNpbXBsZSBleGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaXM6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudEFsZXJ0RGlhbG9nLmphdmEKKyAqICAgICAgZGlhbG9nfQorICoKKyAqIDxwPlRoZSBhY3Rpdml0eSBjcmVhdGluZyB0aGlzIGZyYWdtZW50IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyB0bworICogc2hvdyB0aGUgZGlhbG9nIGFuZCByZWNlaXZlIHJlc3VsdHMgZnJvbSBpdDoKKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50QWxlcnREaWFsb2cuamF2YQorICogICAgICBhY3Rpdml0eX0KKyAqCisgKiA8cD5Ob3RlIHRoYXQgaW4gdGhpcyBjYXNlIHRoZSBmcmFnbWVudCBpcyBub3QgcGxhY2VkIG9uIHRoZSBiYWNrIHN0YWNrLCBpdAorICogaXMganVzdCBhZGRlZCBhcyBhbiBpbmRlZmluaXRlbHkgcnVubmluZyBmcmFnbWVudC4gIEJlY2F1c2UgZGlhbG9ncyBub3JtYWxseQorICogYXJlIG1vZGFsLCB0aGlzIHdpbGwgc3RpbGwgb3BlcmF0ZSBhcyBhIGJhY2sgc3RhY2ssIHNpbmNlIHRoZSBkaWFsb2cgd2lsbAorICogY2FwdHVyZSB1c2VyIGlucHV0IHVudGlsIGl0IGlzIGRpc21pc3NlZC4gIFdoZW4gaXQgaXMgZGlzbWlzc2VkLCBEaWFsb2dGcmFnbWVudAorICogd2lsbCB0YWtlIGNhcmUgb2YgcmVtb3ZpbmcgaXRzZWxmIGZyb20gaXRzIGZyYWdtZW50IG1hbmFnZXIuCisgKgorICogPGEgbmFtZT0iRGlhbG9nT3JFbWJlZCI+PC9hPgorICogPGgzPlNlbGVjdGluZyBCZXR3ZWVuIERpYWxvZyBvciBFbWJlZGRpbmc8L2gzPgorICoKKyAqIDxwPkEgRGlhbG9nRnJhZ21lbnQgY2FuIHN0aWxsIG9wdGlvbmFsbHkgYmUgdXNlZCBhcyBhIG5vcm1hbCBmcmFnbWVudCwgaWYKKyAqIGRlc2lyZWQuICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIGZyYWdtZW50IHRoYXQgaW4gc29tZSBjYXNlcyBzaG91bGQKKyAqIGJlIHNob3duIGFzIGEgZGlhbG9nIGFuZCBvdGhlcnMgZW1iZWRkZWQgaW4gYSBsYXJnZXIgVUkuICBUaGlzIGJlaGF2aW9yCisgKiB3aWxsIG5vcm1hbGx5IGJlIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgZm9yIHlvdSBiYXNlZCBvbiBob3cgeW91IGFyZSB1c2luZworICogdGhlIGZyYWdtZW50LCBidXQgY2FuIGJlIGN1c3RvbWl6ZWQgd2l0aCB7QGxpbmsgI3NldFNob3dzRGlhbG9nKGJvb2xlYW4pfS4KKyAqCisgKiA8cD5Gb3IgZXhhbXBsZSwgaGVyZSBpcyBhIHNpbXBsZSBkaWFsb2cgZnJhZ21lbnQ6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZ09yQWN0aXZpdHkuamF2YQorICogICAgICBkaWFsb2d9CisgKgorICogPHA+QW4gaW5zdGFuY2Ugb2YgdGhpcyBmcmFnbWVudCBjYW4gYmUgY3JlYXRlZCBhbmQgc2hvd24gYXMgYSBkaWFsb2c6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZ09yQWN0aXZpdHkuamF2YQorICogICAgICBzaG93X2RpYWxvZ30KKyAqCisgKiA8cD5JdCBjYW4gYWxzbyBiZSBhZGRlZCBhcyBjb250ZW50IGluIGEgdmlldyBoaWVyYXJjaHk6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZ09yQWN0aXZpdHkuamF2YQorICogICAgICBlbWJlZH0KKyAqLworcHVibGljIGNsYXNzIERpYWxvZ0ZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQKKyAgICAgICAgaW1wbGVtZW50cyBEaWFsb2dJbnRlcmZhY2UuT25DYW5jZWxMaXN0ZW5lciwgRGlhbG9nSW50ZXJmYWNlLk9uRGlzbWlzc0xpc3RlbmVyIHsKKworICAgIC8qKgorICAgICAqIFN0eWxlIGZvciB7QGxpbmsgI3NldFN0eWxlKGludCwgaW50KX06IGEgYmFzaWMsCisgICAgICogbm9ybWFsIGRpYWxvZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFlMRV9OT1JNQUwgPSAwOworCisgICAgLyoqCisgICAgICogU3R5bGUgZm9yIHtAbGluayAjc2V0U3R5bGUoaW50LCBpbnQpfTogZG9uJ3QgaW5jbHVkZQorICAgICAqIGEgdGl0bGUgYXJlYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFlMRV9OT19USVRMRSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBTdHlsZSBmb3Ige0BsaW5rICNzZXRTdHlsZShpbnQsIGludCl9OiBkb24ndCBkcmF3CisgICAgICogYW55IGZyYW1lIGF0IGFsbDsgdGhlIHZpZXcgaGllcmFyY2h5IHJldHVybmVkIGJ5IHtAbGluayAjb25DcmVhdGVWaWV3fQorICAgICAqIGlzIGVudGlyZWx5IHJlc3BvbnNpYmxlIGZvciBkcmF3aW5nIHRoZSBkaWFsb2cuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfTk9fRlJBTUUgPSAyOworCisgICAgLyoqCisgICAgICogU3R5bGUgZm9yIHtAbGluayAjc2V0U3R5bGUoaW50LCBpbnQpfTogbGlrZQorICAgICAqIHtAbGluayAjU1RZTEVfTk9fRlJBTUV9LCBidXQgYWxzbyBkaXNhYmxlcyBhbGwgaW5wdXQgdG8gdGhlIGRpYWxvZy4KKyAgICAgKiBUaGUgdXNlciBjYW4gbm90IHRvdWNoIGl0LCBhbmQgaXRzIHdpbmRvdyB3aWxsIG5vdCByZWNlaXZlIGlucHV0IGZvY3VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUWUxFX05PX0lOUFVUID0gMzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9ESUFMT0dfU1RBVEVfVEFHID0gImFuZHJvaWQ6c2F2ZWREaWFsb2dTdGF0ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX1NUWUxFID0gImFuZHJvaWQ6c3R5bGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9USEVNRSA9ICJhbmRyb2lkOnRoZW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfQ0FOQ0VMQUJMRSA9ICJhbmRyb2lkOmNhbmNlbGFibGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9TSE9XU19ESUFMT0cgPSAiYW5kcm9pZDpzaG93c0RpYWxvZyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX0JBQ0tfU1RBQ0tfSUQgPSAiYW5kcm9pZDpiYWNrU3RhY2tJZCI7CisKKyAgICBpbnQgbVN0eWxlID0gU1RZTEVfTk9STUFMOworICAgIGludCBtVGhlbWUgPSAwOworICAgIGJvb2xlYW4gbUNhbmNlbGFibGUgPSB0cnVlOworICAgIGJvb2xlYW4gbVNob3dzRGlhbG9nID0gdHJ1ZTsKKyAgICBpbnQgbUJhY2tTdGFja0lkID0gLTE7CisKKyAgICBEaWFsb2cgbURpYWxvZzsKKyAgICBib29sZWFuIG1EZXN0cm95ZWQ7CisgICAgYm9vbGVhbiBtUmVtb3ZlZDsKKworICAgIHB1YmxpYyBEaWFsb2dGcmFnbWVudCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHRvIGN1c3RvbWl6ZSB0aGUgYmFzaWMgYXBwZWFyYW5jZSBhbmQgYmVoYXZpb3Igb2YgdGhlCisgICAgICogZnJhZ21lbnQncyBkaWFsb2cuICBUaGlzIGNhbiBiZSB1c2VkIGZvciBzb21lIGNvbW1vbiBkaWFsb2cgYmVoYXZpb3JzLAorICAgICAqIHRha2luZyBjYXJlIG9mIHNlbGVjdGluZyBmbGFncywgdGhlbWUsIGFuZCBvdGhlciBvcHRpb25zIGZvciB5b3UuICBUaGUKKyAgICAgKiBzYW1lIGVmZmVjdCBjYW4gYmUgYWNoaWV2ZSBieSBtYW51YWxseSBzZXR0aW5nIERpYWxvZyBhbmQgV2luZG93CisgICAgICogYXR0cmlidXRlcyB5b3Vyc2VsZi4gIENhbGxpbmcgdGhpcyBhZnRlciB0aGUgZnJhZ21lbnQncyBEaWFsb2cgaXMKKyAgICAgKiBjcmVhdGVkIHdpbGwgaGF2ZSBubyBlZmZlY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3R5bGUgU2VsZWN0cyBhIHN0YW5kYXJkIHN0eWxlOiBtYXkgYmUge0BsaW5rICNTVFlMRV9OT1JNQUx9LAorICAgICAqIHtAbGluayAjU1RZTEVfTk9fVElUTEV9LCB7QGxpbmsgI1NUWUxFX05PX0ZSQU1FfSwgb3IKKyAgICAgKiB7QGxpbmsgI1NUWUxFX05PX0lOUFVUfS4KKyAgICAgKiBAcGFyYW0gdGhlbWUgT3B0aW9uYWwgY3VzdG9tIHRoZW1lLiAgSWYgMCwgYW4gYXBwcm9wcmlhdGUgdGhlbWUgKGJhc2VkCisgICAgICogb24gdGhlIHN0eWxlKSB3aWxsIGJlIHNlbGVjdGVkIGZvciB5b3UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3R5bGUoaW50IHN0eWxlLCBpbnQgdGhlbWUpIHsKKyAgICAgICAgbVN0eWxlID0gc3R5bGU7CisgICAgICAgIGlmIChtU3R5bGUgPT0gU1RZTEVfTk9fRlJBTUUgfHwgbVN0eWxlID09IFNUWUxFX05PX0lOUFVUKSB7CisgICAgICAgICAgICBtVGhlbWUgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0hvbG9fRGlhbG9nX05vRnJhbWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoZW1lICE9IDApIHsKKyAgICAgICAgICAgIG1UaGVtZSA9IHRoZW1lOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB7QGxpbmsgI3Nob3coRnJhZ21lbnRNYW5hZ2VyLCBTdHJpbmcpfS4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyB2b2lkIHNob3coQWN0aXZpdHkgYWN0aXZpdHksIFN0cmluZyB0YWcpIHsKKyAgICAgICAgRnJhZ21lbnRUcmFuc2FjdGlvbiBmdCA9IGFjdGl2aXR5Lm9wZW5GcmFnbWVudFRyYW5zYWN0aW9uKCk7CisgICAgICAgIGZ0LmFkZCh0aGlzLCB0YWcpOworICAgICAgICBmdC5jb21taXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IHRoZSBkaWFsb2csIGFkZGluZyB0aGUgZnJhZ21lbnQgdG8gdGhlIGdpdmVuIEZyYWdtZW50TWFuYWdlci4gIFRoaXMKKyAgICAgKiBpcyBhIGNvbnZlbmllbmNlIGZvciBleHBsaWNpdGx5IGNyZWF0aW5nIGEgdHJhbnNhY3Rpb24sIGFkZGluZyB0aGUKKyAgICAgKiBmcmFnbWVudCB0byBpdCB3aXRoIHRoZSBnaXZlbiB0YWcsIGFuZCBjb21taXR0aW5nIGl0LiAgVGhpcyBkb2VzCisgICAgICogPGVtPm5vdDwvZW0+IGFkZCB0aGUgdHJhbnNhY3Rpb24gdG8gdGhlIGJhY2sgc3RhY2suICBXaGVuIHRoZSBmcmFnbWVudAorICAgICAqIGlzIGRpc21pc3NlZCwgYSBuZXcgdHJhbnNhY3Rpb24gd2lsbCBiZSBleGVjdXRlZCB0byByZW1vdmUgaXQgZnJvbQorICAgICAqIHRoZSBhY3Rpdml0eS4KKyAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgRnJhZ21lbnRNYW5hZ2VyIHRoaXMgZnJhZ21lbnQgd2lsbCBiZSBhZGRlZCB0by4KKyAgICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgZm9yIHRoaXMgZnJhZ21lbnQsIGFzIHBlcgorICAgICAqIHtAbGluayBGcmFnbWVudFRyYW5zYWN0aW9uI2FkZChGcmFnbWVudCwgU3RyaW5nKSBGcmFnbWVudFRyYW5zYWN0aW9uLmFkZH0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2hvdyhGcmFnbWVudE1hbmFnZXIgbWFuYWdlciwgU3RyaW5nIHRhZykgeworICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gbWFuYWdlci5vcGVuVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgZnQuYWRkKHRoaXMsIHRhZyk7CisgICAgICAgIGZ0LmNvbW1pdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BsYXkgdGhlIGRpYWxvZywgYWRkaW5nIHRoZSBmcmFnbWVudCB1c2luZyBhbiBleGlzdGluZyB0cmFuc2FjdGlvbgorICAgICAqIGFuZCB0aGVuIGNvbW1pdHRpbmcgdGhlIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbiBBbiBleGlzdGluZyB0cmFuc2FjdGlvbiBpbiB3aGljaCB0byBhZGQgdGhlIGZyYWdtZW50LgorICAgICAqIEBwYXJhbSB0YWcgVGhlIHRhZyBmb3IgdGhpcyBmcmFnbWVudCwgYXMgcGVyCisgICAgICoge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb24jYWRkKEZyYWdtZW50LCBTdHJpbmcpIEZyYWdtZW50VHJhbnNhY3Rpb24uYWRkfS4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvbW1pdHRlZCB0cmFuc2FjdGlvbiwgYXMgcGVyCisgICAgICoge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb24jY29tbWl0KCkgRnJhZ21lbnRUcmFuc2FjdGlvbi5jb21taXQoKX0uCisgICAgICovCisgICAgcHVibGljIGludCBzaG93KEZyYWdtZW50VHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24sIFN0cmluZyB0YWcpIHsKKyAgICAgICAgdHJhbnNhY3Rpb24uYWRkKHRoaXMsIHRhZyk7CisgICAgICAgIG1SZW1vdmVkID0gZmFsc2U7CisgICAgICAgIG1CYWNrU3RhY2tJZCA9IHRyYW5zYWN0aW9uLmNvbW1pdCgpOworICAgICAgICByZXR1cm4gbUJhY2tTdGFja0lkOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc21pc3MgdGhlIGZyYWdtZW50IGFuZCBpdHMgZGlhbG9nLiAgSWYgdGhlIGZyYWdtZW50IHdhcyBhZGRlZCB0byB0aGUKKyAgICAgKiBiYWNrIHN0YWNrLCBhbGwgYmFjayBzdGFjayBzdGF0ZSB1cCB0byBhbmQgaW5jbHVkaW5nIHRoaXMgZW50cnkgd2lsbAorICAgICAqIGJlIHBvcHBlZC4gIE90aGVyd2lzZSwgYSBuZXcgdHJhbnNhY3Rpb24gd2lsbCBiZSBjb21taXR0ZWQgdG8gcmVtb3ZlCisgICAgICogdGhlIGZyYWdtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc21pc3MoKSB7CisgICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EaWFsb2cuZGlzbWlzcygpOworICAgICAgICAgICAgbURpYWxvZyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgbVJlbW92ZWQgPSB0cnVlOworICAgICAgICBpZiAobUJhY2tTdGFja0lkID49IDApIHsKKyAgICAgICAgICAgIGdldEZyYWdtZW50TWFuYWdlcigpLnBvcEJhY2tTdGFjayhtQmFja1N0YWNrSWQsCisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlci5QT1BfQkFDS19TVEFDS19JTkNMVVNJVkUpOworICAgICAgICAgICAgbUJhY2tTdGFja0lkID0gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gZ2V0RnJhZ21lbnRNYW5hZ2VyKCkub3BlblRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICBmdC5yZW1vdmUodGhpcyk7CisgICAgICAgICAgICBmdC5jb21taXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBEaWFsb2cgZ2V0RGlhbG9nKCkgeworICAgICAgICByZXR1cm4gbURpYWxvZzsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFRoZW1lKCkgeworICAgICAgICByZXR1cm4gbVRoZW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRyb2wgd2hldGhlciB0aGUgc2hvd24gRGlhbG9nIGlzIGNhbmNlbGFibGUuICBVc2UgdGhpcyBpbnN0ZWFkIG9mCisgICAgICogZGlyZWN0bHkgY2FsbGluZyB7QGxpbmsgRGlhbG9nI3NldENhbmNlbGFibGUoYm9vbGVhbikKKyAgICAgKiBEaWFsb2cuc2V0Q2FuY2VsYWJsZShib29sZWFuKX0sIGJlY2F1c2UgRGlhbG9nRnJhZ21lbnQgbmVlZHMgdG8gY2hhbmdlCisgICAgICogaXRzIGJlaGF2aW9yIGJhc2VkIG9uIHRoaXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FuY2VsYWJsZSBJZiB0cnVlLCB0aGUgZGlhbG9nIGlzIGNhbmNlbGFibGUuICBUaGUgZGVmYXVsdAorICAgICAqIGlzIHRydWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FuY2VsYWJsZShib29sZWFuIGNhbmNlbGFibGUpIHsKKyAgICAgICAgbUNhbmNlbGFibGUgPSBjYW5jZWxhYmxlOworICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSBtRGlhbG9nLnNldENhbmNlbGFibGUoY2FuY2VsYWJsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIHtAbGluayAjc2V0Q2FuY2VsYWJsZShib29sZWFuKX0uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Q2FuY2VsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1DYW5jZWxhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRyb2xzIHdoZXRoZXIgdGhpcyBmcmFnbWVudCBzaG91bGQgYmUgc2hvd24gaW4gYSBkaWFsb2cuICBJZiBub3QKKyAgICAgKiBzZXQsIG5vIERpYWxvZyB3aWxsIGJlIGNyZWF0ZWQgaW4ge0BsaW5rICNvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUpfSwKKyAgICAgKiBhbmQgdGhlIGZyYWdtZW50J3MgdmlldyBoaWVyYXJjaHkgd2lsbCB0aHVzIG5vdCBiZSBhZGRlZCB0byBpdC4gIFRoaXMKKyAgICAgKiBhbGxvd3MgeW91IHRvIGluc3RlYWQgdXNlIGl0IGFzIGEgbm9ybWFsIGZyYWdtZW50IChlbWJlZGRlZCBpbnNpZGUgb2YKKyAgICAgKiBpdHMgYWN0aXZpdHkpLgorICAgICAqCisgICAgICogPHA+VGhpcyBpcyBub3JtYWxseSBzZXQgZm9yIHlvdSBiYXNlZCBvbiB3aGV0aGVyIHRoZSBmcmFnbWVudCBpcworICAgICAqIGFzc29jaWF0ZWQgd2l0aCBhIGNvbnRhaW5lciB2aWV3IElEIHBhc3NlZCB0bworICAgICAqIHtAbGluayBGcmFnbWVudFRyYW5zYWN0aW9uI2FkZChpbnQsIEZyYWdtZW50KSBGcmFnbWVudFRyYW5zYWN0aW9uLmFkZChpbnQsIEZyYWdtZW50KX0uCisgICAgICogSWYgdGhlIGZyYWdtZW50IHdhcyBhZGRlZCB3aXRoIGEgY29udGFpbmVyLCBzZXRTaG93c0RpYWxvZyB3aWxsIGJlCisgICAgICogaW5pdGlhbGl6ZWQgdG8gZmFsc2U7IG90aGVyd2lzZSwgaXQgd2lsbCBiZSB0cnVlLgorICAgICAqCisgICAgICogQHBhcmFtIHNob3dzRGlhbG9nIElmIHRydWUsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGRpc3BsYXllZCBpbiBhIERpYWxvZy4KKyAgICAgKiBJZiBmYWxzZSwgbm8gRGlhbG9nIHdpbGwgYmUgY3JlYXRlZCBhbmQgdGhlIGZyYWdtZW50J3MgdmlldyBoaWVyYXJjaGx5CisgICAgICogbGVmdCB1bmRpc3R1cmJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93c0RpYWxvZyhib29sZWFuIHNob3dzRGlhbG9nKSB7CisgICAgICAgIG1TaG93c0RpYWxvZyA9IHNob3dzRGlhbG9nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvZiB7QGxpbmsgI3NldFNob3dzRGlhbG9nKGJvb2xlYW4pfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93c0RpYWxvZygpIHsKKyAgICAgICAgcmV0dXJuIG1TaG93c0RpYWxvZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgbVNob3dzRGlhbG9nID0gbUNvbnRhaW5lcklkID09IDA7CisKKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtU3R5bGUgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KFNBVkVEX1NUWUxFLCBTVFlMRV9OT1JNQUwpOworICAgICAgICAgICAgbVRoZW1lID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEludChTQVZFRF9USEVNRSwgMCk7CisgICAgICAgICAgICBtQ2FuY2VsYWJsZSA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRCb29sZWFuKFNBVkVEX0NBTkNFTEFCTEUsIHRydWUpOworICAgICAgICAgICAgbVNob3dzRGlhbG9nID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEJvb2xlYW4oU0FWRURfU0hPV1NfRElBTE9HLCBtU2hvd3NEaWFsb2cpOworICAgICAgICAgICAgbUJhY2tTdGFja0lkID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEludChTQVZFRF9CQUNLX1NUQUNLX0lELCAtMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEaWFsb2coZ2V0QWN0aXZpdHkoKSwgZ2V0VGhlbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25DYW5jZWwoRGlhbG9nSW50ZXJmYWNlIGRpYWxvZykgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uRGlzbWlzcyhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nKSB7CisgICAgICAgIGlmICghbVJlbW92ZWQpIHsKKyAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBpZiAoIW1TaG93c0RpYWxvZykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbURpYWxvZyA9IG9uQ3JlYXRlRGlhbG9nKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIG1EZXN0cm95ZWQgPSBmYWxzZTsKKyAgICAgICAgc3dpdGNoIChtU3R5bGUpIHsKKyAgICAgICAgICAgIGNhc2UgU1RZTEVfTk9fSU5QVVQ6CisgICAgICAgICAgICAgICAgbURpYWxvZy5nZXRXaW5kb3coKS5hZGRGbGFncygKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRSB8CisgICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9UT1VDSEFCTEUpOworICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaC4uLgorICAgICAgICAgICAgY2FzZSBTVFlMRV9OT19GUkFNRToKKyAgICAgICAgICAgIGNhc2UgU1RZTEVfTk9fVElUTEU6CisgICAgICAgICAgICAgICAgbURpYWxvZy5yZXF1ZXN0V2luZG93RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9OT19USVRMRSk7CisgICAgICAgIH0KKyAgICAgICAgVmlldyB2aWV3ID0gZ2V0VmlldygpOworICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAodmlldy5nZXRQYXJlbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRGlhbG9nRnJhZ21lbnQgY2FuIG5vdCBiZSBhdHRhY2hlZCB0byBhIGNvbnRhaW5lciB2aWV3Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGlhbG9nLnNldENvbnRlbnRWaWV3KHZpZXcpOworICAgICAgICB9CisgICAgICAgIG1EaWFsb2cuc2V0T3duZXJBY3Rpdml0eShnZXRBY3Rpdml0eSgpKTsKKyAgICAgICAgbURpYWxvZy5zZXRDYW5jZWxhYmxlKG1DYW5jZWxhYmxlKTsKKyAgICAgICAgbURpYWxvZy5zZXRPbkNhbmNlbExpc3RlbmVyKHRoaXMpOworICAgICAgICBtRGlhbG9nLnNldE9uRGlzbWlzc0xpc3RlbmVyKHRoaXMpOworICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBkaWFsb2dTdGF0ZSA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRCdW5kbGUoU0FWRURfRElBTE9HX1NUQVRFX1RBRyk7CisgICAgICAgICAgICBpZiAoZGlhbG9nU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1EaWFsb2cub25SZXN0b3JlSW5zdGFuY2VTdGF0ZShkaWFsb2dTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgeworICAgICAgICBzdXBlci5vblN0YXJ0KCk7CisgICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SZW1vdmVkID0gZmFsc2U7CisgICAgICAgICAgICBtRGlhbG9nLnNob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUob3V0U3RhdGUpOworICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICBCdW5kbGUgZGlhbG9nU3RhdGUgPSBtRGlhbG9nLm9uU2F2ZUluc3RhbmNlU3RhdGUoKTsKKyAgICAgICAgICAgIGlmIChkaWFsb2dTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0U3RhdGUucHV0QnVuZGxlKFNBVkVEX0RJQUxPR19TVEFURV9UQUcsIGRpYWxvZ1N0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobVN0eWxlICE9IFNUWUxFX05PUk1BTCkgeworICAgICAgICAgICAgb3V0U3RhdGUucHV0SW50KFNBVkVEX1NUWUxFLCBtU3R5bGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtVGhlbWUgIT0gMCkgeworICAgICAgICAgICAgb3V0U3RhdGUucHV0SW50KFNBVkVEX1RIRU1FLCBtVGhlbWUpOworICAgICAgICB9CisgICAgICAgIGlmICghbUNhbmNlbGFibGUpIHsKKyAgICAgICAgICAgIG91dFN0YXRlLnB1dEJvb2xlYW4oU0FWRURfQ0FOQ0VMQUJMRSwgbUNhbmNlbGFibGUpOworICAgICAgICB9CisgICAgICAgIGlmICghbVNob3dzRGlhbG9nKSB7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRCb29sZWFuKFNBVkVEX1NIT1dTX0RJQUxPRywgbVNob3dzRGlhbG9nKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUJhY2tTdGFja0lkICE9IC0xKSB7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRJbnQoU0FWRURfQkFDS19TVEFDS19JRCwgbUJhY2tTdGFja0lkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKKyAgICAgICAgc3VwZXIub25TdG9wKCk7CisgICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EaWFsb2cuaGlkZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGRpYWxvZy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lWaWV3KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3lWaWV3KCk7CisgICAgICAgIG1EZXN0cm95ZWQgPSB0cnVlOworICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBTZXQgcmVtb3ZlZCBoZXJlIGJlY2F1c2UgdGhpcyBkaXNtaXNzYWwgaXMganVzdCB0byBoaWRlCisgICAgICAgICAgICAvLyB0aGUgZGlhbG9nIC0tIHdlIGRvbid0IHdhbnQgdGhpcyB0byBjYXVzZSB0aGUgZnJhZ21lbnQgdG8KKyAgICAgICAgICAgIC8vIGFjdHVhbGx5IGJlIHJlbW92ZWQuCisgICAgICAgICAgICBtUmVtb3ZlZCA9IHRydWU7CisgICAgICAgICAgICBtRGlhbG9nLmRpc21pc3MoKTsKKyAgICAgICAgICAgIG1EaWFsb2cgPSBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0Rvd25sb2FkTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0Rvd25sb2FkTWFuYWdlci5qYXZhCmluZGV4IGM0NzZiOGYuLjAxMzAzMmMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Eb3dubG9hZE1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRG93bmxvYWRNYW5hZ2VyLmphdmEKQEAgLTMzNSw4ICszMzUsOCBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgU3RyaW5nIHNjaGVtZSA9IHVyaS5nZXRTY2hlbWUoKTsKLSAgICAgICAgICAgIGlmIChzY2hlbWUgPT0gbnVsbCB8fCAhc2NoZW1lLmVxdWFscygiaHR0cCIpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuIG9ubHkgZG93bmxvYWQgSFRUUCBVUklzOiAiICsgdXJpKTsKKyAgICAgICAgICAgIGlmIChzY2hlbWUgPT0gbnVsbCB8fCAoIXNjaGVtZS5lcXVhbHMoImh0dHAiKSAmJiAhc2NoZW1lLmVxdWFscygiaHR0cHMiKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4gb25seSBkb3dubG9hZCBIVFRQL0hUVFBTIFVSSXM6ICIgKyB1cmkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVVyaSA9IHVyaTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmJmN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50LmphdmEKQEAgLTAsMCArMSwxMjA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnRDYWxsYmFja3M7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BbmRyb2lkUnVudGltZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ZpbmFsIGNsYXNzIEZyYWdtZW50U3RhdGUgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBmaW5hbCBTdHJpbmcgbUNsYXNzTmFtZTsKKyAgICBmaW5hbCBpbnQgbUluZGV4OworICAgIGZpbmFsIGJvb2xlYW4gbUZyb21MYXlvdXQ7CisgICAgZmluYWwgaW50IG1GcmFnbWVudElkOworICAgIGZpbmFsIGludCBtQ29udGFpbmVySWQ7CisgICAgZmluYWwgU3RyaW5nIG1UYWc7CisgICAgZmluYWwgYm9vbGVhbiBtUmV0YWluSW5zdGFuY2U7CisgICAgZmluYWwgQnVuZGxlIG1Bcmd1bWVudHM7CisgICAgCisgICAgQnVuZGxlIG1TYXZlZEZyYWdtZW50U3RhdGU7CisgICAgCisgICAgRnJhZ21lbnQgbUluc3RhbmNlOworICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFN0YXRlKEZyYWdtZW50IGZyYWcpIHsKKyAgICAgICAgbUNsYXNzTmFtZSA9IGZyYWcuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgIG1JbmRleCA9IGZyYWcubUluZGV4OworICAgICAgICBtRnJvbUxheW91dCA9IGZyYWcubUZyb21MYXlvdXQ7CisgICAgICAgIG1GcmFnbWVudElkID0gZnJhZy5tRnJhZ21lbnRJZDsKKyAgICAgICAgbUNvbnRhaW5lcklkID0gZnJhZy5tQ29udGFpbmVySWQ7CisgICAgICAgIG1UYWcgPSBmcmFnLm1UYWc7CisgICAgICAgIG1SZXRhaW5JbnN0YW5jZSA9IGZyYWcubVJldGFpbkluc3RhbmNlOworICAgICAgICBtQXJndW1lbnRzID0gZnJhZy5tQXJndW1lbnRzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRTdGF0ZShQYXJjZWwgaW4pIHsKKyAgICAgICAgbUNsYXNzTmFtZSA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgbUluZGV4ID0gaW4ucmVhZEludCgpOworICAgICAgICBtRnJvbUxheW91dCA9IGluLnJlYWRJbnQoKSAhPSAwOworICAgICAgICBtRnJhZ21lbnRJZCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbUNvbnRhaW5lcklkID0gaW4ucmVhZEludCgpOworICAgICAgICBtVGFnID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICBtUmV0YWluSW5zdGFuY2UgPSBpbi5yZWFkSW50KCkgIT0gMDsKKyAgICAgICAgbUFyZ3VtZW50cyA9IGluLnJlYWRCdW5kbGUoKTsKKyAgICAgICAgbVNhdmVkRnJhZ21lbnRTdGF0ZSA9IGluLnJlYWRCdW5kbGUoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50IGluc3RhbnRpYXRlKEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgIGlmIChtSW5zdGFuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbUluc3RhbmNlID0gRnJhZ21lbnQuaW5zdGFudGlhdGUoYWN0aXZpdHksIG1DbGFzc05hbWUsIG1Bcmd1bWVudHMpOworICAgICAgICAKKyAgICAgICAgaWYgKG1TYXZlZEZyYWdtZW50U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNhdmVkRnJhZ21lbnRTdGF0ZS5zZXRDbGFzc0xvYWRlcihhY3Rpdml0eS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIG1JbnN0YW5jZS5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbVNhdmVkRnJhZ21lbnRTdGF0ZTsKKyAgICAgICAgfQorICAgICAgICBtSW5zdGFuY2Uuc2V0SW5kZXgobUluZGV4KTsKKyAgICAgICAgbUluc3RhbmNlLm1Gcm9tTGF5b3V0ID0gbUZyb21MYXlvdXQ7CisgICAgICAgIG1JbnN0YW5jZS5tRnJhZ21lbnRJZCA9IG1GcmFnbWVudElkOworICAgICAgICBtSW5zdGFuY2UubUNvbnRhaW5lcklkID0gbUNvbnRhaW5lcklkOworICAgICAgICBtSW5zdGFuY2UubVRhZyA9IG1UYWc7CisgICAgICAgIG1JbnN0YW5jZS5tUmV0YWluSW5zdGFuY2UgPSBtUmV0YWluSW5zdGFuY2U7CisgICAgICAgIG1JbnN0YW5jZS5tRnJhZ21lbnRNYW5hZ2VyID0gYWN0aXZpdHkubUZyYWdtZW50czsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobUNsYXNzTmFtZSk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUluZGV4KTsKKyAgICAgICAgZGVzdC53cml0ZUludChtRnJvbUxheW91dCA/IDEgOiAwKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtRnJhZ21lbnRJZCk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUNvbnRhaW5lcklkKTsKKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtVGFnKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtUmV0YWluSW5zdGFuY2UgPyAxIDogMCk7CisgICAgICAgIGRlc3Qud3JpdGVCdW5kbGUobUFyZ3VtZW50cyk7CisgICAgICAgIGRlc3Qud3JpdGVCdW5kbGUobVNhdmVkRnJhZ21lbnRTdGF0ZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPEZyYWdtZW50U3RhdGU+IENSRUFUT1IKKyAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxGcmFnbWVudFN0YXRlPigpIHsKKyAgICAgICAgcHVibGljIEZyYWdtZW50U3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnRTdGF0ZShpbik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBGcmFnbWVudFN0YXRlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnRTdGF0ZVtzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CisKKy8qKgorICogQSBGcmFnbWVudCBpcyBhIHBpZWNlIG9mIGFuIGFwcGxpY2F0aW9uJ3MgdXNlciBpbnRlcmZhY2Ugb3IgYmVoYXZpb3IKKyAqIHRoYXQgY2FuIGJlIHBsYWNlZCBpbiBhbiB7QGxpbmsgQWN0aXZpdHl9LiAgSW50ZXJhY3Rpb24gd2l0aCBmcmFnbWVudHMKKyAqIGlzIGRvbmUgdGhyb3VnaCB7QGxpbmsgRnJhZ21lbnRNYW5hZ2VyfSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIHZpYQorICoge0BsaW5rIEFjdGl2aXR5I2dldEZyYWdtZW50TWFuYWdlcigpIEFjdGl2aXR5LmdldEZyYWdtZW50TWFuYWdlcigpfSBhbmQKKyAqIHtAbGluayBGcmFnbWVudCNnZXRGcmFnbWVudE1hbmFnZXIoKSBGcmFnbWVudC5nZXRGcmFnbWVudE1hbmFnZXIoKX0uCisgKgorICogPHA+VGhlIEZyYWdtZW50IGNsYXNzIGNhbiBiZSB1c2VkIG1hbnkgd2F5cyB0byBhY2hpZXZlIGEgd2lkZSB2YXJpZXR5IG9mCisgKiByZXN1bHRzLiAgSXQgaXMgY29yZSwgaXQgcmVwcmVzZW50cyBhIHBhcnRpY3VsYXIgb3BlcmF0aW9uIG9yIGludGVyZmFjZQorICogdGhhdCBpcyBydW5uaW5nIHdpdGhpbiBhIGxhcmdlciB7QGxpbmsgQWN0aXZpdHl9LiAgQSBGcmFnbWVudCBpcyBjbG9zZWx5CisgKiB0aWVkIHRvIHRoZSBBY3Rpdml0eSBpdCBpcyBpbiwgYW5kIGNhbiBub3QgYmUgdXNlZCBhcGFydCBmcm9tIG9uZS4gIFRob3VnaAorICogRnJhZ21lbnQgZGVmaW5lcyBpdHMgb3duIGxpZmVjeWNsZSwgdGhhdCBsaWZlY3ljbGUgaXMgZGVwZW5kZW50IG9uIGl0cworICogYWN0aXZpdHk6IGlmIHRoZSBhY3Rpdml0eSBpcyBzdG9wcGVkLCBubyBmcmFnbWVudHMgaW5zaWRlIG9mIGl0IGNhbiBiZQorICogc3RhcnRlZDsgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZGVzdHJveWVkLCBhbGwgZnJhZ21lbnRzIHdpbGwgYmUgZGVzdHJveWVkLgorICoKKyAqIDxwPkFsbCBzdWJjbGFzc2VzIG9mIEZyYWdtZW50IG11c3QgaW5jbHVkZSBhIHB1YmxpYyBlbXB0eSBjb25zdHJ1Y3Rvci4KKyAqIFRoZSBmcmFtZXdvcmsgd2lsbCBvZnRlbiByZS1pbnN0YW50aWF0ZSBhIGZyYWdtZW50IGNsYXNzIHdoZW4gbmVlZGVkLAorICogaW4gcGFydGljdWxhciBkdXJpbmcgc3RhdGUgcmVzdG9yZSwgYW5kIG5lZWRzIHRvIGJlIGFibGUgdG8gZmluZCB0aGlzCisgKiBjb25zdHJ1Y3RvciB0byBpbnN0YW50aWF0ZSBpdC4gIElmIHRoZSBlbXB0eSBjb25zdHJ1Y3RvciBpcyBub3QgYXZhaWxhYmxlLAorICogYSBydW50aW1lIGV4Y2VwdGlvbiB3aWxsIG9jY3VyIGluIHNvbWUgY2FzZXMgZHVyaW5nIHN0YXRlIHJlc3RvcmUuCisgKgorICogPHA+VG9waWNzIGNvdmVyZWQgaGVyZToKKyAqIDxvbD4KKyAqIDxsaT48YSBocmVmPSIjTGlmZWN5Y2xlIj5MaWZlY3ljbGU8L2E+CisgKiA8bGk+PGEgaHJlZj0iI0xheW91dCI+TGF5b3V0PC9hPgorICogPGxpPjxhIGhyZWY9IiNCYWNrU3RhY2siPkJhY2sgU3RhY2s8L2E+CisgKiA8L29sPgorICoKKyAqIDxhIG5hbWU9IkxpZmVjeWNsZSI+PC9hPgorICogPGgzPkxpZmVjeWNsZTwvaDM+CisgKgorICogPHA+VGhvdWdoIGEgRnJhZ21lbnQncyBsaWZlY3ljbGUgaXMgdGllZCB0byBpdHMgb3duaW5nIGFjdGl2aXR5LCBpdCBoYXMKKyAqIGl0cyBvd24gd3JpbmtsZSBvbiB0aGUgc3RhbmRhcmQgYWN0aXZpdHkgbGlmZWN5Y2xlLiAgSXQgaW5jbHVkZXMgYmFzaWMKKyAqIGFjdGl2aXR5IGxpZmVjeWNsZSBtZXRob2RzIHN1Y2ggYXMge0BsaW5rICNvblJlc3VtZX0sIGJ1dCBhbHNvIGltcG9ydGFudAorICogYXJlIG1ldGhvZHMgcmVsYXRlZCB0byBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgYWN0aXZpdHkgYW5kIFVJIGdlbmVyYXRpb24uCisgKgorICogPHA+VGhlIGNvcmUgc2VyaWVzIG9mIGxpZmVjeWNsZSBtZXRob2RzIHRoYXQgYXJlIGNhbGxlZCB0byBicmluZyBhIGZyYWdtZW50CisgKiB1cCB0byByZXN1bWVkIHN0YXRlIChpbnRlcmFjdGluZyB3aXRoIHRoZSB1c2VyKSBhcmU6CisgKgorICogPG9sPgorICogPGxpPiB7QGxpbmsgI29uQXR0YWNofSBjYWxsZWQgb25jZSB0aGUgZnJhZ21lbnQgaXMgYXNzb2NpYXRlZCB3aXRoIGl0cyBhY3Rpdml0eS4KKyAqIDxsaT4ge0BsaW5rICNvbkNyZWF0ZX0gY2FsbGVkIHRvIGRvIGluaXRpYWwgY3JlYXRpb24gb2YgdGhlIGZyYWdtZW50LgorICogPGxpPiB7QGxpbmsgI29uQ3JlYXRlVmlld30gY3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgdmlldyBoaWVyYXJjaHkgYXNzb2NpYXRlZAorICogd2l0aCB0aGUgZnJhZ21lbnQuCisgKiA8bGk+IHtAbGluayAjb25BY3Rpdml0eUNyZWF0ZWR9IHRlbGxzIHRoZSBmcmFnbWVudCB0aGF0IGl0cyBhY3Rpdml0eSBoYXMKKyAqIGNvbXBsZXRlZCBpdHMgb3duIHtAbGluayBBY3Rpdml0eSNvbkNyZWF0ZSBBY3Rpdml0eS5vbkNyZWFhdGV9LgorICogPGxpPiB7QGxpbmsgI29uU3RhcnR9IG1ha2VzIHRoZSBmcmFnbWVudCB2aXNpYmxlIHRvIHRoZSB1c2VyIChiYXNlZCBvbiBpdHMKKyAqIGNvbnRhaW5pbmcgYWN0aXZpdHkgYmVpbmcgc3RhcnRlZCkuCisgKiA8bGk+IHtAbGluayAjb25SZXN1bWV9IG1ha2VzIHRoZSBmcmFnbWVudCBpbnRlcmFjdGluZyB3aXRoIHRoZSB1c2VyIChiYXNlZCBvbiBpdHMKKyAqIGNvbnRhaW5pbmcgYWN0aXZpdHkgYmVpbmcgcmVzdW1lZCkuCisgKiA8L29sPgorICoKKyAqIDxwPkFzIGEgZnJhZ21lbnQgaXMgbm8gbG9uZ2VyIGJlaW5nIHVzZWQsIGl0IGdvZXMgdGhyb3VnaCBhIHJldmVyc2UKKyAqIHNlcmllcyBvZiBjYWxsYmFja3M6CisgKgorICogPG9sPgorICogPGxpPiB7QGxpbmsgI29uUGF1c2V9IGZyYWdtZW50IGlzIG5vIGxvbmdlciBpbnRlcmFjdGluZyB3aXRoIHRoZSB1c2VyIGVpdGhlcgorICogYmVjYXVzZSBpdHMgYWN0aXZpdHkgaXMgYmVpbmcgcGF1c2VkIG9yIGEgZnJhZ21lbnQgb3BlcmF0aW9uIGlzIG1vZGlmeWluZyBpdAorICogaW4gdGhlIGFjdGl2aXR5LgorICogPGxpPiB7QGxpbmsgI29uU3RvcH0gZnJhZ21lbnQgaXMgbm8gbG9uZ2VyIHZpc2libGUgdG8gdGhlIHVzZXIgZWl0aGVyCisgKiBiZWNhdXNlIGl0cyBhY3Rpdml0eSBpcyBiZWluZyBzdG9wcGVkIG9yIGEgZnJhZ21lbnQgb3BlcmF0aW9uIGlzIG1vZGlmeWluZyBpdAorICogaW4gdGhlIGFjdGl2aXR5LgorICogPGxpPiB7QGxpbmsgI29uRGVzdHJveVZpZXd9IGFsbG93cyB0aGUgZnJhZ21lbnQgdG8gY2xlYW4gdXAgcmVzb3VyY2VzCisgKiBhc3NvY2lhdGVkIHdpdGggaXRzIFZpZXcuCisgKiA8bGk+IHtAbGluayAjb25EZXN0cm95fSBjYWxsZWQgdG8gZG8gZmluYWwgY2xlYW51cCBvZiB0aGUgZnJhZ21lbnQncyBzdGF0ZS4KKyAqIDxsaT4ge0BsaW5rICNvbkRldGFjaH0gY2FsbGVkIGltbWVkaWF0ZWx5IHByaW9yIHRvIHRoZSBmcmFnbWVudCBubyBsb25nZXIKKyAqIGJlaW5nIGFzc29jaWF0ZWQgd2l0aCBpdHMgYWN0aXZpdHkuCisgKiA8L29sPgorICoKKyAqIDxhIG5hbWU9IkxheW91dCI+PC9hPgorICogPGgzPkxheW91dDwvaDM+CisgKgorICogPHA+RnJhZ21lbnRzIGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgeW91ciBhcHBsaWNhdGlvbidzIGxheW91dCwgYWxsb3dpbmcKKyAqIHlvdSB0byBiZXR0ZXIgbW9kdWxhcml6ZSB5b3VyIGNvZGUgYW5kIG1vcmUgZWFzaWx5IGFkanVzdCB5b3VyIHVzZXIKKyAqIGludGVyZmFjZSB0byB0aGUgc2NyZWVuIGl0IGlzIHJ1bm5pbmcgb24uICBBcyBhbiBleGFtcGxlLCB3ZSBjYW4gbG9vaworICogYXQgYSBzaW1wbGUgcHJvZ3JhbSBjb25zaXN0aW5nIG9mIGEgbGlzdCBvZiBpdGVtcywgYW5kIGRpc3BsYXkgb2YgdGhlCisgKiBkZXRhaWxzIG9mIGVhY2ggaXRlbS48L3A+CisgKgorICogPHA+QW4gYWN0aXZpdHkncyBsYXlvdXQgWE1MIGNhbiBpbmNsdWRlIDxjb2RlPiZsdDtmcmFnbWVudCZndDs8L2NvZGU+IHRhZ3MKKyAqIHRvIGVtYmVkIGZyYWdtZW50IGluc3RhbmNlcyBpbnNpZGUgb2YgdGhlIGxheW91dC4gIEZvciBleGFtcGxlLCBoZXJlIGlzCisgKiBhIHNpbXBsZSBsYXlvdXQgdGhhdCBlbWJlZHMgb25lIGZyYWdtZW50OjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfbGF5b3V0LnhtbCBsYXlvdXR9CisgKgorICogPHA+VGhlIGxheW91dCBpcyBpbnN0YWxsZWQgaW4gdGhlIGFjdGl2aXR5IGluIHRoZSBub3JtYWwgd2F5OjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50TGF5b3V0LmphdmEKKyAqICAgICAgbWFpbn0KKyAqCisgKiA8cD5UaGUgdGl0bGVzIGZyYWdtZW50LCBzaG93aW5nIGEgbGlzdCBvZiB0aXRsZXMsIGlzIHZlcnkgc2ltcGxlLCByZWx5aW5nCisgKiBvbiB7QGxpbmsgTGlzdEZyYWdtZW50fSBmb3IgbW9zdCBvZiBpdHMgd29yay4gIE5vdGUgdGhlIGltcGxlbWVudGF0aW9uIG9mCisgKiBjbGlja2luZyBhbiBpdGVtLCB3aGljaCBjYW4gZWl0aGVyIHVwZGF0ZQorICogdGhlIGNvbnRlbnQgb2YgdGhlIGRldGFpbHMgZnJhZ21lbnQgb3Igc3RhcnQgYSBuZXcgYWN0aXZpdHkgc2hvdyB0aGUKKyAqIGRldGFpbHMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGN1cnJlbnQgYWN0aXZpdHkncyBsYXlvdXQgY2FuIHNob3cgdGhlCisgKiBkZXRhaWxzLjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50TGF5b3V0LmphdmEKKyAqICAgICAgdGl0bGVzfQorICoKKyAqIDxwPlRoZSBkZXRhaWxzIGZyYWdtZW50IHNob3dpbmcgdGhlIGNvbnRlbnRzIG9mIHNlbGVjdGVkIGl0ZW0gaGVyZSBqdXN0CisgKiBkaXNwbGF5cyBhIHN0cmluZyBvZiB0ZXh0IGJhc2VkIG9uIGFuIGluZGV4IG9mIGEgc3RyaW5nIGFycmF5IGJ1aWx0IGluIHRvCisgKiB0aGUgYXBwOjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50TGF5b3V0LmphdmEKKyAqICAgICAgZGV0YWlsc30KKyAqCisgKiA8cD5JbiB0aGlzIGNhc2Ugd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gYSB0aXRsZSwgdGhlcmUgaXMgbm8gZGV0YWlscworICogZnJhZ21lbnQgaW4gdGhlIGN1cnJlbnQgYWN0aXZpdHksIHNvIHRoZSB0aXRsZSB0aXRsZSBmcmFnbWVudCdzIGNsaWNrIGNvZGUgd2lsbAorICogbGF1bmNoIGEgbmV3IGFjdGl2aXR5IHRvIGRpc3BsYXkgdGhlIGRldGFpbHMgZnJhZ21lbnQ6PC9wPgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRMYXlvdXQuamF2YQorICogICAgICBkZXRhaWxzX2FjdGl2aXR5fQorICoKKyAqIDxwPkhvd2V2ZXIgdGhlIHNjcmVlbiBtYXkgYmUgbGFyZ2UgZW5vdWdoIHRvIHNob3cgYm90aCB0aGUgbGlzdCBvZiB0aXRsZXMKKyAqIGFuZCBkZXRhaWxzIGFib3V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGl0bGUuICBUbyB1c2Ugc3VjaCBhIGxheW91dCBvbgorICogYSBsYW5kc2NhcGUgc2NyZWVuLCB0aGlzIGFsdGVybmF0aXZlIGxheW91dCBjYW4gYmUgcGxhY2VkIHVuZGVyIGxheW91dC1sYW5kOjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQtbGFuZC9mcmFnbWVudF9sYXlvdXQueG1sIGxheW91dH0KKyAqCisgKiA8cD5Ob3RlIGhvdyB0aGUgcHJpb3IgY29kZSB3aWxsIGFkanVzdCB0byB0aGlzIGFsdGVybmF0aXZlIFVJIGZsb3c6IHRoZQorICogdGl0bGVzIGZyYWdtZW50IHdpbGwgbm93IHNob3cgaXRzIHRleHQgaW5zaWRlIG9mIGl0cyBhY3Rpdml0eSwgYW5kIHRoZQorICogZGV0YWlscyBhY3Rpdml0eSB3aWxsIGZpbmlzaCBvZiBpdCBmaW5kcyBpdHNlbGYgcnVubmluZyBpbiBhIGNvbmZpZ3VyYXRpb24KKyAqIHdoZXJlIHRoZSBkZXRhaWxzIGNhbiBiZSBzaG93biBpbmxpbmUuCisgKgorICogPHA+V2hlbiBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGNhdXNlcyB0aGUgYWN0aXZpdHkgaG9zdGluZyB0aGVzZSBmcmFnbWVudHMKKyAqIHRvIHJlc3RhcnQsIGl0cyBuZXcgaW5zdGFuY2UgbWF5IHVzZSBhIGRpZmZlcmVudCBsYXlvdXQgdGhhdCBkb2Vzbid0CisgKiBpbmNsdWRlIHRoZSBzYW1lIGZyYWdtZW50cyBhcyB0aGUgcHJldmlvdXMgbGF5b3V0LiAgSW4gdGhpcyBjYXNlIGFsbCBvZgorICogdGhlIHByZXZpb3VzIGZyYWdtZW50cyB3aWxsIHN0aWxsIGJlIGluc3RhbnRpYXRlZCBhbmQgcnVubmluZyBpbiB0aGUgbmV3CisgKiBpbnN0YW5jZTsgaG93ZXZlciwgYW55IHRoYXQgYXJlIG5vIGxvbmdlciBhc3NvY2lhdGVkIHdpdGggYSAmbHQ7ZnJhZ21lbnQmZ3Q7CisgKiB0YWcgaW4gdGhlIHZpZXcgaGllcmFyY2h5IHdpbGwgbm90IGhhdmUgdGhlaXIgY29udGVudCB2aWV3IGNyZWF0ZWQgYW5kIHdpbGwKKyAqIHJldHVybiBmYWxzZSBmcm9tIHtAbGluayAjaXNJbkxheW91dH0uCisgKiAKKyAqIDxwPlRoZSBhdHRyaWJ1dGVzIG9mIHRoZSAmbHQ7ZnJhZ21lbnQmZ3Q7IHRhZyBhcmUgdXNlZCB0byBjb250cm9sIHRoZQorICogTGF5b3V0UGFyYW1zIHByb3ZpZGVyIHdoZW4gYXR0YWNoaW5nIHRoZSBmcmFnbWVudCdzIHZpZXcgdG8gdGhlIHBhcmVudAorICogY29udGFpbmVyLiAgVGhleSBjYW4gYWxzZSBiZSBwYXJzZWQgYnkgdGhlIGZyYWdtZW50IGluIHtAbGluayAjb25JbmZsYXRlfQorICogYXMgcGFyYW1ldGVycy4KKyAqIAorICogPHA+VGhlIGZyYWdtZW50IGJlaW5nIGluc3RhbnRpYXRlZCBtdXN0IGhhdmUgc29tZSBraW5kIG9mIHVuaXF1ZSBpZGVudGlmaWVyCisgKiBzbyB0aGF0IGl0IGNhbiBiZSByZS1hc3NvY2lhdGVkIHdpdGggYSBwcmV2aW91cyBpbnN0YW5jZSBpZiB0aGUgcGFyZW50CisgKiBhY3Rpdml0eSBuZWVkcyB0byBiZSBkZXN0cm95ZWQgYW5kIHJlY3JlYXRlZC4gIFRoaXMgY2FuIGJlIHByb3ZpZGVkIHRoZXNlCisgKiB3YXlzOgorICogCisgKiA8dWw+CisgKiA8bGk+SWYgbm90aGluZyBpcyBleHBsaWNpdGx5IHN1cHBsaWVkLCB0aGUgdmlldyBJRCBvZiB0aGUgY29udGFpbmVyIHdpbGwKKyAqIGJlIHVzZWQuCisgKiA8bGk+PGNvZGU+YW5kcm9pZDp0YWc8L2NvZGU+IGNhbiBiZSB1c2VkIGluICZsdDtmcmFnbWVudCZndDsgdG8gcHJvdmlkZQorICogYSBzcGVjaWZpYyB0YWcgbmFtZSBmb3IgdGhlIGZyYWdtZW50LgorICogPGxpPjxjb2RlPmFuZHJvaWQ6aWQ8L2NvZGU+IGNhbiBiZSB1c2VkIGluICZsdDtmcmFnbWVudCZndDsgdG8gcHJvdmlkZQorICogYSBzcGVjaWZpYyBpZGVudGlmaWVyIGZvciB0aGUgZnJhZ21lbnQuCisgKiA8L3VsPgorICogCisgKiA8YSBuYW1lPSJCYWNrU3RhY2siPjwvYT4KKyAqIDxoMz5CYWNrIFN0YWNrPC9oMz4KKyAqCisgKiA8cD5UaGUgdHJhbnNhY3Rpb24gaW4gd2hpY2ggZnJhZ21lbnRzIGFyZSBtb2RpZmllZCBjYW4gYmUgcGxhY2VkIG9uIGFuCisgKiBpbnRlcm5hbCBiYWNrLXN0YWNrIG9mIHRoZSBvd25pbmcgYWN0aXZpdHkuICBXaGVuIHRoZSB1c2VyIHByZXNzZXMgYmFjaworICogaW4gdGhlIGFjdGl2aXR5LCBhbnkgdHJhbnNhY3Rpb25zIG9uIHRoZSBiYWNrIHN0YWNrIGFyZSBwb3BwZWQgb2ZmIGJlZm9yZQorICogdGhlIGFjdGl2aXR5IGl0c2VsZiBpcyBmaW5pc2hlZC4KKyAqCisgKiA8cD5Gb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhpcyBzaW1wbGUgZnJhZ21lbnQgdGhhdCBpcyBpbnN0YW50aWF0ZWQgd2l0aAorICogYW4gaW50ZWdlciBhcmd1bWVudCBhbmQgZGlzcGxheXMgdGhhdCBpbiBhIFRleHRWaWV3IGluIGl0cyBVSTo8L3A+CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudFN0YWNrLmphdmEKKyAqICAgICAgZnJhZ21lbnR9CisgKgorICogPHA+QSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGZyYWdtZW50LCByZXBsYWNpbmcKKyAqIHdoYXRldmVyIGN1cnJlbnQgZnJhZ21lbnQgaW5zdGFuY2UgaXMgYmVpbmcgc2hvd24gYW5kIHB1c2hpbmcgdGhhdCBjaGFuZ2UKKyAqIG9uIHRvIHRoZSBiYWNrIHN0YWNrIGNvdWxkIGJlIHdyaXR0ZW4gYXM6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudFN0YWNrLmphdmEKKyAqICAgICAgYWRkX3N0YWNrfQorICoKKyAqIDxwPkFmdGVyIGVhY2ggY2FsbCB0byB0aGlzIGZ1bmN0aW9uLCBhIG5ldyBlbnRyeSBpcyBvbiB0aGUgc3RhY2ssIGFuZAorICogcHJlc3NpbmcgYmFjayB3aWxsIHBvcCBpdCB0byByZXR1cm4gdGhlIHVzZXIgdG8gd2hhdGV2ZXIgcHJldmlvdXMgc3RhdGUKKyAqIHRoZSBhY3Rpdml0eSBVSSB3YXMgaW4uCisgKi8KK3B1YmxpYyBjbGFzcyBGcmFnbWVudCBpbXBsZW1lbnRzIENvbXBvbmVudENhbGxiYWNrcywgT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZywgQ2xhc3M8Pz4+IHNDbGFzc01hcCA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzPD8+PigpOworICAgIAorICAgIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTElaSU5HID0gMDsgICAgIC8vIE5vdCB5ZXQgY3JlYXRlZC4KKyAgICBzdGF0aWMgZmluYWwgaW50IENSRUFURUQgPSAxOyAgICAgICAgICAvLyBDcmVhdGVkLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfQ1JFQVRFRCA9IDI7IC8vIFRoZSBhY3Rpdml0eSBoYXMgZmluaXNoZWQgaXRzIGNyZWF0aW9uLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRFRCA9IDM7ICAgICAgICAgIC8vIENyZWF0ZWQgYW5kIHN0YXJ0ZWQsIG5vdCByZXN1bWVkLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVTVU1FRCA9IDQ7ICAgICAgICAgIC8vIENyZWF0ZWQgc3RhcnRlZCBhbmQgcmVzdW1lZC4KKyAgICAKKyAgICBpbnQgbVN0YXRlID0gSU5JVElBTElaSU5HOworICAgIAorICAgIC8vIFdoZW4gaW5zdGFudGlhdGVkIGZyb20gc2F2ZWQgc3RhdGUsIHRoaXMgaXMgdGhlIHNhdmVkIHN0YXRlLgorICAgIEJ1bmRsZSBtU2F2ZWRGcmFnbWVudFN0YXRlOworICAgIFNwYXJzZUFycmF5PFBhcmNlbGFibGU+IG1TYXZlZFZpZXdTdGF0ZTsKKyAgICAKKyAgICAvLyBJbmRleCBpbnRvIGFjdGl2ZSBmcmFnbWVudCBhcnJheS4KKyAgICBpbnQgbUluZGV4ID0gLTE7CisgICAgCisgICAgLy8gSW50ZXJuYWwgdW5pcXVlIG5hbWUgZm9yIHRoaXMgZnJhZ21lbnQ7CisgICAgU3RyaW5nIG1XaG87CisgICAgCisgICAgLy8gQ29uc3RydWN0aW9uIGFyZ3VtZW50czsKKyAgICBCdW5kbGUgbUFyZ3VtZW50czsKKworICAgIC8vIFRhcmdldCBmcmFnbWVudC4KKyAgICBGcmFnbWVudCBtVGFyZ2V0OworCisgICAgLy8gVGFyZ2V0IHJlcXVlc3QgY29kZS4KKyAgICBpbnQgbVRhcmdldFJlcXVlc3RDb2RlOworCisgICAgLy8gVHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaXMgaW4gdGhlIGxpc3Qgb2YgYWRkZWQgZnJhZ21lbnRzLgorICAgIGJvb2xlYW4gbUFkZGVkOworICAgIAorICAgIC8vIFRydWUgaWYgdGhlIGZyYWdtZW50IGlzIGluIHRoZSByZXN1bWVkIHN0YXRlLgorICAgIGJvb2xlYW4gbVJlc3VtZWQ7CisgICAgCisgICAgLy8gU2V0IHRvIHRydWUgaWYgdGhpcyBmcmFnbWVudCB3YXMgaW5zdGFudGlhdGVkIGZyb20gYSBsYXlvdXQgZmlsZS4KKyAgICBib29sZWFuIG1Gcm9tTGF5b3V0OworICAgIAorICAgIC8vIFNldCB0byB0cnVlIHdoZW4gdGhlIHZpZXcgaGFzIGFjdHVhbGx5IGJlZW4gaW5mbGF0ZWQgaW4gaXRzIGxheW91dC4KKyAgICBib29sZWFuIG1JbkxheW91dDsKKworICAgIC8vIE51bWJlciBvZiBhY3RpdmUgYmFjayBzdGFjayBlbnRyaWVzIHRoaXMgZnJhZ21lbnQgaXMgaW4uCisgICAgaW50IG1CYWNrU3RhY2tOZXN0aW5nOworICAgIAorICAgIC8vIFRoZSBmcmFnbWVudCBtYW5hZ2VyIHdlIGFyZSBhc3NvY2lhdGVkIHdpdGguICBTZXQgYXMgc29vbiBhcyB0aGUKKyAgICAvLyBmcmFnbWVudCBpcyB1c2VkIGluIGEgdHJhbnNhY3Rpb247IGNsZWFyZWQgYWZ0ZXIgaXQgaGFzIGJlZW4gcmVtb3ZlZAorICAgIC8vIGZyb20gYWxsIHRyYW5zYWN0aW9ucy4KKyAgICBGcmFnbWVudE1hbmFnZXIgbUZyYWdtZW50TWFuYWdlcjsKKworICAgIC8vIFNldCBhcyBzb29uIGFzIGEgZnJhZ21lbnQgaXMgYWRkZWQgdG8gYSB0cmFuc2FjdGlvbiAob3IgcmVtb3ZlZCksCisgICAgLy8gdG8gYmUgYWJsZSB0byBkbyB2YWxpZGF0aW9uLgorICAgIEFjdGl2aXR5IG1JbW1lZGlhdGVBY3Rpdml0eTsKKyAgICAKKyAgICAvLyBBY3Rpdml0eSB0aGlzIGZyYWdtZW50IGlzIGF0dGFjaGVkIHRvLgorICAgIEFjdGl2aXR5IG1BY3Rpdml0eTsKKyAgICAKKyAgICAvLyBUaGUgb3B0aW9uYWwgaWRlbnRpZmllciBmb3IgdGhpcyBmcmFnbWVudCAtLSBlaXRoZXIgdGhlIGNvbnRhaW5lciBJRCBpZiBpdAorICAgIC8vIHdhcyBkeW5hbWljYWxseSBhZGRlZCB0byB0aGUgdmlldyBoaWVyYXJjaHksIG9yIHRoZSBJRCBzdXBwbGllZCBpbgorICAgIC8vIGxheW91dC4KKyAgICBpbnQgbUZyYWdtZW50SWQ7CisgICAgCisgICAgLy8gV2hlbiBhIGZyYWdtZW50IGlzIGJlaW5nIGR5bmFtaWNhbGx5IGFkZGVkIHRvIHRoZSB2aWV3IGhpZXJhcmNoeSwgdGhpcworICAgIC8vIGlzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBwYXJlbnQgY29udGFpbmVyIGl0IGlzIGJlaW5nIGFkZGVkIHRvLgorICAgIGludCBtQ29udGFpbmVySWQ7CisgICAgCisgICAgLy8gVGhlIG9wdGlvbmFsIG5hbWVkIHRhZyBmb3IgdGhpcyBmcmFnbWVudCAtLSB1c3VhbGx5IHVzZWQgdG8gZmluZAorICAgIC8vIGZyYWdtZW50cyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgbGF5b3V0LgorICAgIFN0cmluZyBtVGFnOworICAgIAorICAgIC8vIFNldCB0byB0cnVlIHdoZW4gdGhlIGFwcCBoYXMgcmVxdWVzdGVkIHRoYXQgdGhpcyBmcmFnbWVudCBiZSBoaWRkZW4KKyAgICAvLyBmcm9tIHRoZSB1c2VyLgorICAgIGJvb2xlYW4gbUhpZGRlbjsKKyAgICAKKyAgICAvLyBJZiBzZXQgdGhpcyBmcmFnbWVudCB3b3VsZCBsaWtlIGl0cyBpbnN0YW5jZSByZXRhaW5lZCBhY3Jvc3MKKyAgICAvLyBjb25maWd1cmF0aW9uIGNoYW5nZXMuCisgICAgYm9vbGVhbiBtUmV0YWluSW5zdGFuY2U7CisgICAgCisgICAgLy8gSWYgc2V0IHRoaXMgZnJhZ21lbnQgaXMgYmVpbmcgcmV0YWluZWQgYWNyb3NzIHRoZSBjdXJyZW50IGNvbmZpZyBjaGFuZ2UuCisgICAgYm9vbGVhbiBtUmV0YWluaW5nOworICAgIAorICAgIC8vIElmIHNldCB0aGlzIGZyYWdtZW50IGhhcyBtZW51IGl0ZW1zIHRvIGNvbnRyaWJ1dGUuCisgICAgYm9vbGVhbiBtSGFzTWVudTsKKyAgICAKKyAgICAvLyBVc2VkIHRvIHZlcmlmeSB0aGF0IHN1YmNsYXNzZXMgY2FsbCB0aHJvdWdoIHRvIHN1cGVyIGNsYXNzLgorICAgIGJvb2xlYW4gbUNhbGxlZDsKKyAgICAKKyAgICAvLyBJZiBhcHAgaGFzIHJlcXVlc3RlZCBhIHNwZWNpZmljIGFuaW1hdGlvbiwgdGhpcyBpcyB0aGUgb25lIHRvIHVzZS4KKyAgICBpbnQgbU5leHRBbmltOworICAgIAorICAgIC8vIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoZSBmcmFnbWVudCBhZnRlciBkeW5hbWljYWxseSBhZGRlZCB0byBVSS4KKyAgICBWaWV3R3JvdXAgbUNvbnRhaW5lcjsKKyAgICAKKyAgICAvLyBUaGUgVmlldyBnZW5lcmF0ZWQgZm9yIHRoaXMgZnJhZ21lbnQuCisgICAgVmlldyBtVmlldzsKKyAgICAKKyAgICBMb2FkZXJNYW5hZ2VySW1wbCBtTG9hZGVyTWFuYWdlcjsKKyAgICBib29sZWFuIG1TdGFydGVkOworICAgIGJvb2xlYW4gbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyOworICAgIAorICAgIC8qKgorICAgICAqIFRocm93biBieSB7QGxpbmsgRnJhZ21lbnQjaW5zdGFudGlhdGUoQ29udGV4dCwgU3RyaW5nLCBCdW5kbGUpfSB3aGVuCisgICAgICogdGhlcmUgaXMgYW4gaW5zdGFudGlhdGlvbiBmYWlsdXJlLgorICAgICAqLworICAgIHN0YXRpYyBwdWJsaWMgY2xhc3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEFuZHJvaWRSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgcHVibGljIEluc3RhbnRpYXRpb25FeGNlcHRpb24oU3RyaW5nIG1zZywgRXhjZXB0aW9uIGNhdXNlKSB7CisgICAgICAgICAgICBzdXBlcihtc2csIGNhdXNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuICA8c3Ryb25nPkV2ZXJ5PC9zdHJvbmc+IGZyYWdtZW50IG11c3QgaGF2ZSBhbgorICAgICAqIGVtcHR5IGNvbnN0cnVjdG9yLCBzbyBpdCBjYW4gYmUgaW5zdGFudGlhdGVkIHdoZW4gcmVzdG9yaW5nIGl0cworICAgICAqIGFjdGl2aXR5J3Mgc3RhdGUuICBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHN1YmNsYXNzZXMgZG8gbm90CisgICAgICogaGF2ZSBvdGhlciBjb25zdHJ1Y3RvcnMgd2l0aCBwYXJhbWV0ZXJzLCBzaW5jZSB0aGVzZSBjb25zdHJ1Y3RvcnMKKyAgICAgKiB3aWxsIG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgZnJhZ21lbnQgaXMgcmUtaW5zdGFudGlhdGVkOyBpbnN0ZWFkLAorICAgICAqIGFyZ3VtZW50cyBjYW4gYmUgc3VwcGxpZWQgYnkgdGhlIGNhbGxlciB3aXRoIHtAbGluayAjc2V0QXJndW1lbnRzfQorICAgICAqIGFuZCBsYXRlciByZXRyaWV2ZWQgYnkgdGhlIEZyYWdtZW50IHdpdGgge0BsaW5rICNnZXRBcmd1bWVudHN9LgorICAgICAqIAorICAgICAqIDxwPkFwcGxpY2F0aW9ucyBzaG91bGQgZ2VuZXJhbGx5IG5vdCBpbXBsZW1lbnQgYSBjb25zdHJ1Y3Rvci4gIFRoZQorICAgICAqIGZpcnN0IHBsYWNlIGFwcGxpY2F0aW9uIGNvZGUgYW4gcnVuIHdoZXJlIHRoZSBmcmFnbWVudCBpcyByZWFkeSB0bworICAgICAqIGJlIHVzZWQgaXMgaW4ge0BsaW5rICNvbkF0dGFjaChBY3Rpdml0eSl9LCB0aGUgcG9pbnQgd2hlcmUgdGhlIGZyYWdtZW50CisgICAgICogaXMgYWN0dWFsbHkgYXNzb2NpYXRlZCB3aXRoIGl0cyBhY3Rpdml0eS4gIFNvbWUgYXBwbGljYXRpb25zIG1heSBhbHNvCisgICAgICogd2FudCB0byBpbXBsZW1lbnQge0BsaW5rICNvbkluZmxhdGV9IHRvIHJldHJpZXZlIGF0dHJpYnV0ZXMgZnJvbSBhCisgICAgICogbGF5b3V0IHJlc291cmNlLCB0aG91Z2ggc2hvdWxkIHRha2UgY2FyZSBoZXJlIGJlY2F1c2UgdGhpcyBoYXBwZW5zIGZvcgorICAgICAqIHRoZSBmcmFnbWVudCBpcyBhdHRhY2hlZCB0byBpdHMgYWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIExpa2Uge0BsaW5rICNpbnN0YW50aWF0ZShDb250ZXh0LCBTdHJpbmcsIEJ1bmRsZSl9IGJ1dCB3aXRoIGEgbnVsbAorICAgICAqIGFyZ3VtZW50IEJ1bmRsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZyYWdtZW50IGluc3RhbnRpYXRlKENvbnRleHQgY29udGV4dCwgU3RyaW5nIGZuYW1lKSB7CisgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZShjb250ZXh0LCBmbmFtZSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgRnJhZ21lbnQgd2l0aCB0aGUgZ2l2ZW4gY2xhc3MgbmFtZS4gIFRoaXMgaXMKKyAgICAgKiB0aGUgc2FtZSBhcyBjYWxsaW5nIGl0cyBlbXB0eSBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjYWxsaW5nIGNvbnRleHQgYmVpbmcgdXNlZCB0byBpbnN0YW50aWF0ZSB0aGUgZnJhZ21lbnQuCisgICAgICogVGhpcyBpcyBjdXJyZW50bHkganVzdCB1c2VkIHRvIGdldCBpdHMgQ2xhc3NMb2FkZXIuCisgICAgICogQHBhcmFtIGZuYW1lIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBmcmFnbWVudCB0byBpbnN0YW50aWF0ZS4KKyAgICAgKiBAcGFyYW0gYXJncyBCdW5kbGUgb2YgYXJndW1lbnRzIHRvIHN1cHBseSB0byB0aGUgZnJhZ21lbnQsIHdoaWNoIGl0CisgICAgICogY2FuIHJldHJpZXZlIHdpdGgge0BsaW5rICNnZXRBcmd1bWVudHMoKX0uICBNYXkgYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgZnJhZ21lbnQgaW5zdGFuY2UuCisgICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIElmIHRoZXJlIGlzIGEgZmFpbHVyZSBpbiBpbnN0YW50aWF0aW5nCisgICAgICogdGhlIGdpdmVuIGZyYWdtZW50IGNsYXNzLiAgVGhpcyBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uOyBpdCBpcyBub3QKKyAgICAgKiBub3JtYWxseSBleHBlY3RlZCB0byBoYXBwZW4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGcmFnbWVudCBpbnN0YW50aWF0ZShDb250ZXh0IGNvbnRleHQsIFN0cmluZyBmbmFtZSwgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzPD8+IGNsYXp6ID0gc0NsYXNzTWFwLmdldChmbmFtZSk7CisgICAgICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIENsYXNzIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGUsIHNlZSBpZiBpdCdzIHJlYWwsIGFuZCB0cnkgdG8gYWRkIGl0CisgICAgICAgICAgICAgICAgY2xhenogPSBjb250ZXh0LmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGZuYW1lKTsKKyAgICAgICAgICAgICAgICBzQ2xhc3NNYXAucHV0KGZuYW1lLCBjbGF6eik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGcmFnbWVudCBmID0gKEZyYWdtZW50KWNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBpZiAoYXJncyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXJncy5zZXRDbGFzc0xvYWRlcihmLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICAgICAgZi5tQXJndW1lbnRzID0gYXJnczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgZnJhZ21lbnQgIiArIGZuYW1lCisgICAgICAgICAgICAgICAgICAgICsgIjogbWFrZSBzdXJlIGNsYXNzIG5hbWUgZXhpc3RzLCBpcyBwdWJsaWMsIGFuZCBoYXMgYW4iCisgICAgICAgICAgICAgICAgICAgICsgIiBlbXB0eSBjb25zdHJ1Y3RvciB0aGF0IGlzIHB1YmxpYyIsIGUpOworICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcuSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGZyYWdtZW50ICIgKyBmbmFtZQorICAgICAgICAgICAgICAgICAgICArICI6IG1ha2Ugc3VyZSBjbGFzcyBuYW1lIGV4aXN0cywgaXMgcHVibGljLCBhbmQgaGFzIGFuIgorICAgICAgICAgICAgICAgICAgICArICIgZW1wdHkgY29uc3RydWN0b3IgdGhhdCBpcyBwdWJsaWMiLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGZyYWdtZW50ICIgKyBmbmFtZQorICAgICAgICAgICAgICAgICAgICArICI6IG1ha2Ugc3VyZSBjbGFzcyBuYW1lIGV4aXN0cywgaXMgcHVibGljLCBhbmQgaGFzIGFuIgorICAgICAgICAgICAgICAgICAgICArICIgZW1wdHkgY29uc3RydWN0b3IgdGhhdCBpcyBwdWJsaWMiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIHJlc3RvcmVWaWV3U3RhdGUoKSB7CisgICAgICAgIGlmIChtU2F2ZWRWaWV3U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVZpZXcucmVzdG9yZUhpZXJhcmNoeVN0YXRlKG1TYXZlZFZpZXdTdGF0ZSk7CisgICAgICAgICAgICBtU2F2ZWRWaWV3U3RhdGUgPSBudWxsOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgc2V0SW5kZXgoaW50IGluZGV4KSB7CisgICAgICAgIG1JbmRleCA9IGluZGV4OworICAgICAgICBtV2hvID0gImFuZHJvaWQ6ZnJhZ21lbnQ6IiArIG1JbmRleDsKKyAgIH0KKyAgICAKKyAgICB2b2lkIGNsZWFySW5kZXgoKSB7CisgICAgICAgIG1JbmRleCA9IC0xOworICAgICAgICBtV2hvID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU3ViY2xhc3NlcyBjYW4gbm90IG92ZXJyaWRlIGVxdWFscygpLgorICAgICAqLworICAgIEBPdmVycmlkZSBmaW5hbCBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmVxdWFscyhvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzc2VzIGNhbiBub3Qgb3ZlcnJpZGUgaGFzaENvZGUoKS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUgZmluYWwgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMjgpOworICAgICAgICBzYi5hcHBlbmQoIkZyYWdtZW50eyIpOworICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZSh0aGlzKSkpOworICAgICAgICBpZiAobUluZGV4ID49IDApIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICMiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChtSW5kZXgpOworICAgICAgICB9CisgICAgICAgIGlmIChtRnJhZ21lbnRJZCAhPSAwKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBpZD0weCIpOworICAgICAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcobUZyYWdtZW50SWQpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVRhZyAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChtVGFnKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoJ30nKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaWRlbnRpZmllciB0aGlzIGZyYWdtZW50IGlzIGtub3duIGJ5LiAgVGhpcyBpcyBlaXRoZXIKKyAgICAgKiB0aGUgYW5kcm9pZDppZCB2YWx1ZSBzdXBwbGllZCBpbiBhIGxheW91dCBvciB0aGUgY29udGFpbmVyIHZpZXcgSUQKKyAgICAgKiBzdXBwbGllZCB3aGVuIGFkZGluZyB0aGUgZnJhZ21lbnQuCisgICAgICovCisgICAgZmluYWwgcHVibGljIGludCBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudElkOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHRhZyBuYW1lIG9mIHRoZSBmcmFnbWVudCwgaWYgc3BlY2lmaWVkLgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBTdHJpbmcgZ2V0VGFnKCkgeworICAgICAgICByZXR1cm4gbVRhZzsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU3VwcGx5IHRoZSBjb25zdHJ1Y3Rpb24gYXJndW1lbnRzIGZvciB0aGlzIGZyYWdtZW50LiAgVGhpcyBjYW4gb25seQorICAgICAqIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGZyYWdtZW50IGhhcyBiZWVuIGF0dGFjaGVkIHRvIGl0cyBhY3Rpdml0eTsgdGhhdAorICAgICAqIGlzLCB5b3Ugc2hvdWxkIGNhbGwgaXQgaW1tZWRpYXRlbHkgYWZ0ZXIgY29uc3RydWN0aW5nIHRoZSBmcmFnbWVudC4gIFRoZQorICAgICAqIGFyZ3VtZW50cyBzdXBwbGllZCBoZXJlIHdpbGwgYmUgcmV0YWluZWQgYWNyb3NzIGZyYWdtZW50IGRlc3Ryb3kgYW5kCisgICAgICogY3JlYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnRzKEJ1bmRsZSBhcmdzKSB7CisgICAgICAgIGlmIChtSW5kZXggPj0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ21lbnQgYWxyZWFkeSBhY3RpdmUiKTsKKyAgICAgICAgfQorICAgICAgICBtQXJndW1lbnRzID0gYXJnczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFyZ3VtZW50cyBzdXBwbGllZCB3aGVuIHRoZSBmcmFnbWVudCB3YXMgaW5zdGFudGlhdGVkLAorICAgICAqIGlmIGFueS4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgQnVuZGxlIGdldEFyZ3VtZW50cygpIHsKKyAgICAgICAgcmV0dXJuIG1Bcmd1bWVudHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3B0aW9uYWwgdGFyZ2V0IGZvciB0aGlzIGZyYWdtZW50LiAgVGhpcyBtYXkgYmUgdXNlZCwgZm9yIGV4YW1wbGUsCisgICAgICogaWYgdGhpcyBmcmFnbWVudCBpcyBiZWluZyBzdGFydGVkIGJ5IGFub3RoZXIsIGFuZCB3aGVuIGRvbmUgd2FudHMgdG8KKyAgICAgKiBnaXZlIGEgcmVzdWx0IGJhY2sgdG8gdGhlIGZpcnN0LiAgVGhlIHRhcmdldCBzZXQgaGVyZSBpcyByZXRhaW5lZAorICAgICAqIGFjcm9zcyBpbnN0YW5jZXMgdmlhIHtAbGluayBGcmFnbWVudE1hbmFnZXIjcHV0RnJhZ21lbnQKKyAgICAgKiBGcmFnbWVudE1hbmFnZXIucHV0RnJhZ21lbnQoKX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIGZyYWdtZW50IHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGlzIG9uZS4KKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvZGUgT3B0aW9uYWwgcmVxdWVzdCBjb2RlLCBmb3IgY29udmVuaWVuY2UgaWYgeW91CisgICAgICogYXJlIGdvaW5nIHRvIGNhbGwgYmFjayB3aXRoIHtAbGluayAjb25BY3Rpdml0eVJlc3VsdChpbnQsIGludCwgSW50ZW50KX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0RnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIGludCByZXF1ZXN0Q29kZSkgeworICAgICAgICBtVGFyZ2V0ID0gZnJhZ21lbnQ7CisgICAgICAgIG1UYXJnZXRSZXF1ZXN0Q29kZSA9IHJlcXVlc3RDb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGFyZ2V0IGZyYWdtZW50IHNldCBieSB7QGxpbmsgI3NldFRhcmdldEZyYWdtZW50fS4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgRnJhZ21lbnQgZ2V0VGFyZ2V0RnJhZ21lbnQoKSB7CisgICAgICAgIHJldHVybiBtVGFyZ2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGFyZ2V0IHJlcXVlc3QgY29kZSBzZXQgYnkge0BsaW5rICNzZXRUYXJnZXRGcmFnbWVudH0uCisgICAgICovCisgICAgZmluYWwgcHVibGljIGludCBnZXRUYXJnZXRSZXF1ZXN0Q29kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UYXJnZXRSZXF1ZXN0Q29kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIEFjdGl2aXR5IHRoaXMgZnJhZ21lbnQgaXMgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aC4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgQWN0aXZpdHkgZ2V0QWN0aXZpdHkoKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZpdHk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgRnJhZ21lbnRNYW5hZ2VyIGZvciBpbnRlcmFjdGluZyB3aXRoIGZyYWdtZW50cyBhc3NvY2lhdGVkCisgICAgICogd2l0aCB0aGlzIGZyYWdtZW50J3MgYWN0aXZpdHkuICBOb3RlIHRoYXQgdGhpcyB3aWxsIGJlIG5vbi1udWxsIHNsaWdodGx5CisgICAgICogYmVmb3JlIHtAbGluayAjZ2V0QWN0aXZpdHkoKX0sIGR1cmluZyB0aGUgdGltZSBmcm9tIHdoZW4gdGhlIGZyYWdtZW50IGlzCisgICAgICogcGxhY2VkIGluIGEge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb259IHVudGlsIGl0IGlzIGNvbW1pdHRlZCBhbmQKKyAgICAgKiBhdHRhY2hlZCB0byBpdHMgYWN0aXZpdHkuCisgICAgICovCisgICAgZmluYWwgcHVibGljIEZyYWdtZW50TWFuYWdlciBnZXRGcmFnbWVudE1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnRNYW5hZ2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBpcyBjdXJyZW50bHkgYWRkZWQgdG8gaXRzIGFjdGl2aXR5LgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBib29sZWFuIGlzQWRkZWQoKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZpdHkgIT0gbnVsbCAmJiBtQWN0aXZpdHkubUZyYWdtZW50cy5tQWRkZWQuY29udGFpbnModGhpcyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBsYXlvdXQgaXMgaW5jbHVkZWQgYXMgcGFydCBvZiBhbiBhY3Rpdml0eSB2aWV3CisgICAgICogaGllcmFyY2h5IHZpYSB0aGUgJmx0O2ZyYWdtZW50Jmd0OyB0YWcuICBUaGlzIHdpbGwgYWx3YXlzIGJlIHRydWUgd2hlbgorICAgICAqIGZyYWdtZW50cyBhcmUgY3JlYXRlZCB0aHJvdWdoIHRoZSAmbHQ7ZnJhZ21lbnQmZ3Q7IHRhZywgPGVtPmV4Y2VwdDwvZW0+CisgICAgICogaW4gdGhlIGNhc2Ugd2hlcmUgYW4gb2xkIGZyYWdtZW50IGlzIHJlc3RvcmVkIGZyb20gYSBwcmV2aW91cyBzdGF0ZSBhbmQKKyAgICAgKiBpdCBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlIGxheW91dCBvZiB0aGUgY3VycmVudCBzdGF0ZS4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBpc0luTGF5b3V0KCkgeworICAgICAgICByZXR1cm4gbUluTGF5b3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBpcyBpbiB0aGUgcmVzdW1lZCBzdGF0ZS4gIFRoaXMgaXMgdHJ1ZQorICAgICAqIGZvciB0aGUgZHVyYXRpb24gb2Yge0BsaW5rICNvblJlc3VtZSgpfSBhbmQge0BsaW5rICNvblBhdXNlKCl9IGFzIHdlbGwuCisgICAgICovCisgICAgZmluYWwgcHVibGljIGJvb2xlYW4gaXNSZXN1bWVkKCkgeworICAgICAgICByZXR1cm4gbVJlc3VtZWQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBpcyBjdXJyZW50bHkgdmlzaWJsZSB0byB0aGUgdXNlci4gIFRoaXMgbWVhbnMKKyAgICAgKiBpdDogKDEpIGhhcyBiZWVuIGFkZGVkLCAoMikgaGFzIGl0cyB2aWV3IGF0dGFjaGVkIHRvIHRoZSB3aW5kb3csIGFuZCAKKyAgICAgKiAoMykgaXMgbm90IGhpZGRlbi4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CisgICAgICAgIHJldHVybiBpc0FkZGVkKCkgJiYgIWlzSGlkZGVuKCkgJiYgbVZpZXcgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG1WaWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCAmJiBtVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaGFzIGJlZW4gaGlkZGVuLiAgQnkgZGVmYXVsdCBmcmFnbWVudHMKKyAgICAgKiBhcmUgc2hvd24uICBZb3UgY2FuIGZpbmQgb3V0IGFib3V0IGNoYW5nZXMgdG8gdGhpcyBzdGF0ZSB3aXRoCisgICAgICoge0BsaW5rICNvbkhpZGRlbkNoYW5nZWR9LiAgTm90ZSB0aGF0IHRoZSBoaWRkZW4gc3RhdGUgaXMgb3J0aG9nb25hbAorICAgICAqIHRvIG90aGVyIHN0YXRlcyAtLSB0aGF0IGlzLCB0byBiZSB2aXNpYmxlIHRvIHRoZSB1c2VyLCBhIGZyYWdtZW50CisgICAgICogbXVzdCBiZSBib3RoIHN0YXJ0ZWQgYW5kIG5vdCBoaWRkZW4uCisgICAgICovCisgICAgZmluYWwgcHVibGljIGJvb2xlYW4gaXNIaWRkZW4oKSB7CisgICAgICAgIHJldHVybiBtSGlkZGVuOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgaGlkZGVuIHN0YXRlIChhcyByZXR1cm5lZCBieSB7QGxpbmsgI2lzSGlkZGVuKCl9IG9mCisgICAgICogdGhlIGZyYWdtZW50IGhhcyBjaGFuZ2VkLiAgRnJhZ21lbnRzIHN0YXJ0IG91dCBub3QgaGlkZGVuOyB0aGlzIHdpbGwKKyAgICAgKiBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIGZyYWdtZW50IGNoYW5nZXMgc3RhdGUgZnJvbSB0aGF0LgorICAgICAqIEBwYXJhbSBoaWRkZW4gVHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaXMgbm93IGhpZGRlbiwgZmFsc2UgaWYgaXQgaXMgbm90CisgICAgICogdmlzaWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkhpZGRlbkNoYW5nZWQoYm9vbGVhbiBoaWRkZW4pIHsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29udHJvbCB3aGV0aGVyIGEgZnJhZ21lbnQgaW5zdGFuY2UgaXMgcmV0YWluZWQgYWNyb3NzIEFjdGl2aXR5CisgICAgICogcmUtY3JlYXRpb24gKHN1Y2ggYXMgZnJvbSBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlKS4gIFRoaXMgY2FuIG9ubHkKKyAgICAgKiBiZSB1c2VkIHdpdGggZnJhZ21lbnRzIG5vdCBpbiB0aGUgYmFjayBzdGFjay4gIElmIHNldCwgdGhlIGZyYWdtZW50CisgICAgICogbGlmZWN5Y2xlIHdpbGwgYmUgc2xpZ2h0bHkgZGlmZmVyZW50IHdoZW4gYW4gYWN0aXZpdHkgaXMgcmVjcmVhdGVkOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+IHtAbGluayAjb25EZXN0cm95KCl9IHdpbGwgbm90IGJlIGNhbGxlZCAoYnV0IHtAbGluayAjb25EZXRhY2goKX0gc3RpbGwKKyAgICAgKiB3aWxsIGJlLCBiZWNhdXNlIHRoZSBmcmFnbWVudCBpcyBiZWluZyBkZXRhY2hlZCBmcm9tIGl0cyBjdXJyZW50IGFjdGl2aXR5KS4KKyAgICAgKiA8bGk+IHtAbGluayAjb25DcmVhdGUoQnVuZGxlKX0gd2lsbCBub3QgYmUgY2FsbGVkIHNpbmNlIHRoZSBmcmFnbWVudAorICAgICAqIGlzIG5vdCBiZWluZyByZS1jcmVhdGVkLgorICAgICAqIDxsaT4ge0BsaW5rICNvbkF0dGFjaChBY3Rpdml0eSl9IGFuZCB7QGxpbmsgI29uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSl9IDxiPndpbGw8L2I+CisgICAgICogc3RpbGwgYmUgY2FsbGVkLgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmV0YWluSW5zdGFuY2UoYm9vbGVhbiByZXRhaW4pIHsKKyAgICAgICAgbVJldGFpbkluc3RhbmNlID0gcmV0YWluOworICAgIH0KKyAgICAKKyAgICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBnZXRSZXRhaW5JbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXRhaW5JbnN0YW5jZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVwb3J0IHRoYXQgdGhpcyBmcmFnbWVudCB3b3VsZCBsaWtlIHRvIHBhcnRpY2lwYXRlIGluIHBvcHVsYXRpbmcKKyAgICAgKiB0aGUgb3B0aW9ucyBtZW51IGJ5IHJlY2VpdmluZyBhIGNhbGwgdG8ge0BsaW5rICNvbkNyZWF0ZU9wdGlvbnNNZW51fQorICAgICAqIGFuZCByZWxhdGVkIG1ldGhvZHMuCisgICAgICogCisgICAgICogQHBhcmFtIGhhc01lbnUgSWYgdHJ1ZSwgdGhlIGZyYWdtZW50IGhhcyBtZW51IGl0ZW1zIHRvIGNvbnRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGFzT3B0aW9uc01lbnUoYm9vbGVhbiBoYXNNZW51KSB7CisgICAgICAgIGlmIChtSGFzTWVudSAhPSBoYXNNZW51KSB7CisgICAgICAgICAgICBtSGFzTWVudSA9IGhhc01lbnU7CisgICAgICAgICAgICBpZiAoaXNBZGRlZCgpICYmICFpc0hpZGRlbigpKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2aXR5LmludmFsaWRhdGVPcHRpb25zTWVudSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTG9hZGVyTWFuYWdlciBmb3IgdGhpcyBmcmFnbWVudCwgY3JlYXRpbmcgaXQgaWYgbmVlZGVkLgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXJNYW5hZ2VyIGdldExvYWRlck1hbmFnZXIoKSB7CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvYWRlck1hbmFnZXI7CisgICAgICAgIH0KKyAgICAgICAgbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyID0gdHJ1ZTsKKyAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBtQWN0aXZpdHkuZ2V0TG9hZGVyTWFuYWdlcihtSW5kZXgsIG1TdGFydGVkLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1Mb2FkZXJNYW5hZ2VyOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsIHtAbGluayBBY3Rpdml0eSNzdGFydEFjdGl2aXR5KEludGVudCl9IG9uIHRoZSBmcmFnbWVudCdzCisgICAgICogY29udGFpbmluZyBBY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgbUFjdGl2aXR5LnN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQodGhpcywgaW50ZW50LCAtMSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGwge0BsaW5rIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoSW50ZW50LCBpbnQpfSBvbiB0aGUgZnJhZ21lbnQncworICAgICAqIGNvbnRhaW5pbmcgQWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQgaW50ZW50LCBpbnQgcmVxdWVzdENvZGUpIHsKKyAgICAgICAgbUFjdGl2aXR5LnN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQodGhpcywgaW50ZW50LCByZXF1ZXN0Q29kZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlY2VpdmUgdGhlIHJlc3VsdCBmcm9tIGEgcHJldmlvdXMgY2FsbCB0bworICAgICAqIHtAbGluayAjc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQsIGludCl9LiAgVGhpcyBmb2xsb3dzIHRoZQorICAgICAqIHJlbGF0ZWQgQWN0aXZpdHkgQVBJIGFzIGRlc2NyaWJlZCB0aGVyZSBpbgorICAgICAqIHtAbGluayBBY3Rpdml0eSNvbkFjdGl2aXR5UmVzdWx0KGludCwgaW50LCBJbnRlbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvZGUgVGhlIGludGVnZXIgcmVxdWVzdCBjb2RlIG9yaWdpbmFsbHkgc3VwcGxpZWQgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eUZvclJlc3VsdCgpLCBhbGxvd2luZyB5b3UgdG8gaWRlbnRpZnkgd2hvIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgcmVzdWx0IGNhbWUgZnJvbS4KKyAgICAgKiBAcGFyYW0gcmVzdWx0Q29kZSBUaGUgaW50ZWdlciByZXN1bHQgY29kZSByZXR1cm5lZCBieSB0aGUgY2hpbGQgYWN0aXZpdHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB0aHJvdWdoIGl0cyBzZXRSZXN1bHQoKS4KKyAgICAgKiBAcGFyYW0gZGF0YSBBbiBJbnRlbnQsIHdoaWNoIGNhbiByZXR1cm4gcmVzdWx0IGRhdGEgdG8gdGhlIGNhbGxlcgorICAgICAqICAgICAgICAgICAgICAgKHZhcmlvdXMgZGF0YSBjYW4gYmUgYXR0YWNoZWQgdG8gSW50ZW50ICJleHRyYXMiKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgZnJhZ21lbnQgaXMgYmVpbmcgY3JlYXRlZCBhcyBwYXJ0IG9mIGEgdmlldyBsYXlvdXQKKyAgICAgKiBpbmZsYXRpb24sIHR5cGljYWxseSBmcm9tIHNldHRpbmcgdGhlIGNvbnRlbnQgdmlldyBvZiBhbiBhY3Rpdml0eS4gIFRoaXMKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgZnJhZ21lbnQgaXMgY3JlYXRlZCBmcm9tIGEgPGZyYWdtZW50PgorICAgICAqIHRhZyBpbiBhIGxheW91dCBmaWxlLiAgTm90ZSB0aGlzIGlzIDxlbT5iZWZvcmU8L2VtPiB0aGUgZnJhZ21lbnQncworICAgICAqIHtAbGluayAjb25BdHRhY2goQWN0aXZpdHkpfSBoYXMgYmVlbiBjYWxsZWQ7IGFsbCB5b3Ugc2hvdWxkIGRvIGhlcmUgaXMKKyAgICAgKiBwYXJzZSB0aGUgYXR0cmlidXRlcyBhbmQgc2F2ZSB0aGVtIGF3YXkuICBBIGNvbnZlbmllbnQgdGhpbmcgdG8gZG8gaXMKKyAgICAgKiBzaW1wbHkgY29weSB0aGVtIGludG8gYSBCdW5kbGUgdGhhdCBpcyBnaXZlbiB0byB7QGxpbmsgI3NldEFyZ3VtZW50cyhCdW5kbGUpfS4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGlzIGlzIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBmcmFnbWVudCBpcyBpbmZsYXRlZCwgZXZlbiBpZiBpdCBpcworICAgICAqIGJlaW5nIGluZmxhdGVkIGludG8gYSBuZXcgaW5zdGFuY2Ugd2l0aCBzYXZlZCBzdGF0ZS4gIEJlY2F1c2UgYSBmcmFnbWVudCdzCisgICAgICogYXJndW1lbnRzIGFyZSByZXRhaW5lZCBhY3Jvc3MgaW5zdGFuY2VzLCBpdCBtYXkgbWFrZSBubyBzZW5zZSB0byByZS1wYXJzZQorICAgICAqIHRoZSBhdHRyaWJ1dGVzIGludG8gbmV3IGFyZ3VtZW50cy4gIFlvdSBtYXkgd2FudCB0byBmaXJzdCBjaGVjaworICAgICAqIHtAbGluayAjZ2V0QXJndW1lbnRzKCl9IGFuZCBvbmx5IHBhcnNlIHRoZSBhdHRyaWJ1dGVzIGlmIGl0IHJldHVybnMgbnVsbCwKKyAgICAgKiB0aGUgYXNzdW1wdGlvbiBiZWluZyB0aGF0IGlmIGl0IGlzIG5vbi1udWxsIHRob3NlIGFyZSB0aGUgc2FtZSBhcmd1bWVudHMKKyAgICAgKiBmcm9tIHRoZSBmaXJzdCB0aW1lIHRoZSBmcmFnbWVudCB3YXMgaW5mbGF0ZWQuICAoVGhhdCBzYWlkLCB5b3UgbWF5IHdhbnQKKyAgICAgKiB0byBoYXZlIGxheW91dHMgY2hhbmdlIGZvciBkaWZmZXJlbnQgY29uZmlndXJhdGlvbnMgc3VjaCBhcyBsYW5kc2NhcGUKKyAgICAgKiBhbmQgcG9ydHJhaXQsIHdoaWNoIGNhbiBoYXZlIGRpZmZlcmVudCBhdHRyaWJ1dGVzLiAgSWYgc28sIHlvdSB3aWxsIG5lZWQKKyAgICAgKiB0byByZS1wYXJzZSB0aGUgYXR0cmlidXRlcyBlYWNoIHRpbWUgdGhpcyBpcyBjYWxsZWQgdG8gZ2VuZXJhdGUgbmV3CisgICAgICogYXJndW1lbnRzLik8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGF0dHJzIFRoZSBhdHRyaWJ1dGVzIGF0IHRoZSB0YWcgd2hlcmUgdGhlIGZyYWdtZW50IGlzCisgICAgICogYmVpbmcgY3JlYXRlZC4KKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIHRoZSBmcmFnbWVudCBpcyBiZWluZyByZS1jcmVhdGVkIGZyb20KKyAgICAgKiBhIHByZXZpb3VzIHNhdmVkIHN0YXRlLCB0aGlzIGlzIHRoZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkluZmxhdGUoQXR0cmlidXRlU2V0IGF0dHJzLCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBhIGZyYWdtZW50IGlzIGZpcnN0IGF0dGFjaGVkIHRvIGl0cyBhY3Rpdml0eS4KKyAgICAgKiB7QGxpbmsgI29uQ3JlYXRlKEJ1bmRsZSl9IHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoaXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25BdHRhY2goQWN0aXZpdHkgYWN0aXZpdHkpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgZnJhZ21lbnQgbG9hZHMgYW4gYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBBbmltYXRvciBvbkNyZWF0ZUFuaW1hdG9yKGludCB0cmFuc2l0LCBib29sZWFuIGVudGVyLCBpbnQgbmV4dEFuaW0pIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB0byBkbyBpbml0aWFsIGNyZWF0aW9uIG9mIGEgZnJhZ21lbnQuICBUaGlzIGlzIGNhbGxlZCBhZnRlcgorICAgICAqIHtAbGluayAjb25BdHRhY2goQWN0aXZpdHkpfSBhbmQgYmVmb3JlCisgICAgICoge0BsaW5rICNvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIsIFZpZXdHcm91cCwgQnVuZGxlKX0uCisgICAgICogCisgICAgICogPHA+Tm90ZSB0aGF0IHRoaXMgY2FuIGJlIGNhbGxlZCB3aGlsZSB0aGUgZnJhZ21lbnQncyBhY3Rpdml0eSBpcworICAgICAqIHN0aWxsIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGNyZWF0ZWQuICBBcyBzdWNoLCB5b3UgY2FuIG5vdCByZWx5CisgICAgICogb24gdGhpbmdzIGxpa2UgdGhlIGFjdGl2aXR5J3MgY29udGVudCB2aWV3IGhpZXJhcmNoeSBiZWluZyBpbml0aWFsaXplZAorICAgICAqIGF0IHRoaXMgcG9pbnQuICBJZiB5b3Ugd2FudCB0byBkbyB3b3JrIG9uY2UgdGhlIGFjdGl2aXR5IGl0c2VsZiBpcworICAgICAqIGNyZWF0ZWQsIHNlZSB7QGxpbmsgI29uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBzYXZlZEluc3RhbmNlU3RhdGUgSWYgdGhlIGZyYWdtZW50IGlzIGJlaW5nIHJlLWNyZWF0ZWQgZnJvbQorICAgICAqIGEgcHJldmlvdXMgc2F2ZWQgc3RhdGUsIHRoaXMgaXMgdGhlIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB0byBoYXZlIHRoZSBmcmFnbWVudCBpbnN0YW50aWF0ZSBpdHMgdXNlciBpbnRlcmZhY2Ugdmlldy4KKyAgICAgKiBUaGlzIGlzIG9wdGlvbmFsLCBhbmQgbm9uLWdyYXBoaWNhbCBmcmFnbWVudHMgY2FuIHJldHVybiBudWxsICh3aGljaAorICAgICAqIGlzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uKS4gIFRoaXMgd2lsbCBiZSBjYWxsZWQgYmV0d2VlbgorICAgICAqIHtAbGluayAjb25DcmVhdGUoQnVuZGxlKX0gYW5kIHtAbGluayAjb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlKX0uCisgICAgICogCisgICAgICogPHA+SWYgeW91IHJldHVybiBhIFZpZXcgZnJvbSBoZXJlLCB5b3Ugd2lsbCBsYXRlciBiZSBjYWxsZWQgaW4KKyAgICAgKiB7QGxpbmsgI29uRGVzdHJveVZpZXd9IHdoZW4gdGhlIHZpZXcgaXMgYmVpbmcgcmVsZWFzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGluZmxhdGVyIFRoZSBMYXlvdXRJbmZsYXRlciBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBpbmZsYXRlCisgICAgICogYW55IHZpZXdzIGluIHRoZSBmcmFnbWVudCwKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIElmIG5vbi1udWxsLCB0aGlzIGlzIHRoZSBwYXJlbnQgdmlldyB0aGF0IHRoZSBmcmFnbWVudCdzCisgICAgICogVUkgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLiAgVGhlIGZyYWdtZW50IHNob3VsZCBub3QgYWRkIHRoZSB2aWV3IGl0c2VsZiwKKyAgICAgKiBidXQgdGhpcyBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgTGF5b3V0UGFyYW1zIG9mIHRoZSB2aWV3LgorICAgICAqIEBwYXJhbSBzYXZlZEluc3RhbmNlU3RhdGUgSWYgbm9uLW51bGwsIHRoaXMgZnJhZ21lbnQgaXMgYmVpbmcgcmUtY29uc3RydWN0ZWQKKyAgICAgKiBmcm9tIGEgcHJldmlvdXMgc2F2ZWQgc3RhdGUgYXMgZ2l2ZW4gaGVyZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybiB0aGUgVmlldyBmb3IgdGhlIGZyYWdtZW50J3MgVUksIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIFZpZXcgZ2V0VmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1WaWV3OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZnJhZ21lbnQncyBhY3Rpdml0eSBoYXMgYmVlbiBjcmVhdGVkIGFuZCB0aGlzCisgICAgICogZnJhZ21lbnQncyB2aWV3IGhpZXJhcmNoeSBpbnN0YW50aWF0ZWQuICBJdCBjYW4gYmUgdXNlZCB0byBkbyBmaW5hbAorICAgICAqIGluaXRpYWxpemF0aW9uIG9uY2UgdGhlc2UgcGllY2VzIGFyZSBpbiBwbGFjZSwgc3VjaCBhcyByZXRyaWV2aW5nCisgICAgICogdmlld3Mgb3IgcmVzdG9yaW5nIHN0YXRlLiAgSXQgaXMgYWxzbyB1c2VmdWwgZm9yIGZyYWdtZW50cyB0aGF0IHVzZQorICAgICAqIHtAbGluayAjc2V0UmV0YWluSW5zdGFuY2UoYm9vbGVhbil9IHRvIHJldGFpbiB0aGVpciBpbnN0YW5jZSwKKyAgICAgKiBhcyB0aGlzIGNhbGxiYWNrIHRlbGxzIHRoZSBmcmFnbWVudCB3aGVuIGl0IGlzIGZ1bGx5IGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoZSBuZXcgYWN0aXZpdHkgaW5zdGFuY2UuICBUaGlzIGlzIGNhbGxlZCBhZnRlciB7QGxpbmsgI29uQ3JlYXRlVmlld30KKyAgICAgKiBhbmQgYmVmb3JlIHtAbGluayAjb25TdGFydCgpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIHRoZSBmcmFnbWVudCBpcyBiZWluZyByZS1jcmVhdGVkIGZyb20KKyAgICAgKiBhIHByZXZpb3VzIHNhdmVkIHN0YXRlLCB0aGlzIGlzIHRoZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgRnJhZ21lbnQgaXMgdmlzaWJsZSB0byB0aGUgdXNlci4gIFRoaXMgaXMgZ2VuZXJhbGx5CisgICAgICogdGllZCB0byB7QGxpbmsgQWN0aXZpdHkjb25TdGFydCgpIEFjdGl2aXR5Lm9uU3RhcnR9IG9mIHRoZSBjb250YWluaW5nCisgICAgICogQWN0aXZpdHkncyBsaWZlY3ljbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKCFtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIpIHsKKyAgICAgICAgICAgIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlciA9IHRydWU7CisgICAgICAgICAgICBtTG9hZGVyTWFuYWdlciA9IG1BY3Rpdml0eS5nZXRMb2FkZXJNYW5hZ2VyKG1JbmRleCwgbVN0YXJ0ZWQsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9TdGFydCgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBmcmFnbWVudCBpcyB2aXNpYmxlIHRvIHRoZSB1c2VyIGFuZCBhY3RpdmVseSBydW5uaW5nLgorICAgICAqIFRoaXMgaXMgZ2VuZXJhbGx5CisgICAgICogdGllZCB0byB7QGxpbmsgQWN0aXZpdHkjb25SZXN1bWUoKSBBY3Rpdml0eS5vblJlc3VtZX0gb2YgdGhlIGNvbnRhaW5pbmcKKyAgICAgKiBBY3Rpdml0eSdzIGxpZmVjeWNsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB0byBhc2sgdGhlIGZyYWdtZW50IHRvIHNhdmUgaXRzIGN1cnJlbnQgZHluYW1pYyBzdGF0ZSwgc28gaXQKKyAgICAgKiBjYW4gbGF0ZXIgYmUgcmVjb25zdHJ1Y3RlZCBpbiBhIG5ldyBpbnN0YW5jZSBvZiBpdHMgcHJvY2VzcyBpcworICAgICAqIHJlc3RhcnRlZC4gIElmIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBmcmFnbWVudCBsYXRlciBuZWVkcyB0byBiZQorICAgICAqIGNyZWF0ZWQsIHRoZSBkYXRhIHlvdSBwbGFjZSBpbiB0aGUgQnVuZGxlIGhlcmUgd2lsbCBiZSBhdmFpbGFibGUKKyAgICAgKiBpbiB0aGUgQnVuZGxlIGdpdmVuIHRvIHtAbGluayAjb25DcmVhdGUoQnVuZGxlKX0sCisgICAgICoge0BsaW5rICNvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIsIFZpZXdHcm91cCwgQnVuZGxlKX0sIGFuZAorICAgICAqIHtAbGluayAjb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlKX0uCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGNvcnJlc3BvbmRzIHRvIHtAbGluayBBY3Rpdml0eSNvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSkKKyAgICAgKiBBY3Rpdml0eS5vblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSl9IGFuZCBtb3N0IG9mIHRoZSBkaXNjdXNzaW9uIHRoZXJlCisgICAgICogYXBwbGllcyBoZXJlIGFzIHdlbGwuICBOb3RlIGhvd2V2ZXI6IDxlbT50aGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkCisgICAgICogYXQgYW55IHRpbWUgYmVmb3JlIHtAbGluayAjb25EZXN0cm95KCl9PC9lbT4uICBUaGVyZSBhcmUgbWFueSBzaXR1YXRpb25zCisgICAgICogd2hlcmUgYSBmcmFnbWVudCBtYXkgYmUgbW9zdGx5IHRvcm4gZG93biAoc3VjaCBhcyB3aGVuIHBsYWNlZCBvbiB0aGUKKyAgICAgKiBiYWNrIHN0YWNrIHdpdGggbm8gVUkgc2hvd2luZyksIGJ1dCBpdHMgc3RhdGUgd2lsbCBub3QgYmUgc2F2ZWQgdW50aWwKKyAgICAgKiBpdHMgb3duaW5nIGFjdGl2aXR5IGFjdHVhbGx5IG5lZWRzIHRvIHNhdmUgaXRzIHN0YXRlLgorICAgICAqCisgICAgICogQHBhcmFtIG91dFN0YXRlIEJ1bmRsZSBpbiB3aGljaCB0byBwbGFjZSB5b3VyIHNhdmVkIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBGcmFnbWVudCBpcyBubyBsb25nZXIgcmVzdW1lZC4gIFRoaXMgaXMgZ2VuZXJhbGx5CisgICAgICogdGllZCB0byB7QGxpbmsgQWN0aXZpdHkjb25QYXVzZSgpIEFjdGl2aXR5Lm9uUGF1c2V9IG9mIHRoZSBjb250YWluaW5nCisgICAgICogQWN0aXZpdHkncyBsaWZlY3ljbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBGcmFnbWVudCBpcyBubyBsb25nZXIgc3RhcnRlZC4gIFRoaXMgaXMgZ2VuZXJhbGx5CisgICAgICogdGllZCB0byB7QGxpbmsgQWN0aXZpdHkjb25TdG9wKCkgQWN0aXZpdHkub25TdG9wfSBvZiB0aGUgY29udGFpbmluZworICAgICAqIEFjdGl2aXR5J3MgbGlmZWN5Y2xlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIG9uTG93TWVtb3J5KCkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIHZpZXcgcHJldmlvdXNseSBjcmVhdGVkIGJ5IHtAbGluayAjb25DcmVhdGVWaWV3fSBoYXMKKyAgICAgKiBiZWVuIGRldGFjaGVkIGZyb20gdGhlIGZyYWdtZW50LiAgVGhlIG5leHQgdGltZSB0aGUgZnJhZ21lbnQgbmVlZHMKKyAgICAgKiB0byBiZSBkaXNwbGF5ZWQsIGEgbmV3IHZpZXcgd2lsbCBiZSBjcmVhdGVkLiAgVGhpcyBpcyBjYWxsZWQKKyAgICAgKiBhZnRlciB7QGxpbmsgI29uU3RvcCgpfSBhbmQgYmVmb3JlIHtAbGluayAjb25EZXN0cm95KCl9LiAgSXQgaXMgY2FsbGVkCisgICAgICogPGVtPnJlZ2FyZGxlc3M8L2VtPiBvZiB3aGV0aGVyIHtAbGluayAjb25DcmVhdGVWaWV3fSByZXR1cm5lZCBhCisgICAgICogbm9uLW51bGwgdmlldy4gIEludGVybmFsbHkgaXQgaXMgY2FsbGVkIGFmdGVyIHRoZSB2aWV3J3Mgc3RhdGUgaGFzCisgICAgICogYmVlbiBzYXZlZCBidXQgYmVmb3JlIGl0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBpdHMgcGFyZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveVZpZXcoKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZnJhZ21lbnQgaXMgbm8gbG9uZ2VyIGluIHVzZS4gIFRoaXMgaXMgY2FsbGVkCisgICAgICogYWZ0ZXIge0BsaW5rICNvblN0b3AoKX0gYW5kIGJlZm9yZSB7QGxpbmsgI29uRGV0YWNoKCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgICAgIC8vTG9nLnYoImZvbyIsICJvbkRlc3Ryb3k6IG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcj0iICsgbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyCisgICAgICAgIC8vICAgICAgICArICIgbUxvYWRlck1hbmFnZXI9IiArIG1Mb2FkZXJNYW5hZ2VyKTsKKyAgICAgICAgaWYgKCFtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIpIHsKKyAgICAgICAgICAgIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlciA9IHRydWU7CisgICAgICAgICAgICBtTG9hZGVyTWFuYWdlciA9IG1BY3Rpdml0eS5nZXRMb2FkZXJNYW5hZ2VyKG1JbmRleCwgbVN0YXJ0ZWQsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9EZXN0cm95KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZnJhZ21lbnQgaXMgbm8gbG9uZ2VyIGF0dGFjaGVkIHRvIGl0cyBhY3Rpdml0eS4gIFRoaXMKKyAgICAgKiBpcyBjYWxsZWQgYWZ0ZXIge0BsaW5rICNvbkRlc3Ryb3koKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25EZXRhY2goKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoZSBjb250ZW50cyBvZiB0aGUgQWN0aXZpdHkncyBzdGFuZGFyZCBvcHRpb25zIG1lbnUuICBZb3UKKyAgICAgKiBzaG91bGQgcGxhY2UgeW91ciBtZW51IGl0ZW1zIGluIHRvIDx2YXI+bWVudTwvdmFyPi4gIEZvciB0aGlzIG1ldGhvZAorICAgICAqIHRvIGJlIGNhbGxlZCwgeW91IG11c3QgaGF2ZSBmaXJzdCBjYWxsZWQge0BsaW5rICNzZXRIYXNPcHRpb25zTWVudX0uICBTZWUKKyAgICAgKiB7QGxpbmsgQWN0aXZpdHkjb25DcmVhdGVPcHRpb25zTWVudShNZW51KSBBY3Rpdml0eS5vbkNyZWF0ZU9wdGlvbnNNZW51fQorICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtZW51IFRoZSBvcHRpb25zIG1lbnUgaW4gd2hpY2ggeW91IHBsYWNlIHlvdXIgaXRlbXMuCisgICAgICogCisgICAgICogQHNlZSAjc2V0SGFzT3B0aW9uc01lbnUKKyAgICAgKiBAc2VlICNvblByZXBhcmVPcHRpb25zTWVudQorICAgICAqIEBzZWUgI29uT3B0aW9uc0l0ZW1TZWxlY3RlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51LCBNZW51SW5mbGF0ZXIgaW5mbGF0ZXIpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIHRoZSBTY3JlZW4ncyBzdGFuZGFyZCBvcHRpb25zIG1lbnUgdG8gYmUgZGlzcGxheWVkLiAgVGhpcyBpcworICAgICAqIGNhbGxlZCByaWdodCBiZWZvcmUgdGhlIG1lbnUgaXMgc2hvd24sIGV2ZXJ5IHRpbWUgaXQgaXMgc2hvd24uICBZb3UgY2FuCisgICAgICogdXNlIHRoaXMgbWV0aG9kIHRvIGVmZmljaWVudGx5IGVuYWJsZS9kaXNhYmxlIGl0ZW1zIG9yIG90aGVyd2lzZQorICAgICAqIGR5bmFtaWNhbGx5IG1vZGlmeSB0aGUgY29udGVudHMuICBTZWUKKyAgICAgKiB7QGxpbmsgQWN0aXZpdHkjb25QcmVwYXJlT3B0aW9uc01lbnUoTWVudSkgQWN0aXZpdHkub25QcmVwYXJlT3B0aW9uc01lbnV9CisgICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIG1lbnUgVGhlIG9wdGlvbnMgbWVudSBhcyBsYXN0IHNob3duIG9yIGZpcnN0IGluaXRpYWxpemVkIGJ5CisgICAgICogICAgICAgICAgICAgb25DcmVhdGVPcHRpb25zTWVudSgpLgorICAgICAqIAorICAgICAqIEBzZWUgI3NldEhhc09wdGlvbnNNZW51CisgICAgICogQHNlZSAjb25DcmVhdGVPcHRpb25zTWVudQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUHJlcGFyZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaG9vayBpcyBjYWxsZWQgd2hlbmV2ZXIgYW4gaXRlbSBpbiB5b3VyIG9wdGlvbnMgbWVudSBpcyBzZWxlY3RlZC4KKyAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyBmYWxzZSB0byBoYXZlIHRoZSBub3JtYWwKKyAgICAgKiBwcm9jZXNzaW5nIGhhcHBlbiAoY2FsbGluZyB0aGUgaXRlbSdzIFJ1bm5hYmxlIG9yIHNlbmRpbmcgYSBtZXNzYWdlIHRvCisgICAgICogaXRzIEhhbmRsZXIgYXMgYXBwcm9wcmlhdGUpLiAgWW91IGNhbiB1c2UgdGhpcyBtZXRob2QgZm9yIGFueSBpdGVtcworICAgICAqIGZvciB3aGljaCB5b3Ugd291bGQgbGlrZSB0byBkbyBwcm9jZXNzaW5nIHdpdGhvdXQgdGhvc2Ugb3RoZXIKKyAgICAgKiBmYWNpbGl0aWVzLgorICAgICAqIAorICAgICAqIDxwPkRlcml2ZWQgY2xhc3NlcyBzaG91bGQgY2FsbCB0aHJvdWdoIHRvIHRoZSBiYXNlIGNsYXNzIGZvciBpdCB0bworICAgICAqIHBlcmZvcm0gdGhlIGRlZmF1bHQgbWVudSBoYW5kbGluZy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXRlbSBUaGUgbWVudSBpdGVtIHRoYXQgd2FzIHNlbGVjdGVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYm9vbGVhbiBSZXR1cm4gZmFsc2UgdG8gYWxsb3cgbm9ybWFsIG1lbnUgcHJvY2Vzc2luZyB0bworICAgICAqICAgICAgICAgcHJvY2VlZCwgdHJ1ZSB0byBjb25zdW1lIGl0IGhlcmUuCisgICAgICogCisgICAgICogQHNlZSAjb25DcmVhdGVPcHRpb25zTWVudQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uT3B0aW9uc0l0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGhvb2sgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBvcHRpb25zIG1lbnUgaXMgYmVpbmcgY2xvc2VkIChlaXRoZXIgYnkgdGhlIHVzZXIgY2FuY2VsaW5nCisgICAgICogdGhlIG1lbnUgd2l0aCB0aGUgYmFjay9tZW51IGJ1dHRvbiwgb3Igd2hlbiBhbiBpdGVtIGlzIHNlbGVjdGVkKS4KKyAgICAgKiAgCisgICAgICogQHBhcmFtIG1lbnUgVGhlIG9wdGlvbnMgbWVudSBhcyBsYXN0IHNob3duIG9yIGZpcnN0IGluaXRpYWxpemVkIGJ5CisgICAgICogICAgICAgICAgICAgb25DcmVhdGVPcHRpb25zTWVudSgpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uT3B0aW9uc01lbnVDbG9zZWQoTWVudSBtZW51KSB7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgY29udGV4dCBtZW51IGZvciB0aGUge0Bjb2RlIHZpZXd9IGlzIGFib3V0IHRvIGJlIHNob3duLgorICAgICAqIFVubGlrZSB7QGxpbmsgI29uQ3JlYXRlT3B0aW9uc01lbnV9LCB0aGlzIHdpbGwgYmUgY2FsbGVkIGV2ZXJ5CisgICAgICogdGltZSB0aGUgY29udGV4dCBtZW51IGlzIGFib3V0IHRvIGJlIHNob3duIGFuZCBzaG91bGQgYmUgcG9wdWxhdGVkIGZvcgorICAgICAqIHRoZSB2aWV3IChvciBpdGVtIGluc2lkZSB0aGUgdmlldyBmb3Ige0BsaW5rIEFkYXB0ZXJWaWV3fSBzdWJjbGFzc2VzLAorICAgICAqIHRoaXMgY2FuIGJlIGZvdW5kIGluIHRoZSB7QGNvZGUgbWVudUluZm99KSkuCisgICAgICogPHA+CisgICAgICogVXNlIHtAbGluayAjb25Db250ZXh0SXRlbVNlbGVjdGVkKGFuZHJvaWQudmlldy5NZW51SXRlbSl9IHRvIGtub3cgd2hlbiBhbgorICAgICAqIGl0ZW0gaGFzIGJlZW4gc2VsZWN0ZWQuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FsbHMgdXAgdG8KKyAgICAgKiB7QGxpbmsgQWN0aXZpdHkjb25DcmVhdGVDb250ZXh0TWVudSBBY3Rpdml0eS5vbkNyZWF0ZUNvbnRleHRNZW51fSwgdGhvdWdoCisgICAgICogeW91IGNhbiBub3QgY2FsbCB0aGlzIGltcGxlbWVudGF0aW9uIGlmIHlvdSBkb24ndCB3YW50IHRoYXQgYmVoYXZpb3IuCisgICAgICogPHA+CisgICAgICogSXQgaXMgbm90IHNhZmUgdG8gaG9sZCBvbnRvIHRoZSBjb250ZXh0IG1lbnUgYWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51LCBWaWV3IHYsIENvbnRleHRNZW51SW5mbyBtZW51SW5mbykgeworICAgICAgICBnZXRBY3Rpdml0eSgpLm9uQ3JlYXRlQ29udGV4dE1lbnUobWVudSwgdiwgbWVudUluZm8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIGNvbnRleHQgbWVudSB0byBiZSBzaG93biBmb3IgdGhlIGdpdmVuIHZpZXcgKG11bHRpcGxlIHZpZXdzCisgICAgICogY2FuIHNob3cgdGhlIGNvbnRleHQgbWVudSkuIFRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZQorICAgICAqIHtAbGluayBPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXJ9IG9uIHRoZSB2aWV3IHRvIHRoaXMgZnJhZ21lbnQsIHNvCisgICAgICoge0BsaW5rICNvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51LCBWaWV3LCBDb250ZXh0TWVudUluZm8pfSB3aWxsIGJlCisgICAgICogY2FsbGVkIHdoZW4gaXQgaXMgdGltZSB0byBzaG93IHRoZSBjb250ZXh0IG1lbnUuCisgICAgICogCisgICAgICogQHNlZSAjdW5yZWdpc3RlckZvckNvbnRleHRNZW51KFZpZXcpCisgICAgICogQHBhcmFtIHZpZXcgVGhlIHZpZXcgdGhhdCBzaG91bGQgc2hvdyBhIGNvbnRleHQgbWVudS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvckNvbnRleHRNZW51KFZpZXcgdmlldykgeworICAgICAgICB2aWV3LnNldE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUHJldmVudHMgYSBjb250ZXh0IG1lbnUgdG8gYmUgc2hvd24gZm9yIHRoZSBnaXZlbiB2aWV3LiBUaGlzIG1ldGhvZCB3aWxsCisgICAgICogcmVtb3ZlIHRoZSB7QGxpbmsgT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyfSBvbiB0aGUgdmlldy4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNyZWdpc3RlckZvckNvbnRleHRNZW51KFZpZXcpCisgICAgICogQHBhcmFtIHZpZXcgVGhlIHZpZXcgdGhhdCBzaG91bGQgc3RvcCBzaG93aW5nIGEgY29udGV4dCBtZW51LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JDb250ZXh0TWVudShWaWV3IHZpZXcpIHsKKyAgICAgICAgdmlldy5zZXRPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIobnVsbCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoaXMgaG9vayBpcyBjYWxsZWQgd2hlbmV2ZXIgYW4gaXRlbSBpbiBhIGNvbnRleHQgbWVudSBpcyBzZWxlY3RlZC4gVGhlCisgICAgICogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyBmYWxzZSB0byBoYXZlIHRoZSBub3JtYWwgcHJvY2Vzc2luZworICAgICAqIGhhcHBlbiAoY2FsbGluZyB0aGUgaXRlbSdzIFJ1bm5hYmxlIG9yIHNlbmRpbmcgYSBtZXNzYWdlIHRvIGl0cyBIYW5kbGVyCisgICAgICogYXMgYXBwcm9wcmlhdGUpLiBZb3UgY2FuIHVzZSB0aGlzIG1ldGhvZCBmb3IgYW55IGl0ZW1zIGZvciB3aGljaCB5b3UKKyAgICAgKiB3b3VsZCBsaWtlIHRvIGRvIHByb2Nlc3Npbmcgd2l0aG91dCB0aG9zZSBvdGhlciBmYWNpbGl0aWVzLgorICAgICAqIDxwPgorICAgICAqIFVzZSB7QGxpbmsgTWVudUl0ZW0jZ2V0TWVudUluZm8oKX0gdG8gZ2V0IGV4dHJhIGluZm9ybWF0aW9uIHNldCBieSB0aGUKKyAgICAgKiBWaWV3IHRoYXQgYWRkZWQgdGhpcyBtZW51IGl0ZW0uCisgICAgICogPHA+CisgICAgICogRGVyaXZlZCBjbGFzc2VzIHNob3VsZCBjYWxsIHRocm91Z2ggdG8gdGhlIGJhc2UgY2xhc3MgZm9yIGl0IHRvIHBlcmZvcm0KKyAgICAgKiB0aGUgZGVmYXVsdCBtZW51IGhhbmRsaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpdGVtIFRoZSBjb250ZXh0IG1lbnUgaXRlbSB0aGF0IHdhcyBzZWxlY3RlZC4KKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gUmV0dXJuIGZhbHNlIHRvIGFsbG93IG5vcm1hbCBjb250ZXh0IG1lbnUgcHJvY2Vzc2luZyB0bworICAgICAqICAgICAgICAgcHJvY2VlZCwgdHJ1ZSB0byBjb25zdW1lIGl0IGhlcmUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25Db250ZXh0SXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmludCB0aGUgRnJhZ21lbnRzJ3Mgc3RhdGUgaW50byB0aGUgZ2l2ZW4gc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBUZXh0IHRvIHByaW50IGF0IHRoZSBmcm9udCBvZiBlYWNoIGxpbmUuCisgICAgICogQHBhcmFtIGZkIFRoZSByYXcgZmlsZSBkZXNjcmlwdG9yIHRoYXQgdGhlIGR1bXAgaXMgYmVpbmcgc2VudCB0by4KKyAgICAgKiBAcGFyYW0gd3JpdGVyIFRoZSBQcmludFdyaXRlciB0byB3aGljaCB5b3Ugc2hvdWxkIGR1bXAgeW91ciBzdGF0ZS4gIFRoaXMgd2lsbCBiZQorICAgICAqIGNsb3NlZCBmb3IgeW91IGFmdGVyIHlvdSByZXR1cm4uCisgICAgICogQHBhcmFtIGFyZ3MgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gdGhlIGR1bXAgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkdW1wKFN0cmluZyBwcmVmaXgsIEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgd3JpdGVyLnByaW50KHByZWZpeCk7IHdyaXRlci5wcmludCgibUZyYWdtZW50SWQ9Iik7IHdyaXRlci5wcmludChtRnJhZ21lbnRJZCk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgbUNvbnRhaW5lcklkPSIpOyB3cml0ZXIucHJpbnQobUNvbnRhaW5lcklkKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBtVGFnPSIpOyB3cml0ZXIucHJpbnRsbihtVGFnKTsKKyAgICAgICAgd3JpdGVyLnByaW50KHByZWZpeCk7IHdyaXRlci5wcmludCgibVN0YXRlPSIpOyB3cml0ZXIucHJpbnQobVN0YXRlKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBtSW5kZXg9Iik7IHdyaXRlci5wcmludChtSW5kZXgpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIG1XaG89Iik7IHdyaXRlci5wcmludChtV2hvKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBtQmFja1N0YWNrTmVzdGluZz0iKTsgd3JpdGVyLnByaW50bG4obUJhY2tTdGFja05lc3RpbmcpOworICAgICAgICB3cml0ZXIucHJpbnQocHJlZml4KTsgd3JpdGVyLnByaW50KCJtQWRkZWQ9Iik7IHdyaXRlci5wcmludChtQWRkZWQpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIG1SZXN1bWVkPSIpOyB3cml0ZXIucHJpbnQobVJlc3VtZWQpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIG1Gcm9tTGF5b3V0PSIpOyB3cml0ZXIucHJpbnQobUZyb21MYXlvdXQpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIG1JbkxheW91dD0iKTsgd3JpdGVyLnByaW50bG4obUluTGF5b3V0KTsKKyAgICAgICAgd3JpdGVyLnByaW50KHByZWZpeCk7IHdyaXRlci5wcmludCgibUhpZGRlbj0iKTsgd3JpdGVyLnByaW50KG1IaWRkZW4pOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIG1SZXRhaW5JbnN0YW5jZT0iKTsgd3JpdGVyLnByaW50KG1SZXRhaW5JbnN0YW5jZSk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgbVJldGFpbmluZz0iKTsgd3JpdGVyLnByaW50KG1SZXRhaW5pbmcpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIG1IYXNNZW51PSIpOyB3cml0ZXIucHJpbnRsbihtSGFzTWVudSk7CisgICAgICAgIGlmIChtRnJhZ21lbnRNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChwcmVmaXgpOyB3cml0ZXIucHJpbnQoIm1GcmFnbWVudE1hbmFnZXI9Iik7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1GcmFnbWVudE1hbmFnZXIpOworICAgICAgICB9CisgICAgICAgIGlmIChtSW1tZWRpYXRlQWN0aXZpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KHByZWZpeCk7IHdyaXRlci5wcmludCgibUltbWVkaWF0ZUFjdGl2aXR5PSIpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtSW1tZWRpYXRlQWN0aXZpdHkpOworICAgICAgICB9CisgICAgICAgIGlmIChtQWN0aXZpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KHByZWZpeCk7IHdyaXRlci5wcmludCgibUFjdGl2aXR5PSIpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtQWN0aXZpdHkpOworICAgICAgICB9CisgICAgICAgIGlmIChtQXJndW1lbnRzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChwcmVmaXgpOyB3cml0ZXIucHJpbnQoIm1Bcmd1bWVudHM9Iik7IHdyaXRlci5wcmludGxuKG1Bcmd1bWVudHMpOworICAgICAgICB9CisgICAgICAgIGlmIChtU2F2ZWRGcmFnbWVudFN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChwcmVmaXgpOyB3cml0ZXIucHJpbnQoIm1TYXZlZEZyYWdtZW50U3RhdGU9Iik7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1TYXZlZEZyYWdtZW50U3RhdGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtU2F2ZWRWaWV3U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KHByZWZpeCk7IHdyaXRlci5wcmludCgibVNhdmVkVmlld1N0YXRlPSIpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtU2F2ZWRWaWV3U3RhdGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtVGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChwcmVmaXgpOyB3cml0ZXIucHJpbnQoIm1UYXJnZXQ9Iik7IHdyaXRlci5wcmludChtVGFyZ2V0KTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgbVRhcmdldFJlcXVlc3RDb2RlPSIpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtVGFyZ2V0UmVxdWVzdENvZGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtTmV4dEFuaW0gIT0gMCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KHByZWZpeCk7IHdyaXRlci5wcmludCgibU5leHRBbmltPSIpOyB3cml0ZXIucHJpbnRsbihtTmV4dEFuaW0pOworICAgICAgICB9CisgICAgICAgIGlmIChtQ29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChwcmVmaXgpOyB3cml0ZXIucHJpbnQoIm1Db250YWluZXI9Iik7IHdyaXRlci5wcmludGxuKG1Db250YWluZXIpOworICAgICAgICB9CisgICAgICAgIGlmIChtVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQocHJlZml4KTsgd3JpdGVyLnByaW50KCJtVmlldz0iKTsgd3JpdGVyLnByaW50bG4obVZpZXcpOworICAgICAgICB9CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQocHJlZml4KTsgd3JpdGVyLnByaW50KCJtTG9hZGVyTWFuYWdlcj0iKTsgd3JpdGVyLnByaW50KG1Mb2FkZXJNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgbVN0YXJ0ZWQ9Iik7IHdyaXRlci5wcmludChtU3RhcnRlZCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcj0iKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcGVyZm9ybVN0b3AoKSB7CisgICAgICAgIG9uU3RvcCgpOworICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoIW1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcikgeworICAgICAgICAgICAgICAgIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlciA9IHRydWU7CisgICAgICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBtQWN0aXZpdHkuZ2V0TG9hZGVyTWFuYWdlcihtSW5kZXgsIG1TdGFydGVkLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtQWN0aXZpdHkgPT0gbnVsbCB8fCAhbUFjdGl2aXR5Lm1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvU3RvcCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvUmV0YWluKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50QnJlYWRDcnVtYnMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudEJyZWFkQ3J1bWJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlMDc0NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudEJyZWFkQ3J1bWJzLmphdmEKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwOworCitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRNYW5hZ2VyLkJhY2tTdGFja0VudHJ5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCisvKioKKyAqIEhlbHBlciBjbGFzcyBmb3Igc2hvd2luZyAiYnJlYWQgY3J1bWJzIiByZXByZXNlbnRpbmcgdGhlIGZyYWdtZW50CisgKiBzdGFjayBpbiBhbiBhY3Rpdml0eS4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoCisgKiB7QGxpbmsgQWN0aW9uQmFyI3NldEN1c3RvbU5hdmlnYXRpb25Nb2RlKFZpZXcpCisgKiBBY3Rpb25CYXIuc2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUoVmlldyl9IHRvIHBsYWNlIHRoZSBicmVhZCBjcnVtYnMgaW4KKyAqIHRoZSBuYXZpZ2F0aW9uIGFyZWEgb2YgdGhlIGFjdGlvbiBiYXIuCisgKgorICogPHA+VGhlIGRlZmF1bHQgc3R5bGUgZm9yIHRoaXMgdmlldyBpcworICoge0BsaW5rIGFuZHJvaWQuUi5zdHlsZSNXaWRnZXRfRnJhZ21lbnRCcmVhZENydW1ic30uCisgKi8KK3B1YmxpYyBjbGFzcyBGcmFnbWVudEJyZWFkQ3J1bWJzIGV4dGVuZHMgVmlld0dyb3VwCisgICAgICAgIGltcGxlbWVudHMgRnJhZ21lbnRNYW5hZ2VyLk9uQmFja1N0YWNrQ2hhbmdlZExpc3RlbmVyIHsKKyAgICBBY3Rpdml0eSBtQWN0aXZpdHk7CisgICAgTGF5b3V0SW5mbGF0ZXIgbUluZmxhdGVyOworICAgIExpbmVhckxheW91dCBtQ29udGFpbmVyOworCisgICAgLy8gSGFoYWgKKyAgICBCYWNrU3RhY2tSZWNvcmQgbVRvcEVudHJ5OworCisgICAgcHVibGljIEZyYWdtZW50QnJlYWRDcnVtYnMoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50QnJlYWRDcnVtYnMoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgYW5kcm9pZC5SLnN0eWxlLldpZGdldF9GcmFnbWVudEJyZWFkQ3J1bWJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRCcmVhZENydW1icyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0YWNoIHRoZSBicmVhZCBjcnVtYnMgdG8gdGhlaXIgYWN0aXZpdHkuICBUaGlzIG11c3QgYmUgY2FsbGVkIG9uY2UKKyAgICAgKiB3aGVuIGNyZWF0aW5nIHRoZSBicmVhZCBjcnVtYnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWN0aXZpdHkoQWN0aXZpdHkgYSkgeworICAgICAgICBtQWN0aXZpdHkgPSBhOworICAgICAgICBtSW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpYS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgICAgICBtQ29udGFpbmVyID0gKExpbmVhckxheW91dCltSW5mbGF0ZXIuaW5mbGF0ZSgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5mcmFnbWVudF9icmVhZF9jcnVtYnMsCisgICAgICAgICAgICAgICAgdGhpcywgZmFsc2UpOworICAgICAgICBhZGRWaWV3KG1Db250YWluZXIpOworICAgICAgICBhLmdldEZyYWdtZW50TWFuYWdlcigpLmFkZE9uQmFja1N0YWNrQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworICAgICAgICB1cGRhdGVDcnVtYnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBjdXN0b20gdGl0bGUgZm9yIHRoZSBicmVhZCBjcnVtYnMuICBUaGlzIHdpbGwgYmUgdGhlIGZpcnN0IGVudHJ5CisgICAgICogc2hvd24gYXQgdGhlIGxlZnQsIHJlcHJlc2VudGluZyB0aGUgcm9vdCBvZiB0aGUgYnJlYWQgY3J1bWJzLiAgSWYgdGhlCisgICAgICogdGl0bGUgaXMgbnVsbCwgaXQgd2lsbCBub3QgYmUgc2hvd24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlLCBDaGFyU2VxdWVuY2Ugc2hvcnRUaXRsZSkgeworICAgICAgICBpZiAodGl0bGUgPT0gbnVsbCkgeworICAgICAgICAgICAgbVRvcEVudHJ5ID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Ub3BFbnRyeSA9IG5ldyBCYWNrU3RhY2tSZWNvcmQoKEZyYWdtZW50TWFuYWdlckltcGwpCisgICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5nZXRGcmFnbWVudE1hbmFnZXIoKSk7CisgICAgICAgICAgICBtVG9wRW50cnkuc2V0QnJlYWRDcnVtYlRpdGxlKHRpdGxlKTsKKyAgICAgICAgICAgIG1Ub3BFbnRyeS5zZXRCcmVhZENydW1iU2hvcnRUaXRsZShzaG9ydFRpdGxlKTsKKyAgICAgICAgfQorICAgICAgICB1cGRhdGVDcnVtYnMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7CisgICAgICAgIC8vIEV2ZW50dWFsbHkgd2Ugc2hvdWxkIGltcGxlbWVudCBvdXIgb3duIGxheW91dCBvZiB0aGUgdmlld3MsCisgICAgICAgIC8vIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gYSBsaW5lYXIgbGF5b3V0LgorICAgICAgICBmaW5hbCBpbnQgY2hpbGRDb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOworCisgICAgICAgICAgICBpbnQgY2hpbGRSaWdodCA9IG1QYWRkaW5nTGVmdCArIGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKSAtIG1QYWRkaW5nUmlnaHQ7CisgICAgICAgICAgICBpbnQgY2hpbGRCb3R0b20gPSBtUGFkZGluZ1RvcCArIGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCkgLSBtUGFkZGluZ0JvdHRvbTsKKyAgICAgICAgICAgIGNoaWxkLmxheW91dChtUGFkZGluZ0xlZnQsIG1QYWRkaW5nVG9wLCBjaGlsZFJpZ2h0LCBjaGlsZEJvdHRvbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBnZXRDaGlsZENvdW50KCk7CisKKyAgICAgICAgaW50IG1heEhlaWdodCA9IDA7CisgICAgICAgIGludCBtYXhXaWR0aCA9IDA7CisKKyAgICAgICAgLy8gRmluZCByaWdodG1vc3QgYW5kIGJvdHRvbS1tb3N0IGNoaWxkCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaSk7CisgICAgICAgICAgICBpZiAoY2hpbGQuZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUpIHsKKyAgICAgICAgICAgICAgICBtZWFzdXJlQ2hpbGQoY2hpbGQsIHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCkpOworICAgICAgICAgICAgICAgIG1heEhlaWdodCA9IE1hdGgubWF4KG1heEhlaWdodCwgY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBBY2NvdW50IGZvciBwYWRkaW5nIHRvbworICAgICAgICBtYXhXaWR0aCArPSBtUGFkZGluZ0xlZnQgKyBtUGFkZGluZ1JpZ2h0OworICAgICAgICBtYXhIZWlnaHQgKz0gbVBhZGRpbmdUb3AgKyBtUGFkZGluZ0JvdHRvbTsKKworICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IG91ciBtaW5pbXVtIGhlaWdodCBhbmQgd2lkdGgKKyAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5tYXgobWF4SGVpZ2h0LCBnZXRTdWdnZXN0ZWRNaW5pbXVtSGVpZ2h0KCkpOworICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBnZXRTdWdnZXN0ZWRNaW5pbXVtV2lkdGgoKSk7CisKKyAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24ocmVzb2x2ZVNpemUobWF4V2lkdGgsIHdpZHRoTWVhc3VyZVNwZWMpLAorICAgICAgICAgICAgICAgIHJlc29sdmVTaXplKG1heEhlaWdodCwgaGVpZ2h0TWVhc3VyZVNwZWMpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkJhY2tTdGFja0NoYW5nZWQoKSB7CisgICAgICAgIHVwZGF0ZUNydW1icygpOworICAgIH0KKworICAgIHZvaWQgdXBkYXRlQ3J1bWJzKCkgeworICAgICAgICBGcmFnbWVudE1hbmFnZXIgZm0gPSBtQWN0aXZpdHkuZ2V0RnJhZ21lbnRNYW5hZ2VyKCk7CisgICAgICAgIGludCBudW1FbnRyaWVzID0gZm0uY291bnRCYWNrU3RhY2tFbnRyaWVzKCk7CisgICAgICAgIGludCBudW1WaWV3cyA9IG1Db250YWluZXIuZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gbVRvcEVudHJ5ICE9IG51bGwgPyAtMSA6IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspIHsKKyAgICAgICAgICAgIEJhY2tTdGFja0VudHJ5IGJzZSA9IGkgPT0gLTEgPyBtVG9wRW50cnkgOiBmbS5nZXRCYWNrU3RhY2tFbnRyeShpKTsKKyAgICAgICAgICAgIGludCB2aWV3SSA9IG1Ub3BFbnRyeSAhPSBudWxsID8gaSArIDEgOiBpOworICAgICAgICAgICAgaWYgKHZpZXdJIDwgbnVtVmlld3MpIHsKKyAgICAgICAgICAgICAgICBWaWV3IHYgPSBtQ29udGFpbmVyLmdldENoaWxkQXQodmlld0kpOworICAgICAgICAgICAgICAgIE9iamVjdCB0YWcgPSB2LmdldFRhZygpOworICAgICAgICAgICAgICAgIGlmICh0YWcgIT0gYnNlKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSB2aWV3STsgaiA8IG51bVZpZXdzOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250YWluZXIucmVtb3ZlVmlld0F0KHZpZXdJKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBudW1WaWV3cyA9IHZpZXdJOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2aWV3SSA+PSBudW1WaWV3cykgeworICAgICAgICAgICAgICAgIFZpZXcgaXRlbSA9IG1JbmZsYXRlci5pbmZsYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuZnJhZ21lbnRfYnJlYWRfY3J1bWJfaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBUZXh0VmlldyB0ZXh0ID0gKFRleHRWaWV3KWl0ZW0uZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQudGl0bGUpOworICAgICAgICAgICAgICAgIHRleHQuc2V0VGV4dChic2UuZ2V0QnJlYWRDcnVtYlRpdGxlKCkpOworICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGFnKGJzZSk7CisgICAgICAgICAgICAgICAgaWYgKHZpZXdJID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRDb21wb3VuZERyYXdhYmxlcyhudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNvbnRhaW5lci5hZGRWaWV3KGl0ZW0pOworICAgICAgICAgICAgICAgIGl0ZW0uc2V0T25DbGlja0xpc3RlbmVyKG1PbkNsaWNrTGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludCB2aWV3SSA9IG1Ub3BFbnRyeSAhPSBudWxsID8gbnVtRW50cmllcyArIDEgOiBudW1FbnRyaWVzOworICAgICAgICBudW1WaWV3cyA9IG1Db250YWluZXIuZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICB3aGlsZSAobnVtVmlld3MgPiB2aWV3SSkgeworICAgICAgICAgICAgbUNvbnRhaW5lci5yZW1vdmVWaWV3QXQobnVtVmlld3MtMSk7CisgICAgICAgICAgICBudW1WaWV3cy0tOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBPbkNsaWNrTGlzdGVuZXIgbU9uQ2xpY2tMaXN0ZW5lciA9IG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICBpZiAodi5nZXRUYWcoKSBpbnN0YW5jZW9mIEJhY2tTdGFja0VudHJ5KSB7CisgICAgICAgICAgICAgICAgQmFja1N0YWNrRW50cnkgYnNlID0gKEJhY2tTdGFja0VudHJ5KSB2LmdldFRhZygpOworICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5nZXRGcmFnbWVudE1hbmFnZXIoKS5wb3BCYWNrU3RhY2soYnNlLmdldElkKCksCisgICAgICAgICAgICAgICAgICAgICAgICBic2UgPT0gbVRvcEVudHJ5PyBGcmFnbWVudE1hbmFnZXIuUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFIDogMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZTcyNTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwxNDIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9ySW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIEludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB7QGxpbmsgRnJhZ21lbnR9IG9iamVjdHMgaW5zaWRlIG9mIGFuCisgKiB7QGxpbmsgQWN0aXZpdHl9CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRnJhZ21lbnRNYW5hZ2VyIHsKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRhdGlvbiBvZiBhbiBlbnRyeSBvbiB0aGUgZnJhZ21lbnQgYmFjayBzdGFjaywgYXMgY3JlYXRlZAorICAgICAqIHdpdGgge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb24jYWRkVG9CYWNrU3RhY2soU3RyaW5nKQorICAgICAqIEZyYWdtZW50VHJhbnNhY3Rpb24uYWRkVG9CYWNrU3RhY2soKX0uICBFbnRyaWVzIGNhbiBsYXRlciBiZQorICAgICAqIHJldHJpZXZlZCB3aXRoIHtAbGluayBGcmFnbWVudE1hbmFnZXIjZ2V0QmFja1N0YWNrRW50cnkoaW50KQorICAgICAqIEZyYWdtZW50TWFuYWdlci5nZXRCYWNrU3RhY2tFbnRyeSgpfS4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCB5b3Ugc2hvdWxkIG5ldmVyIGhvbGQgb24gdG8gYSBCYWNrU3RhY2tFbnRyeSBvYmplY3Q7CisgICAgICogdGhlIGlkZW50aWZpZXIgYXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRJZH0gaXMgdGhlIG9ubHkgdGhpbmcgdGhhdAorICAgICAqIHdpbGwgYmUgcGVyc2lzdGVkIGFjcm9zcyBhY3Rpdml0eSBpbnN0YW5jZXMuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBCYWNrU3RhY2tFbnRyeSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZW50cnkuICBUaGlzIGlzIHRoZSBvbmx5CisgICAgICAgICAqIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlbnRyeSB0aGF0IHdpbGwgcGVyc2lzdCBhY3Jvc3MgYWN0aXZpdHkKKyAgICAgICAgICogaW5zdGFuY2VzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRJZCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIGZ1bGwgYnJlYWQgY3J1bWIgdGl0bGUgZm9yIHRoZSBlbnRyeSwgb3IgbnVsbCBpZiBpdAorICAgICAgICAgKiBkb2VzIG5vdCBoYXZlIG9uZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0QnJlYWRDcnVtYlRpdGxlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgc2hvcnQgYnJlYWQgY3J1bWIgdGl0bGUgZm9yIHRoZSBlbnRyeSwgb3IgbnVsbCBpZiBpdAorICAgICAgICAgKiBkb2VzIG5vdCBoYXZlIG9uZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0QnJlYWRDcnVtYlNob3J0VGl0bGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgdG8gd2F0Y2ggZm9yIGNoYW5nZXMgdG8gdGhlIGJhY2sgc3RhY2suCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBPbkJhY2tTdGFja0NoYW5nZWRMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbmV2ZXIgdGhlIGNvbnRlbnRzIG9mIHRoZSBiYWNrIHN0YWNrIGNoYW5nZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQmFja1N0YWNrQ2hhbmdlZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgc2VyaWVzIG9mIGVkaXQgb3BlcmF0aW9ucyBvbiB0aGUgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoaXMgRnJhZ21lbnRNYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIG9wZW5UcmFuc2FjdGlvbigpOworCisgICAgLyoqCisgICAgICogRmluZHMgYSBmcmFnbWVudCB0aGF0IHdhcyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBpZCBlaXRoZXIgd2hlbiBpbmZsYXRlZAorICAgICAqIGZyb20gWE1MIG9yIGFzIHRoZSBjb250YWluZXIgSUQgd2hlbiBhZGRlZCBpbiBhIHRyYW5zYWN0aW9uLiAgVGhpcyBmaXJzdAorICAgICAqIHNlYXJjaGVzIHRocm91Z2ggZnJhZ21lbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBhZGRlZCB0byB0aGUgbWFuYWdlcidzCisgICAgICogYWN0aXZpdHk7IGlmIG5vIHN1Y2ggZnJhZ21lbnQgaXMgZm91bmQsIHRoZW4gYWxsIGZyYWdtZW50cyBjdXJyZW50bHkKKyAgICAgKiBvbiB0aGUgYmFjayBzdGFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyBJRCBhcmUgc2VhcmNoZWQuCisgICAgICogQHJldHVybiBUaGUgZnJhZ21lbnQgaWYgZm91bmQgb3IgbnVsbCBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50IGZpbmRGcmFnbWVudEJ5SWQoaW50IGlkKTsKKworICAgIC8qKgorICAgICAqIEZpbmRzIGEgZnJhZ21lbnQgdGhhdCB3YXMgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gdGFnIGVpdGhlciB3aGVuIGluZmxhdGVkCisgICAgICogZnJvbSBYTUwgb3IgYXMgc3VwcGxpZWQgd2hlbiBhZGRlZCBpbiBhIHRyYW5zYWN0aW9uLiAgVGhpcyBmaXJzdAorICAgICAqIHNlYXJjaGVzIHRocm91Z2ggZnJhZ21lbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBhZGRlZCB0byB0aGUgbWFuYWdlcidzCisgICAgICogYWN0aXZpdHk7IGlmIG5vIHN1Y2ggZnJhZ21lbnQgaXMgZm91bmQsIHRoZW4gYWxsIGZyYWdtZW50cyBjdXJyZW50bHkKKyAgICAgKiBvbiB0aGUgYmFjayBzdGFjayBhcmUgc2VhcmNoZWQuCisgICAgICogQHJldHVybiBUaGUgZnJhZ21lbnQgaWYgZm91bmQgb3IgbnVsbCBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50IGZpbmRGcmFnbWVudEJ5VGFnKFN0cmluZyB0YWcpOworCisgICAgLyoqCisgICAgICogRmxhZyBmb3Ige0BsaW5rICNwb3BCYWNrU3RhY2soU3RyaW5nLCBpbnQpfQorICAgICAqIGFuZCB7QGxpbmsgI3BvcEJhY2tTdGFjayhpbnQsIGludCl9OiBJZiBzZXQsIGFuZCB0aGUgbmFtZSBvciBJRCBvZgorICAgICAqIGEgYmFjayBzdGFjayBlbnRyeSBoYXMgYmVlbiBzdXBwbGllZCwgdGhlbiBhbGwgbWF0Y2hpbmcgZW50cmllcyB3aWxsCisgICAgICogYmUgY29uc3VtZWQgdW50aWwgb25lIHRoYXQgZG9lc24ndCBtYXRjaCBpcyBmb3VuZCBvciB0aGUgYm90dG9tIG9mCisgICAgICogdGhlIHN0YWNrIGlzIHJlYWNoZWQuICBPdGhlcndpc2UsIGFsbCBlbnRyaWVzIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIHRoYXQgZW50cnkKKyAgICAgKiB3aWxsIGJlIHJlbW92ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFID0gMTw8MDsKKworICAgIC8qKgorICAgICAqIFBvcCB0aGUgdG9wIHN0YXRlIG9mZiB0aGUgYmFjayBzdGFjay4gIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSB3YXMgb25lCisgICAgICogdG8gcG9wLCBlbHNlIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHBvcEJhY2tTdGFjaygpOworCisgICAgLyoqCisgICAgICogUG9wIHRoZSBsYXN0IGZyYWdtZW50IHRyYW5zaXRpb24gZnJvbSB0aGUgbWFuYWdlcidzIGZyYWdtZW50CisgICAgICogYmFjayBzdGFjay4gIElmIHRoZXJlIGlzIG5vdGhpbmcgdG8gcG9wLCBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0gbmFtZSBJZiBub24tbnVsbCwgdGhpcyBpcyB0aGUgbmFtZSBvZiBhIHByZXZpb3VzIGJhY2sgc3RhdGUKKyAgICAgKiB0byBsb29rIGZvcjsgaWYgZm91bmQsIGFsbCBzdGF0ZXMgdXAgdG8gdGhhdCBzdGF0ZSB3aWxsIGJlIHBvcHBlZC4gIFRoZQorICAgICAqIHtAbGluayAjUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFfSBmbGFnIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgd2hldGhlcgorICAgICAqIHRoZSBuYW1lZCBzdGF0ZSBpdHNlbGYgaXMgcG9wcGVkLiBJZiBudWxsLCBvbmx5IHRoZSB0b3Agc3RhdGUgaXMgcG9wcGVkLgorICAgICAqIEBwYXJhbSBmbGFncyBFaXRoZXIgMCBvciB7QGxpbmsgI1BPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRX0uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcG9wQmFja1N0YWNrKFN0cmluZyBuYW1lLCBpbnQgZmxhZ3MpOworCisgICAgLyoqCisgICAgICogUG9wIGFsbCBiYWNrIHN0YWNrIHN0YXRlcyB1cCB0byB0aGUgb25lIHdpdGggdGhlIGdpdmVuIGlkZW50aWZpZXIuCisgICAgICogQHBhcmFtIGlkIElkZW50aWZpZXIgb2YgdGhlIHN0YXRlZCB0byBiZSBwb3BwZWQuIElmIG5vIGlkZW50aWZpZXIgZXhpc3RzLAorICAgICAqIGZhbHNlIGlzIHJldHVybmVkLgorICAgICAqIFRoZSBpZGVudGlmaWVyIGlzIHRoZSBudW1iZXIgcmV0dXJuZWQgYnkKKyAgICAgKiB7QGxpbmsgRnJhZ21lbnRUcmFuc2FjdGlvbiNjb21taXQoKSBGcmFnbWVudFRyYW5zYWN0aW9uLmNvbW1pdCgpfS4gIFRoZQorICAgICAqIHtAbGluayAjUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFfSBmbGFnIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgd2hldGhlcgorICAgICAqIHRoZSBuYW1lZCBzdGF0ZSBpdHNlbGYgaXMgcG9wcGVkLgorICAgICAqIEBwYXJhbSBmbGFncyBFaXRoZXIgMCBvciB7QGxpbmsgI1BPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRX0uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcG9wQmFja1N0YWNrKGludCBpZCwgaW50IGZsYWdzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgY3VycmVudGx5IGluIHRoZSBiYWNrIHN0YWNrLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgY291bnRCYWNrU3RhY2tFbnRyaWVzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIEJhY2tTdGFja0VudHJ5IGF0IGluZGV4IDx2YXI+aW5kZXg8L3Zhcj4gaW4gdGhlIGJhY2sgc3RhY2s7CisgICAgICogZW50cmllcyBzdGFydCBpbmRleCAwIGJlaW5nIHRoZSBib3R0b20gb2YgdGhlIHN0YWNrLgorICAgICAqLworICAgIHB1YmxpYyBCYWNrU3RhY2tFbnRyeSBnZXRCYWNrU3RhY2tFbnRyeShpbnQgaW5kZXgpOworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IGxpc3RlbmVyIGZvciBjaGFuZ2VzIHRvIHRoZSBmcmFnbWVudCBiYWNrIHN0YWNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE9uQmFja1N0YWNrQ2hhbmdlZExpc3RlbmVyKE9uQmFja1N0YWNrQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpc3RlbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgYWRkZWQgd2l0aAorICAgICAqIHtAbGluayAjYWRkT25CYWNrU3RhY2tDaGFuZ2VkTGlzdGVuZXIoT25CYWNrU3RhY2tDaGFuZ2VkTGlzdGVuZXIpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVPbkJhY2tTdGFja0NoYW5nZWRMaXN0ZW5lcihPbkJhY2tTdGFja0NoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBQdXQgYSByZWZlcmVuY2UgdG8gYSBmcmFnbWVudCBpbiBhIEJ1bmRsZS4gIFRoaXMgQnVuZGxlIGNhbiBiZQorICAgICAqIHBlcnNpc3RlZCBhcyBzYXZlZCBzdGF0ZSwgYW5kIHdoZW4gbGF0ZXIgcmVzdG9yaW5nCisgICAgICoge0BsaW5rICNnZXRGcmFnbWVudChCdW5kbGUsIFN0cmluZyl9IHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50CisgICAgICogaW5zdGFuY2Ugb2YgdGhlIHNhbWUgZnJhZ21lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUgaW4gd2hpY2ggdG8gcHV0IHRoZSBmcmFnbWVudCByZWZlcmVuY2UuCisgICAgICogQHBhcmFtIGtleSBUaGUgbmFtZSBvZiB0aGUgZW50cnkgaW4gdGhlIGJ1bmRsZS4KKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIEZyYWdtZW50IHdob3NlIHJlZmVyZW5jZSBpcyB0byBiZSBzdG9yZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHV0RnJhZ21lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGtleSwgRnJhZ21lbnQgZnJhZ21lbnQpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgRnJhZ21lbnQgaW5zdGFuY2UgZm9yIGEgcmVmZXJlbmNlIHByZXZpb3VzbHkKKyAgICAgKiBwbGFjZWQgd2l0aCB7QGxpbmsgI3B1dEZyYWdtZW50KEJ1bmRsZSwgU3RyaW5nLCBGcmFnbWVudCl9LgorICAgICAqCisgICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIGZyYWdtZW50IHJlZmVyZW5jZS4KKyAgICAgKiBAcGFyYW0ga2V5IFRoZSBuYW1lIG9mIHRoZSBlbnRyeSBpbiB0aGUgYnVuZGxlLgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3VycmVudCBGcmFnbWVudCBpbnN0YW5jZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoZSBnaXZlbiByZWZlcmVuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50IGdldEZyYWdtZW50KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBrZXkpOworCisgICAgLyoqCisgICAgICogUHJpbnQgdGhlIEZyYWdtZW50TWFuYWdlcidzIHN0YXRlIGludG8gdGhlIGdpdmVuIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXggVGV4dCB0byBwcmludCBhdCB0aGUgZnJvbnQgb2YgZWFjaCBsaW5lLgorICAgICAqIEBwYXJhbSBmZCBUaGUgcmF3IGZpbGUgZGVzY3JpcHRvciB0aGF0IHRoZSBkdW1wIGlzIGJlaW5nIHNlbnQgdG8uCisgICAgICogQHBhcmFtIHdyaXRlciBBIFByaW50V3JpdGVyIHRvIHdoaWNoIHRoZSBkdW1wIGlzIHRvIGJlIHNldC4KKyAgICAgKiBAcGFyYW0gYXJncyBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0byB0aGUgZHVtcCByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGR1bXAoU3RyaW5nIHByZWZpeCwgRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nW10gYXJncyk7Cit9CisKK2ZpbmFsIGNsYXNzIEZyYWdtZW50TWFuYWdlclN0YXRlIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgRnJhZ21lbnRTdGF0ZVtdIG1BY3RpdmU7CisgICAgaW50W10gbUFkZGVkOworICAgIEJhY2tTdGFja1N0YXRlW10gbUJhY2tTdGFjazsKKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRNYW5hZ2VyU3RhdGUoKSB7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudE1hbmFnZXJTdGF0ZShQYXJjZWwgaW4pIHsKKyAgICAgICAgbUFjdGl2ZSA9IGluLmNyZWF0ZVR5cGVkQXJyYXkoRnJhZ21lbnRTdGF0ZS5DUkVBVE9SKTsKKyAgICAgICAgbUFkZGVkID0gaW4uY3JlYXRlSW50QXJyYXkoKTsKKyAgICAgICAgbUJhY2tTdGFjayA9IGluLmNyZWF0ZVR5cGVkQXJyYXkoQmFja1N0YWNrU3RhdGUuQ1JFQVRPUik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVUeXBlZEFycmF5KG1BY3RpdmUsIGZsYWdzKTsKKyAgICAgICAgZGVzdC53cml0ZUludEFycmF5KG1BZGRlZCk7CisgICAgICAgIGRlc3Qud3JpdGVUeXBlZEFycmF5KG1CYWNrU3RhY2ssIGZsYWdzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8RnJhZ21lbnRNYW5hZ2VyU3RhdGU+IENSRUFUT1IKKyAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxGcmFnbWVudE1hbmFnZXJTdGF0ZT4oKSB7CisgICAgICAgIHB1YmxpYyBGcmFnbWVudE1hbmFnZXJTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudE1hbmFnZXJTdGF0ZShpbik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBGcmFnbWVudE1hbmFnZXJTdGF0ZVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50TWFuYWdlclN0YXRlW3NpemVdOworICAgICAgICB9CisgICAgfTsKK30KKworLyoqCisgKiBDb250YWluZXIgZm9yIGZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYW4gYWN0aXZpdHkuCisgKi8KK2ZpbmFsIGNsYXNzIEZyYWdtZW50TWFuYWdlckltcGwgaW1wbGVtZW50cyBGcmFnbWVudE1hbmFnZXIgeworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJGcmFnbWVudE1hbmFnZXIiOworICAgIAorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX1JFUVVFU1RfQ09ERV9TVEFURV9UQUcgPSAiYW5kcm9pZDp0YXJnZXRfcmVxX3N0YXRlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9TVEFURV9UQUcgPSAiYW5kcm9pZDp0YXJnZXRfc3RhdGUiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19TVEFURV9UQUcgPSAiYW5kcm9pZDp2aWV3X3N0YXRlIjsKKworICAgIEFycmF5TGlzdDxSdW5uYWJsZT4gbVBlbmRpbmdBY3Rpb25zOworICAgIFJ1bm5hYmxlW10gbVRtcEFjdGlvbnM7CisgICAgYm9vbGVhbiBtRXhlY3V0aW5nQWN0aW9uczsKKyAgICAKKyAgICBBcnJheUxpc3Q8RnJhZ21lbnQ+IG1BY3RpdmU7CisgICAgQXJyYXlMaXN0PEZyYWdtZW50PiBtQWRkZWQ7CisgICAgQXJyYXlMaXN0PEludGVnZXI+IG1BdmFpbEluZGljZXM7CisgICAgQXJyYXlMaXN0PEJhY2tTdGFja1JlY29yZD4gbUJhY2tTdGFjazsKKyAgICAKKyAgICAvLyBNdXN0IGJlIGFjY2Vzc2VkIHdoaWxlIGxvY2tlZC4KKyAgICBBcnJheUxpc3Q8QmFja1N0YWNrUmVjb3JkPiBtQmFja1N0YWNrSW5kaWNlczsKKyAgICBBcnJheUxpc3Q8SW50ZWdlcj4gbUF2YWlsQmFja1N0YWNrSW5kaWNlczsKKworICAgIEFycmF5TGlzdDxPbkJhY2tTdGFja0NoYW5nZWRMaXN0ZW5lcj4gbUJhY2tTdGFja0NoYW5nZUxpc3RlbmVyczsKKworICAgIGludCBtQ3VyU3RhdGUgPSBGcmFnbWVudC5JTklUSUFMSVpJTkc7CisgICAgQWN0aXZpdHkgbUFjdGl2aXR5OworICAgIAorICAgIGJvb2xlYW4gbU5lZWRNZW51SW52YWxpZGF0ZTsKKyAgICBib29sZWFuIG1TdGF0ZVNhdmVkOworICAgIAorICAgIC8vIFRlbXBvcmFyeSB2YXJzIGZvciBzdGF0ZSBzYXZlIGFuZCByZXN0b3JlLgorICAgIEJ1bmRsZSBtU3RhdGVCdW5kbGUgPSBudWxsOworICAgIFNwYXJzZUFycmF5PFBhcmNlbGFibGU+IG1TdGF0ZUFycmF5ID0gbnVsbDsKKyAgICAKKyAgICBSdW5uYWJsZSBtRXhlY0NvbW1pdCA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGV4ZWNQZW5kaW5nQWN0aW9ucygpOworICAgICAgICB9CisgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIG9wZW5UcmFuc2FjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCYWNrU3RhY2tSZWNvcmQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcG9wQmFja1N0YWNrKCkgeworICAgICAgICByZXR1cm4gcG9wQmFja1N0YWNrU3RhdGUobUFjdGl2aXR5Lm1IYW5kbGVyLCBudWxsLCAtMSwgMCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcG9wQmFja1N0YWNrKFN0cmluZyBuYW1lLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIHBvcEJhY2tTdGFja1N0YXRlKG1BY3Rpdml0eS5tSGFuZGxlciwgbmFtZSwgLTEsIGZsYWdzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soaW50IGlkLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgaWYgKGlkIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGlkOiAiICsgaWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwb3BCYWNrU3RhY2tTdGF0ZShtQWN0aXZpdHkubUhhbmRsZXIsIG51bGwsIGlkLCBmbGFncyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBjb3VudEJhY2tTdGFja0VudHJpZXMoKSB7CisgICAgICAgIHJldHVybiBtQmFja1N0YWNrICE9IG51bGwgPyBtQmFja1N0YWNrLnNpemUoKSA6IDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJhY2tTdGFja0VudHJ5IGdldEJhY2tTdGFja0VudHJ5KGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gbUJhY2tTdGFjay5nZXQoaW5kZXgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZE9uQmFja1N0YWNrQ2hhbmdlZExpc3RlbmVyKE9uQmFja1N0YWNrQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtQmFja1N0YWNrQ2hhbmdlTGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1CYWNrU3RhY2tDaGFuZ2VMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PE9uQmFja1N0YWNrQ2hhbmdlZExpc3RlbmVyPigpOworICAgICAgICB9CisgICAgICAgIG1CYWNrU3RhY2tDaGFuZ2VMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVPbkJhY2tTdGFja0NoYW5nZWRMaXN0ZW5lcihPbkJhY2tTdGFja0NoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobUJhY2tTdGFja0NoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQmFja1N0YWNrQ2hhbmdlTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwdXRGcmFnbWVudChCdW5kbGUgYnVuZGxlLCBTdHJpbmcga2V5LCBGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICBpZiAoZnJhZ21lbnQubUluZGV4IDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGZyYWdtZW50CisgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgY3VycmVudGx5IGluIHRoZSBGcmFnbWVudE1hbmFnZXIiKTsKKyAgICAgICAgfQorICAgICAgICBidW5kbGUucHV0SW50KGtleSwgZnJhZ21lbnQubUluZGV4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRnJhZ21lbnQgZ2V0RnJhZ21lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGtleSkgeworICAgICAgICBpbnQgaW5kZXggPSBidW5kbGUuZ2V0SW50KGtleSwgLTEpOworICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChpbmRleCA+PSBtQWN0aXZlLnNpemUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ2VtZW50IG5vIGxvbmdlciBleGlzdHMgZm9yIGtleSAiCisgICAgICAgICAgICAgICAgICAgICsga2V5ICsgIjogaW5kZXggIiArIGluZGV4KTsKKyAgICAgICAgfQorICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoaW5kZXgpOworICAgICAgICBpZiAoZiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnZW1lbnQgbm8gbG9uZ2VyIGV4aXN0cyBmb3Iga2V5ICIKKyAgICAgICAgICAgICAgICAgICAgKyBrZXkgKyAiOiBpbmRleCAiICsgaW5kZXgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGR1bXAoU3RyaW5nIHByZWZpeCwgRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nW10gYXJncykgeworICAgICAgICBpZiAobUFjdGl2ZSA9PSBudWxsIHx8IG1BY3RpdmUuc2l6ZSgpIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHdyaXRlci5wcmludChwcmVmaXgpOyB3cml0ZXIucHJpbnRsbigiQWN0aXZlIEZyYWdtZW50czoiKTsKKworICAgICAgICBTdHJpbmcgaW5uZXJQcmVmaXggPSBwcmVmaXggKyAiICAgICI7CisKKyAgICAgICAgaW50IE4gPSBtQWN0aXZlLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChwcmVmaXgpOyB3cml0ZXIucHJpbnQoIiAgIyIpOyB3cml0ZXIucHJpbnQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjogIik7IHdyaXRlci5wcmludGxuKGYudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgZi5kdW1wKGlubmVyUHJlZml4LCBmZCwgd3JpdGVyLCBhcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQWRkZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgTiA9IG1BZGRlZC5zaXplKCk7CisgICAgICAgICAgICBpZiAoTiA+IDApIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQocHJlZml4KTsgd3JpdGVyLnByaW50bG4oIkFkZGVkIEZyYWdtZW50czoiKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQocHJlZml4KTsgd3JpdGVyLnByaW50KCIgICMiKTsgd3JpdGVyLnByaW50KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiOiAiKTsgd3JpdGVyLnByaW50bG4oZi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobUJhY2tTdGFjayAhPSBudWxsKSB7CisgICAgICAgICAgICBOID0gbUJhY2tTdGFjay5zaXplKCk7CisgICAgICAgICAgICBpZiAoTiA+IDApIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQocHJlZml4KTsgd3JpdGVyLnByaW50bG4oIkJhY2sgU3RhY2s6Iik7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBCYWNrU3RhY2tSZWNvcmQgYnMgPSBtQmFja1N0YWNrLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KHByZWZpeCk7IHdyaXRlci5wcmludCgiICAjIik7IHdyaXRlci5wcmludChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjogIik7IHdyaXRlci5wcmludGxuKGJzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEFuaW1hdG9yIGxvYWRBbmltYXRvcihGcmFnbWVudCBmcmFnbWVudCwgaW50IHRyYW5zaXQsIGJvb2xlYW4gZW50ZXIsCisgICAgICAgICAgICBpbnQgdHJhbnNpdGlvblN0eWxlKSB7CisgICAgICAgIEFuaW1hdG9yIGFuaW1PYmogPSBmcmFnbWVudC5vbkNyZWF0ZUFuaW1hdG9yKHRyYW5zaXQsIGVudGVyLAorICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1OZXh0QW5pbSk7CisgICAgICAgIGlmIChhbmltT2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBhbmltT2JqOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoZnJhZ21lbnQubU5leHRBbmltICE9IDApIHsKKyAgICAgICAgICAgIEFuaW1hdG9yIGFuaW0gPSBBbmltYXRvckluZmxhdGVyLmxvYWRBbmltYXRvcihtQWN0aXZpdHksIGZyYWdtZW50Lm1OZXh0QW5pbSk7CisgICAgICAgICAgICBpZiAoYW5pbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFuaW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICh0cmFuc2l0ID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpbnQgc3R5bGVJbmRleCA9IHRyYW5zaXRUb1N0eWxlSW5kZXgodHJhbnNpdCwgZW50ZXIpOworICAgICAgICBpZiAoc3R5bGVJbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAodHJhbnNpdGlvblN0eWxlID09IDAgJiYgbUFjdGl2aXR5LmdldFdpbmRvdygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyYW5zaXRpb25TdHlsZSA9IG1BY3Rpdml0eS5nZXRXaW5kb3coKS5nZXRBdHRyaWJ1dGVzKCkud2luZG93QW5pbWF0aW9uczsKKyAgICAgICAgfQorICAgICAgICBpZiAodHJhbnNpdGlvblN0eWxlID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBUeXBlZEFycmF5IGF0dHJzID0gbUFjdGl2aXR5Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXModHJhbnNpdGlvblN0eWxlLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50QW5pbWF0aW9uKTsKKyAgICAgICAgaW50IGFuaW0gPSBhdHRycy5nZXRSZXNvdXJjZUlkKHN0eWxlSW5kZXgsIDApOworICAgICAgICBhdHRycy5yZWN5Y2xlKCk7CisgICAgICAgIAorICAgICAgICBpZiAoYW5pbSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIEFuaW1hdG9ySW5mbGF0ZXIubG9hZEFuaW1hdG9yKG1BY3Rpdml0eSwgYW5pbSk7CisgICAgfQorICAgIAorICAgIHZvaWQgbW92ZVRvU3RhdGUoRnJhZ21lbnQgZiwgaW50IG5ld1N0YXRlLCBpbnQgdHJhbnNpdCwgaW50IHRyYW5zaXRpb25TdHlsZSkgeworICAgICAgICAvLyBGcmFnbWVudHMgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBhZGRlZCB3aWxsIHNpdCBpbiB0aGUgb25DcmVhdGUoKSBzdGF0ZS4KKyAgICAgICAgaWYgKCFmLm1BZGRlZCAmJiBuZXdTdGF0ZSA+IEZyYWdtZW50LkNSRUFURUQpIHsKKyAgICAgICAgICAgIG5ld1N0YXRlID0gRnJhZ21lbnQuQ1JFQVRFRDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGYubVN0YXRlIDwgbmV3U3RhdGUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZi5tU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LklOSVRJQUxJWklORzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZldG8gQ1JFQVRFRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICBpZiAoZi5tU2F2ZWRGcmFnbWVudFN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubVNhdmVkVmlld1N0YXRlID0gZi5tU2F2ZWRGcmFnbWVudFN0YXRlLmdldFNwYXJzZVBhcmNlbGFibGVBcnJheSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5WSUVXX1NUQVRFX1RBRyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1UYXJnZXQgPSBnZXRGcmFnbWVudChmLm1TYXZlZEZyYWdtZW50U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwuVEFSR0VUX1NUQVRFX1RBRyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1UYXJnZXRSZXF1ZXN0Q29kZSA9IGYubVNhdmVkRnJhZ21lbnRTdGF0ZS5nZXRJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXJJbXBsLlRBUkdFVF9SRVFVRVNUX0NPREVfU1RBVEVfVEFHLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmLm1BY3Rpdml0eSA9IG1BY3Rpdml0eTsKKyAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGYub25BdHRhY2gobUFjdGl2aXR5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uQXR0YWNoKCkiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHkub25BdHRhY2hGcmFnbWVudChmKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmICghZi5tUmV0YWluaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25DcmVhdGUoZi5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uQ3JlYXRlKCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmLm1SZXRhaW5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYubUZyb21MYXlvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBmcmFnbWVudHMgdGhhdCBhcmUgcGFydCBvZiB0aGUgY29udGVudCB2aWV3CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXlvdXQsIHdlIG5lZWQgdG8gaW5zdGFudGlhdGUgdGhlIHZpZXcgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgaW5mbGF0ZXIgd2lsbCB0YWtlIGNhcmUgb2YgYWRkaW5nIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgZi5tVmlldyA9IGYub25DcmVhdGVWaWV3KG1BY3Rpdml0eS5nZXRMYXlvdXRJbmZsYXRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBmLm1TYXZlZEZyYWdtZW50U3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubVZpZXcuc2V0U2F2ZUZyb21QYXJlbnRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnJlc3RvcmVWaWV3U3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tSGlkZGVuKSBmLm1WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsgCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LkNSRUFURUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA+IEZyYWdtZW50LkNSRUFURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZXRvIENPTlRFTlQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tRnJvbUxheW91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cCBjb250YWluZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1Db250YWluZXJJZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IChWaWV3R3JvdXApbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChmLm1Db250YWluZXJJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gdmlldyBmb3VuZCBmb3IgaWQgMHgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhmLm1Db250YWluZXJJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZvciBmcmFnbWVudCAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ29udGFpbmVyID0gY29udGFpbmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubVZpZXcgPSBmLm9uQ3JlYXRlVmlldyhtQWN0aXZpdHkuZ2V0TGF5b3V0SW5mbGF0ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciwgZi5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubVZpZXcuc2V0U2F2ZUZyb21QYXJlbnRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmltYXRvciBhbmltID0gbG9hZEFuaW1hdG9yKGYsIHRyYW5zaXQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5pbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5zZXRUYXJnZXQoZi5tVmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmFkZFZpZXcoZi5tVmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnJlc3RvcmVWaWV3U3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tSGlkZGVuKSBmLm1WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25BY3Rpdml0eUNyZWF0ZWQoZi5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uUmVhZHkoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZi5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQuQUNUSVZJVFlfQ1JFQVRFRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID4gRnJhZ21lbnQuQUNUSVZJVFlfQ1JFQVRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZldG8gU1RBUlRFRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm9uU3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uU3RhcnQoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5TVEFSVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPiBGcmFnbWVudC5TVEFSVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmV0byBSRVNVTUVEOiAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubVJlc3VtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgZi5vblJlc3VtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25SZXN1bWUoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZi5tU3RhdGUgPiBuZXdTdGF0ZSkgeworICAgICAgICAgICAgc3dpdGNoIChmLm1TdGF0ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQuUkVTVU1FRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlIDwgRnJhZ21lbnQuUkVTVU1FRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZlZnJvbSBSRVNVTUVEOiAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25QYXVzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25QYXVzZSgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1SZXN1bWVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LlNUQVJURUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA8IEZyYWdtZW50LlNUQVJURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZWZyb20gU1RBUlRFRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLnBlcmZvcm1TdG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblN0b3AoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPCBGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmVmcm9tIENPTlRFTlQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIHNhdmUgdGhlIGN1cnJlbnQgdmlldyBzdGF0ZSBpZiBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb25lIGFscmVhZHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtQWN0aXZpdHkuaXNGaW5pc2hpbmcoKSAmJiBmLm1TYXZlZFZpZXdTdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVGcmFnbWVudFZpZXdTdGF0ZShmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25EZXN0cm95VmlldygpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25EZXN0cm95ZWRWaWV3KCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwgJiYgZi5tQ29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmltYXRvciBhbmltID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUN1clN0YXRlID4gRnJhZ21lbnQuSU5JVElBTElaSU5HKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0gPSBsb2FkQW5pbWF0b3IoZiwgdHJhbnNpdCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3R3JvdXAgY29udGFpbmVyID0gZi5tQ29udGFpbmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBmLm1WaWV3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuc3RhcnRWaWV3VHJhbnNpdGlvbih2aWV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5hZGRMaXN0ZW5lcihuZXcgQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdG9yIGFuaW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZW5kVmlld1RyYW5zaXRpb24odmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltLnNldFRhcmdldChmLm1WaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5zdGFydCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubUNvbnRhaW5lci5yZW1vdmVWaWV3KGYubVZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ29udGFpbmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubVZpZXcgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5DUkVBVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPCBGcmFnbWVudC5DUkVBVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmVmcm9tIENSRUFURUQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tUmV0YWluaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5vbkRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uRGVzdHJveSgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25EZXRhY2goKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uRGV0YWNoKCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUltbWVkaWF0ZUFjdGl2aXR5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUFjdGl2aXR5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmLm1TdGF0ZSA9IG5ld1N0YXRlOworICAgIH0KKyAgICAKKyAgICB2b2lkIG1vdmVUb1N0YXRlKEZyYWdtZW50IGYpIHsKKyAgICAgICAgbW92ZVRvU3RhdGUoZiwgbUN1clN0YXRlLCAwLCAwKTsKKyAgICB9CisKKyAgICB2b2lkIG1vdmVUb1N0YXRlKGludCBuZXdTdGF0ZSwgYm9vbGVhbiBhbHdheXMpIHsKKyAgICAgICAgbW92ZVRvU3RhdGUobmV3U3RhdGUsIDAsIDAsIGFsd2F5cyk7CisgICAgfQorICAgIAorICAgIHZvaWQgbW92ZVRvU3RhdGUoaW50IG5ld1N0YXRlLCBpbnQgdHJhbnNpdCwgaW50IHRyYW5zaXRTdHlsZSwgYm9vbGVhbiBhbHdheXMpIHsKKyAgICAgICAgaWYgKG1BY3Rpdml0eSA9PSBudWxsICYmIG5ld1N0YXRlICE9IEZyYWdtZW50LklOSVRJQUxJWklORykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gYWN0aXZpdHkiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFhbHdheXMgJiYgbUN1clN0YXRlID09IG5ld1N0YXRlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG1DdXJTdGF0ZSA9IG5ld1N0YXRlOworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFjdGl2ZS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWN0aXZlLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1vdmVUb1N0YXRlKGYsIG5ld1N0YXRlLCB0cmFuc2l0LCB0cmFuc2l0U3R5bGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1OZWVkTWVudUludmFsaWRhdGUgJiYgbUFjdGl2aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQWN0aXZpdHkuaW52YWxpZGF0ZU9wdGlvbnNNZW51KCk7CisgICAgICAgICAgICAgICAgbU5lZWRNZW51SW52YWxpZGF0ZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgbWFrZUFjdGl2ZShGcmFnbWVudCBmKSB7CisgICAgICAgIGlmIChmLm1JbmRleCA+PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtQXZhaWxJbmRpY2VzID09IG51bGwgfHwgbUF2YWlsSW5kaWNlcy5zaXplKCkgPD0gMCkgeworICAgICAgICAgICAgaWYgKG1BY3RpdmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BY3RpdmUgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZi5zZXRJbmRleChtQWN0aXZlLnNpemUoKSk7CisgICAgICAgICAgICBtQWN0aXZlLmFkZChmKTsKKyAgICAgICAgICAgIAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZi5zZXRJbmRleChtQXZhaWxJbmRpY2VzLnJlbW92ZShtQXZhaWxJbmRpY2VzLnNpemUoKS0xKSk7CisgICAgICAgICAgICBtQWN0aXZlLnNldChmLm1JbmRleCwgZik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBtYWtlSW5hY3RpdmUoRnJhZ21lbnQgZikgeworICAgICAgICBpZiAoZi5tSW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiRnJlZWluZyBmcmFnbWVudCBpbmRleCAiICsgZi5tSW5kZXgpOworICAgICAgICBtQWN0aXZlLnNldChmLm1JbmRleCwgbnVsbCk7CisgICAgICAgIGlmIChtQXZhaWxJbmRpY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1BdmFpbEluZGljZXMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUF2YWlsSW5kaWNlcy5hZGQoZi5tSW5kZXgpOworICAgICAgICBtQWN0aXZpdHkuaW52YWxpZGF0ZUZyYWdtZW50SW5kZXgoZi5tSW5kZXgpOworICAgICAgICBmLmNsZWFySW5kZXgoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIGJvb2xlYW4gbW92ZVRvU3RhdGVOb3cpIHsKKyAgICAgICAgaWYgKG1BZGRlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBtQWRkZWQgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PigpOworICAgICAgICB9CisgICAgICAgIG1BZGRlZC5hZGQoZnJhZ21lbnQpOworICAgICAgICBtYWtlQWN0aXZlKGZyYWdtZW50KTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJhZGQ6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIGZyYWdtZW50Lm1BZGRlZCA9IHRydWU7CisgICAgICAgIGlmIChmcmFnbWVudC5tSGFzTWVudSkgeworICAgICAgICAgICAgbU5lZWRNZW51SW52YWxpZGF0ZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1vdmVUb1N0YXRlTm93KSB7CisgICAgICAgICAgICBtb3ZlVG9TdGF0ZShmcmFnbWVudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIGludCB0cmFuc2l0aW9uLCBpbnQgdHJhbnNpdGlvblN0eWxlKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAicmVtb3ZlOiAiICsgZnJhZ21lbnQgKyAiIG5lc3Rpbmc9IiArIGZyYWdtZW50Lm1CYWNrU3RhY2tOZXN0aW5nKTsKKyAgICAgICAgbUFkZGVkLnJlbW92ZShmcmFnbWVudCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5hY3RpdmUgPSBmcmFnbWVudC5tQmFja1N0YWNrTmVzdGluZyA8PSAwOworICAgICAgICBpZiAoZnJhZ21lbnQubUhhc01lbnUpIHsKKyAgICAgICAgICAgIG1OZWVkTWVudUludmFsaWRhdGUgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGZyYWdtZW50Lm1BZGRlZCA9IGZhbHNlOworICAgICAgICBtb3ZlVG9TdGF0ZShmcmFnbWVudCwgaW5hY3RpdmUgPyBGcmFnbWVudC5JTklUSUFMSVpJTkcgOiBGcmFnbWVudC5DUkVBVEVELAorICAgICAgICAgICAgICAgIHRyYW5zaXRpb24sIHRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgIGlmIChpbmFjdGl2ZSkgeworICAgICAgICAgICAgbWFrZUluYWN0aXZlKGZyYWdtZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBoaWRlRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIGludCB0cmFuc2l0aW9uLCBpbnQgdHJhbnNpdGlvblN0eWxlKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiaGlkZTogIiArIGZyYWdtZW50KTsKKyAgICAgICAgaWYgKCFmcmFnbWVudC5tSGlkZGVuKSB7CisgICAgICAgICAgICBmcmFnbWVudC5tSGlkZGVuID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChmcmFnbWVudC5tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQW5pbWF0b3IgYW5pbSA9IGxvYWRBbmltYXRvcihmcmFnbWVudCwgdHJhbnNpdGlvbiwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgaWYgKGFuaW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhbmltLnNldFRhcmdldChmcmFnbWVudC5tVmlldyk7CisgICAgICAgICAgICAgICAgICAgIGFuaW0uc3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnJhZ21lbnQubVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1BZGRlZCAmJiBmcmFnbWVudC5tSGFzTWVudSkgeworICAgICAgICAgICAgICAgIG1OZWVkTWVudUludmFsaWRhdGUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhZ21lbnQub25IaWRkZW5DaGFuZ2VkKHRydWUpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNob3dGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCwgaW50IHRyYW5zaXRpb24sIGludCB0cmFuc2l0aW9uU3R5bGUpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJzaG93OiAiICsgZnJhZ21lbnQpOworICAgICAgICBpZiAoZnJhZ21lbnQubUhpZGRlbikgeworICAgICAgICAgICAgZnJhZ21lbnQubUhpZGRlbiA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBbmltYXRvciBhbmltID0gbG9hZEFuaW1hdG9yKGZyYWdtZW50LCB0cmFuc2l0aW9uLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoYW5pbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFuaW0uc2V0VGFyZ2V0KGZyYWdtZW50Lm1WaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgYW5pbS5zdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcmFnbWVudC5tVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQubUFkZGVkICYmIGZyYWdtZW50Lm1IYXNNZW51KSB7CisgICAgICAgICAgICAgICAgbU5lZWRNZW51SW52YWxpZGF0ZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmFnbWVudC5vbkhpZGRlbkNoYW5nZWQoZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudCBmaW5kRnJhZ21lbnRCeUlkKGludCBpZCkgeworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBGaXJzdCBsb29rIHRocm91Z2ggYWRkZWQgZnJhZ21lbnRzLgorICAgICAgICAgICAgZm9yIChpbnQgaT1tQWRkZWQuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgZi5tRnJhZ21lbnRJZCA9PSBpZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBOb3cgZm9yIGFueSBrbm93biBmcmFnbWVudC4KKyAgICAgICAgICAgIGZvciAoaW50IGk9bUFjdGl2ZS5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgZi5tRnJhZ21lbnRJZCA9PSBpZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudCBmaW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcgdGFnKSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwgJiYgdGFnICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEZpcnN0IGxvb2sgdGhyb3VnaCBhZGRlZCBmcmFnbWVudHMuCisgICAgICAgICAgICBmb3IgKGludCBpPW1BZGRlZC5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiB0YWcuZXF1YWxzKGYubVRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTm93IGZvciBhbnkga25vd24gZnJhZ21lbnQuCisgICAgICAgICAgICBmb3IgKGludCBpPW1BY3RpdmUuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWN0aXZlLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmIHRhZy5lcXVhbHMoZi5tVGFnKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudCBmaW5kRnJhZ21lbnRCeVdobyhTdHJpbmcgd2hvKSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwgJiYgd2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9bUFjdGl2ZS5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgd2hvLmVxdWFscyhmLm1XaG8pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZW5xdWV1ZUFjdGlvbihSdW5uYWJsZSBhY3Rpb24pIHsKKyAgICAgICAgaWYgKG1TdGF0ZVNhdmVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2FuIG5vdCBwZXJmb3JtIHRoaXMgYWN0aW9uIGFmdGVyIG9uU2F2ZUluc3RhbmNlU3RhdGUiKTsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChtUGVuZGluZ0FjdGlvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1QZW5kaW5nQWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8UnVubmFibGU+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGVuZGluZ0FjdGlvbnMuYWRkKGFjdGlvbik7CisgICAgICAgICAgICBpZiAobVBlbmRpbmdBY3Rpb25zLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2aXR5Lm1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtRXhlY0NvbW1pdCk7CisgICAgICAgICAgICAgICAgbUFjdGl2aXR5Lm1IYW5kbGVyLnBvc3QobUV4ZWNDb21taXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgYWxsb2NCYWNrU3RhY2tJbmRleChCYWNrU3RhY2tSZWNvcmQgYnNlKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKG1BdmFpbEJhY2tTdGFja0luZGljZXMgPT0gbnVsbCB8fCBtQXZhaWxCYWNrU3RhY2tJbmRpY2VzLnNpemUoKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG1CYWNrU3RhY2tJbmRpY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUJhY2tTdGFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PEJhY2tTdGFja1JlY29yZD4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbUJhY2tTdGFja0luZGljZXMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiU2V0dGluZyBiYWNrIHN0YWNrIGluZGV4ICIgKyBpbmRleCArICIgdG8gIiArIGJzZSk7CisgICAgICAgICAgICAgICAgbUJhY2tTdGFja0luZGljZXMuYWRkKGJzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OworCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1BdmFpbEJhY2tTdGFja0luZGljZXMucmVtb3ZlKG1BdmFpbEJhY2tTdGFja0luZGljZXMuc2l6ZSgpLTEpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiQWRkaW5nIGJhY2sgc3RhY2sgaW5kZXggIiArIGluZGV4ICsgIiB3aXRoICIgKyBic2UpOworICAgICAgICAgICAgICAgIG1CYWNrU3RhY2tJbmRpY2VzLnNldChpbmRleCwgYnNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCYWNrU3RhY2tJbmRleChpbnQgaW5kZXgsIEJhY2tTdGFja1JlY29yZCBic2UpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAobUJhY2tTdGFja0luZGljZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1CYWNrU3RhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDxCYWNrU3RhY2tSZWNvcmQ+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgTiA9IG1CYWNrU3RhY2tJbmRpY2VzLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IE4pIHsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlNldHRpbmcgYmFjayBzdGFjayBpbmRleCAiICsgaW5kZXggKyAiIHRvICIgKyBic2UpOworICAgICAgICAgICAgICAgIG1CYWNrU3RhY2tJbmRpY2VzLnNldChpbmRleCwgYnNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKE4gPCBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICBtQmFja1N0YWNrSW5kaWNlcy5hZGQobnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQXZhaWxCYWNrU3RhY2tJbmRpY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbEJhY2tTdGFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJBZGRpbmcgYXZhaWxhYmxlIGJhY2sgc3RhY2sgaW5kZXggIiArIE4pOworICAgICAgICAgICAgICAgICAgICBtQXZhaWxCYWNrU3RhY2tJbmRpY2VzLmFkZChOKTsKKyAgICAgICAgICAgICAgICAgICAgTisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkFkZGluZyBiYWNrIHN0YWNrIGluZGV4ICIgKyBpbmRleCArICIgd2l0aCAiICsgYnNlKTsKKyAgICAgICAgICAgICAgICBtQmFja1N0YWNrSW5kaWNlcy5hZGQoYnNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZyZWVCYWNrU3RhY2tJbmRleChpbnQgaW5kZXgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtQmFja1N0YWNrSW5kaWNlcy5zZXQoaW5kZXgsIG51bGwpOworICAgICAgICAgICAgaWYgKG1BdmFpbEJhY2tTdGFja0luZGljZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BdmFpbEJhY2tTdGFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkZyZWVpbmcgYmFjayBzdGFjayBpbmRleCAiICsgaW5kZXgpOworICAgICAgICAgICAgbUF2YWlsQmFja1N0YWNrSW5kaWNlcy5hZGQoaW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogT25seSBjYWxsIGZyb20gbWFpbiB0aHJlYWQhCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY1BlbmRpbmdBY3Rpb25zKCkgeworICAgICAgICBpZiAobUV4ZWN1dGluZ0FjdGlvbnMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJlY3Vyc2l2ZSBlbnRyeSB0byBleGVjUGVuZGluZ0FjdGlvbnMiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBudW1BY3Rpb25zOworICAgICAgICAgICAgCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdBY3Rpb25zID09IG51bGwgfHwgbVBlbmRpbmdBY3Rpb25zLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbnVtQWN0aW9ucyA9IG1QZW5kaW5nQWN0aW9ucy5zaXplKCk7CisgICAgICAgICAgICAgICAgaWYgKG1UbXBBY3Rpb25zID09IG51bGwgfHwgbVRtcEFjdGlvbnMubGVuZ3RoIDwgbnVtQWN0aW9ucykgeworICAgICAgICAgICAgICAgICAgICBtVG1wQWN0aW9ucyA9IG5ldyBSdW5uYWJsZVtudW1BY3Rpb25zXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVBlbmRpbmdBY3Rpb25zLnRvQXJyYXkobVRtcEFjdGlvbnMpOworICAgICAgICAgICAgICAgIG1QZW5kaW5nQWN0aW9ucy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5tSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobUV4ZWNDb21taXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBtRXhlY3V0aW5nQWN0aW9ucyA9IHRydWU7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bnVtQWN0aW9uczsgaSsrKSB7CisgICAgICAgICAgICAgICAgbVRtcEFjdGlvbnNbaV0ucnVuKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRXhlY3V0aW5nQWN0aW9ucyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgcmVwb3J0QmFja1N0YWNrQ2hhbmdlZCgpIHsKKyAgICAgICAgaWYgKG1CYWNrU3RhY2tDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1CYWNrU3RhY2tDaGFuZ2VMaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtQmFja1N0YWNrQ2hhbmdlTGlzdGVuZXJzLmdldChpKS5vbkJhY2tTdGFja0NoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgYWRkQmFja1N0YWNrU3RhdGUoQmFja1N0YWNrUmVjb3JkIHN0YXRlKSB7CisgICAgICAgIGlmIChtQmFja1N0YWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIG1CYWNrU3RhY2sgPSBuZXcgQXJyYXlMaXN0PEJhY2tTdGFja1JlY29yZD4oKTsKKyAgICAgICAgfQorICAgICAgICBtQmFja1N0YWNrLmFkZChzdGF0ZSk7CisgICAgICAgIHJlcG9ydEJhY2tTdGFja0NoYW5nZWQoKTsKKyAgICB9CisgICAgCisgICAgYm9vbGVhbiBwb3BCYWNrU3RhY2tTdGF0ZShIYW5kbGVyIGhhbmRsZXIsIFN0cmluZyBuYW1lLCBpbnQgaWQsIGludCBmbGFncykgeworICAgICAgICBpZiAobUJhY2tTdGFjayA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCAmJiBpZCA8IDAgJiYgKGZsYWdzJkFjdGl2aXR5LlBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSkgPT0gMCkgeworICAgICAgICAgICAgaW50IGxhc3QgPSBtQmFja1N0YWNrLnNpemUoKS0xOworICAgICAgICAgICAgaWYgKGxhc3QgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgQmFja1N0YWNrUmVjb3JkIGJzcyA9IG1CYWNrU3RhY2sucmVtb3ZlKGxhc3QpOworICAgICAgICAgICAgZW5xdWV1ZUFjdGlvbihuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlBvcHBpbmcgYmFjayBzdGFjayBzdGF0ZTogIiArIGJzcyk7CisgICAgICAgICAgICAgICAgICAgIGJzcy5wb3BGcm9tQmFja1N0YWNrKHRydWUpOworICAgICAgICAgICAgICAgICAgICByZXBvcnRCYWNrU3RhY2tDaGFuZ2VkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSAtMTsKKyAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwgfHwgaWQgPj0gMCkgeworICAgICAgICAgICAgICAgIC8vIElmIGEgbmFtZSBvciBJRCBpcyBzcGVjaWZpZWQsIGxvb2sgZm9yIHRoYXQgcGxhY2UgaW4KKyAgICAgICAgICAgICAgICAvLyB0aGUgc3RhY2suCisgICAgICAgICAgICAgICAgaW5kZXggPSBtQmFja1N0YWNrLnNpemUoKS0xOworICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEJhY2tTdGFja1JlY29yZCBic3MgPSBtQmFja1N0YWNrLmdldChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5lcXVhbHMoYnNzLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpZCA+PSAwICYmIGlkID09IGJzcy5tSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGluZGV4LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGZsYWdzJkFjdGl2aXR5LlBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpbmRleC0tOworICAgICAgICAgICAgICAgICAgICAvLyBDb25zdW1lIGFsbCBmb2xsb3dpbmcgZW50cmllcyB0aGF0IG1hdGNoLgorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQmFja1N0YWNrUmVjb3JkIGJzcyA9IG1CYWNrU3RhY2suZ2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobmFtZSAhPSBudWxsICYmIG5hbWUuZXF1YWxzKGJzcy5nZXROYW1lKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaWQgPj0gMCAmJiBpZCA9PSBic3MubUluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbmRleCA9PSBtQmFja1N0YWNrLnNpemUoKS0xKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PEJhY2tTdGFja1JlY29yZD4gc3RhdGVzCisgICAgICAgICAgICAgICAgICAgID0gbmV3IEFycmF5TGlzdDxCYWNrU3RhY2tSZWNvcmQ+KCk7CisgICAgICAgICAgICBmb3IgKGludCBpPW1CYWNrU3RhY2suc2l6ZSgpLTE7IGk+aW5kZXg7IGktLSkgeworICAgICAgICAgICAgICAgIHN0YXRlcy5hZGQobUJhY2tTdGFjay5yZW1vdmUoaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW5xdWV1ZUFjdGlvbihuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgTEFTVCA9IHN0YXRlcy5zaXplKCktMTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPD1MQVNUOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiUG9wcGluZyBiYWNrIHN0YWNrIHN0YXRlOiAiICsgc3RhdGVzLmdldChpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXMuZ2V0KGkpLnBvcEZyb21CYWNrU3RhY2soaSA9PSBMQVNUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXBvcnRCYWNrU3RhY2tDaGFuZ2VkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIEFycmF5TGlzdDxGcmFnbWVudD4gcmV0YWluTm9uQ29uZmlnKCkgeworICAgICAgICBBcnJheUxpc3Q8RnJhZ21lbnQ+IGZyYWdtZW50cyA9IG51bGw7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWN0aXZlLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgZi5tUmV0YWluSW5zdGFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudHMgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50cy5hZGQoZik7CisgICAgICAgICAgICAgICAgICAgIGYubVJldGFpbmluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmcmFnbWVudHM7CisgICAgfQorICAgIAorICAgIHZvaWQgc2F2ZUZyYWdtZW50Vmlld1N0YXRlKEZyYWdtZW50IGYpIHsKKyAgICAgICAgaWYgKGYubVZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChtU3RhdGVBcnJheSA9PSBudWxsKSB7CisgICAgICAgICAgICBtU3RhdGVBcnJheSA9IG5ldyBTcGFyc2VBcnJheTxQYXJjZWxhYmxlPigpOworICAgICAgICB9CisgICAgICAgIGYubVZpZXcuc2F2ZUhpZXJhcmNoeVN0YXRlKG1TdGF0ZUFycmF5KTsKKyAgICAgICAgaWYgKG1TdGF0ZUFycmF5LnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGYubVNhdmVkVmlld1N0YXRlID0gbVN0YXRlQXJyYXk7CisgICAgICAgICAgICBtU3RhdGVBcnJheSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgUGFyY2VsYWJsZSBzYXZlQWxsU3RhdGUoKSB7CisgICAgICAgIG1TdGF0ZVNhdmVkID0gdHJ1ZTsKKworICAgICAgICBpZiAobUFjdGl2ZSA9PSBudWxsIHx8IG1BY3RpdmUuc2l6ZSgpIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGaXJzdCBjb2xsZWN0IGFsbCBhY3RpdmUgZnJhZ21lbnRzLgorICAgICAgICBpbnQgTiA9IG1BY3RpdmUuc2l6ZSgpOworICAgICAgICBGcmFnbWVudFN0YXRlW10gYWN0aXZlID0gbmV3IEZyYWdtZW50U3RhdGVbTl07CisgICAgICAgIGJvb2xlYW4gaGF2ZUZyYWdtZW50cyA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoaSk7CisgICAgICAgICAgICBpZiAoZiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGF2ZUZyYWdtZW50cyA9IHRydWU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgRnJhZ21lbnRTdGF0ZSBmcyA9IG5ldyBGcmFnbWVudFN0YXRlKGYpOworICAgICAgICAgICAgICAgIGFjdGl2ZVtpXSA9IGZzOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChmLm1TdGF0ZSA+IEZyYWdtZW50LklOSVRJQUxJWklORyAmJiBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZUJ1bmRsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGVCdW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZi5vblNhdmVJbnN0YW5jZVN0YXRlKG1TdGF0ZUJ1bmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbVN0YXRlQnVuZGxlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSA9IG1TdGF0ZUJ1bmRsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZUJ1bmRsZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYXZlRnJhZ21lbnRWaWV3U3RhdGUoZik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tU2F2ZWRWaWV3U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZS5wdXRTcGFyc2VQYXJjZWxhYmxlQXJyYXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXJJbXBsLlZJRVdfU1RBVEVfVEFHLCBmLm1TYXZlZFZpZXdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHV0RnJhZ21lbnQoZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5UQVJHRVRfU1RBVEVfVEFHLCBmLm1UYXJnZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubVRhcmdldFJlcXVlc3RDb2RlICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlLnB1dEludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwuVEFSR0VUX1JFUVVFU1RfQ09ERV9TVEFURV9UQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1UYXJnZXRSZXF1ZXN0Q29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZzLm1TYXZlZEZyYWdtZW50U3RhdGUgPSBmLm1TYXZlZEZyYWdtZW50U3RhdGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiU2F2ZWQgc3RhdGUgb2YgIiArIGYgKyAiOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGZzLm1TYXZlZEZyYWdtZW50U3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIWhhdmVGcmFnbWVudHMpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAic2F2ZUFsbFN0YXRlOiBubyBmcmFnbWVudHMhIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW50W10gYWRkZWQgPSBudWxsOworICAgICAgICBCYWNrU3RhY2tTdGF0ZVtdIGJhY2tTdGFjayA9IG51bGw7CisgICAgICAgIAorICAgICAgICAvLyBCdWlsZCBsaXN0IG9mIGN1cnJlbnRseSBhZGRlZCBmcmFnbWVudHMuCisgICAgICAgIGlmIChtQWRkZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgTiA9IG1BZGRlZC5zaXplKCk7CisgICAgICAgICAgICBpZiAoTiA+IDApIHsKKyAgICAgICAgICAgICAgICBhZGRlZCA9IG5ldyBpbnRbTl07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBhZGRlZFtpXSA9IG1BZGRlZC5nZXQoaSkubUluZGV4OworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInNhdmVBbGxTdGF0ZTogYWRkaW5nIGZyYWdtZW50ICMiICsgaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogIiArIG1BZGRlZC5nZXQoaSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gTm93IHNhdmUgYmFjayBzdGFjay4KKyAgICAgICAgaWYgKG1CYWNrU3RhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgTiA9IG1CYWNrU3RhY2suc2l6ZSgpOworICAgICAgICAgICAgaWYgKE4gPiAwKSB7CisgICAgICAgICAgICAgICAgYmFja1N0YWNrID0gbmV3IEJhY2tTdGFja1N0YXRlW05dOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYmFja1N0YWNrW2ldID0gbmV3IEJhY2tTdGFja1N0YXRlKHRoaXMsIG1CYWNrU3RhY2suZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJzYXZlQWxsU3RhdGU6IGFkZGluZyBiYWNrIHN0YWNrICMiICsgaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogIiArIG1CYWNrU3RhY2suZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEZyYWdtZW50TWFuYWdlclN0YXRlIGZtcyA9IG5ldyBGcmFnbWVudE1hbmFnZXJTdGF0ZSgpOworICAgICAgICBmbXMubUFjdGl2ZSA9IGFjdGl2ZTsKKyAgICAgICAgZm1zLm1BZGRlZCA9IGFkZGVkOworICAgICAgICBmbXMubUJhY2tTdGFjayA9IGJhY2tTdGFjazsKKyAgICAgICAgcmV0dXJuIGZtczsKKyAgICB9CisgICAgCisgICAgdm9pZCByZXN0b3JlQWxsU3RhdGUoUGFyY2VsYWJsZSBzdGF0ZSwgQXJyYXlMaXN0PEZyYWdtZW50PiBub25Db25maWcpIHsKKyAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gc2F2ZWQgc3RhdGUgYXQgYWxsLCB0aGVuIHRoZXJlIGNhbiBub3QgYmUKKyAgICAgICAgLy8gYW55IG5vbkNvbmZpZyBmcmFnbWVudHMgZWl0aGVyLCBzbyB0aGF0IGlzIHRoYXQuCisgICAgICAgIGlmIChzdGF0ZSA9PSBudWxsKSByZXR1cm47CisgICAgICAgIEZyYWdtZW50TWFuYWdlclN0YXRlIGZtcyA9IChGcmFnbWVudE1hbmFnZXJTdGF0ZSlzdGF0ZTsKKyAgICAgICAgaWYgKGZtcy5tQWN0aXZlID09IG51bGwpIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIC8vIEZpcnN0IHJlLWF0dGFjaCBhbnkgbm9uLWNvbmZpZyBpbnN0YW5jZXMgd2UgYXJlIHJldGFpbmluZyBiYWNrCisgICAgICAgIC8vIHRvIHRoZWlyIHNhdmVkIHN0YXRlLCBzbyB3ZSBkb24ndCB0cnkgdG8gaW5zdGFudGlhdGUgdGhlbSBhZ2Fpbi4KKyAgICAgICAgaWYgKG5vbkNvbmZpZyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bm9uQ29uZmlnLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG5vbkNvbmZpZy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJyZXN0b3JlQWxsU3RhdGU6IHJlLWF0dGFjaGluZyByZXRhaW5lZCAiICsgZik7CisgICAgICAgICAgICAgICAgRnJhZ21lbnRTdGF0ZSBmcyA9IGZtcy5tQWN0aXZlW2YubUluZGV4XTsKKyAgICAgICAgICAgICAgICBmcy5tSW5zdGFuY2UgPSBmOworICAgICAgICAgICAgICAgIGYubVNhdmVkVmlld1N0YXRlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmLm1CYWNrU3RhY2tOZXN0aW5nID0gMDsKKyAgICAgICAgICAgICAgICBmLm1JbkxheW91dCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGYubUFkZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKGZzLm1TYXZlZEZyYWdtZW50U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmLm1TYXZlZFZpZXdTdGF0ZSA9IGZzLm1TYXZlZEZyYWdtZW50U3RhdGUuZ2V0U3BhcnNlUGFyY2VsYWJsZUFycmF5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwuVklFV19TVEFURV9UQUcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQnVpbGQgdGhlIGZ1bGwgbGlzdCBvZiBhY3RpdmUgZnJhZ21lbnRzLCBpbnN0YW50aWF0aW5nIHRoZW0gZnJvbQorICAgICAgICAvLyB0aGVpciBzYXZlZCBzdGF0ZS4KKyAgICAgICAgbUFjdGl2ZSA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KGZtcy5tQWN0aXZlLmxlbmd0aCk7CisgICAgICAgIGlmIChtQXZhaWxJbmRpY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BdmFpbEluZGljZXMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpPTA7IGk8Zm1zLm1BY3RpdmUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZyYWdtZW50U3RhdGUgZnMgPSBmbXMubUFjdGl2ZVtpXTsKKyAgICAgICAgICAgIGlmIChmcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IGZzLmluc3RhbnRpYXRlKG1BY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJyZXN0b3JlQWxsU3RhdGU6IGFkZGluZyAjIiArIGkgKyAiOiAiICsgZik7CisgICAgICAgICAgICAgICAgbUFjdGl2ZS5hZGQoZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAicmVzdG9yZUFsbFN0YXRlOiBhZGRpbmcgIyIgKyBpICsgIjogKG51bGwpIik7CisgICAgICAgICAgICAgICAgbUFjdGl2ZS5hZGQobnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKG1BdmFpbEluZGljZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtQXZhaWxJbmRpY2VzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInJlc3RvcmVBbGxTdGF0ZTogYWRkaW5nIGF2YWlsICMiICsgaSk7CisgICAgICAgICAgICAgICAgbUF2YWlsSW5kaWNlcy5hZGQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgdGFyZ2V0IG9mIGFsbCByZXRhaW5lZCBmcmFnbWVudHMuCisgICAgICAgIGlmIChub25Db25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG5vbkNvbmZpZy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBub25Db25maWcuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmLm1UYXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVGFyZ2V0Lm1JbmRleCA8IG1BY3RpdmUuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1UYXJnZXQgPSBtQWN0aXZlLmdldChmLm1UYXJnZXQubUluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlJlLWF0dGFjaGluZyByZXRhaW5lZCBmcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGFyZ2V0IG5vIGxvbmdlciBleGlzdHM6ICIgKyBmLm1UYXJnZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tVGFyZ2V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEJ1aWxkIHRoZSBsaXN0IG9mIGN1cnJlbnRseSBhZGRlZCBmcmFnbWVudHMuCisgICAgICAgIGlmIChmbXMubUFkZGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BZGRlZCA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KGZtcy5tQWRkZWQubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxmbXMubUFkZGVkLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGZtcy5tQWRkZWRbaV0pOworICAgICAgICAgICAgICAgIGlmIChmID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gaW5zdGFudGlhdGVkIGZyYWdtZW50IGZvciBpbmRleCAjIiArIGZtcy5tQWRkZWRbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmLm1BZGRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgZi5tSW1tZWRpYXRlQWN0aXZpdHkgPSBtQWN0aXZpdHk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJyZXN0b3JlQWxsU3RhdGU6IG1ha2luZyBhZGRlZCAjIiArIGkgKyAiOiAiICsgZik7CisgICAgICAgICAgICAgICAgbUFkZGVkLmFkZChmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BZGRlZCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEJ1aWxkIHRoZSBiYWNrIHN0YWNrLgorICAgICAgICBpZiAoZm1zLm1CYWNrU3RhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbUJhY2tTdGFjayA9IG5ldyBBcnJheUxpc3Q8QmFja1N0YWNrUmVjb3JkPihmbXMubUJhY2tTdGFjay5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZtcy5tQmFja1N0YWNrLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgQmFja1N0YWNrUmVjb3JkIGJzZSA9IGZtcy5tQmFja1N0YWNrW2ldLmluc3RhbnRpYXRlKHRoaXMpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAicmVzdG9yZUFsbFN0YXRlOiBhZGRpbmcgYnNlICMiICsgaQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIChpbmRleCAiICsgYnNlLm1JbmRleCArICIpOiAiICsgYnNlKTsKKyAgICAgICAgICAgICAgICBtQmFja1N0YWNrLmFkZChic2UpOworICAgICAgICAgICAgICAgIGlmIChic2UubUluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0QmFja1N0YWNrSW5kZXgoYnNlLm1JbmRleCwgYnNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQmFja1N0YWNrID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhdHRhY2hBY3Rpdml0eShBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICBpZiAobUFjdGl2aXR5ICE9IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgbUFjdGl2aXR5ID0gYWN0aXZpdHk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQ3JlYXRlKCkgeworICAgICAgICBtU3RhdGVTYXZlZCA9IGZhbHNlOworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5DUkVBVEVELCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQWN0aXZpdHlDcmVhdGVkKCkgeworICAgICAgICBtU3RhdGVTYXZlZCA9IGZhbHNlOworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVELCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoU3RhcnQoKSB7CisgICAgICAgIG1TdGF0ZVNhdmVkID0gZmFsc2U7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LlNUQVJURUQsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hSZXN1bWUoKSB7CisgICAgICAgIG1TdGF0ZVNhdmVkID0gZmFsc2U7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LlJFU1VNRUQsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hQYXVzZSgpIHsKKyAgICAgICAgbW92ZVRvU3RhdGUoRnJhZ21lbnQuU1RBUlRFRCwgZmFsc2UpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaFN0b3AoKSB7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LkFDVElWSVRZX0NSRUFURUQsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hEZXN0cm95KCkgeworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5JTklUSUFMSVpJTkcsIGZhbHNlKTsKKyAgICAgICAgbUFjdGl2aXR5ID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hDcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUsIE1lbnVJbmZsYXRlciBpbmZsYXRlcikgeworICAgICAgICBib29sZWFuIHNob3cgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1BZGRlZC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgIWYubUhpZGRlbiAmJiBmLm1IYXNNZW51KSB7CisgICAgICAgICAgICAgICAgICAgIHNob3cgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBmLm9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSwgaW5mbGF0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2hvdzsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hQcmVwYXJlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgICAgICAgIGJvb2xlYW4gc2hvdyA9IGZhbHNlOworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFkZGVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiAhZi5tSGlkZGVuICYmIGYubUhhc01lbnUpIHsKKyAgICAgICAgICAgICAgICAgICAgc2hvdyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGYub25QcmVwYXJlT3B0aW9uc01lbnUobWVudSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzaG93OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaE9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFkZGVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiAhZi5tSGlkZGVuICYmIGYubUhhc01lbnUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYub25PcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoQ29udGV4dEl0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWRkZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmICFmLm1IaWRkZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYub25Db250ZXh0SXRlbVNlbGVjdGVkKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoT3B0aW9uc01lbnVDbG9zZWQoTWVudSBtZW51KSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWRkZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmICFmLm1IaWRkZW4gJiYgZi5tSGFzTWVudSkgeworICAgICAgICAgICAgICAgICAgICBmLm9uT3B0aW9uc01lbnVDbG9zZWQobWVudSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgaW50IHJldmVyc2VUcmFuc2l0KGludCB0cmFuc2l0KSB7CisgICAgICAgIGludCByZXYgPSAwOworICAgICAgICBzd2l0Y2ggKHRyYW5zaXQpIHsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX09QRU46CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX0NMT1NFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRlJBR01FTlRfQ0xPU0U6CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX09QRU47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9GUkFHTUVOVF9ORVhUOgorICAgICAgICAgICAgICAgIHJldiA9IEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9GUkFHTUVOVF9QUkVWOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRlJBR01FTlRfUFJFVjoKKyAgICAgICAgICAgICAgICByZXYgPSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRlJBR01FTlRfTkVYVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV2OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBpbnQgdHJhbnNpdFRvU3R5bGVJbmRleChpbnQgdHJhbnNpdCwgYm9vbGVhbiBlbnRlcikgeworICAgICAgICBpbnQgYW5pbUF0dHIgPSAtMTsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0KSB7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9GUkFHTUVOVF9PUEVOOgorICAgICAgICAgICAgICAgIGFuaW1BdHRyID0gZW50ZXIKKyAgICAgICAgICAgICAgICAgICAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudEFuaW1hdGlvbl9mcmFnbWVudE9wZW5FbnRlckFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50QW5pbWF0aW9uX2ZyYWdtZW50T3BlbkV4aXRBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9GUkFHTUVOVF9DTE9TRToKKyAgICAgICAgICAgICAgICBhbmltQXR0ciA9IGVudGVyCisgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnRBbmltYXRpb25fZnJhZ21lbnRDbG9zZUVudGVyQW5pbWF0aW9uCisgICAgICAgICAgICAgICAgICAgIDogY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnRBbmltYXRpb25fZnJhZ21lbnRDbG9zZUV4aXRBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9GUkFHTUVOVF9ORVhUOgorICAgICAgICAgICAgICAgIGFuaW1BdHRyID0gZW50ZXIKKyAgICAgICAgICAgICAgICAgICAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudEFuaW1hdGlvbl9mcmFnbWVudE5leHRFbnRlckFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50QW5pbWF0aW9uX2ZyYWdtZW50TmV4dEV4aXRBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9GUkFHTUVOVF9QUkVWOgorICAgICAgICAgICAgICAgIGFuaW1BdHRyID0gZW50ZXIKKyAgICAgICAgICAgICAgICAgICAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudEFuaW1hdGlvbl9mcmFnbWVudFByZXZFbnRlckFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50QW5pbWF0aW9uX2ZyYWdtZW50UHJldkV4aXRBbmltYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuaW1BdHRyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudFRyYW5zYWN0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRUcmFuc2FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMDQ3NmJiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50VHJhbnNhY3Rpb24uamF2YQpAQCAtMCwwICsxLDE4NiBAQAorcGFja2FnZSBhbmRyb2lkLmFwcDsKKworLyoqCisgKiBBUEkgZm9yIHBlcmZvcm1pbmcgYSBzZXQgb2YgRnJhZ21lbnQgb3BlcmF0aW9ucy4KKyAqLworcHVibGljIGludGVyZmFjZSBGcmFnbWVudFRyYW5zYWN0aW9uIHsKKyAgICAvKioKKyAgICAgKiBDYWxscyB7QGxpbmsgI2FkZChpbnQsIEZyYWdtZW50LCBTdHJpbmcpfSB3aXRoIGEgMCBjb250YWluZXJWaWV3SWQuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkKEZyYWdtZW50IGZyYWdtZW50LCBTdHJpbmcgdGFnKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxscyB7QGxpbmsgI2FkZChpbnQsIEZyYWdtZW50LCBTdHJpbmcpfSB3aXRoIGEgbnVsbCB0YWcuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGQgYSBmcmFnbWVudCB0byB0aGUgYWN0aXZpdHkgc3RhdGUuICBUaGlzIGZyYWdtZW50IG1heSBvcHRpb25hbGx5CisgICAgICogYWxzbyBoYXZlIGl0cyB2aWV3IChpZiB7QGxpbmsgRnJhZ21lbnQjb25DcmVhdGVWaWV3IEZyYWdtZW50Lm9uQ3JlYXRlVmlld30KKyAgICAgKiByZXR1cm5zIG5vbi1udWxsKSBpbnRvIGEgY29udGFpbmVyIHZpZXcgb2YgdGhlIGFjdGl2aXR5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250YWluZXJWaWV3SWQgT3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgY29udGFpbmVyIHRoaXMgZnJhZ21lbnQgaXMKKyAgICAgKiB0byBiZSBwbGFjZWQgaW4uICBJZiAwLCBpdCB3aWxsIG5vdCBiZSBwbGFjZWQgaW4gYSBjb250YWluZXIuCisgICAgICogQHBhcmFtIGZyYWdtZW50IFRoZSBmcmFnbWVudCB0byBiZSBhZGRlZC4gIFRoaXMgZnJhZ21lbnQgbXVzdCBub3QgYWxyZWFkeQorICAgICAqIGJlIGFkZGVkIHRvIHRoZSBhY3Rpdml0eS4KKyAgICAgKiBAcGFyYW0gdGFnIE9wdGlvbmFsIHRhZyBuYW1lIGZvciB0aGUgZnJhZ21lbnQsIHRvIGxhdGVyIHJldHJpZXZlIHRoZQorICAgICAqIGZyYWdtZW50IHdpdGgge0BsaW5rIEFjdGl2aXR5I2ZpbmRGcmFnbWVudEJ5VGFnKFN0cmluZykKKyAgICAgKiBBY3Rpdml0eS5maW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcpfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbWUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGQoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcpOworICAgIAorICAgIC8qKgorICAgICAqIENhbGxzIHtAbGluayAjcmVwbGFjZShpbnQsIEZyYWdtZW50LCBTdHJpbmcpfSB3aXRoIGEgbnVsbCB0YWcuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVwbGFjZShpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCk7CisgICAgCisgICAgLyoqCisgICAgICogUmVwbGFjZSBhbiBleGlzdGluZyBmcmFnbWVudCB0aGF0IHdhcyBhZGRlZCB0byBhIGNvbnRhaW5lci4gIFRoaXMgaXMKKyAgICAgKiBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyBjYWxsaW5nIHtAbGluayAjcmVtb3ZlKEZyYWdtZW50KX0gZm9yIGFsbAorICAgICAqIGN1cnJlbnRseSBhZGRlZCBmcmFnbWVudHMgdGhhdCB3ZXJlIGFkZGVkIHdpdGggdGhlIHNhbWUgY29udGFpbmVyVmlld0lkCisgICAgICogYW5kIHRoZW4ge0BsaW5rICNhZGQoaW50LCBGcmFnbWVudCwgU3RyaW5nKX0gd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMKKyAgICAgKiBnaXZlbiBoZXJlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250YWluZXJWaWV3SWQgSWRlbnRpZmllciBvZiB0aGUgY29udGFpbmVyIHdob3NlIGZyYWdtZW50KHMpIGFyZQorICAgICAqIHRvIGJlIHJlcGxhY2VkLgorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgbmV3IGZyYWdtZW50IHRvIHBsYWNlIGluIHRoZSBjb250YWluZXIuCisgICAgICogQHBhcmFtIHRhZyBPcHRpb25hbCB0YWcgbmFtZSBmb3IgdGhlIGZyYWdtZW50LCB0byBsYXRlciByZXRyaWV2ZSB0aGUKKyAgICAgKiBmcmFnbWVudCB3aXRoIHtAbGluayBBY3Rpdml0eSNmaW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcpCisgICAgICogQWN0aXZpdHkuZmluZEZyYWdtZW50QnlUYWcoU3RyaW5nKX0uCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1lIEZyYWdtZW50VHJhbnNhY3Rpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVwbGFjZShpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHRhZyk7CisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFuIGV4aXN0aW5nIGZyYWdtZW50LiAgSWYgaXQgd2FzIGFkZGVkIHRvIGEgY29udGFpbmVyLCBpdHMgdmlldworICAgICAqIGlzIGFsc28gcmVtb3ZlZCBmcm9tIHRoYXQgY29udGFpbmVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgdG8gYmUgcmVtb3ZlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbWUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiByZW1vdmUoRnJhZ21lbnQgZnJhZ21lbnQpOworICAgIAorICAgIC8qKgorICAgICAqIEhpZGVzIGFuIGV4aXN0aW5nIGZyYWdtZW50LiAgVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciBmcmFnbWVudHMgd2hvc2UKKyAgICAgKiB2aWV3cyBoYXZlIGJlZW4gYWRkZWQgdG8gYSBjb250YWluZXIsIGFzIHRoaXMgd2lsbCBjYXVzZSB0aGUgdmlldyB0bworICAgICAqIGJlIGhpZGRlbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIGZyYWdtZW50IHRvIGJlIGhpZGRlbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbWUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBoaWRlKEZyYWdtZW50IGZyYWdtZW50KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBIaWRlcyBhIHByZXZpb3VzbHkgaGlkZGVuIGZyYWdtZW50LiAgVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciBmcmFnbWVudHMgd2hvc2UKKyAgICAgKiB2aWV3cyBoYXZlIGJlZW4gYWRkZWQgdG8gYSBjb250YWluZXIsIGFzIHRoaXMgd2lsbCBjYXVzZSB0aGUgdmlldyB0bworICAgICAqIGJlIHNob3duLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgdG8gYmUgc2hvd24uCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1lIEZyYWdtZW50VHJhbnNhY3Rpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2hvdyhGcmFnbWVudCBmcmFnbWVudCk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgdHJhbnNhY3Rpb24gY29udGFpbnMgbm8gb3BlcmF0aW9ucywKKyAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBCaXQgbWFzayB0aGF0IGlzIHNldCBmb3IgYWxsIGVudGVyIHRyYW5zaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9FTlRFUl9NQVNLID0gMHgxMDAwOworICAgIAorICAgIC8qKgorICAgICAqIEJpdCBtYXNrIHRoYXQgaXMgc2V0IGZvciBhbGwgZXhpdCB0cmFuc2l0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfRVhJVF9NQVNLID0gMHgyMDAwOworICAgIAorICAgIC8qKiBOb3Qgc2V0IHVwIGZvciBhIHRyYW5zaXRpb24uICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX1VOU0VUID0gLTE7CisgICAgLyoqIE5vIGFuaW1hdGlvbiBmb3IgdHJhbnNpdGlvbi4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfTk9ORSA9IDA7CisgICAgLyoqIEZyYWdtZW50IGlzIGJlaW5nIGFkZGVkIG9udG8gdGhlIHN0YWNrICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX0ZSQUdNRU5UX09QRU4gPSAxIHwgVFJBTlNJVF9FTlRFUl9NQVNLOworICAgIC8qKiBGcmFnbWVudCBpcyBiZWluZyByZW1vdmVkIGZyb20gdGhlIHN0YWNrICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX0ZSQUdNRU5UX0NMT1NFID0gMiB8IFRSQU5TSVRfRVhJVF9NQVNLOworICAgIC8qKiBGcmFnbWVudCBpcyBiZWluZyBhZGRlZCBpbiBhICduZXh0JyBvcGVyYXRpb24qLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9GUkFHTUVOVF9ORVhUID0gMyB8IFRSQU5TSVRfRU5URVJfTUFTSzsKKyAgICAvKiogRnJhZ21lbnQgaXMgYmVpbmcgcmVtb3ZlZCBpbiBhICdwcmV2aW91cycgb3BlcmF0aW9uICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX0ZSQUdNRU5UX1BSRVYgPSA0IHwgVFJBTlNJVF9FWElUX01BU0s7CisKKyAgICAvKioKKyAgICAgKiBTZXQgc3BlY2lmaWMgYW5pbWF0aW9uIHJlc291cmNlcyB0byBydW4gZm9yIHRoZSBmcmFnbWVudHMgdGhhdCBhcmUKKyAgICAgKiBlbnRlcmluZyBhbmQgZXhpdGluZyBpbiB0aGlzIHRyYW5zYWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldEN1c3RvbUFuaW1hdGlvbnMoaW50IGVudGVyLCBpbnQgZXhpdCk7CisgICAgCisgICAgLyoqCisgICAgICogU2VsZWN0IGEgc3RhbmRhcmQgdHJhbnNpdGlvbiBhbmltYXRpb24gZm9yIHRoaXMgdHJhbnNhY3Rpb24uICBNYXkgYmUKKyAgICAgKiBvbmUgb2Yge0BsaW5rICNUUkFOU0lUX05PTkV9LCB7QGxpbmsgI1RSQU5TSVRfRlJBR01FTlRfT1BFTn0sCisgICAgICogb3Ige0BsaW5rICNUUkFOU0lUX0ZSQUdNRU5UX0NMT1NFfQorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldFRyYW5zaXRpb24oaW50IHRyYW5zaXQpOworCisgICAgLyoqCisgICAgICogU2V0IGEgY3VzdG9tIHN0eWxlIHJlc291cmNlIHRoYXQgd2lsbCBiZSB1c2VkIGZvciByZXNvbHZpbmcgdHJhbnNpdAorICAgICAqIGFuaW1hdGlvbnMuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0VHJhbnNpdGlvblN0eWxlKGludCBzdHlsZVJlcyk7CisgICAgCisgICAgLyoqCisgICAgICogQWRkIHRoaXMgdHJhbnNhY3Rpb24gdG8gdGhlIGJhY2sgc3RhY2suICBUaGlzIG1lYW5zIHRoYXQgdGhlIHRyYW5zYWN0aW9uCisgICAgICogd2lsbCBiZSByZW1lbWJlcmVkIGFmdGVyIGl0IGlzIGNvbW1pdHRlZCwgYW5kIHdpbGwgcmV2ZXJzZSBpdHMgb3BlcmF0aW9uCisgICAgICogd2hlbiBsYXRlciBwb3BwZWQgb2ZmIHRoZSBzdGFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIEFuIG9wdGlvbmFsIG5hbWUgZm9yIHRoaXMgYmFjayBzdGFjayBzdGF0ZSwgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGRUb0JhY2tTdGFjayhTdHJpbmcgbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZ1bGwgdGl0bGUgdG8gc2hvdyBhcyBhIGJyZWFkIGNydW1iIHdoZW4gdGhpcyB0cmFuc2FjdGlvbgorICAgICAqIGlzIG9uIHRoZSBiYWNrIHN0YWNrLCBhcyB1c2VkIGJ5IHtAbGluayBGcmFnbWVudEJyZWFkQ3J1bWJzfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXMgQSBzdHJpbmcgcmVzb3VyY2UgY29udGFpbmluZyB0aGUgdGl0bGUuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0QnJlYWRDcnVtYlRpdGxlKGludCByZXMpOworCisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI3NldEJyZWFkQ3J1bWJUaXRsZShpbnQpfSBidXQgdGFraW5nIGEgcmF3IHN0cmluZzsgdGhpcworICAgICAqIG1ldGhvZCBpcyA8ZW0+bm90PC9lbT4gcmVjb21tZW5kZWQsIGFzIHRoZSBzdHJpbmcgY2FuIG5vdCBiZSBjaGFuZ2VkCisgICAgICogbGF0ZXIgaWYgdGhlIGxvY2FsZSBjaGFuZ2VzLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldEJyZWFkQ3J1bWJUaXRsZShDaGFyU2VxdWVuY2UgdGV4dCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNob3J0IHRpdGxlIHRvIHNob3cgYXMgYSBicmVhZCBjcnVtYiB3aGVuIHRoaXMgdHJhbnNhY3Rpb24KKyAgICAgKiBpcyBvbiB0aGUgYmFjayBzdGFjaywgYXMgdXNlZCBieSB7QGxpbmsgRnJhZ21lbnRCcmVhZENydW1ic30uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzIEEgc3RyaW5nIHJlc291cmNlIGNvbnRhaW5pbmcgdGhlIHRpdGxlLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldEJyZWFkQ3J1bWJTaG9ydFRpdGxlKGludCByZXMpOworCisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI3NldEJyZWFkQ3J1bWJTaG9ydFRpdGxlKGludCl9IGJ1dCB0YWtpbmcgYSByYXcgc3RyaW5nOyB0aGlzCisgICAgICogbWV0aG9kIGlzIDxlbT5ub3Q8L2VtPiByZWNvbW1lbmRlZCwgYXMgdGhlIHN0cmluZyBjYW4gbm90IGJlIGNoYW5nZWQKKyAgICAgKiBsYXRlciBpZiB0aGUgbG9jYWxlIGNoYW5nZXMuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0QnJlYWRDcnVtYlNob3J0VGl0bGUoQ2hhclNlcXVlbmNlIHRleHQpOworCisgICAgLyoqCisgICAgICogU2NoZWR1bGVzIGEgY29tbWl0IG9mIHRoaXMgdHJhbnNhY3Rpb24uICBOb3RlIHRoYXQgdGhlIGNvbW1pdCBkb2VzCisgICAgICogbm90IGhhcHBlbiBpbW1lZGlhdGVseTsgaXQgd2lsbCBiZSBzY2hlZHVsZWQgYXMgd29yayBvbiB0aGUgbWFpbiB0aHJlYWQKKyAgICAgKiB0byBiZSBkb25lIHRoZSBuZXh0IHRpbWUgdGhhdCB0aHJlYWQgaXMgcmVhZHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgdGhpcyB0cmFuc2FjdGlvbidzIGJhY2sgc3RhY2sgZW50cnksCisgICAgICogaWYge0BsaW5rICNhZGRUb0JhY2tTdGFjayhTdHJpbmcpfSBoYWQgYmVlbiBjYWxsZWQuICBPdGhlcndpc2UsIHJldHVybnMKKyAgICAgKiBhIG5lZ2F0aXZlIG51bWJlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvbW1pdCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBY3Rpdml0eU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQWN0aXZpdHlNYW5hZ2VyLmphdmEKaW5kZXggMjhhZjBkMy4uY2QyMjllMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBY3Rpdml0eU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFjdGl2aXR5TWFuYWdlci5qYXZhCkBAIC0zMTEsNiArMzExLDEwIEBACiAgICAgCiAgICAgcHVibGljIHZvaWQgZmluaXNoSGVhdnlXZWlnaHRBcHAoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogCisgICAgcHVibGljIHZvaWQgc2V0SW1tZXJzaXZlKElCaW5kZXIgdG9rZW4sIGJvb2xlYW4gaW1tZXJzaXZlKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworICAgIHB1YmxpYyBib29sZWFuIGlzSW1tZXJzaXZlKElCaW5kZXIgdG9rZW4pIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisgICAgcHVibGljIGJvb2xlYW4gaXNUb3BBY3Rpdml0eUltbWVyc2l2ZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisgICAgCiAgICAgcHVibGljIHZvaWQgY3Jhc2hBcHBsaWNhdGlvbihpbnQgdWlkLCBpbnQgaW5pdGlhbFBpZCwgU3RyaW5nIHBhY2thZ2VOYW1lLAogICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAKQEAgLTMyMiw2ICszMjYsMTMgQEAKICAgICBwdWJsaWMgdm9pZCByZXZva2VVcmlQZXJtaXNzaW9uRnJvbU93bmVyKElCaW5kZXIgb3duZXIsIFVyaSB1cmksCiAgICAgICAgICAgICBpbnQgbW9kZSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKIAorICAgIHB1YmxpYyBpbnQgY2hlY2tHcmFudFVyaVBlcm1pc3Npb24oaW50IGNhbGxpbmdVaWQsIFN0cmluZyB0YXJnZXRQa2csCisgICAgICAgICAgICBVcmkgdXJpLCBpbnQgbW9kZUZsYWdzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCisgICAgLy8gQ2F1c2UgdGhlIHNwZWNpZmllZCBwcm9jZXNzIHRvIGR1bXAgdGhlIHNwZWNpZmllZCBoZWFwLgorICAgIHB1YmxpYyBib29sZWFuIGR1bXBIZWFwKFN0cmluZyBwcm9jZXNzLCBib29sZWFuIG1hbmFnZWQsIFN0cmluZyBwYXRoLAorICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKwogICAgIC8qCiAgICAgICogUHJpdmF0ZSBub24tQmluZGVyIGludGVyZmFjZXMKICAgICAgKi8KQEAgLTUzMiw0ICs1NDMsNiBAQAogICAgIGludCBORVdfVVJJX1BFUk1JU1NJT05fT1dORVJfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTE1OwogICAgIGludCBHUkFOVF9VUklfUEVSTUlTU0lPTl9GUk9NX09XTkVSX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzExNjsKICAgICBpbnQgUkVWT0tFX1VSSV9QRVJNSVNTSU9OX0ZST01fT1dORVJfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTE3OworICAgIGludCBDSEVDS19HUkFOVF9VUklfUEVSTUlTU0lPTl9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTisxMTg7CisgICAgaW50IERVTVBfSEVBUF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTisxMTk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFwcGxpY2F0aW9uVGhyZWFkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFwcGxpY2F0aW9uVGhyZWFkLmphdmEKaW5kZXggYzhlZjE3Zi4uMWY4YTdjNTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQXBwbGljYXRpb25UaHJlYWQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFwcGxpY2F0aW9uVGhyZWFkLmphdmEKQEAgLTk3LDEzICs5NywxNyBAQAogICAgIHZvaWQgc2NoZWR1bGVBY3Rpdml0eUNvbmZpZ3VyYXRpb25DaGFuZ2VkKElCaW5kZXIgdG9rZW4pIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAgICAgdm9pZCBwcm9maWxlckNvbnRyb2woYm9vbGVhbiBzdGFydCwgU3RyaW5nIHBhdGgsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKyAgICB2b2lkIGR1bXBIZWFwKGJvb2xlYW4gbWFuYWdlZCwgU3RyaW5nIHBhdGgsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKICAgICB2b2lkIHNldFNjaGVkdWxpbmdHcm91cChpbnQgZ3JvdXApIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAgICAgdm9pZCBnZXRNZW1vcnlJbmZvKERlYnVnLk1lbW9yeUluZm8gb3V0SW5mbykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKICAgICBzdGF0aWMgZmluYWwgaW50IFBBQ0tBR0VfUkVNT1ZFRCA9IDA7CiAgICAgc3RhdGljIGZpbmFsIGludCBFWFRFUk5BTF9TVE9SQUdFX1VOQVZBSUxBQkxFID0gMTsKICAgICB2b2lkIGRpc3BhdGNoUGFja2FnZUJyb2FkY2FzdChpbnQgY21kLCBTdHJpbmdbXSBwYWNrYWdlcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKICAgICB2b2lkIHNjaGVkdWxlQ3Jhc2goU3RyaW5nIG1zZykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKLSAgICAKKyAgICB2b2lkIGR1bXBBY3Rpdml0eShGaWxlRGVzY3JpcHRvciBmZCwgSUJpbmRlciBzZXJ2aWNldG9rZW4sIFN0cmluZ1tdIGFyZ3MpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworCiAgICAgU3RyaW5nIGRlc2NyaXB0b3IgPSAiYW5kcm9pZC5hcHAuSUFwcGxpY2F0aW9uVGhyZWFkIjsKIAogICAgIGludCBTQ0hFRFVMRV9QQVVTRV9BQ1RJVklUWV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTjsKQEAgLTE0MCw0ICsxNDQsNiBAQAogICAgIGludCBTQ0hFRFVMRV9TVUlDSURFX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzMyOwogICAgIGludCBESVNQQVRDSF9QQUNLQUdFX0JST0FEQ0FTVF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiszMzsKICAgICBpbnQgU0NIRURVTEVfQ1JBU0hfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMzQ7CisgICAgaW50IERVTVBfSEVBUF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiszNTsKKyAgICBpbnQgRFVNUF9BQ1RJVklUWV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiszNjsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24uamF2YQppbmRleCBiOGMzYWEzLi40ZDVmMzZhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSW5zdHJ1bWVudGF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbi5qYXZhCkBAIC05OTcsOCArOTk3LDEwIEBACiAgICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKICAgICAgICAgQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpY2xhenoubmV3SW5zdGFuY2UoKTsKICAgICAgICAgQWN0aXZpdHlUaHJlYWQgYVRocmVhZCA9IG51bGw7Ci0gICAgICAgIGFjdGl2aXR5LmF0dGFjaChjb250ZXh0LCBhVGhyZWFkLCB0aGlzLCB0b2tlbiwgYXBwbGljYXRpb24sIGludGVudCwgaW5mbywgdGl0bGUsCi0gICAgICAgICAgICAgICAgcGFyZW50LCBpZCwgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwgbmV3IENvbmZpZ3VyYXRpb24oKSk7CisgICAgICAgIGFjdGl2aXR5LmF0dGFjaChjb250ZXh0LCBhVGhyZWFkLCB0aGlzLCB0b2tlbiwgYXBwbGljYXRpb24sIGludGVudCwKKyAgICAgICAgICAgICAgICBpbmZvLCB0aXRsZSwgcGFyZW50LCBpZCwKKyAgICAgICAgICAgICAgICAoQWN0aXZpdHkuTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcylsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlLAorICAgICAgICAgICAgICAgIG5ldyBDb25maWd1cmF0aW9uKCkpOwogICAgICAgICByZXR1cm4gYWN0aXZpdHk7CiAgICAgfQogCkBAIC0xMDU4LDIxICsxMDYwLDIzIEBACiAgICAgfQogICAgIAogICAgIHB1YmxpYyB2b2lkIGNhbGxBY3Rpdml0eU9uRGVzdHJveShBY3Rpdml0eSBhY3Rpdml0eSkgewotICAgICAgaWYgKG1XYWl0aW5nQWN0aXZpdGllcyAhPSBudWxsKSB7Ci0gICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewotICAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1XYWl0aW5nQWN0aXZpdGllcy5zaXplKCk7Ci0gICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5V2FpdGVyIGF3ID0gbVdhaXRpbmdBY3Rpdml0aWVzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBhdy5pbnRlbnQ7Ci0gICAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmZpbHRlckVxdWFscyhhY3Rpdml0eS5nZXRJbnRlbnQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICBhdy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotICAgICAgICAgICAgICAgICAgICAgIG1NZXNzYWdlUXVldWUuYWRkSWRsZUhhbmRsZXIobmV3IEFjdGl2aXR5R29pbmcoYXcpKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgIH0KKyAgICAgIC8vIFRPRE86IHRoZSBmb2xsb3dpbmcgYmxvY2sgY2F1c2VzIGludGVybWl0dGVudCBoYW5ncyB3aGVuIHVzaW5nIHN0YXJ0QWN0aXZpdHkKKyAgICAgIC8vIHRlbXBvcmFyaWx5IGNvbW1lbnQgb3V0IHVudGlsIHJvb3QgY2F1c2UgaXMgZml4ZWQgKGJ1ZyAyNjMwNjgzKQorLy8gICAgICBpZiAobVdhaXRpbmdBY3Rpdml0aWVzICE9IG51bGwpIHsKKy8vICAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmMpIHsKKy8vICAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1XYWl0aW5nQWN0aXZpdGllcy5zaXplKCk7CisvLyAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworLy8gICAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eVdhaXRlciBhdyA9IG1XYWl0aW5nQWN0aXZpdGllcy5nZXQoaSk7CisvLyAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBhdy5pbnRlbnQ7CisvLyAgICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuZmlsdGVyRXF1YWxzKGFjdGl2aXR5LmdldEludGVudCgpKSkgeworLy8gICAgICAgICAgICAgICAgICAgICAgYXcuYWN0aXZpdHkgPSBhY3Rpdml0eTsKKy8vICAgICAgICAgICAgICAgICAgICAgIG1NZXNzYWdlUXVldWUuYWRkSWRsZUhhbmRsZXIobmV3IEFjdGl2aXR5R29pbmcoYXcpKTsKKy8vICAgICAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgICAgIH0KKy8vICAgICAgICAgIH0KKy8vICAgICAgfQogICAgICAgCi0gICAgICBhY3Rpdml0eS5vbkRlc3Ryb3koKTsKKyAgICAgIGFjdGl2aXR5LnBlcmZvcm1EZXN0cm95KCk7CiAgICAgICAKICAgICAgIGlmIChtQWN0aXZpdHlNb25pdG9ycyAhPSBudWxsKSB7CiAgICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewpAQCAtMTMzMSw3ICsxMzM1LDcgQEAKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpcyBiZWluZyBzdGFydGVkLgogICAgICAqIEBwYXJhbSB0b2tlbiBJbnRlcm5hbCB0b2tlbiBpZGVudGlmeWluZyB0byB0aGUgc3lzdGVtIHdobyBpcyBzdGFydGluZyAKICAgICAgKiAgICAgICAgICAgICAgdGhlIGFjdGl2aXR5OyBtYXkgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gdGFyZ2V0IFdoaWNoIGFjdGl2aXR5IGlzIHBlcmZvcm0gdGhlIHN0YXJ0IChhbmQgdGh1cyByZWNlaXZpbmcgCisgICAgICogQHBhcmFtIHRhcmdldCBXaGljaCBhY3Rpdml0eSBpcyBwZXJmb3JtaW5nIHRoZSBzdGFydCAoYW5kIHRodXMgcmVjZWl2aW5nIAogICAgICAqICAgICAgICAgICAgICAgYW55IHJlc3VsdCk7IG1heSBiZSBudWxsIGlmIHRoaXMgY2FsbCBpcyBub3QgYmVpbmcgbWFkZQogICAgICAqICAgICAgICAgICAgICAgZnJvbSBhbiBhY3Rpdml0eS4KICAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBhY3R1YWwgSW50ZW50IHRvIHN0YXJ0LgpAQCAtMTM4MSw2ICsxMzg1LDY0IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIExpa2Uge0BsaW5rICNleGVjU3RhcnRBY3Rpdml0eShDb250ZXh0LCBJQmluZGVyLCBJQmluZGVyLCBBY3Rpdml0eSwgSW50ZW50LCBpbnQpfSwKKyAgICAgKiBidXQgZm9yIGNhbGxzIGZyb20gYSB7I2xpbmsgRnJhZ21lbnR9LgorICAgICAqIAorICAgICAqIEBwYXJhbSB3aG8gVGhlIENvbnRleHQgZnJvbSB3aGljaCB0aGUgYWN0aXZpdHkgaXMgYmVpbmcgc3RhcnRlZC4KKyAgICAgKiBAcGFyYW0gY29udGV4dFRocmVhZCBUaGUgbWFpbiB0aHJlYWQgb2YgdGhlIENvbnRleHQgZnJvbSB3aGljaCB0aGUgYWN0aXZpdHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpcyBiZWluZyBzdGFydGVkLgorICAgICAqIEBwYXJhbSB0b2tlbiBJbnRlcm5hbCB0b2tlbiBpZGVudGlmeWluZyB0byB0aGUgc3lzdGVtIHdobyBpcyBzdGFydGluZyAKKyAgICAgKiAgICAgICAgICAgICAgdGhlIGFjdGl2aXR5OyBtYXkgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFdoaWNoIGZyYWdtZW50IGlzIHBlcmZvcm1pbmcgdGhlIHN0YXJ0IChhbmQgdGh1cyByZWNlaXZpbmcgCisgICAgICogICAgICAgICAgICAgICBhbnkgcmVzdWx0KS4KKyAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBhY3R1YWwgSW50ZW50IHRvIHN0YXJ0LgorICAgICAqIEBwYXJhbSByZXF1ZXN0Q29kZSBJZGVudGlmaWVyIGZvciB0aGlzIHJlcXVlc3QncyByZXN1bHQ7IGxlc3MgdGhhbiB6ZXJvIAorICAgICAqICAgICAgICAgICAgICAgICAgICBpZiB0aGUgY2FsbGVyIGlzIG5vdCBleHBlY3RpbmcgYSByZXN1bHQuCisgICAgICogCisgICAgICogQHJldHVybiBUbyBmb3JjZSB0aGUgcmV0dXJuIG9mIGEgcGFydGljdWxhciByZXN1bHQsIHJldHVybiBhbiAKKyAgICAgKiAgICAgICAgIEFjdGl2aXR5UmVzdWx0IG9iamVjdCBjb250YWluaW5nIHRoZSBkZXNpcmVkIGRhdGE7IG90aGVyd2lzZQorICAgICAqICAgICAgICAgcmV0dXJuIG51bGwuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgcmV0dXJucyBudWxsLgorICAgICAqICAKKyAgICAgKiBAdGhyb3dzIGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uCisgICAgICogCisgICAgICogQHNlZSBBY3Rpdml0eSNzdGFydEFjdGl2aXR5KEludGVudCkKKyAgICAgKiBAc2VlIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoSW50ZW50LCBpbnQpCisgICAgICogQHNlZSBBY3Rpdml0eSNzdGFydEFjdGl2aXR5RnJvbUNoaWxkCisgICAgICogCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBBY3Rpdml0eVJlc3VsdCBleGVjU3RhcnRBY3Rpdml0eSgKKyAgICAgICAgQ29udGV4dCB3aG8sIElCaW5kZXIgY29udGV4dFRocmVhZCwgSUJpbmRlciB0b2tlbiwgRnJhZ21lbnQgdGFyZ2V0LAorICAgICAgICBJbnRlbnQgaW50ZW50LCBpbnQgcmVxdWVzdENvZGUpIHsKKyAgICAgICAgSUFwcGxpY2F0aW9uVGhyZWFkIHdob1RocmVhZCA9IChJQXBwbGljYXRpb25UaHJlYWQpIGNvbnRleHRUaHJlYWQ7CisgICAgICAgIGlmIChtQWN0aXZpdHlNb25pdG9ycyAhPSBudWxsKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWN0aXZpdHlNb25pdG9ycy5zaXplKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eU1vbml0b3IgYW0gPSBtQWN0aXZpdHlNb25pdG9ycy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbS5tYXRjaCh3aG8sIG51bGwsIGludGVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFtLm1IaXRzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW0uaXNCbG9ja2luZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RDb2RlID49IDAgPyBhbS5nZXRSZXN1bHQoKSA6IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IHJlc3VsdCA9IEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkKKyAgICAgICAgICAgICAgICAuc3RhcnRBY3Rpdml0eSh3aG9UaHJlYWQsIGludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5yZXNvbHZlVHlwZUlmTmVlZGVkKHdoby5nZXRDb250ZW50UmVzb2x2ZXIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAwLCB0b2tlbiwgdGFyZ2V0ICE9IG51bGwgPyB0YXJnZXQubVdobyA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29kZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIGNoZWNrU3RhcnRBY3Rpdml0eVJlc3VsdChyZXN1bHQsIGludGVudCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCiAgICAgLypwYWNrYWdlKi8gZmluYWwgdm9pZCBpbml0KEFjdGl2aXR5VGhyZWFkIHRocmVhZCwKICAgICAgICAgICAgIENvbnRleHQgaW5zdHJDb250ZXh0LCBDb250ZXh0IGFwcENvbnRleHQsIENvbXBvbmVudE5hbWUgY29tcG9uZW50LCAKICAgICAgICAgICAgIElJbnN0cnVtZW50YXRpb25XYXRjaGVyIHdhdGNoZXIpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9MaXN0QWN0aXZpdHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9MaXN0QWN0aXZpdHkuamF2YQppbmRleCA0YmY1NTE4Li5kNDk5NjhmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTGlzdEFjdGl2aXR5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xpc3RBY3Rpdml0eS5qYXZhCkBAIC0zMDksNyArMzA5LDcgQEAKICAgICAgICAgaWYgKG1MaXN0ICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBzZXRDb250ZW50Vmlldyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5saXN0X2NvbnRlbnQpOworICAgICAgICBzZXRDb250ZW50Vmlldyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5saXN0X2NvbnRlbnRfc2ltcGxlKTsKIAogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xpc3RGcmFnbWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xpc3RGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMmY0YjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTGlzdEZyYWdtZW50LmphdmEKQEAgLTAsMCArMSw0MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKKy8qKgorICogQSBmcmFnbWVudCB0aGF0IGRpc3BsYXlzIGEgbGlzdCBvZiBpdGVtcyBieSBiaW5kaW5nIHRvIGEgZGF0YSBzb3VyY2Ugc3VjaCBhcworICogYW4gYXJyYXkgb3IgQ3Vyc29yLCBhbmQgZXhwb3NlcyBldmVudCBoYW5kbGVycyB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gaXRlbS4KKyAqIDxwPgorICogTGlzdEZyYWdtZW50IGhvc3RzIGEge0BsaW5rIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3IExpc3RWaWV3fSBvYmplY3QgdGhhdCBjYW4KKyAqIGJlIGJvdW5kIHRvIGRpZmZlcmVudCBkYXRhIHNvdXJjZXMsIHR5cGljYWxseSBlaXRoZXIgYW4gYXJyYXkgb3IgYSBDdXJzb3IKKyAqIGhvbGRpbmcgcXVlcnkgcmVzdWx0cy4gQmluZGluZywgc2NyZWVuIGxheW91dCwgYW5kIHJvdyBsYXlvdXQgYXJlIGRpc2N1c3NlZAorICogaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucy4KKyAqIDxwPgorICogPHN0cm9uZz5TY3JlZW4gTGF5b3V0PC9zdHJvbmc+CisgKiA8L3A+CisgKiA8cD4KKyAqIExpc3RGcmFnbWVudCBoYXMgYSBkZWZhdWx0IGxheW91dCB0aGF0IGNvbnNpc3RzIG9mIGEgc2luZ2xlIGxpc3Qgdmlldy4KKyAqIEhvd2V2ZXIsIGlmIHlvdSBkZXNpcmUsIHlvdSBjYW4gY3VzdG9taXplIHRoZSBmcmFnbWVudCBsYXlvdXQgYnkgcmV0dXJuaW5nCisgKiB5b3VyIG93biB2aWV3IGhpZXJhcmNoeSBmcm9tIHtAbGluayAjb25DcmVhdGVWaWV3fS4KKyAqIFRvIGRvIHRoaXMsIHlvdXIgdmlldyBoaWVyYXJjaHkgPGVtPm11c3Q8L2VtPiBjb250YWluIGEgTGlzdFZpZXcgb2JqZWN0IHdpdGggdGhlCisgKiBpZCAiQGFuZHJvaWQ6aWQvbGlzdCIgKG9yIHtAbGluayBhbmRyb2lkLlIuaWQjbGlzdH0gaWYgaXQncyBpbiBjb2RlKQorICogPHA+CisgKiBPcHRpb25hbGx5LCB5b3VyIHZpZXcgaGllcmFyY2h5IGNhbiBjb250YWluIGFub3RoZXIgdmlldyBvYmplY3Qgb2YgYW55IHR5cGUgdG8KKyAqIGRpc3BsYXkgd2hlbiB0aGUgbGlzdCB2aWV3IGlzIGVtcHR5LiBUaGlzICJlbXB0eSBsaXN0IiBub3RpZmllciBtdXN0IGhhdmUgYW4KKyAqIGlkICJhbmRyb2lkOmVtcHR5Ii4gTm90ZSB0aGF0IHdoZW4gYW4gZW1wdHkgdmlldyBpcyBwcmVzZW50LCB0aGUgbGlzdCB2aWV3CisgKiB3aWxsIGJlIGhpZGRlbiB3aGVuIHRoZXJlIGlzIG5vIGRhdGEgdG8gZGlzcGxheS4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBjb2RlIGRlbW9uc3RyYXRlcyBhbiAodWdseSkgY3VzdG9tIGxpc3QgbGF5b3V0LiBJdCBoYXMgYSBsaXN0CisgKiB3aXRoIGEgZ3JlZW4gYmFja2dyb3VuZCwgYW5kIGFuIGFsdGVybmF0ZSByZWQgIm5vIGRhdGEiIG1lc3NhZ2UuCisgKiA8L3A+CisgKgorICogPHByZT4KKyAqICZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O3V0Zi04JnF1b3Q7PyZndDsKKyAqICZsdDtMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICogICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSZxdW90O3ZlcnRpY2FsJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9JnF1b3Q7OGRwJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSZxdW90OzhkcCZxdW90OyZndDsKKyAqCisgKiAgICAgJmx0O0xpc3RWaWV3IGFuZHJvaWQ6aWQ9JnF1b3Q7QGlkL2FuZHJvaWQ6bGlzdCZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9JnF1b3Q7IzAwRkYwMCZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9JnF1b3Q7MSZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSZxdW90O2ZhbHNlJnF1b3Q7LyZndDsKKyAqCisgKiAgICAgJmx0O1RleHRWaWV3IGFuZHJvaWQ6aWQ9JnF1b3Q7QGlkL2FuZHJvaWQ6ZW1wdHkmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSZxdW90OyNGRjAwMDAmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSZxdW90O05vIGRhdGEmcXVvdDsvJmd0OworICogJmx0Oy9MaW5lYXJMYXlvdXQmZ3Q7CisgKiA8L3ByZT4KKyAqCisgKiA8cD4KKyAqIDxzdHJvbmc+Um93IExheW91dDwvc3Ryb25nPgorICogPC9wPgorICogPHA+CisgKiBZb3UgY2FuIHNwZWNpZnkgdGhlIGxheW91dCBvZiBpbmRpdmlkdWFsIHJvd3MgaW4gdGhlIGxpc3QuIFlvdSBkbyB0aGlzIGJ5CisgKiBzcGVjaWZ5aW5nIGEgbGF5b3V0IHJlc291cmNlIGluIHRoZSBMaXN0QWRhcHRlciBvYmplY3QgaG9zdGVkIGJ5IHRoZSBmcmFnbWVudAorICogKHRoZSBMaXN0QWRhcHRlciBiaW5kcyB0aGUgTGlzdFZpZXcgdG8gdGhlIGRhdGE7IG1vcmUgb24gdGhpcyBsYXRlcikuCisgKiA8cD4KKyAqIEEgTGlzdEFkYXB0ZXIgY29uc3RydWN0b3IgdGFrZXMgYSBwYXJhbWV0ZXIgdGhhdCBzcGVjaWZpZXMgYSBsYXlvdXQgcmVzb3VyY2UKKyAqIGZvciBlYWNoIHJvdy4gSXQgYWxzbyBoYXMgdHdvIGFkZGl0aW9uYWwgcGFyYW1ldGVycyB0aGF0IGxldCB5b3Ugc3BlY2lmeQorICogd2hpY2ggZGF0YSBmaWVsZCB0byBhc3NvY2lhdGUgd2l0aCB3aGljaCBvYmplY3QgaW4gdGhlIHJvdyBsYXlvdXQgcmVzb3VyY2UuCisgKiBUaGVzZSB0d28gcGFyYW1ldGVycyBhcmUgdHlwaWNhbGx5IHBhcmFsbGVsIGFycmF5cy4KKyAqIDwvcD4KKyAqIDxwPgorICogQW5kcm9pZCBwcm92aWRlcyBzb21lIHN0YW5kYXJkIHJvdyBsYXlvdXQgcmVzb3VyY2VzLiBUaGVzZSBhcmUgaW4gdGhlCisgKiB7QGxpbmsgYW5kcm9pZC5SLmxheW91dH0gY2xhc3MsIGFuZCBoYXZlIG5hbWVzIHN1Y2ggYXMgc2ltcGxlX2xpc3RfaXRlbV8xLAorICogc2ltcGxlX2xpc3RfaXRlbV8yLCBhbmQgdHdvX2xpbmVfbGlzdF9pdGVtLiBUaGUgZm9sbG93aW5nIGxheW91dCBYTUwgaXMgdGhlCisgKiBzb3VyY2UgZm9yIHRoZSByZXNvdXJjZSB0d29fbGluZV9saXN0X2l0ZW0sIHdoaWNoIGRpc3BsYXlzIHR3byBkYXRhCisgKiBmaWVsZHMsb25lIGFib3ZlIHRoZSBvdGhlciwgZm9yIGVhY2ggbGlzdCByb3cuCisgKiA8L3A+CisgKgorICogPHByZT4KKyAqICZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O3V0Zi04JnF1b3Q7PyZndDsKKyAqICZsdDtMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0mcXVvdDt3cmFwX2NvbnRlbnQmcXVvdDsKKyAqICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSZxdW90O3ZlcnRpY2FsJnF1b3Q7Jmd0OworICoKKyAqICAgICAmbHQ7VGV4dFZpZXcgYW5kcm9pZDppZD0mcXVvdDtAK2lkL3RleHQxJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9JnF1b3Q7MTZzcCZxdW90OworICogICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0mcXVvdDtib2xkJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9JnF1b3Q7d3JhcF9jb250ZW50JnF1b3Q7LyZndDsKKyAqCisgKiAgICAgJmx0O1RleHRWaWV3IGFuZHJvaWQ6aWQ9JnF1b3Q7QCtpZC90ZXh0MiZxdW90OworICogICAgICAgICBhbmRyb2lkOnRleHRTaXplPSZxdW90OzE2c3AmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0mcXVvdDt3cmFwX2NvbnRlbnQmcXVvdDsvJmd0OworICogJmx0Oy9MaW5lYXJMYXlvdXQmZ3Q7CisgKiA8L3ByZT4KKyAqCisgKiA8cD4KKyAqIFlvdSBtdXN0IGlkZW50aWZ5IHRoZSBkYXRhIGJvdW5kIHRvIGVhY2ggVGV4dFZpZXcgb2JqZWN0IGluIHRoaXMgbGF5b3V0LiBUaGUKKyAqIHN5bnRheCBmb3IgdGhpcyBpcyBkaXNjdXNzZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4KKyAqIDwvcD4KKyAqIDxwPgorICogPHN0cm9uZz5CaW5kaW5nIHRvIERhdGE8L3N0cm9uZz4KKyAqIDwvcD4KKyAqIDxwPgorICogWW91IGJpbmQgdGhlIExpc3RGcmFnbWVudCdzIExpc3RWaWV3IG9iamVjdCB0byBkYXRhIHVzaW5nIGEgY2xhc3MgdGhhdAorICogaW1wbGVtZW50cyB0aGUge0BsaW5rIGFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyIExpc3RBZGFwdGVyfSBpbnRlcmZhY2UuCisgKiBBbmRyb2lkIHByb3ZpZGVzIHR3byBzdGFuZGFyZCBsaXN0IGFkYXB0ZXJzOgorICoge0BsaW5rIGFuZHJvaWQud2lkZ2V0LlNpbXBsZUFkYXB0ZXIgU2ltcGxlQWRhcHRlcn0gZm9yIHN0YXRpYyBkYXRhIChNYXBzKSwKKyAqIGFuZCB7QGxpbmsgYW5kcm9pZC53aWRnZXQuU2ltcGxlQ3Vyc29yQWRhcHRlciBTaW1wbGVDdXJzb3JBZGFwdGVyfSBmb3IgQ3Vyc29yCisgKiBxdWVyeSByZXN1bHRzLgorICogPC9wPgorICogPHA+CisgKiBZb3UgPGI+bXVzdDwvYj4gdXNlCisgKiB7QGxpbmsgI3NldExpc3RBZGFwdGVyKExpc3RBZGFwdGVyKSBMaXN0RnJhZ21lbnQuc2V0TGlzdEFkYXB0ZXIoKX0gdG8KKyAqIGFzc29jaWF0ZSB0aGUgbGlzdCB3aXRoIGFuIGFkYXB0ZXIuICBEbyBub3QgZGlyZWN0bHkgY2FsbAorICoge0BsaW5rIExpc3RWaWV3I3NldEFkYXB0ZXIoTGlzdEFkYXB0ZXIpIExpc3RWaWV3LnNldEFkYXB0ZXIoKX0gb3IgZWxzZQorICogaW1wb3J0YW50IGluaXRpYWxpemF0aW9uIHdpbGwgYmUgc2tpcHBlZC4KKyAqIDwvcD4KKyAqCisgKiBAc2VlICNzZXRMaXN0QWRhcHRlcgorICogQHNlZSBhbmRyb2lkLndpZGdldC5MaXN0VmlldworICovCitwdWJsaWMgY2xhc3MgTGlzdEZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgeworICAgIGZpbmFsIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisKKyAgICBmaW5hbCBwcml2YXRlIFJ1bm5hYmxlIG1SZXF1ZXN0Rm9jdXMgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIG1MaXN0LmZvY3VzYWJsZVZpZXdBdmFpbGFibGUobUxpc3QpOworICAgICAgICB9CisgICAgfTsKKyAgICAKKyAgICBmaW5hbCBwcml2YXRlIEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgbU9uQ2xpY2tMaXN0ZW5lcgorICAgICAgICAgICAgPSBuZXcgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgb25MaXN0SXRlbUNsaWNrKChMaXN0VmlldylwYXJlbnQsIHYsIHBvc2l0aW9uLCBpZCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgTGlzdFZpZXcgbUxpc3Q7CisgICAgVmlldyBtRW1wdHlWaWV3OworICAgIFRleHRWaWV3IG1TdGFuZGFyZEVtcHR5VmlldzsKKyAgICBWaWV3IG1Qcm9ncmVzc0NvbnRhaW5lcjsKKyAgICBWaWV3IG1MaXN0Q29udGFpbmVyOworICAgIGJvb2xlYW4gbVNldEVtcHR5VGV4dDsKKyAgICBib29sZWFuIG1MaXN0U2hvd247CisKKyAgICBwdWJsaWMgTGlzdEZyYWdtZW50KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byByZXR1cm4gYSBzaW1wbGUgbGlzdCB2aWV3LiAgU3ViY2xhc3NlcworICAgICAqIGNhbiBvdmVycmlkZSB0byByZXBsYWNlIHdpdGggdGhlaXIgb3duIGxheW91dC4gIElmIGRvaW5nIHNvLCB0aGUKKyAgICAgKiByZXR1cm5lZCB2aWV3IGhpZXJhcmNoeSA8ZW0+bXVzdDwvZW0+IGhhdmUgYSBMaXN0VmlldyB3aG9zZSBpZAorICAgICAqIGlzIHtAbGluayBhbmRyb2lkLlIuaWQjbGlzdCBhbmRyb2lkLlIuaWQubGlzdH0gYW5kIGNhbiBvcHRpb25hbGx5CisgICAgICogaGF2ZSBhIHNpYmxpbmcgdmlldyBpZCB7QGxpbmsgYW5kcm9pZC5SLmlkI2VtcHR5IGFuZHJvaWQuUi5pZC5lbXB0eX0KKyAgICAgKiB0aGF0IGlzIHRvIGJlIHNob3duIHdoZW4gdGhlIGxpc3QgaXMgZW1wdHkuCisgICAgICogCisgICAgICogPHA+SWYgeW91IGFyZSBvdmVycmlkaW5nIHRoaXMgbWV0aG9kIHdpdGggeW91ciBvd24gY3VzdG9tIGNvbnRlbnQsCisgICAgICogY29uc2lkZXIgaW5jbHVkaW5nIHRoZSBzdGFuZGFyZCBsYXlvdXQge0BsaW5rIGFuZHJvaWQuUi5sYXlvdXQjbGlzdF9jb250ZW50fQorICAgICAqIGluIHlvdXIgbGF5b3V0IGZpbGUsIHNvIHRoYXQgeW91IGNvbnRpbnVlIHRvIHJldGFpbiBhbGwgb2YgdGhlIHN0YW5kYXJkCisgICAgICogYmVoYXZpb3Igb2YgTGlzdEZyYWdtZW50LiAgSW4gcGFydGljdWxhciwgdGhpcyBpcyBjdXJyZW50bHkgdGhlIG9ubHkKKyAgICAgKiB3YXkgdG8gaGF2ZSB0aGUgYnVpbHQtaW4gaW5kZXRlcm1pbmFudCBwcm9ncmVzcyBzdGF0ZSBiZSBzaG93bi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHJldHVybiBpbmZsYXRlci5pbmZsYXRlKGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmxpc3RfY29udGVudCwKKyAgICAgICAgICAgICAgICBjb250YWluZXIsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRhY2ggdG8gbGlzdCB2aWV3IG9uY2UgRnJhZ21lbnQgaXMgcmVhZHkgdG8gcnVuLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZW5zdXJlTGlzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGFjaCBmcm9tIGxpc3Qgdmlldy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lWaWV3KCkgeworICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVJlcXVlc3RGb2N1cyk7CisgICAgICAgIG1MaXN0ID0gbnVsbDsKKyAgICAgICAgc3VwZXIub25EZXN0cm95VmlldygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gYW4gaXRlbSBpbiB0aGUgbGlzdCBpcyBzZWxlY3RlZC4KKyAgICAgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZS4gU3ViY2xhc3NlcyBjYW4gY2FsbAorICAgICAqIGdldExpc3RWaWV3KCkuZ2V0SXRlbUF0UG9zaXRpb24ocG9zaXRpb24pIGlmIHRoZXkgbmVlZCB0byBhY2Nlc3MgdGhlCisgICAgICogZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlbGVjdGVkIGl0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbCBUaGUgTGlzdFZpZXcgd2hlcmUgdGhlIGNsaWNrIGhhcHBlbmVkCisgICAgICogQHBhcmFtIHYgVGhlIHZpZXcgdGhhdCB3YXMgY2xpY2tlZCB3aXRoaW4gdGhlIExpc3RWaWV3CisgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiBvZiB0aGUgdmlldyBpbiB0aGUgbGlzdAorICAgICAqIEBwYXJhbSBpZCBUaGUgcm93IGlkIG9mIHRoZSBpdGVtIHRoYXQgd2FzIGNsaWNrZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIHRoZSBjdXJzb3IgZm9yIHRoZSBsaXN0IHZpZXcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGlzdEFkYXB0ZXIoTGlzdEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBib29sZWFuIGhhZEFkYXB0ZXIgPSBtQWRhcHRlciAhPSBudWxsOworICAgICAgICBtQWRhcHRlciA9IGFkYXB0ZXI7CisgICAgICAgIGlmIChtTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdC5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICAgICAgaWYgKCFtTGlzdFNob3duICYmICFoYWRBZGFwdGVyKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGxpc3Qgd2FzIGhpZGRlbiwgYW5kIHByZXZpb3VzbHkgZGlkbid0IGhhdmUgYW4KKyAgICAgICAgICAgICAgICAvLyBhZGFwdGVyLiAgSXQgaXMgbm93IHRpbWUgdG8gc2hvdyBpdC4KKyAgICAgICAgICAgICAgICBzZXRMaXN0U2hvd24odHJ1ZSwgZ2V0VmlldygpLmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBsaXN0IGl0ZW0gdG8gdGhlIHNwZWNpZmllZAorICAgICAqIHBvc2l0aW9uIHdpdGggdGhlIGFkYXB0ZXIncyBkYXRhCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIGVuc3VyZUxpc3QoKTsKKyAgICAgICAgbUxpc3Quc2V0U2VsZWN0aW9uKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbGlzdCBpdGVtLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSB7CisgICAgICAgIGVuc3VyZUxpc3QoKTsKKyAgICAgICAgcmV0dXJuIG1MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJzb3Igcm93IElEIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbGlzdCBpdGVtLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFNlbGVjdGVkSXRlbUlkKCkgeworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgICAgIHJldHVybiBtTGlzdC5nZXRTZWxlY3RlZEl0ZW1JZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYWN0aXZpdHkncyBsaXN0IHZpZXcgd2lkZ2V0LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0VmlldyBnZXRMaXN0VmlldygpIHsKKyAgICAgICAgZW5zdXJlTGlzdCgpOworICAgICAgICByZXR1cm4gbUxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgY29udGVudCBmb3IgYSBMaXN0RnJhZ21lbnQgaGFzIGEgVGV4dFZpZXcgdGhhdCBjYW4KKyAgICAgKiBiZSBzaG93biB3aGVuIHRoZSBsaXN0IGlzIGVtcHR5LiAgSWYgeW91IHdvdWxkIGxpa2UgdG8gaGF2ZSBpdAorICAgICAqIHNob3duLCBjYWxsIHRoaXMgbWV0aG9kIHRvIHN1cHBseSB0aGUgdGV4dCBpdCBzaG91bGQgdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVtcHR5VGV4dChDaGFyU2VxdWVuY2UgdGV4dCkgeworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgICAgIGlmIChtU3RhbmRhcmRFbXB0eVZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2FuJ3QgYmUgdXNlZCB3aXRoIGEgY3VzdG9tIGNvbnRlbnQgdmlldyIpOworICAgICAgICB9CisgICAgICAgIG1TdGFuZGFyZEVtcHR5Vmlldy5zZXRUZXh0KHRleHQpOworICAgICAgICBpZiAoIW1TZXRFbXB0eVRleHQpIHsKKyAgICAgICAgICAgIG1MaXN0LnNldEVtcHR5VmlldyhtU3RhbmRhcmRFbXB0eVZpZXcpOworICAgICAgICAgICAgbVNldEVtcHR5VGV4dCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29udHJvbCB3aGV0aGVyIHRoZSBsaXN0IGlzIGJlaW5nIGRpc3BsYXllZC4gIFlvdSBjYW4gbWFrZSBpdCBub3QKKyAgICAgKiBkaXNwbGF5ZWQgaWYgeW91IGFyZSB3YWl0aW5nIGZvciB0aGUgaW5pdGlhbCBkYXRhIHRvIHNob3cgaW4gaXQuICBEdXJpbmcKKyAgICAgKiB0aGlzIHRpbWUgYW4gaW5kZXRlcm1pbmFudCBwcm9ncmVzcyBpbmRpY2F0b3Igd2lsbCBiZSBzaG93biBpbnN0ZWFkLgorICAgICAqIAorICAgICAqIDxwPkFwcGxpY2F0aW9ucyBkbyBub3Qgbm9ybWFsbHkgbmVlZCB0byB1c2UgdGhpcyB0aGVtc2VsdmVzLiAgVGhlIGRlZmF1bHQKKyAgICAgKiBiZWhhdmlvciBvZiBMaXN0RnJhZ21lbnQgaXMgdG8gc3RhcnQgd2l0aCB0aGUgbGlzdCBub3QgYmVpbmcgc2hvd24sIG9ubHkKKyAgICAgKiBzaG93aW5nIGl0IG9uY2UgYW4gYWRhcHRlciBpcyBnaXZlbiB3aXRoIHtAbGluayAjc2V0TGlzdEFkYXB0ZXIoTGlzdEFkYXB0ZXIpfS4KKyAgICAgKiBJZiB0aGUgbGlzdCBhdCB0aGF0IHBvaW50IGhhZCBub3QgYmVlbiBzaG93biwgd2hlbiBpdCBkb2VzIGdldCBzaG93bgorICAgICAqIGl0IHdpbGwgYmUgZG8gd2l0aG91dCB0aGUgdXNlciBldmVyIHNlZWluZyB0aGUgaGlkZGVuIHN0YXRlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzaG93biBJZiB0cnVlLCB0aGUgbGlzdCB2aWV3IGlzIHNob3duOyBpZiBmYWxzZSwgdGhlIHByb2dyZXNzCisgICAgICogaW5kaWNhdG9yLiAgVGhlIGluaXRpYWwgdmFsdWUgaXMgdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0U2hvd24oYm9vbGVhbiBzaG93bikgeworICAgICAgICBzZXRMaXN0U2hvd24oc2hvd24sIHRydWUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBMaWtlIHtAbGluayAjc2V0TGlzdFNob3duKGJvb2xlYW4pfSwgYnV0IG5vIGFuaW1hdGlvbiBpcyB1c2VkIHdoZW4KKyAgICAgKiB0cmFuc2l0aW9uaW5nIGZyb20gdGhlIHByZXZpb3VzIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpc3RTaG93bk5vQW5pbWF0aW9uKGJvb2xlYW4gc2hvd24pIHsKKyAgICAgICAgc2V0TGlzdFNob3duKHNob3duLCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbnRyb2wgd2hldGhlciB0aGUgbGlzdCBpcyBiZWluZyBkaXNwbGF5ZWQuICBZb3UgY2FuIG1ha2UgaXQgbm90CisgICAgICogZGlzcGxheWVkIGlmIHlvdSBhcmUgd2FpdGluZyBmb3IgdGhlIGluaXRpYWwgZGF0YSB0byBzaG93IGluIGl0LiAgRHVyaW5nCisgICAgICogdGhpcyB0aW1lIGFuIGluZGV0ZXJtaW5hbnQgcHJvZ3Jlc3MgaW5kaWNhdG9yIHdpbGwgYmUgc2hvd24gaW5zdGVhZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2hvd24gSWYgdHJ1ZSwgdGhlIGxpc3QgdmlldyBpcyBzaG93bjsgaWYgZmFsc2UsIHRoZSBwcm9ncmVzcworICAgICAqIGluZGljYXRvci4gIFRoZSBpbml0aWFsIHZhbHVlIGlzIHRydWUuCisgICAgICogQHBhcmFtIGFuaW1hdGUgSWYgdHJ1ZSwgYW4gYW5pbWF0aW9uIHdpbGwgYmUgdXNlZCB0byB0cmFuc2l0aW9uIHRvIHRoZQorICAgICAqIG5ldyBzdGF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0TGlzdFNob3duKGJvb2xlYW4gc2hvd24sIGJvb2xlYW4gYW5pbWF0ZSkgeworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgICAgIGlmIChtUHJvZ3Jlc3NDb250YWluZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2FuJ3QgYmUgdXNlZCB3aXRoIGEgY3VzdG9tIGNvbnRlbnQgdmlldyIpOworICAgICAgICB9CisgICAgICAgIGlmIChtTGlzdFNob3duID09IHNob3duKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RTaG93biA9IHNob3duOworICAgICAgICBpZiAoc2hvd24pIHsKKyAgICAgICAgICAgIGlmIChhbmltYXRlKSB7CisgICAgICAgICAgICAgICAgbVByb2dyZXNzQ29udGFpbmVyLnN0YXJ0QW5pbWF0aW9uKEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpLCBhbmRyb2lkLlIuYW5pbS5mYWRlX291dCkpOworICAgICAgICAgICAgICAgIG1MaXN0Q29udGFpbmVyLnN0YXJ0QW5pbWF0aW9uKEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpLCBhbmRyb2lkLlIuYW5pbS5mYWRlX2luKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJvZ3Jlc3NDb250YWluZXIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbUxpc3RDb250YWluZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGFuaW1hdGUpIHsKKyAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NDb250YWluZXIuc3RhcnRBbmltYXRpb24oQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCksIGFuZHJvaWQuUi5hbmltLmZhZGVfaW4pKTsKKyAgICAgICAgICAgICAgICBtTGlzdENvbnRhaW5lci5zdGFydEFuaW1hdGlvbihBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKSwgYW5kcm9pZC5SLmFuaW0uZmFkZV9vdXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Qcm9ncmVzc0NvbnRhaW5lci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtTGlzdENvbnRhaW5lci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0IHRoZSBMaXN0QWRhcHRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBhY3Rpdml0eSdzIExpc3RWaWV3LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0QWRhcHRlciBnZXRMaXN0QWRhcHRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1BZGFwdGVyOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVMaXN0KCkgeworICAgICAgICBpZiAobUxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFZpZXcgcm9vdCA9IGdldFZpZXcoKTsKKyAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29udGVudCB2aWV3IG5vdCB5ZXQgY3JlYXRlZCIpOworICAgICAgICB9CisgICAgICAgIGlmIChyb290IGluc3RhbmNlb2YgTGlzdFZpZXcpIHsKKyAgICAgICAgICAgIG1MaXN0ID0gKExpc3RWaWV3KXJvb3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU3RhbmRhcmRFbXB0eVZpZXcgPSAoVGV4dFZpZXcpcm9vdC5maW5kVmlld0J5SWQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuaW50ZXJuYWxFbXB0eSk7CisgICAgICAgICAgICBpZiAobVN0YW5kYXJkRW1wdHlWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRW1wdHlWaWV3ID0gcm9vdC5maW5kVmlld0J5SWQoYW5kcm9pZC5SLmlkLmVtcHR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Qcm9ncmVzc0NvbnRhaW5lciA9IHJvb3QuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQucHJvZ3Jlc3NDb250YWluZXIpOworICAgICAgICAgICAgbUxpc3RDb250YWluZXIgPSByb290LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmxpc3RDb250YWluZXIpOworICAgICAgICAgICAgVmlldyByYXdMaXN0VmlldyA9IHJvb3QuZmluZFZpZXdCeUlkKGFuZHJvaWQuUi5pZC5saXN0KTsKKyAgICAgICAgICAgIGlmICghKHJhd0xpc3RWaWV3IGluc3RhbmNlb2YgTGlzdFZpZXcpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiQ29udGVudCBoYXMgdmlldyB3aXRoIGlkIGF0dHJpYnV0ZSAnYW5kcm9pZC5SLmlkLmxpc3QnICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInRoYXQgaXMgbm90IGEgTGlzdFZpZXcgY2xhc3MiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1MaXN0ID0gKExpc3RWaWV3KXJhd0xpc3RWaWV3OworICAgICAgICAgICAgaWYgKG1MaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJZb3VyIGNvbnRlbnQgbXVzdCBoYXZlIGEgTGlzdFZpZXcgd2hvc2UgaWQgYXR0cmlidXRlIGlzICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIidhbmRyb2lkLlIuaWQubGlzdCciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRW1wdHlWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTGlzdC5zZXRFbXB0eVZpZXcobUVtcHR5Vmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RTaG93biA9IHRydWU7CisgICAgICAgIG1MaXN0LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobU9uQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXZSBhcmUgc3RhcnRpbmcgd2l0aG91dCBhbiBhZGFwdGVyLCBzbyBhc3N1bWUgd2Ugd29uJ3QKKyAgICAgICAgICAgIC8vIGhhdmUgb3VyIGRhdGEgcmlnaHQgYXdheSBhbmQgc3RhcnQgd2l0aCB0aGUgcHJvZ3Jlc3MgaW5kaWNhdG9yLgorICAgICAgICAgICAgaWYgKG1Qcm9ncmVzc0NvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2V0TGlzdFNob3duKGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUhhbmRsZXIucG9zdChtUmVxdWVzdEZvY3VzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVyTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvYWRlck1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGFiY2FhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvYWRlck1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDQwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuTG9hZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworCisvKioKKyAqIEludGVyZmFjZSBhc3NvY2lhdGVkIHdpdGggYW4ge0BsaW5rIEFjdGl2aXR5fSBvciB7QGxpbmsgRnJhZ21lbnR9IGZvciBtYW5hZ2luZworICogb25lIG9yIG1vcmUge0BsaW5rIGFuZHJvaWQuY29udGVudC5Mb2FkZXJ9IGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggaXQuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTG9hZGVyTWFuYWdlciB7CisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgaW50ZXJmYWNlIGZvciBhIGNsaWVudCB0byBpbnRlcmFjdCB3aXRoIHRoZSBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgTG9hZGVyQ2FsbGJhY2tzPEQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluc3RhbnRpYXRlIGFuZCByZXR1cm4gYSBuZXcgTG9hZGVyIGZvciB0aGUgZ2l2ZW4gSUQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpZCBUaGUgSUQgd2hvc2UgbG9hZGVyIGlzIHRvIGJlIGNyZWF0ZWQuCisgICAgICAgICAqIEBwYXJhbSBhcmdzIEFueSBhcmd1bWVudHMgc3VwcGxpZWQgYnkgdGhlIGNhbGxlci4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm4gYSBuZXcgTG9hZGVyIGluc3RhbmNlIHRoYXQgaXMgcmVhZHkgdG8gc3RhcnQgbG9hZGluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMb2FkZXI8RD4gb25DcmVhdGVMb2FkZXIoaW50IGlkLCBCdW5kbGUgYXJncyk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGEgcHJldmlvdXNseSBjcmVhdGVkIGxvYWRlciBoYXMgZmluaXNoZWQgaXRzIGxvYWQuCisgICAgICAgICAqIEBwYXJhbSBsb2FkZXIgVGhlIExvYWRlciB0aGF0IGhhcyBmaW5pc2hlZC4KKyAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgZ2VuZXJhdGVkIGJ5IHRoZSBMb2FkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkxvYWRGaW5pc2hlZChMb2FkZXI8RD4gbG9hZGVyLCBEIGRhdGEpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIGEgbG9hZGVyIGlzIGluaXRpYWxpemVkIGFuZCBhY3RpdmUuICBJZiB0aGUgbG9hZGVyIGRvZXNuJ3QKKyAgICAgKiBhbHJlYWR5IGV4aXN0LCBvbmUgaXMgY3JlYXRlZCBhbmQgKGlmIHRoZSBhY3Rpdml0eS9mcmFnbWVudCBpcyBjdXJyZW50bHkKKyAgICAgKiBzdGFydGVkKSBzdGFydHMgdGhlIGxvYWRlci4gIE90aGVyd2lzZSB0aGUgbGFzdCBjcmVhdGVkCisgICAgICogbG9hZGVyIGlzIHJlLXVzZWQuCisgICAgICoKKyAgICAgKiA8cD5JbiBlaXRoZXIgY2FzZSwgdGhlIGdpdmVuIGNhbGxiYWNrIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9hZGVyLCBhbmQKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCBhcyB0aGUgbG9hZGVyIHN0YXRlIGNoYW5nZXMuICBJZiBhdCB0aGUgcG9pbnQgb2YgY2FsbAorICAgICAqIHRoZSBjYWxsZXIgaXMgaW4gaXRzIHN0YXJ0ZWQgc3RhdGUsIGFuZCB0aGUgcmVxdWVzdGVkIGxvYWRlcgorICAgICAqIGFscmVhZHkgZXhpc3RzIGFuZCBoYXMgZ2VuZXJhdGVkIGl0cyBkYXRhLCB0aGVuCisgICAgICogY2FsbGJhY2suIHtAbGluayBMb2FkZXJDYWxsYmFja3Mjb25Mb2FkRmluaXNoZWR9IHdpbGwKKyAgICAgKiBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgKGluc2lkZSBvZiB0aGlzIGZ1bmN0aW9uKSwgc28geW91IG11c3QgYmUgcHJlcGFyZWQKKyAgICAgKiBmb3IgdGhpcyB0byBoYXBwZW4uCisgICAgICovCisgICAgcHVibGljIDxEPiBMb2FkZXI8RD4gaW5pdExvYWRlcihpbnQgaWQsIEJ1bmRsZSBhcmdzLAorICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8RD4gY2FsbGJhY2spOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBsb2FkZXIgaW4gdGhpcyBtYW5hZ2VyLCByZWdpc3RlcnMgdGhlIGNhbGxiYWNrcyB0byBpdCwKKyAgICAgKiBhbmQgKGlmIHRoZSBhY3Rpdml0eS9mcmFnbWVudCBpcyBjdXJyZW50bHkgc3RhcnRlZCkgc3RhcnRzIGxvYWRpbmcgaXQuCisgICAgICogSWYgYSBsb2FkZXIgd2l0aCB0aGUgc2FtZSBpZCBoYXMgcHJldmlvdXNseSBiZWVuCisgICAgICogc3RhcnRlZCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGVzdHJveWVkIHdoZW4gdGhlIG5ldyBsb2FkZXIgY29tcGxldGVzCisgICAgICogaXRzIHdvcmsuIFRoZSBjYWxsYmFjayB3aWxsIGJlIGRlbGl2ZXJlZCBiZWZvcmUgdGhlIG9sZCBsb2FkZXIKKyAgICAgKiBpcyBkZXN0cm95ZWQuCisgICAgICovCisgICAgcHVibGljIDxEPiBMb2FkZXI8RD4gcmVzdGFydExvYWRlcihpbnQgaWQsIEJ1bmRsZSBhcmdzLAorICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8RD4gY2FsbGJhY2spOworCisgICAgLyoqCisgICAgICogU3RvcHMgYW5kIHJlbW92ZXMgdGhlIGxvYWRlciB3aXRoIHRoZSBnaXZlbiBJRC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wTG9hZGVyKGludCBpZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIExvYWRlciB3aXRoIHRoZSBnaXZlbiBpZCBvciBudWxsIGlmIG5vIG1hdGNoaW5nIExvYWRlcgorICAgICAqIGlzIGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyA8RD4gTG9hZGVyPEQ+IGdldExvYWRlcihpbnQgaWQpOworfQorCitjbGFzcyBMb2FkZXJNYW5hZ2VySW1wbCBpbXBsZW1lbnRzIExvYWRlck1hbmFnZXIgeworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkxvYWRlck1hbmFnZXJJbXBsIjsKKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7CisKKyAgICAvLyBUaGVzZSBhcmUgdGhlIGN1cnJlbnRseSBhY3RpdmUgbG9hZGVycy4gIEEgbG9hZGVyIGlzIGhlcmUKKyAgICAvLyBmcm9tIHRoZSB0aW1lIGl0cyBsb2FkIGlzIHN0YXJ0ZWQgdW50aWwgaXQgaGFzIGJlZW4gZXhwbGljaXRseQorICAgIC8vIHN0b3BwZWQgb3IgcmVzdGFydGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgICBmaW5hbCBTcGFyc2VBcnJheTxMb2FkZXJJbmZvPiBtTG9hZGVycyA9IG5ldyBTcGFyc2VBcnJheTxMb2FkZXJJbmZvPigpOworCisgICAgLy8gVGhlc2UgYXJlIHByZXZpb3VzbHkgcnVuIGxvYWRlcnMuICBUaGlzIGxpc3QgaXMgbWFpbnRhaW5lZCBpbnRlcm5hbGx5CisgICAgLy8gdG8gYXZvaWQgZGVzdHJveWluZyBhIGxvYWRlciB3aGlsZSBhbiBhcHBsaWNhdGlvbiBpcyBzdGlsbCB1c2luZyBpdC4KKyAgICAvLyBJdCBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gcmVzdGFydCBhIGxvYWRlciwgYnV0IGNvbnRpbnVlIHVzaW5nIGl0cworICAgIC8vIHByZXZpb3VzbHkgcnVuIGxvYWRlciB1bnRpbCB0aGUgbmV3IGxvYWRlcidzIGRhdGEgaXMgYXZhaWxhYmxlLgorICAgIGZpbmFsIFNwYXJzZUFycmF5PExvYWRlckluZm8+IG1JbmFjdGl2ZUxvYWRlcnMgPSBuZXcgU3BhcnNlQXJyYXk8TG9hZGVySW5mbz4oKTsKKworICAgIGJvb2xlYW4gbVN0YXJ0ZWQ7CisgICAgYm9vbGVhbiBtUmV0YWluaW5nOworICAgIGJvb2xlYW4gbVJldGFpbmluZ1N0YXJ0ZWQ7CisKKyAgICBmaW5hbCBjbGFzcyBMb2FkZXJJbmZvIGltcGxlbWVudHMgTG9hZGVyLk9uTG9hZENvbXBsZXRlTGlzdGVuZXI8T2JqZWN0PiB7CisgICAgICAgIGZpbmFsIGludCBtSWQ7CisgICAgICAgIGZpbmFsIEJ1bmRsZSBtQXJnczsKKyAgICAgICAgTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8T2JqZWN0PiBtQ2FsbGJhY2tzOworICAgICAgICBMb2FkZXI8T2JqZWN0PiBtTG9hZGVyOworICAgICAgICBPYmplY3QgbURhdGE7CisgICAgICAgIGJvb2xlYW4gbVN0YXJ0ZWQ7CisgICAgICAgIGJvb2xlYW4gbVJldGFpbmluZzsKKyAgICAgICAgYm9vbGVhbiBtUmV0YWluaW5nU3RhcnRlZDsKKyAgICAgICAgYm9vbGVhbiBtRGVzdHJveWVkOworICAgICAgICBib29sZWFuIG1MaXN0ZW5lclJlZ2lzdGVyZWQ7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgTG9hZGVySW5mbyhpbnQgaWQsIEJ1bmRsZSBhcmdzLCBMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxPYmplY3Q+IGNhbGxiYWNrcykgeworICAgICAgICAgICAgbUlkID0gaWQ7CisgICAgICAgICAgICBtQXJncyA9IGFyZ3M7CisgICAgICAgICAgICBtQ2FsbGJhY2tzID0gY2FsbGJhY2tzOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB2b2lkIHN0YXJ0KCkgeworICAgICAgICAgICAgaWYgKG1SZXRhaW5pbmcgJiYgbVJldGFpbmluZ1N0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBPdXIgb3duZXIgaXMgc3RhcnRlZCwgYnV0IHdlIHdlcmUgYmVpbmcgcmV0YWluZWQgZnJvbSBhCisgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgaW5zdGFuY2UgaW4gdGhlIHN0YXJ0ZWQgc3RhdGUuLi4gIHNvIHRoZXJlIGlzIHJlYWxseQorICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZSwgc2luY2UgdGhlIGxvYWRlcnMgYXJlIHN0aWxsIHN0YXJ0ZWQuCisgICAgICAgICAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgbG9hZGVyIGFscmVhZHkgc3RhcnRlZCwgZG9uJ3QgcmVzdGFydC4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBTdGFydGluZzogIiArIHRoaXMpOworICAgICAgICAgICAgaWYgKG1Mb2FkZXIgPT0gbnVsbCAmJiBtQ2FsbGJhY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgIG1Mb2FkZXIgPSBtQ2FsbGJhY2tzLm9uQ3JlYXRlTG9hZGVyKG1JZCwgbUFyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Mb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICghbUxpc3RlbmVyUmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICBtTG9hZGVyLnJlZ2lzdGVyTGlzdGVuZXIobUlkLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyUmVnaXN0ZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Mb2FkZXIuc3RhcnRMb2FkaW5nKCk7CisgICAgICAgICAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICB2b2lkIHJldGFpbigpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBSZXRhaW5pbmc6ICIgKyB0aGlzKTsKKyAgICAgICAgICAgIG1SZXRhaW5pbmcgPSB0cnVlOworICAgICAgICAgICAgbVJldGFpbmluZ1N0YXJ0ZWQgPSBtU3RhcnRlZDsKKyAgICAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICBtQ2FsbGJhY2tzID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdm9pZCBmaW5pc2hSZXRhaW4oKSB7CisgICAgICAgICAgICBpZiAobVJldGFpbmluZykgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBGaW5pc2hlZCBSZXRhaW5pbmc6ICIgKyB0aGlzKTsKKyAgICAgICAgICAgICAgICBtUmV0YWluaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKG1TdGFydGVkICE9IG1SZXRhaW5pbmdTdGFydGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbG9hZGVyIHdhcyByZXRhaW5lZCBpbiBhIHN0YXJ0ZWQgc3RhdGUsIGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCBvZiByZXRhaW5pbmcgZXZlcnl0aGluZyBvdXIgb3duZXIgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGxvbmdlciBzdGFydGVkLi4uICBzbyBtYWtlIGl0IHN0b3AuCisgICAgICAgICAgICAgICAgICAgICAgICBzdG9wKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1TdGFydGVkICYmIG1EYXRhICE9IG51bGwgJiYgbUNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbG9hZGVyIHdhcyByZXRhaW5lZCwgYW5kIG5vdyBhdCB0aGUgcG9pbnQgb2YKKyAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoaW5nIHRoZSByZXRhaW4gd2UgZmluZCB3ZSByZW1haW4gc3RhcnRlZCwgaGF2ZQorICAgICAgICAgICAgICAgICAgICAvLyBvdXIgZGF0YSwgYW5kIHRoZSBvd25lciBoYXMgYSBuZXcgY2FsbGJhY2suLi4gIHNvCisgICAgICAgICAgICAgICAgICAgIC8vIGxldCdzIGRlbGl2ZXIgdGhlIGRhdGEgbm93LgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLm9uTG9hZEZpbmlzaGVkKG1Mb2FkZXIsIG1EYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBTdG9wcGluZzogIiArIHRoaXMpOworICAgICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICghbVJldGFpbmluZykgeworICAgICAgICAgICAgICAgIGlmIChtTG9hZGVyICE9IG51bGwgJiYgbUxpc3RlbmVyUmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBMZXQgdGhlIGxvYWRlciBrbm93IHdlJ3JlIGRvbmUgd2l0aCBpdAorICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXJSZWdpc3RlcmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXIudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgICAgICBtTG9hZGVyLnN0b3BMb2FkaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1EYXRhID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdm9pZCBkZXN0cm95KCkgeworICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICIgIERlc3Ryb3lpbmc6ICIgKyB0aGlzKTsKKyAgICAgICAgICAgIG1EZXN0cm95ZWQgPSB0cnVlOworICAgICAgICAgICAgbUNhbGxiYWNrcyA9IG51bGw7CisgICAgICAgICAgICBpZiAobUxvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lclJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtTG9hZGVyLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUxvYWRlci5kZXN0cm95KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBvbkxvYWRDb21wbGV0ZShMb2FkZXI8T2JqZWN0PiBsb2FkZXIsIE9iamVjdCBkYXRhKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm9uTG9hZENvbXBsZXRlOiAiICsgdGhpcyArICIgbURlc3Ryb3llZD0iICsgbURlc3Ryb3llZCk7CisKKyAgICAgICAgICAgIGlmIChtRGVzdHJveWVkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBOb3RpZnkgb2YgdGhlIG5ldyBkYXRhIHNvIHRoZSBhcHAgY2FuIHN3aXRjaCBvdXQgdGhlIG9sZCBkYXRhIGJlZm9yZQorICAgICAgICAgICAgLy8gd2UgdHJ5IHRvIGRlc3Ryb3kgaXQuCisgICAgICAgICAgICBtRGF0YSA9IGRhdGE7CisgICAgICAgICAgICBpZiAobUNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrcy5vbkxvYWRGaW5pc2hlZChsb2FkZXIsIGRhdGEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm9uTG9hZEZpbmlzaGVkIHJldHVybmVkOiAiICsgdGhpcyk7CisKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgbm93IGdpdmVuIHRoZSBhcHBsaWNhdGlvbiB0aGUgbmV3IGxvYWRlciB3aXRoIGl0cworICAgICAgICAgICAgLy8gbG9hZGVkIGRhdGEsIHNvIGl0IHNob3VsZCBoYXZlIHN0b3BwZWQgdXNpbmcgdGhlIHByZXZpb3VzCisgICAgICAgICAgICAvLyBsb2FkZXIuICBJZiB0aGVyZSBpcyBhIHByZXZpb3VzIGxvYWRlciBvbiB0aGUgaW5hY3RpdmUgbGlzdCwKKyAgICAgICAgICAgIC8vIGNsZWFuIGl0IHVwLgorICAgICAgICAgICAgTG9hZGVySW5mbyBpbmZvID0gbUluYWN0aXZlTG9hZGVycy5nZXQobUlkKTsKKyAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwgJiYgaW5mbyAhPSB0aGlzKSB7CisgICAgICAgICAgICAgICAgaW5mby5kZXN0cm95KCk7CisgICAgICAgICAgICAgICAgbUluYWN0aXZlTG9hZGVycy5yZW1vdmUobUlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDY0KTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiTG9hZGVySW5mb3siKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAjIik7CisgICAgICAgICAgICBzYi5hcHBlbmQobUlkKTsKKyAgICAgICAgICAgIGlmIChtQXJncyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKG1BcmdzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKCJ9Iik7CisgICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBMb2FkZXJNYW5hZ2VySW1wbChib29sZWFuIHN0YXJ0ZWQpIHsKKyAgICAgICAgbVN0YXJ0ZWQgPSBzdGFydGVkOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIExvYWRlckluZm8gY3JlYXRlTG9hZGVyKGludCBpZCwgQnVuZGxlIGFyZ3MsCisgICAgICAgICAgICBMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxPYmplY3Q+IGNhbGxiYWNrKSB7CisgICAgICAgIExvYWRlckluZm8gaW5mbyA9IG5ldyBMb2FkZXJJbmZvKGlkLCBhcmdzLCAgKExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPE9iamVjdD4pY2FsbGJhY2spOworICAgICAgICBtTG9hZGVycy5wdXQoaWQsIGluZm8pOworICAgICAgICBMb2FkZXI8T2JqZWN0PiBsb2FkZXIgPSBjYWxsYmFjay5vbkNyZWF0ZUxvYWRlcihpZCwgYXJncyk7CisgICAgICAgIGluZm8ubUxvYWRlciA9IChMb2FkZXI8T2JqZWN0Pilsb2FkZXI7CisgICAgICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICAgICAgLy8gVGhlIGFjdGl2aXR5IHdpbGwgc3RhcnQgYWxsIGV4aXN0aW5nIGxvYWRlcnMgaW4gaXQncyBvblN0YXJ0KCksCisgICAgICAgICAgICAvLyBzbyBvbmx5IHN0YXJ0IHRoZW0gaGVyZSBpZiB3ZSdyZSBwYXN0IHRoYXQgcG9pbnQgb2YgdGhlIGFjdGl2aXRpeSdzCisgICAgICAgICAgICAvLyBsaWZlIGN5Y2xlCisgICAgICAgICAgICBpbmZvLnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGluZm87CisgICAgfQorICAgIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyA8RD4gTG9hZGVyPEQ+IGluaXRMb2FkZXIoaW50IGlkLCBCdW5kbGUgYXJncywgTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8RD4gY2FsbGJhY2spIHsKKyAgICAgICAgTG9hZGVySW5mbyBpbmZvID0gbUxvYWRlcnMuZ2V0KGlkKTsKKyAgICAgICAgCisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiaW5pdExvYWRlciBpbiAiICsgdGhpcyArICI6IGN1cj0iICsgaW5mbyk7CisKKyAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTG9hZGVyIGRvZXNuJ3QgYWxyZWFkeSBleGlzdDsgY3JlYXRlLgorICAgICAgICAgICAgaW5mbyA9IGNyZWF0ZUxvYWRlcihpZCwgYXJncywgIChMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxPYmplY3Q+KWNhbGxiYWNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGluZm8ubUNhbGxiYWNrcyA9IChMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxPYmplY3Q+KWNhbGxiYWNrOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoaW5mby5tRGF0YSAhPSBudWxsICYmIG1TdGFydGVkKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgbG9hZGVyIGhhcyBhbHJlYWR5IGdlbmVyYXRlZCBpdHMgZGF0YSwgcmVwb3J0IGl0IG5vdy4KKyAgICAgICAgICAgIGluZm8ubUNhbGxiYWNrcy5vbkxvYWRGaW5pc2hlZChpbmZvLm1Mb2FkZXIsIGluZm8ubURhdGEpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gKExvYWRlcjxEPilpbmZvLm1Mb2FkZXI7CisgICAgfQorICAgIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyA8RD4gTG9hZGVyPEQ+IHJlc3RhcnRMb2FkZXIoaW50IGlkLCBCdW5kbGUgYXJncywgTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8RD4gY2FsbGJhY2spIHsKKyAgICAgICAgTG9hZGVySW5mbyBpbmZvID0gbUxvYWRlcnMuZ2V0KGlkKTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJyZXN0YXJ0TG9hZGVyIGluICIgKyB0aGlzICsgIjogY3VyPSIgKyBpbmZvKTsKKyAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgTG9hZGVySW5mbyBpbmFjdGl2ZSA9IG1JbmFjdGl2ZUxvYWRlcnMuZ2V0KGlkKTsKKyAgICAgICAgICAgIGlmIChpbmFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGluZm8ubURhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGxvYWRlciBub3cgaGFzIGRhdGEuLi4gIHdlIGFyZSBwcm9iYWJseSBiZWluZworICAgICAgICAgICAgICAgICAgICAvLyBjYWxsZWQgZnJvbSB3aXRoaW4gb25Mb2FkQ29tcGxldGUsIHdoZXJlIHdlIGhhdmVuJ3QKKyAgICAgICAgICAgICAgICAgICAgLy8geWV0IGRlc3Ryb3llZCB0aGUgbGFzdCBpbmFjdGl2ZSBsb2FkZXIuICBTbyBqdXN0IGRvCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgbm93LgorICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIiAgUmVtb3ZpbmcgbGFzdCBpbmFjdGl2ZSBsb2FkZXIgaW4gIiArIHRoaXMpOworICAgICAgICAgICAgICAgICAgICBpbmFjdGl2ZS5kZXN0cm95KCk7CisgICAgICAgICAgICAgICAgICAgIG1JbmFjdGl2ZUxvYWRlcnMucHV0KGlkLCBpbmZvKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBhbHJlYWR5IGhhdmUgYW4gaW5hY3RpdmUgbG9hZGVyIGZvciB0aGlzIElEIHRoYXQgd2UgYXJlCisgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRpbmcgZm9yISAgTm93IHdlIGhhdmUgdGhyZWUgYWN0aXZlIGxvYWRlcnMuLi4gbGV0J3MganVzdAorICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIHRoZSBvbmUgaW4gdGhlIG1pZGRsZSwgc2luY2Ugd2UgYXJlIHN0aWxsIHdhaXRpbmcgZm9yCisgICAgICAgICAgICAgICAgICAgIC8vIGl0cyByZXN1bHQgYnV0IHRoYXQgcmVzdWx0IGlzIGFscmVhZHkgb3V0IG9mIGRhdGUuCisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBSZW1vdmluZyBpbnRlcm1lZGlhdGUgbG9hZGVyIGluICIgKyB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5kZXN0cm95KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBwcmV2aW91cyBpbnN0YW5jZSBvZiB0aGlzIGxvYWRlciBzbyB3ZSBjYW4gZGVzdHJveQorICAgICAgICAgICAgICAgIC8vIGl0IHdoZW4gdGhlIG5ldyBvbmUgY29tcGxldGVzLgorICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBNYWtpbmcgaW5hY3RpdmU6ICIgKyBpbmZvKTsKKyAgICAgICAgICAgICAgICBtSW5hY3RpdmVMb2FkZXJzLnB1dChpZCwgaW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGluZm8gPSBjcmVhdGVMb2FkZXIoaWQsIGFyZ3MsICAoTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8T2JqZWN0PiljYWxsYmFjayk7CisgICAgICAgIHJldHVybiAoTG9hZGVyPEQ+KWluZm8ubUxvYWRlcjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc3RvcExvYWRlcihpbnQgaWQpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJzdG9wTG9hZGVyIGluICIgKyB0aGlzICsgIiBvZiAiICsgaWQpOworICAgICAgICBpbnQgaWR4ID0gbUxvYWRlcnMuaW5kZXhPZktleShpZCk7CisgICAgICAgIGlmIChpZHggPj0gMCkgeworICAgICAgICAgICAgTG9hZGVySW5mbyBpbmZvID0gbUxvYWRlcnMudmFsdWVBdChpZHgpOworICAgICAgICAgICAgbUxvYWRlcnMucmVtb3ZlQXQoaWR4KTsKKyAgICAgICAgICAgIGluZm8uZGVzdHJveSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIDxEPiBMb2FkZXI8RD4gZ2V0TG9hZGVyKGludCBpZCkgeworICAgICAgICBMb2FkZXJJbmZvIGxvYWRlckluZm8gPSBtTG9hZGVycy5nZXQoaWQpOworICAgICAgICBpZiAobG9hZGVySW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKExvYWRlcjxEPiltTG9hZGVycy5nZXQoaWQpLm1Mb2FkZXI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorIAorICAgIHZvaWQgZG9TdGFydCgpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJTdGFydGluZzogIiArIHRoaXMpOworCisgICAgICAgIC8vIENhbGwgb3V0IHRvIHN1YiBjbGFzc2VzIHNvIHRoZXkgY2FuIHN0YXJ0IHRoZWlyIGxvYWRlcnMKKyAgICAgICAgLy8gTGV0IHRoZSBleGlzdGluZyBsb2FkZXJzIGtub3cgdGhhdCB3ZSB3YW50IHRvIGJlIG5vdGlmaWVkIHdoZW4gYSBsb2FkIGlzIGNvbXBsZXRlCisgICAgICAgIGZvciAoaW50IGkgPSBtTG9hZGVycy5zaXplKCktMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIG1Mb2FkZXJzLnZhbHVlQXQoaSkuc3RhcnQoKTsKKyAgICAgICAgfQorICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIHZvaWQgZG9TdG9wKCkgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlN0b3BwaW5nOiAiICsgdGhpcyk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IG1Mb2FkZXJzLnNpemUoKS0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgbUxvYWRlcnMudmFsdWVBdChpKS5zdG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICB9CisgICAgCisgICAgdm9pZCBkb1JldGFpbigpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJSZXRhaW5pbmc6ICIgKyB0aGlzKTsKKworICAgICAgICBtUmV0YWluaW5nID0gdHJ1ZTsKKyAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IG1Mb2FkZXJzLnNpemUoKS0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgbUxvYWRlcnMudmFsdWVBdChpKS5yZXRhaW4oKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIGZpbmlzaFJldGFpbigpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJGaW5pc2hlZCBSZXRhaW5pbmc6ICIgKyB0aGlzKTsKKworICAgICAgICBtUmV0YWluaW5nID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSBtTG9hZGVycy5zaXplKCktMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIG1Mb2FkZXJzLnZhbHVlQXQoaSkuZmluaXNoUmV0YWluKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBkb0Rlc3Ryb3koKSB7CisgICAgICAgIGlmICghbVJldGFpbmluZykgeworICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJEZXN0cm95aW5nIEFjdGl2ZTogIiArIHRoaXMpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Mb2FkZXJzLnNpemUoKS0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIG1Mb2FkZXJzLnZhbHVlQXQoaSkuZGVzdHJveSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkRlc3Ryb3lpbmcgSW5hY3RpdmU6ICIgKyB0aGlzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IG1JbmFjdGl2ZUxvYWRlcnMuc2l6ZSgpLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBtSW5hY3RpdmVMb2FkZXJzLnZhbHVlQXQoaSkuZGVzdHJveSgpOworICAgICAgICB9CisgICAgICAgIG1JbmFjdGl2ZUxvYWRlcnMuY2xlYXIoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVyTWFuYWdpbmdGcmFnbWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvYWRlck1hbmFnaW5nRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjcxMTcwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvYWRlck1hbmFnaW5nRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuTG9hZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogQSBGcmFnbWVudCB0aGF0IGhhcyB1dGlsaXR5IG1ldGhvZHMgZm9yIG1hbmFnaW5nIHtAbGluayBMb2FkZXJ9cy4KKyAqCisgKiBAcGFyYW0gPEQ+IFRoZSB0eXBlIG9mIGRhdGEgcmV0dXJuZWQgYnkgdGhlIExvYWRlci4gSWYgeW91J3JlIHVzaW5nIG11bHRpcGxlIExvYWRlcnMgd2l0aAorICogZGlmZmVyZW50IHJldHVybiB0eXBlcyB1c2UgT2JqZWN0IGFuZCBjYXNlIHRoZSByZXN1bHRzLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTG9hZGVyTWFuYWdpbmdGcmFnbWVudDxEPiBleHRlbmRzIEZyYWdtZW50CisgICAgICAgIGltcGxlbWVudHMgTG9hZGVyLk9uTG9hZENvbXBsZXRlTGlzdGVuZXI8RD4geworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhcnRlZCA9IGZhbHNlOworCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIExvYWRlckluZm88RD4geworICAgICAgICBwdWJsaWMgQnVuZGxlIGFyZ3M7CisgICAgICAgIHB1YmxpYyBMb2FkZXI8RD4gbG9hZGVyOworICAgIH0KKyAgICBwcml2YXRlIEhhc2hNYXA8SW50ZWdlciwgTG9hZGVySW5mbzxEPj4gbUxvYWRlcnM7CisgICAgcHJpdmF0ZSBIYXNoTWFwPEludGVnZXIsIExvYWRlckluZm88RD4+IG1JbmFjdGl2ZUxvYWRlcnM7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBsb2FkZXIgd2l0aCB0aGlzIGFjdGl2aXR5LCByZWdpc3RlcnMgdGhlIGNhbGxiYWNrcyBvbiBpdCwgYW5kIHN0YXJ0cyBpdCBsb2FkaW5nLgorICAgICAqIElmIGEgbG9hZGVyIHdpdGggdGhlIHNhbWUgaWQgaGFzIHByZXZpb3VzbHkgYmVlbiBzdGFydGVkIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBkZXN0cm95ZWQKKyAgICAgKiB3aGVuIHRoZSBuZXcgbG9hZGVyIGNvbXBsZXRlcyBpdCdzIHdvcmsuIFRoZSBjYWxsYmFjayB3aWxsIGJlIGRlbGl2ZXJlZCBiZWZvcmUgdGhlIG9sZCBsb2FkZXIKKyAgICAgKiBpcyBkZXN0cm95ZWQuCisgICAgICovCisgICAgcHVibGljIExvYWRlcjxEPiBzdGFydExvYWRpbmcoaW50IGlkLCBCdW5kbGUgYXJncykgeworICAgICAgICBMb2FkZXJJbmZvPEQ+IGluZm8gPSBtTG9hZGVycy5nZXQoaWQpOworICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBwcmV2aW91cyBpbnN0YW5jZSBvZiB0aGlzIGxvYWRlciBzbyB3ZSBjYW4gZGVzdHJveQorICAgICAgICAgICAgLy8gaXQgd2hlbiB0aGUgbmV3IG9uZSBjb21wbGV0ZXMuCisgICAgICAgICAgICBtSW5hY3RpdmVMb2FkZXJzLnB1dChpZCwgaW5mbyk7CisgICAgICAgIH0KKyAgICAgICAgaW5mbyA9IG5ldyBMb2FkZXJJbmZvPEQ+KCk7CisgICAgICAgIGluZm8uYXJncyA9IGFyZ3M7CisgICAgICAgIG1Mb2FkZXJzLnB1dChpZCwgaW5mbyk7CisgICAgICAgIExvYWRlcjxEPiBsb2FkZXIgPSBvbkNyZWF0ZUxvYWRlcihpZCwgYXJncyk7CisgICAgICAgIGluZm8ubG9hZGVyID0gbG9hZGVyOworICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIC8vIFRoZSBhY3Rpdml0eSB3aWxsIHN0YXJ0IGFsbCBleGlzdGluZyBsb2FkZXJzIGluIGl0J3Mgb25TdGFydCgpLCBzbyBvbmx5IHN0YXJ0IHRoZW0KKyAgICAgICAgICAgIC8vIGhlcmUgaWYgd2UncmUgcGFzdCB0aGF0IHBvaW50IG9mIHRoZSBhY3Rpdml0aXkncyBsaWZlIGN5Y2xlCisgICAgICAgICAgICBsb2FkZXIucmVnaXN0ZXJMaXN0ZW5lcihpZCwgdGhpcyk7CisgICAgICAgICAgICBsb2FkZXIuc3RhcnRMb2FkaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxvYWRlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTG9hZGVyPEQ+IG9uQ3JlYXRlTG9hZGVyKGludCBpZCwgQnVuZGxlIGFyZ3MpOworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uSW5pdGlhbGl6ZUxvYWRlcnMoKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkxvYWRGaW5pc2hlZChMb2FkZXI8RD4gbG9hZGVyLCBEIGRhdGEpOworCisgICAgcHVibGljIGZpbmFsIHZvaWQgb25Mb2FkQ29tcGxldGUoTG9hZGVyPEQ+IGxvYWRlciwgRCBkYXRhKSB7CisgICAgICAgIC8vIE5vdGlmeSBvZiB0aGUgbmV3IGRhdGEgc28gdGhlIGFwcCBjYW4gc3dpdGNoIG91dCB0aGUgb2xkIGRhdGEgYmVmb3JlCisgICAgICAgIC8vIHdlIHRyeSB0byBkZXN0cm95IGl0LgorICAgICAgICBvbkxvYWRGaW5pc2hlZChsb2FkZXIsIGRhdGEpOworCisgICAgICAgIC8vIExvb2sgZm9yIGFuIGluYWN0aXZlIGxvYWRlciBhbmQgZGVzdHJveSBpdCBpZiBmb3VuZAorICAgICAgICBpbnQgaWQgPSBsb2FkZXIuZ2V0SWQoKTsKKyAgICAgICAgTG9hZGVySW5mbzxEPiBpbmZvID0gbUluYWN0aXZlTG9hZGVycy5nZXQoaWQpOworICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICBMb2FkZXI8RD4gb2xkTG9hZGVyID0gaW5mby5sb2FkZXI7CisgICAgICAgICAgICBpZiAob2xkTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvbGRMb2FkZXIuZGVzdHJveSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUluYWN0aXZlTG9hZGVycy5yZW1vdmUoaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRTdGF0ZSk7CisKKyAgICAgICAgaWYgKG1Mb2FkZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIExvb2sgZm9yIGEgcGFzc2VkIGFsb25nIGxvYWRlciBhbmQgY3JlYXRlIGEgbmV3IG9uZSBpZiBpdCdzIG5vdCB0aGVyZQorLy8gVE9ETzogdW5jb21tZW50IG9uY2UgZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSBtZXRob2QgaXMgYXZhaWxhYmxlCisvLyAgICAgICAgICAgIG1Mb2FkZXJzID0gKEhhc2hNYXA8SW50ZWdlciwgTG9hZGVySW5mbz4pIGdldExhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGlmIChtTG9hZGVycyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxvYWRlcnMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBMb2FkZXJJbmZvPEQ+PigpOworICAgICAgICAgICAgICAgIG9uSW5pdGlhbGl6ZUxvYWRlcnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobUluYWN0aXZlTG9hZGVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtSW5hY3RpdmVMb2FkZXJzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgTG9hZGVySW5mbzxEPj4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7CisgICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKKworICAgICAgICAvLyBDYWxsIG91dCB0byBzdWIgY2xhc3NlcyBzbyB0aGV5IGNhbiBzdGFydCB0aGVpciBsb2FkZXJzCisgICAgICAgIC8vIExldCB0aGUgZXhpc3RpbmcgbG9hZGVycyBrbm93IHRoYXQgd2Ugd2FudCB0byBiZSBub3RpZmllZCB3aGVuIGEgbG9hZCBpcyBjb21wbGV0ZQorICAgICAgICBmb3IgKEhhc2hNYXAuRW50cnk8SW50ZWdlciwgTG9hZGVySW5mbzxEPj4gZW50cnkgOiBtTG9hZGVycy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBMb2FkZXJJbmZvPEQ+IGluZm8gPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgTG9hZGVyPEQ+IGxvYWRlciA9IGluZm8ubG9hZGVyOworICAgICAgICAgICAgaW50IGlkID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBpZiAobG9hZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgIGxvYWRlciA9IG9uQ3JlYXRlTG9hZGVyKGlkLCBpbmZvLmFyZ3MpOworICAgICAgICAgICAgICAgaW5mby5sb2FkZXIgPSBsb2FkZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2FkZXIucmVnaXN0ZXJMaXN0ZW5lcihpZCwgdGhpcyk7CisgICAgICAgICAgICBsb2FkZXIuc3RhcnRMb2FkaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdG9wKCkgeworICAgICAgICBzdXBlci5vblN0b3AoKTsKKworICAgICAgICBmb3IgKEhhc2hNYXAuRW50cnk8SW50ZWdlciwgTG9hZGVySW5mbzxEPj4gZW50cnkgOiBtTG9hZGVycy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBMb2FkZXJJbmZvPEQ+IGluZm8gPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgTG9hZGVyPEQ+IGxvYWRlciA9IGluZm8ubG9hZGVyOworICAgICAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIExldCB0aGUgbG9hZGVyIGtub3cgd2UncmUgZG9uZSB3aXRoIGl0CisgICAgICAgICAgICBsb2FkZXIudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOworCisgICAgICAgICAgICAvLyBUaGUgbG9hZGVyIGlzbid0IGdldHRpbmcgcGFzc2VkIGFsb25nIHRvIHRoZSBuZXh0IGluc3RhbmNlIHNvIGFzayBpdCB0byBzdG9wIGxvYWRpbmcKKyAgICAgICAgICAgIGlmICghZ2V0QWN0aXZpdHkoKS5pc0NoYW5naW5nQ29uZmlndXJhdGlvbnMoKSkgeworICAgICAgICAgICAgICAgIGxvYWRlci5zdG9wTG9hZGluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKiBUTyBETzogVGhpcyBuZWVkcyB0byBiZSB0dXJuZWQgaW50byBhIHJldGFpbmVkIGZyYWdtZW50LgorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3Qgb25SZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2UoKSB7CisgICAgICAgIC8vIFBhc3MgdGhlIGxvYWRlciBhbG9uZyB0byB0aGUgbmV4dCBndXkKKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG1Mb2FkZXJzOworICAgICAgICBtTG9hZGVycyA9IG51bGw7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgICoqLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKworICAgICAgICBpZiAobUxvYWRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChIYXNoTWFwLkVudHJ5PEludGVnZXIsIExvYWRlckluZm88RD4+IGVudHJ5IDogbUxvYWRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIExvYWRlckluZm88RD4gaW5mbyA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgTG9hZGVyPEQ+IGxvYWRlciA9IGluZm8ubG9hZGVyOworICAgICAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9hZGVyLmRlc3Ryb3koKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3BzIGFuZCByZW1vdmVzIHRoZSBsb2FkZXIgd2l0aCB0aGUgZ2l2ZW4gSUQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcExvYWRpbmcoaW50IGlkKSB7CisgICAgICAgIGlmIChtTG9hZGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBMb2FkZXJJbmZvPEQ+IGluZm8gPSBtTG9hZGVycy5yZW1vdmUoaWQpOworICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvYWRlcjxEPiBsb2FkZXIgPSBpbmZvLmxvYWRlcjsKKyAgICAgICAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyLmRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBMb2FkZXIgd2l0aCB0aGUgZ2l2ZW4gaWQgb3IgbnVsbCBpZiBubyBtYXRjaGluZyBMb2FkZXIKKyAgICAgKiBpcyBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9hZGVyPEQ+IGdldExvYWRlcihpbnQgaWQpIHsKKyAgICAgICAgTG9hZGVySW5mbzxEPiBsb2FkZXJJbmZvID0gbUxvYWRlcnMuZ2V0KGlkKTsKKyAgICAgICAgaWYgKGxvYWRlckluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2FkZXJzLmdldChpZCkubG9hZGVyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2NhbEFjdGl2aXR5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvY2FsQWN0aXZpdHlNYW5hZ2VyLmphdmEKaW5kZXggYTI0ZmNhZS4uNTI0ZGU2ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvY2FsQWN0aXZpdHlNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvY2FsQWN0aXZpdHlNYW5hZ2VyLmphdmEKQEAgLTIwLDEzICsyMCwxMSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAvKioKQEAgLTM4LDcgKzM2LDcgQEAKICAqLwogcHVibGljIGNsYXNzIExvY2FsQWN0aXZpdHlNYW5hZ2VyIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkxvY2FsQWN0aXZpdHlNYW5hZ2VyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGxvY2FsTE9HViA9IGZhbHNlIHx8IENvbmZpZy5MT0dWOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gbG9jYWxMT0dWID0gZmFsc2U7CiAKICAgICAvLyBJbnRlcm5hbCB0b2tlbiBmb3IgYW4gQWN0aXZpdHkgYmVpbmcgbWFuYWdlZCBieSBMb2NhbEFjdGl2aXR5TWFuYWdlci4KICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2NhbEFjdGl2aXR5UmVjb3JkIGV4dGVuZHMgQmluZGVyIHsKQEAgLTExMiwxMSArMTEwLDE2IEBACiAgICAgICAgIAogICAgICAgICBpZiAoci5jdXJTdGF0ZSA9PSBJTklUSUFMSVpJTkcpIHsKICAgICAgICAgICAgIC8vIEdldCB0aGUgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSBmb3IgdGhlIGFjdGl2aXR5Ci0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZyxPYmplY3Q+IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzID0KLSAgICAgICAgICAgICAgICBtUGFyZW50LmdldExhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKTsKLSAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZSA9IG51bGw7CisgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9CisgICAgICAgICAgICAgICAgICAgIG1QYXJlbnQuZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpOworICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlT2JqID0gbnVsbDsKICAgICAgICAgICAgIGlmIChsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5nZXQoci5pZCk7CisgICAgICAgICAgICAgICAgaW5zdGFuY2VPYmogPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5nZXQoci5pZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3Rpdml0eS5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzIGluc3RhbmNlID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChpbnN0YW5jZU9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgQWN0aXZpdHkuTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcygpOworICAgICAgICAgICAgICAgIGluc3RhbmNlLmFjdGl2aXR5ID0gaW5zdGFuY2VPYmo7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gaGF2ZSBhbHdheXMgY3JlYXRlZCB0aGUgYWN0aXZpdHkuCkBAIC0zNDYsNyArMzQ5LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIFdpbmRvdyBwZXJmb3JtRGVzdHJveShMb2NhbEFjdGl2aXR5UmVjb3JkIHIsIGJvb2xlYW4gZmluaXNoKSB7Ci0gICAgICAgIFdpbmRvdyB3aW4gPSBudWxsOworICAgICAgICBXaW5kb3cgd2luOwogICAgICAgICB3aW4gPSByLndpbmRvdzsKICAgICAgICAgaWYgKHIuY3VyU3RhdGUgPT0gUkVTVU1FRCAmJiAhZmluaXNoKSB7CiAgICAgICAgICAgICBwZXJmb3JtUGF1c2UociwgZmluaXNoKTsKQEAgLTM4MCw3ICszODMsOCBAQAogICAgICAgICBpZiAociAhPSBudWxsKSB7CiAgICAgICAgICAgICB3aW4gPSBwZXJmb3JtRGVzdHJveShyLCBmaW5pc2gpOwogICAgICAgICAgICAgaWYgKGZpbmlzaCkgewotICAgICAgICAgICAgICAgIG1BY3Rpdml0aWVzLnJlbW92ZShyKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZpdGllcy5yZW1vdmUoaWQpOworICAgICAgICAgICAgICAgIG1BY3Rpdml0eUFycmF5LnJlbW92ZShyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gd2luOwpAQCAtNDQxLDEwICs0NDUsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQ3JlYXRlKEJ1bmRsZSBzdGF0ZSkgewogICAgICAgICBpZiAoc3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8U3RyaW5nPiBpID0gc3RhdGUua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBzdGF0ZS5rZXlTZXQoKSkgewogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGkubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgYXN0YXRlID0gc3RhdGUuZ2V0QnVuZGxlKGlkKTsKICAgICAgICAgICAgICAgICAgICAgTG9jYWxBY3Rpdml0eVJlY29yZCByID0gbUFjdGl2aXRpZXMuZ2V0KGlkKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCkgewpAQCAtNDU3LDkgKzQ1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAvLyBSZWNvdmVyIGZyb20gLWFsbC0gYXBwIGVycm9ycy4KLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIHRocm93biB3aGVuIHJlc3RvcmluZyBMb2NhbEFjdGl2aXR5TWFuYWdlciBzdGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGUpOworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gdGhyb3duIHdoZW4gcmVzdG9yaW5nIExvY2FsQWN0aXZpdHlNYW5hZ2VyIHN0YXRlIiwgZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTm90aWZpY2F0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTm90aWZpY2F0aW9uLmphdmEKaW5kZXggODU2OTQzZC4uZTYwMjUxOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL05vdGlmaWNhdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Ob3RpZmljYXRpb24uamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CkBAIC0xMTYsMTYgKzExNyw1NSBAQAogICAgICAqIElmIHRoaXMgZmFjaWxpdHkgaXMgdXNlZCBmb3Igc29tZXRoaW5nIGVsc2UsIHBsZWFzZSBnaXZlIHRoZSB1c2VyIGFuIG9wdGlvbgogICAgICAqIHRvIHR1cm4gaXQgb2ZmIGFuZCB1c2UgYSBub3JtYWwgbm90aWZpY2F0aW9uLCBhcyB0aGlzIGNhbiBiZSBleHRyZW1lbHkKICAgICAgKiBkaXNydXB0aXZlLgorICAgICAqIAorICAgICAqIDxwPlVzZSB3aXRoIHtAbGluayAjRkxBR19ISUdIX1BSSU9SSVRZfSB0byBlbnN1cmUgdGhhdCB0aGlzIG5vdGlmaWNhdGlvbgorICAgICAqIHdpbGwgcmVhY2ggdGhlIHVzZXIgZXZlbiB3aGVuIG90aGVyIG5vdGlmaWNhdGlvbnMgYXJlIHN1cHByZXNzZWQuCiAgICAgICovCiAgICAgcHVibGljIFBlbmRpbmdJbnRlbnQgZnVsbFNjcmVlbkludGVudDsKIAogICAgIC8qKgogICAgICAqIFRleHQgdG8gc2Nyb2xsIGFjcm9zcyB0aGUgc2NyZWVuIHdoZW4gdGhpcyBpdGVtIGlzIGFkZGVkIHRvCi0gICAgICogdGhlIHN0YXR1cyBiYXIuCisgICAgICogdGhlIHN0YXR1cyBiYXIgb24gbGFyZ2UgYW5kIHNtYWxsZXIgZGV2aWNlcy4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgZmllbGQgaXMgcHJvdmlkZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBvdGhlciB0aWNrZXIgZmllbGRzCisgICAgICogYm90aCBmb3IgY29tcGF0aWJpbGl0eSBhbmQgdG8gYWxsb3cgYW4gYXBwbGljYXRpb24gdG8gY2hvb3NlIGRpZmZlcmVudAorICAgICAqIHRleHQgZm9yIHdoZW4gdGhlIHRleHQgc2Nyb2xscyBpbiBhbmQgd2hlbiBpdCBpcyBkaXNwbGF5ZWQgYWxsIGF0IG9uY2UKKyAgICAgKiBpbiBjb25qdW5jdGlvbiB3aXRoIG9uZSBvciBtb3JlIGljb25zLgorICAgICAqCisgICAgICogQHNlZSAjdGlja2VyVGl0bGUKKyAgICAgKiBAc2VlICN0aWNrZXJTdWJ0aXRsZQorICAgICAqIEBzZWUgI3RpY2tlckljb25zCiAgICAgICovCiAgICAgcHVibGljIENoYXJTZXF1ZW5jZSB0aWNrZXJUZXh0OwogCiAgICAgLyoqCisgICAgICogVGhlIHRpdGxlIGxpbmUgZm9yIHRoZSB0aWNrZXIgb3ZlciBhIHRoZSBmYXQgc3RhdHVzIGJhciBvbiB4bGFyZ2UgZGV2aWNlcy4KKyAgICAgKgorICAgICAqIEBzZWUgI3RpY2tlclRleHQKKyAgICAgKiBAc2VlICN0aWNrZXJTdWJ0aXRsZQorICAgICAqIEBzZWUgI3RpY2tlckljb25zCisgICAgICovCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSB0aWNrZXJUaXRsZTsKKworICAgIC8qKgorICAgICAqIFRoZSBzdWJ0aXRsZSBsaW5lIGZvciB0aGUgdGlja2VyIG92ZXIgYSB0aGUgZmF0IHN0YXR1cyBiYXIgb24geGxhcmdlIGRldmljZXMuCisgICAgICoKKyAgICAgKiBAc2VlICN0aWNrZXJUZXh0CisgICAgICogQHNlZSAjdGlja2VyVGl0bGUKKyAgICAgKiBAc2VlICN0aWNrZXJJY29ucworICAgICAqLworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgdGlja2VyU3VidGl0bGU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaWNvbnMgdG8gc2hvdyB0byB0aGUgbGVmdCBvZiB0aGUgb3RoZXIgdGlja2VyIGZpZWxkcy4KKyAgICAgKgorICAgICAqIEBzZWUgI3RpY2tlclRleHQKKyAgICAgKiBAc2VlICN0aWNrZXJUaXRsZQorICAgICAqIEBzZWUgI3RpY2tlclN1YnRpdGxlCisgICAgICovCisgICAgcHVibGljIEJpdG1hcFtdIHRpY2tlckljb25zOworCisgICAgLyoqCiAgICAgICogVGhlIHZpZXcgdGhhdCB3aWxsIHJlcHJlc2VudCB0aGlzIG5vdGlmaWNhdGlvbiBpbiB0aGUgZXhwYW5kZWQgc3RhdHVzIGJhci4KICAgICAgKi8KICAgICBwdWJsaWMgUmVtb3RlVmlld3MgY29udGVudFZpZXc7CkBAIC0yNzUsNiArMzE1LDE0IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GT1JFR1JPVU5EX1NFUlZJQ0UgPSAweDAwMDAwMDQwOwogCisgICAgLyoqCisgICAgICogQml0IHRvIGJlIGJpdHdpc2Utb3JlZCBpbnRvIHRoZSB7QGxpbmsgI2ZsYWdzfSBmaWVsZCB0aGF0IHNob3VsZCBiZSBzZXQgaWYgdGhpcyBub3RpZmljYXRpb24KKyAgICAgKiByZXByZXNlbnRzIGEgaGlnaC1wcmlvcml0eSBldmVudCB0aGF0IG1heSBiZSBzaG93biB0byB0aGUgdXNlciBldmVuIGlmIG5vdGlmaWNhdGlvbnMgYXJlCisgICAgICogb3RoZXJ3aXNlIHVuYXZhaWxhYmxlICh0aGF0IGlzLCB3aGVuIHRoZSBzdGF0dXMgYmFyIGlzIGhpZGRlbikuIFRoaXMgZmxhZyBpcyBpZGVhbGx5IHVzZWQKKyAgICAgKiBpbiBjb25qdW5jdGlvbiB3aXRoIHtAbGluayAjZnVsbFNjcmVlbkludGVudH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ISUdIX1BSSU9SSVRZID0gMHgwMDAwMDA4MDsKKwogICAgIHB1YmxpYyBpbnQgZmxhZ3M7CiAKICAgICAvKioKQEAgLTMzNiw2ICszODQsMjEgQEAKICAgICAgICAgICAgIHRpY2tlclRleHQgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocGFyY2VsKTsKICAgICAgICAgfQogICAgICAgICBpZiAocGFyY2VsLnJlYWRJbnQoKSAhPSAwKSB7CisgICAgICAgICAgICB0aWNrZXJUaXRsZSA9IFRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwYXJjZWwpOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJjZWwucmVhZEludCgpICE9IDApIHsKKyAgICAgICAgICAgIHRpY2tlclN1YnRpdGxlID0gVGV4dFV0aWxzLkNIQVJfU0VRVUVOQ0VfQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IHRpY2tlckljb25Db3VudCA9IHBhcmNlbC5yZWFkSW50KCk7CisgICAgICAgIGlmICh0aWNrZXJJY29uQ291bnQgPj0gMCkgeworICAgICAgICAgICAgdGlja2VySWNvbnMgPSBuZXcgQml0bWFwW3RpY2tlckljb25Db3VudF07CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8dGlja2VySWNvbkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocGFyY2VsLnJlYWRJbnQoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRpY2tlckljb25zW2ldID0gQml0bWFwLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwYXJjZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocGFyY2VsLnJlYWRJbnQoKSAhPSAwKSB7CiAgICAgICAgICAgICBjb250ZW50VmlldyA9IFJlbW90ZVZpZXdzLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwYXJjZWwpOwogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHRzID0gcGFyY2VsLnJlYWRJbnQoKTsKQEAgLTM3MSw2ICs0MzQsMTkgQEAKICAgICAgICAgaWYgKHRoaXMudGlja2VyVGV4dCAhPSBudWxsKSB7CiAgICAgICAgICAgICB0aGF0LnRpY2tlclRleHQgPSB0aGlzLnRpY2tlclRleHQudG9TdHJpbmcoKTsKICAgICAgICAgfQorICAgICAgICBpZiAodGhpcy50aWNrZXJUaXRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGF0LnRpY2tlclRpdGxlID0gdGhpcy50aWNrZXJUaXRsZS50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLnRpY2tlclN1YnRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoYXQudGlja2VyU3VidGl0bGUgPSB0aGlzLnRpY2tlclN1YnRpdGxlLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMudGlja2VySWNvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgaW50IE4gPSB0aGlzLnRpY2tlckljb25zLmxlbmd0aDsKKyAgICAgICAgICAgIHRoYXQudGlja2VySWNvbnMgPSBuZXcgQml0bWFwW05dOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIHRoYXQudGlja2VySWNvbnNbaV0gPSBCaXRtYXAuY3JlYXRlQml0bWFwKHRoaXMudGlja2VySWNvbnNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRWaWV3ICE9IG51bGwpIHsKICAgICAgICAgICAgIHRoYXQuY29udGVudFZpZXcgPSB0aGlzLmNvbnRlbnRWaWV3LmNsb25lKCk7CiAgICAgICAgIH0KQEAgLTQyNyw2ICs1MDMsMzIgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHBhcmNlbC53cml0ZUludCgwKTsKICAgICAgICAgfQorICAgICAgICBpZiAodGlja2VyVGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcGFyY2VsLndyaXRlSW50KDEpOworICAgICAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwodGlja2VyVGl0bGUsIHBhcmNlbCwgZmxhZ3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyY2VsLndyaXRlSW50KDApOworICAgICAgICB9CisgICAgICAgIGlmICh0aWNrZXJTdWJ0aXRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBwYXJjZWwud3JpdGVJbnQoMSk7CisgICAgICAgICAgICBUZXh0VXRpbHMud3JpdGVUb1BhcmNlbCh0aWNrZXJTdWJ0aXRsZSwgcGFyY2VsLCBmbGFncyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXJjZWwud3JpdGVJbnQoMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRpY2tlckljb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gdGlja2VySWNvbnMubGVuZ3RoOworICAgICAgICAgICAgcGFyY2VsLndyaXRlSW50KE4pOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIGlmICh0aWNrZXJJY29uc1tpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmNlbC53cml0ZUludCgxKTsKKyAgICAgICAgICAgICAgICAgICAgdGlja2VySWNvbnNbaV0ud3JpdGVUb1BhcmNlbChwYXJjZWwsIGZsYWdzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwYXJjZWwud3JpdGVJbnQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyY2VsLndyaXRlSW50KC0xKTsKKyAgICAgICAgfQogICAgICAgICBpZiAoY29udGVudFZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgcGFyY2VsLndyaXRlSW50KDEpOwogICAgICAgICAgICAgY29udGVudFZpZXcud3JpdGVUb1BhcmNlbChwYXJjZWwsIDApOwpAQCAtNTQzLDYgKzY0NSw5IEBACiAgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKHRoaXMuZGVmYXVsdHMpKTsKICAgICAgICAgc2IuYXBwZW5kKCIsZmxhZ3M9MHgiKTsKICAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcodGhpcy5mbGFncykpOworICAgICAgICBpZiAoKHRoaXMuZmxhZ3MgJiBGTEFHX0hJR0hfUFJJT1JJVFkpICE9IDApIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiISEhMSFvbmUhIik7CisgICAgICAgIH0KICAgICAgICAgc2IuYXBwZW5kKCIpIik7CiAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Qcm9ncmVzc0RpYWxvZy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1Byb2dyZXNzRGlhbG9nLmphdmEKaW5kZXggYmRlYTA2OS4uMDdhNWEyMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1Byb2dyZXNzRGlhbG9nLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1Byb2dyZXNzRGlhbG9nLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwpAQCAtNzMsNyArNzQsMTAgQEAKICAgICBwcml2YXRlIEhhbmRsZXIgbVZpZXdVcGRhdGVIYW5kbGVyOwogICAgIAogICAgIHB1YmxpYyBQcm9ncmVzc0RpYWxvZyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0RpYWxvZ19BbGVydCk7CisgICAgICAgIHRoaXMoY29udGV4dCwKKyAgICAgICAgICAgICAgICBjb250ZXh0LmdldEFwcGxpY2F0aW9uSW5mbygpLnRhcmdldFNka1ZlcnNpb24gPj0gQnVpbGQuVkVSU0lPTl9DT0RFUy5IT05FWUNPTUIKKyAgICAgICAgICAgICAgICA/IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfSG9sb19EaWFsb2dfQWxlcnQKKyAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfRGlhbG9nX0FsZXJ0KTsKICAgICB9CiAKICAgICBwdWJsaWMgUHJvZ3Jlc3NEaWFsb2coQ29udGV4dCBjb250ZXh0LCBpbnQgdGhlbWUpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9TZWFyY2hEaWFsb2cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9TZWFyY2hEaWFsb2cuamF2YQppbmRleCAxZjExNWU4Li4xODYwMmRmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvU2VhcmNoRGlhbG9nLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1NlYXJjaERpYWxvZy5qYXZhCkBAIC0xMDgzLDcgKzEwODMsNyBAQAogICAgIHByb3RlY3RlZCB2b2lkIGxhdW5jaFF1ZXJ5U2VhcmNoKGludCBhY3Rpb25LZXksIFN0cmluZyBhY3Rpb25Nc2cpICB7CiAgICAgICAgIFN0cmluZyBxdWVyeSA9IG1TZWFyY2hBdXRvQ29tcGxldGUuZ2V0VGV4dCgpLnRvU3RyaW5nKCk7CiAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBJbnRlbnQuQUNUSU9OX1NFQVJDSDsKLSAgICAgICAgSW50ZW50IGludGVudCA9IGNyZWF0ZUludGVudChhY3Rpb24sIG51bGwsIG51bGwsIHF1ZXJ5LCBudWxsLAorICAgICAgICBJbnRlbnQgaW50ZW50ID0gY3JlYXRlSW50ZW50KGFjdGlvbiwgbnVsbCwgbnVsbCwgcXVlcnksCiAgICAgICAgICAgICAgICAgYWN0aW9uS2V5LCBhY3Rpb25Nc2cpOwogICAgICAgICBsYXVuY2hJbnRlbnQoaW50ZW50KTsKICAgICB9CkBAIC0xMTg1LDExICsxMTg1LDYgQEAKICAgICAgICAgICAgIC8vIHVzZSBzcGVjaWZpYyBhY3Rpb24gaWYgc3VwcGxpZWQsIG9yIGRlZmF1bHQgYWN0aW9uIGlmIHN1cHBsaWVkLCBvciBmaXhlZCBkZWZhdWx0CiAgICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gZ2V0Q29sdW1uU3RyaW5nKGMsIFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fSU5URU5UX0FDVElPTik7CiAKLSAgICAgICAgICAgIC8vIHNvbWUgaXRlbXMgYXJlIGRpc3BsYXkgb25seSwgb3IgaGF2ZSBlZmZlY3QgdmlhIHRoZSBjdXJzb3IgcmVzcG9uZCBjbGljayByZXBvcnRpbmcuCi0gICAgICAgICAgICBpZiAoU2VhcmNoTWFuYWdlci5JTlRFTlRfQUNUSU9OX05PTkUuZXF1YWxzKGFjdGlvbikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgYWN0aW9uID0gbVNlYXJjaGFibGUuZ2V0U3VnZ2VzdEludGVudEFjdGlvbigpOwogICAgICAgICAgICAgfQpAQCAtMTIxMSwxNCArMTIwNiwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgVXJpIGRhdGFVcmkgPSAoZGF0YSA9PSBudWxsKSA/IG51bGwgOiBVcmkucGFyc2UoZGF0YSk7CiAKLSAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnROYW1lID0gZ2V0Q29sdW1uU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBjLCBTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX0lOVEVOVF9DT01QT05FTlRfTkFNRSk7Ci0KICAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9IGdldENvbHVtblN0cmluZyhjLCBTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX1FVRVJZKTsKICAgICAgICAgICAgIFN0cmluZyBleHRyYURhdGEgPSBnZXRDb2x1bW5TdHJpbmcoYywgU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9JTlRFTlRfRVhUUkFfREFUQSk7CiAKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnRlbnQoYWN0aW9uLCBkYXRhVXJpLCBleHRyYURhdGEsIHF1ZXJ5LCBjb21wb25lbnROYW1lLCBhY3Rpb25LZXksCi0gICAgICAgICAgICAgICAgICAgIGFjdGlvbk1zZyk7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlSW50ZW50KGFjdGlvbiwgZGF0YVVyaSwgZXh0cmFEYXRhLCBxdWVyeSwgYWN0aW9uS2V5LCBhY3Rpb25Nc2cpOwogICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUgKSB7CiAgICAgICAgICAgICBpbnQgcm93TnVtOwogICAgICAgICAgICAgdHJ5IHsgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlIHJlYWxseSBwYXJhbm9pZCBub3cKQEAgLTEyMzksNyArMTIzMCw2IEBACiAgICAgICogQHBhcmFtIGRhdGEgSW50ZW50IGRhdGEsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgogICAgICAqIEBwYXJhbSBleHRyYURhdGEgRGF0YSBmb3Ige0BsaW5rIFNlYXJjaE1hbmFnZXIjRVhUUkFfREFUQV9LRVl9IG9yIDxjb2RlPm51bGw8L2NvZGU+LgogICAgICAqIEBwYXJhbSBxdWVyeSBJbnRlbnQgcXVlcnksIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBwYXJhbSBjb21wb25lbnROYW1lIERhdGEgZm9yIHtAbGluayBTZWFyY2hNYW5hZ2VyI0NPTVBPTkVOVF9OQU1FX0tFWX0gb3IgPGNvZGU+bnVsbDwvY29kZT4uCiAgICAgICogQHBhcmFtIGFjdGlvbktleSBUaGUga2V5IGNvZGUgb2YgdGhlIGFjdGlvbiBrZXkgdGhhdCB3YXMgcHJlc3NlZCwKICAgICAgKiAgICAgICAgb3Ige0BsaW5rIEtleUV2ZW50I0tFWUNPREVfVU5LTk9XTn0gaWYgbm9uZS4KICAgICAgKiBAcGFyYW0gYWN0aW9uTXNnIFRoZSBtZXNzYWdlIGZvciB0aGUgYWN0aW9uIGtleSB0aGF0IHdhcyBwcmVzc2VkLApAQCAtMTI0OSw3ICsxMjM5LDcgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBpbnRlbnQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBJbnRlbnQgY3JlYXRlSW50ZW50KFN0cmluZyBhY3Rpb24sIFVyaSBkYXRhLCBTdHJpbmcgZXh0cmFEYXRhLCBTdHJpbmcgcXVlcnksCi0gICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50TmFtZSwgaW50IGFjdGlvbktleSwgU3RyaW5nIGFjdGlvbk1zZykgeworICAgICAgICAgICAgaW50IGFjdGlvbktleSwgU3RyaW5nIGFjdGlvbk1zZykgewogICAgICAgICAvLyBOb3cgYnVpbGQgdGhlIEludGVudAogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChhY3Rpb24pOwogICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1NlYXJjaE1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9TZWFyY2hNYW5hZ2VyLmphdmEKaW5kZXggMmU5Y2Q5Ni4uNjcxNTAxMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1NlYXJjaE1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvU2VhcmNoTWFuYWdlci5qYXZhCkBAIC0xNiwxNiArMTYsMTIgQEAKIAogcGFja2FnZSBhbmRyb2lkLmFwcDsKIAotaW1wb3J0IGFuZHJvaWQuTWFuaWZlc3Q7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKQEAgLTQwLDcgKzM2LDcgQEAKIAogLyoqCiAgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgc3lzdGVtIHNlYXJjaCBzZXJ2aWNlcy4KLSAqIAorICoKICAqIDxwPkluIHByYWN0aWNlLCB5b3Ugd29uJ3QgaW50ZXJhY3Qgd2l0aCB0aGlzIGNsYXNzIGRpcmVjdGx5LCBhcyBzZWFyY2gKICAqIHNlcnZpY2VzIGFyZSBwcm92aWRlZCB0aHJvdWdoIG1ldGhvZHMgaW4ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5IEFjdGl2aXR5fQogICogYW5kIHRoZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudCNBQ1RJT05fU0VBUkNIIEFDVElPTl9TRUFSQ0h9CkBAIC01Niw3ICs1Miw3IEBACiAgKiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3NlYXJjaC9pbmRleC5odG1sIj5TZWFyY2g8L2E+PC9zdHJvbmc+LjwvcD4KICAqIDwvZGl2PgogICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoTWFuYWdlciAKK3B1YmxpYyBjbGFzcyBTZWFyY2hNYW5hZ2VyCiAgICAgICAgIGltcGxlbWVudHMgRGlhbG9nSW50ZXJmYWNlLk9uRGlzbWlzc0xpc3RlbmVyLCBEaWFsb2dJbnRlcmZhY2UuT25DYW5jZWxMaXN0ZW5lcgogewogCkBAIC02NSwyMCArNjEsMjAgQEAKIAogICAgIC8qKgogICAgICAqIFRoaXMgaXMgYSBzaG9ydGN1dCBkZWZpbml0aW9uIGZvciB0aGUgZGVmYXVsdCBtZW51IGtleSB0byB1c2UgZm9yIGludm9raW5nIHNlYXJjaC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIFNlZSBNZW51Lkl0ZW0uc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyIE1FTlVfS0VZID0gJ3MnOwogCiAgICAgLyoqCiAgICAgICogVGhpcyBpcyBhIHNob3J0Y3V0IGRlZmluaXRpb24gZm9yIHRoZSBkZWZhdWx0IG1lbnUga2V5IHRvIHVzZSBmb3IgaW52b2tpbmcgc2VhcmNoLgotICAgICAqIAorICAgICAqCiAgICAgICogU2VlIE1lbnUuSXRlbS5zZXRBbHBoYWJldGljU2hvcnRjdXQoKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBNRU5VX0tFWUNPREUgPSBLZXlFdmVudC5LRVlDT0RFX1M7CiAKICAgICAvKioKLSAgICAgKiBJbnRlbnQgZXh0cmEgZGF0YSBrZXk6IFVzZSB0aGlzIGtleSB3aXRoIAorICAgICAqIEludGVudCBleHRyYSBkYXRhIGtleTogVXNlIHRoaXMga2V5IHdpdGgKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudCNnZXRTdHJpbmdFeHRyYQogICAgICAqICBjb250ZW50LkludGVudC5nZXRTdHJpbmdFeHRyYSgpfQogICAgICAqIHRvIG9idGFpbiB0aGUgcXVlcnkgc3RyaW5nIGZyb20gSW50ZW50LkFDVElPTl9TRUFSQ0guCkBAIC0xMDMsNyArOTksNyBAQAogICAgICAqIEludGVudCBleHRyYSBkYXRhIGtleTogVXNlIHRoaXMga2V5IHdpdGggSW50ZW50LkFDVElPTl9TRUFSQ0ggYW5kCiAgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5JbnRlbnQjZ2V0QnVuZGxlRXh0cmEKICAgICAgKiAgY29udGVudC5JbnRlbnQuZ2V0QnVuZGxlRXh0cmEoKX0KLSAgICAgKiB0byBvYnRhaW4gYW55IGFkZGl0aW9uYWwgYXBwLXNwZWNpZmljIGRhdGEgdGhhdCB3YXMgaW5zZXJ0ZWQgYnkgdGhlIAorICAgICAqIHRvIG9idGFpbiBhbnkgYWRkaXRpb25hbCBhcHAtc3BlY2lmaWMgZGF0YSB0aGF0IHdhcyBpbnNlcnRlZCBieSB0aGUKICAgICAgKiBhY3Rpdml0eSB0aGF0IGxhdW5jaGVkIHRoZSBzZWFyY2guCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVBQX0RBVEEgPSAiYXBwX2RhdGEiOwpAQCAtMTI3LDcgKzEyMyw3IEBACiAgICAgICogZmlsZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fS0VZID0gImFjdGlvbl9rZXkiOwotICAgIAorCiAgICAgLyoqCiAgICAgICogSW50ZW50IGV4dHJhIGRhdGEga2V5OiBUaGlzIGtleSB3aWxsIGJlIHVzZWQgZm9yIHRoZSBleHRyYSBwb3B1bGF0ZWQgYnkgdGhlCiAgICAgICoge0BsaW5rICNTVUdHRVNUX0NPTFVNTl9JTlRFTlRfRVhUUkFfREFUQX0gY29sdW1uLgpAQCAtMTUzLDExICsxNDksMTkgQEAKICAgICAgKiBJbnRlbnQgZXh0cmEgZGF0YSBrZXk6IFVzZSB0aGlzIGtleSB3aXRoIEludGVudC5BQ1RJT05fU0VBUkNIIGFuZAogICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50I2dldFN0cmluZ0V4dHJhIGNvbnRlbnQuSW50ZW50LmdldFN0cmluZ0V4dHJhKCl9CiAgICAgICogdG8gb2J0YWluIHRoZSBhY3Rpb24gbWVzc2FnZSB0aGF0IHdhcyBkZWZpbmVkIGZvciBhIHBhcnRpY3VsYXIgc2VhcmNoIGFjdGlvbiBrZXkgYW5kL29yCi0gICAgICogc3VnZ2VzdGlvbi4gIEl0IHdpbGwgYmUgbnVsbCBpZiB0aGUgc2VhcmNoIHdhcyBsYXVuY2hlZCBieSB0eXBpbmcgImVudGVyIiwgdG91Y2hlZCB0aGUgdGhlIAotICAgICAqICJHTyIgYnV0dG9uLCBvciBvdGhlciBtZWFucyBub3QgaW52b2x2aW5nIGFueSBhY3Rpb24ga2V5LiAKKyAgICAgKiBzdWdnZXN0aW9uLiAgSXQgd2lsbCBiZSBudWxsIGlmIHRoZSBzZWFyY2ggd2FzIGxhdW5jaGVkIGJ5IHR5cGluZyAiZW50ZXIiLCB0b3VjaGVkIHRoZSB0aGUKKyAgICAgKiAiR08iIGJ1dHRvbiwgb3Igb3RoZXIgbWVhbnMgbm90IGludm9sdmluZyBhbnkgYWN0aW9uIGtleS4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTVNHID0gImFjdGlvbl9tc2ciOwotICAgIAorCisgICAgLyoqCisgICAgICogRmxhZyB0byBzcGVjaWZ5IHRoYXQgdGhlIGVudHJ5IGNhbiBiZSB1c2VkIGZvciBxdWVyeSByZWZpbmVtZW50LCBpLmUuLCB0aGUgcXVlcnkgdGV4dAorICAgICAqIGluIHRoZSBzZWFyY2ggZmllbGQgY2FuIGJlIHJlcGxhY2VkIHdpdGggdGhlIHRleHQgaW4gdGhpcyBlbnRyeSwgd2hlbiBhIHF1ZXJ5IHJlZmluZW1lbnQKKyAgICAgKiBpY29uIGlzIGNsaWNrZWQuIFRoZSBzdWdnZXN0aW9uIGxpc3Qgc2hvdWxkIHNob3cgc3VjaCBhIGNsaWNrYWJsZSBpY29uIGJlc2lkZSB0aGUgZW50cnkuCisgICAgICogPHA+VXNlIHRoaXMgZmxhZyBhcyBhIGJpdC1maWVsZCBmb3Ige0BsaW5rICNTVUdHRVNUX0NPTFVNTl9GTEFHU30uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRkxBR19RVUVSWV9SRUZJTkVNRU5UID0gMSA8PCAwOworCiAgICAgLyoqCiAgICAgICogVXJpIHBhdGggZm9yIHF1ZXJpZWQgc3VnZ2VzdGlvbnMgZGF0YS4gIFRoaXMgaXMgdGhlIHBhdGggdGhhdCB0aGUgc2VhcmNoIG1hbmFnZXIKICAgICAgKiB3aWxsIHVzZSB3aGVuIHF1ZXJ5aW5nIHlvdXIgY29udGVudCBwcm92aWRlciBmb3Igc3VnZ2VzdGlvbnMgZGF0YSBiYXNlZCBvbiB1c2VyIGlucHV0CkBAIC0xODIsMTIgKzE4NiwxMiBAQAogICAgICAqIEBzZWUgI1NVR0dFU1RfQ09MVU1OX1NIT1JUQ1VUX0lECiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VHR0VTVF9VUklfUEFUSF9TSE9SVENVVCA9ICJzZWFyY2hfc3VnZ2VzdF9zaG9ydGN1dCI7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBNSU1FIHR5cGUgZm9yIHNob3J0Y3V0IHZhbGlkYXRpb24uICBZb3UnbGwgdXNlIHRoaXMgaW4geW91ciBzdWdnZXN0aW9ucyBjb250ZW50IHByb3ZpZGVyCiAgICAgICogaW4gdGhlIGdldFR5cGUoKSBmdW5jdGlvbi4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTSE9SVENVVF9NSU1FX1RZUEUgPSAKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTSE9SVENVVF9NSU1FX1RZUEUgPQogICAgICAgICAgICAgInZuZC5hbmRyb2lkLmN1cnNvci5pdGVtL3ZuZC5hbmRyb2lkLnNlYXJjaC5zdWdnZXN0IjsKIAogICAgIC8qKgpAQCAtMTk1LDcgKzE5OSw3IEBACiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VHR0VTVF9DT0xVTU5fRk9STUFUID0gInN1Z2dlc3RfZm9ybWF0IjsKICAgICAvKioKLSAgICAgKiBDb2x1bW4gbmFtZSBmb3Igc3VnZ2VzdGlvbnMgY3Vyc29yLiAgPGk+UmVxdWlyZWQuPC9pPiAgVGhpcyBpcyB0aGUgcHJpbWFyeSBsaW5lIG9mIHRleHQgdGhhdCAKKyAgICAgKiBDb2x1bW4gbmFtZSBmb3Igc3VnZ2VzdGlvbnMgY3Vyc29yLiAgPGk+UmVxdWlyZWQuPC9pPiAgVGhpcyBpcyB0aGUgcHJpbWFyeSBsaW5lIG9mIHRleHQgdGhhdAogICAgICAqIHdpbGwgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyIGFzIHRoZSBzdWdnZXN0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNVR0dFU1RfQ09MVU1OX1RFWFRfMSA9ICJzdWdnZXN0X3RleHRfMSI7CkBAIC0yMjcsOCArMjMxLDggQEAKICAgICAgKiA8bGk+ZmlsZSAoe0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIjU0NIRU1FX0ZJTEV9KTwvbGk+CiAgICAgICogPC91bD4KICAgICAgKgotICAgICAqIFNlZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNvcGVuQXNzZXRGaWxlRGVzY3JpcHRvcihVcmksIFN0cmluZyl9IAotICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlIHNjaGVtZXMuIAorICAgICAqIFNlZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNvcGVuQXNzZXRGaWxlRGVzY3JpcHRvcihVcmksIFN0cmluZyl9CisgICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2Ugc2NoZW1lcy4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVUdHRVNUX0NPTFVNTl9JQ09OXzEgPSAic3VnZ2VzdF9pY29uXzEiOwogICAgIC8qKgpAQCAtMjQzLDggKzI0Nyw4IEBACiAgICAgICogPGxpPmZpbGUgKHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI1NDSEVNRV9GSUxFfSk8L2xpPgogICAgICAqIDwvdWw+CiAgICAgICoKLSAgICAgKiBTZWUge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIjb3BlbkFzc2V0RmlsZURlc2NyaXB0b3IoVXJpLCBTdHJpbmcpfSAKLSAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZSBzY2hlbWVzLiAKKyAgICAgKiBTZWUge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIjb3BlbkFzc2V0RmlsZURlc2NyaXB0b3IoVXJpLCBTdHJpbmcpfQorICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlIHNjaGVtZXMuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VHR0VTVF9DT0xVTU5fSUNPTl8yID0gInN1Z2dlc3RfaWNvbl8yIjsKICAgICAvKioKQEAgLTI3NiwxMiArMjgwLDYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVUdHRVNUX0NPTFVNTl9JTlRFTlRfRVhUUkFfREFUQSA9ICJzdWdnZXN0X2ludGVudF9leHRyYV9kYXRhIjsKICAgICAvKioKLSAgICAgKiBUT0RPOiBSZW1vdmUKLSAgICAgKgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VHR0VTVF9DT0xVTU5fSU5URU5UX0NPTVBPTkVOVF9OQU1FID0gInN1Z2dlc3RfaW50ZW50X2NvbXBvbmVudCI7Ci0gICAgLyoqCiAgICAgICogQ29sdW1uIG5hbWUgZm9yIHN1Z2dlc3Rpb25zIGN1cnNvci4gIDxpPk9wdGlvbmFsLjwvaT4gIElmIHRoaXMgY29sdW1uIGV4aXN0cyA8aT5hbmQ8L2k+CiAgICAgICogdGhpcyBlbGVtZW50IGV4aXN0cyBhdCB0aGUgZ2l2ZW4gcm93LCB0aGVuICIvIiBhbmQgdGhpcyB2YWx1ZSB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBkYXRhCiAgICAgICogZmllbGQgaW4gdGhlIEludGVudC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB0aGUgZGF0YSBmaWVsZCBoYXMgYWxyZWFkeSBiZWVuIHNldCB0byBhbgpAQCAtMjg5LDggKzI4Nyw4IEBACiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VHR0VTVF9DT0xVTU5fSU5URU5UX0RBVEFfSUQgPSAic3VnZ2VzdF9pbnRlbnRfZGF0YV9pZCI7CiAgICAgLyoqCi0gICAgICogQ29sdW1uIG5hbWUgZm9yIHN1Z2dlc3Rpb25zIGN1cnNvci4gIDxpPlJlcXVpcmVkIGlmIGFjdGlvbiBpcyAKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudCNBQ1RJT05fU0VBUkNIIEFDVElPTl9TRUFSQ0h9LCBvcHRpb25hbCBvdGhlcndpc2UuPC9pPiAgSWYgdGhpcyAKKyAgICAgKiBDb2x1bW4gbmFtZSBmb3Igc3VnZ2VzdGlvbnMgY3Vyc29yLiAgPGk+UmVxdWlyZWQgaWYgYWN0aW9uIGlzCisgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5JbnRlbnQjQUNUSU9OX1NFQVJDSCBBQ1RJT05fU0VBUkNIfSwgb3B0aW9uYWwgb3RoZXJ3aXNlLjwvaT4gIElmIHRoaXMKICAgICAgKiBjb2x1bW4gZXhpc3RzIDxpPmFuZDwvaT4gdGhpcyBlbGVtZW50IGV4aXN0cyBhdCB0aGUgZ2l2ZW4gcm93LCB0aGlzIGlzIHRoZSBkYXRhIHRoYXQgd2lsbCBiZQogICAgICAqIHVzZWQgd2hlbiBmb3JtaW5nIHRoZSBzdWdnZXN0aW9uJ3MgcXVlcnkuCiAgICAgICovCkBAIC0zMDcsMTUgKzMwNSw2IEBACiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VHR0VTVF9DT0xVTU5fU0hPUlRDVVRfSUQgPSAic3VnZ2VzdF9zaG9ydGN1dF9pZCI7CiAKICAgICAvKioKLSAgICAgKiBDb2x1bW4gbmFtZSBmb3Igc3VnZ2VzdGlvbnMgY3Vyc29yLiA8aT5PcHRpb25hbC48L2k+ICBUaGlzIGNvbHVtbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlCi0gICAgICogY3Vyc29yIGl0ZW0ncyBiYWNrZ3JvdW5kIGNvbG9yIGlmIGl0IG5lZWRzIGEgbm9uLWRlZmF1bHQgYmFja2dyb3VuZCBjb2xvci4gQSBub24temVybyB2YWx1ZQotICAgICAqIGluZGljYXRlcyBhIHZhbGlkIGJhY2tncm91bmQgY29sb3IgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQuCi0gICAgICoKLSAgICAgKiBAaGlkZSBGb3IgaW50ZXJuYWwgdXNlLCBub3QgcGFydCBvZiB0aGUgcHVibGljIEFQSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVUdHRVNUX0NPTFVNTl9CQUNLR1JPVU5EX0NPTE9SID0gInN1Z2dlc3RfYmFja2dyb3VuZF9jb2xvciI7Ci0gICAgCi0gICAgLyoqCiAgICAgICogQ29sdW1uIG5hbWUgZm9yIHN1Z2dlc3Rpb25zIGN1cnNvci4gPGk+T3B0aW9uYWwuPC9pPiBUaGlzIGNvbHVtbiBpcyB1c2VkIHRvIHNwZWNpZnkKICAgICAgKiB0aGF0IGEgc3Bpbm5lciBzaG91bGQgYmUgc2hvd24gaW4gbGlldSBvZiBhbiBpY29uMiB3aGlsZSB0aGUgc2hvcnRjdXQgb2YgdGhpcyBzdWdnZXN0aW9uCiAgICAgICogaXMgYmVpbmcgcmVmcmVzaGVkLgpAQCAtMzI0LDYgKzMxMywxNSBAQAogICAgICAgICAgICAgInN1Z2dlc3Rfc3Bpbm5lcl93aGlsZV9yZWZyZXNoaW5nIjsKIAogICAgIC8qKgorICAgICAqIENvbHVtbiBuYW1lIGZvciBzdWdnZXN0aW9ucyBjdXJzb3IuIDxpPk9wdGlvbmFsLjwvaT4gVGhpcyBjb2x1bW4gaXMgdXNlZCB0byBzcGVjaWZ5CisgICAgICogYWRkaXRpb25hbCBmbGFncyBwZXIgaXRlbS4gTXVsdGlwbGUgZmxhZ3MgY2FuIGJlIHNwZWNpZmllZC4KKyAgICAgKiA8cD4KKyAgICAgKiBNdXN0IGJlIG9uZSBvZiB7QGxpbmsgI0ZMQUdfUVVFUllfUkVGSU5FTUVOVH0gb3IgMCB0byBpbmRpY2F0ZSBubyBmbGFncy4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VHR0VTVF9DT0xVTU5fRkxBR1MgPSAic3VnZ2VzdF9mbGFncyI7CisKKyAgICAvKioKICAgICAgKiBDb2x1bW4gdmFsdWUgZm9yIHN1Z2dlc3Rpb24gY29sdW1uIHtAbGluayAjU1VHR0VTVF9DT0xVTU5fU0hPUlRDVVRfSUR9IHdoZW4gYSBzdWdnZXN0aW9uCiAgICAgICogc2hvdWxkIG5vdCBiZSBzdG9yZWQgYXMgYSBzaG9ydGN1dCBpbiBnbG9iYWwgc2VhcmNoLgogICAgICAqLwpAQCAtMzQzLDE2ICszNDEsMTYgQEAKICAgICAgKiB7QGxpbmsgI0VYVFJBX1NFTEVDVF9RVUVSWX0sCiAgICAgICoge0BsaW5rICNBUFBfREFUQX0uCiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5URU5UX0FDVElPTl9HTE9CQUxfU0VBUkNIIAorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOVEVOVF9BQ1RJT05fR0xPQkFMX1NFQVJDSAogICAgICAgICAgICAgPSAiYW5kcm9pZC5zZWFyY2guYWN0aW9uLkdMT0JBTF9TRUFSQ0giOwotICAgIAorCiAgICAgLyoqCiAgICAgICogSW50ZW50IGFjdGlvbiBmb3Igc3RhcnRpbmcgdGhlIGdsb2JhbCBzZWFyY2ggc2V0dGluZ3MgYWN0aXZpdHkuCiAgICAgICogVGhlIGdsb2JhbCBzZWFyY2ggcHJvdmlkZXIgc2hvdWxkIGhhbmRsZSB0aGlzIGludGVudC4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTlRFTlRfQUNUSU9OX1NFQVJDSF9TRVRUSU5HUyAKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTlRFTlRfQUNUSU9OX1NFQVJDSF9TRVRUSU5HUwogICAgICAgICAgICAgPSAiYW5kcm9pZC5zZWFyY2guYWN0aW9uLlNFQVJDSF9TRVRUSU5HUyI7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBJbnRlbnQgYWN0aW9uIGZvciBzdGFydGluZyBhIHdlYiBzZWFyY2ggcHJvdmlkZXIncyBzZXR0aW5ncyBhY3Rpdml0eS4KICAgICAgKiBXZWIgc2VhcmNoIHByb3ZpZGVycyBzaG91bGQgaGFuZGxlIHRoaXMgaW50ZW50IGlmIHRoZXkgaGF2ZSBwcm92aWRlci1zcGVjaWZpYwpAQCAtMzY4LDcgKzM2Niw3IEBACiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5URU5UX0FDVElPTl9TRUFSQ0hBQkxFU19DSEFOR0VECiAgICAgICAgICAgICA9ICJhbmRyb2lkLnNlYXJjaC5hY3Rpb24uU0VBUkNIQUJMRVNfQ0hBTkdFRCI7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBJbnRlbnQgYWN0aW9uIGJyb2FkY2FzdGVkIHRvIGluZm9ybSB0aGF0IHRoZSBzZWFyY2ggc2V0dGluZ3MgaGF2ZSBjaGFuZ2VkIGluIHNvbWUgd2F5LgogICAgICAqIEVpdGhlciBzZWFyY2hhYmxlcyBoYXZlIGJlZW4gZW5hYmxlZCBvciBkaXNhYmxlZCwgb3IgYSBkaWZmZXJlbnQgd2ViIHNlYXJjaCBwcm92aWRlcgpAQCAtMzc4LDE0ICszNzYsNiBAQAogICAgICAgICAgICAgPSAiYW5kcm9pZC5zZWFyY2guYWN0aW9uLlNFVFRJTkdTX0NIQU5HRUQiOwogCiAgICAgLyoqCi0gICAgICogSWYgYSBzdWdnZXN0aW9uIGhhcyB0aGlzIHZhbHVlIGluIHtAbGluayAjU1VHR0VTVF9DT0xVTU5fSU5URU5UX0FDVElPTn0sCi0gICAgICogdGhlIHNlYXJjaCBkaWFsb2cgd2lsbCB0YWtlIG5vIGFjdGlvbi4KLSAgICAgKgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5URU5UX0FDVElPTl9OT05FID0gImFuZHJvaWQuc2VhcmNoLmFjdGlvbi5aSUxDSCI7Ci0KLSAgICAvKioKICAgICAgKiBUaGlzIG1lYW5zIHRoYXQgY29udGV4dCBpcyB2b2ljZSwgYW5kIHRoZXJlZm9yZSB0aGUgU2VhcmNoRGlhbG9nIHNob3VsZAogICAgICAqIGNvbnRpbnVlIHNob3dpbmcgdGhlIG1pY3JvcGhvbmUgdW50aWwgdGhlIHVzZXIgaW5kaWNhdGVzIHRoYXQgaGUvc2hlIGRvZXMKICAgICAgKiBub3Qgd2FudCB0byByZS1zcGVhayAoZS5nLiBieSB0eXBpbmcpLgpAQCAtNDEzLDcgKzQwMyw3IEBACiAgICAgICogVGhlIHBhY2thZ2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VhY2ggbWFuYWdlci4KICAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBtQXNzb2NpYXRlZFBhY2thZ2U7Ci0gICAgCisKICAgICAvLyBwYWNrYWdlIHByaXZhdGUgc2luY2UgdGhleSBhcmUgdXNlZCBieSB0aGUgaW5uZXIgY2xhc3MgU2VhcmNoTWFuYWdlckNhbGxiYWNrCiAgICAgLyogcGFja2FnZSAqLyBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOwogICAgIC8qIHBhY2thZ2UgKi8gT25EaXNtaXNzTGlzdGVuZXIgbURpc21pc3NMaXN0ZW5lciA9IG51bGw7CkBAIC00MjcsMTUgKzQxNywxNSBAQAogICAgICAgICBtU2VydmljZSA9IElTZWFyY2hNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoCiAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LlNFQVJDSF9TRVJWSUNFKSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogTGF1bmNoIHNlYXJjaCBVSS4KICAgICAgKgogICAgICAqIDxwPlRoZSBzZWFyY2ggbWFuYWdlciB3aWxsIG9wZW4gYSBzZWFyY2ggd2lkZ2V0IGluIGFuIG92ZXJsYXBwaW5nCi0gICAgICogd2luZG93LCBhbmQgdGhlIHVuZGVybHlpbmcgYWN0aXZpdHkgbWF5IGJlIG9ic2N1cmVkLiAgVGhlIHNlYXJjaCAKKyAgICAgKiB3aW5kb3csIGFuZCB0aGUgdW5kZXJseWluZyBhY3Rpdml0eSBtYXkgYmUgb2JzY3VyZWQuICBUaGUgc2VhcmNoCiAgICAgICogZW50cnkgc3RhdGUgd2lsbCByZW1haW4gaW4gZWZmZWN0IHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nIGV2ZW50czoKICAgICAgKiA8dWw+Ci0gICAgICogPGxpPlRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgc2VhcmNoLiAgSW4gbW9zdCBjYXNlcyB0aGlzIHdpbGwgbGF1bmNoIAorICAgICAqIDxsaT5UaGUgdXNlciBjb21wbGV0ZXMgdGhlIHNlYXJjaC4gIEluIG1vc3QgY2FzZXMgdGhpcyB3aWxsIGxhdW5jaAogICAgICAqIGEgc2VhcmNoIGludGVudC48L2xpPgogICAgICAqIDxsaT5UaGUgdXNlciB1c2VzIHRoZSBiYWNrLCBob21lLCBvciBvdGhlciBrZXlzIHRvIGV4aXQgdGhlIHNlYXJjaC48L2xpPgogICAgICAqIDxsaT5UaGUgYXBwbGljYXRpb24gY2FsbHMgdGhlIHtAbGluayAjc3RvcFNlYXJjaH0KQEAgLTQ0Myw4ICs0MzMsOCBAQAogICAgICAqIGFjdGl2aXR5IGZyb20gd2hpY2ggaXQgd2FzIGxhdW5jaGVkLjwvbGk+CiAgICAgICoKICAgICAgKiA8cD5Nb3N0IGFwcGxpY2F0aW9ucyB3aWxsIDxpPm5vdDwvaT4gdXNlIHRoaXMgaW50ZXJmYWNlIHRvIGludm9rZSBzZWFyY2guCi0gICAgICogVGhlIHByaW1hcnkgbWV0aG9kIGZvciBpbnZva2luZyBzZWFyY2ggaXMgdG8gY2FsbCAKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TZWFyY2hSZXF1ZXN0ZWQgQWN0aXZpdHkub25TZWFyY2hSZXF1ZXN0ZWQoKX0gb3IgCisgICAgICogVGhlIHByaW1hcnkgbWV0aG9kIGZvciBpbnZva2luZyBzZWFyY2ggaXMgdG8gY2FsbAorICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblNlYXJjaFJlcXVlc3RlZCBBY3Rpdml0eS5vblNlYXJjaFJlcXVlc3RlZCgpfSBvcgogICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNzdGFydFNlYXJjaCBBY3Rpdml0eS5zdGFydFNlYXJjaCgpfS4KICAgICAgKgogICAgICAqIEBwYXJhbSBpbml0aWFsUXVlcnkgQSBzZWFyY2ggc3RyaW5nIGNhbiBiZSBwcmUtZW50ZXJlZCBoZXJlLCBidXQgdGhpcwpAQCAtNDU2LDE5ICs0NDYsMTkgQEAKICAgICAgKiBhbmQgdGhlIHVzZXIgd291bGQgZXhwZWN0IHRvIGJlIGFibGUgdG8ga2VlcCB0eXBpbmcuICA8aT5UaGlzIHBhcmFtZXRlciBpcyBvbmx5IG1lYW5pbmdmdWwKICAgICAgKiBpZiBpbml0aWFsUXVlcnkgaXMgYSBub24tZW1wdHkgc3RyaW5nLjwvaT4KICAgICAgKiBAcGFyYW0gbGF1bmNoQWN0aXZpdHkgVGhlIENvbXBvbmVudE5hbWUgb2YgdGhlIGFjdGl2aXR5IHRoYXQgaGFzIGxhdW5jaGVkIHRoaXMgc2VhcmNoLgotICAgICAqIEBwYXJhbSBhcHBTZWFyY2hEYXRhIEFuIGFwcGxpY2F0aW9uIGNhbiBpbnNlcnQgYXBwbGljYXRpb24tc3BlY2lmaWMgCi0gICAgICogY29udGV4dCBoZXJlLCBpbiBvcmRlciB0byBpbXByb3ZlIHF1YWxpdHkgb3Igc3BlY2lmaWNpdHkgb2YgaXRzIG93biAKKyAgICAgKiBAcGFyYW0gYXBwU2VhcmNoRGF0YSBBbiBhcHBsaWNhdGlvbiBjYW4gaW5zZXJ0IGFwcGxpY2F0aW9uLXNwZWNpZmljCisgICAgICogY29udGV4dCBoZXJlLCBpbiBvcmRlciB0byBpbXByb3ZlIHF1YWxpdHkgb3Igc3BlY2lmaWNpdHkgb2YgaXRzIG93bgogICAgICAqIHNlYXJjaGVzLiAgVGhpcyBkYXRhIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBTRUFSQ0ggaW50ZW50KHMpLiAgTnVsbCBpZgogICAgICAqIG5vIGV4dHJhIGRhdGEgaXMgcmVxdWlyZWQuCiAgICAgICogQHBhcmFtIGdsb2JhbFNlYXJjaCBJZiBmYWxzZSwgdGhpcyB3aWxsIG9ubHkgbGF1bmNoIHRoZSBzZWFyY2ggdGhhdCBoYXMgYmVlbiBzcGVjaWZpY2FsbHkKLSAgICAgKiBkZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiAod2hpY2ggaXMgdXN1YWxseSBkZWZpbmVkIGFzIGEgbG9jYWwgc2VhcmNoKS4gIElmIG5vIGRlZmF1bHQgCisgICAgICogZGVmaW5lZCBieSB0aGUgYXBwbGljYXRpb24gKHdoaWNoIGlzIHVzdWFsbHkgZGVmaW5lZCBhcyBhIGxvY2FsIHNlYXJjaCkuICBJZiBubyBkZWZhdWx0CiAgICAgICogc2VhcmNoIGlzIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgYXBwbGljYXRpb24gb3IgYWN0aXZpdHksIGdsb2JhbCBzZWFyY2ggd2lsbCBiZSBsYXVuY2hlZC4KICAgICAgKiBJZiB0cnVlLCB0aGlzIHdpbGwgYWx3YXlzIGxhdW5jaCBhIHBsYXRmb3JtLWdsb2JhbCAoZS5nLiB3ZWItYmFzZWQpIHNlYXJjaCBpbnN0ZWFkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHNlZSBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblNlYXJjaFJlcXVlc3RlZAogICAgICAqIEBzZWUgI3N0b3BTZWFyY2gKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFNlYXJjaChTdHJpbmcgaW5pdGlhbFF1ZXJ5LCAKKyAgICBwdWJsaWMgdm9pZCBzdGFydFNlYXJjaChTdHJpbmcgaW5pdGlhbFF1ZXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VsZWN0SW5pdGlhbFF1ZXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudE5hbWUgbGF1bmNoQWN0aXZpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGFwcFNlYXJjaERhdGEsCkBAIC01OTUsNyArNTg1LDcgQEAKICAgICAgKiA8cD5UeXBpY2FsbHkgdGhlIHVzZXIgd2lsbCB0ZXJtaW5hdGUgdGhlIHNlYXJjaCBVSSBieSBsYXVuY2hpbmcgYQogICAgICAqIHNlYXJjaCBvciBieSBjYW5jZWxpbmcuICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgdW5kZXJseWluZyBhcHBsaWNhdGlvbgogICAgICAqIG9yIGFjdGl2aXR5IHRvIGNhbmNlbCB0aGUgc2VhcmNoIHByZW1hdHVyZWx5IChmb3IgYW55IHJlYXNvbikuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGlzIGZ1bmN0aW9uIGNhbiBiZSBzYWZlbHkgY2FsbGVkIGF0IGFueSB0aW1lIChldmVuIGlmIG5vIHNlYXJjaCBpcyBhY3RpdmUuKQogICAgICAqCiAgICAgICogQHNlZSAjc3RhcnRTZWFyY2gKQEAgLTYwNywxMiArNTk3LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBTZWFyY2ggVUkgaXMgY3VycmVudGx5IGRpc3BsYXllZC4gIAotICAgICAqIAorICAgICAqIERldGVybWluZSBpZiB0aGUgU2VhcmNoIFVJIGlzIGN1cnJlbnRseSBkaXNwbGF5ZWQuCisgICAgICoKICAgICAgKiBUaGlzIGlzIHByb3ZpZGVkIHByaW1hcmlseSBmb3IgYXBwbGljYXRpb24gdGVzdCBwdXJwb3Nlcy4KICAgICAgKgogICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHRoZSBzZWFyY2ggVUkgaXMgY3VycmVudGx5IGRpc3BsYXllZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgewpAQCAtNjMxLDcgKzYyMSw3IEBACiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCBvbkRpc21pc3MoKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBTZWUge0BsaW5rIFNlYXJjaE1hbmFnZXIjc2V0T25DYW5jZWxMaXN0ZW5lcn0gZm9yIGNvbmZpZ3VyaW5nIHlvdXIgYWN0aXZpdHkgdG8gbW9uaXRvcgogICAgICAqIHNlYXJjaCBVSSBzdGF0ZS4KQEAgLTY0Nyw3ICs2MzcsNyBAQAogCiAgICAgLyoqCiAgICAgICogU2V0IG9yIGNsZWFyIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuZXZlciB0aGUgc2VhcmNoIFVJIGlzIGRpc21pc3NlZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUge0BsaW5rIE9uRGlzbWlzc0xpc3RlbmVyfSB0byB1c2UsIG9yIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0T25EaXNtaXNzTGlzdGVuZXIoZmluYWwgT25EaXNtaXNzTGlzdGVuZXIgbGlzdGVuZXIpIHsKQEAgLTY1Niw3ICs2NDYsNyBAQAogCiAgICAgLyoqCiAgICAgICogU2V0IG9yIGNsZWFyIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuZXZlciB0aGUgc2VhcmNoIFVJIGlzIGNhbmNlbGVkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSB7QGxpbmsgT25DYW5jZWxMaXN0ZW5lcn0gdG8gdXNlLCBvciBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE9uQ2FuY2VsTGlzdGVuZXIoT25DYW5jZWxMaXN0ZW5lciBsaXN0ZW5lcikgewpAQCAtNzY3LDEwICs3NTcsMTAgQEAKICAgICAgICAgLy8gZmluYWxseSwgbWFrZSB0aGUgcXVlcnkKICAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KHVyaSwgbnVsbCwgc2VsZWN0aW9uLCBzZWxBcmdzLCBudWxsKTsKICAgICB9Ci0gICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIHNlYXJjaGFibGUgYWN0aXZpdGllcyB0aGF0IGNhbiBiZSBpbmNsdWRlZCBpbiBnbG9iYWwgc2VhcmNoLgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiBhIGxpc3QgY29udGFpbmluZyBzZWFyY2hhYmxlIGluZm9ybWF0aW9uIGZvciBhbGwgc2VhcmNoYWJsZSBhY3Rpdml0aWVzCiAgICAgICogICAgICAgICB0aGF0IGhhdmUgdGhlIDxjb2RlPmFuZHJvaWQ6aW5jbHVkZUluR2xvYmFsU2VhcmNoPC9jb2RlPiBhdHRyaWJ1dGUgc2V0CiAgICAgICogICAgICAgICBpbiB0aGVpciBzZWFyY2hhYmxlIG1ldGEtZGF0YS4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9TdGF0dXNCYXJNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvU3RhdHVzQmFyTWFuYWdlci5qYXZhCmluZGV4IGRlNTQ0ZmIuLmZhN2Y3OTQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9TdGF0dXNCYXJNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1N0YXR1c0Jhck1hbmFnZXIuamF2YQpAQCAtNTUsNiArNTUsMTggQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIgPSAweDAwMDAwMDA4OwogCiAgICAgLyoqCisgICAgICogRmxhZyBmb3Ige0BsaW5rICNkaXNhYmxlfSB0byBoaWRlIHRoZSBjZW50ZXIgc3lzdGVtIGluZm8gYXJlYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNBQkxFX1NZU1RFTV9JTkZPID0gMHgwMDAwMDAxMDsKKworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIHtAbGluayAjZGlzYWJsZX0gdG8gaGlkZSBvbmx5IHRoZSBuYXZpZ2F0aW9uIGJ1dHRvbnMuICBEb24ndCB1c2UgdGhpcworICAgICAqIHVubGVzcyB5b3UncmUgdGhlIHNldHVwIHdpemFyZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNBQkxFX05BVklHQVRJT04gPSAweDAwMDAwMDIwOworCisKKyAgICAvKioKICAgICAgKiBSZS1lbmFibGUgYWxsIG9mIHRoZSBzdGF0dXMgYmFyIGZlYXR1cmVzIHRoYXQgeW91J3ZlIGRpc2FibGVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0FCTEVfTk9ORSA9IDB4MDAwMDAwMDA7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvU3VnZ2VzdGlvbnNBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvU3VnZ2VzdGlvbnNBZGFwdGVyLmphdmEKaW5kZXggOGQ4ODY0Zi4uNTcwNWJmZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1N1Z2dlc3Rpb25zQWRhcHRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9TdWdnZXN0aW9uc0FkYXB0ZXIuamF2YQpAQCAtNjgsNyArNjgsNiBAQAogICAgIHByaXZhdGUgU2VhcmNoYWJsZUluZm8gbVNlYXJjaGFibGU7CiAgICAgcHJpdmF0ZSBDb250ZXh0IG1Qcm92aWRlckNvbnRleHQ7CiAgICAgcHJpdmF0ZSBXZWFrSGFzaE1hcDxTdHJpbmcsIERyYXdhYmxlLkNvbnN0YW50U3RhdGU+IG1PdXRzaWRlRHJhd2FibGVzQ2FjaGU7Ci0gICAgcHJpdmF0ZSBTcGFyc2VBcnJheTxEcmF3YWJsZS5Db25zdGFudFN0YXRlPiBtQmFja2dyb3VuZHNDYWNoZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbUNsb3NlZCA9IGZhbHNlOwogCiAgICAgLy8gVVJMIGNvbG9yCkBAIC04MCw3ICs3OSw2IEBACiAgICAgcHJpdmF0ZSBpbnQgbVRleHQyVXJsQ29sOwogICAgIHByaXZhdGUgaW50IG1JY29uTmFtZTFDb2w7CiAgICAgcHJpdmF0ZSBpbnQgbUljb25OYW1lMkNvbDsKLSAgICBwcml2YXRlIGludCBtQmFja2dyb3VuZENvbG9yQ29sOwogCiAgICAgc3RhdGljIGZpbmFsIGludCBOT05FID0gLTE7CiAKQEAgLTEwOSw3ICsxMDcsNiBAQAogICAgICAgICBtUHJvdmlkZXJDb250ZXh0ID0gbVNlYXJjaGFibGUuZ2V0UHJvdmlkZXJDb250ZXh0KG1Db250ZXh0LCBhY3Rpdml0eUNvbnRleHQpOwogCiAgICAgICAgIG1PdXRzaWRlRHJhd2FibGVzQ2FjaGUgPSBvdXRzaWRlRHJhd2FibGVzQ2FjaGU7Ci0gICAgICAgIG1CYWNrZ3JvdW5kc0NhY2hlID0gbmV3IFNwYXJzZUFycmF5PERyYXdhYmxlLkNvbnN0YW50U3RhdGU+KCk7CiAKICAgICAgICAgbVN0YXJ0U3Bpbm5lclJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKQEAgLTI0Myw4ICsyNDAsNiBAQAogICAgICAgICAgICAgICAgIG1UZXh0MlVybENvbCA9IGMuZ2V0Q29sdW1uSW5kZXgoU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9URVhUXzJfVVJMKTsKICAgICAgICAgICAgICAgICBtSWNvbk5hbWUxQ29sID0gYy5nZXRDb2x1bW5JbmRleChTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX0lDT05fMSk7CiAgICAgICAgICAgICAgICAgbUljb25OYW1lMkNvbCA9IGMuZ2V0Q29sdW1uSW5kZXgoU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9JQ09OXzIpOwotICAgICAgICAgICAgICAgIG1CYWNrZ3JvdW5kQ29sb3JDb2wgPQotICAgICAgICAgICAgICAgICAgICAgICAgYy5nZXRDb2x1bW5JbmRleChTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX0JBQ0tHUk9VTkRfQ09MT1IpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgImVycm9yIGNoYW5naW5nIGN1cnNvciBhbmQgY2FjaGluZyBjb2x1bW5zIiwgZSk7CkBAIC0yODMsMTMgKzI3OCw2IEBACiAgICAgcHVibGljIHZvaWQgYmluZFZpZXcoVmlldyB2aWV3LCBDb250ZXh0IGNvbnRleHQsIEN1cnNvciBjdXJzb3IpIHsKICAgICAgICAgQ2hpbGRWaWV3Q2FjaGUgdmlld3MgPSAoQ2hpbGRWaWV3Q2FjaGUpIHZpZXcuZ2V0VGFnKCk7CiAKLSAgICAgICAgaW50IGJhY2tncm91bmRDb2xvciA9IDA7Ci0gICAgICAgIGlmIChtQmFja2dyb3VuZENvbG9yQ29sICE9IC0xKSB7Ci0gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IgPSBjdXJzb3IuZ2V0SW50KG1CYWNrZ3JvdW5kQ29sb3JDb2wpOwotICAgICAgICB9Ci0gICAgICAgIERyYXdhYmxlIGJhY2tncm91bmQgPSBnZXRJdGVtQmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgICB2aWV3LnNldEJhY2tncm91bmREcmF3YWJsZShiYWNrZ3JvdW5kKTsKLQogICAgICAgICBpZiAodmlld3MubVRleHQxICE9IG51bGwpIHsKICAgICAgICAgICAgIFN0cmluZyB0ZXh0MSA9IGdldFN0cmluZ09yTnVsbChjdXJzb3IsIG1UZXh0MUNvbCk7CiAgICAgICAgICAgICBzZXRWaWV3VGV4dCh2aWV3cy5tVGV4dDEsIHRleHQxKTsKQEAgLTM0MiwzMyArMzMwLDYgQEAKICAgICAgICAgcmV0dXJuIHRleHQ7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGRyYXdhYmxlIHdpdGggbm8gY29sb3Igd2hlbiBzZWxlY3RlZCBvciBwcmVzc2VkLCBhbmQgdGhlIGdpdmVuIGNvbG9yIHdoZW4KLSAgICAgKiBuZWl0aGVyIHNlbGVjdGVkIG5vciBwcmVzc2VkLgotICAgICAqCi0gICAgICogQHJldHVybiBBIGRyYXdhYmxlLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGdpdmVuIGNvbG9yIGlzIHRyYW5zcGFyZW50LgotICAgICAqLwotICAgIHByaXZhdGUgRHJhd2FibGUgZ2V0SXRlbUJhY2tncm91bmQoaW50IGJhY2tncm91bmRDb2xvcikgewotICAgICAgICBpZiAoYmFja2dyb3VuZENvbG9yID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSBjYWNoZWRCZyA9IG1CYWNrZ3JvdW5kc0NhY2hlLmdldChiYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgICAgICAgaWYgKGNhY2hlZEJnICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAiQmFja2dyb3VuZCBjYWNoZSBoaXQgZm9yIGNvbG9yICIgKyBiYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRCZy5uZXdEcmF3YWJsZShtUHJvdmlkZXJDb250ZXh0LmdldFJlc291cmNlcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJDcmVhdGluZyBuZXcgYmFja2dyb3VuZCBmb3IgY29sb3IgIiArIGJhY2tncm91bmRDb2xvcik7Ci0gICAgICAgICAgICBDb2xvckRyYXdhYmxlIHRyYW5zcGFyZW50ID0gbmV3IENvbG9yRHJhd2FibGUoMCk7Ci0gICAgICAgICAgICBDb2xvckRyYXdhYmxlIGJhY2tncm91bmQgPSBuZXcgQ29sb3JEcmF3YWJsZShiYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgICAgICAgU3RhdGVMaXN0RHJhd2FibGUgbmV3QmcgPSBuZXcgU3RhdGVMaXN0RHJhd2FibGUoKTsKLSAgICAgICAgICAgIG5ld0JnLmFkZFN0YXRlKG5ldyBpbnRbXXthbmRyb2lkLlIuYXR0ci5zdGF0ZV9zZWxlY3RlZH0sIHRyYW5zcGFyZW50KTsKLSAgICAgICAgICAgIG5ld0JnLmFkZFN0YXRlKG5ldyBpbnRbXXthbmRyb2lkLlIuYXR0ci5zdGF0ZV9wcmVzc2VkfSwgdHJhbnNwYXJlbnQpOwotICAgICAgICAgICAgbmV3QmcuYWRkU3RhdGUobmV3IGludFtde30sIGJhY2tncm91bmQpOwotICAgICAgICAgICAgbUJhY2tncm91bmRzQ2FjaGUucHV0KGJhY2tncm91bmRDb2xvciwgbmV3QmcuZ2V0Q29uc3RhbnRTdGF0ZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBuZXdCZzsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHByaXZhdGUgdm9pZCBzZXRWaWV3VGV4dChUZXh0VmlldyB2LCBDaGFyU2VxdWVuY2UgdGV4dCkgewogICAgICAgICAvLyBTZXQgdGhlIHRleHQgZXZlbiBpZiBpdCdzIG51bGwsIHNpbmNlIHdlIG5lZWQgdG8gY2xlYXIgYW55IHByZXZpb3VzIHRleHQuCiAgICAgICAgIHYuc2V0VGV4dCh0ZXh0KTsKQEAgLTYwMSwyMSArNTYyLDcgQEAKICAgICAgKiBAcmV0dXJuIEEgbm9uLW51bGwgZHJhd2FibGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSBEcmF3YWJsZSBnZXREZWZhdWx0SWNvbjEoQ3Vyc29yIGN1cnNvcikgewotICAgICAgICAvLyBGaXJzdCBjaGVjayB0aGUgY29tcG9uZW50IHRoYXQgdGhlIHN1Z2dlc3Rpb24gaXMgb3JpZ2luYWxseSBmcm9tCi0gICAgICAgIFN0cmluZyBjID0gZ2V0Q29sdW1uU3RyaW5nKGN1cnNvciwgU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9JTlRFTlRfQ09NUE9ORU5UX05BTUUpOwotICAgICAgICBpZiAoYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDb21wb25lbnROYW1lIGNvbXBvbmVudCA9IENvbXBvbmVudE5hbWUudW5mbGF0dGVuRnJvbVN0cmluZyhjKTsKLSAgICAgICAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gZ2V0QWN0aXZpdHlJY29uV2l0aENhY2hlKGNvbXBvbmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRyYXdhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRyYXdhYmxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkJhZCBjb21wb25lbnQgbmFtZTogIiArIGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlbiBjaGVjayB0aGUgY29tcG9uZW50IHRoYXQgZ2F2ZSB1cyB0aGUgc3VnZ2VzdGlvbgorICAgICAgICAvLyBDaGVjayB0aGUgY29tcG9uZW50IHRoYXQgZ2F2ZSB1cyB0aGUgc3VnZ2VzdGlvbgogICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IGdldEFjdGl2aXR5SWNvbldpdGhDYWNoZShtU2VhcmNoYWJsZS5nZXRTZWFyY2hBY3Rpdml0eSgpKTsKICAgICAgICAgaWYgKGRyYXdhYmxlICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBkcmF3YWJsZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9UaW1lUGlja2VyRGlhbG9nLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvVGltZVBpY2tlckRpYWxvZy5qYXZhCmluZGV4IDUyMWQ0MWMuLjM4MTE0M2MgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9UaW1lUGlja2VyRGlhbG9nLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1RpbWVQaWNrZXJEaWFsb2cuamF2YQpAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVGb3JtYXQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwpAQCAtNzYsNyArNzcsMTAgQEAKICAgICBwdWJsaWMgVGltZVBpY2tlckRpYWxvZyhDb250ZXh0IGNvbnRleHQsCiAgICAgICAgICAgICBPblRpbWVTZXRMaXN0ZW5lciBjYWxsQmFjaywKICAgICAgICAgICAgIGludCBob3VyT2ZEYXksIGludCBtaW51dGUsIGJvb2xlYW4gaXMyNEhvdXJWaWV3KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9EaWFsb2dfQWxlcnQsCisgICAgICAgIHRoaXMoY29udGV4dCwKKyAgICAgICAgICAgICAgICBjb250ZXh0LmdldEFwcGxpY2F0aW9uSW5mbygpLnRhcmdldFNka1ZlcnNpb24gPj0gQnVpbGQuVkVSU0lPTl9DT0RFUy5IT05FWUNPTUIKKyAgICAgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9Ib2xvX0RpYWxvZ19BbGVydAorICAgICAgICAgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0RpYWxvZ19BbGVydCwKICAgICAgICAgICAgICAgICBjYWxsQmFjaywgaG91ck9mRGF5LCBtaW51dGUsIGlzMjRIb3VyVmlldyk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlQWRtaW5JbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlQWRtaW5JbmZvLmphdmEKaW5kZXggMGJjZDY1Yy4uMjIzN2M4MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZUFkbWluSW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VBZG1pbkluZm8uamF2YQpAQCAtMTAzLDYgKzEwMywxNSBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTRVNfUE9MSUNZX1dJUEVfREFUQSA9IDQ7CiAKKyAgICAvKioKKyAgICAgKiBBIHR5cGUgb2YgcG9saWN5IHRoYXQgdGhpcyBkZXZpY2UgYWRtaW4gY2FuIHVzZTogYWJsZSB0byBzcGVjaWZ5IHRoZQorICAgICAqIGRldmljZSBHbG9iYWwgUHJveHksIHZpYSB7QGxpbmsgRGV2aWNlUG9saWN5TWFuYWdlciNzZXRHbG9iYWxQcm94eX0uCisgICAgICoKKyAgICAgKiA8cD5UbyBjb250cm9sIHRoaXMgcG9saWN5LCB0aGUgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSBhICJzZXQtZ2xvYmFsLXByb3h5IgorICAgICAqIHRhZyBpbiB0aGUgInVzZXMtcG9saWNpZXMiIHNlY3Rpb24gb2YgaXRzIG1ldGEtZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0VTX1BPTElDWV9TRVRTX0dMT0JBTF9QUk9YWSA9IDU7CisKICAgICAvKiogQGhpZGUgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBvbGljeUluZm8gewogICAgICAgICBwdWJsaWMgZmluYWwgaW50IGlkZW50OwpAQCAtMTM4LDYgKzE0Nyw5IEBACiAgICAgICAgIHNQb2xpY2llc0Rpc3BsYXlPcmRlci5hZGQobmV3IFBvbGljeUluZm8oVVNFU19QT0xJQ1lfRk9SQ0VfTE9DSywgImZvcmNlLWxvY2siLAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWxhYl9mb3JjZUxvY2ssCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucG9saWN5ZGVzY19mb3JjZUxvY2spKTsKKyAgICAgICAgc1BvbGljaWVzRGlzcGxheU9yZGVyLmFkZChuZXcgUG9saWN5SW5mbyhVU0VTX1BPTElDWV9TRVRTX0dMT0JBTF9QUk9YWSwgInNldC1nbG9iYWwtcHJveHkiLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSwKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5KSk7CiAgICAgICAgIAogICAgICAgICBmb3IgKGludCBpPTA7IGk8c1BvbGljaWVzRGlzcGxheU9yZGVyLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBQb2xpY3lJbmZvIHBpID0gc1BvbGljaWVzRGlzcGxheU9yZGVyLmdldChpKTsKQEAgLTMyOCw3ICszNDAsNyBAQAogICAgICAqIHRoZSBnaXZlbiBwb2xpY3kgY29udHJvbC4gIFRoZSBwb3NzaWJsZSBwb2xpY3kgaWRlbnRpZmllciBpbnB1dHMgYXJlOgogICAgICAqIHtAbGluayAjVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9LCB7QGxpbmsgI1VTRVNfUE9MSUNZX1dBVENIX0xPR0lOfSwKICAgICAgKiB7QGxpbmsgI1VTRVNfUE9MSUNZX1JFU0VUX1BBU1NXT1JEfSwge0BsaW5rICNVU0VTX1BPTElDWV9GT1JDRV9MT0NLfSwKLSAgICAgKiB7QGxpbmsgI1VTRVNfUE9MSUNZX1dJUEVfREFUQX0uCisgICAgICoge0BsaW5rICNVU0VTX1BPTElDWV9XSVBFX0RBVEF9LCB7QGxpbmsgI1VTRVNfUE9MSUNZX1NFVFNfR0xPQkFMX1BST1hZfS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiB1c2VzUG9saWN5KGludCBwb2xpY3lJZGVudCkgewogICAgICAgICByZXR1cm4gKG1Vc2VzUG9saWNpZXMgJiAoMTw8cG9saWN5SWRlbnQpKSAhPSAwOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZVBvbGljeU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VQb2xpY3lNYW5hZ2VyLmphdmEKaW5kZXggMjk2ZDcwYTQuLjJiN2U0MjcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VQb2xpY3lNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZVBvbGljeU1hbmFnZXIuamF2YQpAQCAtMzIsNiArMzIsOCBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlByb3h5OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKQEAgLTQ2LDcgKzQ4LDcgQEAKIAogICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIGZpbmFsIElEZXZpY2VQb2xpY3lNYW5hZ2VyIG1TZXJ2aWNlOwotICAgIAorCiAgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOwogCiAgICAgcHJpdmF0ZSBEZXZpY2VQb2xpY3lNYW5hZ2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciBoYW5kbGVyKSB7CkBAIC02MSwxNCArNjMsMTQgQEAKICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlciBtZSA9IG5ldyBEZXZpY2VQb2xpY3lNYW5hZ2VyKGNvbnRleHQsIGhhbmRsZXIpOwogICAgICAgICByZXR1cm4gbWUubVNlcnZpY2UgIT0gbnVsbCA/IG1lIDogbnVsbDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBBY3Rpdml0eSBhY3Rpb246IGFzayB0aGUgdXNlciB0byBhZGQgYSBuZXcgZGV2aWNlIGFkbWluaXN0cmF0b3IgdG8gdGhlIHN5c3RlbS4KICAgICAgKiBUaGUgZGVzaXJlZCBwb2xpY3kgaXMgdGhlIENvbXBvbmVudE5hbWUgb2YgdGhlIHBvbGljeSBpbiB0aGUKICAgICAgKiB7QGxpbmsgI0VYVFJBX0RFVklDRV9BRE1JTn0gZXh0cmEgZmllbGQuICBUaGlzIHdpbGwgaW52b2tlIGEgVUkgdG8KICAgICAgKiBicmluZyB0aGUgdXNlciB0aHJvdWdoIGFkZGluZyB0aGUgZGV2aWNlIGFkbWluaXN0cmF0b3IgdG8gdGhlIHN5c3RlbSAob3IKICAgICAgKiBhbGxvd2luZyB0aGVtIHRvIHJlamVjdCBpdCkuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5Zb3UgY2FuIG9wdGlvbmFsbHkgaW5jbHVkZSB0aGUge0BsaW5rICNFWFRSQV9BRERfRVhQTEFOQVRJT059CiAgICAgICogZmllbGQgdG8gcHJvdmlkZSB0aGUgdXNlciB3aXRoIGFkZGl0aW9uYWwgZXhwbGFuYXRpb24gKGluIGFkZGl0aW9uCiAgICAgICogdG8geW91ciBjb21wb25lbnQncyBkZXNjcmlwdGlvbikgYWJvdXQgd2hhdCBpcyBiZWluZyBhZGRlZC4KQEAgLTc2LDcgKzc4LDcgQEAKICAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkFDVElWSVRZX0lOVEVOVF9BQ1RJT04pCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0FERF9ERVZJQ0VfQURNSU4KICAgICAgICAgICAgID0gImFuZHJvaWQuYXBwLmFjdGlvbi5BRERfREVWSUNFX0FETUlOIjsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEFjdGl2aXR5IGFjdGlvbjogc2VuZCB3aGVuIGFueSBwb2xpY3kgYWRtaW4gY2hhbmdlcyBhIHBvbGljeS4KICAgICAgKiBUaGlzIGlzIGdlbmVyYWxseSB1c2VkIHRvIGZpbmQgb3V0IHdoZW4gYSBuZXcgcG9saWN5IGlzIGluIGVmZmVjdC4KQEAgLTkyLDcgKzk0LDcgQEAKICAgICAgKiBAc2VlICNBQ1RJT05fQUREX0RFVklDRV9BRE1JTgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0RFVklDRV9BRE1JTiA9ICJhbmRyb2lkLmFwcC5leHRyYS5ERVZJQ0VfQURNSU4iOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQW4gb3B0aW9uYWwgQ2hhclNlcXVlbmNlIHByb3ZpZGluZyBhZGRpdGlvbmFsIGV4cGxhbmF0aW9uIGZvciB3aHkgdGhlCiAgICAgICogYWRtaW4gaXMgYmVpbmcgYWRkZWQuCkBAIC0xMDAsMjIgKzEwMiwyMSBAQAogICAgICAqIEBzZWUgI0FDVElPTl9BRERfREVWSUNFX0FETUlOCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfQUREX0VYUExBTkFUSU9OID0gImFuZHJvaWQuYXBwLmV4dHJhLkFERF9FWFBMQU5BVElPTiI7Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBBY3Rpdml0eSBhY3Rpb246IGhhdmUgdGhlIHVzZXIgZW50ZXIgYSBuZXcgcGFzc3dvcmQuICBUaGlzIGFjdGl2aXR5Ci0gICAgICogc2hvdWxkIGJlIGxhdW5jaGVkIGFmdGVyIHVzaW5nIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5KENvbXBvbmVudE5hbWUsIGludCl9Ci0gICAgICogb3Ige0BsaW5rICNzZXRQYXNzd29yZE1pbmltdW1MZW5ndGgoQ29tcG9uZW50TmFtZSwgaW50KX0gdG8gaGF2ZSB0aGUKLSAgICAgKiB1c2VyIGVudGVyIGEgbmV3IHBhc3N3b3JkIHRoYXQgbWVldHMgdGhlIGN1cnJlbnQgcmVxdWlyZW1lbnRzLiAgWW91IGNhbgotICAgICAqIHVzZSB7QGxpbmsgI2lzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCl9IHRvIGRldGVybWluZSB3aGV0aGVyIHlvdSBuZWVkCi0gICAgICogdG8gaGF2ZSB0aGUgdXNlciBzZWxlY3QgYSBuZXcgcGFzc3dvcmQgaW4gb3JkZXIgdG8gbWVldCB0aGUgY3VycmVudAotICAgICAqIGNvbnN0cmFpbnRzLiAgVXBvbiBiZWluZyByZXN1bWVkIGZyb20gdGhpcyBhY3Rpdml0eSwKLSAgICAgKiB5b3UgY2FuIGNoZWNrIHRoZSBuZXcgcGFzc3dvcmQgY2hhcmFjdGVyaXN0aWNzIHRvIHNlZSBpZiB0aGV5IGFyZQotICAgICAqIHN1ZmZpY2llbnQuCisgICAgICogQWN0aXZpdHkgYWN0aW9uOiBoYXZlIHRoZSB1c2VyIGVudGVyIGEgbmV3IHBhc3N3b3JkLiBUaGlzIGFjdGl2aXR5IHNob3VsZAorICAgICAqIGJlIGxhdW5jaGVkIGFmdGVyIHVzaW5nIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5KENvbXBvbmVudE5hbWUsIGludCl9LAorICAgICAqIG9yIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKENvbXBvbmVudE5hbWUsIGludCl9IHRvIGhhdmUgdGhlIHVzZXIKKyAgICAgKiBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IG1lZXRzIHRoZSBjdXJyZW50IHJlcXVpcmVtZW50cy4gWW91IGNhbiB1c2UKKyAgICAgKiB7QGxpbmsgI2lzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCl9IHRvIGRldGVybWluZSB3aGV0aGVyIHlvdSBuZWVkIHRvCisgICAgICogaGF2ZSB0aGUgdXNlciBzZWxlY3QgYSBuZXcgcGFzc3dvcmQgaW4gb3JkZXIgdG8gbWVldCB0aGUgY3VycmVudAorICAgICAqIGNvbnN0cmFpbnRzLiBVcG9uIGJlaW5nIHJlc3VtZWQgZnJvbSB0aGlzIGFjdGl2aXR5LCB5b3UgY2FuIGNoZWNrIHRoZSBuZXcKKyAgICAgKiBwYXNzd29yZCBjaGFyYWN0ZXJpc3RpY3MgdG8gc2VlIGlmIHRoZXkgYXJlIHN1ZmZpY2llbnQuCiAgICAgICovCiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5BQ1RJVklUWV9JTlRFTlRfQUNUSU9OKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRVRfTkVXX1BBU1NXT1JECiAgICAgICAgICAgICA9ICJhbmRyb2lkLmFwcC5hY3Rpb24uU0VUX05FV19QQVNTV09SRCI7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYWRtaW5pc3RyYXRvciBjb21wb25lbnQgaXMgY3VycmVudGx5CiAgICAgICogYWN0aXZlIChlbmFibGVkKSBpbiB0aGUgc3lzdGVtLgpAQCAtMTMwLDcgKzEzMSw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIGN1cnJlbnRseSBhY3RpdmUgZGV2aWNlIGFkbWluaXN0cmF0b3IncyBjb21wb25lbnQKICAgICAgKiBuYW1lcy4gIE5vdGUgdGhhdCBpZiB0aGVyZSBhcmUgbm8gYWRtaW5pc3RyYXRvcnMgdGhhbiBudWxsIG1heSBiZQpAQCAtMTQ2LDcgKzE0Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTE2MCw3ICsxNjEsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZW1vdmUgYSBjdXJyZW50IGFkbWluaXN0cmF0aW9uIGNvbXBvbmVudC4gIFRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkCiAgICAgICogYnkgdGhlIGFwcGxpY2F0aW9uIHRoYXQgb3ducyB0aGUgYWRtaW5pc3RyYXRpb24gY29tcG9uZW50OyBpZiB5b3UKQEAgLTE3NiwyOCArMTc3LDI4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDb25zdGFudCBmb3Ige0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9OiB0aGUgcG9saWN5IGhhcyBubyByZXF1aXJlbWVudHMKICAgICAgKiBmb3IgdGhlIHBhc3N3b3JkLiAgTm90ZSB0aGF0IHF1YWxpdHkgY29uc3RhbnRzIGFyZSBvcmRlcmVkIHNvIHRoYXQgaGlnaGVyCiAgICAgICogdmFsdWVzIGFyZSBtb3JlIHJlc3RyaWN0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQgPSAwOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnQgZm9yIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fTogdGhlIHBvbGljeSByZXF1aXJlcyBzb21lIGtpbmQKICAgICAgKiBvZiBwYXNzd29yZCwgYnV0IGRvZXNuJ3QgY2FyZSB3aGF0IGl0IGlzLiAgTm90ZSB0aGF0IHF1YWxpdHkgY29uc3RhbnRzCiAgICAgICogYXJlIG9yZGVyZWQgc28gdGhhdCBoaWdoZXIgdmFsdWVzIGFyZSBtb3JlIHJlc3RyaWN0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HID0gMHgxMDAwMDsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENvbnN0YW50IGZvciB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX06IHRoZSB1c2VyIG11c3QgaGF2ZSBlbnRlcmVkIGEKICAgICAgKiBwYXNzd29yZCBjb250YWluaW5nIGF0IGxlYXN0IG51bWVyaWMgY2hhcmFjdGVycy4gIE5vdGUgdGhhdCBxdWFsaXR5CiAgICAgICogY29uc3RhbnRzIGFyZSBvcmRlcmVkIHNvIHRoYXQgaGlnaGVyIHZhbHVlcyBhcmUgbW9yZSByZXN0cmljdGl2ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTV09SRF9RVUFMSVRZX05VTUVSSUMgPSAweDIwMDAwOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnQgZm9yIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fTogdGhlIHVzZXIgbXVzdCBoYXZlIGVudGVyZWQgYQogICAgICAqIHBhc3N3b3JkIGNvbnRhaW5pbmcgYXQgbGVhc3QgYWxwaGFiZXRpYyAob3Igb3RoZXIgc3ltYm9sKSBjaGFyYWN0ZXJzLgpAQCAtMjA1LDcgKzIwNiw3IEBACiAgICAgICogcmVzdHJpY3RpdmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDID0gMHg0MDAwMDsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENvbnN0YW50IGZvciB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX06IHRoZSB1c2VyIG11c3QgaGF2ZSBlbnRlcmVkIGEKICAgICAgKiBwYXNzd29yZCBjb250YWluaW5nIGF0IGxlYXN0IDxlbT5ib3RoPjwvZW0+IG51bWVyaWMgPGVtPmFuZDwvZW0+CkBAIC0yMTMsNyArMjE0LDE5IEBACiAgICAgICogb3JkZXJlZCBzbyB0aGF0IGhpZ2hlciB2YWx1ZXMgYXJlIG1vcmUgcmVzdHJpY3RpdmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMgPSAweDUwMDAwOwotICAgIAorCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZm9yIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fTogdGhlIHVzZXIgbXVzdCBoYXZlIGVudGVyZWQgYQorICAgICAqIHBhc3N3b3JkIGNvbnRhaW5pbmcgYXQgbGVhc3QgYSBsZXR0ZXIsIGEgbnVtZXJpY2FsIGRpZ2l0IGFuZCBhIHNwZWNpYWwKKyAgICAgKiBzeW1ib2wsIGJ5IGRlZmF1bHQuIFdpdGggdGhpcyBwYXNzd29yZCBxdWFsaXR5LCBwYXNzd29yZHMgY2FuIGJlCisgICAgICogcmVzdHJpY3RlZCB0byBjb250YWluIHZhcmlvdXMgc2V0cyBvZiBjaGFyYWN0ZXJzLCBsaWtlIGF0IGxlYXN0IGFuCisgICAgICogdXBwZXJjYXNlIGxldHRlciwgZXRjLiBUaGVzZSBhcmUgc3BlY2lmaWVkIHVzaW5nIHZhcmlvdXMgbWV0aG9kcywKKyAgICAgKiBsaWtlIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUsIGludCl9LiBOb3RlCisgICAgICogdGhhdCBxdWFsaXR5IGNvbnN0YW50cyBhcmUgb3JkZXJlZCBzbyB0aGF0IGhpZ2hlciB2YWx1ZXMgYXJlIG1vcmUKKyAgICAgKiByZXN0cmljdGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVggPSAweDYwMDAwOworCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKICAgICAgKiBwYXNzd29yZCByZXN0cmljdGlvbnMgaXQgaXMgaW1wb3NpbmcuICBBZnRlciBzZXR0aW5nIHRoaXMsIHRoZSB1c2VyCkBAIC0yMjIsMjEgKzIzNSwyMSBAQAogICAgICAqIHdpbGwgcmVtYWluIHVudGlsIHRoZSB1c2VyIGhhcyBzZXQgYSBuZXcgb25lLCBzbyB0aGUgY2hhbmdlIGRvZXMgbm90CiAgICAgICogdGFrZSBwbGFjZSBpbW1lZGlhdGVseS4gIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQogICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlF1YWxpdHkgY29uc3RhbnRzIGFyZSBvcmRlcmVkIHNvIHRoYXQgaGlnaGVyIHZhbHVlcyBhcmUgbW9yZSByZXN0cmljdGl2ZTsKICAgICAgKiB0aHVzIHRoZSBoaWdoZXN0IHJlcXVlc3RlZCBxdWFsaXR5IGNvbnN0YW50IChiZXR3ZWVuIHRoZSBwb2xpY3kgc2V0IGhlcmUsCiAgICAgICogdGhlIHVzZXIncyBwcmVmZXJlbmNlLCBhbmQgYW55IG90aGVyIGNvbnNpZGVyYXRpb25zKSBpcyB0aGUgb25lIHRoYXQKICAgICAgKiBpcyBpbiBlZmZlY3QuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQgd2l0aC4KICAgICAgKiBAcGFyYW0gcXVhbGl0eSBUaGUgbmV3IGRlc2lyZWQgcXVhbGl0eS4gIE9uZSBvZgogICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRH0sIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkd9LAogICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDfSwge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUN9LAotICAgICAqIG9yIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9LgorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9IG9yIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZFF1YWxpdHkoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IHF1YWxpdHkpIHsKICAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKQEAgLTI0Nyw3ICsyNjAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbWluaW11bSBwYXNzd29yZCBxdWFsaXR5IGZvciBhbGwgYWRtaW5zCiAgICAgICogb3IgYSBwYXJ0aWN1bGFyIG9uZS4KQEAgLTI2NCw3ICsyNzcsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBQQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCiAgICAgICogbWluaW11bSBhbGxvd2VkIHBhc3N3b3JkIGxlbmd0aC4gIEFmdGVyIHNldHRpbmcgdGhpcywgdGhlIHVzZXIKQEAgLTI3NCwxNCArMjg3LDE0IEBACiAgICAgICogdGFrZSBwbGFjZSBpbW1lZGlhdGVseS4gIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQogICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gIFRoaXMKICAgICAgKiBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvciBoYXMgYWxzbyByZXF1ZXN0ZWQgZWl0aGVyCi0gICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX05VTUVSSUN9LCB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQ30sCi0gICAgICogb3Ige0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQ30KKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQ30sIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDfQorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9LCBvciB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0KICAgICAgKiB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCiAgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZCB3aXRoLgogICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG5ldyBkZXNpcmVkIG1pbmltdW0gcGFzc3dvcmQgbGVuZ3RoLiAgQSB2YWx1ZSBvZiAwCiAgICAgICogbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCkBAIC0yOTUsNyArMzA4LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG1pbmltdW0gcGFzc3dvcmQgbGVuZ3RoIGZvciBhbGwgYWRtaW5zCiAgICAgICogb3IgYSBwYXJ0aWN1bGFyIG9uZS4KQEAgLTMxMiw3ICszMjUsMzc5IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIAorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiB1cHBlciBjYXNlIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlcgorICAgICAqIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzCisgICAgICogbm90IGF0IGxlYXN0IGFzIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQKKyAgICAgKiBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzCisgICAgICogbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQorICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcworICAgICAqIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyAwLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiB1cHBlciBjYXNlIGxldHRlcnMKKyAgICAgKiAgICAgICAgICAgIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vCisgICAgICogICAgICAgICAgICByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2YgdXBwZXIgY2FzZSBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGZvciBhbGwgYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIHVwcGVyIGNhc2UgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiBsb3dlciBjYXNlIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlcgorICAgICAqIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzCisgICAgICogbm90IGF0IGxlYXN0IGFzIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQKKyAgICAgKiBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzCisgICAgICogbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQorICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcworICAgICAqIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyAwLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiBsb3dlciBjYXNlIGxldHRlcnMKKyAgICAgKiAgICAgICAgICAgIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vCisgICAgICogICAgICAgICAgICByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2YgbG93ZXIgY2FzZSBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGZvciBhbGwgYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIGxvd2VyIGNhc2UgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQWZ0ZXIgc2V0dGluZyB0aGlzLAorICAgICAqIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8gZW50ZXIgYSBuZXcgcGFzc3dvcmQgdGhhdCBpcyBub3QgYXQgbGVhc3QgYXMKKyAgICAgKiByZXN0cmljdGl2ZSBhcyB3aGF0IGhhcyBiZWVuIHNldC4gTm90ZSB0aGF0IHRoZSBjdXJyZW50IHBhc3N3b3JkIHdpbGwKKyAgICAgKiByZW1haW4gdW50aWwgdGhlIHVzZXIgaGFzIHNldCBhIG5ldyBvbmUsIHNvIHRoZSBjaGFuZ2UgZG9lcyBub3QgdGFrZQorICAgICAqIHBsYWNlIGltbWVkaWF0ZWx5LiBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHBhc3N3b3JkLCB1c2UKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuIFRoaXMKKyAgICAgKiBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvciBoYXMgYWxzbyByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0gd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uIFRoZQorICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgMS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQKKyAgICAgKiAgICAgICAgICAgIHdpdGguCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbmV3IGRlc2lyZWQgbWluaW11bSBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhc3N3b3JkLiBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhDb21wb25lbnROYW1lIGFkbWluLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNldFBhc3N3b3JkTWluaW11bUxldHRlcnMoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQgZm9yIGFsbAorICAgICAqIGFkbWlucyBvciBhIHBhcnRpY3VsYXIgb25lLiBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzCisgICAgICogc2V0IGJ5IHsjbGluayB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bUxldHRlcnMoQ29tcG9uZW50TmFtZSwgaW50KX0KKyAgICAgKiBhbmQgb25seSBhcHBsaWVzIHdoZW4gdGhlIHBhc3N3b3JkIHF1YWxpdHkgaXMKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gVGhlIG5hbWUgb2YgdGhlIGFkbWluIGNvbXBvbmVudCB0byBjaGVjaywgb3IgbnVsbCB0bworICAgICAqICAgICAgICAgICAgYWdncmVnYXRlIGFsbCBhZG1pbnMuCisgICAgICogQHJldHVybiBUaGUgbWluaW11bSBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bUxldHRlcnMoYWRtaW4pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogbWluaW11bSBudW1iZXIgb2YgbnVtZXJpY2FsIGRpZ2l0cyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuIEFmdGVyCisgICAgICogc2V0dGluZyB0aGlzLCB0aGUgdXNlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGVudGVyIGEgbmV3IHBhc3N3b3JkIHRoYXQgaXMKKyAgICAgKiBub3QgYXQgbGVhc3QgYXMgcmVzdHJpY3RpdmUgYXMgd2hhdCBoYXMgYmVlbiBzZXQuIE5vdGUgdGhhdCB0aGUgY3VycmVudAorICAgICAqIHBhc3N3b3JkIHdpbGwgcmVtYWluIHVudGlsIHRoZSB1c2VyIGhhcyBzZXQgYSBuZXcgb25lLCBzbyB0aGUgY2hhbmdlIGRvZXMKKyAgICAgKiBub3QgdGFrZSBwbGFjZSBpbW1lZGlhdGVseS4gVG8gcHJvbXB0IHRoZSB1c2VyIGZvciBhIG5ldyBwYXNzd29yZCwgdXNlCisgICAgICoge0BsaW5rICNBQ1RJT05fU0VUX05FV19QQVNTV09SRH0gYWZ0ZXIgc2V0dGluZyB0aGlzIHZhbHVlLiBUaGlzCisgICAgICogY29uc3RyYWludCBpcyBvbmx5IGltcG9zZWQgaWYgdGhlIGFkbWluaXN0cmF0b3IgaGFzIGFsc28gcmVxdWVzdGVkCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9IHdpdGgge0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9LiBUaGUKKyAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIDEuCisgICAgICogPHA+CisgICAgICogVGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwKKyAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkCisgICAgICogICAgICAgICAgICB3aXRoLgorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG5ldyBkZXNpcmVkIG1pbmltdW0gbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgcmVxdWlyZWQKKyAgICAgKiAgICAgICAgICAgIGluIHRoZSBwYXNzd29yZC4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bU51bWVyaWMoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkCisgICAgICogZm9yIGFsbCBhZG1pbnMgb3IgYSBwYXJ0aWN1bGFyIG9uZS4gVGhpcyBpcyB0aGUgc2FtZSB2YWx1ZSBhcworICAgICAqIHNldCBieSB7I2xpbmsge0BsaW5rICNzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhDb21wb25lbnROYW1lIGFkbWluKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKGFkbWluKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZQorICAgICAqIG1pbmltdW0gbnVtYmVyIG9mIHN5bWJvbHMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlciBzZXR0aW5nIHRoaXMsCisgICAgICogdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzIG5vdCBhdCBsZWFzdCBhcworICAgICAqIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgcGFzc3dvcmQgd2lsbAorICAgICAqIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzIG5vdCB0YWtlCisgICAgICogcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQorICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcworICAgICAqIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyAxLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiBzeW1ib2xzIHJlcXVpcmVkIGluIHRoZQorICAgICAqICAgICAgICAgICAgcGFzc3dvcmQuIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubyByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhhZG1pbiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG51bWJlciBvZiBzeW1ib2xzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZCBmb3IgYWxsCisgICAgICogYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhDb21wb25lbnROYW1lLCBpbnQpfQorICAgICAqIGFuZCBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgcGFzc3dvcmQgcXVhbGl0eSBpcworICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvCisgICAgICogICAgICAgICAgICBhZ2dyZWdhdGUgYWxsIGFkbWlucy4KKyAgICAgKiBAcmV0dXJuIFRoZSBtaW5pbXVtIG51bWJlciBvZiBzeW1ib2xzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoQ29tcG9uZW50TmFtZSBhZG1pbikgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiBub24tbGV0dGVyIGNoYXJhY3RlcnMgKG51bWVyaWNhbCBkaWdpdHMgb3Igc3ltYm9scykKKyAgICAgKiByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuIEFmdGVyIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZQorICAgICAqIHRvIGVudGVyIGEgbmV3IHBhc3N3b3JkIHRoYXQgaXMgbm90IGF0IGxlYXN0IGFzIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzCisgICAgICogYmVlbiBzZXQuIE5vdGUgdGhhdCB0aGUgY3VycmVudCBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMKKyAgICAgKiBzZXQgYSBuZXcgb25lLCBzbyB0aGUgY2hhbmdlIGRvZXMgbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdAorICAgICAqIHRoZSB1c2VyIGZvciBhIG5ldyBwYXNzd29yZCwgdXNlIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyCisgICAgICogc2V0dGluZyB0aGlzIHZhbHVlLiBUaGlzIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yCisgICAgICogaGFzIGFsc28gcmVxdWVzdGVkIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoCisgICAgICoge0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqICAgICAgICAgICAgcGFzc3dvcmQuIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubyByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2Ygbm9uLWxldHRlciBjaGFyYWN0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGZvciBhbGwgYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZSBsZW5ndGgKKyAgICogb2YgdGhlIHBhc3N3b3JkIGhpc3RvcnkuIEFmdGVyIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0bworICAgKiBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzIHRoZSBzYW1lIGFzIGFueSBwYXNzd29yZCBpbiB0aGUgaGlzdG9yeS4gTm90ZQorICAgKiB0aGF0IHRoZSBjdXJyZW50IHBhc3N3b3JkIHdpbGwgcmVtYWluIHVudGlsIHRoZSB1c2VyIGhhcyBzZXQgYSBuZXcgb25lLCBzbworICAgKiB0aGUgY2hhbmdlIGRvZXMgbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcKKyAgICogcGFzc3dvcmQsIHVzZSB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuCisgICAqIFRoaXMgY29uc3RyYWludCBpcyBvbmx5IGltcG9zZWQgaWYgdGhlIGFkbWluaXN0cmF0b3IgaGFzIGFsc28gcmVxdWVzdGVkCisgICAqIGVpdGhlciB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQ30sCisgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDfSwgb3IKKyAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQ30gd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uCisgICAqCisgICAqIDxwPgorICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwgdGhpcworICAgKiBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgKgorICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkCisgICAqICAgICAgICB3aXRoLgorICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBsZW5ndGggb2YgcGFzc3dvcmQgaGlzdG9yeS4gQSB2YWx1ZSBvZiAwCisgICAqICAgICAgICBtZWFucyB0aGVyZSBpcyBubyByZXN0cmljdGlvbi4KKyAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgcGFzc3dvcmQgaGlzdG9yeSBsZW5ndGggZm9yIGFsbCBhZG1pbnMKKyAgICAgKiBvciBhIHBhcnRpY3VsYXIgb25lLgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvIGFnZ3JlZ2F0ZQorICAgICAqIGFsbCBhZG1pbnMuCisgICAgICogQHJldHVybiBUaGUgbGVuZ3RoIG9mIHRoZSBwYXNzd29yZCBoaXN0b3J5CisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgoQ29tcG9uZW50TmFtZSBhZG1pbikgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKGFkbWluKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIG1heGltdW0gcGFzc3dvcmQgbGVuZ3RoIHRoYXQgdGhlIGRldmljZSBzdXBwb3J0cyBmb3IgYQogICAgICAqIHBhcnRpY3VsYXIgcGFzc3dvcmQgcXVhbGl0eS4KQEAgLTMyMywxNiArNzA4LDE2IEBACiAgICAgICAgIC8vIEtpbmQtb2YgYXJiaXRyYXJ5LgogICAgICAgICByZXR1cm4gMTY7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGN1cnJlbnQgcGFzc3dvcmQgdGhlIHVzZXIgaGFzIHNldCBpcyBzdWZmaWNpZW50CiAgICAgICogdG8gbWVldCB0aGUgcG9saWN5IHJlcXVpcmVtZW50cyAocXVhbGl0eSwgbWluaW11bSBsZW5ndGgpIHRoYXQgaGF2ZSBiZWVuCiAgICAgICogcmVxdWVzdGVkLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwKICAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc3dvcmQgbWVldHMgdGhlIGN1cnJlbnQgcmVxdWlyZW1lbnRzLAogICAgICAqIGVsc2UgZmFsc2UuCiAgICAgICovCkBAIC0zNDYsMTEgKzczMSwxMSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSB1c2VyIGhhcyBmYWlsZWQgYXQgZW50ZXJpbmcgYQogICAgICAqIHBhc3N3b3JkIHNpbmNlIHRoYXQgbGFzdCBzdWNjZXNzZnVsIHBhc3N3b3JkIGVudHJ5LgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1dBVENIX0xPR0lOfSB0byBiZSBhYmxlIHRvIGNhbGwKICAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCkBAIC0zNzMsMTQgKzc1OCwxNCBAQAogICAgICAqIHdhdGNoaW5nIGZvciBmYWlsZWQgcGFzc3dvcmRzIGFuZCB3aXBpbmcgdGhlIGRldmljZSwgYW5kIHJlcXVpcmVzCiAgICAgICogdGhhdCB5b3UgcmVxdWVzdCBib3RoIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfV0FUQ0hfTE9HSU59IGFuZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfV0lQRV9EQVRBfX0uCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UbyBpbXBsZW1lbnQgYW55IG90aGVyIHBvbGljeSAoZS5nLiB3aXBpbmcgZGF0YSBmb3IgYSBwYXJ0aWN1bGFyCiAgICAgICogYXBwbGljYXRpb24gb25seSwgZXJhc2luZyBvciByZXZva2luZyBjcmVkZW50aWFscywgb3IgcmVwb3J0aW5nIHRoZQogICAgICAqIGZhaWx1cmUgdG8gYSBzZXJ2ZXIpLCB5b3Ugc2hvdWxkIGltcGxlbWVudAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyI29uUGFzc3dvcmRGYWlsZWQoQ29udGV4dCwgYW5kcm9pZC5jb250ZW50LkludGVudCl9CiAgICAgICogaW5zdGVhZC4gIERvIG5vdCB1c2UgdGhpcyBBUEksIGJlY2F1c2UgaWYgdGhlIG1heGltdW0gY291bnQgaXMgcmVhY2hlZCwKICAgICAgKiB0aGUgZGV2aWNlIHdpbGwgYmUgd2lwZWQgaW1tZWRpYXRlbHksIGFuZCB5b3VyIGNhbGxiYWNrIHdpbGwgbm90IGJlIGludm9rZWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkIHdpdGguCiAgICAgICogQHBhcmFtIG51bSBUaGUgbnVtYmVyIG9mIGZhaWxlZCBwYXNzd29yZCBhdHRlbXB0cyBhdCB3aGljaCBwb2ludCB0aGUKICAgICAgKiBkZXZpY2Ugd2lsbCB3aXBlIGl0cyBkYXRhLgpAQCAtMzk0LDcgKzc3OSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBtYXhpbXVtIG51bWJlciBvZiBsb2dpbiBhdHRlbXB0cyB0aGF0IGFyZSBhbGxvd2VkCiAgICAgICogYmVmb3JlIHRoZSBkZXZpY2Ugd2lwZXMgaXRzZWxmLCBmb3IgYWxsIGFkbWlucwpAQCAtNDEyLDEzICs3OTcsMTMgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBGbGFnIGZvciB7QGxpbmsgI3Jlc2V0UGFzc3dvcmR9OiBkb24ndCBhbGxvdyBvdGhlciBhZG1pbnMgdG8gY2hhbmdlCiAgICAgICogdGhlIHBhc3N3b3JkIGFnYWluIHVudGlsIHRoZSB1c2VyIGhhcyBlbnRlcmVkIGl0LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU0VUX1BBU1NXT1JEX1JFUVVJUkVfRU5UUlkgPSAweDAwMDE7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBGb3JjZSBhIG5ldyBkZXZpY2UgdW5sb2NrIHBhc3N3b3JkICh0aGUgcGFzc3dvcmQgbmVlZGVkIHRvIGFjY2VzcyB0aGUKICAgICAgKiBlbnRpcmUgZGV2aWNlLCBub3QgZm9yIGluZGl2aWR1YWwgYWNjb3VudHMpIG9uIHRoZSB1c2VyLiAgVGhpcyB0YWtlcwpAQCAtNDMxLDExICs4MTYsMTEgQEAKICAgICAgKiB0aGF0IHRoZSBwYXNzd29yZCBtYXkgYmUgYSBzdHJvbmdlciBxdWFsaXR5IChjb250YWluaW5nIGFscGhhbnVtZXJpYwogICAgICAqIGNoYXJhY3RlcnMgd2hlbiB0aGUgcmVxdWVzdGVkIHF1YWxpdHkgaXMgb25seSBudW1lcmljKSwgaW4gd2hpY2ggY2FzZQogICAgICAqIHRoZSBjdXJyZW50bHkgYWN0aXZlIHF1YWxpdHkgd2lsbCBiZSBpbmNyZWFzZWQgdG8gbWF0Y2guCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfUkVTRVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBwYXNzd29yZCBUaGUgbmV3IHBhc3N3b3JkIGZvciB0aGUgdXNlci4KICAgICAgKiBAcGFyYW0gZmxhZ3MgTWF5IGJlIDAgb3Ige0BsaW5rICNSRVNFVF9QQVNTV09SRF9SRVFVSVJFX0VOVFJZfS4KICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc3dvcmQgd2FzIGFwcGxpZWQsIG9yIGZhbHNlIGlmIGl0IGlzCkBAIC00NTEsMTYgKzgzNiwxNiBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZQogICAgICAqIG1heGltdW0gdGltZSBmb3IgdXNlciBhY3Rpdml0eSB1bnRpbCB0aGUgZGV2aWNlIHdpbGwgbG9jay4gIFRoaXMgbGltaXRzCiAgICAgICogdGhlIGxlbmd0aCB0aGF0IHRoZSB1c2VyIGNhbiBzZXQuICBJdCB0YWtlcyBlZmZlY3QgaW1tZWRpYXRlbHkuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfRk9SQ0VfTE9DS30gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZCB3aXRoLgogICAgICAqIEBwYXJhbSB0aW1lTXMgVGhlIG5ldyBkZXNpcmVkIG1heGltdW0gdGltZSB0byBsb2NrIGluIG1pbGxpc2Vjb25kcy4KICAgICAgKiBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCkBAIC00NzQsNyArODU5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG1heGltdW0gdGltZSB0byB1bmxvY2sgZm9yIGFsbCBhZG1pbnMKICAgICAgKiBvciBhIHBhcnRpY3VsYXIgb25lLgpAQCAtNDkxLDExICs4NzYsMTEgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBNYWtlIHRoZSBkZXZpY2UgbG9jayBpbW1lZGlhdGVseSwgYXMgaWYgdGhlIGxvY2sgc2NyZWVuIHRpbWVvdXQgaGFzCiAgICAgICogZXhwaXJlZCBhdCB0aGUgcG9pbnQgb2YgdGhpcyBjYWxsLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0ZPUkNFX0xPQ0t9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KQEAgLTUwOSwxNiArODk0LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBBc2sgdGhlIHVzZXIgZGF0ZSBiZSB3aXBlZC4gIFRoaXMgd2lsbCBjYXVzZSB0aGUgZGV2aWNlIHRvIHJlYm9vdCwKICAgICAgKiBlcmFzaW5nIGFsbCB1c2VyIGRhdGEgd2hpbGUgbmV4dCBib290aW5nIHVwLiAgRXh0ZXJuYWwgc3RvcmFnZSBzdWNoCiAgICAgICogYXMgU0QgY2FyZHMgd2lsbCBub3QgYmUgZXJhc2VkLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1dJUEVfREFUQX0gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGZsYWdzIEJpdCBtYXNrIG9mIGFkZGl0aW9uYWwgb3B0aW9uczogY3VycmVudGx5IG11c3QgYmUgMC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3aXBlRGF0YShpbnQgZmxhZ3MpIHsKQEAgLTUzMCw3ICs5MTUsOTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogZ2xvYmFsIHByb3h5IGFuZCBleGNsdXNpb24gbGlzdC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfU0VUU19HTE9CQUxfUFJPWFl9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKiBPbmx5IHRoZSBmaXJzdCBkZXZpY2UgYWRtaW4gY2FuIHNldCB0aGUgcHJveHkuIElmIGEgc2Vjb25kIGFkbWluIGF0dGVtcHRzCisgICAgICogdG8gc2V0IHRoZSBwcm94eSwgdGhlIHtAbGluayBDb21wb25lbnROYW1lfSBvZiB0aGUgYWRtaW4gb3JpZ2luYWxseSBzZXR0aW5nIHRoZQorICAgICAqIHByb3h5IHdpbGwgYmUgcmV0dXJuZWQuIElmIHN1Y2Nlc3NmdWwgaW4gc2V0dGluZyB0aGUgcHJveHksIG51bGwgd2lsbAorICAgICAqIGJlIHJldHVybmVkLgorICAgICAqIFRoZSBtZXRob2QgY2FuIGJlIGNhbGxlZCByZXBlYXRlZGx5IGJ5IHRoZSBkZXZpY2UgYWRtaW4gYWxyYWR5IHNldHRpbmcgdGhlCisgICAgICogcHJveHkgdG8gdXBkYXRlIHRoZSBwcm94eSBhbmQgZXhjbHVzaW9uIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkCisgICAgICogICAgICAgICAgICB3aXRoLgorICAgICAqIEBwYXJhbSBwcm94eVNwZWMgdGhlIGdsb2JhbCBwcm94eSBkZXNpcmVkLiBNdXN0IGJlIGFuIEhUVFAgUHJveHkuCisgICAgICogICAgICAgICAgICBQYXNzIFByb3h5Lk5PX1BST1hZIHRvIHJlc2V0IHRoZSBwcm94eS4KKyAgICAgKiBAcGFyYW0gZXhjbHVzaW9uTGlzdCBhIGxpc3Qgb2YgZG9tYWlucyB0byBiZSBleGNsdWRlZCBmcm9tIHRoZSBnbG9iYWwgcHJveHkuCisgICAgICogQHJldHVybiByZXR1cm5zIG51bGwgaWYgdGhlIHByb3h5IHdhcyBzdWNjZXNzZnVsbHkgc2V0LCBvciBhIHtAbGluayBDb21wb25lbnROYW1lfQorICAgICAqICAgICAgICAgICAgb2YgdGhlIGRldmljZSBhZG1pbiB0aGF0IHNldHMgdGhldyBwcm94eSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIENvbXBvbmVudE5hbWUgc2V0R2xvYmFsUHJveHkoQ29tcG9uZW50TmFtZSBhZG1pbiwgUHJveHkgcHJveHlTcGVjLAorICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1c2lvbkxpc3QgKSB7CisgICAgICAgIGlmIChwcm94eVNwZWMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3RTcGVjOworICAgICAgICAgICAgICAgIFN0cmluZyBleGNsU3BlYzsKKyAgICAgICAgICAgICAgICBpZiAocHJveHlTcGVjLmVxdWFscyhQcm94eS5OT19QUk9YWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaG9zdFNwZWMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBleGNsU3BlYyA9IG51bGw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm94eVNwZWMudHlwZSgpLmVxdWFscyhQcm94eS5UeXBlLkhUVFApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3Mgc2EgPSAoSW5ldFNvY2tldEFkZHJlc3MpcHJveHlTcGVjLmFkZHJlc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gc2EuZ2V0SG9zdE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQgPSBzYS5nZXRQb3J0KCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgaG9zdEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICBob3N0U3BlYyA9IGhvc3RCdWlsZGVyLmFwcGVuZChob3N0TmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIjoiKS5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhwb3J0KSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2x1c2lvbkxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhjbFNwZWMgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgbGlzdEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdERvbWFpbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBleGNsRG9tYWluIDogZXhjbHVzaW9uTGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3REb21haW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEJ1aWxkZXIgPSBsaXN0QnVpbGRlci5hcHBlbmQoIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdERvbWFpbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0QnVpbGRlciA9IGxpc3RCdWlsZGVyLmFwcGVuZChleGNsRG9tYWluLnRyaW0oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBleGNsU3BlYyA9IGxpc3RCdWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5uZXQuUHJveHkudmFsaWRhdGUoaG9zdE5hbWUsIEludGVnZXIudG9TdHJpbmcocG9ydCksIGV4Y2xTcGVjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnNldEdsb2JhbFByb3h5KGFkbWluLCBob3N0U3BlYywgZXhjbFNwZWMpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBuYW1lIHNldHRpbmcgdGhlIGdsb2JhbCBwcm94eS4KKyAgICAgKiBAcmV0dXJuIENvbXBvbmVudE5hbWUgb2JqZWN0IG9mIHRoZSBkZXZpY2UgYWRtaW4gdGhhdCBzZXQgdGhlIGdsb2JhbCBwcm94eSwgb3IKKyAgICAgKiAgICAgICAgICAgIG51bGwgaWYgbm8gYWRtaW4gaGFzIHNldCB0aGUgcHJveHkuCisgICAgICovCisgICAgcHVibGljIENvbXBvbmVudE5hbWUgZ2V0R2xvYmFsUHJveHlBZG1pbigpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldEdsb2JhbFByb3h5QWRtaW4oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwpAQCAtNTQzLDcgKzEwMTMsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTU1NiwxMCArMTAyNiwxMCBAQAogICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIHJldHJpZXZlIGRldmljZSBwb2xpY3kgIiArIGNuLCBlKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIFJlc29sdmVJbmZvIHJpID0gbmV3IFJlc29sdmVJbmZvKCk7CiAgICAgICAgIHJpLmFjdGl2aXR5SW5mbyA9IGFpOwotICAgICAgICAKKwogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXZpY2VBZG1pbkluZm8obUNvbnRleHQsIHJpKTsKICAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7CkBAIC01NzAsNyArMTA0MCw3IEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC01ODcsMTYgKzEwNTcsMTggQEAKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoaW50IHF1YWxpdHksIGludCBsZW5ndGgpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoLCBpbnQgbGV0dGVycywgaW50IHVwcGVyY2FzZSwKKyAgICAgICAgICAgIGludCBsb3dlcmNhc2UsIGludCBudW1iZXJzLCBpbnQgc3ltYm9scywgaW50IG5vbmxldHRlcikgewogICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKHF1YWxpdHksIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShxdWFsaXR5LCBsZW5ndGgsIGxldHRlcnMsIHVwcGVyY2FzZSwgbG93ZXJjYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVycywgc3ltYm9scywgbm9ubGV0dGVyKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC02MDksNyArMTA4MSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwpAQCAtNjIyLDQgKzEwOTQsNSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorCiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vSURldmljZVBvbGljeU1hbmFnZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9JRGV2aWNlUG9saWN5TWFuYWdlci5haWRsCmluZGV4IDZmYzRkYzUuLjNmY2Q2ZmMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9JRGV2aWNlUG9saWN5TWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9JRGV2aWNlUG9saWN5TWFuYWdlci5haWRsCkBAIC0yNywxMCArMjcsMzEgQEAKIGludGVyZmFjZSBJRGV2aWNlUG9saWN5TWFuYWdlciB7CiAgICAgdm9pZCBzZXRQYXNzd29yZFF1YWxpdHkoaW4gQ29tcG9uZW50TmFtZSB3aG8sIGludCBxdWFsaXR5KTsKICAgICBpbnQgZ2V0UGFzc3dvcmRRdWFsaXR5KGluIENvbXBvbmVudE5hbWUgd2hvKTsKLSAgICAKKwogICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKICAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkTWluaW11bUxldHRlcnMoaW4gQ29tcG9uZW50TmFtZSB3aG8pOworCisgICAgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhpbiBDb21wb25lbnROYW1lIHdobyk7CisKKyAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoaW4gQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpOworICAgIGludCBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKGluIENvbXBvbmVudE5hbWUgd2hvKTsKICAgICAKKyAgICB2b2lkIHNldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChpbiBDb21wb25lbnROYW1lIHdobyk7CisKICAgICBib29sZWFuIGlzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCk7CiAgICAgaW50IGdldEN1cnJlbnRGYWlsZWRQYXNzd29yZEF0dGVtcHRzKCk7CiAgICAgCkBAIC00NSw2ICs2Niw5IEBACiAgICAgdm9pZCBsb2NrTm93KCk7CiAgICAgCiAgICAgdm9pZCB3aXBlRGF0YShpbnQgZmxhZ3MpOworCisgICAgQ29tcG9uZW50TmFtZSBzZXRHbG9iYWxQcm94eShpbiBDb21wb25lbnROYW1lIGFkbWluLCBTdHJpbmcgcHJveHlTcGVjLCBTdHJpbmcgZXhjbHVzaW9uTGlzdCk7CisgICAgQ29tcG9uZW50TmFtZSBnZXRHbG9iYWxQcm94eUFkbWluKCk7CiAgICAgCiAgICAgdm9pZCBzZXRBY3RpdmVBZG1pbihpbiBDb21wb25lbnROYW1lIHBvbGljeVJlY2VpdmVyKTsKICAgICBib29sZWFuIGlzQWRtaW5BY3RpdmUoaW4gQ29tcG9uZW50TmFtZSBwb2xpY3lSZWNlaXZlcik7CkBAIC01Myw3ICs3Nyw4IEBACiAgICAgdm9pZCBnZXRSZW1vdmVXYXJuaW5nKGluIENvbXBvbmVudE5hbWUgcG9saWN5UmVjZWl2ZXIsIGluIFJlbW90ZUNhbGxiYWNrIHJlc3VsdCk7CiAgICAgdm9pZCByZW1vdmVBY3RpdmVBZG1pbihpbiBDb21wb25lbnROYW1lIHBvbGljeVJlY2VpdmVyKTsKICAgICAKLSAgICB2b2lkIHNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoaW50IHF1YWxpdHksIGludCBsZW5ndGgpOworICAgIHZvaWQgc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShpbnQgcXVhbGl0eSwgaW50IGxlbmd0aCwgaW50IGxldHRlcnMsIGludCB1cHBlcmNhc2UsIGludCBsb3dlcmNhc2UsCisgICAgICAgIGludCBudW1iZXJzLCBpbnQgc3ltYm9scywgaW50IG5vbmxldHRlcik7CiAgICAgdm9pZCByZXBvcnRGYWlsZWRQYXNzd29yZEF0dGVtcHQoKTsKICAgICB2b2lkIHJlcG9ydFN1Y2Nlc3NmdWxQYXNzd29yZEF0dGVtcHQoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdC5qYXZhCmluZGV4IGIyZmMxM2YuLjc3MzA5NDIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldEhvc3QuamF2YQpAQCAtMzksNiArMzksNyBAQAogCiAgICAgc3RhdGljIGZpbmFsIGludCBIQU5ETEVfVVBEQVRFID0gMTsKICAgICBzdGF0aWMgZmluYWwgaW50IEhBTkRMRV9QUk9WSURFUl9DSEFOR0VEID0gMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IEhBTkRMRV9WSUVXX0RBVEFfQ0hBTkdFRCA9IDM7CiAKICAgICBmaW5hbCBzdGF0aWMgT2JqZWN0IHNTZXJ2aWNlTG9jayA9IG5ldyBPYmplY3QoKTsKICAgICBzdGF0aWMgSUFwcFdpZGdldFNlcnZpY2Ugc1NlcnZpY2U7CkBAIC02MCw2ICs2MSwxMyBAQAogICAgICAgICAgICAgbXNnLm9iaiA9IGluZm87CiAgICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CiAgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aWV3RGF0YUNoYW5nZWQoaW50IGFwcFdpZGdldElkLCBpbnQgdmlld0lkKSB7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoSEFORExFX1ZJRVdfREFUQV9DSEFOR0VEKTsKKyAgICAgICAgICAgIG1zZy5hcmcxID0gYXBwV2lkZ2V0SWQ7CisgICAgICAgICAgICBtc2cuYXJnMiA9IHZpZXdJZDsKKyAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGNsYXNzIFVwZGF0ZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKQEAgLTc3LDYgKzg1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIG9uUHJvdmlkZXJDaGFuZ2VkKG1zZy5hcmcxLCAoQXBwV2lkZ2V0UHJvdmlkZXJJbmZvKW1zZy5vYmopOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBIQU5ETEVfVklFV19EQVRBX0NIQU5HRUQ6IHsKKyAgICAgICAgICAgICAgICAgICAgdmlld0RhdGFDaGFuZ2VkKG1zZy5hcmcxLCBtc2cuYXJnMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI1MCw2ICsyNjIsMTYgQEAKICAgICAgICAgICAgIHYudXBkYXRlQXBwV2lkZ2V0KHZpZXdzKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHZvaWQgdmlld0RhdGFDaGFuZ2VkKGludCBhcHBXaWRnZXRJZCwgaW50IHZpZXdJZCkgeworICAgICAgICBBcHBXaWRnZXRIb3N0VmlldyB2OworICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3cykgeworICAgICAgICAgICAgdiA9IG1WaWV3cy5nZXQoYXBwV2lkZ2V0SWQpOworICAgICAgICB9CisgICAgICAgIGlmICh2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHYudmlld0RhdGFDaGFuZ2VkKHZpZXdJZCk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldEhvc3RWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdFZpZXcuamF2YQppbmRleCBiMzNiMDk3Li40ZjhlZTkzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdFZpZXcuamF2YQpAQCAtMjMsMTUgKzIzLDE4IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CkBAIC0yNTgsNiArMjYxLDIyIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUHJvY2VzcyBkYXRhLWNoYW5nZWQgbm90aWZpY2F0aW9ucyBmb3IgdGhlIHNwZWNpZmllZCB2aWV3IGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBzZXQgb2Yge0BsaW5rIFJlbW90ZVZpZXdzfSB2aWV3cy4KKyAgICAgKi8KKyAgICB2b2lkIHZpZXdEYXRhQ2hhbmdlZChpbnQgdmlld0lkKSB7CisgICAgICAgIFZpZXcgdiA9IGZpbmRWaWV3QnlJZCh2aWV3SWQpOworICAgICAgICBpZiAoKHYgIT0gbnVsbCkgJiYgKHYgaW5zdGFuY2VvZiBBZGFwdGVyVmlldzw/PikpIHsKKyAgICAgICAgICAgIEFkYXB0ZXJWaWV3PD8+IGFkYXB0ZXJWaWV3ID0gKEFkYXB0ZXJWaWV3PD8+KSB2OworICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gYWRhcHRlclZpZXcuZ2V0QWRhcHRlcigpOworICAgICAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBCYXNlQWRhcHRlcikgeworICAgICAgICAgICAgICAgIEJhc2VBZGFwdGVyIGJhc2VBZGFwdGVyID0gKEJhc2VBZGFwdGVyKSBhZGFwdGVyOworICAgICAgICAgICAgICAgIGJhc2VBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBCdWlsZCBhIHtAbGluayBDb250ZXh0fSBjbG9uZWQgaW50byBhbm90aGVyIHBhY2thZ2UgbmFtZSwgdXN1YWxseSBmb3IgdGhlCiAgICAgICogcHVycG9zZXMgb2YgcmVhZGluZyByZW1vdGUgcmVzb3VyY2VzLgogICAgICAqLwpAQCAtMjc1LDYgKzI5NCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkcmF3Q2hpbGQoQ2FudmFzIGNhbnZhcywgVmlldyBjaGlsZCwgbG9uZyBkcmF3aW5nVGltZSkgewogICAgICAgICBpZiAoQ1JPU1NGQURFKSB7CiAgICAgICAgICAgICBpbnQgYWxwaGE7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldE1hbmFnZXIuamF2YQppbmRleCBkMmFiODVlLi4yYTU4M2MxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRNYW5hZ2VyLmphdmEKQEAgLTIzMyw2ICsyMzMsMTAgQEAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIFJlbW90ZVZpZXdzIHRvIHVzZSBmb3IgdGhlIHNwZWNpZmllZCBhcHBXaWRnZXRJZHMuCiAgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgdGhlIFJlbW90ZVZpZXdzIHBhcmFtZXRlciB3aWxsIGJlIGNhY2hlZCBieSB0aGUgQXBwV2lkZ2V0U2VydmljZSwgYW5kIGhlbmNlIHNob3VsZAorICAgICAqIGNvbnRhaW4gYSBjb21wbGV0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2lkZ2V0LiBGb3IgcGVyZm9ybWluZyBwYXJ0aWFsIHdpZGdldCB1cGRhdGVzLCBzZWUKKyAgICAgKiB7QGxpbmsgI3BhcnRpYWxseVVwZGF0ZUFwcFdpZGdldChpbnRbXSwgUmVtb3RlVmlld3MpfS4KKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIEl0IGlzIG9rYXkgdG8gY2FsbCB0aGlzIG1ldGhvZCBib3RoIGluc2lkZSBhbiB7QGxpbmsgI0FDVElPTl9BUFBXSURHRVRfVVBEQVRFfSBicm9hZGNhc3QsCiAgICAgICogYW5kIG91dHNpZGUgb2YgdGhlIGhhbmRsZXIuCkBAIC0yNTMsNiArMjU3LDEwIEBACiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBSZW1vdGVWaWV3cyB0byB1c2UgZm9yIHRoZSBzcGVjaWZpZWQgYXBwV2lkZ2V0SWQuCiAgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgdGhlIFJlbW90ZVZpZXdzIHBhcmFtZXRlciB3aWxsIGJlIGNhY2hlZCBieSB0aGUgQXBwV2lkZ2V0U2VydmljZSwgYW5kIGhlbmNlIHNob3VsZAorICAgICAqIGNvbnRhaW4gYSBjb21wbGV0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2lkZ2V0LiBGb3IgcGVyZm9ybWluZyBwYXJ0aWFsIHdpZGdldCB1cGRhdGVzLCBzZWUKKyAgICAgKiB7QGxpbmsgI3BhcnRpYWxseVVwZGF0ZUFwcFdpZGdldChpbnQsIFJlbW90ZVZpZXdzKX0uCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBJdCBpcyBva2F5IHRvIGNhbGwgdGhpcyBtZXRob2QgYm90aCBpbnNpZGUgYW4ge0BsaW5rICNBQ1RJT05fQVBQV0lER0VUX1VQREFURX0gYnJvYWRjYXN0LAogICAgICAqIGFuZCBvdXRzaWRlIG9mIHRoZSBoYW5kbGVyLgpAQCAtMjY2LDYgKzI3NCw1OSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW4gaW5jcmVtZW50YWwgdXBkYXRlIG9yIGNvbW1hbmQgb24gdGhlIHdpZGdldChzKSBzcGVjaWZpZWQgYnkgYXBwV2lkZ2V0SWRzLgorICAgICAqCisgICAgICogVGhpcyB1cGRhdGUgIGRpZmZlcnMgZnJvbSB7QGxpbmsgI3VwZGF0ZUFwcFdpZGdldChpbnRbXSwgUmVtb3RlVmlld3MpfSBpbiB0aGF0IHRoZQorICAgICAqIFJlbW90ZVZpZXdzIG9iamVjdCB3aGljaCBpcyBwYXNzZWQgaXMgdW5kZXJzdG9vZCB0byBiZSBhbiBpbmNvbXBsZXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSAKKyAgICAgKiB3aWRnZXQsIGFuZCBoZW5jZSBpcyBub3QgY2FjaGVkIGJ5IHRoZSBBcHBXaWRnZXRTZXJ2aWNlLiBOb3RlIHRoYXQgYmVjYXVzZSB0aGVzZSB1cGRhdGVzIGFyZSAKKyAgICAgKiBub3QgY2FjaGVkLCBhbnkgc3RhdGUgdGhhdCB0aGV5IG1vZGlmeSB0aGF0IGlzIG5vdCByZXN0b3JlZCBieSByZXN0b3JlSW5zdGFuY2VTdGF0ZSB3aWxsIG5vdAorICAgICAqIHBlcnNpc3QgaW4gdGhlIGNhc2UgdGhhdCB0aGUgd2lkZ2V0cyBhcmUgcmVzdG9yZWQgdXNpbmcgdGhlIGNhY2hlZCB2ZXJzaW9uIGluCisgICAgICogQXBwV2lkZ2V0U2VydmljZS4KKyAgICAgKgorICAgICAqIFVzZSB3aXRoIHtAbGluayBSZW1vdGVWaWV3cyNzaG93TmV4dChpbnQpfSwge0BsaW5rIFJlbW90ZVZpZXdzI3Nob3dQcmV2aW91cyhpbnQpfSwKKyAgICAgKiB7QGxpbmsgUmVtb3RlVmlld3Mjc2V0U2Nyb2xsUG9zaXRpb24oaW50LCBpbnQpfSBhbmQgc2ltaWxhciBjb21tYW5kcy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEl0IGlzIG9rYXkgdG8gY2FsbCB0aGlzIG1ldGhvZCBib3RoIGluc2lkZSBhbiB7QGxpbmsgI0FDVElPTl9BUFBXSURHRVRfVVBEQVRFfSBicm9hZGNhc3QsCisgICAgICogYW5kIG91dHNpZGUgb2YgdGhlIGhhbmRsZXIuCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBvbmx5IHdvcmsgd2hlbiBjYWxsZWQgZnJvbSB0aGUgdWlkIHRoYXQgb3ducyB0aGUgQXBwV2lkZ2V0IHByb3ZpZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGFwcFdpZGdldElkcyAgICAgVGhlIEFwcFdpZGdldCBpbnN0YW5jZXMgZm9yIHdoaWNoIHRvIHNldCB0aGUgUmVtb3RlVmlld3MuCisgICAgICogQHBhcmFtIHZpZXdzICAgICAgICAgICAgVGhlIFJlbW90ZVZpZXdzIG9iamVjdCBjb250YWluaW5nIHRoZSBpbmNyZW1lbnRhbCB1cGRhdGUgLyBjb21tYW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhcnRpYWxseVVwZGF0ZUFwcFdpZGdldChpbnRbXSBhcHBXaWRnZXRJZHMsIFJlbW90ZVZpZXdzIHZpZXdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzU2VydmljZS5wYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXRJZHMoYXBwV2lkZ2V0SWRzLCB2aWV3cyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigic3lzdGVtIHNlcnZlciBkZWFkPyIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSBhbiBpbmNyZW1lbnRhbCB1cGRhdGUgb3IgY29tbWFuZCBvbiB0aGUgd2lkZ2V0IHNwZWNpZmllZCBieSBhcHBXaWRnZXRJZC4KKyAgICAgKgorICAgICAqIFRoaXMgdXBkYXRlICBkaWZmZXJzIGZyb20ge0BsaW5rICN1cGRhdGVBcHBXaWRnZXQoaW50LCBSZW1vdGVWaWV3cyl9IGluIHRoYXQgdGhlIFJlbW90ZVZpZXdzCisgICAgICogb2JqZWN0IHdoaWNoIGlzIHBhc3NlZCBpcyB1bmRlcnN0b29kIHRvIGJlIGFuIGluY29tcGxldGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHdpZGdldCwgYW5kCisgICAgICogaGVuY2UgaXMgbm90IGNhY2hlZCBieSB0aGUgQXBwV2lkZ2V0U2VydmljZS4gTm90ZSB0aGF0IGJlY2F1c2UgdGhlc2UgdXBkYXRlcyBhcmUgbm90IGNhY2hlZCwKKyAgICAgKiBhbnkgc3RhdGUgdGhhdCB0aGV5IG1vZGlmeSB0aGF0IGlzIG5vdCByZXN0b3JlZCBieSByZXN0b3JlSW5zdGFuY2VTdGF0ZSB3aWxsIG5vdCBwZXJzaXN0IGluCisgICAgICogdGhlIGNhc2UgdGhhdCB0aGUgd2lkZ2V0cyBhcmUgcmVzdG9yZWQgdXNpbmcgdGhlIGNhY2hlZCB2ZXJzaW9uIGluIEFwcFdpZGdldFNlcnZpY2UuCisgICAgICoKKyAgICAgKiBVc2Ugd2l0aCB7QGxpbmsgUmVtb3RlVmlld3Mjc2hvd05leHQoaW50KX0sIHtAbGluayBSZW1vdGVWaWV3cyNzaG93UHJldmlvdXMoaW50KX0sCisgICAgICoge0BsaW5rIFJlbW90ZVZpZXdzI3NldFNjcm9sbFBvc2l0aW9uKGludCwgaW50KX0gYW5kIHNpbWlsYXIgY29tbWFuZHMuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBJdCBpcyBva2F5IHRvIGNhbGwgdGhpcyBtZXRob2QgYm90aCBpbnNpZGUgYW4ge0BsaW5rICNBQ1RJT05fQVBQV0lER0VUX1VQREFURX0gYnJvYWRjYXN0LAorICAgICAqIGFuZCBvdXRzaWRlIG9mIHRoZSBoYW5kbGVyLgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgb25seSB3b3JrIHdoZW4gY2FsbGVkIGZyb20gdGhlIHVpZCB0aGF0IG93bnMgdGhlIEFwcFdpZGdldCBwcm92aWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBXaWRnZXRJZCAgICAgIFRoZSBBcHBXaWRnZXQgaW5zdGFuY2UgZm9yIHdoaWNoIHRvIHNldCB0aGUgUmVtb3RlVmlld3MuCisgICAgICogQHBhcmFtIHZpZXdzICAgICAgICAgICAgVGhlIFJlbW90ZVZpZXdzIG9iamVjdCBjb250YWluaW5nIHRoZSBpbmNyZW1lbnRhbCB1cGRhdGUgLyBjb21tYW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhcnRpYWxseVVwZGF0ZUFwcFdpZGdldChpbnQgYXBwV2lkZ2V0SWQsIFJlbW90ZVZpZXdzIHZpZXdzKSB7CisgICAgICAgIHBhcnRpYWxseVVwZGF0ZUFwcFdpZGdldChuZXcgaW50W10geyBhcHBXaWRnZXRJZCB9LCB2aWV3cyk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0IHRoZSBSZW1vdGVWaWV3cyB0byB1c2UgZm9yIGFsbCBBcHBXaWRnZXQgaW5zdGFuY2VzIGZvciB0aGUgc3VwcGxpZWQgQXBwV2lkZ2V0IHByb3ZpZGVyLgogICAgICAqCiAgICAgICogPHA+CkBAIC0yODgsMTEgKzM0OSw0NiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB2aWV3IGluIGFsbCB0aGUgc3BlY2lmaWVkIEFwcFdpZGdldCBpbnN0YW5jZXMKKyAgICAgKiB0byBpbnZhbGlkYXRlIHRoZWlyIGN1cnJlbnRseSBkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIGFwcFdpZGdldElkcyAgVGhlIEFwcFdpZGdldCBpbnN0YW5jZXMgZm9yIHdoaWNoIHRvIG5vdGlmeSBvZiB2aWV3IGRhdGEgY2hhbmdlcy4KKyAgICAgKiBAcGFyYW0gdmlld0lkICAgICAgICBUaGUgY29sbGVjdGlvbiB2aWV3IGlkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChpbnRbXSBhcHBXaWRnZXRJZHMsIGludCB2aWV3SWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNTZXJ2aWNlLm5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChhcHBXaWRnZXRJZHMsIHZpZXdJZCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigic3lzdGVtIHNlcnZlciBkZWFkPyIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZpZXMgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHZpZXcgaW4gYWxsIHRoZSBzcGVjaWZpZWQgQXBwV2lkZ2V0IGluc3RhbmNlCisgICAgICogdG8gaW52YWxpZGF0ZSBpdCdzIGN1cnJlbnRseSBkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIGFwcFdpZGdldElkICBUaGUgQXBwV2lkZ2V0IGluc3RhbmNlIGZvciB3aGljaCB0byBub3RpZnkgb2YgdmlldyBkYXRhIGNoYW5nZXMuCisgICAgICogQHBhcmFtIHZpZXdJZCAgICAgICAgVGhlIGNvbGxlY3Rpb24gdmlldyBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWQoaW50IGFwcFdpZGdldElkLCBpbnQgdmlld0lkKSB7CisgICAgICAgIG5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChuZXcgaW50W10geyBhcHBXaWRnZXRJZCB9LCB2aWV3SWQpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybiBhIGxpc3Qgb2YgdGhlIEFwcFdpZGdldCBwcm92aWRlcnMgdGhhdCBhcmUgY3VycmVudGx5IGluc3RhbGxlZC4KICAgICAgKi8KICAgICBwdWJsaWMgTGlzdDxBcHBXaWRnZXRQcm92aWRlckluZm8+IGdldEluc3RhbGxlZFByb3ZpZGVycygpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBzU2VydmljZS5nZXRJbnN0YWxsZWRQcm92aWRlcnMoKTsKKyAgICAgICAgICAgIExpc3Q8QXBwV2lkZ2V0UHJvdmlkZXJJbmZvPiBwcm92aWRlcnMgPSBzU2VydmljZS5nZXRJbnN0YWxsZWRQcm92aWRlcnMoKTsKKyAgICAgICAgICAgIGZvciAoQXBwV2lkZ2V0UHJvdmlkZXJJbmZvIGluZm8gOiBwcm92aWRlcnMpIHsKKyAgICAgICAgICAgICAgICAvLyBDb252ZXJ0aW5nIGNvbXBsZXggdG8gZHAuCisgICAgICAgICAgICAgICAgaW5mby5taW5XaWR0aCA9CisgICAgICAgICAgICAgICAgICAgICAgICBUeXBlZFZhbHVlLmNvbXBsZXhUb0RpbWVuc2lvblBpeGVsU2l6ZShpbmZvLm1pbldpZHRoLCBtRGlzcGxheU1ldHJpY3MpOworICAgICAgICAgICAgICAgIGluZm8ubWluSGVpZ2h0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVkVmFsdWUuY29tcGxleFRvRGltZW5zaW9uUGl4ZWxTaXplKGluZm8ubWluSGVpZ2h0LCBtRGlzcGxheU1ldHJpY3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyczsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJzeXN0ZW0gc2VydmVyIGRlYWQ/IiwgZSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0UHJvdmlkZXJJbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0UHJvdmlkZXJJbmZvLmphdmEKaW5kZXggY2VlMjg2NS4uMzk2ZTkyZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldFByb3ZpZGVySW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRQcm92aWRlckluZm8uamF2YQpAQCAtMTEwLDYgKzExMCwxNyBAQAogICAgICAqIEBoaWRlIFBlbmRpbmcgQVBJIGFwcHJvdmFsCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBvbGROYW1lOworICAgIAorICAgIC8qKgorICAgICAqIEEgcHJldmlldyBvZiB3aGF0IHRoZSBBcHBXaWRnZXQgd2lsbCBsb29rIGxpa2UgYWZ0ZXIgaXQncyBjb25maWd1cmVkLgorICAgICAqIElmIG5vdCBzdXBwbGllZCwgdGhlIEFwcFdpZGdldCdzIGljb24gd2lsbCBiZSB1c2VkLgorICAgICAqCisgICAgICogPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+YW5kcm9pZDpwcmV2aWV3SW1hZ2U8L2NvZGU+IGF0dHJpYnV0ZSBpbgorICAgICAqIHRoZSA8Y29kZT4mbHQ7cmVjZWl2ZXImZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSBBbmRyb2lkTWFuaWZlc3QueG1sIGZpbGUuCisgICAgICogCisgICAgICogQGhpZGUgUGVuZGluZyBBUEkgYXBwcm92YWwKKyAgICAgKi8KKwlwdWJsaWMgaW50IHByZXZpZXdJbWFnZTsKIAogICAgIHB1YmxpYyBBcHBXaWRnZXRQcm92aWRlckluZm8oKSB7CiAgICAgfQpAQCAtMTMwLDYgKzE0MSw3IEBACiAgICAgICAgIH0KICAgICAgICAgdGhpcy5sYWJlbCA9IGluLnJlYWRTdHJpbmcoKTsKICAgICAgICAgdGhpcy5pY29uID0gaW4ucmVhZEludCgpOworICAgICAgICB0aGlzLnByZXZpZXdJbWFnZSA9IGluLnJlYWRJbnQoKTsKICAgICB9CiAKIApAQCAtMTUyLDYgKzE2NCw3IEBACiAgICAgICAgIH0KICAgICAgICAgb3V0LndyaXRlU3RyaW5nKHRoaXMubGFiZWwpOwogICAgICAgICBvdXQud3JpdGVJbnQodGhpcy5pY29uKTsKKyAgICAgICAgb3V0LndyaXRlSW50KHRoaXMucHJldmlld0ltYWdlKTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQTJkcC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEEyZHAuamF2YQppbmRleCA3ZTVmODU4Li5kMzA4YTVjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQTJkcC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhBMmRwLmphdmEKQEAgLTE4LDg4ICsxOCwxMDQgQEAKIAogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudDsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQuU2RrQ29uc3RhbnRUeXBlOwotaW1wb3J0IGFuZHJvaWQuc2VydmVyLkJsdWV0b290aEEyZHBTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuQmx1ZXRvb3RoQTJkcFNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCiAKIC8qKgotICogUHVibGljIEFQSSBmb3IgY29udHJvbGxpbmcgdGhlIEJsdWV0b290aCBBMkRQIFByb2ZpbGUgU2VydmljZS4KKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIHB1YmxpYyBBUElzIHRvIGNvbnRyb2wgdGhlIEJsdWV0b290aCBBMkRQCisgKiBwcm9maWxlLgogICoKLSAqIEJsdWV0b290aEEyZHAgaXMgYSBwcm94eSBvYmplY3QgZm9yIGNvbnRyb2xsaW5nIHRoZSBCbHVldG9vdGggQTJEUAotICogU2VydmljZSB2aWEgSVBDLgorICo8cD5CbHVldG9vdGhBMmRwIGlzIGEgcHJveHkgb2JqZWN0IGZvciBjb250cm9sbGluZyB0aGUgQmx1ZXRvb3RoIEEyRFAKKyAqIFNlcnZpY2UgdmlhIElQQy4gVXNlIHtAbGluayBCbHVldG9vdGhBZGFwdGVyI2dldFByb2ZpbGVQcm94eX0gdG8gZ2V0CisgKiB0aGUgQmx1ZXRvb3RoQTJkcCBwcm94eSBvYmplY3QuCiAgKgotICogQ3JlYXRpbmcgYSBCbHVldG9vdGhBMmRwIG9iamVjdCB3aWxsIGluaXRpYXRlIGEgYmluZGluZyB3aXRoIHRoZQotICogQmx1ZXRvb3RoSGVhZHNldCBzZXJ2aWNlLiBVc2VycyBvZiB0aGlzIG9iamVjdCBzaG91bGQgY2FsbCBjbG9zZSgpIHdoZW4gdGhleQotICogYXJlIGZpbmlzaGVkLCBzbyB0aGF0IHRoaXMgcHJveHkgb2JqZWN0IGNhbiB1bmJpbmQgZnJvbSB0aGUgc2VydmljZS4KLSAqCi0gKiBDdXJyZW50bHkgdGhlIEJsdWV0b290aEEyZHAgc2VydmljZSBydW5zIGluIHRoZSBzeXN0ZW0gc2VydmVyIGFuZCB0aGlzCi0gKiBwcm94eSBvYmplY3Qgd2lsbCBiZSBpbW1lZGlhdGVseSBib3VuZCB0byB0aGUgc2VydmljZSBvbiBjb25zdHJ1Y3Rpb24uCi0gKgotICogQ3VycmVudGx5IHRoaXMgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyB0byBjb25uZWN0IHRvIEEyRFAgYXVkaW8gc2lua3MuCi0gKgotICogQGhpZGUKKyAqIDxwPiBBbmRyb2lkIG9ubHkgc3VwcG9ydHMgb25lIGNvbm5lY3RlZCBCbHVldG9vdGggQTJkcCBkZXZpY2UgYXQgYSB0aW1lLgorICogRWFjaCBtZXRob2QgaXMgcHJvdGVjdGVkIHdpdGggaXRzIGFwcHJvcHJpYXRlIHBlcm1pc3Npb24uCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCbHVldG9vdGhBMmRwIHsKK3B1YmxpYyBmaW5hbCBjbGFzcyBCbHVldG9vdGhBMmRwIGltcGxlbWVudHMgQmx1ZXRvb3RoUHJvZmlsZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhBMmRwIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOwogCi0gICAgLyoqIGludCBleHRyYSBmb3IgQUNUSU9OX1NJTktfU1RBVEVfQ0hBTkdFRCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NJTktfU1RBVEUgPQotICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguYTJkcC5leHRyYS5TSU5LX1NUQVRFIjsKLSAgICAvKiogaW50IGV4dHJhIGZvciBBQ1RJT05fU0lOS19TVEFURV9DSEFOR0VEICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUFJFVklPVVNfU0lOS19TVEFURSA9Ci0gICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5hMmRwLmV4dHJhLlBSRVZJT1VTX1NJTktfU1RBVEUiOwotCi0gICAgLyoqIEluZGljYXRlcyB0aGUgc3RhdGUgb2YgYW4gQTJEUCBhdWRpbyBzaW5rIGhhcyBjaGFuZ2VkLgotICAgICAqIFRoaXMgaW50ZW50IHdpbGwgYWx3YXlzIGNvbnRhaW4gRVhUUkFfU0lOS19TVEFURSwKLSAgICAgKiBFWFRSQV9QUkVWSU9VU19TSU5LX1NUQVRFIGFuZCBCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFCi0gICAgICogZXh0cmFzLgorICAgIC8qKgorICAgICAqIEludGVudCB1c2VkIHRvIGJyb2FkY2FzdCB0aGUgY2hhbmdlIGluIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIEEyRFAKKyAgICAgKiBwcm9maWxlLgorICAgICAqCisgICAgICogPHA+VGhpcyBpbnRlbnQgd2lsbCBoYXZlIDMgZXh0cmFzOgorICAgICAqIHtAbGluayAjRVhUUkFfU1RBVEV9IC0gVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHByb2ZpbGUuCisgICAgICoge0BsaW5rICNFWFRSQV9QUkVWSU9VU19TVEFURX0tIFRoZSBwcmV2aW91cyBzdGF0ZSBvZiB0aGUgcHJvZmlsZQorICAgICAqIHtAbGluayBCbHVldG9vdGhEZXZpY2UjRVhUUkFfREVWSUNFfSAtIFRoZSByZW1vdGUgZGV2aWNlLgorICAgICAqCisgICAgICoge0BsaW5rICNFWFRSQV9TVEFURX0gb3Ige0BsaW5rICNFWFRSQV9QUkVWSU9VU19TVEFURX0gY2FuIGJlIGFueSBvZgorICAgICAqIHtAbGluayAjU1RBVEVfRElTQ09OTkVDVEVEfSwge0BsaW5rICNTVEFURV9DT05ORUNUSU5HfSwKKyAgICAgKiB7QGxpbmsgI1NUQVRFX0NPTk5FQ1RFRH0sIHtAbGluayAjU1RBVEVfRElTQ09OTkVDVElOR30uCisgICAgICoKKyAgICAgKiA8cD5SZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI0JMVUVUT09USH0gdG8gcmVjZWl2ZS4KICAgICAgKi8KICAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TSU5LX1NUQVRFX0NIQU5HRUQgPQotICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguYTJkcC5hY3Rpb24uU0lOS19TVEFURV9DSEFOR0VEIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEID0KKyAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmEyZHAucHJvZmlsZS5hY3Rpb24uQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEIjsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RFRCA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVElORyAgID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNURUQgICAgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RJTkcgPSAzOwotICAgIC8qKiBQbGF5aW5nIGltcGxpZXMgY29ubmVjdGVkICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUExBWUlORyAgICA9IDQ7CisgICAgLyoqCisgICAgICogSW50ZW50IHVzZWQgdG8gYnJvYWRjYXN0IHRoZSBjaGFuZ2UgaW4gdGhlIFBsYXlpbmcgc3RhdGUgb2YgdGhlIEEyRFAKKyAgICAgKiBwcm9maWxlLgorICAgICAqCisgICAgICogPHA+VGhpcyBpbnRlbnQgd2lsbCBoYXZlIDMgZXh0cmFzOgorICAgICAqIHtAbGluayAjRVhUUkFfU1RBVEV9IC0gVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHByb2ZpbGUuCisgICAgICoge0BsaW5rICNFWFRSQV9QUkVWSU9VU19TVEFURX0tIFRoZSBwcmV2aW91cyBzdGF0ZSBvZiB0aGUgcHJvZmlsZQorICAgICAqIHtAbGluayBCbHVldG9vdGhEZXZpY2UjRVhUUkFfREVWSUNFfSAtIFRoZSByZW1vdGUgZGV2aWNlLgorICAgICAqCisgICAgICoge0BsaW5rICNFWFRSQV9TVEFURX0gb3Ige0BsaW5rICNFWFRSQV9QUkVWSU9VU19TVEFURX0gY2FuIGJlIGFueSBvZgorICAgICAqIHtAbGluayAjU1RBVEVfUExBWUlOR30sIHtAbGluayAjU1RBVEVfTk9UX1BMQVlJTkd9LAorICAgICAqCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEh9IHRvIHJlY2VpdmUuCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUExBWUlOR19TVEFURV9DSEFOR0VEID0KKyAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmEyZHAucHJvZmlsZS5hY3Rpb24uUExBWUlOR19TVEFURV9DSEFOR0VEIjsKIAotICAgIC8qKiBEZWZhdWx0IHByaW9yaXR5IGZvciBhMmRwIGRldmljZXMgdGhhdCB3ZSB0cnkgdG8gYXV0by1jb25uZWN0Ci0gICAgICogYW5kIGFsbG93IGluY29taW5nIGNvbm5lY3Rpb25zICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfQVVUT19DT05ORUNUID0gMTAwMDsKLSAgICAvKiogRGVmYXVsdCBwcmlvcml0eSBmb3IgYTJkcCBkZXZpY2VzIHRoYXQgc2hvdWxkIGFsbG93IGluY29taW5nCi0gICAgICogY29ubmVjdGlvbnMgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9PTiA9IDEwMDsKLSAgICAvKiogRGVmYXVsdCBwcmlvcml0eSBmb3IgYTJkcCBkZXZpY2VzIHRoYXQgc2hvdWxkIG5vdCBhbGxvdyBpbmNvbWluZwotICAgICAqIGNvbm5lY3Rpb25zICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfT0ZGID0gMDsKLSAgICAvKiogRGVmYXVsdCBwcmlvcml0eSB3aGVuIG5vdCBzZXQgb3Igd2hlbiB0aGUgZGV2aWNlIGlzIHVucGFpcmVkICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfVU5ERUZJTkVEID0gLTE7CisgICAgLyoqCisgICAgICogQTJEUCBzaW5rIGRldmljZSBpcyBzdHJlYW1pbmcgbXVzaWMuIFRoaXMgc3RhdGUgY2FuIGJlIG9uZSBvZgorICAgICAqIHtAbGluayAjRVhUUkFfU1RBVEV9IG9yIHtAbGluayAjRVhUUkFfUFJFVklPVVNfU1RBVEV9IG9mCisgICAgICoge0BsaW5rICNBQ1RJT05fUExBWUlOR19TVEFURV9DSEFOR0VEfSBpbnRlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUExBWUlORyAgID0gIDEwOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBJQmx1ZXRvb3RoQTJkcCBtU2VydmljZTsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgLyoqCisgICAgICogQTJEUCBzaW5rIGRldmljZSBpcyBOT1Qgc3RyZWFtaW5nIG11c2ljLiBUaGlzIHN0YXRlIGNhbiBiZSBvbmUgb2YKKyAgICAgKiB7QGxpbmsgI0VYVFJBX1NUQVRFfSBvciB7QGxpbmsgI0VYVFJBX1BSRVZJT1VTX1NUQVRFfSBvZgorICAgICAqIHtAbGluayAjQUNUSU9OX1BMQVlJTkdfU1RBVEVfQ0hBTkdFRH0gaW50ZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX05PVF9QTEFZSU5HICAgPSAgMTE7CisKKyAgICBwcml2YXRlIFNlcnZpY2VMaXN0ZW5lciBtU2VydmljZUxpc3RlbmVyOworICAgIHByaXZhdGUgSUJsdWV0b290aEEyZHAgbVNlcnZpY2U7CisgICAgcHJpdmF0ZSBCbHVldG9vdGhBZGFwdGVyIG1BZGFwdGVyOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgQmx1ZXRvb3RoQTJkcCBwcm94eSBvYmplY3QgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIGxvY2FsCiAgICAgICogQmx1ZXRvb3RoIEEyRFAgc2VydmljZS4KLSAgICAgKiBAcGFyYW0gYyBDb250ZXh0CisgICAgICoKICAgICAgKi8KLSAgICBwdWJsaWMgQmx1ZXRvb3RoQTJkcChDb250ZXh0IGMpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjOwotCisgICAgLypwYWNrYWdlKi8gQmx1ZXRvb3RoQTJkcChDb250ZXh0IG1Db250ZXh0LCBTZXJ2aWNlTGlzdGVuZXIgbCkgewogICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKEJsdWV0b290aEEyZHBTZXJ2aWNlLkJMVUVUT09USF9BMkRQX1NFUlZJQ0UpOworICAgICAgICBtU2VydmljZUxpc3RlbmVyID0gbDsKKyAgICAgICAgbUFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7CiAgICAgICAgIGlmIChiICE9IG51bGwpIHsKICAgICAgICAgICAgIG1TZXJ2aWNlID0gSUJsdWV0b290aEEyZHAuU3R1Yi5hc0ludGVyZmFjZShiKTsKKyAgICAgICAgICAgIGlmIChtU2VydmljZUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU2VydmljZUxpc3RlbmVyLm9uU2VydmljZUNvbm5lY3RlZChCbHVldG9vdGhQcm9maWxlLkEyRFAsIHRoaXMpOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgTG9nLncoVEFHLCAiQmx1ZXRvb3RoIEEyRFAgc2VydmljZSBub3QgYXZhaWxhYmxlISIpOwogCkBAIC0xMDksMTY3ICsxMjUsMjIyIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKiogSW5pdGlhdGUgYSBjb25uZWN0aW9uIHRvIGFuIEEyRFAgc2luay4KLSAgICAgKiAgTGlzdGVuIGZvciBTSU5LX1NUQVRFX0NIQU5HRURfQUNUSU9OIHRvIGZpbmQgb3V0IHdoZW4gdGhlCi0gICAgICogIGNvbm5lY3Rpb24gaXMgY29tcGxldGVkLgotICAgICAqICBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCVCBkZXZpY2UuCi0gICAgICogIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLCB0cnVlIG90aGVyd2lzZQotICAgICAqICBAaGlkZQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbm5lY3RTaW5rKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0U2luaygiICsgZGV2aWNlICsgIikiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5jb25uZWN0U2luayhkZXZpY2UpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcHVibGljIGJvb2xlYW4gY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiY29ubmVjdCgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkgJiYKKyAgICAgICAgICAgIGlzVmFsaWREZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuY29ubmVjdChkZXZpY2UpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTdGFjazoiICsgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgLyoqIEluaXRpYXRlIGRpc2Nvbm5lY3QgZnJvbSBhbiBBMkRQIHNpbmsuCi0gICAgICogIExpc3RlbiBmb3IgU0lOS19TVEFURV9DSEFOR0VEX0FDVElPTiB0byBmaW5kIG91dCB3aGVuCi0gICAgICogIGRpc2Nvbm5lY3QgaXMgY29tcGxldGVkLgotICAgICAqICBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCVCBkZXZpY2UuCi0gICAgICogIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLCB0cnVlIG90aGVyd2lzZQotICAgICAqICBAaGlkZQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3RTaW5rKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJkaXNjb25uZWN0U2luaygiICsgZGV2aWNlICsgIikiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5kaXNjb25uZWN0U2luayhkZXZpY2UpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZGlzY29ubmVjdCgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkgJiYKKyAgICAgICAgICAgIGlzVmFsaWREZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZGlzY29ubmVjdChkZXZpY2UpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTdGFjazoiICsgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgLyoqIEluaXRpYXRlIHN1c3BlbmQgZnJvbSBhbiBBMkRQIHNpbmsuCi0gICAgICogIExpc3RlbiBmb3IgU0lOS19TVEFURV9DSEFOR0VEX0FDVElPTiB0byBmaW5kIG91dCB3aGVuCi0gICAgICogIHN1c3BlbmQgaXMgY29tcGxldGVkLgotICAgICAqICBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCVCBkZXZpY2UuCi0gICAgICogIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLCB0cnVlIG90aGVyd2lzZQotICAgICAqICBAaGlkZQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PEJsdWV0b290aERldmljZT4gZ2V0Q29ubmVjdGVkRGV2aWNlcygpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJnZXRDb25uZWN0ZWREZXZpY2VzKCkiKTsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvRGV2aWNlU2V0KG1TZXJ2aWNlLmdldENvbm5lY3RlZERldmljZXMoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlN0YWNrOiIgKyBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9EZXZpY2VTZXQobmV3IEJsdWV0b290aERldmljZVswXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiB0b0RldmljZVNldChuZXcgQmx1ZXRvb3RoRGV2aWNlWzBdKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIFNldDxCbHVldG9vdGhEZXZpY2U+IGdldERldmljZXNNYXRjaGluZ0Nvbm5lY3Rpb25TdGF0ZXMoaW50W10gc3RhdGVzKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZ2V0RGV2aWNlc01hdGNoaW5nU3RhdGVzKCkiKTsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvRGV2aWNlU2V0KG1TZXJ2aWNlLmdldERldmljZXNNYXRjaGluZ0Nvbm5lY3Rpb25TdGF0ZXMoc3RhdGVzKSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlN0YWNrOiIgKyBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9EZXZpY2VTZXQobmV3IEJsdWV0b290aERldmljZVswXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiB0b0RldmljZVNldChuZXcgQmx1ZXRvb3RoRGV2aWNlWzBdKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImdldFN0YXRlKCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCAmJiBpc0VuYWJsZWQoKQorICAgICAgICAgICAgJiYgaXNWYWxpZERldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRDb25uZWN0aW9uU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiU3RhY2s6IiArIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOworICAgICAgICAgICAgICAgIHJldHVybiBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobVNlcnZpY2UgPT0gbnVsbCkgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKKyAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNldFByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmlvcml0eSkgeworICAgICAgICBpZiAoREJHKSBsb2coInNldFByaW9yaXR5KCIgKyBkZXZpY2UgKyAiLCAiICsgcHJpb3JpdHkgKyAiKSIpOworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCAmJiBpc0VuYWJsZWQoKQorICAgICAgICAgICAgJiYgaXNWYWxpZERldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICBpZiAocHJpb3JpdHkgIT0gQmx1ZXRvb3RoUHJvZmlsZS5QUklPUklUWV9PRkYgJiYKKyAgICAgICAgICAgICAgICBwcmlvcml0eSAhPSBCbHVldG9vdGhQcm9maWxlLlBSSU9SSVRZX09OKSB7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnNldFByaW9yaXR5KGRldmljZSwgcHJpb3JpdHkpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTdGFjazoiICsgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQcmlvcml0eShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZ2V0UHJpb3JpdHkoIiArIGRldmljZSArICIpIik7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsICYmIGlzRW5hYmxlZCgpCisgICAgICAgICAgICAmJiBpc1ZhbGlkRGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFByaW9yaXR5KGRldmljZSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlN0YWNrOiIgKyBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUHJvZmlsZS5QUklPUklUWV9PRkY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiBCbHVldG9vdGhQcm9maWxlLlBSSU9SSVRZX09GRjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBBMkRQIHByb2ZpbGUgaXMgc3RyZWFtaW5nIG11c2ljLgorICAgICAqCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEh9CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIEJsdWV0b290aERldmljZSBkZXZpY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0EyZHBQbGF5aW5nKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkKKyAgICAgICAgICAgICYmIGlzVmFsaWREZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuaXNBMmRwUGxheWluZyhkZXZpY2UpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTdGFjazoiICsgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhdGUgc3VzcGVuZCBmcm9tIGFuIEEyRFAgc2luay4KKyAgICAgKgorICAgICAqIDxwPiBUaGlzIEFQSSB3aWxsIHJldHVybiBmYWxzZSBpbiBzY2VuYXJpb3MgbGlrZSB0aGUgQTJEUAorICAgICAqIGRldmljZSBpcyBub3QgaW4gY29ubmVjdGVkIHN0YXRlIGV0Yy4gV2hlbiB0aGlzIEFQSSByZXR1cm5zLAorICAgICAqIHRydWUsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCB7QGxpbmsgI0FDVElPTl9TSU5LX1NUQVRFX0NIQU5HRUR9CisgICAgICogaW50ZW50IHdpbGwgYmUgYnJvYWRjYXN0ZWQgd2l0aCB0aGUgc3RhdGUuIFVzZXJzIGNhbiBnZXQgdGhlCisgICAgICogc3RhdGUgb2YgdGhlIEEyRFAgZGV2aWNlIGZyb20gdGhpcyBpbnRlbnQuCisgICAgICoKKyAgICAgKiA8cD5SZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI0JMVUVUT09USF9BRE1JTn0KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEEyRFAgc2luaworICAgICAqIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLAorICAgICAqICAgICAgICAgICAgICAgdHJ1ZSBvdGhlcndpc2UKKyAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHN1c3BlbmRTaW5rKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5zdXNwZW5kU2luayhkZXZpY2UpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsICYmIGlzRW5hYmxlZCgpCisgICAgICAgICAgICAmJiBpc1ZhbGlkRGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnN1c3BlbmRTaW5rKGRldmljZSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlN0YWNrOiIgKyBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICAvKiogSW5pdGlhdGUgcmVzdW1lIGZyb20gYW4gc3VzcGVuZGVkIEEyRFAgc2luay4KLSAgICAgKiAgTGlzdGVuIGZvciBTSU5LX1NUQVRFX0NIQU5HRURfQUNUSU9OIHRvIGZpbmQgb3V0IHdoZW4KLSAgICAgKiAgcmVzdW1lIGlzIGNvbXBsZXRlZC4KLSAgICAgKiAgQHBhcmFtIGRldmljZSBSZW1vdGUgQlQgZGV2aWNlLgotICAgICAqICBAcmV0dXJuIGZhbHNlIG9uIGltbWVkaWF0ZSBlcnJvciwgdHJ1ZSBvdGhlcndpc2UKLSAgICAgKiAgQGhpZGUKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZSByZXN1bWUgZnJvbSBhIHN1c3BlbmRlZCBBMkRQIHNpbmsuCisgICAgICoKKyAgICAgKiA8cD4gVGhpcyBBUEkgd2lsbCByZXR1cm4gZmFsc2UgaW4gc2NlbmFyaW9zIGxpa2UgdGhlIEEyRFAKKyAgICAgKiBkZXZpY2UgaXMgbm90IGluIHN1c3BlbmRlZCBzdGF0ZSBldGMuIFdoZW4gdGhpcyBBUEkgcmV0dXJucywKKyAgICAgKiB0cnVlLCBpdCBpcyBndWFyYW50ZWVkIHRoYXQge0BsaW5rICNBQ1RJT05fU0lOS19TVEFURV9DSEFOR0VEfQorICAgICAqIGludGVudCB3aWxsIGJlIGJyb2FkY2FzdGVkIHdpdGggdGhlIHN0YXRlLiBVc2VycyBjYW4gZ2V0IHRoZQorICAgICAqIHN0YXRlIG9mIHRoZSBBMkRQIGRldmljZSBmcm9tIHRoaXMgaW50ZW50LgorICAgICAqCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEhfQURNSU59CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIFJlbW90ZSBBMkRQIHNpbmsKKyAgICAgKiBAcmV0dXJuIGZhbHNlIG9uIGltbWVkaWF0ZSBlcnJvciwKKyAgICAgKiAgICAgICAgICAgICAgIHRydWUgb3RoZXJ3aXNlCisgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZXN1bWVTaW5rKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5yZXN1bWVTaW5rKGRldmljZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkKKyAgICAgICAgICAgICYmIGlzVmFsaWREZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UucmVzdW1lU2luayhkZXZpY2UpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTdGFjazoiICsgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgLyoqIENoZWNrIGlmIGEgc3BlY2lmaWVkIEEyRFAgc2luayBpcyBjb25uZWN0ZWQuCi0gICAgICogIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KLSAgICAgKiAgQHJldHVybiBUcnVlIGlmIGNvbm5lY3RlZCAob3IgcGxheWluZyksIGZhbHNlIG90aGVyd2lzZSBhbmQgb24gZXJyb3IuCi0gICAgICogIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTaW5rQ29ubmVjdGVkKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJpc1NpbmtDb25uZWN0ZWQoIiArIGRldmljZSArICIpIik7Ci0gICAgICAgIGludCBzdGF0ZSA9IGdldFNpbmtTdGF0ZShkZXZpY2UpOwotICAgICAgICByZXR1cm4gc3RhdGUgPT0gU1RBVEVfQ09OTkVDVEVEIHx8IHN0YXRlID09IFNUQVRFX1BMQVlJTkc7Ci0gICAgfQotCi0gICAgLyoqIENoZWNrIGlmIGFueSBBMkRQIHNpbmsgaXMgY29ubmVjdGVkLgotICAgICAqIEByZXR1cm4gYSB1bm1vZGlmaWFibGUgc2V0IG9mIGNvbm5lY3RlZCBBMkRQIHNpbmtzLCBvciBudWxsIG9uIGVycm9yLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIFNldDxCbHVldG9vdGhEZXZpY2U+IGdldENvbm5lY3RlZFNpbmtzKCkgewotICAgICAgICBpZiAoREJHKSBsb2coImdldENvbm5lY3RlZFNpbmtzKCkiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoU2V0PEJsdWV0b290aERldmljZT4oQXJyYXlzLmFzTGlzdChtU2VydmljZS5nZXRDb25uZWN0ZWRTaW5rcygpKSkpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBDaGVjayBpZiBhbnkgQTJEUCBzaW5rIGlzIGluIE5vbiBEaXNjb25uZWN0ZWQgc3RhdGUKLSAgICAgKiBpLmUgcGxheWluZywgY29ubmVjdGVkLCBjb25uZWN0aW5nLCBkaXNjb25uZWN0aW5nLgotICAgICAqIEByZXR1cm4gYSB1bm1vZGlmaWFibGUgc2V0IG9mIGNvbm5lY3RlZCBBMkRQIHNpbmtzLCBvciBudWxsIG9uIGVycm9yLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIFNldDxCbHVldG9vdGhEZXZpY2U+IGdldE5vbkRpc2Nvbm5lY3RlZFNpbmtzKCkgewotICAgICAgICBpZiAoREJHKSBsb2coImdldE5vbkRpc2Nvbm5lY3RlZFNpbmtzKCkiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoU2V0PEJsdWV0b290aERldmljZT4oQXJyYXlzLmFzTGlzdChtU2VydmljZS5nZXROb25EaXNjb25uZWN0ZWRTaW5rcygpKSkpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBHZXQgdGhlIHN0YXRlIG9mIGFuIEEyRFAgc2luawotICAgICAqICBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCVCBkZXZpY2UuCi0gICAgICogIEByZXR1cm4gU3RhdGUgY29kZSwgb25lIG9mIFNUQVRFXwotICAgICAqICBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U2lua1N0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJnZXRTaW5rU3RhdGUoIiArIGRldmljZSArICIpIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0U2lua1N0YXRlKGRldmljZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKLSAgICAgICAgICAgIHJldHVybiBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBwcmlvcml0eSBvZiBhMmRwIHNpbmsuCi0gICAgICogUHJpb3JpdHkgaXMgYSBub24tbmVnYXRpdmUgaW50ZWdlci4gQnkgZGVmYXVsdCBwYWlyZWQgc2lua3Mgd2lsbCBoYXZlCi0gICAgICogYSBwcmlvcml0eSBvZiBQUklPUklUWV9BVVRPLCBhbmQgdW5wYWlyZWQgaGVhZHNldCBQUklPUklUWV9OT05FICgwKS4KLSAgICAgKiBTaW5rcyB3aXRoIHByaW9yaXR5IGdyZWF0ZXIgdGhhbiB6ZXJvIHdpbGwgYWNjZXB0IGluY29taW5nIGNvbm5lY3Rpb25zCi0gICAgICogKGlmIG5vIHNpbmsgaXMgY3VycmVudGx5IGNvbm5lY3RlZCkuCi0gICAgICogUHJpb3JpdHkgZm9yIHVucGFpcmVkIHNpbmsgbXVzdCBiZSBQUklPUklUWV9OT05FLgotICAgICAqIEBwYXJhbSBkZXZpY2UgUGFpcmVkIHNpbmsKLSAgICAgKiBAcGFyYW0gcHJpb3JpdHkgSW50ZWdlciBwcmlvcml0eSwgZm9yIGV4YW1wbGUgUFJJT1JJVFlfQVVUTyBvcgotICAgICAqICAgICAgICAgICAgICAgICBQUklPUklUWV9OT05FCi0gICAgICogQHJldHVybiB0cnVlIGlmIHByaW9yaXR5IGlzIHNldCwgZmFsc2Ugb24gZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRTaW5rUHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByaW9yaXR5KSB7Ci0gICAgICAgIGlmIChEQkcpIGxvZygic2V0U2lua1ByaW9yaXR5KCIgKyBkZXZpY2UgKyAiLCAiICsgcHJpb3JpdHkgKyAiKSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnNldFNpbmtQcmlvcml0eShkZXZpY2UsIHByaW9yaXR5KTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHByaW9yaXR5IG9mIGEyZHAgc2luay4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIFNpbmsKLSAgICAgKiBAcmV0dXJuIG5vbi1uZWdhdGl2ZSBwcmlvcml0eSwgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBlcnJvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNpbmtQcmlvcml0eShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGlmIChEQkcpIGxvZygiZ2V0U2lua1ByaW9yaXR5KCIgKyBkZXZpY2UgKyAiKSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFNpbmtQcmlvcml0eShkZXZpY2UpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gUFJJT1JJVFlfT0ZGOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEhlbHBlciBmb3IgY29udmVydGluZyBhIHN0YXRlIHRvIGEgc3RyaW5nLgorICAgICAvKioKKyAgICAgKiBIZWxwZXIgZm9yIGNvbnZlcnRpbmcgYSBzdGF0ZSB0byBhIHN0cmluZy4KKyAgICAgKgogICAgICAqIEZvciBkZWJ1ZyB1c2Ugb25seSAtIHN0cmluZ3MgYXJlIG5vdCBpbnRlcm5hdGlvbmFsaXplZC4KICAgICAgKiBAaGlkZQogICAgICAqLwpAQCAtMjg1LDEyICszNTYsMzEgQEAKICAgICAgICAgICAgIHJldHVybiAiZGlzY29ubmVjdGluZyI7CiAgICAgICAgIGNhc2UgU1RBVEVfUExBWUlORzoKICAgICAgICAgICAgIHJldHVybiAicGxheWluZyI7CisgICAgICAgIGNhc2UgU1RBVEVfTk9UX1BMQVlJTkc6CisgICAgICAgICAgcmV0dXJuICJub3QgcGxheWluZyI7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gIjx1bmtub3duIHN0YXRlICIgKyBzdGF0ZSArICI+IjsKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisgICAgICAgaWYgKG1BZGFwdGVyLmdldFN0YXRlKCkgPT0gQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PTikgcmV0dXJuIHRydWU7CisgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkRGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICBpZiAoZGV2aWNlID09IG51bGwpIHJldHVybiBmYWxzZTsKKworICAgICAgIGlmIChCbHVldG9vdGhBZGFwdGVyLmNoZWNrQmx1ZXRvb3RoQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKSkgcmV0dXJuIHRydWU7CisgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgU2V0PEJsdWV0b290aERldmljZT4gdG9EZXZpY2VTZXQoQmx1ZXRvb3RoRGV2aWNlW10gZGV2aWNlcykgeworICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoCisgICAgICAgICAgbmV3IEhhc2hTZXQ8Qmx1ZXRvb3RoRGV2aWNlPihBcnJheXMuYXNMaXN0KGRldmljZXMpKSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBMb2cuZChUQUcsIG1zZyk7CisgICAgICBMb2cuZChUQUcsIG1zZyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEFkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhBZGFwdGVyLmphdmEKaW5kZXggMzA0MDMxOS4uYzY2YjJkZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEFkYXB0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQWRhcHRlci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQ7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50LlNka0NvbnN0YW50VHlwZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwpAQCAtMjc5LDYgKzI4MCw2MSBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0xPQ0FMX05BTUUgPSAiYW5kcm9pZC5ibHVldG9vdGguYWRhcHRlci5leHRyYS5MT0NBTF9OQU1FIjsKIAorICAgIC8qKgorICAgICAqIEludGVudCB1c2VkIHRvIGJyb2FkY2FzdCB0aGUgY2hhbmdlIGluIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIGxvY2FsCisgICAgICogQmx1ZXRvb3RoIGFkYXB0ZXIgdG8gYSBwcm9maWxlIG9mIHRoZSByZW1vdGUgZGV2aWNlLiBXaGVuIHRoZSBhZGFwdGVyIGlzCisgICAgICogbm90IGNvbm5lY3RlZCB0byBhbnkgcHJvZmlsZXMgb2YgYW55IHJlbW90ZSBkZXZpY2VzIGFuZCBpdCBhdHRlbXB0cyBhCisgICAgICogY29ubmVjdGlvbiB0byBhIHByb2ZpbGUgdGhpcyBpbnRlbnQgd2lsbCBzZW50LiBPbmNlIGNvbm5lY3RlZCwgdGhpcyBpbnRlbnQKKyAgICAgKiB3aWxsIG5vdCBiZSBzZW50IGZvciBhbnkgbW9yZSBjb25uZWN0aW9uIGF0dGVtcHRzIHRvIGFueSBwcm9maWxlcyBvZiBhbnkKKyAgICAgKiByZW1vdGUgZGV2aWNlLiBXaGVuIHRoZSBhZGFwdGVyIGRpc2Nvbm5lY3RzIGZyb20gdGhlIGxhc3QgcHJvZmlsZSBpdHMKKyAgICAgKiBjb25uZWN0ZWQgdG8gb2YgYW55IHJlbW90ZSBkZXZpY2UsIHRoaXMgaW50ZW50IHdpbGwgYmUgc2VudC4KKyAgICAgKgorICAgICAqIDxwPiBUaGlzIGludGVudCBpcyB1c2VmdWwgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBvbmx5IGNvbmNlcm5lZCBhYm91dAorICAgICAqIHdoZXRoZXIgdGhlIGxvY2FsIGFkYXB0ZXIgaXMgY29ubmVjdGVkIHRvIGFueSBwcm9maWxlIG9mIGFueSBkZXZpY2UgYW5kCisgICAgICogYXJlIG5vdCByZWFsbHkgY29uY2VybmVkIGFib3V0IHdoaWNoIHByb2ZpbGUuIEZvciBleGFtcGxlLCBhbiBhcHBsaWNhdGlvbgorICAgICAqIHdoaWNoIGRpc3BsYXlzIGFuIGljb24gdG8gZGlzcGxheSB3aGV0aGVyIEJsdWV0b290aCBpcyBjb25uZWN0ZWQgb3Igbm90CisgICAgICogY2FuIHVzZSB0aGlzIGludGVudC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgaW50ZW50IHdpbGwgaGF2ZSAzIGV4dHJhczoKKyAgICAgKiB7QGxpbmsgI0VYVFJBX1NUQVRFfSAtIFRoZSBjdXJyZW50IHN0YXRlLgorICAgICAqIHtAbGluayAjRVhUUkFfUFJFVklPVVNfU1RBVEV9LSBUaGUgcHJldmlvdXMuCisgICAgICoge0BsaW5rIEJsdWV0b290aERldmljZSNFWFRSQV9ERVZJQ0V9IC0gVGhlIHJlbW90ZSBkZXZpY2UuCisgICAgICoKKyAgICAgKiB7QGxpbmsgI0VYVFJBX1NUQVRFfSBvciB7QGxpbmsgI0VYVFJBX1BSRVZJT1VTX1NUQVRFfSBjYW4gYmUgYW55IG9mCisgICAgICoge0BsaW5rICNTVEFURV9ESVNDT05ORUNURUR9LCB7QGxpbmsgI1NUQVRFX0NPTk5FQ1RJTkd9LAorICAgICAqIHtAbGluayAjU1RBVEVfQ09OTkVDVEVEfSwge0BsaW5rICNTVEFURV9ESVNDT05ORUNUSU5HfS4KKyAgICAgKgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIfSB0byByZWNlaXZlLgorICAgICAqLworICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04pCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCA9CisgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5hZGFwdGVyLmFjdGlvbi5DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQiOworCisgICAgLyoqCisgICAgICogRXh0cmEgdXNlZCBieSB7QGxpbmsgI0FDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUR9CisgICAgICoKKyAgICAgKiBUaGlzIGV4dHJhIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9DT05ORUNUSU9OX1NUQVRFID0KKyAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmFkYXB0ZXIuZXh0cmEuQ09OTkVDVElPTl9TVEFURSI7CisKKyAgICAvKioKKyAgICAgKiBFeHRyYSB1c2VkIGJ5IHtAbGluayAjQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRH0KKyAgICAgKgorICAgICAqIFRoaXMgZXh0cmEgcmVwcmVzZW50cyB0aGUgcHJldmlvdXMgY29ubmVjdGlvbiBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVWSU9VU19DT05ORUNUSU9OX1NUQVRFID0KKyAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguYWRhcHRlci5leHRyYS5QUkVWSU9VU19DT05ORUNUSU9OX1NUQVRFIjsKKworICAgIC8qKiBUaGUgcHJvZmlsZSBpcyBpbiBkaXNjb25uZWN0ZWQgc3RhdGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9ESVNDT05ORUNURUQgID0gMDsKKyAgICAvKiogVGhlIHByb2ZpbGUgaXMgaW4gY29ubmVjdGluZyBzdGF0ZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RJTkcgICAgPSAxOworICAgIC8qKiBUaGUgcHJvZmlsZSBpcyBpbiBjb25uZWN0ZWQgc3RhdGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNURUQgICAgID0gMjsKKyAgICAvKiogVGhlIHByb2ZpbGUgaXMgaW4gZGlzY29ubmVjdGluZyBzdGF0ZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RJTkcgPSAzOworCiAgICAgLyoqIEBoaWRlICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxVRVRPT1RIX1NFUlZJQ0UgPSAiYmx1ZXRvb3RoIjsKIApAQCAtODk2LDYgKzk1Miw1NCBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICAvKgorICAgICAqIEdldCB0aGUgcHJvZmlsZSBwcm94eSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9maWxlLgorICAgICAqCisgICAgICogPHA+UHJvZmlsZSBjYW4gYmUgb25lIG9mIHtAbGluayBCbHVldG9vdGhQcm9maWxlLkhFQURTRVR9IG9yCisgICAgICoge0BsaW5rIEJsdWV0b290aFByb2ZpbGUuQTJEUH0uIENsaWVudHMgbXVzdCBpbXBsZW1lbnRzCisgICAgICoge0BsaW5rIEJsdWV0b290aFByb2ZpbGUuU2VydmljZUxpc3RlbmVyfSB0byBnZXQgbm90aWZpZWQgb2YKKyAgICAgKiB0aGUgY29ubmVjdGlvbiBzdGF0dXMgYW5kIHRvIGdldCB0aGUgcHJveHkgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBvZiB0aGUgYXBwbGljYXRpb24KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIHNlcnZpY2UgTGlzdGVuZXIgZm9yIGNvbm5lY3Rpb24gY2FsbGJhY2tzLgorICAgICAqIEBwYXJhbSBwcm9maWxlCisgICAgICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UHJvZmlsZVByb3h5KENvbnRleHQgY29udGV4dCwgQmx1ZXRvb3RoUHJvZmlsZS5TZXJ2aWNlTGlzdGVuZXIgbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm9maWxlKSB7CisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwgfHwgbGlzdGVuZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChwcm9maWxlID09IEJsdWV0b290aFByb2ZpbGUuSEVBRFNFVCkgeworICAgICAgICAgICAgQmx1ZXRvb3RoSGVhZHNldCBoZWFkc2V0ID0gbmV3IEJsdWV0b290aEhlYWRzZXQoY29udGV4dCwgbGlzdGVuZXIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBCbHVldG9vdGhQcm9maWxlLkEyRFApIHsKKyAgICAgICAgICAgIEJsdWV0b290aEEyZHAgYTJkcCA9IG5ldyBCbHVldG9vdGhBMmRwKGNvbnRleHQsIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIGNvbm5lY3Rpb24gb2YgdGhlIHByb2ZpbGUgcHJveHkgdG8gdGhlIFNlcnZpY2UuCisgICAgICoKKyAgICAgKiA8cD4gQ2xpZW50cyBzaG91bGQgY2FsbCB0aGlzIHdoZW4gdGhleSBhcmUgbm8gbG9uZ2VyIHVzaW5nCisgICAgICogdGhlIHByb3h5IG9idGFpbmVkIGZyb20ge0BsaW5rICNnZXRQcm9maWxlUHJveHl9LgorICAgICAqIFByb2ZpbGUgY2FuIGJlIG9uZSBvZiB7QGxpbmsgQmx1ZXRvb3RoUHJvZmlsZSNIRUFEU0VUfSBvcgorICAgICAqIHtAbGluayBCbHVldG9vdGhQcm9maWxlI0EyRFB9CisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvZmlsZQorICAgICAqIEBwYXJhbSBwcm94eSBQcm9maWxlIHByb3h5IG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlUHJvZmlsZVByb3h5KGludCBwcm9maWxlLCBCbHVldG9vdGhQcm9maWxlIHByb3h5KSB7CisgICAgICAgIGlmIChwcm9maWxlID09IEJsdWV0b290aFByb2ZpbGUuSEVBRFNFVCkgeworICAgICAgICAgICAgQmx1ZXRvb3RoSGVhZHNldCBoZWFkc2V0ID0gKEJsdWV0b290aEhlYWRzZXQpcHJveHk7CisgICAgICAgICAgICBpZiAoaGVhZHNldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGVhZHNldC5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiB0b0RldmljZVNldChTdHJpbmdbXSBhZGRyZXNzZXMpIHsKICAgICAgICAgU2V0PEJsdWV0b290aERldmljZT4gZGV2aWNlcyA9IG5ldyBIYXNoU2V0PEJsdWV0b290aERldmljZT4oYWRkcmVzc2VzLmxlbmd0aCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRkcmVzc2VzLmxlbmd0aDsgaSsrKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQ2xhc3MuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDbGFzcy5qYXZhCmluZGV4IDZhODc4ZDcuLmU2MDRlNmIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDbGFzcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDbGFzcy5qYXZhCkBAIC0yNTksNiArMjU5LDEyIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9BMkRQID0gMTsKICAgICAvKiogQGhpZGUgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9GSUxFX09QUCA9IDI7CisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9ISUQgPSAzOworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0ZJTEVfUEFOVSA9IDQ7CisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9OQVAgPSA1OwogCiAgICAgLyoqCiAgICAgICogQ2hlY2sgY2xhc3MgYml0cyBmb3IgcG9zc2libGUgYmx1ZXRvb3RoIHByb2ZpbGUgc3VwcG9ydC4KQEAgLTMyNCw2ICszMzAsMTQgQEAKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBQUk9GSUxFX0hJRCkgeworICAgICAgICAgICAgcmV0dXJuIChnZXREZXZpY2VDbGFzcygpICYgRGV2aWNlLk1ham9yLlBFUklQSEVSQUwpID09IERldmljZS5NYWpvci5QRVJJUEhFUkFMOworICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gUFJPRklMRV9QQU5VIHx8IHByb2ZpbGUgPT0gUFJPRklMRV9OQVApeworICAgICAgICAgICAgLy8gTm8gZ29vZCB3YXkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgdHdvLCBiYXNlZCBvbiBjbGFzcyBiaXRzLgorICAgICAgICAgICAgaWYgKGhhc1NlcnZpY2UoU2VydmljZS5ORVRXT1JLSU5HKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChnZXREZXZpY2VDbGFzcygpICYgRGV2aWNlLk1ham9yLk5FVFdPUktJTkcpID09IERldmljZS5NYWpvci5ORVRXT1JLSU5HOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUGlja2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUGlja2VyLmphdmEKaW5kZXggM2EwNzAzMy4uYzc5NGJlMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aERldmljZVBpY2tlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhEZXZpY2VQaWNrZXIuamF2YQpAQCAtNjQsNCArNjQsOSBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTFRFUl9UWVBFX0FVRElPID0gMTsKICAgICAvKiogQXNrIGRldmljZSBwaWNrZXIgdG8gc2hvdyBCVCBkZXZpY2VzIHRoYXQgc3VwcG9ydCBPYmplY3QgVHJhbnNmZXIgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxURVJfVFlQRV9UUkFOU0ZFUiA9IDI7CisgICAgLyoqIEFzayBkZXZpY2UgcGlja2VyIHRvIHNob3cgQlQgZGV2aWNlcyB0aGF0IHN1cHBvcnQKKyAgICAgKiBQZXJzb25hbCBBcmVhIE5ldHdvcmtpbmcgVXNlciAoUEFOVSkgcHJvZmlsZSovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMVEVSX1RZUEVfUEFOVSA9IDM7CisgICAgLyoqIEFzayBkZXZpY2UgcGlja2VyIHRvIHNob3cgQlQgZGV2aWNlcyB0aGF0IHN1cHBvcnQgTmV0d29yayBBY2Nlc3MgUG9pbnQgKE5BUCkgcHJvZmlsZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTFRFUl9UWVBFX05BUCA9IDQ7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlLmphdmEKaW5kZXggOGU2NTVlMi4uZTQ2MDgzOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUuamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLnNlcnZlci5CbHVldG9vdGhBMmRwU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLnNlcnZlci5CbHVldG9vdGhTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CkBAIC0yOCw2ICsyOSw4IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5IaWVyYXJjaGljYWxTdGF0ZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTsKIAoraW1wb3J0IGphdmEudXRpbC5TZXQ7CisKIC8qKgogICogVGhpcyBjbGFzcyBpcyB0aGUgUHJvZmlsZSBjb25uZWN0aW9uIHN0YXRlIG1hY2hpbmUgYXNzb2NpYXRlZCB3aXRoIGEgcmVtb3RlCiAgKiBkZXZpY2UuIFdoZW4gdGhlIGRldmljZSBib25kcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGNyZWF0ZWQuCkBAIC01OCwxOSArNjEsMjQgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSB0cnVlOyAvL1NUT1BTSElQIC0gQ2hhbmdlIHRvIGZhbHNlCiAKKyAgICAvLyBUT0RPKCk6IFJlc3RydWN0dXJlIHRoZSBzdGF0ZSBtYWNoaW5lIHRvIG1ha2UgaXQgc2NhbGFibGUgd2l0aCByZWdhcmQgdG8gcHJvZmlsZXMuCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9IRlBfT1VUR09JTkcgPSAxOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfSEZQX0lOQ09NSU5HID0gMjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0EyRFBfT1VUR09JTkcgPSAzOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfQTJEUF9JTkNPTUlORyA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9ISURfT1VUR09JTkcgPSA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfSElEX0lOQ09NSU5HID0gNjsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfSEZQX09VVEdPSU5HID0gNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9IRlBfSU5DT01JTkcgPSA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfQTJEUF9PVVRHT0lORyA9IDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HID0gODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0hGUF9PVVRHT0lORyA9IDUwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0hGUF9JTkNPTUlORyA9IDUxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfQTJEUF9PVVRHT0lORyA9IDUyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfQTJEUF9JTkNPTUlORyA9IDUzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfSElEX09VVEdPSU5HID0gNTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9ISURfSU5DT01JTkcgPSA1NTsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOUEFJUiA9IDk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVVUT19DT05ORUNUX1BST0ZJTEVTID0gMTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNJVElPTl9UT19TVEFCTEUgPSAxMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlBBSVIgPSAxMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVVUT19DT05ORUNUX1BST0ZJTEVTID0gMTAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TSVRJT05fVE9fU1RBQkxFID0gMTAyOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFVVE9fQ09OTkVDVF9ERUxBWSA9IDYwMDA7IC8vIDYgc2VjcwogCkBAIC03OSwxNiArODcsMTggQEAKICAgICBwcml2YXRlIEluY29taW5nSGFuZHNmcmVlIG1JbmNvbWluZ0hhbmRzZnJlZSA9IG5ldyBJbmNvbWluZ0hhbmRzZnJlZSgpOwogICAgIHByaXZhdGUgSW5jb21pbmdBMmRwIG1JbmNvbWluZ0EyZHAgPSBuZXcgSW5jb21pbmdBMmRwKCk7CiAgICAgcHJpdmF0ZSBPdXRnb2luZ0EyZHAgbU91dGdvaW5nQTJkcCA9IG5ldyBPdXRnb2luZ0EyZHAoKTsKKyAgICBwcml2YXRlIE91dGdvaW5nSGlkIG1PdXRnb2luZ0hpZCA9IG5ldyBPdXRnb2luZ0hpZCgpOworICAgIHByaXZhdGUgSW5jb21pbmdIaWQgbUluY29taW5nSGlkID0gbmV3IEluY29taW5nSGlkKCk7CiAKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CiAgICAgcHJpdmF0ZSBCbHVldG9vdGhTZXJ2aWNlIG1TZXJ2aWNlOwogICAgIHByaXZhdGUgQmx1ZXRvb3RoQTJkcFNlcnZpY2UgbUEyZHBTZXJ2aWNlOwogICAgIHByaXZhdGUgQmx1ZXRvb3RoSGVhZHNldCAgbUhlYWRzZXRTZXJ2aWNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSGVhZHNldFNlcnZpY2VDb25uZWN0ZWQ7CiAKICAgICBwcml2YXRlIEJsdWV0b290aERldmljZSBtRGV2aWNlOwotICAgIHByaXZhdGUgaW50IG1IZWFkc2V0U3RhdGU7Ci0gICAgcHJpdmF0ZSBpbnQgbUEyZHBTdGF0ZTsKKyAgICBwcml2YXRlIGludCBtSGVhZHNldFN0YXRlID0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgcHJpdmF0ZSBpbnQgbUEyZHBTdGF0ZSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOworICAgIHByaXZhdGUgaW50IG1IaWRTdGF0ZSA9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOwogCiAgICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtQnJvYWRjYXN0UmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CiAgICAgICAgIEBPdmVycmlkZQpAQCAtOTcsMzIgKzEwNyw0MiBAQAogICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0RFVklDRSk7CiAgICAgICAgICAgICBpZiAoIWRldmljZS5lcXVhbHMobURldmljZSkpIHJldHVybjsKIAotICAgICAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoSGVhZHNldC5BQ1RJT05fU1RBVEVfQ0hBTkdFRCkpIHsKLSAgICAgICAgICAgICAgICBpbnQgbmV3U3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoSGVhZHNldC5FWFRSQV9TVEFURSwgMCk7Ci0gICAgICAgICAgICAgICAgaW50IG9sZFN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aEhlYWRzZXQuRVhUUkFfUFJFVklPVVNfU1RBVEUsIDApOwotICAgICAgICAgICAgICAgIGludCBpbml0aWF0b3IgPSBpbnRlbnQuZ2V0SW50RXh0cmEoCi0gICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEhlYWRzZXQuRVhUUkFfRElTQ09OTkVDVF9JTklUSUFUT1IsCi0gICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEhlYWRzZXQuTE9DQUxfRElTQ09OTkVDVCk7Ci0gICAgICAgICAgICAgICAgbUhlYWRzZXRTdGF0ZSA9IG5ld1N0YXRlOwotICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0RJU0NPTk5FQ1RFRCAmJgotICAgICAgICAgICAgICAgICAgICBpbml0aWF0b3IgPT0gQmx1ZXRvb3RoSGVhZHNldC5SRU1PVEVfRElTQ09OTkVDVCkgewotICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShESVNDT05ORUNUX0hGUF9JTkNPTUlORyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRCB8fAotICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShUUkFOU0lUSU9OX1RPX1NUQUJMRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aEEyZHAuQUNUSU9OX1NJTktfU1RBVEVfQ0hBTkdFRCkpIHsKLSAgICAgICAgICAgICAgICBpbnQgbmV3U3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoQTJkcC5FWFRSQV9TSU5LX1NUQVRFLCAwKTsKLSAgICAgICAgICAgICAgICBpbnQgb2xkU3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoQTJkcC5FWFRSQV9QUkVWSU9VU19TSU5LX1NUQVRFLCAwKTsKKyAgICAgICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aEEyZHAuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV3U3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoUHJvZmlsZS5FWFRSQV9TVEFURSwgMCk7CisgICAgICAgICAgICAgICAgaW50IG9sZFN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aFByb2ZpbGUuRVhUUkFfUFJFVklPVVNfU1RBVEUsIDApOwogICAgICAgICAgICAgICAgIG1BMmRwU3RhdGUgPSBuZXdTdGF0ZTsKLSAgICAgICAgICAgICAgICBpZiAoKG9sZFN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVEVEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRTdGF0ZSA9PSBCbHVldG9vdGhBMmRwLlNUQVRFX1BMQVlJTkcpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgIGlmIChvbGRTdGF0ZSA9PSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RFRCAmJgorICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRCkgewogICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShESVNDT05ORUNUX0EyRFBfSU5DT01JTkcpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNURUQgfHwKLSAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQgfHwKKyAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoVFJBTlNJVElPTl9UT19TVEFCTEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhCbHVldG9vdGhIZWFkc2V0LkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpKSB7CisgICAgICAgICAgICAgICAgaW50IG5ld1N0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aFByb2ZpbGUuRVhUUkFfU1RBVEUsIDApOworICAgICAgICAgICAgICAgIGludCBvbGRTdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhQcm9maWxlLkVYVFJBX1BSRVZJT1VTX1NUQVRFLCAwKTsKKworICAgICAgICAgICAgICAgIG1IZWFkc2V0U3RhdGUgPSBuZXdTdGF0ZTsKKyAgICAgICAgICAgICAgICBpZiAob2xkU3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNURUQgJiYKKyAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoRElTQ09OTkVDVF9IRlBfSU5DT01JTkcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQgfHwKKyAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoVFJBTlNJVElPTl9UT19TVEFCTEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhCbHVldG9vdGhJbnB1dERldmljZS5BQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQpKSB7CisgICAgICAgICAgICAgICAgaW50IG5ld1N0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aElucHV0RGV2aWNlLkVYVFJBX0lOUFVUX0RFVklDRV9TVEFURSwgMCk7CisgICAgICAgICAgICAgICAgaW50IG9sZFN0YXRlID0KKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aElucHV0RGV2aWNlLkVYVFJBX1BSRVZJT1VTX0lOUFVUX0RFVklDRV9TVEFURSwgMCk7CisgICAgICAgICAgICAgICAgbUhpZFN0YXRlID0gbmV3U3RhdGU7CisgICAgICAgICAgICAgICAgaWYgKG9sZFN0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RFRCAmJgorICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoRElTQ09OTkVDVF9ISURfSU5DT01JTkcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEIHx8CisgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRCkgewogICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShUUkFOU0lUSU9OX1RPX1NUQUJMRSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aERldmljZS5BQ1RJT05fQUNMX0NPTk5FQ1RFRCkpIHsKQEAgLTE2NSwzNCArMTg1LDM3IEBACiAgICAgICAgIGFkZFN0YXRlKG1JbmNvbWluZ0hhbmRzZnJlZSk7CiAgICAgICAgIGFkZFN0YXRlKG1JbmNvbWluZ0EyZHApOwogICAgICAgICBhZGRTdGF0ZShtT3V0Z29pbmdBMmRwKTsKKyAgICAgICAgYWRkU3RhdGUobU91dGdvaW5nSGlkKTsKKyAgICAgICAgYWRkU3RhdGUobUluY29taW5nSGlkKTsKICAgICAgICAgc2V0SW5pdGlhbFN0YXRlKG1Cb25kZWREZXZpY2UpOwogCiAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CiAgICAgICAgIC8vIEZpbmUtZ3JhaW5lZCBzdGF0ZSBicm9hZGNhc3RzCi0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoQTJkcC5BQ1RJT05fU0lOS19TVEFURV9DSEFOR0VEKTsKLSAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhIZWFkc2V0LkFDVElPTl9TVEFURV9DSEFOR0VEKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhEZXZpY2UuQUNUSU9OX0FDTF9DT05ORUNURUQpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoQTJkcC5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhJbnB1dERldmljZS5BQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQpOwogCiAgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobUJyb2FkY2FzdFJlY2VpdmVyLCBmaWx0ZXIpOwogCi0gICAgICAgIEhlYWRzZXRTZXJ2aWNlTGlzdGVuZXIgbCA9IG5ldyBIZWFkc2V0U2VydmljZUxpc3RlbmVyKCk7CisgICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKKyAgICAgICAgYWRhcHRlci5nZXRQcm9maWxlUHJveHkobUNvbnRleHQsIG1CbHVldG9vdGhQcm9maWxlU2VydmljZUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQpOwogICAgIH0KIAotICAgIHByaXZhdGUgY2xhc3MgSGVhZHNldFNlcnZpY2VMaXN0ZW5lciBpbXBsZW1lbnRzIEJsdWV0b290aEhlYWRzZXQuU2VydmljZUxpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIEhlYWRzZXRTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBtSGVhZHNldFNlcnZpY2UgPSBuZXcgQmx1ZXRvb3RoSGVhZHNldChtQ29udGV4dCwgdGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKCkgeworICAgIHByaXZhdGUgQmx1ZXRvb3RoUHJvZmlsZS5TZXJ2aWNlTGlzdGVuZXIgbUJsdWV0b290aFByb2ZpbGVTZXJ2aWNlTGlzdGVuZXIgPQorICAgICAgICBuZXcgQmx1ZXRvb3RoUHJvZmlsZS5TZXJ2aWNlTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChpbnQgcHJvZmlsZSwgQmx1ZXRvb3RoUHJvZmlsZSBwcm94eSkgewogICAgICAgICAgICAgc3luY2hyb25pemVkKEJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZS50aGlzKSB7Ci0gICAgICAgICAgICAgICAgbUhlYWRzZXRTZXJ2aWNlQ29ubmVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtSGVhZHNldFNlcnZpY2UgPSAoQmx1ZXRvb3RoSGVhZHNldCkgcHJveHk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoaW50IHByb2ZpbGUpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZChCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUudGhpcykgewotICAgICAgICAgICAgICAgIG1IZWFkc2V0U2VydmljZUNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1IZWFkc2V0U2VydmljZSA9IG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9CisgICAgfTsKIAogICAgIHByaXZhdGUgY2xhc3MgQm9uZGVkRGV2aWNlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgewogICAgICAgICBAT3ZlcnJpZGUKQEAgLTIyNCw2ICsyNDcsMTQgQEAKICAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfQTJEUF9JTkNPTUlORzoKICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmNvbWluZ0EyZHApOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtT3V0Z29pbmdIaWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtSW5jb21pbmdIaWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFVOUEFJUjoKICAgICAgICAgICAgICAgICAgICAgaWYgKG1IZWFkc2V0U3RhdGUgIT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKERJU0NPTk5FQ1RfSEZQX09VVEdPSU5HKTsKQEAgLTIzMyw2ICsyNjQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKERJU0NPTk5FQ1RfQTJEUF9PVVRHT0lORyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtSGlkU3RhdGUgIT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShESVNDT05ORUNUX0hJRF9PVVRHT0lORyk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWFuZChVTlBBSVIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTI0MCwxOSArMjc1LDI5IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChpc1Bob25lRG9ja2VkKG1EZXZpY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBhdXRvIGNvbm5lY3QgdG8gZG9ja3MuCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbUhlYWRzZXRTZXJ2aWNlQ29ubmVjdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUhlYWRzZXRTZXJ2aWNlID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSGVhZHNldFNlcnZpY2UuZ2V0UHJpb3JpdHkobURldmljZSkgPT0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEhlYWRzZXQuUFJJT1JJVFlfQVVUT19DT05ORUNUICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbUhlYWRzZXRTZXJ2aWNlLmlzQ29ubmVjdGVkKG1EZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRzZXRTZXJ2aWNlLmNvbm5lY3RIZWFkc2V0KG1EZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRzZXRTZXJ2aWNlLmdldERldmljZXNNYXRjaGluZ0Nvbm5lY3Rpb25TdGF0ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGludFtdIHtCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVElOR30pLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRzZXRTZXJ2aWNlLmNvbm5lY3QobURldmljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUEyZHBTZXJ2aWNlICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwU2VydmljZS5nZXRTaW5rUHJpb3JpdHkobURldmljZSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwU2VydmljZS5nZXRQcmlvcml0eShtRGV2aWNlKSA9PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQTJkcC5QUklPUklUWV9BVVRPX0NPTk5FQ1QgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwU2VydmljZS5nZXRDb25uZWN0ZWRTaW5rcygpLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBTZXJ2aWNlLmNvbm5lY3RTaW5rKG1EZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBTZXJ2aWNlLmdldERldmljZXNNYXRjaGluZ0Nvbm5lY3Rpb25TdGF0ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGludFtdIHtCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVElOR30pLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBTZXJ2aWNlLmNvbm5lY3QobURldmljZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlcnZpY2UuZ2V0SW5wdXREZXZpY2VQcmlvcml0eShtRGV2aWNlKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfQVVUT19DT05ORUNUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2UuY29ubmVjdElucHV0RGV2aWNlKG1EZXZpY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzQyLDYgKzM4NywyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UoZGVmZXJNc2cpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUluY29taW5nSGlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTXNnLndoYXQgPSBtQ29tbWFuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShkZWZlck1zZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTXNnLndoYXQgPSBtQ29tbWFuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShkZWZlck1zZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIGlnbm9yZQogICAgICAgICAgICAgICAgIGNhc2UgVU5QQUlSOgogICAgICAgICAgICAgICAgIGNhc2UgQVVUT19DT05ORUNUX1BST0ZJTEVTOgogICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CkBAIC00MDksNiArNDcxLDEzIEBACiAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgY2F1c2VzIGluY29taW5nIEhGUCB0byBmYWlsLCBpdCBpcyBtb3JlIG9mIGEgaGVhZHNldCBwcm9ibGVtCiAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIGJvdGggY29ubmVjdGlvbnMgYXJlIGluY29taW5nIG9uZXMuCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gaWdub3JlCiAgICAgICAgICAgICAgICAgY2FzZSBVTlBBSVI6CiAgICAgICAgICAgICAgICAgY2FzZSBBVVRPX0NPTk5FQ1RfUFJPRklMRVM6CiAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKQEAgLTQ5Niw2ICs1NjUsMjMgQEAKICAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfQTJEUF9JTkNPTUlORzoKICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlLCB3aWxsIGJlIGhhbmRsZWQgYnkgQmx1ZXoKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtSW5jb21pbmdIaWQpOworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNc2cud2hhdCA9IG1Db21tYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKGRlZmVyTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNc2cud2hhdCA9IG1Db21tYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKGRlZmVyTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gaWdub3JlCiAgICAgICAgICAgICAgICAgY2FzZSBVTlBBSVI6CiAgICAgICAgICAgICAgICAgY2FzZSBBVVRPX0NPTk5FQ1RfUFJPRklMRVM6CiAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKQEAgLTU2MSw2ICs2NDcsMTMgQEAKICAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfQTJEUF9JTkNPTUlORzoKICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlLCB3aWxsIGJlIGhhbmRsZWQgYnkgQmx1ZXoKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBpZ25vcmUKICAgICAgICAgICAgICAgICBjYXNlIFVOUEFJUjoKICAgICAgICAgICAgICAgICBjYXNlIEFVVE9fQ09OTkVDVF9QUk9GSUxFUzoKICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwpAQCAtNTc2LDExICs2NjksMTQ4IEBACiAgICAgfQogCiAKKyAgICBwcml2YXRlIGNsYXNzIE91dGdvaW5nSGlkIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXR1cyA9IGZhbHNlOworICAgICAgICBwcml2YXRlIGludCBtQ29tbWFuZDsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBsb2coIkVudGVyaW5nIE91dGdvaW5nSGlkIHN0YXRlIHdpdGg6ICIgKyBnZXRDdXJyZW50TWVzc2FnZSgpLndoYXQpOworICAgICAgICAgICAgbUNvbW1hbmQgPSBnZXRDdXJyZW50TWVzc2FnZSgpLndoYXQ7CisgICAgICAgICAgICBpZiAobUNvbW1hbmQgIT0gQ09OTkVDVF9ISURfT1VUR09JTkcgJiYKKyAgICAgICAgICAgICAgICBtQ29tbWFuZCAhPSBESVNDT05ORUNUX0hJRF9PVVRHT0lORykgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yOiBPdXRnb2luZ0hpZCBzdGF0ZSB3aXRoIGNvbW1hbmQ6IiArIG1Db21tYW5kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdGF0dXMgPSBwcm9jZXNzQ29tbWFuZChtQ29tbWFuZCk7CisgICAgICAgICAgICBpZiAoIW1TdGF0dXMpIHNlbmRNZXNzYWdlKFRSQU5TSVRJT05fVE9fU1RBQkxFKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGxvZygiT3V0Z29pbmdIaWQgU3RhdGUtPlByb2Nlc3NpbmcgTWVzc2FnZTogIiArIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICBNZXNzYWdlIGRlZmVyTXNnID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICAvLyBkZWZlciBhbGwgb3V0Z29pbmcgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSEZQX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9BMkRQX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hGUF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfQTJEUF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hGUF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmNvbWluZ0hhbmRzZnJlZSk7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0EyRFBfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtSW5jb21pbmdBMmRwKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBjYW5jZWwgSElEIG91dGdvaW5nIGFzIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSBpdAorICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIGdldCBjYW5jZWxlZC4KKyAgICAgICAgICAgICAgICAgICAgLy8gSXQgbWlnaHQgYWxyZWFkeSBiZSBjb25uZWN0ZWQgYnV0IHdlIG1pZ2h0IG5vdCBoYXZlIGdvdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRS4gSGVuY2UsIG5vIHBvaW50IGRpc2Nvbm5lY3RpbmcgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHdvcnN0IGNhc2UsIHRoZSBjb25uZWN0aW9uIHdpbGwgZmFpbCwgcmV0cnkuCisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1zZy53aGF0ID0gbUNvbW1hbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UoZGVmZXJNc2cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAvLyBCbHVleiB3aWxsIHRha2UgY2FyZSBvZiB0aGUgY29uZmxpY3RzCisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtSW5jb21pbmdIaWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9IRlBfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0EyRFBfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIGFyZSBhbHJlYWR5IGRpc2Nvbm5lY3RlZAorICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIEhGUC4gU29tZXRpbWVzIEhJRCBjb25uZWN0aW9uIGNhbgorICAgICAgICAgICAgICAgICAgICAvLyBmYWlsIGR1ZSB0byB0aGUgZGlzY29ubmVjdGlvbiBvZiBIRlAuIFNvIGFkZCBhIHJldHJ5CisgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgSElELgorICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNc2cud2hhdCA9IG1Db21tYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKGRlZmVyTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUsIHdpbGwgYmUgaGFuZGxlZCBieSBCbHVlegorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgVU5QQUlSOgorICAgICAgICAgICAgICAgIGNhc2UgQVVUT19DT05ORUNUX1BST0ZJTEVTOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVFJBTlNJVElPTl9UT19TVEFCTEU6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQm9uZGVkRGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgcHJpdmF0ZSBjbGFzcyBJbmNvbWluZ0hpZCBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhdHVzID0gZmFsc2U7CisgICAgICBwcml2YXRlIGludCBtQ29tbWFuZDsKKworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICBsb2coIkVudGVyaW5nIEluY29taW5nSGlkIHN0YXRlIHdpdGg6ICIgKyBnZXRDdXJyZW50TWVzc2FnZSgpLndoYXQpOworICAgICAgICAgIG1Db21tYW5kID0gZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0OworICAgICAgICAgIGlmIChtQ29tbWFuZCAhPSBDT05ORUNUX0hJRF9JTkNPTUlORyAmJgorICAgICAgICAgICAgICBtQ29tbWFuZCAhPSBESVNDT05ORUNUX0hJRF9JTkNPTUlORykgeworICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvcjogSW5jb21pbmdIaWQgc3RhdGUgd2l0aCBjb21tYW5kOiIgKyBtQ29tbWFuZCk7CisgICAgICAgICAgfQorICAgICAgICAgIG1TdGF0dXMgPSBwcm9jZXNzQ29tbWFuZChtQ29tbWFuZCk7CisgICAgICAgICAgaWYgKCFtU3RhdHVzKSBzZW5kTWVzc2FnZShUUkFOU0lUSU9OX1RPX1NUQUJMRSk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgbG9nKCJJbmNvbWluZ0hpZCBTdGF0ZS0+UHJvY2Vzc2luZyBNZXNzYWdlOiAiICsgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICBNZXNzYWdlIGRlZmVyTXNnID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9IRlBfT1VUR09JTkc6CisgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9IRlBfSU5DT01JTkc6CisgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9IRlBfT1VUR09JTkc6CisgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgorICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfQTJEUF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0EyRFBfT1VUR09JTkc6CisgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hGUF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgIC8vIFNob3VsZG4ndCBoYXBwZW4gYnV0IGlmIGRvZXMsIHdlIGNhbiBoYW5kbGUgaXQuCisgICAgICAgICAgICAgICAgICAvLyBEZXBlbmRzIGlmIHRoZSBoZWFkc2V0IGNhbiBoYW5kbGUgaXQuCisgICAgICAgICAgICAgICAgICAvLyBJbmNvbWluZyBISUQgd2lsbCBiZSBoYW5kbGVkIGJ5IEJsdWV6LCBEaXNjb25uZWN0IEhGUAorICAgICAgICAgICAgICAgICAgLy8gdGhlIHNvY2tldCB3b3VsZCBoYXZlIGFscmVhZHkgYmVlbiBjbG9zZWQuCisgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfQTJEUF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSwgd2lsbCBiZSBoYW5kbGVkIGJ5IEJsdWV6CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBVTlBBSVI6CisgICAgICAgICAgICAgIGNhc2UgQVVUT19DT05ORUNUX1BST0ZJTEVTOgorICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVFJBTlNJVElPTl9UT19TVEFCTEU6CisgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUJvbmRlZERldmljZSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICB9CisgIH0KKwogCiAgICAgc3luY2hyb25pemVkIHZvaWQgY2FuY2VsQ29tbWFuZChpbnQgY29tbWFuZCkgewogICAgICAgICBpZiAoY29tbWFuZCA9PSBDT05ORUNUX0hGUF9PVVRHT0lORyApIHsKICAgICAgICAgICAgIC8vIENhbmNlbCB0aGUgb3V0Z29pbmcgdGhyZWFkLgotICAgICAgICAgICAgaWYgKG1IZWFkc2V0U2VydmljZUNvbm5lY3RlZCkgeworICAgICAgICAgICAgaWYgKG1IZWFkc2V0U2VydmljZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbUhlYWRzZXRTZXJ2aWNlLmNhbmNlbENvbm5lY3RUaHJlYWQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIEhlYWRzZXRTZXJ2aWNlIGlzIGRvd24uIFBob25lIHByb2Nlc3MgbW9zdCBsaWtlbHkgY3Jhc2hlZC4KQEAgLTU5OCwxMiArODI4LDE0IEBACiAgICAgICAgIGxvZygiUHJvY2Vzc2luZyBjb21tYW5kOiIgKyBjb21tYW5kKTsKICAgICAgICAgc3dpdGNoKGNvbW1hbmQpIHsKICAgICAgICAgICAgIGNhc2UgIENPTk5FQ1RfSEZQX09VVEdPSU5HOgotICAgICAgICAgICAgICAgIGlmIChtSGVhZHNldFNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhZHNldFNlcnZpY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBkZWZlckhlYWRzZXRNZXNzYWdlKGNvbW1hbmQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtSGVhZHNldFNlcnZpY2UuY29ubmVjdEhlYWRzZXRJbnRlcm5hbChtRGV2aWNlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSEZQX0lOQ09NSU5HOgotICAgICAgICAgICAgICAgIGlmICghbUhlYWRzZXRTZXJ2aWNlQ29ubmVjdGVkKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFkc2V0U2VydmljZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlZmVySGVhZHNldE1lc3NhZ2UoY29tbWFuZCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtSGVhZHNldFN0YXRlID09IEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQ09OTkVDVElORykgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUhlYWRzZXRTZXJ2aWNlLmFjY2VwdEluY29taW5nQ29ubmVjdChtRGV2aWNlKTsKQEAgLTYxOSw4ICs4NTEsMTIgQEAKICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgogICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwgQmx1ZXogdGFrZXMgY2FyZQogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuY29ubmVjdElucHV0RGV2aWNlSW50ZXJuYWwobURldmljZSk7CisgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hGUF9PVVRHT0lORzoKLSAgICAgICAgICAgICAgICBpZiAoIW1IZWFkc2V0U2VydmljZUNvbm5lY3RlZCkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhZHNldFNlcnZpY2UgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBkZWZlckhlYWRzZXRNZXNzYWdlKGNvbW1hbmQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtSGVhZHNldFNlcnZpY2UuZ2V0UHJpb3JpdHkobURldmljZSkgPT0KQEAgLTYzOCwxMyArODc0LDIyIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfQTJEUF9PVVRHT0lORzoKICAgICAgICAgICAgICAgICBpZiAobUEyZHBTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1BMmRwU2VydmljZS5nZXRTaW5rUHJpb3JpdHkobURldmljZSkgPT0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BMmRwU2VydmljZS5nZXRQcmlvcml0eShtRGV2aWNlKSA9PQogICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQTJkcC5QUklPUklUWV9BVVRPX0NPTk5FQ1QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwU2VydmljZS5zZXRTaW5rUHJpb3JpdHkobURldmljZSwgQmx1ZXRvb3RoSGVhZHNldC5QUklPUklUWV9PTik7CisgICAgICAgICAgICAgICAgICAgICAgICBtQTJkcFNlcnZpY2Uuc2V0UHJpb3JpdHkobURldmljZSwgQmx1ZXRvb3RoSGVhZHNldC5QUklPUklUWV9PTik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1BMmRwU2VydmljZS5kaXNjb25uZWN0U2lua0ludGVybmFsKG1EZXZpY2UpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGlmIChtU2VydmljZS5nZXRJbnB1dERldmljZVByaW9yaXR5KG1EZXZpY2UpID09CisgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX0FVVE9fQ09OTkVDVCkgeworICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRJbnB1dERldmljZVByaW9yaXR5KG1EZXZpY2UsIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX09OKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmRpc2Nvbm5lY3RJbnB1dERldmljZUludGVybmFsKG1EZXZpY2UpOwogICAgICAgICAgICAgY2FzZSBVTlBBSVI6CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnJlbW92ZUJvbmRJbnRlcm5hbChtRGV2aWNlLmdldEFkZHJlc3MoKSk7CiAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtNjUzLDYgKzg5OCw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKwogICAgIC8qcGFja2FnZSovIEJsdWV0b290aERldmljZSBnZXREZXZpY2UoKSB7CiAgICAgICAgIHJldHVybiBtRGV2aWNlOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhIZWFkc2V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSGVhZHNldC5qYXZhCmluZGV4IGRhMWFhNDUuLjA0OTZiMWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhIZWFkc2V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEhlYWRzZXQuamF2YQpAQCAtMTgsNiArMTgsOCBAQAogCiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50OwogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudC5TZGtDb25zdGFudFR5cGU7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKQEAgLTI2LDYzICsyOCw2NiBAQAogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKwogLyoqCi0gKiBUaGUgQW5kcm9pZCBCbHVldG9vdGggQVBJIGlzIG5vdCBmaW5hbGl6ZWQsIGFuZCAqd2lsbCogY2hhbmdlLiBVc2UgYXQgeW91cgotICogb3duIHJpc2suCi0gKgogICogUHVibGljIEFQSSBmb3IgY29udHJvbGxpbmcgdGhlIEJsdWV0b290aCBIZWFkc2V0IFNlcnZpY2UuIFRoaXMgaW5jbHVkZXMgYm90aAotICogQmx1ZXRvb3RoIEhlYWRzZXQgYW5kIEhhbmRzZnJlZSAodjEuNSkgcHJvZmlsZXMuIFRoZSBIZWFkc2V0IHNlcnZpY2Ugd2lsbAotICogYXR0ZW1wdCBhIGhhbmRzZnJlZSBjb25uZWN0aW9uIGZpcnN0LCBhbmQgZmFsbCBiYWNrIHRvIGhlYWRzZXQuCisgKiBCbHVldG9vdGggSGVhZHNldCBhbmQgSGFuZHNmcmVlICh2MS41KSBwcm9maWxlcy4KICAqCi0gKiBCbHVldG9vdGhIZWFkc2V0IGlzIGEgcHJveHkgb2JqZWN0IGZvciBjb250cm9sbGluZyB0aGUgQmx1ZXRvb3RoIEhlYWRzZXQKKyAqIDxwPkJsdWV0b290aEhlYWRzZXQgaXMgYSBwcm94eSBvYmplY3QgZm9yIGNvbnRyb2xsaW5nIHRoZSBCbHVldG9vdGggSGVhZHNldAogICogU2VydmljZSB2aWEgSVBDLgogICoKLSAqIENyZWF0aW5nIGEgQmx1ZXRvb3RoSGVhZHNldCBvYmplY3Qgd2lsbCBjcmVhdGUgYSBiaW5kaW5nIHdpdGggdGhlCi0gKiBCbHVldG9vdGhIZWFkc2V0IHNlcnZpY2UuIFVzZXJzIG9mIHRoaXMgb2JqZWN0IHNob3VsZCBjYWxsIGNsb3NlKCkgd2hlbiB0aGV5Ci0gKiBhcmUgZmluaXNoZWQgd2l0aCB0aGUgQmx1ZXRvb3RoSGVhZHNldCwgc28gdGhhdCB0aGlzIHByb3h5IG9iamVjdCBjYW4gdW5iaW5kCi0gKiBmcm9tIHRoZSBzZXJ2aWNlLgorICogPHA+IFVzZSB7QGxpbmsgQmx1ZXRvb3RoQWRhcHRlciNnZXRQcm9maWxlUHJveHl9IHRvIGdldAorICogdGhlIEJsdWV0b290aEhlYWRzZXQgcHJveHkgb2JqZWN0LiBVc2UKKyAqIHtAbGluayBCbHVldG9vdGhBZGFwdGVyI2Nsb3NlUHJvZmlsZVByb3h5fSB0byBjbG9zZSB0aGUgc2VydmljZSBjb25uZWN0aW9uLgogICoKLSAqIFRoaXMgQmx1ZXRvb3RoSGVhZHNldCBvYmplY3QgaXMgbm90IGltbWVkaWF0ZWx5IGJvdW5kIHRvIHRoZQotICogQmx1ZXRvb3RoSGVhZHNldCBzZXJ2aWNlLiBVc2UgdGhlIFNlcnZpY2VMaXN0ZW5lciBpbnRlcmZhY2UgdG8gb2J0YWluIGEKLSAqIG5vdGlmaWNhdGlvbiB3aGVuIGl0IGlzIGJvdW5kLCB0aGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGlmIHlvdSB3aXNoIHRvCi0gKiBpbW1lZGlhdGVseSBjYWxsIG1ldGhvZHMgb24gQmx1ZXRvb3RoSGVhZHNldCBhZnRlciBjb25zdHJ1Y3Rpb24uCi0gKgotICogQW5kcm9pZCBvbmx5IHN1cHBvcnRzIG9uZSBjb25uZWN0ZWQgQmx1ZXRvb3RoIEhlYWRzZXQgYXQgYSB0aW1lLgotICoKLSAqIEBoaWRlCisgKiA8cD4gQW5kcm9pZCBvbmx5IHN1cHBvcnRzIG9uZSBjb25uZWN0ZWQgQmx1ZXRvb3RoIEhlYWRzZXQgYXQgYSB0aW1lLgorICogRWFjaCBtZXRob2QgaXMgcHJvdGVjdGVkIHdpdGggaXRzIGFwcHJvcHJpYXRlIHBlcm1pc3Npb24uCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCbHVldG9vdGhIZWFkc2V0IHsKLQorcHVibGljIGZpbmFsIGNsYXNzIEJsdWV0b290aEhlYWRzZXQgaW1wbGVtZW50cyBCbHVldG9vdGhQcm9maWxlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aEhlYWRzZXQiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CiAKLSAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVEFURV9DSEFOR0VEID0KLSAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0LmFjdGlvbi5TVEFURV9DSEFOR0VEIjsKICAgICAvKioKLSAgICAgKiBUT0RPKEFQSSByZWxlYXNlKTogQ29uc2lkZXIgaW5jb3Jwb3JhdGluZyBhcyBuZXcgc3RhdGUgaW4KLSAgICAgKiBIRUFEU0VUX1NUQVRFX0NIQU5HRUQKKyAgICAgKiBJbnRlbnQgdXNlZCB0byBicm9hZGNhc3QgdGhlIGNoYW5nZSBpbiBjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSBIZWFkc2V0CisgICAgICogcHJvZmlsZS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgaW50ZW50IHdpbGwgaGF2ZSAzIGV4dHJhczoKKyAgICAgKiB7QGxpbmsgI0VYVFJBX1NUQVRFfSAtIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwcm9maWxlLgorICAgICAqIHtAbGluayAjRVhUUkFfUFJFVklPVVNfU1RBVEV9LSBUaGUgcHJldmlvdXMgc3RhdGUgb2YgdGhlIHByb2ZpbGUKKyAgICAgKiB7QGxpbmsgQmx1ZXRvb3RoRGV2aWNlI0VYVFJBX0RFVklDRX0gLSBUaGUgcmVtb3RlIGRldmljZS4KKyAgICAgKgorICAgICAqIHtAbGluayAjRVhUUkFfU1RBVEV9IG9yIHtAbGluayAjRVhUUkFfUFJFVklPVVNfU1RBVEV9IGNhbiBiZSBhbnkgb2YKKyAgICAgKiB7QGxpbmsgI1NUQVRFX0RJU0NPTk5FQ1RFRH0sIHtAbGluayAjU1RBVEVfQ09OTkVDVElOR30sCisgICAgICoge0BsaW5rICNTVEFURV9DT05ORUNURUR9LCB7QGxpbmsgI1NUQVRFX0RJU0NPTk5FQ1RJTkd9LgorICAgICAqCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEh9IHRvIHJlY2VpdmUuCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEID0KKyAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmhlYWRzZXQucHJvZmlsZS5hY3Rpb24uQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEIjsKKworICAgIC8qKgorICAgICAqIEludGVudCB1c2VkIHRvIGJyb2FkY2FzdCB0aGUgY2hhbmdlIGluIHRoZSBBdWRpbyBDb25uZWN0aW9uIHN0YXRlIG9mIHRoZQorICAgICAqIEEyRFAgcHJvZmlsZS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgaW50ZW50IHdpbGwgaGF2ZSAzIGV4dHJhczoKKyAgICAgKiB7QGxpbmsgI0VYVFJBX1NUQVRFfSAtIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwcm9maWxlLgorICAgICAqIHtAbGluayAjRVhUUkFfUFJFVklPVVNfU1RBVEV9LSBUaGUgcHJldmlvdXMgc3RhdGUgb2YgdGhlIHByb2ZpbGUKKyAgICAgKiB7QGxpbmsgQmx1ZXRvb3RoRGV2aWNlI0VYVFJBX0RFVklDRX0gLSBUaGUgcmVtb3RlIGRldmljZS4KKyAgICAgKgorICAgICAqIHtAbGluayAjRVhUUkFfU1RBVEV9IG9yIHtAbGluayAjRVhUUkFfUFJFVklPVVNfU1RBVEV9IGNhbiBiZSBhbnkgb2YKKyAgICAgKiB7QGxpbmsgI1NUQVRFX0FVRElPX0NPTk5FQ1RFRH0sIHtAbGluayAjU1RBVEVfQVVESU9fRElTQ09OTkVDVEVEfSwKKyAgICAgKgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIfSB0byByZWNlaXZlLgogICAgICAqLwogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04pCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0FVRElPX1NUQVRFX0NIQU5HRUQgPQotICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmhlYWRzZXQuYWN0aW9uLkFVRElPX1NUQVRFX0NIQU5HRUQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NUQVRFID0KLSAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0LmV4dHJhLlNUQVRFIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVWSU9VU19TVEFURSA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaGVhZHNldC5leHRyYS5QUkVWSU9VU19TVEFURSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfQVVESU9fU1RBVEUgPQotICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmhlYWRzZXQuZXh0cmEuQVVESU9fU1RBVEUiOworICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaGVhZHNldC5wcm9maWxlLmFjdGlvbi5BVURJT19TVEFURV9DSEFOR0VEIjsKIAotICAgIC8qKiBFeHRyYSB0byBiZSB1c2VkIHdpdGggdGhlIEhlYWRzZXQgU3RhdGUgY2hhbmdlIGludGVudC4KLSAgICAgKiBUaGlzIHdpbGwgYmUgdXNlZCBvbmx5IHdoZW4gSGVhZHNldCBzdGF0ZSBjaGFuZ2VzIHRvCi0gICAgICoge0BsaW5rICNTVEFURV9ESVNDT05ORUNURUR9IGZyb20gYW55IHByZXZpb3VzIHN0YXRlLgotICAgICAqIFRoaXMgZXh0cmEgZmllbGQgaXMgb3B0aW9uYWwgYW5kIHdpbGwgYmUgdXNlZCB3aGVuCi0gICAgICogd2UgaGF2ZSBkZXRlcm1pbmlzdGljIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB3aGV0aGVyCi0gICAgICogdGhlIGRpc2Nvbm5lY3Qgd2FzIGluaXRpYXRlZCBieSB0aGUgcmVtb3RlIGRldmljZSBvcgotICAgICAqIGJ5IHRoZSBsb2NhbCBhZGFwdGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0RJU0NPTk5FQ1RfSU5JVElBVE9SID0KLSAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0LmV4dHJhLkRJU0NPTk5FQ1RfSU5JVElBVE9SIjsKIAogICAgIC8qKgogICAgICAqIEJyb2FkY2FzdCBBY3Rpb246IEluZGljYXRlcyBhIGhlYWRzZXQgaGFzIHBvc3RlZCBhIHZlbmRvci1zcGVjaWZpYyBldmVudC4KQEAgLTkwLDYgKzk1LDcgQEAKICAgICAgKiB7QGxpbmsgI0VYVFJBX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0NNRH0sIGFuZAogICAgICAqIHtAbGluayAjRVhUUkFfVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlRfQVJHU30uCiAgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEh9IHRvIHJlY2VpdmUuCisgICAgICogQGhpZGUKICAgICAgKi8KICAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVCA9CkBAIC05OCw2ICsxMDQsNyBAQAogICAgIC8qKgogICAgICAqIEEgU3RyaW5nIGV4dHJhIGZpZWxkIGluIHtAbGluayAjQUNUSU9OX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UfQogICAgICAqIGludGVudHMgdGhhdCBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIGNvbW1hbmQuCisgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVF9DTUQgPQogICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmhlYWRzZXQuZXh0cmEuVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlRfQ01EIjsKQEAgLTEwOCw2ICsxMTUsNyBAQAogICAgICAqIGNvbW1hbmQuCiAgICAgICogQHNlZSA8YSBocmVmPSJodHRwczovL3d3dy5ibHVldG9vdGgub3JnL1RlY2huaWNhbC9Bc3NpZ25lZE51bWJlcnMvaWRlbnRpZmllcnMuaHRtIj4KICAgICAgKiBCbHVldG9vdGggU0lHIEFzc2lnbmVkIE51bWJlcnMgLSBDb21wYW55IElkZW50aWZpZXJzPC9hPgorICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlRfQ09NUEFOWV9JRCA9CiAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaGVhZHNldC5leHRyYS5WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVF9DT01QQU5ZX0lEIjsKQEAgLTExNiwxMDQgKzEyNCw1MiBAQAogICAgICAqIEEgUGFyY2VsYWJsZSBTdHJpbmcgYXJyYXkgZXh0cmEgZmllbGQgaW4KICAgICAgKiB7QGxpbmsgI0FDVElPTl9WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVH0gaW50ZW50cyB0aGF0IGNvbnRhaW5zCiAgICAgICogdGhlIGFyZ3VtZW50cyB0byB0aGUgdmVuZG9yLXNwZWNpZmljIGNvbW1hbmQuCisgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVF9BUkdTID0KICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0LmV4dHJhLlZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0FSR1MiOwogCisgICAgLyoKKyAgICAgKiBIZWFkc2V0IHN0YXRlIHdoZW4gU0NPIGF1ZGlvIGlzIGNvbm5lY3RlZAorICAgICAqIFRoaXMgc3RhdGUgY2FuIGJlIG9uZSBvZgorICAgICAqIHtAbGluayAjRVhUUkFfU1RBVEV9IG9yIHtAbGluayAjRVhUUkFfUFJFVklPVVNfU1RBVEV9IG9mCisgICAgICoge0BsaW5rICNBQ1RJT05fQVVESU9fU1RBVEVfQ0hBTkdFRH0gaW50ZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0FVRElPX0NPTk5FQ1RFRCA9IDEwOwogCiAgICAgLyoqCi0gICAgICogVE9ETyhBUEkgcmVsZWFzZSk6IENvbnNpZGVyIGluY29ycG9yYXRpbmcgYXMgbmV3IHN0YXRlIGluCi0gICAgICogSEVBRFNFVF9TVEFURV9DSEFOR0VECisgICAgICogSGVhZHNldCBzdGF0ZSB3aGVuIFNDTyBhdWRpbyBpcyBOT1QgY29ubmVjdGVkCisgICAgICogVGhpcyBzdGF0ZSBjYW4gYmUgb25lIG9mCisgICAgICoge0BsaW5rICNFWFRSQV9TVEFURX0gb3Ige0BsaW5rICNFWFRSQV9QUkVWSU9VU19TVEFURX0gb2YKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9BVURJT19TVEFURV9DSEFOR0VEfSBpbnRlbnQuCiAgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQVVESU9fRElTQ09OTkVDVEVEID0gMTE7CisKKworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIFNlcnZpY2VMaXN0ZW5lciBtU2VydmljZUxpc3RlbmVyOwogICAgIHByaXZhdGUgSUJsdWV0b290aEhlYWRzZXQgbVNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgU2VydmljZUxpc3RlbmVyIG1TZXJ2aWNlTGlzdGVuZXI7Ci0KLSAgICAvKiogVGhlcmUgd2FzIGFuIGVycm9yIHRyeWluZyB0byBvYnRhaW4gdGhlIHN0YXRlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRVJST1IgICAgICAgID0gLTE7Ci0gICAgLyoqIE5vIGhlYWRzZXQgY3VycmVudGx5IGNvbm5lY3RlZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RFRCA9IDA7Ci0gICAgLyoqIENvbm5lY3Rpb24gYXR0ZW1wdCBpbiBwcm9ncmVzcyAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RJTkcgICA9IDE7Ci0gICAgLyoqIEEgaGVhZHNldCBpcyBjdXJyZW50bHkgY29ubmVjdGVkICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVEVEICAgID0gMjsKLQotICAgIC8qKiBBIFNDTyBhdWRpbyBjaGFubmVsIGlzIG5vdCBlc3RhYmxpc2hlZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVRElPX1NUQVRFX0RJU0NPTk5FQ1RFRCA9IDA7Ci0gICAgLyoqIEEgU0NPIGF1ZGlvIGNoYW5uZWwgaXMgZXN0YWJsaXNoZWQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVURJT19TVEFURV9DT05ORUNURUQgPSAxOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX0ZBSUxVUkUgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9TVUNDRVNTID0gMTsKLSAgICAvKiogQ29ubmVjdGlvbiBjYW5jZWxlZCBiZWZvcmUgY29tcGxldGlvbi4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNVTFRfQ0FOQ0VMRUQgPSAyOwotCi0gICAgLyoqIFZhbHVlcyBmb3Ige0BsaW5rICNFWFRSQV9ESVNDT05ORUNUX0lOSVRJQVRPUn0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVEVfRElTQ09OTkVDVCA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxfRElTQ09OTkVDVCA9IDE7Ci0KLQotICAgIC8qKiBEZWZhdWx0IHByaW9yaXR5IGZvciBoZWFkc2V0cyBmb3Igd2hpY2ggd2Ugd2lsbCBhY2NlcHQKLSAgICAgKiBpbmNvbWluZyBjb25uZWN0aW9ucyBhbmQgYXV0by1jb25uZWN0LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX0FVVE9fQ09OTkVDVCA9IDEwMDA7Ci0gICAgLyoqIERlZmF1bHQgcHJpb3JpdHkgZm9yIGhlYWRzZXRzIGZvciB3aGljaCB3ZSB3aWxsIGFjY2VwdAotICAgICAqIGluY29taW5nIGNvbm5lY3Rpb25zIGJ1dCBub3QgYXV0by1jb25uZWN0LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX09OID0gMTAwOwotICAgIC8qKiBEZWZhdWx0IHByaW9yaXR5IGZvciBoZWFkc2V0cyB0aGF0IHNob3VsZCBub3QgYmUgYXV0by1jb25uZWN0ZWQKLSAgICAgKiBhbmQgbm90IGFsbG93IGluY29taW5nIGNvbm5lY3Rpb25zLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX09GRiA9IDA7Ci0gICAgLyoqIERlZmF1bHQgcHJpb3JpdHkgd2hlbiBub3Qgc2V0IG9yIHdoZW4gdGhlIGRldmljZSBpcyB1bnBhaXJlZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX1VOREVGSU5FRCA9IC0xOwotCi0gICAgLyoqCi0gICAgICogQW4gaW50ZXJmYWNlIGZvciBub3RpZnlpbmcgQmx1ZXRvb3RoSGVhZHNldCBJUEMgY2xpZW50cyB3aGVuIHRoZXkgaGF2ZQotICAgICAqIGJlZW4gY29ubmVjdGVkIHRvIHRoZSBCbHVldG9vdGhIZWFkc2V0IHNlcnZpY2UuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBTZXJ2aWNlTGlzdGVuZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHRvIG5vdGlmeSB0aGUgY2xpZW50IHdoZW4gdGhpcyBwcm94eSBvYmplY3QgaGFzIGJlZW4KLSAgICAgICAgICogY29ubmVjdGVkIHRvIHRoZSBCbHVldG9vdGhIZWFkc2V0IHNlcnZpY2UuIENsaWVudHMgbXVzdCB3YWl0IGZvcgotICAgICAgICAgKiB0aGlzIGNhbGxiYWNrIGJlZm9yZSBtYWtpbmcgSVBDIGNhbGxzIG9uIHRoZSBCbHVldG9vdGhIZWFkc2V0Ci0gICAgICAgICAqIHNlcnZpY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHRvIG5vdGlmeSB0aGUgY2xpZW50IHRoYXQgdGhpcyBwcm94eSBvYmplY3QgaGFzIGJlZW4KLSAgICAgICAgICogZGlzY29ubmVjdGVkIGZyb20gdGhlIEJsdWV0b290aEhlYWRzZXQgc2VydmljZS4gQ2xpZW50cyBtdXN0IG5vdAotICAgICAgICAgKiBtYWtlIElQQyBjYWxscyBvbiB0aGUgQmx1ZXRvb3RoSGVhZHNldCBzZXJ2aWNlIGFmdGVyIHRoaXMgY2FsbGJhY2suCi0gICAgICAgICAqIFRoaXMgY2FsbGJhY2sgd2lsbCBjdXJyZW50bHkgb25seSBvY2N1ciBpZiB0aGUgYXBwbGljYXRpb24gaG9zdGluZwotICAgICAgICAgKiB0aGUgQmx1ZXRvb3RoSGVhZHNldCBzZXJ2aWNlLCBidXQgbWF5IGJlIGNhbGxlZCBtb3JlIG9mdGVuIGluIGZ1dHVyZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZCgpOwotICAgIH0KKyAgICBCbHVldG9vdGhBZGFwdGVyIG1BZGFwdGVyOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgQmx1ZXRvb3RoSGVhZHNldCBwcm94eSBvYmplY3QuCiAgICAgICovCi0gICAgcHVibGljIEJsdWV0b290aEhlYWRzZXQoQ29udGV4dCBjb250ZXh0LCBTZXJ2aWNlTGlzdGVuZXIgbCkgeworICAgIC8qcGFja2FnZSovIEJsdWV0b290aEhlYWRzZXQoQ29udGV4dCBjb250ZXh0LCBTZXJ2aWNlTGlzdGVuZXIgbCkgewogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1TZXJ2aWNlTGlzdGVuZXIgPSBsOworICAgICAgICBtQWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKICAgICAgICAgaWYgKCFjb250ZXh0LmJpbmRTZXJ2aWNlKG5ldyBJbnRlbnQoSUJsdWV0b290aEhlYWRzZXQuY2xhc3MuZ2V0TmFtZSgpKSwgbUNvbm5lY3Rpb24sIDApKSB7CiAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3QgYmluZCB0byBCbHVldG9vdGggSGVhZHNldCBTZXJ2aWNlIik7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBDbG9zZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgYmFja2luZyBzZXJ2aWNlLgogICAgICAqIE90aGVyIHB1YmxpYyBmdW5jdGlvbnMgb2YgQmx1ZXRvb3RoSGVhZHNldCB3aWxsIHJldHVybiBkZWZhdWx0IGVycm9yCiAgICAgICogcmVzdWx0cyBvbmNlIGNsb3NlKCkgaGFzIGJlZW4gY2FsbGVkLiBNdWx0aXBsZSBpbnZvY2F0aW9ucyBvZiBjbG9zZSgpCiAgICAgICogYXJlIG9rLgogICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpIHsKKyAgICAvKnBhY2thZ2UqLyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpIHsKICAgICAgICAgaWYgKERCRykgbG9nKCJjbG9zZSgpIik7CiAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7CiAgICAgICAgICAgICBtQ29udGV4dC51bmJpbmRTZXJ2aWNlKG1Db25uZWN0aW9uKTsKQEAgLTIyMiwxOTAgKzE3OCwyMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIEJsdWV0b290aCBIZWFkc2V0IHNlcnZpY2UuCi0gICAgICogQHJldHVybiBPbmUgb2YgdGhlIFNUQVRFXyByZXR1cm4gY29kZXMsIG9yIFNUQVRFX0VSUk9SIGlmIHRoaXMgcHJveHkKLSAgICAgKiAgICAgICAgIG9iamVjdCBpcyBjdXJyZW50bHkgbm90IGNvbm5lY3RlZCB0byB0aGUgSGVhZHNldCBzZXJ2aWNlLgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpZiAoREJHKSBsb2coImdldFN0YXRlKCkiKTsKLSAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0KCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCAmJiBpc0VuYWJsZWQoKSAmJgorICAgICAgICAgICAgaXNWYWxpZERldmljZShkZXZpY2UpKSB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRTdGF0ZShkZXZpY2UpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHtMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7fQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKLSAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmNvbm5lY3QoZGV2aWNlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRVJST1I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBCbHVldG9vdGhEZXZpY2UgZm9yIHRoZSBjdXJyZW50IGhlYWRzZXQuCi0gICAgICogQHJldHVybiBjdXJyZW50IGhlYWRzZXQsIG9yIG51bGwgaWYgbm90IGluIGNvbm5lY3RlZCBvciBjb25uZWN0aW5nCi0gICAgICogICAgICAgICBzdGF0ZSwgb3IgaWYgdGhpcyBwcm94eSBvYmplY3QgaXMgbm90IGNvbm5lY3RlZCB0byB0aGUgSGVhZHNldAotICAgICAqICAgICAgICAgc2VydmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQmx1ZXRvb3RoRGV2aWNlIGdldEN1cnJlbnRIZWFkc2V0KCkgewotICAgICAgICBpZiAoREJHKSBsb2coImdldEN1cnJlbnRIZWFkc2V0KCkiKTsKLSAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldEN1cnJlbnRIZWFkc2V0KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkge0xvZy5lKFRBRywgZS50b1N0cmluZygpKTt9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOwotICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXF1ZXN0IHRvIGluaXRpYXRlIGEgY29ubmVjdGlvbiB0byBhIGhlYWRzZXQuCi0gICAgICogVGhpcyBjYWxsIGRvZXMgbm90IGJsb2NrLiBGYWlscyBpZiBhIGhlYWRzZXQgaXMgYWxyZWFkeSBjb25uZWN0aW5nCi0gICAgICogb3IgY29ubmVjdGVkLgotICAgICAqIEluaXRpYXRlcyBhdXRvLWNvbm5lY3Rpb24gaWYgZGV2aWNlIGlzIG51bGwuIFRyaWVzIHRvIGNvbm5lY3QgdG8gYWxsCi0gICAgICogZGV2aWNlcyB3aXRoIHByaW9yaXR5IGdyZWF0ZXIgdGhhbiBQUklPUklUWV9BVVRPIGluIGRlc2NlbmRpbmcgb3JkZXIuCi0gICAgICogQHBhcmFtIGRldmljZSBkZXZpY2UgdG8gY29ubmVjdCB0bywgb3IgbnVsbCB0byBhdXRvLWNvbm5lY3QgbGFzdCBjb25uZWN0ZWQKLSAgICAgKiAgICAgICAgICAgICAgIGhlYWRzZXQKLSAgICAgKiBAcmV0dXJuICAgICAgIGZhbHNlIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gaW5pdGlhdGluZyB0aGUgY29ubmVjdGlvbgotICAgICAqICAgICAgICAgICAgICAgcHJvY2VkdXJlLCBhbmQgbm8gZnVydGhlciBIRUFEU0VUX1NUQVRFX0NIQU5HRUQgaW50ZW50cwotICAgICAqICAgICAgICAgICAgICAgd2lsbCBiZSBleHBlY3RlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0SGVhZHNldChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGlmIChEQkcpIGxvZygiY29ubmVjdEhlYWRzZXQoIiArIGRldmljZSArICIpIik7Ci0gICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChtU2VydmljZS5jb25uZWN0SGVhZHNldChkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7TG9nLmUoVEFHLCBlLnRvU3RyaW5nKCkpO30KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7Ci0gICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOwotICAgICAgICB9CisgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaGVhZHNldCBpcyBjb25uZWN0ZWQgKGRvZXMgbm90IGluY2x1ZGUKLSAgICAgKiBjb25uZWN0aW5nKS4gUmV0dXJucyBmYWxzZSBpZiBub3QgY29ubmVjdGVkLCBvciBpZiB0aGlzIHByb3h5IG9iamVjdAotICAgICAqIGlmIG5vdCBjdXJyZW50bHkgY29ubmVjdGVkIHRvIHRoZSBoZWFkc2V0IHNlcnZpY2UuCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpZiAoREJHKSBsb2coImlzQ29ubmVjdGVkKCIgKyBkZXZpY2UgKyAiKSIpOwotICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImRpc2Nvbm5lY3QoIiArIGRldmljZSArICIpIik7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsICYmIGlzRW5hYmxlZCgpICYmCisgICAgICAgICAgICBpc1ZhbGlkRGV2aWNlKGRldmljZSkpIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmlzQ29ubmVjdGVkKGRldmljZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkge0xvZy5lKFRBRywgZS50b1N0cmluZygpKTt9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOwotICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZGlzY29ubmVjdChkZXZpY2UpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgTG9nLmUoVEFHLCBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGlzY29ubmVjdHMgdGhlIGN1cnJlbnQgaGVhZHNldC4gQ3VycmVudGx5IHRoaXMgY2FsbCBibG9ja3MsIGl0IG1heSBzb29uCi0gICAgICogYmUgbWFkZSBhc3luY2hyb25vdXMuIFJldHVybnMgZmFsc2UgaWYgdGhpcyBwcm94eSBvYmplY3QgaXMKLSAgICAgKiBub3QgY3VycmVudGx5IGNvbm5lY3RlZCB0byB0aGUgSGVhZHNldCBzZXJ2aWNlLgorICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0SGVhZHNldChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGlmIChEQkcpIGxvZygiZGlzY29ubmVjdEhlYWRzZXQoKSIpOwotICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgIHB1YmxpYyBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBnZXRDb25uZWN0ZWREZXZpY2VzKCkgeworICAgICAgICBpZiAoREJHKSBsb2coImdldENvbm5lY3RlZERldmljZXMoKSIpOworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCAmJiBpc0VuYWJsZWQoKSkgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2VydmljZS5kaXNjb25uZWN0SGVhZHNldChkZXZpY2UpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHtMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7fQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKLSAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvRGV2aWNlU2V0KG1TZXJ2aWNlLmdldENvbm5lY3RlZERldmljZXMoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvRGV2aWNlU2V0KG5ldyBCbHVldG9vdGhEZXZpY2VbMF0pOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiB0b0RldmljZVNldChuZXcgQmx1ZXRvb3RoRGV2aWNlWzBdKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTdGFydCBCVCBWb2ljZSBSZWNvZ25pdGlvbiBtb2RlLCBhbmQgc2V0IHVwIEJsdWV0b290aCBhdWRpbyBwYXRoLgotICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhlcmUgaXMgbm8gaGVhZHNldCBjb25uZWN0ZWQsIG9yIGlmIHRoZQotICAgICAqIGNvbm5lY3RlZCBoZWFkc2V0IGRvZXMgbm90IHN1cHBvcnQgdm9pY2UgcmVjb2duaXRpb24sIG9yIG9uCi0gICAgICogZXJyb3IuCisgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0Vm9pY2VSZWNvZ25pdGlvbigpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJzdGFydFZvaWNlUmVjb2duaXRpb24oKSIpOwotICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgIHB1YmxpYyBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBnZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzKGludFtdIHN0YXRlcykgeworICAgICAgICBpZiAoREJHKSBsb2coImdldERldmljZXNNYXRjaGluZ1N0YXRlcygpIik7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsICYmIGlzRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5zdGFydFZvaWNlUmVjb2duaXRpb24oKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7TG9nLmUoVEFHLCBlLnRvU3RyaW5nKCkpO30KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7Ci0gICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOworICAgICAgICAgICAgICAgIHJldHVybiB0b0RldmljZVNldChtU2VydmljZS5nZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzKHN0YXRlcykpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKG5ldyBUaHJvd2FibGUoKSkpOworICAgICAgICAgICAgICAgIHJldHVybiB0b0RldmljZVNldChuZXcgQmx1ZXRvb3RoRGV2aWNlWzBdKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOworICAgICAgICByZXR1cm4gdG9EZXZpY2VTZXQobmV3IEJsdWV0b290aERldmljZVswXSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU3RvcCBCVCBWb2ljZSBSZWNvZ25pdGlvbiBtb2RlLCBhbmQgc2h1dCBkb3duIEJsdWV0b290aCBhdWRpbyBwYXRoLgotICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhlcmUgaXMgbm8gaGVhZHNldCBjb25uZWN0ZWQsIG9yIHRoZSBjb25uZWN0ZWQKLSAgICAgKiBoZWFkc2V0IGlzIG5vdCBpbiB2b2ljZSByZWNvZ25pdGlvbiBtb2RlLCBvciBvbiBlcnJvci4KKyAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3RvcFZvaWNlUmVjb2duaXRpb24oKSB7Ci0gICAgICAgIGlmIChEQkcpIGxvZygic3RvcFZvaWNlUmVjb2duaXRpb24oKSIpOwotICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgIHB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJnZXRDb25uZWN0aW9uU3RhdGUoIiArIGRldmljZSArICIpIik7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsICYmIGlzRW5hYmxlZCgpICYmCisgICAgICAgICAgICBpc1ZhbGlkRGV2aWNlKGRldmljZSkpIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnN0b3BWb2ljZVJlY29nbml0aW9uKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkge0xvZy5lKFRBRywgZS50b1N0cmluZygpKTt9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOwotICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgcHJpb3JpdHkgb2YgaGVhZHNldC4KLSAgICAgKiBQcmlvcml0eSBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLiBCeSBkZWZhdWx0IHBhaXJlZCBoZWFkc2V0cyB3aWxsIGhhdmUKLSAgICAgKiBhIHByaW9yaXR5IG9mIFBSSU9SSVRZX0FVVE8sIGFuZCB1bnBhaXJlZCBoZWFkc2V0IFBSSU9SSVRZX05PTkUgKDApLgotICAgICAqIEhlYWRzZXRzIHdpdGggcHJpb3JpdHkgZ3JlYXRlciB0aGFuIHplcm8gd2lsbCBiZSBhdXRvLWNvbm5lY3RlZCwgYW5kCi0gICAgICogaW5jb21pbmcgY29ubmVjdGlvbnMgd2lsbCBiZSBhY2NlcHRlZCAoaWYgbm8gb3RoZXIgaGVhZHNldCBpcwotICAgICAqIGNvbm5lY3RlZCkuCi0gICAgICogQXV0by1jb25uZWN0aW9uIG9jY3VycyBhdCB0aGUgZm9sbG93aW5nIGV2ZW50czogYm9vdCwgaW5jb21pbmcgcGhvbmUKLSAgICAgKiBjYWxsLCBvdXRnb2luZyBwaG9uZSBjYWxsLgotICAgICAqIEhlYWRzZXRzIHdpdGggcHJpb3JpdHkgZXF1YWwgdG8gemVybywgb3IgdGhhdCBhcmUgdW5wYWlyZWQsIGFyZSBub3QKLSAgICAgKiBhdXRvLWNvbm5lY3RlZC4KLSAgICAgKiBJbmNvbWluZyBjb25uZWN0aW9ucyBhcmUgaWdub3JlZCByZWdhcmRsZXNzIG9mIHByaW9yaXR5IGlmIHRoZXJlIGlzCi0gICAgICogYWxyZWFkeSBhIGhlYWRzZXQgY29ubmVjdGVkLgotICAgICAqIEBwYXJhbSBkZXZpY2UgcGFpcmVkIGhlYWRzZXQKLSAgICAgKiBAcGFyYW0gcHJpb3JpdHkgSW50ZWdlciBwcmlvcml0eSwgZm9yIGV4YW1wbGUgUFJJT1JJVFlfQVVUTyBvcgotICAgICAqICAgICAgICAgICAgICAgICBQUklPUklUWV9OT05FCi0gICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIGlmIHRoZXJlIHdhcyBzb21lIGVycm9yCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc2V0UHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByaW9yaXR5KSB7CiAgICAgICAgIGlmIChEQkcpIGxvZygic2V0UHJpb3JpdHkoIiArIGRldmljZSArICIsICIgKyBwcmlvcml0eSArICIpIik7Ci0gICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsICYmIGlzRW5hYmxlZCgpICYmCisgICAgICAgICAgICBpc1ZhbGlkRGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgIGlmIChwcmlvcml0eSAhPSBCbHVldG9vdGhQcm9maWxlLlBSSU9SSVRZX09GRiAmJgorICAgICAgICAgICAgICAgIHByaW9yaXR5ICE9IEJsdWV0b290aFByb2ZpbGUuUFJJT1JJVFlfT04pIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2Uuc2V0UHJpb3JpdHkoZGV2aWNlLCBwcmlvcml0eSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkge0xvZy5lKFRBRywgZS50b1N0cmluZygpKTt9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOwotICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgcHJpb3JpdHkgb2YgaGVhZHNldC4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIGhlYWRzZXQKLSAgICAgKiBAcmV0dXJuIG5vbi1uZWdhdGl2ZSBwcmlvcml0eSwgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBlcnJvcgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewogICAgICAgICBpZiAoREJHKSBsb2coImdldFByaW9yaXR5KCIgKyBkZXZpY2UgKyAiKSIpOwotICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCAmJiBpc0VuYWJsZWQoKSAmJgorICAgICAgICAgICAgaXNWYWxpZERldmljZShkZXZpY2UpKSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQcmlvcml0eShkZXZpY2UpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHtMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7fQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKLSAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBSSU9SSVRZX09GRjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChtU2VydmljZSA9PSBudWxsKSBMb2cudyhUQUcsICJQcm94eSBub3QgYXR0YWNoZWQgdG8gc2VydmljZSIpOworICAgICAgICByZXR1cm4gUFJJT1JJVFlfT0ZGOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IEJsdWV0b290aCB2b2ljZSByZWNvZ25pdGlvbi4gVGhpcyBtZXRob2RzIHNlbmRzIHRoZSB2b2ljZQorICAgICAqIHJlY29nbml0aW9uIEFUIGNvbW1hbmQgdG8gdGhlIGhlYWRzZXQgYW5kIGVzdGFibGlzaGVzIHRoZQorICAgICAqIGF1ZGlvIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiA8cD4gVXNlcnMgY2FuIGxpc3RlbiB0byB7QGxpbmsgI0FDVElPTl9BVURJT19TVEFURV9DSEFOR0VEfS4KKyAgICAgKiB7QGxpbmsgI0VYVFJBX1NUQVRFfSB3aWxsIGJlIHNldCB0byB7QGxpbmsgI1NUQVRFX0FVRElPX0NPTk5FQ1RFRH0KKyAgICAgKiB3aGVuIHRoZSBhdWRpbyBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLgorICAgICAqCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEh9CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIEJsdWV0b290aCBoZWFkc2V0CisgICAgICogQHJldHVybiBmYWxzZSBpZiB0aGVyZSBpcyBubyBoZWFkc2V0IGNvbm5lY3RlZCBvZiBpZiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgIGNvbm5lY3RlZCBoZWFkc2V0IGRvZXNuJ3Qgc3VwcG9ydCB2b2ljZSByZWNvZ25pdGlvbgorICAgICAqICAgICAgICAgICAgICAgb3Igb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3RhcnRWb2ljZVJlY29nbml0aW9uKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJzdGFydFZvaWNlUmVjb2duaXRpb24oKSIpOworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCAmJiBpc0VuYWJsZWQoKSAmJgorICAgICAgICAgICAgaXNWYWxpZERldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5zdGFydFZvaWNlUmVjb2duaXRpb24oZGV2aWNlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wIEJsdWV0b290aCBWb2ljZSBSZWNvZ25pdGlvbiBtb2RlLCBhbmQgc2h1dCBkb3duIHRoZQorICAgICAqIEJsdWV0b290aCBhdWRpbyBwYXRoLgorICAgICAqCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEh9CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIEJsdWV0b290aCBoZWFkc2V0CisgICAgICogQHJldHVybiBmYWxzZSBpZiB0aGVyZSBpcyBubyBoZWFkc2V0IGNvbm5lY3RlZAorICAgICAqICAgICAgICAgICAgICAgb3Igb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3RvcFZvaWNlUmVjb2duaXRpb24oQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coInN0b3BWb2ljZVJlY29nbml0aW9uKCkiKTsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkgJiYKKyAgICAgICAgICAgIGlzVmFsaWREZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2Uuc3RvcFZvaWNlUmVjb2duaXRpb24oZGV2aWNlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBCbHVldG9vdGggU0NPIGF1ZGlvIGlzIGNvbm5lY3RlZC4KKyAgICAgKgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIfQorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBCbHVldG9vdGggaGVhZHNldAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBTQ08gaXMgY29ubmVjdGVkLAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlIG9yIG9uIGVycm9yCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBdWRpb0Nvbm5lY3RlZChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiaXNBdWRpb0Nvbm5lY3RlZCgpIik7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsICYmIGlzRW5hYmxlZCgpICYmCisgICAgICAgICAgICBpc1ZhbGlkRGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5pc0F1ZGlvQ29ubmVjdGVkKGRldmljZSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICBMb2cuZShUQUcsICBMb2cuZ2V0U3RhY2tUcmFjZVN0cmluZyhuZXcgVGhyb3dhYmxlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobVNlcnZpY2UgPT0gbnVsbCkgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDE2LDI0ICszOTQsMjkgQEAKICAgICAgKiBib290LiBUaGlzIGlzIGEgZ29vZCBpbmRpY2F0b3IgZm9yIHNwYW1teSBoZWFkc2V0L2hhbmRzZnJlZSB1bml0cyB0aGF0CiAgICAgICogY2FuIGtlZXAgdGhlIGRldmljZSBhd2FrZSBieSBwb2xsaW5nIGZvciBjZWxsdWxhciBzdGF0dXMgdXBkYXRlcy4gQXMgYQogICAgICAqIHJ1bGUgb2YgdGh1bWIsIGVhY2ggQVQgY29tbWFuZCBwcmV2ZW50cyB0aGUgQ1BVIGZyb20gc2xlZXBpbmcgZm9yIDUwMCBtcworICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSB0aGUgYmx1ZXRvb3RoIGhlYWRzZXQuCiAgICAgICogQHJldHVybiBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgYmF0dGVyeSB1c2FnZSBoaW50LCBvciBhIG5lZ2F0aXZlIGVycm9yCiAgICAgICogICAgICAgICBjb2RlIG9uIGVycm9yCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEJhdHRlcnlVc2FnZUhpbnQoKSB7CisgICAgcHVibGljIGludCBnZXRCYXR0ZXJ5VXNhZ2VIaW50KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKICAgICAgICAgaWYgKERCRykgbG9nKCJnZXRCYXR0ZXJ5VXNhZ2VIaW50KCkiKTsKLSAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkgJiYKKyAgICAgICAgICAgIGlzVmFsaWREZXZpY2UoZGV2aWNlKSkgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0QmF0dGVyeVVzYWdlSGludCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHtMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7fQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKLSAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldEJhdHRlcnlVc2FnZUhpbnQoZGV2aWNlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGwpIExvZy53KFRBRywgIlByb3h5IG5vdCBhdHRhY2hlZCB0byBzZXJ2aWNlIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CisKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgaWYgY3VycmVudCBwbGF0Zm9ybSBzdXBwb3J0cyB2b2ljZSBkaWFsaW5nIG92ZXIgYmx1ZXRvb3RoIFNDTy4KKyAgICAgKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB2b2ljZSBkaWFsaW5nIG92ZXIgYmx1ZXRvb3RoIGlzIHN1cHBvcnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC00NDQsMTEgKzQyNywxMyBAQAogCiAgICAgLyoqCiAgICAgICogQ2FuY2VsIHRoZSBvdXRnb2luZyBjb25uZWN0aW9uLgorICAgICAqIE5vdGU6IFRoaXMgaXMgYW4gaW50ZXJuYWwgZnVuY3Rpb24gYW5kIHNob3VsZG4ndCBiZSBleHBvc2VkCisgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNhbmNlbENvbm5lY3RUaHJlYWQoKSB7CiAgICAgICAgIGlmIChEQkcpIGxvZygiY2FuY2VsQ29ubmVjdFRocmVhZCIpOwotICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCAmJiBpc0VuYWJsZWQoKSkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuY2FuY2VsQ29ubmVjdFRocmVhZCgpOwogICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHtMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7fQpAQCAtNDYxLDExICs0NDYsMTMgQEAKIAogICAgIC8qKgogICAgICAqIEFjY2VwdCB0aGUgaW5jb21pbmcgY29ubmVjdGlvbi4KKyAgICAgKiBOb3RlOiBUaGlzIGlzIGFuIGludGVybmFsIGZ1bmN0aW9uIGFuZCBzaG91bGRuJ3QgYmUgZXhwb3NlZAorICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRJbmNvbWluZ0Nvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewogICAgICAgICBpZiAoREJHKSBsb2coImFjY2VwdEluY29taW5nQ29ubmVjdCIpOwotICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCAmJiBpc0VuYWJsZWQoKSkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuYWNjZXB0SW5jb21pbmdDb25uZWN0KGRldmljZSk7CiAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkge0xvZy5lKFRBRywgZS50b1N0cmluZygpKTt9CkBAIC00NzcsMTIgKzQ2NCwxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgY29ubmVjdCB0aHJlYWQgdGhlIGluY29taW5nIGNvbm5lY3Rpb24uCisgICAgICogQ3JlYXRlIHRoZSBjb25uZWN0IHRocmVhZCBmb3IgdGhlIGluY29taW5nIGNvbm5lY3Rpb24uCisgICAgICogTm90ZTogVGhpcyBpcyBhbiBpbnRlcm5hbCBmdW5jdGlvbiBhbmQgc2hvdWxkbid0IGJlIGV4cG9zZWQKKyAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY3JlYXRlSW5jb21pbmdDb25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKICAgICAgICAgaWYgKERCRykgbG9nKCJjcmVhdGVJbmNvbWluZ0Nvbm5lY3QiKTsKLSAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwgJiYgaXNFbmFibGVkKCkpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmNyZWF0ZUluY29taW5nQ29ubmVjdChkZXZpY2UpOwogICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHtMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7fQpAQCAtNDk2LDExICs0ODUsMTIgQEAKICAgICAvKioKICAgICAgKiBDb25uZWN0IHRvIGEgQmx1ZXRvb3RoIEhlYWRzZXQuCiAgICAgICogTm90ZTogVGhpcyBpcyBhbiBpbnRlcm5hbCBmdW5jdGlvbiBhbmQgc2hvdWxkbid0IGJlIGV4cG9zZWQKKyAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY29ubmVjdEhlYWRzZXRJbnRlcm5hbChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CiAgICAgICAgIGlmIChEQkcpIGxvZygiY29ubmVjdEhlYWRzZXRJbnRlcm5hbCIpOwotICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCAmJiBpc0VuYWJsZWQoKSkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuY29ubmVjdEhlYWRzZXRJbnRlcm5hbChkZXZpY2UpOwogICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHtMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7fQpAQCAtNTE0LDExICs1MDQsMTIgQEAKICAgICAvKioKICAgICAgKiBEaXNjb25uZWN0IGEgQmx1ZXRvb3RoIEhlYWRzZXQuCiAgICAgICogTm90ZTogVGhpcyBpcyBhbiBpbnRlcm5hbCBmdW5jdGlvbiBhbmQgc2hvdWxkbid0IGJlIGV4cG9zZWQKKyAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdEhlYWRzZXRJbnRlcm5hbChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CiAgICAgICAgIGlmIChEQkcpIGxvZygiZGlzY29ubmVjdEhlYWRzZXRJbnRlcm5hbCIpOwotICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCAmJiBpc0VuYWJsZWQoKSkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmRpc2Nvbm5lY3RIZWFkc2V0SW50ZXJuYWwoZGV2aWNlKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7TG9nLmUoVEFHLCBlLnRvU3RyaW5nKCkpO30KQEAgLTUyOCwyMyArNTE5LDYxIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXVkaW8gc3RhdGUgb2YgdGhlIEhlYWRzZXQuCisgICAgICogTm90ZTogVGhpcyBpcyBhbiBpbnRlcm5hbCBmdW5jdGlvbiBhbmQgc2hvdWxkbid0IGJlIGV4cG9zZWQKKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2V0QXVkaW9TdGF0ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgc3RhdGUpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJzZXRBdWRpb1N0YXRlIik7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsICYmIGlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5zZXRBdWRpb1N0YXRlKGRldmljZSwgc3RhdGUpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHtMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7fQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiUHJveHkgbm90IGF0dGFjaGVkIHRvIHNlcnZpY2UiKTsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcobmV3IFRocm93YWJsZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIHByaXZhdGUgU2VydmljZUNvbm5lY3Rpb24gbUNvbm5lY3Rpb24gPSBuZXcgU2VydmljZUNvbm5lY3Rpb24oKSB7CiAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChDb21wb25lbnROYW1lIGNsYXNzTmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7CiAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJQcm94eSBvYmplY3QgY29ubmVjdGVkIik7CiAgICAgICAgICAgICBtU2VydmljZSA9IElCbHVldG9vdGhIZWFkc2V0LlN0dWIuYXNJbnRlcmZhY2Uoc2VydmljZSk7CisKICAgICAgICAgICAgIGlmIChtU2VydmljZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VydmljZUxpc3RlbmVyLm9uU2VydmljZUNvbm5lY3RlZCgpOworICAgICAgICAgICAgICAgIG1TZXJ2aWNlTGlzdGVuZXIub25TZXJ2aWNlQ29ubmVjdGVkKEJsdWV0b290aFByb2ZpbGUuSEVBRFNFVCwgQmx1ZXRvb3RoSGVhZHNldC50aGlzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBjbGFzc05hbWUpIHsKICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIlByb3h5IG9iamVjdCBkaXNjb25uZWN0ZWQiKTsKICAgICAgICAgICAgIG1TZXJ2aWNlID0gbnVsbDsKICAgICAgICAgICAgIGlmIChtU2VydmljZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VydmljZUxpc3RlbmVyLm9uU2VydmljZURpc2Nvbm5lY3RlZCgpOworICAgICAgICAgICAgICAgIG1TZXJ2aWNlTGlzdGVuZXIub25TZXJ2aWNlRGlzY29ubmVjdGVkKEJsdWV0b290aFByb2ZpbGUuSEVBRFNFVCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9OwogCisgICAgcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZCgpIHsKKyAgICAgICBpZiAobUFkYXB0ZXIuZ2V0U3RhdGUoKSA9PSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09OKSByZXR1cm4gdHJ1ZTsKKyAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWREZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCisgICAgICAgaWYgKEJsdWV0b290aEFkYXB0ZXIuY2hlY2tCbHVldG9vdGhBZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiB0b0RldmljZVNldChCbHVldG9vdGhEZXZpY2VbXSBkZXZpY2VzKSB7CisgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCgKKyAgICAgICAgICBuZXcgSGFzaFNldDxCbHVldG9vdGhEZXZpY2U+KEFycmF5cy5hc0xpc3QoZGV2aWNlcykpKTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7CiAgICAgICAgIExvZy5kKFRBRywgbXNnKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSW5wdXREZXZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhJbnB1dERldmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OTM4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSW5wdXREZXZpY2UuamF2YQpAQCAtMCwwICsxLDI0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQ7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50LlNka0NvbnN0YW50VHlwZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBQdWJsaWMgQVBJIGZvciBjb250cm9sbGluZyB0aGUgQmx1ZXRvb3RoIEhJRCAoSW5wdXQgRGV2aWNlKSBQcm9maWxlCisgKgorICogQmx1ZXRvb3RoSW5wdXREZXZpY2UgaXMgYSBwcm94eSBvYmplY3QgdXNlZCB0byBtYWtlIGNhbGxzIHRvIEJsdWV0b290aCBTZXJ2aWNlCisgKiB3aGljaCBoYW5kbGVzIHRoZSBISUQgcHJvZmlsZS4KKyAqCisgKiBDcmVhdGluZyBhIEJsdWV0b290aElucHV0RGV2aWNlIG9iamVjdCB3aWxsIGluaXRpYXRlIGEgYmluZGluZyB3aXRoIHRoZQorICogQmx1ZXRvb3RoIHNlcnZpY2UuIFVzZXJzIG9mIHRoaXMgb2JqZWN0IHNob3VsZCBjYWxsIGNsb3NlKCkgd2hlbiB0aGV5CisgKiBhcmUgZmluaXNoZWQsIHNvIHRoYXQgdGhpcyBwcm94eSBvYmplY3QgY2FuIHVuYmluZCBmcm9tIHRoZSBzZXJ2aWNlLgorICoKKyAqIEN1cnJlbnRseSB0aGUgQmx1ZXRvb3RoIHNlcnZpY2UgcnVucyBpbiB0aGUgc3lzdGVtIHNlcnZlciBhbmQgdGhpcworICogcHJveHkgb2JqZWN0IHdpbGwgYmUgaW1tZWRpYXRlbHkgYm91bmQgdG8gdGhlIHNlcnZpY2Ugb24gY29uc3RydWN0aW9uLgorICoKKyAqICBAaGlkZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmx1ZXRvb3RoSW5wdXREZXZpY2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQmx1ZXRvb3RoSW5wdXREZXZpY2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CisKKyAgICAvKiogaW50IGV4dHJhIGZvciBBQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JTlBVVF9ERVZJQ0VfU1RBVEUgPQorICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaW5wdXRkZXZpY2UuZXh0cmEuSU5QVVRfREVWSUNFX1NUQVRFIjsKKyAgICAvKiogaW50IGV4dHJhIGZvciBBQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVWSU9VU19JTlBVVF9ERVZJQ0VfU1RBVEUgPQorICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaW5wdXRkZXZpY2UuZXh0cmEuUFJFVklPVVNfSU5QVVRfREVWSUNFX1NUQVRFIjsKKworICAgIC8qKiBJbmRpY2F0ZXMgdGhlIHN0YXRlIG9mIGFuIGlucHV0IGRldmljZSBoYXMgY2hhbmdlZC4KKyAgICAgKiBUaGlzIGludGVudCB3aWxsIGFsd2F5cyBjb250YWluIEVYVFJBX0lOUFVUX0RFVklDRV9TVEFURSwKKyAgICAgKiBFWFRSQV9QUkVWSU9VU19JTlBVVF9ERVZJQ0VfU1RBVEUgYW5kIEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UKKyAgICAgKiBleHRyYXMuCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQgPQorICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaW5wdXRkZXZpY2UuYWN0aW9uLklOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RFRCA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVElORyAgID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNURUQgICAgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RJTkcgPSAzOworCisgICAgLyoqCisgICAgICogQXV0byBjb25uZWN0aW9uLCBpbmNvbWluZyBhbmQgb3V0Z29pbmcgY29ubmVjdGlvbiBhcmUgYWxsb3dlZCBhdCB0aGlzCisgICAgICogcHJpb3JpdHkgbGV2ZWwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfQVVUT19DT05ORUNUID0gMTAwMDsKKyAgICAvKioKKyAgICAgKiBJbmNvbWluZyBhbmQgb3V0Z29pbmcgY29ubmVjdGlvbiBhcmUgYWxsb3dlZCBhdCB0aGlzIHByaW9yaXR5IGxldmVsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfT04gPSAxMDA7CisgICAgLyoqCisgICAgICogQ29ubmVjdGlvbnMgdG8gdGhlIGRldmljZSBhcmUgbm90IGFsbG93ZWQgYXQgdGhpcyBwcmlvcml0eSBsZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9PRkYgPSAwOworICAgIC8qKgorICAgICAqIERlZmF1bHQgcHJpb3JpdHkgbGV2ZWwgd2hlbiB0aGUgZGV2aWNlIGlzIHVucGFpcmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX1VOREVGSU5FRCA9IC0xOworCisgICAgcHJpdmF0ZSBmaW5hbCBJQmx1ZXRvb3RoIG1TZXJ2aWNlOworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIEJsdWV0b290aElucHV0RGV2aWNlIHByb3h5IG9iamVjdCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgbG9jYWwKKyAgICAgKiBCbHVldG9vdGggU2VydmljZSB3aGljaCBoYW5kbGUgdGhlIEhJRCBwcm9maWxlLgorICAgICAqIEBwYXJhbSBjIENvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgQmx1ZXRvb3RoSW5wdXREZXZpY2UoQ29udGV4dCBjKSB7CisgICAgICAgIG1Db250ZXh0ID0gYzsKKworICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKEJsdWV0b290aEFkYXB0ZXIuQkxVRVRPT1RIX1NFUlZJQ0UpOworICAgICAgICBpZiAoYiAhPSBudWxsKSB7CisgICAgICAgICAgICBtU2VydmljZSA9IElCbHVldG9vdGguU3R1Yi5hc0ludGVyZmFjZShiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkJsdWV0b290aCBTZXJ2aWNlIG5vdCBhdmFpbGFibGUhIik7CisKKyAgICAgICAgICAgIC8vIEluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIHdoaWNoIHByZXZlbnRzIHBlb3BsZSBmcm9tIGdvaW5nCisgICAgICAgICAgICAvLyBpbnRvIFdpcmVsZXNzIHNldHRpbmdzIGluIHRoZSBlbXVsYXRvci4gTGV0IGl0IGNyYXNoIGxhdGVyIHdoZW4gaXQgaXMgYWN0dWFsbHkgdXNlZC4KKyAgICAgICAgICAgIG1TZXJ2aWNlID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBJbml0aWF0ZSBhIGNvbm5lY3Rpb24gdG8gYW4gSW5wdXQgZGV2aWNlLgorICAgICAqCisgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBvbiBlcnJvciBhbmQgdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbgorICAgICAqICBhdHRlbXB0IGlzIGJlaW5nIG1hZGUuCisgICAgICoKKyAgICAgKiAgTGlzdGVuIGZvciBJTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRF9BQ1RJT04gdG8gZmluZCBvdXQgd2hlbiB0aGUKKyAgICAgKiAgY29ubmVjdGlvbiBpcyBjb21wbGV0ZWQuCisgICAgICogIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAgKiAgQHJldHVybiBmYWxzZSBvbiBpbW1lZGlhdGUgZXJyb3IsIHRydWUgb3RoZXJ3aXNlCisgICAgICogIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29ubmVjdElucHV0RGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0SW5wdXREZXZpY2UoIiArIGRldmljZSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuY29ubmVjdElucHV0RGV2aWNlKGRldmljZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBJbml0aWF0ZSBkaXNjb25uZWN0IGZyb20gYW4gSW5wdXQgRGV2aWNlLgorICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybiBmYWxzZSBvbiBlcnJvciBhbmQgdHJ1ZSBpZiB0aGUgZGlzY29ubmVjdGlvbgorICAgICAqICBhdHRlbXB0IGlzIGJlaW5nIG1hZGUuCisgICAgICoKKyAgICAgKiAgTGlzdGVuIGZvciBJTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRF9BQ1RJT04gdG8gZmluZCBvdXQgd2hlbgorICAgICAqICBkaXNjb25uZWN0IGlzIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqICBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCVCBkZXZpY2UuCisgICAgICogIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLCB0cnVlIG90aGVyd2lzZQorICAgICAqICBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZGlzY29ubmVjdElucHV0RGV2aWNlKCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmRpc2Nvbm5lY3RJbnB1dERldmljZShkZXZpY2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogQ2hlY2sgaWYgYSBzcGVjaWZpZWQgSW5wdXREZXZpY2UgaXMgY29ubmVjdGVkLgorICAgICAqCisgICAgICogIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAgKiAgQHJldHVybiBUcnVlIGlmIGNvbm5lY3RlZCAsIGZhbHNlIG90aGVyd2lzZSBhbmQgb24gZXJyb3IuCisgICAgICogIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJbnB1dERldmljZUNvbm5lY3RlZChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiaXNJbnB1dERldmljZUNvbm5lY3RlZCgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgaW50IHN0YXRlID0gZ2V0SW5wdXREZXZpY2VTdGF0ZShkZXZpY2UpOworICAgICAgICBpZiAoc3RhdGUgPT0gU1RBVEVfQ09OTkVDVEVEKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKiBDaGVjayBpZiBhbnkgSW5wdXQgRGV2aWNlIGlzIGNvbm5lY3RlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSB1bm1vZGlmaWFibGUgc2V0IG9mIGNvbm5lY3RlZCBJbnB1dCBEZXZpY2VzLCBvciBudWxsIG9uIGVycm9yLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIFNldDxCbHVldG9vdGhEZXZpY2U+IGdldENvbm5lY3RlZElucHV0RGV2aWNlcygpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJnZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2hTZXQ8Qmx1ZXRvb3RoRGV2aWNlPigKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QobVNlcnZpY2UuZ2V0Q29ubmVjdGVkSW5wdXREZXZpY2VzKCkpKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEdldCB0aGUgc3RhdGUgb2YgYW4gSW5wdXQgRGV2aWNlLgorICAgICAqCisgICAgICogIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAgKiAgQHJldHVybiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgSW5wdXQgRGV2aWNlCisgICAgICogIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbnB1dERldmljZVN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJnZXRJbnB1dERldmljZVN0YXRlKCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldElucHV0RGV2aWNlU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIFNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBwcmlvcml0eSBvZiBhbiBpbnB1dCBkZXZpY2UuCisgICAgICoKKyAgICAgKiBQcmlvcml0eSBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLiBQcmlvcml0eSBjYW4gdGFrZSB0aGUgZm9sbG93aW5nCisgICAgICogdmFsdWVzOgorICAgICAqIHtAbGluayBQUklPUklUWV9PTn0sIHtAbGluayBQUklPUklUWV9PRkZ9LCB7QGxpbmsgUFJJT1JJVFlfQVVUT19DT05ORUNUfQorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBQYWlyZWQgZGV2aWNlLgorICAgICAqIEBwYXJhbSBwcmlvcml0eSBJbnRlZ2VyIHByaW9yaXR5CisgICAgICogQHJldHVybiB0cnVlIGlmIHByaW9yaXR5IGlzIHNldCwgZmFsc2Ugb24gZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRJbnB1dERldmljZVByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmlvcml0eSkgeworICAgICAgICBpZiAoREJHKSBsb2coInNldElucHV0RGV2aWNlUHJpb3JpdHkoIiArIGRldmljZSArICIsICIgKyBwcmlvcml0eSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2Uuc2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UsIHByaW9yaXR5KTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwcmlvcml0eSBhc3NvY2lhdGVkIHdpdGggYW4gSW5wdXQgRGV2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBJbnB1dCBEZXZpY2UKKyAgICAgKiBAcmV0dXJuIG5vbi1uZWdhdGl2ZSBwcmlvcml0eSwgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldElucHV0RGV2aWNlUHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImdldElucHV0RGV2aWNlUHJpb3JpdHkoIiArIGRldmljZSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gUFJJT1JJVFlfT0ZGOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgeworICAgICAgICBMb2cuZChUQUcsIG1zZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFBhbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFBhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMGIzZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUGFuLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50OworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudC5TZGtDb25zdGFudFR5cGU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEJsdWV0b290aFBhbiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhQYW4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CisKKyAgICAvKiogaW50IGV4dHJhIGZvciBBQ1RJT05fUEFOX1NUQVRFX0NIQU5HRUQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QQU5fU1RBVEUgPQorICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGgucGFuLmV4dHJhLlNUQVRFIjsKKyAgICAvKiogaW50IGV4dHJhIGZvciBBQ1RJT05fUEFOX1NUQVRFX0NIQU5HRUQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVWSU9VU19QQU5fU1RBVEUgPQorICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGgucGFuLmV4dHJhLlBSRVZJT1VTX1NUQVRFIjsKKworICAgIC8qKiBJbmRpY2F0ZXMgdGhlIHN0YXRlIG9mIGFuIFBBTiBkZXZpY2UgaGFzIGNoYW5nZWQuCisgICAgICogVGhpcyBpbnRlbnQgd2lsbCBhbHdheXMgY29udGFpbiBFWFRSQV9ERVZJQ0VfU1RBVEUsCisgICAgICogRVhUUkFfUFJFVklPVVNfREVWSUNFX1NUQVRFIGFuZCBCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFCisgICAgICogZXh0cmFzLgorICAgICAqLworICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04pCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1BBTl9TVEFURV9DSEFOR0VEID0KKyAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLnBhbi5hY3Rpb24uU1RBVEVfQ0hBTkdFRCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVBfUk9MRSA9ICJuYXAiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BUF9CUklER0UgPSAicGFuMSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfQ09OTkVDVElPTlMgPSA3OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQ09OTkVDVEVEID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNUSU5HICAgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RFRCAgICA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQ09OTkVDVElORyA9IDM7CisKKyAgICBwcml2YXRlIGZpbmFsIElCbHVldG9vdGggbVNlcnZpY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgQmx1ZXRvb3RoUGFuIHByb3h5IG9iamVjdCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgbG9jYWwKKyAgICAgKiBCbHVldG9vdGggUGFuIHNlcnZpY2UuCisgICAgICogQHBhcmFtIGMgQ29udGV4dAorICAgICAqLworICAgIHB1YmxpYyBCbHVldG9vdGhQYW4oQ29udGV4dCBjKSB7CisgICAgICAgIG1Db250ZXh0ID0gYzsKKworICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKEJsdWV0b290aEFkYXB0ZXIuQkxVRVRPT1RIX1NFUlZJQ0UpOworICAgICAgICBpZiAoYiAhPSBudWxsKSB7CisgICAgICAgICAgICBtU2VydmljZSA9IElCbHVldG9vdGguU3R1Yi5hc0ludGVyZmFjZShiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkJsdWV0b290aCBTZXJ2aWNlIG5vdCBhdmFpbGFibGUhIik7CisKKyAgICAgICAgICAgIC8vIEluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIHdoaWNoIHByZXZlbnRzIHBlb3BsZSBmcm9tIGdvaW5nCisgICAgICAgICAgICAvLyBpbnRvIFdpcmVsZXNzIHNldHRpbmdzIGluIHRoZSBlbXVsYXRvci4gTGV0IGl0IGNyYXNoIGxhdGVyCisgICAgICAgICAgICAvLyB3aGVuIGl0IGlzIGFjdHVhbGx5IHVzZWQuCisgICAgICAgICAgICBtU2VydmljZSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZSBhIFBBTiBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIG9uIGVycm9yIGFuZCB0cnVlIGlmIHRoZSBjb25uZWN0aW9uCisgICAgICogYXR0ZW1wdCBpcyBiZWluZyBtYWRlLgorICAgICAqCisgICAgICogTGlzdGVuIGZvciB7QGxpbmsgI0FDVElPTl9QQU5fU1RBVEVfQ0hBTkdFRH0gdG8gZmluZCBvdXQgd2hlbiB0aGUKKyAgICAgKiBjb25uZWN0aW9uIGlzIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAgKiBAcmV0dXJuIGZhbHNlIG9uIGltbWVkaWF0ZSBlcnJvciwgdHJ1ZSBvdGhlcndpc2UKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImNvbm5lY3QoIiArIGRldmljZSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuY29ubmVjdFBhbkRldmljZShkZXZpY2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZSBkaXNjb25uZWN0IGZyb20gUEFOLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm4gZmFsc2Ugb24gZXJyb3IgYW5kIHRydWUgaWYgdGhlIGRpc2Nvbm5lY3Rpb24KKyAgICAgKiBhdHRlbXB0IGlzIGJlaW5nIG1hZGUuCisgICAgICoKKyAgICAgKiBMaXN0ZW4gZm9yIHtAbGluayAjQUNUSU9OX1BBTl9TVEFURV9DSEFOR0VEfSB0byBmaW5kIG91dCB3aGVuCisgICAgICogZGlzY29ubmVjdCBpcyBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCVCBkZXZpY2UuCisgICAgICogQHJldHVybiBmYWxzZSBvbiBpbW1lZGlhdGUgZXJyb3IsIHRydWUgb3RoZXJ3aXNlCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJkaXNjb25uZWN0KCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmRpc2Nvbm5lY3RQYW5EZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEdldCB0aGUgc3RhdGUgb2YgYSBQQU4gRGV2aWNlLgorICAgICoKKyAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBpbnQgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB0aGUgUEFOIGNvbm5lY3Rpb24KKyAgICAqCisgICAgKiAgQHBhcmFtIGRldmljZSBSZW1vdGUgQlQgZGV2aWNlLgorICAgICogIEByZXR1cm4gVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIFBBTiBEZXZpY2UKKyAgICAqICBAaGlkZQorICAgICovCisgICBwdWJsaWMgaW50IGdldFBhbkRldmljZVN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICBpZiAoREJHKSBsb2coImdldFBhbkRldmljZVN0YXRlKCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgIHRyeSB7CisgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQYW5EZXZpY2VTdGF0ZShkZXZpY2UpOworICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICByZXR1cm4gU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgIH0KKyAgIH0KKworICAgLyoqIFJldHVybnMgYSBzZXQgb2YgYWxsIHRoZSBjb25uZWN0ZWQgUEFOIERldmljZXMKKyAgICoKKyAgICogRG9lcyBub3QgaW5jbHVkZSBkZXZpY2VzIHRoYXQgYXJlIGN1cnJlbnRseSBjb25uZWN0aW5nIG9yIGRpc2Nvbm5lY3RpbmcKKyAgICoKKyAgICogQHJldHVybiBhIHVubW9kaWZpYWJsZSBzZXQgb2YgY29ubmVjdGVkIFBBTiBEZXZpY2VzLCBvciBudWxsIG9uIGVycm9yLgorICAgKiBAaGlkZQorICAgKi8KKyAgIHB1YmxpYyBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBnZXRDb25uZWN0ZWREZXZpY2VzKCkgeworICAgICAgaWYgKERCRykgbG9nKCJnZXRDb25uZWN0ZWREZXZpY2VzIik7CisgICAgICB0cnkgeworICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoCisgICAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDxCbHVldG9vdGhEZXZpY2U+KAorICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QobVNlcnZpY2UuZ2V0Q29ubmVjdGVkUGFuRGV2aWNlcygpKSkpOworICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKKyAgICAgICAgTG9nLmQoVEFHLCBtc2cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJsdWV0b290aFRldGhlcmluZyhib29sZWFuIHZhbHVlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5zZXRCbHVldG9vdGhUZXRoZXJpbmcodmFsdWUpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RldGhlcmluZ09uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmlzVGV0aGVyaW5nT24oKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFByb2ZpbGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhQcm9maWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I0Yzg0YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhQcm9maWxlLmphdmEKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQ7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50LlNka0NvbnN0YW50VHlwZTsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogUHVibGljIEFQSXMgZm9yIHRoZSBCbHVldG9vdGggUHJvZmlsZXMuCisgKgorICogPHA+IENsaWVudHMgc2hvdWxkIGNhbGwge0BsaW5rIEJsdWV0b290aEFkYXB0ZXIjZ2V0UHJvZmlsZVByb3h5fSwKKyAqIHRvIGdldCB0aGUgUHJvZmlsZSBQcm94eS4gRWFjaCBwdWJsaWMgcHJvZmlsZSBpbXBsZW1lbnRzIHRoaXMKKyAqIGludGVyZmFjZS4KKyAqLworcHVibGljIGludGVyZmFjZSBCbHVldG9vdGhQcm9maWxlIHsKKworICAgIC8qKgorICAgICAqIEV4dHJhIGZvciB0aGUgY29ubmVjdGlvbiBzdGF0ZSBpbnRlbnRzIG9mIHRoZSBpbmRpdmlkdWFsIHByb2ZpbGVzLgorICAgICAqCisgICAgICogVGhpcyBleHRyYSByZXByZXNlbnRzIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIHByb2ZpbGUgb2YgdGhlCisgICAgICogQmx1ZXRvb3RoIGRldmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TVEFURSA9ICJhbmRyb2lkLmJsdWV0b290aC5wcm9maWxlLmV4dHJhLlNUQVRFIjsKKworICAgIC8qKgorICAgICAqIEV4dHJhIGZvciB0aGUgY29ubmVjdGlvbiBzdGF0ZSBpbnRlbnRzIG9mIHRoZSBpbmRpdmlkdWFsIHByb2ZpbGVzLgorICAgICAqCisgICAgICogVGhpcyBleHRyYSByZXByZXNlbnRzIHRoZSBwcmV2aW91cyBjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSBwcm9maWxlIG9mIHRoZQorICAgICAqIEJsdWV0b290aCBkZXZpY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUFJFVklPVVNfU1RBVEUgPQorICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGgucHJvZmlsZS5leHRyYS5QUkVWSU9VU19TVEFURSI7CisKKyAgICAvKiogVGhlIHByb2ZpbGUgaXMgaW4gZGlzY29ubmVjdGVkIHN0YXRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQ09OTkVDVEVEICA9IDA7CisgICAgLyoqIFRoZSBwcm9maWxlIGlzIGluIGNvbm5lY3Rpbmcgc3RhdGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNUSU5HICAgID0gMTsKKyAgICAvKiogVGhlIHByb2ZpbGUgaXMgaW4gY29ubmVjdGVkIHN0YXRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVEVEICAgICA9IDI7CisgICAgLyoqIFRoZSBwcm9maWxlIGlzIGluIGRpc2Nvbm5lY3Rpbmcgc3RhdGUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9ESVNDT05ORUNUSU5HID0gMzsKKworICAgIC8qKgorICAgICAqIEhlYWRzZXQgYW5kIEhhbmRzZnJlZSBwcm9maWxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEVBRFNFVCA9IDE7CisgICAgLyoqCisgICAgICogQTJEUCBwcm9maWxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEEyRFAgPSAyOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBwcmlvcml0eSBmb3IgZGV2aWNlcyB0aGF0IHdlIHRyeSB0byBhdXRvLWNvbm5lY3QgdG8gYW5kCisgICAgICogYW5kIGFsbG93IGluY29taW5nIGNvbm5lY3Rpb25zIGZvciB0aGUgcHJvZmlsZQorICAgICAqIEBoaWRlCisgICAgICoqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX0FVVE9fQ09OTkVDVCA9IDEwMDA7CisKKyAgICAvKioKKyAgICAgKiAgRGVmYXVsdCBwcmlvcml0eSBmb3IgZGV2aWNlcyB0aGF0IGFsbG93IGluY29taW5nCisgICAgICogYW5kIG91dGdvaW5nIGNvbm5lY3Rpb25zIGZvciB0aGUgcHJvZmlsZQorICAgICAqIEBoaWRlCisgICAgICoqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX09OID0gMTAwOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBwcmlvcml0eSBmb3IgZGV2aWNlcyB0aGF0IGRvZXMgbm90IGFsbG93IGluY29taW5nCisgICAgICogY29ubmVjdGlvbnMgYW5kIG91dGdvaW5nIGNvbm5lY3Rpb25zIGZvciB0aGUgcHJvZmlsZS4KKyAgICAgKiBAaGlkZQorICAgICAqKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9PRkYgPSAwOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBwcmlvcml0eSB3aGVuIG5vdCBzZXQgb3Igd2hlbiB0aGUgZGV2aWNlIGlzIHVucGFpcmVkCisgICAgICogQGhpZGUKKyAgICAgKiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX1VOREVGSU5FRCA9IC0xOworCisgICAgLyoqCisgICAgICogSW5pdGlhdGUgY29ubmVjdGlvbiB0byBhIHByb2ZpbGUgb2YgdGhlIHJlbW90ZSBibHVldG9vdGggZGV2aWNlLgorICAgICAqCisgICAgICogPHA+IEN1cnJlbnRseSwgdGhlIHN5c3RlbSBzdXBwb3J0cyBvbmx5IDEgY29ubmVjdGlvbiB0byB0aGUKKyAgICAgKiBBMkRQIGFuZCBIZWFkc2V0L0hhbmRzZnJlZSBwcm9maWxlLiBUaGUgQVBJIHdpbGwgYXV0b21hdGljYWxseQorICAgICAqIGRpc2Nvbm5lY3QgY29ubmVjdGVkIGRldmljZXMgYmVmb3JlIGNvbm5lY3RpbmcuCisgICAgICoKKyAgICAgKiA8cD4gVGhpcyBBUEkgcmV0dXJucyBmYWxzZSBpbiBzY2VuYXJpb3MgbGlrZSB0aGUgcHJvZmlsZSBvbiB0aGUKKyAgICAgKiBkZXZpY2UgaXMgYWxyZWFkeSBjb25uZWN0ZWQgb3IgQmx1ZXRvb3RoIGlzIG5vdCB0dXJuZWQgb24uCisgICAgICogV2hlbiB0aGlzIEFQSSByZXR1cm5zIHRydWUsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdAorICAgICAqIGNvbm5lY3Rpb24gc3RhdGUgaW50ZW50IGZvciB0aGUgcHJvZmlsZSB3aWxsIGJlIGJyb2FkY2FzdGVkIHdpdGgKKyAgICAgKiB0aGUgc3RhdGUuIFVzZXJzIGNhbiBnZXQgdGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIHByb2ZpbGUKKyAgICAgKiBmcm9tIHRoaXMgaW50ZW50LgorICAgICAqCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEhfQURNSU59CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCbHVldG9vdGggRGV2aWNlCisgICAgICogQHJldHVybiBmYWxzZSBvbiBpbW1lZGlhdGUgZXJyb3IsCisgICAgICogICAgICAgICAgICAgICB0cnVlIG90aGVyd2lzZQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKworICAgIC8qKgorICAgICAqIEluaXRpYXRlIGRpc2Nvbm5lY3Rpb24gZnJvbSBhIHByb2ZpbGUKKyAgICAgKgorICAgICAqIDxwPiBUaGlzIEFQSSB3aWxsIHJldHVybiBmYWxzZSBpbiBzY2VuYXJpb3MgbGlrZSB0aGUgcHJvZmlsZSBvbiB0aGUKKyAgICAgKiBCbHVldG9vdGggZGV2aWNlIGlzIG5vdCBpbiBjb25uZWN0ZWQgc3RhdGUgZXRjLiBXaGVuIHRoaXMgQVBJIHJldHVybnMsCisgICAgICogdHJ1ZSwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0IHRoZSBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZQorICAgICAqIGludGVudCB3aWxsIGJlIGJyb2FkY2FzdGVkIHdpdGggdGhlIHN0YXRlLiBVc2VycyBjYW4gZ2V0IHRoZQorICAgICAqIGRpc2Nvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIHByb2ZpbGUgZnJvbSB0aGlzIGludGVudC4KKyAgICAgKgorICAgICAqIDxwPiBJZiB0aGUgZGlzY29ubmVjdGlvbiBpcyBpbml0aWF0ZWQgYnkgYSByZW1vdGUgZGV2aWNlLCB0aGUgc3RhdGUKKyAgICAgKiB3aWxsIHRyYW5zaXRpb24gZnJvbSB7QGxpbmsgI1NUQVRFX0NPTk5FQ1RFRH0gdG8KKyAgICAgKiB7QGxpbmsgI1NUQVRFX0RJU0NPTk5FQ1RFRH0uIElmIHRoZSBkaXNjb25uZWN0IGlzIGluaXRpYXRlZCBieSB0aGUKKyAgICAgKiBob3N0IChsb2NhbCkgZGV2aWNlIHRoZSBzdGF0ZSB3aWxsIHRyYW5zaXRpb24gZnJvbQorICAgICAqIHtAbGluayAjU1RBVEVfQ09OTkVDVEVEfSB0byBzdGF0ZSB7QGxpbmsgI1NUQVRFX0RJU0NPTk5FQ1RJTkd9IHRvCisgICAgICogc3RhdGUge0BsaW5rICNTVEFURV9ESVNDT05ORUNURUR9LiBUaGUgdHJhbnNpdGlvbiB0bworICAgICAqIHtAbGluayAjU1RBVEVfRElTQ09OTkVDVElOR30gY2FuIGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUKKyAgICAgKiB0d28gc2NlbmFyaW9zLgorICAgICAqCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEhfQURNSU59CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCbHVldG9vdGggRGV2aWNlCisgICAgICogQHJldHVybiBmYWxzZSBvbiBpbW1lZGlhdGUgZXJyb3IsCisgICAgICogICAgICAgICAgICAgICB0cnVlIG90aGVyd2lzZQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKworICAgIC8qKgorICAgICAqIEdldCBjb25uZWN0ZWQgZGV2aWNlcyBmb3IgdGhpcyBzcGVjaWZpYyBwcm9maWxlLgorICAgICAqCisgICAgICogPHA+IFJldHVybiB0aGUgc2V0IG9mIGRldmljZXMgd2hpY2ggYXJlIGluIHN0YXRlIHtAbGluayAjU1RBVEVfQ09OTkVDVEVEfQorICAgICAqCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEh9CisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFuIHVubW9kaWZpYWJsZSBzZXQgb2YgZGV2aWNlcy4gVGhlIHNldCB3aWxsIGJlIGVtcHR5IG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBnZXRDb25uZWN0ZWREZXZpY2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBzZXQgb2YgZGV2aWNlcyB0aGF0IG1hdGNoIGFueSBvZiB0aGUgZ2l2ZW4gY29ubmVjdGlvbgorICAgICAqIHN0YXRlcy4KKyAgICAgKgorICAgICAqIDxwPiBJZiBub25lIG9mIGRldmljZXMgbWF0Y2ggYW55IG9mIHRoZSBnaXZlbiBzdGF0ZXMsCisgICAgICogYW4gZW1wdHkgc2V0IHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiA8cD5SZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI0JMVUVUT09USH0KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0ZXMgQXJyYXkgb2Ygc3RhdGVzLiBTdGF0ZXMgY2FuIGJlIG9uZSBvZgorICAgICAqICAgICAgICAgICAgICB7QGxpbmsgI1NUQVRFX0NPTk5FQ1RFRH0sIHtAbGluayAjU1RBVEVfQ09OTkVDVElOR30sCisgICAgICogICAgICAgICAgICAgIHtAbGluayAjU1RBVEVfRElTQ09OTkVDVEVEfSwge0BsaW5rICNTVEFURV9ESVNDT05ORUNUSU5HfSwKKyAgICAgKiBAcmV0dXJuIEFuIHVubW9kaWZpYWJsZSBzZXQgb2YgZGV2aWNlcy4gVGhlIHNldCB3aWxsIGJlIGVtcHR5IG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBnZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzKGludFtdIHN0YXRlcyk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgcHJvZmlsZQorICAgICAqCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEh9CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIFJlbW90ZSBibHVldG9vdGggZGV2aWNlLgorICAgICAqIEByZXR1cm4gU3RhdGUgb2YgdGhlIHByb2ZpbGUgY29ubmVjdGlvbi4gT25lIG9mCisgICAgICogICAgICAgICAgICAgICB7QGxpbmsgI1NUQVRFX0NPTk5FQ1RFRH0sIHtAbGluayAjU1RBVEVfQ09OTkVDVElOR30sCisgICAgICogICAgICAgICAgICAgICB7QGxpbmsgI1NUQVRFX0RJU0NPTk5FQ1RFRH0sIHtAbGluayAjU1RBVEVfRElTQ09OTkVDVElOR30KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25TdGF0ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKworICAgIC8qKgorICAgICAqIFNldCBwcmlvcml0eSBvZiB0aGUgcHJvZmlsZQorICAgICAqCisgICAgICogPHA+IFRoZSBkZXZpY2Ugc2hvdWxkIGFscmVhZHkgYmUgcGFpcmVkLgorICAgICAqICBQcmlvcml0eSBjYW4gYmUgb25lIG9mIHtAbGluayAjUFJJT1JJVFlfT059IG9yCisgICAgICoge0BsaW5rICNQUklPUklUWV9PRkZ9LAorICAgICAqCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEhfQURNSU59CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIFBhaXJlZCBibHVldG9vdGggZGV2aWNlCisgICAgICogQHBhcmFtIHByaW9yaXR5CisgICAgICogQHJldHVybiB0cnVlIGlmIHByaW9yaXR5IGlzIHNldCwgZmFsc2Ugb24gZXJyb3IKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNldFByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmlvcml0eSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHByaW9yaXR5IG9mIHRoZSBwcm9maWxlLgorICAgICAqCisgICAgICogPHA+IFRoZSBwcmlvcml0eSBjYW4gYmUgYW55IG9mOgorICAgICAqIHtAbGluayAjUFJJT1JJVFlfQVVUT19DT05ORUNUfSwge0BsaW5rICNQUklPUklUWV9PRkZ9LAorICAgICAqIHtAbGluayAjUFJJT1JJVFlfT059LCB7QGxpbmsgI1BSSU9SSVRZX1VOREVGSU5FRH0KKyAgICAgKgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIfQorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBCbHVldG9vdGggZGV2aWNlCisgICAgICogQHJldHVybiBwcmlvcml0eSBvZiB0aGUgZGV2aWNlCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UpOworCisgICAgLyoqCisgICAgICogQW4gaW50ZXJmYWNlIGZvciBub3RpZnlpbmcgQmx1ZXRvb3RoUHJvZmlsZSBJUEMgY2xpZW50cyB3aGVuIHRoZXkgaGF2ZQorICAgICAqIGJlZW4gY29ubmVjdGVkIG9yIGRpc2Nvbm5lY3RlZCB0byB0aGUgc2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2VMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgdG8gbm90aWZ5IHRoZSBjbGllbnQgd2hlbiB0aGUgcHJveHkgb2JqZWN0IGhhcyBiZWVuCisgICAgICAgICAqIGNvbm5lY3RlZCB0byB0aGUgc2VydmljZS4KKyAgICAgICAgICogQHBhcmFtIHByb2ZpbGUgLSBPbmUgb2Yge0BsaW5rICNIRUFEU0VUfSBvcgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgIHtAbGluayAjQTJEUH0KKyAgICAgICAgICogQHBhcmFtIHByb3h5IC0gT25lIG9mIHtAbGluayBCbHVldG9vdGhIZWFkc2V0fSBvcgorICAgICAgICAgKiAgICAgICAgICAgICAgICB7QGxpbmsgQmx1ZXRvb3RoQTJkcH0KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChpbnQgcHJvZmlsZSwgQmx1ZXRvb3RoUHJvZmlsZSBwcm94eSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB0byBub3RpZnkgdGhlIGNsaWVudCB0aGF0IHRoaXMgcHJveHkgb2JqZWN0IGhhcyBiZWVuCisgICAgICAgICAqIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBzZXJ2aWNlLgorICAgICAgICAgKiBAcGFyYW0gcHJvZmlsZSAtIE9uZSBvZiB7QGxpbmsgI0hFQURTRVR9IG9yCisgICAgICAgICAqICAgICAgICAgICAgICAgICAge0BsaW5rICNBMkRQfQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKGludCBwcm9maWxlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUHJvZmlsZVN0YXRlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUHJvZmlsZVN0YXRlLmphdmEKaW5kZXggOTQ2ZGNhYS4uN2Y0MmJhZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFByb2ZpbGVTdGF0ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhQcm9maWxlU3RhdGUuamF2YQpAQCAtNDMsOCArNDMsOSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsgLy8gU1RPUFNISVAgLSBjaGFuZ2UgdG8gZmFsc2UuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhQcm9maWxlU3RhdGUiOwogCi0gICAgcHVibGljIHN0YXRpYyBpbnQgSEZQID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGludCBBMkRQID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIRlAgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEEyRFAgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJRCA9IDI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBpbnQgVFJBTlNJVElPTl9UT19TVEFCTEUgPSAxMDA7CiAKQEAgLTU4LDE2ICs1OSwyMiBAQAogICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CiAgICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOwogCi0gICAgICAgICAgICBpZiAoYWN0aW9uLmVxdWFscyhCbHVldG9vdGhIZWFkc2V0LkFDVElPTl9TVEFURV9DSEFOR0VEKSkgewotICAgICAgICAgICAgICAgIGludCBuZXdTdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhIZWFkc2V0LkVYVFJBX1NUQVRFLCAwKTsKLSAgICAgICAgICAgICAgICBpZiAobVByb2ZpbGUgPT0gSEZQICYmIChuZXdTdGF0ZSA9PSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRCB8fAotICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0RJU0NPTk5FQ1RFRCkpIHsKKyAgICAgICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV3U3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoUHJvZmlsZS5FWFRSQV9TVEFURSwgMCk7CisgICAgICAgICAgICAgICAgaWYgKG1Qcm9maWxlID09IEhGUCAmJiAobmV3U3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQgfHwKKyAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpKSB7CiAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKFRSQU5TSVRJT05fVE9fU1RBQkxFKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoQTJkcC5BQ1RJT05fU0lOS19TVEFURV9DSEFOR0VEKSkgewotICAgICAgICAgICAgICAgIGludCBuZXdTdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhBMmRwLkVYVFJBX1NJTktfU1RBVEUsIDApOwotICAgICAgICAgICAgICAgIGlmIChtUHJvZmlsZSA9PSBBMkRQICYmIChuZXdTdGF0ZSA9PSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RFRCB8fAotICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRCkpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhCbHVldG9vdGhBMmRwLkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpKSB7CisgICAgICAgICAgICAgICAgaW50IG5ld1N0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aFByb2ZpbGUuRVhUUkFfU1RBVEUsIDApOworICAgICAgICAgICAgICAgIGlmIChtUHJvZmlsZSA9PSBBMkRQICYmIChuZXdTdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCB8fAorICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoVFJBTlNJVElPTl9UT19TVEFCTEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhCbHVldG9vdGhJbnB1dERldmljZS5BQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQpKSB7CisgICAgICAgICAgICAgICAgaW50IG5ld1N0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aElucHV0RGV2aWNlLkVYVFJBX0lOUFVUX0RFVklDRV9TVEFURSwgMCk7CisgICAgICAgICAgICAgICAgaWYgKG1Qcm9maWxlID09IEhJRCAmJiAobmV3U3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEIHx8CisgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRCkpIHsKICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoVFJBTlNJVElPTl9UT19TVEFCTEUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTgyLDggKzg5LDkgQEAKICAgICAgICAgc2V0SW5pdGlhbFN0YXRlKG1TdGFibGVTdGF0ZSk7CiAKICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhBMmRwLkFDVElPTl9TSU5LX1NUQVRFX0NIQU5HRUQpOwotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX1NUQVRFX0NIQU5HRUQpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEEyZHAuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoSGVhZHNldC5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhJbnB1dERldmljZS5BQ1RJT05fSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQpOwogICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobUJyb2FkY2FzdFJlY2VpdmVyLCBmaWx0ZXIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFV1aWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhVdWlkLmphdmEKaW5kZXggNDE2NGEzZC4uM2ZiZmM3MCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFV1aWQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVXVpZC5qYXZhCkBAIC00OSwxMCArNDksMTggQEAKICAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDExMEMtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxVdWlkIE9iZXhPYmplY3RQdXNoID0KICAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDExMDUtMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxVdWlkIEhpZCA9CisgICAgICAgICAgICBQYXJjZWxVdWlkLmZyb21TdHJpbmcoIjAwMDAxMTI0LTAwMDAtMTAwMC04MDAwLTAwODA1ZjliMzRmYiIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsVXVpZCBQQU5VID0KKyAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDExMTUtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxVdWlkIE5BUCA9CisgICAgICAgICAgICBQYXJjZWxVdWlkLmZyb21TdHJpbmcoIjAwMDAxMTE2LTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQiIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsVXVpZCBCTkVQID0KKyAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDAwMGYtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbFV1aWRbXSBSRVNFUlZFRF9VVUlEUyA9IHsKICAgICAgICAgQXVkaW9TaW5rLCBBdWRpb1NvdXJjZSwgQWR2QXVkaW9EaXN0LCBIU1AsIEhhbmRzZnJlZSwgQXZyY3BDb250cm9sbGVyLCBBdnJjcFRhcmdldCwKLSAgICAgICAgT2JleE9iamVjdFB1c2h9OworICAgICAgICBPYmV4T2JqZWN0UHVzaCwgUEFOVSwgTkFQfTsKIAogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F1ZGlvU291cmNlKFBhcmNlbFV1aWQgdXVpZCkgewogICAgICAgICByZXR1cm4gdXVpZC5lcXVhbHMoQXVkaW9Tb3VyY2UpOwpAQCAtODIsNiArOTAsMjEgQEAKICAgICAgICAgcmV0dXJuIHV1aWQuZXF1YWxzKEF2cmNwVGFyZ2V0KTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnB1dERldmljZShQYXJjZWxVdWlkIHV1aWQpIHsKKyAgICAgICAgcmV0dXJuIHV1aWQuZXF1YWxzKEhpZCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGFudShQYXJjZWxVdWlkIHV1aWQpIHsKKyAgICAgICAgcmV0dXJuIHV1aWQuZXF1YWxzKFBBTlUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05hcChQYXJjZWxVdWlkIHV1aWQpIHsKKyAgICAgICAgcmV0dXJuIHV1aWQuZXF1YWxzKE5BUCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQm5lcChQYXJjZWxVdWlkIHV1aWQpIHsKKyAgICAgICAgcmV0dXJuIHV1aWQuZXF1YWxzKEJORVApOworICAgIH0KICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgUGFyY2VsVXVpZCBpcyBwcmVzZW50IGluIHV1aWRBcnJheQogICAgICAqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aC5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGguYWlkbAppbmRleCA2ZGQ4ZGQ2Li5jYzIzMTQ2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aC5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoLmFpZGwKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7CiAKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsVXVpZDsKIAogLyoqCkBAIC03Niw0ICs3NywxOSBAQAogICAgIGJvb2xlYW4gY29ubmVjdEhlYWRzZXQoU3RyaW5nIGFkZHJlc3MpOwogICAgIGJvb2xlYW4gZGlzY29ubmVjdEhlYWRzZXQoU3RyaW5nIGFkZHJlc3MpOwogICAgIGJvb2xlYW4gbm90aWZ5SW5jb21pbmdDb25uZWN0aW9uKFN0cmluZyBhZGRyZXNzKTsKKworICAgIC8vIEhJRCBwcm9maWxlIEFQSXMKKyAgICBib29sZWFuIGNvbm5lY3RJbnB1dERldmljZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBCbHVldG9vdGhEZXZpY2VbXSBnZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKTsgIC8vIGNoYW5nZSB0byBTZXQ8PiBvbmNlIEFJREwgc3VwcG9ydHMKKyAgICBpbnQgZ2V0SW5wdXREZXZpY2VTdGF0ZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBib29sZWFuIHNldElucHV0RGV2aWNlUHJpb3JpdHkoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByaW9yaXR5KTsKKyAgICBpbnQgZ2V0SW5wdXREZXZpY2VQcmlvcml0eShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKworICAgIGJvb2xlYW4gaXNUZXRoZXJpbmdPbigpOworICAgIHZvaWQgc2V0Qmx1ZXRvb3RoVGV0aGVyaW5nKGJvb2xlYW4gdmFsdWUpOworICAgIGludCBnZXRQYW5EZXZpY2VTdGF0ZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBCbHVldG9vdGhEZXZpY2VbXSBnZXRDb25uZWN0ZWRQYW5EZXZpY2VzKCk7CisgICAgYm9vbGVhbiBjb25uZWN0UGFuRGV2aWNlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOworICAgIGJvb2xlYW4gZGlzY29ubmVjdFBhbkRldmljZShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQTJkcC5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBMmRwLmFpZGwKaW5kZXggNDBmMTA1OC4uYzUwNDRjMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBMmRwLmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhBMmRwLmFpZGwKQEAgLTE5LDIxICsxOSwyNSBAQAogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKIAogLyoqCi0gKiBTeXN0ZW0gcHJpdmF0ZSBBUEkgZm9yIEJsdWV0b290aCBBMkRQIHNlcnZpY2UKKyAqIEFQSXMgZm9yIEJsdWV0b290aCBBMkRQIHNlcnZpY2UKICAqCi0gKiB7QGhpZGV9CisgKiBAaGlkZQogICovCiBpbnRlcmZhY2UgSUJsdWV0b290aEEyZHAgewotICAgIGJvb2xlYW4gY29ubmVjdFNpbmsoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7Ci0gICAgYm9vbGVhbiBkaXNjb25uZWN0U2luayhpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICAvLyBQdWJsaWMgQVBJCisgICAgYm9vbGVhbiBjb25uZWN0KGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOworICAgIGJvb2xlYW4gZGlzY29ubmVjdChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICAvLyBjaGFuZ2UgdG8gU2V0PD4gb25jZSBBSURMIHN1cHBvcnRzCisgICAgQmx1ZXRvb3RoRGV2aWNlW10gZ2V0Q29ubmVjdGVkRGV2aWNlcygpOworICAgIEJsdWV0b290aERldmljZVtdIGdldERldmljZXNNYXRjaGluZ0Nvbm5lY3Rpb25TdGF0ZXMoaW4gaW50W10gc3RhdGVzKTsKKyAgICBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOworICAgIGJvb2xlYW4gc2V0UHJpb3JpdHkoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByaW9yaXR5KTsKKyAgICBpbnQgZ2V0UHJpb3JpdHkoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CisgICAgYm9vbGVhbiBpc0EyZHBQbGF5aW5nKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOworCisgICAgLy8gSW50ZXJuYWwgQVBJcwogICAgIGJvb2xlYW4gc3VzcGVuZFNpbmsoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CiAgICAgYm9vbGVhbiByZXN1bWVTaW5rKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwotICAgIEJsdWV0b290aERldmljZVtdIGdldENvbm5lY3RlZFNpbmtzKCk7ICAvLyBjaGFuZ2UgdG8gU2V0PD4gb25jZSBBSURMIHN1cHBvcnRzCi0gICAgQmx1ZXRvb3RoRGV2aWNlW10gZ2V0Tm9uRGlzY29ubmVjdGVkU2lua3MoKTsgIC8vIGNoYW5nZSB0byBTZXQ8PiBvbmNlIEFJREwgc3VwcG9ydHMKLSAgICBpbnQgZ2V0U2lua1N0YXRlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwotICAgIGJvb2xlYW4gc2V0U2lua1ByaW9yaXR5KGluIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmlvcml0eSk7Ci0gICAgaW50IGdldFNpbmtQcmlvcml0eShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKLQogICAgIGJvb2xlYW4gY29ubmVjdFNpbmtJbnRlcm5hbChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKICAgICBib29sZWFuIGRpc2Nvbm5lY3RTaW5rSW50ZXJuYWwoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aEhlYWRzZXQuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoSGVhZHNldC5haWRsCmluZGV4IGQ5NmYwY2EuLjhiY2YxMDMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoSGVhZHNldC5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoSGVhZHNldC5haWRsCkBAIC0xOSwyNSArMTksMzIgQEAKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CiAKIC8qKgotICogU3lzdGVtIHByaXZhdGUgQVBJIGZvciBCbHVldG9vdGggSGVhZHNldCBzZXJ2aWNlCisgKiBBUEkgZm9yIEJsdWV0b290aCBIZWFkc2V0IHNlcnZpY2UKICAqCiAgKiB7QGhpZGV9CiAgKi8KIGludGVyZmFjZSBJQmx1ZXRvb3RoSGVhZHNldCB7Ci0gICAgaW50IGdldFN0YXRlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwotICAgIEJsdWV0b290aERldmljZSBnZXRDdXJyZW50SGVhZHNldCgpOwotICAgIGJvb2xlYW4gY29ubmVjdEhlYWRzZXQoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7Ci0gICAgdm9pZCBkaXNjb25uZWN0SGVhZHNldChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKLSAgICBib29sZWFuIGlzQ29ubmVjdGVkKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwotICAgIGJvb2xlYW4gc3RhcnRWb2ljZVJlY29nbml0aW9uKCk7Ci0gICAgYm9vbGVhbiBzdG9wVm9pY2VSZWNvZ25pdGlvbigpOworICAgIC8vIFB1YmxpYyBBUEkKKyAgICBib29sZWFuIGNvbm5lY3QoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CisgICAgYm9vbGVhbiBkaXNjb25uZWN0KGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOworICAgIC8vIENoYW5nZSB0byBTZXQ8PiB3aGVuIEFJREwgc3VwcG9ydHMKKyAgICBCbHVldG9vdGhEZXZpY2VbXSBnZXRDb25uZWN0ZWREZXZpY2VzKCk7CisgICAgQmx1ZXRvb3RoRGV2aWNlW10gZ2V0RGV2aWNlc01hdGNoaW5nQ29ubmVjdGlvblN0YXRlcyhpbiBpbnRbXSBzdGF0ZXMpOworICAgIGludCBnZXRDb25uZWN0aW9uU3RhdGUoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CiAgICAgYm9vbGVhbiBzZXRQcmlvcml0eShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcHJpb3JpdHkpOwogICAgIGludCBnZXRQcmlvcml0eShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKLSAgICBpbnQgZ2V0QmF0dGVyeVVzYWdlSGludCgpOworICAgIGJvb2xlYW4gc3RhcnRWb2ljZVJlY29nbml0aW9uKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOworICAgIGJvb2xlYW4gc3RvcFZvaWNlUmVjb2duaXRpb24oaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CisgICAgYm9vbGVhbiBpc0F1ZGlvQ29ubmVjdGVkKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwogCisgICAgLy8gQVBJcyB0aGF0IGNhbiBiZSBtYWRlIHB1YmxpYyBpbiBmdXR1cmUKKyAgICBpbnQgZ2V0QmF0dGVyeVVzYWdlSGludChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKworICAgIC8vIEludGVybmFsIGZ1bmN0aW9ucywgbm90IGJlIG1hZGUgcHVibGljCiAgICAgYm9vbGVhbiBjcmVhdGVJbmNvbWluZ0Nvbm5lY3QoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CiAgICAgYm9vbGVhbiBhY2NlcHRJbmNvbWluZ0Nvbm5lY3QoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CiAgICAgYm9vbGVhbiBjYW5jZWxDb25uZWN0VGhyZWFkKCk7CiAgICAgYm9vbGVhbiBjb25uZWN0SGVhZHNldEludGVybmFsKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwogICAgIGJvb2xlYW4gZGlzY29ubmVjdEhlYWRzZXRJbnRlcm5hbChpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKKyAgICBib29sZWFuIHNldEF1ZGlvU3RhdGUoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHN0YXRlKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9TY29Tb2NrZXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9TY29Tb2NrZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY1YTk5YS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvU2NvU29ja2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyLldha2VMb2NrOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8qKgotICogVGhlIEFuZHJvaWQgQmx1ZXRvb3RoIEFQSSBpcyBub3QgZmluYWxpemVkLCBhbmQgKndpbGwqIGNoYW5nZS4gVXNlIGF0IHlvdXIKLSAqIG93biByaXNrLgotICoKLSAqIFNpbXBsZSBTQ08gU29ja2V0LgotICogQ3VycmVudGx5IGluIEFuZHJvaWQsIHRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHNlbmRpbmcgZGF0YSBvdmVyIGEgU0NPCi0gKiBzb2NrZXQgLSB0aGlzIGlzIG1hbmFnZWQgYnkgdGhlIGhhcmR3YXJlIGxpbmsgdG8gdGhlIEJsdWV0b290aCBDaGlwLiBUaGlzCi0gKiBjbGFzcyBpcyBpbnN0ZWFkIGludGVuZGVkIGZvciBtYW5hZ2VtZW50IG9mIHRoZSBTQ08gc29ja2V0IGxpZmV0aW1lLCAKLSAqIGFuZCBpcyB0YWlsb3JlZCBmb3IgdXNlIHdpdGggdGhlIGhlYWRzZXQgLyBoYW5kc2ZyZWUgcHJvZmlsZXMuCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgU2NvU29ja2V0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNjb1NvY2tldCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSB0cnVlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkRCRyA9IGZhbHNlOyAgLy8gZXZlbiBtb3JlIGxvZ2dpbmcKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1JFQURZID0gMTsgICAgLy8gUmVhZHkgZm9yIHVzZS4gTm8gdGhyZWFkcyBvciBzb2NrZXRzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQUNDRVBUID0gMjsgICAvLyBhY2NlcHQoKSB0aHJlYWQgcnVubmluZwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RJTkcgPSAzOyAgLy8gY29ubmVjdCgpIHRocmVhZCBydW5uaW5nCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVEVEID0gNDsgICAvLyBjb25uZWN0ZWQsIHdhaXRpbmcgZm9yIGNsb3NlKCkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DTE9TRUQgPSA1OyAgIC8vIHdhcyBjb25uZWN0ZWQsIG5vdyBjbG9zZWQuCi0KLSAgICBwcml2YXRlIGludCBtU3RhdGU7Ci0gICAgcHJpdmF0ZSBpbnQgbU5hdGl2ZURhdGE7Ci0gICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOwotICAgIHByaXZhdGUgaW50IG1BY2NlcHRlZENvZGU7Ci0gICAgcHJpdmF0ZSBpbnQgbUNvbm5lY3RlZENvZGU7Ci0gICAgcHJpdmF0ZSBpbnQgbUNsb3NlZENvZGU7Ci0KLSAgICBwcml2YXRlIFdha2VMb2NrIG1XYWtlTG9jazsgIC8vIGhlbGQgd2hpbGUgaW4gU1RBVEVfQ09OTkVDVElORwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgY2xhc3NJbml0TmF0aXZlKCk7Ci0gICAgfQotICAgIHByaXZhdGUgbmF0aXZlIHN0YXRpYyB2b2lkIGNsYXNzSW5pdE5hdGl2ZSgpOwotCi0gICAgcHVibGljIFNjb1NvY2tldChQb3dlck1hbmFnZXIgcG0sIEhhbmRsZXIgaGFuZGxlciwgaW50IGFjY2VwdGVkQ29kZSwgaW50IGNvbm5lY3RlZENvZGUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgY2xvc2VkQ29kZSkgewotICAgICAgICBpbml0TmF0aXZlKCk7Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX1JFQURZOwotICAgICAgICBtSGFuZGxlciA9IGhhbmRsZXI7Ci0gICAgICAgIG1BY2NlcHRlZENvZGUgPSBhY2NlcHRlZENvZGU7Ci0gICAgICAgIG1Db25uZWN0ZWRDb2RlID0gY29ubmVjdGVkQ29kZTsKLSAgICAgICAgbUNsb3NlZENvZGUgPSBjbG9zZWRDb2RlOwotICAgICAgICBtV2FrZUxvY2sgPSBwbS5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssICJTY29Tb2NrZXQiKTsKLSAgICAgICAgbVdha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOwotICAgICAgICBpZiAoVkRCRykgbG9nKHRoaXMgKyAiIFNDTyBPQkpFQ1QgQ1RPUiIpOwotICAgIH0KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGluaXROYXRpdmUoKTsKLQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoVkRCRykgbG9nKHRoaXMgKyAiIFNDTyBPQkpFQ1QgRFRPUiIpOwotICAgICAgICAgICAgZGVzdHJveU5hdGl2ZSgpOwotICAgICAgICAgICAgcmVsZWFzZVdha2VMb2NrTm93KCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZGVzdHJveU5hdGl2ZSgpOwotCi0gICAgLyoqIENvbm5lY3QgdGhpcyBTQ08gc29ja2V0IHRvIHRoZSBnaXZlbiBCVCBhZGRyZXNzLgotICAgICAqICBEb2VzIG5vdCBibG9jay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29ubmVjdChTdHJpbmcgYWRkcmVzcywgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0KCkgIiArIHRoaXMpOwotICAgICAgICBpZiAobVN0YXRlICE9IFNUQVRFX1JFQURZKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSBsb2coImNvbm5lY3QoKTogQmFkIHN0YXRlIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgYWNxdWlyZVdha2VMb2NrKCk7Ci0gICAgICAgIGlmIChjb25uZWN0TmF0aXZlKGFkZHJlc3MsIG5hbWUpKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DT05ORUNUSU5HOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DTE9TRUQ7Ci0gICAgICAgICAgICByZWxlYXNlV2FrZUxvY2tOb3coKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGNvbm5lY3ROYXRpdmUoU3RyaW5nIGFkZHJlc3MsIFN0cmluZyBuYW1lKTsKLQotICAgIC8qKiBBY2NlcHQgaW5jb21pbmcgU0NPIGNvbm5lY3Rpb25zLgotICAgICAqICBEb2VzIG5vdCBibG9jay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gYWNjZXB0KCkgewotICAgICAgICBpZiAoVkRCRykgbG9nKCJhY2NlcHQoKSAiICsgdGhpcyk7Ci0gICAgICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfUkVBRFkpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIGxvZygiQmFkIHN0YXRlIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFjY2VwdE5hdGl2ZSgpKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9BQ0NFUFQ7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NMT1NFRDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGFjY2VwdE5hdGl2ZSgpOwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgewotICAgICAgICBpZiAoREJHKSBsb2codGhpcyArICIgU0NPIE9CSkVDVCBjbG9zZSgpIG1TdGF0ZSA9ICIgKyBtU3RhdGUpOwotICAgICAgICBhY3F1aXJlV2FrZUxvY2soKTsKLSAgICAgICAgbVN0YXRlID0gU1RBVEVfQ0xPU0VEOwotICAgICAgICBjbG9zZU5hdGl2ZSgpOwotICAgICAgICByZWxlYXNlV2FrZUxvY2soKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBjbG9zZU5hdGl2ZSgpOwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0U3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtU3RhdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBvbkNvbm5lY3RlZChpbnQgcmVzdWx0KSB7Ci0gICAgICAgIGlmIChWREJHKSBsb2codGhpcyArICIgb25Db25uZWN0ZWQoKSBtU3RhdGUgPSAiICsgbVN0YXRlICsgIiAiICsgdGhpcyk7Ci0gICAgICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQ09OTkVDVElORykgewotICAgICAgICAgICAgaWYgKERCRykgbG9nKCJTdHJhbmdlIHN0YXRlLCBjbG9zaW5nICIgKyBtU3RhdGUgKyAiICIgKyB0aGlzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzdWx0ID49IDApIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NPTk5FQ1RFRDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NMT1NFRDsKLSAgICAgICAgfQotICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKG1Db25uZWN0ZWRDb2RlLCBtU3RhdGUsIC0xLCB0aGlzKS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgcmVsZWFzZVdha2VMb2NrTm93KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBvbkFjY2VwdGVkKGludCByZXN1bHQpIHsKLSAgICAgICAgaWYgKFZEQkcpIGxvZygib25BY2NlcHRlZCgpICIgKyB0aGlzKTsKLSAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9BQ0NFUFQpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIGxvZygiU3RyYW5nZSBzdGF0ZSAiICsgdGhpcyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdCA+PSAwKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DT05ORUNURUQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DTE9TRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShtQWNjZXB0ZWRDb2RlLCBtU3RhdGUsIC0xLCB0aGlzKS5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIG9uQ2xvc2VkKCkgewotICAgICAgICBpZiAoREJHKSBsb2coIm9uQ2xvc2VkKCkgIiArIHRoaXMpOwotICAgICAgICBpZiAobVN0YXRlICE9IFNUQVRFX0NMT1NFRCkgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQ0xPU0VEOwotICAgICAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShtQ2xvc2VkQ29kZSwgbVN0YXRlLCAtMSwgdGhpcykuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgICAgICByZWxlYXNlV2FrZUxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhY3F1aXJlV2FrZUxvY2soKSB7Ci0gICAgICAgIGlmICghbVdha2VMb2NrLmlzSGVsZCgpKSB7Ci0gICAgICAgICAgICBtV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgaWYgKFZEQkcpIGxvZygibVdha2VMb2NrLmFjcXVpcmUoKSAiICsgdGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVsZWFzZVdha2VMb2NrKCkgewotICAgICAgICBpZiAobVdha2VMb2NrLmlzSGVsZCgpKSB7Ci0gICAgICAgICAgICAvLyBLZWVwIGFwcHMgcHJvY2Vzc29yIGF3YWtlIGZvciBhIGZ1cnRoZXIgMiBzZWNvbmRzLgotICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gcmVzb2x2ZSBpc3N1ZSBodHRwOi8vYi8xNjE2MjYzIC0gaW4gd2hpY2gKLSAgICAgICAgICAgIC8vIHdlIGFyZSBsZWZ0IGluIGEgODAgbUEgcG93ZXIgc3RhdGUgd2hlbiByZW1vdGVseSB0ZXJtaW5hdGluZyBhCi0gICAgICAgICAgICAvLyBjYWxsIHdoaWxlIGNvbm5lY3RlZCB0byBCVCBoZWFkc2V0ICJIVEMgQkggUzEwMCAiIHdpdGggQTJEUCBhbmQKLSAgICAgICAgICAgIC8vIEhGUCBwcm9maWxlcy4KLSAgICAgICAgICAgIGlmIChWREJHKSBsb2coIm1XYWtlTG9jay5yZWxlYXNlKCkgaW4gMiBzZWMiICsgdGhpcyk7Ci0gICAgICAgICAgICBtV2FrZUxvY2suYWNxdWlyZSgyMDAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWxlYXNlV2FrZUxvY2tOb3coKSB7Ci0gICAgICAgIGlmIChtV2FrZUxvY2suaXNIZWxkKCkpIHsKLSAgICAgICAgICAgIGlmIChWREJHKSBsb2coIm1XYWtlTG9jay5yZWxlYXNlKCkgbm93IiArIHRoaXMpOwotICAgICAgICAgICAgbVdha2VMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBMb2cuZChUQUcsIG1zZyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Bc3luY1Rhc2tMb2FkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQXN5bmNUYXNrTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5YzA3MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQXN5bmNUYXNrTG9hZGVyLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworCisvKioKKyAqIEFic3RyYWN0IExvYWRlciB0aGF0IHByb3ZpZGVzIGFuIHtAbGluayBBc3luY1Rhc2t9IHRvIGRvIHRoZSB3b3JrLgorICoKKyAqIEBwYXJhbSA8RD4gdGhlIGRhdGEgdHlwZSB0byBiZSBsb2FkZWQuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBc3luY1Rhc2tMb2FkZXI8RD4gZXh0ZW5kcyBMb2FkZXI8RD4geworICAgIGZpbmFsIGNsYXNzIExvYWRUYXNrIGV4dGVuZHMgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIEQ+IHsKKworICAgICAgICBwcml2YXRlIEQgcmVzdWx0OworCisgICAgICAgIC8qIFJ1bnMgb24gYSB3b3JrZXIgdGhyZWFkICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgRCBkb0luQmFja2dyb3VuZChWb2lkLi4uIHBhcmFtcykgeworICAgICAgICAgICAgcmVzdWx0ID0gQXN5bmNUYXNrTG9hZGVyLnRoaXMubG9hZEluQmFja2dyb3VuZCgpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJ1bnMgb24gdGhlIFVJIHRocmVhZCAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShEIGRhdGEpIHsKKyAgICAgICAgICAgIEFzeW5jVGFza0xvYWRlci50aGlzLmRpc3BhdGNoT25Mb2FkQ29tcGxldGUoZGF0YSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25DYW5jZWxsZWQoKSB7CisgICAgICAgICAgICBBc3luY1Rhc2tMb2FkZXIudGhpcy5vbkNhbmNlbGxlZChyZXN1bHQpOworICAgICAgICB9CisgICAgfQorCisgICAgTG9hZFRhc2sgbVRhc2s7CisKKyAgICBwdWJsaWMgQXN5bmNUYXNrTG9hZGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JjZSBhbiBhc3luY2hyb25vdXMgbG9hZC4gVW5saWtlIHtAbGluayAjc3RhcnRMb2FkaW5nKCl9IHRoaXMgd2lsbCBpZ25vcmUgYSBwcmV2aW91c2x5CisgICAgICogbG9hZGVkIGRhdGEgc2V0IGFuZCBsb2FkIGEgbmV3IG9uZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmb3JjZUxvYWQoKSB7CisgICAgICAgIGNhbmNlbExvYWQoKTsKKyAgICAgICAgbVRhc2sgPSBuZXcgTG9hZFRhc2soKTsKKyAgICAgICAgbVRhc2suZXhlY3V0ZSgoVm9pZFtdKSBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRlbXB0IHRvIGNhbmNlbCB0aGUgY3VycmVudCBsb2FkIHRhc2suIFNlZSB7QGxpbmsgQXN5bmNUYXNrI2NhbmNlbChib29sZWFuKX0KKyAgICAgKiBmb3IgbW9yZSBpbmZvLgorICAgICAqCisgICAgICogQHJldHVybiA8dHQ+ZmFsc2U8L3R0PiBpZiB0aGUgdGFzayBjb3VsZCBub3QgYmUgY2FuY2VsZWQsCisgICAgICogICAgICAgICB0eXBpY2FsbHkgYmVjYXVzZSBpdCBoYXMgYWxyZWFkeSBjb21wbGV0ZWQgbm9ybWFsbHksIG9yCisgICAgICogICAgICAgICBiZWNhdXNlIHtAbGluayAjc3RhcnRMb2FkaW5nKCl9IGhhc24ndCBiZWVuIGNhbGxlZCwgYW5kCisgICAgICogICAgICAgICA8dHQ+dHJ1ZTwvdHQ+IG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNhbmNlbExvYWQoKSB7CisgICAgICAgIGlmIChtVGFzayAhPSBudWxsKSB7CisgICAgICAgICAgICBib29sZWFuIGNhbmNlbGxlZCA9IG1UYXNrLmNhbmNlbChmYWxzZSk7CisgICAgICAgICAgICBtVGFzayA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gY2FuY2VsbGVkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgaWYgdGhlIHRhc2sgd2FzIGNhbmNlbGVkIGJlZm9yZSBpdCB3YXMgY29tcGxldGVkLiAgR2l2ZXMgdGhlIGNsYXNzIGEgY2hhbmNlCisgICAgICogdG8gcHJvcGVybHkgZGlzcG9zZSBvZiB0aGUgcmVzdWx0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQ2FuY2VsbGVkKEQgZGF0YSkgeworICAgIH0KKworICAgIHZvaWQgZGlzcGF0Y2hPbkxvYWRDb21wbGV0ZShEIGRhdGEpIHsKKyAgICAgICAgbVRhc2sgPSBudWxsOworICAgICAgICBkZWxpdmVyUmVzdWx0KGRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBvbiBhIHdvcmtlciB0aHJlYWQgdG8gcGVyZm9ybSB0aGUgYWN0dWFsIGxvYWQuIEltcGxlbWVudGF0aW9ucyBzaG91bGQgbm90IGRlbGl2ZXIgdGhlCisgICAgICogcmVzdWx0cyBkaXJlY3RseSwgYnV0IHNob3VsZCByZXR1cm4gdGhlbSBmcm9tIHRoaXMgbWV0aG9kLCB3aGljaCB3aWxsIGV2ZW50dWFsbHkgZW5kIHVwCisgICAgICogY2FsbGluZyBkZWxpdmVyUmVzdWx0IG9uIHRoZSBVSSB0aHJlYWQuIElmIGltcGxlbWVudGF0aW9ucyBuZWVkIHRvIHByb2Nlc3MKKyAgICAgKiB0aGUgcmVzdWx0cyBvbiB0aGUgVUkgdGhyZWFkIHRoZXkgbWF5IG92ZXJyaWRlIGRlbGl2ZXJSZXN1bHQgYW5kIGRvIHNvCisgICAgICogdGhlcmUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxvYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgRCBsb2FkSW5CYWNrZ3JvdW5kKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEYXRhLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEYXRhLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjMTJjZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERhdGEuYWlkbApAQCAtMCwwICsxLDE5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitwYXJjZWxhYmxlIENsaXBEYXRhOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGF0YS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOWIxMzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEYXRhLmphdmEKQEAgLTAsMCArMSw0OTQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBSZXByZXNlbnRhdGlvbiBvZiBhIGNsaXBwZWQgZGF0YSBvbiB0aGUgY2xpcGJvYXJkLgorICoKKyAqIDxwPkNsaXBwZWREYXRhIGlzIGEgY29tcGxleCB0eXBlIGNvbnRhaW5pbmcgb25lIG9yIEl0ZW0gaW5zdGFuY2VzLAorICogZWFjaCBvZiB3aGljaCBjYW4gaG9sZCBvbmUgb3IgbW9yZSByZXByZXNlbnRhdGlvbnMgb2YgYW4gaXRlbSBvZiBkYXRhLgorICogRm9yIGRpc3BsYXkgdG8gdGhlIHVzZXIsIGl0IGFsc28gaGFzIGEgbGFiZWwgYW5kIGljb25pYyByZXByZXNlbnRhdGlvbi48L3A+CisgKgorICogPHA+QSBDbGlwRGF0YSBpcyBhIHN1Yi1jbGFzcyBvZiB7QGxpbmsgQ2xpcERlc2NyaXB0aW9ufSwgd2hpY2ggZGVzY3JpYmVzCisgKiBpbXBvcnRhbnQgbWV0YS1kYXRhIGFib3V0IHRoZSBjbGlwLiAgSW4gcGFydGljdWxhciwgaXRzIHtAbGluayAjZ2V0TWltZVR5cGUoaW50KX0KKyAqIG11c3QgcmV0dXJuIGNvcnJlY3QgTUlNRSB0eXBlKHMpIGRlc2NyaWJpbmcgdGhlIGRhdGEgaW4gdGhlIGNsaXAuICBGb3IgaGVscAorICogaW4gY29ycmVjdGx5IGNvbnN0cnVjdGluZyBhIGNsaXAgd2l0aCB0aGUgY29ycmVjdCBNSU1FIHR5cGUsIHVzZQorICoge0BsaW5rICNuZXdQbGFpblRleHQoQ2hhclNlcXVlbmNlLCBCaXRtYXAsIENoYXJTZXF1ZW5jZSl9LAorICoge0BsaW5rICNuZXdVcmkoQ29udGVudFJlc29sdmVyLCBDaGFyU2VxdWVuY2UsIEJpdG1hcCwgVXJpKX0sIGFuZAorICoge0BsaW5rICNuZXdJbnRlbnQoQ2hhclNlcXVlbmNlLCBCaXRtYXAsIEludGVudCl9LgorICoKKyAqIDxwPkVhY2ggSXRlbSBpbnN0YW5jZSBjYW4gYmUgb25lIG9mIHRocmVlIG1haW4gY2xhc3NlcyBvZiBkYXRhOiBhIHNpbXBsZQorICogQ2hhclNlcXVlbmNlIG9mIHRleHQsIGEgc2luZ2xlIEludGVudCBvYmplY3QsIG9yIGEgVXJpLiAgU2VlIHtAbGluayBJdGVtfQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiA8YSBuYW1lPSJJbXBsZW1lbnRpbmdQYXN0ZSI+PC9hPgorICogPGgzPkltcGxlbWVudGluZyBQYXN0ZSBvciBEcm9wPC9oMz4KKyAqCisgKiA8cD5UbyBpbXBsZW1lbnQgYSBwYXN0ZSBvciBkcm9wIG9mIGEgQ2xpcHBlZERhdGEgb2JqZWN0IGludG8gYW4gYXBwbGljYXRpb24sCisgKiB0aGUgYXBwbGljYXRpb24gbXVzdCBjb3JyZWN0bHkgaW50ZXJwcmV0IHRoZSBkYXRhIGZvciBpdHMgdXNlLiAgSWYgdGhlIHtAbGluayBJdGVtfQorICogaXQgY29udGFpbnMgaXMgc2ltcGxlIHRleHQgb3IgYW4gSW50ZW50LCB0aGVyZSBpcyBsaXR0bGUgdG8gYmUgZG9uZTogdGV4dAorICogY2FuIG9ubHkgYmUgaW50ZXJwcmV0ZWQgYXMgdGV4dCwgYW5kIGFuIEludGVudCB3aWxsIHR5cGljYWxseSBiZSB1c2VkIGZvcgorICogY3JlYXRpbmcgc2hvcnRjdXRzIChzdWNoIGFzIHBsYWNpbmcgaWNvbnMgb24gdGhlIGhvbWUgc2NyZWVuKSBvciBvdGhlcgorICogYWN0aW9ucy4KKyAqCisgKiA8cD5JZiBhbGwgeW91IHdhbnQgaXMgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsaXBwZWQgZGF0YSwgeW91CisgKiBjYW4gdXNlIHRoZSBjb252ZW5pZW5jZSBtZXRob2Qge0BsaW5rIEl0ZW0jY29lcmNlVG9UZXh0IEl0ZW0uY29lcmNlVG9UZXh0fS4KKyAqIEluIHRoaXMgY2FzZSB0aGVyZSBpcyBnZW5lcmFsbHkgbm8gbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgTUlNRSB0eXBlcworICogcmVwb3J0ZWQgYnkge0BsaW5rICNnZXRNaW1lVHlwZShpbnQpfSwgc2luY2UgYW55IGNsaXAgaXRlbSBhbiBhbHdheXMgYmUKKyAqIGNvbnZlcnRlZCB0byBhIHN0cmluZy4KKyAqCisgKiA8cD5Nb3JlIGNvbXBsaWNhdGVkIGV4Y2hhbmdlcyB3aWxsIGJlIGRvbmUgdGhyb3VnaCBVUklzLCBpbiBwYXJ0aWN1bGFyCisgKiAiY29udGVudDoiIFVSSXMuICBBIGNvbnRlbnQgVVJJIGFsbG93cyB0aGUgcmVjaXBpZW50IG9mIGEgQ2xpcHBlZERhdGEgaXRlbQorICogdG8gaW50ZXJhY3QgY2xvc2VseSB3aXRoIHRoZSBDb250ZW50UHJvdmlkZXIgaG9sZGluZyB0aGUgZGF0YSBpbiBvcmRlciB0bworICogbmVnb3RpYXRlIHRoZSB0cmFuc2ZlciBvZiB0aGF0IGRhdGEuICBUaGUgY2xpcCBtdXN0IGFsc28gYmUgZmlsbGVkIGluIHdpdGgKKyAqIHRoZSBhdmFpbGFibGUgTUlNRSB0eXBlczsge0BsaW5rICNuZXdVcmkoQ29udGVudFJlc29sdmVyLCBDaGFyU2VxdWVuY2UsIEJpdG1hcCwgVXJpKX0KKyAqIHdpbGwgdGFrZSBjYXJlIG9mIGNvcnJlY3RseSBkb2luZyB0aGlzLgorICoKKyAqIDxwPkZvciBleGFtcGxlLCBoZXJlIGlzIHRoZSBwYXN0ZSBmdW5jdGlvbiBvZiBhIHNpbXBsZSBOb3RlUGFkIGFwcGxpY2F0aW9uLgorICogV2hlbiByZXRyaWV2aW5nIHRoZSBkYXRhIGZyb20gdGhlIGNsaXBib2FyZCwgaXQgY2FuIGRvIGVpdGhlciB0d28gdGhpbmdzOgorICogaWYgdGhlIGNsaXBib2FyZCBjb250YWlucyBhIFVSSSByZWZlcmVuY2UgdG8gYW4gZXhpc3Rpbmcgbm90ZSwgaXQgY29waWVzCisgKiB0aGUgZW50aXJlIHN0cnVjdHVyZSBvZiB0aGUgbm90ZSBpbnRvIGEgbmV3IG5vdGU7IG90aGVyd2lzZSwgaXQgc2ltcGx5CisgKiBjb2VyY2VzIHRoZSBjbGlwIGludG8gdGV4dCBhbmQgdXNlcyB0aGF0IGFzIHRoZSBuZXcgbm90ZSdzIGNvbnRlbnRzLgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVFZGl0b3IuamF2YQorICogICAgICBwYXN0ZX0KKyAqCisgKiA8cD5JbiBtYW55IGNhc2VzIGFuIGFwcGxpY2F0aW9uIGNhbiBwYXN0ZSB2YXJpb3VzIHR5cGVzIG9mIHN0cmVhbXMgb2YgZGF0YS4gIEZvcgorICogZXhhbXBsZSwgYW4gZS1tYWlsIGFwcGxpY2F0aW9uIG1heSB3YW50IHRvIGFsbG93IHRoZSB1c2VyIHRvIHBhc3RlIGFuIGltYWdlCisgKiBvciBvdGhlciBiaW5hcnkgZGF0YSBhcyBhbiBhdHRhY2htZW50LiAgVGhpcyBpcyBhY2NvbXBsaXNoZWQgdGhyb3VnaCB0aGUKKyAqIENvbnRlbnRSZXNvbHZlciB7QGxpbmsgQ29udGVudFJlc29sdmVyI2dldFN0cmVhbVR5cGVzKFVyaSwgU3RyaW5nKX0gYW5kCisgKiB7QGxpbmsgQ29udGVudFJlc29sdmVyI29wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3IoVXJpLCBTdHJpbmcsIGFuZHJvaWQub3MuQnVuZGxlKX0KKyAqIG1ldGhvZHMuICBUaGVzZSBhbGxvdyBhIGNsaWVudCB0byBkaXNjb3ZlciB0aGUgdHlwZShzKSBvZiBkYXRhIHRoYXQgYSBwYXJ0aWN1bGFyCisgKiBjb250ZW50IFVSSSBjYW4gbWFrZSBhdmFpbGFibGUgYXMgYSBzdHJlYW0gYW5kIHJldHJpZXZlIHRoZSBzdHJlYW0gb2YgZGF0YS4KKyAqCisgKiA8cD5Gb3IgZXhhbXBsZSwgdGhlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJdGVtI2NvZXJjZVRvVGV4dCBJdGVtLmNvZXJjZVRvVGV4dH0KKyAqIGl0c2VsZiB1c2VzIHRoaXMgdG8gdHJ5IHRvIHJldHJpZXZlIGEgVVJJIGNsaXAgYXMgYSBzdHJlYW0gb2YgdGV4dDoKKyAqCisgKiB7QHNhbXBsZSBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGF0YS5qYXZhIGNvZXJjZVRvVGV4dH0KKyAqCisgKiA8YSBuYW1lPSJJbXBsZW1lbnRpbmdDb3B5Ij48L2E+CisgKiA8aDM+SW1wbGVtZW50aW5nIENvcHkgb3IgRHJhZzwvaDM+CisgKgorICogPHA+VG8gYmUgdGhlIHNvdXJjZSBvZiBhIGNsaXAsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGNvbnN0cnVjdCBhIENsaXBwZWREYXRhCisgKiBvYmplY3QgdGhhdCBhbnkgcmVjaXBpZW50IGNhbiBpbnRlcnByZXQgYmVzdCBmb3IgdGhlaXIgY29udGV4dC4gIElmIHRoZSBjbGlwCisgKiBpcyB0byBjb250YWluIGEgc2ltcGxlIHRleHQsIEludGVudCwgb3IgVVJJLCB0aGlzIGlzIGVhc3k6IGFuIHtAbGluayBJdGVtfQorICogY29udGFpbmluZyB0aGUgYXBwcm9wcmlhdGUgZGF0YSB0eXBlIGNhbiBiZSBjb25zdHJ1Y3RlZCBhbmQgdXNlZC4KKyAqCisgKiA8cD5Nb3JlIGNvbXBsaWNhdGVkIGRhdGEgdHlwZXMgcmVxdWlyZSB0aGUgaW1wbGVtZW50YXRpb24gb2Ygc3VwcG9ydCBpbgorICogYSBDb250ZW50UHJvdmlkZXIgZm9yIGRlc2NyaWJpbmcgYW5kIGdlbmVyYXRpbmcgdGhlIGRhdGEgZm9yIHRoZSByZWNpcGllbnQuCisgKiBBIGNvbW1vbiBzY2VuYXJpbyBpcyBvbmUgd2hlcmUgYW4gYXBwbGljYXRpb24gcGxhY2VzIG9uIHRoZSBjbGlwYm9hcmQgdGhlCisgKiBjb250ZW50OiBVUkkgb2YgYW4gb2JqZWN0IHRoYXQgdGhlIHVzZXIgaGFzIGNvcGllZCwgd2l0aCB0aGUgZGF0YSBhdCB0aGF0CisgKiBVUkkgY29uc2lzdGluZyBvZiBhIGNvbXBsaWNhdGVkIHN0cnVjdHVyZSB0aGF0IG9ubHkgb3RoZXIgYXBwbGljYXRpb25zIHdpdGgKKyAqIGRpcmVjdCBrbm93bGVkZ2Ugb2YgdGhlIHN0cnVjdHVyZSBjYW4gdXNlLgorICoKKyAqIDxwPkZvciBhcHBsaWNhdGlvbnMgdGhhdCBkbyBub3QgaGF2ZSBpbnRyaW5zaWMga25vd2xlZGdlIG9mIHRoZSBkYXRhIHN0cnVjdHVyZSwKKyAqIHRoZSBjb250ZW50IHByb3ZpZGVyIGhvbGRpbmcgaXQgY2FuIG1ha2UgdGhlIGRhdGEgYXZhaWxhYmxlIGFzIGFuIGFyYml0cmFyeQorICogbnVtYmVyIG9mIHR5cGVzIG9mIGRhdGEgc3RyZWFtcy4gIFRoaXMgaXMgZG9uZSBieSBpbXBsZW1lbnRpbmcgdGhlCisgKiBDb250ZW50UHJvdmlkZXIge0BsaW5rIENvbnRlbnRQcm92aWRlciNnZXRTdHJlYW1UeXBlcyhVcmksIFN0cmluZyl9IGFuZAorICoge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuVHlwZWRBc3NldEZpbGUoVXJpLCBTdHJpbmcsIGFuZHJvaWQub3MuQnVuZGxlKX0KKyAqIG1ldGhvZHMuCisgKgorICogPHA+R29pbmcgYmFjayB0byBvdXIgc2ltcGxlIE5vdGVQYWQgYXBwbGljYXRpb24sIHRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uCisgKiBpdCBtYXkgaGF2ZSB0byBjb252ZXJ0IGEgc2luZ2xlIG5vdGUgVVJJIChjb25zaXN0aW5nIG9mIGEgdGl0bGUgYW5kIHRoZSBub3RlCisgKiB0ZXh0KSBpbnRvIGEgc3RyZWFtIG9mIHBsYWluIHRleHQgZGF0YS4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlUGFkUHJvdmlkZXIuamF2YQorICogICAgICBzdHJlYW19CisgKgorICogPHA+VGhlIGNvcHkgb3BlcmF0aW9uIGluIG91ciBOb3RlUGFkIGFwcGxpY2F0aW9uIGlzIG5vdyBqdXN0IGEgc2ltcGxlIG1hdHRlcgorICogb2YgbWFraW5nIGEgY2xpcCBjb250YWluaW5nIHRoZSBVUkkgb2YgdGhlIG5vdGUgYmVpbmcgY29waWVkOgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVzTGlzdC5qYXZhCisgKiAgICAgIGNvcHl9CisgKgorICogPHA+Tm90ZSBpZiBhIHBhc3RlIG9wZXJhdGlvbiBuZWVkcyB0aGlzIGNsaXAgYXMgdGV4dCAoZm9yIGV4YW1wbGUgdG8gcGFzdGUKKyAqIGludG8gYW4gZWRpdG9yKSwgdGhlbiB7QGxpbmsgSXRlbSNjb2VyY2VUb1RleHQoQ29udGV4dCl9IHdpbGwgYXNrIHRoZSBjb250ZW50CisgKiBwcm92aWRlciBmb3IgdGhlIGNsaXAgVVJJIGFzIHRleHQgYW5kIHN1Y2Nlc3NmdWxseSBwYXN0ZSB0aGUgZW50aXJlIG5vdGUuCisgKi8KK3B1YmxpYyBjbGFzcyBDbGlwRGF0YSBleHRlbmRzIENsaXBEZXNjcmlwdGlvbiB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE1JTUVUWVBFU19URVhUX1BMQUlOID0gbmV3IFN0cmluZ1tdIHsgTUlNRVRZUEVfVEVYVF9QTEFJTiB9OworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBNSU1FVFlQRVNfVEVYVF9VUklMSVNUID0gbmV3IFN0cmluZ1tdIHsgTUlNRVRZUEVfVEVYVF9VUklMSVNUIH07CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE1JTUVUWVBFU19URVhUX0lOVEVOVCA9IG5ldyBTdHJpbmdbXSB7IE1JTUVUWVBFX1RFWFRfSU5URU5UIH07CisKKyAgICBmaW5hbCBCaXRtYXAgbUljb247CisKKyAgICBmaW5hbCBBcnJheUxpc3Q8SXRlbT4gbUl0ZW1zID0gbmV3IEFycmF5TGlzdDxJdGVtPigpOworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpb24gb2YgYSBzaW5nbGUgaXRlbSBpbiBhIENsaXBwZWREYXRhLgorICAgICAqCisgICAgICogPHA+VGhlIHR5cGVzIHRoYW4gYW4gaW5kaXZpZHVhbCBpdGVtIGNhbiBjdXJyZW50bHkgY29udGFpbiBhcmU6PC9wPgorICAgICAqCisgICAgICogPHVsPgorICAgICAqIDxsaT4gVGV4dDogYSBiYXNpYyBzdHJpbmcgb2YgdGV4dC4gIFRoaXMgaXMgYWN0dWFsbHkgYSBDaGFyU2VxdWVuY2UsCisgICAgICogc28gaXQgY2FuIGJlIGZvcm1hdHRlZCB0ZXh0IHN1cHBvcnRlZCBieSBjb3JyZXNwb25kaW5nIEFuZHJvaWQgYnVpbHQtaW4KKyAgICAgKiBzdHlsZSBzcGFucy4gIChDdXN0b20gYXBwbGljYXRpb24gc3BhbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUKKyAgICAgKiBzdHJpcHBlZCB3aGVuIHRyYW5zcG9ydGluZyB0aHJvdWdoIHRoZSBjbGlwYm9hcmQuKQorICAgICAqIDxsaT4gSW50ZW50OiBhbiBhcmJpdHJhcnkgSW50ZW50IG9iamVjdC4gIEEgdHlwaWNhbCB1c2UgaXMgdGhlIHNob3J0Y3V0CisgICAgICogdG8gY3JlYXRlIHdoZW4gcGFzdGluZyBhIGNsaXBwZWQgaXRlbSBvbiB0byB0aGUgaG9tZSBzY3JlZW4uCisgICAgICogPGxpPiBVcmk6IGEgVVJJIHJlZmVyZW5jZS4gIFRoaXMgbWF5IGJlIGFueSBVUkkgKHN1Y2ggYXMgYW4gaHR0cDogVVJJCisgICAgICogcmVwcmVzZW50aW5nIGEgYm9va21hcmspLCBob3dldmVyIGl0IGlzIG9mdGVuIGEgY29udGVudDogVVJJLiAgVXNpbmcKKyAgICAgKiBjb250ZW50IHByb3ZpZGVyIHJlZmVyZW5jZXMgYXMgY2xpcHMgbGlrZSB0aGlzIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0bworICAgICAqIHNoYXJlIGNvbXBsZXggb3IgbGFyZ2UgY2xpcHMgdGhyb3VnaCB0aGUgc3RhbmRhcmQgY29udGVudCBwcm92aWRlcgorICAgICAqIGZhY2lsaXRpZXMuCisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEl0ZW0geworICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2UgbVRleHQ7CisgICAgICAgIGZpbmFsIEludGVudCBtSW50ZW50OworICAgICAgICBmaW5hbCBVcmkgbVVyaTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGFuIEl0ZW0gY29uc2lzdGluZyBvZiBhIHNpbmdsZSBibG9jayBvZiAocG9zc2libHkgc3R5bGVkKSB0ZXh0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEl0ZW0oQ2hhclNlcXVlbmNlIHRleHQpIHsKKyAgICAgICAgICAgIG1UZXh0ID0gdGV4dDsKKyAgICAgICAgICAgIG1JbnRlbnQgPSBudWxsOworICAgICAgICAgICAgbVVyaSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGFuIEl0ZW0gY29uc2lzdGluZyBvZiBhbiBhcmJpdHJhcnkgSW50ZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEl0ZW0oSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgbVRleHQgPSBudWxsOworICAgICAgICAgICAgbUludGVudCA9IGludGVudDsKKyAgICAgICAgICAgIG1VcmkgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbiBJdGVtIGNvbnNpc3Rpbmcgb2YgYW4gYXJiaXRyYXJ5IFVSSS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBJdGVtKFVyaSB1cmkpIHsKKyAgICAgICAgICAgIG1UZXh0ID0gbnVsbDsKKyAgICAgICAgICAgIG1JbnRlbnQgPSBudWxsOworICAgICAgICAgICAgbVVyaSA9IHVyaTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBjb21wbGV4IEl0ZW0sIGNvbnRhaW5pbmcgbXVsdGlwbGUgcmVwcmVzZW50YXRpb25zIG9mCisgICAgICAgICAqIHRleHQsIGludGVudCwgYW5kL29yIFVSSS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBJdGVtKENoYXJTZXF1ZW5jZSB0ZXh0LCBJbnRlbnQgaW50ZW50LCBVcmkgdXJpKSB7CisgICAgICAgICAgICBtVGV4dCA9IHRleHQ7CisgICAgICAgICAgICBtSW50ZW50ID0gaW50ZW50OworICAgICAgICAgICAgbVVyaSA9IHVyaTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXRyaWV2ZSB0aGUgcmF3IHRleHQgY29udGFpbmVkIGluIHRoaXMgSXRlbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXRyaWV2ZSB0aGUgcmF3IEludGVudCBjb250YWluZWQgaW4gdGhpcyBJdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEludGVudCBnZXRJbnRlbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUludGVudDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXRyaWV2ZSB0aGUgcmF3IFVSSSBjb250YWluZWQgaW4gdGhpcyBJdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFVyaSBnZXRVcmkoKSB7CisgICAgICAgICAgICByZXR1cm4gbVVyaTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUdXJuIHRoaXMgaXRlbSBpbnRvIHRleHQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHR5cGUgb2YgZGF0YSBpdAorICAgICAgICAgKiBhY3R1YWxseSBjb250YWlucy4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+VGhlIGFsZ29yaXRobSBmb3IgZGVjaWRpbmcgd2hhdCB0ZXh0IHRvIHJldHVybiBpczoKKyAgICAgICAgICogPHVsPgorICAgICAgICAgKiA8bGk+IElmIHtAbGluayAjZ2V0VGV4dH0gaXMgbm9uLW51bGwsIHJldHVybiB0aGF0LgorICAgICAgICAgKiA8bGk+IElmIHtAbGluayAjZ2V0VXJpfSBpcyBub24tbnVsbCwgdHJ5IHRvIHJldHJpZXZlIGl0cyBkYXRhCisgICAgICAgICAqIGFzIGEgdGV4dCBzdHJlYW0gZnJvbSBpdHMgY29udGVudCBwcm92aWRlci4gIElmIHRoaXMgc3VjY2VlZHMsIGNvcHkKKyAgICAgICAgICogdGhlIHRleHQgaW50byBhIFN0cmluZyBhbmQgcmV0dXJuIGl0LiAgSWYgaXQgaXMgbm90IGEgY29udGVudDogVVJJIG9yCisgICAgICAgICAqIHRoZSBjb250ZW50IHByb3ZpZGVyIGRvZXMgbm90IHN1cHBseSBhIHRleHQgcmVwcmVzZW50YXRpb24sIHJldHVybgorICAgICAgICAgKiB0aGUgcmF3IFVSSSBhcyBhIHN0cmluZy4KKyAgICAgICAgICogPGxpPiBJZiB7QGxpbmsgI2dldEludGVudH0gaXMgbm9uLW51bGwsIGNvbnZlcnQgdGhhdCB0byBhbiBpbnRlbnQ6CisgICAgICAgICAqIFVSSSBhbmQgcmV0dXJuaXQuCisgICAgICAgICAqIDxsaT4gT3RoZXJ3aXNlLCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgorICAgICAgICAgKiA8L3VsPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY2FsbGVyJ3MgQ29udGV4dCwgZnJvbSB3aGljaCBpdHMgQ29udGVudFJlc29sdmVyCisgICAgICAgICAqIGFuZCBvdGhlciB0aGluZ3MgY2FuIGJlIHJldHJpZXZlZC4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpdGVtJ3MgdGV4dHVhbCByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgICovCisvL0JFR0lOX0lOQ0xVREUoY29lcmNlVG9UZXh0KQorICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGNvZXJjZVRvVGV4dChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgSXRlbSBoYXMgYW4gZXhwbGljaXQgdGV4dHVhbCB2YWx1ZSwgc2ltcGx5IHJldHVybiB0aGF0LgorICAgICAgICAgICAgaWYgKG1UZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVRleHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIHRoaXMgSXRlbSBoYXMgYSBVUkkgdmFsdWUsIHRyeSB1c2luZyB0aGF0LgorICAgICAgICAgICAgaWYgKG1VcmkgIT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgLy8gRmlyc3Qgc2VlIGlmIHRoZSBVUkkgY2FuIGJlIG9wZW5lZCBhcyBhIHBsYWluIHRleHQgc3RyZWFtCisgICAgICAgICAgICAgICAgLy8gKG9mIGFueSBzdWItdHlwZSkuICBJZiBzbywgdGhpcyBpcyB0aGUgYmVzdCB0ZXh0dWFsCisgICAgICAgICAgICAgICAgLy8gcmVwcmVzZW50YXRpb24gZm9yIGl0LgorICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFzayBmb3IgYSBzdHJlYW0gb2YgdGhlIGRlc2lyZWQgdHlwZS4KKyAgICAgICAgICAgICAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBkZXNjciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAub3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcihtVXJpLCAidGV4dC8qIiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IGRlc2NyLmNyZWF0ZUlucHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0sICJVVEYtOCIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEdvdCBpdC4uLiAgY29weSB0aGUgc3RyZWFtIGludG8gYSBsb2NhbCBzdHJpbmcgYW5kIHJldHVybiBpdC4KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoMTI4KTsKKyAgICAgICAgICAgICAgICAgICAgY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyWzgxOTJdOworICAgICAgICAgICAgICAgICAgICBpbnQgbGVuOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGxlbj1yZWFkZXIucmVhZChidWZmZXIpKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGJ1ZmZlciwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVW5hYmxlIHRvIG9wZW4gY29udGVudCBVUkkgYXMgdGV4dC4uLiAgbm90IHJlYWxseSBhbgorICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciwganVzdCBzb21ldGhpbmcgdG8gaWdub3JlLgorCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBTb21ldGhpbmcgYmFkIGhhcyBoYXBwZW5lZC4KKyAgICAgICAgICAgICAgICAgICAgTG9nLncoIkNsaXBwZWREYXRhIiwgIkZhaWx1cmUgbG9hZGluZyB0ZXh0IiwgZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBjb3VsZG4ndCBvcGVuIHRoZSBVUkkgYXMgYSBzdHJlYW0sIHRoZW4gdGhlIFVSSSBpdHNlbGYKKyAgICAgICAgICAgICAgICAvLyBwcm9iYWJseSBzZXJ2ZXMgZmFpcmx5IHdlbGwgYXMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uLgorICAgICAgICAgICAgICAgIHJldHVybiBtVXJpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZpbmFsbHksIGlmIGFsbCB3ZSBoYXZlIGlzIGFuIEludGVudCwgdGhlbiB3ZSBjYW4ganVzdCB0dXJuIHRoYXQKKyAgICAgICAgICAgIC8vIGludG8gdGV4dC4gIE5vdCB0aGUgbW9zdCB1c2VyLWZyaWVuZGx5IHRoaW5nLCBidXQgaXQncyBzb21ldGhpbmcuCisgICAgICAgICAgICBpZiAobUludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1JbnRlbnQudG9VcmkoSW50ZW50LlVSSV9JTlRFTlRfU0NIRU1FKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2hvdWxkbid0IGdldCBoZXJlLCBidXQganVzdCBpbiBjYXNlLi4uCisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKy8vRU5EX0lOQ0xVREUoY29lcmNlVG9UZXh0KQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBjbGlwLgorICAgICAqCisgICAgICogQHBhcmFtIGxhYmVsIExhYmVsIHRvIHNob3cgdG8gdGhlIHVzZXIgZGVzY3JpYmluZyB0aGlzIGNsaXAuCisgICAgICogQHBhcmFtIG1pbWVUeXBlcyBBbiBhcnJheSBvZiBNSU1FIHR5cGVzIHRoaXMgZGF0YSBpcyBhdmFpbGFibGUgYXMuCisgICAgICogQHBhcmFtIGljb24gQml0bWFwIHByb3ZpZGluZyB0aGUgdXNlciB3aXRoIGFuIGljb25pbmcgcmVwcmVzZW50YXRpb24gb2YKKyAgICAgKiB0aGUgY2xpcC4KKyAgICAgKiBAcGFyYW0gaXRlbSBUaGUgY29udGVudHMgb2YgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGNsaXAuCisgICAgICovCisgICAgcHVibGljIENsaXBEYXRhKENoYXJTZXF1ZW5jZSBsYWJlbCwgU3RyaW5nW10gbWltZVR5cGVzLCBCaXRtYXAgaWNvbiwgSXRlbSBpdGVtKSB7CisgICAgICAgIHN1cGVyKGxhYmVsLCBtaW1lVHlwZXMpOworICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIml0ZW0gaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1JY29uID0gaWNvbjsKKyAgICAgICAgbUl0ZW1zLmFkZChpdGVtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgQ2xpcERhdGEgaG9sZGluZyBkYXRhIG9mIHRoZSB0eXBlIHtAbGluayAjTUlNRVRZUEVfVEVYVF9QTEFJTn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGFiZWwgVXNlci12aXNpYmxlIGxhYmVsIGZvciB0aGUgY2xpcCBkYXRhLgorICAgICAqIEBwYXJhbSBpY29uIEljb25pYyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xpcCBkYXRhLgorICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBhY3R1YWwgdGV4dCBpbiB0aGUgY2xpcC4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgQ2xpcERhdGEgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGRhdGEuCisgICAgICovCisgICAgc3RhdGljIHB1YmxpYyBDbGlwRGF0YSBuZXdQbGFpblRleHQoQ2hhclNlcXVlbmNlIGxhYmVsLCBCaXRtYXAgaWNvbiwgQ2hhclNlcXVlbmNlIHRleHQpIHsKKyAgICAgICAgSXRlbSBpdGVtID0gbmV3IEl0ZW0odGV4dCk7CisgICAgICAgIHJldHVybiBuZXcgQ2xpcERhdGEobGFiZWwsIE1JTUVUWVBFU19URVhUX1BMQUlOLCBpY29uLCBpdGVtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgQ2xpcERhdGEgaG9sZGluZyBhbiBJbnRlbnQgd2l0aCBNSU1FIHR5cGUge0BsaW5rICNNSU1FVFlQRV9URVhUX0lOVEVOVH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGFiZWwgVXNlci12aXNpYmxlIGxhYmVsIGZvciB0aGUgY2xpcCBkYXRhLgorICAgICAqIEBwYXJhbSBpY29uIEljb25pYyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xpcCBkYXRhLgorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGFjdHVhbCBJbnRlbnQgaW4gdGhlIGNsaXAuCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IENsaXBEYXRhIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBkYXRhLgorICAgICAqLworICAgIHN0YXRpYyBwdWJsaWMgQ2xpcERhdGEgbmV3SW50ZW50KENoYXJTZXF1ZW5jZSBsYWJlbCwgQml0bWFwIGljb24sIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgSXRlbSBpdGVtID0gbmV3IEl0ZW0oaW50ZW50KTsKKyAgICAgICAgcmV0dXJuIG5ldyBDbGlwRGF0YShsYWJlbCwgTUlNRVRZUEVTX1RFWFRfSU5URU5ULCBpY29uLCBpdGVtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgQ2xpcERhdGEgaG9sZGluZyBhIFVSSS4gIElmIHRoZSBVUkkgaXMgYSBjb250ZW50OiBVUkksCisgICAgICogdGhpcyB3aWxsIHF1ZXJ5IHRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgTUlNRSB0eXBlIG9mIGl0cyBkYXRhIGFuZAorICAgICAqIHVzZSB0aGF0IGFzIHRoZSBNSU1FIHR5cGUuICBPdGhlcndpc2UsIGl0IHdpbGwgdXNlIHRoZSBNSU1FIHR5cGUKKyAgICAgKiB7QGxpbmsgI01JTUVUWVBFX1RFWFRfVVJJTElTVH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb2x2ZXIgQ29udGVudFJlc29sdmVyIHVzZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBVUkkuCisgICAgICogQHBhcmFtIGxhYmVsIFVzZXItdmlzaWJsZSBsYWJlbCBmb3IgdGhlIGNsaXAgZGF0YS4KKyAgICAgKiBAcGFyYW0gaWNvbiBJY29uaWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsaXAgZGF0YS4KKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgaW4gdGhlIGNsaXAuCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IENsaXBEYXRhIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBkYXRhLgorICAgICAqLworICAgIHN0YXRpYyBwdWJsaWMgQ2xpcERhdGEgbmV3VXJpKENvbnRlbnRSZXNvbHZlciByZXNvbHZlciwgQ2hhclNlcXVlbmNlIGxhYmVsLAorICAgICAgICAgICAgQml0bWFwIGljb24sIFVyaSB1cmkpIHsKKyAgICAgICAgSXRlbSBpdGVtID0gbmV3IEl0ZW0odXJpKTsKKyAgICAgICAgU3RyaW5nW10gbWltZVR5cGVzID0gbnVsbDsKKyAgICAgICAgaWYgKCJjb250ZW50Ii5lcXVhbHModXJpLmdldFNjaGVtZSgpKSkgeworICAgICAgICAgICAgU3RyaW5nIHJlYWxUeXBlID0gcmVzb2x2ZXIuZ2V0VHlwZSh1cmkpOworICAgICAgICAgICAgbWltZVR5cGVzID0gcmVzb2x2ZXIuZ2V0U3RyZWFtVHlwZXModXJpLCAiKi8qIik7CisgICAgICAgICAgICBpZiAobWltZVR5cGVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVhbFR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZXMgPSBuZXcgU3RyaW5nW10geyByZWFsVHlwZSwgTUlNRVRZUEVfVEVYVF9VUklMSVNUIH07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSB0bXAgPSBuZXcgU3RyaW5nW21pbWVUeXBlcy5sZW5ndGggKyAocmVhbFR5cGUgIT0gbnVsbCA/IDIgOiAxKV07CisgICAgICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgICAgIGlmIChyZWFsVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcFswXSA9IHJlYWxUeXBlOworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobWltZVR5cGVzLCAwLCB0bXAsIGksIG1pbWVUeXBlcy5sZW5ndGgpOworICAgICAgICAgICAgICAgIHRtcFtpICsgbWltZVR5cGVzLmxlbmd0aF0gPSBNSU1FVFlQRV9URVhUX1VSSUxJU1Q7CisgICAgICAgICAgICAgICAgbWltZVR5cGVzID0gdG1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtaW1lVHlwZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgbWltZVR5cGVzID0gTUlNRVRZUEVTX1RFWFRfVVJJTElTVDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IENsaXBEYXRhKGxhYmVsLCBtaW1lVHlwZXMsIGljb24sIGl0ZW0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBDbGlwRGF0YSBob2xkaW5nIGFuIFVSSSB3aXRoIE1JTUUgdHlwZSB7QGxpbmsgI01JTUVUWVBFX1RFWFRfVVJJTElTVH0uCisgICAgICogVW5saWtlIHtAbGluayAjbmV3VXJpKENvbnRlbnRSZXNvbHZlciwgQ2hhclNlcXVlbmNlLCBCaXRtYXAsIFVyaSl9LCBub3RoaW5nCisgICAgICogaXMgaW5mZXJyZWQgYWJvdXQgdGhlIFVSSSAtLSBpZiBpdCBpcyBhIGNvbnRlbnQ6IFVSSSBob2xkaW5nIGEgYml0bWFwLAorICAgICAqIHRoZSByZXBvcnRlZCB0eXBlIHdpbGwgc3RpbGwgYmUgdXJpLWxpc3QuICBVc2UgdGhpcyB3aXRoIGNhcmUhCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGFiZWwgVXNlci12aXNpYmxlIGxhYmVsIGZvciB0aGUgY2xpcCBkYXRhLgorICAgICAqIEBwYXJhbSBpY29uIEljb25pYyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xpcCBkYXRhLgorICAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBpbiB0aGUgY2xpcC4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgQ2xpcERhdGEgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGRhdGEuCisgICAgICovCisgICAgc3RhdGljIHB1YmxpYyBDbGlwRGF0YSBuZXdSYXdVcmkoQ2hhclNlcXVlbmNlIGxhYmVsLCBCaXRtYXAgaWNvbiwgVXJpIHVyaSkgeworICAgICAgICBJdGVtIGl0ZW0gPSBuZXcgSXRlbSh1cmkpOworICAgICAgICByZXR1cm4gbmV3IENsaXBEYXRhKGxhYmVsLCBNSU1FVFlQRVNfVEVYVF9VUklMSVNULCBpY29uLCBpdGVtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJdGVtKEl0ZW0gaXRlbSkgeworICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIml0ZW0gaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1JdGVtcy5hZGQoaXRlbSk7CisgICAgfQorCisgICAgcHVibGljIEJpdG1hcCBnZXRJY29uKCkgeworICAgICAgICByZXR1cm4gbUljb247CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJdGVtQ291bnQoKSB7CisgICAgICAgIHJldHVybiBtSXRlbXMuc2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVtIGdldEl0ZW0oaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBtSXRlbXMuZ2V0KGluZGV4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBzdXBlci53cml0ZVRvUGFyY2VsKGRlc3QsIGZsYWdzKTsKKyAgICAgICAgaWYgKG1JY29uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoMSk7CisgICAgICAgICAgICBtSWNvbi53cml0ZVRvUGFyY2VsKGRlc3QsIGZsYWdzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoMCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IE4gPSBtSXRlbXMuc2l6ZSgpOworICAgICAgICBkZXN0LndyaXRlSW50KE4pOworICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICBJdGVtIGl0ZW0gPSBtSXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwoaXRlbS5tVGV4dCwgZGVzdCwgZmxhZ3MpOworICAgICAgICAgICAgaWYgKGl0ZW0ubUludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVzdC53cml0ZUludCgxKTsKKyAgICAgICAgICAgICAgICBpdGVtLm1JbnRlbnQud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXRlbS5tVXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlSW50KDEpOworICAgICAgICAgICAgICAgIGl0ZW0ubVVyaS53cml0ZVRvUGFyY2VsKGRlc3QsIGZsYWdzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVzdC53cml0ZUludCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIENsaXBEYXRhKFBhcmNlbCBpbikgeworICAgICAgICBzdXBlcihpbik7CisgICAgICAgIGlmIChpbi5yZWFkSW50KCkgIT0gMCkgeworICAgICAgICAgICAgbUljb24gPSBCaXRtYXAuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JY29uID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgTiA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICAgICAgSW50ZW50IGludGVudCA9IGluLnJlYWRJbnQoKSAhPSAwID8gSW50ZW50LkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbikgOiBudWxsOworICAgICAgICAgICAgVXJpIHVyaSA9IGluLnJlYWRJbnQoKSAhPSAwID8gVXJpLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbikgOiBudWxsOworICAgICAgICAgICAgbUl0ZW1zLmFkZChuZXcgSXRlbSh0ZXh0LCBpbnRlbnQsIHVyaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8Q2xpcERhdGE+IENSRUFUT1IgPQorICAgICAgICBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPENsaXBEYXRhPigpIHsKKworICAgICAgICAgICAgcHVibGljIENsaXBEYXRhIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpcERhdGEoc291cmNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIENsaXBEYXRhW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsaXBEYXRhW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGVzY3JpcHRpb24uYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERlc2NyaXB0aW9uLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxZmQ1YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERlc2NyaXB0aW9uLmFpZGwKQEAgLTAsMCArMSwxOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworcGFyY2VsYWJsZSBDbGlwRGVzY3JpcHRpb247CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEZXNjcmlwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGVzY3JpcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDlkODA3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGVzY3JpcHRpb24uamF2YQpAQCAtMCwwICsxLDIwNiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBNZXRhLWRhdGEgZGVzY3JpYmluZyB0aGUgY29udGVudHMgb2YgYSB7QGxpbmsgQ2xpcERhdGF9LiAgUHJvdmlkZXMgZW5vdWdoCisgKiBpbmZvcm1hdGlvbiB0byBrbm93IGlmIHlvdSBjYW4gaGFuZGxlIHRoZSBDbGlwRGF0YSwgYnV0IG5vdCB0aGUgZGF0YQorICogaXRzZWxmLgorICovCitwdWJsaWMgY2xhc3MgQ2xpcERlc2NyaXB0aW9uIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgLyoqCisgICAgICogVGhlIE1JTUUgdHlwZSBmb3IgYSBjbGlwIGhvbGRpbmcgcGxhaW4gdGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FVFlQRV9URVhUX1BMQUlOID0gInRleHQvcGxhaW4iOworCisgICAgLyoqCisgICAgICogVGhlIE1JTUUgdHlwZSBmb3IgYSBjbGlwIGhvbGRpbmcgb25lIG9yIG1vcmUgVVJJcy4gIFRoaXMgc2hvdWxkIGJlCisgICAgICogdXNlZCBmb3IgVVJJcyB0aGF0IGFyZSBtZWFuaW5nZnVsIHRvIGEgdXNlciAoc3VjaCBhcyBhbiBodHRwOiBVUkkpLgorICAgICAqIEl0IHNob3VsZCA8ZW0+bm90PC9lbT4gYmUgdXNlZCBmb3IgYSBjb250ZW50OiBVUkkgdGhhdCByZWZlcmVuY2VzIHNvbWUKKyAgICAgKiBvdGhlciBwaWVjZSBvZiBkYXRhOyBpbiB0aGF0IGNhc2UgdGhlIE1JTUUgdHlwZSBzaG91bGQgYmUgdGhlIHR5cGUKKyAgICAgKiBvZiB0aGUgcmVmZXJlbmNlZCBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVUWVBFX1RFWFRfVVJJTElTVCA9ICJ0ZXh0L3VyaS1saXN0IjsKKworICAgIC8qKgorICAgICAqIFRoZSBNSU1FIHR5cGUgZm9yIGEgY2xpcCBob2xkaW5nIGFuIEludGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FVFlQRV9URVhUX0lOVEVOVCA9ICJ0ZXh0L3ZuZC5hbmRyb2lkLmludGVudCI7CisKKyAgICBmaW5hbCBDaGFyU2VxdWVuY2UgbUxhYmVsOworICAgIGZpbmFsIFN0cmluZ1tdIG1NaW1lVHlwZXM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgY2xpcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsYWJlbCBMYWJlbCB0byBzaG93IHRvIHRoZSB1c2VyIGRlc2NyaWJpbmcgdGhpcyBjbGlwLgorICAgICAqIEBwYXJhbSBtaW1lVHlwZXMgQW4gYXJyYXkgb2YgTUlNRSB0eXBlcyB0aGlzIGRhdGEgaXMgYXZhaWxhYmxlIGFzLgorICAgICAqLworICAgIHB1YmxpYyBDbGlwRGVzY3JpcHRpb24oQ2hhclNlcXVlbmNlIGxhYmVsLCBTdHJpbmdbXSBtaW1lVHlwZXMpIHsKKyAgICAgICAgaWYgKG1pbWVUeXBlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm1pbWVUeXBlcyBpcyBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgbUxhYmVsID0gbGFiZWw7CisgICAgICAgIG1NaW1lVHlwZXMgPSBtaW1lVHlwZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgY29weSBvZiBhIENsaXBEZXNjcmlwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpcERlc2NyaXB0aW9uKENsaXBEZXNjcmlwdGlvbiBvKSB7CisgICAgICAgIG1MYWJlbCA9IG8ubUxhYmVsOworICAgICAgICBtTWltZVR5cGVzID0gby5tTWltZVR5cGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciB0byBjb21wYXJlIHR3byBNSU1FIHR5cGVzLCB3aGVyZSBvbmUgbWF5IGJlIGEgcGF0dGVybi4KKyAgICAgKiBAcGFyYW0gY29uY3JldGVUeXBlIEEgZnVsbHktc3BlY2lmaWVkIE1JTUUgdHlwZS4KKyAgICAgKiBAcGFyYW0gZGVzaXJlZFR5cGUgQSBkZXNpcmVkIE1JTUUgdHlwZSB0aGF0IG1heSBiZSBhIHBhdHRlcm4gc3VjaCBhcyAqXC8qLgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gTUlNRSB0eXBlcyBtYXRjaC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZU1pbWVUeXBlcyhTdHJpbmcgY29uY3JldGVUeXBlLCBTdHJpbmcgZGVzaXJlZFR5cGUpIHsKKyAgICAgICAgZmluYWwgaW50IHR5cGVMZW5ndGggPSBkZXNpcmVkVHlwZS5sZW5ndGgoKTsKKyAgICAgICAgaWYgKHR5cGVMZW5ndGggPT0gMyAmJiBkZXNpcmVkVHlwZS5lcXVhbHMoIiovKiIpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBzbGFzaHBvcyA9IGRlc2lyZWRUeXBlLmluZGV4T2YoJy8nKTsKKyAgICAgICAgaWYgKHNsYXNocG9zID4gMCkgeworICAgICAgICAgICAgaWYgKHR5cGVMZW5ndGggPT0gc2xhc2hwb3MrMiAmJiBkZXNpcmVkVHlwZS5jaGFyQXQoc2xhc2hwb3MrMSkgPT0gJyonKSB7CisgICAgICAgICAgICAgICAgaWYgKGRlc2lyZWRUeXBlLnJlZ2lvbk1hdGNoZXMoMCwgY29uY3JldGVUeXBlLCAwLCBzbGFzaHBvcysxKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc2lyZWRUeXBlLmVxdWFscyhjb25jcmV0ZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsYWJlbCBmb3IgdGhpcyBjbGlwLgorICAgICAqLworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0TGFiZWwoKSB7CisgICAgICAgIHJldHVybiBtTGFiZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgd2hldGhlciB0aGUgY2xpcCBkZXNjcmlwdGlvbiBjb250YWlucyB0aGUgZ2l2ZW4gTUlNRSB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIG1pbWVUeXBlIFRoZSBkZXNpcmVkIE1JTUUgdHlwZS4gIE1heSBiZSBhIHBhdHRlcm4uCisgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgb25lIG9mIHRoZSBNSU1FIHR5cGVzIGluIHRoZSBjbGlwIGRlc2NyaXB0aW9uCisgICAgICogbWF0Y2hlcyB0aGUgZGVzaXJlZCBNSU1FIHR5cGUsIGVsc2UgZmFsc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxtTWltZVR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY29tcGFyZU1pbWVUeXBlcyhtTWltZVR5cGVzW2ldLCBtaW1lVHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsdGVyIHRoZSBjbGlwIGRlc2NyaXB0aW9uIE1JTUUgdHlwZXMgYnkgdGhlIGdpdmVuIE1JTUUgdHlwZS4gIFJldHVybnMKKyAgICAgKiBhbGwgTUlNRSB0eXBlcyBpbiB0aGUgY2xpcCB0aGF0IG1hdGNoIHRoZSBnaXZlbiBNSU1FIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIGRlc2lyZWQgTUlNRSB0eXBlLiAgTWF5IGJlIGEgcGF0dGVybi4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIG1hdGNoaW5nIE1JTUUgdHlwZXMuICBJZiB0aGVyZSBhcmUgbm8KKyAgICAgKiBtYXRjaGluZyBNSU1FIHR5cGVzLCBudWxsIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaWx0ZXJNaW1lVHlwZXMoU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGFycmF5ID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1NaW1lVHlwZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjb21wYXJlTWltZVR5cGVzKG1NaW1lVHlwZXNbaV0sIG1pbWVUeXBlKSkgeworICAgICAgICAgICAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFycmF5ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFycmF5LmFkZChtTWltZVR5cGVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYXJyYXkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nW10gcmF3QXJyYXkgPSBuZXcgU3RyaW5nW2FycmF5LnNpemUoKV07CisgICAgICAgIGFycmF5LnRvQXJyYXkocmF3QXJyYXkpOworICAgICAgICByZXR1cm4gcmF3QXJyYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgTUlNRSB0eXBlcyB0aGUgY2xpcCBpcyBhdmFpbGFibGUgaW4uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNaW1lVHlwZUNvdW50KCkgeworICAgICAgICByZXR1cm4gbU1pbWVUeXBlcy5sZW5ndGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIG9uZSBvZiB0aGUgcG9zc2libGUgY2xpcCBNSU1FIHR5cGVzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBtTWltZVR5cGVzW2luZGV4XTsKKyAgICB9CisKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKKyAgICAgICAgaWYgKG1NaW1lVHlwZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJudWxsIG1pbWUgdHlwZXMiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobU1pbWVUeXBlcy5sZW5ndGggPD0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibXVzdCBoYXZlIGF0IGxlYXN0IDEgbWltZSB0eXBlIik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1NaW1lVHlwZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtTWltZVR5cGVzW2ldID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm1pbWUgdHlwZSBhdCAiICsgaSArICIgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwobUxhYmVsLCBkZXN0LCBmbGFncyk7CisgICAgICAgIGRlc3Qud3JpdGVTdHJpbmdBcnJheShtTWltZVR5cGVzKTsKKyAgICB9CisKKyAgICBDbGlwRGVzY3JpcHRpb24oUGFyY2VsIGluKSB7CisgICAgICAgIG1MYWJlbCA9IFRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgIG1NaW1lVHlwZXMgPSBpbi5jcmVhdGVTdHJpbmdBcnJheSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPENsaXBEZXNjcmlwdGlvbj4gQ1JFQVRPUiA9CisgICAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8Q2xpcERlc2NyaXB0aW9uPigpIHsKKworICAgICAgICAgICAgcHVibGljIENsaXBEZXNjcmlwdGlvbiBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsaXBEZXNjcmlwdGlvbihzb3VyY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgQ2xpcERlc2NyaXB0aW9uW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsaXBEZXNjcmlwdGlvbltzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwYm9hcmRNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhNjc2NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjEzIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBJbnRlcmZhY2UgdG8gdGhlIGNsaXBib2FyZCBzZXJ2aWNlLCBmb3IgcGxhY2luZyBhbmQgcmV0cmlldmluZyB0ZXh0IGluCisgKiB0aGUgZ2xvYmFsIGNsaXBib2FyZC4KKyAqCisgKiA8cD4KKyAqIFlvdSBkbyBub3QgaW5zdGFudGlhdGUgdGhpcyBjbGFzcyBkaXJlY3RseTsgaW5zdGVhZCwgcmV0cmlldmUgaXQgdGhyb3VnaAorICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2dldFN5c3RlbVNlcnZpY2V9LgorICoKKyAqIDxwPgorICogVGhlIENsaXBib2FyZE1hbmFnZXIgQVBJIGl0c2VsZiBpcyB2ZXJ5IHNpbXBsZTogaXQgY29uc2lzdHMgb2YgbWV0aG9kcworICogdG8gYXRvbWljYWxseSBnZXQgYW5kIHNldCB0aGUgY3VycmVudCBwcmltYXJ5IGNsaXBib2FyZCBkYXRhLiAgVGhhdCBkYXRhCisgKiBpcyBleHByZXNzZWQgYXMgYSB7QGxpbmsgQ2xpcERhdGF9IG9iamVjdCwgd2hpY2ggZGVmaW5lcyB0aGUgcHJvdG9jb2wKKyAqIGZvciBkYXRhIGV4Y2hhbmdlIGJldHdlZW4gYXBwbGljYXRpb25zLgorICoKKyAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjZ2V0U3lzdGVtU2VydmljZQorICovCitwdWJsaWMgY2xhc3MgQ2xpcGJvYXJkTWFuYWdlciBleHRlbmRzIGFuZHJvaWQudGV4dC5DbGlwYm9hcmRNYW5hZ2VyIHsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBPYmplY3Qgc1N0YXRpY0xvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgSUNsaXBib2FyZCBzU2VydmljZTsKKworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PE9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXI+IG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMKKyAgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3Q8T25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcj4oKTsKKworICAgIHByaXZhdGUgZmluYWwgSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIuU3R1YiBtUHJpbWFyeUNsaXBDaGFuZ2VkU2VydmljZUxpc3RlbmVyCisgICAgICAgICAgICA9IG5ldyBJT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lci5TdHViKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaFByaW1hcnlDbGlwQ2hhbmdlZCgpIHsKKyAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1JFUE9SVF9QUklNQVJZX0NMSVBfQ0hBTkdFRCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIGludCBNU0dfUkVQT1JUX1BSSU1BUllfQ0xJUF9DSEFOR0VEID0gMTsKKworICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JFUE9SVF9QUklNQVJZX0NMSVBfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJpbWFyeUNsaXBDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIGludGVyZmFjZSBPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIHsKKyAgICAgICAgdm9pZCBvblByaW1hcnlDbGlwQ2hhbmdlZCgpOworICAgIH0KKworICAgIHN0YXRpYyBwcml2YXRlIElDbGlwYm9hcmQgZ2V0U2VydmljZSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzU3RhdGljTG9jaykgeworICAgICAgICAgICAgaWYgKHNTZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc1NlcnZpY2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKCJjbGlwYm9hcmQiKTsKKyAgICAgICAgICAgIHNTZXJ2aWNlID0gSUNsaXBib2FyZC5TdHViLmFzSW50ZXJmYWNlKGIpOworICAgICAgICAgICAgcmV0dXJuIHNTZXJ2aWNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIHtAaGlkZX0gKi8KKyAgICBwdWJsaWMgQ2xpcGJvYXJkTWFuYWdlcihDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY3VycmVudCBwcmltYXJ5IGNsaXAgb24gdGhlIGNsaXBib2FyZC4gIFRoaXMgaXMgdGhlIGNsaXAgdGhhdAorICAgICAqIGlzIGludm9sdmVkIGluIG5vcm1hbCBjdXQgYW5kIHBhc3RlIG9wZXJhdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xpcCBUaGUgY2xpcHBlZCBkYXRhIGl0ZW0gdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByaW1hcnlDbGlwKENsaXBEYXRhIGNsaXApIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdldFNlcnZpY2UoKS5zZXRQcmltYXJ5Q2xpcChjbGlwKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcHJpbWFyeSBjbGlwIG9uIHRoZSBjbGlwYm9hcmQuCisgICAgICovCisgICAgcHVibGljIENsaXBEYXRhIGdldFByaW1hcnlDbGlwKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldFNlcnZpY2UoKS5nZXRQcmltYXJ5Q2xpcChtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJyZW50IHByaW1hcnkgY2xpcCBvbiB0aGUgY2xpcGJvYXJkCisgICAgICogYnV0IG5vdCBhIGNvcHkgb2YgaXRzIGRhdGEuCisgICAgICovCisgICAgcHVibGljIENsaXBEZXNjcmlwdGlvbiBnZXRQcmltYXJ5Q2xpcERlc2NyaXB0aW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldFNlcnZpY2UoKS5nZXRQcmltYXJ5Q2xpcERlc2NyaXB0aW9uKCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBjdXJyZW50bHkgYSBwcmltYXJ5IGNsaXAgb24gdGhlIGNsaXBib2FyZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmltYXJ5Q2xpcCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuaGFzUHJpbWFyeUNsaXAoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKE9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgd2hhdCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGlmIChtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmljZSgpLmFkZFByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5Q2xpcENoYW5nZWRTZXJ2aWNlTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVycy5hZGQod2hhdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcihPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIHdoYXQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZSh3aGF0KTsKKyAgICAgICAgICAgIGlmIChtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmljZSgpLnJlbW92ZVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5Q2xpcENoYW5nZWRTZXJ2aWNlTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0UHJpbWFyeUNsaXAoKX0gaW5zdGVhZC4gIFRoaXMgcmV0cmlldmVzCisgICAgICogdGhlIHByaW1hcnkgY2xpcCBhbmQgdHJpZXMgdG8gY29lcmNlIGl0IHRvIGEgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGV4dCgpIHsKKyAgICAgICAgQ2xpcERhdGEgY2xpcCA9IGdldFByaW1hcnlDbGlwKCk7CisgICAgICAgIGlmIChjbGlwICE9IG51bGwgJiYgY2xpcC5nZXRJdGVtQ291bnQoKSA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiBjbGlwLmdldEl0ZW0oMCkuY29lcmNlVG9UZXh0KG1Db250ZXh0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRQcmltYXJ5Q2xpcChDbGlwRGF0YSl9IGluc3RlYWQuICBUaGlzCisgICAgICogY3JlYXRlcyBhIENsaXBwZWRJdGVtIGhvbGRpbmcgdGhlIGdpdmVuIHRleHQgYW5kIHNldHMgaXQgYXMgdGhlCisgICAgICogcHJpbWFyeSBjbGlwLiAgSXQgaGFzIG5vIGxhYmVsIG9yIGljb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGV4dChDaGFyU2VxdWVuY2UgdGV4dCkgeworICAgICAgICBzZXRQcmltYXJ5Q2xpcChDbGlwRGF0YS5uZXdQbGFpblRleHQobnVsbCwgbnVsbCwgdGV4dCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2hhc1ByaW1hcnlDbGlwKCl9IGluc3RlYWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuaGFzUHJpbWFyeUNsaXAoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcmVwb3J0UHJpbWFyeUNsaXBDaGFuZ2VkKCkgeworICAgICAgICBPYmplY3RbXSBsaXN0ZW5lcnM7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMuc2l6ZSgpOworICAgICAgICAgICAgaWYgKE4gPD0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3RlbmVycyA9IG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMudG9BcnJheSgpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgKChPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKWxpc3RlbmVyc1tpXSkub25QcmltYXJ5Q2xpcENoYW5nZWQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IDFkNmU4YjguLjZiYjMyYzEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXIuamF2YQpAQCAtMjgsMTMgKzI4LDE2IEBACiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5JQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogLyoqCkBAIC03Niw2ICs3OSw4IEBACiAgKiBjcm9zcy1wcm9jZXNzIGNhbGxzLjwvcD4KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIENvbXBvbmVudENhbGxiYWNrcyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDb250ZW50UHJvdmlkZXIiOworCiAgICAgLyoKICAgICAgKiBOb3RlOiBpZiB5b3UgYWRkIG1ldGhvZHMgdG8gQ29udGVudFByb3ZpZGVyLCB5b3UgbXVzdCBhZGQgc2ltaWxhciBtZXRob2RzIHRvCiAgICAgICogICAgICAgTW9ja0NvbnRlbnRQcm92aWRlci4KQEAgLTI0OSw2ICsyNTQsMTggQEAKICAgICAgICAgICAgIHJldHVybiBDb250ZW50UHJvdmlkZXIudGhpcy5jYWxsKG1ldGhvZCwgcmVxdWVzdCwgYXJncyk7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmksIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgeworICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRQcm92aWRlci50aGlzLmdldFN0cmVhbVR5cGVzKHVyaSwgbWltZVR5cGVGaWx0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJpLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKQorICAgICAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgZW5mb3JjZVJlYWRQZXJtaXNzaW9uKHVyaSk7CisgICAgICAgICAgICByZXR1cm4gQ29udGVudFByb3ZpZGVyLnRoaXMub3BlblR5cGVkQXNzZXRGaWxlKHVyaSwgbWltZVR5cGUsIG9wdHMpOworICAgICAgICB9CisKICAgICAgICAgcHJpdmF0ZSB2b2lkIGVuZm9yY2VSZWFkUGVybWlzc2lvbihVcmkgdXJpKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQgdWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKICAgICAgICAgICAgIGlmICh1aWQgPT0gbU15VWlkKSB7CkBAIC03NTYsNiArNzczLDE0NCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhIGNsaWVudCB0byBkZXRlcm1pbmUgdGhlIHR5cGVzIG9mIGRhdGEgc3RyZWFtcyB0aGF0IHRoaXMKKyAgICAgKiBjb250ZW50IHByb3ZpZGVyIHN1cHBvcnRzIGZvciB0aGUgZ2l2ZW4gVVJJLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgICAgKiByZXR1cm5zIG51bGwsIG1lYW5pbmcgbm8gdHlwZXMuICBJZiB5b3VyIGNvbnRlbnQgcHJvdmlkZXIgc3RvcmVzIGRhdGEKKyAgICAgKiBvZiBhIHBhcnRpY3VsYXIgdHlwZSwgcmV0dXJuIHRoYXQgTUlNRSB0eXBlIGlmIGl0IG1hdGNoZXMgdGhlIGdpdmVuCisgICAgICogbWltZVR5cGVGaWx0ZXIuICBJZiBpdCBjYW4gcGVyZm9ybSB0eXBlIGNvbnZlcnNpb25zLCByZXR1cm4gYW4gYXJyYXkKKyAgICAgKiBvZiBhbGwgc3VwcG9ydGVkIE1JTUUgdHlwZXMgdGhhdCBtYXRjaCBtaW1lVHlwZUZpbHRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIGRhdGEgaW4gdGhlIGNvbnRlbnQgcHJvdmlkZXIgYmVpbmcgcXVlcmllZC4KKyAgICAgKiBAcGFyYW0gbWltZVR5cGVGaWx0ZXIgVGhlIHR5cGUgb2YgZGF0YSB0aGUgY2xpZW50IGRlc2lyZXMuICBNYXkgYmUKKyAgICAgKiBhIHBhdHRlcm4sIHN1Y2ggYXMgKlwvKiB0byByZXRyaWV2ZSBhbGwgcG9zc2libGUgZGF0YSB0eXBlcy4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgbnVsbCBpZiB0aGVyZSBhcmUgbm8gcG9zc2libGUgZGF0YSBzdHJlYW1zIGZvciB0aGUKKyAgICAgKiBnaXZlbiBtaW1lVHlwZUZpbHRlci4gIE90aGVyd2lzZSByZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBhdmFpbGFibGUKKyAgICAgKiBjb25jcmV0ZSBNSU1FIHR5cGVzLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0VHlwZShVcmkpCisgICAgICogQHNlZSAjb3BlblR5cGVkQXNzZXRGaWxlKFVyaSwgU3RyaW5nLCBCdW5kbGUpCisgICAgICogQHNlZSBDbGlwRGVzY3JpcHRpb24jY29tcGFyZU1pbWVUeXBlcyhTdHJpbmcsIFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyZWFtVHlwZXMoVXJpIHVyaSwgU3RyaW5nIG1pbWVUeXBlRmlsdGVyKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhIGNsaWVudCB0byBvcGVuIGEgcmVhZC1vbmx5IHN0cmVhbSBjb250YWluaW5nIGRhdGEgb2YgYQorICAgICAqIHBhcnRpY3VsYXIgTUlNRSB0eXBlLiAgVGhpcyBpcyBsaWtlIHtAbGluayAjb3BlbkFzc2V0RmlsZShVcmksIFN0cmluZyl9LAorICAgICAqIGV4Y2VwdCB0aGUgZmlsZSBjYW4gb25seSBiZSByZWFkLW9ubHkgYW5kIHRoZSBjb250ZW50IHByb3ZpZGVyIG1heQorICAgICAqIHBlcmZvcm0gZGF0YSBjb252ZXJzaW9ucyB0byBnZW5lcmF0ZSBkYXRhIG9mIHRoZSBkZXNpcmVkIHR5cGUuCisgICAgICoKKyAgICAgKiA8cD5UaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjb21wYXJlcyB0aGUgZ2l2ZW4gbWltZVR5cGUgYWdhaW5zdCB0aGUKKyAgICAgKiByZXN1bHQgb2Yge0BsaW5rICNnZXRUeXBlKFVyaSl9IGFuZCwgaWYgdGhlIG1hdGNoLCBzaW1wbGUgY2FsbHMKKyAgICAgKiB7QGxpbmsgI29wZW5Bc3NldEZpbGUoVXJpLCBTdHJpbmcpfS4KKyAgICAgKgorICAgICAqIDxwPlNlZSB7QGxpbmsgQ2xpcERhdGF9IGZvciBleGFtcGxlcyBvZiB0aGUgdXNlIGFuZCBpbXBsZW1lbnRhdGlvbgorICAgICAqIG9mIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgZGF0YSBpbiB0aGUgY29udGVudCBwcm92aWRlciBiZWluZyBxdWVyaWVkLgorICAgICAqIEBwYXJhbSBtaW1lVHlwZUZpbHRlciBUaGUgdHlwZSBvZiBkYXRhIHRoZSBjbGllbnQgZGVzaXJlcy4gIE1heSBiZQorICAgICAqIGEgcGF0dGVybiwgc3VjaCBhcyAqXC8qLCBpZiB0aGUgY2FsbGVyIGRvZXMgbm90IGhhdmUgc3BlY2lmaWMgdHlwZQorICAgICAqIHJlcXVpcmVtZW50czsgaW4gdGhpcyBjYXNlIHRoZSBjb250ZW50IHByb3ZpZGVyIHdpbGwgcGljayBpdHMgYmVzdAorICAgICAqIHR5cGUgbWF0Y2hpbmcgdGhlIHBhdHRlcm4uCisgICAgICogQHBhcmFtIG9wdHMgQWRkaXRpb25hbCBvcHRpb25zIGZyb20gdGhlIGNsaWVudC4gIFRoZSBkZWZpbml0aW9ucyBvZgorICAgICAqIHRoZXNlIGFyZSBzcGVjaWZpYyB0byB0aGUgY29udGVudCBwcm92aWRlciBiZWluZyBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgQXNzZXRGaWxlRGVzY3JpcHRvciBmcm9tIHdoaWNoIHRoZSBjbGllbnQgY2FuCisgICAgICogcmVhZCBkYXRhIG9mIHRoZSBkZXNpcmVkIHR5cGUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBUaHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZXJlIGlzCisgICAgICogbm8gZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFVSSSBvciB0aGUgbW9kZSBpcyBpbnZhbGlkLgorICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gVGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIHRoZSBjYWxsZXIgZG9lcworICAgICAqIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSBkYXRhLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlCisgICAgICogY29udGVudCBwcm92aWRlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgTUlNRSB0eXBlLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0U3RyZWFtVHlwZXMoVXJpLCBTdHJpbmcpCisgICAgICogQHNlZSAjb3BlbkFzc2V0RmlsZShVcmksIFN0cmluZykKKyAgICAgKiBAc2VlIENsaXBEZXNjcmlwdGlvbiNjb21wYXJlTWltZVR5cGVzKFN0cmluZywgU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJpLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIsIEJ1bmRsZSBvcHRzKQorICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICgiKi8qIi5lcXVhbHMobWltZVR5cGVGaWx0ZXIpKSB7CisgICAgICAgICAgICAvLyBJZiB0aGV5IGNhbiB0YWtlIGFueXRoaW5nLCB0aGUgdW50eXBlZCBvcGVuIGNhbGwgaXMgZ29vZCBlbm91Z2guCisgICAgICAgICAgICByZXR1cm4gb3BlbkFzc2V0RmlsZSh1cmksICJyIik7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGJhc2VUeXBlID0gZ2V0VHlwZSh1cmkpOworICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiBDbGlwRGVzY3JpcHRpb24uY29tcGFyZU1pbWVUeXBlcyhiYXNlVHlwZSwgbWltZVR5cGVGaWx0ZXIpKSB7CisgICAgICAgICAgICAvLyBVc2Ugb2xkIHVudHlwZWQgb3BlbiBjYWxsIGlmIHRoaXMgcHJvdmlkZXIgaGFzIGEgdHlwZSBmb3IgdGhpcworICAgICAgICAgICAgLy8gVVJJIGFuZCBpdCBtYXRjaGVzIHRoZSByZXF1ZXN0LgorICAgICAgICAgICAgcmV0dXJuIG9wZW5Bc3NldEZpbGUodXJpLCAiciIpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkNhbid0IG9wZW4gIiArIHVyaSArICIgYXMgdHlwZSAiICsgbWltZVR5cGVGaWx0ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSB0byB3cml0ZSBhIHN0cmVhbSBvZiBkYXRhIHRvIGEgcGlwZS4gIFVzZSB3aXRoCisgICAgICoge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuUGlwZUhlbHBlcn0uCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBQaXBlRGF0YVdyaXRlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgZnJvbSBhIGJhY2tncm91bmQgdGhyZWFkIHRvIHN0cmVhbSBkYXRhIG91dCB0byBhIHBpcGUuCisgICAgICAgICAqIE5vdGUgdGhhdCB0aGUgcGlwZSBpcyBibG9ja2luZywgc28gdGhpcyB0aHJlYWQgY2FuIGJsb2NrIG9uCisgICAgICAgICAqIHdyaXRlcyBmb3IgYW4gYXJiaXRyYXJ5IGFtb3VudCBvZiB0aW1lIGlmIHRoZSBjbGllbnQgaXMgc2xvdworICAgICAgICAgKiBhdCByZWFkaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gb3V0cHV0IFRoZSBwaXBlIHdoZXJlIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4uICBUaGlzIHdpbGwgYmUKKyAgICAgICAgICogY2xvc2VkIGZvciB5b3UgdXBvbiByZXR1cm5pbmcgZnJvbSB0aGlzIGZ1bmN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgd2hvc2UgZGF0YSBpcyB0byBiZSB3cml0dGVuLgorICAgICAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIGRlc2lyZWQgdHlwZSBvZiBkYXRhIHRvIGJlIHdyaXR0ZW4uCisgICAgICAgICAqIEBwYXJhbSBvcHRzIE9wdGlvbnMgc3VwcGxpZWQgYnkgY2FsbGVyLgorICAgICAgICAgKiBAcGFyYW0gYXJncyBZb3VyIG93biBjdXN0b20gYXJndW1lbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVEYXRhVG9QaXBlKFBhcmNlbEZpbGVEZXNjcmlwdG9yIG91dHB1dCwgVXJpIHVyaSwgU3RyaW5nIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgIEJ1bmRsZSBvcHRzLCBUIGFyZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgaGVscGVyIGZ1bmN0aW9uIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rICNvcGVuVHlwZWRBc3NldEZpbGV9LCBmb3IKKyAgICAgKiBjcmVhdGluZyBhIGRhdGEgcGlwZSBhbmQgYmFja2dyb3VuZCB0aHJlYWQgYWxsb3dpbmcgeW91IHRvIHN0cmVhbQorICAgICAqIGdlbmVyYXRlZCBkYXRhIGJhY2sgdG8gdGhlIGNsaWVudC4gIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG5ldworICAgICAqIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgKHRoZSBjYWxsZXIKKyAgICAgKiBpcyByZXNwb25zaWJsZSBmb3IgY2xvc2luZyBpdCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgd2hvc2UgZGF0YSBpcyB0byBiZSB3cml0dGVuLgorICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgZGVzaXJlZCB0eXBlIG9mIGRhdGEgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gb3B0cyBPcHRpb25zIHN1cHBsaWVkIGJ5IGNhbGxlci4KKyAgICAgKiBAcGFyYW0gYXJncyBZb3VyIG93biBjdXN0b20gYXJndW1lbnRzLgorICAgICAqIEBwYXJhbSBmdW5jIEludGVyZmFjZSBpbXBsZW1lbnRpbmcgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBhY3R1YWxseQorICAgICAqIHN0cmVhbSB0aGUgZGF0YS4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IgaG9sZGluZyB0aGUgcmVhZCBzaWRlIG9mCisgICAgICogdGhlIHBpcGUuICBUaGlzIHNob3VsZCBiZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyIGZvciByZWFkaW5nOyB0aGUgY2FsbGVyCisgICAgICogaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgaXQgd2hlbiBkb25lLgorICAgICAqLworICAgIHB1YmxpYyA8VD4gUGFyY2VsRmlsZURlc2NyaXB0b3Igb3BlblBpcGVIZWxwZXIoZmluYWwgVXJpIHVyaSwgZmluYWwgU3RyaW5nIG1pbWVUeXBlLAorICAgICAgICAgICAgZmluYWwgQnVuZGxlIG9wdHMsIGZpbmFsIFQgYXJncywgZmluYWwgUGlwZURhdGFXcml0ZXI8VD4gZnVuYykKKyAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBmZHMgPSBQYXJjZWxGaWxlRGVzY3JpcHRvci5jcmVhdGVQaXBlKCk7CisKKyAgICAgICAgICAgIEFzeW5jVGFzazxPYmplY3QsIE9iamVjdCwgT2JqZWN0PiB0YXNrID0gbmV3IEFzeW5jVGFzazxPYmplY3QsIE9iamVjdCwgT2JqZWN0PigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvSW5CYWNrZ3JvdW5kKE9iamVjdC4uLiBwYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZnVuYy53cml0ZURhdGFUb1BpcGUoZmRzWzFdLCB1cmksIG1pbWVUeXBlLCBvcHRzLCBhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkc1sxXS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsdXJlIGNsb3NpbmcgcGlwZSIsIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0YXNrLmV4ZWN1dGUoKE9iamVjdFtdKW51bGwpOworCisgICAgICAgICAgICByZXR1cm4gZmRzWzBdOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJmYWlsdXJlIG1ha2luZyBwaXBlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnN0YW5jZSBpcyBhIHRlbXBvcmFyeSBjb250ZW50IHByb3ZpZGVyLgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RhbmNlIGlzIGEgdGVtcG9yYXJ5IGNvbnRlbnQgcHJvdmlkZXIKICAgICAgKi8KQEAgLTc4MSw2ICs5MzYsMTEgQEAKICAgICAgKiBAcGFyYW0gaW5mbyBSZWdpc3RlcmVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29udGVudCBwcm92aWRlcgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGF0dGFjaEluZm8oQ29udGV4dCBjb250ZXh0LCBQcm92aWRlckluZm8gaW5mbykgeworICAgICAgICAvKgorICAgICAgICAgKiBXZSBtYXkgYmUgdXNpbmcgQXN5bmNUYXNrIGZyb20gYmluZGVyIHRocmVhZHMuICBNYWtlIGl0IGluaXQgaGVyZQorICAgICAgICAgKiBzbyBpdHMgc3RhdGljIGhhbmRsZXIgaXMgb24gdGhlIG1haW4gdGhyZWFkLgorICAgICAgICAgKi8KKyAgICAgICAgQXN5bmNUYXNrLmluaXQoKTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBPbmx5IGFsbG93IGl0IHRvIGJlIHNldCBvbmNlLCBzbyBhZnRlciB0aGUgY29udGVudCBzZXJ2aWNlIGdpdmVzCkBAIC04MjksNyArOTg5LDcgQEAKICAgICAvKioKICAgICAgKiBAaGlkZSAtLSB1bnRpbCBpbnRlcmZhY2UgaGFzIHByb3ZlbiBpdHNlbGYKICAgICAgKgotICAgICAqIENhbGwgYW4gcHJvdmlkZXItZGVmaW5lZCBtZXRob2QuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudAorICAgICAqIENhbGwgYSBwcm92aWRlci1kZWZpbmVkIG1ldGhvZC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50CiAgICAgICogaW50ZXJmYWNlcyB0aGF0IGFyZSBjaGVhcGVyIHRoYW4gdXNpbmcgYSBDdXJzb3IuCiAgICAgICoKICAgICAgKiBAcGFyYW0gbWV0aG9kIE1ldGhvZCBuYW1lIHRvIGNhbGwuICBPcGFxdWUgdG8gZnJhbWV3b3JrLgpAQCAtODM5LDQgKzk5OSwzMSBAQAogICAgIHB1YmxpYyBCdW5kbGUgY2FsbChTdHJpbmcgbWV0aG9kLCBTdHJpbmcgcmVxdWVzdCwgQnVuZGxlIGFyZ3MpIHsKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoaXMgdG8gc2h1dCBkb3duIHRoZSBDb250ZW50UHJvdmlkZXIgaW5zdGFuY2UuIFlvdSBjYW4gdGhlbgorICAgICAqIGludm9rZSB0aGlzIG1ldGhvZCBpbiB1bml0IHRlc3RzLgorICAgICAqIAorICAgICAqIDxwPgorICAgICAqIEFuZHJvaWQgbm9ybWFsbHkgaGFuZGxlcyBDb250ZW50UHJvdmlkZXIgc3RhcnR1cCBhbmQgc2h1dGRvd24KKyAgICAgKiBhdXRvbWF0aWNhbGx5LiBZb3UgZG8gbm90IG5lZWQgdG8gc3RhcnQgdXAgb3Igc2h1dCBkb3duIGEKKyAgICAgKiBDb250ZW50UHJvdmlkZXIuIFdoZW4geW91IGludm9rZSBhIHRlc3QgbWV0aG9kIG9uIGEgQ29udGVudFByb3ZpZGVyLAorICAgICAqIGhvd2V2ZXIsIGEgQ29udGVudFByb3ZpZGVyIGluc3RhbmNlIGlzIHN0YXJ0ZWQgYW5kIGtlZXBzIHJ1bm5pbmcgYWZ0ZXIKKyAgICAgKiB0aGUgdGVzdCBmaW5pc2hlcywgZXZlbiBpZiBhIHN1Y2NlZWRpbmcgdGVzdCBpbnN0YW50aWF0ZXMgYW5vdGhlcgorICAgICAqIENvbnRlbnRQcm92aWRlci4gQSBjb25mbGljdCBkZXZlbG9wcyBiZWNhdXNlIHRoZSB0d28gaW5zdGFuY2VzIGFyZQorICAgICAqIHVzdWFsbHkgcnVubmluZyBhZ2FpbnN0IHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBzb3VyY2UgKGZvciBleGFtcGxlLCBhbgorICAgICAqIHNxbGl0ZSBkYXRhYmFzZSkuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEltcGxlbWVudGluZyBzaHV0RG93bigpIGF2b2lkcyB0aGlzIGNvbmZsaWN0IGJ5IHByb3ZpZGluZyBhIHdheSB0bworICAgICAqIHRlcm1pbmF0ZSB0aGUgQ29udGVudFByb3ZpZGVyLiBUaGlzIG1ldGhvZCBjYW4gYWxzbyBwcmV2ZW50IG1lbW9yeSBsZWFrcworICAgICAqIGZyb20gbXVsdGlwbGUgaW5zdGFudGlhdGlvbnMgb2YgdGhlIENvbnRlbnRQcm92aWRlciwgYW5kIGl0IGNhbiBlbnN1cmUKKyAgICAgKiB1bml0IHRlc3QgaXNvbGF0aW9uIGJ5IGFsbG93aW5nIHlvdSB0byBjb21wbGV0ZWx5IGNsZWFuIHVwIHRoZSB0ZXN0CisgICAgICogZml4dHVyZSBiZWZvcmUgbW92aW5nIG9uIHRvIHRoZSBuZXh0IHRlc3QuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgeworICAgICAgICBMb2cudyhUQUcsICJpbXBsZW1lbnQgQ29udGVudFByb3ZpZGVyIHNodXRkb3duKCkgdG8gbWFrZSBzdXJlIGFsbCBkYXRhYmFzZSAiICsKKyAgICAgICAgICAgICAgICAiY29ubmVjdGlvbnMgYXJlIGdyYWNlZnVsbHkgc2h1dGRvd24iKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlckNsaWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXJDbGllbnQuamF2YQppbmRleCAwODU4ZWE1Li4wNTQwMTA5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlckNsaWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyQ2xpZW50LmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvcjsKQEAgLTQzLDUzICs0NCw3NyBAQAogICAgICAgICBtQ29udGVudFJlc29sdmVyID0gY29udGVudFJlc29sdmVyOwogICAgIH0KIAotICAgIC8qKiBzZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNxdWVyeX0gKi8KKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjcXVlcnkgQ29udGVudFByb3ZpZGVyLnF1ZXJ5fSAqLwogICAgIHB1YmxpYyBDdXJzb3IgcXVlcnkoVXJpIHVybCwgU3RyaW5nW10gcHJvamVjdGlvbiwgU3RyaW5nIHNlbGVjdGlvbiwKICAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5xdWVyeSh1cmwsIHByb2plY3Rpb24sIHNlbGVjdGlvbiwgIHNlbGVjdGlvbkFyZ3MsIHNvcnRPcmRlcik7CiAgICAgfQogCi0gICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2dldFR5cGV9ICovCisgICAgLyoqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2dldFR5cGUgQ29udGVudFByb3ZpZGVyLmdldFR5cGV9ICovCiAgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKFVyaSB1cmwpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5nZXRUeXBlKHVybCk7CiAgICAgfQogCi0gICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2luc2VydH0gKi8KKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjZ2V0U3RyZWFtVHlwZXMgQ29udGVudFByb3ZpZGVyLmdldFN0cmVhbVR5cGVzfSAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5nZXRTdHJlYW1UeXBlcyh1cmwsIG1pbWVUeXBlRmlsdGVyKTsKKyAgICB9CisKKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjaW5zZXJ0IENvbnRlbnRQcm92aWRlci5pbnNlcnR9ICovCiAgICAgcHVibGljIFVyaSBpbnNlcnQoVXJpIHVybCwgQ29udGVudFZhbHVlcyBpbml0aWFsVmFsdWVzKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLmluc2VydCh1cmwsIGluaXRpYWxWYWx1ZXMpOwogICAgIH0KIAotICAgIC8qKiBzZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNidWxrSW5zZXJ0fSAqLworICAgIC8qKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNidWxrSW5zZXJ0IENvbnRlbnRQcm92aWRlci5idWxrSW5zZXJ0fSAqLwogICAgIHB1YmxpYyBpbnQgYnVsa0luc2VydChVcmkgdXJsLCBDb250ZW50VmFsdWVzW10gaW5pdGlhbFZhbHVlcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLmJ1bGtJbnNlcnQodXJsLCBpbml0aWFsVmFsdWVzKTsKICAgICB9CiAKLSAgICAvKiogc2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjZGVsZXRlfSAqLworICAgIC8qKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNkZWxldGUgQ29udGVudFByb3ZpZGVyLmRlbGV0ZX0gKi8KICAgICBwdWJsaWMgaW50IGRlbGV0ZShVcmkgdXJsLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLmRlbGV0ZSh1cmwsIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncyk7CiAgICAgfQogCi0gICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI3VwZGF0ZX0gKi8KKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjdXBkYXRlIENvbnRlbnRQcm92aWRlci51cGRhdGV9ICovCiAgICAgcHVibGljIGludCB1cGRhdGUoVXJpIHVybCwgQ29udGVudFZhbHVlcyB2YWx1ZXMsIFN0cmluZyBzZWxlY3Rpb24sCiAgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIudXBkYXRlKHVybCwgdmFsdWVzLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MpOwogICAgIH0KIAotICAgIC8qKiBzZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuRmlsZX0gKi8KKyAgICAvKioKKyAgICAgKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuRmlsZSBDb250ZW50UHJvdmlkZXIub3BlbkZpbGV9LiAgTm90ZSB0aGF0CisgICAgICogdGhpcyA8ZW0+ZG9lcyBub3Q8L2VtPgorICAgICAqIHRha2UgY2FyZSBvZiBub24tY29udGVudDogVVJJcyBzdWNoIGFzIGZpbGU6LiAgSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQKKyAgICAgKiB5b3UgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyI29wZW5GaWxlRGVzY3JpcHRvcgorICAgICAqIENvbnRlbnRSZXNvbHZlci5vcGVuRmlsZURlc2NyaXB0b3J9IEFQSSBpbnN0ZWFkLgorICAgICAqLwogICAgIHB1YmxpYyBQYXJjZWxGaWxlRGVzY3JpcHRvciBvcGVuRmlsZShVcmkgdXJsLCBTdHJpbmcgbW9kZSkKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLm9wZW5GaWxlKHVybCwgbW9kZSk7CiAgICAgfQogCi0gICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5Bc3NldEZpbGV9ICovCisgICAgLyoqCisgICAgICogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlbkFzc2V0RmlsZSBDb250ZW50UHJvdmlkZXIub3BlbkFzc2V0RmlsZX0uCisgICAgICogTm90ZSB0aGF0IHRoaXMgPGVtPmRvZXMgbm90PC9lbT4KKyAgICAgKiB0YWtlIGNhcmUgb2Ygbm9uLWNvbnRlbnQ6IFVSSXMgc3VjaCBhcyBmaWxlOi4gIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkCisgICAgICogeW91IHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlciNvcGVuQXNzZXRGaWxlRGVzY3JpcHRvcgorICAgICAqIENvbnRlbnRSZXNvbHZlci5vcGVuQXNzZXRGaWxlRGVzY3JpcHRvcn0gQVBJIGluc3RlYWQuCisgICAgICovCiAgICAgcHVibGljIEFzc2V0RmlsZURlc2NyaXB0b3Igb3BlbkFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbW9kZSkKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLm9wZW5Bc3NldEZpbGUodXJsLCBtb2RlKTsKICAgICB9CiAKLSAgICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2FwcGx5QmF0Y2h9ICovCisgICAgLyoqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5UeXBlZEFzc2V0RmlsZSBDb250ZW50UHJvdmlkZXIub3BlblR5cGVkQXNzZXRGaWxlfSAqLworICAgIHB1YmxpYyBmaW5hbCBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3IoVXJpIHVyaSwKKyAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG9wdHMpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5vcGVuVHlwZWRBc3NldEZpbGUodXJpLCBtaW1lVHlwZSwgb3B0cyk7CisgICAgfQorCisgICAgLyoqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2FwcGx5QmF0Y2ggQ29udGVudFByb3ZpZGVyLmFwcGx5QmF0Y2h9ICovCiAgICAgcHVibGljIENvbnRlbnRQcm92aWRlclJlc3VsdFtdIGFwcGx5QmF0Y2goQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4gb3BlcmF0aW9ucykKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIE9wZXJhdGlvbkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIuYXBwbHlCYXRjaChvcGVyYXRpb25zKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyTmF0aXZlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlck5hdGl2ZS5qYXZhCmluZGV4IGZkYjNkMjAuLmQxYWI4ZDUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyTmF0aXZlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXJOYXRpdmUuamF2YQpAQCAtMjU3LDYgKzI1NywzOCBAQAogICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZUJ1bmRsZShyZXNwb25zZUJ1bmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgR0VUX1NUUkVBTV9UWVBFU19UUkFOU0FDVElPTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQ29udGVudFByb3ZpZGVyLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgICAgICAgICBVcmkgdXJsID0gVXJpLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlRmlsdGVyID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHR5cGVzID0gZ2V0U3RyZWFtVHlwZXModXJsLCBtaW1lVHlwZUZpbHRlcik7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVTdHJpbmdBcnJheSh0eXBlcyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBPUEVOX1RZUEVEX0FTU0VUX0ZJTEVfVFJBTlNBQ1RJT046CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUNvbnRlbnRQcm92aWRlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgVXJpIHVybCA9IFVyaS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IGRhdGEucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBCdW5kbGUgb3B0cyA9IGRhdGEucmVhZEJ1bmRsZSgpOworCisgICAgICAgICAgICAgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgZmQ7CisgICAgICAgICAgICAgICAgICAgIGZkID0gb3BlblR5cGVkQXNzZXRGaWxlKHVybCwgbWltZVR5cGUsIG9wdHMpOworICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZUludCgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkLndyaXRlVG9QYXJjZWwocmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbGFibGUuUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgRGF0YWJhc2VVdGlscy53cml0ZUV4Y2VwdGlvblRvUGFyY2VsKHJlcGx5LCBlKTsKQEAgLTU2OCw1ICs2MDAsNTAgQEAKICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKICAgICB9CiAKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyZWFtVHlwZXMoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlRmlsdGVyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOworCisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29udGVudFByb3ZpZGVyLmRlc2NyaXB0b3IpOworCisgICAgICAgIHVybC53cml0ZVRvUGFyY2VsKGRhdGEsIDApOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nKG1pbWVUeXBlRmlsdGVyKTsKKworICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KElDb250ZW50UHJvdmlkZXIuR0VUX1NUUkVBTV9UWVBFU19UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOworCisgICAgICAgIERhdGFiYXNlVXRpbHMucmVhZEV4Y2VwdGlvbkZyb21QYXJjZWwocmVwbHkpOworICAgICAgICBTdHJpbmdbXSBvdXQgPSByZXBseS5jcmVhdGVTdHJpbmdBcnJheSgpOworCisgICAgICAgIGRhdGEucmVjeWNsZSgpOworICAgICAgICByZXBseS5yZWN5Y2xlKCk7CisKKyAgICAgICAgcmV0dXJuIG91dDsKKyAgICB9CisKKyAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGUoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgb3B0cykKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7CisKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb250ZW50UHJvdmlkZXIuZGVzY3JpcHRvcik7CisKKyAgICAgICAgdXJsLndyaXRlVG9QYXJjZWwoZGF0YSwgMCk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcobWltZVR5cGUpOworICAgICAgICBkYXRhLndyaXRlQnVuZGxlKG9wdHMpOworCisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoSUNvbnRlbnRQcm92aWRlci5PUEVOX1RZUEVEX0FTU0VUX0ZJTEVfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKKworICAgICAgICBEYXRhYmFzZVV0aWxzLnJlYWRFeGNlcHRpb25XaXRoRmlsZU5vdEZvdW5kRXhjZXB0aW9uRnJvbVBhcmNlbChyZXBseSk7CisgICAgICAgIGludCBoYXMgPSByZXBseS5yZWFkSW50KCk7CisgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgZmQgPSBoYXMgIT0gMAorICAgICAgICAgICAgICAgID8gQXNzZXRGaWxlRGVzY3JpcHRvci5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocmVwbHkpIDogbnVsbDsKKworICAgICAgICBkYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgcmVwbHkucmVjeWNsZSgpOworCisgICAgICAgIHJldHVybiBmZDsKKyAgICB9CisKICAgICBwcml2YXRlIElCaW5kZXIgbVJlbW90ZTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFF1ZXJ5TWFwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRRdWVyeU1hcC5qYXZhCmluZGV4IGRiY2I0YTcuLmM5NTUwOTQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFF1ZXJ5TWFwLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UXVlcnlNYXAuamF2YQpAQCAtMTI5LDcgKzEyOSw5IEBACiAgICAgLyoqIFJlcXVlcmllcyB0aGUgY3Vyc29yIGFuZCByZWFkcyB0aGUgY29udGVudHMgaW50byB0aGUgY2FjaGUgKi8KICAgICBwdWJsaWMgdm9pZCByZXF1ZXJ5KCkgewogICAgICAgICBtRGlydHkgPSBmYWxzZTsKLSAgICAgICAgbUN1cnNvci5yZXF1ZXJ5KCk7CisgICAgICAgIGlmICghbUN1cnNvci5yZXF1ZXJ5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRyeWluZyB0byByZXF1ZXJ5IGFuIGFscmVhZHkgY2xvc2VkIGN1cnNvciIpOworICAgICAgICB9CiAgICAgICAgIHJlYWRDdXJzb3JJbnRvQ2FjaGUoKTsKICAgICAgICAgc2V0Q2hhbmdlZCgpOwogICAgICAgICBub3RpZnlPYnNlcnZlcnMoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRSZXNvbHZlci5qYXZhCmluZGV4IDgxZmY0MTQuLjMyODkxMjAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UmVzb2x2ZXIuamF2YQpAQCAtNDUsOSArNDUsOSBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogCiAvKioKQEAgLTIyMCw2ICsyMjAsMzggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBRdWVyeSBmb3IgdGhlIHBvc3NpYmxlIE1JTUUgdHlwZXMgZm9yIHRoZSByZXByZXNlbnRhdGlvbnMgdGhlIGdpdmVuCisgICAgICogY29udGVudCBVUkwgY2FuIGJlIHJldHVybmVkIHdoZW4gb3BlbmVkIGFzIGFzIHN0cmVhbSB3aXRoCisgICAgICoge0BsaW5rICNvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yfS4gIE5vdGUgdGhhdCB0aGUgdHlwZXMgaGVyZSBhcmUKKyAgICAgKiBub3QgbmVjZXNzYXJpbHkgYSBzdXBlcnNldCBvZiB0aGUgdHlwZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFR5cGV9IC0tCisgICAgICogbWFueSBjb250ZW50IHByb3ZpZGVycyBjYW4gbm90IHJldHVybiBhIHJhdyBzdHJlYW0gZm9yIHRoZSBzdHJ1Y3R1cmVkCisgICAgICogZGF0YSB0aGF0IHRoZXkgY29udGFpbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgQSBVcmkgaWRlbnRpZnlpbmcgY29udGVudCAoZWl0aGVyIGEgbGlzdCBvciBzcGVjaWZpYyB0eXBlKSwKKyAgICAgKiB1c2luZyB0aGUgY29udGVudDovLyBzY2hlbWUuCisgICAgICogQHBhcmFtIG1pbWVUeXBlRmlsdGVyIFRoZSBkZXNpcmVkIE1JTUUgdHlwZS4gIFRoaXMgbWF5IGJlIGEgcGF0dGVybiwKKyAgICAgKiBzdWNoIGFzICpcLyosIHRvIHF1ZXJ5IGZvciBhbGwgYXZhaWxhYmxlIE1JTUUgdHlwZXMgdGhhdCBtYXRjaCB0aGUKKyAgICAgKiBwYXR0ZXJuLgorICAgICAqIEByZXR1cm4gUmV0dXJucyBhbiBhcnJheSBvZiBNSU1FIHR5cGUgc3RyaW5ncyBmb3IgYWxsIGF2YWlsYWJsbGUKKyAgICAgKiBkYXRhIHN0cmVhbXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gbWltZVR5cGVGaWx0ZXIuICBJZiB0aGVyZSBhcmUgbm9uZSwKKyAgICAgKiBudWxsIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHsKKyAgICAgICAgSUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGFjcXVpcmVQcm92aWRlcih1cmwpOworICAgICAgICBpZiAocHJvdmlkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLmdldFN0cmVhbVR5cGVzKHVybCwgbWltZVR5cGVGaWx0ZXIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZmluYWxseSB7CisJCQlyZWxlYXNlUHJvdmlkZXIocHJvdmlkZXIpOworCQl9CisgICAgfQorCisgICAgLyoqCiAgICAgICogPHA+CiAgICAgICogUXVlcnkgdGhlIGdpdmVuIFVSSSwgcmV0dXJuaW5nIGEge0BsaW5rIEN1cnNvcn0gb3ZlciB0aGUgcmVzdWx0IHNldC4KICAgICAgKiA8L3A+CkBAIC0zNjUsNyArMzk3LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBPcGVuIGEgcmF3IGZpbGUgZGVzY3JpcHRvciB0byBhY2Nlc3MgZGF0YSB1bmRlciBhICJjb250ZW50OiIgVVJJLiAgVGhpcworICAgICAqIE9wZW4gYSByYXcgZmlsZSBkZXNjcmlwdG9yIHRvIGFjY2VzcyBkYXRhIHVuZGVyIGEgVVJJLiAgVGhpcwogICAgICAqIGlzIGxpa2Uge0BsaW5rICNvcGVuQXNzZXRGaWxlRGVzY3JpcHRvcihVcmksIFN0cmluZyl9LCBidXQgdXNlcyB0aGUKICAgICAgKiB1bmRlcmx5aW5nIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlbkZpbGV9CiAgICAgICogQ29udGVudFByb3ZpZGVyLm9wZW5GaWxlKCl9IG1ldGhvZCwgc28gd2lsbCA8ZW0+bm90PC9lbT4gd29yayB3aXRoCkBAIC00MTUsMTAgKzQ0Nyw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogT3BlbiBhIHJhdyBmaWxlIGRlc2NyaXB0b3IgdG8gYWNjZXNzIGRhdGEgdW5kZXIgYSAiY29udGVudDoiIFVSSS4gIFRoaXMKKyAgICAgKiBPcGVuIGEgcmF3IGZpbGUgZGVzY3JpcHRvciB0byBhY2Nlc3MgZGF0YSB1bmRlciBhIFVSSS4gIFRoaXMKICAgICAgKiBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5Bc3NldEZpbGV9Ci0gICAgICogQ29udGVudFByb3ZpZGVyLm9wZW5Bc3NldEZpbGUoKX0gbWV0aG9kIG9mIHRoZSBwcm92aWRlciBhc3NvY2lhdGVkIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gVVJJLCB0byByZXRyaWV2ZSBhbnkgZmlsZSBzdG9yZWQgdGhlcmUuCisgICAgICogbWV0aG9kIG9mIHRoZSBwcm92aWRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFVSSSwgdG8gcmV0cmlldmUgYW55IGZpbGUgc3RvcmVkIHRoZXJlLgogICAgICAqCiAgICAgICogPGg1PkFjY2VwdHMgdGhlIGZvbGxvd2luZyBVUkkgc2NoZW1lczo8L2g1PgogICAgICAqIDx1bD4KQEAgLTQ1MCw2ICs0ODEsMTEgQEAKICAgICAgKiA8L2xpPgogICAgICAqIDwvdWw+CiAgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgaWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIHJlYWQtb25seSBpbnB1dCAobW9kZSBpcyAiciIpCisgICAgICogb24gYSBjb250ZW50OiBVUkksIGl0IHdpbGwgaW5zdGVhZCBjYWxsIHtAbGluayAjb3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcn0KKyAgICAgKiBmb3IgeW91IHdpdGggYSBNSU1FIHR5cGUgb2YgIipcLyoiLiAgVGhpcyBhbGxvd3Mgc3VjaCBjYWxsZXJzIHRvIGJlbmVmaXQKKyAgICAgKiBmcm9tIGFueSBidWlsdC1pbiBkYXRhIGNvbnZlcnNpb24gdGhhdCBhIHByb3ZpZGVyIGltcGxlbWVudHMuCisgICAgICoKICAgICAgKiBAcGFyYW0gdXJpIFRoZSBkZXNpcmVkIFVSSSB0byBvcGVuLgogICAgICAqIEBwYXJhbSBtb2RlIFRoZSBmaWxlIG1vZGUgdG8gdXNlLCBhcyBwZXIge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuQXNzZXRGaWxlCiAgICAgICogQ29udGVudFByb3ZpZGVyLm9wZW5Bc3NldEZpbGV9LgpAQCAtNDc2LDI5ICs1MTIsOTcgQEAKICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUodXJpLmdldFBhdGgoKSksIG1vZGVUb01vZGUodXJpLCBtb2RlKSk7CiAgICAgICAgICAgICByZXR1cm4gbmV3IEFzc2V0RmlsZURlc2NyaXB0b3IocGZkLCAwLCAtMSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBJQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gYWNxdWlyZVByb3ZpZGVyKHVyaSk7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIk5vIGNvbnRlbnQgcHJvdmlkZXI6ICIgKyB1cmkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yIGZkID0gcHJvdmlkZXIub3BlbkFzc2V0RmlsZSh1cmksIG1vZGUpOwotICAgICAgICAgICAgICAgIGlmKGZkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVsZWFzZVByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBpZiAoInIiLmVxdWFscyhtb2RlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yKHVyaSwgIiovKiIsIG51bGwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBJQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gYWNxdWlyZVByb3ZpZGVyKHVyaSk7CisgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiTm8gY29udGVudCBwcm92aWRlcjogIiArIHVyaSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZCA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgZmQuZ2V0UGFyY2VsRmlsZURlc2NyaXB0b3IoKSwgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXNzZXRGaWxlRGVzY3JpcHRvcihwZmQsIGZkLmdldFN0YXJ0T2Zmc2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBmZC5nZXREZWNsYXJlZExlbmd0aCgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBmZCA9IHByb3ZpZGVyLm9wZW5Bc3NldEZpbGUodXJpLCBtb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoZmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZVByb3ZpZGVyKHByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZCA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLmdldFBhcmNlbEZpbGVEZXNjcmlwdG9yKCksIHByb3ZpZGVyKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBTdWNjZXNzISAgRG9uJ3QgcmVsZWFzZSB0aGUgcHJvdmlkZXIgd2hlbiBleGl0aW5nLCBsZXQKKyAgICAgICAgICAgICAgICAgICAgLy8gUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lciBkbyB0aGF0IHdoZW4gaXQgaXMgY2xvc2VkLgorICAgICAgICAgICAgICAgICAgICBwcm92aWRlciA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3NldEZpbGVEZXNjcmlwdG9yKHBmZCwgZmQuZ2V0U3RhcnRPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZC5nZXREZWNsYXJlZExlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJEZWFkIGNvbnRlbnQgcHJvdmlkZXI6ICIgKyB1cmkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VQcm92aWRlcihwcm92aWRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIGEgcmF3IGZpbGUgZGVzY3JpcHRvciB0byBhY2Nlc3MgKHBvdGVudGlhbGx5IHR5cGUgdHJhbnNmb3JtZWQpCisgICAgICogZGF0YSBmcm9tIGEgImNvbnRlbnQ6IiBVUkkuICBUaGlzIGludGVyYWN0cyB3aXRoIHRoZSB1bmRlcmx5aW5nCisgICAgICoge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuVHlwZWRBc3NldEZpbGV9IG1ldGhvZCBvZiB0aGUgcHJvdmlkZXIKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIFVSSSwgdG8gcmV0cmlldmUgcmV0cmlldmUgYW55IGFwcHJvcHJpYXRlCisgICAgICogZGF0YSBzdHJlYW0gZm9yIHRoZSBkYXRhIHN0b3JlZCB0aGVyZS4KKyAgICAgKgorICAgICAqIDxwPlVubGlrZSB7QGxpbmsgI29wZW5Bc3NldEZpbGVEZXNjcmlwdG9yfSwgdGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzCisgICAgICogd2l0aCAiY29udGVudDoiIFVSSXMsIGJlY2F1c2UgY29udGVudCBwcm92aWRlcnMgYXJlIHRoZSBvbmx5IGZhY2lsaXR5CisgICAgICogd2l0aCBhbiBhc3NvY2lhdGVkIE1JTUUgdHlwZSB0byBlbnN1cmUgdGhhdCB0aGUgcmV0dXJuZWQgZGF0YSBzdHJlYW0KKyAgICAgKiBpcyBvZiB0aGUgZGVzaXJlZCB0eXBlLgorICAgICAqCisgICAgICogPHA+QWxsIHRleHQvKiBzdHJlYW1zIGFyZSBlbmNvZGVkIGluIFVURi04LgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgZGVzaXJlZCBVUkkgdG8gb3Blbi4KKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIGRlc2lyZWQgTUlNRSB0eXBlIG9mIHRoZSByZXR1cm5lZCBkYXRhLiAgVGhpcyBjYW4KKyAgICAgKiBiZSBhIHBhdHRlcm4gc3VjaCBhcyAqXC8qLCB3aGljaCB3aWxsIGFsbG93IHRoZSBjb250ZW50IHByb3ZpZGVyIHRvCisgICAgICogc2VsZWN0IGEgdHlwZSwgdGhvdWdoIHRoZXJlIGlzIG5vIHdheSBmb3IgeW91IHRvIGRldGVybWluZSB3aGF0IHR5cGUKKyAgICAgKiBpdCBpcyByZXR1cm5pbmcuCisgICAgICogQHBhcmFtIG9wdHMgQWRkaXRpb25hbCBwcm92aWRlci1kZXBlbmRlbnQgb3B0aW9ucy4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IgZnJvbSB3aGljaCB5b3UgY2FuIHJlYWQgdGhlCisgICAgICogZGF0YSBzdHJlYW0gZnJvbSB0aGUgcHJvdmlkZXIuICBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYSBwaXBlLCBtZWFuaW5nCisgICAgICogeW91IGNhbid0IHNlZWsgaW4gaXQuICBUaGUgb25seSBzZWVrIHlvdSBzaG91bGQgZG8gaXMgaWYgdGhlCisgICAgICogQXNzZXRGaWxlRGVzY3JpcHRvciBjb250YWlucyBhbiBvZmZzZXQsIHRvIG1vdmUgdG8gdGhhdCBvZmZzZXQgYmVmb3JlCisgICAgICogcmVhZGluZy4gIFlvdSBvd24gdGhpcyBkZXNjcmlwdG9yIGFuZCBhcmUgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgaXQgd2hlbiBkb25lLgorICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIFRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gb2Ygbm8KKyAgICAgKiBkYXRhIG9mIHRoZSBkZXNpcmVkIHR5cGUgZXhpc3RzIHVuZGVyIHRoZSBVUkkuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIEFzc2V0RmlsZURlc2NyaXB0b3Igb3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcihVcmkgdXJpLAorICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgb3B0cykgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIElDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBhY3F1aXJlUHJvdmlkZXIodXJpKTsKKyAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIk5vIGNvbnRlbnQgcHJvdmlkZXI6ICIgKyB1cmkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yIGZkID0gcHJvdmlkZXIub3BlblR5cGVkQXNzZXRGaWxlKHVyaSwgbWltZVR5cGUsIG9wdHMpOworICAgICAgICAgICAgaWYgKGZkID09IG51bGwpIHsKICAgICAgICAgICAgICAgICByZWxlYXNlUHJvdmlkZXIocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkRlYWQgY29udGVudCBwcm92aWRlcjogIiArIHVyaSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkID0gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9ySW5uZXIoCisgICAgICAgICAgICAgICAgICAgIGZkLmdldFBhcmNlbEZpbGVEZXNjcmlwdG9yKCksIHByb3ZpZGVyKTsKKworICAgICAgICAgICAgLy8gU3VjY2VzcyEgIERvbid0IHJlbGVhc2UgdGhlIHByb3ZpZGVyIHdoZW4gZXhpdGluZywgbGV0CisgICAgICAgICAgICAvLyBQYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyIGRvIHRoYXQgd2hlbiBpdCBpcyBjbG9zZWQuCisgICAgICAgICAgICBwcm92aWRlciA9IG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgQXNzZXRGaWxlRGVzY3JpcHRvcihwZmQsIGZkLmdldFN0YXJ0T2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgIGZkLmdldERlY2xhcmVkTGVuZ3RoKCkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiRGVhZCBjb250ZW50IHByb3ZpZGVyOiAiICsgdXJpKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJlbGVhc2VQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJlbGVhc2VQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTEzNzYsNyArMTQ4MCw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDdXJzb3JXcmFwcGVySW5uZXIgZXh0ZW5kcyBDdXJzb3JXcmFwcGVyIHsKLSAgICAgICAgcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIG1Db250ZW50UHJvdmlkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgSUNvbnRlbnRQcm92aWRlciBtQ29udGVudFByb3ZpZGVyOwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUc9IkN1cnNvcldyYXBwZXJJbm5lciI7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ2xvc2VGbGFnID0gZmFsc2U7CiAKQEAgLTE0MDUsNyArMTUwOSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyIGV4dGVuZHMgUGFyY2VsRmlsZURlc2NyaXB0b3IgewotICAgICAgICBwcml2YXRlIElDb250ZW50UHJvdmlkZXIgbUNvbnRlbnRQcm92aWRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJQ29udGVudFByb3ZpZGVyIG1Db250ZW50UHJvdmlkZXI7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRz0iUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lciI7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtUmVsZWFzZVByb3ZpZGVyRmxhZyA9IGZhbHNlOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRWYWx1ZXMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFZhbHVlcy5qYXZhCmluZGV4IDc1Nzg3Y2QuLjBkMjVmODAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFZhbHVlcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFZhbHVlcy5qYXZhCkBAIC00MTQsNiArNDE0LDggQEAKICAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENoYXJTZXF1ZW5jZSkgewogICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoTnVtYmVyKSB2YWx1ZSkuaW50VmFsdWUoKSAhPSAwOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDYW5ub3QgY2FzdCB2YWx1ZSBmb3IgIiArIGtleSArICIgdG8gYSBCb29sZWFuOiAiICsgdmFsdWUsIGUpOwogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtNDQ2LDYgKzQ0OCwxNSBAQAogICAgICAgICByZXR1cm4gbVZhbHVlcy5lbnRyeVNldCgpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzZXQgb2YgYWxsIG9mIHRoZSBrZXlzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgc2V0IG9mIGFsbCBvZiB0aGUga2V5cworICAgICAqLworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBrZXlTZXQoKSB7CisgICAgICAgIHJldHVybiBtVmFsdWVzLmtleVNldCgpOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPENvbnRlbnRWYWx1ZXM+IENSRUFUT1IgPQogICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxDb250ZW50VmFsdWVzPigpIHsKICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJkZXByZWNhdGlvbiIsICJ1bmNoZWNrZWQifSkKQEAgLTQ4OCw2ICs0OTksMTAgQEAKICAgICAgICAgcmV0dXJuIChBcnJheUxpc3Q8U3RyaW5nPikgbVZhbHVlcy5nZXQoa2V5KTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb25jaXNlLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHQuamF2YQppbmRleCA2OTNiZTIxLi45YzhkNjk4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHQuamF2YQpAQCAtMjEsMTAgKzIxLDEyIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTY2FubmVyQ29ubmVjdGlvbi5PblNjYW5Db21wbGV0ZWRMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwpAQCAtNTg4LDYgKzU5MCwzMiBAQAogICAgICAgICAgICAgaW50IG1vZGUsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSk7CiAKICAgICAvKioKKyAgICAgKiBPcGVuIGEgbmV3IHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29udGV4dCdzCisgICAgICogYXBwbGljYXRpb24gcGFja2FnZS4gIENyZWF0ZXMgdGhlIGRhdGFiYXNlIGZpbGUgaWYgaXQgZG9lc24ndCBleGlzdC4KKyAgICAgKgorICAgICAqIDxwPkFjY2VwdHMgaW5wdXQgcGFyYW06IGEgY29uY3JldGUgaW5zdGFuY2Ugb2Yge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSB0byBiZQorICAgICAqIHVzZWQgdG8gaGFuZGxlIGNvcnJ1cHRpb24gd2hlbiBzcWxpdGUgcmVwb3J0cyBkYXRhYmFzZSBjb3JydXB0aW9uLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lICh1bmlxdWUgaW4gdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UpIG9mIHRoZSBkYXRhYmFzZS4KKyAgICAgKiBAcGFyYW0gbW9kZSBPcGVyYXRpbmcgbW9kZS4gIFVzZSAwIG9yIHtAbGluayAjTU9ERV9QUklWQVRFfSBmb3IgdGhlCisgICAgICogICAgIGRlZmF1bHQgb3BlcmF0aW9uLCB7QGxpbmsgI01PREVfV09STERfUkVBREFCTEV9CisgICAgICogICAgIGFuZCB7QGxpbmsgI01PREVfV09STERfV1JJVEVBQkxFfSB0byBjb250cm9sIHBlcm1pc3Npb25zLgorICAgICAqIEBwYXJhbSBmYWN0b3J5IEFuIG9wdGlvbmFsIGZhY3RvcnkgY2xhc3MgdGhhdCBpcyBjYWxsZWQgdG8gaW5zdGFudGlhdGUgYQorICAgICAqICAgICBjdXJzb3Igd2hlbiBxdWVyeSBpcyBjYWxsZWQuCisgICAgICogQHBhcmFtIGVycm9ySGFuZGxlciB0aGUge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSB0byBiZSB1c2VkIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UKKyAgICAgKiBjb3JydXB0aW9uLiBpZiBudWxsLCB7QGxpbmsgYW5kcm9pZC5kYXRhYmFzZS5EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXJ9IGlzIGFzc3VtZWQuCisgICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgYSBuZXdseSBjcmVhdGVkIGRhdGFiYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICogQHRocm93cyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24gaWYgdGhlIGRhdGFiYXNlIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZC4KKyAgICAgKgorICAgICAqIEBzZWUgI01PREVfUFJJVkFURQorICAgICAqIEBzZWUgI01PREVfV09STERfUkVBREFCTEUKKyAgICAgKiBAc2VlICNNT0RFX1dPUkxEX1dSSVRFQUJMRQorICAgICAqIEBzZWUgI2RlbGV0ZURhdGFiYXNlCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFNRTGl0ZURhdGFiYXNlIG9wZW5PckNyZWF0ZURhdGFiYXNlKFN0cmluZyBuYW1lLAorICAgICAgICAgICAgaW50IG1vZGUsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKTsKKworICAgIC8qKgogICAgICAqIERlbGV0ZSBhbiBleGlzdGluZyBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIENvbnRleHQncwogICAgICAqIGFwcGxpY2F0aW9uIHBhY2thZ2UuCiAgICAgICoKQEAgLTEzNTYsNyArMTM4NCwxNiBAQAogICAgICAqIEBzZWUgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXIKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9TRVJWSUNFID0gImxvY2F0aW9uIjsKLSAgICAKKworICAgIC8qKgorICAgICAqIFVzZSB3aXRoIHtAbGluayAjZ2V0U3lzdGVtU2VydmljZX0gdG8gcmV0cmlldmUgYQorICAgICAqIHtAbGluayBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnlEZXRlY3Rvcn0gZm9yIGRldGVjdGluZyB0aGUgY291bnRyeSB0aGF0CisgICAgICogdGhlIHVzZXIgaXMgaW4uCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPVU5UUllfREVURUNUT1IgPSAiY291bnRyeV9kZXRlY3RvciI7CisKICAgICAvKioKICAgICAgKiBVc2Ugd2l0aCB7QGxpbmsgI2dldFN5c3RlbVNlcnZpY2V9IHRvIHJldHJpZXZlIGEge0BsaW5rCiAgICAgICogYW5kcm9pZC5hcHAuU2VhcmNoTWFuYWdlcn0gZm9yIGhhbmRsaW5nIHNlYXJjaGVzLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0V3JhcHBlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0V3JhcHBlci5qYXZhCmluZGV4IGE0NDcxMDguLjNmNWQyMTUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dFdyYXBwZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHRXcmFwcGVyLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwpAQCAtMjA0LDYgKzIwNSwxMiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZShTdHJpbmcgbmFtZSwgaW50IG1vZGUsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwKKyAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgeworICAgICAgICByZXR1cm4gbUJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobmFtZSwgbW9kZSwgZmFjdG9yeSwgZXJyb3JIYW5kbGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVEYXRhYmFzZShTdHJpbmcgbmFtZSkgewogICAgICAgICByZXR1cm4gbUJhc2UuZGVsZXRlRGF0YWJhc2UobmFtZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DdXJzb3JMb2FkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ3Vyc29yTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3Njg3NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ3Vyc29yTG9hZGVyLmphdmEKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKKworLyoqCisgKiBBIGxvYWRlciB0aGF0IHF1ZXJpZXMgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IGFuZCByZXR1cm5zIGEge0BsaW5rIEN1cnNvcn0uCisgKi8KK3B1YmxpYyBjbGFzcyBDdXJzb3JMb2FkZXIgZXh0ZW5kcyBBc3luY1Rhc2tMb2FkZXI8Q3Vyc29yPiB7CisgICAgQ3Vyc29yIG1DdXJzb3I7CisgICAgRm9yY2VMb2FkQ29udGVudE9ic2VydmVyIG1PYnNlcnZlcjsKKyAgICBib29sZWFuIG1TdG9wcGVkOworICAgIFVyaSBtVXJpOworICAgIFN0cmluZ1tdIG1Qcm9qZWN0aW9uOworICAgIFN0cmluZyBtU2VsZWN0aW9uOworICAgIFN0cmluZ1tdIG1TZWxlY3Rpb25BcmdzOworICAgIFN0cmluZyBtU29ydE9yZGVyOworCisgICAgLyogUnVucyBvbiBhIHdvcmtlciB0aHJlYWQgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ3Vyc29yIGxvYWRJbkJhY2tncm91bmQoKSB7CisgICAgICAgIEN1cnNvciBjdXJzb3IgPSBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkobVVyaSwgbVByb2plY3Rpb24sIG1TZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgbVNlbGVjdGlvbkFyZ3MsIG1Tb3J0T3JkZXIpOworICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgY3Vyc29yIHdpbmRvdyBpcyBmaWxsZWQKKyAgICAgICAgICAgIGN1cnNvci5nZXRDb3VudCgpOworICAgICAgICAgICAgcmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoY3Vyc29yLCBtT2JzZXJ2ZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJzb3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGFuIG9ic2VydmVyIHRvIGdldCBub3RpZmljYXRpb25zIGZyb20gdGhlIGNvbnRlbnQgcHJvdmlkZXIKKyAgICAgKiB3aGVuIHRoZSBjdXJzb3IgbmVlZHMgdG8gYmUgcmVmcmVzaGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ29udGVudE9ic2VydmVyKEN1cnNvciBjdXJzb3IsIENvbnRlbnRPYnNlcnZlciBvYnNlcnZlcikgeworICAgICAgICBjdXJzb3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobU9ic2VydmVyKTsKKyAgICB9CisKKyAgICAvKiBSdW5zIG9uIHRoZSBVSSB0aHJlYWQgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZWxpdmVyUmVzdWx0KEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgaWYgKG1TdG9wcGVkKSB7CisgICAgICAgICAgICAvLyBBbiBhc3luYyBxdWVyeSBjYW1lIGluIHdoaWxlIHRoZSBsb2FkZXIgaXMgc3RvcHBlZAorICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ3Vyc29yIG9sZEN1cnNvciA9IG1DdXJzb3I7CisgICAgICAgIG1DdXJzb3IgPSBjdXJzb3I7CisgICAgICAgIHN1cGVyLmRlbGl2ZXJSZXN1bHQoY3Vyc29yKTsKKworICAgICAgICBpZiAob2xkQ3Vyc29yICE9IG51bGwgJiYgIW9sZEN1cnNvci5pc0Nsb3NlZCgpKSB7CisgICAgICAgICAgICBvbGRDdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDdXJzb3JMb2FkZXIoQ29udGV4dCBjb250ZXh0LCBVcmkgdXJpLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLAorICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlcikgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgbU9ic2VydmVyID0gbmV3IEZvcmNlTG9hZENvbnRlbnRPYnNlcnZlcigpOworICAgICAgICBtVXJpID0gdXJpOworICAgICAgICBtUHJvamVjdGlvbiA9IHByb2plY3Rpb247CisgICAgICAgIG1TZWxlY3Rpb24gPSBzZWxlY3Rpb247CisgICAgICAgIG1TZWxlY3Rpb25BcmdzID0gc2VsZWN0aW9uQXJnczsKKyAgICAgICAgbVNvcnRPcmRlciA9IHNvcnRPcmRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydHMgYW4gYXN5bmNocm9ub3VzIGxvYWQgb2YgdGhlIGNvbnRhY3RzIGxpc3QgZGF0YS4gV2hlbiB0aGUgcmVzdWx0IGlzIHJlYWR5IHRoZSBjYWxsYmFja3MKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgVUkgdGhyZWFkLiBJZiBhIHByZXZpb3VzIGxvYWQgaGFzIGJlZW4gY29tcGxldGVkIGFuZCBpcyBzdGlsbCB2YWxpZAorICAgICAqIHRoZSByZXN1bHQgbWF5IGJlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2tzIGltbWVkaWF0ZWx5LgorICAgICAqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnRMb2FkaW5nKCkgeworICAgICAgICBtU3RvcHBlZCA9IGZhbHNlOworCisgICAgICAgIGlmIChtQ3Vyc29yICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRlbGl2ZXJSZXN1bHQobUN1cnNvcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3JjZUxvYWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0b3BMb2FkaW5nKCkgeworICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsICYmICFtQ3Vyc29yLmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgIG1DdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBtQ3Vyc29yID0gbnVsbDsKKworICAgICAgICAvLyBBdHRlbXB0IHRvIGNhbmNlbCB0aGUgY3VycmVudCBsb2FkIHRhc2sgaWYgcG9zc2libGUuCisgICAgICAgIGNhbmNlbExvYWQoKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBhbnkgb3V0c3RhbmRpbmcgbG9hZHMgY2xlYW4gdGhlbXNlbHZlcyB1cCBwcm9wZXJseQorICAgICAgICBtU3RvcHBlZCA9IHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DYW5jZWxsZWQoQ3Vyc29yIGN1cnNvcikgeworICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwgJiYgIWN1cnNvci5pc0Nsb3NlZCgpKSB7CisgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgIC8vIEVuc3VyZSB0aGUgbG9hZGVyIGlzIHN0b3BwZWQKKyAgICAgICAgc3RvcExvYWRpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVXJpIGdldFVyaSgpIHsKKyAgICAgICAgcmV0dXJuIG1Vcmk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXJpKFVyaSB1cmkpIHsKKyAgICAgICAgbVVyaSA9IHVyaTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJvamVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9qZWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3Rpb24oU3RyaW5nW10gcHJvamVjdGlvbikgeworICAgICAgICBtUHJvamVjdGlvbiA9IHByb2plY3Rpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBtU2VsZWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihTdHJpbmcgc2VsZWN0aW9uKSB7CisgICAgICAgIG1TZWxlY3Rpb24gPSBzZWxlY3Rpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFNlbGVjdGlvbkFyZ3MoKSB7CisgICAgICAgIHJldHVybiBtU2VsZWN0aW9uQXJnczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25BcmdzKFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgbVNlbGVjdGlvbkFyZ3MgPSBzZWxlY3Rpb25BcmdzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U29ydE9yZGVyKCkgeworICAgICAgICByZXR1cm4gbVNvcnRPcmRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTb3J0T3JkZXIoU3RyaW5nIHNvcnRPcmRlcikgeworICAgICAgICBtU29ydE9yZGVyID0gc29ydE9yZGVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNsaXBib2FyZC5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ2xpcGJvYXJkLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU0OTAxYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNsaXBib2FyZC5haWRsCkBAIC0wLDAgKzEsNDAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGE7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXI7CisKKy8qKgorICogUHJvZ3JhbW1pbmcgaW50ZXJmYWNlIHRvIHRoZSBjbGlwYm9hcmQsIHdoaWNoIGFsbG93cyBjb3B5aW5nIGFuZCBwYXN0aW5nCisgKiBiZXR3ZWVuIGFwcGxpY2F0aW9ucy4KKyAqIHtAaGlkZX0KKyAqLworaW50ZXJmYWNlIElDbGlwYm9hcmQgeworICAgIHZvaWQgc2V0UHJpbWFyeUNsaXAoaW4gQ2xpcERhdGEgY2xpcCk7CisgICAgQ2xpcERhdGEgZ2V0UHJpbWFyeUNsaXAoU3RyaW5nIHBrZyk7CisgICAgQ2xpcERlc2NyaXB0aW9uIGdldFByaW1hcnlDbGlwRGVzY3JpcHRpb24oKTsKKyAgICBib29sZWFuIGhhc1ByaW1hcnlDbGlwKCk7CisgICAgdm9pZCBhZGRQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcihpbiBJT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcik7CisgICAgdm9pZCByZW1vdmVQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcihpbiBJT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNsaXBib2FyZCBjb250YWlucyB0ZXh0OyBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBoYXNDbGlwYm9hcmRUZXh0KCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDb250ZW50UHJvdmlkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IDY3ZTc1ODEuLjhmMTIyY2UgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC01OSw2ICs1OSw3IEBACiAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb247CiAgICAgcHVibGljIENvbnRlbnRQcm92aWRlclJlc3VsdFtdIGFwcGx5QmF0Y2goQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4gb3BlcmF0aW9ucykKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIE9wZXJhdGlvbkFwcGxpY2F0aW9uRXhjZXB0aW9uOworCiAgICAgLyoqCiAgICAgICogQGhpZGUgLS0gdW50aWwgaW50ZXJmYWNlIGhhcyBwcm92ZW4gaXRzZWxmCiAgICAgICoKQEAgLTcxLDYgKzcyLDExIEBACiAgICAgICovCiAgICAgcHVibGljIEJ1bmRsZSBjYWxsKFN0cmluZyBtZXRob2QsIFN0cmluZyByZXF1ZXN0LCBCdW5kbGUgYXJncykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKIAorICAgIC8vIERhdGEgaW50ZXJjaGFuZ2UuCisgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKyAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGUoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgb3B0cykKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKKwogICAgIC8qIElQQyBjb25zdGFudHMgKi8KICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRlc2NyaXB0b3IgPSAiYW5kcm9pZC5jb250ZW50LklDb250ZW50UHJvdmlkZXIiOwogCkBAIC04NCw0ICs5MCw2IEBACiAgICAgc3RhdGljIGZpbmFsIGludCBPUEVOX0FTU0VUX0ZJTEVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxNDsKICAgICBzdGF0aWMgZmluYWwgaW50IEFQUExZX0JBVENIX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTk7CiAgICAgc3RhdGljIGZpbmFsIGludCBDQUxMX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjA7CisgICAgc3RhdGljIGZpbmFsIGludCBHRVRfU1RSRUFNX1RZUEVTX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjE7CisgICAgc3RhdGljIGZpbmFsIGludCBPUEVOX1RZUEVEX0FTU0VUX0ZJTEVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMjsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjQyYTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lci5haWRsCkBAIC0wLDAgKzEsMjEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK29uZXdheSBpbnRlcmZhY2UgSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgeworICAgIHZvaWQgZGlzcGF0Y2hQcmltYXJ5Q2xpcENoYW5nZWQoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0ludGVudC5qYXZhCmluZGV4IDcxNTRhZWUuLjRkMGI4YjAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JbnRlbnQuamF2YQpAQCAtNTM0LDYgKzUzNCw3IEBACiAgKiAgICAgPGxpPiB7QGxpbmsgI0NBVEVHT1JZX0NBUl9ET0NLfQogICogICAgIDxsaT4ge0BsaW5rICNDQVRFR09SWV9ERVNLX0RPQ0t9CiAgKiAgICAgPGxpPiB7QGxpbmsgI0NBVEVHT1JZX0NBUl9NT0RFfQorICogICAgIDxsaT4ge0BsaW5rICNDQVRFR09SWV9BUFBfTUFSS0VUfQogICogPC91bD4KICAqCiAgKiA8aDM+U3RhbmRhcmQgRXh0cmEgRGF0YTwvaDM+CkBAIC05ODUsNiArOTg2LDE1IEBACiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5BQ1RJVklUWV9JTlRFTlRfQUNUSU9OKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JTlNFUlQgPSAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLklOU0VSVCI7CiAgICAgLyoqCisgICAgICogQWN0aXZpdHkgQWN0aW9uOiBDcmVhdGUgYSBuZXcgaXRlbSBpbiB0aGUgZ2l2ZW4gY29udGFpbmVyLCBpbml0aWFsaXppbmcgaXQKKyAgICAgKiBmcm9tIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBjbGlwYm9hcmQuCisgICAgICogPHA+SW5wdXQ6IHtAbGluayAjZ2V0RGF0YX0gaXMgVVJJIG9mIHRoZSBkaXJlY3RvcnkgKHZuZC5hbmRyb2lkLmN1cnNvci5kaXIvKikKKyAgICAgKiBpbiB3aGljaCB0byBwbGFjZSB0aGUgZGF0YS4KKyAgICAgKiA8cD5PdXRwdXQ6IFVSSSBvZiB0aGUgbmV3IGRhdGEgdGhhdCB3YXMgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkFDVElWSVRZX0lOVEVOVF9BQ1RJT04pCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1BBU1RFID0gImFuZHJvaWQuaW50ZW50LmFjdGlvbi5QQVNURSI7CisgICAgLyoqCiAgICAgICogQWN0aXZpdHkgQWN0aW9uOiBEZWxldGUgdGhlIGdpdmVuIGRhdGEgZnJvbSBpdHMgY29udGFpbmVyLgogICAgICAqIDxwPklucHV0OiB7QGxpbmsgI2dldERhdGF9IGlzIFVSSSBvZiBkYXRhIHRvIGJlIGRlbGV0ZWQuCiAgICAgICogPHA+T3V0cHV0OiBub3RoaW5nLgpAQCAtMjAwMSw2ICsyMDExLDExIEBACiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5JTlRFTlRfQ0FURUdPUlkpCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfRU1CRUQgPSAiYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuRU1CRUQiOwogICAgIC8qKgorICAgICAqIFRoaXMgYWN0aXZpdHkgYWxsb3dzIHRoZSB1c2VyIHRvIGJyb3dzZSBhbmQgZG93bmxvYWQgbmV3IGFwcGxpY2F0aW9ucy4KKyAgICAgKi8KKyAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLklOVEVOVF9DQVRFR09SWSkKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9BUFBfTUFSS0VUID0gImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkFQUF9NQVJLRVQiOworICAgIC8qKgogICAgICAqIFRoaXMgYWN0aXZpdHkgbWF5IGJlIGV4ZXJjaXNlZCBieSB0aGUgbW9ua2V5IG9yIG90aGVyIGF1dG9tYXRlZCB0ZXN0IHRvb2xzLgogICAgICAqLwogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuSU5URU5UX0NBVEVHT1JZKQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Mb2FkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM0MDk2YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvTG9hZGVyLmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKKworLyoqCisgKiBBbiBhYnN0cmFjdCBjbGFzcyB0aGF0IHBlcmZvcm1zIGFzeW5jaHJvbm91cyBsb2FkaW5nIG9mIGRhdGEuIFdoaWxlIExvYWRlcnMgYXJlIGFjdGl2ZQorICogdGhleSBzaG91bGQgbW9uaXRvciB0aGUgc291cmNlIG9mIHRoZWlyIGRhdGEgYW5kIGRlbGl2ZXIgbmV3IHJlc3VsdHMgd2hlbiB0aGUgY29udGVudHMKKyAqIGNoYW5nZS4KKyAqCisgKiBAcGFyYW0gPEQ+IFRoZSByZXN1bHQgcmV0dXJuZWQgd2hlbiB0aGUgbG9hZCBpcyBjb21wbGV0ZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTG9hZGVyPEQ+IHsKKyAgICBpbnQgbUlkOworICAgIE9uTG9hZENvbXBsZXRlTGlzdGVuZXI8RD4gbUxpc3RlbmVyOworICAgIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICBwdWJsaWMgZmluYWwgY2xhc3MgRm9yY2VMb2FkQ29udGVudE9ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICAgICAgcHVibGljIEZvcmNlTG9hZENvbnRlbnRPYnNlcnZlcigpIHsKKyAgICAgICAgICAgIHN1cGVyKG5ldyBIYW5kbGVyKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGRlbGl2ZXJTZWxmTm90aWZpY2F0aW9ucygpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKGJvb2xlYW4gc2VsZkNoYW5nZSkgeworICAgICAgICAgICAgb25Db250ZW50Q2hhbmdlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPbkxvYWRDb21wbGV0ZUxpc3RlbmVyPEQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCBvbiB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgTG9hZGVyIHdoZW4gdGhlIGxvYWQgaXMgY29tcGxldGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBsb2FkZXIgdGhlIGxvYWRlciB0aGF0IGNvbXBsZXRlZCB0aGUgbG9hZAorICAgICAgICAgKiBAcGFyYW0gZGF0YSB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkxvYWRDb21wbGV0ZShMb2FkZXI8RD4gbG9hZGVyLCBEIGRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3JlcyBhd2F5IHRoZSBhcHBsaWNhdGlvbiBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCBjb250ZXh0LiBTaW5jZSBMb2FkZXJzIGNhbiBiZSB1c2VkCisgICAgICogYWNyb3NzIG11bHRpcGxlIGFjdGl2aXRpZXMgaXQncyBkYW5nZXJvdXMgdG8gc3RvcmUgdGhlIGNvbnRleHQgZGlyZWN0bHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB1c2VkIHRvIHJldHJpZXZlIHRoZSBhcHBsaWNhdGlvbiBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkIHRvIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVyLiBTaG91bGQgb25seSBiZSBjYWxsZWQgYnkgc3ViY2xhc3Nlcy4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIHRoZSByZXN1bHQgb2YgdGhlIGxvYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWxpdmVyUmVzdWx0KEQgZGF0YSkgeworICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lci5vbkxvYWRDb21wbGV0ZSh0aGlzLCBkYXRhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYW4gYXBwbGljYXRpb24gY29udGV4dCByZXRyaWV2ZWQgZnJvbSB0aGUgQ29udGV4dCBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBtQ29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBJRCBvZiB0aGlzIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBtSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgY2xhc3MgdGhhdCB3aWxsIHJlY2VpdmUgY2FsbGJhY2tzIHdoZW4gYSBsb2FkIGlzIGNvbXBsZXRlLiBUaGUgY2FsbGJhY2tzIHdpbGwKKyAgICAgKiBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZCBzbyBpdCdzIHNhZmUgdG8gcGFzcyB0aGUgcmVzdWx0cyB0byB3aWRnZXRzLgorICAgICAqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihpbnQgaWQsIE9uTG9hZENvbXBsZXRlTGlzdGVuZXI8RD4gbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBpcyBhbHJlYWR5IGEgbGlzdGVuZXIgcmVnaXN0ZXJlZCIpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICBtSWQgPSBpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyTGlzdGVuZXIoT25Mb2FkQ29tcGxldGVMaXN0ZW5lcjxEPiBsaXN0ZW5lcikgeworICAgICAgICBpZiAobUxpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIGxpc3RlbmVyIHJlZ2lzdGVyIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBsaXN0ZW5lcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXR0ZW1wdGluZyB0byB1bnJlZ2lzdGVyIHRoZSB3cm9uZyBsaXN0ZW5lciIpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lciA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIGFuIGFzeW5jaHJvbm91cyBsb2FkIG9mIHRoZSBjb250YWN0cyBsaXN0IGRhdGEuIFdoZW4gdGhlIHJlc3VsdCBpcyByZWFkeSB0aGUgY2FsbGJhY2tzCisgICAgICogd2lsbCBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZC4gSWYgYSBwcmV2aW91cyBsb2FkIGhhcyBiZWVuIGNvbXBsZXRlZCBhbmQgaXMgc3RpbGwgdmFsaWQKKyAgICAgKiB0aGUgcmVzdWx0IG1heSBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrcyBpbW1lZGlhdGVseS4gVGhlIGxvYWRlciB3aWxsIG1vbml0b3IgdGhlIHNvdXJjZSBvZgorICAgICAqIHRoZSBkYXRhIHNldCBhbmQgbWF5IGRlbGl2ZXIgZnV0dXJlIGNhbGxiYWNrcyBpZiB0aGUgc291cmNlIGNoYW5nZXMuIENhbGxpbmcKKyAgICAgKiB7QGxpbmsgI3N0b3BMb2FkaW5nfSB3aWxsIHN0b3AgdGhlIGRlbGl2ZXJ5IG9mIGNhbGxiYWNrcy4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0TG9hZGluZygpOworCisgICAgLyoqCisgICAgICogRm9yY2UgYW4gYXN5bmNocm9ub3VzIGxvYWQuIFVubGlrZSB7QGxpbmsgI3N0YXJ0TG9hZGluZygpfSB0aGlzIHdpbGwgaWdub3JlIGEgcHJldmlvdXNseQorICAgICAqIGxvYWRlZCBkYXRhIHNldCBhbmQgbG9hZCBhIG5ldyBvbmUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZm9yY2VMb2FkKCk7CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyBkZWxpdmVyeSBvZiB1cGRhdGVzIHVudGlsIHRoZSBuZXh0IHRpbWUge0BsaW5rICNzdGFydExvYWRpbmcoKX0gaXMgY2FsbGVkCisgICAgICoKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdG9wTG9hZGluZygpOworCisgICAgLyoqCisgICAgICogRGVzdHJveXMgdGhlIGxvYWRlciBhbmQgZnJlZXMgaXRzIHJlc291cmNlcywgbWFraW5nIGl0IHVudXNhYmxlLgorICAgICAqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZGVzdHJveSgpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4ge0BsaW5rIEZvcmNlTG9hZENvbnRlbnRPYnNlcnZlcn0gZGV0ZWN0cyBhIGNoYW5nZS4gIENhbGxzIHtAbGluayAjZm9yY2VMb2FkKCl9CisgICAgICogYnkgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQ29udGVudENoYW5nZWQoKSB7CisgICAgICAgIGZvcmNlTG9hZCgpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1NoYXJlZFByZWZlcmVuY2VzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1NoYXJlZFByZWZlcmVuY2VzLmphdmEKaW5kZXggMTQ4NDIwNC4uYzA3ODhmNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TaGFyZWRQcmVmZXJlbmNlcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU2hhcmVkUHJlZmVyZW5jZXMuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKgogICogSW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgYW5kIG1vZGlmeWluZyBwcmVmZXJlbmNlIGRhdGEgcmV0dXJuZWQgYnkge0BsaW5rCkBAIC03MSw2ICs3MiwxNyBAQAogICAgICAgICBFZGl0b3IgcHV0U3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSk7CiAgICAgICAgIAogICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGEgc2V0IG9mIFN0cmluZyB2YWx1ZXMgaW4gdGhlIHByZWZlcmVuY2VzIGVkaXRvciwgdG8gYmUgd3JpdHRlbgorICAgICAgICAgKiBiYWNrIG9uY2Uge0BsaW5rICNjb21taXR9IGlzIGNhbGxlZC4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdG8gbW9kaWZ5LgorICAgICAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBuZXcgdmFsdWVzIGZvciB0aGUgcHJlZmVyZW5jZS4KKyAgICAgICAgICogQHJldHVybiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIEVkaXRvciBvYmplY3QsIHNvIHlvdSBjYW4KKyAgICAgICAgICogY2hhaW4gcHV0IGNhbGxzIHRvZ2V0aGVyLgorICAgICAgICAgKi8KKyAgICAgICAgRWRpdG9yIHB1dFN0cmluZ1NldChTdHJpbmcga2V5LCBTZXQ8U3RyaW5nPiB2YWx1ZXMpOworICAgICAgICAKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFNldCBhbiBpbnQgdmFsdWUgaW4gdGhlIHByZWZlcmVuY2VzIGVkaXRvciwgdG8gYmUgd3JpdHRlbiBiYWNrIG9uY2UKICAgICAgICAgICoge0BsaW5rICNjb21taXR9IG9yIHtAbGluayAjYXBwbHl9IGFyZSBjYWxsZWQuCiAgICAgICAgICAqIApAQCAtMjE4LDYgKzIzMCwyMCBAQAogICAgIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIGRlZlZhbHVlKTsKICAgICAKICAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBhIHNldCBvZiBTdHJpbmcgdmFsdWVzIGZyb20gdGhlIHByZWZlcmVuY2VzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdG8gcmV0cmlldmUuCisgICAgICogQHBhcmFtIGRlZlZhbHVlcyBWYWx1ZXMgdG8gcmV0dXJuIGlmIHRoaXMgcHJlZmVyZW5jZSBkb2VzIG5vdCBleGlzdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByZWZlcmVuY2UgdmFsdWVzIGlmIHRoZXkgZXhpc3QsIG9yIGRlZlZhbHVlcy4KKyAgICAgKiBUaHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJlZmVyZW5jZSB3aXRoIHRoaXMgbmFtZQorICAgICAqIHRoYXQgaXMgbm90IGEgU2V0LgorICAgICAqIAorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCisgICAgICovCisgICAgU2V0PFN0cmluZz4gZ2V0U3RyaW5nU2V0KFN0cmluZyBrZXksIFNldDxTdHJpbmc+IGRlZlZhbHVlcyk7CisgICAgCisgICAgLyoqCiAgICAgICogUmV0cmlldmUgYW4gaW50IHZhbHVlIGZyb20gdGhlIHByZWZlcmVuY2VzLgogICAgICAqIAogICAgICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UgdG8gcmV0cmlldmUuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyLmphdmEKaW5kZXggMjZiNmFkNy4uYzkxMTVjNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXIuamF2YQpAQCAtMTYsNiArMTYsMjAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CiAKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOworaW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5jb2xsZWN0Lk1hcHM7CisKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKIApAQCAtMzQsMTcgKzQ4LDYgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVnaXN0ZXJlZFNlcnZpY2VzQ2FjaGVMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5Xb3JrU291cmNlOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlVXRpbHM7CkBAIC01NiwxMCArNTksMTMgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CiAKIC8qKgpAQCAtNzgsMzAgKzg0LDE3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQVhfVElNRV9QRVJfU1lOQzsKIAogICAgIHN0YXRpYyB7Ci0gICAgICAgIFN0cmluZyBsb2NhbFN5bmNEZWxheVN0cmluZyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJzeW5jLmxvY2FsX3N5bmNfZGVsYXkiKTsKLSAgICAgICAgbG9uZyBsb2NhbFN5bmNEZWxheSA9IDMwICogMTAwMDsgLy8gMzAgc2Vjb25kcwotICAgICAgICBpZiAobG9jYWxTeW5jRGVsYXlTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBsb2NhbFN5bmNEZWxheSA9IExvbmcucGFyc2VMb25nKGxvY2FsU3luY0RlbGF5U3RyaW5nKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUsIHVzZSBkZWZhdWx0Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgTE9DQUxfU1lOQ19ERUxBWSA9IGxvY2FsU3luY0RlbGF5OwotCi0gICAgICAgIFN0cmluZyBtYXhUaW1lUGVyU3luY1N0cmluZyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJzeW5jLm1heF90aW1lX3Blcl9zeW5jIik7Ci0gICAgICAgIGxvbmcgbWF4VGltZVBlclN5bmMgPSA1ICogNjAgKiAxMDAwOyAvLyA1IG1pbnV0ZXMKLSAgICAgICAgaWYgKG1heFRpbWVQZXJTeW5jU3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbWF4VGltZVBlclN5bmMgPSBMb25nLnBhcnNlTG9uZyhtYXhUaW1lUGVyU3luY1N0cmluZyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlLCB1c2UgZGVmYXVsdAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIE1BWF9USU1FX1BFUl9TWU5DID0gbWF4VGltZVBlclN5bmM7CisgICAgICAgIE1BWF9TSU1VTFRBTkVPVVNfSU5JVElBTElaQVRJT05fU1lOQ1MgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEludCgic3luYy5tYXhfaW5pdF9zeW5jcyIsIDUpOworICAgICAgICBNQVhfU0lNVUxUQU5FT1VTX1JFR1VMQVJfU1lOQ1MgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEludCgic3luYy5tYXhfcmVndWxhcl9zeW5jcyIsIDIpOworICAgICAgICBMT0NBTF9TWU5DX0RFTEFZID0KKyAgICAgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLmdldExvbmcoInN5bmMubG9jYWxfc3luY19kZWxheSIsIDMwICogMTAwMCAvKiAzMCBzZWNvbmRzICovKTsKKyAgICAgICAgTUFYX1RJTUVfUEVSX1NZTkMgPQorICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuZ2V0TG9uZygic3luYy5tYXhfdGltZV9wZXJfc3luYyIsIDUgKiA2MCAqIDEwMDAgLyogNSBtaW51dGVzICovKTsKKyAgICAgICAgU1lOQ19OT1RJRklDQVRJT05fREVMQVkgPQorICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuZ2V0TG9uZygic3luYy5ub3RpZmljYXRpb25fZGVsYXkiLCAzMCAqIDEwMDAgLyogMzAgc2Vjb25kcyAqLyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTWU5DX05PVElGSUNBVElPTl9ERUxBWSA9IDMwICogMTAwMDsgLy8gMzAgc2Vjb25kcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU1lOQ19OT1RJRklDQVRJT05fREVMQVk7CiAKICAgICAvKioKICAgICAgKiBXaGVuIHJldHJ5aW5nIGEgc3luYyBmb3IgdGhlIGZpcnN0IHRpbWUgdXNlIHRoaXMgZGVsYXkuIEFmdGVyIHRoYXQKQEAgLTEyMCwyMiArMTEzLDIxIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFTEFZX1JFVFJZX1NZTkNfSU5fUFJPR1JFU1NfSU5fU0VDT05EUyA9IDEwOwogCi0gICAgLyoqCi0gICAgICogQW4gZXJyb3Igbm90aWZpY2F0aW9uIGlzIHNlbnQgaWYgc3luYyBvZiBhbnkgb2YgdGhlIHByb3ZpZGVycyBoYXMgYmVlbiBmYWlsaW5nIGZvciB0aGlzIGxvbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBFUlJPUl9OT1RJRklDQVRJT05fREVMQVlfTVMgPSAxMDAwICogNjAgKiAxMDsgLy8gMTAgbWludXRlcwotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxJWkFUSU9OX1VOQklORF9ERUxBWV9NUyA9IDUwMDA7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQ19XQUtFX0xPQ0sgPSAiKnN5bmMqIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQ19XQUtFX0xPQ0tfUFJFRklYID0gIipzeW5jKiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTkRMRV9TWU5DX0FMQVJNX1dBS0VfTE9DSyA9ICJTeW5jTWFuYWdlckhhbmRsZVN5bmNBbGFybSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkNfTE9PUF9XQUtFX0xPQ0sgPSAiU3luY0xvb3BXYWtlTG9jayI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NJTVVMVEFORU9VU19SRUdVTEFSX1NZTkNTOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfU0lNVUxUQU5FT1VTX0lOSVRJQUxJWkFUSU9OX1NZTkNTOwogCiAgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwogCiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBBY2NvdW50W10gbUFjY291bnRzID0gSU5JVElBTF9BQ0NPVU5UU19BUlJBWTsKIAotICAgIHZvbGF0aWxlIHByaXZhdGUgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG1TeW5jV2FrZUxvY2s7CiAgICAgdm9sYXRpbGUgcHJpdmF0ZSBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbUhhbmRsZUFsYXJtV2FrZUxvY2s7CisgICAgdm9sYXRpbGUgcHJpdmF0ZSBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbVN5bmNNYW5hZ2VyV2FrZUxvY2s7CiAgICAgdm9sYXRpbGUgcHJpdmF0ZSBib29sZWFuIG1EYXRhQ29ubmVjdGlvbklzQ29ubmVjdGVkID0gZmFsc2U7CiAgICAgdm9sYXRpbGUgcHJpdmF0ZSBib29sZWFuIG1TdG9yYWdlSXNMb3cgPSBmYWxzZTsKIApAQCAtMTQ1LDEwICsxMzcsOCBAQAogICAgIHByaXZhdGUgZmluYWwgU3luY1N0b3JhZ2VFbmdpbmUgbVN5bmNTdG9yYWdlRW5naW5lOwogICAgIHB1YmxpYyBmaW5hbCBTeW5jUXVldWUgbVN5bmNRdWV1ZTsKIAotICAgIHByaXZhdGUgQWN0aXZlU3luY0NvbnRleHQgbUFjdGl2ZVN5bmNDb250ZXh0ID0gbnVsbDsKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxBY3RpdmVTeW5jQ29udGV4dD4gbUFjdGl2ZVN5bmNDb250ZXh0cyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOwogCi0gICAgLy8gc2V0IGlmIHRoZSBzeW5jIGVycm9yIGluZGljYXRvciBzaG91bGQgYmUgcmVwb3J0ZWQuCi0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkU3luY0Vycm9yTm90aWZpY2F0aW9uID0gZmFsc2U7CiAgICAgLy8gc2V0IGlmIHRoZSBzeW5jIGFjdGl2ZSBpbmRpY2F0b3Igc2hvdWxkIGJlIHJlcG9ydGVkCiAgICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkU3luY0FjdGl2ZU5vdGlmaWNhdGlvbiA9IGZhbHNlOwogCkBAIC0xOTYsNiArMTg2LDExIEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBY2NvdW50W10gSU5JVElBTF9BQ0NPVU5UU19BUlJBWSA9IG5ldyBBY2NvdW50WzBdOwogCisgICAgcHJpdmF0ZSBmaW5hbCBQb3dlck1hbmFnZXIgbVBvd2VyTWFuYWdlcjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU1lOQ19BTEFSTV9USU1FT1VUX01JTiA9IDMwICogMTAwMDsgLy8gMzAgc2Vjb25kcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU1lOQ19BTEFSTV9USU1FT1VUX01BWCA9IDIgKiA2MCAqIDYwICogMTAwMDsgLy8gdHdvIGhvdXJzCisKICAgICBwdWJsaWMgdm9pZCBvbkFjY291bnRzVXBkYXRlZChBY2NvdW50W10gYWNjb3VudHMpIHsKICAgICAgICAgLy8gcmVtZW1iZXIgaWYgdGhpcyB3YXMgdGhlIGZpcnN0IHRpbWUgdGhpcyB3YXMgY2FsbGVkIGFmdGVyIGFuIHVwZGF0ZQogICAgICAgICBmaW5hbCBib29sZWFuIGp1c3RCb290ZWRVcCA9IG1BY2NvdW50cyA9PSBJTklUSUFMX0FDQ09VTlRTX0FSUkFZOwpAQCAtMjAzLDExICsxOTgsMTAgQEAKIAogICAgICAgICAvLyBpZiBhIHN5bmMgaXMgaW4gcHJvZ3Jlc3MgeWV0IGl0IGlzIG5vIGxvbmdlciBpbiB0aGUgYWNjb3VudHMgbGlzdCwKICAgICAgICAgLy8gY2FuY2VsIGl0Ci0gICAgICAgIEFjdGl2ZVN5bmNDb250ZXh0IGFjdGl2ZVN5bmNDb250ZXh0ID0gbUFjdGl2ZVN5bmNDb250ZXh0OwotICAgICAgICBpZiAoYWN0aXZlU3luY0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFBcnJheVV0aWxzLmNvbnRhaW5zKGFjY291bnRzLCBhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5hY2NvdW50KSkgeworICAgICAgICBmb3IgKEFjdGl2ZVN5bmNDb250ZXh0IGN1cnJlbnRTeW5jQ29udGV4dCA6IG1BY3RpdmVTeW5jQ29udGV4dHMpIHsKKyAgICAgICAgICAgIGlmICghQXJyYXlVdGlscy5jb250YWlucyhhY2NvdW50cywgY3VycmVudFN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uLmFjY291bnQpKSB7CiAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY2FuY2VsaW5nIHN5bmMgc2luY2UgdGhlIGFjY291bnQgaGFzIGJlZW4gcmVtb3ZlZCIpOwotICAgICAgICAgICAgICAgIHNlbmRTeW5jRmluaXNoZWRPckNhbmNlbGVkTWVzc2FnZShhY3RpdmVTeW5jQ29udGV4dCwKKyAgICAgICAgICAgICAgICBzZW5kU3luY0ZpbmlzaGVkT3JDYW5jZWxlZE1lc3NhZ2UoY3VycmVudFN5bmNDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBubyByZXN1bHQgc2luY2UgdGhpcyBpcyBhIGNhbmNlbCAqLyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIzNCw2ICsyMjgsNyBAQAogICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgdGhlIGJvb3R1cCBjYXNlIHRoZW4gZG9uJ3Qgc3luYyBldmVyeXRoaW5nLCBpbnN0ZWFkIG9ubHkKICAgICAgICAgICAgIC8vIHN5bmMgdGhvc2UgdGhhdCBoYXZlIGFuIHVua25vd24gc3luY2FibGUgc3RhdGUsIHdoaWNoIHdpbGwgZ2l2ZSB0aGVtCiAgICAgICAgICAgICAvLyBhIGNoYW5jZSB0byBzZXQgdGhlaXIgc3luY2FibGUgc3RhdGUuCisKICAgICAgICAgICAgIGJvb2xlYW4gb25seVRob3NlV2l0aFVua293blN5bmNhYmxlU3RhdGUgPSBqdXN0Qm9vdGVkVXA7CiAgICAgICAgICAgICBzY2hlZHVsZVN5bmMobnVsbCwgbnVsbCwgbnVsbCwgMCAvKiBubyBkZWxheSAqLywgb25seVRob3NlV2l0aFVua293blN5bmNhYmxlU3RhdGUpOwogICAgICAgICB9CkBAIC0zNTcsMTggKzM1MiwyNSBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbU5vdGlmaWNhdGlvbk1nciA9IG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgUG93ZXJNYW5hZ2VyIHBtID0gKFBvd2VyTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuUE9XRVJfU0VSVklDRSk7Ci0gICAgICAgIG1TeW5jV2FrZUxvY2sgPSBwbS5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIFNZTkNfV0FLRV9MT0NLKTsKLSAgICAgICAgbVN5bmNXYWtlTG9jay5zZXRSZWZlcmVuY2VDb3VudGVkKGZhbHNlKTsKKyAgICAgICAgbVBvd2VyTWFuYWdlciA9IChQb3dlck1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOwogCiAgICAgICAgIC8vIFRoaXMgV2FrZUxvY2sgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCB3ZSBzdGF5IGF3YWtlIGJldHdlZW4gdGhlIHRpbWUgdGhhdCB3ZSByZWNlaXZlCiAgICAgICAgIC8vIGEgc3luYyBhbGFybSBub3RpZmljYXRpb24gYW5kIHdoZW4gd2UgZmluaXNoIHByb2Nlc3NpbmcgaXQuIFdlIG5lZWQgdG8gZG8gdGhpcwogICAgICAgICAvLyBiZWNhdXNlIHdlIGRvbid0IGRvIHRoZSB3b3JrIGluIHRoZSBhbGFybSBoYW5kbGVyLCByYXRoZXIgd2UgZG8gaXQgaW4gYSBtZXNzYWdlCiAgICAgICAgIC8vIGhhbmRsZXIuCi0gICAgICAgIG1IYW5kbGVBbGFybVdha2VMb2NrID0gcG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLAorICAgICAgICBtSGFuZGxlQWxhcm1XYWtlTG9jayA9IG1Qb3dlck1hbmFnZXIubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLAogICAgICAgICAgICAgICAgIEhBTkRMRV9TWU5DX0FMQVJNX1dBS0VfTE9DSyk7CiAgICAgICAgIG1IYW5kbGVBbGFybVdha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOwogCisgICAgICAgIC8vIFRoaXMgV2FrZUxvY2sgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCB3ZSBzdGF5IGF3YWtlIHdoaWxlIHJ1bm5pbmcgdGhlIHN5bmMgbG9vcAorICAgICAgICAvLyBtZXNzYWdlIGhhbmRsZXIuIE5vcm1hbGx5IHdlIHdpbGwgaG9sZCBhIHN5bmMgYWRhcHRlciB3YWtlIGxvY2sgd2hpbGUgaXQgaXMgYmVpbmcKKyAgICAgICAgLy8gc3luY2VkIGJ1dCBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgc3luYyBsb29wIGl0IG1pZ2h0IGZpbmlzaCBhIHN5bmMgZm9yCisgICAgICAgIC8vIG9uZSBzeW5jIGFkYXB0ZXIgYmVmb3JlIHN0YXJ0aW5nIHRoZSBzeW5jIGZvciB0aGUgb3RoZXIgc3luYyBhZGFwdGVyIGFuZCB3ZQorICAgICAgICAvLyBkb24ndCB3YW50IHRoZSBkZXZpY2UgdG8gZ28gdG8gc2xlZXAgZHVyaW5nIHRoYXQgd2luZG93LgorICAgICAgICBtU3luY01hbmFnZXJXYWtlTG9jayA9IG1Qb3dlck1hbmFnZXIubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLAorICAgICAgICAgICAgICAgIFNZTkNfTE9PUF9XQUtFX0xPQ0spOworICAgICAgICBtU3luY01hbmFnZXJXYWtlTG9jay5zZXRSZWZlcmVuY2VDb3VudGVkKGZhbHNlKTsKKwogICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuYWRkU3RhdHVzQ2hhbmdlTGlzdGVuZXIoCiAgICAgICAgICAgICAgICAgQ29udGVudFJlc29sdmVyLlNZTkNfT0JTRVJWRVJfVFlQRV9TRVRUSU5HUywgbmV3IElTeW5jU3RhdHVzT2JzZXJ2ZXIuU3R1YigpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhdHVzQ2hhbmdlZChpbnQgd2hpY2gpIHsKQEAgLTQyNSw4ICs0MjcsOCBAQAogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOwogICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKCJhbmRyb2lkLmNvbnRlbnQuU3luY0FkYXB0ZXIiKTsKICAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChzeW5jQWRhcHRlckluZm8uY29tcG9uZW50TmFtZSk7Ci0gICAgICAgIGlmICghbUNvbnRleHQuYmluZFNlcnZpY2UoaW50ZW50LCBuZXcgSW5pdGlhbGl6ZXJTZXJ2aWNlQ29ubmVjdGlvbihhY2NvdW50LCBhdXRob3JpdHksIG1Db250ZXh0LAotICAgICAgICAgICAgICAgIG1NYWluSGFuZGxlciksCisgICAgICAgIGlmICghbUNvbnRleHQuYmluZFNlcnZpY2UoaW50ZW50LAorICAgICAgICAgICAgICAgIG5ldyBJbml0aWFsaXplclNlcnZpY2VDb25uZWN0aW9uKGFjY291bnQsIGF1dGhvcml0eSwgbUNvbnRleHQsIG1NYWluSGFuZGxlciksCiAgICAgICAgICAgICAgICAgQ29udGV4dC5CSU5EX0FVVE9fQ1JFQVRFIHwgQ29udGV4dC5CSU5EX05PVF9GT1JFR1JPVU5EKSkgewogICAgICAgICAgICAgTG9nLncoVEFHLCAiaW5pdGlhbGl6ZVN5bmNBZGFwdGVyOiBmYWlsZWQgdG8gYmluZCB0byAiICsgaW50ZW50KTsKICAgICAgICAgfQpAQCAtNTA2LDggKzUwOCw4IEBACiAgICAgICogQHBhcmFtIHJlcXVlc3RlZEFjY291bnQgdGhlIGFjY291bnQgdG8gc3luYywgbWF5IGJlIG51bGwgdG8gc2lnbmlmeSBhbGwgYWNjb3VudHMKICAgICAgKiBAcGFyYW0gcmVxdWVzdGVkQXV0aG9yaXR5IHRoZSBhdXRob3JpdHkgdG8gc3luYywgbWF5IGJlIG51bGwgdG8gaW5kaWNhdGUgYWxsIGF1dGhvcml0aWVzCiAgICAgICogQHBhcmFtIGV4dHJhcyBhIE1hcCBvZiBTeW5jQWRhcHRlci1zcGVjaWZpYyBpbmZvcm1hdGlvbiB0byBjb250cm9sCi0qICAgICAgICAgIHN5bmNzIG9mIGEgc3BlY2lmaWMgcHJvdmlkZXIuIENhbiBiZSBudWxsLiBJcyBpZ25vcmVkCi0qICAgICAgICAgIGlmIHRoZSB1cmwgaXMgbnVsbC4KKyAgICAgKiAgICAgICAgICBzeW5jcyBvZiBhIHNwZWNpZmljIHByb3ZpZGVyLiBDYW4gYmUgbnVsbC4gSXMgaWdub3JlZAorICAgICAqICAgICAgICAgIGlmIHRoZSB1cmwgaXMgbnVsbC4KICAgICAgKiBAcGFyYW0gZGVsYXkgaG93IG1hbnkgbWlsbGlzZWNvbmRzIGluIHRoZSBmdXR1cmUgdG8gd2FpdCBiZWZvcmUgcGVyZm9ybWluZyB0aGlzCiAgICAgICogQHBhcmFtIG9ubHlUaG9zZVdpdGhVbmtvd25TeW5jYWJsZVN0YXRlCiAgICAgICovCkBAIC02MTEsMTYgKzYxMywyOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAoaXNMb2dnYWJsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAic2NoZWR1bGVTeW5jOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRlbGF5ICIgKyBkZWxheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNvdXJjZSAiICsgc291cmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgYWNjb3VudCAiICsgYWNjb3VudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGF1dGhvcml0eSAiICsgYXV0aG9yaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZXh0cmFzICIgKyBleHRyYXMpOworICAgICAgICAgICAgICAgICAgICBQYWlyPExvbmcsIExvbmc+IGJhY2tvZmYgPSBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0QmFja29mZihhY2NvdW50LCBhdXRob3JpdHkpOworICAgICAgICAgICAgICAgICAgICBsb25nIGRlbGF5VW50aWwgPSBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0RGVsYXlVbnRpbFRpbWUoYWNjb3VudCwgYXV0aG9yaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBiYWNrb2ZmVGltZSA9IGJhY2tvZmYgIT0gbnVsbCA/IGJhY2tvZmYuZmlyc3QgOiAwOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNTeW5jYWJsZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBuZXdFeHRyYXMgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdFeHRyYXMucHV0Qm9vbGVhbihDb250ZW50UmVzb2x2ZXIuU1lOQ19FWFRSQVNfSU5JVElBTElaRSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVN5bmNPcGVyYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTeW5jT3BlcmF0aW9uKGFjY291bnQsIHNvdXJjZSwgYXV0aG9yaXR5LCBuZXdFeHRyYXMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja29mZlRpbWUsIGRlbGF5VW50aWwpKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVN5bmNPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN5bmNPcGVyYXRpb24oYWNjb3VudCwgc291cmNlLCBhdXRob3JpdHksIGV4dHJhcywgZGVsYXkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvbmx5VGhvc2VXaXRoVW5rb3duU3luY2FibGVTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTG9nZ2FibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJzY2hlZHVsZVN5bmM6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRlbGF5ICIgKyBkZWxheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzb3VyY2UgIiArIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBhY2NvdW50ICIgKyBhY2NvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGF1dGhvcml0eSAiICsgYXV0aG9yaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGV4dHJhcyAiICsgZXh0cmFzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlU3luY09wZXJhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN5bmNPcGVyYXRpb24oYWNjb3VudCwgc291cmNlLCBhdXRob3JpdHksIGV4dHJhcywgZGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja29mZlRpbWUsIGRlbGF5VW50aWwpKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjM0LDcgKzY0OSw4IEBACiAgICAgfQogCiAgICAgcHVibGljIFN5bmNBZGFwdGVyVHlwZVtdIGdldFN5bmNBZGFwdGVyVHlwZXMoKSB7Ci0gICAgICAgIGZpbmFsIENvbGxlY3Rpb248UmVnaXN0ZXJlZFNlcnZpY2VzQ2FjaGUuU2VydmljZUluZm88U3luY0FkYXB0ZXJUeXBlPj4gc2VydmljZUluZm9zID0KKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxSZWdpc3RlcmVkU2VydmljZXNDYWNoZS5TZXJ2aWNlSW5mbzxTeW5jQWRhcHRlclR5cGU+PgorICAgICAgICAgICAgICAgIHNlcnZpY2VJbmZvcyA9CiAgICAgICAgICAgICAgICAgbVN5bmNBZGFwdGVycy5nZXRBbGxTZXJ2aWNlcygpOwogICAgICAgICBTeW5jQWRhcHRlclR5cGVbXSB0eXBlcyA9IG5ldyBTeW5jQWRhcHRlclR5cGVbc2VydmljZUluZm9zLnNpemUoKV07CiAgICAgICAgIGludCBpID0gMDsKQEAgLTY2NCw2ICs2ODAsMTQgQEAKICAgICAgICAgbVN5bmNIYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRDYW5jZWxTeW5jc01lc3NhZ2UoZmluYWwgQWNjb3VudCBhY2NvdW50LCBmaW5hbCBTdHJpbmcgYXV0aG9yaXR5KSB7CisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgTG9nLnYoVEFHLCAic2VuZGluZyBNRVNTQUdFX0NBTkNFTCIpOworICAgICAgICBNZXNzYWdlIG1zZyA9IG1TeW5jSGFuZGxlci5vYnRhaW5NZXNzYWdlKCk7CisgICAgICAgIG1zZy53aGF0ID0gU3luY0hhbmRsZXIuTUVTU0FHRV9DQU5DRUw7CisgICAgICAgIG1zZy5vYmogPSBQYWlyLmNyZWF0ZShhY2NvdW50LCBhdXRob3JpdHkpOworICAgICAgICBtU3luY0hhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKKyAgICB9CisKICAgICBjbGFzcyBTeW5jSGFuZGxlck1lc3NhZ2VQYXlsb2FkIHsKICAgICAgICAgcHVibGljIGZpbmFsIEFjdGl2ZVN5bmNDb250ZXh0IGFjdGl2ZVN5bmNDb250ZXh0OwogICAgICAgICBwdWJsaWMgZmluYWwgU3luY1Jlc3VsdCBzeW5jUmVzdWx0OwpAQCAtNjgxLDExICs3MDUsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFyQmFja29mZlNldHRpbmcoU3luY09wZXJhdGlvbiBvcCkgewotICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuc2V0QmFja29mZihvcC5hY2NvdW50LCBvcC5hdXRob3JpdHksCi0gICAgICAgICAgICAgICAgU3luY1N0b3JhZ2VFbmdpbmUuTk9UX0lOX0JBQ0tPRkZfTU9ERSwgU3luY1N0b3JhZ2VFbmdpbmUuTk9UX0lOX0JBQ0tPRkZfTU9ERSk7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSB2b2lkIGluY3JlYXNlQmFja29mZlNldHRpbmcoU3luY09wZXJhdGlvbiBvcCkgewogICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOwogCkBAIC03MTEsNiArNzMwLDkgQEAKIAogICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuc2V0QmFja29mZihvcC5hY2NvdW50LCBvcC5hdXRob3JpdHksCiAgICAgICAgICAgICAgICAgbm93ICsgbmV3RGVsYXlJbk1zLCBuZXdEZWxheUluTXMpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jUXVldWUpIHsKKyAgICAgICAgICAgIG1TeW5jUXVldWUub25CYWNrb2ZmQ2hhbmdlZChvcC5hY2NvdW50LCBvcC5hdXRob3JpdHksIG5vdyArIG5ld0RlbGF5SW5Ncyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc2V0RGVsYXlVbnRpbFRpbWUoU3luY09wZXJhdGlvbiBvcCwgbG9uZyBkZWxheVVudGlsU2Vjb25kcykgewpAQCAtNzIzLDYgKzc0NSw5IEBACiAgICAgICAgICAgICBuZXdEZWxheVVudGlsVGltZSA9IDA7CiAgICAgICAgIH0KICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLnNldERlbGF5VW50aWxUaW1lKG9wLmFjY291bnQsIG9wLmF1dGhvcml0eSwgbmV3RGVsYXlVbnRpbFRpbWUpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jUXVldWUpIHsKKyAgICAgICAgICAgIG1TeW5jUXVldWUub25EZWxheVVudGlsVGltZUNoYW5nZWQob3AuYWNjb3VudCwgb3AuYXV0aG9yaXR5LCBuZXdEZWxheVVudGlsVGltZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTczMSwyMyArNzU2LDcgQEAKICAgICAgKiBAcGFyYW0gYXV0aG9yaXR5IGxpbWl0IHRoZSBjYW5jZWxhdGlvbnMgdG8gc3luY3Mgd2l0aCB0aGlzIGF1dGhvcml0eSwgaWYgbm9uLW51bGwKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjYW5jZWxBY3RpdmVTeW5jKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhvcml0eSkgewotICAgICAgICBBY3RpdmVTeW5jQ29udGV4dCBhY3RpdmVTeW5jQ29udGV4dCA9IG1BY3RpdmVTeW5jQ29udGV4dDsKLSAgICAgICAgaWYgKGFjdGl2ZVN5bmNDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGlmIGFuIGF1dGhvcml0eSB3YXMgc3BlY2lmaWVkIHRoZW4gb25seSBjYW5jZWwgdGhlIHN5bmMgaWYgaXQgbWF0Y2hlcwotICAgICAgICAgICAgaWYgKGFjY291bnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghYWNjb3VudC5lcXVhbHMoYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uYWNjb3VudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGlmIGFuIGFjY291bnQgd2FzIHNwZWNpZmllZCB0aGVuIG9ubHkgY2FuY2VsIHRoZSBzeW5jIGlmIGl0IG1hdGNoZXMKLSAgICAgICAgICAgIGlmIChhdXRob3JpdHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghYXV0aG9yaXR5LmVxdWFscyhhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5hdXRob3JpdHkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZW5kU3luY0ZpbmlzaGVkT3JDYW5jZWxlZE1lc3NhZ2UoYWN0aXZlU3luY0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIG51bGwgLyogbm8gcmVzdWx0IHNpbmNlIHRoaXMgaXMgYSBjYW5jZWwgKi8pOwotICAgICAgICB9CisgICAgICAgIHNlbmRDYW5jZWxTeW5jc01lc3NhZ2UoYWNjb3VudCwgYXV0aG9yaXR5KTsKICAgICB9CiAKICAgICAvKioKQEAgLTc1NiwyMiArNzY1LDYgQEAKICAgICAgKiBAcGFyYW0gc3luY09wZXJhdGlvbiB0aGUgU3luY09wZXJhdGlvbiB0byBzY2hlZHVsZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNjaGVkdWxlU3luY09wZXJhdGlvbihTeW5jT3BlcmF0aW9uIHN5bmNPcGVyYXRpb24pIHsKLSAgICAgICAgLy8gSWYgdGhpcyBvcGVyYXRpb24gaXMgZXhwZWRpdGVkIGFuZCB0aGVyZSBpcyBhIHN5bmMgaW4gcHJvZ3Jlc3MgdGhlbgotICAgICAgICAvLyByZXNjaGVkdWxlIHRoZSBjdXJyZW50IG9wZXJhdGlvbiBhbmQgc2VuZCBhIGNhbmNlbCBmb3IgaXQuCi0gICAgICAgIGZpbmFsIEFjdGl2ZVN5bmNDb250ZXh0IGFjdGl2ZVN5bmNDb250ZXh0ID0gbUFjdGl2ZVN5bmNDb250ZXh0OwotICAgICAgICBpZiAoc3luY09wZXJhdGlvbi5leHBlZGl0ZWQgJiYgYWN0aXZlU3luY0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNTYW1lS2V5ID0KLSAgICAgICAgICAgICAgICAgICAgYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24ua2V5LmVxdWFscyhzeW5jT3BlcmF0aW9uLmtleSk7Ci0gICAgICAgICAgICAvLyBUaGlzIHJlcXVlc3QgaXMgZXhwZWRpdGVkIGFuZCB0aGVyZSBpcyBhIHN5bmMgaW4gcHJvZ3Jlc3MuCi0gICAgICAgICAgICAvLyBJbnRlcnJ1cHQgdGhlIGN1cnJlbnQgc3luYyBvbmx5IGlmIGl0IGlzIG5vdCBleHBlZGl0ZWQgYW5kIGlmIGl0IGhhcyBhIGRpZmZlcmVudAotICAgICAgICAgICAgLy8ga2V5IHRoYW4gdGhlIG9uZSB3ZSBhcmUgc2NoZWR1bGluZy4KLSAgICAgICAgICAgIGlmICghYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uZXhwZWRpdGVkICYmICFoYXNTYW1lS2V5KSB7Ci0gICAgICAgICAgICAgICAgc2NoZWR1bGVTeW5jT3BlcmF0aW9uKG5ldyBTeW5jT3BlcmF0aW9uKGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uKSk7Ci0gICAgICAgICAgICAgICAgc2VuZFN5bmNGaW5pc2hlZE9yQ2FuY2VsZWRNZXNzYWdlKGFjdGl2ZVN5bmNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBubyByZXN1bHQgc2luY2UgdGhpcyBpcyBhIGNhbmNlbCAqLyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICBib29sZWFuIHF1ZXVlQ2hhbmdlZDsKICAgICAgICAgc3luY2hyb25pemVkIChtU3luY1F1ZXVlKSB7CiAgICAgICAgICAgICBxdWV1ZUNoYW5nZWQgPSBtU3luY1F1ZXVlLmFkZChzeW5jT3BlcmF0aW9uKTsKQEAgLTc5NiwxMSArNzg5LDExIEBACiAgICAgICogQHBhcmFtIGF1dGhvcml0eSBsaW1pdCB0aGUgcmVtb3ZhbHMgdG8gb3BlcmF0aW9ucyB3aXRoIHRoaXMgYXV0aG9yaXR5LCBpZiBub24tbnVsbAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyU2NoZWR1bGVkU3luY09wZXJhdGlvbnMoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgYXV0aG9yaXR5KSB7Ci0gICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5zZXRCYWNrb2ZmKGFjY291bnQsIGF1dGhvcml0eSwKLSAgICAgICAgICAgICAgICBTeW5jU3RvcmFnZUVuZ2luZS5OT1RfSU5fQkFDS09GRl9NT0RFLCBTeW5jU3RvcmFnZUVuZ2luZS5OT1RfSU5fQkFDS09GRl9NT0RFKTsKICAgICAgICAgc3luY2hyb25pemVkIChtU3luY1F1ZXVlKSB7CiAgICAgICAgICAgICBtU3luY1F1ZXVlLnJlbW92ZShhY2NvdW50LCBhdXRob3JpdHkpOwogICAgICAgICB9CisgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5zZXRCYWNrb2ZmKGFjY291bnQsIGF1dGhvcml0eSwKKyAgICAgICAgICAgICAgICBTeW5jU3RvcmFnZUVuZ2luZS5OT1RfSU5fQkFDS09GRl9NT0RFLCBTeW5jU3RvcmFnZUVuZ2luZS5OT1RfSU5fQkFDS09GRl9NT0RFKTsKICAgICB9CiAKICAgICB2b2lkIG1heWJlUmVzY2hlZHVsZVN5bmMoU3luY1Jlc3VsdCBzeW5jUmVzdWx0LCBTeW5jT3BlcmF0aW9uIG9wZXJhdGlvbikgewpAQCAtODI3LDcgKzgyMCw4IEBACiAgICAgICAgIGlmIChvcGVyYXRpb24uZXh0cmFzLmdldEJvb2xlYW4oQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX0RPX05PVF9SRVRSWSwgZmFsc2UpKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJub3QgcmV0cnlpbmcgc3luYyBvcGVyYXRpb24gYmVjYXVzZSBTWU5DX0VYVFJBU19ET19OT1RfUkVUUlkgd2FzIHNwZWNpZmllZCAiCiAgICAgICAgICAgICAgICAgICAgICsgb3BlcmF0aW9uKTsKLSAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24uZXh0cmFzLmdldEJvb2xlYW4oQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX1VQTE9BRCwgZmFsc2UpKSB7CisgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uLmV4dHJhcy5nZXRCb29sZWFuKENvbnRlbnRSZXNvbHZlci5TWU5DX0VYVFJBU19VUExPQUQsIGZhbHNlKQorICAgICAgICAgICAgICAgICYmICFzeW5jUmVzdWx0LnN5bmNBbHJlYWR5SW5Qcm9ncmVzcykgewogICAgICAgICAgICAgb3BlcmF0aW9uLmV4dHJhcy5yZW1vdmUoQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX1VQTE9BRCk7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJyZXRyeWluZyBzeW5jIG9wZXJhdGlvbiBhcyBhIHR3by13YXkgc3luYyBiZWNhdXNlIGFuIHVwbG9hZC1vbmx5IHN5bmMgIgogICAgICAgICAgICAgICAgICAgICArICJlbmNvdW50ZXJlZCBhbiBlcnJvcjogIiArIG9wZXJhdGlvbik7CkBAIC04NDgsNyArODQyLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNjaGVkdWxlU3luY09wZXJhdGlvbihuZXcgU3luY09wZXJhdGlvbihvcGVyYXRpb24uYWNjb3VudCwgb3BlcmF0aW9uLnN5bmNTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5hdXRob3JpdHksIG9wZXJhdGlvbi5leHRyYXMsCi0gICAgICAgICAgICAgICAgICAgIERFTEFZX1JFVFJZX1NZTkNfSU5fUFJPR1JFU1NfSU5fU0VDT05EUyAqIDEwMDApKTsKKyAgICAgICAgICAgICAgICAgICAgREVMQVlfUkVUUllfU1lOQ19JTl9QUk9HUkVTU19JTl9TRUNPTkRTICogMTAwMCwKKyAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmJhY2tvZmYsIG9wZXJhdGlvbi5kZWxheVVudGlsKSk7CiAgICAgICAgIH0gZWxzZSBpZiAoc3luY1Jlc3VsdC5oYXNTb2Z0RXJyb3IoKSkgewogICAgICAgICAgICAgaWYgKGlzTG9nZ2FibGUpIHsKICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZXRyeWluZyBzeW5jIG9wZXJhdGlvbiBiZWNhdXNlIGl0IGVuY291bnRlcmVkIGEgc29mdCBlcnJvcjogIgpAQCAtODcxLDE1ICs4NjYsMzMgQEAKICAgICAgICAgZmluYWwgbG9uZyBtU3RhcnRUaW1lOwogICAgICAgICBsb25nIG1UaW1lb3V0U3RhcnRUaW1lOwogICAgICAgICBib29sZWFuIG1Cb3VuZDsKKyAgICAgICAgZmluYWwgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG1TeW5jV2FrZUxvY2s7CisgICAgICAgIGZpbmFsIGludCBtU3luY0FkYXB0ZXJVaWQ7CisgICAgICAgIFN5bmNJbmZvIG1TeW5jSW5mbzsKIAotICAgICAgICBwdWJsaWMgQWN0aXZlU3luY0NvbnRleHQoU3luY09wZXJhdGlvbiBzeW5jT3BlcmF0aW9uLAotICAgICAgICAgICAgICAgIGxvbmcgaGlzdG9yeVJvd0lkKSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYW4gQWN0aXZlU3luY0NvbnRleHQgZm9yIGFuIGltcGVuZGluZyBzeW5jIGFuZCBncmFiIHRoZSB3YWtlbG9jayBmb3IgdGhhdAorICAgICAgICAgKiBzeW5jIGFkYXB0ZXIuIFNpbmNlIHRoaXMgZ3JhYnMgdGhlIHdha2Vsb2NrIHlvdSBuZWVkIHRvIGJlIHN1cmUgdG8gY2FsbAorICAgICAgICAgKiBjbG9zZSgpIHdoZW4geW91IGFyZSBkb25lIHdpdGggdGhpcyBBY3RpdmVTeW5jQ29udGV4dCwgd2hldGhlciB0aGUgc3luYyBzdWNjZWVkZWQKKyAgICAgICAgICogb3Igbm90LgorICAgICAgICAgKiBAcGFyYW0gc3luY09wZXJhdGlvbiB0aGUgU3luY09wZXJhdGlvbiB3ZSBhcmUgYWJvdXQgdG8gc3luYworICAgICAgICAgKiBAcGFyYW0gaGlzdG9yeVJvd0lkIHRoZSByb3cgaW4gd2hpY2ggdG8gcmVjb3JkIHRoZSBoaXN0b3J5IGluZm8gZm9yIHRoaXMgc3luYworICAgICAgICAgKiBAcGFyYW0gc3luY0FkYXB0ZXJVaWQgdGhlIFVJRCBvZiB0aGUgYXBwbGljYXRpb24gdGhhdCBjb250YWlucyB0aGUgc3luYyBhZGFwdGVyCisgICAgICAgICAqIGZvciB0aGlzIHN5bmMuIFRoaXMgaXMgdXNlZCB0byBhdHRyaWJ1dGUgdGhlIHdha2Vsb2NrIGhvbGQgdG8gdGhhdCBhcHBsaWNhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBY3RpdmVTeW5jQ29udGV4dChTeW5jT3BlcmF0aW9uIHN5bmNPcGVyYXRpb24sIGxvbmcgaGlzdG9yeVJvd0lkLAorICAgICAgICAgICAgICAgIGludCBzeW5jQWRhcHRlclVpZCkgewogICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIG1TeW5jQWRhcHRlclVpZCA9IHN5bmNBZGFwdGVyVWlkOwogICAgICAgICAgICAgbVN5bmNPcGVyYXRpb24gPSBzeW5jT3BlcmF0aW9uOwogICAgICAgICAgICAgbUhpc3RvcnlSb3dJZCA9IGhpc3RvcnlSb3dJZDsKICAgICAgICAgICAgIG1TeW5jQWRhcHRlciA9IG51bGw7CiAgICAgICAgICAgICBtU3RhcnRUaW1lID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CiAgICAgICAgICAgICBtVGltZW91dFN0YXJ0VGltZSA9IG1TdGFydFRpbWU7CisgICAgICAgICAgICBtU3luY1dha2VMb2NrID0gbVN5bmNIYW5kbGVyLmdldFN5bmNXYWtlTG9jaygKKyAgICAgICAgICAgICAgICAgICAgbVN5bmNPcGVyYXRpb24uYWNjb3VudC50eXBlLCBtU3luY09wZXJhdGlvbi5hdXRob3JpdHkpOworICAgICAgICAgICAgbVN5bmNXYWtlTG9jay5zZXRXb3JrU291cmNlKG5ldyBXb3JrU291cmNlKHN5bmNBZGFwdGVyVWlkKSk7CisgICAgICAgICAgICBtU3luY1dha2VMb2NrLmFjcXVpcmUoKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIHNlbmRIZWFydGJlYXQoKSB7CkBAIC04ODcsNiArOTAwLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoZWQoU3luY1Jlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgTG9nLnYoVEFHLCAib25GaW5pc2hlZDogIiArIHRoaXMpOwogICAgICAgICAgICAgLy8gaW5jbHVkZSAidGhpcyIgaW4gdGhlIG1lc3NhZ2Ugc28gdGhhdCB0aGUgaGFuZGxlciBjYW4gaWdub3JlIGl0IGlmIHRoaXMKICAgICAgICAgICAgIC8vIEFjdGl2ZVN5bmNDb250ZXh0IGlzIG5vIGxvbmdlciB0aGUgbUFjdGl2ZVN5bmNDb250ZXh0IGF0IG1lc3NhZ2UgaGFuZGxpbmcKICAgICAgICAgICAgIC8vIHRpbWUKQEAgLTkzNCw2ICs5NDgsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBiaW5kUmVzdWx0OwogICAgICAgICB9CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBlcmZvcm1zIHRoZSByZXF1aXJlZCBjbGVhbnVwLCB3aGljaCBpcyB0aGUgcmVsZWFzaW5nIG9mIHRoZSB3YWtlbG9jayBhbmQKKyAgICAgICAgICogdW5iaW5kaW5nIGZyb20gdGhlIHN5bmMgYWRhcHRlciAoaWYgYWN0dWFsbHkgYm91bmQpLgorICAgICAgICAgKi8KICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY2xvc2UoKSB7CiAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJ1bkJpbmRGcm9tU3luY0FkYXB0ZXI6IGNvbm5lY3Rpb24gIiArIHRoaXMpOwpAQCAtOTQyLDYgKzk2MCw4IEBACiAgICAgICAgICAgICAgICAgbUJvdW5kID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgbUNvbnRleHQudW5iaW5kU2VydmljZSh0aGlzKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TeW5jV2FrZUxvY2suc2V0V29ya1NvdXJjZShudWxsKTsKKyAgICAgICAgICAgIG1TeW5jV2FrZUxvY2sucmVsZWFzZSgpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC0xMDAxLDYyICsxMDIxLDI4IEBACiAgICAgICAgICAgICBwdy5wcmludGxuKCJubyBhbGFybSBpcyBzY2hlZHVsZWQgKHRoZXJlIGhhZCBiZXR0ZXIgbm90IGJlIGFueSBwZW5kaW5nIHN5bmNzKSIpOwogICAgICAgICB9CiAKLSAgICAgICAgZmluYWwgU3luY01hbmFnZXIuQWN0aXZlU3luY0NvbnRleHQgYWN0aXZlU3luY0NvbnRleHQgPSBtQWN0aXZlU3luY0NvbnRleHQ7Ci0KLSAgICAgICAgcHcucHJpbnQoImFjdGl2ZSBzeW5jOiAiKTsgcHcucHJpbnRsbihhY3RpdmVTeW5jQ29udGV4dCk7Ci0KICAgICAgICAgcHcucHJpbnQoIm5vdGlmaWNhdGlvbiBpbmZvOiAiKTsKICAgICAgICAgc2Iuc2V0TGVuZ3RoKDApOwogICAgICAgICBtU3luY0hhbmRsZXIubVN5bmNOb3RpZmljYXRpb25JbmZvLnRvU3RyaW5nKHNiKTsKICAgICAgICAgcHcucHJpbnRsbihzYi50b1N0cmluZygpKTsKIAorICAgICAgICBwdy5wcmludGxuKCk7CisgICAgICAgIHB3LnByaW50bG4oIkFjdGl2ZSBTeW5jczogIiArIG1BY3RpdmVTeW5jQ29udGV4dHMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChTeW5jTWFuYWdlci5BY3RpdmVTeW5jQ29udGV4dCBhY3RpdmVTeW5jQ29udGV4dCA6IG1BY3RpdmVTeW5jQ29udGV4dHMpIHsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgZHVyYXRpb25JblNlY29uZHMgPSAobm93IC0gYWN0aXZlU3luY0NvbnRleHQubVN0YXJ0VGltZSkgLyAxMDAwOworICAgICAgICAgICAgcHcucHJpbnQoIiAgIik7CisgICAgICAgICAgICBwdy5wcmludChEYXRlVXRpbHMuZm9ybWF0RWxhcHNlZFRpbWUoZHVyYXRpb25JblNlY29uZHMpKTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgLSAiKTsKKyAgICAgICAgICAgIHB3LnByaW50KGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uLmR1bXAoZmFsc2UpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oKTsKKyAgICAgICAgfQorCiAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmNRdWV1ZSkgewotICAgICAgICAgICAgcHcucHJpbnQoInN5bmMgcXVldWU6ICIpOwogICAgICAgICAgICAgc2Iuc2V0TGVuZ3RoKDApOwogICAgICAgICAgICAgbVN5bmNRdWV1ZS5kdW1wKHNiKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oc2IudG9TdHJpbmcoKSk7CiAgICAgICAgIH0KLQotICAgICAgICBTeW5jSW5mbyBhY3RpdmUgPSBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0Q3VycmVudFN5bmMoKTsKLSAgICAgICAgaWYgKGFjdGl2ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTeW5jU3RvcmFnZUVuZ2luZS5BdXRob3JpdHlJbmZvIGF1dGhvcml0eQotICAgICAgICAgICAgICAgICAgICA9IG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRBdXRob3JpdHkoYWN0aXZlLmF1dGhvcml0eUlkKTsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgZHVyYXRpb25JblNlY29uZHMgPSAobm93IC0gYWN0aXZlLnN0YXJ0VGltZSkgLyAxMDAwOwotICAgICAgICAgICAgcHcucHJpbnQoIkFjdGl2ZSBzeW5jOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoYXV0aG9yaXR5ICE9IG51bGwgPyBhdXRob3JpdHkuYWNjb3VudCA6ICI8bm8gYWNjb3VudD4iKTsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoYXV0aG9yaXR5ICE9IG51bGwgPyBhdXRob3JpdHkuYXV0aG9yaXR5IDogIjxubyBhY2NvdW50PiIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlU3luY0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KFN5bmNTdG9yYWdlRW5naW5lLlNPVVJDRVNbCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uLnN5bmNTb3VyY2VdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiLCBkdXJhdGlvbiBpcyAiKTsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihEYXRlVXRpbHMuZm9ybWF0RWxhcHNlZFRpbWUoZHVyYXRpb25JblNlY29uZHMpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIk5vIHN5bmMgaXMgaW4gcHJvZ3Jlc3MuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBBcnJheUxpc3Q8U3luY1N0b3JhZ2VFbmdpbmUuUGVuZGluZ09wZXJhdGlvbj4gb3BzCi0gICAgICAgICAgICAgICAgPSBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0UGVuZGluZ09wZXJhdGlvbnMoKTsKLSAgICAgICAgaWYgKG9wcyAhPSBudWxsICYmIG9wcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCJQZW5kaW5nIFN5bmNzIik7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG9wcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3luY1N0b3JhZ2VFbmdpbmUuUGVuZGluZ09wZXJhdGlvbiBvcCA9IG9wcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQoIiAgIyIpOyBwdy5wcmludChpKTsgcHcucHJpbnQoIjogYWNjb3VudD0iKTsKLSAgICAgICAgICAgICAgICBwdy5wcmludChvcC5hY2NvdW50Lm5hbWUpOyBwdy5wcmludCgiOiIpOwotICAgICAgICAgICAgICAgIHB3LnByaW50KG9wLmFjY291bnQudHlwZSk7IHB3LnByaW50KCIgYXV0aG9yaXR5PSIpOwotICAgICAgICAgICAgICAgIHB3LnByaW50KG9wLmF1dGhvcml0eSk7IHB3LnByaW50KCIgZXhwZWRpdGVkPSIpOwotICAgICAgICAgICAgICAgIHB3LnByaW50bG4ob3AuZXhwZWRpdGVkKTsKLSAgICAgICAgICAgICAgICBpZiAob3AuZXh0cmFzICE9IG51bGwgJiYgb3AuZXh0cmFzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2Iuc2V0TGVuZ3RoKDApOwotICAgICAgICAgICAgICAgICAgICBTeW5jT3BlcmF0aW9uLmV4dHJhc1RvU3RyaW5nQnVpbGRlcihvcC5leHRyYXMsIHNiLCBmYWxzZSAvKiBhc0tleSAqLyk7Ci0gICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCIgICAgZXh0cmFzOiAiKTsgcHcucHJpbnRsbihzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgcHcucHJpbnRsbigpOworICAgICAgICBwdy5wcmludChzYi50b1N0cmluZygpKTsKIAogICAgICAgICAvLyBqb2luIHRoZSBpbnN0YWxsZWQgc3luYyBhZGFwdGVyIHdpdGggdGhlIGFjY291bnRzIGxpc3QgYW5kIGVtaXQgZm9yIGV2ZXJ5dGhpbmcKICAgICAgICAgcHcucHJpbnRsbigpOwpAQCAtMTI1OSw3ICsxMjQ1LDcgQEAKIAogICAgICAgICAvKiogQ2FsbCB0byBsZXQgdGhlIHRyYWNrZXIga25vdyB0aGF0IHRoZSBzeW5jIHN0YXRlIG1heSBoYXZlIGNoYW5nZWQgKi8KICAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHVwZGF0ZSgpIHsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNTeW5jSW5Qcm9ncmVzcyA9IG1BY3RpdmVTeW5jQ29udGV4dCAhPSBudWxsOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1N5bmNJblByb2dyZXNzID0gIW1BY3RpdmVTeW5jQ29udGV4dHMuaXNFbXB0eSgpOwogICAgICAgICAgICAgaWYgKGlzU3luY0luUHJvZ3Jlc3MgPT0gbUxhc3RXYXNTeW5jaW5nKSByZXR1cm47CiAgICAgICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOwogICAgICAgICAgICAgaWYgKGlzU3luY0luUHJvZ3Jlc3MpIHsKQEAgLTEyOTksMTQgKzEyODUsMTQgQEAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfQ0hFQ0tfQUxBUk1TID0gMzsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfU0VSVklDRV9DT05ORUNURUQgPSA0OwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TRVJWSUNFX0RJU0NPTk5FQ1RFRCA9IDU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0NBTkNFTCA9IDY7CiAKICAgICAgICAgcHVibGljIGZpbmFsIFN5bmNOb3RpZmljYXRpb25JbmZvIG1TeW5jTm90aWZpY2F0aW9uSW5mbyA9IG5ldyBTeW5jTm90aWZpY2F0aW9uSW5mbygpOwogICAgICAgICBwcml2YXRlIExvbmcgbUFsYXJtU2NoZWR1bGVUaW1lID0gbnVsbDsKICAgICAgICAgcHVibGljIGZpbmFsIFN5bmNUaW1lVHJhY2tlciBtU3luY1RpbWVUcmFja2VyID0gbmV3IFN5bmNUaW1lVHJhY2tlcigpOworICAgICAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8UGFpcjxTdHJpbmcsIFN0cmluZz4sIFBvd2VyTWFuYWdlci5XYWtlTG9jaz4gbVdha2VMb2NrcyA9CisgICAgICAgICAgICAgICAgTWFwcy5uZXdIYXNoTWFwKCk7CiAKLSAgICAgICAgLy8gdXNlZCB0byB0cmFjayBpZiB3ZSBoYXZlIGluc3RhbGxlZCB0aGUgZXJyb3Igbm90aWZpY2F0aW9uIHNvIHRoYXQgd2UgZG9uJ3QgcmVpbnN0YWxsCi0gICAgICAgIC8vIGl0IGlmIHN5bmMgaXMgc3RpbGwgZmFpbGluZwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUVycm9yTm90aWZpY2F0aW9uSW5zdGFsbGVkID0gZmFsc2U7CiAgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgQ291bnREb3duTGF0Y2ggbVJlYWR5VG9SdW5MYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKICAgICAgICAgcHVibGljIHZvaWQgb25Cb290Q29tcGxldGVkKCkgewogICAgICAgICAgICAgbUJvb3RDb21wbGV0ZWQgPSB0cnVlOwpAQCAtMTMxNiw2ICsxMzAyLDE4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBnZXRTeW5jV2FrZUxvY2soU3RyaW5nIGFjY291bnRUeXBlLCBTdHJpbmcgYXV0aG9yaXR5KSB7CisgICAgICAgICAgICBmaW5hbCBQYWlyPFN0cmluZywgU3RyaW5nPiB3YWtlTG9ja0tleSA9IFBhaXIuY3JlYXRlKGFjY291bnRUeXBlLCBhdXRob3JpdHkpOworICAgICAgICAgICAgUG93ZXJNYW5hZ2VyLldha2VMb2NrIHdha2VMb2NrID0gbVdha2VMb2Nrcy5nZXQod2FrZUxvY2tLZXkpOworICAgICAgICAgICAgaWYgKHdha2VMb2NrID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IFNZTkNfV0FLRV9MT0NLX1BSRUZJWCArICJfIiArIGF1dGhvcml0eSArICJfIiArIGFjY291bnRUeXBlOworICAgICAgICAgICAgICAgIHdha2VMb2NrID0gbVBvd2VyTWFuYWdlci5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIG5hbWUpOworICAgICAgICAgICAgICAgIHdha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIG1XYWtlTG9ja3MucHV0KHdha2VMb2NrS2V5LCB3YWtlTG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gd2FrZUxvY2s7CisgICAgICAgIH0KKwogICAgICAgICBwcml2YXRlIHZvaWQgd2FpdFVudGlsUmVhZHlUb1J1bigpIHsKICAgICAgICAgICAgIENvdW50RG93bkxhdGNoIGxhdGNoID0gbVJlYWR5VG9SdW5MYXRjaDsKICAgICAgICAgICAgIGlmIChsYXRjaCAhPSBudWxsKSB7CkBAIC0xMzM0LDEyICsxMzMyLDYgQEAKICAgICAgICAgICogVXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgYSBzeW5jIG5vdGlmaWNhdGlvbiBpcyBhY3RpdmUgYW5kIHdobyBpdCBpcyBmb3IuCiAgICAgICAgICAqLwogICAgICAgICBjbGFzcyBTeW5jTm90aWZpY2F0aW9uSW5mbyB7Ci0gICAgICAgICAgICAvLyBvbmx5IHZhbGlkIGlmIGlzQWN0aXZlIGlzIHRydWUKLSAgICAgICAgICAgIHB1YmxpYyBBY2NvdW50IGFjY291bnQ7Ci0KLSAgICAgICAgICAgIC8vIG9ubHkgdmFsaWQgaWYgaXNBY3RpdmUgaXMgdHJ1ZQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBhdXRob3JpdHk7Ci0KICAgICAgICAgICAgIC8vIHRydWUgaWZmIHRoZSBub3RpZmljYXRpb24gbWFuYWdlciBoYXMgYmVlbiBhc2tlZCB0byBzZW5kIHRoZSBub3RpZmljYXRpb24KICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aXZlID0gZmFsc2U7CiAKQEAgLTEzNDgsMTAgKzEzNDAsNyBAQAogICAgICAgICAgICAgcHVibGljIExvbmcgc3RhcnRUaW1lID0gbnVsbDsKIAogICAgICAgICAgICAgcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiYWNjb3VudCAiKS5hcHBlbmQoYWNjb3VudCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiwgYXV0aG9yaXR5ICIpLmFwcGVuZChhdXRob3JpdHkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIsIGlzQWN0aXZlICIpLmFwcGVuZChpc0FjdGl2ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiwgc3RhcnRUaW1lICIpLmFwcGVuZChzdGFydFRpbWUpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiaXNBY3RpdmUgIikuYXBwZW5kKGlzQWN0aXZlKS5hcHBlbmQoIiwgc3RhcnRUaW1lICIpLmFwcGVuZChzdGFydFRpbWUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKQEAgLTEzNjcsNjAgKzEzNTYsNzIgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIExvbmcgZWFybGllc3RGdXR1cmVQb2xsVGltZSA9IG51bGw7CisgICAgICAgICAgICBsb25nIGVhcmxpZXN0RnV0dXJlUG9sbFRpbWUgPSBMb25nLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGxvbmcgbmV4dFBlbmRpbmdTeW5jVGltZSA9IExvbmcuTUFYX1ZBTFVFOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICB3YWl0VW50aWxSZWFkeVRvUnVuKCk7CisgICAgICAgICAgICAgICAgbVN5bmNNYW5hZ2VyV2FrZUxvY2suYWNxdWlyZSgpOwogICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBkbyB0aGlzIGZpcnN0IHNvIHRoYXQgd2UgYmUgc3VyZSB0aGF0IGFueSBwZXJpb2RpYyBzeW5jcyB0aGF0CiAgICAgICAgICAgICAgICAgLy8gYXJlIHJlYWR5IHRvIHJ1biBoYXZlIGJlZW4gY29udmVydGVkIGludG8gcGVuZGluZyBzeW5jcy4gVGhpcyBhbGxvd3MgdGhlCiAgICAgICAgICAgICAgICAgLy8gbG9naWMgdGhhdCBjb25zaWRlcnMgdGhlIG5leHQgc3RlcHMgdG8gdGFrZSBiYXNlZCBvbiB0aGUgc2V0IG9mIHBlbmRpbmcgc3luY3MKICAgICAgICAgICAgICAgICAvLyB0byBhbHNvIHRha2UgaW50byBhY2NvdW50IHRoZSBwZXJpb2RpYyBzeW5jcy4KICAgICAgICAgICAgICAgICBlYXJsaWVzdEZ1dHVyZVBvbGxUaW1lID0gc2NoZWR1bGVSZWFkeVBlcmlvZGljU3luY3MoKTsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU3luY0hhbmRsZXIuTUVTU0FHRV9DQU5DRUw6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhaXI8QWNjb3VudCwgU3RyaW5nPiBwYXlsb2FkID0gKFBhaXI8QWNjb3VudCwgU3RyaW5nPiltc2cub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaGFuZGxlU3luY0hhbmRsZXJNZXNzYWdlOiBNRVNTQUdFX1NFUlZJQ0VfQ0FOQ0VMOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBheWxvYWQuZmlyc3QgKyAiLCAiICsgcGF5bG9hZC5zZWNvbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsQWN0aXZlU3luY0xvY2tlZChwYXlsb2FkLmZpcnN0LCBwYXlsb2FkLnNlY29uZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UGVuZGluZ1N5bmNUaW1lID0gbWF5YmVTdGFydE5leHRTeW5jTG9ja2VkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIGNhc2UgU3luY0hhbmRsZXIuTUVTU0FHRV9TWU5DX0ZJTklTSEVEOgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiaGFuZGxlU3luY0hhbmRsZXJNZXNzYWdlOiBNRVNTQUdFX1NZTkNfRklOSVNIRUQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIFN5bmNIYW5kbGVyTWVzc2FnZVBheWxvYWQgcGF5bG9hZCA9IChTeW5jSGFuZGxlck1lc3NhZ2VQYXlsb2FkKW1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZVN5bmNDb250ZXh0ICE9IHBheWxvYWQuYWN0aXZlU3luY0NvbnRleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJoYW5kbGVTeW5jSGFuZGxlck1lc3NhZ2U6IHN5bmMgY29udGV4dCBkb2Vzbid0IG1hdGNoLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJkcm9wcGluZzogbUFjdGl2ZVN5bmNDb250ZXh0ICIgKyBtQWN0aXZlU3luY0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAhPSAiICsgcGF5bG9hZC5hY3RpdmVTeW5jQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1N5bmNTdGlsbEFjdGl2ZShwYXlsb2FkLmFjdGl2ZVN5bmNDb250ZXh0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImhhbmRsZVN5bmNIYW5kbGVyTWVzc2FnZTogZHJvcHBpbmcgc2luY2UgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInN5bmMgaXMgbm8gbG9uZ2VyIGFjdGl2ZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwYXlsb2FkLmFjdGl2ZVN5bmNDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN5bmNGaW5pc2hlZE9yQ2FuY2VsZWQocGF5bG9hZC5zeW5jUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN5bmNGaW5pc2hlZE9yQ2FuY2VsZWRMb2NrZWQocGF5bG9hZC5zeW5jUmVzdWx0LCBwYXlsb2FkLmFjdGl2ZVN5bmNDb250ZXh0KTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2UgYXJlIG5vIGxvbmdlciBzeW5jaW5nLCBjaGVjayBpZiBpdCBpcyB0aW1lIHRvIHN0YXJ0IGEgbmV3IHN5bmMKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXRlSWRsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgYSBzeW5jIGp1c3QgZmluaXNoZWQgY2hlY2sgaWYgaXQgaXMgdGltZSB0byBzdGFydCBhIG5ldyBzeW5jCisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UGVuZGluZ1N5bmNUaW1lID0gbWF5YmVTdGFydE5leHRTeW5jTG9ja2VkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgICAgICBjYXNlIFN5bmNIYW5kbGVyLk1FU1NBR0VfU0VSVklDRV9DT05ORUNURUQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VDb25uZWN0aW9uRGF0YSBtc2dEYXRhID0gKFNlcnZpY2VDb25uZWN0aW9uRGF0YSltc2cub2JqOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaGFuZGxlU3luY0hhbmRsZXJNZXNzYWdlOiBNRVNTQUdFX1NFUlZJQ0VfQ09OTkVDVEVEOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZ0RhdGEuYWN0aXZlU3luY0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhY3RpdmUgaXMgIiArIG1BY3RpdmVTeW5jQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZ0RhdGEuYWN0aXZlU3luY0NvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGlzIGlzbid0IGFuIG9sZCBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZVN5bmNDb250ZXh0ID09IG1zZ0RhdGEuYWN0aXZlU3luY0NvbnRleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5Cb3VuZFRvU3luY0FkYXB0ZXIobXNnRGF0YS5zeW5jQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNTeW5jU3RpbGxBY3RpdmUobXNnRGF0YS5hY3RpdmVTeW5jQ29udGV4dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5Cb3VuZFRvU3luY0FkYXB0ZXIobXNnRGF0YS5hY3RpdmVTeW5jQ29udGV4dCwgbXNnRGF0YS5zeW5jQWRhcHRlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGNhc2UgU3luY0hhbmRsZXIuTUVTU0FHRV9TRVJWSUNFX0RJU0NPTk5FQ1RFRDogewotICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZUNvbm5lY3Rpb25EYXRhIG1zZ0RhdGEgPSAoU2VydmljZUNvbm5lY3Rpb25EYXRhKW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBY3RpdmVTeW5jQ29udGV4dCBjdXJyZW50U3luY0NvbnRleHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNlcnZpY2VDb25uZWN0aW9uRGF0YSltc2cub2JqKS5hY3RpdmVTeW5jQ29udGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImhhbmRsZVN5bmNIYW5kbGVyTWVzc2FnZTogTUVTU0FHRV9TRVJWSUNFX0RJU0NPTk5FQ1RFRDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtc2dEYXRhLmFjdGl2ZVN5bmNDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYWN0aXZlIGlzICIgKyBtQWN0aXZlU3luY0NvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjdXJyZW50U3luY0NvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGlzIGlzbid0IGFuIG9sZCBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZVN5bmNDb250ZXh0ID09IG1zZ0RhdGEuYWN0aXZlU3luY0NvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1N5bmNTdGlsbEFjdGl2ZShjdXJyZW50U3luY0NvbnRleHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuY2VsIHRoZSBzeW5jIGlmIHdlIGhhdmUgYSBzeW5jYWRhcHRlciwgd2hpY2ggbWVhbnMgb25lIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0c3RhbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTeW5jQ29udGV4dC5tU3luY0FkYXB0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jQWRhcHRlci5jYW5jZWxTeW5jKG1BY3RpdmVTeW5jQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3luY0NvbnRleHQubVN5bmNBZGFwdGVyLmNhbmNlbFN5bmMoY3VycmVudFN5bmNDb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gcmV0cnkgdGhpcyBpbiB0aGlzIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTQzMCwxMSArMTQzMSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIGEgc29mdCBlcnJvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bmNSZXN1bHQgc3luY1Jlc3VsdCA9IG5ldyBTeW5jUmVzdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY1Jlc3VsdC5zdGF0cy5udW1Jb0V4Y2VwdGlvbnMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TeW5jRmluaXNoZWRPckNhbmNlbGVkKHN5bmNSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN5bmNGaW5pc2hlZE9yQ2FuY2VsZWRMb2NrZWQoc3luY1Jlc3VsdCwgY3VycmVudFN5bmNDb250ZXh0KTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlIGFyZSBubyBsb25nZXIgc3luY2luZywgY2hlY2sgaWYgaXQgaXMgdGltZSB0byBzdGFydCBhIG5ldwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN5bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TdGF0ZUlkbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBhIHN5bmMganVzdCBmaW5pc2hlZCBjaGVjayBpZiBpdCBpcyB0aW1lIHRvIHN0YXJ0IGEgbmV3IHN5bmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UGVuZGluZ1N5bmNUaW1lID0gbWF5YmVTdGFydE5leHRTeW5jTG9ja2VkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTQ0NywyMiArMTQ0Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtQWxhcm1TY2hlZHVsZVRpbWUgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZVN5bmNDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTG9nZ2FibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgImhhbmRsZVN5bmNIYW5kbGVyTWVzc2FnZTogc3luYyBjb250ZXh0IGlzIGFjdGl2ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXRlU3luY2luZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBhYm92ZSBjYWxsIHRvIHJ1blN0YXRlU3luY2luZygpIHJlc3VsdGVkIGluIHRoZSBlbmQgb2YgYSBzeW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGlzIHRpbWUgdG8gc3RhcnQgYSBuZXcgc3luYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlU3luY0NvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNMb2dnYWJsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiaGFuZGxlU3luY0hhbmRsZXJNZXNzYWdlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInN5bmMgY29udGV4dCBpcyBub3QgYWN0aXZlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3RhdGVJZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRQZW5kaW5nU3luY1RpbWUgPSBtYXliZVN0YXJ0TmV4dFN5bmNMb2NrZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZUFsYXJtV2FrZUxvY2sucmVsZWFzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTQ3MywxOCArMTQ1OCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiaGFuZGxlU3luY0hhbmRsZXJNZXNzYWdlOiBNRVNTQUdFX0NIRUNLX0FMQVJNUyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG8gYWxsIHRoZSB3b3JrIGZvciB0aGlzIGNhc2UgaW4gdGhlIGZpbmFsbHkgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRQZW5kaW5nU3luY1RpbWUgPSBtYXliZVN0YXJ0TmV4dFN5bmNMb2NrZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1N5bmNJblByb2dyZXNzID0gbUFjdGl2ZVN5bmNDb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc1N5bmNJblByb2dyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TeW5jV2FrZUxvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYW5hZ2VTeW5jTm90aWZpY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbWFuYWdlRXJyb3JOb3RpZmljYXRpb24oKTsKLSAgICAgICAgICAgICAgICBtYW5hZ2VTeW5jQWxhcm0oZWFybGllc3RGdXR1cmVQb2xsVGltZSk7CisgICAgICAgICAgICAgICAgbWFuYWdlU3luY05vdGlmaWNhdGlvbkxvY2tlZCgpOworICAgICAgICAgICAgICAgIG1hbmFnZVN5bmNBbGFybUxvY2tlZChlYXJsaWVzdEZ1dHVyZVBvbGxUaW1lLCBuZXh0UGVuZGluZ1N5bmNUaW1lKTsKICAgICAgICAgICAgICAgICBtU3luY1RpbWVUcmFja2VyLnVwZGF0ZSgpOworICAgICAgICAgICAgICAgIG1TeW5jTWFuYWdlcldha2VMb2NrLnJlbGVhc2UoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xNDkzLDEwICsxNDc0LDEwIEBACiAgICAgICAgICAqIEByZXR1cm4gdGhlIGRlc2lyZWQgc3RhcnQgdGltZSBvZiB0aGUgZWFybGllc3QgZnV0dXJlICBwZXJpb2RpYyBzeW5jIG9wZXJhdGlvbiwKICAgICAgICAgICogaW4gbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QKICAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgTG9uZyBzY2hlZHVsZVJlYWR5UGVyaW9kaWNTeW5jcygpIHsKKyAgICAgICAgcHJpdmF0ZSBsb25nIHNjaGVkdWxlUmVhZHlQZXJpb2RpY1N5bmNzKCkgewogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBiYWNrZ3JvdW5kRGF0YVVzYWdlQWxsb3dlZCA9CiAgICAgICAgICAgICAgICAgICAgIGdldENvbm5lY3Rpdml0eU1hbmFnZXIoKS5nZXRCYWNrZ3JvdW5kRGF0YVNldHRpbmcoKTsKLSAgICAgICAgICAgIExvbmcgZWFybGllc3RGdXR1cmVQb2xsVGltZSA9IG51bGw7CisgICAgICAgICAgICBsb25nIGVhcmxpZXN0RnV0dXJlUG9sbFRpbWUgPSBMb25nLk1BWF9WQUxVRTsKICAgICAgICAgICAgIGlmICghYmFja2dyb3VuZERhdGFVc2FnZUFsbG93ZWQgfHwgIW1TeW5jU3RvcmFnZUVuZ2luZS5nZXRNYXN0ZXJTeW5jQXV0b21hdGljYWxseSgpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVhcmxpZXN0RnV0dXJlUG9sbFRpbWU7CiAgICAgICAgICAgICB9CkBAIC0xNTI2LDIzICsxNTA3LDI3IEBACiAgICAgICAgICAgICAgICAgICAgIGxvbmcgbmV4dFBvbGxUaW1lQWJzb2x1dGUgPSBsYXN0UG9sbFRpbWVBYnNvbHV0ZSArIHBlcmlvZEluU2Vjb25kcyAqIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGl0IGlzIHJlYWR5IHRvIHJ1biB0aGVuIHNjaGVkdWxlIGl0IGFuZCBtYXJrIGl0IGFzIGhhdmluZyBiZWVuIHNjaGVkdWxlZAogICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFBvbGxUaW1lQWJzb2x1dGUgPD0gbm93QWJzb2x1dGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBhaXI8TG9uZywgTG9uZz4gYmFja29mZiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRCYWNrb2ZmKGluZm8uYWNjb3VudCwgaW5mby5hdXRob3JpdHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVTeW5jT3BlcmF0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3luY09wZXJhdGlvbihpbmZvLmFjY291bnQsIFN5bmNTdG9yYWdlRW5naW5lLlNPVVJDRV9QRVJJT0RJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmF1dGhvcml0eSwgZXh0cmFzLCAwIC8qIGRlbGF5ICovKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5hdXRob3JpdHksIGV4dHJhcywgMCAvKiBkZWxheSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrb2ZmICE9IG51bGwgPyBiYWNrb2ZmLmZpcnN0IDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0RGVsYXlVbnRpbFRpbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmFjY291bnQsIGluZm8uYXV0aG9yaXR5KSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldFBlcmlvZGljU3luY1RpbWUoaSwgbm93QWJzb2x1dGUpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgaXNuJ3QgcmVhZHkgdG8gcnVuLCByZW1lbWJlciB0aGlzIHRpbWUgaWYgaXQgaXMgZWFybGllciB0aGFuCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlYXJsaWVzdEZ1dHVyZVBvbGxUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWFybGllc3RGdXR1cmVQb2xsVGltZSA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG5leHRQb2xsVGltZUFic29sdXRlIDwgZWFybGllc3RGdXR1cmVQb2xsVGltZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRQb2xsVGltZUFic29sdXRlIDwgZWFybGllc3RGdXR1cmVQb2xsVGltZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhcmxpZXN0RnV0dXJlUG9sbFRpbWUgPSBuZXh0UG9sbFRpbWVBYnNvbHV0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGVhcmxpZXN0RnV0dXJlUG9sbFRpbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgaWYgKGVhcmxpZXN0RnV0dXJlUG9sbFRpbWUgPT0gTG9uZy5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTG9uZy5NQVhfVkFMVUU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGNvbnZlcnQgYWJzb2x1dGUgdGltZSB0byBlbGFwc2VkIHRpbWUKQEAgLTE1NTIsNDcgKzE1MzcsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICA6IChlYXJsaWVzdEZ1dHVyZVBvbGxUaW1lIC0gbm93QWJzb2x1dGUpKTsKICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBydW5TdGF0ZVN5bmNpbmcoKSB7Ci0gICAgICAgICAgICAvLyBpZiB0aGUgc3luYyB0aW1lb3V0IGhhcyBiZWVuIHJlYWNoZWQgdGhlbiBjYW5jZWwgaXQKLSAgICAgICAgICAgIEFjdGl2ZVN5bmNDb250ZXh0IGFjdGl2ZVN5bmNDb250ZXh0ID0gbUFjdGl2ZVN5bmNDb250ZXh0OwotCi0gICAgICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOwotICAgICAgICAgICAgaWYgKG5vdyA+IGFjdGl2ZVN5bmNDb250ZXh0Lm1UaW1lb3V0U3RhcnRUaW1lICsgTUFYX1RJTUVfUEVSX1NZTkMpIHsKLSAgICAgICAgICAgICAgICBQYWlyPFN5bmNPcGVyYXRpb24sIExvbmc+IG5leHRPcEFuZFJ1blRpbWU7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtU3luY1F1ZXVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRPcEFuZFJ1blRpbWUgPSBtU3luY1F1ZXVlLm5leHRPcGVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG5leHRPcEFuZFJ1blRpbWUgIT0gbnVsbCAmJiBuZXh0T3BBbmRSdW5UaW1lLnNlY29uZCA8PSBub3cpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY2FuY2VsaW5nIGFuZCByZXNjaGVkdWxpbmcgc3luYyBiZWNhdXNlIGl0IHJhbiB0b28gbG9uZzogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVN5bmNPcGVyYXRpb24obmV3IFN5bmNPcGVyYXRpb24oYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZFN5bmNGaW5pc2hlZE9yQ2FuY2VsZWRNZXNzYWdlKGFjdGl2ZVN5bmNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogbm8gcmVzdWx0IHNpbmNlIHRoaXMgaXMgYSBjYW5jZWwgKi8pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVN5bmNDb250ZXh0Lm1UaW1lb3V0U3RhcnRUaW1lID0gbm93ICsgTUFYX1RJTUVfUEVSX1NZTkM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBubyBuZWVkIHRvIHNjaGVkdWxlIGFuIGFsYXJtLCBhcyB0aGF0IHdpbGwgYmUgZG9uZSBieSBvdXIgY2FsbGVyLgotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJ1blN0YXRlSWRsZSgpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNMb2dnYWJsZSA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpOwotICAgICAgICAgICAgaWYgKGlzTG9nZ2FibGUpIExvZy52KFRBRywgInJ1blN0YXRlSWRsZSIpOworICAgICAgICBwcml2YXRlIGxvbmcgbWF5YmVTdGFydE5leHRTeW5jTG9ja2VkKCkgeworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0xvZ2dhYmxlID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSk7CisgICAgICAgICAgICBpZiAoaXNMb2dnYWJsZSkgTG9nLnYoVEFHLCAibWF5YmVTdGFydE5leHRTeW5jIik7CiAKICAgICAgICAgICAgIC8vIElmIHdlIGFyZW4ndCByZWFkeSB0byBydW4gKGUuZy4gdGhlIGRhdGEgY29ubmVjdGlvbiBpcyBkb3duKSwgZ2V0IG91dC4KICAgICAgICAgICAgIGlmICghbURhdGFDb25uZWN0aW9uSXNDb25uZWN0ZWQpIHsKICAgICAgICAgICAgICAgICBpZiAoaXNMb2dnYWJsZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJydW5TdGF0ZUlkbGU6IG5vIGRhdGEgY29ubmVjdGlvbiwgc2tpcHBpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAibWF5YmVTdGFydE5leHRTeW5jOiBubyBkYXRhIGNvbm5lY3Rpb24sIHNraXBwaW5nIik7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICByZXR1cm4gTG9uZy5NQVhfVkFMVUU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtU3RvcmFnZUlzTG93KSB7CiAgICAgICAgICAgICAgICAgaWYgKGlzTG9nZ2FibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAicnVuU3RhdGVJZGxlOiBtZW1vcnkgbG93LCBza2lwcGluZyIpOworICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJtYXliZVN0YXJ0TmV4dFN5bmM6IG1lbW9yeSBsb3csIHNraXBwaW5nIik7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICByZXR1cm4gTG9uZy5NQVhfVkFMVUU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIElmIHRoZSBhY2NvdW50cyBhcmVuJ3Qga25vd24geWV0IHRoZW4gd2UgYXJlbid0IHJlYWR5IHRvIHJ1bi4gV2Ugd2lsbCBiZSBraWNrZWQKQEAgLTE2MDAsNDYgKzE1NjEsNTYgQEAKICAgICAgICAgICAgIEFjY291bnRbXSBhY2NvdW50cyA9IG1BY2NvdW50czsKICAgICAgICAgICAgIGlmIChhY2NvdW50cyA9PSBJTklUSUFMX0FDQ09VTlRTX0FSUkFZKSB7CiAgICAgICAgICAgICAgICAgaWYgKGlzTG9nZ2FibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAicnVuU3RhdGVJZGxlOiBhY2NvdW50cyBub3Qga25vd24sIHNraXBwaW5nIik7CisgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIm1heWJlU3RhcnROZXh0U3luYzogYWNjb3VudHMgbm90IGtub3duLCBza2lwcGluZyIpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgcmV0dXJuIExvbmcuTUFYX1ZBTFVFOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBPdGhlcndpc2UgY29uc3VtZSBTeW5jT3BlcmF0aW9ucyBmcm9tIHRoZSBoZWFkIG9mIHRoZSBTeW5jUXVldWUgdW50aWwgb25lIGlzCiAgICAgICAgICAgICAvLyBmb3VuZCB0aGF0IGlzIHJ1bm5hYmxlIChub3QgZGlzYWJsZWQsIGV0YykuIElmIHRoYXQgb25lIGlzIHJlYWR5IHRvIHJ1biB0aGVuCiAgICAgICAgICAgICAvLyBzdGFydCBpdCwgb3RoZXJ3aXNlIGp1c3QgZ2V0IG91dC4KLSAgICAgICAgICAgIFN5bmNPcGVyYXRpb24gb3A7Ci0gICAgICAgICAgICBpbnQgc3luY2FibGVTdGF0ZTsKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYmFja2dyb3VuZERhdGFVc2FnZUFsbG93ZWQgPQogICAgICAgICAgICAgICAgICAgICBnZXRDb25uZWN0aXZpdHlNYW5hZ2VyKCkuZ2V0QmFja2dyb3VuZERhdGFTZXR0aW5nKCk7CiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIG1hc3RlclN5bmNBdXRvbWF0aWNhbGx5ID0gbVN5bmNTdG9yYWdlRW5naW5lLmdldE1hc3RlclN5bmNBdXRvbWF0aWNhbGx5KCk7CiAKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmNRdWV1ZSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgUGFpcjxTeW5jT3BlcmF0aW9uLCBMb25nPiBuZXh0T3BBbmRSdW5UaW1lID0gbVN5bmNRdWV1ZS5uZXh0T3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0T3BBbmRSdW5UaW1lID09IG51bGwgfHwgbmV4dE9wQW5kUnVuVGltZS5zZWNvbmQgPiBub3cpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0xvZ2dhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAicnVuU3RhdGVJZGxlOiBubyBtb3JlIHJlYWR5IHN5bmMgb3BlcmF0aW9ucywgcmV0dXJuaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3AgPSBuZXh0T3BBbmRSdW5UaW1lLmZpcnN0OworICAgICAgICAgICAgZmluYWwgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKIAotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgZWl0aGVyIGdvaW5nIHRvIHJ1biB0aGlzIHN5bmMgb3IgZHJvcCBpdCBzbyBnbyBhaGVhZCBhbmQKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGl0IGZyb20gdGhlIHF1ZXVlIG5vdwotICAgICAgICAgICAgICAgICAgICBtU3luY1F1ZXVlLnJlbW92ZShvcCk7CisgICAgICAgICAgICAvLyB3aWxsIGJlIHNldCB0byB0aGUgbmV4dCB0aW1lIHRoYXQgYSBzeW5jIHNob3VsZCBiZSBjb25zaWRlcmVkIGZvciBydW5uaW5nCisgICAgICAgICAgICBsb25nIG5leHRSZWFkeVRvUnVuVGltZSA9IExvbmcuTUFYX1ZBTFVFOworCisgICAgICAgICAgICAvLyBvcmRlciB0aGUgc3luYyBxdWV1ZSwgZHJvcHBpbmcgc3luY3MgdGhhdCBhcmUgbm90IGFsbG93ZWQKKyAgICAgICAgICAgIEFycmF5TGlzdDxTeW5jT3BlcmF0aW9uPiBvcGVyYXRpb25zID0gbmV3IEFycmF5TGlzdDxTeW5jT3BlcmF0aW9uPigpOworICAgICAgICAgICAgc3luY2hyb25pemVkIChtU3luY1F1ZXVlKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzTG9nZ2FibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiYnVpbGQgdGhlIG9wZXJhdGlvbiBhcnJheSwgc3luY1F1ZXVlIHNpemUgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBtU3luY1F1ZXVlLm1PcGVyYXRpb25zTWFwLnNpemUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEl0ZXJhdG9yPFN5bmNPcGVyYXRpb24+IG9wZXJhdGlvbkl0ZXJhdG9yID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1TeW5jUXVldWUubU9wZXJhdGlvbnNNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAob3BlcmF0aW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN5bmNPcGVyYXRpb24gb3AgPSBvcGVyYXRpb25JdGVyYXRvci5uZXh0KCk7CiAKICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcCB0aGUgc3luYyBpZiB0aGUgYWNjb3VudCBvZiB0aGlzIG9wZXJhdGlvbiBubyBsb25nZXIgZXhpc3RzCiAgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXlVdGlscy5jb250YWlucyhtQWNjb3VudHMsIG9wLmFjY291bnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25JdGVyYXRvci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5kZWxldGVGcm9tUGVuZGluZyhvcC5wZW5kaW5nT3BlcmF0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAKLQotICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIHRoaXMgc3luYyByZXF1ZXN0IGlmIGl0IGlzbid0IHN5bmNhYmxlLCBpbnRpYWxpemluZyB0aGUgc3luYyBhZGFwdGVyCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzeW5jYWJsZSBzdGF0ZSBpcyBzZXQgdG8gInVua25vd24iCi0gICAgICAgICAgICAgICAgICAgIHN5bmNhYmxlU3RhdGUgPSBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0SXNTeW5jYWJsZShvcC5hY2NvdW50LCBvcC5hdXRob3JpdHkpOworICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIHRoaXMgc3luYyByZXF1ZXN0IGlmIGl0IGlzbid0IHN5bmNhYmxlCisgICAgICAgICAgICAgICAgICAgIGludCBzeW5jYWJsZVN0YXRlID0gbVN5bmNTdG9yYWdlRW5naW5lLmdldElzU3luY2FibGUob3AuYWNjb3VudCwgb3AuYXV0aG9yaXR5KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN5bmNhYmxlU3RhdGUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uSXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuZGVsZXRlRnJvbVBlbmRpbmcob3AucGVuZGluZ09wZXJhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBuZXh0IHJ1biB0aW1lIGlzIGluIHRoZSBmdXR1cmUsIG1lYW5pbmcgdGhlcmUgYXJlIG5vIHN5bmNzIHJlYWR5CisgICAgICAgICAgICAgICAgICAgIC8vIHRvIHJ1biwgcmV0dXJuIHRoZSB0aW1lCisgICAgICAgICAgICAgICAgICAgIGlmIChvcC5lZmZlY3RpdmVSdW5UaW1lID4gbm93KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFJlYWR5VG9SdW5UaW1lID4gb3AuZWZmZWN0aXZlUnVuVGltZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRSZWFkeVRvUnVuVGltZSA9IG9wLmVmZmVjdGl2ZVJ1blRpbWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0xNjUxLDMwICsxNjIyLDEzOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhYmFja2dyb3VuZERhdGFVc2FnZUFsbG93ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIW1TeW5jU3RvcmFnZUVuZ2luZS5nZXRTeW5jQXV0b21hdGljYWxseSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLmFjY291bnQsIG9wLmF1dGhvcml0eSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25JdGVyYXRvci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5kZWxldGVGcm9tUGVuZGluZyhvcC5wZW5kaW5nT3BlcmF0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gZ28gYWhlYWQgYW5kIHRyeSB0byBzeW5jIHRoaXMgc3luY09wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBXZSB3aWxsIGRvIHRoaXMgc3luYy4gUnVuIGl0IG91dHNpZGUgb2YgdGhlIHN5bmNocm9uaXplZCBibG9jay4KLSAgICAgICAgICAgICAgICBpZiAoaXNMb2dnYWJsZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJydW5TdGF0ZUlkbGU6IHdlIGFyZSBnb2luZyB0byBzeW5jICIgKyBvcCk7CisgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMuYWRkKG9wKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIG9wIGludG8gYW4gaW5pdGlhbGl6YXRpb24gc3luYyBpZiB0aGUgc3luY2FibGUgc3RhdGUgaXMgInVua25vd24iIGFuZAotICAgICAgICAgICAgLy8gb3AgaXNuJ3QgYWxyZWFkeSBhbiBpbml0aWFsaXphdGlvbiBzeW5jLiBJZiBpdCBpcyBtYXJrZWQgc3luY2FibGUgdGhlbiBjb252ZXJ0Ci0gICAgICAgICAgICAvLyB0aGlzIGludG8gYSByZWd1bGFyIHN5bmMKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5pdGlhbGl6ZUlzU2V0ID0KLSAgICAgICAgICAgICAgICAgICAgb3AuZXh0cmFzLmdldEJvb2xlYW4oQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX0lOSVRJQUxJWkUsIGZhbHNlKTsKLSAgICAgICAgICAgIGlmIChzeW5jYWJsZVN0YXRlIDwgMCAmJiAhaW5pdGlhbGl6ZUlzU2V0KSB7Ci0gICAgICAgICAgICAgICAgb3AuZXh0cmFzLnB1dEJvb2xlYW4oQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX0lOSVRJQUxJWkUsIHRydWUpOwotICAgICAgICAgICAgICAgIG9wID0gbmV3IFN5bmNPcGVyYXRpb24ob3ApOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzeW5jYWJsZVN0YXRlID4gMCAmJiBpbml0aWFsaXplSXNTZXQpIHsKLSAgICAgICAgICAgICAgICBvcC5leHRyYXMucHV0Qm9vbGVhbihDb250ZW50UmVzb2x2ZXIuU1lOQ19FWFRSQVNfSU5JVElBTElaRSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIG9wID0gbmV3IFN5bmNPcGVyYXRpb24ob3ApOworICAgICAgICAgICAgLy8gZmluZCB0aGUgbmV4dCBvcGVyYXRpb24gdG8gZGlzcGF0Y2gsIGlmIG9uZSBpcyByZWFkeQorICAgICAgICAgICAgLy8gaXRlcmF0ZSBmcm9tIHRoZSB0b3AsIGtlZXAgaXNzdWluZyAod2hpbGUgcG90ZW50aWFsbHkgY2FuY2VsbGluZyBleGlzdGluZyBzeW5jcykKKyAgICAgICAgICAgIC8vIHVudGlsIHRoZSBxdW90YXMgYXJlIGZpbGxlZC4KKyAgICAgICAgICAgIC8vIG9uY2UgdGhlIHF1b3RhcyBhcmUgZmlsbGVkIGl0ZXJhdGUgb25jZSBtb3JlIHRvIGZpbmQgd2hlbiB0aGUgbmV4dCBvbmUgd291bGQgYmUKKyAgICAgICAgICAgIC8vIChhbHNvIGNvbnNpZGVyaW5nIHByZS1lbXB0aW9uIHJlYXNvbnMpLgorICAgICAgICAgICAgaWYgKGlzTG9nZ2FibGUpIExvZy52KFRBRywgInNvcnQgdGhlIGNhbmRpZGF0ZSBvcGVyYXRpb25zLCBzaXplICIgKyBvcGVyYXRpb25zLnNpemUoKSk7CisgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KG9wZXJhdGlvbnMpOworICAgICAgICAgICAgaWYgKGlzTG9nZ2FibGUpIExvZy52KFRBRywgImRpc3BhdGNoIGFsbCByZWFkeSBzeW5jIG9wZXJhdGlvbnMiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBOID0gb3BlcmF0aW9ucy5zaXplKCk7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTeW5jT3BlcmF0aW9uIGNhbmRpZGF0ZSA9IG9wZXJhdGlvbnMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gY2FuZGlkYXRlSXNJbml0aWFsaXphdGlvbiA9IGNhbmRpZGF0ZS5pc0luaXRpYWxpemF0aW9uKCk7CisKKyAgICAgICAgICAgICAgICBpbnQgbnVtSW5pdCA9IDA7CisgICAgICAgICAgICAgICAgaW50IG51bVJlZ3VsYXIgPSAwOworICAgICAgICAgICAgICAgIEFjdGl2ZVN5bmNDb250ZXh0IGNvbmZsaWN0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBBY3RpdmVTeW5jQ29udGV4dCBsb25nUnVubmluZyA9IG51bGw7CisgICAgICAgICAgICAgICAgQWN0aXZlU3luY0NvbnRleHQgdG9SZXNjaGVkdWxlID0gbnVsbDsKKworICAgICAgICAgICAgICAgIGZvciAoQWN0aXZlU3luY0NvbnRleHQgYWN0aXZlU3luY0NvbnRleHQgOiBtQWN0aXZlU3luY0NvbnRleHRzKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN5bmNPcGVyYXRpb24gYWN0aXZlT3AgPSBhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZU9wLmlzSW5pdGlhbGl6YXRpb24oKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbnVtSW5pdCsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbnVtUmVndWxhcisrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVPcC5hY2NvdW50LnR5cGUuZXF1YWxzKGNhbmRpZGF0ZS5hY2NvdW50LnR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYWN0aXZlT3AuYXV0aG9yaXR5LmVxdWFscyhjYW5kaWRhdGUuYXV0aG9yaXR5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3QgPSBhY3RpdmVTeW5jQ29udGV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGJyZWFrIG91dCBzaW5jZSB3ZSB3YW50IHRvIGRvIGEgZnVsbCBjb3VudCBvZiB0aGUgdmFyaWV0aWVzCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlSXNJbml0aWFsaXphdGlvbiA9PSBhY3RpdmVPcC5pc0luaXRpYWxpemF0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYWN0aXZlU3luY0NvbnRleHQubVN0YXJ0VGltZSArIE1BWF9USU1FX1BFUl9TWU5DIDwgbm93KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ1J1bm5pbmcgPSBhY3RpdmVTeW5jQ29udGV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBicmVhayBvdXQgc2luY2Ugd2Ugd2FudCB0byBkbyBhIGZ1bGwgY291bnQgb2YgdGhlIHZhcmlldGllcworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGlzTG9nZ2FibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiY2FuZGlkYXRlICIgKyAoaSArIDEpICsgIiBvZiAiICsgTiArICI6ICIgKyBjYW5kaWRhdGUpOworICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICIgIG51bUFjdGl2ZUluaXQ9IiArIG51bUluaXQgKyAiLCBudW1BY3RpdmVSZWd1bGFyPSIgKyBudW1SZWd1bGFyKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiICBsb25nUnVubmluZzogIiArIGxvbmdSdW5uaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiICBjb25mbGljdDogIiArIGNvbmZsaWN0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY29uZmxpY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlSXNJbml0aWFsaXphdGlvbiAmJiAhY29uZmxpY3QubVN5bmNPcGVyYXRpb24uaXNJbml0aWFsaXphdGlvbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbnVtSW5pdCA8IE1BWF9TSU1VTFRBTkVPVVNfSU5JVElBTElaQVRJT05fU1lOQ1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvUmVzY2hlZHVsZSA9IGNvbmZsaWN0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiY2FuY2VsaW5nIGFuZCByZXNjaGVkdWxpbmcgc3luYyBzaW5jZSBhbiBpbml0aWFsaXphdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ0YWtlcyBoaWdoZXIgcHJpb3JpdHksICIgKyBjb25mbGljdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FuZGlkYXRlLmV4cGVkaXRlZCAmJiAhY29uZmxpY3QubVN5bmNPcGVyYXRpb24uZXhwZWRpdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZUlzSW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gY29uZmxpY3QubVN5bmNPcGVyYXRpb24uaXNJbml0aWFsaXphdGlvbigpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdG9SZXNjaGVkdWxlID0gY29uZmxpY3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJjYW5jZWxpbmcgYW5kIHJlc2NoZWR1bGluZyBzeW5jIHNpbmNlIGFuIGV4cGVkaXRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ0YWtlcyBoaWdoZXIgcHJpb3JpdHksICIgKyBjb25mbGljdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcm9vbUF2YWlsYWJsZSA9IGNhbmRpZGF0ZUlzSW5pdGlhbGl6YXRpb24gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudW1Jbml0IDwgTUFYX1NJTVVMVEFORU9VU19JTklUSUFMSVpBVElPTl9TWU5DUyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bVJlZ3VsYXIgPCBNQVhfU0lNVUxUQU5FT1VTX1JFR1VMQVJfU1lOQ1M7CisgICAgICAgICAgICAgICAgICAgIGlmIChyb29tQXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBjYW5kaWRhdGUKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsb25nUnVubmluZyAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZUlzSW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gbG9uZ1J1bm5pbmcubVN5bmNPcGVyYXRpb24uaXNJbml0aWFsaXphdGlvbigpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdG9SZXNjaGVkdWxlID0gbG9uZ1J1bm5pbmc7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJjYW5jZWxpbmcgYW5kIHJlc2NoZWR1bGluZyBzeW5jIHNpbmNlIGl0IHJhbiByb28gbG9uZywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsb25nUnVubmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0b1Jlc2NoZWR1bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBydW5TeW5jRmluaXNoZWRPckNhbmNlbGVkTG9ja2VkKG51bGwsIHRvUmVzY2hlZHVsZSk7CisgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlU3luY09wZXJhdGlvbih0b1Jlc2NoZWR1bGUubVN5bmNPcGVyYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jUXVldWUpeworICAgICAgICAgICAgICAgICAgICBtU3luY1F1ZXVlLnJlbW92ZShjYW5kaWRhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkaXNwYXRjaFN5bmNPcGVyYXRpb24oY2FuZGlkYXRlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5leHRSZWFkeVRvUnVuVGltZTsKKyAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBkaXNwYXRjaFN5bmNPcGVyYXRpb24oU3luY09wZXJhdGlvbiBvcCkgeworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAibWF5YmVTdGFydE5leHRTeW5jOiB3ZSBhcmUgZ29pbmcgdG8gc3luYyAiICsgb3ApOworICAgICAgICAgICAgICAgIExvZy52KFRBRywgIm51bSBhY3RpdmUgc3luY3M6ICIgKyBtQWN0aXZlU3luY0NvbnRleHRzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChBY3RpdmVTeW5jQ29udGV4dCBzeW5jQ29udGV4dCA6IG1BY3RpdmVTeW5jQ29udGV4dHMpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCBzeW5jQ29udGV4dC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gaW5pdGlhbGl6YXRpb24gc3luYyBhbmQgdGhlcmUgaXMgYWxyZWFkeSBhIHN5bmMgcnVubmluZyB3aXRoCisgICAgICAgICAgICAvLyB0aGUgc2FtZSBhY2NvdW50IHR5cGUgYW5kIGF1dGhvcml0eSBjYW5jZWwgdGhhdCBzeW5jIGJlZm9yZSBzdGFydGluZyB0aGlzIG9uZQorICAgICAgICAgICAgLy8gc2luY2Ugb3RoZXJ3aXNlIHRoZSBzeW5jYWRhcHRlciB3aWxsIGxpa2VseSByZWplY3QgdGhpcyByZXF1ZXN0CisgICAgICAgICAgICBpZiAob3AuaXNJbml0aWFsaXphdGlvbigpKSB7CisgICAgICAgICAgICAgICAgSXRlcmF0b3I8QWN0aXZlU3luY0NvbnRleHQ+IGl0ZXJhdG9yID0gbUFjdGl2ZVN5bmNDb250ZXh0cy5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQWN0aXZlU3luY0NvbnRleHQgc3luY0NvbnRleHQgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uaXNJbml0aWFsaXphdGlvbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uYWNjb3VudC50eXBlLmVxdWFscyhvcC5hY2NvdW50LnR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uYXV0aG9yaXR5LmVxdWFscyhvcC5hdXRob3JpdHkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJjYW5jZWxpbmcgYW5kIHJlc2NoZWR1bGluZyAiICsgc3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNpbmNlIHdlIGFyZSBhYm91dCB0byBzdGFydCBhIHN5bmMgdGhhdCB1c2VkIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInNhbWUgc3luYyBhZGFwdGVyLCAiICsgb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBydW5TeW5jRmluaXNoZWRPckNhbmNlbGVkTG9ja2VkKG51bGwsIHN5bmNDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlU3luY09wZXJhdGlvbihzeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGNvbm5lY3QgdG8gdGhlIHN5bmMgYWRhcHRlcgpAQCAtMTY4NSw2MSArMTc2NSw3MCBAQAogICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImNhbid0IGZpbmQgYSBzeW5jIGFkYXB0ZXIgZm9yICIgKyBzeW5jQWRhcHRlclR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgcmVtb3Zpbmcgc2V0dGluZ3MgZm9yIGl0Iik7CiAgICAgICAgICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLnJlbW92ZUF1dGhvcml0eShvcC5hY2NvdW50LCBvcC5hdXRob3JpdHkpOwotICAgICAgICAgICAgICAgIHJ1blN0YXRlSWRsZSgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEFjdGl2ZVN5bmNDb250ZXh0IGFjdGl2ZVN5bmNDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGl2ZVN5bmNDb250ZXh0KG9wLCBpbnNlcnRTdGFydFN5bmNFdmVudChvcCkpOwotICAgICAgICAgICAgbUFjdGl2ZVN5bmNDb250ZXh0ID0gYWN0aXZlU3luY0NvbnRleHQ7CisgICAgICAgICAgICAgICAgICAgIG5ldyBBY3RpdmVTeW5jQ29udGV4dChvcCwgaW5zZXJ0U3RhcnRTeW5jRXZlbnQob3ApLCBzeW5jQWRhcHRlckluZm8udWlkKTsKKyAgICAgICAgICAgIGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jSW5mbyA9IG1TeW5jU3RvcmFnZUVuZ2luZS5hZGRBY3RpdmVTeW5jKGFjdGl2ZVN5bmNDb250ZXh0KTsKKyAgICAgICAgICAgIG1BY3RpdmVTeW5jQ29udGV4dHMuYWRkKGFjdGl2ZVN5bmNDb250ZXh0KTsKICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgewotICAgICAgICAgICAgICAgIExvZy52KFRBRywgInJ1blN0YXRlSWRsZTogc2V0dGluZyBtQWN0aXZlU3luY0NvbnRleHQgdG8gIiArIG1BY3RpdmVTeW5jQ29udGV4dCk7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiZGlzcGF0Y2hTeW5jT3BlcmF0aW9uOiBzdGFydGluZyAiICsgYWN0aXZlU3luY0NvbnRleHQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLnNldEFjdGl2ZVN5bmMobUFjdGl2ZVN5bmNDb250ZXh0KTsKICAgICAgICAgICAgIGlmICghYWN0aXZlU3luY0NvbnRleHQuYmluZFRvU3luY0FkYXB0ZXIoc3luY0FkYXB0ZXJJbmZvKSkgewogICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkJpbmQgYXR0ZW1wdCBmYWlsZWQgdG8gIiArIHN5bmNBZGFwdGVySW5mbyk7Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZVN5bmNDb250ZXh0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZVN5bmNDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuc2V0QWN0aXZlU3luYyhtQWN0aXZlU3luY0NvbnRleHQpOwotICAgICAgICAgICAgICAgIG1TeW5jV2FrZUxvY2suc2V0V29ya1NvdXJjZShudWxsKTsKLSAgICAgICAgICAgICAgICBydW5TdGF0ZUlkbGUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgY2xvc2VBY3RpdmVTeW5jQ29udGV4dChhY3RpdmVTeW5jQ29udGV4dCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtU3luY1dha2VMb2NrLnNldFdvcmtTb3VyY2UobmV3IFdvcmtTb3VyY2Uoc3luY0FkYXB0ZXJJbmZvLnVpZCkpOwotICAgICAgICAgICAgbVN5bmNXYWtlTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAvLyBubyBuZWVkIHRvIHNjaGVkdWxlIGFuIGFsYXJtLCBhcyB0aGF0IHdpbGwgYmUgZG9uZSBieSBvdXIgY2FsbGVyLgotCi0gICAgICAgICAgICAvLyB0aGUgbmV4dCBzdGVwIHdpbGwgb2NjdXIgd2hlbiB3ZSBnZXQgZWl0aGVyIGEgdGltZW91dCBvciBhCi0gICAgICAgICAgICAvLyBNRVNTQUdFX1NFUlZJQ0VfQ09OTkVDVEVEIG9yIE1FU1NBR0VfU0VSVklDRV9ESVNDT05ORUNURUQgbWVzc2FnZQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgcnVuQm91bmRUb1N5bmNBZGFwdGVyKElTeW5jQWRhcHRlciBzeW5jQWRhcHRlcikgewotICAgICAgICAgICAgbUFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jQWRhcHRlciA9IHN5bmNBZGFwdGVyOwotICAgICAgICAgICAgZmluYWwgU3luY09wZXJhdGlvbiBzeW5jT3BlcmF0aW9uID0gbUFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uOworICAgICAgICBwcml2YXRlIHZvaWQgcnVuQm91bmRUb1N5bmNBZGFwdGVyKEFjdGl2ZVN5bmNDb250ZXh0IGFjdGl2ZVN5bmNDb250ZXh0LAorICAgICAgICAgICAgICBJU3luY0FkYXB0ZXIgc3luY0FkYXB0ZXIpIHsKKyAgICAgICAgICAgIGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jQWRhcHRlciA9IHN5bmNBZGFwdGVyOworICAgICAgICAgICAgZmluYWwgU3luY09wZXJhdGlvbiBzeW5jT3BlcmF0aW9uID0gYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb247CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHN5bmNBZGFwdGVyLnN0YXJ0U3luYyhtQWN0aXZlU3luY0NvbnRleHQsIHN5bmNPcGVyYXRpb24uYXV0aG9yaXR5LAorICAgICAgICAgICAgICAgIHN5bmNBZGFwdGVyLnN0YXJ0U3luYyhhY3RpdmVTeW5jQ29udGV4dCwgc3luY09wZXJhdGlvbi5hdXRob3JpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jT3BlcmF0aW9uLmFjY291bnQsIHN5bmNPcGVyYXRpb24uZXh0cmFzKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZW1vdGVFeGMpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJydW5TdGF0ZUlkbGU6IGNhdWdodCBhIFJlbW90ZUV4Y2VwdGlvbiwgcmVzY2hlZHVsaW5nIiwgcmVtb3RlRXhjKTsKLSAgICAgICAgICAgICAgICBtQWN0aXZlU3luY0NvbnRleHQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBtQWN0aXZlU3luY0NvbnRleHQgPSBudWxsOwotICAgICAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5zZXRBY3RpdmVTeW5jKG1BY3RpdmVTeW5jQ29udGV4dCk7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibWF5YmVTdGFydE5leHRTeW5jOiBjYXVnaHQgYSBSZW1vdGVFeGNlcHRpb24sIHJlc2NoZWR1bGluZyIsIHJlbW90ZUV4Yyk7CisgICAgICAgICAgICAgICAgY2xvc2VBY3RpdmVTeW5jQ29udGV4dChhY3RpdmVTeW5jQ29udGV4dCk7CiAgICAgICAgICAgICAgICAgaW5jcmVhc2VCYWNrb2ZmU2V0dGluZyhzeW5jT3BlcmF0aW9uKTsKICAgICAgICAgICAgICAgICBzY2hlZHVsZVN5bmNPcGVyYXRpb24obmV3IFN5bmNPcGVyYXRpb24oc3luY09wZXJhdGlvbikpOwogICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgICAgICBtQWN0aXZlU3luY0NvbnRleHQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBtQWN0aXZlU3luY0NvbnRleHQgPSBudWxsOwotICAgICAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5zZXRBY3RpdmVTeW5jKG1BY3RpdmVTeW5jQ29udGV4dCk7CisgICAgICAgICAgICAgICAgY2xvc2VBY3RpdmVTeW5jQ29udGV4dChhY3RpdmVTeW5jQ29udGV4dCk7CiAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2F1Z2h0IFJ1bnRpbWVFeGNlcHRpb24gd2hpbGUgc3RhcnRpbmcgdGhlIHN5bmMgIiArIHN5bmNPcGVyYXRpb24sIGV4Yyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgcnVuU3luY0ZpbmlzaGVkT3JDYW5jZWxlZChTeW5jUmVzdWx0IHN5bmNSZXN1bHQpIHsKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbEFjdGl2ZVN5bmNMb2NrZWQoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgYXV0aG9yaXR5KSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8QWN0aXZlU3luY0NvbnRleHQ+IGFjdGl2ZVN5bmNzID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxBY3RpdmVTeW5jQ29udGV4dD4obUFjdGl2ZVN5bmNDb250ZXh0cyk7CisgICAgICAgICAgICBmb3IgKEFjdGl2ZVN5bmNDb250ZXh0IGFjdGl2ZVN5bmNDb250ZXh0IDogYWN0aXZlU3luY3MpIHsKKyAgICAgICAgICAgICAgICBpZiAoYWN0aXZlU3luY0NvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiBhbiBhdXRob3JpdHkgd2FzIHNwZWNpZmllZCB0aGVuIG9ubHkgY2FuY2VsIHRoZSBzeW5jIGlmIGl0IG1hdGNoZXMKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY291bnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhY2NvdW50LmVxdWFscyhhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5hY2NvdW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBpZiBhbiBhY2NvdW50IHdhcyBzcGVjaWZpZWQgdGhlbiBvbmx5IGNhbmNlbCB0aGUgc3luYyBpZiBpdCBtYXRjaGVzCisgICAgICAgICAgICAgICAgICAgIGlmIChhdXRob3JpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhdXRob3JpdHkuZXF1YWxzKGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uLmF1dGhvcml0eSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcnVuU3luY0ZpbmlzaGVkT3JDYW5jZWxlZExvY2tlZChudWxsIC8qIG5vIHJlc3VsdCBzaW5jZSB0aGlzIGlzIGEgY2FuY2VsICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVN5bmNDb250ZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcnVuU3luY0ZpbmlzaGVkT3JDYW5jZWxlZExvY2tlZChTeW5jUmVzdWx0IHN5bmNSZXN1bHQsCisgICAgICAgICAgICAgICAgQWN0aXZlU3luY0NvbnRleHQgYWN0aXZlU3luY0NvbnRleHQpIHsKICAgICAgICAgICAgIGJvb2xlYW4gaXNMb2dnYWJsZSA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpOwotICAgICAgICAgICAgZmluYWwgQWN0aXZlU3luY0NvbnRleHQgYWN0aXZlU3luY0NvbnRleHQgPSBtQWN0aXZlU3luY0NvbnRleHQ7Ci0gICAgICAgICAgICBtQWN0aXZlU3luY0NvbnRleHQgPSBudWxsOwotICAgICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLnNldEFjdGl2ZVN5bmMobUFjdGl2ZVN5bmNDb250ZXh0KTsKKyAgICAgICAgICAgIGNsb3NlQWN0aXZlU3luY0NvbnRleHQoYWN0aXZlU3luY0NvbnRleHQpOwogCiAgICAgICAgICAgICBmaW5hbCBTeW5jT3BlcmF0aW9uIHN5bmNPcGVyYXRpb24gPSBhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbjsKIApAQCAtMTc1OSwxNiArMTg0OCw2IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHNldCB0aGVzZSBjb3JyZWN0bHkgd2hlbiB0aGUgU3luY1Jlc3VsdCBpcyBleHRlbmRlZCB0byBpbmNsdWRlIGl0CiAgICAgICAgICAgICAgICAgICAgIGRvd25zdHJlYW1BY3Rpdml0eSA9IDA7CiAgICAgICAgICAgICAgICAgICAgIHVwc3RyZWFtQWN0aXZpdHkgPSAwOwotICAgICAgICAgICAgICAgICAgICBjbGVhckJhY2tvZmZTZXR0aW5nKHN5bmNPcGVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIHdhcyBhbiBpbml0aWFsaXphdGlvbiBzeW5jIGFuZCB0aGUgc3luYyBhZGFwdGVyIGlzIG5vdwotICAgICAgICAgICAgICAgICAgICAvLyBtYXJrZWQgc3luY2FibGUgdGhlbiByZXNjaGVkdWxlIHRoZSBzeW5jLiBUaGUgbmV4dCB0aW1lIGl0IHJ1bnMgaXQKLSAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBtYWRlIGludG8gYSByZWd1bGFyIHN5bmMuCi0gICAgICAgICAgICAgICAgICAgIGlmIChzeW5jT3BlcmF0aW9uLmV4dHJhcy5nZXRCb29sZWFuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIuU1lOQ19FWFRSQVNfSU5JVElBTElaRSwgZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVN5bmNTdG9yYWdlRW5naW5lLmdldElzU3luY2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNPcGVyYXRpb24uYWNjb3VudCwgc3luY09wZXJhdGlvbi5hdXRob3JpdHkpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVTeW5jT3BlcmF0aW9uKG5ldyBTeW5jT3BlcmF0aW9uKHN5bmNPcGVyYXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCBzeW5jIG9wZXJhdGlvbiAiICsgc3luY09wZXJhdGlvbiArICIsICIgKyBzeW5jUmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG9wZXJhdGlvbiBmYWlsZWQgc28gaW5jcmVhc2UgdGhlIGJhY2tvZmYgdGltZQpAQCAtMTgwMyw4ICsxODgyLDYgQEAKICAgICAgICAgICAgIHN0b3BTeW5jRXZlbnQoYWN0aXZlU3luY0NvbnRleHQubUhpc3RvcnlSb3dJZCwgc3luY09wZXJhdGlvbiwgaGlzdG9yeU1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgIHVwc3RyZWFtQWN0aXZpdHksIGRvd25zdHJlYW1BY3Rpdml0eSwgZWxhcHNlZFRpbWUpOwogCi0gICAgICAgICAgICBhY3RpdmVTeW5jQ29udGV4dC5jbG9zZSgpOwotCiAgICAgICAgICAgICBpZiAoc3luY1Jlc3VsdCAhPSBudWxsICYmIHN5bmNSZXN1bHQudG9vTWFueURlbGV0aW9ucykgewogICAgICAgICAgICAgICAgIGluc3RhbGxIYW5kbGVUb29NYW55RGVsZXRlc05vdGlmaWNhdGlvbihzeW5jT3BlcmF0aW9uLmFjY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jT3BlcmF0aW9uLmF1dGhvcml0eSwgc3luY1Jlc3VsdC5zdGF0cy5udW1EZWxldGVzKTsKQEAgLTE4MTUsMTEgKzE4OTIsMTggQEAKIAogICAgICAgICAgICAgaWYgKHN5bmNSZXN1bHQgIT0gbnVsbCAmJiBzeW5jUmVzdWx0LmZ1bGxTeW5jUmVxdWVzdGVkKSB7CiAgICAgICAgICAgICAgICAgc2NoZWR1bGVTeW5jT3BlcmF0aW9uKG5ldyBTeW5jT3BlcmF0aW9uKHN5bmNPcGVyYXRpb24uYWNjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNPcGVyYXRpb24uc3luY1NvdXJjZSwgc3luY09wZXJhdGlvbi5hdXRob3JpdHksIG5ldyBCdW5kbGUoKSwgMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3luY09wZXJhdGlvbi5zeW5jU291cmNlLCBzeW5jT3BlcmF0aW9uLmF1dGhvcml0eSwgbmV3IEJ1bmRsZSgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgc3luY09wZXJhdGlvbi5iYWNrb2ZmLCBzeW5jT3BlcmF0aW9uLmRlbGF5VW50aWwpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gc2NoZWR1bGUgYW4gYWxhcm0sIGFzIHRoYXQgd2lsbCBiZSBkb25lIGJ5IG91ciBjYWxsZXIuCiAgICAgICAgIH0KIAorICAgICAgICBwcml2YXRlIHZvaWQgY2xvc2VBY3RpdmVTeW5jQ29udGV4dChBY3RpdmVTeW5jQ29udGV4dCBhY3RpdmVTeW5jQ29udGV4dCkgeworICAgICAgICAgICAgYWN0aXZlU3luY0NvbnRleHQuY2xvc2UoKTsKKyAgICAgICAgICAgIG1BY3RpdmVTeW5jQ29udGV4dHMucmVtb3ZlKGFjdGl2ZVN5bmNDb250ZXh0KTsKKyAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5yZW1vdmVBY3RpdmVTeW5jKGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jSW5mbyk7CisgICAgICAgIH0KKwogICAgICAgICAvKioKICAgICAgICAgICogQ29udmVydCB0aGUgZXJyb3ItY29udGFpbmluZyBTeW5jUmVzdWx0IGludG8gdGhlIFN5bmMuSGlzdG9yeSBlcnJvciBudW1iZXIuIFNpbmNlCiAgICAgICAgICAqIHRoZSBTeW5jUmVzdWx0IG1heSBpbmRpY2F0ZSBtdWx0aXBsZSBlcnJvcnMgYXQgb25jZSwgdGhpcyBtZXRob2QganVzdCByZXR1cm5zIHRoZQpAQCAtMTg0OSwxMSArMTkzMywxMSBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigid2UgYXJlIG5vdCBpbiBhbiBlcnJvciBzdGF0ZSwgIiArIHN5bmNSZXN1bHQpOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1hbmFnZVN5bmNOb3RpZmljYXRpb24oKSB7CisgICAgICAgIHByaXZhdGUgdm9pZCBtYW5hZ2VTeW5jTm90aWZpY2F0aW9uTG9ja2VkKCkgewogICAgICAgICAgICAgYm9vbGVhbiBzaG91bGRDYW5jZWw7CiAgICAgICAgICAgICBib29sZWFuIHNob3VsZEluc3RhbGw7CiAKLSAgICAgICAgICAgIGlmIChtQWN0aXZlU3luY0NvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1BY3RpdmVTeW5jQ29udGV4dHMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgbVN5bmNOb3RpZmljYXRpb25JbmZvLnN0YXJ0VGltZSA9IG51bGw7CiAKICAgICAgICAgICAgICAgICAvLyB3ZSBhcmVuJ3Qgc3luY2luZy4gaWYgdGhlIG5vdGlmaWNhdGlvbiBpcyBhY3RpdmUgdGhlbiByZW1lbWJlciB0aGF0IHdlIG5lZWQKQEAgLTE4NjIsMzQgKzE5NDYsMzggQEAKICAgICAgICAgICAgICAgICBzaG91bGRJbnN0YWxsID0gZmFsc2U7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBzeW5jaW5nCi0gICAgICAgICAgICAgICAgZmluYWwgU3luY09wZXJhdGlvbiBzeW5jT3BlcmF0aW9uID0gbUFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uOwotCiAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKICAgICAgICAgICAgICAgICBpZiAobVN5bmNOb3RpZmljYXRpb25JbmZvLnN0YXJ0VGltZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIG1TeW5jTm90aWZpY2F0aW9uSW5mby5zdGFydFRpbWUgPSBub3c7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgLy8gY2FuY2VsIHRoZSBub3RpZmljYXRpb24gaWYgaXQgaXMgdXAgYW5kIHRoZSBhdXRob3JpdHkgb3IgYWNjb3VudCBpcyB3cm9uZwotICAgICAgICAgICAgICAgIHNob3VsZENhbmNlbCA9IG1TeW5jTm90aWZpY2F0aW9uSW5mby5pc0FjdGl2ZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKCFzeW5jT3BlcmF0aW9uLmF1dGhvcml0eS5lcXVhbHMobVN5bmNOb3RpZmljYXRpb25JbmZvLmF1dGhvcml0eSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFzeW5jT3BlcmF0aW9uLmFjY291bnQuZXF1YWxzKG1TeW5jTm90aWZpY2F0aW9uSW5mby5hY2NvdW50KSk7Ci0KLSAgICAgICAgICAgICAgICAvLyB0aGVyZSBhcmUgZm91ciBjYXNlczoKLSAgICAgICAgICAgICAgICAvLyAtIHRoZSBub3RpZmljYXRpb24gaXMgdXAgYW5kIHRoZXJlIGlzIG5vIGNoYW5nZTogZG8gbm90aGluZwotICAgICAgICAgICAgICAgIC8vIC0gdGhlIG5vdGlmaWNhdGlvbiBpcyB1cCBidXQgd2Ugc2hvdWxkIGNhbmNlbCBzaW5jZSBpdCBpcyBzdGFsZToKLSAgICAgICAgICAgICAgICAvLyAgIG5lZWQgdG8gaW5zdGFsbAorICAgICAgICAgICAgICAgIC8vIHRoZXJlIGFyZSB0aHJlZSBjYXNlczoKKyAgICAgICAgICAgICAgICAvLyAtIHRoZSBub3RpZmljYXRpb24gaXMgdXA6IGRvIG5vdGhpbmcKICAgICAgICAgICAgICAgICAvLyAtIHRoZSBub3RpZmljYXRpb24gaXMgbm90IHVwIGJ1dCBpdCBpc24ndCB0aW1lIHlldDogZG9uJ3QgaW5zdGFsbAogICAgICAgICAgICAgICAgIC8vIC0gdGhlIG5vdGlmaWNhdGlvbiBpcyBub3QgdXAgYW5kIGl0IGlzIHRpbWU6IG5lZWQgdG8gaW5zdGFsbAogCiAgICAgICAgICAgICAgICAgaWYgKG1TeW5jTm90aWZpY2F0aW9uSW5mby5pc0FjdGl2ZSkgewotICAgICAgICAgICAgICAgICAgICBzaG91bGRJbnN0YWxsID0gc2hvdWxkQ2FuY2VsOworICAgICAgICAgICAgICAgICAgICBzaG91bGRJbnN0YWxsID0gc2hvdWxkQ2FuY2VsID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaXQgaXNuJ3QgY3VycmVudGx5IHVwLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGNhbmNlbAorICAgICAgICAgICAgICAgICAgICBzaG91bGRDYW5jZWwgPSBmYWxzZTsKKwogICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHRpbWVUb1Nob3dOb3RpZmljYXRpb24gPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdyA+IG1TeW5jTm90aWZpY2F0aW9uSW5mby5zdGFydFRpbWUgKyBTWU5DX05PVElGSUNBVElPTl9ERUxBWTsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyB0aGUgbm90aWZpY2F0aW9uIGltbWVkaWF0ZWx5IGlmIHRoaXMgaXMgYSBtYW51YWwgc3luYwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIG1hbnVhbFN5bmMgPSBzeW5jT3BlcmF0aW9uLmV4dHJhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRCb29sZWFuKENvbnRlbnRSZXNvbHZlci5TWU5DX0VYVFJBU19NQU5VQUwsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgc2hvdWxkSW5zdGFsbCA9IHRpbWVUb1Nob3dOb3RpZmljYXRpb24gfHwgbWFudWFsU3luYzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVUb1Nob3dOb3RpZmljYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEluc3RhbGwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyB0aGUgbm90aWZpY2F0aW9uIGltbWVkaWF0ZWx5IGlmIHRoaXMgaXMgYSBtYW51YWwgc3luYworICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkSW5zdGFsbCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChBY3RpdmVTeW5jQ29udGV4dCBhY3RpdmVTeW5jQ29udGV4dCA6IG1BY3RpdmVTeW5jQ29udGV4dHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIG1hbnVhbFN5bmMgPSBhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5leHRyYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRCb29sZWFuKENvbnRlbnRSZXNvbHZlci5TWU5DX0VYVFJBU19NQU5VQUwsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFudWFsU3luYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRJbnN0YWxsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC0xOTAwLDk0ICsxOTg4LDgyIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChzaG91bGRJbnN0YWxsKSB7Ci0gICAgICAgICAgICAgICAgU3luY09wZXJhdGlvbiBzeW5jT3BlcmF0aW9uID0gbUFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uOwogICAgICAgICAgICAgICAgIG1OZWVkU3luY0FjdGl2ZU5vdGlmaWNhdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgc2VuZFN5bmNTdGF0ZUludGVudCgpOwogICAgICAgICAgICAgICAgIG1TeW5jTm90aWZpY2F0aW9uSW5mby5pc0FjdGl2ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVN5bmNOb3RpZmljYXRpb25JbmZvLmFjY291bnQgPSBzeW5jT3BlcmF0aW9uLmFjY291bnQ7Ci0gICAgICAgICAgICAgICAgbVN5bmNOb3RpZmljYXRpb25JbmZvLmF1dGhvcml0eSA9IHN5bmNPcGVyYXRpb24uYXV0aG9yaXR5OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENoZWNrIGlmIHRoZXJlIHdlcmUgYW55IGxvbmctbGFzdGluZyBlcnJvcnMsIGlmIHNvIGluc3RhbGwgdGhlIGVycm9yIG5vdGlmaWNhdGlvbiwKLSAgICAgICAgICogb3RoZXJ3aXNlIGNhbmNlbCB0aGUgZXJyb3Igbm90aWZpY2F0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1hbmFnZUVycm9yTm90aWZpY2F0aW9uKCkgewotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGxvbmcgd2hlbiA9IG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRJbml0aWFsU3luY0ZhaWx1cmVUaW1lKCk7Ci0gICAgICAgICAgICBpZiAoKHdoZW4gPiAwKSAmJiAod2hlbiArIEVSUk9SX05PVElGSUNBVElPTl9ERUxBWV9NUyA8IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSkgewotICAgICAgICAgICAgICAgIGlmICghbUVycm9yTm90aWZpY2F0aW9uSW5zdGFsbGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1OZWVkU3luY0Vycm9yTm90aWZpY2F0aW9uID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZFN5bmNTdGF0ZUludGVudCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtRXJyb3JOb3RpZmljYXRpb25JbnN0YWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobUVycm9yTm90aWZpY2F0aW9uSW5zdGFsbGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1OZWVkU3luY0Vycm9yTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRTeW5jU3RhdGVJbnRlbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUVycm9yTm90aWZpY2F0aW9uSW5zdGFsbGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbWFuYWdlU3luY0FsYXJtKExvbmcgZWFybGllc3RGdXR1cmVQb2xsRWxhcHNlZFRpbWUpIHsKKyAgICAgICAgcHJpdmF0ZSB2b2lkIG1hbmFnZVN5bmNBbGFybUxvY2tlZChsb25nIG5leHRQZXJpb2RpY0V2ZW50RWxhcHNlZFRpbWUsCisgICAgICAgICAgICAgICAgbG9uZyBuZXh0UGVuZGluZ0V2ZW50RWxhcHNlZFRpbWUpIHsKICAgICAgICAgICAgIC8vIGluIGVhY2ggb2YgdGhlc2UgY2FzZXMgdGhlIHN5bmMgbG9vcCB3aWxsIGJlIGtpY2tlZCwgd2hpY2ggd2lsbCBjYXVzZSB0aGlzCiAgICAgICAgICAgICAvLyBtZXRob2QgdG8gYmUgY2FsbGVkIGFnYWluCiAgICAgICAgICAgICBpZiAoIW1EYXRhQ29ubmVjdGlvbklzQ29ubmVjdGVkKSByZXR1cm47CiAgICAgICAgICAgICBpZiAobVN0b3JhZ2VJc0xvdykgcmV0dXJuOwogCi0gICAgICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOworICAgICAgICAgICAgLy8gV2hlbiB0aGUgc3RhdHVzIGJhciBub3RpZmljYXRpb24gc2hvdWxkIGJlIHJhaXNlZAorICAgICAgICAgICAgZmluYWwgbG9uZyBub3RpZmljYXRpb25UaW1lID0KKyAgICAgICAgICAgICAgICAgICAgKCFtU3luY0hhbmRsZXIubVN5bmNOb3RpZmljYXRpb25JbmZvLmlzQWN0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVN5bmNIYW5kbGVyLm1TeW5jTm90aWZpY2F0aW9uSW5mby5zdGFydFRpbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1TeW5jSGFuZGxlci5tU3luY05vdGlmaWNhdGlvbkluZm8uc3RhcnRUaW1lICsgU1lOQ19OT1RJRklDQVRJT05fREVMQVkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IExvbmcuTUFYX1ZBTFVFOwogCi0gICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBhbGFybSBmaXJlIHRpbWU6Ci0gICAgICAgICAgICAvLyAtIG5vdCBzeW5jaW5nOiB0aW1lIG9mIHRoZSBuZXh0IHN5bmMgb3BlcmF0aW9uCi0gICAgICAgICAgICAvLyAtIHN5bmNpbmcsIG5vIG5vdGlmaWNhdGlvbjogdGltZSBmcm9tIHN5bmMgc3RhcnQgdG8gbm90aWZpY2F0aW9uIGNyZWF0ZSB0aW1lCi0gICAgICAgICAgICAvLyAtIHN5bmNpbmcsIHdpdGggbm90aWZpY2F0aW9uOiB0aW1lIHRpbGwgdGltZW91dCBvZiB0aGUgYWN0aXZlIHN5bmMgb3BlcmF0aW9uCi0gICAgICAgICAgICBMb25nIGFsYXJtVGltZTsKLSAgICAgICAgICAgIEFjdGl2ZVN5bmNDb250ZXh0IGFjdGl2ZVN5bmNDb250ZXh0ID0gbUFjdGl2ZVN5bmNDb250ZXh0OwotICAgICAgICAgICAgaWYgKGFjdGl2ZVN5bmNDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jUXVldWUpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgUGFpcjxTeW5jT3BlcmF0aW9uLCBMb25nPiBjYW5kaWRhdGUgPSBtU3luY1F1ZXVlLm5leHRPcGVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVhcmxpZXN0RnV0dXJlUG9sbEVsYXBzZWRUaW1lID09IG51bGwgJiYgY2FuZGlkYXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsYXJtVGltZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWFybGllc3RGdXR1cmVQb2xsRWxhcHNlZFRpbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWxhcm1UaW1lID0gY2FuZGlkYXRlLnNlY29uZDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYW5kaWRhdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWxhcm1UaW1lID0gZWFybGllc3RGdXR1cmVQb2xsRWxhcHNlZFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbGFybVRpbWUgPSBNYXRoLm1pbihlYXJsaWVzdEZ1dHVyZVBvbGxFbGFwc2VkVGltZSwgY2FuZGlkYXRlLnNlY29uZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFdoZW4gd2Ugc2hvdWxkIGNvbnNpZGVyIGNhbmNlbGluZyBhbiBhY3RpdmUgc3luYworICAgICAgICAgICAgbG9uZyBlYXJsaWVzdFRpbWVvdXRUaW1lID0gTG9uZy5NQVhfVkFMVUU7CisgICAgICAgICAgICBmb3IgKEFjdGl2ZVN5bmNDb250ZXh0IGN1cnJlbnRTeW5jQ29udGV4dCA6IG1BY3RpdmVTeW5jQ29udGV4dHMpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGN1cnJlbnRTeW5jVGltZW91dFRpbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN5bmNDb250ZXh0Lm1UaW1lb3V0U3RhcnRUaW1lICsgTUFYX1RJTUVfUEVSX1NZTkM7CisgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIm1hbmFnZVN5bmNBbGFybTogYWN0aXZlIHN5bmMsIG1UaW1lb3V0U3RhcnRUaW1lICsgTUFYIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGN1cnJlbnRTeW5jVGltZW91dFRpbWUpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBub3RpZmljYXRpb25UaW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeW5jSGFuZGxlci5tU3luY05vdGlmaWNhdGlvbkluZm8uc3RhcnRUaW1lICsgU1lOQ19OT1RJRklDQVRJT05fREVMQVk7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lb3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlU3luY0NvbnRleHQubVRpbWVvdXRTdGFydFRpbWUgKyBNQVhfVElNRV9QRVJfU1lOQzsKLSAgICAgICAgICAgICAgICBpZiAobVN5bmNIYW5kbGVyLm1TeW5jTm90aWZpY2F0aW9uSW5mby5pc0FjdGl2ZSkgewotICAgICAgICAgICAgICAgICAgICBhbGFybVRpbWUgPSB0aW1lb3V0VGltZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhbGFybVRpbWUgPSBNYXRoLm1pbihub3RpZmljYXRpb25UaW1lLCB0aW1lb3V0VGltZSk7CisgICAgICAgICAgICAgICAgaWYgKGVhcmxpZXN0VGltZW91dFRpbWUgPiBjdXJyZW50U3luY1RpbWVvdXRUaW1lKSB7CisgICAgICAgICAgICAgICAgICAgIGVhcmxpZXN0VGltZW91dFRpbWUgPSBjdXJyZW50U3luY1RpbWVvdXRUaW1lOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gYWRqdXN0IHRoZSBhbGFybVRpbWUgc28gdGhhdCB3ZSB3aWxsIHdha2UgdXAgd2hlbiBpdCBpcyB0aW1lIHRvCi0gICAgICAgICAgICAvLyBpbnN0YWxsIHRoZSBlcnJvciBub3RpZmljYXRpb24KLSAgICAgICAgICAgIGlmICghbUVycm9yTm90aWZpY2F0aW9uSW5zdGFsbGVkKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyB3aGVuID0gbVN5bmNTdG9yYWdlRW5naW5lLmdldEluaXRpYWxTeW5jRmFpbHVyZVRpbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAod2hlbiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgd2hlbiArPSBFUlJPUl9OT1RJRklDQVRJT05fREVMQVlfTVM7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgd2hlbiBmcm9uIGFic29sdXRlIHRpbWUgdG8gZWxhcHNlZCBydW4gdGltZQotICAgICAgICAgICAgICAgICAgICBsb25nIGRlbGF5ID0gd2hlbiAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgICAgICB3aGVuID0gbm93ICsgZGVsYXk7Ci0gICAgICAgICAgICAgICAgICAgIGFsYXJtVGltZSA9IGFsYXJtVGltZSAhPSBudWxsID8gTWF0aC5taW4oYWxhcm1UaW1lLCB3aGVuKSA6IHdoZW47CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJtYW5hZ2VTeW5jQWxhcm06IG5vdGlmaWNhdGlvblRpbWUgaXMgIiArIG5vdGlmaWNhdGlvblRpbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJtYW5hZ2VTeW5jQWxhcm06IGVhcmxpZXN0VGltZW91dFRpbWUgaXMgIiArIGVhcmxpZXN0VGltZW91dFRpbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJtYW5hZ2VTeW5jQWxhcm06IG5leHRQZXJpb2RpY0V2ZW50RWxhcHNlZFRpbWUgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXh0UGVyaW9kaWNFdmVudEVsYXBzZWRUaW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgeworICAgICAgICAgICAgICAgIExvZy52KFRBRywgIm1hbmFnZVN5bmNBbGFybTogbmV4dFBlbmRpbmdFdmVudEVsYXBzZWRUaW1lIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbmV4dFBlbmRpbmdFdmVudEVsYXBzZWRUaW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9uZyBhbGFybVRpbWUgPSBNYXRoLm1pbihub3RpZmljYXRpb25UaW1lLCBlYXJsaWVzdFRpbWVvdXRUaW1lKTsKKyAgICAgICAgICAgIGFsYXJtVGltZSA9IE1hdGgubWluKGFsYXJtVGltZSwgbmV4dFBlcmlvZGljRXZlbnRFbGFwc2VkVGltZSk7CisgICAgICAgICAgICBhbGFybVRpbWUgPSBNYXRoLm1pbihhbGFybVRpbWUsIG5leHRQZW5kaW5nRXZlbnRFbGFwc2VkVGltZSk7CisKKyAgICAgICAgICAgIC8vIEJvdW5kIHRoZSBhbGFybSB0aW1lLgorICAgICAgICAgICAgZmluYWwgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKKyAgICAgICAgICAgIGlmIChhbGFybVRpbWUgPCBub3cgKyBTWU5DX0FMQVJNX1RJTUVPVVRfTUlOKSB7CisgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIm1hbmFnZVN5bmNBbGFybTogdGhlIGFsYXJtVGltZSBpcyB0b28gc21hbGwsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFsYXJtVGltZSArICIsIHNldHRpbmcgdG8gIiArIChub3cgKyBTWU5DX0FMQVJNX1RJTUVPVVRfTUlOKSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFsYXJtVGltZSA9IG5vdyArIFNZTkNfQUxBUk1fVElNRU9VVF9NSU47CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFsYXJtVGltZSA+IG5vdyArIFNZTkNfQUxBUk1fVElNRU9VVF9NQVgpIHsKKyAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAibWFuYWdlU3luY0FsYXJtOiB0aGUgYWxhcm1UaW1lIGlzIHRvbyBsYXJnZSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYWxhcm1UaW1lICsgIiwgc2V0dGluZyB0byAiICsgKG5vdyArIFNZTkNfQUxBUk1fVElNRU9VVF9NSU4pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWxhcm1UaW1lID0gbm93ICsgU1lOQ19BTEFSTV9USU1FT1VUX01BWDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gc2V0IG9yIGNhbmNlbCB0aGUgYWxhcm0KICAgICAgICAgICAgIGJvb2xlYW4gc2hvdWxkU2V0ID0gZmFsc2U7CiAgICAgICAgICAgICBib29sZWFuIHNob3VsZENhbmNlbCA9IGZhbHNlOwogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhbGFybUlzQWN0aXZlID0gbUFsYXJtU2NoZWR1bGVUaW1lICE9IG51bGw7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIG5lZWRBbGFybSA9IGFsYXJtVGltZSAhPSBudWxsOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBuZWVkQWxhcm0gPSBhbGFybVRpbWUgIT0gTG9uZy5NQVhfVkFMVUU7CiAgICAgICAgICAgICBpZiAobmVlZEFsYXJtKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFhbGFybUlzQWN0aXZlIHx8IGFsYXJtVGltZSA8IG1BbGFybVNjaGVkdWxlVGltZSkgewogICAgICAgICAgICAgICAgICAgICBzaG91bGRTZXQgPSB0cnVlOwpAQCAtMTk5OSw2ICsyMDc1LDExIEBACiAgICAgICAgICAgICAvLyBzZXQgb3IgY2FuY2VsIHRoZSBhbGFybSBhcyBkaXJlY3RlZAogICAgICAgICAgICAgZW5zdXJlQWxhcm1TZXJ2aWNlKCk7CiAgICAgICAgICAgICBpZiAoc2hvdWxkU2V0KSB7CisgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgInJlcXVlc3RpbmcgdGhhdCB0aGUgYWxhcm0gbWFuYWdlciB3YWtlIHVzIHVwIGF0IGVsYXBzZWQgdGltZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhbGFybVRpbWUgKyAiLCBub3cgaXMgIiArIG5vdyArICIsICIgKyAoKGFsYXJtVGltZSAtIG5vdykgLyAxMDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzZWNzIGZyb20gbm93Iik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1BbGFybVNjaGVkdWxlVGltZSA9IGFsYXJtVGltZTsKICAgICAgICAgICAgICAgICBtQWxhcm1TZXJ2aWNlLnNldChBbGFybU1hbmFnZXIuRUxBUFNFRF9SRUFMVElNRV9XQUtFVVAsIGFsYXJtVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1TeW5jQWxhcm1JbnRlbnQpOwpAQCAtMjAxMiw3ICsyMDkzLDcgQEAKICAgICAgICAgICAgIEludGVudCBzeW5jU3RhdGVJbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fU1lOQ19TVEFURV9DSEFOR0VEKTsKICAgICAgICAgICAgIHN5bmNTdGF0ZUludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QpOwogICAgICAgICAgICAgc3luY1N0YXRlSW50ZW50LnB1dEV4dHJhKCJhY3RpdmUiLCBtTmVlZFN5bmNBY3RpdmVOb3RpZmljYXRpb24pOwotICAgICAgICAgICAgc3luY1N0YXRlSW50ZW50LnB1dEV4dHJhKCJmYWlsaW5nIiwgbU5lZWRTeW5jRXJyb3JOb3RpZmljYXRpb24pOworICAgICAgICAgICAgc3luY1N0YXRlSW50ZW50LnB1dEV4dHJhKCJmYWlsaW5nIiwgZmFsc2UpOwogICAgICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChzeW5jU3RhdGVJbnRlbnQpOwogICAgICAgICB9CiAKQEAgLTIxMDEsNCArMjE4MiwxMyBAQAogICAgICAgICAgICAgICAgICAgICByZXN1bHRNZXNzYWdlLCBkb3duc3RyZWFtQWN0aXZpdHksIHVwc3RyZWFtQWN0aXZpdHkpOwogICAgICAgICB9CiAgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzU3luY1N0aWxsQWN0aXZlKEFjdGl2ZVN5bmNDb250ZXh0IGFjdGl2ZVN5bmNDb250ZXh0KSB7CisgICAgICAgIGZvciAoQWN0aXZlU3luY0NvbnRleHQgc3luYyA6IG1BY3RpdmVTeW5jQ29udGV4dHMpIHsKKyAgICAgICAgICAgIGlmIChzeW5jID09IGFjdGl2ZVN5bmNDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY09wZXJhdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jT3BlcmF0aW9uLmphdmEKaW5kZXggYjAxNjA4ODUuLjNkN2YzZmJmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNPcGVyYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNPcGVyYXRpb24uamF2YQpAQCAtMzMsOSArMzMsMTIgQEAKICAgICBwdWJsaWMgbG9uZyBlYXJsaWVzdFJ1blRpbWU7CiAgICAgcHVibGljIGJvb2xlYW4gZXhwZWRpdGVkOwogICAgIHB1YmxpYyBTeW5jU3RvcmFnZUVuZ2luZS5QZW5kaW5nT3BlcmF0aW9uIHBlbmRpbmdPcGVyYXRpb247CisgICAgcHVibGljIExvbmcgYmFja29mZjsKKyAgICBwdWJsaWMgbG9uZyBkZWxheVVudGlsOworICAgIHB1YmxpYyBsb25nIGVmZmVjdGl2ZVJ1blRpbWU7CiAKICAgICBwdWJsaWMgU3luY09wZXJhdGlvbihBY2NvdW50IGFjY291bnQsIGludCBzb3VyY2UsIFN0cmluZyBhdXRob3JpdHksIEJ1bmRsZSBleHRyYXMsCi0gICAgICAgICAgICBsb25nIGRlbGF5SW5NcykgeworICAgICAgICAgICAgbG9uZyBkZWxheUluTXMsIGxvbmcgYmFja29mZiwgbG9uZyBkZWxheVVudGlsKSB7CiAgICAgICAgIHRoaXMuYWNjb3VudCA9IGFjY291bnQ7CiAgICAgICAgIHRoaXMuc3luY1NvdXJjZSA9IHNvdXJjZTsKICAgICAgICAgdGhpcy5hdXRob3JpdHkgPSBhdXRob3JpdHk7CkBAIC00OCw2ICs1MSw4IEBACiAgICAgICAgIHJlbW92ZUZhbHNlRXh0cmEoQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX0RJU0NBUkRfTE9DQUxfREVMRVRJT05TKTsKICAgICAgICAgcmVtb3ZlRmFsc2VFeHRyYShDb250ZW50UmVzb2x2ZXIuU1lOQ19FWFRSQVNfRVhQRURJVEVEKTsKICAgICAgICAgcmVtb3ZlRmFsc2VFeHRyYShDb250ZW50UmVzb2x2ZXIuU1lOQ19FWFRSQVNfT1ZFUlJJREVfVE9PX01BTllfREVMRVRJT05TKTsKKyAgICAgICAgdGhpcy5kZWxheVVudGlsID0gZGVsYXlVbnRpbDsKKyAgICAgICAgdGhpcy5iYWNrb2ZmID0gYmFja29mZjsKICAgICAgICAgZmluYWwgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKICAgICAgICAgaWYgKGRlbGF5SW5NcyA8IDApIHsKICAgICAgICAgICAgIHRoaXMuZXhwZWRpdGVkID0gdHJ1ZTsKQEAgLTU2LDYgKzYxLDcgQEAKICAgICAgICAgICAgIHRoaXMuZXhwZWRpdGVkID0gZmFsc2U7CiAgICAgICAgICAgICB0aGlzLmVhcmxpZXN0UnVuVGltZSA9IG5vdyArIGRlbGF5SW5NczsKICAgICAgICAgfQorICAgICAgICB1cGRhdGVFZmZlY3RpdmVSdW5UaW1lKCk7CiAgICAgICAgIHRoaXMua2V5ID0gdG9LZXkoKTsKICAgICB9CiAKQEAgLTcyLDQ5ICs3OCw3OCBAQAogICAgICAgICB0aGlzLmV4dHJhcyA9IG5ldyBCdW5kbGUob3RoZXIuZXh0cmFzKTsKICAgICAgICAgdGhpcy5leHBlZGl0ZWQgPSBvdGhlci5leHBlZGl0ZWQ7CiAgICAgICAgIHRoaXMuZWFybGllc3RSdW5UaW1lID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CisgICAgICAgIHRoaXMuYmFja29mZiA9IG90aGVyLmJhY2tvZmY7CisgICAgICAgIHRoaXMuZGVsYXlVbnRpbCA9IG90aGVyLmRlbGF5VW50aWw7CisgICAgICAgIHRoaXMudXBkYXRlRWZmZWN0aXZlUnVuVGltZSgpOwogICAgICAgICB0aGlzLmtleSA9IHRvS2V5KCk7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGR1bXAodHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBkdW1wKGJvb2xlYW4gdXNlT25lTGluZSkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKCJhdXRob3JpdHk6ICIpLmFwcGVuZChhdXRob3JpdHkpOwotICAgICAgICBzYi5hcHBlbmQoIiBhY2NvdW50OiAiKS5hcHBlbmQoYWNjb3VudCk7Ci0gICAgICAgIHNiLmFwcGVuZCgiIGV4dHJhczogIik7Ci0gICAgICAgIGV4dHJhc1RvU3RyaW5nQnVpbGRlcihleHRyYXMsIHNiLCBmYWxzZSAvKiBhc0tleSAqLyk7Ci0gICAgICAgIHNiLmFwcGVuZCgiIHN5bmNTb3VyY2U6ICIpLmFwcGVuZChzeW5jU291cmNlKTsKLSAgICAgICAgc2IuYXBwZW5kKCIgd2hlbjogIikuYXBwZW5kKGVhcmxpZXN0UnVuVGltZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiIGV4cGVkaXRlZDogIikuYXBwZW5kKGV4cGVkaXRlZCk7CisgICAgICAgIHNiLmFwcGVuZChhY2NvdW50Lm5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIiAoIiArIGFjY291bnQudHlwZSArICIpIik7CisgICAgICAgIHNiLmFwcGVuZCgiLCAiICsgYXV0aG9yaXR5KTsKKyAgICAgICAgc2IuYXBwZW5kKCIsICIpOworICAgICAgICBzYi5hcHBlbmQoU3luY1N0b3JhZ2VFbmdpbmUuU09VUkNFU1tzeW5jU291cmNlXSk7CisgICAgICAgIHNiLmFwcGVuZCgiLCBlYXJsaWVzdFJ1blRpbWUgIiArIGVhcmxpZXN0UnVuVGltZSk7CisgICAgICAgIGlmIChleHBlZGl0ZWQpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBFWFBFRElURUQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXVzZU9uZUxpbmUgJiYgIWV4dHJhcy5rZXlTZXQoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiXG4gICAgIik7CisgICAgICAgICAgICBleHRyYXNUb1N0cmluZ0J1aWxkZXIoZXh0cmFzLCBzYik7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXphdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGV4dHJhcy5nZXRCb29sZWFuKENvbnRlbnRSZXNvbHZlci5TWU5DX0VYVFJBU19JTklUSUFMSVpFLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaWdub3JlQmFja29mZigpIHsKKyAgICAgICAgcmV0dXJuIGV4dHJhcy5nZXRCb29sZWFuKENvbnRlbnRSZXNvbHZlci5TWU5DX0VYVFJBU19JR05PUkVfQkFDS09GRiwgZmFsc2UpOworICAgIH0KKwogICAgIHByaXZhdGUgU3RyaW5nIHRvS2V5KCkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgc2IuYXBwZW5kKCJhdXRob3JpdHk6ICIpLmFwcGVuZChhdXRob3JpdHkpOwotCXNiLmFwcGVuZCgiIGFjY291bnQge25hbWU9IiArIGFjY291bnQubmFtZSArICIsIHR5cGU9IiArIGFjY291bnQudHlwZSArICJ9Iik7CisgICAgCXNiLmFwcGVuZCgiIGFjY291bnQge25hbWU9IiArIGFjY291bnQubmFtZSArICIsIHR5cGU9IiArIGFjY291bnQudHlwZSArICJ9Iik7CiAgICAgICAgIHNiLmFwcGVuZCgiIGV4dHJhczogIik7Ci0gICAgICAgIGV4dHJhc1RvU3RyaW5nQnVpbGRlcihleHRyYXMsIHNiLCB0cnVlIC8qIGFzS2V5ICovKTsKKyAgICAgICAgZXh0cmFzVG9TdHJpbmdCdWlsZGVyKGV4dHJhcywgc2IpOwogICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXh0cmFzVG9TdHJpbmdCdWlsZGVyKEJ1bmRsZSBidW5kbGUsIFN0cmluZ0J1aWxkZXIgc2IsIGJvb2xlYW4gYXNLZXkpIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXh0cmFzVG9TdHJpbmdCdWlsZGVyKEJ1bmRsZSBidW5kbGUsIFN0cmluZ0J1aWxkZXIgc2IpIHsKICAgICAgICAgc2IuYXBwZW5kKCJbIik7CiAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IGJ1bmRsZS5rZXlTZXQoKSkgewotICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHdyaXRpbmcgdGhpcyBhcyBhIGtleSBkb24ndCBjb25zaWRlciB3aGV0aGVyIHRoaXMKLSAgICAgICAgICAgIC8vIGlzIGFuIGluaXRpYWxpemF0aW9uIHN5bmMgb3Igbm90IHdoZW4gY29tcHV0aW5nIHRoZSBrZXkgc2luY2UKLSAgICAgICAgICAgIC8vIHdlIHNldCB0aGlzIGZsYWcgYXBwcm9wcmlhdGVseSB3aGVuIGRpc3BhdGNoaW5nIHRoZSBzeW5jIHJlcXVlc3QuCi0gICAgICAgICAgICBpZiAoYXNLZXkgJiYgQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX0lOSVRJQUxJWkUuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNiLmFwcGVuZChrZXkpLmFwcGVuZCgiPSIpLmFwcGVuZChidW5kbGUuZ2V0KGtleSkpLmFwcGVuZCgiICIpOwogICAgICAgICB9CiAgICAgICAgIHNiLmFwcGVuZCgiXSIpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUVmZmVjdGl2ZVJ1blRpbWUoKSB7CisgICAgICAgIGVmZmVjdGl2ZVJ1blRpbWUgPSBpZ25vcmVCYWNrb2ZmKCkKKyAgICAgICAgICAgICAgICA/IGVhcmxpZXN0UnVuVGltZQorICAgICAgICAgICAgICAgIDogTWF0aC5tYXgoCisgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KGVhcmxpZXN0UnVuVGltZSwgZGVsYXlVbnRpbCksCisgICAgICAgICAgICAgICAgICAgIGJhY2tvZmYpOworICAgIH0KKwogICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7CiAgICAgICAgIFN5bmNPcGVyYXRpb24gb3RoZXIgPSAoU3luY09wZXJhdGlvbilvOwotICAgICAgICBpZiAoZWFybGllc3RSdW5UaW1lID09IG90aGVyLmVhcmxpZXN0UnVuVGltZSkgeworCisgICAgICAgIGlmIChleHBlZGl0ZWQgIT0gb3RoZXIuZXhwZWRpdGVkKSB7CisgICAgICAgICAgICByZXR1cm4gZXhwZWRpdGVkID8gLTEgOiAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVmZmVjdGl2ZVJ1blRpbWUgPT0gb3RoZXIuZWZmZWN0aXZlUnVuVGltZSkgewogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChlYXJsaWVzdFJ1blRpbWUgPCBvdGhlci5lYXJsaWVzdFJ1blRpbWUpID8gLTEgOiAxOworCisgICAgICAgIHJldHVybiBlZmZlY3RpdmVSdW5UaW1lIDwgb3RoZXIuZWZmZWN0aXZlUnVuVGltZSA/IC0xIDogMTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNRdWV1ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jUXVldWUuamF2YQppbmRleCAyOGJhYTBkLi5mODI2MTQ3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNRdWV1ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY1F1ZXVlLmphdmEKQEAgLTE2LDE3ICsxNiwxOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKIAotaW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5jb2xsZWN0Lkxpc3RzOwogaW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5jb2xsZWN0Lk1hcHM7CiAKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZVV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50OwogCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAvKioKICAqCkBAIC0zOCw3ICszOSw3IEBACiAKICAgICAvLyBBIE1hcCBvZiBTeW5jT3BlcmF0aW9ucyBvcGVyYXRpb25LZXkgLT4gU3luY09wZXJhdGlvbiB0aGF0IGlzIGRlc2lnbmVkIGZvcgogICAgIC8vIHF1aWNrIGxvb2t1cCBvZiBhbiBlbnF1ZXVlZCBTeW5jT3BlcmF0aW9uLgotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFN5bmNPcGVyYXRpb24+IG1PcGVyYXRpb25zTWFwID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgcHVibGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTeW5jT3BlcmF0aW9uPiBtT3BlcmF0aW9uc01hcCA9IE1hcHMubmV3SGFzaE1hcCgpOwogCiAgICAgcHVibGljIFN5bmNRdWV1ZShTeW5jU3RvcmFnZUVuZ2luZSBzeW5jU3RvcmFnZUVuZ2luZSkgewogICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUgPSBzeW5jU3RvcmFnZUVuZ2luZTsKQEAgLTQ3LDggKzQ4LDExIEBACiAgICAgICAgIGZpbmFsIGludCBOID0gb3BzLnNpemUoKTsKICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewogICAgICAgICAgICAgU3luY1N0b3JhZ2VFbmdpbmUuUGVuZGluZ09wZXJhdGlvbiBvcCA9IG9wcy5nZXQoaSk7CisgICAgICAgICAgICBmaW5hbCBQYWlyPExvbmcsIExvbmc+IGJhY2tvZmYgPSBzeW5jU3RvcmFnZUVuZ2luZS5nZXRCYWNrb2ZmKG9wLmFjY291bnQsIG9wLmF1dGhvcml0eSk7CiAgICAgICAgICAgICBTeW5jT3BlcmF0aW9uIHN5bmNPcGVyYXRpb24gPSBuZXcgU3luY09wZXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgb3AuYWNjb3VudCwgb3Auc3luY1NvdXJjZSwgb3AuYXV0aG9yaXR5LCBvcC5leHRyYXMsIDAgLyogZGVsYXkgKi8pOworICAgICAgICAgICAgICAgICAgICBvcC5hY2NvdW50LCBvcC5zeW5jU291cmNlLCBvcC5hdXRob3JpdHksIG9wLmV4dHJhcywgMCAvKiBkZWxheSAqLywKKyAgICAgICAgICAgICAgICAgICAgYmFja29mZiAhPSBudWxsID8gYmFja29mZi5maXJzdCA6IDAsCisgICAgICAgICAgICAgICAgICAgIHN5bmNTdG9yYWdlRW5naW5lLmdldERlbGF5VW50aWxUaW1lKG9wLmFjY291bnQsIG9wLmF1dGhvcml0eSkpOwogICAgICAgICAgICAgc3luY09wZXJhdGlvbi5leHBlZGl0ZWQgPSBvcC5leHBlZGl0ZWQ7CiAgICAgICAgICAgICBzeW5jT3BlcmF0aW9uLnBlbmRpbmdPcGVyYXRpb24gPSBvcDsKICAgICAgICAgICAgIGFkZChzeW5jT3BlcmF0aW9uLCBvcCk7CkBAIC0xMTksNjUgKzEyMywyNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogRmluZCB0aGUgb3BlcmF0aW9uIHRoYXQgc2hvdWxkIHJ1biBuZXh0LiBPcGVyYXRpb25zIGFyZSBzb3J0ZWQgYnkgdGhlaXIgZWFybGllc3RSdW5UaW1lLAotICAgICAqIHByaW9yaXRpemluZyBmaXJzdCB0aG9zZSB3aXRoIGEgc3luY2FibGUgc3RhdGUgb2YgInVua25vd24iIHRoYXQgYXJlbid0IHJldHJpZXMgdGhlbgotICAgICAqIGV4cGVkaXRlZCBvcGVyYXRpb25zLgotICAgICAqIFRoZSBlYXJsaWVzdFJ1blRpbWUgaXMgYWRqdXN0ZWQgYnkgdGhlIHN5bmMgYWRhcHRlcidzIGJhY2tvZmYgYW5kIGRlbGF5VW50aWwgdGltZXMsIGlmIGFueS4KLSAgICAgKiBAcmV0dXJuIHRoZSBvcGVyYXRpb24gdGhhdCBzaG91bGQgcnVuIG5leHQgYW5kIHdoZW4gaXQgc2hvdWxkIHJ1bi4gVGhlIHRpbWUgbWF5IGJlIGluCi0gICAgICogdGhlIGZ1dHVyZS4gSXQgaXMgZXhwcmVzc2VkIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBib290LgotICAgICAqLwotICAgIHB1YmxpYyBQYWlyPFN5bmNPcGVyYXRpb24sIExvbmc+IG5leHRPcGVyYXRpb24oKSB7Ci0gICAgICAgIFN5bmNPcGVyYXRpb24gYmVzdCA9IG51bGw7Ci0gICAgICAgIGxvbmcgYmVzdFJ1blRpbWUgPSAwOwotICAgICAgICBib29sZWFuIGJlc3RTeW5jYWJsZUlzVW5rbm93bkFuZE5vdEFSZXRyeSA9IGZhbHNlOworICAgIHB1YmxpYyB2b2lkIG9uQmFja29mZkNoYW5nZWQoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgcHJvdmlkZXJOYW1lLCBsb25nIGJhY2tvZmYpIHsKKyAgICAgICAgLy8gZm9yIGVhY2ggb3AgdGhhdCBtYXRjaGVzIHRoZSBhY2NvdW50IGFuZCBwcm92aWRlciB1cGRhdGUgaXRzCisgICAgICAgIC8vIGJhY2tvZmYgYW5kIGVmZmVjdGl2ZVN0YXJ0VGltZQogICAgICAgICBmb3IgKFN5bmNPcGVyYXRpb24gb3AgOiBtT3BlcmF0aW9uc01hcC52YWx1ZXMoKSkgewotICAgICAgICAgICAgbG9uZyBvcFJ1blRpbWUgPSBvcC5lYXJsaWVzdFJ1blRpbWU7Ci0gICAgICAgICAgICBpZiAoIW9wLmV4dHJhcy5nZXRCb29sZWFuKENvbnRlbnRSZXNvbHZlci5TWU5DX0VYVFJBU19JR05PUkVfQkFDS09GRiwgZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgUGFpcjxMb25nLCBMb25nPiBiYWNrb2ZmID0gbVN5bmNTdG9yYWdlRW5naW5lLmdldEJhY2tvZmYob3AuYWNjb3VudCwgb3AuYXV0aG9yaXR5KTsKLSAgICAgICAgICAgICAgICBsb25nIGRlbGF5VW50aWwgPSBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0RGVsYXlVbnRpbFRpbWUob3AuYWNjb3VudCwgb3AuYXV0aG9yaXR5KTsKLSAgICAgICAgICAgICAgICBvcFJ1blRpbWUgPSBNYXRoLm1heCgKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KG9wUnVuVGltZSwgZGVsYXlVbnRpbCksCi0gICAgICAgICAgICAgICAgICAgICAgICBiYWNrb2ZmICE9IG51bGwgPyBiYWNrb2ZmLmZpcnN0IDogMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyB3ZSBrbm93IGEgc3luYyBpcyBhIHJldHJ5IGlmIHRoZSBpbnRpYWxpemF0aW9uIGZsYWcgaXMgc2V0LCBzaW5jZSB0aGF0IHdpbGwgb25seQotICAgICAgICAgICAgLy8gYmUgc2V0IGJ5IHRoZSBzeW5jIGRpc3BhdGNoaW5nIGNvZGUsIHRodXMgaWYgaXQgaXMgc2V0IGl0IG11c3QgaGF2ZSBhbHJlYWR5IGJlZW4KLSAgICAgICAgICAgIC8vIGRpc3BhdGNoZWQKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc3luY2FibGVJc1Vua25vd25BbmROb3RBUmV0cnkgPQotICAgICAgICAgICAgICAgICAgICAhb3AuZXh0cmFzLmdldEJvb2xlYW4oQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX0lOSVRJQUxJWkUsIGZhbHNlKQotICAgICAgICAgICAgICAgICAgICAmJiBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0SXNTeW5jYWJsZShvcC5hY2NvdW50LCBvcC5hdXRob3JpdHkpIDwgMDsKLSAgICAgICAgICAgIC8vIGlmIHRoZSB1bnN5bmNhYmxlIHN0YXRlIGRpZmZlcnMsIG1ha2UgdGhlIGN1cnJlbnQgdGhlIGJlc3QgaWYgaXQgaXMgdW5zeW5jYWJsZQotICAgICAgICAgICAgLy8gZWxzZSwgaWYgdGhlIGV4cGVkaXRlZCBzdGF0ZSBkaWZmZXJzLCBtYWtlIHRoZSBjdXJyZW50IHRoZSBiZXN0IGlmIGl0IGlzIGV4cGVkaXRlZAotICAgICAgICAgICAgLy8gZWxzZSwgbWFrZSB0aGUgY3VycmVudCB0aGUgYmVzdCBpZiBpdCBpcyBlYXJsaWVyIHRoYW4gdGhlIGJlc3QKLSAgICAgICAgICAgIGlmIChiZXN0ID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgfHwgKChiZXN0U3luY2FibGVJc1Vua25vd25BbmROb3RBUmV0cnkgPT0gc3luY2FibGVJc1Vua25vd25BbmROb3RBUmV0cnkpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IChiZXN0LmV4cGVkaXRlZCA9PSBvcC5leHBlZGl0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgID8gb3BSdW5UaW1lIDwgYmVzdFJ1blRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogb3AuZXhwZWRpdGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgOiBzeW5jYWJsZUlzVW5rbm93bkFuZE5vdEFSZXRyeSkpIHsKLSAgICAgICAgICAgICAgICBiZXN0ID0gb3A7Ci0gICAgICAgICAgICAgICAgYmVzdFN5bmNhYmxlSXNVbmtub3duQW5kTm90QVJldHJ5ID0gc3luY2FibGVJc1Vua25vd25BbmROb3RBUmV0cnk7Ci0gICAgICAgICAgICAgICAgYmVzdFJ1blRpbWUgPSBvcFJ1blRpbWU7CisgICAgICAgICAgICBpZiAob3AuYWNjb3VudC5lcXVhbHMoYWNjb3VudCkgJiYgb3AuYXV0aG9yaXR5LmVxdWFscyhwcm92aWRlck5hbWUpKSB7CisgICAgICAgICAgICAgICAgb3AuYmFja29mZiA9IGJhY2tvZmY7CisgICAgICAgICAgICAgICAgb3AudXBkYXRlRWZmZWN0aXZlUnVuVGltZSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChiZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQYWlyLmNyZWF0ZShiZXN0LCBiZXN0UnVuVGltZSk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogRmluZCBhbmQgcmV0dXJuIHRoZSBTeW5jT3BlcmF0aW9uIHRoYXQgc2hvdWxkIGJlIHJ1biBuZXh0IGFuZCBpcyByZWFkeSB0byBydW4uCi0gICAgICogQHBhcmFtIG5vdyB0aGUgY3VycmVudCB7QGxpbmsgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWUoKX0sIHVzZWQgdG8KLSAgICAgKiBkZWNpZGUgaWYgdGhlIHN5bmMgb3BlcmF0aW9uIGlzIHJlYWR5IHRvIHJ1bgotICAgICAqIEByZXR1cm4gdGhlIFN5bmNPcGVyYXRpb24gdGhhdCBzaG91bGQgYmUgcnVuIG5leHQgYW5kIGlzIHJlYWR5IHRvIHJ1bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFpcjxTeW5jT3BlcmF0aW9uLCBMb25nPiBuZXh0UmVhZHlUb1J1bihsb25nIG5vdykgewotICAgICAgICBQYWlyPFN5bmNPcGVyYXRpb24sIExvbmc+IG5leHRPcEFuZFJ1blRpbWUgPSBuZXh0T3BlcmF0aW9uKCk7Ci0gICAgICAgIGlmIChuZXh0T3BBbmRSdW5UaW1lID09IG51bGwgfHwgbmV4dE9wQW5kUnVuVGltZS5zZWNvbmQgPiBub3cpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOworICAgIHB1YmxpYyB2b2lkIG9uRGVsYXlVbnRpbFRpbWVDaGFuZ2VkKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHByb3ZpZGVyTmFtZSwgbG9uZyBkZWxheVVudGlsKSB7CisgICAgICAgIC8vIGZvciBlYWNoIG9wIHRoYXQgbWF0Y2hlcyB0aGUgYWNjb3VudCBhbmQgcHJvdmlkZXIgdXBkYXRlIGl0cworICAgICAgICAvLyBkZWxheVVudGlsVGltZSBhbmQgZWZmZWN0aXZlU3RhcnRUaW1lCisgICAgICAgIGZvciAoU3luY09wZXJhdGlvbiBvcCA6IG1PcGVyYXRpb25zTWFwLnZhbHVlcygpKSB7CisgICAgICAgICAgICBpZiAob3AuYWNjb3VudC5lcXVhbHMoYWNjb3VudCkgJiYgb3AuYXV0aG9yaXR5LmVxdWFscyhwcm92aWRlck5hbWUpKSB7CisgICAgICAgICAgICAgICAgb3AuZGVsYXlVbnRpbCA9IGRlbGF5VW50aWw7CisgICAgICAgICAgICAgICAgb3AudXBkYXRlRWZmZWN0aXZlUnVuVGltZSgpOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXh0T3BBbmRSdW5UaW1lOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHJlbW92ZShBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRob3JpdHkpIHsKQEAgLTIwMCw5ICsxNjUsMTcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBkdW1wKFN0cmluZ0J1aWxkZXIgc2IpIHsKKyAgICAgICAgZmluYWwgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKICAgICAgICAgc2IuYXBwZW5kKCJTeW5jUXVldWU6ICIpLmFwcGVuZChtT3BlcmF0aW9uc01hcC5zaXplKCkpLmFwcGVuZCgiIG9wZXJhdGlvbihzKVxuIik7CiAgICAgICAgIGZvciAoU3luY09wZXJhdGlvbiBvcGVyYXRpb24gOiBtT3BlcmF0aW9uc01hcC52YWx1ZXMoKSkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG9wZXJhdGlvbikuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIgICIpOworICAgICAgICAgICAgaWYgKG9wZXJhdGlvbi5lZmZlY3RpdmVSdW5UaW1lIDw9IG5vdykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiUkVBRFkiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKERhdGVVdGlscy5mb3JtYXRFbGFwc2VkVGltZSgob3BlcmF0aW9uLmVmZmVjdGl2ZVJ1blRpbWUgLSBub3cpIC8gMTAwMCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgLSAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChvcGVyYXRpb24uZHVtcChmYWxzZSkpLmFwcGVuZCgiXG4iKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY1N0b3JhZ2VFbmdpbmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY1N0b3JhZ2VFbmdpbmUuamF2YQppbmRleCA2NDEzY2VjLi40ODdmNmNlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNTdG9yYWdlRW5naW5lLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jU3RvcmFnZUVuZ2luZS5qYXZhCkBAIC0yMjksNyArMjI5LDcgQEAKICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxQZW5kaW5nT3BlcmF0aW9uPiBtUGVuZGluZ09wZXJhdGlvbnMgPQogICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxQZW5kaW5nT3BlcmF0aW9uPigpOwogCi0gICAgcHJpdmF0ZSBTeW5jSW5mbyBtQ3VycmVudFN5bmM7CisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8U3luY0luZm8+IG1DdXJyZW50U3luY3MgPSBuZXcgQXJyYXlMaXN0PFN5bmNJbmZvPigpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBTcGFyc2VBcnJheTxTeW5jU3RhdHVzSW5mbz4gbVN5bmNTdGF0dXMgPQogICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PFN5bmNTdGF0dXNJbmZvPigpOwpAQCAtNjkwLDIzICs2OTAsMTIgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBjdXJyZW50bHkgYSBzeW5jIG9wZXJhdGlvbiBmb3IgdGhlIGdpdmVuCi0gICAgICogYWNjb3VudCBvciBhdXRob3JpdHkgaW4gdGhlIHBlbmRpbmcgbGlzdCwgb3IgYWN0aXZlbHkgYmVpbmcgcHJvY2Vzc2VkLgorICAgICAqIGFjY291bnQgb3IgYXV0aG9yaXR5IGFjdGl2ZWx5IGJlaW5nIHByb2Nlc3NlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1N5bmNBY3RpdmUoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgYXV0aG9yaXR5KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7Ci0gICAgICAgICAgICBpbnQgaSA9IG1QZW5kaW5nT3BlcmF0aW9ucy5zaXplKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICBpLS07Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhmcmVkcSk6IHRoaXMgcHJvYmFibHkgc2hvdWxkbid0IGJlIGNvbnNpZGVyaW5nCi0gICAgICAgICAgICAgICAgLy8gcGVuZGluZyBvcGVyYXRpb25zLgotICAgICAgICAgICAgICAgIFBlbmRpbmdPcGVyYXRpb24gb3AgPSBtUGVuZGluZ09wZXJhdGlvbnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChvcC5hY2NvdW50LmVxdWFscyhhY2NvdW50KSAmJiBvcC5hdXRob3JpdHkuZXF1YWxzKGF1dGhvcml0eSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUN1cnJlbnRTeW5jICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBBdXRob3JpdHlJbmZvIGFpbmZvID0gZ2V0QXV0aG9yaXR5KG1DdXJyZW50U3luYy5hdXRob3JpdHlJZCk7CisgICAgICAgICAgICBmb3IgKFN5bmNJbmZvIHN5bmNJbmZvIDogbUN1cnJlbnRTeW5jcykgeworICAgICAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYWluZm8gPSBnZXRBdXRob3JpdHkoc3luY0luZm8uYXV0aG9yaXR5SWQpOwogICAgICAgICAgICAgICAgIGlmIChhaW5mbyAhPSBudWxsICYmIGFpbmZvLmFjY291bnQuZXF1YWxzKGFjY291bnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhaW5mby5hdXRob3JpdHkuZXF1YWxzKGF1dGhvcml0eSkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC04ODcsNDAgKzg3Niw0NyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjdXJyZW50bHkgYWN0aXZlIHN5bmMgaXMgY2hhbmdpbmcgKHRoZXJlIGNhbiBvbmx5IGJlCi0gICAgICogb25lIGF0IGEgdGltZSkuICBFaXRoZXIgc3VwcGx5IGEgdmFsaWQgQWN0aXZlU3luY0NvbnRleHQgd2l0aCBpbmZvcm1hdGlvbgotICAgICAqIGFib3V0IHRoZSBzeW5jLCBvciBudWxsIHRvIHN0b3AgdGhlIGN1cnJlbnRseSBhY3RpdmUgc3luYy4KKyAgICAgKiBDYWxsZWQgd2hlbiBhIHN5bmMgaXMgc3RhcnRpbmcuIFN1cHBseSBhIHZhbGlkIEFjdGl2ZVN5bmNDb250ZXh0IHdpdGggaW5mb3JtYXRpb24KKyAgICAgKiBhYm91dCB0aGUgc3luYy4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVTeW5jKFN5bmNNYW5hZ2VyLkFjdGl2ZVN5bmNDb250ZXh0IGFjdGl2ZVN5bmNDb250ZXh0KSB7CisgICAgcHVibGljIFN5bmNJbmZvIGFkZEFjdGl2ZVN5bmMoU3luY01hbmFnZXIuQWN0aXZlU3luY0NvbnRleHQgYWN0aXZlU3luY0NvbnRleHQpIHsKKyAgICAgICAgZmluYWwgU3luY0luZm8gc3luY0luZm87CiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7Ci0gICAgICAgICAgICBpZiAoYWN0aXZlU3luY0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJzZXRBY3RpdmVTeW5jOiBhY2NvdW50PSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uYWNjb3VudAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGF1dGg9IiArIGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uLmF1dGhvcml0eQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNyYz0iICsgYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uc3luY1NvdXJjZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGV4dHJhcz0iICsgYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uZXh0cmFzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50U3luYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNldEFjdGl2ZVN5bmMgY2FsbGVkIHdpdGggZXhpc3RpbmcgYWN0aXZlIHN5bmMhIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0gZ2V0QXV0aG9yaXR5TG9ja2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uYWNjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uLmF1dGhvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJzZXRBY3RpdmVTeW5jIik7Ci0gICAgICAgICAgICAgICAgaWYgKGF1dGhvcml0eSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTeW5jID0gbmV3IFN5bmNJbmZvKGF1dGhvcml0eS5pZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml0eS5hY2NvdW50LCBhdXRob3JpdHkuYXV0aG9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlU3luY0NvbnRleHQubVN0YXJ0VGltZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgTG9nLnYoVEFHLCAic2V0QWN0aXZlU3luYzogbnVsbCIpOwotICAgICAgICAgICAgICAgIG1DdXJyZW50U3luYyA9IG51bGw7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJzZXRBY3RpdmVTeW5jOiBhY2NvdW50PSIKKyAgICAgICAgICAgICAgICAgICAgKyBhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5hY2NvdW50CisgICAgICAgICAgICAgICAgICAgICsgIiBhdXRoPSIgKyBhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5hdXRob3JpdHkKKyAgICAgICAgICAgICAgICAgICAgKyAiIHNyYz0iICsgYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uc3luY1NvdXJjZQorICAgICAgICAgICAgICAgICAgICArICIgZXh0cmFzPSIgKyBhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5leHRyYXMpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgQXV0aG9yaXR5SW5mbyBhdXRob3JpdHkgPSBnZXRPckNyZWF0ZUF1dGhvcml0eUxvY2tlZCgKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uYWNjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uYXV0aG9yaXR5LAorICAgICAgICAgICAgICAgICAgICAtMSAvKiBhc3NpZ24gYSBuZXcgaWRlbnRpZmllciBpZiBjcmVhdGluZyBhIG5ldyBhdXRob3JpdHkgKi8sCisgICAgICAgICAgICAgICAgICAgIHRydWUgLyogd3JpdGUgdG8gc3RvcmFnZSBpZiB0aGlzIHJlc3VsdHMgaW4gYSBjaGFuZ2UgKi8pOworICAgICAgICAgICAgc3luY0luZm8gPSBuZXcgU3luY0luZm8oYXV0aG9yaXR5LmlkZW50LAorICAgICAgICAgICAgICAgICAgICBhdXRob3JpdHkuYWNjb3VudCwgYXV0aG9yaXR5LmF1dGhvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlU3luY0NvbnRleHQubVN0YXJ0VGltZSk7CisgICAgICAgICAgICBtQ3VycmVudFN5bmNzLmFkZChzeW5jSW5mbyk7CiAgICAgICAgIH0KIAotICAgICAgICByZXBvcnRDaGFuZ2UoQ29udGVudFJlc29sdmVyLlNZTkNfT0JTRVJWRVJfVFlQRV9BQ1RJVkUpOworICAgICAgICByZXBvcnRBY3RpdmVDaGFuZ2UoKTsKKyAgICAgICAgcmV0dXJuIHN5bmNJbmZvOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IGEgcHJldmlvdXNseSBhY3RpdmUgc3luYyBpcyBubyBsb25nZXIgYWN0aXZlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFjdGl2ZVN5bmMoU3luY0luZm8gc3luY0luZm8pIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtQXV0aG9yaXRpZXMpIHsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgeworICAgICAgICAgICAgICAgIExvZy52KFRBRywgInJlbW92ZUFjdGl2ZVN5bmM6IGFjY291bnQ9IgorICAgICAgICAgICAgICAgICAgICAgICAgKyBzeW5jSW5mby5hY2NvdW50ICsgIiBhdXRoPSIgKyBzeW5jSW5mby5hdXRob3JpdHkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUN1cnJlbnRTeW5jcy5yZW1vdmUoc3luY0luZm8pOworICAgICAgICB9CisKKyAgICAgICAgcmVwb3J0QWN0aXZlQ2hhbmdlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDk1LDEwICsxMDkxLDI2IEBACiAgICAgICogUmV0dXJuIHRoZSBjdXJyZW50bHkgYWN0aXZlIHN5bmMgaW5mb3JtYXRpb24sIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8KICAgICAgKiBhY3RpdmUgc3luYy4gIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzIHRoZSByZWFsLCBsaXZlIGFjdGl2ZQogICAgICAqIHN5bmMgb2JqZWN0LCBzbyBiZSBjYXJlZnVsIHdoYXQgeW91IGRvIHdpdGggaXQuCisgICAgICogPHA+CisgICAgICogU2luY2UgbXVsdGlwbGUgY29uY3VycmVudCBzeW5jcyBhcmUgbm93IHN1cHBvcnRlZCB5b3Ugc2hvdWxkIHVzZQorICAgICAqIHtAbGluayAjZ2V0Q3VycmVudFN5bmNzKCl9IHRvIGdldCB0aGUgYWNjdXJhdGUgbGlzdCBvZiBjdXJyZW50IHN5bmNzLgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGl0ZW0gZnJvbSB0aGUgbGlzdCBvZiBjdXJyZW50IHN5bmNzCisgICAgICogb3IgbnVsbCBpZiB0aGVyZSBhcmUgbm9uZS4KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRDdXJyZW50U3luY3MoKX0KICAgICAgKi8KICAgICBwdWJsaWMgU3luY0luZm8gZ2V0Q3VycmVudFN5bmMoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUN1cnJlbnRTeW5jOworICAgICAgICAgICAgcmV0dXJuICFtQ3VycmVudFN5bmNzLmlzRW1wdHkoKSA/IG1DdXJyZW50U3luY3MuZ2V0KDApIDogbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3Qgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgc3luY3MuIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgaXRlbXMgYXJlIHRoZQorICAgICAqIHJlYWwsIGxpdmUgYWN0aXZlIHN5bmMgb2JqZWN0cywgc28gYmUgY2FyZWZ1bCB3aGF0IHlvdSBkbyB3aXRoIGl0LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN5bmNJbmZvPiBnZXRDdXJyZW50U3luY3MoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTeW5jSW5mbz4obUN1cnJlbnRTeW5jcyk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvWG1sRG9jdW1lbnRQcm92aWRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9YbWxEb2N1bWVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzYWQzOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvWG1sRG9jdW1lbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwR2V0OworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRmFjdG9yeTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIuT3BlblJlc291cmNlSWRSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5NYXRyaXhDdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQubmV0Lmh0dHAuQW5kcm9pZEh0dHBDbGllbnQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKioKKyAqIEEgcmVhZC1vbmx5IGNvbnRlbnQgcHJvdmlkZXIgd2hpY2ggZXh0cmFjdHMgZGF0YSBvdXQgb2YgYW4gWE1MIGRvY3VtZW50LgorICoKKyAqIDxwPkEgWFBhdGgtbGlrZSBzZWxlY3Rpb24gcGF0dGVybiBpcyB1c2VkIHRvIHNlbGVjdCBzb21lIG5vZGVzIGluIHRoZSBYTUwgZG9jdW1lbnQuIEVhY2ggc3VjaAorICogbm9kZSB3aWxsIGNyZWF0ZSBhIHJvdyBpbiB0aGUge0BsaW5rIEN1cnNvcn0gcmVzdWx0LjwvcD4KKyAqCisgKiBFYWNoIHJvdyBpcyB0aGVuIHBvcHVsYXRlZCB3aXRoIGNvbHVtbnMgdGhhdCBhcmUgYWxzbyBkZWZpbmVkIGFzIFhQYXRoLWxpa2UgcHJvamVjdGlvbnMuIFRoZXNlCisgKiBwcm9qZWN0aW9ucyBmZXRjaCBhdHRyaWJ1dGVzIHZhbHVlcyBvciB0ZXh0IGluIHRoZSBtYXRjaGluZyByb3cgbm9kZSBvciBpdHMgY2hpbGRyZW4uCisgKgorICogPHA+VG8gYWRkIHRoaXMgcHJvdmlkZXIgaW4geW91ciBhcHBsaWNhdGlvbiwgeW91IHNob3VsZCBhZGQgaXRzIGRlY2xhcmF0aW9uIHRvIHlvdXIgYXBwbGljYXRpb24KKyAqIG1hbmlmZXN0OgorICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPgorICogJmx0O3Byb3ZpZGVyIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb250ZW50LlhtbERvY3VtZW50UHJvdmlkZXIiIGFuZHJvaWQ6YXV0aG9yaXRpZXM9InhtbGRvY3VtZW50IiAvJmd0OworICogPC9wcmU+CisgKiA8L3A+CisgKgorICogPGgyPk5vZGUgc2VsZWN0aW9uIHN5bnRheDwvaDI+CisgKiBUaGUgbm9kZSBzZWxlY3Rpb24gc3ludGF4IGlzIG1hZGUgb2YgdGhlIGNvbmNhdGVuYXRpb24gb2YgYW4gYXJiaXRyYXJ5IG51bWJlciAoYXQgbGVhc3Qgb25lKSBvZgorICogPGNvZGU+L25vZGVfbmFtZTwvY29kZT4gbm9kZSBzZWxlY3Rpb24gcGF0dGVybnMuCisgKgorICogPHA+VGhlIDxjb2RlPi9yb290L2NoaWxkMS9jaGlsZDI8L2NvZGU+IHBhdHRlcm4gd2lsbCBmb3IgaW5zdGFuY2UgbWF0Y2ggYWxsIG5vZGVzIG5hbWVkCisgKiA8Y29kZT5jaGlsZDI8L2NvZGU+IHdoaWNoIGFyZSBjaGlsZHJlbiBvZiBhIG5vZGUgbmFtZWQgPGNvZGU+Y2hpbGQxPC9jb2RlPiB3aGljaCBhcmUgdGhlbXNlbHZlcworICogY2hpbGRyZW4gb2YgYSByb290IG5vZGUgbmFtZWQgPGNvZGU+cm9vdDwvY29kZT4uPC9wPgorICoKKyAqIEFueSA8Y29kZT4vPC9jb2RlPiBzZXBhcmF0b3IgaW4gdGhlIHByZXZpb3VzIGV4cHJlc3Npb24gY2FuIGJlIHJlcGxhY2VkIGJ5IGEgPGNvZGU+Ly88L2NvZGU+CisgKiBzZXBhcmF0b3IgaW5zdGVhZCwgd2hpY2ggaW5kaWNhdGVkIGEgPGk+ZGVzY2VuZGFudDwvaT4gaW5zdGVhZCBvZiBhIGNoaWxkLgorICoKKyAqIDxwPlRoZSA8Y29kZT4vL25vZGUxLy9ub2RlMjwvY29kZT4gcGF0dGVybiB3aWxsIGZvciBpbnN0YW5jZSBtYXRjaCBhbGwgbm9kZXMgbmFtZWQKKyAqIDxjb2RlPm5vZGUyPC9jb2RlPiB3aGljaCBhcmUgZGVzY2VuZGFudCBvZiBhIG5vZGUgbmFtZWQgPGNvZGU+bm9kZTE8L2NvZGU+IGxvY2F0ZWQgYW55d2hlcmUgaW4KKyAqIHRoZSBkb2N1bWVudCBoaWVyYXJjaHkuPC9wPgorICoKKyAqIE5vZGUgbmFtZXMgY2FuIGNvbnRhaW4gbmFtZXNwYWNlcyBpbiB0aGUgZm9ybSA8Y29kZT5uYW1lc3BhY2U6bm9kZTwvY29kZT4uCisgKgorICogPGgyPlByb2plY3Rpb24gc3ludGF4PC9oMj4KKyAqIEZvciBldmVyeSBzZWxlY3RlZCBub2RlLCB0aGUgcHJvamVjdGlvbiB3aWxsIHRoZW4gZXh0cmFjdCBhY3R1YWwgZGF0YSBmcm9tIHRoaXMgbm9kZSBhbmQgaXRzCisgKiBkZXNjZW5kYW50LgorICoKKyAqIDxwPlVzZSBhIHN5bnRheCBzaW1pbGFyIHRvIHRoZSBzZWxlY3Rpb24gc3ludGF4IGRlc2NyaWJlZCBhYm92ZSB0byBzZWxlY3QgdGhlIHRleHQgYXNzb2NpYXRlZAorICogd2l0aCBhIGNoaWxkIG9mIHRoZSBzZWxlY3RlZCBub2RlLiBUaGUgaW1wbGljaXQgcm9vdCBvZiB0aGlzIHByb2plY3Rpb24gcGF0dGVybiBpcyB0aGUgc2VsZWN0ZWQKKyAqIG5vZGUuIDxjb2RlPi88L2NvZGU+IHdpbGwgaGVuY2UgcmVmZXIgdG8gdGhlIHRleHQgb2YgdGhlIHNlbGVjdGVkIG5vZGUsIHdoaWxlCisgKiA8Y29kZT4vY2hpbGQxPC9jb2RlPiB3aWxsIGZldGNoIHRoZSB0ZXh0IG9mIGl0cyBjaGlsZCBuYW1lZCA8Y29kZT5jaGlsZDE8L2NvZGU+IGFuZAorICogPGNvZGU+Ly9jaGlsZDE8L2NvZGU+IHdpbGwgbWF0Y2ggYW55IDxpPmRlc2NlbmRhbnQ8L2k+IG5hbWVkIDxjb2RlPmNoaWxkMTwvY29kZT4uIElmIHNldmVyYWwKKyAqIG5vZGVzIG1hdGNoIHRoZSBwcm9qZWN0aW9uIHBhdHRlcm4sIHRoZWlyIHRleHRzIGFyZSBhcHBlbmRlZCBhcyBhIHJlc3VsdC48L3A+CisgKgorICogQSBwcm9qZWN0aW9uIGNhbiBhbHNvIGZldGNoIGFueSBub2RlIGF0dHJpYnV0ZSBieSBhcHBlbmRpbmcgYSA8Y29kZT5AYXR0cmlidXRlX25hbWU8L2NvZGU+CisgKiBwYXR0ZXJuIHRvIHRoZSBwcmV2aW91c2x5IGRlc2NyaWJlZCBzeW50YXguIDxjb2RlPi8vY2hpbGQxQHByaWNlPC9jb2RlPiB3aWxsIGZvciBpbnN0YW5jZSBtYXRjaAorICogdGhlIGF0dHJpYnV0ZSA8Y29kZT5wcmljZTwvY29kZT4gb2YgYW55IDxjb2RlPmNoaWxkMTwvY29kZT4gZGVzY2VuZGFudC4KKyAqCisgKiA8cD5JZiBhIHByb2plY3Rpb24gZG9lcyBub3QgbWF0Y2ggYW55IG5vZGUvYXR0cmlidXRlLCBpdHMgYXNzb2NpYXRlZCB2YWx1ZSB3aWxsIGJlIGFuIGVtcHR5CisgKiBzdHJpbmcuPC9wPgorICoKKyAqIDxoMj5FeGFtcGxlPC9oMj4KKyAqIFVzaW5nIHRoZSBmb2xsb3dpbmcgWE1MIGRvY3VtZW50OgorICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPgorICogJmx0O2xpYnJhcnkmZ3Q7CisgKiAgICZsdDtib29rIGlkPSJFSDk0IiZndDsKKyAqICAgICAmbHQ7dGl0bGUmZ3Q7VGhlIE9sZCBNYW4gYW5kIHRoZSBTZWEmbHQ7L3RpdGxlJmd0OworICogICAgICZsdDthdXRob3ImZ3Q7RXJuZXN0IEhlbWluZ3dheSZsdDsvYXV0aG9yJmd0OworICogICAmbHQ7L2Jvb2smZ3Q7CisgKiAgICZsdDtib29rIGlkPSJYWDEwIiZndDsKKyAqICAgICAmbHQ7dGl0bGUmZ3Q7VGhlIEFyYWJpYW4gTmlnaHRzOiBUYWxlcyBvZiAxLDAwMSBOaWdodHMmbHQ7L3RpdGxlJmd0OworICogICAmbHQ7L2Jvb2smZ3Q7CisgKiAgICZsdDtuby1pZCZndDsKKyAqICAgICAmbHQ7Ym9vayZndDsKKyAqICAgICAgICZsdDt0aXRsZSZndDtBbmltYWwgRmFybSZsdDsvdGl0bGUmZ3Q7CisgKiAgICAgICAmbHQ7YXV0aG9yJmd0O0dlb3JnZSBPcndlbGwmbHQ7L2F1dGhvciZndDsKKyAqICAgICAmbHQ7L2Jvb2smZ3Q7CisgKiAgICZsdDsvbm8taWQmZ3Q7CisgKiAmbHQ7L2xpYnJhcnkmZ3Q7CisgKiA8L3ByZT4KKyAqIEEgc2VsZWN0aW9uIHBhdHRlcm4gb2YgPGNvZGU+L2xpYnJhcnkvL2Jvb2s8L2NvZGU+IHdpbGwgbWF0Y2ggdGhlIHRocmVlIGJvb2sgZW50cmllcyAod2hpbGUKKyAqIDxjb2RlPi9saWJyYXJ5L2Jvb2s8L2NvZGU+IHdpbGwgb25seSBtYXRjaCB0aGUgZmlyc3QgdHdvIG9uZXMpLgorICoKKyAqIDxwPkRlZmluaW5nIHRoZSBwcm9qZWN0aW9ucyBhcyA8Y29kZT4vdGl0bGU8L2NvZGU+LCA8Y29kZT4vYXV0aG9yPC9jb2RlPiBhbmQgPGNvZGU+QGlkPC9jb2RlPgorICogd2lsbCByZXRyaWV2ZSB0aGUgYXNzb2NpYXRlZCBkYXRhLiBOb3RlIHRoYXQgdGhlIGF1dGhvciBvZiB0aGUgc2Vjb25kIGJvb2sgYXMgd2VsbCBhcyB0aGUgaWQgb2YKKyAqIHRoZSB0aGlyZCBhcmUgZW1wdHkgc3RyaW5ncy4KKyAqLworcHVibGljIGNsYXNzIFhtbERvY3VtZW50UHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50UHJvdmlkZXIgeworICAgIC8qCisgICAgICogSWRlYXMgZm9yIGltcHJvdmVtZW50OgorICAgICAqIC0gRXhwYW5kIFhQYXRoLWxpa2Ugc3ludGF4IHRvIGFsbG93IGZvciBbbmJdIGNoaWxkIG51bWJlciBzZWxlY3RvcgorICAgICAqIC0gQWRkcmVzcyB0aGUgc3RhcnRpbmcgLiBidWcgaW4gQWJzdHJhY3RDdXJzb3Igd2hpY2ggcHJldmVudHMgYSB0cnVlIFhQYXRoIHN5bnRheC4KKyAgICAgKiAtIFByb3ZpZGUgYW4gYWx0ZXJuYXRpdmUgdG8gY29uY2F0ZW5hdGlvbiB3aGVuIHNldmVyYWwgbm9kZSBtYXRjaCAobGlzdC1saWtlKS4KKyAgICAgKiAtIFN1cHBvcnQgbmFtZXNwYWNlcyBpbiBhdHRyaWJ1dGUgbmFtZXMuCisgICAgICogLSBJbmNyZW1lbnRhbCBDdXJzb3IgY3JlYXRpb24sIHBhZ2luYXRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJYbWxEb2N1bWVudFByb3ZpZGVyIjsKKyAgICBwcml2YXRlIEFuZHJvaWRIdHRwQ2xpZW50IG1IdHRwQ2xpZW50OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFF1ZXJ5IGRhdGEgZnJvbSB0aGUgWE1MIGRvY3VtZW50IHJlZmVyZW5jZWQgaW4gdGhlIFVSSS4KKyAgICAgKgorICAgICAqIDxwPlRoZSBYTUwgZG9jdW1lbnQgY2FuIGJlIGEgbG9jYWwgcmVzb3VyY2Ugb3IgYSBmaWxlIHRoYXQgd2lsbCBiZSBkb3dubG9hZGVkIGZyb20gdGhlCisgICAgICogSW50ZXJuZXQuIEluIHRoZSBsYXR0ZXIgY2FzZSwgeW91ciBhcHBsaWNhdGlvbiBuZWVkcyB0byByZXF1ZXN0IHRoZSBJTlRFUk5FVCBwZXJtaXNzaW9uIGluCisgICAgICogaXRzIG1hbmlmZXN0LjwvcD4KKyAgICAgKgorICAgICAqIFRoZSBVUkkgd2lsbCBiZSBvZiB0aGUgZm9ybSA8Y29kZT5jb250ZW50Oi8veG1sZG9jdW1lbnQvP3Jlc291cmNlPVIueG1sLm15RmlsZTwvY29kZT4gZm9yIGEKKyAgICAgKiBsb2NhbCByZXNvdXJjZS4gPGNvZGU+eG1sZG9jdW1lbnQ8L2NvZGU+IHNob3VsZCBtYXRjaCB0aGUgYXV0aG9yaXR5IGRlY2xhcmVkIGZvciB0aGlzCisgICAgICogcHJvdmlkZXIgaW4geW91ciBtYW5pZmVzdC4gSW50ZXJuZXQgZG9jdW1lbnRzIGFyZSByZWZlcmVuY2VkIHVzaW5nCisgICAgICogPGNvZGU+Y29udGVudDovL3htbGRvY3VtZW50Lz91cmw9PC9jb2RlPiBmb2xsb3dlZCBieSBhbiBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIFVSTCBvZiB5b3VyCisgICAgICogZG9jdW1lbnQgKHNlZSB7QGxpbmsgVXJpI2VuY29kZShTdHJpbmcpfSkuCisgICAgICoKKyAgICAgKiA8cD5UaGUgbnVtYmVyIG9mIGNvbHVtbnMgb2YgdGhlIHJlc3VsdGluZyBDdXJzb3IgaXMgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIHByb2plY3Rpb24KKyAgICAgKiBhcnJheSBwbHVzIG9uZSwgbmFtZWQgPGNvZGU+X2lkPC9jb2RlPiB3aGljaCB3aWxsIGNvbnRhaW4gYSB1bmlxdWUgcm93IGlkIChhbGxvd2luZyB0aGUKKyAgICAgKiBDdXJzb3IgdG8gYmUgdXNlZCB3aXRoIGEge0BsaW5rIEN1cnNvckFkYXB0ZXJ9KS4gVGhlIG90aGVyIGNvbHVtbnMnIG5hbWVzIGFyZSB0aGUgcHJvamVjdGlvbgorICAgICAqIHBhdHRlcm5zLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB5b3VyIGxvY2FsIHJlc291cmNlIG9yIEludGVybmV0IGRvY3VtZW50LgorICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uIEEgc2V0IG9mIHBhdHRlcm5zIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGV4dHJhY3QgZGF0YSBmcm9tIGVhY2ggc2VsZWN0ZWQKKyAgICAgKiBub2RlLiBTZWUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgcGF0dGVybiBzeW50YXguCisgICAgICogQHBhcmFtIHNlbGVjdGlvbiBBIHNlbGVjdGlvbiBwYXR0ZXJuIHdoaWNoIHdpbGwgc2VsZWN0IHRoZSBub2RlcyB0aGF0IHdpbGwgY3JlYXRlIHRoZQorICAgICAqIEN1cnNvcidzIHJvd3MuIFNlZSBjbGFzcyBkb2N1bWVudGF0aW9uIGZvciBwYXR0ZXJuIHN5bnRheC4KKyAgICAgKiBAcGFyYW0gc2VsZWN0aW9uQXJncyBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBzb3J0T3JkZXIgVGhlIHJvdyBvcmRlciBpbiB0aGUgcmVzdWx0aW5nIGN1cnNvciBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIG5vZGUgb3JkZXIgaW4KKyAgICAgKiB0aGUgWE1MIGRvY3VtZW50LiBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkLgorICAgICAqIEByZXR1cm4gQSBDdXJzb3Igb3IgbnVsbCBpbiBjYXNlIG9mIGVycm9yLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDdXJzb3IgcXVlcnkoVXJpIHVyaSwgU3RyaW5nW10gcHJvamVjdGlvbiwgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywKKyAgICAgICAgICAgIFN0cmluZyBzb3J0T3JkZXIpIHsKKworICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciA9IG51bGw7CisgICAgICAgIG1IdHRwQ2xpZW50ID0gbnVsbDsKKworICAgICAgICBmaW5hbCBTdHJpbmcgdXJsID0gdXJpLmdldFF1ZXJ5UGFyYW1ldGVyKCJ1cmwiKTsKKyAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7CisgICAgICAgICAgICBwYXJzZXIgPSBnZXRVcmlYbWxQdWxsUGFyc2VyKHVybCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzb3VyY2UgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXIoInJlc291cmNlIik7CisgICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFVyaSByZXNvdXJjZVVyaSA9IFVyaS5wYXJzZShDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0FORFJPSURfUkVTT1VSQ0UgKyAiOi8vIiArCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSArICIvIiArIHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICBwYXJzZXIgPSBnZXRSZXNvdXJjZVhtbFB1bGxQYXJzZXIocmVzb3VyY2VVcmkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhcnNlciAhPSBudWxsKSB7CisgICAgICAgICAgICBYTUxDdXJzb3IgeG1sQ3Vyc29yID0gbmV3IFhNTEN1cnNvcihzZWxlY3Rpb24sIHByb2plY3Rpb24pOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB4bWxDdXJzb3IucGFyc2VXaXRoKHBhcnNlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHhtbEN1cnNvcjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiSS9PIGVycm9yIHdoaWxlIHBhcnNpbmcgWE1MICIgKyB1cmksIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkVycm9yIHdoaWxlIHBhcnNpbmcgWE1MICIgKyB1cmksIGUpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAobUh0dHBDbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtSHR0cENsaWVudC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gWG1sUHVsbFBhcnNlciBmb3IgdGhlIHByb3ZpZGVkIFVSTC4gQ2FuIGJlIG92ZXJsb2FkZWQgdG8gcHJvdmlkZSB5b3VyIG93biBwYXJzZXIuCisgICAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBYTUwgZG9jdW1lbnQgdGhhdCBpcyB0byBiZSBwYXJzZWQuCisgICAgICogQHJldHVybiBBbiBYbWxQdWxsUGFyc2VyIG9uIHRoaXMgZG9jdW1lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFhtbFB1bGxQYXJzZXIgZ2V0VXJpWG1sUHVsbFBhcnNlcihTdHJpbmcgdXJsKSB7CisgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFhtbFB1bGxQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBYbWxQdWxsUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgICAgIHBhcnNlciA9IGZhY3RvcnkubmV3UHVsbFBhcnNlcigpOworICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmFibGUgdG8gY3JlYXRlIFhtbFB1bGxQYXJzZXIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgSHR0cEdldCBnZXQgPSBuZXcgSHR0cEdldCh1cmwpOworICAgICAgICAgICAgbUh0dHBDbGllbnQgPSBBbmRyb2lkSHR0cENsaWVudC5uZXdJbnN0YW5jZSgiQW5kcm9pZCIpOworICAgICAgICAgICAgSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gbUh0dHBDbGllbnQuZXhlY3V0ZShnZXQpOworICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19PSykgeworICAgICAgICAgICAgICAgIGZpbmFsIEh0dHBFbnRpdHkgZW50aXR5ID0gcmVzcG9uc2UuZ2V0RW50aXR5KCk7CisgICAgICAgICAgICAgICAgaWYgKGVudGl0eSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gZW50aXR5LmdldENvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJFcnJvciB3aGlsZSByZXRyaWV2aW5nIFhNTCBmaWxlICIgKyB1cmwsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFyc2VyLnNldElucHV0KGlucHV0U3RyZWFtLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRXJyb3Igd2hpbGUgcmVhZGluZyBYTUwgZmlsZSBmcm9tICIgKyB1cmwsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcGFyc2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gWG1sUHVsbFBhcnNlciBmb3IgdGhlIHByb3ZpZGVkIGxvY2FsIHJlc291cmNlLiBDYW4gYmUgb3ZlcmxvYWRlZCB0byBwcm92aWRlIHlvdXIKKyAgICAgKiBvd24gcGFyc2VyLgorICAgICAqIEBwYXJhbSByZXNvdXJjZVVyaSBBIGZ1bGx5IHF1YWxpZmllZCByZXNvdXJjZSBuYW1lIHJlZmVyZW5jaW5nIGEgbG9jYWwgWE1MIHJlc291cmNlLgorICAgICAqIEByZXR1cm4gQW4gWG1sUHVsbFBhcnNlciBvbiB0aGlzIHJlc291cmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBYbWxQdWxsUGFyc2VyIGdldFJlc291cmNlWG1sUHVsbFBhcnNlcihVcmkgcmVzb3VyY2VVcmkpIHsKKyAgICAgICAgT3BlblJlc291cmNlSWRSZXN1bHQgcmVzb3VyY2VJZDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc291cmNlSWQgPSBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkuZ2V0UmVzb3VyY2VJZChyZXNvdXJjZVVyaSk7CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VJZC5yLmdldFhtbChyZXNvdXJjZUlkLmlkKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJYTUwgcmVzb3VyY2Ugbm90IGZvdW5kOiAiICsgcmVzb3VyY2VVcmkudG9TdHJpbmcoKSwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgInZuZC5hbmRyb2lkLmN1cnNvci5kaXIveG1sZG9jIi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoVXJpIHVyaSkgeworICAgICAgICByZXR1cm4gInZuZC5hbmRyb2lkLmN1cnNvci5kaXIveG1sZG9jIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIENvbnRlbnRQcm92aWRlciBpcyByZWFkLW9ubHkuIFRoaXMgbWV0aG9kIHRocm93cyBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KKyAgICAgKiovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFVyaSBpbnNlcnQoVXJpIHVyaSwgQ29udGVudFZhbHVlcyB2YWx1ZXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBDb250ZW50UHJvdmlkZXIgaXMgcmVhZC1vbmx5LiBUaGlzIG1ldGhvZCB0aHJvd3MgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCisgICAgICoqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVsZXRlKFVyaSB1cmksIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBDb250ZW50UHJvdmlkZXIgaXMgcmVhZC1vbmx5LiBUaGlzIG1ldGhvZCB0aHJvd3MgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCisgICAgICoqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgdXBkYXRlKFVyaSB1cmksIENvbnRlbnRWYWx1ZXMgdmFsdWVzLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFhNTEN1cnNvciBleHRlbmRzIE1hdHJpeEN1cnNvciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGF0dGVybiBtU2VsZWN0aW9uUGF0dGVybjsKKyAgICAgICAgcHJpdmF0ZSBQYXR0ZXJuW10gbVByb2plY3Rpb25QYXR0ZXJuczsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtQXR0cmlidXRlTmFtZXM7CisgICAgICAgIHByaXZhdGUgU3RyaW5nW10gbUN1cnJlbnRWYWx1ZXM7CisgICAgICAgIHByaXZhdGUgQml0U2V0W10gbUFjdGl2ZVRleHREZXB0aE1hc2s7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1OdW1iZXJPZlByb2plY3Rpb25zOworCisgICAgICAgIHB1YmxpYyBYTUxDdXJzb3IoU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gcHJvamVjdGlvbnMpIHsKKyAgICAgICAgICAgIHN1cGVyKHByb2plY3Rpb25zKTsKKyAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBjb2x1bW4gaW4gcHJvamVjdGlvbnMgaXMgdXNlZCBmb3IgdGhlIF9JRAorICAgICAgICAgICAgbU51bWJlck9mUHJvamVjdGlvbnMgPSBwcm9qZWN0aW9ucy5sZW5ndGggLSAxOworICAgICAgICAgICAgbVNlbGVjdGlvblBhdHRlcm4gPSBjcmVhdGVQYXR0ZXJuKHNlbGVjdGlvbik7CisgICAgICAgICAgICBjcmVhdGVQcm9qZWN0aW9uUGF0dGVybihwcm9qZWN0aW9ucyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFBhdHRlcm4gY3JlYXRlUGF0dGVybihTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gaW5wdXQucmVwbGFjZUFsbCgiLy8iLCAiLyguKi98KSIpLnJlcGxhY2VBbGwoIl4vIiwgIl4vIikgKyAiJCI7CisgICAgICAgICAgICByZXR1cm4gUGF0dGVybi5jb21waWxlKHBhdHRlcm4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3Rpb25QYXR0ZXJuKFN0cmluZ1tdIHByb2plY3Rpb25zKSB7CisgICAgICAgICAgICBtUHJvamVjdGlvblBhdHRlcm5zID0gbmV3IFBhdHRlcm5bbU51bWJlck9mUHJvamVjdGlvbnNdOworICAgICAgICAgICAgbUF0dHJpYnV0ZU5hbWVzID0gbmV3IFN0cmluZ1ttTnVtYmVyT2ZQcm9qZWN0aW9uc107CisgICAgICAgICAgICBtQWN0aXZlVGV4dERlcHRoTWFzayA9IG5ldyBCaXRTZXRbbU51bWJlck9mUHJvamVjdGlvbnNdOworICAgICAgICAgICAgLy8gQWRkIGEgY29sdW1uIHRvIHN0b3JlIF9JRAorICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZXMgPSBuZXcgU3RyaW5nW21OdW1iZXJPZlByb2plY3Rpb25zICsgMV07CisKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtTnVtYmVyT2ZQcm9qZWN0aW9uczsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2ZVRleHREZXB0aE1hc2tbaV0gPSBuZXcgQml0U2V0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHByb2plY3Rpb24gPSBwcm9qZWN0aW9uc1tpICsgMV07IC8vICsxIHRvIHNraXAgdGhlIF9JRCBjb2x1bW4KKyAgICAgICAgICAgICAgICBpbnQgYXRJbmRleCA9IHByb2plY3Rpb24ubGFzdEluZGV4T2YoJ0AnLCBwcm9qZWN0aW9uLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoYXRJbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVOYW1lc1tpXSA9IHByb2plY3Rpb24uc3Vic3RyaW5nKGF0SW5kZXgrMSk7CisgICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb24gPSBwcm9qZWN0aW9uLnN1YnN0cmluZygwLCBhdEluZGV4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtQXR0cmlidXRlTmFtZXNbaV0gPSBudWxsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENvbmZvcm1zIHRvIFhQYXRoIHN0YW5kYXJkOiByZWZlcmVuY2UgdG8gbG9jYWwgY29udGV4dCBzdGFydHMgd2l0aCBhIC4KKyAgICAgICAgICAgICAgICBpZiAocHJvamVjdGlvbi5jaGFyQXQoMCkgPT0gJy4nKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb24gPSBwcm9qZWN0aW9uLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVByb2plY3Rpb25QYXR0ZXJuc1tpXSA9IGNyZWF0ZVBhdHRlcm4ocHJvamVjdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwYXJzZVdpdGgoWG1sUHVsbFBhcnNlciBwYXJzZXIpIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHBhdGggPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgU3RhY2s8SW50ZWdlcj4gcGF0aExlbmd0aFN0YWNrID0gbmV3IFN0YWNrPEludGVnZXI+KCk7CisKKyAgICAgICAgICAgIC8vIFRoZXJlIGFyZSB0d28gcGFyc2luZyBtb2RlOiBpbiByb290IG1vZGUsIHJvb3RQYXRoIGlzIHVwZGF0ZWQgYW5kIG5vZGVzIG1hdGNoaW5nCisgICAgICAgICAgICAvLyBzZWxlY3Rpb25QYXR0ZXJuIGFyZSBzZWFyY2hlZCBmb3IgYW5kIGN1cnJlbnROb2RlRGVwdGggaXMgbmVnYXRpdmUuCisgICAgICAgICAgICAvLyBXaGVuIGEgbm9kZSBtYXRjaGluZyBzZWxlY3Rpb25QYXR0ZXJuIGlzIGZvdW5kLCBjdXJyZW50Tm9kZURlcHRoIGlzIHNldCB0byAwIGFuZAorICAgICAgICAgICAgLy8gdXBkYXRlZCBhcyBjaGlsZHJlbiBhcmUgcGFyc2VkIGFuZCBwcm9qZWN0aW9uUGF0dGVybnMgYXJlIHNlYXJjaGVkIGluIG5vZGVQYXRoLgorICAgICAgICAgICAgaW50IGN1cnJlbnROb2RlRGVwdGggPSAtMTsKKworICAgICAgICAgICAgLy8gSW5kZXggd2hlcmUgbG9jYWwgc2VsZWN0ZWQgbm9kZSBwYXRoIHN0YXJ0cyBmcm9tIGluIHBhdGgKKyAgICAgICAgICAgIGludCBjdXJyZW50Tm9kZVBhdGhTdGFydEluZGV4ID0gMDsKKworICAgICAgICAgICAgaW50IGV2ZW50VHlwZSA9IHBhcnNlci5nZXRFdmVudFR5cGUoKTsKKyAgICAgICAgICAgIHdoaWxlIChldmVudFR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKworICAgICAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgcGF0aExlbmd0aFN0YWNrLnB1c2gocGF0aC5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKCcvJyk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBudWxsOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0UHJlZml4IGlzIG5vdCBzdXBwb3J0ZWQgYnkgbG9jYWwgWG1sIHJlc291cmNlIHBhcnNlcgorICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyc2VyLmdldFByZWZpeCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZChwcmVmaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmQoJzonKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZChwYXJzZXIuZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGVEZXB0aCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZURlcHRoKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIG5vZGUgbWF0Y2hpbmcgc2VsZWN0aW9uIGlzIGZvdW5kOiBpbml0aWFsaXplIGNoaWxkIHBhcnNpbmcgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3Rpb25QYXR0ZXJuLm1hdGNoZXIocGF0aC50b1N0cmluZygpKS5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZURlcHRoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZVBhdGhTdGFydEluZGV4ID0gcGF0aC5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFZhbHVlc1swXSA9IEludGVnZXIudG9TdHJpbmcoZ2V0Q291bnQoKSk7IC8vIF9JRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mUHJvamVjdGlvbnM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCB2YWx1ZXMgdG8gZGVmYXVsdCAoZW1wdHkgc3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFZhbHVlc1tpICsgMV0gPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRleHREZXB0aE1hc2tbaV0uY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHRlc3QgaGFzIHRvIGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBwcmV2aW91cyBvbmUgYXMgY3VycmVudE5vZGVEZXB0aCBjYW4KKyAgICAgICAgICAgICAgICAgICAgLy8gYmUgbW9kaWZpZWQgYWJvdmUgKHdoZW4gYSBub2RlIG1hdGNoaW5nIHNlbGVjdGlvbiBpcyBmb3VuZCkuCisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZURlcHRoID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbE5vZGVQYXRoID0gcGF0aC5zdWJzdHJpbmcoY3VycmVudE5vZGVQYXRoU3RhcnRJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1iZXJPZlByb2plY3Rpb25zOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVByb2plY3Rpb25QYXR0ZXJuc1tpXS5tYXRjaGVyKGxvY2FsTm9kZVBhdGgpLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbUF0dHJpYnV0ZU5hbWVzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VmFsdWVzW2kgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIGF0dHJpYnV0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVGV4dERlcHRoTWFza1tpXS5zZXQoY3VycmVudE5vZGVEZXB0aCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09IFhtbFB1bGxQYXJzZXIuRU5EX1RBRykgeworICAgICAgICAgICAgICAgICAgICAvLyBQb3AgbGFzdCBub2RlIGZyb20gcGF0aAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcGF0aExlbmd0aFN0YWNrLnBvcCgpOworICAgICAgICAgICAgICAgICAgICBwYXRoLnNldExlbmd0aChsZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZURlcHRoID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZURlcHRoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZWF2aW5nIGEgc2VsZWN0aW9uIG1hdGNoaW5nIG5vZGU6IGFkZCBhIG5ldyByb3cgd2l0aCByZXN1bHRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUm93KG1DdXJyZW50VmFsdWVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZQcm9qZWN0aW9uczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUZXh0RGVwdGhNYXNrW2ldLnNldChjdXJyZW50Tm9kZURlcHRoLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGVEZXB0aC0tOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudFR5cGUgPT0gWG1sUHVsbFBhcnNlci5URVhUKSAmJiAoIXBhcnNlci5pc1doaXRlc3BhY2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZQcm9qZWN0aW9uczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnROb2RlRGVwdGggPj0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobUFjdGl2ZVRleHREZXB0aE1hc2tbaV0uZ2V0KGN1cnJlbnROb2RlRGVwdGgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VmFsdWVzW2kgKyAxXSArPSBwYXJzZXIuZ2V0VGV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gcGFyc2VyLm5leHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vQWN0aXZpdHlJbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FjdGl2aXR5SW5mby5qYXZhCmluZGV4IGUyNmYxNjAuLmU2ODhjODYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vQWN0aXZpdHlJbmZvLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BY3Rpdml0eUluZm8uamF2YQpAQCAtMTQ5LDYgKzE0OSwyNyBAQAogICAgICAqIHtAbGluayBhbmRyb2lkLlIuYXR0ciNmaW5pc2hPbkNsb3NlU3lzdGVtRGlhbG9nc30gYXR0cmlidXRlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfRklOSVNIX09OX0NMT1NFX1NZU1RFTV9ESUFMT0dTID0gMHgwMTAwOworICAgIC8qKiAKKyAgICAgKiBCaXQgaW4ge0BsaW5rICNmbGFnc30gY29ycmVzcG9uZGluZyB0byBhbiBpbW1lcnNpdmUgYWN0aXZpdHkKKyAgICAgKiB0aGF0IHdpc2hlcyBub3QgdG8gYmUgaW50ZXJydXB0ZWQgYnkgbm90aWZpY2F0aW9ucy4KKyAgICAgKiBBcHBsaWNhdGlvbnMgdGhhdCBoaWRlIHRoZSBzeXN0ZW0gbm90aWZpY2F0aW9uIGJhciB3aXRoCisgICAgICoge0BsaW5rIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyNGTEFHX0ZVTExTQ1JFRU59CisgICAgICogbWF5IHN0aWxsIGJlIGludGVycnVwdGVkIGJ5IGhpZ2gtcHJpb3JpdHkgbm90aWZpY2F0aW9uczsgZm9yIGV4YW1wbGUsIGFuCisgICAgICogaW5jb21pbmcgcGhvbmUgY2FsbCBtYXkgdXNlCisgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbiNmdWxsU2NyZWVuSW50ZW50IGZ1bGxTY3JlZW5JbnRlbnR9CisgICAgICogdG8gcHJlc2VudCBhIGZ1bGwtc2NyZWVuIGluLWNhbGwgYWN0aXZpdHkgdG8gdGhlIHVzZXIsIHBhdXNpbmcgdGhlCisgICAgICogY3VycmVudCBhY3Rpdml0eSBhcyBhIHNpZGUtZWZmZWN0LiBBbiBhY3Rpdml0eSB3aXRoCisgICAgICoge0BsaW5rICNGTEFHX0lNTUVSU0lWRX0gc2V0LCBob3dldmVyLCB3aWxsIG5vdCBiZSBpbnRlcnJ1cHRlZDsgdGhlCisgICAgICogbm90aWZpY2F0aW9uIG1heSBiZSBzaG93biBpbiBzb21lIG90aGVyIHdheSAoc3VjaCBhcyBhIHNtYWxsIGZsb2F0aW5nCisgICAgICogInRvYXN0IiB3aW5kb3cpLgorICAgICAqIHtAc2VlIGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbiNGTEFHX0hJR0hfUFJJT1JJVFl9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19JTU1FUlNJVkUgPSAweDAyMDA7CisgICAgLyoqCisgICAgICogVmFsdWUgZm9yIHtAbGluayAjZmxhZ3N9OiB0cnVlIHdoZW4gdGhlIGFwcGxpY2F0aW9uJ3MgcmVuZGVyaW5nIHNob3VsZAorICAgICAqIGJlIGhhcmR3YXJlIGFjY2VsZXJhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQgPSAweDA0MDA7CiAgICAgLyoqCiAgICAgICogT3B0aW9ucyB0aGF0IGhhdmUgYmVlbiBzZXQgaW4gdGhlIGFjdGl2aXR5IGRlY2xhcmF0aW9uIGluIHRoZQogICAgICAqIG1hbmlmZXN0LgpAQCAtMTU5LDYgKzE4MCw3IEBACiAgICAgICoge0BsaW5rICNGTEFHX1NUQVRFX05PVF9ORUVERUR9LCB7QGxpbmsgI0ZMQUdfRVhDTFVERV9GUk9NX1JFQ0VOVFN9LAogICAgICAqIHtAbGluayAjRkxBR19BTExPV19UQVNLX1JFUEFSRU5USU5HfSwge0BsaW5rICNGTEFHX05PX0hJU1RPUll9LAogICAgICAqIHtAbGluayAjRkxBR19GSU5JU0hfT05fQ0xPU0VfU1lTVEVNX0RJQUxPR1N9LAorICAgICAqIHtAbGluayAjRkxBR19JTU1FUlNJVkV9LCB7QGxpbmsgI0ZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUR9CiAgICAgICovCiAgICAgcHVibGljIGludCBmbGFnczsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BcHBsaWNhdGlvbkluZm8uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vQXBwbGljYXRpb25JbmZvLmphdmEKaW5kZXggYjFlZjBkYi4uYmE3NGQ5YiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BcHBsaWNhdGlvbkluZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FwcGxpY2F0aW9uSW5mby5qYXZhCkBAIC0yNjksNyArMjY5LDYgQEAKICAgICAgKiBpbmNyZWFzZWQgaW4gc2l6ZSBmb3IgZXh0cmEgbGFyZ2Ugc2NyZWVucy4gIENvcnJlc3BvbmRzIHRvCiAgICAgICoge0BsaW5rIGFuZHJvaWQuUi5zdHlsZWFibGUjQW5kcm9pZE1hbmlmZXN0U3VwcG9ydHNTY3JlZW5zX3hsYXJnZVNjcmVlbnMKICAgICAgKiBhbmRyb2lkOnhsYXJnZVNjcmVlbnN9LgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TVVBQT1JUU19YTEFSR0VfU0NSRUVOUyA9IDE8PDE5OwogICAgIApAQCAtMzEyLDcgKzMxMSw3IEBACiAgICAgICoge0BsaW5rICNGTEFHX0FMTE9XX0NMRUFSX1VTRVJfREFUQX0sIHtAbGluayAjRkxBR19VUERBVEVEX1NZU1RFTV9BUFB9LAogICAgICAqIHtAbGluayAjRkxBR19URVNUX09OTFl9LCB7QGxpbmsgI0ZMQUdfU1VQUE9SVFNfU01BTExfU0NSRUVOU30sCiAgICAgICoge0BsaW5rICNGTEFHX1NVUFBPUlRTX05PUk1BTF9TQ1JFRU5TfSwKLSAgICAgKiB7QGxpbmsgI0ZMQUdfU1VQUE9SVFNfTEFSR0VfU0NSRUVOU30sCisgICAgICoge0BsaW5rICNGTEFHX1NVUFBPUlRTX0xBUkdFX1NDUkVFTlN9LCB7QGxpbmsgI0ZMQUdfU1VQUE9SVFNfWExBUkdFX1NDUkVFTlN9LAogICAgICAqIHtAbGluayAjRkxBR19SRVNJWkVBQkxFX0ZPUl9TQ1JFRU5TfSwKICAgICAgKiB7QGxpbmsgI0ZMQUdfU1VQUE9SVFNfU0NSRUVOX0RFTlNJVElFU30sIHtAbGluayAjRkxBR19WTV9TQUZFX01PREV9CiAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlci5qYXZhCmluZGV4IDg5ODM5Y2UuLjZjYmM5YjUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZVBhcnNlci5qYXZhCkBAIC0xNiw5ICsxNiw2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5jb250ZW50LnBtOwogCi1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwotCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwpAQCAtMzAsMTQgKzI3LDE0IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhdHRlcm5NYXRjaGVyOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOwotCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5YbWxVdGlsczsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtNDksNyArNDYsNiBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwogaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKIApAQCAtMTI1NCw3ICsxMjUwLDggQEAKICAgICAgICAgICAgICAgICAiPHBlcm1pc3Npb24tZ3JvdXA+Iiwgc2EsCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0UGVybWlzc2lvbkdyb3VwX25hbWUsCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0UGVybWlzc2lvbkdyb3VwX2xhYmVsLAotICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25Hcm91cF9pY29uLCAwKSkgeworICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25Hcm91cF9pY29uLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25Hcm91cF9sb2dvKSkgewogICAgICAgICAgICAgc2EucmVjeWNsZSgpOwogICAgICAgICAgICAgbVBhcnNlRXJyb3IgPSBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX1BBUlNFX0ZBSUxFRF9NQU5JRkVTVF9NQUxGT1JNRUQ7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTEyODksNyArMTI4Niw4IEBACiAgICAgICAgICAgICAgICAgIjxwZXJtaXNzaW9uPiIsIHNhLAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25fbmFtZSwKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uX2xhYmVsLAotICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25faWNvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uX2ljb24sCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0UGVybWlzc2lvbl9sb2dvKSkgewogICAgICAgICAgICAgc2EucmVjeWNsZSgpOwogICAgICAgICAgICAgbVBhcnNlRXJyb3IgPSBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX1BBUlNFX0ZBSUxFRF9NQU5JRkVTVF9NQUxGT1JNRUQ7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTEzNDIsNyArMTM0MCw4IEBACiAgICAgICAgICAgICAgICAgIjxwZXJtaXNzaW9uLXRyZWU+Iiwgc2EsCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0UGVybWlzc2lvblRyZWVfbmFtZSwKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uVHJlZV9sYWJlbCwKLSAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RQZXJtaXNzaW9uVHJlZV9pY29uLCAwKSkgeworICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFBlcm1pc3Npb25UcmVlX2ljb24sCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0UGVybWlzc2lvblRyZWVfbG9nbykpIHsKICAgICAgICAgICAgIHNhLnJlY3ljbGUoKTsKICAgICAgICAgICAgIG1QYXJzZUVycm9yID0gUGFja2FnZU1hbmFnZXIuSU5TVEFMTF9QQVJTRV9GQUlMRURfTUFOSUZFU1RfTUFMRk9STUVEOwogICAgICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0xMzg2LDcgKzEzODUsOCBAQAogICAgICAgICAgICAgbVBhcnNlSW5zdHJ1bWVudGF0aW9uQXJncyA9IG5ldyBQYXJzZVBhY2thZ2VJdGVtQXJncyhvd25lciwgb3V0RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEluc3RydW1lbnRhdGlvbl9uYW1lLAogICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RJbnN0cnVtZW50YXRpb25fbGFiZWwsCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEluc3RydW1lbnRhdGlvbl9pY29uLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0SW5zdHJ1bWVudGF0aW9uX2ljb24sCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEluc3RydW1lbnRhdGlvbl9sb2dvKTsKICAgICAgICAgICAgIG1QYXJzZUluc3RydW1lbnRhdGlvbkFyZ3MudGFnID0gIjxpbnN0cnVtZW50YXRpb24+IjsKICAgICAgICAgfQogICAgICAgICAKQEAgLTE0OTYsMTAgKzE0OTYsMTggQEAKICAgICAgICAgICAgIGFpLm5vbkxvY2FsaXplZExhYmVsID0gdi5jb2VyY2VUb1N0cmluZygpOwogICAgICAgICB9CiAKKyAgICAgICAgaW50IGRlZmF1bHRUaGVtZSA9IDA7CisgICAgICAgIGlmIChvd25lci5hcHBsaWNhdGlvbkluZm8udGFyZ2V0U2RrVmVyc2lvbiA+PSBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMuSE9ORVlDT01CKSB7CisgICAgICAgICAgICAvLyBBcyBvZiBob25leWNvbWIsIHRoZSBkZWZhdWx0IGFwcGxpY2F0aW9uIHRoZW1lIGlzIGhvbG9ncmFwaGljLgorICAgICAgICAgICAgZGVmYXVsdFRoZW1lID0gYW5kcm9pZC5SLnN0eWxlLlRoZW1lX0hvbG87CisgICAgICAgIH0KKwogICAgICAgICBhaS5pY29uID0gc2EuZ2V0UmVzb3VyY2VJZCgKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBcHBsaWNhdGlvbl9pY29uLCAwKTsKKyAgICAgICAgYWkubG9nbyA9IHNhLmdldFJlc291cmNlSWQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25fbG9nbywgMCk7CiAgICAgICAgIGFpLnRoZW1lID0gc2EuZ2V0UmVzb3VyY2VJZCgKLSAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBcHBsaWNhdGlvbl90aGVtZSwgMCk7CisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25fdGhlbWUsIGRlZmF1bHRUaGVtZSk7CiAgICAgICAgIGFpLmRlc2NyaXB0aW9uUmVzID0gc2EuZ2V0UmVzb3VyY2VJZCgKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBcHBsaWNhdGlvbl9kZXNjcmlwdGlvbiwgMCk7CiAKQEAgLTE1MzEsNiArMTUzOSwxMCBAQAogICAgICAgICAgICAgYWkuZmxhZ3MgfD0gQXBwbGljYXRpb25JbmZvLkZMQUdfVk1fU0FGRV9NT0RFOwogICAgICAgICB9CiAKKyAgICAgICAgYm9vbGVhbiBoYXJkd2FyZUFjY2VsZXJhdGVkID0gc2EuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBcHBsaWNhdGlvbl9oYXJkd2FyZUFjY2VsZXJhdGVkLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKwogICAgICAgICBpZiAoc2EuZ2V0Qm9vbGVhbigKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBcHBsaWNhdGlvbl9oYXNDb2RlLAogICAgICAgICAgICAgICAgIHRydWUpKSB7CkBAIC0xNjMwLDcgKzE2NDIsOCBAQAogCiAgICAgICAgICAgICBTdHJpbmcgdGFnTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CiAgICAgICAgICAgICBpZiAodGFnTmFtZS5lcXVhbHMoImFjdGl2aXR5IikpIHsKLSAgICAgICAgICAgICAgICBBY3Rpdml0eSBhID0gcGFyc2VBY3Rpdml0eShvd25lciwgcmVzLCBwYXJzZXIsIGF0dHJzLCBmbGFncywgb3V0RXJyb3IsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBBY3Rpdml0eSBhID0gcGFyc2VBY3Rpdml0eShvd25lciwgcmVzLCBwYXJzZXIsIGF0dHJzLCBmbGFncywgb3V0RXJyb3IsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmVBY2NlbGVyYXRlZCk7CiAgICAgICAgICAgICAgICAgaWYgKGEgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBtUGFyc2VFcnJvciA9IFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfUEFSU0VfRkFJTEVEX01BTklGRVNUX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTYzOSw3ICsxNjUyLDcgQEAKICAgICAgICAgICAgICAgICBvd25lci5hY3Rpdml0aWVzLmFkZChhKTsKIAogICAgICAgICAgICAgfSBlbHNlIGlmICh0YWdOYW1lLmVxdWFscygicmVjZWl2ZXIiKSkgewotICAgICAgICAgICAgICAgIEFjdGl2aXR5IGEgPSBwYXJzZUFjdGl2aXR5KG93bmVyLCByZXMsIHBhcnNlciwgYXR0cnMsIGZsYWdzLCBvdXRFcnJvciwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgQWN0aXZpdHkgYSA9IHBhcnNlQWN0aXZpdHkob3duZXIsIHJlcywgcGFyc2VyLCBhdHRycywgZmxhZ3MsIG91dEVycm9yLCB0cnVlLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgaWYgKGEgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBtUGFyc2VFcnJvciA9IFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfUEFSU0VfRkFJTEVEX01BTklGRVNUX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTc2Miw2ICsxNzc1LDExIEBACiAgICAgICAgICAgICBvdXRJbmZvLm5vbkxvY2FsaXplZExhYmVsID0gbnVsbDsKICAgICAgICAgfQogICAgICAgICAKKyAgICAgICAgaW50IGxvZ29WYWwgPSBzYS5nZXRSZXNvdXJjZUlkKGxvZ29SZXMsIDApOworICAgICAgICBpZiAobG9nb1ZhbCAhPSAwKSB7CisgICAgICAgICAgICBvdXRJbmZvLmxvZ28gPSBsb2dvVmFsOworICAgICAgICB9CisKICAgICAgICAgVHlwZWRWYWx1ZSB2ID0gc2EucGVla1ZhbHVlKGxhYmVsUmVzKTsKICAgICAgICAgaWYgKHYgIT0gbnVsbCAmJiAob3V0SW5mby5sYWJlbFJlcz12LnJlc291cmNlSWQpID09IDApIHsKICAgICAgICAgICAgIG91dEluZm8ubm9uTG9jYWxpemVkTGFiZWwgPSB2LmNvZXJjZVRvU3RyaW5nKCk7CkBAIC0xNzc0LDcgKzE3OTIsOCBAQAogCiAgICAgcHJpdmF0ZSBBY3Rpdml0eSBwYXJzZUFjdGl2aXR5KFBhY2thZ2Ugb3duZXIsIFJlc291cmNlcyByZXMsCiAgICAgICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZmxhZ3MsIFN0cmluZ1tdIG91dEVycm9yLAotICAgICAgICAgICAgYm9vbGVhbiByZWNlaXZlcikgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVjZWl2ZXIsIGJvb2xlYW4gaGFyZHdhcmVBY2NlbGVyYXRlZCkKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFR5cGVkQXJyYXkgc2EgPSByZXMub2J0YWluQXR0cmlidXRlcyhhdHRycywKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBY3Rpdml0eSk7CiAKQEAgLTE3ODIsNyArMTgwMSw4IEBACiAgICAgICAgICAgICBtUGFyc2VBY3Rpdml0eUFyZ3MgPSBuZXcgUGFyc2VDb21wb25lbnRBcmdzKG93bmVyLCBvdXRFcnJvciwKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfbGFiZWwsCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2ljb24sIDAsCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2ljb24sCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2xvZ28sCiAgICAgICAgICAgICAgICAgICAgIG1TZXBhcmF0ZVByb2Nlc3NlcywKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfcHJvY2VzcywKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfZGVzY3JpcHRpb24sCkBAIC0xODc4LDcgKzE4OTgsMTkgQEAKICAgICAgICAgICAgIGEuaW5mby5mbGFncyB8PSBBY3Rpdml0eUluZm8uRkxBR19GSU5JU0hfT05fQ0xPU0VfU1lTVEVNX0RJQUxPR1M7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoc2EuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBY3Rpdml0eV9pbW1lcnNpdmUsCisgICAgICAgICAgICAgICAgZmFsc2UpKSB7CisgICAgICAgICAgICBhLmluZm8uZmxhZ3MgfD0gQWN0aXZpdHlJbmZvLkZMQUdfSU1NRVJTSVZFOworICAgICAgICB9CisgICAgICAgIAogICAgICAgICBpZiAoIXJlY2VpdmVyKSB7CisgICAgICAgICAgICBpZiAoc2EuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfaGFyZHdhcmVBY2NlbGVyYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmVBY2NlbGVyYXRlZCkpIHsKKyAgICAgICAgICAgICAgICBhLmluZm8uZmxhZ3MgfD0gQWN0aXZpdHlJbmZvLkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGEuaW5mby5sYXVuY2hNb2RlID0gc2EuZ2V0SW50KAogICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBY3Rpdml0eV9sYXVuY2hNb2RlLAogICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eUluZm8uTEFVTkNIX01VTFRJUExFKTsKQEAgLTE5OTIsNyArMjAyNCw4IEBACiAgICAgICAgICAgICBtUGFyc2VBY3Rpdml0eUFsaWFzQXJncyA9IG5ldyBQYXJzZUNvbXBvbmVudEFyZ3Mob3duZXIsIG91dEVycm9yLAogICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBY3Rpdml0eUFsaWFzX25hbWUsCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5QWxpYXNfbGFiZWwsCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5QWxpYXNfaWNvbiwgMCwKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlBbGlhc19pY29uLAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RBY3Rpdml0eUFsaWFzX2xvZ28sCiAgICAgICAgICAgICAgICAgICAgIG1TZXBhcmF0ZVByb2Nlc3NlcywKICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlBbGlhc19kZXNjcmlwdGlvbiwKQEAgLTIxMjAsNyArMjE1Myw4IEBACiAgICAgICAgICAgICBtUGFyc2VQcm92aWRlckFyZ3MgPSBuZXcgUGFyc2VDb21wb25lbnRBcmdzKG93bmVyLCBvdXRFcnJvciwKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0UHJvdmlkZXJfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0UHJvdmlkZXJfbGFiZWwsCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFByb3ZpZGVyX2ljb24sIDAsCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFByb3ZpZGVyX2ljb24sCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFByb3ZpZGVyX2xvZ28sCiAgICAgICAgICAgICAgICAgICAgIG1TZXBhcmF0ZVByb2Nlc3NlcywKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0UHJvdmlkZXJfcHJvY2VzcywKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0UHJvdmlkZXJfZGVzY3JpcHRpb24sCkBAIC0yMzkyLDcgKzI0MjYsOCBAQAogICAgICAgICAgICAgbVBhcnNlU2VydmljZUFyZ3MgPSBuZXcgUGFyc2VDb21wb25lbnRBcmdzKG93bmVyLCBvdXRFcnJvciwKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0U2VydmljZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RTZXJ2aWNlX2xhYmVsLAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RTZXJ2aWNlX2ljb24sIDAsCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFNlcnZpY2VfaWNvbiwKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0U2VydmljZV9sb2dvLAogICAgICAgICAgICAgICAgICAgICBtU2VwYXJhdGVQcm9jZXNzZXMsCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdFNlcnZpY2VfcHJvY2VzcywKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0U2VydmljZV9kZXNjcmlwdGlvbiwKQEAgLTI2MDYsNiArMjY0MSw5IEBACiAgICAgICAgIG91dEluZm8uaWNvbiA9IHNhLmdldFJlc291cmNlSWQoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0SW50ZW50RmlsdGVyX2ljb24sIDApOwogICAgICAgICAKKyAgICAgICAgb3V0SW5mby5sb2dvID0gc2EuZ2V0UmVzb3VyY2VJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RJbnRlbnRGaWx0ZXJfbG9nbywgMCk7CisKICAgICAgICAgc2EucmVjeWNsZSgpOwogCiAgICAgICAgIGludCBvdXRlckRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CkBAIC0yODczLDYgKzI5MTEsMTEgQEAKICAgICAgICAgICAgICAgICBvdXRJbmZvLm5vbkxvY2FsaXplZExhYmVsID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IGxvZ29WYWwgPSBhcmdzLnNhLmdldFJlc291cmNlSWQoYXJncy5sb2dvUmVzLCAwKTsKKyAgICAgICAgICAgIGlmIChsb2dvVmFsICE9IDApIHsKKyAgICAgICAgICAgICAgICBvdXRJbmZvLmxvZ28gPSBsb2dvVmFsOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBUeXBlZFZhbHVlIHYgPSBhcmdzLnNhLnBlZWtWYWx1ZShhcmdzLmxhYmVsUmVzKTsKICAgICAgICAgICAgIGlmICh2ICE9IG51bGwgJiYgKG91dEluZm8ubGFiZWxSZXM9di5yZXNvdXJjZUlkKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgb3V0SW5mby5ub25Mb2NhbGl6ZWRMYWJlbCA9IHYuY29lcmNlVG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0Fzc2V0RmlsZURlc2NyaXB0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0Fzc2V0RmlsZURlc2NyaXB0b3IuamF2YQppbmRleCBhMzdlNGU4Li4wMWFlMWRhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Bc3NldEZpbGVEZXNjcmlwdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQXNzZXRGaWxlRGVzY3JpcHRvci5qYXZhCkBAIC0yNSw4ICsyNSw2IEBACiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKIAogLyoqCiAgKiBGaWxlIGRlc2NyaXB0b3Igb2YgYW4gZW50cnkgaW4gdGhlIEFzc2V0TWFuYWdlci4gIFRoaXMgcHJvdmlkZXMgeW91ciBvd24KQEAgLTUxLDcgKzQ5LDcgQEAKICAgICAgKiBAcGFyYW0gc3RhcnRPZmZzZXQgVGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgZmlsZSB0aGF0IHRoZSBhc3NldCBzdGFydHMuCiAgICAgICogVGhpcyBtdXN0IGJlIDAgaWYgbGVuZ3RoIGlzIFVOS05PV05fTEVOR1RILgogICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBieXRlcyBvZiB0aGUgYXNzZXQsIG9yCi0gICAgICoge0BsaW5rICNVTktOT1dOX0xFTkdUSCBpZiBpdCBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUuCisgICAgICoge0BsaW5rICNVTktOT1dOX0xFTkdUSH0gaWYgaXQgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLgogICAgICAqLwogICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yKFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkLCBsb25nIHN0YXJ0T2Zmc2V0LAogICAgICAgICAgICAgbG9uZyBsZW5ndGgpIHsKQEAgLTEyNSwxMyArMTIzLDYgQEAKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIG1GZC5jbG9zZSgpOwogICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGlzIGZpbGUgZGVzY3JpcHRvciBpcyBmb3IgYSBtZW1vcnkgZmlsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNZW1vcnlGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIE1lbW9yeUZpbGUuaXNNZW1vcnlGaWxlKG1GZC5nZXRGaWxlRGVzY3JpcHRvcigpKTsKLSAgICB9CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBhdXRvLWNsb3NlIGlucHV0IHN0cmVhbSBmb3IgdGhpcyBhc3NldC4gIFRoaXMKQEAgLTE0MiwxMiArMTMzLDYgQEAKICAgICAgKiBzaG91bGQgb25seSBjYWxsIHRoaXMgb25jZSBmb3IgYSBwYXJ0aWN1bGFyIGFzc2V0LgogICAgICAqLwogICAgIHB1YmxpYyBGaWxlSW5wdXRTdHJlYW0gY3JlYXRlSW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoaXNNZW1vcnlGaWxlKCkpIHsKLSAgICAgICAgICAgIGlmIChtTGVuZ3RoID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZpbGUgbGVuZ3RoIHRvbyBsYXJnZSBmb3IgYSBtZW1vcnkgZmlsZTogIiArIG1MZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRvQ2xvc2VNZW1vcnlGaWxlSW5wdXRTdHJlYW0obUZkLCAoaW50KW1MZW5ndGgpOwotICAgICAgICB9CiAgICAgICAgIGlmIChtTGVuZ3RoIDwgMCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvci5BdXRvQ2xvc2VJbnB1dFN0cmVhbShtRmQpOwogICAgICAgICB9CkBAIC0yNzYsNjYgKzI2MSw2IEBACiAgICAgICAgICAgICBzdXBlci5yZXNldCgpOwogICAgICAgICB9CiAgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFuIGlucHV0IHN0cmVhbSB0aGF0IHJlYWRzIGZyb20gYSBNZW1vcnlGaWxlIGFuZCBjbG9zZXMgaXQgd2hlbiB0aGUgc3RyZWFtIGlzIGNsb3NlZC4KLSAgICAgKiBUaGlzIGV4dGVuZHMgRmlsZUlucHV0U3RyZWFtIGp1c3QgYmVjYXVzZSB7QGxpbmsgI2NyZWF0ZUlucHV0U3RyZWFtfSByZXR1cm5zCi0gICAgICogYSBGaWxlSW5wdXRTdHJlYW0uIEFsbCB0aGUgRmlsZUlucHV0U3RyZWFtIG1ldGhvZHMgYXJlCi0gICAgICogb3ZlcnJpZGRlbiB0byB1c2UgdGhlIE1lbW9yeUZpbGUgaW5zdGVhZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBdXRvQ2xvc2VNZW1vcnlGaWxlSW5wdXRTdHJlYW0gZXh0ZW5kcyBGaWxlSW5wdXRTdHJlYW0gewotICAgICAgICBwcml2YXRlIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG1QYXJjZWxGZDsKLSAgICAgICAgcHJpdmF0ZSBNZW1vcnlGaWxlIG1GaWxlOwotICAgICAgICBwcml2YXRlIElucHV0U3RyZWFtIG1TdHJlYW07Ci0KLSAgICAgICAgcHVibGljIEF1dG9DbG9zZU1lbW9yeUZpbGVJbnB1dFN0cmVhbShQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCwgaW50IGxlbmd0aCkKLSAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgc3VwZXIoZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgICAgICBtUGFyY2VsRmQgPSBmZDsKLSAgICAgICAgICAgIG1GaWxlID0gbmV3IE1lbW9yeUZpbGUoZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSwgbGVuZ3RoLCAiciIpOwotICAgICAgICAgICAgbVN0cmVhbSA9IG1GaWxlLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG1TdHJlYW0uYXZhaWxhYmxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgbVBhcmNlbEZkLmNsb3NlKCk7ICAvLyBtdXN0IGNsb3NlIFBhcmNlbEZpbGVEZXNjcmlwdG9yLCBub3QganVzdCB0aGUgZmlsZSBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBpdCBjb3VsZCBiZSBhIHN1YmNsYXNzIG9mIFBhcmNlbEZpbGVEZXNjcmlwdG9yLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFLmcuIENvbnRlbnRSZXNvbHZlci5QYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyLmNsb3NlKCkgcmVsZWFzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBjb250ZW50IHByb3ZpZGVyCi0gICAgICAgICAgICBtRmlsZS5jbG9zZSgpOyAgICAgIC8vIHRvIHVubWFwIHRoZSBtZW1vcnkgZmlsZSBmcm9tIHRoZSBhZGRyZXNzIHNwYWNlLgotICAgICAgICAgICAgbVN0cmVhbS5jbG9zZSgpOyAgICAvLyBkb2Vzbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEZpbGVDaGFubmVsIGdldENoYW5uZWwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG1TdHJlYW0ucmVhZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gbVN0cmVhbS5yZWFkKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWZmZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gbVN0cmVhbS5yZWFkKGJ1ZmZlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGxvbmcgc2tpcChsb25nIGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG1TdHJlYW0uc2tpcChjb3VudCk7Ci0gICAgICAgIH0KLSAgICB9CiAKICAgICAvKioKICAgICAgKiBBbiBPdXRwdXRTdHJlYW0geW91IGNhbiBjcmVhdGUgb24gYSBQYXJjZWxGaWxlRGVzY3JpcHRvciwgd2hpY2ggd2lsbApAQCAtNDIyLDE1ICszNDcsNCBAQAogICAgICAgICB9CiAgICAgfTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gQXNzZXRGaWxlRGVzY3JpcHRvciBmcm9tIGEgbWVtb3J5IGZpbGUuCi0gICAgICoKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQXNzZXRGaWxlRGVzY3JpcHRvciBmcm9tTWVtb3J5RmlsZShNZW1vcnlGaWxlIG1lbW9yeUZpbGUpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCA9IG1lbW9yeUZpbGUuZ2V0UGFyY2VsRmlsZURlc2NyaXB0b3IoKTsKLSAgICAgICAgcmV0dXJuIG5ldyBBc3NldEZpbGVEZXNjcmlwdG9yKGZkLCAwLCBtZW1vcnlGaWxlLmxlbmd0aCgpKTsKLSAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0NvbXBhdGliaWxpdHlJbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db21wYXRpYmlsaXR5SW5mby5qYXZhCmluZGV4IGQwYmE1OTAuLjQwNmIwOTEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0NvbXBhdGliaWxpdHlJbmZvLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQ29tcGF0aWJpbGl0eUluZm8uamF2YQpAQCAtMTgsNiArMTgsNyBAQAogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50RjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWdpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwpAQCAtMzYzLDYgKzM2NCwxNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRyYW5zbGF0ZSBhIFBvaW50IGluIHNjcmVlbiBjb29yZGluYXRlcyBpbnRvIHRoZSBhcHAgd2luZG93J3MgY29vcmRpbmF0ZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCB0cmFuc2xhdGVQb2ludEluU2NyZWVuVG9BcHBXaW5kb3coUG9pbnRGIHBvaW50KSB7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZSA9IGFwcGxpY2F0aW9uSW52ZXJ0ZWRTY2FsZTsKKyAgICAgICAgICAgIGlmIChzY2FsZSAhPSAxLjBmKSB7CisgICAgICAgICAgICAgICAgcG9pbnQueCAqPSBzY2FsZTsKKyAgICAgICAgICAgICAgICBwb2ludC55ICo9IHNjYWxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFRyYW5zbGF0ZSB0aGUgbG9jYXRpb24gb2YgdGhlIHN1YiB3aW5kb3cuCiAgICAgICAgICAqIEBwYXJhbSBwYXJhbXMKICAgICAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db25maWd1cmF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db25maWd1cmF0aW9uLmphdmEKaW5kZXggNWEzZGQ0MS4uMmYxMTBmMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQ29uZmlndXJhdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0NvbmZpZ3VyYXRpb24uamF2YQpAQCAtNjIsNyArNjIsNiBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUkVFTkxBWU9VVF9TSVpFX1NNQUxMID0gMHgwMTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JFRU5MQVlPVVRfU0laRV9OT1JNQUwgPSAweDAyOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUkVFTkxBWU9VVF9TSVpFX0xBUkdFID0gMHgwMzsKLSAgICAvKiogQGhpZGUgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JFRU5MQVlPVVRfU0laRV9YTEFSR0UgPSAweDA0OwogICAgIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUkVFTkxBWU9VVF9MT05HX01BU0sgPSAweDMwOwpAQCAtODQsNyArODMsNyBAQAogICAgICAqIDxwPlRoZSB7QGxpbmsgI1NDUkVFTkxBWU9VVF9TSVpFX01BU0t9IGJpdHMgZGVmaW5lIHRoZSBvdmVyYWxsIHNpemUKICAgICAgKiBvZiB0aGUgc2NyZWVuLiAgVGhleSBtYXkgYmUgb25lIG9mCiAgICAgICoge0BsaW5rICNTQ1JFRU5MQVlPVVRfU0laRV9TTUFMTH0sIHtAbGluayAjU0NSRUVOTEFZT1VUX1NJWkVfTk9STUFMfSwKLSAgICAgKiB7QGxpbmsgI1NDUkVFTkxBWU9VVF9TSVpFX0xBUkdFfS4KKyAgICAgKiB7QGxpbmsgI1NDUkVFTkxBWU9VVF9TSVpFX0xBUkdFfSwgb3Ige0BsaW5rICNTQ1JFRU5MQVlPVVRfU0laRV9YTEFSR0V9LgogICAgICAqIAogICAgICAqIDxwPlRoZSB7QGxpbmsgI1NDUkVFTkxBWU9VVF9MT05HX01BU0t9IGRlZmluZXMgd2hldGhlciB0aGUgc2NyZWVuCiAgICAgICogaXMgd2lkZXIvdGFsbGVyIHRoYW4gbm9ybWFsLiAgVGhleSBtYXkgYmUgb25lIG9mCkBAIC0yNjcsMTEgKzI2NiwxOCBAQAogICAgICAgICBzYi5hcHBlbmQoIi8iKTsKICAgICAgICAgc2IuYXBwZW5kKG5hdmlnYXRpb25IaWRkZW4pOwogICAgICAgICBzYi5hcHBlbmQoIiBvcmllbj0iKTsKLSAgICAgICAgc2IuYXBwZW5kKG9yaWVudGF0aW9uKTsKLSAgICAgICAgc2IuYXBwZW5kKCIgbGF5b3V0PSIpOwotICAgICAgICBzYi5hcHBlbmQoc2NyZWVuTGF5b3V0KTsKLSAgICAgICAgc2IuYXBwZW5kKCIgdWlNb2RlPSIpOwotICAgICAgICBzYi5hcHBlbmQodWlNb2RlKTsKKyAgICAgICAgc3dpdGNoKG9yaWVudGF0aW9uKSB7CisgICAgICAgICAgICBjYXNlIE9SSUVOVEFUSU9OX0xBTkRTQ0FQRToKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIkwiKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9SSUVOVEFUSU9OX1BPUlRSQUlUOgorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiUCIpOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKG9yaWVudGF0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIiBsYXlvdXQ9MHgiKTsKKyAgICAgICAgc2IuYXBwZW5kKGphdmEubGFuZy5JbnRlZ2VyLnRvSGV4U3RyaW5nKHNjcmVlbkxheW91dCkpOworICAgICAgICBzYi5hcHBlbmQoIiB1aU1vZGU9MHgiKTsKKyAgICAgICAgc2IuYXBwZW5kKGphdmEubGFuZy5JbnRlZ2VyLnRvSGV4U3RyaW5nKHVpTW9kZSkpOwogICAgICAgICBpZiAoc2VxICE9IDApIHsKICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHNlcT0iKTsKICAgICAgICAgICAgIHNiLmFwcGVuZChzZXEpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUGx1cmFsUnVsZXMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL1BsdXJhbFJ1bGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkY2UzYzEuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUGx1cmFsUnVsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQucmVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoKLSAqIFl1Y2stby4gIFRoaXMgaXMgbm90IHRoZSByaWdodCB3YXkgdG8gaW1wbGVtZW50IHRoaXMuICBXaGVuIHRoZSBJQ1UgUGx1cmFsUnVsZXMKLSAqIG9iamVjdCBoYXMgYmVlbiBpbnRlZ3JhdGVkIHRvIGFuZHJvaWQsIHdlIHNob3VsZCBzd2l0Y2ggdG8gdGhhdC4gIEZvciBub3csIHl1Y2stby4KLSAqLwotCi1hYnN0cmFjdCBjbGFzcyBQbHVyYWxSdWxlcyB7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IFFVQU5USVRZX09USEVSID0gMHgwMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUVVBTlRJVFlfWkVSTyAgPSAweDAwMDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBRVUFOVElUWV9PTkUgICA9IDB4MDAwMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IFFVQU5USVRZX1RXTyAgID0gMHgwMDA0OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUVVBTlRJVFlfRkVXICAgPSAweDAwMDg7Ci0gICAgc3RhdGljIGZpbmFsIGludCBRVUFOVElUWV9NQU5ZICA9IDB4MDAxMDsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgSURfT1RIRVIgPSAweDAxMDAwMDA0OwotCi0gICAgYWJzdHJhY3QgaW50IHF1YW50aXR5Rm9yTnVtYmVyKGludCBuKTsKLQotICAgIGZpbmFsIGludCBhdHRyRm9yTnVtYmVyKGludCBuKSB7Ci0gICAgICAgIHJldHVybiBQbHVyYWxSdWxlcy5hdHRyRm9yUXVhbnRpdHkocXVhbnRpdHlGb3JOdW1iZXIobikpOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgYXR0ckZvclF1YW50aXR5KGludCBxdWFudGl0eSkgewotICAgICAgICAvLyBzZWUgaW5jbHVkZS91dGlscy9SZXNvdXJjZVR5cGVzLmgKLSAgICAgICAgc3dpdGNoIChxdWFudGl0eSkgewotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9aRVJPOiByZXR1cm4gMHgwMTAwMDAwNTsKLSAgICAgICAgICAgIGNhc2UgUVVBTlRJVFlfT05FOiAgcmV0dXJuIDB4MDEwMDAwMDY7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX1RXTzogIHJldHVybiAweDAxMDAwMDA3OwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9GRVc6ICByZXR1cm4gMHgwMTAwMDAwODsKLSAgICAgICAgICAgIGNhc2UgUVVBTlRJVFlfTUFOWTogcmV0dXJuIDB4MDEwMDAwMDk7Ci0gICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBJRF9PVEhFUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3RyaW5nRm9yUXVhbnRpdHkoaW50IHF1YW50aXR5KSB7Ci0gICAgICAgIHN3aXRjaCAocXVhbnRpdHkpIHsKLSAgICAgICAgICAgIGNhc2UgUVVBTlRJVFlfWkVSTzoKLSAgICAgICAgICAgICAgICByZXR1cm4gInplcm8iOwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9PTkU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvbmUiOwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9UV086Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0d28iOwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9GRVc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJmZXciOwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9NQU5ZOgotICAgICAgICAgICAgICAgIHJldHVybiAibWFueSI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAib3RoZXIiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIFBsdXJhbFJ1bGVzIHJ1bGVGb3JMb2NhbGUoTG9jYWxlIGxvY2FsZSkgewotICAgICAgICBTdHJpbmcgbGFuZyA9IGxvY2FsZS5nZXRMYW5ndWFnZSgpOwotICAgICAgICBpZiAoImNzIi5lcXVhbHMobGFuZykpIHsKLSAgICAgICAgICAgIGlmIChjcyA9PSBudWxsKSBjcyA9IG5ldyBjcygpOwotICAgICAgICAgICAgcmV0dXJuIGNzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKGVuID09IG51bGwpIGVuID0gbmV3IGVuKCk7Ci0gICAgICAgICAgICByZXR1cm4gZW47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBQbHVyYWxSdWxlcyBjczsKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBjcyBleHRlbmRzIFBsdXJhbFJ1bGVzIHsKLSAgICAgICAgaW50IHF1YW50aXR5Rm9yTnVtYmVyKGludCBuKSB7Ci0gICAgICAgICAgICBpZiAobiA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFFVQU5USVRZX09ORTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG4gPj0gMiAmJiBuIDw9IDQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUVVBTlRJVFlfRkVXOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFFVQU5USVRZX09USEVSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUGx1cmFsUnVsZXMgZW47Ci0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgZW4gZXh0ZW5kcyBQbHVyYWxSdWxlcyB7Ci0gICAgICAgIGludCBxdWFudGl0eUZvck51bWJlcihpbnQgbikgewotICAgICAgICAgICAgaWYgKG4gPT0gMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBRVUFOVElUWV9PTkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUVVBTlRJVFlfT1RIRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEKaW5kZXggYTY1MTNhYS4uOWIyM2MxZSAxMDA3NTUKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQucmVzOwogCi0KIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlhtbFV0aWxzOwogCiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKQEAgLTQyLDYgKzQxLDggQEAKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAoraW1wb3J0IGxpYmNvcmUuaWN1Lk5hdGl2ZVBsdXJhbFJ1bGVzOworCiAvKioKICAqIENsYXNzIGZvciBhY2Nlc3NpbmcgYW4gYXBwbGljYXRpb24ncyByZXNvdXJjZXMuICBUaGlzIHNpdHMgb24gdG9wIG9mIHRoZQogICogYXNzZXQgbWFuYWdlciBvZiB0aGUgYXBwbGljYXRpb24gKGFjY2Vzc2libGUgdGhyb3VnaCBnZXRBc3NldHMoKSkgYW5kCkBAIC01Myw2ICs1NCw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19DT05GSUcgPSBmYWxzZTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFRSQUNFX0ZPUl9QUkVMT0FEID0gZmFsc2U7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfT1RIRVIgPSAweDAxMDAwMDA0OworCiAgICAgLy8gVXNlIHRoZSBjdXJyZW50IFNESyB2ZXJzaW9uIGNvZGUuICBJZiB3ZSBhcmUgYSBkZXZlbG9wbWVudCBidWlsZCwKICAgICAvLyBhbHNvIGFsbG93IHRoZSBwcmV2aW91cyBTREsgdmVyc2lvbiArIDEuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHNTZGtWZXJzaW9uID0gQnVpbGQuVkVSU0lPTi5TREtfSU5UCkBAIC05MSw3ICs5NCw3IEBACiAgICAgLypwYWNrYWdlKi8gZmluYWwgQXNzZXRNYW5hZ2VyIG1Bc3NldHM7CiAgICAgcHJpdmF0ZSBmaW5hbCBDb25maWd1cmF0aW9uIG1Db25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKICAgICAvKnBhY2thZ2UqLyBmaW5hbCBEaXNwbGF5TWV0cmljcyBtTWV0cmljcyA9IG5ldyBEaXNwbGF5TWV0cmljcygpOwotICAgIFBsdXJhbFJ1bGVzIG1QbHVyYWxSdWxlOworICAgIHByaXZhdGUgTmF0aXZlUGx1cmFsUnVsZXMgbVBsdXJhbFJ1bGU7CiAgICAgCiAgICAgcHJpdmF0ZSBDb21wYXRpYmlsaXR5SW5mbyBtQ29tcGF0aWJpbGl0eUluZm87CiAgICAgcHJpdmF0ZSBEaXNwbGF5IG1EZWZhdWx0RGlzcGxheTsKQEAgLTIwOCw5ICsyMTEsMTcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHJlc291cmNlIElEIGZvciBhIHBhcnRpY3VsYXIKKyAgICAgKiBudW1lcmljYWwgcXVhbnRpdHkuCisgICAgICoKKyAgICAgKiA8cD5TZWUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9yZXNvdXJjZXMvc3RyaW5nLXJlc291cmNlLmh0bWwjUGx1cmFscyI+U3RyaW5nCisgICAgICogUmVzb3VyY2VzPC9hPiBmb3IgbW9yZSBvbiBxdWFudGl0eSBzdHJpbmdzLgorICAgICAqCiAgICAgICogQHBhcmFtIGlkIFRoZSBkZXNpcmVkIHJlc291cmNlIGlkZW50aWZpZXIsIGFzIGdlbmVyYXRlZCBieSB0aGUgYWFwdAogICAgICAqICAgICAgICAgICB0b29sLiBUaGlzIGludGVnZXIgZW5jb2RlcyB0aGUgcGFja2FnZSwgdHlwZSwgYW5kIHJlc291cmNlCiAgICAgICogICAgICAgICAgIGVudHJ5LiBUaGUgdmFsdWUgMCBpcyBhbiBpbnZhbGlkIGlkZW50aWZpZXIuCisgICAgICogQHBhcmFtIHF1YW50aXR5IFRoZSBudW1iZXIgdXNlZCB0byBnZXQgdGhlIGNvcnJlY3Qgc3RyaW5nIGZvciB0aGUgY3VycmVudCBsYW5ndWFnZSdzCisgICAgICogICAgICAgICAgIHBsdXJhbCBydWxlcy4KICAgICAgKgogICAgICAqIEB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24gVGhyb3dzIE5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBJRCBkb2VzIG5vdCBleGlzdC4KICAgICAgKgpAQCAtMjE4LDI5ICsyMjksNTIgQEAKICAgICAgKiAgICAgICAgIHBvc3NpYmx5IHN0eWxlZCB0ZXh0IGluZm9ybWF0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0UXVhbnRpdHlUZXh0KGludCBpZCwgaW50IHF1YW50aXR5KSB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBQbHVyYWxSdWxlcyBydWxlID0gZ2V0UGx1cmFsUnVsZSgpOwotICAgICAgICBDaGFyU2VxdWVuY2UgcmVzID0gbUFzc2V0cy5nZXRSZXNvdXJjZUJhZ1RleHQoaWQsIHJ1bGUuYXR0ckZvck51bWJlcihxdWFudGl0eSkpOworICAgICAgICBOYXRpdmVQbHVyYWxSdWxlcyBydWxlID0gZ2V0UGx1cmFsUnVsZSgpOworICAgICAgICBDaGFyU2VxdWVuY2UgcmVzID0gbUFzc2V0cy5nZXRSZXNvdXJjZUJhZ1RleHQoaWQsCisgICAgICAgICAgICAgICAgYXR0ckZvclF1YW50aXR5Q29kZShydWxlLnF1YW50aXR5Rm9ySW50KHF1YW50aXR5KSkpOwogICAgICAgICBpZiAocmVzICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KLSAgICAgICAgcmVzID0gbUFzc2V0cy5nZXRSZXNvdXJjZUJhZ1RleHQoaWQsIFBsdXJhbFJ1bGVzLklEX09USEVSKTsKKyAgICAgICAgcmVzID0gbUFzc2V0cy5nZXRSZXNvdXJjZUJhZ1RleHQoaWQsIElEX09USEVSKTsKICAgICAgICAgaWYgKHJlcyAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbigiUGx1cmFsIHJlc291cmNlIElEICMweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGlkKQogICAgICAgICAgICAgICAgICsgIiBxdWFudGl0eT0iICsgcXVhbnRpdHkKLSAgICAgICAgICAgICAgICArICIgaXRlbT0iICsgUGx1cmFsUnVsZXMuc3RyaW5nRm9yUXVhbnRpdHkocnVsZS5xdWFudGl0eUZvck51bWJlcihxdWFudGl0eSkpKTsKKyAgICAgICAgICAgICAgICArICIgaXRlbT0iICsgc3RyaW5nRm9yUXVhbnRpdHlDb2RlKHJ1bGUucXVhbnRpdHlGb3JJbnQocXVhbnRpdHkpKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBQbHVyYWxSdWxlcyBnZXRQbHVyYWxSdWxlKCkgeworICAgIHByaXZhdGUgTmF0aXZlUGx1cmFsUnVsZXMgZ2V0UGx1cmFsUnVsZSgpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewogICAgICAgICAgICAgaWYgKG1QbHVyYWxSdWxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUGx1cmFsUnVsZSA9IFBsdXJhbFJ1bGVzLnJ1bGVGb3JMb2NhbGUobUNvbmZpZ3VyYXRpb24ubG9jYWxlKTsKKyAgICAgICAgICAgICAgICBtUGx1cmFsUnVsZSA9IE5hdGl2ZVBsdXJhbFJ1bGVzLmZvckxvY2FsZShtQ29uZmlndXJhdGlvbi5sb2NhbGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG1QbHVyYWxSdWxlOwogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGF0dHJGb3JRdWFudGl0eUNvZGUoaW50IHF1YW50aXR5Q29kZSkgeworICAgICAgICBzd2l0Y2ggKHF1YW50aXR5Q29kZSkgeworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5aRVJPOiByZXR1cm4gMHgwMTAwMDAwNTsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlUGx1cmFsUnVsZXMuT05FOiAgcmV0dXJuIDB4MDEwMDAwMDY7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLlRXTzogIHJldHVybiAweDAxMDAwMDA3OworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5GRVc6ICByZXR1cm4gMHgwMTAwMDAwODsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlUGx1cmFsUnVsZXMuTUFOWTogcmV0dXJuIDB4MDEwMDAwMDk7CisgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJRF9PVEhFUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzdHJpbmdGb3JRdWFudGl0eUNvZGUoaW50IHF1YW50aXR5Q29kZSkgeworICAgICAgICBzd2l0Y2ggKHF1YW50aXR5Q29kZSkgeworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5aRVJPOiByZXR1cm4gInplcm8iOworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5PTkU6ICByZXR1cm4gIm9uZSI7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLlRXTzogIHJldHVybiAidHdvIjsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlUGx1cmFsUnVsZXMuRkVXOiAgcmV0dXJuICJmZXciOworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5NQU5ZOiByZXR1cm4gIm1hbnkiOworICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm90aGVyIjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgc3RyaW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgcmVzb3VyY2UgSUQuICBJdAogICAgICAqIHdpbGwgYmUgc3RyaXBwZWQgb2YgYW55IHN0eWxlZCB0ZXh0IGluZm9ybWF0aW9uLgpAQCAtMjk1LDYgKzMyOSw5IEBACiAgICAgICogc3RyaXBwZWQgb2YgYW55IHN0eWxlZCB0ZXh0IGluZm9ybWF0aW9uLgogICAgICAqIHtAbW9yZX0KICAgICAgKgorICAgICAqIDxwPlNlZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Jlc291cmNlcy9zdHJpbmctcmVzb3VyY2UuaHRtbCNQbHVyYWxzIj5TdHJpbmcKKyAgICAgKiBSZXNvdXJjZXM8L2E+IGZvciBtb3JlIG9uIHF1YW50aXR5IHN0cmluZ3MuCisgICAgICoKICAgICAgKiBAcGFyYW0gaWQgVGhlIGRlc2lyZWQgcmVzb3VyY2UgaWRlbnRpZmllciwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBhYXB0CiAgICAgICogICAgICAgICAgIHRvb2wuIFRoaXMgaW50ZWdlciBlbmNvZGVzIHRoZSBwYWNrYWdlLCB0eXBlLCBhbmQgcmVzb3VyY2UKICAgICAgKiAgICAgICAgICAgZW50cnkuIFRoZSB2YWx1ZSAwIGlzIGFuIGludmFsaWQgaWRlbnRpZmllci4KQEAgLTMxNyw2ICszNTQsOSBAQAogICAgICAqIFJldHVybiB0aGUgc3RyaW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgcmVzb3VyY2UgSUQgZm9yIGEgcGFydGljdWxhcgogICAgICAqIG51bWVyaWNhbCBxdWFudGl0eS4KICAgICAgKgorICAgICAqIDxwPlNlZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Jlc291cmNlcy9zdHJpbmctcmVzb3VyY2UuaHRtbCNQbHVyYWxzIj5TdHJpbmcKKyAgICAgKiBSZXNvdXJjZXM8L2E+IGZvciBtb3JlIG9uIHF1YW50aXR5IHN0cmluZ3MuCisgICAgICoKICAgICAgKiBAcGFyYW0gaWQgVGhlIGRlc2lyZWQgcmVzb3VyY2UgaWRlbnRpZmllciwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBhYXB0CiAgICAgICogICAgICAgICAgIHRvb2wuIFRoaXMgaW50ZWdlciBlbmNvZGVzIHRoZSBwYWNrYWdlLCB0eXBlLCBhbmQgcmVzb3VyY2UKICAgICAgKiAgICAgICAgICAgZW50cnkuIFRoZSB2YWx1ZSAwIGlzIGFuIGludmFsaWQgaWRlbnRpZmllci4KQEAgLTEzMTUsNyArMTM1NSw3IEBACiAgICAgICAgIH0KICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewogICAgICAgICAgICAgaWYgKG1QbHVyYWxSdWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUGx1cmFsUnVsZSA9IFBsdXJhbFJ1bGVzLnJ1bGVGb3JMb2NhbGUoY29uZmlnLmxvY2FsZSk7CisgICAgICAgICAgICAgICAgbVBsdXJhbFJ1bGUgPSBOYXRpdmVQbHVyYWxSdWxlcy5mb3JMb2NhbGUoY29uZmlnLmxvY2FsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTE5LDcgKzE1NTksNyBAQAogICAgIC8qKgogICAgICAqIFBhcnNlIGEgc2VyaWVzIG9mIHtAbGluayBhbmRyb2lkLlIuc3R5bGVhYmxlI0V4dHJhICZsdDtleHRyYSZndDt9IHRhZ3MgZnJvbQogICAgICAqIGFuIFhNTCBmaWxlLiAgWW91IGNhbGwgdGhpcyB3aGVuIHlvdSBhcmUgYXQgdGhlIHBhcmVudCB0YWcgb2YgdGhlCi0gICAgICogZXh0cmEgdGFncywgYW5kIGl0IHJldHVybiBvbmNlIGFsbCBvZiB0aGUgY2hpbGQgdGFncyBoYXZlIGJlZW4gcGFyc2VkLgorICAgICAqIGV4dHJhIHRhZ3MsIGFuZCBpdCB3aWxsIHJldHVybiBvbmNlIGFsbCBvZiB0aGUgY2hpbGQgdGFncyBoYXZlIGJlZW4gcGFyc2VkLgogICAgICAqIFRoaXMgd2lsbCBjYWxsIHtAbGluayAjcGFyc2VCdW5kbGVFeHRyYX0gZm9yIGVhY2ggZXh0cmEgdGFnIGVuY291bnRlcmVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJzZXIgVGhlIHBhcnNlciBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBleHRyYXMuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdEN1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RDdXJzb3IuamF2YQppbmRleCBhNWU1ZTQ2Li5iZmFlYjgyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdEN1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0Q3Vyc29yLmphdmEKQEAgLTE4LDE2ICsxOCwxMSBAQAogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC01Niw2ICs1MSwxMCBAQAogICAgIGFic3RyYWN0IHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKGludCBjb2x1bW4pOwogICAgIGFic3RyYWN0IHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uKTsKIAorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKwogICAgIC8vIFRPRE8gaW1wbGVtZW50IGdldEJsb2IgaW4gYWxsIGN1cnNvciB0eXBlcwogICAgIHB1YmxpYyBieXRlW10gZ2V0QmxvYihpbnQgY29sdW1uKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiZ2V0QmxvYiBpcyBub3Qgc3VwcG9ydGVkIik7CkBAIC04OCw3ICs4Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgbURhdGFTZXRPYnNlcnZhYmxlLm5vdGlmeUludmFsaWRhdGVkKCk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGJvb2xlYW4gcmVxdWVyeSgpIHsKICAgICAgICAgaWYgKG1TZWxmT2JzZXJ2ZXIgIT0gbnVsbCAmJiBtU2VsZk9ic2VydmVyUmVnaXN0ZXJlZCA9PSBmYWxzZSkgewogICAgICAgICAgICAgbUNvbnRlbnRSZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtTm90aWZ5VXJpLCB0cnVlLCBtU2VsZk9ic2VydmVyKTsKQEAgLTEwOSwyMiArMTA4LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcyhNYXA8PyBleHRlbmRzIExvbmcsPyBleHRlbmRzIE1hcDxTdHJpbmcsT2JqZWN0Pj4gdmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZXZlcnkgdGltZSB0aGUgY3Vyc29yIGlzIHN1Y2Nlc3NmdWxseSBzY3JvbGxlZAogICAgICAqIHRvIGEgbmV3IHBvc2l0aW9uLCBnaXZpbmcgdGhlIHN1YmNsYXNzIGEgY2hhbmNlIHRvIHVwZGF0ZSBhbnkgc3RhdGUgaXQKICAgICAgKiBtYXkgaGF2ZS4gSWYgaXQgcmV0dXJucyBmYWxzZSB0aGUgbW92ZSBmdW5jdGlvbiB3aWxsIGFsc28gZG8gc28gYW5kIHRoZQpAQCAtMzIwLDEzNyArMzAzLDYgQEAKICAgICAgICAgcmV0dXJuIGdldENvbHVtbk5hbWVzKClbY29sdW1uSW5kZXhdOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVCbG9iKGludCBjb2x1bW5JbmRleCwgYnl0ZVtdIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGUoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlU3RyaW5nKGludCBjb2x1bW5JbmRleCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGUoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlU2hvcnQoaW50IGNvbHVtbkluZGV4LCBzaG9ydCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCBTaG9ydC52YWx1ZU9mKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUludChpbnQgY29sdW1uSW5kZXgsIGludCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCBJbnRlZ2VyLnZhbHVlT2YodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlTG9uZyhpbnQgY29sdW1uSW5kZXgsIGxvbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZShjb2x1bW5JbmRleCwgTG9uZy52YWx1ZU9mKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUZsb2F0KGludCBjb2x1bW5JbmRleCwgZmxvYXQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZShjb2x1bW5JbmRleCwgRmxvYXQudmFsdWVPZih2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVEb3VibGUoaW50IGNvbHVtbkluZGV4LCBkb3VibGUgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZShjb2x1bW5JbmRleCwgRG91YmxlLnZhbHVlT2YodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlVG9OdWxsKGludCBjb2x1bW5JbmRleCkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlKGludCBjb2x1bW5JbmRleCwgT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoIXN1cHBvcnRzVXBkYXRlcygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMb25nLnZhbHVlT2YoKSByZXR1cm5zIG51bGwgc29tZXRpbWVzIQotLy8gICAgICAgIExvbmcgcm93aWQgPSBMb25nLnZhbHVlT2YoZ2V0TG9uZyhtUm93SWRDb2x1bW5JbmRleCkpOwotICAgICAgICBMb25nIHJvd2lkID0gbmV3IExvbmcoZ2V0TG9uZyhtUm93SWRDb2x1bW5JbmRleCkpOwotICAgICAgICBpZiAocm93aWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibnVsbCByb3dpZC4gbVJvd0lkQ29sdW1uSW5kZXggPSAiICsgbVJvd0lkQ29sdW1uSW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByb3cgPSBtVXBkYXRlZFJvd3MuZ2V0KHJvd2lkKTsKLSAgICAgICAgICAgIGlmIChyb3cgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJvdyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICAgICAgICAgIG1VcGRhdGVkUm93cy5wdXQocm93aWQsIHJvdyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByb3cucHV0KGdldENvbHVtbk5hbWVzKClbY29sdW1uSW5kZXhdLCBvYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBhcmUgcGVuZGluZyB1cGRhdGVzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gY29tbWl0dGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIHBlbmRpbmcgdXBkYXRlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGNvbW1pdHRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVXBkYXRlcygpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgcmV0dXJuIG1VcGRhdGVkUm93cy5zaXplKCkgPiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFib3J0VXBkYXRlcygpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgbVVwZGF0ZWRSb3dzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGNvbW1pdFVwZGF0ZXMobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzVXBkYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIG1Sb3dJZENvbHVtbkluZGV4ICE9IC0xOwotICAgIH0KLQogICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ29udGVudE9ic2VydmVyKENvbnRlbnRPYnNlcnZlciBvYnNlcnZlcikgewogICAgICAgICBtQ29udGVudE9ic2VydmFibGUucmVnaXN0ZXJPYnNlcnZlcihvYnNlcnZlcik7CiAgICAgfQpAQCAtNDc4LDkgKzMzMCw5IEBACiAgICAgICAgIHJldHVybiBtRGF0YVNldE9ic2VydmFibGU7CiAgICAgICAgIAogICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKERhdGFTZXRPYnNlcnZlciBvYnNlcnZlcikgewogICAgICAgICBtRGF0YVNldE9ic2VydmFibGUucmVnaXN0ZXJPYnNlcnZlcihvYnNlcnZlcik7Ci0gICAgICAgIAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIoRGF0YVNldE9ic2VydmVyIG9ic2VydmVyKSB7CkBAIC01MjIsNiArMzc0LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgVXJpIGdldE5vdGlmaWNhdGlvblVyaSgpIHsKKyAgICAgICAgcmV0dXJuIG1Ob3RpZnlVcmk7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0V2FudHNBbGxPbk1vdmVDYWxscygpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTUzNSwzNiArMzkxLDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIGZpZWxkIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIGlzCi0gICAgICogdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHtAbGluayAjZ2V0VXBkYXRlZEZpZWxkfSB0byBhbGxvdyBzdWJjbGFzc2VzIHRvCi0gICAgICogc3VwcG9ydCByZWFkaW5nIHVuY29tbWl0dGVkIHVwZGF0ZXMuIE5PVEU6IFRoaXMgZnVuY3Rpb24gYW5kCi0gICAgICoge0BsaW5rICNnZXRVcGRhdGVkRmllbGR9IHNob3VsZCBiZSBjYWxsZWQgdG9nZXRoZXIgaW5zaWRlIG9mIGEKLSAgICAgKiBibG9jayBzeW5jaHJvbml6ZWQgb24gbVVwZGF0ZWRSb3dzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSBjb2x1bW4gaW5kZXggb2YgdGhlIGZpZWxkIHRvIGNoZWNrCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWVsZCBoYXMgYmVlbiB1cGRhdGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiBAZGVwcmVjYXRlZCBBbHdheXMgcmV0dXJucyBmYWxzZSBzaW5jZSBDdXJzb3JzIGRvIG5vdCBzdXBwb3J0IHVwZGF0aW5nIHJvd3MKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHByb3RlY3RlZCBib29sZWFuIGlzRmllbGRVcGRhdGVkKGludCBjb2x1bW5JbmRleCkgewotICAgICAgICBpZiAobVJvd0lkQ29sdW1uSW5kZXggIT0gLTEgJiYgbVVwZGF0ZWRSb3dzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gdXBkYXRlcyA9IG1VcGRhdGVkUm93cy5nZXQobUN1cnJlbnRSb3dJRCk7Ci0gICAgICAgICAgICBpZiAodXBkYXRlcyAhPSBudWxsICYmIHVwZGF0ZXMuY29udGFpbnNLZXkoZ2V0Q29sdW1uTmFtZXMoKVtjb2x1bW5JbmRleF0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdW5jb21taXR0ZWQgdXBkYXRlZCB2YWx1ZSBmb3IgdGhlIGZpZWxkCi0gICAgICogYXQgY29sdW1uSW5kZXguICBOT1RFOiBUaGlzIGZ1bmN0aW9uIGFuZCB7QGxpbmsgI2lzRmllbGRVcGRhdGVkfSBzaG91bGQKLSAgICAgKiBiZSBjYWxsZWQgdG9nZXRoZXIgaW5zaWRlIG9mIGEgYmxvY2sgc3luY2hyb25pemVkIG9uIG1VcGRhdGVkUm93cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgY29sdW1uIGluZGV4IG9mIHRoZSBmaWVsZCB0byByZXRyaWV2ZQotICAgICAqIEByZXR1cm4gdGhlIHVwZGF0ZWQgdmFsdWUKKyAgICAgKiBAZGVwcmVjYXRlZCBBbHdheXMgcmV0dXJucyBudWxsIHNpbmNlIEN1cnNvcnMgZG8gbm90IHN1cHBvcnQgdXBkYXRpbmcgcm93cwogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRVcGRhdGVkRmllbGQoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gdXBkYXRlcyA9IG1VcGRhdGVkUm93cy5nZXQobUN1cnJlbnRSb3dJRCk7Ci0gICAgICAgIHJldHVybiB1cGRhdGVzLmdldChnZXRDb2x1bW5OYW1lcygpW2NvbHVtbkluZGV4XSk7CisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjE0LDExICs0NTMsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgSGFzaE1hcCBjb250YWlucyBhIG1hcHBpbmcgZnJvbSBMb25nIHJvd0lEcyB0byBhbm90aGVyIE1hcAotICAgICAqIHRoYXQgbWFwcyBmcm9tIFN0cmluZyBjb2x1bW4gbmFtZXMgdG8gbmV3IHZhbHVlcy4gQSBOVUxMIHZhbHVlIG1lYW5zIHRvCi0gICAgICogcmVtb3ZlIGFuIGV4aXN0aW5nIHZhbHVlLCBhbmQgYWxsIG51bWVyaWMgdmFsdWVzIGFyZSBpbiB0aGVpciBjbGFzcwotICAgICAqIGZvcm1zLCBpLmUuIEludGVnZXIsIExvbmcsIEZsb2F0LCBldGMuCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBpcyBuZXZlciB1cGRhdGVkIGJ5IHRoaXMgY2xhc3MgYW5kIHNob3VsZCBub3QgYmUgdXNlZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHJvdGVjdGVkIEhhc2hNYXA8TG9uZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gbVVwZGF0ZWRSb3dzOwogCiAgICAgLyoqCkBAIC02MjgsNiArNDY1LDExIEBACiAgICAgcHJvdGVjdGVkIGludCBtUm93SWRDb2x1bW5JbmRleDsKIAogICAgIHByb3RlY3RlZCBpbnQgbVBvczsKKyAgICAvKioKKyAgICAgKiBJZiB7QGxpbmsgI21Sb3dJZENvbHVtbkluZGV4fSBpcyBub3QgLTEgdGhpcyBjb250YWlucyBjb250YWlucyB0aGUgdmFsdWUgb2YKKyAgICAgKiB0aGUgY29sdW1uIGF0IHtAbGluayAjbVJvd0lkQ29sdW1uSW5kZXh9IGZvciB0aGUgY3VycmVudCByb3cgdGhpcyBjdXJzb3IgaXMKKyAgICAgKiBwb2ludGluZyBhdC4KKyAgICAgKi8KICAgICBwcm90ZWN0ZWQgTG9uZyBtQ3VycmVudFJvd0lEOwogICAgIHByb3RlY3RlZCBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQ2xvc2VkID0gZmFsc2U7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yLmphdmEKaW5kZXggMjdhMDJlMi4uOGFkZGFhOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RXaW5kb3dlZEN1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0V2luZG93ZWRDdXJzb3IuamF2YQpAQCAtMTksMjAyICsxOSwxMDUgQEAKIC8qKgogICogQSBiYXNlIGNsYXNzIGZvciBDdXJzb3JzIHRoYXQgc3RvcmUgdGhlaXIgZGF0YSBpbiB7QGxpbmsgQ3Vyc29yV2luZG93fXMuCiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdpbmRvd2VkQ3Vyc29yIGV4dGVuZHMgQWJzdHJhY3RDdXJzb3IKLXsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdpbmRvd2VkQ3Vyc29yIGV4dGVuZHMgQWJzdHJhY3RDdXJzb3IgewogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBieXRlW10gZ2V0QmxvYihpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBieXRlW10gZ2V0QmxvYihpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGJ5dGVbXSlnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIG1XaW5kb3cuZ2V0QmxvYihtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZylnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIG1XaW5kb3cuZ2V0U3RyaW5nKG1Qb3MsIGNvbHVtbkluZGV4KTsKICAgICB9Ci0gICAgCisKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjb3B5U3RyaW5nVG9CdWZmZXIoaW50IGNvbHVtbkluZGV4LCBDaGFyQXJyYXlCdWZmZXIgYnVmZmVyKQotICAgIHsKKyAgICBwdWJsaWMgdm9pZCBjb3B5U3RyaW5nVG9CdWZmZXIoaW50IGNvbHVtbkluZGV4LCBDaGFyQXJyYXlCdWZmZXIgYnVmZmVyKSB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5jb3B5U3RyaW5nVG9CdWZmZXIoY29sdW1uSW5kZXgsIGJ1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIG1XaW5kb3cuY29weVN0cmluZ1RvQnVmZmVyKG1Qb3MsIGNvbHVtbkluZGV4LCBidWZmZXIpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydChpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydChpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBOdW1iZXIgdmFsdWUgPSAoTnVtYmVyKWdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnNob3J0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldFNob3J0KG1Qb3MsIGNvbHVtbkluZGV4KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldEludChpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBpbnQgZ2V0SW50KGludCBjb2x1bW5JbmRleCkgewogICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE51bWJlciB2YWx1ZSA9IChOdW1iZXIpZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldEludChtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0TG9uZyhpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBsb25nIGdldExvbmcoaW50IGNvbHVtbkluZGV4KSB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgTnVtYmVyIHZhbHVlID0gKE51bWJlcilnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5sb25nVmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldExvbmcobVBvcywgY29sdW1uSW5kZXgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdChpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdChpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBOdW1iZXIgdmFsdWUgPSAoTnVtYmVyKWdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmZsb2F0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldEZsb2F0KG1Qb3MsIGNvbHVtbkluZGV4KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKGludCBjb2x1bW5JbmRleCkgewogICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE51bWJlciB2YWx1ZSA9IChOdW1iZXIpZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuZG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldERvdWJsZShtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW5JbmRleCkKLSAgICB7CisgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW5JbmRleCkgewogICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpID09IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbVdpbmRvdy5pc051bGwobVBvcywgY29sdW1uSW5kZXgpOworICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXRUeXBlKG1Qb3MsIGNvbHVtbkluZGV4KSA9PSBDdXJzb3IuRklFTERfVFlQRV9OVUxMOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGlzQmxvYihpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCB8fCBvYmplY3QgaW5zdGFuY2VvZiBieXRlW107Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbVdpbmRvdy5pc0Jsb2IobVBvcywgY29sdW1uSW5kZXgpOworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldFR5cGV9CisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Jsb2IoaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKGNvbHVtbkluZGV4KSA9PSBDdXJzb3IuRklFTERfVFlQRV9CTE9COwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGlzU3RyaW5nKGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsIHx8IG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtV2luZG93LmlzU3RyaW5nKG1Qb3MsIGNvbHVtbkluZGV4KTsKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRUeXBlfQorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGJvb2xlYW4gaXNTdHJpbmcoaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKGNvbHVtbkluZGV4KSA9PSBDdXJzb3IuRklFTERfVFlQRV9TVFJJTkc7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gaXNMb25nKGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIChvYmplY3QgaW5zdGFuY2VvZiBJbnRlZ2VyIHx8IG9iamVjdCBpbnN0YW5jZW9mIExvbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1XaW5kb3cuaXNMb25nKG1Qb3MsIGNvbHVtbkluZGV4KTsKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRUeXBlfQorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGJvb2xlYW4gaXNMb25nKGludCBjb2x1bW5JbmRleCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZShjb2x1bW5JbmRleCkgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfSU5URUdFUjsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Zsb2F0KGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIChvYmplY3QgaW5zdGFuY2VvZiBGbG9hdCB8fCBvYmplY3QgaW5zdGFuY2VvZiBEb3VibGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1XaW5kb3cuaXNGbG9hdChtUG9zLCBjb2x1bW5JbmRleCk7CisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0VHlwZX0KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBib29sZWFuIGlzRmxvYXQoaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKGNvbHVtbkluZGV4KSA9PSBDdXJzb3IuRklFTERfVFlQRV9GTE9BVDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1Bvc2l0aW9uKCkKLSAgICB7CisgICAgcHVibGljIGludCBnZXRUeXBlKGludCBjb2x1bW5JbmRleCkgeworICAgICAgICBjaGVja1Bvc2l0aW9uKCk7CisgICAgICAgIHJldHVybiBtV2luZG93LmdldFR5cGUobVBvcywgY29sdW1uSW5kZXgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrUG9zaXRpb24oKSB7CiAgICAgICAgIHN1cGVyLmNoZWNrUG9zaXRpb24oKTsKICAgICAgICAgCiAgICAgICAgIGlmIChtV2luZG93ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTdGFsZURhdGFFeGNlcHRpb24oIkFjY2VzcyBjbG9zZWQgY3Vyc29yIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgU3RhbGVEYXRhRXhjZXB0aW9uKCJBdHRlbXB0aW5nIHRvIGFjY2VzcyBhIGNsb3NlZCBjdXJzb3IiKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvck5hdGl2ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvck5hdGl2ZS5qYXZhCmluZGV4IGJhYTk0ZDguLmZhNjJkNjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JOYXRpdmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yTmF0aXZlLmphdmEKQEAgLTE3LDEzICsxNywxMCBAQAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIAogLyoqCiAgKiBOYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGJ1bGsgY3Vyc29yLiBUaGlzIGlzIG9ubHkgZm9yIHVzZSBpbiBpbXBsZW1lbnRpbmcKQEAgLTEyMCwyNiArMTE3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfUk9XU19UUkFOU0FDVElPTjogewotICAgICAgICAgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUJ1bGtDdXJzb3IuZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSB3aGF0IENsYXNzTG9hZGVyIHNob3VsZCBiZSBwYXNzZWQgdG8gcmVhZEhhc2hNYXA/Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBzd2l0Y2ggdG8gQnVuZGxlCi0gICAgICAgICAgICAgICAgICAgIEhhc2hNYXA8TG9uZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzID0gZGF0YS5yZWFkSGFzaE1hcChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB1cGRhdGVSb3dzKHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoKHJlc3VsdCA9PSB0cnVlID8gMSA6IDApKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBERUxFVEVfUk9XX1RSQU5TQUNUSU9OOiB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQnVsa0N1cnNvci5kZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZGF0YS5yZWFkSW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZGVsZXRlUm93KHBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZUludCgocmVzdWx0ID09IHRydWUgPyAxIDogMCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICBjYXNlIE9OX01PVkVfVFJBTlNBQ1RJT046IHsKICAgICAgICAgICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElCdWxrQ3Vyc29yLmRlc2NyaXB0b3IpOwogICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBkYXRhLnJlYWRJbnQoKTsKQEAgLTM0Myw0OCArMzIwLDYgQEAKICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVJvd3MoTWFwIHZhbHVlcykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKLQotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUJ1bGtDdXJzb3IuZGVzY3JpcHRvcik7Ci0KLSAgICAgICAgZGF0YS53cml0ZU1hcCh2YWx1ZXMpOwotCi0gICAgICAgIG1SZW1vdGUudHJhbnNhY3QoVVBEQVRFX1JPV1NfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKLQotICAgICAgICBEYXRhYmFzZVV0aWxzLnJlYWRFeGNlcHRpb25Gcm9tUGFyY2VsKHJlcGx5KTsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gKHJlcGx5LnJlYWRJbnQoKSA9PSAxID8gdHJ1ZSA6IGZhbHNlKTsKLQotICAgICAgICBkYXRhLnJlY3ljbGUoKTsKLSAgICAgICAgcmVwbHkucmVjeWNsZSgpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KGludCBwb3NpdGlvbikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7Ci0gICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKLQotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUJ1bGtDdXJzb3IuZGVzY3JpcHRvcik7Ci0KLSAgICAgICAgZGF0YS53cml0ZUludChwb3NpdGlvbik7Ci0KLSAgICAgICAgbVJlbW90ZS50cmFuc2FjdChERUxFVEVfUk9XX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7Ci0KLSAgICAgICAgRGF0YWJhc2VVdGlscy5yZWFkRXhjZXB0aW9uRnJvbVBhcmNlbChyZXBseSk7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIHJlc3VsdCA9IChyZXBseS5yZWFkSW50KCkgPT0gMSA/IHRydWUgOiBmYWxzZSk7Ci0KLSAgICAgICAgZGF0YS5yZWN5Y2xlKCk7Ci0gICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQogICAgIHB1YmxpYyBib29sZWFuIGdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CiAgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JUb0N1cnNvckFkYXB0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JUb0N1cnNvckFkYXB0b3IuamF2YQppbmRleCAxNDY5ZWEyLi4yY2IyYWVjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yVG9DdXJzb3JBZGFwdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvclRvQ3Vyc29yQWRhcHRvci5qYXZhCkBAIC0xNiwxMiArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOwogCi1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KIC8qKgogICogQWRhcHRzIGFuIHtAbGluayBJQnVsa0N1cnNvcn0gdG8gYSB7QGxpbmsgQ3Vyc29yfSBmb3IgdXNlIGluIHRoZSBsb2NhbAogICogcHJvY2Vzcy4KQEAgLTE3NCwzOCArMTcyLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IG1CdWxrQ3Vyc29yLmRlbGV0ZVJvdyhtUG9zKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgd2luZG93IGNvbnRhaW5zIHRoZSBvbGQgdmFsdWUsIGRpc2NhcmQgaXQKLSAgICAgICAgICAgICAgICBtV2luZG93ID0gbnVsbDsKLSAgICAKLSAgICAgICAgICAgICAgICAvLyBGaXggdXAgdGhlIHBvc2l0aW9uCi0gICAgICAgICAgICAgICAgbUNvdW50ID0gbUJ1bGtDdXJzb3IuY291bnQoKTsKLSAgICAgICAgICAgICAgICBpZiAobVBvcyA8IG1Db3VudCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgb2xkUG9zID0gbVBvczsKLSAgICAgICAgICAgICAgICAgICAgbVBvcyA9IC0xOwotICAgICAgICAgICAgICAgICAgICBtb3ZlVG9Qb3NpdGlvbihvbGRQb3MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3MgPSBtQ291bnQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gU2VuZCB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbgotICAgICAgICAgICAgICAgIG9uQ2hhbmdlKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJVbmFibGUgdG8gZGVsZXRlIHJvdyBiZWNhdXNlIHRoZSByZW1vdGUgcHJvY2VzcyBpcyBkZWFkIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29sdW1uTmFtZXMoKSB7CiAgICAgICAgIGlmIChtQ29sdW1ucyA9PSBudWxsKSB7CkBAIC0yMTksNDQgKzE4NSw2IEBACiAgICAgICAgIHJldHVybiBtQ29sdW1uczsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcyhNYXA8PyBleHRlbmRzIExvbmcsCi0gICAgICAgICAgICA/IGV4dGVuZHMgTWFwPFN0cmluZyxPYmplY3Q+PiBhZGRpdGlvbmFsVmFsdWVzKSB7Ci0gICAgICAgIGlmICghc3VwcG9ydHNVcGRhdGVzKCkpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgImNvbW1pdFVwZGF0ZXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGN1cnNvciwgZGlkIHlvdSBpbmNsdWRlIHRoZSBfaWQgY29sdW1uPyIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxWYWx1ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1VcGRhdGVkUm93cy5wdXRBbGwoYWRkaXRpb25hbFZhbHVlcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtVXBkYXRlZFJvd3Muc2l6ZSgpIDw9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBtQnVsa0N1cnNvci51cGRhdGVSb3dzKG1VcGRhdGVkUm93cyk7Ci0gICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1VcGRhdGVkUm93cy5jbGVhcigpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGNoYW5nZSBub3RpZmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmFibGUgdG8gY29tbWl0IHVwZGF0ZXMgYmVjYXVzZSB0aGUgcmVtb3RlIHByb2Nlc3MgaXMgZGVhZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgewogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3IuamF2YQppbmRleCA2NTM5MTU2Li5jMDNjNTg2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3IuamF2YQpAQCAtMzAsNiArMzAsMjUgQEAKICAqIHRocmVhZHMgc2hvdWxkIHBlcmZvcm0gaXRzIG93biBzeW5jaHJvbml6YXRpb24gd2hlbiB1c2luZyB0aGUgQ3Vyc29yLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIEN1cnNvciB7CisgICAgLyoKKyAgICAgKiBWYWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlKGludCl9LgorICAgICAqIFRoZXNlIHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdHlwZXMgZGVmaW5lZCBpbiBDdXJzb3JXaW5kb3cuaAorICAgICAqLworICAgIC8qKiBWYWx1ZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFR5cGUoaW50KX0gaWYgdGhlIHNwZWNpZmllZCBjb2x1bW4gaXMgbnVsbCAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9OVUxMID0gMDsKKworICAgIC8qKiBWYWx1ZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFR5cGUoaW50KX0gaWYgdGhlIHNwZWNpZmllZCAgY29sdW1uIHR5cGUgaXMgaW50ZWdlciAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9JTlRFR0VSID0gMTsKKworICAgIC8qKiBWYWx1ZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFR5cGUoaW50KX0gaWYgdGhlIHNwZWNpZmllZCBjb2x1bW4gdHlwZSBpcyBmbG9hdCAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9GTE9BVCA9IDI7CisKKyAgICAvKiogVmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlKGludCl9IGlmIHRoZSBzcGVjaWZpZWQgY29sdW1uIHR5cGUgaXMgc3RyaW5nICovCisgICAgc3RhdGljIGZpbmFsIGludCBGSUVMRF9UWVBFX1NUUklORyA9IDM7CisKKyAgICAvKiogVmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlKGludCl9IGlmIHRoZSBzcGVjaWZpZWQgY29sdW1uIHR5cGUgaXMgYmxvYiAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9CTE9CID0gNDsKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG51bWJlcnMgb2Ygcm93cyBpbiB0aGUgY3Vyc29yLgogICAgICAqCkBAIC0xNDYsMjIgKzE2NSw2IEBACiAgICAgYm9vbGVhbiBpc0FmdGVyTGFzdCgpOwogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgcm93IGF0IHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBmcm9tIHRoZSB1bmRlcmx5aW5nIGRhdGEKLSAgICAgKiBzdG9yZS4gQWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgY3Vyc29yIHdpbGwgYmUgcG9pbnRpbmcgdG8gdGhlIHJvdwotICAgICAqIGFmdGVyIHRoZSByb3cgdGhhdCBpcyBkZWxldGVkLiBUaGlzIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgZGVjcmVtZW50aW5nCi0gICAgICogdGhlIHJlc3VsdCBvZiBjb3VudCgpIGJ5IG9uZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcXVlcnkgbXVzdCBoYXZlIHRoZSByb3cgSUQgY29sdW1uIGluIGl0cyBzZWxlY3Rpb24sIG90aGVyd2lzZSB0aGlzCi0gICAgICogY2FsbCB3aWxsIGZhaWwuCi0gICAgICogCi0gICAgICogQGhpZGUKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHJlY29yZCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQuCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBDb250ZW50UmVzb2x2ZXIjZGVsZXRlKFVyaSwgU3RyaW5nLCBTdHJpbmdbXSl9Ci0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIGRlbGV0ZVJvdygpOwotCi0gICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgemVyby1iYXNlZCBpbmRleCBmb3IgdGhlIGdpdmVuIGNvbHVtbiBuYW1lLCBvciAtMSBpZiB0aGUgY29sdW1uIGRvZXNuJ3QgZXhpc3QuCiAgICAgICogSWYgeW91IGV4cGVjdCB0aGUgY29sdW1uIHRvIGV4aXN0IHVzZSB7QGxpbmsgI2dldENvbHVtbkluZGV4T3JUaHJvdyhTdHJpbmcpfSBpbnN0ZWFkLCB3aGljaAogICAgICAqIHdpbGwgbWFrZSB0aGUgZXJyb3IgbW9yZSBjbGVhci4KQEAgLTI5NSw2ICsyOTgsMjcgQEAKICAgICBkb3VibGUgZ2V0RG91YmxlKGludCBjb2x1bW5JbmRleCk7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIGRhdGEgdHlwZSBvZiB0aGUgZ2l2ZW4gY29sdW1uJ3MgdmFsdWUuCisgICAgICogVGhlIHByZWZlcnJlZCB0eXBlIG9mIHRoZSBjb2x1bW4gaXMgcmV0dXJuZWQgYnV0IHRoZSBkYXRhIG1heSBiZSBjb252ZXJ0ZWQgdG8gb3RoZXIgdHlwZXMKKyAgICAgKiBhcyBkb2N1bWVudGVkIGluIHRoZSBnZXQtdHlwZSBtZXRob2RzIHN1Y2ggYXMge0BsaW5rICNnZXRJbnQoaW50KX0sIHtAbGluayAjZ2V0RmxvYXQoaW50KX0KKyAgICAgKiBldGMuCisgICAgICo8cD4KKyAgICAgKiBSZXR1cm5lZCBjb2x1bW4gdHlwZXMgYXJlCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayAjRklFTERfVFlQRV9OVUxMfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNGSUVMRF9UWVBFX0lOVEVHRVJ9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI0ZJRUxEX1RZUEVfRkxPQVR9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI0ZJRUxEX1RZUEVfU1RSSU5HfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNGSUVMRF9UWVBFX0JMT0J9PC9saT4KKyAgICAgKjwvdWw+CisgICAgICo8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCisgICAgICogQHJldHVybiBjb2x1bW4gdmFsdWUgdHlwZQorICAgICAqLworICAgIGludCBnZXRUeXBlKGludCBjb2x1bW5JbmRleCk7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB2YWx1ZSBpbiB0aGUgaW5kaWNhdGVkIGNvbHVtbiBpcyBudWxsLgogICAgICAqCiAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgpAQCAtMzAzLDE4OCArMzI3LDYgQEAKICAgICBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uSW5kZXgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY3Vyc29yIHN1cHBvcnRzIHVwZGF0ZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGN1cnNvciBzdXBwb3J0cyB1cGRhdGVzLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiBzdXBwb3J0c1VwZGF0ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIHBlbmRpbmcgdXBkYXRlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGNvbW1pdHRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGFyZSBwZW5kaW5nIHVwZGF0ZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBjb21taXR0ZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIGhhc1VwZGF0ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoZSByb3cgdGhlIGN1cnNvciBpcwotICAgICAqIGN1cnJlbnRseSBwb2ludGluZyBhdC4gVXBkYXRlcyBhcmUgbm90IGNvbW1pdHRlZCB0byB0aGUgYmFja2luZyBzdG9yZQotICAgICAqIHVudGlsIHtAbGluayAjY29tbWl0VXBkYXRlcygpfSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiB1cGRhdGVCbG9iKGludCBjb2x1bW5JbmRleCwgYnl0ZVtdIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoZSByb3cgdGhlIGN1cnNvciBpcwotICAgICAqIGN1cnJlbnRseSBwb2ludGluZyBhdC4gVXBkYXRlcyBhcmUgbm90IGNvbW1pdHRlZCB0byB0aGUgYmFja2luZyBzdG9yZQotICAgICAqIHVudGlsIHtAbGluayAjY29tbWl0VXBkYXRlcygpfSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiB1cGRhdGVTdHJpbmcoaW50IGNvbHVtbkluZGV4LCBTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZVNob3J0KGludCBjb2x1bW5JbmRleCwgc2hvcnQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZUludChpbnQgY29sdW1uSW5kZXgsIGludCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGUgcm93IHRoZSBjdXJzb3IgaXMKLSAgICAgKiBjdXJyZW50bHkgcG9pbnRpbmcgYXQuIFVwZGF0ZXMgYXJlIG5vdCBjb21taXR0ZWQgdG8gdGhlIGJhY2tpbmcgc3RvcmUKLSAgICAgKiB1bnRpbCB7QGxpbmsgI2NvbW1pdFVwZGF0ZXMoKX0gaXMgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gdXBkYXRlTG9uZyhpbnQgY29sdW1uSW5kZXgsIGxvbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZUZsb2F0KGludCBjb2x1bW5JbmRleCwgZmxvYXQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZURvdWJsZShpbnQgY29sdW1uSW5kZXgsIGRvdWJsZSB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGUgcm93IHRoZSBjdXJzb3IgaXMKLSAgICAgKiBjdXJyZW50bHkgcG9pbnRpbmcgYXQuIFVwZGF0ZXMgYXJlIG5vdCBjb21taXR0ZWQgdG8gdGhlIGJhY2tpbmcgc3RvcmUKLSAgICAgKiB1bnRpbCB7QGxpbmsgI2NvbW1pdFVwZGF0ZXMoKX0gaXMgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gdXBkYXRlVG9OdWxsKGludCBjb2x1bW5JbmRleCk7Ci0KLSAgICAvKioKLSAgICAgKiBBdG9taWNhbGx5IGNvbW1pdHMgYWxsIHVwZGF0ZXMgdG8gdGhlIGJhY2tpbmcgc3RvcmUuIEFmdGVyIGNvbXBsZXRpb24sCi0gICAgICogdGhpcyBtZXRob2QgbGVhdmVzIHRoZSBkYXRhIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZSBhbmQgeW91IHNob3VsZCBjYWxsCi0gICAgICoge0BsaW5rICNyZXF1ZXJ5fSBiZWZvcmUgcmVhZGluZyBkYXRhIGZyb20gdGhlIGN1cnNvciBhZ2Fpbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gY29tbWl0VXBkYXRlcygpOwotCi0gICAgLyoqCi0gICAgICogQXRvbWljYWxseSBjb21taXRzIGFsbCB1cGRhdGVzIHRvIHRoZSBiYWNraW5nIHN0b3JlLCBhcyB3ZWxsIGFzIHRoZQotICAgICAqIHVwZGF0ZXMgaW5jbHVkZWQgaW4gdmFsdWVzLiBBZnRlciBjb21wbGV0aW9uLAotICAgICAqIHRoaXMgbWV0aG9kIGxlYXZlcyB0aGUgZGF0YSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUgYW5kIHlvdSBzaG91bGQgY2FsbAotICAgICAqIHtAbGluayAjcmVxdWVyeX0gYmVmb3JlIHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBjdXJzb3IgYWdhaW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWVzIEEgbWFwIGZyb20gcm93IElEcyB0byBNYXBzIGFzc29jaWF0aW5nIGNvbHVtbiBuYW1lcyB3aXRoCi0gICAgICogICAgICAgICAgICAgICB1cGRhdGVkIHZhbHVlcy4gQSBudWxsIHZhbHVlIGluZGljYXRlcyB0aGUgZmllbGQgc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgICByZW1vdmVkLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gY29tbWl0VXBkYXRlcyhNYXA8PyBleHRlbmRzIExvbmcsCi0gICAgICAgICAgICA/IGV4dGVuZHMgTWFwPFN0cmluZyxPYmplY3Q+PiB2YWx1ZXMpOwotCi0gICAgLyoqCi0gICAgICogUmV2ZXJ0cyBhbGwgdXBkYXRlcyBtYWRlIHRvIHRoZSBjdXJzb3Igc2luY2UgdGhlIGxhc3QgY2FsbCB0bwotICAgICAqIGNvbW1pdFVwZGF0ZXMuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICB2b2lkIGFib3J0VXBkYXRlcygpOwotCi0gICAgLyoqCiAgICAgICogRGVhY3RpdmF0ZXMgdGhlIEN1cnNvciwgbWFraW5nIGFsbCBjYWxscyBvbiBpdCBmYWlsIHVudGlsIHtAbGluayAjcmVxdWVyeX0gaXMgY2FsbGVkLgogICAgICAqIEluYWN0aXZlIEN1cnNvcnMgdXNlIGZld2VyIHJlc291cmNlcyB0aGFuIGFjdGl2ZSBDdXJzb3JzLgogICAgICAqIENhbGxpbmcge0BsaW5rICNyZXF1ZXJ5fSB3aWxsIG1ha2UgdGhlIGN1cnNvciBhY3RpdmUgYWdhaW4uCkBAIC00OTYsNiArMzM4LDEwIEBACiAgICAgICogY29udGVudHMuIFRoaXMgbWF5IGJlIGRvbmUgYXQgYW55IHRpbWUsIGluY2x1ZGluZyBhZnRlciBhIGNhbGwgdG8ge0BsaW5rCiAgICAgICogI2RlYWN0aXZhdGV9LgogICAgICAqCisgICAgICogU2luY2UgdGhpcyBtZXRob2QgY291bGQgZXhlY3V0ZSBhIHF1ZXJ5IG9uIHRoZSBkYXRhYmFzZSBhbmQgcG90ZW50aWFsbHkgdGFrZQorICAgICAqIGEgd2hpbGUsIGl0IGNvdWxkIGNhdXNlIEFOUiBpZiBpdCBpcyBjYWxsZWQgb24gTWFpbiAoVUkpIHRocmVhZC4KKyAgICAgKiBBIHdhcm5pbmcgaXMgcHJpbnRlZCBpZiB0aGlzIG1ldGhvZCBpcyBiZWluZyBleGVjdXRlZCBvbiBNYWluIHRocmVhZC4KKyAgICAgKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVxdWVyeSBzdWNjZWVkZWQsIGZhbHNlIGlmIG5vdCwgaW4gd2hpY2ggY2FzZSB0aGUKICAgICAgKiAgICAgICAgIGN1cnNvciBiZWNvbWVzIGludmFsaWQuCiAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JUb0J1bGtDdXJzb3JBZGFwdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JUb0J1bGtDdXJzb3JBZGFwdG9yLmphdmEKaW5kZXggNzQ4ZWI5OS4uOGJjN2RlMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yVG9CdWxrQ3Vyc29yQWRhcHRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvclRvQnVsa0N1cnNvckFkYXB0b3IuamF2YQpAQCAtMTYsMTYgKzE2LDEyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKIAotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU1pc3VzZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQogCiAvKioKICAqIFdyYXBzIGEgQnVsa0N1cnNvciBhcm91bmQgYW4gZXhpc3RpbmcgQ3Vyc29yIG1ha2luZyBpdCByZW1vdGFibGUuCkBAIC0zOCw3ICszNCw2IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBDcm9zc1Byb2Nlc3NDdXJzb3IgbUN1cnNvcjsKICAgICBwcml2YXRlIEN1cnNvcldpbmRvdyBtV2luZG93OwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Qcm92aWRlck5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1SZWFkT25seTsKICAgICBwcml2YXRlIENvbnRlbnRPYnNlcnZlclByb3h5IG1PYnNlcnZlcjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENvbnRlbnRPYnNlcnZlclByb3h5IGV4dGVuZHMgQ29udGVudE9ic2VydmVyIApAQCAtOTgsNyArOTMsNiBAQAogICAgICAgICAgICAgICAgICAgICAiT25seSBDcm9zc1Byb2Nlc3NDdXJzb3IgY3Vyc29ycyBhcmUgc3VwcG9ydGVkIGFjcm9zcyBwcm9jZXNzIGZvciBub3ciLCBlKTsKICAgICAgICAgfQogICAgICAgICBtUHJvdmlkZXJOYW1lID0gcHJvdmlkZXJOYW1lOwotICAgICAgICBtUmVhZE9ubHkgPSAhYWxsb3dXcml0ZTsKIAogICAgICAgICBjcmVhdGVBbmRSZWdpc3Rlck9ic2VydmVyUHJveHkob2JzZXJ2ZXIpOwogICAgIH0KQEAgLTE5NywzMSArMTkxLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVJvd3MoTWFwPD8gZXh0ZW5kcyBMb25nLCA/IGV4dGVuZHMgTWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzKSB7Ci0gICAgICAgIGlmIChtUmVhZE9ubHkpIHsKLSAgICAgICAgICAgIExvZy53KCJDb250ZW50UHJvdmlkZXIiLCAiUGVybWlzc2lvbiBEZW5pYWw6IG1vZGlmeWluZyAiCi0gICAgICAgICAgICAgICAgICAgICsgbVByb3ZpZGVyTmFtZQotICAgICAgICAgICAgICAgICAgICArICIgZnJvbSBwaWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nUGlkKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmNvbW1pdFVwZGF0ZXModmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgIGlmIChtUmVhZE9ubHkpIHsKLSAgICAgICAgICAgIExvZy53KCJDb250ZW50UHJvdmlkZXIiLCAiUGVybWlzc2lvbiBEZW5pYWw6IG1vZGlmeWluZyAiCi0gICAgICAgICAgICAgICAgICAgICsgbVByb3ZpZGVyTmFtZQotICAgICAgICAgICAgICAgICAgICArICIgZnJvbSBwaWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nUGlkKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ3Vyc29yLm1vdmVUb1Bvc2l0aW9uKHBvc2l0aW9uKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmRlbGV0ZVJvdygpOwotICAgIH0KLQogICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgewogICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRFeHRyYXMoKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdy5qYXZhCmluZGV4IGM3NTY4MjUuLjU5OTQzMWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdy5qYXZhCkBAIC0yMTcsMTggKzIxNywxMyBAQAogICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CiAgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGdpdmVuIGZpZWxkIGlzIHtAY29kZSBOVUxMfQorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFR5cGUoaW50LCBpbnQpfSBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBpc051bGwoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNOdWxsX25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFR5cGUocm93LCBjb2wpID09IEN1cnNvci5GSUVMRF9UWVBFX05VTEw7CiAgICAgfQogICAgIAotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gaXNOdWxsX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKLSAgICAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgYnl0ZSBhcnJheSBmb3IgdGhlIGdpdmVuIGZpZWxkLgogICAgICAqCkBAIC0yNDgsMTkgKzI0Myw0MyBAQAogICAgIHByaXZhdGUgbmF0aXZlIGJ5dGVbXSBnZXRCbG9iX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKIAogICAgIC8qKgorICAgICAqIFJldHVybnMgZGF0YSB0eXBlIG9mIHRoZSBnaXZlbiBjb2x1bW4ncyB2YWx1ZS4KKyAgICAgKjxwPgorICAgICAqIFJldHVybmVkIGNvbHVtbiB0eXBlcyBhcmUKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX05VTEx9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfSU5URUdFUn08L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9GTE9BVH08L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9TVFJJTkd9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfQkxPQn08L2xpPgorICAgICAqPC91bD4KKyAgICAgKjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CisgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IHJvdywgaW50IGNvbCkgeworICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VHlwZV9uYXRpdmUocm93IC0gbVN0YXJ0UG9zLCBjb2wpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2hlY2tzIGlmIGEgZmllbGQgY29udGFpbnMgZWl0aGVyIGEgYmxvYiBvciBpcyBudWxsLgogICAgICAqCiAgICAgICogQHBhcmFtIHJvdyB0aGUgcm93IHRvIHJlYWQgZnJvbSwgcm93IC0gZ2V0U3RhcnRQb3NpdGlvbigpIGJlaW5nIHRoZSBhY3R1YWwgcm93IGluIHRoZSB3aW5kb3cKICAgICAgKiBAcGFyYW0gY29sIHRoZSBjb2x1bW4gdG8gcmVhZCBmcm9tCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZ2l2ZW4gZmllbGQgaXMge0Bjb2RlIE5VTEx9IG9yIGEgYmxvYgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFR5cGUoaW50LCBpbnQpfSBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBpc0Jsb2IoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNCbG9iX25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgaW50IHR5cGUgPSBnZXRUeXBlKHJvdywgY29sKTsKKyAgICAgICAgcmV0dXJuIHR5cGUgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfQkxPQiB8fCB0eXBlID09IEN1cnNvci5GSUVMRF9UWVBFX05VTEw7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNjksMTQgKzI4OCwxMSBAQAogICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CiAgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGdpdmVuIGZpZWxkIGlzIGEgbG9uZworICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFR5cGUoaW50LCBpbnQpfSBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiBpc0xvbmcoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNJbnRlZ2VyX25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFR5cGUocm93LCBjb2wpID09IEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVI7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yODUsMTQgKzMwMSwxMSBAQAogICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CiAgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGdpdmVuIGZpZWxkIGlzIGEgZmxvYXQKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRUeXBlKGludCwgaW50KX0gaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gaXNGbG9hdChpbnQgcm93LCBpbnQgY29sKSB7Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBpc0Zsb2F0X25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFR5cGUocm93LCBjb2wpID09IEN1cnNvci5GSUVMRF9UWVBFX0ZMT0FUOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzAxLDIwICszMTQsMTUgQEAKICAgICAgKiBAcGFyYW0gcm93IHRoZSByb3cgdG8gcmVhZCBmcm9tLCByb3cgLSBnZXRTdGFydFBvc2l0aW9uKCkgYmVpbmcgdGhlIGFjdHVhbCByb3cgaW4gdGhlIHdpbmRvdwogICAgICAqIEBwYXJhbSBjb2wgdGhlIGNvbHVtbiB0byByZWFkIGZyb20KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBnaXZlbiBmaWVsZCBpcyB7QGNvZGUgTlVMTH0gb3IgYSBTdHJpbmcKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRUeXBlKGludCwgaW50KX0gaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gaXNTdHJpbmcoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNTdHJpbmdfbmF0aXZlKHJvdyAtIG1TdGFydFBvcywgY29sKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfQorICAgICAgICBpbnQgdHlwZSA9IGdldFR5cGUocm93LCBjb2wpOworICAgICAgICByZXR1cm4gdHlwZSA9PSBDdXJzb3IuRklFTERfVFlQRV9TVFJJTkcgfHwgdHlwZSA9PSBDdXJzb3IuRklFTERfVFlQRV9OVUxMOwogICAgIH0KIAotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gaXNCbG9iX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzU3RyaW5nX25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzSW50ZWdlcl9uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBpc0Zsb2F0X25hdGl2ZShpbnQgcm93LCBpbnQgY29sKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgZ2V0VHlwZV9uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgU3RyaW5nIGZvciB0aGUgZ2l2ZW4gZmllbGQuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXcmFwcGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXcmFwcGVyLmphdmEKaW5kZXggZjBhYTdkNy4uM2MzYmQ0MyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yV3JhcHBlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldyYXBwZXIuamF2YQpAQCAtMTcsMjggKzE3LDI2IEBACiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ2hhckFycmF5QnVmZmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIAotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KIC8qKgotICogV3JhcHBlciBjbGFzcyBmb3IgQ3Vyc29yIHRoYXQgZGVsZWdhdGVzIGFsbCBjYWxscyB0byB0aGUgYWN0dWFsIGN1cnNvciBvYmplY3QKKyAqIFdyYXBwZXIgY2xhc3MgZm9yIEN1cnNvciB0aGF0IGRlbGVnYXRlcyBhbGwgY2FsbHMgdG8gdGhlIGFjdHVhbCBjdXJzb3Igb2JqZWN0LiAgVGhlIHByaW1hcnkKKyAqIHVzZSBmb3IgdGhpcyBjbGFzcyBpcyB0byBleHRlbmQgYSBjdXJzb3Igd2hpbGUgb3ZlcnJpZGluZyBvbmx5IGEgc3Vic2V0IG9mIGl0cyBtZXRob2RzLgogICovCi0KIHB1YmxpYyBjbGFzcyBDdXJzb3JXcmFwcGVyIGltcGxlbWVudHMgQ3Vyc29yIHsKIAorICAgIHByaXZhdGUgZmluYWwgQ3Vyc29yIG1DdXJzb3I7CisKICAgICBwdWJsaWMgQ3Vyc29yV3JhcHBlcihDdXJzb3IgY3Vyc29yKSB7CiAgICAgICAgIG1DdXJzb3IgPSBjdXJzb3I7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqIEByZXR1cm4gdGhlIHdyYXBwZWQgY3Vyc29yCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgYWJvcnRVcGRhdGVzKCkgewotICAgICAgICBtQ3Vyc29yLmFib3J0VXBkYXRlcygpOworICAgIHB1YmxpYyBDdXJzb3IgZ2V0V3JhcHBlZEN1cnNvcigpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJzb3I7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CkBAIC00OSwyMyArNDcsNiBAQAogICAgICAgICByZXR1cm4gbUN1cnNvci5pc0Nsb3NlZCgpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKCkgewotICAgICAgICByZXR1cm4gbUN1cnNvci5jb21taXRVcGRhdGVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoCi0gICAgICAgICAgICBNYXA8PyBleHRlbmRzIExvbmcsID8gZXh0ZW5kcyBNYXA8U3RyaW5nLCBPYmplY3Q+PiB2YWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuY29tbWl0VXBkYXRlcyh2YWx1ZXMpOwotICAgIH0KLQogICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldENvdW50KCk7CiAgICAgfQpAQCAtNzQsMTQgKzU1LDYgQEAKICAgICAgICAgbUN1cnNvci5kZWFjdGl2YXRlKCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuZGVsZXRlUm93KCk7Ci0gICAgfQotCiAgICAgcHVibGljIGJvb2xlYW4gbW92ZVRvRmlyc3QoKSB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLm1vdmVUb0ZpcnN0KCk7CiAgICAgfQpAQCAtMTQ3LDE0ICsxMjAsNiBAQAogICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRXYW50c0FsbE9uTW92ZUNhbGxzKCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1VwZGF0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmhhc1VwZGF0ZXMoKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyTGFzdCgpIHsKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuaXNBZnRlckxhc3QoKTsKICAgICB9CkBAIC0xNzEsNiArMTM2LDEwIEBACiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmlzTGFzdCgpOwogICAgIH0KIAorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0VHlwZShjb2x1bW5JbmRleCk7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW5JbmRleCkgewogICAgICAgICByZXR1cm4gbUN1cnNvci5pc051bGwoY29sdW1uSW5kZXgpOwogICAgIH0KQEAgLTIxOSwxNCArMTg4LDYgQEAKICAgICAgICAgbUN1cnNvci5zZXROb3RpZmljYXRpb25VcmkoY3IsIHVyaSk7ICAgICAgICAKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNVcGRhdGVzKCkgewotICAgICAgICByZXR1cm4gbUN1cnNvci5zdXBwb3J0c1VwZGF0ZXMoKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKENvbnRlbnRPYnNlcnZlciBvYnNlcnZlcikgewogICAgICAgICBtQ3Vyc29yLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIob2JzZXJ2ZXIpOyAgICAgICAgCiAgICAgfQpAQCAtMjM0LDcyICsxOTUsNSBAQAogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIoRGF0YVNldE9ic2VydmVyIG9ic2VydmVyKSB7CiAgICAgICAgIG1DdXJzb3IudW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihvYnNlcnZlcik7CiAgICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZURvdWJsZShpbnQgY29sdW1uSW5kZXgsIGRvdWJsZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVEb3VibGUoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlRmxvYXQoaW50IGNvbHVtbkluZGV4LCBmbG9hdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVGbG9hdChjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVJbnQoaW50IGNvbHVtbkluZGV4LCBpbnQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlSW50KGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUxvbmcoaW50IGNvbHVtbkluZGV4LCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZUxvbmcoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlU2hvcnQoaW50IGNvbHVtbkluZGV4LCBzaG9ydCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVTaG9ydChjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVTdHJpbmcoaW50IGNvbHVtbkluZGV4LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlU3RyaW5nKGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUJsb2IoaW50IGNvbHVtbkluZGV4LCBieXRlW10gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlQmxvYihjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVUb051bGwoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZVRvTnVsbChjb2x1bW5JbmRleCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgQ3Vyc29yIG1DdXJzb3I7Ci0gICAgCiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFTZXRPYnNlcnZhYmxlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhU2V0T2JzZXJ2YWJsZS5qYXZhCmluZGV4IDkyMDBlODEuLjUxYzcyYzEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFTZXRPYnNlcnZhYmxlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YVNldE9ic2VydmFibGUuamF2YQpAQCAtMjcsOCArMjcsMTIgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQobU9ic2VydmVycykgewotICAgICAgICAgICAgZm9yIChEYXRhU2V0T2JzZXJ2ZXIgb2JzZXJ2ZXIgOiBtT2JzZXJ2ZXJzKSB7Ci0gICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25DaGFuZ2VkKCk7CisgICAgICAgICAgICAvLyBzaW5jZSBvbkNoYW5nZWQoKSBpcyBpbXBsZW1lbnRlZCBieSB0aGUgYXBwLCBpdCBjb3VsZCBkbyBhbnl0aGluZywgaW5jbHVkaW5nCisgICAgICAgICAgICAvLyByZW1vdmluZyBpdHNlbGYgZnJvbSB7QGxpbmsgbU9ic2VydmVyc30gLSBhbmQgdGhhdCBjb3VsZCBjYXVzZSBwcm9ibGVtcyBpZgorICAgICAgICAgICAgLy8gYW4gaXRlcmF0b3IgaXMgdXNlZCBvbiB0aGUgQXJyYXlMaXN0IHtAbGluayBtT2JzZXJ2ZXJzfS4KKyAgICAgICAgICAgIC8vIHRvIGF2b2lkIHN1Y2ggcHJvYmxlbXMsIGp1c3QgbWFyY2ggdGhydSB0aGUgbGlzdCBpbiB0aGUgcmV2ZXJzZSBvcmRlci4KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtT2JzZXJ2ZXJzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgbU9ic2VydmVycy5nZXQoaSkub25DaGFuZ2VkKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zOSw4ICs0Myw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbm90aWZ5SW52YWxpZGF0ZWQoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobU9ic2VydmVycykgewotICAgICAgICAgICAgZm9yIChEYXRhU2V0T2JzZXJ2ZXIgb2JzZXJ2ZXIgOiBtT2JzZXJ2ZXJzKSB7Ci0gICAgICAgICAgICAgICAgb2JzZXJ2ZXIub25JbnZhbGlkYXRlZCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1PYnNlcnZlcnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBtT2JzZXJ2ZXJzLmdldChpKS5vbkludmFsaWRhdGVkKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUVycm9ySGFuZGxlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGM1NDUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOworCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CisKKy8qKgorICogQW4gaW50ZXJmYWNlIHRvIGxldCB0aGUgYXBwcyBkZWZpbmUgdGhlIGFjdGlvbnMgdG8gdGFrZSB3aGVuIHRoZSBmb2xsb3dpbmcgZXJyb3JzIGFyZSBkZXRlY3RlZAorICogICBkYXRhYmFzZSBjb3JydXB0aW9uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGF0YWJhc2VFcnJvckhhbmRsZXIgeworCisgICAgLyoqCisgICAgICogZGVmaW5lcyB0aGUgbWV0aG9kIHRvIGJlIGludm9rZWQgd2hlbiBkYXRhYmFzZSBjb3JydXB0aW9uIGlzIGRldGVjdGVkLgorICAgICAqIEBwYXJhbSBkYk9iaiB0aGUge0BsaW5rIFNRTGl0ZURhdGFiYXNlfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkYXRhYmFzZSBvbiB3aGljaCBjb3JydXB0aW9uCisgICAgICogaXMgZGV0ZWN0ZWQuCisgICAgICovCisgICAgdm9pZCBvbkNvcnJ1cHRpb24oU1FMaXRlRGF0YWJhc2UgZGJPYmopOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VVdGlscy5qYXZhCmluZGV4IDk1ZmMxZmQuLjcwYTdmYjYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZVV0aWxzLmphdmEKQEAgLTMxLDYgKzMxLDcgQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVQcm9ncmFtOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVN0YXRlbWVudDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtNTAsNiArNTEsMjkgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9MT0dWID0gREVCVUcgPyBDb25maWcuTE9HRCA6IENvbmZpZy5MT0dWOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gY291bnRQcm9qZWN0aW9uID0gbmV3IFN0cmluZ1tdeyJjb3VudCgqKSJ9OworCisgICAgLyoqIE9uZSBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3FsU3RhdGVtZW50VHlwZShTdHJpbmcpfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURU1FTlRfU0VMRUNUID0gMTsKKyAgICAvKiogT25lIG9mIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTcWxTdGF0ZW1lbnRUeXBlKFN0cmluZyl9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTUVOVF9VUERBVEUgPSAyOworICAgIC8qKiBPbmUgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX0FUVEFDSCA9IDM7CisgICAgLyoqIE9uZSBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3FsU3RhdGVtZW50VHlwZShTdHJpbmcpfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURU1FTlRfQkVHSU4gPSA0OworICAgIC8qKiBPbmUgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX0NPTU1JVCA9IDU7CisgICAgLyoqIE9uZSBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3FsU3RhdGVtZW50VHlwZShTdHJpbmcpfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURU1FTlRfQUJPUlQgPSA2OworICAgIC8qKiBPbmUgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX1BSQUdNQSA9IDc7CisgICAgLyoqIE9uZSBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3FsU3RhdGVtZW50VHlwZShTdHJpbmcpfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURU1FTlRfRERMID0gODsKKyAgICAvKiogT25lIG9mIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTcWxTdGF0ZW1lbnRUeXBlKFN0cmluZyl9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTUVOVF9VTlBSRVBBUkVEID0gOTsKKyAgICAvKiogT25lIG9mIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTcWxTdGF0ZW1lbnRUeXBlKFN0cmluZyl9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTUVOVF9PVEhFUiA9IDk5OworCiAgICAgLyoqCiAgICAgICogU3BlY2lhbCBmdW5jdGlvbiBmb3Igd3JpdGluZyBhbiBleGNlcHRpb24gcmVzdWx0IGF0IHRoZSBoZWFkZXIgb2YKICAgICAgKiBhIHBhcmNlbCwgdG8gYmUgdXNlZCB3aGVuIHJldHVybmluZyBhbiBleGNlcHRpb24gZnJvbSBhIHRyYW5zYWN0aW9uLgpAQCAtMTkxLDYgKzIxNSwzNyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybnMgZGF0YSB0eXBlIG9mIHRoZSBnaXZlbiBvYmplY3QncyB2YWx1ZS4KKyAgICAgKjxwPgorICAgICAqIFJldHVybmVkIHZhbHVlcyBhcmUKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX05VTEx9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfSU5URUdFUn08L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9GTE9BVH08L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9TVFJJTkd9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfQkxPQn08L2xpPgorICAgICAqPC91bD4KKyAgICAgKjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB3aG9zZSB2YWx1ZSB0eXBlIGlzIHRvIGJlIHJldHVybmVkCisgICAgICogQHJldHVybiBvYmplY3QgdmFsdWUgdHlwZQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VHlwZU9mT2JqZWN0KE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gQ3Vyc29yLkZJRUxEX1RZUEVfTlVMTDsKKyAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBieXRlW10pIHsKKyAgICAgICAgICAgIHJldHVybiBDdXJzb3IuRklFTERfVFlQRV9CTE9COworICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEZsb2F0IHx8IG9iaiBpbnN0YW5jZW9mIERvdWJsZSkgeworICAgICAgICAgICAgcmV0dXJuIEN1cnNvci5GSUVMRF9UWVBFX0ZMT0FUOworICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIExvbmcgfHwgb2JqIGluc3RhbmNlb2YgSW50ZWdlcikgeworICAgICAgICAgICAgcmV0dXJuIEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQ3Vyc29yLkZJRUxEX1RZUEVfU1RSSU5HOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQXBwZW5kcyBhbiBTUUwgc3RyaW5nIHRvIHRoZSBnaXZlbiBTdHJpbmdCdWlsZGVyLCBpbmNsdWRpbmcgdGhlIG9wZW5pbmcKICAgICAgKiBhbmQgY2xvc2luZyBzaW5nbGUgcXVvdGVzLiBBbnkgc2luZ2xlIHF1b3RlcyBpbnRlcm5hbCB0byBzcWxTdHJpbmcgd2lsbAogICAgICAqIGJlIGVzY2FwZWQuCkBAIC02NTYsMTQgKzcxMSw4IEBACiAgICAgICogZmlyc3QgY29sdW1uIG9mIHRoZSBmaXJzdCByb3cuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBsb25nIGxvbmdGb3JRdWVyeShTUUxpdGVTdGF0ZW1lbnQgcHJvZywgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgewotICAgICAgICBpZiAoc2VsZWN0aW9uQXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IHNlbGVjdGlvbkFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBiaW5kT2JqZWN0VG9Qcm9ncmFtKHByb2csIGkgKyAxLCBzZWxlY3Rpb25BcmdzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsb25nIHZhbHVlID0gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKLSAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICBwcm9nLmJpbmRBbGxBcmdzQXNTdHJpbmdzKHNlbGVjdGlvbkFyZ3MpOworICAgICAgICByZXR1cm4gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTY4NCwxNCArNzMzLDM2IEBACiAgICAgICogZmlyc3QgY29sdW1uIG9mIHRoZSBmaXJzdCByb3cuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaW5nRm9yUXVlcnkoU1FMaXRlU3RhdGVtZW50IHByb2csIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKLSAgICAgICAgaWYgKHNlbGVjdGlvbkFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHNpemUgPSBzZWxlY3Rpb25BcmdzLmxlbmd0aDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYmluZE9iamVjdFRvUHJvZ3JhbShwcm9nLCBpICsgMSwgc2VsZWN0aW9uQXJnc1tpXSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIHByb2cuYmluZEFsbEFyZ3NBc1N0cmluZ3Moc2VsZWN0aW9uQXJncyk7CisgICAgICAgIHJldHVybiBwcm9nLnNpbXBsZVF1ZXJ5Rm9yU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgdG8gcnVuIHRoZSBxdWVyeSBvbiB0aGUgZGIgYW5kIHJldHVybiB0aGUgYmxvYiB2YWx1ZSBpbiB0aGUKKyAgICAgKiBmaXJzdCBjb2x1bW4gb2YgdGhlIGZpcnN0IHJvdy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSByZWFkLW9ubHkgZmlsZSBkZXNjcmlwdG9yIGZvciBhIGNvcHkgb2YgdGhlIGJsb2IgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYXJjZWxGaWxlRGVzY3JpcHRvciBibG9iRmlsZURlc2NyaXB0b3JGb3JRdWVyeShTUUxpdGVEYXRhYmFzZSBkYiwKKyAgICAgICAgICAgIFN0cmluZyBxdWVyeSwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgeworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IGRiLmNvbXBpbGVTdGF0ZW1lbnQocXVlcnkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGJsb2JGaWxlRGVzY3JpcHRvckZvclF1ZXJ5KHByb2csIHNlbGVjdGlvbkFyZ3MpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcHJvZy5jbG9zZSgpOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IHByb2cuc2ltcGxlUXVlcnlGb3JTdHJpbmcoKTsKLSAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIHJ1biB0aGUgcHJlLWNvbXBpbGVkIHF1ZXJ5IGFuZCByZXR1cm4gdGhlIGJsb2IgdmFsdWUgaW4gdGhlCisgICAgICogZmlyc3QgY29sdW1uIG9mIHRoZSBmaXJzdCByb3cuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgcmVhZC1vbmx5IGZpbGUgZGVzY3JpcHRvciBmb3IgYSBjb3B5IG9mIHRoZSBibG9iIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGFyY2VsRmlsZURlc2NyaXB0b3IgYmxvYkZpbGVEZXNjcmlwdG9yRm9yUXVlcnkoU1FMaXRlU3RhdGVtZW50IHByb2csCisgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CisgICAgICAgIHByb2cuYmluZEFsbEFyZ3NBc1N0cmluZ3Moc2VsZWN0aW9uQXJncyk7CisgICAgICAgIHJldHVybiBwcm9nLnNpbXBsZVF1ZXJ5Rm9yQmxvYkZpbGVEZXNjcmlwdG9yKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MDQsOCArNzc1LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KEN1cnNvciBjdXJzb3IsIENvbnRlbnRWYWx1ZXMgdmFsdWVzLAogICAgICAgICAgICAgU3RyaW5nIGNvbHVtbikgewotICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KGNvbHVtbik7Ci0gICAgICAgIGlmICghY3Vyc29yLmlzTnVsbChpbmRleCkpIHsKKyAgICAgICAgZmluYWwgaW50IGluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KGNvbHVtbik7CisgICAgICAgIGlmIChpbmRleCAhPSAtMSAmJiAhY3Vyc29yLmlzTnVsbChpbmRleCkpIHsKICAgICAgICAgICAgIHZhbHVlcy5wdXQoY29sdW1uLCBjdXJzb3IuZ2V0U3RyaW5nKGluZGV4KSk7CiAgICAgICAgIH0KICAgICB9CkBAIC03MjAsOCArNzkxLDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3Vyc29yTG9uZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChDdXJzb3IgY3Vyc29yLCBDb250ZW50VmFsdWVzIHZhbHVlcywKICAgICAgICAgICAgIFN0cmluZyBjb2x1bW4pIHsKLSAgICAgICAgZmluYWwgaW50IGluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4T3JUaHJvdyhjb2x1bW4pOwotICAgICAgICBpZiAoIWN1cnNvci5pc051bGwoaW5kZXgpKSB7CisgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChjb2x1bW4pOworICAgICAgICBpZiAoaW5kZXggIT0gLTEgJiYgIWN1cnNvci5pc051bGwoaW5kZXgpKSB7CiAgICAgICAgICAgICB2YWx1ZXMucHV0KGNvbHVtbiwgY3Vyc29yLmdldExvbmcoaW5kZXgpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTczNiw4ICs4MDcsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjdXJzb3JTaG9ydFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChDdXJzb3IgY3Vyc29yLCBDb250ZW50VmFsdWVzIHZhbHVlcywKICAgICAgICAgICAgIFN0cmluZyBjb2x1bW4pIHsKLSAgICAgICAgZmluYWwgaW50IGluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4T3JUaHJvdyhjb2x1bW4pOwotICAgICAgICBpZiAoIWN1cnNvci5pc051bGwoaW5kZXgpKSB7CisgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChjb2x1bW4pOworICAgICAgICBpZiAoaW5kZXggIT0gLTEgJiYgIWN1cnNvci5pc051bGwoaW5kZXgpKSB7CiAgICAgICAgICAgICB2YWx1ZXMucHV0KGNvbHVtbiwgY3Vyc29yLmdldFNob3J0KGluZGV4KSk7CiAgICAgICAgIH0KICAgICB9CkBAIC03NTIsOCArODIzLDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KEN1cnNvciBjdXJzb3IsIENvbnRlbnRWYWx1ZXMgdmFsdWVzLAogICAgICAgICAgICAgU3RyaW5nIGNvbHVtbikgewotICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KGNvbHVtbik7Ci0gICAgICAgIGlmICghY3Vyc29yLmlzTnVsbChpbmRleCkpIHsKKyAgICAgICAgZmluYWwgaW50IGluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KGNvbHVtbik7CisgICAgICAgIGlmIChpbmRleCAhPSAtMSAmJiAhY3Vyc29yLmlzTnVsbChpbmRleCkpIHsKICAgICAgICAgICAgIHZhbHVlcy5wdXQoY29sdW1uLCBjdXJzb3IuZ2V0SW50KGluZGV4KSk7CiAgICAgICAgIH0KICAgICB9CkBAIC03NjgsOCArODM5LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3Vyc29yRmxvYXRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoQ3Vyc29yIGN1cnNvciwgQ29udGVudFZhbHVlcyB2YWx1ZXMsCiAgICAgICAgICAgICBTdHJpbmcgY29sdW1uKSB7Ci0gICAgICAgIGZpbmFsIGludCBpbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coY29sdW1uKTsKLSAgICAgICAgaWYgKCFjdXJzb3IuaXNOdWxsKGluZGV4KSkgeworICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoY29sdW1uKTsKKyAgICAgICAgaWYgKGluZGV4ICE9IC0xICYmICFjdXJzb3IuaXNOdWxsKGluZGV4KSkgewogICAgICAgICAgICAgdmFsdWVzLnB1dChjb2x1bW4sIGN1cnNvci5nZXRGbG9hdChpbmRleCkpOwogICAgICAgICB9CiAgICAgfQpAQCAtNzg0LDggKzg1NSw4IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGN1cnNvckRvdWJsZVRvQ29udGVudFZhbHVlc0lmUHJlc2VudChDdXJzb3IgY3Vyc29yLCBDb250ZW50VmFsdWVzIHZhbHVlcywKICAgICAgICAgICAgIFN0cmluZyBjb2x1bW4pIHsKLSAgICAgICAgZmluYWwgaW50IGluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4T3JUaHJvdyhjb2x1bW4pOwotICAgICAgICBpZiAoIWN1cnNvci5pc051bGwoaW5kZXgpKSB7CisgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChjb2x1bW4pOworICAgICAgICBpZiAoaW5kZXggIT0gLTEgJiYgIWN1cnNvci5pc051bGwoaW5kZXgpKSB7CiAgICAgICAgICAgICB2YWx1ZXMucHV0KGNvbHVtbiwgY3Vyc29yLmdldERvdWJsZShpbmRleCkpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTE1Miw0ICsxMjIzLDY2IEBACiAgICAgICAgIGRiLnNldFZlcnNpb24oZGJWZXJzaW9uKTsKICAgICAgICAgZGIuY2xvc2UoKTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIHdoaWNoIHJlcHJlc2VudCB0aGUgdHlwZSBvZiB0aGUgZ2l2ZW4gU1FMIHN0YXRlbWVudC4KKyAgICAgKiA8b2w+CisgICAgICogICA8bGk+e0BsaW5rICNTVEFURU1FTlRfU0VMRUNUfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNTVEFURU1FTlRfVVBEQVRFfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNTVEFURU1FTlRfQVRUQUNIfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNTVEFURU1FTlRfQkVHSU59PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI1NUQVRFTUVOVF9DT01NSVR9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI1NUQVRFTUVOVF9BQk9SVH08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjU1RBVEVNRU5UX09USEVSfTwvbGk+CisgICAgICogPC9vbD4KKyAgICAgKiBAcGFyYW0gc3FsIHRoZSBTUUwgc3RhdGVtZW50IHdob3NlIHR5cGUgaXMgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QKKyAgICAgKiBAcmV0dXJuIG9uZSBvZiB0aGUgdmFsdWVzIGxpc3RlZCBhYm92ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nIHNxbCkgeworICAgICAgICBzcWwgPSBzcWwudHJpbSgpOworICAgICAgICBpZiAoc3FsLmxlbmd0aCgpIDwgMykgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcHJlZml4U3FsID0gc3FsLnN1YnN0cmluZygwLCAzKS50b1VwcGVyQ2FzZSgpOworICAgICAgICBpZiAocHJlZml4U3FsLmVxdWFscygiU0VMIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfU0VMRUNUOworICAgICAgICB9IGVsc2UgaWYgKHByZWZpeFNxbC5lcXVhbHMoIklOUyIpIHx8CisgICAgICAgICAgICAgICAgcHJlZml4U3FsLmVxdWFscygiVVBEIikgfHwKKyAgICAgICAgICAgICAgICBwcmVmaXhTcWwuZXF1YWxzKCJSRVAiKSB8fAorICAgICAgICAgICAgICAgIHByZWZpeFNxbC5lcXVhbHMoIkRFTCIpKSB7CisgICAgICAgICAgICByZXR1cm4gU1RBVEVNRU5UX1VQREFURTsKKyAgICAgICAgfSBlbHNlIGlmIChwcmVmaXhTcWwuZXF1YWxzKCJBVFQiKSkgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9BVFRBQ0g7CisgICAgICAgIH0gZWxzZSBpZiAocHJlZml4U3FsLmVxdWFscygiQ09NIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfQ09NTUlUOworICAgICAgICB9IGVsc2UgaWYgKHByZWZpeFNxbC5lcXVhbHMoIkVORCIpKSB7CisgICAgICAgICAgICByZXR1cm4gU1RBVEVNRU5UX0NPTU1JVDsKKyAgICAgICAgfSBlbHNlIGlmIChwcmVmaXhTcWwuZXF1YWxzKCJST0wiKSkgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9BQk9SVDsKKyAgICAgICAgfSBlbHNlIGlmIChwcmVmaXhTcWwuZXF1YWxzKCJCRUciKSkgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9CRUdJTjsKKyAgICAgICAgfSBlbHNlIGlmIChwcmVmaXhTcWwuZXF1YWxzKCJQUkEiKSkgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9QUkFHTUE7CisgICAgICAgIH0gZWxzZSBpZiAocHJlZml4U3FsLmVxdWFscygiQ1JFIikgfHwgcHJlZml4U3FsLmVxdWFscygiRFJPIikgfHwKKyAgICAgICAgICAgICAgICBwcmVmaXhTcWwuZXF1YWxzKCJBTFQiKSkgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9EREw7CisgICAgICAgIH0gZWxzZSBpZiAocHJlZml4U3FsLmVxdWFscygiQU5BIikgfHwgcHJlZml4U3FsLmVxdWFscygiREVUIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfVU5QUkVQQVJFRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU1RBVEVNRU5UX09USEVSOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZHMgb25lIHNldCBvZiBzZWxlY3Rpb24gYXJncyB0byBhbm90aGVyLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGFkZGluZyBhIHNlbGVjdGlvbgorICAgICAqIGFyZ3VtZW50IHRvIGEgdXNlciBwcm92aWRlZCBzZXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBhcHBlbmRTZWxlY3Rpb25BcmdzKFN0cmluZ1tdIG9yaWdpbmFsVmFsdWVzLCBTdHJpbmdbXSBuZXdWYWx1ZXMpIHsKKyAgICAgICAgaWYgKG9yaWdpbmFsVmFsdWVzID09IG51bGwgfHwgb3JpZ2luYWxWYWx1ZXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZXM7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tvcmlnaW5hbFZhbHVlcy5sZW5ndGggKyBuZXdWYWx1ZXMubGVuZ3RoIF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZ2luYWxWYWx1ZXMsIDAsIHJlc3VsdCwgMCwgb3JpZ2luYWxWYWx1ZXMubGVuZ3RoKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShuZXdWYWx1ZXMsIDAsIHJlc3VsdCwgb3JpZ2luYWxWYWx1ZXMubGVuZ3RoLCBuZXdWYWx1ZXMubGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MTllNDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CisKKy8qKgorICogRGVmYXVsdCBjbGFzcyB1c2VkIGRlZmluaW5nIHRoZSBhY3Rpb25zIHRvIHRha2Ugd2hlbiB0aGUgZm9sbG93aW5nIGVycm9ycyBhcmUgZGV0ZWN0ZWQKKyAqICAgZGF0YWJhc2UgY29ycnVwdGlvbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRGF0YWJhc2VFcnJvckhhbmRsZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIiOworCisgICAgLyoqCisgICAgICogZGVmaW5lcyB0aGUgZGVmYXVsdCBtZXRob2QgdG8gYmUgaW52b2tlZCB3aGVuIGRhdGFiYXNlIGNvcnJ1cHRpb24gaXMgZGV0ZWN0ZWQuCisgICAgICogQHBhcmFtIGRiT2JqIHRoZSB7QGxpbmsgU1FMaXRlRGF0YWJhc2V9IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRhdGFiYXNlIG9uIHdoaWNoIGNvcnJ1cHRpb24KKyAgICAgKiBpcyBkZXRlY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNvcnJ1cHRpb24oU1FMaXRlRGF0YWJhc2UgZGJPYmopIHsKKyAgICAgICAgTG9nLmUoVEFHLCAiQ29ycnVwdGlvbiByZXBvcnRlZCBieSBzcWxpdGUgb24gZGF0YWJhc2U6ICIgKyBkYk9iai5nZXRQYXRoKCkpOworCisgICAgICAgIC8vIGlzIHRoZSBjb3JydXB0aW9uIGRldGVjdGVkIGV2ZW4gYmVmb3JlIGRhdGFiYXNlIGNvdWxkIGJlICdvcGVuZWQnPworICAgICAgICBpZiAoIWRiT2JqLmlzT3BlbigpKSB7CisgICAgICAgICAgICAvLyBkYXRhYmFzZSBmaWxlcyBhcmUgbm90IGV2ZW4gb3BlbmFibGUuIGRlbGV0ZSB0aGlzIGRhdGFiYXNlIGZpbGUuCisgICAgICAgICAgICAvLyBOT1RFIGlmIHRoZSBkYXRhYmFzZSBoYXMgYXR0YWNoZWQgZGF0YWJhc2VzLCB0aGVuIGFueSBvZiB0aGVtIGNvdWxkIGJlIGNvcnJ1cHQuCisgICAgICAgICAgICAvLyBhbmQgbm90IGRlbGV0aW5nIGFsbCBvZiB0aGVtIGNvdWxkIGNhdXNlIGNvcnJ1cHRlZCBkYXRhYmFzZSBmaWxlIHRvIHJlbWFpbiBhbmQgCisgICAgICAgICAgICAvLyBtYWtlIHRoZSBhcHBsaWNhdGlvbiBjcmFzaCBvbiBkYXRhYmFzZSBvcGVuIG9wZXJhdGlvbi4gVG8gYXZvaWQgdGhpcyBwcm9ibGVtLAorICAgICAgICAgICAgLy8gdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBwcm92aWRlIGl0cyBvd24ge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSBpbXBsIGNsYXNzCisgICAgICAgICAgICAvLyB0byBkZWxldGUgQUxMIGZpbGVzIG9mIHRoZSBkYXRhYmFzZSAoaW5jbHVkaW5nIHRoZSBhdHRhY2hlZCBkYXRhYmFzZXMpLgorICAgICAgICAgICAgZGVsZXRlRGF0YWJhc2VGaWxlKGRiT2JqLmdldFBhdGgoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGF0dGFjaGVkRGJzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIENsb3NlIHRoZSBkYXRhYmFzZSwgd2hpY2ggd2lsbCBjYXVzZSBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgdG8gZmFpbC4KKyAgICAgICAgICAgIC8vIGJlZm9yZSB0aGF0LCBnZXQgdGhlIGF0dGFjaGVkIGRhdGFiYXNlIGxpc3QgZmlyc3QuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGF0dGFjaGVkRGJzID0gZGJPYmouZ2V0QXR0YWNoZWREYnMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLyogaWdub3JlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRiT2JqLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAqLworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gRGVsZXRlIGFsbCBmaWxlcyBvZiB0aGlzIGNvcnJ1cHQgZGF0YWJhc2UgYW5kL29yIGF0dGFjaGVkIGRhdGFiYXNlcworICAgICAgICAgICAgaWYgKGF0dGFjaGVkRGJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFBhaXI8U3RyaW5nLCBTdHJpbmc+IHAgOiBhdHRhY2hlZERicykgeworICAgICAgICAgICAgICAgICAgICBkZWxldGVEYXRhYmFzZUZpbGUocC5zZWNvbmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gYXR0YWNoZWREYnMgPSBudWxsIGlzIHBvc3NpYmxlIHdoZW4gdGhlIGRhdGFiYXNlIGlzIHNvIGNvcnJ1cHQgdGhhdCBldmVuCisgICAgICAgICAgICAgICAgLy8gIlBSQUdNQSBkYXRhYmFzZV9saXN0OyIgYWxzbyBmYWlscy4gZGVsZXRlIHRoZSBtYWluIGRhdGFiYXNlIGZpbGUKKyAgICAgICAgICAgICAgICBkZWxldGVEYXRhYmFzZUZpbGUoZGJPYmouZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWxldGVEYXRhYmFzZUZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7CisgICAgICAgIGlmIChmaWxlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCI6bWVtb3J5OiIpIHx8IGZpbGVOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTG9nLmUoVEFHLCAiZGVsZXRpbmcgdGhlIGRhdGFiYXNlIGZpbGU6ICIgKyBmaWxlTmFtZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRmlsZShmaWxlTmFtZSkuZGVsZXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvKiBwcmludCB3YXJuaW5nIGFuZCBpZ25vcmUgZXhjZXB0aW9uICovCisgICAgICAgICAgICBMb2cudyhUQUcsICJkZWxldGUgZmFpbGVkOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvSUJ1bGtDdXJzb3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0lCdWxrQ3Vyc29yLmphdmEKaW5kZXggNDY3OTBhMy4uMjQ0Yzg4ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvSUJ1bGtDdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9JQnVsa0N1cnNvci5qYXZhCkBAIC0xNiwxNiArMTYsMTQgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOwogCi1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSUludGVyZmFjZTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAKIC8qKgogICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgYSBsb3ctbGV2ZWwgd2F5IHRvIHBhc3MgYnVsayBjdXJzb3IgZGF0YSBhY3Jvc3MKLSAqIGJvdGggcHJvY2VzcyBhbmQgbGFuZ3VhZ2UgYm91bmRyaWVzLiBBcHBsaWNhdGlvbiBjb2RlIHNob3VsZCB1c2UgdGhlIEN1cnNvcgorICogYm90aCBwcm9jZXNzIGFuZCBsYW5ndWFnZSBib3VuZGFyaWVzLiBBcHBsaWNhdGlvbiBjb2RlIHNob3VsZCB1c2UgdGhlIEN1cnNvcgogICogaW50ZXJmYWNlIGRpcmVjdGx5LgogICoKICAqIHtAaGlkZX0KQEAgLTU0LDEwICs1Miw2IEBACiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKIAotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVJvd3MoTWFwPD8gZXh0ZW5kcyBMb25nLCA/IGV4dGVuZHMgTWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwotCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KGludCBwb3NpdGlvbikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKLQogICAgIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwpAQCAtNzYsOCArNzAsNiBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0NVUlNPUl9XSU5ET1dfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT047CiAgICAgc3RhdGljIGZpbmFsIGludCBDT1VOVF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE7CiAgICAgc3RhdGljIGZpbmFsIGludCBHRVRfQ09MVU1OX05BTUVTX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IFVQREFURV9ST1dTX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IERFTEVURV9ST1dfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA0OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgREVBQ1RJVkFURV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDU7CiAgICAgc3RhdGljIGZpbmFsIGludCBSRVFVRVJZX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNjsKICAgICBzdGF0aWMgZmluYWwgaW50IE9OX01PVkVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA3OwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWF0cml4Q3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9NYXRyaXhDdXJzb3IuamF2YQppbmRleCBkNWMzYTMyLi41YzFiOTY4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9NYXRyaXhDdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9NYXRyaXhDdXJzb3IuamF2YQpAQCAtMjcyLDYgKzI3MiwxMSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uKSB7CisgICAgICAgIHJldHVybiBEYXRhYmFzZVV0aWxzLmdldFR5cGVPZk9iamVjdChnZXQoY29sdW1uKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCBjb2x1bW4pIHsKICAgICAgICAgcmV0dXJuIGdldChjb2x1bW4pID09IG51bGw7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWVyZ2VDdXJzb3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01lcmdlQ3Vyc29yLmphdmEKaW5kZXggNzIyZDcwNy4uMmMyNWRiNyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWVyZ2VDdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9NZXJnZUN1cnNvci5qYXZhCkBAIC05MiwzMiArOTIsNiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpCi0gICAgewotICAgICAgICByZXR1cm4gbUN1cnNvci5kZWxldGVSb3coKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoKSB7Ci0gICAgICAgIGludCBsZW5ndGggPSBtQ3Vyc29ycy5sZW5ndGg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGxlbmd0aCA7IGkrKykgewotICAgICAgICAgICAgaWYgKG1DdXJzb3JzW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ3Vyc29yc1tpXS5jb21taXRVcGRhdGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgb25DaGFuZ2UodHJ1ZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGludCBjb2x1bW4pCiAgICAgewpAQCAtMTU1LDYgKzEyOSwxMSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uKSB7CisgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldFR5cGUoY29sdW1uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc051bGwoaW50IGNvbHVtbikKICAgICB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmlzTnVsbChjb2x1bW4pOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvUmVxdWVyeU9uVWlUaHJlYWRFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL1JlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhNTBkOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL1JlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKKworLyoqCisgKiBBbiBleGNlcHRpb24gdGhhdCBpbmRpY2F0ZXMgaW52b2tpbmcge0BsaW5rIEN1cnNvciNyZXF1ZXJ5KCl9IG9uIE1haW4gdGhyZWFkIGNvdWxkIGNhdXNlIEFOUi4KKyAqIFRoaXMgZXhjZXB0aW9uIHNob3VsZCBlbmNvdXJhZ2UgYXBwcyB0byBpbnZva2Uge0BsaW5rIEN1cnNvciNyZXF1ZXJ5KCl9IGluIGEgYmFja2dyb3VuZCB0aHJlYWQuIAorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIFJlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFJlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uKFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICBzdXBlcigiSW4gIiArIHBhY2thZ2VOYW1lICsgIiBSZXF1ZXJ5IGlzIGV4ZWN1dGluZyBvbiBtYWluIChVSSkgdGhyZWFkLiBjb3VsZCBjYXVzZSBBTlIuICIgKworICAgICAgICAgICAgICAgICJkbyBpdCBpbiBiYWNrZ3JvdW5kIHRocmVhZC4iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VDb25uZWN0aW9uUG9vbC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlQ29ubmVjdGlvblBvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWE5ZDIzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlQ29ubmVjdGlvblBvb2wuamF2YQpAQCAtMCwwICsxLDM0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCisvKioKKyAqIEEgY29ubmVjdGlvbiBwb29sIHRvIGJlIHVzZWQgYnkgcmVhZGVycy4KKyAqIE5vdGUgdGhhdCBlYWNoIGNvbm5lY3Rpb24gY2FuIGJlIHVzZWQgYnkgb25seSBvbmUgcmVhZGVyIGF0IGEgdGltZS4KKyAqLworLyogcGFja2FnZSAqLyBjbGFzcyBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGF0YWJhc2VDb25uZWN0aW9uUG9vbCI7CisKKyAgICAvKiogVGhlIGRlZmF1bHQgY29ubmVjdGlvbiBwb29sIHNpemUuICovCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgbU1heFBvb2xTaXplID0KKyAgICAgICAgUmVzb3VyY2VzLmdldFN5c3RlbSgpLmdldEludGVnZXIoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pbnRlZ2VyLmRiX2Nvbm5lY3Rpb25fcG9vbF9zaXplKTsKKworICAgIC8qKiBUaGUgY29ubmVjdGlvbiBwb29sIG9iamVjdHMgYXJlIHN0b3JlZCBpbiB0aGlzIG1lbWJlci4KKyAgICAgKiBUT0RPOiByZXZpc2l0IHRoaXMgZGF0YSBzdHJ1Y3QgYXMgdGhlIG51bWJlciBvZiBwb29sZWQgY29ubmVjdGlvbnMgaW5jcmVhc2UgYmV5b25kCisgICAgICogc2luZ2xlLWRpZ2l0IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxQb29sT2JqPiBtUG9vbCA9IG5ldyBBcnJheUxpc3Q8UG9vbE9iaj4obU1heFBvb2xTaXplKTsKKworICAgIC8qKiB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIHdoaWNoIHRoaXMgY29ubmVjdGlvbiBwb29sIGlzIGF0dGFjaGVkICovCisgICAgcHJpdmF0ZSBmaW5hbCBTUUxpdGVEYXRhYmFzZSBtUGFyZW50RGJPYmo7CisKKyAgICAvKiogUmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdXNlZCB0byBwaWNrIGEgZnJlZSBjb25uZWN0aW9uIG91dCBvZiB0aGUgcG9vbCAqLworICAgIHByaXZhdGUgUmFuZG9tIHJhbmQ7IC8vIGxhemlseSBpbml0aWFsaXplZAorCisgICAgLyogcGFja2FnZSAqLyBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgIHRoaXMubVBhcmVudERiT2JqID0gZGI7CisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIk1heCBQb29sIFNpemU6ICIgKyBtTWF4UG9vbFNpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY2xvc2UgYWxsIGRhdGFiYXNlIGNvbm5lY3Rpb25zIGluIHRoZSBwb29sIC0gZXZlbiBpZiB0aGV5IGFyZSBpbiB1c2UhCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ2xvc2luZyB0aGUgY29ubmVjdGlvbiBwb29sIG9uICIgKyBtUGFyZW50RGJPYmouZ2V0UGF0aCgpICsgdG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IG1Qb29sLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBtUG9vbC5nZXQoaSkubURiLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgbVBvb2wuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgYSBmcmVlIGNvbm5lY3Rpb24gZnJvbSB0aGUgcG9vbAorICAgICAqCisgICAgICogQHBhcmFtIHNxbCBpZiBub3QgbnVsbCwgdHJ5IHRvIGZpbmQgYSBjb25uZWN0aW9uIGludGhlIHBvb2wgd2hpY2ggYWxyZWFkeSBoYXMgY2FjaGVkCisgICAgICogdGhlIGNvbXBpbGVkIHN0YXRlbWVudCBmb3IgdGhpcyBzcWwuCisgICAgICogQHJldHVybiB0aGUgRGF0YWJhc2UgY29ubmVjdGlvbiB0aGF0IHRoZSBjYWxsZXIgY2FuIHVzZQorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIFNRTGl0ZURhdGFiYXNlIGdldChTdHJpbmcgc3FsKSB7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbnVsbDsKKyAgICAgICAgUG9vbE9iaiBwb29sT2JqID0gbnVsbDsKKyAgICAgICAgaW50IHBvb2xTaXplID0gbVBvb2wuc2l6ZSgpOworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBhc3NlcnQgc3FsICE9IG51bGw7CisgICAgICAgICAgICBkb0Fzc2VydHMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0RnJlZVBvb2xTaXplKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gbm8gZnJlZSAoID0gYXZhaWxhYmxlKSBjb25uZWN0aW9ucworICAgICAgICAgICAgaWYgKG1NYXhQb29sU2l6ZSA9PSBwb29sU2l6ZSkgeworICAgICAgICAgICAgICAgIC8vIG1heGVkIG91dC4gY2FuJ3Qgb3BlbiBhbnkgbW9yZSBjb25uZWN0aW9ucy4KKyAgICAgICAgICAgICAgICAvLyBsZXQgdGhlIGNhbGxlciB3YWl0IG9uIG9uZSBvZiB0aGUgcG9vbGVkIGNvbm5lY3Rpb25zCisgICAgICAgICAgICAgICAgLy8gcHJlZmVyYWJseSBhIGNvbm5lY3Rpb24gY2FjaGluZyB0aGUgcHJlLWNvbXBpbGVkIHN0YXRlbWVudCBvZiB0aGUgZ2l2ZW4gU1FMCisgICAgICAgICAgICAgICAgaWYgKG1NYXhQb29sU2l6ZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHBvb2xPYmogPSBtUG9vbC5nZXQoMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTWF4UG9vbFNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb29sLmdldChpKS5tRGIuaXNJblN0YXRlbWVudENhY2hlKHNxbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sT2JqID0gbVBvb2wuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwb29sT2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGFyZSBubyBkYXRhYmFzZSBjb25uZWN0aW9ucyB3aXRoIHRoZSBnaXZlbiBTUUwgcHJlLWNvbXBpbGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2sgdG8gcmV0dXJuIGFueSBvZiB0aGUgY29ubmVjdGlvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFuZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZCA9IG5ldyBSYW5kb20oU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcG9vbE9iaiA9IG1Qb29sLmdldChyYW5kLm5leHRJbnQobU1heFBvb2xTaXplKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGIgPSBwb29sT2JqLm1EYjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gYW5kIGFkZCBpdCB0byB0aGUgcG9vbCwgc2luY2Ugd2UgaGF2ZW4ndCByZWFjaGVkCisgICAgICAgICAgICAgICAgLy8gbWF4IHBvb2wgc2l6ZSBhbGxvd2VkCisgICAgICAgICAgICAgICAgZGIgPSBtUGFyZW50RGJPYmouY3JlYXRlUG9vbENvbm5lY3Rpb24oKHNob3J0KShwb29sU2l6ZSArIDEpKTsKKyAgICAgICAgICAgICAgICBwb29sT2JqID0gbmV3IFBvb2xPYmooZGIpOworICAgICAgICAgICAgICAgIG1Qb29sLmFkZChwb29sU2l6ZSwgcG9vbE9iaik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB0aGVyZSBhcmUgZnJlZSBjb25uZWN0aW9ucyBhdmFpbGFibGUuIHBpY2sgb25lCisgICAgICAgICAgICAvLyBwcmVmZXJhYmx5IGEgY29ubmVjdGlvbiBjYWNoaW5nIHRoZSBwcmUtY29tcGlsZWQgc3RhdGVtZW50IG9mIHRoZSBnaXZlbiBTUUwKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9vbFNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtUG9vbC5nZXQoaSkuaXNGcmVlKCkgJiYgbVBvb2wuZ2V0KGkpLm1EYi5pc0luU3RhdGVtZW50Q2FjaGUoc3FsKSkgeworICAgICAgICAgICAgICAgICAgICBwb29sT2JqID0gbVBvb2wuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocG9vbE9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgYSBmcmVlIGRhdGFiYXNlIGNvbm5lY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gU1FMIGFscmVhZHkKKyAgICAgICAgICAgICAgICAvLyBwcmUtY29tcGlsZWQuIHJldHVybiBhIGZyZWUgY29ubmVjdGlvbiAodGhpcyBtZWFucywgdGhlIHNhbWUgU1FMIGNvdWxkIGJlCisgICAgICAgICAgICAgICAgLy8gcHJlLWNvbXBpbGVkIG9uIG1vcmUgdGhhbiBvbmUgZGF0YWJhc2UgY29ubmVjdGlvbi4gcG90ZW50aWFsIHdhc3RlZCBtZW1vcnkuKQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9vbFNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAobVBvb2wuZ2V0KGkpLmlzRnJlZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb29sT2JqID0gbVBvb2wuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYiA9IHBvb2xPYmoubURiOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IHBvb2xPYmogIT0gbnVsbDsKKyAgICAgICAgYXNzZXJ0IHBvb2xPYmoubURiID09IGRiOworCisgICAgICAgIHBvb2xPYmouYWNxdWlyZSgpOworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJFTkQgZ2V0LWNvbm5lY3Rpb246ICIgKyB0b1N0cmluZygpICsgcG9vbE9iai50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGI7CisgICAgICAgIC8vIFRPRE8gaWYgYSB0aHJlYWQgYWNxdWlyZXMgYSBjb25uZWN0aW9uIGFuZCBkaWVzIHdpdGhvdXQgcmVsZWFzaW5nIHRoZSBjb25uZWN0aW9uLCB0aGVuCisgICAgICAgIC8vIHRoZXJlIGNvdWxkIGJlIGEgY29ubmVjdGlvbiBsZWFrLgorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbGVhc2UgdGhlIGdpdmVuIGRhdGFiYXNlIGNvbm5lY3Rpb24gYmFjayB0byB0aGUgcG9vbC4KKyAgICAgKiBAcGFyYW0gZGIgdGhlIGNvbm5lY3Rpb24gdG8gYmUgcmVsZWFzZWQKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2UoU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgYXNzZXJ0IGRiLm1Db25uZWN0aW9uTnVtID4gMDsKKyAgICAgICAgICAgIGRvQXNzZXJ0cygpOworICAgICAgICAgICAgYXNzZXJ0IG1Qb29sLmdldChkYi5tQ29ubmVjdGlvbk51bSAtIDEpLm1EYiA9PSBkYjsKKyAgICAgICAgfQorCisgICAgICAgIFBvb2xPYmogcG9vbE9iaiA9IG1Qb29sLmdldChkYi5tQ29ubmVjdGlvbk51bSAtIDEpOworCisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkJFR0lOIHJlbGVhc2UtY29ubjogIiArIHRvU3RyaW5nKCkgKyBwb29sT2JqLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvb2xPYmouaXNGcmVlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJlbGVhc2luZyBvYmplY3QgYWxyZWFkeSBmcmVlZDogIiArCisgICAgICAgICAgICAgICAgICAgIGRiLm1Db25uZWN0aW9uTnVtKTsKKyAgICAgICAgfQorCisgICAgICAgIHBvb2xPYmoucmVsZWFzZSgpOworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJFTkQgcmVsZWFzZS1jb25uOiAiICsgdG9TdHJpbmcoKSArIHBvb2xPYmoudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgZGF0YWJhc2UgY29ubmVjdGlvbnMgaW4gdGhlIHBvb2wgKGJvdGggZnJlZSBhbmQgYnVzeSBjb25uZWN0aW9ucykuCisgICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB3aGVuICJhZGIgYnVncmVwb3J0IiBpcyBkb25lLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIEFycmF5TGlzdDxTUUxpdGVEYXRhYmFzZT4gZ2V0Q29ubmVjdGlvbkxpc3QoKSB7CisgICAgICAgIEFycmF5TGlzdDxTUUxpdGVEYXRhYmFzZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U1FMaXRlRGF0YWJhc2U+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSBtUG9vbC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgbGlzdC5hZGQobVBvb2wuZ2V0KGkpLm1EYik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogcGFja2FnZSBsZXZlbCBhY2Nlc3MgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4gb3RoZXJ3aXNlLCBwcml2YXRlIHNob3VsZCBiZSBzdWZmaWNpZW50LgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gaW50IGdldEZyZWVQb29sU2l6ZSgpIHsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IG1Qb29sLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBpZiAobVBvb2wuZ2V0KGkpLmlzRnJlZSgpKSB7CisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQrKzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBvbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBBcnJheUxpc3Q8UG9vbE9iaj4gZ2V0UG9vbCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qb29sOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGJ1ZmYuYXBwZW5kKCJkYjogIik7CisgICAgICAgIGJ1ZmYuYXBwZW5kKG1QYXJlbnREYk9iai5nZXRQYXRoKCkpOworICAgICAgICBidWZmLmFwcGVuZCgiLCB0b3RhbHNpemUgPSAiKTsKKyAgICAgICAgYnVmZi5hcHBlbmQobVBvb2wuc2l6ZSgpKTsKKyAgICAgICAgYnVmZi5hcHBlbmQoIiwgI2ZyZWUgPSAiKTsKKyAgICAgICAgYnVmZi5hcHBlbmQoZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBidWZmLmFwcGVuZCgiLCBtYXhwb29sc2l6ZSA9ICIpOworICAgICAgICBidWZmLmFwcGVuZChtTWF4UG9vbFNpemUpOworICAgICAgICBmb3IgKFBvb2xPYmogcCA6IG1Qb29sKSB7CisgICAgICAgICAgICBidWZmLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKHAudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9Bc3NlcnRzKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Qb29sLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtUG9vbC5nZXQoaSkudmVyaWZ5KCk7CisgICAgICAgICAgICBhc3NlcnQgbVBvb2wuZ2V0KGkpLm1EYi5tQ29ubmVjdGlvbk51bSA9PSAoaSArIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIG9ubHkgdXNlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gKi8KKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCB2b2lkIHNldE1heFBvb2xTaXplKGludCBzaXplKSB7CisgICAgICAgIG1NYXhQb29sU2l6ZSA9IHNpemU7CisgICAgfQorCisgICAgLyoqIG9ubHkgdXNlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gKi8KKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCBpbnQgZ2V0TWF4UG9vbFNpemUoKSB7CisgICAgICAgIHJldHVybiBtTWF4UG9vbFNpemU7CisgICAgfQorCisgICAgLyoqIG9ubHkgdXNlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gKi8KKyAgICAvKiBwYWNrYWdlICovIGJvb2xlYW4gaXNEYXRhYmFzZU9iakZyZWUoU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgcmV0dXJuIG1Qb29sLmdldChkYi5tQ29ubmVjdGlvbk51bSAtIDEpLmlzRnJlZSgpOworICAgIH0KKworICAgIC8qKiBvbmx5IHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuICovCisgICAgLyogcGFja2FnZSAqLyBpbnQgZ2V0U2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Qb29sLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXByZXNlbnRzIG9iamVjdHMgaW4gdGhlIGNvbm5lY3Rpb24gcG9vbC4KKyAgICAgKiBwYWNrYWdlLWxldmVsIGFjY2VzcyBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGNsYXNzIFBvb2xPYmogeworCisgICAgICAgIHByaXZhdGUgZmluYWwgU1FMaXRlRGF0YWJhc2UgbURiOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUZyZWVCdXN5RmxhZyA9IEZSRUU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gRlJFRSA9IHRydWU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gQlVTWSA9IGZhbHNlOworCisgICAgICAgIC8qKiB0aGUgbnVtYmVyIG9mIHRocmVhZHMgaG9sZGluZyB0aGlzIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgLy8gQEd1YXJkZWRCeSgidGhpcyIpCisgICAgICAgIHByaXZhdGUgaW50IG1OdW1Ib2xkZXJzID0gMDsKKworICAgICAgICAvKiogY29udGFpbnMgdGhlIHRocmVhZElkcyBvZiB0aGUgdGhyZWFkcyBob2xkaW5nIHRoaXMgY29ubmVjdGlvbi4KKyAgICAgICAgICogdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkuCisgICAgICAgICAqLworICAgICAgICAvLyBAR3VhcmRlZEJ5KCJ0aGlzIikKKyAgICAgICAgcHJpdmF0ZSBIYXNoU2V0PExvbmc+IG1Ib2xkZXJJZHMgPSBuZXcgSGFzaFNldDxMb25nPigpOworCisgICAgICAgIHB1YmxpYyBQb29sT2JqKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgICAgICBtRGIgPSBkYjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWNxdWlyZSgpIHsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgaXNGcmVlKCk7CisgICAgICAgICAgICAgICAgbG9uZyBpZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgIW1Ib2xkZXJJZHMuY29udGFpbnMoaWQpOworICAgICAgICAgICAgICAgIG1Ib2xkZXJJZHMuYWRkKGlkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbU51bUhvbGRlcnMrKzsKKyAgICAgICAgICAgIG1GcmVlQnVzeUZsYWcgPSBCVVNZOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlKCkgeworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIGxvbmcgaWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG1Ib2xkZXJJZHMuc2l6ZSgpID09IG1OdW1Ib2xkZXJzOworICAgICAgICAgICAgICAgIGFzc2VydCBtSG9sZGVySWRzLmNvbnRhaW5zKGlkKTsKKyAgICAgICAgICAgICAgICBtSG9sZGVySWRzLnJlbW92ZShpZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1OdW1Ib2xkZXJzLS07CisgICAgICAgICAgICBpZiAobU51bUhvbGRlcnMgPT0gMCkgeworICAgICAgICAgICAgICAgIG1GcmVlQnVzeUZsYWcgPSBGUkVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0ZyZWUoKSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgdmVyaWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKG1GcmVlQnVzeUZsYWcgPT0gRlJFRSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHZlcmlmeSgpIHsKKyAgICAgICAgICAgIGlmIChtRnJlZUJ1c3lGbGFnID09IEZSRUUpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgbU51bUhvbGRlcnMgPT0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG1OdW1Ib2xkZXJzID4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBvbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgICAgICAqLworICAgICAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCBpbnQgZ2V0TnVtSG9sZGVycygpIHsKKyAgICAgICAgICAgIHJldHVybiBtTnVtSG9sZGVyczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWZmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCIsIGNvbm4gIyAiKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKG1EYi5tQ29ubmVjdGlvbk51bSk7CisgICAgICAgICAgICBidWZmLmFwcGVuZCgiLCBtQ291bnRIb2xkZXJzID0gIik7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKG1OdW1Ib2xkZXJzKTsKKyAgICAgICAgICAgICAgICBidWZmLmFwcGVuZCgiLCBmcmVlQnVzeUZsYWcgPSAiKTsKKyAgICAgICAgICAgICAgICBidWZmLmFwcGVuZChtRnJlZUJ1c3lGbGFnKTsKKyAgICAgICAgICAgICAgICBmb3IgKExvbmcgbCA6IG1Ib2xkZXJJZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQoIiwgaWQgPSAiICsgbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uLmphdmEKaW5kZXggOGFjNGMwZi4uZjI4YzcwZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uLmphdmEKQEAgLTIxLDEzICsyMSwxMSBAQAogICogdGhhdCBpcyBub3QgZXhwbGljaXRseSBjbG9zZWQKICAqIEBoaWRlCiAgKi8KLXB1YmxpYyBjbGFzcyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KLXsKK3B1YmxpYyBjbGFzcyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzID0gIkFwcGxpY2F0aW9uIGRpZCBub3QgY2xvc2UgdGhlIGN1cnNvciBvciBkYXRhYmFzZSBvYmplY3QgIiArCiAgICAgICAgICAgICAidGhhdCB3YXMgb3BlbmVkIGhlcmUiOwogCi0gICAgcHVibGljIERhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uKCkKLSAgICB7CisgICAgcHVibGljIERhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uKCkgewogICAgICAgICBzdXBlcihzKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzhkYTRiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworLyoqCisgKiBUaGlzIGV4Y2VwdGlvbiBjbGFzcyBpcyB1c2VkIHdoZW4gc3FsaXRlIGNhbid0IGFjY2VzcyB0aGUgZGF0YWJhc2UgZmlsZQorICogZHVlIHRvIGxhY2sgb2YgcGVybWlzc2lvbnMgb24gdGhlIGZpbGUuCisgKi8KK3B1YmxpYyBjbGFzcyBTUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWYyZjljCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCisvKioKKyAqIFRocm93biBpZiB0aGUgdGhlIGJpbmQgb3IgY29sdW1uIHBhcmFtZXRlciBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKKyAqLworcHVibGljIGNsYXNzIFNRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uKFN0cmluZyBlcnJvcikgeworICAgICAgICBzdXBlcihlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgyNjc2YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMDE3OTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitwdWJsaWMgY2xhc3MgU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ2xvc2FibGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDbG9zYWJsZS5qYXZhCmluZGV4IDE4MzBmNmMuLjk2ZTZmMjIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDbG9zYWJsZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDbG9zYWJsZS5qYXZhCkBAIC0yMywxMyArMjMsMTQgQEAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFNRTGl0ZUNsb3NhYmxlIHsKICAgICBwcml2YXRlIGludCBtUmVmZXJlbmNlQ291bnQgPSAxOwotICAgIHByaXZhdGUgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOyAvLyBTVE9QU0hJUCByZW1vdmUgdGhpcyBsaW5lCiAKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZCgpOwogICAgIHByb3RlY3RlZCB2b2lkIG9uQWxsUmVmZXJlbmNlc1JlbGVhc2VkRnJvbUNvbnRhaW5lcigpIHt9CiAKICAgICBwdWJsaWMgdm9pZCBhY3F1aXJlUmVmZXJlbmNlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobUxvY2spIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1Mb2NrKSB7IC8vIFNUT1BTSElQIGNoYW5nZSAnbUxvY2snIHRvICd0aGlzJworICAgICAgICAgICAgY2hlY2tSZWZDb3VudCgpOwogICAgICAgICAgICAgaWYgKG1SZWZlcmVuY2VDb3VudCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRlbXB0IHRvIHJlLW9wZW4gYW4gYWxyZWFkeS1jbG9zZWQgb2JqZWN0OiAiICsgZ2V0T2JqSW5mbygpKTsKQEAgLTM5LDcgKzQwLDggQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZWxlYXNlUmVmZXJlbmNlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobUxvY2spIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1Mb2NrKSB7IC8vIFNUT1BTSElQIGNoYW5nZSAnbUxvY2snIHRvICd0aGlzJworICAgICAgICAgICAgY2hlY2tSZWZDb3VudCgpOwogICAgICAgICAgICAgbVJlZmVyZW5jZUNvdW50LS07CiAgICAgICAgICAgICBpZiAobVJlZmVyZW5jZUNvdW50ID09IDApIHsKICAgICAgICAgICAgICAgICBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZCgpOwpAQCAtNDgsNyArNTAsOCBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VSZWZlcmVuY2VGcm9tQ29udGFpbmVyKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobUxvY2spIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1Mb2NrKSB7IC8vIFNUT1BTSElQIGNoYW5nZSAnbUxvY2snIHRvICd0aGlzJworICAgICAgICAgICAgY2hlY2tSZWZDb3VudCgpOwogICAgICAgICAgICAgbVJlZmVyZW5jZUNvdW50LS07CiAgICAgICAgICAgICBpZiAobVJlZmVyZW5jZUNvdW50ID09IDApIHsKICAgICAgICAgICAgICAgICBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZEZyb21Db250YWluZXIoKTsKQEAgLTYzLDggKzY2LDcgQEAKICAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBTUUxpdGVEYXRhYmFzZSkgewogICAgICAgICAgICAgYnVmZi5hcHBlbmQoImRhdGFiYXNlID0gIik7CiAgICAgICAgICAgICBidWZmLmFwcGVuZCgoKFNRTGl0ZURhdGFiYXNlKXRoaXMpLmdldFBhdGgoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcyBpbnN0YW5jZW9mIFNRTGl0ZVByb2dyYW0gfHwgdGhpcyBpbnN0YW5jZW9mIFNRTGl0ZVN0YXRlbWVudCB8fAotICAgICAgICAgICAgICAgIHRoaXMgaW5zdGFuY2VvZiBTUUxpdGVRdWVyeSkgeworICAgICAgICB9IGVsc2UgaWYgKHRoaXMgaW5zdGFuY2VvZiBTUUxpdGVQcm9ncmFtKSB7CiAgICAgICAgICAgICBidWZmLmFwcGVuZCgibVNxbCA9ICIpOwogICAgICAgICAgICAgYnVmZi5hcHBlbmQoKChTUUxpdGVQcm9ncmFtKXRoaXMpLm1TcWwpOwogICAgICAgICB9IGVsc2UgaWYgKHRoaXMgaW5zdGFuY2VvZiBDdXJzb3JXaW5kb3cpIHsKQEAgLTc0LDQgKzc2LDEyIEBACiAgICAgICAgIGJ1ZmYuYXBwZW5kKCIpICIpOwogICAgICAgICByZXR1cm4gYnVmZi50b1N0cmluZygpOwogICAgIH0KKworICAgIC8vIFNUT1BTSElQIHJlbW92ZSB0aGlzIG1ldGhvZCBiZWZvcmUgc2hpcHBpbmcKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tSZWZDb3VudCgpIHsKKyAgICAgICAgaWYgKG1SZWZlcmVuY2VDb3VudCA+IDEwMDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImJhZCByZWZjb3VudDogIiArIG1SZWZlcmVuY2VDb3VudCArCisgICAgICAgICAgICAgICAgICAgICIuIGZpbGUgYnVnIGFnYWluc3QgZnJhbWV3b3Jrcy0+ZGF0YWJhc2UiICsgZ2V0T2JqSW5mbygpKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb21waWxlZFNxbC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNvbXBpbGVkU3FsLmphdmEKaW5kZXggMDAzZDBmMi4uYTdhZDc1NyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNvbXBpbGVkU3FsLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNvbXBpbGVkU3FsLmphdmEKQEAgLTMyLDEyICszMiwxMiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU1FMaXRlQ29tcGlsZWRTcWwiOwogCiAgICAgLyoqIFRoZSBkYXRhYmFzZSB0aGlzIHByb2dyYW0gaXMgY29tcGlsZWQgYWdhaW5zdC4gKi8KLSAgICAvKiBwYWNrYWdlICovIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKKyAgICAvKiBwYWNrYWdlICovIGZpbmFsIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKIAogICAgIC8qKgogICAgICAqIE5hdGl2ZSBsaW5rYWdlLCBkbyBub3QgbW9kaWZ5LiBUaGlzIGNvbWVzIGZyb20gdGhlIGRhdGFiYXNlLgogICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gaW50IG5IYW5kbGUgPSAwOworICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgaW50IG5IYW5kbGU7CiAKICAgICAvKioKICAgICAgKiBOYXRpdmUgbGlua2FnZSwgZG8gbm90IG1vZGlmeS4gV2hlbiBub24tMCB0aGlzIGhvbGRzIGEgcmVmZXJlbmNlIHRvIGEgdmFsaWQKQEAgLTU1LDYxICs1NSwyMSBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtSW5Vc2UgPSBmYWxzZTsKIAogICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlQ29tcGlsZWRTcWwoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwpIHsKLSAgICAgICAgaWYgKCFkYi5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIGRiLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQorICAgICAgICBkYi52ZXJpZnlEYklzT3BlbigpOworICAgICAgICBkYi52ZXJpZnlMb2NrT3duZXIoKTsKICAgICAgICAgbURhdGFiYXNlID0gZGI7CiAgICAgICAgIG1TcWxTdG10ID0gc3FsOwogICAgICAgICBtU3RhY2tUcmFjZSA9IG5ldyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbigpLmZpbGxJblN0YWNrVHJhY2UoKTsKLSAgICAgICAgdGhpcy5uSGFuZGxlID0gZGIubU5hdGl2ZUhhbmRsZTsKLSAgICAgICAgY29tcGlsZShzcWwsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBpbGVzIHRoZSBnaXZlbiBTUUwgaW50byBhIFNRTGl0ZSBieXRlIGNvZGUgcHJvZ3JhbSB1c2luZyBzcWxpdGUzX3ByZXBhcmVfdjIoKS4gSWYKLSAgICAgKiB0aGlzIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgcHJldmlvdXNseSB3aXRob3V0IGEgY2FsbCB0byBjbG9zZSBhbmQgZm9yQ29tcGlsYXRpb24gaXMgc2V0Ci0gICAgICogdG8gZmFsc2UgdGhlIHByZXZpb3VzIGNvbXBpbGF0aW9uIHdpbGwgYmUgdXNlZC4gU2V0dGluZyBmb3JjZUNvbXBpbGF0aW9uIHRvIHRydWUgd2lsbAotICAgICAqIGFsd2F5cyByZS1jb21waWxlIHRoZSBwcm9ncmFtIGFuZCBzaG91bGQgYmUgZG9uZSBpZiB5b3UgcGFzcyBkaWZmZXJpbmcgU1FMIHN0cmluZ3MgdG8gdGhpcwotICAgICAqIG1ldGhvZC4KLSAgICAgKgotICAgICAqIDxQPk5vdGU6IHRoaXMgbWV0aG9kIGFjcXVpcmVzIHRoZSBkYXRhYmFzZSBsb2NrLjwvUD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzcWwgdGhlIFNRTCBzdHJpbmcgdG8gY29tcGlsZQotICAgICAqIEBwYXJhbSBmb3JjZUNvbXBpbGF0aW9uIGZvcmNlcyB0aGUgU1FMIHRvIGJlIHJlY29tcGlsZWQgaW4gdGhlIGV2ZW50IHRoYXQgdGhlcmUgaXMgYW4KLSAgICAgKiAgZXhpc3RpbmcgY29tcGlsZWQgU1FMIHByb2dyYW0gYWxyZWFkeSBhcm91bmQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29tcGlsZShTdHJpbmcgc3FsLCBib29sZWFuIGZvcmNlQ29tcGlsYXRpb24pIHsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIE9ubHkgY29tcGlsZSBpZiB3ZSBkb24ndCBoYXZlIGEgdmFsaWQgc3RhdGVtZW50IGFscmVhZHkgb3IgdGhlIGNhbGxlciBoYXMKLSAgICAgICAgLy8gZXhwbGljaXRseSByZXF1ZXN0ZWQgYSByZWNvbXBpbGUuCi0gICAgICAgIGlmIChmb3JjZUNvbXBpbGF0aW9uKSB7Ci0gICAgICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIG5hdGl2ZV9jb21waWxlKCkgdGFrZXMgY2FyZSBvZiBkZXN0cm95aW5nIGFueSBwcmV2aW91c2x5Ci0gICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgcHJvZ3JhbXMgYmVmb3JlIGl0IGNvbXBpbGVzLgotICAgICAgICAgICAgICAgIG5hdGl2ZV9jb21waWxlKHNxbCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBuSGFuZGxlID0gZGIubU5hdGl2ZUhhbmRsZTsKKyAgICAgICAgbmF0aXZlX2NvbXBpbGUoc3FsKTsKICAgICB9CiAKICAgICAvKiBwYWNrYWdlICovIHZvaWQgcmVsZWFzZVNxbFN0YXRlbWVudCgpIHsKICAgICAgICAgLy8gTm90ZSB0aGF0IG5hdGl2ZV9maW5hbGl6ZSgpIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCBuU3RhdGVtZW50IGlzCiAgICAgICAgIC8vIG5vbi1udWxsIGJlZm9yZSBkZXN0cm95aW5nIGl0LgogICAgICAgICBpZiAoblN0YXRlbWVudCAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfQUNUSVZFX0NVUlNPUl9GSU5BTElaQVRJT04pIHsKLSAgICAgICAgICAgICAgICBMb2cudihUQUcsICJjbG9zZWQgYW5kIGRlYWxsb2NhdGVkIERiT2JqIChpZCMiICsgblN0YXRlbWVudCArIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLSAgICAgICAgICAgICAgICBuYXRpdmVfZmluYWxpemUoKTsKLSAgICAgICAgICAgICAgICBuU3RhdGVtZW50ID0gMDsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbURhdGFiYXNlLmZpbmFsaXplU3RhdGVtZW50TGF0ZXIoblN0YXRlbWVudCk7CisgICAgICAgICAgICBuU3RhdGVtZW50ID0gMDsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTE4LDIzICs3OCwyNCBAQAogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIGJvb2xlYW4gYWNxdWlyZSgpIHsKICAgICAgICAgaWYgKG1JblVzZSkgewotICAgICAgICAgICAgLy8gc29tZW9uZSBhbHJlYWR5IGhhcyBhY3F1aXJlZCBpdC4KKyAgICAgICAgICAgIC8vIGl0IGlzIGFscmVhZHkgaW4gdXNlLgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIG1JblVzZSA9IHRydWU7Ci0gICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19BQ1RJVkVfQ1VSU09SX0ZJTkFMSVpBVElPTikgewotICAgICAgICAgICAgTG9nLnYoVEFHLCAiQWNxdWlyZWQgRGJPYmogKGlkIyIgKyBuU3RhdGVtZW50ICsgIikgZnJvbSBEQiBjYWNoZSIpOwotICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZSgpIHsKLSAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX0FDVElWRV9DVVJTT1JfRklOQUxJWkFUSU9OKSB7Ci0gICAgICAgICAgICBMb2cudihUQUcsICJSZWxlYXNlZCBEYk9iaiAoaWQjIiArIG5TdGF0ZW1lbnQgKyAiKSBiYWNrIHRvIERCIGNhY2hlIik7Ci0gICAgICAgIH0KICAgICAgICAgbUluVXNlID0gZmFsc2U7CiAgICAgfQogCisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlSWZOb3RJblVzZSgpIHsKKyAgICAgICAgLy8gaWYgaXQgaXMgbm90IGluIHVzZSwgcmVsZWFzZSBpdHMgbWVtb3J5IGZyb20gdGhlIGRhdGFiYXNlCisgICAgICAgIGlmICghbUluVXNlKSB7CisgICAgICAgICAgICByZWxlYXNlU3FsU3RhdGVtZW50KCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBNYWtlIHN1cmUgdGhhdCB0aGUgbmF0aXZlIHJlc291cmNlIGlzIGNsZWFuZWQgdXAuCiAgICAgICovCkBAIC0xNDMsMTAgKzEwNCwxMCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKG5TdGF0ZW1lbnQgPT0gMCkgcmV0dXJuOwogICAgICAgICAgICAgLy8gZmluYWxpemVyIHNob3VsZCBORVZFUiBnZXQgY2FsbGVkCi0gICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfQUNUSVZFX0NVUlNPUl9GSU5BTElaQVRJT04pIHsKLSAgICAgICAgICAgICAgICBMb2cudihUQUcsICIqKiB3YXJuaW5nICoqIEZpbmFsaXplZCBEYk9iaiAoaWQjIiArIG5TdGF0ZW1lbnQgKyAiKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFN0cmljdE1vZGUudm1TcWxpdGVPYmplY3RMZWFrc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgLy8gYnV0IGlmIHRoZSBkYXRhYmFzZSBpdHNlbGYgaXMgbm90IGNsb3NlZCBhbmQgaXMgR0MnZWQsIHRoZW4KKyAgICAgICAgICAgIC8vIGFsbCBzdWItb2JqZWN0cyBhdHRhY2hlZCB0byB0aGUgZGF0YWJhc2UgY291bGQgZW5kIHVwIGdldHRpbmcgR0MnZWQgdG9vLgorICAgICAgICAgICAgLy8gaW4gdGhhdCBjYXNlLCBkb24ndCBwcmludCBhbnkgd2FybmluZy4KKyAgICAgICAgICAgIGlmIChtSW5Vc2UgJiYgU3RyaWN0TW9kZS52bVNxbGl0ZU9iamVjdExlYWtzRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICAgICAgaW50IGxlbiA9IG1TcWxTdG10Lmxlbmd0aCgpOwogICAgICAgICAgICAgICAgIFN0cmljdE1vZGUub25TcWxpdGVPYmplY3RMZWFrZWQoCiAgICAgICAgICAgICAgICAgICAgICJSZWxlYXNpbmcgc3RhdGVtZW50IGluIGEgZmluYWxpemVyLiBQbGVhc2UgZW5zdXJlICIgKwpAQCAtMTYwLDYgKzEyMSwyNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgYnVmZi5hcHBlbmQoIiBuU3RhdGVtZW50PSIpOworICAgICAgICAgICAgYnVmZi5hcHBlbmQoblN0YXRlbWVudCk7CisgICAgICAgICAgICBidWZmLmFwcGVuZCgiLCBtSW5Vc2U9Iik7CisgICAgICAgICAgICBidWZmLmFwcGVuZChtSW5Vc2UpOworICAgICAgICAgICAgYnVmZi5hcHBlbmQoIiwgZGI9Iik7CisgICAgICAgICAgICBidWZmLmFwcGVuZChtRGF0YWJhc2UuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCIsIGRiX2Nvbm5lY3Rpb25OdW09Iik7CisgICAgICAgICAgICBidWZmLmFwcGVuZChtRGF0YWJhc2UubUNvbm5lY3Rpb25OdW0pOworICAgICAgICAgICAgYnVmZi5hcHBlbmQoIiwgc3FsPSIpOworICAgICAgICAgICAgaW50IGxlbiA9IG1TcWxTdG10Lmxlbmd0aCgpOworICAgICAgICAgICAgYnVmZi5hcHBlbmQobVNxbFN0bXQuc3Vic3RyaW5nKDAsIChsZW4gPiAxMDApID8gMTAwIDogbGVuKSk7CisgICAgICAgICAgICByZXR1cm4gYnVmZi50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ29tcGlsZXMgU1FMIGludG8gYSBTUUxpdGUgcHJvZ3JhbS4KICAgICAgKgpAQCAtMTY3LDUgKzE0Niw0IEBACiAgICAgICogQHBhcmFtIHNxbCBUaGUgU1FMIHRvIGNvbXBpbGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfY29tcGlsZShTdHJpbmcgc3FsKTsKLSAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNvbnRlbnRIZWxwZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb250ZW50SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDBkODYuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNvbnRlbnRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwotaW1wb3J0IGFuZHJvaWQub3MuTWVtb3J5RmlsZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogU29tZSBoZWxwZXIgZnVuY3Rpb25zIGZvciB1c2luZyBTUUxpdGUgZGF0YWJhc2UgdG8gaW1wbGVtZW50IGNvbnRlbnQgcHJvdmlkZXJzLgotICoKLSAqIEBoaWRlCi0gKi8KLXB1YmxpYyBjbGFzcyBTUUxpdGVDb250ZW50SGVscGVyIHsKLQotICAgIC8qKgotICAgICAqIFJ1bnMgYW4gU1FMaXRlIHF1ZXJ5IGFuZCByZXR1cm5zIGFuIEFzc2V0RmlsZURlc2NyaXB0b3IgZm9yIHRoZQotICAgICAqIGJsb2IgaW4gY29sdW1uIDAgb2YgdGhlIGZpcnN0IHJvdy4gSWYgdGhlIGZpcnN0IGNvbHVtbiBkb2VzCi0gICAgICogbm90IGNvbnRhaW4gYSBibG9iLCBhbiB1bnNwZWNpZmllZCBleGNlcHRpb24gaXMgdGhyb3duLgotICAgICAqCi0gICAgICogQHBhcmFtIGRiIEhhbmRsZSB0byBhIHJlYWRhYmxlIGRhdGFiYXNlLgotICAgICAqIEBwYXJhbSBzcWwgU1FMIHF1ZXJ5LCBwb3NzaWJseSB3aXRoIHF1ZXJ5IGFyZ3VtZW50cy4KLSAgICAgKiBAcGFyYW0gc2VsZWN0aW9uQXJncyBRdWVyeSBhcmd1bWVudCB2YWx1ZXMsIG9yIHtAY29kZSBudWxsfSBmb3Igbm8gYXJndW1lbnQuCi0gICAgICogQHJldHVybiBJZiBubyBleGNlcHRpb24gaXMgdGhyb3duLCBhIG5vbi1udWxsIEFzc2V0RmlsZURlc2NyaXB0b3IgaXMgcmV0dXJuZWQuCi0gICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gSWYgdGhlIHF1ZXJ5IHJldHVybnMgbm8gcmVzdWx0cyBvciB0aGUKLSAgICAgKiAgICAgICAgIHZhbHVlIG9mIGNvbHVtbiAwIGlzIE5VTEwsIG9yIGlmIHRoZXJlIGlzIGFuIGVycm9yIGNyZWF0aW5nIHRoZQotICAgICAqICAgICAgICAgYXNzZXQgZmlsZSBkZXNjcmlwdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQXNzZXRGaWxlRGVzY3JpcHRvciBnZXRCbG9iQ29sdW1uQXNBc3NldEZpbGUoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwsCi0gICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lbW9yeUZpbGUgZmlsZSA9IHNpbXBsZVF1ZXJ5Rm9yQmxvYk1lbW9yeUZpbGUoZGIsIHNxbCwgc2VsZWN0aW9uQXJncyk7Ci0gICAgICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiTm8gcmVzdWx0cy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBBc3NldEZpbGVEZXNjcmlwdG9yLmZyb21NZW1vcnlGaWxlKGZpbGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihleC50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1bnMgYW4gU1FMaXRlIHF1ZXJ5IGFuZCByZXR1cm5zIGEgTWVtb3J5RmlsZSBmb3IgdGhlCi0gICAgICogYmxvYiBpbiBjb2x1bW4gMCBvZiB0aGUgZmlyc3Qgcm93LiBJZiB0aGUgZmlyc3QgY29sdW1uIGRvZXMKLSAgICAgKiBub3QgY29udGFpbiBhIGJsb2IsIGFuIHVuc3BlY2lmaWVkIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgbWVtb3J5IGZpbGUsIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcXVlcnkgcmV0dXJucyBubyByZXN1bHRzCi0gICAgICogICAgICAgICBvciB0aGUgdmFsdWUgY29sdW1uIDAgaXMgTlVMTC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIHRoZXJlIGlzIGFuIGVycm9yIGNyZWF0aW5nIHRoZSBtZW1vcnkgZmlsZS4KLSAgICAgKi8KLSAgICAvLyBUT0RPOiBtYWtlIHRoaXMgbmF0aXZlIGFuZCB1c2UgdGhlIFNRTGl0ZSBibG9iIEFQSSB0byByZWR1Y2UgY29weWluZwotICAgIHByaXZhdGUgc3RhdGljIE1lbW9yeUZpbGUgc2ltcGxlUXVlcnlGb3JCbG9iTWVtb3J5RmlsZShTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCwKLSAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEN1cnNvciBjdXJzb3IgPSBkYi5yYXdRdWVyeShzcWwsIHNlbGVjdGlvbkFyZ3MpOwotICAgICAgICBpZiAoY3Vyc29yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoIWN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBjdXJzb3IuZ2V0QmxvYigwKTsKLSAgICAgICAgICAgIGlmIChieXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZW1vcnlGaWxlIGZpbGUgPSBuZXcgTWVtb3J5RmlsZShudWxsLCBieXRlcy5sZW5ndGgpOwotICAgICAgICAgICAgZmlsZS53cml0ZUJ5dGVzKGJ5dGVzLCAwLCAwLCBieXRlcy5sZW5ndGgpOwotICAgICAgICAgICAgZmlsZS5kZWFjdGl2YXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmlsZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yLmphdmEKaW5kZXggZDhkY2FmNy4uODllOGFiNyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3IuamF2YQpAQCAtMTYsMjEgKzE2LDIwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CiAKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZDsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkFic3RyYWN0V2luZG93ZWRDdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXaW5kb3c7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5TUUxFeGNlcHRpb247Ci0KK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLlJlcXVlcnlPblVpVGhyZWFkRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQub3MuU3RyaWN0TW9kZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CiAKQEAgLTQyLDMyICs0MSwyOSBAQAogICogdGhyZWFkcyBzaG91bGQgcGVyZm9ybSBpdHMgb3duIHN5bmNocm9uaXphdGlvbiB3aGVuIHVzaW5nIHRoZSBTUUxpdGVDdXJzb3IuCiAgKi8KIHB1YmxpYyBjbGFzcyBTUUxpdGVDdXJzb3IgZXh0ZW5kcyBBYnN0cmFjdFdpbmRvd2VkQ3Vyc29yIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDdXJzb3IiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNRTGl0ZUN1cnNvciI7CiAgICAgc3RhdGljIGZpbmFsIGludCBOT19DT1VOVCA9IC0xOwogCiAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBlZGl0ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUVkaXRUYWJsZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRWRpdFRhYmxlOwogCiAgICAgLyoqIFRoZSBuYW1lcyBvZiB0aGUgY29sdW1ucyBpbiB0aGUgcm93cyAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gbUNvbHVtbnM7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBtQ29sdW1uczsKIAogICAgIC8qKiBUaGUgcXVlcnkgb2JqZWN0IGZvciB0aGUgY3Vyc29yICovCiAgICAgcHJpdmF0ZSBTUUxpdGVRdWVyeSBtUXVlcnk7CiAKLSAgICAvKiogVGhlIGRhdGFiYXNlIHRoZSBjdXJzb3Igd2FzIGNyZWF0ZWQgZnJvbSAqLwotICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgbURhdGFiYXNlOwotCiAgICAgLyoqIFRoZSBjb21waWxlZCBxdWVyeSB0aGlzIGN1cnNvciBjYW1lIGZyb20gKi8KLSAgICBwcml2YXRlIFNRTGl0ZUN1cnNvckRyaXZlciBtRHJpdmVyOworICAgIHByaXZhdGUgZmluYWwgU1FMaXRlQ3Vyc29yRHJpdmVyIG1Ecml2ZXI7CiAKICAgICAvKiogVGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBjdXJzb3IgKi8KLSAgICBwcml2YXRlIGludCBtQ291bnQgPSBOT19DT1VOVDsKKyAgICBwcml2YXRlIHZvbGF0aWxlIGludCBtQ291bnQgPSBOT19DT1VOVDsKIAogICAgIC8qKiBBIG1hcHBpbmcgb2YgY29sdW1uIG5hbWVzIHRvIGNvbHVtbiBpbmRpY2VzLCB0byBzcGVlZCB1cCBsb29rdXBzICovCiAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBtQ29sdW1uTmFtZU1hcDsKIAogICAgIC8qKiBVc2VkIHRvIGZpbmQgb3V0IHdoZXJlIGEgY3Vyc29yIHdhcyBhbGxvY2F0ZWQgaW4gY2FzZSBpdCBuZXZlciBnb3QgcmVsZWFzZWQuICovCi0gICAgcHJpdmF0ZSBUaHJvd2FibGUgbVN0YWNrVHJhY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBUaHJvd2FibGUgbVN0YWNrVHJhY2U7CiAgICAgCiAgICAgLyoqIAogICAgICAqICBtTWF4UmVhZCBpcyB0aGUgbWF4IGl0ZW1zIHRoYXQgZWFjaCBjdXJzb3Igd2luZG93IHJlYWRzIApAQCAtNzgsNiArNzQsMTEgQEAKICAgICBwcml2YXRlIGludCBtQ3Vyc29yU3RhdGUgPSAwOwogICAgIHByaXZhdGUgUmVlbnRyYW50TG9jayBtTG9jayA9IG51bGw7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1QZW5kaW5nRGF0YSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVXNlZCBieSB7QGxpbmsgI3JlcXVlcnkoKX0gdG8gcmVtZW1iZXIgZm9yIHdoaWNoIGRhdGFiYXNlIHdlJ3ZlIGFscmVhZHkgc2hvd24gdGhlIHdhcm5pbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+IHNBbHJlYWR5V2FybmVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPigpOwogICAgIAogICAgIC8qKgogICAgICAqICBzdXBwb3J0IGZvciBhIGN1cnNvciB2YXJpYW50IHRoYXQgZG9lc24ndCBhbHdheXMgcmVhZCBhbGwgcmVzdWx0cwpAQCAtMTM3LDE0ICsxMzgsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IG1RdWVyeS5maWxsV2luZG93KGN3LCBtTWF4UmVhZCwgbUNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIC0xIG1lYW5zIG5vdCBmaW5pc2hlZAorICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBnZXRRdWVyeSgpLmZpbGxXaW5kb3coY3csIG1NYXhSZWFkLCBtQ291bnQpOworICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gLTEgbWVhbnMgdGhlcmUgaXMgc3RpbGwgbW9yZSBkYXRhIHRvIGJlIHJldHJpZXZlZCBmcm9tIHRoZSByZXN1bHRzZXQKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSBOT19DT1VOVCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvdW50ICs9IG1NYXhSZWFkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVjZWl2ZWQgLTEgZnJvbSBuYXRpdmVfZmlsbF93aW5kb3cuIHJlYWQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvdW50ICsgIiByb3dzIHNvIGZhciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db3VudCA9IGNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db3VudCArPSBjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInJlY2VpdmVkIGFsbCBkYXRhIGZyb20gbmF0aXZlX2ZpbGxfd2luZG93LiByZWFkICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db3VudCArICIgcm93cy4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTIwMiwyNCArMjExLDQ2IEBACiAgICAgICogaGFzIHBhY2thZ2Ugc2NvcGUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZGIgYSByZWZlcmVuY2UgdG8gYSBEYXRhYmFzZSBvYmplY3QgdGhhdCBpcyBhbHJlYWR5IGNvbnN0cnVjdGVkCi0gICAgICogICAgIGFuZCBvcGVuZWQKKyAgICAgKiAgICAgYW5kIG9wZW5lZC4gVGhpcyBwYXJhbSBpcyBub3QgdXNlZCBhbnkgbG9uZ2VyCiAgICAgICogQHBhcmFtIGVkaXRUYWJsZSB0aGUgbmFtZSBvZiB0aGUgdGFibGUgdXNlZCBmb3IgdGhpcyBxdWVyeQogICAgICAqIEBwYXJhbSBxdWVyeSB0aGUgcmVzdCBvZiB0aGUgcXVlcnkgdGVybXMKICAgICAgKiAgICAgY3Vyc29yIGlzIGZpbmFsaXplZAorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI1NRTGl0ZUN1cnNvcihTUUxpdGVDdXJzb3JEcml2ZXIsIFN0cmluZywgU1FMaXRlUXVlcnkpfSBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgU1FMaXRlQ3Vyc29yKFNRTGl0ZURhdGFiYXNlIGRiLCBTUUxpdGVDdXJzb3JEcml2ZXIgZHJpdmVyLAogICAgICAgICAgICAgU3RyaW5nIGVkaXRUYWJsZSwgU1FMaXRlUXVlcnkgcXVlcnkpIHsKKyAgICAgICAgdGhpcyhkcml2ZXIsIGVkaXRUYWJsZSwgcXVlcnkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgYSBxdWVyeSBhbmQgcHJvdmlkZSBhY2Nlc3MgdG8gaXRzIHJlc3VsdCBzZXQgdGhyb3VnaCBhIEN1cnNvcgorICAgICAqIGludGVyZmFjZS4gRm9yIGEgcXVlcnkgc3VjaCBhczoge0Bjb2RlIFNFTEVDVCBuYW1lLCBiaXJ0aCwgcGhvbmUgRlJPTQorICAgICAqIG15VGFibGUgV0hFUkUgLi4uIExJTUlUIDEsMjAgT1JERVIgQlkuLi59IHRoZSBjb2x1bW4gbmFtZXMgKG5hbWUsIGJpcnRoLAorICAgICAqIHBob25lKSB3b3VsZCBiZSBpbiB0aGUgcHJvamVjdGlvbiBhcmd1bWVudCBhbmQgZXZlcnl0aGluZyBmcm9tCisgICAgICoge0Bjb2RlIEZST019IG9ud2FyZCB3b3VsZCBiZSBpbiB0aGUgcGFyYW1zIGFyZ3VtZW50LiBUaGlzIGNvbnN0cnVjdG9yCisgICAgICogaGFzIHBhY2thZ2Ugc2NvcGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWRpdFRhYmxlIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSB1c2VkIGZvciB0aGlzIHF1ZXJ5CisgICAgICogQHBhcmFtIHF1ZXJ5IHRoZSB7QGxpbmsgU1FMaXRlUXVlcnl9IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjdXJzb3Igb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTUUxpdGVDdXJzb3IoU1FMaXRlQ3Vyc29yRHJpdmVyIGRyaXZlciwgU3RyaW5nIGVkaXRUYWJsZSwgU1FMaXRlUXVlcnkgcXVlcnkpIHsKICAgICAgICAgLy8gVGhlIEFic3RyYWN0Q3Vyc29yIGNvbnN0cnVjdG9yIG5lZWRzIHRvIGRvIHNvbWUgc2V0dXAuCiAgICAgICAgIHN1cGVyKCk7CisgICAgICAgIGlmIChxdWVyeSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBvYmplY3QgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocXVlcnkubURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5Lm1EYXRhYmFzZSBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICB9CiAgICAgICAgIG1TdGFja1RyYWNlID0gbmV3IERhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uKCkuZmlsbEluU3RhY2tUcmFjZSgpOwotICAgICAgICBtRGF0YWJhc2UgPSBkYjsKICAgICAgICAgbURyaXZlciA9IGRyaXZlcjsKICAgICAgICAgbUVkaXRUYWJsZSA9IGVkaXRUYWJsZTsKICAgICAgICAgbUNvbHVtbk5hbWVNYXAgPSBudWxsOwogICAgICAgICBtUXVlcnkgPSBxdWVyeTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgZGIubG9jaygpOworICAgICAgICAgICAgcXVlcnkubURhdGFiYXNlLmxvY2soKTsKIAogICAgICAgICAgICAgLy8gU2V0dXAgdGhlIGxpc3Qgb2YgY29sdW1ucwogICAgICAgICAgICAgaW50IGNvbHVtbkNvdW50ID0gbVF1ZXJ5LmNvbHVtbkNvdW50TG9ja2VkKCk7CkBAIC0yNDAsNyArMjcxLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBkYi51bmxvY2soKTsKKyAgICAgICAgICAgIHF1ZXJ5Lm1EYXRhYmFzZS51bmxvY2soKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjQ4LDcgKzI3OSw5IEBACiAgICAgICogQHJldHVybiB0aGUgU1FMaXRlRGF0YWJhc2UgdGhhdCB0aGlzIGN1cnNvciBpcyBhc3NvY2lhdGVkIHdpdGguCiAgICAgICovCiAgICAgcHVibGljIFNRTGl0ZURhdGFiYXNlIGdldERhdGFiYXNlKCkgewotICAgICAgICByZXR1cm4gbURhdGFiYXNlOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtUXVlcnkubURhdGFiYXNlOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0yODQsMTMgKzMxNywyNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtV2luZG93LnNldFN0YXJ0UG9zaXRpb24oc3RhcnRQb3MpOwotICAgICAgICBtQ291bnQgPSBtUXVlcnkuZmlsbFdpbmRvdyhtV2luZG93LCBtSW5pdGlhbFJlYWQsIDApOwotICAgICAgICAvLyByZXR1cm4gLTEgbWVhbnMgbm90IGZpbmlzaGVkCi0gICAgICAgIGlmIChtQ291bnQgPT0gTk9fQ09VTlQpeworICAgICAgICBpbnQgY291bnQgPSBnZXRRdWVyeSgpLmZpbGxXaW5kb3cobVdpbmRvdywgbUluaXRpYWxSZWFkLCAwKTsKKyAgICAgICAgLy8gcmV0dXJuIC0xIG1lYW5zIHRoZXJlIGlzIHN0aWxsIG1vcmUgZGF0YSB0byBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVzdWx0c2V0CisgICAgICAgIGlmIChjb3VudCA9PSBOT19DT1VOVCl7CiAgICAgICAgICAgICBtQ291bnQgPSBzdGFydFBvcyArIG1Jbml0aWFsUmVhZDsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZWNlaXZlZCAtMSBmcm9tIG5hdGl2ZV9maWxsX3dpbmRvdy4gcmVhZCAiICsgbUNvdW50ICsgIiByb3dzIHNvIGZhciIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBRdWVyeVRocmVhZChtQ3Vyc29yU3RhdGUpLCAicXVlcnkgdGhyZWFkIik7CiAgICAgICAgICAgICB0LnN0YXJ0KCk7Ci0gICAgICAgIH0gCisgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRQb3MgPT0gMCkgeyAvLyBuYXRpdmVfZmlsbF93aW5kb3cgcmV0dXJucyBjb3VudCgqKSBvbmx5IGZvciBzdGFydFBvcyA9IDAKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZWNlaXZlZCBjb3VudCgqKSBmcm9tIG5hdGl2ZV9maWxsX3dpbmRvdzogIiArIGNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db3VudCA9IGNvdW50OworICAgICAgICB9IGVsc2UgaWYgKG1Db3VudCA8PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjb3VudCBzaG91bGQgbmV2ZXIgYmUgbm9uLXplcm8gbmVnYXRpdmUgbnVtYmVyIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBTUUxpdGVRdWVyeSBnZXRRdWVyeSgpIHsKKyAgICAgICAgcmV0dXJuIG1RdWVyeTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTMyMiwxNjYgKzM2OSwxMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpIHsKLSAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIC8vIE9ubHkgYWxsb3cgZGVsZXRlcyBpZiB0aGVyZSBpcyBhbiBJRCBjb2x1bW4sIGFuZCB0aGUgSUQgaGFzIGJlZW4gcmVhZCBmcm9tIGl0Ci0gICAgICAgIGlmIChtUm93SWRDb2x1bW5JbmRleCA9PSAtMSB8fCBtQ3VycmVudFJvd0lEID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywKLSAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBkZWxldGUgcm93IGJlY2F1c2UgZWl0aGVyIHRoZSByb3cgSUQgY29sdW1uIGlzIG5vdCBhdmFpbGFibGUgb3IgaXQiICsKLSAgICAgICAgICAgICAgICAgICAgImhhcyBub3QgYmVlbiByZWFkLiIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEVuc3VyZSB3ZSBkb24ndCBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBkYXRhYmFzZSB3aGVuIGFub3RoZXIKLSAgICAgICAgICogdGhyZWFkIGlzIGhvbGRpbmcgdGhlIGRhdGFiYXNlIGxvY2suIHJlcXVlcnkoKSBhbmQgbW92ZVRvKCkgYXJlIGFsc28KLSAgICAgICAgICogc3luY2hyb25pemVkIGhlcmUgdG8gbWFrZSBzdXJlIHRoZXkgZ2V0IHRoZSBzdGF0ZSBvZiB0aGUgZGF0YWJhc2UKLSAgICAgICAgICogaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBERUxFVEUuCi0gICAgICAgICAqLwotICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZGVsZXRlKG1FZGl0VGFibGUsIG1Db2x1bW5zW21Sb3dJZENvbHVtbkluZGV4XSArICI9PyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge21DdXJyZW50Um93SUQudG9TdHJpbmcoKX0pOwotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBwb3MgPSBtUG9zOwotICAgICAgICAgICAgcmVxdWVyeSgpOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogRW5zdXJlIHByb3BlciBjdXJzb3Igc3RhdGUuIE5vdGUgdGhhdCBtQ3VycmVudFJvd0lEIGNoYW5nZXMKLSAgICAgICAgICAgICAqIGluIHRoaXMgY2FsbC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbW92ZVRvUG9zaXRpb24ocG9zKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICBvbkNoYW5nZSh0cnVlKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkgewogICAgICAgICByZXR1cm4gbUNvbHVtbnM7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzVXBkYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnN1cHBvcnRzVXBkYXRlcygpICYmICFUZXh0VXRpbHMuaXNFbXB0eShtRWRpdFRhYmxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcyhNYXA8PyBleHRlbmRzIExvbmcsCi0gICAgICAgICAgICA/IGV4dGVuZHMgTWFwPFN0cmluZywgT2JqZWN0Pj4gYWRkaXRpb25hbFZhbHVlcykgewotICAgICAgICBpZiAoIXN1cHBvcnRzVXBkYXRlcygpKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJjb21taXRVcGRhdGVzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBjdXJzb3IsIGRpZCB5b3UgIgotICAgICAgICAgICAgICAgICAgICArICJpbmNsdWRlIHRoZSBfaWQgY29sdW1uPyIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogUHJldmVudCBvdGhlciB0aHJlYWRzIGZyb20gY2hhbmdpbmcgdGhlIHVwZGF0ZWQgcm93cyB3aGlsZSB0aGV5J3JlCi0gICAgICAgICAqIGJlaW5nIHByb2Nlc3NlZCBoZXJlLgotICAgICAgICAgKi8KLSAgICAgICAgc3luY2hyb25pemVkIChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChhZGRpdGlvbmFsVmFsdWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtVXBkYXRlZFJvd3MucHV0QWxsKGFkZGl0aW9uYWxWYWx1ZXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVVwZGF0ZWRSb3dzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBQcmV2ZW50IG90aGVyIHRocmVhZHMgZnJvbSBjaGFuZ2luZyB0aGUgZGF0YWJhc2Ugc3RhdGUgd2hpbGUKLSAgICAgICAgICAgICAqIHdlIHByb2Nlc3MgdGhlIHVwZGF0ZWQgcm93cywgYW5kIHByZXZlbnRzIHVzIGZyb20gY2hhbmdpbmcgdGhlCi0gICAgICAgICAgICAgKiBkYXRhYmFzZSBiZWhpbmQgdGhlIGJhY2sgb2YgYW5vdGhlciB0aHJlYWQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc3FsID0gbmV3IFN0cmluZ0J1aWxkZXIoMTI4KTsKLQotICAgICAgICAgICAgICAgIC8vIEZvciBlYWNoIHJvdyB0aGF0IGhhcyBiZWVuIHVwZGF0ZWQKLSAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxMb25nLCBNYXA8U3RyaW5nLCBPYmplY3Q+PiByb3dFbnRyeSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVXBkYXRlZFJvd3MuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHZhbHVlcyA9IHJvd0VudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIExvbmcgcm93SWRPYmogPSByb3dFbnRyeS5nZXRLZXkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocm93SWRPYmogPT0gbnVsbCB8fCB2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibnVsbCByb3dJZCBvciB2YWx1ZXMgZm91bmQhIHJvd0lkID0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJvd0lkT2JqICsgIiwgdmFsdWVzID0gIiArIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGxvbmcgcm93SWQgPSByb3dJZE9iai5sb25nVmFsdWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+PiB2YWx1ZXNJdGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICAgICAgICAgIHNxbC5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIlVQREFURSAiICsgbUVkaXRUYWJsZSArICIgU0VUICIpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIEZvciBlYWNoIGNvbHVtbiB2YWx1ZSB0aGF0IGhhcyBiZWVuIHVwZGF0ZWQKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYmluZGluZ3MgPSBuZXcgT2JqZWN0W3ZhbHVlcy5zaXplKCldOwotICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh2YWx1ZXNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA9IHZhbHVlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZChlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCI9PyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ3NbaV0gPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlc0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIiBXSEVSRSAiICsgbUNvbHVtbnNbbVJvd0lkQ29sdW1uSW5kZXhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnPScgKyByb3dJZCk7Ci0gICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoJzsnKTsKLSAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoc3FsLnRvU3RyaW5nKCksIGJpbmRpbmdzKTsKLSAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLnJvd1VwZGF0ZWQobUVkaXRUYWJsZSwgcm93SWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtVXBkYXRlZFJvd3MuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIExldCBhbnkgY2hhbmdlIG9ic2VydmVycyBrbm93IGFib3V0IHRoZSB1cGRhdGUKLSAgICAgICAgb25DaGFuZ2UodHJ1ZSk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSB2b2lkIGRlYWN0aXZhdGVDb21tb24oKSB7CiAgICAgICAgIGlmIChDb25maWcuTE9HVikgTG9nLnYoVEFHLCAiPDw8IFJlbGVhc2luZyBjdXJzb3IgIiArIHRoaXMpOwogICAgICAgICBtQ3Vyc29yU3RhdGUgPSAwOwpAQCAtNTAyLDkgKzM5NCwzMiBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewogICAgICAgICBzdXBlci5jbG9zZSgpOwotICAgICAgICBkZWFjdGl2YXRlQ29tbW9uKCk7Ci0gICAgICAgIG1RdWVyeS5jbG9zZSgpOwotICAgICAgICBtRHJpdmVyLmN1cnNvckNsb3NlZCgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGRlYWN0aXZhdGVDb21tb24oKTsKKyAgICAgICAgICAgIG1RdWVyeS5jbG9zZSgpOworICAgICAgICAgICAgbURyaXZlci5jdXJzb3JDbG9zZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3cgYSB3YXJuaW5nIGFnYWluc3QgdGhlIHVzZSBvZiByZXF1ZXJ5KCkgaWYgY2FsbGVkIG9uIHRoZSBtYWluIHRocmVhZC4KKyAgICAgKiBUaGlzIHdhcm5pbmcgaXMgc2hvd24gcGVyIGRhdGFiYXNlIHBlciBwcm9jZXNzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3YXJuSWZVaVRocmVhZCgpIHsKKyAgICAgICAgaWYgKExvb3Blci5nZXRNYWluTG9vcGVyKCkgPT0gTG9vcGVyLm15TG9vcGVyKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBkYXRhYmFzZVBhdGggPSBnZXRRdWVyeSgpLm1EYXRhYmFzZS5nZXRQYXRoKCk7CisgICAgICAgICAgICAvLyBXZSBzaG93IHRoZSB3YXJuaW5nIG9uY2UgcGVyIGRhdGFiYXNlIGluIG9yZGVyIG5vdCB0byBzcGFtIGxvZ2NhdC4KKyAgICAgICAgICAgIGlmICghc0FscmVhZHlXYXJuZWQuY29udGFpbnNLZXkoZGF0YWJhc2VQYXRoKSkgeworICAgICAgICAgICAgICAgIHNBbHJlYWR5V2FybmVkLnB1dChkYXRhYmFzZVBhdGgsIHRydWUpOworICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IEFjdGl2aXR5VGhyZWFkLmN1cnJlbnRQYWNrYWdlTmFtZSgpOworICAgICAgICAgICAgICAgIFRocm93YWJsZSB0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAvLyBCRUdJTiBTVE9QU0hJUCByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lCisgICAgICAgICAgICAgICAgdCA9IG5ldyBSZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbihwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgLy8gRU5EIFNUT1BTSElQCisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2hvdWxkIG5vdCBhdHRlbXB0IHJlcXVlcnkgb24gbWFpbiAoVUkpIHRocmVhZDogYXBwID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSA9PSBudWxsID8gIid1bmtub3duJyIgOiBwYWNrYWdlTmFtZSwgdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTUxMiwyMCArNDI3LDMwIEBACiAgICAgICAgIGlmIChpc0Nsb3NlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KKyAgICAgICAgd2FybklmVWlUaHJlYWQoKTsKICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSAwOwogICAgICAgICBpZiAoQ29uZmlnLkxPR1YpIHsKICAgICAgICAgICAgIHRpbWVTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICB9Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFN5bmNocm9uaXplIG9uIHRoZSBkYXRhYmFzZSBsb2NrIHRvIGVuc3VyZSB0aGF0IG1Db3VudCBtYXRjaGVzIHRoZQotICAgICAgICAgKiByZXN1bHRzIG9mIG1RdWVyeS5yZXF1ZXJ5KCkuCi0gICAgICAgICAqLwotICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotICAgICAgICB0cnkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKG1XaW5kb3cgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1XaW5kb3cuY2xlYXIoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Qb3MgPSAtMTsKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbVF1ZXJ5Lm1EYXRhYmFzZS5nZXREYXRhYmFzZUhhbmRsZShtUXVlcnkubVNxbCk7CisgICAgICAgICAgICBpZiAoIWRiLmVxdWFscyhtUXVlcnkubURhdGFiYXNlKSkgeworICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlIG5lZWQgdG8gdXNlIGEgZGlmZmVyZW50IGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlLAorICAgICAgICAgICAgICAgIC8vIHJlLWNvbXBpbGUgdGhlIHF1ZXJ5CisgICAgICAgICAgICAgICAgZGIubG9jaygpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBvbGQgbVF1ZXJ5IG9iamVjdCBhbmQgb3BlbiBhIG5ldyBvbmUKKyAgICAgICAgICAgICAgICAgICAgbVF1ZXJ5LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIG1RdWVyeSA9IG5ldyBTUUxpdGVRdWVyeShkYiwgbVF1ZXJ5KTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBkYi51bmxvY2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBUaGlzIG9uZSB3aWxsIHJlY3JlYXRlIHRoZSB0ZW1wIHRhYmxlLCBhbmQgZ2V0IGl0cyBjb3VudAogICAgICAgICAgICAgbURyaXZlci5jdXJzb3JSZXF1ZXJpZWQodGhpcyk7CiAgICAgICAgICAgICBtQ291bnQgPSBOT19DT1VOVDsKQEAgLTUzNiw4ICs0NjEsNiBAQAogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBxdWVyeVRocmVhZFVubG9jaygpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKENvbmZpZy5MT0dWKSB7CkBAIC01ODcsNyArNTEwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IG1RdWVyeS5tU3FsLmxlbmd0aCgpOwogICAgICAgICAgICAgICAgICAgICBTdHJpY3RNb2RlLm9uU3FsaXRlT2JqZWN0TGVha2VkKAogICAgICAgICAgICAgICAgICAgICAgICAgIkZpbmFsaXppbmcgYSBDdXJzb3IgdGhhdCBoYXMgbm90IGJlZW4gZGVhY3RpdmF0ZWQgb3IgY2xvc2VkLiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhYmFzZSA9ICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiwgdGFibGUgPSAiICsgbUVkaXRUYWJsZSArCisgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YWJhc2UgPSAiICsgbVF1ZXJ5Lm1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiLCB0YWJsZSA9ICIgKyBtRWRpdFRhYmxlICsKICAgICAgICAgICAgICAgICAgICAgICAgICIsIHF1ZXJ5ID0gIiArIG1RdWVyeS5tU3FsLnN1YnN0cmluZygwLCAobGVuID4gMTAwKSA/IDEwMCA6IGxlbiksCiAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhY2tUcmFjZSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTk1LDcgKzUxOCw3IEBACiAgICAgICAgICAgICAgICAgU1FMaXRlRGVidWcubm90aWZ5QWN0aXZlQ3Vyc29yRmluYWxpemVkKCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChDb25maWcuTE9HVikgewotICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJGaW5hbGl6aW5nIGN1cnNvciBvbiBkYXRhYmFzZSA9ICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiRmluYWxpemluZyBjdXJzb3Igb24gZGF0YWJhc2UgPSAiICsgbVF1ZXJ5Lm1EYXRhYmFzZS5nZXRQYXRoKCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIHRhYmxlID0gIiArIG1FZGl0VGFibGUgKyAiLCBxdWVyeSA9ICIgKyBtUXVlcnkubVNxbCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNjAzLDQgKzUyNiwxMSBAQAogICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKICAgICAgICAgfQogICAgIH0KKworICAgIC8qKgorICAgICAqIHRoaXMgaXMgb25seSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIGludCBnZXRNQ291bnQoKSB7CisgICAgICAgIHJldHVybiBtQ291bnQ7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvckRyaXZlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvckRyaXZlci5qYXZhCmluZGV4IGVkYTFiNzguLmIzOTYzZjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3JEcml2ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yRHJpdmVyLmphdmEKQEAgLTQwLDggKzQwLDYgQEAKIAogICAgIC8qKgogICAgICAqIENhbGxlZCBieSBhIFNRTGl0ZUN1cnNvciB3aGVuIGl0IGlzIHJlcXVlcnllZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgY291bnQgdmFsdWUuCiAgICAgICovCiAgICAgdm9pZCBjdXJzb3JSZXF1ZXJpZWQoQ3Vyc29yIGN1cnNvcik7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlLmphdmEKaW5kZXggY2RjOWJiYi4uYTk4YTMwNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlLmphdmEKQEAgLTE2LDE2ICsxNiwxNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwogCi1pbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuTWFwczsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5VGhyZWFkOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFwcEdsb2JhbHM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5TUUxFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGVidWcuRGJTdGF0czsKIGltcG9ydCBhbmRyb2lkLm9zLkRlYnVnOworaW1wb3J0IGFuZHJvaWQub3MuU3RhdEZzOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CkBAIC0zOCwxNSArMzgsMTMgQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKQEAgLTY3LDcgKzY1LDcgQEAKICAqIGlzIHRoZSBVbmljb2RlIENvbGxhdGlvbiBBbGdvcml0aG0gYW5kIG5vdCB0YWlsb3JlZCB0byB0aGUgY3VycmVudCBsb2NhbGUuCiAgKi8KIHB1YmxpYyBjbGFzcyBTUUxpdGVEYXRhYmFzZSBleHRlbmRzIFNRTGl0ZUNsb3NhYmxlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRhdGFiYXNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNRTGl0ZURhdGFiYXNlIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfREJfT1BFUkFUSU9OID0gNTIwMDA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0RCX0NPUlJVUFQgPSA3NTAwNDsKIApAQCAtMTkyLDYgKzE5MCwxMSBAQAogICAgICAqLwogICAgIHByaXZhdGUgU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lciBtVHJhbnNhY3Rpb25MaXN0ZW5lcjsKIAorICAgIC8qKgorICAgICAqIHRoaXMgbWVtYmVyIGlzIHNldCBpZiB7QGxpbmsgI2V4ZWNTUUwoU3RyaW5nKX0gaXMgdXNlZCB0byBiZWdpbiBhbmQgZW5kIHRyYW5zYWN0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbVRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsOworCiAgICAgLyoqIFN5bmNocm9uaXplIG9uIHRoaXMgd2hlbiBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlICovCiAgICAgcHJpdmF0ZSBmaW5hbCBSZWVudHJhbnRMb2NrIG1Mb2NrID0gbmV3IFJlZW50cmFudExvY2sodHJ1ZSk7CiAKQEAgLTIzMyw5NCArMjM2LDEzOCBAQAogICAgIC8vIGxvY2sgYWNxdWlzdGlvbnMgb2YgdGhlIGRhdGFiYXNlLgogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfTE9DS19MT0dfUFJFRklYID0gIkdFVExPQ0s6IjsKIAotICAgIC8qKiBVc2VkIGJ5IG5hdGl2ZSBjb2RlLCBkbyBub3QgcmVuYW1lICovCi0gICAgLyogcGFja2FnZSAqLyBpbnQgbU5hdGl2ZUhhbmRsZSA9IDA7CisgICAgLyoqIFVzZWQgYnkgbmF0aXZlIGNvZGUsIGRvIG5vdCByZW5hbWUuIG1ha2UgaXQgdm9sYXRpbGUsIHNvIGl0IGlzIHRocmVhZC1zYWZlLiAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9sYXRpbGUgaW50IG1OYXRpdmVIYW5kbGUgPSAwOwogCi0gICAgLyoqIFVzZWQgdG8gbWFrZSB0ZW1wIHRhYmxlIG5hbWVzIHVuaXF1ZSAqLwotICAgIC8qIHBhY2thZ2UgKi8gaW50IG1UZW1wVGFibGVTZXF1ZW5jZSA9IDA7CisgICAgLyoqCisgICAgICogVGhlIHNpemUsIGluIGJ5dGVzLCBvZiBhIGJsb2NrIG9uICIvZGF0YSIuIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIFVuaXgKKyAgICAgKiBzdGF0ZnMuZl9ic2l6ZSBmaWVsZC4gbm90ZSB0aGF0IHRoaXMgZmllbGQgaXMgbGF6aWx5IGluaXRpYWxpemVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBzQmxvY2tTaXplID0gMDsKIAogICAgIC8qKiBUaGUgcGF0aCBmb3IgdGhlIGRhdGFiYXNlIGZpbGUgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtUGF0aDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGF0aDsKIAogICAgIC8qKiBUaGUgYW5vbnltaXplZCBwYXRoIGZvciB0aGUgZGF0YWJhc2UgZmlsZSBmb3IgbG9nZ2luZyBwdXJwb3NlcyAqLwogICAgIHByaXZhdGUgU3RyaW5nIG1QYXRoRm9yTG9ncyA9IG51bGw7ICAvLyBsYXppbHkgcG9wdWxhdGVkCiAKICAgICAvKiogVGhlIGZsYWdzIHBhc3NlZCB0byBvcGVuL2NyZWF0ZSAqLwotICAgIHByaXZhdGUgaW50IG1GbGFnczsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtRmxhZ3M7CiAKICAgICAvKiogVGhlIG9wdGlvbmFsIGZhY3RvcnkgdG8gdXNlIHdoZW4gY3JlYXRpbmcgbmV3IEN1cnNvcnMgKi8KLSAgICBwcml2YXRlIEN1cnNvckZhY3RvcnkgbUZhY3Rvcnk7CisgICAgcHJpdmF0ZSBmaW5hbCBDdXJzb3JGYWN0b3J5IG1GYWN0b3J5OwogCi0gICAgcHJpdmF0ZSBXZWFrSGFzaE1hcDxTUUxpdGVDbG9zYWJsZSwgT2JqZWN0PiBtUHJvZ3JhbXM7CisgICAgcHJpdmF0ZSBmaW5hbCBXZWFrSGFzaE1hcDxTUUxpdGVDbG9zYWJsZSwgT2JqZWN0PiBtUHJvZ3JhbXM7CiAKICAgICAvKioKLSAgICAgKiBmb3IgZWFjaCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCBhIGNhY2hlIGlzIG1haW50YWluZWQgdG8gc3RvcmUKKyAgICAgKiBmb3IgZWFjaCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCBhIExSVSBjYWNoZSBpcyBtYWludGFpbmVkIHRvIHN0b3JlCiAgICAgICogdGhlIGNvbXBpbGVkIHF1ZXJ5IHN0YXRlbWVudCBpZHMgcmV0dXJuZWQgYnkgc3FsaXRlIGRhdGFiYXNlLgotICAgICAqICAgICBrZXkgPSBzcWwgc3RhdGVtZW50IHdpdGggIj8iIGZvciBiaW5kIGFyZ3MKKyAgICAgKiAgICAga2V5ID0gU1FMIHN0YXRlbWVudCB3aXRoICI/IiBmb3IgYmluZCBhcmdzCiAgICAgICogICAgIHZhbHVlID0ge0BsaW5rIFNRTGl0ZUNvbXBpbGVkU3FsfQogICAgICAqIElmIGFuIGFwcGxpY2F0aW9uIG9wZW5zIHRoZSBkYXRhYmFzZSBhbmQga2VlcHMgaXQgb3BlbiBkdXJpbmcgaXRzIGVudGlyZSBsaWZlLCB0aGVuCi0gICAgICogdGhlcmUgd2lsbCBub3QgYmUgYW4gb3ZlcmhlYWQgb2YgY29tcGlsYXRpb24gb2Ygc3FsIHN0YXRlbWVudHMgYnkgc3FsaXRlLgorICAgICAqIHRoZXJlIHdpbGwgbm90IGJlIGFuIG92ZXJoZWFkIG9mIGNvbXBpbGF0aW9uIG9mIFNRTCBzdGF0ZW1lbnRzIGJ5IHNxbGl0ZS4KICAgICAgKgogICAgICAqIHdoeSBpcyB0aGlzIGNhY2hlIE5PVCBzdGF0aWM/IGJlY2F1c2Ugc3FsaXRlIGF0dGFjaGVzIGNvbXBpbGVkc3FsIHN0YXRlbWVudHMgdG8gdGhlCiAgICAgICogc3RydWN0IGNyZWF0ZWQgd2hlbiB7QGxpbmsgU1FMaXRlRGF0YWJhc2Ujb3BlbkRhdGFiYXNlKFN0cmluZywgQ3Vyc29yRmFjdG9yeSwgaW50KX0gaXMKICAgICAgKiBpbnZva2VkLgogICAgICAqCiAgICAgICogdGhpcyBjYWNoZSBoYXMgYW4gdXBwZXIgbGltaXQgb2YgbU1heFNxbENhY2hlU2l6ZSAoc2V0dGFibGUgYnkgY2FsbGluZyB0aGUgbWV0aG9kCi0gICAgICogKEBsaW5rIHNldE1heENhY2hlU2l6ZShpbnQpfSkuIGl0cyBkZWZhdWx0IGlzIDAgLSBpLmUuLCBubyBjYWNoaW5nIGJ5IGRlZmF1bHQgYmVjYXVzZQotICAgICAqIG1vc3Qgb2YgdGhlIGFwcHMgZG9uJ3QgdXNlICI/IiBzeW50YXggaW4gdGhlaXIgc3FsLCBjYWNoaW5nIGlzIG5vdCB1c2VmdWwgZm9yIHRoZW0uCisgICAgICogKEBsaW5rICNzZXRNYXhTcWxDYWNoZVNpemUoaW50KX0pLgogICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gTWFwPFN0cmluZywgU1FMaXRlQ29tcGlsZWRTcWw+IG1Db21waWxlZFF1ZXJpZXMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICAvLyBkZWZhdWx0IHN0YXRlbWVudC1jYWNoZSBzaXplIHBlciBkYXRhYmFzZSBjb25uZWN0aW9uICggPSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzKQorICAgIHByaXZhdGUgaW50IG1NYXhTcWxDYWNoZVNpemUgPSAyNTsKKyAgICAvLyBndWFyZGVkIGJ5IGl0c2VsZgorICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgTWFwPFN0cmluZywgU1FMaXRlQ29tcGlsZWRTcWw+IG1Db21waWxlZFF1ZXJpZXMgPQorICAgICAgICBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFNRTGl0ZUNvbXBpbGVkU3FsPihtTWF4U3FsQ2FjaGVTaXplICsgMSwgMC43NWYsIHRydWUpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRWxkZXN0RW50cnkoTWFwLkVudHJ5PFN0cmluZywgU1FMaXRlQ29tcGlsZWRTcWw+IGVsZGVzdCkgeworICAgICAgICAgICAgICAgIC8vIGVsZGVzdCA9IGxlYXN0LXJlY2VudGx5IHVzZWQgZW50cnkKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCBuZWVkcyB0byBiZSByZW1vdmVkIHRvIGFjY29tbW9kYXRlIGEgbmV3IGVudHJ5LAorICAgICAgICAgICAgICAgIC8vICAgICBjbG9zZSB7QGxpbmsgU1FMaXRlQ29tcGlsZWRTcWx9IHJlcHJlc2VudGVkIGJ5IHRoaXMgZW50cnksIGlmIG5vdCBpbiB1c2UKKyAgICAgICAgICAgICAgICAvLyAgICAgYW5kIHRoZW4gbGV0IGl0IGJlIHJlbW92ZWQgZnJvbSB0aGUgTWFwLgorICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhpcyBpcyBjYWxsZWQsIHRoZSBjYWxsZXIgbXVzdCBiZSB0cnlpbmcgdG8gYWRkIGEganVzdC1jb21waWxlZCBzdG10CisgICAgICAgICAgICAgICAgLy8gdG8gY2FjaGU7IGkuZS4sIGNhbGxlciBzaG91bGQgYWxyZWFkeSBoYXZlIGFjcXVpcmVkIGRhdGFiYXNlIGxvY2sgQU5ECisgICAgICAgICAgICAgICAgLy8gdGhlIGxvY2sgb24gbUNvbXBpbGVkUXVlcmllcy4gZG8gYXMgYXNzZXJ0IG9mIHRoZXNlIHR3byAyIGZhY3RzLgorICAgICAgICAgICAgICAgIHZlcmlmeUxvY2tPd25lcigpOworICAgICAgICAgICAgICAgIGlmICh0aGlzLnNpemUoKSA8PSBtTWF4U3FsQ2FjaGVTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlIGlzIG5vdCBmdWxsLiBub3RoaW5nIG5lZWRzIHRvIGJlIHJlbW92ZWQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBjYWNoZSBpcyBmdWxsLiBlbGRlc3Qgd2lsbCBiZSByZW1vdmVkLgorICAgICAgICAgICAgICAgIGVsZGVzdC5nZXRWYWx1ZSgpLnJlbGVhc2VJZk5vdEluVXNlKCk7CisgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRydWUsIHNvIHRoYXQgdGhpcyBlbnRyeSBpcyByZW1vdmVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGNhbGxlci4KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKICAgICAvKioKLSAgICAgKiBAaGlkZQorICAgICAqIGFic29sdXRlIG1heCB2YWx1ZSB0aGF0IGNhbiBiZSBzZXQgYnkge0BsaW5rICNzZXRNYXhTcWxDYWNoZVNpemUoaW50KX0KKyAgICAgKiBzaXplIG9mIGVhY2ggcHJlcGFyZWQtc3RhdGVtZW50IGlzIGJldHdlZW4gMUsgLSA2SywgZGVwZW5kaW5nIG9uIHRoZSBjb21wbGV4aXR5IG9mIHRoZQorICAgICAqIFNRTCBzdGF0ZW1lbnQgJiBzY2hlbWEuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NRTF9DQUNIRV9TSVpFID0gMjUwOwotICAgIHByaXZhdGUgaW50IG1NYXhTcWxDYWNoZVNpemUgPSBNQVhfU1FMX0NBQ0hFX1NJWkU7IC8vIG1heCBjYWNoZSBzaXplIHBlciBEYXRhYmFzZSBpbnN0YW5jZQotICAgIHByaXZhdGUgaW50IG1DYWNoZUZ1bGxXYXJuaW5nczsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1dBUk5JTkdTX09OX0NBQ0hFU0laRV9DT05ESVRJT04gPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9TUUxfQ0FDSEVfU0laRSA9IDEwMDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUNhY2hlRnVsbFdhcm5pbmc7CiAKLSAgICAvKiogbWFpbnRhaW4gc3RhdHMgYWJvdXQgbnVtYmVyIG9mIGNhY2hlIGhpdHMgYW5kIG1pc3NlcyAqLworICAgIC8qKiBOdW1iZXIgb2YgY2FjaGUgaGl0cyBvbiB0aGlzIGRhdGFiYXNlIGNvbm5lY3Rpb24uIGd1YXJkZWQgYnkge0BsaW5rICNtQ29tcGlsZWRRdWVyaWVzfS4gKi8KICAgICBwcml2YXRlIGludCBtTnVtQ2FjaGVIaXRzOworICAgIC8qKiBOdW1iZXIgb2YgY2FjaGUgbWlzc2VzIG9uIHRoaXMgZGF0YWJhc2UgY29ubmVjdGlvbi4gZ3VhcmRlZCBieSB7QGxpbmsgI21Db21waWxlZFF1ZXJpZXN9LiAqLwogICAgIHByaXZhdGUgaW50IG1OdW1DYWNoZU1pc3NlczsKIAotICAgIC8qKiB0aGUgZm9sbG93aW5nIDIgbWVtYmVycyBtYWludGFpbiB0aGUgdGltZSB3aGVuIGEgZGF0YWJhc2UgaXMgb3BlbmVkIGFuZCBjbG9zZWQgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtVGltZU9wZW5lZCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVRpbWVDbG9zZWQgPSBudWxsOwotCiAgICAgLyoqIFVzZWQgdG8gZmluZCBvdXQgd2hlcmUgdGhpcyBvYmplY3Qgd2FzIGNyZWF0ZWQgaW4gY2FzZSBpdCBuZXZlciBnb3QgY2xvc2VkLiAqLwotICAgIHByaXZhdGUgVGhyb3dhYmxlIG1TdGFja1RyYWNlID0gbnVsbDsKKyAgICBwcml2YXRlIGZpbmFsIFRocm93YWJsZSBtU3RhY2tUcmFjZTsKIAogICAgIC8vIFN5c3RlbSBwcm9wZXJ0eSB0aGF0IGVuYWJsZXMgbG9nZ2luZyBvZiBzbG93IHF1ZXJpZXMuIFNwZWNpZnkgdGhlIHRocmVzaG9sZCBpbiBtcy4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1NMT1dfUVVFUklFU19QUk9QRVJUWSA9ICJkYi5sb2cuc2xvd19xdWVyeV90aHJlc2hvbGQiOwogICAgIHByaXZhdGUgZmluYWwgaW50IG1TbG93UXVlcnlUaHJlc2hvbGQ7CiAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY2xvc2FibGUKKyAgICAvKiogc3RvcmVzIHRoZSBsaXN0IG9mIHN0YXRlbWVudCBpZHMgdGhhdCBuZWVkIHRvIGJlIGZpbmFsaXplZCBieSBzcWxpdGUgKi8KKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJbnRlZ2VyPiBtQ2xvc2VkU3RhdGVtZW50SWRzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworCisgICAgLyoqIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUgdXNlZCB3aGVuIFNRTGl0ZSByZXR1cm5zIGFueSBvZiB0aGUgZm9sbG93aW5nIGVycm9ycworICAgICAqICAgIENvcnJ1cHRpb24KKyAgICAgKiAqLworICAgIHByaXZhdGUgZmluYWwgRGF0YWJhc2VFcnJvckhhbmRsZXIgbUVycm9ySGFuZGxlcjsKKworICAgIC8qKiBUaGUgRGF0YWJhc2UgY29ubmVjdGlvbiBwb29sIHtAbGluayBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sfS4KKyAgICAgKiBWaXNpYmlsaXR5IGlzIHBhY2thZ2UtcHJpdmF0ZSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gb3RoZXJ3aXNlLCBwcml2YXRlIHZpc2liaWxpdHkgaXMgZW5vdWdoLgogICAgICAqLwotICAgIHZvaWQgYWRkU1FMaXRlQ2xvc2FibGUoU1FMaXRlQ2xvc2FibGUgY2xvc2FibGUpIHsKLSAgICAgICAgbG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbVByb2dyYW1zLnB1dChjbG9zYWJsZSwgbnVsbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgIC8qIHBhY2thZ2UgKi8gdm9sYXRpbGUgRGF0YWJhc2VDb25uZWN0aW9uUG9vbCBtQ29ubmVjdGlvblBvb2wgPSBudWxsOworCisgICAgLyoqIEVhY2ggZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUgaW4gdGhlIHBvb2wgaXMgYXNzaWduZWQgYSBudW1iZXIgMS4uTiwgd2hlcmUgTiBpcyB0aGUKKyAgICAgKiBzaXplIG9mIHRoZSBjb25uZWN0aW9uIHBvb2wuCisgICAgICogVGhlIG1haW4gY29ubmVjdGlvbiBoYW5kbGUgdG8gd2hpY2ggdGhlIHBvb2wgaXMgYXR0YWNoZWQgaXMgYXNzaWduZWQgYSB2YWx1ZSBvZiAwLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgc2hvcnQgbUNvbm5lY3Rpb25OdW07CisKKyAgICAvKiogb24gcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb25zLCB0aGlzIG1lbWJlciBwb2ludHMgdG8gdGhlIHBhcmVudCAoID0gbWFpbikKKyAgICAgKiBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZS4KKyAgICAgKiBwYWNrYWdlIHZpc2liaWxpdHkgb25seSBmb3IgdGVzdGluZyBwdXJwb3NlcworICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlRGF0YWJhc2UgbVBhcmVudENvbm5PYmogPSBudWxsOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTU9SWV9EQl9QQVRIID0gIjptZW1vcnk6IjsKKworICAgIC8qKiBzZXQgdG8gdHJ1ZSBpZiB0aGUgZGF0YWJhc2UgaGFzIGF0dGFjaGVkIGRhdGFiYXNlcyAqLworICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBtSGFzQXR0YWNoZWREYnMgPSBmYWxzZTsKKworICAgIC8qKiBzdG9yZXMgcmVmZXJlbmNlIHRvIGFsbCBkYXRhYmFzZXMgb3BlbmVkIGluIHRoZSBjdXJyZW50IHByb2Nlc3MuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0PFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+PiBtQWN0aXZlRGF0YWJhc2VzID0KKyAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8V2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4+KCk7CisKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTUUxpdGVDbG9zYWJsZShTUUxpdGVDbG9zYWJsZSBjbG9zYWJsZSkgeworICAgICAgICAvLyBtUHJvZ3JhbXMgaXMgcGVyIGluc3RhbmNlIG9mIFNRTGl0ZURhdGFiYXNlIGFuZCBpdCBkb2Vzbid0IGFjdHVhbGx5IHRvdWNoIHRoZSBkYXRhYmFzZQorICAgICAgICAvLyBpdHNlbGYuIHNvLCB0aGVyZSBpcyBubyBuZWVkIHRvIGxvY2soKS4KKyAgICAgICAgbVByb2dyYW1zLnB1dChjbG9zYWJsZSwgbnVsbCk7CiAgICAgfQogCi0gICAgdm9pZCByZW1vdmVTUUxpdGVDbG9zYWJsZShTUUxpdGVDbG9zYWJsZSBjbG9zYWJsZSkgewotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtUHJvZ3JhbXMucmVtb3ZlKGNsb3NhYmxlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHVubG9jaygpOwotICAgICAgICB9CisgICAgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlU1FMaXRlQ2xvc2FibGUoU1FMaXRlQ2xvc2FibGUgY2xvc2FibGUpIHsKKyAgICAgICAgbVByb2dyYW1zLnJlbW92ZShjbG9zYWJsZSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWQoKSB7CiAgICAgICAgIGlmIChpc09wZW4oKSkgewotICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9DQUNIRSkgewotICAgICAgICAgICAgICAgIG1UaW1lQ2xvc2VkID0gZ2V0VGltZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGJjbG9zZSgpOworICAgICAgICAgICAgLy8gY2xvc2UgdGhlIGRhdGFiYXNlIHdoaWNoIHdpbGwgY2xvc2UgYWxsIHBlbmRpbmcgc3RhdGVtZW50cyB0byBiZSBmaW5hbGl6ZWQgYWxzbworICAgICAgICAgICAgY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzUwLDE5ICszOTcsOCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtTG9ja2luZ0VuYWJsZWQgPSB0cnVlOwogCiAgICAgLyogcGFja2FnZSAqLyB2b2lkIG9uQ29ycnVwdGlvbigpIHsKLSAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3ZpbmcgY29ycnVwdCBkYXRhYmFzZTogIiArIG1QYXRoKTsKICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVF9EQl9DT1JSVVBULCBtUGF0aCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBDbG9zZSB0aGUgZGF0YWJhc2UgKGlmIHdlIGNhbiksIHdoaWNoIHdpbGwgY2F1c2Ugc3Vic2VxdWVudCBvcGVyYXRpb25zIHRvIGZhaWwuCi0gICAgICAgICAgICBjbG9zZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gRGVsZXRlIHRoZSBjb3JydXB0IGZpbGUuICBEb24ndCByZS1jcmVhdGUgaXQgbm93IC0tIHRoYXQgd291bGQganVzdCBjb25mdXNlIHBlb3BsZQotICAgICAgICAgICAgLy8gLS0gYnV0IHRoZSBuZXh0IHRpbWUgc29tZW9uZSB0cmllcyB0byBvcGVuIGl0LCB0aGV5IGNhbiBzZXQgaXQgdXAgZnJvbSBzY3JhdGNoLgotICAgICAgICAgICAgaWYgKCFtUGF0aC5lcXVhbHNJZ25vcmVDYXNlKCI6bWVtb3J5IikpIHsKLSAgICAgICAgICAgICAgICAvLyBkZWxldGUgaXMgb25seSBmb3Igbm9uLW1lbW9yeSBkYXRhYmFzZSBmaWxlcwotICAgICAgICAgICAgICAgIG5ldyBGaWxlKG1QYXRoKS5kZWxldGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBtRXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbih0aGlzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTM3NCw3ICs0MTAsMTYgQEAKICAgICAgKiBAc2VlICN1bmxvY2soKQogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBsb2NrKCkgewotICAgICAgICBpZiAoIW1Mb2NraW5nRW5hYmxlZCkgcmV0dXJuOworICAgICAgICBsb2NrKGZhbHNlKTsKKyAgICB9CisgICAgcHJpdmF0ZSB2b2lkIGxvY2soYm9vbGVhbiBmb3JjZWQpIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoaXMgbWV0aG9kIGlzIE5PVCBiZWluZyBjYWxsZWQgZnJvbSBhICdzeW5jaHJvbml6ZWQnIG1ldGhvZAorICAgICAgICBpZiAoVGhyZWFkLmhvbGRzTG9jayh0aGlzKSkgeworICAgICAgICAgICAgLy8gU1RPUFNISVAgY2hhbmdlIHRoZSBmb2xsb3dpbmcgbGluZSB0byBMb2cudygpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkb24ndCBsb2NrKCkgd2hpbGUgaW4gYSBzeW5jaHJvbml6ZWQgbWV0aG9kIik7CisgICAgICAgIH0KKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgaWYgKCFmb3JjZWQgJiYgIW1Mb2NraW5nRW5hYmxlZCkgcmV0dXJuOwogICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19MT0NLX1RJTUVfVFJBQ0tJTkcpIHsKICAgICAgICAgICAgIGlmIChtTG9jay5nZXRIb2xkQ291bnQoKSA9PSAxKSB7CkBAIC0zODQsNyArNDI5LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQogICAgIC8qKgogICAgICAqIExvY2tzIHRoZSBkYXRhYmFzZSBmb3IgZXhjbHVzaXZlIGFjY2Vzcy4gVGhlIGRhdGFiYXNlIGxvY2sgbXVzdCBiZSBoZWxkIHdoZW4KICAgICAgKiB0b3VjaCB0aGUgbmF0aXZlIHNxbGl0ZTMqIG9iamVjdCBzaW5jZSBpdCBpcyBzaW5nbGUgdGhyZWFkZWQgYW5kIHVzZXMKQEAgLTM5NCwxNCArNDM4LDcgQEAKICAgICAgKiBAc2VlICN1bmxvY2tGb3JjZWQoKQogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBsb2NrRm9yY2VkKCkgewotICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19MT0NLX1RJTUVfVFJBQ0tJTkcpIHsKLSAgICAgICAgICAgIGlmIChtTG9jay5nZXRIb2xkQ291bnQoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgLy8gVXNlIGVsYXBzZWQgcmVhbC10aW1lIHNpbmNlIHRoZSBDUFUgbWF5IHNsZWVwIHdoZW4gd2FpdGluZyBmb3IgSU8KLSAgICAgICAgICAgICAgICBtTG9ja0FjcXVpcmVkV2FsbFRpbWUgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKLSAgICAgICAgICAgICAgICBtTG9ja0FjcXVpcmVkVGhyZWFkVGltZSA9IERlYnVnLnRocmVhZENwdVRpbWVOYW5vcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGxvY2sodHJ1ZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00NjAsMTEgKzQ5NywxNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEJlZ2lucyBhIHRyYW5zYWN0aW9uLiBUcmFuc2FjdGlvbnMgY2FuIGJlIG5lc3RlZC4gV2hlbiB0aGUgb3V0ZXIgdHJhbnNhY3Rpb24gaXMgZW5kZWQgYWxsIG9mCisgICAgICogQmVnaW5zIGEgdHJhbnNhY3Rpb24gaW4gRVhDTFVTSVZFIG1vZGUuCisgICAgICogPHA+CisgICAgICogVHJhbnNhY3Rpb25zIGNhbiBiZSBuZXN0ZWQuCisgICAgICogV2hlbiB0aGUgb3V0ZXIgdHJhbnNhY3Rpb24gaXMgZW5kZWQgYWxsIG9mCiAgICAgICogdGhlIHdvcmsgZG9uZSBpbiB0aGF0IHRyYW5zYWN0aW9uIGFuZCBhbGwgb2YgdGhlIG5lc3RlZCB0cmFuc2FjdGlvbnMgd2lsbCBiZSBjb21taXR0ZWQgb3IKICAgICAgKiByb2xsZWQgYmFjay4gVGhlIGNoYW5nZXMgd2lsbCBiZSByb2xsZWQgYmFjayBpZiBhbnkgdHJhbnNhY3Rpb24gaXMgZW5kZWQgd2l0aG91dCBiZWluZwogICAgICAqIG1hcmtlZCBhcyBjbGVhbiAoYnkgY2FsbGluZyBzZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwpLiBPdGhlcndpc2UgdGhleSB3aWxsIGJlIGNvbW1pdHRlZC4KLSAgICAgKgorICAgICAqIDwvcD4KICAgICAgKiA8cD5IZXJlIGlzIHRoZSBzdGFuZGFyZCBpZGlvbSBmb3IgdHJhbnNhY3Rpb25zOgogICAgICAqCiAgICAgICogPHByZT4KQEAgLTQ3OCwxNSArNTE4LDQyIEBACiAgICAgICogPC9wcmU+CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYmVnaW5UcmFuc2FjdGlvbigpIHsKLSAgICAgICAgYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lcihudWxsIC8qIHRyYW5zYWN0aW9uU3RhdHVzQ2FsbGJhY2sgKi8pOworICAgICAgICBiZWdpblRyYW5zYWN0aW9uKG51bGwgLyogdHJhbnNhY3Rpb25TdGF0dXNDYWxsYmFjayAqLywgdHJ1ZSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQmVnaW5zIGEgdHJhbnNhY3Rpb24uIFRyYW5zYWN0aW9ucyBjYW4gYmUgbmVzdGVkLiBXaGVuIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBpcyBlbmRlZCBhbGwgb2YKKyAgICAgKiBCZWdpbnMgYSB0cmFuc2FjdGlvbiBpbiBJTU1FRElBVEUgbW9kZS4gVHJhbnNhY3Rpb25zIGNhbiBiZSBuZXN0ZWQuIFdoZW4KKyAgICAgKiB0aGUgb3V0ZXIgdHJhbnNhY3Rpb24gaXMgZW5kZWQgYWxsIG9mIHRoZSB3b3JrIGRvbmUgaW4gdGhhdCB0cmFuc2FjdGlvbgorICAgICAqIGFuZCBhbGwgb2YgdGhlIG5lc3RlZCB0cmFuc2FjdGlvbnMgd2lsbCBiZSBjb21taXR0ZWQgb3Igcm9sbGVkIGJhY2suIFRoZQorICAgICAqIGNoYW5nZXMgd2lsbCBiZSByb2xsZWQgYmFjayBpZiBhbnkgdHJhbnNhY3Rpb24gaXMgZW5kZWQgd2l0aG91dCBiZWluZworICAgICAqIG1hcmtlZCBhcyBjbGVhbiAoYnkgY2FsbGluZyBzZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwpLiBPdGhlcndpc2UgdGhleQorICAgICAqIHdpbGwgYmUgY29tbWl0dGVkLgorICAgICAqIDxwPgorICAgICAqIEhlcmUgaXMgdGhlIHN0YW5kYXJkIGlkaW9tIGZvciB0cmFuc2FjdGlvbnM6CisgICAgICoKKyAgICAgKiA8cHJlPgorICAgICAqICAgZGIuYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpOworICAgICAqICAgdHJ5IHsKKyAgICAgKiAgICAgLi4uCisgICAgICogICAgIGRiLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAqICAgfSBmaW5hbGx5IHsKKyAgICAgKiAgICAgZGIuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgKiAgIH0KKyAgICAgKiA8L3ByZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCkgeworICAgICAgICBiZWdpblRyYW5zYWN0aW9uKG51bGwgLyogdHJhbnNhY3Rpb25TdGF0dXNDYWxsYmFjayAqLywgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJlZ2lucyBhIHRyYW5zYWN0aW9uIGluIEVYQ0xVU0lWRSBtb2RlLgorICAgICAqIDxwPgorICAgICAqIFRyYW5zYWN0aW9ucyBjYW4gYmUgbmVzdGVkLgorICAgICAqIFdoZW4gdGhlIG91dGVyIHRyYW5zYWN0aW9uIGlzIGVuZGVkIGFsbCBvZgogICAgICAqIHRoZSB3b3JrIGRvbmUgaW4gdGhhdCB0cmFuc2FjdGlvbiBhbmQgYWxsIG9mIHRoZSBuZXN0ZWQgdHJhbnNhY3Rpb25zIHdpbGwgYmUgY29tbWl0dGVkIG9yCiAgICAgICogcm9sbGVkIGJhY2suIFRoZSBjaGFuZ2VzIHdpbGwgYmUgcm9sbGVkIGJhY2sgaWYgYW55IHRyYW5zYWN0aW9uIGlzIGVuZGVkIHdpdGhvdXQgYmVpbmcKICAgICAgKiBtYXJrZWQgYXMgY2xlYW4gKGJ5IGNhbGxpbmcgc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKS4gT3RoZXJ3aXNlIHRoZXkgd2lsbCBiZSBjb21taXR0ZWQuCi0gICAgICoKKyAgICAgKiA8L3A+CiAgICAgICogPHA+SGVyZSBpcyB0aGUgc3RhbmRhcmQgaWRpb20gZm9yIHRyYW5zYWN0aW9uczoKICAgICAgKgogICAgICAqIDxwcmU+CkBAIC00OTgsMTUgKzU2NSw0OCBAQAogICAgICAqICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOwogICAgICAqICAgfQogICAgICAqIDwvcHJlPgorICAgICAqCiAgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgdGhhdCBzaG91bGQgYmUgbm90aWZpZWQgd2hlbiB0aGUgdHJhbnNhY3Rpb24gYmVnaW5zLAogICAgICAqIGNvbW1pdHMsIG9yIGlzIHJvbGxlZCBiYWNrLCBlaXRoZXIgZXhwbGljaXRseSBvciBieSBhIGNhbGwgdG8KICAgICAgKiB7QGxpbmsgI3lpZWxkSWZDb250ZW5kZWRTYWZlbHl9LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGJlZ2luVHJhbnNhY3Rpb25XaXRoTGlzdGVuZXIoU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lciB0cmFuc2FjdGlvbkxpc3RlbmVyKSB7CisgICAgICAgIGJlZ2luVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25MaXN0ZW5lciwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmVnaW5zIGEgdHJhbnNhY3Rpb24gaW4gSU1NRURJQVRFIG1vZGUuIFRyYW5zYWN0aW9ucyBjYW4gYmUgbmVzdGVkLiBXaGVuCisgICAgICogdGhlIG91dGVyIHRyYW5zYWN0aW9uIGlzIGVuZGVkIGFsbCBvZiB0aGUgd29yayBkb25lIGluIHRoYXQgdHJhbnNhY3Rpb24KKyAgICAgKiBhbmQgYWxsIG9mIHRoZSBuZXN0ZWQgdHJhbnNhY3Rpb25zIHdpbGwgYmUgY29tbWl0dGVkIG9yIHJvbGxlZCBiYWNrLiBUaGUKKyAgICAgKiBjaGFuZ2VzIHdpbGwgYmUgcm9sbGVkIGJhY2sgaWYgYW55IHRyYW5zYWN0aW9uIGlzIGVuZGVkIHdpdGhvdXQgYmVpbmcKKyAgICAgKiBtYXJrZWQgYXMgY2xlYW4gKGJ5IGNhbGxpbmcgc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKS4gT3RoZXJ3aXNlIHRoZXkKKyAgICAgKiB3aWxsIGJlIGNvbW1pdHRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBIZXJlIGlzIHRoZSBzdGFuZGFyZCBpZGlvbSBmb3IgdHJhbnNhY3Rpb25zOgorICAgICAqCisgICAgICogPHByZT4KKyAgICAgKiAgIGRiLmJlZ2luVHJhbnNhY3Rpb25XaXRoTGlzdGVuZXJOb25FeGNsdXNpdmUobGlzdGVuZXIpOworICAgICAqICAgdHJ5IHsKKyAgICAgKiAgICAgLi4uCisgICAgICogICAgIGRiLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAqICAgfSBmaW5hbGx5IHsKKyAgICAgKiAgICAgZGIuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgKiAgIH0KKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIHRoYXQgc2hvdWxkIGJlIG5vdGlmaWVkIHdoZW4gdGhlCisgICAgICogICAgICAgICAgICB0cmFuc2FjdGlvbiBiZWdpbnMsIGNvbW1pdHMsIG9yIGlzIHJvbGxlZCBiYWNrLCBlaXRoZXIKKyAgICAgKiAgICAgICAgICAgIGV4cGxpY2l0bHkgb3IgYnkgYSBjYWxsIHRvIHtAbGluayAjeWllbGRJZkNvbnRlbmRlZFNhZmVseX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lck5vbkV4Y2x1c2l2ZSgKKyAgICAgICAgICAgIFNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIgdHJhbnNhY3Rpb25MaXN0ZW5lcikgeworICAgICAgICBiZWdpblRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uTGlzdGVuZXIsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYmVnaW5UcmFuc2FjdGlvbihTUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyIHRyYW5zYWN0aW9uTGlzdGVuZXIsCisgICAgICAgICAgICBib29sZWFuIGV4Y2x1c2l2ZSkgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBsb2NrRm9yY2VkKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KICAgICAgICAgYm9vbGVhbiBvayA9IGZhbHNlOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gSWYgdGhpcyB0aHJlYWQgYWxyZWFkeSBoYWQgdGhlIGxvY2sgdGhlbiBnZXQgb3V0CkBAIC01MjQsNyArNjI0LDExIEBACiAKICAgICAgICAgICAgIC8vIFRoaXMgdGhyZWFkIGRpZG4ndCBhbHJlYWR5IGhhdmUgdGhlIGxvY2ssIHNvIGJlZ2luIGEgZGF0YWJhc2UKICAgICAgICAgICAgIC8vIHRyYW5zYWN0aW9uIG5vdy4KLSAgICAgICAgICAgIGV4ZWNTUUwoIkJFR0lOIEVYQ0xVU0lWRTsiKTsKKyAgICAgICAgICAgIGlmIChleGNsdXNpdmUgJiYgbUNvbm5lY3Rpb25Qb29sID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBleGVjU1FMKCJCRUdJTiBFWENMVVNJVkU7Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV4ZWNTUUwoIkJFR0lOIElNTUVESUFURTsiKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1UcmFuc2FjdGlvbkxpc3RlbmVyID0gdHJhbnNhY3Rpb25MaXN0ZW5lcjsKICAgICAgICAgICAgIG1UcmFuc2FjdGlvbklzU3VjY2Vzc2Z1bCA9IHRydWU7CiAgICAgICAgICAgICBtSW5uZXJUcmFuc2FjdGlvbklzU3VjY2Vzc2Z1bCA9IGZhbHNlOwpAQCAtNTUxLDEyICs2NTUsNyBAQAogICAgICAqIGFyZSBjb21taXR0ZWQgYW5kIHJvbGxlZCBiYWNrLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGVuZFRyYW5zYWN0aW9uKCkgewotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbUxvY2suaXNIZWxkQnlDdXJyZW50VGhyZWFkKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vIHRyYW5zYWN0aW9uIHBlbmRpbmciKTsKLSAgICAgICAgfQorICAgICAgICB2ZXJpZnlMb2NrT3duZXIoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChtSW5uZXJUcmFuc2FjdGlvbklzU3VjY2Vzc2Z1bCkgewogICAgICAgICAgICAgICAgIG1Jbm5lclRyYW5zYWN0aW9uSXNTdWNjZXNzZnVsID0gZmFsc2U7CkBAIC01ODEsNiArNjgwLDE4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobVRyYW5zYWN0aW9uSXNTdWNjZXNzZnVsKSB7CiAgICAgICAgICAgICAgICAgZXhlY1NRTChDT01NSVRfU1FMKTsKKyAgICAgICAgICAgICAgICAvLyBpZiB3cml0ZS1haGVhZCBsb2dnaW5nIGlzIHVzZWQsIHdlIGhhdmUgdG8gdGFrZSBjYXJlIG9mIGNoZWNrcG9pbnQuCisgICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIGFwcGxpY2F0aW9ucyBiZSBnaXZlbiB0aGUgZmxleGliaWxpdHkgb2YgY2hvb3Npbmcgd2hlbiB0bworICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgY2hlY2twb2ludD8KKyAgICAgICAgICAgICAgICAvLyBmb3Igbm93LCBkbyBjaGVja3BvaW50IGFmdGVyIGV2ZXJ5IENPTU1JVCBiZWNhdXNlIHRoYXQgaXMgdGhlIGZhc3Rlc3QKKyAgICAgICAgICAgICAgICAvLyB3YXkgdG8gZ3VhcmFudGVlIHRoYXQgcmVhZGVycyB3aWxsIHNlZSBsYXRlc3QgZGF0YS4KKyAgICAgICAgICAgICAgICAvLyBidXQgdGhpcyBpcyB0aGUgc2xvd2VzdCB3YXkgdG8gcnVuIHNxbGl0ZSB3aXRoIGluIHdyaXRlLWFoZWFkIGxvZ2dpbmcgbW9kZS4KKyAgICAgICAgICAgICAgICBpZiAodGhpcy5tQ29ubmVjdGlvblBvb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBleGVjU1FMKCJQUkFHTUEgd2FsX2NoZWNrcG9pbnQ7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfU1RBVEVNRU5UUykgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiUFJBR01BIHdhbF9DaGVja3BvaW50IGRvbmUiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgZXhlY1NRTCgiUk9MTEJBQ0s7Iik7CkBAIC02MTQsOSArNzI1LDcgQEAKICAgICAgKiB0cmFuc2FjdGlvbiBpcyBhbHJlYWR5IG1hcmtlZCBhcyBzdWNjZXNzZnVsLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpIHsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQorICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBpZiAoIW1Mb2NrLmlzSGVsZEJ5Q3VycmVudFRocmVhZCgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJubyB0cmFuc2FjdGlvbiBwZW5kaW5nIik7CiAgICAgICAgIH0KQEAgLTYzMSw3ICs3NDAsNTAgQEAKICAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhIHRyYW5zYWN0aW9uIHBlbmRpbmcKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpblRyYW5zYWN0aW9uKCkgewotICAgICAgICByZXR1cm4gbUxvY2suZ2V0SG9sZENvdW50KCkgPiAwOworICAgICAgICByZXR1cm4gbUxvY2suZ2V0SG9sZENvdW50KCkgPiAwIHx8IG1UcmFuc2FjdGlvblVzaW5nRXhlY1NxbDsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCB2b2lkIHNldFRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsRmxhZygpIHsKKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiZm91bmQgZXhlY1NRTCgnYmVnaW4gdHJhbnNhY3Rpb24nKSIpOworICAgICAgICB9CisgICAgICAgIG1UcmFuc2FjdGlvblVzaW5nRXhlY1NxbCA9IHRydWU7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldFRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsRmxhZygpIHsKKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgaWYgKG1UcmFuc2FjdGlvblVzaW5nRXhlY1NxbCkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgImZvdW5kIGV4ZWNTUUwoJ2NvbW1pdCBvciBlbmQgb3Igcm9sbGJhY2snKSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1UcmFuc2FjdGlvblVzaW5nRXhlY1NxbCA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2FsbGVyIGlzIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgaWYgYW55LgorICAgICAqIDxwPgorICAgICAqIENhbGxlciBpcyBwYXJ0IG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGlmIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWUKKyAgICAgKiA8b2w+CisgICAgICogICA8bGk+SWYgdHJhbnNhY3Rpb24gaXMgc3RhcnRlZCBieSBjYWxsaW5nIGJlZ2luVHJhbnNhY3Rpb24oKSBtZXRob2RzIEFORCBpZiB0aGUgY2FsbGVyIGlzCisgICAgICogICBpbiB0aGUgc2FtZSB0aHJlYWQgYXMgdGhlIHRocmVhZCB0aGF0IHN0YXJ0ZWQgdGhlIHRyYW5zYWN0aW9uLgorICAgICAqICAgPC9saT4KKyAgICAgKiAgIDxsaT5JZiB0aGUgdHJhbnNhY3Rpb24gaXMgc3RhcnRlZCBieSBjYWxsaW5nIHtAbGluayAjZXhlY1NRTChTdHJpbmcpfSBsaWtlIHRoaXM6CisgICAgICogICBleGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpLiBJbiB0aGlzIGNhc2UsIGV2ZXJ5IHRocmVhZCBpbiB0aGUgcHJvY2VzcyBpcyBjb25zaWRlcmVkCisgICAgICogICBwYXJ0IG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLjwvbGk+CisgICAgICogPC9vbD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2FsbGVyIGlzIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgaWYgYW55LgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIGJvb2xlYW4gYW1JSW5UcmFuc2FjdGlvbigpIHsKKyAgICAgICAgLy8gYWx3YXlzIGRvIHRoaXMgdGVzdCBvbiB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIC0gTk9UIG9uIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICAgIC8vIHNpbmNlIHRyYW5zYWN0aW9ucyBhbHdheXMgb2NjdXIgb24gdGhlIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbnMgb25seS4KKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSAoaXNQb29sZWRDb25uZWN0aW9uKCkpID8gbVBhcmVudENvbm5PYmogOiB0aGlzOworICAgICAgICBib29sZWFuIGIgPSAoIWRiLmluVHJhbnNhY3Rpb24oKSkgPyBmYWxzZSA6CisgICAgICAgICAgICAgICAgZGIubVRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsIHx8IGRiLm1Mb2NrLmlzSGVsZEJ5Q3VycmVudFRocmVhZCgpOworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJhbUlpblRyYW5zYWN0aW9uOiAiICsgYik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGI7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MzUsNTQgKzg4NywxMiBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICAvKiogTWFwcyB0YWJsZSBuYW1lcyB0byBpbmZvIGFib3V0IHdoYXQgdG8gd2hpY2ggX3N5bmNfdGltZSBjb2x1bW4gdG8gc2V0Ci0gICAgICogdG8gTlVMTCBvbiBhbiB1cGRhdGUuIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IHN5bmNpbmcuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTeW5jVXBkYXRlSW5mbz4gbVN5bmNVcGRhdGVJbmZvID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgU3luY1VwZGF0ZUluZm8+KCk7Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRTeW5jZWRUYWJsZXMoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtU3luY1VwZGF0ZUluZm8pIHsKLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHRhYmxlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdGFibGUgOiBtU3luY1VwZGF0ZUluZm8ua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBTeW5jVXBkYXRlSW5mbyBpbmZvID0gbVN5bmNVcGRhdGVJbmZvLmdldCh0YWJsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZm8uZGVsZXRlZFRhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFibGVzLnB1dCh0YWJsZSwgaW5mby5kZWxldGVkVGFibGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0YWJsZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBjbGFzcyB1c2VkIHRvIGtlZXAgdHJhY2sgd2hhdCBuZWVkcyB0byBiZSBtYXJrZWQgYXMgY2hhbmdlZAotICAgICAqIHdoZW4gYW4gdXBkYXRlIG9jY3Vycy4gVGhpcyBpcyB1c2VkIGZvciBzeW5jaW5nLCBzbyB0aGUgc3luYyBlbmdpbmUKLSAgICAgKiBrbm93cyB3aGF0IGRhdGEgaGFzIGJlZW4gdXBkYXRlZCBsb2NhbGx5LgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIG5vIGxvbmdlciBzZXJ2ZXMgYW55IHVzZWZ1bCBwdXJwb3NlIGFuZCBoYXMgYmVlbiBkZXByZWNhdGVkLgogICAgICAqLwotICAgIHN0YXRpYyBwcml2YXRlIGNsYXNzIFN5bmNVcGRhdGVJbmZvIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgdGhlIFN5bmNVcGRhdGVJbmZvIGNsYXNzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbWFzdGVyVGFibGUgVGhlIHRhYmxlIHRvIHNldCBfc3luY190aW1lIHRvIE5VTEwgaW4KLSAgICAgICAgICogQHBhcmFtIGRlbGV0ZWRUYWJsZSBUaGUgZGVsZXRlZCB0YWJsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQotICAgICAgICAgKiAgICAgICAgICBtYXN0ZXIgdGFibGUKLSAgICAgICAgICogQHBhcmFtIGZvcmVpZ25LZXkgVGhlIGtleSB0aGF0IHJlZmVycyB0byB0aGUgcHJpbWFyeSBrZXkgaW4gdGFibGUKLSAgICAgICAgICovCi0gICAgICAgIFN5bmNVcGRhdGVJbmZvKFN0cmluZyBtYXN0ZXJUYWJsZSwgU3RyaW5nIGRlbGV0ZWRUYWJsZSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgZm9yZWlnbktleSkgewotICAgICAgICAgICAgdGhpcy5tYXN0ZXJUYWJsZSA9IG1hc3RlclRhYmxlOwotICAgICAgICAgICAgdGhpcy5kZWxldGVkVGFibGUgPSBkZWxldGVkVGFibGU7Ci0gICAgICAgICAgICB0aGlzLmZvcmVpZ25LZXkgPSBmb3JlaWduS2V5OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIFRoZSB0YWJsZSBjb250YWluaW5nIHRoZSBfc3luY190aW1lIGNvbHVtbiAqLwotICAgICAgICBTdHJpbmcgbWFzdGVyVGFibGU7Ci0KLSAgICAgICAgLyoqIFRoZSBkZWxldGVkIHRhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG1hc3RlciB0YWJsZSAqLwotICAgICAgICBTdHJpbmcgZGVsZXRlZFRhYmxlOwotCi0gICAgICAgIC8qKiBUaGUga2V5IGluIHRoZSBsb2NhbCB0YWJsZSB0aGUgcm93IGluIHRhYmxlLiBJdCBtYXkgYmUgX2lkLCBpZiB0YWJsZQotICAgICAgICAgKiBpcyB0aGUgbG9jYWwgdGFibGUuICovCi0gICAgICAgIFN0cmluZyBmb3JlaWduS2V5OworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0U3luY2VkVGFibGVzKCkgeworICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KDApOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzkxLDggKzkwMSw3IEBACiAgICAgcHVibGljIGludGVyZmFjZSBDdXJzb3JGYWN0b3J5IHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIFNlZQotICAgICAgICAgKiB7QGxpbmsgU1FMaXRlQ3Vyc29yI1NRTGl0ZUN1cnNvcihTUUxpdGVEYXRhYmFzZSwgU1FMaXRlQ3Vyc29yRHJpdmVyLAotICAgICAgICAgKiBTdHJpbmcsIFNRTGl0ZVF1ZXJ5KX0uCisgICAgICAgICAqIHtAbGluayBTUUxpdGVDdXJzb3IjU1FMaXRlQ3Vyc29yKFNRTGl0ZUN1cnNvckRyaXZlciwgU3RyaW5nLCBTUUxpdGVRdWVyeSl9LgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEN1cnNvciBuZXdDdXJzb3IoU1FMaXRlRGF0YWJhc2UgZGIsCiAgICAgICAgICAgICAgICAgU1FMaXRlQ3Vyc29yRHJpdmVyIG1hc3RlclF1ZXJ5LCBTdHJpbmcgZWRpdFRhYmxlLApAQCAtODE0LDMwICs5MjMsODAgQEAKICAgICAgKiBAdGhyb3dzIFNRTGl0ZUV4Y2VwdGlvbiBpZiB0aGUgZGF0YWJhc2UgY2Fubm90IGJlIG9wZW5lZAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU1FMaXRlRGF0YWJhc2Ugb3BlbkRhdGFiYXNlKFN0cmluZyBwYXRoLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCBmbGFncykgewotICAgICAgICBTUUxpdGVEYXRhYmFzZSBzcWxpdGVEYXRhYmFzZSA9IG51bGw7CisgICAgICAgIHJldHVybiBvcGVuRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgZmxhZ3MsIG5ldyBEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbiB0aGUgZGF0YWJhc2UgYWNjb3JkaW5nIHRvIHRoZSBmbGFncyB7QGxpbmsgI09QRU5fUkVBRFdSSVRFfQorICAgICAqIHtAbGluayAjT1BFTl9SRUFET05MWX0ge0BsaW5rICNDUkVBVEVfSUZfTkVDRVNTQVJZfSBhbmQvb3Ige0BsaW5rICNOT19MT0NBTElaRURfQ09MTEFUT1JTfS4KKyAgICAgKgorICAgICAqIDxwPlNldHMgdGhlIGxvY2FsZSBvZiB0aGUgZGF0YWJhc2UgdG8gdGhlICB0aGUgc3lzdGVtJ3MgY3VycmVudCBsb2NhbGUuCisgICAgICogQ2FsbCB7QGxpbmsgI3NldExvY2FsZX0gaWYgeW91IHdvdWxkIGxpa2Ugc29tZXRoaW5nIGVsc2UuPC9wPgorICAgICAqCisgICAgICogPHA+QWNjZXB0cyBpbnB1dCBwYXJhbTogYSBjb25jcmV0ZSBpbnN0YW5jZSBvZiB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlCisgICAgICogdXNlZCB0byBoYW5kbGUgY29ycnVwdGlvbiB3aGVuIHNxbGl0ZSByZXBvcnRzIGRhdGFiYXNlIGNvcnJ1cHRpb24uPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggdG8gZGF0YWJhc2UgZmlsZSB0byBvcGVuIGFuZC9vciBjcmVhdGUKKyAgICAgKiBAcGFyYW0gZmFjdG9yeSBhbiBvcHRpb25hbCBmYWN0b3J5IGNsYXNzIHRoYXQgaXMgY2FsbGVkIHRvIGluc3RhbnRpYXRlIGEKKyAgICAgKiAgICAgICAgICAgIGN1cnNvciB3aGVuIHF1ZXJ5IGlzIGNhbGxlZCwgb3IgbnVsbCBmb3IgZGVmYXVsdAorICAgICAqIEBwYXJhbSBmbGFncyB0byBjb250cm9sIGRhdGFiYXNlIGFjY2VzcyBtb2RlCisgICAgICogQHBhcmFtIGVycm9ySGFuZGxlciB0aGUge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSBvYmogdG8gYmUgdXNlZCB0byBoYW5kbGUgY29ycnVwdGlvbgorICAgICAqIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UgY29ycnVwdGlvbgorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IG9wZW5lZCBkYXRhYmFzZQorICAgICAqIEB0aHJvd3MgU1FMaXRlRXhjZXB0aW9uIGlmIHRoZSBkYXRhYmFzZSBjYW5ub3QgYmUgb3BlbmVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTUUxpdGVEYXRhYmFzZSBvcGVuRGF0YWJhc2UoU3RyaW5nIHBhdGgsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IGZsYWdzLAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIHNxbGl0ZURhdGFiYXNlID0gb3BlbkRhdGFiYXNlKHBhdGgsIGZhY3RvcnksIGZsYWdzLCBlcnJvckhhbmRsZXIsCisgICAgICAgICAgICAgICAgKHNob3J0KSAwIC8qIHRoZSBtYWluIGNvbm5lY3Rpb24gaGFuZGxlICovKTsKKworICAgICAgICAvLyBzZXQgc3FsaXRlIHBhZ2VzaXplIHRvIG1CbG9ja1NpemUKKyAgICAgICAgaWYgKHNCbG9ja1NpemUgPT0gMCkgeworICAgICAgICAgICAgLy8gVE9ETzogIi9kYXRhIiBzaG91bGQgYmUgYSBzdGF0aWMgZmluYWwgU3RyaW5nIGNvbnN0YW50IHNvbWV3aGVyZS4gaXQgaXMgaGFyZGNvZGVkCisgICAgICAgICAgICAvLyBpbiBzZXZlcmFsIHBsYWNlcyByaWdodCBub3cuCisgICAgICAgICAgICBzQmxvY2tTaXplID0gbmV3IFN0YXRGcygiL2RhdGEiKS5nZXRCbG9ja1NpemUoKTsKKyAgICAgICAgfQorICAgICAgICBzcWxpdGVEYXRhYmFzZS5zZXRQYWdlU2l6ZShzQmxvY2tTaXplKTsKKyAgICAgICAgLy9TVE9QU0hJUCAtIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUKKyAgICAgICAgLy9zcWxpdGVEYXRhYmFzZS5zZXRKb3VybmFsTW9kZShwYXRoLCAiVFJVTkNBVEUiKTsKKyAgICAgICAgLy8gU1RPUFNISVAgcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZXMKKyAgICAgICAgaWYgKCFwYXRoLmVxdWFsc0lnbm9yZUNhc2UoTUVNT1JZX0RCX1BBVEgpKSB7CisgICAgICAgICAgICBzcWxpdGVEYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICB9CisgICAgICAgIC8vIEVORCBTVE9QU0hJUAorCisgICAgICAgIC8vIGFkZCB0aGlzIGRhdGFiYXNlIHRvIHRoZSBsaXN0IG9mIGRhdGFiYXNlcyBvcGVuZWQgaW4gdGhpcyBwcm9jZXNzCisgICAgICAgIHN5bmNocm9uaXplZChtQWN0aXZlRGF0YWJhc2VzKSB7CisgICAgICAgICAgICBtQWN0aXZlRGF0YWJhc2VzLmFkZChuZXcgV2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4oc3FsaXRlRGF0YWJhc2UpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3FsaXRlRGF0YWJhc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU1FMaXRlRGF0YWJhc2Ugb3BlbkRhdGFiYXNlKFN0cmluZyBwYXRoLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCBmbGFncywKKyAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciwgc2hvcnQgY29ubmVjdGlvbk51bSkgeworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG5ldyBTUUxpdGVEYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBmbGFncywgZXJyb3JIYW5kbGVyLCBjb25uZWN0aW9uTnVtKTsKICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJvcGVuaW5nIHRoZSBkYiA6ICIgKyBwYXRoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIE9wZW4gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgc3FsaXRlRGF0YWJhc2UgPSBuZXcgU1FMaXRlRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgZmxhZ3MpOworICAgICAgICAgICAgZGIuZGJvcGVuKHBhdGgsIGZsYWdzKTsKKyAgICAgICAgICAgIGRiLnNldExvY2FsZShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfU1RBVEVNRU5UUykgewotICAgICAgICAgICAgICAgIHNxbGl0ZURhdGFiYXNlLmVuYWJsZVNxbFRyYWNpbmcocGF0aCk7CisgICAgICAgICAgICAgICAgZGIuZW5hYmxlU3FsVHJhY2luZyhwYXRoLCBjb25uZWN0aW9uTnVtKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfVElNRSkgewotICAgICAgICAgICAgICAgIHNxbGl0ZURhdGFiYXNlLmVuYWJsZVNxbFByb2ZpbGluZyhwYXRoKTsKKyAgICAgICAgICAgICAgICBkYi5lbmFibGVTcWxQcm9maWxpbmcocGF0aCwgY29ubmVjdGlvbk51bSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZGI7CiAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUcnkgdG8gcmVjb3ZlciBmcm9tIHRoaXMsIGlmIHdlIGNhbi4KLSAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBkbyB0aGlzIGZvciBvdGhlciBvcGVuIGZhaWx1cmVzPwotICAgICAgICAgICAgTG9nLmUoVEFHLCAiRGVsZXRpbmcgYW5kIHJlLWNyZWF0aW5nIGNvcnJ1cHQgZGF0YWJhc2UgIiArIHBhdGgsIGUpOwotICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVF9EQl9DT1JSVVBULCBwYXRoKTsKLSAgICAgICAgICAgIGlmICghcGF0aC5lcXVhbHNJZ25vcmVDYXNlKCI6bWVtb3J5IikpIHsKLSAgICAgICAgICAgICAgICAvLyBkZWxldGUgaXMgb25seSBmb3Igbm9uLW1lbW9yeSBkYXRhYmFzZSBmaWxlcwotICAgICAgICAgICAgICAgIG5ldyBGaWxlKHBhdGgpLmRlbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3FsaXRlRGF0YWJhc2UgPSBuZXcgU1FMaXRlRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgZmxhZ3MpOworICAgICAgICAgICAgZGIubUVycm9ySGFuZGxlci5vbkNvcnJ1cHRpb24oZGIpOworICAgICAgICAgICAgcmV0dXJuIFNRTGl0ZURhdGFiYXNlLm9wZW5EYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBmbGFncywgZXJyb3JIYW5kbGVyKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBvcGVuIHRoZSBkYXRhYmFzZS4gY2xvc2luZyBpdC4iLCBlKTsKKyAgICAgICAgICAgIGRiLmNsb3NlKCk7CisgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICB9Ci0gICAgICAgIEFjdGl2ZURhdGFiYXNlcy5nZXRJbnN0YW5jZSgpLm1BY3RpdmVEYXRhYmFzZXMuYWRkKAotICAgICAgICAgICAgICAgIG5ldyBXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPihzcWxpdGVEYXRhYmFzZSkpOwotICAgICAgICByZXR1cm4gc3FsaXRlRGF0YWJhc2U7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NTUsNiArMTAxNCwyNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gb3BlbkRhdGFiYXNlKHBhdGgsIGZhY3RvcnksIENSRUFURV9JRl9ORUNFU1NBUlksIGVycm9ySGFuZGxlcikuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZShTdHJpbmcgcGF0aCwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CisgICAgICAgIHJldHVybiBvcGVuRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgQ1JFQVRFX0lGX05FQ0VTU0FSWSwgZXJyb3JIYW5kbGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0Sm91cm5hbE1vZGUoZmluYWwgU3RyaW5nIGRiUGF0aCwgZmluYWwgU3RyaW5nIG1vZGUpIHsKKyAgICAgICAgLy8gam91cm5hbCBtb2RlIGNhbiBiZSBzZXQgb25seSBmb3Igbm9uLW1lbW9yeSBkYXRhYmFzZXMKKyAgICAgICAgaWYgKCFkYlBhdGguZXF1YWxzSWdub3JlQ2FzZShNRU1PUllfREJfUEFUSCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gRGF0YWJhc2VVdGlscy5zdHJpbmdGb3JRdWVyeSh0aGlzLCAiUFJBR01BIGpvdXJuYWxfbW9kZT0iICsgbW9kZSwgbnVsbCk7CisgICAgICAgICAgICBpZiAoIXMuZXF1YWxzSWdub3JlQ2FzZShtb2RlKSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInNldHRpbmcgam91cm5hbF9tb2RlIHRvICIgKyBtb2RlICsgIiBmYWlsZWQgZm9yIGRiOiAiICsgZGJQYXRoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgKG9uIHByYWdtYSBzZXQgam91cm5hbF9tb2RlLCBzcWxpdGUgcmV0dXJuZWQ6IiArIHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgbWVtb3J5IGJhY2tlZCBTUUxpdGUgZGF0YWJhc2UuICBJdHMgY29udGVudHMgd2lsbCBiZSBkZXN0cm95ZWQKICAgICAgKiB3aGVuIHRoZSBkYXRhYmFzZSBpcyBjbG9zZWQuCiAgICAgICoKQEAgLTg2Nyw3ICsxMDQ1LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFNRTGl0ZURhdGFiYXNlIGNyZWF0ZShDdXJzb3JGYWN0b3J5IGZhY3RvcnkpIHsKICAgICAgICAgLy8gVGhpcyBpcyBhIG1hZ2ljIHN0cmluZyB3aXRoIHNwZWNpYWwgbWVhbmluZyBmb3IgU1FMaXRlLgotICAgICAgICByZXR1cm4gb3BlbkRhdGFiYXNlKCI6bWVtb3J5OiIsIGZhY3RvcnksIENSRUFURV9JRl9ORUNFU1NBUlkpOworICAgICAgICByZXR1cm4gb3BlbkRhdGFiYXNlKE1FTU9SWV9EQl9QQVRILCBmYWN0b3J5LCBDUkVBVEVfSUZfTkVDRVNTQVJZKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg3NSwyMCArMTA1MywzOCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewogICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICByZXR1cm47IC8vIGFscmVhZHkgY2xvc2VkCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiY2xvc2luZyBkYjogIiArIG1QYXRoICsgIiAoY29ubmVjdGlvbiAjICIgKyBtQ29ubmVjdGlvbk51bSk7CiAgICAgICAgIH0KICAgICAgICAgbG9jaygpOwogICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gc29tZSBvdGhlciB0aHJlYWQgY291bGQgaGF2ZSBjbG9zZWQgdGhpcyBkYXRhYmFzZSB3aGlsZSBJIHdhcyB3YWl0aW5nIGZvciBsb2NrLgorICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGRhdGFiYXNlIHN0YXRlCisgICAgICAgICAgICBpZiAoIWlzT3BlbigpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICAgICAgY2xvc2VDbG9zYWJsZSgpOworICAgICAgICAgICAgLy8gZmluYWxpemUgQUxMIHN0YXRlbWVudHMgcXVldWVkIHVwIHNvIGZhcgorICAgICAgICAgICAgY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOworICAgICAgICAgICAgcmVsZWFzZUN1c3RvbUZ1bmN0aW9ucygpOwogICAgICAgICAgICAgLy8gY2xvc2UgdGhpcyBkYXRhYmFzZSBpbnN0YW5jZSAtIHJlZ2FyZGxlc3Mgb2YgaXRzIHJlZmVyZW5jZSBjb3VudCB2YWx1ZQotICAgICAgICAgICAgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWQoKTsKKyAgICAgICAgICAgIGNsb3NlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvblBvb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG1Db25uZWN0aW9uUG9vbCAhPSBudWxsOworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsIG1Db25uZWN0aW9uUG9vbC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25Qb29sLmNsb3NlKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgICAgIHVubG9jaygpOyAgICAgICAgICAgIAogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGNsb3NlQ2xvc2FibGUoKSB7Ci0gICAgICAgIC8qIGRlYWxsb2NhdGUgYWxsIGNvbXBpbGVkIHNxbCBzdGF0ZW1lbnQgb2JqZWN0cyBmcm9tIG1Db21waWxlZFF1ZXJpZXMgY2FjaGUuCisgICAgICAgIC8qIGRlYWxsb2NhdGUgYWxsIGNvbXBpbGVkIFNRTCBzdGF0ZW1lbnQgb2JqZWN0cyBmcm9tIG1Db21waWxlZFF1ZXJpZXMgY2FjaGUuCiAgICAgICAgICAqIHRoaXMgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIGRlLXJlZmVyZW5jaW5nIGFsbCB7QGxpbmsgU1FMaXRlQ2xvc2FibGV9IG9iamVjdHMKICAgICAgICAgICogZnJvbSB0aGlzIGRhdGFiYXNlIG9iamVjdCBiZWNhdXNlIGNhbGxpbmcKICAgICAgICAgICoge0BsaW5rIFNRTGl0ZUNsb3NhYmxlI29uQWxsUmVmZXJlbmNlc1JlbGVhc2VkRnJvbUNvbnRhaW5lcigpfSBjb3VsZCBjYXVzZSB0aGUgZGF0YWJhc2UKQEAgLTkwOCwyOSArMTEwNCwxMDYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBwYWNrYWdlIGxldmVsIGFjY2VzcyBmb3IgdGVzdGluZyBwdXJwb3NlcworICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBjbG9zZURhdGFiYXNlKCkgdGhyb3dzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkYmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZVVuZmluYWxpemVkT2JqZWN0c0V4Y2VwdGlvbiBlKSAgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgU3RyaW5nW10gdG9rZW5zID0gbXNnLnNwbGl0KCIsIiwgMik7CisgICAgICAgICAgICBpbnQgc3RtdElkID0gSW50ZWdlci5wYXJzZUludCh0b2tlbnNbMF0pOworICAgICAgICAgICAgLy8gZ2V0IGV4dHJhIGluZm8gYWJvdXQgdGhpcyBzdGF0ZW1lbnQsIGlmIGl0IGlzIHN0aWxsIHRvIGJlIHJlbGVhc2VkIGJ5IGNsb3NlQ2xvc2FibGUoKQorICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFNRTGl0ZUNsb3NhYmxlLCBPYmplY3Q+PiBpdGVyID0gbVByb2dyYW1zLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxTUUxpdGVDbG9zYWJsZSwgT2JqZWN0PiBlbnRyeSA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIFNRTGl0ZUNsb3NhYmxlIHByb2dyYW0gPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvZ3JhbSAhPSBudWxsICYmIHByb2dyYW0gaW5zdGFuY2VvZiBTUUxpdGVQcm9ncmFtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTUUxpdGVDb21waWxlZFNxbCBjb21waWxlZFNxbCA9ICgoU1FMaXRlUHJvZ3JhbSlwcm9ncmFtKS5tQ29tcGlsZWRTcWw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGlsZWRTcWwublN0YXRlbWVudCA9PSBzdG10SWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBjb21waWxlZFNxbC50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgLy8gdGhlIHN0YXRlbWVudCBpcyBhbHJlYWR5IHJlbGVhc2VkIGJ5IGNsb3NlQ2xvc2FibGUoKS4gaXMgaXQgd2FpdGluZyB0byBiZQorICAgICAgICAgICAgICAgIC8vIGZpbmFsaXplZD8KKyAgICAgICAgICAgICAgICBpZiAobUNsb3NlZFN0YXRlbWVudElkcy5jb250YWlucyhzdG10SWQpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInRoaXMgc2hvdWxkbid0IGhhcHBlbi4gZmluYWxpemluZyB0aGUgc3RhdGVtZW50IG5vdzogIik7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlUGVuZGluZ1N0YXRlbWVudHMoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGNsb3NlIHRoZSBkYXRhYmFzZSBhZ2FpbgorICAgICAgICAgICAgICAgICAgICBjbG9zZURhdGFiYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgc3RhdGVtZW50IGlzIG5vdCB5ZXQgY2xvc2VkLiBtb3N0IHByb2JhYmx5IHByb2dyYW1taW5nIGVycm9yIGluIHRoZSBhcHAuCisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiZGJjbG9zZSBmYWlsZWQgZHVlIHRvIHVuLWNsb3NlKClkIFNRTCBzdGF0ZW1lbnRzOiAiICsgbXNnKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogTmF0aXZlIGNhbGwgdG8gY2xvc2UgdGhlIGRhdGFiYXNlLgogICAgICAqLwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZGJjbG9zZSgpOwogCiAgICAgLyoqCisgICAgICogQSBjYWxsYmFjayBpbnRlcmZhY2UgZm9yIGEgY3VzdG9tIHNxbGl0ZTMgZnVuY3Rpb24uCisgICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgZnJvbQorICAgICAqIHNxbGl0ZTMgZGF0YWJhc2UgdHJpZ2dlcnMuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIEN1c3RvbUZ1bmN0aW9uIHsKKyAgICAgICAgcHVibGljIHZvaWQgY2FsbGJhY2soU3RyaW5nW10gYXJncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgQ3VzdG9tRnVuY3Rpb24gY2FsbGJhY2sgYXMgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgZnJvbQorICAgICAqIHNxbGl0ZTMgZGF0YWJhc2UgdHJpZ2dlcnMuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHNxbGl0ZTMgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gbnVtQXJncyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgdGhlIGZ1bmN0aW9uCisgICAgICogQHBhcmFtIGZ1bmN0aW9uIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZnVuY3Rpb24gaXMgZXhlY3V0ZWQKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEN1c3RvbUZ1bmN0aW9uKFN0cmluZyBuYW1lLCBpbnQgbnVtQXJncywgQ3VzdG9tRnVuY3Rpb24gZnVuY3Rpb24pIHsKKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtQ3VzdG9tRnVuY3Rpb25zKSB7CisgICAgICAgICAgICBpbnQgcmVmID0gbmF0aXZlX2FkZEN1c3RvbUZ1bmN0aW9uKG5hbWUsIG51bUFyZ3MsIGZ1bmN0aW9uKTsKKyAgICAgICAgICAgIGlmIChyZWYgIT0gMCkgeworICAgICAgICAgICAgICAgIC8vIHNhdmUgYSByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uIGZvciBjbGVhbnVwIGxhdGVyCisgICAgICAgICAgICAgICAgbUN1c3RvbUZ1bmN0aW9ucy5hZGQobmV3IEludGVnZXIocmVmKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTUUxpdGVFeGNlcHRpb24oImZhaWxlZCB0byBhZGQgY3VzdG9tIGZ1bmN0aW9uICIgKyBuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWxlYXNlQ3VzdG9tRnVuY3Rpb25zKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1DdXN0b21GdW5jdGlvbnMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUN1c3RvbUZ1bmN0aW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEludGVnZXIgZnVuY3Rpb24gPSBtQ3VzdG9tRnVuY3Rpb25zLmdldChpKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfcmVsZWFzZUN1c3RvbUZ1bmN0aW9uKGZ1bmN0aW9uLmludFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUN1c3RvbUZ1bmN0aW9ucy5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gbGlzdCBvZiBDdXN0b21GdW5jdGlvbiByZWZlcmVuY2VzIHNvIHdlIGNhbiBjbGVhbiB1cCB3aGVuIHRoZSBkYXRhYmFzZSBjbG9zZXMKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJbnRlZ2VyPiBtQ3VzdG9tRnVuY3Rpb25zID0KKyAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVfYWRkQ3VzdG9tRnVuY3Rpb24oU3RyaW5nIG5hbWUsIGludCBudW1BcmdzLCBDdXN0b21GdW5jdGlvbiBmdW5jdGlvbik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVfcmVsZWFzZUN1c3RvbUZ1bmN0aW9uKGludCBmdW5jdGlvbik7CisKKyAgICAvKioKICAgICAgKiBHZXRzIHRoZSBkYXRhYmFzZSB2ZXJzaW9uLgogICAgICAqCiAgICAgICogQHJldHVybiB0aGUgZGF0YWJhc2UgdmVyc2lvbgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHByb2cgPSBudWxsOwotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByb2cgPSBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsICJQUkFHTUEgdXNlcl92ZXJzaW9uOyIpOwotICAgICAgICAgICAgbG9uZyB2ZXJzaW9uID0gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKLSAgICAgICAgICAgIHJldHVybiAoaW50KSB2ZXJzaW9uOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHByb2cgIT0gbnVsbCkgcHJvZy5jbG9zZSgpOwotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgoTG9uZykgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkodGhpcywgIlBSQUdNQSB1c2VyX3ZlcnNpb247IiwgbnVsbCkpLmludFZhbHVlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05NDgsMjAgKzEyMjEsOCBAQAogICAgICAqIEByZXR1cm4gdGhlIG5ldyBtYXhpbXVtIGRhdGFiYXNlIHNpemUKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBnZXRNYXhpbXVtU2l6ZSgpIHsKLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHByb2cgPSBudWxsOwotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByb2cgPSBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICJQUkFHTUEgbWF4X3BhZ2VfY291bnQ7Iik7Ci0gICAgICAgICAgICBsb25nIHBhZ2VDb3VudCA9IHByb2cuc2ltcGxlUXVlcnlGb3JMb25nKCk7Ci0gICAgICAgICAgICByZXR1cm4gcGFnZUNvdW50ICogZ2V0UGFnZVNpemUoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChwcm9nICE9IG51bGwpIHByb2cuY2xvc2UoKTsKLSAgICAgICAgICAgIHVubG9jaygpOwotICAgICAgICB9CisgICAgICAgIGxvbmcgcGFnZUNvdW50ID0gRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkodGhpcywgIlBSQUdNQSBtYXhfcGFnZV9jb3VudDsiLCBudWxsKTsKKyAgICAgICAgcmV0dXJuIHBhZ2VDb3VudCAqIGdldFBhZ2VTaXplKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05NzIsMjYgKzEyMzMsMTUgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBuZXcgbWF4aW11bSBkYXRhYmFzZSBzaXplCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgc2V0TWF4aW11bVNpemUobG9uZyBudW1CeXRlcykgewotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IG51bGw7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKKyAgICAgICAgbG9uZyBwYWdlU2l6ZSA9IGdldFBhZ2VTaXplKCk7CisgICAgICAgIGxvbmcgbnVtUGFnZXMgPSBudW1CeXRlcyAvIHBhZ2VTaXplOworICAgICAgICAvLyBJZiBudW1CeXRlcyBpc24ndCBhIG11bHRpcGxlIG9mIHBhZ2VTaXplLCBidW1wIHVwIGEgcGFnZQorICAgICAgICBpZiAoKG51bUJ5dGVzICUgcGFnZVNpemUpICE9IDApIHsKKyAgICAgICAgICAgIG51bVBhZ2VzKys7CiAgICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxvbmcgcGFnZVNpemUgPSBnZXRQYWdlU2l6ZSgpOwotICAgICAgICAgICAgbG9uZyBudW1QYWdlcyA9IG51bUJ5dGVzIC8gcGFnZVNpemU7Ci0gICAgICAgICAgICAvLyBJZiBudW1CeXRlcyBpc24ndCBhIG11bHRpcGxlIG9mIHBhZ2VTaXplLCBidW1wIHVwIGEgcGFnZQotICAgICAgICAgICAgaWYgKChudW1CeXRlcyAlIHBhZ2VTaXplKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbnVtUGFnZXMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb2cgPSBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICJQUkFHTUEgbWF4X3BhZ2VfY291bnQgPSAiICsgbnVtUGFnZXMpOwotICAgICAgICAgICAgbG9uZyBuZXdQYWdlQ291bnQgPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOwotICAgICAgICAgICAgcmV0dXJuIG5ld1BhZ2VDb3VudCAqIHBhZ2VTaXplOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHByb2cgIT0gbnVsbCkgcHJvZy5jbG9zZSgpOwotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgbG9uZyBuZXdQYWdlQ291bnQgPSBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeSh0aGlzLCAiUFJBR01BIG1heF9wYWdlX2NvdW50ID0gIiArIG51bVBhZ2VzLAorICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICByZXR1cm4gbmV3UGFnZUNvdW50ICogcGFnZVNpemU7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDAwLDIwICsxMjUwLDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBkYXRhYmFzZSBwYWdlIHNpemUsIGluIGJ5dGVzCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgZ2V0UGFnZVNpemUoKSB7Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBwcm9nID0gbnVsbDsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm9nID0gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLAotICAgICAgICAgICAgICAgICAgICAiUFJBR01BIHBhZ2Vfc2l6ZTsiKTsKLSAgICAgICAgICAgIGxvbmcgc2l6ZSA9IHByb2cuc2ltcGxlUXVlcnlGb3JMb25nKCk7Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChwcm9nICE9IG51bGwpIHByb2cuY2xvc2UoKTsKLSAgICAgICAgICAgIHVubG9jaygpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeSh0aGlzLCAiUFJBR01BIHBhZ2Vfc2l6ZTsiLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMzQsOSArMTI3MSwxMCBAQAogICAgICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgdG8gbWFyayBhcyBzeW5jYWJsZQogICAgICAqIEBwYXJhbSBkZWxldGVkVGFibGUgVGhlIGRlbGV0ZWQgdGFibGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUKICAgICAgKiAgICAgICAgICBzeW5jYWJsZSB0YWJsZQorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIG5vIGxvbmdlciBzZXJ2ZXMgYW55IHVzZWZ1bCBwdXJwb3NlIGFuZCBoYXMgYmVlbiBkZXByZWNhdGVkLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgbWFya1RhYmxlU3luY2FibGUoU3RyaW5nIHRhYmxlLCBTdHJpbmcgZGVsZXRlZFRhYmxlKSB7Ci0gICAgICAgIG1hcmtUYWJsZVN5bmNhYmxlKHRhYmxlLCAiX2lkIiwgdGFibGUsIGRlbGV0ZWRUYWJsZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDQ5LDYwICsxMjg3LDEwIEBACiAgICAgICogQHBhcmFtIGZvcmVpZ25LZXkgdGhpcyBpcyB0aGUgY29sdW1uIGluIHRhYmxlIHdob3NlIHZhbHVlIGlzIGFuIF9pZCBpbgogICAgICAqICAgICAgICAgIHVwZGF0ZVRhYmxlCiAgICAgICogQHBhcmFtIHVwZGF0ZVRhYmxlIHRoaXMgaXMgdGhlIHRhYmxlIHRoYXQgd2lsbCBoYXZlIGl0cyBfc3luY19kaXJ0eQorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIG5vIGxvbmdlciBzZXJ2ZXMgYW55IHVzZWZ1bCBwdXJwb3NlIGFuZCBoYXMgYmVlbiBkZXByZWNhdGVkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1hcmtUYWJsZVN5bmNhYmxlKFN0cmluZyB0YWJsZSwgU3RyaW5nIGZvcmVpZ25LZXksCi0gICAgICAgICAgICBTdHJpbmcgdXBkYXRlVGFibGUpIHsKLSAgICAgICAgbWFya1RhYmxlU3luY2FibGUodGFibGUsIGZvcmVpZ25LZXksIHVwZGF0ZVRhYmxlLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXJrIHRoaXMgdGFibGUgYXMgc3luY2FibGUsIHdpdGggdGhlIF9zeW5jX2RpcnR5IHJlc2lkaW5nIGluIGFub3RoZXIKLSAgICAgKiB0YWJsZS4gV2hlbiBhbiB1cGRhdGUgb2NjdXJzIGluIHRoaXMgdGFibGUgdGhlIF9zeW5jX2RpcnR5IGZpZWxkIG9mIHRoZQotICAgICAqIHJvdyBpbiB1cGRhdGVUYWJsZSB3aXRoIHRoZSBfaWQgaW4gZm9yZWlnbktleSB3aWxsIGJlIHNldCB0bwotICAgICAqIGVuc3VyZSBwcm9wZXIgc3luY2luZyBvcGVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFibGUgYW4gdXBkYXRlIG9uIHRoaXMgdGFibGUgd2lsbCB0cmlnZ2VyIGEgc3luYyB0aW1lIHJlbW92YWwKLSAgICAgKiBAcGFyYW0gZm9yZWlnbktleSB0aGlzIGlzIHRoZSBjb2x1bW4gaW4gdGFibGUgd2hvc2UgdmFsdWUgaXMgYW4gX2lkIGluCi0gICAgICogICAgICAgICAgdXBkYXRlVGFibGUKLSAgICAgKiBAcGFyYW0gdXBkYXRlVGFibGUgdGhpcyBpcyB0aGUgdGFibGUgdGhhdCB3aWxsIGhhdmUgaXRzIF9zeW5jX2RpcnR5Ci0gICAgICogQHBhcmFtIGRlbGV0ZWRUYWJsZSBUaGUgZGVsZXRlZCB0YWJsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQotICAgICAqICAgICAgICAgIHVwZGF0ZVRhYmxlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG1hcmtUYWJsZVN5bmNhYmxlKFN0cmluZyB0YWJsZSwgU3RyaW5nIGZvcmVpZ25LZXksCi0gICAgICAgICAgICBTdHJpbmcgdXBkYXRlVGFibGUsIFN0cmluZyBkZWxldGVkVGFibGUpIHsKLSAgICAgICAgbG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2V4ZWNTUUwoIlNFTEVDVCBfc3luY19kaXJ0eSBGUk9NICIgKyB1cGRhdGVUYWJsZQotICAgICAgICAgICAgICAgICAgICArICIgTElNSVQgMCIpOwotICAgICAgICAgICAgbmF0aXZlX2V4ZWNTUUwoIlNFTEVDVCAiICsgZm9yZWlnbktleSArICIgRlJPTSAiICsgdGFibGUKLSAgICAgICAgICAgICAgICAgICAgKyAiIExJTUlUIDAiKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHVubG9jaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3luY1VwZGF0ZUluZm8gaW5mbyA9IG5ldyBTeW5jVXBkYXRlSW5mbyh1cGRhdGVUYWJsZSwgZGVsZXRlZFRhYmxlLAotICAgICAgICAgICAgICAgIGZvcmVpZ25LZXkpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jVXBkYXRlSW5mbykgewotICAgICAgICAgICAgbVN5bmNVcGRhdGVJbmZvLnB1dCh0YWJsZSwgaW5mbyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsIGZvciBlYWNoIHJvdyB0aGF0IGlzIHVwZGF0ZWQgaW4gYSBjdXJzb3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFibGUgdGhlIHRhYmxlIHRoZSByb3cgaXMgaW4KLSAgICAgKiBAcGFyYW0gcm93SWQgdGhlIHJvdyBJRCBvZiB0aGUgdXBkYXRlZCByb3cKLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHZvaWQgcm93VXBkYXRlZChTdHJpbmcgdGFibGUsIGxvbmcgcm93SWQpIHsKLSAgICAgICAgU3luY1VwZGF0ZUluZm8gaW5mbzsKLSAgICAgICAgc3luY2hyb25pemVkIChtU3luY1VwZGF0ZUluZm8pIHsKLSAgICAgICAgICAgIGluZm8gPSBtU3luY1VwZGF0ZUluZm8uZ2V0KHRhYmxlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBleGVjU1FMKCJVUERBVEUgIiArIGluZm8ubWFzdGVyVGFibGUKLSAgICAgICAgICAgICAgICAgICAgKyAiIFNFVCBfc3luY19kaXJ0eT0xIFdIRVJFIF9pZD0oU0VMRUNUICIgKyBpbmZvLmZvcmVpZ25LZXkKLSAgICAgICAgICAgICAgICAgICAgKyAiIEZST00gIiArIHRhYmxlICsgIiBXSEVSRSBfaWQ9IiArIHJvd0lkICsgIikiKTsKLSAgICAgICAgfQorICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIHZvaWQgbWFya1RhYmxlU3luY2FibGUoU3RyaW5nIHRhYmxlLCBTdHJpbmcgZm9yZWlnbktleSwgU3RyaW5nIHVwZGF0ZVRhYmxlKSB7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTM0LDYgKzEzMjIsOCBAQAogICAgICAqIHN0YXRlbWVudCBhbmQgZmlsbCBpbiB0aG9zZSB2YWx1ZXMgd2l0aCB7QGxpbmsgU1FMaXRlUHJvZ3JhbSNiaW5kU3RyaW5nfQogICAgICAqIGFuZCB7QGxpbmsgU1FMaXRlUHJvZ3JhbSNiaW5kTG9uZ30gZWFjaCB0aW1lIHlvdSB3YW50IHRvIHJ1biB0aGUKICAgICAgKiBzdGF0ZW1lbnQuIFN0YXRlbWVudHMgbWF5IG5vdCByZXR1cm4gcmVzdWx0IHNldHMgbGFyZ2VyIHRoYW4gMXgxLgorICAgICAqPHA+CisgICAgICogTm8gdHdvIHRocmVhZHMgc2hvdWxkIGJlIHVzaW5nIHRoZSBzYW1lIHtAbGluayBTUUxpdGVTdGF0ZW1lbnR9IGF0IHRoZSBzYW1lIHRpbWUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gc3FsIFRoZSByYXcgU1FMIHN0YXRlbWVudCwgbWF5IGNvbnRhaW4gPyBmb3IgdW5rbm93biB2YWx1ZXMgdG8gYmUKICAgICAgKiAgICAgICAgICAgIGJvdW5kIGxhdGVyLgpAQCAtMTE0MSwxNSArMTMzMSw4IEBACiAgICAgICoge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH1zIGFyZSBub3Qgc3luY2hyb25pemVkLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy4KICAgICAgKi8KICAgICBwdWJsaWMgU1FMaXRlU3RhdGVtZW50IGNvbXBpbGVTdGF0ZW1lbnQoU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgc3FsKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHVubG9jaygpOwotICAgICAgICB9CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CisgICAgICAgIHJldHVybiBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsIHNxbCwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjI2LDkgKzE0MDksNyBAQAogICAgICAgICAgICAgYm9vbGVhbiBkaXN0aW5jdCwgU3RyaW5nIHRhYmxlLCBTdHJpbmdbXSBjb2x1bW5zLAogICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIGdyb3VwQnksCiAgICAgICAgICAgICBTdHJpbmcgaGF2aW5nLCBTdHJpbmcgb3JkZXJCeSwgU3RyaW5nIGxpbWl0KSB7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgU3RyaW5nIHNxbCA9IFNRTGl0ZVF1ZXJ5QnVpbGRlci5idWlsZFF1ZXJ5U3RyaW5nKAogICAgICAgICAgICAgICAgIGRpc3RpbmN0LCB0YWJsZSwgY29sdW1ucywgc2VsZWN0aW9uLCBncm91cEJ5LCBoYXZpbmcsIG9yZGVyQnksIGxpbWl0KTsKIApAQCAtMTMzOSw5ICsxNTIwLDcgQEAKICAgICBwdWJsaWMgQ3Vyc29yIHJhd1F1ZXJ5V2l0aEZhY3RvcnkoCiAgICAgICAgICAgICBDdXJzb3JGYWN0b3J5IGN1cnNvckZhY3RvcnksIFN0cmluZyBzcWwsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsCiAgICAgICAgICAgICBTdHJpbmcgZWRpdFRhYmxlKSB7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKICAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vblJlYWRGcm9tRGlzaygpOwogICAgICAgICBsb25nIHRpbWVTdGFydCA9IDA7CiAKQEAgLTEzNDksNyArMTUyOCw4IEBACiAgICAgICAgICAgICB0aW1lU3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgfQogCi0gICAgICAgIFNRTGl0ZUN1cnNvckRyaXZlciBkcml2ZXIgPSBuZXcgU1FMaXRlRGlyZWN0Q3Vyc29yRHJpdmVyKHRoaXMsIHNxbCwgZWRpdFRhYmxlKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBnZXREYkNvbm5lY3Rpb24oc3FsKTsKKyAgICAgICAgU1FMaXRlQ3Vyc29yRHJpdmVyIGRyaXZlciA9IG5ldyBTUUxpdGVEaXJlY3RDdXJzb3JEcml2ZXIoZGIsIHNxbCwgZWRpdFRhYmxlKTsKIAogICAgICAgICBDdXJzb3IgY3Vyc29yID0gbnVsbDsKICAgICAgICAgdHJ5IHsKQEAgLTEzNzUsNiArMTU1NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPG51bGw+IikgICsgIiwgY291bnQgaXMgIiArIGNvdW50KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZWxlYXNlRGJDb25uZWN0aW9uKGRiKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gY3Vyc29yOwogICAgIH0KQEAgLTE1MDEsODQgKzE2ODIsNDEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBpbnNlcnRXaXRoT25Db25mbGljdChTdHJpbmcgdGFibGUsIFN0cmluZyBudWxsQ29sdW1uSGFjaywKICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgaW5pdGlhbFZhbHVlcywgaW50IGNvbmZsaWN0QWxnb3JpdGhtKSB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWVhc3VyZW1lbnRzIHNob3cgbW9zdCBzcWwgbGVuZ3RocyA8PSAxNTIKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzcWwgPSBuZXcgU3RyaW5nQnVpbGRlcigxNTIpOworICAgICAgICBTdHJpbmdCdWlsZGVyIHNxbCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIHNxbC5hcHBlbmQoIklOU0VSVCIpOwogICAgICAgICBzcWwuYXBwZW5kKENPTkZMSUNUX1ZBTFVFU1tjb25mbGljdEFsZ29yaXRobV0pOwogICAgICAgICBzcWwuYXBwZW5kKCIgSU5UTyAiKTsKICAgICAgICAgc3FsLmFwcGVuZCh0YWJsZSk7Ci0gICAgICAgIC8vIE1lYXN1cmVtZW50cyBzaG93IG1vc3QgdmFsdWVzIGxlbmd0aHMgPCA0MAotICAgICAgICBTdHJpbmdCdWlsZGVyIHZhbHVlcyA9IG5ldyBTdHJpbmdCdWlsZGVyKDQwKTsKKyAgICAgICAgc3FsLmFwcGVuZCgnKCcpOwogCi0gICAgICAgIFNldDxNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+PiBlbnRyeVNldCA9IG51bGw7Ci0gICAgICAgIGlmIChpbml0aWFsVmFsdWVzICE9IG51bGwgJiYgaW5pdGlhbFZhbHVlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBlbnRyeVNldCA9IGluaXRpYWxWYWx1ZXMudmFsdWVTZXQoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJpZXNJdGVyID0gZW50cnlTZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHNxbC5hcHBlbmQoJygnKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBuZWVkU2VwYXJhdG9yID0gZmFsc2U7Ci0gICAgICAgICAgICB3aGlsZSAoZW50cmllc0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5lZWRTZXBhcmF0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmVlZFNlcGFyYXRvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA9IGVudHJpZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKCc/Jyk7CisgICAgICAgIE9iamVjdFtdIGJpbmRBcmdzID0gbnVsbDsKKyAgICAgICAgaW50IHNpemUgPSAoaW5pdGlhbFZhbHVlcyAhPSBudWxsICYmIGluaXRpYWxWYWx1ZXMuc2l6ZSgpID4gMCkgPyBpbml0aWFsVmFsdWVzLnNpemUoKSA6IDA7CisgICAgICAgIGlmIChzaXplID4gMCkgeworICAgICAgICAgICAgYmluZEFyZ3MgPSBuZXcgT2JqZWN0W3NpemVdOworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgZm9yIChTdHJpbmcgY29sTmFtZSA6IGluaXRpYWxWYWx1ZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKChpID4gMCkgPyAiLCIgOiAiIik7CisgICAgICAgICAgICAgICAgc3FsLmFwcGVuZChjb2xOYW1lKTsKKyAgICAgICAgICAgICAgICBiaW5kQXJnc1tpKytdID0gaW5pdGlhbFZhbHVlcy5nZXQoY29sTmFtZSk7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIHNxbC5hcHBlbmQoJyknKTsKKyAgICAgICAgICAgIHNxbC5hcHBlbmQoIiBWQUxVRVMgKCIpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoKGkgPiAwKSA/ICIsPyIgOiAiPyIpOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3FsLmFwcGVuZCgiKCIgKyBudWxsQ29sdW1uSGFjayArICIpICIpOwotICAgICAgICAgICAgdmFsdWVzLmFwcGVuZCgiTlVMTCIpOworICAgICAgICAgICAgc3FsLmFwcGVuZChudWxsQ29sdW1uSGFjayArICIpIFZBTFVFUyAoTlVMTCIpOwogICAgICAgICB9CisgICAgICAgIHNxbC5hcHBlbmQoJyknKTsKIAotICAgICAgICBzcWwuYXBwZW5kKCIgVkFMVUVTKCIpOwotICAgICAgICBzcWwuYXBwZW5kKHZhbHVlcyk7Ci0gICAgICAgIHNxbC5hcHBlbmQoIik7Iik7Ci0KLSAgICAgICAgbG9jaygpOwotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgc3FsLnRvU3RyaW5nKCksIGJpbmRBcmdzKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbXBpbGVTdGF0ZW1lbnQoc3FsLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAvLyBCaW5kIHRoZSB2YWx1ZXMKLSAgICAgICAgICAgIGlmIChlbnRyeVNldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNpemUgPSBlbnRyeVNldC5zaXplKCk7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gZW50cmllc0l0ZXIgPSBlbnRyeVNldC5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgPSBlbnRyaWVzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuYmluZE9iamVjdFRvUHJvZ3JhbShzdGF0ZW1lbnQsIGkgKyAxLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFJ1biB0aGUgcHJvZ3JhbSBhbmQgdGhlbiBjbGVhbnVwCi0gICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZSgpOwotCi0gICAgICAgICAgICBsb25nIGluc2VydGVkUm93SWQgPSBsYXN0SW5zZXJ0Um93KCk7Ci0gICAgICAgICAgICBpZiAoaW5zZXJ0ZWRSb3dJZCA9PSAtMSkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIGluc2VydGluZyAiICsgaW5pdGlhbFZhbHVlcyArICIgdXNpbmcgIiArIHNxbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChDb25maWcuTE9HRCAmJiBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJJbnNlcnRpbmcgcm93ICIgKyBpbnNlcnRlZFJvd0lkICsgIiBmcm9tICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGluaXRpYWxWYWx1ZXMgKyAiIHVzaW5nICIgKyBzcWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpbnNlcnRlZFJvd0lkOworICAgICAgICAgICAgcmV0dXJuIHN0YXRlbWVudC5leGVjdXRlSW5zZXJ0KCk7CiAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBvbkNvcnJ1cHRpb24oKTsKICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE1OTMsMzIgKzE3MzEsMTUgQEAKICAgICAgKiAgICAgICAgIHdoZXJlQ2xhdXNlLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZGVsZXRlKFN0cmluZyB0YWJsZSwgU3RyaW5nIHdoZXJlQ2xhdXNlLCBTdHJpbmdbXSB3aGVyZUFyZ3MpIHsKLSAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vbldyaXRlVG9EaXNrKCk7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCA9ICBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsICJERUxFVEUgRlJPTSAiICsgdGFibGUgKworICAgICAgICAgICAgICAgICghVGV4dFV0aWxzLmlzRW1wdHkod2hlcmVDbGF1c2UpID8gIiBXSEVSRSAiICsgd2hlcmVDbGF1c2UgOiAiIiksIHdoZXJlQXJncyk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb21waWxlU3RhdGVtZW50KCJERUxFVEUgRlJPTSAiICsgdGFibGUKLSAgICAgICAgICAgICAgICAgICAgKyAoIVRleHRVdGlscy5pc0VtcHR5KHdoZXJlQ2xhdXNlKQotICAgICAgICAgICAgICAgICAgICA/ICIgV0hFUkUgIiArIHdoZXJlQ2xhdXNlIDogIiIpKTsKLSAgICAgICAgICAgIGlmICh3aGVyZUFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBudW1BcmdzID0gd2hlcmVBcmdzLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmJpbmRPYmplY3RUb1Byb2dyYW0oc3RhdGVtZW50LCBpICsgMSwgd2hlcmVBcmdzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZSgpOwotICAgICAgICAgICAgcmV0dXJuIGxhc3RDaGFuZ2VDb3VudCgpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRlbWVudC5leGVjdXRlVXBkYXRlRGVsZXRlKCk7CiAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBvbkNvcnJ1cHRpb24oKTsKICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE2NDksOCArMTc3MCw4IEBACiAgICAgICovCiAgICAgcHVibGljIGludCB1cGRhdGVXaXRoT25Db25mbGljdChTdHJpbmcgdGFibGUsIENvbnRlbnRWYWx1ZXMgdmFsdWVzLAogICAgICAgICAgICAgU3RyaW5nIHdoZXJlQ2xhdXNlLCBTdHJpbmdbXSB3aGVyZUFyZ3MsIGludCBjb25mbGljdEFsZ29yaXRobSkgewotICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uV3JpdGVUb0Rpc2soKTsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlcy5zaXplKCkgPT0gMCkgeworICAgICAgICBpbnQgc2V0VmFsdWVzU2l6ZSA9IHZhbHVlcy5zaXplKCk7CisgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCB8fCBzZXRWYWx1ZXNTaXplID09IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVtcHR5IHZhbHVlcyIpOwogICAgICAgICB9CiAKQEAgLTE2NjAsOTggKzE3ODEsNzEgQEAKICAgICAgICAgc3FsLmFwcGVuZCh0YWJsZSk7CiAgICAgICAgIHNxbC5hcHBlbmQoIiBTRVQgIik7CiAKLSAgICAgICAgU2V0PE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJ5U2V0ID0gdmFsdWVzLnZhbHVlU2V0KCk7Ci0gICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJpZXNJdGVyID0gZW50cnlTZXQuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoZW50cmllc0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5ID0gZW50cmllc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgc3FsLmFwcGVuZChlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgIC8vIG1vdmUgYWxsIGJpbmQgYXJncyB0byBvbmUgYXJyYXkKKyAgICAgICAgaW50IGJpbmRBcmdzU2l6ZSA9ICh3aGVyZUFyZ3MgPT0gbnVsbCkgPyBzZXRWYWx1ZXNTaXplIDogKHNldFZhbHVlc1NpemUgKyB3aGVyZUFyZ3MubGVuZ3RoKTsKKyAgICAgICAgT2JqZWN0W10gYmluZEFyZ3MgPSBuZXcgT2JqZWN0W2JpbmRBcmdzU2l6ZV07CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yIChTdHJpbmcgY29sTmFtZSA6IHZhbHVlcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgc3FsLmFwcGVuZCgoaSA+IDApID8gIiwiIDogIiIpOworICAgICAgICAgICAgc3FsLmFwcGVuZChjb2xOYW1lKTsKKyAgICAgICAgICAgIGJpbmRBcmdzW2krK10gPSB2YWx1ZXMuZ2V0KGNvbE5hbWUpOwogICAgICAgICAgICAgc3FsLmFwcGVuZCgiPT8iKTsKLSAgICAgICAgICAgIGlmIChlbnRyaWVzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCIsICIpOworICAgICAgICB9CisgICAgICAgIGlmICh3aGVyZUFyZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpID0gc2V0VmFsdWVzU2l6ZTsgaSA8IGJpbmRBcmdzU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgYmluZEFyZ3NbaV0gPSB3aGVyZUFyZ3NbaSAtIHNldFZhbHVlc1NpemVdOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh3aGVyZUNsYXVzZSkpIHsKICAgICAgICAgICAgIHNxbC5hcHBlbmQoIiBXSEVSRSAiKTsKICAgICAgICAgICAgIHNxbC5hcHBlbmQod2hlcmVDbGF1c2UpOwogICAgICAgICB9CiAKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLCBzcWwudG9TdHJpbmcoKSwgYmluZEFyZ3MpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RhdGVtZW50ID0gY29tcGlsZVN0YXRlbWVudChzcWwudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIC8vIEJpbmQgdGhlIHZhbHVlcwotICAgICAgICAgICAgaW50IHNpemUgPSBlbnRyeVNldC5zaXplKCk7Ci0gICAgICAgICAgICBlbnRyaWVzSXRlciA9IGVudHJ5U2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBpbnQgYmluZEFyZyA9IDE7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgPSBlbnRyaWVzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5iaW5kT2JqZWN0VG9Qcm9ncmFtKHN0YXRlbWVudCwgYmluZEFyZywgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgYmluZEFyZysrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAod2hlcmVBcmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzaXplID0gd2hlcmVBcmdzLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuYmluZFN0cmluZyhiaW5kQXJnLCB3aGVyZUFyZ3NbaV0pOwotICAgICAgICAgICAgICAgICAgICBiaW5kQXJnKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSdW4gdGhlIHByb2dyYW0gYW5kIHRoZW4gY2xlYW51cAotICAgICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoKTsKLSAgICAgICAgICAgIGludCBudW1DaGFuZ2VkUm93cyA9IGxhc3RDaGFuZ2VDb3VudCgpOwotICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dEICYmIExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiVXBkYXRlZCAiICsgbnVtQ2hhbmdlZFJvd3MgKyAiIHVzaW5nICIgKyB2YWx1ZXMgKyAiIGFuZCAiICsgc3FsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudW1DaGFuZ2VkUm93czsKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZW1lbnQuZXhlY3V0ZVVwZGF0ZURlbGV0ZSgpOwogICAgICAgICB9IGNhdGNoIChTUUxpdGVEYXRhYmFzZUNvcnJ1cHRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgb25Db3JydXB0aW9uKCk7CiAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgdXBkYXRpbmcgIiArIHZhbHVlcyArICIgdXNpbmcgIiArIHNxbCk7Ci0gICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRXhlY3V0ZSBhIHNpbmdsZSBTUUwgc3RhdGVtZW50IHRoYXQgaXMgbm90IGEgcXVlcnkuIEZvciBleGFtcGxlLCBDUkVBVEUKLSAgICAgKiBUQUJMRSwgREVMRVRFLCBJTlNFUlQsIGV0Yy4gTXVsdGlwbGUgc3RhdGVtZW50cyBzZXBhcmF0ZWQgYnkgO3MgYXJlIG5vdAotICAgICAqIHN1cHBvcnRlZC4gaXQgdGFrZXMgYSB3cml0ZSBsb2NrCisgICAgICogRXhlY3V0ZSBhIHNpbmdsZSBTUUwgc3RhdGVtZW50IHRoYXQgaXMgTk9UIGEgU0VMRUNUCisgICAgICogb3IgYW55IG90aGVyIFNRTCBzdGF0ZW1lbnQgdGhhdCByZXR1cm5zIGRhdGEuCisgICAgICogPHA+CisgICAgICogSXQgaGFzIG5vIG1lYW5zIHRvIHJldHVybiBhbnkgZGF0YSAoc3VjaCBhcyB0aGUgbnVtYmVyIG9mIGFmZmVjdGVkIHJvd3MpLgorICAgICAqIEluc3RlYWQsIHlvdSdyZSBlbmNvdXJhZ2VkIHRvIHVzZSB7QGxpbmsgI2luc2VydChTdHJpbmcsIFN0cmluZywgQ29udGVudFZhbHVlcyl9LAorICAgICAqIHtAbGluayAjdXBkYXRlKFN0cmluZywgQ29udGVudFZhbHVlcywgU3RyaW5nLCBTdHJpbmdbXSl9LCBldCBhbCwgd2hlbiBwb3NzaWJsZS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogV2hlbiB1c2luZyB7QGxpbmsgI2VuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCl9LCBqb3VybmFsX21vZGUgaXMKKyAgICAgKiBhdXRvbWF0aWNhbGx5IG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4gU28sIGRvIG5vdCBzZXQgam91cm5hbF9tb2RlCisgICAgICogdXNpbmcgIlBSQUdNQSBqb3VybmFsX21vZGUnPHZhbHVlPiIgc3RhdGVtZW50IGlmIHlvdXIgYXBwIGlzIHVzaW5nCisgICAgICoge0BsaW5rICNlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpfQorICAgICAqIDwvcD4KICAgICAgKgorICAgICAqIEBwYXJhbSBzcWwgdGhlIFNRTCBzdGF0ZW1lbnQgdG8gYmUgZXhlY3V0ZWQuIE11bHRpcGxlIHN0YXRlbWVudHMgc2VwYXJhdGVkIGJ5IHNlbWljb2xvbnMgYXJlCisgICAgICogbm90IHN1cHBvcnRlZC4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbiBJZiB0aGUgU1FMIHN0cmluZyBpcyBpbnZhbGlkIGZvciBzb21lIHJlYXNvbgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGV4ZWNTUUwoU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOworICAgICAgICBpbnQgc3RtdFR5cGUgPSBEYXRhYmFzZVV0aWxzLmdldFNxbFN0YXRlbWVudFR5cGUoc3FsKTsKKyAgICAgICAgaWYgKHN0bXRUeXBlID09IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0FUVEFDSCkgeworICAgICAgICAgICAgZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIH0KICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9CiAgICAgICAgIGxvZ1RpbWVTdGF0KG1MYXN0U3FsU3RhdGVtZW50LCB0aW1lU3RhcnQsIEdFVF9MT0NLX0xPR19QUkVGSVgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2V4ZWNTUUwoc3FsKTsKLSAgICAgICAgfSBjYXRjaCAoU1FMaXRlRGF0YWJhc2VDb3JydXB0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIG9uQ29ycnVwdGlvbigpOwotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHVubG9jaygpOwotICAgICAgICB9CisgICAgICAgIGV4ZWN1dGVTcWwoc3FsLCBudWxsKTsKIAorICAgICAgICBpZiAoc3RtdFR5cGUgPT0gRGF0YWJhc2VVdGlscy5TVEFURU1FTlRfQVRUQUNIKSB7CisgICAgICAgICAgICBtSGFzQXR0YWNoZWREYnMgPSB0cnVlOworICAgICAgICB9CiAgICAgICAgIC8vIExvZyBjb21taXQgc3RhdGVtZW50cyBhbG9uZyB3aXRoIHRoZSBtb3N0IHJlY2VudGx5IGV4ZWN1dGVkCi0gICAgICAgIC8vIFNRTCBzdGF0ZW1lbnQgZm9yIGRpc2FtYmlndWF0aW9uLiAgTm90ZSB0aGF0IGluc3RhbmNlCi0gICAgICAgIC8vIGVxdWFsaXR5IHRvIENPTU1JVF9TUUwgaXMgc2FmZSBoZXJlLgotICAgICAgICBpZiAoc3FsID09IENPTU1JVF9TUUwpIHsKKyAgICAgICAgLy8gU1FMIHN0YXRlbWVudCBmb3IgZGlzYW1iaWd1YXRpb24uCisgICAgICAgIGlmIChzdG10VHlwZSA9PSBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9DT01NSVQpIHsKICAgICAgICAgICAgIGxvZ1RpbWVTdGF0KG1MYXN0U3FsU3RhdGVtZW50LCB0aW1lU3RhcnQsIENPTU1JVF9TUUwpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbG9nVGltZVN0YXQoc3FsLCB0aW1lU3RhcnQsIG51bGwpOwpAQCAtMTc1OSw2NSArMTg1MywxMDAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFeGVjdXRlIGEgc2luZ2xlIFNRTCBzdGF0ZW1lbnQgdGhhdCBpcyBub3QgYSBxdWVyeS4gRm9yIGV4YW1wbGUsIENSRUFURQotICAgICAqIFRBQkxFLCBERUxFVEUsIElOU0VSVCwgZXRjLiBNdWx0aXBsZSBzdGF0ZW1lbnRzIHNlcGFyYXRlZCBieSA7cyBhcmUgbm90Ci0gICAgICogc3VwcG9ydGVkLiBpdCB0YWtlcyBhIHdyaXRlIGxvY2ssCisgICAgICogRXhlY3V0ZSBhIHNpbmdsZSBTUUwgc3RhdGVtZW50IHRoYXQgaXMgTk9UIGEgU0VMRUNUL0lOU0VSVC9VUERBVEUvREVMRVRFLgorICAgICAqIDxwPgorICAgICAqIEZvciBJTlNFUlQgc3RhdGVtZW50cywgdXNlIGFueSBvZiB0aGUgZm9sbG93aW5nIGluc3RlYWQuCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayAjaW5zZXJ0KFN0cmluZywgU3RyaW5nLCBDb250ZW50VmFsdWVzKX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjaW5zZXJ0T3JUaHJvdyhTdHJpbmcsIFN0cmluZywgQ29udGVudFZhbHVlcyl9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI2luc2VydFdpdGhPbkNvbmZsaWN0KFN0cmluZywgU3RyaW5nLCBDb250ZW50VmFsdWVzLCBpbnQpfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgVVBEQVRFIHN0YXRlbWVudHMsIHVzZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBpbnN0ZWFkLgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT57QGxpbmsgI3VwZGF0ZShTdHJpbmcsIENvbnRlbnRWYWx1ZXMsIFN0cmluZywgU3RyaW5nW10pfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICN1cGRhdGVXaXRoT25Db25mbGljdChTdHJpbmcsIENvbnRlbnRWYWx1ZXMsIFN0cmluZywgU3RyaW5nW10sIGludCl9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPgorICAgICAqIEZvciBERUxFVEUgc3RhdGVtZW50cywgdXNlIGFueSBvZiB0aGUgZm9sbG93aW5nIGluc3RlYWQuCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayAjZGVsZXRlKFN0cmluZywgU3RyaW5nLCBTdHJpbmdbXSl9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGFyZSBnb29kIGNhbmRpZGF0ZXMgZm9yIHVzaW5nIHRoaXMgbWV0aG9kOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BTFRFUiBUQUJMRTwvbGk+CisgICAgICogICA8bGk+Q1JFQVRFIG9yIERST1AgdGFibGUgLyB0cmlnZ2VyIC8gdmlldyAvIGluZGV4IC8gdmlydHVhbCB0YWJsZTwvbGk+CisgICAgICogICA8bGk+UkVJTkRFWDwvbGk+CisgICAgICogICA8bGk+UkVMRUFTRTwvbGk+CisgICAgICogICA8bGk+U0FWRVBPSU5UPC9saT4KKyAgICAgKiAgIDxsaT5QUkFHTUEgdGhhdCByZXR1cm5zIG5vIGRhdGE8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdXNpbmcge0BsaW5rICNlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpfSwgam91cm5hbF9tb2RlIGlzCisgICAgICogYXV0b21hdGljYWxseSBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MuIFNvLCBkbyBub3Qgc2V0IGpvdXJuYWxfbW9kZQorICAgICAqIHVzaW5nICJQUkFHTUEgam91cm5hbF9tb2RlJzx2YWx1ZT4iIHN0YXRlbWVudCBpZiB5b3VyIGFwcCBpcyB1c2luZworICAgICAqIHtAbGluayAjZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKX0KKyAgICAgKiA8L3A+CiAgICAgICoKLSAgICAgKiBAcGFyYW0gc3FsCisgICAgICogQHBhcmFtIHNxbCB0aGUgU1FMIHN0YXRlbWVudCB0byBiZSBleGVjdXRlZC4gTXVsdGlwbGUgc3RhdGVtZW50cyBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucyBhcmUKKyAgICAgKiBub3Qgc3VwcG9ydGVkLgogICAgICAqIEBwYXJhbSBiaW5kQXJncyBvbmx5IGJ5dGVbXSwgU3RyaW5nLCBMb25nIGFuZCBEb3VibGUgYXJlIHN1cHBvcnRlZCBpbiBiaW5kQXJncy4KICAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbiBJZiB0aGUgU1FMIHN0cmluZyBpcyBpbnZhbGlkIGZvciBzb21lIHJlYXNvbgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGV4ZWNTUUwoU3RyaW5nIHNxbCwgT2JqZWN0W10gYmluZEFyZ3MpIHRocm93cyBTUUxFeGNlcHRpb24gewotICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uV3JpdGVUb0Rpc2soKTsKICAgICAgICAgaWYgKGJpbmRBcmdzID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVtcHR5IGJpbmRBcmdzIik7CiAgICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZVNxbChzcWwsIGJpbmRBcmdzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBleGVjdXRlU3FsKFN0cmluZyBzcWwsIE9iamVjdFtdIGJpbmRBcmdzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBpbnQgbjsKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgc3FsLCBiaW5kQXJncyk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb21waWxlU3RhdGVtZW50KHNxbCk7Ci0gICAgICAgICAgICBpZiAoYmluZEFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBudW1BcmdzID0gYmluZEFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuYmluZE9iamVjdFRvUHJvZ3JhbShzdGF0ZW1lbnQsIGkgKyAxLCBiaW5kQXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIG4gPSBzdGF0ZW1lbnQuZXhlY3V0ZVVwZGF0ZURlbGV0ZSgpOwogICAgICAgICB9IGNhdGNoIChTUUxpdGVEYXRhYmFzZUNvcnJ1cHRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgb25Db3JydXB0aW9uKCk7CiAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOwogICAgICAgICB9CiAgICAgICAgIGxvZ1RpbWVTdGF0KHNxbCwgdGltZVN0YXJ0KTsKKyAgICAgICAgcmV0dXJuIG47CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7Ci0gICAgICAgIGlmIChpc09wZW4oKSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiY2xvc2UoKSB3YXMgbmV2ZXIgZXhwbGljaXRseSBjYWxsZWQgb24gZGF0YWJhc2UgJyIgKwotICAgICAgICAgICAgICAgICAgICBtUGF0aCArICInICIsIG1TdGFja1RyYWNlKTsKLSAgICAgICAgICAgIGNsb3NlQ2xvc2FibGUoKTsKLSAgICAgICAgICAgIG9uQWxsUmVmZXJlbmNlc1JlbGVhc2VkKCk7CisgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChpc09wZW4oKSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImNsb3NlKCkgd2FzIG5ldmVyIGV4cGxpY2l0bHkgY2FsbGVkIG9uIGRhdGFiYXNlICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYXRoICsgIicgIiwgbVN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgIGNsb3NlQ2xvc2FibGUoKTsKKyAgICAgICAgICAgICAgICBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZCgpOworICAgICAgICAgICAgICAgIHJlbGVhc2VDdXN0b21GdW5jdGlvbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yLiBTZWUge0BsaW5rICNjcmVhdGV9IGFuZCB7QGxpbmsgI29wZW5EYXRhYmFzZX0uCisgICAgICogUHJpdmF0ZSBjb25zdHJ1Y3Rvci4KICAgICAgKgogICAgICAqIEBwYXJhbSBwYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIGRhdGFiYXNlCiAgICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGZhY3RvcnkgdG8gdXNlIHdoZW4gY3JlYXRpbmcgY3Vyc29ycywgbWF5IGJlIE5VTEwuCiAgICAgICogQHBhcmFtIGZsYWdzIDAgb3Ige0BsaW5rICNOT19MT0NBTElaRURfQ09MTEFUT1JTfS4gIElmIHRoZSBkYXRhYmFzZSBmaWxlIGFscmVhZHkKICAgICAgKiAgICAgICAgICAgICAgZXhpc3RzLCBtRmxhZ3Mgd2lsbCBiZSB1cGRhdGVkIGFwcHJvcHJpYXRlbHkuCisgICAgICogQHBhcmFtIGVycm9ySGFuZGxlciBUaGUge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSB0byBiZSB1c2VkIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UKKyAgICAgKiBjb3JydXB0aW9uLiBtYXkgYmUgTlVMTC4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbk51bSAwIGZvciBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlLiAxLi5OIGZvciBwb29sZWQgZGF0YWJhc2UKKyAgICAgKiBjb25uZWN0aW9uIGhhbmRsZXMuCiAgICAgICovCi0gICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZShTdHJpbmcgcGF0aCwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgZmxhZ3MpIHsKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlKFN0cmluZyBwYXRoLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCBmbGFncywKKyAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciwgc2hvcnQgY29ubmVjdGlvbk51bSkgewogICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXRoIHNob3VsZCBub3QgYmUgbnVsbCIpOwogICAgICAgICB9CkBAIC0xODI2LDI1ICsxOTU1LDExIEBACiAgICAgICAgIG1TbG93UXVlcnlUaHJlc2hvbGQgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEludChMT0dfU0xPV19RVUVSSUVTX1BST1BFUlRZLCAtMSk7CiAgICAgICAgIG1TdGFja1RyYWNlID0gbmV3IERhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uKCkuZmlsbEluU3RhY2tUcmFjZSgpOwogICAgICAgICBtRmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgICAgIGRib3BlbihtUGF0aCwgbUZsYWdzKTsKLSAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9DQUNIRSkgewotICAgICAgICAgICAgbVRpbWVPcGVuZWQgPSBnZXRUaW1lKCk7Ci0gICAgICAgIH0KICAgICAgICAgbVByb2dyYW1zID0gbmV3IFdlYWtIYXNoTWFwPFNRTGl0ZUNsb3NhYmxlLE9iamVjdD4oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldExvY2FsZShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gc2V0TG9jYWxlKCkgd2hlbiBjb25zdHJ1Y3RpbmcsIGNsb3NpbmcgdGhlIGRhdGFiYXNlIiwgZSk7Ci0gICAgICAgICAgICBkYmNsb3NlKCk7Ci0gICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7Ci0gICAgICAgICAgICAgICAgbVRpbWVDbG9zZWQgPSBnZXRUaW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGltZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIEhIOm1tOnNzLlNTUyAiKS5mb3JtYXQoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAvLyBTZXQgdGhlIERhdGFiYXNlRXJyb3JIYW5kbGVyIHRvIGJlIHVzZWQgd2hlbiBTUUxpdGUgcmVwb3J0cyBjb3JydXB0aW9uLgorICAgICAgICAvLyBJZiB0aGUgY2FsbGVyIHNldHMgZXJyb3JIYW5kbGVyID0gbnVsbCwgdGhlbiB1c2UgZGVmYXVsdCBlcnJvcmhhbmRsZXIuCisgICAgICAgIG1FcnJvckhhbmRsZXIgPSAoZXJyb3JIYW5kbGVyID09IG51bGwpID8gbmV3IERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpIDogZXJyb3JIYW5kbGVyOworICAgICAgICBtQ29ubmVjdGlvbk51bSA9IGNvbm5lY3Rpb25OdW07CiAgICAgfQogCiAgICAgLyoqCkBAIC0xOTAxLDcgKzIwMTYsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChkdXJhdGlvbk1pbGxpcyA+PSBzUXVlcnlMb2dUaW1lSW5NaWxsaXMpIHsKICAgICAgICAgICAgIHNhbXBsZVBlcmNlbnQgPSAxMDA7Ci0gICAgICAgIH0gZWxzZSB7OworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2FtcGxlUGVyY2VudCA9IChpbnQpICgxMDAgKiBkdXJhdGlvbk1pbGxpcyAvIHNRdWVyeUxvZ1RpbWVJbk1pbGxpcykgKyAxOwogICAgICAgICAgICAgaWYgKG1SYW5kb20ubmV4dEludCgxMDApID49IHNhbXBsZVBlcmNlbnQpIHJldHVybjsKICAgICAgICAgfQpAQCAtMTk3MCw2NiArMjA4NSw1NSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoKLSAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICoKLSAgICAgKiAgICAgICBUaGUgZm9sbG93aW5nIG1ldGhvZHMgZGVhbCB3aXRoIGNvbXBpbGVkLXNxbCBjYWNoZQotICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHZvaWQgdmVyaWZ5RGJJc09wZW4oKSB7CisgICAgICAgIGlmICghaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBnZXRQYXRoKCkgKyAiIChjb25uIyAiICsKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25OdW0gKyAiKSBhbHJlYWR5IGNsb3NlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyB2b2lkIHZlcmlmeUxvY2tPd25lcigpIHsKKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgaWYgKG1Mb2NraW5nRW5hYmxlZCAmJiAhaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJEb24ndCBoYXZlIGRhdGFiYXNlIGxvY2shIik7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKLSAgICAgKiBhZGRzIHRoZSBnaXZlbiBzcWwgYW5kIGl0cyBjb21waWxlZC1zdGF0ZW1lbnQtaWQtcmV0dXJuZWQtYnktc3FsaXRlIHRvIHRoZQorICAgICAqIEFkZHMgdGhlIGdpdmVuIFNRTCBhbmQgaXRzIGNvbXBpbGVkLXN0YXRlbWVudC1pZC1yZXR1cm5lZC1ieS1zcWxpdGUgdG8gdGhlCiAgICAgICogY2FjaGUgb2YgY29tcGlsZWRRdWVyaWVzIGF0dGFjaGVkIHRvICd0aGlzJy4KLSAgICAgKgotICAgICAqIGlmIHRoZXJlIGlzIGFscmVhZHkgYSB7QGxpbmsgU1FMaXRlQ29tcGlsZWRTcWx9IGluIGNvbXBpbGVkUXVlcmllcyBmb3IgdGhlIGdpdmVuIHNxbCwKKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEge0BsaW5rIFNRTGl0ZUNvbXBpbGVkU3FsfSBpbiBjb21waWxlZFF1ZXJpZXMgZm9yIHRoZSBnaXZlbiBTUUwsCiAgICAgICogdGhlIG5ldyB7QGxpbmsgU1FMaXRlQ29tcGlsZWRTcWx9IG9iamVjdCBpcyBOT1QgaW5zZXJ0ZWQgaW50byB0aGUgY2FjaGUgKGkuZS4sdGhlIGN1cnJlbnQKICAgICAgKiBtYXBwaW5nIGlzIE5PVCByZXBsYWNlZCB3aXRoIHRoZSBuZXcgbWFwcGluZykuCiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyB2b2lkIGFkZFRvQ29tcGlsZWRRdWVyaWVzKFN0cmluZyBzcWwsIFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBpbGVkU3RhdGVtZW50KSB7Ci0gICAgICAgIGlmIChtTWF4U3FsQ2FjaGVTaXplID09IDApIHsKLSAgICAgICAgICAgIC8vIGZvciB0aGlzIGRhdGFiYXNlLCB0aGVyZSBpcyBubyBjYWNoZSBvZiBjb21waWxlZCBzcWwuCi0gICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAifE5PVCBhZGRpbmdfc3FsX3RvX2NhY2hlfCIgKyBnZXRQYXRoKCkgKyAifCIgKyBzcWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTcWwgPSBudWxsOwogICAgICAgICBzeW5jaHJvbml6ZWQobUNvbXBpbGVkUXVlcmllcykgewogICAgICAgICAgICAgLy8gZG9uJ3QgaW5zZXJ0IHRoZSBuZXcgbWFwcGluZyBpZiBhIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMKLSAgICAgICAgICAgIGNvbXBpbGVkU3FsID0gbUNvbXBpbGVkUXVlcmllcy5nZXQoc3FsKTsKLSAgICAgICAgICAgIGlmIChjb21waWxlZFNxbCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobUNvbXBpbGVkUXVlcmllcy5jb250YWluc0tleShzcWwpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gYWRkIHRoaXMgPHNxbCwgY29tcGlsZWRTdGF0ZW1lbnQ+IHRvIHRoZSBjYWNoZQotICAgICAgICAgICAgaWYgKG1Db21waWxlZFF1ZXJpZXMuc2l6ZSgpID09IG1NYXhTcWxDYWNoZVNpemUpIHsKKworICAgICAgICAgICAgaWYgKCFtQ2FjaGVGdWxsV2FybmluZyAmJiBtQ29tcGlsZWRRdWVyaWVzLnNpemUoKSA9PSBtTWF4U3FsQ2FjaGVTaXplKSB7CiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBjYWNoZSBzaXplIG9mIHtAbGluayAjbU1heFNxbENhY2hlU2l6ZX0gaXMgbm90IGVub3VnaCBmb3IgdGhpcyBhcHAuCi0gICAgICAgICAgICAgICAgICogbG9nIGEgd2FybmluZyBNQVhfV0FSTklOR1NfT05fQ0FDSEVTSVpFX0NPTkRJVElPTiB0aW1lcwotICAgICAgICAgICAgICAgICAqIGNoYW5jZXMgYXJlIGl0IGlzIE5PVCB1c2luZyA/IGZvciBiaW5kYXJncyAtIHNvIGNhY2hpbmcgaXMgdXNlbGVzcy4KLSAgICAgICAgICAgICAgICAgKiBUT0RPOiBlaXRoZXIgbGV0IHRoZSBjYWxsZXJzIHNldCBtYXggY2NoZXNpemUgZm9yIHRoZWlyIGFwcCwgb3IgaW50ZWxsaWdlbnRseQotICAgICAgICAgICAgICAgICAqIGZpZ3VyZSBvdXQgd2hhdCBzaG91bGQgYmUgY2FjaGVkIGZvciBhIGdpdmVuIGFwcC4KKyAgICAgICAgICAgICAgICAgKiBsb2cgYSB3YXJuaW5nLgorICAgICAgICAgICAgICAgICAqIGNoYW5jZXMgYXJlIGl0IGlzIE5PVCB1c2luZyA/IGZvciBiaW5kYXJncyAtIG9yIGNhY2hlc2l6ZSBpcyB0b28gc21hbGwuCiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKCsrbUNhY2hlRnVsbFdhcm5pbmdzID09IE1BWF9XQVJOSU5HU19PTl9DQUNIRVNJWkVfQ09ORElUSU9OKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlJlYWNoZWQgTUFYIHNpemUgZm9yIGNvbXBpbGVkLXNxbCBzdGF0ZW1lbnQgY2FjaGUgZm9yIGRhdGFiYXNlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhdGgoKSArICI7IGkuZS4sIE5PIHNwYWNlIGZvciB0aGlzIHNxbCBzdGF0ZW1lbnQgaW4gY2FjaGU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbCArICIuIFBsZWFzZSBjaGFuZ2UgeW91ciBzcWwgc3RhdGVtZW50cyB0byB1c2UgJz8nIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmluZGFyZ3MsIGluc3RlYWQgb2YgdXNpbmcgYWN0dWFsIHZhbHVlcyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBkb24ndCBhZGQgdGhpcyBlbnRyeSB0byBjYWNoZQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBjYWNoZSBpcyBOT1QgZnVsbC4gYWRkIHRoaXMgdG8gY2FjaGUuCi0gICAgICAgICAgICAgICAgbUNvbXBpbGVkUXVlcmllcy5wdXQoc3FsLCBjb21waWxlZFN0YXRlbWVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9DQUNIRSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJ8YWRkaW5nX3NxbF90b19jYWNoZXwiICsgZ2V0UGF0aCgpICsgInwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcGlsZWRRdWVyaWVzLnNpemUoKSArICJ8IiArIHNxbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlJlYWNoZWQgTUFYIHNpemUgZm9yIGNvbXBpbGVkLXNxbCBzdGF0ZW1lbnQgY2FjaGUgZm9yIGRhdGFiYXNlICIgKworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGF0aCgpICsgIi4gVXNlIHNldE1heFNxbENhY2hlU2l6ZSgpIHRvIGluY3JlYXNlIGNhY2hlc2l6ZS4gIik7CisgICAgICAgICAgICAgICAgbUNhY2hlRnVsbFdhcm5pbmcgPSB0cnVlOworICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIC8qIGFkZCB0aGUgZ2l2ZW4gU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTdGF0ZW1lbnQgdG8gY2FjaGUuCisgICAgICAgICAgICAgKiBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoZSBjYWNoZSBzaXplIC0gYmVjYXVzZSB7QGxpbmsgI21Db21waWxlZFF1ZXJpZXN9CisgICAgICAgICAgICAgKiBzZWxmLWxpbWl0cyBpdHMgc2l6ZSB0byB7QGxpbmsgI21NYXhTcWxDYWNoZVNpemV9LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBtQ29tcGlsZWRRdWVyaWVzLnB1dChzcWwsIGNvbXBpbGVkU3RhdGVtZW50KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm47CiAgICAgfQogCi0KLSAgICBwcml2YXRlIHZvaWQgZGVhbGxvY0NhY2hlZFNxbFN0YXRlbWVudHMoKSB7CisgICAgLyoqIHBhY2thZ2UtbGV2ZWwgYWNjZXNzIGZvciB0ZXN0aW5nIHB1cnBvc2VzICovCisgICAgLyogcGFja2FnZSAqLyB2b2lkIGRlYWxsb2NDYWNoZWRTcWxTdGF0ZW1lbnRzKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Db21waWxlZFF1ZXJpZXMpIHsKICAgICAgICAgICAgIGZvciAoU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTcWwgOiBtQ29tcGlsZWRRdWVyaWVzLnZhbHVlcygpKSB7CiAgICAgICAgICAgICAgICAgY29tcGlsZWRTcWwucmVsZWFzZVNxbFN0YXRlbWVudCgpOwpAQCAtMjAzOSwxOTkgKzIxNDMsNDY0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogZnJvbSB0aGUgY29tcGlsZWRRdWVyaWVzIGNhY2hlLCByZXR1cm5zIHRoZSBjb21waWxlZC1zdGF0ZW1lbnQtaWQgZm9yIHRoZSBnaXZlbiBzcWwuCi0gICAgICogcmV0dXJucyBudWxsLCBpZiBub3QgZm91bmQgaW4gdGhlIGNhY2hlLgorICAgICAqIEZyb20gdGhlIGNvbXBpbGVkUXVlcmllcyBjYWNoZSwgcmV0dXJucyB0aGUgY29tcGlsZWQtc3RhdGVtZW50LWlkIGZvciB0aGUgZ2l2ZW4gU1FMLgorICAgICAqIFJldHVybnMgbnVsbCwgaWYgbm90IGZvdW5kIGluIHRoZSBjYWNoZS4KICAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIFNRTGl0ZUNvbXBpbGVkU3FsIGdldENvbXBpbGVkU3RhdGVtZW50Rm9yU3FsKFN0cmluZyBzcWwpIHsKLSAgICAgICAgU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTdGF0ZW1lbnQgPSBudWxsOwotICAgICAgICBib29sZWFuIGNhY2hlSGl0OwotICAgICAgICBzeW5jaHJvbml6ZWQobUNvbXBpbGVkUXVlcmllcykgewotICAgICAgICAgICAgaWYgKG1NYXhTcWxDYWNoZVNpemUgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGZvciB0aGlzIGRhdGFiYXNlLCB0aGVyZSBpcyBubyBjYWNoZSBvZiBjb21waWxlZCBzcWwuCi0gICAgICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9DQUNIRSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJ8Y2FjaGUgTk9UIGZvdW5kfCIgKyBnZXRQYXRoKCkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChtQ29tcGlsZWRRdWVyaWVzKSB7CisgICAgICAgICAgICBTUUxpdGVDb21waWxlZFNxbCBjb21waWxlZFN0YXRlbWVudCA9IG1Db21waWxlZFF1ZXJpZXMuZ2V0KHNxbCk7CisgICAgICAgICAgICBpZiAoY29tcGlsZWRTdGF0ZW1lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1OdW1DYWNoZU1pc3NlcysrOwogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FjaGVIaXQgPSAoY29tcGlsZWRTdGF0ZW1lbnQgPSBtQ29tcGlsZWRRdWVyaWVzLmdldChzcWwpKSAhPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjYWNoZUhpdCkgewogICAgICAgICAgICAgbU51bUNhY2hlSGl0cysrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU51bUNhY2hlTWlzc2VzKys7CisgICAgICAgICAgICByZXR1cm4gY29tcGlsZWRTdGF0ZW1lbnQ7CiAgICAgICAgIH0KLQotICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7Ci0gICAgICAgICAgICBMb2cudihUQUcsICJ8Y2FjaGVfc3RhdHN8IiArCi0gICAgICAgICAgICAgICAgICAgIGdldFBhdGgoKSArICJ8IiArIG1Db21waWxlZFF1ZXJpZXMuc2l6ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgInwiICsgbU51bUNhY2hlSGl0cyArICJ8IiArIG1OdW1DYWNoZU1pc3NlcyArCi0gICAgICAgICAgICAgICAgICAgICJ8IiArIGNhY2hlSGl0ICsgInwiICsgbVRpbWVPcGVuZWQgKyAifCIgKyBtVGltZUNsb3NlZCArICJ8IiArIHNxbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbXBpbGVkU3RhdGVtZW50OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3FsIGlzIGNhY2hlZCBpbiBjb21waWxlZC1zcWwgY2FjaGUuCi0gICAgICogQGhpZGUKKyAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHByZXBhcmVkLXN0YXRlbWVudCBjYWNoZSBmb3IgdGhpcyBkYXRhYmFzZS4KKyAgICAgKiAoc2l6ZSBvZiB0aGUgY2FjaGUgPSBudW1iZXIgb2YgY29tcGlsZWQtc3FsLXN0YXRlbWVudHMgc3RvcmVkIGluIHRoZSBjYWNoZSkuCisgICAgICo8cD4KKyAgICAgKiBNYXhpbXVtIGNhY2hlIHNpemUgY2FuIE9OTFkgYmUgaW5jcmVhc2VkIGZyb20gaXRzIGN1cnJlbnQgc2l6ZSAoZGVmYXVsdCA9IDEwKS4KKyAgICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBzbWFsbGVyIHNpemUgdGhhbiB0aGUgY3VycmVudCBtYXhpbXVtIHZhbHVlLAorICAgICAqIHRoZW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKjxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHRocmVhZC1zYWZlLgorICAgICAqCisgICAgICogQHBhcmFtIGNhY2hlU2l6ZSB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUuIGNhbiBiZSAoMCB0byB7QGxpbmsgI01BWF9TUUxfQ0FDSEVfU0laRX0pCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgaW5wdXQgY2FjaGVTaXplID4ge0BsaW5rICNNQVhfU1FMX0NBQ0hFX1NJWkV9IG9yCisgICAgICogdGhlIHZhbHVlIHNldCB3aXRoIHByZXZpb3VzIHNldE1heFNxbENhY2hlU2l6ZSgpIGNhbGwuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbkNvbXBpbGVkU3FsQ2FjaGUoU3RyaW5nIHNxbCkgeworICAgIHB1YmxpYyB2b2lkIHNldE1heFNxbENhY2hlU2l6ZShpbnQgY2FjaGVTaXplKSB7CiAgICAgICAgIHN5bmNocm9uaXplZChtQ29tcGlsZWRRdWVyaWVzKSB7CisgICAgICAgICAgICBpZiAoY2FjaGVTaXplID4gTUFYX1NRTF9DQUNIRV9TSVpFIHx8IGNhY2hlU2l6ZSA8IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJleHBlY3RlZCB2YWx1ZSBiZXR3ZWVuIDAgYW5kICIgKyBNQVhfU1FMX0NBQ0hFX1NJWkUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjYWNoZVNpemUgPCBtTWF4U3FsQ2FjaGVTaXplKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2Fubm90IHNldCBjYWNoZVNpemUgdG8gYSB2YWx1ZSBsZXNzIHRoYW4gdGhlIHZhbHVlICIgKworICAgICAgICAgICAgICAgICAgICAgICAgInNldCB3aXRoIHByZXZpb3VzIHNldE1heFNxbENhY2hlU2l6ZSgpIGNhbGwuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWF4U3FsQ2FjaGVTaXplID0gY2FjaGVTaXplOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBib29sZWFuIGlzSW5TdGF0ZW1lbnRDYWNoZShTdHJpbmcgc3FsKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUNvbXBpbGVkUXVlcmllcykgewogICAgICAgICAgICAgcmV0dXJuIG1Db21waWxlZFF1ZXJpZXMuY29udGFpbnNLZXkoc3FsKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIHB1cmdlcyB0aGUgZ2l2ZW4gc3FsIGZyb20gdGhlIGNvbXBpbGVkLXNxbCBjYWNoZS4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1cmdlRnJvbUNvbXBpbGVkU3FsQ2FjaGUoU3RyaW5nIHNxbCkgeworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCByZWxlYXNlQ29tcGlsZWRTcWxPYmooU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTcWwpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtQ29tcGlsZWRRdWVyaWVzKSB7CisgICAgICAgICAgICBpZiAobUNvbXBpbGVkUXVlcmllcy5jb250YWluc1ZhbHVlKGNvbXBpbGVkU3FsKSkgeworICAgICAgICAgICAgICAgIC8vIGl0IGlzIGluIGNhY2hlIC0gcmVzZXQgaXRzIGluVXNlIGZsYWcKKyAgICAgICAgICAgICAgICBjb21waWxlZFNxbC5yZWxlYXNlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGl0IGlzIE5PVCBpbiBjYWNoZS4gZmluYWxpemUgaXQuCisgICAgICAgICAgICAgICAgY29tcGlsZWRTcWwucmVsZWFzZVNxbFN0YXRlbWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0Q2FjaGVIaXROdW0oKSB7CiAgICAgICAgIHN5bmNocm9uaXplZChtQ29tcGlsZWRRdWVyaWVzKSB7Ci0gICAgICAgICAgICBtQ29tcGlsZWRRdWVyaWVzLnJlbW92ZShzcWwpOworICAgICAgICAgICAgcmV0dXJuIG1OdW1DYWNoZUhpdHM7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiByZW1vdmUgZXZlcnl0aGluZyBmcm9tIHRoZSBjb21waWxlZCBzcWwgY2FjaGUKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0Q29tcGlsZWRTcWxDYWNoZSgpIHsKKyAgICBwcml2YXRlIGludCBnZXRDYWNoZU1pc3NOdW0oKSB7CiAgICAgICAgIHN5bmNocm9uaXplZChtQ29tcGlsZWRRdWVyaWVzKSB7Ci0gICAgICAgICAgICBtQ29tcGlsZWRRdWVyaWVzLmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gbU51bUNhY2hlTWlzc2VzOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0Q2FjaGVzaXplKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQobUNvbXBpbGVkUXVlcmllcykgeworICAgICAgICAgICAgcmV0dXJuIG1Db21waWxlZFF1ZXJpZXMuc2l6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyB2b2lkIGZpbmFsaXplU3RhdGVtZW50TGF0ZXIoaW50IGlkKSB7CisgICAgICAgIGlmICghaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIC8vIGRhdGFiYXNlIGFscmVhZHkgY2xvc2VkLiB0aGlzIHN0YXRlbWVudCB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIGZpbmFsaXplZC4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQobUNsb3NlZFN0YXRlbWVudElkcykgeworICAgICAgICAgICAgaWYgKG1DbG9zZWRTdGF0ZW1lbnRJZHMuY29udGFpbnMoaWQpKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBzdGF0ZW1lbnQgaWQgaXMgYWxyZWFkeSBxdWV1ZWQgdXAgZm9yIGZpbmFsaXphdGlvbi4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2xvc2VkU3RhdGVtZW50SWRzLmFkZChpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpIHsKKyAgICAgICAgaWYgKCFpc09wZW4oKSkgeworICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBkYXRhYmFzZSBpcyBhbHJlYWR5IGNsb3NlZCwgbm8gbmVlZCB0byBmaW5hbGl6ZSBhbnl0aGluZy4KKyAgICAgICAgICAgIG1DbG9zZWRTdGF0ZW1lbnRJZHMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB2ZXJpZnlMb2NrT3duZXIoKTsKKyAgICAgICAgLyogdG8gbWluaW1pemUgc3luY2hyb25pemF0aW9uIG9uIG1DbG9zZWRTdGF0ZW1lbnRJZHMsIG1ha2UgYSBjb3B5IG9mIHRoZSBsaXN0ICovCisgICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPihtQ2xvc2VkU3RhdGVtZW50SWRzLnNpemUoKSk7CisgICAgICAgIHN5bmNocm9uaXplZChtQ2xvc2VkU3RhdGVtZW50SWRzKSB7CisgICAgICAgICAgICBsaXN0LmFkZEFsbChtQ2xvc2VkU3RhdGVtZW50SWRzKTsKKyAgICAgICAgICAgIG1DbG9zZWRTdGF0ZW1lbnRJZHMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBmaW5hbGl6ZSBhbGwgdGhlIHN0YXRlbWVudHMgZnJvbSB0aGUgY29waWVkIGxpc3QKKyAgICAgICAgaW50IHNpemUgPSBsaXN0LnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIG5hdGl2ZV9maW5hbGl6ZShsaXN0LmdldChpKSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiByZXR1cm4gdGhlIGN1cnJlbnQgbWF4Q2FjaGVTcWxDYWNoZVNpemUKLSAgICAgKiBAaGlkZQorICAgICAqIGZvciB0ZXN0aW5nIG9ubHkKICAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRNYXhTcWxDYWNoZVNpemUoKSB7Ci0gICAgICAgIHJldHVybiBtTWF4U3FsQ2FjaGVTaXplOworICAgIC8qIHBhY2thZ2UgKi8gQXJyYXlMaXN0PEludGVnZXI+IGdldFF1ZXVlZFVwU3RtdExpc3QoKSB7CisgICAgICAgIHJldHVybiBtQ2xvc2VkU3RhdGVtZW50SWRzOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIHNldCB0aGUgbWF4IHNpemUgb2YgdGhlIGNvbXBpbGVkIHNxbCBjYWNoZSBmb3IgdGhpcyBkYXRhYmFzZSBhZnRlciBwdXJnaW5nIHRoZSBjYWNoZS4KLSAgICAgKiAoc2l6ZSBvZiB0aGUgY2FjaGUgPSBudW1iZXIgb2YgY29tcGlsZWQtc3FsLXN0YXRlbWVudHMgc3RvcmVkIGluIHRoZSBjYWNoZSkuCisgICAgICogVGhpcyBtZXRob2QgZW5hYmxlcyBwYXJhbGxlbCBleGVjdXRpb24gb2YgcXVlcmllcyBmcm9tIG11bHRpcGxlIHRocmVhZHMgb24gdGhlIHNhbWUgZGF0YWJhc2UuCisgICAgICogSXQgZG9lcyB0aGlzIGJ5IG9wZW5pbmcgbXVsdGlwbGUgaGFuZGxlcyB0byB0aGUgZGF0YWJhc2UgYW5kIHVzaW5nIGEgZGlmZmVyZW50CisgICAgICogZGF0YWJhc2UgaGFuZGxlIGZvciBlYWNoIHF1ZXJ5LgorICAgICAqIDxwPgorICAgICAqIElmIGEgdHJhbnNhY3Rpb24gaXMgaW4gcHJvZ3Jlc3Mgb24gb25lIGNvbm5lY3Rpb24gaGFuZGxlIGFuZCBzYXksIGEgdGFibGUgaXMgdXBkYXRlZCBpbiB0aGUKKyAgICAgKiB0cmFuc2FjdGlvbiwgdGhlbiBxdWVyeSBvbiB0aGUgc2FtZSB0YWJsZSBvbiBhbm90aGVyIGNvbm5lY3Rpb24gaGFuZGxlIHdpbGwgYmxvY2sgZm9yIHRoZQorICAgICAqIHRyYW5zYWN0aW9uIHRvIGNvbXBsZXRlLiBCdXQgdGhpcyBtZXRob2QgZW5hYmxlcyBzdWNoIHF1ZXJpZXMgdG8gZXhlY3V0ZSBieSBoYXZpbmcgdGhlbQorICAgICAqIHJldHVybiBvbGQgdmVyc2lvbiBvZiB0aGUgZGF0YSBmcm9tIHRoZSB0YWJsZS4gTW9zdCBvZnRlbiBpdCBpcyB0aGUgZGF0YSB0aGF0IGV4aXN0ZWQgaW4gdGhlCisgICAgICogdGFibGUgcHJpb3IgdG8gdGhlIGFib3ZlIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gdGhhdCB0YWJsZS4KKyAgICAgKiA8cD4KKyAgICAgKiBNYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXMgaGFuZGxlcyB1c2VkIHRvIGV4ZWN1dGUgcXVlcmllcyBpbiBwYXJhbGxlbCBpcworICAgICAqIGRlcGVuZGVudCB1cG9uIHRoZSBkZXZpY2UgbWVtb3J5IGFuZCBwb3NzaWJseSBvdGhlciBwcm9wZXJ0aWVzLgorICAgICAqIDxwPgorICAgICAqIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIGV4ZWN1dGlvbiBvZiBxdWVyaWVzIGluIHBhcmFsbGVsIGlzIGVuYWJsZWQgYXMgbG9uZyBhcyB0aGlzCisgICAgICogZGF0YWJhc2UgaGFuZGxlIGlzIG9wZW4uIFRvIGRpc2FibGUgZXhlY3V0aW9uIG9mIHF1ZXJpZXMgaW4gcGFyYWxsZWwsIGRhdGFiYXNlIHNob3VsZAorICAgICAqIGJlIGNsb3NlZCBhbmQgcmVvcGVuZWQuCisgICAgICogPHA+CisgICAgICogSWYgYSBxdWVyeSBpcyBwYXJ0IG9mIGEgdHJhbnNhY3Rpb24sIHRoZW4gaXQgaXMgZXhlY3V0ZWQgb24gdGhlIHNhbWUgZGF0YWJhc2UgaGFuZGxlIHRoZQorICAgICAqIHRyYW5zYWN0aW9uIHdhcyBiZWd1bi4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgZGF0YWJhc2UgaGFzIGFueSBhdHRhY2hlZCBkYXRhYmFzZXMsIHRoZW4gZXhlY3V0aW9uIG9mIHF1ZXJpZXMgaW4gcGFyYWxlbCBpcyBOT1QKKyAgICAgKiBwb3NzaWJsZS4gSW4gc3VjaCBjYXNlcywgYSBtZXNzYWdlIGlzIHByaW50ZWQgdG8gbG9nY2F0IGFuZCBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSBmb3IgOm1lbW9yeTogZGF0YWJhc2VzLiBJbiBzdWNoIGNhc2VzLAorICAgICAqIGEgbWVzc2FnZSBpcyBwcmludGVkIHRvIGxvZ2NhdCBhbmQgZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICogPHA+CisgICAgICogQSB0eXBpY2FsIHdheSB0byB1c2UgdGhpcyBtZXRob2QgaXMgdGhlIGZvbGxvd2luZzoKKyAgICAgKiA8cHJlPgorICAgICAqICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5EYXRhYmFzZSgiZGJfZmlsZW5hbWUiLCBjdXJzb3JGYWN0b3J5LAorICAgICAqICAgICAgICAgICAgIENSRUFURV9JRl9ORUNFU1NBUlksIG15RGF0YWJhc2VFcnJvckhhbmRsZXIpOworICAgICAqICAgICBkYi5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAqIDwvcHJlPgorICAgICAqIDxwPgorICAgICAqIFdyaXRlcnMgc2hvdWxkIHVzZSB7QGxpbmsgI2JlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKX0gb3IKKyAgICAgKiB7QGxpbmsgI2JlZ2luVHJhbnNhY3Rpb25XaXRoTGlzdGVuZXJOb25FeGNsdXNpdmUoU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lcil9CisgICAgICogdG8gc3RhcnQgYSB0cnNuc2FjdGlvbi4KKyAgICAgKiBOb24tZXhjbHVzaXZlIG1vZGUgYWxsb3dzIGRhdGFiYXNlIGZpbGUgdG8gYmUgaW4gcmVhZGFibGUgYnkgdGhyZWFkcyBleGVjdXRpbmcgcXVlcmllcy4KKyAgICAgKiA8L3A+CiAgICAgICoKLSAgICAgKiBtYXggY2FjaGUgc2l6ZSBjYW4gT05MWSBiZSBpbmNyZWFzZWQgZnJvbSBpdHMgY3VycmVudCBzaXplIChkZWZhdWx0ID0gMCkuCi0gICAgICogaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggc21hbGxlciBzaXplIHRoYW4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgbU1heFNxbENhY2hlU2l6ZSwKLSAgICAgKiB0aGVuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpcyB0aHJvd24KLSAgICAgKgotICAgICAqIHN5bmNocm9uaXplZCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdCB0aHJlYWRzIHRvIGNoYW5nZSBjYWNoZSBzaXplIGF0IHRoZSBzYW1lIHRpbWUuCi0gICAgICogQHBhcmFtIGNhY2hlU2l6ZSB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUuIGNhbiBiZSAoMCB0byBNQVhfU1FMX0NBQ0hFX1NJWkUpCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgaW5wdXQgY2FjaGVTaXplID4gTUFYX1NRTF9DQUNIRV9TSVpFIG9yIDwgMCBvcgotICAgICAqIDwgdGhlIHZhbHVlIHNldCB3aXRoIHByZXZpb3VzIHNldE1heFNxbENhY2hlU2l6ZSgpIGNhbGwuCi0gICAgICoKLSAgICAgKiBAaGlkZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB3cml0ZS1haGVhZC1sb2dnaW5nIGlzIHNldC4gZmFsc2Ugb3RoZXJ3aXNlCiAgICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldE1heFNxbENhY2hlU2l6ZShpbnQgY2FjaGVTaXplKSB7Ci0gICAgICAgIGlmIChjYWNoZVNpemUgPiBNQVhfU1FMX0NBQ0hFX1NJWkUgfHwgY2FjaGVTaXplIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZXhwZWN0ZWQgdmFsdWUgYmV0d2VlbiAwIGFuZCAiICsgTUFYX1NRTF9DQUNIRV9TSVpFKTsKLSAgICAgICAgfSBlbHNlIGlmIChjYWNoZVNpemUgPCBtTWF4U3FsQ2FjaGVTaXplKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IGNhY2hlU2l6ZSB0byBhIHZhbHVlIGxlc3MgdGhhbiB0aGUgdmFsdWUgIiArCi0gICAgICAgICAgICAgICAgICAgICJzZXQgd2l0aCBwcmV2aW91cyBzZXRNYXhTcWxDYWNoZVNpemUoKSBjYWxsLiIpOworICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCkgeworICAgICAgICAvLyBhY3F1aXJlIGxvY2sgLSBubyB0aGF0IG5vIG90aGVyIHRocmVhZCBpcyBlbmFibGluZyBXQUwgYXQgdGhlIHNhbWUgdGltZQorICAgICAgICBsb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25Qb29sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGVuYWJsZWQKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUGF0aC5lcXVhbHNJZ25vcmVDYXNlKE1FTU9SWV9EQl9QQVRIKSkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgImNhbid0IGVuYWJsZSBXQUwgZm9yIG1lbW9yeSBkYXRhYmFzZXMuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhpcyBkYXRhYmFzZSBoYXMgTk8gYXR0YWNoZWQgZGF0YWJhc2VzIGJlY2F1c2Ugc3FsaXRlJ3Mgd3JpdGUtYWhlYWQtbG9nZ2luZworICAgICAgICAgICAgLy8gZG9lc24ndCB3b3JrIGZvciBkYXRhYmFzZXMgd2l0aCBhdHRhY2hlZCBkYXRhYmFzZXMKKyAgICAgICAgICAgIGlmIChtSGFzQXR0YWNoZWREYnMpIHsKKyAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBkYXRhYmFzZTogIiArIG1QYXRoICsgIiBoYXMgYXR0YWNoZWQgZGF0YWJhc2VzLiBjYW4ndCAgZW5hYmxlIFdBTC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbm5lY3Rpb25Qb29sID0gbmV3IERhdGFiYXNlQ29ubmVjdGlvblBvb2wodGhpcyk7CisgICAgICAgICAgICBzZXRKb3VybmFsTW9kZShtUGF0aCwgIldBTCIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKICAgICAgICAgfQotICAgICAgICBtTWF4U3FsQ2FjaGVTaXplID0gY2FjaGVTaXplOwogICAgIH0KIAotICAgIHN0YXRpYyBjbGFzcyBBY3RpdmVEYXRhYmFzZXMgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBY3RpdmVEYXRhYmFzZXMgYWN0aXZlRGF0YWJhc2VzID0gbmV3IEFjdGl2ZURhdGFiYXNlcygpOwotICAgICAgICBwcml2YXRlIEhhc2hTZXQ8V2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4+IG1BY3RpdmVEYXRhYmFzZXMgPQotICAgICAgICAgICAgbmV3IEhhc2hTZXQ8V2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4+KCk7Ci0gICAgICAgIHByaXZhdGUgQWN0aXZlRGF0YWJhc2VzKCkge30gLy8gZGlzYWJsZSBpbnN0YW50aWF0aW9uIG9mIHRoaXMgY2xhc3MKLSAgICAgICAgc3RhdGljIEFjdGl2ZURhdGFiYXNlcyBnZXRJbnN0YW5jZSgpIHtyZXR1cm4gYWN0aXZlRGF0YWJhc2VzO30KKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBkaXNhYmxlcyB0aGUgZmVhdHVyZXMgZW5hYmxlZCBieSB7QGxpbmsgI2VuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCl9LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCkgeworICAgICAgICAvLyBncmFiIGRhdGFiYXNlIGxvY2sgc28gdGhhdCB3cml0ZUFoZWFkTG9nZ2luZyBpcyBub3QgZGlzYWJsZWQgZnJvbSAyIGRpZmZlcmVudCB0aHJlYWRzCisgICAgICAgIC8vIGF0IHRoZSBzYW1lIHRpbWUKKyAgICAgICAgbG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uUG9vbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBhbHJlYWR5IGRpc2FibGVkCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29ubmVjdGlvblBvb2wuY2xvc2UoKTsKKyAgICAgICAgICAgIHNldEpvdXJuYWxNb2RlKG1QYXRoLCAiVFJVTkNBVEUiKTsKKyAgICAgICAgICAgIG1Db25uZWN0aW9uUG9vbCA9IG51bGw7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlRGF0YWJhc2UgZ2V0RGF0YWJhc2VIYW5kbGUoU3RyaW5nIHNxbCkgeworICAgICAgICBpZiAoaXNQb29sZWRDb25uZWN0aW9uKCkpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAgICAgICAgLy8gdXNlIGl0IGlmIGl0IGlzIG9wZW4gQU5EIGlmIEkgYW0gbm90IGN1cnJlbnRseSBwYXJ0IG9mIGEgdHJhbnNhY3Rpb24KKyAgICAgICAgICAgIGlmIChpc09wZW4oKSAmJiAhYW1JSW5UcmFuc2FjdGlvbigpKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogdXNlIGFub3RoZXIgY29ubmVjdGlvbiBmcm9tIHRoZSBwb29sCisgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBjb25uZWN0aW9uIGlzIGN1cnJlbnRseSBpbiB1c2UgYnkgc29tZSBvdGhlciB0aHJlYWQKKyAgICAgICAgICAgICAgICAvLyBBTkQgaWYgdGhlcmUgYXJlIGZyZWUgY29ubmVjdGlvbnMgaW4gdGhlIHBvb2wKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gdGhlIHBvb2xlZCBjb25uZWN0aW9uIGlzIG5vdCBvcGVuISBjb3VsZCBoYXZlIGJlZW4gY2xvc2VkIGVpdGhlciBkdWUKKyAgICAgICAgICAgICAgICAvLyB0byBjb3JydXB0aW9uIG9uIHRoaXMgb3Igc29tZSBvdGhlciBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZQorICAgICAgICAgICAgICAgIC8vIE9SLCBtYXliZSB0aGUgY29ubmVjdGlvbiBwb29sIGlzIGRpc2FibGVkIGFmdGVyIHRoaXMgY29ubmVjdGlvbiBoYXMgYmVlbgorICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZCB0byBtZS4gdHJ5IHRvIGdldCBzb21lIG90aGVyIHBvb2xlZCBvciBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UGFyZW50RGJDb25uT2JqKCkuZ2V0RGJDb25uZWN0aW9uKHNxbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB0aGlzIGlzIE5PVCBhIHBvb2xlZCBjb25uZWN0aW9uLiBjYW4gd2UgZ2V0IG9uZT8KKyAgICAgICAgICAgIHJldHVybiBnZXREYkNvbm5lY3Rpb24oc3FsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlRGF0YWJhc2UgY3JlYXRlUG9vbENvbm5lY3Rpb24oc2hvcnQgY29ubmVjdGlvbk51bSkgeworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG9wZW5EYXRhYmFzZShtUGF0aCwgbUZhY3RvcnksIG1GbGFncywgbUVycm9ySGFuZGxlciwgY29ubmVjdGlvbk51bSk7CisgICAgICAgIGRiLm1QYXJlbnRDb25uT2JqID0gdGhpczsKKyAgICAgICAgcmV0dXJuIGRiOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIFNRTGl0ZURhdGFiYXNlIGdldFBhcmVudERiQ29ubk9iaigpIHsKKyAgICAgICAgcmV0dXJuIG1QYXJlbnRDb25uT2JqOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1Bvb2xlZENvbm5lY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1Db25uZWN0aW9uTnVtID4gMDsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZURhdGFiYXNlIGdldERiQ29ubmVjdGlvbihTdHJpbmcgc3FsKSB7CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CisgICAgICAgIC8vIHRoaXMgbWV0aG9kIHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIHdpdGggbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZS4KKyAgICAgICAgLy8gdGhlIG9ubHkgdGltZSB3aGVuIGl0IGlzIGNhbGxlZCB3aXRoIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZSBpcworICAgICAgICAvLyBjb3JydXB0aW9uIG9jY3VycyB3aGlsZSB0cnlpbmcgdG8gb3BlbiBhIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZS4KKyAgICAgICAgLy8gaW4gdGhhdCBjYXNlLCBzaW1wbHkgcmV0dXJuICd0aGlzJyBoYW5kbGUKKyAgICAgICAgaWYgKGlzUG9vbGVkQ29ubmVjdGlvbigpKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVzZSB0aGUgY3VycmVudCBjb25uZWN0aW9uIGhhbmRsZSBpZgorICAgICAgICAvLyAxLiBpZiB0aGUgY2FsbGVyIGlzIHBhcnQgb2YgdGhlIG9uZ29pbmcgdHJhbnNhY3Rpb24sIGlmIGFueQorICAgICAgICAvLyAyLiBPUiwgaWYgdGhlcmUgaXMgTk8gY29ubmVjdGlvbiBoYW5kbGUgcG9vbCBzZXR1cAorICAgICAgICBpZiAoYW1JSW5UcmFuc2FjdGlvbigpIHx8IG1Db25uZWN0aW9uUG9vbCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGdldCBhIGNvbm5lY3Rpb24gaGFuZGxlIGZyb20gdGhlIHBvb2wKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgbUNvbm5lY3Rpb25Qb29sICE9IG51bGw7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCBtQ29ubmVjdGlvblBvb2wudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb25Qb29sLmdldChzcWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VEYkNvbm5lY3Rpb24oU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgLy8gaWdub3JlIHRoaXMgcmVsZWFzZSBjYWxsIGlmCisgICAgICAgIC8vIDEuIHRoZSBkYXRhYmFzZSBpcyBjbG9zZWQKKyAgICAgICAgLy8gMi4gT1IsIGlmIGRiIGlzIE5PVCBhIHBvb2xlZCBjb25uZWN0aW9uIGhhbmRsZQorICAgICAgICAvLyAzLiBPUiwgaWYgdGhlIGRhdGFiYXNlIGJlaW5nIHJlbGVhc2VkIGlzIHNhbWUgYXMgJ3RoaXMnICh0aGlzIGNvbmRpdGlvbiBtZWFucworICAgICAgICAvLyAgICAgdGhhdCB3ZSBzaG91bGQgYWx3YXlzIGJlIHJlbGVhc2luZyBhIHBvb2xlZCBjb25uZWN0aW9uIGhhbmRsZSBieSBjYWxsaW5nIHRoaXMgbWV0aG9kCisgICAgICAgIC8vICAgICBmcm9tIHRoZSAnbWFpbicgY29ubmVjdGlvbiBoYW5kbGUKKyAgICAgICAgaWYgKCFpc09wZW4oKSB8fCAhZGIuaXNQb29sZWRDb25uZWN0aW9uKCkgfHwgKGRiID09IHRoaXMpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgYXNzZXJ0IGlzUG9vbGVkQ29ubmVjdGlvbigpOworICAgICAgICAgICAgYXNzZXJ0IG1Db25uZWN0aW9uUG9vbCAhPSBudWxsOworICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVsZWFzZURiQ29ubmVjdGlvbiB0aHJlYWRpZCA9ICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKworICAgICAgICAgICAgICAgICAgICAiLCByZWxlYXNpbmcgIyAiICsgZGIubUNvbm5lY3Rpb25OdW0gKyAiLCAiICsgZ2V0UGF0aCgpKTsKKyAgICAgICAgfQorICAgICAgICBtQ29ubmVjdGlvblBvb2wucmVsZWFzZShkYik7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogdGhpcyBtZXRob2QgaXMgdXNlZCB0byBjb2xsZWN0IGRhdGEgYWJvdXQgQUxMIG9wZW4gZGF0YWJhc2VzIGluIHRoZSBjdXJyZW50IHByb2Nlc3MuCi0gICAgICogYnVncmVwb3J0IGlzIGEgdXNlciBvZiB0aGlzIGRhdGEuIAorICAgICAqIGJ1Z3JlcG9ydCBpcyBhIHVzZXIgb2YgdGhpcyBkYXRhLgogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIEFycmF5TGlzdDxEYlN0YXRzPiBnZXREYlN0YXRzKCkgewogICAgICAgICBBcnJheUxpc3Q8RGJTdGF0cz4gZGJTdGF0c0xpc3QgPSBuZXcgQXJyYXlMaXN0PERiU3RhdHM+KCk7Ci0gICAgICAgIGZvciAoV2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4gdyA6IEFjdGl2ZURhdGFiYXNlcy5nZXRJbnN0YW5jZSgpLm1BY3RpdmVEYXRhYmFzZXMpIHsKKyAgICAgICAgLy8gbWFrZSBhIGxvY2FsIGNvcHkgb2YgbUFjdGl2ZURhdGFiYXNlcyAtIHNvIHRoYXQgdGhpcyBtZXRob2QgaXMgbm90IGNvbXBldGluZworICAgICAgICAvLyBmb3Igc3luY2hyb25pemF0aW9uIGxvY2sgb24gbUFjdGl2ZURhdGFiYXNlcworICAgICAgICBBcnJheUxpc3Q8V2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4+IHRlbXBMaXN0OworICAgICAgICBzeW5jaHJvbml6ZWQobUFjdGl2ZURhdGFiYXNlcykgeworICAgICAgICAgICAgdGVtcExpc3QgPSAoQXJyYXlMaXN0PFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+PiltQWN0aXZlRGF0YWJhc2VzLmNsb25lKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPiB3IDogdGVtcExpc3QpIHsKICAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gdy5nZXQoKTsKICAgICAgICAgICAgIGlmIChkYiA9PSBudWxsIHx8ICFkYi5pc09wZW4oKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZ2V0IFNRTElURV9EQlNUQVRVU19MT09LQVNJREVfVVNFRCBmb3IgdGhlIGRiCi0gICAgICAgICAgICBpbnQgbG9va2FzaWRlVXNlZCA9IGRiLm5hdGl2ZV9nZXREYkxvb2thc2lkZSgpOwogCi0gICAgICAgICAgICAvLyBnZXQgdGhlIGxhc3Rub2RlIG9mIHRoZSBkYm5hbWUKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZGIuZ2V0UGF0aCgpOwotICAgICAgICAgICAgaW50IGluZHggPSBwYXRoLmxhc3RJbmRleE9mKCIvIik7Ci0gICAgICAgICAgICBTdHJpbmcgbGFzdG5vZGUgPSBwYXRoLnN1YnN0cmluZygoaW5keCAhPSAtMSkgPyArK2luZHggOiAwKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gZ2V0IFNRTElURV9EQlNUQVRVU19MT09LQVNJREVfVVNFRCBmb3IgdGhlIGRiCisgICAgICAgICAgICAgICAgaW50IGxvb2thc2lkZVVzZWQgPSBkYi5uYXRpdmVfZ2V0RGJMb29rYXNpZGUoKTsKIAotICAgICAgICAgICAgLy8gZ2V0IGxpc3Qgb2YgYXR0YWNoZWQgZGJzIGFuZCBmb3IgZWFjaCBkYiwgZ2V0IGl0cyBzaXplIGFuZCBwYWdlc2l6ZQotICAgICAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IGdldEF0dGFjaGVkRGJzKGRiKTsKLSAgICAgICAgICAgIGlmIChhdHRhY2hlZERicyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dGFjaGVkRGJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUGFpcjxTdHJpbmcsIFN0cmluZz4gcCA9IGF0dGFjaGVkRGJzLmdldChpKTsKLSAgICAgICAgICAgICAgICBsb25nIHBhZ2VDb3VudCA9IGdldFByYWdtYVZhbChkYiwgcC5maXJzdCArICIucGFnZV9jb3VudDsiKTsKKyAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGxhc3Rub2RlIG9mIHRoZSBkYm5hbWUKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGRiLmdldFBhdGgoKTsKKyAgICAgICAgICAgICAgICBpbnQgaW5keCA9IHBhdGgubGFzdEluZGV4T2YoIi8iKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGFzdG5vZGUgPSBwYXRoLnN1YnN0cmluZygoaW5keCAhPSAtMSkgPyArK2luZHggOiAwKTsKIAotICAgICAgICAgICAgICAgIC8vIGZpcnN0IGVudHJ5IGluIHRoZSBhdHRhY2hlZCBkYiBsaXN0IGlzIGFsd2F5cyB0aGUgbWFpbiBkYXRhYmFzZQotICAgICAgICAgICAgICAgIC8vIGRvbid0IHdvcnJ5IGFib3V0IHByZWZpeGluZyB0aGUgZGJuYW1lIHdpdGggIm1haW4iCi0gICAgICAgICAgICAgICAgU3RyaW5nIGRiTmFtZTsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRiTmFtZSA9IGxhc3Rub2RlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGxvb2thc2lkZSBpcyBvbmx5IHJlbGV2YW50IGZvciB0aGUgbWFpbiBkYgotICAgICAgICAgICAgICAgICAgICBsb29rYXNpZGVVc2VkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZGJOYW1lID0gIiAgKGF0dGFjaGVkKSAiICsgcC5maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGF0dGFjaGVkIGRiIGhhcyBhIHBhdGgsIGF0dGFjaCB0aGUgbGFzdG5vZGUgZnJvbSB0aGUgcGF0aCB0byBhYm92ZQotICAgICAgICAgICAgICAgICAgICBpZiAocC5zZWNvbmQudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IHAuc2Vjb25kLmxhc3RJbmRleE9mKCIvIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYk5hbWUgKz0gIiA6ICIgKyBwLnNlY29uZC5zdWJzdHJpbmcoKGlkeCAhPSAtMSkgPyArK2lkeCA6IDApOworICAgICAgICAgICAgICAgIC8vIGdldCBsaXN0IG9mIGF0dGFjaGVkIGRicyBhbmQgZm9yIGVhY2ggZGIsIGdldCBpdHMgc2l6ZSBhbmQgcGFnZXNpemUKKyAgICAgICAgICAgICAgICBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGF0dGFjaGVkRGJzID0gZGIuZ2V0QXR0YWNoZWREYnMoKTsKKyAgICAgICAgICAgICAgICBpZiAoYXR0YWNoZWREYnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRhY2hlZERicy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBQYWlyPFN0cmluZywgU3RyaW5nPiBwID0gYXR0YWNoZWREYnMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBsb25nIHBhZ2VDb3VudCA9IERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KGRiLCAiUFJBR01BICIgKyBwLmZpcnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLnBhZ2VfY291bnQ7IiwgbnVsbCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgZW50cnkgaW4gdGhlIGF0dGFjaGVkIGRiIGxpc3QgaXMgYWx3YXlzIHRoZSBtYWluIGRhdGFiYXNlCisgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHdvcnJ5IGFib3V0IHByZWZpeGluZyB0aGUgZGJuYW1lIHdpdGggIm1haW4iCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkYk5hbWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRiTmFtZSA9IGxhc3Rub2RlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9va2FzaWRlIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHRoZSBtYWluIGRiCisgICAgICAgICAgICAgICAgICAgICAgICBsb29rYXNpZGVVc2VkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRiTmFtZSA9ICIgIChhdHRhY2hlZCkgIiArIHAuZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgYXR0YWNoZWQgZGIgaGFzIGEgcGF0aCwgYXR0YWNoIHRoZSBsYXN0bm9kZSBmcm9tIHRoZSBwYXRoIHRvIGFib3ZlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocC5zZWNvbmQudHJpbSgpLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSBwLnNlY29uZC5sYXN0SW5kZXhPZigiLyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiTmFtZSArPSAiIDogIiArIHAuc2Vjb25kLnN1YnN0cmluZygoaWR4ICE9IC0xKSA/ICsraWR4IDogMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2VDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRiU3RhdHNMaXN0LmFkZChuZXcgRGJTdGF0cyhkYk5hbWUsIHBhZ2VDb3VudCwgZGIuZ2V0UGFnZVNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FzaWRlVXNlZCwgZGIuZ2V0Q2FjaGVIaXROdW0oKSwgZGIuZ2V0Q2FjaGVNaXNzTnVtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLmdldENhY2hlc2l6ZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBhZ2VDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGJTdGF0c0xpc3QuYWRkKG5ldyBEYlN0YXRzKGRiTmFtZSwgcGFnZUNvdW50LCBkYi5nZXRQYWdlU2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thc2lkZVVzZWQpKTsKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgcG9vbGVkIGNvbm5lY3Rpb25zLCByZXR1cm4gdGhlIGNhY2hlIHN0YXRzIGZvciB0aGVtIGFsc28uCisgICAgICAgICAgICAgICAgLy8gd2hpbGUgd2UgYXJlIHRyeWluZyB0byBxdWVyeSB0aGUgcG9vbGVkIGNvbm5lY3Rpb25zIGZvciBzdGF0cywgc29tZSBvdGhlciB0aHJlYWQKKyAgICAgICAgICAgICAgICAvLyBjb3VsZCBiZSBkaXNhYmxpbmcgY29ubmVjaXRvbiBwb29sLiBzbywgZ3JhYiBhIHJlZmVyZW5jZSB0byB0aGUgY29ubmVjdGlvbiBwb29sLgorICAgICAgICAgICAgICAgIERhdGFiYXNlQ29ubmVjdGlvblBvb2wgY29ublBvb2wgPSBkYi5tQ29ubmVjdGlvblBvb2w7CisgICAgICAgICAgICAgICAgaWYgKGNvbm5Qb29sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChTUUxpdGVEYXRhYmFzZSBwRGIgOiBjb25uUG9vbC5nZXRDb25uZWN0aW9uTGlzdCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzTGlzdC5hZGQobmV3IERiU3RhdHMoIihwb29sZWQgIyAiICsgcERiLm1Db25uZWN0aW9uTnVtICsgIikgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxhc3Rub2RlLCAwLCAwLCAwLCBwRGIuZ2V0Q2FjaGVIaXROdW0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERiLmdldENhY2hlTWlzc051bSgpLCBwRGIuZ2V0Q2FjaGVzaXplKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlLiB3ZSBkb24ndCBjYXJlIGFib3V0IGV4Y2VwdGlvbnMgd2hlbiB3ZSBhcmUgdGFraW5nIGFkYgorICAgICAgICAgICAgICAgIC8vIGJ1Z3JlcG9ydCEKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gZGJTdGF0c0xpc3Q7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogZ2V0IHRoZSBzcGVjaWZpZWQgcHJhZ21hIHZhbHVlIGZyb20gc3FsaXRlIGZvciB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlLgotICAgICAqIG9ubHkgaGFuZGxlcyBwcmFnbWEncyB0aGF0IHJldHVybiBpbnQvbG9uZy4KLSAgICAgKiBOTyBKQVZBIGxvY2tzIGFyZSBoZWxkIGluIHRoaXMgbWV0aG9kLgotICAgICAqIFRPRE86IHVzZSB0aGlzIHRvIGRvIGFsbCBwcmFnbWEncyBpbiB0aGlzIGNsYXNzCisgICAgICogUmV0dXJucyBsaXN0IG9mIGZ1bGwgcGF0aG5hbWVzIG9mIGFsbCBhdHRhY2hlZCBkYXRhYmFzZXMgaW5jbHVkaW5nIHRoZSBtYWluIGRhdGFiYXNlCisgICAgICogYnkgZXhlY3V0aW5nICdwcmFnbWEgZGF0YWJhc2VfbGlzdCcgb24gdGhlIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQHJldHVybiBBcnJheUxpc3Qgb2YgcGFpcnMgb2YgKGRhdGFiYXNlIG5hbWUsIGRhdGFiYXNlIGZpbGUgcGF0aCkgb3IgbnVsbCBpZiB0aGUgZGF0YWJhc2UKKyAgICAgKiBpcyBub3Qgb3Blbi4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldFByYWdtYVZhbChTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHByYWdtYSkgewotICAgICAgICBpZiAoIWRiLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm9nID0gbmV3IFNRTGl0ZVN0YXRlbWVudChkYiwgIlBSQUdNQSAiICsgcHJhZ21hKTsKLSAgICAgICAgICAgIGxvbmcgdmFsID0gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKLSAgICAgICAgICAgIHJldHVybiB2YWw7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocHJvZyAhPSBudWxsKSBwcm9nLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm5zIGxpc3Qgb2YgZnVsbCBwYXRobmFtZXMgb2YgYWxsIGF0dGFjaGVkIGRhdGFiYXNlcwotICAgICAqIGluY2x1ZGluZyB0aGUgbWFpbiBkYXRhYmFzZQotICAgICAqIFRPRE86IG1vdmUgdGhpcyB0byB7QGxpbmsgRGF0YWJhc2VVdGlsc30KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGdldEF0dGFjaGVkRGJzKFNRTGl0ZURhdGFiYXNlIGRiT2JqKSB7Ci0gICAgICAgIGlmICghZGJPYmouaXNPcGVuKCkpIHsKKyAgICBwdWJsaWMgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBnZXRBdHRhY2hlZERicygpIHsKKyAgICAgICAgaWYgKCFpc09wZW4oKSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IG5ldyBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+KCk7Ci0gICAgICAgIEN1cnNvciBjID0gZGJPYmoucmF3UXVlcnkoInByYWdtYSBkYXRhYmFzZV9saXN0OyIsIG51bGwpOwotICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgICBhdHRhY2hlZERicy5hZGQobmV3IFBhaXI8U3RyaW5nLCBTdHJpbmc+KGMuZ2V0U3RyaW5nKDEpLCBjLmdldFN0cmluZygyKSkpOworICAgICAgICBpZiAoIW1IYXNBdHRhY2hlZERicykgeworICAgICAgICAgICAgLy8gTm8gYXR0YWNoZWQgZGF0YWJhc2VzLgorICAgICAgICAgICAgLy8gVGhlcmUgaXMgYSBzbWFsbCB3aW5kb3cgd2hlcmUgYXR0YWNoZWQgZGF0YWJhc2VzIGV4aXN0IGJ1dCB0aGlzIGZsYWcgaXMgbm90IHNldCB5ZXQuCisgICAgICAgICAgICAvLyBUaGlzIGNhbiBvY2N1ciB3aGVuIHRoaXMgdGhyZWFkIGlzIGluIGEgcmFjZSBjb25kaXRpb24gd2l0aCBhbm90aGVyIHRocmVhZAorICAgICAgICAgICAgLy8gdGhhdCBpcyBleGVjdXRpbmcgdGhlIFNRTCBzdGF0ZW1lbnQ6ICJhdHRhY2ggZGF0YWJhc2UgPGJsYWg+IGFzIDxmb28+IgorICAgICAgICAgICAgLy8gSWYgdGhpcyB0aHJlYWQgaXMgTk9UIG9rIHdpdGggc3VjaCBhIHJhY2UgY29uZGl0aW9uIChhbmQgdGh1cyBwb3NzaWJseSBub3QgcmVjZWl2ZQorICAgICAgICAgICAgLy8gdGhlIGVudGlyZSBsaXN0IG9mIGF0dGFjaGVkIGRhdGFiYXNlcyksIHRoZW4gdGhlIGNhbGxlciBzaG91bGQgZW5zdXJlIHRoYXQgbm8gdGhyZWFkCisgICAgICAgICAgICAvLyBpcyBleGVjdXRpbmcgYW55IFNRTCBzdGF0ZW1lbnRzIHdoaWxlIGEgdGhyZWFkIGlzIGNhbGxpbmcgdGhpcyBtZXRob2QuCisgICAgICAgICAgICAvLyBUeXBpY2FsbHksIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuICdhZGIgYnVncmVwb3J0JyBpcyBkb25lIG9yIHRoZSBjYWxsZXIgd2FudHMgdG8KKyAgICAgICAgICAgIC8vIGNvbGxlY3Qgc3RhdHMgb24gdGhlIGRhdGFiYXNlIGFuZCBhbGwgaXRzIGF0dGFjaGVkIGRhdGFiYXNlcy4KKyAgICAgICAgICAgIGF0dGFjaGVkRGJzLmFkZChuZXcgUGFpcjxTdHJpbmcsIFN0cmluZz4oIm1haW4iLCBtUGF0aCkpOworICAgICAgICAgICAgcmV0dXJuIGF0dGFjaGVkRGJzOwogICAgICAgICB9Ci0gICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgLy8gaGFzIGF0dGFjaGVkIGRhdGFiYXNlcy4gcXVlcnkgc3FsaXRlIHRvIGdldCB0aGUgbGlzdCBvZiBhdHRhY2hlZCBkYXRhYmFzZXMuCisgICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGMgPSByYXdRdWVyeSgicHJhZ21hIGRhdGFiYXNlX2xpc3Q7IiwgbnVsbCk7CisgICAgICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBzcWxpdGUgcmV0dXJucyBhIHJvdyBmb3IgZWFjaCBkYXRhYmFzZSBpbiB0aGUgcmV0dXJuZWQgbGlzdCBvZiBkYXRhYmFzZXMuCisgICAgICAgICAgICAgICAgLy8gICBpbiBlYWNoIHJvdywKKyAgICAgICAgICAgICAgICAvLyAgICAgICAxc3QgY29sdW1uIGlzIHRoZSBkYXRhYmFzZSBuYW1lIHN1Y2ggYXMgbWFpbiwgb3IgdGhlIGRhdGFiYXNlCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIHNwZWNpZmllZCBvbiB0aGUgIkFUVEFDSCIgY29tbWFuZAorICAgICAgICAgICAgICAgIC8vICAgICAgIDJuZCBjb2x1bW4gaXMgdGhlIGRhdGFiYXNlIGZpbGUgcGF0aC4KKyAgICAgICAgICAgICAgICBhdHRhY2hlZERicy5hZGQobmV3IFBhaXI8U3RyaW5nLCBTdHJpbmc+KGMuZ2V0U3RyaW5nKDEpLCBjLmdldFN0cmluZygyKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICByZXR1cm4gYXR0YWNoZWREYnM7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogUnVucyAncHJhZ21hIGludGVncml0eV9jaGVjaycgb24gdGhlIGdpdmVuIGRhdGFiYXNlIChhbmQgYWxsIHRoZSBhdHRhY2hlZCBkYXRhYmFzZXMpCisgICAgICogYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZGF0YWJhc2UgKGFuZCBhbGwgaXRzIGF0dGFjaGVkIGRhdGFiYXNlcykgcGFzcyBpbnRlZ3JpdHlfY2hlY2ssCisgICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqPHA+CisgICAgICogSWYgdGhlIHJlc3VsdCBpcyBmYWxzZSwgdGhlbiB0aGlzIG1ldGhvZCBsb2dzIHRoZSBlcnJvcnMgcmVwb3J0ZWQgYnkgdGhlIGludGVncml0eV9jaGVjaworICAgICAqIGNvbW1hbmQgZXhlY3V0aW9uLgorICAgICAqPHA+CisgICAgICogTm90ZSB0aGF0ICdwcmFnbWEgaW50ZWdyaXR5X2NoZWNrJyBvbiBhIGRhdGFiYXNlIGNhbiB0YWtlIGEgbG9uZyB0aW1lLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBkYXRhYmFzZSAoYW5kIGFsbCBpdHMgYXR0YWNoZWQgZGF0YWJhc2VzKSBwYXNzIGludGVncml0eV9jaGVjaywKKyAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEYXRhYmFzZUludGVncml0eU9rKCkgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOworICAgICAgICBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGF0dGFjaGVkRGJzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGF0dGFjaGVkRGJzID0gZ2V0QXR0YWNoZWREYnMoKTsKKyAgICAgICAgICAgIGlmIChhdHRhY2hlZERicyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2VsaXN0IGZvcjogIiArIGdldFBhdGgoKSArICIgY291bGRuJ3QgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiYmUgcmV0cmlldmVkLiBwcm9iYWJseSBiZWNhdXNlIHRoZSBkYXRhYmFzZSBpcyBjbG9zZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGNhbid0IGdldCBhdHRhY2hlZERiIGxpc3QuIGRvIGludGVncml0eSBjaGVjayBvbiB0aGUgbWFpbiBkYXRhYmFzZQorICAgICAgICAgICAgYXR0YWNoZWREYnMgPSBuZXcgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PigpOworICAgICAgICAgICAgYXR0YWNoZWREYnMuYWRkKG5ldyBQYWlyPFN0cmluZywgU3RyaW5nPigibWFpbiIsIHRoaXMubVBhdGgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dGFjaGVkRGJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBQYWlyPFN0cmluZywgU3RyaW5nPiBwID0gYXR0YWNoZWREYnMuZ2V0KGkpOworICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHByb2cgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcm9nID0gY29tcGlsZVN0YXRlbWVudCgiUFJBR01BICIgKyBwLmZpcnN0ICsgIi5pbnRlZ3JpdHlfY2hlY2soMSk7Iik7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJzbHQgPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKCFyc2x0LmVxdWFsc0lnbm9yZUNhc2UoIm9rIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaW50ZWdyaXR5X2NoZWNrZXIgZmFpbGVkIG9uIG1haW4gb3IgYXR0YWNoZWQgZGF0YWJhc2VzCisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlBSQUdNQSBpbnRlZ3JpdHlfY2hlY2sgb24gIiArIHAuc2Vjb25kICsgIiByZXR1cm5lZDogIiArIHJzbHQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAocHJvZyAhPSBudWxsKSBwcm9nLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCiAgICAgICogTmF0aXZlIGNhbGwgdG8gb3BlbiB0aGUgZGF0YWJhc2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSBkYXRhYmFzZQpAQCAtMjIzOSw1MSArMjYwOCwzNCBAQAogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZGJvcGVuKFN0cmluZyBwYXRoLCBpbnQgZmxhZ3MpOwogCiAgICAgLyoqCi0gICAgICogTmF0aXZlIGNhbGwgdG8gc2V0dXAgdHJhY2luZyBvZiBhbGwgc3FsIHN0YXRlbWVudHMKKyAgICAgKiBOYXRpdmUgY2FsbCB0byBzZXR1cCB0cmFjaW5nIG9mIGFsbCBTUUwgc3RhdGVtZW50cwogICAgICAqCiAgICAgICogQHBhcmFtIHBhdGggdGhlIGZ1bGwgcGF0aCB0byB0aGUgZGF0YWJhc2UKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbk51bSBjb25uZWN0aW9uIG51bWJlcjogMCAtIE4sIHdoZXJlIHRoZSBtYWluIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICBjb25uZWN0aW9uIGhhbmRsZSBpcyBudW1iZXJlZCAwIGFuZCB0aGUgY29ubmVjdGlvbiBoYW5kbGVzIGluIHRoZSBjb25uZWN0aW9uCisgICAgICogICAgICAgICAgICBwb29sIGFyZSBudW1iZXJlZCAxLi5OLgogICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZW5hYmxlU3FsVHJhY2luZyhTdHJpbmcgcGF0aCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBlbmFibGVTcWxUcmFjaW5nKFN0cmluZyBwYXRoLCBzaG9ydCBjb25uZWN0aW9uTnVtKTsKIAogICAgIC8qKgotICAgICAqIE5hdGl2ZSBjYWxsIHRvIHNldHVwIHByb2ZpbGluZyBvZiBhbGwgc3FsIHN0YXRlbWVudHMuCisgICAgICogTmF0aXZlIGNhbGwgdG8gc2V0dXAgcHJvZmlsaW5nIG9mIGFsbCBTUUwgc3RhdGVtZW50cy4KICAgICAgKiBjdXJyZW50bHksIHNxbGl0ZSdzIHByb2ZpbGluZyA9IHByaW50aW5nIG9mIGV4ZWN1dGlvbi10aW1lCi0gICAgICogKHdhbGwtY2xvY2sgdGltZSkgb2YgZWFjaCBvZiB0aGUgc3FsIHN0YXRlbWVudHMsIGFzIHRoZXkKKyAgICAgKiAod2FsbC1jbG9jayB0aW1lKSBvZiBlYWNoIG9mIHRoZSBTUUwgc3RhdGVtZW50cywgYXMgdGhleQogICAgICAqIGFyZSBleGVjdXRlZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBwYXRoIHRoZSBmdWxsIHBhdGggdG8gdGhlIGRhdGFiYXNlCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25OdW0gY29ubmVjdGlvbiBudW1iZXI6IDAgLSBOLCB3aGVyZSB0aGUgbWFpbiBkYXRhYmFzZQorICAgICAqICAgICAgICAgICAgY29ubmVjdGlvbiBoYW5kbGUgaXMgbnVtYmVyZWQgMCBhbmQgdGhlIGNvbm5lY3Rpb24gaGFuZGxlcyBpbiB0aGUgY29ubmVjdGlvbgorICAgICAqICAgICAgICAgICAgcG9vbCBhcmUgbnVtYmVyZWQgMS4uTi4KICAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGVuYWJsZVNxbFByb2ZpbGluZyhTdHJpbmcgcGF0aCk7Ci0KLSAgICAvKioKLSAgICAgKiBOYXRpdmUgY2FsbCB0byBleGVjdXRlIGEgcmF3IFNRTCBzdGF0ZW1lbnQuIHtAbGluayAjbG9ja30gbXVzdCBiZSBoZWxkCi0gICAgICogd2hlbiBjYWxsaW5nIHRoaXMgbWV0aG9kLgotICAgICAqCi0gICAgICogQHBhcmFtIHNxbCBUaGUgcmF3IFNRTCBzdHJpbmcKLSAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gbmF0aXZlIHZvaWQgbmF0aXZlX2V4ZWNTUUwoU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGVuYWJsZVNxbFByb2ZpbGluZyhTdHJpbmcgcGF0aCwgc2hvcnQgY29ubmVjdGlvbk51bSk7CiAKICAgICAvKioKICAgICAgKiBOYXRpdmUgY2FsbCB0byBzZXQgdGhlIGxvY2FsZS4gIHtAbGluayAjbG9ja30gbXVzdCBiZSBoZWxkIHdoZW4gY2FsbGluZwogICAgICAqIHRoaXMgbWV0aG9kLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICAgICovCi0gICAgLyogcGFja2FnZSAqLyBuYXRpdmUgdm9pZCBuYXRpdmVfc2V0TG9jYWxlKFN0cmluZyBsb2MsIGludCBmbGFncyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByb3cgSUQgb2YgdGhlIGxhc3Qgcm93IGluc2VydGVkIGludG8gdGhlIGRhdGFiYXNlLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcm93IElEIG9mIHRoZSBsYXN0IHJvdyBpbnNlcnRlZCBpbnRvIHRoZSBkYXRhYmFzZS4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIG5hdGl2ZSBsb25nIGxhc3RJbnNlcnRSb3coKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFuZ2VzIG1hZGUgaW4gdGhlIGxhc3Qgc3RhdGVtZW50IGV4ZWN1dGVkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYW5nZXMgbWFkZSBpbiB0aGUgbGFzdCBzdGF0ZW1lbnQgZXhlY3V0ZWQuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBuYXRpdmUgaW50IGxhc3RDaGFuZ2VDb3VudCgpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlX3NldExvY2FsZShTdHJpbmcgbG9jLCBpbnQgZmxhZ3MpOwogCiAgICAgLyoqCiAgICAgICogcmV0dXJuIHRoZSBTUUxJVEVfREJTVEFUVVNfTE9PS0FTSURFX1VTRUQgZG9jdW1lbnRlZCBoZXJlCkBAIC0yMjkxLDQgKzI2NDMsMTEgQEAKICAgICAgKiBAcmV0dXJuIGludCB2YWx1ZSBvZiBTUUxJVEVfREJTVEFUVVNfTE9PS0FTSURFX1VTRUQKICAgICAgKi8KICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX2dldERiTG9va2FzaWRlKCk7CisKKyAgICAvKioKKyAgICAgKiBmaW5hbGl6ZXMgdGhlIGdpdmVuIHN0YXRlbWVudCBpZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0ZW1lbnRJZCBzdGF0ZW1lbnQgdG8gYmUgZmluemxpZWQgYnkgc3FsaXRlCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfZmluYWxpemUoaW50IHN0YXRlbWVudElkKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlMmQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCisvKioKKyAqIFRocm93biBpZiAgdGhlIGRhdGFiYXNlIGVuZ2luZSB3YXMgdW5hYmxlIHRvIGFjcXVpcmUgdGhlCisgKiBkYXRhYmFzZSBsb2NrcyBpdCBuZWVkcyB0byBkbyBpdHMgam9iLiAgSWYgdGhlIHN0YXRlbWVudCBpcyBhIFtDT01NSVRdCisgKiBvciBvY2N1cnMgb3V0c2lkZSBvZiBhbiBleHBsaWNpdCB0cmFuc2FjdGlvbiwgdGhlbiB5b3UgY2FuIHJldHJ5IHRoZQorICogc3RhdGVtZW50LiAgSWYgdGhlIHN0YXRlbWVudCBpcyBub3QgYSBbQ09NTUlUXSBhbmQgb2NjdXJzIHdpdGhpbiBhCisgKiBleHBsaWNpdCB0cmFuc2FjdGlvbiB0aGVuIHlvdSBzaG91bGQgcm9sbGJhY2sgdGhlIHRyYW5zYWN0aW9uIGJlZm9yZQorICogY29udGludWluZy4KKyAqLworcHVibGljIGNsYXNzIFNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uKFN0cmluZyBlcnJvcikgeworICAgICAgICBzdXBlcihlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4MjUzNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEZWJ1Zy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURlYnVnLmphdmEKaW5kZXggYjJhMTY2Yi4uOTQ5NjA3OTEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEZWJ1Zy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEZWJ1Zy5qYXZhCkBAIC0xMzIsMTEgKzEzMiwxNiBAQAogICAgICAgICAvKiogZG9jdW1lbnRlZCBoZXJlIGh0dHA6Ly93d3cuc3FsaXRlLm9yZy9jM3JlZi9jX2Ric3RhdHVzX2xvb2thc2lkZV91c2VkLmh0bWwgKi8KICAgICAgICAgcHVibGljIGludCBsb29rYXNpZGU7CiAKLSAgICAgICAgcHVibGljIERiU3RhdHMoU3RyaW5nIGRiTmFtZSwgbG9uZyBwYWdlQ291bnQsIGxvbmcgcGFnZVNpemUsIGludCBsb29rYXNpZGUpIHsKKyAgICAgICAgLyoqIHN0YXRlbWVudCBjYWNoZSBzdGF0czogaGl0cy9taXNzZXMvY2FjaGVzaXplICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY2FjaGU7CisKKyAgICAgICAgcHVibGljIERiU3RhdHMoU3RyaW5nIGRiTmFtZSwgbG9uZyBwYWdlQ291bnQsIGxvbmcgcGFnZVNpemUsIGludCBsb29rYXNpZGUsCisgICAgICAgICAgICBpbnQgaGl0cywgaW50IG1pc3NlcywgaW50IGNhY2hlc2l6ZSkgewogICAgICAgICAgICAgdGhpcy5kYk5hbWUgPSBkYk5hbWU7CiAgICAgICAgICAgICB0aGlzLnBhZ2VTaXplID0gcGFnZVNpemUgLyAxMDI0OwogICAgICAgICAgICAgZGJTaXplID0gKHBhZ2VDb3VudCAqIHBhZ2VTaXplKSAvIDEwMjQ7CiAgICAgICAgICAgICB0aGlzLmxvb2thc2lkZSA9IGxvb2thc2lkZTsKKyAgICAgICAgICAgIHRoaXMuY2FjaGUgPSBoaXRzICsgIi8iICsgbWlzc2VzICsgIi8iICsgY2FjaGVzaXplOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGlyZWN0Q3Vyc29yRHJpdmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGlyZWN0Q3Vyc29yRHJpdmVyLmphdmEKaW5kZXggMjE0NGZjMy4uZGUyZmNhOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURpcmVjdEN1cnNvckRyaXZlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEaXJlY3RDdXJzb3JEcml2ZXIuamF2YQpAQCAtMzksMTggKzM5LDE2IEBACiAKICAgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgewogICAgICAgICAvLyBDb21waWxlIHRoZSBxdWVyeQotICAgICAgICBTUUxpdGVRdWVyeSBxdWVyeSA9IG5ldyBTUUxpdGVRdWVyeShtRGF0YWJhc2UsIG1TcWwsIDAsIHNlbGVjdGlvbkFyZ3MpOworICAgICAgICBTUUxpdGVRdWVyeSBxdWVyeSA9IG51bGw7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEFyZyBiaW5kaW5nCi0gICAgICAgICAgICBpbnQgbnVtQXJncyA9IHNlbGVjdGlvbkFyZ3MgPT0gbnVsbCA/IDAgOiBzZWxlY3Rpb25BcmdzLmxlbmd0aDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcXVlcnkuYmluZFN0cmluZyhpICsgMSwgc2VsZWN0aW9uQXJnc1tpXSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtRGF0YWJhc2UubG9jaygpOworICAgICAgICAgICAgbURhdGFiYXNlLmNsb3NlUGVuZGluZ1N0YXRlbWVudHMoKTsKKyAgICAgICAgICAgIHF1ZXJ5ID0gbmV3IFNRTGl0ZVF1ZXJ5KG1EYXRhYmFzZSwgbVNxbCwgMCwgc2VsZWN0aW9uQXJncyk7CiAKICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgY3Vyc29yCiAgICAgICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnNvciA9IG5ldyBTUUxpdGVDdXJzb3IobURhdGFiYXNlLCB0aGlzLCBtRWRpdFRhYmxlLCBxdWVyeSk7CisgICAgICAgICAgICAgICAgbUN1cnNvciA9IG5ldyBTUUxpdGVDdXJzb3IodGhpcywgbUVkaXRUYWJsZSwgcXVlcnkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtQ3Vyc29yID0gZmFjdG9yeS5uZXdDdXJzb3IobURhdGFiYXNlLCB0aGlzLCBtRWRpdFRhYmxlLCBxdWVyeSk7CiAgICAgICAgICAgICB9CkBAIC02MSw2ICs1OSw3IEBACiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyBvYmplY3QgaXMgY2xlYW5lZCB1cCBpZiBzb21ldGhpbmcgaGFwcGVucwogICAgICAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHF1ZXJ5LmNsb3NlKCk7CisgICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTY5LDEwICs2OCw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0QmluZEFyZ3VtZW50cyhTdHJpbmdbXSBiaW5kQXJncykgewotICAgICAgICBmaW5hbCBpbnQgbnVtQXJncyA9IGJpbmRBcmdzLmxlbmd0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKLSAgICAgICAgICAgIG1RdWVyeS5iaW5kU3RyaW5nKGkgKyAxLCBiaW5kQXJnc1tpXSk7Ci0gICAgICAgIH0KKyAgICAgICAgbVF1ZXJ5LmJpbmRBbGxBcmdzQXNTdHJpbmdzKGJpbmRBcmdzKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBjdXJzb3JEZWFjdGl2YXRlZCgpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVNaXN1c2VFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVNaXN1c2VFeGNlcHRpb24uamF2YQppbmRleCA2ODVmM2VhLi41NDZlYzA4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlTWlzdXNlRXhjZXB0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU1pc3VzZUV4Y2VwdGlvbi5qYXZhCkBAIC0xNiw2ICsxNiwxOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwogCisvKioKKyAqIFRoaXMgZXJyb3IgY2FuIG9jY3VyIGlmIHRoZSBhcHBsaWNhdGlvbiBjcmVhdGVzIGEgU1FMaXRlU3RhdGVtZW50IG9iamVjdCBhbmQgYWxsb3dzIG11bHRpcGxlCisgKiB0aHJlYWRzIGluIHRoZSBhcHBsaWNhdGlvbiB1c2UgaXQgYXQgdGhlIHNhbWUgdGltZS4KKyAqIFNxbGl0ZSByZXR1cm5zIHRoaXMgZXJyb3IgaWYgYmluZCBhbmQgZXhlY3V0ZSBtZXRob2RzIG9uIHRoaXMgb2JqZWN0IG9jY3VyIGF0IHRoZSBzYW1lIHRpbWUKKyAqIGZyb20gbXVsdGlwbGUgdGhyZWFkcywgbGlrZSBzbzoKKyAqICAgICB0aHJlYWQgIyAxOiBpbiBleGVjdXRlKCkgbWV0aG9kIG9mIHRoZSBTUUxpdGVTdGF0ZW1lbnQgb2JqZWN0CisgKiAgICAgd2hpbGUgdGhyZWFkICMgMjogaXMgaW4gYmluZC4uKCkgb24gdGhlIHNhbWUgb2JqZWN0LgorICo8L3A+CisgKiBGSVggdGhpcyBieSBORVZFUiBzaGFyaW5nIHRoZSBzYW1lIFNRTGl0ZVN0YXRlbWVudCBvYmplY3QgYmV0d2VlbiB0aHJlYWRzLgorICogQ3JlYXRlIGEgbG9jYWwgaW5zdGFuY2Ugb2YgdGhlIFNRTGl0ZVN0YXRlbWVudCB3aGVuZXZlciBpdCBpcyBuZWVkZWQsIHVzZSBpdCBhbmQgY2xvc2UgaXQgQVNBUC4KKyAqIE5FVkVSIG1ha2UgaXQgZ2xvYmFsbHkgYXZhaWxhYmxlLgorICovCiBwdWJsaWMgY2xhc3MgU1FMaXRlTWlzdXNlRXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKICAgICBwdWJsaWMgU1FMaXRlTWlzdXNlRXhjZXB0aW9uKCkge30KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU9wZW5IZWxwZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPcGVuSGVscGVyLmphdmEKaW5kZXggYjQ2MTVlYi4uY2NmOGQ2OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU9wZW5IZWxwZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3BlbkhlbHBlci5qYXZhCkBAIC0xNyw2ICsxNyw4IEBACiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKQEAgLTUxLDYgKzUzLDcgQEAKIAogICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgbURhdGFiYXNlID0gbnVsbDsKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzSW5pdGlhbGl6aW5nID0gZmFsc2U7CisgICAgcHJpdmF0ZSBmaW5hbCBEYXRhYmFzZUVycm9ySGFuZGxlciBtRXJyb3JIYW5kbGVyOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgaGVscGVyIG9iamVjdCB0byBjcmVhdGUsIG9wZW4sIGFuZC9vciBtYW5hZ2UgYSBkYXRhYmFzZS4KQEAgLTY1LDEyICs2OCwzNyBAQAogICAgICAqICAgICB7QGxpbmsgI29uVXBncmFkZX0gd2lsbCBiZSB1c2VkIHRvIHVwZ3JhZGUgdGhlIGRhdGFiYXNlCiAgICAgICovCiAgICAgcHVibGljIFNRTGl0ZU9wZW5IZWxwZXIoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbmFtZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgdmVyc2lvbikgeworICAgICAgICB0aGlzKGNvbnRleHQsIG5hbWUsIGZhY3RvcnksIHZlcnNpb24sIG5ldyBEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgaGVscGVyIG9iamVjdCB0byBjcmVhdGUsIG9wZW4sIGFuZC9vciBtYW5hZ2UgYSBkYXRhYmFzZS4KKyAgICAgKiBUaGUgZGF0YWJhc2UgaXMgbm90IGFjdHVhbGx5IGNyZWF0ZWQgb3Igb3BlbmVkIHVudGlsIG9uZSBvZgorICAgICAqIHtAbGluayAjZ2V0V3JpdGFibGVEYXRhYmFzZX0gb3Ige0BsaW5rICNnZXRSZWFkYWJsZURhdGFiYXNlfSBpcyBjYWxsZWQuCisgICAgICoKKyAgICAgKiA8cD5BY2NlcHRzIGlucHV0IHBhcmFtOiBhIGNvbmNyZXRlIGluc3RhbmNlIG9mIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUKKyAgICAgKiB1c2VkIHRvIGhhbmRsZSBjb3JydXB0aW9uIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UgY29ycnVwdGlvbi48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0byB1c2UgdG8gb3BlbiBvciBjcmVhdGUgdGhlIGRhdGFiYXNlCisgICAgICogQHBhcmFtIG5hbWUgb2YgdGhlIGRhdGFiYXNlIGZpbGUsIG9yIG51bGwgZm9yIGFuIGluLW1lbW9yeSBkYXRhYmFzZQorICAgICAqIEBwYXJhbSBmYWN0b3J5IHRvIHVzZSBmb3IgY3JlYXRpbmcgY3Vyc29yIG9iamVjdHMsIG9yIG51bGwgZm9yIHRoZSBkZWZhdWx0CisgICAgICogQHBhcmFtIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBkYXRhYmFzZSAoc3RhcnRpbmcgYXQgMSk7IGlmIHRoZSBkYXRhYmFzZSBpcyBvbGRlciwKKyAgICAgKiAgICAge0BsaW5rICNvblVwZ3JhZGV9IHdpbGwgYmUgdXNlZCB0byB1cGdyYWRlIHRoZSBkYXRhYmFzZQorICAgICAqIEBwYXJhbSBlcnJvckhhbmRsZXIgdGhlIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUgdXNlZCB3aGVuIHNxbGl0ZSByZXBvcnRzIGRhdGFiYXNlCisgICAgICogY29ycnVwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMaXRlT3BlbkhlbHBlcihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCB2ZXJzaW9uLAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CiAgICAgICAgIGlmICh2ZXJzaW9uIDwgMSkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmVyc2lvbiBtdXN0IGJlID49IDEsIHdhcyAiICsgdmVyc2lvbik7CisgICAgICAgIGlmIChlcnJvckhhbmRsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRGF0YWJhc2VFcnJvckhhbmRsZXIgcGFyYW0gdmFsdWUgY2FuJ3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbU5hbWUgPSBuYW1lOwogICAgICAgICBtRmFjdG9yeSA9IGZhY3Rvcnk7CiAgICAgICAgIG1OZXdWZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgbUVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjsKICAgICB9CiAKICAgICAvKioKQEAgLTkzLDggKzEyMSwxMyBAQAogICAgICAqIEByZXR1cm4gYSByZWFkL3dyaXRlIGRhdGFiYXNlIG9iamVjdCB2YWxpZCB1bnRpbCB7QGxpbmsgI2Nsb3NlfSBpcyBjYWxsZWQKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIFNRTGl0ZURhdGFiYXNlIGdldFdyaXRhYmxlRGF0YWJhc2UoKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgIT0gbnVsbCAmJiBtRGF0YWJhc2UuaXNPcGVuKCkgJiYgIW1EYXRhYmFzZS5pc1JlYWRPbmx5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGF0YWJhc2U7ICAvLyBUaGUgZGF0YWJhc2UgaXMgYWxyZWFkeSBvcGVuIGZvciBidXNpbmVzcworICAgICAgICBpZiAobURhdGFiYXNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7CisgICAgICAgICAgICAgICAgLy8gZGFybiEgdGhlIHVzZXIgY2xvc2VkIHRoZSBkYXRhYmFzZSBieSBjYWxsaW5nIG1EYXRhYmFzZS5jbG9zZSgpCisgICAgICAgICAgICAgICAgbURhdGFiYXNlID0gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1EYXRhYmFzZS5pc1JlYWRPbmx5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbURhdGFiYXNlOyAgLy8gVGhlIGRhdGFiYXNlIGlzIGFscmVhZHkgb3BlbiBmb3IgYnVzaW5lc3MKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChtSXNJbml0aWFsaXppbmcpIHsKQEAgLTExNSwxMCArMTQ4LDE0IEBACiAgICAgICAgICAgICBpZiAobU5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGRiID0gU1FMaXRlRGF0YWJhc2UuY3JlYXRlKG51bGwpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkYiA9IG1Db250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKG1OYW1lLCAwLCBtRmFjdG9yeSk7CisgICAgICAgICAgICAgICAgZGIgPSBtQ29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZShtTmFtZSwgMCwgbUZhY3RvcnksIG1FcnJvckhhbmRsZXIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQgdmVyc2lvbiA9IGRiLmdldFZlcnNpb24oKTsKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uID4gbU5ld1ZlcnNpb24pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJEYXRhYmFzZSAiICsgbU5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBjYW5ub3QgYmUgZG93bmdyYWRlZC4gaW5zdGVhZCwgcGxlYXNlIHVuaW5zdGFsbCBuZXcgdmVyc2lvbiBmaXJzdC4iKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IG1OZXdWZXJzaW9uKSB7CiAgICAgICAgICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbigpOwogICAgICAgICAgICAgICAgIHRyeSB7CkBAIC0xNzUsOCArMjEyLDEzIEBACiAgICAgICogICAgIG9yIHtAbGluayAjY2xvc2V9IGlzIGNhbGxlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIFNRTGl0ZURhdGFiYXNlIGdldFJlYWRhYmxlRGF0YWJhc2UoKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgIT0gbnVsbCAmJiBtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGF0YWJhc2U7ICAvLyBUaGUgZGF0YWJhc2UgaXMgYWxyZWFkeSBvcGVuIGZvciBidXNpbmVzcworICAgICAgICBpZiAobURhdGFiYXNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7CisgICAgICAgICAgICAgICAgLy8gZGFybiEgdGhlIHVzZXIgY2xvc2VkIHRoZSBkYXRhYmFzZSBieSBjYWxsaW5nIG1EYXRhYmFzZS5jbG9zZSgpCisgICAgICAgICAgICAgICAgbURhdGFiYXNlID0gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1EYXRhYmFzZTsgIC8vIFRoZSBkYXRhYmFzZSBpcyBhbHJlYWR5IG9wZW4gZm9yIGJ1c2luZXNzCisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobUlzSW5pdGlhbGl6aW5nKSB7CkBAIC0xOTQsNyArMjM2LDggQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1Jc0luaXRpYWxpemluZyA9IHRydWU7CiAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IG1Db250ZXh0LmdldERhdGFiYXNlUGF0aChtTmFtZSkuZ2V0UGF0aCgpOwotICAgICAgICAgICAgZGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuRGF0YWJhc2UocGF0aCwgbUZhY3RvcnksIFNRTGl0ZURhdGFiYXNlLk9QRU5fUkVBRE9OTFkpOworICAgICAgICAgICAgZGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuRGF0YWJhc2UocGF0aCwgbUZhY3RvcnksIFNRTGl0ZURhdGFiYXNlLk9QRU5fUkVBRE9OTFksCisgICAgICAgICAgICAgICAgICAgIG1FcnJvckhhbmRsZXIpOwogICAgICAgICAgICAgaWYgKGRiLmdldFZlcnNpb24oKSAhPSBtTmV3VmVyc2lvbikgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBTUUxpdGVFeGNlcHRpb24oIkNhbid0IHVwZ3JhZGUgcmVhZC1vbmx5IGRhdGFiYXNlIGZyb20gdmVyc2lvbiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgIGRiLmdldFZlcnNpb24oKSArICIgdG8gIiArIG1OZXdWZXJzaW9uICsgIjogIiArIHBhdGgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGNlOGI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uKCkge30KKworICAgIHB1YmxpYyBTUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVQcm9ncmFtLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUHJvZ3JhbS5qYXZhCmluZGV4IDRkOTZmMTIuLjgzNjIxZjIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVQcm9ncmFtLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVByb2dyYW0uamF2YQpAQCAtMTYsMTIgKzE2LDE2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CiAKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCiAvKioKICAqIEEgYmFzZSBjbGFzcyBmb3IgY29tcGlsZWQgU1FMaXRlIHByb2dyYW1zLgotICoKLSAqIFNRTGl0ZVByb2dyYW0gaXMgbm90IGludGVybmFsbHkgc3luY2hyb25pemVkIHNvIGNvZGUgdXNpbmcgYSBTUUxpdGVQcm9ncmFtIGZyb20gbXVsdGlwbGUKKyAqPHA+CisgKiBTUUxpdGVQcm9ncmFtIGlzIE5PVCBpbnRlcm5hbGx5IHN5bmNocm9uaXplZCBzbyBjb2RlIHVzaW5nIGEgU1FMaXRlUHJvZ3JhbSBmcm9tIG11bHRpcGxlCiAgKiB0aHJlYWRzIHNob3VsZCBwZXJmb3JtIGl0cyBvd24gc3luY2hyb25pemF0aW9uIHdoZW4gdXNpbmcgdGhlIFNRTGl0ZVByb2dyYW0uCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTUUxpdGVQcm9ncmFtIGV4dGVuZHMgU1FMaXRlQ2xvc2FibGUgewpAQCAtNDMsMTIgKzQ3LDEyIEBACiAgICAgICogQGRlcHJlY2F0ZWQgZG8gbm90IHVzZSB0aGlzCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKLSAgICBwcm90ZWN0ZWQgaW50IG5IYW5kbGUgPSAwOworICAgIHByb3RlY3RlZCBpbnQgbkhhbmRsZTsKIAogICAgIC8qKgogICAgICAqIHRoZSBTUUxpdGVDb21waWxlZFNxbCBvYmplY3QgZm9yIHRoZSBnaXZlbiBzcWwgc3RhdGVtZW50LgogICAgICAqLwotICAgIHByaXZhdGUgU1FMaXRlQ29tcGlsZWRTcWwgbUNvbXBpbGVkU3FsOworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlQ29tcGlsZWRTcWwgbUNvbXBpbGVkU3FsOwogCiAgICAgLyoqCiAgICAgICogU1FMaXRlQ29tcGlsZWRTcWwgc3RhdGVtZW50IGlkIGlzIHBvcHVsYXRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdCBmcm9tIHRoZSBhYm92ZQpAQCAtNTYsNDEgKzYwLDk3IEBACiAgICAgICogQGRlcHJlY2F0ZWQgZG8gbm90IHVzZSB0aGlzCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKLSAgICBwcm90ZWN0ZWQgaW50IG5TdGF0ZW1lbnQgPSAwOworICAgIHByb3RlY3RlZCBpbnQgblN0YXRlbWVudDsKKworICAgIC8qKgorICAgICAqIEluIHRoZSBjYXNlIG9mIHtAbGluayBTUUxpdGVTdGF0ZW1lbnR9LCB0aGlzIG1lbWJlciBzdG9yZXMgdGhlIGJpbmRhcmdzIHBhc3NlZAorICAgICAqIHRvIHRoZSBmb2xsb3dpbmcgbWV0aG9kcywgaW5zdGVhZCBvZiBhY3R1YWxseSBkb2luZyB0aGUgYmluZGluZy4KKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rICNiaW5kQmxvYihpbnQsIGJ5dGVbXSl9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI2JpbmREb3VibGUoaW50LCBkb3VibGUpfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNiaW5kTG9uZyhpbnQsIGxvbmcpfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNiaW5kTnVsbChpbnQpfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNiaW5kU3RyaW5nKGludCwgU3RyaW5nKX08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+CisgICAgICogRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgYSBQYWlyIG9mCisgICAgICogPG9sPgorICAgICAqICAgPGxpPmJpbmQgYXJnIHBvc2l0aW9uIG51bWJlcjwvbGk+CisgICAgICogICA8bGk+dGhlIHZhbHVlIHRvIGJlIGJvdW5kIHRvIHRoZSBiaW5kYXJnPC9saT4KKyAgICAgKiA8L29sPgorICAgICAqIDxwPgorICAgICAqIEl0IGlzIGxhemlseSBpbml0aWFsaXplZCBpbiB0aGUgYWJvdmUgYmluZCBtZXRob2RzCisgICAgICogYW5kIGl0IGlzIGNsZWFyZWQgaW4ge0BsaW5rICNjbGVhckJpbmRpbmdzKCl9IG1ldGhvZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJdCBpcyBwcm90ZWN0ZWQgKGluIG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50KSBieSB7QGxpbmsgU1FMaXRlUHJvZ3JhbX0udGhpcworICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gSGFzaE1hcDxJbnRlZ2VyLCBPYmplY3Q+IG1CaW5kQXJncyA9IG51bGw7CisgICAgLyogcGFja2FnZSAqLyBmaW5hbCBpbnQgbVN0YXRlbWVudFR5cGU7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTUVOVF9DQUNIRUFCTEUgPSAxNjsKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX0RPTlRfUFJFUEFSRSA9IDMyOworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBTVEFURU1FTlRfVVNFX1BPT0xFRF9DT05OID0gNjQ7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTUVOVF9UWVBFX01BU0sgPSAweDBmOwogCiAgICAgLyogcGFja2FnZSAqLyBTUUxpdGVQcm9ncmFtKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsKSB7Ci0gICAgICAgIG1EYXRhYmFzZSA9IGRiOworICAgICAgICB0aGlzKGRiLCBzcWwsIG51bGwsIHRydWUpOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlUHJvZ3JhbShTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCwgT2JqZWN0W10gYmluZEFyZ3MsCisgICAgICAgICAgICBib29sZWFuIGNvbXBpbGVGbGFnKSB7CiAgICAgICAgIG1TcWwgPSBzcWwudHJpbSgpOworICAgICAgICBpbnQgbiA9IERhdGFiYXNlVXRpbHMuZ2V0U3FsU3RhdGVtZW50VHlwZShtU3FsKTsKKyAgICAgICAgc3dpdGNoIChuKSB7CisgICAgICAgICAgICBjYXNlIERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX1VQREFURToKKyAgICAgICAgICAgICAgICBtU3RhdGVtZW50VHlwZSA9IG4gfCBTVEFURU1FTlRfQ0FDSEVBQkxFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9TRUxFQ1Q6CisgICAgICAgICAgICAgICAgbVN0YXRlbWVudFR5cGUgPSBuIHwgU1RBVEVNRU5UX0NBQ0hFQUJMRSB8IFNUQVRFTUVOVF9VU0VfUE9PTEVEX0NPTk47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0FUVEFDSDoKKyAgICAgICAgICAgIGNhc2UgRGF0YWJhc2VVdGlscy5TVEFURU1FTlRfQkVHSU46CisgICAgICAgICAgICBjYXNlIERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0NPTU1JVDoKKyAgICAgICAgICAgIGNhc2UgRGF0YWJhc2VVdGlscy5TVEFURU1FTlRfQUJPUlQ6CisgICAgICAgICAgICBjYXNlIERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0RETDoKKyAgICAgICAgICAgIGNhc2UgRGF0YWJhc2VVdGlscy5TVEFURU1FTlRfVU5QUkVQQVJFRDoKKyAgICAgICAgICAgICAgICBtU3RhdGVtZW50VHlwZSA9IG4gfCBTVEFURU1FTlRfRE9OVF9QUkVQQVJFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBtU3RhdGVtZW50VHlwZSA9IG47CisgICAgICAgIH0KICAgICAgICAgZGIuYWNxdWlyZVJlZmVyZW5jZSgpOwogICAgICAgICBkYi5hZGRTUUxpdGVDbG9zYWJsZSh0aGlzKTsKLSAgICAgICAgdGhpcy5uSGFuZGxlID0gZGIubU5hdGl2ZUhhbmRsZTsKKyAgICAgICAgbURhdGFiYXNlID0gZGI7CisgICAgICAgIG5IYW5kbGUgPSBkYi5tTmF0aXZlSGFuZGxlOworICAgICAgICBpZiAoYmluZEFyZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IHNpemUgPSBiaW5kQXJncy5sZW5ndGg7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIHRoaXMuYWRkVG9CaW5kQXJncyhpICsgMSwgYmluZEFyZ3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb21waWxlRmxhZykgeworICAgICAgICAgICAgY29tcGlsZUFuZGJpbmRBbGxBcmdzKCk7CisgICAgICAgIH0KKyAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgY29tcGlsZVNxbCgpIHsKICAgICAgICAgLy8gb25seSBjYWNoZSBDUlVEIHN0YXRlbWVudHMKLSAgICAgICAgU3RyaW5nIHByZWZpeFNxbCA9IG1TcWwuc3Vic3RyaW5nKDAsIDYpOwotICAgICAgICBpZiAoIXByZWZpeFNxbC5lcXVhbHNJZ25vcmVDYXNlKCJJTlNFUlQiKSAmJiAhcHJlZml4U3FsLmVxdWFsc0lnbm9yZUNhc2UoIlVQREFURSIpICYmCi0gICAgICAgICAgICAgICAgIXByZWZpeFNxbC5lcXVhbHNJZ25vcmVDYXNlKCJSRVBMQUMiKSAmJgotICAgICAgICAgICAgICAgICFwcmVmaXhTcWwuZXF1YWxzSWdub3JlQ2FzZSgiREVMRVRFIikgJiYgIXByZWZpeFNxbC5lcXVhbHNJZ25vcmVDYXNlKCJTRUxFQ1QiKSkgewotICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbmV3IFNRTGl0ZUNvbXBpbGVkU3FsKGRiLCBzcWwpOworICAgICAgICBpZiAoKG1TdGF0ZW1lbnRUeXBlICYgU1RBVEVNRU5UX0NBQ0hFQUJMRSkgPT0gMCkgeworICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbmV3IFNRTGl0ZUNvbXBpbGVkU3FsKG1EYXRhYmFzZSwgbVNxbCk7CiAgICAgICAgICAgICBuU3RhdGVtZW50ID0gbUNvbXBpbGVkU3FsLm5TdGF0ZW1lbnQ7CiAgICAgICAgICAgICAvLyBzaW5jZSBpdCBpcyBub3QgaW4gdGhlIGNhY2hlLCBubyBuZWVkIHRvIGFjcXVpcmUoKSBpdC4KICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIC8vIGl0IGlzIG5vdCBwcmFnbWEKLSAgICAgICAgbUNvbXBpbGVkU3FsID0gZGIuZ2V0Q29tcGlsZWRTdGF0ZW1lbnRGb3JTcWwoc3FsKTsKKyAgICAgICAgbUNvbXBpbGVkU3FsID0gbURhdGFiYXNlLmdldENvbXBpbGVkU3RhdGVtZW50Rm9yU3FsKG1TcWwpOwogICAgICAgICBpZiAobUNvbXBpbGVkU3FsID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBjb21waWxlZC1zcWwgb2JqCi0gICAgICAgICAgICBtQ29tcGlsZWRTcWwgPSBuZXcgU1FMaXRlQ29tcGlsZWRTcWwoZGIsIHNxbCk7CisgICAgICAgICAgICBtQ29tcGlsZWRTcWwgPSBuZXcgU1FMaXRlQ29tcGlsZWRTcWwobURhdGFiYXNlLCBtU3FsKTsKIAogICAgICAgICAgICAgLy8gYWRkIGl0IHRvIHRoZSBjYWNoZSBvZiBjb21waWxlZC1zcWxzCiAgICAgICAgICAgICAvLyBidXQgYmVmb3JlIGFkZGluZyBpdCBhbmQgdGh1cyBtYWtpbmcgaXQgYXZhaWxhYmxlIGZvciBhbnlvbmUgZWxzZSB0byB1c2UgaXQsCiAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgaXQgaXMgYWNxdWlyZWQgYnkgbWUuCiAgICAgICAgICAgICBtQ29tcGlsZWRTcWwuYWNxdWlyZSgpOwotICAgICAgICAgICAgZGIuYWRkVG9Db21waWxlZFF1ZXJpZXMoc3FsLCBtQ29tcGlsZWRTcWwpOwotICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX0FDVElWRV9DVVJTT1JfRklOQUxJWkFUSU9OKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiQ3JlYXRlZCBEYk9iaiAoaWQjIiArIG1Db21waWxlZFNxbC5uU3RhdGVtZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIpIGZvciBzcWw6ICIgKyBzcWwpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbURhdGFiYXNlLmFkZFRvQ29tcGlsZWRRdWVyaWVzKG1TcWwsIG1Db21waWxlZFNxbCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBpdCBpcyBhbHJlYWR5IGluIGNvbXBpbGVkLXNxbCBjYWNoZS4KICAgICAgICAgICAgIC8vIHRyeSB0byBhY3F1aXJlIHRoZSBvYmplY3QuCkBAIC0xMDAsMTMgKzE2MCw3IEBACiAgICAgICAgICAgICAgICAgLy8gd2UgY2FuJ3QgaGF2ZSB0d28gZGlmZmVyZW50IFNRTGl0ZVByb2dhbSBvYmplY3RzIGNhbid0IHNoYXJlIHRoZSBzYW1lCiAgICAgICAgICAgICAgICAgLy8gQ29tcGlsZWRTcWwgb2JqZWN0LiBjcmVhdGUgYSBuZXcgb25lLgogICAgICAgICAgICAgICAgIC8vIGZpbmFsaXplIGl0IHdoZW4gSSBhbSBkb25lIHdpdGggaXQgaW4gInRoaXMiIG9iamVjdC4KLSAgICAgICAgICAgICAgICBtQ29tcGlsZWRTcWwgPSBuZXcgU1FMaXRlQ29tcGlsZWRTcWwoZGIsIHNxbCk7Ci0gICAgICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX0FDVElWRV9DVVJTT1JfRklOQUxJWkFUSU9OKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIioqIHBvc3NpYmxlIGJ1ZyAqKiBDcmVhdGVkIE5FVyBEYk9iaiAoaWQjIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBpbGVkU3FsLm5TdGF0ZW1lbnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIGJlY2F1c2UgdGhlIHByZXZpb3VzbHkgY3JlYXRlZCBEYk9iaiAoaWQjIiArIGxhc3QgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIHdhcyBub3QgcmVsZWFzZWQgZm9yIHNxbDoiICsgc3FsKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbmV3IFNRTGl0ZUNvbXBpbGVkU3FsKG1EYXRhYmFzZSwgbVNxbCk7CiAgICAgICAgICAgICAgICAgLy8gc2luY2UgaXQgaXMgbm90IGluIHRoZSBjYWNoZSwgbm8gbmVlZCB0byBhY3F1aXJlKCkgaXQuCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTExNSw0MiArMTY5LDQ1IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZCgpIHsKLSAgICAgICAgcmVsZWFzZUNvbXBpbGVkU3FsSWZOb3RJbkNhY2hlKCk7Ci0gICAgICAgIG1EYXRhYmFzZS5yZWxlYXNlUmVmZXJlbmNlKCk7CisgICAgICAgIHJlbGVhc2UoKTsKICAgICAgICAgbURhdGFiYXNlLnJlbW92ZVNRTGl0ZUNsb3NhYmxlKHRoaXMpOworICAgICAgICBtRGF0YWJhc2UucmVsZWFzZVJlZmVyZW5jZSgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQWxsUmVmZXJlbmNlc1JlbGVhc2VkRnJvbUNvbnRhaW5lcigpIHsKLSAgICAgICAgcmVsZWFzZUNvbXBpbGVkU3FsSWZOb3RJbkNhY2hlKCk7CisgICAgICAgIHJlbGVhc2UoKTsKICAgICAgICAgbURhdGFiYXNlLnJlbGVhc2VSZWZlcmVuY2UoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgcmVsZWFzZUNvbXBpbGVkU3FsSWZOb3RJbkNhY2hlKCkgeworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCByZWxlYXNlKCkgewogICAgICAgICBpZiAobUNvbXBpbGVkU3FsID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQobURhdGFiYXNlLm1Db21waWxlZFF1ZXJpZXMpIHsKLSAgICAgICAgICAgIGlmICghbURhdGFiYXNlLm1Db21waWxlZFF1ZXJpZXMuY29udGFpbnNWYWx1ZShtQ29tcGlsZWRTcWwpKSB7Ci0gICAgICAgICAgICAgICAgLy8gaXQgaXMgTk9UIGluIGNvbXBpbGVkLXNxbCBjYWNoZS4gaS5lLiwgcmVzcG9uc2liaWxpdHkgb2YKLSAgICAgICAgICAgICAgICAvLyByZWxlYXNpbmcgdGhpcyBzdGF0ZW1lbnQgaXMgb24gbWUuCi0gICAgICAgICAgICAgICAgbUNvbXBpbGVkU3FsLnJlbGVhc2VTcWxTdGF0ZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBtQ29tcGlsZWRTcWwgPSBudWxsOwotICAgICAgICAgICAgICAgIG5TdGF0ZW1lbnQgPSAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBpdCBpcyBpbiBjb21waWxlZC1zcWwgY2FjaGUuIHJlc2V0IGl0cyBDb21waWxlZFNxbCNtSW5Vc2UgZmxhZwotICAgICAgICAgICAgICAgIG1Db21waWxlZFNxbC5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gCisgICAgICAgIG1EYXRhYmFzZS5yZWxlYXNlQ29tcGlsZWRTcWxPYmoobUNvbXBpbGVkU3FsKTsKKyAgICAgICAgbUNvbXBpbGVkU3FsID0gbnVsbDsKKyAgICAgICAgblN0YXRlbWVudCA9IDA7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHByb2dyYW0uCiAgICAgICoKICAgICAgKiBAcmV0dXJuIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcHJvZ3JhbQorICAgICAqIEBkZXByZWNhdGVkIGRvIG5vdCB1c2UgdGhpcyBtZXRob2QuIGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHRoZSBzYW1lIGFjcm9zcyBleGVjdXRpb25zIG9mCisgICAgICogdGhlIFNRTCBzdGF0ZW1lbnQgY29udGFpbmVkIGluIHRoaXMgb2JqZWN0LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGZpbmFsIGludCBnZXRVbmlxdWVJZCgpIHsKLSAgICAgICAgcmV0dXJuIG5TdGF0ZW1lbnQ7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogdXNlZCBvbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBpbnQgZ2V0U3FsU3RhdGVtZW50SWQoKSB7CisgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICByZXR1cm4gKG1Db21waWxlZFNxbCA9PSBudWxsKSA/IDAgOiBuU3RhdGVtZW50OworICAgICAgfQogICAgIH0KIAogICAgIC8qIHBhY2thZ2UgKi8gU3RyaW5nIGdldFNxbFN0cmluZygpIHsKQEAgLTE2OSw2ICsyMjYsMzcgQEAKICAgICAgICAgLy8gVE9ETyBpcyB0aGVyZSBhIG5lZWQgZm9yIHRoaXM/CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGJpbmQoaW50IHR5cGUsIGludCBpbmRleCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIG1EYXRhYmFzZS52ZXJpZnlEYklzT3BlbigpOworICAgICAgICBhZGRUb0JpbmRBcmdzKGluZGV4LCAodHlwZSA9PSBDdXJzb3IuRklFTERfVFlQRV9OVUxMKSA/IG51bGwgOiB2YWx1ZSk7CisgICAgICAgIGlmIChuU3RhdGVtZW50ID4gMCkgeworICAgICAgICAgICAgLy8gYmluZCBvbmx5IGlmIHRoZSBTUUwgc3RhdGVtZW50IGlzIGNvbXBpbGVkCisgICAgICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX05VTEw6CisgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9udWxsKGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX0JMT0I6CisgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9ibG9iKGluZGV4LCAoYnl0ZVtdKSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2RvdWJsZShpbmRleCwgKERvdWJsZSkgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3Vyc29yLkZJRUxEX1RZUEVfSU5URUdFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2xvbmcoaW5kZXgsIChMb25nKSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9TVFJJTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9zdHJpbmcoaW5kZXgsIChTdHJpbmcpIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQmluZCBhIE5VTEwgdmFsdWUgdG8gdGhpcyBzdGF0ZW1lbnQuIFRoZSB2YWx1ZSByZW1haW5zIGJvdW5kIHVudGlsCiAgICAgICoge0BsaW5rICNjbGVhckJpbmRpbmdzfSBpcyBjYWxsZWQuCkBAIC0xNzYsMzQgKzI2NCwxOCBAQAogICAgICAqIEBwYXJhbSBpbmRleCBUaGUgMS1iYXNlZCBpbmRleCB0byB0aGUgcGFyYW1ldGVyIHRvIGJpbmQgbnVsbCB0bwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGJpbmROdWxsKGludCBpbmRleCkgewotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2JpbmRfbnVsbChpbmRleCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgYmluZChDdXJzb3IuRklFTERfVFlQRV9OVUxMLCBpbmRleCwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQmluZCBhIGxvbmcgdmFsdWUgdG8gdGhpcyBzdGF0ZW1lbnQuIFRoZSB2YWx1ZSByZW1haW5zIGJvdW5kIHVudGlsCiAgICAgICoge0BsaW5rICNjbGVhckJpbmRpbmdzfSBpcyBjYWxsZWQuCi0gICAgICoKKyAgICAgKmFkZFRvQmluZEFyZ3MKICAgICAgKiBAcGFyYW0gaW5kZXggVGhlIDEtYmFzZWQgaW5kZXggdG8gdGhlIHBhcmFtZXRlciB0byBiaW5kCiAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBiaW5kCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYmluZExvbmcoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfYmluZF9sb25nKGluZGV4LCB2YWx1ZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgYmluZChDdXJzb3IuRklFTERfVFlQRV9JTlRFR0VSLCBpbmRleCwgdmFsdWUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjE0LDE1ICsyODYsNyBAQAogICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmluZAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGJpbmREb3VibGUoaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2RvdWJsZShpbmRleCwgdmFsdWUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9CisgICAgICAgIGJpbmQoQ3Vyc29yLkZJRUxEX1RZUEVfRkxPQVQsIGluZGV4LCB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMzYsMTUgKzMwMCw3IEBACiAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aGUgYmluZCB2YWx1ZSBhdCBpbmRleCAiICsgaW5kZXggKyAiIGlzIG51bGwiKTsKICAgICAgICAgfQotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2JpbmRfc3RyaW5nKGluZGV4LCB2YWx1ZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgYmluZChDdXJzb3IuRklFTERfVFlQRV9TVFJJTkcsIGluZGV4LCB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNTgsMjQgKzMxNCwxOCBAQAogICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGhlIGJpbmQgdmFsdWUgYXQgaW5kZXggIiArIGluZGV4ICsgIiBpcyBudWxsIik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2Jsb2IoaW5kZXgsIHZhbHVlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfQorICAgICAgICBiaW5kKEN1cnNvci5GSUVMRF9UWVBFX0JMT0IsIGluZGV4LCB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQ2xlYXJzIGFsbCBleGlzdGluZyBiaW5kaW5ncy4gVW5zZXQgYmluZGluZ3MgYXJlIHRyZWF0ZWQgYXMgTlVMTC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhckJpbmRpbmdzKCkgewotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7CisgICAgICAgIG1CaW5kQXJncyA9IG51bGw7CisgICAgICAgIGlmICh0aGlzLm5TdGF0ZW1lbnQgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZS52ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBuYXRpdmVfY2xlYXJfYmluZGluZ3MoKTsKQEAgLTI4OCwxNSArMzM4LDc5IEBACiAgICAgICogUmVsZWFzZSB0aGlzIHByb2dyYW0ncyByZXNvdXJjZXMsIG1ha2luZyBpdCBpbnZhbGlkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgeworICAgICAgICBtQmluZEFyZ3MgPSBudWxsOworICAgICAgICBpZiAobkhhbmRsZSA9PSAwIHx8ICFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOworICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZFRvQmluZEFyZ3MoaW50IGluZGV4LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKG1CaW5kQXJncyA9PSBudWxsKSB7CisgICAgICAgICAgICBtQmluZEFyZ3MgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBPYmplY3Q+KCk7CiAgICAgICAgIH0KKyAgICAgICAgbUJpbmRBcmdzLnB1dChpbmRleCwgdmFsdWUpOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBjb21waWxlQW5kYmluZEFsbEFyZ3MoKSB7CisgICAgICAgIGlmICgobVN0YXRlbWVudFR5cGUgJiBTVEFURU1FTlRfRE9OVF9QUkVQQVJFKSA+IDApIHsKKyAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gcHJlcGFyZSB0aGlzIFNRTCBzdGF0ZW1lbnQKKyAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfU1RBVEVNRU5UUykgeworICAgICAgICAgICAgICAgIGlmIChtQmluZEFyZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJubyBuZWVkIHRvIHBhc3MgYmluZGFyZ3MgZm9yIHRoaXMgc3FsIDoiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3FsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5TdGF0ZW1lbnQgPT0gMCkgeworICAgICAgICAgICAgLy8gU1FMIHN0YXRlbWVudCBpcyBub3QgY29tcGlsZWQgeWV0LiBjb21waWxlIGl0IG5vdy4KKyAgICAgICAgICAgIGNvbXBpbGVTcWwoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUJpbmRBcmdzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpbmRleCA6IG1CaW5kQXJncy5rZXlTZXQoKSkgeworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbUJpbmRBcmdzLmdldChpbmRleCk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX251bGwoaW5kZXgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERvdWJsZSB8fCB2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0KSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfZG91YmxlKGluZGV4LCAoKE51bWJlcikgdmFsdWUpLmRvdWJsZVZhbHVlKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgeworICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2xvbmcoaW5kZXgsICgoTnVtYmVyKSB2YWx1ZSkubG9uZ1ZhbHVlKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKyAgICAgICAgICAgICAgICBCb29sZWFuIGJvb2wgPSAoQm9vbGVhbil2YWx1ZTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9sb25nKGluZGV4LCAoYm9vbCkgPyAxIDogMCk7CisgICAgICAgICAgICAgICAgaWYgKGJvb2wpIHsKKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfbG9uZyhpbmRleCwgMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfbG9uZyhpbmRleCwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGJ5dGVbXSl7CisgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfYmxvYihpbmRleCwgKGJ5dGVbXSkgdmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9zdHJpbmcoaW5kZXgsIHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYW4gYXJyYXkgb2YgU3RyaW5nIGJpbmRBcmdzLCB0aGlzIG1ldGhvZCBiaW5kcyBhbGwgb2YgdGhlbSBpbiBvbmUgc2luZ2xlIGNhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmluZEFyZ3MgdGhlIFN0cmluZyBhcnJheSBvZiBiaW5kIGFyZ3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmluZEFsbEFyZ3NBc1N0cmluZ3MoU3RyaW5nW10gYmluZEFyZ3MpIHsKKyAgICAgICAgaWYgKGJpbmRBcmdzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2l6ZSA9IGJpbmRBcmdzLmxlbmd0aDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGJpbmRTdHJpbmcoaSArIDEsIGJpbmRBcmdzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIGZpbmFsIHZvaWQgc2V0TmF0aXZlSGFuZGxlKGludCBuSGFuZGxlKSB7CisgICAgICAgIHRoaXMubkhhbmRsZSA9IG5IYW5kbGU7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUXVlcnkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVRdWVyeS5qYXZhCmluZGV4IDkwNWI2NmIuLmU5ZTAxNzIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVRdWVyeS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVRdWVyeS5qYXZhCkBAIC0yOCwyOCArMjgsMzggQEAKICAqIHRocmVhZHMgc2hvdWxkIHBlcmZvcm0gaXRzIG93biBzeW5jaHJvbml6YXRpb24gd2hlbiB1c2luZyB0aGUgU1FMaXRlUXVlcnkuCiAgKi8KIHB1YmxpYyBjbGFzcyBTUUxpdGVRdWVyeSBleHRlbmRzIFNRTGl0ZVByb2dyYW0gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ3Vyc29yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNRTGl0ZVF1ZXJ5IjsKIAogICAgIC8qKiBUaGUgaW5kZXggb2YgdGhlIHVuYm91bmQgT0ZGU0VUIHBhcmFtZXRlciAqLwotICAgIHByaXZhdGUgaW50IG1PZmZzZXRJbmRleDsKLSAgICAKLSAgICAvKiogQXJncyB0byBiaW5kIG9uIHJlcXVlcnkgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIG1CaW5kQXJnczsKKyAgICBwcml2YXRlIGludCBtT2Zmc2V0SW5kZXggPSAwOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1DbG9zZWQgPSBmYWxzZTsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIHBlcnNpc3RlbnQgcXVlcnkgb2JqZWN0LgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGRiIFRoZSBkYXRhYmFzZSB0aGF0IHRoaXMgcXVlcnkgb2JqZWN0IGlzIGFzc29jaWF0ZWQgd2l0aAogICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgU1FMIHN0cmluZyBmb3IgdGhpcyBxdWVyeS4gCiAgICAgICogQHBhcmFtIG9mZnNldEluZGV4IFRoZSAxLWJhc2VkIGluZGV4IHRvIHRoZSBPRkZTRVQgcGFyYW1ldGVyLCAKICAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIFNRTGl0ZVF1ZXJ5KFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgcXVlcnksIGludCBvZmZzZXRJbmRleCwgU3RyaW5nW10gYmluZEFyZ3MpIHsKICAgICAgICAgc3VwZXIoZGIsIHF1ZXJ5KTsKLQogICAgICAgICBtT2Zmc2V0SW5kZXggPSBvZmZzZXRJbmRleDsKLSAgICAgICAgbUJpbmRBcmdzID0gYmluZEFyZ3M7CisgICAgICAgIGJpbmRBbGxBcmdzQXNTdHJpbmdzKGJpbmRBcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2UgdG8gcmVwbGFjZSBhIGdpdmVuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIHdoZW4gdGhlIGN1cnJlbnQgUXVlcnkgb2JqZWN0IGlzIG5vdyBhc3NvY2lhdGVkIHdpdGggYSBkaWZmZXJlbnQKKyAgICAgKiB7QGxpbmsgU1FMaXRlRGF0YWJhc2V9IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYiBUaGUgZGF0YWJhc2UgdGhhdCB0aGlzIHF1ZXJ5IG9iamVjdCBpcyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiBAcGFyYW0gcXVlcnkgdGhlIGluc3RhbmNlIG9mIHtAbGluayBTUUxpdGVRdWVyeX0gdG8gYmUgcmVwbGFjZWQKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZVF1ZXJ5KFNRTGl0ZURhdGFiYXNlIGRiLCBTUUxpdGVRdWVyeSBxdWVyeSkgeworICAgICAgICBzdXBlcihkYiwgcXVlcnkubVNxbCk7CisgICAgICAgIHRoaXMubUJpbmRBcmdzID0gcXVlcnkubUJpbmRBcmdzOworICAgICAgICB0aGlzLm1PZmZzZXRJbmRleCA9IHF1ZXJ5Lm1PZmZzZXRJbmRleDsKICAgICB9CiAKICAgICAvKioKQEAgLTcwLDEzICs4MCw4IEBACiAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHN0YXJ0IHBvcyBpcyBub3QgZXF1YWwgdG8gMCwgdGhlbiBtb3N0IGxpa2VseSB3aW5kb3cgaXMKICAgICAgICAgICAgICAgICAvLyB0b28gc21hbGwgZm9yIHRoZSBkYXRhIHNldCwgbG9hZGluZyBieSBhbm90aGVyIHRocmVhZAogICAgICAgICAgICAgICAgIC8vIGlzIG5vdCBzYWZlIGluIHRoaXMgc2l0dWF0aW9uLiB0aGUgbmF0aXZlIGNvZGUgd2lsbCBpZ25vcmUgbWF4UmVhZAotICAgICAgICAgICAgICAgIGludCBudW1Sb3dzID0gbmF0aXZlX2ZpbGxfd2luZG93KHdpbmRvdywgd2luZG93LmdldFN0YXJ0UG9zaXRpb24oKSwgbU9mZnNldEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmVhZCwgbGFzdFBvcyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBMb2dnaW5nCi0gICAgICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9TVEFURU1FTlRTKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZpbGxXaW5kb3coKTogIiArIG1TcWwpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbnVtUm93cyA9IG5hdGl2ZV9maWxsX3dpbmRvdyh3aW5kb3csIHdpbmRvdy5nZXRTdGFydFBvc2l0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICBtT2Zmc2V0SW5kZXgsIG1heFJlYWQsIGxhc3RQb3MpOwogICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5sb2dUaW1lU3RhdChtU3FsLCB0aW1lU3RhcnQpOwogICAgICAgICAgICAgICAgIHJldHVybiBudW1Sb3dzOwogICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpewpAQCAtODUsNiArOTAsOSBAQAogICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRGF0YWJhc2VDb3JydXB0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICBtRGF0YWJhc2Uub25Db3JydXB0aW9uKCk7CiAgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkgKyAiOyBxdWVyeTogIiArIG1TcWwpOworICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIHdpbmRvdy5yZWxlYXNlUmVmZXJlbmNlKCk7CiAgICAgICAgICAgICB9CkBAIC0xNDEsNTEgKzE0OSwxMyBAQAogICAgICAqIENhbGxlZCBieSBTUUxpdGVDdXJzb3Igd2hlbiBpdCBpcyByZXF1ZXJpZWQuCiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyB2b2lkIHJlcXVlcnkoKSB7Ci0gICAgICAgIGlmIChtQmluZEFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IGxlbiA9IG1CaW5kQXJncy5sZW5ndGg7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXIuYmluZFN0cmluZyhpICsgMSwgbUJpbmRBcmdzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVNaXN1c2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgZXJyTXNnID0gbmV3IFN0cmluZ0J1aWxkZXIoIm1TcWwgIiArIG1TcWwpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyTXNnLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICBlcnJNc2cuYXBwZW5kKG1CaW5kQXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyck1zZy5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbGVha1Byb2dyYW0gPSBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyTXNnLnRvU3RyaW5nKCksIGUpOwotICAgICAgICAgICAgICAgIHRocm93IGxlYWtQcm9ncmFtOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKG1DbG9zZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInJlcXVlcnlpbmcgYSBjbG9zZWQgY3Vyc29yIik7CiAgICAgICAgIH0KKyAgICAgICAgY29tcGlsZUFuZGJpbmRBbGxBcmdzKCk7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYmluZE51bGwoaW50IGluZGV4KSB7Ci0gICAgICAgIG1CaW5kQXJnc1tpbmRleCAtIDFdID0gbnVsbDsKLSAgICAgICAgaWYgKCFtQ2xvc2VkKSBzdXBlci5iaW5kTnVsbChpbmRleCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYmluZExvbmcoaW50IGluZGV4LCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIG1CaW5kQXJnc1tpbmRleCAtIDFdID0gTG9uZy50b1N0cmluZyh2YWx1ZSk7Ci0gICAgICAgIGlmICghbUNsb3NlZCkgc3VwZXIuYmluZExvbmcoaW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBiaW5kRG91YmxlKGludCBpbmRleCwgZG91YmxlIHZhbHVlKSB7Ci0gICAgICAgIG1CaW5kQXJnc1tpbmRleCAtIDFdID0gRG91YmxlLnRvU3RyaW5nKHZhbHVlKTsKLSAgICAgICAgaWYgKCFtQ2xvc2VkKSBzdXBlci5iaW5kRG91YmxlKGluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYmluZFN0cmluZyhpbnQgaW5kZXgsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBtQmluZEFyZ3NbaW5kZXggLSAxXSA9IHZhbHVlOwotICAgICAgICBpZiAoIW1DbG9zZWQpIHN1cGVyLmJpbmRTdHJpbmcoaW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlX2ZpbGxfd2luZG93KEN1cnNvcldpbmRvdyB3aW5kb3csIAorICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIGludCBuYXRpdmVfZmlsbF93aW5kb3coQ3Vyc29yV2luZG93IHdpbmRvdywKICAgICAgICAgICAgIGludCBzdGFydFBvcywgaW50IG9mZnNldFBhcmFtLCBpbnQgbWF4UmVhZCwgaW50IGxhc3RQb3MpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgaW50IG5hdGl2ZV9jb2x1bW5fY291bnQoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNjMzYzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitwdWJsaWMgY2xhc3MgU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbiBleHRlbmRzIFNRTGl0ZUV4Y2VwdGlvbiB7CisgICAgcHVibGljIFNRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlU3RhdGVtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlU3RhdGVtZW50LmphdmEKaW5kZXggOWU0MjVjMy4uNWU5NjkyOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVTdGF0ZW1lbnQuamF2YQpAQCAtMTYsNyArMTYsMTIgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKIAoraW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlsczsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIGltcG9ydCBkYWx2aWsuc3lzdGVtLkJsb2NrR3VhcmQ7CiAKQEAgLTI1LDQ0ICszMCw3MCBAQAogICogVGhlIHN0YXRlbWVudCBjYW5ub3QgcmV0dXJuIG11bHRpcGxlIHJvd3MsIGJ1dCAxeDEgcmVzdWx0IHNldHMgYXJlIGFsbG93ZWQuCiAgKiBEb24ndCB1c2UgU1FMaXRlU3RhdGVtZW50IGNvbnN0cnVjdG9yIGRpcmVjdGx5LCBwbGVhc2UgdXNlCiAgKiB7QGxpbmsgU1FMaXRlRGF0YWJhc2UjY29tcGlsZVN0YXRlbWVudChTdHJpbmcpfQotICoKLSAqIFNRTGl0ZVN0YXRlbWVudCBpcyBub3QgaW50ZXJuYWxseSBzeW5jaHJvbml6ZWQgc28gY29kZSB1c2luZyBhIFNRTGl0ZVN0YXRlbWVudCBmcm9tIG11bHRpcGxlCisgKjxwPgorICogU1FMaXRlU3RhdGVtZW50IGlzIE5PVCBpbnRlcm5hbGx5IHN5bmNocm9uaXplZCBzbyBjb2RlIHVzaW5nIGEgU1FMaXRlU3RhdGVtZW50IGZyb20gbXVsdGlwbGUKICAqIHRocmVhZHMgc2hvdWxkIHBlcmZvcm0gaXRzIG93biBzeW5jaHJvbml6YXRpb24gd2hlbiB1c2luZyB0aGUgU1FMaXRlU3RhdGVtZW50LgogICovCitAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogcHVibGljIGNsYXNzIFNRTGl0ZVN0YXRlbWVudCBleHRlbmRzIFNRTGl0ZVByb2dyYW0KIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNRTGl0ZVN0YXRlbWVudCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFQUQgPSB0cnVlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gV1JJVEUgPSBmYWxzZTsKKworICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgbU9yaWdEYjsKKyAgICBwcml2YXRlIGludCBtU3RhdGU7CisgICAgLyoqIHBvc3NpYmxlIHZhbHVlIGZvciB7QGxpbmsgI21TdGF0ZX0uIGluZGljYXRlcyB0aGF0IGEgdHJhbnNhY3Rpb24gaXMgc3RhcnRlZC4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNfU1RBUlRFRCA9IDE7CisgICAgLyoqIHBvc3NpYmxlIHZhbHVlIGZvciB7QGxpbmsgI21TdGF0ZX0uIGluZGljYXRlcyB0aGF0IGEgbG9jayBpcyBhY3F1aXJlZC4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DS19BQ1FVSVJFRCA9IDI7CisKICAgICAvKioKICAgICAgKiBEb24ndCB1c2UgU1FMaXRlU3RhdGVtZW50IGNvbnN0cnVjdG9yIGRpcmVjdGx5LCBwbGVhc2UgdXNlCiAgICAgICoge0BsaW5rIFNRTGl0ZURhdGFiYXNlI2NvbXBpbGVTdGF0ZW1lbnQoU3RyaW5nKX0KICAgICAgKiBAcGFyYW0gZGIKICAgICAgKiBAcGFyYW0gc3FsCiAgICAgICovCi0gICAgLyogcGFja2FnZSAqLyBTUUxpdGVTdGF0ZW1lbnQoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwpIHsKLSAgICAgICAgc3VwZXIoZGIsIHNxbCk7CisgICAgLyogcGFja2FnZSAqLyBTUUxpdGVTdGF0ZW1lbnQoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwsIE9iamVjdFtdIGJpbmRBcmdzKSB7CisgICAgICAgIHN1cGVyKGRiLCBzcWwsIGJpbmRBcmdzLCBmYWxzZSAvKiBkb24ndCBjb21waWxlIHNxbCBzdGF0ZW1lbnQgKi8pOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEV4ZWN1dGUgdGhpcyBTUUwgc3RhdGVtZW50LCBpZiBpdCBpcyBub3QgYSBxdWVyeS4gRm9yIGV4YW1wbGUsCi0gICAgICogQ1JFQVRFIFRBQkxFLCBERUxURSwgSU5TRVJULCBldGMuCisgICAgICogRXhlY3V0ZSB0aGlzIFNRTCBzdGF0ZW1lbnQsIGlmIGl0IGlzIG5vdCBhIFNFTEVDVCAvIElOU0VSVCAvIERFTEVURSAvIFVQREFURSwgZm9yIGV4YW1wbGUKKyAgICAgKiBDUkVBVEUgLyBEUk9QIHRhYmxlLCB2aWV3LCB0cmlnZ2VyLCBpbmRleCBldGMuCiAgICAgICoKICAgICAgKiBAdGhyb3dzIGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uIElmIHRoZSBTUUwgc3RyaW5nIGlzIGludmFsaWQgZm9yCiAgICAgICogICAgICAgICBzb21lIHJlYXNvbgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKKyAgICAgICAgZXhlY3V0ZVVwZGF0ZURlbGV0ZSgpOworICAgIH0KIAotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7CisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGlzIFNRTCBzdGF0ZW1lbnQsIGlmIHRoZSB0aGUgbnVtYmVyIG9mIHJvd3MgYWZmZWN0ZWQgYnkgZXhlY3V0aW9uIG9mIHRoaXMgU1FMCisgICAgICogc3RhdGVtZW50IGlzIG9mIGFueSBpbXBvcnRhbmNlIHRvIHRoZSBjYWxsZXIgLSBmb3IgZXhhbXBsZSwgVVBEQVRFIC8gREVMRVRFIFNRTCBzdGF0ZW1lbnRzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MgYWZmZWN0ZWQgYnkgdGhpcyBTUUwgc3RhdGVtZW50IGV4ZWN1dGlvbi4KKyAgICAgKiBAdGhyb3dzIGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uIElmIHRoZSBTUUwgc3RyaW5nIGlzIGludmFsaWQgZm9yCisgICAgICogICAgICAgICBzb21lIHJlYXNvbgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZXhlY3V0ZVVwZGF0ZURlbGV0ZSgpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdGl2ZV9leGVjdXRlKCk7CisgICAgICAgICAgICBsb25nIHRpbWVTdGFydCA9IGFjcXVpcmVBbmRMb2NrKFdSSVRFKTsKKyAgICAgICAgICAgIGludCBudW1DaGFuZ2VzID0gMDsKKyAgICAgICAgICAgIGlmICgobVN0YXRlbWVudFR5cGUgJiBTVEFURU1FTlRfRE9OVF9QUkVQQVJFKSA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgc3RhdGVtZW50IGRvZXNuJ3QgaGF2ZSB0byBiZSBwcmVwYXJlZCwKKyAgICAgICAgICAgICAgICAvLyBjYWxsIHRoZSBmb2xsb3dpbmcgbmF0aXZlIG1ldGhvZCB3aGljaCB3aWxsIG5vdCBwcmVwYXJlCisgICAgICAgICAgICAgICAgLy8gdGhlIHF1ZXJ5IHBsYW4KKyAgICAgICAgICAgICAgICBuYXRpdmVfZXhlY3V0ZVNxbChtU3FsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbnVtQ2hhbmdlcyA9IG5hdGl2ZV9leGVjdXRlKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKKyAgICAgICAgICAgIHJldHVybiBudW1DaGFuZ2VzOwogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOworICAgICAgICAgICAgcmVsZWFzZUFuZFVubG9jaygpOwogICAgICAgICB9CiAgICAgfQogCkBAIC03NiwyMSArMTA3LDEzIEBACiAgICAgICogICAgICAgICBzb21lIHJlYXNvbgogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGV4ZWN1dGVJbnNlcnQoKSB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLQotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfZXhlY3V0ZSgpOworICAgICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBhY3F1aXJlQW5kTG9jayhXUklURSk7CisgICAgICAgICAgICBsb25nIGxhc3RJbnNlcnRlZFJvd0lkID0gbmF0aXZlX2V4ZWN1dGVJbnNlcnQoKTsKICAgICAgICAgICAgIG1EYXRhYmFzZS5sb2dUaW1lU3RhdChtU3FsLCB0aW1lU3RhcnQpOwotICAgICAgICAgICAgcmV0dXJuIChtRGF0YWJhc2UubGFzdENoYW5nZUNvdW50KCkgPiAwKSA/IG1EYXRhYmFzZS5sYXN0SW5zZXJ0Um93KCkgOiAtMTsKKyAgICAgICAgICAgIHJldHVybiBsYXN0SW5zZXJ0ZWRSb3dJZDsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKKyAgICAgICAgICAgIHJlbGVhc2VBbmRVbmxvY2soKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTAzLDIxICsxMjYsMTMgQEAKICAgICAgKiBAdGhyb3dzIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURvbmVFeGNlcHRpb24gaWYgdGhlIHF1ZXJ5IHJldHVybnMgemVybyByb3dzCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgc2ltcGxlUXVlcnlGb3JMb25nKCkgewotICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uUmVhZEZyb21EaXNrKCk7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICBsb25nIHRpbWVTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotCi0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gYWNxdWlyZUFuZExvY2soUkVBRCk7CiAgICAgICAgICAgICBsb25nIHJldFZhbHVlID0gbmF0aXZlXzF4MV9sb25nKCk7CiAgICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKICAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKKyAgICAgICAgICAgIHJlbGVhc2VBbmRVbmxvY2soKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTMwLDI1ICsxNDUsMTM2IEBACiAgICAgICogQHRocm93cyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEb25lRXhjZXB0aW9uIGlmIHRoZSBxdWVyeSByZXR1cm5zIHplcm8gcm93cwogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgc2ltcGxlUXVlcnlGb3JTdHJpbmcoKSB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25SZWFkRnJvbURpc2soKTsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7Ci0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwogICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBhY3F1aXJlQW5kTG9jayhSRUFEKTsKICAgICAgICAgICAgIFN0cmluZyByZXRWYWx1ZSA9IG5hdGl2ZV8xeDFfc3RyaW5nKCk7CiAgICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKICAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKKyAgICAgICAgICAgIHJlbGVhc2VBbmRVbmxvY2soKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX2V4ZWN1dGUoKTsKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyBhIHN0YXRlbWVudCB0aGF0IHJldHVybnMgYSAxIGJ5IDEgdGFibGUgd2l0aCBhIGJsb2IgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgcmVhZC1vbmx5IGZpbGUgZGVzY3JpcHRvciBmb3IgYSBjb3B5IG9mIHRoZSBibG9iIHZhbHVlLCBvciB7QGNvZGUgbnVsbH0KKyAgICAgKiAgICAgICAgIGlmIHRoZSB2YWx1ZSBpcyBudWxsIG9yIGNvdWxkIG5vdCBiZSByZWFkIGZvciBzb21lIHJlYXNvbi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRG9uZUV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgcmV0dXJucyB6ZXJvIHJvd3MKKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyY2VsRmlsZURlc2NyaXB0b3Igc2ltcGxlUXVlcnlGb3JCbG9iRmlsZURlc2NyaXB0b3IoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb25nIHRpbWVTdGFydCA9IGFjcXVpcmVBbmRMb2NrKFJFQUQpOworICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcmV0VmFsdWUgPSBuYXRpdmVfMXgxX2Jsb2JfYXNobWVtKCk7CisgICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKKyAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgInNpbXBsZVF1ZXJ5Rm9yQmxvYkZpbGVEZXNjcmlwdG9yKCkgZmFpbGVkIiwgZXgpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZWxlYXNlQW5kVW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYmVmb3JlIGV2ZXJ5IG1ldGhvZCBpbiB0aGlzIGNsYXNzIGJlZm9yZSBleGVjdXRpbmcgYSBTUUwgc3RhdGVtZW50LAorICAgICAqIHRoaXMgbWV0aG9kIGRvZXMgdGhlIGZvbGxvd2luZzoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+bWFrZSBzdXJlIHRoZSBkYXRhYmFzZSBpcyBvcGVuPC9saT4KKyAgICAgKiAgIDxsaT5nZXQgYSBkYXRhYmFzZSBjb25uZWN0aW9uIGZyb20gdGhlIGNvbm5lY3Rpb24gcG9vbCxpZiBwb3NzaWJsZTwvbGk+CisgICAgICogICA8bGk+bm90aWZpZXMge0BsaW5rIEJsb2NrR3VhcmR9IG9mIHJlYWQvd3JpdGU8L2xpPgorICAgICAqICAgPGxpPmlmIHRoZSBTUUwgc3RhdGVtZW50IGlzIGFuIHVwZGF0ZSwgc3RhcnQgdHJhbnNhY3Rpb24gaWYgbm90IGFscmVhZHkgaW4gb25lLgorICAgICAqICAgb3RoZXJ3aXNlLCBnZXQgbG9jayBvbiB0aGUgZGF0YWJhc2U8L2xpPgorICAgICAqICAgPGxpPmFjcXVpcmUgcmVmZXJlbmNlIG9uIHRoaXMgb2JqZWN0PC9saT4KKyAgICAgKiAgIDxsaT5hbmQgdGhlbiByZXR1cm4gdGhlIGN1cnJlbnQgdGltZSBfYmVmb3JlXyB0aGUgZGF0YWJhc2UgbG9jayB3YXMgYWNxdWlyZWQ8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgcmVtb3ZlcyB0aGUgZHVwbGljYXRlIGNvZGUgZnJvbSB0aGUgb3RoZXIgcHVibGljCisgICAgICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBhY3F1aXJlQW5kTG9jayhib29sZWFuIHJ3RmxhZykgeworICAgICAgICBtU3RhdGUgPSAwOworICAgICAgICAvLyB1c2UgcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlcyBmb3IgU0VMRUNUIFNRTCBzdGF0ZW1lbnRzCisgICAgICAgIG1EYXRhYmFzZS52ZXJpZnlEYklzT3BlbigpOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9ICgobVN0YXRlbWVudFR5cGUgJiBTUUxpdGVQcm9ncmFtLlNUQVRFTUVOVF9VU0VfUE9PTEVEX0NPTk4pID4gMCkKKyAgICAgICAgICAgICAgICA/IG1EYXRhYmFzZS5nZXREYkNvbm5lY3Rpb24obVNxbCkgOiBtRGF0YWJhc2U7CisgICAgICAgIC8vIHVzZSB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBvYnRhaW5lZCBhYm92ZQorICAgICAgICBtT3JpZ0RiID0gbURhdGFiYXNlOworICAgICAgICBtRGF0YWJhc2UgPSBkYjsKKyAgICAgICAgc2V0TmF0aXZlSGFuZGxlKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlKTsKKyAgICAgICAgaWYgKHJ3RmxhZyA9PSBXUklURSkgeworICAgICAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vbldyaXRlVG9EaXNrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uUmVhZEZyb21EaXNrKCk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBTcGVjaWFsIGNhc2UgaGFuZGxpbmcgb2YgU1FMaXRlRGF0YWJhc2UuZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKS4KKyAgICAgICAgICogd2Uga25vdyBpdCBpcyBleGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpIGZyb20gdGhlIGNhbGxlciBJRiB0aGVyZSBpcyBubyBsb2NrIGhlbGQuCisgICAgICAgICAqIGJlZ2luVHJhbnNhY3Rpb24oKSBtZXRob2RzIGluIFNRTGl0ZURhdGFiYXNlIGNhbGwgbG9ja0ZvcmNlZCgpIGJlZm9yZQorICAgICAgICAgKiBjYWxsaW5nIGV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIikuCisgICAgICAgICAqLworICAgICAgICBpZiAoKG1TdGF0ZW1lbnRUeXBlICYgU1FMaXRlUHJvZ3JhbS5TVEFURU1FTlRfVFlQRV9NQVNLKSA9PSBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9CRUdJTikgeworICAgICAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gdHJhbnNhY3Rpb24gaXMgIE5PVCBzdGFydGVkIGJ5IGNhbGxpbmcgYmVnaW5UcmFuc2FjdGlvbigpIG1ldGhvZHMgaW4KKyAgICAgICAgICAgICAgICAvLyBTUUxpdGVEYXRhYmFzZQorICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblVzaW5nRXhlY1NxbEZsYWcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgobVN0YXRlbWVudFR5cGUgJiBTUUxpdGVQcm9ncmFtLlNUQVRFTUVOVF9UWVBFX01BU0spID09CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5TVEFURU1FTlRfVVBEQVRFKSB7CisgICAgICAgICAgICAvLyBnb3QgdXBkYXRlIFNRTCBzdGF0ZW1lbnQuIGlmIHRoZXJlIGlzIE5PIHBlbmRpbmcgdHJhbnNhY3Rpb24sIHN0YXJ0IG9uZQorICAgICAgICAgICAgaWYgKCFtRGF0YWJhc2UuaW5UcmFuc2FjdGlvbigpKSB7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKTsKKyAgICAgICAgICAgICAgICBtU3RhdGUgPSBUUkFOU19TVEFSVEVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGRvIEkgaGF2ZSBkYXRhYmFzZSBsb2NrPyBpZiBub3QsIGdyYWIgaXQuCisgICAgICAgIGlmICghbURhdGFiYXNlLmlzRGJMb2NrZWRCeUN1cnJlbnRUaHJlYWQoKSkgeworICAgICAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IExPQ0tfQUNRVUlSRUQ7CisgICAgICAgIH0KKworICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7CisgICAgICAgIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCk7CisgICAgICAgIGNvbXBpbGVBbmRiaW5kQWxsQXJncygpOworICAgICAgICByZXR1cm4gc3RhcnRUaW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRoaXMgbWV0aG9kIHJlbGVhc2VzIGxvY2tzIGFuZCByZWZlcmVuY2VzIGFjcXVpcmVkIGluIHtAbGluayAjYWNxdWlyZUFuZExvY2soYm9vbGVhbil9CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VBbmRVbmxvY2soKSB7CisgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKKyAgICAgICAgaWYgKG1TdGF0ZSA9PSBUUkFOU19TVEFSVEVEKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlID09IExPQ0tfQUNRVUlSRUQpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKG1TdGF0ZW1lbnRUeXBlICYgU1FMaXRlUHJvZ3JhbS5TVEFURU1FTlRfVFlQRV9NQVNLKSA9PQorICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0NPTU1JVCB8fAorICAgICAgICAgICAgICAgIChtU3RhdGVtZW50VHlwZSAmIFNRTGl0ZVByb2dyYW0uU1RBVEVNRU5UX1RZUEVfTUFTSykgPT0KKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9BQk9SVCkgeworICAgICAgICAgICAgbURhdGFiYXNlLnJlc2V0VHJhbnNhY3Rpb25Vc2luZ0V4ZWNTcWxGbGFnKCk7CisgICAgICAgIH0KKyAgICAgICAgY2xlYXJCaW5kaW5ncygpOworICAgICAgICAvLyByZWxlYXNlIHRoZSBjb21waWxlZCBzcWwgc3RhdGVtZW50IHNvIHRoYXQgdGhlIGNhbGxlcidzIFNRTGl0ZVN0YXRlbWVudCBubyBsb25nZXIKKyAgICAgICAgLy8gaGFzIGEgaGFyZCByZWZlcmVuY2UgdG8gYSBkYXRhYmFzZSBvYmplY3QgdGhhdCBtYXkgZ2V0IGRlYWxsb2NhdGVkIGF0IGFueSBwb2ludC4KKyAgICAgICAgcmVsZWFzZSgpOworICAgICAgICAvLyByZXN0b3JlIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZSB0byB0aGUgb3JpZ2luYWwgdmFsdWUKKyAgICAgICAgbURhdGFiYXNlID0gbU9yaWdEYjsKKyAgICAgICAgc2V0TmF0aXZlSGFuZGxlKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlX2V4ZWN1dGUoKTsKKyAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBsb25nIG5hdGl2ZV9leGVjdXRlSW5zZXJ0KCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgbG9uZyBuYXRpdmVfMXgxX2xvbmcoKTsKICAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBTdHJpbmcgbmF0aXZlXzF4MV9zdHJpbmcoKTsKKyAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBQYXJjZWxGaWxlRGVzY3JpcHRvciBuYXRpdmVfMXgxX2Jsb2JfYXNobWVtKCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX2V4ZWN1dGVTcWwoU3RyaW5nIHNxbCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNzhkZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworcHVibGljIGNsYXNzIFNRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uKFN0cmluZyBlcnJvcikgeworICAgICAgICBzdXBlcihlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVVuZmluYWxpemVkT2JqZWN0c0V4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVVuZmluYWxpemVkT2JqZWN0c0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjk1ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlVW5maW5hbGl6ZWRPYmplY3RzRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKKy8qKgorICogVGhyb3duIGlmIHRoZSBkYXRhYmFzZSBjYW4ndCBiZSBjbG9zZWQgYmVjYXVzZSBvZiBzb21lIHVuLWNsb3NlZAorICogQ3Vyc29yIG9yIFNRTGl0ZVN0YXRlbWVudCBvYmplY3RzLiBDb3VsZCBoYXBwZW4gd2hlbiBhIHRocmVhZCBpcyB0cnlpbmcgdG8gY2xvc2UKKyAqIHRoZSBkYXRhYmFzZSB3aGlsZSBhbm90aGVyIHRocmVhZCBzdGlsbCBoYXNuJ3QgY2xvc2VkIGEgQ3Vyc29yIG9uIHRoYXQgZGF0YWJhc2UuCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgU1FMaXRlVW5maW5hbGl6ZWRPYmplY3RzRXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU1FMaXRlVW5maW5hbGl6ZWRPYmplY3RzRXhjZXB0aW9uKCkge30KKworICAgIHB1YmxpYyBTUUxpdGVVbmZpbmFsaXplZE9iamVjdHNFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9Vc2IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1VzYi5qYXZhCmluZGV4IDU3MjcxZDQuLmViYjgyOTYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1VzYi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1VzYi5qYXZhCkBAIC0xNyw2ICsxNywxMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmU7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKwogLyoqCiAgKiBDbGFzcyBmb3IgYWNjZXNzaW5nIFVTQiBzdGF0ZSBpbmZvcm1hdGlvbi4KICAqIEBoaWRlCkBAIC01NSw2ICs1OSwyNCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9VU0JfU1RBVEUgPQogICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYWN0aW9uLlVTQl9TVEFURSI7CiAKKyAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBBY3Rpb246ICBBIGJyb2FkY2FzdCBmb3IgVVNCIGNhbWVyYSBhdHRhY2hlZCBldmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgaW50ZW50IGlzIHNlbnQgd2hlbiBhIFVTQiBkZXZpY2Ugc3VwcG9ydGluZyBQVFAgaXMgYXR0YWNoZWQgdG8gdGhlIGhvc3QgVVNCIGJ1cy4KKyAgICAgKiBUaGUgaW50ZW50J3MgZGF0YSBjb250YWlucyBhIFVyaSBmb3IgdGhlIGRldmljZSBpbiB0aGUgTVRQIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9VU0JfQ0FNRVJBX0FUVEFDSEVEID0KKyAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmFjdGlvbi5VU0JfQ0FNRVJBX0FUVEFDSEVEIjsKKworICAgLyoqCisgICAgICogQnJvYWRjYXN0IEFjdGlvbjogIEEgYnJvYWRjYXN0IGZvciBVU0IgY2FtZXJhIGRldGFjaGVkIGV2ZW50LgorICAgICAqCisgICAgICogVGhpcyBpbnRlbnQgaXMgc2VudCB3aGVuIGEgVVNCIGRldmljZSBzdXBwb3J0aW5nIFBUUCBpcyBkZXRhY2hlZCBmcm9tIHRoZSBob3N0IFVTQiBidXMuCisgICAgICogVGhlIGludGVudCdzIGRhdGEgY29udGFpbnMgYSBVcmkgZm9yIHRoZSBkZXZpY2UgaW4gdGhlIE1UUCBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVVNCX0NBTUVSQV9ERVRBQ0hFRCA9CisgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hY3Rpb24uVVNCX0NBTUVSQV9ERVRBQ0hFRCI7CisKICAgICAvKioKICAgICAgKiBCb29sZWFuIGV4dHJhIGluZGljYXRpbmcgd2hldGhlciBVU0IgaXMgY29ubmVjdGVkIG9yIGRpc2Nvbm5lY3RlZC4KICAgICAgKiBVc2VkIGluIGV4dHJhcyBmb3IgdGhlIHtAbGluayAjQUNUSU9OX1VTQl9TVEFURX0gYnJvYWRjYXN0LgpAQCAtOTYsNCArMTE4LDMwIEBACiAgICAgICogVXNlZCBpbiBleHRyYXMgZm9yIHRoZSB7QGxpbmsgI0FDVElPTl9VU0JfQ09OTkVDVEVEfSBicm9hZGNhc3QKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0JfRlVOQ1RJT05fRElTQUJMRUQgPSAiZGlzYWJsZWQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRGdW5jdGlvbkVuYWJsZUZpbGUoU3RyaW5nIGZ1bmN0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgRmlsZSgiL3N5cy9jbGFzcy91c2JfY29tcG9zaXRlLyIgKyBmdW5jdGlvbiArICIvZW5hYmxlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgVVNCIGZ1bmN0aW9uIGlzIHN1cHBvcnRlZCBieSB0aGUga2VybmVsLgorICAgICAqIE5vdGUgdGhhdCBhIFVTQiBmdW5jdGlvbiBtYXliZSBzdXBwb3J0ZWQgYnV0IGRpc2FibGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Z1bmN0aW9uU3VwcG9ydGVkKFN0cmluZyBmdW5jdGlvbikgeworICAgICAgICByZXR1cm4gZ2V0RnVuY3Rpb25FbmFibGVGaWxlKGZ1bmN0aW9uKS5leGlzdHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBVU0IgZnVuY3Rpb24gaXMgY3VycmVudGx5IGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRnVuY3Rpb25FbmFibGVkKFN0cmluZyBmdW5jdGlvbikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZ2V0RnVuY3Rpb25FbmFibGVGaWxlKGZ1bmN0aW9uKSk7CisgICAgICAgICAgICBib29sZWFuIGVuYWJsZWQgPSAoc3RyZWFtLnJlYWQoKSA9PSAnMScpOworICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm4gZW5hYmxlZDsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0Fic3RyYWN0SW5wdXRNZXRob2RTZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvQWJzdHJhY3RJbnB1dE1ldGhvZFNlcnZpY2UuamF2YQppbmRleCAzNjE5NjUzLi4yN2FmMDEzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvQWJzdHJhY3RJbnB1dE1ldGhvZFNlcnZpY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvQWJzdHJhY3RJbnB1dE1ldGhvZFNlcnZpY2UuamF2YQpAQCAtMTc3LDYgKzE3Nyw3IEBACiAgICAgICogSW1wbGVtZW50IHRoaXMgdG8gaGFuZGxlIHtAbGluayBhbmRyb2lkLm9zLkJpbmRlciNkdW1wIEJpbmRlci5kdW1wKCl9CiAgICAgICogY2FsbHMgb24geW91ciBpbnB1dCBtZXRob2QuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZHVtcChGaWxlRGVzY3JpcHRvciBmZCwgUHJpbnRXcml0ZXIgZm91dCwgU3RyaW5nW10gYXJncykgewogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0V4dHJhY3RFZGl0VGV4dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0V4dHJhY3RFZGl0VGV4dC5qYXZhCmluZGV4IDhhNTJlNDAuLjIyOTY4YjAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9FeHRyYWN0RWRpdFRleHQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvRXh0cmFjdEVkaXRUZXh0LmphdmEKQEAgLTE4LDcgKzE4LDYgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5FeHRyYWN0ZWRUZXh0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OwogCkBAIC0yOSw3ICsyOCw2IEBACiBwdWJsaWMgY2xhc3MgRXh0cmFjdEVkaXRUZXh0IGV4dGVuZHMgRWRpdFRleHQgewogICAgIHByaXZhdGUgSW5wdXRNZXRob2RTZXJ2aWNlIG1JTUU7CiAgICAgcHJpdmF0ZSBpbnQgbVNldHRpbmdFeHRyYWN0ZWRUZXh0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtQ29udGV4dE1lbnVTaG91bGRCZUhhbmRsZWRCeVN1cGVyID0gZmFsc2U7CiAgICAgCiAgICAgcHVibGljIEV4dHJhY3RFZGl0VGV4dChDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCk7CkBAIC05OSwxOSArOTcsMTIgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51IG1lbnUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGVDb250ZXh0TWVudShtZW51KTsKLSAgICAgICAgbUNvbnRleHRNZW51U2hvdWxkQmVIYW5kbGVkQnlTdXBlciA9IHRydWU7Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIG9uVGV4dENvbnRleHRNZW51SXRlbShpbnQgaWQpIHsKLSAgICAgICAgaWYgKG1JTUUgIT0gbnVsbCAmJiAhbUNvbnRleHRNZW51U2hvdWxkQmVIYW5kbGVkQnlTdXBlcikgeworICAgICAgICBpZiAobUlNRSAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAobUlNRS5vbkV4dHJhY3RUZXh0Q29udGV4dE1lbnVJdGVtKGlkKSkgewogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1Db250ZXh0TWVudVNob3VsZEJlSGFuZGxlZEJ5U3VwZXIgPSBmYWxzZTsKICAgICAgICAgcmV0dXJuIHN1cGVyLm9uVGV4dENvbnRleHRNZW51SXRlbShpZCk7CiAgICAgfQogICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0lJbnB1dE1ldGhvZFdyYXBwZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9JSW5wdXRNZXRob2RXcmFwcGVyLmphdmEKaW5kZXggMzVmZDQ2Zi4uMjRlYTdkMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0lJbnB1dE1ldGhvZFdyYXBwZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvSUlucHV0TWV0aG9kV3JhcHBlci5qYXZhCkBAIC0zNiw2ICszNiw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0Q29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2Q7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kU2Vzc2lvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RTdWJ0eXBlOwogCiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwpAQCAtNjQsNiArNjUsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBET19SRVZPS0VfU0VTU0lPTiA9IDUwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBET19TSE9XX1NPRlRfSU5QVVQgPSA2MDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRE9fSElERV9TT0ZUX0lOUFVUID0gNzA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERPX0NIQU5HRV9JTlBVVE1FVEhPRF9TVUJUWVBFID0gODA7CiAgICAKICAgICBmaW5hbCBXZWFrUmVmZXJlbmNlPEFic3RyYWN0SW5wdXRNZXRob2RTZXJ2aWNlPiBtVGFyZ2V0OwogICAgIGZpbmFsIEhhbmRsZXJDYWxsZXIgbUNhbGxlcjsKQEAgLTE3OCw2ICsxODAsOSBAQAogICAgICAgICAgICAgY2FzZSBET19ISURFX1NPRlRfSU5QVVQ6CiAgICAgICAgICAgICAgICAgaW5wdXRNZXRob2QuaGlkZVNvZnRJbnB1dChtc2cuYXJnMSwgKFJlc3VsdFJlY2VpdmVyKW1zZy5vYmopOwogICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNhc2UgRE9fQ0hBTkdFX0lOUFVUTUVUSE9EX1NVQlRZUEU6CisgICAgICAgICAgICAgICAgaW5wdXRNZXRob2QuY2hhbmdlSW5wdXRNZXRob2RTdWJ0eXBlKChJbnB1dE1ldGhvZFN1YnR5cGUpbXNnLm9iaik7CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIExvZy53KFRBRywgIlVuaGFuZGxlZCBtZXNzYWdlIGNvZGU6ICIgKyBtc2cud2hhdCk7CiAgICAgfQpAQCAtMjY3LDQgKzI3Miw5IEBACiAgICAgICAgIG1DYWxsZXIuZXhlY3V0ZU9yU2VuZE1lc3NhZ2UobUNhbGxlci5vYnRhaW5NZXNzYWdlSU8oRE9fSElERV9TT0ZUX0lOUFVULAogICAgICAgICAgICAgICAgIGZsYWdzLCByZXN1bHRSZWNlaXZlcikpOwogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNoYW5nZUlucHV0TWV0aG9kU3VidHlwZShJbnB1dE1ldGhvZFN1YnR5cGUgc3VidHlwZSkgeworICAgICAgICBtQ2FsbGVyLmV4ZWN1dGVPclNlbmRNZXNzYWdlKG1DYWxsZXIub2J0YWluTWVzc2FnZU8oRE9fQ0hBTkdFX0lOUFVUTUVUSE9EX1NVQlRZUEUsCisgICAgICAgICAgICAgICAgc3VidHlwZSkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9JbnB1dE1ldGhvZFNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9JbnB1dE1ldGhvZFNlcnZpY2UuamF2YQppbmRleCAxYTI2MWQzLi42MDg5MDEzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvSW5wdXRNZXRob2RTZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0lucHV0TWV0aG9kU2VydmljZS5qYXZhCkBAIC01Miw2ICs1Miw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0Q29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2Q7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RTdWJ0eXBlOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5FZGl0b3JJbmZvOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKQEAgLTI3MCw3ICsyNzEsNyBAQAogCiAgICAgZmluYWwgSW5zZXRzIG1UbXBJbnNldHMgPSBuZXcgSW5zZXRzKCk7CiAgICAgZmluYWwgaW50W10gbVRtcExvY2F0aW9uID0gbmV3IGludFsyXTsKLSAgICAKKwogICAgIGZpbmFsIFZpZXdUcmVlT2JzZXJ2ZXIuT25Db21wdXRlSW50ZXJuYWxJbnNldHNMaXN0ZW5lciBtSW5zZXRzQ29tcHV0ZXIgPQogICAgICAgICAgICAgbmV3IFZpZXdUcmVlT2JzZXJ2ZXIuT25Db21wdXRlSW50ZXJuYWxJbnNldHNMaXN0ZW5lcigpIHsKICAgICAgICAgcHVibGljIHZvaWQgb25Db21wdXRlSW50ZXJuYWxJbnNldHMoVmlld1RyZWVPYnNlcnZlci5JbnRlcm5hbEluc2V0c0luZm8gaW5mbykgewpAQCAtMzk0LDggKzM5NSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IElucHV0TWV0aG9kTWFuYWdlci5SRVNVTFRfVU5DSEFOR0VEX0hJRERFTiksIG51bGwpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2hhbmdlSW5wdXRNZXRob2RTdWJ0eXBlKElucHV0TWV0aG9kU3VidHlwZSBzdWJ0eXBlKSB7CisgICAgICAgICAgICBvbkN1cnJlbnRJbnB1dE1ldGhvZFN1YnR5cGVDaGFuZ2VkKHN1YnR5cGUpOworICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YKICAgICAgKiB7QGxpbmsgQWJzdHJhY3RJbnB1dE1ldGhvZFNlcnZpY2UuQWJzdHJhY3RJbnB1dE1ldGhvZFNlc3Npb25JbXBsfSB0aGF0IHByb3ZpZGVzCkBAIC01NDEsNiArNTQ2LDcgQEAKICAgICAgKiB3aWxsIHR5cGljYWxseSBjYWxsIGl0IGluIHlvdXIgY29uc3RydWN0b3Igd2l0aCB0aGUgcmVzb3VyY2UgSUQKICAgICAgKiBvZiB5b3VyIGN1c3RvbSB0aGVtZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRUaGVtZShpbnQgdGhlbWUpIHsKICAgICAgICAgaWYgKG1XaW5kb3cgIT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTXVzdCBiZSBjYWxsZWQgYmVmb3JlIG9uQ3JlYXRlKCkiKTsKQEAgLTU1OCw3ICs1NjQsNyBAQAogICAgICAgICBpbml0Vmlld3MoKTsKICAgICAgICAgbVdpbmRvdy5nZXRXaW5kb3coKS5zZXRMYXlvdXQoTUFUQ0hfUEFSRU5ULCBXUkFQX0NPTlRFTlQpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFRoaXMgaXMgYSBob29rIHRoYXQgc3ViY2xhc3NlcyBjYW4gdXNlIHRvIHBlcmZvcm0gaW5pdGlhbGl6YXRpb24gb2YKICAgICAgKiB0aGVpciBpbnRlcmZhY2UuICBJdCBpcyBjYWxsZWQgZm9yIHlvdSBwcmlvciB0byBhbnkgb2YgeW91ciBVSSBvYmplY3RzCkBAIC01NjcsMTQgKzU3MywxNCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG9uSW5pdGlhbGl6ZUludGVyZmFjZSgpIHsKICAgICB9Ci0gICAgCisKICAgICB2b2lkIGluaXRpYWxpemUoKSB7CiAgICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7CiAgICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICAgICAgICAgb25Jbml0aWFsaXplSW50ZXJmYWNlKCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICB2b2lkIGluaXRWaWV3cygpIHsKICAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CiAgICAgICAgIG1XaW5kb3dDcmVhdGVkID0gZmFsc2U7CkBAIC02MTAsNyArNjE2LDcgQEAKICAgICAgICAgbUNhbmRpZGF0ZXNGcmFtZS5zZXRWaXNpYmlsaXR5KG1DYW5kaWRhdGVzVmlzaWJpbGl0eSk7CiAgICAgICAgIG1JbnB1dEZyYW1lLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKICAgICB9Ci0gICAgCisKICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25EZXN0cm95KCkgewogICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKICAgICAgICAgbVJvb3RWaWV3LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKS5yZW1vdmVPbkNvbXB1dGVJbnRlcm5hbEluc2V0c0xpc3RlbmVyKApAQCAtNjc3LDYgKzY4Myw3IEBACiAgICAgICogSW1wbGVtZW50IHRvIHJldHVybiBvdXIgc3RhbmRhcmQge0BsaW5rIElucHV0TWV0aG9kSW1wbH0uICBTdWJjbGFzc2VzCiAgICAgICogY2FuIG92ZXJyaWRlIHRvIHByb3ZpZGUgdGhlaXIgb3duIGN1c3RvbWl6ZWQgdmVyc2lvbi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQWJzdHJhY3RJbnB1dE1ldGhvZEltcGwgb25DcmVhdGVJbnB1dE1ldGhvZEludGVyZmFjZSgpIHsKICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dE1ldGhvZEltcGwoKTsKICAgICB9CkBAIC02ODUsNiArNjkyLDcgQEAKICAgICAgKiBJbXBsZW1lbnQgdG8gcmV0dXJuIG91ciBzdGFuZGFyZCB7QGxpbmsgSW5wdXRNZXRob2RTZXNzaW9uSW1wbH0uICBTdWJjbGFzc2VzCiAgICAgICogY2FuIG92ZXJyaWRlIHRvIHByb3ZpZGUgdGhlaXIgb3duIGN1c3RvbWl6ZWQgdmVyc2lvbi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQWJzdHJhY3RJbnB1dE1ldGhvZFNlc3Npb25JbXBsIG9uQ3JlYXRlSW5wdXRNZXRob2RTZXNzaW9uSW50ZXJmYWNlKCkgewogICAgICAgICByZXR1cm4gbmV3IElucHV0TWV0aG9kU2Vzc2lvbkltcGwoKTsKICAgICB9CkBAIC0xNjU2LDYgKzE2NjQsNyBAQAogICAgICAgICByZXR1cm4gZG9Nb3ZlbWVudEtleShrZXlDb2RlLCBldmVudCwgTU9WRU1FTlRfVVApOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTE2OTQsNyArMTcwMyw3IEBACiAgICAgICAgICAgICAgICAgZHkgPSBjb3VudDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBvbkV4dHJhY3RlZEN1cnNvck1vdmVtZW50KGR4LCBkeSk7ICAgICAgIAorICAgICAgICBvbkV4dHJhY3RlZEN1cnNvck1vdmVtZW50KGR4LCBkeSk7CiAgICAgfQogICAgIAogICAgIGJvb2xlYW4gZG9Nb3ZlbWVudEtleShpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQsIGludCBjb3VudCkgewpAQCAtMjA2NCw3ICsyMDczLDI0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKKyAgICAvLyBUT0RPOiBIYW5kbGUgdGhlIHN1YnR5cGUgY2hhbmdlIGV2ZW50CisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN1YnR5cGUgd2FzIGNoYW5nZWQuCisgICAgICogQHBhcmFtIG5ld1N1YnR5cGUgdGhlIHN1YnR5cGUgd2hpY2ggaXMgYmVpbmcgY2hhbmdlZCB0by4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkN1cnJlbnRJbnB1dE1ldGhvZFN1YnR5cGVDaGFuZ2VkKElucHV0TWV0aG9kU3VidHlwZSBuZXdTdWJ0eXBlKSB7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgaW50IG5hbWVSZXNJZCA9IG5ld1N1YnR5cGUuZ2V0TmFtZVJlc0lkKCk7CisgICAgICAgICAgICBpbnQgbW9kZVJlc0lkID0gbmV3U3VidHlwZS5nZXRNb2RlUmVzSWQoKTsKKyAgICAgICAgICAgIFN0cmluZyBvdXRwdXQgPSAiY2hhbmdlSW5wdXRNZXRob2RTdWJ0eXBlOiIKKyAgICAgICAgICAgICAgICArIChuYW1lUmVzSWQgPT0gMCA/ICI8bm9uZT4iIDogZ2V0U3RyaW5nKG5hbWVSZXNJZCkpICsgIiwiCisgICAgICAgICAgICAgICAgKyAobW9kZVJlc0lkID09IDAgPyAiPG5vbmU+IiA6IGdldFN0cmluZyhtb2RlUmVzSWQpKSArICIsIgorICAgICAgICAgICAgICAgICsgbmV3U3VidHlwZS5nZXRMb2NhbGUoKSArICIsIiArIG5ld1N1YnR5cGUuZ2V0RXh0cmFWYWx1ZSgpOworICAgICAgICAgICAgTG9nLnYoVEFHLCAiLS0tICIgKyBvdXRwdXQpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUGVyZm9ybXMgYSBkdW1wIG9mIHRoZSBJbnB1dE1ldGhvZFNlcnZpY2UncyBpbnRlcm5hbCBzdGF0ZS4gIE92ZXJyaWRlCiAgICAgICogdG8gYWRkIHlvdXIgb3duIGluZm9ybWF0aW9uIHRvIHRoZSBkdW1wLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0tleWJvYXJkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmQuamF2YQppbmRleCAyNjllMWM5Li43NWM5NDViIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmQuamF2YQpAQCAtNTA0LDcgKzUwNCwzMCBAQAogICAgIHB1YmxpYyBLZXlib2FyZChDb250ZXh0IGNvbnRleHQsIGludCB4bWxMYXlvdXRSZXNJZCkgewogICAgICAgICB0aGlzKGNvbnRleHQsIHhtbExheW91dFJlc0lkLCAwKTsKICAgICB9Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEga2V5Ym9hcmQgZnJvbSB0aGUgZ2l2ZW4geG1sIGtleSBsYXlvdXQgZmlsZS4gV2VlZHMgb3V0IHJvd3MKKyAgICAgKiB0aGF0IGhhdmUgYSBrZXlib2FyZCBtb2RlIGRlZmluZWQgYnV0IGRvbid0IG1hdGNoIHRoZSBzcGVjaWZpZWQgbW9kZS4KKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgYXBwbGljYXRpb24gb3Igc2VydmljZSBjb250ZXh0CisgICAgICogQHBhcmFtIHhtbExheW91dFJlc0lkIHRoZSByZXNvdXJjZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGtleWJvYXJkIGxheW91dCBhbmQga2V5cy4KKyAgICAgKiBAcGFyYW0gbW9kZUlkIGtleWJvYXJkIG1vZGUgaWRlbnRpZmllcgorICAgICAqIEBwYXJhbSB3aWR0aCBzZXRzIHdpZHRoIG9mIGtleWJvYXJkCisgICAgICogQHBhcmFtIGhlaWdodCBzZXRzIGhlaWdodCBvZiBrZXlib2FyZAorICAgICAqLworICAgIHB1YmxpYyBLZXlib2FyZChDb250ZXh0IGNvbnRleHQsIGludCB4bWxMYXlvdXRSZXNJZCwgaW50IG1vZGVJZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1EaXNwbGF5V2lkdGggPSB3aWR0aDsKKyAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBoZWlnaHQ7CisKKyAgICAgICAgbURlZmF1bHRIb3Jpem9udGFsR2FwID0gMDsKKyAgICAgICAgbURlZmF1bHRXaWR0aCA9IG1EaXNwbGF5V2lkdGggLyAxMDsKKyAgICAgICAgbURlZmF1bHRWZXJ0aWNhbEdhcCA9IDA7CisgICAgICAgIG1EZWZhdWx0SGVpZ2h0ID0gbURlZmF1bHRXaWR0aDsKKyAgICAgICAgbUtleXMgPSBuZXcgQXJyYXlMaXN0PEtleT4oKTsKKyAgICAgICAgbU1vZGlmaWVyS2V5cyA9IG5ldyBBcnJheUxpc3Q8S2V5PigpOworICAgICAgICBtS2V5Ym9hcmRNb2RlID0gbW9kZUlkOworICAgICAgICBsb2FkS2V5Ym9hcmQoY29udGV4dCwgY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRYbWwoeG1sTGF5b3V0UmVzSWQpKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEga2V5Ym9hcmQgZnJvbSB0aGUgZ2l2ZW4geG1sIGtleSBsYXlvdXQgZmlsZS4gV2VlZHMgb3V0IHJvd3MKICAgICAgKiB0aGF0IGhhdmUgYSBrZXlib2FyZCBtb2RlIGRlZmluZWQgYnV0IGRvbid0IG1hdGNoIHRoZSBzcGVjaWZpZWQgbW9kZS4gCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmRWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmRWaWV3LmphdmEKaW5kZXggNGI0ODQwOS4uYWI1Yzc4YSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0tleWJvYXJkVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9LZXlib2FyZFZpZXcuamF2YQpAQCAtMTEyOCw3ICsxMTI4LDkgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBvbk1vZGlmaWVkVG91Y2hFdmVudChNb3Rpb25FdmVudCBtZSwgYm9vbGVhbiBwb3NzaWJsZVBvbHkpIHsKICAgICAgICAgaW50IHRvdWNoWCA9IChpbnQpIG1lLmdldFgoKSAtIG1QYWRkaW5nTGVmdDsKLSAgICAgICAgaW50IHRvdWNoWSA9IChpbnQpIG1lLmdldFkoKSArIG1WZXJ0aWNhbENvcnJlY3Rpb24gLSBtUGFkZGluZ1RvcDsKKyAgICAgICAgaW50IHRvdWNoWSA9IChpbnQpIG1lLmdldFkoKSAtIG1QYWRkaW5nVG9wOworICAgICAgICBpZiAodG91Y2hZID49IC1tVmVydGljYWxDb3JyZWN0aW9uKQorICAgICAgICAgICAgdG91Y2hZICs9IG1WZXJ0aWNhbENvcnJlY3Rpb247CiAgICAgICAgIGZpbmFsIGludCBhY3Rpb24gPSBtZS5nZXRBY3Rpb24oKTsKICAgICAgICAgZmluYWwgbG9uZyBldmVudFRpbWUgPSBtZS5nZXRFdmVudFRpbWUoKTsKICAgICAgICAgbU9sZEV2ZW50VGltZSA9IGV2ZW50VGltZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Db25uZWN0aXZpdHlNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvQ29ubmVjdGl2aXR5TWFuYWdlci5qYXZhCmluZGV4IDFjZmU0MTliNy4uZGQ5YzhmMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Nvbm5lY3Rpdml0eU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvQ29ubmVjdGl2aXR5TWFuYWdlci5qYXZhCkBAIC0yNjQsNiArMjY0LDI0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgZ2V0QWN0aXZlTGlua1Byb3BlcnRpZXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0QWN0aXZlTGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKGludCBuZXR3b3JrVHlwZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldExpbmtQcm9wZXJ0aWVzKG5ldHdvcmtUeXBlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqIHtAaGlkZX0gKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzZXRSYWRpb3MoYm9vbGVhbiB0dXJuT24pIHsKICAgICAgICAgdHJ5IHsKQEAgLTM2NywxNCArMzg1LDE0IEBACiAgICAgICogPHA+CiAgICAgICogQWxsIGFwcGxpY2F0aW9ucyB0aGF0IGhhdmUgYmFja2dyb3VuZCBzZXJ2aWNlcyB0aGF0IHVzZSB0aGUgbmV0d29yawogICAgICAqIHNob3VsZCBsaXN0ZW4gdG8ge0BsaW5rICNBQ1RJT05fQkFDS0dST1VORF9EQVRBX1NFVFRJTkdfQ0hBTkdFRH0uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFdoZXRoZXIgYmFja2dyb3VuZCBkYXRhIHVzYWdlIGlzIGFsbG93ZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0QmFja2dyb3VuZERhdGFTZXR0aW5nKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldEJhY2tncm91bmREYXRhU2V0dGluZygpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRXJyIG9uIHRoZSBzaWRlIG9mIHNhZmV0eSAKKyAgICAgICAgICAgIC8vIEVyciBvbiB0aGUgc2lkZSBvZiBzYWZldHkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KQEAgLTUzMiw2ICs1NTAsMTcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VGV0aGVyYWJsZUJsdWV0b290aFJlZ2V4cygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRUZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKiB7QGhpZGV9ICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVUSEVSX0VSUk9SX05PX0VSUk9SICAgICAgICAgICA9IDA7CiAgICAgLyoqIHtAaGlkZX0gKi8KQEAgLTU3MCw2ICs1OTksMjEgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhlIGRldmljZSBzdGF5cyBhd2FrZSB1bnRpbCB3ZSBjb25uZWN0IHdpdGggdGhlIG5leHQgbmV0d29yaworICAgICAqIEBwYXJhbSBmb3JXaG9tZSBUaGUgbmFtZSBvZiB0aGUgbmV0d29yayBnb2luZyBkb3duIGZvciBsb2dnaW5nIHB1cnBvc2VzCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBvbiBmYWlsdXJlCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3ROZXR3b3JrVHJhbnNpdGlvbldha2Vsb2NrKFN0cmluZyBmb3JXaG9tKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmljZS5yZXF1ZXN0TmV0d29ya1RyYW5zaXRpb25XYWtlbG9jayhmb3JXaG9tKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQHBhcmFtIG5ldHdvcmtUeXBlIFRoZSB0eXBlIG9mIG5ldHdvcmsgeW91IHdhbnQgdG8gcmVwb3J0IG9uCiAgICAgICogQHBhcmFtIHBlcmNlbnRhZ2UgVGhlIHF1YWxpdHkgb2YgdGhlIGNvbm5lY3Rpb24gMCBpcyBiYWQsIDEwMCBpcyBnb29kCiAgICAgICoge0BoaWRlfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0RoY3BJbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRGhjcEluZm8uamF2YQppbmRleCAxMTc4YmVjLi45YzgxYzE5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRGhjcEluZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRGhjcEluZm8uamF2YQpAQCAtMzcsNiArMzcsMTkgQEAKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKKyAgICAvKiogY29weSBjb25zdHJ1Y3RvciB7QGhpZGV9ICovCisgICAgcHVibGljIERoY3BJbmZvKERoY3BJbmZvIHNvdXJjZSkgeworICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlwQWRkcmVzcyA9IHNvdXJjZS5pcEFkZHJlc3M7CisgICAgICAgICAgICBnYXRld2F5ID0gc291cmNlLmdhdGV3YXk7CisgICAgICAgICAgICBuZXRtYXNrID0gc291cmNlLm5ldG1hc2s7CisgICAgICAgICAgICBkbnMxID0gc291cmNlLmRuczE7CisgICAgICAgICAgICBkbnMyID0gc291cmNlLmRuczI7CisgICAgICAgICAgICBzZXJ2ZXJBZGRyZXNzID0gc291cmNlLnNlcnZlckFkZHJlc3M7CisgICAgICAgICAgICBsZWFzZUR1cmF0aW9uID0gc291cmNlLmxlYXNlRHVyYXRpb247CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmdCdWZmZXIgc3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRG93bmxvYWRzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRG93bmxvYWRzLmphdmEKaW5kZXggZmQzMzc4MS4uZGRkZTVjMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Rvd25sb2Fkcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Eb3dubG9hZHMuamF2YQpAQCAtNDMwLDExICs0MzAsMTAgQEAKIAogICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIGNyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKIAotICAgICAgICAgICAgQ3Vyc29yIGMgPSBjci5xdWVyeSgKLSAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRVcmksIERPV05MT0FEU19QUk9KRUNUSU9OLCBudWxsIC8qIHNlbGVjdGlvbiAqLywgbnVsbCAvKiBzZWxlY3Rpb24gYXJncyAqLywKLSAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBzb3J0IG9yZGVyICovKTsKKyAgICAgICAgICAgIEN1cnNvciBjID0gY3IucXVlcnkoZG93bmxvYWRVcmksIERPV05MT0FEU19QUk9KRUNUSU9OLCBudWxsIC8qIHNlbGVjdGlvbiAqLywKKyAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBzZWxlY3Rpb24gYXJncyAqLywgbnVsbCAvKiBzb3J0IG9yZGVyICovKTsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChjID09IG51bGwgfHwgIWMubW92ZVRvTmV4dCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSUNvbm5lY3Rpdml0eU1hbmFnZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JQ29ubmVjdGl2aXR5TWFuYWdlci5haWRsCmluZGV4IGFmY2NkZDkuLjM1MDU0ZDYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JQ29ubmVjdGl2aXR5TWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JQ29ubmVjdGl2aXR5TWFuYWdlci5haWRsCkBAIC0xLDIxICsxLDIyIEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKIHBhY2thZ2UgYW5kcm9pZC5uZXQ7CiAKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiAKQEAgLTM2LDYgKzM3LDEwIEBACiAKICAgICBOZXR3b3JrSW5mb1tdIGdldEFsbE5ldHdvcmtJbmZvKCk7CiAKKyAgICBMaW5rUHJvcGVydGllcyBnZXRBY3RpdmVMaW5rUHJvcGVydGllcygpOworCisgICAgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoaW50IG5ldHdvcmtUeXBlKTsKKwogICAgIGJvb2xlYW4gc2V0UmFkaW9zKGJvb2xlYW4gb25PZmYpOwogCiAgICAgYm9vbGVhbiBzZXRSYWRpbyhpbnQgbmV0d29ya1R5cGUsIGJvb2xlYW4gdHVybk9uKTsKQEAgLTc1LDUgKzgwLDkgQEAKIAogICAgIFN0cmluZ1tdIGdldFRldGhlcmFibGVXaWZpUmVnZXhzKCk7CiAKKyAgICBTdHJpbmdbXSBnZXRUZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKCk7CisKKyAgICB2b2lkIHJlcXVlc3ROZXR3b3JrVHJhbnNpdGlvbldha2Vsb2NrKGluIFN0cmluZyBmb3JXaG9tKTsKKwogICAgIHZvaWQgcmVwb3J0SW5ldENvbmRpdGlvbihpbnQgbmV0d29ya1R5cGUsIGludCBwZXJjZW50YWdlKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rQWRkcmVzcy5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0xpbmtBZGRyZXNzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkODY0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rQWRkcmVzcy5haWRsCkBAIC0wLDAgKzEsMjEgQEAKKy8qKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5ldDsKKworcGFyY2VsYWJsZSBMaW5rQWRkcmVzczsKKwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0xpbmtBZGRyZXNzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTGlua0FkZHJlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjMwMmRhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0xpbmtBZGRyZXNzLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW50ZXJmYWNlQWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKKworLyoqCisgKiBJZGVudGlmaWVzIGFuIGFkZHJlc3Mgb2YgYSBuZXR3b3JrIGxpbmsKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBMaW5rQWRkcmVzcyBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIC8qKgorICAgICAqIElQdjQgb3IgSVB2NiBhZGRyZXNzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgSW5ldEFkZHJlc3MgYWRkcmVzczsKKworICAgIC8qKgorICAgICAqIE5ldHdvcmsgcHJlZml4CisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgcHJlZml4OworCisgICAgcHVibGljIExpbmtBZGRyZXNzKEluZXRBZGRyZXNzIGFkZHJlc3MsIEluZXRBZGRyZXNzIG1hc2spIHsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBjb21wdXRlcHJlZml4KG1hc2spOworICAgIH0KKworICAgIHB1YmxpYyBMaW5rQWRkcmVzcyhJbmV0QWRkcmVzcyBhZGRyZXNzLCBpbnQgcHJlZml4KSB7CisgICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7CisgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworICAgIH0KKworICAgIHB1YmxpYyBMaW5rQWRkcmVzcyhJbnRlcmZhY2VBZGRyZXNzIGludGVyZmFjZUFkZHJlc3MpIHsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gaW50ZXJmYWNlQWRkcmVzcy5nZXRBZGRyZXNzKCk7CisgICAgICAgIHRoaXMucHJlZml4ID0gaW50ZXJmYWNlQWRkcmVzcy5nZXROZXR3b3JrUHJlZml4TGVuZ3RoKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvbXB1dGVwcmVmaXgoSW5ldEFkZHJlc3MgbWFzaykgeworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICBmb3IgKGJ5dGUgYiA6IG1hc2suZ2V0QWRkcmVzcygpKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7ICsraSkgeworICAgICAgICAgICAgICAgIGlmICgoYiAmICgxIDw8IGkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICsrY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gKGFkZHJlc3MgPT0gbnVsbCA/ICIiIDogKGFkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKSArICIvIiArIHByZWZpeCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmVzIHRoaXMge0Bjb2RlIExpbmtBZGRyZXNzfSBpbnN0YW5jZSBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcworICAgICAqIGluIHtAY29kZSBvYmp9LiBUd28gYWRkcmVzc2VzIGFyZSBlcXVhbCBpZiB0aGVpciBJbmV0QWRkcmVzcyBhbmQgcHJlZml4CisgICAgICogYXJlIGVxdWFsCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmUgdGVzdGVkIGZvciBlcXVhbGl0eS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBib3RoIG9iamVjdHMgYXJlIGVxdWFsLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBMaW5rQWRkcmVzcykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBMaW5rQWRkcmVzcyBsaW5rQWRkcmVzcyA9IChMaW5rQWRkcmVzcykgb2JqOworICAgICAgICByZXR1cm4gdGhpcy5hZGRyZXNzLmVxdWFscyhsaW5rQWRkcmVzcy5hZGRyZXNzKSAmJgorICAgICAgICAgICAgdGhpcy5wcmVmaXggPT0gbGlua0FkZHJlc3MucHJlZml4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEluZXRBZGRyZXNzIGZvciB0aGlzIGFkZHJlc3MuCisgICAgICovCisgICAgcHVibGljIEluZXRBZGRyZXNzIGdldEFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiBhZGRyZXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBuZXR3b3JrIHByZWZpeCBsZW5ndGgKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE5ldHdvcmtQcmVmaXgoKSB7CisgICAgICAgIHJldHVybiBwcmVmaXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIFBhcmNlbGFibGUgaW50ZXJmYWNlLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGlmIChhZGRyZXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKChieXRlKTEpOworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGVBcnJheShhZGRyZXNzLmdldEFkZHJlc3MoKSk7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KHByZWZpeCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgoYnl0ZSkwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgUGFyY2VsYWJsZSBpbnRlcmZhY2UuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENyZWF0b3I8TGlua0FkZHJlc3M+IENSRUFUT1IgPQorICAgICAgICBuZXcgQ3JlYXRvcjxMaW5rQWRkcmVzcz4oKSB7CisgICAgICAgICAgICBwdWJsaWMgTGlua0FkZHJlc3MgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcyBhZGRyZXNzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpbnQgcHJlZml4ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoaW4ucmVhZEJ5dGUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGluLmNyZWF0ZUJ5dGVBcnJheSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeyB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGlua0FkZHJlc3MoYWRkcmVzcywgcHJlZml4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIExpbmtBZGRyZXNzW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExpbmtBZGRyZXNzW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0xpbmtDYXBhYmlsaXRpZXMuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rQ2FwYWJpbGl0aWVzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY3MjU5OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rQ2FwYWJpbGl0aWVzLmFpZGwKQEAgLTAsMCArMSwyMSBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBhbmRyb2lkLm5ldDsKKworcGFyY2VsYWJsZSBMaW5rQ2FwYWJpbGl0aWVzOworCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTGlua0NhcGFiaWxpdGllcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0xpbmtDYXBhYmlsaXRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjkxNjZmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0xpbmtDYXBhYmlsaXRpZXMuamF2YQpAQCAtMCwwICsxLDM2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5uZXQ7CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEEgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSBjYXBhYmlsaXRpZXMgb2YgYSBsaW5rCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIExpbmtDYXBhYmlsaXRpZXMgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkxpbmtDYXBhYmlsaXRpZXMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CisKKyAgICAvKiogVGhlIE1hcCBvZiBLZXlzIHRvIFZhbHVlcyAqLworICAgIHByaXZhdGUgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+IG1DYXBhYmlsaXRpZXM7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2Yga2V5cyBkZWZpbmVkIGZvciBhIGxpbmtzIGNhcGFiaWxpdGllcy4KKyAgICAgKgorICAgICAqIEtleXMgc3RhcnRpbmcgd2l0aCBSVyBhcmUgcmVhZCArIHdyaXRlLCBpLmUuIHRoZSBhcHBsaWNhdGlvbgorICAgICAqIGNhbiByZXF1ZXN0IGZvciBhIGNlcnRhaW4gcmVxdWlyZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGF0IGtleS4KKyAgICAgKiBLZXlzIHN0YXJ0aW5nIHdpdGggUk8gYXJlIHJlYWQgb25seSwgaS5lLiB0aGUgdGhlIGFwcGxpY2F0aW9uCisgICAgICogY2FuIHJlYWQgdGhlIHZhbHVlIG9mIHRoYXQga2V5IGZyb20gdGhlIHNvY2tldCBidXQgY2Fubm90IHJlcXVlc3QKKyAgICAgKiBhIGNvcnJlc3BvbmRpbmcgcmVxdWlyZW1lbnQuCisgICAgICoKKyAgICAgKiBUT0RPOiBQcm92aWRlIGEgZG9jdW1lbnRhdGlvbiB0ZWNobmlxdWUgZm9yIGNvbmNpc2VseSBhbmQgcHJlY2lzZWx5CisgICAgICogZGVmaW5lIHRoZSBzeW50YXggZm9yIGVhY2ggdmFsdWUgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhIGtleS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEtleSB7CisgICAgICAgIC8qKiBObyBjb25zdHJ1Y3RvciAqLworICAgICAgICBwcml2YXRlIEtleSgpIHt9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBuZXR3b3JrIHR5cGUuCisgICAgICAgICAqIEBzZWUgQ29ubmVjdGl2aXR5TWFuYWdlcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUk9fTkVUV09SS19UWVBFID0gMTsKKworICAgICAgICAvKioKKyAgICAgICAgICogRGVzaXJlZCBtaW5pbXVtIGZvcndhcmQgbGluayAoZG93bmxvYWQpIGJhbmR3aWR0aCBmb3IgdGhlCisgICAgICAgICAqIGluIGtpbG9iaXRzIHBlciBzZWNvbmQgKGticHMpLiBWYWx1ZXMgc2hvdWxkIGJlIHN0cmluZ3Mgc3VjaAorICAgICAgICAgKiAiNTAiLCAiMTAwIiwgIjE1MDAiLCBldGMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBSV19ERVNJUkVEX0ZXRF9CVyA9IDI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcXVpcmVkIG1pbmltdW0gZm9yd2FyZCBsaW5rIChkb3dubG9hZCkgYmFuZHdpZHRoLCBpbgorICAgICAgICAgKiBwZXIgc2Vjb25kIChrYnBzKSwgYmVsb3cgd2hpY2ggdGhlIHNvY2tldCBjYW5ub3QgZnVuY3Rpb24uCisgICAgICAgICAqIFZhbHVlcyBzaG91bGQgYmUgc3RyaW5ncyBzdWNoIGFzICI1MCIsICIxMDAiLCAiMTUwMCIsIGV0Yy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJXX1JFUVVJUkVEX0ZXRF9CVyA9IDM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEF2YWlsYWJsZSBmb3J3YXJkIGxpbmsgKGRvd25sb2FkKSBiYW5kd2lkdGggZm9yIHRoZSBzb2NrZXQuCisgICAgICAgICAqIFRoaXMgdmFsdWUgaXMgaW4ga2lsb2JpdHMgcGVyIHNlY29uZCAoa2JwcykuCisgICAgICAgICAqIFZhbHVlcyB3aWxsIGJlIHN0cmluZ3Mgc3VjaCBhcyAiNTAiLCAiMTAwIiwgIjE1MDAiLCBldGMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBST19BVkFJTEFCTEVfRldEX0JXID0gNDsKKworICAgICAgICAvKioKKyAgICAgICAgICogRGVzaXJlZCBtaW5pbXVtIHJldmVyc2UgbGluayAodXBsb2FkKSBiYW5kd2lkdGggZm9yIHRoZSBzb2NrZXQKKyAgICAgICAgICogaW4ga2lsb2JpdHMgcGVyIHNlY29uZCAoa2JwcykuCisgICAgICAgICAqIFZhbHVlcyBzaG91bGQgYmUgc3RyaW5ncyBzdWNoIGFzICI1MCIsICIxMDAiLCAiMTUwMCIsIGV0Yy4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoaXMga2V5IGlzIHNldCB2aWEgdGhlIG5lZWRzIG1hcC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJXX0RFU0lSRURfUkVWX0JXID0gNTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVxdWlyZWQgbWluaW11bSByZXZlcnNlIGxpbmsgKHVwbG9hZCkgYmFuZHdpZHRoLCBpbiBraWxvYml0cworICAgICAgICAgKiBwZXIgc2Vjb25kIChrYnBzKSwgYmVsb3cgd2hpY2ggdGhlIHNvY2tldCBjYW5ub3QgZnVuY3Rpb24uCisgICAgICAgICAqIElmIGEgcmF0ZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCByYXRlIG9mIGticHMgd2lsbCBiZQorICAgICAgICAgKiBWYWx1ZXMgc2hvdWxkIGJlIHN0cmluZ3Mgc3VjaCBhcyAiNTAiLCAiMTAwIiwgIjE1MDAiLCBldGMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBSV19SRVFVSVJFRF9SRVZfQlcgPSA2OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBdmFpbGFibGUgcmV2ZXJzZSBsaW5rICh1cGxvYWQpIGJhbmR3aWR0aCBmb3IgdGhlIHNvY2tldC4KKyAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBpbiBraWxvYml0cyBwZXIgc2Vjb25kIChrYnBzKS4KKyAgICAgICAgICogVmFsdWVzIHdpbGwgYmUgc3RyaW5ncyBzdWNoIGFzICI1MCIsICIxMDAiLCAiMTUwMCIsIGV0Yy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJPX0FWQUlMQUJMRV9SRVZfQlcgPSA3OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBNYXhpbXVtIGxhdGVuY3kgZm9yIHRoZSBzb2NrZXQsIGluIG1pbGxpc2Vjb25kcywgYWJvdmUgd2hpY2gKKyAgICAgICAgICogc29ja2V0IGNhbm5vdCBmdW5jdGlvbi4KKyAgICAgICAgICogVmFsdWVzIHNob3VsZCBiZSBzdHJpbmdzIHN1Y2ggYXMgIjUwIiwgIjMwMCIsICI1MDAiLCBldGMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBSV19NQVhfQUxMT1dFRF9MQVRFTkNZID0gODsKKworICAgICAgICAvKioKKyAgICAgICAgICogSW50ZXJmYWNlIHRoYXQgdGhlIHNvY2tldCBpcyBib3VuZCB0by4gVGhpcyBjYW4gYmUgYSB2aXJ0dWFsCisgICAgICAgICAqIGludGVyZmFjZSAoZS5nLiBWUE4gb3IgTW9iaWxlIElQKSBvciBhIHBoeXNpY2FsIGludGVyZmFjZQorICAgICAgICAgKiAoZS5nLiB3bGFuMCBvciBybW5ldDApLgorICAgICAgICAgKiBWYWx1ZXMgd2lsbCBiZSBzdHJpbmdzIHN1Y2ggYXMgIndsYW4wIiwgInJtbmV0MCIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJPX0JPVU5EX0lOVEVSRkFDRSA9IDk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBoeXNpY2FsIGludGVyZmFjZSB0aGF0IHRoZSBzb2NrZXQgaXMgcm91dGVkIG9uLgorICAgICAgICAgKiBUaGlzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBCT1VORF9JTlRFUkZBQ0UgaW4gY2FzZXMgc3VjaCBhcworICAgICAgICAgKiBWUE4gb3IgTW9iaWxlIElQLiBUaGUgcGh5c2ljYWwgaW50ZXJmYWNlIG1heSBjaGFuZ2Ugb3ZlciB0aW1lCisgICAgICAgICAqIGlmIHNlYW1sZXNzIG1vYmlsaXR5IGlzIHN1cHBvcnRlZC4KKyAgICAgICAgICogVmFsdWVzIHdpbGwgYmUgc3RyaW5ncyBzdWNoIGFzICJ3bGFuMCIsICJybW5ldDAiCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBST19QSFlTSUNBTF9JTlRFUkZBQ0UgPSAxMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSb2xlIGluZm9ybXMgdGhlIExpbmtTb2NrZXQgYWJvdXQgdGhlIGRhdGEgdXNhZ2UgcGF0dGVybnMgb2YgeW91cgorICAgICAqIGFwcGxpY2F0aW9uLgorICAgICAqIDxQPgorICAgICAqIHtAY29kZSBSb2xlLkRFRkFVTFR9IGlzIHRoZSBkZWZhdWx0IHJvbGUsIGFuZCBpcyB1c2VkIHdoZW5ldmVyCisgICAgICogYSByb2xlIGlzbid0IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvbGUgeworICAgICAgICAvKiogTm8gY29uc3RydWN0b3IgKi8KKyAgICAgICAgcHJpdmF0ZSBSb2xlKCkge30KKworICAgICAgICAvLyBleGFtcGxlcyBvbmx5LCBkaXNjdXNzIHdoaWNoIHJvbGVzIHNob3VsZCBiZSBkZWZpbmVkLCBhbmQgdGhlbgorICAgICAgICAvLyBjb2RlIHRoZXNlIHRvIG1hdGNoCisKKyAgICAgICAgLyoqIERlZmF1bHQgUm9sZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUID0gImRlZmF1bHQiOworICAgICAgICAvKiogQnVsayBkb3duIGxvYWQgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVMS19ET1dOTE9BRCA9ICJidWxrLmRvd25sb2FkIjsKKyAgICAgICAgLyoqIEJ1bGsgdXBsb2FkICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTEtfVVBMT0FEID0gImJ1bGsudXBsb2FkIjsKKworICAgICAgICAvKiogVm9JUCBBcHBsaWNhdGlvbiBhdCAyNGticHMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JUF8yNEtCUFMgPSAidm9pcC4yNGsiOworICAgICAgICAvKiogVm9JUCBBcHBsaWNhdGlvbiBhdCAzMmticHMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JUF8zMktCUFMgPSAidm9pcC4zMmsiOworCisgICAgICAgIC8qKiBWaWRlbyBTdHJlYW1pbmcgYXQgNDgwcCAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSURFT19TVFJFQU1JTkdfNDgwUCA9ICJ2aWRlby5zdHJlYW1pbmcuNDgwcCI7CisgICAgICAgIC8qKiBWaWRlbyBTdHJlYW1pbmcgYXQgNzIwcCAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSURFT19TVFJFQU1JTkdfNzIwSSA9ICJ2aWRlby5zdHJlYW1pbmcuNzIwaSI7CisKKyAgICAgICAgLyoqIFZpZGVvIENoYXQgQXBwbGljYXRpb24gYXQgMzYwcCAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSURFT19DSEFUXzM2MFAgPSAidmlkZW8uY2hhdC4zNjBwIjsKKyAgICAgICAgLyoqIFZpZGVvIENoYXQgQXBwbGljYXRpb24gYXQgNDgwcCAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSURFT19DSEFUXzQ4MFAgPSAidmlkZW8uY2hhdC40ODBpIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBMaW5rQ2FwYWJpbGl0aWVzKCkgeworICAgICAgICBtQ2FwYWJpbGl0aWVzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlCisgICAgICovCisgICAgcHVibGljIExpbmtDYXBhYmlsaXRpZXMoTGlua0NhcGFiaWxpdGllcyBzb3VyY2UpIHsKKyAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2FwYWJpbGl0aWVzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPihzb3VyY2UubUNhcGFiaWxpdGllcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ2FwYWJpbGl0aWVzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSB7QGNvZGUgTGlua0NhcGFiaWxpdGllc30gd2l0aCB2YWx1ZXMgZGVwZW5kaW5nIG9uIHJvbGUgdHlwZS4KKyAgICAgKiBAcGFyYW0gYXBwbGljYXRpb25Sb2xlIGEge0Bjb2RlIExpbmtTb2NrZXQuUm9sZX0KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgTGlua0NhcGFiaWxpdGllc30gYXNzb2NpYXRlZCB3aXRoIHRoZSBhcHBsaWNhdGlvblJvbGUsIGVtcHR5IGlmIG5vbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpbmtDYXBhYmlsaXRpZXMgY3JlYXRlTmVlZHNNYXAoU3RyaW5nIGFwcGxpY2F0aW9uUm9sZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImNyZWF0ZU5lZWRlZENhcGFiaWxpdGllcyhhcHBsaWNhdGlvblJvbGUpIEVYIik7CisgICAgICAgIHJldHVybiBuZXcgTGlua0NhcGFiaWxpdGllcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbGwgY2FwYWJpbGl0aWVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIG1DYXBhYmlsaXRpZXMuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBtYXAgaXMgZW1wdHkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIG1DYXBhYmlsaXRpZXMuaXNFbXB0eSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIG1hcC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIG1hcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiBtQ2FwYWJpbGl0aWVzLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiB0aGUga2V5IHJldHVybiB0aGUgY2FwYWJpbGl0eSBzdHJpbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiBAcmV0dXJuIHRoZSBjYXBhYmlsaXR5IHN0cmluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0KGludCBrZXkpIHsKKyAgICAgICAgcmV0dXJuIG1DYXBhYmlsaXRpZXMuZ2V0KGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIGtleS92YWx1ZSBjYXBhYmlsaXR5IHBhaXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdXQoaW50IGtleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIG1DYXBhYmlsaXRpZXMucHV0KGtleSwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGtleS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgdG8gc2VhcmNoIGZvci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGtleSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KGludCBrZXkpIHsKKyAgICAgICAgcmV0dXJuIG1DYXBhYmlsaXRpZXMuY29udGFpbnNLZXkoa2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0byBzZWFyY2ggZm9yLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgbWFwIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgdmFsdWUsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbUNhcGFiaWxpdGllcy5jb250YWluc1ZhbHVlKHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2V0IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBtYXBwaW5ncyBpbiB0aGlzIG1hcC4gRWFjaCBtYXBwaW5nIGlzCisgICAgICogYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE1hcC5FbnRyeX0uIEFzIHRoZSBzZXQgaXMgYmFja2VkIGJ5IHRoaXMgbWFwLAorICAgICAqIGNoYW5nZXMgaW4gb25lIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBvdGhlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBzZXQgb2YgdGhlIG1hcHBpbmdzLgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8RW50cnk8SW50ZWdlciwgU3RyaW5nPj4gZW50cnlTZXQoKSB7CisgICAgICAgIHJldHVybiBtQ2FwYWJpbGl0aWVzLmVudHJ5U2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgc2V0IG9mIHRoZSBrZXlzLgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8SW50ZWdlcj4ga2V5U2V0KCkgeworICAgICAgICByZXR1cm4gbUNhcGFiaWxpdGllcy5rZXlTZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgdmFsdWVzCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiB2YWx1ZXMoKSB7CisgICAgICAgIHJldHVybiBtQ2FwYWJpbGl0aWVzLnZhbHVlcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgUGFyY2VsYWJsZSBpbnRlcmZhY2UKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0byBzdHJpbmcgZm9yIGRlYnVnZ2luZworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBzYi5hcHBlbmQoInsiKTsKKyAgICAgICAgYm9vbGVhbiBmaXJzdFRpbWUgPSB0cnVlOworICAgICAgICBmb3IgKEVudHJ5PEludGVnZXIsIFN0cmluZz4gZW50cnkgOiBtQ2FwYWJpbGl0aWVzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdFRpbWUpIHsKKyAgICAgICAgICAgICAgICBmaXJzdFRpbWUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoZW50cnkuZ2V0S2V5KCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI6XCIiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgICAgIHJldHVybiBtQ2FwYWJpbGl0aWVzLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlSW50KG1DYXBhYmlsaXRpZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChFbnRyeTxJbnRlZ2VyLCBTdHJpbmc+IGVudHJ5IDogbUNhcGFiaWxpdGllcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KGVudHJ5LmdldEtleSgpLmludFZhbHVlKCkpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgUGFyY2VsYWJsZSBpbnRlcmZhY2UuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENyZWF0b3I8TGlua0NhcGFiaWxpdGllcz4gQ1JFQVRPUiA9CisgICAgICAgIG5ldyBDcmVhdG9yPExpbmtDYXBhYmlsaXRpZXM+KCkgeworICAgICAgICAgICAgcHVibGljIExpbmtDYXBhYmlsaXRpZXMgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgICAgICBMaW5rQ2FwYWJpbGl0aWVzIGNhcGFiaWxpdGllcyA9IG5ldyBMaW5rQ2FwYWJpbGl0aWVzKCk7CisgICAgICAgICAgICAgICAgaW50IHNpemUgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHNpemUtLSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBrZXkgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLm1DYXBhYmlsaXRpZXMucHV0KGtleSwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY2FwYWJpbGl0aWVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTGlua0NhcGFiaWxpdGllc1tdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMaW5rQ2FwYWJpbGl0aWVzW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgLyoqCisgICAgICogRGVidWcgbG9nZ2luZworICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIHMpIHsKKyAgICAgICAgTG9nLmQoVEFHLCBzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTGlua1Byb3BlcnRpZXMuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rUHJvcGVydGllcy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZDA2ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTGlua1Byb3BlcnRpZXMuYWlkbApAQCAtMCwwICsxLDIxIEBACisvKgorKioKKyoqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCitwYXJjZWxhYmxlIExpbmtQcm9wZXJ0aWVzOworCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTGlua1Byb3BlcnRpZXMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rUHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNTQ1ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTGlua1Byb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5uZXQ7CisKK2ltcG9ydCBhbmRyb2lkLm5ldC5Qcm94eVByb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlOworaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworLyoqCisgKiBEZXNjcmliZXMgdGhlIHByb3BlcnRpZXMgb2YgYSBuZXR3b3JrIGxpbmsuCisgKiBUT0RPIC0gY29uc2lkZXIgYWRkaW5nIG9wdGlvbmFsIGZpZWxkcyBsaWtlIEFwbiBhbmQgQXBuVHlwZQorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIExpbmtQcm9wZXJ0aWVzIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisKKyAgICBTdHJpbmcgbUlmYWNlTmFtZTsKKyAgICBwcml2YXRlIENvbGxlY3Rpb248TGlua0FkZHJlc3M+IG1MaW5rQWRkcmVzc2VzOworICAgIHByaXZhdGUgQ29sbGVjdGlvbjxJbmV0QWRkcmVzcz4gbURuc2VzOworICAgIHByaXZhdGUgSW5ldEFkZHJlc3MgbUdhdGV3YXk7CisgICAgcHJpdmF0ZSBQcm94eVByb3BlcnRpZXMgbUh0dHBQcm94eTsKKworICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcygpIHsKKyAgICAgICAgY2xlYXIoKTsKKyAgICB9CisKKyAgICAvLyBjb3B5IGNvbnN0cnVjdG9yIGluc3RlYWQgb2YgY2xvbmUKKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMoTGlua1Byb3BlcnRpZXMgc291cmNlKSB7CisgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgbUlmYWNlTmFtZSA9IHNvdXJjZS5nZXRJbnRlcmZhY2VOYW1lKCk7CisgICAgICAgICAgICBtTGlua0FkZHJlc3NlcyA9IHNvdXJjZS5nZXRMaW5rQWRkcmVzc2VzKCk7CisgICAgICAgICAgICBtRG5zZXMgPSBzb3VyY2UuZ2V0RG5zZXMoKTsKKyAgICAgICAgICAgIG1HYXRld2F5ID0gc291cmNlLmdldEdhdGV3YXkoKTsKKyAgICAgICAgICAgIG1IdHRwUHJveHkgPSBuZXcgUHJveHlQcm9wZXJ0aWVzKHNvdXJjZS5nZXRIdHRwUHJveHkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRlcmZhY2VOYW1lKFN0cmluZyBpZmFjZSkgeworICAgICAgICBtSWZhY2VOYW1lID0gaWZhY2U7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lKCkgeworICAgICAgICByZXR1cm4gbUlmYWNlTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxJbmV0QWRkcmVzcz4gZ2V0QWRkcmVzc2VzKCkgeworICAgICAgICBDb2xsZWN0aW9uPEluZXRBZGRyZXNzPiBhZGRyZXNzZXMgPSBuZXcgQXJyYXlMaXN0PEluZXRBZGRyZXNzPigpOworICAgICAgICBmb3IgKExpbmtBZGRyZXNzIGxpbmtBZGRyZXNzIDogbUxpbmtBZGRyZXNzZXMpIHsKKyAgICAgICAgICAgIGFkZHJlc3Nlcy5hZGQobGlua0FkZHJlc3MuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihhZGRyZXNzZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZExpbmtBZGRyZXNzKExpbmtBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICAgICAgbUxpbmtBZGRyZXNzZXMuYWRkKGFkZHJlc3MpOworICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uPExpbmtBZGRyZXNzPiBnZXRMaW5rQWRkcmVzc2VzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihtTGlua0FkZHJlc3Nlcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkRG5zKEluZXRBZGRyZXNzIGRucykgeworICAgICAgICBtRG5zZXMuYWRkKGRucyk7CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb248SW5ldEFkZHJlc3M+IGdldERuc2VzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihtRG5zZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdhdGV3YXkoSW5ldEFkZHJlc3MgZ2F0ZXdheSkgeworICAgICAgICBtR2F0ZXdheSA9IGdhdGV3YXk7CisgICAgfQorICAgIHB1YmxpYyBJbmV0QWRkcmVzcyBnZXRHYXRld2F5KCkgeworICAgICAgICByZXR1cm4gbUdhdGV3YXk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SHR0cFByb3h5KFByb3h5UHJvcGVydGllcyBwcm94eSkgeworICAgICAgICBtSHR0cFByb3h5ID0gcHJveHk7CisgICAgfQorICAgIHB1YmxpYyBQcm94eVByb3BlcnRpZXMgZ2V0SHR0cFByb3h5KCkgeworICAgICAgICByZXR1cm4gbUh0dHBQcm94eTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgbUlmYWNlTmFtZSA9IG51bGw7CisgICAgICAgIG1MaW5rQWRkcmVzc2VzID0gbmV3IEFycmF5TGlzdDxMaW5rQWRkcmVzcz4oKTsKKyAgICAgICAgbURuc2VzID0gbmV3IEFycmF5TGlzdDxJbmV0QWRkcmVzcz4oKTsKKyAgICAgICAgbUdhdGV3YXkgPSBudWxsOworICAgICAgICBtSHR0cFByb3h5ID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIFBhcmNlbGFibGUgaW50ZXJmYWNlCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZyBpZmFjZU5hbWUgPSAobUlmYWNlTmFtZSA9PSBudWxsID8gIiIgOiAiSW50ZXJmYWNlTmFtZTogIiArIG1JZmFjZU5hbWUgKyAiICIpOworCisgICAgICAgIFN0cmluZyBsaW5rQWRkcmVzc2VzID0gIkxpbmtBZGRyZXNzZXM6IFsiOworICAgICAgICBmb3IgKExpbmtBZGRyZXNzIGFkZHIgOiBtTGlua0FkZHJlc3NlcykgbGlua0FkZHJlc3NlcyArPSBhZGRyLnRvU3RyaW5nKCk7CisgICAgICAgIGxpbmtBZGRyZXNzZXMgKz0gIl0gIjsKKworICAgICAgICBTdHJpbmcgZG5zID0gIkRuc0FkZHJlc3NlczogWyI7CisgICAgICAgIGZvciAoSW5ldEFkZHJlc3MgYWRkciA6IG1EbnNlcykgZG5zICs9IGFkZHIuZ2V0SG9zdEFkZHJlc3MoKSArICIsIjsKKyAgICAgICAgZG5zICs9ICJdICI7CisKKyAgICAgICAgU3RyaW5nIHByb3h5ID0gKG1IdHRwUHJveHkgPT0gbnVsbCA/ICIiIDogIkh0dHBQcm94eTogIiArIG1IdHRwUHJveHkudG9TdHJpbmcoKSArICIgIik7CisgICAgICAgIFN0cmluZyBnYXRld2F5ID0gKG1HYXRld2F5ID09IG51bGwgPyAiIiA6ICJHYXRld2F5OiAiICsgbUdhdGV3YXkuZ2V0SG9zdEFkZHJlc3MoKSArICIgIik7CisKKyAgICAgICAgcmV0dXJuIGlmYWNlTmFtZSArIGxpbmtBZGRyZXNzZXMgKyBnYXRld2F5ICsgZG5zICsgcHJveHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlU3RyaW5nKGdldEludGVyZmFjZU5hbWUoKSk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUxpbmtBZGRyZXNzZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yKExpbmtBZGRyZXNzIGxpbmtBZGRyZXNzIDogbUxpbmtBZGRyZXNzZXMpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVQYXJjZWxhYmxlKGxpbmtBZGRyZXNzLCBmbGFncyk7CisgICAgICAgIH0KKworICAgICAgICBkZXN0LndyaXRlSW50KG1EbnNlcy5zaXplKCkpOworICAgICAgICBmb3IoSW5ldEFkZHJlc3MgZCA6IG1EbnNlcykgeworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGVBcnJheShkLmdldEFkZHJlc3MoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1HYXRld2F5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKChieXRlKTEpOworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGVBcnJheShtR2F0ZXdheS5nZXRBZGRyZXNzKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoKGJ5dGUpMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1IdHRwUHJveHkgIT0gbnVsbCkgeworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoKGJ5dGUpMSk7CisgICAgICAgICAgICBkZXN0LndyaXRlUGFyY2VsYWJsZShtSHR0cFByb3h5LCBmbGFncyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgoYnl0ZSkwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgUGFyY2VsYWJsZSBpbnRlcmZhY2UuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENyZWF0b3I8TGlua1Byb3BlcnRpZXM+IENSRUFUT1IgPQorICAgICAgICBuZXcgQ3JlYXRvcjxMaW5rUHJvcGVydGllcz4oKSB7CisgICAgICAgICAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgICAgICBMaW5rUHJvcGVydGllcyBuZXRQcm9wID0gbmV3IExpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGlmYWNlID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgIGlmIChpZmFjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXRQcm9wLnNldEludGVyZmFjZU5hbWUoaWZhY2UpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGFkZHJlc3NDb3VudCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8YWRkcmVzc0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbmV0UHJvcC5hZGRMaW5rQWRkcmVzcygoTGlua0FkZHJlc3MpaW4ucmVhZFBhcmNlbGFibGUobnVsbCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhZGRyZXNzQ291bnQgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGFkZHJlc3NDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXRQcm9wLmFkZERucyhJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoaW4uY3JlYXRlQnl0ZUFycmF5KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeyB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbi5yZWFkQnl0ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldFByb3Auc2V0R2F0ZXdheShJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoaW4uY3JlYXRlQnl0ZUFycmF5KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkge30KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluLnJlYWRCeXRlKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBuZXRQcm9wLnNldEh0dHBQcm94eSgoUHJveHlQcm9wZXJ0aWVzKWluLnJlYWRQYXJjZWxhYmxlKG51bGwpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldFByb3A7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBMaW5rUHJvcGVydGllc1tdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMaW5rUHJvcGVydGllc1tzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rU29ja2V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTGlua1NvY2tldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYTY0NTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTGlua1NvY2tldC5qYXZhCkBAIC0wLDAgKzEsMjc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5ldDsKKworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtDYXBhYmlsaXRpZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1NvY2tldE5vdGlmaWVyOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0VGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKiogQGhpZGUgKi8KK3B1YmxpYyBjbGFzcyBMaW5rU29ja2V0IGV4dGVuZHMgU29ja2V0IHsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIkxpbmtTb2NrZXQiOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gREJHID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlua1NvY2tldCgpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJMaW5rU29ja2V0KCkgRVgiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHVuY29ubmVjdGVkIHNvY2tldC4KKyAgICAgKiBAcGFyYW0gbm90aWZpZXIgYSByZWZlcmVuY2UgdG8gYSBjbGFzcyB0aGF0IGltcGxlbWVudHMge0Bjb2RlIExpbmtTb2NrZXROb3RpZmllcn0KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlua1NvY2tldChMaW5rU29ja2V0Tm90aWZpZXIgbm90aWZpZXIpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJMaW5rU29ja2V0KG5vdGlmaWVyKSBFWCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgdW5jb25uZWN0ZWQgc29ja2V0IHVzaWduIHRoZSBnaXZlbiBwcm94eSB0eXBlLgorICAgICAqIEBwYXJhbSBub3RpZmllciBhIHJlZmVyZW5jZSB0byBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB7QGNvZGUgTGlua1NvY2tldE5vdGlmaWVyfQorICAgICAqIEBwYXJhbSBwcm94eSB0aGUgc3BlY2lmaWVkIHByb3h5IGZvciB0aGlzIHNvY2tldAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBhcmd1bWVudCBwcm94eSBpcyBudWxsIG9yIG9mIGFuIGludmFsaWQgdHlwZS4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIGl0IGRlbmllcyB0aGUgcGVybWlzc2lvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gY29ubmVjdCB0byB0aGUgZ2l2ZW4gcHJveHkuCisgICAgICovCisgICAgcHVibGljIExpbmtTb2NrZXQoTGlua1NvY2tldE5vdGlmaWVyIG5vdGlmaWVyLCBQcm94eSBwcm94eSkgeworICAgICAgICBpZiAoREJHKSBsb2coIkxpbmtTb2NrZXQobm90aWZpZXIsIHByb3h5KSBFWCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBMaW5rUHJvcGVydGllc30gZm9yIHRoZSBzb2NrZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiTGlua1Byb3BlcnRpZXMoKSBFWCIpOworICAgICAgICByZXR1cm4gbmV3IExpbmtQcm9wZXJ0aWVzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB7QGNvZGUgTGlua0NhcGFiaWxpZXN9IG5lZWRlZCBmb3IgdGhpcyBzb2NrZXQuICBJZiB0aGUgc29ja2V0IGlzIGFscmVhZHkgY29ubmVjdGVkCisgICAgICogb3IgaXMgYSBkdXBsaWNhdGUgc29ja2V0IHRoZSByZXF1ZXN0IGlzIGlnbm9yZWQgYW5kIHtAY29kZSBmYWxzZX0gd2lsbAorICAgICAqIGJlIHJldHVybmVkLiBBIG5lZWRzIG1hcCBjYW4gYmUgY3JlYXRlZCB2aWEgdGhlIHtAY29kZSBjcmVhdGVOZWVkc01hcH0gc3RhdGljCisgICAgICogbWV0aG9kLgorICAgICAqIEBwYXJhbSBuZWVkcyB0aGUgbmVlZHMgb2YgdGhlIHNvY2tldAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIG5lZWRzIGFyZSBzdWNjZXNzZnVsbHkgc2V0LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNldE5lZWRlZENhcGFiaWxpdGllcyhMaW5rQ2FwYWJpbGl0aWVzIG5lZWRzKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygic2V0TmVlZHMoKSBFWCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgTGlua0NhcGFiaWxpdGVzIHNldCBieSBzZXROZWVkZWRDYXBhYmlsaXRpZXMsIGVtcHR5IGlmIG5vbmUgaGFzIGJlZW4gc2V0CisgICAgICovCisgICAgcHVibGljIExpbmtDYXBhYmlsaXRpZXMgZ2V0TmVlZGVkQ2FwYWJpbGl0aWVzKCkgeworICAgICAgICBpZiAoREJHKSBsb2coImdldE5lZWRzKCkgRVgiKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhbGwgb2YgdGhlIHtAY29kZSBMaW5rQ2FwYWJpbGl0aWVzfSBvZiB0aGUgbGluayB1c2VkIGJ5IHRoaXMgc29ja2V0CisgICAgICovCisgICAgcHVibGljIExpbmtDYXBhYmlsaXRpZXMgZ2V0Q2FwYWJpbGl0aWVzKCkgeworICAgICAgICBpZiAoREJHKSBsb2coImdldENhcGFiaWxpdGllcygpIEVYIik7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhpcyBMaW5rU29ja2V0cyBzZXQgb2YgY2FwYWJpbGl0aWVzLCBmaWx0ZXJlZCBhY2NvcmRpbmcgdG8KKyAgICAgKiB0aGUgZ2l2ZW4ge0Bjb2RlIFNldH0uICBDYXBhYmlsaXRpZXMgaW4gdGhlIFNldCBidXQgbm90IGF2YWlsYWJsZSBmcm9tCisgICAgICogdGhlIGxpbmsgd2lsbCBub3QgYmUgcmVwb3J0ZWQgaW4gdGhlIHJlc3VsdHMuICBDYXBhYmlsaXRpZXMgb2YgdGhlIGxpbmsKKyAgICAgKiBidXQgbm90IGxpc3RlZCBpbiB0aGUgU2V0IHdpbGwgYWxzbyBub3QgYmUgcmVwb3J0ZWQgaW4gdGhlIHJlc3VsdHMuCisgICAgICogQHBhcmFtIGNhcGFiaWxpdGllcyB7QGNvZGUgU2V0fSBvZiBjYXBhYmlsaXRpZXMgcmVxdWVzdGVkCisgICAgICogQHJldHVybiB0aGUgZmlsdGVyZWQge0Bjb2RlIExpbmtDYXBhYmlsaXRpZXN9IG9mIHRoaXMgTGlua1NvY2tldCwgbWF5IGJlIGVtcHR5CisgICAgICovCisgICAgcHVibGljIExpbmtDYXBhYmlsaXRpZXMgZ2V0Q2FwYWJpbGl0aWVzKFNldDxJbnRlZ2VyPiBjYXBhYmlsaXRpZXMpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJnZXRDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzKSBFWCIpOworICAgICAgICByZXR1cm4gbmV3IExpbmtDYXBhYmlsaXRpZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIHRoZSBzZXQgb2YgY2FwYWJpbGl0aWVzIHRoZSBhcHBsaWNhdGlvbiBpcyBpbnRlcmVzdGVkIGluIHRyYWNraW5nCisgICAgICogZm9yIHRoaXMgTGlua1NvY2tldC4KKyAgICAgKiBAcGFyYW0gY2FwYWJpbGl0aWVzIGEge0Bjb2RlIFNldH0gb2YgY2FwYWJpbGl0aWVzIHRvIHRyYWNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJhY2tlZENhcGFiaWxpdGllcyhTZXQ8SW50ZWdlcj4gY2FwYWJpbGl0aWVzKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygic2V0VHJhY2tlZENhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXMpIEVYIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIExpbmtDYXBhYmlsaXRpZXN9IHRoYXQgYXJlIHRyYWNrZWQsIGVtcHR5IGlmIG5vbmUgaGFzIGJlZW4gc2V0LgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8SW50ZWdlcj4gZ2V0VHJhY2tlZENhcGFiaWxpdGllcygpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJnZXRUcmFja2VkQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcykgRVgiKTsKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PEludGVnZXI+KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdHMgdGhpcyBzb2NrZXQgdG8gdGhlIGdpdmVuIHJlbW90ZSBob3N0IGFkZHJlc3MgYW5kIHBvcnQgc3BlY2lmaWVkCisgICAgICogYnkgZHN0TmFtZSBhbmQgZHN0UG9ydC4KKyAgICAgKiBAcGFyYW0gZHN0TmFtZSB0aGUgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIGhvc3QgdG8gY29ubmVjdCB0bworICAgICAqIEBwYXJhbSBkc3RQb3J0IHRoZSBwb3J0IHRvIGNvbm5lY3QgdG8gb24gdGhlIHJlbW90ZSBob3N0CisgICAgICogQHBhcmFtIHRpbWVvdXQgdGhlIHRpbWVvdXQgdmFsdWUgaW4gbWlsbGlzZWNvbmRzIG9yIDAgZm9yIGluZmluaXRlIHRpbWVvdXQKKyAgICAgKiBAdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBkc3ROYW1lIGlzIGludmFsaWQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBzb2NrZXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQgb3IgYW4gZXJyb3Igb2NjdXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICB3aGlsZSBjb25uZWN0aW5nCisgICAgICogQHRocm93cyBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGlmIHRoZSB0aW1lb3V0IGZpcmVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29ubmVjdChTdHJpbmcgZHN0TmFtZSwgaW50IGRzdFBvcnQsIGludCB0aW1lb3V0KQorICAgICAgICAgICAgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgU29ja2V0VGltZW91dEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChEQkcpIGxvZygiY29ubmVjdChkc3ROYW1lLCBkc3RQb3J0LCB0aW1lb3V0KSBFWCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRoaXMgc29ja2V0IHRvIHRoZSBnaXZlbiByZW1vdGUgaG9zdCBhZGRyZXNzIGFuZCBwb3J0IHNwZWNpZmllZAorICAgICAqIGJ5IGRzdE5hbWUgYW5kIGRzdFBvcnQuCisgICAgICogQHBhcmFtIGRzdE5hbWUgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBob3N0IHRvIGNvbm5lY3QgdG8KKyAgICAgKiBAcGFyYW0gZHN0UG9ydCB0aGUgcG9ydCB0byBjb25uZWN0IHRvIG9uIHRoZSByZW1vdGUgaG9zdAorICAgICAqIEB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24gaWYgdGhlIGdpdmVuIGRzdE5hbWUgaXMgaW52YWxpZAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHNvY2tldCBpcyBhbHJlYWR5IGNvbm5lY3RlZCBvciBhbiBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHdoaWxlIGNvbm5lY3RpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0KFN0cmluZyBkc3ROYW1lLCBpbnQgZHN0UG9ydCkKKyAgICAgICAgICAgIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoREJHKSBsb2coImNvbm5lY3QoZHN0TmFtZSwgZHN0UG9ydCwgdGltZW91dCkgRVgiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0aGlzIHNvY2tldCB0byB0aGUgZ2l2ZW4gcmVtb3RlIGhvc3QgYWRkcmVzcyBhbmQgcG9ydCBzcGVjaWZpZWQKKyAgICAgKiBieSB0aGUgU29ja2V0QWRkcmVzcyB3aXRoIHRoZSBzcGVjaWZpZWQgdGltZW91dC4KKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0Bjb2RlIGNvbm5lY3QoU3RyaW5nIGRzdE5hbWUsIGludCBkc3RQb3J0LCBpbnQgdGltZW91dCl9CisgICAgICogICAgICAgICAgICAgaW5zdGVhZC4gIFVzaW5nIHRoaXMgbWV0aG9kIG1heSByZXN1bHQgaW4gcmVkdWNlZCBmdW5jdGlvbmFsaXR5LgorICAgICAqIEBwYXJhbSByZW1vdGVBZGRyIHRoZSBhZGRyZXNzIGFuZCBwb3J0IG9mIHRoZSByZW1vdGUgaG9zdCB0byBjb25uZWN0IHRvCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIFNvY2tldEFkZHJlc3MgaXMgaW52YWxpZAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHNvY2tldCBpcyBhbHJlYWR5IGNvbm5lY3RlZCBvciBhbiBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHdoaWxlIGNvbm5lY3RpbmcKKyAgICAgKiBAdGhyb3dzIFNvY2tldFRpbWVvdXRFeGNlcHRpb24gaWYgdGhlIHRpbWVvdXQgZXhwaXJlcworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIHZvaWQgY29ubmVjdChTb2NrZXRBZGRyZXNzIHJlbW90ZUFkZHIsIGludCB0aW1lb3V0KQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0KHJlbW90ZUFkZHIsIHRpbWVvdXQpIEVYIERFUFJFQ0FURUQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0aGlzIHNvY2tldCB0byB0aGUgZ2l2ZW4gcmVtb3RlIGhvc3QgYWRkcmVzcyBhbmQgcG9ydCBzcGVjaWZpZWQKKyAgICAgKiBieSB0aGUgU29ja2V0QWRkcmVzcy4KKyAgICAgKiBUT0RPIGFkZCBjb21tZW50IG9uIGFsbCB0aGVzZSB0aGF0IHRoZSBuZXR3b3JrIHNlbGVjdGlvbiBoYXBwZW5zIGR1cmluZyBjb25uZWN0CisgICAgICogYW5kIG1heSB0YWtlIDMwIHNlY29uZHMKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0Bjb2RlIGNvbm5lY3QoU3RyaW5nIGRzdE5hbWUsIGludCBkc3RQb3J0KX0KKyAgICAgKiAgICAgICAgICAgICBVc2luZyB0aGlzIG1ldGhvZCBtYXkgcmVzdWx0IGluIHJlZHVjZWQgZnVuY3Rpb25hbGl0eS4KKyAgICAgKiBAcGFyYW0gcmVtb3RlQWRkciB0aGUgYWRkcmVzcyBhbmQgcG9ydCBvZiB0aGUgcmVtb3RlIGhvc3QgdG8gY29ubmVjdCB0by4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgU29ja2V0QWRkcmVzcyBpcyBpbnZhbGlkIG9yIG5vdCBzdXBwb3J0ZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgc29ja2V0IGlzIGFscmVhZHkgY29ubmVjdGVkIG9yIGFuIGVycm9yIG9jY3VycworICAgICAqICAgICAgICAgICAgICAgICAgICAgd2hpbGUgY29ubmVjdGluZworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIHZvaWQgY29ubmVjdChTb2NrZXRBZGRyZXNzIHJlbW90ZUFkZHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChEQkcpIGxvZygiY29ubmVjdChyZW1vdGVBZGRyKSBFWCBERVBSRUNBVEVEIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdCBhIGR1cGxpY2F0ZSBzb2NrZXQgc29ja2V0IHRvIHRoZSBzYW1lIHJlbW90ZSBob3N0IGFkZHJlc3MgYW5kIHBvcnQKKyAgICAgKiBhcyB0aGUgb3JpZ2luYWwgd2l0aCBhIHRpbWVvdXQgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kcyBvciAwIGZvciBpbmZpbml0ZSB0aW1lb3V0CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgc29ja2V0IGlzIGFscmVhZHkgY29ubmVjdGVkIG9yIGFuIGVycm9yIG9jY3VycworICAgICAqICAgICAgICAgICAgICAgICAgICAgd2hpbGUgY29ubmVjdGluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoaW50IHRpbWVvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChEQkcpIGxvZygiY29ubmVjdCh0aW1lb3V0KSBFWCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3QgYSBkdXBsaWNhdGUgc29ja2V0IHNvY2tldCB0byB0aGUgc2FtZSByZW1vdGUgaG9zdCBhZGRyZXNzIGFuZCBwb3J0CisgICAgICogYXMgdGhlIG9yaWdpbmFsLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHNvY2tldCBpcyBhbHJlYWR5IGNvbm5lY3RlZCBvciBhbiBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHdoaWxlIGNvbm5lY3RpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0KCkgRVgiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNvY2tldC4gIEl0IGlzIG5vdCBwb3NzaWJsZSB0byByZWNvbm5lY3Qgb3IgcmViaW5kIHRvIHRoaXMKKyAgICAgKiBzb2NrZXQgdGhlcmVhZnRlciB3aGljaCBtZWFucyBhIG5ldyBzb2NrZXQgaW5zdGFuY2UgaGFzIHRvIGJlIGNyZWF0ZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY2xvc2luZyB0aGUgc29ja2V0CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJjbG9zZSgpIEVYIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVxdWVzdCB0aGF0IGEgbmV3IExpbmtTb2NrZXQgYmUgY3JlYXRlZCB1c2luZyBhIGRpZmZlcmVudCByYWRpbworICAgICAqIChzdWNoIGFzIFdpRmkgb3IgM0cpIHRoYW4gdGhlIGN1cnJlbnQgTGlua1NvY2tldC4gIElmIGEgZGlmZmVyZW50CisgICAgICogcmFkaW8gaXMgYXZhaWxhYmxlIGEgY2FsbCBiYWNrIHdpbGwgYmUgbWFkZSB2aWEge0Bjb2RlIG9uQmV0dGVyTGlua0F2YWlsfS4KKyAgICAgKiBJZiB1bmFibGUgdG8gZmluZCBhIGJldHRlciByYWRpbywgYXBwbGljYXRpb24gd2lsbCBiZSBub3RpZmllZCB2aWEKKyAgICAgKiB7QGNvZGUgb25OZXdMaW5rVW5hdmFpbGFibGV9CisgICAgICogQHNlZSBMaW5rU29ja2V0Tm90aWZpZXIjb25CZXR0ZXJMaW5rQXZhaWxhYmxlKExpbmtTb2NrZXQsIExpbmtTb2NrZXQpCisgICAgICogQHBhcmFtIGxpbmtSZXF1ZXN0UmVhc29uIHJlYXNvbiBmb3IgcmVxdWVzdGluZyBhIG5ldyBsaW5rLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlcXVlc3ROZXdMaW5rKExpbmtSZXF1ZXN0UmVhc29uIGxpbmtSZXF1ZXN0UmVhc29uKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygicmVxdWVzdE5ld0xpbmsobGlua1JlcXVlc3RSZWFzb24pIEVYIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgTGlua1NvY2tldCB3aWxsIGF1dG9tYXRpY2FsbHkgcGljayB0aGUgb3B0aW11bSBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICB0byBiaW5kIHRvCisgICAgICogQHBhcmFtIGxvY2FsQWRkciB0aGUgc3BlY2lmaWMgYWRkcmVzcyBhbmQgcG9ydCBvbiB0aGUgbG9jYWwgbWFjaGluZQorICAgICAqICAgICAgICAgICAgICAgICAgdG8gYmluZCB0bworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gYWx3YXlzIGFzIHRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgZm9yIExpbmtTb2NrZXQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyB2b2lkIGJpbmQoU29ja2V0QWRkcmVzcyBsb2NhbEFkZHIpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChEQkcpIGxvZygiYmluZChsb2NhbEFkZHIpIEVYIHRocm93cyBJT0V4Y2VwdGlvbiIpOworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImJpbmQgaXMgZGVwcmVjYXRlZCBmb3IgTGlua1NvY2tldCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYXNvbiBjb2RlcyBhbiBhcHBsaWNhdGlvbiBjYW4gc3BlY2lmeSB3aGVuIHJlcXVlc3RpbmcgZm9yIGEgbmV3IGxpbmsuCisgICAgICogVE9ETzogbmVlZCBiZXR0ZXIgZG9jdW1lbnRhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTGlua1JlcXVlc3RSZWFzb24geworICAgICAgICAvKiogTm8gY29uc3RydWN0b3IgKi8KKyAgICAgICAgcHJpdmF0ZSBMaW5rUmVxdWVzdFJlYXNvbigpIHt9CisKKyAgICAgICAgLyoqIFRoaXMgbGluayBpcyB3b3JraW5nIHByb3Blcmx5ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJTktfUFJPQkxFTV9OT05FID0gMDsKKyAgICAgICAgLyoqIFRoaXMgbGluayBoYXMgYW4gdW5rbm93biBpc3N1ZSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSU5LX1BST0JMRU1fVU5LTk9XTiA9IDE7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVidWcgbG9nZ2luZworICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIHMpIHsKKyAgICAgICAgTG9nLmQoVEFHLCBzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTGlua1NvY2tldE5vdGlmaWVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTGlua1NvY2tldE5vdGlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhlMjgzNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rU29ja2V0Tm90aWZpZXIuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5ldDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogSW50ZXJmYWNlIHVzZWQgdG8gZ2V0IGZlZWRiYWNrIGFib3V0IGEge0BsaW5rIGFuZHJvaWQubmV0LkxpbmtTb2NrZXR9LiAgSW5zdGFuY2UgaXMgb3B0aW9uYWxseQorICogcGFzc2VkIHdoZW4gYSBMaW5rU29ja2V0IGlzIGNvbnN0cnVjdGVkLiAgTXVsdGlwbGUgTGlua1NvY2tldHMgbWF5IHVzZSB0aGUgc2FtZSBub3RpZmllci4KKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTGlua1NvY2tldE5vdGlmaWVyIHsKKyAgICAvKioKKyAgICAgKiBUaGlzIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGlmIGEgYmV0dGVyIGxpbmsKKyAgICAgKiBiZWNvbWVzIGF2YWlsYWJsZS4KKyAgICAgKiBUT0RPIC0gdGhpcyBzaG91bGRuJ3QgYmUgY2hlY2tlZCBmb3IgYWxsIGNhc2VzIC0gd2hhdCdzIHRoZSBjb25kaXRpb25hbAorICAgICAqICAgICAgICBmbGFnPworICAgICAqIElmIHRoZSBkdXBsaWNhdGUgc29ja2V0IGlzIGFjY2VwdGVkLCB0aGUgb3JpZ2luYWwgd2lsbCBiZSBtYXJrZWQgaW52YWxpZAorICAgICAqIGFuZCBhZGRpdGlvbmFsIHVzZSB3aWxsIHRocm93IGV4Y2VwdGlvbnMuCisgICAgICogQHBhcmFtIG9yaWdpbmFsIHRoZSBvcmlnaW5hbCBMaW5rU29ja2V0CisgICAgICogQHBhcmFtIGR1cGxpY2F0ZSB0aGUgbmV3IExpbmtTb2NrZXQgdGhhdCBiZXR0ZXIgbWVldHMgdGhlIGFwcGxpY2F0aW9uCisgICAgICogICAgICAgICAgICAgICAgICByZXF1aXJlbWVudHMKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgYXBwbGljYXRpb24gaW50ZW5kcyB0byB1c2UgdGhpcyBsaW5rCisgICAgICoKKyAgICAgKiBSRU0KKyAgICAgKiBUT0RPIC0gaG93IGFncmVzc2l2ZSBzaG91bGQgd2UgYmU/CisgICAgICogQXQgYSBtaW5pbXVtIENTIHRyYWNrcyB3aGljaCBMUyBoYXZlIHRoaXMgdHVybmVkIG9uIGFuZCB0cmFja3MgdGhlIHJlcXVpcmVtZW50cworICAgICAqIFdoZW4gYSBuZXcgbGluayBiZWNvbWVzIGF2YWlsYWJsZSwgYXV0b21hdGljYWxseSBjaGVjayBpZiBhbnkgb2YgdGhlIExpbmtTb2NrZXRzCisgICAgICogICB3aWxsIGNhcmUuCisgICAgICogSWYgZm91bmQsIGdyYWIgYSByZWZjb3VudCBvbiB0aGUgbGluayBzbyBpdCBkb2Vzbid0IGdvIGF3YXkgYW5kIHNlbmQgbm90aWZpY2F0aW9uCisgICAgICogT3B0aW9uYWxseSwgcGVyaW9kaWNhbGx5IHNldHVwIGNvbm5lY3Rpb24gb24gYXZhaWxhYmxlIG5ldHdvcmtzIHRvIGNoZWNrIGZvciBiZXR0ZXIgbGlua3MKKyAgICAgKiBNYXliZSBwYXNzIHRoaXMgaW5mbyBpbnRvIHRoZSBMaW5rRmFjdG9yaWVzIHNvIGNvbmRpdGlvbiBjaGFuZ2VzIGNhbiBiZSBhY3RlZCBvbiBtb3JlIHF1aWNrbHkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbkJldHRlckxpbmtBdmFpbGFibGUoTGlua1NvY2tldCBvcmlnaW5hbCwgTGlua1NvY2tldCBkdXBsaWNhdGUpOworCisgICAgLyoqCisgICAgICogVGhpcyBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgTGlua1NvY2tldCBubyBsb25nZXIgaGFzCisgICAgICogYW4gYWN0aXZlIGxpbmsuCisgICAgICogQHBhcmFtIHNvY2tldCB0aGUgTGlua1NvY2tldCB0aGF0IGxvc3QgaXRzIGxpbmsKKyAgICAgKgorICAgICAqIFJFTQorICAgICAqIE5ldHdvcmtTdGF0ZVRyYWNrZXIgdGVsbHMgdXMgaXQgaXMgZGlzY29ubmVjdGVkCisgICAgICogQ1MgY2hlY2tzIHRoZSB0YWJsZSBmb3IgTFMgb24gdGhhdCBsaW5rCisgICAgICogQ1MgY2FsbHMgZWFjaCBjYWxsYmFjayAobmVlZCB0byB3b3JrIG91dCBwMnAgY3Jvc3MgcHJvY2VzcyBjYWxsYmFjaykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkxpbmtMb3N0KExpbmtTb2NrZXQgc29ja2V0KTsKKworICAgIC8qKgorICAgICAqIFRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiBhbiBhcHBsaWNhdGlvbiBjYWxscworICAgICAqIHJlcXVlc3ROZXdMaW5rIG9uIGEgTGlua1NvY2tldCBidXQgdGhlIExpbmtTb2NrZXQgaXMgdW5hYmxlIHRvIGZpbmQKKyAgICAgKiBhIHN1aXRhYmxlIG5ldyBsaW5rLgorICAgICAqIEBwYXJhbSBzb2NrZXQgdGhlIExpbmtTb2NrZXQgZm9yIHdoaWNoIGEgbmV3IGxpbmsgd2FzIG5vdCBmb3VuZAorICAgICAqIFRPRE8gLSB3aHkgdGhlIGRpZmYgYmV0d2VlbiBpbml0aWFsIHJlcXVlc3QgKHN5bmMpIGFuZCByZXF1ZXN0TmV3TGluaz8KKyAgICAgKgorICAgICAqIFJFTQorICAgICAqIENTIHByb2Nlc3Mgb2YgdHJ5aW5nIHRvIGZpbmQgYSBuZXcgbGluayBtdXN0IHRyYWNrIHRoZSBMUyB0aGF0IHN0YXJ0ZWQgaXQKKyAgICAgKiBvbiBmYWlsdXJlLCBjYWxsIGNhbGxiYWNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25OZXdMaW5rVW5hdmFpbGFibGUoTGlua1NvY2tldCBzb2NrZXQpOworCisgICAgLyoqCisgICAgICogVGhpcyBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIGFueSBvZiB0aGUgbm90aWZpY2F0aW9uLW1hcmtlZAorICAgICAqIGNhcGFiaWxpdGllcyBvZiB0aGUgTGlua1NvY2tldCAoZS5nLiB1cHN0cmVhbSBiYW5kd2lkdGgpIGhhdmUgY2hhbmdlZC4KKyAgICAgKiBAcGFyYW0gc29ja2V0IHRoZSBsaW5rU29jZXQgZm9yIHdoaWNoIGNhcGFiaWxpdGllcyBoYXZlIGNoYW5nZWQKKyAgICAgKiBAcGFyYW0gY2hhbmdlZENhcGFiaWxpdGllcyB0aGUgc2V0IG9mIGNhcGFiaWxpdGllcyB0aGF0IHRoZSBhcHBsaWNhdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGludGVyZXN0ZWQgaW4gYW5kIGhhdmUgY2hhbmdlZCAod2l0aCBuZXcgdmFsdWVzKQorICAgICAqCisgICAgICogUkVNCisgICAgICogTWF5YmUgcGFzcyB0aGUgaW50ZXJlc3RpbmcgY2FwYWJpbGl0aWVzIGludG8gdGhlIExpbmtzLgorICAgICAqIEdldCBub3RpZmllZCBvZiBldmVyeSBjYXBhYmlsaXR5IGNoYW5nZQorICAgICAqIGNoZWNrIGZvciBMaW5rU29ja2V0cyBvbiB0aGF0IExpbmsgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiB0aGF0IENhcGFiaWxpdHkgLSBjYWxsIHRoZW0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNhcGFiaWxpdGllc0NoYW5nZWQoTGlua1NvY2tldCBzb2NrZXQsIExpbmtDYXBhYmlsaXRpZXMgY2hhbmdlZENhcGFiaWxpdGllcyk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTW9iaWxlRGF0YVN0YXRlVHJhY2tlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L01vYmlsZURhdGFTdGF0ZVRyYWNrZXIuamF2YQppbmRleCA4ZDE4ZWJhLi4zZGY4ZWMwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTW9iaWxlRGF0YVN0YXRlVHJhY2tlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Nb2JpbGVEYXRhU3RhdGVUcmFja2VyLmphdmEKQEAgLTE2LDE5ICsxNiwyMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmV0OwogCi1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci0KIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklUZWxlcGhvbnk7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlJbnRlbnRzOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CkBAIC00MCwxOSArNDIsMjUgQEAKICAqCiAgKiB7QGhpZGV9CiAgKi8KLXB1YmxpYyBjbGFzcyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyIGV4dGVuZHMgTmV0d29ya1N0YXRlVHJhY2tlciB7CitwdWJsaWMgY2xhc3MgTW9iaWxlRGF0YVN0YXRlVHJhY2tlciBpbXBsZW1lbnRzIE5ldHdvcmtTdGF0ZVRyYWNrZXIgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNb2JpbGVEYXRhU3RhdGVUcmFja2VyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKIAogICAgIHByaXZhdGUgUGhvbmUuRGF0YVN0YXRlIG1Nb2JpbGVEYXRhU3RhdGU7CiAgICAgcHJpdmF0ZSBJVGVsZXBob255IG1QaG9uZVNlcnZpY2U7CiAKICAgICBwcml2YXRlIFN0cmluZyBtQXBuVHlwZTsKLSAgICBwcml2YXRlIFN0cmluZyBtQXBuVHlwZVRvV2F0Y2hGb3I7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUFwbk5hbWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOwotICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbVN0YXRlUmVjZWl2ZXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gc0Ruc1Byb3BOYW1lczsKKyAgICBwcml2YXRlIE5ldHdvcmtJbmZvIG1OZXR3b3JrSW5mbzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVRlYXJkb3duUmVxdWVzdGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBIYW5kbGVyIG1UYXJnZXQ7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgTGlua1Byb3BlcnRpZXMgbUxpbmtQcm9wZXJ0aWVzOworICAgIHByaXZhdGUgTGlua0NhcGFiaWxpdGllcyBtTGlua0NhcGFiaWxpdGllczsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVByaXZhdGVEbnNSb3V0ZVNldCA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IG1EZWZhdWx0R2F0ZXdheUFkZHIgPSAwOworICAgIHByaXZhdGUgYm9vbGVhbiBtRGVmYXVsdFJvdXRlU2V0ID0gZmFsc2U7CiAKICAgICAvLyBERUZBVUxUIGFuZCBISVBSSSBhcmUgdGhlIHNhbWUgY29ubmVjdGlvbi4gIElmIHdlJ3JlIG9uZSBvZiB0aGVzZSB3ZSBuZWVkIHRvIGNoZWNrIGlmCiAgICAgLy8gdGhlIG90aGVyIGlzIGFsc28gZGlzY29ubmVjdGVkIGJlZm9yZSB3ZSByZXNldCBzb2NrZXRzCkBAIC02MCwzNSArNjgsMjIgQEAKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIG5ldyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyCi0gICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGFwcGxpY2F0aW9uIGNvbnRleHQgb2YgdGhlIGNhbGxlcgotICAgICAqIEBwYXJhbSB0YXJnZXQgYSBtZXNzYWdlIGhhbmRsZXIgZm9yIGdldHRpbmcgY2FsbGJhY2tzIGFib3V0IHN0YXRlIGNoYW5nZXMKICAgICAgKiBAcGFyYW0gbmV0VHlwZSB0aGUgQ29ubmVjdGl2aXR5TWFuYWdlciBuZXR3b3JrIHR5cGUKLSAgICAgKiBAcGFyYW0gYXBuVHlwZSB0aGUgUGhvbmUgYXBuVHlwZQogICAgICAqIEBwYXJhbSB0YWcgdGhlIG5hbWUgb2YgdGhpcyBuZXR3b3JrCiAgICAgICovCi0gICAgcHVibGljIE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIHRhcmdldCwgaW50IG5ldFR5cGUsIFN0cmluZyB0YWcpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgdGFyZ2V0LCBuZXRUeXBlLAorICAgIHB1YmxpYyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyKGludCBuZXRUeXBlLCBTdHJpbmcgdGFnKSB7CisgICAgICAgIG1OZXR3b3JrSW5mbyA9IG5ldyBOZXR3b3JrSW5mbyhuZXRUeXBlLAogICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldE5ldHdvcmtUeXBlKCksIHRhZywKICAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXROZXR3b3JrVHlwZU5hbWUoKSk7CiAgICAgICAgIG1BcG5UeXBlID0gbmV0d29ya1R5cGVUb0FwblR5cGUobmV0VHlwZSk7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuZXF1YWxzKG1BcG5UeXBlLCBQaG9uZS5BUE5fVFlQRV9ISVBSSSkpIHsKLSAgICAgICAgICAgIG1BcG5UeXBlVG9XYXRjaEZvciA9IFBob25lLkFQTl9UWVBFX0RFRkFVTFQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQXBuVHlwZVRvV2F0Y2hGb3IgPSBtQXBuVHlwZTsKLSAgICAgICAgfQogICAgICAgICBpZiAobmV0VHlwZSA9PSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFIHx8CiAgICAgICAgICAgICAgICAgbmV0VHlwZSA9PSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFX0hJUFJJKSB7CiAgICAgICAgICAgICBtSXNEZWZhdWx0T3JIaXByaSA9IHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICBtUGhvbmVTZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgaWYobmV0VHlwZSA9PSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFKSB7Ci0gICAgICAgICAgICBtRW5hYmxlZCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICB9CiAKLSAgICAgICAgbURuc1Byb3BOYW1lcyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgIHNEbnNQcm9wTmFtZXMgPSBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgICJuZXQucm1uZXQwLmRuczEiLAogICAgICAgICAgICAgICAgICJuZXQucm1uZXQwLmRuczIiLAogICAgICAgICAgICAgICAgICJuZXQuZXRoMC5kbnMxIiwKQEAgLTk5LDE2NSArOTQsMTY4IEBACiAgICAgICAgICAgICAgICAgIm5ldC5ncHJzLmRuczIiLAogICAgICAgICAgICAgICAgICJuZXQucHBwMC5kbnMxIiwKICAgICAgICAgICAgICAgICAibmV0LnBwcDAuZG5zMiJ9OwotCiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQmVnaW4gbW9uaXRvcmluZyBtb2JpbGUgZGF0YSBjb25uZWN0aXZpdHkuCisgICAgICogQmVnaW4gbW9uaXRvcmluZyBkYXRhIGNvbm5lY3Rpdml0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IGlzIHRoZSBjdXJyZW50IEFuZHJvaWQgY29udGV4dAorICAgICAqIEBwYXJhbSB0YXJnZXQgaXMgdGhlIEhhbmRlciB0byB3aGljaCB0byByZXR1cm4gdGhlIGV2ZW50cy4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydE1vbml0b3JpbmcoKSB7Ci0gICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPQotICAgICAgICAgICAgICAgIG5ldyBJbnRlbnRGaWx0ZXIoVGVsZXBob255SW50ZW50cy5BQ1RJT05fQU5ZX0RBVEFfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKTsKKyAgICBwdWJsaWMgdm9pZCBzdGFydE1vbml0b3JpbmcoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIHRhcmdldCkgeworICAgICAgICBtVGFyZ2V0ID0gdGFyZ2V0OworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisKKyAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9BTllfREFUQV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpOwogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFRlbGVwaG9ueUludGVudHMuQUNUSU9OX0RBVEFfQ09OTkVDVElPTl9GQUlMRUQpOwotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFRlbGVwaG9ueUludGVudHMuQUNUSU9OX1NFUlZJQ0VfU1RBVEVfQ0hBTkdFRCk7CiAKLSAgICAgICAgbVN0YXRlUmVjZWl2ZXIgPSBuZXcgTW9iaWxlRGF0YVN0YXRlUmVjZWl2ZXIoKTsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVN0YXRlUmVjZWl2ZXIsIGZpbHRlcik7Ci0gICAgICAgIGlmIChpbnRlbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIG1Nb2JpbGVEYXRhU3RhdGUgPSBnZXRNb2JpbGVEYXRhU3RhdGUoaW50ZW50KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSA9IFBob25lLkRhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobmV3IE1vYmlsZURhdGFTdGF0ZVJlY2VpdmVyKCksIGZpbHRlcik7CisgICAgICAgIG1Nb2JpbGVEYXRhU3RhdGUgPSBQaG9uZS5EYXRhU3RhdGUuRElTQ09OTkVDVEVEOwogICAgIH0KIAotICAgIHByaXZhdGUgUGhvbmUuRGF0YVN0YXRlIGdldE1vYmlsZURhdGFTdGF0ZShJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIFN0cmluZyBzdHIgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuU1RBVEVfS0VZKTsKLSAgICAgICAgaWYgKHN0ciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYXBuVHlwZUxpc3QgPQotICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRVNfS0VZKTsKLSAgICAgICAgICAgIGlmIChpc0FwblR5cGVJbmNsdWRlZChhcG5UeXBlTGlzdCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRW51bS52YWx1ZU9mKFBob25lLkRhdGFTdGF0ZS5jbGFzcywgc3RyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUGhvbmUuRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIElQIGFkZHJlc3NlcyBvZiB0aGUgRE5TIHNlcnZlcnMgYXZhaWxhYmxlIGZvciB0aGUgbW9iaWxlIGRhdGEKKyAgICAgKiBuZXR3b3JrIGludGVyZmFjZS4KKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBETlMgYWRkcmVzc2VzLCB3aXRoIG5vIGhvbGVzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREbnNQcm9wTmFtZXMoKSB7CisgICAgICAgIHJldHVybiBzRG5zUHJvcE5hbWVzOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0FwblR5cGVJbmNsdWRlZChTdHJpbmcgdHlwZUxpc3QpIHsKLSAgICAgICAgLyogY29tbWEgc2VwZXJhdGVkIGxpc3QgLSBzcGxpdCBhbmQgY2hlY2sgKi8KLSAgICAgICAgaWYgKHR5cGVMaXN0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcHVibGljIGJvb2xlYW4gaXNQcml2YXRlRG5zUm91dGVTZXQoKSB7CisgICAgICAgIHJldHVybiBtUHJpdmF0ZURuc1JvdXRlU2V0OworICAgIH0KIAotICAgICAgICBTdHJpbmdbXSBsaXN0ID0gdHlwZUxpc3Quc3BsaXQoIiwiKTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8IGxpc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuZXF1YWxzKGxpc3RbaV0sIG1BcG5UeXBlVG9XYXRjaEZvcikgfHwKLSAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZXF1YWxzKGxpc3RbaV0sIFBob25lLkFQTl9UWVBFX0FMTCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcHVibGljIHZvaWQgcHJpdmF0ZURuc1JvdXRlU2V0KGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gZW5hYmxlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgTmV0d29ya0luZm8gZ2V0TmV0d29ya0luZm8oKSB7CisgICAgICAgIHJldHVybiBtTmV0d29ya0luZm87CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREZWZhdWx0R2F0ZXdheUFkZHIoKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdEdhdGV3YXlBZGRyOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJvdXRlU2V0KCkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRSb3V0ZVNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZWZhdWx0Um91dGVTZXQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1EZWZhdWx0Um91dGVTZXQgPSBlbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgbm90IGltcGxlbWVudGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VXYWtlTG9jaygpIHsKICAgICB9CiAKICAgICBwcml2YXRlIGNsYXNzIE1vYmlsZURhdGFTdGF0ZVJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewotICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyIG1Db25uZWN0aXZpdHlNYW5hZ2VyOworICAgICAgICBJQ29ubmVjdGl2aXR5TWFuYWdlciBtQ29ubmVjdGl2aXR5TWFuYWdlcjsKKwogICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewotICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFRlbGVwaG9ueUludGVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICBBQ1RJT05fQU5ZX0RBVEFfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKSkgewotICAgICAgICAgICAgICAgICAgICBQaG9uZS5EYXRhU3RhdGUgc3RhdGUgPSBnZXRNb2JpbGVEYXRhU3RhdGUoaW50ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5TVEFURV9DSEFOR0VfUkVBU09OX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcG5OYW1lID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcG5UeXBlTGlzdCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9UWVBFU19LRVkpOwotICAgICAgICAgICAgICAgICAgICBtQXBuTmFtZSA9IGFwbk5hbWU7CisgICAgICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhUZWxlcGhvbnlJbnRlbnRzLgorICAgICAgICAgICAgICAgICAgICBBQ1RJT05fQU5ZX0RBVEFfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBhcG5UeXBlID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVfS0VZKTsKKyAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5lcXVhbHMoYXBuVHlwZSwgbUFwblR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlID0gRW51bS52YWx1ZU9mKFBob25lLkRhdGFTdGF0ZS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5TVEFURV9LRVkpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLlNUQVRFX0NIQU5HRV9SRUFTT05fS0VZKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYXBuTmFtZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9LRVkpOwogCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdW5hdmFpbGFibGUgPSBpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKFBob25lLk5FVFdPUktfVU5BVkFJTEFCTEVfS0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0SXNBdmFpbGFibGUoIWludGVudC5nZXRCb29sZWFuRXh0cmEoUGhvbmUuTkVUV09SS19VTkFWQUlMQUJMRV9LRVksCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpOwogCi0gICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGlzIHJlZ2FyZGxlc3Mgb2YgdGhlIGFwblR5cGVMaXN0LiAgSXQncyBhbGwgdGhlIHNhbWUgcmFkaW8vbmV0d29yawotICAgICAgICAgICAgICAgICAgICAvLyB1bmRlcm5lYXRoCi0gICAgICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZSghdW5hdmFpbGFibGUpOworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgbUFwblR5cGUgKyAiIFJlY2VpdmVkIHN0YXRlPSAiICsgc3RhdGUgKyAiLCBvbGQ9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSArICIsIHJlYXNvbj0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAocmVhc29uID09IG51bGwgPyAiKHVuc3BlY2lmaWVkKSIgOiByZWFzb24pKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcG5UeXBlSW5jbHVkZWQoYXBuVHlwZUxpc3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUVuYWJsZWQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBub3QgZW5hYmxlZCBidXQgdGhlIEFQTiBUeXBlIGlzIHN1cHBvcnRlZCBieSB0aGlzIGNvbm5lY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgcmVjb3JkIHRoZSBpbnRlcmZhY2UgbmFtZSBpZiBvbmUncyBwcm92aWRlZC4gIElmIHRoZSB1c2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHVybnMgb24gdGhpcyBuZXR3b3JrIHdlIHdpbGwgbmVlZCB0aGUgaW50ZXJmYWNlbmFtZSBidXQgd29uJ3QgZ2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBmcmVzaCBjb25uZWN0ZWQgbWVzc2FnZSAtIFRPRE8gZml4IHRoaXMgd2hlbiB3ZSBnZXQgcGVyLUFQTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJyZXBsYWNpbmcgb2xkIG1JbnRlcmZhY2VOYW1lICgiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJmYWNlTmFtZSArICIpIHdpdGggIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfSUZBQ0VfTkFNRV9LRVkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvciAiICsgbUFwblR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJmYWNlTmFtZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0lGQUNFX05BTUVfS0VZKTsKKyAgICAgICAgICAgICAgICBpZiAobU1vYmlsZURhdGFTdGF0ZSAhPSBzdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBtTW9iaWxlRGF0YVN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzVGVhcmRvd25SZXF1ZXN0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUZWFyZG93blJlcXVlc3RlZChmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgbUFwblR5cGUgKyAiIFJlY2VpdmVkIHN0YXRlPSAiICsgc3RhdGUgKyAiLCBvbGQ9ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb2JpbGVEYXRhU3RhdGUgKyAiLCByZWFzb249ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWFzb24gPT0gbnVsbCA/ICIodW5zcGVjaWZpZWQpIiA6IHJlYXNvbikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGFwblR5cGVMaXN0PSAiICsgYXBuVHlwZUxpc3QpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTW9iaWxlRGF0YVN0YXRlICE9IHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTW9iaWxlRGF0YVN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzVGVhcmRvd25SZXF1ZXN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRlYXJkb3duUmVxdWVzdGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVELCByZWFzb24sIGFwbk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZG9SZXNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0RlZmF1bHRPckhpcHJpID09IHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBkZWZhdWx0IGFuZCBoaXByaSBtdXN0IGdvIGRvd24gYmVmb3JlIHdlIHJlc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlVG9DaGVjayA9IChQaG9uZS5BUE5fVFlQRV9ERUZBVUxULmVxdWFscyhtQXBuVHlwZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRV9ISVBSSSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0aXZpdHlNYW5hZ2VyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpdml0eU1hbmFnZXIgPSBJQ29ubmVjdGl2aXR5TWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKGIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkRJU0NPTk5FQ1RFRCwgcmVhc29uLCBhcG5OYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkb1Jlc2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0RlZmF1bHRPckhpcHJpID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggZGVmYXVsdCBhbmQgaGlwcmkgbXVzdCBnbyBkb3duIGJlZm9yZSB3ZSByZXNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGVUb0NoZWNrID0gKFBob25lLkFQTl9UWVBFX0RFRkFVTFQuZXF1YWxzKG1BcG5UeXBlKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEVfSElQUkkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGl2aXR5TWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpdml0eU1hbmFnZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENvbm5lY3Rpdml0eU1hbmFnZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpdml0eU1hbmFnZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtJbmZvIGluZm8gPSBtQ29ubmVjdGl2aXR5TWFuYWdlci5nZXROZXR3b3JrSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlVG9DaGVjayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLmlzQ29ubmVjdGVkKCkgPT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVRvQ2hlY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLmlzQ29ubmVjdGVkKCkgPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb1Jlc2V0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBnbyBhaGVhZCB3aXRoIHRoZSByZXNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIHRyeWluZyB0byBjb250YWN0IENvbm5TZXJ2aWNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvUmVzZXQgJiYgbUludGVyZmFjZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzLnJlc2V0Q29ubmVjdGlvbnMobUludGVyZmFjZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbid0IGRvIHRoaXMgaGVyZSAtIENvbm5lY3Rpdml0eVNlcnZpY2UgbmVlZHMgaXQgdG8gY2xlYXIgc3R1ZmYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBvayB0aG91Z2ggLSBqdXN0IGxlYXZlIGl0IHRvIGJlIHJlZnJlc2hlZCBuZXh0IHRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY29ubmVjdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoREJHKSBMb2cuZChUQUcsICJjbGVhcmluZyBtSW50ZXJmYWNlTmFtZSBmb3IgIisgbUFwblR5cGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIiBhcyBpdCBESVNDT05ORUNURUQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tSW50ZXJmYWNlTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbURlZmF1bHRHYXRld2F5QWRkciA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkNPTk5FQ1RJTkcsIHJlYXNvbiwgYXBuTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1VTUEVOREVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuU1VTUEVOREVELCByZWFzb24sIGFwbk5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZU5hbWUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9JRkFDRV9OQU1FX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSW50ZXJmYWNlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDT05ORUNURUQgZXZlbnQgZGlkIG5vdCBzdXBwbHkgaW50ZXJmYWNlIG5hbWUuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlZmF1bHRHYXRld2F5QWRkciA9IGludGVudC5nZXRJbnRFeHRyYShQaG9uZS5EQVRBX0dBVEVXQVlfS0VZLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCwgcmVhc29uLCBhcG5OYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb1Jlc2V0ICYmIG1MaW5rUHJvcGVydGllcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpZmFjZSA9IG1MaW5rUHJvcGVydGllcy5nZXRJbnRlcmZhY2VOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZmFjZSAhPSBudWxsKSBOZXR3b3JrVXRpbHMucmVzZXRDb25uZWN0aW9ucyhpZmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBjaGVjayB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuJ3QgZG8gdGhpcyBoZXJlIC0gQ29ubmVjdGl2aXR5U2VydmljZSBuZWVkcyBpdCB0byBjbGVhciBzdHVmZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0J3Mgb2sgdGhvdWdoIC0ganVzdCBsZWF2ZSBpdCB0byBiZSByZWZyZXNoZWQgbmV4dCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY29ubmVjdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChEQkcpIExvZy5kKFRBRywgImNsZWFyaW5nIG1JbnRlcmZhY2VOYW1lIGZvciAiKyBtQXBuVHlwZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICIgYXMgaXQgRElTQ09OTkVDVEVEIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tSW50ZXJmYWNlTmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tRGVmYXVsdEdhdGV3YXlBZGRyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVElORywgcmVhc29uLCBhcG5OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1VTUEVOREVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5TVVNQRU5ERUQsIHJlYXNvbiwgYXBuTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGlua1Byb3BlcnRpZXMgPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGhvbmUuREFUQV9MSU5LX1BST1BFUlRJRVNfS0VZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUxpbmtQcm9wZXJ0aWVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ09OTkVDVEVEIGV2ZW50IGRpZCBub3Qgc3VwcGx5IGxpbmsgcHJvcGVydGllcy4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxpbmtQcm9wZXJ0aWVzID0gbmV3IExpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MaW5rQ2FwYWJpbGl0aWVzID0gaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBob25lLkRBVEFfTElOS19DQVBBQklMSVRJRVNfS0VZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUxpbmtDYXBhYmlsaXRpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDT05ORUNURUQgZXZlbnQgZGlkIG5vdCBzdXBwbHkgbGluayBjYXBhYmlsaXRpZXMuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MaW5rQ2FwYWJpbGl0aWVzID0gbmV3IExpbmtDYXBhYmlsaXRpZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCwgcmVhc29uLCBhcG5OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW50ZW50LmdldEFjdGlvbigpLgotICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWxzKFRlbGVwaG9ueUludGVudHMuQUNUSU9OX0RBVEFfQ09OTkVDVElPTl9GQUlMRUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuRkFJTFVSRV9SRUFTT05fS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFwbk5hbWUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgIiArIGludGVudC5nZXRBY3Rpb24oKSArICIgYnJvYWRjYXN0IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uID09IG51bGwgPyAiIiA6ICIoIiArIHJlYXNvbiArICIpIik7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5GQUlMRUQsIHJlYXNvbiwgYXBuTmFtZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIgdG0gPSBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKTsKLSAgICAgICAgICAgICAgICBzZXRSb2FtaW5nU3RhdHVzKHRtLmlzTmV0d29ya1JvYW1pbmcoKSk7Ci0gICAgICAgICAgICAgICAgc2V0U3VidHlwZSh0bS5nZXROZXR3b3JrVHlwZSgpLCB0bS5nZXROZXR3b3JrVHlwZU5hbWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGludGVudC5nZXRBY3Rpb24oKS4KKyAgICAgICAgICAgICAgICAgICAgZXF1YWxzKFRlbGVwaG9ueUludGVudHMuQUNUSU9OX0RBVEFfQ09OTkVDVElPTl9GQUlMRUQpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGFwblR5cGUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRV9LRVkpOworICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmVxdWFscyhhcG5UeXBlLCBtQXBuVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkZBSUxVUkVfUkVBU09OX0tFWSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGFwbk5hbWUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZKTsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIG1BcG5UeXBlICsgIlJlY2VpdmVkICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBicm9hZGNhc3QiICsgcmVhc29uID09IG51bGwgPyAiIiA6ICIoIiArIHJlYXNvbiArICIpIik7CisgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkZBSUxFRCwgcmVhc29uLCBhcG5OYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI3MiwzMyArMjcwLDcgQEAKICAgICAgKiBSZXBvcnQgd2hldGhlciBkYXRhIGNvbm5lY3Rpdml0eSBpcyBwb3NzaWJsZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKLSAgICAgICAgZ2V0UGhvbmVTZXJ2aWNlKGZhbHNlKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBJZiB0aGUgcGhvbmUgcHJvY2VzcyBoYXMgY3Jhc2hlZCBpbiB0aGUgcGFzdCwgd2UnbGwgZ2V0IGEKLSAgICAgICAgICogUmVtb3RlRXhjZXB0aW9uIGFuZCBuZWVkIHRvIHJlLXJlZmVyZW5jZSB0aGUgc2VydmljZS4KLSAgICAgICAgICovCi0gICAgICAgIGZvciAoaW50IHJldHJ5ID0gMDsgcmV0cnkgPCAyOyByZXRyeSsrKSB7Ci0gICAgICAgICAgICBpZiAobVBob25lU2VydmljZSA9PSBudWxsKSBicmVhazsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVBob25lU2VydmljZS5pc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBGaXJzdC10aW1lIGZhaWxlZCwgZ2V0IHRoZSBwaG9uZSBzZXJ2aWNlIGFnYWluCi0gICAgICAgICAgICAgICAgaWYgKHJldHJ5ID09IDApIGdldFBob25lU2VydmljZSh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogVGhlIG1vYmlsZSBkYXRhIG5ldHdvcmsgc3VidHlwZSBpbmRpY2F0ZXMgd2hhdCBnZW5lcmF0aW9uIG5ldHdvcmsgdGVjaG5vbG9neSBpcyBpbiBlZmZlY3QsCi0gICAgICogZS5nLiwgR1BSUywgRURHRSwgVU1UUywgZXRjLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TmV0d29ya1N1YnR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXROZXR3b3JrVHlwZSgpOworICAgICAgICByZXR1cm4gbU5ldHdvcmtJbmZvLmlzQXZhaWxhYmxlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNTAsNzAgKzMyMiw3NCBAQAogICAgIC8qKgogICAgICAqIFRlYXIgZG93biBtb2JpbGUgZGF0YSBjb25uZWN0aXZpdHksIGkuZS4sIGRpc2FibGUgdGhlIGFiaWxpdHkgdG8gY3JlYXRlCiAgICAgICogbW9iaWxlIGRhdGEgY29ubmVjdGlvbnMuCisgICAgICogVE9ETyAtIG1ha2UgYXN5bmMgYW5kIHJldHVybiBub3RoaW5nPwogICAgICAqLwotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHRlYXJkb3duKCkgewotICAgICAgICAvLyBzaW5jZSB3ZSB3b24ndCBnZXQgYSBub3RpZmljYXRpb24gY3VycmVudGx5IChUT0RPIC0gcGVyIEFQTiBub3RpZmljYXRpb25zKQotICAgICAgICAvLyB3ZSB3b24ndCBnZXQgYSBkaXNjb25uZWN0IG1lc3NhZ2UgdW50aWwgYWxsIEFQTidzIG9uIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24ncwotICAgICAgICAvLyBBUE4gbGlzdCBhcmUgZGlzYWJsZWQuICBUaGF0IG1lYW5zIHByaXZhdGVSb3V0ZXMgZm9yIEROUyBhbmQgc3VjaCB3aWxsIHJlbWFpbiBvbiAtCi0gICAgICAgIC8vIG5vdCBhIHByb2JsZW0gc2luY2UgdGhhdCdzIGFsbCBzaGFyZWQgd2l0aCB3aGF0ZXZlciBvdGhlciBBUE4gaXMgc3RpbGwgb24sIGJ1dAotICAgICAgICAvLyB1Z2x5LgogICAgICAgICBzZXRUZWFyZG93blJlcXVlc3RlZCh0cnVlKTsKICAgICAgICAgcmV0dXJuIChzZXRFbmFibGVBcG4obUFwblR5cGUsIGZhbHNlKSAhPSBQaG9uZS5BUE5fUkVRVUVTVF9GQUlMRUQpOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZGV0YWlsZWQgc3RhdGUgb2YgYSBuZXR3b3JrLCBhbmQgaWYgaXQgaXMgYQorICAgICAqIGNoYW5nZSBmcm9tIHRoZSBwcmV2aW91cyBzdGF0ZSwgc2VuZCBhIG5vdGlmaWNhdGlvbiB0bworICAgICAqIGFueSBsaXN0ZW5lcnMuCisgICAgICogQHBhcmFtIHN0YXRlIHRoZSBuZXcgQHtjb2RlIERldGFpbGVkU3RhdGV9CisgICAgICogQHBhcmFtIHJlYXNvbiBhIHtAY29kZSBTdHJpbmd9IGluZGljYXRpbmcgYSByZWFzb24gZm9yIHRoZSBzdGF0ZSBjaGFuZ2UsCisgICAgICogaWYgb25lIHdhcyBzdXBwbGllZC4gTWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcGFyYW0gZXh0cmFJbmZvIG9wdGlvbmFsIHtAY29kZSBTdHJpbmd9IHByb3ZpZGluZyBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdGUgY2hhbmdlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldERldGFpbGVkU3RhdGUoTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBzdGF0ZSwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGV4dHJhSW5mbykgeworICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJzZXREZXRhaWxlZCBzdGF0ZSwgb2xkID0iCisgICAgICAgICAgICAgICAgKyBtTmV0d29ya0luZm8uZ2V0RGV0YWlsZWRTdGF0ZSgpICsgIiBhbmQgbmV3IHN0YXRlPSIgKyBzdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZSAhPSBtTmV0d29ya0luZm8uZ2V0RGV0YWlsZWRTdGF0ZSgpKSB7CisgICAgICAgICAgICBib29sZWFuIHdhc0Nvbm5lY3RpbmcgPSAobU5ldHdvcmtJbmZvLmdldFN0YXRlKCkgPT0gTmV0d29ya0luZm8uU3RhdGUuQ09OTkVDVElORyk7CisgICAgICAgICAgICBTdHJpbmcgbGFzdFJlYXNvbiA9IG1OZXR3b3JrSW5mby5nZXRSZWFzb24oKTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBJZiBhIHJlYXNvbiB3YXMgc3VwcGxpZWQgd2hlbiB0aGUgQ09OTkVDVElORyBzdGF0ZSB3YXMgZW50ZXJlZCwgYW5kIG5vCisgICAgICAgICAgICAgKiByZWFzb24gd2FzIHN1cHBsaWVkIGZvciBlbnRlcmluZyB0aGUgQ09OTkVDVEVEIHN0YXRlLCB0aGVuIHJldGFpbiB0aGUKKyAgICAgICAgICAgICAqIHJlYXNvbiB0aGF0IHdhcyBzdXBwbGllZCB3aGVuIGdvaW5nIHRvIENPTk5FQ1RJTkcuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICh3YXNDb25uZWN0aW5nICYmIHN0YXRlID09IE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUuQ09OTkVDVEVEICYmIHJlYXNvbiA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIGxhc3RSZWFzb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZWFzb24gPSBsYXN0UmVhc29uOworICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldERldGFpbGVkU3RhdGUoc3RhdGUsIHJlYXNvbiwgZXh0cmFJbmZvKTsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX1NUQVRFX0NIQU5HRUQsIG1OZXR3b3JrSW5mbyk7CisgICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUZWFyZG93blJlcXVlc3RlZChib29sZWFuIGlzUmVxdWVzdGVkKSB7CisgICAgICAgIG1UZWFyZG93blJlcXVlc3RlZCA9IGlzUmVxdWVzdGVkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVGVhcmRvd25SZXF1ZXN0ZWQoKSB7CisgICAgICAgIHJldHVybiBtVGVhcmRvd25SZXF1ZXN0ZWQ7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmUtZW5hYmxlIG1vYmlsZSBkYXRhIGNvbm5lY3Rpdml0eSBhZnRlciBhIHtAbGluayAjdGVhcmRvd24oKX0uCisgICAgICogVE9ETyAtIG1ha2UgYXN5bmMgYW5kIGFsd2F5cyBnZXQgYSBub3RpZmljYXRpb24/CiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gcmVjb25uZWN0KCkgeworICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7IC8vY29ubmVjdGVkIG9yIGV4cGVjdCB0byBiZT8KICAgICAgICAgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoZmFsc2UpOwogICAgICAgICBzd2l0Y2ggKHNldEVuYWJsZUFwbihtQXBuVHlwZSwgdHJ1ZSkpIHsKICAgICAgICAgICAgIGNhc2UgUGhvbmUuQVBOX0FMUkVBRFlfQUNUSVZFOgotICAgICAgICAgICAgICAgIC8vIFRPRE8gLSByZW1vdmUgdGhpcyB3aGVuIHdlIGdldCBwZXItYXBuIG5vdGlmaWNhdGlvbnMKLSAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBzZXQgc2VsZiB0byBDT05ORUNUSU5HIHNvIHRoZSBiZWxvdyBtZXNzYWdlIGlzIGhhbmRsZWQuCi0gICAgICAgICAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSA9IFBob25lLkRhdGFTdGF0ZS5DT05ORUNUSU5HOwotICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5DT05ORUNUSU5HLCBQaG9uZS5SRUFTT05fQVBOX0NIQU5HRUQsIG51bGwpOwotICAgICAgICAgICAgICAgIC8vc2VuZCBvdXQgYSBjb25uZWN0ZWQgbWVzc2FnZQotICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFRlbGVwaG9ueUludGVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICBBQ1RJT05fQU5ZX0RBVEFfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuU1RBVEVfS0VZLCBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVEVELnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5TVEFURV9DSEFOR0VfUkVBU09OX0tFWSwgUGhvbmUuUkVBU09OX0FQTl9DSEFOR0VEKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRVNfS0VZLCBtQXBuVHlwZVRvV2F0Y2hGb3IpOwotICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0FQTl9LRVksIG1BcG5OYW1lKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9JRkFDRV9OQU1FX0tFWSwgbUludGVyZmFjZU5hbWUpOwotICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5ORVRXT1JLX1VOQVZBSUxBQkxFX0tFWSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGlmIChtU3RhdGVSZWNlaXZlciAhPSBudWxsKSBtU3RhdGVSZWNlaXZlci5vblJlY2VpdmUobUNvbnRleHQsIGludGVudCk7CisgICAgICAgICAgICAgICAgcmV0VmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBQaG9uZS5BUE5fUkVRVUVTVF9TVEFSVEVEOgotICAgICAgICAgICAgICAgIG1FbmFibGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIGRvIGFueXRoaW5nIC0gd2UncmUgYWxyZWFkeSBkdWUgc29tZSBzdGF0dXMgdXBkYXRlIGludGVudHMKKyAgICAgICAgICAgICAgICByZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFBob25lLkFQTl9SRVFVRVNUX0ZBSUxFRDoKLSAgICAgICAgICAgICAgICBpZiAobVBob25lU2VydmljZSA9PSBudWxsICYmIG1BcG5UeXBlID09IFBob25lLkFQTl9UWVBFX0RFRkFVTFQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gb24gc3RhcnR1cCB3ZSBtYXkgdHJ5IHRvIHRhbGsgdG8gdGhlIHBob25lIGJlZm9yZSBpdCdzIHJlYWR5Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBwaG9uZSB3aWxsIGNvbWUgdXAgZW5hYmxlZCwgZ28gd2l0aCB0aGF0LgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIC0gdGhpcyBhbHNvIGNvbWVzIHVwIG9uIHRlbGVwaG9ueSBjcmFzaDogaWYgd2UgdGhpbmsgbW9iaWxlIGRhdGEgaXMKLSAgICAgICAgICAgICAgICAgICAgLy8gb2ZmIGFuZCB0aGUgdGVsZXBob255IHN0dWZmIGNyYXNoZXMgYW5kIGhhcyB0byByZXN0YXJ0IGl0IHdpbGwgY29tZSB1cAotICAgICAgICAgICAgICAgICAgICAvLyBlbmFibGVkIChtYWtpbmcgYSBkYXRhIGNvbm5lY3Rpb24pLiAgV2Ugd2lsbCB0aGVuIGJlIG91dCBvZiBzeW5jLgotICAgICAgICAgICAgICAgICAgICAvLyBBIHBvc3NpYmxlIHNvbHV0aW9uIGlzIGEgYnJvYWRjYXN0IHdoZW4gdGVsZXBob255IHJlc3RhcnRzLgotICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gZWxzZSBmYWxsIHRocm91Z2gKICAgICAgICAgICAgIGNhc2UgUGhvbmUuQVBOX1RZUEVfTk9UX0FWQUlMQUJMRToKLSAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGlzIGFsd2F5cyBhdmFpbGFibGUsIGJ1dCBtYXkgYmUgb2ZmIGR1ZSB0bwotICAgICAgICAgICAgICAgIC8vIEFpcnBsYW5lTW9kZSBvciBFLUNhbGwgb3Igd2hhdGV2ZXIuLgotICAgICAgICAgICAgICAgIGlmIChtQXBuVHlwZSAhPSBQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBpbiByZWNvbm5lY3QgLSB1bmV4cGVjdGVkIHJlc3BvbnNlLiIpOwotICAgICAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1FbmFibGVkOworICAgICAgICByZXR1cm4gcmV0VmFsdWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC00ODYsMjUgKzQ2Miw2IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBFbnN1cmUgdGhhdCBhIG5ldHdvcmsgcm91dGUgZXhpc3RzIHRvIGRlbGl2ZXIgdHJhZmZpYyB0byB0aGUgc3BlY2lmaWVkCi0gICAgICogaG9zdCB2aWEgdGhlIG1vYmlsZSBkYXRhIG5ldHdvcmsuCi0gICAgICogQHBhcmFtIGhvc3RBZGRyZXNzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSByb3V0ZSBpcyBkZXNpcmVkLAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9uIHN1Y2Nlc3MsIHtAY29kZSBmYWxzZX0gb24gZmFpbHVyZQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RSb3V0ZVRvSG9zdChJbmV0QWRkcmVzcyBob3N0QWRkcmVzcykgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJSZXF1ZXN0ZWQgaG9zdCByb3V0ZSB0byAiICsgaG9zdEFkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKSArCi0gICAgICAgICAgICAgICAgICAgICIgZm9yICIgKyBtQXBuVHlwZSArICIoIiArIG1JbnRlcmZhY2VOYW1lICsgIikiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUludGVyZmFjZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIE5ldHdvcmtVdGlscy5hZGRIb3N0Um91dGUobUludGVyZmFjZU5hbWUsIGhvc3RBZGRyZXNzLCBudWxsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIk1vYmlsZSBkYXRhIHN0YXRlOiAiKTsKQEAgLTU2Niw0ICs1MjMsMTggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRlVHJhY2tlciNnZXRMaW5rUHJvcGVydGllcygpCisgICAgICovCisgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gbmV3IExpbmtQcm9wZXJ0aWVzKG1MaW5rUHJvcGVydGllcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdGVUcmFja2VyI2dldExpbmtDYXBhYmlsaXRpZXMoKQorICAgICAqLworICAgIHB1YmxpYyBMaW5rQ2FwYWJpbGl0aWVzIGdldExpbmtDYXBhYmlsaXRpZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgTGlua0NhcGFiaWxpdGllcyhtTGlua0NhcGFiaWxpdGllcyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtJbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya0luZm8uamF2YQppbmRleCA2NDljYjhjLi41ZjVlMTFjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya0luZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya0luZm8uamF2YQpAQCAtOTcsNyArOTcsNyBAQAogICAgICAgICBzdGF0ZU1hcC5wdXQoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQsIFN0YXRlLkRJU0NPTk5FQ1RFRCk7CiAgICAgICAgIHN0YXRlTWFwLnB1dChEZXRhaWxlZFN0YXRlLkZBSUxFRCwgU3RhdGUuRElTQ09OTkVDVEVEKTsKICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIGludCBtTmV0d29ya1R5cGU7CiAgICAgcHJpdmF0ZSBpbnQgbVN1YnR5cGU7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbVR5cGVOYW1lOwpAQCAtMTIxLDcgKzEyMSwxMCBAQAogICAgICAqLwogICAgIHB1YmxpYyBOZXR3b3JrSW5mbyhpbnQgdHlwZSkge30KIAotICAgIE5ldHdvcmtJbmZvKGludCB0eXBlLCBpbnQgc3VidHlwZSwgU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgc3VidHlwZU5hbWUpIHsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBOZXR3b3JrSW5mbyhpbnQgdHlwZSwgaW50IHN1YnR5cGUsIFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHN1YnR5cGVOYW1lKSB7CiAgICAgICAgIGlmICghQ29ubmVjdGl2aXR5TWFuYWdlci5pc05ldHdvcmtUeXBlVmFsaWQodHlwZSkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgbmV0d29yayB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgIH0KQEAgLTE0MSw3ICsxNDQsOSBAQAogICAgICAqIEByZXR1cm4gdGhlIG5ldHdvcmsgdHlwZQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1OZXR3b3JrVHlwZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbU5ldHdvcmtUeXBlOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNTAsMTIgKzE1NSwxNiBAQAogICAgICAqIEByZXR1cm4gdGhlIG5ldHdvcmsgc3VidHlwZQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0U3VidHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TdWJ0eXBlOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3VidHlwZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHZvaWQgc2V0U3VidHlwZShpbnQgc3VidHlwZSwgU3RyaW5nIHN1YnR5cGVOYW1lKSB7Ci0gICAgICAgIG1TdWJ0eXBlID0gc3VidHlwZTsKLSAgICAgICAgbVN1YnR5cGVOYW1lID0gc3VidHlwZU5hbWU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbVN1YnR5cGUgPSBzdWJ0eXBlOworICAgICAgICAgICAgbVN1YnR5cGVOYW1lID0gc3VidHlwZU5hbWU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE2NCw3ICsxNzMsOSBAQAogICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5ldHdvcmsgdHlwZQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtVHlwZU5hbWU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1UeXBlTmFtZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTcyLDcgKzE4Myw5IEBACiAgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbmV0d29yayBzdWJ0eXBlCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRTdWJ0eXBlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TdWJ0eXBlTmFtZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVN1YnR5cGVOYW1lOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xODUsNyArMTk4LDkgQEAKICAgICAgKiBvZiBiZWluZyBlc3RhYmxpc2hlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWRPckNvbm5lY3RpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtU3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEIHx8IG1TdGF0ZSA9PSBTdGF0ZS5DT05ORUNUSU5HOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEIHx8IG1TdGF0ZSA9PSBTdGF0ZS5DT05ORUNUSU5HOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xOTQsNyArMjA5LDkgQEAKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBuZXR3b3JrIGNvbm5lY3Rpdml0eSBleGlzdHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkgewotICAgICAgICByZXR1cm4gbVN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRDsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjEwLDcgKzIyNyw5IEBACiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG5ldHdvcmsgaXMgYXZhaWxhYmxlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKCkgewotICAgICAgICByZXR1cm4gbUlzQXZhaWxhYmxlOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtSXNBdmFpbGFibGU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTIyMCw3ICsyMzksOSBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SXNBdmFpbGFibGUoYm9vbGVhbiBpc0F2YWlsYWJsZSkgewotICAgICAgICBtSXNBdmFpbGFibGUgPSBpc0F2YWlsYWJsZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtSXNBdmFpbGFibGUgPSBpc0F2YWlsYWJsZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjMxLDcgKzI1Miw5IEBACiAgICAgICogb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRmFpbG92ZXIoKSB7Ci0gICAgICAgIHJldHVybiBtSXNGYWlsb3ZlcjsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbUlzRmFpbG92ZXI7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTI0MSw3ICsyNjQsOSBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RmFpbG92ZXIoYm9vbGVhbiBpc0ZhaWxvdmVyKSB7Ci0gICAgICAgIG1Jc0ZhaWxvdmVyID0gaXNGYWlsb3ZlcjsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtSXNGYWlsb3ZlciA9IGlzRmFpbG92ZXI7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTI1MSwxMSArMjc2LDE1IEBACiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgcm9hbWluZyBpcyBpbiBlZmZlY3QsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzUm9hbWluZygpIHsKLSAgICAgICAgcmV0dXJuIG1Jc1JvYW1pbmc7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1Jc1JvYW1pbmc7CisgICAgICAgIH0KICAgICB9CiAKICAgICB2b2lkIHNldFJvYW1pbmcoYm9vbGVhbiBpc1JvYW1pbmcpIHsKLSAgICAgICAgbUlzUm9hbWluZyA9IGlzUm9hbWluZzsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtSXNSb2FtaW5nID0gaXNSb2FtaW5nOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNjMsNyArMjkyLDkgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBjb2Fyc2UtZ3JhaW5lZCBzdGF0ZQogICAgICAqLwogICAgIHB1YmxpYyBTdGF0ZSBnZXRTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TdGF0ZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVN0YXRlOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNzEsNyArMzAyLDkgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBmaW5lLWdyYWluZWQgc3RhdGUKICAgICAgKi8KICAgICBwdWJsaWMgRGV0YWlsZWRTdGF0ZSBnZXREZXRhaWxlZFN0YXRlKCkgewotICAgICAgICByZXR1cm4gbURldGFpbGVkU3RhdGU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1EZXRhaWxlZFN0YXRlOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yODEsMTIgKzMxNCwxNSBAQAogICAgICAqIGlmIG9uZSB3YXMgc3VwcGxpZWQuIE1heSBiZSB7QGNvZGUgbnVsbH0uCiAgICAgICogQHBhcmFtIGV4dHJhSW5mbyBhbiBvcHRpb25hbCB7QGNvZGUgU3RyaW5nfSBwcm92aWRpbmcgYWRkZGl0aW9uYWwgbmV0d29yayBzdGF0ZQogICAgICAqIGluZm9ybWF0aW9uIHBhc3NlZCB1cCBmcm9tIHRoZSBsb3dlciBuZXR3b3JraW5nIGxheWVycy4KKyAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlIGRldGFpbGVkU3RhdGUsIFN0cmluZyByZWFzb24sIFN0cmluZyBleHRyYUluZm8pIHsKLSAgICAgICAgdGhpcy5tRGV0YWlsZWRTdGF0ZSA9IGRldGFpbGVkU3RhdGU7Ci0gICAgICAgIHRoaXMubVN0YXRlID0gc3RhdGVNYXAuZ2V0KGRldGFpbGVkU3RhdGUpOwotICAgICAgICB0aGlzLm1SZWFzb24gPSByZWFzb247Ci0gICAgICAgIHRoaXMubUV4dHJhSW5mbyA9IGV4dHJhSW5mbzsKKyAgICBwdWJsaWMgdm9pZCBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUgZGV0YWlsZWRTdGF0ZSwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGV4dHJhSW5mbykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHRoaXMubURldGFpbGVkU3RhdGUgPSBkZXRhaWxlZFN0YXRlOworICAgICAgICAgICAgdGhpcy5tU3RhdGUgPSBzdGF0ZU1hcC5nZXQoZGV0YWlsZWRTdGF0ZSk7CisgICAgICAgICAgICB0aGlzLm1SZWFzb24gPSByZWFzb247CisgICAgICAgICAgICB0aGlzLm1FeHRyYUluZm8gPSBleHRyYUluZm87CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTI5NSw3ICszMzEsOSBAQAogICAgICAqIEByZXR1cm4gdGhlIHJlYXNvbiBmb3IgZmFpbHVyZSwgb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRSZWFzb24oKSB7Ci0gICAgICAgIHJldHVybiBtUmVhc29uOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtUmVhc29uOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMDUsMjAgKzM0MywyNCBAQAogICAgICAqIEByZXR1cm4gdGhlIGV4dHJhIGluZm9ybWF0aW9uLCBvciBudWxsIGlmIG5vdCBhdmFpbGFibGUKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEV4dHJhSW5mbygpIHsKLSAgICAgICAgcmV0dXJuIG1FeHRyYUluZm87CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1FeHRyYUluZm87CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigiTmV0d29ya0luZm86ICIpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgidHlwZTogIikuYXBwZW5kKGdldFR5cGVOYW1lKCkpLmFwcGVuZCgiWyIpLmFwcGVuZChnZXRTdWJ0eXBlTmFtZSgpKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIl0sIHN0YXRlOiAiKS5hcHBlbmQobVN0YXRlKS5hcHBlbmQoIi8iKS5hcHBlbmQobURldGFpbGVkU3RhdGUpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCByZWFzb246ICIpLmFwcGVuZChtUmVhc29uID09IG51bGwgPyAiKHVuc3BlY2lmaWVkKSIgOiBtUmVhc29uKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgZXh0cmE6ICIpLmFwcGVuZChtRXh0cmFJbmZvID09IG51bGwgPyAiKG5vbmUpIiA6IG1FeHRyYUluZm8pLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCByb2FtaW5nOiAiKS5hcHBlbmQobUlzUm9hbWluZykuCi0gICAgICAgICAgICAgICAgYXBwZW5kKCIsIGZhaWxvdmVyOiAiKS5hcHBlbmQobUlzRmFpbG92ZXIpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCBpc0F2YWlsYWJsZTogIikuYXBwZW5kKG1Jc0F2YWlsYWJsZSk7Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoIk5ldHdvcmtJbmZvOiAiKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJ0eXBlOiAiKS5hcHBlbmQoZ2V0VHlwZU5hbWUoKSkuYXBwZW5kKCJbIikuYXBwZW5kKGdldFN1YnR5cGVOYW1lKCkpLgorICAgICAgICAgICAgYXBwZW5kKCJdLCBzdGF0ZTogIikuYXBwZW5kKG1TdGF0ZSkuYXBwZW5kKCIvIikuYXBwZW5kKG1EZXRhaWxlZFN0YXRlKS4KKyAgICAgICAgICAgIGFwcGVuZCgiLCByZWFzb246ICIpLmFwcGVuZChtUmVhc29uID09IG51bGwgPyAiKHVuc3BlY2lmaWVkKSIgOiBtUmVhc29uKS4KKyAgICAgICAgICAgIGFwcGVuZCgiLCBleHRyYTogIikuYXBwZW5kKG1FeHRyYUluZm8gPT0gbnVsbCA/ICIobm9uZSkiIDogbUV4dHJhSW5mbykuCisgICAgICAgICAgICBhcHBlbmQoIiwgcm9hbWluZzogIikuYXBwZW5kKG1Jc1JvYW1pbmcpLgorICAgICAgICAgICAgYXBwZW5kKCIsIGZhaWxvdmVyOiAiKS5hcHBlbmQobUlzRmFpbG92ZXIpLgorICAgICAgICAgICAgYXBwZW5kKCIsIGlzQXZhaWxhYmxlOiAiKS5hcHBlbmQobUlzQXZhaWxhYmxlKTsKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTMzNCwxNyArMzc2LDE5IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgZGVzdC53cml0ZUludChtTmV0d29ya1R5cGUpOwotICAgICAgICBkZXN0LndyaXRlSW50KG1TdWJ0eXBlKTsKLSAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtVHlwZU5hbWUpOwotICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TdWJ0eXBlTmFtZSk7Ci0gICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVN0YXRlLm5hbWUoKSk7Ci0gICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobURldGFpbGVkU3RhdGUubmFtZSgpKTsKLSAgICAgICAgZGVzdC53cml0ZUludChtSXNGYWlsb3ZlciA/IDEgOiAwKTsKLSAgICAgICAgZGVzdC53cml0ZUludChtSXNBdmFpbGFibGUgPyAxIDogMCk7Ci0gICAgICAgIGRlc3Qud3JpdGVJbnQobUlzUm9hbWluZyA/IDEgOiAwKTsKLSAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtUmVhc29uKTsKLSAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtRXh0cmFJbmZvKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KG1OZXR3b3JrVHlwZSk7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KG1TdWJ0eXBlKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVR5cGVOYW1lKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVN1YnR5cGVOYW1lKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVN0YXRlLm5hbWUoKSk7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1EZXRhaWxlZFN0YXRlLm5hbWUoKSk7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KG1Jc0ZhaWxvdmVyID8gMSA6IDApOworICAgICAgICAgICAgZGVzdC53cml0ZUludChtSXNBdmFpbGFibGUgPyAxIDogMCk7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KG1Jc1JvYW1pbmcgPyAxIDogMCk7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1SZWFzb24pOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtRXh0cmFJbmZvKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0ZVRyYWNrZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdGVUcmFja2VyLmphdmEKaW5kZXggYzE2MWYzYS4uOGFmZGNlZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0ZVRyYWNrZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRlVHJhY2tlci5qYXZhCkBAIC0xNiwzNjcgKzE2LDEyOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmV0OwogCi1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiAKIC8qKgotICogRWFjaCBzdWJjbGFzcyBvZiB0aGlzIGNsYXNzIGtlZXBzIHRyYWNrIG9mIHRoZSBzdGF0ZSBvZiBjb25uZWN0aXZpdHkKLSAqIG9mIGEgbmV0d29yayBpbnRlcmZhY2UuIEFsbCBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgYSBuZXR3b3JrIHNob3VsZAotICogYmUga2VwdCBpbiBhIFRyYWNrZXIgY2xhc3MuIFRoaXMgc3VwZXJjbGFzcyBtYW5hZ2VzIHRoZQotICogbmV0d29yay10eXBlLWluZGVwZW5kZW50IGFzcGVjdHMgb2YgbmV0d29yayBzdGF0ZS4KKyAqIEludGVyZmFjZSBwcm92aWRlcyB0aGUge0BsaW5rIGNvbS5hbmRyb2lkLnNlcnZlci5Db25uZWN0aXZpdHlTZXJ2aWNlfQorICogd2l0aCB0aHJlZSBzZXJ2aWNlcy4gRXZlbnRzIHRvIHRoZSBDb25uZWN0aXZpdHlTZXJ2aWNlIHdoZW4KKyAqIGNoYW5nZXMgb2NjdXIsIGFuIEFQSSBmb3IgY29udHJvbGxpbmcgdGhlIG5ldHdvcmsgYW5kIHN0b3JhZ2UKKyAqIGZvciBuZXR3b3JrIHNwZWNpZmljIGluZm9ybWF0aW9uLgorICoKKyAqIFRoZSBDb25uZWN0aXZpdHkgd2lsbCBjYWxsIHN0YXJ0TW9uaXRvcmluZyBiZWZvcmUgYW55IG90aGVyCisgKiBtZXRob2QgaXMgY2FsbGVkLgogICoKICAqIHtAaGlkZX0KICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5ldHdvcmtTdGF0ZVRyYWNrZXIgZXh0ZW5kcyBIYW5kbGVyIHsKK3B1YmxpYyBpbnRlcmZhY2UgTmV0d29ya1N0YXRlVHJhY2tlciB7CiAKLSAgICBwcm90ZWN0ZWQgTmV0d29ya0luZm8gbU5ldHdvcmtJbmZvOwotICAgIHByb3RlY3RlZCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByb3RlY3RlZCBIYW5kbGVyIG1UYXJnZXQ7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBtSW50ZXJmYWNlTmFtZTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gbURuc1Byb3BOYW1lczsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVByaXZhdGVEbnNSb3V0ZVNldDsKLSAgICBwcm90ZWN0ZWQgaW50IG1EZWZhdWx0R2F0ZXdheUFkZHI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1UZWFyZG93blJlcXVlc3RlZDsKLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gREJHID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOZXR3b3JrU3RhdGVUcmFja2VyIjsKKyAgICAvKioKKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogRXZlbnQgSW50ZXJmYWNlIGJhY2sgdG8gQ29ubmVjdGl2aXR5U2VydmljZS4KKyAgICAgKgorICAgICAqIFRoZSBldmVudHMgdGhhdCBhcmUgdG8gYmUgc2VudCBiYWNrIHRvIHRoZSBIYW5kbGVyIHBhc3NlZAorICAgICAqIHRvIHN0YXJ0TW9uaXRvcmluZyB3aGVuIHRoZSBwYXJ0aWN1bGFyIGV2ZW50IG9jY3Vycy4KKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICovCiAKICAgICAvLyBTaGFyZSB0aGUgZXZlbnQgc3BhY2Ugd2l0aCBDb25uZWN0aXZpdHlTZXJ2aWNlICh3aGljaCB3ZSBjYW4ndCBzZWUsIGJ1dAogICAgIC8vIG11c3Qgc2VuZCBldmVudHMgdG8pLiAgSWYgeW91IGNoYW5nZSB0aGVzZSwgY2hhbmdlIENvbm5lY3Rpdml0eVNlcnZpY2UKICAgICAvLyB0b28uCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9ORVRXT1JLX1NUQVRFX1RSQUNLRVJfRVZFTlQgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTkVUV09SS19TVEFURV9UUkFDS0VSX0VWRU5UID0gMTAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTUlOX05FVFdPUktfU1RBVEVfVFJBQ0tFUl9FVkVOVCA9IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBNQVhfTkVUV09SS19TVEFURV9UUkFDS0VSX0VWRU5UID0gMTAwOwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU1RBVEVfQ0hBTkdFRCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU0NBTl9SRVNVTFRTX0FWQUlMQUJMRSA9IDI7CiAgICAgLyoqCi0gICAgICogYXJnMTogMSB0byBzaG93LCAwIHRvIGhpZGUKLSAgICAgKiBhcmcyOiBJRCBvZiB0aGUgbm90aWZpY2F0aW9uCi0gICAgICogb2JqOiBOb3RpZmljYXRpb24gKGlmIHNob3dpbmcpCisgICAgICogVGhlIG5ldHdvcmsgc3RhdGUgaGFzIGNoYW5nZWQgYW5kIHRoZSBOZXR3b3JrSW5mbyBvYmplY3QKKyAgICAgKiBjb250YWlucyB0aGUgbmV3IHN0YXRlLgorICAgICAqCisgICAgICogbXNnLndoYXQgPSBFVkVOVF9TVEFURV9DSEFOR0VECisgICAgICogbXNnLm9iaiA9IE5ldHdvcmtJbmZvIG9iamVjdAogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX05PVElGSUNBVElPTl9DSEFOR0VEID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9DT05GSUdVUkFUSU9OX0NIQU5HRUQgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1JPQU1JTkdfQ0hBTkdFRCA9IDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTkVUV09SS19TVUJUWVBFX0NIQU5HRUQgPSA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NUQVRFX0NIQU5HRUQgPSAxOwogCi0gICAgcHVibGljIE5ldHdvcmtTdGF0ZVRyYWNrZXIoQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgSGFuZGxlciB0YXJnZXQsCi0gICAgICAgICAgICBpbnQgbmV0d29ya1R5cGUsCi0gICAgICAgICAgICBpbnQgc3ViVHlwZSwKLSAgICAgICAgICAgIFN0cmluZyB0eXBlTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBzdWJ0eXBlTmFtZSkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7Ci0gICAgICAgIG1UZWFyZG93blJlcXVlc3RlZCA9IGZhbHNlOworICAgIC8qKgorICAgICAqIG1zZy53aGF0ID0gRVZFTlRfQ09ORklHVVJBVElPTl9DSEFOR0VECisgICAgICogbXNnLm9iaiA9IE5ldHdvcmtJbmZvIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCA9IDM7CiAKLSAgICAgICAgdGhpcy5tTmV0d29ya0luZm8gPSBuZXcgTmV0d29ya0luZm8obmV0d29ya1R5cGUsIHN1YlR5cGUsIHR5cGVOYW1lLCBzdWJ0eXBlTmFtZSk7Ci0gICAgfQorICAgIC8qKgorICAgICAqIG1zZy53aGF0ID0gRVZFTlRfUkVTVE9SRV9ERUZBVUxUX05FVFdPUksKKyAgICAgKiBtc2cub2JqID0gRmVhdHVyZVVzZXIgb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUkVTVE9SRV9ERUZBVUxUX05FVFdPUksgPSA2OwogCi0gICAgcHVibGljIE5ldHdvcmtJbmZvIGdldE5ldHdvcmtJbmZvKCkgewotICAgICAgICByZXR1cm4gbU5ldHdvcmtJbmZvOwotICAgIH0KKyAgICAvKioKKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ29udHJvbCBJbnRlcmZhY2UKKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICovCisgICAgLyoqCisgICAgICogQmVnaW4gbW9uaXRvcmluZyBkYXRhIGNvbm5lY3Rpdml0eS4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgdGhlIGZpcnN0IG1ldGhvZCBjYWxsZWQgd2hlbiB0aGlzIGludGVyZmFjZSBpcyB1c2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgaXMgdGhlIGN1cnJlbnQgQW5kcm9pZCBjb250ZXh0CisgICAgICogQHBhcmFtIHRhcmdldCBpcyB0aGUgSGFuZGVyIHRvIHdoaWNoIHRvIHJldHVybiB0aGUgZXZlbnRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZyhDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgdGFyZ2V0KTsKKworICAgIC8qKgorICAgICAqIEZldGNoIE5ldHdvcmtJbmZvIGZvciB0aGUgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyBOZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbygpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBMaW5rUHJvcGVydGllcyBmb3IgdGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgY29weSBvZiB0aGUgTGlua1Byb3BlcnRpZXMsIGlzIG5ldmVyIG51bGwuCisgICAgICovCisgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKCk7CisKKyAgICAvKioKKyAgICAgKiBBIGNhcGFiaWxpdHkgaXMgYW4gSW50ZWdlci9TdHJpbmcgcGFpciwgdGhlIGNhcGFiaWxpdGllcworICAgICAqIGFyZSBkZWZpbmVkIGluIHRoZSBjbGFzcyBMaW5rU29ja2V0I0tleS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoaXMgY29ubmVjdGlvbnMgY2FwYWJpbGl0aWVzLCBtYXkgYmUgZW1wdHkgYnV0IG5ldmVyIG51bGwuCisgICAgICovCisgICAgcHVibGljIExpbmtDYXBhYmlsaXRpZXMgZ2V0TGlua0NhcGFiaWxpdGllcygpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBzeXN0ZW0gcHJvcGVydGllcyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGNwIGJ1ZmZlciBzaXplcwogICAgICAqIGZvciB0aGlzIG5ldHdvcmsuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUY3BCdWZmZXJTaXplc1Byb3BOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIElQIGFkZHJlc3NlcyBvZiB0aGUgRE5TIHNlcnZlcnMgYXZhaWxhYmxlIGZvciB0aGUgbW9iaWxlIGRhdGEKLSAgICAgKiBuZXR3b3JrIGludGVyZmFjZS4KLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBETlMgYWRkcmVzc2VzLCB3aXRoIG5vIGhvbGVzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXROYW1lU2VydmVycygpIHsKLSAgICAgICAgcmV0dXJuIGdldE5hbWVTZXJ2ZXJMaXN0KG1EbnNQcm9wTmFtZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgSVAgYWRkcmVzc2VzIG9mIHRoZSBETlMgc2VydmVycyBhdmFpbGFibGUgZm9yIHRoaXMKLSAgICAgKiBuZXR3b3JrIGludGVyZmFjZS4KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lcyB0aGUgbmFtZXMgb2YgdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlcwotICAgICAqIGdpdmUgdGhlIElQIGFkZHJlc3Nlcy4gUHJvcGVydGllcyB3aXRoIG5vIHZhbHVlcyBhcmUgc2tpcHBlZC4KLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHtAY29kZSBTdHJpbmd9cyBjb250YWluaW5nIHRoZSBJUCBhZGRyZXNzZXMKLSAgICAgKiBvZiB0aGUgRE5TIHNlcnZlcnMsIGluIGRvdC1ub3RhdGlvbi4gVGhpcyBtYXkgaGF2ZSBmZXdlcgotICAgICAqIG5vbi1udWxsIGVudHJpZXMgdGhhbiB0aGUgbGlzdCBvZiBuYW1lcyBwYXNzZWQgaW4sIHNpbmNlCi0gICAgICogc29tZSBvZiB0aGUgcGFzc2VkLWluIG5hbWVzIG1heSBoYXZlIGVtcHR5IHZhbHVlcy4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHJvdGVjdGVkIFN0cmluZ1tdIGdldE5hbWVTZXJ2ZXJMaXN0KFN0cmluZ1tdIHByb3BlcnR5TmFtZXMpIHsKLSAgICAgICAgU3RyaW5nW10gZG5zQWRkcmVzc2VzID0gbmV3IFN0cmluZ1twcm9wZXJ0eU5hbWVzLmxlbmd0aF07Ci0gICAgICAgIGludCBpLCBqOwotCi0gICAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgcHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gU3lzdGVtUHJvcGVydGllcy5nZXQocHJvcGVydHlOYW1lc1tpXSk7Ci0gICAgICAgICAgICAvLyBUaGUgR1NNIGxheWVyIHNvbWV0aW1lcyBzZXRzIGEgYm9ndXMgRE5TIHNlcnZlciBhZGRyZXNzIG9mCi0gICAgICAgICAgICAvLyAwLjAuMC4wCi0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSAmJiAhVGV4dFV0aWxzLmVxdWFscyh2YWx1ZSwgIjAuMC4wLjAiKSkgewotICAgICAgICAgICAgICAgIGRuc0FkZHJlc3Nlc1tqKytdID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRuc0FkZHJlc3NlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQcml2YXRlRG5zUm91dGVzKCkgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJhZGRQcml2YXRlRG5zUm91dGVzIGZvciAiICsgdGhpcyArCi0gICAgICAgICAgICAgICAgICAgICIoIiArIG1JbnRlcmZhY2VOYW1lICsgIikgLSBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gIittUHJpdmF0ZURuc1JvdXRlU2V0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUludGVyZmFjZU5hbWUgIT0gbnVsbCAmJiAhbVByaXZhdGVEbnNSb3V0ZVNldCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgYWRkclN0cmluZyA6IGdldE5hbWVTZXJ2ZXJzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYWRkclN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcyBpbmV0QWRkcmVzcyA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZShhZGRyU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIiAgYWRkaW5nICIgKyBhZGRyU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOZXR3b3JrVXRpbHMuYWRkSG9zdFJvdXRlKG1JbnRlcmZhY2VOYW1lLCBpbmV0QWRkcmVzcywgbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiIEROUyBhZGRyZXNzICIgKyBhZGRyU3RyaW5nICsgIiA6IEV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcml2YXRlRG5zUm91dGVzKCkgewotICAgICAgICAvLyBUT0RPIC0gd2Ugc2hvdWxkIGRvIHRoaXMgZXhwbGljaXRseSBidXQgdGhlIE5ldFV0aWxzIGFwaSBkb2VzbnQKLSAgICAgICAgLy8gc3VwcG9ydCB0aGlzIHlldCAtIG11c3QgcmVtb3ZlIGFsbC4gIE5vIHdvcnNlIHRoYW4gYmVmb3JlCi0gICAgICAgIGlmIChtSW50ZXJmYWNlTmFtZSAhPSBudWxsICYmIG1Qcml2YXRlRG5zUm91dGVTZXQpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZW1vdmVQcml2YXRlRG5zUm91dGVzIGZvciAiICsgbU5ldHdvcmtJbmZvLmdldFR5cGVOYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAoIiArIG1JbnRlcmZhY2VOYW1lICsgIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE5ldHdvcmtVdGlscy5yZW1vdmVIb3N0Um91dGVzKG1JbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgICAgIG1Qcml2YXRlRG5zUm91dGVTZXQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZERlZmF1bHRSb3V0ZSgpIHsKLSAgICAgICAgaWYgKChtSW50ZXJmYWNlTmFtZSAhPSBudWxsKSAmJiAobURlZmF1bHRHYXRld2F5QWRkciAhPSAwKSkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImFkZERlZmF1bHRSb3V0ZSBmb3IgIiArIG1OZXR3b3JrSW5mby5nZXRUeXBlTmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgKCIgKyBtSW50ZXJmYWNlTmFtZSArICIpLCBHYXRld2F5QWRkcj0iICsgbURlZmF1bHRHYXRld2F5QWRkcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJbmV0QWRkcmVzcyBpbmV0QWRkcmVzcyA9IE5ldHdvcmtVdGlscy5pbnRUb0luZXRBZGRyZXNzKG1EZWZhdWx0R2F0ZXdheUFkZHIpOwotICAgICAgICAgICAgaWYgKGluZXRBZGRyZXNzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICIgVW5hYmxlIHRvIGFkZCBkZWZhdWx0IHJvdXRlLiBtRGVmYXVsdEdhdGV3YXlBZGRyIEVycm9yIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghTmV0d29ya1V0aWxzLmFkZERlZmF1bHRSb3V0ZShtSW50ZXJmYWNlTmFtZSwgaW5ldEFkZHJlc3MpICYmIERCRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICIgIFVuYWJsZSB0byBhZGQgZGVmYXVsdCByb3V0ZS4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVEZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgIGlmIChtSW50ZXJmYWNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlRGVmYXVsdFJvdXRlIGZvciAiICsgbU5ldHdvcmtJbmZvLmdldFR5cGVOYW1lKCkgKyAiICgiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VOYW1lICsgIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE5ldHdvcmtVdGlscy5yZW1vdmVEZWZhdWx0Um91dGUobUludGVyZmFjZU5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgdGhlIG5ldHdvcmsgc3BlY2lmaWMgVENQIGJ1ZmZlciBzaXplcyBmcm9tIFN5c3RlbVByb3BlcnRpZXMKLSAgICAgKiBuZXQudGNwLmJ1ZmZlcnNpemUuW2RlZmF1bHR8d2lmaXx1bXRzfGVkZ2V8Z3Byc10gYW5kIHNldCB0aGVtIGZvciBzeXN0ZW0KLSAgICAgKiB3aWRlIHVzZQotICAgICAqLwotICAgcHVibGljIHZvaWQgdXBkYXRlTmV0d29ya1NldHRpbmdzKCkgewotICAgICAgICBTdHJpbmcga2V5ID0gZ2V0VGNwQnVmZmVyU2l6ZXNQcm9wTmFtZSgpOwotICAgICAgICBTdHJpbmcgYnVmZmVyU2l6ZXMgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChrZXkpOwotCi0gICAgICAgIGlmIChidWZmZXJTaXplcy5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsIGtleSArICIgbm90IGZvdW5kIGluIHN5c3RlbSBwcm9wZXJ0aWVzLiBVc2luZyBkZWZhdWx0cyIpOwotCi0gICAgICAgICAgICAvLyBTZXR0aW5nIHRvIGRlZmF1bHQgdmFsdWVzIHNvIHdlIHdvbid0IGJlIHN0dWNrIHRvIHByZXZpb3VzIHZhbHVlcwotICAgICAgICAgICAga2V5ID0gIm5ldC50Y3AuYnVmZmVyc2l6ZS5kZWZhdWx0IjsKLSAgICAgICAgICAgIGJ1ZmZlclNpemVzID0gU3lzdGVtUHJvcGVydGllcy5nZXQoa2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCB2YWx1ZXMgaW4ga2VybmVsCi0gICAgICAgIGlmIChidWZmZXJTaXplcy5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiU2V0dGluZyBUQ1AgdmFsdWVzOiBbIiArIGJ1ZmZlclNpemVzCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdIHdoaWNoIGNvbWVzIGZyb20gWyIgKyBrZXkgKyAiXSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0QnVmZmVyU2l6ZShidWZmZXJTaXplcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWxlYXNlIHRoZSB3YWtlbG9jaywgaWYgYW55LCB0aGF0IG1heSBiZSBoZWxkIHdoaWxlIGhhbmRsaW5nIGEKLSAgICAgKiBkaXNjb25uZWN0IG9wZXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlV2FrZUxvY2soKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIFRDUCBidWZmZXIgc2l6ZXMgdG8gL3N5cy9rZXJuZWwvaXB2NC90Y3BfW3Ivd11tZW1fW21pbi9kZWYvbWF4XQotICAgICAqIHdoaWNoIG1hcHMgdG8gL3Byb2Mvc3lzL25ldC9pcHY0L3RjcF9ybWVtIGFuZCB0Y3B3bWVtCi0gICAgICogCi0gICAgICogQHBhcmFtIGJ1ZmZlclNpemVzIGluIHRoZSBmb3JtYXQgb2YgInJlYWRNaW4sIHJlYWRJbml0aWFsLCByZWFkTWF4LAotICAgICAqICAgICAgICB3cml0ZU1pbiwgd3JpdGVJbml0aWFsLCB3cml0ZU1heCIKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0QnVmZmVyU2l6ZShTdHJpbmcgYnVmZmVyU2l6ZXMpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IGJ1ZmZlclNpemVzLnNwbGl0KCIsIik7Ci0KLSAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09IDYpIHsKLSAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9ICIvc3lzL2tlcm5lbC9pcHY0L3RjcF8iOwotICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAicm1lbV9taW4iLCB2YWx1ZXNbMF0pOwotICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAicm1lbV9kZWYiLCB2YWx1ZXNbMV0pOwotICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAicm1lbV9tYXgiLCB2YWx1ZXNbMl0pOwotICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAid21lbV9taW4iLCB2YWx1ZXNbM10pOwotICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAid21lbV9kZWYiLCB2YWx1ZXNbNF0pOwotICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAid21lbV9tYXgiLCB2YWx1ZXNbNV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJbnZhbGlkIGJ1ZmZlcnNpemUgc3RyaW5nOiAiICsgYnVmZmVyU2l6ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJDYW4ndCBzZXQgdGNwIGJ1ZmZlciBzaXplczoiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgc3RyaW5nIHRvIGZpbGUuIEJhc2ljYWxseSBzYW1lIGFzICJlY2hvIC1uICRzdHJpbmcgPiAkZmlsZW5hbWUiCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGVuYW1lCi0gICAgICogQHBhcmFtIHN0cmluZwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc3RyaW5nVG9GaWxlKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZVdyaXRlciBvdXQgPSBuZXcgRmlsZVdyaXRlcihmaWxlbmFtZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoc3RyaW5nKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjb3JkIHRoZSBkZXRhaWxlZCBzdGF0ZSBvZiBhIG5ldHdvcmssIGFuZCBpZiBpdCBpcyBhCi0gICAgICogY2hhbmdlIGZyb20gdGhlIHByZXZpb3VzIHN0YXRlLCBzZW5kIGEgbm90aWZpY2F0aW9uIHRvCi0gICAgICogYW55IGxpc3RlbmVycy4KLSAgICAgKiBAcGFyYW0gc3RhdGUgdGhlIG5ldyBAe2NvZGUgRGV0YWlsZWRTdGF0ZX0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXRhaWxlZFN0YXRlKE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgc3RhdGUpIHsKLSAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjb3JkIHRoZSBkZXRhaWxlZCBzdGF0ZSBvZiBhIG5ldHdvcmssIGFuZCBpZiBpdCBpcyBhCi0gICAgICogY2hhbmdlIGZyb20gdGhlIHByZXZpb3VzIHN0YXRlLCBzZW5kIGEgbm90aWZpY2F0aW9uIHRvCi0gICAgICogYW55IGxpc3RlbmVycy4KLSAgICAgKiBAcGFyYW0gc3RhdGUgdGhlIG5ldyBAe2NvZGUgRGV0YWlsZWRTdGF0ZX0KLSAgICAgKiBAcGFyYW0gcmVhc29uIGEge0Bjb2RlIFN0cmluZ30gaW5kaWNhdGluZyBhIHJlYXNvbiBmb3IgdGhlIHN0YXRlIGNoYW5nZSwKLSAgICAgKiBpZiBvbmUgd2FzIHN1cHBsaWVkLiBNYXkgYmUge0Bjb2RlIG51bGx9LgotICAgICAqIEBwYXJhbSBleHRyYUluZm8gb3B0aW9uYWwge0Bjb2RlIFN0cmluZ30gcHJvdmlkaW5nIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0ZSBjaGFuZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXRhaWxlZFN0YXRlKE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgc3RhdGUsIFN0cmluZyByZWFzb24sIFN0cmluZyBleHRyYUluZm8pIHsKLSAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAic2V0RGV0YWlsZWQgc3RhdGUsIG9sZCA9IittTmV0d29ya0luZm8uZ2V0RGV0YWlsZWRTdGF0ZSgpKyIgYW5kIG5ldyBzdGF0ZT0iK3N0YXRlKTsKLSAgICAgICAgaWYgKHN0YXRlICE9IG1OZXR3b3JrSW5mby5nZXREZXRhaWxlZFN0YXRlKCkpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gd2FzQ29ubmVjdGluZyA9IChtTmV0d29ya0luZm8uZ2V0U3RhdGUoKSA9PSBOZXR3b3JrSW5mby5TdGF0ZS5DT05ORUNUSU5HKTsKLSAgICAgICAgICAgIFN0cmluZyBsYXN0UmVhc29uID0gbU5ldHdvcmtJbmZvLmdldFJlYXNvbigpOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIElmIGEgcmVhc29uIHdhcyBzdXBwbGllZCB3aGVuIHRoZSBDT05ORUNUSU5HIHN0YXRlIHdhcyBlbnRlcmVkLCBhbmQgbm8KLSAgICAgICAgICAgICAqIHJlYXNvbiB3YXMgc3VwcGxpZWQgZm9yIGVudGVyaW5nIHRoZSBDT05ORUNURUQgc3RhdGUsIHRoZW4gcmV0YWluIHRoZQotICAgICAgICAgICAgICogcmVhc29uIHRoYXQgd2FzIHN1cHBsaWVkIHdoZW4gZ29pbmcgdG8gQ09OTkVDVElORy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHdhc0Nvbm5lY3RpbmcgJiYgc3RhdGUgPT0gTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQgJiYgcmVhc29uID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgbGFzdFJlYXNvbiAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJlYXNvbiA9IGxhc3RSZWFzb247Ci0gICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgcmVhc29uLCBleHRyYUluZm8pOwotICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoRVZFTlRfU1RBVEVfQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKLSAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldERldGFpbGVkU3RhdGVJbnRlcm5hbChOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIHN0YXRlKSB7Ci0gICAgICAgIG1OZXR3b3JrSW5mby5zZXREZXRhaWxlZFN0YXRlKHN0YXRlLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZWFyZG93blJlcXVlc3RlZChib29sZWFuIGlzUmVxdWVzdGVkKSB7Ci0gICAgICAgIG1UZWFyZG93blJlcXVlc3RlZCA9IGlzUmVxdWVzdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVGVhcmRvd25SZXF1ZXN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtVGVhcmRvd25SZXF1ZXN0ZWQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNlbmQgYSAgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHJlc3VsdHMgb2YgYSBzY2FuIGZvciBuZXR3b3JrIGFjY2VzcwotICAgICAqIHBvaW50cyBoYXMgY29tcGxldGVkLCBhbmQgcmVzdWx0cyBhcmUgYXZhaWxhYmxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNlbmRTY2FuUmVzdWx0c0F2YWlsYWJsZSgpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoRVZFTlRfU0NBTl9SRVNVTFRTX0FWQUlMQUJMRSwgbU5ldHdvcmtJbmZvKTsKLSAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY29yZCB0aGUgcm9hbWluZyBzdGF0dXMgb2YgdGhlIGRldmljZSwgYW5kIGlmIGl0IGlzIGEgY2hhbmdlIGZyb20gdGhlIHByZXZpb3VzCi0gICAgICogc3RhdHVzLCBzZW5kIGEgbm90aWZpY2F0aW9uIHRvIGFueSBsaXN0ZW5lcnMuCi0gICAgICogQHBhcmFtIGlzUm9hbWluZyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGRldmljZSBpcyBub3cgcm9hbWluZywge0Bjb2RlIGZhbHNlfQotICAgICAqIGlmIGl0IGlzIG5vIGxvbmdlciByb2FtaW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFJvYW1pbmdTdGF0dXMoYm9vbGVhbiBpc1JvYW1pbmcpIHsKLSAgICAgICAgaWYgKGlzUm9hbWluZyAhPSBtTmV0d29ya0luZm8uaXNSb2FtaW5nKCkpIHsKLSAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRSb2FtaW5nKGlzUm9hbWluZyk7Ci0gICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9ST0FNSU5HX0NIQU5HRUQsIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTdWJ0eXBlKGludCBzdWJ0eXBlLCBTdHJpbmcgc3VidHlwZU5hbWUpIHsKLSAgICAgICAgaWYgKG1OZXR3b3JrSW5mby5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICBpbnQgb2xkU3VidHlwZSA9IG1OZXR3b3JrSW5mby5nZXRTdWJ0eXBlKCk7Ci0gICAgICAgICAgICBpZiAoc3VidHlwZSAhPSBvbGRTdWJ0eXBlKSB7Ci0gICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldFN1YnR5cGUoc3VidHlwZSwgc3VidHlwZU5hbWUpOwotICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgRVZFTlRfTkVUV09SS19TVUJUWVBFX0NIQU5HRUQsIG9sZFN1YnR5cGUsIDAsIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRNb25pdG9yaW5nKCk7CisgICAgcHVibGljIFN0cmluZyBnZXRUY3BCdWZmZXJTaXplc1Byb3BOYW1lKCk7CiAKICAgICAvKioKICAgICAgKiBEaXNhYmxlIGNvbm5lY3Rpdml0eSB0byBhIG5ldHdvcmsKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBhIHRlYXJkb3duIG9jY3VycmVkLCB7QGNvZGUgZmFsc2V9IGlmIHRoZQogICAgICAqIHRlYXJkb3duIGRpZCBub3Qgb2NjdXIuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdGVhcmRvd24oKTsKKyAgICBwdWJsaWMgYm9vbGVhbiB0ZWFyZG93bigpOwogCiAgICAgLyoqCiAgICAgICogUmVlbmFibGUgY29ubmVjdGl2aXR5IHRvIGEgbmV0d29yayBhZnRlciBhIHtAbGluayAjdGVhcmRvd24oKX0uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgd2UncmUgY29ubmVjdGVkIG9yIGV4cGVjdCB0byBiZSBjb25uZWN0ZWQKICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZWNvbm5lY3QoKTsKKyAgICBwdWJsaWMgYm9vbGVhbiByZWNvbm5lY3QoKTsKIAogICAgIC8qKgogICAgICAqIFR1cm4gdGhlIHdpcmVsZXNzIHJhZGlvIG9mZiBmb3IgYSBuZXR3b3JrLgogICAgICAqIEBwYXJhbSB0dXJuT24ge0Bjb2RlIHRydWV9IHRvIHR1cm4gdGhlIHJhZGlvIG9uLCB7QGNvZGUgZmFsc2V9CiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc2V0UmFkaW8oYm9vbGVhbiB0dXJuT24pOworICAgIHB1YmxpYyBib29sZWFuIHNldFJhZGlvKGJvb2xlYW4gdHVybk9uKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoaXMgbmV0d29yayBpcyBhdmFpbGFibGUgZm9yCiAgICAgICogY29ubmVjdGlvbnMuIEEgdmFsdWUgb2Yge0Bjb2RlIGZhbHNlfSBtZWFucyB0aGF0IHNvbWUgcXVhc2ktcGVybWFuZW50CiAgICAgICogY29uZGl0aW9uIHByZXZlbnRzIGNvbm5lY3Rpdml0eSB0byB0aGlzIG5ldHdvcmsuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNBdmFpbGFibGUoKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZSgpOworCisgICAgLyoqCisgICAgICogRmV0Y2ggZGVmYXVsdCBnYXRld2F5IGFkZHJlc3MgZm9yIHRoZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIGludCBnZXREZWZhdWx0R2F0ZXdheUFkZHIoKTsKIAogICAgIC8qKgogICAgICAqIFRlbGxzIHRoZSB1bmRlcmx5aW5nIG5ldHdvcmtpbmcgc3lzdGVtIHRoYXQgdGhlIGNhbGxlciB3YW50cyB0bwpAQCAtMzkwLDcgKzE1Miw3IEBACiAgICAgICogaW1wbGVtZW50YXRpb24rZmVhdHVyZSBjb21iaW5hdGlvbiwgZXhjZXB0IHRoYXQgdGhlIHZhbHVlIHtAY29kZSAtMX0KICAgICAgKiBhbHdheXMgaW5kaWNhdGVzIGZhaWx1cmUuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGludCBzdGFydFVzaW5nTmV0d29ya0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCk7CisgICAgcHVibGljIGludCBzdGFydFVzaW5nTmV0d29ya0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCk7CiAKICAgICAvKioKICAgICAgKiBUZWxscyB0aGUgdW5kZXJseWluZyBuZXR3b3JraW5nIHN5c3RlbSB0aGF0IHRoZSBjYWxsZXIgaXMgZmluaXNoZWQKQEAgLTQwNCwyMyArMTY2LDQzIEBACiAgICAgICogaW1wbGVtZW50YXRpb24rZmVhdHVyZSBjb21iaW5hdGlvbiwgZXhjZXB0IHRoYXQgdGhlIHZhbHVlIHtAY29kZSAtMX0KICAgICAgKiBhbHdheXMgaW5kaWNhdGVzIGZhaWx1cmUuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGludCBzdG9wVXNpbmdOZXR3b3JrRmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgaW50IGNhbGxpbmdQaWQsIGludCBjYWxsaW5nVWlkKTsKKyAgICBwdWJsaWMgaW50IHN0b3BVc2luZ05ldHdvcmtGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBpbnQgY2FsbGluZ1BpZCwgaW50IGNhbGxpbmdVaWQpOwogCiAgICAgLyoqCi0gICAgICogRW5zdXJlIHRoYXQgYSBuZXR3b3JrIHJvdXRlIGV4aXN0cyB0byBkZWxpdmVyIHRyYWZmaWMgdG8gdGhlIHNwZWNpZmllZAotICAgICAqIGhvc3QgdmlhIHRoaXMgbmV0d29yayBpbnRlcmZhY2UuCi0gICAgICogQHBhcmFtIGhvc3RBZGRyZXNzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSByb3V0ZSBpcyBkZXNpcmVkCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gb24gc3VjY2Vzcywge0Bjb2RlIGZhbHNlfSBvbiBmYWlsdXJlCisgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIFN0b3JhZ2UgQVBJIHVzZWQgYnkgQ29ubmVjdGl2aXR5U2VydmljZSBmb3Igc2F2aW5nCisgICAgICogTmV0d29yayBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdFJvdXRlVG9Ib3N0KEluZXRBZGRyZXNzIGhvc3RBZGRyZXNzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbnRlcnByZXRzIHNjYW4gcmVzdWx0cy4gVGhpcyB3aWxsIGJlIGNhbGxlZCBhdCBhIHNhZmUgdGltZSBmb3IKLSAgICAgKiBwcm9jZXNzaW5nLCBhbmQgZnJvbSBhIHNhZmUgdGhyZWFkLgorICAgICAqIENoZWNrIGlmIHByaXZhdGUgRE5TIHJvdXRlIGlzIHNldCBmb3IgdGhlIG5ldHdvcmsKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnRlcnByZXRTY2FuUmVzdWx0c0F2YWlsYWJsZSgpIHsKLSAgICB9CisgICAgcHVibGljIGJvb2xlYW4gaXNQcml2YXRlRG5zUm91dGVTZXQoKTsKKworICAgIC8qKgorICAgICAqIFNldCBhIGZsYWcgaW5kaWNhdGluZyBwcml2YXRlIEROUyByb3V0ZSBpcyBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcml2YXRlRG5zUm91dGVTZXQoYm9vbGVhbiBlbmFibGVkKTsKKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIGRlZmF1bHQgcm91dGUgaXMgc2V0CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0Um91dGVTZXQoKTsKKworICAgIC8qKgorICAgICAqIFNldCBhIGZsYWcgaW5kaWNhdGluZyBkZWZhdWx0IHJvdXRlIGlzIHNldCBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWZhdWx0Um91dGVTZXQoYm9vbGVhbiBlbmFibGVkKTsKKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRlYXIgZG93biB3YXMgcmVxdWVzdGVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNUZWFyZG93blJlcXVlc3RlZCgpOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGUgdGVhciBkb3duIHJlcXVlc3RlZCBmcm9tIGNvbm5lY3Rpdml0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRlYXJkb3duUmVxdWVzdGVkKGJvb2xlYW4gaXNSZXF1ZXN0ZWQpOwogCiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1V0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1V0aWxzLmphdmEKaW5kZXggNWQ0YjA5OS4uMDEwMDRjMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtVdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrVXRpbHMuamF2YQpAQCAtNTIsNyArNTIsMTEgQEAKICAgICAgICAgICBpbnQgcHJlZml4TGVuZ3RoLCBTdHJpbmcgZ3cpOwogCiAgICAgLyoqIFJldHVybiB0aGUgZ2F0ZXdheSBhZGRyZXNzIGZvciB0aGUgZGVmYXVsdCByb3V0ZSBmb3IgdGhlIG5hbWVkIGludGVyZmFjZS4gKi8KLSAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBpbnQgZ2V0RGVmYXVsdFJvdXRlKFN0cmluZyBpbnRlcmZhY2VOYW1lKTsKKyAgICBwdWJsaWMgc3RhdGljIEluZXRBZGRyZXNzIGdldERlZmF1bHRSb3V0ZShTdHJpbmcgaW50ZXJmYWNlTmFtZSkgeworICAgICAgICBpbnQgYWRkciA9IGdldERlZmF1bHRSb3V0ZU5hdGl2ZShpbnRlcmZhY2VOYW1lKTsKKyAgICAgICAgcmV0dXJuIGludFRvSW5ldEFkZHJlc3MoYWRkcik7CisgICAgfQorICAgIHByaXZhdGUgbmF0aXZlIHN0YXRpYyBpbnQgZ2V0RGVmYXVsdFJvdXRlTmF0aXZlKFN0cmluZyBpbnRlcmZhY2VOYW1lKTsKIAogICAgIC8qKiBSZW1vdmUgaG9zdCByb3V0ZXMgdGhhdCB1c2VzIHRoZSBuYW1lZCBpbnRlcmZhY2UuICovCiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgaW50IHJlbW92ZUhvc3RSb3V0ZXMoU3RyaW5nIGludGVyZmFjZU5hbWUpOwpAQCAtMTk0LDE5ICsxOTgsNCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBhZGRSb3V0ZShpbnRlcmZhY2VOYW1lLCBkc3RTdHIsIHByZWZpeExlbmd0aCwgZ3dTdHIpID09IDA7CiAgICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgdjRTdHJpbmdUb0ludChTdHJpbmcgc3RyKSB7Ci0gICAgICAgIGludCByZXN1bHQgPSAwOwotICAgICAgICBTdHJpbmdbXSBhcnJheSA9IHN0ci5zcGxpdCgiXFwuIik7Ci0gICAgICAgIGlmIChhcnJheS5sZW5ndGggIT0gNCkgcmV0dXJuIDA7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBJbnRlZ2VyLnBhcnNlSW50KGFycmF5WzNdKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPDwgOCkgKyBJbnRlZ2VyLnBhcnNlSW50KGFycmF5WzJdKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPDwgOCkgKyBJbnRlZ2VyLnBhcnNlSW50KGFycmF5WzFdKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPDwgOCkgKyBJbnRlZ2VyLnBhcnNlSW50KGFycmF5WzBdKTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvUHJveHkuamF2YQppbmRleCAyMmMzMGE1Li44MzBmZjA2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvUHJveHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvUHJveHkuamF2YQpAQCAtMTYsMzIgKzE2LDE3MyBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmV0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0OwotCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuUHJveHlTZWxlY3RvcjsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmV0LlVSSTsKIGltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWFkV3JpdGVMb2NrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGU7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGVQbGFubmVyOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5TY2hlbWVSZWdpc3RyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4uUHJveHlTZWxlY3RvclJvdXRlUGxhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQ7CisKIC8qKgogICogQSBjb252ZW5pZW5jZSBjbGFzcyBmb3IgYWNjZXNzaW5nIHRoZSB1c2VyIGFuZCBkZWZhdWx0IHByb3h5CiAgKiBzZXR0aW5ncy4KICAqLwotZmluYWwgcHVibGljIGNsYXNzIFByb3h5IHsKK3B1YmxpYyBmaW5hbCBjbGFzcyBQcm94eSB7CiAKICAgICAvLyBTZXQgdG8gdHJ1ZSB0byBlbmFibGUgZXh0cmEgZGVidWdnaW5nLgotICAgIHN0YXRpYyBmaW5hbCBwcml2YXRlIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CiAKLSAgICBzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBQUk9YWV9DSEFOR0VfQUNUSU9OID0KKyAgICAvLyBVc2VkIHRvIG5vdGlmeSBhbiBhcHAgdGhhdCdzIGNhY2hpbmcgdGhlIGRlZmF1bHQgY29ubmVjdGlvbiBwcm94eQorICAgIC8vIHRoYXQgZWl0aGVyIHRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gb3IgaXRzIHByb3h5IGhhcyBjaGFuZ2VkCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfQ0hBTkdFX0FDVElPTiA9CiAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uUFJPWFlfQ0hBTkdFIjsKIAorICAgIHByaXZhdGUgc3RhdGljIFJlYWRXcml0ZUxvY2sgc1Byb3h5SW5mb0xvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU2V0dGluZ3NPYnNlcnZlciBzR2xvYmFsUHJveHlDaGFuZ2VkT2JzZXJ2ZXIgPSBudWxsOworCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJveHlTcGVjIHNHbG9iYWxQcm94eVNwZWMgPSBudWxsOworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29ubmVjdGl2aXR5TWFuYWdlciBzQ29ubmVjdGl2aXR5TWFuYWdlciA9IG51bGw7CisKKyAgICAvLyBIb3N0bmFtZSAvIElQIFJFR0VYIHZhbGlkYXRpb24KKyAgICAvLyBNYXRjaGVzIGJsYW5rIGlucHV0LCBpcHMsIGFuZCBkb21haW4gbmFtZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9JUF9SRUdFWCA9CisgICAgICAgICJbYS16QS1aMC05XSsoXFwtW2EtekEtWjAtOV0rKSooXFwuW2EtekEtWjAtOV0rKFxcLVthLXpBLVowLTldKykqKSoiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhPU1ROQU1FX1JFR0VYUCA9ICJeJHxeIiArIE5BTUVfSVBfUkVHRVggKyAiJCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEhPU1ROQU1FX1BBVFRFUk47CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDTExJU1RfUkVHRVhQID0gIiR8XiguPyIgKyBOQU1FX0lQX1JFR0VYCisgICAgICAgICsgIikrKCwoLj8iICsgTkFNRV9JUF9SRUdFWCArICIpKSokIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gRVhDTExJU1RfUEFUVEVSTjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIEhPU1ROQU1FX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoSE9TVE5BTUVfUkVHRVhQKTsKKyAgICAgICAgRVhDTExJU1RfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZShFWENMTElTVF9SRUdFWFApOworICAgIH0KKworICAgIC8vIHVzZWZ1bCBiZWNhdXNlIGl0IGhvbGRzIHRoZSBwcm9jZXNzZWQgZXhjbHVzaW9uIGxpc3QgLSBkb24ndCB3YW50IHRvIHJlcGFyc2UgaXQgZWFjaCB0aW1lCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJveHlTcGVjIHsKKyAgICAgICAgU3RyaW5nW10gZXhjbHVzaW9uTGlzdDsKKyAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgYWRkcmVzcyA9IG51bGw7CisgICAgICAgIHB1YmxpYyBQcm94eVNwZWMoKSB7CisgICAgICAgICAgICBleGNsdXNpb25MaXN0ID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVVJMSW5FeGNsdXNpb25MaXN0KFN0cmluZyB1cmwsIFN0cmluZ1tdIGV4Y2x1c2lvbkxpc3QpIHsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgVXJpIHUgPSBVcmkucGFyc2UodXJsKTsKKyAgICAgICAgU3RyaW5nIHVybERvbWFpbiA9IHUuZ2V0SG9zdCgpOworICAgICAgICAvLyBJZiB0aGUgZG9tYWluIGlzIGRlZmluZWQgYXMgIi5hbmRyb2lkLmNvbSIgb3IgImFuZHJvaWQuY29tIiwgd2Ugd2lzaCB0byBtYXRjaAorICAgICAgICAvLyBodHRwOi8vYW5kcm9pZC5jb20gYXMgd2VsbCBhcyBodHRwOi8veHh4LmFuZHJvaWQuY29tICwgYnV0IG5vdAorICAgICAgICAvLyBodHRwOi8vbXlhbmRyb2lkLmNvbSAuIFRoaXMgY29kZSB3b3JrcyBvdXQgdGhlIGxvZ2ljLgorICAgICAgICBmb3IgKFN0cmluZyBleGNsdWRlZERvbWFpbiA6IGV4Y2x1c2lvbkxpc3QpIHsKKyAgICAgICAgICAgIFN0cmluZyBkb3REb21haW4gPSAiLiIgKyBleGNsdWRlZERvbWFpbjsKKyAgICAgICAgICAgIGlmICh1cmxEb21haW4uZXF1YWxzKGV4Y2x1ZGVkRG9tYWluKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHVybERvbWFpbi5lbmRzV2l0aChkb3REb21haW4pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gTm8gbWF0Y2gKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwYXJzZUhvc3QoU3RyaW5nIHByb3h5U3BlYykgeworICAgICAgICBpbnQgaSA9IHByb3h5U3BlYy5pbmRleE9mKCc6Jyk7CisgICAgICAgIGlmIChpID09IC0xKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShwcm94eVNwZWMubGVuZ3RoKCkgPT0gMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJveHlTcGVjLnN1YnN0cmluZygwLCBpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgcGFyc2VQb3J0KFN0cmluZyBwcm94eVNwZWMpIHsKKyAgICAgICAgaW50IGkgPSBwcm94eVNwZWMuaW5kZXhPZignOicpOworICAgICAgICBpZiAoaSA9PSAtMSkgeworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocHJveHlTcGVjLmxlbmd0aCgpID09IDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoaSA8IHByb3h5U3BlYy5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQocHJveHlTcGVjLnN1YnN0cmluZyhpKzEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByb3h5IG9iamVjdCB0byBiZSB1c2VkIGZvciB0aGUgVVJMIGdpdmVuIGFzIHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gY3R4IEEgQ29udGV4dCB1c2VkIHRvIGdldCB0aGUgc2V0dGluZ3MgZm9yIHRoZSBwcm94eSBob3N0LgorICAgICAqIEBwYXJhbSB1cmwgQSBVUkwgdG8gYmUgYWNjZXNzZWQuIFVzZWQgdG8gZXZhbHVhdGUgZXhjbHVzaW9uIGxpc3QuCisgICAgICogQHJldHVybiBQcm94eSAoamF2YS5uZXQpIG9iamVjdCBjb250YWluaW5nIHRoZSBob3N0IG5hbWUuIElmIHRoZQorICAgICAqICAgICAgICAgdXNlciBkaWQgbm90IHNldCBhIGhvc3RuYW1lIGl0IHJldHVybnMgdGhlIGRlZmF1bHQgaG9zdC4KKyAgICAgKiAgICAgICAgIEEgbnVsbCB2YWx1ZSBtZWFucyB0aGF0IG5vIGhvc3QgaXMgdG8gYmUgdXNlZC4KKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5Qcm94eSBnZXRQcm94eShDb250ZXh0IGN0eCwgU3RyaW5nIHVybCkgeworICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgamF2YS5uZXQuUHJveHkgcmV0dmFsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHNHbG9iYWxQcm94eUNoYW5nZWRPYnNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXJzUmVhZExvY2tlZChjdHgpOworICAgICAgICAgICAgICAgIHBhcnNlR2xvYmFsUHJveHlJbmZvUmVhZExvY2tlZChjdHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNHbG9iYWxQcm94eVNwZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFByb3h5IGRlZmluZWQgLSBBcHBseSBleGNsdXNpb24gcnVsZXMKKyAgICAgICAgICAgICAgICBpZiAoaXNVUkxJbkV4Y2x1c2lvbkxpc3QodXJsLCBzR2xvYmFsUHJveHlTcGVjLmV4Y2x1c2lvbkxpc3QpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBubyBwcm94eQorICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBqYXZhLm5ldC5Qcm94eS5OT19QUk9YWTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGphdmEubmV0LlByb3h5KGphdmEubmV0LlByb3h5LlR5cGUuSFRUUCwgc0dsb2JhbFByb3h5U3BlYy5hZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IGdldERlZmF1bHRQcm94eShjdHgsIHVybCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICB9CisgICAgICAgIGlmICgocmV0dmFsICE9IGphdmEubmV0LlByb3h5Lk5PX1BST1hZKSAmJiAoaXNMb2NhbEhvc3QodXJsKSkpIHsKKyAgICAgICAgICAgIHJldHZhbCA9IGphdmEubmV0LlByb3h5Lk5PX1BST1hZOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorCisgICAgLy8gVE9ETzogZGVwcmVjYXRlIHRoaXMgZnVuY3Rpb24KICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHByb3h5IGhvc3Qgc2V0IGJ5IHRoZSB1c2VyLgogICAgICAqIEBwYXJhbSBjdHggQSBDb250ZXh0IHVzZWQgdG8gZ2V0IHRoZSBzZXR0aW5ncyBmb3IgdGhlIHByb3h5IGhvc3QuCkBAIC00OSw4MyArMTkwLDgyIEBACiAgICAgICogICAgICAgICBuYW1lIGl0IHJldHVybnMgdGhlIGRlZmF1bHQgaG9zdC4gQSBudWxsIHZhbHVlIG1lYW5zIHRoYXQgbm8KICAgICAgKiAgICAgICAgIGhvc3QgaXMgdG8gYmUgdXNlZC4KICAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBnZXRIb3N0KENvbnRleHQgY3R4KSB7Ci0gICAgICAgIENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIgPSBjdHguZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGNvbnRlbnRSZXNvbHZlcik7Ci0gICAgICAgIFN0cmluZyBob3N0ID0gU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICBjb250ZW50UmVzb2x2ZXIsCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkhUVFBfUFJPWFkpOwotICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgaSA9IGhvc3QuaW5kZXhPZignOicpOwotICAgICAgICAgICAgaWYgKGkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoaG9zdC5sZW5ndGgoKSA9PSAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaG9zdC5zdWJzdHJpbmcoMCwgaSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0SG9zdChDb250ZXh0IGN0eCkgeworICAgICAgICBqYXZhLm5ldC5Qcm94eSBwcm94eSA9IGdldFByb3h5KGN0eCwgbnVsbCk7CisgICAgICAgIGlmIChwcm94eSA9PSBqYXZhLm5ldC5Qcm94eS5OT19QUk9YWSkgcmV0dXJuIG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKChJbmV0U29ja2V0QWRkcmVzcykocHJveHkuYWRkcmVzcygpKSkuZ2V0SG9zdE5hbWUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXREZWZhdWx0SG9zdCgpOwogICAgIH0KIAorICAgIC8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIGZ1bmN0aW9uCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBwcm94eSBwb3J0IHNldCBieSB0aGUgdXNlci4KICAgICAgKiBAcGFyYW0gY3R4IEEgQ29udGV4dCB1c2VkIHRvIGdldCB0aGUgc2V0dGluZ3MgZm9yIHRoZSBwcm94eSBwb3J0LgogICAgICAqIEByZXR1cm4gVGhlIHBvcnQgbnVtYmVyIHRvIHVzZSBvciAtMSBpZiBubyBwcm94eSBpcyB0byBiZSB1c2VkLgogICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBwdWJsaWMgaW50IGdldFBvcnQoQ29udGV4dCBjdHgpIHsKLSAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciA9IGN0eC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoY29udGVudFJlc29sdmVyKTsKLSAgICAgICAgU3RyaW5nIGhvc3QgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgIGNvbnRlbnRSZXNvbHZlciwKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuSFRUUF9QUk9YWSk7Ci0gICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBpID0gaG9zdC5pbmRleE9mKCc6Jyk7Ci0gICAgICAgICAgICBpZiAoaSA9PSAtMSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShob3N0Lmxlbmd0aCgpID09IDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShpIDwgaG9zdC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChob3N0LnN1YnN0cmluZyhpKzEpKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBnZXRQb3J0KENvbnRleHQgY3R4KSB7CisgICAgICAgIGphdmEubmV0LlByb3h5IHByb3h5ID0gZ2V0UHJveHkoY3R4LCBudWxsKTsKKyAgICAgICAgaWYgKHByb3h5ID09IGphdmEubmV0LlByb3h5Lk5PX1BST1hZKSByZXR1cm4gLTE7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKChJbmV0U29ja2V0QWRkcmVzcykocHJveHkuYWRkcmVzcygpKSkuZ2V0UG9ydCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXREZWZhdWx0UG9ydCgpOwogICAgIH0KIAorICAgIC8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIGZ1bmN0aW9uCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBkZWZhdWx0IHByb3h5IGhvc3Qgc3BlY2lmaWVkIGJ5IHRoZSBjYXJyaWVyLgogICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGhvc3QgbmFtZSBvciBudWxsIGlmIHRoZXJlIGlzIG5vIHByb3h5IGZvcgogICAgICAqIHRoaXMgY2Fycmllci4KICAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBnZXREZWZhdWx0SG9zdCgpIHsKLSAgICAgICAgU3RyaW5nIGhvc3QgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgibmV0LmdwcnMuaHR0cC1wcm94eSIpOwotICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBVcmkgdSA9IFVyaS5wYXJzZShob3N0KTsKLSAgICAgICAgICAgIGhvc3QgPSB1LmdldEhvc3QoKTsKLSAgICAgICAgICAgIHJldHVybiBob3N0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXREZWZhdWx0SG9zdCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCisgICAgLy8gVE9ETzogZGVwcmVjYXRlIHRoaXMgZnVuY3Rpb24KICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGRlZmF1bHQgcHJveHkgcG9ydCBzcGVjaWZpZWQgYnkgdGhlIGNhcnJpZXIuCiAgICAgICogQHJldHVybiBUaGUgcG9ydCBudW1iZXIgdG8gYmUgdXNlZCB3aXRoIHRoZSBwcm94eSBob3N0IG9yIC0xIGlmIHRoZXJlIGlzCiAgICAgICogbm8gcHJveHkgZm9yIHRoaXMgY2Fycmllci4KICAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgcHVibGljIGludCBnZXREZWZhdWx0UG9ydCgpIHsKLSAgICAgICAgU3RyaW5nIGhvc3QgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgibmV0LmdwcnMuaHR0cC1wcm94eSIpOwotICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBVcmkgdSA9IFVyaS5wYXJzZShob3N0KTsKLSAgICAgICAgICAgIHJldHVybiB1LmdldFBvcnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGdldERlZmF1bHRQb3J0KCkgeworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCisgICAgLy8gVE9ETyAtIGNhY2hlIHRoZSBkZXRhaWxzIGZvciBlYWNoIG5ldHdvcmsgc28gd2UgZG9uJ3QgaGF2ZSB0byBmZXRjaCBhbmQgcGFyc2UKKyAgICAvLyBvbiBlYWNoIHJlcXVlc3QKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5Qcm94eSBnZXREZWZhdWx0UHJveHkoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgdXJsKSB7CisgICAgICAgIGlmIChzQ29ubmVjdGl2aXR5TWFuYWdlciA9PSBudWxsKSB7CisgICAgICAgICAgICBzQ29ubmVjdGl2aXR5TWFuYWdlciA9IChDb25uZWN0aXZpdHlNYW5hZ2VyKWNvbnRleHQuZ2V0U3lzdGVtU2VydmljZSgKKyAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNDb25uZWN0aXZpdHlNYW5hZ2VyID09IG51bGwpIHJldHVybiBqYXZhLm5ldC5Qcm94eS5OT19QUk9YWTsKKworICAgICAgICBMaW5rUHJvcGVydGllcyBsaW5rUHJvcGVydGllcyA9IHNDb25uZWN0aXZpdHlNYW5hZ2VyLmdldEFjdGl2ZUxpbmtQcm9wZXJ0aWVzKCk7CisKKyAgICAgICAgaWYgKGxpbmtQcm9wZXJ0aWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIFByb3h5UHJvcGVydGllcyBwcm94eVByb3BlcnRpZXMgPSBsaW5rUHJvcGVydGllcy5nZXRIdHRwUHJveHkoKTsKKworICAgICAgICAgICAgaWYgKHByb3h5UHJvcGVydGllcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGV4Y2x1c2lvbkxpc3QgPSBwcm94eVByb3BlcnRpZXMuZ2V0RXhjbHVzaW9uTGlzdCgpOworICAgICAgICAgICAgICAgIFNvY2tldEFkZHJlc3Mgc29ja2V0QWRkciA9IHByb3h5UHJvcGVydGllcy5nZXRTb2NrZXRBZGRyZXNzKCk7CisgICAgICAgICAgICAgICAgaWYgKHNvY2tldEFkZHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJzZWRFeGNsdXNpb25BcnJheSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkRXhjbHVzaW9uQXJyYXkgPSBwYXJzZUV4Y2x1c2lvbkxpc3QoZXhjbHVzaW9uTGlzdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNVUkxJbkV4Y2x1c2lvbkxpc3QodXJsLCBwYXJzZWRFeGNsdXNpb25BcnJheSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgamF2YS5uZXQuUHJveHkoamF2YS5uZXQuUHJveHkuVHlwZS5IVFRQLCBzb2NrZXRBZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gamF2YS5uZXQuUHJveHkuTk9fUFJPWFk7CisgICAgfQorCisgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgZnVuY3Rpb24gLyBkZXByZWNhdGUKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBwcmVmZXJyZWQgcHJveHkgdG8gYmUgdXNlZCBieSBjbGllbnRzLiBUaGlzIGlzIGEgd3JhcHBlcgogICAgICAqIGFyb3VuZCB7QGxpbmsgYW5kcm9pZC5uZXQuUHJveHkjZ2V0SG9zdCgpfS4gQ3VycmVudGx5IG5vIHByb3h5IHdpbGwKQEAgLTEzOCwyNiArMjc4LDIzIEBACiAgICAgICogYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19ORVRXT1JLX1NUQVRFCiAgICAgICogQHJldHVybiBUaGUgcHJlZmVycmVkIHByb3h5IHRvIGJlIHVzZWQgYnkgY2xpZW50cywgb3IgbnVsbCBpZiB0aGVyZQogICAgICAqIGlzIG5vIHByb3h5LgotICAgICAqCiAgICAgICoge0BoaWRlfQogICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBwdWJsaWMgSHR0cEhvc3QgZ2V0UHJlZmVycmVkSHR0cEhvc3QoQ29udGV4dCBjb250ZXh0LAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSHR0cEhvc3QgZ2V0UHJlZmVycmVkSHR0cEhvc3QoQ29udGV4dCBjb250ZXh0LAogICAgICAgICAgICAgU3RyaW5nIHVybCkgewotICAgICAgICBpZiAoIWlzTG9jYWxIb3N0KHVybCkgJiYgIWlzTmV0d29ya1dpZmkoY29udGV4dCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm94eUhvc3QgPSBQcm94eS5nZXRIb3N0KGNvbnRleHQpOwotICAgICAgICAgICAgaWYgKHByb3h5SG9zdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIdHRwSG9zdChwcm94eUhvc3QsIFByb3h5LmdldFBvcnQoY29udGV4dCksICJodHRwIik7Ci0gICAgICAgICAgICB9CisgICAgICAgIGphdmEubmV0LlByb3h5IHByZWZQcm94eSA9IGdldFByb3h5KGNvbnRleHQsIHVybCk7CisgICAgICAgIGlmIChwcmVmUHJveHkuZXF1YWxzKGphdmEubmV0LlByb3h5Lk5PX1BST1hZKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBzYSA9IChJbmV0U29ja2V0QWRkcmVzcylwcmVmUHJveHkuYWRkcmVzcygpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBIdHRwSG9zdChzYS5nZXRIb3N0TmFtZSgpLCBzYS5nZXRQb3J0KCksICJodHRwIik7CiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBib29sZWFuIGlzTG9jYWxIb3N0KFN0cmluZyB1cmwpIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzTG9jYWxIb3N0KFN0cmluZyB1cmwpIHsKICAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLQogICAgICAgICB0cnkgewogICAgICAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVSSS5jcmVhdGUodXJsKTsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBob3N0ID0gdXJpLmdldEhvc3QoKTsKQEAgLTE3NCwyNSArMzExLDE3MCBAQAogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWV4KSB7CiAgICAgICAgICAgICAvLyBJZ25vcmUgKFVSSS5jcmVhdGUpCiAgICAgICAgIH0KLQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgc3RhdGljIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBpc05ldHdvcmtXaWZpKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2V0dGluZ3NPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CisKKyAgICAgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworCisgICAgICAgIFNldHRpbmdzT2JzZXJ2ZXIoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgICAgIHN1cGVyKG5ldyBIYW5kbGVyKGN0eC5nZXRNYWluTG9vcGVyKCkpKTsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gY3R4OwogICAgICAgICB9CiAKLSAgICAgICAgZmluYWwgQ29ubmVjdGl2aXR5TWFuYWdlciBjb25uZWN0aXZpdHkgPSAoQ29ubmVjdGl2aXR5TWFuYWdlcikKLSAgICAgICAgICAgIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKLSAgICAgICAgaWYgKGNvbm5lY3Rpdml0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBOZXR3b3JrSW5mbyBpbmZvID0gY29ubmVjdGl2aXR5LmdldEFjdGl2ZU5ldHdvcmtJbmZvKCk7Ci0gICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIGluZm8uZ2V0VHlwZSgpID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgICAgICAgcGFyc2VHbG9iYWxQcm94eUluZm9SZWFkTG9ja2VkKG1Db250ZXh0KTsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIHJlZ2lzdGVyQ29udGVudE9ic2VydmVyc1JlYWRMb2NrZWQoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgVXJpIHVyaUdsb2JhbFByb3h5ID0gU2V0dGluZ3MuU2VjdXJlLmdldFVyaUZvcihTZXR0aW5ncy5TZWN1cmUuSFRUUF9QUk9YWSk7CisgICAgICAgIFVyaSB1cmlHbG9iYWxFeGNsTGlzdCA9CisgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0VXJpRm9yKFNldHRpbmdzLlNlY3VyZS5IVFRQX1BST1hZX0VYQ0xVU0lPTl9MSVNUKTsKKworICAgICAgICAvLyBObyBsb2NrIHVwZ3JhZGluZyAoZnJvbSByZWFkIHRvIHdyaXRlKSBhbGxvd2VkCisgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgICAgIHNQcm94eUluZm9Mb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNHbG9iYWxQcm94eUNoYW5nZWRPYnNlcnZlciA9IG5ldyBTZXR0aW5nc09ic2VydmVyKGN0eCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBEb3duZ3JhZGluZyBsb2NrcyAoZnJvbSB3cml0ZSB0byByZWFkKSBpcyBhbGxvd2VkCisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICB9CisgICAgICAgIGN0eC5nZXRDb250ZW50UmVzb2x2ZXIoKS5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcih1cmlHbG9iYWxQcm94eSwgZmFsc2UsCisgICAgICAgICAgICAgICAgc0dsb2JhbFByb3h5Q2hhbmdlZE9ic2VydmVyKTsKKyAgICAgICAgY3R4LmdldENvbnRlbnRSZXNvbHZlcigpLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKHVyaUdsb2JhbEV4Y2xMaXN0LCBmYWxzZSwKKyAgICAgICAgICAgICAgICBzR2xvYmFsUHJveHlDaGFuZ2VkT2JzZXJ2ZXIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgcGFyc2VHbG9iYWxQcm94eUluZm9SZWFkTG9ja2VkKENvbnRleHQgY3R4KSB7CisgICAgICAgIENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIgPSBjdHguZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgIFN0cmluZyBwcm94eUhvc3QgPSAgU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICBjb250ZW50UmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkhUVFBfUFJPWFkpOworICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocHJveHlIb3N0KSkgeworICAgICAgICAgICAgLy8gQ2xlYXIgc2lnbmFsCisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICAgICAgc0dsb2JhbFByb3h5U3BlYyA9IG51bGw7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBleGNsdXNpb25MaXN0U3BlYyA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgY29udGVudFJlc29sdmVyLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5IVFRQX1BST1hZX0VYQ0xVU0lPTl9MSVNUKTsKKyAgICAgICAgU3RyaW5nIGhvc3QgPSBwYXJzZUhvc3QocHJveHlIb3N0KTsKKyAgICAgICAgaW50IHBvcnQgPSBwYXJzZVBvcnQocHJveHlIb3N0KTsKKyAgICAgICAgUHJveHlTcGVjIHRtcFByb3h5U3BlYyA9IG51bGw7CisgICAgICAgIGlmIChwcm94eUhvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgdG1wUHJveHlTcGVjID0gbmV3IFByb3h5U3BlYygpOworICAgICAgICAgICAgdG1wUHJveHlTcGVjLmFkZHJlc3MgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoaG9zdCwgcG9ydCk7CisgICAgICAgICAgICB0bXBQcm94eVNwZWMuZXhjbHVzaW9uTGlzdCA9IHBhcnNlRXhjbHVzaW9uTGlzdChleGNsdXNpb25MaXN0U3BlYyk7CisgICAgICAgIH0KKyAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgc1Byb3h5SW5mb0xvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICBzR2xvYmFsUHJveHlTcGVjID0gdG1wUHJveHlTcGVjOworICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgc1Byb3h5SW5mb0xvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gcGFyc2VFeGNsdXNpb25MaXN0KFN0cmluZyBleGNsdXNpb25MaXN0KSB7CisgICAgICAgIFN0cmluZ1tdIHByb2Nlc3NlZEFycmF5ID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShleGNsdXNpb25MaXN0KSkgeworICAgICAgICAgICAgU3RyaW5nW10gZXhjbHVzaW9uTGlzdEFycmF5ID0gZXhjbHVzaW9uTGlzdC50b0xvd2VyQ2FzZSgpLnNwbGl0KCIsIik7CisgICAgICAgICAgICBwcm9jZXNzZWRBcnJheSA9IG5ldyBTdHJpbmdbZXhjbHVzaW9uTGlzdEFycmF5Lmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1c2lvbkxpc3RBcnJheS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBlbnRyeSA9IGV4Y2x1c2lvbkxpc3RBcnJheVtpXS50cmltKCk7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoIi4iKSkgeworICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IGVudHJ5LnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJvY2Vzc2VkQXJyYXlbaV0gPSBlbnRyeTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEFycmF5OwogICAgIH0KLX07CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSBzeW50YXggb2YgaG9zdG5hbWUsIHBvcnQgYW5kIGV4Y2x1c2lvbiBsaXN0IGVudHJpZXMKKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlKFN0cmluZyBob3N0bmFtZSwgU3RyaW5nIHBvcnQsIFN0cmluZyBleGNsTGlzdCkgeworICAgICAgICBNYXRjaGVyIG1hdGNoID0gSE9TVE5BTUVfUEFUVEVSTi5tYXRjaGVyKGhvc3RuYW1lKTsKKyAgICAgICAgTWF0Y2hlciBsaXN0TWF0Y2ggPSBFWENMTElTVF9QQVRURVJOLm1hdGNoZXIoZXhjbExpc3QpOworCisgICAgICAgIGlmICghbWF0Y2gubWF0Y2hlcygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWxpc3RNYXRjaC5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChob3N0bmFtZS5sZW5ndGgoKSA+IDAgJiYgcG9ydC5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocG9ydC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIGlmIChob3N0bmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHBvcnRWYWwgPSAtMTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcG9ydFZhbCA9IEludGVnZXIucGFyc2VJbnQocG9ydCk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocG9ydFZhbCA8PSAwIHx8IHBvcnRWYWwgPiAweEZGRkYpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQW5kcm9pZFByb3h5U2VsZWN0b3JSb3V0ZVBsYW5uZXIKKyAgICAgICAgICAgIGV4dGVuZHMgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi5Qcm94eVNlbGVjdG9yUm91dGVQbGFubmVyIHsKKworICAgICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICAgICAgcHVibGljIEFuZHJvaWRQcm94eVNlbGVjdG9yUm91dGVQbGFubmVyKFNjaGVtZVJlZ2lzdHJ5IHNjaHJlZywgUHJveHlTZWxlY3RvciBwcm9zZWwsCisgICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihzY2hyZWcsIHByb3NlbCk7CisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGphdmEubmV0LlByb3h5IGNob29zZVByb3h5KExpc3Q8amF2YS5uZXQuUHJveHk+IHByb3hpZXMsIEh0dHBIb3N0IHRhcmdldCwKKyAgICAgICAgICAgICAgICBIdHRwUmVxdWVzdCByZXF1ZXN0LCBIdHRwQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UHJveHkobUNvbnRleHQsIHRhcmdldC5nZXRIb3N0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgSHR0cEhvc3QgZGV0ZXJtaW5lUHJveHkoSHR0cEhvc3QgdGFyZ2V0LCBIdHRwUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgIEh0dHBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRQcmVmZXJyZWRIdHRwSG9zdChtQ29udGV4dCwgdGFyZ2V0LmdldEhvc3ROYW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBIdHRwUm91dGUgZGV0ZXJtaW5lUm91dGUoSHR0cEhvc3QgdGFyZ2V0LCBIdHRwUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgIEh0dHBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIEh0dHBIb3N0IHByb3h5ID0gZ2V0UHJlZmVycmVkSHR0cEhvc3QobUNvbnRleHQsIHRhcmdldC5nZXRIb3N0TmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChwcm94eSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIdHRwUm91dGUodGFyZ2V0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIdHRwUm91dGUodGFyZ2V0LCBudWxsLCBwcm94eSwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBIdHRwUm91dGVQbGFubmVyIGdldEFuZHJvaWRQcm94eVNlbGVjdG9yUm91dGVQbGFubmVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBBbmRyb2lkUHJveHlTZWxlY3RvclJvdXRlUGxhbm5lciByZXQgPSBuZXcgQW5kcm9pZFByb3h5U2VsZWN0b3JSb3V0ZVBsYW5uZXIoCisgICAgICAgICAgICAgICAgbmV3IFNjaGVtZVJlZ2lzdHJ5KCksIFByb3h5U2VsZWN0b3IuZ2V0RGVmYXVsdCgpLCBjb250ZXh0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvUHJveHlQcm9wZXJ0aWVzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvUHJveHlQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZkMGQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Qcm94eVByb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5uZXQ7CisKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKKworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworCisvKioKKyAqIEEgY29udGFpbmVyIGNsYXNzIGZvciB0aGUgaHR0cCBwcm94eSBpbmZvCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgUHJveHlQcm9wZXJ0aWVzIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisKKyAgICBwcml2YXRlIEluZXRTb2NrZXRBZGRyZXNzIG1Qcm94eTsKKyAgICBwcml2YXRlIFN0cmluZyBtRXhjbHVzaW9uTGlzdDsKKworICAgIHB1YmxpYyBQcm94eVByb3BlcnRpZXMoKSB7CisgICAgfQorCisgICAgLy8gY29weSBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIGNsb25lCisgICAgcHVibGljIFByb3h5UHJvcGVydGllcyhQcm94eVByb3BlcnRpZXMgc291cmNlKSB7CisgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgbVByb3h5ID0gc291cmNlLmdldFNvY2tldEFkZHJlc3MoKTsKKyAgICAgICAgICAgIFN0cmluZyBleGNsdXNpb25MaXN0ID0gc291cmNlLmdldEV4Y2x1c2lvbkxpc3QoKTsKKyAgICAgICAgICAgIGlmIChleGNsdXNpb25MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRXhjbHVzaW9uTGlzdCA9IG5ldyBTdHJpbmcoZXhjbHVzaW9uTGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSW5ldFNvY2tldEFkZHJlc3MgZ2V0U29ja2V0QWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIG1Qcm94eTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTb2NrZXRBZGRyZXNzKEluZXRTb2NrZXRBZGRyZXNzIHByb3h5KSB7CisgICAgICAgIG1Qcm94eSA9IHByb3h5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhjbHVzaW9uTGlzdCgpIHsKKyAgICAgICAgcmV0dXJuIG1FeGNsdXNpb25MaXN0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEV4Y2x1c2lvbkxpc3QoU3RyaW5nIGV4Y2x1c2lvbkxpc3QpIHsKKyAgICAgICAgbUV4Y2x1c2lvbkxpc3QgPSBleGNsdXNpb25MaXN0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBpZiAobVByb3h5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChtUHJveHkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAobUV4Y2x1c2lvbkxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiB4bD0iKS5hcHBlbmQobUV4Y2x1c2lvbkxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgUGFyY2VsYWJsZSBpbnRlcmZhY2UKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBTdHJpbmcgaG9zdCA9IG51bGw7CisgICAgICAgIGlmIChtUHJveHkgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcyBhZGRyID0gbVByb3h5LmdldEFkZHJlc3MoKTsKKyAgICAgICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGhvc3QgPSBhZGRyLmdldEhvc3RBZGRyZXNzKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRG9lcyBub3QgcmVzb2x2ZSB3aGVuIGFkZHIgaXMgbnVsbCAqLworICAgICAgICAgICAgICAgICAgICBob3N0ID0gbVByb3h5LmdldEhvc3ROYW1lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoKGJ5dGUpMSk7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKGhvc3QpOworICAgICAgICAgICAgZGVzdC53cml0ZUludChtUHJveHkuZ2V0UG9ydCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKChieXRlKTApOworICAgICAgICB9CisgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobUV4Y2x1c2lvbkxpc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgUGFyY2VsYWJsZSBpbnRlcmZhY2UuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENyZWF0b3I8UHJveHlQcm9wZXJ0aWVzPiBDUkVBVE9SID0KKyAgICAgICAgbmV3IENyZWF0b3I8UHJveHlQcm9wZXJ0aWVzPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBQcm94eVByb3BlcnRpZXMgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgICAgICBQcm94eVByb3BlcnRpZXMgcHJveHlQcm9wZXJ0aWVzID0gbmV3IFByb3h5UHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIGlmIChpbi5yZWFkQnl0ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBob3N0ID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm94eVByb3BlcnRpZXMuc2V0U29ja2V0QWRkcmVzcyhJbmV0U29ja2V0QWRkcmVzcy5jcmVhdGVVbnJlc29sdmVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0LCBwb3J0KSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJveHlQcm9wZXJ0aWVzLnNldEV4Y2x1c2lvbkxpc3QoaW4ucmVhZFN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJveHlQcm9wZXJ0aWVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgUHJveHlQcm9wZXJ0aWVzW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb3h5UHJvcGVydGllc1tzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9VcmkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9VcmkuamF2YQppbmRleCA0N2ZhYWJhLi4zYjIxNTkwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvVXJpLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1VyaS5qYXZhCkBAIC0yOCw4ICsyOCwxMCBAQAogaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbUFjY2VzczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiAvKioKICAqIEltbXV0YWJsZSBVUkkgcmVmZXJlbmNlLiBBIFVSSSByZWZlcmVuY2UgaW5jbHVkZXMgYSBVUkkgYW5kIGEgZnJhZ21lbnQsIHRoZQpAQCAtNDcsNyArNDksNyBAQAogICAgIC8qCiAKICAgICBUaGlzIGNsYXNzIGFpbXMgdG8gZG8gYXMgbGl0dGxlIHVwIGZyb250IHdvcmsgYXMgcG9zc2libGUuIFRvIGFjY29tcGxpc2gKLSAgICB0aGF0LCB3ZSB2YXJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbmRpbmcgb24gd2hhdCB0aGUgdXNlciBwYXNzZXMgaW4uCisgICAgdGhhdCwgd2UgdmFyeSB0aGUgaW1wbGVtZW50YXRpb24gZGVwZW5kaW5nIG9uIHdoYXQgdGhlIHVzZXIgcGFzc2VzIGluLgogICAgIEZvciBleGFtcGxlLCB3ZSBoYXZlIG9uZSBpbXBsZW1lbnRhdGlvbiBpZiB0aGUgdXNlciBwYXNzZXMgaW4gYQogICAgIFVSSSBzdHJpbmcgKFN0cmluZ1VyaSkgYW5kIGFub3RoZXIgaWYgdGhlIHVzZXIgcGFzc2VzIGluIHRoZQogICAgIGluZGl2aWR1YWwgY29tcG9uZW50cyAoT3BhcXVlVXJpKS4KQEAgLTEyNTMsMTQgKzEyNTUsMTYgQEAKICAgICAgKiBjb25jdXJyZW50IHVzZS4KICAgICAgKgogICAgICAqIDxwPkFuIGFic29sdXRlIGhpZXJhcmNoaWNhbCBVUkkgcmVmZXJlbmNlIGZvbGxvd3MgdGhlIHBhdHRlcm46Ci0gICAgICoge0Bjb2RlICZsdDtzY2hlbWUmZ3Q7Oi8vJmx0O2F1dGhvcml0eSZndDsmbHQ7YWJzb2x1dGUgcGF0aCZndDs/Jmx0O3F1ZXJ5Jmd0OyMmbHQ7ZnJhZ21lbnQmZ3Q7fQorICAgICAqIHtAY29kZSA8c2NoZW1lPjovLzxhdXRob3JpdHk+PGFic29sdXRlIHBhdGg+PzxxdWVyeT4jPGZyYWdtZW50Pn0KICAgICAgKgogICAgICAqIDxwPlJlbGF0aXZlIFVSSSByZWZlcmVuY2VzICh3aGljaCBhcmUgYWx3YXlzIGhpZXJhcmNoaWNhbCkgZm9sbG93IG9uZQotICAgICAqIG9mIHR3byBwYXR0ZXJuczoge0Bjb2RlICZsdDtyZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoJmd0Oz8mbHQ7cXVlcnkmZ3Q7IyZsdDtmcmFnbWVudCZndDt9Ci0gICAgICogb3Ige0Bjb2RlIC8vJmx0O2F1dGhvcml0eSZndDsmbHQ7YWJzb2x1dGUgcGF0aCZndDs/Jmx0O3F1ZXJ5Jmd0OyMmbHQ7ZnJhZ21lbnQmZ3Q7fQorICAgICAqIG9mIHR3byBwYXR0ZXJuczoge0Bjb2RlIDxyZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoPj88cXVlcnk+IzxmcmFnbWVudD59CisgICAgICogb3Ige0Bjb2RlIC8vPGF1dGhvcml0eT48YWJzb2x1dGUgcGF0aD4/PHF1ZXJ5PiM8ZnJhZ21lbnQ+fQogICAgICAqCiAgICAgICogPHA+QW4gb3BhcXVlIFVSSSBmb2xsb3dzIHRoaXMgcGF0dGVybjoKLSAgICAgKiB7QGNvZGUgJmx0O3NjaGVtZSZndDs6Jmx0O29wYXF1ZSBwYXJ0Jmd0OyMmbHQ7ZnJhZ21lbnQmZ3Q7fQorICAgICAqIHtAY29kZSA8c2NoZW1lPjo8b3BhcXVlIHBhcnQ+IzxmcmFnbWVudD59CisgICAgICogCisgICAgICogPHA+VXNlIHtAbGluayBVcmkjYnVpbGRVcG9uKCl9IHRvIG9idGFpbiBhIGJ1aWxkZXIgcmVwcmVzZW50aW5nIGFuIGV4aXN0aW5nIFVSSS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewogCkBAIC0xNDQ3LDYgKzE0NTEsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBDbGVhcnMgdGhlIHRoZSBwcmV2aW91c2x5IHNldCBxdWVyeS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGNsZWFyUXVlcnkoKSB7CisgICAgICAgICAgcmV0dXJuIHF1ZXJ5KChQYXJ0KSBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgogICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgVXJpIHdpdGggdGhlIGN1cnJlbnQgYXR0cmlidXRlcy4KICAgICAgICAgICoKICAgICAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgVVJJIGlzIG9wYXF1ZSBhbmQgdGhlCkBAIC0xNDkxLDE5ICsxNTAyLDYwIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNldCBvZiB0aGUgdW5pcXVlIG5hbWVzIG9mIGFsbCBxdWVyeSBwYXJhbWV0ZXJzLiBJdGVyYXRpbmcKKyAgICAgKiBvdmVyIHRoZSBzZXQgd2lsbCByZXR1cm4gdGhlIG5hbWVzIGluIG9yZGVyIG9mIHRoZWlyIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgaXNuJ3QgYSBoaWVyYXJjaGljYWwgVVJJCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgc2V0IG9mIGRlY29kZWQgbmFtZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UXVlcnlQYXJhbWV0ZXJOYW1lcygpIHsKKyAgICAgICAgaWYgKGlzT3BhcXVlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihOT1RfSElFUkFSQ0hJQ0FMKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBxdWVyeSA9IGdldEVuY29kZWRRdWVyeSgpOworICAgICAgICBpZiAocXVlcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBMaW5rZWRIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaW50IG5leHQgPSBxdWVyeS5pbmRleE9mKCcmJywgc3RhcnQpOworICAgICAgICAgICAgaW50IGVuZCA9IChuZXh0ID09IC0xKSA/IHF1ZXJ5Lmxlbmd0aCgpIDogbmV4dDsKKworICAgICAgICAgICAgaW50IHNlcGFyYXRvciA9IHF1ZXJ5LmluZGV4T2YoJz0nLCBzdGFydCk7CisgICAgICAgICAgICBpZiAoc2VwYXJhdG9yID4gZW5kIHx8IHNlcGFyYXRvciA9PSAtMSkgeworICAgICAgICAgICAgICAgIHNlcGFyYXRvciA9IGVuZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBxdWVyeS5zdWJzdHJpbmcoc3RhcnQsIHNlcGFyYXRvcik7CisgICAgICAgICAgICBuYW1lcy5hZGQoZGVjb2RlKG5hbWUpKTsKKworICAgICAgICAgICAgLy8gTW92ZSBzdGFydCB0byBlbmQgb2YgbmFtZS4KKyAgICAgICAgICAgIHN0YXJ0ID0gZW5kICsgMTsKKyAgICAgICAgfSB3aGlsZSAoc3RhcnQgPCBxdWVyeS5sZW5ndGgoKSk7CisKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChuYW1lcyk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2VhcmNoZXMgdGhlIHF1ZXJ5IHN0cmluZyBmb3IgcGFyYW1ldGVyIHZhbHVlcyB3aXRoIHRoZSBnaXZlbiBrZXkuCiAgICAgICoKICAgICAgKiBAcGFyYW0ga2V5IHdoaWNoIHdpbGwgYmUgZW5jb2RlZAogICAgICAqCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIGlzbid0IGEgaGllcmFyY2hpY2FsIFVSSQogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYga2V5IGlzIG51bGwKLSAgICAgKgogICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGRlY29kZWQgdmFsdWVzCiAgICAgICovCiAgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRRdWVyeVBhcmFtZXRlcnMoU3RyaW5nIGtleSkgewogICAgICAgICBpZiAoaXNPcGFxdWUoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE5PVF9ISUVSQVJDSElDQUwpOwogICAgICAgICB9CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigia2V5Iik7CisgICAgICAgIH0KIAogICAgICAgICBTdHJpbmcgcXVlcnkgPSBnZXRFbmNvZGVkUXVlcnkoKTsKICAgICAgICAgaWYgKHF1ZXJ5ID09IG51bGwpIHsKQEAgLTE1MTcsMzkgKzE1NjksMzQgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIFByZXBlbmQgcXVlcnkgd2l0aCAiJiIgbWFraW5nIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdGhlIHNhbWUgYXMgdGhlCi0gICAgICAgIC8vIHJlc3QuCi0gICAgICAgIHF1ZXJ5ID0gIiYiICsgcXVlcnk7Ci0KLSAgICAgICAgLy8gUGFyYW1ldGVyIHByZWZpeC4KLSAgICAgICAgU3RyaW5nIHByZWZpeCA9ICImIiArIGVuY29kZWRLZXkgKyAiPSI7Ci0KICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CiAKICAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgaW50IGxlbmd0aCA9IHF1ZXJ5Lmxlbmd0aCgpOwotICAgICAgICB3aGlsZSAoc3RhcnQgPCBsZW5ndGgpIHsKLSAgICAgICAgICAgIHN0YXJ0ID0gcXVlcnkuaW5kZXhPZihwcmVmaXgsIHN0YXJ0KTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaW50IG5leHRBbXBlcnNhbmQgPSBxdWVyeS5pbmRleE9mKCcmJywgc3RhcnQpOworICAgICAgICAgICAgaW50IGVuZCA9IG5leHRBbXBlcnNhbmQgIT0gLTEgPyBuZXh0QW1wZXJzYW5kIDogcXVlcnkubGVuZ3RoKCk7CiAKLSAgICAgICAgICAgIGlmIChzdGFydCA9PSAtMSkgewotICAgICAgICAgICAgICAgIC8vIE5vIG1vcmUgdmFsdWVzLgorICAgICAgICAgICAgaW50IHNlcGFyYXRvciA9IHF1ZXJ5LmluZGV4T2YoJz0nLCBzdGFydCk7CisgICAgICAgICAgICBpZiAoc2VwYXJhdG9yID4gZW5kIHx8IHNlcGFyYXRvciA9PSAtMSkgeworICAgICAgICAgICAgICAgIHNlcGFyYXRvciA9IGVuZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNlcGFyYXRvciAtIHN0YXJ0ID09IGVuY29kZWRLZXkubGVuZ3RoKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgcXVlcnkucmVnaW9uTWF0Y2hlcyhzdGFydCwgZW5jb2RlZEtleSwgMCwgZW5jb2RlZEtleS5sZW5ndGgoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2VwYXJhdG9yID09IGVuZCkgeworICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCgiIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQoZGVjb2RlKHF1ZXJ5LnN1YnN0cmluZyhzZXBhcmF0b3IgKyAxLCBlbmQpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBNb3ZlIHN0YXJ0IHRvIGVuZCBvZiBuYW1lLgorICAgICAgICAgICAgaWYgKG5leHRBbXBlcnNhbmQgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBzdGFydCA9IG5leHRBbXBlcnNhbmQgKyAxOworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTW92ZSBzdGFydCB0byBzdGFydCBvZiB2YWx1ZS4KLSAgICAgICAgICAgIHN0YXJ0ICs9IHByZWZpeC5sZW5ndGgoKTsKLQotICAgICAgICAgICAgLy8gRmluZCBlbmQgb2YgdmFsdWUuCi0gICAgICAgICAgICBpbnQgZW5kID0gcXVlcnkuaW5kZXhPZignJicsIHN0YXJ0KTsKLSAgICAgICAgICAgIGlmIChlbmQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBlbmQgPSBxdWVyeS5sZW5ndGgoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcXVlcnkuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotICAgICAgICAgICAgdmFsdWVzLmFkZChkZWNvZGUodmFsdWUpKTsKLQotICAgICAgICAgICAgc3RhcnQgPSBlbmQ7Ci0gICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAKICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodmFsdWVzKTsKICAgICB9CkBAIC0xNTYwLDcgKzE2MDcsNiBAQAogICAgICAqIEBwYXJhbSBrZXkgd2hpY2ggd2lsbCBiZSBlbmNvZGVkCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIGlzbid0IGEgaGllcmFyY2hpY2FsIFVSSQogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYga2V5IGlzIG51bGwKLSAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIGRlY29kZWQgdmFsdWUgb3IgbnVsbCBpZiBubyBwYXJhbWV0ZXIgaXMgZm91bmQKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5UGFyYW1ldGVyKFN0cmluZyBrZXkpIHsKQEAgLTE1NjgsNyArMTYxNCw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTk9UX0hJRVJBUkNISUNBTCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJrZXkiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigia2V5Iik7CiAgICAgICAgIH0KIAogICAgICAgICBmaW5hbCBTdHJpbmcgcXVlcnkgPSBnZXRFbmNvZGVkUXVlcnkoKTsKQEAgLTE1NzcsMzcgKzE2MjMsNTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkS2V5ID0gZW5jb2RlKGtleSwgbnVsbCk7Ci0gICAgICAgIGZpbmFsIGludCBlbmNvZGVkS2V5TGVuZ3RoID0gZW5jb2RlZEtleS5sZW5ndGgoKTsKKyAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHF1ZXJ5Lmxlbmd0aCgpOworICAgICAgICBpbnQgc3RhcnQgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpbnQgbmV4dEFtcGVyc2FuZCA9IHF1ZXJ5LmluZGV4T2YoJyYnLCBzdGFydCk7CisgICAgICAgICAgICBpbnQgZW5kID0gbmV4dEFtcGVyc2FuZCAhPSAtMSA/IG5leHRBbXBlcnNhbmQgOiBsZW5ndGg7CiAKLSAgICAgICAgaW50IGVuY29kZWRLZXlTZWFyY2hJbmRleCA9IDA7Ci0gICAgICAgIGZpbmFsIGludCBlbmNvZGVkS2V5U2VhcmNoRW5kID0gcXVlcnkubGVuZ3RoKCkgLSAoZW5jb2RlZEtleUxlbmd0aCArIDEpOworICAgICAgICAgICAgaW50IHNlcGFyYXRvciA9IHF1ZXJ5LmluZGV4T2YoJz0nLCBzdGFydCk7CisgICAgICAgICAgICBpZiAoc2VwYXJhdG9yID4gZW5kIHx8IHNlcGFyYXRvciA9PSAtMSkgeworICAgICAgICAgICAgICAgIHNlcGFyYXRvciA9IGVuZDsKKyAgICAgICAgICAgIH0KIAotICAgICAgICB3aGlsZSAoZW5jb2RlZEtleVNlYXJjaEluZGV4IDw9IGVuY29kZWRLZXlTZWFyY2hFbmQpIHsKLSAgICAgICAgICAgIGludCBrZXlJbmRleCA9IHF1ZXJ5LmluZGV4T2YoZW5jb2RlZEtleSwgZW5jb2RlZEtleVNlYXJjaEluZGV4KTsKLSAgICAgICAgICAgIGlmIChrZXlJbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgaW50IGVxdWFsc0luZGV4ID0ga2V5SW5kZXggKyBlbmNvZGVkS2V5TGVuZ3RoOwotICAgICAgICAgICAgaWYgKGVxdWFsc0luZGV4ID49IHF1ZXJ5Lmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocXVlcnkuY2hhckF0KGVxdWFsc0luZGV4KSAhPSAnPScpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkS2V5U2VhcmNoSW5kZXggPSBlcXVhbHNJbmRleCArIDE7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoa2V5SW5kZXggPT0gMCB8fCBxdWVyeS5jaGFyQXQoa2V5SW5kZXggLSAxKSA9PSAnJicpIHsKLSAgICAgICAgICAgICAgICBpbnQgZW5kID0gcXVlcnkuaW5kZXhPZignJicsIGVxdWFsc0luZGV4KTsKLSAgICAgICAgICAgICAgICBpZiAoZW5kID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZCA9IHF1ZXJ5Lmxlbmd0aCgpOworICAgICAgICAgICAgaWYgKHNlcGFyYXRvciAtIHN0YXJ0ID09IGVuY29kZWRLZXkubGVuZ3RoKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgcXVlcnkucmVnaW9uTWF0Y2hlcyhzdGFydCwgZW5jb2RlZEtleSwgMCwgZW5jb2RlZEtleS5sZW5ndGgoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2VwYXJhdG9yID09IGVuZCkgeworICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlKHF1ZXJ5LnN1YnN0cmluZyhzZXBhcmF0b3IgKyAxLCBlbmQpKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZShxdWVyeS5zdWJzdHJpbmcoZXF1YWxzSW5kZXggKyAxLCBlbmQpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZEtleVNlYXJjaEluZGV4ID0gZXF1YWxzSW5kZXggKyAxOwogICAgICAgICAgICAgfQotICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE1vdmUgc3RhcnQgdG8gZW5kIG9mIG5hbWUuCisgICAgICAgICAgICBpZiAobmV4dEFtcGVyc2FuZCAhPSAtMSkgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gbmV4dEFtcGVyc2FuZCArIDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICh0cnVlKTsKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCisgICAgLyoqCisgICAgICogU2VhcmNoZXMgdGhlIHF1ZXJ5IHN0cmluZyBmb3IgdGhlIGZpcnN0IHZhbHVlIHdpdGggdGhlIGdpdmVuIGtleSBhbmQgaW50ZXJwcmV0cyBpdAorICAgICAqIGFzIGEgYm9vbGVhbiB2YWx1ZS4gImZhbHNlIiBhbmQgIjAiIGFyZSBpbnRlcnByZXRlZCBhcyA8Y29kZT5mYWxzZTwvY29kZT4sIGV2ZXJ5dGhpbmcKKyAgICAgKiBlbHNlIGlzIGludGVycHJldGVkIGFzIDxjb2RlPnRydWU8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGtleSB3aGljaCB3aWxsIGJlIGRlY29kZWQKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiB0aGVyZSBpcyBubyBxdWVyeSBwYXJhbWV0ZXIgZm9yIGtleQorICAgICAqIEByZXR1cm4gdGhlIGJvb2xlYW4gaW50ZXJwcmV0YXRpb24gb2YgdGhlIHF1ZXJ5IHBhcmFtZXRlciBrZXkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuUXVlcnlQYXJhbWV0ZXIoU3RyaW5nIGtleSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgU3RyaW5nIGZsYWcgPSBnZXRRdWVyeVBhcmFtZXRlcihrZXkpOworICAgICAgICBpZiAoZmxhZyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisgICAgICAgIGZsYWcgPSBmbGFnLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIHJldHVybiAoISJmYWxzZSIuZXF1YWxzKGZsYWcpICYmICEiMCIuZXF1YWxzKGZsYWcpKTsKKyAgICB9CisKICAgICAvKiogSWRlbnRpZmllcyBhIG51bGwgcGFyY2VsbGVkIFVyaS4gKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVMTF9UWVBFX0lEID0gMDsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1dlYkFkZHJlc3MuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9XZWJBZGRyZXNzLmphdmEKaW5kZXggNDEwMWFiNC4uOWM0ZDZlOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1dlYkFkZHJlc3MuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvV2ViQWRkcmVzcy5qYXZhCkBAIC01Niw3ICs1Niw3IEBACiAgICAgc3RhdGljIFBhdHRlcm4gc0FkZHJlc3NQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKAogICAgICAgICAgICAgLyogc2NoZW1lICAgICovICIoPzooaHR0cHxodHRwc3xmaWxlKVxcOlxcL1xcLyk/IiArCiAgICAgICAgICAgICAvKiBhdXRob3JpdHkgKi8gIig/OihbLUEtWmEtejAtOSRfLishKicoKSw7PyY9XSsoPzpcXDpbLUEtWmEtejAtOSRfLishKicoKSw7PyY9XSspPylAKT8iICsKLSAgICAgICAgICAgIC8qIGhvc3QgICAgICAqLyAiKFstIiArIEdPT0RfSVJJX0NIQVIgKyAiJV9dKyg/OlxcLlstIiArIEdPT0RfSVJJX0NIQVIgKyAiJV9dKykqfFxcW1swLTlhLWZBLUY6XFwuXStcXF0pPyIgKworICAgICAgICAgICAgLyogaG9zdCAgICAgICovICIoWyIgKyBHT09EX0lSSV9DSEFSICsgIiVfLV1bIiArIEdPT0RfSVJJX0NIQVIgKyAiJV9cXC4tXSp8XFxbWzAtOWEtZkEtRjpcXC5dK1xcXSk/IiArCiAgICAgICAgICAgICAvKiBwb3J0ICAgICAgKi8gIig/OlxcOihbMC05XSopKT8iICsKICAgICAgICAgICAgIC8qIHBhdGggICAgICAqLyAiKFxcLz9bXiNdKik/IiArCiAgICAgICAgICAgICAvKiBhbmNob3IgICAgKi8gIi4qIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0FuZHJvaWRIdHRwQ2xpZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9BbmRyb2lkSHR0cENsaWVudC5qYXZhCmluZGV4IGUwN2VlNTkuLjkxNWUzNDIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0FuZHJvaWRIdHRwQ2xpZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQW5kcm9pZEh0dHBDbGllbnQuamF2YQpAQCAtNjEsNiArNjEsNyBAQAogaW1wb3J0IGFuZHJvaWQubmV0LlNTTENlcnRpZmljYXRlU29ja2V0RmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLm5ldC5TU0xTZXNzaW9uQ2FjaGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkJhc2U2NDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiAvKioKQEAgLTgxLDYgKzgyLDExIEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFuZHJvaWRIdHRwQ2xpZW50IjsKIAorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRleHRDb250ZW50VHlwZXMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgInRleHQvIiwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi94bWwiLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL2pzb24iCisgICAgfTsKIAogICAgIC8qKiBJbnRlcmNlcHRvciB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBleGVjdXRpbmcgdGhyZWFkIGlzIGJsb2NrZWQgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIdHRwUmVxdWVzdEludGVyY2VwdG9yIHNUaHJlYWRDaGVja0ludGVyY2VwdG9yID0KQEAgLTM1OCw3ICszNjQsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChsZXZlbCA8IExvZy5WRVJCT1NFIHx8IGxldmVsID4gTG9nLkFTU0VSVCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGV2ZWwgaXMgb3V0IG9mIHJhbmdlIFsiCi0gICAgICAgICAgICAgICAgKyBMb2cuVkVSQk9TRSArICIuLiIgKyBMb2cuQVNTRVJUICsgIl0iKTsgICAgCisgICAgICAgICAgICAgICAgKyBMb2cuVkVSQk9TRSArICIuLiIgKyBMb2cuQVNTRVJUICsgIl0iKTsKICAgICAgICAgfQogCiAgICAgICAgIGN1cmxDb25maWd1cmF0aW9uID0gbmV3IExvZ2dpbmdDb25maWd1cmF0aW9uKG5hbWUsIGxldmVsKTsKQEAgLTQzMSwxMiArNDM3LDE3IEBACiAgICAgICAgICAgICAgICAgaWYgKGVudGl0eS5nZXRDb250ZW50TGVuZ3RoKCkgPCAxMDI0KSB7CiAgICAgICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgICAgICAgICAgICAgIGVudGl0eS53cml0ZVRvKHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbnRpdHlTdHJpbmcgPSBzdHJlYW0udG9TdHJpbmcoKTsKIAotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBDaGVjayB0aGUgY29udGVudCB0eXBlLCB0b28uCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgLS1kYXRhLWFzY2lpIFwiIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGVudGl0eVN0cmluZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcIiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNCaW5hcnlDb250ZW50KHJlcXVlc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZTY0ID0gQmFzZTY0LmVuY29kZVRvU3RyaW5nKHN0cmVhbS50b0J5dGVBcnJheSgpLCBCYXNlNjQuTk9fV1JBUCk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmluc2VydCgwLCAiZWNobyAnIiArIGJhc2U2NCArICInIHwgYmFzZTY0IC1kID4gL3RtcC8kJC5iaW47ICIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiAtLWRhdGEtYmluYXJ5IEAvdG1wLyQkLmJpbiIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVudGl0eVN0cmluZyA9IHN0cmVhbS50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiAtLWRhdGEtYXNjaWkgXCIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGVudGl0eVN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgW1RPTyBNVUNIIERBVEEgVE8gSU5DTFVERV0iKTsKICAgICAgICAgICAgICAgICB9CkBAIC00NDYsNiArNDU3LDMwIEBACiAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0JpbmFyeUNvbnRlbnQoSHR0cFVyaVJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBIZWFkZXJbXSBoZWFkZXJzOworICAgICAgICBoZWFkZXJzID0gcmVxdWVzdC5nZXRIZWFkZXJzKEhlYWRlcnMuQ09OVEVOVF9FTkNPRElORyk7CisgICAgICAgIGlmIChoZWFkZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSGVhZGVyIGhlYWRlciA6IGhlYWRlcnMpIHsKKyAgICAgICAgICAgICAgICBpZiAoImd6aXAiLmVxdWFsc0lnbm9yZUNhc2UoaGVhZGVyLmdldFZhbHVlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGhlYWRlcnMgPSByZXF1ZXN0LmdldEhlYWRlcnMoSGVhZGVycy5DT05URU5UX1RZUEUpOworICAgICAgICBpZiAoaGVhZGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKEhlYWRlciBoZWFkZXIgOiBoZWFkZXJzKSB7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgY29udGVudFR5cGUgOiB0ZXh0Q29udGVudFR5cGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXIuZ2V0VmFsdWUoKS5zdGFydHNXaXRoKGNvbnRlbnRUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGRhdGUgb2YgdGhlIGdpdmVuIEhUVFAgZGF0ZSBzdHJpbmcuIFRoaXMgbWV0aG9kIGNhbiBpZGVudGlmeQogICAgICAqIGFuZCBwYXJzZSB0aGUgZGF0ZSBmb3JtYXRzIGVtaXR0ZWQgYnkgY29tbW9uIEhUVFAgc2VydmVycywgc3VjaCBhcwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQ2VydGlmaWNhdGVDaGFpblZhbGlkYXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQ2VydGlmaWNhdGVDaGFpblZhbGlkYXRvci5qYXZhCmluZGV4IDRjYTU5MDMuLjUwM2M0NzAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0NlcnRpZmljYXRlQ2hhaW5WYWxpZGF0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZUNoYWluVmFsaWRhdG9yLmphdmEKQEAgLTgwLDE0ICs4MCwxMCBAQAogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgWDUwOUNlcnRpZmljYXRlW10gc2VydmVyQ2VydGlmaWNhdGVzID0gbnVsbDsKIAotICAgICAgICAvLyBzdGFydCBoYW5kc2hha2UsIGNsb3NlIHRoZSBzb2NrZXQgaWYgd2UgZmFpbAotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3NsU29ja2V0LnNldFVzZUNsaWVudE1vZGUodHJ1ZSk7Ci0gICAgICAgICAgICBzc2xTb2NrZXQuc3RhcnRIYW5kc2hha2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgY2xvc2VTb2NrZXRUaHJvd0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBzc2xTb2NrZXQsIGUuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gcGVyZm9ybSBTU0wgaGFuZHNoYWtlIik7CisgICAgICAgIC8vIGdldCBhIHZhbGlkIFNTTFNlc3Npb24sIGNsb3NlIHRoZSBzb2NrZXQgaWYgd2UgZmFpbAorICAgICAgICBTU0xTZXNzaW9uIHNzbFNlc3Npb24gPSBzc2xTZXNzaW9uID0gc3NsU29ja2V0LmdldFNlc3Npb24oKTsKKyAgICAgICAgaWYgKCFzc2xTZXNzaW9uLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgY2xvc2VTb2NrZXRUaHJvd0V4Y2VwdGlvbihzc2xTb2NrZXQsICJmYWlsZWQgdG8gcGVyZm9ybSBTU0wgaGFuZHNoYWtlIik7CiAgICAgICAgIH0KIAogICAgICAgICAvLyByZXRyaWV2ZSB0aGUgY2hhaW4gb2YgdGhlIHNlcnZlciBwZWVyIGNlcnRpZmljYXRlcwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvQXN5bmNUYXNrLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9Bc3luY1Rhc2suamF2YQppbmRleCA1ZmIxZDdjLi5mMDMwOWQ2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9Bc3luY1Rhc2suamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9Bc3luY1Rhc2suamF2YQpAQCAtMTYsMTYgKzE2LDE2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5vczsKIAotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbmNlbGxhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlVGFzazsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlVGFzazsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FuY2VsbGF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogCiAvKioKQEAgLTM2LDggKzM2LDggQEAKICAqIDxwPkFuIGFzeW5jaHJvbm91cyB0YXNrIGlzIGRlZmluZWQgYnkgYSBjb21wdXRhdGlvbiB0aGF0IHJ1bnMgb24gYSBiYWNrZ3JvdW5kIHRocmVhZCBhbmQKICAqIHdob3NlIHJlc3VsdCBpcyBwdWJsaXNoZWQgb24gdGhlIFVJIHRocmVhZC4gQW4gYXN5bmNocm9ub3VzIHRhc2sgaXMgZGVmaW5lZCBieSAzIGdlbmVyaWMKICAqIHR5cGVzLCBjYWxsZWQgPGNvZGU+UGFyYW1zPC9jb2RlPiwgPGNvZGU+UHJvZ3Jlc3M8L2NvZGU+IGFuZCA8Y29kZT5SZXN1bHQ8L2NvZGU+LAotICogYW5kIDQgc3RlcHMsIGNhbGxlZCA8Y29kZT5iZWdpbjwvY29kZT4sIDxjb2RlPmRvSW5CYWNrZ3JvdW5kPC9jb2RlPiwKLSAqIDxjb2RlPnByb2Nlc3NQcm9ncmVzczwvY29kZT4gYW5kIDxjb2RlPmVuZDwvY29kZT4uPC9wPgorICogYW5kIDQgc3RlcHMsIGNhbGxlZCA8Y29kZT5vblByZUV4ZWN1dGU8L2NvZGU+LCA8Y29kZT5kb0luQmFja2dyb3VuZDwvY29kZT4sCisgKiA8Y29kZT5vblByb2dyZXNzVXBkYXRlPC9jb2RlPiBhbmQgPGNvZGU+b25Qb3N0RXhlY3V0ZTwvY29kZT4uPC9wPgogICoKICAqIDxoMj5Vc2FnZTwvaDI+CiAgKiA8cD5Bc3luY1Rhc2sgbXVzdCBiZSBzdWJjbGFzc2VkIHRvIGJlIHVzZWQuIFRoZSBzdWJjbGFzcyB3aWxsIG92ZXJyaWRlIGF0IGxlYXN0CkBAIC0xMjMsNiArMTIzLDE2IEBACiAgKiAgICAgPGxpPlRoZSB0YXNrIGNhbiBiZSBleGVjdXRlZCBvbmx5IG9uY2UgKGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZgogICogICAgIGEgc2Vjb25kIGV4ZWN1dGlvbiBpcyBhdHRlbXB0ZWQuKTwvbGk+CiAgKiA8L3VsPgorICoKKyAqIDxoMj5NZW1vcnkgb2JzZXJ2YWJpbGl0eTwvaDI+CisgKiA8cD5Bc3luY1Rhc2sgZ3VhcmFudGVlcyB0aGF0IGFsbCBjYWxsYmFjayBjYWxscyBhcmUgc3luY2hyb25pemVkIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUgZm9sbG93aW5nCisgKiBvcGVyYXRpb25zIGFyZSBzYWZlIHdpdGhvdXQgZXhwbGljaXQgc3luY2hyb25pemF0aW9ucy48L3A+CisgKiA8dWw+CisgKiAgICAgPGxpPlNldCBtZW1iZXIgZmllbGRzIGluIHRoZSBjb25zdHJ1Y3RvciBvciB7QGxpbmsgI29uUHJlRXhlY3V0ZX0sIGFuZCByZWZlciB0byB0aGVtCisgKiAgICAgaW4ge0BsaW5rICNkb0luQmFja2dyb3VuZH0uCisgKiAgICAgPGxpPlNldCBtZW1iZXIgZmllbGRzIGluIHtAbGluayAjZG9JbkJhY2tncm91bmR9LCBhbmQgcmVmZXIgdG8gdGhlbSBpbgorICogICAgIHtAbGluayAjb25Qcm9ncmVzc1VwZGF0ZX0gYW5kIHtAbGluayAjb25Qb3N0RXhlY3V0ZX0uCisgKiA8L3VsPgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXN5bmNUYXNrPFBhcmFtcywgUHJvZ3Jlc3MsIFJlc3VsdD4gewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkFzeW5jVGFzayI7CkBAIC0xNzUsNiArMTg1LDExIEBACiAgICAgICAgIEZJTklTSEVELAogICAgIH0KIAorICAgIC8qKiBAaGlkZSBVc2VkIHRvIGZvcmNlIHN0YXRpYyBoYW5kbGVyIHRvIGJlIGNyZWF0ZWQuICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXQoKSB7CisgICAgICAgIHNIYW5kbGVyLmdldExvb3BlcigpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBuZXcgYXN5bmNocm9ub3VzIHRhc2suIFRoaXMgY29uc3RydWN0b3IgbXVzdCBiZSBpbnZva2VkIG9uIHRoZSBVSSB0aHJlYWQuCiAgICAgICovCkBAIC0xODcsNiArMjAyLDE3IEBACiAgICAgICAgIH07CiAKICAgICAgICAgbUZ1dHVyZSA9IG5ldyBGdXR1cmVUYXNrPFJlc3VsdD4obVdvcmtlcikgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHNldChSZXN1bHQgdikgeworICAgICAgICAgICAgICAgIHN1cGVyLnNldCh2KTsKKyAgICAgICAgICAgICAgICBpZiAoaXNDYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBzSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1FU1NBR0VfUE9TVF9DQU5DRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFzeW5jVGFza1Jlc3VsdDxSZXN1bHQ+KEFzeW5jVGFzay50aGlzLCAoUmVzdWx0W10pIG51bGwpKTsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9uZSgpIHsKICAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2U7CkBAIC00MDIsMTQgKzQyOCwxOSBAQAogICAgICAqIHN0aWxsIHJ1bm5pbmcuIEVhY2ggY2FsbCB0byB0aGlzIG1ldGhvZCB3aWxsIHRyaWdnZXIgdGhlIGV4ZWN1dGlvbiBvZgogICAgICAqIHtAbGluayAjb25Qcm9ncmVzc1VwZGF0ZX0gb24gdGhlIFVJIHRocmVhZC4KICAgICAgKgorICAgICAqIHtAbGluayAjb25Qcm9ncmVzc1VwZGF0ZX0gd2lsbCBub3RlIGJlIGNhbGxlZCBpZiB0aGUgdGFzayBoYXMgYmVlbgorICAgICAqIGNhbmNlbGVkLgorICAgICAqCiAgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgcHJvZ3Jlc3MgdmFsdWVzIHRvIHVwZGF0ZSB0aGUgVUkgd2l0aC4KICAgICAgKgogICAgICAqIEBzZWUgI29uUHJvZ3Jlc3NVcGRhdGUKICAgICAgKiBAc2VlICNkb0luQmFja2dyb3VuZAogICAgICAqLwogICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHB1Ymxpc2hQcm9ncmVzcyhQcm9ncmVzcy4uLiB2YWx1ZXMpIHsKLSAgICAgICAgc0hhbmRsZXIub2J0YWluTWVzc2FnZShNRVNTQUdFX1BPU1RfUFJPR1JFU1MsCi0gICAgICAgICAgICAgICAgbmV3IEFzeW5jVGFza1Jlc3VsdDxQcm9ncmVzcz4odGhpcywgdmFsdWVzKSkuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIGlmICghaXNDYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgc0hhbmRsZXIub2J0YWluTWVzc2FnZShNRVNTQUdFX1BPU1RfUFJPR1JFU1MsCisgICAgICAgICAgICAgICAgICAgIG5ldyBBc3luY1Rhc2tSZXN1bHQ8UHJvZ3Jlc3M+KHRoaXMsIHZhbHVlcykpLnNlbmRUb1RhcmdldCgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGZpbmlzaChSZXN1bHQgcmVzdWx0KSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YQppbmRleCA4OTI1YmQwLi45MjY4Y2QxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0J1aWxkLmphdmEKQEAgLTE5OSw2ICsxOTksMTggQEAKICAgICAgICAgICogPC91bD4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdJTkdFUkJSRUFEID0gQ1VSX0RFVkVMT1BNRU5UOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBOZXh0IG5leHQgdmVyc2lvbiBvZiBBbmRyb2lkLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5BcHBsaWNhdGlvbnMgdGFyZ2V0aW5nIHRoaXMgb3IgYSBsYXRlciByZWxlYXNlIHdpbGwgZ2V0IHRoZXNlCisgICAgICAgICAqIG5ldyBjaGFuZ2VzIGluIGJlaGF2aW9yOjwvcD4KKyAgICAgICAgICogPHVsPgorICAgICAgICAgKiA8bGk+IFRoZSBkZWZhdWx0IHRoZW1lIGZvciBhcHBsaWNhdGlvbnMgaXMgbm93IGRhcmsgaG9sb2dyYXBoaWM6CisgICAgICAgICAqICAgICAge0BsaW5rIGFuZHJvaWQuUi5zdHlsZSNUaGVtZV9Ib2xvfS4KKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPTkVZQ09NQiA9IENVUl9ERVZFTE9QTUVOVDsKICAgICB9CiAgICAgCiAgICAgLyoqIFRoZSB0eXBlIG9mIGJ1aWxkLCBsaWtlICJ1c2VyIiBvciAiZW5nIi4gKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0RlYnVnLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9EZWJ1Zy5qYXZhCmluZGV4IDg2ZjlhNmIuLjJiNGYzOWEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0RlYnVnLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvRGVidWcuamF2YQpAQCAtNzMxLDcgKzczMSw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRHVtcCAiaHByb2YiIGRhdGEgdG8gdGhlIHNwZWNpZmllZCBmaWxlLiAgVGhpcyB3aWxsIGNhdXNlIGEgR0MuCisgICAgICogRHVtcCAiaHByb2YiIGRhdGEgdG8gdGhlIHNwZWNpZmllZCBmaWxlLiAgVGhpcyBtYXkgY2F1c2UgYSBHQy4KICAgICAgKgogICAgICAqIEBwYXJhbSBmaWxlTmFtZSBGdWxsIHBhdGhuYW1lIG9mIG91dHB1dCBmaWxlIChlLmcuICIvc2RjYXJkL2R1bXAuaHByb2YiKS4KICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBWTSB3YXMgYnVpbHQgd2l0aG91dApAQCAtNzQzLDExICs3NDMsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb2xsZWN0ICJocHJvZiIgYW5kIHNlbmQgaXQgdG8gRERNUy4gIFRoaXMgd2lsbCBjYXVzZSBhIEdDLgorICAgICAqIExpa2UgZHVtcEhwcm9mRGF0YShTdHJpbmcpLCBidXQgdGFrZXMgYW4gYWxyZWFkeS1vcGVuZWQKKyAgICAgKiBGaWxlRGVzY3JpcHRvciB0byB3aGljaCB0aGUgdHJhY2UgaXMgd3JpdHRlbi4gIFRoZSBmaWxlIG5hbWUgaXMgYWxzbworICAgICAqIHN1cHBsaWVkIHNpbXBseSBmb3IgbG9nZ2luZy4gIE1ha2VzIGEgZHVwIG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBQcmltYXJpbHkgZm9yIHVzZSBieSB0aGUgImFtIiBzaGVsbCBjb21tYW5kLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcEhwcm9mRGF0YShTdHJpbmcgZmlsZU5hbWUsIEZpbGVEZXNjcmlwdG9yIGZkKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgVk1EZWJ1Zy5kdW1wSHByb2ZEYXRhKGZpbGVOYW1lLCBmZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29sbGVjdCAiaHByb2YiIGFuZCBzZW5kIGl0IHRvIERETVMuICBUaGlzIG1heSBjYXVzZSBhIEdDLgogICAgICAqCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgVk0gd2FzIGJ1aWx0IHdpdGhvdXQKICAgICAgKiAgICAgICAgIEhQUk9GIHN1cHBvcnQuCi0gICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wSHByb2ZEYXRhRGRtcygpIHsKQEAgLTc1NSw2ICs3NjgsMjIgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBXcml0ZXMgbmF0aXZlIGhlYXAgZGF0YSB0byB0aGUgc3BlY2lmaWVkIGZpbGUgZGVzY3JpcHRvci4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBkdW1wTmF0aXZlSGVhcChGaWxlRGVzY3JpcHRvciBmZCk7CisKKyAgICAvKioKKyAgICAgICogUmV0dXJucyBhIGNvdW50IG9mIHRoZSBleHRhbnQgaW5zdGFuY2VzIG9mIGEgY2xhc3MuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBjb3VudEluc3RhbmNlc09mQ2xhc3MoQ2xhc3MgY2xzKSB7CisgICAgICAgIHJldHVybiBWTURlYnVnLmNvdW50SW5zdGFuY2VzT2ZDbGFzcyhjbHMpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzZW50IHRyYW5zYWN0aW9ucyBmcm9tIHRoaXMgcHJvY2Vzcy4KICAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2Ygc2VudCB0cmFuc2FjdGlvbnMgb3IgLTEgaWYgaXQgY291bGQgbm90IHJlYWQgdC4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0ZpbGVVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvRmlsZVV0aWxzLmphdmEKaW5kZXggYTE3YjdmZS4uNzJlMjFkZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvRmlsZVV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvRmlsZVV0aWxzLmphdmEKQEAgLTg1LDYgKzg1LDggQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRQZXJtaXNzaW9ucyhTdHJpbmcgZmlsZSwgaW50W10gb3V0UGVybWlzc2lvbnMpOwogCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHNldFVNYXNrKGludCBtYXNrKTsKKwogICAgIC8qKiByZXR1cm5zIHRoZSBGQVQgZmlsZSBzeXN0ZW0gdm9sdW1lIElEIGZvciB0aGUgdm9sdW1lIG1vdW50ZWQgCiAgICAgICogYXQgdGhlIGdpdmVuIG1vdW50IHBvaW50LCBvciAtMSBmb3IgZmFpbHVyZQogICAgICAqIEBwYXJhbSBtb3VudCBwb2ludCBmb3IgRkFUIHZvbHVtZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvSGFuZGxlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvSGFuZGxlci5qYXZhCmluZGV4IDNiMmJmMWUuLjE2NWU0MzggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0hhbmRsZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9IYW5kbGVyLmphdmEKQEAgLTU4LDcgKzU4LDcgQEAKICAqIHRoZXkgY3JlYXRlLiAgWW91IGNhbiBjcmVhdGUgeW91ciBvd24gdGhyZWFkcywgYW5kIGNvbW11bmljYXRlIGJhY2sgd2l0aAogICogdGhlIG1haW4gYXBwbGljYXRpb24gdGhyZWFkIHRocm91Z2ggYSBIYW5kbGVyLiAgVGhpcyBpcyBkb25lIGJ5IGNhbGxpbmcKICAqIHRoZSBzYW1lIDxlbT5wb3N0PC9lbT4gb3IgPGVtPnNlbmRNZXNzYWdlPC9lbT4gbWV0aG9kcyBhcyBiZWZvcmUsIGJ1dCBmcm9tCi0gKiB5b3VyIG5ldyB0aHJlYWQuICBUaGUgZ2l2ZW4gUnVubmFibGUgb3IgTWVzc2FnZSB3aWxsIHRoYW4gYmUgc2NoZWR1bGVkCisgKiB5b3VyIG5ldyB0aHJlYWQuICBUaGUgZ2l2ZW4gUnVubmFibGUgb3IgTWVzc2FnZSB3aWxsIHRoZW4gYmUgc2NoZWR1bGVkCiAgKiBpbiB0aGUgSGFuZGxlcidzIG1lc3NhZ2UgcXVldWUgYW5kIHByb2Nlc3NlZCB3aGVuIGFwcHJvcHJpYXRlLgogICovCiBwdWJsaWMgY2xhc3MgSGFuZGxlciB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZW1vcnlGaWxlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZW1vcnlGaWxlLmphdmEKaW5kZXggYTgxZTE2Yi4uZjgyNzAyYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVtb3J5RmlsZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL01lbW9yeUZpbGUuamF2YQpAQCAtNTgsNyArNTgsNiBAQAogICAgIHByaXZhdGUgaW50IG1BZGRyZXNzOyAgIC8vIGFkZHJlc3Mgb2YgYXNobWVtIG1lbW9yeQogICAgIHByaXZhdGUgaW50IG1MZW5ndGg7ICAgIC8vIHRvdGFsIGxlbmd0aCBvZiBvdXIgYXNobWVtIHJlZ2lvbgogICAgIHByaXZhdGUgYm9vbGVhbiBtQWxsb3dQdXJnaW5nID0gZmFsc2U7ICAvLyB0cnVlIGlmIG91ciBhc2htZW0gcmVnaW9uIGlzIHVucGlubmVkCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Pd25zUmVnaW9uOyAgLy8gZmFsc2UgaWYgdGhpcyBpcyBhIHJlZiB0byBhbiBleGlzdGluZyBhc2htZW0gcmVnaW9uCiAKICAgICAvKioKICAgICAgKiBBbGxvY2F0ZXMgYSBuZXcgYXNobWVtIHJlZ2lvbi4gVGhlIHJlZ2lvbiBpcyBpbml0aWFsbHkgbm90IHB1cmdhYmxlLgpAQCAtNzAsMzggKzY5LDExIEBACiAgICAgcHVibGljIE1lbW9yeUZpbGUoU3RyaW5nIG5hbWUsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIG1MZW5ndGggPSBsZW5ndGg7CiAgICAgICAgIG1GRCA9IG5hdGl2ZV9vcGVuKG5hbWUsIGxlbmd0aCk7Ci0gICAgICAgIG1BZGRyZXNzID0gbmF0aXZlX21tYXAobUZELCBsZW5ndGgsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOwotICAgICAgICBtT3duc1JlZ2lvbiA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyBtZW1vcnkgZmlsZS4gQ2hhbmdlcyB0byB0aGUgb3JpZ2luYWwgZmlsZQotICAgICAqIHdpbGwgYmUgYXZhaWxhYmxlIHRocm91Z2ggdGhpcyByZWZlcmVuY2UuCi0gICAgICogQ2FsbHMgdG8ge0BsaW5rICNhbGxvd1B1cmdpbmcoYm9vbGVhbil9IG9uIHRoZSByZXR1cm5lZCBNZW1vcnlGaWxlIHdpbGwgZmFpbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmZCBGaWxlIGRlc2NyaXB0b3IgZm9yIGFuIGV4aXN0aW5nIG1lbW9yeSBmaWxlLCBhcyByZXR1cm5lZCBieQotICAgICAqICAgICAgICB7QGxpbmsgI2dldEZpbGVEZXNjcmlwdG9yKCl9LiBUaGlzIGZpbGUgZGVzY3JpcHRvciB3aWxsIGJlIGNsb3NlZAotICAgICAqICAgICAgICBieSB7QGxpbmsgI2Nsb3NlKCl9LgotICAgICAqIEBwYXJhbSBsZW5ndGggTGVuZ3RoIG9mIHRoZSBtZW1vcnkgZmlsZSBpbiBieXRlcy4KLSAgICAgKiBAcGFyYW0gbW9kZSBGaWxlIG1vZGUuIEN1cnJlbnRseSBvbmx5ICJyIiBmb3IgcmVhZC1vbmx5IGFjY2VzcyBpcyBzdXBwb3J0ZWQuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5mZDwvY29kZT4gaXMgbnVsbC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIDxjb2RlPmZkPC9jb2RlPiBkb2VzIG5vdCByZWZlciB0byBhbiBleGlzdGluZyBtZW1vcnkgZmlsZSwKLSAgICAgKiAgICAgICAgIG9yIGlmIHRoZSBmaWxlIG1vZGUgb2YgdGhlIGV4aXN0aW5nIG1lbW9yeSBmaWxlIGlzIG1vcmUgcmVzdHJpY3RpdmUKLSAgICAgKiAgICAgICAgIHRoYW4gPGNvZGU+bW9kZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBNZW1vcnlGaWxlKEZpbGVEZXNjcmlwdG9yIGZkLCBpbnQgbGVuZ3RoLCBTdHJpbmcgbW9kZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiRmlsZSBkZXNjcmlwdG9yIGlzIG51bGwuIik7CisgICAgICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAgICAgICAgICBtQWRkcmVzcyA9IG5hdGl2ZV9tbWFwKG1GRCwgbGVuZ3RoLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BZGRyZXNzID0gMDsKICAgICAgICAgfQotICAgICAgICBpZiAoIWlzTWVtb3J5RmlsZShmZCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vdCBhIG1lbW9yeSBmaWxlLiIpOwotICAgICAgICB9Ci0gICAgICAgIG1MZW5ndGggPSBsZW5ndGg7Ci0gICAgICAgIG1GRCA9IGZkOwotICAgICAgICBtQWRkcmVzcyA9IG5hdGl2ZV9tbWFwKG1GRCwgbGVuZ3RoLCBtb2RlVG9Qcm90KG1vZGUpKTsKLSAgICAgICAgbU93bnNSZWdpb24gPSBmYWxzZTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyMiw3ICs5NCw3IEBACiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7CisgICAgdm9pZCBkZWFjdGl2YXRlKCkgewogICAgICAgICBpZiAoIWlzRGVhY3RpdmF0ZWQoKSkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBuYXRpdmVfbXVubWFwKG1BZGRyZXNzLCBtTGVuZ3RoKTsKQEAgLTE4MSw5ICsxNTMsNiBAQAogICAgICAqIEByZXR1cm4gcHJldmlvdXMgdmFsdWUgb2YgYWxsb3dQdXJnaW5nCiAgICAgICovCiAgICAgc3luY2hyb25pemVkIHB1YmxpYyBib29sZWFuIGFsbG93UHVyZ2luZyhib29sZWFuIGFsbG93UHVyZ2luZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFtT3duc1JlZ2lvbikgewotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJPbmx5IHRoZSBvd25lciBjYW4gbWFrZSBhc2htZW0gcmVnaW9ucyBwdXJnYWJsZS4iKTsKLSAgICAgICAgfQogICAgICAgICBib29sZWFuIG9sZFZhbHVlID0gbUFsbG93UHVyZ2luZzsKICAgICAgICAgaWYgKG9sZFZhbHVlICE9IGFsbG93UHVyZ2luZykgewogICAgICAgICAgICAgbmF0aXZlX3BpbihtRkQsICFhbGxvd1B1cmdpbmcpOwpAQCAtMjYwLDI4ICsyMjksNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgYSBQYXJjZWxGaWxlRGVzY3JpcHRvciBmb3IgdGhlIG1lbW9yeSBmaWxlLiBTZWUge0BsaW5rICNnZXRGaWxlRGVzY3JpcHRvcigpfQotICAgICAqIGZvciBjYXZlYXRzLiBUaGlzIG11c3QgYmUgaGVyZSB0byBhbGxvdyBjbGFzc2VzIG91dHNpZGUgPGNvZGU+YW5kcm9pZC5vczwvY29kZTwgdG8KLSAgICAgKiBtYWtlIFBhcmNlbEZpbGVEZXNjcmlwdG9ycyBmcm9tIE1lbW9yeUZpbGVzLCBhcwotICAgICAqIHtAbGluayBQYXJjZWxGaWxlRGVzY3JpcHRvciNQYXJjZWxGaWxlRGVzY3JpcHRvcihGaWxlRGVzY3JpcHRvcil9IGlzIHBhY2thZ2UgcHJpdmF0ZS4KLSAgICAgKgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZmlsZSBkZXNjcmlwdG9yIG93bmVkIGJ5IHRoaXMgbWVtb3J5IGZpbGUgb2JqZWN0LgotICAgICAqICAgICAgICAgVGhlIGZpbGUgZGVzY3JpcHRvciBpcyBub3QgZHVwbGljYXRlZC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIHRoZSBtZW1vcnkgZmlsZSBoYXMgYmVlbiBjbG9zZWQuCi0gICAgICoKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBQYXJjZWxGaWxlRGVzY3JpcHRvciBnZXRQYXJjZWxGaWxlRGVzY3JpcHRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVEZXNjcmlwdG9yIGZkID0gZ2V0RmlsZURlc2NyaXB0b3IoKTsKLSAgICAgICAgcmV0dXJuIGZkICE9IG51bGwgPyBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IoZmQpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgRmlsZURlc2NyaXB0b3IgZm9yIHRoZSBtZW1vcnkgZmlsZS4gTm90ZSB0aGF0IHRoaXMgZmlsZSBkZXNjcmlwdG9yCi0gICAgICogaXMgb25seSBzYWZlIHRvIHBhc3MgdG8ge0BsaW5rICNNZW1vcnlGaWxlKEZpbGVEZXNjcmlwdG9yLGludCl9KS4gSXQKLSAgICAgKiBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBmaWxlIGRlc2NyaXB0b3Igb3BlcmF0aW9ucyB0aGF0IGV4cGVjdCBhIGZpbGUgZGVzY3JpcHRvcgotICAgICAqIGZvciBhIG5vcm1hbCBmaWxlLgorICAgICAqIEdldHMgYSBGaWxlRGVzY3JpcHRvciBmb3IgdGhlIG1lbW9yeSBmaWxlLgogICAgICAqCiAgICAgICogVGhlIHJldHVybmVkIGZpbGUgZGVzY3JpcHRvciBpcyBub3QgZHVwbGljYXRlZC4KICAgICAgKgpAQCAtMjk0LDE3ICsyNDIsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IgcmVmZXJzIHRvIGEgbWVtb3J5IGZpbGUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIDxjb2RlPmZkPC9jb2RlPiBpcyBub3QgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IuCi0gICAgICoKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01lbW9yeUZpbGUoRmlsZURlc2NyaXB0b3IgZmQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAobmF0aXZlX2dldF9zaXplKGZkKSA+PSAwKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBtZW1vcnkgZmlsZSB0aGF0IHRoZSBmaWxlIGRlc2NyaXB0b3IgcmVmZXJzIHRvLAogICAgICAqIG9yIC0xIGlmIHRoZSBmaWxlIGRlc2NyaXB0b3IgZG9lcyBub3QgcmVmZXIgdG8gYSBtZW1vcnkgZmlsZS4KICAgICAgKgpAQCAtMzE2LDIwICsyNTMsNiBAQAogICAgICAgICByZXR1cm4gbmF0aXZlX2dldF9zaXplKGZkKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGZpbGUgbW9kZSBzdHJpbmcgdG8gYSA8Y29kZT5wcm90PC9jb2RlPiB2YWx1ZSBhcyBleHBlY3RlZCBieQotICAgICAqIG5hdGl2ZV9tbWFwKCkuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZmlsZSBtb2RlIGlzIGludmFsaWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1vZGVUb1Byb3QoU3RyaW5nIG1vZGUpIHsKLSAgICAgICAgaWYgKCJyIi5lcXVhbHMobW9kZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBQUk9UX1JFQUQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBmaWxlIG1vZGU6ICciICsgbW9kZSArICInIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIGNsYXNzIE1lbW9yeUlucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0gewogCiAgICAgICAgIHByaXZhdGUgaW50IG1NYXJrID0gMDsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2UuamF2YQppbmRleCA0OWI3MmZlLi5lYjk0MWU0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZXNzYWdlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVzc2FnZS5qYXZhCkBAIC03Myw3ICs3MywxOCBAQAogICAgICAqIHJlY2VpdmVyLgogICAgICAqLwogICAgIHB1YmxpYyBNZXNzZW5nZXIgcmVwbHlUbzsKLSAgICAKKworICAgIC8qKiBJZiBzZXQgbWVzc2FnZSBpcyBpbiB1c2UgKi8KKyAgICAvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgaW50IEZMQUdfSU5fVVNFID0gMTsKKworICAgIC8qKiBGbGFncyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAoQWxsIGFyZSByZXNlcnZlZCBmb3Igbm93KSAqLworICAgIC8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBpbnQgRkxBR1NfUkVTRVJWRUQgPSB+RkxBR19JTl9VU0U7CisKKyAgICAvKiogRmxhZ3MgdG8gY2xlYXIgaW4gdGhlIGNvcHlGcm9tIG1ldGhvZCAqLworICAgIC8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBpbnQgRkxBR1NfVE9fQ0xFQVJfT05fQ09QWV9GUk9NID0gRkxBR1NfUkVTRVJWRUQgfCBGTEFHX0lOX1VTRTsKKworICAgIC8qcGFja2FnZSovIGludCBmbGFnczsKKwogICAgIC8qcGFja2FnZSovIGxvbmcgd2hlbjsKICAgICAKICAgICAvKnBhY2thZ2UqLyBCdW5kbGUgZGF0YTsKQEAgLTI1Myw2ICsyNjQsNyBAQAogICAgICAqIHRhcmdldC9jYWxsYmFjayBvZiB0aGUgb3JpZ2luYWwgbWVzc2FnZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjb3B5RnJvbShNZXNzYWdlIG8pIHsKKyAgICAgICAgdGhpcy5mbGFncyA9IG8uZmxhZ3MgJiB+RkxBR1NfVE9fQ0xFQVJfT05fQ09QWV9GUk9NOwogICAgICAgICB0aGlzLndoYXQgPSBvLndoYXQ7CiAgICAgICAgIHRoaXMuYXJnMSA9IG8uYXJnMTsKICAgICAgICAgdGhpcy5hcmcyID0gby5hcmcyOwpAQCAtMzUwLDYgKzM2Miw3IEBACiAgICAgfQogCiAgICAgLypwYWNrYWdlKi8gdm9pZCBjbGVhckZvclJlY3ljbGUoKSB7CisgICAgICAgIGZsYWdzID0gMDsKICAgICAgICAgd2hhdCA9IDA7CiAgICAgICAgIGFyZzEgPSAwOwogICAgICAgICBhcmcyID0gMDsKQEAgLTM2MSw2ICszNzQsMTQgQEAKICAgICAgICAgZGF0YSA9IG51bGw7CiAgICAgfQogCisgICAgLypwYWNrYWdlKi8gYm9vbGVhbiBpc0luVXNlKCkgeworICAgICAgICByZXR1cm4gKChmbGFncyAmIEZMQUdfSU5fVVNFKSA9PSBGTEFHX0lOX1VTRSk7CisgICAgfQorCisgICAgLypwYWNrYWdlKi8gdm9pZCBtYXJrSW5Vc2UoKSB7CisgICAgICAgIGZsYWdzIHw9IEZMQUdfSU5fVVNFOworICAgIH0KKwogICAgIC8qKiBDb25zdHJ1Y3RvciAoYnV0IHRoZSBwcmVmZXJyZWQgd2F5IHRvIGdldCBhIE1lc3NhZ2UgaXMgdG8gY2FsbCB7QGxpbmsgI29idGFpbigpIE1lc3NhZ2Uub2J0YWluKCl9KS4KICAgICAqLwogICAgIHB1YmxpYyBNZXNzYWdlKCkgewpAQCAtNDUzLDQgKzQ3NCwzIEBACiAgICAgICAgIHJlcGx5VG8gPSBNZXNzZW5nZXIucmVhZE1lc3Nlbmdlck9yTnVsbEZyb21QYXJjZWwoc291cmNlKTsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2VRdWV1ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVzc2FnZVF1ZXVlLmphdmEKaW5kZXggNjIzN2MwZS4uYmU1YjY4NSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVzc2FnZVF1ZXVlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVzc2FnZVF1ZXVlLmphdmEKQEAgLTEyNCw2ICsxMjQsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobm93ID49IHdoZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1NZXNzYWdlcyA9IG1zZy5uZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dWKSBMb2cudigiTWVzc2FnZVF1ZXVlIiwgIlJldHVybmluZyBtZXNzYWdlOiAiICsgbXNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5tYXJrSW5Vc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtc2c7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UG9sbFRpbWVvdXRNaWxsaXMgPSAoaW50KSBNYXRoLm1pbih3aGVuIC0gbm93LCBJbnRlZ2VyLk1BWF9WQUxVRSk7CkBAIC0xNzcsNyArMTc4LDcgQEAKICAgICB9CiAKICAgICBmaW5hbCBib29sZWFuIGVucXVldWVNZXNzYWdlKE1lc3NhZ2UgbXNnLCBsb25nIHdoZW4pIHsKLSAgICAgICAgaWYgKG1zZy53aGVuICE9IDApIHsKKyAgICAgICAgaWYgKG1zZy5pc0luVXNlKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBBbmRyb2lkUnVudGltZUV4Y2VwdGlvbihtc2cKICAgICAgICAgICAgICAgICAgICAgKyAiIFRoaXMgbWVzc2FnZSBpcyBhbHJlYWR5IGluIHVzZS4iKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvUGFyY2VsRmlsZURlc2NyaXB0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL1BhcmNlbEZpbGVEZXNjcmlwdG9yLmphdmEKaW5kZXggOWQyMTNiMy4uYzFhMTgwOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvUGFyY2VsRmlsZURlc2NyaXB0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvci5qYXZhCkBAIC0xMzQsNiArMTM0LDQ1IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIEZpbGVEZXNjcmlwdG9yIGdldEZpbGVEZXNjcmlwdG9yRnJvbVNvY2tldChTb2NrZXQgc29ja2V0KTsKIAogICAgIC8qKgorICAgICAqIENyZWF0ZSB0d28gUGFyY2VsRmlsZURlc2NyaXB0b3JzIHN0cnVjdHVyZWQgYXMgYSBkYXRhIHBpcGUuICBUaGUgZmlyc3QKKyAgICAgKiBQYXJjZWxGaWxlRGVzY3JpcHRvciBpbiB0aGUgcmV0dXJuZWQgYXJyYXkgaXMgdGhlIHJlYWQgc2lkZTsgdGhlIHNlY29uZAorICAgICAqIGlzIHRoZSB3cml0ZSBzaWRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBjcmVhdGVQaXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZURlc2NyaXB0b3JbXSBmZHMgPSBuZXcgRmlsZURlc2NyaXB0b3JbMl07CisgICAgICAgIGludCByZXMgPSBjcmVhdGVQaXBlTmF0aXZlKGZkcyk7CisgICAgICAgIGlmIChyZXMgPT0gMCkgeworICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBwZmRzID0gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yWzJdOworICAgICAgICAgICAgcGZkc1swXSA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvcihmZHNbMF0pOworICAgICAgICAgICAgcGZkc1sxXSA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvcihmZHNbMV0pOworICAgICAgICAgICAgcmV0dXJuIHBmZHM7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIHBpcGU6IGVycm5vPSIgKyAtcmVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGNyZWF0ZVBpcGVOYXRpdmUoRmlsZURlc2NyaXB0b3JbXSBvdXRGZHMpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIGZpbGUgZGVzY3JpcHRvciBmb3IgYSByZWFkLW9ubHkgY29weSBvZiB0aGUgZ2l2ZW4gZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIERhdGEgdG8gY29weS4KKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIGZvciB0aGUgc2hhcmVkIG1lbW9yeSBhcmVhIHRoYXQgbWF5IGJhY2sgdGhlIGZpbGUgZGVzY3JpcHRvci4KKyAgICAgKiAgICAgICAgVGhpcyBpcyBwdXJlbHkgaW5mb3JtYXRpdmUgYW5kIG1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHJldHVybiBBIFBhcmNlbEZpbGVEZXNjcmlwdG9yLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIHNoYXJlZCBtZW1vcnkgYXJlYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZyb21EYXRhKGJ5dGVbXSBkYXRhLCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgIE1lbW9yeUZpbGUgZmlsZSA9IG5ldyBNZW1vcnlGaWxlKG5hbWUsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgZmlsZS53cml0ZUJ5dGVzKGRhdGEsIDAsIDAsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBmaWxlLmRlYWN0aXZhdGUoKTsKKyAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQgPSBmaWxlLmdldEZpbGVEZXNjcmlwdG9yKCk7CisgICAgICAgIHJldHVybiBmZCAhPSBudWxsID8gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yKGZkKSA6IG51bGw7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIGFjdHVhbCBGaWxlRGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuCiAgICAgICogCiAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBGaWxlRGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9Qcm9jZXNzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9Qcm9jZXNzLmphdmEKaW5kZXggZjY5NWRiYi4uMTIzNWI0ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvUHJvY2Vzcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL1Byb2Nlc3MuamF2YQpAQCAtODYsNiArODYsMTIgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX1VJRCA9IDEwMTA7CiAKICAgICAvKioKKyAgICAgKiBEZWZpbmVzIHRoZSBHSUQgZm9yIHRoZSBncm91cCB0aGF0IGFsbG93cyB3cml0ZSBhY2Nlc3MgdG8gdGhlIFNEIGNhcmQuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRENBUkRfUldfR0lEID0gMTAxNTsKKworICAgIC8qKgogICAgICAqIERlZmluZXMgdGhlIHN0YXJ0IG9mIGEgcmFuZ2Ugb2YgVUlEcyAoYW5kIEdJRHMpLCBnb2luZyBmcm9tIHRoaXMKICAgICAgKiBudW1iZXIgdG8ge0BsaW5rICNMQVNUX0FQUExJQ0FUSU9OX1VJRH0gdGhhdCBhcmUgcmVzZXJ2ZWQgZm9yIGFzc2lnbmluZwogICAgICAqIHRvIGFwcGxpY2F0aW9ucy4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL1N5c3RlbVNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL1N5c3RlbVNlcnZpY2UuamF2YQppbmRleCA0NDdjZDFmLi5kYTI3ZGI1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9TeXN0ZW1TZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvU3lzdGVtU2VydmljZS5qYXZhCkBAIC0yOCw0ICsyOCw5IEBACiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHN0b3AoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoImN0bC5zdG9wIiwgbmFtZSk7CiAgICAgfQorCisgICAgLyoqIFJlcXVlc3QgdGhhdCB0aGUgaW5pdCBkYWVtb24gcmVzdGFydCBhIG5hbWVkIHNlcnZpY2UuICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc3RhcnQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoImN0bC5yZXN0YXJ0IiwgbmFtZSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlRXZlbnRMaXN0ZW5lci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlRXZlbnRMaXN0ZW5lci5qYXZhCmluZGV4IDdiODgzYTcuLmQzZDM5ZDYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZUV2ZW50TGlzdGVuZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VFdmVudExpc3RlbmVyLmphdmEKQEAgLTE4LDcgKzE4LDYgQEAKIAogLyoqCiAgKiBVc2VkIGZvciByZWNlaXZpbmcgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBTdG9yYWdlTWFuYWdlcgotICogQGhpZGUKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFN0b3JhZ2VFdmVudExpc3RlbmVyIHsKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQppbmRleCAyZWJkMDQ5Li44NTU0ZWNlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhCkBAIC0zMjEsNyArMzIxLDYgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBsaXN0ZW5lciBBIHtAbGluayBhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZUV2ZW50TGlzdGVuZXIgU3RvcmFnZUV2ZW50TGlzdGVuZXJ9IG9iamVjdC4KICAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihTdG9yYWdlRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgewpAQCAtMzM4LDcgKzMzNyw2IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gbGlzdGVuZXIgQSB7QGxpbmsgYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VFdmVudExpc3RlbmVyIFN0b3JhZ2VFdmVudExpc3RlbmVyfSBvYmplY3QuCiAgICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJMaXN0ZW5lcihTdG9yYWdlRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgewpAQCAtMzU5LDggKzM1Nyw2IEBACiAKICAgICAvKioKICAgICAgKiBFbmFibGVzIFVTQiBNYXNzIFN0b3JhZ2UgKFVNUykgb24gdGhlIGRldmljZS4KLSAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW5hYmxlVXNiTWFzc1N0b3JhZ2UoKSB7CiAgICAgICAgIHRyeSB7CkBAIC0zNzIsOCArMzY4LDYgQEAKIAogICAgIC8qKgogICAgICAqIERpc2FibGVzIFVTQiBNYXNzIFN0b3JhZ2UgKFVNUykgb24gdGhlIGRldmljZS4KLSAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGlzYWJsZVVzYk1hc3NTdG9yYWdlKCkgewogICAgICAgICB0cnkgewpAQCAtMzg2LDggKzM4MCw2IEBACiAgICAgLyoqCiAgICAgICogUXVlcnkgaWYgYSBVU0IgTWFzcyBTdG9yYWdlIChVTVMpIGhvc3QgaXMgY29ubmVjdGVkLgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBVTVMgaG9zdCBpcyBjb25uZWN0ZWQuCi0gICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzVXNiTWFzc1N0b3JhZ2VDb25uZWN0ZWQoKSB7CiAgICAgICAgIHRyeSB7CkBAIC00MDEsOCArMzkzLDYgQEAKICAgICAvKioKICAgICAgKiBRdWVyeSBpZiBhIFVTQiBNYXNzIFN0b3JhZ2UgKFVNUykgaXMgZW5hYmxlZCBvbiB0aGUgZGV2aWNlLgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBVTVMgaG9zdCBpcyBlbmFibGVkLgotICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1VzYk1hc3NTdG9yYWdlRW5hYmxlZCgpIHsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZVJlc3VsdENvZGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZVJlc3VsdENvZGUuamF2YQppbmRleCAwNzVmNDdmLi4wN2Q5NWRmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VSZXN1bHRDb2RlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlUmVzdWx0Q29kZS5qYXZhCkBAIC0xOSw4ICsxOSw2IEBACiAvKioKICAqIENsYXNzIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIGNvbnN0YW50cyByZXR1cm5lZCBmcm9tIFN0b3JhZ2VNYW5hZ2VyCiAgKiBhbmQgbG93ZXIgbGV2ZWwgTW91bnRTZXJ2aWNlIEFQSXMuCi0gKgotICogQGhpZGUKICAqLwogcHVibGljIGNsYXNzIFN0b3JhZ2VSZXN1bHRDb2RlCiB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vUmVjdXJyZW5jZVNldC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL1JlY3VycmVuY2VTZXQuamF2YQppbmRleCBmNWUxYmFjLi4yODI0MTdkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vUmVjdXJyZW5jZVNldC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS9SZWN1cnJlbmNlU2V0LmphdmEKQEAgLTIwNiwxMCArMjA2LDcgQEAKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgaWYgKGFsbERheSkgewotICAgICAgICAJLy8gVE9ETzogYWxzbyBjaGFuZ2UgdHppZCB0byBiZSBVVEM/ICB0aGF0IHdvdWxkIGJlIGNvbnNpc3RlbnQsIGJ1dAotICAgICAgICAJLy8gdGhhdCB3b3VsZCBub3QgcmVmbGVjdCB0aGUgb3JpZ2luYWwgdGltZXpvbmUgdmFsdWUgYmFjayB0byB0aGUKLSAgICAgICAgCS8vIHNlcnZlci4KLSAgICAgICAgCXN0YXJ0LnRpbWV6b25lID0gVGltZS5USU1FWk9ORV9VVEM7CisgICAgICAgICAgICBzdGFydC50aW1lem9uZSA9IFRpbWUuVElNRVpPTkVfVVRDOwogICAgICAgICB9CiAgICAgICAgIGxvbmcgbWlsbGlzID0gc3RhcnQudG9NaWxsaXMoZmFsc2UgLyogdXNlIGlzRHN0ICovKTsKICAgICAgICAgdmFsdWVzLnB1dChDYWxlbmRhci5FdmVudHMuRFRTVEFSVCwgbWlsbGlzKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9KYXBhbmVzZVV0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvSmFwYW5lc2VVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2ZlOTgwLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9KYXBhbmVzZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRleHRVdGlscyBlc3BlY2lhbGx5IGZvciBKYXBhbmVzZS4KLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBKYXBhbmVzZVV0aWxzIHsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBNYXA8Q2hhcmFjdGVyLCBTdHJpbmc+IHNIYWxmV2lkdGhNYXAgPQotICAgICAgICBuZXcgSGFzaE1hcDxDaGFyYWN0ZXIsIFN0cmluZz4oKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMDEnLCAiXHVGRjY0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMDInLCAiXHVGRjYxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMEMnLCAiXHVGRjYyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMEQnLCAiXHVGRjYzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMUMnLCAifiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQxJywgIlx1RkY2NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQyJywgIlx1RkY3MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQzJywgIlx1RkY2OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ0JywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ1JywgIlx1RkY2OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ2JywgIlx1RkY3MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ3JywgIlx1RkY2QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ4JywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ5JywgIlx1RkY2QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRBJywgIlx1RkY3NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRCJywgIlx1RkY3NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRDJywgIlx1RkY3Nlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDREJywgIlx1RkY3NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRFJywgIlx1RkY3N1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRGJywgIlx1RkY3OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDUwJywgIlx1RkY3OFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDUxJywgIlx1RkY3OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDUyJywgIlx1RkY3OVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDUzJywgIlx1RkY3QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU0JywgIlx1RkY3QVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU1JywgIlx1RkY3QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU2JywgIlx1RkY3Qlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU3JywgIlx1RkY3QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU4JywgIlx1RkY3Q1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU5JywgIlx1RkY3RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVBJywgIlx1RkY3RFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVCJywgIlx1RkY3RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVDJywgIlx1RkY3RVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVEJywgIlx1RkY3RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVFJywgIlx1RkY3Rlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVGJywgIlx1RkY4MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDYwJywgIlx1RkY4MFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDYxJywgIlx1RkY4MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDYyJywgIlx1RkY4MVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDYzJywgIlx1RkY2RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY0JywgIlx1RkY4MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY1JywgIlx1RkY4Mlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY2JywgIlx1RkY4MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY3JywgIlx1RkY4M1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY4JywgIlx1RkY4NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY5JywgIlx1RkY4NFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZBJywgIlx1RkY4NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZCJywgIlx1RkY4NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZDJywgIlx1RkY4NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZEJywgIlx1RkY4OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZFJywgIlx1RkY4OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZGJywgIlx1RkY4QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDcwJywgIlx1RkY4QVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDcxJywgIlx1RkY4QVx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDcyJywgIlx1RkY4QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDczJywgIlx1RkY4Qlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc0JywgIlx1RkY4Qlx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc1JywgIlx1RkY4QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc2JywgIlx1RkY4Q1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc3JywgIlx1RkY4Q1x1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc4JywgIlx1RkY4RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc5JywgIlx1RkY4RFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdBJywgIlx1RkY4RFx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdCJywgIlx1RkY4RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdDJywgIlx1RkY4RVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdEJywgIlx1RkY4RVx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdFJywgIlx1RkY4RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdGJywgIlx1RkY5MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDgwJywgIlx1RkY5MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDgxJywgIlx1RkY5MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDgyJywgIlx1RkY5MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDgzJywgIlx1RkY2QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg0JywgIlx1RkY5NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg1JywgIlx1RkY2RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg2JywgIlx1RkY5NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg3JywgIlx1RkY2RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg4JywgIlx1RkY5NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg5JywgIlx1RkY5NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhBJywgIlx1RkY5OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhCJywgIlx1RkY5OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhDJywgIlx1RkY5QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhEJywgIlx1RkY5QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhFJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhGJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDkwJywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDkxJywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDkyJywgIlx1RkY2NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDkzJywgIlx1RkY5RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDlCJywgIlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDlDJywgIlx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEExJywgIlx1RkY2NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEEyJywgIlx1RkY3MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEEzJywgIlx1RkY2OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE0JywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE1JywgIlx1RkY2OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE2JywgIlx1RkY3MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE3JywgIlx1RkY2QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE4JywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE5JywgIlx1RkY2QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFBJywgIlx1RkY3NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFCJywgIlx1RkY3NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFDJywgIlx1RkY3Nlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFEJywgIlx1RkY3NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFFJywgIlx1RkY3N1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFGJywgIlx1RkY3OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEIwJywgIlx1RkY3OFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEIxJywgIlx1RkY3OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEIyJywgIlx1RkY3OVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEIzJywgIlx1RkY3QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI0JywgIlx1RkY3QVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI1JywgIlx1RkY3QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI2JywgIlx1RkY3Qlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI3JywgIlx1RkY3QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI4JywgIlx1RkY3Q1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI5JywgIlx1RkY3RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJBJywgIlx1RkY3RFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJCJywgIlx1RkY3RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJDJywgIlx1RkY3RVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJEJywgIlx1RkY3RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJFJywgIlx1RkY3Rlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJGJywgIlx1RkY4MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEMwJywgIlx1RkY4MFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEMxJywgIlx1RkY4MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEMyJywgIlx1RkY4MVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEMzJywgIlx1RkY2RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM0JywgIlx1RkY4MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM1JywgIlx1RkY4Mlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM2JywgIlx1RkY4MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM3JywgIlx1RkY4M1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM4JywgIlx1RkY4NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM5JywgIlx1RkY4NFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENBJywgIlx1RkY4NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENCJywgIlx1RkY4NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENDJywgIlx1RkY4NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENEJywgIlx1RkY4OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENFJywgIlx1RkY4OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENGJywgIlx1RkY4QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQwJywgIlx1RkY4QVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQxJywgIlx1RkY4QVx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQyJywgIlx1RkY4QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQzJywgIlx1RkY4Qlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ0JywgIlx1RkY4Qlx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ1JywgIlx1RkY4QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ2JywgIlx1RkY4Q1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ3JywgIlx1RkY4Q1x1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ4JywgIlx1RkY4RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ5JywgIlx1RkY4RFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERBJywgIlx1RkY4RFx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERCJywgIlx1RkY4RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERDJywgIlx1RkY4RVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEREJywgIlx1RkY4RVx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERFJywgIlx1RkY4RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERGJywgIlx1RkY5MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEUwJywgIlx1RkY5MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEUxJywgIlx1RkY5MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEUyJywgIlx1RkY5MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEUzJywgIlx1RkY2QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU0JywgIlx1RkY5NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU1JywgIlx1RkY2RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU2JywgIlx1RkY5NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU3JywgIlx1RkY2RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU4JywgIlx1RkY5NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU5JywgIlx1RkY5NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVBJywgIlx1RkY5OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVCJywgIlx1RkY5OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVDJywgIlx1RkY5QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVEJywgIlx1RkY5QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVFJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVGJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEYwJywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEYxJywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEYyJywgIlx1RkY2NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEYzJywgIlx1RkY5RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEY0JywgIlx1RkY3M1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEY1JywgIlx1RkY3NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEY2JywgIlx1RkY3OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEZCJywgIlx1RkY2NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEZDJywgIlx1RkY3MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjAxJywgIiEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwMicsICJcIiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjAzJywgIiMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwNCcsICIkIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDUnLCAiJSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjA2JywgIiYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwNycsICInIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDgnLCAiKCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjA5JywgIikiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwQScsICIqIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMEInLCAiKyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjBDJywgIiwiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwRCcsICItIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMEUnLCAiLiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjBGJywgIi8iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxMCcsICIwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTEnLCAiMSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjEyJywgIjIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxMycsICIzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTQnLCAiNCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjE1JywgIjUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxNicsICI2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTcnLCAiNyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjE4JywgIjgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxOScsICI5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMUEnLCAiOiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjFCJywgIjsiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxQycsICI8Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMUQnLCAiPSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjFFJywgIj4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxRicsICI/Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjAnLCAiQCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjIxJywgIkEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyMicsICJCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjMnLCAiQyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjI0JywgIkQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyNScsICJFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjYnLCAiRiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjI3JywgIkciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyOCcsICJIIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjknLCAiSSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjJBJywgIkoiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyQicsICJLIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMkMnLCAiTCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjJEJywgIk0iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyRScsICJOIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMkYnLCAiTyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjMwJywgIlAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzMScsICJRIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzInLCAiUiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjMzJywgIlMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzNCcsICJUIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzUnLCAiVSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjM2JywgIlYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzNycsICJXIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzgnLCAiWCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjM5JywgIlkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzQScsICJaIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGM0InLCAiWyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjNDJywgIlxcIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGM0QnLCAiXSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjNFJywgIl4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzRicsICJfIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDEnLCAiYSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQyJywgImIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0MycsICJjIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDQnLCAiZCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQ1JywgImUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0NicsICJmIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDcnLCAiZyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQ4JywgImgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0OScsICJpIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNEEnLCAiaiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjRCJywgImsiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0QycsICJsIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNEQnLCAibSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjRFJywgIm4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0RicsICJvIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTAnLCAicCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjUxJywgInEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1MicsICJyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTMnLCAicyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjU0JywgInQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1NScsICJ1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTYnLCAidiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjU3JywgInciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1OCcsICJ4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTknLCAieSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjVBJywgInoiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1QicsICJ7Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNUMnLCAifCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjVEJywgIn0iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1RScsICJ+Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjEnLCAiXHVGRjYxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjInLCAiXHVGRjYyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjMnLCAiXHVGRjYzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjQnLCAiXHVGRjY0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjUnLCAiXHVGRjY1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjYnLCAiXHVGRjY2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjcnLCAiXHVGRjY3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjgnLCAiXHVGRjY4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjknLCAiXHVGRjY5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkEnLCAiXHVGRjZBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkInLCAiXHVGRjZCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkMnLCAiXHVGRjZDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkQnLCAiXHVGRjZEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkUnLCAiXHVGRjZFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkYnLCAiXHVGRjZGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzAnLCAiXHVGRjcwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzEnLCAiXHVGRjcxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzInLCAiXHVGRjcyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzMnLCAiXHVGRjczIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzQnLCAiXHVGRjc0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzUnLCAiXHVGRjc1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzYnLCAiXHVGRjc2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzcnLCAiXHVGRjc3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzgnLCAiXHVGRjc4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzknLCAiXHVGRjc5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0EnLCAiXHVGRjdBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0InLCAiXHVGRjdCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0MnLCAiXHVGRjdDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0QnLCAiXHVGRjdEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0UnLCAiXHVGRjdFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0YnLCAiXHVGRjdGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODAnLCAiXHVGRjgwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODEnLCAiXHVGRjgxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODInLCAiXHVGRjgyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODMnLCAiXHVGRjgzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODQnLCAiXHVGRjg0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODUnLCAiXHVGRjg1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODYnLCAiXHVGRjg2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODcnLCAiXHVGRjg3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODgnLCAiXHVGRjg4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODknLCAiXHVGRjg5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEEnLCAiXHVGRjhBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEInLCAiXHVGRjhCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEMnLCAiXHVGRjhDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEQnLCAiXHVGRjhEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEUnLCAiXHVGRjhFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEYnLCAiXHVGRjhGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTAnLCAiXHVGRjkwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTEnLCAiXHVGRjkxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTInLCAiXHVGRjkyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTMnLCAiXHVGRjkzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTQnLCAiXHVGRjk0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTUnLCAiXHVGRjk1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTYnLCAiXHVGRjk2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTcnLCAiXHVGRjk3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTgnLCAiXHVGRjk4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTknLCAiXHVGRjk5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUEnLCAiXHVGRjlBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUInLCAiXHVGRjlCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUMnLCAiXHVGRjlDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUQnLCAiXHVGRjlEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUUnLCAiXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUYnLCAiXHVGRjlGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGRTUnLCAiXHUwMDVDXHUwMDVDIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBoYWxmLXdpZHRoIHZlcnNpb24gb2YgdGhhdCBjaGFyYWN0ZXIgaWYgcG9zc2libGUuIFJldHVybnMgbnVsbCBpZiBub3QgcG9zc2libGUKLSAgICAgKiBAcGFyYW0gY2ggaW5wdXQgY2hhcmFjdGVyCi0gICAgICogQHJldHVybiBDaGFyU2VxdWVuY2Ugb2JqZWN0IGlmIHRoZSBtYXBwaW5nIGZvciBjaCBleGlzdHMuIFJldHVybiBudWxsIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0cnlHZXRIYWxmV2lkdGhUZXh0KGZpbmFsIGNoYXIgY2gpIHsKLSAgICAgICAgaWYgKHNIYWxmV2lkdGhNYXAuY29udGFpbnNLZXkoY2gpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc0hhbGZXaWR0aE1hcC5nZXQoY2gpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRCdWlsZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZjZlYmUuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0gKiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FbWFpbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkV2ZW50OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuSW07Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5OaWNrbmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5vdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Pcmdhbml6YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob3RvOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUmVsYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkTmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWRQb3N0YWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5XZWJzaXRlOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQmFzZTY0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5DaGFyc2V0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBjbGFzcyB3aGljaCBsZXRzIHVzZXJzIGNyZWF0ZSB0aGVpciBvd24gdkNhcmQgU3RyaW5nLiBUeXBpY2FsIHVzYWdlIGlzIGFzIGZvbGxvd3M6Ci0gKiA8L3A+Ci0gKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+ZmluYWwgVkNhcmRCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVkNhcmRCdWlsZGVyKHZjYXJkVHlwZSk7Ci0gKiBidWlsZGVyLmFwcGVuZE5hbWVQcm9wZXJ0aWVzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkpCi0gKiAgICAgLmFwcGVuZE5pY2tOYW1lcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUpKQotICogICAgIC5hcHBlbmRQaG9uZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAqICAgICAuYXBwZW5kRW1haWxzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChFbWFpbC5DT05URU5UX0lURU1fVFlQRSkpCi0gKiAgICAgLmFwcGVuZFBvc3RhbHMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpKQotICogICAgIC5hcHBlbmRPcmdhbml6YXRpb25zKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpKQotICogICAgIC5hcHBlbmRXZWJzaXRlcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoV2Vic2l0ZS5DT05URU5UX0lURU1fVFlQRSkpCi0gKiAgICAgLmFwcGVuZFBob3Rvcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoUGhvdG8uQ09OVEVOVF9JVEVNX1RZUEUpKQotICogICAgIC5hcHBlbmROb3Rlcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoTm90ZS5DT05URU5UX0lURU1fVFlQRSkpCi0gKiAgICAgLmFwcGVuZEV2ZW50cyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpKQotICogICAgIC5hcHBlbmRJbXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KEltLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAqICAgICAuYXBwZW5kUmVsYXRpb24oY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFJlbGF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKSk7Ci0gKiByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOzwvcHJlPgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRCdWlsZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZEJ1aWxkZXIiOwotCi0gICAgLy8gSWYgeW91IGFkZCB0aGUgb3RoZXIgZWxlbWVudCwgcGxlYXNlIGNoZWNrIGFsbCB0aGUgY29sdW1ucyBhcmUgYWJsZSB0byBiZQotICAgIC8vIGNvbnZlcnRlZCB0byBTdHJpbmcuCi0gICAgLy8KLSAgICAvLyBlLmcuIEJMT0IgaXMgbm90IHdoYXQgd2UgY2FuIGhhbmRsZSBoZXJlIG5vdy4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzQWxsb3dlZEFuZHJvaWRQcm9wZXJ0eVNldCA9Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICBOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSwgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKSkpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QSE9ORV9UWVBFID0gUGhvbmUuVFlQRV9IT01FOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUE9TVEFMX1RZUEUgPSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0VNQUlMX1RZUEUgPSBFbWFpbC5UWVBFX09USEVSOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX0RBVEFfVkNBUkQgPSAiVkNBUkQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9EQVRBX1BVQkxJQyA9ICJQVUJMSUMiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX1NFUEFSQVRPUiA9ICI7IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfRU5EX09GX0xJTkUgPSAiXHJcbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX0RBVEFfU0VQQVJBVE9SID0gIjoiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9JVEVNX1NFUEFSQVRPUiA9ICI7IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfV1MgPSAiICI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX0VRVUFMID0gIj0iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQID0KLSAgICAgICAgICAgICJFTkNPRElORz0iICsgVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfUVA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX0VOQ09ESU5HX0JBU0U2NF9WMjEgPQotICAgICAgICAgICAgIkVOQ09ESU5HPSIgKyBWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR19CQVNFNjQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX0VOQ09ESU5HX0JBU0U2NF9BU19CID0KLSAgICAgICAgICAgICJFTkNPRElORz0iICsgVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfQjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSElGVF9KSVMgPSAiU0hJRlRfSklTIjsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IG1WQ2FyZFR5cGU7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzVjMwT3JWNDA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc0phcGFuZXNlTW9iaWxlUGhvbmU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Pbmx5T25lTm90ZUZpZWxkSXNBdmFpbGFibGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc0RvQ29NbzsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVNob3VsZFVzZVF1b3RlZFByaW50YWJsZTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVVzZXNBbmRyb2lkUHJvcGVydHk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Vc2VzRGVmYWN0UHJvcGVydHk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1BcHBlbmRUeXBlUGFyYW1OYW1lOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1OZWVkc1RvQ29udmVydFBob25ldGljU3RyaW5nOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1TaG91bGRBcHBlbmRDaGFyc2V0UGFyYW07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ2hhcnNldDsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVkNhcmRDaGFyc2V0UGFyYW1ldGVyOwotCi0gICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIG1CdWlsZGVyOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRW5kQXBwZW5kZWQ7Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgLy8gRGVmYXVsdCBjaGFyc2V0IHNob3VsZCBiZSB1c2VkCi0gICAgICAgIHRoaXModmNhcmRUeXBlLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdmNhcmRUeXBlCi0gICAgICogQHBhcmFtIGNoYXJzZXQgSWYgbnVsbCwgd2UgdXNlIGRlZmF1bHQgY2hhcnNldCBmb3IgZXhwb3J0LgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIFZDYXJkQnVpbGRlcihmaW5hbCBpbnQgdmNhcmRUeXBlLCBTdHJpbmcgY2hhcnNldCkgewotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotCi0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb240MCh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAiU2hvdWxkIG5vdCB1c2UgdkNhcmQgNC4wIHdoZW4gYnVpbGRpbmcgdkNhcmQuICIgKwotICAgICAgICAgICAgICAgICAgICAiSXQgaXMgbm90IG9mZmljaWFsbHkgcHVibGlzaGVkIHlldC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1Jc1YzME9yVjQwID0gVkNhcmRDb25maWcuaXNWZXJzaW9uMzAodmNhcmRUeXBlKSB8fCBWQ2FyZENvbmZpZy5pc1ZlcnNpb240MCh2Y2FyZFR5cGUpOwotICAgICAgICBtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlID0gVkNhcmRDb25maWcuc2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Jc0RvQ29NbyA9IFZDYXJkQ29uZmlnLmlzRG9Db01vKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Jc0phcGFuZXNlTW9iaWxlUGhvbmUgPSBWQ2FyZENvbmZpZy5uZWVkc1RvQ29udmVydFBob25ldGljU3RyaW5nKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Pbmx5T25lTm90ZUZpZWxkSXNBdmFpbGFibGUgPSBWQ2FyZENvbmZpZy5vbmx5T25lTm90ZUZpZWxkSXNBdmFpbGFibGUodmNhcmRUeXBlKTsKLSAgICAgICAgbVVzZXNBbmRyb2lkUHJvcGVydHkgPSBWQ2FyZENvbmZpZy51c2VzQW5kcm9pZFNwZWNpZmljUHJvcGVydHkodmNhcmRUeXBlKTsKLSAgICAgICAgbVVzZXNEZWZhY3RQcm9wZXJ0eSA9IFZDYXJkQ29uZmlnLnVzZXNEZWZhY3RQcm9wZXJ0eSh2Y2FyZFR5cGUpOwotICAgICAgICBtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXMgPSBWQ2FyZENvbmZpZy5zaG91bGRSZWZyYWluUVBUb05hbWVQcm9wZXJ0aWVzKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1BcHBlbmRUeXBlUGFyYW1OYW1lID0gVkNhcmRDb25maWcuYXBwZW5kVHlwZVBhcmFtTmFtZSh2Y2FyZFR5cGUpOwotICAgICAgICBtTmVlZHNUb0NvbnZlcnRQaG9uZXRpY1N0cmluZyA9IFZDYXJkQ29uZmlnLm5lZWRzVG9Db252ZXJ0UGhvbmV0aWNTdHJpbmcodmNhcmRUeXBlKTsKLQotICAgICAgICAvLyB2Q2FyZCAyLjEgcmVxdWlyZXMgY2hhcnNldC4KLSAgICAgICAgLy8gdkNhcmQgMy4wIGRvZXMgbm90IGFsbG93IGl0IGJ1dCB3ZSBmb3VuZCBzb21lIGRldmljZXMgdXNlIGl0IHRvIGRldGVybWluZQotICAgICAgICAvLyB0aGUgZXhhY3QgY2hhcnNldC4KLSAgICAgICAgLy8gV2UgY3VycmVudGx5IGFwcGVuZCBpdCBvbmx5IHdoZW4gY2hhcnNldCBvdGhlciB0aGFuIFVURl84IGlzIHVzZWQuCi0gICAgICAgIG1TaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0gPQotICAgICAgICAgICAgICAgICEoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAodmNhcmRUeXBlKSAmJiAiVVRGLTgiLmVxdWFsc0lnbm9yZUNhc2UoY2hhcnNldCkpOwotCi0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc0RvQ29Nbyh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICBpZiAoIVNISUZUX0pJUy5lcXVhbHNJZ25vcmVDYXNlKGNoYXJzZXQpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgY2hhcnNldCBcIiIgKyBjaGFyc2V0ICsgIlwiIGlzIHVzZWQgd2hpbGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBTSElGVF9KSVMgKyAiIGlzIG5lZWRlZCB0byBiZSB1c2VkLiIpOwotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShjaGFyc2V0KSkgewotICAgICAgICAgICAgICAgICAgICBtQ2hhcnNldCA9IFNISUZUX0pJUzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXRVdGlscy5jaGFyc2V0Rm9yVmVuZG9yKGNoYXJzZXQpLm5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXJlZXItc3BlY2lmaWMgXCIiICsgY2hhcnNldCArICJcIiB3YXMgbm90IGZvdW5kIChhcyB1c3VhbCkuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVXNlIGl0IGFzIGlzLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DaGFyc2V0ID0gY2hhcnNldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0VXRpbHMuY2hhcnNldEZvclZlbmRvcihTSElGVF9KSVMsICJkb2NvbW8iKS5uYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9Db01vLXNwZWNpZmljIFNISUZUX0pJUyB3YXMgbm90IGZvdW5kLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlVzZSBTSElGVF9KSVMgYXMgaXMuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gU0hJRlRfSklTOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0VXRpbHMuY2hhcnNldEZvclZlbmRvcihTSElGVF9KSVMpLm5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXJlZXItc3BlY2lmaWMgU0hJRlRfSklTIHdhcyBub3QgZm91bmQuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVXNlIFNISUZUX0pJUyBhcyBpcy4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBTSElGVF9KSVM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNoYXJzZXQgPSBjaGFyc2V0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVZDYXJkQ2hhcnNldFBhcmFtZXRlciA9ICJDSEFSU0VUPSIgKyBTSElGVF9KSVM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoY2hhcnNldCkpIHsKLSAgICAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgIlVzZSB0aGUgY2hhcnNldCBcIiIgKyBWQ2FyZENvbmZpZy5ERUZBVUxUX0VYUE9SVF9DSEFSU0VUCi0gICAgICAgICAgICAgICAgICAgICAgICArICJcIiBmb3IgZXhwb3J0LiIpOwotICAgICAgICAgICAgICAgIG1DaGFyc2V0ID0gVkNhcmRDb25maWcuREVGQVVMVF9FWFBPUlRfQ0hBUlNFVDsKLSAgICAgICAgICAgICAgICBtVkNhcmRDaGFyc2V0UGFyYW1ldGVyID0gIkNIQVJTRVQ9IiArIFZDYXJkQ29uZmlnLkRFRkFVTFRfRVhQT1JUX0NIQVJTRVQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0VXRpbHMuY2hhcnNldEZvclZlbmRvcihjaGFyc2V0KS5uYW1lKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FyZWVyLXNwZWNpZmljIFwiIiArIGNoYXJzZXQgKyAiXCIgd2FzIG5vdCBmb3VuZCAoYXMgdXN1YWwpLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVXNlIGl0IGFzIGlzLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ2hhcnNldCA9IGNoYXJzZXQ7Ci0gICAgICAgICAgICAgICAgbVZDYXJkQ2hhcnNldFBhcmFtZXRlciA9ICJDSEFSU0VUPSIgKyBjaGFyc2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNsZWFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIG1CdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgbUVuZEFwcGVuZGVkID0gZmFsc2U7Ci0gICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQkVHSU4sIFZDQVJEX0RBVEFfVkNBUkQpOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uNDAobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVkVSU0lPTiwgVkNhcmRDb25zdGFudHMuVkVSU0lPTl9WNDApOwotICAgICAgICB9IGVsc2UgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjMwKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1ZFUlNJT04sIFZDYXJkQ29uc3RhbnRzLlZFUlNJT05fVjMwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghVkNhcmRDb25maWcuaXNWZXJzaW9uMjEobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVW5rbm93biB2Q2FyZCB2ZXJzaW9uIGRldGVjdGVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9WRVJTSU9OLCBWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1YyMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNOb25FbXB0eU5hbWUoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBmYW1pbHlOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtaWRkbGVOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBnaXZlbk5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc3VmZml4ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNGYW1pbHlOYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljTWlkZGxlTmFtZSA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY0dpdmVuTmFtZSA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGRpc3BsYXlOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUpOwotICAgICAgICByZXR1cm4gIShUZXh0VXRpbHMuaXNFbXB0eShmYW1pbHlOYW1lKSAmJiBUZXh0VXRpbHMuaXNFbXB0eShtaWRkbGVOYW1lKSAmJgotICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KGdpdmVuTmFtZSkgJiYgVGV4dFV0aWxzLmlzRW1wdHkocHJlZml4KSAmJgotICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KHN1ZmZpeCkgJiYgVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNGYW1pbHlOYW1lKSAmJgotICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljTWlkZGxlTmFtZSkgJiYgVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNHaXZlbk5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkoZGlzcGxheU5hbWUpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENvbnRlbnRWYWx1ZXMgZ2V0UHJpbWFyeUNvbnRlbnRWYWx1ZShmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgcHJpbWFyeUNvbnRlbnRWYWx1ZXMgPSBudWxsOwotICAgICAgICBDb250ZW50VmFsdWVzIHN1YnByaW1hcnlDb250ZW50VmFsdWVzID0gbnVsbDsKLSAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJbnRlZ2VyIGlzU3VwZXJQcmltYXJ5ID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoU3RydWN0dXJlZE5hbWUuSVNfU1VQRVJfUFJJTUFSWSk7Ci0gICAgICAgICAgICBpZiAoaXNTdXBlclByaW1hcnkgIT0gbnVsbCAmJiBpc1N1cGVyUHJpbWFyeSA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBjaG9vc2UgInN1cGVyIHByaW1hcnkiIENvbnRlbnRWYWx1ZXMuCi0gICAgICAgICAgICAgICAgcHJpbWFyeUNvbnRlbnRWYWx1ZXMgPSBjb250ZW50VmFsdWVzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcmltYXJ5Q29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgY2hvb3NlIHRoZSBmaXJzdCAicHJpbWFyeSIgQ29udGVudFZhbHVlcwotICAgICAgICAgICAgICAgIC8vIGlmICJzdXBlciBwcmltYXJ5IiBDb250ZW50VmFsdWVzIGRvZXMgbm90IGV4aXN0LgotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgaXNQcmltYXJ5ID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUHJpbWFyeSAhPSBudWxsICYmIGlzUHJpbWFyeSA+IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zTm9uRW1wdHlOYW1lKGNvbnRlbnRWYWx1ZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW1hcnlDb250ZW50VmFsdWVzID0gY29udGVudFZhbHVlczsKLSAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGJyZWFrLCBzaW5jZSB0aGVyZSBtYXkgYmUgQ29udGVudFZhbHVlcyB3aXRoICJzdXBlciBwcmltYXJ5IgotICAgICAgICAgICAgICAgICAgICAvLyBhZnRlcndvcmQuCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJwcmltYXJ5Q29udGVudFZhbHVlcyA9PSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc05vbkVtcHR5TmFtZShjb250ZW50VmFsdWVzKSkgewotICAgICAgICAgICAgICAgICAgICBzdWJwcmltYXJ5Q29udGVudFZhbHVlcyA9IGNvbnRlbnRWYWx1ZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByaW1hcnlDb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChzdWJwcmltYXJ5Q29udGVudFZhbHVlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgY2hvb3NlIHRoZSBmaXJzdCBDb250ZW50VmFsdWVzIGlmIGFueSAicHJpbWFyeSIgQ29udGVudFZhbHVlcyBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgICAgICAgICBwcmltYXJ5Q29udGVudFZhbHVlcyA9IHN1YnByaW1hcnlDb250ZW50VmFsdWVzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiQWxsIENvbnRlbnRWYWx1ZXMgZ2l2ZW4gZnJvbSBkYXRhYmFzZSBpcyBlbXB0eS4iKTsKLSAgICAgICAgICAgICAgICBwcmltYXJ5Q29udGVudFZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJpbWFyeUNvbnRlbnRWYWx1ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVG8gYXZvaWQgdW5uZWNlc3NhcnkgY29tcGxpY2F0aW9uIGluIGxvZ2ljLCB3ZSB1c2UgdGhpcyBtZXRob2QgdG8gY29uc3RydWN0IE4sIEZOCi0gICAgICogcHJvcGVydGllcyBmb3IgdkNhcmQgNC4wLgotICAgICAqLwotICAgIHByaXZhdGUgVkNhcmRCdWlsZGVyIGFwcGVuZE5hbWVQcm9wZXJ0aWVzVjQwKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKG1Jc0RvQ29NbyB8fCBtTmVlZHNUb0NvbnZlcnRQaG9uZXRpY1N0cmluZykgewotICAgICAgICAgICAgLy8gSWdub3JlIGFsbCBmbGFncyB0aGF0IGxvb2sgc3RhbGUgZnJvbSB0aGUgdmlldyBvZiB2Q2FyZCA0LjAgdG8KLSAgICAgICAgICAgIC8vIHNpbXBsaWZ5IGNvbnN0cnVjdGlvbiBhbGdvcml0aG0uIEFjdHVhbGx5IHdlIGRvbid0IGhhdmUgYW55IHZDYXJkIGZpbGUKLSAgICAgICAgICAgIC8vIGF2YWlsYWJsZSBmcm9tIHJlYWwgd29ybGQgeWV0LCBzbyB3ZSBtYXkgbmVlZCB0byByZS1lbmFibGUgc29tZSBvZiB0aGVzZQotICAgICAgICAgICAgLy8gaW4gdGhlIGZ1dHVyZS4KLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJJbnZhbGlkIGZsYWcgaXMgdXNlZCBpbiB2Q2FyZCA0LjAgY29uc3RydWN0aW9uLiBJZ25vcmVkLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ID09IG51bGwgfHwgY29udGVudFZhbHVlc0xpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0ZOLCAiIik7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIGhhdmUgZGlmZmljdWx0eSBoZXJlLiBIb3cgY2FuIHdlIGFwcHJvcHJpYXRlbHkgaGFuZGxlIFN0cnVjdHVyZWROYW1lIHdpdGgKLSAgICAgICAgLy8gbWlzc2luZyBwYXJ0cyBuZWNlc3NhcnkgZm9yIGRpc3BsYXlpbmcgd2hpbGUgaXQgaGFzIHN1cHByZW1lbnRhbCBpbmZvcm1hdGlvbi4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gZS5nLiBIb3cgdG8gaGFuZGxlIG5vbi1lbXB0eSBwaG9uZXRpYyBuYW1lcyB3aXRoIGVtcHR5IHN0cnVjdHVyZWQgbmFtZXM/Ci0KLSAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gZ2V0UHJpbWFyeUNvbnRlbnRWYWx1ZShjb250ZW50VmFsdWVzTGlzdCk7Ci0gICAgICAgIFN0cmluZyBmYW1pbHlOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtaWRkbGVOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBnaXZlbk5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc3VmZml4ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybWF0dGVkTmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FKTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGZhbWlseU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkoZ2l2ZW5OYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1pZGRsZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkocHJlZml4KQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KHN1ZmZpeCkpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShmb3JtYXR0ZWROYW1lKSkgewotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4sICIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZhbWlseU5hbWUgPSBmb3JtYXR0ZWROYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljRmFtaWx5TmFtZSA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY01pZGRsZU5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNHaXZlbk5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBlc2NhcGVkRmFtaWx5ID0gZXNjYXBlQ2hhcmFjdGVycyhmYW1pbHlOYW1lKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGVzY2FwZWRHaXZlbiA9IGVzY2FwZUNoYXJhY3RlcnMoZ2l2ZW5OYW1lKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGVzY2FwZWRNaWRkbGUgPSBlc2NhcGVDaGFyYWN0ZXJzKG1pZGRsZU5hbWUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZXNjYXBlZFByZWZpeCA9IGVzY2FwZUNoYXJhY3RlcnMocHJlZml4KTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGVzY2FwZWRTdWZmaXggPSBlc2NhcGVDaGFyYWN0ZXJzKHN1ZmZpeCk7Ci0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04pOwotCi0gICAgICAgIGlmICghKFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljRmFtaWx5TmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljTWlkZGxlTmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljR2l2ZW5OYW1lKSkpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNvcnRBcyA9IGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNGYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICAgICArICc7JyArIGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNHaXZlbk5hbWUpCi0gICAgICAgICAgICAgICAgICAgICsgJzsnICsgZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKCJTT1JULUFTPSIpLmFwcGVuZCgKLSAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy50b1N0cmluZ0FzVjQwUGFyYW1WYWx1ZShzb3J0QXMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChlc2NhcGVkRmFtaWx5KTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVzY2FwZWRHaXZlbik7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChlc2NhcGVkTWlkZGxlKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVzY2FwZWRQcmVmaXgpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoZXNjYXBlZFN1ZmZpeCk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0KLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGZvcm1hdHRlZE5hbWUpKSB7Ci0gICAgICAgICAgICAvLyBOb3RlOgotICAgICAgICAgICAgLy8gRElTUExBWV9OQU1FIGRvZXNuJ3QgZXhpc3Qgd2hpbGUgc29tZSBvdGhlciBlbGVtZW50cyBkbywgd2hpY2ggaXMgdXN1YWxseQotICAgICAgICAgICAgLy8gd2VpcmQgaW4gQW5kcm9pZCwgYXMgRElTUExBWV9OQU1FIHNob3VsZCAodXN1YWxseSkgYmUgY29uc3RydWN0ZWQKLSAgICAgICAgICAgIC8vIGZyb20gdGhlIG90aGVycyB1c2luZyBsb2NhbGUgaW5mb3JtYXRpb24gYW5kIGl0cyBjb2RlIHBvaW50cy4KLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJESVNQTEFZX05BTUUgaXMgZW1wdHkuIik7Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlc2NhcGVkID0gZXNjYXBlQ2hhcmFjdGVycyhWQ2FyZFV0aWxzLmNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHMoCi0gICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uZmlnLmdldE5hbWVPcmRlclR5cGUobVZDYXJkVHlwZSksCi0gICAgICAgICAgICAgICAgICAgIGZhbWlseU5hbWUsIG1pZGRsZU5hbWUsIGdpdmVuTmFtZSwgcHJlZml4LCBzdWZmaXgpKTsKLSAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4sIGVzY2FwZWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVzY2FwZWRGb3JtYXR0ZWQgPSBlc2NhcGVDaGFyYWN0ZXJzKGZvcm1hdHRlZE5hbWUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0ZOKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZXNjYXBlZEZvcm1hdHRlZCk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2UgbWF5IG5lZWQgWC0gcHJvcGVydGllcyBmb3IgcGhvbmV0aWMgbmFtZXMuCi0gICAgICAgIGFwcGVuZFBob25ldGljTmFtZUZpZWxkcyhjb250ZW50VmFsdWVzKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yIHNhZmV0eSwgd2UnbGwgZW1pdCBqdXN0IG9uZSB2YWx1ZSBhcm91bmQgU3RydWN0dXJlZE5hbWUsIGFzIGV4dGVybmFsIGltcG9ydGVycwotICAgICAqIG1heSBnZXQgY29uZnVzZWQgd2l0aCBtdWx0aXBsZSAiTiIsICJGTiIsIGV0Yy4gcHJvcGVydGllcywgdGhvdWdoIGl0IGlzIHZhbGlkIGluCi0gICAgICogdkNhcmQgc3BlYy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZE5hbWVQcm9wZXJ0aWVzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjQwKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXBwZW5kTmFtZVByb3BlcnRpZXNWNDAoY29udGVudFZhbHVlc0xpc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ID09IG51bGwgfHwgY29udGVudFZhbHVlc0xpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAvLyB2Q2FyZCAzLjAgcmVxdWlyZXMgIk4iIGFuZCAiRk4iIHByb3BlcnRpZXMuCi0gICAgICAgICAgICAgICAgLy8gdkNhcmQgNC4wIGRvZXMgTk9UIHJlcXVpcmUgTiwgYnV0IHdlIHRha2UgY2FyZSBvZiBwb3NzaWJsZSBiYWNrd2FyZAotICAgICAgICAgICAgICAgIC8vIGNvbXBhdGliaWxpdHkgaXNzdWVzLgotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTiwgIiIpOwotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4sICIiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OLCAiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9IGdldFByaW1hcnlDb250ZW50VmFsdWUoY29udGVudFZhbHVlc0xpc3QpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZmFtaWx5TmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgbWlkZGxlTmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZ2l2ZW5OYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUFJFRklYKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHN1ZmZpeCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuU1VGRklYKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGRpc3BsYXlOYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUpOwotCi0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZmFtaWx5TmFtZSkgfHwgIVRleHRVdGlscy5pc0VtcHR5KGdpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5QXBwZW5kQ2hhcnNldFBhcmFtZXRlclRvTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShmYW1pbHlOYW1lLCBnaXZlbk5hbWUsIG1pZGRsZU5hbWUsIHByZWZpeCwgc3VmZml4KTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9OYW1lID0KLSAgICAgICAgICAgICAgICAgICAgKCFtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXMgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGZhbWlseU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShnaXZlbk5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShtaWRkbGVOYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocHJlZml4KSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoc3VmZml4KSkpOwotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybWF0dGVkTmFtZTsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZGlzcGxheU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0dGVkTmFtZSA9IGRpc3BsYXlOYW1lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3JtYXR0ZWROYW1lID0gVkNhcmRVdGlscy5jb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKAotICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25maWcuZ2V0TmFtZU9yZGVyVHlwZShtVkNhcmRUeXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseU5hbWUsIG1pZGRsZU5hbWUsIGdpdmVuTmFtZSwgcHJlZml4LCBzdWZmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlBcHBlbmRDaGFyc2V0UGFyYW1ldGVyVG9GTiA9Ci0gICAgICAgICAgICAgICAgICAgIHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShmb3JtYXR0ZWROYW1lKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9GTiA9Ci0gICAgICAgICAgICAgICAgICAgICFtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXMgJiYKLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKGZvcm1hdHRlZE5hbWUpOwotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZEZhbWlseTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkR2l2ZW47Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZE1pZGRsZTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUHJlZml4OwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRTdWZmaXg7Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9OYW1lKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZEZhbWlseSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShmYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkR2l2ZW4gPSBlbmNvZGVRdW90ZWRQcmludGFibGUoZ2l2ZW5OYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkTWlkZGxlID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKG1pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRQcmVmaXggPSBlbmNvZGVRdW90ZWRQcmludGFibGUocHJlZml4KTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkU3VmZml4ID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHN1ZmZpeCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuY29kZWRGYW1pbHkgPSBlc2NhcGVDaGFyYWN0ZXJzKGZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRHaXZlbiA9IGVzY2FwZUNoYXJhY3RlcnMoZ2l2ZW5OYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkTWlkZGxlID0gZXNjYXBlQ2hhcmFjdGVycyhtaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUHJlZml4ID0gZXNjYXBlQ2hhcmFjdGVycyhwcmVmaXgpOwotICAgICAgICAgICAgICAgIGVuY29kZWRTdWZmaXggPSBlc2NhcGVDaGFyYWN0ZXJzKHN1ZmZpeCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkRm9ybWF0dGVkbmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb0ZOID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVRdW90ZWRQcmludGFibGUoZm9ybWF0dGVkTmFtZSkgOiBlc2NhcGVDaGFyYWN0ZXJzKGZvcm1hdHRlZE5hbWUpKTsKLQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04pOwotICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlBcHBlbmRDaGFyc2V0UGFyYW1ldGVyVG9OYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb05hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgLy8gRG9Db01vIHBob25lcyByZXF1aXJlIHRoYXQgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgImZhbWlseSBuYW1lIiBmaWVsZC4KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZm9ybWF0dGVkTmFtZSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseUFwcGVuZENoYXJzZXRQYXJhbWV0ZXJUb05hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvTmFtZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZEZhbWlseSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZEdpdmVuKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkTWlkZGxlKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkUHJlZml4KTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkU3VmZml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0KLSAgICAgICAgICAgIC8vIEZOIHByb3BlcnR5Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4pOwotICAgICAgICAgICAgaWYgKHJlYWxseUFwcGVuZENoYXJzZXRQYXJhbWV0ZXJUb0ZOKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvRk4pIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkRm9ybWF0dGVkbmFtZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICB9IGVsc2UgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShkaXNwbGF5TmFtZSkpIHsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9EaXNwbGF5TmFtZSA9Ci0gICAgICAgICAgICAgICAgKCFtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXMgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShkaXNwbGF5TmFtZSkpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWREaXNwbGF5TmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvRGlzcGxheU5hbWUgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZVF1b3RlZFByaW50YWJsZShkaXNwbGF5TmFtZSkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVDaGFyYWN0ZXJzKGRpc3BsYXlOYW1lKTsKLQotICAgICAgICAgICAgLy8gTgotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04pOwotICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShkaXNwbGF5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9EaXNwbGF5TmFtZSkgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWREaXNwbGF5TmFtZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLQotICAgICAgICAgICAgLy8gRk4KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9GTik7Ci0KLSAgICAgICAgICAgIC8vIE5vdGU6ICJDSEFSU0VUIiBwYXJhbSBpcyBub3QgYWxsb3dlZCBpbiB2Q2FyZCAzLjAsIGJ1dCB3ZSBtYXkgYWRkIGl0Ci0gICAgICAgICAgICAvLyAgICAgICB3aGVuIGl0IHdvdWxkIGJlIHVzZWZ1bCBvciBuZWNlc3NhcnkgZm9yIGV4dGVybmFsIGltcG9ydGVycywKLSAgICAgICAgICAgIC8vICAgICAgIGFzc3VtaW5nIHRoZSBleHRlcm5hbCBpbXBvcnRlciBhbGxvd3MgdGhpcyB2aW9yYXRpb24gb2YgdGhlIHNwZWMuCi0gICAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKGRpc3BsYXlOYW1lKSkgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZERpc3BsYXlOYW1lKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTiwgIiIpOwotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9GTiwgIiIpOwotICAgICAgICB9IGVsc2UgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OLCAiIik7Ci0gICAgICAgIH0KLQotICAgICAgICBhcHBlbmRQaG9uZXRpY05hbWVGaWVsZHMoY29udGVudFZhbHVlcyk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVtaXRzIFNPVU5EO0lSTUMsIFNPUlQtU1RSSU5HLCBhbmQgZGUtZmFjdCB2YWx1ZXMgZm9yIHBob25ldGljIG5hbWVzIGxpa2UgWC1QSE9ORVRJQy1GQU1JTFkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFBob25ldGljTmFtZUZpZWxkcyhmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljRmFtaWx5TmFtZTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljTWlkZGxlTmFtZTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljR2l2ZW5OYW1lOwotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdG1wUGhvbmV0aWNGYW1pbHlOYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0bXBQaG9uZXRpY01pZGRsZU5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRtcFBob25ldGljR2l2ZW5OYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUpOwotICAgICAgICAgICAgaWYgKG1OZWVkc1RvQ29udmVydFBob25ldGljU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgcGhvbmV0aWNGYW1pbHlOYW1lID0gVkNhcmRVdGlscy50b0hhbGZXaWR0aFN0cmluZyh0bXBQaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIHBob25ldGljTWlkZGxlTmFtZSA9IFZDYXJkVXRpbHMudG9IYWxmV2lkdGhTdHJpbmcodG1wUGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBwaG9uZXRpY0dpdmVuTmFtZSA9IFZDYXJkVXRpbHMudG9IYWxmV2lkdGhTdHJpbmcodG1wUGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwaG9uZXRpY0ZhbWlseU5hbWUgPSB0bXBQaG9uZXRpY0ZhbWlseU5hbWU7Ci0gICAgICAgICAgICAgICAgcGhvbmV0aWNNaWRkbGVOYW1lID0gdG1wUGhvbmV0aWNNaWRkbGVOYW1lOwotICAgICAgICAgICAgICAgIHBob25ldGljR2l2ZW5OYW1lID0gdG1wUGhvbmV0aWNHaXZlbk5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNGYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljTWlkZGxlTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0dpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfU09VTkQpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1hfSVJNQ19OKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb240MChtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCBTT1JULVNUUklORyBhbnl3YXkuCi0gICAgICAgIH0gZWxzZSBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzb3J0U3RyaW5nID0KLSAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKG1WQ2FyZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmV0aWNGYW1pbHlOYW1lLCBwaG9uZXRpY01pZGRsZU5hbWUsIHBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9TT1JUX1NUUklORyk7Ci0gICAgICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAobVZDYXJkVHlwZSkgJiYgc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKHNvcnRTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgLy8gdkNhcmQgMy4wIGRvZXMgbm90IGZvcmNlIHVzIHRvIHVzZSBVVEYtOCBhbmQgYWN0dWFsbHkgd2Ugc2VlIHNvbWUKLSAgICAgICAgICAgICAgICAvLyBwcm9ncmFtcyB3aGljaCBlbWl0IHRoaXMgdmFsdWUuIEl0IGlzIGluY29ycmVjdCBmcm9tIHRoZSB2aWV3IG9mCi0gICAgICAgICAgICAgICAgLy8gc3BlY2lmaWNhdGlvbiwgYnV0IGFjdHVhbGx5IG5lY2Vzc2FyeSBmb3IgcGFyc2luZyB2Q2FyZCB3aXRoIG5vbi1VVEYtOAotICAgICAgICAgICAgICAgIC8vIGNoYXJzZXRzLCBleHBlY3Rpbmcgb3RoZXIgcGFyc2VycyBub3QgZ2V0IGNvbmZ1c2VkIHdpdGggdGhpcyB2YWx1ZS4KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVzY2FwZUNoYXJhY3RlcnMoc29ydFN0cmluZykpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgfSBlbHNlIGlmIChtSXNKYXBhbmVzZU1vYmlsZVBob25lKSB7Ci0gICAgICAgICAgICAvLyBOb3RlOiBUaGVyZSBpcyBubyBhcHByb3ByaWF0ZSBwcm9wZXJ0eSBmb3IgZXhwcmVzc2luZwotICAgICAgICAgICAgLy8gICAgICAgcGhvbmV0aWMgbmFtZSAoWW9taWdhbmEgaW4gSmFwYW5lc2UpIGluIHZDYXJkIDIuMSwgd2hpbGUgdGhlcmUgaXMgaW4KLSAgICAgICAgICAgIC8vICAgICAgIHZDYXJkIDMuMCAoU09SVC1TVFJJTkcpLgotICAgICAgICAgICAgLy8gICAgICAgV2UgdXNlIERvQ29NbydzIHdheSB3aGVuIHRoZSBkZXZpY2UgaXMgSmFwYW5lc2Ugb25lIHNpbmNlIGl0IGlzIGFscmVhZHkKLSAgICAgICAgICAgIC8vICAgICAgIHN1cHBvcnRlZCBieSBhIGxvdCBvZiBKYXBhbmVzZSBtb2JpbGUgcGhvbmVzLgotICAgICAgICAgICAgLy8gICAgICAgVGhpcyBpcyAiWC0iIHByb3BlcnR5LCBzbyBhbnkgcGFyc2VyIGhvcGVmdWxseSB3b3VsZCBub3QgZ2V0Ci0gICAgICAgICAgICAvLyAgICAgICBjb25mdXNlZCB3aXRoIHRoaXMuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gICAgICAgQWxzbywgRG9Db01vJ3Mgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyB2Q2FyZCBjb21wb3NlciB0byB1c2UganVzdCB0aGUgZmlyc3QKLSAgICAgICAgICAgIC8vICAgICAgIGNvbHVtbi4KLSAgICAgICAgICAgIC8vICAgICAgIGkuZS4KLSAgICAgICAgICAgIC8vICAgICAgIGdvb2Q6ICBTT1VORDtYLUlSTUMtTjpNaXlha2F3YSBEYWlzdWtlOzs7OwotICAgICAgICAgICAgLy8gICAgICAgYmFkIDogIFNPVU5EO1gtSVJNQy1OOk1peWFrYXdhO0RhaXN1a2U7OzsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9TT1VORCk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1hfSVJNQ19OKTsKLQotICAgICAgICAgICAgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgICghbVJlZnJhaW5zUVBUb05hbWVQcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAhKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZXRpY0ZhbWlseU5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob25ldGljTWlkZGxlTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmV0aWNHaXZlbk5hbWUpKSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWU7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lOwotICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSA9IGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lID0gZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSA9IGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUsIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBmYW1pbHk7Z2l2ZW4KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBnaXZlbjttaWRkbGUKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBtaWRkbGU7cHJlZml4Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOyAgLy8gcHJlZml4O3N1ZmZpeAotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgfQotCi0gICAgICAgIExvZy5kKCJAQEAiLCAiaG9nZSIpOwotICAgICAgICBpZiAobVVzZXNEZWZhY3RQcm9wZXJ0eSkgewotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0dpdmVuTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHBob25ldGljR2l2ZW5OYW1lKSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZTsKLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShwaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lID0gZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1BIT05FVElDX0ZJUlNUX05BTUUpOwotICAgICAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0ocGhvbmV0aWNHaXZlbk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgICAgIH0gIC8vIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNHaXZlbk5hbWUpKQotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY01pZGRsZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShwaG9uZXRpY01pZGRsZU5hbWUpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZTsKLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lID0gZXNjYXBlQ2hhcmFjdGVycyhwaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9QSE9ORVRJQ19NSURETEVfTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShwaG9uZXRpY01pZGRsZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgICAgICB9ICAvLyBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHBob25ldGljR2l2ZW5OYW1lKSkKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNGYW1pbHlOYW1lKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocGhvbmV0aWNGYW1pbHlOYW1lKSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWU7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSA9IGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUEhPTkVUSUNfTEFTVF9OQU1FKTsKLSAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKHBob25ldGljRmFtaWx5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgICAgIH0gIC8vIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNGYW1pbHlOYW1lKSkKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kTmlja05hbWVzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiB1c2VBbmRyb2lkUHJvcGVydHk7Ci0gICAgICAgIGlmIChtSXNWMzBPclY0MCkgeyAgIC8vIFRoZXNlIHNwZWNpZmljYXRpb25zIGhhdmUgTklDS05BTUUgcHJvcGVydHkuCi0gICAgICAgICAgICB1c2VBbmRyb2lkUHJvcGVydHkgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChtVXNlc0FuZHJvaWRQcm9wZXJ0eSkgewotICAgICAgICAgICAgdXNlQW5kcm9pZFByb3BlcnR5ID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gd2F5IHRvIGFkZCB0aGlzIGZpZWxkLgotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmlja25hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKE5pY2tuYW1lLk5BTUUpOwotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShuaWNrbmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh1c2VBbmRyb2lkUHJvcGVydHkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kQW5kcm9pZFNwZWNpZmljUHJvcGVydHkoTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUsIGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX05JQ0tOQU1FLCBuaWNrbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kUGhvbmVzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgYm9vbGVhbiBwaG9uZUxpbmVFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IHBob25lU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgdHlwZUFzT2JqZWN0ID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoUGhvbmUuVFlQRSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhQaG9uZS5MQUJFTCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBpc1ByaW1hcnlBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihQaG9uZS5JU19QUklNQVJZKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSA9IChpc1ByaW1hcnlBc0ludGVnZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5QXNJbnRlZ2VyID4gMCkgOiBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBob25lTnVtYmVyID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhQaG9uZS5OVU1CRVIpOwotICAgICAgICAgICAgICAgIGlmIChwaG9uZU51bWJlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBob25lTnVtYmVyID0gcGhvbmVOdW1iZXIudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGhvbmVOdW1iZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFBBR0VSIG51bWJlciBuZWVkcyB1bmZvcm1hdHRlZCAicGhvbmUgbnVtYmVyIi4KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdHlwZSA9ICh0eXBlQXNPYmplY3QgIT0gbnVsbCA/IHR5cGVBc09iamVjdCA6IERFRkFVTFRfUEhPTkVfVFlQRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9QQUdFUiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25maWcucmVmcmFpblBob25lTnVtYmVyRm9ybWF0dGluZyhtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBwaG9uZUxpbmVFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXBob25lU2V0LmNvbnRhaW5zKHBob25lTnVtYmVyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmVTZXQuYWRkKHBob25lTnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRlbExpbmUodHlwZSwgbGFiZWwsIHBob25lTnVtYmVyLCBpc1ByaW1hcnkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBob25lTnVtYmVyTGlzdCA9IHNwbGl0QW5kVHJpbVBob25lTnVtYmVycyhwaG9uZU51bWJlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwaG9uZU51bWJlckxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwaG9uZUxpbmVFeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBhY3R1YWxQaG9uZU51bWJlciA6IHBob25lTnVtYmVyTGlzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwaG9uZVNldC5jb250YWlucyhhY3R1YWxQaG9uZU51bWJlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZm9ybWF0ID0gVkNhcmRVdGlscy5nZXRQaG9uZU51bWJlckZvcm1hdChtVkNhcmRUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybWF0dGVkUGhvbmVOdW1iZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoYWN0dWFsUGhvbmVOdW1iZXIsIGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmVTZXQuYWRkKGFjdHVhbFBob25lTnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUZWxMaW5lKHR5cGUsIGxhYmVsLCBmb3JtYXR0ZWRQaG9uZU51bWJlciwgaXNQcmltYXJ5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSAgLy8gZm9yIChTdHJpbmcgYWN0dWFsUGhvbmVOdW1iZXIgOiBwaG9uZU51bWJlckxpc3QpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXBob25lTGluZUV4aXN0cyAmJiBtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgIGFwcGVuZFRlbExpbmUoUGhvbmUuVFlQRV9IT01FLCAiIiwgIiIsIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFNwbGl0cyBhIGdpdmVuIHN0cmluZyBleHByZXNzaW5nIHBob25lIG51bWJlcnMgaW50byBzZXZlcmFsIHN0cmluZ3MsIGFuZCByZW1vdmUKLSAgICAgKiB1bm5lY2Vzc2FyeSBjaGFyYWN0ZXJzIGluc2lkZSB0aGVtLiBUaGUgc2l6ZSBvZiBhIHJldHVybmVkIGxpc3QgYmVjb21lcyAxIHdoZW4KLSAgICAgKiBubyBzcGxpdCBpcyBuZWVkZWQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoZSBnaXZlbiBudW1iZXIgIm1heSIgaGF2ZSBzZXZlcmFsIHBob25lIG51bWJlcnMgd2hlbiB0aGUgY29udGFjdCBlbnRyeSBpcyBjb3JydXB0ZWQKLSAgICAgKiBiZWNhdXNlIG9mIGl0cyBvcmlnaW5hbCBzb3VyY2UuCi0gICAgICogZS5nLiAiMTExLTIyMi0zMzMzIChNaWFtaSlcbjQ0NC01NTUtNjY2NiAoQnJvd2FyZDsgMzA1LTY1My02Nzk2IChNaWFtaSkiCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoaXMga2luZCBvZiAicGhvbmUgbnVtYmVycyIgd2lsbCBub3QgYmUgY3JlYXRlZCB3aXRoIEFuZHJvaWQgdkNhcmQgaW1wbGVtZW50YXRpb24sCi0gICAgICogYnV0IHdlIG1heSBlbmNvdW50ZXIgdGhlbSBpZiB0aGUgc291cmNlIG9mIHRoZSBpbnB1dCBkYXRhIGhhcyBhbHJlYWR5IGNvcnJ1cHRlZAotICAgICAqIGltcGxlbWVudGF0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUbyBoYW5kbGUgdGhpcyBjYXNlLCB0aGlzIG1ldGhvZCBmaXJzdCBzcGxpdHMgaXRzIGlucHV0IGludG8gbXVsdGlwbGUgcGFydHMKLSAgICAgKiAoZS5nLiAiMTExLTIyMi0zMzMzIChNaWFtaSkiLCAiNDQ0LTU1NS02NjY2IChCcm93YXJkIiwgYW5kIDMwNTY1My02Nzk2IChNaWFtaSkiKSBhbmQKLSAgICAgKiByZW1vdmVzIHVubmVjZXNzYXJ5IHN0cmluZ3MgbGlrZSAiKE1pYW1pKSIuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIERvIG5vdCBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gdHJpbW1pbmcgaXMgaW5hcHByb3ByaWF0ZSBmb3IgaXRzIHJlY2VpdmVycy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3BsaXRBbmRUcmltUGhvbmVOdW1iZXJzKGZpbmFsIFN0cmluZyBwaG9uZU51bWJlcikgewotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGhvbmVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHBob25lTnVtYmVyLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBjaGFyIGNoID0gcGhvbmVOdW1iZXIuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGNoKSB8fCBjaCA9PSAnKycpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChjaCA9PSAnOycgfHwgY2ggPT0gJ1xuJykgJiYgYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBwaG9uZUxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ1aWxkZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBwaG9uZUxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGhvbmVMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kRW1haWxzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgYm9vbGVhbiBlbWFpbEFkZHJlc3NFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGFkZHJlc3NTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVtYWlsQWRkcmVzcyA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoRW1haWwuREFUQSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVtYWlsQWRkcmVzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVtYWlsQWRkcmVzcyA9IGVtYWlsQWRkcmVzcy50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShlbWFpbEFkZHJlc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJbnRlZ2VyIHR5cGVBc09iamVjdCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEVtYWlsLlRZUEUpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCB0eXBlID0gKHR5cGVBc09iamVjdCAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBc09iamVjdCA6IERFRkFVTFRfRU1BSUxfVFlQRSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhFbWFpbC5MQUJFTCk7Ci0gICAgICAgICAgICAgICAgSW50ZWdlciBpc1ByaW1hcnlBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihFbWFpbC5JU19QUklNQVJZKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSA9IChpc1ByaW1hcnlBc0ludGVnZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5QXNJbnRlZ2VyID4gMCkgOiBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZW1haWxBZGRyZXNzRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoIWFkZHJlc3NTZXQuY29udGFpbnMoZW1haWxBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzU2V0LmFkZChlbWFpbEFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICBhcHBlbmRFbWFpbExpbmUodHlwZSwgbGFiZWwsIGVtYWlsQWRkcmVzcywgaXNQcmltYXJ5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWVtYWlsQWRkcmVzc0V4aXN0cyAmJiBtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgIGFwcGVuZEVtYWlsTGluZShFbWFpbC5UWVBFX0hPTUUsICIiLCAiIiwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRQb3N0YWxzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ID09IG51bGwgfHwgY29udGVudFZhbHVlc0xpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0FEUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgIGFwcGVuZFBvc3RhbHNGb3JEb0NvTW8oY29udGVudFZhbHVlc0xpc3QpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhcHBlbmRQb3N0YWxzRm9yR2VuZXJpYyhjb250ZW50VmFsdWVzTGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgSW50ZWdlcj4gc1Bvc3RhbFR5cGVQcmlvcml0eU1hcDsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIHNQb3N0YWxUeXBlUHJpb3JpdHlNYXAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOwotICAgICAgICBzUG9zdGFsVHlwZVByaW9yaXR5TWFwLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRSwgMCk7Ci0gICAgICAgIHNQb3N0YWxUeXBlUHJpb3JpdHlNYXAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9XT1JLLCAxKTsKLSAgICAgICAgc1Bvc3RhbFR5cGVQcmlvcml0eU1hcC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSLCAyKTsKLSAgICAgICAgc1Bvc3RhbFR5cGVQcmlvcml0eU1hcC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSwgMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJpZXMgdG8gYXBwZW5kIGp1c3Qgb25lIGxpbmUuIElmIHRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWRkcmVzcwotICAgICAqIGluZm9ybWF0aW9uLCBhcHBlbmQgYW4gZW1wdHkgbGluZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kUG9zdGFsc0ZvckRvQ29NbyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGludCBjdXJyZW50UHJpb3JpdHkgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgaW50IGN1cnJlbnRUeXBlID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgY3VycmVudENvbnRlbnRWYWx1ZXMgPSBudWxsOwotICAgICAgICBmb3IgKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHR5cGVBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUpOwotICAgICAgICAgICAgZmluYWwgSW50ZWdlciBwcmlvcml0eUFzSW50ZWdlciA9IHNQb3N0YWxUeXBlUHJpb3JpdHlNYXAuZ2V0KHR5cGVBc0ludGVnZXIpOwotICAgICAgICAgICAgZmluYWwgaW50IHByaW9yaXR5ID0KLSAgICAgICAgICAgICAgICAgICAgKHByaW9yaXR5QXNJbnRlZ2VyICE9IG51bGwgPyBwcmlvcml0eUFzSW50ZWdlciA6IEludGVnZXIuTUFYX1ZBTFVFKTsKLSAgICAgICAgICAgIGlmIChwcmlvcml0eSA8IGN1cnJlbnRQcmlvcml0eSkgewotICAgICAgICAgICAgICAgIGN1cnJlbnRQcmlvcml0eSA9IHByaW9yaXR5OwotICAgICAgICAgICAgICAgIGN1cnJlbnRUeXBlID0gdHlwZUFzSW50ZWdlcjsKLSAgICAgICAgICAgICAgICBjdXJyZW50Q29udGVudFZhbHVlcyA9IGNvbnRlbnRWYWx1ZXM7Ci0gICAgICAgICAgICAgICAgaWYgKHByaW9yaXR5ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN1cnJlbnRDb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJTaG91bGQgbm90IGNvbWUgaGVyZS4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBwb3N0YWwgZGF0YS4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbCA9IGN1cnJlbnRDb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwpOwotICAgICAgICBhcHBlbmRQb3N0YWxMaW5lKGN1cnJlbnRUeXBlLCBsYWJlbCwgY3VycmVudENvbnRlbnRWYWx1ZXMsIGZhbHNlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kUG9zdGFsc0ZvckdlbmVyaWMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBmb3IgKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHR5cGVBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUpOwotICAgICAgICAgICAgZmluYWwgaW50IHR5cGUgPSAodHlwZUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgdHlwZUFzSW50ZWdlciA6IERFRkFVTFRfUE9TVEFMX1RZUEUpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMKTsKLSAgICAgICAgICAgIGZpbmFsIEludGVnZXIgaXNQcmltYXJ5QXNJbnRlZ2VyID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihTdHJ1Y3R1cmVkUG9zdGFsLklTX1BSSU1BUlkpOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkgPSAoaXNQcmltYXJ5QXNJbnRlZ2VyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5QXNJbnRlZ2VyID4gMCkgOiBmYWxzZSk7Ci0gICAgICAgICAgICBhcHBlbmRQb3N0YWxMaW5lKHR5cGUsIGxhYmVsLCBjb250ZW50VmFsdWVzLCBpc1ByaW1hcnksIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBvc3RhbFN0cnVjdCB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlOwotICAgICAgICBmaW5hbCBib29sZWFuIGFwcGVuZENoYXJzZXQ7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhZGRyZXNzRGF0YTsKLSAgICAgICAgcHVibGljIFBvc3RhbFN0cnVjdChmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSwKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGFwcGVuZENoYXJzZXQsIGZpbmFsIFN0cmluZyBhZGRyZXNzRGF0YSkgewotICAgICAgICAgICAgdGhpcy5yZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPSByZWFsbHlVc2VRdW90ZWRQcmludGFibGU7Ci0gICAgICAgICAgICB0aGlzLmFwcGVuZENoYXJzZXQgPSBhcHBlbmRDaGFyc2V0OwotICAgICAgICAgICAgdGhpcy5hZGRyZXNzRGF0YSA9IGFkZHJlc3NEYXRhOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBudWxsIHdoZW4gdGhlcmUncyBubyBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gY29uc3RydWN0IHRoZSBkYXRhLgotICAgICAqLwotICAgIHByaXZhdGUgUG9zdGFsU3RydWN0IHRyeUNvbnN0cnVjdFBvc3RhbFN0cnVjdChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgLy8gYWRyLXZhbHVlICAgID0gMCo2KHRleHQtdmFsdWUgIjsiKSB0ZXh0LXZhbHVlCi0gICAgICAgIC8vICAgICAgICAgICAgICA7IFBPIEJveCwgRXh0ZW5kZWQgQWRkcmVzcywgU3RyZWV0LCBMb2NhbGl0eSwgUmVnaW9uLCBQb3N0YWwKLSAgICAgICAgLy8gICAgICAgICAgICAgIDsgQ29kZSwgQ291bnRyeSBOYW1lCi0gICAgICAgIGZpbmFsIFN0cmluZyByYXdQb0JveCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByYXdOZWlnaGJvcmhvb2QgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuTkVJR0hCT1JIT09EKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd1N0cmVldCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcmF3TG9jYWxpdHkgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuQ0lUWSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByYXdSZWdpb24gPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuUkVHSU9OKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd1Bvc3RhbENvZGUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcmF3Q291bnRyeSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZKTsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gcmF3QWRkcmVzc0FycmF5ID0gbmV3IFN0cmluZ1tdewotICAgICAgICAgICAgICAgIHJhd1BvQm94LCByYXdOZWlnaGJvcmhvb2QsIHJhd1N0cmVldCwgcmF3TG9jYWxpdHksCi0gICAgICAgICAgICAgICAgcmF3UmVnaW9uLCByYXdQb3N0YWxDb2RlLCByYXdDb3VudHJ5fTsKLSAgICAgICAgaWYgKCFWQ2FyZFV0aWxzLmFyZUFsbEVtcHR5KHJhd0FkZHJlc3NBcnJheSkpIHsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd0FkZHJlc3NBcnJheSkpOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhcHBlbmRDaGFyc2V0ID0KLSAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShyYXdBZGRyZXNzQXJyYXkpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQb0JveDsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkU3RyZWV0OwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRMb2NhbGl0eTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUmVnaW9uOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQb3N0YWxDb2RlOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRDb3VudHJ5OwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWROZWlnaGJvcmhvb2Q7Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdMb2NhbGl0eTI7Ci0gICAgICAgICAgICAvLyBUaGlzIGxvb2tzIGluZWZmaWNpZW50IHNpbmNlIHdlIGVuY29kZSByYXdMb2NhbGl0eSBhbmQgcmF3TmVpZ2hib3Job29kIHR3aWNlLAotICAgICAgICAgICAgLy8gYnV0IHRoaXMgaXMgaW50ZW50aW9uYWwuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gUVAgZW5jb2RpbmcgbWF5IGFkZCBsaW5lIGZlZWRzIHdoZW4gbmVlZGVkIGFuZCB0aGUgcmVzdWx0IG9mCi0gICAgICAgICAgICAvLyAtIGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdMb2NhbGl0eSArICIgIiArIHJhd05laWdoYm9yaG9vZCkKLSAgICAgICAgICAgIC8vIG1heSBiZSBkaWZmZXJlbnQgZnJvbQotICAgICAgICAgICAgLy8gLSBlbmNvZGVkTG9jYWxpdHkgKyAiICIgKyBlbmNvZGVkTmVpZ2hib3Job29kLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFdlIHVzZSBzYWZlciB3YXkuCi0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocmF3TG9jYWxpdHkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJhd05laWdoYm9yaG9vZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmF3TG9jYWxpdHkyID0gIiI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmF3TG9jYWxpdHkyID0gcmF3TmVpZ2hib3Job29kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJhd05laWdoYm9yaG9vZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmF3TG9jYWxpdHkyID0gcmF3TG9jYWxpdHk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmF3TG9jYWxpdHkyID0gcmF3TG9jYWxpdHkgKyAiICIgKyByYXdOZWlnaGJvcmhvb2Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgIGVuY29kZWRQb0JveCA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdQb0JveCk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFN0cmVldCA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdTdHJlZXQpOwotICAgICAgICAgICAgICAgIGVuY29kZWRMb2NhbGl0eSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdMb2NhbGl0eTIpOwotICAgICAgICAgICAgICAgIGVuY29kZWRSZWdpb24gPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3UmVnaW9uKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUG9zdGFsQ29kZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdQb3N0YWxDb2RlKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkQ291bnRyeSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdDb3VudHJ5KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBvQm94ID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdQb0JveCk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFN0cmVldCA9IGVzY2FwZUNoYXJhY3RlcnMocmF3U3RyZWV0KTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkTG9jYWxpdHkgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd0xvY2FsaXR5Mik7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFJlZ2lvbiA9IGVzY2FwZUNoYXJhY3RlcnMocmF3UmVnaW9uKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUG9zdGFsQ29kZSA9IGVzY2FwZUNoYXJhY3RlcnMocmF3UG9zdGFsQ29kZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZENvdW50cnkgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd0NvdW50cnkpOwotICAgICAgICAgICAgICAgIGVuY29kZWROZWlnaGJvcmhvb2QgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd05laWdoYm9yaG9vZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGFkZHJlc3NCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChlbmNvZGVkUG9Cb3gpOwotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsgIC8vIFBPIEJPWCA7IEV4dGVuZGVkIEFkZHJlc3MKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBFeHRlbmRlZCBBZGRyZXNzIDogU3RyZWV0Ci0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoZW5jb2RlZFN0cmVldCk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOyAgLy8gU3RyZWV0IDogTG9jYWxpdHkKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChlbmNvZGVkTG9jYWxpdHkpOwotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsgIC8vIExvY2FsaXR5IDogUmVnaW9uCi0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoZW5jb2RlZFJlZ2lvbik7Ci0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOyAgLy8gUmVnaW9uIDogUG9zdGFsIENvZGUKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChlbmNvZGVkUG9zdGFsQ29kZSk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOyAgLy8gUG9zdGFsIENvZGUgOiBDb3VudHJ5Ci0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoZW5jb2RlZENvdW50cnkpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3N0YWxTdHJ1Y3QoCi0gICAgICAgICAgICAgICAgICAgIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSwgYXBwZW5kQ2hhcnNldCwgYWRkcmVzc0J1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gZWxzZSB7ICAvLyBWQ2FyZFV0aWxzLmFyZUFsbEVtcHR5KHJhd0FkZHJlc3NBcnJheSkgPT0gdHJ1ZQotICAgICAgICAgICAgLy8gVHJ5IHRvIHVzZSBGT1JNQVRURURfQUREUkVTUyBpbnN0ZWFkLgotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJhd0Zvcm1hdHRlZEFkZHJlc3MgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUyk7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocmF3Rm9ybWF0dGVkQWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd0Zvcm1hdHRlZEFkZHJlc3MpKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYXBwZW5kQ2hhcnNldCA9Ci0gICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkocmF3Rm9ybWF0dGVkQWRkcmVzcyk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZEZvcm1hdHRlZEFkZHJlc3M7Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZEZvcm1hdHRlZEFkZHJlc3MgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3Rm9ybWF0dGVkQWRkcmVzcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuY29kZWRGb3JtYXR0ZWRBZGRyZXNzID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdGb3JtYXR0ZWRBZGRyZXNzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV2UgdXNlIHRoZSBzZWNvbmQgdmFsdWUgKCJFeHRlbmRlZCBBZGRyZXNzIikganVzdCBiZWNhdXNlIEphcGFuZXNlIG1vYmlsZSBwaG9uZXMKLSAgICAgICAgICAgIC8vIGRvIHNvLiBJZiB0aGUgb3RoZXIgaW1wb3J0ZXIgZXhwZWN0cyB0aGUgdmFsdWUgYmUgaW4gdGhlIG90aGVyIGZpZWxkLCBzb21lIGZsYWcgbWF5Ci0gICAgICAgICAgICAvLyBiZSBuZWVkZWQuCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGFkZHJlc3NCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBQTyBCT1ggOyBFeHRlbmRlZCBBZGRyZXNzCi0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoZW5jb2RlZEZvcm1hdHRlZEFkZHJlc3MpOwotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsgIC8vIEV4dGVuZGVkIEFkZHJlc3MgOiBTdHJlZXQKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBTdHJlZXQgOiBMb2NhbGl0eQotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsgIC8vIExvY2FsaXR5IDogUmVnaW9uCi0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOyAgLy8gUmVnaW9uIDogUG9zdGFsIENvZGUKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBQb3N0YWwgQ29kZSA6IENvdW50cnkKLSAgICAgICAgICAgIHJldHVybiBuZXcgUG9zdGFsU3RydWN0KAotICAgICAgICAgICAgICAgICAgICByZWFsbHlVc2VRdW90ZWRQcmludGFibGUsIGFwcGVuZENoYXJzZXQsIGFkZHJlc3NCdWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRJbXMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgcHJvdG9jb2xBc09iamVjdCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEltLlBST1RPQ09MKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2xBc09iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lID0gVkNhcmRVdGlscy5nZXRQcm9wZXJ0eU5hbWVGb3JJbShwcm90b2NvbEFzT2JqZWN0KTsKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBkYXRhID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhJbS5EQVRBKTsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGRhdGEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZUFzU3RyaW5nOwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciB0eXBlQXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoSW0uVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZUFzSW50ZWdlciAhPSBudWxsID8gdHlwZUFzSW50ZWdlciA6IEltLlRZUEVfT1RIRVIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW0uVFlQRV9IT01FOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbS5UWVBFX1dPUks6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUks7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEltLlRZUEVfQ1VTVE9NOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhJbS5MQUJFTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gKGxhYmVsICE9IG51bGwgPyAiWC0iICsgbGFiZWwgOiBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW0uVFlQRV9PVEhFUjogIC8vIElnbm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodHlwZUFzU3RyaW5nKSkgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZCh0eXBlQXNTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGlzUHJpbWFyeUFzSW50ZWdlciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEltLklTX1BSSU1BUlkpOwotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5ID0gKGlzUHJpbWFyeUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgIChpc1ByaW1hcnlBc0ludGVnZXIgPiAwKSA6IGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24ocHJvcGVydHlOYW1lLCBwYXJhbWV0ZXJMaXN0LCBkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZFdlYnNpdGVzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgd2Vic2l0ZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoV2Vic2l0ZS5VUkwpOwotICAgICAgICAgICAgICAgIGlmICh3ZWJzaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgd2Vic2l0ZSA9IHdlYnNpdGUudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIE5vdGU6IHZDYXJkIDMuMCBkb2VzIG5vdCBhbGxvdyBhbnkgcGFyYW1ldGVyIGFkZGl0aW9uIHRvd2FyZCAiVVJMIgotICAgICAgICAgICAgICAgIC8vICAgICAgIHByb3BlcnR5LCB3aGlsZSB0aGVyZSdzIG5vIGRvY3VtZW50IGluIHZDYXJkIDIuMS4KLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHdlYnNpdGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1VSTCwgd2Vic2l0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kT3JnYW5pemF0aW9ucyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBhbnkgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKE9yZ2FuaXphdGlvbi5DT01QQU5ZKTsKLSAgICAgICAgICAgICAgICBpZiAoY29tcGFueSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBhbnkgPSBjb21wYW55LnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRlcGFydG1lbnQgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5UKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVwYXJ0bWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlcGFydG1lbnQgPSBkZXBhcnRtZW50LnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhPcmdhbml6YXRpb24uVElUTEUpOwotICAgICAgICAgICAgICAgIGlmICh0aXRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgb3JnQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjb21wYW55KSkgewotICAgICAgICAgICAgICAgICAgICBvcmdCdWlsZGVyLmFwcGVuZChjb21wYW55KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShkZXBhcnRtZW50KSkgewotICAgICAgICAgICAgICAgICAgICBpZiAob3JnQnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZ0J1aWxkZXIuYXBwZW5kKCc7Jyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3JnQnVpbGRlci5hcHBlbmQoZGVwYXJ0bWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBvcmdsaW5lID0gb3JnQnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfT1JHLCBvcmdsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkob3JnbGluZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkob3JnbGluZSkpKTsKLQotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodGl0bGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVElUTEUsIHRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKHRpdGxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHRpdGxlKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZFBob3RvcyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBjb250ZW50VmFsdWVzLmdldEFzQnl0ZUFycmF5KFBob3RvLlBIT1RPKTsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGhvdG9UeXBlID0gVkNhcmRVdGlscy5ndWVzc0ltYWdlVHlwZShkYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvdG9UeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIlVua25vd24gcGhvdG8gdHlwZS4gSWdub3JlZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIHRoaXMgd29ya3MgZmluZS4KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGhvdG9TdHJpbmcgPSBuZXcgU3RyaW5nKEJhc2U2NC5lbmNvZGUoZGF0YSwgQmFzZTY0Lk5PX1dSQVApKTsKLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHBob3RvU3RyaW5nKSkgewotICAgICAgICAgICAgICAgICAgICBhcHBlbmRQaG90b0xpbmUocGhvdG9TdHJpbmcsIHBob3RvVHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kTm90ZXMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1Pbmx5T25lTm90ZUZpZWxkSXNBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIG5vdGVCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBub3RlID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhOb3RlLk5PVEUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobm90ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub3RlID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5vdGUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlQnVpbGRlci5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBub3RlQnVpbGRlci5hcHBlbmQobm90ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5vdGVTdHIgPSBub3RlQnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgd2Ugc2NhbiBub3RlU3RyIGNvbXBsZXRlbHkgdHdpY2UsIHdoaWNoIGlzIHJlZHVuZGFudC4KLSAgICAgICAgICAgICAgICAvLyBCdXQgZm9yIG5vdywgd2UgYXNzdW1lIHRoaXMgaXMgbm90IHNvIHRpbWUtY29uc3VtaW5nLi4KLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHNob3VsZEFwcGVuZENoYXJzZXRJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkobm90ZVN0cik7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkobm90ZVN0cikpOwotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTk9URSwgbm90ZVN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFwcGVuZENoYXJzZXRJbmZvLCByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBub3RlU3RyID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhOb3RlLk5PVEUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG5vdGVTdHIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHNob3VsZEFwcGVuZENoYXJzZXRJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkobm90ZVN0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkobm90ZVN0cikpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OT1RFLCBub3RlU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRBcHBlbmRDaGFyc2V0SW5mbywgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZEV2ZW50cyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIC8vIFRoZXJlJ3MgcG9zc2liaWxpdHkgd2hlcmUgYSBnaXZlbiBvYmplY3QgbWF5IGhhdmUgbW9yZSB0aGFuIG9uZSBiaXJ0aGRheSwgd2hpY2gKLSAgICAgICAgLy8gaXMgaW5hcHByb3ByaWF0ZS4gV2UganVzdCBidWlsZCBvbmUgYmlydGhkYXkuCi0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJpbWFyeUJpcnRoZGF5ID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBzZWNvbmRhcnlCaXJ0aGRheSA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBldmVudFR5cGVBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihFdmVudC5UWVBFKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZXZlbnRUeXBlOwotICAgICAgICAgICAgICAgIGlmIChldmVudFR5cGVBc0ludGVnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBldmVudFR5cGVBc0ludGVnZXI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gRXZlbnQuVFlQRV9PVEhFUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBFdmVudC5UWVBFX0JJUlRIREFZKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBiaXJ0aGRheUNhbmRpZGF0ZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoRXZlbnQuU1RBUlRfREFURSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiaXJ0aGRheUNhbmRpZGF0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGlzU3VwZXJQcmltYXJ5QXNJbnRlZ2VyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEV2ZW50LklTX1NVUEVSX1BSSU1BUlkpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzU3VwZXJQcmltYXJ5ID0gKGlzU3VwZXJQcmltYXJ5QXNJbnRlZ2VyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1N1cGVyUHJpbWFyeUFzSW50ZWdlciA+IDApIDogZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdXBlclByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICJzdXBlciBwcmltYXJ5IiBiaXJ0aGRheSBzaG91bGQgdGhlIHByZWZlcmVkIG9uZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlCaXJ0aGRheSA9IGJpcnRoZGF5Q2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBpc1ByaW1hcnlBc0ludGVnZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoRXZlbnQuSVNfUFJJTUFSWSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5ID0gKGlzUHJpbWFyeUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5QXNJbnRlZ2VyID4gMCkgOiBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGJyZWFrIGhlcmUgc2luY2UgInN1cGVyIHByaW1hcnkiIGJpcnRoZGF5IG1heSBleGlzdCBsYXRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlCaXJ0aGRheSA9IGJpcnRoZGF5Q2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlY29uZGFyeUJpcnRoZGF5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IGVudHJ5IGlzIHNldCB0byB0aGUgInNlY29uZGFyeSIgY2FuZGlkYXRlLgotICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5QmlydGhkYXkgPSBiaXJ0aGRheUNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVVzZXNBbmRyb2lkUHJvcGVydHkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnQgdHlwZXMgb3RoZXIgdGhhbiBCaXJ0aGRheSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHZDYXJkLgotICAgICAgICAgICAgICAgICAgICBhcHBlbmRBbmRyb2lkU3BlY2lmaWNQcm9wZXJ0eShFdmVudC5DT05URU5UX0lURU1fVFlQRSwgY29udGVudFZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHByaW1hcnlCaXJ0aGRheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQkRBWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlCaXJ0aGRheS50cmltKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmRhcnlCaXJ0aGRheSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9CREFZLAotICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5QmlydGhkYXkudHJpbSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZFJlbGF0aW9uKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKG1Vc2VzQW5kcm9pZFByb3BlcnR5ICYmIGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhcHBlbmRBbmRyb2lkU3BlY2lmaWNQcm9wZXJ0eShSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSwgY29udGVudFZhbHVlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGVtaXRFdmVyeVRpbWUgSWYgdHJ1ZSwgYnVpbGRlciBidWlsZHMgdGhlIGxpbmUgZXZlbiB3aGVuIHRoZXJlJ3Mgbm8gZW50cnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwZW5kUG9zdGFsTGluZShmaW5hbCBpbnQgdHlwZSwgZmluYWwgU3RyaW5nIGxhYmVsLAotICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzLAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnksIGZpbmFsIGJvb2xlYW4gZW1pdEV2ZXJ5VGltZSkgewotICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBhcHBlbmRDaGFyc2V0OwotICAgICAgICBmaW5hbCBTdHJpbmcgYWRkcmVzc1ZhbHVlOwotICAgICAgICB7Ci0gICAgICAgICAgICBQb3N0YWxTdHJ1Y3QgcG9zdGFsU3RydWN0ID0gdHJ5Q29uc3RydWN0UG9zdGFsU3RydWN0KGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICAgICAgaWYgKHBvc3RhbFN0cnVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVtaXRFdmVyeVRpbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZENoYXJzZXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1ZhbHVlID0gIiI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0gcG9zdGFsU3RydWN0LnJlYWxseVVzZVF1b3RlZFByaW50YWJsZTsKLSAgICAgICAgICAgICAgICBhcHBlbmRDaGFyc2V0ID0gcG9zdGFsU3RydWN0LmFwcGVuZENoYXJzZXQ7Ci0gICAgICAgICAgICAgICAgYWRkcmVzc1ZhbHVlID0gcG9zdGFsU3RydWN0LmFkZHJlc3NEYXRhOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgaWYgKGlzUHJpbWFyeSkgewotICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUU6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSzogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT006IHsKLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGxhYmVsKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKGxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3Qgc3VyZSB3aGV0aGVyIHRoZSBsYWJlbCBpcyB2YWxpZCBpbiB0aGUgc3BlYwotICAgICAgICAgICAgICAgICAgICAvLyAoIklBTkEtdG9rZW4iIGluIHRoZSB2Q2FyZCAzLjAgaXMgdW5jbGVhci4uLikKLSAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCAgZm9yIHNhZmV0eSwgd2UgYWRkICJYLSIgYXQgdGhlIGJlZ2dpbmluZyBvZiBlYWNoIGxhYmVsLgotICAgICAgICAgICAgICAgICAgICAvLyBBbHNvIGNoZWNrcyB0aGUgbGFiZWwgb2JleXMgd2l0aCB2Q2FyZCAzLjAgc3BlYy4KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoIlgtIiArIGxhYmVsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9PVEhFUjogewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmtub3duIFN0cnVjdHVyZWRQb3N0YWwgdHlwZTogIiArIHR5cGUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0FEUik7Ci0gICAgICAgIGlmICghcGFyYW1ldGVyTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcnMocGFyYW1ldGVyTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFwcGVuZENoYXJzZXQpIHsKLSAgICAgICAgICAgIC8vIFN0cmljdGx5LCB2Q2FyZCAzLjAgZG9lcyBub3QgYWxsb3cgZXhwb3J0ZXJzIHRvIGVtaXQgY2hhcnNldCBpbmZvcm1hdGlvbiwKLSAgICAgICAgICAgIC8vIGJ1dCB3ZSB3aWxsIGFkZCBpdCBzaW5jZSB0aGUgaW5mb3JtYXRpb24gc2hvdWxkIGJlIHVzZWZ1bCBmb3IgaW1wb3J0ZXJzLAotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEFzc3VtZSBubyBwYXJzZXIgZG9lcyBub3QgZW1pdCBlcnJvciB3aXRoIHRoaXMgcGFyYW1ldGVyIGluIHZDYXJkIDMuMC4KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgfQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoYWRkcmVzc1ZhbHVlKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRFbWFpbExpbmUoZmluYWwgaW50IHR5cGUsIGZpbmFsIFN0cmluZyBsYWJlbCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSwgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHR5cGVBc1N0cmluZzsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIEVtYWlsLlRZUEVfQ1VTVE9NOiB7Ci0gICAgICAgICAgICAgICAgaWYgKFZDYXJkVXRpbHMuaXNNb2JpbGVQaG9uZUxhYmVsKGxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NFTEw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobGFiZWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4obGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9ICJYLSIgKyBsYWJlbDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRW1haWwuVFlQRV9IT01FOiB7Ci0gICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBFbWFpbC5UWVBFX1dPUks6IHsKLSAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUks7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEVtYWlsLlRZUEVfT1RIRVI6IHsKLSAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBFbWFpbC5UWVBFX01PQklMRTogewotICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0VMTDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5rbm93biBFbWFpbCB0eXBlOiAiICsgdHlwZSk7Ci0gICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gbnVsbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGlmIChpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh0eXBlQXNTdHJpbmcpKSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZCh0eXBlQXNTdHJpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRU1BSUwsIHBhcmFtZXRlckxpc3QsCi0gICAgICAgICAgICAgICAgcmF3VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRlbExpbmUoZmluYWwgSW50ZWdlciB0eXBlQXNJbnRlZ2VyLCBmaW5hbCBTdHJpbmcgbGFiZWwsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFZhbHVlLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVEVMKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0KLSAgICAgICAgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIGlmICh0eXBlQXNJbnRlZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX09USEVSOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHlwZSA9IHR5cGVBc0ludGVnZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX0hPTUU6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZEFsbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfV09SSzogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkQWxsKAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkspKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9GQVhfSE9NRTogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkQWxsKAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUsIFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfRkFYKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfRkFYX1dPUks6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZEFsbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLLCBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0ZBWCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX01PQklMRTogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0VMTCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfUEFHRVI6IHsKLSAgICAgICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSByZWFzb24sIGJ1dCBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBoYWQKLSAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCAiVk9JQ0UiIGluc3RlYWQgb2YgIlBBR0VSIgotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1ZPSUNFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BBR0VSKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfT1RIRVI6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1ZPSUNFKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9DQVI6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NBUik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfQ09NUEFOWV9NQUlOOiB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyByZWxldmFudCBmaWVsZCBpbiB2Q2FyZCAoYXQgbGVhc3QgMi4xKS4KLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkspOwotICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfSVNETjogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSVNETik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfTUFJTjogewotICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfT1RIRVJfRkFYOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9GQVgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX1RFTEVYOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9UTFgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX1dPUktfTU9CSUxFOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGRBbGwoCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSywgVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfV09SS19QQUdFUjogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSyk7Ci0gICAgICAgICAgICAgICAgLy8gU2VlIGFib3ZlLgotICAgICAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9WT0lDRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QQUdFUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX01NUzogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfTVNHKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9DVVNUT006IHsKLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEp1c3QgaWdub3JlIHRoZSBjdXN0b20gdHlwZS4KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9WT0lDRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChWQ2FyZFV0aWxzLmlzTW9iaWxlUGhvbmVMYWJlbChsYWJlbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Jc1YzME9yVjQwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbGFiZWwgaXMgYXBwcm9wcmlhdGVseSBlbmNvZGVkIGluIGFwcGVuZFR5cGVQYXJhbWV0ZXJzLgotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChsYWJlbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVwcGVyTGFiZWwgPSBsYWJlbC50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoVkNhcmRVdGlscy5pc1ZhbGlkSW5WMjFCdXRVbmtub3duVG9Db250YWN0c1Bob3RlVHlwZSh1cHBlckxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQodXBwZXJMYWJlbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKGxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogU3RyaWN0bHksIHZDYXJkIDIuMSBkb2VzIG5vdCBhbGxvdyAiWC0iIHBhcmFtZXRlciB3aXRob3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAiVFlQRT0iIHN0cmluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKCJYLSIgKyBsYWJlbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfUkFESU86Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfVFRZX1RERDoKLSAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFyYW1ldGVyTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGFwcGVuZFVuY29tbW9uUGhvbmVUeXBlKG1CdWlsZGVyLCB0eXBlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXJzKHBhcmFtZXRlckxpc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRWYWx1ZSk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwZW5kcyBwaG9uZSB0eXBlIHN0cmluZyB3aGljaCBtYXkgbm90IGJlIGF2YWlsYWJsZSBpbiBzb21lIGRldmljZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFVuY29tbW9uUGhvbmVUeXBlKGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciwgZmluYWwgSW50ZWdlciB0eXBlKSB7Ci0gICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgIC8vIFRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBmb3IgRG9Db01vIGhhZCBiZWVuIGNvbnNlcnZhdGl2ZQotICAgICAgICAgICAgLy8gYWJvdXQgbWlzY2VsbGFuZW91cyB0eXBlcy4KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfVk9JQ0UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHBob25lVHlwZSA9IFZDYXJkVXRpbHMuZ2V0UGhvbmVUeXBlU3RyaW5nKHR5cGUpOwotICAgICAgICAgICAgaWYgKHBob25lVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcihwaG9uZVR5cGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5rbm93biBvciB1bnN1cHBvcnRlZCAoYnkgdkNhcmQpIFBob25lIHR5cGU6ICIgKyB0eXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBlbmNvZGVkVmFsdWUgTXVzdCBiZSBlbmNvZGVkIGJ5IEJBU0U2NCAKLSAgICAgKiBAcGFyYW0gcGhvdG9UeXBlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwZW5kUGhvdG9MaW5lKGZpbmFsIFN0cmluZyBlbmNvZGVkVmFsdWUsIGZpbmFsIFN0cmluZyBwaG90b1R5cGUpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciB0bXBCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfUEhPVE8pOwotICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICBpZiAobUlzVjMwT3JWNDApIHsKLSAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX0JBU0U2NF9BU19CKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX0JBU0U2NF9WMjEpOwotICAgICAgICB9Ci0gICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXIodG1wQnVpbGRlciwgcGhvdG9UeXBlKTsKLSAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChlbmNvZGVkVmFsdWUpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyB0bXBTdHIgPSB0bXBCdWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIHRtcEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBpbnQgbGluZUNvdW50ID0gMDsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHRtcFN0ci5sZW5ndGgoKTsKLSAgICAgICAgZmluYWwgaW50IG1heE51bUZvckZpcnN0TGluZSA9IFZDYXJkQ29uc3RhbnRzLk1BWF9DSEFSQUNURVJfTlVNU19CQVNFNjRfVjMwCi0gICAgICAgICAgICAgICAgLSBWQ0FSRF9FTkRfT0ZfTElORS5sZW5ndGgoKTsKLSAgICAgICAgZmluYWwgaW50IG1heE51bUluR2VuZXJhbCA9IG1heE51bUZvckZpcnN0TGluZSAtIFZDQVJEX1dTLmxlbmd0aCgpOwotICAgICAgICBpbnQgbWF4TnVtID0gbWF4TnVtRm9yRmlyc3RMaW5lOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCh0bXBTdHIuY2hhckF0KGkpKTsKLSAgICAgICAgICAgIGxpbmVDb3VudCsrOwotICAgICAgICAgICAgaWYgKGxpbmVDb3VudCA+IG1heE51bSkgewotICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ0FSRF9XUyk7Ci0gICAgICAgICAgICAgICAgbWF4TnVtID0gbWF4TnVtSW5HZW5lcmFsOwotICAgICAgICAgICAgICAgIGxpbmVDb3VudCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKHRtcEJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kQW5kcm9pZFNwZWNpZmljUHJvcGVydHkoCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWltZVR5cGUsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICBpZiAoIXNBbGxvd2VkQW5kcm9pZFByb3BlcnR5U2V0LmNvbnRhaW5zKG1pbWVUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiByYXdWYWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gVkNhcmRDb25zdGFudHMuTUFYX0RBVEFfQ09MVU1OOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoImRhdGEiICsgaSk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByYXdWYWx1ZUxpc3QuYWRkKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gbmVlZENoYXJzZXQgPQotICAgICAgICAgICAgKG1TaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0gJiYKLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd1ZhbHVlTGlzdCkpOwotICAgICAgICBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocmF3VmFsdWVMaXN0KSk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0FORFJPSURfQ1VTVE9NKTsKLSAgICAgICAgaWYgKG5lZWRDaGFyc2V0KSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1pbWVUeXBlKTsgIC8vIFNob3VsZCBub3QgYmUgZW5jb2RlZC4KLSAgICAgICAgZm9yIChTdHJpbmcgcmF3VmFsdWUgOiByYXdWYWx1ZUxpc3QpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkVmFsdWU7Ci0gICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd1ZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogb25lIGxpbmUgbWF5IGJlIHRvbyBodWdlLCB3aGljaCBtYXkgYmUgaW52YWxpZCBpbiB2Q2FyZCAzLjAKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgKHdoaWNoIHNheXMgIldoZW4gZ2VuZXJhdGluZyBhIGNvbnRlbnQgbGluZSwgbGluZXMgbG9uZ2VyIHRoYW4KLSAgICAgICAgICAgICAgICAvLyAgICAgICAgNzUgY2hhcmFjdGVycyBTSE9VTEQgYmUgZm9sZGVkIiksIHRob3VnaCBzZXZlcmFsCi0gICAgICAgICAgICAgICAgLy8gICAgICAgIChldmVuIHdlbGwta25vd24pIGFwcGxpY2F0aW9ucyBkbyBub3QgY2FyZSB0aGlzLgotICAgICAgICAgICAgICAgIGVuY29kZWRWYWx1ZSA9IGVzY2FwZUNoYXJhY3RlcnMocmF3VmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSkgewotICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihwcm9wZXJ0eU5hbWUsIG51bGwsIHJhd1ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbigKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIExpc3Q8U3RyaW5nPiByYXdWYWx1ZUxpc3QpIHsKLSAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24ocHJvcGVydHlOYW1lLCBudWxsLCByYXdWYWx1ZUxpc3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwgZmluYWwgU3RyaW5nIHJhd1ZhbHVlKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gbmVlZENoYXJzZXQgPQotICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKHJhd1ZhbHVlKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocmF3VmFsdWUpKTsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIHBhcmFtZXRlckxpc3QsCi0gICAgICAgICAgICAgICAgcmF3VmFsdWUsIG5lZWRDaGFyc2V0LCByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwgZmluYWwgTGlzdDxTdHJpbmc+IHJhd1ZhbHVlTGlzdCkgewotICAgICAgICBib29sZWFuIG5lZWRDaGFyc2V0ID0KLSAgICAgICAgICAgIChtU2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtICYmCi0gICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShyYXdWYWx1ZUxpc3QpKTsKLSAgICAgICAgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd1ZhbHVlTGlzdCkpOwotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgcGFyYW1ldGVyTGlzdCwgcmF3VmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIG5lZWRDaGFyc2V0LCByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGVuZHMgb25lIGxpbmUgd2l0aCBhIGdpdmVuIHByb3BlcnR5IG5hbWUgYW5kIHZhbHVlLiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBTdHJpbmcgcmF3VmFsdWUpIHsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIHJhd1ZhbHVlLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgTGlzdDxTdHJpbmc+IHJhd1ZhbHVlTGlzdCkgewotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgcmF3VmFsdWVMaXN0LCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSwgZmluYWwgYm9vbGVhbiBuZWVkQ2hhcnNldCwKLSAgICAgICAgICAgIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgIGFwcGVuZExpbmUocHJvcGVydHlOYW1lLCBudWxsLCByYXdWYWx1ZSwgbmVlZENoYXJzZXQsIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSkgewotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgcGFyYW1ldGVyTGlzdCwgcmF3VmFsdWUsIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdWYWx1ZSwgZmluYWwgYm9vbGVhbiBuZWVkQ2hhcnNldCwKLSAgICAgICAgICAgIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChwcm9wZXJ0eU5hbWUpOwotICAgICAgICBpZiAocGFyYW1ldGVyTGlzdCAhPSBudWxsICYmIHBhcmFtZXRlckxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVycyhwYXJhbWV0ZXJMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVlZENoYXJzZXQpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRWYWx1ZTsKLSAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd1ZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE86IG9uZSBsaW5lIG1heSBiZSB0b28gaHVnZSwgd2hpY2ggbWF5IGJlIGludmFsaWQgaW4gdkNhcmQgc3BlYywgdGhvdWdoCi0gICAgICAgICAgICAvLyAgICAgICBzZXZlcmFsIChldmVuIHdlbGwta25vd24pIGFwcGxpY2F0aW9ucyBkbyBub3QgY2FyZSB0aGF0IHZpb2xhdGlvbi4KLSAgICAgICAgICAgIGVuY29kZWRWYWx1ZSA9IGVzY2FwZUNoYXJhY3RlcnMocmF3VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRWYWx1ZSk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gcmF3VmFsdWVMaXN0LAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBuZWVkQ2hhcnNldCwgYm9vbGVhbiBuZWVkUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgIGFwcGVuZExpbmUocHJvcGVydHlOYW1lLCBudWxsLCByYXdWYWx1ZUxpc3QsIG5lZWRDaGFyc2V0LCBuZWVkUXVvdGVkUHJpbnRhYmxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0LAotICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHJhd1ZhbHVlTGlzdCwgZmluYWwgYm9vbGVhbiBuZWVkQ2hhcnNldCwKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbmVlZFF1b3RlZFByaW50YWJsZSkgewotICAgICAgICBtQnVpbGRlci5hcHBlbmQocHJvcGVydHlOYW1lKTsKLSAgICAgICAgaWYgKHBhcmFtZXRlckxpc3QgIT0gbnVsbCAmJiBwYXJhbWV0ZXJMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcnMocGFyYW1ldGVyTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5lZWRDaGFyc2V0KSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVlZFF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgIGZvciAoU3RyaW5nIHJhd1ZhbHVlIDogcmF3VmFsdWVMaXN0KSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFZhbHVlOwotICAgICAgICAgICAgaWYgKG5lZWRRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkVmFsdWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3VmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBvbmUgbGluZSBtYXkgYmUgdG9vIGh1Z2UsIHdoaWNoIG1heSBiZSBpbnZhbGlkIGluIHZDYXJkIDMuMAotICAgICAgICAgICAgICAgIC8vICAgICAgICAod2hpY2ggc2F5cyAiV2hlbiBnZW5lcmF0aW5nIGEgY29udGVudCBsaW5lLCBsaW5lcyBsb25nZXIgdGhhbgotICAgICAgICAgICAgICAgIC8vICAgICAgICA3NSBjaGFyYWN0ZXJzIFNIT1VMRCBiZSBmb2xkZWQiKSwgdGhvdWdoIHNldmVyYWwKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgKGV2ZW4gd2VsbC1rbm93bikgYXBwbGljYXRpb25zIGRvIG5vdCBjYXJlIHRoaXMuCi0gICAgICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZDQVJEX1BBUkFNX1NFUEFSQVRPUiBtdXN0IGJlIGFwcGVuZGVkIGJlZm9yZSB0aGlzIG1ldGhvZCBiZWluZyBjYWxsZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFR5cGVQYXJhbWV0ZXJzKGZpbmFsIExpc3Q8U3RyaW5nPiB0eXBlcykgewotICAgICAgICAvLyBXZSBtYXkgaGF2ZSB0byBtYWtlIHRoaXMgY29tbWEgc2VwYXJhdGVkIGZvcm0gbGlrZSAiVFlQRT1ET00sV09SSyIgaW4gdGhlIGZ1dHVyZSwKLSAgICAgICAgLy8gd2hpY2ggd291bGQgYmUgcmVjb21tZW5kZWQgd2F5IGluIHZjYXJkIDMuMCB0aG91Z2ggbm90IHZhbGlkIGluIHZDYXJkIDIuMS4KLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHR5cGVWYWx1ZSA6IHR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZCA9IFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUodHlwZVZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZW5jb2RlZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gTm90ZTogdkNhcmQgMy4wIHNwZWNpZmllcyB0aGUgZGlmZmVyZW50IHR5cGUgb2YgYWNjZXB0YWJsZSB0eXBlIFN0cmluZ3MsIGJ1dAotICAgICAgICAgICAgICAgIC8vICAgICAgIHdlIGRvbid0IGVtaXQgdGhhdCBraW5kIG9mIHZDYXJkIDMuMCBzcGVjaWZpYyB0eXBlIHNpbmNlIHRoZXJlIHNob3VsZCBiZQotICAgICAgICAgICAgICAgIC8vICAgICAgIGhpZ2ggcHJvYmFiaWx5dHkgaW4gd2hpY2ggZXh0ZXJuYWwgaW1wb3J0ZXJzIGNhbm5vdCB1bmRlcnN0YW5kIHRoZW0uCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAvLyBlLmcuIFRZUEU9Ilx1NTc4Qlx1MzA2Qlx1MzA4NyIgKHZDYXJkIDMuMCBhbGxvd3Mgbm9uLUFzY2lpIGNoYXJhY3RlcnMgaWYgdGhleQotICAgICAgICAgICAgICAgIC8vICAgICAgYXJlIHF1b3RlZC4pCi0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXIoZW5jb2RlZCk7Ci0gICAgICAgICAgICB9IGVsc2UgeyAgLy8gdkNhcmQgMi4xCi0gICAgICAgICAgICAgICAgaWYgKCFWQ2FyZFV0aWxzLmlzVjIxV29yZCh0eXBlVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcih0eXBlVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVkNBUkRfUEFSQU1fU0VQQVJBVE9SIG11c3QgYmUgYXBwZW5kZWQgYmVmb3JlIHRoaXMgbWV0aG9kIGJlaW5nIGNhbGxlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kVHlwZVBhcmFtZXRlcihmaW5hbCBTdHJpbmcgdHlwZSkgewotICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVyKG1CdWlsZGVyLCB0eXBlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kVHlwZVBhcmFtZXRlcihmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIsIGZpbmFsIFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIC8vIFJlZnJhaW4gZnJvbSB1c2luZyBhcHBlbmRUeXBlKCkgc28gdGhhdCAiVFlQRT0iIGlzIG5vdCBiZSBhcHBlbmRlZCB3aGVuIHRoZQotICAgICAgICAvLyBkZXZpY2UgaXMgRG9Db01vJ3MgKGp1c3QgZm9yIHNhZmV0eSkuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIE5vdGU6IEluIHZDYXJkIDMuMCwgVHlwZSBzdHJpbmdzIGFsc28gY2FuIGJlIGxpa2UgdGhpczogIlRZUEU9SE9NRSxQUkVGIgotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uNDAobVZDYXJkVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAoKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjMwKG1WQ2FyZFR5cGUpIHx8IG1BcHBlbmRUeXBlUGFyYW1OYW1lKSAmJiAhbUlzRG9Db01vKSkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSkuYXBwZW5kKFZDQVJEX1BBUkFNX0VRVUFMKTsKLSAgICAgICAgfQotICAgICAgICBidWlsZGVyLmFwcGVuZCh0eXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgcHJvcGVydHkgbGluZSBzaG91bGQgY29udGFpbiBjaGFyc2V0IHBhcmFtZXRlcgotICAgICAqIGluZm9ybWF0aW9uLiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRydWUgZXZlbiB3aGVuIHZDYXJkIHZlcnNpb24gaXMgMy4wLgotICAgICAqCi0gICAgICogU3RyaWN0bHksIGFkZGluZyBjaGFyc2V0IGluZm9ybWF0aW9uIGlzIGludmFsaWQgaW4gVkNhcmQgMy4wLgotICAgICAqIEhvd2V2ZXIgd2UnbGwgYWRkIHRoZSBpbmZvIG9ubHkgd2hlbiBjaGFyc2V0IHdlIHVzZSBpcyBub3QgVVRGLTgKLSAgICAgKiBpbiB2Q2FyZCAzLjAgZm9ybWF0LCBzaW5jZSBwYXJzZXIgc2lkZSBtYXkgYmUgYWJsZSB0byB1c2UgdGhlIGNoYXJzZXQKLSAgICAgKiB2aWEgdGhpcyBmaWVsZCwgdGhvdWdoIHdlIG1heSBlbmNvdW50ZXIgYW5vdGhlciBwcm9ibGVtIGJ5IGFkZGluZyBpdC4KLSAgICAgKgotICAgICAqIGUuZy4gSmFwYW5lc2UgbW9iaWxlIHBob25lcyB1c2UgU2hpZnRfSmlzIHdoaWxlIFJGQyAyNDI2Ci0gICAgICogcmVjb21tZW5kcyBVVEYtOC4gQnkgYWRkaW5nIHRoaXMgZmllbGQsIHBhcnNlcnMgbWF5IGJlIGFibGUKLSAgICAgKiB0byBrbm93IHRoaXMgdGV4dCBpcyBOT1QgVVRGLTggYnV0IFNoaWZ0X0ppcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKFN0cmluZy4uLnByb3BlcnR5VmFsdWVMaXN0KSB7Ci0gICAgICAgIGlmICghbVNob3VsZEFwcGVuZENoYXJzZXRQYXJhbSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoU3RyaW5nIHByb3BlcnR5VmFsdWUgOiBwcm9wZXJ0eVZhbHVlTGlzdCkgewotICAgICAgICAgICAgaWYgKCFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKHByb3BlcnR5VmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGVuY29kZVF1b3RlZFByaW50YWJsZShmaW5hbCBTdHJpbmcgc3RyKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzdHIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICBpbnQgbGluZUNvdW50ID0gMDsKLSAgICAgICAgYnl0ZVtdIHN0ckFycmF5ID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RyQXJyYXkgPSBzdHIuZ2V0Qnl0ZXMobUNoYXJzZXQpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJDaGFyc2V0ICIgKyBtQ2hhcnNldCArICIgY2Fubm90IGJlIHVzZWQuICIKLSAgICAgICAgICAgICAgICAgICAgKyAiVHJ5IGRlZmF1bHQgY2hhcnNldCIpOwotICAgICAgICAgICAgc3RyQXJyYXkgPSBzdHIuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoaW5kZXggPCBzdHJBcnJheS5sZW5ndGgpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKFN0cmluZy5mb3JtYXQoIj0lMDJYIiwgc3RyQXJyYXlbaW5kZXhdKSk7Ci0gICAgICAgICAgICBpbmRleCArPSAxOwotICAgICAgICAgICAgbGluZUNvdW50ICs9IDM7Ci0KLSAgICAgICAgICAgIGlmIChsaW5lQ291bnQgPj0gNjcpIHsKLSAgICAgICAgICAgICAgICAvLyBTcGVjaWZpY2F0aW9uIHJlcXVpcmVzIENSTEYgbXVzdCBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlCi0gICAgICAgICAgICAgICAgLy8gbGVuZ3RoIG9mIHRoZSBsaW5lCi0gICAgICAgICAgICAgICAgLy8gYmVjb21lcyBtb3JlIHRoYW4gNzYuCi0gICAgICAgICAgICAgICAgLy8gQXNzdW1pbmcgdGhhdCB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgYSBtdWx0aS1ieXRlIGNoYXJhY3RlciwKLSAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIGJlY29tZQotICAgICAgICAgICAgICAgIC8vIDYgYnl0ZXMuCi0gICAgICAgICAgICAgICAgLy8gNzYgLSA2IC0gMyA9IDY3Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIj1cclxuIik7Ci0gICAgICAgICAgICAgICAgbGluZUNvdW50ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwZW5kICdcJyB0byB0aGUgY2hhcmFjdGVycyB3aGljaCBzaG91bGQgYmUgZXNjYXBlZC4gVGhlIGNoYXJhY3RlciBzZXQgaXMgZGlmZmVyZW50Ci0gICAgICogbm90IG9ubHkgYmV0d2VlbiB2Q2FyZCAyLjEgYW5kIHZDYXJkIDMuMCBidXQgYWxzbyBhbW9uZyBlYWNoIGRldmljZS4KLSAgICAgKgotICAgICAqIE5vdGUgdGhhdCBRdW90ZWQtUHJpbnRhYmxlIHN0cmluZyBtdXN0IG5vdCBiZSBpbnB1dCBoZXJlLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJmYWxsdGhyb3VnaCIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXNjYXBlQ2hhcmFjdGVycyhmaW5hbCBTdHJpbmcgdW5lc2NhcGVkKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh1bmVzY2FwZWQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHRtcEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdW5lc2NhcGVkLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBjaGFyIGNoID0gdW5lc2NhcGVkLmNoYXJBdChpKTsKLSAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgICAgICAgICBjYXNlICc7JzogewotICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgnXFwnKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoJzsnKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzogewotICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBsZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbmV4dENoYXIgPSB1bmVzY2FwZWQuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDaGFyID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICdcbic6IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW4gdkNhcmQgMi4xLCB0aGVyZSdzIG5vIHNwZWNpZmljYXRpb24gYWJvdXQgdGhpcywgd2hpbGUKLSAgICAgICAgICAgICAgICAgICAgLy8gdkNhcmQgMy4wIGV4cGxpY2l0bHkgcmVxdWlyZXMgdGhpcyBzaG91bGQgYmUgZW5jb2RlZCB0byAiXG4iLgotICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgiXFxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICdcXCc6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc1YzME9yVjQwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgiXFxcXCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICc8JzoKLSAgICAgICAgICAgICAgICBjYXNlICc+JzogewotICAgICAgICAgICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgnXFwnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAnLCc6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc1YzME9yVjQwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZCgiXFwsIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRtcEJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBpZiAoIW1FbmRBcHBlbmRlZCkgewotICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9DTEFTUywgVkNBUkRfREFUQV9QVUJMSUMpOwotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9SRURVQ1RJT04sICIiKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfTk8sICIiKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfRENNX0hNTl9NT0RFLCAiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0VORCwgVkNBUkRfREFUQV9WQ0FSRCk7Ci0gICAgICAgICAgICBtRW5kQXBwZW5kZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbXBvc2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb21wb3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTNjZjFlLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbXBvc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Ci0gKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotICogdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRW50aXR5Lk5hbWVkQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRW50aXR5SXRlcmF0b3I7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FbWFpbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkV2ZW50OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuSW07Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5OaWNrbmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5vdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Pcmdhbml6YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob3RvOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUmVsYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkTmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWRQb3N0YWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5XZWJzaXRlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzRW50aXR5OwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNoYXJzZXRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIDxwPgotICogVGhlIGNsYXNzIGZvciBjb21wb3NpbmcgdkNhcmQgZnJvbSBDb250YWN0cyBpbmZvcm1hdGlvbi4KLSAqIDwvcD4KLSAqIDxwPgotICogVXN1YWxseSwgdGhpcyBjbGFzcyBzaG91bGQgYmUgdXNlZCBsaWtlIHRoaXMuCi0gKiA8L3A+Ci0gKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+VkNhcmRDb21wb3NlciBjb21wb3NlciA9IG51bGw7Ci0gKiB0cnkgewotICogICAgIGNvbXBvc2VyID0gbmV3IFZDYXJkQ29tcG9zZXIoY29udGV4dCk7Ci0gKiAgICAgY29tcG9zZXIuYWRkSGFuZGxlcigKLSAqICAgICAgICAgICAgIGNvbXBvc2VyLm5ldyBIYW5kbGVyRm9yT3V0cHV0U3RyZWFtKG91dHB1dFN0cmVhbSkpOwotICogICAgIGlmICghY29tcG9zZXIuaW5pdCgpKSB7Ci0gKiAgICAgICAgIC8vIERvIHNvbWV0aGluZyBoYW5kbGluZyB0aGUgc2l0dWF0aW9uLgotICogICAgICAgICByZXR1cm47Ci0gKiAgICAgfQotICogICAgIHdoaWxlICghY29tcG9zZXIuaXNBZnRlckxhc3QoKSkgewotICogICAgICAgICBpZiAobUNhbmNlbGVkKSB7Ci0gKiAgICAgICAgICAgICAvLyBBc3N1bWUgYSB1c2VyIG1heSBjYW5jZWwgdGhpcyBvcGVyYXRpb24gZHVyaW5nIHRoZSBleHBvcnQuCi0gKiAgICAgICAgICAgICByZXR1cm47Ci0gKiAgICAgICAgIH0KLSAqICAgICAgICAgaWYgKCFjb21wb3Nlci5jcmVhdGVPbmVFbnRyeSgpKSB7Ci0gKiAgICAgICAgICAgICAvLyBEbyBzb21ldGhpbmcgaGFuZGxpbmcgdGhlIGVycm9yIHNpdHVhdGlvbi4KLSAqICAgICAgICAgICAgIHJldHVybjsKLSAqICAgICAgICAgfQotICogICAgIH0KLSAqIH0gZmluYWxseSB7Ci0gKiAgICAgaWYgKGNvbXBvc2VyICE9IG51bGwpIHsKLSAqICAgICAgICAgY29tcG9zZXIudGVybWluYXRlKCk7Ci0gKiAgICAgfQotICogfTwvcHJlPgotICogPHA+Ci0gKiBVc2VycyBoYXZlIHRvIG1hbnVhbGx5IHRha2UgY2FyZSBvZiBtZW1vcnkgZWZmaWNpZW5jeS4gRXZlbiBvbmUgdkNhcmQgbWF5IGNvbnRhaW4KLSAqIGltYWdlIG9mIG5vbi10cml2aWFsIHNpemUgZm9yIG1vYmlsZSBkZXZpY2VzLgotICogPC9wPgotICogPHA+Ci0gKiB7QGxpbmsgVkNhcmRCdWlsZGVyfSBpcyB1c2VkIHRvIGJ1aWxkIGVhY2ggdkNhcmQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZENvbXBvc2VyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZENvbXBvc2VyIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfUkVBU09OX0ZBSUxFRF9UT19HRVRfREFUQUJBU0VfSU5GTyA9Ci0gICAgICAgICJGYWlsZWQgdG8gZ2V0IGRhdGFiYXNlIGluZm9ybWF0aW9uIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfUkVBU09OX05PX0VOVFJZID0KLSAgICAgICAgIlRoZXJlJ3Mgbm8gZXhwb3J0YWJsZSBpbiB0aGUgZGF0YWJhc2UiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRV9SRUFTT05fTk9UX0lOSVRJQUxJWkVEID0KLSAgICAgICAgIlRoZSB2Q2FyZCBjb21wb3NlciBvYmplY3QgaXMgbm90IGNvcnJlY3RseSBpbml0aWFsaXplZCI7Ci0KLSAgICAvKiogU2hvdWxkIGJlIHZpc2libGUgb25seSBmcm9tIGRldmVsb3BlcnMuLi4gKG5vIG5lZWQgdG8gdHJhbnNsYXRlLCBob3BlZnVsbHkpICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRV9SRUFTT05fVU5TVVBQT1JURURfVVJJID0KLSAgICAgICAgIlRoZSBVcmkgdkNhcmQgY29tcG9zZXIgcmVjZWl2ZWQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY29tcG9zZXIuIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0VSUk9SID0gIk5vIGVycm9yIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfU1RSSU5HX0RPQ09NTyA9ICJkb2NvbW8iOwotCi0gICAgLy8gU3RyaWN0bHkgc3BlYWtpbmcsICJTaGlmdF9KSVMiIGlzIHRoZSBtb3N0IGFwcHJvcHJpYXRlLCBidXQgd2UgdXNlIHVwcGVyIHZlcnNpb24gaGVyZSwKLSAgICAvLyBzaW5jZSB1c3VhbCB2Q2FyZCBkZXZpY2VzIGZvciBKYXBhbmVzZSBkZXZpY2VzIGFscmVhZHkgdXNlIGl0LgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSElGVF9KSVMgPSAiU0hJRlRfSklTIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzggPSAiVVRGLTgiOwotCi0gICAgLyoqCi0gICAgICogU3BlY2lhbCBVUkkgZm9yIHRlc3RpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVEVTVF9BVVRIT1JJVFkgPSAiY29tLmFuZHJvaWQudW5pdF90ZXN0cy52Y2FyZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgVkNBUkRfVEVTVF9BVVRIT1JJVFlfVVJJID0KLSAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIFZDQVJEX1RFU1RfQVVUSE9SSVRZKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05UQUNUU19URVNUX0NPTlRFTlRfVVJJID0KLSAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoVkNBUkRfVEVTVF9BVVRIT1JJVFlfVVJJLCAiY29udGFjdHMiKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IHNJbU1hcDsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIHNJbU1hcCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9BSU0sIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfQUlNKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9NU04sIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfTVNOKTsKLSAgICAgICAgc0ltTWFwLnB1dChJbS5QUk9UT0NPTF9ZQUhPTywgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9ZQUhPTyk7Ci0gICAgICAgIHNJbU1hcC5wdXQoSW0uUFJPVE9DT0xfSUNRLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0lDUSk7Ci0gICAgICAgIHNJbU1hcC5wdXQoSW0uUFJPVE9DT0xfSkFCQkVSLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0pBQkJFUik7Ci0gICAgICAgIHNJbU1hcC5wdXQoSW0uUFJPVE9DT0xfU0tZUEUsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfU0tZUEVfVVNFUk5BTUUpOwotICAgICAgICAvLyBXZSBkb24ndCBhZGQgR29vZ2xlIHRhbGsgaGVyZSBzaW5jZSBpdCBoYXMgdG8gYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE9uZUVudHJ5SGFuZGxlciB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uSW5pdChDb250ZXh0IGNvbnRleHQpOwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkVudHJ5Q3JlYXRlZChTdHJpbmcgdmNhcmQpOwotICAgICAgICBwdWJsaWMgdm9pZCBvblRlcm1pbmF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEFuIHVzZWZ1bCBoYW5kbGVyIGZvciBlbWl0dGluZyB2Q2FyZCBTdHJpbmcgdG8gYW4gT3V0cHV0U3RyZWFtIG9iamVjdCBvbmUgYnkgb25lLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgaW5wdXQgT3V0cHV0U3RyZWFtIG9iamVjdCBpcyBjbG9zZWQoKSBvbiB7QGxpbmsgI29uVGVybWluYXRlKCl9LgotICAgICAqIE11c3Qgbm90IGNsb3NlIHRoZSBzdHJlYW0gb3V0c2lkZSB0aGlzIGNsYXNzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgY2xhc3MgSGFuZGxlckZvck91dHB1dFN0cmVhbSBpbXBsZW1lbnRzIE9uZUVudHJ5SGFuZGxlciB7Ci0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJoaWRpbmciKQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZENvbXBvc2VyLkhhbmRsZXJGb3JPdXRwdXRTdHJlYW0iOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtT25UZXJtaW5hdGVJc0NhbGxlZCA9IGZhbHNlOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgT3V0cHV0U3RyZWFtIG1PdXRwdXRTdHJlYW07IC8vIG1Xcml0ZXIgd2lsbCBjbG9zZSB0aGlzLgotICAgICAgICBwcml2YXRlIFdyaXRlciBtV3JpdGVyOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJbnB1dCBzdHJlYW0gd2lsbCBiZSBjbG9zZWQgb24gdGhlIGRldHJ1Y3Rpb24gb2YgdGhpcyBvYmplY3QuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSGFuZGxlckZvck91dHB1dFN0cmVhbShmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7Ci0gICAgICAgICAgICBtT3V0cHV0U3RyZWFtID0gb3V0cHV0U3RyZWFtOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Jbml0KGZpbmFsIENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtV3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0U3RyZWFtLCBtQ2hhcnNldCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbnN1cHBvcnRlZCBjaGFyc2V0OiAiICsgbUNoYXJzZXQpOwotICAgICAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9ICJFbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkICh1c3VhbGx5IHRoaXMgZG9lcyBub3QgaGFwcGVuISk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbUNoYXJzZXQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIG9uZSBlbXB0eSBlbnRyeS4KLSAgICAgICAgICAgICAgICAgICAgbVdyaXRlci53cml0ZShjcmVhdGVPbmVFbnRyeUludGVybmFsKCItMSIsIG51bGwpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChWQ2FyZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJWQ2FyZEV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd24gZHVyaW5nIG9uIEluaXQoKTogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgZXhwb3J0T25lQ29udGFjdERhdGE6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICBtRXJyb3JSZWFzb24gPSAiSU9FeGNlcHRpb24gb2NjdXJyZWQ6ICIgKyBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25FbnRyeUNyZWF0ZWQoU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1Xcml0ZXIud3JpdGUodmNhcmQpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiSU9FeGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIGV4cG9ydE9uZUNvbnRhY3REYXRhOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9ICJJT0V4Y2VwdGlvbiBvY2N1cnJlZDogIiArIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25UZXJtaW5hdGUoKSB7Ci0gICAgICAgICAgICBtT25UZXJtaW5hdGVJc0NhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAobVdyaXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRmx1c2ggYW5kIHN5bmMgdGhlIGRhdGEgc28gdGhhdCBhIHVzZXIgaXMgYWJsZSB0byBwdWxsCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBTRENhcmQganVzdCBhZnRlcgotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZXhwb3J0LgotICAgICAgICAgICAgICAgICAgICBtV3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0U3RyZWFtICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtT3V0cHV0U3RyZWFtIGluc3RhbmNlb2YgRmlsZU91dHB1dFN0cmVhbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRmlsZU91dHB1dFN0cmVhbSkgbU91dHB1dFN0cmVhbSkuZ2V0RkQoKS5zeW5jKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIklPRXhjZXB0aW9uIGR1cmluZyBjbG9zaW5nIHRoZSBvdXRwdXQgc3RyZWFtOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBjbG9zZU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlT3V0cHV0U3RyZWFtKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtV3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIklPRXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgY2xvc2UoKS4gSWdub3JpbmcuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZmluYWxpemUoKSB7Ci0gICAgICAgICAgICBpZiAoIW1PblRlcm1pbmF0ZUlzQ2FsbGVkKSB7Ci0gICAgICAgICAgICAgICAgb25UZXJtaW5hdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtVkNhcmRUeXBlOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtQ2FyZUhhbmRsZXJFcnJvcnM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNEb0NvTW87Ci0gICAgcHJpdmF0ZSBDdXJzb3IgbUN1cnNvcjsKLSAgICBwcml2YXRlIGludCBtSWRDb2x1bW47Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ2hhcnNldDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVRlcm1pbmF0ZUlzQ2FsbGVkOwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxPbmVFbnRyeUhhbmRsZXI+IG1IYW5kbGVyTGlzdDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1FcnJvclJlYXNvbiA9IE5PX0VSUk9SOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc0NvbnRhY3RzUHJvamVjdGlvbiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgIENvbnRhY3RzLl9JRCwKLSAgICB9OwotCi0gICAgcHVibGljIFZDYXJkQ29tcG9zZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgVkNhcmRDb25maWcuVkNBUkRfVFlQRV9ERUZBVUxULCBudWxsLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdmFyaWFudCB3aGljaCBzZXRzIGNoYXJzZXQgdG8gbnVsbCBhbmQgc2V0cyBjYXJlSGFuZGxlckVycm9ycyB0byB0cnVlLgotICAgICAqLwotICAgIHB1YmxpYyBWQ2FyZENvbXBvc2VyKENvbnRleHQgY29udGV4dCwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICB0aGlzKGNvbnRleHQsIHZjYXJkVHlwZSwgbnVsbCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQ29tcG9zZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgdmNhcmRUeXBlLCBTdHJpbmcgY2hhcnNldCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIHZjYXJkVHlwZSwgY2hhcnNldCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHZhcmlhbnQgd2hpY2ggc2V0cyBjaGFyc2V0IHRvIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIFZDYXJkQ29tcG9zZXIoZmluYWwgQ29udGV4dCBjb250ZXh0LCBmaW5hbCBpbnQgdmNhcmRUeXBlLAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBjYXJlSGFuZGxlckVycm9ycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIHZjYXJkVHlwZSwgbnVsbCwgY2FyZUhhbmRsZXJFcnJvcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBmb3Igc3VwcG9ydGluZyBjYWxsIGxvZyBlbnRyeSB2Q2FyZCBjb21wb3NpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRvIGJlIHVzZWQgZHVyaW5nIHRoZSBjb21wb3NpdGlvbi4KLSAgICAgKiBAcGFyYW0gdmNhcmRUeXBlIFRoZSB0eXBlIG9mIHZDYXJkLCB0eXBpY2FsbHkgYXZhaWxhYmxlIHZpYSB7QGxpbmsgVkNhcmRDb25maWd9LgotICAgICAqIEBwYXJhbSBjaGFyc2V0IFRoZSBjaGFyc2V0IHRvIGJlIHVzZWQuIFVzZSBudWxsIHdoZW4geW91IGRvbid0IG5lZWQgdGhlIGNoYXJzZXQuCi0gICAgICogQHBhcmFtIGNhcmVIYW5kbGVyRXJyb3JzIElmIHRydWUsIFRoaXMgb2JqZWN0IHJldHVybnMgZmFsc2UgZXZlcnl0aW1lCi0gICAgICogYSBIYW5kbGVyIG9iamVjdCBnaXZlbiB2aWEge3tAbGluayAjYWRkSGFuZGxlcihPbmVFbnRyeUhhbmRsZXIpfSByZXR1cm5zIGZhbHNlLgotICAgICAqIElmIGZhbHNlLCB0aGlzIGlnbm9yZXMgdGhvc2UgZXJyb3JzLgotICAgICAqLwotICAgIHB1YmxpYyBWQ2FyZENvbXBvc2VyKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgaW50IHZjYXJkVHlwZSwgU3RyaW5nIGNoYXJzZXQsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGNhcmVIYW5kbGVyRXJyb3JzKSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbVZDYXJkVHlwZSA9IHZjYXJkVHlwZTsKLSAgICAgICAgbUNhcmVIYW5kbGVyRXJyb3JzID0gY2FyZUhhbmRsZXJFcnJvcnM7Ci0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotCi0gICAgICAgIG1Jc0RvQ29NbyA9IFZDYXJkQ29uZmlnLmlzRG9Db01vKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1IYW5kbGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8T25lRW50cnlIYW5kbGVyPigpOwotCi0gICAgICAgIGNoYXJzZXQgPSAoVGV4dFV0aWxzLmlzRW1wdHkoY2hhcnNldCkgPyBWQ2FyZENvbmZpZy5ERUZBVUxUX0VYUE9SVF9DSEFSU0VUIDogY2hhcnNldCk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtID0gISgKLSAgICAgICAgICAgICAgICBWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMCh2Y2FyZFR5cGUpICYmIFVURl84LmVxdWFsc0lnbm9yZUNhc2UoY2hhcnNldCkpOwotCi0gICAgICAgIGlmIChtSXNEb0NvTW8gfHwgc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKSB7Ci0gICAgICAgICAgICBpZiAoU0hJRlRfSklTLmVxdWFsc0lnbm9yZUNhc2UoY2hhcnNldCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldFV0aWxzLmNoYXJzZXRGb3JWZW5kb3IoU0hJRlRfSklTLCAiZG9jb21vIikubmFtZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvQ29Nby1zcGVjaWZpYyBTSElGVF9KSVMgd2FzIG5vdCBmb3VuZC4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJVc2UgU0hJRlRfSklTIGFzIGlzLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IFNISUZUX0pJUzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldFV0aWxzLmNoYXJzZXRGb3JWZW5kb3IoU0hJRlRfSklTKS5uYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FyZWVyLXNwZWNpZmljIFNISUZUX0pJUyB3YXMgbm90IGZvdW5kLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlVzZSBTSElGVF9KSVMgYXMgaXMuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gU0hJRlRfSklTOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DaGFyc2V0ID0gY2hhcnNldDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgY2hhcnNldCBcIiIgKyBjaGFyc2V0ICsgIlwiIGlzIHVzZWQgd2hpbGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBTSElGVF9KSVMgKyAiIGlzIG5lZWRlZCB0byBiZSB1c2VkLiIpOwotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShjaGFyc2V0KSkgewotICAgICAgICAgICAgICAgICAgICBtQ2hhcnNldCA9IFNISUZUX0pJUzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXRVdGlscy5jaGFyc2V0Rm9yVmVuZG9yKGNoYXJzZXQpLm5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXJlZXItc3BlY2lmaWMgXCIiICsgY2hhcnNldCArICJcIiB3YXMgbm90IGZvdW5kIChhcyB1c3VhbCkuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVXNlIGl0IGFzIGlzLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DaGFyc2V0ID0gY2hhcnNldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoY2hhcnNldCkpIHsKLSAgICAgICAgICAgICAgICBtQ2hhcnNldCA9IFVURl84OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldFV0aWxzLmNoYXJzZXRGb3JWZW5kb3IoY2hhcnNldCkubmFtZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5pKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhcmVlci1zcGVjaWZpYyBcIiIgKyBjaGFyc2V0ICsgIlwiIHdhcyBub3QgZm91bmQgKGFzIHVzdWFsKS4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlVzZSBpdCBhcyBpcy4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNoYXJzZXQgPSBjaGFyc2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlVzZSB0aGUgY2hhcnNldCBcIiIgKyBtQ2hhcnNldCArICJcIiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB7QGxpbmsgI2luaXQoKX0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSGFuZGxlcihPbmVFbnRyeUhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSGFuZGxlckxpc3QuYWRkKGhhbmRsZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBzdWNjZXNzZnVsIGFuZCBhbGwgdGhlIG90aGVyCi0gICAgICogICAgICAgICAgbWV0aG9kcyBhcmUgYXZhaWxhYmxlLiBSZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpbml0KCkgewotICAgICAgICByZXR1cm4gaW5pdChudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpbml0KGZpbmFsIFN0cmluZyBzZWxlY3Rpb24sIGZpbmFsIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIGluaXQoQ29udGFjdHMuQ09OVEVOVF9VUkksIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90ZSB0aGF0IHRoaXMgaXMgdW5zdGFibGUgaW50ZXJmYWNlLCBtYXkgYmUgZGVsZXRlZCBpbiB0aGUgZnV0dXJlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGluaXQoZmluYWwgVXJpIGNvbnRlbnRVcmksIGZpbmFsIFN0cmluZyBzZWxlY3Rpb24sCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBmaW5hbCBTdHJpbmcgc29ydE9yZGVyKSB7Ci0gICAgICAgIGlmIChjb250ZW50VXJpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQ2FyZUhhbmRsZXJFcnJvcnMpIHsKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8T25lRW50cnlIYW5kbGVyPiBmaW5pc2hlZExpc3QgPSBuZXcgQXJyYXlMaXN0PE9uZUVudHJ5SGFuZGxlcj4oCi0gICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyTGlzdC5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChPbmVFbnRyeUhhbmRsZXIgaGFuZGxlciA6IG1IYW5kbGVyTGlzdCkgewotICAgICAgICAgICAgICAgIGlmICghaGFuZGxlci5vbkluaXQobUNvbnRleHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoT25lRW50cnlIYW5kbGVyIGZpbmlzaGVkIDogZmluaXNoZWRMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZC5vblRlcm1pbmF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBKdXN0IGlnbm9yZSB0aGUgZmFsc2UgcmV0dXJuZWQgZnJvbSBvbkluaXQoKS4KLSAgICAgICAgICAgIGZvciAoT25lRW50cnlIYW5kbGVyIGhhbmRsZXIgOiBtSGFuZGxlckxpc3QpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVyLm9uSW5pdChtQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmdbXSBwcm9qZWN0aW9uOwotICAgICAgICBpZiAoQ29udGFjdHMuQ09OVEVOVF9VUkkuZXF1YWxzKGNvbnRlbnRVcmkpIHx8Ci0gICAgICAgICAgICAgICAgQ09OVEFDVFNfVEVTVF9DT05URU5UX1VSSS5lcXVhbHMoY29udGVudFVyaSkpIHsKLSAgICAgICAgICAgIHByb2plY3Rpb24gPSBzQ29udGFjdHNQcm9qZWN0aW9uOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUVycm9yUmVhc29uID0gRkFJTFVSRV9SRUFTT05fVU5TVVBQT1JURURfVVJJOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJzb3IgPSBtQ29udGVudFJlc29sdmVyLnF1ZXJ5KAotICAgICAgICAgICAgICAgIGNvbnRlbnRVcmksIHByb2plY3Rpb24sIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgc29ydE9yZGVyKTsKLQotICAgICAgICBpZiAobUN1cnNvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtRXJyb3JSZWFzb24gPSBGQUlMVVJFX1JFQVNPTl9GQUlMRURfVE9fR0VUX0RBVEFCQVNFX0lORk87Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0Q291bnQoKSA9PSAwIHx8ICFtQ3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUN1cnNvci5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU1FMaXRlRXhjZXB0aW9uIG9uIEN1cnNvciNjbG9zZSgpOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBtQ3Vyc29yID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtRXJyb3JSZWFzb24gPSBGQUlMVVJFX1JFQVNPTl9OT19FTlRSWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1JZENvbHVtbiA9IG1DdXJzb3IuZ2V0Q29sdW1uSW5kZXgoQ29udGFjdHMuX0lEKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjcmVhdGVPbmVFbnRyeSgpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZU9uZUVudHJ5KG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBnZXRFbnRpdHlJdGVyYXRvck1ldGhvZCBGb3IgRGVwZW5kZW5jeSBJbmplY3Rpb24uCi0gICAgICogQGhpZGUganVzdCBmb3IgdGVzdGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjcmVhdGVPbmVFbnRyeShNZXRob2QgZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QpIHsKLSAgICAgICAgaWYgKG1DdXJzb3IgPT0gbnVsbCB8fCBtQ3Vyc29yLmlzQWZ0ZXJMYXN0KCkpIHsKLSAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9IEZBSUxVUkVfUkVBU09OX05PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmcgdmNhcmQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobUlkQ29sdW1uID49IDApIHsKLSAgICAgICAgICAgICAgICB2Y2FyZCA9IGNyZWF0ZU9uZUVudHJ5SW50ZXJuYWwobUN1cnNvci5nZXRTdHJpbmcobUlkQ29sdW1uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVudGl0eUl0ZXJhdG9yTWV0aG9kKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkluY29ycmVjdCBtSWRDb2x1bW46ICIgKyBtSWRDb2x1bW4pOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChWQ2FyZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVkNhcmRFeGNlcHRpb24gaGFzIGJlZW4gdGhyb3duOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGVycm9yKSB7Ci0gICAgICAgICAgICAvLyBNYXliZSBzb21lIGRhdGEgKGUuZy4gcGhvdG8pIGlzIHRvbyBiaWcgdG8gaGF2ZSBpbiBtZW1vcnkuIEJ1dCBpdAotICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHJhcmUuCi0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiT3V0T2ZNZW1vcnlFcnJvciBvY2N1cmVkLiBJZ25vcmUgdGhlIGVudHJ5LiIpOwotICAgICAgICAgICAgU3lzdGVtLmdjKCk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgdGVsbCB1c2VycyB3aGF0IGhhcHBlbmVkPwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtQ3Vyc29yLm1vdmVUb05leHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY2FyZSB0aGUgT3V0T2ZNZW1vcnlFcnJvciBvbiB0aGUgaGFuZGxlciBzaWRlIDotUAotICAgICAgICBpZiAobUNhcmVIYW5kbGVyRXJyb3JzKSB7Ci0gICAgICAgICAgICBMaXN0PE9uZUVudHJ5SGFuZGxlcj4gZmluaXNoZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxPbmVFbnRyeUhhbmRsZXI+KAotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlckxpc3Quc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoT25lRW50cnlIYW5kbGVyIGhhbmRsZXIgOiBtSGFuZGxlckxpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXIub25FbnRyeUNyZWF0ZWQodmNhcmQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKE9uZUVudHJ5SGFuZGxlciBoYW5kbGVyIDogbUhhbmRsZXJMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlci5vbkVudHJ5Q3JlYXRlZCh2Y2FyZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVPbmVFbnRyeUludGVybmFsKGZpbmFsIFN0cmluZyBjb250YWN0SWQsCi0gICAgICAgICAgICBmaW5hbCBNZXRob2QgZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8Q29udGVudFZhbHVlcz4+IGNvbnRlbnRWYWx1ZXNMaXN0TWFwID0KLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8Q29udGVudFZhbHVlcz4+KCk7Ci0gICAgICAgIC8vIFRoZSByZXNvbHZlciBtYXkgcmV0dXJuIHRoZSBlbnRpdHkgaXRlcmF0b3Igd2l0aCBubyBkYXRhLiBJdCBpcyBwb3NzaWJsZS4KLSAgICAgICAgLy8gZS5nLiBJZiBhbGwgdGhlIGRhdGEgaW4gdGhlIGNvbnRhY3Qgb2YgdGhlIGdpdmVuIGNvbnRhY3QgaWQgYXJlIG5vdCBleHBvcnRhYmxlIG9uZXMsCi0gICAgICAgIC8vICAgICAgdGhleSBhcmUgaGlkZGVuIGZyb20gdGhlIHZpZXcgb2YgdGhpcyBtZXRob2QsIHRob3VnaCBjb250YWN0IGlkIGl0c2VsZiBleGlzdHMuCi0gICAgICAgIEVudGl0eUl0ZXJhdG9yIGVudGl0eUl0ZXJhdG9yID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIFVyaSB1cmkgPSBSYXdDb250YWN0c0VudGl0eS5DT05URU5UX1VSSS5idWlsZFVwb24oKQotICAgICAgICAgICAgICAgICAgICAvLyAuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoImZvcl9leHBvcnRfb25seSIsICIxIikKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyKERhdGEuRk9SX0VYUE9SVF9PTkxZLCAiMSIpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNlbGVjdGlvbiA9IERhdGEuQ09OVEFDVF9JRCArICI9PyI7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzID0gbmV3IFN0cmluZ1tdIHtjb250YWN0SWR9OwotICAgICAgICAgICAgaWYgKGdldEVudGl0eUl0ZXJhdG9yTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgYnJhbmNoIGlzIGV4ZWN1dGVkIGJ5IHVuaXQgdGVzdHMgb25seQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGVudGl0eUl0ZXJhdG9yID0gKEVudGl0eUl0ZXJhdG9yKWdldEVudGl0eUl0ZXJhdG9yTWV0aG9kLmludm9rZShudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIsIHVyaSwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGhhcyBiZWVuIHRocm93bjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd246ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaGFzIGJlZW4gdGhyb3duOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgU3RhY2tUcmFjZUVsZW1lbnRbXSBzdGFja1RyYWNlRWxlbWVudHMgPSBlLmdldENhdXNlKCkuZ2V0U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0YWNrVHJhY2VFbGVtZW50IGVsZW1lbnQgOiBzdGFja1RyYWNlRWxlbWVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICIgICAgYXQgIiArIGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGhhcyBiZWVuIHRocm93bjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRDYXVzZSgpLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbnRpdHlJdGVyYXRvciA9IFJhd0NvbnRhY3RzLm5ld0VudGl0eUl0ZXJhdG9yKG1Db250ZW50UmVzb2x2ZXIucXVlcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICB1cmksIG51bGwsIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgbnVsbCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZW50aXR5SXRlcmF0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJFbnRpdHlJdGVyYXRvciBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWVudGl0eUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJEYXRhIGRvZXMgbm90IGV4aXN0LiBjb250YWN0SWQ6ICIgKyBjb250YWN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd2hpbGUgKGVudGl0eUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEVudGl0eSBlbnRpdHkgPSBlbnRpdHlJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChOYW1lZENvbnRlbnRWYWx1ZXMgbmFtZWRDb250ZW50VmFsdWVzIDogZW50aXR5LmdldFN1YlZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9IG5hbWVkQ29udGVudFZhbHVlcy52YWx1ZXM7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKERhdGEuTUlNRVRZUEUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlc0xpc3QgPSBuZXcgQXJyYXlMaXN0PENvbnRlbnRWYWx1ZXM+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlc0xpc3RNYXAucHV0KGtleSwgY29udGVudFZhbHVlc0xpc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlc0xpc3QuYWRkKGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGVudGl0eUl0ZXJhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlbnRpdHlJdGVyYXRvci5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkVkNhcmQoY29udGVudFZhbHVlc0xpc3RNYXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkcyBhbmQgcmV0dXJucyB2Q2FyZCB1c2luZyBnaXZlbiBtYXAsIHdob3NlIGtleSBpcyBDT05URU5UX0lURU1fVFlQRSBkZWZpbmVkIGluCi0gICAgICoge0NvbnRhY3RzQ29udHJhY3R9LiBEZXZlbG9wZXJzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgdGhlIG91dHB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGJ1aWxkVkNhcmQoZmluYWwgTWFwPFN0cmluZywgTGlzdDxDb250ZW50VmFsdWVzPj4gY29udGVudFZhbHVlc0xpc3RNYXApIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0TWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJUaGUgZ2l2ZW4gbWFwIGlzIG51bGwuIElnbm9yZSBhbmQgcmV0dXJuIGVtcHR5IFN0cmluZyIpOwotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmluYWwgVkNhcmRCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVkNhcmRCdWlsZGVyKG1WQ2FyZFR5cGUsIG1DaGFyc2V0KTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kTmFtZVByb3BlcnRpZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZE5pY2tOYW1lcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kUGhvbmVzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmRFbWFpbHMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFBvc3RhbHMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kT3JnYW5pemF0aW9ucyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFdlYnNpdGVzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFKSk7Ci0gICAgICAgICAgICBpZiAoKG1WQ2FyZFR5cGUgJiBWQ2FyZENvbmZpZy5GTEFHX1JFRlJBSU5fSU1BR0VfRVhQT1JUKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmRQaG90b3MoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFBob3RvLkNPTlRFTlRfSVRFTV9UWVBFKSk7ICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZE5vdGVzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZEV2ZW50cyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kSW1zKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChJbS5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmRSZWxhdGlvbihjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoUmVsYXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpKTsKLSAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXJtaW5hdGUoKSB7Ci0gICAgICAgIGZvciAoT25lRW50cnlIYW5kbGVyIGhhbmRsZXIgOiBtSGFuZGxlckxpc3QpIHsKLSAgICAgICAgICAgIGhhbmRsZXIub25UZXJtaW5hdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQ3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUN1cnNvci5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU1FMaXRlRXhjZXB0aW9uIG9uIEN1cnNvciNjbG9zZSgpOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUN1cnNvciA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBtVGVybWluYXRlSXNDYWxsZWQgPSB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGZpbmFsaXplKCkgewotICAgICAgICBpZiAoIW1UZXJtaW5hdGVJc0NhbGxlZCkgewotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgInRlcm1pbmF0ZSgpIGlzIG5vdCBjYWxsZWQgeWV0LiBXZSBjYWxsIGl0IGluIGZpbmFsaXplKCkgc3RlcC4iKTsKLSAgICAgICAgICAgIHRlcm1pbmF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGVudGl0aWVzLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHVuZGVmaW5lZAotICAgICAqIHdoZW4gdGhpcyBvYmplY3QgaXMgbm90IHJlYWR5IHlldCAodHlwaWNhbGx5IHdoZW4ge3tAbGluayAjaW5pdCgpfSBpcyBub3QgY2FsbGVkCi0gICAgICogb3Igd2hlbiB7QGxpbmsgI3Rlcm1pbmF0ZSgpfSBpcyBhbHJlYWR5IGNhbGxlZCkuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgaWYgKG1DdXJzb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlRoaXMgb2JqZWN0IGlzIG5vdCByZWFkeSB5ZXQuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRDb3VudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZXJlJ3Mgbm8gZW50aXR5IHRvIGJlIGJ1aWx0LiBUaGUgcmV0dXJuIHZhbHVlIGlzIHVuZGVmaW5lZAotICAgICAqIHdoZW4gdGhpcyBvYmplY3QgaXMgbm90IHJlYWR5IHlldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FmdGVyTGFzdCgpIHsKLSAgICAgICAgaWYgKG1DdXJzb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlRoaXMgb2JqZWN0IGlzIG5vdCByZWFkeSB5ZXQuIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuaXNBZnRlckxhc3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGVycm9yIHJlYXNvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yUmVhc29uKCkgewotICAgICAgICByZXR1cm4gbUVycm9yUmVhc29uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbmZpZy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNzU5ZTMuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFRoZSBjbGFzcyByZXByZXNlbnRpbmcgVkNhcmQgcmVsYXRlZCBjb25maWd1cmF0aW9ucy4gVXNlZnVsIHN0YXRpYyBtZXRob2RzIGFyZSBub3QgaW4gdGhpcyBjbGFzcwotICogYnV0IGluIFZDYXJkVXRpbHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZENvbmZpZyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRDb25maWciOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IExPR19MRVZFTF9OT05FID0gMDsKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0xFVkVMX1BFUkZPUk1BTkNFX01FQVNVUkVNRU5UID0gMHgxOwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBMT0dfTEVWRUxfU0hPV19XQVJOSU5HID0gMHgyOwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBMT0dfTEVWRUxfVkVSQk9TRSA9Ci0gICAgICAgIExPR19MRVZFTF9QRVJGT1JNQU5DRV9NRUFTVVJFTUVOVCB8IExPR19MRVZFTF9TSE9XX1dBUk5JTkc7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0xFVkVMID0gTE9HX0xFVkVMX05PTkU7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY2hhcnNldCB1c2VkIGR1cmluZyBpbXBvcnQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFdlIGNhbm5vdCBkZXRlcm1pbmUgd2hpY2ggY2hhcnNldCBzaG91bGQgYmUgdXNlZCB0byBpbnRlcnByZXQgbGluZXMgaW4gdkNhcmQsCi0gICAgICogd2hpbGUgSmF2YSByZXF1aXJlcyB1cyB0byBzcGVjaWZ5IGl0IHdoZW4gSW5wdXRTdHJlYW0gaXMgdXNlZC4KLSAgICAgKiBXZSBuZWVkIHRvIHJlbHkgb24gdGhlIG1lY2hhbmlzbSBkdWUgdG8gc29tZSBwZXJmb3JtYW5jZSByZWFzb24uCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIEluIG9yZGVyIHRvIGF2b2lkICJtaXNpbnRlcnByZXRhdGlvbiIgb2YgY2hhcnNldCBhbmQgbG9zZSBhbnkgZGF0YSBpbiB2Q2FyZCwKLSAgICAgKiAiSVNPLTg4NTktMSIgaXMgZmlyc3QgdXNlZCBmb3IgcmVhZGluZyB0aGUgc3RyZWFtLgotICAgICAqIFdoZW4gYSBjaGFyc2V0IGlzIHNwZWNpZmllZCBpbiBhIHByb3BlcnR5ICh3aXRoICJDSEFSU0VUPS4uLiIgcGFyYW1ldGVyKSwKLSAgICAgKiB0aGUgc3RyaW5nIGlzIGRlY29kZWQgdG8gcmF3IGJ5dGVzIGFuZCBlbmNvZGVkIGludG8gdGhlIHNwZWNpZmljIGNoYXJzZXQsCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFVuaWNvZGUgc3BlY2lmaWNhdGlvbiB0aGVyZSdzIGEgb25lIHRvIG9uZSBtYXBwaW5nIGJldHdlZW4gZWFjaCBieXRlIGluIElTTy04ODU5LTEKLSAgICAgKiBhbmQgYSBjb2RlcG9pbnQsIGFuZCBKYXZhIHNwZWNpZmljYXRpb24gcmVxdWlyZXMgcnVudGltZSBtdXN0IGhhdmUgdGhlIGNoYXJzZXQuCi0gICAgICogVGh1cywgSVNPLTg4NTktMSBpcyBvbmUgZWZmZWN0aXZlIG1hcHBpbmcgZm9yIGludGVybWVkaWF0ZSBtYXBwaW5nLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lOVEVSTUVESUFURV9DSEFSU0VUID0gIklTTy04ODU5LTEiOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNoYXJzZXQgdXNlZCB3aGVuIHRoZXJlJ3Mgbm8gaW5mb3JtYXRpb24gYWZmYm91dCB3aGF0IGNoYXJzZXQgc2hvdWxkIGJlIHVzZWQgdG8KLSAgICAgKiBlbmNvZGUgdGhlIGJpbmFyeSBnaXZlbiBmcm9tIHZDYXJkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfSU1QT1JUX0NIQVJTRVQgPSAiVVRGLTgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVhQT1JUX0NIQVJTRVQgPSAiVVRGLTgiOwotCi0gICAgLyoqCi0gICAgICogRG8gbm90IHVzZSBzdGF0aWNhbGx5IGxpa2UgInZlcnNpb24gPT0gVkVSU0lPTl9WMjEiCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8yMSA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8zMCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl80MCA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl9NQVNLID0gMzsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUVfT1JERVJfREVGQVVMVCA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9PUkRFUl9FVVJPUEUgPSAweDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9PUkRFUl9KQVBBTkVTRSA9IDB4ODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9PUkRFUl9NQVNLID0gMHhDOwotCi0gICAgLy8gMHgxMCBpcyByZXNlcnZlZCBmb3Igc2FmZXR5Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZmxhZyBpbmRpY2F0aW5nIHRoZSB2Q2FyZCBjb21wb3NlciB3aWxsIGFkZCBzb21lICJYLSIgcHJvcGVydGllcyB1c2VkIG9ubHkgaW4gQW5kcm9pZAotICAgICAqIHdoZW4gdGhlIGZvcm1hbCB2Q2FyZCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGhhdmUgYXBwcm9wcmlhdGUgZmllbGRzIGZvciB0aGF0IGRhdGEuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIEZvciBleGFtcGxlLCBBbmRyb2lkIGFjY2VwdHMgbmlja25hbWUgaW5mb3JtYXRpb24gd2hpbGUgdkNhcmQgMi4xIGRvZXMgbm90LgotICAgICAqIFdoZW4gdGhpcyBmbGFnIGlzIG9uLCB2Q2FyZCBjb21wb3NlciBlbWl0cyBhbHRlcm5hdGl2ZSAiWC0iIHByb3BlcnR5IChsaWtlICJYLU5JQ0tOQU1FIikKLSAgICAgKiBpbnN0ZWFkIG9mIGp1c3QgZHJvcHBpbmcgaXQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIHZDYXJkIHBhcnNlciBjb2RlIGF1dG9tYXRpY2FsbHkgcGFyc2VzIHRoZSBmaWVsZCBlbWl0dGVkIGV2ZW4gd2hlbiB0aGlzIGZsYWcgaXMgb2ZmLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSA9IDB4ODAwMDAwMDA7Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgdkNhcmQgY29tcG9zZXIgd2lsbCBhZGQgc29tZSAiWC0iIHByb3BlcnRpZXMgc2VlbiBpbiB0aGUKLSAgICAgKiB2Q2FyZCBkYXRhIGVtaXR0ZWQgYnkgdGhlIG90aGVyIHNvZnR3YXJlcy9kZXZpY2VzIHdoZW4gdGhlIGZvcm1hbCB2Q2FyZCBzcGVjaWZpY2F0aW9uCi0gICAgICogZG9lcyBub3QgaGF2ZSBhcHByb3ByaWF0ZSBmaWVsZChzKSBmb3IgdGhhdCBkYXRhLgotICAgICAqIDwvcD4gCi0gICAgICogPHA+Ci0gICAgICogT25lIGV4YW1wbGUgaXMgWC1QSE9ORVRJQy1GSVJTVC1OQU1FL1gtUEhPTkVUSUMtTUlERExFLU5BTUUvWC1QSE9ORVRJQy1MQVNULU5BTUUsIHdoaWNoIGFyZQotICAgICAqIGZvciBwaG9uZXRpYyBuYW1lIChob3cgdGhlIG5hbWUgaXMgcHJvbm91bmNlZCksIHNlZW4gaW4gdGhlIHZDYXJkIGVtaXR0ZWQgYnkgc29tZSBvdGhlcgotICAgICAqIG5vbi1BbmRyb2lkIGRldmljZXMvc29mdHdhcmVzLiBXZSBjaG9zZSB0byBlbmFibGUgdGhlIHZDYXJkIGNvbXBvc2VyIHRvIHVzZSB0aG9zZQotICAgICAqIGRlZmFjdCBwcm9wZXJ0aWVzIHNpbmNlIHRoZXkgYXJlIGFsc28gdXNlZnVsIGZvciBBbmRyb2lkIGRldmljZXMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgZm9yIGRldmVsb3BlcnM6IG9ubHkgIlgtIiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBhZGRlZCB3aXRoIHRoaXMgZmxhZy4gdkNhcmQgMi4xLzMuMAotICAgICAqIGFsbG93cyBhbnkga2luZCBvZiAiWC0iIHByb3BlcnRpZXMgYnV0IGRvZXMgbm90IGFsbG93IG5vbi0iWC0iIHByb3BlcnRpZXMgKGV4Y2VwdCBJQU5BIHRva2VucwotICAgICAqIGluIHZDYXJkIDMuMCkuIFNvbWUgZXh0ZXJuYWwgcGFyc2VycyBtYXkgZ2V0IGNvbmZ1c2VkIHdpdGggbm9uLXZhbGlkLCBub24tIlgtIiBwcm9wZXJ0aWVzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZID0gMHg0MDAwMDAwMDsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgc29tZSBzcGVjaWZpYyBkaWFsZWN0IHNlZW4gaW4gdkNhcmQgb2YgRG9Db01vIChvbmUgb2YgSmFwYW5lc2UKLSAgICAgKiBtb2JpbGUgY2FyZWVycykgc2hvdWxkIGJlIHVzZWQuIFRoaXMgZmxhZyBkb2VzIG5vdCBpbmNsdWRlIGFueSBvdGhlciBpbmZvcm1hdGlvbiBsaWtlCi0gICAgICogdGhhdCAidGhlIHZDYXJkIGlzIGZvciBKYXBhbmVzZSIuIFNvIGl0IGlzICJwb3NzaWJsZSIgdGhhdCAidGhlIHZDYXJkIHNob3VsZCBoYXZlIERvQ29NbydzCi0gICAgICogZGlhbGVjdCBidXQgdGhlIG5hbWUgb3JkZXIgc2hvdWxkIGJlIEV1cm9wZWFuIiwgYnV0IGl0IGlzIG5vdCByZWNvbW1lbmRlZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfRE9DT01PID0gMHgyMDAwMDAwMDsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgdGhlIHZDYXJkIGNvbXBvc2VyIGRvZXMgIk5PVCIgdXNlIFF1b3RlZC1QcmludGFibGUgdG93YXJkICJwcmltYXJ5IgotICAgICAqIHByb3BlcnRpZXMgZXZlbiB0aG91Z2ggaXQgaXMgcmVxdWlyZWQgYnkgdkNhcmQgMi4xIChRUCBpcyBwcm9oaWJpdGVkIGluIHZDYXJkIDMuMCkuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFdlIGFjdHVhbGx5IGNhbm5vdCBkZWZpbmUgd2hhdCBpcyB0aGUgInByaW1hcnkiIHByb3BlcnR5LiBOb3RlIHRoYXQgdGhpcyBpcyBOT1QgZGVmaW5lZAotICAgICAqIGluIHZDYXJkIHNwZWNpZmljYXRpb24gZWl0aGVyLiBBbHNvIGJlIGF3YXJlIHRoYXQgaXQgaXMgTk9UIHJlbGF0ZWQgdG8gInByaW1hcnkiIG5vdGlvbgotICAgICAqIHVzZWQgaW4ge0BsaW5rIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdH0uCi0gICAgICogVGhpcyBub3Rpb24gaXMganVzdCBmb3IgdkNhcmQgY29tcG9zaXRpb24gaW4gQW5kcm9pZC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogV2UgYWRkZWQgdGhpcyBBbmRyb2lkLXNwZWNpZmljIG5vdGlvbiBzaW5jZSBzb21lIChpbmNvbXBsZXRlKSB2Q2FyZCBleHBvcnRlcnMgZm9yIHZDYXJkIDIuMQotICAgICAqIGRvIE5PVCB1c2UgUXVvdGVkLVByaW50YWJsZSBlbmNvZGluZyB0b3dhcmQgc29tZSBwcm9wZXJ0aWVzIHJlbGF0ZWQgbmFtZXMgbGlrZSAiTiIsICJGTiIsIGV0Yy4KLSAgICAgKiBldmVuIHdoZW4gdGhlaXIgdmFsdWVzIGNvbnRhaW4gbm9uLWFzY2lpIG9yL2FuZCBDUi9MRiwgd2hpbGUgdGhleSB1c2UgdGhlIGVuY29kaW5nIGluIHRoZQotICAgICAqIG90aGVyIHByb3BlcnRpZXMgbGlrZSAiQURSIiwgIk9SRyIsIGV0Yy4KLSAgICAgKiA8cD4KLSAgICAgKiBXZSBhcmUgYWZyYWlkIG9mIHRoZSBjYXNlIHdoZXJlIHNvbWUgdkNhcmQgaW1wb3J0ZXIgYWxzbyBmb3JnZXQgaGFuZGxpbmcgUVAgcHJlc3VtaW5nIFFQIGlzCi0gICAgICogbm90IHVzZWQgaW4gc3VjaCBmaWVsZHMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgZmxhZyBpcyB1c2VmdWwgd2hlbiBzb21lIHRhcmdldCBpbXBvcnRlciB5b3UgYXJlIGdvaW5nIHRvIGZvY3VzIG9uIGRvZXMgbm90IGFjY2VwdAotICAgICAqIHN1Y2ggcHJvcGVydGllcyB3aXRoIFF1b3RlZC1QcmludGFibGUgZW5jb2RpbmcuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIEFnYWluLCB3ZSBzaG91bGQgbm90IHVzZSB0aGlzIGZsYWcgYXQgYWxsIGZvciBjb21wbHlpbmcgdkNhcmQgMi4xIHNwZWMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIEluIHZDYXJkIDMuMCwgUXVvdGVkLVByaW50YWJsZSBpcyBleHBsaWNpdGx5ICJwcm9oaWJpdHRlZCIsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2FyZSB0aGlzCi0gICAgICoga2luZCBvZiBwcm9ibGVtIChob3BlZnVsbHkpLgotICAgICAqIDwvcD4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUkVGUkFJTl9RUF9UT19OQU1FX1BST1BFUlRJRVMgPSAweDEwMDAwMDAwOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyB0aGF0IHBob25ldGljIG5hbWUgcmVsYXRlZCBmaWVsZHMgbXVzdCBiZSBjb252ZXJ0ZWQgdG8KLSAgICAgKiBhcHByb3ByaWF0ZSBmb3JtLiBOb3RlIHRoYXQgImFwcHJvcHJpYXRlIiBpcyBub3QgZGVmaW5lZCBpbiBhbnkgdkNhcmQgc3BlY2lmaWNhdGlvbi4KLSAgICAgKiBUaGlzIGlzIEFuZHJvaWQtc3BlY2lmaWMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE9uZSB0eXBpY2FsIChhbmQgY3VycmVudGx5IHNvbGUpIGV4YW1wbGUgd2hlcmUgd2UgbmVlZCB0aGlzIGZsYWcgaXMgdGhlIHRpbWUgd2hlbgotICAgICAqIHdlIG5lZWQgdG8gZW1pdCBKYXBhbmVzZSBwaG9uZXRpYyBuYW1lcyBpbnRvIHZDYXJkIGVudHJpZXMuIFRoZSBwcm9wZXJ0eSB2YWx1ZXMKLSAgICAgKiBzaG91bGQgYmUgZW5jb2RlZCBpbnRvIGhhbGYtd2lkdGgga2F0YWthbmEgd2hlbiB0aGUgdGFyZ2V0IGltcG9ydGVyIGlzIEphcGFuZXNlIG1vYmlsZQotICAgICAqIHBob25lcycsIHdoaWNoIGFyZSBwcm9iYWJseSBub3QgYWJsZSB0byBwYXJzZSBmdWxsLXdpZHRoIGhpcmFnYW5hL2thdGFrYW5hIGZvcgotICAgICAqIGhpc3RvcmljYWwgcmVhc29ucywgd2hpbGUgdGhlIHZDYXJkIGltcG9ydGVycyBlbWJlZGRlZCB0byBzb2Z0d2FyZXMgZm9yIFBDIHNob3VsZCBiZQotICAgICAqIGFibGUgdG8gcGFyc2UgdGhlbSBhcyB3ZSBleHBlY3QuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQ09OVkVSVF9QSE9ORVRJQ19OQU1FX1NUUklOR1MgPSAweDA4MDAwMDAwOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgdkNhcmQgY29tcG9zZXIgImZvciAyLjEiIGVtaXRzICJUWVBFPSIgc3RyaW5nIHRvd2FyZCBUWVBFIHBhcmFtcwotICAgICAqIGV2ZXJ5IHRpbWUgcG9zc2libGUuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGRvZXMgbm90IGVtaXQgaXQgYW5kIGlzIHZhbGlkIGluIHRoZSBzcGVjLgotICAgICAqIEluIHZDcmFkIDMuMCwgdGhpcyBmbGFnIGlzIHVubmVjZXNzYXJ5LCBzaW5jZSAiVFlQRT0iIGlzIE1VU1QgaW4gdkNhcmQgMy4wIHNwZWNpZmljYXRpb24uCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIERldGFpbDoKLSAgICAgKiBIb3cgbW9yZSB0aGFuIG9uZSBUWVBFIGZpZWxkcyBhcmUgZXhwcmVzc2VkIGlzIGRpZmZlcmVudCBiZXR3ZWVuIHZDYXJkIDIuMSBhbmQgdkNhcmQgMy4wLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBlLmcuCi0gICAgICogPC9wPgotICAgICAqIDxvbD4KLSAgICAgKiA8bGk+UHJvYmFibHkgdmFsaWQgaW4gYm90aCB2Q2FyZCAyLjEgYW5kIHZDYXJkIDMuMDogIkFEUjtUWVBFPURPTTtUWVBFPUhPTUU6Li4uIjwvbGk+Ci0gICAgICogPGxpPlZhbGlkIGluIHZDYXJkIDIuMSBidXQgbm90IGluIHZDYXJkIDMuMDogIkFEUjtET007SE9NRTouLi4iPC9saT4KLSAgICAgKiA8bGk+VmFsaWQgaW4gdkNhcmQgMy4wIGJ1dCBub3QgaW4gdkNhcmQgMi4xOiAiQURSO1RZUEU9RE9NLEhPTUU6Li4uIjwvbGk+Ci0gICAgICogPC9vbD4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB5b3UgYXJlIHRhcmdldGluZyB0byB0aGUgaW1wb3J0ZXIgd2hpY2ggY2Fubm90IGFjY2VwdCBUWVBFIHBhcmFtcyB3aXRob3V0ICJUWVBFPSIKLSAgICAgKiBzdHJpbmdzICh3aGljaCBzaG91bGQgYmUgcmFyZSB0aG91Z2gpLCBwbGVhc2UgdXNlIHRoaXMgZmxhZy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogRXhhbXBsZSB1c2FnZToKLSAgICAgKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+aW50IHR5cGUgPSAoVkNBUkRfVFlQRV9WMjFfR0VORVJJQyB8IEZMQUdfQVBQRU5EX1RZUEVfUEFSQU0pOzwvcHJlPgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0FQUEVORF9UWVBFX1BBUkFNID0gMHgwNDAwMDAwMDsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgdGhlIHZDYXJkIGNvbXBvc2VyIGRvZXMgdG91Y2ggbm90aGluZyB0b3dhcmQgcGhvbmUgbnVtYmVyIFN0cmluZ3MKLSAgICAgKiBidXQgbGVhdmUgaXQgYXMgaXMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoZSB2Q2FyZCBzcGVjaWZpY2F0aW9ucyBtZW50aW9uIG5vdGhpbmcgdG93YXJkIHBob25lIG51bWJlcnMsIHdoaWxlIHNvbWUgZGV2aWNlcwotICAgICAqIGRvICh3cm9uZ2x5LCBidXQgd2l0aCBpbm5ldml0YWJsZSByZWFzb25zKS4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdGhlcmUncyBhIHBvc3NpYmlsaXR5IEphcGFuZXNlIG1vYmlsZSBwaG9uZXMgYXJlIGV4cGVjdGVkIHRvIGhhdmUKLSAgICAgKiBqdXN0IG51bWJlcnMsIGh5cGVucywgcGx1cywgZXRjLiBidXQgbm90IHVzdWFsIGFscGhhYmV0cywgd2hpbGUgVVMgbW9iaWxlIHBob25lcwotICAgICAqIHNob3VsZCBnZXQgc3VjaCBjaGFyYWN0ZXJzLiBUbyBtYWtlIGV4cG9ydGVkIHZDYXJkIHNpbXBsZSBmb3IgZXh0ZXJuYWwgcGFyc2VycywKLSAgICAgKiB3ZSBoYXZlIHVzZWQge0BsaW5rIFBob25lTnVtYmVyVXRpbHMjZm9ybWF0TnVtYmVyKFN0cmluZyl9IGR1cmluZyBleHBvcnQsIGFuZAotICAgICAqIHJlbW92ZWQgdW5uZWNlc3NhcnkgY2hhcmFjdGVycyBpbnNpZGUgdGhlIG51bWJlciAoZS5nLiAiMTExLTIyMi0zMzMzIChNaWFtaSkiCi0gICAgICogYmVjb21lcyAiMTExLTIyMi0zMzMzIikuCi0gICAgICogVW5mb3J0dW5hdGUgc2lkZSBlZmZlY3Qgb2YgdGhhdCB1c2Ugd2FzIHNvbWUgY29udHJvbCBjaGFyYWN0ZXJzIHVzZWQgaW4gdGhlIG90aGVyCi0gICAgICogYXJlYXMgbWF5IGJlIGJhZGx5IGFmZmVjdGVkIGJ5IHRoZSBmb3JtYXR0aW5nLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGZsYWcgZGlzYWJsZXMgdGhhdCBmb3JtYXR0aW5nLCBhZmZlY3RpbmcgYm90aCBpbXBvcnRlciBhbmQgZXhwb3J0ZXIuCi0gICAgICogSWYgdGhlIHVzZXIgaXMgYXdhcmUgb2Ygc29tZSBzaWRlIGVmZmVjdHMgZHVlIHRvIHRoZSBpbXBsaWNpdCBmb3JtYXR0aW5nLCB1c2UgdGhpcyBmbGFnLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1JFRlJBSU5fUEhPTkVfTlVNQkVSX0ZPUk1BVFRJTkcgPSAweDAyMDAwMDAwOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogRm9yIGltcG9ydGVyIG9ubHkuIElnbm9yZWQgaW4gZXhwb3J0ZXIuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgdGhlIHBhcnNlciBzaG91bGQgaGFuZGxlIGEgbmVzdGVkIHZDYXJkLCBpbiB3aGljaCB2Q2FyZCBjbGF1c2Ugc3RhcnRzCi0gICAgICogaW4gYW5vdGhlciB2Q2FyZCBjbGF1c2UuIEhlcmUncyBhIHR5cGljYWwgZXhhbXBsZS4KLSAgICAgKiA8L3A+Ci0gICAgICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPkJFR0lOOlZDQVJECi0gICAgICogQkVHSU46VkNBUkQKLSAgICAgKiBWRVJTSU9OOjIuMQotICAgICAqIC4uLgotICAgICAqIEVORDpWQ0FSRAotICAgICAqIEVORDpWQ0FSRDwvcHJlPgotICAgICAqIDxwPgotICAgICAqIFRoZSB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbiBhbGxvd3MgdGhlIG5lc3QsIGJ1dCBhbHNvIGxldCBwYXJzZXJzIGlnbm9yZSBuZXN0ZWQgZW50cmllcywKLSAgICAgKiB3aGlsZSBzb21lIG1vYmlsZSBkZXZpY2VzIGVtaXQgbmVzdGVkIG9uZXMgYXMgcHJpbWFyeSBkYXRhIHRvIGJlIGltcG9ydGVkLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGZsYWcgZm9yY2VzIGEgdkNhcmQgcGFyc2VyIHRvIHRvcmVsYXRlIHN1Y2ggYSBuZXN0IGFuZCB1bmRlcnN0YW5kIGl0cyBjb250ZW50LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1RPUkVMQVRFX05FU1QgPSAweDAxMDAwMDAwOwotCi0gICAgLy8vLyBUaGUgZm9sbG93aW5ncyBhcmUgVkNhcmQgdHlwZXMgYXZhaWxhYmxlIGZyb20gaW1wb3J0ZXIvZXhwb3J0ZXIuIC8vLy8KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfUkVGUkFJTl9JTUFHRV9FWFBPUlQgPSAweDAwODAwMDAwOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIHR5cGUgaW5kaWNhdGluZyBub3RoaW5nLiBVc2VkIGJ5IHtAbGluayBWQ2FyZFNvdXJjZURldGVjdG9yfSB3aGVuIGl0Ci0gICAgICogd2FzIG5vdCBhYmxlIHRvIGd1ZXNzIHRoZSBleGFjdCB2Q2FyZCB0eXBlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1VOS05PV04gPSAwOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogR2VuZXJpYyB2Q2FyZCBmb3JtYXQgd2l0aCB0aGUgdkNhcmQgMi4xLiBXaGVuIGNvbXBvc2luZyBhIHZDYXJkIGVudHJ5LAotICAgICAqIHRoZSBVUyBjb252ZW5zaW9uIHdpbGwgYmUgdXNlZCB0b3dhcmQgZm9ybWF0dGluZyBzb21lIHZhbHVlcy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogZS5nLiBUaGUgb3JkZXIgb2YgdGhlIGRpc3BsYXkgbmFtZSB3b3VsZCBiZSAiUHJlZml4IEdpdmVuIE1pZGRsZSBGYW1pbHkgU3VmZml4IiwKLSAgICAgKiB3aGlsZSBpdCBzaG91bGQgYmUgIlByZWZpeCBGYW1pbHkgTWlkZGxlIEdpdmVuIFN1ZmZpeCIgaW4gSmFwYW4gZm9yIGV4YW1wbGUuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFVzZXMgVVRGLTggZm9yIHRoZSBjaGFyc2V0IGFzIGEgY2hhcnNldCBmb3IgZXhwb3J0aW5nLiBOb3RlIHRoYXQgb2xkIHZDYXJkIGltcG9ydGVyCi0gICAgICogb3V0c2lkZSBBbmRyb2lkIGNhbm5vdCBhY2NlcHQgaXQgc2luY2UgdkNhcmQgMi4xIHNwZWNpZmljYWxseSBkb2VzIG5vdCBhbGxvdwotICAgICAqIHRoYXQgY2hhcnNldCwgd2hpbGUgd2UgbmVlZCB0byB1c2UgaXQgdG8gc3VwcG9ydCB2YXJpb3VzIGxhbmd1YWdlcyBhcm91bmQgdGhlIHdvcmxkLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB5b3Ugd2FudCB0byB1c2UgYWx0ZXJuYXRpdmUgY2hhcnNldCwgeW91IHNob3VsZCBub3RpZnkgdGhlIGNoYXJzZXQgdG8gdGhlIG90aGVyCi0gICAgICogY29tcG9udGVudCB0byBiZSB1c2VkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YyMV9HRU5FUklDID0KLSAgICAgICAgKFZFUlNJT05fMjEgfCBOQU1FX09SREVSX0RFRkFVTFQgfCBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgfCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIFN0cmluZyBWQ0FSRF9UWVBFX1YyMV9HRU5FUklDX1NUUiA9ICJ2MjFfZ2VuZXJpYyI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogR2VuZXJhbCB2Q2FyZCBmb3JtYXQgd2l0aCB0aGUgdmVyc2lvbiAzLjAuIFVzZXMgVVRGLTggZm9yIHRoZSBjaGFyc2V0LgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3QgZnVsbHkgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YzMF9HRU5FUklDID0KLSAgICAgICAgKFZFUlNJT05fMzAgfCBOQU1FX09SREVSX0RFRkFVTFQgfCBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgfCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YzMF9HRU5FUklDX1NUUiA9ICJ2MzBfZ2VuZXJpYyI7Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmFsIHZDYXJkIGZvcm1hdCB3aXRoIHRoZSB2ZXJzaW9uIDQuMC4KLSAgICAgKiBAaGlkZSB2Q2FyZCA0LjAgaXMgbm90IHB1Ymxpc2hlZCB5ZXQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNBUkRfVFlQRV9WNDBfR0VORVJJQyA9Ci0gICAgICAgIChWRVJTSU9OXzQwIHwgTkFNRV9PUkRFUl9ERUZBVUxUIHwgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9WNDBfR0VORVJJQ19TVFIgPSAidjQwX2dlbmVyaWMiOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogR2VuZXJhbCB2Q2FyZCBmb3JtYXQgZm9yIHRoZSB2Q2FyZCAyLjEgd2l0aCBzb21lIEV1cm9wZSBjb252ZW5zaW9uLiBVc2VzIFV0Zi04LgotICAgICAqIEN1cnJlbnRseSwgb25seSBuYW1lIG9yZGVyIGlzIGNvbnNpZGVyZWQgKCJQcmVmaXggTWlkZGxlIEdpdmVuIEZhbWlseSBTdWZmaXgiKQotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YyMV9FVVJPUEUgPQotICAgICAgICAoVkVSU0lPTl8yMSB8IE5BTUVfT1JERVJfRVVST1BFIHwgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9WMjFfRVVST1BFX1NUUiA9ICJ2MjFfZXVyb3BlIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBHZW5lcmFsIHZDYXJkIGZvcm1hdCB3aXRoIHRoZSB2ZXJzaW9uIDMuMCB3aXRoIHNvbWUgRXVyb3BlIGNvbnZlbnNpb24uIFVzZXMgVVRGLTguCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdCByZWFkeSB5ZXQuIFVzZSB3aXRoIGNhdXRpb24gd2hlbiB5b3UgdXNlIHRoaXMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjMwX0VVUk9QRSA9Ci0gICAgICAgIChWRVJTSU9OXzMwIHwgTkFNRV9PUkRFUl9FVVJPUEUgfCBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgfCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKTsKLSAgICAKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9WMzBfRVVST1BFX1NUUiA9ICJ2MzBfZXVyb3BlIjsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSB2Q2FyZCAyLjEgZm9ybWF0IGZvciBtaXNjZWxsYW5lb3VzIEphcGFuZXNlIGRldmljZXMsIHVzaW5nIFVURi04IGFzIGRlZmF1bHQgY2hhcnNldC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90IHJlYWR5IHlldC4gVXNlIHdpdGggY2F1dGlvbiB3aGVuIHlvdSB1c2UgdGhpcy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0UgPQotICAgICAgICAoVkVSU0lPTl8yMSB8IE5BTUVfT1JERVJfSkFQQU5FU0UgfCBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgfCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TVFIgPSAidjIxX2phcGFuZXNlX3V0ZjgiOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZDYXJkIDMuMCBmb3JtYXQgZm9yIG1pc2NlbGxhbmVvdXMgSmFwYW5lc2UgZGV2aWNlcywgdXNpbmcgVVRGLTggYXMgZGVmYXVsdCBjaGFyc2V0LgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3QgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRSA9Ci0gICAgICAgIChWRVJTSU9OXzMwIHwgTkFNRV9PUkRFUl9KQVBBTkVTRSB8IEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfVjMwX0pBUEFORVNFX1NUUiA9ICJ2MzBfamFwYW5lc2VfdXRmOCI7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdkNhcmQgMi4xIGJhc2VkIGZvcm1hdCB3aGljaCAocGFydGlhbGx5KSBjb25zaWRlcnMgdGhlIGNvbnZlbnRpb24gaW4gSmFwYW5lc2UKLSAgICAgKiBtb2JpbGUgcGhvbmVzLCB3aGVyZSBwaG9uZXRpYyBuYW1lcyBhcmUgdHJhbnNsYXRlZCB0byBoYWxmLXdpZHRoIGthdGFrYW5hIGlmCi0gICAgICogcG9zc2libGUsIGV0Yy4gSXQgd291bGQgYmUgYmV0dGVyIHRvIHVzZSBTaGlmdF9KSVMgYXMgYSBjaGFyc2V0IGZvciBtYXhpbXVtCi0gICAgICogY29tcGF0aWJpbGl0eS4KLSAgICAgKiA8L3A+Ci0gICAgICogQGhpZGUgU2hvdWxkIG5vdCBiZSBhdmFpbGFibGUgd29ybGQgd2lkZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEUgPQotICAgICAgICAoVkVSU0lPTl8yMSB8IE5BTUVfT1JERVJfSkFQQU5FU0UgfAotICAgICAgICAgICAgICAgIEZMQUdfQ09OVkVSVF9QSE9ORVRJQ19OQU1FX1NUUklOR1MgfCBGTEFHX1JFRlJBSU5fUVBfVE9fTkFNRV9QUk9QRVJUSUVTKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEVfU1RSID0gInYyMV9qYXBhbmVzZV9tb2JpbGUiOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZDYXJkIGZvcm1hdCB1c2VkIGluIERvQ29Nbywgd2hpY2ggaXMgb25lIG9mIEphcGFuZXNlIG1vYmlsZSBwaG9uZSBjYXJlZXJzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBCYXNlIHZlcnNpb24gaXMgdkNhcmQgMi4xLCBidXQgdGhlIGRhdGEgaGFzIHNldmVyYWwgRG9Db01vLXNwZWNpZmljIGNvbnZlbnNpb25zLgotICAgICAqIE5vIEFuZHJvaWQtc3BlY2lmaWMgcHJvcGVydHkgbm9yIGRlZmFjdCBwcm9wZXJ0eSBpcyBpbmNsdWRlZC4gVGhlICJQcmltYXJ5IiBwcm9wZXJ0aWVzCi0gICAgICogYXJlIE5PVCBlbmNvZGVkIHRvIFF1b3RlZC1QcmludGFibGUuCi0gICAgICogPC9wPgotICAgICAqIEBoaWRlIFNob3VsZCBub3QgYmUgYXZhaWxhYmxlIHdvcmxkIHdpZGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNBUkRfVFlQRV9ET0NPTU8gPQotICAgICAgICAoVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFIHwgRkxBR19ET0NPTU8pOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfRE9DT01PX1NUUiA9ICJkb2NvbW8iOwotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgVkNBUkRfVFlQRV9ERUZBVUxUID0gVkNBUkRfVFlQRV9WMjFfR0VORVJJQzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIEludGVnZXI+IHNWQ2FyZFR5cGVNYXA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PEludGVnZXI+IHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQ7Ci0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19TVFIsIFZDQVJEX1RZUEVfVjIxX0dFTkVSSUMpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YzMF9HRU5FUklDX1NUUiwgVkNBUkRfVFlQRV9WMzBfR0VORVJJQyk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjIxX0VVUk9QRV9TVFIsIFZDQVJEX1RZUEVfVjIxX0VVUk9QRSk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjMwX0VVUk9QRV9TVFIsIFZDQVJEX1RZUEVfVjMwX0VVUk9QRSk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NUUiwgVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0UpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9TVFIsIFZDQVJEX1RZUEVfVjMwX0pBUEFORVNFKTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFX1NUUiwgVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFKTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9ET0NPTU9fU1RSLCBWQ0FSRF9UWVBFX0RPQ09NTyk7Ci0KLSAgICAgICAgc0phcGFuZXNlTW9iaWxlVHlwZVNldCA9IG5ldyBIYXNoU2V0PEludGVnZXI+KCk7Ci0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQuYWRkKFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFKTsKLSAgICAgICAgc0phcGFuZXNlTW9iaWxlVHlwZVNldC5hZGQoVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0UpOwotICAgICAgICBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0LmFkZChWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEUpOwotICAgICAgICBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0LmFkZChWQ0FSRF9UWVBFX0RPQ09NTyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VkNhcmRUeXBlRnJvbVN0cmluZyhmaW5hbCBTdHJpbmcgdmNhcmRUeXBlU3RyaW5nKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBsb3dlcmVkS2V5ID0gdmNhcmRUeXBlU3RyaW5nLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgIGlmIChzVkNhcmRUeXBlTWFwLmNvbnRhaW5zS2V5KGxvd2VyZWRLZXkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc1ZDYXJkVHlwZU1hcC5nZXQobG93ZXJlZEtleSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoImRlZmF1bHQiLmVxdWFsc0lnbm9yZUNhc2UodmNhcmRUeXBlU3RyaW5nKSkgewotICAgICAgICAgICAgcmV0dXJuIFZDQVJEX1RZUEVfREVGQVVMVDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmtub3duIHZDYXJkIHR5cGUgU3RyaW5nOiBcIiIgKyB2Y2FyZFR5cGVTdHJpbmcgKyAiXCIiKTsKLSAgICAgICAgICAgIHJldHVybiBWQ0FSRF9UWVBFX0RFRkFVTFQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWZXJzaW9uMjEoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKHZjYXJkVHlwZSAmIFZFUlNJT05fTUFTSykgPT0gVkVSU0lPTl8yMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWZXJzaW9uMzAoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKHZjYXJkVHlwZSAmIFZFUlNJT05fTUFTSykgPT0gVkVSU0lPTl8zMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWZXJzaW9uNDAoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKHZjYXJkVHlwZSAmIFZFUlNJT05fTUFTSykgPT0gVkVSU0lPTl80MDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICFpc1ZlcnNpb24zMCh2Y2FyZFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldE5hbWVPcmRlclR5cGUoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gdmNhcmRUeXBlICYgTkFNRV9PUkRFUl9NQVNLOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1c2VzQW5kcm9pZFNwZWNpZmljUHJvcGVydHkoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXNlc0RlZmFjdFByb3BlcnR5KGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICgodmNhcmRUeXBlICYgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd1BlcmZvcm1hbmNlTG9nKCkgewotICAgICAgICByZXR1cm4gKFZDYXJkQ29uZmlnLkxPR19MRVZFTCAmIFZDYXJkQ29uZmlnLkxPR19MRVZFTF9QRVJGT1JNQU5DRV9NRUFTVVJFTUVOVCkgIT0gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvdWxkUmVmcmFpblFQVG9OYW1lUHJvcGVydGllcyhmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgcmV0dXJuICghc2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlKHZjYXJkVHlwZSkgfHwKLSAgICAgICAgICAgICAgICgodmNhcmRUeXBlICYgRkxBR19SRUZSQUlOX1FQX1RPX05BTUVfUFJPUEVSVElFUykgIT0gMCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcHBlbmRUeXBlUGFyYW1OYW1lKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuIChpc1ZlcnNpb24zMCh2Y2FyZFR5cGUpIHx8ICgodmNhcmRUeXBlICYgRkxBR19BUFBFTkRfVFlQRV9QQVJBTSkgIT0gMCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIEphcGFuZXNlIGFuZCBzb21lIEphcGFuZXNlIGNvbnZlbnNpb24gaXMKLSAgICAgKiBhcHBsaWVkIHRvIGNyZWF0aW5nICJmb3JtYXR0ZWQiIHNvbWV0aGluZyBsaWtlIEZPUk1BVFRFRF9BRERSRVNTLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phcGFuZXNlRGV2aWNlKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgLy8gVE9ETzogU29tZSBtYXNrIHdpbGwgYmUgcmVxdWlyZWQgc28gdGhhdCB0aGlzIG1ldGhvZCB3cm9uZ2x5IGludGVycHJldAotICAgICAgICAvLyAgICAgICAgSmFwYW5lc2UiLWxpa2UiIHZDYXJkIHR5cGUuCi0gICAgICAgIC8vICAgICAgICBlLmcuIFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX1NKSVMgfCBGTEFHX0FQUEVORF9UWVBFX1BBUkFNUwotICAgICAgICByZXR1cm4gc0phcGFuZXNlTW9iaWxlVHlwZVNldC5jb250YWlucyh2Y2FyZFR5cGUpOwotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGJvb2xlYW4gcmVmcmFpblBob25lTnVtYmVyRm9ybWF0dGluZyhmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAoKHZjYXJkVHlwZSAmIEZMQUdfUkVGUkFJTl9QSE9ORV9OVU1CRVJfRk9STUFUVElORykgIT0gMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIG5lZWRzVG9Db252ZXJ0UGhvbmV0aWNTdHJpbmcoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX0NPTlZFUlRfUEhPTkVUSUNfTkFNRV9TVFJJTkdTKSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gb25seU9uZU5vdGVGaWVsZElzQXZhaWxhYmxlKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuIHZjYXJkVHlwZSA9PSBWQ0FSRF9UWVBFX0RPQ09NTzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb0NvTW8oZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX0RPQ09NTykgIT0gMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBWQ2FyZENvbmZpZygpIHsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29uc3RhbnRzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYzNzFlZjkuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi0vKioKLSAqIENvbnN0YW50cyB1c2VkIGluIGJvdGggZXhwb3J0ZXIgYW5kIGltcG9ydGVyIGNvZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZENvbnN0YW50cyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9WMjEgPSAiMi4xIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX1YzMCA9ICIzLjAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fVjQwID0gIjQuMCI7Ci0KLSAgICAvLyBUaGUgcHJvcGVydHkgbmFtZXMgdmFsaWQgYm90aCBpbiB2Q2FyZCAyLjEgYW5kIDMuMC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9CRUdJTiA9ICJCRUdJTiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVkVSU0lPTiA9ICJWRVJTSU9OIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OID0gIk4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0ZOID0gIkZOIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9BRFIgPSAiQURSIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9FTUFJTCA9ICJFTUFJTCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTk9URSA9ICJOT1RFIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9PUkcgPSAiT1JHIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TT1VORCA9ICJTT1VORCI7ICAvLyBOb3QgZnVsbHkgc3VwcG9ydGVkLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1RFTCA9ICJURUwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1RJVExFID0gIlRJVExFIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ST0xFID0gIlJPTEUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1BIT1RPID0gIlBIT1RPIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9MT0dPID0gIkxPR08iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1VSTCA9ICJVUkwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0JEQVkgPSAiQkRBWSI7ICAvLyBCaXJ0aGRheSAoMy4wLCA0LjApCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQklSVEggPSAiQklSVEgiOyAgLy8gUGxhY2Ugb2YgYmlydGggKDQuMCkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9BTk5JVkVSU0FSWSA9ICJBTk5JVkVSU0FSWSI7ICAvLyBEYXRlIG9mIG1hcnJpYWdlICg0LjApCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTkFNRSA9ICJOQU1FIjsgIC8vICgzLjAsIDQsMCkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OSUNLTkFNRSA9ICJOSUNLTkFNRSI7ICAvLyAoMy4wLCA0LjApCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfU09SVF9TVFJJTkcgPSAiU09SVC1TVFJJTkciOyAgLy8gKDMuMCwgNC4wKQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0VORCA9ICJFTkQiOwotCi0gICAgLy8gVmFsaWQgcHJvcGVydHkgbmFtZXMgbm90IHN1cHBvcnRlZCAobm90IGFwcHJvcHJpYXRlbHkgaGFuZGxlZCkgYnkgb3VyIGltcG9ydGVyLgotICAgIC8vIFRPRE86IFNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIHZpZXcgb2YgbWVtb3J5IGVmZmljaWVuY3k/Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUkVWID0gIlJFViI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQUdFTlQgPSAiQUdFTlQiOyAgLy8gKDMuMCkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9EREFZID0gIkREQVkiOyAgLy8gRGF0ZSBvZiBkZWF0aCAoNC4wKQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFQVRIID0gIkRFQVRIIjsgIC8vIFBsYWNlIG9mIGRlYXRoICg0LjApCi0KLSAgICAvLyBBdmFpbGFibGUgaW4gdkNhcmQgMy4wLiBTaG91ZCBub3QgdXNlIHdoZW4gY29tcG9zaW5nIHZDYXJkIDIuMSBmaWxlLgotICAgIAotICAgIC8vIERlLWZhY3QgcHJvcGVydHkgdmFsdWVzIGV4cHJlc3NpbmcgcGhvbmV0aWMgbmFtZXMuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9QSE9ORVRJQ19GSVJTVF9OQU1FID0gIlgtUEhPTkVUSUMtRklSU1QtTkFNRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9QSE9ORVRJQ19NSURETEVfTkFNRSA9ICJYLVBIT05FVElDLU1JRERMRS1OQU1FIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1BIT05FVElDX0xBU1RfTkFNRSA9ICJYLVBIT05FVElDLUxBU1QtTkFNRSI7Ci0KLSAgICAvLyBQcm9wZXJ0aWVzIGJvdGggQ29udGFjdHNTdHJ1Y3QgYW5kIGRlLWZhY3QgdkNhcmQgZXh0ZW5zaW9ucwotICAgIC8vIFNob3duIGluIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVkNhcmQgc3VwcG9ydCBhcmUgZGVmaW5lZCBoZXJlLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfQUlNID0gIlgtQUlNIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX01TTiA9ICJYLU1TTiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9ZQUhPTyA9ICJYLVlBSE9PIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0lDUSA9ICJYLUlDUSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9KQUJCRVIgPSAiWC1KQUJCRVIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfR09PR0xFX1RBTEsgPSAiWC1HT09HTEUtVEFMSyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9TS1lQRV9VU0VSTkFNRSA9ICJYLVNLWVBFLVVTRVJOQU1FIjsKLSAgICAvLyBQcm9wZXJ0aWVzIG9ubHkgQ29udGFjdHNTdHJ1Y3QgaGFzLiBXZSBhbHNlIHVzZSB0aGlzLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfUVEgPSAiWC1RUSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9ORVRNRUVUSU5HID0gIlgtTkVUTUVFVElORyI7Ci0KLSAgICAvLyBQaG9uZSBudW1iZXIgZm9yIFNreXBlLCBhdmFpbGFibGUgYXMgdXN1YWwgcGhvbmUuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9TS1lQRV9QU1ROTlVNQkVSID0gIlgtU0tZUEUtUFNUTk5VTUJFUiI7Ci0KLSAgICAvLyBQcm9wZXJ0eSBmb3IgQW5kcm9pZC1zcGVjaWZpYyBmaWVsZHMuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9BTkRST0lEX0NVU1RPTSA9ICJYLUFORFJPSUQtQ1VTVE9NIjsKLQotICAgIC8vIFByb3BlcnRpZXMgZm9yIERvQ29NbyB2Q2FyZC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0NMQVNTID0gIlgtQ0xBU1MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfUkVEVUNUSU9OID0gIlgtUkVEVUNUSU9OIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX05PID0gIlgtTk8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfRENNX0hNTl9NT0RFID0gIlgtRENNLUhNTi1NT0RFIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEUgPSAiVFlQRSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0hPTUUgPSAiSE9NRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9XT1JLID0gIldPUksiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfRkFYID0gIkZBWCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9DRUxMID0gIkNFTEwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfVk9JQ0UgPSAiVk9JQ0UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfSU5URVJORVQgPSAiSU5URVJORVQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQ0hBUlNFVCA9ICJDSEFSU0VUIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9FTkNPRElORyA9ICJFTkNPRElORyI7Ci0KLSAgICAvLyBBYmJyZXZpYXRpb24gb2YgInByZWZlcmVkIiBhY2NvcmRpbmcgdG8gdkNhcmQgMi4xIHNwZWNpZmljYXRpb24uCi0gICAgLy8gV2UgaW50ZXJwcmV0IHRoaXMgdmFsdWUgYXMgInByaW1hcnkiIHByb3BlcnR5IGR1cmluZyBpbXBvcnQvZXhwb3J0LgotICAgIC8vCi0gICAgLy8gTm90ZTogQm90aCB2Q2FyZCBzcGVjcyBkb2VzIG5vdCBtZW50aW9uIGFueXRoaW5nIGFib3V0IHRoZSByZXF1aXJlbWVudCBmb3IgdGhpcyBwYXJhbWV0ZXIsCi0gICAgLy8gICAgICAgYnV0IHRoZXJlIG1heSBiZSBzb21lIHZDYXJkIGltcG9ydGVyIHdoaWNoIHdpbGwgZ2V0IGNvbmZ1c2VkIHdpdGggbW9yZSB0aGFuCi0gICAgLy8gICAgICAgb25lICJQUkVGInMgaW4gb25lIHByb3BlcnR5IG5hbWUsIHdoaWxlIEFuZHJvaWQgYWNjZXB0cyB0aGVtLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfUFJFRiA9ICJQUkVGIjsKLQotICAgIC8vIFBob25lIHR5cGUgcGFyYW1ldGVycyB2YWxpZCBpbiB2Q2FyZCBhbmQga25vd24gdG8gQ29udGFjdHNDb250cmFjdCwgYnV0IG5vdCBzbyBjb21tb24uCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9DQVIgPSAiQ0FSIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0lTRE4gPSAiSVNETiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9QQUdFUiA9ICJQQUdFUiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9UTFggPSAiVExYIjsgIC8vIFRlbGV4Ci0KLSAgICAvLyBQaG9uZSB0eXBlcyBleGlzdGluZyBpbiB2Q2FyZCAyLjEgYnV0IG5vdCBrbm93biB0byBDb250YWN0c0NvbnRyYWN0LgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfTU9ERU0gPSAiTU9ERU0iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfTVNHID0gIk1TRyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9CQlMgPSAiQkJTIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX1ZJREVPID0gIlZJREVPIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0VOQ09ESU5HXzdCSVQgPSAiN0JJVCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fRU5DT0RJTkdfOEJJVCA9ICI4QklUIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9FTkNPRElOR19RUCA9ICJRVU9URUQtUFJJTlRBQkxFIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9FTkNPRElOR19CQVNFNjQgPSAiQkFTRTY0IjsgIC8vIEF2YWlsYWJsZSBpbiB2Q2FyZCAyLjEKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9FTkNPRElOR19CID0gIkIiOyAgLy8gQXZhaWxhYmxlIGluIHZDYXJkIDMuMAotCi0gICAgLy8gVFlQRSBwYXJhbWV0ZXJzIGZvciBQaG9uZXMsIHdoaWNoIGFyZSBub3QgZm9ybWFsbHkgdmFsaWQgaW4gdkNhcmQgKGF0IGxlYXN0IDIuMSkuCi0gICAgLy8gVGhlc2UgdHlwZXMgYXJlIGJhc2ljYWxseSBlbmNvZGVkIHRvICJYLSIgcGFyYW1ldGVycyB3aGVuIGNvbXBvc2luZyB2Q2FyZC4KLSAgICAvLyBQYXJzZXIgcGFzc2VzIHRoZXNlIHdoZW4gIlgtIiBpcyBhZGRlZCB0byB0aGUgcGFyYW1ldGVyIG9yIG5vdC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0NBTExCQUNLID0gIkNBTExCQUNLIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX1JBRElPID0gIlJBRElPIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QSE9ORV9FWFRSQV9UWVBFX1RUWV9UREQgPSAiVFRZLVRERCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9BU1NJU1RBTlQgPSAiQVNTSVNUQU5UIjsKLSAgICAvLyB2Q2FyZCBjb21wb3NlciB0cmFuc2xhdGVzIHRoaXMgdHlwZSB0byAiV09SSyIgKyAiUFJFRiIuIEp1c3QgZm9yIHBhcnNpbmcuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9DT01QQU5ZX01BSU4gPSAiQ09NUEFOWS1NQUlOIjsKLSAgICAvLyB2Q2FyZCBjb21wb3NlciB0cmFuc2xhdGVzIHRoaXMgdHlwZSB0byAiVk9JQ0UiIEp1c3QgZm9yIHBhcnNpbmcuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9PVEhFUiA9ICJPVEhFUiI7Ci0KLSAgICAvLyBUWVBFIHBhcmFtZXRlcnMgZm9yIHBvc3RhbCBhZGRyZXNzZXMuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQURSX1RZUEVfUEFSQ0VMID0gIlBBUkNFTCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQURSX1RZUEVfRE9NID0gIkRPTSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQURSX1RZUEVfSU5UTCA9ICJJTlRMIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0xBTkdVQUdFID0gIkxBTkdVQUdFIjsKLQotICAgIC8vIFNPUlQtQVMgcGFyYW1ldGVyIGludHJvZHVjZWQgaW4gdkNhcmQgNC4wIChhcyBvZiByZXYuMTMpCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU09SVF9BUyA9ICJTT1JULUFTIjsKLQotICAgIC8vIFRZUEUgcGFyYW1ldGVycyBub3Qgb2ZmaWNpYWxseSB2YWxpZCBidXQgdXNlZCBpbiBzb21lIHZDYXJkIGV4cG9ydGVyLgotICAgIC8vIERvIG5vdCB1c2UgaW4gY29tcG9zZXIgc2lkZS4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9FWFRSQV9UWVBFX0NPTVBBTlkgPSAiQ09NUEFOWSI7Ci0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEltcG9ydE9ubHkgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX05JQ0tOQU1FID0gIlgtTklDS05BTUUiOwotICAgICAgICAvLyBTb21lIGRldmljZSBlbWl0cyB0aGlzICJYLSIgcGFyYW1ldGVyIGZvciBleHByZXNzaW5nIEdvb2dsZSBUYWxrLAotICAgICAgICAvLyB3aGljaCBpcyBzcGVjaWZpY2FsbHkgaW52YWxpZCBidXQgc2hvdWxkIGJlIGFsd2F5cyBwcm9wZXJseSBhY2NlcHRlZCwgYW5kIGVtaXR0ZWQKLSAgICAgICAgLy8gaW4gc29tZSBzcGVjaWFsIGNhc2UgKGZvciB0aGF0IGRldmljZS9hcHBsaWNhdGlvbikuCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfR09PR0xFX1RBTEtfV0lUSF9TUEFDRSA9ICJYLUdPT0dMRSBUQUxLIjsKLSAgICB9Ci0KLSAgICAvLy8vIE1haW5seSBmb3IgcGFja2FnZSBjb25zdGFudHMuCi0KLSAgICAvLyBEb0NvTW8gc3BlY2lmaWMgdHlwZSBwYXJhbWV0ZXIuIFVzZWQgd2l0aCAiU09VTkQiIHByb3BlcnR5LCB3aGljaCBpcyBhbHRlcm5hdGUgb2YKLSAgICAvLyBTT1JULVNUUklORyBpbnZDYXJkIDMuMC4KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9YX0lSTUNfTiA9ICJYLUlSTUMtTiI7Ci0KLSAgICAvLyBVc2VkIGluIHVuaXQgdGVzdC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfREFUQV9DT0xVTU4gPSAxNTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBNQVhfQ0hBUkFDVEVSX05VTVNfUVAgPSA3NjsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9DSEFSQUNURVJfTlVNU19CQVNFNjRfVjMwID0gNzU7Ci0KLSAgICBwcml2YXRlIFZDYXJkQ29uc3RhbnRzKCkgewotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJlMTY3NC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck9wZXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyUmVzdWx0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50Lk9wZXJhdGlvbkFwcGxpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3Q7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FbWFpbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkV2ZW50OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuR3JvdXBNZW1iZXJzaGlwOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuSW07Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5OaWNrbmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5vdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Pcmdhbml6YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob3RvOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuV2Vic2l0ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0Lkdyb3VwczsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJVdGlsczsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBicmlkZ2VzIGJldHdlZW4gZGF0YSBzdHJ1Y3R1cmUgb2YgQ29udGFjdCBhcHAgYW5kIFZDYXJkIGRhdGEuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZEVudHJ5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZEVudHJ5IjsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBERUZBVUxUX09SR0FOSVpBVElPTl9UWVBFID0gT3JnYW5pemF0aW9uLlRZUEVfV09SSzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX1RZUEVfR09PR0xFID0gImNvbS5nb29nbGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHT09HTEVfTVlfQ09OVEFDVFNfR1JPVVAgPSAiU3lzdGVtIEdyb3VwOiBNeSBDb250YWN0cyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzSW1NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfQUlNLCBJbS5QUk9UT0NPTF9BSU0pOwotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfTVNOLCBJbS5QUk9UT0NPTF9NU04pOwotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfWUFIT08sIEltLlBST1RPQ09MX1lBSE9PKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0lDUSwgSW0uUFJPVE9DT0xfSUNRKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0pBQkJFUiwgSW0uUFJPVE9DT0xfSkFCQkVSKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1NLWVBFX1VTRVJOQU1FLCBJbS5QUk9UT0NPTF9TS1lQRSk7Ci0gICAgICAgIHNJbU1hcC5wdXQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9HT09HTEVfVEFMSywgSW0uUFJPVE9DT0xfR09PR0xFX1RBTEspOwotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLkltcG9ydE9ubHkuUFJPUEVSVFlfWF9HT09HTEVfVEFMS19XSVRIX1NQQUNFLAotICAgICAgICAgICAgICAgIEltLlBST1RPQ09MX0dPT0dMRV9UQUxLKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBob25lRGF0YSB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBkYXRhOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGxhYmVsOwotICAgICAgICAvLyBpc1ByaW1hcnkgaXMgKG5vdCBmaW5hbCBidXQpIGNoYW5nYWJsZSwgb25seSB3aGVuIHRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgb25lIGV4aXN0aW5nCi0gICAgICAgIC8vIGluIHRoZSBvcmlnaW5hbCBWQ2FyZC4KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5OwotICAgICAgICBwdWJsaWMgUGhvbmVEYXRhKGludCB0eXBlLCBTdHJpbmcgZGF0YSwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7Ci0gICAgICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7Ci0gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUGhvbmVEYXRhKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFBob25lRGF0YSBwaG9uZURhdGEgPSAoUGhvbmVEYXRhKW9iajsKLSAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBwaG9uZURhdGEudHlwZSAmJiBkYXRhLmVxdWFscyhwaG9uZURhdGEuZGF0YSkgJiYKLSAgICAgICAgICAgICAgICAgICAgbGFiZWwuZXF1YWxzKHBob25lRGF0YS5sYWJlbCkgJiYgaXNQcmltYXJ5ID09IHBob25lRGF0YS5pc1ByaW1hcnkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgidHlwZTogJWQsIGRhdGE6ICVzLCBsYWJlbDogJXMsIGlzUHJpbWFyeTogJXMiLAotICAgICAgICAgICAgICAgICAgICB0eXBlLCBkYXRhLCBsYWJlbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW1haWxEYXRhIHsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCB0eXBlOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGRhdGE7Ci0gICAgICAgIC8vIFVzZWQgb25seSB3aGVuIFRZUEUgaXMgVFlQRV9DVVNUT00uCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbGFiZWw7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWFyeTsKLSAgICAgICAgcHVibGljIEVtYWlsRGF0YShpbnQgdHlwZSwgU3RyaW5nIGRhdGEsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwotICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOwotICAgICAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIEVtYWlsRGF0YSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFbWFpbERhdGEgZW1haWxEYXRhID0gKEVtYWlsRGF0YSlvYmo7Ci0gICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gZW1haWxEYXRhLnR5cGUgJiYgZGF0YS5lcXVhbHMoZW1haWxEYXRhLmRhdGEpICYmCi0gICAgICAgICAgICAgICAgICAgIGxhYmVsLmVxdWFscyhlbWFpbERhdGEubGFiZWwpICYmIGlzUHJpbWFyeSA9PSBlbWFpbERhdGEuaXNQcmltYXJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInR5cGU6ICVkLCBkYXRhOiAlcywgbGFiZWw6ICVzLCBpc1ByaW1hcnk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgZGF0YSwgbGFiZWwsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBvc3RhbERhdGEgewotICAgICAgICAvLyBEZXRlcm1pbmVkIGJ5IHZDYXJkIHNwZWNpZmljYXRpb24uCi0gICAgICAgIC8vIC0gUE8gQm94LCBFeHRlbmRlZCBBZGRyLCBTdHJlZXQsIExvY2FsaXR5LCBSZWdpb24sIFBvc3RhbCBDb2RlLCBDb3VudHJ5IE5hbWUKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREUl9NQVhfREFUQV9TSVpFID0gNzsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBkYXRhQXJyYXk7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgcG9ib3g7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZXh0ZW5kZWRBZGRyZXNzOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHN0cmVldDsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBsb2NhbHR5OwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHJlZ2lvbjsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBwb3N0YWxDb2RlOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGNvdW50cnk7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBsYWJlbDsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5OwotCi0gICAgICAgIHB1YmxpYyBQb3N0YWxEYXRhKGZpbmFsIGludCB0eXBlLCBmaW5hbCBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgZGF0YUFycmF5ID0gbmV3IFN0cmluZ1tBRERSX01BWF9EQVRBX1NJWkVdOwotCi0gICAgICAgICAgICBpbnQgc2l6ZSA9IHByb3BWYWx1ZUxpc3Quc2l6ZSgpOwotICAgICAgICAgICAgaWYgKHNpemUgPiBBRERSX01BWF9EQVRBX1NJWkUpIHsKLSAgICAgICAgICAgICAgICBzaXplID0gQUREUl9NQVhfREFUQV9TSVpFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhZHItdmFsdWUgPSAwKjYodGV4dC12YWx1ZSAiOyIpIHRleHQtdmFsdWUKLSAgICAgICAgICAgIC8vICAgICAgICAgICA7IFBPIEJveCwgRXh0ZW5kZWQgQWRkcmVzcywgU3RyZWV0LCBMb2NhbGl0eSwgUmVnaW9uLCBQb3N0YWwKLSAgICAgICAgICAgIC8vICAgICAgICAgICA7IENvZGUsIENvdW50cnkgTmFtZQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFVzZSBJdGVyYXRvciBhc3N1bWluZyBMaXN0IG1heSBiZSBMaW5rZWRMaXN0LCB0aG91Z2ggYWN0dWFsbHkgaXQgaXMKLSAgICAgICAgICAgIC8vIGFsd2F5cyBBcnJheUxpc3QgaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uCi0gICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBhZGRyZXNzRWxlbWVudCA6IHByb3BWYWx1ZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBkYXRhQXJyYXlbaV0gPSBhZGRyZXNzRWxlbWVudDsKLSAgICAgICAgICAgICAgICBpZiAoKytpID49IHNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKGkgPCBBRERSX01BWF9EQVRBX1NJWkUpIHsKLSAgICAgICAgICAgICAgICBkYXRhQXJyYXlbaSsrXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRoaXMucG9ib3ggPSBkYXRhQXJyYXlbMF07Ci0gICAgICAgICAgICB0aGlzLmV4dGVuZGVkQWRkcmVzcyA9IGRhdGFBcnJheVsxXTsKLSAgICAgICAgICAgIHRoaXMuc3RyZWV0ID0gZGF0YUFycmF5WzJdOwotICAgICAgICAgICAgdGhpcy5sb2NhbHR5ID0gZGF0YUFycmF5WzNdOwotICAgICAgICAgICAgdGhpcy5yZWdpb24gPSBkYXRhQXJyYXlbNF07Ci0gICAgICAgICAgICB0aGlzLnBvc3RhbENvZGUgPSBkYXRhQXJyYXlbNV07Ci0gICAgICAgICAgICB0aGlzLmNvdW50cnkgPSBkYXRhQXJyYXlbNl07Ci0gICAgICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7Ci0gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUG9zdGFsRGF0YSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBQb3N0YWxEYXRhIHBvc3RhbERhdGEgPSAoUG9zdGFsRGF0YSlvYmo7Ci0gICAgICAgICAgICByZXR1cm4gKEFycmF5cy5lcXVhbHMoZGF0YUFycmF5LCBwb3N0YWxEYXRhLmRhdGFBcnJheSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gcG9zdGFsRGF0YS50eXBlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFiZWwgPT0gcG9zdGFsRGF0YS5sYWJlbCkgOiB0cnVlKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKGlzUHJpbWFyeSA9PSBwb3N0YWxEYXRhLmlzUHJpbWFyeSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRGb3JtYXR0ZWRBZGRyZXNzKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBib29sZWFuIGVtcHR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc0phcGFuZXNlRGV2aWNlKHZjYXJkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBJbiBKYXBhbiwgdGhlIG9yZGVyIGlzIHJldmVyc2VkLgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBBRERSX01BWF9EQVRBX1NJWkUgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzc1BhcnQgPSBkYXRhQXJyYXlbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoYWRkcmVzc1BhcnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGFkZHJlc3NQYXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBRERSX01BWF9EQVRBX1NJWkU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzc1BhcnQgPSBkYXRhQXJyYXlbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoYWRkcmVzc1BhcnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVtcHR5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGFkZHJlc3NQYXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKS50cmltKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ0eXBlOiAlZCwgbGFiZWw6ICVzLCBpc1ByaW1hcnk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgbGFiZWwsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE9yZ2FuaXphdGlvbkRhdGEgewotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIC8vIG5vbi1maW5hbCBpcyBJbnRlbnRpb25hbDogd2UgbWF5IGNoYW5nZSB0aGUgdmFsdWVzIHNpbmNlIHRoaXMgaW5mbyBpcyBzZXBhcmF0ZWQgaW50bwotICAgICAgICAvLyB0d28gcGFydHMgaW4gdkNhcmQ6ICJPUkciICsgIlRJVExFIiwgYW5kIHdlIGhhdmUgdG8gY29wZSB3aXRoIGVhY2ggZmllbGQgaW4KLSAgICAgICAgLy8gZGlmZmVyZW50IHRpbWluZy4KLSAgICAgICAgcHVibGljIFN0cmluZyBjb21wYW55TmFtZTsKLSAgICAgICAgcHVibGljIFN0cmluZyBkZXBhcnRtZW50TmFtZTsKLSAgICAgICAgcHVibGljIFN0cmluZyB0aXRsZU5hbWU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgcGhvbmV0aWNOYW1lOyAgLy8gV2Ugd29uJ3QgaGF2ZSB0aGlzIGluICJUSVRMRSIgcHJvcGVydHkuCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWFyeTsKLQotICAgICAgICBwdWJsaWMgT3JnYW5pemF0aW9uRGF0YShpbnQgdHlwZSwKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY29tcGFueU5hbWUsCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlcGFydG1lbnROYW1lLAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0aXRsZU5hbWUsCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljTmFtZSwKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRoaXMuY29tcGFueU5hbWUgPSBjb21wYW55TmFtZTsKLSAgICAgICAgICAgIHRoaXMuZGVwYXJ0bWVudE5hbWUgPSBkZXBhcnRtZW50TmFtZTsKLSAgICAgICAgICAgIHRoaXMudGl0bGVOYW1lID0gdGl0bGVOYW1lOwotICAgICAgICAgICAgdGhpcy5waG9uZXRpY05hbWUgPSBwaG9uZXRpY05hbWU7Ci0gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgT3JnYW5pemF0aW9uRGF0YSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPcmdhbml6YXRpb25EYXRhIG9yZ2FuaXphdGlvbiA9IChPcmdhbml6YXRpb25EYXRhKW9iajsKLSAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBvcmdhbml6YXRpb24udHlwZSAmJgotICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZXF1YWxzKGNvbXBhbnlOYW1lLCBvcmdhbml6YXRpb24uY29tcGFueU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5lcXVhbHMoZGVwYXJ0bWVudE5hbWUsIG9yZ2FuaXphdGlvbi5kZXBhcnRtZW50TmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLmVxdWFscyh0aXRsZU5hbWUsIG9yZ2FuaXphdGlvbi50aXRsZU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9PSBvcmdhbml6YXRpb24uaXNQcmltYXJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkU3RyaW5nKCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoY29tcGFueU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY29tcGFueU5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGRlcGFydG1lbnROYW1lKSkgewotICAgICAgICAgICAgICAgIGlmIChidWlsZGVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZGVwYXJ0bWVudE5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHRpdGxlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHRpdGxlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAidHlwZTogJWQsIGNvbXBhbnk6ICVzLCBkZXBhcnRtZW50OiAlcywgdGl0bGU6ICVzLCBpc1ByaW1hcnk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgY29tcGFueU5hbWUsIGRlcGFydG1lbnROYW1lLCB0aXRsZU5hbWUsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltRGF0YSB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgcHJvdG9jb2w7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY3VzdG9tUHJvdG9jb2w7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBkYXRhOwotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnk7Ci0KLSAgICAgICAgcHVibGljIEltRGF0YShmaW5hbCBpbnQgcHJvdG9jb2wsIGZpbmFsIFN0cmluZyBjdXN0b21Qcm90b2NvbCwgZmluYWwgaW50IHR5cGUsCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRhdGEsIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7Ci0gICAgICAgICAgICB0aGlzLmN1c3RvbVByb3RvY29sID0gY3VzdG9tUHJvdG9jb2w7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKLSAgICAgICAgICAgIHRoaXMuaXNQcmltYXJ5ID0gaXNQcmltYXJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBJbURhdGEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSW1EYXRhIGltRGF0YSA9IChJbURhdGEpb2JqOwotICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IGltRGF0YS50eXBlICYmIHByb3RvY29sID09IGltRGF0YS5wcm90b2NvbAotICAgICAgICAgICAgICAgICAgICAmJiAoY3VzdG9tUHJvdG9jb2wgIT0gbnVsbCA/IGN1c3RvbVByb3RvY29sLmVxdWFscyhpbURhdGEuY3VzdG9tUHJvdG9jb2wpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbURhdGEuY3VzdG9tUHJvdG9jb2wgPT0gbnVsbCkpCi0gICAgICAgICAgICAgICAgICAgICYmIChkYXRhICE9IG51bGwgPyBkYXRhLmVxdWFscyhpbURhdGEuZGF0YSkgOiAoaW1EYXRhLmRhdGEgPT0gbnVsbCkpCi0gICAgICAgICAgICAgICAgICAgICYmIGlzUHJpbWFyeSA9PSBpbURhdGEuaXNQcmltYXJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJ0eXBlOiAlZCwgcHJvdG9jb2w6ICVkLCBjdXN0b21fcHJvdGNvbDogJXMsIGRhdGE6ICVzLCBpc1ByaW1hcnk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgcHJvdG9jb2wsIGN1c3RvbVByb3RvY29sLCBkYXRhLCBpc1ByaW1hcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBQaG90b0RhdGEgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfRkxBU0ggPSAiU1dGIjsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCB0eXBlOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGZvcm1hdE5hbWU7ICAvLyB1c2VkIHdoZW4gdHlwZSBpcyBub3QgZGVmaW5lZCBpbiBDb250YWN0c0NvbnRyYWN0LgotICAgICAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIHBob3RvQnl0ZXM7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzUHJpbWFyeTsKLQotICAgICAgICBwdWJsaWMgUGhvdG9EYXRhKGludCB0eXBlLCBTdHJpbmcgZm9ybWF0TmFtZSwgYnl0ZVtdIHBob3RvQnl0ZXMsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgdGhpcy5mb3JtYXROYW1lID0gZm9ybWF0TmFtZTsKLSAgICAgICAgICAgIHRoaXMucGhvdG9CeXRlcyA9IHBob3RvQnl0ZXM7Ci0gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUGhvdG9EYXRhKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFBob3RvRGF0YSBwaG90b0RhdGEgPSAoUGhvdG9EYXRhKW9iajsKLSAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBwaG90b0RhdGEudHlwZSAmJgotICAgICAgICAgICAgICAgICAgICAoZm9ybWF0TmFtZSA9PSBudWxsID8gKHBob3RvRGF0YS5mb3JtYXROYW1lID09IG51bGwpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXROYW1lLmVxdWFscyhwaG90b0RhdGEuZm9ybWF0TmFtZSkpICYmCi0gICAgICAgICAgICAgICAgICAgIChBcnJheXMuZXF1YWxzKHBob3RvQnl0ZXMsIHBob3RvRGF0YS5waG90b0J5dGVzKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKGlzUHJpbWFyeSA9PSBwaG90b0RhdGEuaXNQcmltYXJ5KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ0eXBlOiAlZCwgZm9ybWF0OiAlczogc2l6ZTogJWQsIGlzUHJpbWFyeTogJXMiLAotICAgICAgICAgICAgICAgICAgICB0eXBlLCBmb3JtYXROYW1lLCBwaG90b0J5dGVzLmxlbmd0aCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGNsYXNzIFByb3BlcnR5IHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVByb3BlcnR5TmFtZTsKLSAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IG1QYXJhbWV0ZXJNYXAgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+KCk7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1Qcm9wZXJ0eVZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBwcml2YXRlIGJ5dGVbXSBtUHJvcGVydHlCeXRlczsKLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eU5hbWUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICAgICAgbVByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihmaW5hbCBTdHJpbmcgcGFyYW1OYW1lLCBmaW5hbCBTdHJpbmcgcGFyYW1WYWx1ZSkgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHZhbHVlczsKLSAgICAgICAgICAgIGlmICghbVBhcmFtZXRlck1hcC5jb250YWluc0tleShwYXJhbU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmFtTmFtZS5lcXVhbHMoIlRZUEUiKSkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJNYXAucHV0KHBhcmFtTmFtZSwgdmFsdWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVzID0gbVBhcmFtZXRlck1hcC5nZXQocGFyYW1OYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbHVlcy5hZGQocGFyYW1WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRUb1Byb3BlcnR5VmFsdWVMaXN0KGZpbmFsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0gICAgICAgICAgICBtUHJvcGVydHlWYWx1ZUxpc3QuYWRkKHByb3BlcnR5VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlCeXRlcyhmaW5hbCBieXRlW10gcHJvcGVydHlCeXRlcykgewotICAgICAgICAgICAgbVByb3BlcnR5Qnl0ZXMgPSBwcm9wZXJ0eUJ5dGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBnZXRQYXJhbWV0ZXJzKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBhcmFtZXRlck1hcC5nZXQodHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgZmluYWwgTGlzdDxTdHJpbmc+IGdldFByb3BlcnR5VmFsdWVMaXN0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm9wZXJ0eVZhbHVlTGlzdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgbVByb3BlcnR5TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICBtUGFyYW1ldGVyTWFwLmNsZWFyKCk7Ci0gICAgICAgICAgICBtUHJvcGVydHlWYWx1ZUxpc3QuY2xlYXIoKTsKLSAgICAgICAgICAgIG1Qcm9wZXJ0eUJ5dGVzID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRPRE8oZG1peWFrYXdhKTogdkNhcmQgNC4wIGxvZ2ljYWxseSBoYXMgbXVsdGlwbGUgZm9ybWF0dGVkIG5hbWVzIGFuZCB3ZSBuZWVkIHRvCi0gICAgLy8gc2VsZWN0IHRoZSBtb3N0IHByZWZlcmFibGUgb25lIHVzaW5nIFBSRUYgcGFyYW1ldGVyLgotICAgIC8vCi0gICAgLy8gZS5nLiAoYmFzZWQgb24gcmV2LjEzKQotICAgIC8vIEZOO1BSRUY9MTpKb2huIE0uIERvZQotICAgIC8vIEZOO1BSRUY9MjpKb2huIERvZQotICAgIC8vIEZOO1BSRUY9MztKb2huCi0KLSAgICBwcml2YXRlIFN0cmluZyBtRmFtaWx5TmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtR2l2ZW5OYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1NaWRkbGVOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1QcmVmaXg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVN1ZmZpeDsKLQotICAgIC8vIFVzZWQgb25seSB3aGVuIG5vIGZhbWlseSBub3IgZ2l2ZW4gbmFtZSBpcyBmb3VuZC4KLSAgICBwcml2YXRlIFN0cmluZyBtRm9ybWF0dGVkTmFtZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1QaG9uZXRpY0ZhbWlseU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVBob25ldGljR2l2ZW5OYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1QaG9uZXRpY01pZGRsZU5hbWU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtUGhvbmV0aWNGdWxsTmFtZTsKLQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1OaWNrTmFtZUxpc3Q7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtRGlzcGxheU5hbWU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtQmlydGhkYXk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUFubml2ZXJzYXJ5OwotCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbU5vdGVMaXN0OwotICAgIHByaXZhdGUgTGlzdDxQaG9uZURhdGE+IG1QaG9uZUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PEVtYWlsRGF0YT4gbUVtYWlsTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8UG9zdGFsRGF0YT4gbVBvc3RhbExpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PE9yZ2FuaXphdGlvbkRhdGE+IG1Pcmdhbml6YXRpb25MaXN0OwotICAgIHByaXZhdGUgTGlzdDxJbURhdGE+IG1JbUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFBob3RvRGF0YT4gbVBob3RvTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtV2Vic2l0ZUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PExpc3Q8U3RyaW5nPj4gbUFuZHJvaWRDdXN0b21Qcm9wZXJ0eUxpc3Q7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBtVkNhcmRUeXBlOwotICAgIHByaXZhdGUgZmluYWwgQWNjb3VudCBtQWNjb3VudDsKLQotICAgIHB1YmxpYyBWQ2FyZEVudHJ5KCkgewotICAgICAgICB0aGlzKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUMpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEVudHJ5KGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgdGhpcyh2Y2FyZFR5cGUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEVudHJ5KGludCB2Y2FyZFR5cGUsIEFjY291bnQgYWNjb3VudCkgewotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotICAgICAgICBtQWNjb3VudCA9IGFjY291bnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFBob25lKGludCB0eXBlLCBTdHJpbmcgZGF0YSwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICBpZiAobVBob25lTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtUGhvbmVMaXN0ID0gbmV3IEFycmF5TGlzdDxQaG9uZURhdGE+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHRyaW1lZCA9IGRhdGEudHJpbSgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybWF0dGVkTnVtYmVyOwotICAgICAgICBpZiAodHlwZSA9PSBQaG9uZS5UWVBFX1BBR0VSIHx8IFZDYXJkQ29uZmlnLnJlZnJhaW5QaG9uZU51bWJlckZvcm1hdHRpbmcobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIGZvcm1hdHRlZE51bWJlciA9IHRyaW1lZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB0cmltZWQubGVuZ3RoKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBjaCA9IHRyaW1lZC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKCgnMCcgPD0gY2ggJiYgY2ggPD0gJzknKSB8fCAoaSA9PSAwICYmIGNoID09ICcrJykpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgaW50IGZvcm1hdHRpbmdUeXBlID0gVkNhcmRVdGlscy5nZXRQaG9uZU51bWJlckZvcm1hdChtVkNhcmRUeXBlKTsKLSAgICAgICAgICAgIGZvcm1hdHRlZE51bWJlciA9IFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyKGJ1aWxkZXIudG9TdHJpbmcoKSwgZm9ybWF0dGluZ1R5cGUpOwotICAgICAgICB9Ci0gICAgICAgIFBob25lRGF0YSBwaG9uZURhdGEgPSBuZXcgUGhvbmVEYXRhKHR5cGUsIGZvcm1hdHRlZE51bWJlciwgbGFiZWwsIGlzUHJpbWFyeSk7Ci0gICAgICAgIG1QaG9uZUxpc3QuYWRkKHBob25lRGF0YSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE5pY2tOYW1lKGZpbmFsIFN0cmluZyBuaWNrTmFtZSkgewotICAgICAgICBpZiAobU5pY2tOYW1lTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTmlja05hbWVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbU5pY2tOYW1lTGlzdC5hZGQobmlja05hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRFbWFpbChpbnQgdHlwZSwgU3RyaW5nIGRhdGEsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBpc1ByaW1hcnkpewotICAgICAgICBpZiAobUVtYWlsTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtRW1haWxMaXN0ID0gbmV3IEFycmF5TGlzdDxFbWFpbERhdGE+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUVtYWlsTGlzdC5hZGQobmV3IEVtYWlsRGF0YSh0eXBlLCBkYXRhLCBsYWJlbCwgaXNQcmltYXJ5KSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFBvc3RhbChpbnQgdHlwZSwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBpc1ByaW1hcnkpewotICAgICAgICBpZiAobVBvc3RhbExpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbVBvc3RhbExpc3QgPSBuZXcgQXJyYXlMaXN0PFBvc3RhbERhdGE+KDApOwotICAgICAgICB9Ci0gICAgICAgIG1Qb3N0YWxMaXN0LmFkZChuZXcgUG9zdGFsRGF0YSh0eXBlLCBwcm9wVmFsdWVMaXN0LCBsYWJlbCwgaXNQcmltYXJ5KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdWxkIGJlIGNhbGxlZCB2aWEge0BsaW5rICNoYW5kbGVPcmdWYWx1ZShpbnQsIExpc3QsIE1hcCwgYm9vbGVhbikgb3IKLSAgICAgKiB7QGxpbmsgI2hhbmRsZVRpdGxlVmFsdWUoU3RyaW5nKX0uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE5ld09yZ2FuaXphdGlvbihpbnQgdHlwZSwgZmluYWwgU3RyaW5nIGNvbXBhbnlOYW1lLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlcGFydG1lbnROYW1lLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRpdGxlTmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY05hbWUsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICBpZiAobU9yZ2FuaXphdGlvbkxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbU9yZ2FuaXphdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0PE9yZ2FuaXphdGlvbkRhdGE+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbU9yZ2FuaXphdGlvbkxpc3QuYWRkKG5ldyBPcmdhbml6YXRpb25EYXRhKHR5cGUsIGNvbXBhbnlOYW1lLAotICAgICAgICAgICAgICAgIGRlcGFydG1lbnROYW1lLCB0aXRsZU5hbWUsIHBob25ldGljTmFtZSwgaXNQcmltYXJ5KSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IHNFbXB0eUxpc3QgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChuZXcgQXJyYXlMaXN0PFN0cmluZz4oMCkpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgYnVpbGRTaW5nbGVQaG9uZXRpY05hbWVGcm9tU29ydEFzUGFyYW0oTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PiBwYXJhbU1hcCkgewotICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gc29ydEFzQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9TT1JUX0FTKTsKLSAgICAgICAgaWYgKHNvcnRBc0NvbGxlY3Rpb24gIT0gbnVsbCAmJiBzb3J0QXNDb2xsZWN0aW9uLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoc29ydEFzQ29sbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkluY29ycmVjdCBtdWx0aXBsZSBTT1JUX0FTIHBhcmFtZXRlcnMgZGV0ZWN0ZWQ6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKHNvcnRBc0NvbGxlY3Rpb24udG9BcnJheSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gc29ydE5hbWVzID0KLSAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb25zdHJ1Y3RMaXN0RnJvbVZhbHVlKHNvcnRBc0NvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZDYXJkVHlwZSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgZWxlbSA6IHNvcnROYW1lcykgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGVsZW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0ICJPUkciIHJlbGF0ZWQgdmFsdWVzIHRvIHRoZSBhcHByb3ByaWF0ZSBkYXRhLiBJZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUKLSAgICAgKiB7QGxpbmsgT3JnYW5pemF0aW9uRGF0YX0gb2JqZWN0cywgdGhpcyBpbnB1dCBkYXRhIGFyZSBhdHRhY2hlZCB0byB0aGUgbGFzdCBvbmUgd2hpY2gKLSAgICAgKiBkb2VzIG5vdCBoYXZlIHZhbGlkIHZhbHVlcyAobm90IGluY2x1ZGluZyBlbXB0eSBidXQgb25seSBudWxsKS4gSWYgdGhlcmUncyBubwotICAgICAqIHtAbGluayBPcmdhbml6YXRpb25EYXRhfSBvYmplY3QsIGEgbmV3IHtAbGluayBPcmdhbml6YXRpb25EYXRhfSBpcyBjcmVhdGVkLAotICAgICAqIHdob3NlIHRpdGxlIGlzIHNldCB0byBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVPcmdWYWx1ZShmaW5hbCBpbnQgdHlwZSwgTGlzdDxTdHJpbmc+IG9yZ0xpc3QsCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IHBhcmFtTWFwLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNOYW1lID0gYnVpbGRTaW5nbGVQaG9uZXRpY05hbWVGcm9tU29ydEFzUGFyYW0ocGFyYW1NYXApOwotICAgICAgICBpZiAob3JnTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvcmdMaXN0ID0gc0VtcHR5TGlzdDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmcgY29tcGFueU5hbWU7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkZXBhcnRtZW50TmFtZTsKLSAgICAgICAgZmluYWwgaW50IHNpemUgPSBvcmdMaXN0LnNpemUoKTsKLSAgICAgICAgc3dpdGNoIChzaXplKSB7Ci0gICAgICAgICAgICBjYXNlIDA6IHsKLSAgICAgICAgICAgICAgICBjb21wYW55TmFtZSA9ICIiOwotICAgICAgICAgICAgICAgIGRlcGFydG1lbnROYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgMTogewotICAgICAgICAgICAgICAgIGNvbXBhbnlOYW1lID0gb3JnTGlzdC5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgZGVwYXJ0bWVudE5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDogeyAgLy8gTW9yZSB0aGFuIDEuCi0gICAgICAgICAgICAgICAgY29tcGFueU5hbWUgPSBvcmdMaXN0LmdldCgwKTsKLSAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3Qgc3VyZSB3aGljaCBpcyB0aGUgY29ycmVjdCBzdHJpbmcgZm9yIGRlcGFydG1lbnQuCi0gICAgICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8ga2VlcCBhbGwgdGhlIGRhdGEsIGNvbmNhdGluYXRlIHRoZSByZXN0IG9mIGVsZW1lbnRzLgotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG9yZ0xpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVwYXJ0bWVudE5hbWUgPSBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Pcmdhbml6YXRpb25MaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgZmlyc3Qgb3JnYW5pemF0aW9uIGVudHJ5LCB3aXRoICJudWxsIiB0aXRsZSB3aGljaCBtYXkgYmUKLSAgICAgICAgICAgIC8vIGFkZGVkIHZpYSBoYW5kbGVUaXRsZVZhbHVlKCkuCi0gICAgICAgICAgICBhZGROZXdPcmdhbml6YXRpb24odHlwZSwgY29tcGFueU5hbWUsIGRlcGFydG1lbnROYW1lLCBudWxsLCBwaG9uZXRpY05hbWUsIGlzUHJpbWFyeSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChPcmdhbml6YXRpb25EYXRhIG9yZ2FuaXphdGlvbkRhdGEgOiBtT3JnYW5pemF0aW9uTGlzdCkgewotICAgICAgICAgICAgLy8gTm90IHVzZSBUZXh0VXRpbHMuaXNFbXB0eSgpIHNpbmNlIE9SRyB3YXMgc2V0IGJ1dCB0aGUgZWxlbWVudHMgbWlnaHQgYmUgZW1wdHkuCi0gICAgICAgICAgICAvLyBlLmcuICJPUkc7UFJFRjo7IiAtPiBCb3RoIGNvbXBhbnlOYW1lIGFuZCBkZXBhcnRtZW50TmFtZSBiZWNvbWUgZW1wdHkgYnV0IG5vdCBudWxsLgotICAgICAgICAgICAgaWYgKG9yZ2FuaXphdGlvbkRhdGEuY29tcGFueU5hbWUgPT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25EYXRhLmRlcGFydG1lbnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBQcm9iYWJseSB0aGUgIlRJVExFIiBwcm9wZXJ0eSBjb21lcyBiZWZvcmUgdGhlICJPUkciIHByb3BlcnR5IHZpYQotICAgICAgICAgICAgICAgIC8vIGhhbmRsZVRpdGxlTGluZSgpLgotICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbkRhdGEuY29tcGFueU5hbWUgPSBjb21wYW55TmFtZTsKLSAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25EYXRhLmRlcGFydG1lbnROYW1lID0gZGVwYXJ0bWVudE5hbWU7Ci0gICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uRGF0YS5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE5vIE9yZ2FuaXphdGlvRGF0YSBpcyBhdmFpbGFibGUuIENyZWF0ZSBhbm90aGVyIG9uZSwgd2l0aCAibnVsbCIgdGl0bGUsIHdoaWNoIG1heSBiZQotICAgICAgICAvLyBhZGRlZCB2aWEgaGFuZGxlVGl0bGVWYWx1ZSgpLgotICAgICAgICBhZGROZXdPcmdhbml6YXRpb24odHlwZSwgY29tcGFueU5hbWUsIGRlcGFydG1lbnROYW1lLCBudWxsLCBwaG9uZXRpY05hbWUsIGlzUHJpbWFyeSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0ICJ0aXRsZSIgdmFsdWUgdG8gdGhlIGFwcHJvcHJpYXRlIGRhdGEuIElmIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZQotICAgICAqIE9yZ2FuaXphdGlvbkRhdGEgb2JqZWN0cywgdGhpcyBpbnB1dCBpcyBhdHRhY2hlZCB0byB0aGUgbGFzdCBvbmUgd2hpY2ggZG9lcyBub3QKLSAgICAgKiBoYXZlIHZhbGlkIHRpdGxlIHZhbHVlIChub3QgaW5jbHVkaW5nIGVtcHR5IGJ1dCBvbmx5IG51bGwpLiBJZiB0aGVyZSdzIG5vCi0gICAgICogT3JnYW5pemF0aW9uRGF0YSBvYmplY3QsIGEgbmV3IE9yZ2FuaXphdGlvbkRhdGEgaXMgY3JlYXRlZCwgd2hvc2UgY29tcGFueSBuYW1lIGlzCi0gICAgICogc2V0IHRvIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRpdGxlVmFsdWUoZmluYWwgU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIGlmIChtT3JnYW5pemF0aW9uTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGZpcnN0IG9yZ2FuaXphdGlvbiBlbnRyeSwgd2l0aCAibnVsbCIgb3RoZXIgaW5mbywgd2hpY2ggbWF5IGJlCi0gICAgICAgICAgICAvLyBhZGRlZCB2aWEgaGFuZGxlT3JnVmFsdWUoKS4KLSAgICAgICAgICAgIGFkZE5ld09yZ2FuaXphdGlvbihERUZBVUxUX09SR0FOSVpBVElPTl9UWVBFLCBudWxsLCBudWxsLCB0aXRsZSwgbnVsbCwgZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoT3JnYW5pemF0aW9uRGF0YSBvcmdhbml6YXRpb25EYXRhIDogbU9yZ2FuaXphdGlvbkxpc3QpIHsKLSAgICAgICAgICAgIGlmIChvcmdhbml6YXRpb25EYXRhLnRpdGxlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uRGF0YS50aXRsZU5hbWUgPSB0aXRsZTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTm8gT3JnYW5pemF0aW9uIGlzIGF2YWlsYWJsZS4gQ3JlYXRlIGFub3RoZXIgb25lLCB3aXRoICJudWxsIiBvdGhlciBpbmZvLCB3aGljaCBtYXkgYmUKLSAgICAgICAgLy8gYWRkZWQgdmlhIGhhbmRsZU9yZ1ZhbHVlKCkuCi0gICAgICAgIGFkZE5ld09yZ2FuaXphdGlvbihERUZBVUxUX09SR0FOSVpBVElPTl9UWVBFLCBudWxsLCBudWxsLCB0aXRsZSwgbnVsbCwgZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRJbShpbnQgcHJvdG9jb2wsIFN0cmluZyBjdXN0b21Qcm90b2NvbCwgaW50IHR5cGUsCi0gICAgICAgICAgICBTdHJpbmcgcHJvcFZhbHVlLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICBpZiAobUltTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtSW1MaXN0ID0gbmV3IEFycmF5TGlzdDxJbURhdGE+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUltTGlzdC5hZGQobmV3IEltRGF0YShwcm90b2NvbCwgY3VzdG9tUHJvdG9jb2wsIHR5cGUsIHByb3BWYWx1ZSwgaXNQcmltYXJ5KSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE5vdGUoZmluYWwgU3RyaW5nIG5vdGUpIHsKLSAgICAgICAgaWYgKG1Ob3RlTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTm90ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMSk7Ci0gICAgICAgIH0KLSAgICAgICAgbU5vdGVMaXN0LmFkZChub3RlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUGhvdG9CeXRlcyhTdHJpbmcgZm9ybWF0TmFtZSwgYnl0ZVtdIHBob3RvQnl0ZXMsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIGlmIChtUGhvdG9MaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1QaG90b0xpc3QgPSBuZXcgQXJyYXlMaXN0PFBob3RvRGF0YT4oMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgUGhvdG9EYXRhIHBob3RvRGF0YSA9IG5ldyBQaG90b0RhdGEoMCwgbnVsbCwgcGhvdG9CeXRlcywgaXNQcmltYXJ5KTsKLSAgICAgICAgbVBob3RvTGlzdC5hZGQocGhvdG9EYXRhKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUcmllcyB0byBleHRyYWN0IHBhcmFtTWFwLCBjb25zdHJ1Y3RzIFNPUlQtQVMgcGFyYW1ldGVyIHZhbHVlcywgYW5kIHN0b3JlIHRoZW0gaW4KLSAgICAgKiBhcHByb3ByaWF0ZSBwaG9uZXRpYyBuYW1lIHZhcmlhYmxlcy4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGNhcmUgdGhlIHZDYXJkIHZlcnNpb24uIEV2ZW4gd2hlbiB3ZSBoYXZlIFNPUlQtQVMgcGFyYW1ldGVycyBpbgotICAgICAqIGludmFsaWQgdmVyc2lvbnMgKGkuZS4gMi4xIGFuZCAzLjApLCB3ZSBzY2lsZW50bHkgYWNjZXB0IHRoZW0gc28gdGhhdCB3ZSB3b24ndCBkcm9wCi0gICAgICogbWVhbmluZ2Z1bCBpbmZvcm1hdGlvbi4gSWYgd2UgaGFkIHRoaXMgcGFyYW1ldGVyIGluIHRoZSBOIGZpZWxkIG9mIHZDYXJkIDMuMCwgYW5kCi0gICAgICogdGhlIGNvbnRhY3QgZGF0YSBhbHNvIGhhdmUgU09SVC1TVFJJTkcsIHdlIHdpbGwgcHJlZmVyIFNPUlQtU1RSSU5HLCBzaW5jZSBpdCBpcwotICAgICAqIHJlZ2l0aW1hdGUgcHJvcGVydHkgdG8gYmUgdW5kZXJzdG9vZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdHJ5SGFuZGxlU29ydEFzTmFtZShmaW5hbCBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IHBhcmFtTWFwKSB7Ci0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMChtVkNhcmRUeXBlKSAmJgotICAgICAgICAgICAgICAgICEoVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljRmFtaWx5TmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY01pZGRsZU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNHaXZlbk5hbWUpKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHNvcnRBc0NvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fU09SVF9BUyk7Ci0gICAgICAgIGlmIChzb3J0QXNDb2xsZWN0aW9uICE9IG51bGwgJiYgc29ydEFzQ29sbGVjdGlvbi5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgaWYgKHNvcnRBc0NvbGxlY3Rpb24uc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJJbmNvcnJlY3QgbXVsdGlwbGUgU09SVF9BUyBwYXJhbWV0ZXJzIGRldGVjdGVkOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhzb3J0QXNDb2xsZWN0aW9uLnRvQXJyYXkoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHNvcnROYW1lcyA9Ci0gICAgICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29uc3RydWN0TGlzdEZyb21WYWx1ZShzb3J0QXNDb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WQ2FyZFR5cGUpOwotICAgICAgICAgICAgaW50IHNpemUgPSBzb3J0TmFtZXMuc2l6ZSgpOwotICAgICAgICAgICAgaWYgKHNpemUgPiAzKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZSA9IDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKHNpemUpIHsKLSAgICAgICAgICAgIGNhc2UgMzogbVBob25ldGljTWlkZGxlTmFtZSA9IHNvcnROYW1lcy5nZXQoMik7IC8vJEZBTEwtVEhST1VHSCQKLSAgICAgICAgICAgIGNhc2UgMjogbVBob25ldGljR2l2ZW5OYW1lID0gc29ydE5hbWVzLmdldCgxKTsgLy8kRkFMTC1USFJPVUdIJAotICAgICAgICAgICAgZGVmYXVsdDogbVBob25ldGljRmFtaWx5TmFtZSA9IHNvcnROYW1lcy5nZXQoMCk7IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImZhbGx0aHJvdWdoIikKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlTlByb3BlcnR5KGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbVZhbHVlcywKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248U3RyaW5nPj4gcGFyYW1NYXApIHsKLSAgICAgICAgLy8gaW4gdkNhcmQgNC4wLCBTT1JULUFTIHBhcmFtZXRlciBpcyBhdmFpbGFibGUuCi0gICAgICAgIHRyeUhhbmRsZVNvcnRBc05hbWUocGFyYW1NYXApOwotCi0gICAgICAgIC8vIEZhbWlseSwgR2l2ZW4sIE1pZGRsZSwgUHJlZml4LCBTdWZmaXguICgxIC0gNSkKLSAgICAgICAgaW50IHNpemU7Ci0gICAgICAgIGlmIChwYXJhbVZhbHVlcyA9PSBudWxsIHx8IChzaXplID0gcGFyYW1WYWx1ZXMuc2l6ZSgpKSA8IDEpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2l6ZSA+IDUpIHsKLSAgICAgICAgICAgIHNpemUgPSA1OwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChzaXplKSB7Ci0gICAgICAgIC8vIEZhbGwtdGhyb3VnaC4KLSAgICAgICAgY2FzZSA1OiBtU3VmZml4ID0gcGFyYW1WYWx1ZXMuZ2V0KDQpOwotICAgICAgICBjYXNlIDQ6IG1QcmVmaXggPSBwYXJhbVZhbHVlcy5nZXQoMyk7Ci0gICAgICAgIGNhc2UgMzogbU1pZGRsZU5hbWUgPSBwYXJhbVZhbHVlcy5nZXQoMik7Ci0gICAgICAgIGNhc2UgMjogbUdpdmVuTmFtZSA9IHBhcmFtVmFsdWVzLmdldCgxKTsKLSAgICAgICAgZGVmYXVsdDogbUZhbWlseU5hbWUgPSBwYXJhbVZhbHVlcy5nZXQoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RlOiBTb21lIEphcGFuZXNlIG1vYmlsZSBwaG9uZXMgdXNlIHRoaXMgZmllbGQgZm9yIHBob25ldGljIG5hbWUsCi0gICAgICogICAgICAgc2luY2UgdkNhcmQgMi4xIGRvZXMgbm90IGhhdmUgIlNPUlQtU1RSSU5HIiB0eXBlLgotICAgICAqICAgICAgIEFsc28sIGluIHNvbWUgY2FzZXMsIHRoZSBmaWVsZCBoYXMgc29tZSAnOydzIGluIGl0LgotICAgICAqICAgICAgIEFzc3VtZSB0aGUgJzsnIG1lYW5zIHRoZSBzYW1lIG1lYW5pbmcgaW4gTiBwcm9wZXJ0eQotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJmYWxsdGhyb3VnaCIpCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVBob25ldGljTmFtZUZyb21Tb3VuZChMaXN0PFN0cmluZz4gZWxlbXMpIHsKLSAgICAgICAgaWYgKCEoVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljRmFtaWx5TmFtZSkgJiYKLSAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNNaWRkbGVOYW1lKSAmJgotICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0dpdmVuTmFtZSkpKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoZSBvdGhlciBwcm9wZXJ0aWVzIGxpa2UgIlgtUEhPTkVUSUMtRklSU1QtTkFNRSIgd2FzIGFscmVhZHkgZm91bmQuCi0gICAgICAgICAgICAvLyBJZ25vcmUgIlNPVU5EO1gtSVJNQy1OIi4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzaXplOwotICAgICAgICBpZiAoZWxlbXMgPT0gbnVsbCB8fCAoc2l6ZSA9IGVsZW1zLnNpemUoKSkgPCAxKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBc3N1bWUgdGhhdCB0aGUgb3JkZXIgaXMgIkZhbWlseSwgR2l2ZW4sIE1pZGRsZSIuCi0gICAgICAgIC8vIFRoaXMgaXMgbm90IGZyb20gc3BlY2lmaWNhdGlvbiBidXQgbWVyZSBhc3N1bXB0aW9uLiBTb21lIEphcGFuZXNlIHBob25lcyB1c2UgdGhpcyBvcmRlci4KLSAgICAgICAgaWYgKHNpemUgPiAzKSB7Ci0gICAgICAgICAgICBzaXplID0gMzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbGVtcy5nZXQoMCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBib29sZWFuIG9ubHlGaXJzdEVsZW1Jc05vbkVtcHR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1zLmdldChpKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgb25seUZpcnN0RWxlbUlzTm9uRW1wdHkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG9ubHlGaXJzdEVsZW1Jc05vbkVtcHR5KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gbmFtZXNBcnJheSA9IGVsZW1zLmdldCgwKS5zcGxpdCgiICIpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBuYW1lQXJyYXlMZW5ndGggPSBuYW1lc0FycmF5Lmxlbmd0aDsKLSAgICAgICAgICAgICAgICBpZiAobmFtZUFycmF5TGVuZ3RoID09IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIHRoZSBzdHJpbmcgaXMgIkZhbWlseSBNaWRkbGUgR2l2ZW4iLgotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNGYW1pbHlOYW1lID0gbmFtZXNBcnJheVswXTsKLSAgICAgICAgICAgICAgICAgICAgbVBob25ldGljTWlkZGxlTmFtZSA9IG5hbWVzQXJyYXlbMV07Ci0gICAgICAgICAgICAgICAgICAgIG1QaG9uZXRpY0dpdmVuTmFtZSA9IG5hbWVzQXJyYXlbMl07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lQXJyYXlMZW5ndGggPT0gMikgewotICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhlIHN0cmluZyBpcyAiRmFtaWx5IEdpdmVuIiBiYXNlZCBvbiB0aGUgSmFwYW5lc2UgbW9iaWxlCi0gICAgICAgICAgICAgICAgICAgIC8vIHBob25lcycgcHJlZmVyZW5jZS4KLSAgICAgICAgICAgICAgICAgICAgbVBob25ldGljRmFtaWx5TmFtZSA9IG5hbWVzQXJyYXlbMF07Ci0gICAgICAgICAgICAgICAgICAgIG1QaG9uZXRpY0dpdmVuTmFtZSA9IG5hbWVzQXJyYXlbMV07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVBob25ldGljRnVsbE5hbWUgPSBlbGVtcy5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoc2l6ZSkgewotICAgICAgICAgICAgLy8gZmFsbHRocm91Z2gKLSAgICAgICAgICAgIGNhc2UgMzogbVBob25ldGljTWlkZGxlTmFtZSA9IGVsZW1zLmdldCgyKTsKLSAgICAgICAgICAgIGNhc2UgMjogbVBob25ldGljR2l2ZW5OYW1lID0gZWxlbXMuZ2V0KDEpOwotICAgICAgICAgICAgZGVmYXVsdDogbVBob25ldGljRmFtaWx5TmFtZSA9IGVsZW1zLmdldCgwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5KGZpbmFsIFByb3BlcnR5IHByb3BlcnR5KSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5Lm1Qcm9wZXJ0eU5hbWU7Ci0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248U3RyaW5nPj4gcGFyYW1NYXAgPSBwcm9wZXJ0eS5tUGFyYW1ldGVyTWFwOwotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCA9IHByb3BlcnR5Lm1Qcm9wZXJ0eVZhbHVlTGlzdDsKLSAgICAgICAgYnl0ZVtdIHByb3BCeXRlcyA9IHByb3BlcnR5Lm1Qcm9wZXJ0eUJ5dGVzOwotCi0gICAgICAgIGlmIChwcm9wVmFsdWVMaXN0LnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nIHByb3BWYWx1ZSA9IGxpc3RUb1N0cmluZyhwcm9wVmFsdWVMaXN0KS50cmltKCk7Ci0KLSAgICAgICAgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9WRVJTSU9OKSkgewotICAgICAgICAgICAgLy8gdkNhcmQgdmVyc2lvbi4gSWdub3JlIHRoaXMuCi0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0ZOKSkgewotICAgICAgICAgICAgbUZvcm1hdHRlZE5hbWUgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX05BTUUpICYmIG1Gb3JtYXR0ZWROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIE9ubHkgaW4gdkNhcmQgMy4wLiBVc2UgdGhpcyBpZiBGTiwgd2hpY2ggbXVzdCBleGlzdCBpbiB2Q2FyZCAzLjAgYnV0IG1heSBub3QKLSAgICAgICAgICAgIC8vIGFjdHVhbGx5IGV4aXN0IGluIHRoZSByZWFsIHZDYXJkIGRhdGEsIGRvZXMgbm90IGV4aXN0LgotICAgICAgICAgICAgbUZvcm1hdHRlZE5hbWUgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04pKSB7Ci0gICAgICAgICAgICBoYW5kbGVOUHJvcGVydHkocHJvcFZhbHVlTGlzdCwgcGFyYW1NYXApOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9TT1JUX1NUUklORykpIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY0Z1bGxOYW1lID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OSUNLTkFNRSkgfHwKLSAgICAgICAgICAgICAgICBwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuSW1wb3J0T25seS5QUk9QRVJUWV9YX05JQ0tOQU1FKSkgewotICAgICAgICAgICAgYWRkTmlja05hbWUocHJvcFZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfU09VTkQpKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiB0eXBlQ29sbGVjdGlvbi5jb250YWlucyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1hfSVJNQ19OKSkgewotICAgICAgICAgICAgICAgIC8vIEFzIG9mIDIwMDktMTAtMDgsIFBhcnNlciBzaWRlIGRvZXMgbm90IHNwbGl0IGEgcHJvcGVydHkgdmFsdWUgaW50byBzZXBhcmF0ZWQKLSAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgdXNpbmcgJzsnIChpbiBvdGhlciB3b3JkcywgcHJvcFZhbHVlTGlzdC5zaXplKCkgPT0gMSksCi0gICAgICAgICAgICAgICAgLy8gd2hpY2ggaXMgY29ycmVjdCBiZWhhdmlvciBmcm9tIHRoZSB2aWV3IG9mIHZDYXJkIDIuMS4KLSAgICAgICAgICAgICAgICAvLyBCdXQgd2Ugd2FudCBpdCB0byBiZSBzZXBhcmF0ZWQsIHNvIGRvIHRoZSBzZXBhcmF0aW9uIGhlcmUuCi0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBob25ldGljTmFtZUxpc3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb25zdHJ1Y3RMaXN0RnJvbVZhbHVlKHByb3BWYWx1ZSwgbVZDYXJkVHlwZSk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlUGhvbmV0aWNOYW1lRnJvbVNvdW5kKHBob25ldGljTmFtZUxpc3QpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBJZ25vcmUgdGhpcyBmaWVsZCBzaW5jZSBBbmRyb2lkIGNhbm5vdCB1bmRlcnN0YW5kIHdoYXQgaXQgaXMuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0FEUikpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gdmFsdWVzQXJlQWxsRW1wdHkgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiBwcm9wVmFsdWVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZXNBcmVBbGxFbXB0eSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmFsdWVzQXJlQWxsRW1wdHkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCB0eXBlID0gLTE7Ci0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSAiIjsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNQcmltYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGVTdHJpbmcgOiB0eXBlQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nID0gdHlwZVN0cmluZy50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICIiOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nLmVxdWFsc0lnbm9yZUNhc2UoVkNhcmRDb25zdGFudHMuUEFSQU1fRVhUUkFfVFlQRV9DT01QQU5ZKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gIkNPTVBBTlkiIHNlZW1zIGVtaXR0ZWQgYnkgV2luZG93cyBNb2JpbGUsIHdoaWNoIGlzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lmaWNhbGx5IHN1cHBvcnRlZCBieSB2Q2FyZCAyLjEuIFdlIGFzc3VtZSB0aGlzIGlzIHNhbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzICJXT1JLIi4KLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fQURSX1RZUEVfUEFSQ0VMKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX0FEUl9UWVBFX0RPTSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9BRFJfVFlQRV9JTlRMKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG8gbm90IGhhdmUgYW55IGFwcHJvcHJpYXRlIHdheSB0byBzdG9yZSB0aGlzIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuc3RhcnRzV2l0aCgiWC0iKSAmJiB0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nLnN1YnN0cmluZygyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZDYXJkIDMuMCBhbGxvd3MgaWFuYS10b2tlbi4gQWxzbyBzb21lIHZDYXJkIDIuMSBleHBvcnRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtaXQgbm9uLXN0YW5kYXJkIHR5cGVzLiBXZSBkbyBub3QgaGFuZGxlIHRoZWlyIHZhbHVlcyBub3cuCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gdHlwZVN0cmluZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFdlIHVzZSAiSE9NRSIgYXMgZGVmYXVsdAotICAgICAgICAgICAgaWYgKHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZGRQb3N0YWwodHlwZSwgcHJvcFZhbHVlTGlzdCwgbGFiZWwsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0VNQUlMKSkgewotICAgICAgICAgICAgaW50IHR5cGUgPSAtMTsKLSAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IG51bGw7Ci0gICAgICAgICAgICBib29sZWFuIGlzUHJpbWFyeSA9IGZhbHNlOwotICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpOwotICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlU3RyaW5nIDogdHlwZUNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVTdHJpbmcudG9VcHBlckNhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEVtYWlsLlRZUEVfSE9NRTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkspKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gRW1haWwuVFlQRV9XT1JLOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0VMTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBFbWFpbC5UWVBFX01PQklMRTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLnN0YXJ0c1dpdGgoIlgtIikgJiYgdHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nID0gdHlwZVN0cmluZy5zdWJzdHJpbmcoMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB2Q2FyZCAzLjAgYWxsb3dzIGlhbmEtdG9rZW4uCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBtYXkgaGF2ZSBJTlRFUk5FVCAoc3BlY2lmaWVkIGluIHZDYXJkIHNwZWMpLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU0NIT09MLCBldGMuCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gRW1haWwuVFlQRV9DVVNUT007Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHR5cGVTdHJpbmc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gRW1haWwuVFlQRV9PVEhFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZEVtYWlsKHR5cGUsIHByb3BWYWx1ZSwgbGFiZWwsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX09SRykpIHsKLSAgICAgICAgICAgIC8vIHZDYXJkIHNwZWNpZmljYXRpb24gZG9lcyBub3Qgc3BlY2lmeSBvdGhlciB0eXBlcy4KLSAgICAgICAgICAgIGZpbmFsIGludCB0eXBlID0gT3JnYW5pemF0aW9uLlRZUEVfV09SSzsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNQcmltYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGVTdHJpbmcgOiB0eXBlQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZU9yZ1ZhbHVlKHR5cGUsIHByb3BWYWx1ZUxpc3QsIHBhcmFtTWFwLCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9USVRMRSkpIHsKLSAgICAgICAgICAgIGhhbmRsZVRpdGxlVmFsdWUocHJvcFZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfUk9MRSkpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgY29uZmxpY3RzIHdpdGggVElUTEUuIElnbm9yZSBmb3Igbm93Li4uCi0gICAgICAgICAgICAvLyBoYW5kbGVUaXRsZVZhbHVlKHByb3BWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1BIT1RPKSB8fAotICAgICAgICAgICAgICAgIHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9MT0dPKSkgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHBhcmFtTWFwVmFsdWUgPSBwYXJhbU1hcC5nZXQoIlZBTFVFIik7Ci0gICAgICAgICAgICBpZiAocGFyYW1NYXBWYWx1ZSAhPSBudWxsICYmIHBhcmFtTWFwVmFsdWUuY29udGFpbnMoIlVSTCIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ3VycmVudGx5IHdlIGRvIG5vdCBoYXZlIGFwcHJvcHJpYXRlIGV4YW1wbGUgZm9yIHRlc3RpbmcgdGhpcyBjYXNlLgotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoIlRZUEUiKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZm9ybWF0TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlVmFsdWUgOiB0eXBlQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRi5lcXVhbHModHlwZVZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdE5hbWUgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0TmFtZSA9IHR5cGVWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGRQaG90b0J5dGVzKGZvcm1hdE5hbWUsIHByb3BCeXRlcywgaXNQcmltYXJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVEVMKSkgewotICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0IHR5cGVPYmplY3QgPQotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuZ2V0UGhvbmVUeXBlRnJvbVN0cmluZ3ModHlwZUNvbGxlY3Rpb24sIHByb3BWYWx1ZSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbDsKLSAgICAgICAgICAgIGlmICh0eXBlT2JqZWN0IGluc3RhbmNlb2YgSW50ZWdlcikgewotICAgICAgICAgICAgICAgIHR5cGUgPSAoSW50ZWdlcil0eXBlT2JqZWN0OwotICAgICAgICAgICAgICAgIGxhYmVsID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfQ1VTVE9NOwotICAgICAgICAgICAgICAgIGxhYmVsID0gdHlwZU9iamVjdC50b1N0cmluZygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeTsKLSAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsICYmIHR5cGVDb2xsZWN0aW9uLmNvbnRhaW5zKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZFBob25lKHR5cGUsIHByb3BWYWx1ZSwgbGFiZWwsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfU0tZUEVfUFNUTk5VTUJFUikpIHsKLSAgICAgICAgICAgIC8vIFRoZSBwaG9uZSBudW1iZXIgYXZhaWxhYmxlIHZpYSBTa3lwZS4KLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgIGZpbmFsIGludCB0eXBlID0gUGhvbmUuVFlQRV9PVEhFUjsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5OwotICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwgJiYgdHlwZUNvbGxlY3Rpb24uY29udGFpbnMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKSkgewotICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkUGhvbmUodHlwZSwgcHJvcFZhbHVlLCBudWxsLCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHNJbU1hcC5jb250YWluc0tleShwcm9wTmFtZSkpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBwcm90b2NvbCA9IHNJbU1hcC5nZXQocHJvcE5hbWUpOwotICAgICAgICAgICAgYm9vbGVhbiBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIGludCB0eXBlID0gLTE7Ci0gICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGVTdHJpbmcgOiB0eXBlQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QUkVGKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuZXF1YWxzSWdub3JlQ2FzZShWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEltLlRZUEVfSE9NRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHNJZ25vcmVDYXNlKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gSW0uVFlQRV9XT1JLOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IEltLlRZUEVfSE9NRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZEltKHByb3RvY29sLCBudWxsLCB0eXBlLCBwcm9wVmFsdWUsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX05PVEUpKSB7Ci0gICAgICAgICAgICBhZGROb3RlKHByb3BWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1VSTCkpIHsKLSAgICAgICAgICAgIGlmIChtV2Vic2l0ZUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1XZWJzaXRlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1XZWJzaXRlTGlzdC5hZGQocHJvcFZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQkRBWSkpIHsKLSAgICAgICAgICAgIG1CaXJ0aGRheSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQU5OSVZFUlNBUlkpKSB7Ci0gICAgICAgICAgICBtQW5uaXZlcnNhcnkgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUEhPTkVUSUNfRklSU1RfTkFNRSkpIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY0dpdmVuTmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9QSE9ORVRJQ19NSURETEVfTkFNRSkpIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY01pZGRsZU5hbWUgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUEhPTkVUSUNfTEFTVF9OQU1FKSkgewotICAgICAgICAgICAgbVBob25ldGljRmFtaWx5TmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9BTkRST0lEX0NVU1RPTSkpIHsKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBjdXN0b21Qcm9wZXJ0eUxpc3QgPQotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29uc3RydWN0TGlzdEZyb21WYWx1ZShwcm9wVmFsdWUsIG1WQ2FyZFR5cGUpOwotICAgICAgICAgICAgaGFuZGxlQW5kcm9pZEN1c3RvbVByb3BlcnR5KGN1c3RvbVByb3BlcnR5TGlzdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQW5kcm9pZEN1c3RvbVByb3BlcnR5KGZpbmFsIExpc3Q8U3RyaW5nPiBjdXN0b21Qcm9wZXJ0eUxpc3QpIHsKLSAgICAgICAgaWYgKG1BbmRyb2lkQ3VzdG9tUHJvcGVydHlMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1BbmRyb2lkQ3VzdG9tUHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0PFN0cmluZz4+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUFuZHJvaWRDdXN0b21Qcm9wZXJ0eUxpc3QuYWRkKGN1c3RvbVByb3BlcnR5TGlzdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IHRoZSBkaXNwbGF5IG5hbWUuIFRoZSBjb25zdHJ1Y3RlZCBkYXRhIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNvbnN0cnVjdERpc3BsYXlOYW1lKCkgewotICAgICAgICAvLyBGdWxsTmFtZSAoY3JlYXRlZCB2aWEgIkZOIiBvciAiTkFNRSIgZmllbGQpIGlzIHByZWZlcmVkLgotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG1Gb3JtYXR0ZWROYW1lKSkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gbUZvcm1hdHRlZE5hbWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIShUZXh0VXRpbHMuaXNFbXB0eShtRmFtaWx5TmFtZSkgJiYgVGV4dFV0aWxzLmlzRW1wdHkobUdpdmVuTmFtZSkpKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSBWQ2FyZFV0aWxzLmNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHMobVZDYXJkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgbUZhbWlseU5hbWUsIG1NaWRkbGVOYW1lLCBtR2l2ZW5OYW1lLCBtUHJlZml4LCBtU3VmZml4KTsKLSAgICAgICAgfSBlbHNlIGlmICghKFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0ZhbWlseU5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljR2l2ZW5OYW1lKSkpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IFZDYXJkVXRpbHMuY29uc3RydWN0TmFtZUZyb21FbGVtZW50cyhtVkNhcmRUeXBlLAotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNGYW1pbHlOYW1lLCBtUGhvbmV0aWNNaWRkbGVOYW1lLCBtUGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICB9IGVsc2UgaWYgKG1FbWFpbExpc3QgIT0gbnVsbCAmJiBtRW1haWxMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IG1FbWFpbExpc3QuZ2V0KDApLmRhdGE7Ci0gICAgICAgIH0gZWxzZSBpZiAobVBob25lTGlzdCAhPSBudWxsICYmIG1QaG9uZUxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gbVBob25lTGlzdC5nZXQoMCkuZGF0YTsKLSAgICAgICAgfSBlbHNlIGlmIChtUG9zdGFsTGlzdCAhPSBudWxsICYmIG1Qb3N0YWxMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IG1Qb3N0YWxMaXN0LmdldCgwKS5nZXRGb3JtYXR0ZWRBZGRyZXNzKG1WQ2FyZFR5cGUpOwotICAgICAgICB9IGVsc2UgaWYgKG1Pcmdhbml6YXRpb25MaXN0ICE9IG51bGwgJiYgbU9yZ2FuaXphdGlvbkxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gbU9yZ2FuaXphdGlvbkxpc3QuZ2V0KDApLmdldEZvcm1hdHRlZFN0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1EaXNwbGF5TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSAiIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnNvbGlkYXRlIHNldmVyYWwgZmllbHNkcyAobGlrZSBtTmFtZSkgdXNpbmcgbmFtZSBjYW5kaWRhdGVzLAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbnNvbGlkYXRlRmllbGRzKCkgewotICAgICAgICBjb25zdHJ1Y3REaXNwbGF5TmFtZSgpOwotCi0gICAgICAgIGlmIChtUGhvbmV0aWNGdWxsTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNGdWxsTmFtZSA9IG1QaG9uZXRpY0Z1bGxOYW1lLnRyaW0oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBVcmkgcHVzaEludG9Db250ZW50UmVzb2x2ZXIoQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7Ci0gICAgICAgIEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+IG9wZXJhdGlvbkxpc3QgPQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+KCk7Ci0gICAgICAgIC8vIEFmdGVyIGFwcGx5aW5nIHRoZSBiYXRjaCB0aGUgZmlyc3QgcmVzdWx0J3MgVXJpIGlzIHJldHVybmVkIHNvIGl0IGlzIGltcG9ydGFudCB0aGF0Ci0gICAgICAgIC8vIHRoZSBSYXdDb250YWN0IGlzIHRoZSBmaXJzdCBvcGVyYXRpb24gdGhhdCBnZXRzIGluc2VydGVkIGludG8gdGhlIGxpc3QKLSAgICAgICAgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgICAgICBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgU3RyaW5nIG15R3JvdXBzSWQgPSBudWxsOwotICAgICAgICBpZiAobUFjY291bnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUmF3Q29udGFjdHMuQUNDT1VOVF9OQU1FLCBtQWNjb3VudC5uYW1lKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFJhd0NvbnRhY3RzLkFDQ09VTlRfVFlQRSwgbUFjY291bnQudHlwZSk7Ci0KLSAgICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IGNhbGxlciBzaWRlIGNyZWF0ZXMgdGhpcyBncm91cCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgICAgIGlmIChBQ0NPVU5UX1RZUEVfR09PR0xFLmVxdWFscyhtQWNjb3VudC50eXBlKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIEN1cnNvciBjdXJzb3IgPSByZXNvbHZlci5xdWVyeShHcm91cHMuQ09OVEVOVF9VUkksIG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHcm91cHMuU09VUkNFX0lEIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICBHcm91cHMuVElUTEUgKyAiPT8iLCBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICAgICAgICAgR09PR0xFX01ZX0NPTlRBQ1RTX0dST1VQIH0sIG51bGwpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCAmJiBjdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbXlHcm91cHNJZCA9IGN1cnNvci5nZXRTdHJpbmcoMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUmF3Q29udGFjdHMuQUNDT1VOVF9OQU1FLCBudWxsKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFJhd0NvbnRhY3RzLkFDQ09VTlRfVFlQRSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLQotICAgICAgICBpZiAoIW5hbWVGaWVsZHNBcmVFbXB0eSgpKSB7Ci0gICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShTdHJ1Y3R1cmVkTmFtZS5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsIG1HaXZlbk5hbWUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsIG1GYW1pbHlOYW1lKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCBtTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsIG1QcmVmaXgpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuU1VGRklYLCBtU3VmZml4KTsKLQotICAgICAgICAgICAgaWYgKCEoVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljR2l2ZW5OYW1lKQotICAgICAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNNaWRkbGVOYW1lKSkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCBtUGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCBtUGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgbVBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGdWxsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCBtUGhvbmV0aWNGdWxsTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1OaWNrTmFtZUxpc3QgIT0gbnVsbCAmJiBtTmlja05hbWVMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIG5pY2tOYW1lIDogbU5pY2tOYW1lTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShOaWNrbmFtZS5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE5pY2tuYW1lLlRZUEUsIE5pY2tuYW1lLlRZUEVfREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoTmlja25hbWUuTkFNRSwgbmlja05hbWUpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVBob25lTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFBob25lRGF0YSBwaG9uZURhdGEgOiBtUGhvbmVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKFBob25lLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBQaG9uZS5DT05URU5UX0lURU1fVFlQRSk7Ci0KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG9uZS5UWVBFLCBwaG9uZURhdGEudHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBob25lRGF0YS50eXBlID09IFBob25lLlRZUEVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFBob25lLkxBQkVMLCBwaG9uZURhdGEubGFiZWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG9uZS5OVU1CRVIsIHBob25lRGF0YS5kYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvbmVEYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtT3JnYW5pemF0aW9uTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKE9yZ2FuaXphdGlvbkRhdGEgb3JnYW5pemF0aW9uRGF0YSA6IG1Pcmdhbml6YXRpb25MaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKE9yZ2FuaXphdGlvbi5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShPcmdhbml6YXRpb24uVFlQRSwgb3JnYW5pemF0aW9uRGF0YS50eXBlKTsKLSAgICAgICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS5jb21wYW55TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE9yZ2FuaXphdGlvbi5DT01QQU5ZLCBvcmdhbml6YXRpb25EYXRhLmNvbXBhbnlOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG9yZ2FuaXphdGlvbkRhdGEuZGVwYXJ0bWVudE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgb3JnYW5pemF0aW9uRGF0YS5kZXBhcnRtZW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvcmdhbml6YXRpb25EYXRhLnRpdGxlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE9yZ2FuaXphdGlvbi5USVRMRSwgb3JnYW5pemF0aW9uRGF0YS50aXRsZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS5waG9uZXRpY05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShPcmdhbml6YXRpb24uUEhPTkVUSUNfTkFNRSwgb3JnYW5pemF0aW9uRGF0YS5waG9uZXRpY05hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS5pc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoT3JnYW5pemF0aW9uLklTX1BSSU1BUlksIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1FbWFpbExpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChFbWFpbERhdGEgZW1haWxEYXRhIDogbUVtYWlsTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShFbWFpbC5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpOwotCi0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRW1haWwuVFlQRSwgZW1haWxEYXRhLnR5cGUpOwotICAgICAgICAgICAgICAgIGlmIChlbWFpbERhdGEudHlwZSA9PSBFbWFpbC5UWVBFX0NVU1RPTSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShFbWFpbC5MQUJFTCwgZW1haWxEYXRhLmxhYmVsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRW1haWwuREFUQSwgZW1haWxEYXRhLmRhdGEpOwotICAgICAgICAgICAgICAgIGlmIChlbWFpbERhdGEuaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVBvc3RhbExpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChQb3N0YWxEYXRhIHBvc3RhbERhdGEgOiBtUG9zdGFsTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuaW5zZXJ0U3RydWN0dXJlZFBvc3RhbERhdGFVc2luZ0NvbnRhY3RzU3RydWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgbVZDYXJkVHlwZSwgYnVpbGRlciwgcG9zdGFsRGF0YSk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSW1MaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSW1EYXRhIGltRGF0YSA6IG1JbUxpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoSW0uUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIEltLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShJbS5UWVBFLCBpbURhdGEudHlwZSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoSW0uUFJPVE9DT0wsIGltRGF0YS5wcm90b2NvbCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoSW0uREFUQSwgaW1EYXRhLmRhdGEpOwotICAgICAgICAgICAgICAgIGlmIChpbURhdGEucHJvdG9jb2wgPT0gSW0uUFJPVE9DT0xfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEltLkNVU1RPTV9QUk9UT0NPTCwgaW1EYXRhLmN1c3RvbVByb3RvY29sKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGltRGF0YS5pc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTm90ZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgbm90ZSA6IG1Ob3RlTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShOb3RlLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShOb3RlLk5PVEUsIG5vdGUpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVBob3RvTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFBob3RvRGF0YSBwaG90b0RhdGEgOiBtUGhvdG9MaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKFBob3RvLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBQaG90by5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUGhvdG8uUEhPVE8sIHBob3RvRGF0YS5waG90b0J5dGVzKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvdG9EYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG90by5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtV2Vic2l0ZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgd2Vic2l0ZSA6IG1XZWJzaXRlTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShXZWJzaXRlLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShXZWJzaXRlLlVSTCwgd2Vic2l0ZSk7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBVUkwgaW4gdkNhcmQuCi0gICAgICAgICAgICAgICAgLy8gV2UgdXNlIFRZUEVfSE9NRVBBR0UgZm9yIHNhZmV0eS4KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShXZWJzaXRlLlRZUEUsIFdlYnNpdGUuVFlQRV9IT01FUEFHRSk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobUJpcnRoZGF5KSkgewotICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoRXZlbnQuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRXZlbnQuU1RBUlRfREFURSwgbUJpcnRoZGF5KTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQklSVEhEQVkpOwotICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobUFubml2ZXJzYXJ5KSkgewotICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoRXZlbnQuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRXZlbnQuU1RBUlRfREFURSwgbUFubml2ZXJzYXJ5KTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQU5OSVZFUlNBUlkpOwotICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKExpc3Q8U3RyaW5nPiBjdXN0b21Qcm9wZXJ0eUxpc3QgOiBtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdCkgewotICAgICAgICAgICAgICAgIGludCBzaXplID0gY3VzdG9tUHJvcGVydHlMaXN0LnNpemUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IDIgfHwgVGV4dFV0aWxzLmlzRW1wdHkoY3VzdG9tUHJvcGVydHlMaXN0LmdldCgwKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaXplID4gVkNhcmRDb25zdGFudHMuTUFYX0RBVEFfQ09MVU1OICsgMSkgewotICAgICAgICAgICAgICAgICAgICBzaXplID0gVkNhcmRDb25zdGFudHMuTUFYX0RBVEFfQ09MVU1OICsgMTsKLSAgICAgICAgICAgICAgICAgICAgY3VzdG9tUHJvcGVydHlMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVByb3BlcnR5TGlzdC5zdWJMaXN0KDAsIFZDYXJkQ29uc3RhbnRzLk1BWF9EQVRBX0NPTFVNTiArIDIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBjdXN0b21Qcm9wZXJ0eVZhbHVlIDogY3VzdG9tUHJvcGVydHlMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtaW1lVHlwZSA9IGN1c3RvbVByb3BlcnR5VmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShHcm91cE1lbWJlcnNoaXAuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgbWltZVR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgLy8gMSA8PSBpICYmIGkgPD0gTUFYX0RBVEFfQ09MVU1OUwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjdXN0b21Qcm9wZXJ0eVZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKCJkYXRhIiArIGksIGN1c3RvbVByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG15R3JvdXBzSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoR3JvdXBNZW1iZXJzaGlwLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIEdyb3VwTWVtYmVyc2hpcC5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShHcm91cE1lbWJlcnNoaXAuR1JPVVBfU09VUkNFX0lELCBteUdyb3Vwc0lkKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29udGVudFByb3ZpZGVyUmVzdWx0W10gcmVzdWx0cyA9IHJlc29sdmVyLmFwcGx5QmF0Y2goCi0gICAgICAgICAgICAgICAgICAgICAgICBDb250YWN0c0NvbnRyYWN0LkFVVEhPUklUWSwgb3BlcmF0aW9uTGlzdCk7Ci0gICAgICAgICAgICAvLyB0aGUgZmlyc3QgcmVzdWx0IGlzIGFsd2F5cyB0aGUgcmF3X2NvbnRhY3QuIHJldHVybiBpdCdzIHVyaSBzbwotICAgICAgICAgICAgLy8gdGhhdCBpdCBjYW4gYmUgZm91bmQgbGF0ZXIuIGRvIG51bGwgY2hlY2tpbmcgZm9yIGJhZGx5IGJlaGF2aW5nCi0gICAgICAgICAgICAvLyBDb250ZW50UmVzb2x2ZXJzCi0gICAgICAgICAgICByZXR1cm4gKHJlc3VsdHMgPT0gbnVsbCB8fCByZXN1bHRzLmxlbmd0aCA9PSAwIHx8IHJlc3VsdHNbMF0gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICA6IHJlc3VsdHNbMF0udXJpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgiJXM6ICVzIiwgZS50b1N0cmluZygpLCBlLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkFwcGxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsIFN0cmluZy5mb3JtYXQoIiVzOiAlcyIsIGUudG9TdHJpbmcoKSwgZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBWQ2FyZEVudHJ5IGJ1aWxkRnJvbVJlc29sdmVyKENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgewotICAgICAgICByZXR1cm4gYnVpbGRGcm9tUmVzb2x2ZXIocmVzb2x2ZXIsIENvbnRhY3RzLkNPTlRFTlRfVVJJKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFZDYXJkRW50cnkgYnVpbGRGcm9tUmVzb2x2ZXIoQ29udGVudFJlc29sdmVyIHJlc29sdmVyLCBVcmkgdXJpKSB7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG5hbWVGaWVsZHNBcmVFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIChUZXh0VXRpbHMuaXNFbXB0eShtRmFtaWx5TmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtTWlkZGxlTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtR2l2ZW5OYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QcmVmaXgpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobVN1ZmZpeCkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtRm9ybWF0dGVkTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY01pZGRsZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljR2l2ZW5OYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0Z1bGxOYW1lKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmFibGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXREaXNwbGF5TmFtZSgpLmxlbmd0aCgpID09IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGlzdFRvU3RyaW5nKExpc3Q8U3RyaW5nPiBsaXN0KXsKLSAgICAgICAgZmluYWwgaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLSAgICAgICAgaWYgKHNpemUgPiAxKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZSA6IGxpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCh0eXBlKTsKLSAgICAgICAgICAgICAgICBpZiAoaSA8IHNpemUgLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIGlmIChzaXplID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBsaXN0LmdldCgwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEFsbCBnZXR0ZXIgbWV0aG9kcyBzaG91bGQgYmUgdXNlZCBjYXJlZnVsbHksIHNpbmNlIHRoZXkgbWF5IGNoYW5nZQotICAgIC8vIGluIHRoZSBmdXR1cmUgYXMgb2YgMjAwOS0xMC0wNSwgb24gd2hpY2ggSSBjYW5ub3QgYmUgc3VyZSB0aGlzIHN0cnVjdHVyZQotICAgIC8vIGlzIGNvbXBsZXRlbHkgY29uc29saWRhdGVkLgotICAgIC8vCi0gICAgLy8gQWxzbyBub3RlIHRoYXQgdGhlc2UgZ2V0dGVyIG1ldGhvZHMgc2hvdWxkIGJlIHVzZWQgb25seSBhZnRlcgotICAgIC8vIGFsbCBwcm9wZXJ0aWVzIGJlaW5nIHB1c2hlZCBpbnRvIHRoaXMgb2JqZWN0LiBJZiBub3QsIGluY29ycmVjdAotICAgIC8vIHZhbHVlIHdpbGwgImJlIHN0b3JlZCBpbiB0aGUgbG9jYWwgY2FjaGUgYW5kIiBiZSByZXR1cm5lZCB0byB5b3UuCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhbWlseU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtRmFtaWx5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEdpdmVuTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1HaXZlbk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRNaWRkbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gbU1pZGRsZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiBtUHJlZml4OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VmZml4KCkgewotICAgICAgICByZXR1cm4gbVN1ZmZpeDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgewotICAgICAgICByZXR1cm4gbUZvcm1hdHRlZE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQaG9uZXRpY0ZhbWlseU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtUGhvbmV0aWNGYW1pbHlOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhvbmV0aWNHaXZlbk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtUGhvbmV0aWNHaXZlbk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQaG9uZXRpY01pZGRsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtUGhvbmV0aWNNaWRkbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhvbmV0aWNGdWxsTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1QaG9uZXRpY0Z1bGxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PFN0cmluZz4gZ2V0Tmlja05hbWVMaXN0KCkgewotICAgICAgICByZXR1cm4gbU5pY2tOYW1lTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJpcnRoZGF5KCkgewotICAgICAgICByZXR1cm4gbUJpcnRoZGF5OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PFN0cmluZz4gZ2V0Tm90ZXMoKSB7Ci0gICAgICAgIHJldHVybiBtTm90ZUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8UGhvbmVEYXRhPiBnZXRQaG9uZUxpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtUGhvbmVMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PEVtYWlsRGF0YT4gZ2V0RW1haWxMaXN0KCkgewotICAgICAgICByZXR1cm4gbUVtYWlsTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxQb3N0YWxEYXRhPiBnZXRQb3N0YWxMaXN0KCkgewotICAgICAgICByZXR1cm4gbVBvc3RhbExpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8T3JnYW5pemF0aW9uRGF0YT4gZ2V0T3JnYW5pemF0aW9uTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Pcmdhbml6YXRpb25MaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PEltRGF0YT4gZ2V0SW1MaXN0KCkgewotICAgICAgICByZXR1cm4gbUltTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxQaG90b0RhdGE+IGdldFBob3RvTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1QaG90b0xpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXRXZWJzaXRlTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1XZWJzaXRlTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotICAgICAgICBpZiAobURpc3BsYXlOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnN0cnVjdERpc3BsYXlOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1EaXNwbGF5TmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvbW1pdHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb21taXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjODA1Ny4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvbW1pdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogPFA+Ci0gKiB7QGxpbmsgVkNhcmRFbnRyeUhhbmRsZXJ9IGltcGxlbWVudGF0aW9uIHdoaWNoIGNvbW1pdHMgdGhlIGVudHJ5IHRvIENvbnRlbnRSZXNvbHZlci4KLSAqIDwvUD4KLSAqIDxQPgotICogTm90ZTo8QlIgLz4KLSAqIEVhY2ggdkNhcmQgbWF5IGNvbnRhaW4gYmlnIHBob3RvIGltYWdlcyBlbmNvZGVkIGJ5IEJBU0U2NCwKLSAqIElmIHdlIHN0b3JlIGFsbCB2Q2FyZCBlbnRyaWVzIGluIG1lbW9yeSwgT3V0T2ZNZW1vcnlFcnJvciBtYXkgYmUgdGhyb3duLgotICogVGh1cywgdGhpcyBjbGFzcyBwdXNoIGVhY2ggVkNhcmQgZW50cnkgaW50byBDb250ZW50UmVzb2x2ZXIgaW1tZWRpYXRlbHkuCi0gKiA8L1A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZEVudHJ5Q29tbWl0dGVyIGltcGxlbWVudHMgVkNhcmRFbnRyeUhhbmRsZXIgewotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRFbnRyeUNvbWl0dGVyIjsKLQotICAgIHByaXZhdGUgZmluYWwgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lVG9Db21taXQ7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8VXJpPiBtQ3JlYXRlZFVyaXMgPSBuZXcgQXJyYXlMaXN0PFVyaT4oKTsKLQotICAgIHB1YmxpYyBWQ2FyZEVudHJ5Q29tbWl0dGVyKENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgewotICAgICAgICBtQ29udGVudFJlc29sdmVyID0gcmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkVuZCgpIHsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLnNob3dQZXJmb3JtYW5jZUxvZygpKSB7Ci0gICAgICAgICAgICBMb2cuZChMT0dfVEFHLCBTdHJpbmcuZm9ybWF0KCJ0aW1lIHRvIGNvbW1pdCBlbnRyaWVzOiAlZCBtcyIsIG1UaW1lVG9Db21taXQpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRW50cnlDcmVhdGVkKGZpbmFsIFZDYXJkRW50cnkgdmNhcmRFbnRyeSkgewotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIG1DcmVhdGVkVXJpcy5hZGQodmNhcmRFbnRyeS5wdXNoSW50b0NvbnRlbnRSZXNvbHZlcihtQ29udGVudFJlc29sdmVyKSk7Ci0gICAgICAgIG1UaW1lVG9Db21taXQgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNyZWF0ZWQgVXJpcy4gVGhpcyBsaXN0IHNob3VsZCBub3QgYmUgbW9kaWZpZWQgYnkgdGhlIGNhbGxlciBhcyBpdCBpcwotICAgICAqIG5vdCBhIGNsb25lLgotICAgICAqLwotICAgcHVibGljIEFycmF5TGlzdDxVcmk+IGdldENyZWF0ZWRVcmlzKCkgewotICAgICAgICByZXR1cm4gbUNyZWF0ZWRVcmlzOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvbnN0cnVjdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvbnN0cnVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhM2UzZTIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb25zdHJ1Y3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudDsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5CYXNlNjQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNoYXJzZXRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSB7QGxpbmsgVkNhcmRJbnRlcnByZXRlcn0gaW1wbGVtZW50YXRpb24gd2hpY2ggZW5hYmxlcyB7QGxpbmsgVkNhcmRFbnRyeUhhbmRsZXJ9IG9iamVjdHMKLSAqIHRvIGVhc2lseSBoYW5kbGUgZWFjaCB2Q2FyZCBlbnRyeS4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB1bmRlcnN0YW5kIGRldGFpbHMgaW5zaWRlIHZDYXJkIGFuZCB0cmFuc2xhdGVzIGl0IHRvIHtAbGluayBWQ2FyZEVudHJ5fS4KLSAqIFRoZW4gdGhlIGNsYXNzIHRocm93IGl0IHRvIHtAbGluayBWQ2FyZEVudHJ5SGFuZGxlcn0gcmVnaXN0ZXJlZCB2aWEKLSAqIHtAbGluayAjYWRkRW50cnlIYW5kbGVyKFZDYXJkRW50cnlIYW5kbGVyKX0sIHNvIHRoYXQgYWxsIHRob3NlIHJlZ2lzdGVyZWQgb2JqZWN0cwotICogYXJlIGFibGUgdG8gaGFuZGxlIHRoZSB7QGxpbmsgVkNhcmRFbnRyeX0gb2JqZWN0LgotICogPC9wPgotICogPHA+Ci0gKiBJZiB5b3Ugd2FudCB0byBrbm93IHRoZSBkZXRhaWwgaW5zaWRlIHZDYXJkLCBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaW1wbGVtZW50Ci0gKiB7QGxpbmsgVkNhcmRJbnRlcnByZXRlcn0gZGlyZWN0bHksIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aGlzIGNsYXNzIGFuZAotICoge0BsaW5rIFZDYXJkRW50cnl9IGNyZWF0ZWQgYnkgdGhlIG9iamVjdC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkRW50cnlDb25zdHJ1Y3RvciBpbXBsZW1lbnRzIFZDYXJkSW50ZXJwcmV0ZXIgewotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkRW50cnlDb25zdHJ1Y3RvciI7Ci0KLSAgICBwcml2YXRlIFZDYXJkRW50cnkuUHJvcGVydHkgbUN1cnJlbnRQcm9wZXJ0eSA9IG5ldyBWQ2FyZEVudHJ5LlByb3BlcnR5KCk7Ci0gICAgcHJpdmF0ZSBWQ2FyZEVudHJ5IG1DdXJyZW50VkNhcmRFbnRyeTsKLSAgICBwcml2YXRlIFN0cmluZyBtUGFyYW1UeXBlOwotICAgIAotICAgIC8vIFRoZSBjaGFyc2V0IHVzaW5nIHdoaWNoIHtAbGluayBWQ2FyZEludGVycHJldGVyfSBwYXJzZXMgdGhlIHRleHQuCi0gICAgLy8gRWFjaCBTdHJpbmcgaXMgZmlyc3QgZGVjb2RlZCBpbnRvIGJpbmFyeSBzdHJlYW0gd2l0aCB0aGlzIGNoYXJzZXQsIGFuZCBlbmNvZGVkIGJhY2sKLSAgICAvLyB0byAidGFyZ2V0IGNoYXJzZXQiLCB3aGljaCBtYXkgYmUgZXhwbGljaXRseSBzcGVjaWZpZWQgYnkgdGhlIHZDYXJkIHdpdGggIkNIQVJTRVQiCi0gICAgLy8gcHJvcGVydHkgb3IgaW1wbGljaXRseSBtZW50aW9uZWQgYnkgaXRzIHZlcnNpb24gKGUuZy4gdkNhcmQgMy4wIHJlY29tbWVuZHMgVVRGLTgpLgotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Tb3VyY2VDaGFyc2V0OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1TdHJpY3RMaW5lQnJlYWtpbmc7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVZDYXJkVHlwZTsKLSAgICBwcml2YXRlIGZpbmFsIEFjY291bnQgbUFjY291bnQ7Ci0gICAgCi0gICAgLy8gRm9yIG1lYXN1cmluZyBwZXJmb3JtYW5jZS4KLSAgICBwcml2YXRlIGxvbmcgbVRpbWVQdXNoSW50b0NvbnRlbnRSZXNvbHZlcjsKLQotICAgIHByaXZhdGUgZmluYWwgTGlzdDxWQ2FyZEVudHJ5SGFuZGxlcj4gbUVudHJ5SGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0PFZDYXJkRW50cnlIYW5kbGVyPigpOwotCi0gICAgcHVibGljIFZDYXJkRW50cnlDb25zdHJ1Y3RvcigpIHsKLSAgICAgICAgdGhpcyhWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgdGhpcyh2Y2FyZFR5cGUsIG51bGwsIG51bGwsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKGZpbmFsIGludCB2Y2FyZFR5cGUsIGZpbmFsIEFjY291bnQgYWNjb3VudCkgewotICAgICAgICB0aGlzKHZjYXJkVHlwZSwgYWNjb3VudCwgbnVsbCwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEVudHJ5Q29uc3RydWN0b3IoZmluYWwgaW50IHZjYXJkVHlwZSwgZmluYWwgQWNjb3VudCBhY2NvdW50LAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlucHV0Q2hhcnNldCkgewotICAgICAgICB0aGlzKHZjYXJkVHlwZSwgYWNjb3VudCwgaW5wdXRDaGFyc2V0LCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUgSnVzdCBmb3IgdGVzdGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKGZpbmFsIGludCB2Y2FyZFR5cGUsIGZpbmFsIEFjY291bnQgYWNjb3VudCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpbnB1dENoYXJzZXQsIGZpbmFsIGJvb2xlYW4gc3RyaWN0TGluZUJyZWFrUGFyc2luZykgewotICAgICAgICBpZiAoaW5wdXRDaGFyc2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Tb3VyY2VDaGFyc2V0ID0gaW5wdXRDaGFyc2V0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNvdXJjZUNoYXJzZXQgPSBWQ2FyZENvbmZpZy5ERUZBVUxUX0lOVEVSTUVESUFURV9DSEFSU0VUOwotICAgICAgICB9Ci0gICAgICAgIG1TdHJpY3RMaW5lQnJlYWtpbmcgPSBzdHJpY3RMaW5lQnJlYWtQYXJzaW5nOwotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotICAgICAgICBtQWNjb3VudCA9IGFjY291bnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRW50cnlIYW5kbGVyKFZDYXJkRW50cnlIYW5kbGVyIGVudHJ5SGFuZGxlcikgewotICAgICAgICBtRW50cnlIYW5kbGVycy5hZGQoZW50cnlIYW5kbGVyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEVudHJ5SGFuZGxlciBlbnRyeUhhbmRsZXIgOiBtRW50cnlIYW5kbGVycykgewotICAgICAgICAgICAgZW50cnlIYW5kbGVyLm9uU3RhcnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEVudHJ5SGFuZGxlciBlbnRyeUhhbmRsZXIgOiBtRW50cnlIYW5kbGVycykgewotICAgICAgICAgICAgZW50cnlIYW5kbGVyLm9uRW5kKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgbUN1cnJlbnRWQ2FyZEVudHJ5ID0gbnVsbDsKLSAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eSA9IG5ldyBWQ2FyZEVudHJ5LlByb3BlcnR5KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbnRyeSgpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50VkNhcmRFbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiTmVzdGVkIFZDYXJkIGNvZGUgaXMgbm90IHN1cHBvcnRlZCBub3cuIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRWQ2FyZEVudHJ5ID0gbmV3IFZDYXJkRW50cnkobVZDYXJkVHlwZSwgbUFjY291bnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBtQ3VycmVudFZDYXJkRW50cnkuY29uc29saWRhdGVGaWVsZHMoKTsKLSAgICAgICAgZm9yIChWQ2FyZEVudHJ5SGFuZGxlciBlbnRyeUhhbmRsZXIgOiBtRW50cnlIYW5kbGVycykgewotICAgICAgICAgICAgZW50cnlIYW5kbGVyLm9uRW50cnlDcmVhdGVkKG1DdXJyZW50VkNhcmRFbnRyeSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRWQ2FyZEVudHJ5ID0gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgICAgICBtQ3VycmVudFByb3BlcnR5LmNsZWFyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5kUHJvcGVydHkoKSB7Ci0gICAgICAgIG1DdXJyZW50VkNhcmRFbnRyeS5hZGRQcm9wZXJ0eShtQ3VycmVudFByb3BlcnR5KTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIG1DdXJyZW50UHJvcGVydHkuc2V0UHJvcGVydHlOYW1lKG5hbWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgaWYgKG1QYXJhbVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgInByb3BlcnR5UGFyYW1UeXBlKCkgaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlICIgKwotICAgICAgICAgICAgICAgICAgICAiYmVmb3JlIHByb3BlcnR5UGFyYW1WYWx1ZSgpIGlzIGNhbGxlZCIpOwotICAgICAgICB9Ci0gICAgICAgIG1QYXJhbVR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKG1QYXJhbVR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gRnJvbSB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbi4gdkNhcmQgMy4wIGZvcm1hbGx5IGRvZXMgbm90IGFsbG93IHRoaXMgY2FzZS4KLSAgICAgICAgICAgIG1QYXJhbVR5cGUgPSAiVFlQRSI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4odmFsdWUpKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IFZDYXJkVXRpbHMuY29udmVydFN0cmluZ0NoYXJzZXQoCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlLCBtU291cmNlQ2hhcnNldCwgVkNhcmRDb25maWcuREVGQVVMVF9JTVBPUlRfQ0hBUlNFVCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eS5hZGRQYXJhbWV0ZXIobVBhcmFtVHlwZSwgdmFsdWUpOwotICAgICAgICBtUGFyYW1UeXBlID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBoYW5kbGVPbmVWYWx1ZShTdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICBTdHJpbmcgc291cmNlQ2hhcnNldCwgU3RyaW5nIHRhcmdldENoYXJzZXQsIFN0cmluZyBlbmNvZGluZykgewotICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSB3aGVuIHNvbWUgb2YgbXVsdGlwbGUgdmFsdWVzIGFyZSBlbXB0eS4KLSAgICAgICAgLy8gZS5nLiBOOjthOzs7IC0+IHZhbHVlcyBhcmUgIiIsICJhIiwgIiIsICIiLCBhbmQgIiIuCi0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZW5jb2RpbmcuZXF1YWxzKCJCQVNFNjQiKSB8fCBlbmNvZGluZy5lcXVhbHMoIkIiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50UHJvcGVydHkuc2V0UHJvcGVydHlCeXRlcyhCYXNlNjQuZGVjb2RlKHZhbHVlLmdldEJ5dGVzKCksIEJhc2U2NC5ERUZBVUxUKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlbmNvZGluZy5lcXVhbHMoIlFVT1RFRC1QUklOVEFCTEUiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBWQ2FyZFV0aWxzLnBhcnNlUXVvdGVkUHJpbnRhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIG1TdHJpY3RMaW5lQnJlYWtpbmcsIHNvdXJjZUNoYXJzZXQsIHRhcmdldENoYXJzZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlVua25vd24gZW5jb2RpbmcuIEZhbGwgYmFjayB0byBkZWZhdWx0LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSnVzdCB0cmFuc2xhdGUgdGhlIGNoYXJzZXQgb2YgYSBnaXZlbiBTdHJpbmcgZnJvbSBpbnB1dENoYXJzZXQgdG8gYSBzeXN0ZW0gb25lLiAKLSAgICAgICAgcmV0dXJuIFZDYXJkVXRpbHMuY29udmVydFN0cmluZ0NoYXJzZXQodmFsdWUsIHNvdXJjZUNoYXJzZXQsIHRhcmdldENoYXJzZXQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlcyhMaXN0PFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gY2hhcnNldENvbGxlY3Rpb24gPQotICAgICAgICAgICAgICAgIG1DdXJyZW50UHJvcGVydHkuZ2V0UGFyYW1ldGVycyhWQ2FyZENvbnN0YW50cy5QQVJBTV9DSEFSU0VUKTsKLSAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IGVuY29kaW5nQ29sbGVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eS5nZXRQYXJhbWV0ZXJzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VOQ09ESU5HKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kaW5nID0KLSAgICAgICAgICAgICgoZW5jb2RpbmdDb2xsZWN0aW9uICE9IG51bGwpID8gZW5jb2RpbmdDb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpIDogbnVsbCk7Ci0gICAgICAgIFN0cmluZyB0YXJnZXRDaGFyc2V0ID0gQ2hhcnNldFV0aWxzLm5hbWVGb3JEZWZhdWx0VmVuZG9yKAotICAgICAgICAgICAgICAgICgoY2hhcnNldENvbGxlY3Rpb24gIT0gbnVsbCkgPyBjaGFyc2V0Q29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSA6IG51bGwpKTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHRhcmdldENoYXJzZXQpKSB7Ci0gICAgICAgICAgICB0YXJnZXRDaGFyc2V0ID0gVkNhcmRDb25maWcuREVGQVVMVF9JTVBPUlRfQ0hBUlNFVDsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BlcnR5LmFkZFRvUHJvcGVydHlWYWx1ZUxpc3QoCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZU9uZVZhbHVlKHZhbHVlLCBtU291cmNlQ2hhcnNldCwgdGFyZ2V0Q2hhcnNldCwgZW5jb2RpbmcpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd1BlcmZvcm1hbmNlSW5mbygpIHsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgInRpbWUgZm9yIGluc2VydCBDb250YWN0U3RydWN0IHRvIGRhdGFiYXNlOiAiICsgCi0gICAgICAgICAgICAgICAgbVRpbWVQdXNoSW50b0NvbnRlbnRSZXNvbHZlciArICIgbXMiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvdW50ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q291bnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmFiNTBkLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q291bnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhlIGNsYXNzIHdoaWNoIGp1c3QgY291bnRzIHRoZSBudW1iZXIgb2YgdkNhcmQgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkIGlucHV0LgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRFbnRyeUNvdW50ZXIgaW1wbGVtZW50cyBWQ2FyZEludGVycHJldGVyIHsKLSAgICBwcml2YXRlIGludCBtQ291bnQ7Ci0KLSAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewotICAgICAgICByZXR1cm4gbUNvdW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVudHJ5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBtQ291bnQrKzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZXMoTGlzdDxTdHJpbmc+IHZhbHVlcykgewotICAgIH0gICAgCi19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUhhbmRsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJmNjlkLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi0vKioKLSAqIDxwPgotICogVGhlIGludGVyZmFjZSBjYWxsZWQgYnkge0BsaW5rIFZDYXJkRW50cnlDb25zdHJ1Y3Rvcn0uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgdXNlZnVsIHdoZW4geW91IGRvbid0IHdhbnQgdG8ga25vdyB2Q2FyZCBkYXRhIGluIGRldGFpbC4gSWYgeW91IHdhbnQgdG8ga25vdwotICogaXQsIGl0IHdvdWxkIGJlIGJldHRlciB0byBjb25zaWRlciB1c2luZyB7QGxpbmsgVkNhcmRJbnRlcnByZXRlcn0uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVkNhcmRFbnRyeUhhbmRsZXIgewotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBwYXJzaW5nIHN0YXJ0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydCgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGhvZCBjYWxsZWQgd2hlbiBvbmUgVkNhcmQgZW50cnkgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkVudHJ5Q3JlYXRlZChmaW5hbCBWQ2FyZEVudHJ5IGVudHJ5KTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBwYXJzaW5nIGVuZGVkLgotICAgICAqIEFibGUgdG8gYmUgdXNlIHRoaXMgbWV0aG9kIGZvciBzaG93aW5nIHBlcmZvcm1hbmNlIGxvZywgZXRjLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uRW5kKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM3MDRhMi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDxQPgotICogVGhlIGludGVyZmFjZSB3aGljaCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGNsYXNzZXMgd2hpY2ggaGF2ZSB0byBhbmFseXplIGVhY2gKLSAqIHZDYXJkIGVudHJ5IG1pbnV0ZWx5LgotICogPC9QPgotICogPFA+Ci0gKiBIZXJlLCB0aGVyZSBhcmUgc2V2ZXJhbCB0ZXJtcyBzcGVjaWZpYyB0byB2Q2FyZCAoYW5kIHRoaXMgbGlicmFyeSkuCi0gKiA8L1A+Ci0gKiA8UD4KLSAqIFRoZSB0ZXJtICJlbnRyeSIgaXMgb25lIHZDYXJkIHJlcHJlc2VudGF0aW9uIGluIHRoZSBpbnB1dCwgd2hpY2ggc2hvdWxkIHN0YXJ0IHdpdGggIkJFR0lOOlZDQVJEIgotICogYW5kIGVuZCB3aXRoICJFTkQ6VkNBUkQiLgotICogPC9QPgotICogPFA+Ci0gKiBUaGUgdGVybSAicHJvcGVydHkiIGlzIG9uZSBsaW5lIGluIHZDYXJkIGVudHJ5LCB3aGljaCBjb25zaXN0cyBvZiAiZ3JvdXAiLCAicHJvcGVydHkgbmFtZSIsCi0gKiAicGFyYW1ldGVyKHBhcmFtKSBuYW1lcyBhbmQgdmFsdWVzIiwgYW5kICJwcm9wZXJ0eSB2YWx1ZXMiLgotICogPC9QPgotICogPFA+Ci0gKiBlLmcuIGdyb3VwMS5wcm9wTmFtZTtwYXJhbU5hbWUxPXBhcmFtVmFsdWUxO3BhcmFtTmFtZTI9cGFyYW1WYWx1ZTI7cHJvcGVydHlWYWx1ZTE7cHJvcGVydHlWYWx1ZTIuLi4KLSAqIDwvUD4KLSAqLwotcHVibGljIGludGVyZmFjZSBWQ2FyZEludGVycHJldGVyIHsKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB2Q2FyZCBpbnRlcnByZXRhdGlvbiBzdGFydGVkLgotICAgICAqLwotICAgIHZvaWQgc3RhcnQoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHZDYXJkIGludGVycHJldGF0aW9uIGZpbmlzaGVkLgotICAgICAqLwotICAgIHZvaWQgZW5kKCk7Ci0KLSAgICAvKiogCi0gICAgICogQ2FsbGVkIHdoZW4gcGFyc2luZyBvbmUgdkNhcmQgZW50cnkgc3RhcnRlZC4KLSAgICAgKiBNb3JlIHNwZWNpZmljYWxseSwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gIkJFR0lOOlZDQVJEIiBpcyByZWFkLgotICAgICAqLwotICAgIHZvaWQgc3RhcnRFbnRyeSgpOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gcGFyc2luZyBvbmUgdkNhcmQgZW50cnkgZW5kZWQuCi0gICAgICogTW9yZSBzcGVjaWZpY2FsbHksIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuICJFTkQ6VkNBUkQiIGlzIHJlYWQuCi0gICAgICogTm90ZSB0aGF0IHtAbGluayAjc3RhcnRFbnRyeSgpfSBtYXkgYmUgY2FsbGVkIHNpbmNlCi0gICAgICogdkNhcmQgKGVzcGVjaWFsbHkgMi4xKSBhbGxvd3MgbmVzdGVkIHZDYXJkLgotICAgICAqLwotICAgIHZvaWQgZW5kRW50cnkoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHJlYWRpbmcgb25lIHByb3BlcnR5IHN0YXJ0ZWQuCi0gICAgICovCi0gICAgdm9pZCBzdGFydFByb3BlcnR5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiByZWFkaW5nIG9uZSBwcm9wZXJ0eSBlbmRlZC4KLSAgICAgKi8KLSAgICB2b2lkIGVuZFByb3BlcnR5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZ3JvdXAgQSBncm91cCBuYW1lLiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIG9yIG1heSBub3QgYmUKLSAgICAgKiBjYWxsZWQgYXQgYWxsLCBkZXBlbmRpbmcgb24gaG93IG1hbnkgZ3J1b3VwcyBhcmUgYXBwZW5kZWQgdG8gdGhlIHByb3BlcnR5LgotICAgICAqLwotICAgIHZvaWQgcHJvcGVydHlHcm91cChTdHJpbmcgZ3JvdXApOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUgQSBwcm9wZXJ0eSBuYW1lIGxpa2UgIk4iLCAiRk4iLCAiQURSIiwgZXRjLgotICAgICAqLwotICAgIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0eXBlIEEgcGFyYW1ldGVyIG5hbWUgbGlrZSAiRU5DT0RJTkciLCAiQ0hBUlNFVCIsIGV0Yy4KLSAgICAgKi8KLSAgICB2b2lkIHByb3BlcnR5UGFyYW1UeXBlKFN0cmluZyB0eXBlKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2YWx1ZSBBIHBhcmFtZXRlciB2YWx1ZS4gVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCB3aXRob3V0Ci0gICAgICoge0BsaW5rICNwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcpfSBiZWluZyBjYWxsZWQgKHdoZW4gdGhlIHZDYXJkIGlzIHZDYXJkIDIuMSkuCi0gICAgICovCi0gICAgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2YWx1ZXMgTGlzdCBvZiBwcm9wZXJ0eSB2YWx1ZXMuIFRoZSBzaXplIG9mIHZhbHVlcyB3b3VsZCBiZSAxIHVubGVzcwotICAgICAqIGNvcmVzc3BvbmRpbmcgcHJvcGVydHkgbmFtZSBpcyAiTiIsICJBRFIiLCBvciAiT1JHIi4KLSAgICAgKi8KLSAgICB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlNDRhMC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGUge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IGltcGxlbWVudGF0aW9uIHdoaWNoIGFnZ3JlZ2F0ZXMgbW9yZSB0aGFuIG9uZQotICoge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IG9iamVjdHMgYW5kIG1ha2UgYSB1c2VyIG9iamVjdCB0cmVhdCB0aGVtIGFzIG9uZQotICoge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IG9iamVjdC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uIGltcGxlbWVudHMgVkNhcmRJbnRlcnByZXRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFZDYXJkSW50ZXJwcmV0ZXI+IG1JbnRlcnByZXRlckNvbGxlY3Rpb247Ci0KLSAgICBwdWJsaWMgVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb24oQ29sbGVjdGlvbjxWQ2FyZEludGVycHJldGVyPiBpbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgbUludGVycHJldGVyQ29sbGVjdGlvbiA9IGludGVycHJldGVyQ29sbGVjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxWQ2FyZEludGVycHJldGVyPiBnZXRDb2xsZWN0aW9uKCkgewotICAgICAgICByZXR1cm4gbUludGVycHJldGVyQ29sbGVjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmQoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5lbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50cnkoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5zdGFydEVudHJ5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRFbnRyeSgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmVuZEVudHJ5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuc3RhcnRQcm9wZXJ0eSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kUHJvcGVydHkoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5lbmRQcm9wZXJ0eSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlHcm91cChTdHJpbmcgZ3JvdXApIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnByb3BlcnR5R3JvdXAoZ3JvdXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5wcm9wZXJ0eU5hbWUobmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIucHJvcGVydHlQYXJhbVR5cGUodHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5wcm9wZXJ0eVBhcmFtVmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZXMoTGlzdDxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIucHJvcGVydHlWYWx1ZXModmFsdWVzKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYjkzNjkuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVkNhcmRQYXJzZXIgewotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gc3RyZWFtIGFuZCBzZW5kIHRoZSB2Q2FyZCBkYXRhIGludG8gVkNhcmRCdWlsZGVyQmFzZSBvYmplY3QuCi0gICAgICogPC9wPi4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdkNhcmQgMi4xIHNwZWNpZmljYXRpb24gYWxsb3dzICJDSEFSU0VUIiBwYXJhbWV0ZXIsIGFuZCBzb21lIGNhcmVlciBzZXRzCi0gICAgICogbG9jYWwgZW5jb2RpbmcgdG8gaXQuIEZvciBleGFtcGxlLCBKYXBhbmVzZSBwaG9uZSBjYXJlZXIgdXNlcyBTaGlmdF9KSVMsIHdoaWNoIGlzCi0gICAgICogZm9ybWFsbHkgYWxsb3dlZCBpbiB2Q2FyZCAyLjEsIGJ1dCBub3QgYWxsb3dlZCBpbiB2Q2FyZCAzLjAuIEluIHZDYXJkIDIuMSwKLSAgICAgKiBJbiBzb21lIGV4cmVtZSBjYXNlLCBpdCBpcyBhbGxvd2VkIGZvciB2Q2FyZCB0byBoYXZlIGRpZmZlcmVudCBjaGFyc2V0cyBpbiBvbmUgdkNhcmQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFdlIHJlY29tbWVuZCB5b3UgdXNlIHtAbGluayBWQ2FyZFNvdXJjZURldGVjdG9yfSBhbmQgZGV0ZWN0IHdoaWNoIGtpbmQgb2Ygc291cmNlIHRoZQotICAgICAqIHZDYXJkIGNvbWVzIGZyb20gYW5kIGV4cGxpY2l0bHkgc3BlY2lmeSBhIGNoYXJzZXQgdXNpbmcgdGhlIHJlc3VsdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaXMgVGhlIHNvdXJjZSB0byBwYXJzZS4KLSAgICAgKiBAcGFyYW0gaW50ZXJlcHJldGVyIEEge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IG9iamVjdCB3aGljaCB1c2VkIHRvIGNvbnN0cnVjdCBkYXRhLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFZDYXJkSW50ZXJwcmV0ZXIgaW50ZXJlcHJldGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENhbmNlbCBwYXJzaW5nIHZDYXJkLiBVc2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzdG9wIHRoZSBwYXJzZSBpbiB0aGUgb3RoZXIgdGhyZWFkcy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogQWN0dWFsIGNhbmNlbCBpcyBkb25lIGFmdGVyIHBhcnNpbmcgdGhlIGN1cnJlbnQgdmNhcmQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNhbmNlbCgpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VySW1wbF9WMjEuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlckltcGxfVjIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMzY1ZWIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VySW1wbF9WMjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmROZXN0ZWRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkVmVyc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiA8cD4KLSAqIEJhc2ljIGltcGxlbWVudGF0aW9uIGFjaGlldmluZyB2Q2FyZCBwYXJzaW5nLiBCYXNlZCBvbiB2Q2FyZCAyLjEsCi0gKiA8L3A+Ci0gKiBAaGlkZQotICovCi0vKiBwYWNrYWdlICovIGNsYXNzIFZDYXJkUGFyc2VySW1wbF9WMjEgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkUGFyc2VySW1wbF9WMjEiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRW1wdHlJbnRlcnByZXRlciBpbXBsZW1lbnRzIFZDYXJkSW50ZXJwcmV0ZXIgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZW5kKCkgewotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbnRyeSgpIHsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZW5kUHJvcGVydHkoKSB7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50cnkoKSB7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJvcGVydHkoKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIEN1c3RvbUJ1ZmZlcmVkUmVhZGVyIGV4dGVuZHMgQnVmZmVyZWRSZWFkZXIgewotICAgICAgICBwcml2YXRlIGxvbmcgbVRpbWU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE5lZWRlZCBzaW5jZSAibmV4dCBsaW5lIiBtYXkgYmUgbnVsbCBkdWUgdG8gZW5kIG9mIGxpbmUuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU5leHRMaW5lSXNWYWxpZDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbU5leHRMaW5lOwotCi0gICAgICAgIHB1YmxpYyBDdXN0b21CdWZmZXJlZFJlYWRlcihSZWFkZXIgaW4pIHsKLSAgICAgICAgICAgIHN1cGVyKGluKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHJlYWRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChtTmV4dExpbmVJc1ZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJldCA9IG1OZXh0TGluZTsKLSAgICAgICAgICAgICAgICBtTmV4dExpbmUgPSBudWxsOwotICAgICAgICAgICAgICAgIG1OZXh0TGluZUlzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IHN1cGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICBsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgbVRpbWUgKz0gZW5kIC0gc3RhcnQ7Ci0gICAgICAgICAgICByZXR1cm4gbGluZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIG9uZSBsaW5lLCBidXQgbWFrZSB0aGlzIG9iamVjdCBzdG9yZSBpdCBpbiBpdHMgcXVldWUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIHBlZWtMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmICghbU5leHRMaW5lSXNWYWxpZCkgewotICAgICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IHN1cGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBtVGltZSArPSBlbmQgLSBzdGFydDsKLQotICAgICAgICAgICAgICAgIG1OZXh0TGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgbU5leHRMaW5lSXNWYWxpZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBtTmV4dExpbmU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRUb3RhbG1pbGxpc2Vjb25kKCkgewotICAgICAgICAgICAgcmV0dXJuIG1UaW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRU5DT0RJTkcgPSAiOEJJVCI7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQ2FuY2VsZWQ7Ci0gICAgcHJvdGVjdGVkIFZDYXJkSW50ZXJwcmV0ZXIgbUludGVycHJldGVyOwotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBtSW50ZXJtZWRpYXRlQ2hhcnNldDsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSBlbmNvZGluZyB0eXBlIGZvciBkZWNvbmRpbmcgYnl0ZSBzdHJlYW1zLiBUaGlzIG1lbWJlciB2YXJpYWJsZSBpcwotICAgICAqIHJlc2V0IHRvIGEgZGVmYXVsdCBlbmNvZGluZyBldmVyeSB0aW1lIHdoZW4gYSBuZXcgaXRlbSBjb21lcy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogIkVuY29kaW5nIiBpbiB2Q2FyZCBpcyBkaWZmZXJlbnQgZnJvbSAiQ2hhcnNldCIuIEl0IGlzIG1haW5seSB1c2VkIGZvcgotICAgICAqIGFkZHJlc3Nlcywgbm90ZXMsIGltYWdlcy4gIjdCSVQiLCAiOEJJVCIsICJCQVNFNjQiLCBhbmQKLSAgICAgKiAiUVVPVEVELVBSSU5UQUJMRSIgYXJlIGtub3duIGV4YW1wbGVzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1DdXJyZW50RW5jb2Rpbmc7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVhZGVyIG9iamVjdCB0byBiZSB1c2VkIGludGVybmFsbHkuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIERldmVsb3BlcnMgc2hvdWxkIG5vdCBkaXJlY3RseSByZWFkIGEgbGluZSBmcm9tIHRoaXMgb2JqZWN0LiBVc2UKLSAgICAgKiBnZXRMaW5lKCkgdW5sZXNzIHRoZXJlIHNvbWUgcmVhc29uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ3VzdG9tQnVmZmVyZWRSZWFkZXIgbVJlYWRlcjsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFNldCBmb3Igc3RvcmluZyB1bmtvbnduIFRZUEUgYXR0cmlidXRlcywgd2hpY2ggaXMgbm90IGFjY2VwdGFibGUgaW4gdkNhcmQKLSAgICAgKiBzcGVjaWZpY2F0aW9uLCBidXQgaGFwcGVucyB0byBiZSBzZWVuIGluIHJlYWwgd29ybGQgdkNhcmQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBTZXQ8U3RyaW5nPiBtVW5rbm93blR5cGVTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBTZXQgZm9yIHN0b3JpbmcgdW5rb253biBWQUxVRSBhdHRyaWJ1dGVzLCB3aGljaCBpcyBub3QgYWNjZXB0YWJsZSBpbgotICAgICAqIHZDYXJkIHNwZWNpZmljYXRpb24sIGJ1dCBoYXBwZW5zIHRvIGJlIHNlZW4gaW4gcmVhbCB3b3JsZCB2Q2FyZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIFNldDxTdHJpbmc+IG1Vbmtub3duVmFsdWVTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLQotICAgIC8vIEluIHNvbWUgY2FzZXMsIHZDYXJkIGlzIG5lc3RlZC4gQ3VycmVudGx5LCB3ZSBvbmx5IGNvbnNpZGVyIHRoZSBtb3N0Ci0gICAgLy8gaW50ZXJpb3IgdkNhcmQgZGF0YS4KLSAgICAvLyBTZWUgdjIxX2ZvbWFfMS52Y2YgaW4gdGVzdCBkaXJlY3RvcnkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgLy8gVE9ETzogRG9uJ3QgaWdub3JlIGJ5IHVzaW5nIGNvdW50LCBidXQgcmVhZCBhbGwgb2YgaW5mb3JtYXRpb24gb3V0c2lkZSB2Q2FyZC4KLSAgICBwcml2YXRlIGludCBtTmVzdENvdW50OwotCi0gICAgLy8gVXNlZCBvbmx5IGZvciBwYXJzaW5nIEVORDpWQ0FSRC4KLSAgICBwcml2YXRlIFN0cmluZyBtUHJldmlvdXNMaW5lOwotCi0gICAgLy8gRm9yIG1lYXN1cmluZyBwZXJmb3JtYW5jZS4KLSAgICBwcml2YXRlIGxvbmcgbVRpbWVUb3RhbDsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVSZWFkU3RhcnRSZWNvcmQ7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUmVhZEVuZFJlY29yZDsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVTdGFydFByb3BlcnR5OwotICAgIHByaXZhdGUgbG9uZyBtVGltZUVuZFByb3BlcnR5OwotICAgIHByaXZhdGUgbG9uZyBtVGltZVBhcnNlSXRlbXM7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUGFyc2VMaW5lQW5kSGFuZGxlR3JvdXA7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUGFyc2VQcm9wZXJ0eVZhbHVlczsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVQYXJzZUFkck9yZ047Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lSGFuZGxlTWlzY1Byb3BlcnR5VmFsdWU7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lSGFuZGxlUXVvdGVkUHJpbnRhYmxlOwotICAgIHByaXZhdGUgbG9uZyBtVGltZUhhbmRsZUJhc2U2NDsKLQotICAgIHB1YmxpYyBWQ2FyZFBhcnNlckltcGxfVjIxKCkgewotICAgICAgICB0aGlzKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfREVGQVVMVCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VySW1wbF9WMjEoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBpZiAoKHZjYXJkVHlwZSAmIFZDYXJkQ29uZmlnLkZMQUdfVE9SRUxBVEVfTkVTVCkgIT0gMCkgewotICAgICAgICAgICAgbU5lc3RDb3VudCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBtSW50ZXJtZWRpYXRlQ2hhcnNldCA9ICBWQ2FyZENvbmZpZy5ERUZBVUxUX0lOVEVSTUVESUFURV9DSEFSU0VUOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFBhcnNlcyB0aGUgZmlsZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIC8vIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij52Y2FyZF9maWxlID0gW3dzbHNdIHZjYXJkIFt3c2xzXTwvcHJlPgotICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlVkNhcmRGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gcmVhZGluZ0ZpcnN0RmlsZSA9IHRydWU7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBpZiAobUNhbmNlbGVkKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXBhcnNlT25lVkNhcmQocmVhZGluZ0ZpcnN0RmlsZSkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlYWRpbmdGaXJzdEZpbGUgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTmVzdENvdW50ID4gMCkgewotICAgICAgICAgICAgYm9vbGVhbiB1c2VDYWNoZSA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OZXN0Q291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIHJlYWRFbmRWQ2FyZCh1c2VDYWNoZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgdXNlQ2FjaGUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIGEgZ2l2ZW4gcHJvcGVydHkgbmFtZSBpcyBhIHZhbGlkIHByb3BlcnR5IG5hbWUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZFByb3BlcnR5TmFtZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0gICAgICAgIGlmICghKGdldEtub3duUHJvcGVydHlOYW1lU2V0KCkuY29udGFpbnMocHJvcGVydHlOYW1lLnRvVXBwZXJDYXNlKCkpIHx8Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoIlgtIikpCi0gICAgICAgICAgICAgICAgJiYgIW1Vbmtub3duVHlwZVNldC5jb250YWlucyhwcm9wZXJ0eU5hbWUpKSB7Ci0gICAgICAgICAgICBtVW5rbm93blR5cGVTZXQuYWRkKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiUHJvcGVydHkgbmFtZSB1bnN1cHBvcnRlZCBieSB2Q2FyZCAyLjE6ICIgKyBwcm9wZXJ0eU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gU3RyaW5nLiBJdCBtYXkgYmUgbnVsbCwgb3IgaXRzIGxlbmd0aCBtYXkgYmUgMAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbVJlYWRlci5yZWFkTGluZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgcGVla0xpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbVJlYWRlci5wZWVrTGluZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gU3RyaW5nIHdpdGggaXQncyBsZW5ndGggPiAwCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgVkNhcmRFeGNlcHRpb24gd2hlbiB0aGUgc3RyZWFtIHJlYWNoZWQgZW5kIG9mIGxpbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5vbkVtcHR5TGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGxpbmUgPSBnZXRMaW5lKCk7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJSZWFjaGVkIGVuZCBvZiBidWZmZXIuIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW5lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiB2Y2FyZCA9ICJCRUdJTiIgW3dzXSAiOiIgW3dzXSAiVkNBUkQiIFt3c10gMSpDUkxGCi0gICAgICogICAgICAgICBpdGVtcyAqQ1JMRgotICAgICAqICAgICAgICAgIkVORCIgW3dzXSAiOiIgW3dzXSAiVkNBUkQiCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHBhcnNlT25lVkNhcmQoYm9vbGVhbiBmaXJzdFJlYWQpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGFsbG93R2FyYmFnZSA9IGZhbHNlOwotICAgICAgICBpZiAoZmlyc3RSZWFkKSB7Ci0gICAgICAgICAgICBpZiAobU5lc3RDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OZXN0Q291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXJlYWRCZWdpblZDYXJkKGFsbG93R2FyYmFnZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhbGxvd0dhcmJhZ2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcmVhZEJlZ2luVkNhcmQoYWxsb3dHYXJiYWdlKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGxvbmcgYmVmb3JlU3RhcnRFbnRyeSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBtSW50ZXJwcmV0ZXIuc3RhcnRFbnRyeSgpOwotICAgICAgICBtVGltZVJlYWRTdGFydFJlY29yZCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZm9yZVN0YXJ0RW50cnk7Ci0KLSAgICAgICAgZmluYWwgbG9uZyBiZWZvcmVQYXJzZUl0ZW1zID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIHBhcnNlSXRlbXMoKTsKLSAgICAgICAgbVRpbWVQYXJzZUl0ZW1zICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gYmVmb3JlUGFyc2VJdGVtczsKLQotICAgICAgICByZWFkRW5kVkNhcmQodHJ1ZSwgZmFsc2UpOwotCi0gICAgICAgIGZpbmFsIGxvbmcgYmVmb3JlRW5kRW50cnkgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgbUludGVycHJldGVyLmVuZEVudHJ5KCk7Ci0gICAgICAgIG1UaW1lUmVhZEVuZFJlY29yZCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZm9yZUVuZEVudHJ5OwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRydWUgd2hlbiBzdWNjZXNzZnVsLiBGYWxzZSB3aGVuIHJlYWNoaW5nIHRoZSBlbmQgb2YgbGluZQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFZDYXJkRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEJlZ2luVkNhcmQoYm9vbGVhbiBhbGxvd0dhcmJhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBsaW5lID0gZ2V0TGluZSgpOwotICAgICAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHN0ckFycmF5ID0gbGluZS5zcGxpdCgiOiIsIDIpOwotICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHN0ckFycmF5Lmxlbmd0aDsKLQotICAgICAgICAgICAgLy8gQWx0aG91Z2ggdkNhcmQgMi4xLzMuMCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGFsbG93IGxvd2VyIGNhc2VzLAotICAgICAgICAgICAgLy8gd2UgZm91bmQgdkNhcmQgZmlsZSBlbWl0dGVkIGJ5IHNvbWUgZXh0ZXJuYWwgdkNhcmQgZXhwb3RlciBoYXZlIHN1Y2gKLSAgICAgICAgICAgIC8vIGludmFsaWQgU3RyaW5ncy4KLSAgICAgICAgICAgIC8vIFNvIHdlIGFsbG93IGl0LgotICAgICAgICAgICAgLy8gZS5nLgotICAgICAgICAgICAgLy8gQkVHSU46dkNhcmQKLSAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMiAmJiBzdHJBcnJheVswXS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgiQkVHSU4iKQotICAgICAgICAgICAgICAgICAgICAmJiBzdHJBcnJheVsxXS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgiVkNBUkQiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmICghYWxsb3dHYXJiYWdlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXN0Q291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBsaW5lOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJFeHBlY3RlZCBTdHJpbmcgXCJCRUdJTjpWQ0FSRFwiIGRpZCBub3QgY29tZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKEluc3RlYWQsIFwiIiArIGxpbmUgKyAiXCIgY2FtZSkiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKGFsbG93R2FyYmFnZSk7Ci0KLSAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJSZWFjaGVkIHdoZXJlIG11c3Qgbm90IGJlIHJlYWNoZWQuIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIGFyZ3VtZW50cyB1c2VDYWNoZSBhbmQgYWxsb3dHYXJiYXNlIGFyZSB1c3VhbGx5IHRydWUgYW5kIGZhbHNlCi0gICAgICogYWNjb3JkaW5nbHkgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvdXRzaWRlIHRoaXMgZnVuY3Rpb24gaXRzZWxmLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXNlQ2FjaGUgV2hlbiB0cnVlLCBsaW5lIGlzIG9idGFpbmVkIGZyb20gbVByZXZpb3VzbGluZS4KLSAgICAgKiAgICAgICAgICAgIE90aGVyd2lzZSwgZ2V0TGluZSgpIGlzIHVzZWQuCi0gICAgICogQHBhcmFtIGFsbG93R2FyYmFnZSBXaGVuIHRydWUsIGlnbm9yZSBub24gIkVORDpWQ0FSRCIgbGluZS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBWQ2FyZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlYWRFbmRWQ2FyZChib29sZWFuIHVzZUNhY2hlLCBib29sZWFuIGFsbG93R2FyYmFnZSkgdGhyb3dzIElPRXhjZXB0aW9uLAotICAgICAgICAgICAgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgaWYgKHVzZUNhY2hlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhvdWdoIHZDYXJkIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYWxsb3cgbG93ZXIgY2FzZXMsCi0gICAgICAgICAgICAgICAgLy8gc29tZSBkYXRhIG1heSBoYXZlIHRoZW0sIHNvIHdlIGFsbG93IGl0LgotICAgICAgICAgICAgICAgIGxpbmUgPSBtUHJldmlvdXNMaW5lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBsaW5lID0gZ2V0TGluZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkV4cGVjdGVkIEVORDpWQ0FSRCB3YXMgbm90IGZvdW5kLiIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIHN0ckFycmF5ID0gbGluZS5zcGxpdCgiOiIsIDIpOwotICAgICAgICAgICAgaWYgKHN0ckFycmF5Lmxlbmd0aCA9PSAyICYmIHN0ckFycmF5WzBdLnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKCJFTkQiKQotICAgICAgICAgICAgICAgICAgICAmJiBzdHJBcnJheVsxXS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgiVkNBUkQiKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWFsbG93R2FyYmFnZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiRU5EOlZDQVJEICE9IFwiIiArIG1QcmV2aW91c0xpbmUgKyAiXCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVzZUNhY2hlID0gZmFsc2U7Ci0gICAgICAgIH0gd2hpbGUgKGFsbG93R2FyYmFnZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBpdGVtcyA9ICpDUkxGIGl0ZW0gLyBpdGVtCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcGFyc2VJdGVtcygpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGVuZGVkID0gZmFsc2U7Ci0KLSAgICAgICAgZmluYWwgbG9uZyBiZWZvcmVCZWdpblByb3BlcnR5ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIG1JbnRlcnByZXRlci5zdGFydFByb3BlcnR5KCk7Ci0gICAgICAgIG1UaW1lU3RhcnRQcm9wZXJ0eSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZm9yZUJlZ2luUHJvcGVydHk7Ci0gICAgICAgIGVuZGVkID0gcGFyc2VJdGVtKCk7Ci0gICAgICAgIGlmICghZW5kZWQpIHsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgYmVmb3JlRW5kUHJvcGVydHkgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1JbnRlcnByZXRlci5lbmRQcm9wZXJ0eSgpOwotICAgICAgICAgICAgbVRpbWVFbmRQcm9wZXJ0eSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZm9yZUVuZFByb3BlcnR5OwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKCFlbmRlZCkgewotICAgICAgICAgICAgZmluYWwgbG9uZyBiZWZvcmVTdGFydFByb3BlcnR5ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtSW50ZXJwcmV0ZXIuc3RhcnRQcm9wZXJ0eSgpOwotICAgICAgICAgICAgbVRpbWVTdGFydFByb3BlcnR5ICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gYmVmb3JlU3RhcnRQcm9wZXJ0eTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZW5kZWQgPSBwYXJzZUl0ZW0oKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiSW52YWxpZCBsaW5lIHdoaWNoIGxvb2tzIGxpa2Ugc29tZSBjb21tZW50IHdhcyBmb3VuZC4gSWdub3JlZC4iKTsKLSAgICAgICAgICAgICAgICBlbmRlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWVuZGVkKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBiZWZvcmVFbmRQcm9wZXJ0eSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIG1JbnRlcnByZXRlci5lbmRQcm9wZXJ0eSgpOwotICAgICAgICAgICAgICAgIG1UaW1lRW5kUHJvcGVydHkgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWZvcmVFbmRQcm9wZXJ0eTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogaXRlbSA9IFtncm91cHMgIi4iXSBuYW1lIFtwYXJhbXNdICI6IiB2YWx1ZSBDUkxGIC8gW2dyb3VwcyAiLiJdICJBRFIiCi0gICAgICogW3BhcmFtc10gIjoiIGFkZHJlc3NwYXJ0cyBDUkxGIC8gW2dyb3VwcyAiLiJdICJPUkciIFtwYXJhbXNdICI6IiBvcmdwYXJ0cwotICAgICAqIENSTEYgLyBbZ3JvdXBzICIuIl0gIk4iIFtwYXJhbXNdICI6IiBuYW1lcGFydHMgQ1JMRiAvIFtncm91cHMgIi4iXQotICAgICAqICJBR0VOVCIgW3BhcmFtc10gIjoiIHZjYXJkIENSTEYKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwYXJzZUl0ZW0oKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgbUN1cnJlbnRFbmNvZGluZyA9IERFRkFVTFRfRU5DT0RJTkc7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBnZXROb25FbXB0eUxpbmUoKTsKLSAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0gICAgICAgIFN0cmluZ1tdIHByb3BlcnR5TmFtZUFuZFZhbHVlID0gc2VwYXJhdGVMaW5lQW5kSGFuZGxlR3JvdXAobGluZSk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eU5hbWVBbmRWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcGVydHlOYW1lQW5kVmFsdWUubGVuZ3RoICE9IDIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uKCJJbnZhbGlkIGxpbmUgXCIiICsgbGluZSArICJcIiIpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVswXS50b1VwcGVyQ2FzZSgpOwotICAgICAgICBTdHJpbmcgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5TmFtZUFuZFZhbHVlWzFdOwotCi0gICAgICAgIG1UaW1lUGFyc2VMaW5lQW5kSGFuZGxlR3JvdXAgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLQotICAgICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiQURSIikgfHwgcHJvcGVydHlOYW1lLmVxdWFscygiT1JHIikgfHwgcHJvcGVydHlOYW1lLmVxdWFscygiTiIpKSB7Ci0gICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgaGFuZGxlTXVsdGlwbGVQcm9wZXJ0eVZhbHVlKHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICBtVGltZVBhcnNlQWRyT3JnTiArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIkFHRU5UIikpIHsKLSAgICAgICAgICAgIGhhbmRsZUFnZW50KHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKGlzVmFsaWRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKSkgewotICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIkJFR0lOIikpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlWYWx1ZS5lcXVhbHMoIlZDQVJEIikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkTmVzdGVkRXhjZXB0aW9uKCJUaGlzIHZDYXJkIGhhcyBuZXN0ZWQgdkNhcmQgZGF0YSBpbiBpdC4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlVua25vd24gQkVHSU4gdHlwZTogIiArIHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiVkVSU0lPTiIpICYmICFwcm9wZXJ0eVZhbHVlLmVxdWFscyhnZXRWZXJzaW9uU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkVmVyc2lvbkV4Y2VwdGlvbigiSW5jb21wYXRpYmxlIHZlcnNpb246ICIgKyBwcm9wZXJ0eVZhbHVlICsgIiAhPSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGdldFZlcnNpb25TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgaGFuZGxlUHJvcGVydHlWYWx1ZShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgbVRpbWVQYXJzZVByb3BlcnR5VmFsdWVzICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlVua25vd24gcHJvcGVydHkgbmFtZTogXCIiICsgcHJvcGVydHlOYW1lICsgIlwiIik7Ci0gICAgfQotCi0gICAgLy8gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbiwgdGhlIHN0YXRlcyBmb3IgZ3JvdXAgYW5kIHByb3BlcnR5IG5hbWUgYXJlIG1lcmdlZCBpbnRvIG9uZS4KLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgU1RBVEVfR1JPVVBfT1JfUFJPUEVSVFlfTkFNRSA9IDA7Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX1BBUkFNUyA9IDE7Ci0gICAgLy8gdkNhcmQgMy4wIHNwZWNpZmljYXRpb24gYWxsb3dzIGRvdWJsZS1xdW90ZWQgcGFyYW1ldGVycywgd2hpbGUgdkNhcmQgMi4xIGRvZXMgbm90LgotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCBTVEFURV9QQVJBTVNfSU5fRFFVT1RFID0gMjsKLQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBzZXBhcmF0ZUxpbmVBbmRIYW5kbGVHcm91cChTdHJpbmcgbGluZSkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gcHJvcGVydHlOYW1lQW5kVmFsdWUgPSBuZXcgU3RyaW5nWzJdOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gbGluZS5sZW5ndGgoKTsKLSAgICAgICAgaWYgKGxlbmd0aCA+IDAgJiYgbGluZS5jaGFyQXQoMCkgPT0gJyMnKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzdGF0ZSA9IFNUQVRFX0dST1VQX09SX1BST1BFUlRZX05BTUU7Ci0gICAgICAgIGludCBuYW1lSW5kZXggPSAwOwotCi0gICAgICAgIC8vIFRoaXMgbG9vcCBpcyBkZXZlbG9wZWQgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHRha2UgY2FyZSBvZiBib3R0bGUgbmVjayBoZXJlLgotICAgICAgICAvLyBSZWZhY3RvciBjYXJlZnVsbHkgd2hlbiB5b3UgbmVlZCB0byBkbyBzby4KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgY2hhciBjaCA9IGxpbmUuY2hhckF0KGkpOwotICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfR1JPVVBfT1JfUFJPUEVSVFlfTkFNRTogewotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJzonKSB7ICAvLyBFbmQgb2YgYSBwcm9wZXJ0eSBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGxpbmUuc3Vic3RyaW5nKG5hbWVJbmRleCwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkVORCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVswXSA9IHByb3BlcnR5TmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZUFuZFZhbHVlWzFdID0gbGluZS5zdWJzdHJpbmcoaSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVsxXSA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZUFuZFZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcuJykgeyAgLy8gRWFjaCBncm91cCBpcyBmb2xsb3dlZCBieSB0aGUgZG90LgotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGdyb3VwTmFtZSA9IGxpbmUuc3Vic3RyaW5nKG5hbWVJbmRleCwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRW1wdHkgZ3JvdXAgZm91bmQuIElnbm9yaW5nLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlHcm91cChncm91cE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUluZGV4ID0gaSArIDE7ICAvLyBOZXh0IHNob3VsZCBiZSBhbm90aGVyIGdyb3VwIG9yIGEgcHJvcGVydHkgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnOycpIHsgIC8vIEVuZCBvZiBwcm9wZXJ0eSBuYW1lIGFuZCBiZWdpbm5lbmcgb2YgcGFyYW1ldGVycy4gIAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGxpbmUuc3Vic3RyaW5nKG5hbWVJbmRleCwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkVORCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVswXSA9IHByb3BlcnR5TmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVJbmRleCA9IGkgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9QQVJBTVM7ICAvLyBTdGFydCBwYXJhbWV0ZXIgcGFyc2luZy4KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBjb21tYSBzdXBwb3J0IChpbiB2Q2FyZCAzLjAgYW5kIDQuMCkuCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1BBUkFNUzogewotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoVkNhcmRDb25zdGFudHMuVkVSU0lPTl9WMjEuZXF1YWxzSWdub3JlQ2FzZShnZXRWZXJzaW9uU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkRvdWJsZS1xdW90ZWQgcGFyYW1zIGZvdW5kIGluIHZDYXJkIDIuMS4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2lsZW50bHkgYWxsb3cgaXQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfUEFSQU1TX0lOX0RRVU9URTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnOycpIHsgIC8vIFN0YXJ0cyBhbm90aGVyIHBhcmFtLgotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlUGFyYW1zKGxpbmUuc3Vic3RyaW5nKG5hbWVJbmRleCwgaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUluZGV4ID0gaSArIDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJzonKSB7ICAvLyBFbmQgb2YgcGFyYW0gYW5kIGJlZ2luZW5uaW5nIG9mIHZhbHVlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBhcmFtcyhsaW5lLnN1YnN0cmluZyhuYW1lSW5kZXgsIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZUFuZFZhbHVlWzFdID0gbGluZS5zdWJzdHJpbmcoaSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVsxXSA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZUFuZFZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1BBUkFNU19JTl9EUVVPVEU6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICciJykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFZDYXJkQ29uc3RhbnRzLlZFUlNJT05fVjIxLmVxdWFsc0lnbm9yZUNhc2UoZ2V0VmVyc2lvblN0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJEb3VibGUtcXVvdGVkIHBhcmFtcyBmb3VuZCBpbiB2Q2FyZCAyLjEuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpbGVudGx5IGFsbG93IGl0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1BBUkFNUzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbigiSW52YWxpZCBsaW5lOiBcIiIgKyBsaW5lICsgIlwiIik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBwYXJhbXMgPSAiOyIgW3dzXSBwYXJhbWxpc3QgcGFyYW1saXN0ID0gcGFyYW1saXN0IFt3c10gIjsiIFt3c10gcGFyYW0gLwotICAgICAqIHBhcmFtIHBhcmFtID0gIlRZUEUiIFt3c10gIj0iIFt3c10gcHR5cGV2YWwgLyAiVkFMVUUiIFt3c10gIj0iIFt3c10KLSAgICAgKiBwdmFsdWV2YWwgLyAiRU5DT0RJTkciIFt3c10gIj0iIFt3c10gcGVuY29kaW5ndmFsIC8gIkNIQVJTRVQiIFt3c10gIj0iCi0gICAgICogW3dzXSBjaGFyc2V0dmFsIC8gIkxBTkdVQUdFIiBbd3NdICI9IiBbd3NdIGxhbmd2YWwgLyAiWC0iIHdvcmQgW3dzXSAiPSIKLSAgICAgKiBbd3NdIHdvcmQgLyBrbm93bnR5cGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQYXJhbXMoU3RyaW5nIHBhcmFtcykgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gc3RyQXJyYXkgPSBwYXJhbXMuc3BsaXQoIj0iLCAyKTsKLSAgICAgICAgaWYgKHN0ckFycmF5Lmxlbmd0aCA9PSAyKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFyYW1OYW1lID0gc3RyQXJyYXlbMF0udHJpbSgpLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZSA9IHN0ckFycmF5WzFdLnRyaW0oKTsKLSAgICAgICAgICAgIGlmIChwYXJhbU5hbWUuZXF1YWxzKCJUWVBFIikpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVUeXBlKHBhcmFtVmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbU5hbWUuZXF1YWxzKCJWQUxVRSIpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlVmFsdWUocGFyYW1WYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtTmFtZS5lcXVhbHMoIkVOQ09ESU5HIikpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVFbmNvZGluZyhwYXJhbVZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lLmVxdWFscygiQ0hBUlNFVCIpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ2hhcnNldChwYXJhbVZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lLmVxdWFscygiTEFOR1VBR0UiKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUxhbmd1YWdlKHBhcmFtVmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbU5hbWUuc3RhcnRzV2l0aCgiWC0iKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUFueVBhcmFtKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiVW5rbm93biB0eXBlIFwiIiArIHBhcmFtTmFtZSArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaGFuZGxlUGFyYW1XaXRob3V0TmFtZShzdHJBcnJheVswXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB2Q2FyZCAzLjAgcGFyc2VyIGltcGxlbWVudGF0aW9uIG1heSB0aHJvdyBWQ2FyZEV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQYXJhbVdpdGhvdXROYW1lKGZpbmFsIFN0cmluZyBwYXJhbVZhbHVlKSB0aHJvd3MgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBoYW5kbGVUeXBlKHBhcmFtVmFsdWUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogcHR5cGV2YWwgPSBrbm93bnR5cGUgLyAiWC0iIHdvcmQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVUeXBlKGZpbmFsIFN0cmluZyBwdHlwZXZhbCkgewotICAgICAgICBpZiAoIShnZXRLbm93blR5cGVTZXQoKS5jb250YWlucyhwdHlwZXZhbC50b1VwcGVyQ2FzZSgpKQotICAgICAgICAgICAgICAgIHx8IHB0eXBldmFsLnN0YXJ0c1dpdGgoIlgtIikpCi0gICAgICAgICAgICAgICAgJiYgIW1Vbmtub3duVHlwZVNldC5jb250YWlucyhwdHlwZXZhbCkpIHsKLSAgICAgICAgICAgIG1Vbmtub3duVHlwZVNldC5hZGQocHR5cGV2YWwpOwotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgiVFlQRSB1bnN1cHBvcnRlZCBieSAlczogIiwgZ2V0VmVyc2lvbigpLCBwdHlwZXZhbCkpOwotICAgICAgICB9Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVHlwZSgiVFlQRSIpOwotICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVZhbHVlKHB0eXBldmFsKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHB2YWx1ZXZhbCA9ICJJTkxJTkUiIC8gIlVSTCIgLyAiQ09OVEVOVC1JRCIgLyAiQ0lEIiAvICJYLSIgd29yZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVZhbHVlKGZpbmFsIFN0cmluZyBwdmFsdWV2YWwpIHsKLSAgICAgICAgaWYgKCEoZ2V0S25vd25WYWx1ZVNldCgpLmNvbnRhaW5zKHB2YWx1ZXZhbC50b1VwcGVyQ2FzZSgpKQotICAgICAgICAgICAgICAgIHx8IHB2YWx1ZXZhbC5zdGFydHNXaXRoKCJYLSIpCi0gICAgICAgICAgICAgICAgfHwgbVVua25vd25WYWx1ZVNldC5jb250YWlucyhwdmFsdWV2YWwpKSkgewotICAgICAgICAgICAgbVVua25vd25WYWx1ZVNldC5hZGQocHZhbHVldmFsKTsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJUaGUgdmFsdWUgdW5zdXBwb3J0ZWQgYnkgVFlQRSBvZiAlczogIiwgZ2V0VmVyc2lvbigpLCBwdmFsdWV2YWwpKTsKLSAgICAgICAgfQotICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVR5cGUoIlZBTFVFIik7Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVmFsdWUocHZhbHVldmFsKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHBlbmNvZGluZ3ZhbCA9ICI3QklUIiAvICI4QklUIiAvICJRVU9URUQtUFJJTlRBQkxFIiAvICJCQVNFNjQiIC8gIlgtIiB3b3JkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRW5jb2RpbmcoU3RyaW5nIHBlbmNvZGluZ3ZhbCkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdldEF2YWlsYWJsZUVuY29kaW5nU2V0KCkuY29udGFpbnMocGVuY29kaW5ndmFsKSB8fAotICAgICAgICAgICAgICAgIHBlbmNvZGluZ3ZhbC5zdGFydHNXaXRoKCJYLSIpKSB7Ci0gICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVR5cGUoIkVOQ09ESU5HIik7Ci0gICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVZhbHVlKHBlbmNvZGluZ3ZhbCk7Ci0gICAgICAgICAgICBtQ3VycmVudEVuY29kaW5nID0gcGVuY29kaW5ndmFsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJVbmtub3duIGVuY29kaW5nIFwiIiArIHBlbmNvZGluZ3ZhbCArICJcIiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogdkNhcmQgMi4xIHNwZWNpZmljYXRpb24gb25seSBhbGxvd3MgdXMtYXNjaWkgYW5kIGlzby04ODU5LXh4eCAoU2VlIFJGQyAxNTIxKSwKLSAgICAgKiBidXQgcmVjZW50IHZDYXJkIGZpbGVzIG9mdGVuIGNvbnRhaW4gb3RoZXIgY2hhcnNldCBsaWtlIFVURi04LCBTSElGVF9KSVMsIGV0Yy4KLSAgICAgKiBXZSBhbGxvdyBhbnkgY2hhcnNldC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhcnNldChTdHJpbmcgY2hhcnNldHZhbCkgewotICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVR5cGUoIkNIQVJTRVQiKTsKLSAgICAgICAgbUludGVycHJldGVyLnByb3BlcnR5UGFyYW1WYWx1ZShjaGFyc2V0dmFsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWUgYWxzbyBTZWN0aW9uIDcuMSBvZiBSRkMgMTUyMQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUxhbmd1YWdlKFN0cmluZyBsYW5ndmFsKSB0aHJvd3MgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdbXSBzdHJBcnJheSA9IGxhbmd2YWwuc3BsaXQoIi0iKTsKLSAgICAgICAgaWYgKHN0ckFycmF5Lmxlbmd0aCAhPSAyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkludmFsaWQgTGFuZ3VhZ2U6IFwiIiArIGxhbmd2YWwgKyAiXCIiKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdG1wID0gc3RyQXJyYXlbMF07Ci0gICAgICAgIGludCBsZW5ndGggPSB0bXAubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghaXNBc2NpaUxldHRlcih0bXAuY2hhckF0KGkpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiSW52YWxpZCBMYW5ndWFnZTogXCIiICsgbGFuZ3ZhbCArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRtcCA9IHN0ckFycmF5WzFdOwotICAgICAgICBsZW5ndGggPSB0bXAubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghaXNBc2NpaUxldHRlcih0bXAuY2hhckF0KGkpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiSW52YWxpZCBMYW5ndWFnZTogXCIiICsgbGFuZ3ZhbCArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVHlwZShWQ2FyZENvbnN0YW50cy5QQVJBTV9MQU5HVUFHRSk7Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVmFsdWUobGFuZ3ZhbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQXNjaWlMZXR0ZXIoY2hhciBjaCkgewotICAgICAgICBpZiAoKGNoID49ICdhJyAmJiBjaCA8PSAneicpIHx8IChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1haW5seSBmb3IgIlgtIiB0eXBlLiBUaGlzIGFjY2VwdHMgYW55IGtpbmQgb2YgdHlwZSB3aXRob3V0IGNoZWNrLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFueVBhcmFtKFN0cmluZyBwYXJhbU5hbWUsIFN0cmluZyBwYXJhbVZhbHVlKSB7Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVHlwZShwYXJhbU5hbWUpOwotICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVZhbHVlKHBhcmFtVmFsdWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHByb3BlcnR5VmFsdWUpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHVwcGVyRW5jb2RpbmcgPSBtQ3VycmVudEVuY29kaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgIGlmICh1cHBlckVuY29kaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR19RUCkpIHsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBnZXRRdW90ZWRQcmludGFibGUocHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiB2ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICB2LmFkZChyZXN1bHQpOwotICAgICAgICAgICAgbUludGVycHJldGVyLnByb3BlcnR5VmFsdWVzKHYpOwotICAgICAgICAgICAgbVRpbWVIYW5kbGVRdW90ZWRQcmludGFibGUgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgfSBlbHNlIGlmICh1cHBlckVuY29kaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR19CQVNFNjQpCi0gICAgICAgICAgICAgICAgfHwgdXBwZXJFbmNvZGluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfQikpIHsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIC8vIEl0IGlzIHZlcnkgcmFyZSwgYnV0IHNvbWUgQkFTRTY0IGRhdGEgbWF5IGJlIHNvIGJpZyB0aGF0Ci0gICAgICAgICAgICAvLyBPdXRPZk1lbW9yeUVycm9yIG9jY3Vycy4gVG8gaWdub3JlIHN1Y2ggY2FzZXMsIHVzZSB0cnktY2F0Y2guCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IGFycmF5TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIGFycmF5TGlzdC5hZGQoZ2V0QmFzZTY0KHByb3BlcnR5VmFsdWUpKTsKLSAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlWYWx1ZXMoYXJyYXlMaXN0KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZXJyb3IpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiT3V0T2ZNZW1vcnlFcnJvciBoYXBwZW5lZCBkdXJpbmcgcGFyc2luZyBCQVNFNjQgZGF0YSEiKTsKLSAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlWYWx1ZXMobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGltZUhhbmRsZUJhc2U2NCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCEodXBwZXJFbmNvZGluZy5lcXVhbHMoIjdCSVQiKSB8fCB1cHBlckVuY29kaW5nLmVxdWFscygiOEJJVCIpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHVwcGVyRW5jb2Rpbmcuc3RhcnRzV2l0aCgiWC0iKSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiVGhlIGVuY29kaW5nIFwiJXNcIiBpcyB1bnN1cHBvcnRlZCBieSB2Q2FyZCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50RW5jb2RpbmcsIGdldFZlcnNpb25TdHJpbmcoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTb21lIGRldmljZSB1c2VzIGxpbmUgZm9sZGluZyBkZWZpbmVkIGluIFJGQyAyNDI1LCB3aGljaCBpcyBub3QgYWxsb3dlZAotICAgICAgICAgICAgLy8gaW4gdkNhcmQgMi4xICh3aGlsZSBuZWVkZWQgaW4gdkNhcmQgMy4wKS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBlLmcuCi0gICAgICAgICAgICAvLyBCRUdJTjpWQ0FSRAotICAgICAgICAgICAgLy8gVkVSU0lPTjoyLjEKLSAgICAgICAgICAgIC8vIE46O09tZWdhOzs7Ci0gICAgICAgICAgICAvLyBFTUFJTDtJTlRFUk5FVDoiT21lZ2EiCi0gICAgICAgICAgICAvLyAgIDxvbWVnYUBleGFtcGxlLmNvbT4KLSAgICAgICAgICAgIC8vIEZOOk9tZWdhCi0gICAgICAgICAgICAvLyBFTkQ6VkNBUkQKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBUaGUgdkNhcmQgYWJvdmUgYXNzdW1lcyB0aGF0IGVtYWlsIGFkZHJlc3Mgc2hvdWxkIGJlY29tZToKLSAgICAgICAgICAgIC8vICJPbWVnYSIgPG9tZWdhQGV4YW1wbGUuY29tPgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEJ1dCB2Q2FyZCAyLjEgcmVxdWlyZXMgUXVvdGUtUHJpbnRhYmxlIHdoZW4gYSBsaW5lIGNvbnRhaW5zIGxpbmUgYnJlYWsocykuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgbGluZSBmb2xkaW5nLAotICAgICAgICAgICAgLy8gc2VlICI1LjguMS4gTGluZSBkZWxpbWl0aW5nIGFuZCBmb2xkaW5nIiBpbiBSRkMgMjQyNS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBXZSB0YWtlIGNhcmUgb2YgdGhpcyBjYXNlIG1vcmUgZm9ybWFsbHkgaW4gdkNhcmQgMy4wLCBzbyB3ZSBvbmx5IG5lZWQgdG8KLSAgICAgICAgICAgIC8vIGRvIHRoaXMgaW4gdkNhcmQgMi4xLgotICAgICAgICAgICAgaWYgKGdldFZlcnNpb24oKSA9PSBWQ2FyZENvbmZpZy5WRVJTSU9OXzIxKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmV4dExpbmUgPSBwZWVrTGluZSgpOwotICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGNhcmUgdG9vIG11Y2ggYWJvdXQgdGhpcyBleGNlcHRpb25hbCBjYXNlLAotICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2Ugc2hvdWxkIG5vdCB3cm9uZ2x5IGVhdCB1cCAiRU5EOlZDQVJEIiwgc2luY2UgaXQgY3JpdGljYWxseQotICAgICAgICAgICAgICAgICAgICAvLyBicmVha3MgdGhpcyBwYXJzZXIncyBzdGF0ZSBtYWNoaW5lLgotICAgICAgICAgICAgICAgICAgICAvLyBUaHVzIHdlIHJvdWdobHkgbG9vayBvdmVyIHRoZSBuZXh0IGxpbmUgYW5kIGNvbmZpcm0gaXQgaXMgYXQgbGVhc3Qgbm90Ci0gICAgICAgICAgICAgICAgICAgIC8vICJFTkQ6VkNBUkQiLiBUaGlzIGV4dHJhIGZlZSBpcyB3b3J0aCBwYXlpbmcuIFRoaXMgaXMgZXhjZXB0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgLy8gYW55d2F5LgotICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG5leHRMaW5lKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMaW5lLmNoYXJBdCgwKSA9PSAnICcgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIkVORDpWQ0FSRCIuY29udGFpbnMobmV4dExpbmUudG9VcHBlckNhc2UoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldExpbmUoKTsgIC8vIERyb3AgdGhlIG5leHQgbGluZS4KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobmV4dExpbmUuc3Vic3RyaW5nKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIHYuYWRkKG1heWJlVW5lc2NhcGVUZXh0KHByb3BlcnR5VmFsdWUpKTsKLSAgICAgICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVZhbHVlcyh2KTsKLSAgICAgICAgICAgIG1UaW1lSGFuZGxlTWlzY1Byb3BlcnR5VmFsdWUgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFBhcnNlcyBhbmQgcmV0dXJucyBRdW90ZWQtUHJpbnRhYmxlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaXJzdFN0cmluZyBUaGUgc3RyaW5nIGZvbGxvd2luZyBhIHBhcmFtZXRlciBuYW1lIGFuZCBhdHRyaWJ1dGVzLgotICAgICAqICAgICAgICAgICAgRXhhbXBsZTogInN0cmluZyIgaW4KLSAgICAgKiAgICAgICAgICAgICJBRFI6RU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRTpzdHJpbmdcblxyIi4KLSAgICAgKiBAcmV0dXJuIHdob2xlIFF1b3RlZC1QcmludGFibGUgc3RyaW5nLCBpbmNsdWRpbmcgYSBnaXZlbiBhcmd1bWVudCBhbmQKLSAgICAgKiAgICAgICAgIGZvbGxvd2luZyBsaW5lcy4gRXhjbHVkZXMgdGhlIGxhc3QgZW1wdHkgbGluZSBmb2xsb3dpbmcgdG8gUXVvdGVkCi0gICAgICogICAgICAgICBQcmludGFibGUgbGluZXMuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgVkNhcmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRRdW90ZWRQcmludGFibGUoU3RyaW5nIGZpcnN0U3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU3BlY2lmaWNhbGx5LCB0aGVyZSBtYXkgYmUgc29tZSBwYWRkaW5nIGJldHdlZW4gPSBhbmQgQ1JMRi4KLSAgICAgICAgLy8gU2VlIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIHFwLWxpbmUgOj0gKihxcC1zZWdtZW50IHRyYW5zcG9ydC1wYWRkaW5nIENSTEYpCi0gICAgICAgIC8vIHFwLXBhcnQgdHJhbnNwb3J0LXBhZGRpbmcKLSAgICAgICAgLy8gcXAtc2VnbWVudCA6PSBxcC1zZWN0aW9uICooU1BBQ0UgLyBUQUIpICI9IgotICAgICAgICAvLyA7IE1heGltdW0gbGVuZ3RoIG9mIDc2IGNoYXJhY3RlcnMKLSAgICAgICAgLy8KLSAgICAgICAgLy8gZS5nLiAoZnJvbSBSRkMgMjA0NSkKLSAgICAgICAgLy8gTm93J3MgdGhlIHRpbWUgPQotICAgICAgICAvLyBmb3IgYWxsIGZvbGsgdG8gY29tZT0KLSAgICAgICAgLy8gdG8gdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LgotICAgICAgICBpZiAoZmlyc3RTdHJpbmcudHJpbSgpLmVuZHNXaXRoKCI9IikpIHsKLSAgICAgICAgICAgIC8vIHJlbW92ZSAidHJhbnNwb3J0LXBhZGRpbmciCi0gICAgICAgICAgICBpbnQgcG9zID0gZmlyc3RTdHJpbmcubGVuZ3RoKCkgLSAxOwotICAgICAgICAgICAgd2hpbGUgKGZpcnN0U3RyaW5nLmNoYXJBdChwb3MpICE9ICc9JykgewotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZpcnN0U3RyaW5nLnN1YnN0cmluZygwLCBwb3MgKyAxKSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXHJcbiIpOwotICAgICAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIGxpbmUgPSBnZXRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkZpbGUgZW5kZWQgZHVyaW5nIHBhcnNpbmcgYSBRdW90ZWQtUHJpbnRhYmxlIFN0cmluZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGluZS50cmltKCkuZW5kc1dpdGgoIj0iKSkgewotICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgInRyYW5zcG9ydC1wYWRkaW5nIgotICAgICAgICAgICAgICAgICAgICBwb3MgPSBsaW5lLmxlbmd0aCgpIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxpbmUuY2hhckF0KHBvcykgIT0gJz0nKSB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZS5zdWJzdHJpbmcoMCwgcG9zICsgMSkpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXHJcbiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZpcnN0U3RyaW5nOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlNjQoU3RyaW5nIGZpcnN0U3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoZmlyc3RTdHJpbmcpOwotCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZSA9IGdldExpbmUoKTsKLSAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkZpbGUgZW5kZWQgZHVyaW5nIHBhcnNpbmcgQkFTRTY0IGJpbmFyeSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIE1haW5seSBmb3IgIkFEUiIsICJPUkciLCBhbmQgIk4iCi0gICAgICogPC9wPgotICAgICAqLwotICAgIC8qCi0gICAgICogYWRkcmVzc3BhcnRzID0gMCo2KHN0cm5vc2VtaSAiOyIpIHN0cm5vc2VtaSA7IFBPIEJveCwgRXh0ZW5kZWQgQWRkciwKLSAgICAgKiBTdHJlZXQsIExvY2FsaXR5LCBSZWdpb24sIFBvc3RhbCBDb2RlLCBDb3VudHJ5IE5hbWUgb3JncGFydHMgPQotICAgICAqICooc3Rybm9zZW1pICI7Iikgc3Rybm9zZW1pIDsgRmlyc3QgaXMgT3JnYW5pemF0aW9uIE5hbWUsIHJlbWFpbmRlciBhcmUKLSAgICAgKiBPcmdhbml6YXRpb24gVW5pdHMuIG5hbWVwYXJ0cyA9IDAqNChzdHJub3NlbWkgIjsiKSBzdHJub3NlbWkgOyBGYW1pbHksCi0gICAgICogR2l2ZW4sIE1pZGRsZSwgUHJlZml4LCBTdWZmaXguIDsgRXhhbXBsZTpQdWJsaWM7Sm9objtRLjtSZXZlcmVuZCBEci47SUlJLAotICAgICAqIEVzcS4gc3Rybm9zZW1pID0gKigqbm9uc2VtaSAoIlw7IiAvICJcIiBDUkxGKSkgKm5vbnNlbWkgOyBUbyBpbmNsdWRlIGEKLSAgICAgKiBzZW1pY29sb24gaW4gdGhpcyBzdHJpbmcsIGl0IG11c3QgYmUgZXNjYXBlZCA7IHdpdGggYSAiXCIgY2hhcmFjdGVyLiBXZQotICAgICAqIGRvIG5vdCBjYXJlIHRoZSBudW1iZXIgb2YgInN0cm5vc2VtaSIgaGVyZS4gV2UgYXJlIG5vdCBzdXJlIHdoZXRoZXIgd2UKLSAgICAgKiBzaG91bGQgYWRkICJcIiBDUkxGIHRvIGVhY2ggdmFsdWUuIFdlIGV4Y2x1ZGUgdGhlbSBmb3Igbm93LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZU11bHRpcGxlUHJvcGVydHlWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICAvLyB2Q2FyZCAyLjEgZG9lcyBub3QgYWxsb3cgUVVPVEVELVBSSU5UQUJMRSBoZXJlLCBidXQgc29tZQotICAgICAgICAvLyBzb2Z0d2FyZXMvZGV2aWNlcwotICAgICAgICAvLyBlbWl0IHN1Y2ggZGF0YS4KLSAgICAgICAgaWYgKG1DdXJyZW50RW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSgiUVVPVEVELVBSSU5UQUJMRSIpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVZhbHVlID0gZ2V0UXVvdGVkUHJpbnRhYmxlKHByb3BlcnR5VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUludGVycHJldGVyLnByb3BlcnR5VmFsdWVzKFZDYXJkVXRpbHMuY29uc3RydWN0TGlzdEZyb21WYWx1ZShwcm9wZXJ0eVZhbHVlLAotICAgICAgICAgICAgICAgIGdldFZlcnNpb24oKSkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogdkNhcmQgMi4xIHNwZWNpZmllcyBBR0VOVCBhbGxvd3Mgb25lIHZjYXJkIGVudHJ5LiBDdXJyZW50bHkgd2UgZW1pdCBhbgotICAgICAqIGVycm9yIHRvd2FyZCB0aGUgQUdFTlQgcHJvcGVydHkuCi0gICAgICogLy8gVE9ETzogU3VwcG9ydCBBR0VOVCBwcm9wZXJ0eS4KLSAgICAgKiBpdGVtID0KLSAgICAgKiAuLi4gLyBbZ3JvdXBzICIuIl0gIkFHRU5UIiBbcGFyYW1zXSAiOiIgdmNhcmQgQ1JMRiB2Y2FyZCA9ICJCRUdJTiIgW3dzXQotICAgICAqICI6IiBbd3NdICJWQ0FSRCIgW3dzXSAxKkNSTEYgaXRlbXMgKkNSTEYgIkVORCIgW3dzXSAiOiIgW3dzXSAiVkNBUkQiCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWdlbnQoZmluYWwgU3RyaW5nIHByb3BlcnR5VmFsdWUpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghcHJvcGVydHlWYWx1ZS50b1VwcGVyQ2FzZSgpLmNvbnRhaW5zKCJCRUdJTjpWQ0FSRCIpKSB7Ci0gICAgICAgICAgICAvLyBBcHBhcmVudGx5IGludmFsaWQgbGluZSBzZWVuIGluIFdpbmRvd3MgTW9iaWxlIDYuNS4gSWdub3JlIHRoZW0uCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiQUdFTlQgUHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBub3cuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgdkNhcmQgMy4wLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbWF5YmVVbmVzY2FwZVRleHQoZmluYWwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB1bmVzY2FwZWQgU3RyaW5nIGlmIHRoZSBjaGFyYWN0ZXIgc2hvdWxkIGJlIHVuZXNjYXBlZC4gUmV0dXJuCi0gICAgICogbnVsbCBvdGhlcndpc2UuIGUuZy4gSW4gdkNhcmQgMi4xLCAiXDsiIHNob3VsZCBiZSB1bmVzY2FwZWQgaW50byAiOyIKLSAgICAgKiB3aGlsZSAiXHgiIHNob3VsZCBub3QgYmUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtYXliZVVuZXNjYXBlQ2hhcmFjdGVyKGZpbmFsIGNoYXIgY2gpIHsKLSAgICAgICAgcmV0dXJuIHVuZXNjYXBlQ2hhcmFjdGVyKGNoKTsKLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBTdHJpbmcgdW5lc2NhcGVDaGFyYWN0ZXIoZmluYWwgY2hhciBjaCkgewotICAgICAgICAvLyBPcmlnaW5hbCB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBhbGxvdyB0cmFuc2Zvcm1hdGlvbgotICAgICAgICAvLyAiXDoiIC0+ICI6IiwgIlwsIiAtPiAiLCIsIGFuZCAiXFwiIC0+ICJcIiwgYnV0IHByZXZpb3VzCi0gICAgICAgIC8vIGltcGxlbWVudGF0aW9uIG9mCi0gICAgICAgIC8vIHRoaXMgY2xhc3MgYWxsb3dlZCB0aGVtLCBzbyBrZWVwIGl0IGFzIGlzLgotICAgICAgICBpZiAoY2ggPT0gJ1xcJyB8fCBjaCA9PSAnOycgfHwgY2ggPT0gJzonIHx8IGNoID09ICcsJykgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGNoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNob3dQZXJmb3JtYW5jZUluZm8oKSB7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUb3RhbCBwYXJzaW5nIHRpbWU6ICAiICsgbVRpbWVUb3RhbCArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRvdGFsIHJlYWRMaW5lIHRpbWU6ICIgKyBtUmVhZGVyLmdldFRvdGFsbWlsbGlzZWNvbmQoKSArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIGhhbmRsaW5nIHRoZSBiZWdnaW5pbmcgb2YgdGhlIHJlY29yZDogIiArIG1UaW1lUmVhZFN0YXJ0UmVjb3JkCi0gICAgICAgICAgICAgICAgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBoYW5kbGluZyB0aGUgZW5kIG9mIHRoZSByZWNvcmQ6ICIgKyBtVGltZVJlYWRFbmRSZWNvcmQgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBwYXJzaW5nIGxpbmUsIGFuZCBoYW5kbGluZyBncm91cDogIiArIG1UaW1lUGFyc2VMaW5lQW5kSGFuZGxlR3JvdXAKLSAgICAgICAgICAgICAgICArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIHBhcnNpbmcgQURSLCBPUkcsIGFuZCBOIGZpZWxkczoiICsgbVRpbWVQYXJzZUFkck9yZ04gKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBwYXJzaW5nIHByb3BlcnR5IHZhbHVlczogIiArIG1UaW1lUGFyc2VQcm9wZXJ0eVZhbHVlcyArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIGhhbmRsaW5nIG5vcm1hbCBwcm9wZXJ0eSB2YWx1ZXM6ICIgKyBtVGltZUhhbmRsZU1pc2NQcm9wZXJ0eVZhbHVlCi0gICAgICAgICAgICAgICAgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBoYW5kbGluZyBRdW90ZWQtUHJpbnRhYmxlOiAiICsgbVRpbWVIYW5kbGVRdW90ZWRQcmludGFibGUgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBoYW5kbGluZyBCYXNlNjQ6ICIgKyBtVGltZUhhbmRsZUJhc2U2NCArICIgbXMiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHtAbGluayBWQ2FyZENvbmZpZyNWRVJTSU9OXzIxfQotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkQ29uZmlnLlZFUlNJT05fMjE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB7QGxpbmsgVkNhcmRDb25maWcjVkVSU0lPTl8zMH0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZlcnNpb25TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1YyMTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gZ2V0S25vd25Qcm9wZXJ0eU5hbWVTZXQoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZFBhcnNlcl9WMjEuc0tub3duUHJvcGVydHlOYW1lU2V0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBnZXRLbm93blR5cGVTZXQoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZFBhcnNlcl9WMjEuc0tub3duVHlwZVNldDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gZ2V0S25vd25WYWx1ZVNldCgpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkUGFyc2VyX1YyMS5zS25vd25WYWx1ZVNldDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gZ2V0QXZhaWxhYmxlRW5jb2RpbmdTZXQoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZFBhcnNlcl9WMjEuc0F2YWlsYWJsZUVuY29kaW5nOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEVuY29kaW5nKCkgewotICAgICAgICByZXR1cm4gREVGQVVMVF9FTkNPRElORzsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGlzLCBWQ2FyZEludGVycHJldGVyIGludGVycHJldGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIklucHV0U3RyZWFtIG11c3Qgbm90IGJlIG51bGwuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbVJlYWRlciB0bXBSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsIG1JbnRlcm1lZGlhdGVDaGFyc2V0KTsKLSAgICAgICAgbVJlYWRlciA9IG5ldyBDdXN0b21CdWZmZXJlZFJlYWRlcih0bXBSZWFkZXIpOwotCi0gICAgICAgIG1JbnRlcnByZXRlciA9IChpbnRlcnByZXRlciAhPSBudWxsID8gaW50ZXJwcmV0ZXIgOiBuZXcgRW1wdHlJbnRlcnByZXRlcigpKTsKLQotICAgICAgICBmaW5hbCBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGlmIChtSW50ZXJwcmV0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUludGVycHJldGVyLnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyc2VWQ2FyZEZpbGUoKTsKLSAgICAgICAgaWYgKG1JbnRlcnByZXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSW50ZXJwcmV0ZXIuZW5kKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVRpbWVUb3RhbCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotCi0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5zaG93UGVyZm9ybWFuY2VMb2coKSkgewotICAgICAgICAgICAgc2hvd1BlcmZvcm1hbmNlSW5mbygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgY2FuY2VsKCkgewotICAgICAgICBtQ2FuY2VsZWQgPSB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlckltcGxfVjMwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJJbXBsX1YzMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmFkOWEwLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlckltcGxfVjMwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogPHA+Ci0gKiBCYXNpYyBpbXBsZW1lbnRhdGlvbiBhY2hpZXZpbmcgdkNhcmQgMy4wIHBhcnNpbmcuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaW5oZXJpdHMgdkNhcmQgMi4xIGltcGxlbWVudGF0aW9uIHNpbmNlIHRlY2huaWNhbGx5IHRoZXkgYXJlIHNpbWlsYXIsCi0gKiB3aGlsZSBzcGVjaWZpY2FsbHkgdGhlcmUncyBsb2dpY2FsIG5vIHJlbGV2YW5jZSBiZXR3ZWVuIHRoZW0uCi0gKiBTbyB0aGF0IGRldmVsb3BlcnMgYXJlIG5vdCBjb25mdXNlZCB3aXRoIHRoZSBpbmhlcml0YW5jZSwKLSAqIHtAbGluayBWQ2FyZFBhcnNlcl9WMzB9IGRvZXMgbm90IGluaGVyaXQge0BsaW5rIFZDYXJkUGFyc2VyX1YyMX0sIHdoaWxlCi0gKiB7QGxpbmsgVkNhcmRQYXJzZXJJbXBsX1YzMH0gaW5oZXJpdHMge0BsaW5rIFZDYXJkUGFyc2VySW1wbF9WMjF9LgotICogPC9wPgotICogQGhpZGUKLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBWQ2FyZFBhcnNlckltcGxfVjMwIGV4dGVuZHMgVkNhcmRQYXJzZXJJbXBsX1YyMSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRQYXJzZXJJbXBsX1YzMCI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtUHJldmlvdXNMaW5lOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRW1pdHRlZEFnZW50V2FybmluZyA9IGZhbHNlOwotCi0gICAgcHVibGljIFZDYXJkUGFyc2VySW1wbF9WMzAoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VySW1wbF9WMzAoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBzdXBlcih2Y2FyZFR5cGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBpbnQgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkQ29uZmlnLlZFUlNJT05fMzA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWZXJzaW9uU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gVkNhcmRDb25zdGFudHMuVkVSU0lPTl9WMzA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1QcmV2aW91c0xpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHJldCA9IG1QcmV2aW91c0xpbmU7Ci0gICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdkNhcmQgMy4wIHJlcXVpcmVzIHRoYXQgdGhlIGxpbmUgd2l0aCBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lCi0gICAgICogbXVzdCBiZSBjb21iaW5lZCB3aXRoIHByZXZpb3VzIGxpbmUuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXROb25FbXB0eUxpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG51bGw7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBsaW5lID0gbVJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QcmV2aW91c0xpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmV0ID0gbVByZXZpb3VzTGluZTsKLSAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiUmVhY2hlZCBlbmQgb2YgYnVmZmVyLiIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJldmlvdXNMaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJldCA9IG1QcmV2aW91c0xpbmU7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5jaGFyQXQoMCkgPT0gJyAnIHx8IGxpbmUuY2hhckF0KDApID09ICdcdCcpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNlZSBTZWN0aW9uIDUuOC4xIG9mIFJGQyAyNDI1IChNSU1FLURJUiBkb2N1bWVudCkuCi0gICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBpcyB0aGUgZXhjZXJwdHMgZnJvbSBpdC4KLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gREVTQ1JJUFRJT046VGhpcyBpcyBhIGxvbmcgZGVzY3JpcHRpb24gdGhhdCBleGlzdHMgb24gYSBsb25nIGxpbmUuCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIENhbiBiZSByZXByZXNlbnRlZCBhczoKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gREVTQ1JJUFRJT046VGhpcyBpcyBhIGxvbmcgZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgLy8gIHRoYXQgZXhpc3RzIG9uIGEgbG9uZyBsaW5lLgotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBJdCBjb3VsZCBhbHNvIGJlIHJlcHJlc2VudGVkIGFzOgotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBERVNDUklQVElPTjpUaGlzIGlzIGEgbG9uZyBkZXNjcmlwCi0gICAgICAgICAgICAgICAgICAgIC8vICB0aW9uIHRoYXQgZXhpc3RzIG8KLSAgICAgICAgICAgICAgICAgICAgLy8gIG4gYSBsb25nIGxpbmUuCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUuc3Vic3RyaW5nKDEpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QcmV2aW91c0xpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobVByZXZpb3VzTGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaW5lLnN1YnN0cmluZygxKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJTcGFjZSBleGlzdHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmV2aW91c0xpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbGluZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXQgPSBtUHJldmlvdXNMaW5lOwotICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbGluZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHZjYXJkID0gW2dyb3VwICIuIl0gIkJFR0lOIiAiOiIgIlZDQVJEIiAxICogQ1JMRgotICAgICAqICAgICAgICAgMSAqIChjb250ZW50bGluZSkKLSAgICAgKiAgICAgICAgIDtBIHZDYXJkIG9iamVjdCBNVVNUIGluY2x1ZGUgdGhlIFZFUlNJT04sIEZOIGFuZCBOIHR5cGVzLgotICAgICAqICAgICAgICAgW2dyb3VwICIuIl0gIkVORCIgIjoiICJWQ0FSRCIgMSAqIENSTEYKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkQmVnaW5WQ2FyZChib29sZWFuIGFsbG93R2FyYmFnZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE86IHZDYXJkIDMuMCBzdXBwb3J0cyBncm91cC4KLSAgICAgICAgcmV0dXJuIHN1cGVyLnJlYWRCZWdpblZDYXJkKGFsbG93R2FyYmFnZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVhZEVuZFZDYXJkKGJvb2xlYW4gdXNlQ2FjaGUsIGJvb2xlYW4gYWxsb3dHYXJiYWdlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE86IHZDYXJkIDMuMCBzdXBwb3J0cyBncm91cC4KLSAgICAgICAgc3VwZXIucmVhZEVuZFZDYXJkKHVzZUNhY2hlLCBhbGxvd0dhcmJhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZDYXJkIDMuMCBhbGxvd3MgaWFuYS10b2tlbiBhcyBwYXJhbVR5cGUsIHdoaWxlIHZDYXJkIDIuMSBkb2VzIG5vdC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQYXJhbXMoZmluYWwgU3RyaW5nIHBhcmFtcykgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN1cGVyLmhhbmRsZVBhcmFtcyhwYXJhbXMpOwotICAgICAgICB9IGNhdGNoIChWQ2FyZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBtYXliZSBJQU5BIHR5cGUKLSAgICAgICAgICAgIFN0cmluZ1tdIHN0ckFycmF5ID0gcGFyYW1zLnNwbGl0KCI9IiwgMik7Ci0gICAgICAgICAgICBpZiAoc3RyQXJyYXkubGVuZ3RoID09IDIpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVBbnlQYXJhbShzdHJBcnJheVswXSwgc3RyQXJyYXlbMV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBNdXN0IG5vdCBjb21lIGhlcmUgaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gcGFyYW1zIHZhbHVlOiAiICsgcGFyYW1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFueVBhcmFtKGZpbmFsIFN0cmluZyBwYXJhbU5hbWUsIGZpbmFsIFN0cmluZyBwYXJhbVZhbHVlKSB7Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVHlwZShwYXJhbU5hbWUpOwotICAgICAgICBzcGxpdEFuZFB1dFBhcmFtVmFsdWUocGFyYW1WYWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUGFyYW1XaXRob3V0TmFtZShmaW5hbCBTdHJpbmcgcGFyYW1WYWx1ZSkgewotICAgICAgICBoYW5kbGVUeXBlKHBhcmFtVmFsdWUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIHZDYXJkIDMuMCBkZWZpbmVzCi0gICAgICoKLSAgICAgKiAgcGFyYW0gICAgICAgICA9IHBhcmFtLW5hbWUgIj0iIHBhcmFtLXZhbHVlICooIiwiIHBhcmFtLXZhbHVlKQotICAgICAqICBwYXJhbS1uYW1lICAgID0gaWFuYS10b2tlbiAvIHgtbmFtZQotICAgICAqICBwYXJhbS12YWx1ZSAgID0gcHRleHQgLyBxdW90ZWQtc3RyaW5nCi0gICAgICogIHF1b3RlZC1zdHJpbmcgPSBEUVVPVEUgUVNBRkUtQ0hBUiBEUVVPVEUKLSAgICAgKiAgUVNBRkUtQ0hBUiAgICA9IFdTUCAvICV4MjEgLyAleDIzLTdFIC8gTk9OLUFTQ0lJCi0gICAgICogICAgICAgICAgICAgICAgOyBBbnkgY2hhcmFjdGVyIGV4Y2VwdCBDVExzLCBEUVVPVEUKLSAgICAgKgotICAgICAqICBRU0FGRS1DSEFSIG11c3Qgbm90IGNvbnRhaW4gRFFVT1RFLCBpbmNsdWRpbmcgZXNjYXBlZCBvbmUgKFwiKS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVUeXBlKGZpbmFsIFN0cmluZyBwYXJhbVZhbHVlKSB7Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVHlwZSgiVFlQRSIpOwotICAgICAgICBzcGxpdEFuZFB1dFBhcmFtVmFsdWUocGFyYW1WYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BsaXRzIHBhcmFtZXRlciB2YWx1ZXMgaW50byBwaWVjZXMgaW4gYWNjb3JkYW5jZSB3aXRoIHZDYXJkIDMuMCBzcGVjaWZpY2F0aW9uIGFuZAotICAgICAqIHB1dHMgcGllY2VzIGludG8gbUludGVycHJldGVyLgotICAgICAqLwotICAgIC8qCi0gICAgICogIHBhcmFtLXZhbHVlICAgPSBwdGV4dCAvIHF1b3RlZC1zdHJpbmcKLSAgICAgKiAgcXVvdGVkLXN0cmluZyA9IERRVU9URSBRU0FGRS1DSEFSIERRVU9URQotICAgICAqICBRU0FGRS1DSEFSICAgID0gV1NQIC8gJXgyMSAvICV4MjMtN0UgLyBOT04tQVNDSUkKLSAgICAgKiAgICAgICAgICAgICAgICA7IEFueSBjaGFyYWN0ZXIgZXhjZXB0IENUTHMsIERRVU9URQotICAgICAqCi0gICAgICogIFFTQUZFLUNIQVIgbXVzdCBub3QgY29udGFpbiBEUVVPVEUsIGluY2x1ZGluZyBlc2NhcGVkIG9uZSAoXCIpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNwbGl0QW5kUHV0UGFyYW1WYWx1ZShTdHJpbmcgcGFyYW1WYWx1ZSkgewotICAgICAgICAvLyAiY29tbWEsc2VwYXJhdGVkOmluc2lkZS5kcXVvdGUiLHByZWYKLSAgICAgICAgLy8gICAtLT4KLSAgICAgICAgLy8gLSBjb21tYSxzZXBhcmF0ZWQ6aW5zaWRlLmRxdW90ZQotICAgICAgICAvLyAtIHByZWYKLSAgICAgICAgLy8KLSAgICAgICAgLy8gTm90ZTogVGhvdWdoIHRoZXJlJ3MgYSBjb2RlLCB3ZSBkb24ndCBuZWVkIHRvIHRha2UgbXVjaCBjYXJlIG9mCi0gICAgICAgIC8vIHdyb25nbHktYWRkZWQgcXVvdGVzIGxpa2UgdGhlIGV4YW1wbGUgYWJvdmUsIGFzIHRoZXkgaW5kdWNlCi0gICAgICAgIC8vIHBhcnNlIGVycm9ycyBhdCB0aGUgdG9wIGxldmVsICh3aGVuIHNwbGl0dGluZyBhIGxpbmUgaW50byBwYXJ0cykuCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG51bGw7ICAvLyBEZWxheSBpbml0aWFsaXphdGlvbi4KLSAgICAgICAgYm9vbGVhbiBpbnNpZGVEcXVvdGUgPSBmYWxzZTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHBhcmFtVmFsdWUubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIGNoYXIgY2ggPSBwYXJhbVZhbHVlLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnIicpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5zaWRlRHF1b3RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEVuZCBvZiBEcXVvdGUuCi0gICAgICAgICAgICAgICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVmFsdWUoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGluc2lkZURxdW90ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWlsZGVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGUuZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmVmInF1b3RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVW5leHBlY3RlZCBEcXVvdGUgaW5zaWRlIHByb3BlcnR5LiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlZiwicXVvdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICJxdW90ZWQiLHByZWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVZhbHVlKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW5zaWRlRHF1b3RlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcsJyAmJiAhaW5zaWRlRHF1b3RlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiQ29tbWEgaXMgdXNlZCBiZWZvcmUgYWN0dWFsIHN0cmluZyBjb21lcy4gKCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWUgKyAiKSIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVmFsdWUoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUbyBzdG9wIGNyZWF0aW5nIGVtcHR5IFN0cmluZ0J1ZmZlciBhdCB0aGUgZW5kIG9mIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAvLyB3ZSBkZWxheSBjcmVhdGluZyB0aGlzIG9iamVjdCB1bnRpbCB0aGlzIHBvaW50LgotICAgICAgICAgICAgICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaW5zaWRlRHF1b3RlKSB7Ci0gICAgICAgICAgICAvLyBlLmcuCi0gICAgICAgICAgICAvLyAibm9uLXF1b3RlLWF0LWVuZAotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIkRhbmdsaW5nIERxdW90ZS4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlVuaW50ZW5kZWQgYmVoYXZpb3IuIFdlIG11c3Qgbm90IHNlZSBlbXB0eSBTdHJpbmdCdWlsZGVyICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImF0IHRoZSBlbmQgb2YgcGFyYW1ldGVyIHZhbHVlIHBhcnNpbmcuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVmFsdWUoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFnZW50KGZpbmFsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0gICAgICAgIC8vIFRoZSB3YXkgaG93IHZDYXJkIDMuMCBzdXBwb3J0cyAiQUdFTlQiIGlzIGNvbXBsZXRlbHkgZGlmZmVyZW50IGZyb20gdkNhcmQgMi4xLgotICAgICAgICAvLwotICAgICAgICAvLyBlLmcuCi0gICAgICAgIC8vIEFHRU5UOkJFR0lOOlZDQVJEXG5GTjpKb2UgRnJpZGF5XG5URUw6KzEtOTE5LTU1NS03ODc4XG4KLSAgICAgICAgLy8gIFRJVExFOkFyZWEgQWRtaW5pc3RyYXRvclwsIEFzc2lzdGFudFxuIEVNQUlMXDtUWVBFPUlOVEVSTlxuCi0gICAgICAgIC8vICBFVDpqZnJpZGF5QGhvc3QuY29tXG5FTkQ6VkNBUkRcbgotICAgICAgICAvLwotICAgICAgICAvLyBUT0RPOiBmaXggdGhpcy4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gaXNzdWU6Ci0gICAgICAgIC8vICB2Q2FyZCAzLjAgYWxzbyBhbGxvd3MgdGhpcyBhcyBhbiBleGFtcGxlLgotICAgICAgICAvLwotICAgICAgICAvLyBBR0VOVDtWQUxVRT11cmk6Ci0gICAgICAgIC8vICBDSUQ6SlFQVUJMSUMucGFydDMuOTYwMTI5VDA4MzAyMC54eXpNYWlsQGhvc3QzLmNvbQotICAgICAgICAvLwotICAgICAgICAvLyBUaGlzIGlzIG5vdCB2Q2FyZC4gU2hvdWxkIHdlIHN1cHBvcnQgdGhpcz8KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSnVzdCBpZ25vcmUgdGhlIGxpbmUgZm9yIG5vdywgc2luY2Ugd2UgY2Fubm90IGtub3cgaG93IHRvIGhhbmRsZSBpdC4uLgotICAgICAgICBpZiAoIW1FbWl0dGVkQWdlbnRXYXJuaW5nKSB7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiQUdFTlQgaW4gdkNhcmQgMy4wIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiBJZ25vcmUgaXQiKTsKLSAgICAgICAgICAgIG1FbWl0dGVkQWdlbnRXYXJuaW5nID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZDYXJkIDMuMCBkb2VzIG5vdCByZXF1aXJlIHR3byBDUkxGIGF0IHRoZSBsYXN0IG9mIEJBU0U2NCBkYXRhLgotICAgICAqIEl0IG9ubHkgcmVxdWlyZXMgdGhhdCBkYXRhIHNob3VsZCBiZSBNSU1FLWVuY29kZWQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlNjQoZmluYWwgU3RyaW5nIGZpcnN0U3RyaW5nKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZpcnN0U3RyaW5nKTsKLQotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBnZXRMaW5lKCk7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJGaWxlIGVuZGVkIGR1cmluZyBwYXJzaW5nIEJBU0U2NCBiaW5hcnkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWxpbmUuc3RhcnRzV2l0aCgiICIpICYmICFsaW5lLnN0YXJ0c1dpdGgoIlx0IikpIHsKLSAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbGluZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFU0NBUEVELUNIQVIgPSAiXFwiIC8gIlw7IiAvICJcLCIgLyAiXG4iIC8gIlxOIikKLSAgICAgKiAgICAgICAgICAgICAgOyBcXCBlbmNvZGVzIFwsIFxuIG9yIFxOIGVuY29kZXMgbmV3bGluZQotICAgICAqICAgICAgICAgICAgICA7IFw7IGVuY29kZXMgOywgXCwgZW5jb2RlcyAsCi0gICAgICoKLSAgICAgKiBOb3RlOiBBcHBsZSBlc2NhcGVzICc6JyBpbnRvICdcOicgd2hpbGUgZG9lcyBub3QgZXNjYXBlICdcJwotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgbWF5YmVVbmVzY2FwZVRleHQoZmluYWwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgcmV0dXJuIHVuZXNjYXBlVGV4dCh0ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1bmVzY2FwZVRleHQoZmluYWwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnICYmIGkgPCBsZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgY2hhciBuZXh0X2NoID0gdGV4dC5jaGFyQXQoKytpKTsKLSAgICAgICAgICAgICAgICBpZiAobmV4dF9jaCA9PSAnbicgfHwgbmV4dF9jaCA9PSAnTicpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobmV4dF9jaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1heWJlVW5lc2NhcGVDaGFyYWN0ZXIoZmluYWwgY2hhciBjaCkgewotICAgICAgICByZXR1cm4gdW5lc2NhcGVDaGFyYWN0ZXIoY2gpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlQ2hhcmFjdGVyKGZpbmFsIGNoYXIgY2gpIHsKLSAgICAgICAgaWYgKGNoID09ICduJyB8fCBjaCA9PSAnTicpIHsKLSAgICAgICAgICAgIHJldHVybiAiXG4iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGNoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBnZXRLbm93blByb3BlcnR5TmFtZVNldCgpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkUGFyc2VyX1YzMC5zS25vd25Qcm9wZXJ0eU5hbWVTZXQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VySW1wbF9WNDAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlckltcGxfVjQwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZTc2YmIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VySW1wbF9WNDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLQotLyoqCi0gKiA8cD4KLSAqIEJhc2ljIGltcGxlbWVudGF0aW9uIHBhcnNpbmcgdkNhcmQgNC4wLgotICogPC9wPgotICogPHA+Ci0gKiB2Q2FyZCA0LjAgaXMgbm90IHB1Ymxpc2hlZCB5ZXQuIEFsc28gdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBwcmVtYXR1cmUuIAotICogPC9wPgotICogQGhpZGUKLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBWQ2FyZFBhcnNlckltcGxfVjQwIGV4dGVuZHMgVkNhcmRQYXJzZXJJbXBsX1YzMCB7Ci0gICAgLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRQYXJzZXJJbXBsX1Y0MCI7Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJJbXBsX1Y0MCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJJbXBsX1Y0MChmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHN1cGVyKHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGludCBnZXRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gVkNhcmRDb25maWcuVkVSU0lPTl80MDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZlcnNpb25TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1Y0MDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXZSBlc2NhcGUgIlxOIiBpbnRvIG5ldyBsaW5lIGZvciBzYWZldHkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtYXliZVVuZXNjYXBlVGV4dChmaW5hbCBTdHJpbmcgdGV4dCkgewotICAgICAgICByZXR1cm4gdW5lc2NhcGVUZXh0KHRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlVGV4dChmaW5hbCBTdHJpbmcgdGV4dCkgewotICAgICAgICAvLyBUT0RPOiBtb3JlIHN0cmljdGx5LCB2Q2FyZCA0LjAgcmVxdWlyZXMgZGlmZmVyZW50IHR5cGUgb2YgdW5lc2NhcGluZyBydWxlCi0gICAgICAgIC8vICAgICAgIHRvd2FyZCBlYWNoIHByb3BlcnR5LgotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdGV4dC5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY2hhciBjaCA9IHRleHQuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKGNoID09ICdcXCcgJiYgaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBjaGFyIG5leHRfY2ggPSB0ZXh0LmNoYXJBdCgrK2kpOwotICAgICAgICAgICAgICAgIGlmIChuZXh0X2NoID09ICduJyB8fCBuZXh0X2NoID09ICdOJykgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChuZXh0X2NoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlQ2hhcmFjdGVyKGZpbmFsIGNoYXIgY2gpIHsKLSAgICAgICAgaWYgKGNoID09ICduJyB8fCBjaCA9PSAnTicpIHsKLSAgICAgICAgICAgIHJldHVybiAiXG4iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGNoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBnZXRLbm93blByb3BlcnR5TmFtZVNldCgpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkUGFyc2VyX1Y0MC5zS25vd25Qcm9wZXJ0eU5hbWVTZXQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMjEuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA3YTE3Ni4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogPC9wPgotICogdkNhcmQgcGFyc2VyIGZvciB2Q2FyZCAyLjEuIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWwgYWJvdXQgdGhlIHNwZWMgaXRzZWxmLgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgc3BlYyBpcyB3cml0dGVuIGluIDE5OTYsIGFuZCBjdXJyZW50bHkgdmFyaW91cyB0eXBlcyBvZiAidkNhcmQgMi4xIiBleGlzdC4KLSAqIFRvIGhhbmRsZSByZWFsIHRoZSB3b3JsZCB2Q2FyZCBmb3JtYXRzIGFwcHJvcHJpYXRlbHkgYW5kIGVmZmVjdGl2ZWx5LCB0aGlzIGNsYXNzIGRvZXMgbm90Ci0gKiBvYmV5IHdpdGggc3RyaWN0IHZDYXJkIDIuMS4KLSAqIEluIHN0ZWFkLCBub3Qgb25seSB2Q2FyZCBzcGVjIGJ1dCBhbHNvIHJlYWwgd29ybGQgdkNhcmQgaXMgY29uc2lkZXJlZC4KLSAqIDwvcD4KLSAqIGUuZy4gQSBsb3Qgb2YgZGV2aWNlcyBhbmQgc29mdHdhcmVzIGxldCB2Q2FyZCBpbXBvcnRlci9leHBvcnRlciB0byB1c2UKLSAqIHRoZSBQTkcgZm9ybWF0IHRvIGRldGVybWluZSB0aGUgdHlwZSBvZiBpbWFnZSwgd2hpbGUgaXQgaXMgbm90IGFsbG93ZWQgaW4KLSAqIHRoZSBvcmlnaW5hbCBzcGVjaWZpY2F0aW9uLiBBcyBvZiAyMDEwLCB3ZSBjYW4gc2VlIGV2ZW4gdGhlIEZMViBmb3JtYXQKLSAqIChwb3NzaWJsZSBpbiBKYXBhbmVzZSBtb2JpbGUgcGhvbmVzKS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZDYXJkUGFyc2VyX1YyMSBpbXBsZW1lbnRzIFZDYXJkUGFyc2VyIHsKLSAgICAvKioKLSAgICAgKiBBIHVubW9kaWZpYWJsZSBTZXQgc3RvcmluZyB0aGUgcHJvcGVydHkgbmFtZXMgYXZhaWxhYmxlIGluIHRoZSB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbi4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzS25vd25Qcm9wZXJ0eU5hbWVTZXQgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KG5ldyBIYXNoU2V0PFN0cmluZz4oCi0gICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkJFR0lOIiwgIkxPR08iLCAiUEhPVE8iLCAiTEFCRUwiLCAiRk4iLCAiVElUTEUiLCAiU09VTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWRVJTSU9OIiwgIlRFTCIsICJFTUFJTCIsICJUWiIsICJHRU8iLCAiTk9URSIsICJVUkwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCREFZIiwgIlJPTEUiLCAiUkVWIiwgIlVJRCIsICJLRVkiLCAiTUFJTEVSIikpKTsKLQotICAgIC8qKgotICAgICAqIEEgdW5tb2RpZmlhYmxlIFNldCBzdG9yaW5nIHRoZSB0eXBlcyBrbm93biBpbiB2Q2FyZCAyLjEuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc0tub3duVHlwZVNldCA9Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8U3RyaW5nPigKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiRE9NIiwgIklOVEwiLCAiUE9TVEFMIiwgIlBBUkNFTCIsICJIT01FIiwgIldPUksiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQUkVGIiwgIlZPSUNFIiwgIkZBWCIsICJNU0ciLCAiQ0VMTCIsICJQQUdFUiIsICJCQlMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNT0RFTSIsICJDQVIiLCAiSVNETiIsICJWSURFTyIsICJBT0wiLCAiQVBQTEVMSU5LIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVRUTUFJTCIsICJDSVMiLCAiRVdPUkxEIiwgIklOVEVSTkVUIiwgIklCTU1BSUwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNQ0lNQUlMIiwgIlBPV0VSU0hBUkUiLCAiUFJPRElHWSIsICJUTFgiLCAiWDQwMCIsICJHSUYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDR00iLCAiV01GIiwgIkJNUCIsICJNRVQiLCAiUE1CIiwgIkRJQiIsICJQSUNUIiwgIlRJRkYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQREYiLCAiUFMiLCAiSlBFRyIsICJRVElNRSIsICJNUEVHIiwgIk1QRUcyIiwgIkFWSSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIldBVkUiLCAiQUlGRiIsICJQQ00iLCAiWDUwOSIsICJQR1AiKSkpOwotCi0gICAgLyoqCi0gICAgICogQSB1bm1vZGlmaWFibGUgU2V0IHN0b3JpbmcgdGhlIHZhbHVlcyBmb3IgdGhlIHR5cGUgIlZBTFVFIiwgYXZhaWxhYmxlIGluIHRoZSB2Q2FyZCAyLjEuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc0tub3duVmFsdWVTZXQgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KG5ldyBIYXNoU2V0PFN0cmluZz4oCi0gICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIklOTElORSIsICJVUkwiLCAiQ09OVEVOVC1JRCIsICJDSUQiKSkpOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQSB1bm1vZGlmaWFibGUgU2V0IHN0b3JpbmcgdGhlIHZhbHVlcyBmb3IgdGhlIHR5cGUgIkVOQ09ESU5HIiwgYXZhaWxhYmxlIGluIHRoZSB2Q2FyZCAyLjEuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRob3VnaCB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBhbGxvdyAiQiIgZW5jb2RpbmcsIHNvbWUgZGF0YSBtYXkgaGF2ZSBpdC4KLSAgICAgKiBXZSBhbGxvdyBpdCBmb3Igc2FmZXR5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzQXZhaWxhYmxlRW5jb2RpbmcgPQotICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8U3RyaW5nPigKLSAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VOQ09ESU5HXzdCSVQsCi0gICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR184QklULAotICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfUVAsCi0gICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR19CQVNFNjQsCi0gICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR19CKSkpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWQ2FyZFBhcnNlckltcGxfVjIxIG1WQ2FyZFBhcnNlckltcGw7Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJfVjIxKCkgewotICAgICAgICBtVkNhcmRQYXJzZXJJbXBsID0gbmV3IFZDYXJkUGFyc2VySW1wbF9WMjEoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJfVjIxKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZDYXJkUGFyc2VySW1wbCA9IG5ldyBWQ2FyZFBhcnNlckltcGxfVjIxKHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFZDYXJkSW50ZXJwcmV0ZXIgaW50ZXJlcHJldGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1WQ2FyZFBhcnNlckltcGwucGFyc2UoaXMsIGludGVyZXByZXRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2FuY2VsKCkgewotICAgICAgICBtVkNhcmRQYXJzZXJJbXBsLmNhbmNlbCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMzAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4ZDNhOC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjMwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiA8cD4KLSAqIHZDYXJkIHBhcnNlciBmb3IgdkNhcmQgMy4wLiBTZWUgUkZDIDI0MjYgZm9yIG1vcmUgZGV0YWlsLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIHBhcnNlciBhbGxvd3MgdkNhcmQgZm9ybWF0IHdoaWNoIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBSRkMsIHNpbmNlCi0gKiB3ZSBoYXZlIHNlZW4gc2V2ZXJhbCB2Q2FyZCAzLjAgZmlsZXMgd2hpY2ggZG9uJ3QgY29tcGx5IHdpdGggaXQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIGUuZy4gdkNhcmQgMy4wIGRvZXMgbm90IGFsbG93ICJDSEFSU0VUIiBhdHRyaWJ1dGUsIGJ1dCBzb21lIGFjdHVhbCBmaWxlcwotICogaGF2ZSBpdCBhbmQgdGhleSB1c2VzIG5vbiBVVEYtOCBjaGFyc2V0cy4gVVRGLTggaXMgcmVjb21tZW5kZWQgaW4gUkZDIDI0MjYsCi0gKiBidXQgaXQgaXMgbm90IGEgbXVzdC4gV2Ugc2lsZW50bHkgYWxsb3cgIkNIQVJTRVQiLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRQYXJzZXJfVjMwIGltcGxlbWVudHMgVkNhcmRQYXJzZXIgewotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHNLbm93blByb3BlcnR5TmFtZVNldCA9Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICAiQkVHSU4iLCAiTE9HTyIsICJQSE9UTyIsICJMQUJFTCIsICJGTiIsICJUSVRMRSIsICJTT1VORCIsIAotICAgICAgICAgICAgICAgICAgICAiVkVSU0lPTiIsICJURUwiLCAiRU1BSUwiLCAiVFoiLCAiR0VPIiwgIk5PVEUiLCAiVVJMIiwKLSAgICAgICAgICAgICAgICAgICAgIkJEQVkiLCAiUk9MRSIsICJSRVYiLCAiVUlEIiwgIktFWSIsICJNQUlMRVIiLCAvLyAyLjEKLSAgICAgICAgICAgICAgICAgICAgIk5BTUUiLCAiUFJPRklMRSIsICJTT1VSQ0UiLCAiTklDS05BTUUiLCAiQ0xBU1MiLAotICAgICAgICAgICAgICAgICAgICAiU09SVC1TVFJJTkciLCAiQ0FURUdPUklFUyIsICJQUk9ESUQiKSkpOyAvLyAzLjAKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEEgdW5tb2RpZmlhYmxlIFNldCBzdG9yaW5nIHRoZSB2YWx1ZXMgZm9yIHRoZSB0eXBlICJFTkNPRElORyIsIGF2YWlsYWJsZSBpbiB0aGUgdkNhcmQgMy4wLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaG91Z2ggdkNhcmQgMi4xIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYWxsb3cgIjdCSVQiIG9yICJCQVNFNjQiLCB3ZSBhbGxvdyB0aGVtIGZvciBzYWZldHkuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqICJRVU9URUQtUFJJTlRBQkxFIiBpcyBub3QgYWxsb3dlZCBpbiB2Q2FyZCAzLjAgYW5kIG5vdCBpbiB0aGlzIHBhcnNlciBlaXRoZXIsCi0gICAgICogYmVjYXVzZSB0aGUgZW5jb2RpbmcgYW1iaWd1YXRlcyBob3cgdGhlIHZDYXJkIGZpbGUgdG8gYmUgcGFyc2VkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzQWNjZXB0YWJsZUVuY29kaW5nID0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VOQ09ESU5HXzdCSVQsCi0gICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VOQ09ESU5HXzhCSVQsCi0gICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VOQ09ESU5HX0JBU0U2NCwKLSAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfQikpKTsKLQotICAgIHByaXZhdGUgZmluYWwgVkNhcmRQYXJzZXJJbXBsX1YzMCBtVkNhcmRQYXJzZXJJbXBsOwotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyX1YzMCgpIHsKLSAgICAgICAgbVZDYXJkUGFyc2VySW1wbCA9IG5ldyBWQ2FyZFBhcnNlckltcGxfVjMwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyX1YzMChpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WQ2FyZFBhcnNlckltcGwgPSBuZXcgVkNhcmRQYXJzZXJJbXBsX1YzMCh2Y2FyZFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGlzLCBWQ2FyZEludGVycHJldGVyIGludGVyZXByZXRlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBtVkNhcmRQYXJzZXJJbXBsLnBhcnNlKGlzLCBpbnRlcmVwcmV0ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKLSAgICAgICAgbVZDYXJkUGFyc2VySW1wbC5jYW5jZWwoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjQwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjQwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YTJmNjguLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyX1Y0MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogPHA+Ci0gKiB2Q2FyZCBwYXJzZXIgZm9yIHZDYXJkIDQuMC4KLSAqIDwvcD4KLSAqIDxwPgotICogQ3VycmVudGx5IHRoaXMgcGFyc2VyIGlzIGJhc2VkIG9uIHZDYXJkIDQuMCBzcGVjaWZpY2F0aW9uIHJldiAxMS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkUGFyc2VyX1Y0MCBpbXBsZW1lbnRzIFZDYXJkUGFyc2VyIHsKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzS25vd25Qcm9wZXJ0eU5hbWVTZXQgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgIkJFR0lOIiwgIkVORCIsICJTT1VSQ0UiLCAiTkFNRSIsICJLSU5EIiwgIlhNTCIsCi0gICAgICAgICAgICAgICAgICAgICJGTiIsICJOIiwgIk5JQ0tOQU1FIiwgIlBIT1RPIiwgIkJEQVkiLCAiRERBWSIsCi0gICAgICAgICAgICAgICAgICAgICJCSVJUSCIsICJERUFUSCIsICJBTk5JVkVSU0FSWSIsICJTRVgiLCAiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgIkxBQkVMIiwgIlRFTCIsICJFTUFJTCIsICJJTVBQIiwgIkxBTkciLCAiVFoiLAotICAgICAgICAgICAgICAgICAgICAiR0VPIiwgIlRJVExFIiwgIlJPTEUiLCAiTE9HTyIsICJPUkciLCAiTUVNQkVSIiwKLSAgICAgICAgICAgICAgICAgICAgIlJFTEFURUQiLCAiQ0FURUdPUklFUyIsICJOT1RFIiwgIlBST0RJRCIsCi0gICAgICAgICAgICAgICAgICAgICJSRVYiLCAiU09VTkQiLCAiVUlEIiwgIkNMSUVOVFBJRE1BUCIsCi0gICAgICAgICAgICAgICAgICAgICJVUkwiLCAiVkVSU0lPTiIsICJDTEFTUyIsICJLRVkiLCAiRkJVUkwiLCAiQ0FMRU5EUlVSSSIsCi0gICAgICAgICAgICAgICAgICAgICJDQUxVUkkiKSkpOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQSB1bm1vZGlmaWFibGUgU2V0IHN0b3JpbmcgdGhlIHZhbHVlcyBmb3IgdGhlIHR5cGUgIkVOQ09ESU5HIiwgYXZhaWxhYmxlIGluIHZDYXJkIDQuMC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc0FjY2VwdGFibGVFbmNvZGluZyA9Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR184QklULAotICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR19CKSkpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWQ2FyZFBhcnNlckltcGxfVjMwIG1WQ2FyZFBhcnNlckltcGw7Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJfVjQwKCkgewotICAgICAgICBtVkNhcmRQYXJzZXJJbXBsID0gbmV3IFZDYXJkUGFyc2VySW1wbF9WNDAoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJfVjQwKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZDYXJkUGFyc2VySW1wbCA9IG5ldyBWQ2FyZFBhcnNlckltcGxfVjQwKHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFZDYXJkSW50ZXJwcmV0ZXIgaW50ZXJlcHJldGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1WQ2FyZFBhcnNlckltcGwucGFyc2UoaXMsIGludGVyZXByZXRlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2FuY2VsKCkgewotICAgICAgICBtVkNhcmRQYXJzZXJJbXBsLmNhbmNlbCgpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRTb3VyY2VEZXRlY3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkU291cmNlRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM2NDYxZS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRTb3VyY2VEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBjbGFzcyB3aGljaCB0cmllcyB0byBkZXRlY3RzIHRoZSBzb3VyY2Ugb2YgYSB2Q2FyZCBmaWxlIGZyb20gaXRzIGNvbnRlbnRzLgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgc3BlY2lmaWNhdGlvbiBvZiB2Q2FyZCAoaW5jbHVkaW5nIGJvdGggMi4xIGFuZCAzLjApIGlzIG5vdCBzbyBzdHJpY3QgYXMgdG8KLSAqIGd1ZXNzIGl0cyBmb3JtYXQganVzdCBieSByZWFkaW5nIGJlZ2lubmluZyBmZXcgbGluZXMgKHVzdWFsbHkgd2UgY2FuLCBidXQgaW4KLSAqIHNvbWUgbW9zdCBwZXNzaW1pc3RpYyBjYXNlLCB3ZSBjYW5ub3QgdW50aWwgYXQgYWxtb3N0IHRoZSBlbmQgb2YgdGhlIGZpbGUpLgotICogQWxzbyB3ZSBjYW5ub3Qgc3RvcmUgYWxsIHZDYXJkIGVudHJpZXMgaW4gbWVtb3J5LCB3aGlsZSB0aGVyZSdzIG5vIHNwZWNpZmljYXRpb24KLSAqIGhvdyBiaWcgdGhlIHZDYXJkIGVudHJ5IHdvdWxkIGJlY29tZSBhZnRlciB0aGUgcGFyc2UuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgdXN1YWxseSB1c2VkIGZvciB0aGUgImZpcnN0IHNjYW4iLCBpbiB3aGljaCB3ZSBjYW4gdW5kZXJzdGFuZCB3aGljaCB2Q2FyZAotICogdmVyc2lvbiBpcyB1c2VkIChhbmQgaG93IG1hbnkgZW50cmllcyBleGlzdCBpbiBhIGZpbGUpLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRTb3VyY2VEZXRlY3RvciBpbXBsZW1lbnRzIFZDYXJkSW50ZXJwcmV0ZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkU291cmNlRGV0ZWN0b3IiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gQVBQTEVfU0lHTlMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIiwgIlgtUEhPTkVUSUMtTUlERExFLU5BTUUiLCAiWC1QSE9ORVRJQy1MQVNULU5BTUUiLAotICAgICAgICAgICAgIlgtQUJBRFIiLCAiWC1BQlVJRCIpKTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBKQVBBTkVTRV9NT0JJTEVfUEhPTkVfU0lHTlMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAiWC1HTk8iLCAiWC1HTiIsICJYLVJFRFVDVElPTiIpKTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBXSU5ET1dTX01PQklMRV9QSE9ORV9TSUdOUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICJYLU1JQ1JPU09GVC1BU1NUX1RFTCIsICJYLU1JQ1JPU09GVC1BU1NJU1RBTlQiLCAiWC1NSUNST1NPRlQtT0ZGSUNFTE9DIikpOwotICAgIAotICAgIC8vIE5vdGU6IHRoZXNlIHNpZ25lcyBhcHBlYXJzIGJlZm9yZSB0aGUgc2lnbnMgb2YgdGhlIG90aGVyIHR5cGUgKGUuZy4gIlgtR04iKS4KLSAgICAvLyBJbiBvdGhlciB3b3JkcywgSmFwYW5lc2UgRk9NQSBtb2JpbGUgcGhvbmVzIGFyZSBkZXRlY3RlZCBhcyBGT01BLCBub3QgSkFQQU5FU0VfTU9CSUxFX1BIT05FUy4KLSAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBGT01BX1NJR05TID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgIlgtU0QtVkVSTiIsICJYLVNELUZPUk1BVF9WRVIiLCAiWC1TRC1DQVRFR09SSUVTIiwgIlgtU0QtQ0xBU1MiLCAiWC1TRC1EQ1JFQVRFRCIsCi0gICAgICAgICAgICAiWC1TRC1ERVNDUklQVElPTiIpKTsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVFlQRV9GT01BX0NIQVJTRVRfU0lHTiA9ICJYLVNELUNIQVJfQ09ERSI7Ci0KLSAgICAvKioKLSAgICAgKiBSZXByZXNlbnRzIHRoYXQgbm8gZXN0aW1hdGlvbiBpcyBhdmFpbGFibGUuIFVzZXJzIG9mIHRoaXMgY2xhc3MgaXMgYWJsZSB0byB0aGlzCi0gICAgICogY29uc3RhbnQgd2hlbiB5b3UgZG9uJ3Qgd2FudCB0byBsZXQgYSB2Q2FyZCBwYXJzZXIgcmVseSBvbiBlc3RpbWF0aW9uIGZvciBwYXJzZSB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1RZUEVfVU5LTk9XTiA9IDA7Ci0KLSAgICAvLyBGb3IgQXBwbGUncyBzb2Z0d2FyZSwgd2hpY2ggZG9lcyBub3QgbWVhbiB0aGlzIHR5cGUgaXMgZWZmZWN0aXZlIGZvciBhbGwgaXRzIHByb2R1Y3RzLgotICAgIC8vIFdlIGNvbmZpcm1lZCB0aGV5IHVzdWFsbHkgdXNlIFVURi04LCBidXQgbm90IHN1cmUgYWJvdXQgdkNhcmQgdHlwZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfVFlQRV9BUFBMRSA9IDE7Ci0gICAgLy8gRm9yIEphcGFuZXNlIG1vYmlsZSBwaG9uZXMsIHdoaWNoIGFyZSB1c3VhbGx5IHVzaW5nIFNoaWZ0X0pJUyBhcyBhIGNoYXJzZXQuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1RZUEVfTU9CSUxFX1BIT05FX0pQID0gMjsKLSAgICAvLyBGb3Igc29tZSBvZiBtb2JpbGUgcGhvbmVzIHJlbGVhc2VkIGZyb20gRG9Db01vLCB3aGljaCB1c2UgbmVzdGVkIHZDYXJkLiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfVFlQRV9ET0NPTU9fVE9SRUxBVEVfTkVTVCA9IDM7Ci0gICAgLy8gRm9yIEphcGFuZXNlIFdpbmRvd3MgTW9iZWwgcGhvbmVzLiBJdCdzIHZlcnNpb24gaXMgc3VwcG9zZWQgdG8gYmUgNi41LgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQVJTRV9UWVBFX1dJTkRPV1NfTU9CSUxFX1Y2NV9KUCA9IDQ7Ci0KLSAgICBwcml2YXRlIGludCBtUGFyc2VUeXBlID0gMDsgIC8vIE5vdCBzdXJlLgotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkVG9QYXJzZVZlcnNpb24gPSBmYWxzZTsKLSAgICBwcml2YXRlIGludCBtVmVyc2lvbiA9IC0xOyAgLy8gLTEgPT0gdW5rbm93bgotCi0gICAgLy8gU29tZSBtb2JpbGUgcGhvbmVzIChsaWtlIEZPTUEpIHRlbGxzIHVzIHRoZSBjaGFyc2V0IG9mIHRoZSBkYXRhLgotICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZFRvUGFyc2VDaGFyc2V0OwotICAgIHByaXZhdGUgU3RyaW5nIG1TcGVjaWZpZWRDaGFyc2V0OwotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBlbmQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbnRyeSgpIHsKLSAgICB9ICAgIAotCi0gICAgcHVibGljIHZvaWQgc3RhcnRQcm9wZXJ0eSgpIHsKLSAgICAgICAgbU5lZWRUb1BhcnNlQ2hhcnNldCA9IGZhbHNlOwotICAgICAgICBtTmVlZFRvUGFyc2VWZXJzaW9uID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1ZFUlNJT04pKSB7Ci0gICAgICAgICAgICBtTmVlZFRvUGFyc2VWZXJzaW9uID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoVFlQRV9GT01BX0NIQVJTRVRfU0lHTikpIHsKLSAgICAgICAgICAgIG1QYXJzZVR5cGUgPSBQQVJTRV9UWVBFX0RPQ09NT19UT1JFTEFURV9ORVNUOwotICAgICAgICAgICAgLy8gUHJvYmFibHkgU2hpZnRfSklTIGlzIHVzZWQsIGJ1dCB3ZSBzaG91bGQgZG91YmxlIGNvbmZpcm0uCi0gICAgICAgICAgICBtTmVlZFRvUGFyc2VDaGFyc2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobVBhcnNlVHlwZSAhPSBQQVJTRV9UWVBFX1VOS05PV04pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoV0lORE9XU19NT0JJTEVfUEhPTkVfU0lHTlMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgIG1QYXJzZVR5cGUgPSBQQVJTRV9UWVBFX1dJTkRPV1NfTU9CSUxFX1Y2NV9KUDsKLSAgICAgICAgfSBlbHNlIGlmIChGT01BX1NJR05TLmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgICAgICBtUGFyc2VUeXBlID0gUEFSU0VfVFlQRV9ET0NPTU9fVE9SRUxBVEVfTkVTVDsKLSAgICAgICAgfSBlbHNlIGlmIChKQVBBTkVTRV9NT0JJTEVfUEhPTkVfU0lHTlMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgIG1QYXJzZVR5cGUgPSBQQVJTRV9UWVBFX01PQklMRV9QSE9ORV9KUDsKLSAgICAgICAgfSBlbHNlIGlmIChBUFBMRV9TSUdOUy5jb250YWlucyhuYW1lKSkgewotICAgICAgICAgICAgbVBhcnNlVHlwZSA9IFBBUlNFX1RZUEVfQVBQTEU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcgdHlwZSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlcyhMaXN0PFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmIChtTmVlZFRvUGFyc2VWZXJzaW9uICYmIHZhbHVlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmVyc2lvblN0cmluZyA9IHZhbHVlcy5nZXQoMCk7Ci0gICAgICAgICAgICBpZiAodmVyc2lvblN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuVkVSU0lPTl9WMjEpKSB7Ci0gICAgICAgICAgICAgICAgbVZlcnNpb24gPSBWQ2FyZENvbmZpZy5WRVJTSU9OXzIxOwotICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1YzMCkpIHsKLSAgICAgICAgICAgICAgICBtVmVyc2lvbiA9IFZDYXJkQ29uZmlnLlZFUlNJT05fMzA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25TdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlZFUlNJT05fVjQwKSkgewotICAgICAgICAgICAgICAgIG1WZXJzaW9uID0gVkNhcmRDb25maWcuVkVSU0lPTl80MDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkludmFsaWQgdmVyc2lvbiBzdHJpbmc6ICIgKyB2ZXJzaW9uU3RyaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtTmVlZFRvUGFyc2VDaGFyc2V0ICYmIHZhbHVlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtU3BlY2lmaWVkQ2hhcnNldCA9IHZhbHVlcy5nZXQoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBhdmFpbGFibGUgdHlwZSBjYW4gYmUgdXNlZCB3aXRoIHZDYXJkIHBhcnNlci4gWW91IHByb2JhYmx5IG5lZWQgdG8KLSAgICAgKiB1c2Uge3tAbGluayAjZ2V0RXN0aW1hdGVkQ2hhcnNldCgpfSB0byB1bmRlcnN0YW5kIHRoZSBjaGFyc2V0IHRvIGJlIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRFc3RpbWF0ZWRUeXBlKCkgewotICAgICAgICBzd2l0Y2ggKG1QYXJzZVR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgUEFSU0VfVFlQRV9ET0NPTU9fVE9SRUxBVEVfTkVTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gVkNhcmRDb25maWcuVkNBUkRfVFlQRV9ET0NPTU8gfCBWQ2FyZENvbmZpZy5GTEFHX1RPUkVMQVRFX05FU1Q7Ci0gICAgICAgICAgICBjYXNlIFBBUlNFX1RZUEVfTU9CSUxFX1BIT05FX0pQOgotICAgICAgICAgICAgICAgIHJldHVybiBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEU7Ci0gICAgICAgICAgICBjYXNlIFBBUlNFX1RZUEVfQVBQTEU6Ci0gICAgICAgICAgICBjYXNlIFBBUlNFX1RZUEVfV0lORE9XU19NT0JJTEVfVjY1X0pQOgotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIGlmIChtVmVyc2lvbiA9PSBWQ2FyZENvbmZpZy5WRVJTSU9OXzIxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVZlcnNpb24gPT0gVkNhcmRDb25maWcuVkVSU0lPTl8zMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMzBfR0VORVJJQzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1WZXJzaW9uID09IFZDYXJkQ29uZmlnLlZFUlNJT05fNDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjQwX0dFTkVSSUM7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVU5LTk9XTjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIGNoYXJzZXQgU3RyaW5nIGd1ZXNzZWQgZnJvbSB0aGUgc291cmNlJ3MgcHJvcGVydGllcy4KLSAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBhZnRlciBwYXJzaW5nIHRhcmdldCBmaWxlKHMpLgotICAgICAqIDwvcD4KLSAgICAgKiBAcmV0dXJuIENoYXJzZXQgU3RyaW5nLiBOdWxsIGlzIHJldHVybmVkIGlmIGd1ZXNzaW5nIHRoZSBzb3VyY2UgZmFpbHMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFc3RpbWF0ZWRDaGFyc2V0KCkgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobVNwZWNpZmllZENoYXJzZXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNwZWNpZmllZENoYXJzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoIChtUGFyc2VUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFBBUlNFX1RZUEVfV0lORE9XU19NT0JJTEVfVjY1X0pQOgotICAgICAgICAgICAgY2FzZSBQQVJTRV9UWVBFX0RPQ09NT19UT1JFTEFURV9ORVNUOgotICAgICAgICAgICAgY2FzZSBQQVJTRV9UWVBFX01PQklMRV9QSE9ORV9KUDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNISUZUX0pJUyI7Ci0gICAgICAgICAgICBjYXNlIFBBUlNFX1RZUEVfQVBQTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVVEYtOCI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiY2VjYTAuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLkRlY29kZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLm5ldC5RdW90ZWRQcmludGFibGVDb2RlYzsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFV0aWxpdGllcyBmb3IgVkNhcmQgaGFuZGxpbmcgY29kZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZFV0aWxzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZFV0aWxzIjsKLQotICAgIC8vIE5vdGUgdGhhdCBub3QgYWxsIHR5cGVzIGFyZSBpbmNsdWRlZCBpbiB0aGlzIG1hcC9zZXQsIHNpbmNlLCBmb3IgZXhhbXBsZSwgVFlQRV9IT01FX0ZBWCBpcwotICAgIC8vIGNvbnZlcnRlZCB0byB0d28gcGFyYW1ldGVyIFN0cmluZ3MuIFRoZXNlIG9ubHkgY29udGFpbiBzb21lIG1pbm9yIGZpZWxkcyB2YWxpZCBpbiBib3RoCi0gICAgLy8gdkNhcmQgYW5kIGN1cnJlbnQgKGFzIG9mIDIwMDktMDgtMDcpIENvbnRhY3RzIHN0cnVjdHVyZS4gCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIFN0cmluZz4gc0tub3duUGhvbmVUeXBlc01hcF9JdG9TOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHNQaG9uZVR5cGVzVW5rbm93blRvQ29udGFjdHNTZXQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gc0tub3duUGhvbmVUeXBlTWFwX1N0b0k7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIFN0cmluZz4gc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHNNb2JpbGVQaG9uZUxhYmVsU2V0OwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlc01hcF9JdG9TID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSSA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLQotICAgICAgICBzS25vd25QaG9uZVR5cGVzTWFwX0l0b1MucHV0KFBob25lLlRZUEVfQ0FSLCBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NBUik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NBUiwgUGhvbmUuVFlQRV9DQVIpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVzTWFwX0l0b1MucHV0KFBob25lLlRZUEVfUEFHRVIsIFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUEFHRVIpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QQUdFUiwgUGhvbmUuVFlQRV9QQUdFUik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZXNNYXBfSXRvUy5wdXQoUGhvbmUuVFlQRV9JU0ROLCBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0lTRE4pOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9JU0ROLCBQaG9uZS5UWVBFX0lTRE4pOwotICAgICAgICAKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSywgUGhvbmUuVFlQRV9XT1JLKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0VMTCwgUGhvbmUuVFlQRV9NT0JJTEUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9PVEhFUiwgUGhvbmUuVFlQRV9PVEhFUik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0NBTExCQUNLLAotICAgICAgICAgICAgICAgIFBob25lLlRZUEVfQ0FMTEJBQ0spOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoCi0gICAgICAgICAgICAgICAgVkNhcmRDb25zdGFudHMuUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9DT01QQU5ZX01BSU4sIFBob25lLlRZUEVfQ09NUEFOWV9NQUlOKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1BIT05FX0VYVFJBX1RZUEVfUkFESU8sIFBob25lLlRZUEVfUkFESU8pOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9UVFlfVERELAotICAgICAgICAgICAgICAgIFBob25lLlRZUEVfVFRZX1RERCk7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0FTU0lTVEFOVCwKLSAgICAgICAgICAgICAgICBQaG9uZS5UWVBFX0FTU0lTVEFOVCk7Ci0KLSAgICAgICAgc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9NT0RFTSk7Ci0gICAgICAgIHNQaG9uZVR5cGVzVW5rbm93blRvQ29udGFjdHNTZXQuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfTVNHKTsKLSAgICAgICAgc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9CQlMpOwotICAgICAgICBzUGhvbmVUeXBlc1Vua25vd25Ub0NvbnRhY3RzU2V0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1ZJREVPKTsKLQotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfQUlNLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0FJTSk7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfTVNOLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX01TTik7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfWUFIT08sIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfWUFIT08pOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX1NLWVBFLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1NLWVBFX1VTRVJOQU1FKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9HT09HTEVfVEFMSywKLSAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0dPT0dMRV9UQUxLKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9JQ1EsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfSUNRKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9KQUJCRVIsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfSkFCQkVSKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9RUSwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9RUSk7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfTkVUTUVFVElORywgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9ORVRNRUVUSU5HKTsKLQotICAgICAgICAvLyBcdTY0M0FcdTVFMkZcdTk2RkJcdThBNzEgPSBGdWxsLXdpZHRoIEhpcmFnYW5hICJLZWl0YWktRGVud2EiIChtb2JpbGUgcGhvbmUpCi0gICAgICAgIC8vIFx1NjQzQVx1NUUyRiA9IEZ1bGwtd2lkdGggSGlyYWdhbmEgIktlaXRhaSIgKG1vYmlsZSBwaG9uZSkKLSAgICAgICAgLy8gXHUzMEIxXHUzMEE0XHUzMEJGXHUzMEE0ID0gRnVsbC13aWR0aCBLYXRha2FuYSAiS2VpdGFpIiAobW9iaWxlIHBob25lKQotICAgICAgICAvLyBcdUZGNzlcdUZGNzJcdUZGODBcdUZGNzIgPSBIYWxmLXdpZHRoIEthdGFrYW5hICJLZWl0YWkiIChtb2JpbGUgcGhvbmUpCi0gICAgICAgIHNNb2JpbGVQaG9uZUxhYmVsU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICJNT0JJTEUiLCAiXHU2NDNBXHU1RTJGXHU5NkZCXHU4QTcxIiwgIlx1NjQzQVx1NUUyRiIsICJcdTMwQjFcdTMwQTRcdTMwQkZcdTMwQTQiLAotICAgICAgICAgICAgICAgICJcdUZGNzlcdUZGNzJcdUZGODBcdUZGNzIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGhvbmVUeXBlU3RyaW5nKEludGVnZXIgdHlwZSkgewotICAgICAgICByZXR1cm4gc0tub3duUGhvbmVUeXBlc01hcF9JdG9TLmdldCh0eXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIEludGVyZ2VyIHdoZW4gdGhlIGdpdmVuIHR5cGVzIGNhbiBiZSBwYXJzZWQgYXMga25vd24gdHlwZS4gUmV0dXJucyBTdHJpbmcgb2JqZWN0Ci0gICAgICogd2hlbiBub3QsIHdoaWNoIHNob3VsZCBiZSBzZXQgdG8gbGFiZWwuIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFBob25lVHlwZUZyb21TdHJpbmdzKENvbGxlY3Rpb248U3RyaW5nPiB0eXBlcywKLSAgICAgICAgICAgIFN0cmluZyBudW1iZXIpIHsKLSAgICAgICAgaWYgKG51bWJlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBudW1iZXIgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBpbnQgdHlwZSA9IC0xOwotICAgICAgICBTdHJpbmcgbGFiZWwgPSBudWxsOwotICAgICAgICBib29sZWFuIGlzRmF4ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gaGFzUHJlZiA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgaWYgKHR5cGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGVTdHJpbmcgOiB0eXBlcykgewotICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFzUHJlZiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0ZBWCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXNGYXggPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLnN0YXJ0c1dpdGgoIlgtIikgJiYgdHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nLnN1YnN0cmluZygyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHRtcCA9IHNLbm93blBob25lVHlwZU1hcF9TdG9JLmdldCh0eXBlU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdHlwZUNhbmRpZGF0ZSA9IHRtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRZUEVfUEFHRVIgaXMgcHJlZmVyZWQgd2hlbiB0aGUgbnVtYmVyIGNvbnRhaW5zIEAgc3Vycm9uZGVkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHBhZ2VyIG51bWJlciBhbmQgYSBkb21haW4gbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGUuZy4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG8gMTExMUBkb21haW4uY29tCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB4IEBkb21haW4uY29tCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB4IDExMTFACi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXhPZkF0ID0gbnVtYmVyLmluZGV4T2YoIkAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZUNhbmRpZGF0ZSA9PSBQaG9uZS5UWVBFX1BBR0VSCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIDAgPCBpbmRleE9mQXQgJiYgaW5kZXhPZkF0IDwgbnVtYmVyLmxlbmd0aCgpIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSA8IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSA9PSBQaG9uZS5UWVBFX0NVU1RPTSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0bXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX0NVU1RPTTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gdHlwZVN0cmluZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZSA8IDApIHsKLSAgICAgICAgICAgIGlmIChoYXNQcmVmKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfTUFJTjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBUWVBFX0hPTUUKLSAgICAgICAgICAgICAgICB0eXBlID0gUGhvbmUuVFlQRV9IT01FOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0ZheCkgewotICAgICAgICAgICAgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9IT01FKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfRkFYX0hPTUU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9XT1JLKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfRkFYX1dPUks7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9PVEhFUikgewotICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX09USEVSX0ZBWDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZSA9PSBQaG9uZS5UWVBFX0NVU1RPTSkgewotICAgICAgICAgICAgcmV0dXJuIGxhYmVsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01vYmlsZVBob25lTGFiZWwoZmluYWwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIC8vIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotICAgICAgICAvLyBEZXRhaWw6IFVudGlsIERvbnV0LCB0aGVyZSBpc24ndCBUWVBFX01PQklMRSBmb3IgZW1haWwgd2hpbGUgdGhlcmUgaXMgbm93LgotICAgICAgICAvLyAgICAgICAgIFRvIHN1cHBvcnQgbW9iaWxlIHR5cGUgYXQgdGhhdCB0aW1lLCB0aGlzIGN1c3RvbSBsYWJlbCBoYWQgYmVlbiB1c2VkLgotICAgICAgICByZXR1cm4gKCJfQVVUT19DRUxMIi5lcXVhbHMobGFiZWwpIHx8IHNNb2JpbGVQaG9uZUxhYmVsU2V0LmNvbnRhaW5zKGxhYmVsKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRJblYyMUJ1dFVua25vd25Ub0NvbnRhY3RzUGhvdGVUeXBlKGZpbmFsIFN0cmluZyBsYWJlbCkgewotICAgICAgICByZXR1cm4gc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldC5jb250YWlucyhsYWJlbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lRm9ySW0oZmluYWwgaW50IHByb3RvY29sKSB7Ci0gICAgICAgIHJldHVybiBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MuZ2V0KHByb3RvY29sKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHNvcnROYW1lRWxlbWVudHMoZmluYWwgaW50IHZjYXJkVHlwZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmYW1pbHlOYW1lLCBmaW5hbCBTdHJpbmcgbWlkZGxlTmFtZSwgZmluYWwgU3RyaW5nIGdpdmVuTmFtZSkgewotICAgICAgICBmaW5hbCBTdHJpbmdbXSBsaXN0ID0gbmV3IFN0cmluZ1szXTsKLSAgICAgICAgZmluYWwgaW50IG5hbWVPcmRlclR5cGUgPSBWQ2FyZENvbmZpZy5nZXROYW1lT3JkZXJUeXBlKHZjYXJkVHlwZSk7Ci0gICAgICAgIHN3aXRjaCAobmFtZU9yZGVyVHlwZSkgewotICAgICAgICAgICAgY2FzZSBWQ2FyZENvbmZpZy5OQU1FX09SREVSX0pBUEFORVNFOiB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKGZhbWlseU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc09ubHlQcmludGFibGVBc2NpaShnaXZlbk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RbMF0gPSBnaXZlbk5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RbMV0gPSBtaWRkbGVOYW1lOwotICAgICAgICAgICAgICAgICAgICBsaXN0WzJdID0gZmFtaWx5TmFtZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsaXN0WzBdID0gZmFtaWx5TmFtZTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdFsxXSA9IG1pZGRsZU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RbMl0gPSBnaXZlbk5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBWQ2FyZENvbmZpZy5OQU1FX09SREVSX0VVUk9QRTogewotICAgICAgICAgICAgICAgIGxpc3RbMF0gPSBtaWRkbGVOYW1lOwotICAgICAgICAgICAgICAgIGxpc3RbMV0gPSBnaXZlbk5hbWU7Ci0gICAgICAgICAgICAgICAgbGlzdFsyXSA9IGZhbWlseU5hbWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgbGlzdFswXSA9IGdpdmVuTmFtZTsKLSAgICAgICAgICAgICAgICBsaXN0WzFdID0gbWlkZGxlTmFtZTsKLSAgICAgICAgICAgICAgICBsaXN0WzJdID0gZmFtaWx5TmFtZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQaG9uZU51bWJlckZvcm1hdChmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc0phcGFuZXNlRGV2aWNlKHZjYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9KQVBBTjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9OQU5QOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogSW5zZXJ0cyBwb3N0YWwgZGF0YSBpbnRvIHRoZSBidWlsZGVyIG9iamVjdC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBkYXRhIHN0cnVjdHVyZSBvZiBDb250YWN0c0NvbnRyYWN0IGlzIGRpZmZlcmVudCBmcm9tIHRoYXQgZGVmaW5lZCBpbiB2Q2FyZC4KLSAgICAgKiBTbyBzb21lIGNvbnZlcnNpb24gbWF5IGJlIHBlcmZvcm1lZCBpbiB0aGlzIG1ldGhvZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFN0cnVjdHVyZWRQb3N0YWxEYXRhVXNpbmdDb250YWN0c1N0cnVjdChpbnQgdmNhcmRUeXBlLAotICAgICAgICAgICAgZmluYWwgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLkJ1aWxkZXIgYnVpbGRlciwKLSAgICAgICAgICAgIGZpbmFsIFZDYXJkRW50cnkuUG9zdGFsRGF0YSBwb3N0YWxEYXRhKSB7Ci0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShTdHJ1Y3R1cmVkUG9zdGFsLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSk7Ci0KLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBwb3N0YWxEYXRhLnR5cGUpOwotICAgICAgICBpZiAocG9zdGFsRGF0YS50eXBlID09IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsIHBvc3RhbERhdGEubGFiZWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHN0cmVldFN0cmluZzsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBvc3RhbERhdGEuc3RyZWV0KSkgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgIHN0cmVldFN0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmVldFN0cmluZyA9IHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgIHN0cmVldFN0cmluZyA9IHBvc3RhbERhdGEuc3RyZWV0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJlZXRTdHJpbmcgPSBwb3N0YWxEYXRhLnN0cmVldCArICIgIiArIHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsIHBvc3RhbERhdGEucG9ib3gpOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgc3RyZWV0U3RyaW5nKTsKLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCBwb3N0YWxEYXRhLmxvY2FsdHkpOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgcG9zdGFsRGF0YS5yZWdpb24pOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCBwb3N0YWxEYXRhLnBvc3RhbENvZGUpOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksIHBvc3RhbERhdGEuY291bnRyeSk7Ci0KLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICBwb3N0YWxEYXRhLmdldEZvcm1hdHRlZEFkZHJlc3ModmNhcmRUeXBlKSk7Ci0gICAgICAgIGlmIChwb3N0YWxEYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHMoZmluYWwgaW50IHZjYXJkVHlwZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmYW1pbHlOYW1lLCBmaW5hbCBTdHJpbmcgbWlkZGxlTmFtZSwgZmluYWwgU3RyaW5nIGdpdmVuTmFtZSkgewotICAgICAgICByZXR1cm4gY29uc3RydWN0TmFtZUZyb21FbGVtZW50cyh2Y2FyZFR5cGUsIGZhbWlseU5hbWUsIG1pZGRsZU5hbWUsIGdpdmVuTmFtZSwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKGZpbmFsIGludCB2Y2FyZFR5cGUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmFtaWx5TmFtZSwgZmluYWwgU3RyaW5nIG1pZGRsZU5hbWUsIGZpbmFsIFN0cmluZyBnaXZlbk5hbWUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4LCBmaW5hbCBTdHJpbmcgc3VmZml4KSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIG5hbWVMaXN0ID0gc29ydE5hbWVFbGVtZW50cyh2Y2FyZFR5cGUsIGZhbWlseU5hbWUsIG1pZGRsZU5hbWUsIGdpdmVuTmFtZSk7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHByZWZpeCkpIHsKLSAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChwcmVmaXgpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIG5hbWVQYXJ0IDogbmFtZUxpc3QpIHsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobmFtZVBhcnQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobmFtZVBhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoc3VmZml4KSkgewotICAgICAgICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChzdWZmaXgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BsaXRzIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIHBpZWNlcyB1c2luZyB0aGUgZGVsaW1pdGVyICc7JyBpbnNpZGUgaXQuCi0gICAgICoKLSAgICAgKiBFc2NhcGVkIGNoYXJhY3RlcnMgaW4gdGhvc2UgdmFsdWVzIGFyZSBhdXRvbWF0aWNhbGx5IHVuZXNjYXBlZCBpbnRvIG9yaWdpbmFsIGZvcm0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gY29uc3RydWN0TGlzdEZyb21WYWx1ZShmaW5hbCBTdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICBmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY2hhciBjaCA9IHZhbHVlLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnICYmIGkgPCBsZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBuZXh0Q2ggPSB2YWx1ZS5jaGFyQXQoaSArIDEpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1bmVzY2FwZWRTdHJpbmc7Ci0gICAgICAgICAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjQwKHZjYXJkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdW5lc2NhcGVkU3RyaW5nID0gVkNhcmRQYXJzZXJJbXBsX1Y0MC51bmVzY2FwZUNoYXJhY3RlcihuZXh0Q2gpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICB1bmVzY2FwZWRTdHJpbmcgPSBWQ2FyZFBhcnNlckltcGxfVjMwLnVuZXNjYXBlQ2hhcmFjdGVyKG5leHRDaCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFWQ2FyZENvbmZpZy5pc1ZlcnNpb24yMSh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmtub3duIHZDYXJkIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJVbmtub3duIHZDYXJkIHR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1bmVzY2FwZWRTdHJpbmcgPSBWQ2FyZFBhcnNlckltcGxfVjIxLnVuZXNjYXBlQ2hhcmFjdGVyKG5leHRDaCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHVuZXNjYXBlZFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHVuZXNjYXBlZFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnOycpIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbGlzdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKGZpbmFsIFN0cmluZy4uLnZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250YWluc09ubHlQcmludGFibGVBc2NpaShBcnJheXMuYXNMaXN0KHZhbHVlcykpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlQcmludGFibGVBc2NpaShmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzUHJpbnRhYmxlQXNjaWlPbmx5KHZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGNoZWNraW5nIHRoZSBzdHJpbmcgc2hvdWxkIGJlIGVuY29kZWQgaW50byBxdW90ZWQtcHJpbnRhYmxlCi0gICAgICogb3Igbm90LCB3aGljaCBpcyByZXF1aXJlZCBieSB2Q2FyZCAyLjEuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFNlZSB0aGUgZGVmaW5pdGlvbiBvZiAiN2JpdCIgaW4gdkNhcmQgMi4xIHNwZWMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoZmluYWwgU3RyaW5nLi4udmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShBcnJheXMuYXNMaXN0KHZhbHVlcykpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCBhc2NpaUZpcnN0ID0gMHgyMDsKLSAgICAgICAgZmluYWwgaW50IGFzY2lpTGFzdCA9IDB4N0U7ICAvLyBpbmNsdWRlZAotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgPSB2YWx1ZS5vZmZzZXRCeUNvZGVQb2ludHMoaSwgMSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYyA9IHZhbHVlLmNvZGVQb2ludEF0KGkpOwotICAgICAgICAgICAgICAgIGlmICghKGFzY2lpRmlyc3QgPD0gYyAmJiBjIDw9IGFzY2lpTGFzdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8Q2hhcmFjdGVyPiBzVW5BY2NlcHRhYmxlQXNjaWlJblYyMVdvcmRTZXQgPQotICAgICAgICBuZXcgSGFzaFNldDxDaGFyYWN0ZXI+KEFycmF5cy5hc0xpc3QoJ1snLCAnXScsICc9JywgJzonLCAnLicsICcsJywgJyAnKSk7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIHVzZWZ1bCBzaW5jZSB2Q2FyZCAzLjAgb2Z0ZW4gcmVxdWlyZXMgdGhlICgiWC0iKSBwcm9wZXJ0aWVzIGFuZCBncm91cHMKLSAgICAgKiBzaG91bGQgY29udGFpbiBvbmx5IGFscGhhYmV0cywgZGlnaXRzLCBhbmQgaHlwaGVuLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4gCi0gICAgICogTm90ZTogSXQgaXMgYWxyZWFkeSBrbm93biBzb21lIGRldmljZXMgKHdyb25nbHkpIG91dHB1dHMgcHJvcGVydGllcyB3aXRoIGNoYXJhY3RlcnMKLSAgICAgKiAgICAgICB3aGljaCBzaG91bGQgbm90IGJlIGluIHRoZSBmaWVsZC4gT25lIGV4YW1wbGUgaXMgIlgtR09PR0xFIFRBTEsiLiBXZSBhY2NlcHQKLSAgICAgKiAgICAgICBzdWNoIGtpbmQgb2YgaW5wdXQgYnV0IG11c3QgbmV2ZXIgb3V0cHV0IGl0IHVubGVzcyB0aGUgdGFyZ2V0IGlzIHZlcnkgc3BlY2lmaWMKLSAgICAgKiAgICAgICB0byB0aGUgZGV2aWNlIHdoaWNoIGlzIGFibGUgdG8gcGFyc2UgdGhlIG1hbGZvcm1lZCBpbnB1dC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oZmluYWwgU3RyaW5nLi4udmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oQXJyYXlzLmFzTGlzdCh2YWx1ZXMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IHVwcGVyQWxwaGFiZXRGaXJzdCA9IDB4NDE7ICAvLyBBCi0gICAgICAgIGZpbmFsIGludCB1cHBlckFscGhhYmV0QWZ0ZXJMYXN0ID0gMHg1YjsgIC8vIFsKLSAgICAgICAgZmluYWwgaW50IGxvd2VyQWxwaGFiZXRGaXJzdCA9IDB4NjE7ICAvLyBhCi0gICAgICAgIGZpbmFsIGludCBsb3dlckFscGhhYmV0QWZ0ZXJMYXN0ID0gMHg3YjsgIC8vIHsKLSAgICAgICAgZmluYWwgaW50IGRpZ2l0Rmlyc3QgPSAweDMwOyAgLy8gMAotICAgICAgICBmaW5hbCBpbnQgZGlnaXRBZnRlckxhc3QgPSAweDNBOyAgLy8gOgotICAgICAgICBmaW5hbCBpbnQgaHlwaGVuID0gJy0nOwotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBzdHIgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzdHIpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gc3RyLmxlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgPSBzdHIub2Zmc2V0QnlDb2RlUG9pbnRzKGksIDEpKSB7Ci0gICAgICAgICAgICAgICAgaW50IGNvZGVwb2ludCA9IHN0ci5jb2RlUG9pbnRBdChpKTsKLSAgICAgICAgICAgICAgICBpZiAoISgobG93ZXJBbHBoYWJldEZpcnN0IDw9IGNvZGVwb2ludCAmJiBjb2RlcG9pbnQgPCBsb3dlckFscGhhYmV0QWZ0ZXJMYXN0KSB8fAotICAgICAgICAgICAgICAgICAgICAodXBwZXJBbHBoYWJldEZpcnN0IDw9IGNvZGVwb2ludCAmJiBjb2RlcG9pbnQgPCB1cHBlckFscGhhYmV0QWZ0ZXJMYXN0KSB8fAotICAgICAgICAgICAgICAgICAgICAoZGlnaXRGaXJzdCA8PSBjb2RlcG9pbnQgJiYgY29kZXBvaW50IDwgZGlnaXRBZnRlckxhc3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChjb2RlcG9pbnQgPT0gaHlwaGVuKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNPbmx5V2hpdGVTcGFjZXMoZmluYWwgU3RyaW5nLi4udmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRhaW5zT25seVdoaXRlU3BhY2VzKEFycmF5cy5hc0xpc3QodmFsdWVzKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zT25seVdoaXRlU3BhY2VzKGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBzdHIgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzdHIpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gc3RyLmxlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgPSBzdHIub2Zmc2V0QnlDb2RlUG9pbnRzKGksIDEpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHN0ci5jb2RlUG9pbnRBdChpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZ2l2ZW4gU3RyaW5nIGlzIGNhdGVnb3JpemVkIGFzICJ3b3JkIiBzcGVjaWZpZWQgaW4gdkNhcmQgc3BlYyAyLjEuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIHZDYXJkIDIuMSBzcGVjaWZpZXM6PGJyIC8+Ci0gICAgICogd29yZCA9ICZsdDthbnkgcHJpbnRhYmxlIDdiaXQgdXMtYXNjaWkgZXhjZXB0IFtdPTouLCAmZ3Q7Ci0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1YyMVdvcmQoZmluYWwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCBhc2NpaUZpcnN0ID0gMHgyMDsKLSAgICAgICAgZmluYWwgaW50IGFzY2lpTGFzdCA9IDB4N0U7ICAvLyBpbmNsdWRlZAotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpID0gdmFsdWUub2Zmc2V0QnlDb2RlUG9pbnRzKGksIDEpKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgYyA9IHZhbHVlLmNvZGVQb2ludEF0KGkpOwotICAgICAgICAgICAgaWYgKCEoYXNjaWlGaXJzdCA8PSBjICYmIGMgPD0gYXNjaWlMYXN0KSB8fAotICAgICAgICAgICAgICAgICAgICBzVW5BY2NlcHRhYmxlQXNjaWlJblYyMVdvcmRTZXQuY29udGFpbnMoKGNoYXIpYykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gc0VzY2FwZUluZGljYXRvcnNWMzAgPSBuZXcgaW50W117Ci0gICAgICAgICc6JywgJzsnLCAnLCcsICcgJwotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBzRXNjYXBlSW5kaWNhdG9yc1Y0MCA9IG5ldyBpbnRbXXsKLSAgICAgICAgJzsnLCAnOicKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogUmV0dXJucyBTdHJpbmcgYXZhaWxhYmxlIGFzIHBhcmFtZXRlciB2YWx1ZSBpbiB2Q2FyZCAzLjAuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIFJGQyAyNDI2IHJlcXVpcmVzIHZDYXJkIGNvbXBvc2VyIHRvIHF1b3RlIHBhcmFtZXRlciB2YWx1ZXMgd2hlbiBpdCBjb250YWlucwotICAgICAqIHNlbWktY29sb24sIGZvciBleGFtcGxlIChTZWUgUkZDIDI0MjYgZm9yIG1vcmUgaW5mb3JtYXRpb24pLgotICAgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBTdHJpbmcgY2FuIGJlIHVzZWQgd2l0aG91dCBxdW90ZXMuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIE5vdGU6IFdlIHJlbW92ZSBEUVVPVEUgaW5zaWRlIHRoZSBnaXZlbiB2YWx1ZSBzaWxlbnRseSBmb3Igbm93LgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZ0FzVjMwUGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHRvU3RyaW5nQXNQYXJhbVZhbHVlKHZhbHVlLCBzRXNjYXBlSW5kaWNhdG9yc1YzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmdBc1Y0MFBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB0b1N0cmluZ0FzUGFyYW1WYWx1ZSh2YWx1ZSwgc0VzY2FwZUluZGljYXRvcnNWNDApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b1N0cmluZ0FzUGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUsIGZpbmFsIGludFtdIGVzY2FwZUluZGljYXRvcnMpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgdmFsdWUgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgYXNjaWlGaXJzdCA9IDB4MjA7Ci0gICAgICAgIGZpbmFsIGludCBhc2NpaUxhc3QgPSAweDdFOyAgLy8gaW5jbHVkZWQKLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotICAgICAgICBib29sZWFuIG5lZWRRdW90ZSA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSA9IHZhbHVlLm9mZnNldEJ5Q29kZVBvaW50cyhpLCAxKSkgewotICAgICAgICAgICAgZmluYWwgaW50IGNvZGVQb2ludCA9IHZhbHVlLmNvZGVQb2ludEF0KGkpOwotICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA8IGFzY2lpRmlyc3QgfHwgY29kZVBvaW50ID09ICciJykgewotICAgICAgICAgICAgICAgIC8vIENUTCBjaGFyYWN0ZXJzIGFuZCBEUVVPVEUgYXJlIG5ldmVyIGFjY2VwdGVkLiBSZW1vdmUgdGhlbS4KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kQ29kZVBvaW50KGNvZGVQb2ludCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpbmRpY2F0b3IgOiBlc2NhcGVJbmRpY2F0b3JzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA9PSBpbmRpY2F0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgbmVlZFF1b3RlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgcmV0dXJuICgocmVzdWx0LmlzRW1wdHkoKSB8fCBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVdoaXRlU3BhY2VzKHJlc3VsdCkpCi0gICAgICAgICAgICAgICAgPyAiIgotICAgICAgICAgICAgICAgIDogKG5lZWRRdW90ZSA/ICgnIicgKyByZXN1bHQgKyAnIicpCi0gICAgICAgICAgICAgICAgOiByZXN1bHQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0hhbGZXaWR0aFN0cmluZyhmaW5hbCBTdHJpbmcgb3JnU3RyaW5nKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShvcmdTdHJpbmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gb3JnU3RyaW5nLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSA9IG9yZ1N0cmluZy5vZmZzZXRCeUNvZGVQb2ludHMoaSwgMSkpIHsKLSAgICAgICAgICAgIC8vIEFsbCBKYXBhbmVzZSBjaGFyYWN0ZXIgaXMgYWJsZSB0byBiZSBleHByZXNzZWQgYnkgY2hhci4KLSAgICAgICAgICAgIC8vIERvIG5vdCBuZWVkIHRvIHVzZSBTdHJpbmcjY29kZXBQb2ludEF0KCkuCi0gICAgICAgICAgICBmaW5hbCBjaGFyIGNoID0gb3JnU3RyaW5nLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBoYWxmV2lkdGhUZXh0ID0gSmFwYW5lc2VVdGlscy50cnlHZXRIYWxmV2lkdGhUZXh0KGNoKTsKLSAgICAgICAgICAgIGlmIChoYWxmV2lkdGhUZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChoYWxmV2lkdGhUZXh0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR3Vlc3NlcyB0aGUgZm9ybWF0IG9mIGlucHV0IGltYWdlLiBDdXJyZW50bHkganVzdCB0aGUgZmlyc3QgZmV3IGJ5dGVzIGFyZSB1c2VkLgotICAgICAqIFRoZSB0eXBlICJHSUYiLCAiUE5HIiwgb3IgIkpQRUciIGlzIHJldHVybmVkIHdoZW4gcG9zc2libGUuIFJldHVybnMgbnVsbCB3aGVuCi0gICAgICogdGhlIGd1ZXNzIGZhaWxlZC4KLSAgICAgKiBAcGFyYW0gaW5wdXQgSW1hZ2UgYXMgYnl0ZSBhcnJheS4KLSAgICAgKiBAcmV0dXJuIFRoZSBpbWFnZSB0eXBlIG9yIG51bGwgd2hlbiB0aGUgdHlwZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBndWVzc0ltYWdlVHlwZShmaW5hbCBieXRlW10gaW5wdXQpIHsKLSAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC5sZW5ndGggPj0gMyAmJiBpbnB1dFswXSA9PSAnRycgJiYgaW5wdXRbMV0gPT0gJ0knICYmIGlucHV0WzJdID09ICdGJykgewotICAgICAgICAgICAgcmV0dXJuICJHSUYiOwotICAgICAgICB9IGVsc2UgaWYgKGlucHV0Lmxlbmd0aCA+PSA0ICYmIGlucHV0WzBdID09IChieXRlKSAweDg5Ci0gICAgICAgICAgICAgICAgJiYgaW5wdXRbMV0gPT0gJ1AnICYmIGlucHV0WzJdID09ICdOJyAmJiBpbnB1dFszXSA9PSAnRycpIHsKLSAgICAgICAgICAgIC8vIE5vdGU6IHZDYXJkIDIuMSBvZmZpY2lhbGx5IGRvZXMgbm90IHN1cHBvcnQgUE5HLCBidXQgd2UgbWF5IGhhdmUgaXQgYW5kCi0gICAgICAgICAgICAvLyAgICAgICB1c2luZyBYLSB3b3JkIGxpa2UgIlgtUE5HIiBtYXkgbm90IGxldCBpbXBvcnRlcnMga25vdyBpdCBpcyBQTkcuCi0gICAgICAgICAgICAvLyAgICAgICBTbyB3ZSB1c2UgdGhlIFN0cmluZyAiUE5HIiBhcyBpcy4uLgotICAgICAgICAgICAgcmV0dXJuICJQTkciOwotICAgICAgICB9IGVsc2UgaWYgKGlucHV0Lmxlbmd0aCA+PSAyICYmIGlucHV0WzBdID09IChieXRlKSAweGZmCi0gICAgICAgICAgICAgICAgJiYgaW5wdXRbMV0gPT0gKGJ5dGUpIDB4ZDgpIHsKLSAgICAgICAgICAgIHJldHVybiAiSlBFRyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVHJ1ZSB3aGVuIGFsbCB0aGUgZ2l2ZW4gdmFsdWVzIGFyZSBudWxsIG9yIGVtcHR5IFN0cmluZ3MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFyZUFsbEVtcHR5KGZpbmFsIFN0cmluZy4uLnZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vLy8gVGhlIG1ldGhvZHMgYmVsbG93IG1heSBiZSB1c2VkIGJ5IHVuaXQgdGVzdC4KLQotICAgIC8qKgotICAgICAqIFVucXVvdGVzIGdpdmVuIFF1b3RlZC1QcmludGFibGUgdmFsdWUuIHZhbHVlIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyc2VRdW90ZWRQcmludGFibGUoCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc3RyaWN0TGluZUJyZWFraW5nLAotICAgICAgICAgICAgU3RyaW5nIHNvdXJjZUNoYXJzZXQsIFN0cmluZyB0YXJnZXRDaGFyc2V0KSB7Ci0gICAgICAgIC8vICI9ICIgLT4gIiAiLCAiPVx0IiAtPiAiXHQiLgotICAgICAgICAvLyBQcmV2aW91cyBjb2RlIGhhZCBkb25lIHRoaXMgcmVwbGFjZW1lbnQuIEtlZXAgb24gdGhlIHNhZmUgc2lkZS4KLSAgICAgICAgZmluYWwgU3RyaW5nIHF1b3RlZFByaW50YWJsZTsKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjaGFyIGNoID0gdmFsdWUuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPScgJiYgaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBuZXh0Q2ggPSB2YWx1ZS5jaGFyQXQoaSArIDEpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoID09ICcgJyB8fCBuZXh0Q2ggPT0gJ1x0JykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobmV4dENoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHF1b3RlZFByaW50YWJsZSA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGxpbmVzOwotICAgICAgICBpZiAoc3RyaWN0TGluZUJyZWFraW5nKSB7Ci0gICAgICAgICAgICBsaW5lcyA9IHF1b3RlZFByaW50YWJsZS5zcGxpdCgiXHJcbiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBxdW90ZWRQcmludGFibGUubGVuZ3RoKCk7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBjaCA9IHF1b3RlZFByaW50YWJsZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbmV4dENoID0gcXVvdGVkUHJpbnRhYmxlLmNoYXJBdChpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhc3RMaW5lID0gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgaWYgKGxhc3RMaW5lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKGxhc3RMaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxpbmVzID0gbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxpbmVzKSB7Ci0gICAgICAgICAgICBpZiAobGluZS5lbmRzV2l0aCgiPSIpKSB7Ci0gICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd1N0cmluZyA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJhd1N0cmluZykpIHsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJHaXZlbiByYXcgc3RyaW5nIGlzIGVtcHR5LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYnl0ZVtdIHJhd0J5dGVzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJhd0J5dGVzID0gcmF3U3RyaW5nLmdldEJ5dGVzKHNvdXJjZUNoYXJzZXQpOyAKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRmFpbGVkIHRvIGRlY29kZTogIiArIHNvdXJjZUNoYXJzZXQpOwotICAgICAgICAgICAgcmF3Qnl0ZXMgPSByYXdTdHJpbmcuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ5dGVbXSBkZWNvZGVkQnl0ZXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGVjb2RlZEJ5dGVzID0gUXVvdGVkUHJpbnRhYmxlQ29kZWMuZGVjb2RlUXVvdGVkUHJpbnRhYmxlKHJhd0J5dGVzKTsKLSAgICAgICAgfSBjYXRjaCAoRGVjb2RlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRGVjb2RlckV4Y2VwdGlvbiBpcyB0aHJvd24uIik7Ci0gICAgICAgICAgICBkZWNvZGVkQnl0ZXMgPSByYXdCeXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhkZWNvZGVkQnl0ZXMsIHRhcmdldENoYXJzZXQpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJGYWlsZWQgdG8gZW5jb2RlOiBjaGFyc2V0PSIgKyB0YXJnZXRDaGFyc2V0KTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGRlY29kZWRCeXRlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZDYXJkUGFyc2VyIGdldEFwcHJvcHJpYXRlUGFyc2VyKGludCB2Y2FyZFR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMjEodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBWQ2FyZFBhcnNlcl9WMjEoKTsKLSAgICAgICAgfSBlbHNlIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMCh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFZDYXJkUGFyc2VyX1YzMCgpOwotICAgICAgICB9IGVsc2UgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjQwKHZjYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVkNhcmRQYXJzZXJfVjQwKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlZlcnNpb24gaXMgbm90IHNwZWNpZmllZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29udmVydFN0cmluZ0NoYXJzZXQoCi0gICAgICAgICAgICBTdHJpbmcgb3JpZ2luYWxTdHJpbmcsIFN0cmluZyBzb3VyY2VDaGFyc2V0LCBTdHJpbmcgdGFyZ2V0Q2hhcnNldCkgewotICAgICAgICBpZiAoc291cmNlQ2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKHRhcmdldENoYXJzZXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxTdHJpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKHNvdXJjZUNoYXJzZXQpOwotICAgICAgICBmaW5hbCBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBjaGFyc2V0LmVuY29kZShvcmlnaW5hbFN0cmluZyk7Ci0gICAgICAgIC8vIGJ5dGVCdWZmZXIuYXJyYXkoKSAibWF5IiByZXR1cm4gYnl0ZSBhcnJheSB3aGljaCBpcyBsYXJnZXIgdGhhbgotICAgICAgICAvLyBieXRlQnVmZmVyLnJlbWFpbmluZygpLiBIZXJlLCB3ZSBrZWVwIG9uIHRoZSBzYWZlIHNpZGUuCi0gICAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2J5dGVCdWZmZXIucmVtYWluaW5nKCldOwotICAgICAgICBieXRlQnVmZmVyLmdldChieXRlcyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgdGFyZ2V0Q2hhcnNldCk7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBlbmNvZGU6IGNoYXJzZXQ9IiArIHRhcmdldENoYXJzZXQpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUT0RPOiB1dGlsaXRpZXMgZm9yIHZDYXJkIDQuMDogZGF0ZXRpbWUsIHRpbWVzdGFtcCwgaW50ZWdlciwgZmxvYXQsIGFuZCBib29sZWFuCi0KLSAgICBwcml2YXRlIFZDYXJkVXRpbHMoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyYzdkZi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBWQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4dGVuZHMgVkNhcmROb3RTdXBwb3J0ZWRFeGNlcHRpb24gewotICAgIHB1YmxpYyBWQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1NzIxOS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVkNhcmRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgVkNhcmRFeGNlcHRpb24gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFZDYXJkRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBWQ2FyZEV4Y2VwdGlvbiBvYmplY3QKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFZDYXJkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2RiNjJjLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaHJvd24gd2hlbiB0aGUgdkNhcmQgaGFzIHNvbWUgbGluZSBzdGFydGluZyB3aXRoICcjJy4gSW4gdGhlIHNwZWNpZmljYXRpb24sCi0gKiBib3RoIHZDYXJkIDIuMSBhbmQgdkNhcmQgMy4wIGRvZXMgbm90IGFsbG93IHN1Y2ggbGluZSwgYnV0IHNvbWUgYWN0dWFsIGV4cG9ydGVyIGVtaXQKLSAqIHN1Y2ggbGluZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbiBleHRlbmRzIFZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24gewotICAgIHB1YmxpYyBWQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwNTg0Yi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb247Ci0KLS8qKgotICogVGhyb3duIHdoZW4gdGhlIHZDYXJkIGhhcyBzb21lIGxpbmUgc3RhcnRpbmcgd2l0aCAnIycuIEluIHRoZSBzcGVjaWZpY2F0aW9uLAotICogYm90aCB2Q2FyZCAyLjEgYW5kIHZDYXJkIDMuMCBkb2VzIG5vdCBhbGxvdyBzdWNoIGxpbmUsIGJ1dCBzb21lIGFjdHVhbCBleHBvcnRlciBlbWl0Ci0gKiBzdWNoIGxpbmVzLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbiBleHRlbmRzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTmVzdGVkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTmVzdGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwM2MyZmIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZE5lc3RlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi0vKioKLSAqIFZDYXJkRXhjZXB0aW9uIHRocm93biB3aGVuIFZDYXJkIGlzIG5lc3RlZCB3aXRob3V0IFZDYXJkUGFyc2VyJ3MgYmVpbmcgbm90aWZpZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZE5lc3RlZEV4Y2VwdGlvbiBleHRlbmRzIFZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgVkNhcmROZXN0ZWRFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIHB1YmxpYyBWQ2FyZE5lc3RlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNmFhNzc2My4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi0vKioKLSAqIFRoZSBleGNlcHRpb24gd2hpY2ggdGVsbHMgdGhhdCB0aGUgaW5wdXQgVkNhcmQgaXMgcHJvYmFibHkgdmFsaWQgZnJvbSB0aGUgdmlldyBvZgotICogc3BlY2lmaWNhdGlvbiBidXQgbm90IHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCBmcmFtZXdvcmsgZm9yIG5vdy4KLSAqIAotICogVGhpcyBpcyBhIGtpbmQgb2YgYSBnb29kIG5ld3MgZnJvbSB0aGUgdmlldyBvZiBkZXZlbG9wbWVudC4KLSAqIEl0IG1heSBiZSBnb29kIHRvIGFzayB1c2VycyB0byBzZW5kIGEgcmVwb3J0IHdpdGggdGhlIFZDYXJkIGV4YW1wbGUKLSAqIGZvciB0aGUgZnV0dXJlIGRldmVsb3BtZW50LgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmROb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXh0ZW5kcyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICBwdWJsaWMgVkNhcmROb3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRWZXJzaW9uRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkVmVyc2lvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzA5ZmU0Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRWZXJzaW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi0vKioKLSAqIFZDYXJkRXhjZXB0aW9uIHVzZWQgb25seSB3aGVuIHRoZSB2ZXJzaW9uIG9mIHRoZSB2Q2FyZCBpcyBkaWZmZXJlbnQuIAotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRWZXJzaW9uRXhjZXB0aW9uIGV4dGVuZHMgVkNhcmRFeGNlcHRpb24gewotICAgIHB1YmxpYyBWQ2FyZFZlcnNpb25FeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIHB1YmxpYyBWQ2FyZFZlcnNpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9wYWNrYWdlLmh0bWwgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiOGEzMi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPEhUTUw+Ci08Qk9EWT4KLXtAaGlkZX0KLTwvQk9EWT4KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvcGFja2FnZS5odG1sIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiOGEzMi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08SFRNTD4KLTxCT0RZPgote0BoaWRlfQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkNTU1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL011bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDI3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5wcmVmZXJlbmNlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2cuQnVpbGRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSB7QGxpbmsgUHJlZmVyZW5jZX0gdGhhdCBkaXNwbGF5cyBhIGxpc3Qgb2YgZW50cmllcyBhcworICogYSBkaWFsb2cuCisgKiA8cD4KKyAqIFRoaXMgcHJlZmVyZW5jZSB3aWxsIHN0b3JlIGEgc2V0IG9mIHN0cmluZ3MgaW50byB0aGUgU2hhcmVkUHJlZmVyZW5jZXMuCisgKiBUaGlzIHNldCB3aWxsIGNvbnRhaW4gb25lIG9yIG1vcmUgdmFsdWVzIGZyb20gdGhlCisgKiB7QGxpbmsgI3NldEVudHJ5VmFsdWVzKENoYXJTZXF1ZW5jZVtdKX0gYXJyYXkuCisgKiAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI011bHRpU2VsZWN0TGlzdFByZWZlcmVuY2VfZW50cmllcworICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZV9lbnRyeVZhbHVlcworICovCitwdWJsaWMgY2xhc3MgTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSBleHRlbmRzIERpYWxvZ1ByZWZlcmVuY2UgeworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlW10gbUVudHJpZXM7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2VbXSBtRW50cnlWYWx1ZXM7CisgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtVmFsdWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbU5ld1ZhbHVlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVByZWZlcmVuY2VDaGFuZ2VkOworICAgIAorICAgIHB1YmxpYyBNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlLCAwLCAwKTsKKyAgICAgICAgbUVudHJpZXMgPSBhLmdldFRleHRBcnJheShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlX2VudHJpZXMpOworICAgICAgICBtRW50cnlWYWx1ZXMgPSBhLmdldFRleHRBcnJheShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlX2VudHJ5VmFsdWVzKTsKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlKENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBodW1hbi1yZWFkYWJsZSBlbnRyaWVzIHRvIGJlIHNob3duIGluIHRoZSBsaXN0LiBUaGlzIHdpbGwgYmUKKyAgICAgKiBzaG93biBpbiBzdWJzZXF1ZW50IGRpYWxvZ3MuCisgICAgICogPHA+CisgICAgICogRWFjaCBlbnRyeSBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIGluZGV4IGluCisgICAgICoge0BsaW5rICNzZXRFbnRyeVZhbHVlcyhDaGFyU2VxdWVuY2VbXSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbnRyaWVzIFRoZSBlbnRyaWVzLgorICAgICAqIEBzZWUgI3NldEVudHJ5VmFsdWVzKENoYXJTZXF1ZW5jZVtdKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudHJpZXMoQ2hhclNlcXVlbmNlW10gZW50cmllcykgeworICAgICAgICBtRW50cmllcyA9IGVudHJpZXM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBzZWUgI3NldEVudHJpZXMoQ2hhclNlcXVlbmNlW10pCisgICAgICogQHBhcmFtIGVudHJpZXNSZXNJZCBUaGUgZW50cmllcyBhcnJheSBhcyBhIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudHJpZXMoaW50IGVudHJpZXNSZXNJZCkgeworICAgICAgICBzZXRFbnRyaWVzKGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXRUZXh0QXJyYXkoZW50cmllc1Jlc0lkKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBsaXN0IG9mIGVudHJpZXMgdG8gYmUgc2hvd24gaW4gdGhlIGxpc3QgaW4gc3Vic2VxdWVudCBkaWFsb2dzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIGxpc3QgYXMgYW4gYXJyYXkuCisgICAgICovCisgICAgcHVibGljIENoYXJTZXF1ZW5jZVtdIGdldEVudHJpZXMoKSB7CisgICAgICAgIHJldHVybiBtRW50cmllczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGFycmF5IHRvIGZpbmQgdGhlIHZhbHVlIHRvIHNhdmUgZm9yIGEgcHJlZmVyZW5jZSB3aGVuIGFuIGVudHJ5IGZyb20KKyAgICAgKiBlbnRyaWVzIGlzIHNlbGVjdGVkLiBJZiBhIHVzZXIgY2xpY2tzIG9uIHRoZSBzZWNvbmQgaXRlbSBpbiBlbnRyaWVzLCB0aGUKKyAgICAgKiBzZWNvbmQgaXRlbSBpbiB0aGlzIGFycmF5IHdpbGwgYmUgc2F2ZWQgdG8gdGhlIHByZWZlcmVuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGVudHJ5VmFsdWVzIFRoZSBhcnJheSB0byBiZSB1c2VkIGFzIHZhbHVlcyB0byBzYXZlIGZvciB0aGUgcHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbnRyeVZhbHVlcyhDaGFyU2VxdWVuY2VbXSBlbnRyeVZhbHVlcykgeworICAgICAgICBtRW50cnlWYWx1ZXMgPSBlbnRyeVZhbHVlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlICNzZXRFbnRyeVZhbHVlcyhDaGFyU2VxdWVuY2VbXSkKKyAgICAgKiBAcGFyYW0gZW50cnlWYWx1ZXNSZXNJZCBUaGUgZW50cnkgdmFsdWVzIGFycmF5IGFzIGEgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW50cnlWYWx1ZXMoaW50IGVudHJ5VmFsdWVzUmVzSWQpIHsKKyAgICAgICAgc2V0RW50cnlWYWx1ZXMoZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldFRleHRBcnJheShlbnRyeVZhbHVlc1Jlc0lkKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHZhbHVlcyB0byBiZSBzYXZlZCBmb3IgdGhlIHByZWZlcmVuY2UuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgYXJyYXkgb2YgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2VbXSBnZXRFbnRyeVZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIG1FbnRyeVZhbHVlczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGtleS4gVGhpcyBzaG91bGQgY29udGFpbiBlbnRyaWVzIGluCisgICAgICoge0BsaW5rICNnZXRFbnRyeVZhbHVlcygpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gc2V0IGZvciB0aGUga2V5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlcyhTZXQ8U3RyaW5nPiB2YWx1ZXMpIHsKKyAgICAgICAgbVZhbHVlcyA9IHZhbHVlczsKKyAgICAgICAgCisgICAgICAgIHBlcnNpc3RTdHJpbmdTZXQodmFsdWVzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBrZXkuCisgICAgICovCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZXM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiB2YWx1ZSAoaW4gdGhlIGVudHJ5IHZhbHVlcyBhcnJheSkuCisgICAgICogCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB3aG9zZSBpbmRleCBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIHZhbHVlLCBvciAtMSBpZiBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIGludCBmaW5kSW5kZXhPZlZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiBtRW50cnlWYWx1ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1FbnRyeVZhbHVlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIGlmIChtRW50cnlWYWx1ZXNbaV0uZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblByZXBhcmVEaWFsb2dCdWlsZGVyKEJ1aWxkZXIgYnVpbGRlcikgeworICAgICAgICBzdXBlci5vblByZXBhcmVEaWFsb2dCdWlsZGVyKGJ1aWxkZXIpOworICAgICAgICAKKyAgICAgICAgaWYgKG1FbnRyaWVzID09IG51bGwgfHwgbUVudHJ5VmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIHJlcXVpcmVzIGFuIGVudHJpZXMgYXJyYXkgYW5kICIgKworICAgICAgICAgICAgICAgICAgICAiYW4gZW50cnlWYWx1ZXMgYXJyYXkuIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJvb2xlYW5bXSBjaGVja2VkSXRlbXMgPSBnZXRTZWxlY3RlZEl0ZW1zKCk7CisgICAgICAgIGJ1aWxkZXIuc2V0TXVsdGlDaG9pY2VJdGVtcyhtRW50cmllcywgY2hlY2tlZEl0ZW1zLAorICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25NdWx0aUNob2ljZUNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoLCBib29sZWFuIGlzQ2hlY2tlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2hlY2tlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVmZXJlbmNlQ2hhbmdlZCB8PSBtTmV3VmFsdWVzLmFkZChtRW50cmllc1t3aGljaF0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVmZXJlbmNlQ2hhbmdlZCB8PSBtTmV3VmFsdWVzLnJlbW92ZShtRW50cmllc1t3aGljaF0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgbU5ld1ZhbHVlcy5jbGVhcigpOworICAgICAgICBtTmV3VmFsdWVzLmFkZEFsbChtVmFsdWVzKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBib29sZWFuW10gZ2V0U2VsZWN0ZWRJdGVtcygpIHsKKyAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlW10gZW50cmllcyA9IG1FbnRyaWVzOworICAgICAgICBmaW5hbCBpbnQgZW50cnlDb3VudCA9IGVudHJpZXMubGVuZ3RoOworICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiB2YWx1ZXMgPSBtVmFsdWVzOworICAgICAgICBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bZW50cnlDb3VudF07CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJ5Q291bnQ7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0W2ldID0gdmFsdWVzLmNvbnRhaW5zKGVudHJpZXNbaV0udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGlhbG9nQ2xvc2VkKGJvb2xlYW4gcG9zaXRpdmVSZXN1bHQpIHsKKyAgICAgICAgc3VwZXIub25EaWFsb2dDbG9zZWQocG9zaXRpdmVSZXN1bHQpOworICAgICAgICAKKyAgICAgICAgaWYgKHBvc2l0aXZlUmVzdWx0ICYmIG1QcmVmZXJlbmNlQ2hhbmdlZCkgeworICAgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gdmFsdWVzID0gbU5ld1ZhbHVlczsKKyAgICAgICAgICAgIGlmIChjYWxsQ2hhbmdlTGlzdGVuZXIodmFsdWVzKSkgeworICAgICAgICAgICAgICAgIHNldFZhbHVlcyh2YWx1ZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1QcmVmZXJlbmNlQ2hhbmdlZCA9IGZhbHNlOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IG9uR2V0RGVmYXVsdFZhbHVlKFR5cGVkQXJyYXkgYSwgaW50IGluZGV4KSB7CisgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZVtdIGRlZmF1bHRWYWx1ZXMgPSBhLmdldFRleHRBcnJheShpbmRleCk7CisgICAgICAgIGZpbmFsIGludCB2YWx1ZUNvdW50ID0gZGVmYXVsdFZhbHVlcy5sZW5ndGg7CisgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHQuYWRkKGRlZmF1bHRWYWx1ZXNbaV0udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uU2V0SW5pdGlhbFZhbHVlKGJvb2xlYW4gcmVzdG9yZVZhbHVlLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHNldFZhbHVlcyhyZXN0b3JlVmFsdWUgPyBnZXRQZXJzaXN0ZWRTdHJpbmdTZXQobVZhbHVlcykgOiAoU2V0PFN0cmluZz4pIGRlZmF1bHRWYWx1ZSk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBQYXJjZWxhYmxlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKSB7CisgICAgICAgIGZpbmFsIFBhcmNlbGFibGUgc3VwZXJTdGF0ZSA9IHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUoKTsKKyAgICAgICAgaWYgKGlzUGVyc2lzdGVudCgpKSB7CisgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHNhdmUgaW5zdGFuY2Ugc3RhdGUKKyAgICAgICAgICAgIHJldHVybiBzdXBlclN0YXRlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmaW5hbCBTYXZlZFN0YXRlIG15U3RhdGUgPSBuZXcgU2F2ZWRTdGF0ZShzdXBlclN0YXRlKTsKKyAgICAgICAgbXlTdGF0ZS52YWx1ZXMgPSBnZXRWYWx1ZXMoKTsKKyAgICAgICAgcmV0dXJuIG15U3RhdGU7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNhdmVkU3RhdGUgZXh0ZW5kcyBCYXNlU2F2ZWRTdGF0ZSB7CisgICAgICAgIFNldDxTdHJpbmc+IHZhbHVlczsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlKFBhcmNlbCBzb3VyY2UpIHsKKyAgICAgICAgICAgIHN1cGVyKHNvdXJjZSk7CisgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgICAgICBTdHJpbmdbXSBzdHJpbmdzID0gc291cmNlLnJlYWRTdHJpbmdBcnJheSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmaW5hbCBpbnQgc3RyaW5nQ291bnQgPSBzdHJpbmdzLmxlbmd0aDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQoc3RyaW5nc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlKFBhcmNlbGFibGUgc3VwZXJTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIoc3VwZXJTdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIHN1cGVyLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZ0FycmF5KHZhbHVlcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUiA9CisgICAgICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlKGluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZVtzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZS5qYXZhCmluZGV4IGRkZTY0OTMuLjE3YjJlODIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZS5qYXZhCkBAIC0xNiw4ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5wcmVmZXJlbmNlOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkNoYXJTZXF1ZW5jZXM7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwpAQCAtMjgsNyArMjcsNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5DaGFyU2VxdWVuY2VzOwogaW1wb3J0IGFuZHJvaWQudmlldy5BYnNTYXZlZFN0YXRlOwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKQEAgLTM2LDYgKzM0LDEwIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKIC8qKgogICogUmVwcmVzZW50cyB0aGUgYmFzaWMgUHJlZmVyZW5jZSBVSSBidWlsZGluZwogICogYmxvY2sgZGlzcGxheWVkIGJ5IGEge0BsaW5rIFByZWZlcmVuY2VBY3Rpdml0eX0gaW4gdGhlIGZvcm0gb2YgYQpAQCAtNTQsNiArNTYsNyBAQAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZV90aXRsZQogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZV9zdW1tYXJ5CiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlX29yZGVyCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlX2ZyYWdtZW50CiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlX2xheW91dAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZV93aWRnZXRMYXlvdXQKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ByZWZlcmVuY2VfZW5hYmxlZApAQCAtODYsNiArODksOCBAQAogICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1TdW1tYXJ5OwogICAgIHByaXZhdGUgU3RyaW5nIG1LZXk7CiAgICAgcHJpdmF0ZSBJbnRlbnQgbUludGVudDsKKyAgICBwcml2YXRlIFN0cmluZyBtRnJhZ21lbnQ7CisgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKICAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZWQgPSB0cnVlOwogICAgIHByaXZhdGUgYm9vbGVhbiBtU2VsZWN0YWJsZSA9IHRydWU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1SZXF1aXJlc0tleTsKQEAgLTIwOCw2ICsyMTMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgbU9yZGVyID0gYS5nZXRJbnQoYXR0ciwgbU9yZGVyKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgICAgICAgICBjYXNlIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByZWZlcmVuY2VfZnJhZ21lbnQ6CisgICAgICAgICAgICAgICAgICAgIG1GcmFnbWVudCA9IGEuZ2V0U3RyaW5nKGF0dHIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgICAgIGNhc2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJlZmVyZW5jZV9sYXlvdXQ6CiAgICAgICAgICAgICAgICAgICAgIG1MYXlvdXRSZXNJZCA9IGEuZ2V0UmVzb3VyY2VJZChhdHRyLCBtTGF5b3V0UmVzSWQpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTMxMyw2ICszMjIsNDQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjbGFzcyBuYW1lIG9mIGEgZnJhZ21lbnQgdG8gYmUgc2hvd24gd2hlbiB0aGlzIFByZWZlcmVuY2UgaXMgY2xpY2tlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgZnJhZ21lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGcmFnbWVudChTdHJpbmcgZnJhZ21lbnQpIHsKKyAgICAgICAgbUZyYWdtZW50ID0gZnJhZ21lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmcmFnbWVudCBjbGFzcyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFByZWZlcmVuY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBmcmFnbWVudCBjbGFzcyBuYW1lIGxhc3Qgc2V0IHZpYSB7QGxpbmsgI3NldEZyYWdtZW50fSBvciBYTUwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGcmFnbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGV4dHJhcyBCdW5kbGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByZWZlcmVuY2UsIGNyZWF0aW5nCisgICAgICogYSBuZXcgQnVuZGxlIGlmIHRoZXJlIGN1cnJlbnRseSBpc24ndCBvbmUuICBZb3UgY2FuIHVzZSB0aGlzIHRvIGdldCBhbmQKKyAgICAgKiBzZXQgaW5kaXZpZHVhbCBleHRyYSBrZXkvdmFsdWUgcGFpcnMuCisgICAgICovCisgICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7CisgICAgICAgIGlmIChtRXh0cmFzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1FeHRyYXMgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1FeHRyYXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBleHRyYXMgQnVuZGxlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcmVmZXJlbmNlLAorICAgICAqIHJldHVybmluZyBudWxsIGlmIHRoZXJlIGlzIG5vdCBjdXJyZW50bHkgb25lLgorICAgICAqLworICAgIHB1YmxpYyBCdW5kbGUgcGVla0V4dHJhcygpIHsKKyAgICAgICAgcmV0dXJuIG1FeHRyYXM7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbGF5b3V0IHJlc291cmNlIHRoYXQgaXMgaW5mbGF0ZWQgYXMgdGhlIHtAbGluayBWaWV3fSB0byBiZSBzaG93bgogICAgICAqIGZvciB0aGlzIFByZWZlcmVuY2UuIEluIG1vc3QgY2FzZXMsIHRoZSBkZWZhdWx0IGxheW91dCBpcyBzdWZmaWNpZW50IGZvcgogICAgICAqIGN1c3RvbSBQcmVmZXJlbmNlIG9iamVjdHMgYW5kIG9ubHkgdGhlIHdpZGdldCBsYXlvdXQgbmVlZHMgdG8gYmUgY2hhbmdlZC4KQEAgLTEyNTAsNiArMTI5Nyw2MSBAQAogICAgIH0KICAgICAKICAgICAvKioKKyAgICAgKiBBdHRlbXB0cyB0byBwZXJzaXN0IGEgc2V0IG9mIFN0cmluZ3MgdG8gdGhlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXN9LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgd2lsbCBjaGVjayBpZiB0aGlzIFByZWZlcmVuY2UgaXMgcGVyc2lzdGVudCwgZ2V0IGFuIGVkaXRvciBmcm9tCisgICAgICogdGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0sIHB1dCBpbiB0aGUgc3RyaW5ncywgYW5kIGNoZWNrIGlmIHdlIHNob3VsZCBjb21taXQgKGFuZAorICAgICAqIGNvbW1pdCBpZiBzbykuCisgICAgICogCisgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIHRvIHBlcnNpc3QuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBQcmVmZXJlbmNlIGlzIHBlcnNpc3RlbnQuIChUaGlzIGlzIG5vdCB3aGV0aGVyIHRoZQorICAgICAqICAgICAgICAgdmFsdWUgd2FzIHBlcnNpc3RlZCwgc2luY2Ugd2UgbWF5IG5vdCBuZWNlc3NhcmlseSBjb21taXQgaWYgdGhlcmUKKyAgICAgKiAgICAgICAgIHdpbGwgYmUgYSBiYXRjaCBjb21taXQgbGF0ZXIuKQorICAgICAqIEBzZWUgI2dldFBlcnNpc3RlZFN0cmluZyhTZXQpCisgICAgICogCisgICAgICogQGhpZGUgUGVuZGluZyBBUEkgYXBwcm92YWwKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwZXJzaXN0U3RyaW5nU2V0KFNldDxTdHJpbmc+IHZhbHVlcykgeworICAgICAgICBpZiAoc2hvdWxkUGVyc2lzdCgpKSB7CisgICAgICAgICAgICAvLyBTaG91bGRuJ3Qgc3RvcmUgbnVsbAorICAgICAgICAgICAgaWYgKHZhbHVlcy5lcXVhbHMoZ2V0UGVyc2lzdGVkU3RyaW5nU2V0KG51bGwpKSkgeworICAgICAgICAgICAgICAgIC8vIEl0J3MgYWxyZWFkeSB0aGVyZSwgc28gdGhlIHNhbWUgYXMgcGVyc2lzdGluZworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBTaGFyZWRQcmVmZXJlbmNlcy5FZGl0b3IgZWRpdG9yID0gbVByZWZlcmVuY2VNYW5hZ2VyLmdldEVkaXRvcigpOworICAgICAgICAgICAgZWRpdG9yLnB1dFN0cmluZ1NldChtS2V5LCB2YWx1ZXMpOworICAgICAgICAgICAgdHJ5Q29tbWl0KGVkaXRvcik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0ZW1wdHMgdG8gZ2V0IGEgcGVyc2lzdGVkIHNldCBvZiBTdHJpbmdzIGZyb20gdGhlCisgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlc30uCisgICAgICogPHA+CisgICAgICogVGhpcyB3aWxsIGNoZWNrIGlmIHRoaXMgUHJlZmVyZW5jZSBpcyBwZXJzaXN0ZW50LCBnZXQgdGhlIFNoYXJlZFByZWZlcmVuY2VzCisgICAgICogZnJvbSB0aGUge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyfSwgYW5kIGdldCB0aGUgdmFsdWUuCisgICAgICogCisgICAgICogQHBhcmFtIGRlZmF1bHRSZXR1cm5WYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gaWYgZWl0aGVyIHRoZQorICAgICAqICAgICAgICAgICAgUHJlZmVyZW5jZSBpcyBub3QgcGVyc2lzdGVudCBvciB0aGUgUHJlZmVyZW5jZSBpcyBub3QgaW4gdGhlCisgICAgICogICAgICAgICAgICBzaGFyZWQgcHJlZmVyZW5jZXMuCisgICAgICogQHJldHVybiBUaGUgdmFsdWUgZnJvbSB0aGUgU2hhcmVkUHJlZmVyZW5jZXMgb3IgdGhlIGRlZmF1bHQgcmV0dXJuCisgICAgICogICAgICAgICB2YWx1ZS4KKyAgICAgKiBAc2VlICNwZXJzaXN0U3RyaW5nU2V0KFNldCkKKyAgICAgKiAKKyAgICAgKiBAaGlkZSBQZW5kaW5nIEFQSSBhcHByb3ZhbAorICAgICAqLworICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBnZXRQZXJzaXN0ZWRTdHJpbmdTZXQoU2V0PFN0cmluZz4gZGVmYXVsdFJldHVyblZhbHVlKSB7CisgICAgICAgIGlmICghc2hvdWxkUGVyc2lzdCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFJldHVyblZhbHVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gbVByZWZlcmVuY2VNYW5hZ2VyLmdldFNoYXJlZFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nU2V0KG1LZXksIGRlZmF1bHRSZXR1cm5WYWx1ZSk7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIEF0dGVtcHRzIHRvIHBlcnNpc3QgYW4gaW50IHRvIHRoZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHBlcnNpc3QuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VBY3Rpdml0eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlQWN0aXZpdHkuamF2YQppbmRleCA3MjY3OTNkLi5hNTliMmY4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VBY3Rpdml0eS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUFjdGl2aXR5LmphdmEKQEAgLTE2LDEzNSArMTYsNzc4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5wcmVmZXJlbmNlOwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5YbWxVdGlsczsKKworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50QnJlYWRDcnVtYnM7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbjsKIGltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqCi0gKiBTaG93cyBhIGhpZXJhcmNoeSBvZiB7QGxpbmsgUHJlZmVyZW5jZX0gb2JqZWN0cyBhcwotICogbGlzdHMsIHBvc3NpYmx5IHNwYW5uaW5nIG11bHRpcGxlIHNjcmVlbnMuIFRoZXNlIHByZWZlcmVuY2VzIHdpbGwKLSAqIGF1dG9tYXRpY2FsbHkgc2F2ZSB0byB7QGxpbmsgU2hhcmVkUHJlZmVyZW5jZXN9IGFzIHRoZSB1c2VyIGludGVyYWN0cyB3aXRoCi0gKiB0aGVtLiBUbyByZXRyaWV2ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU2hhcmVkUHJlZmVyZW5jZXN9IHRoYXQgdGhlCi0gKiBwcmVmZXJlbmNlIGhpZXJhcmNoeSBpbiB0aGlzIGFjdGl2aXR5IHdpbGwgdXNlLCBjYWxsCi0gKiB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXIjZ2V0RGVmYXVsdFNoYXJlZFByZWZlcmVuY2VzKGFuZHJvaWQuY29udGVudC5Db250ZXh0KX0KLSAqIHdpdGggYSBjb250ZXh0IGluIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhpcyBhY3Rpdml0eS4KLSAqIDxwPgotICogRnVydGhlcm1vcmUsIHRoZSBwcmVmZXJlbmNlcyBzaG93biB3aWxsIGZvbGxvdyB0aGUgdmlzdWFsIHN0eWxlIG9mIHN5c3RlbQotICogcHJlZmVyZW5jZXMuIEl0IGlzIGVhc3kgdG8gY3JlYXRlIGEgaGllcmFyY2h5IG9mIHByZWZlcmVuY2VzICh0aGF0IGNhbiBiZQotICogc2hvd24gb24gbXVsdGlwbGUgc2NyZWVucykgdmlhIFhNTC4gRm9yIHRoZXNlIHJlYXNvbnMsIGl0IGlzIHJlY29tbWVuZGVkIHRvCi0gKiB1c2UgdGhpcyBhY3Rpdml0eSAoYXMgYSBzdXBlcmNsYXNzKSB0byBkZWFsIHdpdGggcHJlZmVyZW5jZXMgaW4gYXBwbGljYXRpb25zLgotICogPHA+Ci0gKiBBIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBvYmplY3Qgc2hvdWxkIGJlIGF0IHRoZSB0b3Agb2YgdGhlIHByZWZlcmVuY2UKLSAqIGhpZXJhcmNoeS4gRnVydGhlcm1vcmUsIHN1YnNlcXVlbnQge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IGluIHRoZSBoaWVyYXJjaHkKLSAqIGRlbm90ZSBhIHNjcmVlbiBicmVhay0tdGhhdCBpcyB0aGUgcHJlZmVyZW5jZXMgY29udGFpbmVkIHdpdGhpbiBzdWJzZXF1ZW50Ci0gKiB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gc2hvdWxkIGJlIHNob3duIG9uIGFub3RoZXIgc2NyZWVuLiBUaGUgcHJlZmVyZW5jZQotICogZnJhbWV3b3JrIGhhbmRsZXMgc2hvd2luZyB0aGVzZSBvdGhlciBzY3JlZW5zIGZyb20gdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5LgotICogPHA+Ci0gKiBUaGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkgY2FuIGJlIGZvcm1lZCBpbiBtdWx0aXBsZSB3YXlzOgotICogPGxpPiBGcm9tIGFuIFhNTCBmaWxlIHNwZWNpZnlpbmcgdGhlIGhpZXJhcmNoeQotICogPGxpPiBGcm9tIGRpZmZlcmVudCB7QGxpbmsgQWN0aXZpdHkgQWN0aXZpdGllc30gdGhhdCBlYWNoIHNwZWNpZnkgaXRzIG93bgotICogcHJlZmVyZW5jZXMgaW4gYW4gWE1MIGZpbGUgdmlhIHtAbGluayBBY3Rpdml0eX0gbWV0YS1kYXRhCi0gKiA8bGk+IEZyb20gYW4gb2JqZWN0IGhpZXJhcmNoeSByb290ZWQgd2l0aCB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0KLSAqIDxwPgotICogVG8gaW5mbGF0ZSBmcm9tIFhNTCwgdXNlIHRoZSB7QGxpbmsgI2FkZFByZWZlcmVuY2VzRnJvbVJlc291cmNlKGludCl9LiBUaGUKLSAqIHJvb3QgZWxlbWVudCBzaG91bGQgYmUgYSB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0uIFN1YnNlcXVlbnQgZWxlbWVudHMgY2FuIHBvaW50Ci0gKiB0byBhY3R1YWwge0BsaW5rIFByZWZlcmVuY2V9IHN1YmNsYXNzZXMuIEFzIG1lbnRpb25lZCBhYm92ZSwgc3Vic2VxdWVudAotICoge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IGluIHRoZSBoaWVyYXJjaHkgd2lsbCByZXN1bHQgaW4gdGhlIHNjcmVlbiBicmVhay4KLSAqIDxwPgotICogVG8gc3BlY2lmeSBhbiB7QGxpbmsgSW50ZW50fSB0byBxdWVyeSB7QGxpbmsgQWN0aXZpdHkgQWN0aXZpdGllc30gdGhhdCBlYWNoCi0gKiBoYXZlIHByZWZlcmVuY2VzLCB1c2Uge0BsaW5rICNhZGRQcmVmZXJlbmNlc0Zyb21JbnRlbnR9LiBFYWNoCi0gKiB7QGxpbmsgQWN0aXZpdHl9IGNhbiBzcGVjaWZ5IG1ldGEtZGF0YSBpbiB0aGUgbWFuaWZlc3QgKHZpYSB0aGUga2V5Ci0gKiB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXIjTUVUQURBVEFfS0VZX1BSRUZFUkVOQ0VTfSkgdGhhdCBwb2ludHMgdG8gYW4gWE1MCi0gKiByZXNvdXJjZS4gVGhlc2UgWE1MIHJlc291cmNlcyB3aWxsIGJlIGluZmxhdGVkIGludG8gYSBzaW5nbGUgcHJlZmVyZW5jZQotICogaGllcmFyY2h5IGFuZCBzaG93biBieSB0aGlzIGFjdGl2aXR5LgotICogPHA+Ci0gKiBUbyBzcGVjaWZ5IGFuIG9iamVjdCBoaWVyYXJjaHkgcm9vdGVkIHdpdGgge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59LCB1c2UKLSAqIHtAbGluayAjc2V0UHJlZmVyZW5jZVNjcmVlbihQcmVmZXJlbmNlU2NyZWVuKX0uCi0gKiA8cD4KLSAqIEFzIGEgY29udmVuaWVuY2UsIHRoaXMgYWN0aXZpdHkgaW1wbGVtZW50cyBhIGNsaWNrIGxpc3RlbmVyIGZvciBhbnkKLSAqIHByZWZlcmVuY2UgaW4gdGhlIGN1cnJlbnQgaGllcmFyY2h5LCBzZWUKLSAqIHtAbGluayAjb25QcmVmZXJlbmNlVHJlZUNsaWNrKFByZWZlcmVuY2VTY3JlZW4sIFByZWZlcmVuY2UpfS4KLSAqIAotICogQHNlZSBQcmVmZXJlbmNlCi0gKiBAc2VlIFByZWZlcmVuY2VTY3JlZW4KKyAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFuIGFjdGl2aXR5IHRvIHNob3cgYSBoaWVyYXJjaHkgb2YgcHJlZmVyZW5jZXMKKyAqIHRvIHRoZSB1c2VyLiAgUHJpb3IgdG8ge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJ9CisgKiB0aGlzIGNsYXNzIG9ubHkgYWxsb3dlZCB0aGUgZGlzcGxheSBvZiBhIHNpbmdsZSBzZXQgb2YgcHJlZmVyZW5jZTsgdGhpcworICogZnVuY3Rpb25hbGl0eSBzaG91bGQgbm93IGJlIGZvdW5kIGluIHRoZSBuZXcge0BsaW5rIFByZWZlcmVuY2VGcmFnbWVudH0KKyAqIGNsYXNzLiAgSWYgeW91IGFyZSB1c2luZyBQcmVmZXJlbmNlQWN0aXZpdHkgaW4gaXRzIG9sZCBtb2RlLCB0aGUgZG9jdW1lbnRhdGlvbgorICogdGhlcmUgYXBwbGllcyB0byB0aGUgZGVwcmVjYXRlZCBBUElzIGhlcmUuCisgKgorICogPHA+VGhpcyBhY3Rpdml0eSBzaG93cyBvbmUgb3IgbW9yZSBoZWFkZXJzIG9mIHByZWZlcmVuY2VzLCBlYWNoIG9mIHdpdGgKKyAqIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHtAbGluayBQcmVmZXJlbmNlRnJhZ21lbnR9IHRvIGRpc3BsYXkgdGhlIHByZWZlcmVuY2VzCisgKiBvZiB0aGF0IGhlYWRlci4gIFRoZSBhY3R1YWwgbGF5b3V0IGFuZCBkaXNwbGF5IG9mIHRoZXNlIGFzc29jaWF0aW9ucyBjYW4KKyAqIGhvd2V2ZXIgdmFyeTsgY3VycmVudGx5IHRoZXJlIGFyZSB0d28gbWFqb3IgYXBwcm9hY2hlcyBpdCBtYXkgdGFrZToKKyAqCisgKiA8dWw+CisgKiA8bGk+T24gYSBzbWFsbCBzY3JlZW4gaXQgbWF5IGRpc3BsYXkgb25seSB0aGUgaGVhZGVycyBhcyBhIHNpbmdsZSBsaXN0CisgKiB3aGVuIGZpcnN0IGxhdW5jaGVkLiAgU2VsZWN0aW5nIG9uZSBvZiB0aGUgaGVhZGVyIGl0ZW1zIHdpbGwgcmUtbGF1bmNoCisgKiB0aGUgYWN0aXZpdHkgd2l0aCBpdCBvbmx5IHNob3dpbmcgdGhlIFByZWZlcmVuY2VGcmFnbWVudCBvZiB0aGF0IGhlYWRlci4KKyAqIDxsaT5PbiBhIGxhcmdlIHNjcmVlbiBpbiBtYXkgZGlzcGxheSBib3RoIHRoZSBoZWFkZXJzIGFuZCBjdXJyZW50CisgKiBQcmVmZXJlbmNlRnJhZ21lbnQgdG9nZXRoZXIgYXMgcGFuZXMuICBTZWxlY3RpbmcgYSBoZWFkZXIgaXRlbSBzd2l0Y2hlcworICogdG8gc2hvd2luZyB0aGUgY29ycmVjdCBQcmVmZXJlbmNlRnJhZ21lbnQgZm9yIHRoYXQgaXRlbS4KKyAqIDwvdWw+CisgKgorICogPHA+U3ViY2xhc3NlcyBvZiBQcmVmZXJlbmNlQWN0aXZpdHkgc2hvdWxkIGltcGxlbWVudAorICoge0BsaW5rICNvbkJ1aWxkSGVhZGVyc30gdG8gcG9wdWxhdGUgdGhlIGhlYWRlciBsaXN0IHdpdGggdGhlIGRlc2lyZWQKKyAqIGl0ZW1zLiAgRG9pbmcgdGhpcyBpbXBsaWNpdGx5IHN3aXRjaGVzIHRoZSBjbGFzcyBpbnRvIGl0cyBuZXcgImhlYWRlcnMKKyAqICsgZnJhZ21lbnRzIiBtb2RlIHJhdGhlciB0aGFuIHRoZSBvbGQgc3R5bGUgb2YganVzdCBzaG93aW5nIGEgc2luZ2xlCisgKiBwcmVmZXJlbmNlcyBsaXN0LgorICoKKyAqIDxhIG5hbWU9IlNhbXBsZUNvZGUiPjwvYT4KKyAqIDxoMz5TYW1wbGUgQ29kZTwvaDM+CisgKgorICogPHA+VGhlIGZvbGxvd2luZyBzYW1wbGUgY29kZSBzaG93cyBhIHNpbXBsZSBwcmVmZXJlbmNlIGFjdGl2aXR5IHRoYXQKKyAqIGhhcyB0d28gZGlmZmVyZW50IHNldHMgb2YgcHJlZmVyZW5jZXMuICBUaGUgaW1wbGVtZW50YXRpb24sIGNvbnNpc3RpbmcKKyAqIG9mIHRoZSBhY3Rpdml0eSBpdHNlbGYgYXMgd2VsbCBhcyBpdHMgdHdvIHByZWZlcmVuY2UgZnJhZ21lbnRzIGlzOjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9QcmVmZXJlbmNlV2l0aEhlYWRlcnMuamF2YQorICogICAgICBhY3Rpdml0eX0KKyAqCisgKiA8cD5UaGUgcHJlZmVyZW5jZV9oZWFkZXJzIHJlc291cmNlIGRlc2NyaWJlcyB0aGUgaGVhZGVycyB0byBiZSBkaXNwbGF5ZWQKKyAqIGFuZCB0aGUgZnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGVtLiAgSXQgaXM6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL3ByZWZlcmVuY2VfaGVhZGVycy54bWwgaGVhZGVyc30KKyAqCisgKiA8cD5UaGUgZmlyc3QgaGVhZGVyIGlzIHNob3duIGJ5IFByZWZzMUZyYWdtZW50LCB3aGljaCBwb3B1bGF0ZXMgaXRzZWxmCisgKiBmcm9tIHRoZSBmb2xsb3dpbmcgWE1MIHJlc291cmNlOjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvZnJhZ21lbnRlZF9wcmVmZXJlbmNlcy54bWwgcHJlZmVyZW5jZXN9CisgKgorICogPHA+Tm90ZSB0aGF0IHRoaXMgWE1MIHJlc291cmNlIGNvbnRhaW5zIGEgcHJlZmVyZW5jZSBzY3JlZW4gaG9sZGluZyBhbm90aGVyCisgKiBmcmFnbWVudCwgdGhlIFByZWZzMUZyYWdtZW50SW5uZXIgaW1wbGVtZW50ZWQgaGVyZS4gIFRoaXMgYWxsb3dzIHRoZSB1c2VyCisgKiB0byB0cmF2ZXJzZSBkb3duIGEgaGllcmFyY2h5IG9mIHByZWZlcmVuY2VzOyBwcmVzc2luZyBiYWNrIHdpbGwgcG9wIGVhY2gKKyAqIGZyYWdtZW50IG9mZiB0aGUgc3RhY2sgdG8gcmV0dXJuIHRvIHRoZSBwcmV2aW91cyBwcmVmZXJlbmNlcy4KKyAqCisgKiA8cD5TZWUge0BsaW5rIFByZWZlcmVuY2VGcmFnbWVudH0gZm9yIGluZm9ybWF0aW9uIG9uIGltcGxlbWVudGluZyB0aGUKKyAqIGZyYWdtZW50cyB0aGVtc2VsdmVzLgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJlZmVyZW5jZUFjdGl2aXR5IGV4dGVuZHMgTGlzdEFjdGl2aXR5IGltcGxlbWVudHMKLSAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIuT25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFU19UQUcgPSAiYW5kcm9pZDpwcmVmZXJlbmNlcyI7Ci0gICAgCisgICAgICAgIFByZWZlcmVuY2VNYW5hZ2VyLk9uUHJlZmVyZW5jZVRyZWVDbGlja0xpc3RlbmVyLAorICAgICAgICBQcmVmZXJlbmNlRnJhZ21lbnQuT25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudENhbGxiYWNrIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlByZWZlcmVuY2VBY3Rpdml0eSI7CisKKyAgICAvLyBDb25zdGFudHMgZm9yIHN0YXRlIHNhdmUvcmVzdG9yZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJTX1RBRyA9ICI6YW5kcm9pZDpoZWFkZXJzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSX0hFQURFUl9UQUcgPSAiOmFuZHJvaWQ6Y3VyX2hlYWRlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VTX1RBRyA9ICI6YW5kcm9pZDpwcmVmZXJlbmNlcyI7CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHN0YXJ0aW5nIHRoaXMgYWN0aXZpdHksIHRoZSBpbnZva2luZyBJbnRlbnQgY2FuIGNvbnRhaW4gdGhpcyBleHRyYQorICAgICAqIHN0cmluZyB0byBzcGVjaWZ5IHdoaWNoIGZyYWdtZW50IHNob3VsZCBiZSBpbml0aWFsbHkgZGlzcGxheWVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NIT1dfRlJBR01FTlQgPSAiOmFuZHJvaWQ6c2hvd19mcmFnbWVudCI7CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHN0YXJ0aW5nIHRoaXMgYWN0aXZpdHkgYW5kIHVzaW5nIHtAbGluayAjRVhUUkFfU0hPV19GUkFHTUVOVH0sCisgICAgICogdGhpcyBleHRyYSBjYW4gYWxzbyBiZSBzcGVjaWZ5IHRvIHN1cHBseSBhIEJ1bmRsZSBvZiBhcmd1bWVudHMgdG8gcGFzcworICAgICAqIHRvIHRoYXQgZnJhZ21lbnQgd2hlbiBpdCBpcyBpbnN0YW50aWF0ZWQgZHVyaW5nIHRoZSBpbml0aWFsIGNyZWF0aW9uCisgICAgICogb2YgUHJlZmVyZW5jZUFjdGl2aXR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NIT1dfRlJBR01FTlRfQVJHVU1FTlRTID0gIjphbmRyb2lkOnNob3dfZnJhZ21lbnRfYXJncyI7CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHN0YXJ0aW5nIHRoaXMgYWN0aXZpdHksIHRoZSBpbnZva2luZyBJbnRlbnQgY2FuIGNvbnRhaW4gdGhpcyBleHRyYQorICAgICAqIGJvb2xlYW4gdGhhdCB0aGUgaGVhZGVyIGxpc3Qgc2hvdWxkIG5vdCBiZSBkaXNwbGF5ZWQuICBUaGlzIGlzIG1vc3Qgb2Z0ZW4KKyAgICAgKiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgge0BsaW5rICNFWFRSQV9TSE9XX0ZSQUdNRU5UfSB0byBsYXVuY2gKKyAgICAgKiB0aGUgYWN0aXZpdHkgdG8gZGlzcGxheSBhIHNwZWNpZmljIGZyYWdtZW50IHRoYXQgdGhlIHVzZXIgaGFzIG5hdmlnYXRlZAorICAgICAqIHRvLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX05PX0hFQURFUlMgPSAiOmFuZHJvaWQ6bm9faGVhZGVycyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS19TVEFDS19QUkVGUyA9ICI6YW5kcm9pZDpwcmVmcyI7CisKKyAgICAvLyBleHRyYXMgdGhhdCBhbGxvdyBhbnkgcHJlZmVyZW5jZSBhY3Rpdml0eSB0byBiZSBsYXVuY2hlZCBhcyBwYXJ0IG9mIGEgd2l6YXJkCisKKyAgICAvLyBzaG93IEJhY2sgYW5kIE5leHQgYnV0dG9ucz8gdGFrZXMgYm9vbGVhbiBwYXJhbWV0ZXIKKyAgICAvLyBCYWNrIHdpbGwgdGhlbiByZXR1cm4gUkVTVUxUX0NBTkNFTEVEIGFuZCBOZXh0IFJFU1VMVF9PSworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVGU19TSE9XX0JVVFRPTl9CQVIgPSAiZXh0cmFfcHJlZnNfc2hvd19idXR0b25fYmFyIjsKKworICAgIC8vIGFkZCBhIFNraXAgYnV0dG9uPworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QUkVGU19TSE9XX1NLSVAgPSAiZXh0cmFfcHJlZnNfc2hvd19za2lwIjsKKworICAgIC8vIHNwZWNpZnkgY3VzdG9tIHRleHQgZm9yIHRoZSBCYWNrIG9yIE5leHQgYnV0dG9ucywgb3IgY2F1c2UgYSBidXR0b24gdG8gbm90IGFwcGVhcgorICAgIC8vIGF0IGFsbCBieSBzZXR0aW5nIGl0IHRvIG51bGwKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUFJFRlNfU0VUX05FWFRfVEVYVCA9ICJleHRyYV9wcmVmc19zZXRfbmV4dF90ZXh0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUFJFRlNfU0VUX0JBQ0tfVEVYVCA9ICJleHRyYV9wcmVmc19zZXRfYmFja190ZXh0IjsKKworICAgIC8vIC0tLSBTdGF0ZSBmb3IgbmV3IG1vZGUgd2hlbiBzaG93aW5nIGEgbGlzdCBvZiBoZWFkZXJzICsgcHJlZnMgZnJhZ21lbnQKKworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEhlYWRlcj4gbUhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PEhlYWRlcj4oKTsKKworICAgIHByaXZhdGUgSGVhZGVyQWRhcHRlciBtQWRhcHRlcjsKKworICAgIHByaXZhdGUgRnJhbWVMYXlvdXQgbUxpc3RGb290ZXI7CisKKyAgICBwcml2YXRlIFZpZXcgbVByZWZzQ29udGFpbmVyOworCisgICAgcHJpdmF0ZSBGcmFnbWVudEJyZWFkQ3J1bWJzIG1GcmFnbWVudEJyZWFkQ3J1bWJzOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1TaW5nbGVQYW5lOworCisgICAgcHJpdmF0ZSBIZWFkZXIgbUN1ckhlYWRlcjsKKworICAgIC8vIC0tLSBTdGF0ZSBmb3Igb2xkIG1vZGUgd2hlbiBzaG93aW5nIGEgc2luZ2xlIHByZWZlcmVuY2UgbGlzdAorCiAgICAgcHJpdmF0ZSBQcmVmZXJlbmNlTWFuYWdlciBtUHJlZmVyZW5jZU1hbmFnZXI7Ci0gICAgCisKICAgICBwcml2YXRlIEJ1bmRsZSBtU2F2ZWRJbnN0YW5jZVN0YXRlOwogCisgICAgLy8gLS0tIENvbW1vbiBzdGF0ZQorCisgICAgcHJpdmF0ZSBCdXR0b24gbU5leHRCdXR0b247CisKICAgICAvKioKICAgICAgKiBUaGUgc3RhcnRpbmcgcmVxdWVzdCBjb2RlIGdpdmVuIG91dCB0byBwcmVmZXJlbmNlIGZyYW1ld29yay4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfUkVRVUVTVF9DT0RFID0gMTAwOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQklORF9QUkVGRVJFTkNFUyA9IDA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0JJTkRfUFJFRkVSRU5DRVMgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQlVJTERfSEVBREVSUyA9IDI7CiAgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CiAgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY2FzZSBNU0dfQklORF9QUkVGRVJFTkNFUzoKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19CSU5EX1BSRUZFUkVOQ0VTOiB7CiAgICAgICAgICAgICAgICAgICAgIGJpbmRQcmVmZXJlbmNlcygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0JVSUxEX0hFQURFUlM6IHsKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PEhlYWRlcj4gb2xkSGVhZGVycyA9IG5ldyBBcnJheUxpc3Q8SGVhZGVyPihtSGVhZGVycyk7CisgICAgICAgICAgICAgICAgICAgIG1IZWFkZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIG9uQnVpbGRIZWFkZXJzKG1IZWFkZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgbUFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgSGVhZGVyIGhlYWRlciA9IG9uR2V0TmV3SGVhZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCAmJiBoZWFkZXIuZnJhZ21lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyIG1hcHBlZEhlYWRlciA9IGZpbmRCZXN0TWF0Y2hpbmdIZWFkZXIoaGVhZGVyLCBvbGRIZWFkZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBwZWRIZWFkZXIgPT0gbnVsbCB8fCBtQ3VySGVhZGVyICE9IG1hcHBlZEhlYWRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaFRvSGVhZGVyKGhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUN1ckhlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXIgbWFwcGVkSGVhZGVyID0gZmluZEJlc3RNYXRjaGluZ0hlYWRlcihtQ3VySGVhZGVyLCBtSGVhZGVycyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwcGVkSGVhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZEhlYWRlcihtYXBwZWRIZWFkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hUb0hlYWRlcihudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9OwogCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSGVhZGVyQWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxIZWFkZXI+IHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSGVhZGVyVmlld0hvbGRlciB7CisgICAgICAgICAgICBJbWFnZVZpZXcgaWNvbjsKKyAgICAgICAgICAgIFRleHRWaWV3IHRpdGxlOworICAgICAgICAgICAgVGV4dFZpZXcgc3VtbWFyeTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgTGF5b3V0SW5mbGF0ZXIgbUluZmxhdGVyOworCisgICAgICAgIHB1YmxpYyBIZWFkZXJBZGFwdGVyKENvbnRleHQgY29udGV4dCwgTGlzdDxIZWFkZXI+IG9iamVjdHMpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIDAsIG9iamVjdHMpOworICAgICAgICAgICAgbUluZmxhdGVyID0gKExheW91dEluZmxhdGVyKWNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICAgICAgSGVhZGVyVmlld0hvbGRlciBob2xkZXI7CisgICAgICAgICAgICBWaWV3IHZpZXc7CisKKyAgICAgICAgICAgIGlmIChjb252ZXJ0VmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmlldyA9IG1JbmZsYXRlci5pbmZsYXRlKGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnByZWZlcmVuY2VfaGVhZGVyX2l0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBob2xkZXIgPSBuZXcgSGVhZGVyVmlld0hvbGRlcigpOworICAgICAgICAgICAgICAgIGhvbGRlci5pY29uID0gKEltYWdlVmlldykgdmlldy5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5pY29uKTsKKyAgICAgICAgICAgICAgICBob2xkZXIudGl0bGUgPSAoVGV4dFZpZXcpIHZpZXcuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQudGl0bGUpOworICAgICAgICAgICAgICAgIGhvbGRlci5zdW1tYXJ5ID0gKFRleHRWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnN1bW1hcnkpOworICAgICAgICAgICAgICAgIHZpZXcuc2V0VGFnKGhvbGRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZpZXcgPSBjb252ZXJ0VmlldzsKKyAgICAgICAgICAgICAgICBob2xkZXIgPSAoSGVhZGVyVmlld0hvbGRlcikgdmlldy5nZXRUYWcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQWxsIHZpZXcgZmllbGRzIG11c3QgYmUgdXBkYXRlZCBldmVyeSB0aW1lLCBiZWNhdXNlIHRoZSB2aWV3IG1heSBiZSByZWN5Y2xlZCAKKyAgICAgICAgICAgIEhlYWRlciBoZWFkZXIgPSBnZXRJdGVtKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGhvbGRlci5pY29uLnNldEltYWdlUmVzb3VyY2UoaGVhZGVyLmljb25SZXMpOworICAgICAgICAgICAgaG9sZGVyLnRpdGxlLnNldFRleHQoaGVhZGVyLnRpdGxlKTsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShoZWFkZXIuc3VtbWFyeSkpIHsKKyAgICAgICAgICAgICAgICBob2xkZXIuc3VtbWFyeS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhvbGRlci5zdW1tYXJ5LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICBob2xkZXIuc3VtbWFyeS5zZXRUZXh0KGhlYWRlci5zdW1tYXJ5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHZpZXc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHZhbHVlIGZvciB7QGxpbmsgSGVhZGVyI2lkIEhlYWRlci5pZH0gaW5kaWNhdGluZyB0aGF0IG5vCisgICAgICogaWRlbnRpZmllciB2YWx1ZSBpcyBzZXQuICBBbGwgb3RoZXIgdmFsdWVzIChpbmNsdWRpbmcgdGhvc2UgYmVsb3cgLTEpCisgICAgICogYXJlIHZhbGlkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBIRUFERVJfSURfVU5ERUZJTkVEID0gLTE7CisgICAgCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpb24gb2YgYSBzaW5nbGUgSGVhZGVyIGl0ZW0gdGhhdCB0aGUgdXNlciBjYW4gc2VsZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgSGVhZGVyIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJZGVudGlmaWVyIGZvciB0aGlzIGhlYWRlciwgdG8gY29ycmVsYXRlIHdpdGggYSBuZXcgbGlzdCB3aGVuCisgICAgICAgICAqIGl0IGlzIHVwZGF0ZWQuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcworICAgICAgICAgKiB7QGxpbmsgUHJlZmVyZW5jZUFjdGl2aXR5I0hFQURFUl9JRF9VTkRFRklORUR9LCBtZWFuaW5nIG5vIGlkLgorICAgICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlSGVhZGVyX2lkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgbG9uZyBpZCA9IEhFQURFUl9JRF9VTkRFRklORUQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRpdGxlIG9mIHRoZSBoZWFkZXIgdGhhdCBpcyBzaG93biB0byB0aGUgdXNlci4KKyAgICAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZUhlYWRlcl90aXRsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSB0aXRsZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogT3B0aW9uYWwgc3VtbWFyeSBkZXNjcmliaW5nIHdoYXQgdGhpcyBoZWFkZXIgY29udHJvbHMuCisgICAgICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ByZWZlcmVuY2VIZWFkZXJfc3VtbWFyeQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBzdW1tYXJ5OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPcHRpb25hbCB0ZXh0IHRvIHNob3cgYXMgdGhlIHRpdGxlIGluIHRoZSBicmVhZCBjcnVtYi4KKyAgICAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZUhlYWRlcl9icmVhZENydW1iVGl0bGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgYnJlYWRDcnVtYlRpdGxlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPcHRpb25hbCB0ZXh0IHRvIHNob3cgYXMgdGhlIHNob3J0IHRpdGxlIGluIHRoZSBicmVhZCBjcnVtYi4KKyAgICAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZUhlYWRlcl9icmVhZENydW1iU2hvcnRUaXRsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBicmVhZENydW1iU2hvcnRUaXRsZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogT3B0aW9uYWwgaWNvbiByZXNvdXJjZSB0byBzaG93IGZvciB0aGlzIGhlYWRlci4KKyAgICAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZUhlYWRlcl9pY29uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGljb25SZXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZ1bGwgY2xhc3MgbmFtZSBvZiB0aGUgZnJhZ21lbnQgdG8gZGlzcGxheSB3aGVuIHRoaXMgaGVhZGVyIGlzCisgICAgICAgICAqIHNlbGVjdGVkLgorICAgICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlSGVhZGVyX2ZyYWdtZW50CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGZyYWdtZW50OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPcHRpb25hbCBhcmd1bWVudHMgdG8gc3VwcGx5IHRvIHRoZSBmcmFnbWVudCB3aGVuIGl0IGlzCisgICAgICAgICAqIGluc3RhbnRpYXRlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdW5kbGUgZnJhZ21lbnRBcmd1bWVudHM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludGVudCB0byBsYXVuY2ggd2hlbiB0aGUgcHJlZmVyZW5jZSBpcyBzZWxlY3RlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBJbnRlbnQgaW50ZW50OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPcHRpb25hbCBhZGRpdGlvbmFsIGRhdGEgZm9yIHVzZSBieSBzdWJjbGFzc2VzIG9mIFByZWZlcmVuY2VBY3Rpdml0eS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdW5kbGUgZXh0cmFzOworCisgICAgICAgIHB1YmxpYyBIZWFkZXIoKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlTG9uZyhpZCk7CisgICAgICAgICAgICBUZXh0VXRpbHMud3JpdGVUb1BhcmNlbCh0aXRsZSwgZGVzdCwgZmxhZ3MpOworICAgICAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwoc3VtbWFyeSwgZGVzdCwgZmxhZ3MpOworICAgICAgICAgICAgVGV4dFV0aWxzLndyaXRlVG9QYXJjZWwoYnJlYWRDcnVtYlRpdGxlLCBkZXN0LCBmbGFncyk7CisgICAgICAgICAgICBUZXh0VXRpbHMud3JpdGVUb1BhcmNlbChicmVhZENydW1iU2hvcnRUaXRsZSwgZGVzdCwgZmxhZ3MpOworICAgICAgICAgICAgZGVzdC53cml0ZUludChpY29uUmVzKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcoZnJhZ21lbnQpOworICAgICAgICAgICAgZGVzdC53cml0ZUJ1bmRsZShmcmFnbWVudEFyZ3VtZW50cyk7CisgICAgICAgICAgICBpZiAoaW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlSW50KDEpOworICAgICAgICAgICAgICAgIGludGVudC53cml0ZVRvUGFyY2VsKGRlc3QsIGZsYWdzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVzdC53cml0ZUludCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc3Qud3JpdGVCdW5kbGUoZXh0cmFzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlYWRGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgaWQgPSBpbi5yZWFkTG9uZygpOworICAgICAgICAgICAgdGl0bGUgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICAgICAgc3VtbWFyeSA9IFRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgICAgICBicmVhZENydW1iVGl0bGUgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICAgICAgYnJlYWRDcnVtYlNob3J0VGl0bGUgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICAgICAgaWNvblJlcyA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGZyYWdtZW50ID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICAgICAgZnJhZ21lbnRBcmd1bWVudHMgPSBpbi5yZWFkQnVuZGxlKCk7CisgICAgICAgICAgICBpZiAoaW4ucmVhZEludCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICBpbnRlbnQgPSBJbnRlbnQuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4dHJhcyA9IGluLnJlYWRCdW5kbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEhlYWRlcihQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJlYWRGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3JlYXRvcjxIZWFkZXI+IENSRUFUT1IgPSBuZXcgQ3JlYXRvcjxIZWFkZXI+KCkgeworICAgICAgICAgICAgcHVibGljIEhlYWRlciBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhlYWRlcihzb3VyY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIEhlYWRlcltdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIZWFkZXJbc2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwogCiAgICAgICAgIHNldENvbnRlbnRWaWV3KGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnByZWZlcmVuY2VfbGlzdF9jb250ZW50KTsKLSAgICAgICAgCi0gICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlciA9IG9uQ3JlYXRlUHJlZmVyZW5jZU1hbmFnZXIoKTsKKworICAgICAgICBtTGlzdEZvb3RlciA9IChGcmFtZUxheW91dClmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5saXN0X2Zvb3Rlcik7CisgICAgICAgIG1QcmVmc0NvbnRhaW5lciA9IGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnByZWZzKTsKKyAgICAgICAgYm9vbGVhbiBoaWRpbmdIZWFkZXJzID0gb25Jc0hpZGluZ0hlYWRlcnMoKTsKKyAgICAgICAgbVNpbmdsZVBhbmUgPSBoaWRpbmdIZWFkZXJzIHx8ICFvbklzTXVsdGlQYW5lKCk7CisgICAgICAgIFN0cmluZyBpbml0aWFsRnJhZ21lbnQgPSBnZXRJbnRlbnQoKS5nZXRTdHJpbmdFeHRyYShFWFRSQV9TSE9XX0ZSQUdNRU5UKTsKKyAgICAgICAgQnVuZGxlIGluaXRpYWxBcmd1bWVudHMgPSBnZXRJbnRlbnQoKS5nZXRCdW5kbGVFeHRyYShFWFRSQV9TSE9XX0ZSQUdNRU5UX0FSR1VNRU5UUyk7CisKKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBXZSBhcmUgcmVzdGFydGluZyBmcm9tIGEgcHJldmlvdXMgc2F2ZWQgc3RhdGU7IHVzZWQgdGhhdCB0bworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSwgaW5zdGVhZCBvZiBzdGFydGluZyBmcmVzaC4KKyAgICAgICAgICAgIEFycmF5TGlzdDxIZWFkZXI+IGhlYWRlcnMgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0UGFyY2VsYWJsZUFycmF5TGlzdChIRUFERVJTX1RBRyk7CisgICAgICAgICAgICBpZiAoaGVhZGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUhlYWRlcnMuYWRkQWxsKGhlYWRlcnMpOworICAgICAgICAgICAgICAgIGludCBjdXJIZWFkZXIgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KENVUl9IRUFERVJfVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludClIRUFERVJfSURfVU5ERUZJTkVEKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VySGVhZGVyID49IDAgJiYgY3VySGVhZGVyIDwgbUhlYWRlcnMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkSGVhZGVyKG1IZWFkZXJzLmdldChjdXJIZWFkZXIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpbml0aWFsRnJhZ21lbnQgIT0gbnVsbCAmJiBtU2luZ2xlUGFuZSkgeworICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBqdXN0IHNob3dpbmcgYSBmcmFnbWVudCwgd2Ugd2FudCB0byBydW4gaW4KKyAgICAgICAgICAgICAgICAvLyBuZXcgZnJhZ21lbnQgbW9kZSwgYnV0IGRvbid0IG5lZWQgdG8gY29tcHV0ZSBhbmQgc2hvdworICAgICAgICAgICAgICAgIC8vIHRoZSBoZWFkZXJzLgorICAgICAgICAgICAgICAgIHN3aXRjaFRvSGVhZGVyKGluaXRpYWxGcmFnbWVudCwgaW5pdGlhbEFyZ3VtZW50cyk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB0cnkgdG8gYnVpbGQgdGhlIGhlYWRlcnMuCisgICAgICAgICAgICAgICAgb25CdWlsZEhlYWRlcnMobUhlYWRlcnMpOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIGhlYWRlcnMsIHRoZW4gYXQgdGhpcyBwb2ludCB3ZSBuZWVkIHRvIHNob3cKKyAgICAgICAgICAgICAgICAvLyB0aGVtIGFuZCwgZGVwZW5kaW5nIG9uIHRoZSBzY3JlZW4sIHdlIG1heSBhbHNvIHNob3cgaW4tbGluZQorICAgICAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcHJlZmVyZW5jZSBmcmFnbWVudC4KKyAgICAgICAgICAgICAgICBpZiAobUhlYWRlcnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW1TaW5nbGVQYW5lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbEZyYWdtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXIgaCA9IG9uR2V0SW5pdGlhbEhlYWRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaFRvSGVhZGVyKGgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hUb0hlYWRlcihpbml0aWFsRnJhZ21lbnQsIGluaXRpYWxBcmd1bWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpcyB0byBvbmx5IHNob3cgdGhlIGxpc3Qgdmlldy4gIEFkanVzdAorICAgICAgICAvLyB2aXNpYmlsaXR5IGZvciBvdGhlciBjb25maWd1cmF0aW9ucy4KKyAgICAgICAgaWYgKGluaXRpYWxGcmFnbWVudCAhPSBudWxsICYmIG1TaW5nbGVQYW5lKSB7CisgICAgICAgICAgICAvLyBTaW5nbGUgcGFuZSwgc2hvd2luZyBqdXN0IGEgcHJlZnMgZnJhZ21lbnQuCisgICAgICAgICAgICBmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5oZWFkZXJzKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtUHJlZnNDb250YWluZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9IGVsc2UgaWYgKG1IZWFkZXJzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIG1BZGFwdGVyID0gbmV3IEhlYWRlckFkYXB0ZXIodGhpcywgbUhlYWRlcnMpOworICAgICAgICAgICAgc2V0TGlzdEFkYXB0ZXIobUFkYXB0ZXIpOworICAgICAgICAgICAgaWYgKCFtU2luZ2xlUGFuZSkgeworICAgICAgICAgICAgICAgIC8vIE11bHRpLXBhbmUuCisgICAgICAgICAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRDaG9pY2VNb2RlKEFic0xpc3RWaWV3LkNIT0lDRV9NT0RFX1NJTkdMRSk7CisgICAgICAgICAgICAgICAgaWYgKG1DdXJIZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZEhlYWRlcihtQ3VySGVhZGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVByZWZzQ29udGFpbmVyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBoZWFkZXJzLCB3ZSBhcmUgaW4gdGhlIG9sZCAianVzdCBzaG93IGEgc2NyZWVuCisgICAgICAgICAgICAvLyBvZiBwcmVmZXJlbmNlcyIgbW9kZS4KKyAgICAgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlciA9IG5ldyBQcmVmZXJlbmNlTWFuYWdlcih0aGlzLCBGSVJTVF9SRVFVRVNUX0NPREUpOworICAgICAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLnNldE9uUHJlZmVyZW5jZVRyZWVDbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisKICAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRTY3JvbGxCYXJTdHlsZShWaWV3LlNDUk9MTEJBUlNfSU5TSURFX09WRVJMQVkpOworCisgICAgICAgIC8vIHNlZSBpZiB3ZSBzaG91bGQgc2hvdyBCYWNrL05leHQgYnV0dG9ucworICAgICAgICBJbnRlbnQgaW50ZW50ID0gZ2V0SW50ZW50KCk7CisgICAgICAgIGlmIChpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKEVYVFJBX1BSRUZTX1NIT1dfQlVUVE9OX0JBUiwgZmFsc2UpKSB7CisKKyAgICAgICAgICAgIGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmJ1dHRvbl9iYXIpLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKworICAgICAgICAgICAgQnV0dG9uIGJhY2tCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmJhY2tfYnV0dG9uKTsKKyAgICAgICAgICAgIGJhY2tCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVzdWx0KFJFU1VMVF9DQU5DRUxFRCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgQnV0dG9uIHNraXBCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnNraXBfYnV0dG9uKTsKKyAgICAgICAgICAgIHNraXBCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVzdWx0KFJFU1VMVF9PSyk7CisgICAgICAgICAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgbU5leHRCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLm5leHRfYnV0dG9uKTsKKyAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgICAgIHNldFJlc3VsdChSRVNVTFRfT0spOworICAgICAgICAgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgLy8gc2V0IG91ciB2YXJpb3VzIGJ1dHRvbiBwYXJhbWV0ZXJzCisgICAgICAgICAgICBpZiAoaW50ZW50Lmhhc0V4dHJhKEVYVFJBX1BSRUZTX1NFVF9ORVhUX1RFWFQpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGJ1dHRvblRleHQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfUFJFRlNfU0VUX05FWFRfVEVYVCk7CisgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGJ1dHRvblRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldFRleHQoYnV0dG9uVGV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGludGVudC5oYXNFeHRyYShFWFRSQV9QUkVGU19TRVRfQkFDS19URVhUKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBidXR0b25UZXh0ID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKEVYVFJBX1BSRUZTX1NFVF9CQUNLX1RFWFQpOworICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShidXR0b25UZXh0KSkgeworICAgICAgICAgICAgICAgICAgICBiYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJhY2tCdXR0b24uc2V0VGV4dChidXR0b25UZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW50ZW50LmdldEJvb2xlYW5FeHRyYShFWFRSQV9QUkVGU19TSE9XX1NLSVAsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgIHNraXBCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYWN0aXZpdHkgaXMgY3VycmVudGx5IHNob3dpbmcgdGhlIGhlYWRlciBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0hlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiBnZXRMaXN0VmlldygpLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUKKyAgICAgICAgICAgICAgICAmJiBtUHJlZmVyZW5jZU1hbmFnZXIgPT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBhY3Rpdml0eSBpcyBzaG93aW5nIG11bHRpcGxlIHBhbmVzIC0tIHRoZSBoZWFkZXJzCisgICAgICogYW5kIGEgcHJlZmVyZW5jZSBmcmFnbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc011bHRpUGFuZSgpIHsKKyAgICAgICAgcmV0dXJuIGhhc0hlYWRlcnMoKSAmJiBtUHJlZnNDb250YWluZXIuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhY3Rpdml0eSBzaG91bGQgcnVuIGluIG11bHRpLXBhbmUgbW9kZS4KKyAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIHNjcmVlbiBpcyBsYXJnZQorICAgICAqIGVub3VnaC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbklzTXVsdGlQYW5lKCkgeworICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgaWYgKChjb25maWcuc2NyZWVuTGF5b3V0JkNvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfTUFTSykKKyAgICAgICAgICAgICAgICA9PSBDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX1hMQVJHRSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjb25maWcuc2NyZWVuTGF5b3V0JkNvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfTUFTSykKKyAgICAgICAgICAgICAgICA9PSBDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX0xBUkdFCisgICAgICAgICAgICAgICAgJiYgY29uZmlnLm9yaWVudGF0aW9uID09IENvbmZpZ3VyYXRpb24uT1JJRU5UQVRJT05fTEFORFNDQVBFKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBoZWFkZXIgbGlzdCBzaG91bGQgYmUgaGlkZGVuLgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlCisgICAgICogdmFsdWUgZ2l2ZW4gaW4ge0BsaW5rICNFWFRSQV9OT19IRUFERVJTfSBvciBmYWxzZSBpZiBpdCBpcyBub3Qgc3VwcGxpZWQuCisgICAgICogVGhpcyBpcyBzZXQgdG8gZmFsc2UsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBiZWluZyByZS1sYXVuY2hlZAorICAgICAqIHRvIHNob3cgYSBwYXJ0aWN1bGFyIHByZWZlcmVuY2UgYWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25Jc0hpZGluZ0hlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiBnZXRJbnRlbnQoKS5nZXRCb29sZWFuRXh0cmEoRVhUUkFfTk9fSEVBREVSUywgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB0byBkZXRlcm1pbmUgdGhlIGluaXRpYWwgaGVhZGVyIHRvIGJlIHNob3duLiAgVGhlIGRlZmF1bHQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyB0aGUgZnJhZ21lbnQgb2YgdGhlIGZpcnN0IGhlYWRlci4gIE5vdGUKKyAgICAgKiB0aGF0IHRoZSByZXR1cm5lZCBIZWFkZXIgb2JqZWN0IGRvZXMgbm90IGFjdHVhbGx5IG5lZWQgdG8gZXhpc3QgaW4KKyAgICAgKiB5b3VyIGhlYWRlciBsaXN0IC0tIHdoYXRldmVyIGl0cyBmcmFnbWVudCBpcyB3aWxsIHNpbXBseSBiZSB1c2VkIHRvCisgICAgICogc2hvdyBmb3IgdGhlIGluaXRpYWwgVUkuCisgICAgICovCisgICAgcHVibGljIEhlYWRlciBvbkdldEluaXRpYWxIZWFkZXIoKSB7CisgICAgICAgIHJldHVybiBtSGVhZGVycy5nZXQoMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGFmdGVyIHRoZSBoZWFkZXIgbGlzdCBoYXMgYmVlbiB1cGRhdGVkICh7QGxpbmsgI29uQnVpbGRIZWFkZXJzfQorICAgICAqIGhhcyBiZWVuIGNhbGxlZCBhbmQgcmV0dXJuZWQgZHVlIHRvIHtAbGluayAjaW52YWxpZGF0ZUhlYWRlcnMoKX0pIHRvCisgICAgICogc3BlY2lmeSB0aGUgaGVhZGVyIHRoYXQgc2hvdWxkIG5vdyBiZSBzZWxlY3RlZC4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgICogcmV0dXJucyBudWxsIHRvIGtlZXAgd2hhdGV2ZXIgaGVhZGVyIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSGVhZGVyIG9uR2V0TmV3SGVhZGVyKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgbmVlZHMgaXRzIGxpc3Qgb2YgaGVhZGVycyBidWlsZC4gIEJ5CisgICAgICogaW1wbGVtZW50aW5nIHRoaXMgYW5kIGFkZGluZyBhdCBsZWFzdCBvbmUgaXRlbSB0byB0aGUgbGlzdCwgeW91CisgICAgICogd2lsbCBjYXVzZSB0aGUgYWN0aXZpdHkgdG8gcnVuIGluIGl0cyBtb2Rlcm4gZnJhZ21lbnQgbW9kZS4gIE5vdGUKKyAgICAgKiB0aGF0IHRoaXMgZnVuY3Rpb24gbWF5IG5vdCBhbHdheXMgYmUgY2FsbGVkOyBmb3IgZXhhbXBsZSwgaWYgdGhlCisgICAgICogYWN0aXZpdHkgaGFzIGJlZW4gYXNrZWQgdG8gZGlzcGxheSBhIHBhcnRpY3VsYXIgZnJhZ21lbnQgd2l0aG91dAorICAgICAqIHRoZSBoZWFkZXIgbGlzdCwgdGhlcmUgaXMgbm8gbmVlZCB0byBidWlsZCB0aGUgaGVhZGVycy4KKyAgICAgKgorICAgICAqIDxwPlR5cGljYWwgaW1wbGVtZW50YXRpb25zIHdpbGwgdXNlIHtAbGluayAjbG9hZEhlYWRlcnNGcm9tUmVzb3VyY2V9CisgICAgICogdG8gZmlsbCBpbiB0aGUgbGlzdCBmcm9tIGEgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBsaXN0IGluIHdoaWNoIHRvIHBsYWNlIHRoZSBoZWFkZXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQnVpbGRIZWFkZXJzKExpc3Q8SGVhZGVyPiB0YXJnZXQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHdoZW4geW91IG5lZWQgdG8gY2hhbmdlIHRoZSBoZWFkZXJzIGJlaW5nIGRpc3BsYXllZC4gIFdpbGwgcmVzdWx0CisgICAgICogaW4gb25CdWlsZEhlYWRlcnMoKSBsYXRlciBiZWluZyBjYWxsZWQgdG8gcmV0cmlldmUgdGhlIG5ldyBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGVIZWFkZXJzKCkgeworICAgICAgICBpZiAoIW1IYW5kbGVyLmhhc01lc3NhZ2VzKE1TR19CVUlMRF9IRUFERVJTKSkgeworICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfQlVJTERfSEVBREVSUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgZ2l2ZW4gWE1MIGZpbGUgYXMgYSBoZWFkZXIgZGVzY3JpcHRpb24sIGFkZGluZyBlYWNoCisgICAgICogcGFyc2VkIEhlYWRlciBpbnRvIHRoZSB0YXJnZXQgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNpZCBUaGUgWE1MIHJlc291cmNlIHRvIGxvYWQgYW5kIHBhcnNlLgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIGxpc3QgaW4gd2hpY2ggdGhlIHBhcnNlZCBoZWFkZXJzIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZEhlYWRlcnNGcm9tUmVzb3VyY2UoaW50IHJlc2lkLCBMaXN0PEhlYWRlcj4gdGFyZ2V0KSB7CisgICAgICAgIFhtbFJlc291cmNlUGFyc2VyIHBhcnNlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXJzZXIgPSBnZXRSZXNvdXJjZXMoKS5nZXRYbWwocmVzaWQpOworICAgICAgICAgICAgQXR0cmlidXRlU2V0IGF0dHJzID0gWG1sLmFzQXR0cmlidXRlU2V0KHBhcnNlcik7CisKKyAgICAgICAgICAgIGludCB0eXBlOworICAgICAgICAgICAgd2hpbGUgKCh0eXBlPXBhcnNlci5uZXh0KCkpICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UCisgICAgICAgICAgICAgICAgICAgICYmIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIG5vZGVOYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmICghInByZWZlcmVuY2UtaGVhZGVycyIuZXF1YWxzKG5vZGVOYW1lKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlhNTCBkb2N1bWVudCBtdXN0IHN0YXJ0IHdpdGggPHByZWZlcmVuY2UtaGVhZGVycz4gdGFnOyBmb3VuZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbm9kZU5hbWUgKyAiIGF0ICIgKyBwYXJzZXIuZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQnVuZGxlIGN1ckJ1bmRsZSA9IG51bGw7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBvdXRlckRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisgICAgICAgICAgICB3aGlsZSAoKHR5cGU9cGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQKKyAgICAgICAgICAgICAgICAgICAmJiAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcgfHwgcGFyc2VyLmdldERlcHRoKCkgPiBvdXRlckRlcHRoKSkgeworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCB0eXBlID09IFhtbFB1bGxQYXJzZXIuVEVYVCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBub2RlTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKCJoZWFkZXIiLmVxdWFscyhub2RlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgSGVhZGVyIGhlYWRlciA9IG5ldyBIZWFkZXIoKTsKKworICAgICAgICAgICAgICAgICAgICBUeXBlZEFycmF5IHNhID0gZ2V0UmVzb3VyY2VzKCkub2J0YWluQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlSGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmlkID0gc2EuZ2V0UmVzb3VyY2VJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlSGVhZGVyX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpSEVBREVSX0lEX1VOREVGSU5FRCk7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlci50aXRsZSA9IHNhLmdldFRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJlZmVyZW5jZUhlYWRlcl90aXRsZSk7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlci5zdW1tYXJ5ID0gc2EuZ2V0VGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlSGVhZGVyX3N1bW1hcnkpOworICAgICAgICAgICAgICAgICAgICBoZWFkZXIuYnJlYWRDcnVtYlRpdGxlID0gc2EuZ2V0VGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlSGVhZGVyX2JyZWFkQ3J1bWJUaXRsZSk7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlci5icmVhZENydW1iU2hvcnRUaXRsZSA9IHNhLmdldFRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJlZmVyZW5jZUhlYWRlcl9icmVhZENydW1iU2hvcnRUaXRsZSk7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlci5pY29uUmVzID0gc2EuZ2V0UmVzb3VyY2VJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlSGVhZGVyX2ljb24sIDApOworICAgICAgICAgICAgICAgICAgICBoZWFkZXIuZnJhZ21lbnQgPSBzYS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJlZmVyZW5jZUhlYWRlcl9mcmFnbWVudCk7CisgICAgICAgICAgICAgICAgICAgIHNhLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY3VyQnVuZGxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1ckJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbm5lckRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgodHlwZT1wYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gaW5uZXJEZXB0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCB0eXBlID09IFhtbFB1bGxQYXJzZXIuVEVYVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5uZXJOb2RlTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXJOb2RlTmFtZS5lcXVhbHMoImV4dHJhIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZXMoKS5wYXJzZUJ1bmRsZUV4dHJhKCJleHRyYSIsIGF0dHJzLCBjdXJCdW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFV0aWxzLnNraXBDdXJyZW50VGFnKHBhcnNlcik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5uZXJOb2RlTmFtZS5lcXVhbHMoImludGVudCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmludGVudCA9IEludGVudC5wYXJzZUludGVudChnZXRSZXNvdXJjZXMoKSwgcGFyc2VyLCBhdHRycyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sVXRpbHMuc2tpcEN1cnJlbnRUYWcocGFyc2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJCdW5kbGUuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmZyYWdtZW50QXJndW1lbnRzID0gY3VyQnVuZGxlOworICAgICAgICAgICAgICAgICAgICAgICAgY3VyQnVuZGxlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGQoaGVhZGVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBYbWxVdGlscy5za2lwQ3VycmVudFRhZyhwYXJzZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciBwYXJzaW5nIGhlYWRlcnMiLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIHBhcnNpbmcgaGVhZGVycyIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHBhcnNlciAhPSBudWxsKSBwYXJzZXIuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgZm9vdGVyIHRoYXQgc2hvdWxkIGJlIHNob3duIGF0IHRoZSBib3R0b20gb2YgdGhlIGhlYWRlciBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpc3RGb290ZXIoVmlldyB2aWV3KSB7CisgICAgICAgIG1MaXN0Rm9vdGVyLnJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgIG1MaXN0Rm9vdGVyLmFkZFZpZXcodmlldywgbmV3IEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvblN0b3AoKSB7CiAgICAgICAgIHN1cGVyLm9uU3RvcCgpOwotICAgICAgICAKLSAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlTdG9wKCk7CisKKyAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eVN0b3AoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uRGVzdHJveSgpIHsKICAgICAgICAgc3VwZXIub25EZXN0cm95KCk7Ci0gICAgICAgIAotICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eURlc3Ryb3koKTsKKworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaEFjdGl2aXR5RGVzdHJveSgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKICAgICAgICAgc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZShvdXRTdGF0ZSk7CiAKLSAgICAgICAgZmluYWwgUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuID0gZ2V0UHJlZmVyZW5jZVNjcmVlbigpOwotICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBCdW5kbGUgY29udGFpbmVyID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgcHJlZmVyZW5jZVNjcmVlbi5zYXZlSGllcmFyY2h5U3RhdGUoY29udGFpbmVyKTsKLSAgICAgICAgICAgIG91dFN0YXRlLnB1dEJ1bmRsZShQUkVGRVJFTkNFU19UQUcsIGNvbnRhaW5lcik7CisgICAgICAgIGlmIChtSGVhZGVycy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRQYXJjZWxhYmxlQXJyYXlMaXN0KEhFQURFUlNfVEFHLCBtSGVhZGVycyk7CisgICAgICAgICAgICBpZiAobUN1ckhlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbUhlYWRlcnMuaW5kZXhPZihtQ3VySGVhZGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBvdXRTdGF0ZS5wdXRJbnQoQ1VSX0hFQURFUl9UQUcsIGluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgICAgIGlmIChwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBCdW5kbGUgY29udGFpbmVyID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgIHByZWZlcmVuY2VTY3JlZW4uc2F2ZUhpZXJhcmNoeVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICAgICAgb3V0U3RhdGUucHV0QnVuZGxlKFBSRUZFUkVOQ0VTX1RBRywgY29udGFpbmVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoQnVuZGxlIHN0YXRlKSB7Ci0gICAgICAgIEJ1bmRsZSBjb250YWluZXIgPSBzdGF0ZS5nZXRCdW5kbGUoUFJFRkVSRU5DRVNfVEFHKTsKLSAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4gPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCk7Ci0gICAgICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJlZmVyZW5jZVNjcmVlbi5yZXN0b3JlSGllcmFyY2h5U3RhdGUoY29udGFpbmVyKTsKLSAgICAgICAgICAgICAgICBtU2F2ZWRJbnN0YW5jZVN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBjb250YWluZXIgPSBzdGF0ZS5nZXRCdW5kbGUoUFJFRkVSRU5DRVNfVEFHKTsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHByZWZlcmVuY2VTY3JlZW4ucmVzdG9yZUhpZXJhcmNoeVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICAgICAgICAgIG1TYXZlZEluc3RhbmNlU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xNTYsMTQgKzc5OSwyMjAgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CiAgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOwotICAgICAgICAKLSAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOworCisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25Db250ZW50Q2hhbmdlZCgpIHsKICAgICAgICAgc3VwZXIub25Db250ZW50Q2hhbmdlZCgpOwotICAgICAgICBwb3N0QmluZFByZWZlcmVuY2VzKCk7CisKKyAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBwb3N0QmluZFByZWZlcmVuY2VzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgc3VwZXIub25MaXN0SXRlbUNsaWNrKGwsIHYsIHBvc2l0aW9uLCBpZCk7CisKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG9uSGVhZGVyQ2xpY2sobUhlYWRlcnMuZ2V0KHBvc2l0aW9uKSwgcG9zaXRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhbiBpdGVtIGluIHRoZSBoZWFkZXIgbGlzdC4gIFRoZSBkZWZhdWx0CisgICAgICogaW1wbGVtZW50YXRpb24gd2lsbCBjYWxsIGVpdGhlciB7QGxpbmsgI3N0YXJ0V2l0aEZyYWdtZW50KFN0cmluZywgQnVuZGxlKX0KKyAgICAgKiBvciB7QGxpbmsgI3N3aXRjaFRvSGVhZGVyKEhlYWRlcil9IGFzIGFwcHJvcHJpYXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlciBUaGUgaGVhZGVyIHRoYXQgd2FzIHNlbGVjdGVkLgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgaGVhZGVyJ3MgcG9zaXRpb24gaW4gdGhlIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25IZWFkZXJDbGljayhIZWFkZXIgaGVhZGVyLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgaWYgKGhlYWRlci5mcmFnbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobVNpbmdsZVBhbmUpIHsKKyAgICAgICAgICAgICAgICBzdGFydFdpdGhGcmFnbWVudChoZWFkZXIuZnJhZ21lbnQsIGhlYWRlci5mcmFnbWVudEFyZ3VtZW50cyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaFRvSGVhZGVyKGhlYWRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoaGVhZGVyLmludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBzdGFydEFjdGl2aXR5KGhlYWRlci5pbnRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBhY3Rpdml0eSwgc2hvd2luZyBvbmx5IHRoZSBnaXZlbgorICAgICAqIHByZWZlcmVuY2UgZnJhZ21lbnQuICBXaGVuIGxhdW5jaGVkIGluIHRoaXMgbW9kZSwgdGhlIGhlYWRlciBsaXN0CisgICAgICogd2lsbCBiZSBoaWRkZW4gYW5kIHRoZSBnaXZlbiBwcmVmZXJlbmNlIGZyYWdtZW50IHdpbGwgYmUgaW5zdGFudGlhdGVkCisgICAgICogYW5kIGZpbGwgdGhlIGVudGlyZSBhY3Rpdml0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFnbWVudE5hbWUgVGhlIG5hbWUgb2YgdGhlIGZyYWdtZW50IHRvIGRpc3BsYXkuCisgICAgICogQHBhcmFtIGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIHN1cHBseSB0byB0aGUgZnJhZ21lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRXaXRoRnJhZ21lbnQoU3RyaW5nIGZyYWdtZW50TmFtZSwgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9NQUlOKTsKKyAgICAgICAgaW50ZW50LnNldENsYXNzKHRoaXMsIGdldENsYXNzKCkpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfU0hPV19GUkFHTUVOVCwgZnJhZ21lbnROYW1lKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX1NIT1dfRlJBR01FTlRfQVJHVU1FTlRTLCBhcmdzKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX05PX0hFQURFUlMsIHRydWUpOworICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hhbmdlIHRoZSBiYXNlIHRpdGxlIG9mIHRoZSBicmVhZCBjcnVtYnMgZm9yIHRoZSBjdXJyZW50IHByZWZlcmVuY2VzLgorICAgICAqIFRoaXMgd2lsbCBub3JtYWxseSBiZSBjYWxsZWQgZm9yIHlvdS4gIFNlZQorICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5GcmFnbWVudEJyZWFkQ3J1bWJzfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93QnJlYWRDcnVtYnMoQ2hhclNlcXVlbmNlIHRpdGxlLCBDaGFyU2VxdWVuY2Ugc2hvcnRUaXRsZSkgeworICAgICAgICBpZiAobUZyYWdtZW50QnJlYWRDcnVtYnMgPT0gbnVsbCkgeworICAgICAgICAgICAgbUZyYWdtZW50QnJlYWRDcnVtYnMgPSBuZXcgRnJhZ21lbnRCcmVhZENydW1icyh0aGlzKTsKKyAgICAgICAgICAgIG1GcmFnbWVudEJyZWFkQ3J1bWJzLnNldEFjdGl2aXR5KHRoaXMpOworICAgICAgICAgICAgZ2V0QWN0aW9uQmFyKCkuc2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUobUZyYWdtZW50QnJlYWRDcnVtYnMpOworICAgICAgICB9CisgICAgICAgIG1GcmFnbWVudEJyZWFkQ3J1bWJzLnNldFRpdGxlKHRpdGxlLCBzaG9ydFRpdGxlKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFNlbGVjdGVkSGVhZGVyKEhlYWRlciBoZWFkZXIpIHsKKyAgICAgICAgbUN1ckhlYWRlciA9IGhlYWRlcjsKKyAgICAgICAgaW50IGluZGV4ID0gbUhlYWRlcnMuaW5kZXhPZihoZWFkZXIpOworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRJdGVtQ2hlY2tlZChpbmRleCwgdHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZXRMaXN0VmlldygpLmNsZWFyQ2hvaWNlcygpOworICAgICAgICB9CisgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlID0gaGVhZGVyLmJyZWFkQ3J1bWJUaXRsZTsKKyAgICAgICAgICAgIGlmICh0aXRsZSA9PSBudWxsKSB0aXRsZSA9IGhlYWRlci50aXRsZTsKKyAgICAgICAgICAgIGlmICh0aXRsZSA9PSBudWxsKSB0aXRsZSA9IGdldFRpdGxlKCk7CisgICAgICAgICAgICBzaG93QnJlYWRDcnVtYnModGl0bGUsIGhlYWRlci5icmVhZENydW1iU2hvcnRUaXRsZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaG93QnJlYWRDcnVtYnMoZ2V0VGl0bGUoKSwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzd2l0Y2hUb0hlYWRlcklubmVyKFN0cmluZyBmcmFnbWVudE5hbWUsIEJ1bmRsZSBhcmdzLCBib29sZWFuIG5leHQpIHsKKyAgICAgICAgZ2V0RnJhZ21lbnRNYW5hZ2VyKCkucG9wQmFja1N0YWNrKEJBQ0tfU1RBQ0tfUFJFRlMsIFBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSk7CisgICAgICAgIEZyYWdtZW50IGYgPSBGcmFnbWVudC5pbnN0YW50aWF0ZSh0aGlzLCBmcmFnbWVudE5hbWUsIGFyZ3MpOworICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uID0gZ2V0RnJhZ21lbnRNYW5hZ2VyKCkub3BlblRyYW5zYWN0aW9uKCk7CisgICAgICAgIHRyYW5zYWN0aW9uLnNldFRyYW5zaXRpb24obmV4dCA/CisgICAgICAgICAgICAgICAgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX05FWFQgOgorICAgICAgICAgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24uVFJBTlNJVF9GUkFHTUVOVF9QUkVWKTsKKyAgICAgICAgdHJhbnNhY3Rpb24ucmVwbGFjZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnByZWZzLCBmKTsKKyAgICAgICAgdHJhbnNhY3Rpb24uY29tbWl0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiBpbiB0d28tcGFuZSBtb2RlLCBzd2l0Y2ggdGhlIGZyYWdtZW50IHBhbmUgdG8gc2hvdyB0aGUgZ2l2ZW4KKyAgICAgKiBwcmVmZXJlbmNlIGZyYWdtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWdtZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZnJhZ21lbnQgdG8gZGlzcGxheS4KKyAgICAgKiBAcGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gc3VwcGx5IHRvIHRoZSBmcmFnbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzd2l0Y2hUb0hlYWRlcihTdHJpbmcgZnJhZ21lbnROYW1lLCBCdW5kbGUgYXJncykgeworICAgICAgICBzZXRTZWxlY3RlZEhlYWRlcihudWxsKTsKKyAgICAgICAgc3dpdGNoVG9IZWFkZXJJbm5lcihmcmFnbWVudE5hbWUsIGFyZ3MsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZW4gaW4gdHdvLXBhbmUgbW9kZSwgc3dpdGNoIHRvIHRoZSBmcmFnbWVudCBwYW5lIHRvIHNob3cgdGhlIGdpdmVuCisgICAgICogcHJlZmVyZW5jZSBmcmFnbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoZWFkZXIgVGhlIG5ldyBoZWFkZXIgdG8gZGlzcGxheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzd2l0Y2hUb0hlYWRlcihIZWFkZXIgaGVhZGVyKSB7CisgICAgICAgIHN3aXRjaFRvSGVhZGVySW5uZXIoaGVhZGVyLmZyYWdtZW50LCBoZWFkZXIuZnJhZ21lbnRBcmd1bWVudHMsCisgICAgICAgICAgICAgICAgbUhlYWRlcnMuaW5kZXhPZihoZWFkZXIpID4gbUhlYWRlcnMuaW5kZXhPZihtQ3VySGVhZGVyKSk7CisgICAgICAgIHNldFNlbGVjdGVkSGVhZGVyKGhlYWRlcik7CisgICAgfQorCisgICAgSGVhZGVyIGZpbmRCZXN0TWF0Y2hpbmdIZWFkZXIoSGVhZGVyIGN1ciwgQXJyYXlMaXN0PEhlYWRlcj4gZnJvbSkgeworICAgICAgICBBcnJheUxpc3Q8SGVhZGVyPiBtYXRjaGVzID0gbmV3IEFycmF5TGlzdDxIZWFkZXI+KCk7CisgICAgICAgIGZvciAoaW50IGo9MDsgajxmcm9tLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICBIZWFkZXIgb2ggPSBmcm9tLmdldChqKTsKKyAgICAgICAgICAgIGlmIChjdXIgPT0gb2ggfHwgKGN1ci5pZCAhPSBIRUFERVJfSURfVU5ERUZJTkVEICYmIGN1ci5pZCA9PSBvaC5pZCkpIHsKKyAgICAgICAgICAgICAgICAvLyBNdXN0IGJlIHRoaXMgb25lLgorICAgICAgICAgICAgICAgIG1hdGNoZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtYXRjaGVzLmFkZChvaCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY3VyLmZyYWdtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3VyLmZyYWdtZW50LmVxdWFscyhvaC5mcmFnbWVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5hZGQob2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyLmludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGN1ci5pbnRlbnQuZXF1YWxzKG9oLmludGVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5hZGQob2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyLnRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3VyLnRpdGxlLmVxdWFscyhvaC50aXRsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5hZGQob2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgTk0gPSBtYXRjaGVzLnNpemUoKTsKKyAgICAgICAgaWYgKE5NID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXRjaGVzLmdldCgwKTsKKyAgICAgICAgfSBlbHNlIGlmIChOTSA+IDEpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGo9MDsgajxOTTsgaisrKSB7CisgICAgICAgICAgICAgICAgSGVhZGVyIG9oID0gbWF0Y2hlcy5nZXQoaik7CisgICAgICAgICAgICAgICAgaWYgKGN1ci5mcmFnbWVudEFyZ3VtZW50cyAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgICAgICBjdXIuZnJhZ21lbnRBcmd1bWVudHMuZXF1YWxzKG9oLmZyYWdtZW50QXJndW1lbnRzKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjdXIuZXh0cmFzICE9IG51bGwgJiYgY3VyLmV4dHJhcy5lcXVhbHMob2guZXh0cmFzKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjdXIudGl0bGUgIT0gbnVsbCAmJiBjdXIudGl0bGUuZXF1YWxzKG9oLnRpdGxlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgbmV3IGZyYWdtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWdtZW50IFRoZSBmcmFnbWVudCB0byBzdGFydAorICAgICAqIEBwYXJhbSBwdXNoIElmIHRydWUsIHRoZSBjdXJyZW50IGZyYWdtZW50IHdpbGwgYmUgcHVzaGVkIG9udG8gdGhlIGJhY2sgc3RhY2suICBJZiBmYWxzZSwKKyAgICAgKiB0aGUgY3VycmVudCBmcmFnbWVudCB3aWxsIGJlIHJlcGxhY2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJlZmVyZW5jZUZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50LCBib29sZWFuIHB1c2gpIHsKKyAgICAgICAgRnJhZ21lbnRUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiA9IGdldEZyYWdtZW50TWFuYWdlcigpLm9wZW5UcmFuc2FjdGlvbigpOworICAgICAgICBzdGFydFByZWZlcmVuY2VGcmFnbWVudChmcmFnbWVudCwgdHJhbnNhY3Rpb24pOworICAgICAgICBpZiAocHVzaCkgeworICAgICAgICAgICAgdHJhbnNhY3Rpb24uc2V0VHJhbnNpdGlvbihGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRlJBR01FTlRfT1BFTik7CisgICAgICAgICAgICB0cmFuc2FjdGlvbi5hZGRUb0JhY2tTdGFjayhCQUNLX1NUQUNLX1BSRUZTKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uLnNldFRyYW5zaXRpb24oRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX05FWFQpOworICAgICAgICB9CisgICAgICAgIHRyYW5zYWN0aW9uLmNvbW1pdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgbmV3IGZyYWdtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWdtZW50IFRoZSBmcmFnbWVudCB0byBzdGFydAorICAgICAqIEBwYXJhbSBmdCBUaGUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbiB3aGljaCB0byBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uLgorICAgICAqIFdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBiYWNrIHN0YWNrIG9yIGNvbW1pdHRlZCBmb3IgeW91OyB5b3UgdXNlIGRvIHRoYXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRQcmVmZXJlbmNlRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQpIHsKKyAgICAgICAgZnQucmVwbGFjZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnByZWZzLCBmcmFnbWVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudChQcmVmZXJlbmNlRnJhZ21lbnQgY2FsbGVyLCBQcmVmZXJlbmNlIHByZWYpIHsKKyAgICAgICAgRnJhZ21lbnQgZiA9IEZyYWdtZW50Lmluc3RhbnRpYXRlKHRoaXMsIHByZWYuZ2V0RnJhZ21lbnQoKSwgcHJlZi5nZXRFeHRyYXMoKSk7CisgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24gPSBnZXRGcmFnbWVudE1hbmFnZXIoKS5vcGVuVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgc3RhcnRQcmVmZXJlbmNlRnJhZ21lbnQoZiwgdHJhbnNhY3Rpb24pOworICAgICAgICB0cmFuc2FjdGlvbi5zZXRCcmVhZENydW1iVGl0bGUocHJlZi5nZXRUaXRsZSgpKTsKKyAgICAgICAgdHJhbnNhY3Rpb24uc2V0VHJhbnNpdGlvbihGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRlJBR01FTlRfT1BFTik7CisgICAgICAgIHRyYW5zYWN0aW9uLmFkZFRvQmFja1N0YWNrKEJBQ0tfU1RBQ0tfUFJFRlMpOworICAgICAgICB0cmFuc2FjdGlvbi5jb21taXQoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzYsNyArMTAyNSw3IEBACiAgICAgICAgIGlmIChtSGFuZGxlci5oYXNNZXNzYWdlcyhNU0dfQklORF9QUkVGRVJFTkNFUykpIHJldHVybjsKICAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQklORF9QUkVGRVJFTkNFUykuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSB2b2lkIGJpbmRQcmVmZXJlbmNlcygpIHsKICAgICAgICAgZmluYWwgUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuID0gZ2V0UHJlZmVyZW5jZVNjcmVlbigpOwogICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CkBAIC0xODcsMzggKzEwMzYsNDEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9LgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0gdXNlZCBieSB0aGlzIGFjdGl2aXR5LgotICAgICAqLwotICAgIHByaXZhdGUgUHJlZmVyZW5jZU1hbmFnZXIgb25DcmVhdGVQcmVmZXJlbmNlTWFuYWdlcigpIHsKLSAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIgcHJlZmVyZW5jZU1hbmFnZXIgPSBuZXcgUHJlZmVyZW5jZU1hbmFnZXIodGhpcywgRklSU1RfUkVRVUVTVF9DT0RFKTsKLSAgICAgICAgcHJlZmVyZW5jZU1hbmFnZXIuc2V0T25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIHJldHVybiBwcmVmZXJlbmNlTWFuYWdlcjsKLSAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9IHVzZWQgYnkgdGhpcyBhY3Rpdml0eS4KICAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVsZXZhbnQgZm9yIGEgbW9kZXJuIGZyYWdtZW50LWJhc2VkCisgICAgICogUHJlZmVyZW5jZUFjdGl2aXR5LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIFByZWZlcmVuY2VNYW5hZ2VyIGdldFByZWZlcmVuY2VNYW5hZ2VyKCkgewogICAgICAgICByZXR1cm4gbVByZWZlcmVuY2VNYW5hZ2VyOwogICAgIH0KLSAgICAKKwogICAgIHByaXZhdGUgdm9pZCByZXF1aXJlUHJlZmVyZW5jZU1hbmFnZXIoKSB7CiAgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBzdXBlci5vbkNyZWF0ZS4iKTsKKyAgICAgICAgICAgIGlmIChtQWRhcHRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBzdXBlci5vbkNyZWF0ZS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTW9kZXJuIHR3by1wYW5lIFByZWZlcmVuY2VBY3Rpdml0eSByZXF1aXJlcyB1c2Ugb2YgYSBQcmVmZXJlbmNlRnJhZ21lbnQiKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHJvb3Qgb2YgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IHRoYXQgdGhpcyBhY3Rpdml0eSBpcyBzaG93aW5nLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHByZWZlcmVuY2VTY3JlZW4gVGhlIHJvb3Qge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IG9mIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeS4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlbGV2YW50IGZvciBhIG1vZGVybiBmcmFnbWVudC1iYXNlZAorICAgICAqIFByZWZlcmVuY2VBY3Rpdml0eS4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNldFByZWZlcmVuY2VTY3JlZW4oUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuKSB7CisgICAgICAgIHJlcXVpcmVQcmVmZXJlbmNlTWFuYWdlcigpOworCiAgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIuc2V0UHJlZmVyZW5jZXMocHJlZmVyZW5jZVNjcmVlbikgJiYgcHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CiAgICAgICAgICAgICBwb3N0QmluZFByZWZlcmVuY2VzKCk7CiAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUgPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCkuZ2V0VGl0bGUoKTsKQEAgLTIyOCw2MSArMTA4MCw4NCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgcm9vdCBvZiB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkgdGhhdCB0aGlzIGFjdGl2aXR5IGlzIHNob3dpbmcuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gdGhhdCBpcyB0aGUgcm9vdCBvZiB0aGUgcHJlZmVyZW5jZQogICAgICAqICAgICAgICAgaGllcmFyY2h5LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVsZXZhbnQgZm9yIGEgbW9kZXJuIGZyYWdtZW50LWJhc2VkCisgICAgICogUHJlZmVyZW5jZUFjdGl2aXR5LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIFByZWZlcmVuY2VTY3JlZW4gZ2V0UHJlZmVyZW5jZVNjcmVlbigpIHsKLSAgICAgICAgcmV0dXJuIG1QcmVmZXJlbmNlTWFuYWdlci5nZXRQcmVmZXJlbmNlU2NyZWVuKCk7CisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1QcmVmZXJlbmNlTWFuYWdlci5nZXRQcmVmZXJlbmNlU2NyZWVuKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQWRkcyBwcmVmZXJlbmNlcyBmcm9tIGFjdGl2aXRpZXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4ge0BsaW5rIEludGVudH0uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSB7QGxpbmsgSW50ZW50fSB0byBxdWVyeSBhY3Rpdml0aWVzLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVsZXZhbnQgZm9yIGEgbW9kZXJuIGZyYWdtZW50LWJhc2VkCisgICAgICogUHJlZmVyZW5jZUFjdGl2aXR5LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgYWRkUHJlZmVyZW5jZXNGcm9tSW50ZW50KEludGVudCBpbnRlbnQpIHsKICAgICAgICAgcmVxdWlyZVByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0gICAgICAgIAorCiAgICAgICAgIHNldFByZWZlcmVuY2VTY3JlZW4obVByZWZlcmVuY2VNYW5hZ2VyLmluZmxhdGVGcm9tSW50ZW50KGludGVudCwgZ2V0UHJlZmVyZW5jZVNjcmVlbigpKSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogSW5mbGF0ZXMgdGhlIGdpdmVuIFhNTCByZXNvdXJjZSBhbmQgYWRkcyB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkgdG8gdGhlIGN1cnJlbnQKICAgICAgKiBwcmVmZXJlbmNlIGhpZXJhcmNoeS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBwcmVmZXJlbmNlc1Jlc0lkIFRoZSBYTUwgcmVzb3VyY2UgSUQgdG8gaW5mbGF0ZS4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlbGV2YW50IGZvciBhIG1vZGVybiBmcmFnbWVudC1iYXNlZAorICAgICAqIFByZWZlcmVuY2VBY3Rpdml0eS4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIGFkZFByZWZlcmVuY2VzRnJvbVJlc291cmNlKGludCBwcmVmZXJlbmNlc1Jlc0lkKSB7CiAgICAgICAgIHJlcXVpcmVQcmVmZXJlbmNlTWFuYWdlcigpOwotICAgICAgICAKKwogICAgICAgICBzZXRQcmVmZXJlbmNlU2NyZWVuKG1QcmVmZXJlbmNlTWFuYWdlci5pbmZsYXRlRnJvbVJlc291cmNlKHRoaXMsIHByZWZlcmVuY2VzUmVzSWQsCiAgICAgICAgICAgICAgICAgZ2V0UHJlZmVyZW5jZVNjcmVlbigpKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVsZXZhbnQgZm9yIGEgbW9kZXJuIGZyYWdtZW50LWJhc2VkCisgICAgICogUHJlZmVyZW5jZUFjdGl2aXR5LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gb25QcmVmZXJlbmNlVHJlZUNsaWNrKFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiwgUHJlZmVyZW5jZSBwcmVmZXJlbmNlKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBGaW5kcyBhIHtAbGluayBQcmVmZXJlbmNlfSBiYXNlZCBvbiBpdHMga2V5LgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGtleSBUaGUga2V5IG9mIHRoZSBwcmVmZXJlbmNlIHRvIHJldHJpZXZlLgogICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBQcmVmZXJlbmNlfSB3aXRoIHRoZSBrZXksIG9yIG51bGwuCiAgICAgICogQHNlZSBQcmVmZXJlbmNlR3JvdXAjZmluZFByZWZlcmVuY2UoQ2hhclNlcXVlbmNlKQorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVsZXZhbnQgZm9yIGEgbW9kZXJuIGZyYWdtZW50LWJhc2VkCisgICAgICogUHJlZmVyZW5jZUFjdGl2aXR5LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIFByZWZlcmVuY2UgZmluZFByZWZlcmVuY2UoQ2hhclNlcXVlbmNlIGtleSkgewotICAgICAgICAKKwogICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXIuZmluZFByZWZlcmVuY2Uoa2V5KTsKICAgICB9CiAKQEAgLTI5Miw1ICsxMTY3LDE0IEBACiAgICAgICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hOZXdJbnRlbnQoaW50ZW50KTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKworICAgIC8vIGdpdmUgc3ViY2xhc3NlcyBhY2Nlc3MgdG8gdGhlIE5leHQgYnV0dG9uCisgICAgLyoqIEBoaWRlICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzTmV4dEJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIG1OZXh0QnV0dG9uICE9IG51bGw7CisgICAgfQorICAgIC8qKiBAaGlkZSAqLworICAgIHByb3RlY3RlZCBCdXR0b24gZ2V0TmV4dEJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIG1OZXh0QnV0dG9uOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUZyYWdtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MjljMzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VGcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsMzQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByZWZlcmVuY2U7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCisvKioKKyAqIFNob3dzIGEgaGllcmFyY2h5IG9mIHtAbGluayBQcmVmZXJlbmNlfSBvYmplY3RzIGFzCisgKiBsaXN0cy4gVGhlc2UgcHJlZmVyZW5jZXMgd2lsbAorICogYXV0b21hdGljYWxseSBzYXZlIHRvIHtAbGluayBTaGFyZWRQcmVmZXJlbmNlc30gYXMgdGhlIHVzZXIgaW50ZXJhY3RzIHdpdGgKKyAqIHRoZW0uIFRvIHJldHJpZXZlIGFuIGluc3RhbmNlIG9mIHtAbGluayBTaGFyZWRQcmVmZXJlbmNlc30gdGhhdCB0aGUKKyAqIHByZWZlcmVuY2UgaGllcmFyY2h5IGluIHRoaXMgZnJhZ21lbnQgd2lsbCB1c2UsIGNhbGwKKyAqIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlciNnZXREZWZhdWx0U2hhcmVkUHJlZmVyZW5jZXMoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpfQorICogd2l0aCBhIGNvbnRleHQgaW4gdGhlIHNhbWUgcGFja2FnZSBhcyB0aGlzIGZyYWdtZW50LgorICogPHA+CisgKiBGdXJ0aGVybW9yZSwgdGhlIHByZWZlcmVuY2VzIHNob3duIHdpbGwgZm9sbG93IHRoZSB2aXN1YWwgc3R5bGUgb2Ygc3lzdGVtCisgKiBwcmVmZXJlbmNlcy4gSXQgaXMgZWFzeSB0byBjcmVhdGUgYSBoaWVyYXJjaHkgb2YgcHJlZmVyZW5jZXMgKHRoYXQgY2FuIGJlCisgKiBzaG93biBvbiBtdWx0aXBsZSBzY3JlZW5zKSB2aWEgWE1MLiBGb3IgdGhlc2UgcmVhc29ucywgaXQgaXMgcmVjb21tZW5kZWQgdG8KKyAqIHVzZSB0aGlzIGZyYWdtZW50IChhcyBhIHN1cGVyY2xhc3MpIHRvIGRlYWwgd2l0aCBwcmVmZXJlbmNlcyBpbiBhcHBsaWNhdGlvbnMuCisgKiA8cD4KKyAqIEEge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IG9iamVjdCBzaG91bGQgYmUgYXQgdGhlIHRvcCBvZiB0aGUgcHJlZmVyZW5jZQorICogaGllcmFyY2h5LiBGdXJ0aGVybW9yZSwgc3Vic2VxdWVudCB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gaW4gdGhlIGhpZXJhcmNoeQorICogZGVub3RlIGEgc2NyZWVuIGJyZWFrLS10aGF0IGlzIHRoZSBwcmVmZXJlbmNlcyBjb250YWluZWQgd2l0aGluIHN1YnNlcXVlbnQKKyAqIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBzaG91bGQgYmUgc2hvd24gb24gYW5vdGhlciBzY3JlZW4uIFRoZSBwcmVmZXJlbmNlCisgKiBmcmFtZXdvcmsgaGFuZGxlcyBzaG93aW5nIHRoZXNlIG90aGVyIHNjcmVlbnMgZnJvbSB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkuCisgKiA8cD4KKyAqIFRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeSBjYW4gYmUgZm9ybWVkIGluIG11bHRpcGxlIHdheXM6CisgKiA8bGk+IEZyb20gYW4gWE1MIGZpbGUgc3BlY2lmeWluZyB0aGUgaGllcmFyY2h5CisgKiA8bGk+IEZyb20gZGlmZmVyZW50IHtAbGluayBBY3Rpdml0eSBBY3Rpdml0aWVzfSB0aGF0IGVhY2ggc3BlY2lmeSBpdHMgb3duCisgKiBwcmVmZXJlbmNlcyBpbiBhbiBYTUwgZmlsZSB2aWEge0BsaW5rIEFjdGl2aXR5fSBtZXRhLWRhdGEKKyAqIDxsaT4gRnJvbSBhbiBvYmplY3QgaGllcmFyY2h5IHJvb3RlZCB3aXRoIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufQorICogPHA+CisgKiBUbyBpbmZsYXRlIGZyb20gWE1MLCB1c2UgdGhlIHtAbGluayAjYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoaW50KX0uIFRoZQorICogcm9vdCBlbGVtZW50IHNob3VsZCBiZSBhIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufS4gU3Vic2VxdWVudCBlbGVtZW50cyBjYW4gcG9pbnQKKyAqIHRvIGFjdHVhbCB7QGxpbmsgUHJlZmVyZW5jZX0gc3ViY2xhc3Nlcy4gQXMgbWVudGlvbmVkIGFib3ZlLCBzdWJzZXF1ZW50CisgKiB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gaW4gdGhlIGhpZXJhcmNoeSB3aWxsIHJlc3VsdCBpbiB0aGUgc2NyZWVuIGJyZWFrLgorICogPHA+CisgKiBUbyBzcGVjaWZ5IGFuIHtAbGluayBJbnRlbnR9IHRvIHF1ZXJ5IHtAbGluayBBY3Rpdml0eSBBY3Rpdml0aWVzfSB0aGF0IGVhY2gKKyAqIGhhdmUgcHJlZmVyZW5jZXMsIHVzZSB7QGxpbmsgI2FkZFByZWZlcmVuY2VzRnJvbUludGVudH0uIEVhY2gKKyAqIHtAbGluayBBY3Rpdml0eX0gY2FuIHNwZWNpZnkgbWV0YS1kYXRhIGluIHRoZSBtYW5pZmVzdCAodmlhIHRoZSBrZXkKKyAqIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlciNNRVRBREFUQV9LRVlfUFJFRkVSRU5DRVN9KSB0aGF0IHBvaW50cyB0byBhbiBYTUwKKyAqIHJlc291cmNlLiBUaGVzZSBYTUwgcmVzb3VyY2VzIHdpbGwgYmUgaW5mbGF0ZWQgaW50byBhIHNpbmdsZSBwcmVmZXJlbmNlCisgKiBoaWVyYXJjaHkgYW5kIHNob3duIGJ5IHRoaXMgZnJhZ21lbnQuCisgKiA8cD4KKyAqIFRvIHNwZWNpZnkgYW4gb2JqZWN0IGhpZXJhcmNoeSByb290ZWQgd2l0aCB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0sIHVzZQorICoge0BsaW5rICNzZXRQcmVmZXJlbmNlU2NyZWVuKFByZWZlcmVuY2VTY3JlZW4pfS4KKyAqIDxwPgorICogQXMgYSBjb252ZW5pZW5jZSwgdGhpcyBmcmFnbWVudCBpbXBsZW1lbnRzIGEgY2xpY2sgbGlzdGVuZXIgZm9yIGFueQorICogcHJlZmVyZW5jZSBpbiB0aGUgY3VycmVudCBoaWVyYXJjaHksIHNlZQorICoge0BsaW5rICNvblByZWZlcmVuY2VUcmVlQ2xpY2soUHJlZmVyZW5jZVNjcmVlbiwgUHJlZmVyZW5jZSl9LgorICoKKyAqIDxhIG5hbWU9IlNhbXBsZUNvZGUiPjwvYT4KKyAqIDxoMz5TYW1wbGUgQ29kZTwvaDM+CisgKgorICogPHA+VGhlIGZvbGxvd2luZyBzYW1wbGUgY29kZSBzaG93cyBhIHNpbXBsZSBwcmVmZXJlbmNlIGZyYWdtZW50IHRoYXQgaXMKKyAqIHBvcHVsYXRlZCBmcm9tIGEgcmVzb3VyY2UuICBUaGUgcmVzb3VyY2UgaXQgbG9hZHMgaXM6PC9wPgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9wcmVmZXJlbmNlcy54bWwgcHJlZmVyZW5jZXN9CisgKgorICogPHA+VGhlIGZyYWdtZW50IGltcGxlbWVudGF0aW9uIGl0c2VsZiBzaW1wbHkgcG9wdWxhdGVzIHRoZSBwcmVmZXJlbmNlcworICogd2hlbiBjcmVhdGVkLiAgTm90ZSB0aGF0IHRoZSBwcmVmZXJlbmNlcyBmcmFtZXdvcmsgdGFrZXMgY2FyZSBvZiBsb2FkaW5nCisgKiB0aGUgY3VycmVudCB2YWx1ZXMgb3V0IG9mIHRoZSBhcHAgcHJlZmVyZW5jZXMgYW5kIHdyaXRpbmcgdGhlbSB3aGVuIGNoYW5nZWQ6PC9wPgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL0ZyYWdtZW50UHJlZmVyZW5jZXMuamF2YQorICogICAgICBmcmFnbWVudH0KKyAqCisgKiBAc2VlIFByZWZlcmVuY2UKKyAqIEBzZWUgUHJlZmVyZW5jZVNjcmVlbgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJlZmVyZW5jZUZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgaW1wbGVtZW50cworICAgICAgICBQcmVmZXJlbmNlTWFuYWdlci5PblByZWZlcmVuY2VUcmVlQ2xpY2tMaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRVNfVEFHID0gImFuZHJvaWQ6cHJlZmVyZW5jZXMiOworCisgICAgcHJpdmF0ZSBQcmVmZXJlbmNlTWFuYWdlciBtUHJlZmVyZW5jZU1hbmFnZXI7CisgICAgcHJpdmF0ZSBMaXN0VmlldyBtTGlzdDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhdmVQcmVmczsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUluaXREb25lOworCisgICAgLyoqCisgICAgICogVGhlIHN0YXJ0aW5nIHJlcXVlc3QgY29kZSBnaXZlbiBvdXQgdG8gcHJlZmVyZW5jZSBmcmFtZXdvcmsuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJUlNUX1JFUVVFU1RfQ09ERSA9IDEwMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQklORF9QUkVGRVJFTkNFUyA9IDE7CisgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19CSU5EX1BSRUZFUkVOQ0VTOgorICAgICAgICAgICAgICAgICAgICBiaW5kUHJlZmVyZW5jZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgZmluYWwgcHJpdmF0ZSBSdW5uYWJsZSBtUmVxdWVzdEZvY3VzID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBtTGlzdC5mb2N1c2FibGVWaWV3QXZhaWxhYmxlKG1MaXN0KTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgdGhhdCBQcmVmZXJlbmNlRnJhZ21lbnQncyBjb250YWluaW5nIGFjdGl2aXR5IHNob3VsZAorICAgICAqIGltcGxlbWVudCB0byBiZSBhYmxlIHRvIHByb2Nlc3MgcHJlZmVyZW5jZSBpdGVtcyB0aGF0IHdpc2ggdG8KKyAgICAgKiBzd2l0Y2ggdG8gYSBuZXcgZnJhZ21lbnQuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBPblByZWZlcmVuY2VTdGFydEZyYWdtZW50Q2FsbGJhY2sgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgaGFzIGNsaWNrZWQgb24gYSBQcmVmZXJlbmNlIHRoYXQgaGFzCisgICAgICAgICAqIGEgZnJhZ21lbnQgY2xhc3MgbmFtZSBhc3NvY2lhdGVkIHdpdGggaXQuICBUaGUgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICogdG8gc2hvdWxkIGluc3RhbnRpYXRlIGFuZCBzd2l0Y2ggdG8gYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuCisgICAgICAgICAqIGZyYWdtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBvblByZWZlcmVuY2VTdGFydEZyYWdtZW50KFByZWZlcmVuY2VGcmFnbWVudCBjYWxsZXIsIFByZWZlcmVuY2UgcHJlZik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIgPSBuZXcgUHJlZmVyZW5jZU1hbmFnZXIoZ2V0QWN0aXZpdHkoKSwgRklSU1RfUkVRVUVTVF9DT0RFKTsKKyAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLnNldEZyYWdtZW50KHRoaXMpOworICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuc2V0T25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gaW5mbGF0ZXIuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5wcmVmZXJlbmNlX2xpc3RfY29udGVudCwKKyAgICAgICAgICAgICAgICBjb250YWluZXIsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlDcmVhdGVkKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGdldExpc3RWaWV3KCkuc2V0U2Nyb2xsQmFyU3R5bGUoVmlldy5TQ1JPTExCQVJTX0lOU0lERV9PVkVSTEFZKTsKKworICAgICAgICBpZiAobUhhdmVQcmVmcykgeworICAgICAgICAgICAgYmluZFByZWZlcmVuY2VzKCk7CisgICAgICAgIH0KKworICAgICAgICBtSW5pdERvbmUgPSB0cnVlOworCisgICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgQnVuZGxlIGNvbnRhaW5lciA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRCdW5kbGUoUFJFRkVSRU5DRVNfVEFHKTsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHByZWZlcmVuY2VTY3JlZW4ucmVzdG9yZUhpZXJhcmNoeVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdG9wKCkgeworICAgICAgICBzdXBlci5vblN0b3AoKTsKKyAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlTdG9wKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95VmlldygpIHsKKyAgICAgICAgbUxpc3QgPSBudWxsOworICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVJlcXVlc3RGb2N1cyk7CisgICAgICAgIHN1cGVyLm9uRGVzdHJveVZpZXcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOworICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eURlc3Ryb3koKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgeworICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKG91dFN0YXRlKTsKKworICAgICAgICBmaW5hbCBQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4gPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCk7CisgICAgICAgIGlmIChwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBjb250YWluZXIgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBwcmVmZXJlbmNlU2NyZWVuLnNhdmVIaWVyYXJjaHlTdGF0ZShjb250YWluZXIpOworICAgICAgICAgICAgb3V0U3RhdGUucHV0QnVuZGxlKFBSRUZFUkVOQ0VTX1RBRywgY29udGFpbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlSZXN1bHQoaW50IHJlcXVlc3RDb2RlLCBpbnQgcmVzdWx0Q29kZSwgSW50ZW50IGRhdGEpIHsKKyAgICAgICAgc3VwZXIub25BY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7CisKKyAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0gdXNlZCBieSB0aGlzIGZyYWdtZW50LgorICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0uCisgICAgICovCisgICAgcHVibGljIFByZWZlcmVuY2VNYW5hZ2VyIGdldFByZWZlcmVuY2VNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gbVByZWZlcmVuY2VNYW5hZ2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHJvb3Qgb2YgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IHRoYXQgdGhpcyBmcmFnbWVudCBpcyBzaG93aW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZlcmVuY2VTY3JlZW4gVGhlIHJvb3Qge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IG9mIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmVmZXJlbmNlU2NyZWVuKFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbikgeworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyLnNldFByZWZlcmVuY2VzKHByZWZlcmVuY2VTY3JlZW4pICYmIHByZWZlcmVuY2VTY3JlZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgbUhhdmVQcmVmcyA9IHRydWU7CisgICAgICAgICAgICBpZiAobUluaXREb25lKSB7CisgICAgICAgICAgICAgICAgcG9zdEJpbmRQcmVmZXJlbmNlcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcm9vdCBvZiB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkgdGhhdCB0aGlzIGZyYWdtZW50IGlzIHNob3dpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gdGhhdCBpcyB0aGUgcm9vdCBvZiB0aGUgcHJlZmVyZW5jZQorICAgICAqICAgICAgICAgaGllcmFyY2h5LgorICAgICAqLworICAgIHB1YmxpYyBQcmVmZXJlbmNlU2NyZWVuIGdldFByZWZlcmVuY2VTY3JlZW4oKSB7CisgICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXIuZ2V0UHJlZmVyZW5jZVNjcmVlbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgcHJlZmVyZW5jZXMgZnJvbSBhY3Rpdml0aWVzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHtAbGluayBJbnRlbnR9LgorICAgICAqCisgICAgICogQHBhcmFtIGludGVudCBUaGUge0BsaW5rIEludGVudH0gdG8gcXVlcnkgYWN0aXZpdGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQcmVmZXJlbmNlc0Zyb21JbnRlbnQoSW50ZW50IGludGVudCkgeworICAgICAgICByZXF1aXJlUHJlZmVyZW5jZU1hbmFnZXIoKTsKKworICAgICAgICBzZXRQcmVmZXJlbmNlU2NyZWVuKG1QcmVmZXJlbmNlTWFuYWdlci5pbmZsYXRlRnJvbUludGVudChpbnRlbnQsIGdldFByZWZlcmVuY2VTY3JlZW4oKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZmxhdGVzIHRoZSBnaXZlbiBYTUwgcmVzb3VyY2UgYW5kIGFkZHMgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IHRvIHRoZSBjdXJyZW50CisgICAgICogcHJlZmVyZW5jZSBoaWVyYXJjaHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZmVyZW5jZXNSZXNJZCBUaGUgWE1MIHJlc291cmNlIElEIHRvIGluZmxhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoaW50IHByZWZlcmVuY2VzUmVzSWQpIHsKKyAgICAgICAgcmVxdWlyZVByZWZlcmVuY2VNYW5hZ2VyKCk7CisKKyAgICAgICAgc2V0UHJlZmVyZW5jZVNjcmVlbihtUHJlZmVyZW5jZU1hbmFnZXIuaW5mbGF0ZUZyb21SZXNvdXJjZShnZXRBY3Rpdml0eSgpLAorICAgICAgICAgICAgICAgIHByZWZlcmVuY2VzUmVzSWQsIGdldFByZWZlcmVuY2VTY3JlZW4oKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvblByZWZlcmVuY2VUcmVlQ2xpY2soUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuLAorICAgICAgICAgICAgUHJlZmVyZW5jZSBwcmVmZXJlbmNlKSB7CisgICAgICAgIGlmIChwcmVmZXJlbmNlLmdldEZyYWdtZW50KCkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCkgaW5zdGFuY2VvZiBPblByZWZlcmVuY2VTdGFydEZyYWdtZW50Q2FsbGJhY2spIHsKKyAgICAgICAgICAgIHJldHVybiAoKE9uUHJlZmVyZW5jZVN0YXJ0RnJhZ21lbnRDYWxsYmFjaylnZXRBY3Rpdml0eSgpKS5vblByZWZlcmVuY2VTdGFydEZyYWdtZW50KAorICAgICAgICAgICAgICAgICAgICB0aGlzLCBwcmVmZXJlbmNlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZHMgYSB7QGxpbmsgUHJlZmVyZW5jZX0gYmFzZWQgb24gaXRzIGtleS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgcHJlZmVyZW5jZSB0byByZXRyaWV2ZS4KKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZX0gd2l0aCB0aGUga2V5LCBvciBudWxsLgorICAgICAqIEBzZWUgUHJlZmVyZW5jZUdyb3VwI2ZpbmRQcmVmZXJlbmNlKENoYXJTZXF1ZW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJlZmVyZW5jZSBmaW5kUHJlZmVyZW5jZShDaGFyU2VxdWVuY2Uga2V5KSB7CisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1QcmVmZXJlbmNlTWFuYWdlci5maW5kUHJlZmVyZW5jZShrZXkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXF1aXJlUHJlZmVyZW5jZU1hbmFnZXIoKSB7CisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBzdXBlci5vbkNyZWF0ZS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwb3N0QmluZFByZWZlcmVuY2VzKCkgeworICAgICAgICBpZiAobUhhbmRsZXIuaGFzTWVzc2FnZXMoTVNHX0JJTkRfUFJFRkVSRU5DRVMpKSByZXR1cm47CisgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0JJTkRfUFJFRkVSRU5DRVMpLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBiaW5kUHJlZmVyZW5jZXMoKSB7CisgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICAgICAgaWYgKHByZWZlcmVuY2VTY3JlZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgcHJlZmVyZW5jZVNjcmVlbi5iaW5kKGdldExpc3RWaWV3KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIExpc3RWaWV3IGdldExpc3RWaWV3KCkgeworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgICAgIHJldHVybiBtTGlzdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlTGlzdCgpIHsKKyAgICAgICAgaWYgKG1MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBWaWV3IHJvb3QgPSBnZXRWaWV3KCk7CisgICAgICAgIGlmIChyb290ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbnRlbnQgdmlldyBub3QgeWV0IGNyZWF0ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBWaWV3IHJhd0xpc3RWaWV3ID0gcm9vdC5maW5kVmlld0J5SWQoYW5kcm9pZC5SLmlkLmxpc3QpOworICAgICAgICBpZiAoIShyYXdMaXN0VmlldyBpbnN0YW5jZW9mIExpc3RWaWV3KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDb250ZW50IGhhcyB2aWV3IHdpdGggaWQgYXR0cmlidXRlICdhbmRyb2lkLlIuaWQubGlzdCcgIgorICAgICAgICAgICAgICAgICAgICArICJ0aGF0IGlzIG5vdCBhIExpc3RWaWV3IGNsYXNzIik7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3QgPSAoTGlzdFZpZXcpcmF3TGlzdFZpZXc7CisgICAgICAgIGlmIChtTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIllvdXIgY29udGVudCBtdXN0IGhhdmUgYSBMaXN0VmlldyB3aG9zZSBpZCBhdHRyaWJ1dGUgaXMgIiArCisgICAgICAgICAgICAgICAgICAgICInYW5kcm9pZC5SLmlkLmxpc3QnIik7CisgICAgICAgIH0KKyAgICAgICAgbUhhbmRsZXIucG9zdChtUmVxdWVzdEZvY3VzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VJbmZsYXRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlSW5mbGF0ZXIuamF2YQppbmRleCA3NzllNzQ2Li5jMjFhYTE4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VJbmZsYXRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUluZmxhdGVyLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLnByZWZlcmVuY2U7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlhtbFV0aWxzOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC0zOSw2ICs0MSw3IEBACiBjbGFzcyBQcmVmZXJlbmNlSW5mbGF0ZXIgZXh0ZW5kcyBHZW5lcmljSW5mbGF0ZXI8UHJlZmVyZW5jZSwgUHJlZmVyZW5jZUdyb3VwPiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJQcmVmZXJlbmNlSW5mbGF0ZXIiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFTlRfVEFHX05BTUUgPSAiaW50ZW50IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVEFHX05BTUUgPSAiZXh0cmEiOwogCiAgICAgcHJpdmF0ZSBQcmVmZXJlbmNlTWFuYWdlciBtUHJlZmVyZW5jZU1hbmFnZXI7CiAgICAgCkBAIC03Myw4ICs3NiwxMCBAQAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBpbnRlbnQgPSBJbnRlbnQucGFyc2VJbnRlbnQoZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLCBwYXJzZXIsIGF0dHJzKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb3VsZCBub3QgcGFyc2UgSW50ZW50LiIpOwotICAgICAgICAgICAgICAgIExvZy53KFRBRywgZSk7CisgICAgICAgICAgICAgICAgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBleCA9IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHBhcnNpbmcgcHJlZmVyZW5jZSIpOworICAgICAgICAgICAgICAgIGV4LmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBleDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAogICAgICAgICAgICAgaWYgKGludGVudCAhPSBudWxsKSB7CkBAIC04Miw2ICs4NywxOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICh0YWcuZXF1YWxzKEVYVFJBX1RBR19OQU1FKSkgeworICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLnBhcnNlQnVuZGxlRXh0cmEoRVhUUkFfVEFHX05BTUUsIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICBwYXJlbnRQcmVmZXJlbmNlLmdldEV4dHJhcygpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgWG1sVXRpbHMuc2tpcEN1cnJlbnRUYWcocGFyc2VyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGV4ID0gbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyBwcmVmZXJlbmNlIik7CisgICAgICAgICAgICAgICAgZXguaW5pdENhdXNlKGUpOworICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZU1hbmFnZXIuamF2YQppbmRleCBmYTgzODk3Li40MjE1MGVkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlTWFuYWdlci5qYXZhCkBAIC0xNiwxMiArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQucHJlZmVyZW5jZTsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwpAQCAtMzQsNiArMjksMTAgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKwogLyoqCiAgKiBVc2VkIHRvIGhlbHAgY3JlYXRlIHtAbGluayBQcmVmZXJlbmNlfSBoaWVyYXJjaGllcwogICogZnJvbSBhY3Rpdml0aWVzIG9yIFhNTC4KQEAgLTYxLDYgKzYwLDExIEBACiAgICAgcHJpdmF0ZSBBY3Rpdml0eSBtQWN0aXZpdHk7CiAKICAgICAvKioKKyAgICAgKiBGcmFnbWVudCB0aGF0IG93bnMgdGhpcyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFByZWZlcmVuY2VGcmFnbWVudCBtRnJhZ21lbnQ7CisKKyAgICAvKioKICAgICAgKiBUaGUgY29udGV4dCB0byB1c2UuIFRoaXMgc2hvdWxkIGFsd2F5cyBiZSBzZXQuCiAgICAgICogCiAgICAgICogQHNlZSAjbUFjdGl2aXR5CkBAIC0xNTgsNyArMTYyLDIxIEBACiAgICAgICAgIAogICAgICAgICBzZXRTaGFyZWRQcmVmZXJlbmNlc05hbWUoZ2V0RGVmYXVsdFNoYXJlZFByZWZlcmVuY2VzTmFtZShjb250ZXh0KSk7CiAgICAgfQotICAgIAorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3duaW5nIHByZWZlcmVuY2UgZnJhZ21lbnQKKyAgICAgKi8KKyAgICB2b2lkIHNldEZyYWdtZW50KFByZWZlcmVuY2VGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICBtRnJhZ21lbnQgPSBmcmFnbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBvd25pbmcgcHJlZmVyZW5jZSBmcmFnbWVudCwgaWYgYW55LgorICAgICAqLworICAgIFByZWZlcmVuY2VGcmFnbWVudCBnZXRGcmFnbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB7QGxpbmsgQWN0aXZpdHl9IChpbmRpcmVjdGx5KSB0aGF0IG1hdGNoIGEgZ2l2ZW4KICAgICAgKiB7QGxpbmsgSW50ZW50fS4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZVNjcmVlbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlU2NyZWVuLmphdmEKaW5kZXggOTVlNTQzMjQuLmM3ZjhhYjIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZVNjcmVlbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZVNjcmVlbi5qYXZhCkBAIC05MSw3ICs5MSw4IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGFuIGFkYXB0ZXIgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSB7QGxpbmsgUHJlZmVyZW5jZUFjdGl2aXR5fQotICAgICAqIHRvIHNob3cgdGhlIHByZWZlcmVuY2VzIGNvbnRhaW5lZCBpbiB0aGlzIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufS4KKyAgICAgKiBvciB7QGxpbmsgUHJlZmVyZW5jZUZyYWdtZW50fSB0byBzaG93IHRoZSBwcmVmZXJlbmNlcyBjb250YWluZWQgaW4gdGhpcworICAgICAqIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufS4KICAgICAgKiA8cD4KICAgICAgKiBUaGlzIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSB3aWxsIE5PVCBhcHBlYXIgaW4gdGhlIHJldHVybmVkIGFkYXB0ZXIsIGluc3RlYWQKICAgICAgKiBpdCBhcHBlYXJzIGluIHRoZSBoaWVyYXJjaHkgYWJvdmUgdGhpcyB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0uCkBAIC0xMzYsNyArMTM3LDcgQEAKICAgICAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNsaWNrKCkgewotICAgICAgICBpZiAoZ2V0SW50ZW50KCkgIT0gbnVsbCB8fCBnZXRQcmVmZXJlbmNlQ291bnQoKSA9PSAwKSB7CisgICAgICAgIGlmIChnZXRJbnRlbnQoKSAhPSBudWxsIHx8IGdldEZyYWdtZW50KCkgIT0gbnVsbCB8fCBnZXRQcmVmZXJlbmNlQ291bnQoKSA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1Jpbmd0b25lUHJlZmVyZW5jZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9SaW5ndG9uZVByZWZlcmVuY2UuamF2YQppbmRleCBiNDZmMTgwLi5jZjE0MDk3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1Jpbmd0b25lUHJlZmVyZW5jZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUmluZ3RvbmVQcmVmZXJlbmNlLmphdmEKQEAgLTI0LDcgKzI0LDYgQEAKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlN5c3RlbTsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogLyoqCiAgKiBBIHtAbGluayBQcmVmZXJlbmNlfSB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBjaG9vc2UgYSByaW5ndG9uZSBmcm9tIHRob3NlIG9uIHRoZSBkZXZpY2UuIApAQCAtMTM3LDcgKzEzNiwxMiBAQAogICAgICAgICAvLyBMYXVuY2ggdGhlIHJpbmd0b25lIHBpY2tlcgogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChSaW5ndG9uZU1hbmFnZXIuQUNUSU9OX1JJTkdUT05FX1BJQ0tFUik7CiAgICAgICAgIG9uUHJlcGFyZVJpbmd0b25lUGlja2VySW50ZW50KGludGVudCk7Ci0gICAgICAgIGdldFByZWZlcmVuY2VNYW5hZ2VyKCkuZ2V0QWN0aXZpdHkoKS5zdGFydEFjdGl2aXR5Rm9yUmVzdWx0KGludGVudCwgbVJlcXVlc3RDb2RlKTsKKyAgICAgICAgUHJlZmVyZW5jZUZyYWdtZW50IG93bmluZ0ZyYWdtZW50ID0gZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKS5nZXRGcmFnbWVudCgpOworICAgICAgICBpZiAob3duaW5nRnJhZ21lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgb3duaW5nRnJhZ21lbnQuc3RhcnRBY3Rpdml0eUZvclJlc3VsdChpbnRlbnQsIG1SZXF1ZXN0Q29kZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZXRQcmVmZXJlbmNlTWFuYWdlcigpLmdldEFjdGl2aXR5KCkuc3RhcnRBY3Rpdml0eUZvclJlc3VsdChpbnRlbnQsIG1SZXF1ZXN0Q29kZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXIuamF2YQppbmRleCAyZmJhMWQ3OS4uMTRkNjQ4NSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQnJvd3Nlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXIuamF2YQpAQCAtMTcsMjIgKzE3LDMwIEBACiBwYWNrYWdlIGFuZHJvaWQucHJvdmlkZXI7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VXJpczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlsczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQnJvd3NlckNvbnRyYWN0LkJvb2ttYXJrczsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkJyb3dzZXJDb250cmFjdC5IaXN0b3J5OworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQnJvd3NlckNvbnRyYWN0LlNlYXJjaGVzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViSWNvbkRhdGFiYXNlOwogCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KIHB1YmxpYyBjbGFzcyBCcm93c2VyIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HVEFHID0gImJyb3dzZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIEJPT0tNQVJLU19VUkkgPQotICAgICAgICBVcmkucGFyc2UoImNvbnRlbnQ6Ly9icm93c2VyL2Jvb2ttYXJrcyIpOworCisgICAgLyoqCisgICAgICogQSB0YWJsZSBjb250YWluaW5nIGJvdGggYm9va21hcmtzIGFuZCBoaXN0b3J5IGl0ZW1zLiBUaGUgY29sdW1ucyBvZiB0aGUgdGFibGUgYXJlIGRlZmluZWQgaW4KKyAgICAgKiB7QGxpbmsgQm9va21hcmtDb2x1bW5zfS4gUmVhZGluZyB0aGlzIHRhYmxlIHJlcXVpcmVzIHRoZQorICAgICAqIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jUkVBRF9ISVNUT1JZX0JPT0tNQVJLU30gcGVybWlzc2lvbiBhbmQgd3JpdGluZyB0byBpdAorICAgICAqIHJlcXVpcmVzIHRoZSB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1dSSVRFX0hJU1RPUllfQk9PS01BUktTfSBwZXJtaXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIEJPT0tNQVJLU19VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly9icm93c2VyL2Jvb2ttYXJrcyIpOwogCiAgICAgLyoqCiAgICAgICogVGhlIG5hbWUgb2YgZXh0cmEgZGF0YSB3aGVuIHN0YXJ0aW5nIEJyb3dzZXIgd2l0aCBBQ1RJT05fVklFVyBvcgpAQCAtNDksMTIgKzU3LDExIEBACiAgICAgICogYXBwbGljYXRpb24uCiAgICAgICogPHA+CiAgICAgICogVGhlIHZhbHVlIGlzIGEgdW5pcXVlIGlkZW50aWZpY2F0aW9uIHN0cmluZyB0aGF0IHdpbGwgYmUgdXNlZCB0bwotICAgICAqIGluZGVudGlmeSB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbi4gVGhlIEJyb3dzZXIgd2lsbCBhdHRlbXB0IHRvIHJldXNlIHRoZQorICAgICAqIGlkZW50aWZ5IHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLiBUaGUgQnJvd3NlciB3aWxsIGF0dGVtcHQgdG8gcmV1c2UgdGhlCiAgICAgICogc2FtZSB3aW5kb3cgZWFjaCB0aW1lIHRoZSBhcHBsaWNhdGlvbiBsYXVuY2hlcyB0aGUgQnJvd3NlciB3aXRoIHRoZSBzYW1lCiAgICAgICogaWRlbnRpZmllci4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9BUFBMSUNBVElPTl9JRCA9Ci0gICAgICAgICJjb20uYW5kcm9pZC5icm93c2VyLmFwcGxpY2F0aW9uX2lkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9BUFBMSUNBVElPTl9JRCA9ICJjb20uYW5kcm9pZC5icm93c2VyLmFwcGxpY2F0aW9uX2lkIjsKIAogICAgIC8qKgogICAgICAqIFRoZSBuYW1lIG9mIHRoZSBleHRyYSBkYXRhIGluIHRoZSBWSUVXIGludGVudC4gVGhlIGRhdGEgYXJlIGtleS92YWx1ZQpAQCAtNjgsMTAgKzc1LDE3IEBACiAgICAgLyogaWYgeW91IGNoYW5nZSBjb2x1bW4gb3JkZXIgeW91IG11c3QgYWxzbyBjaGFuZ2UgaW5kaWNlcwogICAgICAgIGJlbG93ICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBISVNUT1JZX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBCb29rbWFya0NvbHVtbnMuX0lELCBCb29rbWFya0NvbHVtbnMuVVJMLCBCb29rbWFya0NvbHVtbnMuVklTSVRTLAotICAgICAgICBCb29rbWFya0NvbHVtbnMuREFURSwgQm9va21hcmtDb2x1bW5zLkJPT0tNQVJLLCBCb29rbWFya0NvbHVtbnMuVElUTEUsCi0gICAgICAgIEJvb2ttYXJrQ29sdW1ucy5GQVZJQ09OLCBCb29rbWFya0NvbHVtbnMuVEhVTUJOQUlMLAotICAgICAgICBCb29rbWFya0NvbHVtbnMuVE9VQ0hfSUNPTiwgQm9va21hcmtDb2x1bW5zLlVTRVJfRU5URVJFRCB9OworICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLl9JRCwgLy8gMAorICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLlVSTCwgLy8gMQorICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLlZJU0lUUywgLy8gMgorICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLkRBVEUsIC8vIDMKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5CT09LTUFSSywgLy8gNAorICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLlRJVExFLCAvLyA1CisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuRkFWSUNPTiwgLy8gNgorICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLlRIVU1CTkFJTCwgLy8gNworICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLlRPVUNIX0lDT04sIC8vIDgKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5VU0VSX0VOVEVSRUQsIC8vIDkKKyAgICB9OwogCiAgICAgLyogdGhlc2UgaW5kaWNlcyBkZXBlbmRlbnQgb24gSElTVE9SWV9QUk9KRUNUSU9OICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElTVE9SWV9QUk9KRUNUSU9OX0lEX0lOREVYID0gMDsKQEAgLTkyLDE5ICsxMDYsMzMgQEAKIAogICAgIC8qIGNvbHVtbnMgbmVlZGVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHRydW5jYXRlIGhpc3RvcnkgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRSVU5DQVRFX0hJU1RPUllfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgIEJvb2ttYXJrQ29sdW1ucy5fSUQsIEJvb2ttYXJrQ29sdW1ucy5EQVRFLCB9OworICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLl9JRCwKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5EQVRFLAorICAgIH07CisKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUlVOQ0FURV9ISVNUT1JZX1BST0pFQ1RJT05fSURfSU5ERVggPSAwOwogCiAgICAgLyogdHJ1bmNhdGUgdGhpcyBtYW55IGhpc3RvcnkgaXRlbXMgYXQgYSB0aW1lICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJVTkNBVEVfTl9PTERFU1QgPSA1OwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgU0VBUkNIRVNfVVJJID0KLSAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vYnJvd3Nlci9zZWFyY2hlcyIpOworICAgIC8qKgorICAgICAqIEEgdGFibGUgY29udGFpbmluZyBhIGxvZyBvZiBicm93c2VyIHNlYXJjaGVzLiBUaGUgY29sdW1ucyBvZiB0aGUgdGFibGUgYXJlIGRlZmluZWQgaW4KKyAgICAgKiB7QGxpbmsgU2VhcmNoQ29sdW1uc30uIFJlYWRpbmcgdGhpcyB0YWJsZSByZXF1aXJlcyB0aGUKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1JFQURfSElTVE9SWV9CT09LTUFSS1N9IHBlcm1pc3Npb24gYW5kIHdyaXRpbmcgdG8gaXQKKyAgICAgKiByZXF1aXJlcyB0aGUge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNXUklURV9ISVNUT1JZX0JPT0tNQVJLU30gcGVybWlzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBTRUFSQ0hFU19VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly9icm93c2VyL3NlYXJjaGVzIik7CiAKLSAgICAvKiBpZiB5b3UgY2hhbmdlIGNvbHVtbiBvcmRlciB5b3UgbXVzdCBhbHNvIGNoYW5nZSBpbmRpY2VzCi0gICAgICAgYmVsb3cgKi8KKyAgICAvKioKKyAgICAgKiBBIHByb2plY3Rpb24gb2Yge0BsaW5rICNTRUFSQ0hFU19VUkl9IHRoYXQgY29udGFpbnMge0BsaW5rIFNlYXJjaENvbHVtbnMjX0lEfSwKKyAgICAgKiB7QGxpbmsgU2VhcmNoQ29sdW1ucyNTRUFSQ0h9LCBhbmQge0BsaW5rIFNlYXJjaENvbHVtbnMjREFURX0uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTRUFSQ0hFU19QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgU2VhcmNoQ29sdW1ucy5fSUQsIFNlYXJjaENvbHVtbnMuU0VBUkNILCBTZWFyY2hDb2x1bW5zLkRBVEUgfTsKKyAgICAgICAgICAgIC8vIGlmIHlvdSBjaGFuZ2UgY29sdW1uIG9yZGVyIHlvdSBtdXN0IGFsc28gY2hhbmdlIGluZGljZXMgYmVsb3cKKyAgICAgICAgICAgIFNlYXJjaENvbHVtbnMuX0lELCAvLyAwCisgICAgICAgICAgICBTZWFyY2hDb2x1bW5zLlNFQVJDSCwgLy8gMQorICAgICAgICAgICAgU2VhcmNoQ29sdW1ucy5EQVRFLCAvLyAyCisgICAgfTsKIAogICAgIC8qIHRoZXNlIGluZGljZXMgZGVwZW5kZW50IG9uIFNFQVJDSEVTX1BST0pFQ1RJT04gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUFSQ0hFU19QUk9KRUNUSU9OX1NFQVJDSF9JTkRFWCA9IDE7CkBAIC0xMjEsOSArMTQ5LDEwIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9ISVNUT1JZX0NPVU5UID0gMjUwOwogCiAgICAgLyoqCi0gICAgICogIE9wZW4gdGhlIEFkZEJvb2ttYXJrIGFjdGl2aXR5IHRvIHNhdmUgYSBib29rbWFyay4gIExhdW5jaCB3aXRoCi0gICAgICogIGFuZC9vciB1cmwsIHdoaWNoIGNhbiBiZSBlZGl0ZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHNhdmluZy4KLSAgICAgKiAgQHBhcmFtIGMgICAgICAgIENvbnRleHQgdXNlZCB0byBsYXVuY2ggdGhlIEFkZEJvb2ttYXJrIGFjdGl2aXR5LgorICAgICAqICBPcGVuIGFuIGFjdGl2aXR5IHRvIHNhdmUgYSBib29rbWFyay4gTGF1bmNoIHdpdGggYSB0aXRsZQorICAgICAqICBhbmQvb3IgYSB1cmwsIGJvdGggb2Ygd2hpY2ggY2FuIGJlIGVkaXRlZCBieSB0aGUgdXNlciBiZWZvcmUgc2F2aW5nLgorICAgICAqCisgICAgICogIEBwYXJhbSBjICAgICAgICBDb250ZXh0IHVzZWQgdG8gbGF1bmNoIHRoZSBhY3Rpdml0eSB0byBhZGQgYSBib29rbWFyay4KICAgICAgKiAgQHBhcmFtIHRpdGxlICAgIFRpdGxlIGZvciB0aGUgYm9va21hcmsuIENhbiBiZSBudWxsIG9yIGVtcHR5IHN0cmluZy4KICAgICAgKiAgQHBhcmFtIHVybCAgICAgIFVybCBmb3IgdGhlIGJvb2ttYXJrLiBDYW4gYmUgbnVsbCBvciBlbXB0eSBzdHJpbmcuCiAgICAgICovCkBAIC0xNTIsOCArMTgxLDE1IEBACiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhUUkFfU0hBUkVfRkFWSUNPTiA9ICJzaGFyZV9mYXZpY29uIjsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZW5kU3RyaW5nKENvbnRleHQgYywgU3RyaW5nIHMpIHsKLSAgICAgICAgc2VuZFN0cmluZyhjLCBzLCBjLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zZW5kVGV4dCkpOworICAgIC8qKgorICAgICAqIFNlbmRzIHRoZSBnaXZlbiBzdHJpbmcgdXNpbmcgYW4gSW50ZW50IHdpdGgge0BsaW5rIEludGVudCNBQ1RJT05fU0VORH0gYW5kIGEgbWltZSB0eXBlCisgICAgICogb2YgdGV4dC9wbGFpbi4gVGhlIHN0cmluZyBpcyBwdXQgaW50byB7QGxpbmsgSW50ZW50I0VYVFJBX1RFWFR9LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgdXNlZCB0byBzdGFydCB0aGUgYWN0aXZpdHkKKyAgICAgKiBAcGFyYW0gc3RyaW5nIHRoZSBzdHJpbmcgdG8gc2VuZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZW5kU3RyaW5nKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHN0cmluZykgeworICAgICAgICBzZW5kU3RyaW5nKGNvbnRleHQsIHN0cmluZywgY29udGV4dC5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuc2VuZFRleHQpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE3NCw0OCArMjEwLDQ5IEBACiAgICAgICAgIHNlbmQucHV0RXh0cmEoSW50ZW50LkVYVFJBX1RFWFQsIHN0cmluZ1RvU2VuZCk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGMuc3RhcnRBY3Rpdml0eShJbnRlbnQuY3JlYXRlQ2hvb3NlcihzZW5kLCBjaG9vc2VyRGlhbG9nVGl0bGUpKTsKKyAgICAgICAgICAgIEludGVudCBpID0gSW50ZW50LmNyZWF0ZUNob29zZXIoc2VuZCwgY2hvb3NlckRpYWxvZ1RpdGxlKTsKKyAgICAgICAgICAgIC8vIEluIGNhc2UgdGhpcyBpcyBjYWxsZWQgZnJvbSBvdXRzaWRlIGFuIEFjdGl2aXR5CisgICAgICAgICAgICBpLnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgICAgIGMuc3RhcnRBY3Rpdml0eShpKTsKICAgICAgICAgfSBjYXRjaChhbmRyb2lkLmNvbnRlbnQuQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgLy8gaWYgbm8gYXBwIGhhbmRsZXMgaXQsIGRvIG5vdGhpbmcKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqICBSZXR1cm4gYSBjdXJzb3IgcG9pbnRpbmcgdG8gYSBsaXN0IG9mIGFsbCB0aGUgYm9va21hcmtzLgorICAgICAqICBSZXR1cm4gYSBjdXJzb3IgcG9pbnRpbmcgdG8gYSBsaXN0IG9mIGFsbCB0aGUgYm9va21hcmtzLiBUaGUgY3Vyc29yIHdpbGwgaGF2ZSBhIHNpbmdsZQorICAgICAqICBjb2x1bW4sIHtAbGluayBCb29rbWFya0NvbHVtbnMjVVJMfS4KKyAgICAgKiAgPHA+CiAgICAgICogIFJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jUkVBRF9ISVNUT1JZX0JPT0tNQVJLU30KKyAgICAgKgogICAgICAqICBAcGFyYW0gY3IgICBUaGUgQ29udGVudFJlc29sdmVyIHVzZWQgdG8gYWNjZXNzIHRoZSBkYXRhYmFzZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBnZXRBbGxCb29rbWFya3MoQ29udGVudFJlc29sdmVyIGNyKSB0aHJvd3MgCiAgICAgICAgICAgICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3IucXVlcnkoQk9PS01BUktTX1VSSSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBCb29rbWFya0NvbHVtbnMuVVJMIH0sIAotICAgICAgICAgICAgICAgICJib29rbWFyayA9IDEiLCBudWxsLCBudWxsKTsKKyAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KEJvb2ttYXJrcy5DT05URU5UX1VSSSwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBCb29rbWFya3MuVVJMIH0sIAorICAgICAgICAgICAgICAgIEJvb2ttYXJrcy5JU19GT0xERVIgKyAiID0gMCIsIG51bGwsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqICBSZXR1cm4gYSBjdXJzb3IgcG9pbnRpbmcgdG8gYSBsaXN0IG9mIGFsbCB2aXNpdGVkIHNpdGUgdXJscy4KKyAgICAgKiAgUmV0dXJuIGEgY3Vyc29yIHBvaW50aW5nIHRvIGEgbGlzdCBvZiBhbGwgdmlzaXRlZCBzaXRlIHVybHMuIFRoZSBjdXJzb3Igd2lsbAorICAgICAqICBoYXZlIGEgc2luZ2xlIGNvbHVtbiwge0BsaW5rIEJvb2ttYXJrQ29sdW1ucyNVUkx9LgorICAgICAqICA8cD4KICAgICAgKiAgUmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNSRUFEX0hJU1RPUllfQk9PS01BUktTfQorICAgICAqCiAgICAgICogIEBwYXJhbSBjciAgIFRoZSBDb250ZW50UmVzb2x2ZXIgdXNlZCB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIGdldEFsbFZpc2l0ZWRVcmxzKENvbnRlbnRSZXNvbHZlciBjcikgdGhyb3dzCiAgICAgICAgICAgICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3IucXVlcnkoQk9PS01BUktTX1VSSSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBCb29rbWFya0NvbHVtbnMuVVJMIH0sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICByZXR1cm4gY3IucXVlcnkoSGlzdG9yeS5DT05URU5UX1VSSSwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBIaXN0b3J5LlVSTCB9LCBudWxsLCBudWxsLCBudWxsKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGFkZE9yVXJsRXF1YWxzKFN0cmluZ0J1aWxkZXIgc2IpIHsKICAgICAgICAgc2IuYXBwZW5kKCIgT1IgIiArIEJvb2ttYXJrQ29sdW1ucy5VUkwgKyAiID0gIik7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogIFJldHVybiBhIEN1cnNvciB3aXRoIGFsbCBoaXN0b3J5L2Jvb2ttYXJrcyB0aGF0IGFyZSBzaW1pbGFyIHRvIHVybCwKLSAgICAgKiAgd2hlcmUgc2ltaWxhciBtZWFucyAnaHR0cChzKTovLycgYW5kICd3d3cuJyBhcmUgb3B0aW9uYWwsIGJ1dCB0aGUgcmVzdAotICAgICAqICBvZiB0aGUgdXJsIGlzIHRoZSBzYW1lLgotICAgICAqICBAcGFyYW0gY3IgICBUaGUgQ29udGVudFJlc29sdmVyIHVzZWQgdG8gYWNjZXNzIHRoZSBkYXRhYmFzZS4KLSAgICAgKiAgQHBhcmFtIHVybCAgVGhlIHVybCB0byBjb21wYXJlIHRvLgotICAgICAqICBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIGdldFZpc2l0ZWRMaWtlKENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nIHVybCkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEN1cnNvciBnZXRWaXNpdGVkTGlrZShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZyB1cmwpIHsKICAgICAgICAgYm9vbGVhbiBzZWN1cmUgPSBmYWxzZTsKICAgICAgICAgU3RyaW5nIGNvbXBhcmVTdHJpbmcgPSB1cmw7CiAgICAgICAgIGlmIChjb21wYXJlU3RyaW5nLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSkgewpAQCAtMjI5LDE0ICsyNjYsMTQgQEAKICAgICAgICAgfQogICAgICAgICBTdHJpbmdCdWlsZGVyIHdoZXJlQ2xhdXNlID0gbnVsbDsKICAgICAgICAgaWYgKHNlY3VyZSkgewotICAgICAgICAgICAgd2hlcmVDbGF1c2UgPSBuZXcgU3RyaW5nQnVpbGRlcihCb29rbWFya0NvbHVtbnMuVVJMICsgIiA9ICIpOworICAgICAgICAgICAgd2hlcmVDbGF1c2UgPSBuZXcgU3RyaW5nQnVpbGRlcihCb29rbWFya3MuVVJMICsgIiA9ICIpOwogICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5hcHBlbmRFc2NhcGVkU1FMU3RyaW5nKHdoZXJlQ2xhdXNlLAogICAgICAgICAgICAgICAgICAgICAiaHR0cHM6Ly8iICsgY29tcGFyZVN0cmluZyk7CiAgICAgICAgICAgICBhZGRPclVybEVxdWFscyh3aGVyZUNsYXVzZSk7CiAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmFwcGVuZEVzY2FwZWRTUUxTdHJpbmcod2hlcmVDbGF1c2UsCiAgICAgICAgICAgICAgICAgICAgICJodHRwczovL3d3dy4iICsgY29tcGFyZVN0cmluZyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3aGVyZUNsYXVzZSA9IG5ldyBTdHJpbmdCdWlsZGVyKEJvb2ttYXJrQ29sdW1ucy5VUkwgKyAiID0gIik7CisgICAgICAgICAgICB3aGVyZUNsYXVzZSA9IG5ldyBTdHJpbmdCdWlsZGVyKEJvb2ttYXJrcy5VUkwgKyAiID0gIik7CiAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmFwcGVuZEVzY2FwZWRTUUxTdHJpbmcod2hlcmVDbGF1c2UsCiAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVTdHJpbmcpOwogICAgICAgICAgICAgYWRkT3JVcmxFcXVhbHMod2hlcmVDbGF1c2UpOwpAQCAtMjUwLDcgKzI4Nyw3IEBACiAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmFwcGVuZEVzY2FwZWRTUUxTdHJpbmcod2hlcmVDbGF1c2UsCiAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vIiArIHd3d1N0cmluZyk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KEJPT0tNQVJLU19VUkksIEhJU1RPUllfUFJPSkVDVElPTiwKKyAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KEhpc3RvcnkuQ09OVEVOVF9VUkksIG5ldyBTdHJpbmdbXSB7IEhpc3RvcnkuX0lELCBIaXN0b3J5LlZJU0lUUyB9LAogICAgICAgICAgICAgICAgIHdoZXJlQ2xhdXNlLnRvU3RyaW5nKCksIG51bGwsIG51bGwpOwogICAgIH0KIApAQCAtMjY2LDI2ICszMDMsMjQgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgdXBkYXRlVmlzaXRlZEhpc3RvcnkoQ29udGVudFJlc29sdmVyIGNyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsLCBib29sZWFuIHJlYWwpIHsKLSAgICAgICAgbG9uZyBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKKyAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgQ3Vyc29yIGMgPSBudWxsOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgYyA9IGdldFZpc2l0ZWRMaWtlKGNyLCB1cmwpOwogICAgICAgICAgICAgLyogV2Ugc2hvdWxkIG9ubHkgZ2V0IG9uZSBhbnN3ZXIgdGhhdCBpcyBleGFjdGx5IHRoZSBzYW1lLiAqLwogICAgICAgICAgICAgaWYgKGMubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgbWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CiAgICAgICAgICAgICAgICAgaWYgKHJlYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuVklTSVRTLCBjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEludChISVNUT1JZX1BST0pFQ1RJT05fVklTSVRTX0lOREVYKSArIDEpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEhpc3RvcnkuVklTSVRTLCBjLmdldEludCgxKSArIDEpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLlVTRVJfRU5URVJFRCwgMSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoSGlzdG9yeS5VU0VSX0VOVEVSRUQsIDEpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5EQVRFLCBub3cpOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHByb2plY3Rpb24gPSBuZXcgU3RyaW5nW10KLSAgICAgICAgICAgICAgICAgICAgICAgIHsgSW50ZWdlci52YWx1ZU9mKGMuZ2V0SW50KDApKS50b1N0cmluZygpIH07Ci0gICAgICAgICAgICAgICAgY3IudXBkYXRlKEJPT0tNQVJLU19VUkksIG1hcCwgIl9pZCA9ID8iLCBwcm9qZWN0aW9uKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEhpc3RvcnkuREFURV9MQVNUX1ZJU0lURUQsIG5vdyk7CisgICAgICAgICAgICAgICAgY3IudXBkYXRlKENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKEhpc3RvcnkuQ09OVEVOVF9VUkksIGMuZ2V0TG9uZygwKSksCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsIG51bGwsIG51bGwpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB0cnVuY2F0ZUhpc3RvcnkoY3IpOwotICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgbWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CiAgICAgICAgICAgICAgICAgaW50IHZpc2l0czsKICAgICAgICAgICAgICAgICBpbnQgdXNlcl9lbnRlcmVkOwogICAgICAgICAgICAgICAgIGlmIChyZWFsKSB7CkBAIC0yOTUsMTQgKzMzMCwxMyBAQAogICAgICAgICAgICAgICAgICAgICB2aXNpdHMgPSAwOwogICAgICAgICAgICAgICAgICAgICB1c2VyX2VudGVyZWQgPSAxOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5VUkwsIHVybCk7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuVklTSVRTLCB2aXNpdHMpOwotICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLkRBVEUsIG5vdyk7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuQk9PS01BUkssIDApOwotICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLlRJVExFLCB1cmwpOwotICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLkNSRUFURUQsIDApOwotICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLlVTRVJfRU5URVJFRCwgdXNlcl9lbnRlcmVkKTsKLSAgICAgICAgICAgICAgICBjci5pbnNlcnQoQk9PS01BUktTX1VSSSwgbWFwKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEhpc3RvcnkuVVJMLCB1cmwpOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoSGlzdG9yeS5WSVNJVFMsIHZpc2l0cyk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChIaXN0b3J5LkRBVEVfTEFTVF9WSVNJVEVELCBub3cpOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoSGlzdG9yeS5USVRMRSwgdXJsKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEhpc3RvcnkuREFURV9DUkVBVEVELCAwKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEhpc3RvcnkuVVNFUl9FTlRFUkVELCB1c2VyX2VudGVyZWQpOworICAgICAgICAgICAgICAgIGNyLmluc2VydChIaXN0b3J5LkNPTlRFTlRfVVJJLCB2YWx1ZXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAidXBkYXRlVmlzaXRlZEhpc3RvcnkiLCBlKTsKQEAgLTMyMiwxMCArMzU2LDEwIEBACiAgICAgICAgIFN0cmluZ1tdIHN0ciA9IG51bGw7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTdHJpbmdbXSBwcm9qZWN0aW9uID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAidXJsIgorICAgICAgICAgICAgICAgICAgICBIaXN0b3J5LlVSTCwKICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBjID0gY3IucXVlcnkoQk9PS01BUktTX1VSSSwgcHJvamVjdGlvbiwgInZpc2l0cyA+IDAiLCBudWxsLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIGMgPSBjci5xdWVyeShIaXN0b3J5LkNPTlRFTlRfVVJJLCBwcm9qZWN0aW9uLCBIaXN0b3J5LlZJU0lUUyArICIgPiAwIiwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBpZiAoYyA9PSBudWxsKSByZXR1cm4gbmV3IFN0cmluZ1swXTsKICAgICAgICAgICAgIHN0ciA9IG5ldyBTdHJpbmdbYy5nZXRDb3VudCgpXTsKICAgICAgICAgICAgIGludCBpID0gMDsKICAgICAgICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgewpAQCAtMzUzLDMxICszODcsMjkgQEAKICAgICAgKiBAcGFyYW0gY3IgVGhlIENvbnRlbnRSZXNvbHZlciB1c2VkIHRvIGFjY2VzcyB0aGUgZGF0YWJhc2UuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHRydW5jYXRlSGlzdG9yeShDb250ZW50UmVzb2x2ZXIgY3IpIHsKLSAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICAvLyBUT0RPIG1ha2UgYSBzaW5nbGUgcmVxdWVzdCB0byB0aGUgcHJvdmlkZXIgdG8gZG8gdGhpcyBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvbgorICAgICAgICBDdXJzb3IgY3Vyc29yID0gbnVsbDsKICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIAogICAgICAgICAgICAgLy8gU2VsZWN0IG5vbi1ib29rbWFyayBoaXN0b3J5LCBvcmRlcmVkIGJ5IGRhdGUKLSAgICAgICAgICAgIGMgPSBjci5xdWVyeSgKLSAgICAgICAgICAgICAgICAgICAgQk9PS01BUktTX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgVFJVTkNBVEVfSElTVE9SWV9QUk9KRUNUSU9OLAotICAgICAgICAgICAgICAgICAgICAiYm9va21hcmsgPSAwIiwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLkRBVEUpOwotICAgICAgICAgICAgLy8gTG9nLnYoTE9HVEFHLCAiaGlzdG9yeSBjb3VudCAiICsgYy5jb3VudCgpKTsKLSAgICAgICAgICAgIGlmIChjLm1vdmVUb0ZpcnN0KCkgJiYgYy5nZXRDb3VudCgpID49IE1BWF9ISVNUT1JZX0NPVU5UKSB7CisgICAgICAgICAgICBjdXJzb3IgPSBjci5xdWVyeShIaXN0b3J5LkNPTlRFTlRfVVJJLAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBIaXN0b3J5Ll9JRCwgSGlzdG9yeS5VUkwsIEhpc3RvcnkuREFURV9MQVNUX1ZJU0lURUQgfSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgSGlzdG9yeS5EQVRFX0xBU1RfVklTSVRFRCArICIgQVNDIik7CisKKyAgICAgICAgICAgIGlmIChjdXJzb3IubW92ZVRvRmlyc3QoKSAmJiBjdXJzb3IuZ2V0Q291bnQoKSA+PSBNQVhfSElTVE9SWV9DT1VOVCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFdlYkljb25EYXRhYmFzZSBpY29uRGIgPSBXZWJJY29uRGF0YWJhc2UuZ2V0SW5zdGFuY2UoKTsKICAgICAgICAgICAgICAgICAvKiBlbGltaW5hdGUgb2xkZXN0IGhpc3RvcnkgaXRlbXMgKi8KICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFRSVU5DQVRFX05fT0xERVNUOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTG9nLnYoTE9HVEFHLCAidHJ1bmNhdGUgaGlzdG9yeSAiICsKLSAgICAgICAgICAgICAgICAgICAgLy8gYy5nZXRJbnQoVFJVTkNBVEVfSElTVE9SWV9QUk9KRUNUSU9OX0lEX0lOREVYKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNyLmRlbGV0ZShCT09LTUFSS1NfVVJJLCAiX2lkID0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5nZXRJbnQoVFJVTkNBVEVfSElTVE9SWV9QUk9KRUNUSU9OX0lEX0lOREVYKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjLm1vdmVUb05leHQoKSkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNyLmRlbGV0ZShDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChIaXN0b3J5LkNPTlRFTlRfVVJJLCBjdXJzb3IuZ2V0TG9uZygwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGljb25EYi5yZWxlYXNlSWNvbkZvclBhZ2VVcmwoY3Vyc29yLmdldFN0cmluZygxKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLm1vdmVUb05leHQoKSkgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAidHJ1bmNhdGVIaXN0b3J5IiwgZSk7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIGN1cnNvci5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zODgsMjMgKzQyMCwxNyBAQAogICAgICAqIEByZXR1cm4gYm9vbGVhbiAgVHJ1ZSBpZiB0aGUgaGlzdG9yeSBjYW4gYmUgY2xlYXJlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gY2FuQ2xlYXJIaXN0b3J5KENvbnRlbnRSZXNvbHZlciBjcikgewotICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIEN1cnNvciBjdXJzb3IgPSBudWxsOwogICAgICAgICBib29sZWFuIHJldCA9IGZhbHNlOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KAotICAgICAgICAgICAgICAgIEJPT0tNQVJLU19VUkksCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZyBbXSB7IEJvb2ttYXJrQ29sdW1ucy5fSUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuQk9PS01BUkssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5WSVNJVFMgfSwKLSAgICAgICAgICAgICAgICAiYm9va21hcmsgPSAwIE9SIHZpc2l0cyA+IDAiLCAKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIG51bGwKLSAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgcmV0ID0gYy5tb3ZlVG9GaXJzdCgpOworICAgICAgICAgICAgY3Vyc29yID0gY3IucXVlcnkoSGlzdG9yeS5DT05URU5UX1VSSSwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nIFtdIHsgSGlzdG9yeS5fSUQsIEhpc3RvcnkuVklTSVRTIH0sCisgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICByZXQgPSBjdXJzb3IuZ2V0Q291bnQoKSA+IDA7CiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJjYW5DbGVhckhpc3RvcnkiLCBlKTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgY3Vyc29yLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CkBAIC00MjAsNjcgKzQ0NiwzNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byBkZWxldGUgYWxsIGhpc3RvcnkgaXRlbXMgYW5kIHJldmVydCBhbGwKLSAgICAgKiBib29rbWFya3MgdG8gemVybyB2aXNpdHMgd2hpY2ggbWVldCB0aGUgY3JpdGVyaWEgcHJvdmlkZWQuCi0gICAgICogIFJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jUkVBRF9ISVNUT1JZX0JPT0tNQVJLU30KLSAgICAgKiAgUmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNXUklURV9ISVNUT1JZX0JPT0tNQVJLU30KKyAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZGVsZXRlIGFsbCBoaXN0b3J5IGl0ZW1zIGFuZCByZWxlYXNlIHRoZSBpY29ucyBmb3IgdGhlbSBpbiB0aGUKKyAgICAgKiB7QGxpbmsgV2ViSWNvbkRhdGFiYXNlfS4KKyAgICAgKgorICAgICAqIFJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jUkVBRF9ISVNUT1JZX0JPT0tNQVJLU30KKyAgICAgKiBSZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1dSSVRFX0hJU1RPUllfQk9PS01BUktTfQorICAgICAqCiAgICAgICogQHBhcmFtIGNyICAgVGhlIENvbnRlbnRSZXNvbHZlciB1c2VkIHRvIGFjY2VzcyB0aGUgZGF0YWJhc2UuCiAgICAgICogQHBhcmFtIHdoZXJlQ2xhdXNlICAgU3RyaW5nIHRvIGxpbWl0IHRoZSBpdGVtcyBhZmZlY3RlZC4KICAgICAgKiAgICAgICAgICAgICAgICAgICAgICBudWxsIG1lYW5zIGFsbCBpdGVtcy4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGRlbGV0ZUhpc3RvcnlXaGVyZShDb250ZW50UmVzb2x2ZXIgY3IsCi0gICAgICAgICAgICBTdHJpbmcgd2hlcmVDbGF1c2UpIHsKLSAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgZGVsZXRlSGlzdG9yeVdoZXJlKENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nIHdoZXJlQ2xhdXNlKSB7CisgICAgICAgIEN1cnNvciBjdXJzb3IgPSBudWxsOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KEJPT0tNQVJLU19VUkksCi0gICAgICAgICAgICAgICAgSElTVE9SWV9QUk9KRUNUSU9OLAotICAgICAgICAgICAgICAgIHdoZXJlQ2xhdXNlLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICBpZiAoYy5tb3ZlVG9GaXJzdCgpKSB7CisgICAgICAgICAgICBjdXJzb3IgPSBjci5xdWVyeShIaXN0b3J5LkNPTlRFTlRfVVJJLCBuZXcgU3RyaW5nW10geyBIaXN0b3J5LlVSTCB9LCB3aGVyZUNsYXVzZSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBpZiAoY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBXZWJJY29uRGF0YWJhc2UgaWNvbkRiID0gV2ViSWNvbkRhdGFiYXNlLmdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgLyogRGVsZXRlIGZhdmljb25zLCBhbmQgcmV2ZXJ0IGJvb2ttYXJrcyB3aGljaCBoYXZlIGJlZW4gdmlzaXRlZAotICAgICAgICAgICAgICAgICAqIHRvIHNpbXBseSBib29rbWFya3MuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlyc3RUaW1lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBjLmdldFN0cmluZyhISVNUT1JZX1BST0pFQ1RJT05fVVJMX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Jvb2ttYXJrID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGMuZ2V0SW50KEhJU1RPUllfUFJPSkVDVElPTl9CT09LTUFSS19JTkRFWCkgPT0gMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQm9va21hcmspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFRpbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFRpbWUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgT1IgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiggX2lkID0gIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYy5nZXRJbnQoMCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgKSIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkRiLnJlbGVhc2VJY29uRm9yUGFnZVVybCh1cmwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpOworICAgICAgICAgICAgICAgICAgICAvLyBEZWxldGUgZmF2aWNvbnMKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBkb24ndCByZWxlYXNlIGlmIHRoZSBVUkwgaXMgYm9va21hcmtlZAorICAgICAgICAgICAgICAgICAgICBpY29uRGIucmVsZWFzZUljb25Gb3JQYWdlVXJsKGN1cnNvci5nZXRTdHJpbmcoMCkpOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGN1cnNvci5tb3ZlVG9OZXh0KCkpOwogCi0gICAgICAgICAgICAgICAgaWYgKCFmaXJzdFRpbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyBtYXAgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5WSVNJVFMsIDApOwotICAgICAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5EQVRFLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgLyogRklYTUU6IFNob3VsZCBJIGFsc28gcmVtb3ZlIHRoZSB0aXRsZT8gKi8KLSAgICAgICAgICAgICAgICAgICAgY3IudXBkYXRlKEJPT0tNQVJLU19VUkksIG1hcCwgc2IudG9TdHJpbmcoKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGRlbGV0ZVdoZXJlQ2xhdXNlID0gQm9va21hcmtDb2x1bW5zLkJPT0tNQVJLICsgIiA9IDAiOwotICAgICAgICAgICAgICAgIGlmICh3aGVyZUNsYXVzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZVdoZXJlQ2xhdXNlICs9ICIgQU5EICIgKyB3aGVyZUNsYXVzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3IuZGVsZXRlKEJPT0tNQVJLU19VUkksIGRlbGV0ZVdoZXJlQ2xhdXNlLCBudWxsKTsKKyAgICAgICAgICAgICAgICBjci5kZWxldGUoSGlzdG9yeS5DT05URU5UX1VSSSwgd2hlcmVDbGF1c2UsIG51bGwpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiZGVsZXRlSGlzdG9yeVdoZXJlIiwgZSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIGN1cnNvci5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC01MjAsMTAgKzUxNSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGRlbGV0ZUZyb21IaXN0b3J5KENvbnRlbnRSZXNvbHZlciBjciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKEJvb2ttYXJrQ29sdW1ucy5VUkwgKyAiID0gIik7Ci0gICAgICAgIERhdGFiYXNlVXRpbHMuYXBwZW5kRXNjYXBlZFNRTFN0cmluZyhzYiwgdXJsKTsKLSAgICAgICAgU3RyaW5nIG1hdGNoZXNVcmwgPSBzYi50b1N0cmluZygpOwotICAgICAgICBkZWxldGVIaXN0b3J5V2hlcmUoY3IsIG1hdGNoZXNVcmwpOworICAgICAgICBjci5kZWxldGUoSGlzdG9yeS5DT05URU5UX1VSSSwgSGlzdG9yeS5VUkwgKyAiPT8iLCBuZXcgU3RyaW5nW10geyB1cmwgfSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01MzQsMzAgKzUyNiwxMyBAQAogICAgICAqIEBwYXJhbSBzZWFyY2ggICAgVGhlIHN0cmluZyB0byBhZGQgdG8gdGhlIHNlYXJjaGVzIGRhdGFiYXNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBhZGRTZWFyY2hVcmwoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmcgc2VhcmNoKSB7Ci0gICAgICAgIGxvbmcgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7Ci0gICAgICAgIEN1cnNvciBjID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGMgPSBjci5xdWVyeSgKLSAgICAgICAgICAgICAgICBTRUFSQ0hFU19VUkksCi0gICAgICAgICAgICAgICAgU0VBUkNIRVNfUFJPSkVDVElPTiwKLSAgICAgICAgICAgICAgICBTRUFSQ0hFU19XSEVSRV9DTEFVU0UsCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZyBbXSB7IHNlYXJjaCB9LAotICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBtYXAgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICAgICAgbWFwLnB1dChTZWFyY2hDb2x1bW5zLlNFQVJDSCwgc2VhcmNoKTsKLSAgICAgICAgICAgIG1hcC5wdXQoU2VhcmNoQ29sdW1ucy5EQVRFLCBub3cpOwotICAgICAgICAgICAgLyogV2Ugc2hvdWxkIG9ubHkgZ2V0IG9uZSBhbnN3ZXIgdGhhdCBpcyBleGFjdGx5IHRoZSBzYW1lLiAqLwotICAgICAgICAgICAgaWYgKGMubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgIGNyLnVwZGF0ZShTRUFSQ0hFU19VUkksIG1hcCwgIl9pZCA9ICIgKyBjLmdldEludCgwKSwgbnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNyLmluc2VydChTRUFSQ0hFU19VUkksIG1hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dUQUcsICJhZGRTZWFyY2hVcmwiLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKLSAgICAgICAgfQorICAgICAgICAvLyBUaGUgY29udGVudCBwcm92aWRlciB3aWxsIHRha2UgY2FyZSBvZiB1cGRhdGluZyBleGlzdGluZyBzZWFyY2hlcyBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nCisgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgdmFsdWVzLnB1dChTZWFyY2hlcy5TRUFSQ0gsIHNlYXJjaCk7CisgICAgICAgIHZhbHVlcy5wdXQoU2VhcmNoZXMuREFURSwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICBjci5pbnNlcnQoU2VhcmNoZXMuQ09OVEVOVF9VUkksIHZhbHVlcyk7CiAgICAgfQorCiAgICAgLyoqCiAgICAgICogUmVtb3ZlIGFsbCBzZWFyY2hlcyBmcm9tIHRoZSBzZWFyY2ggZGF0YWJhc2UuCiAgICAgICogIFJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jV1JJVEVfSElTVE9SWV9CT09LTUFSS1N9CkBAIC01NjcsNyArNTQyLDcgQEAKICAgICAgICAgLy8gRklYTUU6IFNob3VsZCB0aGlzIGNsZWFyIHRoZSB1cmxzIHRvIHdoaWNoIHRoZXNlIHNlYXJjaGVzIGxlYWQ/CiAgICAgICAgIC8vIChpLmUuIHJlbW92ZSBnb29nbGUuY29tL3F1ZXJ5PSBibGFoIGJsYWggYmxhaCkKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNyLmRlbGV0ZShTRUFSQ0hFU19VUkksIG51bGwsIG51bGwpOworICAgICAgICAgICAgY3IuZGVsZXRlKFNlYXJjaGVzLkNPTlRFTlRfVVJJLCBudWxsLCBudWxsKTsKICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKExPR1RBRywgImNsZWFyU2VhcmNoZXMiLCBlKTsKICAgICAgICAgfQpAQCAtNTg2LDM1ICs1NjEsOTIgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcmVxdWVzdEFsbEljb25zKENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nIHdoZXJlLAogICAgICAgICAgICAgV2ViSWNvbkRhdGFiYXNlLkljb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBXZWJJY29uRGF0YWJhc2UuZ2V0SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgIC5idWxrUmVxdWVzdEljb25Gb3JQYWdlVXJsKGNyLCB3aGVyZSwgbGlzdGVuZXIpOworICAgICAgICBXZWJJY29uRGF0YWJhc2UuZ2V0SW5zdGFuY2UoKS5idWxrUmVxdWVzdEljb25Gb3JQYWdlVXJsKGNyLCB3aGVyZSwgbGlzdGVuZXIpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbHVtbiBkZWZpbml0aW9ucyBmb3IgdGhlIG1peGVkIGJvb2ttYXJrIGFuZCBoaXN0b3J5IGl0ZW1zIGF2YWlsYWJsZQorICAgICAqIGF0IHtAbGluayAjQk9PS01BUktTX1VSSX0uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCb29rbWFya0NvbHVtbnMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgVVJMIG9mIHRoZSBib29rbWFyayBvciBoaXN0b3J5IGl0ZW0uCisgICAgICAgICAqIDxwPlR5cGU6IFRFWFQgKFVSTCk8L3A+CisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkwgPSAidXJsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG51bWJlciBvZiB0aW1lIHRoZSBpdGVtIGhhcyBiZWVuIHZpc2l0ZWQuCisgICAgICAgICAqIDxwPlR5cGU6IE5VTUJFUjwvcD4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJU0lUUyA9ICJ2aXNpdHMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgaXRlbSB3YXMgbGFzdCB2aXNpdGVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoLgorICAgICAgICAgKiA8cD5UeXBlOiBOVU1CRVIgKGRhdGUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCk8L3A+CisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFID0gImRhdGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGbGFnIGluZGljYXRpbmcgdGhhdCBhbiBpdGVtIGlzIGEgYm9va21hcmsuIEEgdmFsdWUgb2YgMSBpbmRpY2F0ZXMgYSBib29rbWFyaywgYSB2YWx1ZQorICAgICAgICAgKiBvZiAwIGluZGljYXRlcyBhIGhpc3RvcnkgaXRlbS4KKyAgICAgICAgICogPHA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L3A+CisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT09LTUFSSyA9ICJib29rbWFyayI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB1c2VyIHZpc2libGUgdGl0bGUgb2YgdGhlIGJvb2ttYXJrIG9yIGhpc3RvcnkgaXRlbS4KKyAgICAgICAgICogPHA+VHlwZTogVEVYVDwvcD4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gInRpdGxlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRhdGUgdGhlIGl0ZW0gY3JlYXRlZCwgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaC4KKyAgICAgICAgICogPHA+VHlwZTogTlVNQkVSIChkYXRlIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzApPC9wPgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFRCA9ICJjcmVhdGVkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGZhdmljb24gb2YgdGhlIGJvb2ttYXJrLiBNdXN0IGRlY29kZSB2aWEge0BsaW5rIEJpdG1hcEZhY3RvcnkjZGVjb2RlQnl0ZUFycmF5fS4KKyAgICAgICAgICogPHA+VHlwZTogQkxPQiAoaW1hZ2UpPC9wPgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFWSUNPTiA9ICJmYXZpY29uIjsKKwogICAgICAgICAvKioKICAgICAgICAgICogQGhpZGUKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIVU1CTkFJTCA9ICJ0aHVtYm5haWwiOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9VQ0hfSUNPTiA9ICJ0b3VjaF9pY29uIjsKKwogICAgICAgICAvKioKICAgICAgICAgICogQGhpZGUKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfRU5URVJFRCA9ICJ1c2VyX2VudGVyZWQiOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbHVtbiBkZWZpbml0aW9ucyBmb3IgdGhlIHNlYXJjaCBoaXN0b3J5IHRhYmxlLCBhdmFpbGFibGUgYXQge0BsaW5rICNTRUFSQ0hFU19VUkl9LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VhcmNoQ29sdW1ucyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBkZXByZWNhdGVkIE5vdCB1c2VkLgorICAgICAgICAgKi8KKyAgICAgICAgQERlcHJlY2F0ZWQKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMID0gInVybCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB1c2VyIGVudGVyZWQgc2VhcmNoIHRlcm0uCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUFSQ0ggPSAic2VhcmNoIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRhdGUgdGhlIHNlYXJjaCB3YXMgcGVyZm9ybWVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoLgorICAgICAgICAgKiA8cD5UeXBlOiBOVU1CRVIgKGRhdGUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCk8L3A+CisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFID0gImRhdGUiOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXJDb250cmFjdC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQnJvd3NlckNvbnRyYWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiYzQxYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Jyb3dzZXJDb250cmFjdC5qYXZhCkBAIC0wLDAgKzEsNTU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQucHJvdmlkZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlckNsaWVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRVcmlzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEJyb3dzZXJDb250cmFjdCB7CisgICAgLyoqIFRoZSBhdXRob3JpdHkgZm9yIHRoZSBicm93c2VyIHByb3ZpZGVyICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SSVRZID0gImNvbS5hbmRyb2lkLmJyb3dzZXIiOworCisgICAgLyoqIEEgY29udGVudDovLyBzdHlsZSB1cmkgdG8gdGhlIGF1dGhvcml0eSBmb3IgdGhlIGJyb3dzZXIgcHJvdmlkZXIgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBBVVRIT1JJVFlfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSk7CisKKyAgICAvKioKKyAgICAgKiBBbiBvcHRpb25hbCBpbnNlcnQsIHVwZGF0ZSBvciBkZWxldGUgVVJJIHBhcmFtZXRlciB0aGF0IGFsbG93cyB0aGUgY2FsbGVyCisgICAgICogdG8gc3BlY2lmeSB0aGF0IGl0IGlzIGEgc3luYyBhZGFwdGVyLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4gSWYgdHJ1ZQorICAgICAqIHRoZSBkaXJ0eSBmbGFnIGlzIG5vdCBhdXRvbWF0aWNhbGx5IHNldCBhbmQgdGhlICJzeW5jVG9OZXR3b3JrIiBwYXJhbWV0ZXIKKyAgICAgKiBpcyBzZXQgdG8gZmFsc2Ugd2hlbiBjYWxsaW5nCisgICAgICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNub3RpZnlDaGFuZ2UoYW5kcm9pZC5uZXQuVXJpLCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlciwgYm9vbGVhbil9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTExFUl9JU19TWU5DQURBUFRFUiA9ICJjYWxsZXJfaXNfc3luY2FkYXB0ZXIiOworCisgICAgLyoqCisgICAgICogQSBwYXJhbWV0ZXIgZm9yIHVzZSB3aGVuIHF1ZXJ5aW5nIGFueSB0YWJsZSB0aGF0IGFsbG93cyBzcGVjaWZ5aW5nIGEgbGltaXQgb24gdGhlIG51bWJlcgorICAgICAqIG9mIHJvd3MgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fTElNSVQgPSAibGltaXQiOworCisgICAgLyoqCisgICAgICogR2VuZXJpYyBjb2x1bW5zIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gVGhlIHNwZWNpZmljIGZ1bmN0aW9ucyBvZgorICAgICAqIHRoZXNlIGNvbHVtbnMgYXJlIHByaXZhdGUgdG8gdGhlIHN5bmMgYWRhcHRlci4gT3RoZXIgY2xpZW50cyBvZiB0aGUgQVBJCisgICAgICogc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGVpdGhlciByZWFkIG9yIHdyaXRlIHRoZXNlIGNvbHVtbnMuCisgICAgICovCisgICAgaW50ZXJmYWNlIEJhc2VTeW5jQ29sdW1ucyB7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkMxID0gInN5bmMxIjsKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzIgPSAic3luYzIiOworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DMyA9ICJzeW5jMyI7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkM0ID0gInN5bmM0IjsKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzUgPSAic3luYzUiOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIGRlZmluaXRpb25zIGZvciB1c2UgaW4gaW1wbGVtZW50aW5nIGNocm9tZSBib29rbWFya3Mgc3luYyBpbiB0aGUgQm9va21hcmtzIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ2hyb21lU3luY0NvbHVtbnMgeworICAgICAgICBwcml2YXRlIENocm9tZVN5bmNDb2x1bW5zKCkge30KKworICAgICAgICAvKiogVGhlIHNlcnZlciB1bmlxdWUgSUQgZm9yIGFuIGl0ZW0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1VOSVFVRSA9IEJhc2VTeW5jQ29sdW1ucy5TWU5DMzsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT0xERVJfTkFNRV9ST09UID0gImdvb2dsZV9jaHJvbWUiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT0xERVJfTkFNRV9CT09LTUFSS1MgPSAiZ29vZ2xlX2Nocm9tZV9ib29rbWFya3MiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT0xERVJfTkFNRV9CT09LTUFSS1NfQkFSID0gImJvb2ttYXJrX2JhciI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTERFUl9OQU1FX09USEVSX0JPT0tNQVJLUyA9ICJvdGhlcl9ib29rbWFya3MiOworCisgICAgICAgIC8qKiBUaGUgY2xpZW50IHVuaXF1ZSBJRCBmb3IgYW4gaXRlbSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfVU5JUVVFID0gQmFzZVN5bmNDb2x1bW5zLlNZTkM0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbHVtbnMgdGhhdCBhcHBlYXIgd2hlbiBlYWNoIHJvdyBvZiBhIHRhYmxlIGJlbG9uZ3MgdG8gYSBzcGVjaWZpYworICAgICAqIGFjY291bnQsIGluY2x1ZGluZyBzeW5jIGluZm9ybWF0aW9uIHRoYXQgYW4gYWNjb3VudCBtYXkgbmVlZC4KKyAgICAgKi8KKyAgICBpbnRlcmZhY2UgU3luY0NvbHVtbnMgZXh0ZW5kcyBCYXNlU3luY0NvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgaW5zdGFuY2UgdG8gd2hpY2ggdGhpcyByb3cgYmVsb25ncywgd2hpY2ggd2hlbiBwYWlyZWQgd2l0aAorICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfVFlQRX0gaWRlbnRpZmllcyBhIHNwZWNpZmljIGFjY291bnQuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX05BTUUgPSAiYWNjb3VudF9uYW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHR5cGUgb2YgYWNjb3VudCB0byB3aGljaCB0aGlzIHJvdyBiZWxvbmdzLCB3aGljaCB3aGVuIHBhaXJlZCB3aXRoCisgICAgICAgICAqIHtAbGluayAjQUNDT1VOVF9OQU1FfSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYWNjb3VudC4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfVFlQRSA9ICJhY2NvdW50X3R5cGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgcm93IHRvIGl0cyBzb3VyY2UgYWNjb3VudC4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9JRCA9ICJzb3VyY2VpZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFZlcnNpb24gbnVtYmVyIHRoYXQgaXMgdXBkYXRlZCB3aGVuZXZlciB0aGlzIHJvdyBvciBpdHMgcmVsYXRlZCBkYXRhCisgICAgICAgICAqIGNoYW5nZXMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gInZlcnNpb24iOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGbGFnIGluZGljYXRpbmcgdGhhdCB7QGxpbmsgI1ZFUlNJT059IGhhcyBjaGFuZ2VkLCBhbmQgdGhpcyByb3cgbmVlZHMKKyAgICAgICAgICogdG8gYmUgc3luY2hyb25pemVkIGJ5IGl0cyBvd25pbmcgYWNjb3VudC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJUWSA9ICJkaXJ0eSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0aW1lIHRoYXQgdGhpcyByb3cgd2FzIGxhc3QgbW9kaWZpZWQgYnkgYSBjbGllbnQgKG1zZWNzIHNpbmNlIHRoZSBlcG9jaCkuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFX01PRElGSUVEID0gIm1vZGlmaWVkIjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgQ29tbW9uQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdW5pcXVlIElEIGZvciBhIHJvdy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfSUQgPSAiX2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFVSTCBvZiB0aGUgYm9va21hcmsuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQgKFVSTCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkwgPSAidXJsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHVzZXIgdmlzaWJsZSB0aXRsZSBvZiB0aGUgYm9va21hcmsuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSVRMRSA9ICJ0aXRsZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0aW1lIHRoYXQgdGhpcyByb3cgd2FzIGNyZWF0ZWQgb24gaXRzIG9yaWdpbmF0aW5nIGNsaWVudCAobXNlY3MKKyAgICAgICAgICogc2luY2UgdGhlIGVwb2NoKS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfQ1JFQVRFRCA9ICJjcmVhdGVkIjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgSW1hZ2VDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBmYXZpY29uIG9mIHRoZSBib29rbWFyaywgbWF5IGJlIE5VTEwuCisgICAgICAgICAqIE11c3QgZGVjb2RlIHZpYSB7QGxpbmsgQml0bWFwRmFjdG9yeSNkZWNvZGVCeXRlQXJyYXl9LgorICAgICAgICAgKiA8cD5UeXBlOiBCTE9CIChpbWFnZSk8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVZJQ09OID0gImZhdmljb24iOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIHRodW1ibmFpbCBvZiB0aGUgcGFnZSxtYXkgYmUgTlVMTC4KKyAgICAgICAgICogTXVzdCBkZWNvZGUgdmlhIHtAbGluayBCaXRtYXBGYWN0b3J5I2RlY29kZUJ5dGVBcnJheX0uCisgICAgICAgICAqIDxwPlR5cGU6IEJMT0IgKGltYWdlKTwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIVU1CTkFJTCA9ICJ0aHVtYm5haWwiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdG91Y2ggaWNvbiBmb3IgdGhlIHdlYiBwYWdlLCBtYXkgYmUgTlVMTC4KKyAgICAgICAgICogTXVzdCBkZWNvZGUgdmlhIHtAbGluayBCaXRtYXBGYWN0b3J5I2RlY29kZUJ5dGVBcnJheX0uCisgICAgICAgICAqIDxwPlR5cGU6IEJMT0IgKGltYWdlKTwvcD4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPVUNIX0lDT04gPSAidG91Y2hfaWNvbiI7CisgICAgfQorCisgICAgaW50ZXJmYWNlIEhpc3RvcnlDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkYXRlIHRoZSBpdGVtIHdhcyBsYXN0IHZpc2l0ZWQsIGluIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2guCisgICAgICAgICAqIDxwPlR5cGU6IElOVEVHRVIgKGRhdGUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCk8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFX0xBU1RfVklTSVRFRCA9ICJkYXRlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgaXRlbSBoYXMgYmVlbiB2aXNpdGVkLgorICAgICAgICAgKiA8cD5UeXBlOiBJTlRFR0VSPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklTSVRTID0gInZpc2l0cyI7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9FTlRFUkVEID0gInVzZXJfZW50ZXJlZCI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJvb2ttYXJrcyB0YWJsZSwgd2hpY2ggaG9sZHMgdGhlIHVzZXIncyBicm93c2VyIGJvb2ttYXJrcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJvb2ttYXJrcyBpbXBsZW1lbnRzIENvbW1vbkNvbHVtbnMsIEltYWdlQ29sdW1ucywgU3luY0NvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyB1dGlsaXR5IGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIEJvb2ttYXJrcygpIHt9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSSSBmb3IgdGhpcyB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkud2l0aEFwcGVuZGVkUGF0aChBVVRIT1JJVFlfVVJJLCAiYm9va21hcmtzIik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSSSBmb3IgdGhlIGRlZmF1bHQgZm9sZGVyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSV9ERUZBVUxUX0ZPTERFUiA9CisgICAgICAgICAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoQ09OVEVOVF9VUkksICJmb2xkZXIiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUXVlcnkgcGFyYW1ldGVyIHVzZWQgdG8gc3BlY2lmeSBhbiBhY2NvdW50IG5hbWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0FDQ09VTlRfTkFNRSA9ICJhY2N0X25hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBRdWVyeSBwYXJhbWV0ZXIgdXNlZCB0byBzcGVjaWZ5IGFuIGFjY291bnQgdHlwZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQUNDT1VOVF9UWVBFID0gImFjY3RfdHlwZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkcyBhIFVSSSB0aGF0IHBvaW50cyB0byBhIHNwZWNpZmljIGZvbGRlci4KKyAgICAgICAgICogQHBhcmFtIGZvbGRlcklkIHRoZSBJRCBvZiB0aGUgZm9sZGVyIHRvIHBvaW50IHRvCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBidWlsZEZvbGRlclVyaShsb25nIGZvbGRlcklkKSB7CisgICAgICAgICAgICByZXR1cm4gQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoQ09OVEVOVF9VUklfREVGQVVMVF9GT0xERVIsIGZvbGRlcklkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgTUlNRSB0eXBlIG9mIHtAbGluayAjQ09OVEVOVF9VUkl9IHByb3ZpZGluZyBhIGRpcmVjdG9yeSBvZiBib29rbWFya3MuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPSAidm5kLmFuZHJvaWQuY3Vyc29yLmRpci9ib29rbWFyayI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNSU1FIHR5cGUgb2YgYSB7QGxpbmsgI0NPTlRFTlRfVVJJfSBvZiBhIHNpbmdsZSBib29rbWFyay4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfSVRFTV9UWVBFID0gInZuZC5hbmRyb2lkLmN1cnNvci5pdGVtL2Jvb2ttYXJrIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogUXVlcnkgcGFyYW1ldGVyIHRvIHVzZSBpZiB5b3Ugd2FudCB0byBzZWUgZGVsZXRlZCBib29rbWFya3MgdGhhdCBhcmUgc3RpbGwKKyAgICAgICAgICogYXJvdW5kIG9uIHRoZSBkZXZpY2UgYW5kIGhhdmVuJ3QgYmVlbiBzeW5jZWQgeWV0LgorICAgICAgICAgKiBAc2VlICNJU19ERUxFVEVECisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9QQVJBTUVURVJfU0hPV19ERUxFVEVEID0gInNob3dfZGVsZXRlZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZsYWcgaW5kaWNhdGluZyBpZiBhbiBpdGVtIGlzIGEgZm9sZGVyIG9yIGJvb2ttYXJrLiBOb24temVybyB2YWx1ZXMgaW5kaWNhdGUKKyAgICAgICAgICogYSBmb2xkZXIgYW5kIHplcm8gaW5kaWNhdGVzIGEgYm9va21hcmsuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfRk9MREVSID0gImZvbGRlciI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgcGFyZW50IGZvbGRlci4gSUQgMCBpcyB0aGUgcm9vdCBmb2xkZXIuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKHJlZmVyZW5jZSB0byBpdGVtIGluIHRoZSBzYW1lIHRhYmxlKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVCA9ICJwYXJlbnQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc291cmNlIElEIGZvciBhbiBpdGVtJ3MgcGFyZW50LiBSZWFkLW9ubHkuCisgICAgICAgICAqIEBzZWUgI1BBUkVOVAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX1NPVVJDRV9JRCA9ICJwYXJlbnRfc291cmNlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHBvc2l0aW9uIG9mIHRoZSBib29rbWFyayBpbiByZWxhdGlvbiB0byBpdCdzIHNpYmxpbmdzIHRoYXQgc2hhcmUgdGhlIHNhbWUKKyAgICAgICAgICoge0BsaW5rICNQQVJFTlR9LiBNYXkgYmUgbmVnYXRpdmUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1NJVElPTiA9ICJwb3NpdGlvbiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBpdGVtIHRoYXQgdGhlIGJvb2ttYXJrIHNob3VsZCBiZSBpbnNlcnRlZCBhZnRlci4KKyAgICAgICAgICogTWF5IGJlIG5lZ2F0aXZlLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUX0FGVEVSID0gImluc2VydF9hZnRlciI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzb3VyY2UgSUQgZm9yIHRoZSBpdGVtIHRoYXQgdGhlIGJvb2ttYXJrIHNob3VsZCBiZSBpbnNlcnRlZCBhZnRlci4gUmVhZC1vbmx5LgorICAgICAgICAgKiBNYXkgYmUgbmVnYXRpdmUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqIEBzZWUgI0lOU0VSVF9BRlRFUgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUX0FGVEVSX1NPVVJDRV9JRCA9ICJpbnNlcnRfYWZ0ZXJfc291cmNlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQSBmbGFnIHRvIGluZGljYXRlIGlmIGFuIGl0ZW0gaGFzIGJlZW4gZGVsZXRlZC4gUXVlcmllcyB3aWxsIG5vdCByZXR1cm4gZGVsZXRlZAorICAgICAgICAgKiBlbnRyaWVzIHVubGVzcyB5b3UgYWRkIHRoZSB7QGxpbmsgI1FVRVJZX1BBUkFNRVRFUl9TSE9XX0RFTEVURUR9IHF1ZXJ5IHBhcmFtdGVyCisgICAgICAgICAqIHRvIHRoZSBVUkkgd2hlbiBwZXJmb3JtaW5nIHlvdXIgcXVlcnkuCisgICAgICAgICAqIDxwPlR5cGU6IElOVEVHRVIgKG5vbi16ZXJvIGlmIHRoZSBpdGVtIGhhcyBiZWVuIGRlbGV0ZWQsIHplcm8gaWYgaXQgaGFzbid0KQorICAgICAgICAgKiBAc2VlICNRVUVSWV9QQVJBTUVURVJfU0hPV19ERUxFVEVECisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19ERUxFVEVEID0gImRlbGV0ZWQiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQtb25seSB0YWJsZSB0aGF0IGxpc3RzIGFsbCB0aGUgYWNjb3VudHMgdGhhdCBhcmUgdXNlZCB0byBwcm92aWRlIGJvb2ttYXJrcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEFjY291bnRzIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIERpcmVjdG9yeSB1bmRlciB7QGxpbmsgQm9va21hcmtzI0NPTlRFTlRfVVJJfQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPQorICAgICAgICAgICAgICAgIEFVVEhPUklUWV9VUkkuYnVpbGRVcG9uKCkuYXBwZW5kUGF0aCgiYWNjb3VudHMiKS5idWlsZCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBpbnN0YW5jZSB0byB3aGljaCB0aGlzIHJvdyBiZWxvbmdzLCB3aGljaCB3aGVuIHBhaXJlZCB3aXRoCisgICAgICAgICAqIHtAbGluayAjQUNDT1VOVF9UWVBFfSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYWNjb3VudC4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfTkFNRSA9ICJhY2NvdW50X25hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdHlwZSBvZiBhY2NvdW50IHRvIHdoaWNoIHRoaXMgcm93IGJlbG9uZ3MsIHdoaWNoIHdoZW4gcGFpcmVkIHdpdGgKKyAgICAgICAgICoge0BsaW5rICNBQ0NPVU5UX05BTUV9IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBhY2NvdW50LgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9UWVBFID0gImFjY291bnRfdHlwZSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGhpc3RvcnkgdGFibGUsIHdoaWNoIGhvbGRzIHRoZSBicm93c2luZyBoaXN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgSGlzdG9yeSBpbXBsZW1lbnRzIENvbW1vbkNvbHVtbnMsIEhpc3RvcnlDb2x1bW5zLCBJbWFnZUNvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyB1dGlsaXR5IGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIEhpc3RvcnkoKSB7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkkgZm9yIHRoaXMgdGFibGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLndpdGhBcHBlbmRlZFBhdGgoQVVUSE9SSVRZX1VSSSwgImhpc3RvcnkiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUgdHlwZSBvZiB7QGxpbmsgI0NPTlRFTlRfVVJJfSBwcm92aWRpbmcgYSBkaXJlY3Rvcnkgb2YgYnJvd3NlciBoaXN0b3J5IGl0ZW1zLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFID0gInZuZC5hbmRyb2lkLmN1cnNvci5kaXIvYnJvd3Nlci1oaXN0b3J5IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUgdHlwZSBvZiBhIHtAbGluayAjQ09OVEVOVF9VUkl9IG9mIGEgc2luZ2xlIGJyb3dzZXIgaGlzdG9yeSBpdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9JVEVNX1RZUEUgPSAidm5kLmFuZHJvaWQuY3Vyc29yLml0ZW0vYnJvd3Nlci1oaXN0b3J5IjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VhcmNoIGhpc3RvcnkgdGFibGUuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNlYXJjaGVzIHsKKyAgICAgICAgcHJpdmF0ZSBTZWFyY2hlcygpIHt9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSSSBmb3IgdGhpcyB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkud2l0aEFwcGVuZGVkUGF0aChBVVRIT1JJVFlfVVJJLCAic2VhcmNoZXMiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUgdHlwZSBvZiB7QGxpbmsgI0NPTlRFTlRfVVJJfSBwcm92aWRpbmcgYSBkaXJlY3Rvcnkgb2YgYnJvd3NlciBzZWFyY2ggaXRlbXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPSAidm5kLmFuZHJvaWQuY3Vyc29yLmRpci9zZWFyY2hlcyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNSU1FIHR5cGUgb2YgYSB7QGxpbmsgI0NPTlRFTlRfVVJJfSBvZiBhIHNpbmdsZSBicm93c2VyIHNlYXJjaCBpdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9JVEVNX1RZUEUgPSAidm5kLmFuZHJvaWQuY3Vyc29yLml0ZW0vc2VhcmNoZXMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdW5pcXVlIElEIGZvciBhIHJvdy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfSUQgPSAiX2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHVzZXIgZW50ZXJlZCBzZWFyY2ggdGVybS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQVJDSCA9ICJzZWFyY2giOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgc2VhcmNoIHdhcyBwZXJmb3JtZWQsIGluIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2guCisgICAgICAgICAqIDxwPlR5cGU6IE5VTUJFUiAoZGF0ZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwKTwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEUgPSAiZGF0ZSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB0YWJsZSBwcm92aWRlZCBmb3Igc3luYyBhZGFwdGVycyB0byB1c2UgZm9yIHN0b3JpbmcgcHJpdmF0ZSBzeW5jIHN0YXRlIGRhdGEuCisgICAgICoKKyAgICAgKiBAc2VlIFN5bmNTdGF0ZUNvbnRyYWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTeW5jU3RhdGUgaW1wbGVtZW50cyBTeW5jU3RhdGVDb250cmFjdC5Db2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgdXRpbGl0eSBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFN5bmNTdGF0ZSgpIHt9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVJFQ1RPUlkgPQorICAgICAgICAgICAgICAgIFN5bmNTdGF0ZUNvbnRyYWN0LkNvbnN0YW50cy5DT05URU5UX0RJUkVDVE9SWTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJJIGZvciB0aGlzIHRhYmxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9CisgICAgICAgICAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoQVVUSE9SSVRZX1VSSSwgQ09OVEVOVF9ESVJFQ1RPUlkpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGFuZHJvaWQucHJvdmlkZXIuU3luY1N0YXRlQ29udHJhY3QuSGVscGVycyNnZXQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGdldChDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXIsIEFjY291bnQgYWNjb3VudCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBTeW5jU3RhdGVDb250cmFjdC5IZWxwZXJzLmdldChwcm92aWRlciwgQ09OVEVOVF9VUkksIGFjY291bnQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgYW5kcm9pZC5wcm92aWRlci5TeW5jU3RhdGVDb250cmFjdC5IZWxwZXJzI2dldAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBQYWlyPFVyaSwgYnl0ZVtdPiBnZXRXaXRoVXJpKENvbnRlbnRQcm92aWRlckNsaWVudCBwcm92aWRlciwgQWNjb3VudCBhY2NvdW50KQorICAgICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIFN5bmNTdGF0ZUNvbnRyYWN0LkhlbHBlcnMuZ2V0V2l0aFVyaShwcm92aWRlciwgQ09OVEVOVF9VUkksIGFjY291bnQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgYW5kcm9pZC5wcm92aWRlci5TeW5jU3RhdGVDb250cmFjdC5IZWxwZXJzI3NldAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldChDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXIsIEFjY291bnQgYWNjb3VudCwgYnl0ZVtdIGRhdGEpCisgICAgICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTeW5jU3RhdGVDb250cmFjdC5IZWxwZXJzLnNldChwcm92aWRlciwgQ09OVEVOVF9VUkksIGFjY291bnQsIGRhdGEpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgYW5kcm9pZC5wcm92aWRlci5TeW5jU3RhdGVDb250cmFjdC5IZWxwZXJzI25ld1NldE9wZXJhdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24gbmV3U2V0T3BlcmF0aW9uKEFjY291bnQgYWNjb3VudCwgYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgICAgIHJldHVybiBTeW5jU3RhdGVDb250cmFjdC5IZWxwZXJzLm5ld1NldE9wZXJhdGlvbihDT05URU5UX1VSSSwgYWNjb3VudCwgZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9yZXMgaW1hZ2VzIGZvciBVUkxzLiBPbmx5IHN1cHBvcnQgcXVlcnkoKSBhbmQgdXBkYXRlKCkuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEltYWdlcyBpbXBsZW1lbnRzIEltYWdlQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIHV0aWxpdHkgY2xhc3MgY2Fubm90IGJlIGluc3RhbnRpYXRlZAorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBJbWFnZXMoKSB7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkkgZm9yIHRoaXMgdGFibGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLndpdGhBcHBlbmRlZFBhdGgoQVVUSE9SSVRZX1VSSSwgImltYWdlcyIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgVVJMIHRoZSBpbWFnZXMgY2FtZSBmcm9tLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUIChVUkwpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMID0gInVybF9rZXkiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29tYmluZWQgdmlldyBvZiBib29rbWFya3MgYW5kIGhpc3RvcnkuIEFsbCBib29rbWFya3MgaW4gYWxsIGZvbGRlcnMgYXJlIGluY2x1ZGVkIGFuZAorICAgICAqIG5vIGZvbGRlcnMgYXJlIGluY2x1ZGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ29tYmluZWQgaW1wbGVtZW50cyBDb21tb25Db2x1bW5zLCBIaXN0b3J5Q29sdW1ucywgSW1hZ2VDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgdXRpbGl0eSBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIENvbWJpbmVkKCkge30KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJJIGZvciB0aGlzIHRhYmxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9IFVyaS53aXRoQXBwZW5kZWRQYXRoKEFVVEhPUklUWV9VUkksICJjb21iaW5lZCIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGbGFnIGluZGljYXRpbmcgdGhhdCBhbiBpdGVtIGlzIGEgYm9va21hcmsuIEEgdmFsdWUgb2YgMSBpbmRpY2F0ZXMgYSBib29rbWFyaywgYSB2YWx1ZQorICAgICAgICAgKiBvZiAwIGluZGljYXRlcyBhIGhpc3RvcnkgaXRlbS4KKyAgICAgICAgICogPHA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19CT09LTUFSSyA9ICJib29rbWFyayI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB0YWJsZSB0aGF0IHN0b3JlcyBzZXR0aW5ncyBzcGVjaWZpYyB0byB0aGUgYnJvd3Nlci4gT25seSBzdXBwb3J0IHF1ZXJ5IGFuZCBpbnNlcnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTZXR0aW5ncyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIHV0aWxpdHkgY2xhc3MgY2Fubm90IGJlIGluc3RhbnRpYXRlZAorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBTZXR0aW5ncygpIHt9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSSSBmb3IgdGhpcyB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkud2l0aEFwcGVuZGVkUGF0aChBVVRIT1JJVFlfVVJJLCAic2V0dGluZ3MiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogS2V5IGZvciBhIHNldHRpbmcgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVkgPSAia2V5IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVmFsdWUgZm9yIGEgc2V0dGluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFID0gInZhbHVlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogSWYgc2V0IHRvIG5vbi0wIHRoZSB1c2VyIGhhcyBvcHRlZCBpbnRvIGJvb2ttYXJrIHN5bmMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1lOQ19FTkFCTEVEID0gInN5bmNfZW5hYmxlZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiBib29rbWFyayBzeW5jIGlzIGVuYWJsZWQKKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiBpc1N5bmNFbmFibGVkKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGN1cnNvciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoQ09OVEVOVF9VUkksIG5ldyBTdHJpbmdbXSB7IFZBTFVFIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBLRVkgKyAiPT8iLCBuZXcgU3RyaW5nW10geyBLRVlfU1lOQ19FTkFCTEVEIH0sIG51bGwpOworICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgPT0gbnVsbCB8fCAhY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmdldEludCgwKSAhPSAwOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIGN1cnNvci5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGJvb2ttYXJrIHN5bmMgZW5hYmxlZCBzZXR0aW5nLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIHB1YmxpYyB2b2lkIHNldFN5bmNFbmFibGVkKENvbnRleHQgY29udGV4dCwgYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgICAgICB2YWx1ZXMucHV0KEtFWSwgS0VZX1NZTkNfRU5BQkxFRCk7CisgICAgICAgICAgICB2YWx1ZXMucHV0KFZBTFVFLCBlbmFibGVkID8gMSA6IDApOworICAgICAgICAgICAgY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5pbnNlcnQoQ09OVEVOVF9VUkksIHZhbHVlcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIuamF2YQppbmRleCA2MzU1YTljLi44OGNlMGYwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyLmphdmEKQEAgLTc2LDExICs3NiwxMDYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxMRVJfSVNfU1lOQ0FEQVBURVIgPSAiY2FsbGVyX2lzX3N5bmNhZGFwdGVyIjsKIAorCisgICAgLyoqCisgICAgICogR2VuZXJpYyBjb2x1bW5zIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gVGhlIHNwZWNpZmljIGZ1bmN0aW9ucyBvZgorICAgICAqIHRoZXNlIGNvbHVtbnMgYXJlIHByaXZhdGUgdG8gdGhlIHN5bmMgYWRhcHRlci4gT3RoZXIgY2xpZW50cyBvZiB0aGUgQVBJCisgICAgICogc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGVpdGhlciByZWFkIG9yIHdyaXRlIHRoaXMgY29sdW1uLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnRlcmZhY2UgQmFzZVN5bmNDb2x1bW5zIHsKKworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DMSA9ICJzeW5jMSI7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkMyID0gInN5bmMyIjsKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzMgPSAic3luYzMiOworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DNCA9ICJzeW5jNCI7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkM1ID0gInN5bmM1IjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2x1bW5zIGZvciBTeW5jIGluZm9ybWF0aW9uIHVzZWQgYnkgQ2FsZW5kYXJzIGFuZCBFdmVudHMgdGFibGVzLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgU3luY0NvbHVtbnMgZXh0ZW5kcyBCYXNlU3luY0NvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGFjY291bnQgdGhhdCB3YXMgdXNlZCB0byBzeW5jIHRoZSBlbnRyeSB0byB0aGUgZGV2aWNlLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfQUNDT1VOVCA9ICJfc3luY19hY2NvdW50IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHR5cGUgb2YgdGhlIGFjY291bnQgdGhhdCB3YXMgdXNlZCB0byBzeW5jIHRoZSBlbnRyeSB0byB0aGUgZGV2aWNlLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfQUNDT1VOVF9UWVBFID0gIl9zeW5jX2FjY291bnRfdHlwZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB1bmlxdWUgSUQgZm9yIGEgcm93IGFzc2lnbmVkIGJ5IHRoZSBzeW5jIHNvdXJjZS4gTlVMTCBpZiB0aGUgcm93IGhhcyBuZXZlciBiZWVuIHN5bmNlZC4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0lEID0gIl9zeW5jX2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGxhc3QgdGltZSwgZnJvbSB0aGUgc3luYyBzb3VyY2UncyBwb2ludCBvZiB2aWV3LCB0aGF0IHRoaXMgcm93IGhhcyBiZWVuIHN5bmNocm9uaXplZC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19USU1FID0gIl9zeW5jX3RpbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcm93LCBhcyBhc3NpZ25lZCBieSB0aGUgc2VydmVyLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfVkVSU0lPTiA9ICJfc3luY192ZXJzaW9uIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRm9yIHVzZSBieSBzeW5jIGFkYXB0ZXIgYXQgaXRzIGRpc2NyZXRpb247IG5vdCBtb2RpZmllZCBieSBDYWxlbmRhclByb3ZpZGVyCisgICAgICAgICAqIE5vdGUgdGhhdCB0aGlzIGNvbHVtbiB3YXMgZm9ybWVybHkgbmFtZWQgX1NZTkNfTE9DQUxfSUQuICBXZSBhcmUgdXNpbmcgaXQgdG8gYXZvaWQgYQorICAgICAgICAgKiBzY2hlbWEgY2hhbmdlLgorICAgICAgICAgKiBUT0RPIFJlcGxhY2UgdGhpcyB3aXRoIHNvbWV0aGluZyBtb3JlIGdlbmVyYWwgaW4gdGhlIGZ1dHVyZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19EQVRBID0gIl9zeW5jX2xvY2FsX2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlZCBvbmx5IGluIHBlcnNpc3RlbnQgcHJvdmlkZXJzLCBhbmQgb25seSBkdXJpbmcgbWVyZ2luZy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19NQVJLID0gIl9zeW5jX21hcmsiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2VkIHRvIGluZGljYXRlIHRoYXQgbG9jYWwsIHVuc3luY2VkLCBjaGFuZ2VzIGFyZSBwcmVzZW50LgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0RJUlRZID0gIl9zeW5jX2RpcnR5IjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbHVtbnMgZnJvbSB0aGUgQWNjb3VudCBpbmZvcm1hdGlvbiB1c2VkIGJ5IENhbGVuZGFycyBhbmQgRXZlbnRzIHRhYmxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIEFjY291bnRDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGluc3RhbmNlIHRvIHdoaWNoIHRoaXMgcm93IGJlbG9uZ3MsIHdoaWNoIHdoZW4gcGFpcmVkIHdpdGgKKyAgICAgICAgICoge0BsaW5rICNBQ0NPVU5UX1RZUEV9IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBhY2NvdW50LgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9OQU1FID0gImFjY291bnRfbmFtZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0eXBlIG9mIGFjY291bnQgdG8gd2hpY2ggdGhpcyByb3cgYmVsb25ncywgd2hpY2ggd2hlbiBwYWlyZWQgd2l0aAorICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfTkFNRX0gaWRlbnRpZmllcyBhIHNwZWNpZmljIGFjY291bnQuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX1RZUEUgPSAiYWNjb3VudF90eXBlIjsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDb2x1bW5zIGZyb20gdGhlIENhbGVuZGFycyB0YWJsZSB0aGF0IG90aGVyIHRhYmxlcyBqb2luIGludG8gdGhlbXNlbHZlcy4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIENhbGVuZGFyc0NvbHVtbnMKLSAgICB7CisgICAgcHVibGljIGludGVyZmFjZSBDYWxlbmRhcnNDb2x1bW5zIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBjb2xvciBvZiB0aGUgY2FsZW5kYXIKICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoY29sb3IgdmFsdWUpPC9QPgpAQCAtMTM1LDc1ICsyMzAsMTAzIEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkNfU1RBVEUgPSAic3luY19zdGF0ZSI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBhY2NvdW50IHRoYXQgd2FzIHVzZWQgdG8gc3luYyB0aGUgZW50cnkgdG8gdGhlIGRldmljZS4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICogV2hldGhlciB0aGUgcm93IGhhcyBiZWVuIGRlbGV0ZWQuICBBIGRlbGV0ZWQgcm93IHNob3VsZCBiZSBpZ25vcmVkLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvUD4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0FDQ09VTlQgPSAiX3N5bmNfYWNjb3VudCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0eXBlIG9mIHRoZSBhY2NvdW50IHRoYXQgd2FzIHVzZWQgdG8gc3luYyB0aGUgZW50cnkgdG8gdGhlIGRldmljZS4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0FDQ09VTlRfVFlQRSA9ICJfc3luY19hY2NvdW50X3R5cGUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdW5pcXVlIElEIGZvciBhIHJvdyBhc3NpZ25lZCBieSB0aGUgc3luYyBzb3VyY2UuIE5VTEwgaWYgdGhlIHJvdyBoYXMgbmV2ZXIgYmVlbiBzeW5jZWQuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19JRCA9ICJfc3luY19pZCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBsYXN0IHRpbWUsIGZyb20gdGhlIHN5bmMgc291cmNlJ3MgcG9pbnQgb2YgdmlldywgdGhhdCB0aGlzIHJvdyBoYXMgYmVlbiBzeW5jaHJvbml6ZWQuCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfVElNRSA9ICJfc3luY190aW1lIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHZlcnNpb24gb2YgdGhlIHJvdywgYXMgYXNzaWduZWQgYnkgdGhlIHNlcnZlci4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX1ZFUlNJT04gPSAiX3N5bmNfdmVyc2lvbiI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZvciB1c2UgYnkgc3luYyBhZGFwdGVyIGF0IGl0cyBkaXNjcmV0aW9uOyBub3QgbW9kaWZpZWQgYnkgQ2FsZW5kYXJQcm92aWRlcgotICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBjb2x1bW4gd2FzIGZvcm1lcmx5IG5hbWVkIF9TWU5DX0xPQ0FMX0lELiAgV2UgYXJlIHVzaW5nIGl0IHRvIGF2b2lkIGEKLSAgICAgICAgICogc2NoZW1hIGNoYW5nZS4KLSAgICAgICAgICogVE9ETyBSZXBsYWNlIHRoaXMgd2l0aCBzb21ldGhpbmcgbW9yZSBnZW5lcmFsIGluIHRoZSBmdXR1cmUuCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfREFUQSA9ICJfc3luY19sb2NhbF9pZCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFVzZWQgb25seSBpbiBwZXJzaXN0ZW50IHByb3ZpZGVycywgYW5kIG9ubHkgZHVyaW5nIG1lcmdpbmcuCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfTUFSSyA9ICJfc3luY19tYXJrIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IGxvY2FsLCB1bnN5bmNlZCwgY2hhbmdlcyBhcmUgcHJlc2VudC4KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19ESVJUWSA9ICJfc3luY19kaXJ0eSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGluc3RhbmNlIHRvIHdoaWNoIHRoaXMgcm93IGJlbG9uZ3MsIHdoaWNoIHdoZW4gcGFpcmVkIHdpdGgKLSAgICAgICAgICoge0BsaW5rICNBQ0NPVU5UX1RZUEV9IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBhY2NvdW50LgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9OQU1FID0gImFjY291bnRfbmFtZSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0eXBlIG9mIGFjY291bnQgdG8gd2hpY2ggdGhpcyByb3cgYmVsb25ncywgd2hpY2ggd2hlbiBwYWlyZWQgd2l0aAotICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfTkFNRX0gaWRlbnRpZmllcyBhIHNwZWNpZmljIGFjY291bnQuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX1RZUEUgPSAiYWNjb3VudF90eXBlIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFRCA9ICJkZWxldGVkIjsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDbGFzcyB0aGF0IHJlcHJlc2VudHMgYSBDYWxlbmRhciBFbnRpdHkuIFRoZXJlIGlzIG9uZSBlbnRyeSBwZXIgY2FsZW5kYXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDYWxlbmRhcnNFbnRpdHkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgU3luY0NvbHVtbnMsIENhbGVuZGFyc0NvbHVtbnMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArCisgICAgICAgICAgICAgICAgIi9jYWxlbmRhcl9lbnRpdGllcyIpOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRW50aXR5SXRlcmF0b3IgbmV3RW50aXR5SXRlcmF0b3IoQ3Vyc29yIGN1cnNvciwgQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eUl0ZXJhdG9ySW1wbChjdXJzb3IsIHJlc29sdmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRW50aXR5SXRlcmF0b3IgbmV3RW50aXR5SXRlcmF0b3IoQ3Vyc29yIGN1cnNvciwKKyAgICAgICAgICAgICAgICBDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRW50aXR5SXRlcmF0b3JJbXBsKGN1cnNvciwgcHJvdmlkZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW50aXR5SXRlcmF0b3JJbXBsIGV4dGVuZHMgQ3Vyc29yRW50aXR5SXRlcmF0b3IgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbVJlc29sdmVyOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50UHJvdmlkZXJDbGllbnQgbVByb3ZpZGVyOworCisgICAgICAgICAgICBwdWJsaWMgRW50aXR5SXRlcmF0b3JJbXBsKEN1cnNvciBjdXJzb3IsIENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgeworICAgICAgICAgICAgICAgIHN1cGVyKGN1cnNvcik7CisgICAgICAgICAgICAgICAgbVJlc29sdmVyID0gcmVzb2x2ZXI7CisgICAgICAgICAgICAgICAgbVByb3ZpZGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEVudGl0eUl0ZXJhdG9ySW1wbChDdXJzb3IgY3Vyc29yLCBDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXIpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihjdXJzb3IpOworICAgICAgICAgICAgICAgIG1SZXNvbHZlciA9IG51bGw7CisgICAgICAgICAgICAgICAgbVByb3ZpZGVyID0gcHJvdmlkZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEVudGl0eSBnZXRFbnRpdHlBbmRJbmNyZW1lbnRDdXJzb3IoQ3Vyc29yIGN1cnNvcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgLy8gd2UgZXhwZWN0IHRoZSBjdXJzb3IgaXMgYWxyZWFkeSBhdCB0aGUgcm93IHdlIG5lZWQgdG8gcmVhZCBmcm9tCisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBjYWxlbmRhcklkID0gY3Vyc29yLmdldExvbmcoY3Vyc29yLmdldENvbHVtbkluZGV4T3JUaHJvdyhfSUQpKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgY29udGVudCB2YWx1ZQorICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgY3YgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAgICAgICAgIGN2LnB1dChfSUQsIGNhbGVuZGFySWQpOworCisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfQUNDT1VOVCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfQUNDT1VOVF9UWVBFKTsKKworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0lEKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19WRVJTSU9OKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19USU1FKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19EQVRBKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfRElSVFkpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yTG9uZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19NQVJLKTsKKworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5TWU5DMSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlNZTkMyKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuU1lOQzMpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5TWU5DNCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlNZTkM1KTsKKworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5OQU1FKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJzLkRJU1BMQVlfTkFNRSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLkNPTE9SKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBBQ0NFU1NfTEVWRUwpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIFNFTEVDVEVEKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBTWU5DX0VWRU5UUyk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLkxPQ0FUSU9OKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBUSU1FWk9ORSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFycy5PV05FUl9BQ0NPVU5UKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJzLk9SR0FOSVpFUl9DQU5fUkVTUE9ORCk7CisKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBERUxFVEVEKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgRW50aXR5IGZyb20gdGhlIENvbnRlbnRWYWx1ZQorICAgICAgICAgICAgICAgIEVudGl0eSBlbnRpdHkgPSBuZXcgRW50aXR5KGN2KTsKKworICAgICAgICAgICAgICAgIC8vIFNldCBjdXJzb3IgdG8gbmV4dCByb3cKKyAgICAgICAgICAgICAgICBjdXJzb3IubW92ZVRvTmV4dCgpOworCisgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBjcmVhdGVkIEVudGl0eQorICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgfQorCisgICAgLyoqCiAgICAgICogQ29udGFpbnMgYSBsaXN0IG9mIGF2YWlsYWJsZSBjYWxlbmRhcnMuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDYWxlbmRhcnMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgQ2FsZW5kYXJzQ29sdW1ucworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FsZW5kYXJzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIFN5bmNDb2x1bW5zLCBBY2NvdW50Q29sdW1ucywKKyAgICAgICAgICAgIENhbGVuZGFyc0NvbHVtbnMKICAgICB7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSEVSRV9ERUxFVEVfRk9SX0FDQ09VTlQgPSBDYWxlbmRhcnMuX1NZTkNfQUNDT1VOVCArICI9PyIKICAgICAgICAgICAgICAgICArICIgQU5EICIgKyBDYWxlbmRhcnMuX1NZTkNfQUNDT1VOVF9UWVBFICsgIj0/IjsKQEAgLTI1OCw2ICszODEsMjQgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMID0gInVybCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBVUkwgZm9yIHRoZSBjYWxlbmRhciBpdHNlbGYKKyAgICAgICAgICogPFA+VHlwZTogVEVYVCAoVVJMKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEZfVVJMID0gInNlbGZVcmwiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgVVJMIGZvciB0aGUgY2FsZW5kYXIgdG8gYmUgZWRpdGVkCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQgKFVSTCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX1VSTCA9ICJlZGl0VXJsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFVSTCBmb3IgdGhlIGNhbGVuZGFyIGV2ZW50cworICAgICAgICAgKiA8UD5UeXBlOiBURVhUIChVUkwpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRTX1VSTCA9ICJldmVudHNVcmwiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY2FsZW5kYXIKICAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KICAgICAgICAgICovCkBAIC0yNzYsMTIgKzQxNyw2IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OID0gImxvY2F0aW9uIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogU2hvdWxkIHRoZSBjYWxlbmRhciBiZSBoaWRkZW4gaW4gdGhlIGNhbGVuZGFyIHNlbGVjdGlvbiBwYW5lbD8KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBISURERU4gPSAiaGlkZGVuIjsKLQotICAgICAgICAvKioKICAgICAgICAgICogVGhlIG93bmVyIGFjY291bnQgZm9yIHRoaXMgY2FsZW5kYXIsIGJhc2VkIG9uIHRoZSBjYWxlbmRhciBmZWVkLgogICAgICAgICAgKiBUaGlzIHdpbGwgYmUgZGlmZmVyZW50IGZyb20gdGhlIF9TWU5DX0FDQ09VTlQgZm9yIGRlbGVnYXRlZCBjYWxlbmRhcnMuCiAgICAgICAgICAqIDxQPlR5cGU6IFN0cmluZzwvUD4KQEAgLTI5Niw2ICs0MzEsOSBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdBTklaRVJfQ0FOX1JFU1BPTkQgPSAib3JnYW5pemVyQ2FuUmVzcG9uZCI7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ29sdW1ucyBmcm9tIHRoZSBBdHRlbmRlZXMgdGFibGUgdGhhdCBvdGhlciB0YWJsZXMgam9pbiBpbnRvIHRoZW1zZWx2ZXMuCisgICAgICovCiAgICAgcHVibGljIGludGVyZmFjZSBBdHRlbmRlZXNDb2x1bW5zIHsKIAogICAgICAgICAvKioKQEAgLTM2MSw4ICs0OTksNyBAQAogICAgIC8qKgogICAgICAqIENvbHVtbnMgZnJvbSB0aGUgRXZlbnRzIHRhYmxlIHRoYXQgb3RoZXIgdGFibGVzIGpvaW4gaW50byB0aGVtc2VsdmVzLgogICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgRXZlbnRzQ29sdW1ucwotICAgIHsKKyAgICBwdWJsaWMgaW50ZXJmYWNlIEV2ZW50c0NvbHVtbnMgewogICAgICAgICAvKioKICAgICAgICAgICogVGhlIGNhbGVuZGFyIHRoZSBldmVudCBiZWxvbmdzIHRvCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGZvcmVpZ24ga2V5IHRvIHRoZSBDYWxlbmRhcnMgdGFibGUpPC9QPgpAQCAtNDM4LDYgKzU3NSwxOCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVEVORCA9ICJkdGVuZCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0aW1lIHRoZSBldmVudCBzdGFydHMgd2l0aCBhbGxEYXkgZXZlbnRzIGluIGEgbG9jYWwgdHoKKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZzsgbWlsbGlzIHNpbmNlIGVwb2NoKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERUU1RBUlQyID0gImR0c3RhcnQyIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRpbWUgdGhlIGV2ZW50IGVuZHMgd2l0aCBhbGxEYXkgZXZlbnRzIGluIGEgbG9jYWwgdHoKKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZzsgbWlsbGlzIHNpbmNlIGVwb2NoKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURU5EMiA9ICJkdGVuZDIiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIGV2ZW50CiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQgKGR1cmF0aW9uIGluIFJGQzI0NDUgZm9ybWF0KTwvUD4KICAgICAgICAgICovCkBAIC00NTAsNiArNTk5LDEyIEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX1RJTUVaT05FID0gImV2ZW50VGltZXpvbmUiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGltZXpvbmUgZm9yIHRoZSBldmVudCwgYWxsRGF5IGV2ZW50cyB3aWxsIGhhdmUgYSBsb2NhbCB0eiBpbnN0ZWFkIG9mIFVUQworICAgICAgICAgKiA8UD5UeXBlOiBURVhUCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9USU1FWk9ORTIgPSAiZXZlbnRUaW1lem9uZTIiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBXaGV0aGVyIHRoZSBldmVudCBsYXN0cyBhbGwgZGF5IG9yIG5vdAogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvUD4KICAgICAgICAgICovCkBAIC01OTgsNyArNzUzLDggQEAKICAgICAvKioKICAgICAgKiBDb250YWlucyBvbmUgZW50cnkgcGVyIGNhbGVuZGFyIGV2ZW50LiBSZWN1cnJpbmcgZXZlbnRzIHNob3cgdXAgYXMgYSBzaW5nbGUgZW50cnkuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudHNFbnRpdHkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgRXZlbnRzQ29sdW1ucywgQ2FsZW5kYXJzQ29sdW1ucyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudHNFbnRpdHkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgU3luY0NvbHVtbnMsIEFjY291bnRDb2x1bW5zLAorICAgICAgICAgICAgRXZlbnRzQ29sdW1ucyB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkwgZm9yIHRoaXMgdGFibGUKICAgICAgICAgICovCkBAIC03MDMsOCArODU5LDggQEAKICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19EQVRBKTsKICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfRElSVFkpOwogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX1ZFUlNJT04pOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIERFTEVURUQpOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5VUkwpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIEV2ZW50c0NvbHVtbnMuREVMRVRFRCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlNZTkMxKTsKIAogICAgICAgICAgICAgICAgIEVudGl0eSBlbnRpdHkgPSBuZXcgRW50aXR5KGN2KTsKICAgICAgICAgICAgICAgICBDdXJzb3Igc3ViQ3Vyc29yOwpAQCAtNzk1LDcgKzk1MSw4IEBACiAgICAgLyoqCiAgICAgICogQ29udGFpbnMgb25lIGVudHJ5IHBlciBjYWxlbmRhciBldmVudC4gUmVjdXJyaW5nIGV2ZW50cyBzaG93IHVwIGFzIGEgc2luZ2xlIGVudHJ5LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnRzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIEV2ZW50c0NvbHVtbnMsIENhbGVuZGFyc0NvbHVtbnMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnRzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIFN5bmNDb2x1bW5zLCBBY2NvdW50Q29sdW1ucywKKyAgICAgICAgICAgIEV2ZW50c0NvbHVtbnMgewogCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEZFVENIX0VOVFJZX0NPTFVNTlMgPQogICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEV2ZW50cy5fU1lOQ19BQ0NPVU5ULCBFdmVudHMuX1NZTkNfSUQgfTsKQEAgLTg2MCw2ICsxMDE3LDE1IEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZ1tdIHByb2plY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYmVnaW4sIGxvbmcgZW5kLCBTdHJpbmcgc2VhcmNoUXVlcnkpIHsKKyAgICAgICAgICAgIFVyaS5CdWlsZGVyIGJ1aWxkZXIgPSBDT05URU5UX1NFQVJDSF9VUkkuYnVpbGRVcG9uKCk7CisgICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBiZWdpbik7CisgICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBlbmQpOworICAgICAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KGJ1aWxkZXIuYnVpbGQoKSwgcHJvamVjdGlvbiwgV0hFUkVfQ0FMRU5EQVJTX1NFTEVDVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IHNlYXJjaFF1ZXJ5IH0sIERFRkFVTFRfU09SVF9PUkRFUik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZ1tdIHByb2plY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYmVnaW4sIGxvbmcgZW5kLCBTdHJpbmcgd2hlcmUsIFN0cmluZyBvcmRlckJ5KSB7CiAgICAgICAgICAgICBVcmkuQnVpbGRlciBidWlsZGVyID0gQ09OVEVOVF9VUkkuYnVpbGRVcG9uKCk7CiAgICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBiZWdpbik7CkBAIC04NzMsNiArMTAzOSwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG9yZGVyQnkgPT0gbnVsbCA/IERFRkFVTFRfU09SVF9PUkRFUiA6IG9yZGVyQnkpOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgcXVlcnkoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBsb25nIGJlZ2luLAorICAgICAgICAgICAgICAgIGxvbmcgZW5kLCBTdHJpbmcgc2VhcmNoUXVlcnksIFN0cmluZyB3aGVyZSwgU3RyaW5nIG9yZGVyQnkpIHsKKyAgICAgICAgICAgIFVyaS5CdWlsZGVyIGJ1aWxkZXIgPSBDT05URU5UX1NFQVJDSF9VUkkuYnVpbGRVcG9uKCk7CisgICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBiZWdpbik7CisgICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBlbmQpOworICAgICAgICAgICAgYnVpbGRlciA9IGJ1aWxkZXIuYXBwZW5kUGF0aChzZWFyY2hRdWVyeSk7CisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkod2hlcmUpKSB7CisgICAgICAgICAgICAgICAgd2hlcmUgPSBXSEVSRV9DQUxFTkRBUlNfU0VMRUNURUQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdoZXJlID0gIigiICsgd2hlcmUgKyAiKSBBTkQgIiArIFdIRVJFX0NBTEVOREFSU19TRUxFQ1RFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjci5xdWVyeShidWlsZGVyLmJ1aWxkKCksIHByb2plY3Rpb24sIHdoZXJlLCBudWxsLAorICAgICAgICAgICAgICAgICAgICBvcmRlckJ5ID09IG51bGwgPyBERUZBVUxUX1NPUlRfT1JERVIgOiBvcmRlckJ5KTsKKyAgICAgICAgfQorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkwgZm9yIHRoaXMgdGFibGUKICAgICAgICAgICovCkBAIC04ODAsNiArMTA2MSwxMCBAQAogICAgICAgICAgICAgICAgICIvaW5zdGFuY2VzL3doZW4iKTsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9CWV9EQVlfVVJJID0KICAgICAgICAgICAgIFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL2luc3RhbmNlcy93aGVuYnlkYXkiKTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9TRUFSQ0hfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArCisgICAgICAgICAgICAgICAgIi9pbnN0YW5jZXMvc2VhcmNoIik7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfU0VBUkNIX0JZX0RBWV9VUkkgPQorICAgICAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArICIvaW5zdGFuY2VzL3NlYXJjaGJ5ZGF5Iik7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBkZWZhdWx0IHNvcnQgb3JkZXIgZm9yIHRoaXMgdGFibGUuCkBAIC04OTYsNyArMTA4MSw2IEBACiAgICAgICAgICAqIHJlcXVpcmVkIGZvciBjb3JyZWN0bmVzcywgaXQganVzdCBhZGRzIGEgbmljZSB0b3VjaC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPUlRfQ0FMRU5EQVJfVklFVyA9ICJiZWdpbiBBU0MsIGVuZCBERVNDLCB0aXRsZSBBU0MiOwotCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgYmVnaW5uaW5nIHRpbWUgb2YgdGhlIGluc3RhbmNlLCBpbiBVVEMgbWlsbGlzZWNvbmRzCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+CkBAIC0xMDU1LDcgKzEyMzksNyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfRVZFTlREQVlTID0gIm1heEV2ZW50RGF5cyI7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDYWxlbmRhck1ldGFEYXRhIGltcGxlbWVudHMgQ2FsZW5kYXJNZXRhRGF0YUNvbHVtbnMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ2FsZW5kYXJNZXRhRGF0YSBpbXBsZW1lbnRzIENhbGVuZGFyTWV0YURhdGFDb2x1bW5zLCBCYXNlQ29sdW1ucyB7CiAgICAgfQogCiAgICAgcHVibGljIGludGVyZmFjZSBFdmVudERheXNDb2x1bW5zIHsKQEAgLTE0NTMsNCArMTYzNyw0MyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9CiAgICAgICAgICAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoQ2FsZW5kYXIuQ09OVEVOVF9VUkksIENPTlRFTlRfRElSRUNUT1JZKTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2x1bW5zIGZyb20gdGhlIEV2ZW50c1Jhd1RpbWVzIHRhYmxlCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBFdmVudHNSYXdUaW1lc0NvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvcnJlc3BvbmRpbmcgZXZlbnQgaWQKKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9JRCA9ICJldmVudF9pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBSRkMyNDQ1IGNvbXBsaWFudCB0aW1lIHRoZSBldmVudCBzdGFydHMKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERUU1RBUlRfMjQ0NSA9ICJkdHN0YXJ0MjQ0NSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBSRkMyNDQ1IGNvbXBsaWFudCB0aW1lIHRoZSBldmVudCBlbmRzCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVEVORF8yNDQ1ID0gImR0ZW5kMjQ0NSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBSRkMyNDQ1IGNvbXBsaWFudCBvcmlnaW5hbCBpbnN0YW5jZSB0aW1lIG9mIHRoZSByZWN1cnJpbmcgZXZlbnQgZm9yIHdoaWNoIHRoaXMKKyAgICAgICAgICogZXZlbnQgaXMgYW4gZXhjZXB0aW9uLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JJR0lOQUxfSU5TVEFOQ0VfVElNRV8yNDQ1ID0gIm9yaWdpbmFsSW5zdGFuY2VUaW1lMjQ0NSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBSRkMyNDQ1IGNvbXBsaWFudCBsYXN0IGRhdGUgdGhpcyBldmVudCByZXBlYXRzIG9uLCBvciBOVUxMIGlmIGl0IG5ldmVyIGVuZHMKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RfREFURV8yNDQ1ID0gImxhc3REYXRlMjQ0NSI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudHNSYXdUaW1lcyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBFdmVudHNSYXdUaW1lc0NvbHVtbnMgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGxMb2cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGxMb2cuamF2YQppbmRleCBkNTI2MzJiLi5iZjA1MWY1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxsTG9nLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsbExvZy5qYXZhCkBAIC04OCw2ICs4OCwxNyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVU1CRVIgPSAibnVtYmVyIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVGhlIElTTyAzMTY2LTEgdHdvIGxldHRlcnMgY291bnRyeSBjb2RlIG9mIHRoZSBjb3VudHJ5IHdoZXJlIHRoZQorICAgICAgICAgKiB1c2VyIHJlY2VpdmVkIG9yIG1hZGUgdGhlIGNhbGwuCisgICAgICAgICAqIDxQPgorICAgICAgICAgKiBUeXBlOiBURVhUCisgICAgICAgICAqIDwvUD4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPVU5UUllfSVNPID0gImNvdW50cnlpc28iOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgY2FsbCBvY2N1cmVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgogICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzQ29udHJhY3QuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzQ29udHJhY3QuamF2YQppbmRleCA3NDg0OTY0Li4zNmUyYzU2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Db250YWN0c0NvbnRyYWN0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHNDb250cmFjdC5qYXZhCkBAIC0zMCw5ICszMCw5IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaS5CdWlsZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwpAQCAtNDEsNiArNDEsNyBAQAogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKIC8qKgogICogPHA+CkBAIC0xMzAsNiArMTMxLDIwIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVElOR19QQUNLQUdFX1BBUkFNX0tFWSA9ICJyZXF1ZXN0aW5nX3BhY2thZ2UiOwogCiAgICAgLyoqCisgICAgICogUXVlcnkgcGFyYW1ldGVyIHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkgdGhlIGNsaWVudCB0byBhY2Nlc3MgYSBzcGVjaWZpYworICAgICAqIHtAbGluayBEaXJlY3Rvcnl9LiBUaGUgcGFyYW1ldGVyIHZhbHVlIHNob3VsZCBiZSB0aGUgX0lEIG9mIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICogZGlyZWN0b3J5LCBlLmcuCisgICAgICoge0Bjb2RlIGNvbnRlbnQ6Ly9jb20uYW5kcm9pZC5jb250YWN0cy9kYXRhL2VtYWlscy9maWx0ZXIvYWNtZT9kaXJlY3Rvcnk9M30KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RPUllfUEFSQU1fS0VZID0gImRpcmVjdG9yeSI7CisKKyAgICAvKioKKyAgICAgKiBBIHF1ZXJ5IHBhcmFtZXRlciB0aGF0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIHJlc3VsdHMgcmV0dXJuZWQuIFRoZQorICAgICAqIHBhcmFtZXRlciB2YWx1ZSBzaG91bGQgYmUgYW4gaW50ZWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU1JVF9QQVJBTV9LRVkgPSAibGltaXQiOworCisgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByZWZlcmVuY2VzIHsKQEAgLTE4MSw2ICsxOTYsMzI2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQSBEaXJlY3RvcnkgcmVwcmVzZW50cyBhIGNvbnRhY3RzIGNvcnB1cywgZS5nLiBMb2NhbCBjb250YWN0cywKKyAgICAgKiBHb29nbGUgQXBwcyBHbG9iYWwgQWRkcmVzcyBMaXN0IG9yIENvcnBvcmF0ZSBHbG9iYWwgQWRkcmVzcyBMaXN0LgorICAgICAqIDxwPgorICAgICAqIEEgRGlyZWN0b3J5IGlzIGltcGxlbWVudGVkIGFzIGEgY29udGVudCBwcm92aWRlciB3aXRoIGl0cyB1bmlxdWUgYXV0aG9yaXR5IGFuZAorICAgICAqIHRoZSBzYW1lIEFQSSBhcyB0aGUgbWFpbiBDb250YWN0cyBQcm92aWRlci4gIEhvd2V2ZXIsIHRoZXJlIGlzIG5vIGV4cGVjdGF0aW9uIHRoYXQKKyAgICAgKiBldmVyeSBkaXJlY3RvcnkgcHJvdmlkZXIgd2lsbCBpbXBsZW1lbnQgdGhpcyBDb250cmFjdCBpbiBpdHMgZW50aXJldHkuICBJZiBhCisgICAgICogZGlyZWN0b3J5IHByb3ZpZGVyIGRvZXMgbm90IGhhdmUgYW4gaW1wbGVtZW50YXRpb24gZm9yIGEgc3BlY2lmaWMgcmVxdWVzdCwgaXQKKyAgICAgKiBzaG91bGQgdGhyb3cgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBtb3N0IGltcG9ydGFudCB1c2UgY2FzZSBmb3IgRGlyZWN0b3JpZXMgaXMgc2VhcmNoLiAgQSBEaXJlY3RvcnkgcHJvdmlkZXIgaXMKKyAgICAgKiBleHBlY3RlZCB0byBzdXBwb3J0IGF0IGxlYXN0IHtAbGluayBDb250YWN0c0NvbnRyYWN0LkNvbnRhY3RzI0NPTlRFTlRfRklMVEVSX1VSSQorICAgICAqIENvbnRhY3RzLkNPTlRFTlRfRklMVEVSX1VSSX0uICBJZiBhIERpcmVjdG9yeSBwcm92aWRlciB3YW50cyB0byBwYXJ0aWNpcGF0ZQorICAgICAqIGluIGVtYWlsIGFuZCBwaG9uZSBsb29rdXAgZnVuY3Rpb25hbGl0aWVzLCBpdCBzaG91bGQgYWxzbyBpbXBsZW1lbnQKKyAgICAgKiB7QGxpbmsgQ29tbW9uRGF0YUtpbmRzLkVtYWlsI0NPTlRFTlRfRklMVEVSX1VSSSBDb21tb25EYXRhS2luZHMuRW1haWwuQ09OVEVOVF9GSUxURVJfVVJJfQorICAgICAqIGFuZAorICAgICAqIHtAbGluayBDb21tb25EYXRhS2luZHMuUGhvbmUjQ09OVEVOVF9GSUxURVJfVVJJIENvbW1vbkRhdGFLaW5kcy5QaG9uZS5DT05URU5UX0ZJTFRFUl9VUkl9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBBIGRpcmVjdG9yeSBwcm92aWRlciBzaG91bGQgcmV0dXJuIE5VTEwgZm9yIGV2ZXJ5IHByb2plY3Rpb24gZmllbGQgaXQgZG9lcyBub3QKKyAgICAgKiByZWNvZ25pemUsIHJhdGhlciB0aGFuIHRocm93aW5nIGFuIGV4Y2VwdGlvbi4gIFRoaXMgd2F5IGl0IHdpbGwgbm90IGJlIGJyb2tlbgorICAgICAqIGlmIENvbnRhY3RzQ29udHJhY3QgaXMgZXh0ZW5kZWQgd2l0aCBuZXcgZmllbGRzIGluIHRoZSBmdXR1cmUuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBjbGllbnQgaW50ZXJhY3RzIHdpdGggYSBkaXJlY3RvcnkgdmlhIENvbnRhY3RzIFByb3ZpZGVyIGJ5IHN1cHBseWluZyBhbgorICAgICAqIG9wdGlvbmFsIHtAY29kZSBkaXJlY3Rvcnk9fSBxdWVyeSBwYXJhbWV0ZXIuCisgICAgICogPHA+CisgICAgICogPHA+CisgICAgICogV2hlbiB0aGUgQ29udGFjdHMgUHJvdmlkZXIgcmVjZWl2ZXMgdGhlIHJlcXVlc3QsIGl0IHRyYW5zZm9ybXMgdGhlIFVSSSBhbmQgZm9yd2FyZHMKKyAgICAgKiB0aGUgcmVxdWVzdCB0byB0aGUgY29ycmVzcG9uZGluZyBkaXJlY3RvcnkgY29udGVudCBwcm92aWRlci4KKyAgICAgKiBUaGUgVVJJIGlzIHRyYW5zZm9ybWVkIGluIHRoZSBmb2xsb3dpbmcgZmFzaGlvbjoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPlRoZSBVUkkgYXV0aG9yaXR5IGlzIHJlcGxhY2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rICNESVJFQ1RPUllfQVVUSE9SSVRZfS48L2xpPgorICAgICAqIDxsaT5UaGUge0Bjb2RlIGFjY291bnROYW1lPX0gYW5kIHtAY29kZSBhY2NvdW50VHlwZT19IHBhcmFtZXRlcnMgYXJlIGFkZGVkIG9yCisgICAgICogcmVwbGFjZWQgdXNpbmcgdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rICNBQ0NPVU5UX1RZUEV9IGFuZCB7QGxpbmsgI0FDQ09VTlRfTkFNRX0gdmFsdWVzLjwvbGk+CisgICAgICogPGxpPklmIHRoZSBVUkkgaXMgbWlzc2luZyBhIENvbnRhY3RzQ29udHJhY3QuUkVRVUVTVElOR19QQUNLQUdFX1BBUkFNX0tFWQorICAgICAqIHBhcmFtZXRlciwgdGhpcyBwYXJhbWV0ZXIgaXMgYWRkZWQuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBDbGllbnRzIHNob3VsZCBzZW5kIGRpcmVjdG9yeSByZXF1ZXN0cyB0byBDb250YWN0cyBQcm92aWRlciBhbmQgbGV0IGl0CisgICAgICogZm9yd2FyZCB0aGVtIHRvIHRoZSByZXNwZWN0aXZlIHByb3ZpZGVycyByYXRoZXIgdGhhbiBjb25zdHJ1Y3RpbmcKKyAgICAgKiBkaXJlY3RvcnkgcHJvdmlkZXIgVVJJcyBieSB0aGVtc2VsdmVzLiBUaGlzIGxldmVsIG9mIGluZGlyZWN0aW9uIGFsbG93cworICAgICAqIENvbnRhY3RzIFByb3ZpZGVyIHRvIGltcGxlbWVudCBhZGRpdGlvbmFsIHN5c3RlbS1sZXZlbCBmZWF0dXJlcyBhbmQKKyAgICAgKiBvcHRpbWl6YXRpb25zLiBBY2Nlc3MgdG8gQ29udGFjdHMgUHJvdmlkZXIgaXMgcHJvdGVjdGVkIGJ5IHRoZQorICAgICAqIFJFQURfQ09OVEFDVFMgcGVybWlzc2lvbiwgYnV0IGFjY2VzcyB0byB0aGUgZGlyZWN0b3J5IHByb3ZpZGVyIGlzIG5vdC4KKyAgICAgKiBUaGVyZWZvcmUgZGlyZWN0b3J5IHByb3ZpZGVycyBtdXN0IHJlamVjdCByZXF1ZXN0cyBjb21pbmcgZnJvbSBjbGllbnRzCisgICAgICogb3RoZXIgdGhhbiB0aGUgQ29udGFjdHMgUHJvdmlkZXIgaXRzZWxmLiBBbiBlYXN5IHdheSB0byBwcmV2ZW50IHN1Y2gKKyAgICAgKiB1bmF1dGhvcml6ZWQgYWNjZXNzIGlzIHRvIGNoZWNrIHRoZSBuYW1lIG9mIHRoZSBjYWxsaW5nIHBhY2thZ2U6CisgICAgICogPHByZT4KKyAgICAgKiBwcml2YXRlIGJvb2xlYW4gaXNDYWxsZXJBbGxvd2VkKCkgeworICAgICAqICAgUGFja2FnZU1hbmFnZXIgcG0gPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgKiAgIGZvciAoU3RyaW5nIHBhY2thZ2VOYW1lOiBwbS5nZXRQYWNrYWdlc0ZvclVpZChCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKSkgeworICAgICAqICAgICBpZiAocGFja2FnZU5hbWUuZXF1YWxzKCJjb20uYW5kcm9pZC5wcm92aWRlcnMuY29udGFjdHMiKSkgeworICAgICAqICAgICAgIHJldHVybiB0cnVlOworICAgICAqICAgICB9CisgICAgICogICB9CisgICAgICogICByZXR1cm4gZmFsc2U7CisgICAgICogfQorICAgICAqIDwvcHJlPgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgRGlyZWN0b3J5IHRhYmxlIGlzIHJlYWQtb25seSBhbmQgaXMgbWFpbnRhaW5lZCBieSB0aGUgQ29udGFjdHMgUHJvdmlkZXIKKyAgICAgKiBhdXRvbWF0aWNhbGx5LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD5JdCBhbHdheXMgaGFzIGF0IGxlYXN0IHRoZXNlIHR3byByb3dzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+CisgICAgICogVGhlIGxvY2FsIGRpcmVjdG9yeS4gSXQgaGFzIHtAbGluayBEaXJlY3RvcnkjX0lEIERpcmVjdG9yeS5fSUR9ID0KKyAgICAgKiB7QGxpbmsgRGlyZWN0b3J5I0RFRkFVTFQgRGlyZWN0b3J5LkRFRkFVTFR9LiBUaGlzIGRpcmVjdG9yeSBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgbG9jYWxseQorICAgICAqIHN0b3JlZCBjb250YWN0cy4gVGhlIHNhbWUgY2FuIGJlIGFjaGlldmVkIGJ5IG9taXR0aW5nIHRoZSB7QGNvZGUgZGlyZWN0b3J5PX0KKyAgICAgKiBwYXJhbWV0ZXIgYWx0b2dldGhlci4KKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT4KKyAgICAgKiBUaGUgbG9jYWwgaW52aXNpYmxlIGNvbnRhY3RzLiBUaGUgY29ycmVzcG9uZGluZyBkaXJlY3RvcnkgSUQgaXMKKyAgICAgKiB7QGxpbmsgRGlyZWN0b3J5I0xPQ0FMX0lOVklTSUJMRSBEaXJlY3RvcnkuTE9DQUxfSU5WSVNJQkxFfS4KKyAgICAgKiA8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgorICAgICAqIDxwPkN1c3RvbSBEaXJlY3RvcmllcyBhcmUgZGlzY292ZXJlZCBieSB0aGUgQ29udGFjdHMgUHJvdmlkZXIgZm9sbG93aW5nIHRoaXMgcHJvY2VkdXJlOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+SXQgZmluZHMgYWxsIGluc3RhbGxlZCBjb250ZW50IHByb3ZpZGVycyB3aXRoIG1ldGEgZGF0YSBpZGVudGlmeWluZyB0aGVtCisgICAgICogYXMgZGlyZWN0b3J5IHByb3ZpZGVycyBpbiBBbmRyb2lkTWFuaWZlc3QueG1sOgorICAgICAqIDxjb2RlPgorICAgICAqICZsdDttZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNvbnRlbnQuQ29udGFjdERpcmVjdG9yeSIKKyAgICAgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWU9InRydWUiIC8mZ3Q7CisgICAgICogPC9jb2RlPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgdGFnIHNob3VsZCBiZSBwbGFjZWQgaW5zaWRlIHRoZSBjb3JyZXNwb25kaW5nIGNvbnRlbnQgcHJvdmlkZXIgZGVjbGFyYXRpb24uCisgICAgICogPC9wPgorICAgICAqIDwvbGk+CisgICAgICogPGxpPgorICAgICAqIFRoZW4gQ29udGFjdHMgUHJvdmlkZXIgc2VuZHMgYSB7QGxpbmsgRGlyZWN0b3J5I0NPTlRFTlRfVVJJIERpcmVjdG9yeS5DT05URU5UX1VSSX0KKyAgICAgKiBxdWVyeSB0byBlYWNoIG9mIHRoZSBkaXJlY3RvcnkgYXV0aG9yaXRpZXMuICBBIGRpcmVjdG9yeSBwcm92aWRlciBtdXN0IGltcGxlbWVudAorICAgICAqIHRoaXMgcXVlcnkgYW5kIHJldHVybiBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMuICBFYWNoIGRpcmVjdG9yeSByZXR1cm5lZCBieQorICAgICAqIHRoZSBwcm92aWRlciBtdXN0IGhhdmUgYSB1bmlxdWUgY29tYmluYXRpb24gZm9yIHRoZSB7QGxpbmsgI0FDQ09VTlRfTkFNRX0gYW5kCisgICAgICoge0BsaW5rICNBQ0NPVU5UX1RZUEV9IGNvbHVtbnMgKG51bGxzIGFyZSBhbGxvd2VkKS4gIFNpbmNlIGRpcmVjdG9yeSBJRHMgYXJlIGFzc2lnbmVkCisgICAgICogYXV0b21hdGljYWxseSwgdGhlIF9JRCBmaWVsZCB3aWxsIG5vdCBiZSBwYXJ0IG9mIHRoZSBxdWVyeSBwcm9qZWN0aW9uLgorICAgICAqIDwvbGk+CisgICAgICogPGxpPkNvbnRhY3RzIFByb3ZpZGVyIGNvbXBpbGVzIGRpcmVjdG9yeSBsaXN0cyByZWNlaXZlZCBmcm9tIGFsbCBkaXJlY3RvcnkKKyAgICAgKiBwcm92aWRlcnMgaW50byBvbmUsIGFzc2lnbnMgZWFjaCBpbmRpdmlkdWFsIGRpcmVjdG9yeSBhIGdsb2JhbGx5IHVuaXF1ZSBJRCBhbmQKKyAgICAgKiBzdG9yZXMgYWxsIGRpcmVjdG9yeSByZWNvcmRzIGluIHRoZSBEaXJlY3RvcnkgdGFibGUuCisgICAgICogPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KKyAgICAgKiA8cD5Db250YWN0cyBQcm92aWRlciBhdXRvbWF0aWNhbGx5IGludGVycm9nYXRlcyBuZXdseSBpbnN0YWxsZWQgb3IgcmVwbGFjZWQgcGFja2FnZXMuCisgICAgICogVGh1cyBzaW1wbHkgaW5zdGFsbGluZyBhIHBhY2thZ2UgY29udGFpbmluZyBhIGRpcmVjdG9yeSBwcm92aWRlciBpcyBzdWZmaWNpZW50CisgICAgICogdG8gaGF2ZSB0aGF0IHByb3ZpZGVyIHJlZ2lzdGVyZWQuICBBIHBhY2thZ2Ugc3VwcGx5aW5nIGEgZGlyZWN0b3J5IHByb3ZpZGVyIGRvZXMKKyAgICAgKiBub3QgaGF2ZSB0byBjb250YWluIGxhdW5jaGFibGUgYWN0aXZpdGllcy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogRXZlcnkgcm93IGluIHRoZSBEaXJlY3RvcnkgdGFibGUgaXMgYXV0b21hdGljYWxseSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcGFja2FnZQorICAgICAqIChhcGspLiAgSWYgdGhlIHBhY2thZ2UgaXMgbGF0ZXIgdW5pbnN0YWxsZWQsIGFsbCBjb3JyZXNwb25kaW5nIGRpcmVjdG9yeSByb3dzCisgICAgICogYXJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBmcm9tIHRoZSBDb250YWN0cyBQcm92aWRlci4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogV2hlbiB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyBoYW5kbGVkIGJ5IGEgZGlyZWN0b3J5IHByb3ZpZGVyIGNoYW5nZXMKKyAgICAgKiAoZm9yIGluc3RhbmNlIHdoZW4gdGhlIHVzZXIgYWRkcyBhIG5ldyBEaXJlY3RvcnkgYWNjb3VudCksIHRoZSBkaXJlY3RvcnkgcHJvdmlkZXIKKyAgICAgKiBzaG91bGQgY2FsbCB7QGxpbmsgI25vdGlmeURpcmVjdG9yeUNoYW5nZX0gdG8gbm90aWZ5IHRoZSBDb250YWN0cyBQcm92aWRlciBvZiB0aGUgY2hhbmdlLgorICAgICAqIEluIHJlc3BvbnNlLCB0aGUgQ29udGFjdHMgUHJvdmlkZXIgd2lsbCByZXF1ZXJ5IHRoZSBkaXJlY3RvcnkgcHJvdmlkZXIgdG8gb2J0YWluIHRoZQorICAgICAqIG5ldyBsaXN0IG9mIGRpcmVjdG9yaWVzLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBBIGRpcmVjdG9yeSByb3cgY2FuIGJlIG9wdGlvbmFsbHkgYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIGFjY291bnQKKyAgICAgKiAoc2VlIHtAbGluayBhbmRyb2lkLmFjY291bnRzLkFjY291bnRNYW5hZ2VyfSkuIElmIHRoZSBhY2NvdW50IGlzIGxhdGVyIHJlbW92ZWQsCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgZGlyZWN0b3J5IHJvd3MgYXJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBmcm9tIHRoZSBDb250YWN0cyBQcm92aWRlci4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBEaXJlY3RvcnkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucyB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5vdCBpbnN0YW50aWFibGUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIERpcmVjdG9yeSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkkgZm9yIHRoaXMgdGFibGUuICBSZXF1ZXN0cyB0byB0aGlzIFVSSSBjYW4gYmUKKyAgICAgICAgICogcGVyZm9ybWVkIG9uIHRoZSBVSSB0aHJlYWQgYmVjYXVzZSB0aGV5IGFyZSBhbHdheXMgdW5ibG9ja2luZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0KKyAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChBVVRIT1JJVFlfVVJJLCAiZGlyZWN0b3JpZXMiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUtdHlwZSBvZiB7QGxpbmsgI0NPTlRFTlRfVVJJfSBwcm92aWRpbmcgYSBkaXJlY3Rvcnkgb2YKKyAgICAgICAgICogY29udGFjdCBkaXJlY3Rvcmllcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRSA9CisgICAgICAgICAgICAgICAgInZuZC5hbmRyb2lkLmN1cnNvci5kaXIvY29udGFjdF9kaXJlY3RvcmllcyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNSU1FIHR5cGUgb2YgYSB7QGxpbmsgI0NPTlRFTlRfVVJJfSBpdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9JVEVNX1RZUEUgPQorICAgICAgICAgICAgICAgICJ2bmQuYW5kcm9pZC5jdXJzb3IuaXRlbS9jb250YWN0X2RpcmVjdG9yeSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIF9JRCBvZiB0aGUgZGVmYXVsdCBkaXJlY3RvcnksIHdoaWNoIHJlcHJlc2VudHMgbG9jYWxseSBzdG9yZWQgY29udGFjdHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIF9JRCBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgcmVwcmVzZW50cyBsb2NhbGx5IHN0b3JlZCBpbnZpc2libGUgY29udGFjdHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTE9DQUxfSU5WSVNJQkxFID0gMTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdGhhdCBvd25zIHRoaXMgZGlyZWN0b3J5LiBDb250YWN0cyBQcm92aWRlcgorICAgICAgICAgKiBmaWxsIGl0IGluIHdpdGggdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5IHByb3ZpZGVyLgorICAgICAgICAgKiBJZiB0aGUgcGFja2FnZSBpcyBsYXRlciB1bmluc3RhbGxlZCwgdGhlIGRpcmVjdG9yaWVzIGl0IG93bnMgYXJlCisgICAgICAgICAqIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBmcm9tIHRoaXMgdGFibGUuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRZUEU6IFRFWFQ8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAicGFja2FnZU5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdHlwZSBvZiBkaXJlY3RvcnkgY2FwdHVyZWQgYXMgYSByZXNvdXJjZSBJRCBpbiB0aGUgY29udGV4dCBvZiB0aGUKKyAgICAgICAgICogcGFja2FnZSB7QGxpbmsgI1BBQ0tBR0VfTkFNRX0sIGUuZy4gIkNvcnBvcmF0ZSBEaXJlY3RvcnkiCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRZUEU6IElOVEVHRVI8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1JFU09VUkNFX0lEID0gInR5cGVSZXNvdXJjZUlkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4gb3B0aW9uYWwgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZSBVSSB0byByZXByZXNlbnQgdGhpcyBkaXJlY3RvcnksCisgICAgICAgICAqIGUuZy4gIkFjbWUgQ29ycCIKKyAgICAgICAgICogPHA+VFlQRTogdGV4dDwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU1BMQVlfTkFNRSA9ICJkaXNwbGF5TmFtZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgYXV0aG9yaXR5IG9mIHRoZSBEaXJlY3RvcnkgUHJvdmlkZXIuIENvbnRhY3RzIFByb3ZpZGVyIHdpbGwKKyAgICAgICAgICogdXNlIHRoaXMgYXV0aG9yaXR5IHRvIGZvcndhcmQgcmVxdWVzdHMgdG8gdGhlIGRpcmVjdG9yeSBwcm92aWRlci4KKyAgICAgICAgICogQSBkaXJlY3RvcnkgcHJvdmlkZXIgY2FuIGxlYXZlIHRoaXMgY29sdW1uIGVtcHR5IC0gQ29udGFjdHMgUHJvdmlkZXIgd2lsbCBmaWxsIGl0IGluLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBDbGllbnRzIG9mIHRoaXMgQVBJIHNob3VsZCBub3Qgc2VuZCByZXF1ZXN0cyBkaXJlY3RseSB0byB0aGlzIGF1dGhvcml0eS4KKyAgICAgICAgICogQWxsIGRpcmVjdG9yeSByZXF1ZXN0cyBtdXN0IGJlIHJvdXRlZCB0aHJvdWdoIENvbnRhY3RzIFByb3ZpZGVyLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRZUEU6IHRleHQ8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RPUllfQVVUSE9SSVRZID0gImF1dGhvcml0eSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhY2NvdW50IHR5cGUgd2hpY2ggdGhpcyBkaXJlY3RvcnkgaXMgYXNzb2NpYXRlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+VFlQRTogdGV4dDwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfVFlQRSA9ICJhY2NvdW50VHlwZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhY2NvdW50IHdpdGggd2hpY2ggdGhpcyBkaXJlY3RvcnkgaXMgYXNzb2NpYXRlZC4gSWYgdGhlIGFjY291bnQgaXMgbGF0ZXIKKyAgICAgICAgICogcmVtb3ZlZCwgdGhlIGRpcmVjdG9yaWVzIGl0IG93bnMgYXJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBmcm9tIHRoaXMgdGFibGUuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRZUEU6IHRleHQ8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX05BTUUgPSAiYWNjb3VudE5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPbmUgb2Yge0BsaW5rICNFWFBPUlRfU1VQUE9SVF9OT05FfSwge0BsaW5rICNFWFBPUlRfU1VQUE9SVF9BTllfQUNDT1VOVH0sCisgICAgICAgICAqIHtAbGluayAjRVhQT1JUX1NVUFBPUlRfU0FNRV9BQ0NPVU5UX09OTFl9LiBUaGlzIGlzIHRoZSBleHBlY3RhdGlvbiB0aGUKKyAgICAgICAgICogZGlyZWN0b3J5IGhhcyBmb3IgZGF0YSBleHBvcnRlZCBmcm9tIGl0LiAgQ2xpZW50cyBtdXN0IG9iZXkgdGhpcyBzZXR0aW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX1NVUFBPUlQgPSAiZXhwb3J0U3VwcG9ydCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjRVhQT1JUX1NVUFBPUlR9IHNldHRpbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlyZWN0b3J5CisgICAgICAgICAqIGRvZXMgbm90IGFsbG93IGFueSBkYXRhIHRvIGJlIGNvcGllZCBvdXQgb2YgaXQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBPUlRfU1VQUE9SVF9OT05FID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4ge0BsaW5rICNFWFBPUlRfU1VQUE9SVH0gc2V0dGluZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogYWxsb3cgaXRzIGRhdGEgY29waWVkIG9ubHkgdG8gdGhlIGFjY291bnQgc3BlY2lmaWVkIGJ5CisgICAgICAgICAqIHtAbGluayAjQUNDT1VOVF9UWVBFfS97QGxpbmsgI0FDQ09VTlRfTkFNRX0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBPUlRfU1VQUE9SVF9TQU1FX0FDQ09VTlRfT05MWSA9IDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjRVhQT1JUX1NVUFBPUlR9IHNldHRpbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlyZWN0b3J5CisgICAgICAgICAqIGFsbG93IGl0cyBkYXRhIGNvcGllZCB0byBhbnkgY29udGFjdHMgYWNjb3VudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUE9SVF9TVVBQT1JUX0FOWV9BQ0NPVU5UID0gMjsKKworICAgICAgICAvKioKKyAgICAgICAgICogT25lIG9mIHtAbGluayAjU0hPUlRDVVRfU1VQUE9SVF9OT05FfSwge0BsaW5rICNTSE9SVENVVF9TVVBQT1JUX0RBVEFfSVRFTVNfT05MWX0sCisgICAgICAgICAqIHtAbGluayAjU0hPUlRDVVRfU1VQUE9SVF9GVUxMfS4gVGhpcyBpcyB0aGUgZXhwZWN0YXRpb24gdGhlIGRpcmVjdG9yeQorICAgICAgICAgKiBoYXMgZm9yIHNob3J0Y3V0cyBjcmVhdGVkIGZvciBpdHMgZWxlbWVudHMuIENsaWVudHMgbXVzdCBvYmV5IHRoaXMgc2V0dGluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1JUQ1VUX1NVUFBPUlQgPSAic2hvcnRjdXRTdXBwb3J0IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4ge0BsaW5rICNTSE9SVENVVF9TVVBQT1JUfSBzZXR0aW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGRpcmVjdG9yeQorICAgICAgICAgKiBkb2VzIG5vdCBhbGxvdyBhbnkgc2hvcnRjdXRzIGNyZWF0ZWQgZm9yIGl0cyBjb250YWN0cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1JUQ1VUX1NVUFBPUlRfTk9ORSA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjU0hPUlRDVVRfU1VQUE9SVH0gc2V0dGluZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogYWxsb3cgY3JlYXRpb24gb2Ygc2hvcnRjdXRzIGZvciBkYXRhIGl0ZW1zIGxpa2UgZW1haWwsIHBob25lIG9yIHBvc3RhbCBhZGRyZXNzLAorICAgICAgICAgKiBidXQgbm90IHRoZSBlbnRpcmUgY29udGFjdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1JUQ1VUX1NVUFBPUlRfREFUQV9JVEVNU19PTkxZID0gMTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4ge0BsaW5rICNTSE9SVENVVF9TVVBQT1JUfSBzZXR0aW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGRpcmVjdG9yeQorICAgICAgICAgKiBhbGxvdyBjcmVhdGlvbiBvZiBzaG9ydGN1dHMgZm9yIGNvbnRhY3QgYXMgd2VsbCBhcyB0aGVpciBjb25zdGl0dWVudCBlbGVtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1JUQ1VUX1NVUFBPUlRfRlVMTCA9IDI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9uZSBvZiB7QGxpbmsgI1BIT1RPX1NVUFBPUlRfTk9ORX0sIHtAbGluayAjUEhPVE9fU1VQUE9SVF9USFVNQk5BSUxfT05MWX0sCisgICAgICAgICAqIHtAbGluayAjUEhPVE9fU1VQUE9SVF9GVUxMfS4gVGhpcyBpcyBhIGZlYXR1cmUgZmxhZyBpbmRpY2F0aW5nIHRoZSBleHRlbnQKKyAgICAgICAgICogdG8gd2hpY2ggdGhlIGRpcmVjdG9yeSBzdXBwb3J0cyBjb250YWN0IHBob3Rvcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBIT1RPX1NVUFBPUlQgPSAicGhvdG9TdXBwb3J0IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4ge0BsaW5rICNQSE9UT19TVVBQT1JUfSBzZXR0aW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGRpcmVjdG9yeQorICAgICAgICAgKiBkb2VzIG5vdCBwcm92aWRlIGFueSBwaG90b3MuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQSE9UT19TVVBQT1JUX05PTkUgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiB7QGxpbmsgI1BIT1RPX1NVUFBPUlR9IHNldHRpbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlyZWN0b3J5CisgICAgICAgICAqIGNhbiBvbmx5IHByb2R1Y2Ugc21hbGwgc2l6ZSB0aHVtYm5haWxzIG9mIGNvbnRhY3QgcGhvdG9zLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEhPVE9fU1VQUE9SVF9USFVNQk5BSUxfT05MWSA9IDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjUEhPVE9fU1VQUE9SVH0gc2V0dGluZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogaGFzIGZ1bGwtc2l6ZSBjb250YWN0IHBob3RvcywgYnV0IGNhbm5vdCBwcm92aWRlIHNjYWxlZCB0aHVtYm5haWxzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEhPVE9fU1VQUE9SVF9GVUxMX1NJWkVfT05MWSA9IDI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjUEhPVE9fU1VQUE9SVH0gc2V0dGluZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogY2FuIHByb2R1Y2UgdGh1bWJuYWlscyBhcyB3ZWxsIGFzIGZ1bGwtc2l6ZSBjb250YWN0IHBob3Rvcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBIT1RPX1NVUFBPUlRfRlVMTCA9IDM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5vdGlmaWVzIHRoZSBzeXN0ZW0gb2YgYSBjaGFuZ2UgaW4gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgaGFuZGxlZCBieQorICAgICAgICAgKiBhIHBhcnRpY3VsYXIgZGlyZWN0b3J5IHByb3ZpZGVyLiBUaGUgQ29udGFjdHMgcHJvdmlkZXIgd2lsbCB0dXJuIGFyb3VuZAorICAgICAgICAgKiBhbmQgc2VuZCBhIHF1ZXJ5IHRvIHRoZSBkaXJlY3RvcnkgcHJvdmlkZXIgZm9yIHRoZSBmdWxsIGxpc3Qgb2YgZGlyZWN0b3JpZXMsCisgICAgICAgICAqIHdoaWNoIHdpbGwgcmVwbGFjZSB0aGUgcHJldmlvdXMgbGlzdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBub3RpZnlEaXJlY3RvcnlDaGFuZ2UoQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGRvbmUgdG8gdHJpZ2dlciBhIHF1ZXJ5IGJ5IENvbnRhY3RzIFByb3ZpZGVyIGJhY2sgdG8gdGhlIGRpcmVjdG9yeSBwcm92aWRlci4KKyAgICAgICAgICAgIC8vIE5vIGRhdGEgbmVlZHMgdG8gYmUgc2VudCBiYWNrLCBiZWNhdXNlIHRoZSBwcm92aWRlciBjYW4gaW5mZXIgdGhlIGNhbGxpbmcKKyAgICAgICAgICAgIC8vIHBhY2thZ2UgZnJvbSBiaW5kZXIuCisgICAgICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAgICAgcmVzb2x2ZXIudXBkYXRlKERpcmVjdG9yeS5DT05URU5UX1VSSSwgY29udGVudFZhbHVlcywgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBAaGlkZSBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIHVzZXJzIGFyZSB1cGRhdGVkIHRvIHJlZmVyIHRvIFN5bmNTdGF0ZQogICAgICAqIEBkZXByZWNhdGVkIHVzZSBTeW5jU3RhdGUgaW5zdGVhZAogICAgICAqLwpAQCAtMzcyLDEyICs3MDcsNDIgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9SQVdfQ09OVEFDVF9JRCA9ICJuYW1lX3Jhd19jb250YWN0X2lkIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogUmVmZXJlbmNlIHRvIHRoZSByb3cgaW4gdGhlIGRhdGEgdGFibGUgaG9sZGluZyB0aGUgcGhvdG8uCisgICAgICAgICAqIFJlZmVyZW5jZSB0byB0aGUgcm93IGluIHRoZSBkYXRhIHRhYmxlIGhvbGRpbmcgdGhlIHBob3RvLiAgQSBwaG90byBjYW4KKyAgICAgICAgICogYmUgcmVmZXJyZWQgdG8gZWl0aGVyIGJ5IElEICh0aGlzIGZpZWxkKSBvciBieSBVUkkgKHNlZSB7QGxpbmsgI1BIT1RPX1RIVU1CTkFJTF9VUkl9CisgICAgICAgICAqIGFuZCB7QGxpbmsgI1BIT1RPX1VSSX0pLgorICAgICAgICAgKiBJZiBQSE9UT19JRCBpcyBudWxsLCBjb25zdWx0IHtAbGluayAjUEhPVE9fVVJJfSBvciB7QGxpbmsgI1BIT1RPX1RIVU1CTkFJTF9VUkl9LAorICAgICAgICAgKiB3aGljaCBpcyBhIG1vcmUgZ2VuZXJpYyBtZWNoYW5pc20gZm9yIHJlZmVyZW5jaW5nIHRoZSBjb250YWN0IHBob3RvLCBlc3BlY2lhbGx5IGZvcgorICAgICAgICAgKiBjb250YWN0cyByZXR1cm5lZCBieSBub24tbG9jYWwgZGlyZWN0b3JpZXMgKHNlZSB7QGxpbmsgRGlyZWN0b3J5fSkuCisgICAgICAgICAqCiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgUkVGRVJFTkNFUyBkYXRhKF9pZCk8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9UT19JRCA9ICJwaG90b19pZCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEEgVVJJIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgdGhlIGNvbnRhY3QncyBmdWxsLXNpemUgcGhvdG8uCisgICAgICAgICAqIEEgcGhvdG8gY2FuIGJlIHJlZmVycmVkIHRvIGVpdGhlciBieSBhIFVSSSAodGhpcyBmaWVsZCkgb3IgYnkgSUQKKyAgICAgICAgICogKHNlZSB7QGxpbmsgI1BIT1RPX0lEfSkuIElmIFBIT1RPX0lEIGlzIG5vdCBudWxsLCBQSE9UT19VUkkgYW5kCisgICAgICAgICAqIFBIT1RPX1RIVU1CTkFJTF9VUkkgc2hhbGwgbm90IGJlIG51bGwgKGJ1dCBub3QgbmVjZXNzYXJpbHkgdmljZSB2ZXJzYSkuCisgICAgICAgICAqIFRodXMgdXNpbmcgUEhPVE9fVVJJIGlzIGEgbW9yZSByb2J1c3QgbWV0aG9kIG9mIHJldHJpZXZpbmcgY29udGFjdCBwaG90b3MuCisgICAgICAgICAqCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9UT19VUkkgPSAicGhvdG9fdXJpIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQSBVUkkgdGhhdCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhIHRodW1ibmFpbCBvZiB0aGUgY29udGFjdCdzIHBob3RvLgorICAgICAgICAgKiBBIHBob3RvIGNhbiBiZSByZWZlcnJlZCB0byBlaXRoZXIgYnkgYSBVUkkgKHRoaXMgZmllbGQgb3Ige0BsaW5rICNQSE9UT19VUkl9KQorICAgICAgICAgKiBvciBieSBJRCAoc2VlIHtAbGluayAjUEhPVE9fSUR9KS4gSWYgUEhPVE9fSUQgaXMgbm90IG51bGwsIFBIT1RPX1VSSSBhbmQKKyAgICAgICAgICogUEhPVE9fVEhVTUJOQUlMX1VSSSBzaGFsbCBub3QgYmUgbnVsbCAoYnV0IG5vdCBuZWNlc3NhcmlseSB2aWNlIHZlcnNhKS4KKyAgICAgICAgICogSWYgdGhlIGNvbnRlbnQgcHJvdmlkZXIgZG9lcyBub3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGZ1bGwtc2l6ZSBwaG90b3MKKyAgICAgICAgICogYW5kIHRodW1ibmFpbCBwaG90b3MsIFBIT1RPX1RIVU1CTkFJTF9VUkkgYW5kIHtAbGluayAjUEhPVE9fVVJJfSBjYW4gY29udGFpbgorICAgICAgICAgKiB0aGUgc2FtZSB2YWx1ZSwgYnV0IGVpdGhlciBib3RoIHNoZWxsIGJlIG51bGwgb3IgYm90aCBub3QgbnVsbC4KKyAgICAgICAgICoKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBIT1RPX1RIVU1CTkFJTF9VUkkgPSAicGhvdG9fdGh1bWJfdXJpIjsKKworICAgICAgICAvKioKICAgICAgICAgICogTG9va3VwIHZhbHVlIHRoYXQgcmVmbGVjdHMgdGhlIHtAbGluayBHcm91cHMjR1JPVVBfVklTSUJMRX0gc3RhdGUgb2YKICAgICAgICAgICogYW55IHtAbGluayBDb21tb25EYXRhS2luZHMuR3JvdXBNZW1iZXJzaGlwfSBmb3IgdGhpcyBjb250YWN0LgogICAgICAgICAgKi8KQEAgLTQxMiw3ICs3NzcsNiBAQAogICAgICAgICAgKiBDb250YWN0IENoYXQgQ2FwYWJpbGl0aWVzLiBTZWUge0BsaW5rIFN0YXR1c1VwZGF0ZXN9IGZvciBpbmRpdmlkdWFsCiAgICAgICAgICAqIGRlZmluaXRpb25zLgogICAgICAgICAgKiA8cD5UeXBlOiBOVU1CRVI8L3A+Ci0gICAgICAgICAqIEBoaWRlCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UQUNUX0NIQVRfQ0FQQUJJTElUWSA9ICJjb250YWN0X2NoYXRfY2FwYWJpbGl0eSI7CiAKQEAgLTQ1OCw3ICs4MjIsNiBAQAogICAgICAqICdmYW1pbHkgbmFtZScsICdnaXZlbiBuYW1lJyAnbWlkZGxlIG5hbWUnLiAgVGhlIENKSyB0cmFkaXRpb24gaXMKICAgICAgKiAnZmFtaWx5IG5hbWUnICdtaWRkbGUgbmFtZScgJ2dpdmVuIG5hbWUnLCB3aXRoIEphcGFuZXNlIGZhdm9yaW5nIGEgc3BhY2UgYmV0d2VlbgogICAgICAqIHRoZSBuYW1lcyBhbmQgQ2hpbmVzZSBvbWl0dGluZyB0aGUgc3BhY2UuCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50ZXJmYWNlIEZ1bGxOYW1lU3R5bGUgewogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRFRklORUQgPSAwOwpAQCAtNDc3LDcgKzg0MCw2IEBACiAKICAgICAvKioKICAgICAgKiBDb25zdGFudHMgZm9yIHZhcmlvdXMgc3R5bGVzIG9mIGNhcHR1cmluZyB0aGUgcHJvbnVuY2lhdGlvbiBvZiBhIHBlcnNvbidzIG5hbWUuCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50ZXJmYWNlIFBob25ldGljTmFtZVN0eWxlIHsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERUZJTkVEID0gMDsKQEAgLTUwMyw4ICs4NjUsNiBAQAogICAgIC8qKgogICAgICAqIFR5cGVzIG9mIGRhdGEgdXNlZCB0byBwcm9kdWNlIHRoZSBkaXNwbGF5IG5hbWUgZm9yIGEgY29udGFjdC4gTGlzdGVkIGluIHRoZSBvcmRlcgogICAgICAqIG9mIGluY3JlYXNpbmcgcHJpb3JpdHkuCi0gICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBpbnRlcmZhY2UgRGlzcGxheU5hbWVTb3VyY2VzIHsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERUZJTkVEID0gMDsKQEAgLTUyMCwxNSArODgwLDEyIEBACiAgICAgICoKICAgICAgKiBAc2VlIENvbnRhY3RzCiAgICAgICogQHNlZSBSYXdDb250YWN0cwotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludGVyZmFjZSBDb250YWN0TmFtZUNvbHVtbnMgewogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUga2luZCBvZiBkYXRhIHRoYXQgaXMgdXNlZCBhcyB0aGUgZGlzcGxheSBuYW1lIGZvciB0aGUgY29udGFjdCwgc3VjaCBhcwotICAgICAgICAgKiBzdHJ1Y3R1cmVkIG5hbWUgb3IgZW1haWwgYWRkcmVzcy4gIFNlZSBEaXNwbGF5TmFtZVNvdXJjZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRPRE86IGNvbnZlcnQgRGlzcGxheU5hbWVTb3VyY2VzIHRvIGEgbGluayBhZnRlciBpdCBpcyB1bi1oaWRkZW4KKyAgICAgICAgICogc3RydWN0dXJlZCBuYW1lIG9yIGVtYWlsIGFkZHJlc3MuICBTZWUge0BsaW5rIERpc3BsYXlOYW1lU291cmNlc30uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZX05BTUVfU09VUkNFID0gImRpc3BsYXlfbmFtZV9zb3VyY2UiOwogCkBAIC01NzYsOSArOTMzLDcgQEAKIAogICAgICAgICAvKioKICAgICAgICAgICogVGhlIHBob25ldGljIGFscGhhYmV0IHVzZWQgdG8gcmVwcmVzZW50IHRoZSB7QGxpbmsgI1BIT05FVElDX05BTUV9LiAgU2VlCi0gICAgICAgICAqIFBob25ldGljTmFtZVN0eWxlLgotICAgICAgICAgKgotICAgICAgICAgKiBUT0RPOiBjb252ZXJ0IFBob25ldGljTmFtZVN0eWxlIHRvIGEgbGluayBhZnRlciBpdCBpcyB1bi1oaWRkZW4KKyAgICAgICAgICoge0BsaW5rIFBob25ldGljTmFtZVN0eWxlfS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBIT05FVElDX05BTUVfU1RZTEUgPSAicGhvbmV0aWNfbmFtZV9zdHlsZSI7CiAKQEAgLTU4OCwxMyArOTQzLDEwIEBACiAgICAgICAgICAqIHtAbGluayAjUEhPTkVUSUNfTkFNRV9TVFlMRX0uCiAgICAgICAgICAqIDwvcD4KICAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSB2YWx1ZSBtYXkgYmUgc2V0IG1hbnVhbGx5IGJ5IHRoZSB1c2VyLgotICAgICAgICAgKiBUaGlzIGNhcGFiaWxpdHkgaXMgaXMgb2YgaW50ZXJlc3Qgb25seSBpbiBjb3VudHJpZXMKLSAgICAgICAgICogd2l0aCBjb21tb25seSB1c2VkIHBob25ldGljCi0gICAgICAgICAqIGFscGhhYmV0cywgc3VjaCBhcyBKYXBhbiBhbmQgS29yZWEuICBTZWUgUGhvbmV0aWNOYW1lU3R5bGUuCisgICAgICAgICAqIFRoZSB2YWx1ZSBtYXkgYmUgc2V0IG1hbnVhbGx5IGJ5IHRoZSB1c2VyLiBUaGlzIGNhcGFiaWxpdHkgaXMgb2YKKyAgICAgICAgICogaW50ZXJlc3Qgb25seSBpbiBjb3VudHJpZXMgd2l0aCBjb21tb25seSB1c2VkIHBob25ldGljIGFscGhhYmV0cywKKyAgICAgICAgICogc3VjaCBhcyBKYXBhbiBhbmQgS29yZWEuIFNlZSB7QGxpbmsgUGhvbmV0aWNOYW1lU3R5bGV9LgogICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIFRPRE86IGNvbnZlcnQgUGhvbmV0aWNOYW1lU3R5bGUgdG8gYSBsaW5rIGFmdGVyIGl0IGlzIHVuLWhpZGRlbgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhPTkVUSUNfTkFNRSA9ICJwaG9uZXRpY19uYW1lIjsKIApAQCAtNzQxLDYgKzEwOTMsMjAgQEAKICAgICAgKiB0aGF0IG1pbWUgdHlwZS48L3RkPgogICAgICAqIDwvdHI+CiAgICAgICogPHRyPgorICAgICAqIDx0ZD5sb25nPC90ZD4KKyAgICAgKiA8dGQ+e0BsaW5rICNQSE9UT19VUkl9PC90ZD4KKyAgICAgKiA8dGQ+cmVhZC1vbmx5PC90ZD4KKyAgICAgKiA8dGQ+QSBVUkkgdGhhdCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgY29udGFjdCdzIGZ1bGwtc2l6ZSBwaG90by4gVGhpcworICAgICAqIGNvbHVtbiBpcyB0aGUgcHJlZmVycmVkIG1ldGhvZCBvZiByZXRyaWV2aW5nIHRoZSBjb250YWN0IHBob3RvLjwvdGQ+CisgICAgICogPC90cj4KKyAgICAgKiA8dHI+CisgICAgICogPHRkPmxvbmc8L3RkPgorICAgICAqIDx0ZD57QGxpbmsgI1BIT1RPX1RIVU1CTkFJTF9VUkl9PC90ZD4KKyAgICAgKiA8dGQ+cmVhZC1vbmx5PC90ZD4KKyAgICAgKiA8dGQ+QSBVUkkgdGhhdCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgdGh1bWJuYWlsIG9mIGNvbnRhY3QncyBwaG90by4gIFRoaXMKKyAgICAgKiBjb2x1bW4gaXMgdGhlIHByZWZlcnJlZCBtZXRob2Qgb2YgcmV0cmlldmluZyB0aGUgY29udGFjdCBwaG90by48L3RkPgorICAgICAqIDwvdHI+CisgICAgICogPHRyPgogICAgICAqIDx0ZD5pbnQ8L3RkPgogICAgICAqIDx0ZD57QGxpbmsgI0lOX1ZJU0lCTEVfR1JPVVB9PC90ZD4KICAgICAgKiA8dGQ+cmVhZC1vbmx5PC90ZD4KQEAgLTk3NiwxMCArMTM0MiwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIE1hcmsgYSBjb250YWN0IGFzIGhhdmluZyBiZWVuIGNvbnRhY3RlZC4gIFRoaXMgdXBkYXRlcyB0aGUKLSAgICAgICAgICoge0BsaW5rICNUSU1FU19DT05UQUNURUR9IGFuZCB7QGxpbmsgI0xBU1RfVElNRV9DT05UQUNURUR9IGZvciB0aGUKLSAgICAgICAgICogY29udGFjdCwgcGx1cyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgb2YgYW55IGFzc29jaWF0ZWQgcmF3Ci0gICAgICAgICAqIGNvbnRhY3RzLgorICAgICAgICAgKiBNYXJrIGEgY29udGFjdCBhcyBoYXZpbmcgYmVlbiBjb250YWN0ZWQuIFVwZGF0ZXMgdHdvIGZpZWxkczoKKyAgICAgICAgICoge0BsaW5rICNUSU1FU19DT05UQUNURUR9IGFuZCB7QGxpbmsgI0xBU1RfVElNRV9DT05UQUNURUR9LiBUaGUKKyAgICAgICAgICogVElNRVNfQ09OVEFDVEVEIGZpZWxkIGlzIGluY3JlbWVudGVkIGJ5IDEgYW5kIHRoZSBMQVNUX1RJTUVfQ09OVEFDVEVECisgICAgICAgICAqIGZpZWxkIGlzIHBvcHVsYXRlZCB3aXRoIHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lLgogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gcmVzb2x2ZXIgdGhlIENvbnRlbnRSZXNvbHZlciB0byB1c2UKICAgICAgICAgICogQHBhcmFtIGNvbnRhY3RJZCB0aGUgcGVyc29uIHdobyB3YXMgY29udGFjdGVkCkBAIC0xMDQxLDcgKzE0MDcsOCBAQAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBBIHN1Yi1kaXJlY3Rvcnkgb2YgYSBzaW5nbGUgY29udGFjdCB0aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUgY29uc3RpdHVlbnQgcmF3IGNvbnRhY3QKLSAgICAgICAgICoge0BsaW5rIENvbnRhY3RzQ29udHJhY3QuRGF0YX0gcm93cy4KKyAgICAgICAgICoge0BsaW5rIENvbnRhY3RzQ29udHJhY3QuRGF0YX0gcm93cy4gIFRoaXMgZGlyZWN0b3J5IGNhbiBiZSB1c2VkIGVpdGhlcgorICAgICAgICAgKiB3aXRoIGEge0BsaW5rICNDT05URU5UX1VSSX0gb3Ige0BsaW5rICNDT05URU5UX0xPT0tVUF9VUkl9LgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBEYXRhIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIERhdGFDb2x1bW5zIHsKICAgICAgICAgICAgIC8qKgpAQCAtMTA1Nyw2ICsxNDI0LDU3IEBACiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIDxwPgorICAgICAgICAgKiBBIHN1Yi1kaXJlY3Rvcnkgb2YgYSBjb250YWN0IHRoYXQgY29udGFpbnMgYWxsIG9mIGl0cworICAgICAgICAgKiB7QGxpbmsgQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0c30gYXMgd2VsbCBhcworICAgICAgICAgKiB7QGxpbmsgQ29udGFjdHNDb250cmFjdC5EYXRhfSByb3dzLiBUbyBhY2Nlc3MgdGhpcyBkaXJlY3RvcnkgYXBwZW5kCisgICAgICAgICAqIHtAbGluayAjQ09OVEVOVF9ESVJFQ1RPUll9IHRvIHRoZSBjb250YWN0IFVSSS4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogRW50aXR5IGhhcyB0aHJlZSBJRCBmaWVsZHM6IHtAbGluayAjQ09OVEFDVF9JRH0gZm9yIHRoZSBjb250YWN0LAorICAgICAgICAgKiB7QGxpbmsgI1JBV19DT05UQUNUX0lEfSBmb3IgdGhlIHJhdyBjb250YWN0IGFuZCB7QGxpbmsgI0RBVEFfSUR9IGZvcgorICAgICAgICAgKiB0aGUgZGF0YSByb3dzLiBFbnRpdHkgYWx3YXlzIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSByb3cgcGVyCisgICAgICAgICAqIGNvbnN0aXR1ZW50IHJhdyBjb250YWN0LCBldmVuIGlmIHRoZXJlIGFyZSBubyBhY3R1YWwgZGF0YSByb3dzLiBJbgorICAgICAgICAgKiB0aGlzIGNhc2UgdGhlIHtAbGluayAjREFUQV9JRH0gZmllbGQgd2lsbCBiZSBudWxsLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBFbnRpdHkgcmVhZHMgYWxsIGRhdGEgZm9yIHRoZSBlbnRpcmUgY29udGFjdCBpbiBvbmUgdHJhbnNhY3Rpb24sIHRvCisgICAgICAgICAqIGd1YXJhbnRlZSBjb25zaXN0ZW5jeS4gIFRoZXJlIGlzIHNpZ25pZmljYW50IGRhdGEgZHVwbGljYXRpb24KKyAgICAgICAgICogaW4gdGhlIEVudGl0eSAoZWFjaCByb3cgcmVwZWF0cyBhbGwgQ29udGFjdCBjb2x1bW5zIGFuZCBhbGwgUmF3Q29udGFjdAorICAgICAgICAgKiBjb2x1bW5zKSwgc28gdGhlIGJlbmVmaXRzIG9mIHRyYW5zYWN0aW9uYWwgY29uc2lzdGVuY3kgc2hvdWxkIGJlIHdlaWdoZWQKKyAgICAgICAgICogYWdhaW5zdCB0aGUgY29zdCBvZiB0cmFuc2ZlcnJpbmcgbGFyZ2UgYW1vdW50cyBvZiBkZW5vcm1hbGl6ZWQgZGF0YQorICAgICAgICAgKiBmcm9tIHRoZSBQcm92aWRlci4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFbnRpdHkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgQ29udGFjdHNDb2x1bW5zLAorICAgICAgICAgICAgICAgIENvbnRhY3ROYW1lQ29sdW1ucywgUmF3Q29udGFjdHNDb2x1bW5zLCBCYXNlU3luY0NvbHVtbnMsIFN5bmNDb2x1bW5zLCBEYXRhQ29sdW1ucywKKyAgICAgICAgICAgICAgICBTdGF0dXNDb2x1bW5zLCBDb250YWN0T3B0aW9uc0NvbHVtbnMsIENvbnRhY3RTdGF0dXNDb2x1bW5zIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogbm8gcHVibGljIGNvbnN0cnVjdG9yIHNpbmNlIHRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHByaXZhdGUgRW50aXR5KCkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSBkaXJlY3RvcnkgdHdpZyBmb3IgdGhpcyBzdWItdGFibGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVJFQ1RPUlkgPSAiZW50aXRpZXMiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgcmF3IGNvbnRhY3Qgcm93LgorICAgICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFXX0NPTlRBQ1RfSUQgPSAicmF3X2NvbnRhY3RfaWQiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgZGF0YSByb3cuIFRoZSB2YWx1ZSB3aWxsIGJlIG51bGwgaWYgdGhpcyByYXcgY29udGFjdCBoYXMgbm8KKyAgICAgICAgICAgICAqIGRhdGEgcm93cy4KKyAgICAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfSUQgPSAiZGF0YV9pZCI7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+CiAgICAgICAgICAqIEEgPGk+cmVhZC1vbmx5PC9pPiBzdWItZGlyZWN0b3J5IG9mIGEgc2luZ2xlIGNvbnRhY3QgYWdncmVnYXRlIHRoYXQKICAgICAgICAgICogY29udGFpbnMgYWxsIGFnZ3JlZ2F0aW9uIHN1Z2dlc3Rpb25zIChvdGhlciBjb250YWN0cykuIFRoZQogICAgICAgICAgKiBhZ2dyZWdhdGlvbiBzdWdnZXN0aW9ucyBhcmUgY29tcHV0ZWQgYmFzZWQgb24gYXBwcm94aW1hdGUgZGF0YQpAQCAtMTA4MSw5ICsxNDk5LDEzIEBACiAgICAgICAgICAqIDwvcHJlPgogICAgICAgICAgKgogICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGlzIGRpcmVjdG9yeSBjYW4gYmUgdXNlZCBlaXRoZXIgd2l0aCBhIHtAbGluayAjQ09OVEVOVF9VUkl9IG9yCisgICAgICAgICAqIHtAbGluayAjQ09OVEVOVF9MT09LVVBfVVJJfS4KKyAgICAgICAgICogPC9wPgogICAgICAgICAgKi8KLSAgICAgICAgLy8gVE9ETzogYWRkIENvbnRhY3RPcHRpb25zQ29sdW1ucywgQ29udGFjdFN0YXR1c0NvbHVtbnMKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBBZ2dyZWdhdGlvblN1Z2dlc3Rpb25zIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIENvbnRhY3RzQ29sdW1ucyB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQWdncmVnYXRpb25TdWdnZXN0aW9ucyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBDb250YWN0c0NvbHVtbnMsCisgICAgICAgICAgICAgICAgQ29udGFjdE9wdGlvbnNDb2x1bW5zLCBDb250YWN0U3RhdHVzQ29sdW1ucyB7CiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIE5vIHB1YmxpYyBjb25zdHJ1Y3RvciBzaW5jZSB0aGlzIGlzIGEgdXRpbGl0eSBjbGFzcwogICAgICAgICAgICAgICovCkBAIC0xMDk1LDYgKzE1MTcsMTA2IEBACiAgICAgICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RzI0NPTlRFTlRfRklMVEVSX1VSSX0uCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRElSRUNUT1JZID0gInN1Z2dlc3Rpb25zIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBVc2VkIHdpdGgge0BsaW5rIEJ1aWxkZXIjYWRkUGFyYW1ldGVyfSB0byBzcGVjaWZ5IHdoYXQga2luZCBvZiBkYXRhIGlzCisgICAgICAgICAgICAgKiBzdXBwbGllZCBmb3IgdGhlIHN1Z2dlc3Rpb24gcXVlcnkuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQGhpZGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX01BVENIX05BTUUgPSAibmFtZSI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVXNlZCB3aXRoIHtAbGluayBCdWlsZGVyI2FkZFBhcmFtZXRlcn0gdG8gc3BlY2lmeSB3aGF0IGtpbmQgb2YgZGF0YSBpcworICAgICAgICAgICAgICogc3VwcGxpZWQgZm9yIHRoZSBzdWdnZXN0aW9uIHF1ZXJ5LgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEBoaWRlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9NQVRDSF9FTUFJTCA9ICJlbWFpbCI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVXNlZCB3aXRoIHtAbGluayBCdWlsZGVyI2FkZFBhcmFtZXRlcn0gdG8gc3BlY2lmeSB3aGF0IGtpbmQgb2YgZGF0YSBpcworICAgICAgICAgICAgICogc3VwcGxpZWQgZm9yIHRoZSBzdWdnZXN0aW9uIHF1ZXJ5LgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEBoaWRlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9NQVRDSF9QSE9ORSA9ICJwaG9uZSI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVXNlZCB3aXRoIHtAbGluayBCdWlsZGVyI2FkZFBhcmFtZXRlcn0gdG8gc3BlY2lmeSB3aGF0IGtpbmQgb2YgZGF0YSBpcworICAgICAgICAgICAgICogc3VwcGxpZWQgZm9yIHRoZSBzdWdnZXN0aW9uIHF1ZXJ5LgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEBoaWRlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9NQVRDSF9OSUNLTkFNRSA9ICJuaWNrbmFtZSI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQSBjb252ZW5pZW5jZSBidWlsZGVyIGZvciBhZ2dyZWdhdGlvbiBzdWdnZXN0aW9uIGNvbnRlbnQgVVJJcy4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBUT0RPOiBjaGFuZ2UgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjbGFzcyB0byB1c2UgdGhlIGJ1aWxkZXIuCisgICAgICAgICAgICAgKiBAaGlkZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgeworICAgICAgICAgICAgICAgIHByaXZhdGUgbG9uZyBtQ29udGFjdElkOworICAgICAgICAgICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbUtpbmRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtVmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbUxpbWl0OworCisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogT3B0aW9uYWwgZXhpc3RpbmcgY29udGFjdCBJRC4gIElmIGl0IGlzIG5vdCBwcm92aWRlZCwgdGhlIHNlYXJjaAorICAgICAgICAgICAgICAgICAqIHdpbGwgYmUgYmFzZWQgZXhjbHVzaXZlbHkgb24gdGhlIHZhbHVlcyBzdXBwbGllZCB3aXRoIHtAbGluayAjYWRkUGFyYW1ldGVyfS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDb250YWN0SWQobG9uZyBjb250YWN0SWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5tQ29udGFjdElkID0gY29udGFjdElkOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBBIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGFuIGFnZ3JlZ2F0aW9uCisgICAgICAgICAgICAgICAgICogc3VnZ2VzdGlvbi4KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIEBwYXJhbSBraW5kIGNhbiBiZSBvbmUgb2YKKyAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgIHtAbGluayBBZ2dyZWdhdGlvblN1Z2dlc3Rpb25zI1BBUkFNRVRFUl9NQVRDSF9OQU1FfSwKKyAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgIHtAbGluayBBZ2dyZWdhdGlvblN1Z2dlc3Rpb25zI1BBUkFNRVRFUl9NQVRDSF9FTUFJTH0sCisgICAgICAgICAgICAgICAgICogICAgICAgICAgICB7QGxpbmsgQWdncmVnYXRpb25TdWdnZXN0aW9ucyNQQVJBTUVURVJfTUFUQ0hfTklDS05BTUV9LAorICAgICAgICAgICAgICAgICAqICAgICAgICAgICAge0BsaW5rIEFnZ3JlZ2F0aW9uU3VnZ2VzdGlvbnMjUEFSQU1FVEVSX01BVENIX1BIT05FfQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFBhcmFtZXRlcihTdHJpbmcga2luZCwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtS2luZHMuYWRkKGtpbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgbVZhbHVlcy5hZGQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldExpbWl0KGludCBsaW1pdCkgeworICAgICAgICAgICAgICAgICAgICBtTGltaXQgPSBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIFVyaSBidWlsZCgpIHsKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5uZXQuVXJpLkJ1aWxkZXIgYnVpbGRlciA9IENvbnRhY3RzLkNPTlRFTlRfVVJJLmJ1aWxkVXBvbigpOworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZEVuY29kZWRQYXRoKFN0cmluZy52YWx1ZU9mKG1Db250YWN0SWQpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmRQYXRoKENvbnRhY3RzLkFnZ3JlZ2F0aW9uU3VnZ2VzdGlvbnMuQ09OVEVOVF9ESVJFQ1RPUlkpOworICAgICAgICAgICAgICAgICAgICBpZiAobUxpbWl0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoImxpbWl0IiwgU3RyaW5nLnZhbHVlT2YobUxpbWl0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBtS2luZHMuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoInF1ZXJ5IiwgbUtpbmRzLmdldChpKSArICI6IiArIG1WYWx1ZXMuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEBoaWRlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQnVpbGRlciBidWlsZGVyKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0xMTMwLDkgKzE2NTIsMTIgQEAKICAgICAgICAgICogPHA+WW91IHNob3VsZCBhbHNvIGNvbnNpZGVyIHVzaW5nIHRoZSBjb252ZW5pZW5jZSBtZXRob2QKICAgICAgICAgICoge0BsaW5rIENvbnRhY3RzQ29udHJhY3QuQ29udGFjdHMjb3BlbkNvbnRhY3RQaG90b0lucHV0U3RyZWFtKENvbnRlbnRSZXNvbHZlciwgVXJpKX0KICAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhpcyBkaXJlY3RvcnkgY2FuIGJlIHVzZWQgZWl0aGVyIHdpdGggYSB7QGxpbmsgI0NPTlRFTlRfVVJJfSBvcgorICAgICAgICAgKiB7QGxpbmsgI0NPTlRFTlRfTE9PS1VQX1VSSX0uCisgICAgICAgICAqIDwvcD4KICAgICAgICAgICovCi0gICAgICAgIC8vIFRPRE86IGNoYW5nZSBEYXRhQ29sdW1ucyB0byBEYXRhQ29sdW1uc1dpdGhKb2lucwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBob3RvIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIERhdGFDb2x1bW5zIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQaG90byBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBEYXRhQ29sdW1uc1dpdGhKb2lucyB7CiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIG5vIHB1YmxpYyBjb25zdHJ1Y3RvciBzaW5jZSB0aGlzIGlzIGEgdXRpbGl0eSBjbGFzcwogICAgICAgICAgICAgICovCkBAIC0xMTQ4LDcgKzE2NzMsNiBAQAogICAgICAgICAgICAgICogdGhhdCBjb3VsZCBiZSBpbmZsYXRlZCB1c2luZyB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5fS4KICAgICAgICAgICAgICAqIDxwPgogICAgICAgICAgICAgICogVHlwZTogQkxPQgotICAgICAgICAgICAgICogQGhpZGUgVE9ETzogVW5oaWRlIGluIGEgc2VwYXJhdGUgQ0wKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhPVE8gPSBEQVRBMTU7CiAgICAgICAgIH0KQEAgLTExNTcsNyArMTY4MSwxMCBAQAogICAgICAgICAgKiBPcGVucyBhbiBJbnB1dFN0cmVhbSBmb3IgdGhlIGNvbnRhY3RzJ3MgZGVmYXVsdCBwaG90byBhbmQgcmV0dXJucyB0aGUKICAgICAgICAgICogcGhvdG8gYXMgYSBieXRlIHN0cmVhbS4gSWYgdGhlcmUgaXMgbm90IHBob3RvIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KICAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNvbnRhY3RVcmkgdGhlIGNvbnRhY3Qgd2hvc2UgcGhvdG8gc2hvdWxkIGJlIHVzZWQKKyAgICAgICAgICogQHBhcmFtIGNvbnRhY3RVcmkgdGhlIGNvbnRhY3Qgd2hvc2UgcGhvdG8gc2hvdWxkIGJlIHVzZWQuIFRoaXMgY2FuIGJlIHVzZWQgd2l0aAorICAgICAgICAgKiBlaXRoZXIgYSB7QGxpbmsgI0NPTlRFTlRfVVJJfSBvciBhIHtAbGluayAjQ09OVEVOVF9MT09LVVBfVVJJfSBVUkkuCisgICAgICAgICAqIDwvcD4KKwogICAgICAgICAgKiBAcmV0dXJuIGFuIElucHV0U3RyZWFtIG9mIHRoZSBwaG90bywgb3IgbnVsbCBpZiBubyBwaG90byBpcyBwcmVzZW50CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIG9wZW5Db250YWN0UGhvdG9JbnB1dFN0cmVhbShDb250ZW50UmVzb2x2ZXIgY3IsIFVyaSBjb250YWN0VXJpKSB7CkBAIC0xMjQ1LDYgKzE3NzIsMTMgQEAKICAgICAgICAgICogQGhpZGUKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfVkVSSUZJRUQgPSAibmFtZV92ZXJpZmllZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSAicmVhZC1vbmx5IiBmbGFnOiAiMCIgYnkgZGVmYXVsdCwgIjEiIGlmIHRoZSByb3cgY2Fubm90IGJlIG1vZGlmaWVkIG9yCisgICAgICAgICAqIGRlbGV0ZWQgZXhjZXB0IGJ5IGEgc3luYyBhZGFwdGVyLiAgU2VlIHtAbGluayBDb250YWN0c0NvbnRyYWN0I0NBTExFUl9JU19TWU5DQURBUFRFUn0uCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQVdfQ09OVEFDVF9JU19SRUFEX09OTFkgPSAicmF3X2NvbnRhY3RfaXNfcmVhZF9vbmx5IjsKICAgICB9CiAKICAgICAvKioKQEAgLTE2MzAsMTAgKzIxNjQsMTAgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdHUkVHQVRJT05fTU9ERV9ERUZBVUxUID0gMDsKIAogICAgICAgICAvKioKLSAgICAgICAgICogRG8gbm90IHVzZS4KLSAgICAgICAgICoKLSAgICAgICAgICogVE9ETzogZGVwcmVjYXRlIGluIGZhdm9yIG9mIHtAbGluayAjQUdHUkVHQVRJT05fTU9ERV9ERUZBVUxUfQorICAgICAgICAgKiBBZ2dyZWdhdGlvbiBtb2RlOiBhZ2dyZWdhdGUgYXQgdGhlIHRpbWUgdGhlIHJhdyBjb250YWN0IGlzIGluc2VydGVkL3VwZGF0ZWQuCisgICAgICAgICAqIEBkZXByZWNhdGVkIEFnZ3JlZ2F0aW9uIGlzIHN5bmNocm9ub3VzLCB0aGlzIGhpc3RvcmljIHZhbHVlIGlzIGEgbm8tb3AKICAgICAgICAgICovCisgICAgICAgIEBEZXByZWNhdGVkCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFHR1JFR0FUSU9OX01PREVfSU1NRURJQVRFID0gMTsKIAogICAgICAgICAvKioKQEAgLTE3MDEsOSArMjIzNSw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBBIHN1Yi1kaXJlY3Rvcnkgb2YgYSBzaW5nbGUgcmF3IGNvbnRhY3QgdGhhdCBjb250YWlucyBhbGwgb2YgaXRzCiAgICAgICAgICAqIHtAbGluayBDb250YWN0c0NvbnRyYWN0LkRhdGF9IHJvd3MuIFRvIGFjY2VzcyB0aGlzIGRpcmVjdG9yeQotICAgICAgICAgKiBhcHBlbmQge0BsaW5rIERhdGEjQ09OVEVOVF9ESVJFQ1RPUll9IHRvIHRoZSBjb250YWN0IFVSSS4KLSAgICAgICAgICoKLSAgICAgICAgICogVE9ETzogZGVwcmVjYXRlIGluIGZhdm9yIG9mIHtAbGluayBSYXdDb250YWN0cy5FbnRpdHl9LgorICAgICAgICAgKiBhcHBlbmQge0BsaW5rIERhdGEjQ09OVEVOVF9ESVJFQ1RPUll9IHRvIHRoZSByYXcgY29udGFjdCBVUkkuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIERhdGEgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgRGF0YUNvbHVtbnMgewogICAgICAgICAgICAgLyoqCkBAIC0xNzIyLDcgKzIyNTQsNyBAQAogICAgICAgICAgKiA8cD4KICAgICAgICAgICogQSBzdWItZGlyZWN0b3J5IG9mIGEgc2luZ2xlIHJhdyBjb250YWN0IHRoYXQgY29udGFpbnMgYWxsIG9mIGl0cwogICAgICAgICAgKiB7QGxpbmsgQ29udGFjdHNDb250cmFjdC5EYXRhfSByb3dzLiBUbyBhY2Nlc3MgdGhpcyBkaXJlY3RvcnkgYXBwZW5kCi0gICAgICAgICAqIHtAbGluayAjQ09OVEVOVF9ESVJFQ1RPUll9IHRvIHRoZSBjb250YWN0IFVSSS4gU2VlCisgICAgICAgICAqIHtAbGluayBSYXdDb250YWN0cy5FbnRpdHkjQ09OVEVOVF9ESVJFQ1RPUll9IHRvIHRoZSByYXcgY29udGFjdCBVUkkuIFNlZQogICAgICAgICAgKiB7QGxpbmsgUmF3Q29udGFjdHNFbnRpdHl9IGZvciBhIHN0YW5kLWFsb25lIHRhYmxlIGNvbnRhaW5pbmcgdGhlIHNhbWUKICAgICAgICAgICogZGF0YS4KICAgICAgICAgICogPC9wPgpAQCAtMTczNCwxMCArMjI2NiwxMCBAQAogICAgICAgICAgKiBudWxsLgogICAgICAgICAgKiA8L3A+CiAgICAgICAgICAqIDxwPgotICAgICAgICAgKiBFbnRpdHkgcmVhZHMgYWxsCi0gICAgICAgICAqIGRhdGEgZm9yIGEgcmF3IGNvbnRhY3QgaW4gb25lIHRyYW5zYWN0aW9uLCB0byBndWFyYW50ZWUKLSAgICAgICAgICogY29uc2lzdGVuY3kuCi0gICAgICAgICAqIDwvcD4KKyAgICAgICAgICogVXNpbmcgRW50aXR5IHNob3VsZCBiZSBwcmVmZXJyZWQgdG8gdXNpbmcgdHdvIHNlcGFyYXRlIHF1ZXJpZXM6CisgICAgICAgICAqIFJhd0NvbnRhY3RzIGZvbGxvd2VkIGJ5IERhdGEuIFRoZSByZWFzb24gaXMgdGhhdCBFbnRpdHkgcmVhZHMgYWxsCisgICAgICAgICAqIGRhdGEgZm9yIGEgcmF3IGNvbnRhY3QgaW4gb25lIHRyYW5zYWN0aW9uLCBzbyB0aGVyZSBpcyBubyBwb3NzaWJpbGl0eQorICAgICAgICAgKiBvZiB0aGUgZGF0YSBjaGFuZ2luZyBiZXR3ZWVuIHRoZSB0d28gcXVlcmllcy4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRW50aXR5IGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIERhdGFDb2x1bW5zIHsKICAgICAgICAgICAgIC8qKgpAQCAtMTc1Miw3ICsyMjg0LDcgQEAKICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRElSRUNUT1JZID0gImVudGl0eSI7CiAKICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIElEIG9mIHRoZSBkYXRhIGNvbHVtbi4gVGhlIHZhbHVlIHdpbGwgYmUgbnVsbCBpZiB0aGlzIHJhdyBjb250YWN0IGhhcyBubworICAgICAgICAgICAgICogVGhlIElEIG9mIHRoZSBkYXRhIHJvdy4gVGhlIHZhbHVlIHdpbGwgYmUgbnVsbCBpZiB0aGlzIHJhdyBjb250YWN0IGhhcyBubwogICAgICAgICAgICAgICogZGF0YSByb3dzLgogICAgICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KICAgICAgICAgICAgICAqLwpAQCAtMTg0MCwyOCArMjM3MiwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEuREFUQV9WRVJTSU9OKTsKICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogREFUQV9LRVlTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY29sdW1uSW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzTnVsbChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBwdXQgYW55dGhpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3Vyc29yLmdldFR5cGUoY29sdW1uSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9OVUxMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBwdXQgYW55dGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9JTlRFR0VSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3Vyc29yLkZJRUxEX1RZUEVfRkxPQVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9TVFJJTkc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2LnB1dChrZXksIGN1cnNvci5nZXRTdHJpbmcoY29sdW1uSW5kZXgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX0JMT0I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2LnB1dChrZXksIGN1cnNvci5nZXRCbG9iKGNvbHVtbkluZGV4KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnZhbGlkIG9yIHVuaGFuZGxlZCBkYXRhIHR5cGUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGdvIGJhY2sgdG8gdGhpcyB2ZXJzaW9uIG9mIHRoZSBjb2RlIHdoZW4gYnVnCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwOi8vYi9pc3N1ZT9pZD0yMzA2MzcwIGlzIGZpeGVkLgotLy8gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzTnVsbChjb2x1bW5JbmRleCkpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHB1dCBhbnl0aGluZwotLy8gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnNvci5pc0xvbmcoY29sdW1uSW5kZXgpKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KGtleSwgY3Vyc29yLmdldExvbmcoY29sdW1uSW5kZXgpKTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJzb3IuaXNGbG9hdChjb2x1bW5JbmRleCkpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoa2V5LCBjdXJzb3IuZ2V0RmxvYXQoY29sdW1uSW5kZXgpKTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJzb3IuaXNTdHJpbmcoY29sdW1uSW5kZXgpKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KGtleSwgY3Vyc29yLmdldFN0cmluZyhjb2x1bW5JbmRleCkpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnNvci5pc0Jsb2IoY29sdW1uSW5kZXgpKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KGtleSwgY3Vyc29yLmdldEJsb2IoY29sdW1uSW5kZXgpKTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGNvbnRhY3QuYWRkU3ViVmFsdWUoQ29udGFjdHNDb250cmFjdC5EYXRhLkNPTlRFTlRfVVJJLCBjdik7CiAgICAgICAgICAgICAgICAgfSB3aGlsZSAoY3Vyc29yLm1vdmVUb05leHQoKSk7CkBAIC0xOTYyLDI3ICsyNDg3LDI0IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBDb250YWN0J3MgYXVkaW8vdmlkZW8gY2hhdCBjYXBhYmlsaXR5IGxldmVsLgogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChvbmUgb2YgdGhlIHZhbHVlcyBiZWxvdyk8L1A+Ci0gICAgICAgICAqIEBoaWRlCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFUX0NBUEFCSUxJVFkgPSAiY2hhdF9jYXBhYmlsaXR5IjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQW4gYWxsb3dlZCB2YWx1ZSBvZiB7QGxpbmsgI0NIQVRfQ0FQQUJJTElUWX0uIEluZGljYXRlcyB0aGF0IHRoZSBjb250YWN0J3MgZGV2aWNlIGNhbgorICAgICAgICAgKiBBbiBhbGxvd2VkIGZsYWcgb2Yge0BsaW5rICNDSEFUX0NBUEFCSUxJVFl9LiBJbmRpY2F0ZXMgYXVkaW8tY2hhdCBjYXBhYmlsaXR5IChtaWNyb3Bob25lCisgICAgICAgICAqIGFuZCBzcGVha2VyKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQQUJJTElUWV9IQVNfVk9JQ0UgPSAxOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiBhbGxvd2VkIGZsYWcgb2Yge0BsaW5rICNDSEFUX0NBUEFCSUxJVFl9LiBJbmRpY2F0ZXMgdGhhdCB0aGUgY29udGFjdCdzIGRldmljZSBjYW4KICAgICAgICAgICogZGlzcGxheSBhIHZpZGVvIGZlZWQuCi0gICAgICAgICAqIEBoaWRlCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVBBQklMSVRZX0hBU19WSURFT19QTEFZQkFDS19PTkxZID0gMTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQQUJJTElUWV9IQVNfVklERU8gPSAyOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBBbiBhbGxvd2VkIHZhbHVlIG9mIHtAbGluayAjQ0hBVF9DQVBBQklMSVRZfS4gSW5kaWNhdGVzIGF1ZGlvLWNoYXQgY2FwYWJpbGl0eS4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUEFCSUxJVFlfSEFTX1ZPSUNFID0gMjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gYWxsb3dlZCB2YWx1ZSBvZiB7QGxpbmsgI0NIQVRfQ0FQQUJJTElUWX0uIEluZGljYXRlcyB0aGF0IHRoZSBjb250YWN0J3MgZGV2aWNlIGhhcyBhCisgICAgICAgICAqIEFuIGFsbG93ZWQgZmxhZyBvZiB7QGxpbmsgI0NIQVRfQ0FQQUJJTElUWX0uIEluZGljYXRlcyB0aGF0IHRoZSBjb250YWN0J3MgZGV2aWNlIGhhcyBhCiAgICAgICAgICAqIGNhbWVyYSB0aGF0IGNhbiBiZSB1c2VkIGZvciB2aWRlbyBjaGF0IChlLmcuIGEgZnJvbnQtZmFjaW5nIGNhbWVyYSBvbiBhIHBob25lKS4KLSAgICAgICAgICogQGhpZGUKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUEFCSUxJVFlfSEFTX0NBTUVSQSA9IDQ7CiAgICAgfQpAQCAtMjAyOCw2ICsyNTUwLDEzIEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX1NVUEVSX1BSSU1BUlkgPSAiaXNfc3VwZXJfcHJpbWFyeSI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSAicmVhZC1vbmx5IiBmbGFnOiAiMCIgYnkgZGVmYXVsdCwgIjEiIGlmIHRoZSByb3cgY2Fubm90IGJlIG1vZGlmaWVkIG9yCisgICAgICAgICAqIGRlbGV0ZWQgZXhjZXB0IGJ5IGEgc3luYyBhZGFwdGVyLiAgU2VlIHtAbGluayBDb250YWN0c0NvbnRyYWN0I0NBTExFUl9JU19TWU5DQURBUFRFUn0uCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19SRUFEX09OTFkgPSAiaXNfcmVhZF9vbmx5IjsKKworICAgICAgICAvKioKICAgICAgICAgICogVGhlIHZlcnNpb24gb2YgdGhpcyBkYXRhIHJlY29yZC4gVGhpcyBpcyBhIHJlYWQtb25seSB2YWx1ZS4gVGhlIGRhdGEgY29sdW1uIGlzCiAgICAgICAgICAqIGd1YXJhbnRlZWQgdG8gbm90IGNoYW5nZSB3aXRob3V0IHRoZSB2ZXJzaW9uIGdvaW5nIHVwLiBUaGlzIHZhbHVlIGlzIG1vbm90b25pY2FsbHkKICAgICAgICAgICogaW5jcmVhc2luZy4KQEAgLTI4NjIsNiArMzM5MSwxNCBAQAogICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSAibGFiZWwiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcGhvbmUgbnVtYmVyJ3MgRTE2NCByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PUk1BTElaRURfTlVNQkVSID0gIm5vcm1hbGl6ZWRfbnVtYmVyIjsKICAgICB9CiAKICAgICAvKioKQEAgLTMxMjQsNiArMzY2MSwzMiBAQAogICAgICAqIDxsaT57QGxpbmsgI0FWQUlMQUJMRX08L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFNpbmNlIHByZXNlbmNlIHN0YXR1cyBpcyBpbmhlcmVudGx5IHZvbGF0aWxlLCB0aGUgY29udGVudCBwcm92aWRlcgorICAgICAqIG1heSBjaG9vc2Ugbm90IHRvIHN0b3JlIHRoaXMgZmllbGQgaW4gbG9uZy10ZXJtIHN0b3JhZ2UuCisgICAgICogPC9wPgorICAgICAqIDwvdGQ+CisgICAgICogPC90cj4KKyAgICAgKiA8dHI+CisgICAgICogPHRkPmludDwvdGQ+CisgICAgICogPHRkPntAbGluayAjQ0hBVF9DQVBBQklMSVRZfTwvdGQ+CisgICAgICogPHRkPnJlYWQvd3JpdGU8L3RkPgorICAgICAqIDx0ZD5Db250YWN0IElNIGNoYXQgY29tcGF0aWJpbGl0eSB2YWx1ZS4gVGhlIGFsbG93ZWQgdmFsdWVzIGNvbWJpbmF0aW9ucyBvZiB0aGUgZm9sbG93aW5nCisgICAgICogZmxhZ3MuIElmIE5vbmUgb2YgdGhlc2UgZmxhZ3MgaXMgc2V0LCB0aGUgZGV2aWNlIGNhbiBvbmx5IGRvIHRleHQgbWVzc2FnaW5nLgorICAgICAqIDxwPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNDQVBBQklMSVRZX0hBU19WSURFT308L2xpPgorICAgICAqIDxsaT57QGxpbmsgI0NBUEFCSUxJVFlfSEFTX1ZPSUNFfTwvbGk+CisgICAgICogPGxpPntAbGluayAjQ0FQQUJJTElUWV9IQVNfQ0FNRVJBfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogU2luY2UgY2hhdCBjb21wYXRpYmlsaXR5IGlzIGluaGVyZW50bHkgdm9sYXRpbGUgYXMgdGhlIGNvbnRhY3QncyBhdmFpbGFiaWxpdHkgbW92ZXMgZnJvbQorICAgICAqIG9uZSBkZXZpY2UgdG8gYW5vdGhlciwgdGhlIGNvbnRlbnQgcHJvdmlkZXIgbWF5IGNob29zZSBub3QgdG8gc3RvcmUgdGhpcyBmaWVsZCBpbiBsb25nLXRlcm0KKyAgICAgKiBzdG9yYWdlLgorICAgICAqIDwvcD4KKyAgICAgKiA8L3RkPgorICAgICAqIDwvdHI+CiAgICAgICogPHRyPgogICAgICAqIDx0ZD5TdHJpbmc8L3RkPgogICAgICAqIDx0ZD57QGxpbmsgI1NUQVRVU308L3RkPgpAQCAtMzY5MSw2ICs0MjU0LDE0IEBACiAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVU1CRVIgPSBEQVRBOwogCiAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSBwaG9uZSBudW1iZXIncyBFMTY0IHJlcHJlc2VudGF0aW9uLgorICAgICAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAaGlkZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1JNQUxJWkVEX05VTUJFUiA9IERBVEE0OworCisgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFR5cGVMYWJlbChSZXNvdXJjZXMsIGludCwgQ2hhclNlcXVlbmNlKX0gaW5zdGVhZC4KICAgICAgICAgICAgICAqIEBoaWRlCiAgICAgICAgICAgICAgKi8KQEAgLTM3NzIsNyArNDM0Myw3IEBACiAgICAgICAgICAqIDwvdHI+CiAgICAgICAgICAqIDx0cj4KICAgICAgICAgICogPHRkPlN0cmluZzwvdGQ+Ci0gICAgICAgICAqIDx0ZD57QGxpbmsgI0RBVEF9PC90ZD4KKyAgICAgICAgICogPHRkPntAbGluayAjQUREUkVTU308L3RkPgogICAgICAgICAgKiA8dGQ+e0BsaW5rICNEQVRBMX08L3RkPgogICAgICAgICAgKiA8dGQ+RW1haWwgYWRkcmVzcyBpdHNlbGYuPC90ZD4KICAgICAgICAgICogPC90cj4KQEAgLTM4NjMsNyArNDQzNCw2IEBACiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIFRoZSBlbWFpbCBhZGRyZXNzLgogICAgICAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICAgICAqIEBoaWRlIFRPRE86IFVuaGlkZSBpbiBhIHNlcGFyYXRlIENMCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERFJFU1MgPSBEQVRBMTsKIApAQCAtNTAyNyw2ICs1NTk3LDIzIEBACiAgICAgICAgICAqIFR5cGU6IElOVEVHRVIgKGJvb2xlYW4pCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9VTERfU1lOQyA9ICJzaG91bGRfc3luYyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFueSBuZXdseSBjcmVhdGVkIGNvbnRhY3RzIHdpbGwgYXV0b21hdGljYWxseSBiZSBhZGRlZCB0byBncm91cHMgdGhhdCBoYXZlIHRoaXMKKyAgICAgICAgICogZmxhZyBzZXQgdG8gdHJ1ZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFR5cGU6IElOVEVHRVIgKGJvb2xlYW4pCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPX0FERCA9ICJhdXRvX2FkZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZW4gYSBjb250YWN0cyBpcyBtYXJrZWQgYXMgYSBmYXZvcml0ZXMgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkCisgICAgICAgICAqIHRvIHRoZSBncm91cHMgdGhhdCBoYXZlIHRoaXMgZmxhZyBzZXQsIGFuZCB3aGVuIGl0IGlzIHJlbW92ZWQgZnJvbSBmYXZvcml0ZXMKKyAgICAgICAgICogaXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlc2UgZ3JvdXBzLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVHlwZTogSU5URUdFUiAoYm9vbGVhbikKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVk9SSVRFUyA9ICJmYXZvcml0ZXMiOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTE2Nyw2ICs1NzU0LDggQEAKICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCB2YWx1ZXMsIERFTEVURUQpOwogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgdmFsdWVzLCBOT1RFUyk7CiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCB2YWx1ZXMsIFNIT1VMRF9TWU5DKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIHZhbHVlcywgRkFWT1JJVEVTKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIHZhbHVlcywgQVVUT19BREQpOwogICAgICAgICAgICAgICAgIGN1cnNvci5tb3ZlVG9OZXh0KCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHkodmFsdWVzKTsKICAgICAgICAgICAgIH0KQEAgLTU2ODMsNiArNjI3MiwyOCBAQAogICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jb250YWN0cy5hY3Rpb24uU0hPV19PUl9DUkVBVEVfQ09OVEFDVCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFN0YXJ0cyBhbiBBY3Rpdml0eSB0aGF0IGxldHMgdGhlIHVzZXIgc2VsZWN0IHRoZSBtdWx0aXBsZSBwaG9uZXMgZnJvbSBhCisgICAgICAgICAqIGxpc3Qgb2YgcGhvbmUgbnVtYmVycyB3aGljaCBjb21lIGZyb20gdGhlIGNvbnRhY3RzIG9yCisgICAgICAgICAqIHtAbGluayAjRVhUUkFfUEhPTkVfVVJJU30uCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcGhvbmUgbnVtYmVycyBiZWluZyBwYXNzZWQgaW4gdGhyb3VnaCB7QGxpbmsgI0VYVFJBX1BIT05FX1VSSVN9CisgICAgICAgICAqIGNvdWxkIGJlbG9uZyB0byB0aGUgY29udGFjdHMgb3Igbm90LCBhbmQgd2lsbCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHVzZXIncyBzZWxlY3Rpb24gd2lsbCBiZSByZXR1cm5lZCBmcm9tCisgICAgICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkFjdGl2aXR5UmVzdWx0KGludCwgaW50LCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50KX0KKyAgICAgICAgICogaWYgdGhlIHJlc3VsdENvZGUgaXMKKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I1JFU1VMVF9PS30sIHRoZSBhcnJheSBvZiBwaWNrZWQgcGhvbmUKKyAgICAgICAgICogbnVtYmVycyBhcmUgaW4gdGhlIEludGVudCdzCisgICAgICAgICAqIHtAbGluayAjRVhUUkFfUEhPTkVfVVJJU307IG90aGVyd2lzZSwgdGhlCisgICAgICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNSRVNVTFRfQ0FOQ0VMRUR9IGlzIHJldHVybmVkIGlmIHRoZSB1c2VyCisgICAgICAgICAqIGxlZnQgdGhlIEFjdGl2aXR5IHdpdGhvdXQgY2hhbmdpbmcgdGhlIHNlbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9HRVRfTVVMVElQTEVfUEhPTkVTID0KKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuY29udGFjdHMuYWN0aW9uLkdFVF9NVUxUSVBMRV9QSE9ORVMiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNTSE9XX09SX0NSRUFURV9DT05UQUNUfSB0byBmb3JjZSBjcmVhdGluZyBhIG5ldwogICAgICAgICAgKiBjb250YWN0IGlmIG5vIG1hdGNoaW5nIGNvbnRhY3QgZm91bmQuIE90aGVyd2lzZSwgZGVmYXVsdCBiZWhhdmlvciBpcwogICAgICAgICAgKiB0byBwcm9tcHQgdXNlciB3aXRoIGRpYWxvZyBiZWZvcmUgY3JlYXRpbmcuCkBAIC01NzAzLDYgKzYzMTQsMjMgQEAKICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jb250YWN0cy5hY3Rpb24uQ1JFQVRFX0RFU0NSSVBUSU9OIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX0dFVF9NVUxUSVBMRV9QSE9ORVN9IGFzIHRoZSBpbnB1dCBvciBvdXRwdXQgdmFsdWUuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcGhvbmUgbnVtYmVycyB3YW50IHRvIGJlIHBpY2tlZCBieSBkZWZhdWx0IHNob3VsZCBiZSBwYXNzZWQgaW4gYXMKKyAgICAgICAgICogaW5wdXQgdmFsdWUuIFRoZXNlIHBob25lIG51bWJlcnMgY291bGQgYmVsb25nIHRvIHRoZSBjb250YWN0cyBvciBub3QuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcGhvbmUgbnVtYmVycyB3aGljaCB3ZXJlIHBpY2tlZCBieSB0aGUgdXNlciBhcmUgcmV0dXJuZWQgYXMgb3V0cHV0CisgICAgICAgICAqIHZhbHVlLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVHlwZTogYXJyYXkgb2YgVVJJcywgdGhlIHRlbCBVUkkgaXMgdXNlZCBmb3IgdGhlIHBob25lIG51bWJlcnMgd2hpY2ggZG9uJ3QKKyAgICAgICAgICogYmVsb25nIHRvIGFueSBjb250YWN0LCB0aGUgY29udGVudCBVUkkgaXMgdXNlZCBmb3IgcGhvbmUgaWQgaW4gY29udGFjdHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9QSE9ORV9VUklTID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5jb250YWN0cy5leHRyYS5QSE9ORV9VUklTIjsKKworICAgICAgICAvKioKICAgICAgICAgICogT3B0aW9uYWwgZXh0cmEgdXNlZCB3aXRoIHtAbGluayAjU0hPV19PUl9DUkVBVEVfQ09OVEFDVH0gdG8gc3BlY2lmeSBhCiAgICAgICAgICAqIGRpYWxvZyBsb2NhdGlvbiB1c2luZyBzY3JlZW4gY29vcmRpbmF0ZXMuIFdoZW4gbm90IHNwZWNpZmllZCwgdGhlCiAgICAgICAgICAqIGRpYWxvZyB3aWxsIGJlIGNlbnRlcmVkLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvRHJtU3RvcmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0RybVN0b3JlLmphdmEKaW5kZXggYzQzOGFjNC4uMzRmMmYwZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvRHJtU3RvcmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Ecm1TdG9yZS5qYXZhCkBAIC0xMzEsNyArMTMxLDcgQEAKICAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciBpbnNlcnRpbmcgYSBmaWxlIHN0cmVhbSBpbnRvIHRoZSBEUk0gY29udGVudCBwcm92aWRlci4KICAgICAgKgogICAgICAqIEBwYXJhbSBjciBUaGUgY29udGVudCByZXNvbHZlciB0byB1c2UKLSAgICAgKiBAcGFyYW0gZmlsZVN0cmVhbSBUaGUgRmlsZUlucHV0U3RyZWFtIHRvIGluc2VydAorICAgICAqIEBwYXJhbSBmaXMgVGhlIEZpbGVJbnB1dFN0cmVhbSB0byBpbnNlcnQKICAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIGZvciB0aGUgY29udGVudCAob3IgbnVsbCkKICAgICAgKiBAcmV0dXJuIHVyaSB0byB0aGUgRFJNIHJlY29yZCBvciBudWxsCiAgICAgICovCkBAIC0xNDMsMTEgKzE0MywxMSBAQAogICAgICAgICAgICAgRHJtUmF3Q29udGVudCBjb250ZW50ID0gbmV3IERybVJhd0NvbnRlbnQoZmlzLCAoaW50KSBmaXMuYXZhaWxhYmxlKCksCiAgICAgICAgICAgICAgICAgICAgIERybVJhd0NvbnRlbnQuRFJNX01JTUVUWVBFX01FU1NBR0VfU1RSSU5HKTsKICAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IGNvbnRlbnQuZ2V0Q29udGVudFR5cGUoKTsKKyAgICAgICAgICAgIGxvbmcgc2l6ZSA9IGZpcy5nZXRDaGFubmVsKCkuc2l6ZSgpOwogCiAgICAgICAgICAgICBEcm1SaWdodHNNYW5hZ2VyIG1hbmFnZXIgPSBtYW5hZ2VyID0gRHJtUmlnaHRzTWFuYWdlci5nZXRJbnN0YW5jZSgpOwogICAgICAgICAgICAgRHJtUmlnaHRzIHJpZ2h0cyA9IG1hbmFnZXIucXVlcnlSaWdodHMoY29udGVudCk7CiAgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBjb250ZW50LmdldENvbnRlbnRJbnB1dFN0cmVhbShyaWdodHMpOwotICAgICAgICAgICAgbG9uZyBzaXplID0gc3RyZWFtLmF2YWlsYWJsZSgpOwogCiAgICAgICAgICAgICBVcmkgY29udGVudFVyaSA9IG51bGw7CiAgICAgICAgICAgICBpZiAobWltZVR5cGUuc3RhcnRzV2l0aCgiYXVkaW8vIikpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUuamF2YQppbmRleCAwNzVkYTMzLi5iNzRlNzZmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZS5qYXZhCkBAIC0yNTMsOSArMjUzLDEwMyBAQAogICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9UWVBFID0gIm1pbWVfdHlwZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNVFAgb2JqZWN0IGhhbmRsZSBvZiBhIG5ld2x5IHRyYW5zZmVyZWQgZmlsZS4KKyAgICAgICAgICogVXNlZCB0byBwYXNzIHRoZSBuZXcgZmlsZSdzIG9iamVjdCBoYW5kbGUgdGhyb3VnaCB0aGUgbWVkaWEgc2Nhbm5lcgorICAgICAgICAgKiBmcm9tIE1UUCB0byB0aGUgbWVkaWEgcHJvdmlkZXIKKyAgICAgICAgICogRm9yIGludGVybmFsIHVzZSBvbmx5IGJ5IE1UUCwgbWVkaWEgc2Nhbm5lciBhbmQgbWVkaWEgcHJvdmlkZXIuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJQV9TQ0FOTkVSX05FV19PQkpFQ1RfSUQgPSAibWVkaWFfc2Nhbm5lcl9uZXdfb2JqZWN0X2lkIjsKICAgICAgfQogCiAgICAgLyoqCisgICAgICogTWVkaWEgcHJvdmlkZXIgdGFibGUgY29udGFpbmluZyBhbiBpbmRleCBvZiBhbGwgZmlsZXMgaW4gdGhlIHN0b3JhZ2UuCisgICAgICogVGhpcyBjYW4gYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMgdG8gZmluZCBhbGwgZG9jdW1lbnRzIG9mIGEgcGFydGljdWxhciB0eXBlCisgICAgICogYW5kIGlzIGFsc28gdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBkZXZpY2Ugc2lkZSBNVFAgaW1wbGVtZW50YXRpb24uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZpbGVzIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFVyaSBnZXRDb250ZW50VXJpKFN0cmluZyB2b2x1bWVOYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgdm9sdW1lTmFtZSArCisgICAgICAgICAgICAgICAgICAgICIvZmlsZSIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgZ2V0Q29udGVudFVyaShTdHJpbmcgdm9sdW1lTmFtZSwKKyAgICAgICAgICAgICAgICBsb25nIGZpbGVJZCkgeworICAgICAgICAgICAgcmV0dXJuIFVyaS5wYXJzZShDT05URU5UX0FVVEhPUklUWV9TTEFTSCArIHZvbHVtZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiL2ZpbGUvIiArIGZpbGVJZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFVyaSBnZXRNdHBPYmplY3RzVXJpKFN0cmluZyB2b2x1bWVOYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgdm9sdW1lTmFtZSArCisgICAgICAgICAgICAgICAgICAgICIvb2JqZWN0Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBnZXRNdHBPYmplY3RzVXJpKFN0cmluZyB2b2x1bWVOYW1lLAorICAgICAgICAgICAgICAgIGxvbmcgZmlsZUlkKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgdm9sdW1lTmFtZQorICAgICAgICAgICAgICAgICAgICArICIvb2JqZWN0LyIgKyBmaWxlSWQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVXNlZCB0byBpbXBsZW1lbnQgdGhlIE1UUCBHZXRPYmplY3RSZWZlcmVuY2VzIGFuZCBTZXRPYmplY3RSZWZlcmVuY2VzIGNvbW1hbmRzLgorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBnZXRNdHBSZWZlcmVuY2VzVXJpKFN0cmluZyB2b2x1bWVOYW1lLAorICAgICAgICAgICAgICAgIGxvbmcgZmlsZUlkKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgdm9sdW1lTmFtZQorICAgICAgICAgICAgICAgICAgICArICIvb2JqZWN0LyIgKyBmaWxlSWQgKyAiL3JlZmVyZW5jZXMiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBGaWVsZHMgZm9yIG1hc3RlciB0YWJsZSBmb3IgYWxsIG1lZGlhIGZpbGVzLgorICAgICAgICAgKiBUYWJsZSBhbHNvIGNvbnRhaW5zIE1lZGlhQ29sdW1ucy5fSUQsIERBVEEsIFNJWkUgYW5kIERBVEVfTU9ESUZJRUQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50ZXJmYWNlIEZpbGVDb2x1bW5zIGV4dGVuZHMgTWVkaWFDb2x1bW5zIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIE1UUCBmb3JtYXQgY29kZSBvZiB0aGUgZmlsZQorICAgICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUID0gImZvcm1hdCI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIGluZGV4IG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBmaWxlCisgICAgICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlQgPSAicGFyZW50IjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgTUlNRSB0eXBlIG9mIHRoZSBmaWxlCisgICAgICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX1RZUEUgPSAibWltZV90eXBlIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgdGl0bGUgb2YgdGhlIGNvbnRlbnQKKyAgICAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gInRpdGxlIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgbWVkaWEgdHlwZSAoYXVkaW8sIHZpZGVvLCBpbWFnZSBvciBwbGF5bGlzdCkKKyAgICAgICAgICAgICAqIG9mIHRoZSBmaWxlLCBvciAwIGZvciBub3QgYSBtZWRpYSBmaWxlCisgICAgICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJQV9UWVBFID0gIm1lZGlhX3R5cGUiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIENvbnN0YW50cyBmb3IgTUVESUFfVFlQRQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRURJQV9UWVBFX05PTkUgPSAwOworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfVFlQRV9JTUFHRSA9IDE7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRURJQV9UWVBFX0FVRElPID0gMjsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FRElBX1RZUEVfVklERU8gPSAzOworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfVFlQRV9QTEFZTElTVCA9IDQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgaW50ZXJuYWxseSBieSBJbWFnZXMuVGh1bWJuYWlscyBhbmQgVmlkZW8uVGh1bWJuYWlscywgaXQncyBub3QgaW50ZW5kZWQKICAgICAgKiB0byBiZSBhY2Nlc3NlZCBlbHNld2hlcmUuCiAgICAgICovCkBAIC0zMzUsMjYgKzQyOSwyNyBAQAogICAgICAgICAgICAgLy8gTG9nLnYoVEFHLCAiZ2V0VGh1bWJuYWlsOiBvcmlnSWQ9IitvcmlnSWQrIiwga2luZD0iK2tpbmQrIiwgaXNWaWRlbz0iK2lzVmlkZW8pOwogICAgICAgICAgICAgLy8gSWYgdGhlIG1hZ2ljIGlzIG5vbi16ZXJvLCB3ZSBzaW1wbHkgcmV0dXJuIHRodW1ibmFpbCBpZiBpdCBkb2VzIGV4aXN0LgogICAgICAgICAgICAgLy8gcXVlcnlpbmcgTWVkaWFQcm92aWRlciBhbmQgc2ltcGx5IHJldHVybiB0aHVtYm5haWwuCi0gICAgICAgICAgICBNaW5pVGh1bWJGaWxlIHRodW1iRmlsZSA9IE1pbmlUaHVtYkZpbGUuaW5zdGFuY2UoYmFzZVVyaSk7Ci0gICAgICAgICAgICBsb25nIG1hZ2ljID0gdGh1bWJGaWxlLmdldE1hZ2ljKG9yaWdJZCk7Ci0gICAgICAgICAgICBpZiAobWFnaWMgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChraW5kID09IE1JQ1JPX0tJTkQpIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzVGh1bWJCdWZMb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc1RodW1iQnVmID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzVGh1bWJCdWYgPSBuZXcgYnl0ZVtNaW5pVGh1bWJGaWxlLkJZVEVTX1BFUl9NSU5USFVNQl07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGh1bWJGaWxlLmdldE1pbmlUaHVtYkZyb21GaWxlKG9yaWdJZCwgc1RodW1iQnVmKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVCeXRlQXJyYXkoc1RodW1iQnVmLCAwLCBzVGh1bWJCdWYubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYml0bWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY291bGRuJ3QgZGVjb2RlIGJ5dGUgYXJyYXkuIik7CisgICAgICAgICAgICBNaW5pVGh1bWJGaWxlIHRodW1iRmlsZSA9IG5ldyBNaW5pVGh1bWJGaWxlKGlzVmlkZW8gPyBWaWRlby5NZWRpYS5FWFRFUk5BTF9DT05URU5UX1VSSQorICAgICAgICAgICAgICAgICAgICA6IEltYWdlcy5NZWRpYS5FWFRFUk5BTF9DT05URU5UX1VSSSk7CisgICAgICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvbmcgbWFnaWMgPSB0aHVtYkZpbGUuZ2V0TWFnaWMob3JpZ0lkKTsKKyAgICAgICAgICAgICAgICBpZiAobWFnaWMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA9PSBNSUNST19LSU5EKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNUaHVtYkJ1ZkxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc1RodW1iQnVmID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1RodW1iQnVmID0gbmV3IGJ5dGVbTWluaVRodW1iRmlsZS5CWVRFU19QRVJfTUlOVEhVTUJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGh1bWJGaWxlLmdldE1pbmlUaHVtYkZyb21GaWxlKG9yaWdJZCwgc1RodW1iQnVmKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KHNUaHVtYkJ1ZiwgMCwgc1RodW1iQnVmLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRtYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY291bGRuJ3QgZGVjb2RlIGJ5dGUgYXJyYXkuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpdG1hcDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT0gTUlOSV9LSU5EKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb2x1bW4gPSBpc1ZpZGVvID8gInZpZGVvX2lkPSIgOiAiaW1hZ2VfaWQ9IjsKLSAgICAgICAgICAgICAgICAgICAgQ3Vyc29yIGMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpdG1hcDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChraW5kID09IE1JTklfS0lORCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbHVtbiA9IGlzVmlkZW8gPyAidmlkZW9faWQ9IiA6ICJpbWFnZV9pZD0iOwogICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KGJhc2VVcmksIFBST0pFQ1RJT04sIGNvbHVtbiArIG9yaWdJZCwgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsICYmIGMubW92ZVRvRmlyc3QoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCA9IGdldE1pbmlUaHVtYkZyb21GaWxlKGMsIGJhc2VVcmksIGNyLCBvcHRpb25zKTsKQEAgLTM2MiwxNyArNDU3LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgYy5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBDdXJzb3IgYyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIFVyaSBibG9ja2luZ1VyaSA9IGJhc2VVcmkuYnVpbGRVcG9uKCkuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoImJsb2NraW5nIiwgIjEiKQogICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyKCJvcmlnX2lkIiwgU3RyaW5nLnZhbHVlT2Yob3JpZ0lkKSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRRdWVyeVBhcmFtZXRlcigiZ3JvdXBfaWQiLCBTdHJpbmcudmFsdWVPZihncm91cElkKSkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KGJsb2NraW5nVXJpLCBQUk9KRUNUSU9OLCBudWxsLCBudWxsLCBudWxsKTsKICAgICAgICAgICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiBvcmlnaW5hbCBpbWFnZS92aWRlbyBkb2Vzbid0IGV4aXN0LgogICAgICAgICAgICAgICAgIGlmIChjID09IG51bGwpIHJldHVybiBudWxsOwpAQCAtNDIzLDYgKzUxNCw5IEBACiAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCBleCk7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAvLyBUbyBhdm9pZCBmaWxlIGRlc2NyaXB0b3IgbGVhayBpbiBhcHBsaWNhdGlvbiBwcm9jZXNzLgorICAgICAgICAgICAgICAgIHRodW1iRmlsZS5kZWFjdGl2YXRlKCk7CisgICAgICAgICAgICAgICAgdGh1bWJGaWxlID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CiAgICAgICAgIH0KQEAgLTExNDAsNiArMTIzNCwxOSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEdldCB0aGUgY29udGVudDovLyBzdHlsZSBVUkkgZm9yIHF1ZXJ5aW5nIHRoZSBnZW5yZXMgb2YgYW4gYXVkaW8gZmlsZS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAcGFyYW0gdm9sdW1lTmFtZSB0aGUgbmFtZSBvZiB0aGUgdm9sdW1lIHRvIGdldCB0aGUgVVJJIGZvcgorICAgICAgICAgICAgICogQHBhcmFtIGF1ZGlvSWQgdGhlIElEIG9mIHRoZSBhdWRpbyBmaWxlIGZvciB3aGljaCB0byByZXRyaWV2ZSB0aGUgZ2VucmVzCisgICAgICAgICAgICAgKiBAcmV0dXJuIHRoZSBVUkkgdG8gZm9yIHF1ZXJ5aW5nIHRoZSBnZW5yZXMgZm9yIHRoZSBhdWRpbyBmaWxlCisgICAgICAgICAgICAgKiB3aXRoIHRoZSBnaXZlbiB0aGUgdm9sdW1lIGFuZCBhdWRpb0lECisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldENvbnRlbnRVcmlGb3JBdWRpb0lkKFN0cmluZyB2b2x1bWVOYW1lLCBpbnQgYXVkaW9JZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfU0xBU0ggKyB2b2x1bWVOYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIvYXVkaW8vbWVkaWEvIiArIGF1ZGlvSWQgKyAiL2dlbnJlcyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSSSBmb3IgdGhlIGludGVybmFsIHN0b3JhZ2UuCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIElOVEVSTkFMX0NPTlRFTlRfVVJJID0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL010cC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvTXRwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxNjFlNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL010cC5qYXZhCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByb3ZpZGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRVcmlzOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogVGhlIE1UUCBwcm92aWRlciBzdXBwb3J0cyBhY2Nlc3NpbmcgY29udGVudCBvbiBNVFAgYW5kIFBUUCBkZXZpY2VzLgorICogQGhpZGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE10cAoreworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiTXRwIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUklUWSA9ICJtdHAiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIID0gImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0FVVEhPUklUWV9ERVZJQ0VfU0xBU0ggPSAiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL2RldmljZS8iOworCisKKyAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBBY3Rpb246ICBBIGJyb2FkY2FzdCB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIGFuIE1UUCBzZXNzaW9uIHdpdGggdGhlIGhvc3QuCisgICAgICogVGhpcyBicm9hZGNhc3QgaXMgb25seSBzZW50IGlmIE1UUCBhY3Rpdml0eSBoYXMgbW9kaWZpZWQgdGhlIG1lZGlhIGRhdGFiYXNlIGR1cmluZyB0aGUKKyAgICAgKiBtb3N0IHJlY2VudCBNVFAgc2Vzc2lvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9NVFBfU0VTU0lPTl9FTkQgPSAiYW5kcm9pZC5wcm92aWRlci5hY3Rpb24uTVRQX1NFU1NJT05fRU5EIjsKKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGxpc3Qgb2YgYWxsIE1UUC9QVFAgZGV2aWNlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRGV2aWNlIGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgImRldmljZSIpOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldENvbnRlbnRVcmkoaW50IGRldmljZUlEKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX0RFVklDRV9TTEFTSCArIGRldmljZUlEKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWFudWZhY3R1cmVyIG9mIHRoZSBkZXZpY2UKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTlVGQUNUVVJFUiA9ICJtYW51ZmFjdHVyZXIiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbW9kZWwgbmFtZSBvZiB0aGUgZGV2aWNlCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTCA9ICJtb2RlbCI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udGFpbnMgbGlzdCBvZiBzdG9yYWdlIHVuaXRzIGZvciBhbiBNVFAvUFRQIGRldmljZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU3RvcmFnZSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFVyaSBnZXRDb250ZW50VXJpKGludCBkZXZpY2VJRCkgeworICAgICAgICAgICAgcmV0dXJuIFVyaS5wYXJzZShDT05URU5UX0FVVEhPUklUWV9ERVZJQ0VfU0xBU0ggKyBkZXZpY2VJRCArICIvc3RvcmFnZSIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaShpbnQgZGV2aWNlSUQsIGxvbmcgc3RvcmFnZUlEKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX0RFVklDRV9TTEFTSCArIGRldmljZUlEICsgIi9zdG9yYWdlLyIgKyBzdG9yYWdlSUQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0b3JhZ2UgdW5pdCBpZGVudGlmaWVyCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElGSUVSID0gImlkZW50aWZpZXIiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdG9yYWdlIHVuaXQgZGVzY3JpcHRpb24KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb250YWlucyBsaXN0IG9mIG9iamVjdHMgb24gYW4gTVRQL1BUUCBkZXZpY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE9iamVjdCBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFVyaSBnZXRDb250ZW50VXJpKGludCBkZXZpY2VJRCwgbG9uZyBvYmplY3RJRCkgeworICAgICAgICAgICAgcmV0dXJuIFVyaS5wYXJzZShDT05URU5UX0FVVEhPUklUWV9ERVZJQ0VfU0xBU0ggKyBkZXZpY2VJRAorICAgICAgICAgICAgICAgICAgICArICIvb2JqZWN0LyIgKyBvYmplY3RJRCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFVyaSBnZXRDb250ZW50VXJpRm9yT2JqZWN0Q2hpbGRyZW4oaW50IGRldmljZUlELCBsb25nIG9iamVjdElEKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX0RFVklDRV9TTEFTSCArIGRldmljZUlECisgICAgICAgICAgICAgICAgICAgICsgIi9vYmplY3QvIiArIG9iamVjdElEICsgIi9jaGlsZCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaUZvclN0b3JhZ2VDaGlsZHJlbihpbnQgZGV2aWNlSUQsIGxvbmcgc3RvcmFnZUlEKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX0RFVklDRV9TTEFTSCArIGRldmljZUlECisgICAgICAgICAgICAgICAgICAgICsgIi9zdG9yYWdlLyIgKyBzdG9yYWdlSUQgKyAiL2NoaWxkIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGZvbGxvd2luZyBjb2x1bW5zIGNvcnJlc3BvbmQgdG8gdGhlIGZpZWxkcyBpbiB0aGUgT2JqZWN0SW5mbyBkYXRhc2V0CisgICAgICAgICAqIGFzIGRlc2NyaWJlZCBpbiB0aGUgTVRQIHNwZWNpZmljYXRpb24uCisgICAgICAgICAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIHN0b3JhZ2UgdW5pdCBjb250YWluaW5nIHRoZSBvYmplY3QuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SQUdFX0lEID0gInN0b3JhZ2VfaWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb2JqZWN0J3MgZm9ybWF0LiAgQ2FuIGJlIG9uZSBvZiB0aGUgRk9STUFUXyogc3ltYm9scyBiZWxvdywKKyAgICAgICAgICogb3IgYW55IG9mIHRoZSB2YWxpZCBNVFAgb2JqZWN0IGZvcm1hdHMgYXMgZGVmaW5lZCBpbiB0aGUgTVRQIHNwZWNpZmljYXRpb24uCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVQgPSAiZm9ybWF0IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHByb3RlY3Rpb24gc3RhdHVzIG9mIHRoZSBvYmplY3QuICBTZWUgdGhlIFBST1RFQ1RJT05fU1RBVFVTXypzeW1ib2xzIGJlbG93LgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVEVDVElPTl9TVEFUVVMgPSAicHJvdGVjdGlvbl9zdGF0dXMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc2l6ZSBvZiB0aGUgb2JqZWN0IGluIGJ5dGVzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0laRSA9ICJzaXplIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9iamVjdCdzIHRodW1ibmFpbCBmb3JtYXQuICBDYW4gYmUgb25lIG9mIHRoZSBGT1JNQVRfKiBzeW1ib2xzIGJlbG93LAorICAgICAgICAgKiBvciBhbnkgb2YgdGhlIHZhbGlkIE1UUCBvYmplY3QgZm9ybWF0cyBhcyBkZWZpbmVkIGluIHRoZSBNVFAgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIVU1CX0ZPUk1BVCA9ICJ0aHVtYl9mb3JtYXQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc2l6ZSBvZiB0aGUgb2JqZWN0J3MgdGh1bWJuYWlsIGluIGJ5dGVzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhVTUJfU0laRSA9ICJ0aHVtYl9zaXplIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSBvYmplY3QncyB0aHVtYm5haWwgaW4gcGl4ZWxzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhVTUJfV0lEVEggPSAidGh1bWJfd2lkdGgiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBvYmplY3QncyB0aHVtYm5haWwgaW4gcGl4ZWxzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhVTUJfSEVJR0hUID0gInRodW1iX2hlaWdodCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvYmplY3QncyB0aHVtYm5haWwuCisgICAgICAgICAqIDxQPlR5cGU6IEJMT0I8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQiA9ICJ0aHVtYiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgb2JqZWN0IGluIHBpeGVscy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX1dJRFRIID0gImltYWdlX3dpZHRoIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgb2JqZWN0IGluIHBpeGVscy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX0hFSUdIVCA9ICJpbWFnZV9oZWlnaHQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGVwdGggb2YgdGhlIG9iamVjdCBpbiBiaXRzIHBlciBwaXhlbC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX0RFUFRIID0gImltYWdlX2RlcHRoIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIElEIG9mIHRoZSBvYmplY3QncyBwYXJlbnQsIG9yIHplcm8gaWYgdGhlIG9iamVjdAorICAgICAgICAgKiBpcyBpbiB0aGUgcm9vdCBvZiBpdHMgc3RvcmFnZSB1bml0LgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UID0gInBhcmVudCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhc3NvY2lhdGlvbiB0eXBlIGZvciBhIGNvbnRhaW5lciBvYmplY3QuCisgICAgICAgICAqIEZvciBmb2xkZXJzIHRoaXMgaXMgdHlwaWNhbGx5IHtAbGluayAjQVNTT0NJQVRJT05fVFlQRV9HRU5FUklDX0ZPTERFUn0KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU09DSUFUSU9OX1RZUEUgPSAiYXNzb2NpYXRpb25fdHlwZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnRhaW5zIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgY29udGFpbmVyIG9iamVjdHMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NPQ0lBVElPTl9ERVNDID0gImFzc29jaWF0aW9uX2Rlc2MiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBvYmplY3QsIHR5cGljYWxseSB1c2VkIGZvciBhbiBhc3NvY2lhdGlvbgorICAgICAgICAgKiBjb250YWluaW5nIGltYWdlcyB0YWtlbiBpbiBzZXF1ZW5jZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUVVFTkNFX05VTUJFUiA9ICJzZXF1ZW5jZV9udW1iZXIiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgb2JqZWN0LgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRhdGUgdGhlIG9iamVjdCB3YXMgY3JlYXRlZCwgaW4gc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzAuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFX0NSRUFURUQgPSAiZGF0ZV9jcmVhdGVkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRhdGUgdGhlIG9iamVjdCB3YXMgbGFzdCBtb2RpZmllZCwgaW4gc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzAuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFX01PRElGSUVEID0gImRhdGVfbW9kaWZpZWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIGxpc3Qgb2Yga2V5d29yZHMgYXNzb2NpYXRlZCB3aXRoIGFuIG9iamVjdCwgc2VwYXJhdGVkIGJ5IHNwYWNlcy4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVdPUkRTID0gImtleXdvcmRzIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YQppbmRleCA5OWQ0ZTg3Li5jZjk1ODcyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEKQEAgLTE2LDE0ICsxNiwxMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQucHJvdmlkZXI7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmFuZHJvaWQuY29sbGVjdC5NYXBzOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQ7CiAKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQ7CiBpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50LlNka0NvbnN0YW50VHlwZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFF1ZXJ5TWFwOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CkBAIC0zNywyMCArMzQsMTggQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLlNRTEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy4qOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CYXR0ZXJ5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQW5kcm9pZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAKIC8qKgpAQCAtMTAyMyw3ICsxMDE4LDcgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0ludGVyZXN0aW5nQ29uZmlndXJhdGlvbkNoYW5nZXMoaW50IGNoYW5nZXMpIHsKICAgICAgICAgICAgIHJldHVybiAoY2hhbmdlcyZBY3Rpdml0eUluZm8uQ09ORklHX0ZPTlRfU0NBTEUpICE9IDA7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldFNob3dHVGFsa1NlcnZpY2VTdGF0dXMoQ29udGVudFJlc29sdmVyIGNyKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0SW50KGNyLCBTSE9XX0dUQUxLX1NFUlZJQ0VfU1RBVFVTLCAwKSAhPSAwOwogICAgICAgICB9CkBAIC0xMTQ3LDYgKzExNDIsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9TTEVFUF9QT0xJQ1lfTkVWRVIgPSAyOwogCisgICAgICAgIC8vVE9ETzogZGVwcmVjYXRlIHN0YXRpYyBJUCBjb25zdGFudHMKICAgICAgICAgLyoqCiAgICAgICAgICAqIFdoZXRoZXIgdG8gdXNlIHN0YXRpYyBJUCBhbmQgb3RoZXIgc3RhdGljIG5ldHdvcmsgYXR0cmlidXRlcy4KICAgICAgICAgICogPHA+CkBAIC0xMjMwLDcgKzEyMjYsNyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NLX1BBVFRFUk5fVklTSUJMRSA9ICJsb2NrX3BhdHRlcm5fdmlzaWJsZV9wYXR0ZXJuIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIAorICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2UKICAgICAgICAgICoge0BsaW5rIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlI0xPQ0tfUEFUVEVSTl9UQUNUSUxFX0ZFRURCQUNLX0VOQUJMRUR9CiAgICAgICAgICAqIGluc3RlYWQKICAgICAgICAgICovCkBAIC0xNTEyLDYgKzE1MDgsMTIgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19USU1FID0gImF1dG9fdGltZSI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFZhbHVlIHRvIHNwZWNpZnkgaWYgdGhlIHVzZXIgcHJlZmVycyB0aGUgdGltZSB6b25lCisgICAgICAgICAqIHRvIGJlIGF1dG9tYXRpY2FsbHkgZmV0Y2hlZCBmcm9tIHRoZSBuZXR3b3JrIChOSVRaKS4gMT15ZXMsIDA9bm8KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fVElNRV9aT05FID0gImF1dG9fdGltZV96b25lIjsKKworICAgICAgICAvKioKICAgICAgICAgICogRGlzcGxheSB0aW1lcyBhcyAxMiBvciAyNCBob3VycwogICAgICAgICAgKiAgIDEyCiAgICAgICAgICAqICAgMjQKQEAgLTE3ODgsNiArMTc5MCwxMiBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkxPQ0tfU09VTkQgPSAidW5sb2NrX3NvdW5kIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgYXBwZWFyIGFzIGEgUFRQIGRldmljZSBpbnN0ZWFkIG9mIE1UUC4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9QVFBfSU5URVJGQUNFID0gInVzZV9wdHBfaW50ZXJmYWNlIjsKKworICAgICAgICAvKioKICAgICAgICAgICogUmVjZWl2ZSBpbmNvbWluZyBTSVAgY2FsbHM/CiAgICAgICAgICAqIDAgPSBubwogICAgICAgICAgKiAxID0geWVzCkBAIC0xODY3LDYgKzE4NzUsNyBAQAogICAgICAgICAgICAgVEVYVF9BVVRPX1BVTkNUVUFURSwKICAgICAgICAgICAgIFRFWFRfU0hPV19QQVNTV09SRCwKICAgICAgICAgICAgIEFVVE9fVElNRSwKKyAgICAgICAgICAgIEFVVE9fVElNRV9aT05FLAogICAgICAgICAgICAgVElNRV8xMl8yNCwKICAgICAgICAgICAgIERBVEVfRk9STUFULAogICAgICAgICAgICAgQUNDRUxFUk9NRVRFUl9ST1RBVElPTiwKQEAgLTE4ODMsNiArMTg5Miw3IEBACiAgICAgICAgICAgICBMT0NLU0NSRUVOX1NPVU5EU19FTkFCTEVELAogICAgICAgICAgICAgU0hPV19XRUJfU1VHR0VTVElPTlMsCiAgICAgICAgICAgICBOT1RJRklDQVRJT05fTElHSFRfUFVMU0UsCisgICAgICAgICAgICBVU0VfUFRQX0lOVEVSRkFDRSwKICAgICAgICAgICAgIFNJUF9DQUxMX09QVElPTlMsCiAgICAgICAgICAgICBTSVBfUkVDRUlWRV9DQUxMUywKICAgICAgICAgICAgIE5GQ19PTiwKQEAgLTI0MzMsNiArMjQ0MywxNCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUga2V5IHRoYXQgcmV0cmlldmVzIGEgYmx1ZXRvb3RoIElucHV0IERldmljZSdzIHByaW9yaXR5LgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0Qmx1ZXRvb3RoSW5wdXREZXZpY2VQcmlvcml0eUtleShTdHJpbmcgYWRkcmVzcykgeworICAgICAgICAgICAgcmV0dXJuICgiYmx1ZXRvb3RoX2lucHV0X2RldmljZV9wcmlvcml0eV8iICsgYWRkcmVzcy50b1VwcGVyQ2FzZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgogICAgICAgICAgKiBXaGV0aGVyIG9yIG5vdCBkYXRhIHJvYW1pbmcgaXMgZW5hYmxlZC4gKDAgPSBmYWxzZSwgMSA9IHRydWUpCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1JPQU1JTkcgPSAiZGF0YV9yb2FtaW5nIjsKQEAgLTI0NDQsNiArMjQ2MiwxMyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lOUFVUX01FVEhPRCA9ICJkZWZhdWx0X2lucHV0X21ldGhvZCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFNldHRpbmcgdG8gcmVjb3JkIHRoZSBpbnB1dCBtZXRob2Qgc3VidHlwZSB1c2VkIGJ5IGRlZmF1bHQsIGhvbGRpbmcgdGhlIElECisgICAgICAgICAqIG9mIHRoZSBkZXNpcmVkIG1ldGhvZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVEVEX0lOUFVUX01FVEhPRF9TVUJUWVBFID0KKyAgICAgICAgICAgICAgICAic2VsZWN0ZWRfaW5wdXRfbWV0aG9kX3N1YnR5cGUiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBXaGV0aGVyIHRoZSBkZXZpY2UgaGFzIGJlZW4gcHJvdmlzaW9uZWQgKDAgPSBmYWxzZSwgMSA9IHRydWUpCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVZJQ0VfUFJPVklTSU9ORUQgPSAiZGV2aWNlX3Byb3Zpc2lvbmVkIjsKQEAgLTI0NjQsMTEgKzI0ODksMzIgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfU1lTVEVNX0lOUFVUX01FVEhPRFMgPSAiZGlzYWJsZWRfc3lzdGVtX2lucHV0X21ldGhvZHMiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBIb3N0IG5hbWUgYW5kIHBvcnQgZm9yIGEgdXNlci1zZWxlY3RlZCBwcm94eS4KKyAgICAgICAgICogSG9zdCBuYW1lIGFuZCBwb3J0IGZvciBnbG9iYWwgcHJveHkuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BST1hZID0gImh0dHBfcHJveHkiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBFeGNsdXNpb24gbGlzdCBmb3IgZ2xvYmFsIHByb3h5LiBUaGlzIHN0cmluZyBjb250YWlucyBhIGxpc3Qgb2YgY29tbWEtc2VwYXJhdGVkCisgICAgICAgICAqIGRvbWFpbnMgd2hlcmUgdGhlIGdsb2JhbCBwcm94eSBkb2VzIG5vdCBhcHBseS4gRG9tYWlucyBzaG91bGQgYmUgbGlzdGVkIGluIGEgY29tbWEtCisgICAgICAgICAqIHNlcGFyYXRlZCBsaXN0LiBFeGFtcGxlIG9mIGFjY2VwdGFibGUgZm9ybWF0czogIi5kb21haW4xLmNvbSxteS5kb21haW4yLmNvbSIKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUFJPWFlfRVhDTFVTSU9OX0xJU1QgPSAiaHR0cF9wcm94eV9leGNsdXNpb25fbGlzdCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEVuYWJsZXMgdGhlIFVJIHNldHRpbmcgdG8gYWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgZ2xvYmFsIEhUVFAgcHJveHkKKyAgICAgICAgICogYW5kIGFzc29jaWF0ZWQgZXhjbHVzaW9uIGxpc3QuCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfR0xPQkFMX0hUVFBfUFJPWFkgPSAic2V0X2dsb2JhbF9odHRwX3Byb3h5IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0dGluZyBmb3IgZGVmYXVsdCBETlMgaW4gY2FzZSBub2JvZHkgc3VnZ2VzdHMgb25lCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ROU19TRVJWRVIgPSAiZGVmYXVsdF9kbnNfc2VydmVyIjsKKworICAgICAgICAvKioKICAgICAgICAgICogV2hldGhlciB0aGUgcGFja2FnZSBpbnN0YWxsZXIgc2hvdWxkIGFsbG93IGluc3RhbGxhdGlvbiBvZiBhcHBzIGRvd25sb2FkZWQgZnJvbQogICAgICAgICAgKiBzb3VyY2VzIG90aGVyIHRoYW4gdGhlIEFuZHJvaWQgTWFya2V0ICh2ZW5kaW5nIG1hY2hpbmUpLgogICAgICAgICAgKgpAQCAtMjQ5OSw2ICsyNTQ1LDE0IEBACiAgICAgICAgICAgICAibG9ja19wYXR0ZXJuX3RhY3RpbGVfZmVlZGJhY2tfZW5hYmxlZCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgcHJlZmVyZW5jZSBhbGxvd3MgdGhlIGRldmljZSB0byBiZSBsb2NrZWQgZ2l2ZW4gdGltZSBhZnRlciBzY3JlZW4gZ29lcyBvZmYsCisgICAgICAgICAqIHN1YmplY3QgdG8gY3VycmVudCBEZXZpY2VBZG1pbiBwb2xpY3kgbGltaXRzLgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DS19TQ1JFRU5fTE9DS19BRlRFUl9USU1FT1VUID0gImxvY2tfc2NyZWVuX2xvY2tfYWZ0ZXJfdGltZW91dCI7CisKKworICAgICAgICAvKioKICAgICAgICAgICogV2hldGhlciBhc3Npc3RlZCBHUFMgc2hvdWxkIGJlIGVuYWJsZWQgb3Igbm90LgogICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KQEAgLTI1NTksNiArMjYxMywxNCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRBTF9DT05UUk9MX1JFRElSRUNUX1VSTCA9ICJwYXJlbnRhbF9jb250cm9sX3JlZGlyZWN0X3VybCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEEgcG9zaXRpdmUgdmFsdWUgaW5kaWNhdGVzIHRoZSBmcmVxdWVuY3kgb2YgU2FtcGxpbmdQcm9maWxlcgorICAgICAgICAgKiB0YWtpbmcgc25hcHNob3RzIGluIGhlcnR6LiBaZXJvIHZhbHVlIG1lYW5zIFNhbXBsaW5nUHJvZmlsZXIgaXMgZGlzYWJsZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQU1QTElOR19QUk9GSUxFUl9IWiA9ICJzYW1wbGluZ19wcm9maWxlcl9oeiI7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFNldHRpbmdzIGNsYXNzbmFtZSB0byBsYXVuY2ggd2hlbiBTZXR0aW5ncyBpcyBjbGlja2VkIGZyb20gQWxsCiAgICAgICAgICAqIEFwcGxpY2F0aW9ucy4gIE5lZWRlZCBiZWNhdXNlIG9mIHVzZXIgdGVzdGluZyBiZXR3ZWVuIHRoZSBvbGQKICAgICAgICAgICogYW5kIG5ldyBTZXR0aW5ncyBhcHBzLgpAQCAtMjU4OSw2ICsyNjUxLDYwIEBACiAgICAgICAgICAgICAiZW5hYmxlZF9hY2Nlc3NpYmlsaXR5X3NlcnZpY2VzIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogSWYgaW5qZWN0aW9uIG9mIGFjY2Vzc2liaWxpdHkgZW5oYW5jaW5nIEphdmFTY3JpcHQgc2NyaXB0cworICAgICAgICAgKiBpcyBlbmFibGVkLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogICBOb3RlOiBBY2Nlc3NpYmlsaXR5IGluamVjdGluZyBzY3JpcHRzIGFyZSBzZXJ2ZWQgYnkgdGhlCisgICAgICAgICAqICAgR29vZ2xlIGluZnJhc3RydWN0dXJlIGFuZCBlbmFibGUgdXNlcnMgd2l0aCBkaXNhYmlsaXRpZXMgdG8KKyAgICAgICAgICogICBlZmZpY2lhbnRseSBuYXZpZ2F0ZSBpbiBhbmQgZXhwbG9yZSB3ZWIgY29udGVudC4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogICBUaGlzIHByb3BlcnR5IHJlcHJlc2VudHMgYSBib29sZWFuIHZhbHVlLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NFU1NJQklMSVRZX1NDUklQVF9JTkpFQ1RJT04gPQorICAgICAgICAgICAgImFjY2Vzc2liaWxpdHlfc2NyaXB0X2luamVjdGlvbiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEtleSBiaW5kaW5ncyBmb3IgbmF2aWdhdGlvbiBpbiBidWlsdC1pbiBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQgZm9yIHdlYiBjb250ZW50LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogICBOb3RlOiBUaGVzZSBrZXkgYmluZGluZ3MgYXJlIGZvciB0aGUgYnVpbHQtaW4gYWNjZXNzaWJpbGl0eSBuYXZpZ2F0aW9uIGZvcgorICAgICAgICAgKiAgIHdlYiBjb250ZW50IHdoaWNoIGlzIHVzZWQgYXMgYSBmYWxsIGJhY2sgc29sdXRpb24gaWYgSmF2YVNjcmlwdCBpbiBhIFdlYlZpZXcKKyAgICAgICAgICogICBpcyBub3QgZW5hYmxlZCBvciB0aGUgdXNlciBoYXMgbm90IG9wdGVkLWluIHNjcmlwdCBpbmplY3Rpb24gZnJvbSBHb29nbGUuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqICAgVGhlIGJpbmRpbmdzIGFyZSBzZXBhcmF0ZWQgYnkgc2VtaS1jb2xvbi4gQSBiaW5kaW5nIGlzIGEgbWFwcGluZyBmcm9tCisgICAgICAgICAqICAgYSBrZXkgdG8gYSBzZXF1ZW5jZSBvZiBhY3Rpb25zIChmb3IgbW9yZSBkZXRhaWxzIGxvb2sgYXQKKyAgICAgICAgICogICBhbmRyb2lkLndlYmtpdC5BY2Nlc3NpYmlsaXR5SW5qZWN0b3IpLiBBIGtleSBpcyByZXByZXNlbnRlZCBhcyB0aGUgaGV4YWRlbWljYWwKKyAgICAgICAgICogICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlciBvYnRhaW5lZCBmcm9tIGEgbWV0YSBzdGF0ZSAob3B0aW9uYWwpIHNoaWZ0ZWQKKyAgICAgICAgICogICBzaXh0ZWVuIHRpbWVzIGxlZnQgYW5kIGJpdHdpc2Ugb3JlZCB3aXRoIGEga2V5IGNvZGUuIEFuIGFjdGlvbiBpcyByZXByZXNlbnRlZAorICAgICAgICAgKiAgIGFzIGEgaGV4YWRlbWljYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIgd2hlcmUgdGhlIGZpcnN0IHR3byBkaWdpdHMKKyAgICAgICAgICogICBhcmUgbmF2aWdhdGlvbiBhY3Rpb24gaW5kZXgsIHRoZSBzZWNvbmQsIHRoZSB0aGlyZCwgYW5kIHRoZSBmb3VydGggZGlnaXQgcGFpcnMKKyAgICAgICAgICogICByZXByZXNlbnQgdGhlIGFjdGlvbiBhcmd1bWVudHMuIFRoZSBzZXBhcmF0ZSBhY3Rpb25zIGluIGEgYmluZGluZyBhcmUgY29sb24KKyAgICAgICAgICogICBzZXBhcmF0ZWQuIFRoZSBrZXkgYW5kIHRoZSBhY3Rpb24gc2VxdWVuY2UgaXQgbWFwcyB0byBhcmUgc2VwYXJhdGVkIGJ5IGVxdWFscy4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogICBGb3IgZXhhbXBsZSwgdGhlIGJpbmRpbmcgYmVsb3cgbWFwcyB0aGUgRFBBRCByaWdodCBidXR0b24gdG8gdHJhdmVyc2UgdGhlCisgICAgICAgICAqICAgY3VycmVudCBuYXZpZ2F0aW9uIGF4aXMgb25jZSB3aXRob3V0IGZpcmluZyBhbiBhY2Nlc3NpYmlsaXR5IGV2ZW50IGFuZCB0bworICAgICAgICAgKiAgIHBlcmZvcm0gdGhlIHNhbWUgdHJhdmVyc2FsIGFnYWluIGJ1dCB0byBmaXJlIGFuIGV2ZW50OgorICAgICAgICAgKiAgIDxjb2RlPgorICAgICAgICAgKiAgICAgMHgxNj0weDAxMDAwMTAwOjB4MDEwMDAxMDE7CisgICAgICAgICAqICAgPC9jb2RlPgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiAgIFRoZSBnb2FsIG9mIHRoaXMgYmluZGluZyBpcyB0byBlbmFibGUgZHluYW1pYyByZWJpbmRpbmcgb2Yga2V5cyB0bworICAgICAgICAgKiAgIG5hdmlnYXRpb24gYWN0aW9ucyBmb3Igd2ViIGNvbnRlbnQgd2l0aG91dCByZXF1aXJpbmcgYSBmcmFtZXdvcmsgY2hhbmdlLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiAgIFRoaXMgcHJvcGVydHkgcmVwcmVzZW50cyBhIHN0cmluZyB2YWx1ZS4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVNTSUJJTElUWV9XRUJfQ09OVEVOVF9LRVlfQklORElOR1MgPQorICAgICAgICAgICAgImFjY2Vzc2liaWxpdHlfd2ViX2NvbnRlbnRfa2V5X2JpbmRpbmdzIjsKKworICAgICAgICAvKioKICAgICAgICAgICogU2V0dGluZyB0byBhbHdheXMgdXNlIHRoZSBkZWZhdWx0IHRleHQtdG8tc3BlZWNoIHNldHRpbmdzIHJlZ2FyZGxlc3MKICAgICAgICAgICogb2YgdGhlIGFwcGxpY2F0aW9uIHNldHRpbmdzLgogICAgICAgICAgKiAxID0gb3ZlcnJpZGUgYXBwbGljYXRpb24gc2V0dGluZ3MsCkBAIC0zNTY4LDYgKzM2ODQsNyBAQAogICAgICAgICAgICAgUEFSRU5UQUxfQ09OVFJPTF9SRURJUkVDVF9VUkwsCiAgICAgICAgICAgICBVU0JfTUFTU19TVE9SQUdFX0VOQUJMRUQsCiAgICAgICAgICAgICBBQ0NFU1NJQklMSVRZX0VOQUJMRUQsCisgICAgICAgICAgICBBQ0NFU1NJQklMSVRZX1NDUklQVF9JTkpFQ1RJT04sCiAgICAgICAgICAgICBCQUNLVVBfQVVUT19SRVNUT1JFLAogICAgICAgICAgICAgRU5BQkxFRF9BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTLAogICAgICAgICAgICAgVFRTX1VTRV9ERUZBVUxUUywKQEAgLTM3NTEsMjAgKzM4NjgsOCBAQAogICAgICAgICAgICAgLy8gSWYgYSBzaG9ydGN1dCBpcyBzdXBwbGllZCwgYW5kIGl0IGlzIGFscmVhZHkgZGVmaW5lZCBmb3IKICAgICAgICAgICAgIC8vIGFub3RoZXIgYm9va21hcmssIHRoZW4gcmVtb3ZlIHRoZSBvbGQgZGVmaW5pdGlvbi4KICAgICAgICAgICAgIGlmIChzaG9ydGN1dCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgQ3Vyc29yIGMgPSBjci5xdWVyeShDT05URU5UX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNTaG9ydGN1dFByb2plY3Rpb24sIHNTaG9ydGN1dFNlbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IFN0cmluZy52YWx1ZU9mKChpbnQpIHNob3J0Y3V0KSB9LCBudWxsKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYy5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYy5nZXRDb3VudCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYy5kZWxldGVSb3coKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb3VsZCBub3QgZGVsZXRlIGV4aXN0aW5nIHNob3J0Y3V0IHJvdyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3IuZGVsZXRlKENPTlRFTlRfVVJJLCBzU2hvcnRjdXRTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBTdHJpbmcudmFsdWVPZigoaW50KSBzaG9ydGN1dCkgfSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhBMmRwU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEEyZHBTZXJ2aWNlLmphdmEKaW5kZXggYTUyYTIyMS4uOTQ2YzI2NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEEyZHBTZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEEyZHBTZXJ2aWNlLmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBMmRwOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGU7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoVXVpZDsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5JQmx1ZXRvb3RoQTJkcDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CkBAIC0zMiwxNyArMzMsMTUgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbFV1aWQ7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKKwogCiBwdWJsaWMgY2xhc3MgQmx1ZXRvb3RoQTJkcFNlcnZpY2UgZXh0ZW5kcyBJQmx1ZXRvb3RoQTJkcC5TdHViIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aEEyZHBTZXJ2aWNlIjsKQEAgLTU3LDExICs1Niw2IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfU1RBVEUgPSAiU3RhdGUiOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTktfU1RBVEVfRElTQ09OTkVDVEVEID0gImRpc2Nvbm5lY3RlZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTktfU1RBVEVfQ09OTkVDVElORyA9ICJjb25uZWN0aW5nIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOS19TVEFURV9DT05ORUNURUQgPSAiY29ubmVjdGVkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOS19TVEFURV9QTEFZSU5HID0gInBsYXlpbmciOwotCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1TaW5rQ291bnQ7CiAKICAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CkBAIC03Miw2ICs2Niw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBCbHVldG9vdGhBZGFwdGVyIG1BZGFwdGVyOwogICAgIHByaXZhdGUgaW50ICAgbVRhcmdldEEyZHBTdGF0ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbUFkanVzdGVkUHJpb3JpdHkgPSBmYWxzZTsKKyAgICBwcml2YXRlIEJsdWV0b290aERldmljZSBtUGxheWluZ0EyZHBEZXZpY2U7CiAKICAgICBwcml2YXRlIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG1SZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKICAgICAgICAgQE92ZXJyaWRlCkBAIC05NSwxMiArOTAsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZS5FUlJPUik7CiAgICAgICAgICAgICAgICAgc3dpdGNoKGJvbmRTdGF0ZSkgewogICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVEOgotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2lua1ByaW9yaXR5KGRldmljZSkgPT0gQmx1ZXRvb3RoQTJkcC5QUklPUklUWV9VTkRFRklORUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpbmtQcmlvcml0eShkZXZpY2UsIEJsdWV0b290aEEyZHAuUFJJT1JJVFlfT04pOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0UHJpb3JpdHkoZGV2aWNlKSA9PSBCbHVldG9vdGhBMmRwLlBSSU9SSVRZX1VOREVGSU5FRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJpb3JpdHkoZGV2aWNlLCBCbHVldG9vdGhBMmRwLlBSSU9SSVRZX09OKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX05PTkU6Ci0gICAgICAgICAgICAgICAgICAgIHNldFNpbmtQcmlvcml0eShkZXZpY2UsIEJsdWV0b290aEEyZHAuUFJJT1JJVFlfVU5ERUZJTkVEKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0UHJpb3JpdHkoZGV2aWNlLCBCbHVldG9vdGhBMmRwLlBSSU9SSVRZX1VOREVGSU5FRCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhCbHVldG9vdGhEZXZpY2UuQUNUSU9OX0FDTF9ESVNDT05ORUNURUQpKSB7CkBAIC0xMTMsNyArMTA4LDggQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhBdWRpb01hbmFnZXIuVk9MVU1FX0NIQU5HRURfQUNUSU9OKSkgewogICAgICAgICAgICAgICAgIGludCBzdHJlYW1UeXBlID0gaW50ZW50LmdldEludEV4dHJhKEF1ZGlvTWFuYWdlci5FWFRSQV9WT0xVTUVfU1RSRUFNX1RZUEUsIC0xKTsKICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtVHlwZSA9PSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBzaW5rc1tdID0gZ2V0Q29ubmVjdGVkU2lua3MoKTsKKyAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIHNpbmtzW10gPSBnZXRDb25uZWN0ZWREZXZpY2VzKCk7CisKICAgICAgICAgICAgICAgICAgICAgaWYgKHNpbmtzLmxlbmd0aCAhPSAwICYmIGlzUGhvbmVEb2NrZWQoc2lua3NbMF0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IHNpbmtzWzBdLmdldEFkZHJlc3MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdWb2xMZXZlbCA9CkBAIC0yNTQsNyArMjUwLDcgQEAKICAgICAgICAgICAgIEJsdWV0b290aERldmljZVtdIGRldmljZXMgPSBuZXcgQmx1ZXRvb3RoRGV2aWNlW21BdWRpb0RldmljZXMuc2l6ZSgpXTsKICAgICAgICAgICAgIGRldmljZXMgPSBtQXVkaW9EZXZpY2VzLmtleVNldCgpLnRvQXJyYXkoZGV2aWNlcyk7CiAgICAgICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2UgOiBkZXZpY2VzKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXRlID0gZ2V0U2lua1N0YXRlKGRldmljZSk7CisgICAgICAgICAgICAgICAgaW50IHN0YXRlID0gZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVElORzoKICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RFRDoKQEAgLTI3Nyw3ICsyNzMsNyBAQAogCiAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0Nvbm5lY3RTaW5rRmVhc2libGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewogICAgICAgICBpZiAoIW1CbHVldG9vdGhTZXJ2aWNlLmlzRW5hYmxlZCgpIHx8ICFpc1NpbmtEZXZpY2UoZGV2aWNlKSB8fAotICAgICAgICAgICAgICAgIGdldFNpbmtQcmlvcml0eShkZXZpY2UpID09IEJsdWV0b290aEEyZHAuUFJJT1JJVFlfT0ZGKSB7CisgICAgICAgICAgICAgICAgZ2V0UHJpb3JpdHkoZGV2aWNlKSA9PSBCbHVldG9vdGhBMmRwLlBSSU9SSVRZX09GRikgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KIApAQCAtMjkyLDEyICsyODgsMjYgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb25uZWN0U2luayhCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzQTJkcFBsYXlpbmcoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sCisgICAgICAgICAgICAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOworICAgICAgICBpZiAoREJHKSBsb2coImlzQTJkcFBsYXlpbmcoIiArIGRldmljZSArICIpIik7CisgICAgICAgIGlmIChkZXZpY2UuZXF1YWxzKG1QbGF5aW5nQTJkcERldmljZSkpIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOwogICAgICAgICBpZiAoREJHKSBsb2coImNvbm5lY3RTaW5rKCIgKyBkZXZpY2UgKyAiKSIpOwogICAgICAgICBpZiAoIWlzQ29ubmVjdFNpbmtGZWFzaWJsZShkZXZpY2UpKSByZXR1cm4gZmFsc2U7CiAKKyAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2Ugc2lua0RldmljZSA6IG1BdWRpb0RldmljZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChnZXRDb25uZWN0aW9uU3RhdGUoc2lua0RldmljZSkgIT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICBkaXNjb25uZWN0KHNpbmtEZXZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgcmV0dXJuIG1CbHVldG9vdGhTZXJ2aWNlLmNvbm5lY3RTaW5rKGRldmljZS5nZXRBZGRyZXNzKCkpOwogICAgIH0KIApAQCAtMzA3LDE3ICszMTcsMTUgQEAKICAgICAgICAgaW50IHN0YXRlID0gbUF1ZGlvRGV2aWNlcy5nZXQoZGV2aWNlKTsKIAogICAgICAgICAvLyBpZ25vcmUgaWYgdGhlcmUgYXJlIGFueSBhY3RpdmUgc2lua3MKLSAgICAgICAgaWYgKGxvb2t1cFNpbmtzTWF0Y2hpbmdTdGF0ZXMobmV3IGludFtdIHsKKyAgICAgICAgaWYgKGdldERldmljZXNNYXRjaGluZ0Nvbm5lY3Rpb25TdGF0ZXMobmV3IGludFtdIHsKICAgICAgICAgICAgICAgICBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RJTkcsCiAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNURUQsCi0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HLAotICAgICAgICAgICAgICAgIEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVElOR30pLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNUSU5HfSkubGVuZ3RoICE9IDApIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX1BMQVlJTkc6CiAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNUSU5HOgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVElORzoKQEAgLTM0MywxNyArMzUxLDE2IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgc3RhdGUgPSBnZXRTaW5rU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgaW50IHN0YXRlID0gZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7CiAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGlzY29ubmVjdFNpbmsoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkaXNjb25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZWQgQkxVRVRPT1RIX0FETUlOIHBlcm1pc3Npb24iKTsKICAgICAgICAgaWYgKERCRykgbG9nKCJkaXNjb25uZWN0U2luaygiICsgZGV2aWNlICsgIikiKTsKQEAgLTM2Miw3ICszNjksNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkaXNjb25uZWN0U2lua0ludGVybmFsKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaW50IHN0YXRlID0gZ2V0U2lua1N0YXRlKGRldmljZSk7CisgICAgICAgIGludCBzdGF0ZSA9IGdldENvbm5lY3Rpb25TdGF0ZShkZXZpY2UpOwogICAgICAgICBTdHJpbmcgcGF0aCA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldE9iamVjdFBhdGhGcm9tQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKIAogICAgICAgICAvLyBTdGF0ZSBpcyBDT05ORUNUSU5HIG9yIENPTk5FQ1RFRCBvciBQTEFZSU5HCkBAIC00MDgsMjQgKzQxNSw3IEBACiAgICAgICAgIHJldHVybiBjaGVja1NpbmtTdXNwZW5kU3RhdGUoc3RhdGUuaW50VmFsdWUoKSk7CiAgICAgfQogCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBCbHVldG9vdGhEZXZpY2VbXSBnZXRDb25uZWN0ZWRTaW5rcygpIHsKLSAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOwotICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBzaW5rcyA9IGxvb2t1cFNpbmtzTWF0Y2hpbmdTdGF0ZXMoCi0gICAgICAgICAgICAgICAgbmV3IGludFtdIHtCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RFRCwgQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HfSk7Ci0gICAgICAgIHJldHVybiBzaW5rcy50b0FycmF5KG5ldyBCbHVldG9vdGhEZXZpY2Vbc2lua3Muc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBCbHVldG9vdGhEZXZpY2VbXSBnZXROb25EaXNjb25uZWN0ZWRTaW5rcygpIHsKLSAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOwotICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBzaW5rcyA9IGxvb2t1cFNpbmtzTWF0Y2hpbmdTdGF0ZXMoCi0gICAgICAgICAgICAgICAgbmV3IGludFtdIHtCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVElOR30pOwotICAgICAgICByZXR1cm4gc2lua3MudG9BcnJheShuZXcgQmx1ZXRvb3RoRGV2aWNlW3NpbmtzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFNpbmtTdGF0ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOwogICAgICAgICBJbnRlZ2VyIHN0YXRlID0gbUF1ZGlvRGV2aWNlcy5nZXQoZGV2aWNlKTsKICAgICAgICAgaWYgKHN0YXRlID09IG51bGwpCkBAIC00MzMsMTkgKzQyMyw0MSBAQAogICAgICAgICByZXR1cm4gc3RhdGU7CiAgICAgfQogCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0U2lua1ByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIEJsdWV0b290aERldmljZVtdIGdldENvbm5lY3RlZERldmljZXMoKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfUEVSTSwgIk5lZWQgQkxVRVRPT1RIIHBlcm1pc3Npb24iKTsKKyAgICAgICAgQmx1ZXRvb3RoRGV2aWNlW10gc2lua3MgPSBnZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzKAorICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7Qmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNURUR9KTsKKyAgICAgICAgcmV0dXJuIHNpbmtzOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQmx1ZXRvb3RoRGV2aWNlW10gZ2V0RGV2aWNlc01hdGNoaW5nQ29ubmVjdGlvblN0YXRlcyhpbnRbXSBzdGF0ZXMpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOworICAgICAgICBBcnJheUxpc3Q8Qmx1ZXRvb3RoRGV2aWNlPiBzaW5rcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgaWYgKG1BdWRpb0RldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gc2lua3MudG9BcnJheShuZXcgQmx1ZXRvb3RoRGV2aWNlW3NpbmtzLnNpemUoKV0pOworICAgICAgICB9CisgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZTogbUF1ZGlvRGV2aWNlcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgaW50IHNpbmtTdGF0ZSA9IGdldENvbm5lY3Rpb25TdGF0ZShkZXZpY2UpOworICAgICAgICAgICAgZm9yIChpbnQgc3RhdGUgOiBzdGF0ZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gc2lua1N0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIHNpbmtzLmFkZChkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNpbmtzLnRvQXJyYXkobmV3IEJsdWV0b290aERldmljZVtzaW5rcy5zaXplKCldKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRQcmlvcml0eShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfUEVSTSwgIk5lZWQgQkxVRVRPT1RIIHBlcm1pc3Npb24iKTsKICAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCiAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldEJsdWV0b290aEEyZHBTaW5rUHJpb3JpdHlLZXkoZGV2aWNlLmdldEFkZHJlc3MoKSksCiAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQTJkcC5QUklPUklUWV9VTkRFRklORUQpOwogICAgIH0KIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRTaW5rUHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByaW9yaXR5KSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldFByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmlvcml0eSkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOwotICAgICAgICBpZiAoIUJsdWV0b290aEFkYXB0ZXIuY2hlY2tCbHVldG9vdGhBZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5wdXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCiAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldEJsdWV0b290aEEyZHBTaW5rUHJpb3JpdHlLZXkoZGV2aWNlLmdldEFkZHJlc3MoKSksIHByaW9yaXR5KTsKICAgICB9CkBAIC00NzEsOCArNDgzLDE3IEBACiAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhdXRob3JpemVkIGl0IGFuZCBibHVleiBzdGF0ZSBoYXMgY2hhbmdlZC4KICAgICAgICAgICAgICAgICBhZGRBdWRpb1NpbmsoZGV2aWNlKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IHByZXZTdGF0ZSA9IG1BdWRpb0RldmljZXMuZ2V0KGRldmljZSk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2lua1N0YXRlQ2hhbmdlKGRldmljZSwgcHJldlN0YXRlLCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORyAmJiBtUGxheWluZ0EyZHBEZXZpY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgIG1QbGF5aW5nQTJkcERldmljZSA9IGRldmljZTsKKyAgICAgICAgICAgICAgICAgICBoYW5kbGVTaW5rUGxheWluZ1N0YXRlQ2hhbmdlKGRldmljZSwgc3RhdGUsIEJsdWV0b290aEEyZHAuU1RBVEVfTk9UX1BMQVlJTkcpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNURUQgJiYgbVBsYXlpbmdBMmRwRGV2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBsYXlpbmdBMmRwRGV2aWNlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2lua1BsYXlpbmdTdGF0ZUNoYW5nZShkZXZpY2UsIEJsdWV0b290aEEyZHAuU1RBVEVfTk9UX1BMQVlJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhBMmRwLlNUQVRFX1BMQVlJTkcpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgaW50IHByZXZTdGF0ZSA9IG1BdWRpb0RldmljZXMuZ2V0KGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgaGFuZGxlU2lua1N0YXRlQ2hhbmdlKGRldmljZSwgcHJldlN0YXRlLCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNDg0LDE4ICs1MDUsMTkgQEAKICAgICAgICAgICAgICAgICBtU2lua0NvdW50LS07CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICAgICAgbVNpbmtDb3VudCArKzsKKyAgICAgICAgICAgICAgICBtUGxheWluZ0EyZHBEZXZpY2UgPSBudWxsOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUF1ZGlvRGV2aWNlcy5wdXQoZGV2aWNlLCBzdGF0ZSk7CiAKICAgICAgICAgICAgIGNoZWNrU2lua1N1c3BlbmRTdGF0ZShzdGF0ZSk7CiAgICAgICAgICAgICBtVGFyZ2V0QTJkcFN0YXRlID0gLTE7CiAKLSAgICAgICAgICAgIGlmIChnZXRTaW5rUHJpb3JpdHkoZGV2aWNlKSA+IEJsdWV0b290aEEyZHAuUFJJT1JJVFlfT0ZGICYmCisgICAgICAgICAgICBpZiAoZ2V0UHJpb3JpdHkoZGV2aWNlKSA+IEJsdWV0b290aEEyZHAuUFJJT1JJVFlfT0ZGICYmCiAgICAgICAgICAgICAgICAgICAgIHN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVElORyB8fAogICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9PSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RFRCkgewogICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgY29ubmVjdGVkIG9yIGF0dGVtcHRpbmcgdG8gY29ubmVjdC4KICAgICAgICAgICAgICAgICAvLyBCdW1wIHByaW9yaXR5Ci0gICAgICAgICAgICAgICAgc2V0U2lua1ByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoQTJkcC5QUklPUklUWV9BVVRPX0NPTk5FQ1QpOworICAgICAgICAgICAgICAgIHNldFByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoQTJkcC5QUklPUklUWV9BVVRPX0NPTk5FQ1QpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNURUQpIHsKQEAgLTUwNCw0NSArNTI2LDM4IEBACiAgICAgICAgICAgICAgICAgYWRqdXN0T3RoZXJTaW5rUHJpb3JpdGllcyhkZXZpY2UpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChCbHVldG9vdGhBMmRwLkFDVElPTl9TSU5LX1NUQVRFX0NIQU5HRUQpOworICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQmx1ZXRvb3RoQTJkcC5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKTsKICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFLCBkZXZpY2UpOwotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aEEyZHAuRVhUUkFfUFJFVklPVVNfU0lOS19TVEFURSwgcHJldlN0YXRlKTsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhBMmRwLkVYVFJBX1NJTktfU1RBVEUsIHN0YXRlKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhQcm9maWxlLkVYVFJBX1BSRVZJT1VTX1NUQVRFLCBwcmV2U3RhdGUpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aFByb2ZpbGUuRVhUUkFfU1RBVEUsIHN0YXRlKTsKICAgICAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50LCBCTFVFVE9PVEhfUEVSTSk7CiAKICAgICAgICAgICAgIGlmIChEQkcpIGxvZygiQTJEUCBzdGF0ZSA6IGRldmljZTogIiArIGRldmljZSArICIgU3RhdGU6IiArIHByZXZTdGF0ZSArICItPiIgKyBzdGF0ZSk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2lua1BsYXlpbmdTdGF0ZUNoYW5nZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgc3RhdGUsIGludCBwcmV2U3RhdGUpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQmx1ZXRvb3RoQTJkcC5BQ1RJT05fUExBWUlOR19TVEFURV9DSEFOR0VEKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UsIGRldmljZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhQcm9maWxlLkVYVFJBX1BSRVZJT1VTX1NUQVRFLCBwcmV2U3RhdGUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoUHJvZmlsZS5FWFRSQV9TVEFURSwgc3RhdGUpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCwgQkxVRVRPT1RIX1BFUk0pOworCisgICAgICAgIGlmIChEQkcpIGxvZygiQTJEUCBQbGF5aW5nIHN0YXRlIDogZGV2aWNlOiAiICsgZGV2aWNlICsgIiBTdGF0ZToiICsgcHJldlN0YXRlICsgIi0+IiArIHN0YXRlKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgYWRqdXN0T3RoZXJTaW5rUHJpb3JpdGllcyhCbHVldG9vdGhEZXZpY2UgY29ubmVjdGVkRGV2aWNlKSB7CiAgICAgICAgIGlmICghbUFkanVzdGVkUHJpb3JpdHkpIHsKICAgICAgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA6IG1BZGFwdGVyLmdldEJvbmRlZERldmljZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChnZXRTaW5rUHJpb3JpdHkoZGV2aWNlKSA+PSBCbHVldG9vdGhBMmRwLlBSSU9SSVRZX0FVVE9fQ09OTkVDVCAmJgorICAgICAgICAgICAgICAgIGlmIChnZXRQcmlvcml0eShkZXZpY2UpID49IEJsdWV0b290aEEyZHAuUFJJT1JJVFlfQVVUT19DT05ORUNUICYmCiAgICAgICAgICAgICAgICAgICAgICFkZXZpY2UuZXF1YWxzKGNvbm5lY3RlZERldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0U2lua1ByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoQTJkcC5QUklPUklUWV9PTik7CisgICAgICAgICAgICAgICAgICAgIHNldFByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoQTJkcC5QUklPUklUWV9PTik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUFkanVzdGVkUHJpb3JpdHkgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU2V0PEJsdWV0b290aERldmljZT4gbG9va3VwU2lua3NNYXRjaGluZ1N0YXRlcyhpbnRbXSBzdGF0ZXMpIHsKLSAgICAgICAgU2V0PEJsdWV0b290aERldmljZT4gc2lua3MgPSBuZXcgSGFzaFNldDxCbHVldG9vdGhEZXZpY2U+KCk7Ci0gICAgICAgIGlmIChtQXVkaW9EZXZpY2VzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIHNpbmtzOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZTogbUF1ZGlvRGV2aWNlcy5rZXlTZXQoKSkgewotICAgICAgICAgICAgaW50IHNpbmtTdGF0ZSA9IGdldFNpbmtTdGF0ZShkZXZpY2UpOwotICAgICAgICAgICAgZm9yIChpbnQgc3RhdGUgOiBzdGF0ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gc2lua1N0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpbmtzLmFkZChkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNpbmtzOwotICAgIH0KLQogICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja1NpbmtTdXNwZW5kU3RhdGUoaW50IHN0YXRlKSB7CiAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKIApAQCAtNTY4LDcgKzU4Myw3IEBACiAgICAgICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBtQmx1ZXRvb3RoU2VydmljZS5nZXRBZGRyZXNzRnJvbU9iamVjdFBhdGgoZGV2aWNlT2JqZWN0UGF0aCk7CiAgICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgcmV0dXJuOwogICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXRlID0gZ2V0U2lua1N0YXRlKGRldmljZSk7CisgICAgICAgICAgICAgICAgaW50IHN0YXRlID0gZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7CiAgICAgICAgICAgICAgICAgaGFuZGxlU2lua1N0YXRlQ2hhbmdlKGRldmljZSwgc3RhdGUsIEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVEVEKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEV2ZW50TG9vcC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEV2ZW50TG9vcC5qYXZhCmluZGV4IDc1ODA3YmYuLjRlZGMwMWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhFdmVudExvb3AuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoRXZlbnRMb29wLmphdmEKQEAgLTIwLDYgKzIwLDkgQEAKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aENsYXNzOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhJbnB1dERldmljZTsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQYW47CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZTsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhVdWlkOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CkBAIC01Miw2ICs1NSw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gbVBhc3NrZXlBZ2VudFJlcXVlc3REYXRhOwogICAgIHByaXZhdGUgZmluYWwgQmx1ZXRvb3RoU2VydmljZSBtQmx1ZXRvb3RoU2VydmljZTsKICAgICBwcml2YXRlIGZpbmFsIEJsdWV0b290aEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgcHJpdmF0ZSBCbHVldG9vdGhBMmRwIG1BMmRwOwogICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKICAgICAvLyBUaGUgV2FrZUxvY2sgaXMgdXNlZCBmb3IgYnJpbmdpbmcgdXAgdGhlIExDRCBkdXJpbmcgYSBwYWlyaW5nIHJlcXVlc3QKICAgICAvLyBmcm9tIHJlbW90ZSBkZXZpY2Ugd2hlbiBBbmRyb2lkIGlzIGluIFN1c3BlbmQgc3RhdGUuCkBAIC0xMTYsOCArMTIwLDIxIEBACiAgICAgICAgICAgICAgICAgfCBQb3dlck1hbmFnZXIuT05fQUZURVJfUkVMRUFTRSwgVEFHKTsKICAgICAgICAgbVdha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOwogICAgICAgICBpbml0aWFsaXplTmF0aXZlRGF0YU5hdGl2ZSgpOworCisgICAgICAgIG1BZGFwdGVyLmdldFByb2ZpbGVQcm94eShtQ29udGV4dCwgbVByb2ZpbGVTZXJ2aWNlTGlzdGVuZXIsIEJsdWV0b290aFByb2ZpbGUuQTJEUCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBCbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lciBtUHJvZmlsZVNlcnZpY2VMaXN0ZW5lciA9CisgICAgICAgIG5ldyBCbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKGludCBwcm9maWxlLCBCbHVldG9vdGhQcm9maWxlIHByb3h5KSB7CisgICAgICAgICAgICBtQTJkcCA9IChCbHVldG9vdGhBMmRwKSBwcm94eTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoaW50IHByb2ZpbGUpIHsKKyAgICAgICAgICAgIG1BMmRwID0gbnVsbDsKKyAgICAgICAgfQorICAgIH07CisKKwogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBjbGVhbnVwTmF0aXZlRGF0YU5hdGl2ZSgpOwpAQCAtMzAwLDcgKzMxNyw4IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgbG9nKCJEZXZpY2UgcHJvcGVydHkgY2hhbmdlZDoiICsgYWRkcmVzcyArICJwcm9wZXJ0eToiICsgbmFtZSk7CisgICAgICAgICAgICBsb2coIkRldmljZSBwcm9wZXJ0eSBjaGFuZ2VkOiAiICsgYWRkcmVzcyArICIgcHJvcGVydHk6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBuYW1lICsgIiB2YWx1ZTogIiArIHByb3BWYWx1ZXNbMV0pOwogICAgICAgICB9CiAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7CiAgICAgICAgIGlmIChuYW1lLmVxdWFscygiTmFtZSIpKSB7CkBAIC0zNjcsNiArMzg1LDQ0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgb25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcGF0aCwgU3RyaW5nW10gcHJvcFZhbHVlcykgeworICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldEFkZHJlc3NGcm9tT2JqZWN0UGF0aChwYXRoKTsKKyAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAib25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZDogQWRkcmVzcyBvZiB0aGUgcmVtb3RlIGRldmljZSBpbiBudWxsIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbG9nKCIgSW5wdXQgRGV2aWNlIDogTmFtZSBvZiBQcm9wZXJ0eSBpczoiICsgcHJvcFZhbHVlc1swXSk7CisgICAgICAgIGJvb2xlYW4gc3RhdGUgPSBmYWxzZTsKKyAgICAgICAgaWYgKHByb3BWYWx1ZXNbMV0uZXF1YWxzKCJ0cnVlIikpIHsKKyAgICAgICAgICAgIHN0YXRlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtQmx1ZXRvb3RoU2VydmljZS5oYW5kbGVJbnB1dERldmljZVByb3BlcnR5Q2hhbmdlKGFkZHJlc3MsIHN0YXRlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25QYW5EZXZpY2VQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIGRldmljZU9iamVjdFBhdGgsIFN0cmluZ1tdIHByb3BWYWx1ZXMpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBwcm9wVmFsdWVzWzBdOworICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldEFkZHJlc3NGcm9tT2JqZWN0UGF0aChkZXZpY2VPYmplY3RQYXRoKTsKKyAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAib25QYW5EZXZpY2VQcm9wZXJ0eUNoYW5nZWQ6IEFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBkZXZpY2UgaW4gbnVsbCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIGxvZygiUGFuIERldmljZSBwcm9wZXJ0eSBjaGFuZ2VkOiAiICsgYWRkcmVzcyArICIgIHByb3BlcnR5OiAiCisgICAgICAgICAgICAgICAgICAgICsgbmFtZSArICIgdmFsdWU6ICIrIHByb3BWYWx1ZXNbMV0pOworICAgICAgICB9CisgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7CisgICAgICAgIGlmIChuYW1lLmVxdWFscygiQ29ubmVjdGVkIikpIHsKKyAgICAgICAgICAgIGlmIChwcm9wVmFsdWVzWzFdLmVxdWFscygiZmFsc2UiKSkgeworICAgICAgICAgICAgICAgIG1CbHVldG9vdGhTZXJ2aWNlLmhhbmRsZVBhbkRldmljZVN0YXRlQ2hhbmdlKGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoIkludGVyZmFjZSIpKSB7CisgICAgICAgICAgICBTdHJpbmcgaWZhY2UgPSBwcm9wVmFsdWVzWzFdOworICAgICAgICAgICAgbUJsdWV0b290aFNlcnZpY2UuaGFuZGxlUGFuRGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBpZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgU3RyaW5nIGNoZWNrUGFpcmluZ1JlcXVlc3RBbmRHZXRBZGRyZXNzKFN0cmluZyBvYmplY3RQYXRoLCBpbnQgbmF0aXZlRGF0YSkgewogICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldEFkZHJlc3NGcm9tT2JqZWN0UGF0aChvYmplY3RQYXRoKTsKICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgewpAQCAtNTE5LDYgKzU3NSw4IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIG9uQWdlbnRBdXRob3JpemUoU3RyaW5nIG9iamVjdFBhdGgsIFN0cmluZyBkZXZpY2VVdWlkKSB7CisgICAgICAgIGlmICghbUJsdWV0b290aFNlcnZpY2UuaXNFbmFibGVkKCkpIHJldHVybiBmYWxzZTsKKwogICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldEFkZHJlc3NGcm9tT2JqZWN0UGF0aChvYmplY3RQYXRoKTsKICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5hYmxlIHRvIGdldCBkZXZpY2UgYWRkcmVzcyBpbiBvbkF1dGhBZ2VudEF1dGhvcml6ZSIpOwpAQCAtNTI3LDIyICs1ODUsMzMgQEAKIAogICAgICAgICBib29sZWFuIGF1dGhvcml6ZWQgPSBmYWxzZTsKICAgICAgICAgUGFyY2VsVXVpZCB1dWlkID0gUGFyY2VsVXVpZC5mcm9tU3RyaW5nKGRldmljZVV1aWQpOwotICAgICAgICBCbHVldG9vdGhBMmRwIGEyZHAgPSBuZXcgQmx1ZXRvb3RoQTJkcChtQ29udGV4dCk7CisgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7CiAKICAgICAgICAgLy8gQmx1ZXogc2VuZHMgdGhlIFVVSUQgb2YgdGhlIGxvY2FsIHNlcnZpY2UgYmVpbmcgYWNjZXNzZWQsIF9ub3RfIHRoZQogICAgICAgICAvLyByZW1vdGUgc2VydmljZQotICAgICAgICBpZiAobUJsdWV0b290aFNlcnZpY2UuaXNFbmFibGVkKCkgJiYKLSAgICAgICAgICAgICAgICAoQmx1ZXRvb3RoVXVpZC5pc0F1ZGlvU291cmNlKHV1aWQpIHx8IEJsdWV0b290aFV1aWQuaXNBdnJjcFRhcmdldCh1dWlkKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgQmx1ZXRvb3RoVXVpZC5pc0FkdkF1ZGlvRGlzdCh1dWlkKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFpc090aGVyU2lua0luTm9uRGlzY29ubmVjdGluZ1N0YXRlKGFkZHJlc3MpKSB7Ci0gICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOwotICAgICAgICAgICAgYXV0aG9yaXplZCA9IGEyZHAuZ2V0U2lua1ByaW9yaXR5KGRldmljZSkgPiBCbHVldG9vdGhBMmRwLlBSSU9SSVRZX09GRjsKKyAgICAgICAgaWYgKG1BMmRwICE9IG51bGwgJiYKKyAgICAgICAgICAgIChCbHVldG9vdGhVdWlkLmlzQXVkaW9Tb3VyY2UodXVpZCkgfHwgQmx1ZXRvb3RoVXVpZC5pc0F2cmNwVGFyZ2V0KHV1aWQpCisgICAgICAgICAgICAgIHx8IEJsdWV0b290aFV1aWQuaXNBZHZBdWRpb0Rpc3QodXVpZCkpICYmCisgICAgICAgICAgICAgICFpc090aGVyU2lua0luTm9uRGlzY29ubmVjdGVkU3RhdGUoYWRkcmVzcykpIHsKKyAgICAgICAgICAgIGF1dGhvcml6ZWQgPSBtQTJkcC5nZXRQcmlvcml0eShkZXZpY2UpID4gQmx1ZXRvb3RoUHJvZmlsZS5QUklPUklUWV9PRkY7CiAgICAgICAgICAgICBpZiAoYXV0aG9yaXplZCkgewogICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkFsbG93aW5nIGluY29taW5nIEEyRFAgLyBBVlJDUCBjb25uZWN0aW9uIGZyb20gIiArIGFkZHJlc3MpOwogICAgICAgICAgICAgICAgIG1CbHVldG9vdGhTZXJ2aWNlLm5vdGlmeUluY29taW5nQTJkcENvbm5lY3Rpb24oYWRkcmVzcyk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlamVjdGluZyBpbmNvbWluZyBBMkRQIC8gQVZSQ1AgY29ubmVjdGlvbiBmcm9tICIgKyBhZGRyZXNzKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChCbHVldG9vdGhVdWlkLmlzSW5wdXREZXZpY2UodXVpZCkgJiYgIWlzT3RoZXJJbnB1dERldmljZUNvbm5lY3RlZChhZGRyZXNzKSkgeworICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UgaW5wdXREZXZpY2UgPSBuZXcgQmx1ZXRvb3RoSW5wdXREZXZpY2UobUNvbnRleHQpOworICAgICAgICAgICAgYXV0aG9yaXplZCA9IGlucHV0RGV2aWNlLmdldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlKSA+CisgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfT0ZGOworICAgICAgICAgICAgIGlmIChhdXRob3JpemVkKSB7CisgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkFsbG93aW5nIGluY29taW5nIEhJRCBjb25uZWN0aW9uIGZyb20gIiArIGFkZHJlc3MpOworICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlamVjdGluZyBpbmNvbWluZyBISUQgY29ubmVjdGlvbiBmcm9tICIgKyBhZGRyZXNzKTsKKyAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoQmx1ZXRvb3RoVXVpZC5pc0JuZXAodXVpZCkgfHwgQmx1ZXRvb3RoVXVpZC5pc05hcCh1dWlkKSAmJgorICAgICAgICAgICAgICAgIG1CbHVldG9vdGhTZXJ2aWNlLmFsbG93SW5jb21pbmdUZXRoZXJpbmcoKSl7CisgICAgICAgICAgICBhdXRob3JpemVkID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlamVjdGluZyBpbmNvbWluZyAiICsgZGV2aWNlVXVpZCArICIgY29ubmVjdGlvbiBmcm9tICIgKyBhZGRyZXNzKTsKICAgICAgICAgfQpAQCAtNTUwLDYgKzYxOSwxOCBAQAogICAgICAgICByZXR1cm4gYXV0aG9yaXplZDsKICAgICB9CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNPdGhlcklucHV0RGV2aWNlQ29ubmVjdGVkKFN0cmluZyBhZGRyZXNzKSB7CisgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMgPQorICAgICAgICAgICAgbUJsdWV0b290aFNlcnZpY2UubG9va3VwSW5wdXREZXZpY2VzTWF0Y2hpbmdTdGF0ZXMobmV3IGludFtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUR9KTsKKworICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2UgOiBkZXZpY2VzKSB7CisgICAgICAgICAgICBpZiAoIWRldmljZS5nZXRBZGRyZXNzKCkuZXF1YWxzKGFkZHJlc3MpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgcHJpdmF0ZSBib29sZWFuIG9uQWdlbnRPdXRPZkJhbmREYXRhQXZhaWxhYmxlKFN0cmluZyBvYmplY3RQYXRoKSB7CiAgICAgICAgIGlmICghbUJsdWV0b290aFNlcnZpY2UuaXNFbmFibGVkKCkpIHJldHVybiBmYWxzZTsKIApAQCAtNTYxLDEyICs2NDIsMTQgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKLQogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc090aGVyU2lua0luTm9uRGlzY29ubmVjdGluZ1N0YXRlKFN0cmluZyBhZGRyZXNzKSB7Ci0gICAgICAgIEJsdWV0b290aEEyZHAgYTJkcCA9IG5ldyBCbHVldG9vdGhBMmRwKG1Db250ZXh0KTsKLSAgICAgICAgU2V0PEJsdWV0b290aERldmljZT4gZGV2aWNlcyA9IGEyZHAuZ2V0Tm9uRGlzY29ubmVjdGVkU2lua3MoKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNPdGhlclNpbmtJbk5vbkRpc2Nvbm5lY3RlZFN0YXRlKFN0cmluZyBhZGRyZXNzKSB7CisgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMgPQorICAgICAgICAgICAgbUEyZHAuZ2V0RGV2aWNlc01hdGNoaW5nQ29ubmVjdGlvblN0YXRlcyhuZXcgaW50W10ge0JsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVElOR30pOworCiAgICAgICAgIGlmIChkZXZpY2VzLnNpemUoKSA9PSAwKSByZXR1cm4gZmFsc2U7CiAgICAgICAgIGZvcihCbHVldG9vdGhEZXZpY2UgZGV2OiBkZXZpY2VzKSB7CiAgICAgICAgICAgICBpZiAoIWRldi5nZXRBZGRyZXNzKCkuZXF1YWxzKGFkZHJlc3MpKSByZXR1cm4gdHJ1ZTsKQEAgLTYxNSw2ICs2OTgsNjAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBvbklucHV0RGV2aWNlQ29ubmVjdGlvblJlc3VsdChTdHJpbmcgcGF0aCwgYm9vbGVhbiByZXN1bHQpIHsKKyAgICAgICAgLy8gU3VjY2VzcyBjYXNlIGdldHMgaGFuZGxlZCBieSBQcm9wZXJ0eSBDaGFuZ2Ugc2lnbmFsCisgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldEFkZHJlc3NGcm9tT2JqZWN0UGF0aChwYXRoKTsKKyAgICAgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgYm9vbGVhbiBjb25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7CisgICAgICAgICAgICBpbnQgc3RhdGUgPSBtQmx1ZXRvb3RoU2VydmljZS5nZXRJbnB1dERldmljZVN0YXRlKGRldmljZSk7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVElORykgeworICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNUSU5HKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3Igb25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQuIFN0YXRlIGlzOiIgKyBzdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQmx1ZXRvb3RoU2VydmljZS5oYW5kbGVJbnB1dERldmljZVByb3BlcnR5Q2hhbmdlKGFkZHJlc3MsIGNvbm5lY3RlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25QYW5EZXZpY2VDb25uZWN0aW9uUmVzdWx0KFN0cmluZyBwYXRoLCBib29sZWFuIHJlc3VsdCkgeworICAgICAgICBsb2cgKCJvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQgIiArIHBhdGggKyAiICIgKyByZXN1bHQpOworICAgICAgICAvLyBTdWNjZXNzIGNhc2UgZ2V0cyBoYW5kbGVkIGJ5IFByb3BlcnR5IENoYW5nZSBzaWduYWwKKyAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzID0gbUJsdWV0b290aFNlcnZpY2UuZ2V0QWRkcmVzc0Zyb21PYmplY3RQYXRoKHBhdGgpOworICAgICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICBib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKTsKKyAgICAgICAgICAgIGludCBzdGF0ZSA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldFBhbkRldmljZVN0YXRlKGRldmljZSk7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RJTkcpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoUGFuLlNUQVRFX0RJU0NPTk5FQ1RJTkcpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQuIFN0YXRlIGlzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHN0YXRlICsgIiByZXN1bHQ6ICIrIHJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbmV3U3RhdGUgPSBjb25uZWN0ZWQ/IEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQgOgorICAgICAgICAgICAgICAgIEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgICAgICBtQmx1ZXRvb3RoU2VydmljZS5oYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIG5ld1N0YXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbk5ldHdvcmtEZXZpY2VEaXNjb25uZWN0ZWQoU3RyaW5nIGFkZHJlc3MpIHsKKyAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKTsKKyAgICAgICAgbUJsdWV0b290aFNlcnZpY2UuaGFuZGxlUGFuRGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhQYW4uU1RBVEVfRElTQ09OTkVDVEVEKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25OZXR3b3JrRGV2aWNlQ29ubmVjdGVkKFN0cmluZyBhZGRyZXNzLCBTdHJpbmcgaWZhY2UsIGludCBkZXN0VXVpZCkgeworICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOworICAgICAgICBtQmx1ZXRvb3RoU2VydmljZS5oYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIGlmYWNlLCBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVEVEKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgb25SZXN0YXJ0UmVxdWlyZWQoKSB7CiAgICAgICAgIGlmIChtQmx1ZXRvb3RoU2VydmljZS5pc0VuYWJsZWQoKSkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiKioqIEEgc2VyaW91cyBlcnJvciBvY2N1cnJlZCAoZGlkIGJsdWV0b290aGQgY3Jhc2g/KSAtICIgKwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aFNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhTZXJ2aWNlLmphdmEKaW5kZXggNzFiNGVlMi4uZjhjYWEyYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aFNlcnZpY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoU2VydmljZS5qYXZhCkBAIC0yOSw3ICsyOSwxMCBAQAogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIZWFkc2V0OwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQYW47CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZTsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQcm9maWxlU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSW5wdXREZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoU29ja2V0OwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFV1aWQ7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguSUJsdWV0b290aDsKQEAgLTQwLDkgKzQzLDEzIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0LkludGVyZmFjZUNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsVXVpZDsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKQEAgLTcxLDggKzc4LDEwIEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIHB1YmxpYyBjbGFzcyBCbHVldG9vdGhTZXJ2aWNlIGV4dGVuZHMgSUJsdWV0b290aC5TdHViIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aFNlcnZpY2UiOwpAQCAtODAsMTEgKzg5LDEzIEBACiAKICAgICBwcml2YXRlIGludCBtTmF0aXZlRGF0YTsKICAgICBwcml2YXRlIEJsdWV0b290aEV2ZW50TG9vcCBtRXZlbnRMb29wOworICAgIHByaXZhdGUgQmx1ZXRvb3RoSGVhZHNldCBtQmx1ZXRvb3RoSGVhZHNldDsKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzQWlycGxhbmVTZW5zaXRpdmU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0FpcnBsYW5lVG9nZ2xlYWJsZTsKICAgICBwcml2YXRlIGludCBtQmx1ZXRvb3RoU3RhdGU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1SZXN0YXJ0ID0gZmFsc2U7ICAvLyBuZWVkIHRvIGNhbGwgZW5hYmxlKCkgYWZ0ZXIgZGlzYWJsZSgpCiAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0Rpc2NvdmVyaW5nOworICAgIHByaXZhdGUgYm9vbGVhbiBtVGV0aGVyaW5nT247CiAKICAgICBwcml2YXRlIEJsdWV0b290aEFkYXB0ZXIgbUFkYXB0ZXI7ICAvLyBjb25zdGFudCBhZnRlciBpbml0KCkKICAgICBwcml2YXRlIGZpbmFsIEJvbmRTdGF0ZSBtQm9uZFN0YXRlID0gbmV3IEJvbmRTdGF0ZSgpOyAgLy8gbG9jYWwgY2FjaGUgb2YgYm9uZGluZ3MKQEAgLTExMyw2ICsxMjQsMTMgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIElOSVRfQVVUT19QQUlSSU5HX0ZBSUxVUkVfQVRURU1QVF9ERUxBWSA9IDMwMDA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQVhfQVVUT19QQUlSSU5HX0ZBSUxVUkVfQVRURU1QVF9ERUxBWSA9IDEyMDAwOwogCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtQmx1ZXRvb3RoSWZhY2VBZGRyZXNzZXM7CisgICAgcHJpdmF0ZSBpbnQgbU1heFBhbkRldmljZXM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxVRVRPT1RIX0lGQUNFX0FERFJfU1RBUlQ9ICIxOTIuMTY4LjQ0LjEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCTFVFVE9PVEhfTUFYX1BBTl9DT05ORUNUSU9OUyA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJMVUVUT09USF9ORVRNQVNLICAgICAgICA9ICIyNTUuMjU1LjI1NS4wIjsKKwogICAgIC8vIFRoZSB0aW1lb3V0IHVzZWQgdG8gc2VudCB0aGUgVVVJRHMgSW50ZW50CiAgICAgLy8gVGhpcyB0aW1lb3V0IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gdGhlIHBhZ2UgdGltZW91dAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVVUlEX0lOVEVOVF9ERUxBWSA9IDYwMDA7CkBAIC0xMzYsMTAgKzE1NCwxNCBAQAogICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZT4gbURldmljZVByb2ZpbGVTdGF0ZTsKICAgICBwcml2YXRlIGZpbmFsIEJsdWV0b290aFByb2ZpbGVTdGF0ZSBtQTJkcFByb2ZpbGVTdGF0ZTsKICAgICBwcml2YXRlIGZpbmFsIEJsdWV0b290aFByb2ZpbGVTdGF0ZSBtSGZwUHJvZmlsZVN0YXRlOworICAgIHByaXZhdGUgZmluYWwgQmx1ZXRvb3RoUHJvZmlsZVN0YXRlIG1IaWRQcm9maWxlU3RhdGU7CiAKICAgICBwcml2YXRlIEJsdWV0b290aEEyZHBTZXJ2aWNlIG1BMmRwU2VydmljZTsKKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8Qmx1ZXRvb3RoRGV2aWNlLCBJbnRlZ2VyPiBtSW5wdXREZXZpY2VzOworICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxCbHVldG9vdGhEZXZpY2UsIFBhaXI8SW50ZWdlciwgU3RyaW5nPj4gbVBhbkRldmljZXM7CiAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgUGFpcjxieXRlW10sIGJ5dGVbXT4+IG1EZXZpY2VPb2JEYXRhOwogCisKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbURvY2tBZGRyZXNzOwogICAgIHByaXZhdGUgU3RyaW5nIG1Eb2NrUGluOwogCkBAIC0xOTAsNiArMjEyLDcgQEAKIAogICAgICAgICBtQmx1ZXRvb3RoU3RhdGUgPSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09GRjsKICAgICAgICAgbUlzRGlzY292ZXJpbmcgPSBmYWxzZTsKKyAgICAgICAgbVRldGhlcmluZ09uID0gZmFsc2U7CiAgICAgICAgIG1BZGFwdGVyUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwogICAgICAgICBtRGV2aWNlUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZyxTdHJpbmc+PigpOwogCkBAIC0yMDEsMTUgKzIyNCwyNyBAQAogICAgICAgICBtRGV2aWNlUHJvZmlsZVN0YXRlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGU+KCk7CiAgICAgICAgIG1BMmRwUHJvZmlsZVN0YXRlID0gbmV3IEJsdWV0b290aFByb2ZpbGVTdGF0ZShtQ29udGV4dCwgQmx1ZXRvb3RoUHJvZmlsZVN0YXRlLkEyRFApOwogICAgICAgICBtSGZwUHJvZmlsZVN0YXRlID0gbmV3IEJsdWV0b290aFByb2ZpbGVTdGF0ZShtQ29udGV4dCwgQmx1ZXRvb3RoUHJvZmlsZVN0YXRlLkhGUCk7CisgICAgICAgIG1IaWRQcm9maWxlU3RhdGUgPSBuZXcgQmx1ZXRvb3RoUHJvZmlsZVN0YXRlKG1Db250ZXh0LCBCbHVldG9vdGhQcm9maWxlU3RhdGUuSElEKTsKKworICAgICAgICBtQmx1ZXRvb3RoSWZhY2VBZGRyZXNzZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1NYXhQYW5EZXZpY2VzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRJbnRlZ2VyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaW50ZWdlci5jb25maWdfbWF4X3Bhbl9kZXZpY2VzKTsKKyAgICAgICAgfSBjYXRjaCAoTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbU1heFBhbkRldmljZXMgPSBCTFVFVE9PVEhfTUFYX1BBTl9DT05ORUNUSU9OUzsKKyAgICAgICAgfQogCiAgICAgICAgIG1IZnBQcm9maWxlU3RhdGUuc3RhcnQoKTsKICAgICAgICAgbUEyZHBQcm9maWxlU3RhdGUuc3RhcnQoKTsKKyAgICAgICAgbUhpZFByb2ZpbGVTdGF0ZS5zdGFydCgpOwogCiAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CiAgICAgICAgIHJlZ2lzdGVyRm9yQWlycGxhbmVNb2RlKGZpbHRlcik7CiAKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX0RPQ0tfRVZFTlQpOwogICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlciwgZmlsdGVyKTsKKyAgICAgICAgbUlucHV0RGV2aWNlcyA9IG5ldyBIYXNoTWFwPEJsdWV0b290aERldmljZSwgSW50ZWdlcj4oKTsKKyAgICAgICAgbVBhbkRldmljZXMgPSBuZXcgSGFzaE1hcDxCbHVldG9vdGhEZXZpY2UsIFBhaXI8SW50ZWdlciwgU3RyaW5nPj4oKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBTdHJpbmcgcmVhZERvY2tCbHVldG9vdGhBZGRyZXNzKCkgewpAQCAtMzM3LDYgKzM3Miw3IEBACiAgICAgICAgIH0KICAgICAgICAgc2V0Qmx1ZXRvb3RoU3RhdGUoQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9UVVJOSU5HX09GRik7CiAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1FU1NBR0VfUkVHSVNURVJfU0RQX1JFQ09SRFMpOworICAgICAgICBzZXRCbHVldG9vdGhUZXRoZXJpbmdOYXRpdmUoZmFsc2UsIEJsdWV0b290aFBhbi5OQVBfUk9MRSwgQmx1ZXRvb3RoUGFuLk5BUF9CUklER0UpOwogCiAgICAgICAgIC8vIEFsbG93IDMgc2Vjb25kcyBmb3IgcHJvZmlsZXMgdG8gZ3JhY2VmdWxseSBkaXNjb25uZWN0CiAgICAgICAgIC8vIFRPRE86IEludHJvZHVjZSBhIGNhbGxiYWNrIG1lY2hhbmlzbSBzbyB0aGF0IGVhY2ggcHJvZmlsZSBjYW4gbm90aWZ5CkBAIC01NjcsOCArNjAzLDEyIEBACiAgICAgICAgICAgICAgICAgbUJvbmRTdGF0ZS5yZWFkQXV0b1BhaXJpbmdEYXRhKCk7CiAgICAgICAgICAgICAgICAgbUJvbmRTdGF0ZS5sb2FkQm9uZFN0YXRlKCk7CiAgICAgICAgICAgICAgICAgaW5pdFByb2ZpbGVTdGF0ZSgpOworCisgICAgICAgICAgICAgICAgLy9SZWdpc3RlciBTRFAgcmVjb3Jkcy4KICAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1FU1NBR0VfUkVHSVNURVJfU0RQX1JFQ09SRFMsIDEsIC0xKSwgMzAwMCk7CisgICAgICAgICAgICAgICAgc2V0Qmx1ZXRvb3RoVGV0aGVyaW5nTmF0aXZlKHRydWUsIEJsdWV0b290aFBhbi5OQVBfUk9MRSwgQmx1ZXRvb3RoUGFuLk5BUF9CUklER0UpOworCiAKICAgICAgICAgICAgICAgICAvLyBMb2cgYmx1ZXRvb3RoIG9uIHRvIGJhdHRlcnkgc3RhdHMuCiAgICAgICAgICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwpAQCAtNzQ3LDYgKzc4NywxMCBAQAogICAgICAgICAgICAgICAgIHJlbW92ZVByb2ZpbGVTdGF0ZShhZGRyZXNzKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gSElEIGlzIGhhbmRsZWQgYnkgQmx1ZXRvb3RoU2VydmljZSwgb3RoZXIgcHJvZmlsZXMKKyAgICAgICAgICAgIC8vIHdpbGwgYmUgaGFuZGxlZCBieSB0aGVpciByZXNwZWN0aXZlIHNlcnZpY2VzLgorICAgICAgICAgICAgc2V0SW5pdGlhbElucHV0RGV2aWNlUHJpb3JpdHkobUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpLCBzdGF0ZSk7CisKICAgICAgICAgICAgIGlmIChEQkcpIGxvZyhhZGRyZXNzICsgIiBib25kIHN0YXRlICIgKyBvbGRTdGF0ZSArICIgLT4gIiArIHN0YXRlICsgIiAoIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uICsgIikiKTsKICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEJsdWV0b290aERldmljZS5BQ1RJT05fQk9ORF9TVEFURV9DSEFOR0VEKTsKQEAgLTEzNjIsNiArMTQwNiw0MDkgQEAKICAgICAgICAgcmV0dXJuIHNwLmNvbnRhaW5zKFNIQVJFRF9QUkVGRVJFTkNFX0RPQ0tfQUREUkVTUyArIGFkZHJlc3MpOwogICAgIH0KIAorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1RldGhlcmluZ09uKCkgeworICAgICAgICByZXR1cm4gbVRldGhlcmluZ09uOworICAgIH0KKworICAgIC8qcGFja2FnZSovIHN5bmNocm9uaXplZCBib29sZWFuIGFsbG93SW5jb21pbmdUZXRoZXJpbmcoKSB7CisgICAgICAgIGlmIChpc1RldGhlcmluZ09uKCkgJiYgZ2V0Q29ubmVjdGVkUGFuRGV2aWNlcygpLmxlbmd0aCA8IG1NYXhQYW5EZXZpY2VzKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1UZXRoZXJpbmdSZWNlaXZlciA9IG51bGw7CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Qmx1ZXRvb3RoVGV0aGVyaW5nKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICAgICAgZGlzY29ubmVjdFBhbigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldEJsdWV0b290aFN0YXRlKCkgIT0gQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PTiAmJiB2YWx1ZSkgeworICAgICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgICAgICBtVGV0aGVyaW5nUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhBZGFwdGVyLkVYVFJBX1NUQVRFLCBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09GRikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09OKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVGV0aGVyaW5nT24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1UZXRoZXJpbmdSZWNlaXZlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtVGV0aGVyaW5nUmVjZWl2ZXIsIGZpbHRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVGV0aGVyaW5nT24gPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFBhbkRldmljZVN0YXRlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOworCisgICAgICAgIFBhaXI8SW50ZWdlciwgU3RyaW5nPiBwYW5EZXZpY2UgPSBtUGFuRGV2aWNlcy5nZXQoZGV2aWNlKTsKKyAgICAgICAgaWYgKHBhbkRldmljZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gQmx1ZXRvb3RoUGFuLlNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFuRGV2aWNlLmZpcnN0OworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb25uZWN0UGFuRGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZWQgQkxVRVRPT1RIX0FETUlOIHBlcm1pc3Npb24iKTsKKworICAgICAgICBTdHJpbmcgb2JqZWN0UGF0aCA9IGdldE9iamVjdFBhdGhGcm9tQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0IFBBTigiICsgb2JqZWN0UGF0aCArICIpIik7CisgICAgICAgIGlmIChnZXRQYW5EZXZpY2VTdGF0ZShkZXZpY2UpICE9IEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgIGxvZyAoZGV2aWNlICsgIiBhbHJlYWR5IGNvbm5lY3RlZCB0byBQQU4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjb25uZWN0ZWRDb3VudCA9IDA7CisgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIHBhbkRldmljZTogbVBhbkRldmljZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChnZXRQYW5EZXZpY2VTdGF0ZShwYW5EZXZpY2UpID09IEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWRDb3VudCArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY29ubmVjdGVkQ291bnQgPiA4KSB7CisgICAgICAgICAgICBsb2cgKGRldmljZSArICIgY291bGQgbm90IGNvbm5lY3QgdG8gUEFOIGJlY2F1c2UgOCBvdGhlciBkZXZpY2VzIGFyZSBhbHJlYWR5IGNvbm5lY3RlZCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaGFuZGxlUGFuRGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVElORyk7CisgICAgICAgIGlmIChjb25uZWN0UGFuRGV2aWNlTmF0aXZlKG9iamVjdFBhdGgsICJuYXAiLCAicGFudSIpKSB7CisgICAgICAgICAgICBsb2cgKCJjb25uZWN0aW5nIHRvIFBBTiIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQpOworICAgICAgICAgICAgbG9nICgiY291bGQgbm90IGNvbm5lY3QgdG8gUEFOIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGRpc2Nvbm5lY3RQYW4oKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfUEVSTSwgIk5lZWQgQkxVRVRPT1RIIHBlcm1pc3Npb24iKTsKKyAgICAgICAgaWYgKERCRykgbG9nKCJkaXNjb25uZWN0IGFsbCBQQU4gZGV2aWNlcyIpOworCisgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZTogbVBhbkRldmljZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChnZXRQYW5EZXZpY2VTdGF0ZShkZXZpY2UpID09IEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWRpc2Nvbm5lY3RQYW5EZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cgKCJjb3VsZCBub3QgZGlzY29ubmVjdCBQYW4gRGV2aWNlICIrZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBCbHVldG9vdGhEZXZpY2VbXSBnZXRDb25uZWN0ZWRQYW5EZXZpY2VzKCkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX1BFUk0sICJOZWVkIEJMVUVUT09USCBwZXJtaXNzaW9uIik7CisKKyAgICAgICAgU2V0PEJsdWV0b290aERldmljZT4gZGV2aWNlcyA9IG5ldyBIYXNoU2V0PEJsdWV0b290aERldmljZT4oKTsKKyAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlOiBtUGFuRGV2aWNlcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgaWYgKGdldFBhbkRldmljZVN0YXRlKGRldmljZSkgPT0gQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgIGRldmljZXMuYWRkKGRldmljZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRldmljZXMudG9BcnJheShuZXcgQmx1ZXRvb3RoRGV2aWNlW2RldmljZXMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGRpc2Nvbm5lY3RQYW5EZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOworICAgICAgICBTdHJpbmcgb2JqZWN0UGF0aCA9IGdldE9iamVjdFBhdGhGcm9tQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaWYgKERCRykgbG9nKCJkaXNjb25uZWN0IFBBTigiICsgb2JqZWN0UGF0aCArICIpIik7CisgICAgICAgIGlmIChnZXRQYW5EZXZpY2VTdGF0ZShkZXZpY2UpICE9IEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgIGxvZyAoZGV2aWNlICsgIiBhbHJlYWR5IGRpc2Nvbm5lY3RlZCBmcm9tIFBBTiIpOworICAgICAgICB9CisgICAgICAgIGhhbmRsZVBhbkRldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgQmx1ZXRvb3RoUGFuLlNUQVRFX0RJU0NPTk5FQ1RJTkcpOworICAgICAgICByZXR1cm4gZGlzY29ubmVjdFBhbkRldmljZU5hdGl2ZShvYmplY3RQYXRoKTsKKyAgICB9CisKKyAgICAvKnBhY2thZ2UqLyBzeW5jaHJvbml6ZWQgdm9pZCBoYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdGUpIHsKKyAgICAgICAgaW50IHByZXZTdGF0ZTsKKyAgICAgICAgU3RyaW5nIGlmYWNlQWRkciA9IG51bGw7CisKKyAgICAgICAgaWYgKG1QYW5EZXZpY2VzLmdldChkZXZpY2UpID09IG51bGwpIHsKKyAgICAgICAgICAgIHByZXZTdGF0ZSA9IEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmV2U3RhdGUgPSBtUGFuRGV2aWNlcy5nZXQoZGV2aWNlKS5maXJzdDsKKyAgICAgICAgICAgIGlmYWNlQWRkciA9IG1QYW5EZXZpY2VzLmdldChkZXZpY2UpLnNlY29uZDsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJldlN0YXRlID09IHN0YXRlKSByZXR1cm47CisKKyAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgIGlmYWNlQWRkciA9IGVuYWJsZVRldGhlcmluZyhpZmFjZSk7CisgICAgICAgICAgICBpZiAoaWZhY2VBZGRyID09IG51bGwpIExvZy5lKFRBRywgIkVycm9yIHNldGluZyB1cCB0ZXRoZXIgaW50ZXJmYWNlIik7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoUGFuLlNUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgaWYgKGlmYWNlQWRkciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUJsdWV0b290aElmYWNlQWRkcmVzc2VzLnJlbW92ZShpZmFjZUFkZHIpOworICAgICAgICAgICAgICAgIGlmYWNlQWRkciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBQYWlyPEludGVnZXIsIFN0cmluZz4gdmFsdWUgPSBuZXcgUGFpcjxJbnRlZ2VyLCBTdHJpbmc+KHN0YXRlLCBpZmFjZUFkZHIpOworICAgICAgICBtUGFuRGV2aWNlcy5wdXQoZGV2aWNlLCB2YWx1ZSk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQmx1ZXRvb3RoUGFuLkFDVElPTl9QQU5fU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFLCBkZXZpY2UpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoUGFuLkVYVFJBX1BSRVZJT1VTX1BBTl9TVEFURSwgcHJldlN0YXRlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aFBhbi5FWFRSQV9QQU5fU1RBVEUsIHN0YXRlKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQsIEJMVUVUT09USF9QRVJNKTsKKworICAgICAgICBpZiAoREJHKSBsb2coIlBhbiBEZXZpY2Ugc3RhdGUgOiBkZXZpY2U6ICIgKyBkZXZpY2UgKyAiIFN0YXRlOiIgKyBwcmV2U3RhdGUgKyAiLT4iICsgc3RhdGUpOworICAgIH0KKworICAgIC8qcGFja2FnZSovIHN5bmNocm9uaXplZCB2b2lkIGhhbmRsZVBhbkRldmljZVN0YXRlQ2hhbmdlKEJsdWV0b290aERldmljZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRlKSB7CisgICAgICAgIGhhbmRsZVBhbkRldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgbnVsbCwgc3RhdGUpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZU5ld1RldGhlcmluZ0FkZHJlc3NMb2NrZWQoKSB7CisgICAgICAgIGlmIChnZXRDb25uZWN0ZWRQYW5EZXZpY2VzKCkubGVuZ3RoID09IG1NYXhQYW5EZXZpY2VzKSB7CisgICAgICAgICAgICBsb2coIk1heCBQQU4gZGV2aWNlIGNvbm5lY3Rpb25zIHJlYWNoZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBhZGRyZXNzID0gQkxVRVRPT1RIX0lGQUNFX0FERFJfU1RBUlQ7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpZiAobUJsdWV0b290aElmYWNlQWRkcmVzc2VzLmNvbnRhaW5zKGFkZHJlc3MpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gYWRkciA9IGFkZHJlc3Muc3BsaXQoIlxcLiIpOworICAgICAgICAgICAgICAgIEludGVnZXIgbmV3SXAgPSBJbnRlZ2VyLnBhcnNlSW50KGFkZHJbMl0pICsgMTsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gYWRkcmVzcy5yZXBsYWNlKGFkZHJbMl0sIG5ld0lwLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQmx1ZXRvb3RoSWZhY2VBZGRyZXNzZXMuYWRkKGFkZHJlc3MpOworICAgICAgICByZXR1cm4gYWRkcmVzczsKKyAgICB9CisKKyAgICAvLyBjb25maWd1cmVkIHdoZW4gd2Ugc3RhcnQgdGV0aGVyaW5nCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU3RyaW5nIGVuYWJsZVRldGhlcmluZyhTdHJpbmcgaWZhY2UpIHsKKyAgICAgICAgbG9nKCJ1cGRhdGVUZXRoZXJTdGF0ZToiICsgaWZhY2UpOworCisgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFKTsKKyAgICAgICAgSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSBzZXJ2aWNlID0gSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGIpOworICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyIGNtID0KKyAgICAgICAgICAgIChDb25uZWN0aXZpdHlNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgIFN0cmluZ1tdIGJsdWV0b290aFJlZ2V4cyA9IGNtLmdldFRldGhlcmFibGVCbHVldG9vdGhSZWdleHMoKTsKKworICAgICAgICAvLyBicmluZyB0b2dnbGUgdGhlIGludGVyZmFjZXMKKyAgICAgICAgU3RyaW5nW10gY3VycmVudElmYWNlcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjdXJyZW50SWZhY2VzID0gc2VydmljZS5saXN0SW50ZXJmYWNlcygpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgbGlzdGluZyBJbnRlcmZhY2VzIDoiICsgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChTdHJpbmcgY3VycklmYWNlOiBjdXJyZW50SWZhY2VzKSB7CisgICAgICAgICAgICBpZiAoY3VycklmYWNlLmVxdWFscyhpZmFjZSkpIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWZvdW5kKSByZXR1cm4gbnVsbDsKKworICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IGNyZWF0ZU5ld1RldGhlcmluZ0FkZHJlc3NMb2NrZWQoKTsKKyAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgSW50ZXJmYWNlQ29uZmlndXJhdGlvbiBpZmNnID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmY2cgPSBzZXJ2aWNlLmdldEludGVyZmFjZUNvbmZpZyhpZmFjZSk7CisgICAgICAgICAgICBpZiAoaWZjZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gYWRkciA9IEJMVUVUT09USF9ORVRNQVNLLnNwbGl0KCJcXC4iKTsKKyAgICAgICAgICAgICAgICBpZmNnLm5ldG1hc2sgPSAoSW50ZWdlci5wYXJzZUludChhZGRyWzBdKSA8PCAyNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgKEludGVnZXIucGFyc2VJbnQoYWRkclsxXSkgPDwgMTYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyLnBhcnNlSW50KGFkZHJbMl0pIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyLnBhcnNlSW50KGFkZHJbM10pKTsKKyAgICAgICAgICAgICAgICBpZiAoaWZjZy5pcEFkZHIgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBhZGRyID0gYWRkcmVzcy5zcGxpdCgiXFwuIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWZjZy5pcEFkZHIgPSAoSW50ZWdlci5wYXJzZUludChhZGRyWzBdKSA8PCAyNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyLnBhcnNlSW50KGFkZHJbMV0pIDw8IDE2KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEludGVnZXIucGFyc2VJbnQoYWRkclsyXSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyLnBhcnNlSW50KGFkZHJbM10pKTsKKyAgICAgICAgICAgICAgICAgICAgaWZjZy5pbnRlcmZhY2VGbGFncyA9CisgICAgICAgICAgICAgICAgICAgICAgICBpZmNnLmludGVyZmFjZUZsYWdzLnJlcGxhY2UoImRvd24iLCAidXAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWZjZy5pbnRlcmZhY2VGbGFncyA9IGlmY2cuaW50ZXJmYWNlRmxhZ3MucmVwbGFjZSgicnVubmluZyIsICIiKTsKKyAgICAgICAgICAgICAgICBpZmNnLmludGVyZmFjZUZsYWdzID0gaWZjZy5pbnRlcmZhY2VGbGFncy5yZXBsYWNlKCIgICIsIiAiKTsKKyAgICAgICAgICAgICAgICBzZXJ2aWNlLnNldEludGVyZmFjZUNvbmZpZyhpZmFjZSwgaWZjZyk7CisgICAgICAgICAgICAgICAgaWYgKGNtLnRldGhlcihpZmFjZSkgIT0gQ29ubmVjdGl2aXR5TWFuYWdlci5URVRIRVJfRVJST1JfTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgdGV0aGVyaW5nICIraWZhY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIGNvbmZpZ3VyaW5nIGludGVyZmFjZSAiICsgaWZhY2UgKyAiLCA6IiArIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFkZHJlc3M7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbm5lY3RJbnB1dERldmljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfQURNSU5fUEVSTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWVkIEJMVUVUT09USF9BRE1JTiBwZXJtaXNzaW9uIik7CisKKyAgICAgICAgU3RyaW5nIG9iamVjdFBhdGggPSBnZXRPYmplY3RQYXRoRnJvbUFkZHJlc3MoZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgIGlmIChvYmplY3RQYXRoID09IG51bGwgfHwKKyAgICAgICAgICAgIGdldElucHV0RGV2aWNlU3RhdGUoZGV2aWNlKSAhPSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQgfHwKKyAgICAgICAgICAgIGdldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlKSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9PRkYpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUgc3RhdGUgPSBtRGV2aWNlUHJvZmlsZVN0YXRlLmdldChkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaWYgKHN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIG1zZy5hcmcxID0gQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlLkNPTk5FQ1RfSElEX09VVEdPSU5HOworICAgICAgICAgICAgbXNnLm9iaiA9IHN0YXRlOworICAgICAgICAgICAgbUhpZFByb2ZpbGVTdGF0ZS5zZW5kTWVzc2FnZShtc2cpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2VJbnRlcm5hbChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIFN0cmluZyBvYmplY3RQYXRoID0gZ2V0T2JqZWN0UGF0aEZyb21BZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpOworICAgICAgICBoYW5kbGVJbnB1dERldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVElORyk7CisgICAgICAgIGlmICghY29ubmVjdElucHV0RGV2aWNlTmF0aXZlKG9iamVjdFBhdGgpKSB7CisgICAgICAgICAgICBoYW5kbGVJbnB1dERldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGlzY29ubmVjdElucHV0RGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZWQgQkxVRVRPT1RIX0FETUlOIHBlcm1pc3Npb24iKTsKKworICAgICAgICBTdHJpbmcgb2JqZWN0UGF0aCA9IGdldE9iamVjdFBhdGhGcm9tQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaWYgKG9iamVjdFBhdGggPT0gbnVsbCB8fCBnZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKS5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZSBzdGF0ZSA9IG1EZXZpY2VQcm9maWxlU3RhdGUuZ2V0KGRldmljZS5nZXRBZGRyZXNzKCkpOworICAgICAgICBpZiAoc3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICAgICAgbXNnLmFyZzEgPSBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUuRElTQ09OTkVDVF9ISURfT1VUR09JTkc7CisgICAgICAgICAgICBtc2cub2JqID0gc3RhdGU7CisgICAgICAgICAgICBtSGlkUHJvZmlsZVN0YXRlLnNlbmRNZXNzYWdlKG1zZyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZUludGVybmFsKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgU3RyaW5nIG9iamVjdFBhdGggPSBnZXRPYmplY3RQYXRoRnJvbUFkZHJlc3MoZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgIGhhbmRsZUlucHV0RGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNUSU5HKTsKKyAgICAgICAgaWYgKCFkaXNjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUob2JqZWN0UGF0aCkpIHsKKyAgICAgICAgICAgIGhhbmRsZUlucHV0RGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldElucHV0RGV2aWNlU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX1BFUk0sICJOZWVkIEJMVUVUT09USCBwZXJtaXNzaW9uIik7CisKKyAgICAgICAgaWYgKG1JbnB1dERldmljZXMuZ2V0KGRldmljZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUlucHV0RGV2aWNlcy5nZXQoZGV2aWNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIEJsdWV0b290aERldmljZVtdIGdldENvbm5lY3RlZElucHV0RGV2aWNlcygpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOworICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzID0gbG9va3VwSW5wdXREZXZpY2VzTWF0Y2hpbmdTdGF0ZXMoCisgICAgICAgICAgICBuZXcgaW50W10ge0JsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RFRH0pOworICAgICAgICByZXR1cm4gZGV2aWNlcy50b0FycmF5KG5ldyBCbHVldG9vdGhEZXZpY2VbZGV2aWNlcy5zaXplKCldKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRJbnB1dERldmljZVByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOworICAgICAgICByZXR1cm4gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0Qmx1ZXRvb3RoSW5wdXREZXZpY2VQcmlvcml0eUtleShkZXZpY2UuZ2V0QWRkcmVzcygpKSwKKyAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9VTkRFRklORUQpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRJbnB1dERldmljZVByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmlvcml0eSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOworICAgICAgICBpZiAoIUJsdWV0b290aEFkYXB0ZXIuY2hlY2tCbHVldG9vdGhBZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5wdXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldEJsdWV0b290aElucHV0RGV2aWNlUHJpb3JpdHlLZXkoZGV2aWNlLmdldEFkZHJlc3MoKSksCisgICAgICAgICAgICAgICAgcHJpb3JpdHkpOworICAgIH0KKworICAgIC8qcGFja2FnZSovc3luY2hyb25pemVkIFNldDxCbHVldG9vdGhEZXZpY2U+IGxvb2t1cElucHV0RGV2aWNlc01hdGNoaW5nU3RhdGVzKGludFtdIHN0YXRlcykgeworICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBpbnB1dERldmljZXMgPSBuZXcgSGFzaFNldDxCbHVldG9vdGhEZXZpY2U+KCk7CisgICAgICAgIGlmIChtSW5wdXREZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0RGV2aWNlczsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2U6IG1JbnB1dERldmljZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGludCBpbnB1dERldmljZVN0YXRlID0gZ2V0SW5wdXREZXZpY2VTdGF0ZShkZXZpY2UpOworICAgICAgICAgICAgZm9yIChpbnQgc3RhdGUgOiBzdGF0ZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gaW5wdXREZXZpY2VTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dERldmljZXMuYWRkKGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5wdXREZXZpY2VzOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaGFuZGxlSW5wdXREZXZpY2VTdGF0ZUNoYW5nZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgc3RhdGUpIHsKKyAgICAgICAgaW50IHByZXZTdGF0ZTsKKyAgICAgICAgaWYgKG1JbnB1dERldmljZXMuZ2V0KGRldmljZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgcHJldlN0YXRlID0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJldlN0YXRlID0gbUlucHV0RGV2aWNlcy5nZXQoZGV2aWNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJldlN0YXRlID09IHN0YXRlKSByZXR1cm47CisKKyAgICAgICAgbUlucHV0RGV2aWNlcy5wdXQoZGV2aWNlLCBzdGF0ZSk7CisKKyAgICAgICAgaWYgKGdldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlKSA+CisgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX09GRiAmJgorICAgICAgICAgICAgc3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVElORyB8fAorICAgICAgICAgICAgc3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAvLyBXZSBoYXZlIGNvbm5lY3RlZCBvciBhdHRlbXB0aW5nIHRvIGNvbm5lY3QuCisgICAgICAgICAgICAvLyBCdW1wIHByaW9yaXR5CisgICAgICAgICAgICBzZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfQVVUT19DT05ORUNUKTsKKyAgICAgICAgfQorCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEJsdWV0b290aElucHV0RGV2aWNlLkFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFLCBkZXZpY2UpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoSW5wdXREZXZpY2UuRVhUUkFfUFJFVklPVVNfSU5QVVRfREVWSUNFX1NUQVRFLCBwcmV2U3RhdGUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoSW5wdXREZXZpY2UuRVhUUkFfSU5QVVRfREVWSUNFX1NUQVRFLCBzdGF0ZSk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50LCBCTFVFVE9PVEhfUEVSTSk7CisKKyAgICAgICAgaWYgKERCRykgbG9nKCJJbnB1dERldmljZSBzdGF0ZSA6IGRldmljZTogIiArIGRldmljZSArICIgU3RhdGU6IiArIHByZXZTdGF0ZSArICItPiIgKyBzdGF0ZSk7CisKKyAgICB9CisKKyAgICAvKnBhY2thZ2UqLyB2b2lkIGhhbmRsZUlucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2UoU3RyaW5nIGFkZHJlc3MsIGJvb2xlYW4gY29ubmVjdGVkKSB7CisgICAgICAgIGludCBzdGF0ZSA9IGNvbm5lY3RlZCA/IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RFRCA6CisgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7CisgICAgICAgIGhhbmRsZUlucHV0RGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBzdGF0ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEluaXRpYWxJbnB1dERldmljZVByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBzdGF0ZSkgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRDoKKyAgICAgICAgICAgICAgICBpZiAoZ2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UpID09IEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX1VOREVGSU5FRCkgeworICAgICAgICAgICAgICAgICAgICBzZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfT04pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORToKKyAgICAgICAgICAgICAgICBzZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfVU5ERUZJTkVEKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qcGFja2FnZSovIGJvb2xlYW4gaXNSZW1vdGVEZXZpY2VJbkNhY2hlKFN0cmluZyBhZGRyZXNzKSB7CiAgICAgICAgIHJldHVybiAobURldmljZVByb3BlcnRpZXMuZ2V0KGFkZHJlc3MpICE9IG51bGwpOwogICAgIH0KQEAgLTEzODQsNyArMTgzMSw3IEBACiAgICAgICAgICAgICBpZiAodXBkYXRlUmVtb3RlRGV2aWNlUHJvcGVydGllc0NhY2hlKGFkZHJlc3MpKQogICAgICAgICAgICAgICAgIHJldHVybiBnZXRSZW1vdGVEZXZpY2VQcm9wZXJ0eShhZGRyZXNzLCBwcm9wZXJ0eSk7CiAgICAgICAgIH0KLSAgICAgICAgTG9nLmUoVEFHLCAiZ2V0UmVtb3RlRGV2aWNlUHJvcGVydHk6ICIgKyBwcm9wZXJ0eSArICJub3QgcHJlc2VudDoiICsgYWRkcmVzcyk7CisgICAgICAgIExvZy5lKFRBRywgImdldFJlbW90ZURldmljZVByb3BlcnR5OiAiICsgcHJvcGVydHkgKyAiIG5vdCBwcmVzZW50OiAiICsgYWRkcmVzcyk7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIApAQCAtMTk4OSw3ICsyNDM2LDggQEAKICAgICAgICAgcHcucHJpbnRsbigiTG9jYWwgbmFtZSA9ICIgKyBnZXROYW1lKCkpOwogICAgICAgICBwdy5wcmludGxuKCJpc0Rpc2NvdmVyaW5nKCkgPSAiICsgaXNEaXNjb3ZlcmluZygpKTsKIAotICAgICAgICBCbHVldG9vdGhIZWFkc2V0IGhlYWRzZXQgPSBuZXcgQmx1ZXRvb3RoSGVhZHNldChtQ29udGV4dCwgbnVsbCk7CisgICAgICAgIG1BZGFwdGVyLmdldFByb2ZpbGVQcm94eShtQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhQcm9maWxlU2VydmljZUxpc3RlbmVyLCBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQpOwogCiAgICAgICAgIHB3LnByaW50bG4oIlxuLS1Lbm93biBkZXZpY2VzLS0iKTsKICAgICAgICAgZm9yIChTdHJpbmcgYWRkcmVzcyA6IG1EZXZpY2VQcm9wZXJ0aWVzLmtleVNldCgpKSB7CkBAIC0yMDM0LDI0ICsyNDgyLDQ4IEBACiAgICAgICAgIC8vIFJhdGhlciBub3QgZG8gdGhpcyBmcm9tIGhlcmUsIGJ1dCBuby13aGVyZSBlbHNlIGFuZCBJIG5lZWQgdGhpcwogICAgICAgICAvLyBkdW1wCiAgICAgICAgIHB3LnByaW50bG4oIlxuLS1IZWFkc2V0IFNlcnZpY2UtLSIpOwotICAgICAgICBzd2l0Y2ggKGhlYWRzZXQuZ2V0U3RhdGUoaGVhZHNldC5nZXRDdXJyZW50SGVhZHNldCgpKSkgewotICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgcHcucHJpbnRsbigiZ2V0U3RhdGUoKSA9IFNUQVRFX0RJU0NPTk5FQ1RFRCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgcHcucHJpbnRsbigiZ2V0U3RhdGUoKSA9IFNUQVRFX0NPTk5FQ1RJTkciKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQ09OTkVDVEVEOgotICAgICAgICAgICAgcHcucHJpbnRsbigiZ2V0U3RhdGUoKSA9IFNUQVRFX0NPTk5FQ1RFRCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9FUlJPUjoKLSAgICAgICAgICAgIHB3LnByaW50bG4oImdldFN0YXRlKCkgPSBTVEFURV9FUlJPUiIpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChtQmx1ZXRvb3RoSGVhZHNldCAhPSBudWxsKSB7CisgICAgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGRldmljZVNldCA9IG1CbHVldG9vdGhIZWFkc2V0LmdldENvbm5lY3RlZERldmljZXMoKTsKKyAgICAgICAgICAgaWYgKGRldmljZVNldC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICBwdy5wcmludGxuKCJcbi0tTm8gaGVhZHNldHMgY29ubmVjdGVkLS0iKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gKEJsdWV0b290aERldmljZSkgZGV2aWNlU2V0LnRvQXJyYXkoKVswXTsKKworICAgICAgICAgICAgc3dpdGNoIChtQmx1ZXRvb3RoSGVhZHNldC5nZXRDb25uZWN0aW9uU3RhdGUoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oImdldENvbm5lY3Rpb25TdGF0ZSgpID0gU1RBVEVfRElTQ09OTkVDVEVEIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNUSU5HOgorICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCJnZXRDb25uZWN0aW9uU3RhdGUoKSA9IFNUQVRFX0NPTk5FQ1RJTkciKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiZ2V0Q29ubmVjdGlvblN0YXRlKCkgPSBTVEFURV9DT05ORUNURUQiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0RJU0NPTk5FQ1RJTkc6CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oImdldENvbm5lY3Rpb25TdGF0ZSgpID0gU1RBVEVfRElTQ09OTkVDVElORyIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQVVESU9fQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCJnZXRDb25uZWN0aW9uU3RhdGUoKSA9IFNUQVRFX0FVRElPX0NPTk5FQ1RFRCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGV2aWNlU2V0LmNsZWFyKCk7CisgICAgICAgICAgICBkZXZpY2VTZXQgPSBtQmx1ZXRvb3RoSGVhZHNldC5nZXREZXZpY2VzTWF0Y2hpbmdDb25uZWN0aW9uU3RhdGVzKG5ldyBpbnRbXSB7CisgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCwgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUR9KTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIlxuLS1Db25uZWN0ZWQgYW5kIERpc2Nvbm5lY3RlZCBIZWFkc2V0cyIpOworICAgICAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2OiBkZXZpY2VTZXQpIHsKKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKGRldmljZSk7CisgICAgICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhIZWFkc2V0LmlzQXVkaW9Db25uZWN0ZWQoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCJTQ08gYXVkaW8gY29ubmVjdGVkIHRvIGRldmljZToiICsgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB3LnByaW50bG4oIlxuZ2V0Q3VycmVudEhlYWRzZXQoKSA9ICIgKyBkZXZpY2UpOworICAgICAgICAgICAgcHcucHJpbnRsbigiZ2V0QmF0dGVyeVVzYWdlSGludCgpID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhIZWFkc2V0LmdldEJhdHRlcnlVc2FnZUhpbnQoZGV2aWNlKSk7CisgICAgICAgICAgICBtQWRhcHRlci5jbG9zZVByb2ZpbGVQcm94eShCbHVldG9vdGhQcm9maWxlLkhFQURTRVQsIG1CbHVldG9vdGhIZWFkc2V0KTsKICAgICAgICAgfQogCi0gICAgICAgIHB3LnByaW50bG4oIlxuZ2V0Q3VycmVudEhlYWRzZXQoKSA9ICIgKyBoZWFkc2V0LmdldEN1cnJlbnRIZWFkc2V0KCkpOwotICAgICAgICBwdy5wcmludGxuKCJnZXRCYXR0ZXJ5VXNhZ2VIaW50KCkgPSAiICsgaGVhZHNldC5nZXRCYXR0ZXJ5VXNhZ2VIaW50KCkpOwotICAgICAgICBoZWFkc2V0LmNsb3NlKCk7CiAgICAgICAgIHB3LnByaW50bG4oIlxuLS1BcHBsaWNhdGlvbiBTZXJ2aWNlIFJlY29yZHMtLSIpOwogICAgICAgICBmb3IgKEludGVnZXIgaGFuZGxlIDogbVNlcnZpY2VSZWNvcmRUb1BpZC5rZXlTZXQoKSkgewogICAgICAgICAgICAgSW50ZWdlciBwaWQgPSBtU2VydmljZVJlY29yZFRvUGlkLmdldChoYW5kbGUpOwpAQCAtMjA1OSw2ICsyNTMxLDE2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIEJsdWV0b290aFByb2ZpbGUuU2VydmljZUxpc3RlbmVyIG1CbHVldG9vdGhQcm9maWxlU2VydmljZUxpc3RlbmVyID0KKyAgICAgICAgbmV3IEJsdWV0b290aFByb2ZpbGUuU2VydmljZUxpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoaW50IHByb2ZpbGUsIEJsdWV0b290aFByb2ZpbGUgcHJveHkpIHsKKyAgICAgICAgICAgIG1CbHVldG9vdGhIZWFkc2V0ID0gKEJsdWV0b290aEhlYWRzZXQpIHByb3h5OworICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKGludCBwcm9maWxlKSB7CisgICAgICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9OworCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgaW50IGJsdWV6U3RyaW5nVG9TY2FuTW9kZShib29sZWFuIHBhaXJhYmxlLCBib29sZWFuIGRpc2NvdmVyYWJsZSkgewogICAgICAgICBpZiAocGFpcmFibGUgJiYgZGlzY292ZXJhYmxlKQogICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aEFkYXB0ZXIuU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0RJU0NPVkVSQUJMRTsKQEAgLTIxMTgsNiArMjYwMCw4IEBACiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gY29ubmVjdEhlYWRzZXQoU3RyaW5nIGFkZHJlc3MpIHsKKyAgICAgICAgaWYgKGdldEJvbmRTdGF0ZShhZGRyZXNzKSAhPSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQpIHJldHVybiBmYWxzZTsKKwogICAgICAgICBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUgc3RhdGUgPSBtRGV2aWNlUHJvZmlsZVN0YXRlLmdldChhZGRyZXNzKTsKICAgICAgICAgaWYgKHN0YXRlICE9IG51bGwpIHsKICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoKTsKQEAgLTIxMzAsNiArMjYxNCw4IEBACiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdEhlYWRzZXQoU3RyaW5nIGFkZHJlc3MpIHsKKyAgICAgICAgaWYgKGdldEJvbmRTdGF0ZShhZGRyZXNzKSAhPSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQpIHJldHVybiBmYWxzZTsKKwogICAgICAgICBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUgc3RhdGUgPSBtRGV2aWNlUHJvZmlsZVN0YXRlLmdldChhZGRyZXNzKTsKICAgICAgICAgaWYgKHN0YXRlICE9IG51bGwpIHsKICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoKTsKQEAgLTIxNDIsNiArMjYyOCw4IEBACiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gY29ubmVjdFNpbmsoU3RyaW5nIGFkZHJlc3MpIHsKKyAgICAgICAgaWYgKGdldEJvbmRTdGF0ZShhZGRyZXNzKSAhPSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQpIHJldHVybiBmYWxzZTsKKwogICAgICAgICBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUgc3RhdGUgPSBtRGV2aWNlUHJvZmlsZVN0YXRlLmdldChhZGRyZXNzKTsKICAgICAgICAgaWYgKHN0YXRlICE9IG51bGwpIHsKICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoKTsKQEAgLTIxNTQsNiArMjY0Miw4IEBACiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdFNpbmsoU3RyaW5nIGFkZHJlc3MpIHsKKyAgICAgICAgaWYgKGdldEJvbmRTdGF0ZShhZGRyZXNzKSAhPSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQpIHJldHVybiBmYWxzZTsKKwogICAgICAgICBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUgc3RhdGUgPSBtRGV2aWNlUHJvZmlsZVN0YXRlLmdldChhZGRyZXNzKTsKICAgICAgICAgaWYgKHN0YXRlICE9IG51bGwpIHsKICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoKTsKQEAgLTIyNzcsNCArMjc2NywxMCBAQAogICAgICAgICAgICAgc2hvcnQgY2hhbm5lbCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiByZW1vdmVTZXJ2aWNlUmVjb3JkTmF0aXZlKGludCBoYW5kbGUpOwogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gc2V0TGlua1RpbWVvdXROYXRpdmUoU3RyaW5nIHBhdGgsIGludCBudW1fc2xvdHMpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gY29ubmVjdElucHV0RGV2aWNlTmF0aXZlKFN0cmluZyBwYXRoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZU5hdGl2ZShTdHJpbmcgcGF0aCk7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHNldEJsdWV0b290aFRldGhlcmluZ05hdGl2ZShib29sZWFuIHZhbHVlLCBTdHJpbmcgbmFwLCBTdHJpbmcgYnJpZGdlKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGNvbm5lY3RQYW5EZXZpY2VOYXRpdmUoU3RyaW5nIHBhdGgsIFN0cmluZyBzcmNSb2xlLCBTdHJpbmcgZHN0Um9sZSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBkaXNjb25uZWN0UGFuRGV2aWNlTmF0aXZlKFN0cmluZyBwYXRoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC9TcGVlY2hSZWNvZ25pemVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvU3BlZWNoUmVjb2duaXplci5qYXZhCmluZGV4IDhmYTBkNTkuLmNkNzNiYTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC9TcGVlY2hSZWNvZ25pemVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL1NwZWVjaFJlY29nbml6ZXIuamF2YQpAQCAtNTAsNyArNTAsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3BlZWNoUmVjb2duaXplciI7CiAKICAgICAvKioKLSAgICAgKiBVc2VkIHRvIHJldHJpZXZlIGFuIHtAY29kZSBBcnJheUxpc3QmbHQ7U3RyaW5nJmd0O30gZnJvbSB0aGUge0BsaW5rIEJ1bmRsZX0gcGFzc2VkIHRvIHRoZQorICAgICAqIFVzZWQgdG8gcmV0cmlldmUgYW4ge0Bjb2RlIEFycmF5TGlzdDxTdHJpbmc+fSBmcm9tIHRoZSB7QGxpbmsgQnVuZGxlfSBwYXNzZWQgdG8gdGhlCiAgICAgICoge0BsaW5rIFJlY29nbml0aW9uTGlzdGVuZXIjb25SZXN1bHRzKEJ1bmRsZSl9IGFuZAogICAgICAqIHtAbGluayBSZWNvZ25pdGlvbkxpc3RlbmVyI29uUGFydGlhbFJlc3VsdHMoQnVuZGxlKX0gbWV0aG9kcy4gVGhlc2Ugc3RyaW5ncyBhcmUgdGhlIHBvc3NpYmxlCiAgICAgICogcmVjb2duaXRpb24gcmVzdWx0cywgd2hlcmUgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIG1vc3QgbGlrZWx5IGNhbmRpZGF0ZS4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQW5kcm9pZEJpZGkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQW5kcm9pZEJpZGkuamF2YQppbmRleCBlNGY5MzRlLi5lYWNkNDBkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0FuZHJvaWRCaWRpLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9BbmRyb2lkQmlkaS5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCitpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dC5EaXJlY3Rpb25zOworCiAvKioKICAqIEFjY2VzcyB0aGUgSUNVIGJpZGkgaW1wbGVtZW50YXRpb24uCiAgKiBAaGlkZQpAQCAtNDQsNSArNDYsMTMyIEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyBydW4gZGlyZWN0aW9uIGluZm9ybWF0aW9uIGZvciBhIGxpbmUgd2l0aGluIGEgcGFyYWdyYXBoLgorICAgICAqCisgICAgICogQHBhcmFtIGRpciBiYXNlIGxpbmUgZGlyZWN0aW9uLCBlaXRoZXIgTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hUIG9yCisgICAgICogICAgIExheW91dC5ESVJfUklHSFRfVE9fTEVGVAorICAgICAqIEBwYXJhbSBsZXZlbHMgbGV2ZWxzIGFzIHJldHVybmVkIGZyb20ge0BsaW5rICNiaWRpfQorICAgICAqIEBwYXJhbSBsc3RhcnQgc3RhcnQgb2YgdGhlIGxpbmUgaW4gdGhlIGxldmVscyBhcnJheQorICAgICAqIEBwYXJhbSBjaGFycyB0aGUgY2hhcmFjdGVyIGFycmF5ICh1c2VkIHRvIGRldGVybWluZSB3aGl0ZXNwYWNlKQorICAgICAqIEBwYXJhbSBjc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIGluIHRoZSBjaGFycyBhcnJheQorICAgICAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiB0aGUgbGluZQorICAgICAqIEByZXR1cm4gdGhlIGRpcmVjdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERpcmVjdGlvbnMgZGlyZWN0aW9ucyhpbnQgZGlyLCBieXRlW10gbGV2ZWxzLCBpbnQgbHN0YXJ0LAorICAgICAgICAgICAgY2hhcltdIGNoYXJzLCBpbnQgY3N0YXJ0LCBpbnQgbGVuKSB7CisKKyAgICAgICAgaW50IGJhc2VMZXZlbCA9IGRpciA9PSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQgPyAwIDogMTsKKyAgICAgICAgaW50IGN1ckxldmVsID0gbGV2ZWxzW2xzdGFydF07CisgICAgICAgIGludCBtaW5MZXZlbCA9IGN1ckxldmVsOworICAgICAgICBpbnQgcnVuQ291bnQgPSAxOworICAgICAgICBmb3IgKGludCBpID0gbHN0YXJ0ICsgMSwgZSA9IGxzdGFydCArIGxlbjsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgaW50IGxldmVsID0gbGV2ZWxzW2ldOworICAgICAgICAgICAgaWYgKGxldmVsICE9IGN1ckxldmVsKSB7CisgICAgICAgICAgICAgICAgY3VyTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICArK3J1bkNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIGZpbmFsIHJ1biBmb3IgdHJhaWxpbmcgY291bnRlci1kaXJlY3Rpb25hbCB3aGl0ZXNwYWNlCisgICAgICAgIGludCB2aXNMZW4gPSBsZW47CisgICAgICAgIGlmICgoY3VyTGV2ZWwgJiAxKSAhPSAoYmFzZUxldmVsICYgMSkpIHsKKyAgICAgICAgICAgIC8vIGxvb2sgZm9yIHZpc2libGUgZW5kCisgICAgICAgICAgICB3aGlsZSAoLS12aXNMZW4gPj0gMCkgeworICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBjaGFyc1tjc3RhcnQgKyB2aXNMZW5dOworCisgICAgICAgICAgICAgICAgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgLS12aXNMZW47CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnICcgJiYgY2ggIT0gJ1x0JykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK3Zpc0xlbjsKKyAgICAgICAgICAgIGlmICh2aXNMZW4gIT0gbGVuKSB7CisgICAgICAgICAgICAgICAgKytydW5Db3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChydW5Db3VudCA9PSAxICYmIG1pbkxldmVsID09IGJhc2VMZXZlbCkgeworICAgICAgICAgICAgLy8gd2UncmUgZG9uZSwgb25seSBvbmUgcnVuIG9uIHRoaXMgbGluZQorICAgICAgICAgICAgaWYgKChtaW5MZXZlbCAmIDEpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTGF5b3V0LkRJUlNfQUxMX1JJR0hUX1RPX0xFRlQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTGF5b3V0LkRJUlNfQUxMX0xFRlRfVE9fUklHSFQ7CisgICAgICAgIH0KKworICAgICAgICBpbnRbXSBsZCA9IG5ldyBpbnRbcnVuQ291bnQgKiAyXTsKKyAgICAgICAgaW50IG1heExldmVsID0gbWluTGV2ZWw7CisgICAgICAgIGludCBsZXZlbEJpdHMgPSBtaW5MZXZlbCA8PCBMYXlvdXQuUlVOX0xFVkVMX1NISUZUOworICAgICAgICB7CisgICAgICAgICAgICAvLyBTdGFydCBvZiBmaXJzdCBwYWlyIGlzIGFsd2F5cyAwLCB3ZSB3cml0ZQorICAgICAgICAgICAgLy8gbGVuZ3RoIHRoZW4gc3RhcnQgYXQgZWFjaCBuZXcgcnVuLCBhbmQgdGhlCisgICAgICAgICAgICAvLyBsYXN0IHJ1biBsZW5ndGggYWZ0ZXIgd2UncmUgZG9uZS4KKyAgICAgICAgICAgIGludCBuID0gMTsKKyAgICAgICAgICAgIGludCBwcmV2ID0gbHN0YXJ0OworICAgICAgICAgICAgY3VyTGV2ZWwgPSBtaW5MZXZlbDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBsc3RhcnQsIGUgPSBsc3RhcnQgKyB2aXNMZW47IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGV2ZWwgPSBsZXZlbHNbaV07CisgICAgICAgICAgICAgICAgaWYgKGxldmVsICE9IGN1ckxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgIGN1ckxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCA+IG1heExldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxldmVsIDwgbWluTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbkxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gWFhYIGlnbm9yZSBydW4gbGVuZ3RoIGxpbWl0IG9mIDJeUlVOX0xFVkVMX1NISUZUCisgICAgICAgICAgICAgICAgICAgIGxkW24rK10gPSAoaSAtIHByZXYpIHwgbGV2ZWxCaXRzOworICAgICAgICAgICAgICAgICAgICBsZFtuKytdID0gaSAtIGxzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxCaXRzID0gY3VyTGV2ZWwgPDwgTGF5b3V0LlJVTl9MRVZFTF9TSElGVDsKKyAgICAgICAgICAgICAgICAgICAgcHJldiA9IGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGRbbl0gPSAobHN0YXJ0ICsgdmlzTGVuIC0gcHJldikgfCBsZXZlbEJpdHM7CisgICAgICAgICAgICBpZiAodmlzTGVuIDwgbGVuKSB7CisgICAgICAgICAgICAgICAgbGRbKytuXSA9IHZpc0xlbjsKKyAgICAgICAgICAgICAgICBsZFsrK25dID0gKGxlbiAtIHZpc0xlbikgfCAoYmFzZUxldmVsIDw8IExheW91dC5SVU5fTEVWRUxfU0hJRlQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2VlIGlmIHdlIG5lZWQgdG8gc3dhcCBhbnkgcnVucy4KKyAgICAgICAgLy8gSWYgdGhlIG1pbiBsZXZlbCBydW4gZGlyZWN0aW9uIGRvZXNuJ3QgbWF0Y2ggdGhlIGJhc2UKKyAgICAgICAgLy8gZGlyZWN0aW9uLCB3ZSBhbHdheXMgbmVlZCB0byBzd2FwIChhdCB0aGlzIHBvaW50CisgICAgICAgIC8vIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSBydW4pLgorICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGRvbid0IG5lZWQgdG8gc3dhcCB0aGUgbG93ZXN0IGxldmVsLgorICAgICAgICAvLyBTaW5jZSB0aGVyZSBhcmUgbm8gbG9naWNhbGx5IGFkamFjZW50IHJ1bnMgYXQgdGhlIHNhbWUKKyAgICAgICAgLy8gbGV2ZWwsIGlmIHRoZSBtYXggbGV2ZWwgaXMgdGhlIHNhbWUgYXMgdGhlIChuZXcpIG1pbgorICAgICAgICAvLyBsZXZlbCwgd2UgaGF2ZSBhIHNlcmllcyBvZiBhbHRlcm5hdGluZyBsZXZlbHMgdGhhdAorICAgICAgICAvLyBpcyBhbHJlYWR5IGluIG9yZGVyLCBzbyB0aGVyZSdzIG5vIG1vcmUgdG8gZG8uCisgICAgICAgIC8vCisgICAgICAgIGJvb2xlYW4gc3dhcDsKKyAgICAgICAgaWYgKChtaW5MZXZlbCAmIDEpID09IGJhc2VMZXZlbCkgeworICAgICAgICAgICAgbWluTGV2ZWwgKz0gMTsKKyAgICAgICAgICAgIHN3YXAgPSBtYXhMZXZlbCA+IG1pbkxldmVsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dhcCA9IHJ1bkNvdW50ID4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3dhcCkgeworICAgICAgICAgICAgZm9yIChpbnQgbGV2ZWwgPSBtYXhMZXZlbCAtIDE7IGxldmVsID49IG1pbkxldmVsOyAtLWxldmVsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZC5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWxzW2xkW2ldXSA+PSBsZXZlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGUgPSBpICsgMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChlIDwgbGQubGVuZ3RoICYmIGxldmVsc1tsZFtlXV0gPj0gbGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBsb3cgPSBpLCBoaSA9IGUgLSAyOyBsb3cgPCBoaTsgbG93ICs9IDIsIGhpIC09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IGxkW2xvd107IGxkW2xvd10gPSBsZFtoaV07IGxkW2hpXSA9IHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGxkW2xvdysxXTsgbGRbbG93KzFdID0gbGRbaGkrMV07IGxkW2hpKzFdID0geDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlICsgMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IERpcmVjdGlvbnMobGQpOworICAgIH0KKwogICAgIHByaXZhdGUgbmF0aXZlIHN0YXRpYyBpbnQgcnVuQmlkaShpbnQgZGlyLCBjaGFyW10gY2hzLCBieXRlW10gY2hJbmZvLCBpbnQgbiwgYm9vbGVhbiBoYXZlSW5mbyk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9Cb3JpbmdMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQm9yaW5nTGF5b3V0LmphdmEKaW5kZXggOTQ0ZjczNS4uOTMwOWIwNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9Cb3JpbmdMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0JvcmluZ0xheW91dC5qYXZhCkBAIC0yMDgsMTEgKzIwOCwxMSBAQAogICAgICAgICAgICAgICogd2lkdGggYmVjYXVzZSB0aGUgd2lkdGggdGhhdCB3YXMgcGFzc2VkIGluIHdhcyBmb3IgdGhlCiAgICAgICAgICAgICAgKiBmdWxsIHRleHQsIG5vdCB0aGUgZWxsaXBzaXplZCBmb3JtLgogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNUZW1wKSB7Ci0gICAgICAgICAgICAgICAgbU1heCA9IChpbnQpIChGbG9hdE1hdGguY2VpbChTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHNUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLCAwLCBzb3VyY2UubGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKSkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgVGV4dExpbmUgbGluZSA9IFRleHRMaW5lLm9idGFpbigpOworICAgICAgICAgICAgbGluZS5zZXQocGFpbnQsIHNvdXJjZSwgMCwgc291cmNlLmxlbmd0aCgpLCBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQsCisgICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJTX0FMTF9MRUZUX1RPX1JJR0hULCBmYWxzZSwgbnVsbCk7CisgICAgICAgICAgICBtTWF4ID0gKGludCkgRmxvYXRNYXRoLmNlaWwobGluZS5tZXRyaWNzKG51bGwpKTsKKyAgICAgICAgICAgIFRleHRMaW5lLnJlY3ljbGUobGluZSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaW5jbHVkZXBhZCkgewpAQCAtMjc2LDE0ICsyNzYsMTMgQEAKICAgICAgICAgICAgIGlmIChmbSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgZm0gPSBuZXcgTWV0cmljcygpOwogICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgaW50IHdpZDsKIAotICAgICAgICAgICAgc3luY2hyb25pemVkIChzVGVtcCkgewotICAgICAgICAgICAgICAgIHdpZCA9IChpbnQpIChGbG9hdE1hdGguY2VpbChTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHNUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSwgZm0pKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmbS53aWR0aCA9IHdpZDsKKyAgICAgICAgICAgIFRleHRMaW5lIGxpbmUgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgICAgIGxpbmUuc2V0KHBhaW50LCB0ZXh0LCAwLCB0ZXh0Lmxlbmd0aCgpLCBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQsCisgICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJTX0FMTF9MRUZUX1RPX1JJR0hULCBmYWxzZSwgbnVsbCk7CisgICAgICAgICAgICBmbS53aWR0aCA9IChpbnQpIEZsb2F0TWF0aC5jZWlsKGxpbmUubWV0cmljcyhmbSkpOworICAgICAgICAgICAgVGV4dExpbmUucmVjeWNsZShsaW5lKTsKKwogICAgICAgICAgICAgcmV0dXJuIGZtOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0zODksNyArMzg4LDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWV0cmljcyBleHRlbmRzIFBhaW50LkZvbnRNZXRyaWNzSW50IHsKICAgICAgICAgcHVibGljIGludCB3aWR0aDsKLSAgICAgICAgCisKICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIgd2lkdGg9IiArIHdpZHRoOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0NsaXBib2FyZE1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhCmluZGV4IDUyMDM5YWYuLjBiMjM5Y2YgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhCkBAIC0xNiw3MyArMTYsMjYgQEAKIAogcGFja2FnZSBhbmRyb2lkLnRleHQ7CiAKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQogLyoqCi0gKiBJbnRlcmZhY2UgdG8gdGhlIGNsaXBib2FyZCBzZXJ2aWNlLCBmb3IgcGxhY2luZyBhbmQgcmV0cmlldmluZyB0ZXh0IGluCi0gKiB0aGUgZ2xvYmFsIGNsaXBib2FyZC4KLSAqCi0gKiA8cD4KLSAqIFlvdSBkbyBub3QgaW5zdGFudGlhdGUgdGhpcyBjbGFzcyBkaXJlY3RseTsgaW5zdGVhZCwgcmV0cmlldmUgaXQgdGhyb3VnaAotICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2dldFN5c3RlbVNlcnZpY2V9LgotICoKLSAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjZ2V0U3lzdGVtU2VydmljZQorICogQGRlcHJlY2F0ZWQgT2xkIHRleHQtb25seSBpbnRlcmFjZSB0byB0aGUgY2xpcGJvYXJkLiAgU2VlCisgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNsaXBib2FyZE1hbmFnZXJ9IGZvciB0aGUgbW9kZXJuIEFQSS4KICAqLwotcHVibGljIGNsYXNzIENsaXBib2FyZE1hbmFnZXIgewotICAgIHByaXZhdGUgc3RhdGljIElDbGlwYm9hcmQgc1NlcnZpY2U7Ci0KLSAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBJQ2xpcGJvYXJkIGdldFNlcnZpY2UoKSB7Ci0gICAgICAgIGlmIChzU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gc1NlcnZpY2U7Ci0gICAgICAgIH0KLSAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgiY2xpcGJvYXJkIik7Ci0gICAgICAgIHNTZXJ2aWNlID0gSUNsaXBib2FyZC5TdHViLmFzSW50ZXJmYWNlKGIpOwotICAgICAgICByZXR1cm4gc1NlcnZpY2U7Ci0gICAgfQotCi0gICAgLyoqIHtAaGlkZX0gKi8KLSAgICBwdWJsaWMgQ2xpcGJvYXJkTWFuYWdlcihDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCitARGVwcmVjYXRlZAorcHVibGljIGFic3RyYWN0IGNsYXNzIENsaXBib2FyZE1hbmFnZXIgewogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHRleHQgb24gdGhlIGNsaXBib2FyZC4gIEl0IHdpbGwgZXZlbnR1YWxseSBiZSBwb3NzaWJsZQogICAgICAqIHRvIHN0b3JlIHR5cGVzIG90aGVyIHRoYW4gdGV4dCB0b28sIGluIHdoaWNoIGNhc2UgdGhpcyB3aWxsIHJldHVybgogICAgICAqIG51bGwgaWYgdGhlIHR5cGUgY2Fubm90IGJlIGNvZXJjZWQgdG8gdGV4dC4KICAgICAgKi8KLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRleHQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U2VydmljZSgpLmdldENsaXBib2FyZFRleHQoKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQorICAgIHB1YmxpYyBhYnN0cmFjdCBDaGFyU2VxdWVuY2UgZ2V0VGV4dCgpOwogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgY29udGVudHMgb2YgdGhlIGNsaXBib2FyZCB0byB0aGUgc3BlY2lmaWVkIHRleHQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dChDaGFyU2VxdWVuY2UgdGV4dCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0U2VydmljZSgpLnNldENsaXBib2FyZFRleHQodGV4dCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICB9CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGV4dChDaGFyU2VxdWVuY2UgdGV4dCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNsaXBib2FyZCBjb250YWlucyB0ZXh0OyBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuaGFzQ2xpcGJvYXJkVGV4dCgpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQorICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc1RleHQoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvRHluYW1pY0xheW91dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9EeW5hbWljTGF5b3V0LmphdmEKaW5kZXggMTRlNTY1NS4uYjZhYTAzYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9EeW5hbWljTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9EeW5hbWljTGF5b3V0LmphdmEKQEAgLTMxMCw3ICszMTAsNiBAQAogCiAgICAgICAgIERpcmVjdGlvbnNbXSBvYmplY3RzID0gbmV3IERpcmVjdGlvbnNbMV07CiAKLQogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICAgICAgaW50c1tTVEFSVF0gPSByZWZsb3dlZC5nZXRMaW5lU3RhcnQoaSkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAocmVmbG93ZWQuZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGkpIDw8IERJUl9TSElGVCkgfApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9HcmFwaGljc09wZXJhdGlvbnMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvR3JhcGhpY3NPcGVyYXRpb25zLmphdmEKaW5kZXggYzNiZDBhZS4uZDQyNmQxMjQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvR3JhcGhpY3NPcGVyYXRpb25zLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9HcmFwaGljc09wZXJhdGlvbnMuamF2YQpAQCAtMzQsMTMgKzM0LDMzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcCk7CiAKICAgICAvKioKKyAgICAgKiBKdXN0IGxpa2Uge0BsaW5rIENhbnZhcyNkcmF3VGV4dFJ1bn0uCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHZvaWQgZHJhd1RleHRSdW4oQ2FudmFzIGMsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZmxhZ3MsIFBhaW50IHApOworCisgICAvKioKICAgICAgKiBKdXN0IGxpa2Uge0BsaW5rIFBhaW50I21lYXN1cmVUZXh0fS4KICAgICAgKi8KICAgICBmbG9hdCBtZWFzdXJlVGV4dChpbnQgc3RhcnQsIGludCBlbmQsIFBhaW50IHApOwogCi0KICAgICAvKioKICAgICAgKiBKdXN0IGxpa2Uge0BsaW5rIFBhaW50I2dldFRleHRXaWR0aHN9LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VGV4dFdpZHRocyhpbnQgc3RhcnQsIGludCBlbmQsIGZsb2F0W10gd2lkdGhzLCBQYWludCBwKTsKKworICAgIC8qKgorICAgICAqIEp1c3QgbGlrZSB7QGxpbmsgUGFpbnQjZ2V0VGV4dFJ1bkFkdmFuY2VzfS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlcyhpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLAorICAgICAgICAgICAgaW50IGZsYWdzLCBmbG9hdFtdIGFkdmFuY2VzLCBpbnQgYWR2YW5jZXNJbmRleCwgUGFpbnQgcGFpbnQpOworCisgICAgLyoqCisgICAgICogSnVzdCBsaWtlIHtAbGluayBQYWludCNnZXRUZXh0UnVuQ3Vyc29yfS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIGludCBnZXRUZXh0UnVuQ3Vyc29yKGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGludCBvZmZzZXQsCisgICAgICAgICAgICBpbnQgY3Vyc29yT3B0LCBQYWludCBwKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvSUNsaXBib2FyZC5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9JQ2xpcGJvYXJkLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZWI1YzguLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9JQ2xpcGJvYXJkLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC50ZXh0OwotCi0vKioKLSAqIFByb2dyYW1taW5nIGludGVyZmFjZSB0byB0aGUgY2xpcGJvYXJkLCB3aGljaCBhbGxvd3MgY29weWluZyBhbmQgcGFzdGluZwotICogYmV0d2VlbiBhcHBsaWNhdGlvbnMuCi0gKiB7QGhpZGV9Ci0gKi8KLWludGVyZmFjZSBJQ2xpcGJvYXJkIHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG9uIHRoZSBjbGlwYm9hcmQuICBJdCB3aWxsIGV2ZW50dWFsbHkgYmUgcG9zc2libGUKLSAgICAgKiB0byBzdG9yZSB0eXBlcyBvdGhlciB0aGFuIHRleHQgdG9vLCBpbiB3aGljaCBjYXNlIHRoaXMgd2lsbCByZXR1cm4KLSAgICAgKiBudWxsIGlmIHRoZSB0eXBlIGNhbm5vdCBiZSBjb2VyY2VkIHRvIHRleHQuCi0gICAgICovCi0gICAgQ2hhclNlcXVlbmNlIGdldENsaXBib2FyZFRleHQoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjbGlwYm9hcmQgdG8gdGhlIHNwZWNpZmllZCB0ZXh0LgotICAgICAqLwotICAgIHZvaWQgc2V0Q2xpcGJvYXJkVGV4dChDaGFyU2VxdWVuY2UgdGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNsaXBib2FyZCBjb250YWlucyB0ZXh0OyBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgYm9vbGVhbiBoYXNDbGlwYm9hcmRUZXh0KCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0xheW91dC5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNGUxOTdjZC4uNTRhYzkwNgotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0xheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTGF5b3V0LmphdmEKQEAgLTE2LDI5ICsxNiwzMyBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGV4dDsKIAotaW1wb3J0IGFuZHJvaWQuZW1vamkuRW1vamlGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLio7CitpbXBvcnQgYW5kcm9pZC5lbW9qaS5FbW9qaUZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5BbGlnbm1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5MZWFkaW5nTWFyZ2luU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTGluZUJhY2tncm91bmRTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5QYXJhZ3JhcGhTdHlsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5UYWJTdG9wU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKIC8qKgotICogQSBiYXNlIGNsYXNzIHRoYXQgbWFuYWdlcyB0ZXh0IGxheW91dCBpbiB2aXN1YWwgZWxlbWVudHMgb24gCi0gKiB0aGUgc2NyZWVuLiAKLSAqIDxwPkZvciB0ZXh0IHRoYXQgd2lsbCBiZSBlZGl0ZWQsIHVzZSBhIHtAbGluayBEeW5hbWljTGF5b3V0fSwgCi0gKiB3aGljaCB3aWxsIGJlIHVwZGF0ZWQgYXMgdGhlIHRleHQgY2hhbmdlcy4gIAorICogQSBiYXNlIGNsYXNzIHRoYXQgbWFuYWdlcyB0ZXh0IGxheW91dCBpbiB2aXN1YWwgZWxlbWVudHMgb24KKyAqIHRoZSBzY3JlZW4uCisgKiA8cD5Gb3IgdGV4dCB0aGF0IHdpbGwgYmUgZWRpdGVkLCB1c2UgYSB7QGxpbmsgRHluYW1pY0xheW91dH0sCisgKiB3aGljaCB3aWxsIGJlIHVwZGF0ZWQgYXMgdGhlIHRleHQgY2hhbmdlcy4KICAqIEZvciB0ZXh0IHRoYXQgd2lsbCBub3QgY2hhbmdlLCB1c2UgYSB7QGxpbmsgU3RhdGljTGF5b3V0fS4KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIExheW91dCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhcmFncmFwaFN0eWxlW10gTk9fUEFSQV9TUEFOUyA9CiAgICAgICAgIEFycmF5VXRpbHMuZW1wdHlBcnJheShQYXJhZ3JhcGhTdHlsZS5jbGFzcyk7CiAKQEAgLTU0LDkgKzU4LDcgQEAKICAgICAgICAgICAgIE1JTl9FTU9KSSA9IC0xOwogICAgICAgICAgICAgTUFYX0VNT0pJID0gLTE7CiAgICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBSZWN0RiBtRW1vamlSZWN0OworICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybiBob3cgd2lkZSBhIGxheW91dCBtdXN0IGJlIGluIG9yZGVyIHRvIGRpc3BsYXkgdGhlCkBAIC02Niw3ICs2OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50KSB7CiAgICAgICAgIHJldHVybiBnZXREZXNpcmVkV2lkdGgoc291cmNlLCAwLCBzb3VyY2UubGVuZ3RoKCksIHBhaW50KTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gaG93IHdpZGUgYSBsYXlvdXQgbXVzdCBiZSBpbiBvcmRlciB0byBkaXNwbGF5IHRoZQogICAgICAqIHNwZWNpZmllZCB0ZXh0IHNsaWNlIHdpdGggb25lIGxpbmUgcGVyIHBhcmFncmFwaC4KQEAgLTg1LDggKzg3LDcgQEAKICAgICAgICAgICAgICAgICBuZXh0ID0gZW5kOwogCiAgICAgICAgICAgICAvLyBub3RlLCBvbWl0cyB0cmFpbGluZyBwYXJhZ3JhcGggY2hhcgotICAgICAgICAgICAgZmxvYXQgdyA9IG1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLCBpLCBuZXh0LCBudWxsLCB0cnVlLCBudWxsKTsKKyAgICAgICAgICAgIGZsb2F0IHcgPSBtZWFzdXJlUGFyYShwYWludCwgd29ya1BhaW50LCBzb3VyY2UsIGksIG5leHQpOwogCiAgICAgICAgICAgICBpZiAodyA+IG5lZWQpCiAgICAgICAgICAgICAgICAgbmVlZCA9IHc7CkBAIC0xMTYsNiArMTE3LDE1IEBACiAgICAgICAgIGlmICh3aWR0aCA8IDApCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMYXlvdXQ6ICIgKyB3aWR0aCArICIgPCAwIik7CiAKKyAgICAgICAgLy8gRW5zdXJlIHBhaW50IGRvZXNuJ3QgaGF2ZSBiYXNlbGluZVNoaWZ0IHNldC4KKyAgICAgICAgLy8gV2hpbGUgbm9ybWFsbHkgd2UgZG9uJ3QgbW9kaWZ5IHRoZSBwYWludCB0aGUgdXNlciBwYXNzZWQgaW4sCisgICAgICAgIC8vIHdlIHdlcmUgYWxyZWFkeSBkb2luZyB0aGlzIGluIFN0eWxlZC5kcmF3VW5pZm9ybVJ1biB3aXRoIGJvdGgKKyAgICAgICAgLy8gYmFzZWxpbmVTaGlmdCBhbmQgYmdDb2xvci4gIFdlIHByb2JhYmx5IHNob3VsZCByZWV2YWx1YXRlIGJnQ29sb3IuCisgICAgICAgIGlmIChwYWludCAhPSBudWxsKSB7CisgICAgICAgICAgICBwYWludC5iZ0NvbG9yID0gMDsKKyAgICAgICAgICAgIHBhaW50LmJhc2VsaW5lU2hpZnQgPSAwOworICAgICAgICB9CisKICAgICAgICAgbVRleHQgPSB0ZXh0OwogICAgICAgICBtUGFpbnQgPSBwYWludDsKICAgICAgICAgbVdvcmtQYWludCA9IG5ldyBUZXh0UGFpbnQoKTsKQEAgLTE3NSw3ICsxODUsNiBAQAogICAgICAgICAgICAgZGJvdHRvbSA9IHNUZW1wUmVjdC5ib3R0b207CiAgICAgICAgIH0KIAotCiAgICAgICAgIGludCB0b3AgPSAwOwogICAgICAgICBpbnQgYm90dG9tID0gZ2V0TGluZVRvcChnZXRMaW5lQ291bnQoKSk7CiAKQEAgLTE4NSwyNiArMTk0LDI4IEBACiAgICAgICAgIGlmIChkYm90dG9tIDwgYm90dG9tKSB7CiAgICAgICAgICAgICBib3R0b20gPSBkYm90dG9tOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbnQgZmlyc3QgPSBnZXRMaW5lRm9yVmVydGljYWwodG9wKTsgCisKKyAgICAgICAgaW50IGZpcnN0ID0gZ2V0TGluZUZvclZlcnRpY2FsKHRvcCk7CiAgICAgICAgIGludCBsYXN0ID0gZ2V0TGluZUZvclZlcnRpY2FsKGJvdHRvbSk7Ci0gICAgICAgIAorCiAgICAgICAgIGludCBwcmV2aW91c0xpbmVCb3R0b20gPSBnZXRMaW5lVG9wKGZpcnN0KTsKICAgICAgICAgaW50IHByZXZpb3VzTGluZUVuZCA9IGdldExpbmVTdGFydChmaXJzdCk7Ci0gICAgICAgIAorCiAgICAgICAgIFRleHRQYWludCBwYWludCA9IG1QYWludDsKICAgICAgICAgQ2hhclNlcXVlbmNlIGJ1ZiA9IG1UZXh0OwogICAgICAgICBpbnQgd2lkdGggPSBtV2lkdGg7CiAgICAgICAgIGJvb2xlYW4gc3Bhbm5lZFRleHQgPSBtU3Bhbm5lZFRleHQ7CiAKICAgICAgICAgUGFyYWdyYXBoU3R5bGVbXSBzcGFucyA9IE5PX1BBUkFfU1BBTlM7Ci0gICAgICAgIGludCBzcGFuZW5kID0gMDsKKyAgICAgICAgaW50IHNwYW5FbmQgPSAwOwogICAgICAgICBpbnQgdGV4dExlbmd0aCA9IDA7CiAKICAgICAgICAgLy8gRmlyc3QsIGRyYXcgTGluZUJhY2tncm91bmRTcGFucy4KLSAgICAgICAgLy8gTGluZUJhY2tncm91bmRTcGFucyBrbm93IG5vdGhpbmcgYWJvdXQgdGhlIGFsaWdubWVudCBvciBkaXJlY3Rpb24gb2YKLSAgICAgICAgLy8gdGhlIGxheW91dCBvciBsaW5lLiAgWFhYOiBTaG91bGQgdGhleT8KKyAgICAgICAgLy8gTGluZUJhY2tncm91bmRTcGFucyBrbm93IG5vdGhpbmcgYWJvdXQgdGhlIGFsaWdubWVudCwgbWFyZ2lucywgb3IKKyAgICAgICAgLy8gZGlyZWN0aW9uIG9mIHRoZSBsYXlvdXQgb3IgbGluZS4gIFhYWDogU2hvdWxkIHRoZXk/CisgICAgICAgIC8vIFRoZXkgYXJlIGV2YWx1YXRlZCBhdCBlYWNoIGxpbmUuCiAgICAgICAgIGlmIChzcGFubmVkVGV4dCkgeworICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBidWY7CiAgICAgICAgICAgICB0ZXh0TGVuZ3RoID0gYnVmLmxlbmd0aCgpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0OyBpIDw9IGxhc3Q7IGkrKykgewogICAgICAgICAgICAgICAgIGludCBzdGFydCA9IHByZXZpb3VzTGluZUVuZDsKQEAgLTIxNiwxMiArMjI3LDE0IEBACiAgICAgICAgICAgICAgICAgcHJldmlvdXNMaW5lQm90dG9tID0gbGJvdHRvbTsKICAgICAgICAgICAgICAgICBpbnQgbGJhc2VsaW5lID0gbGJvdHRvbSAtIGdldExpbmVEZXNjZW50KGkpOwogCi0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IHNwYW5lbmQpIHsKLSAgICAgICAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIGJ1ZjsKLSAgICAgICAgICAgICAgICAgICBzcGFuZW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZUJhY2tncm91bmRTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICBzcGFucyA9IHNwLmdldFNwYW5zKHN0YXJ0LCBzcGFuZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZUJhY2tncm91bmRTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gc3BhbkVuZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBzaG91bGQgYmUgaW5mcmVxdWVudCwgc28gd2UnbGwgdXNlIHRoaXMgc28gdGhhdAorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIGFzIG9mdGVuLgorICAgICAgICAgICAgICAgICAgICBzcGFuRW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVCYWNrZ3JvdW5kU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIC8vIEFsbCBMaW5lQmFja2dyb3VuZFNwYW5zIG9uIGEgbGluZSBjb250cmlidXRlIHRvIGl0cworICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kLgorICAgICAgICAgICAgICAgICAgIHNwYW5zID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3AsIHN0YXJ0LCBlbmQsIExpbmVCYWNrZ3JvdW5kU3Bhbi5jbGFzcyk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBzcGFucy5sZW5ndGg7IG4rKykgewpAQCAtMjM0LDExICsyNDcsMTEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyByZXNldCB0byB0aGVpciBvcmlnaW5hbCB2YWx1ZXMKLSAgICAgICAgICAgIHNwYW5lbmQgPSAwOworICAgICAgICAgICAgc3BhbkVuZCA9IDA7CiAgICAgICAgICAgICBwcmV2aW91c0xpbmVCb3R0b20gPSBnZXRMaW5lVG9wKGZpcnN0KTsKICAgICAgICAgICAgIHByZXZpb3VzTGluZUVuZCA9IGdldExpbmVTdGFydChmaXJzdCk7CiAgICAgICAgICAgICBzcGFucyA9IE5PX1BBUkFfU1BBTlM7Ci0gICAgICAgIH0gCisgICAgICAgIH0KIAogICAgICAgICAvLyBUaGVyZSBjYW4gYmUgYSBoaWdobGlnaHQgZXZlbiB3aXRob3V0IHNwYW5zIGlmIHdlIGFyZSBkcmF3aW5nCiAgICAgICAgIC8vIGEgbm9uLXNwYW5uZWQgdHJhbnNmb3JtYXRpb24gb2YgYSBzcGFubmVkIGVkaXRpbmcgYnVmZmVyLgpAQCAtMjU1LDcgKzI2OCwxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgQWxpZ25tZW50IGFsaWduID0gbUFsaWdubWVudDsKLSAgICAgICAgCisgICAgICAgIFRhYlN0b3BzIHRhYlN0b3BzID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiB0YWJTdG9wc0lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgICAgICBUZXh0TGluZSB0bCA9IFRleHRMaW5lLm9idGFpbigpOworCiAgICAgICAgIC8vIE5leHQgZHJhdyB0aGUgbGluZXMsIG9uZSBhdCBhIHRpbWUuCiAgICAgICAgIC8vIHRoZSBiYXNlbGluZSBpcyB0aGUgdG9wIG9mIHRoZSBmb2xsb3dpbmcgbGluZSBtaW51cyB0aGUgY3VycmVudAogICAgICAgICAvLyBsaW5lJ3MgZGVzY2VudC4KQEAgLTI3MCwxOSArMjg3LDMwIEBACiAgICAgICAgICAgICBwcmV2aW91c0xpbmVCb3R0b20gPSBsYm90dG9tOwogICAgICAgICAgICAgaW50IGxiYXNlbGluZSA9IGxib3R0b20gLSBnZXRMaW5lRGVzY2VudChpKTsKIAotICAgICAgICAgICAgYm9vbGVhbiBpc0ZpcnN0UGFyYUxpbmUgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChzcGFubmVkVGV4dCkgeyAKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0gMCB8fCBidWYuY2hhckF0KHN0YXJ0IC0gMSkgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICBpc0ZpcnN0UGFyYUxpbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBOZXcgYmF0Y2ggb2YgcGFyYWdyYXBoIHN0eWxlcywgY29tcHV0ZSB0aGUgYWxpZ25tZW50LgotICAgICAgICAgICAgICAgIC8vIExhc3QgYWxpZ25tZW50IHN0eWxlIHdpbnMuCi0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IHNwYW5lbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBidWY7Ci0gICAgICAgICAgICAgICAgICAgIHNwYW5lbmQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oc3RhcnQsIHRleHRMZW5ndGgsCisgICAgICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGkpOworICAgICAgICAgICAgaW50IGxlZnQgPSAwOworICAgICAgICAgICAgaW50IHJpZ2h0ID0gbVdpZHRoOworCisgICAgICAgICAgICBpZiAoc3Bhbm5lZFRleHQpIHsKKyAgICAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIGJ1ZjsKKyAgICAgICAgICAgICAgICBib29sZWFuIGlzRmlyc3RQYXJhTGluZSA9IChzdGFydCA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuY2hhckF0KHN0YXJ0IC0gMSkgPT0gJ1xuJyk7CisKKyAgICAgICAgICAgICAgICAvLyBOZXcgYmF0Y2ggb2YgcGFyYWdyYXBoIHN0eWxlcywgY29sbGVjdCBpbnRvIHNwYW5zIGFycmF5LgorICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGFsaWdubWVudCwgbGFzdCBhbGlnbm1lbnQgc3R5bGUgd2lucy4KKyAgICAgICAgICAgICAgICAvLyBSZXNldCB0YWJTdG9wcywgd2UnbGwgcmVidWlsZCBpZiB3ZSBlbmNvdW50ZXIgYSBsaW5lIHdpdGgKKyAgICAgICAgICAgICAgICAvLyB0YWJzLgorICAgICAgICAgICAgICAgIC8vIFdlIGV4cGVjdCBwYXJhZ3JhcGggc3BhbnMgdG8gYmUgcmVsYXRpdmVseSBpbmZyZXF1ZW50LCB1c2UKKyAgICAgICAgICAgICAgICAvLyBzcGFuRW5kIHNvIHRoYXQgd2UgY2FuIGNoZWNrIGxlc3MgZnJlcXVlbnRseS4gIFNpbmNlCisgICAgICAgICAgICAgICAgLy8gcGFyYWdyYXBoIHN0eWxlcyBvdWdodCB0byBhcHBseSB0byBlbnRpcmUgcGFyYWdyYXBocywgd2UgY2FuCisgICAgICAgICAgICAgICAgLy8ganVzdCBjb2xsZWN0IHRoZSBvbmVzIHByZXNlbnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwYXJhZ3JhcGguCisgICAgICAgICAgICAgICAgLy8gSWYgc3BhbkVuZCBpcyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgcGFyYWdyYXBoLCB0aGF0J3Mgbm90CisgICAgICAgICAgICAgICAgLy8gb3VyIHByb2JsZW0uCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IHNwYW5FbmQgJiYgKGkgPT0gZmlyc3QgfHwgaXNGaXJzdFBhcmFMaW5lKSkgeworICAgICAgICAgICAgICAgICAgICBzcGFuRW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFncmFwaFN0eWxlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgc3BhbnMgPSBzcC5nZXRTcGFucyhzdGFydCwgc3BhbmVuZCwgUGFyYWdyYXBoU3R5bGUuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgc3BhbnMgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcCwgc3RhcnQsIHNwYW5FbmQsIFBhcmFncmFwaFN0eWxlLmNsYXNzKTsKKwogICAgICAgICAgICAgICAgICAgICBhbGlnbiA9IG1BbGlnbm1lbnQ7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSBzcGFucy5sZW5ndGgtMTsgbiA+PSAwOyBuLS0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuc1tuXSBpbnN0YW5jZW9mIEFsaWdubWVudFNwYW4pIHsKQEAgLTI5MCw0NSArMzE4LDQ5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24oaSk7Ci0gICAgICAgICAgICBpbnQgbGVmdCA9IDA7Ci0gICAgICAgICAgICBpbnQgcmlnaHQgPSBtV2lkdGg7CiAKLSAgICAgICAgICAgIC8vIERyYXcgYWxsIGxlYWRpbmcgbWFyZ2luIHNwYW5zLiAgQWRqdXN0IGxlZnQgb3IgcmlnaHQgYWNjb3JkaW5nCi0gICAgICAgICAgICAvLyB0byB0aGUgcGFyYWdyYXBoIGRpcmVjdGlvbiBvZiB0aGUgbGluZS4KLSAgICAgICAgICAgIGlmIChzcGFubmVkVGV4dCkgeworICAgICAgICAgICAgICAgICAgICB0YWJTdG9wc0lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBEcmF3IGFsbCBsZWFkaW5nIG1hcmdpbiBzcGFucy4gIEFkanVzdCBsZWZ0IG9yIHJpZ2h0IGFjY29yZGluZworICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uIG9mIHRoZSBsaW5lLgogICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBzcGFucy5sZW5ndGg7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBsZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbnNbbl0gaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3BhbikgewogICAgICAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4gbWFyZ2luID0gKExlYWRpbmdNYXJnaW5TcGFuKSBzcGFuc1tuXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlRmlyc3RMaW5lTWFyZ2luID0gaXNGaXJzdFBhcmFMaW5lOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmdpbiBpbnN0YW5jZW9mIExlYWRpbmdNYXJnaW5TcGFuMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9ICgoTGVhZGluZ01hcmdpblNwYW4yKSBtYXJnaW4pLmdldExlYWRpbmdNYXJnaW5MaW5lQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRMaW5lID0gZ2V0TGluZUZvck9mZnNldChzcC5nZXRTcGFuU3RhcnQobWFyZ2luKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlRmlyc3RMaW5lTWFyZ2luID0gaSA8IHN0YXJ0TGluZSArIGNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luLmRyYXdMZWFkaW5nTWFyZ2luKGMsIHBhaW50LCByaWdodCwgZGlyLCBsdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYmFzZWxpbmUsIGxib3R0b20sIGJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgaXNGaXJzdFBhcmFMaW5lLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgLT0gbWFyZ2luLmdldExlYWRpbmdNYXJnaW4oaXNGaXJzdFBhcmFMaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCAtPSBtYXJnaW4uZ2V0TGVhZGluZ01hcmdpbih1c2VGaXJzdExpbmVNYXJnaW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4uZHJhd0xlYWRpbmdNYXJnaW4oYywgcGFpbnQsIGxlZnQsIGRpciwgbHRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGJhc2VsaW5lLCBsYm90dG9tLCBidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIGlzRmlyc3RQYXJhTGluZSwgdGhpcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZU1hcmdpbiA9IGlzRmlyc3RQYXJhTGluZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFyZ2luIGluc3RhbmNlb2YgTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9ICgoTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yKW1hcmdpbikuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VNYXJnaW4gPSBjb3VudCA+IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKz0gbWFyZ2luLmdldExlYWRpbmdNYXJnaW4odXNlTWFyZ2luKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ICs9IG1hcmdpbi5nZXRMZWFkaW5nTWFyZ2luKHVzZUZpcnN0TGluZU1hcmdpbik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEFkanVzdCB0aGUgcG9pbnQgYXQgd2hpY2ggdG8gc3RhcnQgcmVuZGVyaW5nIGRlcGVuZGluZyBvbiB0aGUKLSAgICAgICAgICAgIC8vIGFsaWdubWVudCBvZiB0aGUgcGFyYWdyYXBoLgorICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJPckVtb2ppID0gZ2V0TGluZUNvbnRhaW5zVGFiKGkpOworICAgICAgICAgICAgLy8gQ2FuJ3QgdGVsbCBpZiB3ZSBoYXZlIHRhYnMgZm9yIHN1cmUsIGN1cnJlbnRseQorICAgICAgICAgICAgaWYgKGhhc1RhYk9yRW1vamkgJiYgIXRhYlN0b3BzSXNJbml0aWFsaXplZCkgeworICAgICAgICAgICAgICAgIGlmICh0YWJTdG9wcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzID0gbmV3IFRhYlN0b3BzKFRBQl9JTkNSRU1FTlQsIHNwYW5zKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0YWJTdG9wcy5yZXNldChUQUJfSU5DUkVNRU5ULCBzcGFucyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRhYlN0b3BzSXNJbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgaWYgKGFsaWduID09IEFsaWdubWVudC5BTElHTl9OT1JNQUwpIHsKICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUKSB7CkBAIC0zMzcsNDEgKzM2OSw4MCBAQAogICAgICAgICAgICAgICAgICAgICB4ID0gcmlnaHQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgbWF4ID0gKGludClnZXRMaW5lTWF4KGksIHNwYW5zLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaW50IG1heCA9IChpbnQpZ2V0TGluZUV4dGVudChpLCB0YWJTdG9wcywgZmFsc2UpOwogICAgICAgICAgICAgICAgIGlmIChhbGlnbiA9PSBBbGlnbm1lbnQuQUxJR05fT1BQT1NJVEUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGxlZnQgKyBtYXg7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHggPSByaWdodCAtIG1heDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFsaWdubWVudC5BTElHTl9DRU5URVIKLSAgICAgICAgICAgICAgICAgICAgbWF4ID0gbWF4ICYgfjE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBoYWxmID0gKHJpZ2h0IC0gbGVmdCAtIG1heCkgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHJpZ2h0IC0gaGFsZjsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHggPSBsZWZ0ICsgaGFsZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHggPSBsZWZ0IC0gbWF4OwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gQWxpZ25tZW50LkFMSUdOX0NFTlRFUgorICAgICAgICAgICAgICAgICAgICBtYXggPSBtYXggJiB+MTsKKyAgICAgICAgICAgICAgICAgICAgeCA9IChyaWdodCArIGxlZnQgLSBtYXgpID4+IDE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhpKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFiID0gZ2V0TGluZUNvbnRhaW5zVGFiKGkpOwogICAgICAgICAgICAgaWYgKGRpcmVjdGlvbnMgPT0gRElSU19BTExfTEVGVF9UT19SSUdIVCAmJgotICAgICAgICAgICAgICAgICAgICAhc3Bhbm5lZFRleHQgJiYgIWhhc1RhYikgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpOwotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChjKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICFzcGFubmVkVGV4dCAmJiAhaGFzVGFiT3JFbW9qaSkgewogICAgICAgICAgICAgICAgIC8vIFhYWDogYXNzdW1lcyB0aGVyZSdzIG5vdGhpbmcgYWRkaXRpb25hbCB0byBiZSBkb25lCiAgICAgICAgICAgICAgICAgYy5kcmF3VGV4dChidWYsIHN0YXJ0LCBlbmQsIHgsIGxiYXNlbGluZSwgcGFpbnQpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkcmF3VGV4dChjLCBidWYsIHN0YXJ0LCBlbmQsIGRpciwgZGlyZWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgeCwgbHRvcCwgbGJhc2VsaW5lLCBsYm90dG9tLCBwYWludCwgbVdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgaGFzVGFiLCBzcGFucyk7CisgICAgICAgICAgICAgICAgdGwuc2V0KHBhaW50LCBidWYsIHN0YXJ0LCBlbmQsIGRpciwgZGlyZWN0aW9ucywgaGFzVGFiT3JFbW9qaSwgdGFiU3RvcHMpOworICAgICAgICAgICAgICAgIHRsLmRyYXcoYywgeCwgbHRvcCwgbGJhc2VsaW5lLCBsYm90dG9tKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIFRleHRMaW5lLnJlY3ljbGUodGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGxpbmUsIGdpdmVuIHRoZSBsZWZ0IGFuZCByaWdodCBib3VuZHMKKyAgICAgKiBvZiB0aGUgbWFyZ2lucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIGluZGV4CisgICAgICogQHBhcmFtIGxlZnQgdGhlIGxlZnQgYm91bmRzICgwLCBvciBsZWFkaW5nIG1hcmdpbiBpZiBsdHIgcGFyYSkKKyAgICAgKiBAcGFyYW0gcmlnaHQgdGhlIHJpZ2h0IGJvdW5kcyAod2lkdGgsIG1pbnVzIGxlYWRpbmcgbWFyZ2luIGlmIHJ0bCBwYXJhKQorICAgICAqIEByZXR1cm4gdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBsaW5lICh0byByaWdodCBvZiBsaW5lIGlmIHJ0bCBwYXJhKQorICAgICAqLworICAgIHByaXZhdGUgaW50IGdldExpbmVTdGFydFBvcyhpbnQgbGluZSwgaW50IGxlZnQsIGludCByaWdodCkgeworICAgICAgICAvLyBBZGp1c3QgdGhlIHBvaW50IGF0IHdoaWNoIHRvIHN0YXJ0IHJlbmRlcmluZyBkZXBlbmRpbmcgb24gdGhlCisgICAgICAgIC8vIGFsaWdubWVudCBvZiB0aGUgcGFyYWdyYXBoLgorICAgICAgICBBbGlnbm1lbnQgYWxpZ24gPSBnZXRQYXJhZ3JhcGhBbGlnbm1lbnQobGluZSk7CisgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7CisKKyAgICAgICAgaW50IHg7CisgICAgICAgIGlmIChhbGlnbiA9PSBBbGlnbm1lbnQuQUxJR05fTk9STUFMKSB7CisgICAgICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUKSB7CisgICAgICAgICAgICAgICAgeCA9IGxlZnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHggPSByaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRhYlN0b3BzIHRhYlN0b3BzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChtU3Bhbm5lZFRleHQgJiYgZ2V0TGluZUNvbnRhaW5zVGFiKGxpbmUpKSB7CisgICAgICAgICAgICAgICAgU3Bhbm5lZCBzcGFubmVkID0gKFNwYW5uZWQpIG1UZXh0OworICAgICAgICAgICAgICAgIGludCBzdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKKyAgICAgICAgICAgICAgICBpbnQgc3BhbkVuZCA9IHNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCBzcGFubmVkLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIFRhYlN0b3BTcGFuW10gdGFiU3BhbnMgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcGFubmVkLCBzdGFydCwgc3BhbkVuZCwgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIGlmICh0YWJTcGFucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzID0gbmV3IFRhYlN0b3BzKFRBQl9JTkNSRU1FTlQsIHRhYlNwYW5zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbWF4ID0gKGludClnZXRMaW5lRXh0ZW50KGxpbmUsIHRhYlN0b3BzLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAoYWxpZ24gPT0gQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFKSB7CisgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCkgeworICAgICAgICAgICAgICAgICAgICB4ID0gcmlnaHQgLSBtYXg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IGxlZnQgLSBtYXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gQWxpZ25tZW50LkFMSUdOX0NFTlRFUgorICAgICAgICAgICAgICAgIG1heCA9IG1heCAmIH4xOworICAgICAgICAgICAgICAgIHggPSAobGVmdCArIHJpZ2h0IC0gbWF4KSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB4OwogICAgIH0KIAogICAgIC8qKgpAQCAtNDE3LDcgKzQ4OCw3IEBACiAKICAgICAgICAgbVdpZHRoID0gd2lkOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgdG90YWwgaGVpZ2h0IG9mIHRoaXMgbGF5b3V0LgogICAgICAqLwpAQCAtNDUwLDcgKzUyMSw3IEBACiAgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGluZXMgb2YgdGV4dCBpbiB0aGlzIGxheW91dC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldExpbmVDb3VudCgpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBiYXNlbGluZSBmb3IgdGhlIHNwZWNpZmllZCBsaW5lICgwJmhlbGxpcDtnZXRMaW5lQ291bnQoKSAtIDEpCiAgICAgICogSWYgYm91bmRzIGlzIG5vdCBudWxsLCByZXR1cm4gdGhlIHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSBleHRlbnRzCkBAIC01MjQsMTMgKzU5NSw5NSBAQAogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Qm90dG9tUGFkZGluZygpOwogCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBhdCBvZmZzZXQgYW5kIHRoZSBwcmVjZWRpbmcgY2hhcmFjdGVyCisgICAgICogYXJlIGF0IGRpZmZlcmVudCBydW4gbGV2ZWxzIChhbmQgdGh1cyB0aGVyZSdzIGEgc3BsaXQgY2FyZXQpLgorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhdCBhIGxldmVsIGJvdW5kYXJ5CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzTGV2ZWxCb3VuZGFyeShpbnQgb2Zmc2V0KSB7CisgICAgICAgIGludCBsaW5lID0gZ2V0TGluZUZvck9mZnNldChvZmZzZXQpOworICAgICAgICBEaXJlY3Rpb25zIGRpcnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKTsKKyAgICAgICAgaWYgKGRpcnMgPT0gRElSU19BTExfTEVGVF9UT19SSUdIVCB8fCBkaXJzID09IERJUlNfQUxMX1JJR0hUX1RPX0xFRlQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGludFtdIHJ1bnMgPSBkaXJzLm1EaXJlY3Rpb25zOworICAgICAgICBpbnQgbGluZVN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICBpbnQgbGluZUVuZCA9IGdldExpbmVFbmQobGluZSk7CisgICAgICAgIGlmIChvZmZzZXQgPT0gbGluZVN0YXJ0IHx8IG9mZnNldCA9PSBsaW5lRW5kKSB7CisgICAgICAgICAgICBpbnQgcGFyYUxldmVsID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpID09IDEgPyAwIDogMTsKKyAgICAgICAgICAgIGludCBydW5JbmRleCA9IG9mZnNldCA9PSBsaW5lU3RhcnQgPyAwIDogcnVucy5sZW5ndGggLSAyOworICAgICAgICAgICAgcmV0dXJuICgocnVuc1tydW5JbmRleCArIDFdID4+PiBSVU5fTEVWRUxfU0hJRlQpICYgUlVOX0xFVkVMX01BU0spICE9IHBhcmFMZXZlbDsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCAtPSBsaW5lU3RhcnQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVucy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgaWYgKG9mZnNldCA9PSBydW5zW2ldKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBwcmltYXJ5SXNUcmFpbGluZ1ByZXZpb3VzKGludCBvZmZzZXQpIHsKKyAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7CisgICAgICAgIGludCBsaW5lU3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgIGludCBsaW5lRW5kID0gZ2V0TGluZUVuZChsaW5lKTsKKyAgICAgICAgaW50W10gcnVucyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpLm1EaXJlY3Rpb25zOworCisgICAgICAgIGludCBsZXZlbEF0ID0gLTE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVucy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgaW50IHN0YXJ0ID0gbGluZVN0YXJ0ICsgcnVuc1tpXTsKKyAgICAgICAgICAgIGludCBsaW1pdCA9IHN0YXJ0ICsgKHJ1bnNbaSsxXSAmIFJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpZiAobGltaXQgPiBsaW5lRW5kKSB7CisgICAgICAgICAgICAgICAgbGltaXQgPSBsaW5lRW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBzdGFydCAmJiBvZmZzZXQgPCBsaW1pdCkgeworICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPiBzdGFydCkgeworICAgICAgICAgICAgICAgICAgICAvLyBQcmV2aW91cyBjaGFyYWN0ZXIgaXMgYXQgc2FtZSBsZXZlbCwgc28gZG9uJ3QgdXNlIHRyYWlsaW5nLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxldmVsQXQgPSAocnVuc1tpKzFdID4+PiBSVU5fTEVWRUxfU0hJRlQpICYgUlVOX0xFVkVMX01BU0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxldmVsQXQgPT0gLTEpIHsKKyAgICAgICAgICAgIC8vIE9mZnNldCB3YXMgbGltaXQgb2YgbGluZS4KKyAgICAgICAgICAgIGxldmVsQXQgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSkgPT0gMSA/IDAgOiAxOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXQgbGV2ZWwgYm91bmRhcnksIGNoZWNrIHByZXZpb3VzIGxldmVsLgorICAgICAgICBpbnQgbGV2ZWxCZWZvcmUgPSAtMTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSBsaW5lU3RhcnQpIHsKKyAgICAgICAgICAgIGxldmVsQmVmb3JlID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpID09IDEgPyAwIDogMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9mZnNldCAtPSAxOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gbGluZVN0YXJ0ICsgcnVuc1tpXTsKKyAgICAgICAgICAgICAgICBpbnQgbGltaXQgPSBzdGFydCArIChydW5zW2krMV0gJiBSVU5fTEVOR1RIX01BU0spOworICAgICAgICAgICAgICAgIGlmIChsaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBsaW5lRW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IHN0YXJ0ICYmIG9mZnNldCA8IGxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgIGxldmVsQmVmb3JlID0gKHJ1bnNbaSsxXSA+Pj4gUlVOX0xFVkVMX1NISUZUKSAmIFJVTl9MRVZFTF9NQVNLOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbGV2ZWxCZWZvcmUgPCBsZXZlbEF0OworICAgIH0KKwogICAgIC8qKgogICAgICAqIEdldCB0aGUgcHJpbWFyeSBob3Jpem9udGFsIHBvc2l0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHRleHQgb2Zmc2V0LgogICAgICAqIFRoaXMgaXMgdGhlIGxvY2F0aW9uIHdoZXJlIGEgbmV3IGNoYXJhY3RlciB3b3VsZCBiZSBpbnNlcnRlZCBpbgogICAgICAqIHRoZSBwYXJhZ3JhcGgncyBwcmltYXJ5IGRpcmVjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0UHJpbWFyeUhvcml6b250YWwoaW50IG9mZnNldCkgewotICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgYm9vbGVhbiB0cmFpbGluZyA9IHByaW1hcnlJc1RyYWlsaW5nUHJldmlvdXMob2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIGdldEhvcml6b250YWwob2Zmc2V0LCB0cmFpbGluZyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01MzksNjYgKzY5Miw0MiBAQAogICAgICAqIHRoZSBkaXJlY3Rpb24gb3RoZXIgdGhhbiB0aGUgcGFyYWdyYXBoJ3MgcHJpbWFyeSBkaXJlY3Rpb24uCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFNlY29uZGFyeUhvcml6b250YWwoaW50IG9mZnNldCkgewotICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsIHRydWUsIHRydWUpOworICAgICAgICBib29sZWFuIHRyYWlsaW5nID0gcHJpbWFyeUlzVHJhaWxpbmdQcmV2aW91cyhvZmZzZXQpOworICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsICF0cmFpbGluZyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBmbG9hdCBnZXRIb3Jpem9udGFsKGludCBvZmZzZXQsIGJvb2xlYW4gdHJhaWxpbmcsIGJvb2xlYW4gYWx0KSB7CisgICAgcHJpdmF0ZSBmbG9hdCBnZXRIb3Jpem9udGFsKGludCBvZmZzZXQsIGJvb2xlYW4gdHJhaWxpbmcpIHsKICAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7CiAKLSAgICAgICAgcmV0dXJuIGdldEhvcml6b250YWwob2Zmc2V0LCB0cmFpbGluZywgYWx0LCBsaW5lKTsKKyAgICAgICAgcmV0dXJuIGdldEhvcml6b250YWwob2Zmc2V0LCB0cmFpbGluZywgbGluZSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBmbG9hdCBnZXRIb3Jpem9udGFsKGludCBvZmZzZXQsIGJvb2xlYW4gdHJhaWxpbmcsIGJvb2xlYW4gYWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSkgeworICAgIHByaXZhdGUgZmxvYXQgZ2V0SG9yaXpvbnRhbChpbnQgb2Zmc2V0LCBib29sZWFuIHRyYWlsaW5nLCBpbnQgbGluZSkgewogICAgICAgICBpbnQgc3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7Ci0gICAgICAgIGludCBlbmQgPSBnZXRMaW5lVmlzaWJsZUVuZChsaW5lKTsKKyAgICAgICAgaW50IGVuZCA9IGdldExpbmVFbmQobGluZSk7CiAgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7Ci0gICAgICAgIGJvb2xlYW4gdGFiID0gZ2V0TGluZUNvbnRhaW5zVGFiKGxpbmUpOworICAgICAgICBib29sZWFuIGhhc1RhYk9yRW1vamkgPSBnZXRMaW5lQ29udGFpbnNUYWIobGluZSk7CiAgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9ucyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOwogCi0gICAgICAgIFRhYlN0b3BTcGFuW10gdGFicyA9IG51bGw7Ci0gICAgICAgIGlmICh0YWIgJiYgbVRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7Ci0gICAgICAgICAgICB0YWJzID0gKChTcGFubmVkKSBtVGV4dCkuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICBUYWJTdG9wcyB0YWJTdG9wcyA9IG51bGw7CisgICAgICAgIGlmIChoYXNUYWJPckVtb2ppICYmIG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgeworICAgICAgICAgICAgLy8gSnVzdCBjaGVja2luZyB0aGlzIGxpbmUgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLCB0YWJzIHNob3VsZCBiZQorICAgICAgICAgICAgLy8gY29uc2lzdGVudCBhY3Jvc3MgYWxsIGxpbmVzIGluIGEgcGFyYWdyYXBoLgorICAgICAgICAgICAgVGFiU3RvcFNwYW5bXSB0YWJzID0gZ2V0UGFyYWdyYXBoU3BhbnMoKFNwYW5uZWQpIG1UZXh0LCBzdGFydCwgZW5kLCBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICBpZiAodGFicy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgdGFicyk7IC8vIFhYWCBzaG91bGQgcmV1c2UKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGZsb2F0IHdpZCA9IG1lYXN1cmVUZXh0KG1QYWludCwgbVdvcmtQYWludCwgbVRleHQsIHN0YXJ0LCBvZmZzZXQsIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyLCBkaXJlY3Rpb25zLCB0cmFpbGluZywgYWx0LCB0YWIsIHRhYnMpOworICAgICAgICBUZXh0TGluZSB0bCA9IFRleHRMaW5lLm9idGFpbigpOworICAgICAgICB0bC5zZXQobVBhaW50LCBtVGV4dCwgc3RhcnQsIGVuZCwgZGlyLCBkaXJlY3Rpb25zLCBoYXNUYWJPckVtb2ppLCB0YWJTdG9wcyk7CisgICAgICAgIGZsb2F0IHdpZCA9IHRsLm1lYXN1cmUob2Zmc2V0IC0gc3RhcnQsIHRyYWlsaW5nLCBudWxsKTsKKyAgICAgICAgVGV4dExpbmUucmVjeWNsZSh0bCk7CiAKLSAgICAgICAgaWYgKG9mZnNldCA+IGVuZCkgewotICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICB3aWQgLT0gbWVhc3VyZVRleHQobVBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4dCwgZW5kLCBvZmZzZXQsIG51bGwsIHRhYiwgdGFicyk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgd2lkICs9IG1lYXN1cmVUZXh0KG1QYWludCwgbVdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRleHQsIGVuZCwgb2Zmc2V0LCBudWxsLCB0YWIsIHRhYnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQWxpZ25tZW50IGFsaWduID0gZ2V0UGFyYWdyYXBoQWxpZ25tZW50KGxpbmUpOwogICAgICAgICBpbnQgbGVmdCA9IGdldFBhcmFncmFwaExlZnQobGluZSk7CiAgICAgICAgIGludCByaWdodCA9IGdldFBhcmFncmFwaFJpZ2h0KGxpbmUpOwogCi0gICAgICAgIGlmIChhbGlnbiA9PSBBbGlnbm1lbnQuQUxJR05fTk9STUFMKSB7Ci0gICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIHJldHVybiByaWdodCArIHdpZDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCArIHdpZDsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IG1heCA9IGdldExpbmVNYXgobGluZSk7Ci0KLSAgICAgICAgaWYgKGFsaWduID09IEFsaWdubWVudC5BTElHTl9PUFBPU0lURSkgewotICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCArIG1heCArIHdpZDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gcmlnaHQgLSBtYXggKyB3aWQ7Ci0gICAgICAgIH0gZWxzZSB7IC8qIGFsaWduID09IEFsaWdubWVudC5BTElHTl9DRU5URVIgKi8KLSAgICAgICAgICAgIGludCBpbWF4ID0gKChpbnQpIG1heCkgJiB+MTsKLQotICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmlnaHQgLSAoKChyaWdodCAtIGxlZnQpIC0gaW1heCkgLyAyKSArIHdpZDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCArICgocmlnaHQgLSBsZWZ0KSAtIGltYXgpIC8gMiArIHdpZDsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0TGluZVN0YXJ0UG9zKGxpbmUsIGxlZnQsIHJpZ2h0KSArIHdpZDsKICAgICB9CiAKICAgICAvKioKQEAgLTY1NiwzOCArNzg1LDc2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwZWNpZmllZCBsaW5lLCBleGNsdWRpbmcKLSAgICAgKiB0cmFpbGluZyB3aGl0ZXNwYWNlLgorICAgICAqIEdldHMgdGhlIHVuc2lnbmVkIGhvcml6b250YWwgZXh0ZW50IG9mIHRoZSBzcGVjaWZpZWQgbGluZSwgaW5jbHVkaW5nCisgICAgICogbGVhZGluZyBtYXJnaW4gaW5kZW50LCBidXQgZXhjbHVkaW5nIHRyYWlsaW5nIHdoaXRlc3BhY2UuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldExpbmVNYXgoaW50IGxpbmUpIHsKLSAgICAgICAgcmV0dXJuIGdldExpbmVNYXgobGluZSwgbnVsbCwgZmFsc2UpOworICAgICAgICBmbG9hdCBtYXJnaW4gPSBnZXRQYXJhZ3JhcGhMZWFkaW5nTWFyZ2luKGxpbmUpOworICAgICAgICBmbG9hdCBzaWduZWRFeHRlbnQgPSBnZXRMaW5lRXh0ZW50KGxpbmUsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIG1hcmdpbiArIHNpZ25lZEV4dGVudCA+PSAwID8gc2lnbmVkRXh0ZW50IDogLXNpZ25lZEV4dGVudDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBob3Jpem9udGFsIGV4dGVudCBvZiB0aGUgc3BlY2lmaWVkIGxpbmUsIGluY2x1ZGluZwotICAgICAqIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgICAgICogR2V0cyB0aGUgdW5zaWduZWQgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwZWNpZmllZCBsaW5lLCBpbmNsdWRpbmcKKyAgICAgKiBsZWFkaW5nIG1hcmdpbiBpbmRlbnQgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldExpbmVXaWR0aChpbnQgbGluZSkgewotICAgICAgICByZXR1cm4gZ2V0TGluZU1heChsaW5lLCBudWxsLCB0cnVlKTsKKyAgICAgICAgZmxvYXQgbWFyZ2luID0gZ2V0UGFyYWdyYXBoTGVhZGluZ01hcmdpbihsaW5lKTsKKyAgICAgICAgZmxvYXQgc2lnbmVkRXh0ZW50ID0gZ2V0TGluZUV4dGVudChsaW5lLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1hcmdpbiArIHNpZ25lZEV4dGVudCA+PSAwID8gc2lnbmVkRXh0ZW50IDogLXNpZ25lZEV4dGVudDsKICAgICB9CiAKLSAgICBwcml2YXRlIGZsb2F0IGdldExpbmVNYXgoaW50IGxpbmUsIE9iamVjdFtdIHRhYnMsIGJvb2xlYW4gZnVsbCkgeworICAgIC8qKgorICAgICAqIExpa2Uge0BsaW5rICNnZXRMaW5lRXh0ZW50KGludCxUYWJTdG9wcyxib29sZWFuKX0gYnV0IGRldGVybWluZXMgdGhlCisgICAgICogdGFiIHN0b3BzIGluc3RlYWQgb2YgdXNpbmcgdGhlIG9uZXMgcGFzc2VkIGluLgorICAgICAqIEBwYXJhbSBsaW5lIHRoZSBpbmRleCBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSBmdWxsIHdoZXRoZXIgdG8gaW5jbHVkZSB0cmFpbGluZyB3aGl0ZXNwYWNlCisgICAgICogQHJldHVybiB0aGUgZXh0ZW50IG9mIHRoZSBsaW5lCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBnZXRMaW5lRXh0ZW50KGludCBsaW5lLCBib29sZWFuIGZ1bGwpIHsKICAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOwotICAgICAgICBpbnQgZW5kOworICAgICAgICBpbnQgZW5kID0gZnVsbCA/IGdldExpbmVFbmQobGluZSkgOiBnZXRMaW5lVmlzaWJsZUVuZChsaW5lKTsKIAotICAgICAgICBpZiAoZnVsbCkgewotICAgICAgICAgICAgZW5kID0gZ2V0TGluZUVuZChsaW5lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVuZCA9IGdldExpbmVWaXNpYmxlRW5kKGxpbmUpOwotICAgICAgICB9IAotICAgICAgICBib29sZWFuIHRhYiA9IGdldExpbmVDb250YWluc1RhYihsaW5lKTsKLQotICAgICAgICBpZiAodGFicyA9PSBudWxsICYmIHRhYiAmJiBtVGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKLSAgICAgICAgICAgIHRhYnMgPSAoKFNwYW5uZWQpIG1UZXh0KS5nZXRTcGFucyhzdGFydCwgZW5kLCBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgIGJvb2xlYW4gaGFzVGFic09yRW1vamkgPSBnZXRMaW5lQ29udGFpbnNUYWIobGluZSk7CisgICAgICAgIFRhYlN0b3BzIHRhYlN0b3BzID0gbnVsbDsKKyAgICAgICAgaWYgKGhhc1RhYnNPckVtb2ppICYmIG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgeworICAgICAgICAgICAgLy8gSnVzdCBjaGVja2luZyB0aGlzIGxpbmUgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLCB0YWJzIHNob3VsZCBiZQorICAgICAgICAgICAgLy8gY29uc2lzdGVudCBhY3Jvc3MgYWxsIGxpbmVzIGluIGEgcGFyYWdyYXBoLgorICAgICAgICAgICAgVGFiU3RvcFNwYW5bXSB0YWJzID0gZ2V0UGFyYWdyYXBoU3BhbnMoKFNwYW5uZWQpIG1UZXh0LCBzdGFydCwgZW5kLCBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICBpZiAodGFicy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgdGFicyk7IC8vIFhYWCBzaG91bGQgcmV1c2UKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKTsKKyAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKIAotICAgICAgICByZXR1cm4gbWVhc3VyZVRleHQobVBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRleHQsIHN0YXJ0LCBlbmQsIG51bGwsIHRhYiwgdGFicyk7CisgICAgICAgIFRleHRMaW5lIHRsID0gVGV4dExpbmUub2J0YWluKCk7CisgICAgICAgIHRsLnNldChtUGFpbnQsIG1UZXh0LCBzdGFydCwgZW5kLCBkaXIsIGRpcmVjdGlvbnMsIGhhc1RhYnNPckVtb2ppLCB0YWJTdG9wcyk7CisgICAgICAgIGZsb2F0IHdpZHRoID0gdGwubWV0cmljcyhudWxsKTsKKyAgICAgICAgVGV4dExpbmUucmVjeWNsZSh0bCk7CisgICAgICAgIHJldHVybiB3aWR0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzaWduZWQgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwZWNpZmllZCBsaW5lLCBleGNsdWRpbmcKKyAgICAgKiBsZWFkaW5nIG1hcmdpbi4gIElmIGZ1bGwgaXMgZmFsc2UsIGV4Y2x1ZGVzIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGluZGV4IG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHRhYlN0b3BzIHRoZSB0YWIgc3RvcHMsIGNhbiBiZSBudWxsIGlmIHdlIGtub3cgdGhleSdyZSBub3QgdXNlZC4KKyAgICAgKiBAcGFyYW0gZnVsbCB3aGV0aGVyIHRvIGluY2x1ZGUgdHJhaWxpbmcgd2hpdGVzcGFjZQorICAgICAqIEByZXR1cm4gdGhlIGV4dGVudCBvZiB0aGUgdGV4dCBvbiB0aGlzIGxpbmUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGdldExpbmVFeHRlbnQoaW50IGxpbmUsIFRhYlN0b3BzIHRhYlN0b3BzLCBib29sZWFuIGZ1bGwpIHsKKyAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICBpbnQgZW5kID0gZnVsbCA/IGdldExpbmVFbmQobGluZSkgOiBnZXRMaW5lVmlzaWJsZUVuZChsaW5lKTsKKyAgICAgICAgYm9vbGVhbiBoYXNUYWJzT3JFbW9qaSA9IGdldExpbmVDb250YWluc1RhYihsaW5lKTsKKyAgICAgICAgRGlyZWN0aW9ucyBkaXJlY3Rpb25zID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7CisgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7CisKKyAgICAgICAgVGV4dExpbmUgdGwgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgdGwuc2V0KG1QYWludCwgbVRleHQsIHN0YXJ0LCBlbmQsIGRpciwgZGlyZWN0aW9ucywgaGFzVGFic09yRW1vamksIHRhYlN0b3BzKTsKKyAgICAgICAgZmxvYXQgd2lkdGggPSB0bC5tZXRyaWNzKG51bGwpOworICAgICAgICBUZXh0TGluZS5yZWN5Y2xlKHRsKTsKKyAgICAgICAgcmV0dXJuIHdpZHRoOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzM4LDcgKzkwNSw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IG9uIHRoZSBzcGVjZmllZCBsaW5lIHdob3NlIHBvc2l0aW9uIGlzCisgICAgICogR2V0IHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IG9uIHRoZSBzcGVjaWZpZWQgbGluZSB3aG9zZSBwb3NpdGlvbiBpcwogICAgICAqIGNsb3Nlc3QgdG8gdGhlIHNwZWNpZmllZCBob3Jpem9udGFsIHBvc2l0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChpbnQgbGluZSwgZmxvYXQgaG9yaXopIHsKQEAgLTc0OSwyMCArOTE2LDE2IEBACiAgICAgICAgIGlmIChsaW5lID09IGdldExpbmVDb3VudCgpIC0gMSkKICAgICAgICAgICAgIG1heCsrOwogCi0gICAgICAgIGlmIChsaW5lICE9IGdldExpbmVDb3VudCgpIC0gMSkKLSAgICAgICAgICAgIG1heCA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIGdldExpbmVFbmQobGluZSkpOwotCiAgICAgICAgIGludCBiZXN0ID0gbWluOwogICAgICAgICBmbG9hdCBiZXN0ZGlzdCA9IE1hdGguYWJzKGdldFByaW1hcnlIb3Jpem9udGFsKGJlc3QpIC0gaG9yaXopOwogCi0gICAgICAgIGludCBoZXJlID0gbWluOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJzLm1EaXJlY3Rpb25zW2ldOwotICAgICAgICAgICAgaW50IHN3YXAgPSAoKGkgJiAxKSA9PSAwKSA/IDEgOiAtMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQgaGVyZSA9IG1pbiArIGRpcnMubURpcmVjdGlvbnNbaV07CisgICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgKGRpcnMubURpcmVjdGlvbnNbaSsxXSAmIFJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpbnQgc3dhcCA9IChkaXJzLm1EaXJlY3Rpb25zW2krMV0gJiBSVU5fUlRMX0ZMQUcpICE9IDAgPyAtMSA6IDE7CiAKICAgICAgICAgICAgIGlmICh0aGVyZSA+IG1heCkKICAgICAgICAgICAgICAgICB0aGVyZSA9IG1heDsKLQogICAgICAgICAgICAgaW50IGhpZ2ggPSB0aGVyZSAtIDEgKyAxLCBsb3cgPSBoZXJlICsgMSAtIDEsIGd1ZXNzOwogCiAgICAgICAgICAgICB3aGlsZSAoaGlnaCAtIGxvdyA+IDEpIHsKQEAgLTc5NSw3ICs5NTgsNyBAQAogCiAgICAgICAgICAgICAgICAgaWYgKGRpc3QgPCBiZXN0ZGlzdCkgewogICAgICAgICAgICAgICAgICAgICBiZXN0ZGlzdCA9IGRpc3Q7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3QgPSBsb3c7ICAgCisgICAgICAgICAgICAgICAgICAgIGJlc3QgPSBsb3c7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC04MDUsOCArOTY4LDYgQEAKICAgICAgICAgICAgICAgICBiZXN0ZGlzdCA9IGRpc3Q7CiAgICAgICAgICAgICAgICAgYmVzdCA9IGhlcmU7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKICAgICAgICAgfQogCiAgICAgICAgIGZsb2F0IGRpc3QgPSBNYXRoLmFicyhnZXRQcmltYXJ5SG9yaXpvbnRhbChtYXgpIC0gaG9yaXopOwpAQCAtODI2LDE5ICs5ODcsMTUgQEAKICAgICAgICAgcmV0dXJuIGdldExpbmVTdGFydChsaW5lICsgMSk7CiAgICAgfQogCi0gICAgLyoqIAorICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgdGV4dCBvZmZzZXQgYWZ0ZXIgdGhlIGxhc3QgdmlzaWJsZSBjaGFyYWN0ZXIgKHNvIHdoaXRlc3BhY2UKICAgICAgKiBpcyBub3QgY291bnRlZCkgb24gdGhlIHNwZWNpZmllZCBsaW5lLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TGluZVZpc2libGVFbmQoaW50IGxpbmUpIHsKICAgICAgICAgcmV0dXJuIGdldExpbmVWaXNpYmxlRW5kKGxpbmUsIGdldExpbmVTdGFydChsaW5lKSwgZ2V0TGluZVN0YXJ0KGxpbmUrMSkpOwogICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBnZXRMaW5lVmlzaWJsZUVuZChpbnQgbGluZSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZ2V0TGluZVN0YXJ0KGxpbmUpID09IHN0YXJ0ICYmIGdldExpbmVTdGFydChsaW5lKzEpID09IGVuZCk7Ci0gICAgICAgIH0KIAorICAgIHByaXZhdGUgaW50IGdldExpbmVWaXNpYmxlRW5kKGludCBsaW5lLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSBtVGV4dDsKICAgICAgICAgY2hhciBjaDsKICAgICAgICAgaWYgKGxpbmUgPT0gZ2V0TGluZUNvdW50KCkgLSAxKSB7CkBAIC04ODUsMjA3ICsxMDQyLDYyIEBACiAgICAgICAgIHJldHVybiBnZXRMaW5lVG9wKGxpbmUpIC0gKGdldExpbmVUb3AobGluZSsxKSAtIGdldExpbmVEZXNjZW50KGxpbmUpKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHRleHQgb2Zmc2V0IHRoYXQgd291bGQgYmUgcmVhY2hlZCBieSBtb3ZpbmcgbGVmdAotICAgICAqIChwb3NzaWJseSBvbnRvIGFub3RoZXIgbGluZSkgZnJvbSB0aGUgc3BlY2lmaWVkIG9mZnNldC4KLSAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE9mZnNldFRvTGVmdE9mKGludCBvZmZzZXQpIHsKLSAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7Ci0gICAgICAgIGludCBzdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKLSAgICAgICAgaW50IGVuZCA9IGdldExpbmVFbmQobGluZSk7Ci0gICAgICAgIERpcmVjdGlvbnMgZGlycyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOwotCi0gICAgICAgIGlmIChsaW5lICE9IGdldExpbmVDb3VudCgpIC0gMSkKLSAgICAgICAgICAgIGVuZCA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIGVuZCk7Ci0KLSAgICAgICAgZmxvYXQgaG9yaXogPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChvZmZzZXQpOwotCi0gICAgICAgIGludCBiZXN0ID0gb2Zmc2V0OwotICAgICAgICBmbG9hdCBiZXN0aCA9IEludGVnZXIuTUlOX1ZBTFVFOwotICAgICAgICBpbnQgY2FuZGlkYXRlOwotCi0gICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIG9mZnNldCk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIG9mZnNldCk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaGVyZSA9IHN0YXJ0OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJzLm1EaXJlY3Rpb25zW2ldOwotICAgICAgICAgICAgaWYgKHRoZXJlID4gZW5kKQotICAgICAgICAgICAgICAgIHRoZXJlID0gZW5kOwotCi0gICAgICAgICAgICBmbG9hdCBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoaGVyZSk7Ci0KLSAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGhlcmU7Ci0gICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIGhlcmUpOwotICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaCA8IGhvcml6ICYmIGggPiBiZXN0aCkgewotICAgICAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QmVmb3JlKG1UZXh0LCB0aGVyZSk7Ci0gICAgICAgICAgICBpZiAoY2FuZGlkYXRlID49IHN0YXJ0ICYmIGNhbmRpZGF0ZSA8PSBlbmQpIHsKLSAgICAgICAgICAgICAgICBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoY2FuZGlkYXRlKTsKLQotICAgICAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChlbmQpOwotCi0gICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICBiZXN0ID0gZW5kOwotICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJlc3QgIT0gb2Zmc2V0KQotICAgICAgICAgICAgcmV0dXJuIGJlc3Q7Ci0KLSAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKLQotICAgICAgICBpZiAoZGlyID4gMCkgewotICAgICAgICAgICAgaWYgKGxpbmUgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gYmVzdDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lIC0gMSwgMTAwMDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxpbmUgPT0gZ2V0TGluZUNvdW50KCkgLSAxKQotICAgICAgICAgICAgICAgIHJldHVybiBiZXN0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBnZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUgKyAxLCAxMDAwMCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldE9mZnNldFRvTGVmdFJpZ2h0T2Yob2Zmc2V0LCB0cnVlKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHRleHQgb2Zmc2V0IHRoYXQgd291bGQgYmUgcmVhY2hlZCBieSBtb3ZpbmcgcmlnaHQKLSAgICAgKiAocG9zc2libHkgb250byBhbm90aGVyIGxpbmUpIGZyb20gdGhlIHNwZWNpZmllZCBvZmZzZXQuCi0gICAgICovCiAgICAgcHVibGljIGludCBnZXRPZmZzZXRUb1JpZ2h0T2YoaW50IG9mZnNldCkgewotICAgICAgICBpbnQgbGluZSA9IGdldExpbmVGb3JPZmZzZXQob2Zmc2V0KTsKLSAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOwotICAgICAgICBpbnQgZW5kID0gZ2V0TGluZUVuZChsaW5lKTsKLSAgICAgICAgRGlyZWN0aW9ucyBkaXJzID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7CisgICAgICAgIHJldHVybiBnZXRPZmZzZXRUb0xlZnRSaWdodE9mKG9mZnNldCwgZmFsc2UpOworICAgIH0KIAotICAgICAgICBpZiAobGluZSAhPSBnZXRMaW5lQ291bnQoKSAtIDEpCi0gICAgICAgICAgICBlbmQgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QmVmb3JlKG1UZXh0LCBlbmQpOworICAgIHByaXZhdGUgaW50IGdldE9mZnNldFRvTGVmdFJpZ2h0T2YoaW50IGNhcmV0LCBib29sZWFuIHRvTGVmdCkgeworICAgICAgICBpbnQgbGluZSA9IGdldExpbmVGb3JPZmZzZXQoY2FyZXQpOworICAgICAgICBpbnQgbGluZVN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICBpbnQgbGluZUVuZCA9IGdldExpbmVFbmQobGluZSk7CisgICAgICAgIGludCBsaW5lRGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOwogCi0gICAgICAgIGZsb2F0IGhvcml6ID0gZ2V0UHJpbWFyeUhvcml6b250YWwob2Zmc2V0KTsKLQotICAgICAgICBpbnQgYmVzdCA9IG9mZnNldDsKLSAgICAgICAgZmxvYXQgYmVzdGggPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgaW50IGNhbmRpZGF0ZTsKLQotICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QmVmb3JlKG1UZXh0LCBvZmZzZXQpOwotICAgICAgICBpZiAoY2FuZGlkYXRlID49IHN0YXJ0ICYmIGNhbmRpZGF0ZSA8PSBlbmQpIHsKLSAgICAgICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChjYW5kaWRhdGUpOwotCi0gICAgICAgICAgICBpZiAoaCA+IGhvcml6ICYmIGggPCBiZXN0aCkgewotICAgICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2FuZGlkYXRlID0gVGV4dFV0aWxzLmdldE9mZnNldEFmdGVyKG1UZXh0LCBvZmZzZXQpOwotICAgICAgICBpZiAoY2FuZGlkYXRlID49IHN0YXJ0ICYmIGNhbmRpZGF0ZSA8PSBlbmQpIHsKLSAgICAgICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChjYW5kaWRhdGUpOwotCi0gICAgICAgICAgICBpZiAoaCA+IGhvcml6ICYmIGggPCBiZXN0aCkgewotICAgICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGhlcmUgPSBzdGFydDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgZGlycy5tRGlyZWN0aW9uc1tpXTsKLSAgICAgICAgICAgIGlmICh0aGVyZSA+IGVuZCkKLSAgICAgICAgICAgICAgICB0aGVyZSA9IGVuZDsKLQotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGhlcmUpOwotCi0gICAgICAgICAgICBpZiAoaCA+IGhvcml6ICYmIGggPCBiZXN0aCkgewotICAgICAgICAgICAgICAgIGJlc3QgPSBoZXJlOwotICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FuZGlkYXRlID0gVGV4dFV0aWxzLmdldE9mZnNldEFmdGVyKG1UZXh0LCBoZXJlKTsKLSAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgICAgIGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChjYW5kaWRhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGggPiBob3JpeiAmJiBoIDwgYmVzdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYmVzdGggPSBoOworICAgICAgICBib29sZWFuIGFkdmFuY2UgPSB0b0xlZnQgPT0gKGxpbmVEaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpOworICAgICAgICBpZiAoY2FyZXQgPT0gKGFkdmFuY2UgPyBsaW5lRW5kIDogbGluZVN0YXJ0KSkgeworICAgICAgICAgICAgLy8gd2Fsa2luZyBvZmYgbGluZSwgc28gbG9vayBhdCB0aGUgbGluZSB3ZSdyZSBoZWFkZWQgdG8KKyAgICAgICAgICAgIGlmIChjYXJldCA9PSBsaW5lU3RhcnQpIHsKKyAgICAgICAgICAgICAgICBpZiAobGluZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLS1saW5lOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXJldDsgLy8gYXQgdmVyeSBzdGFydCwgZG9uJ3QgbW92ZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUgPCBnZXRMaW5lQ291bnQoKSAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgKytsaW5lOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXJldDsgLy8gYXQgdmVyeSBlbmQsIGRvbid0IG1vdmUKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIHRoZXJlKTsKLSAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgICAgIGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChjYW5kaWRhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGggPiBob3JpeiAmJiBoIDwgYmVzdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpbmVTdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKKyAgICAgICAgICAgIGxpbmVFbmQgPSBnZXRMaW5lRW5kKGxpbmUpOworICAgICAgICAgICAgaW50IG5ld0RpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKKyAgICAgICAgICAgIGlmIChuZXdEaXIgIT0gbGluZURpcikgeworICAgICAgICAgICAgICAgIC8vIHVudXN1YWwgY2FzZS4gIHdlIHdhbnQgdG8gd2FsayBvbnRvIHRoZSBsaW5lLCBidXQgaXQgcnVucworICAgICAgICAgICAgICAgIC8vIGluIGEgZGlmZmVyZW50IGRpcmVjdGlvbiB0aGFuIHRoaXMgb25lLCBzbyB3ZSBmYWtlIG1vdmVtZW50CisgICAgICAgICAgICAgICAgLy8gaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbi4KKyAgICAgICAgICAgICAgICB0b0xlZnQgPSAhdG9MZWZ0OworICAgICAgICAgICAgICAgIGxpbmVEaXIgPSBuZXdEaXI7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKICAgICAgICAgfQogCi0gICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChlbmQpOworICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKTsKIAotICAgICAgICBpZiAoaCA+IGhvcml6ICYmIGggPCBiZXN0aCkgewotICAgICAgICAgICAgYmVzdCA9IGVuZDsKLSAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiZXN0ICE9IG9mZnNldCkKLSAgICAgICAgICAgIHJldHVybiBiZXN0OwotCi0gICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7Ci0KLSAgICAgICAgaWYgKGRpciA+IDApIHsKLSAgICAgICAgICAgIGlmIChsaW5lID09IGdldExpbmVDb3VudCgpIC0gMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gYmVzdDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lICsgMSwgLTEwMDAwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsaW5lID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJlc3Q7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdldE9mZnNldEZvckhvcml6b250YWwobGluZSAtIDEsIC0xMDAwMCk7Ci0gICAgICAgIH0KKyAgICAgICAgVGV4dExpbmUgdGwgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgLy8gWFhYOiB3ZSBkb24ndCBjYXJlIGFib3V0IHRhYnMKKyAgICAgICAgdGwuc2V0KG1QYWludCwgbVRleHQsIGxpbmVTdGFydCwgbGluZUVuZCwgbGluZURpciwgZGlyZWN0aW9ucywgZmFsc2UsIG51bGwpOworICAgICAgICBjYXJldCA9IGxpbmVTdGFydCArIHRsLmdldE9mZnNldFRvTGVmdFJpZ2h0T2YoY2FyZXQgLSBsaW5lU3RhcnQsIHRvTGVmdCk7CisgICAgICAgIHRsID0gVGV4dExpbmUucmVjeWNsZSh0bCk7CisgICAgICAgIHJldHVybiBjYXJldDsKICAgICB9CiAKICAgICBwcml2YXRlIGludCBnZXRPZmZzZXRBdFN0YXJ0T2YoaW50IG9mZnNldCkgeworICAgICAgICAvLyBYWFggdGhpcyBwcm9iYWJseSBzaG91bGQgc2tpcCBsb2NhbCByZW9yZGVyaW5ncyBhbmQKKyAgICAgICAgLy8gemVyby13aWR0aCBjaGFyYWN0ZXJzLCBsb29rIGF0IGNhbGxlcnMKICAgICAgICAgaWYgKG9mZnNldCA9PSAwKQogICAgICAgICAgICAgcmV0dXJuIDA7CiAKQEAgLTExMTgsNyArMTEzMCw3IEBACiAgICAgLyoqCiAgICAgICogRmlsbHMgaW4gdGhlIHNwZWNpZmllZCBQYXRoIHdpdGggYSByZXByZXNlbnRhdGlvbiBvZiBhIGN1cnNvcgogICAgICAqIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LiAgVGhpcyB3aWxsIG9mdGVuIGJlIGEgdmVydGljYWwgbGluZQotICAgICAqIGJ1dCBjYW4gYmUgbXVsdGlwbGUgZGlzY29udGlub3VzIGxpbmVzIGluIHRleHQgd2l0aCBtdWx0aXBsZQorICAgICAqIGJ1dCBjYW4gYmUgbXVsdGlwbGUgZGlzY29udGludW91cyBsaW5lcyBpbiB0ZXh0IHdpdGggbXVsdGlwbGUKICAgICAgKiBkaXJlY3Rpb25hbGl0aWVzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldEN1cnNvclBhdGgoaW50IHBvaW50LCBQYXRoIGRlc3QsCkBAIC0xMTMwLDcgKzExNDIsOCBAQAogICAgICAgICBpbnQgYm90dG9tID0gZ2V0TGluZVRvcChsaW5lKzEpOwogCiAgICAgICAgIGZsb2F0IGgxID0gZ2V0UHJpbWFyeUhvcml6b250YWwocG9pbnQpIC0gMC41ZjsKLSAgICAgICAgZmxvYXQgaDIgPSBnZXRTZWNvbmRhcnlIb3Jpem9udGFsKHBvaW50KSAtIDAuNWY7CisgICAgICAgIGZsb2F0IGgyID0gaXNMZXZlbEJvdW5kYXJ5KHBvaW50KSA/CisgICAgICAgICAgICAgICAgICAgIGdldFNlY29uZGFyeUhvcml6b250YWwocG9pbnQpIC0gMC41ZiA6IGgxOwogCiAgICAgICAgIGludCBjYXBzID0gVGV4dEtleUxpc3RlbmVyLmdldE1ldGFTdGF0ZShlZGl0aW5nQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuTUVUQV9TSElGVF9PTikgfApAQCAtMTIwNyw5ICsxMjIwLDEwIEBACiAgICAgICAgIGlmIChsaW5lZW5kID4gbGluZXN0YXJ0ICYmIG1UZXh0LmNoYXJBdChsaW5lZW5kIC0gMSkgPT0gJ1xuJykKICAgICAgICAgICAgIGxpbmVlbmQtLTsKIAotICAgICAgICBpbnQgaGVyZSA9IGxpbmVzdGFydDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgZGlycy5tRGlyZWN0aW9uc1tpXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQgaGVyZSA9IGxpbmVzdGFydCArIGRpcnMubURpcmVjdGlvbnNbaV07CisgICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgKGRpcnMubURpcmVjdGlvbnNbaSsxXSAmIFJVTl9MRU5HVEhfTUFTSyk7CisKICAgICAgICAgICAgIGlmICh0aGVyZSA+IGxpbmVlbmQpCiAgICAgICAgICAgICAgICAgdGhlcmUgPSBsaW5lZW5kOwogCkBAIC0xMjE4LDE0ICsxMjMyLDEyIEBACiAgICAgICAgICAgICAgICAgaW50IGVuID0gTWF0aC5taW4oZW5kLCB0aGVyZSk7CiAKICAgICAgICAgICAgICAgICBpZiAoc3QgIT0gZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgaDEgPSBnZXRIb3Jpem9udGFsKHN0LCBmYWxzZSwgZmFsc2UsIGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBmbG9hdCBoMiA9IGdldEhvcml6b250YWwoZW4sIHRydWUsIGZhbHNlLCBsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgaDEgPSBnZXRIb3Jpem9udGFsKHN0LCBmYWxzZSwgbGluZSk7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGgyID0gZ2V0SG9yaXpvbnRhbChlbiwgdHJ1ZSwgbGluZSk7CiAKICAgICAgICAgICAgICAgICAgICAgZGVzdC5hZGRSZWN0KGgxLCB0b3AsIGgyLCBib3R0b20sIFBhdGguRGlyZWN0aW9uLkNXKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTI2MCw3ICsxMjcyLDcgQEAKIAogICAgICAgICAgICAgYWRkU2VsZWN0aW9uKHN0YXJ0bGluZSwgc3RhcnQsIGdldExpbmVFbmQoc3RhcnRsaW5lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsIGdldExpbmVCb3R0b20oc3RhcnRsaW5lKSwgZGVzdCk7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKGdldFBhcmFncmFwaERpcmVjdGlvbihzdGFydGxpbmUpID09IERJUl9SSUdIVF9UT19MRUZUKQogICAgICAgICAgICAgICAgIGRlc3QuYWRkUmVjdChnZXRMaW5lTGVmdChzdGFydGxpbmUpLCB0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBnZXRMaW5lQm90dG9tKHN0YXJ0bGluZSksIFBhdGguRGlyZWN0aW9uLkNXKTsKQEAgLTEyOTYsNyArMTMwOCw3IEBACiAKICAgICAgICAgaWYgKG1TcGFubmVkVGV4dCkgewogICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBtVGV4dDsKLSAgICAgICAgICAgIEFsaWdubWVudFNwYW5bXSBzcGFucyA9IHNwLmdldFNwYW5zKGdldExpbmVTdGFydChsaW5lKSwKKyAgICAgICAgICAgIEFsaWdubWVudFNwYW5bXSBzcGFucyA9IGdldFBhcmFncmFwaFNwYW5zKHNwLCBnZXRMaW5lU3RhcnQobGluZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMaW5lRW5kKGxpbmUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpZ25tZW50U3Bhbi5jbGFzcyk7CiAKQEAgLTEzMTMsNDIzICsxMzI1LDE3MyBAQAogICAgICAqIEdldCB0aGUgbGVmdCBlZGdlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYWdyYXBoLCBpbnNldCBieSBsZWZ0IG1hcmdpbnMuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBnZXRQYXJhZ3JhcGhMZWZ0KGludCBsaW5lKSB7Ci0gICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7Ci0KICAgICAgICAgaW50IGxlZnQgPSAwOwotCi0gICAgICAgIGJvb2xlYW4gcGFyID0gZmFsc2U7Ci0gICAgICAgIGludCBvZmYgPSBnZXRMaW5lU3RhcnQobGluZSk7Ci0gICAgICAgIGlmIChvZmYgPT0gMCB8fCBtVGV4dC5jaGFyQXQob2ZmIC0gMSkgPT0gJ1xuJykKLSAgICAgICAgICAgIHBhciA9IHRydWU7Ci0KLSAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCkgewotICAgICAgICAgICAgaWYgKG1TcGFubmVkVGV4dCkgewotICAgICAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgbVRleHQ7Ci0gICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW5bXSBzcGFucyA9IHNwLmdldFNwYW5zKGdldExpbmVTdGFydChsaW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGluZUVuZChsaW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4uY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIG1hcmdpbiA9IHBhcjsKLSAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4gc3BhbiA9IHNwYW5zW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbiBpbnN0YW5jZW9mIExlYWRpbmdNYXJnaW5TcGFuLkxlYWRpbmdNYXJnaW5TcGFuMikgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gKChMZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjIpc3BhbikuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gY291bnQgPj0gbGluZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsZWZ0ICs9IHNwYW4uZ2V0TGVhZGluZ01hcmdpbihtYXJnaW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKKyAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCB8fCAhbVNwYW5uZWRUZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gbGVmdDsgLy8gbGVhZGluZyBtYXJnaW4gaGFzIG5vIGltcGFjdCwgb3Igbm8gc3R5bGVzCiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbGVmdDsKKyAgICAgICAgcmV0dXJuIGdldFBhcmFncmFwaExlYWRpbmdNYXJnaW4obGluZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSByaWdodCBlZGdlIG9mIHRoZSBzcGVjaWZpZWQgcGFyYWdyYXBoLCBpbnNldCBieSByaWdodCBtYXJnaW5zLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGFyYWdyYXBoUmlnaHQoaW50IGxpbmUpIHsKLSAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKLQogICAgICAgICBpbnQgcmlnaHQgPSBtV2lkdGg7Ci0KLSAgICAgICAgYm9vbGVhbiBwYXIgPSBmYWxzZTsKLSAgICAgICAgaW50IG9mZiA9IGdldExpbmVTdGFydChsaW5lKTsKLSAgICAgICAgaWYgKG9mZiA9PSAwIHx8IG1UZXh0LmNoYXJBdChvZmYgLSAxKSA9PSAnXG4nKQotICAgICAgICAgICAgcGFyID0gdHJ1ZTsKLQotCi0gICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgIGlmIChtU3Bhbm5lZFRleHQpIHsKLSAgICAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIG1UZXh0OwotICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuW10gc3BhbnMgPSBzcC5nZXRTcGFucyhnZXRMaW5lU3RhcnQobGluZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExpbmVFbmQobGluZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuLmNsYXNzKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcmlnaHQgLT0gc3BhbnNbaV0uZ2V0TGVhZGluZ01hcmdpbihwYXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKKyAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCB8fCAhbVNwYW5uZWRUZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gcmlnaHQ7IC8vIGxlYWRpbmcgbWFyZ2luIGhhcyBubyBpbXBhY3QsIG9yIG5vIHN0eWxlcwogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJpZ2h0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkcmF3VGV4dChDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsIERpcmVjdGlvbnMgZGlyZWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGludCB0b3AsIGludCB5LCBpbnQgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFicywgT2JqZWN0W10gcGFyc3BhbnMpIHsKLSAgICAgICAgY2hhcltdIGJ1ZjsKLSAgICAgICAgaWYgKCFoYXNUYWJzKSB7Ci0gICAgICAgICAgICBpZiAoZGlyZWN0aW9ucyA9PSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKERJUl9MRUZUX1RPX1JJR0hUID09IGRpcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0eWxlZC5kcmF3VGV4dChjYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsIGRpciwgZmFsc2UsIHgsIHRvcCwgeSwgYm90dG9tLCBwYWludCwgd29ya1BhaW50LCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1ZiA9IFRleHRVdGlscy5vYnRhaW4oZW5kIC0gc3RhcnQpOwotICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIGJ1ZiwgMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBoID0gMDsKLQotICAgICAgICBpbnQgaGVyZSA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlyZWN0aW9ucy5tRGlyZWN0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW50IHRoZXJlID0gaGVyZSArIGRpcmVjdGlvbnMubURpcmVjdGlvbnNbaV07Ci0gICAgICAgICAgICBpZiAodGhlcmUgPiBlbmQgLSBzdGFydCkKLSAgICAgICAgICAgICAgICB0aGVyZSA9IGVuZCAtIHN0YXJ0OwotCi0gICAgICAgICAgICBpbnQgc2Vnc3RhcnQgPSBoZXJlOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGhhc1RhYnMgPyBoZXJlIDogdGhlcmU7IGogPD0gdGhlcmU7IGorKykgewotICAgICAgICAgICAgICAgIGlmIChqID09IHRoZXJlIHx8IGJ1ZltqXSA9PSAnXHQnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGggKz0gU3R5bGVkLmRyYXdUZXh0KGNhbnZhcywgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwgc3RhcnQgKyBqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIsIChpICYgMSkgIT0gMCwgeCArIGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwgeSwgYm90dG9tLCBwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIGogIT0gZW5kKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoaiAhPSB0aGVyZSAmJiBidWZbal0gPT0gJ1x0JykKLSAgICAgICAgICAgICAgICAgICAgICAgIGggPSBkaXIgKiBuZXh0VGFiKHRleHQsIHN0YXJ0LCBlbmQsIGggKiBkaXIsIHBhcnNwYW5zKTsKLQotICAgICAgICAgICAgICAgICAgICBzZWdzdGFydCA9IGogKyAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFzVGFicyAmJiBidWZbal0gPj0gMHhEODAwICYmIGJ1ZltqXSA8PSAweERGRkYgJiYgaiArIDEgPCB0aGVyZSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgZW1vamkgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQoYnVmLCBqKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZW1vamkgPj0gTUlOX0VNT0pJICYmIGVtb2ppIDw9IE1BWF9FTU9KSSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJtID0gRU1PSklfRkFDVE9SWS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCaXRtYXBGcm9tQW5kcm9pZFB1YShlbW9qaSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCArPSBTdHlsZWQuZHJhd1RleHQoY2FudmFzLCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgc2Vnc3RhcnQsIHN0YXJ0ICsgaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIsIChpICYgMSkgIT0gMCwgeCArIGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLCB5LCBib3R0b20sIHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBqICE9IGVuZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUVtb2ppUmVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FbW9qaVJlY3QgPSBuZXcgUmVjdEYoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQuc2V0KHBhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBqLCBzdGFydCArIGogKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBiaXRtYXBIZWlnaHQgPSBibS5nZXRIZWlnaHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0ZXh0SGVpZ2h0ID0gLXdvcmtQYWludC5hc2NlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZSA9IHRleHRIZWlnaHQgLyBiaXRtYXBIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkdGggPSBibS5nZXRXaWR0aCgpICogc2NhbGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW1vamlSZWN0LnNldCh4ICsgaCwgeSAtIHRleHRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCArIGggKyB3aWR0aCwgeSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChibSwgbnVsbCwgbUVtb2ppUmVjdCwgcGFpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vnc3RhcnQgPSBqICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVyZSA9IHRoZXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhc1RhYnMpCi0gICAgICAgICAgICBUZXh0VXRpbHMucmVjeWNsZShidWYpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IG1lYXN1cmVUZXh0KFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwgaW50IG9mZnNldCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyLCBEaXJlY3Rpb25zIGRpcmVjdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB0cmFpbGluZywgYm9vbGVhbiBhbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJzLCBPYmplY3RbXSB0YWJzKSB7Ci0gICAgICAgIGNoYXJbXSBidWYgPSBudWxsOwotCi0gICAgICAgIGlmIChoYXNUYWJzKSB7Ci0gICAgICAgICAgICBidWYgPSBUZXh0VXRpbHMub2J0YWluKGVuZCAtIHN0YXJ0KTsKLSAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXQgaCA9IDA7Ci0KLSAgICAgICAgaWYgKGFsdCkgewotICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICB0cmFpbGluZyA9ICF0cmFpbGluZzsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBoZXJlID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3Rpb25zLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoYWx0KQotICAgICAgICAgICAgICAgIHRyYWlsaW5nID0gIXRyYWlsaW5nOwotCi0gICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgZGlyZWN0aW9ucy5tRGlyZWN0aW9uc1tpXTsKLSAgICAgICAgICAgIGlmICh0aGVyZSA+IGVuZCAtIHN0YXJ0KQotICAgICAgICAgICAgICAgIHRoZXJlID0gZW5kIC0gc3RhcnQ7Ci0KLSAgICAgICAgICAgIGludCBzZWdzdGFydCA9IGhlcmU7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gaGFzVGFicyA/IGhlcmUgOiB0aGVyZTsgaiA8PSB0aGVyZTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGNvZGVwdCA9IDA7Ci0gICAgICAgICAgICAgICAgQml0bWFwIGJtID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGlmIChoYXNUYWJzICYmIGogPCB0aGVyZSkgewotICAgICAgICAgICAgICAgICAgICBjb2RlcHQgPSBidWZbal07Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA+PSAweEQ4MDAgJiYgY29kZXB0IDw9IDB4REZGRiAmJiBqICsgMSA8IHRoZXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVwdCA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChidWYsIGopOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gTUlOX0VNT0pJICYmIGNvZGVwdCA8PSBNQVhfRU1PSkkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJtID0gRU1PSklfRkFDVE9SWS5nZXRCaXRtYXBGcm9tQW5kcm9pZFB1YShjb2RlcHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGogPT0gdGhlcmUgfHwgY29kZXB0ID09ICdcdCcgfHwgYm0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmbG9hdCBzZWd3OwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCBzdGFydCArIGogfHwKLSAgICAgICAgICAgICAgICAgICAgICAgKHRyYWlsaW5nICYmIG9mZnNldCA8PSBzdGFydCArIGopKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUICYmIChpICYgMSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUICYmIChpICYgMSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLT0gU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc2VndyA9IFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgc2Vnc3RhcnQsIHN0YXJ0ICsgaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgc3RhcnQgKyBqIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAodHJhaWxpbmcgJiYgb2Zmc2V0IDw9IHN0YXJ0ICsgaikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICs9IHNlZ3cgLSBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLT0gc2VndyAtIFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGggLT0gc2VndzsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgaCArPSBzZWd3OwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChqICE9IHRoZXJlICYmIGJ1ZltqXSA9PSAnXHQnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IHN0YXJ0ICsgaikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGRpciAqIG5leHRUYWIodGV4dCwgc3RhcnQsIGVuZCwgaCAqIGRpciwgdGFicyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoaiAhPSB0aGVyZSAmJiBibSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IHN0YXJ0ICsgaikgcmV0dXJuIGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQuc2V0KHBhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGosIGogKyAyLCBudWxsKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkID0gKGZsb2F0KSBibS5nZXRXaWR0aCgpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13b3JrUGFpbnQuYXNjZW50KCkgLyBibS5nZXRIZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLT0gd2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICs9IHdpZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc2Vnc3RhcnQgPSBqICsgMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhlcmUgPSB0aGVyZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXNUYWJzKQotICAgICAgICAgICAgVGV4dFV0aWxzLnJlY3ljbGUoYnVmKTsKLQotICAgICAgICByZXR1cm4gaDsKKyAgICAgICAgcmV0dXJuIHJpZ2h0IC0gZ2V0UGFyYWdyYXBoTGVhZGluZ01hcmdpbihsaW5lKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBNZWFzdXJlIHdpZHRoIG9mIGEgcnVuIG9mIHRleHQgb24gYSBzaW5nbGUgbGluZSB0aGF0IGlzIGtub3duIHRvIGFsbCBiZQotICAgICAqIGluIHRoZSBzYW1lIGRpcmVjdGlvbiBhcyB0aGUgcGFyYWdyYXBoIGJhc2UgZGlyZWN0aW9uLiBSZXR1cm5zIHRoZSB3aWR0aCwKLSAgICAgKiBhbmQgdGhlIGxpbmUgbWV0cmljcyBpbiBmbSBpZiBmbSBpcyBub3QgbnVsbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWludCB0aGUgcGFpbnQgZm9yIHRoZSB0ZXh0OyB3aWxsIG5vdCBiZSBtb2RpZmllZAotICAgICAqIEBwYXJhbSB3b3JrUGFpbnQgcGFpbnQgYXZhaWxhYmxlIGZvciBtb2RpZmljYXRpb24KLSAgICAgKiBAcGFyYW0gdGV4dCB0ZXh0Ci0gICAgICogQHBhcmFtIHN0YXJ0IHN0YXJ0IG9mIHRoZSBsaW5lCi0gICAgICogQHBhcmFtIGVuZCBsaW1pdCBvZiB0aGUgbGluZQotICAgICAqIEBwYXJhbSBmbSBvYmplY3QgdG8gcmV0dXJuIGludGVnZXIgbWV0cmljcyBpbiwgY2FuIGJlIG51bGwKLSAgICAgKiBAcGFyYW0gaGFzVGFicyB0cnVlIGlmIGl0IGlzIGtub3duIHRoYXQgdGhlIGxpbmUgaGFzIHRhYnMKLSAgICAgKiBAcGFyYW0gdGFicyB0YWIgcG9zaXRpb24gaW5mb3JtYXRpb24KLSAgICAgKiBAcmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgdGV4dCBmcm9tIHN0YXJ0IHRvIGVuZAorICAgICAqIFJldHVybnMgdGhlIGVmZmVjdGl2ZSBsZWFkaW5nIG1hcmdpbiAodW5zaWduZWQpIGZvciB0aGlzIGxpbmUsCisgICAgICogdGFraW5nIGludG8gYWNjb3VudCBMZWFkaW5nTWFyZ2luU3BhbiBhbmQgTGVhZGluZ01hcmdpblNwYW4yLgorICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIGluZGV4CisgICAgICogQHJldHVybiB0aGUgbGVhZGluZyBtYXJnaW4gb2YgdGhpcyBsaW5lCiAgICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmxvYXQgbWVhc3VyZVRleHQoVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFicywgT2JqZWN0W10gdGFicykgewotICAgICAgICBjaGFyW10gYnVmID0gbnVsbDsKLSAgCi0gICAgICAgIGlmIChoYXNUYWJzKSB7Ci0gICAgICAgICAgICBidWYgPSBUZXh0VXRpbHMub2J0YWluKGVuZCAtIHN0YXJ0KTsKLSAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOworICAgIHByaXZhdGUgaW50IGdldFBhcmFncmFwaExlYWRpbmdNYXJnaW4oaW50IGxpbmUpIHsKKyAgICAgICAgaWYgKCFtU3Bhbm5lZFRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIFNwYW5uZWQgc3Bhbm5lZCA9IChTcGFubmVkKSBtVGV4dDsKKworICAgICAgICBpbnQgbGluZVN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICBpbnQgbGluZUVuZCA9IGdldExpbmVFbmQobGluZSk7CisgICAgICAgIGludCBzcGFuRW5kID0gc3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24obGluZVN0YXJ0LCBsaW5lRW5kLAorICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuLmNsYXNzKTsKKyAgICAgICAgTGVhZGluZ01hcmdpblNwYW5bXSBzcGFucyA9IGdldFBhcmFncmFwaFNwYW5zKHNwYW5uZWQsIGxpbmVTdGFydCwgc3BhbkVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuLmNsYXNzKTsKKyAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsgLy8gbm8gbGVhZGluZyBtYXJnaW4gc3BhbjsKICAgICAgICAgfQogCi0gICAgICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgaW50IG1hcmdpbiA9IDA7CiAKLSAgICAgICAgaW50IGxhc3RQb3MgPSAwOwotICAgICAgICBmbG9hdCB3aWR0aCA9IDA7Ci0gICAgICAgIGludCBhc2NlbnQgPSAwLCBkZXNjZW50ID0gMCwgdG9wID0gMCwgYm90dG9tID0gMDsKKyAgICAgICAgYm9vbGVhbiBpc0ZpcnN0UGFyYUxpbmUgPSBsaW5lU3RhcnQgPT0gMCB8fAorICAgICAgICAgICAgc3Bhbm5lZC5jaGFyQXQobGluZVN0YXJ0IC0gMSkgPT0gJ1xuJzsKIAotICAgICAgICBpZiAoZm0gIT0gbnVsbCkgewotICAgICAgICAgICAgZm0uYXNjZW50ID0gMDsKLSAgICAgICAgICAgIGZtLmRlc2NlbnQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgcG9zID0gaGFzVGFicyA/IDAgOiBsZW47IHBvcyA8PSBsZW47IHBvcysrKSB7Ci0gICAgICAgICAgICBpbnQgY29kZXB0ID0gMDsKLSAgICAgICAgICAgIEJpdG1hcCBibSA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChoYXNUYWJzICYmIHBvcyA8IGxlbikgewotICAgICAgICAgICAgICAgIGNvZGVwdCA9IGJ1Zltwb3NdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbiBzcGFuID0gc3BhbnNbaV07CisgICAgICAgICAgICBib29sZWFuIHVzZUZpcnN0TGluZU1hcmdpbiA9IGlzRmlyc3RQYXJhTGluZTsKKyAgICAgICAgICAgIGlmIChzcGFuIGluc3RhbmNlb2YgTGVhZGluZ01hcmdpblNwYW4yKSB7CisgICAgICAgICAgICAgICAgaW50IHNwU3RhcnQgPSBzcGFubmVkLmdldFNwYW5TdGFydChzcGFuKTsKKyAgICAgICAgICAgICAgICBpbnQgc3BhbkxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KHNwU3RhcnQpOworICAgICAgICAgICAgICAgIGludCBjb3VudCA9ICgoTGVhZGluZ01hcmdpblNwYW4yKXNwYW4pLmdldExlYWRpbmdNYXJnaW5MaW5lQ291bnQoKTsKKyAgICAgICAgICAgICAgICB1c2VGaXJzdExpbmVNYXJnaW4gPSBsaW5lIDwgc3BhbkxpbmUgKyBjb3VudDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hcmdpbiArPSBzcGFuLmdldExlYWRpbmdNYXJnaW4odXNlRmlyc3RMaW5lTWFyZ2luKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoY29kZXB0ID49IDB4RDgwMCAmJiBjb2RlcHQgPD0gMHhERkZGICYmIHBvcyA8IGxlbikgewotICAgICAgICAgICAgICAgIGNvZGVwdCA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChidWYsIHBvcyk7CisgICAgICAgIHJldHVybiBtYXJnaW47CisgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA+PSBNSU5fRU1PSkkgJiYgY29kZXB0IDw9IE1BWF9FTU9KSSkgewotICAgICAgICAgICAgICAgICAgICBibSA9IEVNT0pJX0ZBQ1RPUlkuZ2V0Qml0bWFwRnJvbUFuZHJvaWRQdWEoY29kZXB0KTsKKyAgICAvKiBwYWNrYWdlICovCisgICAgc3RhdGljIGZsb2F0IG1lYXN1cmVQYXJhKFRleHRQYWludCBwYWludCwgVGV4dFBhaW50IHdvcmtQYWludCwKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKworICAgICAgICBNZWFzdXJlZFRleHQgbXQgPSBNZWFzdXJlZFRleHQub2J0YWluKCk7CisgICAgICAgIFRleHRMaW5lIHRsID0gVGV4dExpbmUub2J0YWluKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtdC5zZXRQYXJhKHRleHQsIHN0YXJ0LCBlbmQsIERJUl9SRVFVRVNUX0xUUik7CisgICAgICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnM7CisgICAgICAgICAgICBpbnQgZGlyOworICAgICAgICAgICAgaWYgKG10Lm1FYXN5KSB7CisgICAgICAgICAgICAgICAgZGlyZWN0aW9ucyA9IERJUlNfQUxMX0xFRlRfVE9fUklHSFQ7CisgICAgICAgICAgICAgICAgZGlyID0gTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hUOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkaXJlY3Rpb25zID0gQW5kcm9pZEJpZGkuZGlyZWN0aW9ucyhtdC5tRGlyLCBtdC5tTGV2ZWxzLAorICAgICAgICAgICAgICAgICAgICAwLCBtdC5tQ2hhcnMsIDAsIG10Lm1MZW4pOworICAgICAgICAgICAgICAgIGRpciA9IG10Lm1EaXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFyW10gY2hhcnMgPSBtdC5tQ2hhcnM7CisgICAgICAgICAgICBpbnQgbGVuID0gbXQubUxlbjsKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzVGFicyA9IGZhbHNlOworICAgICAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChjaGFyc1tpXSA9PSAnXHQnKSB7CisgICAgICAgICAgICAgICAgICAgIGhhc1RhYnMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uZWQgc3Bhbm5lZCA9IChTcGFubmVkKSB0ZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5FbmQgPSBzcGFubmVkLm5leHRTcGFuVHJhbnNpdGlvbihzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBUYWJTdG9wU3BhbltdIHNwYW5zID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3Bhbm5lZCwgc3RhcnQsIHNwYW5FbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgc3BhbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRsLnNldChwYWludCwgdGV4dCwgc3RhcnQsIGVuZCwgZGlyLCBkaXJlY3Rpb25zLCBoYXNUYWJzLCB0YWJTdG9wcyk7CisgICAgICAgICAgICByZXR1cm4gdGwubWV0cmljcyhudWxsKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIFRleHRMaW5lLnJlY3ljbGUodGwpOworICAgICAgICAgICAgTWVhc3VyZWRUZXh0LnJlY3ljbGUobXQpOworICAgICAgICB9CisgICAgfQogCi0gICAgICAgICAgICBpZiAocG9zID09IGxlbiB8fCBjb2RlcHQgPT0gJ1x0JyB8fCBibSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd29ya1BhaW50LmJhc2VsaW5lU2hpZnQgPSAwOworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgY2xhc3MgVGFiU3RvcHMgeworICAgICAgICBwcml2YXRlIGludFtdIG1TdG9wczsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU51bVN0b3BzOworICAgICAgICBwcml2YXRlIGludCBtSW5jcmVtZW50OwogCi0gICAgICAgICAgICAgICAgd2lkdGggKz0gU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBsYXN0UG9zLCBzdGFydCArIHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbSk7CisgICAgICAgIFRhYlN0b3BzKGludCBpbmNyZW1lbnQsIE9iamVjdFtdIHNwYW5zKSB7CisgICAgICAgICAgICByZXNldChpbmNyZW1lbnQsIHNwYW5zKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGZtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtQYWludC5iYXNlbGluZVNoaWZ0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm0uYXNjZW50ICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgZm0udG9wICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZm0uZGVzY2VudCArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLmJvdHRvbSArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgdm9pZCByZXNldChpbnQgaW5jcmVtZW50LCBPYmplY3RbXSBzcGFucykgeworICAgICAgICAgICAgdGhpcy5tSW5jcmVtZW50ID0gaW5jcmVtZW50OworCisgICAgICAgICAgICBpbnQgbnMgPSAwOworICAgICAgICAgICAgaWYgKHNwYW5zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnRbXSBzdG9wcyA9IHRoaXMubVN0b3BzOworICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG8gOiBzcGFucykgeworICAgICAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFRhYlN0b3BTcGFuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BzID0gbmV3IGludFsxMF07CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5zID09IHN0b3BzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIG5zdG9wcyA9IG5ldyBpbnRbbnMgKiAyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5zOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnN0b3BzW2ldID0gc3RvcHNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BzID0gbnN0b3BzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHNbbnMrK10gPSAoKFRhYlN0b3BTcGFuKSBvKS5nZXRUYWJTdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocG9zICE9IGxlbikgewotICAgICAgICAgICAgICAgICAgICBpZiAoYm0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZW1vamksIG11c3QgaGF2ZSBoaXQgYSB0YWIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gbmV4dFRhYih0ZXh0LCBzdGFydCwgZW5kLCB3aWR0aCwgdGFicyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNldHMgdXAgd29ya1BhaW50IHdpdGggdGhlIGZvbnQgb24gdGhlIGVtb2ppCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0LCBzbyB0aGF0IHdlIGNhbiBleHRyYWN0IHRoZSBhc2NlbnQgYW5kIHNjYWxlLgotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW4ndCB1c2UgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgY2FsbCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVhc3VyZVRleHQgYmVjYXVzZSB0aGUgZW1vamkgbWlnaHQgaGF2ZSBpdHMgb3duIHN0eWxlLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBpbml0aWFsaXplIHdvcmtQYWludCBoZXJlIGJlY2F1c2UgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0IGlzIHVuc3R5bGVkIG1lYXN1cmVUZXh0IG1pZ2h0IG5vdCB1c2Ugd29ya1BhaW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCBhbGwuCi0gICAgICAgICAgICAgICAgICAgICAgICB3b3JrUGFpbnQuc2V0KHBhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgcG9zLCBzdGFydCArIHBvcyArIDEsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCArPSAoZmxvYXQpIGJtLmdldFdpZHRoKCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdvcmtQYWludC5hc2NlbnQoKSAvIGJtLmdldEhlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBoYWQgYW4gZW1vamksIHdlIGJ1bXAgcGFzdCB0aGUgc2Vjb25kIGhhbGYKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBzdXJyb2dhdGUgcGFpci4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcysrOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5zID4gMSkgeworICAgICAgICAgICAgICAgICAgICBBcnJheXMuc29ydChzdG9wcywgMCwgbnMpOwogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChmbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmbS5hc2NlbnQgPCBhc2NlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzY2VudCA9IGZtLmFzY2VudDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZm0uZGVzY2VudCA+IGRlc2NlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NlbnQgPSBmbS5kZXNjZW50OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZtLnRvcCA8IHRvcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gZm0udG9wOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmbS5ib3R0b20gPiBib3R0b20pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSA9IGZtLmJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gdGFrZSBiaXRtYXAgaGVpZ2h0IGludG8gYWNjb3VudCBoZXJlLAotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBpdCBpcyBzY2FsZWQgdG8gbWF0Y2ggdGhlIHRleHQgaGVpZ2h0LgorICAgICAgICAgICAgICAgIGlmIChzdG9wcyAhPSB0aGlzLm1TdG9wcykgeworICAgICAgICAgICAgICAgICAgICB0aGlzLm1TdG9wcyA9IHN0b3BzOwogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxhc3RQb3MgPSBwb3MgKyAxOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5tTnVtU3RvcHMgPSBuczsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChmbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmbS5hc2NlbnQgPSBhc2NlbnQ7Ci0gICAgICAgICAgICBmbS5kZXNjZW50ID0gZGVzY2VudDsKLSAgICAgICAgICAgIGZtLnRvcCA9IHRvcDsKLSAgICAgICAgICAgIGZtLmJvdHRvbSA9IGJvdHRvbTsKKyAgICAgICAgZmxvYXQgbmV4dFRhYihmbG9hdCBoKSB7CisgICAgICAgICAgICBpbnQgbnMgPSB0aGlzLm1OdW1TdG9wczsKKyAgICAgICAgICAgIGlmIChucyA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnRbXSBzdG9wcyA9IHRoaXMubVN0b3BzOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgc3RvcCA9IHN0b3BzW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcCA+IGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9wOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5leHREZWZhdWx0U3RvcChoLCBtSW5jcmVtZW50KTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChoYXNUYWJzKQotICAgICAgICAgICAgVGV4dFV0aWxzLnJlY3ljbGUoYnVmKTsKLQotICAgICAgICByZXR1cm4gd2lkdGg7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgbmV4dERlZmF1bHRTdG9wKGZsb2F0IGgsIGludCBpbmMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKGludCkgKChoICsgaW5jKSAvIGluYykpICogaW5jOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzUxLDcgKzE1MTMsNyBAQAogCiAgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgewogICAgICAgICAgICAgaWYgKHRhYnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRhYnMgPSAoKFNwYW5uZWQpIHRleHQpLmdldFNwYW5zKHN0YXJ0LCBlbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB0YWJzID0gZ2V0UGFyYWdyYXBoU3BhbnMoKFNwYW5uZWQpIHRleHQsIHN0YXJ0LCBlbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKICAgICAgICAgICAgICAgICBhbGx0YWJzID0gdHJ1ZTsKICAgICAgICAgICAgIH0KIApAQCAtMTc3OCw2ICsxNTQwLDM4IEBACiAgICAgICAgIHJldHVybiBtU3Bhbm5lZFRleHQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2FtZSBhcyA8Y29kZT50ZXh0LmdldFNwYW5zKCk8L2NvZGU+LCBleGNlcHQgd2hlcmUKKyAgICAgKiA8Y29kZT5zdGFydDwvY29kZT4gYW5kIDxjb2RlPmVuZDwvY29kZT4gYXJlIHRoZSBzYW1lIGFuZCBhcmUgbm90CisgICAgICogYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0LCBpbiB3aGljaCBjYXNlIGFuIGVtcHR5IGFycmF5CisgICAgICogaXMgcmV0dXJuZWQgaW5zdGVhZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIG9mIHRoZSBzcGVjaWFsIGNhc2UgdGhhdCA8Y29kZT5nZXRTcGFucygpPC9jb2RlPgorICAgICAqIG9uIGFuIGVtcHR5IHJhbmdlIHJldHVybnMgdGhlIHNwYW5zIGFkamFjZW50IHRvIHRoYXQgcmFuZ2UsIHdoaWNoIGlzCisgICAgICogcHJpbWFyaWx5IGZvciB0aGUgc2FrZSBvZiA8Y29kZT5UZXh0V2F0Y2hlcnM8L2NvZGU+IHNvIHRoZXkgd2lsbCBnZXQKKyAgICAgKiBub3RpZmljYXRpb25zIHdoZW4gdGV4dCBnb2VzIGZyb20gZW1wdHkgdG8gbm9uLWVtcHR5LiAgQnV0IGl0IGFsc28KKyAgICAgKiBoYXMgdGhlIHVuZm9ydHVuYXRlIHNpZGUgZWZmZWN0IHRoYXQgaWYgdGhlIHRleHQgZW5kcyB3aXRoIGFuIGVtcHR5CisgICAgICogcGFyYWdyYXBoLCB0aGF0IHBhcmFncmFwaCBhY2NpZGVudGFsbHkgcGlja3MgdXAgdGhlIHN0eWxlcyBvZiB0aGUKKyAgICAgKiBwcmVjZWRpbmcgcGFyYWdyYXBoIChldmVuIHRob3VnaCB0aG9zZSBzdHlsZXMgd2lsbCBub3QgYmUgcGlja2VkIHVwCisgICAgICogYnkgbmV3IHRleHQgdGhhdCBpcyBpbnNlcnRlZCBpbnRvIHRoZSBlbXB0eSBwYXJhZ3JhcGgpLgorICAgICAqIDxwPgorICAgICAqIFRoZSByZWFzb24gaXQganVzdCBjaGVja3Mgd2hldGhlciA8Y29kZT5zdGFydDwvY29kZT4gYW5kIDxjb2RlPmVuZDwvY29kZT4KKyAgICAgKiBpcyB0aGUgc2FtZSBpcyB0aGF0IHRoZSBvbmx5IHRpbWUgYSBsaW5lIGNhbiBjb250YWluIDAgY2hhcmFjdGVycworICAgICAqIGlzIGlmIGl0IGlzIHRoZSBmaW5hbCBwYXJhZ3JhcGggb2YgdGhlIExheW91dDsgb3RoZXJ3aXNlIGFueSBsaW5lIHdpbGwKKyAgICAgKiBjb250YWluIGF0IGxlYXN0IG9uZSBwcmludGluZyBvciBuZXdsaW5lIGNoYXJhY3Rlci4gIFRoZSByZWFzb24gZm9yIHRoZQorICAgICAqIGFkZGl0aW9uYWwgY2hlY2sgaWYgPGNvZGU+c3RhcnQ8L2NvZGU+IGlzIGdyZWF0ZXIgdGhhbiAwIGlzIHRoYXQKKyAgICAgKiBpZiB0aGUgZW1wdHkgcGFyYWdyYXBoIGlzIHRoZSBlbnRpcmUgY29udGVudCBvZiB0aGUgYnVmZmVyLCBwYXJhZ3JhcGgKKyAgICAgKiBzdHlsZXMgdGhhdCBhcmUgYWxyZWFkeSBhcHBsaWVkIHRvIHRoZSBidWZmZXIgd2lsbCBhcHBseSB0byB0ZXh0IHRoYXQKKyAgICAgKiBpcyBpbnNlcnRlZCBpbnRvIGl0LgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIDxUPiBUW10gZ2V0UGFyYWdyYXBoU3BhbnMoU3Bhbm5lZCB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIENsYXNzPFQ+IHR5cGUpIHsKKyAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCAmJiBzdGFydCA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiAoVFtdKSBBcnJheVV0aWxzLmVtcHR5QXJyYXkodHlwZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGV4dC5nZXRTcGFucyhzdGFydCwgZW5kLCB0eXBlKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgZWxsaXBzaXplKGludCBzdGFydCwgaW50IGVuZCwgaW50IGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gZGVzdCwgaW50IGRlc3RvZmYpIHsKICAgICAgICAgaW50IGVsbGlwc2lzQ291bnQgPSBnZXRFbGxpcHNpc0NvdW50KGxpbmUpOwpAQCAtMTgwOCwyMyArMTYwMiwyMiBAQAogCiAgICAgLyoqCiAgICAgICogU3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGJpZGlyZWN0aW9uYWwgKGxlZnQtdG8tcmlnaHQgb3IgcmlnaHQtdG8tbGVmdCkKLSAgICAgKiB0ZXh0IHdpdGhpbiB0aGUgbGF5b3V0IG9mIGEgbGluZS4gIFRPRE86IFRoaXMgd29yayBpcyBub3QgY29tcGxldGUKLSAgICAgKiBvciBjb3JyZWN0IGFuZCB3aWxsIGJlIGZsZXNoZWQgb3V0IGluIGEgbGF0ZXIgcmV2aXNpb24uCisgICAgICogdGV4dCB3aXRoaW4gdGhlIGxheW91dCBvZiBhIGxpbmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEaXJlY3Rpb25zIHsKLSAgICAgICAgcHJpdmF0ZSBzaG9ydFtdIG1EaXJlY3Rpb25zOworICAgICAgICAvLyBEaXJlY3Rpb25zIHJlcHJlc2VudHMgZGlyZWN0aW9uYWwgcnVucyB3aXRoaW4gYSBsaW5lIG9mIHRleHQuCisgICAgICAgIC8vIFJ1bnMgYXJlIHBhaXJzIG9mIGludHMgbGlzdGVkIGluIHZpc3VhbCBvcmRlciwgc3RhcnRpbmcgZnJvbSB0aGUKKyAgICAgICAgLy8gbGVhZGluZyBtYXJnaW4uICBUaGUgZmlyc3QgaW50IG9mIGVhY2ggcGFpciBpcyB0aGUgb2Zmc2V0IGZyb20KKyAgICAgICAgLy8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgbGluZSB0byB0aGUgc3RhcnQgb2YgdGhlIHJ1bi4gIFRoZQorICAgICAgICAvLyBzZWNvbmQgaW50IHJlcHJlc2VudHMgYm90aCB0aGUgbGVuZ3RoIGFuZCBsZXZlbCBvZiB0aGUgcnVuLgorICAgICAgICAvLyBUaGUgbGVuZ3RoIGlzIGluIHRoZSBsb3dlciBiaXRzLCBhY2Nlc3NlZCBieSBtYXNraW5nIHdpdGgKKyAgICAgICAgLy8gRElSX0xFTkdUSF9NQVNLLiAgVGhlIGxldmVsIGlzIGluIHRoZSBoaWdoZXIgYml0cywgYWNjZXNzZWQKKyAgICAgICAgLy8gYnkgc2hpZnRpbmcgYnkgRElSX0xFVkVMX1NISUZUIGFuZCBtYXNraW5nIGJ5IERJUl9MRVZFTF9NQVNLLgorICAgICAgICAvLyBUbyBzaW1wbHkgdGVzdCBmb3IgYW4gUlRMIGRpcmVjdGlvbiwgdGVzdCB0aGUgYml0IHVzaW5nCisgICAgICAgIC8vIERJUl9SVExfRkxBRywgaWYgc2V0IHRoZW4gdGhlIGRpcmVjdGlvbiBpcyBydGwuCiAKLSAgICAgICAgLy8gVGhlIHZhbHVlcyBpbiBtRGlyZWN0aW9ucyBhcmUgdGhlIG9mZnNldHMgZnJvbSB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICAgICAgIC8vIGluIHRoZSBsaW5lIHRvIHRoZSBuZXh0IGZsaXAgaW4gZGlyZWN0aW9uLiAgUnVucyBhdCBldmVuIGluZGljZXMKLSAgICAgICAgLy8gYXJlIGxlZnQtdG8tcmlnaHQsIHRoZSBvdGhlcnMgYXJlIHJpZ2h0LXRvLWxlZnQuICBTbywgZm9yIGV4YW1wbGUsCi0gICAgICAgIC8vIGEgbGluZSB0aGF0IHN0YXJ0cyB3aXRoIGEgcmlnaHQtdG8tbGVmdCBydW4gaGFzIDAgYXQgbURpcmVjdGlvbnNbMF0sCi0gICAgICAgIC8vIHNpbmNlIHRoZSAnZmlyc3QnIChsdHIpIHJ1biBpcyB6ZXJvIGxlbmd0aC4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhlIGNvZGUgY3VycmVudGx5IGFzc3VtZXMgdGhhdCBlYWNoIHJ1biBpcyBhZGphY2VudCB0byB0aGUgcHJldmlvdXMKLSAgICAgICAgLy8gb25lLCBwcm9ncmVzc2luZyBpbiB0aGUgYmFzZSBsaW5lIGRpcmVjdGlvbi4gIFRoaXMgaXNuJ3Qgc3VmZmljaWVudAotICAgICAgICAvLyB0byBoYW5kbGUgbmVzdGVkIHJ1bnMsIGZvciBleGFtcGxlIG51bWVyaWMgdGV4dCBpbiBhbiBydGwgY29udGV4dAotICAgICAgICAvLyBpbiBhbiBsdHIgcGFyYWdyYXBoLgotICAgICAgICAvKiBwYWNrYWdlICovIERpcmVjdGlvbnMoc2hvcnRbXSBkaXJzKSB7CisgICAgICAgIC8qIHBhY2thZ2UgKi8gaW50W10gbURpcmVjdGlvbnM7CisgICAgICAgIC8qIHBhY2thZ2UgKi8gRGlyZWN0aW9ucyhpbnRbXSBkaXJzKSB7CiAgICAgICAgICAgICBtRGlyZWN0aW9ucyA9IGRpcnM7CiAgICAgICAgIH0KICAgICB9CkBAIC0xODM1LDYgKzE2MjgsNyBAQAogICAgICAqIGxpbmUgaXMgZWxsaXBzaXplZCwgbm90IGdldExpbmVTdGFydCgpLikKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEVsbGlwc2lzU3RhcnQoaW50IGxpbmUpOworCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgZWxsaXBzaXplZCBhd2F5LCBvciAwIGlmCiAgICAgICogbm8gZWxsaXBzaXMgaXMgdG8gdGFrZSBwbGFjZS4KQEAgLTE4NzQsNyArMTY2OCw3IEBACiAgICAgICAgIHB1YmxpYyBpbnQgbGVuZ3RoKCkgewogICAgICAgICAgICAgcmV0dXJuIG1UZXh0Lmxlbmd0aCgpOwogICAgICAgICB9Ci0gICAgCisKICAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZShpbnQgc3RhcnQsIGludCBlbmQpIHsKICAgICAgICAgICAgIGNoYXJbXSBzID0gbmV3IGNoYXJbZW5kIC0gc3RhcnRdOwogICAgICAgICAgICAgZ2V0Q2hhcnMoc3RhcnQsIGVuZCwgcywgMCk7CkBAIC0xOTM1LDE3ICsxNzI5LDIyIEBACiAgICAgcHJpdmF0ZSBBbGlnbm1lbnQgbUFsaWdubWVudCA9IEFsaWdubWVudC5BTElHTl9OT1JNQUw7CiAgICAgcHJpdmF0ZSBmbG9hdCBtU3BhY2luZ011bHQ7CiAgICAgcHJpdmF0ZSBmbG9hdCBtU3BhY2luZ0FkZDsKLSAgICBwcml2YXRlIHN0YXRpYyBSZWN0IHNUZW1wUmVjdCA9IG5ldyBSZWN0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVjdCBzVGVtcFJlY3QgPSBuZXcgUmVjdCgpOwogICAgIHByaXZhdGUgYm9vbGVhbiBtU3Bhbm5lZFRleHQ7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJfTEVGVF9UT19SSUdIVCA9IDE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSX1JJR0hUX1RPX0xFRlQgPSAtMTsKLSAgICAKKwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBESVJfUkVRVUVTVF9MVFIgPSAxOwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBESVJfUkVRVUVTVF9SVEwgPSAtMTsKICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgRElSX1JFUVVFU1RfREVGQVVMVF9MVFIgPSAyOwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBESVJfUkVRVUVTVF9ERUZBVUxUX1JUTCA9IC0yOwogCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFJVTl9MRU5HVEhfTUFTSyA9IDB4MDNmZmZmZmY7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFJVTl9MRVZFTF9TSElGVCA9IDI2OworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBSVU5fTEVWRUxfTUFTSyA9IDB4M2Y7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFJVTl9SVExfRkxBRyA9IDEgPDwgUlVOX0xFVkVMX1NISUZUOworCiAgICAgcHVibGljIGVudW0gQWxpZ25tZW50IHsKICAgICAgICAgQUxJR05fTk9STUFMLAogICAgICAgICBBTElHTl9PUFBPU0lURSwKQEAgLTE5NTcsOCArMTc1Niw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQl9JTkNSRU1FTlQgPSAyMDsKIAogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIERpcmVjdGlvbnMgRElSU19BTExfTEVGVF9UT19SSUdIVCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlyZWN0aW9ucyhuZXcgc2hvcnRbXSB7IDMyNzY3IH0pOworICAgICAgICBuZXcgRGlyZWN0aW9ucyhuZXcgaW50W10geyAwLCBSVU5fTEVOR1RIX01BU0sgfSk7CiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgRGlyZWN0aW9ucyBESVJTX0FMTF9SSUdIVF9UT19MRUZUID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaXJlY3Rpb25zKG5ldyBzaG9ydFtdIHsgMCwgMzI3NjcgfSk7Ci0KKyAgICAgICAgbmV3IERpcmVjdGlvbnMobmV3IGludFtdIHsgMCwgUlVOX0xFTkdUSF9NQVNLIHwgUlVOX1JUTF9GTEFHIH0pOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9NZWFzdXJlZFRleHQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTWVhc3VyZWRUZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU2OTlmMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTWVhc3VyZWRUZXh0LmphdmEKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGV4dDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLk1ldHJpY0FmZmVjdGluZ1NwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlJlcGxhY2VtZW50U3BhbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIEBoaWRlCisgKi8KK2NsYXNzIE1lYXN1cmVkVGV4dCB7CisgICAgLyogcGFja2FnZSAqLyBDaGFyU2VxdWVuY2UgbVRleHQ7CisgICAgLyogcGFja2FnZSAqLyBpbnQgbVRleHRTdGFydDsKKyAgICAvKiBwYWNrYWdlICovIGZsb2F0W10gbVdpZHRoczsKKyAgICAvKiBwYWNrYWdlICovIGNoYXJbXSBtQ2hhcnM7CisgICAgLyogcGFja2FnZSAqLyBieXRlW10gbUxldmVsczsKKyAgICAvKiBwYWNrYWdlICovIGludCBtRGlyOworICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbiBtRWFzeTsKKyAgICAvKiBwYWNrYWdlICovIGludCBtTGVuOworICAgIHByaXZhdGUgaW50IG1Qb3M7CisgICAgcHJpdmF0ZSBUZXh0UGFpbnQgbVdvcmtQYWludDsKKworICAgIHByaXZhdGUgTWVhc3VyZWRUZXh0KCkgeworICAgICAgICBtV29ya1BhaW50ID0gbmV3IFRleHRQYWludCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1lYXN1cmVkVGV4dFtdIGNhY2hlZCA9IG5ldyBNZWFzdXJlZFRleHRbM107CisKKyAgICAvKiBwYWNrYWdlICovCisgICAgc3RhdGljIE1lYXN1cmVkVGV4dCBvYnRhaW4oKSB7CisgICAgICAgIE1lYXN1cmVkVGV4dCBtdDsKKyAgICAgICAgc3luY2hyb25pemVkIChjYWNoZWQpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBjYWNoZWQubGVuZ3RoOyAtLWkgPj0gMDspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FjaGVkW2ldICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbXQgPSBjYWNoZWRbaV07CisgICAgICAgICAgICAgICAgICAgIGNhY2hlZFtpXSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbXQgPSBuZXcgTWVhc3VyZWRUZXh0KCk7CisgICAgICAgIExvZy5lKCJNRUFTIiwgIm5ldzogIiArIG10KTsKKyAgICAgICAgcmV0dXJuIG10OworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8KKyAgICBzdGF0aWMgTWVhc3VyZWRUZXh0IHJlY3ljbGUoTWVhc3VyZWRUZXh0IG10KSB7CisgICAgICAgIG10Lm1UZXh0ID0gbnVsbDsKKyAgICAgICAgaWYgKG10Lm1MZW4gPCAxMDAwKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQoY2FjaGVkKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWNoZWQubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZFtpXSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRbaV0gPSBtdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFuYWx5emVzIHRleHQgZm9yIGJpZGlyZWN0aW9uYWwgcnVucy4gIEFsbG9jYXRlcyB3b3JraW5nIGJ1ZmZlcnMuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLworICAgIHZvaWQgc2V0UGFyYShDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgYmlkaVJlcXVlc3QpIHsKKyAgICAgICAgbVRleHQgPSB0ZXh0OworICAgICAgICBtVGV4dFN0YXJ0ID0gc3RhcnQ7CisKKyAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICBtTGVuID0gbGVuOworICAgICAgICBtUG9zID0gMDsKKworICAgICAgICBpZiAobVdpZHRocyA9PSBudWxsIHx8IG1XaWR0aHMubGVuZ3RoIDwgbGVuKSB7CisgICAgICAgICAgICBtV2lkdGhzID0gbmV3IGZsb2F0W0FycmF5VXRpbHMuaWRlYWxGbG9hdEFycmF5U2l6ZShsZW4pXTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNoYXJzID09IG51bGwgfHwgbUNoYXJzLmxlbmd0aCA8IGxlbikgeworICAgICAgICAgICAgbUNoYXJzID0gbmV3IGNoYXJbQXJyYXlVdGlscy5pZGVhbENoYXJBcnJheVNpemUobGVuKV07CisgICAgICAgIH0KKyAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIG1DaGFycywgMCk7CisKKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CisgICAgICAgICAgICBTcGFubmVkIHNwYW5uZWQgPSAoU3Bhbm5lZCkgdGV4dDsKKyAgICAgICAgICAgIFJlcGxhY2VtZW50U3BhbltdIHNwYW5zID0gc3Bhbm5lZC5nZXRTcGFucyhzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgICAgICBSZXBsYWNlbWVudFNwYW4uY2xhc3MpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0SW5QYXJhID0gc3Bhbm5lZC5nZXRTcGFuU3RhcnQoc3BhbnNbaV0pIC0gc3RhcnQ7CisgICAgICAgICAgICAgICAgaW50IGVuZEluUGFyYSA9IHNwYW5uZWQuZ2V0U3BhbkVuZChzcGFuc1tpXSkgLSBzdGFydDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gc3RhcnRJblBhcmE7IGogPCBlbmRJblBhcmE7IGorKykgeworICAgICAgICAgICAgICAgICAgICBtQ2hhcnNbal0gPSAnXHVGRkZDJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoVGV4dFV0aWxzLmRvZXNOb3ROZWVkQmlkaShtQ2hhcnMsIDAsIGxlbikpIHsKKyAgICAgICAgICAgIG1EaXIgPSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQ7CisgICAgICAgICAgICBtRWFzeSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobUxldmVscyA9PSBudWxsIHx8IG1MZXZlbHMubGVuZ3RoIDwgbGVuKSB7CisgICAgICAgICAgICAgICAgbUxldmVscyA9IG5ldyBieXRlW0FycmF5VXRpbHMuaWRlYWxCeXRlQXJyYXlTaXplKGxlbildOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURpciA9IEFuZHJvaWRCaWRpLmJpZGkoYmlkaVJlcXVlc3QsIG1DaGFycywgbUxldmVscywgbGVuLCBmYWxzZSk7CisgICAgICAgICAgICBtRWFzeSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgYWRkU3R5bGVSdW4oVGV4dFBhaW50IHBhaW50LCBpbnQgbGVuLCBQYWludC5Gb250TWV0cmljc0ludCBmbSkgeworICAgICAgICBpZiAoZm0gIT0gbnVsbCkgeworICAgICAgICAgICAgcGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm0pOworICAgICAgICB9CisKKyAgICAgICAgaW50IHAgPSBtUG9zOworICAgICAgICBtUG9zID0gcCArIGxlbjsKKworICAgICAgICBpZiAobUVhc3kpIHsKKyAgICAgICAgICAgIGludCBmbGFncyA9IG1EaXIgPT0gTGF5b3V0LkRJUl9MRUZUX1RPX1JJR0hUCisgICAgICAgICAgICAgICAgPyBDYW52YXMuRElSRUNUSU9OX0xUUiA6IENhbnZhcy5ESVJFQ1RJT05fUlRMOworICAgICAgICAgICAgcmV0dXJuIHBhaW50LmdldFRleHRSdW5BZHZhbmNlcyhtQ2hhcnMsIHAsIGxlbiwgcCwgbGVuLCBmbGFncywgbVdpZHRocywgcCk7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCB0b3RhbEFkdmFuY2UgPSAwOworICAgICAgICBpbnQgbGV2ZWwgPSBtTGV2ZWxzW3BdOworICAgICAgICBmb3IgKGludCBxID0gcCwgaSA9IHAgKyAxLCBlID0gcCArIGxlbjs7ICsraSkgeworICAgICAgICAgICAgaWYgKGkgPT0gZSB8fCBtTGV2ZWxzW2ldICE9IGxldmVsKSB7CisgICAgICAgICAgICAgICAgaW50IGZsYWdzID0gKGxldmVsICYgMHgxKSA9PSAwID8gQ2FudmFzLkRJUkVDVElPTl9MVFIgOiBDYW52YXMuRElSRUNUSU9OX1JUTDsKKyAgICAgICAgICAgICAgICB0b3RhbEFkdmFuY2UgKz0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50LmdldFRleHRSdW5BZHZhbmNlcyhtQ2hhcnMsIHEsIGkgLSBxLCBxLCBpIC0gcSwgZmxhZ3MsIG1XaWR0aHMsIHEpOworICAgICAgICAgICAgICAgIGlmIChpID09IGUpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHEgPSBpOworICAgICAgICAgICAgICAgIGxldmVsID0gbUxldmVsc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG90YWxBZHZhbmNlOworICAgIH0KKworICAgIGZsb2F0IGFkZFN0eWxlUnVuKFRleHRQYWludCBwYWludCwgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zLCBpbnQgbGVuLAorICAgICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm0pIHsKKworICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50ID0gbVdvcmtQYWludDsKKyAgICAgICAgd29ya1BhaW50LnNldChwYWludCk7CisgICAgICAgIC8vIFhYWCBwYWludCBzaG91bGQgbm90IGhhdmUgYSBiYXNlbGluZSBzaGlmdCwgYnV0Li4uCisgICAgICAgIHdvcmtQYWludC5iYXNlbGluZVNoaWZ0ID0gMDsKKworICAgICAgICBSZXBsYWNlbWVudFNwYW4gcmVwbGFjZW1lbnQgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuIHNwYW4gPSBzcGFuc1tpXTsKKyAgICAgICAgICAgIGlmIChzcGFuIGluc3RhbmNlb2YgUmVwbGFjZW1lbnRTcGFuKSB7CisgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAoUmVwbGFjZW1lbnRTcGFuKXNwYW47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNwYW4udXBkYXRlTWVhc3VyZVN0YXRlKHdvcmtQYWludCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCB3aWQ7CisgICAgICAgIGlmIChyZXBsYWNlbWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICB3aWQgPSBhZGRTdHlsZVJ1bih3b3JrUGFpbnQsIGxlbiwgZm0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVXNlIG9yaWdpbmFsIHRleHQuICBTaG91bGRuJ3QgbWF0dGVyLgorICAgICAgICAgICAgd2lkID0gcmVwbGFjZW1lbnQuZ2V0U2l6ZSh3b3JrUGFpbnQsIG1UZXh0LCBtVGV4dFN0YXJ0ICsgbVBvcywKKyAgICAgICAgICAgICAgICAgICAgbVRleHRTdGFydCArIG1Qb3MgKyBsZW4sIGZtKTsKKyAgICAgICAgICAgIGZsb2F0W10gdyA9IG1XaWR0aHM7CisgICAgICAgICAgICB3W21Qb3NdID0gd2lkOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Qb3MgKyAxLCBlID0gbVBvcyArIGxlbjsgaSA8IGU7IGkrKykKKyAgICAgICAgICAgICAgICB3W2ldID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmbSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAod29ya1BhaW50LmJhc2VsaW5lU2hpZnQgPCAwKSB7CisgICAgICAgICAgICAgICAgZm0uYXNjZW50ICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OworICAgICAgICAgICAgICAgIGZtLnRvcCArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm0uZGVzY2VudCArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgICAgICAgICBmbS5ib3R0b20gKz0gd29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gd2lkOworICAgIH0KKworICAgIGludCBicmVha1RleHQoaW50IHN0YXJ0LCBpbnQgbGltaXQsIGJvb2xlYW4gZm9yd2FyZHMsIGZsb2F0IHdpZHRoKSB7CisgICAgICAgIGZsb2F0W10gdyA9IG1XaWR0aHM7CisgICAgICAgIGlmIChmb3J3YXJkcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgbGltaXQ7ICsraSkgeworICAgICAgICAgICAgICAgIGlmICgod2lkdGggLT0gd1tpXSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpIC0gc3RhcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGxpbWl0OyAtLWkgPj0gc3RhcnQ7KSB7CisgICAgICAgICAgICAgICAgaWYgKCh3aWR0aCAtPSB3W2ldKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0IC0gaSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbGltaXQgLSBzdGFydDsKKyAgICB9CisKKyAgICBmbG9hdCBtZWFzdXJlKGludCBzdGFydCwgaW50IGxpbWl0KSB7CisgICAgICAgIGZsb2F0IHdpZHRoID0gMDsKKyAgICAgICAgZmxvYXRbXSB3ID0gbVdpZHRoczsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgbGltaXQ7ICsraSkgeworICAgICAgICAgICAgd2lkdGggKz0gd1tpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd2lkdGg7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5hYmxlU3RyaW5nQnVpbGRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmFibGVTdHJpbmdCdWlsZGVyLmphdmEKaW5kZXggY2FhYWZhMS4uZmMwMWVmMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmFibGVTdHJpbmdCdWlsZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmFibGVTdHJpbmdCdWlsZGVyLmphdmEKQEAgLTE3LDggKzE3LDkgQEAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CisKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CiAKQEAgLTMxMiwxMiArMzEzLDE1IEBACiAKICAgICAgICAgbW92ZUdhcFRvKGVuZCk7CiAKLSAgICAgICAgaWYgKHRiZW5kIC0gdGJzdGFydCA+PSBtR2FwTGVuZ3RoICsgKGVuZCAtIHN0YXJ0KSkKLSAgICAgICAgICAgIHJlc2l6ZUZvcihtVGV4dC5sZW5ndGggLSBtR2FwTGVuZ3RoICsKLSAgICAgICAgICAgICAgICAgICAgICB0YmVuZCAtIHRic3RhcnQgLSAoZW5kIC0gc3RhcnQpKTsKKyAgICAgICAgLy8gQ2FuIGJlIG5lZ2F0aXZlCisgICAgICAgIGZpbmFsIGludCBuYk5ld0NoYXJzID0gKHRiZW5kIC0gdGJzdGFydCkgLSAoZW5kIC0gc3RhcnQpOwogCi0gICAgICAgIG1HYXBTdGFydCArPSB0YmVuZCAtIHRic3RhcnQgLSAoZW5kIC0gc3RhcnQpOwotICAgICAgICBtR2FwTGVuZ3RoIC09IHRiZW5kIC0gdGJzdGFydCAtIChlbmQgLSBzdGFydCk7CisgICAgICAgIGlmIChuYk5ld0NoYXJzID49IG1HYXBMZW5ndGgpIHsKKyAgICAgICAgICAgIHJlc2l6ZUZvcihtVGV4dC5sZW5ndGggKyBuYk5ld0NoYXJzIC0gbUdhcExlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBtR2FwU3RhcnQgKz0gbmJOZXdDaGFyczsKKyAgICAgICAgbUdhcExlbmd0aCAtPSBuYk5ld0NoYXJzOwogCiAgICAgICAgIGlmIChtR2FwTGVuZ3RoIDwgMSkKICAgICAgICAgICAgIG5ldyBFeGNlcHRpb24oIm1HYXBMZW5ndGggPCAxIikucHJpbnRTdGFja1RyYWNlKCk7CkBAIC03MDcsNiArNzExLDcgQEAKICAgICAgKiB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mIHRoZSBidWZmZXIuICBUaGUga2luZCBtYXkgYmUgT2JqZWN0LmNsYXNzIHRvIGdldAogICAgICAqIGEgbGlzdCBvZiBhbGwgdGhlIHNwYW5zIHJlZ2FyZGxlc3Mgb2YgdHlwZS4KICAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgPFQ+IFRbXSBnZXRTcGFucyhpbnQgcXVlcnlTdGFydCwgaW50IHF1ZXJ5RW5kLCBDbGFzczxUPiBraW5kKSB7CiAgICAgICAgIGludCBzcGFuQ291bnQgPSBtU3BhbkNvdW50OwogICAgICAgICBPYmplY3RbXSBzcGFucyA9IG1TcGFuczsKQEAgLTcxNyw4ICs3MjIsOCBAQAogICAgICAgICBpbnQgZ2FwbGVuID0gbUdhcExlbmd0aDsKIAogICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBPYmplY3RbXSByZXQgPSBudWxsOwotICAgICAgICBPYmplY3QgcmV0MSA9IG51bGw7CisgICAgICAgIFRbXSByZXQgPSBudWxsOworICAgICAgICBUIHJldDEgPSBudWxsOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbkNvdW50OyBpKyspIHsKICAgICAgICAgICAgIGludCBzcGFuU3RhcnQgPSBzdGFydHNbaV07CkBAIC03NTAsMTEgKzc1NSwxMyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldDEgPSBzcGFuc1tpXTsKKyAgICAgICAgICAgICAgICAvLyBTYWZlIGNvbnZlcnNpb24gdGhhbmtzIHRvIHRoZSBpc0luc3RhbmNlIHRlc3QgYWJvdmUKKyAgICAgICAgICAgICAgICByZXQxID0gKFQpIHNwYW5zW2ldOwogICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2Uoa2luZCwgc3BhbkNvdW50IC0gaSArIDEpOworICAgICAgICAgICAgICAgICAgICAvLyBTYWZlIGNvbnZlcnNpb24sIGJ1dCByZXF1aXJlcyBhIHN1cHByZXNzV2FybmluZworICAgICAgICAgICAgICAgICAgICByZXQgPSAoVFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCBzcGFuQ291bnQgLSBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgIHJldFswXSA9IHJldDE7CiAgICAgICAgICAgICAgICAgfQogCkBAIC03NzEsMjkgKzc3OCwzMyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXQsIGosIHJldCwgaiArIDEsIGNvdW50IC0gaik7Ci0gICAgICAgICAgICAgICAgICAgIHJldFtqXSA9IHNwYW5zW2ldOworICAgICAgICAgICAgICAgICAgICAvLyBTYWZlIGNvbnZlcnNpb24gdGhhbmtzIHRvIHRoZSBpc0luc3RhbmNlIHRlc3QgYWJvdmUKKyAgICAgICAgICAgICAgICAgICAgcmV0W2pdID0gKFQpIHNwYW5zW2ldOwogICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldFtjb3VudCsrXSA9IHNwYW5zW2ldOworICAgICAgICAgICAgICAgICAgICAvLyBTYWZlIGNvbnZlcnNpb24gdGhhbmtzIHRvIHRoZSBpc0luc3RhbmNlIHRlc3QgYWJvdmUKKyAgICAgICAgICAgICAgICAgICAgcmV0W2NvdW50KytdID0gKFQpIHNwYW5zW2ldOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFRbXSkgQXJyYXlVdGlscy5lbXB0eUFycmF5KGtpbmQpOworICAgICAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuZW1wdHlBcnJheShraW5kKTsKICAgICAgICAgfQogICAgICAgICBpZiAoY291bnQgPT0gMSkgewotICAgICAgICAgICAgcmV0ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCAxKTsKKyAgICAgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiwgYnV0IHJlcXVpcmVzIGEgc3VwcHJlc3NXYXJuaW5nCisgICAgICAgICAgICByZXQgPSAoVFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCAxKTsKICAgICAgICAgICAgIHJldFswXSA9IHJldDE7Ci0gICAgICAgICAgICByZXR1cm4gKFRbXSkgcmV0OworICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgICAgICBpZiAoY291bnQgPT0gcmV0Lmxlbmd0aCkgewotICAgICAgICAgICAgcmV0dXJuIChUW10pIHJldDsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KIAotICAgICAgICBPYmplY3RbXSBucmV0ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCBjb3VudCk7CisgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiwgYnV0IHJlcXVpcmVzIGEgc3VwcHJlc3NXYXJuaW5nCisgICAgICAgIFRbXSBucmV0ID0gKFRbXSkgQXJyYXkubmV3SW5zdGFuY2Uoa2luZCwgY291bnQpOwogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJldCwgMCwgbnJldCwgMCwgY291bnQpOwotICAgICAgICByZXR1cm4gKFRbXSkgbnJldDsKKyAgICAgICAgcmV0dXJuIG5yZXQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NjIsNiArODczLDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYSBTdHJpbmcgY29udGFpbmluZyBhIGNvcHkgb2YgdGhlIGNoYXJzIGluIHRoaXMgYnVmZmVyLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIGludCBsZW4gPSBsZW5ndGgoKTsKICAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyW2xlbl07CkBAIC05NTIsNiArOTY0LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorLyoKICAgICBwcml2YXRlIGJvb2xlYW4gaXNwcmludChjaGFyIGMpIHsgLy8gWFhYCiAgICAgICAgIGlmIChjID49ICcgJyAmJiBjIDw9ICd+JykKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtOTU5LDcgKzk3Miw2IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0vKgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzdGFydEZsYWcoaW50IGZsYWcpIHsKICAgICAgICAgcmV0dXJuIChmbGFnID4+IDQpICYgMHgwRjsKICAgICB9CkBAIC0xMDU0LDcgKzEwNjYsMzIgQEAKICAgICAgICAgfQogICAgIH0KIAorCiAgICAgLyoqCisgICAgICogRG9uJ3QgY2FsbCB0aGlzIHlvdXJzZWxmIC0tIGV4aXN0cyBmb3IgQ2FudmFzIHRvIHVzZSBpbnRlcm5hbGx5LgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dFJ1bihDYW52YXMgYywgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZmxhZ3MsIFBhaW50IHApIHsKKyAgICAgICAgY2hlY2tSYW5nZSgiZHJhd1RleHRSdW4iLCBzdGFydCwgZW5kKTsKKworICAgICAgICBpbnQgY29udGV4dExlbiA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgaWYgKGNvbnRleHRFbmQgPD0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICBjLmRyYXdUZXh0UnVuKG1UZXh0LCBzdGFydCwgbGVuLCBjb250ZXh0U3RhcnQsIGNvbnRleHRMZW4sIHgsIHksIGZsYWdzLCBwKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0U3RhcnQgPj0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICBjLmRyYXdUZXh0UnVuKG1UZXh0LCBzdGFydCArIG1HYXBMZW5ndGgsIGxlbiwgY29udGV4dFN0YXJ0ICsgbUdhcExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dExlbiwgeCwgeSwgZmxhZ3MsIHApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRleHRVdGlscy5vYnRhaW4oY29udGV4dExlbik7CisgICAgICAgICAgICBnZXRDaGFycyhjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGJ1ZiwgMCk7CisgICAgICAgICAgICBjLmRyYXdUZXh0UnVuKGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwgMCwgY29udGV4dExlbiwgeCwgeSwgZmxhZ3MsIHApOworICAgICAgICAgICAgVGV4dFV0aWxzLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgLyoqCiAgICAgICogRG9uJ3QgY2FsbCB0aGlzIHlvdXJzZWxmIC0tIGV4aXN0cyBmb3IgUGFpbnQgdG8gdXNlIGludGVybmFsbHkuCiAgICAgICoge0BoaWRlfQogICAgICAqLwpAQCAtMTEwMyw2ICsxMTQwLDU4IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogRG9uJ3QgY2FsbCB0aGlzIHlvdXJzZWxmIC0tIGV4aXN0cyBmb3IgUGFpbnQgdG8gdXNlIGludGVybmFsbHkuCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXMoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLAorICAgICAgICAgICAgZmxvYXRbXSBhZHZhbmNlcywgaW50IGFkdmFuY2VzUG9zLCBQYWludCBwKSB7CisKKyAgICAgICAgZmxvYXQgcmV0OworCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworCisgICAgICAgIGlmIChlbmQgPD0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICByZXQgPSBwLmdldFRleHRSdW5BZHZhbmNlcyhtVGV4dCwgc3RhcnQsIGxlbiwgY29udGV4dFN0YXJ0LCBjb250ZXh0TGVuLAorICAgICAgICAgICAgICAgICAgICBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzUG9zKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGFydCA+PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1UZXh0LCBzdGFydCArIG1HYXBMZW5ndGgsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0ICsgbUdhcExlbmd0aCwgY29udGV4dExlbiwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc1Bvcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gVGV4dFV0aWxzLm9idGFpbihjb250ZXh0TGVuKTsKKyAgICAgICAgICAgIGdldENoYXJzKGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYnVmLCAwKTsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkFkdmFuY2VzKGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgMCwgY29udGV4dExlbiwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc1Bvcyk7CisgICAgICAgICAgICBUZXh0VXRpbHMucmVjeWNsZShidWYpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywgaW50IG9mZnNldCwKKyAgICAgICAgICAgIGludCBjdXJzb3JPcHQsIFBhaW50IHApIHsKKworICAgICAgICBpbnQgcmV0OworCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgaWYgKGNvbnRleHRFbmQgPD0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICByZXQgPSBwLmdldFRleHRSdW5DdXJzb3IobVRleHQsIGNvbnRleHRTdGFydCwgY29udGV4dExlbiwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0U3RhcnQgPj0gbUdhcFN0YXJ0KSB7CisgICAgICAgICAgICByZXQgPSBwLmdldFRleHRSdW5DdXJzb3IobVRleHQsIGNvbnRleHRTdGFydCArIG1HYXBMZW5ndGgsIGNvbnRleHRMZW4sCisgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBvZmZzZXQgKyBtR2FwTGVuZ3RoLCBjdXJzb3JPcHQpIC0gbUdhcExlbmd0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBUZXh0VXRpbHMub2J0YWluKGNvbnRleHRMZW4pOworICAgICAgICAgICAgZ2V0Q2hhcnMoY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBidWYsIDApOworICAgICAgICAgICAgcmV0ID0gcC5nZXRUZXh0UnVuQ3Vyc29yKGJ1ZiwgMCwgY29udGV4dExlbiwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZnNldCAtIGNvbnRleHRTdGFydCwgY3Vyc29yT3B0KSArIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIFRleHRVdGlscy5yZWN5Y2xlKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKwogICAgIC8vIERvY3VtZW50YXRpb24gZnJvbSBpbnRlcmZhY2UKICAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJzKElucHV0RmlsdGVyW10gZmlsdGVycykgewogICAgICAgICBpZiAoZmlsdGVycyA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5uZWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5lZC5qYXZhCmluZGV4IDE1NDQ5N2QuLmQxNGZjYmMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5lZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5lZC5qYXZhCkBAIC05MSw3ICs5MSw3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFID0gU1BBTl9QT0lOVF9NQVJLOwogCiAgICAgLyoqCi0gICAgICogTm9uLTAtbGVuZ3RoIHNwYW5zIG9mIHR5cGUgU1BBTl9JTkNMVVNJVkVfRVhDTFVTSVZFIGV4cGFuZAorICAgICAqIE5vbi0wLWxlbmd0aCBzcGFucyBvZiB0eXBlIFNQQU5fRVhDTFVTSVZFX0lOQ0xVU0lWRSBleHBhbmQKICAgICAgKiB0byBpbmNsdWRlIHRleHQgaW5zZXJ0ZWQgYXQgdGhlaXIgZW5kaW5nIHBvaW50IGJ1dCBub3QgYXQgdGhlaXIKICAgICAgKiBzdGFydGluZyBwb2ludC4gIFdoZW4gMC1sZW5ndGgsIHRoZXkgYmVoYXZlIGxpa2UgcG9pbnRzLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0LmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBkMGQyNDgyLi5jYzk2OWNiCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXQuamF2YQpAQCAtMTYsMTQgKzE2LDE1IEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOworCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTGVhZGluZ01hcmdpblNwYW47CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkxpbmVIZWlnaHRTcGFuOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5NZXRyaWNBZmZlY3RpbmdTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5SZXBsYWNlbWVudFNwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlRhYlN0b3BTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5MZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjI7CiAKIC8qKgogICogU3RhdGljTGF5b3V0IGlzIGEgTGF5b3V0IGZvciB0ZXh0IHRoYXQgd2lsbCBub3QgYmUgZWRpdGVkIGFmdGVyIGl0CkBAIC0zMSw4ICszMiw5IEBACiAgKiA8cD5UaGlzIGlzIHVzZWQgYnkgd2lkZ2V0cyB0byBjb250cm9sIHRleHQgbGF5b3V0LiBZb3Ugc2hvdWxkIG5vdCBuZWVkCiAgKiB0byB1c2UgdGhpcyBjbGFzcyBkaXJlY3RseSB1bmxlc3MgeW91IGFyZSBpbXBsZW1lbnRpbmcgeW91ciBvd24gd2lkZ2V0CiAgKiBvciBjdXN0b20gZGlzcGxheSBvYmplY3QsIG9yIHdvdWxkIGJlIHRlbXB0ZWQgdG8gY2FsbAotICoge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzI2RyYXdUZXh0KGphdmEubGFuZy5DaGFyU2VxdWVuY2UsIGludCwgaW50LCBmbG9hdCwgZmxvYXQsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0gKiAgQ2FudmFzLmRyYXdUZXh0KCl9IGRpcmVjdGx5LjwvcD4KKyAqIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyNkcmF3VGV4dChqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLCBpbnQsIGludCwKKyAqIGZsb2F0LCBmbG9hdCwgYW5kcm9pZC5ncmFwaGljcy5QYWludCkKKyAqIENhbnZhcy5kcmF3VGV4dCgpfSBkaXJlY3RseS48L3A+CiAgKi8KIHB1YmxpYyBjbGFzcwogU3RhdGljTGF5b3V0CkBAIC02Miw3ICs2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluY2x1ZGVwYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuVHJ1bmNhdGVBdCBlbGxpcHNpemUsIGludCBlbGxpcHNpemVkV2lkdGgpIHsKICAgICAgICAgc3VwZXIoKGVsbGlwc2l6ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgID8gc291cmNlIAorICAgICAgICAgICAgICAgID8gc291cmNlCiAgICAgICAgICAgICAgICAgOiAoc291cmNlIGluc3RhbmNlb2YgU3Bhbm5lZCkKICAgICAgICAgICAgICAgICAgICAgPyBuZXcgU3Bhbm5lZEVsbGlwc2l6ZXIoc291cmNlKQogICAgICAgICAgICAgICAgICAgICA6IG5ldyBFbGxpcHNpemVyKHNvdXJjZSksCkBAIC03Miw3ICs3NCw3IEBACiAgICAgICAgICAqIFRoaXMgaXMgYW5ub3lpbmcsIGJ1dCB3ZSBjYW4ndCByZWZlciB0byB0aGUgbGF5b3V0IHVudGlsCiAgICAgICAgICAqIHN1cGVyY2xhc3MgY29uc3RydWN0aW9uIGlzIGZpbmlzaGVkLCBhbmQgdGhlIHN1cGVyY2xhc3MKICAgICAgICAgICogY29uc3RydWN0b3Igd2FudHMgdGhlIHJlZmVyZW5jZSB0byB0aGUgZGlzcGxheSB0ZXh0LgotICAgICAgICAgKiAKKyAgICAgICAgICoKICAgICAgICAgICogVGhpcyB3aWxsIGJyZWFrIGlmIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yIGV2ZXIgYWN0dWFsbHkKICAgICAgICAgICogY2FyZXMgYWJvdXQgdGhlIGNvbnRlbnQgaW5zdGVhZCBvZiBqdXN0IGhvbGRpbmcgdGhlIHJlZmVyZW5jZS4KICAgICAgICAgICovCkBAIC05NCwxMyArOTYsMTMgQEAKICAgICAgICAgbUxpbmVEaXJlY3Rpb25zID0gbmV3IERpcmVjdGlvbnNbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUoMiAqIG1Db2x1bW5zKV07CiAKKyAgICAgICAgbU1lYXN1cmVkID0gTWVhc3VyZWRUZXh0Lm9idGFpbigpOworCiAgICAgICAgIGdlbmVyYXRlKHNvdXJjZSwgYnVmc3RhcnQsIGJ1ZmVuZCwgcGFpbnQsIG91dGVyd2lkdGgsIGFsaWduLAogICAgICAgICAgICAgICAgICBzcGFjaW5nbXVsdCwgc3BhY2luZ2FkZCwgaW5jbHVkZXBhZCwgaW5jbHVkZXBhZCwKICAgICAgICAgICAgICAgICAgZWxsaXBzaXplICE9IG51bGwsIGVsbGlwc2l6ZWRXaWR0aCwgZWxsaXBzaXplKTsKIAotICAgICAgICBtQ2hkaXJzID0gbnVsbDsKLSAgICAgICAgbUNocyA9IG51bGw7Ci0gICAgICAgIG1XaWR0aHMgPSBudWxsOworICAgICAgICBtTWVhc3VyZWQgPSBNZWFzdXJlZFRleHQucmVjeWNsZShtTWVhc3VyZWQpOwogICAgICAgICBtRm9udE1ldHJpY3NJbnQgPSBudWxsOwogICAgIH0KIApAQCAtMTExLDYgKzExMyw3IEBACiAgICAgICAgIG1MaW5lcyA9IG5ldyBpbnRbQXJyYXlVdGlscy5pZGVhbEludEFycmF5U2l6ZSgyICogbUNvbHVtbnMpXTsKICAgICAgICAgbUxpbmVEaXJlY3Rpb25zID0gbmV3IERpcmVjdGlvbnNbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUoMiAqIG1Db2x1bW5zKV07CisgICAgICAgIG1NZWFzdXJlZCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKICAgICB9CiAKICAgICAvKiBwYWNrYWdlICovIHZvaWQgZ2VuZXJhdGUoQ2hhclNlcXVlbmNlIHNvdXJjZSwgaW50IGJ1ZnN0YXJ0LCBpbnQgYnVmZW5kLApAQCAtMTI4LDU5ICsxMzEsNTAgQEAKICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm0gPSBtRm9udE1ldHJpY3NJbnQ7CiAgICAgICAgIGludFtdIGNob29zZWh0diA9IG51bGw7CiAKLSAgICAgICAgaW50IGVuZCA9IFRleHRVdGlscy5pbmRleE9mKHNvdXJjZSwgJ1xuJywgYnVmc3RhcnQsIGJ1ZmVuZCk7Ci0gICAgICAgIGludCBidWZzaXogPSBlbmQgPj0gMCA/IGVuZCAtIGJ1ZnN0YXJ0IDogYnVmZW5kIC0gYnVmc3RhcnQ7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICBNZWFzdXJlZFRleHQgbWVhc3VyZWQgPSBtTWVhc3VyZWQ7CiAKLSAgICAgICAgaWYgKG1DaGRpcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgbUNoZGlycyA9IG5ldyBieXRlW0FycmF5VXRpbHMuaWRlYWxCeXRlQXJyYXlTaXplKGJ1ZnNpeiArIDEpXTsKLSAgICAgICAgICAgIG1DaHMgPSBuZXcgY2hhcltBcnJheVV0aWxzLmlkZWFsQ2hhckFycmF5U2l6ZShidWZzaXogKyAxKV07Ci0gICAgICAgICAgICBtV2lkdGhzID0gbmV3IGZsb2F0W0FycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUoKGJ1ZnNpeiArIDEpICogMildOwotICAgICAgICB9Ci0KLSAgICAgICAgYnl0ZVtdIGNoZGlycyA9IG1DaGRpcnM7Ci0gICAgICAgIGNoYXJbXSBjaHMgPSBtQ2hzOwotICAgICAgICBmbG9hdFtdIHdpZHRocyA9IG1XaWR0aHM7Ci0KLSAgICAgICAgQWx0ZXJlZENoYXJTZXF1ZW5jZSBhbHRlciA9IG51bGw7CiAgICAgICAgIFNwYW5uZWQgc3Bhbm5lZCA9IG51bGw7Ci0KICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFNwYW5uZWQpCiAgICAgICAgICAgICBzcGFubmVkID0gKFNwYW5uZWQpIHNvdXJjZTsKIAogICAgICAgICBpbnQgREVGQVVMVF9ESVIgPSBESVJfTEVGVF9UT19SSUdIVDsgLy8gWFhYCiAKLSAgICAgICAgZm9yIChpbnQgc3RhcnQgPSBidWZzdGFydDsgc3RhcnQgPD0gYnVmZW5kOyBzdGFydCA9IGVuZCkgewotICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIGludCBwYXJhRW5kOworICAgICAgICBmb3IgKGludCBwYXJhU3RhcnQgPSBidWZzdGFydDsgcGFyYVN0YXJ0IDw9IGJ1ZmVuZDsgcGFyYVN0YXJ0ID0gcGFyYUVuZCkgeworICAgICAgICAgICAgcGFyYUVuZCA9IFRleHRVdGlscy5pbmRleE9mKHNvdXJjZSwgJ1xuJywgcGFyYVN0YXJ0LCBidWZlbmQpOworICAgICAgICAgICAgaWYgKHBhcmFFbmQgPCAwKQorICAgICAgICAgICAgICAgIHBhcmFFbmQgPSBidWZlbmQ7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZW5kID0gVGV4dFV0aWxzLmluZGV4T2Yoc291cmNlLCAnXG4nLCBzdGFydCwgYnVmZW5kKTsKKyAgICAgICAgICAgICAgICBwYXJhRW5kKys7CisgICAgICAgICAgICBpbnQgcGFyYUxlbiA9IHBhcmFFbmQgLSBwYXJhU3RhcnQ7CiAKLSAgICAgICAgICAgIGlmIChlbmQgPCAwKQotICAgICAgICAgICAgICAgIGVuZCA9IGJ1ZmVuZDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlbmQrKzsKLQotICAgICAgICAgICAgaW50IGZpcnN0V2lkdGhMaW5lQ291bnQgPSAxOworICAgICAgICAgICAgaW50IGZpcnN0V2lkdGhMaW5lTGltaXQgPSBtTGluZUNvdW50ICsgMTsKICAgICAgICAgICAgIGludCBmaXJzdHdpZHRoID0gb3V0ZXJ3aWR0aDsKICAgICAgICAgICAgIGludCByZXN0d2lkdGggPSBvdXRlcndpZHRoOwogCiAgICAgICAgICAgICBMaW5lSGVpZ2h0U3BhbltdIGNob29zZWh0ID0gbnVsbDsKIAogICAgICAgICAgICAgaWYgKHNwYW5uZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuW10gc3A7Ci0KLSAgICAgICAgICAgICAgICBzcCA9IHNwYW5uZWQuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgTGVhZGluZ01hcmdpblNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuW10gc3AgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcGFubmVkLCBwYXJhU3RhcnQsIHBhcmFFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3Bhbi5jbGFzcyk7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbiBsbXMgPSBzcFtpXTsKICAgICAgICAgICAgICAgICAgICAgZmlyc3R3aWR0aCAtPSBzcFtpXS5nZXRMZWFkaW5nTWFyZ2luKHRydWUpOwogICAgICAgICAgICAgICAgICAgICByZXN0d2lkdGggLT0gc3BbaV0uZ2V0TGVhZGluZ01hcmdpbihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsbXMgaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0V2lkdGhMaW5lQ291bnQgPSAoKExlYWRpbmdNYXJnaW5TcGFuLkxlYWRpbmdNYXJnaW5TcGFuMilsbXMpLmdldExlYWRpbmdNYXJnaW5MaW5lQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8vIExlYWRpbmdNYXJnaW5TcGFuMiBpcyBvZGQuICBUaGUgY291bnQgYWZmZWN0cyBhbGwKKyAgICAgICAgICAgICAgICAgICAgLy8gbGVhZGluZyBtYXJnaW4gc3BhbnMsIG5vdCBqdXN0IHRoaXMgcGFydGljdWxhciBvbmUsCisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBzdGFydCBmcm9tIHRoZSB0b3Agb2YgdGhlIHNwYW4sIG5vdCB0aGUgdG9wIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBwYXJhZ3JhcGguCisgICAgICAgICAgICAgICAgICAgIGlmIChsbXMgaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3BhbjIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuMiBsbXMyID0gKExlYWRpbmdNYXJnaW5TcGFuMikgbG1zOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxtc0ZpcnN0TGluZSA9IGdldExpbmVGb3JPZmZzZXQoc3Bhbm5lZC5nZXRTcGFuU3RhcnQobG1zMikpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RXaWR0aExpbmVMaW1pdCA9IGxtc0ZpcnN0TGluZSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxtczIuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2hvb3NlaHQgPSBzcGFubmVkLmdldFNwYW5zKHN0YXJ0LCBlbmQsIExpbmVIZWlnaHRTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBjaG9vc2VodCA9IGdldFBhcmFncmFwaFNwYW5zKHNwYW5uZWQsIHBhcmFTdGFydCwgcGFyYUVuZCwgTGluZUhlaWdodFNwYW4uY2xhc3MpOwogCiAgICAgICAgICAgICAgICAgaWYgKGNob29zZWh0Lmxlbmd0aCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjaG9vc2VodHYgPT0gbnVsbCB8fApAQCAtMTkyLDExICsxODYsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaG9vc2VodC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgaW50IG8gPSBzcGFubmVkLmdldFNwYW5TdGFydChjaG9vc2VodFtpXSk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvIDwgc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvIDwgcGFyYVN0YXJ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRzIGluIHRoaXMgbGF5b3V0LCBiZWZvcmUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBwYXJhZ3JhcGgKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0dltpXSA9IGdldExpbmVUb3AoZ2V0TGluZUZvck9mZnNldChvKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0dltpXSA9IGdldExpbmVUb3AoZ2V0TGluZUZvck9mZnNldChvKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0cyBpbiB0aGlzIHBhcmFncmFwaAogCkBAIC0yMDYsMTY2ICsyMDAsODcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChlbmQgLSBzdGFydCA+IGNoZGlycy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBjaGRpcnMgPSBuZXcgYnl0ZVtBcnJheVV0aWxzLmlkZWFsQnl0ZUFycmF5U2l6ZShlbmQgLSBzdGFydCldOwotICAgICAgICAgICAgICAgIG1DaGRpcnMgPSBjaGRpcnM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZW5kIC0gc3RhcnQgPiBjaHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgY2hzID0gbmV3IGNoYXJbQXJyYXlVdGlscy5pZGVhbENoYXJBcnJheVNpemUoZW5kIC0gc3RhcnQpXTsKLSAgICAgICAgICAgICAgICBtQ2hzID0gY2hzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChlbmQgLSBzdGFydCkgKiAyID4gd2lkdGhzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHdpZHRocyA9IG5ldyBmbG9hdFtBcnJheVV0aWxzLmlkZWFsSW50QXJyYXlTaXplKChlbmQgLSBzdGFydCkgKiAyKV07Ci0gICAgICAgICAgICAgICAgbVdpZHRocyA9IHdpZHRoczsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lYXN1cmVkLnNldFBhcmEoc291cmNlLCBwYXJhU3RhcnQsIHBhcmFFbmQsIERJUl9SRVFVRVNUX0RFRkFVTFRfTFRSKTsKKyAgICAgICAgICAgIGNoYXJbXSBjaHMgPSBtZWFzdXJlZC5tQ2hhcnM7CisgICAgICAgICAgICBmbG9hdFtdIHdpZHRocyA9IG1lYXN1cmVkLm1XaWR0aHM7CisgICAgICAgICAgICBieXRlW10gY2hkaXJzID0gbWVhc3VyZWQubUxldmVsczsKKyAgICAgICAgICAgIGludCBkaXIgPSBtZWFzdXJlZC5tRGlyOworICAgICAgICAgICAgYm9vbGVhbiBlYXN5ID0gbWVhc3VyZWQubUVhc3k7CiAKLSAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyhzb3VyY2UsIHN0YXJ0LCBlbmQsIGNocywgMCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbiA9IGVuZCAtIHN0YXJ0OwotCi0gICAgICAgICAgICBib29sZWFuIGVhc3kgPSB0cnVlOwotICAgICAgICAgICAgYm9vbGVhbiBhbHRlcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICBpbnQgZGlyID0gREVGQVVMVF9ESVI7IC8vIFhYWAotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChjaHNbaV0gPj0gRklSU1RfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICBlYXN5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgbm9uZSBvZiB0aGUgdW5kZXJseWluZyBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkCi0gICAgICAgICAgICAvLyBhcyB2aWFibGUgYnJlYWtwb2ludHMsIGFuZCB0aGF0IHRoZSBlbnRpcmUgcnVuIGdldHMgdGhlCi0gICAgICAgICAgICAvLyBzYW1lIGJpZGkgZGlyZWN0aW9uLgotCi0gICAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgU3Bhbm5lZCkgewotICAgICAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgc291cmNlOwotICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3BhbltdIHNwYW5zID0gc3AuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgUmVwbGFjZW1lbnRTcGFuLmNsYXNzKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgc3BhbnMubGVuZ3RoOyB5KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGEgPSBzcC5nZXRTcGFuU3RhcnQoc3BhbnNbeV0pOwotICAgICAgICAgICAgICAgICAgICBpbnQgYiA9IHNwLmdldFNwYW5FbmQoc3BhbnNbeV0pOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSBhOyB4IDwgYjsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaHNbeCAtIHN0YXJ0XSA9ICdcdUZGRkMnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWVhc3kpIHsKLSAgICAgICAgICAgICAgICAvLyBYWFggcHV0IG92ZXJyaWRlIGZsYWdzLCBldGMuIGludG8gY2hkaXJzCi0gICAgICAgICAgICAgICAgZGlyID0gYmlkaShkaXIsIGNocywgY2hkaXJzLCBuLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBEbyBtaXJyb3JpbmcgZm9yIHJpZ2h0LXRvLWxlZnQgc2VnbWVudHMKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGRpcnNbaV0gPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBqOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBpOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZGlyc1tqXSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbmRyb2lkQ2hhcmFjdGVyLm1pcnJvcihjaHMsIGksIGogLSBpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcmVkID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGogLSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2Ugc3ViOwotCi0gICAgICAgICAgICBpZiAoYWx0ZXJlZCkgewotICAgICAgICAgICAgICAgIGlmIChhbHRlciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBhbHRlciA9IEFsdGVyZWRDaGFyU2VxdWVuY2UubWFrZShzb3VyY2UsIGNocywgc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBhbHRlci51cGRhdGUoY2hzLCBzdGFydCwgZW5kKTsKLQotICAgICAgICAgICAgICAgIHN1YiA9IGFsdGVyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdWIgPSBzb3VyY2U7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBDaGFyU2VxdWVuY2Ugc3ViID0gc291cmNlOwogCiAgICAgICAgICAgICBpbnQgd2lkdGggPSBmaXJzdHdpZHRoOwogCiAgICAgICAgICAgICBmbG9hdCB3ID0gMDsKLSAgICAgICAgICAgIGludCBoZXJlID0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgaGVyZSA9IHBhcmFTdGFydDsKIAotICAgICAgICAgICAgaW50IG9rID0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgb2sgPSBwYXJhU3RhcnQ7CiAgICAgICAgICAgICBmbG9hdCBva3dpZHRoID0gdzsKICAgICAgICAgICAgIGludCBva2FzY2VudCA9IDAsIG9rZGVzY2VudCA9IDAsIG9rdG9wID0gMCwgb2tib3R0b20gPSAwOwogCi0gICAgICAgICAgICBpbnQgZml0ID0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgZml0ID0gcGFyYVN0YXJ0OwogICAgICAgICAgICAgZmxvYXQgZml0d2lkdGggPSB3OwogICAgICAgICAgICAgaW50IGZpdGFzY2VudCA9IDAsIGZpdGRlc2NlbnQgPSAwLCBmaXR0b3AgPSAwLCBmaXRib3R0b20gPSAwOwogCi0gICAgICAgICAgICBib29sZWFuIHRhYiA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJPckVtb2ppID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIGhhc1RhYiA9IGZhbHNlOworICAgICAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOwogCi0gICAgICAgICAgICBpbnQgbmV4dDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSA9IG5leHQpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3Bhbm5lZCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBuZXh0ID0gZW5kOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKGksIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyk7CisgICAgICAgICAgICBmb3IgKGludCBzcGFuU3RhcnQgPSBwYXJhU3RhcnQsIHNwYW5FbmQgPSBzcGFuU3RhcnQsIG5leHRTcGFuU3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIHNwYW5TdGFydCA8IHBhcmFFbmQ7IHNwYW5TdGFydCA9IG5leHRTcGFuU3RhcnQpIHsKIAotICAgICAgICAgICAgICAgIGlmIChzcGFubmVkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGFjdHVhbE51bSA9IHBhaW50LmdldFRleHRXaWR0aHMoc3ViLCBpLCBuZXh0LCB3aWR0aHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAtIGkgPiBhY3R1YWxOdW0pCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RUZXh0V2lkdGhzKHdpZHRocywgc3ViLCBpLCBuZXh0LCBhY3R1YWxOdW0pOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZHRocywgMCwgd2lkdGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCAtIHN0YXJ0ICsgKGkgLSBzdGFydCksIG5leHQgLSBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm0pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHNwYW5TdGFydCA9PSBzcGFuRW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzcGFubmVkID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBzcGFuRW5kID0gcGFyYUVuZDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkVuZCA9IHNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKHNwYW5TdGFydCwgcGFyYUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CiAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGFjdHVhbE51bSA9IFN0eWxlZC5nZXRUZXh0V2lkdGhzKHBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5uZWQsIGksIG5leHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBmbSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0IC0gaSA+IGFjdHVhbE51bSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdFRleHRXaWR0aHMod2lkdGhzLCBzcGFubmVkLCBpLCBuZXh0LCBhY3R1YWxOdW0pOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZHRocywgMCwgd2lkdGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCAtIHN0YXJ0ICsgKGkgLSBzdGFydCksIG5leHQgLSBpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobVdvcmtQYWludC5iYXNlbGluZVNoaWZ0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm0uYXNjZW50ICs9IG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLnRvcCArPSBtV29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGludCBzcGFuTGVuID0gc3BhbkVuZCAtIHNwYW5TdGFydDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5uZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWQuYWRkU3R5bGVSdW4ocGFpbnQsIHNwYW5MZW4sIGZtKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLmRlc2NlbnQgKz0gbVdvcmtQYWludC5iYXNlbGluZVNoaWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgZm0uYm90dG9tICs9IG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbm5lZC5nZXRTcGFucyhzcGFuU3RhcnQsIHNwYW5FbmQsIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWQuYWRkU3R5bGVSdW4ocGFpbnQsIHNwYW5zLCBzcGFuTGVuLCBmbSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBuZXh0U3BhblN0YXJ0ID0gc3BhbkVuZDsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnRJblBhcmEgPSBzcGFuU3RhcnQgLSBwYXJhU3RhcnQ7CisgICAgICAgICAgICAgICAgaW50IGVuZEluUGFyYSA9IHNwYW5FbmQgLSBwYXJhU3RhcnQ7CisKICAgICAgICAgICAgICAgICBpbnQgZm10b3AgPSBmbS50b3A7CiAgICAgICAgICAgICAgICAgaW50IGZtYm90dG9tID0gZm0uYm90dG9tOwogICAgICAgICAgICAgICAgIGludCBmbWFzY2VudCA9IGZtLmFzY2VudDsKICAgICAgICAgICAgICAgICBpbnQgZm1kZXNjZW50ID0gZm0uZGVzY2VudDsKIAotICAgICAgICAgICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGk7IGogPCBuZXh0OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh3aWR0aHNbaiAtIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBMb2cuZSgidGV4dCIsIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpOyBqIDwgbmV4dDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgYyA9IGNoc1tqIC0gc3RhcnRdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBzcGFuU3RhcnQ7IGogPCBzcGFuRW5kOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gY2hzW2ogLSBwYXJhU3RhcnRdOwogICAgICAgICAgICAgICAgICAgICBmbG9hdCBiZWZvcmUgPSB3OwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICdcbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICdcdCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBMYXlvdXQubmV4dFRhYihzdWIsIHN0YXJ0LCBlbmQsIHcsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGFiID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID49IDB4RDgwMCAmJiBjIDw9IDB4REZGRiAmJiBqICsgMSA8IG5leHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbW9qaSA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChjaHMsIGogLSBzdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVGFiID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzVGFiID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNUYWJPckVtb2ppID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Bhbm5lZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IHRhYiB0aGlzIHBhcmEsIGNoZWNrIGZvciB0YWJzdG9wcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJTdG9wU3BhbltdIHNwYW5zID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3Bhbm5lZCwgcGFyYVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFFbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzID0gbmV3IFRhYlN0b3BzKFRBQl9JTkNSRU1FTlQsIHNwYW5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJTdG9wcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9IHRhYlN0b3BzLm5leHRUYWIodyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBUYWJTdG9wcy5uZXh0RGVmYXVsdFN0b3AodywgVEFCX0lOQ1JFTUVOVCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERGRkYgJiYgaiArIDEgPCBzcGFuRW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW1vamkgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQoY2hzLCBqIC0gcGFyYVN0YXJ0KTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtb2ppID49IE1JTl9FTU9KSSAmJiBlbW9qaSA8PSBNQVhfRU1PSkkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBFTU9KSV9GQUNUT1JZLgpAQCAtMzgwLDIxICsyOTUsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoUGFpbnQgPSBtV29ya1BhaW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkID0gKGZsb2F0KSBibS5nZXRXaWR0aCgpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkID0gYm0uZ2V0V2lkdGgoKSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13aGljaFBhaW50LmFzY2VudCgpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm0uZ2V0SGVpZ2h0KCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1RhYk9yRW1vamkgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gd2lkdGhzW2ogLSBwYXJhU3RhcnRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHBhcmFTdGFydF07CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3ICs9IHdpZHRoc1tqIC0gc3RhcnQgKyAoZW5kIC0gc3RhcnQpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gd2lkdGhzW2ogLSBwYXJhU3RhcnRdOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAid2FzICIgKyBiZWZvcmUgKyAiIG5vdyAiICsgdyArICIgYWZ0ZXIgIiArIGMgKyAiIHdpdGhpbiAiICsgd2lkdGgpOwpAQCAtNDE1LDcgKzMzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgICogRnJvbSB0aGUgVW5pY29kZSBMaW5lIEJyZWFraW5nIEFsZ29yaXRobToKICAgICAgICAgICAgICAgICAgICAgICAgICAqIChhdCBsZWFzdCBhcHByb3hpbWF0ZWx5KQotICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICAgICAgICAgICAgICAgICAgICoKICAgICAgICAgICAgICAgICAgICAgICAgICAqIC4sOjsgYXJlIGNsYXNzIElTOiBicmVha3BvaW50cwogICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICBleGNlcHQgd2hlbiBhZGphY2VudCB0byBkaWdpdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAqIC8gICAgaXMgY2xhc3MgU1k6IGEgYnJlYWtwb2ludApAQCAtNDMwLDEyICszNDUsMTIgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYyA9PSAnLicgIHx8IGMgPT0gJywnIHx8IGMgPT0gJzonIHx8IGMgPT0gJzsnKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiAtIDEgPCBoZXJlIHx8ICFDaGFyYWN0ZXIuaXNEaWdpdChjaHNbaiAtIDEgLSBzdGFydF0pKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiArIDEgPj0gbmV4dCB8fCAhQ2hhcmFjdGVyLmlzRGlnaXQoY2hzW2ogKyAxIC0gc3RhcnRdKSkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqIC0gMSA8IGhlcmUgfHwgIUNoYXJhY3Rlci5pc0RpZ2l0KGNoc1tqIC0gMSAtIHBhcmFTdGFydF0pKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiArIDEgPj0gc3BhbkVuZCB8fCAhQ2hhcmFjdGVyLmlzRGlnaXQoY2hzW2ogKyAxIC0gcGFyYVN0YXJ0XSkpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYyA9PSAnLycgfHwgYyA9PSAnLScpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqICsgMSA+PSBuZXh0IHx8ICFDaGFyYWN0ZXIuaXNEaWdpdChjaHNbaiArIDEgLSBzdGFydF0pKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGogKyAxID49IHNwYW5FbmQgfHwgIUNoYXJhY3Rlci5pc0RpZ2l0KGNoc1tqICsgMSAtIHBhcmFTdGFydF0pKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYyA+PSBGSVJTVF9DSksgJiYgaXNJZGVvZ3JhcGhpYyhjLCB0cnVlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICsgMSA8IG5leHQgJiYgaXNJZGVvZ3JhcGhpYyhjaHNbaiArIDEgLSBzdGFydF0sIGZhbHNlKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArIDEgPCBzcGFuRW5kICYmIGlzSWRlb2dyYXBoaWMoY2hzW2ogKyAxIC0gcGFyYVN0YXJ0XSwgZmFsc2UpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rd2lkdGggPSB3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gaiArIDE7CiAKQEAgLTQ1Miw3ICszNjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9rICE9IGhlcmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2cuZSgidGV4dCIsICJvdXRwdXQgb2sgIiArIGhlcmUgKyAiIHRvICIgK29rKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvayA8IG5leHQgJiYgY2hzW29rIC0gc3RhcnRdID09ICcgJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvayA8IHNwYW5FbmQgJiYgY2hzW29rIC0gcGFyYVN0YXJ0XSA9PSAnICcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2srKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTQ2MSwxMCArMzc2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBva2FzY2VudCwgb2tkZXNjZW50LCBva3RvcCwgb2tib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZ211bHQsIHNwYWNpbmdhZGQsIGNob29zZWh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgdGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBzdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VodHYsIGZtLCBoYXNUYWJPckVtb2ppLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBwYXJhU3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocywgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hzLCB3aWR0aHMsIGhlcmUgLSBwYXJhU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSwgZWxsaXBzaXplZFdpZHRoLCBva3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQpOwogCkBAIC00ODgsNyArNDAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvayAhPSBoZXJlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAib3V0cHV0IG9rICIgKyBoZXJlICsgIiB0byAiICtvayk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob2sgPCBuZXh0ICYmIGNoc1tvayAtIHN0YXJ0XSA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob2sgPCBzcGFuRW5kICYmIGNoc1tvayAtIHBhcmFTdGFydF0gPT0gJyAnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC00OTcsMTAgKzQxMiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2thc2NlbnQsIG9rZGVzY2VudCwgb2t0b3AsIG9rYm90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID09IGJ1ZmVuZCwgaW5jbHVkZXBhZCwgdHJhY2twYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMsIHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocywgd2lkdGhzLCBoZXJlIC0gcGFyYVN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUsIGVsbGlwc2l6ZWRXaWR0aCwgb2t3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50KTsKIApAQCAtNTEzLDE5ICs0MjgsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpdHRvcCwgZml0Ym90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpdCA9PSBidWZlbmQsIGluY2x1ZGVwYWQsIHRyYWNrcGFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHMsIHdpZHRocywgaGVyZSAtIHBhcmFTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsIGZpdHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSA9IGZpdDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAib3V0cHV0IG9uZSAiICsgaGVyZSArICIgdG8gIiArKGhlcmUgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVRleHQocGFpbnQsIG1Xb3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLCBoZXJlLCBoZXJlICsgMSwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYWFggbm90IHN1cmUgd2h5IHRoZSBleGlzdGluZyBmbSB3YXNuJ3Qgb2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVhc3VyZVRleHQocGFpbnQsIG1Xb3JrUGFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgc291cmNlLCBoZXJlLCBoZXJlICsgMSwgZm0sIHRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBudWxsKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBvdXQoc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSwgaGVyZSsxLApAQCAtNTMzLDE5ICs0NDksMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtLnRvcCwgZm0uYm90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUgKyAxID09IGJ1ZmVuZCwgaW5jbHVkZXBhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrcGFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHMsIHdpZHRocywgaGVyZSAtIHBhcmFTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHNbaGVyZSAtIHN0YXJ0XSwgcGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzW2hlcmUgLSBwYXJhU3RhcnRdLCBwYWludCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlID0gaGVyZSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZXJlIDwgaSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBuZXh0ID0gaGVyZTsgLy8gbXVzdCByZW1lYXN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZXJlIDwgc3BhblN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlkbid0IG91dHB1dCBhbGwgdGhlIHRleHQgZm9yIHRoaXMgc3BhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3ZlIG1lYXN1cmVkIHRoZSByYXcgd2lkdGhzLCB0aG91Z2gsIHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCByZXNldCB0aGUgc3RhcnQgcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gbmV4dFNwYW5TdGFydCA9IGhlcmU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBoZXJlIC0gMTsgICAgLy8gY29udGludWUgbG9vcGluZwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTU1LDE0ICs0NzQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZpdGFzY2VudCA9IGZpdGRlc2NlbnQgPSBmaXR0b3AgPSBmaXRib3R0b20gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgb2thc2NlbnQgPSBva2Rlc2NlbnQgPSBva3RvcCA9IG9rYm90dG9tID0gMDsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tZmlyc3RXaWR0aExpbmVDb3VudCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS1maXJzdFdpZHRoTGluZUxpbWl0IDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHJlc3R3aWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGVuZCAhPSBoZXJlKSB7CisgICAgICAgICAgICBpZiAocGFyYUVuZCAhPSBoZXJlKSB7CiAgICAgICAgICAgICAgICAgaWYgKChmaXR0b3AgfCBmaXRib3R0b20gfCBmaXRkZXNjZW50IHwgZml0YXNjZW50KSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtKTsKIApAQCAtNTc1LDIwICs0OTQsMjAgQEAKICAgICAgICAgICAgICAgICAvLyBMb2cuZSgidGV4dCIsICJvdXRwdXQgcmVzdCAiICsgaGVyZSArICIgdG8gIiArIGVuZCk7CiAKICAgICAgICAgICAgICAgICB2ID0gb3V0KHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUsIGVuZCwgZml0YXNjZW50LCBmaXRkZXNjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSwgcGFyYUVuZCwgZml0YXNjZW50LCBmaXRkZXNjZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgZml0dG9wLCBmaXRib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZ211bHQsIHNwYWNpbmdhZGQsIGNob29zZWh0LAotICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgdGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBzdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmQgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocywgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFFbmQgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNocywgd2lkdGhzLCBoZXJlIC0gcGFyYVN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUsIGVsbGlwc2l6ZWRXaWR0aCwgdywgcGFpbnQpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzdGFydCA9IGVuZDsKKyAgICAgICAgICAgIHBhcmFTdGFydCA9IHBhcmFFbmQ7CiAKLSAgICAgICAgICAgIGlmIChlbmQgPT0gYnVmZW5kKQorICAgICAgICAgICAgaWYgKHBhcmFFbmQgPT0gYnVmZW5kKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTYwMywyNDYgKzUyMiwxMyBAQAogICAgICAgICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgICAgICAgICBzcGFjaW5nbXVsdCwgc3BhY2luZ2FkZCwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgbnVsbCwgZm0sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIGJ1ZmVuZCwgY2hkaXJzLCBERUZBVUxUX0RJUiwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBidWZlbmQsIG51bGwsIERFRkFVTFRfRElSLCB0cnVlLAogICAgICAgICAgICAgICAgICAgICB0cnVlLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBidWZzdGFydCwgMCwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgYnVmc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsIDAsIHBhaW50KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJ1bnMgdGhlIHVuaWNvZGUgYmlkaSBhbGdvcml0aG0gb24gdGhlIGZpcnN0IG4gY2hhcnMgaW4gY2hzLCByZXR1cm5pbmcKLSAgICAgKiB0aGUgY2hhciBkaXJzIGluIGNoSW5mbyBhbmQgdGhlIGJhc2UgbGluZSBkaXJlY3Rpb24gb2YgdGhlIGZpcnN0Ci0gICAgICogcGFyYWdyYXBoLgotICAgICAqIAotICAgICAqIFhYWCBjaGFuZ2UgcmVzdWx0IGZyb20gZGlycyB0byBsZXZlbHMKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGRpciB0aGUgZGlyZWN0aW9uIGZsYWcsIGVpdGhlciBESVJfUkVRVUVTVF9MVFIsCi0gICAgICogRElSX1JFUVVFU1RfUlRMLCBESVJfUkVRVUVTVF9ERUZBVUxUX0xUUiwgb3IgRElSX1JFUVVFU1RfREVGQVVMVF9SVEwuCi0gICAgICogQHBhcmFtIGNocyB0aGUgdGV4dCB0byBleGFtaW5lCi0gICAgICogQHBhcmFtIGNoSW5mbyBvbiBpbnB1dCwgaWYgaGFzSW5mbyBpcyB0cnVlLCBvdmVycmlkZSBhbmQgb3RoZXIgZmxhZ3MgCi0gICAgICogcmVwcmVzZW50aW5nIG91dC1vZi1iYW5kIGVtYmVkZGluZyBpbmZvcm1hdGlvbi4gT24gb3V0cHV0LCB0aGUgZ2VuZXJhdGVkIAotICAgICAqIGRpcnMgb2YgdGhlIHRleHQuCi0gICAgICogQHBhcmFtIG4gdGhlIGxlbmd0aCBvZiB0aGUgdGV4dC9pbmZvcm1hdGlvbiBpbiBjaHMgYW5kIGNoSW5mbwotICAgICAqIEBwYXJhbSBoYXNJbmZvIHRydWUgaWYgY2hJbmZvIGhhcyBpbnB1dCBpbmZvcm1hdGlvbiwgb3RoZXJ3aXNlIHRoZQotICAgICAqIGlucHV0IGRhdGEgaW4gY2hJbmZvIGlzIGlnbm9yZWQuCi0gICAgICogQHJldHVybiB0aGUgcmVzb2x2ZWQgZGlyZWN0aW9uIGxldmVsIG9mIHRoZSBmaXJzdCBwYXJhZ3JhcGgsIGVpdGhlcgotICAgICAqIERJUl9MRUZUX1RPX1JJR0hUIG9yIERJUl9SSUdIVF9UT19MRUZULgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGludCBiaWRpKGludCBkaXIsIGNoYXJbXSBjaHMsIGJ5dGVbXSBjaEluZm8sIGludCBuLCAKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzSW5mbykgewotICAgICAgICAKLSAgICAgICAgQW5kcm9pZENoYXJhY3Rlci5nZXREaXJlY3Rpb25hbGl0aWVzKGNocywgY2hJbmZvLCBuKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBEZXRlcm1pbmUgcHJpbWFyeSBwYXJhZ3JhcGggZGlyZWN0aW9uIGlmIG5vdCBzcGVjaWZpZWQKLSAgICAgICAgICovCi0gICAgICAgIGlmIChkaXIgIT0gRElSX1JFUVVFU1RfTFRSICYmIGRpciAhPSBESVJfUkVRVUVTVF9SVEwpIHsKLSAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0Ci0gICAgICAgICAgICBkaXIgPSBkaXIgPj0gMCA/IERJUl9MRUZUX1RPX1JJR0hUIDogRElSX1JJR0hUX1RPX0xFRlQ7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgICAgIGludCBkID0gY2hJbmZvW2pdOwotCi0gICAgICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlyID0gRElSX0xFRlRfVE9fUklHSFQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICBkaXIgPSBESVJfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgYnl0ZSBTT1IgPSBkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQgPwotICAgICAgICAgICAgICAgIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUIDoKLSAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBYWFggRXhwbGljaXQgb3ZlcnJpZGVzIHNob3VsZCBnbyBoZXJlCi0gICAgICAgICAqLwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFdlYWsgdHlwZSByZXNvbHV0aW9uCi0gICAgICAgICAqLwotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiaW5pdGlhbCIpOwotCi0gICAgICAgIC8vIFcxIG5vbiBzcGFjaW5nIG1hcmtzCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICBpZiAoY2hJbmZvW2pdID09IENoYXJhY3Rlci5OT05fU1BBQ0lOR19NQVJLKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGogPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gU09SOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gY2hJbmZvW2ogLSAxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiVzEiKTsKLQotICAgICAgICAvLyBXMiBldXJvcGVhbiBudW1iZXJzCi0gICAgICAgIGJ5dGUgY3VyID0gU09SOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgYnl0ZSBkID0gY2hJbmZvW2pdOwotCi0gICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCB8fAotICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQgfHwKLSAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUX0FSQUJJQykKLSAgICAgICAgICAgICAgICBjdXIgPSBkOwotICAgICAgICAgICAgZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSKSB7Ci0gICAgICAgICAgICAgICAgIGlmIChjdXIgPT0KLSAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlRfQVJBQklDKQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiVzIiKTsKLQotICAgICAgICAvLyBXMyBhcmFiaWMgbGV0dGVycwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgaWYgKGNoSW5mb1tqXSA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVF9BUkFCSUMpCi0gICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlczIik7Ci0KLSAgICAgICAgLy8gVzQgc2luZ2xlIHNlcGFyYXRvciBiZXR3ZWVuIG51bWJlcnMKLSAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBuIC0gMTsgaisrKSB7Ci0gICAgICAgICAgICBieXRlIGQgPSBjaEluZm9bal07Ci0gICAgICAgICAgICBieXRlIHByZXYgPSBjaEluZm9baiAtIDFdOwotICAgICAgICAgICAgYnl0ZSBuZXh0ID0gY2hJbmZvW2ogKyAxXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUl9TRVBBUkFUT1IpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSICYmCi0gICAgICAgICAgICAgICAgICAgIG5leHQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQ09NTU9OX05VTUJFUl9TRVBBUkFUT1IpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSICYmCi0gICAgICAgICAgICAgICAgICAgIG5leHQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjsKLSAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUiAmJgotICAgICAgICAgICAgICAgICAgICBuZXh0ID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9BUkFCSUNfTlVNQkVSKQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiVzQiKTsKLQotICAgICAgICAvLyBXNSBldXJvcGVhbiBudW1iZXIgdGVybWluYXRvcnMKLSAgICAgICAgYm9vbGVhbiBhZGphY2VudCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgYnl0ZSBkID0gY2hJbmZvW2pdOwotCi0gICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSKQotICAgICAgICAgICAgICAgIGFkamFjZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUl9URVJNSU5BVE9SICYmIGFkamFjZW50KQotICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYWRqYWNlbnQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vZHVtcChjaGRpcnMsIG4sICJXNSIpOwotCi0gICAgICAgIC8vIFc1IGV1cm9wZWFuIG51bWJlciB0ZXJtaW5hdG9ycyBwYXJ0IDIsCi0gICAgICAgIC8vIFc2IHNlcGFyYXRvcnMgYW5kIHRlcm1pbmF0b3JzCi0gICAgICAgIGFkamFjZW50ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGogPSBuIC0gMTsgaiA+PSAwOyBqLS0pIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICBhZGphY2VudCA9IHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVJfVEVSTUlOQVRPUikgewotICAgICAgICAgICAgICAgIGlmIChhZGphY2VudCkKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9PVEhFUl9ORVVUUkFMUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGFkamFjZW50ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSX1NFUEFSQVRPUiB8fAotICAgICAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9DT01NT05fTlVNQkVSX1NFUEFSQVRPUiB8fAotICAgICAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9QQVJBR1JBUEhfU0VQQVJBVE9SIHx8Ci0gICAgICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1NFR01FTlRfU0VQQVJBVE9SKQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfT1RIRVJfTkVVVFJBTFM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlc2Iik7Ci0KLSAgICAgICAgLy8gVzcgc3Ryb25nIGRpcmVjdGlvbiBvZiBldXJvcGVhbiBudW1iZXJzCi0gICAgICAgIGN1ciA9IFNPUjsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gU09SIHx8Ci0gICAgICAgICAgICAgICAgZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCB8fAotICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICAgICAgY3VyID0gZDsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBjdXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlc3Iik7Ci0KLSAgICAgICAgLy8gTjEsIE4yIG5ldXRyYWxzCi0gICAgICAgIGN1ciA9IFNPUjsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQgfHwKLSAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgY3VyID0gZDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0FSQUJJQ19OVU1CRVIpIHsKLSAgICAgICAgICAgICAgICBjdXIgPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnl0ZSBkZCA9IFNPUjsKLSAgICAgICAgICAgICAgICBpbnQgazsKLQotICAgICAgICAgICAgICAgIGZvciAoayA9IGogKyAxOyBrIDwgbjsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRkID0gY2hJbmZvW2tdOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChkZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUikgewotICAgICAgICAgICAgICAgICAgICAgICAgZGQgPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IGo7IHkgPCBrOyB5KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRkID09IGN1cikKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoSW5mb1t5XSA9IGN1cjsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY2hJbmZvW3ldID0gU09SOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGogPSBrIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiZmluYWwiKTsKLQotICAgICAgICAvLyBleHRyYTogZW5mb3JjZSB0aGF0IGFsbCB0YWJzIGFuZCBzdXJyb2dhdGUgY2hhcmFjdGVycyBnbyB0aGUKLSAgICAgICAgLy8gcHJpbWFyeSBkaXJlY3Rpb24KLSAgICAgICAgLy8gVE9ETzogYWN0dWFsbHkgZG8gZGlyZWN0aW9ucyByaWdodCBmb3Igc3Vycm9nYXRlcwotCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBjaHNbal07Ci0KLSAgICAgICAgICAgIGlmIChjID09ICdcdCcgfHwgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhERkZGKSkgewotICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IFNPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGRpcjsKLSAgICB9Ci0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEZJUlNUX0NKSyA9ICdcdTJFODAnOwogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBvbmUgb2YgdGhvc2Ugc3BlY2lmaWVkCkBAIC05NDgsNTMgKzYzNCwxNSBAQAogICAgIH0KICovCiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0Rml0KFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZCkgewotICAgICAgICBpbnQgaGlnaCA9IGVuZCArIDEsIGxvdyA9IHN0YXJ0IC0gMSwgZ3Vlc3M7Ci0KLSAgICAgICAgd2hpbGUgKGhpZ2ggLSBsb3cgPiAxKSB7Ci0gICAgICAgICAgICBndWVzcyA9IChoaWdoICsgbG93KSAvIDI7Ci0KLSAgICAgICAgICAgIGlmIChtZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsIHN0YXJ0LCBndWVzcywgbnVsbCwgdHJ1ZSwgbnVsbCkgPiB3aWQpCi0gICAgICAgICAgICAgICAgaGlnaCA9IGd1ZXNzOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGxvdyA9IGd1ZXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvdyA8IHN0YXJ0KQotICAgICAgICAgICAgcmV0dXJuIHN0YXJ0OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbG93OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRqdXN0VGV4dFdpZHRocyhmbG9hdFtdIHdpZHRocywgQ2hhclNlcXVlbmNlIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3VyUG9zLCBpbnQgbmV4dFBvcywgaW50IGFjdHVhbE51bSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IGRzdEluZGV4ID0gbmV4dFBvcyAtIGN1clBvcyAtIDE7Ci0gICAgICAgICAgICBmb3IgKGludCBzcmNJbmRleCA9IGFjdHVhbE51bSAtIDE7IHNyY0luZGV4ID49IDA7IHNyY0luZGV4LS0pIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBjaGFyIGMgPSB0ZXh0LmNoYXJBdChkc3RJbmRleCArIGN1clBvcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhERkZGKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdpZHRoc1tkc3RJbmRleC0tXSA9IDAuMGY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdpZHRoc1tkc3RJbmRleC0tXSA9IHdpZHRoc1tzcmNJbmRleF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoInRleHQiLCAiYWRqdXN0IHRleHQgd2lkdGhzIGZhaWxlZCIpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBpbnQgb3V0KENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFib3ZlLCBpbnQgYmVsb3csIGludCB0b3AsIGludCBib3R0b20sIGludCB2LAogICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNwYWNpbmdtdWx0LCBmbG9hdCBzcGFjaW5nYWRkLAogICAgICAgICAgICAgICAgICAgICAgIExpbmVIZWlnaHRTcGFuW10gY2hvb3NlaHQsIGludFtdIGNob29zZWh0diwKLSAgICAgICAgICAgICAgICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbSwgYm9vbGVhbiB0YWIsCisgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm0sIGJvb2xlYW4gaGFzVGFiT3JFbW9qaSwKICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRNdWx0aXBseSwgaW50IHBzdGFydCwgYnl0ZVtdIGNoZGlycywKICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyLCBib29sZWFuIGVhc3ksIGJvb2xlYW4gbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluY2x1ZGVwYWQsIGJvb2xlYW4gdHJhY2twYWQsCi0gICAgICAgICAgICAgICAgICAgICAgZmxvYXRbXSB3aWR0aHMsIGludCB3aWRzdGFydCwgaW50IHdpZG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gY2hzLCBmbG9hdFtdIHdpZHRocywgaW50IHdpZHN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5UcnVuY2F0ZUF0IGVsbGlwc2l6ZSwgZmxvYXQgZWxsaXBzaXN3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0ZXh0d2lkdGgsIFRleHRQYWludCBwYWludCkgewogICAgICAgICBpbnQgaiA9IG1MaW5lQ291bnQ7CkBAIC0xMDAyLDggKzY1MCw2IEBACiAgICAgICAgIGludCB3YW50ID0gb2ZmICsgbUNvbHVtbnMgKyBUT1A7CiAgICAgICAgIGludFtdIGxpbmVzID0gbUxpbmVzOwogCi0gICAgICAgIC8vIExvZy5lKCJ0ZXh0IiwgImxpbmUgIiArIHN0YXJ0ICsgIiB0byAiICsgZW5kICsgKGxhc3QgPyAiPT09IiA6ICIiKSk7Ci0KICAgICAgICAgaWYgKHdhbnQgPj0gbGluZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICBpbnQgbmxlbiA9IEFycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUod2FudCArIDEpOwogICAgICAgICAgICAgaW50W10gZ3JvdyA9IG5ldyBpbnRbbmxlbl07CkBAIC0xMDc5LDU5ICs3MjUsMjMgQEAKICAgICAgICAgbGluZXNbb2ZmICsgbUNvbHVtbnMgKyBTVEFSVF0gPSBlbmQ7CiAgICAgICAgIGxpbmVzW29mZiArIG1Db2x1bW5zICsgVE9QXSA9IHY7CiAKLSAgICAgICAgaWYgKHRhYikKKyAgICAgICAgaWYgKGhhc1RhYk9yRW1vamkpCiAgICAgICAgICAgICBsaW5lc1tvZmYgKyBUQUJdIHw9IFRBQl9NQVNLOwogCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxpbmVzW29mZiArIERJUl0gfD0gZGlyIDw8IERJUl9TSElGVDsKLQotICAgICAgICAgICAgaW50IGN1ciA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUOwotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLQotICAgICAgICAgICAgaWYgKCFlYXN5KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IHN0YXJ0OyBrIDwgZW5kOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoZGlyc1trIC0gcHN0YXJ0XSAhPSBjdXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXIgPSBjaGRpcnNbayAtIHBzdGFydF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERpcmVjdGlvbnMgbGluZWRpcnM7Ci0KLSAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbGluZWRpcnMgPSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzaG9ydFtdIGxkID0gbmV3IHNob3J0W2NvdW50ICsgMV07Ci0KLSAgICAgICAgICAgICAgICBjdXIgPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVDsKLSAgICAgICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IGhlcmUgPSBzdGFydDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSBzdGFydDsgayA8IGVuZDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGRpcnNbayAtIHBzdGFydF0gIT0gY3VyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBYWFggY2hlY2sgdG8gbWFrZSBzdXJlIHdlIGRvbid0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb3ZlcmZsb3cgc2hvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIGxkW2NvdW50KytdID0gKHNob3J0KSAoayAtIGhlcmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VyID0gY2hkaXJzW2sgLSBwc3RhcnRdOwotICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSA9IGs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsZFtjb3VudF0gPSAoc2hvcnQpIChlbmQgLSBoZXJlKTsKLQotICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSAxICYmIGxkWzBdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZWRpcnMgPSBESVJTX0FMTF9SSUdIVF9UT19MRUZUOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVkaXJzID0gbmV3IERpcmVjdGlvbnMobGQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQorICAgICAgICBsaW5lc1tvZmYgKyBESVJdIHw9IGRpciA8PCBESVJfU0hJRlQ7CisgICAgICAgIERpcmVjdGlvbnMgbGluZWRpcnMgPSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUOworICAgICAgICAvLyBlYXN5IG1lYW5zIGFsbCBjaGFycyA8IHRoZSBmaXJzdCBSVEwsIHNvIG5vIGVtb2ppLCBubyBub3RoaW5nCisgICAgICAgIC8vIFhYWCBhIHJ1biB3aXRoIG5vIHRleHQgb3IgYWxsIHNwYWNlcyBpcyBlYXN5IGJ1dCBtaWdodCBiZSBhbiBlbXB0eQorICAgICAgICAvLyBSVEwgcGFyYWdyYXBoLiAgTWFrZSBzdXJlIGVhc3kgaXMgZmFsc2UgaWYgdGhpcyBpcyB0aGUgY2FzZS4KKyAgICAgICAgaWYgKGVhc3kpIHsKICAgICAgICAgICAgIG1MaW5lRGlyZWN0aW9uc1tqXSA9IGxpbmVkaXJzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUxpbmVEaXJlY3Rpb25zW2pdID0gQW5kcm9pZEJpZGkuZGlyZWN0aW9ucyhkaXIsIGNoZGlycywgd2lkc3RhcnQsIGNocywKKyAgICAgICAgICAgICAgICAgICAgd2lkc3RhcnQsIGVuZCAtIHN0YXJ0KTsKIAogICAgICAgICAgICAgLy8gSWYgZWxsaXBzaXplIGlzIGluIG1hcnF1ZWUgbW9kZSwgZG8gbm90IGFwcGx5IGVsbGlwc2lzIG9uIHRoZSBmaXJzdCBsaW5lCiAgICAgICAgICAgICBpZiAoZWxsaXBzaXplICE9IG51bGwgJiYgKGVsbGlwc2l6ZSAhPSBUZXh0VXRpbHMuVHJ1bmNhdGVBdC5NQVJRVUVFIHx8IGogIT0gMCkpIHsKLSAgICAgICAgICAgICAgICBjYWxjdWxhdGVFbGxpcHNpcyhzdGFydCwgZW5kLCB3aWR0aHMsIHdpZHN0YXJ0LCB3aWRvZmYsCisgICAgICAgICAgICAgICAgY2FsY3VsYXRlRWxsaXBzaXMoc3RhcnQsIGVuZCwgd2lkdGhzLCB3aWRzdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGxpcHNpc3dpZHRoLCBlbGxpcHNpemUsIGosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHdpZHRoLCBwYWludCk7CiAgICAgICAgICAgICB9CkBAIC0xMTQyLDcgKzc1Miw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZUVsbGlwc2lzKGludCBsaW5lc3RhcnQsIGludCBsaW5lZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIHdpZHRocywgaW50IHdpZHN0YXJ0LCBpbnQgd2lkb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIHdpZHRocywgaW50IHdpZHN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhdmFpbCwgVGV4dFV0aWxzLlRydW5jYXRlQXQgd2hlcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lLCBmbG9hdCB0ZXh0d2lkdGgsIFRleHRQYWludCBwYWludCkgewogICAgICAgICBpbnQgbGVuID0gbGluZWVuZCAtIGxpbmVzdGFydDsKQEAgLTExNjIsNyArNzcyLDcgQEAKICAgICAgICAgICAgIGludCBpOwogCiAgICAgICAgICAgICBmb3IgKGkgPSBsZW47IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tpIC0gMSArIGxpbmVzdGFydCAtIHdpZHN0YXJ0ICsgd2lkb2ZmXTsKKyAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2kgLSAxICsgbGluZXN0YXJ0IC0gd2lkc3RhcnRdOwogCiAgICAgICAgICAgICAgICAgaWYgKHcgKyBzdW0gKyBlbGxpcHNpc3dpZCA+IGF2YWlsKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTE3OCw3ICs3ODgsNyBAQAogICAgICAgICAgICAgaW50IGk7CiAKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWR0aHNbaSArIGxpbmVzdGFydCAtIHdpZHN0YXJ0ICsgd2lkb2ZmXTsKKyAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2kgKyBsaW5lc3RhcnQgLSB3aWRzdGFydF07CiAKICAgICAgICAgICAgICAgICBpZiAodyArIHN1bSArIGVsbGlwc2lzd2lkID4gYXZhaWwpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTk1LDcgKzgwNSw3IEBACiAKICAgICAgICAgICAgIGZsb2F0IHJhdmFpbCA9IChhdmFpbCAtIGVsbGlwc2lzd2lkKSAvIDI7CiAgICAgICAgICAgICBmb3IgKHJpZ2h0ID0gbGVuOyByaWdodCA+PSAwOyByaWdodC0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tyaWdodCAtIDEgKyBsaW5lc3RhcnQgLSB3aWRzdGFydCArIHdpZG9mZl07CisgICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tyaWdodCAtIDEgKyBsaW5lc3RhcnQgLSB3aWRzdGFydF07CiAKICAgICAgICAgICAgICAgICBpZiAodyArIHJzdW0gPiByYXZhaWwpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMjA2LDcgKzgxNiw3IEBACiAKICAgICAgICAgICAgIGZsb2F0IGxhdmFpbCA9IGF2YWlsIC0gZWxsaXBzaXN3aWQgLSByc3VtOwogICAgICAgICAgICAgZm9yIChsZWZ0ID0gMDsgbGVmdCA8IHJpZ2h0OyBsZWZ0KyspIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2xlZnQgKyBsaW5lc3RhcnQgLSB3aWRzdGFydCArIHdpZG9mZl07CisgICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tsZWZ0ICsgbGluZXN0YXJ0IC0gd2lkc3RhcnRdOwogCiAgICAgICAgICAgICAgICAgaWYgKHcgKyBsc3VtID4gbGF2YWlsKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTIyMyw3ICs4MzMsNyBAQAogICAgICAgICBtTGluZXNbbUNvbHVtbnMgKiBsaW5lICsgRUxMSVBTSVNfQ09VTlRdID0gZWxsaXBzaXNDb3VudDsKICAgICB9CiAKLSAgICAvLyBPdmVycmlkZSB0aGUgYmFzZWNsYXNzIHNvIHdlIGNhbiBkaXJlY3RseSBhY2Nlc3Mgb3VyIG1lbWJlcnMsCisgICAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UgY2xhc3Mgc28gd2UgY2FuIGRpcmVjdGx5IGFjY2VzcyBvdXIgbWVtYmVycywKICAgICAvLyByYXRoZXIgdGhhbiByZWx5aW5nIG9uIG1lbWJlciBmdW5jdGlvbnMuCiAgICAgLy8gVGhlIGxvZ2ljIG1pcnJvcnMgdGhhdCBvZiBMYXlvdXQuZ2V0TGluZUZvclZlcnRpY2FsCiAgICAgLy8gRklYTUU6IEl0IG1heSBiZSBmYXN0ZXIgdG8gZG8gYSBsaW5lYXIgc2VhcmNoIGZvciBsYXlvdXRzIHdpdGhvdXQgbWFueSBsaW5lcy4KQEAgLTEyNTIsMTEgKzg2MiwxMSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0TGluZVRvcChpbnQgbGluZSkgewotICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIFRPUF07ICAgIAorICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIFRPUF07CiAgICAgfQogCiAgICAgcHVibGljIGludCBnZXRMaW5lRGVzY2VudChpbnQgbGluZSkgewotICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIERFU0NFTlRdOyAgIAorICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIERFU0NFTlRdOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0TGluZVN0YXJ0KGludCBsaW5lKSB7CkBAIC0xMzI5LDEzICs5MzksMTEgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElSX1NISUZUICA9IDMwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJfTUFTSyAgID0gMHgyMDAwMDAwMDsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRklSU1RfUklHSFRfVE9fTEVGVCA9ICdcdTA1OTAnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJfSU5DUkVNRU5UID0gMjA7IC8vIHNhbWUgYXMgTGF5b3V0LCBidXQgdGhhdCdzIHByaXZhdGUKIAogICAgIC8qCi0gICAgICogVGhlc2UgYXJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgdG8gZ2VuZXJhdGUoKQorICAgICAqIFRoaXMgaXMgcmV1c2VkIGFjcm9zcyBjYWxscyB0byBnZW5lcmF0ZSgpCiAgICAgICovCi0gICAgcHJpdmF0ZSBieXRlW10gbUNoZGlyczsKLSAgICBwcml2YXRlIGNoYXJbXSBtQ2hzOwotICAgIHByaXZhdGUgZmxvYXRbXSBtV2lkdGhzOworICAgIHByaXZhdGUgTWVhc3VyZWRUZXh0IG1NZWFzdXJlZDsKICAgICBwcml2YXRlIFBhaW50LkZvbnRNZXRyaWNzSW50IG1Gb250TWV0cmljc0ludCA9IG5ldyBQYWludC5Gb250TWV0cmljc0ludCgpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdHlsZWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3R5bGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEzY2M0MmMuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdHlsZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC50ZXh0OwotCi1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLk1ldHJpY0FmZmVjdGluZ1NwYW47Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlJlcGxhY2VtZW50U3BhbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIGZvciBkcmF3aW5nIGFuZCBtZWFzdXJpbmcgc3R5bGVkIHRleHQsCi0gKiBsaWtlIHtAbGluayBhbmRyb2lkLnRleHQuU3Bhbm5lZH0gb2JqZWN0IHdpdGgKLSAqIHtAbGluayBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFufS4KLSAqCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVkCi17Ci0gICAgLyoqCi0gICAgICogRHJhd3MgYW5kL29yIG1lYXN1cmVzIGEgdW5pZm9ybSBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLiBObyBzcGFuIG9mCi0gICAgICogaW50ZXJlc3Qgc2hvdWxkIHN0YXJ0IG9yIGVuZCBpbiB0aGUgbWlkZGxlIG9mIHRoaXMgcnVuIChpZiBub3QKLSAgICAgKiBkcmF3aW5nLCBjaGFyYWN0ZXIgc3BhbnMgdGhhdCBkb24ndCBhZmZlY3QgbWV0cmljcyBjYW4gYmUgaWdub3JlZCkuCi0gICAgICogTmVpdGhlciBzaG91bGQgdGhlIHJ1biBkaXJlY3Rpb24gY2hhbmdlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHJ1bi4KLSAgICAgKgotICAgICAqIDxwPlRoZSB4IHBvc2l0aW9uIGlzIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRleHQuIEluIGEgcmlnaHQtdG8tbGVmdAotICAgICAqIHBhcmFncmFwaCwgdGhpcyB3aWxsIGJlIHRvIHRoZSByaWdodCBvZiB0aGUgdGV4dCB0byBiZSBkcmF3bi4gUGFpbnQKLSAgICAgKiBzaG91bGQgbm90IGhhdmUgYW4gQWxpZ24gdmFsdWUgb3RoZXIgdGhhbiBMRUZUIG9yIHBvc2l0aW9uaW5nIHdpbGwgZ2V0Ci0gICAgICogY29uZnVzZWQuCi0gICAgICoKLSAgICAgKiA8cD5PbiByZXR1cm4sIHdvcmtQYWludCB3aWxsIHJlZmxlY3QgdGhlIG9yaWdpbmFsIHBhaW50IHBsdXMgYW55Ci0gICAgICogbW9kaWZpY2F0aW9ucyBtYWRlIGJ5IGNoYXJhY3RlciBzdHlsZXMgb24gdGhlIHJ1bi4KLSAgICAgKgotICAgICAqIDxwPlRoZSByZXR1cm5lZCB3aWR0aCBpcyBzaWduZWQgYW5kIHdpbGwgYmUgPCAwIGlmIHRoZSBwYXJhZ3JhcGgKLSAgICAgKiBkaXJlY3Rpb24gaXMgcmlnaHQtdG8tbGVmdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBkcmF3VW5pZm9ybVJ1bihDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5lZCB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyLCBib29sZWFuIHJ1bklzUnRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbWksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkV2lkdGgpIHsKLQotICAgICAgICBib29sZWFuIGhhdmVXaWR0aCA9IGZhbHNlOwotICAgICAgICBmbG9hdCByZXQgPSAwOwotICAgICAgICBDaGFyYWN0ZXJTdHlsZVtdIHNwYW5zID0gdGV4dC5nZXRTcGFucyhzdGFydCwgZW5kLCBDaGFyYWN0ZXJTdHlsZS5jbGFzcyk7Ci0KLSAgICAgICAgUmVwbGFjZW1lbnRTcGFuIHJlcGxhY2VtZW50ID0gbnVsbDsKLQotICAgICAgICAvLyBYWFg6IFRoaXMgc2hvdWxkbid0IGJlIG1vZGlmeWluZyBwYWludCwgb25seSB3b3JrUGFpbnQuCi0gICAgICAgIC8vIEhvd2V2ZXIsIHRoZSBtZW1iZXJzIGJlbG9uZ2luZyB0byBUZXh0UGFpbnQgc2hvdWxkIGhhdmUgZGVmYXVsdAotICAgICAgICAvLyB2YWx1ZXMgYW55d2F5LiAgQmV0dGVyIHRvIGVuc3VyZSB0aGlzIGluIHRoZSBMYXlvdXQgY29uc3RydWN0b3IuCi0gICAgICAgIHBhaW50LmJnQ29sb3IgPSAwOwotICAgICAgICBwYWludC5iYXNlbGluZVNoaWZ0ID0gMDsKLSAgICAgICAgd29ya1BhaW50LnNldChwYWludCk7Ci0KLQkJaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlDaGFyYWN0ZXJTdHlsZSBzcGFuID0gc3BhbnNbaV07Ci0KLQkJCQlpZiAoc3BhbiBpbnN0YW5jZW9mIFJlcGxhY2VtZW50U3BhbikgewotCQkJCQlyZXBsYWNlbWVudCA9IChSZXBsYWNlbWVudFNwYW4pc3BhbjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNwYW4udXBkYXRlRHJhd1N0YXRlKHdvcmtQYWludCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLSAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0bXA7Ci0gICAgICAgICAgICBpbnQgdG1wc3RhcnQsIHRtcGVuZDsKLQotICAgICAgICAgICAgaWYgKHJ1bklzUnRsKSB7Ci0gICAgICAgICAgICAgICAgdG1wID0gVGV4dFV0aWxzLmdldFJldmVyc2UodGV4dCwgc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICAgICAgdG1wc3RhcnQgPSAwOwotICAgICAgICAgICAgICAgIC8vIFhYWDogYXNzdW1lcyBnZXRSZXZlcnNlIGRvZXNuJ3QgY2hhbmdlIHRoZSBsZW5ndGggb2YgdGhlIHRleHQKLSAgICAgICAgICAgICAgICB0bXBlbmQgPSBlbmQgLSBzdGFydDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdG1wID0gdGV4dDsKLSAgICAgICAgICAgICAgICB0bXBzdGFydCA9IHN0YXJ0OwotICAgICAgICAgICAgICAgIHRtcGVuZCA9IGVuZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZtaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd29ya1BhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICh3b3JrUGFpbnQuYmdDb2xvciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjID0gd29ya1BhaW50LmdldENvbG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIFBhaW50LlN0eWxlIHMgPSB3b3JrUGFpbnQuZ2V0U3R5bGUoKTsKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldENvbG9yKHdvcmtQYWludC5iZ0NvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldFN0eWxlKFBhaW50LlN0eWxlLkZJTEwpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghaGF2ZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB3b3JrUGFpbnQubWVhc3VyZVRleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCh4IC0gcmV0LCB0b3AsIHgsIGJvdHRvbSwgd29ya1BhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KHgsIHRvcCwgeCArIHJldCwgYm90dG9tLCB3b3JrUGFpbnQpOwotCi0gICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXRTdHlsZShzKTsKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldENvbG9yKGMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaGF2ZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB3b3JrUGFpbnQubWVhc3VyZVRleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtIHJldCwgeSArIHdvcmtQYWludC5iYXNlbGluZVNoaWZ0LCB3b3JrUGFpbnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZWVkV2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGF2ZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gd29ya1BhaW50Lm1lYXN1cmVUZXh0KHRtcCwgdG1wc3RhcnQsIHRtcGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZVdpZHRoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCh0bXAsIHRtcHN0YXJ0LCB0bXBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5ICsgd29ya1BhaW50LmJhc2VsaW5lU2hpZnQsIHdvcmtQYWludCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobmVlZFdpZHRoICYmICFoYXZlV2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gd29ya1BhaW50Lm1lYXN1cmVUZXh0KHRtcCwgdG1wc3RhcnQsIHRtcGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIGhhdmVXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcmVwbGFjZW1lbnQuZ2V0U2l6ZSh3b3JrUGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsIGZtaSk7Ci0KLSAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudC5kcmF3KGNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0gcmV0LCB0b3AsIHksIGJvdHRvbSwgd29ya1BhaW50KTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50LmRyYXcoY2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCB3b3JrUGFpbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRpciA9PSBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICByZXR1cm4gLXJldDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhZHZhbmNlIHdpZHRocyBmb3IgYSB1bmlmb3JtIGxlZnQtdG8tcmlnaHQgcnVuIG9mIHRleHQgd2l0aAotICAgICAqIG5vIHN0eWxlIGNoYW5nZXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcnVuLiBJZiBhbnkgc3R5bGUgaXMgcmVwbGFjZW1lbnQKLSAgICAgKiB0ZXh0LCB0aGUgZmlyc3QgY2hhcmFjdGVyIHdpbGwgZ2V0IHRoZSB3aWR0aCBvZiB0aGUgcmVwbGFjZW1lbnQgYW5kIHRoZQotICAgICAqIHJlbWFpbmluZyBjaGFyYWN0ZXJzIHdpbGwgZ2V0IGEgd2lkdGggb2YgMC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFpbnQgdGhlIHBhaW50LCB3aWxsIG5vdCBiZSBtb2RpZmllZAotICAgICAqIEBwYXJhbSB3b3JrUGFpbnQgYSBwYWludCB0byBtb2RpZnk7IG9uIHJldHVybiB3aWxsIHJlZmxlY3QgdGhlIG9yaWdpbmFsCi0gICAgICogICAgICAgIHBhaW50IHBsdXMgdGhlIGVmZmVjdCBvZiBhbGwgc3BhbnMgb24gdGhlIHJ1bgotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0Ci0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgcnVuCi0gICAgICogQHBhcmFtIGVuZCB0aGUgbGltaXQgb2YgdGhlIHJ1bgotICAgICAqIEBwYXJhbSB3aWR0aHMgYXJyYXkgdG8gcmVjZWl2ZSB0aGUgYWR2YW5jZSB3aWR0aHMgb2YgdGhlIGNoYXJhY3RlcnMuIE11c3QKLSAgICAgKiAgICAgICAgYmUgYXQgbGVhc3QgYSBsYXJnZSBhcyAoZW5kIC0gc3RhcnQpLgotICAgICAqIEBwYXJhbSBmbWkgRm9udE1ldHJpY3MgaW5mb3JtYXRpb247IGNhbiBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgYWN0dWFsIG51bWJlciBvZiB3aWR0aHMgcmV0dXJuZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRUZXh0V2lkdGhzKFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFubmVkIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0W10gd2lkdGhzLCBQYWludC5Gb250TWV0cmljc0ludCBmbWkpIHsKLSAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0KLSAgICAgICAgICAgIHRleHQuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7Ci0KLQkJUmVwbGFjZW1lbnRTcGFuIHJlcGxhY2VtZW50ID0gbnVsbDsKLSAgICAgICAgd29ya1BhaW50LnNldChwYWludCk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlNZXRyaWNBZmZlY3RpbmdTcGFuIHNwYW4gPSBzcGFuc1tpXTsKLQkJCWlmIChzcGFuIGluc3RhbmNlb2YgUmVwbGFjZW1lbnRTcGFuKSB7Ci0JCQkJcmVwbGFjZW1lbnQgPSAoUmVwbGFjZW1lbnRTcGFuKXNwYW47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzcGFuLnVwZGF0ZU1lYXN1cmVTdGF0ZSh3b3JrUGFpbnQpOwotCQkJfQotCQl9Ci0JCi0gICAgICAgIGludCByZXN1bHQ7Ci0gICAgICAgIGlmIChyZXBsYWNlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3b3JrUGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm1pKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IHdvcmtQYWludC5nZXRUZXh0V2lkdGhzKHRleHQsIHN0YXJ0LCBlbmQsIHdpZHRocyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgd2lkID0gcmVwbGFjZW1lbnQuZ2V0U2l6ZSh3b3JrUGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsIGZtaSk7Ci0KLSAgICAgICAgICAgIGlmIChlbmQgPiBzdGFydCkgewotICAgICAgICAgICAgICAgIHdpZHRoc1swXSA9IHdpZDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQgKyAxOyBpIDwgZW5kOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHdpZHRoc1tpIC0gc3RhcnRdID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3VsdCA9IGVuZCAtIHN0YXJ0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVuZGVycyBhbmQvb3IgbWVhc3VyZXMgYSBkaXJlY3Rpb25hbCBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLgotICAgICAqIFVubGlrZSB7QGxpbmsgI2RyYXdVbmlmb3JtUnVufSwgdGhpcyBjYW4gcmVuZGVyIHJ1bnMgdGhhdCBjcm9zcyBzdHlsZQotICAgICAqIGJvdW5kYXJpZXMuICBSZXR1cm5zIHRoZSBzaWduZWQgYWR2YW5jZSB3aWR0aCwgaWYgcmVxdWVzdGVkLgotICAgICAqCi0gICAgICogPHA+VGhlIHggcG9zaXRpb24gaXMgdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGV4dC4gSW4gYSByaWdodC10by1sZWZ0Ci0gICAgICogcGFyYWdyYXBoLCB0aGlzIHdpbGwgYmUgdG8gdGhlIHJpZ2h0IG9mIHRoZSB0ZXh0IHRvIGJlIGRyYXduLiBQYWludAotICAgICAqIHNob3VsZCBub3QgaGF2ZSBhbiBBbGlnbiB2YWx1ZSBvdGhlciB0aGFuIExFRlQgb3IgcG9zaXRpb25pbmcgd2lsbCBnZXQKLSAgICAgKiBjb25mdXNlZC4KLSAgICAgKgotICAgICAqIDxwPlRoaXMgb3B0aW1pemVzIGZvciB1bnN0eWxlZCB0ZXh0IGFuZCBzbyB3b3JrUGFpbnQgbWlnaHQgbm90IGJlCi0gICAgICogbW9kaWZpZWQgYnkgdGhpcyBjYWxsLgotICAgICAqCi0gICAgICogPHA+VGhlIHJldHVybmVkIGFkdmFuY2Ugd2lkdGggd2lsbCBiZSA8IDAgaWYgdGhlIHBhcmFncmFwaAotICAgICAqIGRpcmVjdGlvbiBpcyByaWdodC10by1sZWZ0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IGRyYXdEaXJlY3Rpb25hbFJ1bihDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsIGJvb2xlYW4gcnVuSXNSdGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgewotCi0gICAgICAgIC8vIFhYWDogSXQgbG9va3MgbGlrZSBhbGwgY2FsbHMgdG8gdGhpcyBBUEkgbWF0Y2ggZGlyIGFuZCBydW5Jc1J0bCwgc28KLSAgICAgICAgLy8gaGF2aW5nIGJvdGggcGFyYW1ldGVycyBpcyByZWR1bmRhbnQgYW5kIGNvbmZ1c2luZy4KLQotICAgICAgICAvLyBmYXN0IHBhdGggZm9yIHVuc3R5bGVkIHRleHQKLSAgICAgICAgaWYgKCEodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpKSB7Ci0gICAgICAgICAgICBmbG9hdCByZXQgPSAwOwotCi0gICAgICAgICAgICBpZiAocnVuSXNSdGwpIHsKLSAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdG1wID0gVGV4dFV0aWxzLmdldFJldmVyc2UodGV4dCwgc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICAgICAgLy8gWFhYOiB0aGlzIGFzc3VtZXMgZ2V0UmV2ZXJzZSBkb2Vzbid0IHR3ZWFrIHRoZSBsZW5ndGggb2YKLSAgICAgICAgICAgICAgICAvLyB0aGUgdGV4dAotICAgICAgICAgICAgICAgIGludCB0bXBlbmQgPSBlbmQgLSBzdGFydDsKLQotICAgICAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCB8fCBuZWVkV2lkdGgpCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IHBhaW50Lm1lYXN1cmVUZXh0KHRtcCwgMCwgdG1wZW5kKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KHRtcCwgMCwgdG1wZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtIHJldCwgeSwgcGFpbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobmVlZFdpZHRoKQotICAgICAgICAgICAgICAgICAgICByZXQgPSBwYWludC5tZWFzdXJlVGV4dCh0ZXh0LCBzdGFydCwgZW5kKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KHRleHQsIHN0YXJ0LCBlbmQsIHgsIHksIHBhaW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZtaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm1pKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHJldCAqIGRpcjsgICAvLyBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQgPT0gLTEKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmxvYXQgb3ggPSB4OwotICAgICAgICBpbnQgbWluQXNjZW50ID0gMCwgbWF4RGVzY2VudCA9IDAsIG1pblRvcCA9IDAsIG1heEJvdHRvbSA9IDA7Ci0KLSAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSB0ZXh0OwotICAgICAgICBDbGFzczw/PiBkaXZpc2lvbjsKLQotICAgICAgICBpZiAoY2FudmFzID09IG51bGwpCi0gICAgICAgICAgICBkaXZpc2lvbiA9IE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3M7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRpdmlzaW9uID0gQ2hhcmFjdGVyU3R5bGUuY2xhc3M7Ci0KLSAgICAgICAgaW50IG5leHQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSA9IG5leHQpIHsKLSAgICAgICAgICAgIG5leHQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oaSwgZW5kLCBkaXZpc2lvbik7Ci0KLSAgICAgICAgICAgIC8vIFhYWDogaWYgZGlyIGFuZCBydW5Jc1J0bCB3ZXJlIG5vdCB0aGUgc2FtZSwgdGhpcyB3b3VsZCBkcmF3Ci0gICAgICAgICAgICAvLyBzcGFucyBpbiB0aGUgd3Jvbmcgb3JkZXIsIGJ1dCBubyBvbmUgYXBwZWFycyB0byBjYWxsIGl0IHRoaXMKLSAgICAgICAgICAgIC8vIHdheS4KLSAgICAgICAgICAgIHggKz0gZHJhd1VuaWZvcm1SdW4oY2FudmFzLCBzcCwgaSwgbmV4dCwgZGlyLCBydW5Jc1J0bCwKLSAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCBmbWksIHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICBuZWVkV2lkdGggfHwgbmV4dCAhPSBlbmQpOwotCi0gICAgICAgICAgICBpZiAoZm1pICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZm1pLmFzY2VudCA8IG1pbkFzY2VudCkKLSAgICAgICAgICAgICAgICAgICAgbWluQXNjZW50ID0gZm1pLmFzY2VudDsKLSAgICAgICAgICAgICAgICBpZiAoZm1pLmRlc2NlbnQgPiBtYXhEZXNjZW50KQotICAgICAgICAgICAgICAgICAgICBtYXhEZXNjZW50ID0gZm1pLmRlc2NlbnQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZm1pLnRvcCA8IG1pblRvcCkKLSAgICAgICAgICAgICAgICAgICAgbWluVG9wID0gZm1pLnRvcDsKLSAgICAgICAgICAgICAgICBpZiAoZm1pLmJvdHRvbSA+IG1heEJvdHRvbSkKLSAgICAgICAgICAgICAgICAgICAgbWF4Qm90dG9tID0gZm1pLmJvdHRvbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmbWkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgewotICAgICAgICAgICAgICAgIHBhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtaSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZtaS5hc2NlbnQgPSBtaW5Bc2NlbnQ7Ci0gICAgICAgICAgICAgICAgZm1pLmRlc2NlbnQgPSBtYXhEZXNjZW50OwotICAgICAgICAgICAgICAgIGZtaS50b3AgPSBtaW5Ub3A7Ci0gICAgICAgICAgICAgICAgZm1pLmJvdHRvbSA9IG1heEJvdHRvbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB4IC0gb3g7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRHJhd3MgYSB1bmlkaXJlY3Rpb25hbCBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLCBhbmQgb3B0aW9uYWxseQotICAgICAqIHJldHVybnMgdGhlIHNpZ25lZCBhZHZhbmNlLiAgVW5saWtlIGRyYXdEaXJlY3Rpb25hbFJ1biwgdGhlIHBhcmFncmFwaAotICAgICAqIGRpcmVjdGlvbiBhbmQgcnVuIGRpcmVjdGlvbiBjYW4gYmUgZGlmZmVyZW50LgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZsb2F0IGRyYXdUZXh0KENhbnZhcyBjYW52YXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwgYm9vbGVhbiBydW5Jc1J0bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGludCB0b3AsIGludCB5LCBpbnQgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZFdpZHRoKSB7Ci0gICAgICAgIC8vIFhYWCB0aGlzIGxvZ2ljIGlzIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpID09IHJ1bklzUnRsCi0gICAgICAgIGlmICgoZGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCAmJiAhcnVuSXNSdGwpIHx8Ci0gICAgICAgICAgICAocnVuSXNSdGwgJiYgZGlyID09IExheW91dC5ESVJfTEVGVF9UT19SSUdIVCkpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgbmVlZHMgdGhlIHJlYWwgZGlyZWN0aW9uCi0gICAgICAgICAgICBmbG9hdCBjaCA9IGRyYXdEaXJlY3Rpb25hbFJ1bihudWxsLCB0ZXh0LCBzdGFydCwgZW5kLAotICAgICAgICAgICAgICAgICAgICBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQsIGZhbHNlLCAwLCAwLCAwLCAwLCBudWxsLCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LCB0cnVlKTsKLQotICAgICAgICAgICAgY2ggKj0gZGlyOyAgLy8gRElSX1JJR0hUX1RPX0xFRlQgPT0gLTEKLSAgICAgICAgICAgIGRyYXdEaXJlY3Rpb25hbFJ1bihjYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsIC1kaXIsCi0gICAgICAgICAgICAgICAgICAgIHJ1bklzUnRsLCB4ICsgY2gsIHRvcCwgeSwgYm90dG9tLCBudWxsLCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LCB0cnVlKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNoOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRyYXdEaXJlY3Rpb25hbFJ1bihjYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsIGRpciwgcnVuSXNSdGwsCi0gICAgICAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCBudWxsLCBwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICBuZWVkV2lkdGgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEcmF3cyBhIHJ1biBvZiB0ZXh0IG9uIGEgc2luZ2xlIGxpbmUsIHdpdGggaXRzCi0gICAgICogb3JpZ2luIGF0ICh4LHkpLCBpbiB0aGUgc3BlY2lmaWVkIFBhaW50LiBUaGUgb3JpZ2luIGlzIGludGVycHJldGVkIGJhc2VkCi0gICAgICogb24gdGhlIEFsaWduIHNldHRpbmcgaW4gdGhlIFBhaW50LgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgY29uc2lkZXJzIHN0eWxlIGluZm9ybWF0aW9uIGluIHRoZSB0ZXh0IChlLmcuIGV2ZW4gd2hlbiB0ZXh0Ci0gICAgICogaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIGFuZHJvaWQudGV4dC5TcGFubmVkfSwgdGhpcyBtZXRob2QgY29ycmVjdGx5Ci0gICAgICogZHJhd3MgdGhlIHRleHQpLiBTZWUgYWxzbwotICAgICAqIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyNkcmF3VGV4dChDaGFyU2VxdWVuY2UsIGludCwgaW50LCBmbG9hdCwKLSAgICAgKiBmbG9hdCwgUGFpbnQpfSBhbmQKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjZHJhd1JlY3QoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsCi0gICAgICogUGFpbnQpfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2FudmFzIFRoZSB0YXJnZXQgY2FudmFzCi0gICAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgdG8gYmUgZHJhd24KLSAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGV4dCB0byBkcmF3Ci0gICAgICogQHBhcmFtIGVuZCAoZW5kIC0gMSkgaXMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0ZXh0IHRvIGRyYXcKLSAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHRleHQuIFRoaXMgbXVzdCBiZQotICAgICAqICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXh0LkxheW91dCNESVJfTEVGVF9UT19SSUdIVH0gb3IKLSAgICAgKiAgICAgICAge0BsaW5rIGFuZHJvaWQudGV4dC5MYXlvdXQjRElSX1JJR0hUX1RPX0xFRlR9LgotICAgICAqIEBwYXJhbSB4IFRoZSB4LWNvb3JkaW5hdGUgb2Ygb3JpZ2luIGZvciB3aGVyZSB0byBkcmF3IHRoZSB0ZXh0Ci0gICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIHNpZGUgb2YgdGhlIHJlY3RhbmdsZSB0byBiZSBkcmF3bgotICAgICAqIEBwYXJhbSB5IFRoZSB5LWNvb3JkaW5hdGUgb2Ygb3JpZ2luIGZvciB3aGVyZSB0byBkcmF3IHRoZSB0ZXh0Ci0gICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIHNpZGUgb2YgdGhlIHJlY3RhbmdsZSB0byBiZSBkcmF3bgotICAgICAqIEBwYXJhbSBwYWludCBUaGUgbWFpbiB7QGxpbmsgVGV4dFBhaW50fSBvYmplY3QuCi0gICAgICogQHBhcmFtIHdvcmtQYWludCBUaGUge0BsaW5rIFRleHRQYWludH0gb2JqZWN0IHVzZWQgZm9yIHRlbXBvcmFsCi0gICAgICogICAgICAgIHdvcmtzcGFjZS4KLSAgICAgKiBAcGFyYW0gbmVlZFdpZHRoIElmIHRydWUsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHdpZHRoIG9mIGRyYXduIHRleHQKLSAgICAgKiBAcmV0dXJuIFdpZHRoIG9mIHRoZSBkcmF3biB0ZXh0IGlmIG5lZWRXaWR0aCBpcyB0cnVlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmbG9hdCBkcmF3VGV4dChDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgewotICAgICAgICAvLyBGb3Igc2FmZXR5LgotICAgICAgICBkaXJlY3Rpb24gPSBkaXJlY3Rpb24gPj0gMCA/IExheW91dC5ESVJfTEVGVF9UT19SSUdIVAotICAgICAgICAgICAgICAgIDogTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUOwotCi0gICAgICAgIC8vIEhpZGUgcnVuSXNSdGwgcGFyYW1ldGVyIHNpbmNlIGl0IGlzIG1lYW5pbmdsZXNzIGZvciBleHRlcm5hbAotICAgICAgICAvLyBkZXZlbG9wZXJzLgotICAgICAgICAvLyBYWFg6IHRoZSBydW5Jc1J0bCBwcm9iYWJseSBvdWdodCB0byBiZSB0aGUgc2FtZSBhcyBkaXJlY3Rpb24sIHRoZW4KLSAgICAgICAgLy8gdGhpcyBjb3VsZCBkcmF3IHJ0bCB0ZXh0LgotICAgICAgICByZXR1cm4gZHJhd1RleHQoY2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLCBkaXJlY3Rpb24sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgeCwgdG9wLCB5LCBib3R0b20sIHBhaW50LCB3b3JrUGFpbnQsIG5lZWRXaWR0aCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdpZHRoIG9mIGEgcnVuIG9mIGxlZnQtdG8tcmlnaHQgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLAotICAgICAqIGNvbnNpZGVyaW5nIHN0eWxlIGluZm9ybWF0aW9uIGluIHRoZSB0ZXh0IChlLmcuIGV2ZW4gd2hlbiB0ZXh0IGlzIGFuCi0gICAgICogaW5zdGFuY2Ugb2Yge0BsaW5rIGFuZHJvaWQudGV4dC5TcGFubmVkfSwgdGhpcyBtZXRob2QgY29ycmVjdGx5IG1lYXN1cmVzCi0gICAgICogdGhlIHdpZHRoIG9mIHRoZSB0ZXh0KS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFpbnQgdGhlIG1haW4ge0BsaW5rIFRleHRQYWludH0gb2JqZWN0OyB3aWxsIG5vdCBiZSBtb2RpZmllZAotICAgICAqIEBwYXJhbSB3b3JrUGFpbnQgdGhlIHtAbGluayBUZXh0UGFpbnR9IG9iamVjdCBhdmFpbGFibGUgZm9yIG1vZGlmaWNhdGlvbjsKLSAgICAgKiAgICAgICAgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgdXNlZAotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIG1lYXN1cmUKLSAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gc3RhcnQgbWVhc3VyaW5nCi0gICAgICogQHBhcmFtIGVuZCAxIGJleW9uZCB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyIHRvIG1lYXN1cmUKLSAgICAgKiBAcGFyYW0gZm1pIEZvbnRNZXRyaWNzIGluZm9ybWF0aW9uOyBjYW4gYmUgbnVsbAotICAgICAqIEByZXR1cm4gVGhlIHdpZHRoIG9mIHRoZSB0ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmbG9hdCBtZWFzdXJlVGV4dChUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtaSkgewotICAgICAgICByZXR1cm4gZHJhd0RpcmVjdGlvbmFsUnVuKG51bGwsIHRleHQsIHN0YXJ0LCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJfTEVGVF9UT19SSUdIVCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIGZtaSwgcGFpbnQsIHdvcmtQYWludCwgdHJ1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0TGluZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0TGluZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNzQ4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRMaW5lLmphdmEKQEAgLTAsMCArMSw5NDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGV4dDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludC5Gb250TWV0cmljc0ludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQuRGlyZWN0aW9uczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0LlRhYlN0b3BzOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGxpbmUgb2Ygc3R5bGVkIHRleHQsIGZvciBtZWFzdXJpbmcgaW4gdmlzdWFsIG9yZGVyIGFuZAorICogZm9yIHJlbmRlcmluZy4KKyAqCisgKiA8cD5HZXQgYSBuZXcgaW5zdGFuY2UgdXNpbmcgb2J0YWluKCksIGFuZCB3aGVuIGZpbmlzaGVkIHdpdGggaXQsIHJldHVybiBpdAorICogdG8gdGhlIHBvb2wgdXNpbmcgcmVjeWNsZSgpLgorICoKKyAqIDxwPkNhbGwgc2V0IHRvIHByZXBhcmUgdGhlIGluc3RhbmNlIGZvciB1c2UsIHRoZW4gZWl0aGVyIGRyYXcsIG1lYXN1cmUsCisgKiBtZXRyaWNzLCBvciBjYXJldFRvTGVmdFJpZ2h0T2YuCisgKgorICogQGhpZGUKKyAqLworY2xhc3MgVGV4dExpbmUgeworICAgIHByaXZhdGUgVGV4dFBhaW50IG1QYWludDsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGV4dDsKKyAgICBwcml2YXRlIGludCBtU3RhcnQ7CisgICAgcHJpdmF0ZSBpbnQgbUxlbjsKKyAgICBwcml2YXRlIGludCBtRGlyOworICAgIHByaXZhdGUgRGlyZWN0aW9ucyBtRGlyZWN0aW9uczsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhc1RhYnM7CisgICAgcHJpdmF0ZSBUYWJTdG9wcyBtVGFiczsKKyAgICBwcml2YXRlIGNoYXJbXSBtQ2hhcnM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1DaGFyc1ZhbGlkOworICAgIHByaXZhdGUgU3Bhbm5lZCBtU3Bhbm5lZDsKKyAgICBwcml2YXRlIGZpbmFsIFRleHRQYWludCBtV29ya1BhaW50ID0gbmV3IFRleHRQYWludCgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgVGV4dExpbmVbXSBjYWNoZWQgPSBuZXcgVGV4dExpbmVbM107CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IFRleHRMaW5lIGZyb20gdGhlIHNoYXJlZCBwb29sLgorICAgICAqCisgICAgICogQHJldHVybiBhbiB1bmluaXRpYWxpemVkIFRleHRMaW5lCisgICAgICovCisgICAgc3RhdGljIFRleHRMaW5lIG9idGFpbigpIHsKKyAgICAgICAgVGV4dExpbmUgdGw7CisgICAgICAgIHN5bmNocm9uaXplZCAoY2FjaGVkKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gY2FjaGVkLmxlbmd0aDsgLS1pID49IDA7KSB7CisgICAgICAgICAgICAgICAgaWYgKGNhY2hlZFtpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRsID0gY2FjaGVkW2ldOworICAgICAgICAgICAgICAgICAgICBjYWNoZWRbaV0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRsID0gbmV3IFRleHRMaW5lKCk7CisgICAgICAgIExvZy52KCJUTElORSIsICJuZXc6ICIgKyB0bCk7CisgICAgICAgIHJldHVybiB0bDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXRzIGEgVGV4dExpbmUgYmFjayBpbnRvIHRoZSBzaGFyZWQgcG9vbC4gRG8gbm90IHVzZSB0aGlzIFRleHRMaW5lIG9uY2UKKyAgICAgKiBpdCBoYXMgYmVlbiByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0gdGwgdGhlIHRleHRMaW5lCisgICAgICogQHJldHVybiBudWxsLCBhcyBhIGNvbnZlbmllbmNlIGZyb20gY2xlYXJpbmcgcmVmZXJlbmNlcyB0byB0aGUgcHJvdmlkZWQKKyAgICAgKiBUZXh0TGluZQorICAgICAqLworICAgIHN0YXRpYyBUZXh0TGluZSByZWN5Y2xlKFRleHRMaW5lIHRsKSB7CisgICAgICAgIHRsLm1UZXh0ID0gbnVsbDsKKyAgICAgICAgdGwubVBhaW50ID0gbnVsbDsKKyAgICAgICAgdGwubURpcmVjdGlvbnMgPSBudWxsOworICAgICAgICBpZiAodGwubUxlbiA8IDI1MCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkKGNhY2hlZCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGVkLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWRbaV0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkW2ldID0gdGw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyBhIFRleHRMaW5lIGFuZCBwcmVwYXJlcyBpdCBmb3IgdXNlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhaW50IHRoZSBiYXNlIHBhaW50IGZvciB0aGUgbGluZQorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0LCBjYW4gYmUgU3R5bGVkCisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgbGluZSByZWxhdGl2ZSB0byB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBsaW1pdCB0aGUgbGltaXQgb2YgdGhlIGxpbmUgcmVsYXRpdmUgdG8gdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gZGlyIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uIG9mIHRoaXMgbGluZQorICAgICAqIEBwYXJhbSBkaXJlY3Rpb25zIHRoZSBkaXJlY3Rpb25zIGluZm9ybWF0aW9uIG9mIHRoaXMgbGluZQorICAgICAqIEBwYXJhbSBoYXNUYWJzIHRydWUgaWYgdGhlIGxpbmUgbWlnaHQgY29udGFpbiB0YWJzIG9yIGVtb2ppCisgICAgICogQHBhcmFtIHRhYlN0b3BzIHRoZSB0YWJTdG9wcy4gQ2FuIGJlIG51bGwuCisgICAgICovCisgICAgdm9pZCBzZXQoVGV4dFBhaW50IHBhaW50LCBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgbGltaXQsIGludCBkaXIsCisgICAgICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMsIGJvb2xlYW4gaGFzVGFicywgVGFiU3RvcHMgdGFiU3RvcHMpIHsKKyAgICAgICAgbVBhaW50ID0gcGFpbnQ7CisgICAgICAgIG1UZXh0ID0gdGV4dDsKKyAgICAgICAgbVN0YXJ0ID0gc3RhcnQ7CisgICAgICAgIG1MZW4gPSBsaW1pdCAtIHN0YXJ0OworICAgICAgICBtRGlyID0gZGlyOworICAgICAgICBtRGlyZWN0aW9ucyA9IGRpcmVjdGlvbnM7CisgICAgICAgIG1IYXNUYWJzID0gaGFzVGFiczsKKyAgICAgICAgbVNwYW5uZWQgPSBudWxsOworCisgICAgICAgIGJvb2xlYW4gaGFzUmVwbGFjZW1lbnQgPSBmYWxzZTsKKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CisgICAgICAgICAgICBtU3Bhbm5lZCA9IChTcGFubmVkKSB0ZXh0OworICAgICAgICAgICAgaGFzUmVwbGFjZW1lbnQgPSBtU3Bhbm5lZC5nZXRTcGFucyhzdGFydCwgbGltaXQsCisgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3Bhbi5jbGFzcykubGVuZ3RoID4gMDsKKyAgICAgICAgfQorCisgICAgICAgIG1DaGFyc1ZhbGlkID0gaGFzUmVwbGFjZW1lbnQgfHwgaGFzVGFicyB8fAorICAgICAgICAgICAgZGlyZWN0aW9ucyAhPSBMYXlvdXQuRElSU19BTExfTEVGVF9UT19SSUdIVDsKKworICAgICAgICBpZiAobUNoYXJzVmFsaWQpIHsKKyAgICAgICAgICAgIGlmIChtQ2hhcnMgPT0gbnVsbCB8fCBtQ2hhcnMubGVuZ3RoIDwgbUxlbikgeworICAgICAgICAgICAgICAgIG1DaGFycyA9IG5ldyBjaGFyW0FycmF5VXRpbHMuaWRlYWxDaGFyQXJyYXlTaXplKG1MZW4pXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgbGltaXQsIG1DaGFycywgMCk7CisgICAgICAgICAgICBpZiAoaGFzUmVwbGFjZW1lbnQpIHsKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlc2UgYWxsIGF0IG9uY2Ugc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBpdCBhcyB3ZSBnby4KKyAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgZWFjaCByZXBsYWNlbWVudCBydW4gd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAvLyBvYmplY3QtcmVwbGFjZW1lbnQgY2hhcmFjdGVyIGFuZCB0aGUgcmVtYWluZGVyIHdpdGggemVybyB3aWR0aAorICAgICAgICAgICAgICAgIC8vIG5vbi1icmVhayBzcGFjZSBha2EgQk9NLiAgQ3Vyc29yIG1vdmVtZW50IGNvZGUgc2tpcHMgdGhlc2UKKyAgICAgICAgICAgICAgICAvLyB6ZXJvLXdpZHRoIGNoYXJhY3RlcnMuCisgICAgICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gbUNoYXJzOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgaW5leHQ7IGkgPCBsaW1pdDsgaSA9IGluZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGluZXh0ID0gbVNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKGksIGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3Bhbm5lZC5nZXRTcGFucyhpLCBpbmV4dCwgUmVwbGFjZW1lbnRTcGFuLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGggPiAwKSB7IC8vIHRyYW5zaXRpb24gaW50byBhIHNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzW2kgLSBzdGFydF0gPSAnXHVmZmZjJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpIC0gc3RhcnQgKyAxLCBlID0gaW5leHQgLSBzdGFydDsgaiA8IGU7ICsraikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzW2pdID0gJ1x1ZmVmZic7IC8vIHVzZWQgYXMgWldOQlMsIG1hcmtzIHBvc2l0aW9ucyB0byBza2lwCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVRhYnMgPSB0YWJTdG9wczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXJzIHRoZSBUZXh0TGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIHRoZSBjYW52YXMgdG8gcmVuZGVyIG9uCisgICAgICogQHBhcmFtIHggdGhlIGxlYWRpbmcgbWFyZ2luIHBvc2l0aW9uCisgICAgICogQHBhcmFtIHRvcCB0aGUgdG9wIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHkgdGhlIGJhc2VsaW5lCisgICAgICogQHBhcmFtIGJvdHRvbSB0aGUgYm90dG9tIG9mIHRoZSBsaW5lCisgICAgICovCisgICAgdm9pZCBkcmF3KENhbnZhcyBjLCBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSkgeworICAgICAgICBpZiAoIW1IYXNUYWJzKSB7CisgICAgICAgICAgICBpZiAobURpcmVjdGlvbnMgPT0gTGF5b3V0LkRJUlNfQUxMX0xFRlRfVE9fUklHSFQpIHsKKyAgICAgICAgICAgICAgICBkcmF3UnVuKGMsIDAsIDAsIG1MZW4sIGZhbHNlLCB4LCB0b3AsIHksIGJvdHRvbSwgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRGlyZWN0aW9ucyA9PSBMYXlvdXQuRElSU19BTExfUklHSFRfVE9fTEVGVCkgeworICAgICAgICAgICAgICAgIGRyYXdSdW4oYywgMCwgMCwgbUxlbiwgdHJ1ZSwgeCwgdG9wLCB5LCBib3R0b20sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBoID0gMDsKKyAgICAgICAgaW50W10gcnVucyA9IG1EaXJlY3Rpb25zLm1EaXJlY3Rpb25zOworICAgICAgICBSZWN0RiBlbW9qaVJlY3QgPSBudWxsOworCisgICAgICAgIGludCBsYXN0UnVuSW5kZXggPSBydW5zLmxlbmd0aCAtIDI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVucy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgaW50IHJ1blN0YXJ0ID0gcnVuc1tpXTsKKyAgICAgICAgICAgIGludCBydW5MaW1pdCA9IHJ1blN0YXJ0ICsgKHJ1bnNbaSsxXSAmIExheW91dC5SVU5fTEVOR1RIX01BU0spOworICAgICAgICAgICAgaWYgKHJ1bkxpbWl0ID4gbUxlbikgeworICAgICAgICAgICAgICAgIHJ1bkxpbWl0ID0gbUxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4gcnVuSXNSdGwgPSAocnVuc1tpKzFdICYgTGF5b3V0LlJVTl9SVExfRkxBRykgIT0gMDsKKworICAgICAgICAgICAgaW50IHNlZ3N0YXJ0ID0gcnVuU3RhcnQ7CisgICAgICAgICAgICBjaGFyW10gY2hhcnMgPSBtQ2hhcnM7CisgICAgICAgICAgICBmb3IgKGludCBqID0gbUhhc1RhYnMgPyBydW5TdGFydCA6IHJ1bkxpbWl0OyBqIDw9IHJ1bkxpbWl0OyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgY29kZXB0ID0gMDsKKyAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBudWxsOworCisgICAgICAgICAgICAgICAgaWYgKG1IYXNUYWJzICYmIGogPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICBjb2RlcHQgPSBtQ2hhcnNbal07CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gMHhkODAwICYmIGNvZGVwdCA8IDB4ZGMwMCAmJiBqICsgMSA8IHJ1bkxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlcHQgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQobUNoYXJzLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gTGF5b3V0Lk1JTl9FTU9KSSAmJiBjb2RlcHQgPD0gTGF5b3V0Lk1BWF9FTU9KSSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtID0gTGF5b3V0LkVNT0pJX0ZBQ1RPUlkuZ2V0Qml0bWFwRnJvbUFuZHJvaWRQdWEoY29kZXB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZXB0ID4gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGogPT0gcnVuTGltaXQgfHwgY29kZXB0ID09ICdcdCcgfHwgYm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBoICs9IGRyYXdSdW4oYywgaSwgc2Vnc3RhcnQsIGosIHJ1bklzUnRsLCB4K2gsIHRvcCwgeSwgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgIT0gbGFzdFJ1bkluZGV4IHx8IGogIT0gbUxlbik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA9PSAnXHQnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoID0gbURpciAqIG5leHRUYWIoaCAqIG1EaXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJtQXNjZW50ID0gYXNjZW50KGopOworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYml0bWFwSGVpZ2h0ID0gYm0uZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZSA9IC1ibUFzY2VudCAvIGJpdG1hcEhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZHRoID0gYm0uZ2V0V2lkdGgoKSAqIHNjYWxlOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1vamlSZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaVJlY3QgPSBuZXcgUmVjdEYoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppUmVjdC5zZXQoeCArIGgsIHkgKyBibUFzY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCArIGggKyB3aWR0aCwgeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjLmRyYXdCaXRtYXAoYm0sIG51bGwsIGVtb2ppUmVjdCwgbVBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gd2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2Vnc3RhcnQgPSBqICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIG1ldHJpY3MgaW5mb3JtYXRpb24gZm9yIHRoZSBlbnRpcmUgbGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbWkgcmVjZWl2ZXMgZm9udCBtZXRyaWNzIGluZm9ybWF0aW9uLCBjYW4gYmUgbnVsbAorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBvZiB0aGUgbGluZQorICAgICAqLworICAgIGZsb2F0IG1ldHJpY3MoRm9udE1ldHJpY3NJbnQgZm1pKSB7CisgICAgICAgIHJldHVybiBtZWFzdXJlKG1MZW4sIGZhbHNlLCBmbWkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwb3NpdGlvbiBvbiB0aGUgbGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIGxpbmUtcmVsYXRpdmUgY2hhcmFjdGVyIG9mZnNldCwgYmV0d2VlbiAwIGFuZCB0aGUKKyAgICAgKiBsaW5lIGxlbmd0aCwgaW5jbHVzaXZlCisgICAgICogQHBhcmFtIHRyYWlsaW5nIHRydWUgdG8gbWVhc3VyZSB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgY2hhcmFjdGVyCisgICAgICogYmVmb3JlIG9mZnNldCwgZmFsc2UgdG8gbWVhc3VyZSB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSBjaGFyYWN0ZXIKKyAgICAgKiBhdCBvZmZzZXQuCisgICAgICogQHBhcmFtIGZtaSByZWNlaXZlcyBtZXRyaWNzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXF1ZXN0ZWQKKyAgICAgKiBjaGFyYWN0ZXIsIGNhbiBiZSBudWxsLgorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCBvZmZzZXQgZnJvbSB0aGUgbGVhZGluZyBtYXJnaW4gdG8gdGhlIHJlcXVlc3RlZAorICAgICAqIGNoYXJhY3RlciBlZGdlLgorICAgICAqLworICAgIGZsb2F0IG1lYXN1cmUoaW50IG9mZnNldCwgYm9vbGVhbiB0cmFpbGluZywgRm9udE1ldHJpY3NJbnQgZm1pKSB7CisgICAgICAgIGludCB0YXJnZXQgPSB0cmFpbGluZyA/IG9mZnNldCAtIDEgOiBvZmZzZXQ7CisgICAgICAgIGlmICh0YXJnZXQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGggPSAwOworCisgICAgICAgIGlmICghbUhhc1RhYnMpIHsKKyAgICAgICAgICAgIGlmIChtRGlyZWN0aW9ucyA9PSBMYXlvdXQuRElSU19BTExfTEVGVF9UT19SSUdIVCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtZWFzdXJlUnVuKDAsIDAsIG9mZnNldCwgbUxlbiwgZmFsc2UsIGZtaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobURpcmVjdGlvbnMgPT0gTGF5b3V0LkRJUlNfQUxMX1JJR0hUX1RPX0xFRlQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZVJ1bigwLCAwLCBvZmZzZXQsIG1MZW4sIHRydWUsIGZtaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjaGFyW10gY2hhcnMgPSBtQ2hhcnM7CisgICAgICAgIGludFtdIHJ1bnMgPSBtRGlyZWN0aW9ucy5tRGlyZWN0aW9uczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQgcnVuU3RhcnQgPSBydW5zW2ldOworICAgICAgICAgICAgaW50IHJ1bkxpbWl0ID0gcnVuU3RhcnQgKyAocnVuc1tpKzFdICYgTGF5b3V0LlJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpZiAocnVuTGltaXQgPiBtTGVuKSB7CisgICAgICAgICAgICAgICAgcnVuTGltaXQgPSBtTGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbGVhbiBydW5Jc1J0bCA9IChydW5zW2krMV0gJiBMYXlvdXQuUlVOX1JUTF9GTEFHKSAhPSAwOworCisgICAgICAgICAgICBpbnQgc2Vnc3RhcnQgPSBydW5TdGFydDsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBtSGFzVGFicyA/IHJ1blN0YXJ0IDogcnVuTGltaXQ7IGogPD0gcnVuTGltaXQ7IGorKykgeworICAgICAgICAgICAgICAgIGludCBjb2RlcHQgPSAwOworICAgICAgICAgICAgICAgIEJpdG1hcCBibSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBpZiAobUhhc1RhYnMgJiYgaiA8IHJ1bkxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgIGNvZGVwdCA9IGNoYXJzW2pdOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IDB4ZDgwMCAmJiBjb2RlcHQgPCAweGRjMDAgJiYgaiArIDEgPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29kZXB0ID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KGNoYXJzLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gTGF5b3V0Lk1JTl9FTU9KSSAmJiBjb2RlcHQgPD0gTGF5b3V0Lk1BWF9FTU9KSSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtID0gTGF5b3V0LkVNT0pJX0ZBQ1RPUlkuZ2V0Qml0bWFwRnJvbUFuZHJvaWRQdWEoY29kZXB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZXB0ID4gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGogPT0gcnVuTGltaXQgfHwgY29kZXB0ID09ICdcdCcgfHwgYm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluU2VnbWVudCA9IHRhcmdldCA+PSBzZWdzdGFydCAmJiB0YXJnZXQgPCBqOworCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWR2YW5jZSA9IChtRGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCkgPT0gcnVuSXNSdGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChpblNlZ21lbnQgJiYgYWR2YW5jZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGggKz0gbWVhc3VyZVJ1bihpLCBzZWdzdGFydCwgb2Zmc2V0LCBqLCBydW5Jc1J0bCwgZm1pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHcgPSBtZWFzdXJlUnVuKGksIHNlZ3N0YXJ0LCBqLCBqLCBydW5Jc1J0bCwgZm1pKTsKKyAgICAgICAgICAgICAgICAgICAgaCArPSBhZHZhbmNlID8gdyA6IC13OworCisgICAgICAgICAgICAgICAgICAgIGlmIChpblNlZ21lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoICs9IG1lYXN1cmVSdW4oaSwgc2Vnc3RhcnQsIG9mZnNldCwgaiwgcnVuSXNSdGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA9PSAnXHQnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IGopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGggPSBtRGlyICogbmV4dFRhYihoICogbURpcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09IGopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBibUFzY2VudCA9IGFzY2VudChqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZCA9IGJtLmdldFdpZHRoKCkgKiAtYm1Bc2NlbnQgLyBibS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gbURpciAqIHdpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHNlZ3N0YXJ0ID0gaiArIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogRHJhd3MgYSB1bmlkaXJlY3Rpb25hbCAoYnV0IHBvc3NpYmx5IG11bHRpLXN0eWxlZCkgcnVuIG9mIHRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzIHRvIGRyYXcgb24KKyAgICAgKiBAcGFyYW0gcnVuSW5kZXggdGhlIGluZGV4IG9mIHRoaXMgZGlyZWN0aW9uYWwgcnVuCisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBsaW5lLXJlbGF0aXZlIHN0YXJ0CisgICAgICogQHBhcmFtIGxpbWl0IHRoZSBsaW5lLXJlbGF0aXZlIGxpbWl0CisgICAgICogQHBhcmFtIHJ1bklzUnRsIHRydWUgaWYgdGhlIHJ1biBpcyByaWdodC10by1sZWZ0CisgICAgICogQHBhcmFtIHggdGhlIHBvc2l0aW9uIG9mIHRoZSBydW4gdGhhdCBpcyBjbG9zZXN0IHRvIHRoZSBsZWFkaW5nIG1hcmdpbgorICAgICAqIEBwYXJhbSB0b3AgdGhlIHRvcCBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSB5IHRoZSBiYXNlbGluZQorICAgICAqIEBwYXJhbSBib3R0b20gdGhlIGJvdHRvbSBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSBuZWVkV2lkdGggdHJ1ZSBpZiB0aGUgd2lkdGggdmFsdWUgaXMgcmVxdWlyZWQuCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIG9mIHRoZSBydW4sIGJhc2VkIG9uIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uLgorICAgICAqIE9ubHkgdmFsaWQgaWYgbmVlZFdpZHRoIGlzIHRydWUuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBkcmF3UnVuKENhbnZhcyBjLCBpbnQgcnVuSW5kZXgsIGludCBzdGFydCwKKyAgICAgICAgICAgIGludCBsaW1pdCwgYm9vbGVhbiBydW5Jc1J0bCwgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCisgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgeworCisgICAgICAgIGlmICgobURpciA9PSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQpID09IHJ1bklzUnRsKSB7CisgICAgICAgICAgICBmbG9hdCB3ID0gLW1lYXN1cmVSdW4ocnVuSW5kZXgsIHN0YXJ0LCBsaW1pdCwgbGltaXQsIHJ1bklzUnRsLCBudWxsKTsKKyAgICAgICAgICAgIGhhbmRsZVJ1bihydW5JbmRleCwgc3RhcnQsIGxpbWl0LCBsaW1pdCwgcnVuSXNSdGwsIGMsIHggKyB3LCB0b3AsCisgICAgICAgICAgICAgICAgICAgIHksIGJvdHRvbSwgbnVsbCwgZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaGFuZGxlUnVuKHJ1bkluZGV4LCBzdGFydCwgbGltaXQsIGxpbWl0LCBydW5Jc1J0bCwgYywgeCwgdG9wLAorICAgICAgICAgICAgICAgIHksIGJvdHRvbSwgbnVsbCwgbmVlZFdpZHRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZWFzdXJlcyBhIHVuaWRpcmVjdGlvbmFsIChidXQgcG9zc2libHkgbXVsdGktc3R5bGVkKSBydW4gb2YgdGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBydW5JbmRleCB0aGUgcnVuIGluZGV4CisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBsaW5lLXJlbGF0aXZlIHN0YXJ0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gbWVhc3VyZSB0bywgYmV0d2VlbiBzdGFydCBhbmQgbGltaXQgaW5jbHVzaXZlCisgICAgICogQHBhcmFtIGxpbWl0IHRoZSBsaW5lLXJlbGF0aXZlIGxpbWl0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gZm1pIHJlY2VpdmVzIG1ldHJpY3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcXVlc3RlZAorICAgICAqIHJ1biwgY2FuIGJlIG51bGwuCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBydW4gdG8gdGhlIGxlYWRpbmcgZWRnZQorICAgICAqIG9mIHRoZSBjaGFyYWN0ZXIgYXQgb2Zmc2V0LCBiYXNlZCBvbiB0aGUgcnVuIChub3QgcGFyYWdyYXBoKSBkaXJlY3Rpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1lYXN1cmVSdW4oaW50IHJ1bkluZGV4LCBpbnQgc3RhcnQsCisgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsIGJvb2xlYW4gcnVuSXNSdGwsIEZvbnRNZXRyaWNzSW50IGZtaSkgeworICAgICAgICByZXR1cm4gaGFuZGxlUnVuKHJ1bkluZGV4LCBzdGFydCwgb2Zmc2V0LCBsaW1pdCwgcnVuSXNSdGwsIG51bGwsCisgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgZm1pLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWxrIHRoZSBjdXJzb3IgdGhyb3VnaCB0aGlzIGxpbmUsIHNraXBwaW5nIGNvbmp1bmN0cyBhbmQKKyAgICAgKiB6ZXJvLXdpZHRoIGNoYXJhY3RlcnMuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGZ1bmN0aW9uIGNhbm5vdCBwcm9wZXJseSB3YWxrIHRoZSBjdXJzb3Igb2ZmIHRoZSBlbmRzIG9mIHRoZSBsaW5lCisgICAgICogc2luY2UgaXQgZG9lcyBub3Qga25vdyBhYm91dCBhbnkgc2hhcGluZyBvbiB0aGUgcHJldmlvdXMvZm9sbG93aW5nIGxpbmUKKyAgICAgKiB0aGF0IG1pZ2h0IGFmZmVjdCB0aGUgY3Vyc29yIHBvc2l0aW9uLiBDYWxsZXJzIG11c3QgZWl0aGVyIGF2b2lkIHRoZXNlCisgICAgICogc2l0dWF0aW9ucyBvciBoYW5kbGUgdGhlIHJlc3VsdCBzcGVjaWFsbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3Vyc29yIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yLCBiZXR3ZWVuIDAgYW5kIHRoZQorICAgICAqIGxlbmd0aCBvZiB0aGUgbGluZSwgaW5jbHVzaXZlCisgICAgICogQHBhcmFtIHRvTGVmdCB0cnVlIGlmIHRoZSBjYXJldCBpcyBtb3ZpbmcgdG8gdGhlIGxlZnQuCisgICAgICogQHJldHVybiB0aGUgbmV3IG9mZnNldC4gIElmIGl0IGlzIGxlc3MgdGhhbiAwIG9yIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoCisgICAgICogb2YgdGhlIGxpbmUsIHRoZSBwcmV2aW91cy9mb2xsb3dpbmcgbGluZSBzaG91bGQgYmUgZXhhbWluZWQgdG8gZ2V0IHRoZQorICAgICAqIGFjdHVhbCBvZmZzZXQuCisgICAgICovCisgICAgaW50IGdldE9mZnNldFRvTGVmdFJpZ2h0T2YoaW50IGN1cnNvciwgYm9vbGVhbiB0b0xlZnQpIHsKKyAgICAgICAgLy8gMSkgVGhlIGNhcmV0IG1hcmtzIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgYSBjaGFyYWN0ZXIuIFRoZSBjaGFyYWN0ZXIKKyAgICAgICAgLy8gbG9naWNhbGx5IGJlZm9yZSBpdCBtaWdodCBiZSBvbiBhIGRpZmZlcmVudCBsZXZlbCwgYW5kIHRoZSBhY3RpdmUgY2FyZXQKKyAgICAgICAgLy8gcG9zaXRpb24gaXMgb24gdGhlIGNoYXJhY3RlciBhdCB0aGUgbG93ZXIgbGV2ZWwuIElmIHRoYXQgY2hhcmFjdGVyCisgICAgICAgIC8vIHdhcyB0aGUgcHJldmlvdXMgY2hhcmFjdGVyLCB0aGUgY2FyZXQgaXMgb24gaXRzIHRyYWlsaW5nIGVkZ2UuCisgICAgICAgIC8vIDIpIFRha2UgdGhpcyBjaGFyYWN0ZXIvZWRnZSBhbmQgbW92ZSBpdCBpbiB0aGUgaW5kaWNhdGVkIGRpcmVjdGlvbi4KKyAgICAgICAgLy8gVGhpcyBnaXZlcyB5b3UgYSBuZXcgY2hhcmFjdGVyIGFuZCBhIG5ldyBlZGdlLgorICAgICAgICAvLyAzKSBUaGlzIHBvc2l0aW9uIGlzIGJldHdlZW4gdHdvIHZpc3VhbGx5IGFkamFjZW50IGNoYXJhY3RlcnMuICBPbmUgb2YKKyAgICAgICAgLy8gdGhlc2UgbWlnaHQgYmUgYXQgYSBsb3dlciBsZXZlbC4gIFRoZSBhY3RpdmUgcG9zaXRpb24gaXMgb24gdGhlCisgICAgICAgIC8vIGNoYXJhY3RlciBhdCB0aGUgbG93ZXIgbGV2ZWwuCisgICAgICAgIC8vIDQpIElmIHRoZSBhY3RpdmUgcG9zaXRpb24gaXMgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGNoYXJhY3RlciwKKyAgICAgICAgLy8gdGhlIG5ldyBjYXJldCBwb3NpdGlvbiBpcyB0aGUgZm9sbG93aW5nIGxvZ2ljYWwgY2hhcmFjdGVyLCBlbHNlIGl0CisgICAgICAgIC8vIGlzIHRoZSBjaGFyYWN0ZXIuCisKKyAgICAgICAgaW50IGxpbmVTdGFydCA9IDA7CisgICAgICAgIGludCBsaW5lRW5kID0gbUxlbjsKKyAgICAgICAgYm9vbGVhbiBwYXJhSXNSdGwgPSBtRGlyID09IC0xOworICAgICAgICBpbnRbXSBydW5zID0gbURpcmVjdGlvbnMubURpcmVjdGlvbnM7CisKKyAgICAgICAgaW50IHJ1bkluZGV4LCBydW5MZXZlbCA9IDAsIHJ1blN0YXJ0ID0gbGluZVN0YXJ0LCBydW5MaW1pdCA9IGxpbmVFbmQsIG5ld0NhcmV0ID0gLTE7CisgICAgICAgIGJvb2xlYW4gdHJhaWxpbmcgPSBmYWxzZTsKKworICAgICAgICBpZiAoY3Vyc29yID09IGxpbmVTdGFydCkgeworICAgICAgICAgICAgcnVuSW5kZXggPSAtMjsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJzb3IgPT0gbGluZUVuZCkgeworICAgICAgICAgICAgcnVuSW5kZXggPSBydW5zLmxlbmd0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBGaXJzdCwgZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBydW4gY29udGFpbmluZyB0aGUgY2hhcmFjdGVyIHdpdGgKKyAgICAgICAgICAvLyB0aGUgYWN0aXZlIGNhcmV0LgorICAgICAgICAgIGZvciAocnVuSW5kZXggPSAwOyBydW5JbmRleCA8IHJ1bnMubGVuZ3RoOyBydW5JbmRleCArPSAyKSB7CisgICAgICAgICAgICBydW5TdGFydCA9IGxpbmVTdGFydCArIHJ1bnNbcnVuSW5kZXhdOworICAgICAgICAgICAgaWYgKGN1cnNvciA+PSBydW5TdGFydCkgeworICAgICAgICAgICAgICBydW5MaW1pdCA9IHJ1blN0YXJ0ICsgKHJ1bnNbcnVuSW5kZXgrMV0gJiBMYXlvdXQuUlVOX0xFTkdUSF9NQVNLKTsKKyAgICAgICAgICAgICAgaWYgKHJ1bkxpbWl0ID4gbGluZUVuZCkgeworICAgICAgICAgICAgICAgICAgcnVuTGltaXQgPSBsaW5lRW5kOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChjdXJzb3IgPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgIHJ1bkxldmVsID0gKHJ1bnNbcnVuSW5kZXgrMV0gPj4+IExheW91dC5SVU5fTEVWRUxfU0hJRlQpICYKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0LlJVTl9MRVZFTF9NQVNLOworICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgPT0gcnVuU3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgIC8vIFRoZSBjYXJldCBpcyBvbiBhIHJ1biBib3VuZGFyeSwgc2VlIGlmIHdlIHNob3VsZAorICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBwb3NpdGlvbiBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgcHJldmlvdXMKKyAgICAgICAgICAgICAgICAgIC8vIGxvZ2ljYWwgY2hhcmFjdGVyIGluc3RlYWQuCisgICAgICAgICAgICAgICAgICBpbnQgcHJldlJ1bkluZGV4LCBwcmV2UnVuTGV2ZWwsIHByZXZSdW5TdGFydCwgcHJldlJ1bkxpbWl0OworICAgICAgICAgICAgICAgICAgaW50IHBvcyA9IGN1cnNvciAtIDE7CisgICAgICAgICAgICAgICAgICBmb3IgKHByZXZSdW5JbmRleCA9IDA7IHByZXZSdW5JbmRleCA8IHJ1bnMubGVuZ3RoOyBwcmV2UnVuSW5kZXggKz0gMikgeworICAgICAgICAgICAgICAgICAgICBwcmV2UnVuU3RhcnQgPSBsaW5lU3RhcnQgKyBydW5zW3ByZXZSdW5JbmRleF07CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gcHJldlJ1blN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgcHJldlJ1bkxpbWl0ID0gcHJldlJ1blN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHJ1bnNbcHJldlJ1bkluZGV4KzFdICYgTGF5b3V0LlJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZSdW5MaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlJ1bkxpbWl0ID0gbGluZUVuZDsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA8IHByZXZSdW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJldlJ1bkxldmVsID0gKHJ1bnNbcHJldlJ1bkluZGV4KzFdID4+PiBMYXlvdXQuUlVOX0xFVkVMX1NISUZUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgTGF5b3V0LlJVTl9MRVZFTF9NQVNLOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZSdW5MZXZlbCA8IHJ1bkxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGZyb20gbG9naWNhbGx5IHByZXZpb3VzIGNoYXJhY3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSW5kZXggPSBwcmV2UnVuSW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxldmVsID0gcHJldlJ1bkxldmVsOworICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydCA9IHByZXZSdW5TdGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuTGltaXQgPSBwcmV2UnVuTGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gY2FyZXQgbWlnaHQgYmUgPT0gbGluZUVuZC4gIFRoaXMgaXMgZ2VuZXJhbGx5IGEgc3BhY2Ugb3IgcGFyYWdyYXBoCisgICAgICAgICAgLy8gc2VwYXJhdG9yIGFuZCBoYXMgYW4gYXNzb2NpYXRlZCBydW4sIGJ1dCBtaWdodCBiZSB0aGUgZW5kIG9mCisgICAgICAgICAgLy8gdGV4dCwgaW4gd2hpY2ggY2FzZSBpdCBkb2Vzbid0LiAgSWYgdGhhdCBoYXBwZW5zLCB3ZSByYW4gb2ZmIHRoZQorICAgICAgICAgIC8vIGVuZCBvZiB0aGUgcnVuIGxpc3QsIGFuZCBydW5JbmRleCA9PSBydW5zLmxlbmd0aC4gIEluIHRoaXMgY2FzZSwKKyAgICAgICAgICAvLyB3ZSBhcmUgYXQgYSBydW4gYm91bmRhcnkgc28gd2Ugc2tpcCB0aGUgYmVsb3cgdGVzdC4KKyAgICAgICAgICBpZiAocnVuSW5kZXggIT0gcnVucy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgYm9vbGVhbiBydW5Jc1J0bCA9IChydW5MZXZlbCAmIDB4MSkgIT0gMDsKKyAgICAgICAgICAgICAgYm9vbGVhbiBhZHZhbmNlID0gdG9MZWZ0ID09IHJ1bklzUnRsOworICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IChhZHZhbmNlID8gcnVuTGltaXQgOiBydW5TdGFydCkgfHwgYWR2YW5jZSAhPSB0cmFpbGluZykgeworICAgICAgICAgICAgICAgICAgLy8gTW92aW5nIHdpdGhpbiBvciBpbnRvIHRoZSBydW4sIHNvIHdlIGNhbiBtb3ZlIGxvZ2ljYWxseS4KKyAgICAgICAgICAgICAgICAgIG5ld0NhcmV0ID0gZ2V0T2Zmc2V0QmVmb3JlQWZ0ZXIocnVuSW5kZXgsIHJ1blN0YXJ0LCBydW5MaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSXNSdGwsIGN1cnNvciwgYWR2YW5jZSk7CisgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbmV3IHBvc2l0aW9uIGlzIGludGVybmFsIHRvIHRoZSBydW4sIHdlJ3JlIGF0IHRoZSBzdHJvbmcKKyAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIGFscmVhZHkgc28gd2UncmUgZmluaXNoZWQuCisgICAgICAgICAgICAgICAgICBpZiAobmV3Q2FyZXQgIT0gKGFkdmFuY2UgPyBydW5MaW1pdCA6IHJ1blN0YXJ0KSkgeworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdDYXJldDsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIG5ld0NhcmV0IGlzIC0xLCB3ZSdyZSBzdGFydGluZyBhdCBhIHJ1biBib3VuZGFyeSBhbmQgY3Jvc3NpbmcKKyAgICAgICAgLy8gaW50byBhbm90aGVyIHJ1bi4gT3RoZXJ3aXNlIHdlJ3ZlIGFycml2ZWQgYXQgYSBydW4gYm91bmRhcnksIGFuZAorICAgICAgICAvLyBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hpY2ggY2hhcmFjdGVyIHRvIGF0dGFjaCB0by4gIE5vdGUgd2UgbWlnaHQKKyAgICAgICAgLy8gbmVlZCB0byBydW4gdGhpcyB0d2ljZSwgaWYgd2UgY3Jvc3MgYSBydW4gYm91bmRhcnkgYW5kIGVuZCB1cCBhdAorICAgICAgICAvLyBhbm90aGVyIHJ1biBib3VuZGFyeS4KKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICBib29sZWFuIGFkdmFuY2UgPSB0b0xlZnQgPT0gcGFyYUlzUnRsOworICAgICAgICAgIGludCBvdGhlclJ1bkluZGV4ID0gcnVuSW5kZXggKyAoYWR2YW5jZSA/IDIgOiAtMik7CisgICAgICAgICAgaWYgKG90aGVyUnVuSW5kZXggPj0gMCAmJiBvdGhlclJ1bkluZGV4IDwgcnVucy5sZW5ndGgpIHsKKyAgICAgICAgICAgIGludCBvdGhlclJ1blN0YXJ0ID0gbGluZVN0YXJ0ICsgcnVuc1tvdGhlclJ1bkluZGV4XTsKKyAgICAgICAgICAgIGludCBvdGhlclJ1bkxpbWl0ID0gb3RoZXJSdW5TdGFydCArCisgICAgICAgICAgICAocnVuc1tvdGhlclJ1bkluZGV4KzFdICYgTGF5b3V0LlJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpZiAob3RoZXJSdW5MaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICBvdGhlclJ1bkxpbWl0ID0gbGluZUVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBvdGhlclJ1bkxldmVsID0gKHJ1bnNbb3RoZXJSdW5JbmRleCsxXSA+Pj4gTGF5b3V0LlJVTl9MRVZFTF9TSElGVCkgJgorICAgICAgICAgICAgICAgIExheW91dC5SVU5fTEVWRUxfTUFTSzsKKyAgICAgICAgICAgIGJvb2xlYW4gb3RoZXJSdW5Jc1J0bCA9IChvdGhlclJ1bkxldmVsICYgMSkgIT0gMDsKKworICAgICAgICAgICAgYWR2YW5jZSA9IHRvTGVmdCA9PSBvdGhlclJ1bklzUnRsOworICAgICAgICAgICAgaWYgKG5ld0NhcmV0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgbmV3Q2FyZXQgPSBnZXRPZmZzZXRCZWZvcmVBZnRlcihvdGhlclJ1bkluZGV4LCBvdGhlclJ1blN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJSdW5MaW1pdCwgb3RoZXJSdW5Jc1J0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPyBvdGhlclJ1blN0YXJ0IDogb3RoZXJSdW5MaW1pdCwgYWR2YW5jZSk7CisgICAgICAgICAgICAgICAgaWYgKG5ld0NhcmV0ID09IChhZHZhbmNlID8gb3RoZXJSdW5MaW1pdCA6IG90aGVyUnVuU3RhcnQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENyb3NzZWQgYW5kIGVuZGVkIHVwIGF0IGEgbmV3IGJvdW5kYXJ5LAorICAgICAgICAgICAgICAgICAgICAvLyByZXBlYXQgYSBzZWNvbmQgYW5kIGZpbmFsIHRpbWUuCisgICAgICAgICAgICAgICAgICAgIHJ1bkluZGV4ID0gb3RoZXJSdW5JbmRleDsKKyAgICAgICAgICAgICAgICAgICAgcnVuTGV2ZWwgPSBvdGhlclJ1bkxldmVsOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRoZSBuZXcgY2FyZXQgaXMgYXQgYSBib3VuZGFyeS4KKyAgICAgICAgICAgIGlmIChvdGhlclJ1bkxldmVsIDwgcnVuTGV2ZWwpIHsKKyAgICAgICAgICAgICAgLy8gVGhlIHN0cm9uZyBjaGFyYWN0ZXIgaXMgaW4gdGhlIG90aGVyIHJ1bi4KKyAgICAgICAgICAgICAgbmV3Q2FyZXQgPSBhZHZhbmNlID8gb3RoZXJSdW5TdGFydCA6IG90aGVyUnVuTGltaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobmV3Q2FyZXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgLy8gV2UncmUgd2Fsa2luZyBvZmYgdGhlIGVuZCBvZiB0aGUgbGluZS4gIFRoZSBwYXJhZ3JhcGgKKyAgICAgICAgICAgICAgLy8gbGV2ZWwgaXMgYWx3YXlzIGVxdWFsIHRvIG9yIGxvd2VyIHRoYW4gYW55IGludGVybmFsIGxldmVsLCBzbworICAgICAgICAgICAgICAvLyB0aGUgYm91bmRhcmllcyBnZXQgdGhlIHN0cm9uZyBjYXJldC4KKyAgICAgICAgICAgICAgbmV3Q2FyZXQgPSBhZHZhbmNlID8gbUxlbiArIDEgOiAtMTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gRWxzZSB3ZSd2ZSBhcnJpdmVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuICBUaGF0J3MgYSBzdHJvbmcgcG9zaXRpb24uCisgICAgICAgICAgLy8gV2UgbWlnaHQgaGF2ZSBhcnJpdmVkIGhlcmUgYnkgY3Jvc3Npbmcgb3ZlciBhIHJ1biB3aXRoIG5vIGludGVybmFsCisgICAgICAgICAgLy8gYnJlYWtzIGFuZCBkcm9wcGluZyBvdXQgb2YgdGhlIGFib3ZlIGxvb3AgYmVmb3JlIGFkdmFuY2luZyBvbmUgZmluYWwKKyAgICAgICAgICAvLyB0aW1lLCBzbyByZXNldCB0aGUgY2FyZXQuCisgICAgICAgICAgLy8gTm90ZSwgd2UgdXNlICc8PScgYmVsb3cgdG8gaGFuZGxlIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBvbmx5IHJ1bgorICAgICAgICAgIC8vIG9uIHRoZSBsaW5lIGlzIGEgY291bnRlci1kaXJlY3Rpb25hbCBydW4uICBJZiB3ZSdyZSBub3QgYWR2YW5jaW5nLAorICAgICAgICAgIC8vIHdlIGNhbiBlbmQgdXAgYXQgdGhlICdsaW5lRW5kJyBwb3NpdGlvbiBidXQgdGhlIGNhcmV0IHdlIHdhbnQgaXMgYXQKKyAgICAgICAgICAvLyB0aGUgbGluZVN0YXJ0LgorICAgICAgICAgIGlmIChuZXdDYXJldCA8PSBsaW5lRW5kKSB7CisgICAgICAgICAgICAgIG5ld0NhcmV0ID0gYWR2YW5jZSA/IGxpbmVFbmQgOiBsaW5lU3RhcnQ7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ld0NhcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgdmFsaWQgb2Zmc2V0IHdpdGhpbiB0aGlzIGRpcmVjdGlvbmFsIHJ1biwgc2tpcHBpbmcKKyAgICAgKiBjb25qdW5jdHMgYW5kIHplcm8td2lkdGggY2hhcmFjdGVycy4gIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgdG8gd2FsaworICAgICAqIG9mZiB0aGUgZW5kIG9mIHRoZSBsaW5lLCBzaW5jZSB0aGUgcmV0dXJuZWQgdmFsdWVzIG1pZ2h0IG5vdCBiZSB2YWxpZAorICAgICAqIG9uIG5laWdoYm9yaW5nIGxpbmVzLiAgSWYgdGhlIHJldHVybmVkIG9mZnNldCBpcyBsZXNzIHRoYW4gemVybyBvcgorICAgICAqIGdyZWF0ZXIgdGhhbiB0aGUgbGluZSBsZW5ndGgsIHRoZSBvZmZzZXQgc2hvdWxkIGJlIHJlY29tcHV0ZWQgb24gdGhlCisgICAgICogcHJlY2VkaW5nIG9yIGZvbGxvd2luZyBsaW5lLCByZXNwZWN0aXZlbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcnVuSW5kZXggdGhlIHJ1biBpbmRleAorICAgICAqIEBwYXJhbSBydW5TdGFydCB0aGUgc3RhcnQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBydW5MaW1pdCB0aGUgbGltaXQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBydW5Jc1J0bCB0cnVlIGlmIHRoZSBydW4gaXMgcmlnaHQtdG8tbGVmdAorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldAorICAgICAqIEBwYXJhbSBhZnRlciB0cnVlIGlmIHRoZSBuZXcgb2Zmc2V0IHNob3VsZCBsb2dpY2FsbHkgZm9sbG93IHRoZSBwcm92aWRlZAorICAgICAqIG9mZnNldAorICAgICAqIEByZXR1cm4gdGhlIG5ldyBvZmZzZXQKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBnZXRPZmZzZXRCZWZvcmVBZnRlcihpbnQgcnVuSW5kZXgsIGludCBydW5TdGFydCwgaW50IHJ1bkxpbWl0LAorICAgICAgICAgICAgYm9vbGVhbiBydW5Jc1J0bCwgaW50IG9mZnNldCwgYm9vbGVhbiBhZnRlcikgeworCisgICAgICAgIGlmIChydW5JbmRleCA8IDAgfHwgb2Zmc2V0ID09IChhZnRlciA/IG1MZW4gOiAwKSkgeworICAgICAgICAgICAgLy8gV2Fsa2luZyBvZmYgZW5kIG9mIGxpbmUuICBTaW5jZSB3ZSBkb24ndCBrbm93CisgICAgICAgICAgICAvLyB3aGF0IGN1cnNvciBwb3NpdGlvbnMgYXJlIGF2YWlsYWJsZSBvbiBvdGhlciBsaW5lcywgd2UgY2FuJ3QKKyAgICAgICAgICAgIC8vIHJldHVybiBhY2N1cmF0ZSB2YWx1ZXMuICBUaGVzZSBhcmUgYSBndWVzcy4KKyAgICAgICAgICAgIGlmIChhZnRlcikgeworICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIG9mZnNldCArIG1TdGFydCkgLSBtU3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gVGV4dFV0aWxzLmdldE9mZnNldEJlZm9yZShtVGV4dCwgb2Zmc2V0ICsgbVN0YXJ0KSAtIG1TdGFydDsKKyAgICAgICAgfQorCisgICAgICAgIFRleHRQYWludCB3cCA9IG1Xb3JrUGFpbnQ7CisgICAgICAgIHdwLnNldChtUGFpbnQpOworCisgICAgICAgIGludCBzcGFuU3RhcnQgPSBydW5TdGFydDsKKyAgICAgICAgaW50IHNwYW5MaW1pdDsKKyAgICAgICAgaWYgKG1TcGFubmVkID09IG51bGwpIHsKKyAgICAgICAgICAgIHNwYW5MaW1pdCA9IHJ1bkxpbWl0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHRhcmdldCA9IGFmdGVyID8gb2Zmc2V0ICsgMSA6IG9mZnNldDsKKyAgICAgICAgICAgIGludCBsaW1pdCA9IG1TdGFydCArIHJ1bkxpbWl0OworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBzcGFuTGltaXQgPSBtU3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24obVN0YXJ0ICsgc3BhblN0YXJ0LCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpIC0gbVN0YXJ0OworICAgICAgICAgICAgICAgIGlmIChzcGFuTGltaXQgPj0gdGFyZ2V0KSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcGFuU3RhcnQgPSBzcGFuTGltaXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucyA9IG1TcGFubmVkLmdldFNwYW5zKG1TdGFydCArIHNwYW5TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgc3BhbkxpbWl0LCBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKKworICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBSZXBsYWNlbWVudFNwYW4gcmVwbGFjZW1lbnQgPSBudWxsOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3BhbnMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbiBzcGFuID0gc3BhbnNbal07CisgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuIGluc3RhbmNlb2YgUmVwbGFjZW1lbnRTcGFuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9IChSZXBsYWNlbWVudFNwYW4pc3BhbjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4udXBkYXRlTWVhc3VyZVN0YXRlKHdwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSByZXBsYWNlbWVudCBzcGFuLCB3ZSdyZSBtb3ZpbmcgZWl0aGVyIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBvciBlbmQgb2YgdGhpcyBzcGFuLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWZ0ZXIgPyBzcGFuTGltaXQgOiBzcGFuU3RhcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IGZsYWdzID0gcnVuSXNSdGwgPyBQYWludC5ESVJFQ1RJT05fUlRMIDogUGFpbnQuRElSRUNUSU9OX0xUUjsKKyAgICAgICAgaW50IGN1cnNvck9wdCA9IGFmdGVyID8gUGFpbnQuQ1VSU09SX0FGVEVSIDogUGFpbnQuQ1VSU09SX0JFRk9SRTsKKyAgICAgICAgaWYgKG1DaGFyc1ZhbGlkKSB7CisgICAgICAgICAgICByZXR1cm4gd3AuZ2V0VGV4dFJ1bkN1cnNvcihtQ2hhcnMsIHNwYW5TdGFydCwgc3BhbkxpbWl0IC0gc3BhblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBmbGFncywgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHdwLmdldFRleHRSdW5DdXJzb3IobVRleHQsIG1TdGFydCArIHNwYW5TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgc3BhbkxpbWl0LCBmbGFncywgbVN0YXJ0ICsgb2Zmc2V0LCBjdXJzb3JPcHQpIC0gbVN0YXJ0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgbWVhc3VyaW5nIGFuZCByZW5kZXJpbmcgdGV4dC4gIFRoZSB0ZXh0IG11c3QKKyAgICAgKiBub3QgaW5jbHVkZSBhIHRhYiBvciBlbW9qaS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cCB0aGUgd29ya2luZyBwYWludAorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gZW5kIHRoZSBlbmQgb2YgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzLCBjYW4gYmUgbnVsbCBpZiByZW5kZXJpbmcgaXMgbm90IG5lZWRlZAorICAgICAqIEBwYXJhbSB4IHRoZSBlZGdlIG9mIHRoZSBydW4gY2xvc2VzdCB0byB0aGUgbGVhZGluZyBtYXJnaW4KKyAgICAgKiBAcGFyYW0gdG9wIHRoZSB0b3Agb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0geSB0aGUgYmFzZWxpbmUKKyAgICAgKiBAcGFyYW0gYm90dG9tIHRoZSBib3R0b20gb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0gZm1pIHJlY2VpdmVzIG1ldHJpY3MgaW5mb3JtYXRpb24sIGNhbiBiZSBudWxsCisgICAgICogQHBhcmFtIG5lZWRXaWR0aCB0cnVlIGlmIHRoZSB3aWR0aCBvZiB0aGUgcnVuIGlzIG5lZWRlZAorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBvZiB0aGUgcnVuIGJhc2VkIG9uIHRoZSBydW4gZGlyZWN0aW9uOyBvbmx5CisgICAgICogdmFsaWQgaWYgbmVlZFdpZHRoIGlzIHRydWUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGhhbmRsZVRleHQoVGV4dFBhaW50IHdwLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgYm9vbGVhbiBydW5Jc1J0bCwKKyAgICAgICAgICAgIENhbnZhcyBjLCBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKKyAgICAgICAgICAgIEZvbnRNZXRyaWNzSW50IGZtaSwgYm9vbGVhbiBuZWVkV2lkdGgpIHsKKworICAgICAgICBmbG9hdCByZXQgPSAwOworCisgICAgICAgIGludCBydW5MZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICBpZiAobmVlZFdpZHRoIHx8IChjICE9IG51bGwgJiYgKHdwLmJnQ29sb3IgIT0gMCB8fCBydW5Jc1J0bCkpKSB7CisgICAgICAgICAgICBpbnQgZmxhZ3MgPSBydW5Jc1J0bCA/IFBhaW50LkRJUkVDVElPTl9SVEwgOiBQYWludC5ESVJFQ1RJT05fTFRSOworICAgICAgICAgICAgaWYgKG1DaGFyc1ZhbGlkKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gd3AuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1DaGFycywgc3RhcnQsIHJ1bkxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dExlbiwgZmxhZ3MsIG51bGwsIDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgZGVsdGEgPSBtU3RhcnQ7CisgICAgICAgICAgICAgICAgcmV0ID0gd3AuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1UZXh0LCBkZWx0YSArIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgKyBlbmQsIGRlbHRhICsgY29udGV4dFN0YXJ0LCBkZWx0YSArIGNvbnRleHRFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgbnVsbCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm1pICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdwLmdldEZvbnRNZXRyaWNzSW50KGZtaSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAocnVuSXNSdGwpIHsKKyAgICAgICAgICAgICAgICB4IC09IHJldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHdwLmJnQ29sb3IgIT0gMCkgeworICAgICAgICAgICAgICAgIGludCBjb2xvciA9IHdwLmdldENvbG9yKCk7CisgICAgICAgICAgICAgICAgUGFpbnQuU3R5bGUgcyA9IHdwLmdldFN0eWxlKCk7CisgICAgICAgICAgICAgICAgd3Auc2V0Q29sb3Iod3AuYmdDb2xvcik7CisgICAgICAgICAgICAgICAgd3Auc2V0U3R5bGUoUGFpbnQuU3R5bGUuRklMTCk7CisKKyAgICAgICAgICAgICAgICBjLmRyYXdSZWN0KHgsIHRvcCwgeCArIHJldCwgYm90dG9tLCB3cCk7CisKKyAgICAgICAgICAgICAgICB3cC5zZXRTdHlsZShzKTsKKyAgICAgICAgICAgICAgICB3cC5zZXRDb2xvcihjb2xvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRyYXdUZXh0UnVuKGMsIHdwLCBzdGFydCwgZW5kLCBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIHJ1bklzUnRsLAorICAgICAgICAgICAgICAgICAgICB4LCB5ICsgd3AuYmFzZWxpbmVTaGlmdCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcnVuSXNSdGwgPyAtcmV0IDogcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIG1lYXN1cmluZyBhbmQgcmVuZGVyaW5nIGEgcmVwbGFjZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVwbGFjZW1lbnQgdGhlIHJlcGxhY2VtZW50CisgICAgICogQHBhcmFtIHdwIHRoZSB3b3JrIHBhaW50CisgICAgICogQHBhcmFtIHJ1bkluZGV4IHRoZSBydW4gaW5kZXgKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGxpbWl0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzLCBjYW4gYmUgbnVsbCBpZiBub3QgcmVuZGVyaW5nCisgICAgICogQHBhcmFtIHggdGhlIGVkZ2Ugb2YgdGhlIHJlcGxhY2VtZW50IGNsb3Nlc3QgdG8gdGhlIGxlYWRpbmcgbWFyZ2luCisgICAgICogQHBhcmFtIHRvcCB0aGUgdG9wIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHkgdGhlIGJhc2VsaW5lCisgICAgICogQHBhcmFtIGJvdHRvbSB0aGUgYm90dG9tIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIGZtaSByZWNlaXZlcyBtZXRyaWNzIGluZm9ybWF0aW9uLCBjYW4gYmUgbnVsbAorICAgICAqIEBwYXJhbSBuZWVkV2lkdGggdHJ1ZSBpZiB0aGUgd2lkdGggb2YgdGhlIHJlcGxhY2VtZW50IGlzIG5lZWRlZAorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBvZiB0aGUgcnVuIGJhc2VkIG9uIHRoZSBydW4gZGlyZWN0aW9uOyBvbmx5CisgICAgICogdmFsaWQgaWYgbmVlZFdpZHRoIGlzIHRydWUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGhhbmRsZVJlcGxhY2VtZW50KFJlcGxhY2VtZW50U3BhbiByZXBsYWNlbWVudCwgVGV4dFBhaW50IHdwLAorICAgICAgICAgICAgaW50IHJ1bkluZGV4LCBpbnQgc3RhcnQsIGludCBsaW1pdCwgYm9vbGVhbiBydW5Jc1J0bCwgQ2FudmFzIGMsCisgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwgRm9udE1ldHJpY3NJbnQgZm1pLAorICAgICAgICAgICAgYm9vbGVhbiBuZWVkV2lkdGgpIHsKKworICAgICAgICBmbG9hdCByZXQgPSAwOworCisgICAgICAgIGludCB0ZXh0U3RhcnQgPSBtU3RhcnQgKyBzdGFydDsKKyAgICAgICAgaW50IHRleHRMaW1pdCA9IG1TdGFydCArIGxpbWl0OworCisgICAgICAgIGlmIChuZWVkV2lkdGggfHwgKGMgIT0gbnVsbCAmJiBydW5Jc1J0bCkpIHsKKyAgICAgICAgICAgIHJldCA9IHJlcGxhY2VtZW50LmdldFNpemUod3AsIG1UZXh0LCB0ZXh0U3RhcnQsIHRleHRMaW1pdCwgZm1pKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChydW5Jc1J0bCkgeworICAgICAgICAgICAgICAgIHggLT0gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbGFjZW1lbnQuZHJhdyhjLCBtVGV4dCwgdGV4dFN0YXJ0LCB0ZXh0TGltaXQsCisgICAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCB3cCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcnVuSXNSdGwgPyAtcmV0IDogcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIGEgdW5pZGlyZWN0aW9uYWwgcnVuLiAgVGhlIHJ1biBtdXN0IG5vdAorICAgICAqIGNvbnRhaW4gdGFicyBvciBlbW9qaSBidXQgY2FuIGNvbnRhaW4gc3R5bGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHJ1bkluZGV4IHRoZSBydW4gaW5kZXgKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGxpbmUtcmVsYXRpdmUgc3RhcnQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBtZWFzdXJlTGltaXQgdGhlIG9mZnNldCB0byBtZWFzdXJlIHRvLCBiZXR3ZWVuIHN0YXJ0IGFuZCBsaW1pdCBpbmNsdXNpdmUKKyAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGxpbWl0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzLCBjYW4gYmUgbnVsbAorICAgICAqIEBwYXJhbSB4IHRoZSBlbmQgb2YgdGhlIHJ1biBjbG9zZXN0IHRvIHRoZSBsZWFkaW5nIG1hcmdpbgorICAgICAqIEBwYXJhbSB0b3AgdGhlIHRvcCBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSB5IHRoZSBiYXNlbGluZQorICAgICAqIEBwYXJhbSBib3R0b20gdGhlIGJvdHRvbSBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSBmbWkgcmVjZWl2ZXMgbWV0cmljcyBpbmZvcm1hdGlvbiwgY2FuIGJlIG51bGwKKyAgICAgKiBAcGFyYW0gbmVlZFdpZHRoIHRydWUgaWYgdGhlIHdpZHRoIGlzIHJlcXVpcmVkCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIG9mIHRoZSBydW4gYmFzZWQgb24gdGhlIHJ1biBkaXJlY3Rpb247IG9ubHkKKyAgICAgKiB2YWxpZCBpZiBuZWVkV2lkdGggaXMgdHJ1ZQorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgaGFuZGxlUnVuKGludCBydW5JbmRleCwgaW50IHN0YXJ0LCBpbnQgbWVhc3VyZUxpbWl0LAorICAgICAgICAgICAgaW50IGxpbWl0LCBib29sZWFuIHJ1bklzUnRsLCBDYW52YXMgYywgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksCisgICAgICAgICAgICBpbnQgYm90dG9tLCBGb250TWV0cmljc0ludCBmbWksIGJvb2xlYW4gbmVlZFdpZHRoKSB7CisKKyAgICAgICAgLy8gU2hhcGluZyBuZWVkcyB0byB0YWtlIGludG8gYWNjb3VudCBjb250ZXh0IHVwIHRvIG1ldHJpYyBib3VuZGFyaWVzLAorICAgICAgICAvLyBidXQgcmVuZGVyaW5nIG5lZWRzIHRvIHRha2UgaW50byBhY2NvdW50IGNoYXJhY3RlciBzdHlsZSBib3VuZGFyaWVzLgorICAgICAgICAvLyBTbyB3ZSBpdGVyYXRlIHRocm91Z2ggbWV0cmljIHJ1bnMgdG8gZ2V0IG1ldHJpYyBib3VuZHMsCisgICAgICAgIC8vIHRoZW4gd2l0aGluIGVhY2ggbWV0cmljIHJ1biBpdGVyYXRlIHRocm91Z2ggY2hhcmFjdGVyIHN0eWxlIHJ1bnMKKyAgICAgICAgLy8gZm9yIHRoZSBydW4gYm91bmRzLgorICAgICAgICBmbG9hdCBveCA9IHg7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgaW5leHQ7IGkgPCBtZWFzdXJlTGltaXQ7IGkgPSBpbmV4dCkgeworICAgICAgICAgICAgVGV4dFBhaW50IHdwID0gbVdvcmtQYWludDsKKyAgICAgICAgICAgIHdwLnNldChtUGFpbnQpOworCisgICAgICAgICAgICBpbnQgbWxpbWl0OworICAgICAgICAgICAgaWYgKG1TcGFubmVkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbmV4dCA9IGxpbWl0OworICAgICAgICAgICAgICAgIG1saW1pdCA9IG1lYXN1cmVMaW1pdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5leHQgPSBtU3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24obVN0YXJ0ICsgaSwgbVN0YXJ0ICsgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKSAtIG1TdGFydDsKKworICAgICAgICAgICAgICAgIG1saW1pdCA9IGluZXh0IDwgbWVhc3VyZUxpbWl0ID8gaW5leHQgOiBtZWFzdXJlTGltaXQ7CisgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0gbVNwYW5uZWQuZ2V0U3BhbnMobVN0YXJ0ICsgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydCArIG1saW1pdCwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3BhbnMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICBSZXBsYWNlbWVudFNwYW4gcmVwbGFjZW1lbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNwYW5zLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuIHNwYW4gPSBzcGFuc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuIGluc3RhbmNlb2YgUmVwbGFjZW1lbnRTcGFuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAoUmVwbGFjZW1lbnRTcGFuKXNwYW47CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1pZ2h0IGhhdmUgYSByZXBsYWNlbWVudCB0aGF0IHVzZXMgdGhlIGRyYXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZSwgb3RoZXJ3aXNlIG1lYXN1cmUgc3RhdGUgd291bGQgc3VmZmljZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLnVwZGF0ZURyYXdTdGF0ZSh3cCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgeCArPSBoYW5kbGVSZXBsYWNlbWVudChyZXBsYWNlbWVudCwgd3AsIHJ1bkluZGV4LCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbGltaXQsIHJ1bklzUnRsLCBjLCB4LCB0b3AsIHksIGJvdHRvbSwgZm1pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkV2lkdGggfHwgbWxpbWl0IDwgbWVhc3VyZUxpbWl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVNwYW5uZWQgPT0gbnVsbCB8fCBjID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB4ICs9IGhhbmRsZVRleHQod3AsIGksIG1saW1pdCwgaSwgaW5leHQsIHJ1bklzUnRsLCBjLCB4LCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICB5LCBib3R0b20sIGZtaSwgbmVlZFdpZHRoIHx8IG1saW1pdCA8IG1lYXN1cmVMaW1pdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpLCBqbmV4dDsgaiA8IG1saW1pdDsgaiA9IGpuZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGpuZXh0ID0gbVNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKG1TdGFydCArIGosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgbWxpbWl0LCBDaGFyYWN0ZXJTdHlsZS5jbGFzcykgLSBtU3RhcnQ7CisKKyAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyU3R5bGVbXSBzcGFucyA9IG1TcGFubmVkLmdldFNwYW5zKG1TdGFydCArIGosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgam5leHQsIENoYXJhY3RlclN0eWxlLmNsYXNzKTsKKworICAgICAgICAgICAgICAgICAgICB3cC5zZXQobVBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzcGFucy5sZW5ndGg7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyU3R5bGUgc3BhbiA9IHNwYW5zW2tdOworICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbi51cGRhdGVEcmF3U3RhdGUod3ApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgeCArPSBoYW5kbGVUZXh0KHdwLCBqLCBqbmV4dCwgaSwgaW5leHQsIHJ1bklzUnRsLCBjLCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwgeSwgYm90dG9tLCBmbWksIG5lZWRXaWR0aCB8fCBqbmV4dCA8IG1lYXN1cmVMaW1pdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHggLSBveDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgYSB0ZXh0IHJ1biB3aXRoIHRoZSBzZXQtdXAgcGFpbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzCisgICAgICogQHBhcmFtIHdwIHRoZSBwYWludCB1c2VkIHRvIHJlbmRlciB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBlbmQgdGhlIGVuZCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgc3RhcnQgb2YgY29udGV4dCBmb3IgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBjb250ZXh0RW5kIHRoZSBlbmQgb2YgdGhlIGNvbnRleHQgZm9yIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0geCB0aGUgeCBwb3NpdGlvbiBvZiB0aGUgbGVmdCBlZGdlIG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0geSB0aGUgYmFzZWxpbmUgb2YgdGhlIHJ1bgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkcmF3VGV4dFJ1bihDYW52YXMgYywgVGV4dFBhaW50IHdwLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgYm9vbGVhbiBydW5Jc1J0bCwgZmxvYXQgeCwgaW50IHkpIHsKKworICAgICAgICBpbnQgZmxhZ3MgPSBydW5Jc1J0bCA/IENhbnZhcy5ESVJFQ1RJT05fUlRMIDogQ2FudmFzLkRJUkVDVElPTl9MVFI7CisgICAgICAgIGlmIChtQ2hhcnNWYWxpZCkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4obUNoYXJzLCBzdGFydCwgY291bnQsIGNvbnRleHRTdGFydCwgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICB4LCB5LCBmbGFncywgd3ApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGRlbHRhID0gbVN0YXJ0OworICAgICAgICAgICAgYy5kcmF3VGV4dFJ1bihtVGV4dCwgZGVsdGEgKyBzdGFydCwgZGVsdGEgKyBlbmQsCisgICAgICAgICAgICAgICAgICAgIGRlbHRhICsgY29udGV4dFN0YXJ0LCBkZWx0YSArIGNvbnRleHRFbmQsIHgsIHksIGZsYWdzLCB3cCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhc2NlbnQgb2YgdGhlIHRleHQgYXQgc3RhcnQuICBUaGlzIGlzIHVzZWQgZm9yIHNjYWxpbmcKKyAgICAgKiBlbW9qaS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3MgdGhlIGxpbmUtcmVsYXRpdmUgcG9zaXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBhc2NlbnQgb2YgdGhlIHRleHQgYXQgc3RhcnQKKyAgICAgKi8KKyAgICBmbG9hdCBhc2NlbnQoaW50IHBvcykgeworICAgICAgICBpZiAobVNwYW5uZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1QYWludC5hc2NlbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHBvcyArPSBtU3RhcnQ7CisgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucyA9IG1TcGFubmVkLmdldFNwYW5zKHBvcywgcG9zICsgMSwKKyAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKKyAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbVBhaW50LmFzY2VudCgpOworICAgICAgICB9CisKKyAgICAgICAgVGV4dFBhaW50IHdwID0gbVdvcmtQYWludDsKKyAgICAgICAgd3Auc2V0KG1QYWludCk7CisgICAgICAgIGZvciAoTWV0cmljQWZmZWN0aW5nU3BhbiBzcGFuIDogc3BhbnMpIHsKKyAgICAgICAgICAgIHNwYW4udXBkYXRlTWVhc3VyZVN0YXRlKHdwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd3AuYXNjZW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCB0YWIgcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaCB0aGUgKHVuc2lnbmVkKSBvZmZzZXQgZnJvbSB0aGUgbGVhZGluZyBtYXJnaW4KKyAgICAgKiBAcmV0dXJuIHRoZSAodW5zaWduZWQpIHRhYiBwb3NpdGlvbiBhZnRlciB0aGlzIG9mZnNldAorICAgICAqLworICAgIGZsb2F0IG5leHRUYWIoZmxvYXQgaCkgeworICAgICAgICBpZiAobVRhYnMgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1UYWJzLm5leHRUYWIoaCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFRhYlN0b3BzLm5leHREZWZhdWx0U3RvcChoLCBUQUJfSU5DUkVNRU5UKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCX0lOQ1JFTUVOVCA9IDIwOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0VXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dFV0aWxzLmphdmEKaW5kZXggODY3NWQwNS4uNzc0ODI2NSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0VXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRVdGlscy5qYXZhCkBAIC0xNywxMiArMTcsMTEgQEAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7CiAKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lci5DYXBpdGFsaXplOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5BYnNvbHV0ZVNpemVTcGFuOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5BbGlnbm1lbnRTcGFuOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5CYWNrZ3JvdW5kQ29sb3JTcGFuOwpAQCAtNDUsMTAgKzQ0LDggQEAKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVW5kZXJsaW5lU3BhbjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUHJpbnRlcjsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogcHVibGljIGNsYXNzIFRleHRVdGlscyB7CiAgICAgcHJpdmF0ZSBUZXh0VXRpbHMoKSB7IC8qIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgKi8gfQpAQCAtOTgzLDcgKzk4MCw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgb3JpZ2luYWwgdGV4dCBpZiBpdCBmaXRzIGluIHRoZSBzcGVjaWZpZWQgd2lkdGgKICAgICAgKiBnaXZlbiB0aGUgcHJvcGVydGllcyBvZiB0aGUgc3BlY2lmaWVkIFBhaW50LAotICAgICAqIG9yLCBpZiBpdCBkb2VzIG5vdCBmaXQsIGEgY29weSB3aXRoIGVsbGlwc2lzIGNoYXJhY3RlciBhZGRlZCAKKyAgICAgKiBvciwgaWYgaXQgZG9lcyBub3QgZml0LCBhIGNvcHkgd2l0aCBlbGxpcHNpcyBjaGFyYWN0ZXIgYWRkZWQKICAgICAgKiBhdCB0aGUgc3BlY2lmaWVkIGVkZ2Ugb3IgY2VudGVyLgogICAgICAqIElmIDxjb2RlPnByZXNlcnZlTGVuZ3RoPC9jb2RlPiBpcyBzcGVjaWZpZWQsIHRoZSByZXR1cm5lZCBjb3B5CiAgICAgICogd2lsbCBiZSBwYWRkZWQgd2l0aCB6ZXJvLXdpZHRoIHNwYWNlcyB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwKQEAgLTk5Miw3ICs5ODksNyBAQAogICAgICAqIHJlcG9ydCB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgZWxsaXBzaXplZCByYW5nZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBlbGxpcHNpemUoQ2hhclNlcXVlbmNlIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGF2YWlsLCBUcnVuY2F0ZUF0IHdoZXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByZXNlcnZlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGxpcHNpemVDYWxsYmFjayBjYWxsYmFjaykgewpAQCAtMTAwMywxMyArMTAwMCwxMiBAQAogCiAgICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOwogCi0gICAgICAgIC8vIFVzZSBQYWludC5icmVha1RleHQoKSBmb3IgdGhlIG5vbi1TcGFubmVkIGNhc2UgdG8gYXZvaWQgaGF2aW5nCi0gICAgICAgIC8vIHRvIGFsbG9jYXRlIG1lbW9yeSBhbmQgYWNjdW11bGF0ZSB0aGUgY2hhcmFjdGVyIHdpZHRocyBvdXJzZWx2ZXMuCisgICAgICAgIE1lYXN1cmVkVGV4dCBtdCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZsb2F0IHdpZHRoID0gc2V0UGFyYShtdCwgcGFpbnQsIHRleHQsIDAsIHRleHQubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJfUkVRVUVTVF9ERUZBVUxUX0xUUik7CiAKLSAgICAgICAgaWYgKCEodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpKSB7Ci0gICAgICAgICAgICBmbG9hdCB3aWQgPSBwLm1lYXN1cmVUZXh0KHRleHQsIDAsIGxlbik7Ci0KLSAgICAgICAgICAgIGlmICh3aWQgPD0gYXZhaWwpIHsKKyAgICAgICAgICAgIGlmICh3aWR0aCA8PSBhdmFpbCkgewogICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoMCwgMCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTAxNywyNTAgKzEwMTMsNjkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZmxvYXQgZWxsaXBzaXN3aWQgPSBwLm1lYXN1cmVUZXh0KHNFbGxpcHNpcyk7CisgICAgICAgICAgICAvLyBYWFggYXNzdW1lcyBlbGxpcHNpcyBzdHJpbmcgZG9lcyBub3QgcmVxdWlyZSBzaGFwaW5nIGFuZAorICAgICAgICAgICAgLy8gaXMgdW5hZmZlY3RlZCBieSBzdHlsZQorICAgICAgICAgICAgZmxvYXQgZWxsaXBzaXN3aWQgPSBwYWludC5tZWFzdXJlVGV4dChzRWxsaXBzaXMpOworICAgICAgICAgICAgYXZhaWwgLT0gZWxsaXBzaXN3aWQ7CiAKLSAgICAgICAgICAgIGlmIChlbGxpcHNpc3dpZCA+IGF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZCgwLCBsZW4pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBjaGFyW10gYnVmID0gb2J0YWluKGxlbik7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltpXSA9ICdcdUZFRkYnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXQgPSBuZXcgU3RyaW5nKGJ1ZiwgMCwgbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgcmVjeWNsZShidWYpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh3aGVyZSA9PSBUcnVuY2F0ZUF0LlNUQVJUKSB7Ci0gICAgICAgICAgICAgICAgaW50IGZpdCA9IHAuYnJlYWtUZXh0KHRleHQsIDAsIGxlbiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsIC0gZWxsaXBzaXN3aWQsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZCgwLCBsZW4gLSBmaXQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxhbmsodGV4dCwgMCwgbGVuIC0gZml0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc0VsbGlwc2lzICsgdGV4dC50b1N0cmluZygpLnN1YnN0cmluZyhsZW4gLSBmaXQsIGxlbik7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGxlZnQgPSAwOworICAgICAgICAgICAgaW50IHJpZ2h0ID0gbGVuOworICAgICAgICAgICAgaWYgKGF2YWlsIDwgMCkgeworICAgICAgICAgICAgICAgIC8vIGl0IGFsbCBnb2VzCisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoZXJlID09IFRydW5jYXRlQXQuU1RBUlQpIHsKKyAgICAgICAgICAgICAgICByaWdodCA9IGxlbiAtIG10LmJyZWFrVGV4dCgwLCBsZW4sIGZhbHNlLCBhdmFpbCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoZXJlID09IFRydW5jYXRlQXQuRU5EKSB7Ci0gICAgICAgICAgICAgICAgaW50IGZpdCA9IHAuYnJlYWtUZXh0KHRleHQsIDAsIGxlbiwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWwgLSBlbGxpcHNpc3dpZCwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKGZpdCwgbGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsYW5rKHRleHQsIGZpdCwgbGVuKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dC50b1N0cmluZygpLnN1YnN0cmluZygwLCBmaXQpICsgc0VsbGlwc2lzOwotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB9IGVsc2UgLyogd2hlcmUgPT0gVHJ1bmNhdGVBdC5NSURETEUgKi8gewotICAgICAgICAgICAgICAgIGludCByaWdodCA9IHAuYnJlYWtUZXh0KHRleHQsIDAsIGxlbiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsIC0gZWxsaXBzaXN3aWQpIC8gMiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdXNlZCA9IHAubWVhc3VyZVRleHQodGV4dCwgbGVuIC0gcmlnaHQsIGxlbik7Ci0gICAgICAgICAgICAgICAgaW50IGxlZnQgPSBwLmJyZWFrVGV4dCh0ZXh0LCAwLCBsZW4gLSByaWdodCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsIC0gZWxsaXBzaXN3aWQgLSB1c2VkLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQobGVmdCwgbGVuIC0gcmlnaHQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxhbmsodGV4dCwgbGVmdCwgbGVuIC0gcmlnaHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gdGV4dC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5zdWJzdHJpbmcoMCwgbGVmdCkgKyBzRWxsaXBzaXMgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zdWJzdHJpbmcobGVuIC0gcmlnaHQsIGxlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQnV0IGRvIHRoZSBTcGFubmVkIGNhc2VzIGJ5IGhhbmQsIGJlY2F1c2UgaXQncyBzdWNoIGEgcGFpbgotICAgICAgICAvLyB0byBpdGVyYXRlIHRoZSBzcGFuIHRyYW5zaXRpb25zIGJhY2t3YXJkcyBhbmQgZ2V0VGV4dFdpZHRocygpCi0gICAgICAgIC8vIHdpbGwgZ2l2ZSB1cyB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZC4KLQotICAgICAgICAvLyBnZXRUZXh0V2lkdGhzKCkgYWx3YXlzIHdyaXRlcyBpbnRvIHRoZSBzdGFydCBvZiB0aGUgYXJyYXksCi0gICAgICAgIC8vIHNvIG1lYXN1cmUgZWFjaCBzcGFuIGludG8gdGhlIGZpcnN0IGhhbGYgYW5kIHRoZW4gY29weSB0aGUKLSAgICAgICAgLy8gcmVzdWx0cyBpbnRvIHRoZSBzZWNvbmQgaGFsZiB0byB1c2UgbGF0ZXIuCi0KLSAgICAgICAgZmxvYXRbXSB3aWQgPSBuZXcgZmxvYXRbbGVuICogMl07Ci0gICAgICAgIFRleHRQYWludCB0ZW1wcGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7Ci0gICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgdGV4dDsKLQotICAgICAgICBpbnQgbmV4dDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkgPSBuZXh0KSB7Ci0gICAgICAgICAgICBuZXh0ID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKGksIGxlbiwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7Ci0KLSAgICAgICAgICAgIFN0eWxlZC5nZXRUZXh0V2lkdGhzKHAsIHRlbXBwYWludCwgc3AsIGksIG5leHQsIHdpZCwgbnVsbCk7Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZCwgMCwgd2lkLCBsZW4gKyBpLCBuZXh0IC0gaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBzdW0gPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBzdW0gKz0gd2lkW2xlbiArIGldOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN1bSA8PSBhdmFpbCkgewotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKDAsIDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdGV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGVsbGlwc2lzd2lkID0gcC5tZWFzdXJlVGV4dChzRWxsaXBzaXMpOwotCi0gICAgICAgIGlmIChlbGxpcHNpc3dpZCA+IGF2YWlsKSB7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoMCwgbGVuKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG9idGFpbihsZW4pOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmW2ldID0gJ1x1RkVGRic7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZyBzcyA9IG5ldyBTcGFubmFibGVTdHJpbmcobmV3IFN0cmluZyhidWYsIDAsIGxlbikpOwotICAgICAgICAgICAgICAgIHJlY3ljbGUoYnVmKTsKLSAgICAgICAgICAgICAgICBjb3B5U3BhbnNGcm9tKHNwLCAwLCBsZW4sIE9iamVjdC5jbGFzcywgc3MsIDApOwotICAgICAgICAgICAgICAgIHJldHVybiBzczsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gbXQuYnJlYWtUZXh0KDAsIGxlbiwgdHJ1ZSwgYXZhaWwpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAod2hlcmUgPT0gVHJ1bmNhdGVBdC5TVEFSVCkgewotICAgICAgICAgICAgc3VtID0gMDsKLSAgICAgICAgICAgIGludCBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSBsZW47IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZFtsZW4gKyBpIC0gMV07Ci0KLSAgICAgICAgICAgICAgICBpZiAodyArIHN1bSArIGVsbGlwc2lzd2lkID4gYXZhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3VtICs9IHc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZCgwLCBpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nIHNzID0gbmV3IFNwYW5uYWJsZVN0cmluZyhibGFuayh0ZXh0LCAwLCBpKSk7Ci0gICAgICAgICAgICAgICAgY29weVNwYW5zRnJvbShzcCwgMCwgbGVuLCBPYmplY3QuY2xhc3MsIHNzLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3M7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgb3V0ID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoc0VsbGlwc2lzKTsKLSAgICAgICAgICAgICAgICBvdXQuaW5zZXJ0KDEsIHRleHQsIGksIGxlbik7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHdoZXJlID09IFRydW5jYXRlQXQuRU5EKSB7Ci0gICAgICAgICAgICBzdW0gPSAwOwotICAgICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWRbbGVuICsgaV07Ci0KLSAgICAgICAgICAgICAgICBpZiAodyArIHN1bSArIGVsbGlwc2lzd2lkID4gYXZhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3VtICs9IHc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZChpLCBsZW4pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmcgc3MgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nKGJsYW5rKHRleHQsIGksIGxlbikpOwotICAgICAgICAgICAgICAgIGNvcHlTcGFuc0Zyb20oc3AsIDAsIGxlbiwgT2JqZWN0LmNsYXNzLCBzcywgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG91dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKHNFbGxpcHNpcyk7Ci0gICAgICAgICAgICAgICAgb3V0Lmluc2VydCgwLCB0ZXh0LCAwLCBpKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSAvKiB3aGVyZSA9IFRydW5jYXRlQXQuTUlERExFICovIHsKLSAgICAgICAgICAgIGZsb2F0IGxzdW0gPSAwLCByc3VtID0gMDsKLSAgICAgICAgICAgIGludCBsZWZ0ID0gMCwgcmlnaHQgPSBsZW47Ci0KLSAgICAgICAgICAgIGZsb2F0IHJhdmFpbCA9IChhdmFpbCAtIGVsbGlwc2lzd2lkKSAvIDI7Ci0gICAgICAgICAgICBmb3IgKHJpZ2h0ID0gbGVuOyByaWdodCA+PSAwOyByaWdodC0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZFtsZW4gKyByaWdodCAtIDFdOwotCi0gICAgICAgICAgICAgICAgaWYgKHcgKyByc3VtID4gcmF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJzdW0gKz0gdzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmxvYXQgbGF2YWlsID0gYXZhaWwgLSBlbGxpcHNpc3dpZCAtIHJzdW07Ci0gICAgICAgICAgICBmb3IgKGxlZnQgPSAwOyBsZWZ0IDwgcmlnaHQ7IGxlZnQrKykgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWRbbGVuICsgbGVmdF07Ci0KLSAgICAgICAgICAgICAgICBpZiAodyArIGxzdW0gPiBsYXZhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbHN1bSArPSB3OworICAgICAgICAgICAgICAgIHJpZ2h0ID0gbGVuIC0gbXQuYnJlYWtUZXh0KDAsIGxlbiwgZmFsc2UsIGF2YWlsIC8gMik7CisgICAgICAgICAgICAgICAgYXZhaWwgLT0gbXQubWVhc3VyZShyaWdodCwgbGVuKTsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gbXQuYnJlYWtUZXh0KDAsIHJpZ2h0LCB0cnVlLCBhdmFpbCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZChsZWZ0LCByaWdodCk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBtdC5tQ2hhcnM7CisgICAgICAgICAgICBTcGFubmVkIHNwID0gdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQgPyAoU3Bhbm5lZCkgdGV4dCA6IG51bGw7CisKKyAgICAgICAgICAgIGludCByZW1haW5pbmcgPSBsZW4gLSAocmlnaHQgLSBsZWZ0KTsKICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZyBzcyA9IG5ldyBTcGFubmFibGVTdHJpbmcoYmxhbmsodGV4dCwgbGVmdCwgcmlnaHQpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nID4gMCkgeyAvLyBlbHNlIGVsaW1pbmF0ZSB0aGUgZWxsaXBzaXMgdG9vCisgICAgICAgICAgICAgICAgICAgIGJ1ZltsZWZ0KytdID0gJ1x1MjAyNic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBsZWZ0OyBpIDwgcmlnaHQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBidWZbaV0gPSAnXHVGRUZGJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGJ1ZiwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoc3AgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nIHNzID0gbmV3IFNwYW5uYWJsZVN0cmluZyhzKTsKICAgICAgICAgICAgICAgICBjb3B5U3BhbnNGcm9tKHNwLCAwLCBsZW4sIE9iamVjdC5jbGFzcywgc3MsIDApOwogICAgICAgICAgICAgICAgIHJldHVybiBzczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBvdXQgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihzRWxsaXBzaXMpOwotICAgICAgICAgICAgICAgIG91dC5pbnNlcnQoMCwgdGV4dCwgMCwgbGVmdCk7Ci0gICAgICAgICAgICAgICAgb3V0Lmluc2VydChvdXQubGVuZ3RoKCksIHRleHQsIHJpZ2h0LCBsZW4pOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBibGFuayhDaGFyU2VxdWVuY2Ugc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgaW50IGxlbiA9IHNvdXJjZS5sZW5ndGgoKTsKLSAgICAgICAgY2hhcltdIGJ1ZiA9IG9idGFpbihsZW4pOwotCi0gICAgICAgIGlmIChzdGFydCAhPSAwKSB7Ci0gICAgICAgICAgICBnZXRDaGFycyhzb3VyY2UsIDAsIHN0YXJ0LCBidWYsIDApOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbmQgIT0gbGVuKSB7Ci0gICAgICAgICAgICBnZXRDaGFycyhzb3VyY2UsIGVuZCwgbGVuLCBidWYsIGVuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhcnQgIT0gZW5kKSB7Ci0gICAgICAgICAgICBidWZbc3RhcnRdID0gJ1x1MjAyNic7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCArIDE7IGkgPCBlbmQ7IGkrKykgewotICAgICAgICAgICAgICAgIGJ1ZltpXSA9ICdcdUZFRkYnOworICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgCi0gICAgICAgIFN0cmluZyByZXQgPSBuZXcgU3RyaW5nKGJ1ZiwgMCwgbGVuKTsKLSAgICAgICAgcmVjeWNsZShidWYpOwogCi0gICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBpZiAoc3AgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihyZW1haW5pbmcgKyBzRWxsaXBzaXMubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChidWYsIDAsIGxlZnQpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzRWxsaXBzaXMpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChidWYsIHJpZ2h0LCBsZW4gLSByaWdodCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgc3NiID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHNzYi5hcHBlbmQodGV4dCwgMCwgbGVmdCk7CisgICAgICAgICAgICBzc2IuYXBwZW5kKHNFbGxpcHNpcyk7CisgICAgICAgICAgICBzc2IuYXBwZW5kKHRleHQsIHJpZ2h0LCBsZW4pOworICAgICAgICAgICAgcmV0dXJuIHNzYjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIE1lYXN1cmVkVGV4dC5yZWN5Y2xlKG10KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTI3OCw4MCArMTA5MywxMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcCwgZmxvYXQgYXZhaWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9uZU1vcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1vcmUpIHsKLSAgICAgICAgaW50IGxlbiA9IHRleHQubGVuZ3RoKCk7Ci0gICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhcltsZW5dOwotICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgMCwgbGVuLCBidWYsIDApOwogCi0gICAgICAgIGludCBjb21tYUNvdW50ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgaWYgKGJ1ZltpXSA9PSAnLCcpIHsKLSAgICAgICAgICAgICAgICBjb21tYUNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdFtdIHdpZDsKLQotICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKLSAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgdGV4dDsKLSAgICAgICAgICAgIFRleHRQYWludCB0ZW1wcGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7Ci0gICAgICAgICAgICB3aWQgPSBuZXcgZmxvYXRbbGVuICogMl07Ci0KLSAgICAgICAgICAgIGludCBuZXh0OwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkgPSBuZXh0KSB7Ci0gICAgICAgICAgICAgICAgbmV4dCA9IHNwLm5leHRTcGFuVHJhbnNpdGlvbihpLCBsZW4sIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgU3R5bGVkLmdldFRleHRXaWR0aHMocCwgdGVtcHBhaW50LCBzcCwgaSwgbmV4dCwgd2lkLCBudWxsKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZCwgMCwgd2lkLCBsZW4gKyBpLCBuZXh0IC0gaSk7CisgICAgICAgIE1lYXN1cmVkVGV4dCBtdCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOworICAgICAgICAgICAgZmxvYXQgd2lkdGggPSBzZXRQYXJhKG10LCBwLCB0ZXh0LCAwLCBsZW4sIExheW91dC5ESVJfUkVRVUVTVF9ERUZBVUxUX0xUUik7CisgICAgICAgICAgICBpZiAod2lkdGggPD0gYXZhaWwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh3aWQsIGxlbiwgd2lkLCAwLCBsZW4pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd2lkID0gbmV3IGZsb2F0W2xlbl07Ci0gICAgICAgICAgICBwLmdldFRleHRXaWR0aHModGV4dCwgMCwgbGVuLCB3aWQpOwotICAgICAgICB9CisgICAgICAgICAgICBjaGFyW10gYnVmID0gbXQubUNoYXJzOwogCi0gICAgICAgIGludCBvayA9IDA7Ci0gICAgICAgIGludCBva1JlbWFpbmluZyA9IGNvbW1hQ291bnQgKyAxOwotICAgICAgICBTdHJpbmcgb2tGb3JtYXQgPSAiIjsKLQotICAgICAgICBpbnQgdyA9IDA7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgdyArPSB3aWRbaV07Ci0KLSAgICAgICAgICAgIGlmIChidWZbaV0gPT0gJywnKSB7Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLQotICAgICAgICAgICAgICAgIGludCByZW1haW5pbmcgPSBjb21tYUNvdW50IC0gY291bnQgKyAxOwotICAgICAgICAgICAgICAgIGZsb2F0IG1vcmVXaWQ7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZvcm1hdDsKLQotICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiICIgKyBvbmVNb3JlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICIgIiArIFN0cmluZy5mb3JtYXQobW9yZSwgcmVtYWluaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtb3JlV2lkID0gcC5tZWFzdXJlVGV4dChmb3JtYXQpOwotCi0gICAgICAgICAgICAgICAgaWYgKHcgKyBtb3JlV2lkIDw9IGF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9rID0gaSArIDE7Ci0gICAgICAgICAgICAgICAgICAgIG9rUmVtYWluaW5nID0gcmVtYWluaW5nOwotICAgICAgICAgICAgICAgICAgICBva0Zvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgIGludCBjb21tYUNvdW50ID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYnVmW2ldID09ICcsJykgeworICAgICAgICAgICAgICAgICAgICBjb21tYUNvdW50Kys7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9CiAKLSAgICAgICAgaWYgKHcgPD0gYXZhaWwpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHJlbWFpbmluZyA9IGNvbW1hQ291bnQgKyAxOworCisgICAgICAgICAgICBpbnQgb2sgPSAwOworICAgICAgICAgICAgaW50IG9rUmVtYWluaW5nID0gcmVtYWluaW5nOworICAgICAgICAgICAgU3RyaW5nIG9rRm9ybWF0ID0gIiI7CisKKyAgICAgICAgICAgIGludCB3ID0gMDsKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICBmbG9hdFtdIHdpZHRocyA9IG10Lm1XaWR0aHM7CisKKyAgICAgICAgICAgIGludCByZXF1ZXN0ID0gbXQubURpciA9PSAxID8gTGF5b3V0LkRJUl9SRVFVRVNUX0xUUiA6CisgICAgICAgICAgICAgICAgTGF5b3V0LkRJUl9SRVFVRVNUX1JUTDsKKworICAgICAgICAgICAgTWVhc3VyZWRUZXh0IHRlbXBNdCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICB3ICs9IHdpZHRoc1tpXTsKKworICAgICAgICAgICAgICAgIGlmIChidWZbaV0gPT0gJywnKSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgLy8gWFhYIHNob3VsZCBub3QgaW5zZXJ0IHNwYWNlcywgc2hvdWxkIGJlIHBhcnQgb2Ygc3RyaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIFhYWCBzaG91bGQgdXNlIHBsdXJhbCBydWxlcyBhbmQgbm90IGFzc3VtZSBFbmdsaXNoIHBsdXJhbHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKC0tcmVtYWluaW5nID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICIgIiArIG9uZU1vcmU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiICIgKyBTdHJpbmcuZm9ybWF0KG1vcmUsIHJlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBYWFggdGhpcyBpcyBwcm9iYWJseSBvaywgYnV0IG5lZWQgdG8gbG9vayBhdCBpdCBtb3JlCisgICAgICAgICAgICAgICAgICAgIHRlbXBNdC5zZXRQYXJhKGZvcm1hdCwgMCwgZm9ybWF0Lmxlbmd0aCgpLCByZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgbW9yZVdpZCA9IG10LmFkZFN0eWxlUnVuKHAsIG10Lm1MZW4sIG51bGwpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh3ICsgbW9yZVdpZCA8PSBhdmFpbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rUmVtYWluaW5nID0gcmVtYWluaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgb2tGb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNZWFzdXJlZFRleHQucmVjeWNsZSh0ZW1wTXQpOworCiAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG91dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKG9rRm9ybWF0KTsKICAgICAgICAgICAgIG91dC5pbnNlcnQoMCwgdGV4dCwgMCwgb2spOwogICAgICAgICAgICAgcmV0dXJuIG91dDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIE1lYXN1cmVkVGV4dC5yZWN5Y2xlKG10KTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IHNldFBhcmEoTWVhc3VyZWRUZXh0IG10LCBUZXh0UGFpbnQgcGFpbnQsCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgYmlkaVJlcXVlc3QpIHsKKworICAgICAgICBtdC5zZXRQYXJhKHRleHQsIHN0YXJ0LCBlbmQsIGJpZGlSZXF1ZXN0KTsKKworICAgICAgICBmbG9hdCB3aWR0aDsKKyAgICAgICAgU3Bhbm5lZCBzcCA9IHRleHQgaW5zdGFuY2VvZiBTcGFubmVkID8gKFNwYW5uZWQpIHRleHQgOiBudWxsOworICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIGlmIChzcCA9PSBudWxsKSB7CisgICAgICAgICAgICB3aWR0aCA9IG10LmFkZFN0eWxlUnVuKHBhaW50LCBsZW4sIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2lkdGggPSAwOworICAgICAgICAgICAgaW50IHNwYW5FbmQ7CisgICAgICAgICAgICBmb3IgKGludCBzcGFuU3RhcnQgPSAwOyBzcGFuU3RhcnQgPCBsZW47IHNwYW5TdGFydCA9IHNwYW5FbmQpIHsKKyAgICAgICAgICAgICAgICBzcGFuRW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHNwYW5TdGFydCwgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0gc3AuZ2V0U3BhbnMoCisgICAgICAgICAgICAgICAgICAgICAgICBzcGFuU3RhcnQsIHNwYW5FbmQsIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIHdpZHRoICs9IG10LmFkZFN0eWxlUnVuKHBhaW50LCBzcGFucywgc3BhbkVuZCAtIHNwYW5TdGFydCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gd2lkdGg7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBGSVJTVF9SSUdIVF9UT19MRUZUID0gJ1x1MDU5MCc7CisKKyAgICAvKiBwYWNrYWdlICovCisgICAgc3RhdGljIGJvb2xlYW4gZG9lc05vdE5lZWRCaWRpKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzLmNoYXJBdChpKSA+PSBGSVJTVF9SSUdIVF9UT19MRUZUKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBkb2VzTm90TmVlZEJpZGkoY2hhcltdIHRleHQsIGludCBzdGFydCwgaW50IGxlbikgeworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBpICsgbGVuOyBpIDwgZTsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGV4dFtpXSA+PSBGSVJTVF9SSUdIVF9UT19MRUZUKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGNoYXJbXSBvYnRhaW4oaW50IGxlbikgewogICAgICAgICBjaGFyW10gYnVmOwogCkBAIC0xNTI5LDcgKzEzODUsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUF9NT0RFX0NIQVJBQ1RFUlMKICAgICAgICAgICAgID0gSW5wdXRUeXBlLlRZUEVfVEVYVF9GTEFHX0NBUF9DSEFSQUNURVJTOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQ2FwaXRhbGl6YXRpb24gbW9kZSBmb3Ige0BsaW5rICNnZXRDYXBzTW9kZX06IGNhcGl0YWxpemUgdGhlIGZpcnN0CiAgICAgICogY2hhcmFjdGVyIG9mIGFsbCB3b3Jkcy4gIFRoaXMgdmFsdWUgaXMgZXhwbGljaXRseSBkZWZpbmVkIHRvIGJlIHRoZSBzYW1lIGFzCkBAIC0xNTM3LDcgKzEzOTMsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUF9NT0RFX1dPUkRTCiAgICAgICAgICAgICA9IElucHV0VHlwZS5UWVBFX1RFWFRfRkxBR19DQVBfV09SRFM7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDYXBpdGFsaXphdGlvbiBtb2RlIGZvciB7QGxpbmsgI2dldENhcHNNb2RlfTogY2FwaXRhbGl6ZSB0aGUgZmlyc3QKICAgICAgKiBjaGFyYWN0ZXIgb2YgZWFjaCBzZW50ZW5jZS4gIFRoaXMgdmFsdWUgaXMgZXhwbGljaXRseSBkZWZpbmVkIHRvIGJlIHRoZSBzYW1lIGFzCkBAIC0xNTQ1LDEzICsxNDAxLDEzIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQX01PREVfU0VOVEVOQ0VTCiAgICAgICAgICAgICA9IElucHV0VHlwZS5UWVBFX1RFWFRfRkxBR19DQVBfU0VOVEVOQ0VTOwotICAgIAorCiAgICAgLyoqCiAgICAgICogRGV0ZXJtaW5lIHdoYXQgY2FwcyBtb2RlIHNob3VsZCBiZSBpbiBlZmZlY3QgYXQgdGhlIGN1cnJlbnQgb2Zmc2V0IGluCiAgICAgICogdGhlIHRleHQuICBPbmx5IHRoZSBtb2RlIGJpdHMgc2V0IGluIDx2YXI+cmVxTW9kZXM8L3Zhcj4gd2lsbCBiZQogICAgICAqIGNoZWNrZWQuICBOb3RlIHRoYXQgdGhlIGNhcHMgbW9kZSBmbGFncyBoZXJlIGFyZSBleHBsaWNpdGx5IGRlZmluZWQKICAgICAgKiB0byBtYXRjaCB0aG9zZSBpbiB7QGxpbmsgSW5wdXRUeXBlfS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBjcyBUaGUgdGV4dCB0aGF0IHNob3VsZCBiZSBjaGVja2VkIGZvciBjYXBzIG1vZGVzLgogICAgICAqIEBwYXJhbSBvZmYgTG9jYXRpb24gaW4gdGhlIHRleHQgYXQgd2hpY2ggdG8gY2hlY2suCiAgICAgICogQHBhcmFtIHJlcU1vZGVzIFRoZSBtb2RlcyB0byBiZSBjaGVja2VkOiBtYXkgYmUgYW55IGNvbWJpbmF0aW9uIG9mCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Ub3VjaC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9tZXRob2QvVG91Y2guamF2YQppbmRleCBhMTlhNzhlLi4zYjk4ZmMzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Ub3VjaC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvbWV0aG9kL1RvdWNoLmphdmEKQEAgLTQ0LDYgKzQ0LDcgQEAKICAgICAgICAgaW50IGxlZnQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKICAgICAgICAgaW50IHJpZ2h0ID0gMDsKICAgICAgICAgQWxpZ25tZW50IGEgPSBudWxsOworICAgICAgICBib29sZWFuIGx0ciA9IHRydWU7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IHRvcDsgaSA8PSBib3R0b207IGkrKykgewogICAgICAgICAgICAgbGVmdCA9IChpbnQpIE1hdGgubWluKGxlZnQsIGxheW91dC5nZXRMaW5lTGVmdChpKSk7CkBAIC01MSw2ICs1Miw3IEBACiAKICAgICAgICAgICAgIGlmIChhID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBhID0gbGF5b3V0LmdldFBhcmFncmFwaEFsaWdubWVudChpKTsKKyAgICAgICAgICAgICAgICBsdHIgPSBsYXlvdXQuZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGkpID4gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC01OCwxMCArNjAsMTIgQEAKICAgICAgICAgaW50IHdpZHRoID0gd2lkZ2V0LmdldFdpZHRoKCk7CiAgICAgICAgIGludCBkaWZmID0gMDsKIAorICAgICAgICAvLyBhbGlnbl9vcHBvc2l0ZSBkb2VzIE5PVCBtZWFuIGFsaWduX3JpZ2h0LCB3ZSBuZWVkIHRoZSBwYXJhZ3JhcGgKKyAgICAgICAgLy8gZGlyZWN0aW9uIHRvIHJlc29sdmUgaXQgdG8gbGVmdCBvciByaWdodAogICAgICAgICBpZiAocmlnaHQgLSBsZWZ0IDwgd2lkdGggLSBwYWRkaW5nKSB7CiAgICAgICAgICAgICBpZiAoYSA9PSBBbGlnbm1lbnQuQUxJR05fQ0VOVEVSKSB7CiAgICAgICAgICAgICAgICAgZGlmZiA9ICh3aWR0aCAtIHBhZGRpbmcgLSAocmlnaHQgLSBsZWZ0KSkgLyAyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IEFsaWdubWVudC5BTElHTl9PUFBPU0lURSkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChsdHIgPT0gKGEgPT0gQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFKSkgewogICAgICAgICAgICAgICAgIGRpZmYgPSB3aWR0aCAtIHBhZGRpbmcgLSAocmlnaHQgLSBsZWZ0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0FuZHJvaWRFeGNlcHRpb24uamF2YQppbmRleCBhNzY3ZWExLi5kZmUwMGM5YiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkRXhjZXB0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkRXhjZXB0aW9uLmphdmEKQEAgLTI3LDYgKzI3LDEwIEBACiAgICAgICAgIHN1cGVyKG5hbWUpOwogICAgIH0KIAorICAgIHB1YmxpYyBBbmRyb2lkRXhjZXB0aW9uKFN0cmluZyBuYW1lLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIobmFtZSwgY2F1c2UpOworICAgIH0KKwogICAgIHB1YmxpYyBBbmRyb2lkRXhjZXB0aW9uKEV4Y2VwdGlvbiBjYXVzZSkgewogICAgICAgICBzdXBlcihjYXVzZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkUnVudGltZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkUnVudGltZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDRlZDE3YmMuLjJiODI0YmYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0FuZHJvaWRSdW50aW1lRXhjZXB0aW9uLmphdmEKQEAgLTI3LDYgKzI3LDEwIEBACiAgICAgICAgIHN1cGVyKG5hbWUpOwogICAgIH0KIAorICAgIHB1YmxpYyBBbmRyb2lkUnVudGltZUV4Y2VwdGlvbihTdHJpbmcgbmFtZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKG5hbWUsIGNhdXNlKTsKKyAgICB9CisKICAgICBwdWJsaWMgQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24oRXhjZXB0aW9uIGNhdXNlKSB7CiAgICAgICAgIHN1cGVyKGNhdXNlKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0NoYXJzZXRVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9DaGFyc2V0VXRpbHMuamF2YQppbmRleCA5ZDkxYWNhLi5hNzYzYTY5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0NoYXJzZXRVdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvQ2hhcnNldFV0aWxzLmphdmEKQEAgLTE3LDM2ICsxNyw1OCBAQAogcGFja2FnZSBhbmRyb2lkLnV0aWw7CiAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiAKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5JbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqCisgKiA8cD4KICAqIEEgY2xhc3MgY29udGFpbmluZyB1dGlsaXR5IG1ldGhvZHMgcmVsYXRlZCB0byBjaGFyYWN0ZXIgc2V0cy4gVGhpcwogICogY2xhc3MgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgY29kZSB0aGF0IHdpc2hlcyB0byBiZSB2ZW5kb3ItYXdhcmUKLSAqIGluIGl0cyBpbnRlcnByZXRhdGlvbiBvZiBKYXBhbmVzZSBlbmNvZGluZyBuYW1lcy4KLSAqIAotICogPHA+QXMgb2YgdGhpcyB3cml0aW5nLCB0aGUgb25seSB2ZW5kb3IgdGhhdCBpcyByZWNvZ25pemVkIGJ5IHRoaXMKLSAqIGNsYXNzIGlzIERvY29tbyAoaWRlbnRpZmllZCBjYXNlLWluc2Vuc2l0aXZlbHkgYXMge0Bjb2RlICJkb2NvbW8ifSkuPC9wPgotICogCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcyBpcyBoaWRkZW4gaW4gQ3VwY2FrZSwgd2l0aCBhIHBsYW4gdG8KLSAqIHVuLWhpZGUgaW4gRG9udXQuIFRoaXMgd2FzIGRvbmUgYmVjYXVzZSB0aGUgZmlyc3QgZGVwbG95bWVudCB0byB1c2UKLSAqIHRoaXMgY29kZSBpcyBiYXNlZCBvbiBDdXBjYWtlLCBidXQgdGhlIEFQSSBoYWQgdG8gYmUgaW50cm9kdWNlZAotICogYWZ0ZXIgdGhlIHB1YmxpYyBBUEkgZnJlZXplIGZvciB0aGF0IHJlbGVhc2UuIFRoZSB1cHNob3QgaXMgdGhhdAotICogb25seSBzeXN0ZW0gYXBwbGljYXRpb25zIGNhbiBzYWZlbHkgdXNlIHRoaXMgY2xhc3MgdW50aWwgRG9udXQgaXMKLSAqIGF2YWlsYWJsZS4KLSAqIAorICogaW4gaXRzIGludGVycHJldGF0aW9uIG9mIEphcGFuZXNlIGNoYXJzZXQgbmFtZXMgKHVzZWQgaW4gRG9Db01vLAorICogS0RESSwgYW5kIFNvZnRCYW5rKS4KKyAqIDwvcD4KKyAqCisgKiA8cD4KKyAqIDxiPk5vdGU6PC9iPiBEZXZlbG9wZXJzIHdpbGwgbmVlZCB0byBhZGQgYW4gYXBwcm9wcmlhdGUgbWFwcGluZyBmb3IKKyAqIGVhY2ggdmVuZG9yLXNwZWNpZmljIGNoYXJzZXQuIFlvdSBtYXkgbmVlZCB0byBtb2RpZnkgdGhlIEMgbGlicmFyaWVzCisgKiBsaWtlIGljdTRjIGluIG9yZGVyIHRvIGxldCBBbmRyb2lkIHN1cHBvcnQgYW4gYWRkaXRpb25hbCBjaGFyc2V0LgorICogPC9wPgorICoKICAqIEBoaWRlCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBDaGFyc2V0VXRpbHMgewogICAgIC8qKgotICAgICAqIG5hbWUgb2YgdGhlIHZlbmRvciAiRG9jb21vIi4gPGI+Tm90ZTo8L2I+IFRoaXMgaXNuJ3QgYSBwdWJsaWMKKyAgICAgKiBuYW1lIG9mIHRoZSB2ZW5kb3IgIkRvQ29NbyIuIDxiPk5vdGU6PC9iPiBUaGlzIGlzbid0IGEgcHVibGljCiAgICAgICogY29uc3RhbnQsIGluIG9yZGVyIHRvIGtlZXAgdGhpcyBjbGFzcyBmcm9tIGJlY29taW5nIGEgZGUgZmFjdG8KICAgICAgKiByZWZlcmVuY2UgbGlzdCBvZiB2ZW5kb3IgbmFtZXMuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFTkRPUl9ET0NPTU8gPSAiZG9jb21vIjsKLSAgICAKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSB2ZW5kb3IgIktEREkiLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRU5ET1JfS0RESSA9ICJrZGRpIjsKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSB2ZW5kb3IgIlNvZnRCYW5rIi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVORE9SX1NPRlRCQU5LID0gInNvZnRiYW5rIjsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgb25lLXRvLW9uZSBtYXBwaW5nIGZyb20gYSB2ZW5kb3IgbmFtZSB0byBhIGNoYXJzZXQgc3BlY2lmaWMgdG8gdGhlIHZlbmRvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHNWZW5kb3JTaGlmdEppc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgLy8gVGhlc2UgdmFyaWFudHMgb2YgU2hpZnRfSklTIGNvbWUgZnJvbSBpY3UncyBtYXBwaW5nIGRhdGEgKGNvbnZydHJzLnR4dCkKKyAgICAgICAgc1ZlbmRvclNoaWZ0SmlzTWFwLnB1dChWRU5ET1JfRE9DT01PLCAiZG9jb21vLXNoaWZ0X2ppcy0yMDA3Iik7CisgICAgICAgIHNWZW5kb3JTaGlmdEppc01hcC5wdXQoVkVORE9SX0tEREksICJrZGRpLXNoaWZ0X2ppcy0yMDA3Iik7CisgICAgICAgIHNWZW5kb3JTaGlmdEppc01hcC5wdXQoVkVORE9SX1NPRlRCQU5LLCAic29mdGJhbmstc2hpZnRfamlzLTIwMDciKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUaGlzIGNsYXNzIGlzIHVuaW5zdGFudGlhYmxlLgogICAgICAqLwpAQCAtNTgsMjAgKzgwLDIyIEBACiAgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIGNoYXJhY3RlciBzZXQKICAgICAgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBvcmlnaW5hbCBjaGFyYWN0ZXIgc2V0IG5hbWUgYW5kCiAgICAgICogdmVuZG9yLiBJZiB0aGVyZSBpcyBubyB2ZW5kb3Itc3BlY2lmaWMgY2hhcmFjdGVyIHNldCBmb3IgdGhlCi0gICAgICogZ2l2ZW4gbmFtZS92ZW5kb3IgcGFpciwgdGhpcyByZXR1cm5zIHRoZSBvcmlnaW5hbCBjaGFyYWN0ZXIgc2V0Ci0gICAgICogbmFtZS4gVGhlIHZlbmRvciBuYW1lIGlzIG1hdGNoZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LgotICAgICAqIAorICAgICAqIGdpdmVuIG5hbWUvdmVuZG9yIHBhaXIsIHRoaXMgcmV0dXJucyB0aGUgb3JpZ2luYWwgY2hhcmFjdGVyIHNldCBuYW1lLgorICAgICAqCiAgICAgICogQHBhcmFtIGNoYXJzZXROYW1lIHRoZSBiYXNlIGNoYXJhY3RlciBzZXQgbmFtZQotICAgICAqIEBwYXJhbSB2ZW5kb3IgdGhlIHZlbmRvciB0byBzcGVjaWFsaXplIGZvcgorICAgICAqIEBwYXJhbSB2ZW5kb3IgdGhlIHZlbmRvciB0byBzcGVjaWFsaXplIGZvci4gQWxsIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGxvd2VyLWNhc2VkLgogICAgICAqIEByZXR1cm4gdGhlIHNwZWNpYWxpemVkIGNoYXJhY3RlciBzZXQgbmFtZSwgb3Ige0Bjb2RlIGNoYXJzZXROYW1lfSBpZgogICAgICAqIHRoZXJlIGlzIG5vIHNwZWNpYWxpemVkIG5hbWUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBuYW1lRm9yVmVuZG9yKFN0cmluZyBjaGFyc2V0TmFtZSwgU3RyaW5nIHZlbmRvcikgewotICAgICAgICAvLyBUT0RPOiBFdmVudHVhbGx5LCB0aGlzIG1heSB3YW50IHRvIGJlIHRhYmxlLWRyaXZlbi4KLQotICAgICAgICBpZiAodmVuZG9yLmVxdWFsc0lnbm9yZUNhc2UoVkVORE9SX0RPQ09NTykKLSAgICAgICAgICAgICAgICAmJiBpc1NoaWZ0SmlzKGNoYXJzZXROYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuICJkb2NvbW8tc2hpZnRfamlzLTIwMDciOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGNoYXJzZXROYW1lKSAmJiAhVGV4dFV0aWxzLmlzRW1wdHkodmVuZG9yKSkgeworICAgICAgICAgICAgLy8gWW91IGNhbiBhZGQgeW91ciBvd24gbWFwcGluZyBoZXJlLgorICAgICAgICAgICAgaWYgKGlzU2hpZnRKaXMoY2hhcnNldE5hbWUpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZlbmRvclNoaWZ0SmlzID0gc1ZlbmRvclNoaWZ0SmlzTWFwLmdldCh2ZW5kb3IpOworICAgICAgICAgICAgICAgIGlmICh2ZW5kb3JTaGlmdEppcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZW5kb3JTaGlmdEppczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gY2hhcnNldE5hbWU7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0ZpbmFsaXplcnMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvRmluYWxpemVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MWYyZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0ZpbmFsaXplcnMuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC51dGlsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZi5QaGFudG9tUmVmZXJlbmNlOworaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlOworaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWU7CisKKy8qKgorICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgcmVsaWFibGUgZmluYWxpemVycy4KKyAqIAorICogQGhpZGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEZpbmFsaXplcnMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkZpbmFsaXplcnMiOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIHNMb2NrID0gbmV3IE9iamVjdFswXTsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNJbml0OworICAgIHByaXZhdGUgc3RhdGljIFJlY2xhaW1lciBzUmVjbGFpbWVyOworCisgICAgLyoqCisgICAgICogU3ViY2xhc3Mgb2YgUGhhbnRvbVJlZmVyZW5jZSB1c2VkIHRvIHJlY2xhaW0gcmVzb3VyY2VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUmVjbGFpbWFibGVSZWZlcmVuY2U8VD4gZXh0ZW5kcyBQaGFudG9tUmVmZXJlbmNlPFQ+IHsKKyAgICAgICAgcHVibGljIFJlY2xhaW1hYmxlUmVmZXJlbmNlKFQgciwgUmVmZXJlbmNlUXVldWU8T2JqZWN0PiBxKSB7CisgICAgICAgICAgICBzdXBlcihyLCBxKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVjbGFpbSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHF1ZXVlIHVzZWQgdG8gcmVjbGFpbSBSZWNsYWltYWJsZVJlZmVyZW5jZXMuCisgICAgICogCisgICAgICogQHJldHVybiBBIHJlZmVyZW5jZSBxdWV1ZSBvciBudWxsIGJlZm9yZSBpbml0aWFsaXphdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUmVmZXJlbmNlUXVldWU8T2JqZWN0PiBnZXRRdWV1ZSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgeworICAgICAgICAgICAgaWYgKCFzSW5pdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzUmVjbGFpbWVyLmlzUnVubmluZygpKSB7CisgICAgICAgICAgICAgICAgc1JlY2xhaW1lciA9IG5ldyBSZWNsYWltZXIoc1JlY2xhaW1lci5tUXVldWUpOworICAgICAgICAgICAgICAgIHNSZWNsYWltZXIuc3RhcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzUmVjbGFpbWVyLm1RdWV1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZWQgYnkgWnlnb3RlLiBEb24ndCB0b3VjaCEKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzTG9jaykgeworICAgICAgICAgICAgaWYgKCFzSW5pdCAmJiBzUmVjbGFpbWVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzUmVjbGFpbWVyID0gbmV3IFJlY2xhaW1lcigpOworICAgICAgICAgICAgICAgIHNSZWNsYWltZXIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBzSW5pdCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVjbGFpbWVyIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgUmVmZXJlbmNlUXVldWU8T2JqZWN0PiBtUXVldWU7CisKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1SdW5uaW5nID0gZmFsc2U7CisKKyAgICAgICAgUmVjbGFpbWVyKCkgeworICAgICAgICAgICAgdGhpcyhuZXcgUmVmZXJlbmNlUXVldWU8T2JqZWN0PigpKTsKKyAgICAgICAgfQorCisgICAgICAgIFJlY2xhaW1lcihSZWZlcmVuY2VRdWV1ZTxPYmplY3Q+IHF1ZXVlKSB7CisgICAgICAgICAgICBzdXBlcigiUmVjbGFpbWVyIik7CisgICAgICAgICAgICBzZXREYWVtb24odHJ1ZSk7CisgICAgICAgICAgICBtUXVldWUgPSBxdWV1ZTsgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgICAgIG1SdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIHN1cGVyLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGlzUnVubmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBtUnVubmluZzsKKyAgICAgICAgfQorCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiSW5maW5pdGVMb29wU3RhdGVtZW50In0pCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGVhblVwKG1RdWV1ZS5yZW1vdmUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiUmVjbGFpbWVyIHRocmVhZCBleGl0aW5nOiAiLCBlKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgbVJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjbGVhblVwKFJlZmVyZW5jZTw/PiByZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICByZWZlcmVuY2UuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAoKFJlY2xhaW1hYmxlUmVmZXJlbmNlPD8+KSByZWZlcmVuY2UpLnJlY2xhaW0oKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKChyZWZlcmVuY2UgPSBtUXVldWUucG9sbCgpKSAhPSBudWxsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvblJlYWRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Kc29uUmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0NWJmYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvblJlYWRlci5qYXZhCkBAIC0wLDAgKzEsMTA1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC51dGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFJlYWRzIGEgSlNPTiAoPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDYyNy50eHQiPlJGQyA0NjI3PC9hPikKKyAqIGVuY29kZWQgdmFsdWUgYXMgYSBzdHJlYW0gb2YgdG9rZW5zLiBUaGlzIHN0cmVhbSBpbmNsdWRlcyBib3RoIGxpdGVyYWwKKyAqIHZhbHVlcyAoc3RyaW5ncywgbnVtYmVycywgYm9vbGVhbnMsIGFuZCBudWxscykgYXMgd2VsbCBhcyB0aGUgYmVnaW4gYW5kCisgKiBlbmQgZGVsaW1pdGVycyBvZiBvYmplY3RzIGFuZCBhcnJheXMuIFRoZSB0b2tlbnMgYXJlIHRyYXZlcnNlZCBpbgorICogZGVwdGgtZmlyc3Qgb3JkZXIsIHRoZSBzYW1lIG9yZGVyIHRoYXQgdGhleSBhcHBlYXIgaW4gdGhlIEpTT04gZG9jdW1lbnQuCisgKiBXaXRoaW4gSlNPTiBvYmplY3RzLCBuYW1lL3ZhbHVlIHBhaXJzIGFyZSByZXByZXNlbnRlZCBieSBhIHNpbmdsZSB0b2tlbi4KKyAqCisgKiA8aDM+UGFyc2luZyBKU09OPC9oMz4KKyAqIFRvIGNyZWF0ZSBhIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlciB5b3VyIG93biBKU09OIHN0cmVhbXMsIGZpcnN0IGNyZWF0ZSBhbgorICogZW50cnkgcG9pbnQgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIHtAY29kZSBKc29uUmVhZGVyfS4KKyAqCisgKiA8cD5OZXh0LCBjcmVhdGUgaGFuZGxlciBtZXRob2RzIGZvciBlYWNoIHN0cnVjdHVyZSBpbiB5b3VyIEpTT04gdGV4dC4gWW91J2xsCisgKiBuZWVkIGEgbWV0aG9kIGZvciBlYWNoIG9iamVjdCB0eXBlIGFuZCBmb3IgZWFjaCBhcnJheSB0eXBlLgorICogPHVsPgorICogICA8bGk+V2l0aGluIDxzdHJvbmc+YXJyYXkgaGFuZGxpbmc8L3N0cm9uZz4gbWV0aG9kcywgZmlyc3QgY2FsbCB7QGxpbmsKKyAqICAgICAgICNiZWdpbkFycmF5fSB0byBjb25zdW1lIHRoZSBhcnJheSdzIG9wZW5pbmcgYnJhY2tldC4gVGhlbiBjcmVhdGUgYQorICogICAgICAgd2hpbGUgbG9vcCB0aGF0IGFjY3VtdWxhdGVzIHZhbHVlcywgdGVybWluYXRpbmcgd2hlbiB7QGxpbmsgI2hhc05leHR9CisgKiAgICAgICBpcyBmYWxzZS4gRmluYWxseSwgcmVhZCB0aGUgYXJyYXkncyBjbG9zaW5nIGJyYWNrZXQgYnkgY2FsbGluZyB7QGxpbmsKKyAqICAgICAgICNlbmRBcnJheX0uCisgKiAgIDxsaT5XaXRoaW4gPHN0cm9uZz5vYmplY3QgaGFuZGxpbmc8L3N0cm9uZz4gbWV0aG9kcywgZmlyc3QgY2FsbCB7QGxpbmsKKyAqICAgICAgICNiZWdpbk9iamVjdH0gdG8gY29uc3VtZSB0aGUgb2JqZWN0J3Mgb3BlbmluZyBicmFjZS4gVGhlbiBjcmVhdGUgYQorICogICAgICAgd2hpbGUgbG9vcCB0aGF0IGFzc2lnbnMgdmFsdWVzIHRvIGxvY2FsIHZhcmlhYmxlcyBiYXNlZCBvbiB0aGVpciBuYW1lLgorICogICAgICAgVGhpcyBsb29wIHNob3VsZCB0ZXJtaW5hdGUgd2hlbiB7QGxpbmsgI2hhc05leHR9IGlzIGZhbHNlLiBGaW5hbGx5LAorICogICAgICAgcmVhZCB0aGUgb2JqZWN0J3MgY2xvc2luZyBicmFjZSBieSBjYWxsaW5nIHtAbGluayAjZW5kT2JqZWN0fS4KKyAqIDwvdWw+CisgKiA8cD5XaGVuIGEgbmVzdGVkIG9iamVjdCBvciBhcnJheSBpcyBlbmNvdW50ZXJlZCwgZGVsZWdhdGUgdG8gdGhlCisgKiBjb3JyZXNwb25kaW5nIGhhbmRsZXIgbWV0aG9kLgorICoKKyAqIDxwPldoZW4gYW4gdW5rbm93biBuYW1lIGlzIGVuY291bnRlcmVkLCBzdHJpY3QgcGFyc2VycyBzaG91bGQgZmFpbCB3aXRoIGFuCisgKiBleGNlcHRpb24uIExlbmllbnQgcGFyc2VycyBzaG91bGQgY2FsbCB7QGxpbmsgI3NraXBWYWx1ZSgpfSB0byByZWN1cnNpdmVseQorICogc2tpcCB0aGUgdmFsdWUncyBuZXN0ZWQgdG9rZW5zLCB3aGljaCBtYXkgb3RoZXJ3aXNlIGNvbmZsaWN0LgorICoKKyAqIDxwPklmIGEgdmFsdWUgbWF5IGJlIG51bGwsIHlvdSBzaG91bGQgZmlyc3QgY2hlY2sgdXNpbmcge0BsaW5rICNwZWVrKCl9LgorICogTnVsbCBsaXRlcmFscyBjYW4gYmUgY29uc3VtZWQgdXNpbmcgZWl0aGVyIHtAbGluayAjbmV4dE51bGwoKX0gb3Ige0BsaW5rCisgKiAjc2tpcFZhbHVlKCl9LgorICoKKyAqIDxoMz5FeGFtcGxlPC9oMz4KKyAqIFN1cHBvc2Ugd2UnZCBsaWtlIHRvIHBhcnNlIGEgc3RyZWFtIG9mIG1lc3NhZ2VzIHN1Y2ggYXMgdGhlIGZvbGxvd2luZzogPHByZT4ge0Bjb2RlCisgKiBbCisgKiAgIHsKKyAqICAgICAiaWQiOiA5MTIzNDU2Nzg5MDEsCisgKiAgICAgInRleHQiOiAiSG93IGRvIEkgcmVhZCBKU09OIG9uIEFuZHJvaWQ/IiwKKyAqICAgICAiZ2VvIjogbnVsbCwKKyAqICAgICAidXNlciI6IHsKKyAqICAgICAgICJuYW1lIjogImFuZHJvaWRfbmV3YiIsCisgKiAgICAgICAiZm9sbG93ZXJzX2NvdW50IjogNDEKKyAqICAgICAgfQorICogICB9LAorICogICB7CisgKiAgICAgImlkIjogOTEyMzQ1Njc4OTAyLAorICogICAgICJ0ZXh0IjogIkBhbmRyb2lkX25ld2IganVzdCB1c2UgYW5kcm9pZC51dGlsLkpzb25SZWFkZXIhIiwKKyAqICAgICAiZ2VvIjogWzUwLjQ1NDcyMiwgLTEwNC42MDY2NjddLAorICogICAgICJ1c2VyIjogeworICogICAgICAgIm5hbWUiOiAiamVzc2UiLAorICogICAgICAgImZvbGxvd2Vyc19jb3VudCI6IDIKKyAqICAgICB9CisgKiAgIH0KKyAqIF19PC9wcmU+CisgKiBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgcGFyc2VyIGZvciB0aGUgYWJvdmUgc3RydWN0dXJlOiA8cHJlPiAgIHtAY29kZQorICoKKyAqICAgcHVibGljIExpc3Q8TWVzc2FnZT4gcmVhZEpzb25TdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgKiAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sICJVVEYtOCIpKTsKKyAqICAgICByZXR1cm4gcmVhZE1lc3NhZ2VzQXJyYXkocmVhZGVyKTsKKyAqICAgfQorICoKKyAqICAgcHVibGljIExpc3Q8TWVzc2FnZT4gcmVhZE1lc3NhZ2VzQXJyYXkoSnNvblJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgKiAgICAgTGlzdDxNZXNzYWdlPiBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3Q8TWVzc2FnZT4oKTsKKyAqCisgKiAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAqICAgICB3aGlsZSAocmVhZGVyLmhhc05leHQoKSkgeworICogICAgICAgbWVzc2FnZXMuYWRkKHJlYWRNZXNzYWdlKHJlYWRlcikpOworICogICAgIH0KKyAqICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAqICAgICByZXR1cm4gbWVzc2FnZXM7CisgKiAgIH0KKyAqCisgKiAgIHB1YmxpYyBNZXNzYWdlIHJlYWRNZXNzYWdlKEpzb25SZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICogICAgIGxvbmcgaWQgPSAtMTsKKyAqICAgICBTdHJpbmcgdGV4dCA9IG51bGw7CisgKiAgICAgVXNlciB1c2VyID0gbnVsbDsKKyAqICAgICBMaXN0PERvdWJsZT4gZ2VvID0gbnVsbDsKKyAqCisgKiAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgKiAgICAgd2hpbGUgKHJlYWRlci5oYXNOZXh0KCkpIHsKKyAqICAgICAgIFN0cmluZyBuYW1lID0gcmVhZGVyLm5leHROYW1lKCk7CisgKiAgICAgICBpZiAobmFtZS5lcXVhbHMoImlkIikpIHsKKyAqICAgICAgICAgaWQgPSByZWFkZXIubmV4dExvbmcoKTsKKyAqICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoInRleHQiKSkgeworICogICAgICAgICB0ZXh0ID0gcmVhZGVyLm5leHRTdHJpbmcoKTsKKyAqICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImdlbyIpICYmIHJlYWRlci5wZWVrKCkgIT0gSnNvblRva2VuLk5VTEwpIHsKKyAqICAgICAgICAgZ2VvID0gcmVhZERvdWJsZXNBcnJheShyZWFkZXIpOworICogICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygidXNlciIpKSB7CisgKiAgICAgICAgIHVzZXIgPSByZWFkVXNlcihyZWFkZXIpOworICogICAgICAgfSBlbHNlIHsKKyAqICAgICAgICAgcmVhZGVyLnNraXBWYWx1ZSgpOworICogICAgICAgfQorICogICAgIH0KKyAqICAgICByZWFkZXIuZW5kT2JqZWN0KCk7CisgKiAgICAgcmV0dXJuIG5ldyBNZXNzYWdlKGlkLCB0ZXh0LCB1c2VyLCBnZW8pOworICogICB9CisgKgorICogICBwdWJsaWMgTGlzdDxEb3VibGU+IHJlYWREb3VibGVzQXJyYXkoSnNvblJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgKiAgICAgTGlzdDxEb3VibGU+IGRvdWJsZXMgPSBuZXcgQXJyYXlMaXN0PERvdWJsZT4oKTsKKyAqCisgKiAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAqICAgICB3aGlsZSAocmVhZGVyLmhhc05leHQoKSkgeworICogICAgICAgZG91Ymxlcy5hZGQocmVhZGVyLm5leHREb3VibGUoKSk7CisgKiAgICAgfQorICogICAgIHJlYWRlci5lbmRBcnJheSgpOworICogICAgIHJldHVybiBkb3VibGVzOworICogICB9CisgKgorICogICBwdWJsaWMgVXNlciByZWFkVXNlcihKc29uUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAqICAgICBTdHJpbmcgdXNlcm5hbWUgPSBudWxsOworICogICAgIGludCBmb2xsb3dlcnNDb3VudCA9IC0xOworICoKKyAqICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAqICAgICB3aGlsZSAocmVhZGVyLmhhc05leHQoKSkgeworICogICAgICAgU3RyaW5nIG5hbWUgPSByZWFkZXIubmV4dE5hbWUoKTsKKyAqICAgICAgIGlmIChuYW1lLmVxdWFscygibmFtZSIpKSB7CisgKiAgICAgICAgIHVzZXJuYW1lID0gcmVhZGVyLm5leHRTdHJpbmcoKTsKKyAqICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImZvbGxvd2Vyc19jb3VudCIpKSB7CisgKiAgICAgICAgIGZvbGxvd2Vyc0NvdW50ID0gcmVhZGVyLm5leHRJbnQoKTsKKyAqICAgICAgIH0gZWxzZSB7CisgKiAgICAgICAgIHJlYWRlci5za2lwVmFsdWUoKTsKKyAqICAgICAgIH0KKyAqICAgICB9CisgKiAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICogICAgIHJldHVybiBuZXcgVXNlcih1c2VybmFtZSwgZm9sbG93ZXJzQ291bnQpOworICogICB9fTwvcHJlPgorICoKKyAqIDxoMz5OdW1iZXIgSGFuZGxpbmc8L2gzPgorICogVGhpcyByZWFkZXIgcGVybWl0cyBudW1lcmljIHZhbHVlcyB0byBiZSByZWFkIGFzIHN0cmluZ3MgYW5kIHN0cmluZyB2YWx1ZXMgdG8KKyAqIGJlIHJlYWQgYXMgbnVtYmVycy4gRm9yIGV4YW1wbGUsIGJvdGggZWxlbWVudHMgb2YgdGhlIEpTT04gYXJyYXkge0Bjb2RlCisgKiBbMSwgIjEiXX0gbWF5IGJlIHJlYWQgdXNpbmcgZWl0aGVyIHtAbGluayAjbmV4dEludH0gb3Ige0BsaW5rICNuZXh0U3RyaW5nfS4KKyAqIFRoaXMgYmVoYXZpb3IgaXMgaW50ZW5kZWQgdG8gcHJldmVudCBsb3NzeSBudW1lcmljIGNvbnZlcnNpb25zOiBkb3VibGUgaXMKKyAqIEphdmFTY3JpcHQncyBvbmx5IG51bWVyaWMgdHlwZSBhbmQgdmVyeSBsYXJnZSB2YWx1ZXMgbGlrZSB7QGNvZGUKKyAqIDkwMDcxOTkyNTQ3NDA5OTN9IGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5IG9uIHRoYXQgcGxhdGZvcm0uIFRvIG1pbmltaXplCisgKiBwcmVjaXNpb24gbG9zcywgZXh0cmVtZWx5IGxhcmdlIHZhbHVlcyBzaG91bGQgYmUgd3JpdHRlbiBhbmQgcmVhZCBhcyBzdHJpbmdzCisgKiBpbiBKU09OLgorICoKKyAqIDxwPkVhY2gge0Bjb2RlIEpzb25SZWFkZXJ9IG1heSBiZSB1c2VkIHRvIHJlYWQgYSBzaW5nbGUgSlNPTiBzdHJlYW0uIEluc3RhbmNlcworICogb2YgdGhpcyBjbGFzcyBhcmUgbm90IHRocmVhZCBzYWZlLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSnNvblJlYWRlciBpbXBsZW1lbnRzIENsb3NlYWJsZSB7CisKKyAgICAvKiogVGhlIGlucHV0IEpTT04uICovCisgICAgcHJpdmF0ZSBmaW5hbCBSZWFkZXIgaW47CisKKyAgICAvKiogVHJ1ZSB0byBhY2NlcHQgbm9uLXNwZWMgY29tcGxpYW50IEpTT04gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbGVuaWVudCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVXNlIGEgbWFudWFsIGJ1ZmZlciB0byBlYXNpbHkgcmVhZCBhbmQgdW5yZWFkIHVwY29taW5nIGNoYXJhY3RlcnMsIGFuZAorICAgICAqIGFsc28gc28gd2UgY2FuIGNyZWF0ZSBzdHJpbmdzIHdpdGhvdXQgYW4gaW50ZXJtZWRpYXRlIFN0cmluZ0J1aWxkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbMTAyNF07CisgICAgcHJpdmF0ZSBpbnQgcG9zID0gMDsKKyAgICBwcml2YXRlIGludCBsaW1pdCA9IDA7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8SnNvblNjb3BlPiBzdGFjayA9IG5ldyBBcnJheUxpc3Q8SnNvblNjb3BlPigpOworICAgIHsKKyAgICAgICAgcHVzaChKc29uU2NvcGUuRU1QVFlfRE9DVU1FTlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgd2UndmUgYWxyZWFkeSByZWFkIHRoZSBuZXh0IHRva2VuLiBJZiB3ZSBoYXZlLCB0aGUgc3RyaW5nIHZhbHVlCisgICAgICogZm9yIHRoYXQgdG9rZW4gd2lsbCBiZSBhc3NpZ25lZCB0byB7QGNvZGUgdmFsdWV9IGlmIHN1Y2ggYSBzdHJpbmcgdmFsdWUKKyAgICAgKiBleGlzdHMuIEFuZCB0aGUgdG9rZW4gdHlwZSB3aWxsIGJlIGFzc2lnbmVkIHRvIHtAY29kZSB0b2tlbn0gaWYgdGhlIHRva2VuCisgICAgICogdHlwZSBpcyBrbm93bi4gVGhlIHRva2VuIHR5cGUgbWF5IGJlIG51bGwgZm9yIGxpdGVyYWxzLCBzaW5jZSB3ZSBkZXJpdmUKKyAgICAgKiB0aGF0IGxhemlseS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzVG9rZW47CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgbmV4dCB0b2tlbiB0byBiZSByZXR1cm5lZCBieSB7QGxpbmsgI3BlZWt9IGFuZCB7QGxpbmsKKyAgICAgKiAjYWR2YW5jZX0sIG9yIHtAY29kZSBudWxsfSBpZiBpdCBpcyB1bmtub3duIGFuZCBtdXN0IGZpcnN0IGJlIGRlcml2ZWQKKyAgICAgKiBmcm9tIHtAY29kZSB2YWx1ZX0uIFRoaXMgdmFsdWUgaXMgdW5kZWZpbmVkIGlmIHtAY29kZSBoYXNUb2tlbn0gaXMgZmFsc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBKc29uVG9rZW4gdG9rZW47CisKKyAgICAvKiogVGhlIHRleHQgb2YgdGhlIG5leHQgbmFtZS4gKi8KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgLyoqIFRoZSB0ZXh0IG9mIHRoZSBuZXh0IGxpdGVyYWwgdmFsdWUuICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAvKiogVHJ1ZSBpZiB3ZSdyZSBjdXJyZW50bHkgaGFuZGxpbmcgYSBza2lwVmFsdWUoKSBjYWxsLiAqLworICAgIHByaXZhdGUgYm9vbGVhbiBza2lwcGluZyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSB0aGF0IHJlYWRzIGEgSlNPTi1lbmNvZGVkIHN0cmVhbSBmcm9tIHtAY29kZSBpbn0uCisgICAgICovCisgICAgcHVibGljIEpzb25SZWFkZXIoUmVhZGVyIGluKSB7CisgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImluID09IG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmluID0gaW47CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIHRoaXMgcGFyc2VyIHRvIGJlICBiZSBsaWJlcmFsIGluIHdoYXQgaXQgYWNjZXB0cy4gQnkgZGVmYXVsdCwKKyAgICAgKiB0aGlzIHBhcnNlciBpcyBzdHJpY3QgYW5kIG9ubHkgYWNjZXB0cyBKU09OIGFzIHNwZWNpZmllZCBieSA8YQorICAgICAqIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQ2MjcudHh0Ij5SRkMgNDYyNzwvYT4uIFNldHRpbmcgdGhlCisgICAgICogcGFyc2VyIHRvIGxlbmllbnQgY2F1c2VzIGl0IHRvIGlnbm9yZSB0aGUgZm9sbG93aW5nIHN5bnRheCBlcnJvcnM6CisgICAgICoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+RW5kIG9mIGxpbmUgY29tbWVudHMgc3RhcnRpbmcgd2l0aCB7QGNvZGUgLy99IG9yIHtAY29kZSAjfSBhbmQKKyAgICAgKiAgICAgICBlbmRpbmcgd2l0aCBhIG5ld2xpbmUgY2hhcmFjdGVyLgorICAgICAqICAgPGxpPkMtc3R5bGUgY29tbWVudHMgc3RhcnRpbmcgd2l0aCB7QGNvZGUgLyp9IGFuZCBlbmRpbmcgd2l0aAorICAgICAqICAgICAgIHtAY29kZSAqfXtAY29kZSAvfS4gU3VjaCBjb21tZW50cyBtYXkgbm90IGJlIG5lc3RlZC4KKyAgICAgKiAgIDxsaT5OYW1lcyB0aGF0IGFyZSB1bnF1b3RlZCBvciB7QGNvZGUgJ3NpbmdsZSBxdW90ZWQnfS4KKyAgICAgKiAgIDxsaT5TdHJpbmdzIHRoYXQgYXJlIHVucXVvdGVkIG9yIHtAY29kZSAnc2luZ2xlIHF1b3RlZCd9LgorICAgICAqICAgPGxpPkFycmF5IGVsZW1lbnRzIHNlcGFyYXRlZCBieSB7QGNvZGUgO30gaW5zdGVhZCBvZiB7QGNvZGUgLH0uCisgICAgICogICA8bGk+VW5uZWNlc3NhcnkgYXJyYXkgc2VwYXJhdG9ycy4gVGhlc2UgYXJlIGludGVycHJldGVkIGFzIGlmIG51bGwKKyAgICAgKiAgICAgICB3YXMgdGhlIG9taXR0ZWQgdmFsdWUuCisgICAgICogICA8bGk+TmFtZXMgYW5kIHZhbHVlcyBzZXBhcmF0ZWQgYnkge0Bjb2RlID19IG9yIHtAY29kZSA9Pn0gaW5zdGVhZCBvZgorICAgICAqICAgICAgIHtAY29kZSA6fS4KKyAgICAgKiAgIDxsaT5OYW1lL3ZhbHVlIHBhaXJzIHNlcGFyYXRlZCBieSB7QGNvZGUgO30gaW5zdGVhZCBvZiB7QGNvZGUgLH0uCisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMZW5pZW50KGJvb2xlYW4gbGVuaWVudCkgeworICAgICAgICB0aGlzLmxlbmllbnQgPSBsZW5pZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN1bWVzIHRoZSBuZXh0IHRva2VuIGZyb20gdGhlIEpTT04gc3RyZWFtIGFuZCBhc3NlcnRzIHRoYXQgaXQgaXMgdGhlCisgICAgICogYmVnaW5uaW5nIG9mIGEgbmV3IGFycmF5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZ2luQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleHBlY3QoSnNvblRva2VuLkJFR0lOX0FSUkFZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdW1lcyB0aGUgbmV4dCB0b2tlbiBmcm9tIHRoZSBKU09OIHN0cmVhbSBhbmQgYXNzZXJ0cyB0aGF0IGl0IGlzIHRoZQorICAgICAqIGVuZCBvZiB0aGUgY3VycmVudCBhcnJheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmRBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdChKc29uVG9rZW4uRU5EX0FSUkFZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdW1lcyB0aGUgbmV4dCB0b2tlbiBmcm9tIHRoZSBKU09OIHN0cmVhbSBhbmQgYXNzZXJ0cyB0aGF0IGl0IGlzIHRoZQorICAgICAqIGJlZ2lubmluZyBvZiBhIG5ldyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmVnaW5PYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleHBlY3QoSnNvblRva2VuLkJFR0lOX09CSkVDVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3VtZXMgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgSlNPTiBzdHJlYW0gYW5kIGFzc2VydHMgdGhhdCBpdCBpcyB0aGUKKyAgICAgKiBlbmQgb2YgdGhlIGN1cnJlbnQgYXJyYXkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kT2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0KEpzb25Ub2tlbi5FTkRfT0JKRUNUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdW1lcyB7QGNvZGUgZXhwZWN0ZWR9LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBleHBlY3QoSnNvblRva2VuIGV4cGVjdGVkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBxdWlja1BlZWsoKTsKKyAgICAgICAgaWYgKHRva2VuICE9IGV4cGVjdGVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCAiICsgZXhwZWN0ZWQgKyAiIGJ1dCB3YXMgIiArIHBlZWsoKSk7CisgICAgICAgIH0KKyAgICAgICAgYWR2YW5jZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBhcnJheSBvciBvYmplY3QgaGFzIGFub3RoZXIgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcXVpY2tQZWVrKCk7CisgICAgICAgIHJldHVybiB0b2tlbiAhPSBKc29uVG9rZW4uRU5EX09CSkVDVCAmJiB0b2tlbiAhPSBKc29uVG9rZW4uRU5EX0FSUkFZOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG5leHQgdG9rZW4gd2l0aG91dCBjb25zdW1pbmcgaXQuCisgICAgICovCisgICAgcHVibGljIEpzb25Ub2tlbiBwZWVrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcXVpY2tQZWVrKCk7CisKKyAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKKyAgICAgICAgICAgIGRlY29kZUxpdGVyYWwoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIHRoYXQgYSB0b2tlbiBpcyByZWFkeS4gQWZ0ZXIgdGhpcyBjYWxsIGVpdGhlciB7QGNvZGUgdG9rZW59IG9yCisgICAgICoge0Bjb2RlIHZhbHVlfSB3aWxsIGJlIG5vbi1udWxsLiBUbyBlbnN1cmUge0Bjb2RlIHRva2VufSBoYXMgYSBkZWZpbml0aXZlCisgICAgICogdmFsdWUsIHVzZSB7QGxpbmsgI3BlZWsoKX0KKyAgICAgKi8KKyAgICBwcml2YXRlIEpzb25Ub2tlbiBxdWlja1BlZWsoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoaGFzVG9rZW4pIHsKKyAgICAgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAocGVla1N0YWNrKCkpIHsKKyAgICAgICAgICAgIGNhc2UgRU1QVFlfRE9DVU1FTlQ6CisgICAgICAgICAgICAgICAgcmVwbGFjZVRvcChKc29uU2NvcGUuTk9ORU1QVFlfRE9DVU1FTlQpOworICAgICAgICAgICAgICAgIEpzb25Ub2tlbiBmaXJzdFRva2VuID0gbmV4dFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKHRva2VuICE9IEpzb25Ub2tlbi5CRUdJTl9BUlJBWSAmJiB0b2tlbiAhPSBKc29uVG9rZW4uQkVHSU5fT0JKRUNUKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgSlNPTiBkb2N1bWVudCB0byBzdGFydCB3aXRoICdbJyBvciAneycgYnV0IHdhcyAiICsgdG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3RUb2tlbjsKKyAgICAgICAgICAgIGNhc2UgRU1QVFlfQVJSQVk6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRJbkFycmF5KHRydWUpOworICAgICAgICAgICAgY2FzZSBOT05FTVBUWV9BUlJBWToKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dEluQXJyYXkoZmFsc2UpOworICAgICAgICAgICAgY2FzZSBFTVBUWV9PQkpFQ1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRJbk9iamVjdCh0cnVlKTsKKyAgICAgICAgICAgIGNhc2UgREFOR0xJTkdfTkFNRToKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0VmFsdWUoKTsKKyAgICAgICAgICAgIGNhc2UgTk9ORU1QVFlfT0JKRUNUOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXh0SW5PYmplY3QoZmFsc2UpOworICAgICAgICAgICAgY2FzZSBOT05FTVBUWV9ET0NVTUVOVDoKKyAgICAgICAgICAgICAgICBoYXNUb2tlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gSnNvblRva2VuLkVORF9ET0NVTUVOVDsKKyAgICAgICAgICAgIGNhc2UgQ0xPU0VEOgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkpzb25SZWFkZXIgaXMgY2xvc2VkIik7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWR2YW5jZXMgdGhlIGN1cnNvciBpbiB0aGUgSlNPTiBzdHJlYW0gdG8gdGhlIG5leHQgdG9rZW4uCisgICAgICovCisgICAgcHJpdmF0ZSBKc29uVG9rZW4gYWR2YW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHF1aWNrUGVlaygpOworCisgICAgICAgIEpzb25Ub2tlbiByZXN1bHQgPSB0b2tlbjsKKyAgICAgICAgaGFzVG9rZW4gPSBmYWxzZTsKKyAgICAgICAgdG9rZW4gPSBudWxsOworICAgICAgICB2YWx1ZSA9IG51bGw7CisgICAgICAgIG5hbWUgPSBudWxsOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgdG9rZW4sIGEge0BsaW5rIEpzb25Ub2tlbiNOQU1FIHByb3BlcnR5IG5hbWV9LCBhbmQKKyAgICAgKiBjb25zdW1lcyBpdC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIG5leHQgdG9rZW4gaW4gdGhlIHN0cmVhbSBpcyBub3QgYSBwcm9wZXJ0eQorICAgICAqICAgICBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbmV4dE5hbWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBxdWlja1BlZWsoKTsKKyAgICAgICAgaWYgKHRva2VuICE9IEpzb25Ub2tlbi5OQU1FKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBhIG5hbWUgYnV0IHdhcyAiICsgcGVlaygpKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbmFtZTsKKyAgICAgICAgYWR2YW5jZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBKc29uVG9rZW4jU1RSSU5HIHN0cmluZ30gdmFsdWUgb2YgdGhlIG5leHQgdG9rZW4sCisgICAgICogY29uc3VtaW5nIGl0LiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIG51bWJlciwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gaXRzCisgICAgICogc3RyaW5nIGZvcm0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgbmV4dCB0b2tlbiBpcyBub3QgYSBzdHJpbmcgb3IgaWYKKyAgICAgKiAgICAgdGhpcyByZWFkZXIgaXMgY2xvc2VkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbmV4dFN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHBlZWsoKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgKHRva2VuICE9IEpzb25Ub2tlbi5TVFJJTkcgJiYgdG9rZW4gIT0gSnNvblRva2VuLk5VTUJFUikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIGEgc3RyaW5nIGJ1dCB3YXMgIiArIHBlZWsoKSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdmFsdWU7CisgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSnNvblRva2VuI0JPT0xFQU4gYm9vbGVhbn0gdmFsdWUgb2YgdGhlIG5leHQgdG9rZW4sCisgICAgICogY29uc3VtaW5nIGl0LgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIG5leHQgdG9rZW4gaXMgbm90IGEgYm9vbGVhbiBvciBpZgorICAgICAqICAgICB0aGlzIHJlYWRlciBpcyBjbG9zZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbmV4dEJvb2xlYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBxdWlja1BlZWsoKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdG9rZW4gPT0gSnNvblRva2VuLlNUUklORykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXhwZWN0ZWQgYSBib29sZWFuIGJ1dCB3YXMgIiArIHBlZWsoKSk7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIHJlc3VsdDsKKyAgICAgICAgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJmYWxzZSIpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vdCBhIGJvb2xlYW46ICIgKyB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBhZHZhbmNlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3VtZXMgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgSlNPTiBzdHJlYW0gYW5kIGFzc2VydHMgdGhhdCBpdCBpcyBhCisgICAgICogbGl0ZXJhbCBudWxsLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIG5leHQgdG9rZW4gaXMgbm90IG51bGwgb3IgaWYgdGhpcworICAgICAqICAgICByZWFkZXIgaXMgY2xvc2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG5leHROdWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcXVpY2tQZWVrKCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHRva2VuID09IEpzb25Ub2tlbi5TVFJJTkcpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIG51bGwgYnV0IHdhcyAiICsgcGVlaygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgibnVsbCIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3QgYSBudWxsOiAiICsgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgYWR2YW5jZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBKc29uVG9rZW4jTlVNQkVSIGRvdWJsZX0gdmFsdWUgb2YgdGhlIG5leHQgdG9rZW4sCisgICAgICogY29uc3VtaW5nIGl0LiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIHN0cmluZywgdGhpcyBtZXRob2Qgd2lsbCBhdHRlbXB0IHRvCisgICAgICogcGFyc2UgaXQgYXMgYSBkb3VibGUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgbmV4dCB0b2tlbiBpcyBub3QgYSBsaXRlcmFsIHZhbHVlLgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBuZXh0IGxpdGVyYWwgdmFsdWUgY2Fubm90IGJlIHBhcnNlZAorICAgICAqICAgICBhcyBhIGRvdWJsZSwgb3IgaXMgbm9uLWZpbml0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZG91YmxlIG5leHREb3VibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBxdWlja1BlZWsoKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIGEgZG91YmxlIGJ1dCB3YXMgIiArIHBlZWsoKSk7CisgICAgICAgIH0KKworICAgICAgICBkb3VibGUgcmVzdWx0ID0gRG91YmxlLnBhcnNlRG91YmxlKHZhbHVlKTsKKworICAgICAgICBpZiAoKHJlc3VsdCA+PSAxLjBkICYmIHZhbHVlLnN0YXJ0c1dpdGgoIjAiKSkKKyAgICAgICAgICAgICAgICB8fCBEb3VibGUuaXNOYU4ocmVzdWx0KQorICAgICAgICAgICAgICAgIHx8IERvdWJsZS5pc0luZmluaXRlKHJlc3VsdCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJKU09OIGZvcmJpZHMgb2N0YWwgcHJlZml4ZXMsIE5hTiBhbmQgaW5maW5pdGllczogIiArIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSnNvblRva2VuI05VTUJFUiBsb25nfSB2YWx1ZSBvZiB0aGUgbmV4dCB0b2tlbiwKKyAgICAgKiBjb25zdW1pbmcgaXQuIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgc3RyaW5nLCB0aGlzIG1ldGhvZCB3aWxsIGF0dGVtcHQgdG8KKyAgICAgKiBwYXJzZSBpdCBhcyBhIGxvbmcuIElmIHRoZSBuZXh0IHRva2VuJ3MgbnVtZXJpYyB2YWx1ZSBjYW5ub3QgYmUgZXhhY3RseQorICAgICAqIHJlcHJlc2VudGVkIGJ5IGEgSmF2YSB7QGNvZGUgbG9uZ30sIHRoaXMgbWV0aG9kIHRocm93cy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBuZXh0IHRva2VuIGlzIG5vdCBhIGxpdGVyYWwgdmFsdWUuCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWYgdGhlIG5leHQgbGl0ZXJhbCB2YWx1ZSBjYW5ub3QgYmUgcGFyc2VkCisgICAgICogICAgIGFzIGEgbnVtYmVyLCBvciBleGFjdGx5IHJlcHJlc2VudGVkIGFzIGEgbG9uZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBuZXh0TG9uZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHF1aWNrUGVlaygpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXhwZWN0ZWQgYSBsb25nIGJ1dCB3YXMgIiArIHBlZWsoKSk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHJlc3VsdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3VsdCA9IExvbmcucGFyc2VMb25nKHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICAgIGRvdWJsZSBhc0RvdWJsZSA9IERvdWJsZS5wYXJzZURvdWJsZSh2YWx1ZSk7IC8vIGRvbid0IGNhdGNoIHRoaXMgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCisgICAgICAgICAgICByZXN1bHQgPSAobG9uZykgYXNEb3VibGU7CisgICAgICAgICAgICBpZiAoKGRvdWJsZSkgcmVzdWx0ICE9IGFzRG91YmxlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbih2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzdWx0ID49IDFMICYmIHZhbHVlLnN0YXJ0c1dpdGgoIjAiKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigiSlNPTiBmb3JiaWRzIG9jdGFsIHByZWZpeGVzOiAiICsgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgYWR2YW5jZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBKc29uVG9rZW4jTlVNQkVSIGludH0gdmFsdWUgb2YgdGhlIG5leHQgdG9rZW4sCisgICAgICogY29uc3VtaW5nIGl0LiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIHN0cmluZywgdGhpcyBtZXRob2Qgd2lsbCBhdHRlbXB0IHRvCisgICAgICogcGFyc2UgaXQgYXMgYW4gaW50LiBJZiB0aGUgbmV4dCB0b2tlbidzIG51bWVyaWMgdmFsdWUgY2Fubm90IGJlIGV4YWN0bHkKKyAgICAgKiByZXByZXNlbnRlZCBieSBhIEphdmEge0Bjb2RlIGludH0sIHRoaXMgbWV0aG9kIHRocm93cy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBuZXh0IHRva2VuIGlzIG5vdCBhIGxpdGVyYWwgdmFsdWUuCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWYgdGhlIG5leHQgbGl0ZXJhbCB2YWx1ZSBjYW5ub3QgYmUgcGFyc2VkCisgICAgICogICAgIGFzIGEgbnVtYmVyLCBvciBleGFjdGx5IHJlcHJlc2VudGVkIGFzIGFuIGludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG5leHRJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBxdWlja1BlZWsoKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIGFuIGludCBidXQgd2FzICIgKyBwZWVrKCkpOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJlc3VsdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3VsdCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgZG91YmxlIGFzRG91YmxlID0gRG91YmxlLnBhcnNlRG91YmxlKHZhbHVlKTsgLy8gZG9uJ3QgY2F0Y2ggdGhpcyBOdW1iZXJGb3JtYXRFeGNlcHRpb24KKyAgICAgICAgICAgIHJlc3VsdCA9IChpbnQpIGFzRG91YmxlOworICAgICAgICAgICAgaWYgKChkb3VibGUpIHJlc3VsdCAhPSBhc0RvdWJsZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24odmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdCA+PSAxTCAmJiB2YWx1ZS5zdGFydHNXaXRoKCIwIikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oIkpTT04gZm9yYmlkcyBvY3RhbCBwcmVmaXhlczogIiArIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhpcyBKU09OIHJlYWRlciBhbmQgdGhlIHVuZGVybHlpbmcge0BsaW5rIFJlYWRlcn0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBoYXNUb2tlbiA9IGZhbHNlOworICAgICAgICB2YWx1ZSA9IG51bGw7CisgICAgICAgIHRva2VuID0gbnVsbDsKKyAgICAgICAgc3RhY2suY2xlYXIoKTsKKyAgICAgICAgc3RhY2suYWRkKEpzb25TY29wZS5DTE9TRUQpOworICAgICAgICBpbi5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNraXBzIHRoZSBuZXh0IHZhbHVlIHJlY3Vyc2l2ZWx5LiBJZiBpdCBpcyBhbiBvYmplY3Qgb3IgYXJyYXksIGFsbCBuZXN0ZWQKKyAgICAgKiBlbGVtZW50cyBhcmUgc2tpcHBlZC4gVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aGVuIHRoZSBKU09OIHRva2VuCisgICAgICogc3RyZWFtIGNvbnRhaW5zIHVucmVjb2duaXplZCBvciB1bmhhbmRsZWQgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNraXBWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHNraXBwaW5nID0gdHJ1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgSnNvblRva2VuIHRva2VuID0gYWR2YW5jZSgpOworICAgICAgICAgICAgICAgIGlmICh0b2tlbiA9PSBKc29uVG9rZW4uQkVHSU5fQVJSQVkgfHwgdG9rZW4gPT0gSnNvblRva2VuLkJFR0lOX09CSkVDVCkgeworICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT0gSnNvblRva2VuLkVORF9BUlJBWSB8fCB0b2tlbiA9PSBKc29uVG9rZW4uRU5EX09CSkVDVCkgeworICAgICAgICAgICAgICAgICAgICBjb3VudC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKGNvdW50ICE9IDApOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc2tpcHBpbmcgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgSnNvblNjb3BlIHBlZWtTdGFjaygpIHsKKyAgICAgICAgcmV0dXJuIHN0YWNrLmdldChzdGFjay5zaXplKCkgLSAxKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEpzb25TY29wZSBwb3AoKSB7CisgICAgICAgIHJldHVybiBzdGFjay5yZW1vdmUoc3RhY2suc2l6ZSgpIC0gMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHB1c2goSnNvblNjb3BlIG5ld1RvcCkgeworICAgICAgICBzdGFjay5hZGQobmV3VG9wKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlIHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjayB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVwbGFjZVRvcChKc29uU2NvcGUgbmV3VG9wKSB7CisgICAgICAgIHN0YWNrLnNldChzdGFjay5zaXplKCkgLSAxLCBuZXdUb3ApOworICAgIH0KKworICAgIHByaXZhdGUgSnNvblRva2VuIG5leHRJbkFycmF5KGJvb2xlYW4gZmlyc3RFbGVtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZmlyc3RFbGVtZW50KSB7CisgICAgICAgICAgICByZXBsYWNlVG9wKEpzb25TY29wZS5OT05FTVBUWV9BUlJBWSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBMb29rIGZvciBhIGNvbW1hIGJlZm9yZSBlYWNoIGVsZW1lbnQgYWZ0ZXIgdGhlIGZpcnN0IGVsZW1lbnQuICovCisgICAgICAgICAgICBzd2l0Y2ggKG5leHROb25XaGl0ZXNwYWNlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlICddJzoKKyAgICAgICAgICAgICAgICAgICAgcG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gSnNvblRva2VuLkVORF9BUlJBWTsKKyAgICAgICAgICAgICAgICBjYXNlICc7JzoKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tMZW5pZW50KCk7IC8vIGZhbGwtdGhyb3VnaAorICAgICAgICAgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBzeW50YXhFcnJvcigiVW50ZXJtaW5hdGVkIGFycmF5Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG5leHROb25XaGl0ZXNwYWNlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgJ10nOgorICAgICAgICAgICAgICAgIGlmIChmaXJzdEVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gSnNvblRva2VuLkVORF9BUlJBWTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoIHRvIGhhbmRsZSAiLF0iCisgICAgICAgICAgICBjYXNlICc7JzoKKyAgICAgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgICAgIC8qIEluIGxlbmllbnQgbW9kZSwgYSAwLWxlbmd0aCBsaXRlcmFsIG1lYW5zICdudWxsJyAqLworICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOworICAgICAgICAgICAgICAgIHBvcy0tOworICAgICAgICAgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICJudWxsIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSBKc29uVG9rZW4uTlVMTDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRWYWx1ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBKc29uVG9rZW4gbmV4dEluT2JqZWN0KGJvb2xlYW4gZmlyc3RFbGVtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvKgorICAgICAgICAgKiBSZWFkIGRlbGltaXRlcnMuIEVpdGhlciBhIGNvbW1hL3NlbWljb2xvbiBzZXBhcmF0aW5nIHRoaXMgYW5kIHRoZQorICAgICAgICAgKiBwcmV2aW91cyBuYW1lLXZhbHVlIHBhaXIsIG9yIGEgY2xvc2UgYnJhY2UgdG8gZGVub3RlIHRoZSBlbmQgb2YgdGhlCisgICAgICAgICAqIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChmaXJzdEVsZW1lbnQpIHsKKyAgICAgICAgICAgIC8qIFBlZWsgdG8gc2VlIGlmIHRoaXMgaXMgdGhlIGVtcHR5IG9iamVjdC4gKi8KKyAgICAgICAgICAgIHN3aXRjaCAobmV4dE5vbldoaXRlc3BhY2UoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgJ30nOgorICAgICAgICAgICAgICAgICAgICBwb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgaGFzVG9rZW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSBKc29uVG9rZW4uRU5EX09CSkVDVDsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBwb3MtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAobmV4dE5vbldoaXRlc3BhY2UoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgJ30nOgorICAgICAgICAgICAgICAgICAgICBwb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgaGFzVG9rZW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSBKc29uVG9rZW4uRU5EX09CSkVDVDsKKyAgICAgICAgICAgICAgICBjYXNlICc7JzoKKyAgICAgICAgICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIlVudGVybWluYXRlZCBvYmplY3QiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIFJlYWQgdGhlIG5hbWUuICovCisgICAgICAgIGludCBxdW90ZSA9IG5leHROb25XaGl0ZXNwYWNlKCk7CisgICAgICAgIHN3aXRjaCAocXVvdGUpIHsKKyAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgICAgICBjaGVja0xlbmllbnQoKTsgLy8gZmFsbC10aHJvdWdoCisgICAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgICAgICBuYW1lID0gbmV4dFN0cmluZygoY2hhcikgcXVvdGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBjaGVja0xlbmllbnQoKTsKKyAgICAgICAgICAgICAgICBwb3MtLTsKKyAgICAgICAgICAgICAgICBuYW1lID0gbmV4dExpdGVyYWwoKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIkV4cGVjdGVkIG5hbWUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXBsYWNlVG9wKEpzb25TY29wZS5EQU5HTElOR19OQU1FKTsKKyAgICAgICAgaGFzVG9rZW4gPSB0cnVlOworICAgICAgICByZXR1cm4gdG9rZW4gPSBKc29uVG9rZW4uTkFNRTsKKyAgICB9CisKKyAgICBwcml2YXRlIEpzb25Ub2tlbiBvYmplY3RWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8qCisgICAgICAgICAqIFJlYWQgdGhlIG5hbWUvdmFsdWUgc2VwYXJhdG9yLiBVc3VhbGx5IGEgY29sb24gJzonLiBJbiBsZW5pZW50IG1vZGUKKyAgICAgICAgICogd2UgYWxzbyBhY2NlcHQgYW4gZXF1YWxzIHNpZ24gJz0nLCBvciBhbiBhcnJvdyAiPT4iLgorICAgICAgICAgKi8KKyAgICAgICAgc3dpdGNoIChuZXh0Tm9uV2hpdGVzcGFjZSgpKSB7CisgICAgICAgICAgICBjYXNlICc6JzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJz0nOgorICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOworICAgICAgICAgICAgICAgIGlmICgocG9zIDwgbGltaXQgfHwgZmlsbEJ1ZmZlcigxKSkgJiYgYnVmZmVyW3Bvc10gPT0gJz4nKSB7CisgICAgICAgICAgICAgICAgICAgIHBvcysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIkV4cGVjdGVkICc6JyIpOworICAgICAgICB9CisKKyAgICAgICAgcmVwbGFjZVRvcChKc29uU2NvcGUuTk9ORU1QVFlfT0JKRUNUKTsKKyAgICAgICAgcmV0dXJuIG5leHRWYWx1ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgSnNvblRva2VuIG5leHRWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBjID0gbmV4dE5vbldoaXRlc3BhY2UoKTsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICd7JzoKKyAgICAgICAgICAgICAgICBwdXNoKEpzb25TY29wZS5FTVBUWV9PQkpFQ1QpOworICAgICAgICAgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSBKc29uVG9rZW4uQkVHSU5fT0JKRUNUOworCisgICAgICAgICAgICBjYXNlICdbJzoKKyAgICAgICAgICAgICAgICBwdXNoKEpzb25TY29wZS5FTVBUWV9BUlJBWSk7CisgICAgICAgICAgICAgICAgaGFzVG9rZW4gPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IEpzb25Ub2tlbi5CRUdJTl9BUlJBWTsKKworICAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOyAvLyBmYWxsLXRocm91Z2gKKyAgICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgICAgIHZhbHVlID0gbmV4dFN0cmluZygoY2hhcikgYyk7CisgICAgICAgICAgICAgICAgaGFzVG9rZW4gPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IEpzb25Ub2tlbi5TVFJJTkc7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRMaXRlcmFsKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgb25jZSB7QGNvZGUgbGltaXQgLSBwb3MgPj0gbWluaW11bX0uIElmIHRoZSBkYXRhIGlzCisgICAgICogZXhoYXVzdGVkIGJlZm9yZSB0aGF0IG1hbnkgY2hhcmFjdGVycyBhcmUgYXZhaWxhYmxlLCB0aGlzIHJldHVybnMKKyAgICAgKiBmYWxzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZmlsbEJ1ZmZlcihpbnQgbWluaW11bSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGxpbWl0ICE9IHBvcykgeworICAgICAgICAgICAgbGltaXQgLT0gcG9zOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIHBvcywgYnVmZmVyLCAwLCBsaW1pdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsaW1pdCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwb3MgPSAwOworICAgICAgICBpbnQgdG90YWw7CisgICAgICAgIHdoaWxlICgodG90YWwgPSBpbi5yZWFkKGJ1ZmZlciwgbGltaXQsIGJ1ZmZlci5sZW5ndGggLSBsaW1pdCkpICE9IC0xKSB7CisgICAgICAgICAgICBsaW1pdCArPSB0b3RhbDsKKyAgICAgICAgICAgIGlmIChsaW1pdCA+PSBtaW5pbXVtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgaW50IG5leHROb25XaGl0ZXNwYWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd2hpbGUgKHBvcyA8IGxpbWl0IHx8IGZpbGxCdWZmZXIoMSkpIHsKKyAgICAgICAgICAgIGludCBjID0gYnVmZmVyW3BvcysrXTsKKyAgICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgICAgICAgICBpZiAocG9zID09IGxpbWl0ICYmICFmaWxsQnVmZmVyKDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOworICAgICAgICAgICAgICAgICAgICBjaGFyIHBlZWsgPSBidWZmZXJbcG9zXTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwZWVrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcqJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGEgLyogYy1zdHlsZSBjb21tZW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFza2lwVG8oIiovIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIlVudGVybWluYXRlZCBjb21tZW50Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGEgLy8gZW5kLW9mLWxpbmUgY29tbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBUb0VuZE9mTGluZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlICcjJzoKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogU2tpcCBhICMgaGFzaCBlbmQtb2YtbGluZSBjb21tZW50LiBUaGUgSlNPTiBSRkMgZG9lc24ndAorICAgICAgICAgICAgICAgICAgICAgKiBzcGVjaWZ5IHRoaXMgYmVoYXZpb3VyLCBidXQgaXQncyByZXF1aXJlZCB0byBwYXJzZQorICAgICAgICAgICAgICAgICAgICAgKiBleGlzdGluZyBkb2N1bWVudHMuIFNlZSBodHRwOi8vYi8yNTcxNDIzLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgY2hlY2tMZW5pZW50KCk7CisgICAgICAgICAgICAgICAgICAgIHNraXBUb0VuZE9mTGluZSgpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIkVuZCBvZiBpbnB1dCIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0xlbmllbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIWxlbmllbnQpIHsKKyAgICAgICAgICAgIHRocm93IHN5bnRheEVycm9yKCJVc2UgSnNvblJlYWRlci5zZXRMZW5pZW50KHRydWUpIHRvIGFjY2VwdCBtYWxmb3JtZWQgSlNPTiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWR2YW5jZXMgdGhlIHBvc2l0aW9uIHVudGlsIGFmdGVyIHRoZSBuZXh0IG5ld2xpbmUgY2hhcmFjdGVyLiBJZiB0aGUgbGluZQorICAgICAqIGlzIHRlcm1pbmF0ZWQgYnkgIlxyXG4iLCB0aGUgJ1xuJyBtdXN0IGJlIGNvbnN1bWVkIGFzIHdoaXRlc3BhY2UgYnkgdGhlCisgICAgICogY2FsbGVyLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBza2lwVG9FbmRPZkxpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3aGlsZSAocG9zIDwgbGltaXQgfHwgZmlsbEJ1ZmZlcigxKSkgeworICAgICAgICAgICAgY2hhciBjID0gYnVmZmVyW3BvcysrXTsKKyAgICAgICAgICAgIGlmIChjID09ICdccicgfHwgYyA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2tpcFRvKFN0cmluZyB0b0ZpbmQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dGVyOgorICAgICAgICBmb3IgKDsgcG9zICsgdG9GaW5kLmxlbmd0aCgpIDwgbGltaXQgfHwgZmlsbEJ1ZmZlcih0b0ZpbmQubGVuZ3RoKCkpOyBwb3MrKykgeworICAgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCB0b0ZpbmQubGVuZ3RoKCk7IGMrKykgeworICAgICAgICAgICAgICAgIGlmIChidWZmZXJbcG9zICsgY10gIT0gdG9GaW5kLmNoYXJBdChjKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIHtAY29kZSBxdW90ZX0sIHVuZXNjYXBpbmcgYW55CisgICAgICogY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZXMgZW5jb3VudGVyZWQgYWxvbmcgdGhlIHdheS4gVGhlIG9wZW5pbmcgcXVvdGUKKyAgICAgKiBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZC4gVGhpcyBjb25zdW1lcyB0aGUgY2xvc2luZyBxdW90ZSwgYnV0IGRvZXMKKyAgICAgKiBub3QgaW5jbHVkZSBpdCBpbiB0aGUgcmV0dXJuZWQgc3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHF1b3RlIGVpdGhlciAnIG9yICIuCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWYgYW55IHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcyBhcmUKKyAgICAgKiAgICAgbWFsZm9ybWVkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5leHRTdHJpbmcoY2hhciBxdW90ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbnVsbDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgLyogdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgbm90IHlldCBhcHBlbmRlZCB0byB0aGUgYnVpbGRlci4gKi8KKyAgICAgICAgICAgIGludCBzdGFydCA9IHBvczsKKyAgICAgICAgICAgIHdoaWxlIChwb3MgPCBsaW1pdCkgeworICAgICAgICAgICAgICAgIGludCBjID0gYnVmZmVyW3BvcysrXTsKKworICAgICAgICAgICAgICAgIGlmIChjID09IHF1b3RlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChza2lwcGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJza2lwcGVkISI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnVpbGRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWZmZXIsIHN0YXJ0LCBwb3MgLSBzdGFydCAtIDEpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYnVmZmVyLCBzdGFydCwgcG9zIC0gc3RhcnQgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGJ1ZmZlciwgc3RhcnQsIHBvcyAtIHN0YXJ0IC0gMSk7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHJlYWRFc2NhcGVDaGFyYWN0ZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcG9zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJ1aWxkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYnVmZmVyLCBzdGFydCwgcG9zIC0gc3RhcnQpOworICAgICAgICB9IHdoaWxlIChmaWxsQnVmZmVyKDEpKTsKKworICAgICAgICB0aHJvdyBzeW50YXhFcnJvcigiVW50ZXJtaW5hdGVkIHN0cmluZyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyB1cCB0byBidXQgbm90IGluY2x1ZGluZyBhbnkgZGVsaW1pdGVyIGNoYXJhY3RlcnMuIFRoaXMKKyAgICAgKiBkb2VzIG5vdCBjb25zdW1lIHRoZSBkZWxpbWl0ZXIgY2hhcmFjdGVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5leHRMaXRlcmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbnVsbDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgLyogdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgbm90IHlldCBhcHBlbmRlZCB0byB0aGUgYnVpbGRlci4gKi8KKyAgICAgICAgICAgIGludCBzdGFydCA9IHBvczsKKyAgICAgICAgICAgIHdoaWxlIChwb3MgPCBsaW1pdCkgeworICAgICAgICAgICAgICAgIGludCBjID0gYnVmZmVyW3BvcysrXTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnOyc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJyMnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICc9JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOyAvLyBmYWxsLXRocm91Z2gKKworICAgICAgICAgICAgICAgICAgICBjYXNlICd7JzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnfSc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1snOgorICAgICAgICAgICAgICAgICAgICBjYXNlICddJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnOic6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdcZic6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2tpcHBpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInNraXBwZWQhIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnVpbGRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyLCBzdGFydCwgcG9zIC0gc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChidWZmZXIsIHN0YXJ0LCBwb3MgLSBzdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGJ1ZmZlciwgc3RhcnQsIHBvcyAtIHN0YXJ0KTsKKyAgICAgICAgfSB3aGlsZSAoZmlsbEJ1ZmZlcigxKSk7CisKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiBuZWFyICIgKyBnZXRTbmlwcGV0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5lc2NhcGVzIHRoZSBjaGFyYWN0ZXIgaWRlbnRpZmllZCBieSB0aGUgY2hhcmFjdGVyIG9yIGNoYXJhY3RlcnMgdGhhdAorICAgICAqIGltbWVkaWF0ZWx5IGZvbGxvdyBhIGJhY2tzbGFzaC4gVGhlIGJhY2tzbGFzaCAnXCcgc2hvdWxkIGhhdmUgYWxyZWFkeQorICAgICAqIGJlZW4gcmVhZC4gVGhpcyBzdXBwb3J0cyBib3RoIHVuaWNvZGUgZXNjYXBlcyAidTAwMEEiIGFuZCB0d28tY2hhcmFjdGVyCisgICAgICogZXNjYXBlcyAiXG4iLgorICAgICAqCisgICAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWYgYW55IHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcyBhcmUKKyAgICAgKiAgICAgbWFsZm9ybWVkLgorICAgICAqLworICAgIHByaXZhdGUgY2hhciByZWFkRXNjYXBlQ2hhcmFjdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHBvcyA9PSBsaW1pdCAmJiAhZmlsbEJ1ZmZlcigxKSkgeworICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIlVudGVybWluYXRlZCBlc2NhcGUgc2VxdWVuY2UiKTsKKyAgICAgICAgfQorCisgICAgICAgIGNoYXIgZXNjYXBlZCA9IGJ1ZmZlcltwb3MrK107CisgICAgICAgIHN3aXRjaCAoZXNjYXBlZCkgeworICAgICAgICAgICAgY2FzZSAndSc6CisgICAgICAgICAgICAgICAgaWYgKHBvcyArIDQgPiBsaW1pdCAmJiAhZmlsbEJ1ZmZlcig0KSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBzeW50YXhFcnJvcigiVW50ZXJtaW5hdGVkIGVzY2FwZSBzZXF1ZW5jZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgaGV4ID0gbmV3IFN0cmluZyhidWZmZXIsIHBvcywgNCk7CisgICAgICAgICAgICAgICAgcG9zICs9IDQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIChjaGFyKSBJbnRlZ2VyLnBhcnNlSW50KGhleCwgMTYpOworCisgICAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ1x0JzsKKworICAgICAgICAgICAgY2FzZSAnYic6CisgICAgICAgICAgICAgICAgcmV0dXJuICdcYic7CisKKyAgICAgICAgICAgIGNhc2UgJ24nOgorICAgICAgICAgICAgICAgIHJldHVybiAnXG4nOworCisgICAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ1xyJzsKKworICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICAgICAgcmV0dXJuICdcZic7CisKKyAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZXNjYXBlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgbnVsbCwgYm9vbGVhbiwgbnVtZXJpYyBvciB1bnF1b3RlZCBzdHJpbmcgbGl0ZXJhbCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEpzb25Ub2tlbiByZWFkTGl0ZXJhbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBsaXRlcmFsID0gbmV4dExpdGVyYWwoKTsKKyAgICAgICAgaWYgKGxpdGVyYWwuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBzeW50YXhFcnJvcigiRXhwZWN0ZWQgbGl0ZXJhbCB2YWx1ZSIpOworICAgICAgICB9CisgICAgICAgIHZhbHVlID0gbGl0ZXJhbDsKKyAgICAgICAgaGFzVG9rZW4gPSB0cnVlOworICAgICAgICByZXR1cm4gdG9rZW4gPSBudWxsOyAvLyB1c2UgZGVjb2RlTGl0ZXJhbCgpIHRvIGdldCB0aGUgdG9rZW4gdHlwZQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2lnbnMge0Bjb2RlIG5leHRUb2tlbn0gYmFzZWQgb24gdGhlIHZhbHVlIG9mIHtAY29kZSBuZXh0VmFsdWV9LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkZWNvZGVMaXRlcmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoIm51bGwiKSkgeworICAgICAgICAgICAgdG9rZW4gPSBKc29uVG9rZW4uTlVMTDsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgfHwgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgeworICAgICAgICAgICAgdG9rZW4gPSBKc29uVG9rZW4uQk9PTEVBTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRG91YmxlLnBhcnNlRG91YmxlKHZhbHVlKTsgLy8gdGhpcyB3b3JrIGNvdWxkIHBvdGVudGlhbGx5IGJlIGNhY2hlZAorICAgICAgICAgICAgICAgIHRva2VuID0gSnNvblRva2VuLk5VTUJFUjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBtdXN0IGJlIGFuIHVucXVvdGVkIHN0cmluZworICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOworICAgICAgICAgICAgICAgIHRva2VuID0gSnNvblRva2VuLlNUUklORzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRocm93cyBhIG5ldyBJTyBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgYSBjb250ZXh0IHNuaXBwZXQKKyAgICAgKiB3aXRoIHRoaXMgcmVhZGVyJ3MgY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSU9FeGNlcHRpb24gc3ludGF4RXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBKc29uU3ludGF4RXhjZXB0aW9uKG1lc3NhZ2UgKyAiIG5lYXIgIiArIGdldFNuaXBwZXQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgZ2V0U25pcHBldCgpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzbmlwcGV0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaW50IGJlZm9yZVBvcyA9IE1hdGgubWluKHBvcywgMjApOworICAgICAgICBzbmlwcGV0LmFwcGVuZChidWZmZXIsIHBvcyAtIGJlZm9yZVBvcywgYmVmb3JlUG9zKTsKKyAgICAgICAgaW50IGFmdGVyUG9zID0gTWF0aC5taW4obGltaXQgLSBwb3MsIDIwKTsKKyAgICAgICAgc25pcHBldC5hcHBlbmQoYnVmZmVyLCBwb3MsIGFmdGVyUG9zKTsKKyAgICAgICAgcmV0dXJuIHNuaXBwZXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSnNvblN5bnRheEV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBKc29uU3ludGF4RXhjZXB0aW9uKFN0cmluZyBzKSB7CisgICAgICAgICAgICBzdXBlcihzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvblNjb3BlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25TY29wZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNTM0ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25TY29wZS5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudXRpbDsKKworLyoqCisgKiBMZXhpY2FsIHNjb3BpbmcgZWxlbWVudHMgd2l0aGluIGEgSlNPTiByZWFkZXIgb3Igd3JpdGVyLgorICovCitlbnVtIEpzb25TY29wZSB7CisKKyAgICAvKioKKyAgICAgKiBBbiBhcnJheSB3aXRoIG5vIGVsZW1lbnRzIHJlcXVpcmVzIG5vIHNlcGFyYXRvcnMgb3IgbmV3bGluZXMgYmVmb3JlCisgICAgICogaXQgaXMgY2xvc2VkLgorICAgICAqLworICAgIEVNUFRZX0FSUkFZLAorCisgICAgLyoqCisgICAgICogQSBhcnJheSB3aXRoIGF0IGxlYXN0IG9uZSB2YWx1ZSByZXF1aXJlcyBhIGNvbW1hIGFuZCBuZXdsaW5lIGJlZm9yZQorICAgICAqIHRoZSBuZXh0IGVsZW1lbnQuCisgICAgICovCisgICAgTk9ORU1QVFlfQVJSQVksCisKKyAgICAvKioKKyAgICAgKiBBbiBvYmplY3Qgd2l0aCBubyBuYW1lL3ZhbHVlIHBhaXJzIHJlcXVpcmVzIG5vIHNlcGFyYXRvcnMgb3IgbmV3bGluZXMKKyAgICAgKiBiZWZvcmUgaXQgaXMgY2xvc2VkLgorICAgICAqLworICAgIEVNUFRZX09CSkVDVCwKKworICAgIC8qKgorICAgICAqIEFuIG9iamVjdCB3aG9zZSBtb3N0IHJlY2VudCBlbGVtZW50IGlzIGEga2V5LiBUaGUgbmV4dCBlbGVtZW50IG11c3QKKyAgICAgKiBiZSBhIHZhbHVlLgorICAgICAqLworICAgIERBTkdMSU5HX05BTUUsCisKKyAgICAvKioKKyAgICAgKiBBbiBvYmplY3Qgd2l0aCBhdCBsZWFzdCBvbmUgbmFtZS92YWx1ZSBwYWlyIHJlcXVpcmVzIGEgY29tbWEgYW5kCisgICAgICogbmV3bGluZSBiZWZvcmUgdGhlIG5leHQgZWxlbWVudC4KKyAgICAgKi8KKyAgICBOT05FTVBUWV9PQkpFQ1QsCisKKyAgICAvKioKKyAgICAgKiBObyBvYmplY3Qgb3IgYXJyYXkgaGFzIGJlZW4gc3RhcnRlZC4KKyAgICAgKi8KKyAgICBFTVBUWV9ET0NVTUVOVCwKKworICAgIC8qKgorICAgICAqIEEgZG9jdW1lbnQgd2l0aCBhdCBhbiBhcnJheSBvciBvYmplY3QuCisgICAgICovCisgICAgTk9ORU1QVFlfRE9DVU1FTlQsCisKKyAgICAvKioKKyAgICAgKiBBIGRvY3VtZW50IHRoYXQncyBiZWVuIGNsb3NlZCBhbmQgY2Fubm90IGJlIGFjY2Vzc2VkLgorICAgICAqLworICAgIENMT1NFRCwKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvblRva2VuLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25Ub2tlbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YmM2Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25Ub2tlbi5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudXRpbDsKKworLyoqCisgKiBBIHN0cnVjdHVyZSwgbmFtZSBvciB2YWx1ZSB0eXBlIGluIGEgSlNPTi1lbmNvZGVkIHN0cmluZy4KKyAqLworcHVibGljIGVudW0gSnNvblRva2VuIHsKKworICAgIC8qKgorICAgICAqIFRoZSBvcGVuaW5nIG9mIGEgSlNPTiBhcnJheS4gV3JpdHRlbiB1c2luZyB7QGxpbmsgSnNvbldyaXRlciNiZWdpbk9iamVjdH0KKyAgICAgKiBhbmQgcmVhZCB1c2luZyB7QGxpbmsgSnNvblJlYWRlciNiZWdpbk9iamVjdH0uCisgICAgICovCisgICAgQkVHSU5fQVJSQVksCisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xvc2luZyBvZiBhIEpTT04gYXJyYXkuIFdyaXR0ZW4gdXNpbmcge0BsaW5rIEpzb25Xcml0ZXIjZW5kQXJyYXl9CisgICAgICogYW5kIHJlYWQgdXNpbmcge0BsaW5rIEpzb25SZWFkZXIjZW5kQXJyYXl9LgorICAgICAqLworICAgIEVORF9BUlJBWSwKKworICAgIC8qKgorICAgICAqIFRoZSBvcGVuaW5nIG9mIGEgSlNPTiBvYmplY3QuIFdyaXR0ZW4gdXNpbmcge0BsaW5rIEpzb25Xcml0ZXIjYmVnaW5PYmplY3R9CisgICAgICogYW5kIHJlYWQgdXNpbmcge0BsaW5rIEpzb25SZWFkZXIjYmVnaW5PYmplY3R9LgorICAgICAqLworICAgIEJFR0lOX09CSkVDVCwKKworICAgIC8qKgorICAgICAqIFRoZSBjbG9zaW5nIG9mIGEgSlNPTiBvYmplY3QuIFdyaXR0ZW4gdXNpbmcge0BsaW5rIEpzb25Xcml0ZXIjZW5kT2JqZWN0fQorICAgICAqIGFuZCByZWFkIHVzaW5nIHtAbGluayBKc29uUmVhZGVyI2VuZE9iamVjdH0uCisgICAgICovCisgICAgRU5EX09CSkVDVCwKKworICAgIC8qKgorICAgICAqIEEgSlNPTiBwcm9wZXJ0eSBuYW1lLiBXaXRoaW4gb2JqZWN0cywgdG9rZW5zIGFsdGVybmF0ZSBiZXR3ZWVuIG5hbWVzIGFuZAorICAgICAqIHRoZWlyIHZhbHVlcy4gV3JpdHRlbiB1c2luZyB7QGxpbmsgSnNvbldyaXRlciNuYW1lfSBhbmQgcmVhZCB1c2luZyB7QGxpbmsKKyAgICAgKiBKc29uUmVhZGVyI25leHROYW1lfQorICAgICAqLworICAgIE5BTUUsCisKKyAgICAvKioKKyAgICAgKiBBIEpTT04gc3RyaW5nLgorICAgICAqLworICAgIFNUUklORywKKworICAgIC8qKgorICAgICAqIEEgSlNPTiBudW1iZXIgcmVwcmVzZW50ZWQgaW4gdGhpcyBBUEkgYnkgYSBKYXZhIHtAY29kZSBkb3VibGV9LCB7QGNvZGUKKyAgICAgKiBsb25nfSwgb3Ige0Bjb2RlIGludH0uCisgICAgICovCisgICAgTlVNQkVSLAorCisgICAgLyoqCisgICAgICogQSBKU09OIHtAY29kZSB0cnVlfSBvciB7QGNvZGUgZmFsc2V9LgorICAgICAqLworICAgIEJPT0xFQU4sCisKKyAgICAvKioKKyAgICAgKiBBIEpTT04ge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIE5VTEwsCisKKyAgICAvKioKKyAgICAgKiBUaGUgZW5kIG9mIHRoZSBKU09OIHN0cmVhbS4gVGhpcyBzZW50aW5lbCB2YWx1ZSBpcyByZXR1cm5lZCBieSB7QGxpbmsKKyAgICAgKiBKc29uUmVhZGVyI3BlZWsoKX0gdG8gc2lnbmFsIHRoYXQgdGhlIEpTT04tZW5jb2RlZCB2YWx1ZSBoYXMgbm8gbW9yZQorICAgICAqIHRva2Vucy4KKyAgICAgKi8KKyAgICBFTkRfRE9DVU1FTlQKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvbldyaXRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Kc29uV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVjYzFjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvbldyaXRlci5qYXZhCkBAIC0wLDAgKzEsNDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogV3JpdGVzIGEgSlNPTiAoPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDYyNy50eHQiPlJGQyA0NjI3PC9hPikKKyAqIGVuY29kZWQgdmFsdWUgdG8gYSBzdHJlYW0sIG9uZSB0b2tlbiBhdCBhIHRpbWUuIFRoZSBzdHJlYW0gaW5jbHVkZXMgYm90aAorICogbGl0ZXJhbCB2YWx1ZXMgKHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zIGFuZCBudWxscykgYXMgd2VsbCBhcyB0aGUgYmVnaW4KKyAqIGFuZCBlbmQgZGVsaW1pdGVycyBvZiBvYmplY3RzIGFuZCBhcnJheXMuCisgKgorICogPGgzPkVuY29kaW5nIEpTT048L2gzPgorICogVG8gZW5jb2RlIHlvdXIgZGF0YSBhcyBKU09OLCBjcmVhdGUgYSBuZXcge0Bjb2RlIEpzb25Xcml0ZXJ9LiBFYWNoIEpTT04KKyAqIGRvY3VtZW50IG11c3QgY29udGFpbiBvbmUgdG9wLWxldmVsIGFycmF5IG9yIG9iamVjdC4gQ2FsbCBtZXRob2RzIG9uIHRoZQorICogd3JpdGVyIGFzIHlvdSB3YWxrIHRoZSBzdHJ1Y3R1cmUncyBjb250ZW50cywgbmVzdGluZyBhcnJheXMgYW5kIG9iamVjdHMgYXMKKyAqIG5lY2Vzc2FyeToKKyAqIDx1bD4KKyAqICAgPGxpPlRvIHdyaXRlIDxzdHJvbmc+YXJyYXlzPC9zdHJvbmc+LCBmaXJzdCBjYWxsIHtAbGluayAjYmVnaW5BcnJheSgpfS4KKyAqICAgICAgIFdyaXRlIGVhY2ggb2YgdGhlIGFycmF5J3MgZWxlbWVudHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUge0BsaW5rICN2YWx1ZX0KKyAqICAgICAgIG1ldGhvZHMgb3IgYnkgbmVzdGluZyBvdGhlciBhcnJheXMgYW5kIG9iamVjdHMuIEZpbmFsbHkgY2xvc2UgdGhlIGFycmF5CisgKiAgICAgICB1c2luZyB7QGxpbmsgI2VuZEFycmF5KCl9LgorICogICA8bGk+VG8gd3JpdGUgPHN0cm9uZz5vYmplY3RzPC9zdHJvbmc+LCBmaXJzdCBjYWxsIHtAbGluayAjYmVnaW5PYmplY3QoKX0uCisgKiAgICAgICBXcml0ZSBlYWNoIG9mIHRoZSBvYmplY3QncyBwcm9wZXJ0aWVzIGJ5IGFsdGVybmF0aW5nIGNhbGxzIHRvCisgKiAgICAgICB7QGxpbmsgI25hbWV9IHdpdGggdGhlIHByb3BlcnR5J3MgdmFsdWUuIFdyaXRlIHByb3BlcnR5IHZhbHVlcyB3aXRoIHRoZQorICogICAgICAgYXBwcm9wcmlhdGUge0BsaW5rICN2YWx1ZX0gbWV0aG9kIG9yIGJ5IG5lc3Rpbmcgb3RoZXIgb2JqZWN0cyBvciBhcnJheXMuCisgKiAgICAgICBGaW5hbGx5IGNsb3NlIHRoZSBvYmplY3QgdXNpbmcge0BsaW5rICNlbmRPYmplY3QoKX0uCisgKiA8L3VsPgorICoKKyAqIDxoMz5FeGFtcGxlPC9oMz4KKyAqIFN1cHBvc2Ugd2UnZCBsaWtlIHRvIGVuY29kZSBhIHN0cmVhbSBvZiBtZXNzYWdlcyBzdWNoIGFzIHRoZSBmb2xsb3dpbmc6IDxwcmU+IHtAY29kZQorICogWworICogICB7CisgKiAgICAgImlkIjogOTEyMzQ1Njc4OTAxLAorICogICAgICJ0ZXh0IjogIkhvdyBkbyBJIHdyaXRlIEpTT04gb24gQW5kcm9pZD8iLAorICogICAgICJnZW8iOiBudWxsLAorICogICAgICJ1c2VyIjogeworICogICAgICAgIm5hbWUiOiAiYW5kcm9pZF9uZXdiIiwKKyAqICAgICAgICJmb2xsb3dlcnNfY291bnQiOiA0MQorICogICAgICB9CisgKiAgIH0sCisgKiAgIHsKKyAqICAgICAiaWQiOiA5MTIzNDU2Nzg5MDIsCisgKiAgICAgInRleHQiOiAiQGFuZHJvaWRfbmV3YiBqdXN0IHVzZSBhbmRyb2lkLnV0aWwuSnNvbldyaXRlciEiLAorICogICAgICJnZW8iOiBbNTAuNDU0NzIyLCAtMTA0LjYwNjY2N10sCisgKiAgICAgInVzZXIiOiB7CisgKiAgICAgICAibmFtZSI6ICJqZXNzZSIsCisgKiAgICAgICAiZm9sbG93ZXJzX2NvdW50IjogMgorICogICAgIH0KKyAqICAgfQorICogXX08L3ByZT4KKyAqIFRoaXMgY29kZSBlbmNvZGVzIHRoZSBhYm92ZSBzdHJ1Y3R1cmU6IDxwcmU+ICAge0Bjb2RlCisgKiAgIHB1YmxpYyB2b2lkIHdyaXRlSnNvblN0cmVhbShPdXRwdXRTdHJlYW0gb3V0LCBMaXN0PE1lc3NhZ2U+IG1lc3NhZ2VzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICogICAgIEpzb25Xcml0ZXIgd3JpdGVyID0gbmV3IEpzb25Xcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsICJVVEYtOCIpKTsKKyAqICAgICB3cml0ZXIuc2V0SW5kZW50U3BhY2VzKDQpOworICogICAgIHdyaXRlTWVzc2FnZXNBcnJheSh3cml0ZXIsIG1lc3NhZ2VzKTsKKyAqICAgICB3cml0ZXIuY2xvc2UoKTsKKyAqICAgfQorICoKKyAqICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlc0FycmF5KEpzb25Xcml0ZXIgd3JpdGVyLCBMaXN0PE1lc3NhZ2U+IG1lc3NhZ2VzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICogICAgIHdyaXRlci5iZWdpbkFycmF5KCk7CisgKiAgICAgZm9yIChNZXNzYWdlIG1lc3NhZ2UgOiBtZXNzYWdlcykgeworICogICAgICAgd3JpdGVNZXNzYWdlKHdyaXRlciwgbWVzc2FnZSk7CisgKiAgICAgfQorICogICAgIHdyaXRlci5lbmRBcnJheSgpOworICogICB9CisgKgorICogICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2UoSnNvbldyaXRlciB3cml0ZXIsIE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAqICAgICB3cml0ZXIuYmVnaW5PYmplY3QoKTsKKyAqICAgICB3cml0ZXIubmFtZSgiaWQiKS52YWx1ZShtZXNzYWdlLmdldElkKCkpOworICogICAgIHdyaXRlci5uYW1lKCJ0ZXh0IikudmFsdWUobWVzc2FnZS5nZXRUZXh0KCkpOworICogICAgIGlmIChtZXNzYWdlLmdldEdlbygpICE9IG51bGwpIHsKKyAqICAgICAgIHdyaXRlci5uYW1lKCJnZW8iKTsKKyAqICAgICAgIHdyaXRlRG91Ymxlc0FycmF5KHdyaXRlciwgbWVzc2FnZS5nZXRHZW8oKSk7CisgKiAgICAgfSBlbHNlIHsKKyAqICAgICAgIHdyaXRlci5uYW1lKCJnZW8iKS5udWxsVmFsdWUoKTsKKyAqICAgICB9CisgKiAgICAgd3JpdGVyLm5hbWUoInVzZXIiKTsKKyAqICAgICB3cml0ZVVzZXIod3JpdGVyLCBtZXNzYWdlLmdldFVzZXIoKSk7CisgKiAgICAgd3JpdGVyLmVuZE9iamVjdCgpOworICogICB9CisgKgorICogICBwdWJsaWMgdm9pZCB3cml0ZVVzZXIoSnNvbldyaXRlciB3cml0ZXIsIFVzZXIgdXNlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAqICAgICB3cml0ZXIuYmVnaW5PYmplY3QoKTsKKyAqICAgICB3cml0ZXIubmFtZSgibmFtZSIpLnZhbHVlKHVzZXIuZ2V0TmFtZSgpKTsKKyAqICAgICB3cml0ZXIubmFtZSgiZm9sbG93ZXJzX2NvdW50IikudmFsdWUodXNlci5nZXRGb2xsb3dlcnNDb3VudCgpKTsKKyAqICAgICB3cml0ZXIuZW5kT2JqZWN0KCk7CisgKiAgIH0KKyAqCisgKiAgIHB1YmxpYyB2b2lkIHdyaXRlRG91Ymxlc0FycmF5KEpzb25Xcml0ZXIgd3JpdGVyLCBMaXN0PERvdWJsZT4gZG91YmxlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAqICAgICB3cml0ZXIuYmVnaW5BcnJheSgpOworICogICAgIGZvciAoRG91YmxlIHZhbHVlIDogZG91YmxlcykgeworICogICAgICAgd3JpdGVyLnZhbHVlKHZhbHVlKTsKKyAqICAgICB9CisgKiAgICAgd3JpdGVyLmVuZEFycmF5KCk7CisgKiAgIH19PC9wcmU+CisgKgorICogPHA+RWFjaCB7QGNvZGUgSnNvbldyaXRlcn0gbWF5IGJlIHVzZWQgdG8gd3JpdGUgYSBzaW5nbGUgSlNPTiBzdHJlYW0uCisgKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgbm90IHRocmVhZCBzYWZlLiBDYWxscyB0aGF0IHdvdWxkIHJlc3VsdCBpbiBhCisgKiBtYWxmb3JtZWQgSlNPTiBzdHJpbmcgd2lsbCBmYWlsIHdpdGggYW4ge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKc29uV3JpdGVyIGltcGxlbWVudHMgQ2xvc2VhYmxlIHsKKworICAgIC8qKiBUaGUgb3V0cHV0IGRhdGEsIGNvbnRhaW5pbmcgYXQgbW9zdCBvbmUgdG9wLWxldmVsIGFycmF5IG9yIG9iamVjdC4gKi8KKyAgICBwcml2YXRlIGZpbmFsIFdyaXRlciBvdXQ7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8SnNvblNjb3BlPiBzdGFjayA9IG5ldyBBcnJheUxpc3Q8SnNvblNjb3BlPigpOworICAgIHsKKyAgICAgICAgc3RhY2suYWRkKEpzb25TY29wZS5FTVBUWV9ET0NVTUVOVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBzdHJpbmcgY29udGFpbmluZyBhIGZ1bGwgc2V0IG9mIHNwYWNlcyBmb3IgYSBzaW5nbGUgbGV2ZWwgb2YKKyAgICAgKiBpbmRlbnRhdGlvbiwgb3IgbnVsbCBmb3Igbm8gcHJldHR5IHByaW50aW5nLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGluZGVudDsKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lL3ZhbHVlIHNlcGFyYXRvcjsgZWl0aGVyICI6IiBvciAiOiAiLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHNlcGFyYXRvciA9ICI6IjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgdGhhdCB3cml0ZXMgYSBKU09OLWVuY29kZWQgc3RyZWFtIHRvIHtAY29kZSBvdXR9LgorICAgICAqIEZvciBiZXN0IHBlcmZvcm1hbmNlLCBlbnN1cmUge0BsaW5rIFdyaXRlcn0gaXMgYnVmZmVyZWQ7IHdyYXBwaW5nIGluCisgICAgICoge0BsaW5rIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIgQnVmZmVyZWRXcml0ZXJ9IGlmIG5lY2Vzc2FyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNvbldyaXRlcihXcml0ZXIgb3V0KSB7CisgICAgICAgIGlmIChvdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJvdXQgPT0gbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHRoaXMub3V0ID0gb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGluZGVudGF0aW9uIHN0cmluZyB0byBiZSByZXBlYXRlZCBmb3IgZWFjaCBsZXZlbCBvZiBpbmRlbnRhdGlvbgorICAgICAqIGluIHRoZSBlbmNvZGVkIGRvY3VtZW50LiBJZiB7QGNvZGUgaW5kZW50LmlzRW1wdHkoKX0gdGhlIGVuY29kZWQgZG9jdW1lbnQKKyAgICAgKiB3aWxsIGJlIGNvbXBhY3QuIE90aGVyd2lzZSB0aGUgZW5jb2RlZCBkb2N1bWVudCB3aWxsIGJlIG1vcmUKKyAgICAgKiBodW1hbi1yZWFkYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRlbnQgYSBzdHJpbmcgY29udGFpbmluZyBvbmx5IHdoaXRlc3BhY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5kZW50KFN0cmluZyBpbmRlbnQpIHsKKyAgICAgICAgaWYgKGluZGVudC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRoaXMuaW5kZW50ID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMuc2VwYXJhdG9yID0gIjoiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5pbmRlbnQgPSBpbmRlbnQ7CisgICAgICAgICAgICB0aGlzLnNlcGFyYXRvciA9ICI6ICI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCZWdpbnMgZW5jb2RpbmcgYSBuZXcgYXJyYXkuIEVhY2ggY2FsbCB0byB0aGlzIG1ldGhvZCBtdXN0IGJlIHBhaXJlZCB3aXRoCisgICAgICogYSBjYWxsIHRvIHtAbGluayAjZW5kQXJyYXl9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNvbldyaXRlciBiZWdpbkFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG9wZW4oSnNvblNjb3BlLkVNUFRZX0FSUkFZLCAiWyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZHMgZW5jb2RpbmcgdGhlIGN1cnJlbnQgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoaXMgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBKc29uV3JpdGVyIGVuZEFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNsb3NlKEpzb25TY29wZS5FTVBUWV9BUlJBWSwgSnNvblNjb3BlLk5PTkVNUFRZX0FSUkFZLCAiXSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJlZ2lucyBlbmNvZGluZyBhIG5ldyBvYmplY3QuIEVhY2ggY2FsbCB0byB0aGlzIG1ldGhvZCBtdXN0IGJlIHBhaXJlZAorICAgICAqIHdpdGggYSBjYWxsIHRvIHtAbGluayAjZW5kT2JqZWN0fS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhpcyB3cml0ZXIuCisgICAgICovCisgICAgcHVibGljIEpzb25Xcml0ZXIgYmVnaW5PYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gb3BlbihKc29uU2NvcGUuRU1QVFlfT0JKRUNULCAieyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZHMgZW5jb2RpbmcgdGhlIGN1cnJlbnQgb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNvbldyaXRlciBlbmRPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gY2xvc2UoSnNvblNjb3BlLkVNUFRZX09CSkVDVCwgSnNvblNjb3BlLk5PTkVNUFRZX09CSkVDVCwgIn0iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnRlcnMgYSBuZXcgc2NvcGUgYnkgYXBwZW5kaW5nIGFueSBuZWNlc3Nhcnkgd2hpdGVzcGFjZSBhbmQgdGhlIGdpdmVuCisgICAgICogYnJhY2tldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEpzb25Xcml0ZXIgb3BlbihKc29uU2NvcGUgZW1wdHksIFN0cmluZyBvcGVuQnJhY2tldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYmVmb3JlVmFsdWUodHJ1ZSk7CisgICAgICAgIHN0YWNrLmFkZChlbXB0eSk7CisgICAgICAgIG91dC53cml0ZShvcGVuQnJhY2tldCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgY3VycmVudCBzY29wZSBieSBhcHBlbmRpbmcgYW55IG5lY2Vzc2FyeSB3aGl0ZXNwYWNlIGFuZCB0aGUKKyAgICAgKiBnaXZlbiBicmFja2V0LgorICAgICAqLworICAgIHByaXZhdGUgSnNvbldyaXRlciBjbG9zZShKc29uU2NvcGUgZW1wdHksIEpzb25TY29wZSBub25lbXB0eSwgU3RyaW5nIGNsb3NlQnJhY2tldCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25TY29wZSBjb250ZXh0ID0gcGVlaygpOworICAgICAgICBpZiAoY29udGV4dCAhPSBub25lbXB0eSAmJiBjb250ZXh0ICE9IGVtcHR5KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOZXN0aW5nIHByb2JsZW06ICIgKyBzdGFjayk7CisgICAgICAgIH0KKworICAgICAgICBzdGFjay5yZW1vdmUoc3RhY2suc2l6ZSgpIC0gMSk7CisgICAgICAgIGlmIChjb250ZXh0ID09IG5vbmVtcHR5KSB7CisgICAgICAgICAgICBuZXdsaW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LndyaXRlKGNsb3NlQnJhY2tldCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgorICAgICAqLworICAgIHByaXZhdGUgSnNvblNjb3BlIHBlZWsoKSB7CisgICAgICAgIHJldHVybiBzdGFjay5nZXQoc3RhY2suc2l6ZSgpIC0gMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZSB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VUb3AoSnNvblNjb3BlIHRvcE9mU3RhY2spIHsKKyAgICAgICAgc3RhY2suc2V0KHN0YWNrLnNpemUoKSAtIDEsIHRvcE9mU3RhY2spOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMgdGhlIHByb3BlcnR5IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZm9ydGhjb21pbmcgdmFsdWUuIE1heSBub3QgYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBKc29uV3JpdGVyIG5hbWUoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibmFtZSA9PSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgYmVmb3JlTmFtZSgpOworICAgICAgICBzdHJpbmcobmFtZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMge0Bjb2RlIHZhbHVlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbGl0ZXJhbCBzdHJpbmcgdmFsdWUsIG9yIG51bGwgdG8gZW5jb2RlIGEgbnVsbCBsaXRlcmFsLgorICAgICAqIEByZXR1cm4gdGhpcyB3cml0ZXIuCisgICAgICovCisgICAgcHVibGljIEpzb25Xcml0ZXIgdmFsdWUoU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxWYWx1ZSgpOworICAgICAgICB9CisgICAgICAgIGJlZm9yZVZhbHVlKGZhbHNlKTsKKyAgICAgICAgc3RyaW5nKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb2RlcyB7QGNvZGUgbnVsbH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoaXMgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBKc29uV3JpdGVyIG51bGxWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJlZm9yZVZhbHVlKGZhbHNlKTsKKyAgICAgICAgb3V0LndyaXRlKCJudWxsIik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMge0Bjb2RlIHZhbHVlfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhpcyB3cml0ZXIuCisgICAgICovCisgICAgcHVibGljIEpzb25Xcml0ZXIgdmFsdWUoYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYmVmb3JlVmFsdWUoZmFsc2UpOworICAgICAgICBvdXQud3JpdGUodmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb2RlcyB7QGNvZGUgdmFsdWV9LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIGEgZmluaXRlIHZhbHVlLiBNYXkgbm90IGJlIHtAbGluayBEb3VibGUjaXNOYU4oKSBOYU5zfSBvcgorICAgICAqICAgICB7QGxpbmsgRG91YmxlI2lzSW5maW5pdGUoKSBpbmZpbml0aWVzfS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBKc29uV3JpdGVyIHZhbHVlKGRvdWJsZSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKERvdWJsZS5pc05hTih2YWx1ZSkgfHwgRG91YmxlLmlzSW5maW5pdGUodmFsdWUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdW1lcmljIHZhbHVlcyBtdXN0IGJlIGZpbml0ZSwgYnV0IHdhcyAiICsgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGJlZm9yZVZhbHVlKGZhbHNlKTsKKyAgICAgICAgb3V0LmFwcGVuZChEb3VibGUudG9TdHJpbmcodmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb2RlcyB7QGNvZGUgdmFsdWV9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNvbldyaXRlciB2YWx1ZShsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBiZWZvcmVWYWx1ZShmYWxzZSk7CisgICAgICAgIG91dC53cml0ZShMb25nLnRvU3RyaW5nKHZhbHVlKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZXMgYWxsIGJ1ZmZlcmVkIGRhdGEgaXMgd3JpdHRlbiB0byB0aGUgdW5kZXJseWluZyB7QGxpbmsgV3JpdGVyfQorICAgICAqIGFuZCBmbHVzaGVzIHRoYXQgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmx1c2hlcyBhbmQgY2xvc2VzIHRoaXMgd3JpdGVyIGFuZCB0aGUgdW5kZXJseWluZyB7QGxpbmsgV3JpdGVyfS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIEpTT04gZG9jdW1lbnQgaXMgaW5jb21wbGV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC5jbG9zZSgpOworCisgICAgICAgIGlmIChwZWVrKCkgIT0gSnNvblNjb3BlLk5PTkVNUFRZX0RPQ1VNRU5UKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkluY29tcGxldGUgZG9jdW1lbnQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdHJpbmcoU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQud3JpdGUoIlwiIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSB2YWx1ZS5jaGFyQXQoaSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBGcm9tIFJGQyA0NjI3LCAiQWxsIFVuaWNvZGUgY2hhcmFjdGVycyBtYXkgYmUgcGxhY2VkIHdpdGhpbiB0aGUKKyAgICAgICAgICAgICAqIHF1b3RhdGlvbiBtYXJrcyBleGNlcHQgZm9yIHRoZSBjaGFyYWN0ZXJzIHRoYXQgbXVzdCBiZSBlc2NhcGVkOgorICAgICAgICAgICAgICogcXVvdGF0aW9uIG1hcmssIHJldmVyc2Ugc29saWR1cywgYW5kIHRoZSBjb250cm9sIGNoYXJhY3RlcnMKKyAgICAgICAgICAgICAqIChVKzAwMDAgdGhyb3VnaCBVKzAwMUYpLiIKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoJ1xcJyk7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShjKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgiXFx0Iik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnXGInOgorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIlxcYiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCJcXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgiXFxyIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnXGYnOgorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIlxcZiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChjIDw9IDB4MUYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShTdHJpbmcuZm9ybWF0KCJcXHUlMDR4IiwgKGludCkgYykpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgb3V0LndyaXRlKCJcIiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBuZXdsaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGluZGVudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBvdXQud3JpdGUoIlxuIik7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc3RhY2suc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG91dC53cml0ZShpbmRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zZXJ0cyBhbnkgbmVjZXNzYXJ5IHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2UgYmVmb3JlIGEgbmFtZS4gQWxzbworICAgICAqIGFkanVzdHMgdGhlIHN0YWNrIHRvIGV4cGVjdCB0aGUgbmFtZSdzIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBiZWZvcmVOYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblNjb3BlIGNvbnRleHQgPSBwZWVrKCk7CisgICAgICAgIGlmIChjb250ZXh0ID09IEpzb25TY29wZS5OT05FTVBUWV9PQkpFQ1QpIHsgLy8gZmlyc3QgaW4gb2JqZWN0CisgICAgICAgICAgICBvdXQud3JpdGUoJywnKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0ICE9IEpzb25TY29wZS5FTVBUWV9PQkpFQ1QpIHsgLy8gbm90IGluIGFuIG9iamVjdCEKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5lc3RpbmcgcHJvYmxlbTogIiArIHN0YWNrKTsKKyAgICAgICAgfQorICAgICAgICBuZXdsaW5lKCk7CisgICAgICAgIHJlcGxhY2VUb3AoSnNvblNjb3BlLkRBTkdMSU5HX05BTUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc2VydHMgYW55IG5lY2Vzc2FyeSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIGJlZm9yZSBhIGxpdGVyYWwgdmFsdWUsCisgICAgICogaW5saW5lIGFycmF5LCBvciBpbmxpbmUgb2JqZWN0LiBBbHNvIGFkanVzdHMgdGhlIHN0YWNrIHRvIGV4cGVjdCBlaXRoZXIgYQorICAgICAqIGNsb3NpbmcgYnJhY2tldCBvciBhbm90aGVyIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9vdCB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhIG5ldyBhcnJheSBvciBvYmplY3QsIHRoZSB0d28gdmFsdWVzCisgICAgICogICAgIHBlcm1pdHRlZCBhcyB0b3AtbGV2ZWwgZWxlbWVudHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGJlZm9yZVZhbHVlKGJvb2xlYW4gcm9vdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3dpdGNoIChwZWVrKCkpIHsKKyAgICAgICAgICAgIGNhc2UgRU1QVFlfRE9DVU1FTlQ6IC8vIGZpcnN0IGluIGRvY3VtZW50CisgICAgICAgICAgICAgICAgaWYgKCFyb290KSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpTT04gbXVzdCBzdGFydCB3aXRoIGFuIGFycmF5IG9yIGFuIG9iamVjdC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwbGFjZVRvcChKc29uU2NvcGUuTk9ORU1QVFlfRE9DVU1FTlQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEVNUFRZX0FSUkFZOiAvLyBmaXJzdCBpbiBhcnJheQorICAgICAgICAgICAgICAgIHJlcGxhY2VUb3AoSnNvblNjb3BlLk5PTkVNUFRZX0FSUkFZKTsKKyAgICAgICAgICAgICAgICBuZXdsaW5lKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTk9ORU1QVFlfQVJSQVk6IC8vIGFub3RoZXIgaW4gYXJyYXkKKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCcsJyk7CisgICAgICAgICAgICAgICAgbmV3bGluZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIERBTkdMSU5HX05BTUU6IC8vIHZhbHVlIGZvciBuYW1lCisgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChzZXBhcmF0b3IpOworICAgICAgICAgICAgICAgIHJlcGxhY2VUb3AoSnNvblNjb3BlLk5PTkVNUFRZX09CSkVDVCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTk9ORU1QVFlfRE9DVU1FTlQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJKU09OIG11c3QgaGF2ZSBvbmx5IG9uZSB0b3AtbGV2ZWwgdmFsdWUuIik7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTmVzdGluZyBwcm9ibGVtOiAiICsgc3RhY2spOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9QYXR0ZXJucy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9QYXR0ZXJucy5qYXZhCmluZGV4IDVjYmZkMjkuLjNiY2QyNjYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvUGF0dGVybnMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1BhdHRlcm5zLmphdmEKQEAgLTI1LDcgKzI1LDcgQEAKIHB1YmxpYyBjbGFzcyBQYXR0ZXJucyB7CiAgICAgLyoqCiAgICAgICogIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCBhbGwgSUFOQSB0b3AtbGV2ZWwgZG9tYWlucy4KLSAgICAgKiAgTGlzdCBhY2N1cmF0ZSBhcyBvZiAyMDEwLzAyLzA1LiAgTGlzdCB0YWtlbiBmcm9tOgorICAgICAqICBMaXN0IGFjY3VyYXRlIGFzIG9mIDIwMTAvMDUvMDYuICBMaXN0IHRha2VuIGZyb206CiAgICAgICogIGh0dHA6Ly9kYXRhLmlhbmEub3JnL1RMRC90bGRzLWFscGhhLWJ5LWRvbWFpbi50eHQKICAgICAgKiAgVGhpcyBwYXR0ZXJuIGlzIGF1dG8tZ2VuZXJhdGVkIGJ5IGZyYW1ld29ya3MvYmFzZS9jb21tb24vdG9vbHMvbWFrZS1pYW5hLXRsZC1wYXR0ZXJuLnB5CiAgICAgICovCkBAIC01Myw4ICs1Myw4IEBACiAgICAgICAgICsgInx1W2Fna3N5el0iCiAgICAgICAgICsgInx2W2FjZWdpbnVdIgogICAgICAgICArICJ8d1tmc10iCi0gICAgICAgICsgInwoeG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtemNremFoKSIKLSAgICAgICAgKyAifHlbZXR1XSIKKyAgICAgICAgKyAifCh4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCkiCisgICAgICAgICsgInx5W2V0XSIKICAgICAgICAgKyAifHpbYW13XSkiOwogCiAgICAgLyoqCkBAIC02NSw3ICs2NSw3IEBACiAKICAgICAvKioKICAgICAgKiAgUmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIGFsbCBJQU5BIHRvcC1sZXZlbCBkb21haW5zIGZvciBXRUJfVVJMLgotICAgICAqICBMaXN0IGFjY3VyYXRlIGFzIG9mIDIwMTAvMDIvMDUuICBMaXN0IHRha2VuIGZyb206CisgICAgICogIExpc3QgYWNjdXJhdGUgYXMgb2YgMjAxMC8wNS8wNi4gIExpc3QgdGFrZW4gZnJvbToKICAgICAgKiAgaHR0cDovL2RhdGEuaWFuYS5vcmcvVExEL3RsZHMtYWxwaGEtYnktZG9tYWluLnR4dAogICAgICAqICBUaGlzIHBhdHRlcm4gaXMgYXV0by1nZW5lcmF0ZWQgYnkgZnJhbWV3b3Jrcy9iYXNlL2NvbW1vbi90b29scy9tYWtlLWlhbmEtdGxkLXBhdHRlcm4ucHkKICAgICAgKi8KQEAgLTk0LDggKzk0LDggQEAKICAgICAgICAgKyAifHVbYWdrc3l6XSIKICAgICAgICAgKyAifHZbYWNlZ2ludV0iCiAgICAgICAgICsgInx3W2ZzXSIKLSAgICAgICAgKyAifCg/OnhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLXpja3phaCkiCi0gICAgICAgICsgInx5W2V0dV0iCisgICAgICAgICsgInwoPzp4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCkiCisgICAgICAgICsgInx5W2V0XSIKICAgICAgICAgKyAifHpbYW13XSkpIjsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9TcGFyc2VBcnJheS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9TcGFyc2VBcnJheS5qYXZhCmluZGV4IDFjOGIzMzAuLjdmYzQzYjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvU3BhcnNlQXJyYXkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5LmphdmEKQEAgLTkwLDYgKzkwLDE2IEBACiAgICAgICAgIGRlbGV0ZShrZXkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIG1hcHBpbmcgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdChpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKG1WYWx1ZXNbaW5kZXhdICE9IERFTEVURUQpIHsKKyAgICAgICAgICAgIG1WYWx1ZXNbaW5kZXhdID0gREVMRVRFRDsKKyAgICAgICAgICAgIG1HYXJiYWdlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKICAgICBwcml2YXRlIHZvaWQgZ2MoKSB7CiAgICAgICAgIC8vIExvZy5lKCJTcGFyc2VBcnJheSIsICJnYyBzdGFydCB3aXRoICIgKyBtU2l6ZSk7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvVGltaW5nTG9nZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1RpbWluZ0xvZ2dlci5qYXZhCmluZGV4IDBmMzljOTcuLmJlNDQyZGEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvVGltaW5nTG9nZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9UaW1pbmdMb2dnZXIuamF2YQpAQCAtMjQsMjIgKzI0LDI2IEBACiAgKiBBIHV0aWxpdHkgY2xhc3MgdG8gaGVscCBsb2cgdGltaW5ncyBzcGxpdHMgdGhyb3VnaG91dCBhIG1ldGhvZCBjYWxsLgogICogVHlwaWNhbCB1c2FnZSBpczoKICAqCi0gKiBUaW1pbmdMb2dnZXIgdGltaW5ncyA9IG5ldyBUaW1pbmdMb2dnZXIoVEFHLCAibWV0aG9kQSIpOwotICogLi4uIGRvIHNvbWUgd29yayBBIC4uLgotICogdGltaW5ncy5hZGRTcGxpdCgid29yayBBIik7Ci0gKiAuLi4gZG8gc29tZSB3b3JrIEIgLi4uCi0gKiB0aW1pbmdzLmFkZFNwbGl0KCJ3b3JrIEIiKTsKLSAqIC4uLiBkbyBzb21lIHdvcmsgQyAuLi4KLSAqIHRpbWluZ3MuYWRkU3BsaXQoIndvcmsgQyIpOwotICogdGltaW5ncy5kdW1wVG9Mb2coKTsKKyAqIDxwcmU+CisgKiAgICAgVGltaW5nTG9nZ2VyIHRpbWluZ3MgPSBuZXcgVGltaW5nTG9nZ2VyKFRBRywgIm1ldGhvZEEiKTsKKyAqICAgICAvLyAuLi4gZG8gc29tZSB3b3JrIEEgLi4uCisgKiAgICAgdGltaW5ncy5hZGRTcGxpdCgid29yayBBIik7CisgKiAgICAgLy8gLi4uIGRvIHNvbWUgd29yayBCIC4uLgorICogICAgIHRpbWluZ3MuYWRkU3BsaXQoIndvcmsgQiIpOworICogICAgIC8vIC4uLiBkbyBzb21lIHdvcmsgQyAuLi4KKyAqICAgICB0aW1pbmdzLmFkZFNwbGl0KCJ3b3JrIEMiKTsKKyAqICAgICB0aW1pbmdzLmR1bXBUb0xvZygpOworICogPC9wcmU+CiAgKgotICogVGhlIGR1bXBUb0xvZyBjYWxsIHdvdWxkIGFkZCB0aGUgZm9sbG93aW5nIHRvIHRoZSBsb2c6CisgKiA8cD5UaGUgZHVtcFRvTG9nIGNhbGwgd291bGQgYWRkIHRoZSBmb2xsb3dpbmcgdG8gdGhlIGxvZzo8L3A+CiAgKgotICogRC9UQUcgICAgICggMzQ1OSk6IG1ldGhvZEE6IGJlZ2luCi0gKiBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogICAgICA5IG1zLCB3b3JrIEEKLSAqIEQvVEFHICAgICAoIDM0NTkpOiBtZXRob2RBOiAgICAgIDEgbXMsIHdvcmsgQgotICogRC9UQUcgICAgICggMzQ1OSk6IG1ldGhvZEE6ICAgICAgNiBtcywgd29yayBDCi0gKiBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogZW5kLCAxNiBtcworICogPHByZT4KKyAqICAgICBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogYmVnaW4KKyAqICAgICBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogICAgICA5IG1zLCB3b3JrIEEKKyAqICAgICBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogICAgICAxIG1zLCB3b3JrIEIKKyAqICAgICBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogICAgICA2IG1zLCB3b3JrIEMKKyAqICAgICBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogZW5kLCAxNiBtcworICogPC9wcmU+CiAgKi8KIHB1YmxpYyBjbGFzcyBUaW1pbmdMb2dnZXIgewogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0FjdGlvbk1vZGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvQWN0aW9uTW9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYWZhOTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0FjdGlvbk1vZGUuamF2YQpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3OworCisKKy8qKgorICogUmVwcmVzZW50cyBhIGNvbnRleHR1YWwgbW9kZSBvZiB0aGUgdXNlciBpbnRlcmZhY2UuIEFjdGlvbiBtb2RlcyBjYW4gYmUgdXNlZCBmb3IKKyAqIG1vZGFsIGludGVyYWN0aW9ucyB3aXRoIGNvbnRlbnQgYW5kIHJlcGxhY2UgcGFydHMgb2YgdGhlIG5vcm1hbCBVSSB1bnRpbCBmaW5pc2hlZC4KKyAqIEV4YW1wbGVzIG9mIGdvb2QgYWN0aW9uIG1vZGVzIGluY2x1ZGUgc2VsZWN0aW9uIG1vZGVzLCBzZWFyY2gsIGNvbnRlbnQgZWRpdGluZywgZXRjLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWN0aW9uTW9kZSB7CisgICAgLyoqCisgICAgICogU2V0IHRoZSB0aXRsZSBvZiB0aGUgYWN0aW9uIG1vZGUuIFRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBubyB2aXNpYmxlIGVmZmVjdCBpZgorICAgICAqIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHRpdGxlIFRpdGxlIHN0cmluZyB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFRpdGxlKGludCkKKyAgICAgKiBAc2VlICNzZXRDdXN0b21WaWV3KFZpZXcpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGl0bGUgb2YgdGhlIGFjdGlvbiBtb2RlLiBUaGlzIG1ldGhvZCB3aWxsIGhhdmUgbm8gdmlzaWJsZSBlZmZlY3QgaWYKKyAgICAgKiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNJZCBSZXNvdXJjZSBJRCBvZiBhIHN0cmluZyB0byBzZXQgYXMgdGhlIHRpdGxlCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRUaXRsZShDaGFyU2VxdWVuY2UpCisgICAgICogQHNlZSAjc2V0Q3VzdG9tVmlldyhWaWV3KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRpdGxlKGludCByZXNJZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN1YnRpdGxlIG9mIHRoZSBhY3Rpb24gbW9kZS4gVGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIHZpc2libGUgZWZmZWN0IGlmCisgICAgICogYSBjdXN0b20gdmlldyBoYXMgYmVlbiBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3VidGl0bGUgU3VidGl0bGUgc3RyaW5nIHRvIHNldAorICAgICAqCisgICAgICogQHNlZSAjc2V0U3VidGl0bGUoaW50KQorICAgICAqIEBzZWUgI3NldEN1c3RvbVZpZXcoVmlldykKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdWJ0aXRsZSBvZiB0aGUgYWN0aW9uIG1vZGUuIFRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBubyB2aXNpYmxlIGVmZmVjdCBpZgorICAgICAqIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc0lkIFJlc291cmNlIElEIG9mIGEgc3RyaW5nIHRvIHNldCBhcyB0aGUgc3VidGl0bGUKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFN1YnRpdGxlKENoYXJTZXF1ZW5jZSkKKyAgICAgKiBAc2VlICNzZXRDdXN0b21WaWV3KFZpZXcpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3VidGl0bGUoaW50IHJlc0lkKTsKKworICAgIC8qKgorICAgICAqIFNldCBhIGN1c3RvbSB2aWV3IGZvciB0aGlzIGFjdGlvbiBtb2RlLiBUaGUgY3VzdG9tIHZpZXcgd2lsbCB0YWtlIHRoZSBwbGFjZSBvZgorICAgICAqIHRoZSB0aXRsZSBhbmQgc3VidGl0bGUuIFVzZWZ1bCBmb3IgdGhpbmdzIGxpa2Ugc2VhcmNoIGJveGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXcgQ3VzdG9tIHZpZXcgdG8gdXNlIGluIHBsYWNlIG9mIHRoZSB0aXRsZS9zdWJ0aXRsZS4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldFRpdGxlKENoYXJTZXF1ZW5jZSkKKyAgICAgKiBAc2VlICNzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2UpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q3VzdG9tVmlldyhWaWV3IHZpZXcpOworCisgICAgLyoqCisgICAgICogSW52YWxpZGF0ZSB0aGUgYWN0aW9uIG1vZGUgYW5kIHJlZnJlc2ggbWVudSBjb250ZW50LiBUaGUgbW9kZSdzCisgICAgICoge0BsaW5rIEFjdGlvbk1vZGUuQ2FsbGJhY2t9IHdpbGwgaGF2ZSBpdHMKKyAgICAgKiB7QGxpbmsgQ2FsbGJhY2sjb25QcmVwYXJlQWN0aW9uTW9kZShBY3Rpb25Nb2RlLCBNZW51KX0gbWV0aG9kIGNhbGxlZC4KKyAgICAgKiBJZiBpdCByZXR1cm5zIHRydWUgdGhlIG1lbnUgd2lsbCBiZSBzY2FubmVkIGZvciB1cGRhdGVkIGNvbnRlbnQgYW5kIGFueSByZWxldmFudCBjaGFuZ2VzCisgICAgICogd2lsbCBiZSByZWZsZWN0ZWQgdG8gdGhlIHVzZXIuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgaW52YWxpZGF0ZSgpOworCisgICAgLyoqCisgICAgICogRmluaXNoIGFuZCBjbG9zZSB0aGlzIGFjdGlvbiBtb2RlLiBUaGUgYWN0aW9uIG1vZGUncyB7QGxpbmsgQWN0aW9uTW9kZS5DYWxsYmFja30gd2lsbAorICAgICAqIGhhdmUgaXRzIHtAbGluayBDYWxsYmFjayNvbkRlc3Ryb3lBY3Rpb25Nb2RlKEFjdGlvbk1vZGUpfSBtZXRob2QgY2FsbGVkLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGZpbmlzaCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWVudSBvZiBhY3Rpb25zIHRoYXQgdGhpcyBhY3Rpb24gbW9kZSBwcmVzZW50cy4KKyAgICAgKiBAcmV0dXJuIFRoZSBhY3Rpb24gbW9kZSdzIG1lbnUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE1lbnUgZ2V0TWVudSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCB0aXRsZSBvZiB0aGlzIGFjdGlvbiBtb2RlLgorICAgICAqIEByZXR1cm4gVGl0bGUgdGV4dAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBDaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3VidGl0bGUgb2YgdGhpcyBhY3Rpb24gbW9kZS4KKyAgICAgKiBAcmV0dXJuIFN1YnRpdGxlIHRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQ2hhclNlcXVlbmNlIGdldFN1YnRpdGxlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGN1c3RvbSB2aWV3IGZvciB0aGlzIGFjdGlvbiBtb2RlLgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgY3VzdG9tIHZpZXcKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgVmlldyBnZXRDdXN0b21WaWV3KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIE1lbnVJbmZsYXRlcn0gd2l0aCB0aGUgQWN0aW9uTW9kZSdzIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE1lbnVJbmZsYXRlciBnZXRNZW51SW5mbGF0ZXIoKTsKKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGludGVyZmFjZSBmb3IgYWN0aW9uIG1vZGVzLiBTdXBwbGllZCB0bworICAgICAqIHtAbGluayBWaWV3I3N0YXJ0QWN0aW9uTW9kZShDYWxsYmFjayl9LCBhIENhbGxiYWNrCisgICAgICogY29uZmlndXJlcyBhbmQgaGFuZGxlcyBldmVudHMgcmFpc2VkIGJ5IGEgdXNlcidzIGludGVyYWN0aW9uIHdpdGggYW4gYWN0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiA8cD5BbiBhY3Rpb24gbW9kZSdzIGxpZmVjeWNsZSBpcyBhcyBmb2xsb3dzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rIENhbGxiYWNrI29uQ3JlYXRlQWN0aW9uTW9kZShBY3Rpb25Nb2RlLCBNZW51KX0gb25jZSBvbiBpbml0aWFsCisgICAgICogY3JlYXRpb248L2xpPgorICAgICAqIDxsaT57QGxpbmsgQ2FsbGJhY2sjb25QcmVwYXJlQWN0aW9uTW9kZShBY3Rpb25Nb2RlLCBNZW51KX0gYWZ0ZXIgY3JlYXRpb24KKyAgICAgKiBhbmQgYW55IHRpbWUgdGhlIHtAbGluayBBY3Rpb25Nb2RlfSBpcyBpbnZhbGlkYXRlZDwvbGk+CisgICAgICogPGxpPntAbGluayBDYWxsYmFjayNvbkFjdGlvbkl0ZW1DbGlja2VkKEFjdGlvbk1vZGUsIE1lbnVJdGVtKX0gYW55IHRpbWUgYQorICAgICAqIGNvbnRleHR1YWwgYWN0aW9uIGJ1dHRvbiBpcyBjbGlja2VkPC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIENhbGxiYWNrI29uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSl9IHdoZW4gdGhlIGFjdGlvbiBtb2RlCisgICAgICogaXMgY2xvc2VkPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2FsbGJhY2sgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYWN0aW9uIG1vZGUgaXMgZmlyc3QgY3JlYXRlZC4gVGhlIG1lbnUgc3VwcGxpZWQgd2lsbCBiZSB1c2VkIHRvCisgICAgICAgICAqIGdlbmVyYXRlIGFjdGlvbiBidXR0b25zIGZvciB0aGUgYWN0aW9uIG1vZGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtb2RlIEFjdGlvbk1vZGUgYmVpbmcgY3JlYXRlZAorICAgICAgICAgKiBAcGFyYW0gbWVudSBNZW51IHVzZWQgdG8gcG9wdWxhdGUgYWN0aW9uIGJ1dHRvbnMKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhY3Rpb24gbW9kZSBzaG91bGQgYmUgY3JlYXRlZCwgZmFsc2UgaWYgZW50ZXJpbmcgdGhpcworICAgICAgICAgKiAgICAgICAgICAgICAgbW9kZSBzaG91bGQgYmUgYWJvcnRlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB0byByZWZyZXNoIGFuIGFjdGlvbiBtb2RlJ3MgYWN0aW9uIG1lbnUgd2hlbmV2ZXIgaXQgaXMgaW52YWxpZGF0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtb2RlIEFjdGlvbk1vZGUgYmVpbmcgcHJlcGFyZWQKKyAgICAgICAgICogQHBhcmFtIG1lbnUgTWVudSB1c2VkIHRvIHBvcHVsYXRlIGFjdGlvbiBidXR0b25zCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWVudSBvciBhY3Rpb24gbW9kZSB3YXMgdXBkYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25QcmVwYXJlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB0byByZXBvcnQgYSB1c2VyIGNsaWNrIG9uIGFuIGFjdGlvbiBidXR0b24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtb2RlIFRoZSBjdXJyZW50IEFjdGlvbk1vZGUKKyAgICAgICAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdGhhdCB3YXMgY2xpY2tlZAorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBjYWxsYmFjayBoYW5kbGVkIHRoZSBldmVudCwgZmFsc2UgaWYgdGhlIHN0YW5kYXJkIE1lbnVJdGVtCisgICAgICAgICAqICAgICAgICAgIGludm9jYXRpb24gc2hvdWxkIGNvbnRpbnVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25BY3Rpb25JdGVtQ2xpY2tlZChBY3Rpb25Nb2RlIG1vZGUsIE1lbnVJdGVtIGl0ZW0pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhbiBhY3Rpb24gbW9kZSBpcyBhYm91dCB0byBiZSBleGl0ZWQgYW5kIGRlc3Ryb3llZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1vZGUgVGhlIGN1cnJlbnQgQWN0aW9uTW9kZSBiZWluZyBkZXN0cm95ZWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9EaXNwbGF5TGlzdC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9EaXNwbGF5TGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTYwZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0Rpc3BsYXlMaXN0LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3OworCisvKioKKyAqIEEgZGlzcGxheSBsaXN0cyByZWNvcmRzIGEgc2VyaWVzIG9mIGdyYXBoaWNzIHJlbGF0ZWQgb3BlcmF0aW9uIGFuZCBjYW4gcmVwbGF5CisgKiB0aGVtIGxhdGVyLiBEaXNwbGF5IGxpc3RzIGFyZSB1c3VhbGx5IGJ1aWx0IGJ5IHJlY29yZGluZyBvcGVyYXRpb25zIG9uIGEKKyAqIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhc30uIFJlcGxheWluZyB0aGUgb3BlcmF0aW9ucyBmcm9tIGEgZGlzcGxheSBsaXN0CisgKiBhdm9pZHMgZXhlY3V0aW5nIHZpZXdzIGRyYXdpbmcgY29kZSBvbiBldmVyeSBmcmFtZSwgYW5kIGlzIHRodXMgbXVjaCBtb3JlCisgKiBlZmZpY2llbnQuIAorICovCithYnN0cmFjdCBjbGFzcyBEaXNwbGF5TGlzdCB7CisgICAgLyoqCisgICAgICogU3RhcnRzIHJlY29yZGluZyB0aGUgZGlzcGxheSBsaXN0LiBBbGwgb3BlcmF0aW9ucyBwZXJmb3JtZWQgb24gdGhlCisgICAgICogcmV0dXJuZWQgY2FudmFzIGFyZSByZWNvcmRlZCBhbmQgc3RvcmVkIGluIHRoaXMgZGlzcGxheSBsaXN0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gQSBjYW52YXMgdG8gcmVjb3JkIGRyYXdpbmcgb3BlcmF0aW9ucy4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBIYXJkd2FyZUNhbnZhcyBzdGFydCgpOworCisgICAgLyoqCisgICAgICogRW5kcyB0aGUgcmVjb3JkaW5nIGZvciB0aGlzIGRpc3BsYXkgbGlzdC4gQSBkaXNwbGF5IGxpc3QgY2Fubm90IGJlCisgICAgICogcmVwbGF5ZWQgaWYgcmVjb3JkaW5nIGlzIG5vdCBmaW5pc2hlZC4gCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCBlbmQoKTsKKworICAgIC8qKgorICAgICAqIEZyZWVzIHJlc291cmNlcyB0YWtlbiBieSB0aGlzIGRpc3BsYXkgbGlzdC4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQKKyAgICAgKiBiZWZvcmUgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzLgorICAgICAqLworICAgIGFic3RyYWN0IHZvaWQgZGVzdHJveSgpOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBkaXNwbGF5IGxpc3QgY2FuIGJlIHJlcGxheWVkIG9yIG5vdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGRpc3BsYXkgbGlzdCBjYW4gYmUgcmVwbGF5ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiAKKyAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5IYXJkd2FyZUNhbnZhcyNkcmF3RGlzcGxheUxpc3QoRGlzcGxheUxpc3QpIAorICAgICAqLworICAgIGFic3RyYWN0IGJvb2xlYW4gaXNSZWFkeSgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9EcmFnRXZlbnQuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvRHJhZ0V2ZW50LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA4OTQzZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvRHJhZ0V2ZW50LmFpZGwKQEAgLTAsMCArMSwxOSBAQAorLyoKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3OworCitwYXJjZWxhYmxlIERyYWdFdmVudDsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvRHJhZ0V2ZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0RyYWdFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNTk4Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0RyYWdFdmVudC5qYXZhCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnZpZXc7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGE7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CisKKy8qKiAhISEgVE9ETzogcmVhbCBkb2NzICovCitwdWJsaWMgY2xhc3MgRHJhZ0V2ZW50IGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBUUkFDS19SRUNZQ0xFRF9MT0NBVElPTiA9IGZhbHNlOworCisgICAgaW50IG1BY3Rpb247CisgICAgZmxvYXQgbVgsIG1ZOworICAgIENsaXBEZXNjcmlwdGlvbiBtQ2xpcERlc2NyaXB0aW9uOworICAgIENsaXBEYXRhIG1DbGlwRGF0YTsKKworICAgIHByaXZhdGUgRHJhZ0V2ZW50IG1OZXh0OworICAgIHByaXZhdGUgUnVudGltZUV4Y2VwdGlvbiBtUmVjeWNsZWRMb2NhdGlvbjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVJlY3ljbGVkOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9SRUNZQ0xFRCA9IDEwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBnUmVjeWNsZXJMb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgc3RhdGljIGludCBnUmVjeWNsZXJVc2VkID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBEcmFnRXZlbnQgZ1JlY3ljbGVyVG9wID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIGFjdGlvbiBjb25zdGFudHMgZm9yIERyYWdFdmVudCBkaXNwYXRjaAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9EUkFHX1NUQVJURUQgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9EUkFHX0xPQ0FUSU9OID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fRFJPUCA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0RSQUdfRU5ERUQgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9EUkFHX0VOVEVSRUQgPSA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9EUkFHX0VYSVRFRCA9IDY7CisKKyAgICAvKiBoaWRlIHRoZSBjb25zdHJ1Y3RvciBiZWhpbmQgcGFja2FnZSBzY29wZSAqLworICAgIHByaXZhdGUgRHJhZ0V2ZW50KCkgeworICAgIH0KKworICAgIHN0YXRpYyBEcmFnRXZlbnQgb2J0YWluKCkgeworICAgICAgICByZXR1cm4gRHJhZ0V2ZW50Lm9idGFpbigwLCAwZiwgMGYsIG51bGwsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRHJhZ0V2ZW50IG9idGFpbihpbnQgYWN0aW9uLCBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICAgICAgQ2xpcERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBDbGlwRGF0YSBkYXRhKSB7CisgICAgICAgIGZpbmFsIERyYWdFdmVudCBldjsKKyAgICAgICAgc3luY2hyb25pemVkIChnUmVjeWNsZXJMb2NrKSB7CisgICAgICAgICAgICBpZiAoZ1JlY3ljbGVyVG9wID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERyYWdFdmVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXYgPSBnUmVjeWNsZXJUb3A7CisgICAgICAgICAgICBnUmVjeWNsZXJUb3AgPSBldi5tTmV4dDsKKyAgICAgICAgICAgIGdSZWN5Y2xlclVzZWQgLT0gMTsKKyAgICAgICAgfQorICAgICAgICBldi5tUmVjeWNsZWRMb2NhdGlvbiA9IG51bGw7CisgICAgICAgIGV2Lm1SZWN5Y2xlZCA9IGZhbHNlOworICAgICAgICBldi5tTmV4dCA9IG51bGw7CisKKyAgICAgICAgZXYubUFjdGlvbiA9IGFjdGlvbjsKKyAgICAgICAgZXYubVggPSB4OworICAgICAgICBldi5tWSA9IHk7CisgICAgICAgIGV2Lm1DbGlwRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICAgICAgZXYubUNsaXBEYXRhID0gZGF0YTsKKworICAgICAgICByZXR1cm4gZXY7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBEcmFnRXZlbnQgb2J0YWluKERyYWdFdmVudCBzb3VyY2UpIHsKKyAgICAgICAgcmV0dXJuIG9idGFpbihzb3VyY2UubUFjdGlvbiwgc291cmNlLm1YLCBzb3VyY2UubVksCisgICAgICAgICAgICAgICAgc291cmNlLm1DbGlwRGVzY3JpcHRpb24sIHNvdXJjZS5tQ2xpcERhdGEpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0QWN0aW9uKCkgeworICAgICAgICByZXR1cm4gbUFjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0WCgpIHsKKyAgICAgICAgcmV0dXJuIG1YOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRZKCkgeworICAgICAgICByZXR1cm4gbVk7CisgICAgfQorCisgICAgcHVibGljIENsaXBEYXRhIGdldENsaXBEYXRhKCkgeworICAgICAgICByZXR1cm4gbUNsaXBEYXRhOworICAgIH0KKworICAgIHB1YmxpYyBDbGlwRGVzY3JpcHRpb24gZ2V0Q2xpcERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gbUNsaXBEZXNjcmlwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWN5Y2xlIHRoZSBEcmFnRXZlbnQsIHRvIGJlIHJlLXVzZWQgYnkgYSBsYXRlciBjYWxsZXIuICBBZnRlciBjYWxsaW5nCisgICAgICogdGhpcyBmdW5jdGlvbiB5b3UgbXVzdCBuZXZlciB0b3VjaCB0aGUgZXZlbnQgYWdhaW4uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgcmVjeWNsZSgpIHsKKyAgICAgICAgLy8gRW5zdXJlIHJlY3ljbGUgaXMgb25seSBjYWxsZWQgb25jZSEKKyAgICAgICAgaWYgKFRSQUNLX1JFQ1lDTEVEX0xPQ0FUSU9OKSB7CisgICAgICAgICAgICBpZiAobVJlY3ljbGVkTG9jYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHRvU3RyaW5nKCkgKyAiIHJlY3ljbGVkIHR3aWNlISIsIG1SZWN5Y2xlZExvY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZWN5Y2xlZExvY2F0aW9uID0gbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkxhc3QgcmVjeWNsZWQgaGVyZSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1SZWN5Y2xlZCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHRvU3RyaW5nKCkgKyAiIHJlY3ljbGVkIHR3aWNlISIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJlY3ljbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIG1DbGlwRGF0YSA9IG51bGw7CisgICAgICAgIG1DbGlwRGVzY3JpcHRpb24gPSBudWxsOworCisgICAgICAgIHN5bmNocm9uaXplZCAoZ1JlY3ljbGVyTG9jaykgeworICAgICAgICAgICAgaWYgKGdSZWN5Y2xlclVzZWQgPCBNQVhfUkVDWUNMRUQpIHsKKyAgICAgICAgICAgICAgICBnUmVjeWNsZXJVc2VkKys7CisgICAgICAgICAgICAgICAgbU5leHQgPSBnUmVjeWNsZXJUb3A7CisgICAgICAgICAgICAgICAgZ1JlY3ljbGVyVG9wID0gdGhpczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiRHJhZ0V2ZW50eyIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpKQorICAgICAgICArICIgYWN0aW9uPSIgKyBtQWN0aW9uICsgIiBAICgiICsgbVggKyAiLCAiICsgbVkgKyAiKSBkZXNjPSIgKyBtQ2xpcERlc2NyaXB0aW9uCisgICAgICAgICsgIiBkYXRhPSIgKyBtQ2xpcERhdGEKKyAgICAgICAgKyAifSI7CisgICAgfQorCisgICAgLyogUGFyY2VsYWJsZSBpbnRlcmZhY2UgKi8KKworICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUFjdGlvbik7CisgICAgICAgIGRlc3Qud3JpdGVGbG9hdChtWCk7CisgICAgICAgIGRlc3Qud3JpdGVGbG9hdChtWSk7CisgICAgICAgIGlmIChtQ2xpcERhdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgZGVzdC53cml0ZUludCgwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoMSk7CisgICAgICAgICAgICBtQ2xpcERhdGEud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DbGlwRGVzY3JpcHRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgZGVzdC53cml0ZUludCgwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoMSk7CisgICAgICAgICAgICBtQ2xpcERlc2NyaXB0aW9uLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8RHJhZ0V2ZW50PiBDUkVBVE9SID0KKyAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxEcmFnRXZlbnQ+KCkgeworICAgICAgICBwdWJsaWMgRHJhZ0V2ZW50IGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICBEcmFnRXZlbnQgZXZlbnQgPSBEcmFnRXZlbnQub2J0YWluKCk7CisgICAgICAgICAgICBldmVudC5tQWN0aW9uID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgZXZlbnQubVggPSBpbi5yZWFkRmxvYXQoKTsKKyAgICAgICAgICAgIGV2ZW50Lm1ZID0gaW4ucmVhZEZsb2F0KCk7CisgICAgICAgICAgICBpZiAoaW4ucmVhZEludCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICBldmVudC5tQ2xpcERhdGEgPSBDbGlwRGF0YS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluLnJlYWRJbnQoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZXZlbnQubUNsaXBEZXNjcmlwdGlvbiA9IENsaXBEZXNjcmlwdGlvbi5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGV2ZW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIERyYWdFdmVudFtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IERyYWdFdmVudFtzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dMRVMyMENhbnZhcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9HTEVTMjBDYW52YXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGIwMGRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9HTEVTMjBDYW52YXMuamF2YQpAQCAtMCwwICsxLDg1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3OworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvckZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkRyYXdGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaWN0dXJlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlRlbXBvcmFyeUJ1ZmZlcjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuR3JhcGhpY3NPcGVyYXRpb25zOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWRTdHJpbmc7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBDYW52YXMgb24gdG9wIG9mIE9wZW5HTCBFUyAyLjAuCisgKi8KK2NsYXNzIEdMRVMyMENhbnZhcyBleHRlbmRzIEhhcmR3YXJlQ2FudmFzIHsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbU9wYXF1ZTsKKyAgICBwcml2YXRlIGludCBtUmVuZGVyZXI7CisgICAgCisgICAgcHJpdmF0ZSBpbnQgbVdpZHRoOworICAgIHByaXZhdGUgaW50IG1IZWlnaHQ7CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1Qb2ludCA9IG5ldyBmbG9hdFsyXTsKKyAgICBwcml2YXRlIGZpbmFsIGZsb2F0W10gbUxpbmUgPSBuZXcgZmxvYXRbNF07CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1DbGlwQm91bmRzID0gbmV3IFJlY3QoKTsKKworICAgIHByaXZhdGUgRHJhd0ZpbHRlciBtRmlsdGVyOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1Db250ZXh0TG9ja2VkOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gSk5JCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuSXNBdmFpbGFibGUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNJc0F2YWlsYWJsZSA9IG5Jc0F2YWlsYWJsZSgpOworCisgICAgc3RhdGljIGJvb2xlYW4gaXNBdmFpbGFibGUoKSB7CisgICAgICAgIHJldHVybiBzSXNBdmFpbGFibGU7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ29uc3RydWN0b3JzCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBHTEVTMjBDYW52YXMoYm9vbGVhbiB0cmFuc2x1Y2VudCkgeworICAgICAgICB0aGlzKGZhbHNlLCB0cmFuc2x1Y2VudCk7CisgICAgfQorICAgIAorICAgIEdMRVMyMENhbnZhcyhib29sZWFuIHJlY29yZCwgYm9vbGVhbiB0cmFuc2x1Y2VudCkgeworICAgICAgICBtT3BhcXVlID0gIXRyYW5zbHVjZW50OworCisgICAgICAgIGlmIChyZWNvcmQpIHsKKyAgICAgICAgICAgIG1SZW5kZXJlciA9IG5DcmVhdGVEaXNwbGF5TGlzdFJlbmRlcmVyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVuZGVyZXIgPSBuQ3JlYXRlUmVuZGVyZXIoKTsKKyAgICAgICAgfQorICAgICAgIAorICAgICAgICBpZiAobVJlbmRlcmVyID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgR0xFUzIwQ2FudmFzIHJlbmRlcmVyIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbkNyZWF0ZVJlbmRlcmVyKCk7ICAgIAorICAgIHByaXZhdGUgbmF0aXZlIGludCBuQ3JlYXRlRGlzcGxheUxpc3RSZW5kZXJlcigpOyAgICAKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZXN0cm95KCkgeworICAgICAgICBpZiAobVJlbmRlcmVyICE9IDApIHsKKyAgICAgICAgICAgIG5EZXN0cm95UmVuZGVyZXIobVJlbmRlcmVyKTsKKyAgICAgICAgICAgIG1SZW5kZXJlciA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EZXN0cm95UmVuZGVyZXIoaW50IHJlbmRlcmVyKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIENhbnZhcyBtYW5hZ2VtZW50CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc09wYXF1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1PcGFxdWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRXaWR0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1XaWR0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldEhlaWdodCgpIHsKKyAgICAgICAgcmV0dXJuIG1IZWlnaHQ7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gU2V0dXAKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKworICAgICAgICBuU2V0Vmlld3BvcnQobVJlbmRlcmVyLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0Vmlld3BvcnQoaW50IHJlbmRlcmVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBvblByZURyYXcoKSB7CisgICAgICAgIG5QcmVwYXJlKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuUHJlcGFyZShpbnQgcmVuZGVyZXIpOworCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBvblBvc3REcmF3KCkgeworICAgICAgICBuRmluaXNoKG1SZW5kZXJlcik7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkZpbmlzaChpbnQgcmVuZGVyZXIpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYWNxdWlyZUNvbnRleHQoKSB7CisgICAgICAgIGlmICghbUNvbnRleHRMb2NrZWQpIHsKKyAgICAgICAgICAgIG5BY3F1aXJlQ29udGV4dChtUmVuZGVyZXIpOworICAgICAgICAgICAgbUNvbnRleHRMb2NrZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQ29udGV4dExvY2tlZDsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5BY3F1aXJlQ29udGV4dChpbnQgcmVuZGVyZXIpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVsZWFzZUNvbnRleHQoKSB7CisgICAgICAgIGlmIChtQ29udGV4dExvY2tlZCkgeworICAgICAgICAgICAgblJlbGVhc2VDb250ZXh0KG1SZW5kZXJlcik7CisgICAgICAgICAgICBtQ29udGV4dExvY2tlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuUmVsZWFzZUNvbnRleHQoaW50IHJlbmRlcmVyKTsKKyAgICAKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBEaXNwbGF5IGxpc3QKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIGludCBnZXREaXNwbGF5TGlzdCgpIHsKKyAgICAgICAgcmV0dXJuIG5DcmVhdGVEaXNwbGF5TGlzdChtUmVuZGVyZXIpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIGludCBuQ3JlYXRlRGlzcGxheUxpc3QoaW50IHJlbmRlcmVyKTsKKyAgICAKKyAgICB2b2lkIGRlc3Ryb3lEaXNwbGF5TGlzdChpbnQgZGlzcGxheUxpc3QpIHsKKyAgICAgICAgbkRlc3Ryb3lEaXNwbGF5TGlzdChkaXNwbGF5TGlzdCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRGVzdHJveURpc3BsYXlMaXN0KGludCBkaXNwbGF5TGlzdCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3RGlzcGxheUxpc3QoRGlzcGxheUxpc3QgZGlzcGxheUxpc3QpIHsKKyAgICAgICAgbkRyYXdEaXNwbGF5TGlzdChtUmVuZGVyZXIsICgoR0xFUzIwRGlzcGxheUxpc3QpIGRpc3BsYXlMaXN0KS5tTmF0aXZlRGlzcGxheUxpc3QpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdEaXNwbGF5TGlzdChpbnQgcmVuZGVyZXIsIGludCBkaXNwbGF5TGlzdCk7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBDbGlwcGluZworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFBhdGgoUGF0aCBwYXRoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBQYXRoKFBhdGggcGF0aCwgUmVnaW9uLk9wIG9wKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSkgeworICAgICAgICByZXR1cm4gbkNsaXBSZWN0KG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBSZWdpb24uT3AuSU5URVJTRUNULm5hdGl2ZUludCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbkNsaXBSZWN0KGludCByZW5kZXJlciwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLAorICAgICAgICAgICAgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IG9wKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgUmVnaW9uLk9wIG9wKSB7CisgICAgICAgIHJldHVybiBuQ2xpcFJlY3QobVJlbmRlcmVyLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIG9wLm5hdGl2ZUludCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlY3QoaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgeworICAgICAgICByZXR1cm4gbkNsaXBSZWN0KG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBSZWdpb24uT3AuSU5URVJTRUNULm5hdGl2ZUludCk7ICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuQ2xpcFJlY3QoaW50IHJlbmRlcmVyLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tLCBpbnQgb3ApOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlY3QoUmVjdCByZWN0KSB7CisgICAgICAgIHJldHVybiBuQ2xpcFJlY3QobVJlbmRlcmVyLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSwKKyAgICAgICAgICAgICAgICBSZWdpb24uT3AuSU5URVJTRUNULm5hdGl2ZUludCk7ICAgICAgICAKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChSZWN0IHJlY3QsIFJlZ2lvbi5PcCBvcCkgeworICAgICAgICByZXR1cm4gbkNsaXBSZWN0KG1SZW5kZXJlciwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sIG9wLm5hdGl2ZUludCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlY3QoUmVjdEYgcmVjdCkgeworICAgICAgICByZXR1cm4gbkNsaXBSZWN0KG1SZW5kZXJlciwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sCisgICAgICAgICAgICAgICAgUmVnaW9uLk9wLklOVEVSU0VDVC5uYXRpdmVJbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KFJlY3RGIHJlY3QsIFJlZ2lvbi5PcCBvcCkgeworICAgICAgICByZXR1cm4gbkNsaXBSZWN0KG1SZW5kZXJlciwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sIG9wLm5hdGl2ZUludCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlZ2lvbihSZWdpb24gcmVnaW9uKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWdpb24oUmVnaW9uIHJlZ2lvbiwgUmVnaW9uLk9wIG9wKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGdldENsaXBCb3VuZHMoUmVjdCBib3VuZHMpIHsKKyAgICAgICAgcmV0dXJuIG5HZXRDbGlwQm91bmRzKG1SZW5kZXJlciwgYm91bmRzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5HZXRDbGlwQm91bmRzKGludCByZW5kZXJlciwgUmVjdCBib3VuZHMpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcXVpY2tSZWplY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBFZGdlVHlwZSB0eXBlKSB7CisgICAgICAgIHJldHVybiBuUXVpY2tSZWplY3QobVJlbmRlcmVyLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHR5cGUubmF0aXZlSW50KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuUXVpY2tSZWplY3QoaW50IHJlbmRlcmVyLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsCisgICAgICAgICAgICBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBpbnQgZWRnZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBxdWlja1JlamVjdChQYXRoIHBhdGgsIEVkZ2VUeXBlIHR5cGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcXVpY2tSZWplY3QoUmVjdEYgcmVjdCwgRWRnZVR5cGUgdHlwZSkgeworICAgICAgICByZXR1cm4gcXVpY2tSZWplY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sIHR5cGUpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFRyYW5zZm9ybWF0aW9ucworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdHJhbnNsYXRlKGZsb2F0IGR4LCBmbG9hdCBkeSkgeworICAgICAgICBuVHJhbnNsYXRlKG1SZW5kZXJlciwgZHgsIGR5KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuVHJhbnNsYXRlKGludCByZW5kZXJlciwgZmxvYXQgZHgsIGZsb2F0IGR5KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNrZXcoZmxvYXQgc3gsIGZsb2F0IHN5KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJvdGF0ZShmbG9hdCBkZWdyZWVzKSB7CisgICAgICAgIG5Sb3RhdGUobVJlbmRlcmVyLCBkZWdyZWVzKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuUm90YXRlKGludCByZW5kZXJlciwgZmxvYXQgZGVncmVlcyk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzY2FsZShmbG9hdCBzeCwgZmxvYXQgc3kpIHsKKyAgICAgICAgblNjYWxlKG1SZW5kZXJlciwgc3gsIHN5KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2NhbGUoaW50IHJlbmRlcmVyLCBmbG9hdCBzeCwgZmxvYXQgc3kpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0TWF0cml4KE1hdHJpeCBtYXRyaXgpIHsKKyAgICAgICAgblNldE1hdHJpeChtUmVuZGVyZXIsIG1hdHJpeC5uYXRpdmVfaW5zdGFuY2UpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5TZXRNYXRyaXgoaW50IHJlbmRlcmVyLCBpbnQgbWF0cml4KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGdldE1hdHJpeChNYXRyaXggbWF0cml4KSB7CisgICAgICAgIG5HZXRNYXRyaXgobVJlbmRlcmVyLCBtYXRyaXgubmF0aXZlX2luc3RhbmNlKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuR2V0TWF0cml4KGludCByZW5kZXJlciwgaW50IG1hdHJpeCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb25jYXQoTWF0cml4IG1hdHJpeCkgeworICAgICAgICBuQ29uY2F0TWF0cml4KG1SZW5kZXJlciwgbWF0cml4Lm5hdGl2ZV9pbnN0YW5jZSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkNvbmNhdE1hdHJpeChpbnQgcmVuZGVyZXIsIGludCBtYXRyaXgpOworICAgIAorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFN0YXRlIG1hbmFnZW1lbnQKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2F2ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5TYXZlKG1SZW5kZXJlciwgQ2FudmFzLkNMSVBfU0FWRV9GTEFHIHwgQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNhdmUoaW50IHNhdmVGbGFncykgeworICAgICAgICByZXR1cm4gblNhdmUobVJlbmRlcmVyLCBzYXZlRmxhZ3MpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIGludCBuU2F2ZShpbnQgcmVuZGVyZXIsIGludCBmbGFncyk7CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzYXZlTGF5ZXIoUmVjdEYgYm91bmRzLCBQYWludCBwYWludCwgaW50IHNhdmVGbGFncykgeworICAgICAgICByZXR1cm4gc2F2ZUxheWVyKGJvdW5kcy5sZWZ0LCBib3VuZHMudG9wLCBib3VuZHMucmlnaHQsIGJvdW5kcy5ib3R0b20sIHBhaW50LCBzYXZlRmxhZ3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2F2ZUxheWVyKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgUGFpbnQgcGFpbnQsCisgICAgICAgICAgICBpbnQgc2F2ZUZsYWdzKSB7CisgICAgICAgIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OworICAgICAgICByZXR1cm4gblNhdmVMYXllcihtUmVuZGVyZXIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgbmF0aXZlUGFpbnQsIHNhdmVGbGFncyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5TYXZlTGF5ZXIoaW50IHJlbmRlcmVyLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBpbnQgcGFpbnQsIGludCBzYXZlRmxhZ3MpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzYXZlTGF5ZXJBbHBoYShSZWN0RiBib3VuZHMsIGludCBhbHBoYSwgaW50IHNhdmVGbGFncykgeworICAgICAgICByZXR1cm4gc2F2ZUxheWVyQWxwaGEoYm91bmRzLmxlZnQsIGJvdW5kcy50b3AsIGJvdW5kcy5yaWdodCwgYm91bmRzLmJvdHRvbSwKKyAgICAgICAgICAgICAgICBhbHBoYSwgc2F2ZUZsYWdzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNhdmVMYXllckFscGhhKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IGFscGhhLAorICAgICAgICAgICAgaW50IHNhdmVGbGFncykgeworICAgICAgICByZXR1cm4gblNhdmVMYXllckFscGhhKG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBhbHBoYSwgc2F2ZUZsYWdzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgblNhdmVMYXllckFscGhhKGludCByZW5kZXJlciwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwKKyAgICAgICAgICAgIGZsb2F0IGJvdHRvbSwgaW50IGFscGhhLCBpbnQgc2F2ZUZsYWdzKTsKKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXN0b3JlKCkgeworICAgICAgICBuUmVzdG9yZShtUmVuZGVyZXIpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5SZXN0b3JlKGludCByZW5kZXJlcik7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXN0b3JlVG9Db3VudChpbnQgc2F2ZUNvdW50KSB7CisgICAgICAgIG5SZXN0b3JlVG9Db3VudChtUmVuZGVyZXIsIHNhdmVDb3VudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuUmVzdG9yZVRvQ291bnQoaW50IHJlbmRlcmVyLCBpbnQgc2F2ZUNvdW50KTsKKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFNhdmVDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG5HZXRTYXZlQ291bnQobVJlbmRlcmVyKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5HZXRTYXZlQ291bnQoaW50IHJlbmRlcmVyKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEZpbHRlcmluZworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RHJhd0ZpbHRlcihEcmF3RmlsdGVyIGZpbHRlcikgeworICAgICAgICBtRmlsdGVyID0gZmlsdGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEcmF3RmlsdGVyIGdldERyYXdGaWx0ZXIoKSB7CisgICAgICAgIHJldHVybiBtRmlsdGVyOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIERyYXdpbmcKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdBcmMoUmVjdEYgb3ZhbCwgZmxvYXQgc3RhcnRBbmdsZSwgZmxvYXQgc3dlZXBBbmdsZSwgYm9vbGVhbiB1c2VDZW50ZXIsCisgICAgICAgICAgICBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3QVJHQihpbnQgYSwgaW50IHIsIGludCBnLCBpbnQgYikgeworICAgICAgICBkcmF3Q29sb3IoKGEgJiAweEZGKSA8PCAyNCB8IChyICYgMHhGRikgPDwgMTYgfCAoZyAmIDB4RkYpIDw8IDggfCAoYiAmIDB4RkYpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UGF0Y2goQml0bWFwIGJpdG1hcCwgYnl0ZVtdIGNodW5rcywgUmVjdEYgZHN0LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBTaGFkZXJzIGFyZSBpZ25vcmVkIHdoZW4gZHJhd2luZyBwYXRjaGVzCisgICAgICAgIGJvb2xlYW4gaGFzQ29sb3JGaWx0ZXIgPSBwYWludCAhPSBudWxsICYmIHNldHVwQ29sb3JGaWx0ZXIocGFpbnQpOworICAgICAgICBmaW5hbCBpbnQgbmF0aXZlUGFpbnQgPSBwYWludCA9PSBudWxsID8gMCA6IHBhaW50Lm1OYXRpdmVQYWludDsKKyAgICAgICAgbkRyYXdQYXRjaChtUmVuZGVyZXIsIGJpdG1hcC5tTmF0aXZlQml0bWFwLCBjaHVua3MsIGRzdC5sZWZ0LCBkc3QudG9wLAorICAgICAgICAgICAgICAgIGRzdC5yaWdodCwgZHN0LmJvdHRvbSwgbmF0aXZlUGFpbnQpOworICAgICAgICBpZiAoaGFzQ29sb3JGaWx0ZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdQYXRjaChpbnQgcmVuZGVyZXIsIGludCBiaXRtYXAsIGJ5dGVbXSBjaHVua3MsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwKKyAgICAgICAgICAgIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKEJpdG1hcCBiaXRtYXAsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gU2hhZGVycyBhcmUgaWdub3JlZCB3aGVuIGRyYXdpbmcgYml0bWFwcworICAgICAgICBib29sZWFuIGhhc0NvbG9yRmlsdGVyID0gcGFpbnQgIT0gbnVsbCAmJiBzZXR1cENvbG9yRmlsdGVyKHBhaW50KTsKKyAgICAgICAgZmluYWwgaW50IG5hdGl2ZVBhaW50ID0gcGFpbnQgPT0gbnVsbCA/IDAgOiBwYWludC5tTmF0aXZlUGFpbnQ7CisgICAgICAgIG5EcmF3Qml0bWFwKG1SZW5kZXJlciwgYml0bWFwLm1OYXRpdmVCaXRtYXAsIGxlZnQsIHRvcCwgbmF0aXZlUGFpbnQpOworICAgICAgICBpZiAoaGFzQ29sb3JGaWx0ZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdCaXRtYXAoaW50IHJlbmRlcmVyLCBpbnQgYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKEJpdG1hcCBiaXRtYXAsIE1hdHJpeCBtYXRyaXgsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFNoYWRlcnMgYXJlIGlnbm9yZWQgd2hlbiBkcmF3aW5nIGJpdG1hcHMKKyAgICAgICAgYm9vbGVhbiBoYXNDb2xvckZpbHRlciA9IHBhaW50ICE9IG51bGwgJiYgc2V0dXBDb2xvckZpbHRlcihwYWludCk7CisgICAgICAgIGZpbmFsIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OworICAgICAgICBuRHJhd0JpdG1hcChtUmVuZGVyZXIsIGJpdG1hcC5tTmF0aXZlQml0bWFwLCBtYXRyaXgubmF0aXZlX2luc3RhbmNlLCBuYXRpdmVQYWludCk7CisgICAgICAgIGlmIChoYXNDb2xvckZpbHRlcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd0JpdG1hcChpbnQgcmVuZGVyZXIsIGludCBiaXRtYXAsIGludCBtYXRyaXgsIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKEJpdG1hcCBiaXRtYXAsIFJlY3Qgc3JjLCBSZWN0IGRzdCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gU2hhZGVycyBhcmUgaWdub3JlZCB3aGVuIGRyYXdpbmcgYml0bWFwcworICAgICAgICBib29sZWFuIGhhc0NvbG9yRmlsdGVyID0gcGFpbnQgIT0gbnVsbCAmJiBzZXR1cENvbG9yRmlsdGVyKHBhaW50KTsKKyAgICAgICAgZmluYWwgaW50IG5hdGl2ZVBhaW50ID0gcGFpbnQgPT0gbnVsbCA/IDAgOiBwYWludC5tTmF0aXZlUGFpbnQ7CisKKyAgICAgICAgaW50IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKKyAgICAgICAgaWYgKHNyYyA9PSBudWxsKSB7CisgICAgICAgICAgICBsZWZ0ID0gdG9wID0gMDsKKyAgICAgICAgICAgIHJpZ2h0ID0gYml0bWFwLmdldFdpZHRoKCk7CisgICAgICAgICAgICBib3R0b20gPSBiaXRtYXAuZ2V0SGVpZ2h0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZWZ0ID0gc3JjLmxlZnQ7CisgICAgICAgICAgICByaWdodCA9IHNyYy5yaWdodDsKKyAgICAgICAgICAgIHRvcCA9IHNyYy50b3A7CisgICAgICAgICAgICBib3R0b20gPSBzcmMuYm90dG9tOworICAgICAgICB9CisKKyAgICAgICAgbkRyYXdCaXRtYXAobVJlbmRlcmVyLCBiaXRtYXAubU5hdGl2ZUJpdG1hcCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLAorICAgICAgICAgICAgICAgIGRzdC5sZWZ0LCBkc3QudG9wLCBkc3QucmlnaHQsIGRzdC5ib3R0b20sIG5hdGl2ZVBhaW50KTsKKyAgICAgICAgaWYgKGhhc0NvbG9yRmlsdGVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKEJpdG1hcCBiaXRtYXAsIFJlY3Qgc3JjLCBSZWN0RiBkc3QsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFNoYWRlcnMgYXJlIGlnbm9yZWQgd2hlbiBkcmF3aW5nIGJpdG1hcHMKKyAgICAgICAgYm9vbGVhbiBoYXNDb2xvckZpbHRlciA9IHBhaW50ICE9IG51bGwgJiYgc2V0dXBDb2xvckZpbHRlcihwYWludCk7CisgICAgICAgIGZpbmFsIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OworICAgICAgICBuRHJhd0JpdG1hcChtUmVuZGVyZXIsIGJpdG1hcC5tTmF0aXZlQml0bWFwLCBzcmMubGVmdCwgc3JjLnRvcCwgc3JjLnJpZ2h0LCBzcmMuYm90dG9tLAorICAgICAgICAgICAgICAgIGRzdC5sZWZ0LCBkc3QudG9wLCBkc3QucmlnaHQsIGRzdC5ib3R0b20sIG5hdGl2ZVBhaW50KTsKKyAgICAgICAgaWYgKGhhc0NvbG9yRmlsdGVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3Qml0bWFwKGludCByZW5kZXJlciwgaW50IGJpdG1hcCwKKyAgICAgICAgICAgIGZsb2F0IHNyY0xlZnQsIGZsb2F0IHNyY1RvcCwgZmxvYXQgc3JjUmlnaHQsIGZsb2F0IHNyY0JvdHRvbSwKKyAgICAgICAgICAgIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IHBhaW50KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdCaXRtYXAoaW50W10gY29sb3JzLCBpbnQgb2Zmc2V0LCBpbnQgc3RyaWRlLCBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sZWFuIGhhc0FscGhhLCBQYWludCBwYWludCkgeworICAgICAgICAvLyBTaGFkZXJzIGFyZSBpZ25vcmVkIHdoZW4gZHJhd2luZyBiaXRtYXBzCisgICAgICAgIGJvb2xlYW4gaGFzQ29sb3JGaWx0ZXIgPSBwYWludCAhPSBudWxsICYmIHNldHVwQ29sb3JGaWx0ZXIocGFpbnQpOworICAgICAgICBmaW5hbCBCaXRtYXAuQ29uZmlnIGNvbmZpZyA9IGhhc0FscGhhID8gQml0bWFwLkNvbmZpZy5BUkdCXzg4ODggOiBCaXRtYXAuQ29uZmlnLlJHQl81NjU7CisgICAgICAgIGZpbmFsIEJpdG1hcCBiID0gQml0bWFwLmNyZWF0ZUJpdG1hcChjb2xvcnMsIG9mZnNldCwgc3RyaWRlLCB3aWR0aCwgaGVpZ2h0LCBjb25maWcpOworICAgICAgICBmaW5hbCBpbnQgbmF0aXZlUGFpbnQgPSBwYWludCA9PSBudWxsID8gMCA6IHBhaW50Lm1OYXRpdmVQYWludDsKKyAgICAgICAgbkRyYXdCaXRtYXAobVJlbmRlcmVyLCBiLm1OYXRpdmVCaXRtYXAsIHgsIHksIG5hdGl2ZVBhaW50KTsKKyAgICAgICAgYi5yZWN5Y2xlKCk7CisgICAgICAgIGlmIChoYXNDb2xvckZpbHRlcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChpbnRbXSBjb2xvcnMsIGludCBvZmZzZXQsIGludCBzdHJpZGUsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiBoYXNBbHBoYSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gU2hhZGVycyBhcmUgaWdub3JlZCB3aGVuIGRyYXdpbmcgYml0bWFwcworICAgICAgICBkcmF3Qml0bWFwKGNvbG9ycywgb2Zmc2V0LCBzdHJpZGUsIChmbG9hdCkgeCwgKGZsb2F0KSB5LCB3aWR0aCwgaGVpZ2h0LCBoYXNBbHBoYSwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdCaXRtYXBNZXNoKEJpdG1hcCBiaXRtYXAsIGludCBtZXNoV2lkdGgsIGludCBtZXNoSGVpZ2h0LCBmbG9hdFtdIHZlcnRzLAorICAgICAgICAgICAgaW50IHZlcnRPZmZzZXQsIGludFtdIGNvbG9ycywgaW50IGNvbG9yT2Zmc2V0LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Q2lyY2xlKGZsb2F0IGN4LCBmbG9hdCBjeSwgZmxvYXQgcmFkaXVzLCBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Q29sb3IoaW50IGNvbG9yKSB7CisgICAgICAgIGRyYXdDb2xvcihjb2xvciwgUG9ydGVyRHVmZi5Nb2RlLlNSQ19PVkVSKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Q29sb3IoaW50IGNvbG9yLCBQb3J0ZXJEdWZmLk1vZGUgbW9kZSkgeworICAgICAgICBuRHJhd0NvbG9yKG1SZW5kZXJlciwgY29sb3IsIG1vZGUubmF0aXZlSW50KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd0NvbG9yKGludCByZW5kZXJlciwgaW50IGNvbG9yLCBpbnQgbW9kZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3TGluZShmbG9hdCBzdGFydFgsIGZsb2F0IHN0YXJ0WSwgZmxvYXQgc3RvcFgsIGZsb2F0IHN0b3BZLCBQYWludCBwYWludCkgeworICAgICAgICBtTGluZVswXSA9IHN0YXJ0WDsKKyAgICAgICAgbUxpbmVbMV0gPSBzdGFydFk7CisgICAgICAgIG1MaW5lWzJdID0gc3RvcFg7CisgICAgICAgIG1MaW5lWzNdID0gc3RvcFk7CisgICAgICAgIGRyYXdMaW5lcyhtTGluZSwgMCwgNCwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdMaW5lcyhmbG9hdFtdIHB0cywgaW50IG9mZnNldCwgaW50IGNvdW50LCBQYWludCBwYWludCkgeworICAgICAgICBpZiAoKG9mZnNldCB8IGNvdW50KSA8IDAgfHwgb2Zmc2V0ICsgY291bnQgPiBwdHMubGVuZ3RoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgbGluZXMgYXJyYXkgbXVzdCBjb250YWluIDQgZWxlbWVudHMgcGVyIGxpbmUuIik7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgbkRyYXdMaW5lcyhtUmVuZGVyZXIsIHB0cywgb2Zmc2V0LCBjb3VudCwgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgaWYgKGhhc01vZGlmaWVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3TGluZXMoaW50IHJlbmRlcmVyLCBmbG9hdFtdIHBvaW50cywgaW50IG9mZnNldCwgaW50IGNvdW50LCBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0xpbmVzKGZsb2F0W10gcHRzLCBQYWludCBwYWludCkgeworICAgICAgICBkcmF3TGluZXMocHRzLCAwLCBwdHMubGVuZ3RoLCBwYWludCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd092YWwoUmVjdEYgb3ZhbCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BhaW50KFBhaW50IHBhaW50KSB7CisgICAgICAgIGZpbmFsIFJlY3QgciA9IG1DbGlwQm91bmRzOworICAgICAgICBuR2V0Q2xpcEJvdW5kcyhtUmVuZGVyZXIsIHIpOworICAgICAgICBkcmF3UmVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQYXRoKFBhdGggcGF0aCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgaWYgKHBhdGguaXNTaW1wbGVQYXRoKSB7CisgICAgICAgICAgICBpZiAocGF0aC5yZWN0cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbkRyYXdSZWN0cyhtUmVuZGVyZXIsIHBhdGgucmVjdHMubU5hdGl2ZVJlZ2lvbiwgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5EcmF3UGF0aChtUmVuZGVyZXIsIHBhdGgubU5hdGl2ZVBhdGgsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhc01vZGlmaWVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3UGF0aChpbnQgcmVuZGVyZXIsIGludCBwYXRoLCBpbnQgcGFpbnQpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdSZWN0cyhpbnQgcmVuZGVyZXIsIGludCByZWdpb24sIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UGljdHVyZShQaWN0dXJlIHBpY3R1cmUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BpY3R1cmUoUGljdHVyZSBwaWN0dXJlLCBSZWN0IGRzdCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UGljdHVyZShQaWN0dXJlIHBpY3R1cmUsIFJlY3RGIGRzdCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9pbnQoZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgbVBvaW50WzBdID0geDsKKyAgICAgICAgbVBvaW50WzFdID0geTsKKyAgICAgICAgZHJhd1BvaW50cyhtUG9pbnQsIDAsIDEsIHBhaW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9pbnRzKGZsb2F0W10gcHRzLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFRPRE86IEltcGxlbWVudAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQb2ludHMoZmxvYXRbXSBwdHMsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGRyYXdQb2ludHMocHRzLCAwLCBwdHMubGVuZ3RoIC8gMiwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQb3NUZXh0KGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgZmxvYXRbXSBwb3MsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQb3NUZXh0KFN0cmluZyB0ZXh0LCBmbG9hdFtdIHBvcywgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1JlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBQYWludCBwYWludCkgeworICAgICAgICBib29sZWFuIGhhc01vZGlmaWVyID0gc2V0dXBNb2RpZmllcnMocGFpbnQpOworICAgICAgICBuRHJhd1JlY3QobVJlbmRlcmVyLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1JlY3QoaW50IHJlbmRlcmVyLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1JlY3QoUmVjdCByLCBQYWludCBwYWludCkgeworICAgICAgICBkcmF3UmVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSZWN0KFJlY3RGIHIsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGRyYXdSZWN0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tLCBwYWludCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1JHQihpbnQgciwgaW50IGcsIGludCBiKSB7CisgICAgICAgIGRyYXdDb2xvcigweEZGMDAwMDAwIHwgKHIgJiAweEZGKSA8PCAxNiB8IChnICYgMHhGRikgPDwgOCB8IChiICYgMHhGRikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSb3VuZFJlY3QoUmVjdEYgcmVjdCwgZmxvYXQgcngsIGZsb2F0IHJ5LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dChjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0IHgsIGZsb2F0IHksIFBhaW50IHBhaW50KSB7CisgICAgICAgIGlmICgoaW5kZXggfCBjb3VudCB8IChpbmRleCArIGNvdW50KSB8ICh0ZXh0Lmxlbmd0aCAtIGluZGV4IC0gY291bnQpKSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGhhc01vZGlmaWVyID0gc2V0dXBNb2RpZmllcnMocGFpbnQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbkRyYXdUZXh0KG1SZW5kZXJlciwgdGV4dCwgaW5kZXgsIGNvdW50LCB4LCB5LCBwYWludC5tQmlkaUZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGhhc01vZGlmaWVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3VGV4dChpbnQgcmVuZGVyZXIsIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgIGludCBiaWRpRmxhZ3MsIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dChDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICBib29sZWFuIGhhc01vZGlmaWVyID0gc2V0dXBNb2RpZmllcnMocGFpbnQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWRTdHJpbmcgfHwKKyAgICAgICAgICAgICAgICAgICAgdGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgeworICAgICAgICAgICAgICAgIG5EcmF3VGV4dChtUmVuZGVyZXIsIHRleHQudG9TdHJpbmcoKSwgc3RhcnQsIGVuZCwgeCwgeSwgcGFpbnQubUJpZGlGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRleHQgaW5zdGFuY2VvZiBHcmFwaGljc09wZXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAoKEdyYXBoaWNzT3BlcmF0aW9ucykgdGV4dCkuZHJhd1RleHQodGhpcywgc3RhcnQsIGVuZCwgeCwgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRlbXBvcmFyeUJ1ZmZlci5vYnRhaW4oZW5kIC0gc3RhcnQpOworICAgICAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOworICAgICAgICAgICAgICAgIG5EcmF3VGV4dChtUmVuZGVyZXIsIGJ1ZiwgMCwgZW5kIC0gc3RhcnQsIHgsIHksIHBhaW50Lm1CaWRpRmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgICAgICAgICAgVGVtcG9yYXJ5QnVmZmVyLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dChTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICBpZiAoKHN0YXJ0IHwgZW5kIHwgKGVuZCAtIHN0YXJ0KSB8ICh0ZXh0Lmxlbmd0aCgpIC0gZW5kKSkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5EcmF3VGV4dChtUmVuZGVyZXIsIHRleHQsIHN0YXJ0LCBlbmQsIHgsIHksIHBhaW50Lm1CaWRpRmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaGFzTW9kaWZpZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1RleHQoaW50IHJlbmRlcmVyLCBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICAgICAgaW50IGJpZGlGbGFncywgaW50IHBhaW50KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0KFN0cmluZyB0ZXh0LCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICBib29sZWFuIGhhc01vZGlmaWVyID0gc2V0dXBNb2RpZmllcnMocGFpbnQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbkRyYXdUZXh0KG1SZW5kZXJlciwgdGV4dCwgMCwgdGV4dC5sZW5ndGgoKSwgeCwgeSwgcGFpbnQubUJpZGlGbGFncywKKyAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dE9uUGF0aChjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIFBhdGggcGF0aCwgZmxvYXQgaE9mZnNldCwKKyAgICAgICAgICAgIGZsb2F0IHZPZmZzZXQsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0T25QYXRoKFN0cmluZyB0ZXh0LCBQYXRoIHBhdGgsIGZsb2F0IGhPZmZzZXQsIGZsb2F0IHZPZmZzZXQsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0UnVuKGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgaW50IGNvbnRleHRJbmRleCwgaW50IGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBkaXIsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGlmICgoaW5kZXggfCBjb3VudCB8IHRleHQubGVuZ3RoIC0gaW5kZXggLSBjb3VudCkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChkaXIgIT0gRElSRUNUSU9OX0xUUiAmJiBkaXIgIT0gRElSRUNUSU9OX1JUTCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBkaXJlY3Rpb246ICIgKyBkaXIpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5EcmF3VGV4dFJ1bihtUmVuZGVyZXIsIHRleHQsIGluZGV4LCBjb3VudCwgY29udGV4dEluZGV4LCBjb250ZXh0Q291bnQsIHgsIHksIGRpciwKKyAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3VGV4dFJ1bihpbnQgcmVuZGVyZXIsIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwKKyAgICAgICAgICAgIGludCBjb250ZXh0SW5kZXgsIGludCBjb250ZXh0Q291bnQsIGZsb2F0IHgsIGZsb2F0IHksIGludCBkaXIsIGludCBuYXRpdmVQYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dFJ1bihDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBkaXIsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGlmICgoc3RhcnQgfCBlbmQgfCBlbmQgLSBzdGFydCB8IHRleHQubGVuZ3RoKCkgLSBlbmQpIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaGFzTW9kaWZpZXIgPSBzZXR1cE1vZGlmaWVycyhwYWludCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgZmxhZ3MgPSBkaXIgPT0gMCA/IDAgOiAxOworICAgICAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWRTdHJpbmcgfHwKKyAgICAgICAgICAgICAgICAgICAgdGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgeworICAgICAgICAgICAgICAgIG5EcmF3VGV4dFJ1bihtUmVuZGVyZXIsIHRleHQudG9TdHJpbmcoKSwgc3RhcnQsIGVuZCwgY29udGV4dFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dEVuZCwgeCwgeSwgZmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRleHQgaW5zdGFuY2VvZiBHcmFwaGljc09wZXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAoKEdyYXBoaWNzT3BlcmF0aW9ucykgdGV4dCkuZHJhd1RleHRSdW4odGhpcywgc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgeCwgeSwgZmxhZ3MsIHBhaW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICAgICAgICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgICAgICAgICBjaGFyW10gYnVmID0gVGVtcG9yYXJ5QnVmZmVyLm9idGFpbihjb250ZXh0TGVuKTsKKyAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBidWYsIDApOworICAgICAgICAgICAgICAgIG5EcmF3VGV4dFJ1bihtUmVuZGVyZXIsIGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwgMCwgY29udGV4dExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIGZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICAgICAgICAgIFRlbXBvcmFyeUJ1ZmZlci5yZWN5Y2xlKGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaGFzTW9kaWZpZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1RleHRSdW4oaW50IHJlbmRlcmVyLCBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGZsb2F0IHgsIGZsb2F0IHksIGludCBmbGFncywgaW50IG5hdGl2ZVBhaW50KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdWZXJ0aWNlcyhWZXJ0ZXhNb2RlIG1vZGUsIGludCB2ZXJ0ZXhDb3VudCwgZmxvYXRbXSB2ZXJ0cywgaW50IHZlcnRPZmZzZXQsCisgICAgICAgICAgICBmbG9hdFtdIHRleHMsIGludCB0ZXhPZmZzZXQsIGludFtdIGNvbG9ycywgaW50IGNvbG9yT2Zmc2V0LCBzaG9ydFtdIGluZGljZXMsCisgICAgICAgICAgICBpbnQgaW5kZXhPZmZzZXQsIGludCBpbmRleENvdW50LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2V0dXBNb2RpZmllcnMoUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IGZhbHNlOworCisgICAgICAgIGlmIChwYWludC5oYXNTaGFkb3cpIHsKKyAgICAgICAgICAgIG5TZXR1cFNoYWRvdyhtUmVuZGVyZXIsIHBhaW50LnNoYWRvd1JhZGl1cywgcGFpbnQuc2hhZG93RHgsIHBhaW50LnNoYWRvd0R5LAorICAgICAgICAgICAgICAgICAgICBwYWludC5zaGFkb3dDb2xvcik7CisgICAgICAgICAgICBoYXNNb2RpZmllciA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTaGFkZXIgc2hhZGVyID0gcGFpbnQuZ2V0U2hhZGVyKCk7CisgICAgICAgIGlmIChzaGFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgblNldHVwU2hhZGVyKG1SZW5kZXJlciwgc2hhZGVyLm5hdGl2ZV9zaGFkZXIpOworICAgICAgICAgICAgaGFzTW9kaWZpZXIgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ29sb3JGaWx0ZXIgZmlsdGVyID0gcGFpbnQuZ2V0Q29sb3JGaWx0ZXIoKTsKKyAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBuU2V0dXBDb2xvckZpbHRlcihtUmVuZGVyZXIsIGZpbHRlci5uYXRpdmVDb2xvckZpbHRlcik7CisgICAgICAgICAgICBoYXNNb2RpZmllciA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaGFzTW9kaWZpZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNldHVwQ29sb3JGaWx0ZXIoUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgZmluYWwgQ29sb3JGaWx0ZXIgZmlsdGVyID0gcGFpbnQuZ2V0Q29sb3JGaWx0ZXIoKTsKKyAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBuU2V0dXBDb2xvckZpbHRlcihtUmVuZGVyZXIsIGZpbHRlci5uYXRpdmVDb2xvckZpbHRlcik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0dXBTaGFkZXIoaW50IHJlbmRlcmVyLCBpbnQgc2hhZGVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5TZXR1cENvbG9yRmlsdGVyKGludCByZW5kZXJlciwgaW50IGNvbG9yRmlsdGVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5TZXR1cFNoYWRvdyhpbnQgcmVuZGVyZXIsIGZsb2F0IHJhZGl1cywgZmxvYXQgZHgsIGZsb2F0IGR5LCBpbnQgY29sb3IpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuUmVzZXRNb2RpZmllcnMoaW50IHJlbmRlcmVyKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR0xFUzIwRGlzcGxheUxpc3QuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR0xFUzIwRGlzcGxheUxpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODg2YmYzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9HTEVTMjBEaXNwbGF5TGlzdC5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudmlldzsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBkaXNwbGF5IGxpc3QgZm9yIE9wZW5HTCBFUyAyLjAuCisgKi8KK2NsYXNzIEdMRVMyMERpc3BsYXlMaXN0IGV4dGVuZHMgRGlzcGxheUxpc3QgeworICAgIHByaXZhdGUgR0xFUzIwQ2FudmFzIG1DYW52YXM7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVJlY29yZGVkID0gZmFsc2U7CisKKyAgICBpbnQgbU5hdGl2ZURpc3BsYXlMaXN0OworCisgICAgQE92ZXJyaWRlCisgICAgSGFyZHdhcmVDYW52YXMgc3RhcnQoKSB7CisgICAgICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVjb3JkaW5nIGhhcyBhbHJlYWR5IHN0YXJ0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlc3Ryb3lDYW52YXMoKTsKKworICAgICAgICBtQ2FudmFzID0gbmV3IEdMRVMyMENhbnZhcyh0cnVlLCB0cnVlKTsKKyAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICBtUmVjb3JkZWQgPSBmYWxzZTsKKworICAgICAgICByZXR1cm4gbUNhbnZhczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVzdHJveUNhbnZhcygpIHsKKyAgICAgICAgaWYgKG1DYW52YXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNhbnZhcy5kZXN0cm95RGlzcGxheUxpc3QobU5hdGl2ZURpc3BsYXlMaXN0KTsKKyAgICAgICAgICAgIG1DYW52YXMuZGVzdHJveSgpOworCisgICAgICAgICAgICBtQ2FudmFzID0gbnVsbDsKKyAgICAgICAgICAgIG1OYXRpdmVEaXNwbGF5TGlzdCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIGVuZCgpIHsKKyAgICAgICAgaWYgKG1DYW52YXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1SZWNvcmRlZCA9IHRydWU7CisKKyAgICAgICAgICAgIG1OYXRpdmVEaXNwbGF5TGlzdCA9IG1DYW52YXMuZ2V0RGlzcGxheUxpc3QoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgZGVzdHJveUNhbnZhcygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIGJvb2xlYW4gaXNSZWFkeSgpIHsKKyAgICAgICAgcmV0dXJuICFtU3RhcnRlZCAmJiBtUmVjb3JkZWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9IYXJkd2FyZUNhbnZhcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9IYXJkd2FyZUNhbnZhcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZDJmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0hhcmR3YXJlQ2FudmFzLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3OworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CisKKy8qKgorICogSGFyZHdhcmUgYWNjZWxlcmF0ZWQgY2FudmFzLiAKKyAqLworYWJzdHJhY3QgY2xhc3MgSGFyZHdhcmVDYW52YXMgZXh0ZW5kcyBDYW52YXMgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Qml0bWFwKEJpdG1hcCBiaXRtYXApIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIDxzdHJvbmc+bXVzdDwvc3Ryb25nPiBiZSBjYWxsZWQgYmVmb3JlIHJlbGVhc2luZyBhCisgICAgICogcmVmZXJlbmNlIHRvIGEgaGFyZHdhcmUgY2FudmFzLiBUaGlzIG1ldGhvZCBpcyByZXNwb25zaWJsZSBmb3IKKyAgICAgKiBmcmVlaW5nIG5hdGl2ZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYXJkd2FyZS4gTm90CisgICAgICogaW52b2tpbmcgdGhpcyBtZXRob2QgcHJvcGVybHkgY2FuIHJlc3VsdCBpbiBtZW1vcnkgbGVha3MuCisgICAgICovICAgIAorICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRlc3Ryb3koKTsKKworICAgIC8qKgorICAgICAqIEludm9rZWQgYmVmb3JlIGFueSBkcmF3aW5nIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgaW4gdGhpcyBjYW52YXMuCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCBvblByZURyYXcoKTsKKworICAgIC8qKgorICAgICAqIEludm9rZWQgYWZ0ZXIgYWxsIGRyYXdpbmcgb3BlcmF0aW9uIGhhdmUgYmVlbiBwZXJmb3JtZWQuCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCBvblBvc3REcmF3KCk7CisgICAgCisgICAgLyoqCisgICAgICogRHJhd3MgdGhlIHNwZWNpZmllZCBkaXNwbGF5IGxpc3Qgb250byB0aGlzIGNhbnZhcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGlzcGxheUxpc3QgVGhlIGRpc3BsYXkgbGlzdCB0byByZXBsYXkuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgZHJhd0Rpc3BsYXlMaXN0KERpc3BsYXlMaXN0IGRpc3BsYXlMaXN0KTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVSZW5kZXJlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9IYXJkd2FyZVJlbmRlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNjNDA1MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVSZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsNjEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIGFuZHJvaWQudmlldzsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTA7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDExOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWc7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQ7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXk7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTFN1cmZhY2U7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0w7CisKKy8qKgorICogSW50ZXJmYWNlIGZvciByZW5kZXJpbmcgYSBWaWV3Um9vdCB1c2luZyBoYXJkd2FyZSBhY2NlbGVyYXRpb24uCisgKiAKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBIYXJkd2FyZVJlbmRlcmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJIYXJkd2FyZVJlbmRlcmVyIjsKKworICAgIC8qKgorICAgICAqIEEgcHJvY2VzcyBjYW4gc2V0IHRoaXMgZmxhZyB0byBmYWxzZSB0byBwcmV2ZW50IHRoZSB1c2Ugb2YgaGFyZHdhcmUKKyAgICAgKiByZW5kZXJpbmcuCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc1JlbmRlcmVyRGlzYWJsZWQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVJlcXVlc3RlZCA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgY3VycmVudCBwcm9jZXNzIGNhbm5vdCB1c2UgaGFyZHdhcmUgcmVuZGVyaW5nLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRpc2FibGUoKSB7CisgICAgICAgIHNSZW5kZXJlckRpc2FibGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaXMgYXZhaWxhYmxlIHVuZGVyIGFueSBmb3JtIGZvcgorICAgICAqIHRoZSB2aWV3IGhpZXJhcmNoeS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHZpZXcgaGllcmFyY2h5IGNhbiBwb3RlbnRpYWxseSBiZSBoYXJkd2FyZSBhY2NlbGVyYXRlZCwKKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIEdMRVMyMENhbnZhcy5pc0F2YWlsYWJsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlc3Ryb3lzIHRoZSBoYXJkd2FyZSByZW5kZXJpbmcgY29udGV4dC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnVsbCBJZiB0cnVlLCBkZXN0cm95cyBhbGwgYXNzb2NpYXRlZCByZXNvdXJjZXMuCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCBkZXN0cm95KGJvb2xlYW4gZnVsbCk7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB0aGUgaGFyZHdhcmUgcmVuZGVyZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3VyZmFjZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaG9sZGVyIFRoZSBob2xkZXIgZm9yIHRoZSBzdXJmYWNlIHRvIGhhcmR3YXJlIGFjY2VsZXJhdGUuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBpbml0aWFsaXphdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGFic3RyYWN0IGJvb2xlYW4gaW5pdGlhbGl6ZShTdXJmYWNlSG9sZGVyIGhvbGRlcik7CisKKyAgICAvKioKKyAgICAgKiBTZXR1cCB0aGUgaGFyZHdhcmUgcmVuZGVyZXIgZm9yIGRyYXdpbmcuIFRoaXMgaXMgY2FsbGVkIGZvciBldmVyeQorICAgICAqIGZyYW1lIHRvIGRyYXcuCisgICAgICogCisgICAgICogQHBhcmFtIHdpZHRoIFdpZHRoIG9mIHRoZSBkcmF3aW5nIHN1cmZhY2UuCisgICAgICogQHBhcmFtIGhlaWdodCBIZWlnaHQgb2YgdGhlIGRyYXdpbmcgc3VyZmFjZS4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCB2b2lkIHNldHVwKGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKyAgICAvKioKKyAgICAgKiBEcmF3cyB0aGUgc3BlY2lmaWVkIHZpZXcuCisgICAgICogCisgICAgICogQHBhcmFtIHZpZXcgVGhlIHZpZXcgdG8gZHJhdy4KKyAgICAgKiBAcGFyYW0gYXR0YWNoSW5mbyBBdHRhY2hJbmZvIHRpZWQgdG8gdGhlIHNwZWNpZmllZCB2aWV3LgorICAgICAqLworICAgIGFic3RyYWN0IHZvaWQgZHJhdyhWaWV3IHZpZXcsIFZpZXcuQXR0YWNoSW5mbyBhdHRhY2hJbmZvLCBpbnQgeU9mZnNldCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGNhbnZhcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlY29yZCBkcmF3aW5nIG9wZXJhdGlvbnMKKyAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIGRpc3BsYXkgbGlzdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEEgbmV3IHJlY29yZGluZyBjYW52YXMuCisgICAgICovCisgICAgYWJzdHJhY3QgRGlzcGxheUxpc3QgY3JlYXRlRGlzcGxheUxpc3QoKTsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBoYXJkd2FyZSByZW5kZXJlciBmb3IgdGhlIHNwZWNpZmllZCBzdXJmYWNlIGFuZCBzZXR1cCB0aGUKKyAgICAgKiByZW5kZXJlciBmb3IgZHJhd2luZywgaWYgbmVlZGVkLiBUaGlzIGlzIGludm9rZWQgd2hlbiB0aGUgVmlld1Jvb3QgaGFzCisgICAgICogcG90ZW50aWFsbHkgbG9zdCB0aGUgaGFyZHdhcmUgcmVuZGVyZXIuIFRoZSBoYXJkd2FyZSByZW5kZXJlciBzaG91bGQgYmUKKyAgICAgKiByZWluaXRpYWxpemVkIGFuZCBzZXR1cCB3aGVuIHRoZSByZW5kZXIge0BsaW5rICNpc1JlcXVlc3RlZCgpfSBhbmQKKyAgICAgKiB7QGxpbmsgI2lzRW5hYmxlZCgpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSBkcmF3aW5nIHN1cmZhY2UuCisgICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBkcmF3aW5nIHN1cmZhY2UuCisgICAgICogQHBhcmFtIGF0dGFjaEluZm8gVGhlIAorICAgICAqIEBwYXJhbSBob2xkZXIKKyAgICAgKi8KKyAgICB2b2lkIGluaXRpYWxpemVJZk5lZWRlZChpbnQgd2lkdGgsIGludCBoZWlnaHQsIFZpZXcuQXR0YWNoSW5mbyBhdHRhY2hJbmZvLAorICAgICAgICAgICAgU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKKyAgICAgICAgaWYgKGlzUmVxdWVzdGVkKCkpIHsKKyAgICAgICAgICAgIC8vIFdlIGxvc3QgdGhlIGdsIGNvbnRleHQsIHNvIHJlY3JlYXRlIGl0LgorICAgICAgICAgICAgaWYgKCFpc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGlmIChpbml0aWFsaXplKGhvbGRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0dXAod2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgaGFyZHdhcmUgcmVuZGVyZXIgdXNpbmcgT3BlbkdMLgorICAgICAqIAorICAgICAqIEBwYXJhbSBnbFZlcnNpb24gVGhlIHZlcnNpb24gb2YgT3BlbkdMIHRvIHVzZSAoMSBmb3IgT3BlbkdMIDEsIDExIGZvciBPcGVuR0wgMS4xLCBldGMuKQorICAgICAqIEBwYXJhbSB0cmFuc2x1Y2VudCBUcnVlIGlmIHRoZSBzdXJmYWNlIGlzIHRyYW5zbHVjZW50LCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEEgaGFyZHdhcmUgcmVuZGVyZXIgYmFja2VkIGJ5IE9wZW5HTC4KKyAgICAgKi8KKyAgICBzdGF0aWMgSGFyZHdhcmVSZW5kZXJlciBjcmVhdGVHbFJlbmRlcmVyKGludCBnbFZlcnNpb24sIGJvb2xlYW4gdHJhbnNsdWNlbnQpIHsKKyAgICAgICAgc3dpdGNoIChnbFZlcnNpb24pIHsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gR2wyMFJlbmRlcmVyLmNyZWF0ZSh0cmFuc2x1Y2VudCk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBHTCB2ZXJzaW9uOiAiICsgZ2xWZXJzaW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaXMgY3VycmVudGx5IGVuYWJsZWQuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBpbiB1c2UsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1FbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBjdXJyZW50bHkgZW5hYmxlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCBUcnVlIGlmIHRoZSBoYXJkd2FyZSByZW5kZXJlciBpcyBpbiB1c2UsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1FbmFibGVkID0gZW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaXMgY3VycmVudGx5IHJlcXVlc3QgYnV0IG5vdAorICAgICAqIG5lY2Vzc2FyaWx5IGVuYWJsZWQgeWV0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiByZXF1ZXN0ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzUmVxdWVzdGVkKCkgeworICAgICAgICByZXR1cm4gbVJlcXVlc3RlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaXMgY3VycmVudGx5IHJlcXVlc3QgYnV0IG5vdAorICAgICAqIG5lY2Vzc2FyaWx5IGVuYWJsZWQgeWV0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSB0byByZXF1ZXN0IGhhcmR3YXJlIGFjY2VsZXJhdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZvaWQgc2V0UmVxdWVzdGVkKGJvb2xlYW4gcmVxdWVzdGVkKSB7CisgICAgICAgIG1SZXF1ZXN0ZWQgPSByZXF1ZXN0ZWQ7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJkZXByZWNhdGlvbiJ9KQorICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBHbFJlbmRlcmVyIGV4dGVuZHMgSGFyZHdhcmVSZW5kZXJlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiA9IDB4MzA5ODsKKworICAgICAgICBzdGF0aWMgRUdMQ29udGV4dCBzRWdsQ29udGV4dDsKKyAgICAgICAgc3RhdGljIEVHTDEwIHNFZ2w7CisgICAgICAgIHN0YXRpYyBFR0xEaXNwbGF5IHNFZ2xEaXNwbGF5OworICAgICAgICBzdGF0aWMgRUdMQ29uZmlnIHNFZ2xDb25maWc7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkIHNFZ2xUaHJlYWQ7ICAgICAgICAKKworICAgICAgICBFR0xTdXJmYWNlIG1FZ2xTdXJmYWNlOworICAgICAgICAKKyAgICAgICAgR0wgbUdsOworICAgICAgICBHTEVTMjBDYW52YXMgbUNhbnZhczsKKworICAgICAgICBmaW5hbCBpbnQgbUdsVmVyc2lvbjsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBtVHJhbnNsdWNlbnQ7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1EZXN0cm95ZWQ7CisKKyAgICAgICAgR2xSZW5kZXJlcihpbnQgZ2xWZXJzaW9uLCBib29sZWFuIHRyYW5zbHVjZW50KSB7CisgICAgICAgICAgICBtR2xWZXJzaW9uID0gZ2xWZXJzaW9uOworICAgICAgICAgICAgbVRyYW5zbHVjZW50ID0gdHJhbnNsdWNlbnQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIGZvciBPcGVuR0wgZXJyb3JzLiBJZiBhbiBlcnJvciBoYXMgb2NjdXJlZCwge0BsaW5rICNkZXN0cm95KGJvb2xlYW4pfQorICAgICAgICAgKiBpcyBpbnZva2VkIGFuZCB0aGUgcmVxdWVzdGVkIGZsYWcgaXMgdHVybmVkIG9mZi4gVGhlIGVycm9yIGNvZGUgaXMKKyAgICAgICAgICogYWxzbyBsb2dnZWQgYXMgYSB3YXJuaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBjaGVja0VnbEVycm9ycygpIHsKKyAgICAgICAgICAgIGlmIChpc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGludCBlcnJvciA9IHNFZ2wuZWdsR2V0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyb3IgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGJhZCBoYXMgaGFwcGVuZWQgcmV2ZXJ0IHRvCisgICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbCByZW5kZXJpbmcuCisgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3kodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPSBFR0wxMS5FR0xfQ09OVEVYVF9MT1NUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSdsbCB0cnkgYWdhaW4gaWYgaXQgd2FzIGNvbnRleHQgbG9zdAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVxdWVzdGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRUdMIGVycm9yOiAiICsgSW50ZWdlci50b0hleFN0cmluZyhlcnJvcikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGJvb2xlYW4gaW5pdGlhbGl6ZShTdXJmYWNlSG9sZGVyIGhvbGRlcikgeworICAgICAgICAgICAgaWYgKGlzUmVxdWVzdGVkKCkgJiYgIWlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUVnbCgpOworICAgICAgICAgICAgICAgIG1HbCA9IGNyZWF0ZUVnbFN1cmZhY2UoaG9sZGVyKTsKKyAgICAgICAgICAgICAgICBtRGVzdHJveWVkID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBpZiAobUdsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVyciA9IHNFZ2wuZWdsR2V0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBFR0wxMC5FR0xfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJveSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFJlcXVlc3RlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNhbnZhcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbnZhcyA9IGNyZWF0ZUNhbnZhcygpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DYW52YXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJIYXJkd2FyZSBhY2NlbGVyYXRlZCBDYW52YXMgY291bGQgbm90IGJlIGNyZWF0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQ2FudmFzICE9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgYWJzdHJhY3QgR0xFUzIwQ2FudmFzIGNyZWF0ZUNhbnZhcygpOworCisgICAgICAgIHZvaWQgaW5pdGlhbGl6ZUVnbCgpIHsKKyAgICAgICAgICAgIGlmIChzRWdsQ29udGV4dCAhPSBudWxsKSByZXR1cm47CisKKyAgICAgICAgICAgIHNFZ2xUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOworICAgICAgICAgICAgc0VnbCA9IChFR0wxMCkgRUdMQ29udGV4dC5nZXRFR0woKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gR2V0IHRvIHRoZSBkZWZhdWx0IGRpc3BsYXkuCisgICAgICAgICAgICBzRWdsRGlzcGxheSA9IHNFZ2wuZWdsR2V0RGlzcGxheShFR0wxMC5FR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHNFZ2xEaXNwbGF5ID09IEVHTDEwLkVHTF9OT19ESVNQTEFZKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVnbEdldERpc3BsYXkgZmFpbGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFdlIGNhbiBub3cgaW5pdGlhbGl6ZSBFR0wgZm9yIHRoYXQgZGlzcGxheQorICAgICAgICAgICAgaW50W10gdmVyc2lvbiA9IG5ldyBpbnRbMl07CisgICAgICAgICAgICBpZiAoIXNFZ2wuZWdsSW5pdGlhbGl6ZShzRWdsRGlzcGxheSwgdmVyc2lvbikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsSW5pdGlhbGl6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNFZ2xDb25maWcgPSBnZXRDb25maWdDaG9vc2VyKG1HbFZlcnNpb24pLmNob29zZUNvbmZpZyhzRWdsLCBzRWdsRGlzcGxheSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIENyZWF0ZSBhbiBFR0wgY29udGV4dC4gV2Ugd2FudCB0byBkbyB0aGlzIGFzIHJhcmVseSBhcyB3ZSBjYW4sIGJlY2F1c2UgYW4KKyAgICAgICAgICAgICogRUdMIGNvbnRleHQgaXMgYSBzb21ld2hhdCBoZWF2eSBvYmplY3QuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgc0VnbENvbnRleHQgPSBjcmVhdGVDb250ZXh0KHNFZ2wsIHNFZ2xEaXNwbGF5LCBzRWdsQ29uZmlnKTsKKyAgICAgICAgfQorCisgICAgICAgIEdMIGNyZWF0ZUVnbFN1cmZhY2UoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIHByZWNvbmRpdGlvbnMuCisgICAgICAgICAgICBpZiAoc0VnbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVnbCBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzRWdsRGlzcGxheSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVnbERpc3BsYXkgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc0VnbENvbmZpZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm1FZ2xDb25maWcgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSAhPSBzRWdsVGhyZWFkKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSGFyZHdhcmVSZW5kZXJlciBjYW5ub3QgYmUgdXNlZCAiIAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZnJvbSBtdWx0aXBsZSB0aHJlYWRzIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiAgVGhlIHdpbmRvdyBzaXplIGhhcyBjaGFuZ2VkLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldworICAgICAgICAgICAgICogIHN1cmZhY2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChtRWdsU3VyZmFjZSAhPSBudWxsICYmIG1FZ2xTdXJmYWNlICE9IEVHTDEwLkVHTF9OT19TVVJGQUNFKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBVbmJpbmQgYW5kIGRlc3Ryb3kgdGhlIG9sZCBFR0wgc3VyZmFjZSwgaWYKKyAgICAgICAgICAgICAgICAgKiB0aGVyZSBpcyBvbmUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgc0VnbC5lZ2xNYWtlQ3VycmVudChzRWdsRGlzcGxheSwgRUdMMTAuRUdMX05PX1NVUkZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9fU1VSRkFDRSwgRUdMMTAuRUdMX05PX0NPTlRFWFQpOworICAgICAgICAgICAgICAgIHNFZ2wuZWdsRGVzdHJveVN1cmZhY2Uoc0VnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIEVHTCBzdXJmYWNlIHdlIGNhbiByZW5kZXIgaW50by4KKyAgICAgICAgICAgIG1FZ2xTdXJmYWNlID0gc0VnbC5lZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKHNFZ2xEaXNwbGF5LCBzRWdsQ29uZmlnLCBob2xkZXIsIG51bGwpOworCisgICAgICAgICAgICBpZiAobUVnbFN1cmZhY2UgPT0gbnVsbCB8fCBtRWdsU3VyZmFjZSA9PSBFR0wxMC5FR0xfTk9fU1VSRkFDRSkgeworICAgICAgICAgICAgICAgIGludCBlcnJvciA9IHNFZ2wuZWdsR2V0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPT0gRUdMMTAuRUdMX0JBRF9OQVRJVkVfV0lORE9XKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKCJFZ2xIZWxwZXIiLCAiY3JlYXRlV2luZG93U3VyZmFjZSByZXR1cm5lZCBFR0xfQkFEX05BVElWRV9XSU5ET1cuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY3JlYXRlV2luZG93U3VyZmFjZSBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEJlZm9yZSB3ZSBjYW4gaXNzdWUgR0wgY29tbWFuZHMsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCisgICAgICAgICAgICAgKiB0aGUgY29udGV4dCBpcyBjdXJyZW50IGFuZCBib3VuZCB0byBhIHN1cmZhY2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICghc0VnbC5lZ2xNYWtlQ3VycmVudChzRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UsIG1FZ2xTdXJmYWNlLCBzRWdsQ29udGV4dCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsTWFrZUN1cnJlbnQgZmFpbGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzRWdsQ29udGV4dC5nZXRHTCgpOworICAgICAgICB9CisKKyAgICAgICAgRUdMQ29udGV4dCBjcmVhdGVDb250ZXh0KEVHTDEwIGVnbCwgRUdMRGlzcGxheSBlZ2xEaXNwbGF5LCBFR0xDb25maWcgZWdsQ29uZmlnKSB7CisgICAgICAgICAgICBpbnRbXSBhdHRyaWJfbGlzdCA9IHsgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04sIG1HbFZlcnNpb24sIEVHTDEwLkVHTF9OT05FIH07CisKKyAgICAgICAgICAgIHJldHVybiBlZ2wuZWdsQ3JlYXRlQ29udGV4dChlZ2xEaXNwbGF5LCBlZ2xDb25maWcsIEVHTDEwLkVHTF9OT19DT05URVhULAorICAgICAgICAgICAgICAgICAgICBtR2xWZXJzaW9uICE9IDAgPyBhdHRyaWJfbGlzdCA6IG51bGwpOyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgaW5pdGlhbGl6ZUlmTmVlZGVkKGludCB3aWR0aCwgaW50IGhlaWdodCwgVmlldy5BdHRhY2hJbmZvIGF0dGFjaEluZm8sCisgICAgICAgICAgICAgICAgU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKKyAgICAgICAgICAgIGlmIChpc1JlcXVlc3RlZCgpKSB7CisgICAgICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcnMoKTsKKyAgICAgICAgICAgICAgICBzdXBlci5pbml0aWFsaXplSWZOZWVkZWQod2lkdGgsIGhlaWdodCwgYXR0YWNoSW5mbywgaG9sZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgZGVzdHJveShib29sZWFuIGZ1bGwpIHsKKyAgICAgICAgICAgIGlmIChmdWxsICYmIG1DYW52YXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DYW52YXMuZGVzdHJveSgpOworICAgICAgICAgICAgICAgIG1DYW52YXMgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIWlzRW5hYmxlZCgpIHx8IG1EZXN0cm95ZWQpIHJldHVybjsKKworICAgICAgICAgICAgbURlc3Ryb3llZCA9IHRydWU7CisKKyAgICAgICAgICAgIHNFZ2wuZWdsTWFrZUN1cnJlbnQoc0VnbERpc3BsYXksIEVHTDEwLkVHTF9OT19TVVJGQUNFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9fU1VSRkFDRSwgRUdMMTAuRUdMX05PX0NPTlRFWFQpOworICAgICAgICAgICAgc0VnbC5lZ2xEZXN0cm95U3VyZmFjZShzRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOworCisgICAgICAgICAgICBtRWdsU3VyZmFjZSA9IG51bGw7CisgICAgICAgICAgICBtR2wgPSBudWxsOworCisgICAgICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIHNldHVwKGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICAgICAgbUNhbnZhcy5zZXRWaWV3cG9ydCh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYm9vbGVhbiBjYW5EcmF3KCkgeworICAgICAgICAgICAgcmV0dXJuIG1HbCAhPSBudWxsICYmIG1DYW52YXMgIT0gbnVsbDsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIAorICAgICAgICB2b2lkIG9uUHJlRHJhdygpIHsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgb25Qb3N0RHJhdygpIHsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlZmluZXMgdGhlIEVHTCBjb25maWd1cmF0aW9uIGZvciB0aGlzIHJlbmRlcmVyLiBUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCisgICAgICAgICAqIGlzIFJHQlgsIG5vIGRlcHRoLCBubyBzdGVuY2lsLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiBBbiB7QGxpbmsgYW5kcm9pZC52aWV3LkhhcmR3YXJlUmVuZGVyZXIuR2xSZW5kZXJlci5FZ2xDb25maWdDaG9vc2VyfS4KKyAgICAgICAgICogQHBhcmFtIGdsVmVyc2lvbgorICAgICAgICAgKi8KKyAgICAgICAgRWdsQ29uZmlnQ2hvb3NlciBnZXRDb25maWdDaG9vc2VyKGludCBnbFZlcnNpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50U2l6ZUNob29zZXIoZ2xWZXJzaW9uLCA4LCA4LCA4LCA4LCAwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIGRyYXcoVmlldyB2aWV3LCBWaWV3LkF0dGFjaEluZm8gYXR0YWNoSW5mbywgaW50IHlPZmZzZXQpIHsKKyAgICAgICAgICAgIGlmIChjYW5EcmF3KCkpIHsKKyAgICAgICAgICAgICAgICBhdHRhY2hJbmZvLm1EcmF3aW5nVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGF0dGFjaEluZm8ubUlnbm9yZURpcnR5U3RhdGUgPSB0cnVlOworICAgICAgICAgICAgICAgIHZpZXcubVByaXZhdGVGbGFncyB8PSBWaWV3LkRSQVdOOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGxvbmcgc3RhcnRUaW1lOworICAgICAgICAgICAgICAgIGlmIChWaWV3RGVidWcuREVCVUdfUFJPRklMRV9EUkFXSU5HKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNoZWNrQ3VycmVudCgpOworCisgICAgICAgICAgICAgICAgb25QcmVEcmF3KCk7CisKKyAgICAgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gbUNhbnZhczsKKyAgICAgICAgICAgICAgICBpbnQgc2F2ZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAsIC15T2Zmc2V0KTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHZpZXcuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChzYXZlQ291bnQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG9uUG9zdERyYXcoKTsKKworICAgICAgICAgICAgICAgIGlmIChWaWV3RGVidWcuREVCVUdfUFJPRklMRV9EUkFXSU5HKSB7CisgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoNjAwMDAsIFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gc3RhcnRUaW1lKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhdHRhY2hJbmZvLm1JZ25vcmVEaXJ0eVN0YXRlID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBzRWdsLmVnbFN3YXBCdWZmZXJzKHNFZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7CisgICAgICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja0N1cnJlbnQoKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBEb24ndCBjaGVjayB0aGUgY3VycmVudCBjb250ZXh0IHdoZW4gd2UgaGF2ZSBvbmUgcGVyIFVJIHRocmVhZAorICAgICAgICAgICAgLy8gVE9ETzogVXNlIGEgdGhyZWFkbG9jYWwgZmxhZyB0byBrbm93IHdoZXRoZXIgdGhlIHN1cmZhY2UgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgIGlmIChzRWdsLmVnbEdldEN1cnJlbnRDb250ZXh0KCkgIT0gc0VnbENvbnRleHQgfHwKKyAgICAgICAgICAgICAgICAgICAgc0VnbC5lZ2xHZXRDdXJyZW50U3VyZmFjZShFR0wxMC5FR0xfRFJBVykgIT0gbUVnbFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNFZ2wuZWdsTWFrZUN1cnJlbnQoc0VnbERpc3BsYXksIG1FZ2xTdXJmYWNlLCBtRWdsU3VyZmFjZSwgc0VnbENvbnRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlZ2xNYWtlQ3VycmVudCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRWdsQ29uZmlnQ2hvb3NlciB7CisgICAgICAgICAgICBmaW5hbCBpbnRbXSBtQ29uZmlnU3BlYzsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1HbFZlcnNpb247CisKKyAgICAgICAgICAgIEVnbENvbmZpZ0Nob29zZXIoaW50IGdsVmVyc2lvbiwgaW50W10gY29uZmlnU3BlYykgeworICAgICAgICAgICAgICAgIG1HbFZlcnNpb24gPSBnbFZlcnNpb247CisgICAgICAgICAgICAgICAgbUNvbmZpZ1NwZWMgPSBmaWx0ZXJDb25maWdTcGVjKGNvbmZpZ1NwZWMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBFR0xDb25maWcgY2hvb3NlQ29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5KSB7CisgICAgICAgICAgICAgICAgaW50W10gaW5kZXggPSBuZXcgaW50WzFdOworICAgICAgICAgICAgICAgIGlmICghZWdsLmVnbENob29zZUNvbmZpZyhkaXNwbGF5LCBtQ29uZmlnU3BlYywgbnVsbCwgMCwgaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImVnbENob29zZUNvbmZpZyBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgbnVtQ29uZmlncyA9IGluZGV4WzBdOworICAgICAgICAgICAgICAgIGlmIChudW1Db25maWdzIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gY29uZmlncyBtYXRjaCBjb25maWdTcGVjIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgRUdMQ29uZmlnW10gY29uZmlncyA9IG5ldyBFR0xDb25maWdbbnVtQ29uZmlnc107CisgICAgICAgICAgICAgICAgaWYgKCFlZ2wuZWdsQ2hvb3NlQ29uZmlnKGRpc3BsYXksIG1Db25maWdTcGVjLCBjb25maWdzLCBudW1Db25maWdzLCBpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZWdsQ2hvb3NlQ29uZmlnIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEVHTENvbmZpZyBjb25maWcgPSBjaG9vc2VDb25maWcoZWdsLCBkaXNwbGF5LCBjb25maWdzKTsKKyAgICAgICAgICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gY29uZmlnIGNob3NlbiIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFic3RyYWN0IEVHTENvbmZpZyBjaG9vc2VDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZ1tdIGNvbmZpZ3MpOworCisgICAgICAgICAgICBwcml2YXRlIGludFtdIGZpbHRlckNvbmZpZ1NwZWMoaW50W10gY29uZmlnU3BlYykgeworICAgICAgICAgICAgICAgIGlmIChtR2xWZXJzaW9uICE9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1NwZWM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIFdlIGtub3cgbm9uZSBvZiB0aGUgc3ViY2xhc3NlcyBkZWZpbmUgRUdMX1JFTkRFUkFCTEVfVFlQRS4KKyAgICAgICAgICAgICAgICAgKiBBbmQgd2Uga25vdyB0aGUgY29uZmlnU3BlYyBpcyB3ZWxsIGZvcm1lZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gY29uZmlnU3BlYy5sZW5ndGg7CisgICAgICAgICAgICAgICAgaW50W10gbmV3Q29uZmlnU3BlYyA9IG5ldyBpbnRbbGVuICsgMl07CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjb25maWdTcGVjLCAwLCBuZXdDb25maWdTcGVjLCAwLCBsZW4gLSAxKTsKKyAgICAgICAgICAgICAgICBuZXdDb25maWdTcGVjW2xlbiAtIDFdID0gRUdMMTAuRUdMX1JFTkRFUkFCTEVfVFlQRTsKKyAgICAgICAgICAgICAgICBuZXdDb25maWdTcGVjW2xlbl0gPSA0OyAvKiBFR0xfT1BFTkdMX0VTMl9CSVQgKi8KKyAgICAgICAgICAgICAgICBuZXdDb25maWdTcGVjW2xlbiArIDFdID0gRUdMMTAuRUdMX05PTkU7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0NvbmZpZ1NwZWM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hvb3NlIGEgY29uZmlndXJhdGlvbiB3aXRoIGV4YWN0bHkgdGhlIHNwZWNpZmllZCByLGcsYixhIHNpemVzLAorICAgICAgICAgKiBhbmQgYXQgbGVhc3QgdGhlIHNwZWNpZmllZCBkZXB0aCBhbmQgc3RlbmNpbCBzaXplcy4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBjbGFzcyBDb21wb25lbnRTaXplQ2hvb3NlciBleHRlbmRzIEVnbENvbmZpZ0Nob29zZXIgeworICAgICAgICAgICAgcHJpdmF0ZSBpbnRbXSBtVmFsdWU7CisKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1SZWRTaXplOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbUdyZWVuU2l6ZTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1CbHVlU2l6ZTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1BbHBoYVNpemU7CisgICAgICAgICAgICBwcml2YXRlIGludCBtRGVwdGhTaXplOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbVN0ZW5jaWxTaXplOworCisgICAgICAgICAgICBDb21wb25lbnRTaXplQ2hvb3NlcihpbnQgZ2xWZXJzaW9uLCBpbnQgcmVkU2l6ZSwgaW50IGdyZWVuU2l6ZSwgaW50IGJsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFTaXplLCBpbnQgZGVwdGhTaXplLCBpbnQgc3RlbmNpbFNpemUpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihnbFZlcnNpb24sIG5ldyBpbnRbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVEX1NJWkUsIHJlZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfR1JFRU5fU0laRSwgZ3JlZW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwgYmx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQUxQSEFfU0laRSwgYWxwaGFTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0RFUFRIX1NJWkUsIGRlcHRoU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TVEVOQ0lMX1NJWkUsIHN0ZW5jaWxTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05PTkUgfSk7CisgICAgICAgICAgICAgICAgbVZhbHVlID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgICAgICBtUmVkU2l6ZSA9IHJlZFNpemU7CisgICAgICAgICAgICAgICAgbUdyZWVuU2l6ZSA9IGdyZWVuU2l6ZTsKKyAgICAgICAgICAgICAgICBtQmx1ZVNpemUgPSBibHVlU2l6ZTsKKyAgICAgICAgICAgICAgICBtQWxwaGFTaXplID0gYWxwaGFTaXplOworICAgICAgICAgICAgICAgIG1EZXB0aFNpemUgPSBkZXB0aFNpemU7CisgICAgICAgICAgICAgICAgbVN0ZW5jaWxTaXplID0gc3RlbmNpbFNpemU7CisgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBFR0xDb25maWcgY2hvb3NlQ29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWdbXSBjb25maWdzKSB7CisgICAgICAgICAgICAgICAgZm9yIChFR0xDb25maWcgY29uZmlnIDogY29uZmlncykgeworICAgICAgICAgICAgICAgICAgICBpbnQgZCA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9ERVBUSF9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHMgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLCBFR0wxMC5FR0xfU1RFTkNJTF9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGQgPj0gbURlcHRoU2l6ZSAmJiBzID49IG1TdGVuY2lsU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHIgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLCBFR0wxMC5FR0xfUkVEX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGcgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLCBFR0wxMC5FR0xfR1JFRU5fU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYiA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsIEVHTDEwLkVHTF9CTFVFX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGEgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLCBFR0wxMC5FR0xfQUxQSEFfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAociA+PSBtUmVkU2l6ZSAmJiBnID49IG1HcmVlblNpemUgJiYgYiA+PSBtQmx1ZVNpemUgJiYgYSA+PSBtQWxwaGFTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgZmluZENvbmZpZ0F0dHJpYihFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgaW50IGF0dHJpYnV0ZSwgaW50IGRlZmF1bHRWYWx1ZSkgeworICAgICAgICAgICAgICAgIGlmIChlZ2wuZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZywgYXR0cmlidXRlLCBtVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtVmFsdWVbMF07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhhcmR3YXJlIHJlbmRlcmVyIHVzaW5nIE9wZW5HTCBFUyAyLjAuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIEdsMjBSZW5kZXJlciBleHRlbmRzIEdsUmVuZGVyZXIgeworICAgICAgICBwcml2YXRlIEdMRVMyMENhbnZhcyBtR2xDYW52YXM7CisKKyAgICAgICAgR2wyMFJlbmRlcmVyKGJvb2xlYW4gdHJhbnNsdWNlbnQpIHsKKyAgICAgICAgICAgIHN1cGVyKDIsIHRyYW5zbHVjZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBHTEVTMjBDYW52YXMgY3JlYXRlQ2FudmFzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1HbENhbnZhcyA9IG5ldyBHTEVTMjBDYW52YXModHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBvblByZURyYXcoKSB7CisgICAgICAgICAgICBtR2xDYW52YXMub25QcmVEcmF3KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBvblBvc3REcmF3KCkgeworICAgICAgICAgICAgbUdsQ2FudmFzLm9uUG9zdERyYXcoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBEaXNwbGF5TGlzdCBjcmVhdGVEaXNwbGF5TGlzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgR0xFUzIwRGlzcGxheUxpc3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBIYXJkd2FyZVJlbmRlcmVyIGNyZWF0ZShib29sZWFuIHRyYW5zbHVjZW50KSB7CisgICAgICAgICAgICBpZiAoR0xFUzIwQ2FudmFzLmlzQXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEdsMjBSZW5kZXJlcih0cmFuc2x1Y2VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSVdpbmRvdy5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JV2luZG93LmFpZGwKaW5kZXggOTIxMDE4YS4uODVhOGMxYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JV2luZG93LmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JV2luZG93LmFpZGwKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRHJhZ0V2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiAKQEAgLTY0LDQgKzY1LDkgQEAKICAgICAKICAgICB2b2lkIGRpc3BhdGNoV2FsbHBhcGVyQ29tbWFuZChTdHJpbmcgYWN0aW9uLCBpbnQgeCwgaW50IHksCiAgICAgICAgICAgICBpbnQgeiwgaW4gQnVuZGxlIGV4dHJhcywgYm9vbGVhbiBzeW5jKTsKKworICAgIC8qKgorICAgICAqIERyYWcvZHJvcCBldmVudHMKKyAgICAgKi8KKyAgICAgdm9pZCBkaXNwYXRjaERyYWdFdmVudChpbiBEcmFnRXZlbnQgZXZlbnQpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JV2luZG93U2Vzc2lvbi5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JV2luZG93U2Vzc2lvbi5haWRsCmluZGV4IDdmMTBiNzYuLjc5ZWE1YjYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSVdpbmRvd1Nlc3Npb24uYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0lXaW5kb3dTZXNzaW9uLmFpZGwKQEAgLTE3LDYgKzE3LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGE7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKQEAgLTExNiw2ICsxMTcsMzAgQEAKICAgICBib29sZWFuIHBlcmZvcm1IYXB0aWNGZWVkYmFjayhJV2luZG93IHdpbmRvdywgaW50IGVmZmVjdElkLCBib29sZWFuIGFsd2F5cyk7CiAgICAgCiAgICAgLyoqCisgICAgICogQWxsb2NhdGUgdGhlIGRyYWcncyB0aHVtYm5haWwgc3VyZmFjZS4gIEFsc28gYXNzaWducyBhIHRva2VuIHRoYXQgaWRlbnRpZmllcworICAgICAqIHRoZSBkcmFnIHRvIHRoZSBPUyBhbmQgcGFzc2VzIHRoYXQgYXMgdGhlIHJldHVybiB2YWx1ZS4gIEEgcmV0dXJuIHZhbHVlIG9mCisgICAgICogbnVsbCBpbmRpY2F0ZXMgZmFpbHVyZS4KKyAgICAgKi8KKyAgICBJQmluZGVyIHByZXBhcmVEcmFnKElXaW5kb3cgd2luZG93LCBib29sZWFuIGxvY2FsT25seSwKKyAgICAgICAgICAgIGludCB0aHVtYm5haWxXaWR0aCwgaW50IHRodW1ibmFpbEhlaWdodCwgb3V0IFN1cmZhY2Ugb3V0U3VyZmFjZSk7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZSB0aGUgZHJhZyBvcGVyYXRpb24gaXRzZWxmCisgICAgICovCisgICAgYm9vbGVhbiBwZXJmb3JtRHJhZyhJV2luZG93IHdpbmRvdywgSUJpbmRlciBkcmFnVG9rZW4sIGZsb2F0IHRvdWNoWCwgZmxvYXQgdG91Y2hZLAorICAgICAgICAgICAgZmxvYXQgdGh1bWJDZW50ZXJYLCBmbG9hdCB0aHVtYkNlbnRlclksIGluIENsaXBEYXRhIGRhdGEpOworCisgICAgLyoqCisgICAgICogVGVsbCB0aGUgT1MgdGhhdCB3ZSd2ZSBqdXN0IGRyYWdnZWQgaW50byBhIFZpZXcgdGhhdCBpcyB3aWxsaW5nIHRvIGFjY2VwdCB0aGUgZHJvcAorICAgICAqLworICAgIHZvaWQgZHJhZ1JlY2lwaWVudEVudGVyZWQoSVdpbmRvdyB3aW5kb3cpOworCisgICAgLyoqCisgICAgICogVGVsbCB0aGUgT1MgdGhhdCB3ZSd2ZSBqdXN0IGRyYWdnZWQgKm9mZiogb2YgYSBWaWV3IHRoYXQgd2FzIHdpbGxpbmcgdG8gYWNjZXB0IHRoZSBkcm9wCisgICAgICovCisgICAgdm9pZCBkcmFnUmVjaXBpZW50RXhpdGVkKElXaW5kb3cgd2luZG93KTsKKworICAgIC8qKgogICAgICAqIEZvciB3aW5kb3dzIHdpdGggdGhlIHdhbGxwYXBlciBiZWhpbmQgdGhlbSwgYW5kIHRoZSB3YWxscGFwZXIgaXMKICAgICAgKiBsYXJnZXIgdGhhbiB0aGUgc2NyZWVuLCBzZXQgdGhlIG9mZnNldCB3aXRoaW4gdGhlIHNjcmVlbi4KICAgICAgKiBGb3IgbXVsdGkgc2NyZWVuIGxhdW5jaGVyIHR5cGUgYXBwbGljYXRpb25zLCB4c3RlcCBhbmQgeXN0ZXAgaW5kaWNhdGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTGF5b3V0SW5mbGF0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTGF5b3V0SW5mbGF0ZXIuamF2YQppbmRleCAxOTRjMDEzLi5kMjRhZjUyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0xheW91dEluZmxhdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlci5qYXZhCkBAIC0xNiwxNSArMTYsMTUgQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXc7CiAKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiAKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247Ci0KIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpAQCAtNjcsMTUgKzY3LDE2IEBACiAgICAgLy8gdGhlc2UgYXJlIG9wdGlvbmFsLCBzZXQgYnkgdGhlIGNhbGxlcgogICAgIHByaXZhdGUgYm9vbGVhbiBtRmFjdG9yeVNldDsKICAgICBwcml2YXRlIEZhY3RvcnkgbUZhY3Rvcnk7CisgICAgcHJpdmF0ZSBGYWN0b3J5MiBtRmFjdG9yeTI7CiAgICAgcHJpdmF0ZSBGaWx0ZXIgbUZpbHRlcjsKIAogICAgIHByaXZhdGUgZmluYWwgT2JqZWN0W10gbUNvbnN0cnVjdG9yQXJncyA9IG5ldyBPYmplY3RbMl07CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIG1Db25zdHJ1Y3RvclNpZ25hdHVyZSA9IG5ldyBDbGFzc1tdIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIG1Db25zdHJ1Y3RvclNpZ25hdHVyZSA9IG5ldyBDbGFzc1tdIHsKICAgICAgICAgICAgIENvbnRleHQuY2xhc3MsIEF0dHJpYnV0ZVNldC5jbGFzc307CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZywgQ29uc3RydWN0b3I+IHNDb25zdHJ1Y3Rvck1hcCA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbnN0cnVjdG9yPigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBDb25zdHJ1Y3Rvcjw/IGV4dGVuZHMgVmlldz4+IHNDb25zdHJ1Y3Rvck1hcCA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBWaWV3Pj4oKTsKICAgICAKICAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPiBtRmlsdGVyTWFwOwogCkBAIC05Nyw2ICs5OCw3IEBACiAgICAgICAgICAqIAogICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBjbGFzcyBpcyBhbGxvd2VkIHRvIGJlIGluZmxhdGVkLCBvciBmYWxzZSBvdGhlcndpc2UKICAgICAgICAgICovCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgICAgICBib29sZWFuIG9uTG9hZENsYXNzKENsYXNzIGNsYXp6KTsKICAgICB9CiAgICAgCkBAIC0xMjEsMTIgKzEyMywzMyBAQAogICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoU3RyaW5nIG5hbWUsIENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGYWN0b3J5TWVyZ2VyIGltcGxlbWVudHMgRmFjdG9yeSB7CisgICAgcHVibGljIGludGVyZmFjZSBGYWN0b3J5MiBleHRlbmRzIEZhY3RvcnkgeworICAgICAgICAvKioKKyAgICAgICAgICogVmVyc2lvbiBvZiB7QGxpbmsgI29uQ3JlYXRlVmlldyhTdHJpbmcsIENvbnRleHQsIEF0dHJpYnV0ZVNldCl9CisgICAgICAgICAqIHRoYXQgYWxzbyBzdXBwbGllcyB0aGUgcGFyZW50IHRoYXQgdGhlIHZpZXcgY3JlYXRlZCB2aWV3IHdpbGwgYmUKKyAgICAgICAgICogcGxhY2VkIGluLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgdGhhdCB0aGUgY3JlYXRlZCB2aWV3IHdpbGwgYmUgcGxhY2VkCisgICAgICAgICAqIGluOyA8ZW0+bm90ZSB0aGF0IHRoaXMgbWF5IGJlIG51bGw8L2VtPi4KKyAgICAgICAgICogQHBhcmFtIG5hbWUgVGFnIG5hbWUgdG8gYmUgaW5mbGF0ZWQuCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRoZSB2aWV3IGlzIGJlaW5nIGNyZWF0ZWQgaW4uCisgICAgICAgICAqIEBwYXJhbSBhdHRycyBJbmZsYXRpb24gYXR0cmlidXRlcyBhcyBzcGVjaWZpZWQgaW4gWE1MIGZpbGUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVmlldyBOZXdseSBjcmVhdGVkIHZpZXcuIFJldHVybiBudWxsIGZvciB0aGUgZGVmYXVsdAorICAgICAgICAgKiAgICAgICAgIGJlaGF2aW9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KFZpZXcgcGFyZW50LCBTdHJpbmcgbmFtZSwgQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZhY3RvcnlNZXJnZXIgaW1wbGVtZW50cyBGYWN0b3J5MiB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgRmFjdG9yeSBtRjEsIG1GMjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBGYWN0b3J5MiBtRjEyLCBtRjIyOwogICAgICAgICAKLSAgICAgICAgRmFjdG9yeU1lcmdlcihGYWN0b3J5IGYxLCBGYWN0b3J5IGYyKSB7CisgICAgICAgIEZhY3RvcnlNZXJnZXIoRmFjdG9yeSBmMSwgRmFjdG9yeTIgZjEyLCBGYWN0b3J5IGYyLCBGYWN0b3J5MiBmMjIpIHsKICAgICAgICAgICAgIG1GMSA9IGYxOwogICAgICAgICAgICAgbUYyID0gZjI7CisgICAgICAgICAgICBtRjEyID0gZjEyOworICAgICAgICAgICAgbUYyMiA9IGYyMjsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KFN0cmluZyBuYW1lLCBDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewpAQCAtMTM0LDYgKzE1NywxNCBAQAogICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCkgcmV0dXJuIHY7CiAgICAgICAgICAgICByZXR1cm4gbUYyLm9uQ3JlYXRlVmlldyhuYW1lLCBjb250ZXh0LCBhdHRycyk7CiAgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoVmlldyBwYXJlbnQsIFN0cmluZyBuYW1lLCBDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICAgICAgVmlldyB2ID0gbUYxMiAhPSBudWxsID8gbUYxMi5vbkNyZWF0ZVZpZXcocGFyZW50LCBuYW1lLCBjb250ZXh0LCBhdHRycykKKyAgICAgICAgICAgICAgICAgICAgOiBtRjEub25DcmVhdGVWaWV3KG5hbWUsIGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgICAgIGlmICh2ICE9IG51bGwpIHJldHVybiB2OworICAgICAgICAgICAgcmV0dXJuIG1GMjIgIT0gbnVsbCA/IG1GMjIub25DcmVhdGVWaWV3KHBhcmVudCwgbmFtZSwgY29udGV4dCwgYXR0cnMpCisgICAgICAgICAgICAgICAgICAgIDogbUYyLm9uQ3JlYXRlVmlldyhuYW1lLCBjb250ZXh0LCBhdHRycyk7CisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xNjEsNiArMTkyLDcgQEAKICAgICBwcm90ZWN0ZWQgTGF5b3V0SW5mbGF0ZXIoTGF5b3V0SW5mbGF0ZXIgb3JpZ2luYWwsIENvbnRleHQgbmV3Q29udGV4dCkgewogICAgICAgICBtQ29udGV4dCA9IG5ld0NvbnRleHQ7CiAgICAgICAgIG1GYWN0b3J5ID0gb3JpZ2luYWwubUZhY3Rvcnk7CisgICAgICAgIG1GYWN0b3J5MiA9IG9yaWdpbmFsLm1GYWN0b3J5MjsKICAgICAgICAgbUZpbHRlciA9IG9yaWdpbmFsLm1GaWx0ZXI7CiAgICAgfQogICAgIApAQCAtMTk5LDcgKzIzMSw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjdXJyZW50IGZhY3RvcnkgKG9yIG51bGwpLiBUaGlzIGlzIGNhbGxlZCBvbiBlYWNoIGVsZW1lbnQKKyAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQge0BsaW5rIEZhY3Rvcnl9IChvciBudWxsKS4gVGhpcyBpcyBjYWxsZWQgb24gZWFjaCBlbGVtZW50CiAgICAgICogbmFtZS4gSWYgdGhlIGZhY3RvcnkgcmV0dXJucyBhIFZpZXcsIGFkZCB0aGF0IHRvIHRoZSBoaWVyYXJjaHkuIElmIGl0CiAgICAgICogcmV0dXJucyBudWxsLCBwcm9jZWVkIHRvIGNhbGwgb25DcmVhdGVWaWV3KG5hbWUpLgogICAgICAqLwpAQCAtMjA4LDYgKzI0MCwxNyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB7QGxpbmsgRmFjdG9yeTJ9LiAgUmV0dXJucyBudWxsIGlmIG5vIGZhY3RvcnkgaXMgc2V0CisgICAgICogb3IgdGhlIHNldCBmYWN0b3J5IGRvZXMgbm90IGltcGxlbWVudCB0aGUge0BsaW5rIEZhY3RvcnkyfSBpbnRlcmZhY2UuCisgICAgICogVGhpcyBpcyBjYWxsZWQgb24gZWFjaCBlbGVtZW50CisgICAgICogbmFtZS4gSWYgdGhlIGZhY3RvcnkgcmV0dXJucyBhIFZpZXcsIGFkZCB0aGF0IHRvIHRoZSBoaWVyYXJjaHkuIElmIGl0CisgICAgICogcmV0dXJucyBudWxsLCBwcm9jZWVkIHRvIGNhbGwgb25DcmVhdGVWaWV3KG5hbWUpLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBGYWN0b3J5MiBnZXRGYWN0b3J5MigpIHsKKyAgICAgICAgcmV0dXJuIG1GYWN0b3J5MjsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBBdHRhY2ggYSBjdXN0b20gRmFjdG9yeSBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIHZpZXdzIHdoaWxlIHVzaW5nCiAgICAgICogdGhpcyBMYXlvdXRJbmZsYXRlci4gIFRoaXMgbXVzdCBub3QgYmUgbnVsbCwgYW5kIGNhbiBvbmx5IGJlIHNldCBvbmNlOwogICAgICAqIGFmdGVyIHNldHRpbmcsIHlvdSBjYW4gbm90IGNoYW5nZSB0aGUgZmFjdG9yeS4gIFRoaXMgaXMKQEAgLTIzMyw3ICsyNzYsMjYgQEAKICAgICAgICAgaWYgKG1GYWN0b3J5ID09IG51bGwpIHsKICAgICAgICAgICAgIG1GYWN0b3J5ID0gZmFjdG9yeTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1GYWN0b3J5ID0gbmV3IEZhY3RvcnlNZXJnZXIoZmFjdG9yeSwgbUZhY3RvcnkpOworICAgICAgICAgICAgbUZhY3RvcnkgPSBuZXcgRmFjdG9yeU1lcmdlcihmYWN0b3J5LCBudWxsLCBtRmFjdG9yeSwgbUZhY3RvcnkyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIExpa2Uge0BsaW5rICNzZXRGYWN0b3J5fSwgYnV0IGFsbG93cyB5b3UgdG8gc2V0IGEge0BsaW5rIEZhY3RvcnkyfQorICAgICAqIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGYWN0b3J5MihGYWN0b3J5MiBmYWN0b3J5KSB7CisgICAgICAgIGlmIChtRmFjdG9yeVNldCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQSBmYWN0b3J5IGhhcyBhbHJlYWR5IGJlZW4gc2V0IG9uIHRoaXMgTGF5b3V0SW5mbGF0ZXIiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkdpdmVuIGZhY3RvcnkgY2FuIG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgbUZhY3RvcnlTZXQgPSB0cnVlOworICAgICAgICBpZiAobUZhY3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgbUZhY3RvcnkgPSBtRmFjdG9yeTIgPSBmYWN0b3J5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUZhY3RvcnkgPSBuZXcgRmFjdG9yeU1lcmdlcihmYWN0b3J5LCBmYWN0b3J5LCBtRmFjdG9yeSwgbUZhY3RvcnkyKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzgwLDEwICs0NDIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVmlld0dyb3VwIHJvb3QgYW5kIGF0dGFjaFRvUm9vdD10cnVlIik7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHJvb3QsIGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgckluZmxhdGUocGFyc2VyLCByb290LCBhdHRycywgZmFsc2UpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRlbXAgaXMgdGhlIHJvb3QgdmlldyB0aGF0IHdhcyBmb3VuZCBpbiB0aGUgeG1sCi0gICAgICAgICAgICAgICAgICAgIFZpZXcgdGVtcCA9IGNyZWF0ZVZpZXdGcm9tVGFnKG5hbWUsIGF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgVmlldyB0ZW1wID0gY3JlYXRlVmlld0Zyb21UYWcocm9vdCwgbmFtZSwgYXR0cnMpOwogCiAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zID0gbnVsbDsKIApAQCAtNDA1LDcgKzQ2Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tPiBzdGFydCBpbmZsYXRpbmcgY2hpbGRyZW4iKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAvLyBJbmZsYXRlIGFsbCBjaGlsZHJlbiB1bmRlciB0ZW1wCi0gICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKHBhcnNlciwgdGVtcCwgYXR0cnMpOworICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHRlbXAsIGF0dHJzLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tPiBkb25lIGluZmxhdGluZyBjaGlsZHJlbiIpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC00NTgsMTggKzUyMCwxOCBAQAogICAgICAqIEBwYXJhbSBuYW1lIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIGluc3RhbnRpYXRlZC4KICAgICAgKiBAcGFyYW0gYXR0cnMgVGhlIFhNTCBhdHRyaWJ1dGVzIHN1cHBsaWVkIGZvciB0aGlzIGluc3RhbmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVmlldyBUaGUgbmV3bHkgaW5zdGFudGllZCB2aWV3LCBvciBudWxsLgorICAgICAqIEByZXR1cm4gVmlldyBUaGUgbmV3bHkgaW5zdGFudGlhdGVkIHZpZXcsIG9yIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFZpZXcgY3JlYXRlVmlldyhTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCwgQXR0cmlidXRlU2V0IGF0dHJzKQogICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIEluZmxhdGVFeGNlcHRpb24gewotICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHNDb25zdHJ1Y3Rvck1hcC5nZXQobmFtZSk7Ci0gICAgICAgIENsYXNzIGNsYXp6ID0gbnVsbDsKKyAgICAgICAgQ29uc3RydWN0b3I8PyBleHRlbmRzIFZpZXc+IGNvbnN0cnVjdG9yID0gc0NvbnN0cnVjdG9yTWFwLmdldChuYW1lKTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZpZXc+IGNsYXp6ID0gbnVsbDsKIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAvLyBDbGFzcyBub3QgZm91bmQgaW4gdGhlIGNhY2hlLCBzZWUgaWYgaXQncyByZWFsLCBhbmQgdHJ5IHRvIGFkZCBpdAogICAgICAgICAgICAgICAgIGNsYXp6ID0gbUNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggIT0gbnVsbCA/IChwcmVmaXggKyBuYW1lKSA6IG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICE9IG51bGwgPyAocHJlZml4ICsgbmFtZSkgOiBuYW1lKS5hc1N1YmNsYXNzKFZpZXcuY2xhc3MpOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIGlmIChtRmlsdGVyICE9IG51bGwgJiYgY2xhenogIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFsbG93ZWQgPSBtRmlsdGVyLm9uTG9hZENsYXNzKGNsYXp6KTsKQEAgLTQ4Nyw3ICs1NDksNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZFN0YXRlID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBjbGFzcyAtLSByZW1lbWJlciB3aGV0aGVyIGl0IGlzIGFsbG93ZWQKICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6ID0gbUNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCAhPSBudWxsID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCAhPSBudWxsID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSkuYXNTdWJjbGFzcyhWaWV3LmNsYXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbGxvd2VkID0gY2xhenogIT0gbnVsbCAmJiBtRmlsdGVyLm9uTG9hZENsYXNzKGNsYXp6KTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1GaWx0ZXJNYXAucHV0KG5hbWUsIGFsbG93ZWQpOwpAQCAtNTAyLDcgKzU2NCw3IEBACiAKICAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBtQ29uc3RydWN0b3JBcmdzOwogICAgICAgICAgICAgYXJnc1sxXSA9IGF0dHJzOwotICAgICAgICAgICAgcmV0dXJuIChWaWV3KSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShhcmdzKTsKKyAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShhcmdzKTsKIAogICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgSW5mbGF0ZUV4Y2VwdGlvbiBpZSA9IG5ldyBJbmZsYXRlRXhjZXB0aW9uKGF0dHJzLmdldFBvc2l0aW9uRGVzY3JpcHRpb24oKQpAQCAtNTExLDYgKzU3MywxMyBAQAogICAgICAgICAgICAgaWUuaW5pdENhdXNlKGUpOwogICAgICAgICAgICAgdGhyb3cgaWU7CiAKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIElmIGxvYWRlZCBjbGFzcyBpcyBub3QgYSBWaWV3IHN1YmNsYXNzCisgICAgICAgICAgICBJbmZsYXRlRXhjZXB0aW9uIGllID0gbmV3IEluZmxhdGVFeGNlcHRpb24oYXR0cnMuZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpCisgICAgICAgICAgICAgICAgICAgICsgIjogQ2xhc3MgaXMgbm90IGEgVmlldyAiCisgICAgICAgICAgICAgICAgICAgICsgKHByZWZpeCAhPSBudWxsID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSkpOworICAgICAgICAgICAgaWUuaW5pdENhdXNlKGUpOworICAgICAgICAgICAgdGhyb3cgaWU7CiAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gSWYgbG9hZENsYXNzIGZhaWxzLCB3ZSBzaG91bGQgcHJvcGFnYXRlIHRoZSBleGNlcHRpb24uCiAgICAgICAgICAgICB0aHJvdyBlOwpAQCAtNTI0LDcgKzU5Myw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhyb3cgYW4gZXhjcGV0aW9uIGJlY2F1c2UgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBub3QgYWxsb3dlZCB0byBiZSBpbmZsYXRlZC4KKyAgICAgKiBUaHJvdyBhbiBleGNlcHRpb24gYmVjYXVzZSB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIG5vdCBhbGxvd2VkIHRvIGJlIGluZmxhdGVkLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBmYWlsTm90QWxsb3dlZChTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CiAgICAgICAgIEluZmxhdGVFeGNlcHRpb24gaWUgPSBuZXcgSW5mbGF0ZUV4Y2VwdGlvbihhdHRycy5nZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkKQEAgLTU0OSwxMCArNjE4LDI3IEBACiAgICAgICAgIHJldHVybiBjcmVhdGVWaWV3KG5hbWUsICJhbmRyb2lkLnZpZXcuIiwgYXR0cnMpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFZlcnNpb24gb2Yge0BsaW5rICNvbkNyZWF0ZVZpZXcoU3RyaW5nLCBBdHRyaWJ1dGVTZXQpfSB0aGF0IGFsc28KKyAgICAgKiB0YWtlcyB0aGUgZnV0dXJlIHBhcmVudCBvZiB0aGUgdmlldyBiZWluZyBjb25zdHJ1Y3R1cmUuICBUaGUgZGVmYXVsdAorICAgICAqIGltcGxlbWVudGF0aW9uIHNpbXBseSBjYWxscyB7QGxpbmsgI29uQ3JlYXRlVmlldyhTdHJpbmcsIEF0dHJpYnV0ZVNldCl9LgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgZnV0dXJlIHBhcmVudCBvZiB0aGUgcmV0dXJuZWQgdmlldy4gIDxlbT5Ob3RlIHRoYXQKKyAgICAgKiB0aGlzIG1heSBiZSBudWxsLjwvZW0+CisgICAgICogQHBhcmFtIG5hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBWaWV3IHRvIGJlIGNyZWF0ZS4KKyAgICAgKiBAcGFyYW0gYXR0cnMgQW4gQXR0cmlidXRlU2V0IG9mIGF0dHJpYnV0ZXMgdG8gYXBwbHkgdG8gdGhlIFZpZXcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFZpZXcgVGhlIFZpZXcgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVmlldyBvbkNyZWF0ZVZpZXcoVmlldyBwYXJlbnQsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVTZXQgYXR0cnMpCisgICAgICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBvbkNyZWF0ZVZpZXcobmFtZSwgYXR0cnMpOworICAgIH0KKwogICAgIC8qCiAgICAgICogZGVmYXVsdCB2aXNpYmlsaXR5IHNvIHRoZSBCcmlkZ2VJbmZsYXRlciBjYW4gb3ZlcnJpZGUgaXQuCiAgICAgICovCi0gICAgVmlldyBjcmVhdGVWaWV3RnJvbVRhZyhTdHJpbmcgbmFtZSwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgVmlldyBjcmVhdGVWaWV3RnJvbVRhZyhWaWV3IHBhcmVudCwgU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZVNldCBhdHRycykgewogICAgICAgICBpZiAobmFtZS5lcXVhbHMoInZpZXciKSkgewogICAgICAgICAgICAgbmFtZSA9IGF0dHJzLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJjbGFzcyIpOwogICAgICAgICB9CkBAIC01NjAsMTIgKzY0NiwxNCBAQAogICAgICAgICBpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKiogQ3JlYXRpbmcgdmlldzogIiArIG5hbWUpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSAobUZhY3RvcnkgPT0gbnVsbCkgPyBudWxsIDogbUZhY3Rvcnkub25DcmVhdGVWaWV3KG5hbWUsCi0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LCBhdHRycyk7CisgICAgICAgICAgICBWaWV3IHZpZXc7CisgICAgICAgICAgICBpZiAobUZhY3RvcnkyICE9IG51bGwpIHZpZXcgPSBtRmFjdG9yeTIub25DcmVhdGVWaWV3KHBhcmVudCwgbmFtZSwgbUNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKG1GYWN0b3J5ICE9IG51bGwpIHZpZXcgPSBtRmFjdG9yeS5vbkNyZWF0ZVZpZXcobmFtZSwgbUNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgICAgIGVsc2UgdmlldyA9IG51bGw7CiAKICAgICAgICAgICAgIGlmICh2aWV3ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBpZiAoLTEgPT0gbmFtZS5pbmRleE9mKCcuJykpIHsKLSAgICAgICAgICAgICAgICAgICAgdmlldyA9IG9uQ3JlYXRlVmlldyhuYW1lLCBhdHRycyk7CisgICAgICAgICAgICAgICAgICAgIHZpZXcgPSBvbkNyZWF0ZVZpZXcocGFyZW50LCBuYW1lLCBhdHRycyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgdmlldyA9IGNyZWF0ZVZpZXcobmFtZSwgbnVsbCwgYXR0cnMpOwogICAgICAgICAgICAgICAgIH0KQEAgLTU5NSw4ICs2ODMsOCBAQAogICAgICAqIFJlY3Vyc2l2ZSBtZXRob2QgdXNlZCB0byBkZXNjZW5kIGRvd24gdGhlIHhtbCBoaWVyYXJjaHkgYW5kIGluc3RhbnRpYXRlCiAgICAgICogdmlld3MsIGluc3RhbnRpYXRlIHRoZWlyIGNoaWxkcmVuLCBhbmQgdGhlbiBjYWxsIG9uRmluaXNoSW5mbGF0ZSgpLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBySW5mbGF0ZShYbWxQdWxsUGFyc2VyIHBhcnNlciwgVmlldyBwYXJlbnQsIGZpbmFsIEF0dHJpYnV0ZVNldCBhdHRycykKLSAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSB2b2lkIHJJbmZsYXRlKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBWaWV3IHBhcmVudCwgZmluYWwgQXR0cmlidXRlU2V0IGF0dHJzLAorICAgICAgICAgICAgYm9vbGVhbiBmaW5pc2hJbmZsYXRlKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCiAgICAgICAgIGZpbmFsIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOwogICAgICAgICBpbnQgdHlwZTsKQEAgLTYyMCwxNSArNzA4LDE1IEBACiAgICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19NRVJHRS5lcXVhbHMobmFtZSkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5mbGF0ZUV4Y2VwdGlvbigiPG1lcmdlIC8+IG11c3QgYmUgdGhlIHJvb3QgZWxlbWVudCIpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBjcmVhdGVWaWV3RnJvbVRhZyhuYW1lLCBhdHRycyk7CisgICAgICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gY3JlYXRlVmlld0Zyb21UYWcocGFyZW50LCBuYW1lLCBhdHRycyk7CiAgICAgICAgICAgICAgICAgZmluYWwgVmlld0dyb3VwIHZpZXdHcm91cCA9IChWaWV3R3JvdXApIHBhcmVudDsKICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IHZpZXdHcm91cC5nZW5lcmF0ZUxheW91dFBhcmFtcyhhdHRycyk7Ci0gICAgICAgICAgICAgICAgckluZmxhdGUocGFyc2VyLCB2aWV3LCBhdHRycyk7CisgICAgICAgICAgICAgICAgckluZmxhdGUocGFyc2VyLCB2aWV3LCBhdHRycywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgdmlld0dyb3VwLmFkZFZpZXcodmlldywgcGFyYW1zKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHBhcmVudC5vbkZpbmlzaEluZmxhdGUoKTsKKyAgICAgICAgaWYgKGZpbmlzaEluZmxhdGUpIHBhcmVudC5vbkZpbmlzaEluZmxhdGUoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcGFyc2VSZXF1ZXN0Rm9jdXMoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFZpZXcgcGFyZW50KQpAQCAtNjc5LDkgKzc2Nyw5IEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKFRBR19NRVJHRS5lcXVhbHMoY2hpbGROYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5mbGF0ZSBhbGwgY2hpbGRyZW4uCi0gICAgICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShjaGlsZFBhcnNlciwgcGFyZW50LCBjaGlsZEF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKGNoaWxkUGFyc2VyLCBwYXJlbnQsIGNoaWxkQXR0cnMsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IGNyZWF0ZVZpZXdGcm9tVGFnKGNoaWxkTmFtZSwgY2hpbGRBdHRycyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBjcmVhdGVWaWV3RnJvbVRhZyhwYXJlbnQsIGNoaWxkTmFtZSwgY2hpbGRBdHRycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3R3JvdXAgZ3JvdXAgPSAoVmlld0dyb3VwKSBwYXJlbnQ7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHRyeSB0byBsb2FkIHRoZSBsYXlvdXQgcGFyYW1zIHNldCBpbiB0aGUgPGluY2x1ZGUgLz4gdGFnLiBJZgpAQCAtNzA0LDcgKzc5Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZmxhdGUgYWxsIGNoaWxkcmVuLgotICAgICAgICAgICAgICAgICAgICAgICAgckluZmxhdGUoY2hpbGRQYXJzZXIsIHZpZXcsIGNoaWxkQXR0cnMpOworICAgICAgICAgICAgICAgICAgICAgICAgckluZmxhdGUoY2hpbGRQYXJzZXIsIHZpZXcsIGNoaWxkQXR0cnMsIHRydWUpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIG92ZXJyaWRlIHRoZSBpbmNsdWRlZCBsYXlvdXQncyBhbmRyb2lkOmlkIHdpdGggdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmUgc2V0IG9uIHRoZSA8aW5jbHVkZSAvPiB0YWcgaXRzZWxmLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SW5mbGF0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUluZmxhdGVyLmphdmEKaW5kZXggNDZjODA1Yy4uN2Q1ZGNkOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SW5mbGF0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01lbnVJbmZsYXRlci5qYXZhCkBAIC0xOCw4ICsxOCw2IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUl0ZW1JbXBsOwogCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKIApAQCAtMzAsNiArMjgsMTAgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKwogLyoqCiAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaW5zdGFudGlhdGUgbWVudSBYTUwgZmlsZXMgaW50byBNZW51IG9iamVjdHMuCiAgKiA8cD4KQEAgLTUxLDYgKzUzLDggQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT19JRCA9IDA7CiAgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz5bXSBBQ1RJT05fVklFV19DT05TVFJVQ1RPUl9TSUdOQVRVUkUgPSBuZXcgQ2xhc3NbXXtDb250ZXh0LmNsYXNzfTsKKwogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKICAgICAKICAgICAvKioKQEAgLTE2Niw2ICsxNzAsNDEgQEAKICAgICAgICAgfQogICAgIH0KICAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbmZsYXRlZE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyCisgICAgICAgICAgICBpbXBsZW1lbnRzIE1lbnVJdGVtLk9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBQQVJBTV9UWVBFUyA9IG5ldyBDbGFzc1tdIHsgTWVudUl0ZW0uY2xhc3MgfTsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICAgICAgcHJpdmF0ZSBNZXRob2QgbU1ldGhvZDsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBJbmZsYXRlZE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKENvbnRleHQgY29udGV4dCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgICAgIENsYXNzIGMgPSBjb250ZXh0LmdldENsYXNzKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1NZXRob2QgPSBjLmdldE1ldGhvZChtZXRob2ROYW1lLCBQQVJBTV9UWVBFUyk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIEluZmxhdGVFeGNlcHRpb24gZXggPSBuZXcgSW5mbGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCByZXNvbHZlIG1lbnUgaXRlbSBvbkNsaWNrIGhhbmRsZXIgIiArIG1ldGhvZE5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBpbiBjbGFzcyAiICsgYy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGV4LmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKG1NZXRob2QuZ2V0UmV0dXJuVHlwZSgpID09IEJvb2xlYW4uVFlQRSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEJvb2xlYW4pIG1NZXRob2QuaW52b2tlKG1Db250ZXh0LCBpdGVtKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtTWV0aG9kLmludm9rZShtQ29udGV4dCwgaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCiAgICAgLyoqCiAgICAgICogU3RhdGUgZm9yIHRoZSBjdXJyZW50IG1lbnUuCiAgICAgICogPHA+CkBAIC0yMDUsNiArMjQ0LDIwIEBACiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpdGVtVmlzaWJsZTsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGl0ZW1FbmFibGVkOwogICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN5bmMgdG8gYXR0cnMueG1sIGVudW0sIHZhbHVlcyBpbiBNZW51SXRlbToKKyAgICAgICAgICogLSAwOiBuZXZlcgorICAgICAgICAgKiAtIDE6IGlmUm9vbQorICAgICAgICAgKiAtIDI6IGFsd2F5cworICAgICAgICAgKiAtIC0xOiBTYWZlIHNlbnRpbmVsIGZvciAibm8gdmFsdWUiLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBpbnQgaXRlbVNob3dBc0FjdGlvbjsKKworICAgICAgICBwcml2YXRlIGludCBpdGVtQWN0aW9uVmlld0xheW91dDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaXRlbUFjdGlvblZpZXdDbGFzc05hbWU7CisgICAgICAgIAorICAgICAgICBwcml2YXRlIFN0cmluZyBpdGVtTGlzdGVuZXJNZXRob2ROYW1lOworICAgICAgICAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGRlZmF1bHRHcm91cElkID0gTk9fSUQ7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0SXRlbUlkID0gTk9fSUQ7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0SXRlbUNhdGVnb3J5ID0gMDsKQEAgLTI3Niw2ICszMjksMTAgQEAKICAgICAgICAgICAgIGl0ZW1DaGVja2VkID0gYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1lbnVJdGVtX2NoZWNrZWQsIGRlZmF1bHRJdGVtQ2hlY2tlZCk7CiAgICAgICAgICAgICBpdGVtVmlzaWJsZSA9IGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV92aXNpYmxlLCBncm91cFZpc2libGUpOwogICAgICAgICAgICAgaXRlbUVuYWJsZWQgPSBhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTWVudUl0ZW1fZW5hYmxlZCwgZ3JvdXBFbmFibGVkKTsKKyAgICAgICAgICAgIGl0ZW1TaG93QXNBY3Rpb24gPSBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV9zaG93QXNBY3Rpb24sIC0xKTsKKyAgICAgICAgICAgIGl0ZW1MaXN0ZW5lck1ldGhvZE5hbWUgPSBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV9vbkNsaWNrKTsKKyAgICAgICAgICAgIGl0ZW1BY3Rpb25WaWV3TGF5b3V0ID0gYS5nZXRSZXNvdXJjZUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1lbnVJdGVtX2FjdGlvbkxheW91dCwgMCk7CisgICAgICAgICAgICBpdGVtQWN0aW9uVmlld0NsYXNzTmFtZSA9IGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1lbnVJdGVtX2FjdGlvblZpZXdDbGFzcyk7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGEucmVjeWNsZSgpOwogICAgICAgICAgICAgCkBAIC0yOTksOSArMzU2LDM4IEBACiAgICAgICAgICAgICAgICAgLnNldEljb24oaXRlbUljb25SZXNJZCkKICAgICAgICAgICAgICAgICAuc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KGl0ZW1BbHBoYWJldGljU2hvcnRjdXQpCiAgICAgICAgICAgICAgICAgLnNldE51bWVyaWNTaG9ydGN1dChpdGVtTnVtZXJpY1Nob3J0Y3V0KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGl0ZW1TaG93QXNBY3Rpb24gPj0gMCkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0U2hvd0FzQWN0aW9uKGl0ZW1TaG93QXNBY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaXRlbUxpc3RlbmVyTWV0aG9kTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Db250ZXh0LmlzUmVzdHJpY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBhbmRyb2lkOm9uQ2xpY2sgYXR0cmlidXRlIGNhbm5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYmUgdXNlZCB3aXRoaW4gYSByZXN0cmljdGVkIGNvbnRleHQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXRlbS5zZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbmZsYXRlZE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKG1Db250ZXh0LCBpdGVtTGlzdGVuZXJNZXRob2ROYW1lKSk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChpdGVtQ2hlY2thYmxlID49IDIpIHsKLSAgICAgICAgICAgICAgICAoKE1lbnVJdGVtSW1wbCkgaXRlbSkuc2V0RXhjbHVzaXZlQ2hlY2thYmxlKHRydWUpOworICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBNZW51SXRlbUltcGwpIHsKKyAgICAgICAgICAgICAgICBNZW51SXRlbUltcGwgaW1wbCA9IChNZW51SXRlbUltcGwpIGl0ZW07CisgICAgICAgICAgICAgICAgaWYgKGl0ZW1DaGVja2FibGUgPj0gMikgeworICAgICAgICAgICAgICAgICAgICBpbXBsLnNldEV4Y2x1c2l2ZUNoZWNrYWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpdGVtQWN0aW9uVmlld0NsYXNzTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gY2xhenogPSBDbGFzcy5mb3JOYW1lKGl0ZW1BY3Rpb25WaWV3Q2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc3RydWN0b3I8Pz4gYyA9IGNsYXp6LmdldENvbnN0cnVjdG9yKEFDVElPTl9WSUVXX0NPTlNUUlVDVE9SX1NJR05BVFVSRSk7CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0QWN0aW9uVmlldygoVmlldykgYy5uZXdJbnN0YW5jZShtQ29udGV4dCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmZsYXRlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbUFjdGlvblZpZXdMYXlvdXQgPiAwKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKG1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICBpdGVtLnNldEFjdGlvblZpZXcoaW5mbGF0ZXIuaW5mbGF0ZShpdGVtQWN0aW9uVmlld0xheW91dCwgbnVsbCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SXRlbS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SXRlbS5qYXZhCmluZGV4IGZjZWJlYzUuLjhiOWQ2NTkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUl0ZW0uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01lbnVJdGVtLmphdmEKQEAgLTMxLDYgKzMxLDIxIEBACiAgKiBGb3IgYSBmZWF0dXJlIHNldCBvZiBzcGVjaWZpYyBtZW51IHR5cGVzLCBzZWUge0BsaW5rIE1lbnV9LgogICovCiBwdWJsaWMgaW50ZXJmYWNlIE1lbnVJdGVtIHsKKyAgICAvKgorICAgICAqIFRoZXNlIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCBhdHRycy54bWwgZW51bSBjb25zdGFudHMgZm9yIHNob3dBc0FjdGlvbgorICAgICAqLworICAgIC8qKiBOZXZlciBzaG93IHRoaXMgaXRlbSBhcyBhIGJ1dHRvbiBpbiBhbiBBY3Rpb24gQmFyLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfQVNfQUNUSU9OX05FVkVSID0gMDsKKyAgICAvKiogU2hvdyB0aGlzIGl0ZW0gYXMgYSBidXR0b24gaW4gYW4gQWN0aW9uIEJhciBpZiB0aGUgc3lzdGVtIGRlY2lkZXMgdGhlcmUgaXMgcm9vbSBmb3IgaXQuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19BU19BQ1RJT05fSUZfUk9PTSA9IDE7CisgICAgLyoqCisgICAgICogQWx3YXlzIHNob3cgdGhpcyBpdGVtIGFzIGEgYnV0dG9uIGluIGFuIEFjdGlvbiBCYXIuCisgICAgICogVXNlIHNwYXJpbmdseSEgSWYgdG9vIG1hbnkgaXRlbXMgYXJlIHNldCB0byBhbHdheXMgc2hvdyBpbiB0aGUgQWN0aW9uIEJhciBpdCBjYW4KKyAgICAgKiBjcm93ZCB0aGUgQWN0aW9uIEJhciBhbmQgZGVncmFkZSB0aGUgdXNlciBleHBlcmllbmNlIG9uIGRldmljZXMgd2l0aCBzbWFsbGVyIHNjcmVlbnMuCisgICAgICogQSBnb29kIHJ1bGUgb2YgdGh1bWIgaXMgdG8gaGF2ZSBubyBtb3JlIHRoYW4gMiBpdGVtcyBzZXQgdG8gYWx3YXlzIHNob3cgYXQgYSB0aW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfQVNfQUNUSU9OX0FMV0FZUyA9IDI7CisgICAgCiAgICAgLyoqCiAgICAgICogSW50ZXJmYWNlIGRlZmluaXRpb24gZm9yIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGEgbWVudSBpdGVtIGlzCiAgICAgICogY2xpY2tlZC4KQEAgLTM4MSw0ICszOTYsMzggQEAKICAgICAgKiAgICAgICAgIG1lbnUgaXRlbSB0byB0aGUgbWVudS4gVGhpcyBjYW4gYmUgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgQ29udGV4dE1lbnVJbmZvIGdldE1lbnVJbmZvKCk7CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyBob3cgdGhpcyBpdGVtIHNob3VsZCBkaXNwbGF5IGluIHRoZSBwcmVzZW5jZSBvZiBhbiBBY3Rpb24gQmFyLgorICAgICAqCisgICAgICogQHBhcmFtIGFjdGlvbkVudW0gSG93IHRoZSBpdGVtIHNob3VsZCBkaXNwbGF5LiBPbmUgb2YKKyAgICAgKiB7QGxpbmsgI1NIT1dfQVNfQUNUSU9OX0FMV0FZU30sIHtAbGluayAjU0hPV19BU19BQ1RJT05fSUZfUk9PTX0sIG9yCisgICAgICoge0BsaW5rICNTSE9XX0FTX0FDVElPTl9ORVZFUn0uIFNIT1dfQVNfQUNUSU9OX05FVkVSIGlzIHRoZSBkZWZhdWx0LgorICAgICAqIAorICAgICAqIEBzZWUgYW5kcm9pZC5hcHAuQWN0aW9uQmFyCisgICAgICogQHNlZSAjc2V0QWN0aW9uVmlldyhWaWV3KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNob3dBc0FjdGlvbihpbnQgYWN0aW9uRW51bSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYW4gYWN0aW9uIHZpZXcgZm9yIHRoaXMgbWVudSBpdGVtLiBBbiBhY3Rpb24gdmlldyB3aWxsIGJlIGRpc3BsYXllZCBpbiBwbGFjZQorICAgICAqIG9mIGFuIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1lbnUgaXRlbSBlbGVtZW50IGluIHRoZSBVSSB3aGVuIHRoaXMgaXRlbSBpcyBzaG93bgorICAgICAqIGFzIGFuIGFjdGlvbiB3aXRoaW4gYSBwYXJlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlldyBWaWV3IHRvIHVzZSBmb3IgcHJlc2VudGluZyB0aGlzIGl0ZW0gdG8gdGhlIHVzZXIuCisgICAgICogQHJldHVybiBUaGlzIEl0ZW0gc28gYWRkaXRpb25hbCBzZXR0ZXJzIGNhbiBiZSBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTaG93QXNBY3Rpb24oaW50KQorICAgICAqLworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRBY3Rpb25WaWV3KFZpZXcgdmlldyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgc2V0IGFjdGlvbiB2aWV3IGZvciB0aGlzIG1lbnUgaXRlbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhpcyBpdGVtJ3MgYWN0aW9uIHZpZXcKKyAgICAgKgorICAgICAqIEBzZWUgI3NldEFjdGlvblZpZXcoVmlldykKKyAgICAgKiBAc2VlICNzZXRTaG93QXNBY3Rpb24oaW50KQorICAgICAqLworICAgIHB1YmxpYyBWaWV3IGdldEFjdGlvblZpZXcoKTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01vdGlvbkV2ZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01vdGlvbkV2ZW50LmphdmEKaW5kZXggNjcwNTU5Ni4uZGZiZTY1YyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9Nb3Rpb25FdmVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTW90aW9uRXZlbnQuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQudmlldzsKIAoraW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwpAQCAtMzQ3LDYgKzM0OCw4IEBACiAgICAgcHJpdmF0ZSBSdW50aW1lRXhjZXB0aW9uIG1SZWN5Y2xlZExvY2F0aW9uOwogICAgIHByaXZhdGUgYm9vbGVhbiBtUmVjeWNsZWQ7CiAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVRyYW5zZm9ybShNYXRyaXggbWF0cml4KTsKKwogICAgIHByaXZhdGUgTW90aW9uRXZlbnQoaW50IHBvaW50ZXJDb3VudCwgaW50IHNhbXBsZUNvdW50KSB7CiAgICAgICAgIG1Qb2ludGVySWRlbnRpZmllcnMgPSBuZXcgaW50W3BvaW50ZXJDb3VudF07CiAgICAgICAgIG1EYXRhU2FtcGxlcyA9IG5ldyBmbG9hdFtwb2ludGVyQ291bnQgKiBzYW1wbGVDb3VudCAqIE5VTV9TQU1QTEVfREFUQV07CkBAIC0xNDEzLDYgKzE0MTYsMTkgQEAKICAgICAgICAgbVlPZmZzZXQgPSB5IC0gZGF0YVNhbXBsZXNbbGFzdERhdGFTYW1wbGVJbmRleCArIFNBTVBMRV9ZXTsKICAgICB9CiAgICAgCisgICAgLyoqCisgICAgICogQXBwbGllcyBhIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB0byBhbGwgb2YgdGhlIHBvaW50cyBpbiB0aGUgZXZlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWF0cml4IFRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdG8gYXBwbHkuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgdHJhbnNmb3JtKE1hdHJpeCBtYXRyaXgpIHsKKyAgICAgICAgaWYgKG1hdHJpeCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtYXRyaXggbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgbmF0aXZlVHJhbnNmb3JtKG1hdHJpeCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGdldFBvaW50ZXJDb29yZHNBdFNhbXBsZUluZGV4KGludCBzYW1wbGVJbmRleCwKICAgICAgICAgICAgIFBvaW50ZXJDb29yZHMgb3V0UG9pbnRlckNvb3JkcykgewogICAgICAgICBmaW5hbCBmbG9hdFtdIGRhdGFTYW1wbGVzID0gbURhdGFTYW1wbGVzOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9TY2FsZUdlc3R1cmVEZXRlY3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9TY2FsZUdlc3R1cmVEZXRlY3Rvci5qYXZhCmluZGV4IDA5OTk1OTguLjE3YjVkZDcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvU2NhbGVHZXN0dXJlRGV0ZWN0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1NjYWxlR2VzdHVyZURldGVjdG9yLmphdmEKQEAgLTI1LDcgKzI1LDcgQEAKICAqIHVzaW5nIHRoZSBzdXBwbGllZCB7QGxpbmsgTW90aW9uRXZlbnR9cy4gVGhlIHtAbGluayBPblNjYWxlR2VzdHVyZUxpc3RlbmVyfQogICogY2FsbGJhY2sgd2lsbCBub3RpZnkgdXNlcnMgd2hlbiBhIHBhcnRpY3VsYXIgZ2VzdHVyZSBldmVudCBoYXMgb2NjdXJyZWQuCiAgKiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCB7QGxpbmsgTW90aW9uRXZlbnR9cyByZXBvcnRlZCB2aWEgdG91Y2guCi0gKiAKKyAqCiAgKiBUbyB1c2UgdGhpcyBjbGFzczoKICAqIDx1bD4KICAqICA8bGk+Q3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSB7QGNvZGUgU2NhbGVHZXN0dXJlRGV0ZWN0b3J9IGZvciB5b3VyCkBAIC00MSw3ICs0MSw3IEBACiAgICAgICogSWYgeW91IHdhbnQgdG8gbGlzdGVuIGZvciBhbGwgdGhlIGRpZmZlcmVudCBnZXN0dXJlcyB0aGVuIGltcGxlbWVudAogICAgICAqIHRoaXMgaW50ZXJmYWNlLiBJZiB5b3Ugb25seSB3YW50IHRvIGxpc3RlbiBmb3IgYSBzdWJzZXQgaXQgbWlnaHQKICAgICAgKiBiZSBlYXNpZXIgdG8gZXh0ZW5kIHtAbGluayBTaW1wbGVPblNjYWxlR2VzdHVyZUxpc3RlbmVyfS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEFuIGFwcGxpY2F0aW9uIHdpbGwgcmVjZWl2ZSBldmVudHMgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKICAgICAgKiA8dWw+CiAgICAgICogIDxsaT5PbmUge0BsaW5rIE9uU2NhbGVHZXN0dXJlTGlzdGVuZXIjb25TY2FsZUJlZ2luKFNjYWxlR2VzdHVyZURldGVjdG9yKX0KQEAgLTUzLDcgKzUzLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFJlc3BvbmRzIHRvIHNjYWxpbmcgZXZlbnRzIGZvciBhIGdlc3R1cmUgaW4gcHJvZ3Jlc3MuCiAgICAgICAgICAqIFJlcG9ydGVkIGJ5IHBvaW50ZXIgbW90aW9uLgotICAgICAgICAgKiAKKyAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIGRldGVjdG9yIFRoZSBkZXRlY3RvciByZXBvcnRpbmcgdGhlIGV2ZW50IC0gdXNlIHRoaXMgdG8KICAgICAgICAgICogICAgICAgICAgcmV0cmlldmUgZXh0ZW5kZWQgaW5mbyBhYm91dCBldmVudCBzdGF0ZS4KICAgICAgICAgICogQHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgZGV0ZWN0b3Igc2hvdWxkIGNvbnNpZGVyIHRoaXMgZXZlbnQKQEAgLTY4LDcgKzY4LDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFJlc3BvbmRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBzY2FsaW5nIGdlc3R1cmUuIFJlcG9ydGVkIGJ5CiAgICAgICAgICAqIG5ldyBwb2ludGVycyBnb2luZyBkb3duLgotICAgICAgICAgKiAKKyAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIGRldGVjdG9yIFRoZSBkZXRlY3RvciByZXBvcnRpbmcgdGhlIGV2ZW50IC0gdXNlIHRoaXMgdG8KICAgICAgICAgICogICAgICAgICAgcmV0cmlldmUgZXh0ZW5kZWQgaW5mbyBhYm91dCBldmVudCBzdGF0ZS4KICAgICAgICAgICogQHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgZGV0ZWN0b3Igc2hvdWxkIGNvbnRpbnVlIHJlY29nbml6aW5nCkBAIC04MiwxNyArODIsMTcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFJlc3BvbmRzIHRvIHRoZSBlbmQgb2YgYSBzY2FsZSBnZXN0dXJlLiBSZXBvcnRlZCBieSBleGlzdGluZwogICAgICAgICAgKiBwb2ludGVycyBnb2luZyB1cC4KLSAgICAgICAgICogCisgICAgICAgICAqCiAgICAgICAgICAqIE9uY2UgYSBzY2FsZSBoYXMgZW5kZWQsIHtAbGluayBTY2FsZUdlc3R1cmVEZXRlY3RvciNnZXRGb2N1c1goKX0KICAgICAgICAgICogYW5kIHtAbGluayBTY2FsZUdlc3R1cmVEZXRlY3RvciNnZXRGb2N1c1koKX0gd2lsbCByZXR1cm4gdGhlIGxvY2F0aW9uCiAgICAgICAgICAqIG9mIHRoZSBwb2ludGVyIHJlbWFpbmluZyBvbiB0aGUgc2NyZWVuLgotICAgICAgICAgKiAKKyAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIGRldGVjdG9yIFRoZSBkZXRlY3RvciByZXBvcnRpbmcgdGhlIGV2ZW50IC0gdXNlIHRoaXMgdG8KICAgICAgICAgICogICAgICAgICAgcmV0cmlldmUgZXh0ZW5kZWQgaW5mbyBhYm91dCBldmVudCBzdGF0ZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2NhbGVFbmQoU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEEgY29udmVuaWVuY2UgY2xhc3MgdG8gZXh0ZW5kIHdoZW4geW91IG9ubHkgd2FudCB0byBsaXN0ZW4gZm9yIGEgc3Vic2V0CiAgICAgICogb2Ygc2NhbGluZy1yZWxhdGVkIGV2ZW50cy4gVGhpcyBpbXBsZW1lbnRzIGFsbCBtZXRob2RzIGluCkBAIC0xMDEsNyArMTAxLDcgQEAKICAgICAgKiB7QGNvZGUgZmFsc2V9IHNvIHRoYXQgYSBzdWJjbGFzcyBjYW4gcmV0cmlldmUgdGhlIGFjY3VtdWxhdGVkIHNjYWxlCiAgICAgICogZmFjdG9yIGluIGFuIG92ZXJyaWRkZW4gb25TY2FsZUVuZC4KICAgICAgKiB7QGxpbmsgT25TY2FsZUdlc3R1cmVMaXN0ZW5lciNvblNjYWxlQmVnaW4oU2NhbGVHZXN0dXJlRGV0ZWN0b3IpfSByZXR1cm5zCi0gICAgICoge0Bjb2RlIHRydWV9LiAKKyAgICAgKiB7QGNvZGUgdHJ1ZX0uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW1wbGVPblNjYWxlR2VzdHVyZUxpc3RlbmVyIGltcGxlbWVudHMgT25TY2FsZUdlc3R1cmVMaXN0ZW5lciB7CiAKQEAgLTE0OCw3ICsxNDgsNyBAQAogICAgIHByaXZhdGUgZmxvYXQgbUN1cnJQcmVzc3VyZTsKICAgICBwcml2YXRlIGZsb2F0IG1QcmV2UHJlc3N1cmU7CiAgICAgcHJpdmF0ZSBsb25nIG1UaW1lRGVsdGE7Ci0gICAgCisKICAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1FZGdlU2xvcDsKICAgICBwcml2YXRlIGZsb2F0IG1SaWdodFNsb3BFZGdlOwogICAgIHByaXZhdGUgZmxvYXQgbUJvdHRvbVNsb3BFZGdlOwpAQCAtMjE3LDcgKzIxNyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRToKICAgICAgICAgICAgICAgICBpZiAobVNsb3BweUdlc3R1cmUpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhdGUgc2xvcHB5IGdlc3R1cmVzIGlmIHdlJ3ZlIG1vdmVkIG91dHNpZGUgb2YgdGhlIHNsb3AgYXJlYS4KQEAgLTI0OSw3ICsyNDksNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQOgogICAgICAgICAgICAgICAgIGlmIChtU2xvcHB5R2VzdHVyZSkgewogICAgICAgICAgICAgICAgICAgICAvLyBTZXQgZm9jdXMgcG9pbnQgdG8gdGhlIHJlbWFpbmluZyBmaW5nZXIKQEAgLTMwNywxNyArMzA3LDE3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogTW90aW9uRXZlbnQgaGFzIG5vIGdldFJhd1goaW50KSBtZXRob2Q7IHNpbXVsYXRlIGl0IHBlbmRpbmcgZnV0dXJlIEFQSSBhcHByb3ZhbC4gCisgICAgICogTW90aW9uRXZlbnQgaGFzIG5vIGdldFJhd1goaW50KSBtZXRob2Q7IHNpbXVsYXRlIGl0IHBlbmRpbmcgZnV0dXJlIEFQSSBhcHByb3ZhbC4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBnZXRSYXdYKE1vdGlvbkV2ZW50IGV2ZW50LCBpbnQgcG9pbnRlckluZGV4KSB7CiAgICAgICAgIGZsb2F0IG9mZnNldCA9IGV2ZW50LmdldFJhd1goKSAtIGV2ZW50LmdldFgoKTsKICAgICAgICAgcmV0dXJuIGV2ZW50LmdldFgocG9pbnRlckluZGV4KSArIG9mZnNldDsKICAgICB9Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBNb3Rpb25FdmVudCBoYXMgbm8gZ2V0UmF3WShpbnQpIG1ldGhvZDsgc2ltdWxhdGUgaXQgcGVuZGluZyBmdXR1cmUgQVBJIGFwcHJvdmFsLiAKKyAgICAgKiBNb3Rpb25FdmVudCBoYXMgbm8gZ2V0UmF3WShpbnQpIG1ldGhvZDsgc2ltdWxhdGUgaXQgcGVuZGluZyBmdXR1cmUgQVBJIGFwcHJvdmFsLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IGdldFJhd1koTW90aW9uRXZlbnQgZXZlbnQsIGludCBwb2ludGVySW5kZXgpIHsKICAgICAgICAgZmxvYXQgb2Zmc2V0ID0gZXZlbnQuZ2V0UmF3WSgpIC0gZXZlbnQuZ2V0WSgpOwpAQCAtMzkwLDcgKzM5MCw3IEBACiAgICAgICogcmVtYWluaW5nIHBvaW50ZXIgb24gdGhlIHNjcmVlbi4KICAgICAgKiBJZiB7QGxpbmsgI2lzSW5Qcm9ncmVzcygpfSB3b3VsZCByZXR1cm4gZmFsc2UsIHRoZSByZXN1bHQgb2YgdGhpcwogICAgICAqIGZ1bmN0aW9uIGlzIHVuZGVmaW5lZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gWCBjb29yZGluYXRlIG9mIHRoZSBmb2NhbCBwb2ludCBpbiBwaXhlbHMuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldEZvY3VzWCgpIHsKQEAgLTQwNSw3ICs0MDUsNyBAQAogICAgICAqIHJlbWFpbmluZyBwb2ludGVyIG9uIHRoZSBzY3JlZW4uCiAgICAgICogSWYge0BsaW5rICNpc0luUHJvZ3Jlc3MoKX0gd291bGQgcmV0dXJuIGZhbHNlLCB0aGUgcmVzdWx0IG9mIHRoaXMKICAgICAgKiBmdW5jdGlvbiBpcyB1bmRlZmluZWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFkgY29vcmRpbmF0ZSBvZiB0aGUgZm9jYWwgcG9pbnQgaW4gcGl4ZWxzLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRGb2N1c1koKSB7CkBAIC00MTUsNyArNDE1LDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBvaW50ZXJzIGZvcm1pbmcgdGhlCiAgICAgICogZ2VzdHVyZSBpbiBwcm9ncmVzcy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gRGlzdGFuY2UgYmV0d2VlbiBwb2ludGVycyBpbiBwaXhlbHMuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldEN1cnJlbnRTcGFuKCkgewpAQCAtNDI4LDkgKzQyOCwyOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB4IGRpc3RhbmNlIGJldHdlZW4gdGhlIHR3byBwb2ludGVycyBmb3JtaW5nIHRoZQorICAgICAqIGdlc3R1cmUgaW4gcHJvZ3Jlc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIERpc3RhbmNlIGJldHdlZW4gcG9pbnRlcnMgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRDdXJyZW50U3BhblgoKSB7CisgICAgICAgIHJldHVybiBtQ3VyckZpbmdlckRpZmZYOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB5IGRpc3RhbmNlIGJldHdlZW4gdGhlIHR3byBwb2ludGVycyBmb3JtaW5nIHRoZQorICAgICAqIGdlc3R1cmUgaW4gcHJvZ3Jlc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIERpc3RhbmNlIGJldHdlZW4gcG9pbnRlcnMgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRDdXJyZW50U3BhblkoKSB7CisgICAgICAgIHJldHVybiBtQ3VyckZpbmdlckRpZmZZOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgcHJldmlvdXMgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBvaW50ZXJzIGZvcm1pbmcgdGhlCiAgICAgICogZ2VzdHVyZSBpbiBwcm9ncmVzcy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gUHJldmlvdXMgZGlzdGFuY2UgYmV0d2VlbiBwb2ludGVycyBpbiBwaXhlbHMuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFByZXZpb3VzU3BhbigpIHsKQEAgLTQ0MywxMCArNDYzLDMwIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcmV2aW91cyB4IGRpc3RhbmNlIGJldHdlZW4gdGhlIHR3byBwb2ludGVycyBmb3JtaW5nIHRoZQorICAgICAqIGdlc3R1cmUgaW4gcHJvZ3Jlc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFByZXZpb3VzIGRpc3RhbmNlIGJldHdlZW4gcG9pbnRlcnMgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRQcmV2aW91c1NwYW5YKCkgeworICAgICAgICByZXR1cm4gbVByZXZGaW5nZXJEaWZmWDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHkgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBvaW50ZXJzIGZvcm1pbmcgdGhlCisgICAgICogZ2VzdHVyZSBpbiBwcm9ncmVzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUHJldmlvdXMgZGlzdGFuY2UgYmV0d2VlbiBwb2ludGVycyBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFByZXZpb3VzU3BhblkoKSB7CisgICAgICAgIHJldHVybiBtUHJldkZpbmdlckRpZmZZOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgc2NhbGluZyBmYWN0b3IgZnJvbSB0aGUgcHJldmlvdXMgc2NhbGUgZXZlbnQgdG8gdGhlIGN1cnJlbnQKICAgICAgKiBldmVudC4gVGhpcyB2YWx1ZSBpcyBkZWZpbmVkIGFzCiAgICAgICogKHtAbGluayAjZ2V0Q3VycmVudFNwYW4oKX0gLyB7QGxpbmsgI2dldFByZXZpb3VzU3BhbigpfSkuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNjYWxpbmcgZmFjdG9yLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRTY2FsZUZhY3RvcigpIHsKQEAgLTQ1NSwyMCArNDk1LDIwIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG1TY2FsZUZhY3RvcjsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHRpbWUgZGlmZmVyZW5jZSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiB0aGUgcHJldmlvdXMKICAgICAgKiBhY2NlcHRlZCBzY2FsaW5nIGV2ZW50IGFuZCB0aGUgY3VycmVudCBzY2FsaW5nIGV2ZW50LgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiBUaW1lIGRpZmZlcmVuY2Ugc2luY2UgdGhlIGxhc3Qgc2NhbGluZyBldmVudCBpbiBtaWxsaXNlY29uZHMuCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgZ2V0VGltZURlbHRhKCkgewogICAgICAgICByZXR1cm4gbVRpbWVEZWx0YTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGV2ZW50IHRpbWUgb2YgdGhlIGN1cnJlbnQgZXZlbnQgYmVpbmcgcHJvY2Vzc2VkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiBDdXJyZW50IGV2ZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzLgogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldEV2ZW50VGltZSgpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmVsb2NpdHlUcmFja2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZlbG9jaXR5VHJhY2tlci5qYXZhCmluZGV4IGZiODhjNzEuLmIxZmRlYzggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmVsb2NpdHlUcmFja2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WZWxvY2l0eVRyYWNrZXIuamF2YQpAQCAtNDEsNiArNDEsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQUdFX01JTExJU0VDT05EUyA9IDIwMDsKICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9JTlRFUl9QT09MX0NBUEFDSVRZID0gMjA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUE9JTlRFUiA9IC0xOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUG9vbDxWZWxvY2l0eVRyYWNrZXI+IHNQb29sID0gUG9vbHMuc3luY2hyb25pemVkUG9vbCgKICAgICAgICAgICAgIFBvb2xzLmZpbml0ZVBvb2wobmV3IFBvb2xhYmxlTWFuYWdlcjxWZWxvY2l0eVRyYWNrZXI+KCkgewpAQCAtNzYsNiArNzcsNyBAQAogICAgIHByaXZhdGUgUG9pbnRlciBtUG9pbnRlckxpc3RIZWFkOyAvLyBzb3J0ZWQgYnkgaWQgaW4gaW5jcmVhc2luZyBvcmRlcgogICAgIHByaXZhdGUgaW50IG1MYXN0VG91Y2hJbmRleDsKICAgICBwcml2YXRlIGludCBtR2VuZXJhdGlvbjsKKyAgICBwcml2YXRlIGludCBtQWN0aXZlUG9pbnRlcklkOwogCiAgICAgcHJpdmF0ZSBWZWxvY2l0eVRyYWNrZXIgbU5leHQ7CiAKQEAgLTEyNSw2ICsxMjcsNyBAQAogICAgICAgICAKICAgICAgICAgbVBvaW50ZXJMaXN0SGVhZCA9IG51bGw7CiAgICAgICAgIG1MYXN0VG91Y2hJbmRleCA9IDA7CisgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTgwLDYgKzE4MywxMCBAQAogICAgICAgICAgICAgICAgIC8vIFBvaW50ZXIgd2VudCBkb3duLiAgQWRkIGl0IHRvIHRoZSBsaXN0LgogICAgICAgICAgICAgICAgIC8vIFdyaXRlIGEgc2VudGluZWwgYXQgdGhlIGVuZCBvZiB0aGUgcGFzdFRpbWUgdHJhY2Ugc28gd2Ugd2lsbCBiZSBhYmxlIHRvCiAgICAgICAgICAgICAgICAgLy8gdGVsbCB3aGVuIHRoZSB0cmFjZSBzdGFydGVkLgorICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlUG9pbnRlcklkID09IElOVkFMSURfUE9JTlRFUikgeworICAgICAgICAgICAgICAgICAgICAvLyBDb25ncmF0dWxhdGlvbnMhIFlvdSdyZSB0aGUgbmV3IGFjdGl2ZSBwb2ludGVyIQorICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gcG9pbnRlcklkOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwb2ludGVyID0gb2J0YWluUG9pbnRlcigpOwogICAgICAgICAgICAgICAgIHBvaW50ZXIuaWQgPSBwb2ludGVySWQ7CiAgICAgICAgICAgICAgICAgcG9pbnRlci5wYXN0VGltZVtsYXN0VG91Y2hJbmRleF0gPSBMb25nLk1JTl9WQUxVRTsKQEAgLTIxNCw2ICsyMjEsNyBAQAogICAgICAgICBwcmV2aW91c1BvaW50ZXIgPSBudWxsOwogICAgICAgICBmb3IgKFBvaW50ZXIgcG9pbnRlciA9IG1Qb2ludGVyTGlzdEhlYWQ7IHBvaW50ZXIgIT0gbnVsbDsgKSB7CiAgICAgICAgICAgICBmaW5hbCBQb2ludGVyIG5leHRQb2ludGVyID0gcG9pbnRlci5uZXh0OworICAgICAgICAgICAgZmluYWwgaW50IHBvaW50ZXJJZCA9IHBvaW50ZXIuaWQ7CiAgICAgICAgICAgICBpZiAocG9pbnRlci5nZW5lcmF0aW9uICE9IGdlbmVyYXRpb24pIHsKICAgICAgICAgICAgICAgICAvLyBQb2ludGVyIHdlbnQgdXAuICBSZW1vdmUgaXQgZnJvbSB0aGUgbGlzdC4KICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNQb2ludGVyID09IG51bGwpIHsKQEAgLTIyMiw2ICsyMzAsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNQb2ludGVyLm5leHQgPSBuZXh0UG9pbnRlcjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmVsZWFzZVBvaW50ZXIocG9pbnRlcik7CisKKyAgICAgICAgICAgICAgICBpZiAocG9pbnRlcklkID09IG1BY3RpdmVQb2ludGVySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUGljayBhIG5ldyBhY3RpdmUgcG9pbnRlci4gSG93IGlzIGFyYml0cmFyeS4KKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IG1Qb2ludGVyTGlzdEhlYWQgIT0gbnVsbCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJMaXN0SGVhZC5pZCA6IElOVkFMSURfUE9JTlRFUjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHByZXZpb3VzUG9pbnRlciA9IHBvaW50ZXI7CiAgICAgICAgICAgICB9CkBAIC0zMzQsNyArMzQ4LDcgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBwcmV2aW91c2x5IGNvbXB1dGVkIFggdmVsb2NpdHkuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFhWZWxvY2l0eSgpIHsKLSAgICAgICAgUG9pbnRlciBwb2ludGVyID0gZ2V0UG9pbnRlcigwKTsKKyAgICAgICAgUG9pbnRlciBwb2ludGVyID0gZ2V0UG9pbnRlcihtQWN0aXZlUG9pbnRlcklkKTsKICAgICAgICAgcmV0dXJuIHBvaW50ZXIgIT0gbnVsbCA/IHBvaW50ZXIueFZlbG9jaXR5IDogMDsKICAgICB9CiAgICAgCkBAIC0zNDUsNyArMzU5LDcgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBwcmV2aW91c2x5IGNvbXB1dGVkIFkgdmVsb2NpdHkuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFlWZWxvY2l0eSgpIHsKLSAgICAgICAgUG9pbnRlciBwb2ludGVyID0gZ2V0UG9pbnRlcigwKTsKKyAgICAgICAgUG9pbnRlciBwb2ludGVyID0gZ2V0UG9pbnRlcihtQWN0aXZlUG9pbnRlcklkKTsKICAgICAgICAgcmV0dXJuIHBvaW50ZXIgIT0gbnVsbCA/IHBvaW50ZXIueVZlbG9jaXR5IDogMDsKICAgICB9CiAgICAgCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCmluZGV4IDNiZTE4YWIuLjM1YjgwNmEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCkBAIC0xNiwxNCArMTYsMTMgQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXc7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKLQoraW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGF0YTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FtZXJhOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuSW50ZXJwb2xhdG9yOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTGluZWFyR3JhZGllbnQ7CkBAIC0zNCw2ICszMyw3IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZlhmZXJtb2RlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ29sb3JEcmF3YWJsZTsKQEAgLTQ3LDggKzQ3LDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlBvb2w7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlBvb2xhYmxlOwpAQCAtNjUsMTIgKzYzLDE1IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0Q29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNjcm9sbEJhckRyYXdhYmxlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyOwogCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwogCiAvKioKQEAgLTI2MCw3ICsyNjEsOCBAQAogICogPHVsPgogICogPGxpPkRlZmluZSBhIEJ1dHRvbiBpbiB0aGUgbGF5b3V0IGZpbGUgYW5kIGFzc2lnbiBpdCBhIHVuaXF1ZSBJRC4KICAqIDxwcmU+Ci0gKiAmbHQ7QnV0dG9uIGlkPSJAK2lkL215X2J1dHRvbiIKKyAqICZsdDtCdXR0b24KKyAqICAgICBhbmRyb2lkOmlkPSJAK2lkL215X2J1dHRvbiIKICAqICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICogICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9teV9idXR0b25fdGV4dCIvJmd0OwpAQCAtOTE3LDYgKzkxOSwyMCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBUFRJQ19GRUVEQkFDS19FTkFCTEVEID0gMHgxMDAwMDAwMDsKIAogICAgIC8qKgorICAgICAqIDxwPkluZGljYXRlcyB0aGF0IHRoZSB2aWV3IGhpZXJhcmNoeSBzaG91bGQgc3RvcCBzYXZpbmcgc3RhdGUgd2hlbgorICAgICAqIGl0IHJlYWNoZXMgdGhpcyB2aWV3LiAgSWYgc3RhdGUgc2F2aW5nIGlzIGluaXRpYXRlZCBpbW1lZGlhdGVseSBhdAorICAgICAqIHRoZSB2aWV3LCBpdCB3aWxsIGJlIGFsbG93ZWQuCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgUEFSRU5UX1NBVkVfRElTQUJMRUQgPSAweDIwMDAwMDAwOworCisgICAgLyoqCisgICAgICogPHA+TWFzayBmb3IgdXNlIHdpdGggc2V0RmxhZ3MgaW5kaWNhdGluZyBiaXRzIHVzZWQgZm9yIFBBUkVOVF9TQVZFX0RJU0FCTEVELjwvcD4KKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBQQVJFTlRfU0FWRV9ESVNBQkxFRF9NQVNLID0gMHgyMDAwMDAwMDsKKworICAgIC8qKgogICAgICAqIFZpZXcgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIge0BsaW5rICNhZGRGb2N1c2FibGVzKEFycmF5TGlzdCwgaW50LCBpbnQpfQogICAgICAqIHNob3VsZCBhZGQgYWxsIGZvY3VzYWJsZSBWaWV3cyByZWdhcmRsZXNzIGlmIHRoZXkgYXJlIGZvY3VzYWJsZSBpbiB0b3VjaCBtb2RlLgogICAgICAqLwpAQCAtOTcyLDcgKzk4OCw3IEBACiAgICAgICogQHNlZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlCiAgICAgICogQHNlZSAjZ2V0RHJhd2FibGVTdGF0ZSgpCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTVBUWV9TVEFURV9TRVQgPSB7fTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEVNUFRZX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgZW5hYmxlZC4gU3RhdGVzIGFyZSB1c2VkIHdpdGgKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZX0gdG8gY2hhbmdlIHRoZSBkcmF3aW5nIG9mIHRoZQpAQCAtOTgxLDcgKzk5Nyw3IEBACiAgICAgICogQHNlZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlCiAgICAgICogQHNlZSAjZ2V0RHJhd2FibGVTdGF0ZSgpCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTkFCTEVEX1NUQVRFX1NFVCA9IHtSLmF0dHIuc3RhdGVfZW5hYmxlZH07CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTkFCTEVEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgZm9jdXNlZC4gU3RhdGVzIGFyZSB1c2VkIHdpdGgKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZX0gdG8gY2hhbmdlIHRoZSBkcmF3aW5nIG9mIHRoZQpAQCAtOTkwLDcgKzEwMDYsNyBAQAogICAgICAqIEBzZWUgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZQogICAgICAqIEBzZWUgI2dldERyYXdhYmxlU3RhdGUoKQogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRk9DVVNFRF9TVEFURV9TRVQgPSB7Ui5hdHRyLnN0YXRlX2ZvY3VzZWR9OworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRk9DVVNFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIHNlbGVjdGVkLiBTdGF0ZXMgYXJlIHVzZWQgd2l0aAogICAgICAqIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlfSB0byBjaGFuZ2UgdGhlIGRyYXdpbmcgb2YgdGhlCkBAIC05OTksNyArMTAxNSw3IEBACiAgICAgICogQHNlZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlCiAgICAgICogQHNlZSAjZ2V0RHJhd2FibGVTdGF0ZSgpCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBTRUxFQ1RFRF9TVEFURV9TRVQgPSB7Ui5hdHRyLnN0YXRlX3NlbGVjdGVkfTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFNFTEVDVEVEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgcHJlc3NlZC4gU3RhdGVzIGFyZSB1c2VkIHdpdGgKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZX0gdG8gY2hhbmdlIHRoZSBkcmF3aW5nIG9mIHRoZQpAQCAtMTAwOSw3ICsxMDI1LDcgQEAKICAgICAgKiBAc2VlICNnZXREcmF3YWJsZVN0YXRlKCkKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9TVEFURV9TRVQgPSB7Ui5hdHRyLnN0YXRlX3ByZXNzZWR9OworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3J3Mgd2luZG93IGhhcyBmb2N1cy4gU3RhdGVzIGFyZSB1c2VkIHdpdGgKICAgICAgKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZX0gdG8gY2hhbmdlIHRoZSBkcmF3aW5nIG9mIHRoZQpAQCAtMTAxOCw4ICsxMDM0LDcgQEAKICAgICAgKiBAc2VlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUKICAgICAgKiBAc2VlICNnZXREcmF3YWJsZVN0YXRlKCkKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFdJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICB7Ui5hdHRyLnN0YXRlX3dpbmRvd19mb2N1c2VkfTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFdJTkRPV19GT0NVU0VEX1NUQVRFX1NFVDsKICAgICAvLyBEb3VibGVzCiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIGVuYWJsZWQgYW5kIGhhcyB0aGUgZm9jdXMuCkBAIC0xMDI3LDQ4ICsxMDQyLDQyIEBACiAgICAgICogQHNlZSAjRU5BQkxFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNGT0NVU0VEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRU5BQkxFRF9GT0NVU0VEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKEVOQUJMRURfU1RBVEVfU0VULCBGT0NVU0VEX1NUQVRFX1NFVCk7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTkFCTEVEX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBlbmFibGVkIGFuZCBzZWxlY3RlZC4KICAgICAgKgogICAgICAqIEBzZWUgI0VOQUJMRURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjU0VMRUNURURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTkFCTEVEX1NFTEVDVEVEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKEVOQUJMRURfU1RBVEVfU0VULCBTRUxFQ1RFRF9TVEFURV9TRVQpOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRU5BQkxFRF9TRUxFQ1RFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIGVuYWJsZWQgYW5kIHRoYXQgaXRzIHdpbmRvdyBoYXMgZm9jdXMuCiAgICAgICoKICAgICAgKiBAc2VlICNFTkFCTEVEX1NUQVRFX1NFVAogICAgICAqIEBzZWUgI1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRU5BQkxFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihFTkFCTEVEX1NUQVRFX1NFVCwgV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEVOQUJMRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBmb2N1c2VkIGFuZCBzZWxlY3RlZC4KICAgICAgKgogICAgICAqIEBzZWUgI0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjU0VMRUNURURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBGT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKEZPQ1VTRURfU1RBVEVfU0VULCBTRUxFQ1RFRF9TVEFURV9TRVQpOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRk9DVVNFRF9TRUxFQ1RFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGhhcyB0aGUgZm9jdXMgYW5kIHRoYXQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgogICAgICAqCiAgICAgICogQHNlZSAjRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEZPQ1VTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0KLSAgICAgICAgICAgIHN0YXRlU2V0VW5pb24oRk9DVVNFRF9TVEFURV9TRVQsIFdJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCk7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBGT0NVU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgc2VsZWN0ZWQgYW5kIHRoYXQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgogICAgICAqCiAgICAgICogQHNlZSAjU0VMRUNURURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBTRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihTRUxFQ1RFRF9TVEFURV9TRVQsIFdJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCk7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBTRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQ7CiAgICAgLy8gVHJpcGxlcwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBlbmFibGVkLCBmb2N1c2VkIGFuZCBzZWxlY3RlZC4KQEAgLTEwNzcsOCArMTA4Niw3IEBACiAgICAgICogQHNlZSAjRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNTRUxFQ1RFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEVOQUJMRURfRk9DVVNFRF9TRUxFQ1RFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihFTkFCTEVEX0ZPQ1VTRURfU1RBVEVfU0VULCBTRUxFQ1RFRF9TVEFURV9TRVQpOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRU5BQkxFRF9GT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgZW5hYmxlZCwgZm9jdXNlZCBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgogICAgICAqCkBAIC0xMDg2LDggKzEwOTQsNyBAQAogICAgICAqIEBzZWUgI0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTkFCTEVEX0ZPQ1VTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0KLSAgICAgICAgICAgIHN0YXRlU2V0VW5pb24oRU5BQkxFRF9GT0NVU0VEX1NUQVRFX1NFVCwgV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEVOQUJMRURfRk9DVVNFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIGVuYWJsZWQsIHNlbGVjdGVkIGFuZCBpdHMgd2luZG93IGhhcyB0aGUgZm9jdXMuCiAgICAgICoKQEAgLTEwOTUsOCArMTEwMiw3IEBACiAgICAgICogQHNlZSAjU0VMRUNURURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTkFCTEVEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKEVOQUJMRURfU0VMRUNURURfU1RBVEVfU0VULCBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQpOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRU5BQkxFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIGZvY3VzZWQsIHNlbGVjdGVkIGFuZCBpdHMgd2luZG93IGhhcyB0aGUgZm9jdXMuCiAgICAgICoKQEAgLTExMDQsOCArMTExMCw3IEBACiAgICAgICogQHNlZSAjU0VMRUNURURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBGT0NVU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKEZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VULCBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQpOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRk9DVVNFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIGVuYWJsZWQsIGZvY3VzZWQsIHNlbGVjdGVkIGFuZCBpdHMgd2luZG93CiAgICAgICogaGFzIHRoZSBmb2N1cy4KQEAgLTExMTUsMjggKzExMjAsMjEgQEAKICAgICAgKiBAc2VlICNTRUxFQ1RFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIEVOQUJMRURfRk9DVVNFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihFTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQpOwotCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBFTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBwcmVzc2VkIGFuZCBpdHMgd2luZG93IGhhcyB0aGUgZm9jdXMuCiAgICAgICoKICAgICAgKiBAc2VlICNQUkVTU0VEX1NUQVRFX1NFVAogICAgICAqIEBzZWUgI1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihQUkVTU0VEX1NUQVRFX1NFVCwgV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUKTsKLQorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIHByZXNzZWQgYW5kIHNlbGVjdGVkLgogICAgICAqCiAgICAgICogQHNlZSAjUFJFU1NFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNTRUxFQ1RFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfU0VMRUNURURfU1RBVEVfU0VUID0KLSAgICAgICAgICAgIHN0YXRlU2V0VW5pb24oUFJFU1NFRF9TVEFURV9TRVQsIFNFTEVDVEVEX1NUQVRFX1NFVCk7Ci0KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfU0VMRUNURURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBwcmVzc2VkLCBzZWxlY3RlZCBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgogICAgICAqCkBAIC0xMTQ0LDE4ICsxMTQyLDE0IEBACiAgICAgICogQHNlZSAjU0VMRUNURURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKFBSRVNTRURfU0VMRUNURURfU1RBVEVfU0VULCBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQpOwotCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgcHJlc3NlZCBhbmQgZm9jdXNlZC4KICAgICAgKgogICAgICAqIEBzZWUgI1BSRVNTRURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihQUkVTU0VEX1NUQVRFX1NFVCwgRk9DVVNFRF9TVEFURV9TRVQpOwotCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBwcmVzc2VkLCBmb2N1c2VkIGFuZCBpdHMgd2luZG93IGhhcyB0aGUgZm9jdXMuCiAgICAgICoKQEAgLTExNjMsOSArMTE1Nyw3IEBACiAgICAgICogQHNlZSAjRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRk9DVVNFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihQUkVTU0VEX0ZPQ1VTRURfU1RBVEVfU0VULCBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQpOwotCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0ZPQ1VTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBwcmVzc2VkLCBmb2N1c2VkIGFuZCBzZWxlY3RlZC4KICAgICAgKgpAQCAtMTE3Myw5ICsxMTY1LDcgQEAKICAgICAgKiBAc2VlICNTRUxFQ1RFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNGT0NVU0VEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9GT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKFBSRVNTRURfRk9DVVNFRF9TVEFURV9TRVQsIFNFTEVDVEVEX1NUQVRFX1NFVCk7Ci0KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRk9DVVNFRF9TRUxFQ1RFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIHByZXNzZWQsIGZvY3VzZWQsIHNlbGVjdGVkIGFuZCBpdHMgd2luZG93IGhhcyB0aGUgZm9jdXMuCiAgICAgICoKQEAgLTExODQsMTggKzExNzQsMTQgQEAKICAgICAgKiBAc2VlICNTRUxFQ1RFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRk9DVVNFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihQUkVTU0VEX0ZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VULCBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQpOwotCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0ZPQ1VTRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBwcmVzc2VkIGFuZCBlbmFibGVkLgogICAgICAqCiAgICAgICogQHNlZSAjUFJFU1NFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNFTkFCTEVEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9FTkFCTEVEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKFBSRVNTRURfU1RBVEVfU0VULCBFTkFCTEVEX1NUQVRFX1NFVCk7Ci0KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRU5BQkxFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIHByZXNzZWQsIGVuYWJsZWQgYW5kIGl0cyB3aW5kb3cgaGFzIHRoZSBmb2N1cy4KICAgICAgKgpAQCAtMTIwMyw5ICsxMTg5LDcgQEAKICAgICAgKiBAc2VlICNFTkFCTEVEX1NUQVRFX1NFVAogICAgICAqIEBzZWUgI1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9FTkFCTEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKFBSRVNTRURfRU5BQkxFRF9TVEFURV9TRVQsIFdJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCk7Ci0KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRU5BQkxFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIHByZXNzZWQsIGVuYWJsZWQgYW5kIHNlbGVjdGVkLgogICAgICAqCkBAIC0xMjEzLDkgKzExOTcsNyBAQAogICAgICAqIEBzZWUgI0VOQUJMRURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjU0VMRUNURURfU1RBVEVfU0VUCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0VOQUJMRURfU0VMRUNURURfU1RBVEVfU0VUID0KLSAgICAgICAgICAgIHN0YXRlU2V0VW5pb24oUFJFU1NFRF9FTkFCTEVEX1NUQVRFX1NFVCwgU0VMRUNURURfU1RBVEVfU0VUKTsKLQorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9FTkFCTEVEX1NFTEVDVEVEX1NUQVRFX1NFVDsKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgcHJlc3NlZCwgZW5hYmxlZCwgc2VsZWN0ZWQgYW5kIGl0cyB3aW5kb3cgaGFzIHRoZQogICAgICAqIGZvY3VzLgpAQCAtMTIyNSw5ICsxMjA3LDcgQEAKICAgICAgKiBAc2VlICNTRUxFQ1RFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRU5BQkxFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPQotICAgICAgICAgICAgc3RhdGVTZXRVbmlvbihQUkVTU0VEX0VOQUJMRURfU0VMRUNURURfU1RBVEVfU0VULCBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQpOwotCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0VOQUJMRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBwcmVzc2VkLCBlbmFibGVkIGFuZCBmb2N1c2VkLgogICAgICAqCkBAIC0xMjM1LDkgKzEyMTUsNyBAQAogICAgICAqIEBzZWUgI0VOQUJMRURfU1RBVEVfU0VUCiAgICAgICogQHNlZSAjRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKFBSRVNTRURfRU5BQkxFRF9TVEFURV9TRVQsIEZPQ1VTRURfU1RBVEVfU0VUKTsKLQorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9FTkFCTEVEX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBwcmVzc2VkLCBlbmFibGVkLCBmb2N1c2VkIGFuZCBpdHMgd2luZG93IGhhcyB0aGUKICAgICAgKiBmb2N1cy4KQEAgLTEyNDcsOSArMTIyNSw3IEBACiAgICAgICogQHNlZSAjRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKFBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1NUQVRFX1NFVCwgV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUKTsKLQorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9FTkFCTEVEX0ZPQ1VTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUOwogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBwcmVzc2VkLCBlbmFibGVkLCBmb2N1c2VkIGFuZCBzZWxlY3RlZC4KICAgICAgKgpAQCAtMTI1OCw5ICsxMjM0LDcgQEAKICAgICAgKiBAc2VlICNTRUxFQ1RFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNGT0NVU0VEX1NUQVRFX1NFVAogICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9FTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VUID0KLSAgICAgICAgICAgIHN0YXRlU2V0VW5pb24oUFJFU1NFRF9FTkFCTEVEX0ZPQ1VTRURfU1RBVEVfU0VULCBTRUxFQ1RFRF9TVEFURV9TRVQpOwotCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX0VOQUJMRURfRk9DVVNFRF9TRUxFQ1RFRF9TVEFURV9TRVQ7CiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRoZSB2aWV3IGlzIHByZXNzZWQsIGVuYWJsZWQsIGZvY3VzZWQsIHNlbGVjdGVkIGFuZCBpdHMgd2luZG93CiAgICAgICogaGFzIHRoZSBmb2N1cy4KQEAgLTEyNzEsNDcgKzEyNDUsMTMyIEBACiAgICAgICogQHNlZSAjRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKiBAc2VlICNXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9Ci0gICAgICAgICAgICBzdGF0ZVNldFVuaW9uKFBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCwgV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVDsKIAogICAgIC8qKgogICAgICAqIFRoZSBvcmRlciBoZXJlIGlzIHZlcnkgaW1wb3J0YW50IHRvIHtAbGluayAjZ2V0RHJhd2FibGVTdGF0ZSgpfQogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdW10gVklFV19TVEFURV9TRVRTID0gewotICAgICAgICBFTVBUWV9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMCAwIDAgMAotICAgICAgICBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMCAwIDAgMQotICAgICAgICBTRUxFQ1RFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMCAwIDEgMAotICAgICAgICBTRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMCAwIDEgMQotICAgICAgICBGT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMCAxIDAgMAotICAgICAgICBGT0NVU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMCAxIDAgMQotICAgICAgICBGT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMCAxIDEgMAotICAgICAgICBGT0NVU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgIC8vIDAgMCAxIDEgMQotICAgICAgICBFTkFCTEVEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMSAwIDAgMAotICAgICAgICBFTkFCTEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMSAwIDAgMQotICAgICAgICBFTkFCTEVEX1NFTEVDVEVEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMSAwIDEgMAotICAgICAgICBFTkFCTEVEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgIC8vIDAgMSAwIDEgMQotICAgICAgICBFTkFCTEVEX0ZPQ1VTRURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMSAxIDAgMAotICAgICAgICBFTkFCTEVEX0ZPQ1VTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgIC8vIDAgMSAxIDAgMQotICAgICAgICBFTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgMSAxIDEgMAotICAgICAgICBFTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VULCAgICAgICAgIC8vIDAgMSAxIDEgMQotICAgICAgICBQUkVTU0VEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgMCAwIDAgMAotICAgICAgICBQUkVTU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgMCAwIDAgMQotICAgICAgICBQUkVTU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgMCAwIDEgMAotICAgICAgICBQUkVTU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCwgICAgICAgICAgICAgICAgIC8vIDEgMCAwIDEgMQotICAgICAgICBQUkVTU0VEX0ZPQ1VTRURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgMCAxIDAgMAotICAgICAgICBQUkVTU0VEX0ZPQ1VTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgIC8vIDEgMCAxIDAgMQotICAgICAgICBQUkVTU0VEX0ZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgMCAxIDEgMAotICAgICAgICBQUkVTU0VEX0ZPQ1VTRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VULCAgICAgICAgIC8vIDEgMCAxIDEgMQotICAgICAgICBQUkVTU0VEX0VOQUJMRURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgMSAwIDAgMAotICAgICAgICBQUkVTU0VEX0VOQUJMRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgIC8vIDEgMSAwIDAgMQotICAgICAgICBQUkVTU0VEX0VOQUJMRURfU0VMRUNURURfU1RBVEVfU0VULCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgMSAwIDEgMAotICAgICAgICBQUkVTU0VEX0VOQUJMRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VULCAgICAgICAgIC8vIDEgMSAwIDEgMQotICAgICAgICBQUkVTU0VEX0VOQUJMRURfRk9DVVNFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgMSAxIDAgMAotICAgICAgICBQUkVTU0VEX0VOQUJMRURfRk9DVVNFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQsICAgICAgICAgIC8vIDEgMSAxIDAgMQotICAgICAgICBQUkVTU0VEX0VOQUJMRURfRk9DVVNFRF9TRUxFQ1RFRF9TVEFURV9TRVQsICAgICAgICAgICAgICAgIC8vIDEgMSAxIDEgMAotICAgICAgICBQUkVTU0VEX0VOQUJMRURfRk9DVVNFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQsIC8vIDEgMSAxIDEgMQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdW10gVklFV19TVEFURV9TRVRTOworCisgICAgc3RhdGljIGZpbmFsIGludCBWSUVXX1NUQVRFX1dJTkRPV19GT0NVU0VEID0gMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFZJRVdfU1RBVEVfU0VMRUNURUQgPSAxIDw8IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBWSUVXX1NUQVRFX0ZPQ1VTRUQgPSAxIDw8IDI7CisgICAgc3RhdGljIGZpbmFsIGludCBWSUVXX1NUQVRFX0VOQUJMRUQgPSAxIDw8IDM7CisgICAgc3RhdGljIGZpbmFsIGludCBWSUVXX1NUQVRFX1BSRVNTRUQgPSAxIDw8IDQ7CisgICAgc3RhdGljIGZpbmFsIGludCBWSUVXX1NUQVRFX0FDVElWQVRFRCA9IDEgPDwgNTsKKworICAgIHN0YXRpYyBmaW5hbCBpbnRbXSBWSUVXX1NUQVRFX0lEUyA9IG5ldyBpbnRbXSB7CisgICAgICAgIFIuYXR0ci5zdGF0ZV93aW5kb3dfZm9jdXNlZCwgICAgVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRCwKKyAgICAgICAgUi5hdHRyLnN0YXRlX3NlbGVjdGVkLCAgICAgICAgICBWSUVXX1NUQVRFX1NFTEVDVEVELAorICAgICAgICBSLmF0dHIuc3RhdGVfZm9jdXNlZCwgICAgICAgICAgIFZJRVdfU1RBVEVfRk9DVVNFRCwKKyAgICAgICAgUi5hdHRyLnN0YXRlX2VuYWJsZWQsICAgICAgICAgICBWSUVXX1NUQVRFX0VOQUJMRUQsCisgICAgICAgIFIuYXR0ci5zdGF0ZV9wcmVzc2VkLCAgICAgICAgICAgVklFV19TVEFURV9QUkVTU0VELAorICAgICAgICBSLmF0dHIuc3RhdGVfYWN0aXZhdGVkLCAgICAgICAgIFZJRVdfU1RBVEVfQUNUSVZBVEVELAogICAgIH07CiAKKyAgICBzdGF0aWMgeworICAgICAgICBpbnRbXSBvcmRlcmVkSWRzID0gbmV3IGludFtWSUVXX1NUQVRFX0lEUy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFIuc3R5bGVhYmxlLlZpZXdEcmF3YWJsZVN0YXRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaW50IHZpZXdTdGF0ZSA9IFIuc3R5bGVhYmxlLlZpZXdEcmF3YWJsZVN0YXRlc1tpXTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqPFZJRVdfU1RBVEVfSURTLmxlbmd0aDsgaiArPSAyKSB7CisgICAgICAgICAgICAgICAgaWYgKFZJRVdfU1RBVEVfSURTW2pdID09IHZpZXdTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBvcmRlcmVkSWRzW2kgKiAyXSA9IHZpZXdTdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgb3JkZXJlZElkc1tpICogMiArIDFdID0gVklFV19TVEFURV9JRFNbaiArIDFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgTlVNX0JJVFMgPSBWSUVXX1NUQVRFX0lEUy5sZW5ndGggLyAyOworICAgICAgICBWSUVXX1NUQVRFX1NFVFMgPSBuZXcgaW50WzEgPDwgTlVNX0JJVFNdW107CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVklFV19TVEFURV9TRVRTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgbnVtQml0cyA9IEludGVnZXIuYml0Q291bnQoaSk7CisgICAgICAgICAgICBpbnRbXSBzZXQgPSBuZXcgaW50W251bUJpdHNdOworICAgICAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG9yZGVyZWRJZHMubGVuZ3RoOyBqICs9IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGkgJiBvcmRlcmVkSWRzW2orMV0pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0W3BvcysrXSA9IG9yZGVyZWRJZHNbal07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgVklFV19TVEFURV9TRVRTW2ldID0gc2V0OworICAgICAgICB9CisKKyAgICAgICAgRU1QVFlfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWzBdOworICAgICAgICBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRF07CisgICAgICAgIFNFTEVDVEVEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1tWSUVXX1NUQVRFX1NFTEVDVEVEXTsKKyAgICAgICAgU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfV0lORE9XX0ZPQ1VTRUQgfCBWSUVXX1NUQVRFX1NFTEVDVEVEXTsKKyAgICAgICAgRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbVklFV19TVEFURV9GT0NVU0VEXTsKKyAgICAgICAgRk9DVVNFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRCB8IFZJRVdfU1RBVEVfRk9DVVNFRF07CisgICAgICAgIEZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfU0VMRUNURUQgfCBWSUVXX1NUQVRFX0ZPQ1VTRURdOworICAgICAgICBGT0NVU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1dJTkRPV19GT0NVU0VEIHwgVklFV19TVEFURV9TRUxFQ1RFRAorICAgICAgICAgICAgICAgIHwgVklFV19TVEFURV9GT0NVU0VEXTsKKyAgICAgICAgRU5BQkxFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbVklFV19TVEFURV9FTkFCTEVEXTsKKyAgICAgICAgRU5BQkxFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRCB8IFZJRVdfU1RBVEVfRU5BQkxFRF07CisgICAgICAgIEVOQUJMRURfU0VMRUNURURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfU0VMRUNURUQgfCBWSUVXX1NUQVRFX0VOQUJMRURdOworICAgICAgICBFTkFCTEVEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1dJTkRPV19GT0NVU0VEIHwgVklFV19TVEFURV9TRUxFQ1RFRAorICAgICAgICAgICAgICAgIHwgVklFV19TVEFURV9FTkFCTEVEXTsKKyAgICAgICAgRU5BQkxFRF9GT0NVU0VEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX0ZPQ1VTRUQgfCBWSUVXX1NUQVRFX0VOQUJMRURdOworICAgICAgICBFTkFCTEVEX0ZPQ1VTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfV0lORE9XX0ZPQ1VTRUQgfCBWSUVXX1NUQVRFX0ZPQ1VTRUQKKyAgICAgICAgICAgICAgICB8IFZJRVdfU1RBVEVfRU5BQkxFRF07CisgICAgICAgIEVOQUJMRURfRk9DVVNFRF9TRUxFQ1RFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9TRUxFQ1RFRCB8IFZJRVdfU1RBVEVfRk9DVVNFRAorICAgICAgICAgICAgICAgIHwgVklFV19TVEFURV9FTkFCTEVEXTsKKyAgICAgICAgRU5BQkxFRF9GT0NVU0VEX1NFTEVDVEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1dJTkRPV19GT0NVU0VEIHwgVklFV19TVEFURV9TRUxFQ1RFRAorICAgICAgICAgICAgICAgIHwgVklFV19TVEFURV9GT0NVU0VEfCBWSUVXX1NUQVRFX0VOQUJMRURdOworCisgICAgICAgIFBSRVNTRURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTW1ZJRVdfU1RBVEVfUFJFU1NFRF07CisgICAgICAgIFBSRVNTRURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfV0lORE9XX0ZPQ1VTRUQgfCBWSUVXX1NUQVRFX1BSRVNTRURdOworICAgICAgICBQUkVTU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1NFTEVDVEVEIHwgVklFV19TVEFURV9QUkVTU0VEXTsKKyAgICAgICAgUFJFU1NFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRCB8IFZJRVdfU1RBVEVfU0VMRUNURUQKKyAgICAgICAgICAgICAgICB8IFZJRVdfU1RBVEVfUFJFU1NFRF07CisgICAgICAgIFBSRVNTRURfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9GT0NVU0VEIHwgVklFV19TVEFURV9QUkVTU0VEXTsKKyAgICAgICAgUFJFU1NFRF9GT0NVU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1dJTkRPV19GT0NVU0VEIHwgVklFV19TVEFURV9GT0NVU0VECisgICAgICAgICAgICAgICAgfCBWSUVXX1NUQVRFX1BSRVNTRURdOworICAgICAgICBQUkVTU0VEX0ZPQ1VTRURfU0VMRUNURURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfU0VMRUNURUQgfCBWSUVXX1NUQVRFX0ZPQ1VTRUQKKyAgICAgICAgICAgICAgICB8IFZJRVdfU1RBVEVfUFJFU1NFRF07CisgICAgICAgIFBSRVNTRURfRk9DVVNFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRCB8IFZJRVdfU1RBVEVfU0VMRUNURUQKKyAgICAgICAgICAgICAgICB8IFZJRVdfU1RBVEVfRk9DVVNFRCB8IFZJRVdfU1RBVEVfUFJFU1NFRF07CisgICAgICAgIFBSRVNTRURfRU5BQkxFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9FTkFCTEVEIHwgVklFV19TVEFURV9QUkVTU0VEXTsKKyAgICAgICAgUFJFU1NFRF9FTkFCTEVEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1dJTkRPV19GT0NVU0VEIHwgVklFV19TVEFURV9FTkFCTEVECisgICAgICAgICAgICAgICAgfCBWSUVXX1NUQVRFX1BSRVNTRURdOworICAgICAgICBQUkVTU0VEX0VOQUJMRURfU0VMRUNURURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfU0VMRUNURUQgfCBWSUVXX1NUQVRFX0VOQUJMRUQKKyAgICAgICAgICAgICAgICB8IFZJRVdfU1RBVEVfUFJFU1NFRF07CisgICAgICAgIFBSRVNTRURfRU5BQkxFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9XSU5ET1dfRk9DVVNFRCB8IFZJRVdfU1RBVEVfU0VMRUNURUQKKyAgICAgICAgICAgICAgICB8IFZJRVdfU1RBVEVfRU5BQkxFRCB8IFZJRVdfU1RBVEVfUFJFU1NFRF07CisgICAgICAgIFBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX0ZPQ1VTRUQgfCBWSUVXX1NUQVRFX0VOQUJMRUQKKyAgICAgICAgICAgICAgICB8IFZJRVdfU1RBVEVfUFJFU1NFRF07CisgICAgICAgIFBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVCA9IFZJRVdfU1RBVEVfU0VUU1sKKyAgICAgICAgICAgICAgICBWSUVXX1NUQVRFX1dJTkRPV19GT0NVU0VEIHwgVklFV19TVEFURV9GT0NVU0VECisgICAgICAgICAgICAgICAgfCBWSUVXX1NUQVRFX0VOQUJMRUQgfCBWSUVXX1NUQVRFX1BSRVNTRURdOworICAgICAgICBQUkVTU0VEX0VOQUJMRURfRk9DVVNFRF9TRUxFQ1RFRF9TVEFURV9TRVQgPSBWSUVXX1NUQVRFX1NFVFNbCisgICAgICAgICAgICAgICAgVklFV19TVEFURV9TRUxFQ1RFRCB8IFZJRVdfU1RBVEVfRk9DVVNFRAorICAgICAgICAgICAgICAgIHwgVklFV19TVEFURV9FTkFCTEVEIHwgVklFV19TVEFURV9QUkVTU0VEXTsKKyAgICAgICAgUFJFU1NFRF9FTkFCTEVEX0ZPQ1VTRURfU0VMRUNURURfV0lORE9XX0ZPQ1VTRURfU1RBVEVfU0VUID0gVklFV19TVEFURV9TRVRTWworICAgICAgICAgICAgICAgIFZJRVdfU1RBVEVfV0lORE9XX0ZPQ1VTRUQgfCBWSUVXX1NUQVRFX1NFTEVDVEVECisgICAgICAgICAgICAgICAgfCBWSUVXX1NUQVRFX0ZPQ1VTRUR8IFZJRVdfU1RBVEVfRU5BQkxFRAorICAgICAgICAgICAgICAgIHwgVklFV19TVEFURV9QUkVTU0VEXTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBVc2VkIGJ5IHZpZXdzIHRoYXQgY29udGFpbiBsaXN0cyBvZiBpdGVtcy4gVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhhdAogICAgICAqIHRoZSB2aWV3IGlzIHNob3dpbmcgdGhlIGxhc3QgaXRlbS4KQEAgLTE1NTEsMzggKzE2MTAsMTUgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVdBS0VOX1NDUk9MTF9CQVJTX09OX0FUVEFDSCA9IDB4MDgwMDAwMDA7CiAKICAgICAvKioKLSAgICAgKiBBbHdheXMgYWxsb3cgYSB1c2VyIHRvIG92ZXJzY3JvbGwgdGhpcyB2aWV3LCBwcm92aWRlZCBpdCBpcyBhCi0gICAgICogdmlldyB0aGF0IGNhbiBzY3JvbGwuCisgICAgICogSW5kaWNhdGVzIHRoYXQgcGl2b3RYIG9yIHBpdm90WSB3ZXJlIGV4cGxpY2l0bHkgc2V0IGFuZCB3ZSBzaG91bGQgbm90IGFzc3VtZSB0aGUgY2VudGVyCisgICAgICogZm9yIHRyYW5zZm9ybSBvcGVyYXRpb25zCiAgICAgICoKLSAgICAgKiBAc2VlICNnZXRPdmVyc2Nyb2xsTW9kZSgpCi0gICAgICogQHNlZSAjc2V0T3ZlcnNjcm9sbE1vZGUoaW50KQorICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1ZFUlNDUk9MTF9BTFdBWVMgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQSVZPVF9FWFBMSUNJVExZX1NFVCA9IDB4MjAwMDAwMDA7CiAKLSAgICAvKioKLSAgICAgKiBBbGxvdyBhIHVzZXIgdG8gb3ZlcnNjcm9sbCB0aGlzIHZpZXcgb25seSBpZiB0aGUgY29udGVudCBpcyBsYXJnZQotICAgICAqIGVub3VnaCB0byBtZWFuaW5nZnVsbHkgc2Nyb2xsLCBwcm92aWRlZCBpdCBpcyBhIHZpZXcgdGhhdCBjYW4gc2Nyb2xsLgotICAgICAqCi0gICAgICogQHNlZSAjZ2V0T3ZlcnNjcm9sbE1vZGUoKQotICAgICAqIEBzZWUgI3NldE92ZXJzY3JvbGxNb2RlKGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVkVSU0NST0xMX0lGX0NPTlRFTlRfU0NST0xMUyA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBOZXZlciBhbGxvdyBhIHVzZXIgdG8gb3ZlcnNjcm9sbCB0aGlzIHZpZXcuCi0gICAgICoKLSAgICAgKiBAc2VlICNnZXRPdmVyc2Nyb2xsTW9kZSgpCi0gICAgICogQHNlZSAjc2V0T3ZlcnNjcm9sbE1vZGUoaW50KQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9WRVJTQ1JPTExfTkVWRVIgPSAyOwotCi0gICAgLyoqCi0gICAgICogQ29udHJvbHMgdGhlIG92ZXJzY3JvbGwgbW9kZSBmb3IgdGhpcyB2aWV3LgotICAgICAqIFNlZSB7QGxpbmsgI292ZXJzY3JvbGxCeShpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgYm9vbGVhbil9LAotICAgICAqIHtAbGluayAjT1ZFUlNDUk9MTF9BTFdBWVN9LCB7QGxpbmsgI09WRVJTQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTfSwKLSAgICAgKiBhbmQge0BsaW5rICNPVkVSU0NST0xMX05FVkVSfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtT3ZlcnNjcm9sbE1vZGU7CisgICAgLyoqIHtAaGlkZX0gKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEFDVElWQVRFRCAgICAgICAgICAgICAgICAgICAgPSAweDQwMDAwMDAwOwogCiAgICAgLyoqCiAgICAgICogVGhlIHBhcmVudCB0aGlzIHZpZXcgaXMgYXR0YWNoZWQgdG8uCkBAIC0xNjM1LDYgKzE2NzEsMTM2IEBACiAgICAgaW50IG1WaWV3RmxhZ3M7CiAKICAgICAvKioKKyAgICAgKiBUaGUgdHJhbnNmb3JtIG1hdHJpeCBmb3IgdGhlIFZpZXcuIFRoaXMgdHJhbnNmb3JtIGlzIGNhbGN1bGF0ZWQgaW50ZXJuYWxseQorICAgICAqIGJhc2VkIG9uIHRoZSByb3RhdGlvbiwgc2NhbGVYLCBhbmQgc2NhbGVZIHByb3BlcnRpZXMuIFRoZSBpZGVudGl0eSBtYXRyaXgKKyAgICAgKiBpcyB1c2VkIGJ5IGRlZmF1bHQuIERvICpub3QqIHVzZSB0aGlzIHZhcmlhYmxlIGRpcmVjdGx5OyBpbnN0ZWFkIGNhbGwKKyAgICAgKiBnZXRNYXRyaXgoKSwgd2hpY2ggd2lsbCBhdXRvbWF0aWNhbGx5IHJlY2FsY3VsYXRlIHRoZSBtYXRyaXggaWYgbmVjZXNzYXJ5CisgICAgICogdG8gZ2V0IHRoZSBjb3JyZWN0IG1hdHJpeCBiYXNlZCBvbiB0aGUgbGF0ZXN0IHJvdGF0aW9uIGFuZCBzY2FsZSBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgTWF0cml4IG1NYXRyaXggPSBuZXcgTWF0cml4KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHJhbnNmb3JtIG1hdHJpeCBmb3IgdGhlIFZpZXcuIFRoaXMgdHJhbnNmb3JtIGlzIGNhbGN1bGF0ZWQgaW50ZXJuYWxseQorICAgICAqIGJhc2VkIG9uIHRoZSByb3RhdGlvbiwgc2NhbGVYLCBhbmQgc2NhbGVZIHByb3BlcnRpZXMuIFRoZSBpZGVudGl0eSBtYXRyaXgKKyAgICAgKiBpcyB1c2VkIGJ5IGRlZmF1bHQuIERvICpub3QqIHVzZSB0aGlzIHZhcmlhYmxlIGRpcmVjdGx5OyBpbnN0ZWFkIGNhbGwKKyAgICAgKiBnZXRJbnZlcnNlTWF0cml4KCksIHdoaWNoIHdpbGwgYXV0b21hdGljYWxseSByZWNhbGN1bGF0ZSB0aGUgbWF0cml4IGlmIG5lY2Vzc2FyeQorICAgICAqIHRvIGdldCB0aGUgY29ycmVjdCBtYXRyaXggYmFzZWQgb24gdGhlIGxhdGVzdCByb3RhdGlvbiBhbmQgc2NhbGUgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1hdHJpeCBtSW52ZXJzZU1hdHJpeDsKKworICAgIC8qKgorICAgICAqIEFuIGludGVybmFsIHZhcmlhYmxlIHRoYXQgdHJhY2tzIHdoZXRoZXIgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUKKyAgICAgKiB0cmFuc2Zvcm0gbWF0cml4LCBiYXNlZCBvbiB3aGV0aGVyIHRoZSByb3RhdGlvbiBvciBzY2FsZVgvWSBwcm9wZXJ0aWVzCisgICAgICogaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBtYXRyaXggd2FzIGxhc3QgY2FsY3VsYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU1hdHJpeERpcnR5ID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlcm5hbCB2YXJpYWJsZSB0aGF0IHRyYWNrcyB3aGV0aGVyIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlCisgICAgICogdHJhbnNmb3JtIG1hdHJpeCwgYmFzZWQgb24gd2hldGhlciB0aGUgcm90YXRpb24gb3Igc2NhbGVYL1kgcHJvcGVydGllcworICAgICAqIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbWF0cml4IHdhcyBsYXN0IGNhbGN1bGF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1JbnZlcnNlTWF0cml4RGlydHkgPSB0cnVlOworCisgICAgLyoqCisgICAgICogQSB2YXJpYWJsZSB0aGF0IHRyYWNrcyB3aGV0aGVyIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlCisgICAgICogdHJhbnNmb3JtIG1hdHJpeCwgYmFzZWQgb24gd2hldGhlciB0aGUgcm90YXRpb24gb3Igc2NhbGVYL1kgcHJvcGVydGllcworICAgICAqIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbWF0cml4IHdhcyBsYXN0IGNhbGN1bGF0ZWQuIFRoaXMgdmFyaWFibGUKKyAgICAgKiBpcyBvbmx5IHZhbGlkIGFmdGVyIGEgY2FsbCB0byB1cGRhdGVNYXRyaXgoKSBvciB0byBhIGZ1bmN0aW9uIHRoYXQKKyAgICAgKiBjYWxscyBpdCBzdWNoIGFzIGdldE1hdHJpeCgpLCBoYXNJZGVudGl0eU1hdHJpeCgpIGFuZCBnZXRJbnZlcnNlTWF0cml4KCkuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1NYXRyaXhJc0lkZW50aXR5ID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIFRoZSBDYW1lcmEgb2JqZWN0IGlzIHVzZWQgdG8gY29tcHV0ZSBhIDNEIG1hdHJpeCB3aGVuIHJvdGF0aW9uWCBvciByb3RhdGlvblkgYXJlIHNldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIENhbWVyYSBtQ2FtZXJhID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWF0cml4IGlzIHVzZWQgd2hlbiBjb21wdXRpbmcgdGhlIG1hdHJpeCBmb3IgM0Qgcm90YXRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgTWF0cml4IG1hdHJpeDNEID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZXNlIHByZXYgdmFsdWVzIGFyZSB1c2VkIHRvIHJlY2FsY3VsYXRlIGEgY2VudGVyZWQgcGl2b3QgcG9pbnQgd2hlbiBuZWNlc3NhcnkuIFRoZQorICAgICAqIHBpdm90IHBvaW50IGlzIG9ubHkgdXNlZCBpbiBtYXRyaXggb3BlcmF0aW9ucyAod2hlbiByb3RhdGlvbiwgc2NhbGUsIG9yIHRyYW5zbGF0aW9uIGFyZQorICAgICAqIHNldCksIHNvIHRoZXMgdmFsdWVzIGFyZSBvbmx5IHVzZWQgdGhlbiBhcyB3ZWxsLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1QcmV2V2lkdGggPSAtMTsKKyAgICBwcml2YXRlIGludCBtUHJldkhlaWdodCA9IC0xOworCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgdmFsdWUgdG8gY2hlY2sgZm9yIGZsb2F0IHZhbHVlcyB0aGF0IGFyZSBjbG9zZSBlbm91Z2ggdG8gemVybyB0byBiZSBjb25zaWRlcmVkCisgICAgICogemVyby4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBOT05aRVJPX0VQU0lMT04gPSAuMDAxZjsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWdyZWVzIHJvdGF0aW9uIGFyb3VuZCB0aGUgdmVydGljYWwgYXhpcyB0aHJvdWdoIHRoZSBwaXZvdCBwb2ludC4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1Sb3RhdGlvblkgPSAwZjsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWdyZWVzIHJvdGF0aW9uIGFyb3VuZCB0aGUgaG9yaXpvbnRhbCBheGlzIHRocm91Z2ggdGhlIHBpdm90IHBvaW50LgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbVJvdGF0aW9uWCA9IDBmOworCisgICAgLyoqCisgICAgICogVGhlIGRlZ3JlZXMgcm90YXRpb24gYXJvdW5kIHRoZSBwaXZvdCBwb2ludC4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1Sb3RhdGlvbiA9IDBmOworCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiB0cmFuc2xhdGlvbiBvZiB0aGUgb2JqZWN0IGF3YXkgZnJvbSBpdHMgbGVmdCBwcm9wZXJ0eSAocG9zdC1sYXlvdXQpLgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbVRyYW5zbGF0aW9uWCA9IDBmOworCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiB0cmFuc2xhdGlvbiBvZiB0aGUgb2JqZWN0IGF3YXkgZnJvbSBpdHMgdG9wIHByb3BlcnR5IChwb3N0LWxheW91dCkuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtVHJhbnNsYXRpb25ZID0gMGY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHNjYWxlIGluIHRoZSB4IGRpcmVjdGlvbiBhcm91bmQgdGhlIHBpdm90IHBvaW50LiBBCisgICAgICogdmFsdWUgb2YgMSBtZWFucyBubyBzY2FsaW5nIGlzIGFwcGxpZWQuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtU2NhbGVYID0gMWY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHNjYWxlIGluIHRoZSB5IGRpcmVjdGlvbiBhcm91bmQgdGhlIHBpdm90IHBvaW50LiBBCisgICAgICogdmFsdWUgb2YgMSBtZWFucyBubyBzY2FsaW5nIGlzIGFwcGxpZWQuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtU2NhbGVZID0gMWY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHNjYWxlIGluIHRoZSB4IGRpcmVjdGlvbiBhcm91bmQgdGhlIHBpdm90IHBvaW50LiBBCisgICAgICogdmFsdWUgb2YgMSBtZWFucyBubyBzY2FsaW5nIGlzIGFwcGxpZWQuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtUGl2b3RYID0gMGY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHNjYWxlIGluIHRoZSB5IGRpcmVjdGlvbiBhcm91bmQgdGhlIHBpdm90IHBvaW50LiBBCisgICAgICogdmFsdWUgb2YgMSBtZWFucyBubyBzY2FsaW5nIGlzIGFwcGxpZWQuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtUGl2b3RZID0gMGY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3BhY2l0eSBvZiB0aGUgVmlldy4gVGhpcyBpcyBhIHZhbHVlIGZyb20gMCB0byAxLCB3aGVyZSAwIG1lYW5zCisgICAgICogY29tcGxldGVseSB0cmFuc3BhcmVudCBhbmQgMSBtZWFucyBjb21wbGV0ZWx5IG9wYXF1ZS4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1BbHBoYSA9IDFmOworCisgICAgLyoqCiAgICAgICogVGhlIGRpc3RhbmNlIGluIHBpeGVscyBmcm9tIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhpcyB2aWV3J3MgcGFyZW50CiAgICAgICogdG8gdGhlIGxlZnQgZWRnZSBvZiB0aGlzIHZpZXcuCiAgICAgICoge0BoaWRlfQpAQCAtMTc0OCw2ICsxOTE0LDExIEBACiAgICAgcHJvdGVjdGVkIE9uRm9jdXNDaGFuZ2VMaXN0ZW5lciBtT25Gb2N1c0NoYW5nZUxpc3RlbmVyOwogCiAgICAgLyoqCisgICAgICogTGlzdGVuZXJzIGZvciBsYXlvdXQgY2hhbmdlIGV2ZW50cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxPbkxheW91dENoYW5nZUxpc3RlbmVyPiBtT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcnM7CisKKyAgICAvKioKICAgICAgKiBMaXN0ZW5lciB1c2VkIHRvIGRpc3BhdGNoIGNsaWNrIGV2ZW50cy4KICAgICAgKiBUaGlzIGZpZWxkIHNob3VsZCBiZSBtYWRlIHByaXZhdGUsIHNvIGl0IGlzIGhpZGRlbiBmcm9tIHRoZSBTREsuCiAgICAgICoge0BoaWRlfQpAQCAtMTc4Myw4ICsxOTU0LDkgQEAKIAogICAgIHByaXZhdGUgaW50W10gbURyYXdhYmxlU3RhdGUgPSBudWxsOwogCi0gICAgcHJpdmF0ZSBTb2Z0UmVmZXJlbmNlPEJpdG1hcD4gbURyYXdpbmdDYWNoZTsKLSAgICBwcml2YXRlIFNvZnRSZWZlcmVuY2U8Qml0bWFwPiBtVW5zY2FsZWREcmF3aW5nQ2FjaGU7CisgICAgcHJpdmF0ZSBCaXRtYXAgbURyYXdpbmdDYWNoZTsKKyAgICBwcml2YXRlIEJpdG1hcCBtVW5zY2FsZWREcmF3aW5nQ2FjaGU7CisgICAgcHJpdmF0ZSBEaXNwbGF5TGlzdCBtRGlzcGxheUxpc3Q7CiAKICAgICAvKioKICAgICAgKiBXaGVuIHRoaXMgdmlldyBoYXMgZm9jdXMgYW5kIHRoZSBuZXh0IGZvY3VzIGlzIHtAbGluayAjRk9DVVNfTEVGVH0sCkBAIC0xODYwLDggKzIwMzIsMTMgQEAKICAgICAgKi8KICAgICBwcml2YXRlIGludCBtVG91Y2hTbG9wOwogCi0gICAgLy8gVXNlZCBmb3IgZGVidWcgb25seQotICAgIHN0YXRpYyBsb25nIHNJbnN0YW5jZUNvdW50ID0gMDsKKyAgICAvKioKKyAgICAgKiBDYWNoZSBkcmFnL2Ryb3Agc3RhdGUKKyAgICAgKgorICAgICAqLworICAgIGJvb2xlYW4gbUNhbkFjY2VwdERyb3A7CisgICAgcHJpdmF0ZSBpbnQgbVRodW1ibmFpbFdpZHRoOworICAgIHByaXZhdGUgaW50IG1UaHVtYm5haWxIZWlnaHQ7CiAKICAgICAvKioKICAgICAgKiBTaW1wbGUgY29uc3RydWN0b3IgdG8gdXNlIHdoZW4gY3JlYXRpbmcgYSB2aWV3IGZyb20gY29kZS4KQEAgLTE4NzMsMTAgKzIwNTAsNyBAQAogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1SZXNvdXJjZXMgPSBjb250ZXh0ICE9IG51bGwgPyBjb250ZXh0LmdldFJlc291cmNlcygpIDogbnVsbDsKICAgICAgICAgbVZpZXdGbGFncyA9IFNPVU5EX0VGRkVDVFNfRU5BQkxFRCB8IEhBUFRJQ19GRUVEQkFDS19FTkFCTEVEOwotICAgICAgICAvLyBVc2VkIGZvciBkZWJ1ZyBvbmx5Ci0gICAgICAgIC8vKytzSW5zdGFuY2VDb3VudDsKICAgICAgICAgbVRvdWNoU2xvcCA9IFZpZXdDb25maWd1cmF0aW9uLmdldChjb250ZXh0KS5nZXRTY2FsZWRUb3VjaFNsb3AoKTsKLSAgICAgICAgc2V0T3ZlcnNjcm9sbE1vZGUoT1ZFUlNDUk9MTF9BTFdBWVMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTk0Miw3ICsyMTE2LDYgQEAKIAogICAgICAgICBpbnQgc2Nyb2xsYmFyU3R5bGUgPSBTQ1JPTExCQVJTX0lOU0lERV9PVkVSTEFZOwogCi0gICAgICAgIGludCBvdmVyc2Nyb2xsTW9kZSA9IG1PdmVyc2Nyb2xsTW9kZTsKICAgICAgICAgZmluYWwgaW50IE4gPSBhLmdldEluZGV4Q291bnQoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICAgICAgIGludCBhdHRyID0gYS5nZXRJbmRleChpKTsKQEAgLTIxNDgsMTQgKzIzMjEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSLnN0eWxlYWJsZS5WaWV3X292ZXJzY3JvbGxNb2RlOgotICAgICAgICAgICAgICAgICAgICBvdmVyc2Nyb2xsTW9kZSA9IGEuZ2V0SW50KGF0dHIsIE9WRVJTQ1JPTExfQUxXQVlTKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBzZXRPdmVyc2Nyb2xsTW9kZShvdmVyc2Nyb2xsTW9kZSk7Ci0KICAgICAgICAgaWYgKGJhY2tncm91bmQgIT0gbnVsbCkgewogICAgICAgICAgICAgc2V0QmFja2dyb3VuZERyYXdhYmxlKGJhY2tncm91bmQpOwogICAgICAgICB9CkBAIC0yMjA0LDE1ICsyMzcyLDYgQEAKICAgICBWaWV3KCkgewogICAgIH0KIAotICAgIC8vIFVzZWQgZm9yIGRlYnVnIG9ubHkKLSAgICAvKgotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgICAgIC0tc0luc3RhbmNlQ291bnQ7Ci0gICAgfQotICAgICovCi0KICAgICAvKioKICAgICAgKiA8cD4KICAgICAgKiBJbml0aWFsaXplcyB0aGUgZmFkaW5nIGVkZ2VzIGZyb20gYSBnaXZlbiBzZXQgb2Ygc3R5bGVkIGF0dHJpYnV0ZXMuIFRoaXMKQEAgLTI0MTksNiArMjU3OCwzOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgYm91bmRzIG9mIHRoZSB2aWV3IGNoYW5nZSBkdWUgdG8KKyAgICAgKiBsYXlvdXQgcHJvY2Vzc2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIGxheW91dCBib3VuZHMgY2hhbmdlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIoT25MYXlvdXRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobU9uTGF5b3V0Q2hhbmdlTGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1PbkxheW91dENoYW5nZUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8T25MYXlvdXRDaGFuZ2VMaXN0ZW5lcj4oKTsKKyAgICAgICAgfQorICAgICAgICBtT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBsaXN0ZW5lciBmb3IgbGF5b3V0IGNoYW5nZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIGZvciBsYXlvdXQgYm91bmRzIGNoYW5nZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVPbkxheW91dENoYW5nZUxpc3RlbmVyKE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1PbkxheW91dENoYW5nZUxpc3RlbmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbU9uTGF5b3V0Q2hhbmdlTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY3VycmVudCBsaXN0IG9mIGxpc3RlbmVycyBmb3IgbGF5b3V0IGNoYW5nZXMuCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXI+IGdldE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXJzKCkgeworICAgICAgICByZXR1cm4gbU9uTGF5b3V0Q2hhbmdlTGlzdGVuZXJzOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGZvY3VzLWNoYW5nZSBjYWxsYmFjayByZWdpc3RlcmVkIGZvciB0aGlzIHZpZXcuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSBjYWxsYmFjaywgb3IgbnVsbCBpZiBvbmUgaXMgbm90IHJlZ2lzdGVyZWQuCkBAIC0yNTIxLDYgKzI3MTMsMTggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTdGFydCBhbiBhY3Rpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBDYWxsYmFjayB0aGF0IHdpbGwgY29udHJvbCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBhY3Rpb24gbW9kZQorICAgICAqIEByZXR1cm4gVGhlIG5ldyBhY3Rpb24gbW9kZSBpZiBpdCBpcyBzdGFydGVkLCBudWxsIG90aGVyd2lzZQorICAgICAqCisgICAgICogQHNlZSBBY3Rpb25Nb2RlCisgICAgICovCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlKEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIGdldFBhcmVudCgpLnN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKHRoaXMsIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiBhIGtleSBpcyBwcmVzc2VkIGluIHRoaXMgdmlldy4KICAgICAgKiBAcGFyYW0gbCB0aGUga2V5IGxpc3RlbmVyIHRvIGF0dGFjaCB0byB0aGlzIHZpZXcKICAgICAgKi8KQEAgLTMzNTAsNyArMzU1NCw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJlc3NlZCB0aGF0IGZvciB0aGlzIHZpZXcuCisgICAgICogU2V0cyB0aGUgcHJlc3NlZCBzdGF0ZSBmb3IgdGhpcyB2aWV3LgogICAgICAqCiAgICAgICogQHNlZSAjaXNDbGlja2FibGUoKQogICAgICAqIEBzZWUgI3NldENsaWNrYWJsZShib29sZWFuKQpAQCAtMzQ1Nyw2ICszNjYxLDM4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVudGlyZSBoaWVyYXJjaHkgdW5kZXIgdGhpcyB2aWV3IHdpbGwgc2F2ZSBpdHMKKyAgICAgKiBzdGF0ZSB3aGVuIGEgc3RhdGUgc2F2aW5nIHRyYXZlcnNhbCBvY2N1cnMgZnJvbSBpdHMgcGFyZW50LiAgVGhlIGRlZmF1bHQKKyAgICAgKiBpcyB0cnVlOyBpZiBmYWxzZSwgdGhlc2Ugdmlld3Mgd2lsbCBub3QgYmUgc2F2ZWQgdW5sZXNzCisgICAgICoge0BsaW5rICNzYXZlSGllcmFyY2h5U3RhdGUoU3BhcnNlQXJyYXkpfSBpcyBjYWxsZWQgZGlyZWN0bHkgb24gdGhpcyB2aWV3LgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIHZpZXcgc3RhdGUgc2F2aW5nIGZyb20gcGFyZW50IGlzIGVuYWJsZWQsIGVsc2UgZmFsc2UuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTYXZlRnJvbVBhcmVudEVuYWJsZWQoYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVGcm9tUGFyZW50RW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIChtVmlld0ZsYWdzICYgUEFSRU5UX1NBVkVfRElTQUJMRURfTUFTSykgIT0gUEFSRU5UX1NBVkVfRElTQUJMRUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udHJvbHMgd2hldGhlciB0aGUgZW50aXJlIGhpZXJhcmNoeSB1bmRlciB0aGlzIHZpZXcgd2lsbCBzYXZlIGl0cworICAgICAqIHN0YXRlIHdoZW4gYSBzdGF0ZSBzYXZpbmcgdHJhdmVyc2FsIG9jY3VycyBmcm9tIGl0cyBwYXJlbnQuICBUaGUgZGVmYXVsdAorICAgICAqIGlzIHRydWU7IGlmIGZhbHNlLCB0aGVzZSB2aWV3cyB3aWxsIG5vdCBiZSBzYXZlZCB1bmxlc3MKKyAgICAgKiB7QGxpbmsgI3NhdmVIaWVyYXJjaHlTdGF0ZShTcGFyc2VBcnJheSl9IGlzIGNhbGxlZCBkaXJlY3RseSBvbiB0aGlzIHZpZXcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCBTZXQgdG8gZmFsc2UgdG8gPGVtPmRpc2FibGU8L2VtPiBzdGF0ZSBzYXZpbmcsIG9yIHRydWUKKyAgICAgKiAodGhlIGRlZmF1bHQpIHRvIGFsbG93IGl0LgorICAgICAqCisgICAgICogQHNlZSAjaXNTYXZlRnJvbVBhcmVudEVuYWJsZWQoKQorICAgICAqIEBzZWUgI3NldElkKGludCkKKyAgICAgKiBAc2VlICNvblNhdmVJbnN0YW5jZVN0YXRlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTYXZlRnJvbVBhcmVudEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIHNldEZsYWdzKGVuYWJsZWQgPyAwIDogUEFSRU5UX1NBVkVfRElTQUJMRUQsIFBBUkVOVF9TQVZFX0RJU0FCTEVEX01BU0spOworICAgIH0KKworCisgICAgLyoqCiAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgVmlldyBpcyBhYmxlIHRvIHRha2UgZm9jdXMuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyB2aWV3IGNhbiB0YWtlIGZvY3VzLCBvciBmYWxzZSBvdGhlcndpc2UuCkBAIC0zNzIxLDYgKzM5NTcsMTIgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCisgICAgLyoqIEdldHMgdGhlIFZpZXdSb290LCBvciBudWxsIGlmIG5vdCBhdHRhY2hlZC4gKi8KKyAgICAvKnBhY2thZ2UqLyBWaWV3Um9vdCBnZXRWaWV3Um9vdCgpIHsKKyAgICAgICAgVmlldyByb290ID0gZ2V0Um9vdFZpZXcoKTsKKyAgICAgICAgcmV0dXJuIHJvb3QgIT0gbnVsbCA/IChWaWV3Um9vdClyb290LmdldFBhcmVudCgpIDogbnVsbDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDYWxsIHRoaXMgdG8gdHJ5IHRvIGdpdmUgZm9jdXMgdG8gYSBzcGVjaWZpYyB2aWV3IG9yIHRvIG9uZSBvZiBpdHMgZGVzY2VuZGFudHMuIFRoaXMgaXMgYQogICAgICAqIHNwZWNpYWwgdmFyaWFudCBvZiB7QGxpbmsgI3JlcXVlc3RGb2N1cygpIH0gdGhhdCB3aWxsIGFsbG93IHZpZXdzIHRoYXQgYXJlIG5vdCBmb2N1YWJsZSBpbgpAQCAtMzczNCwxMiArMzk3Niw5IEBACiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gcmVxdWVzdEZvY3VzRnJvbVRvdWNoKCkgewogICAgICAgICAvLyBMZWF2ZSB0b3VjaCBtb2RlIGlmIHdlIG5lZWQgdG8KICAgICAgICAgaWYgKGlzSW5Ub3VjaE1vZGUoKSkgewotICAgICAgICAgICAgVmlldyByb290ID0gZ2V0Um9vdFZpZXcoKTsKLSAgICAgICAgICAgIGlmIChyb290ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgIFZpZXdSb290IHZpZXdSb290ID0gKFZpZXdSb290KXJvb3QuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICBpZiAodmlld1Jvb3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgIHZpZXdSb290LmVuc3VyZVRvdWNoTW9kZShmYWxzZSk7Ci0gICAgICAgICAgICAgICB9CisgICAgICAgICAgICBWaWV3Um9vdCB2aWV3Um9vdCA9IGdldFZpZXdSb290KCk7CisgICAgICAgICAgICBpZiAodmlld1Jvb3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZpZXdSb290LmVuc3VyZVRvdWNoTW9kZShmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlcXVlc3RGb2N1cyhWaWV3LkZPQ1VTX0RPV04pOwpAQCAtMzg0MSwxMiArNDA4MCwxMyBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgLy8gSWYgYW55IGF0dGFjaGVkIGtleSBsaXN0ZW5lciBhIGZpcnN0IGNyYWNrIGF0IHRoZSBldmVudC4KLSAgICAgICAgLy9ub2luc3BlY3Rpb24gU2ltcGxpZmlhYmxlSWZTdGF0ZW1lbnQKIAorICAgICAgICAvL25vaW5zcGVjdGlvbiBTaW1wbGlmaWFibGVJZlN0YXRlbWVudCxkZXByZWNhdGlvbgogICAgICAgICBpZiAoYW5kcm9pZC51dGlsLkNvbmZpZy5MT0dWKSB7CiAgICAgICAgICAgICBjYXB0dXJlVmlld0luZm8oImNhcHR1cmVWaWV3S2V5RXZlbnQiLCB0aGlzKTsKICAgICAgICAgfQogCisgICAgICAgIC8vbm9pbnNwZWN0aW9uIFNpbXBsaWZpYWJsZUlmU3RhdGVtZW50CiAgICAgICAgIGlmIChtT25LZXlMaXN0ZW5lciAhPSBudWxsICYmIChtVmlld0ZsYWdzICYgRU5BQkxFRF9NQVNLKSA9PSBFTkFCTEVECiAgICAgICAgICAgICAgICAgJiYgbU9uS2V5TGlzdGVuZXIub25LZXkodGhpcywgZXZlbnQuZ2V0S2V5Q29kZSgpLCBldmVudCkpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMzg3OCw2ICs0MTE4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCisgICAgICAgIC8vbm9pbnNwZWN0aW9uIFNpbXBsaWZpYWJsZUlmU3RhdGVtZW50CiAgICAgICAgIGlmIChtT25Ub3VjaExpc3RlbmVyICE9IG51bGwgJiYgKG1WaWV3RmxhZ3MgJiBFTkFCTEVEX01BU0spID09IEVOQUJMRUQgJiYKICAgICAgICAgICAgICAgICBtT25Ub3VjaExpc3RlbmVyLm9uVG91Y2godGhpcywgZXZlbnQpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTM4OTQsNiArNDEzNSw3IEBACiAgICAgICogQHNlZSAjZ2V0RmlsdGVyVG91Y2hlc1doZW5PYnNjdXJlZAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIG9uRmlsdGVyVG91Y2hFdmVudEZvclNlY3VyaXR5KE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vbm9pbnNwZWN0aW9uIFJlZHVuZGFudElmU3RhdGVtZW50CiAgICAgICAgIGlmICgobVZpZXdGbGFncyAmIEZJTFRFUl9UT1VDSEVTX1dIRU5fT0JTQ1VSRUQpICE9IDAKICAgICAgICAgICAgICAgICAmJiAoZXZlbnQuZ2V0RmxhZ3MoKSAmIE1vdGlvbkV2ZW50LkZMQUdfV0lORE9XX0lTX09CU0NVUkVEKSAhPSAwKSB7CiAgICAgICAgICAgICAvLyBXaW5kb3cgaXMgb2JzY3VyZWQsIGRyb3AgdGhpcyB0b3VjaC4KQEAgLTQ1MDEsOSArNDc0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludCkgZXZlbnQuZ2V0WSgpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIEJlIGxlbmllbnQgYWJvdXQgbW92aW5nIG91dHNpZGUgb2YgYnV0dG9ucwotICAgICAgICAgICAgICAgICAgICBpbnQgc2xvcCA9IG1Ub3VjaFNsb3A7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoeCA8IDAgLSBzbG9wKSB8fCAoeCA+PSBnZXRXaWR0aCgpICsgc2xvcCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeSA8IDAgLSBzbG9wKSB8fCAoeSA+PSBnZXRIZWlnaHQoKSArIHNsb3ApKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcG9pbnRJblZpZXcoeCwgeSwgbVRvdWNoU2xvcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE91dHNpZGUgYnV0dG9uCiAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVUYXBDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtUHJpdmF0ZUZsYWdzICYgUFJFU1NFRCkgIT0gMCkgewpAQCAtNDY2OCw2ICs0OTA4LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICgoY2hhbmdlZCAmIFZJU0lCSUxJVFlfTUFTSykgIT0gMCkgeworICAgICAgICAgICAgaWYgKG1QYXJlbnQgaW5zdGFuY2VvZiBWaWV3R3JvdXApIHsKKyAgICAgICAgICAgICAgICAoKFZpZXdHcm91cCltUGFyZW50KS5vbkNoaWxkVmlzaWJpbGl0eUNoYW5nZWQodGhpcywgKGZsYWdzICYgVklTSUJJTElUWV9NQVNLKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBkaXNwYXRjaFZpc2liaWxpdHlDaGFuZ2VkKHRoaXMsIChmbGFncyAmIFZJU0lCSUxJVFlfTUFTSykpOwogICAgICAgICB9CiAKQEAgLTQ3MzgsNiArNDk4MSwyOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEludGVyZmFjZSBkZWZpbml0aW9uIGZvciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgbGF5b3V0IGJvdW5kcyBvZiBhIHZpZXcKKyAgICAgKiBjaGFuZ2VzIGR1ZSB0byBsYXlvdXQgcHJvY2Vzc2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGZvY3VzIHN0YXRlIG9mIGEgdmlldyBoYXMgY2hhbmdlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHYgVGhlIHZpZXcgd2hvc2Ugc3RhdGUgaGFzIGNoYW5nZWQuCisgICAgICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBuZXcgdmFsdWUgb2YgdGhlIHZpZXcncyBsZWZ0IHByb3BlcnR5LgorICAgICAgICAgKiBAcGFyYW0gdG9wIFRoZSBuZXcgdmFsdWUgb2YgdGhlIHZpZXcncyB0b3AgcHJvcGVydHkuCisgICAgICAgICAqIEBwYXJhbSByaWdodCBUaGUgbmV3IHZhbHVlIG9mIHRoZSB2aWV3J3MgcmlnaHQgcHJvcGVydHkuCisgICAgICAgICAqIEBwYXJhbSBib3R0b20gVGhlIG5ldyB2YWx1ZSBvZiB0aGUgdmlldydzIGJvdHRvbSBwcm9wZXJ0eS4KKyAgICAgICAgICogQHBhcmFtIG9sZExlZnQgVGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSB2aWV3J3MgbGVmdCBwcm9wZXJ0eS4KKyAgICAgICAgICogQHBhcmFtIG9sZFRvcCBUaGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIHZpZXcncyB0b3AgcHJvcGVydHkuCisgICAgICAgICAqIEBwYXJhbSBvbGRSaWdodCBUaGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIHZpZXcncyByaWdodCBwcm9wZXJ0eS4KKyAgICAgICAgICogQHBhcmFtIG9sZEJvdHRvbSBUaGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIHZpZXcncyBib3R0b20gcHJvcGVydHkuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uTGF5b3V0Q2hhbmdlKFZpZXcgdiwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSwKKyAgICAgICAgICAgIGludCBvbGRMZWZ0LCBpbnQgb2xkVG9wLCBpbnQgb2xkUmlnaHQsIGludCBvbGRCb3R0b20pOworICAgIH0KKworICAgIC8qKgogICAgICAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBsYXlvdXQgd2hlbiB0aGUgc2l6ZSBvZiB0aGlzIHZpZXcgaGFzIGNoYW5nZWQuIElmCiAgICAgICogeW91IHdlcmUganVzdCBhZGRlZCB0byB0aGUgdmlldyBoaWVyYXJjaHksIHlvdSdyZSBjYWxsZWQgd2l0aCB0aGUgb2xkCiAgICAgICogdmFsdWVzIG9mIDAuCkBAIC00ODQ5LDYgKzUxMTQsMzY4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogVGhlIHRyYW5zZm9ybSBtYXRyaXggb2YgdGhpcyB2aWV3LCB3aGljaCBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBjdXJyZW50CisgICAgICogcm9hdGlvbiwgc2NhbGUsIGFuZCBwaXZvdCBwcm9wZXJ0aWVzLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0Um90YXRpb24oKQorICAgICAqIEBzZWUgI2dldFNjYWxlWCgpCisgICAgICogQHNlZSAjZ2V0U2NhbGVZKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFgoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCB0cmFuc2Zvcm0gbWF0cml4IGZvciB0aGUgdmlldworICAgICAqLworICAgIHB1YmxpYyBNYXRyaXggZ2V0TWF0cml4KCkgeworICAgICAgICB1cGRhdGVNYXRyaXgoKTsKKyAgICAgICAgcmV0dXJuIG1NYXRyaXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlIHZhbHVlIGlzIGZhciBlbm91Z2ggYXdheSBmcm9tIHplcm8gdG8gYmUKKyAgICAgKiBjb25zaWRlcmVkIG5vbi16ZXJvLgorICAgICAqIEBwYXJhbSB2YWx1ZSBBIGZsb2F0aW5nIHBvaW50IHZhbHVlIHRvIGNoZWNrIGZvciB6ZXJvLW5lc3MKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHBhc3NlZC1pbiB2YWx1ZSBpcyBmYXIgZW5vdWdoIGF3YXkgZnJvbSB6ZXJvIHRvIGJlIGNvbnNpZGVyZWQgbm9uLXplcm8KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG5vbnplcm8oZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuICh2YWx1ZSA8IC1OT05aRVJPX0VQU0lMT04gfHwgdmFsdWUgPiBOT05aRVJPX0VQU0lMT04pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNmb3JtIG1hdHJpeCBpcyB0aGUgaWRlbnRpdHkgbWF0cml4LgorICAgICAqIFJlY29tcHV0ZXMgdGhlIG1hdHJpeCBpZiBuZWNlc3NhcnkuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSB0cmFuc2Zvcm0gbWF0cml4IGlzIHRoZSBpZGVudGl0eSBtYXRyaXgsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBmaW5hbCBib29sZWFuIGhhc0lkZW50aXR5TWF0cml4KCkgeworICAgICAgICB1cGRhdGVNYXRyaXgoKTsKKyAgICAgICAgcmV0dXJuIG1NYXRyaXhJc0lkZW50aXR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY29tcHV0ZXMgdGhlIHRyYW5zZm9ybSBtYXRyaXggaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVNYXRyaXgoKSB7CisgICAgICAgIGlmIChtTWF0cml4RGlydHkpIHsKKyAgICAgICAgICAgIC8vIHRyYW5zZm9ybS1yZWxhdGVkIHByb3BlcnRpZXMgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgc29tZW9uZQorICAgICAgICAgICAgLy8gYXNrZWQgZm9yIHRoZSBtYXRyaXg7IHJlY2FsY3VsYXRlIGl0IHdpdGggdGhlIGN1cnJlbnQgdmFsdWVzCisKKyAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHBpdm90IHBvaW50CisgICAgICAgICAgICBpZiAoKG1Qcml2YXRlRmxhZ3MgJiBQSVZPVF9FWFBMSUNJVExZX1NFVCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICgobVJpZ2h0IC0gbUxlZnQpICE9IG1QcmV2V2lkdGggJiYgKG1Cb3R0b20gLSBtVG9wKSAhPSBtUHJldkhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBtUHJldldpZHRoID0gbVJpZ2h0IC0gbUxlZnQ7CisgICAgICAgICAgICAgICAgICAgIG1QcmV2SGVpZ2h0ID0gbUJvdHRvbSAtIG1Ub3A7CisgICAgICAgICAgICAgICAgICAgIG1QaXZvdFggPSAoZmxvYXQpIG1QcmV2V2lkdGggLyAyZjsKKyAgICAgICAgICAgICAgICAgICAgbVBpdm90WSA9IChmbG9hdCkgbVByZXZIZWlnaHQgLyAyZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWF0cml4LnJlc2V0KCk7CisgICAgICAgICAgICBpZiAoIW5vbnplcm8obVJvdGF0aW9uWCkgJiYgIW5vbnplcm8obVJvdGF0aW9uWSkpIHsKKyAgICAgICAgICAgICAgICBtTWF0cml4LnNldFRyYW5zbGF0ZShtVHJhbnNsYXRpb25YLCBtVHJhbnNsYXRpb25ZKTsKKyAgICAgICAgICAgICAgICBtTWF0cml4LnByZVJvdGF0ZShtUm90YXRpb24sIG1QaXZvdFgsIG1QaXZvdFkpOworICAgICAgICAgICAgICAgIG1NYXRyaXgucHJlU2NhbGUobVNjYWxlWCwgbVNjYWxlWSwgbVBpdm90WCwgbVBpdm90WSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtQ2FtZXJhID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYSA9IG5ldyBDYW1lcmEoKTsKKyAgICAgICAgICAgICAgICAgICAgbWF0cml4M0QgPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYW1lcmEuc2F2ZSgpOworICAgICAgICAgICAgICAgIG1NYXRyaXgucHJlU2NhbGUobVNjYWxlWCwgbVNjYWxlWSwgbVBpdm90WCwgbVBpdm90WSk7CisgICAgICAgICAgICAgICAgbUNhbWVyYS5yb3RhdGVYKG1Sb3RhdGlvblgpOworICAgICAgICAgICAgICAgIG1DYW1lcmEucm90YXRlWShtUm90YXRpb25ZKTsKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLnJvdGF0ZVooLW1Sb3RhdGlvbik7CisgICAgICAgICAgICAgICAgbUNhbWVyYS5nZXRNYXRyaXgobWF0cml4M0QpOworICAgICAgICAgICAgICAgIG1hdHJpeDNELnByZVRyYW5zbGF0ZSgtbVBpdm90WCwgLW1QaXZvdFkpOworICAgICAgICAgICAgICAgIG1hdHJpeDNELnBvc3RUcmFuc2xhdGUobVBpdm90WCArIG1UcmFuc2xhdGlvblgsIG1QaXZvdFkgKyBtVHJhbnNsYXRpb25ZKTsKKyAgICAgICAgICAgICAgICBtTWF0cml4LnBvc3RDb25jYXQobWF0cml4M0QpOworICAgICAgICAgICAgICAgIG1DYW1lcmEucmVzdG9yZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1hdHJpeERpcnR5ID0gZmFsc2U7CisgICAgICAgICAgICBtTWF0cml4SXNJZGVudGl0eSA9IG1NYXRyaXguaXNJZGVudGl0eSgpOworICAgICAgICAgICAgbUludmVyc2VNYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byByZXRyaWV2ZSB0aGUgaW52ZXJzZSBvZiB0aGUgY3VycmVudCBtTWF0cml4IHByb3BlcnR5LgorICAgICAqIFdlIGNhY2hlIHRoZSBtYXRyaXggdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBpdCB3aGVuIHRyYW5zZm9ybSBwcm9wZXJ0aWVzCisgICAgICogaGF2ZSBub3QgY2hhbmdlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGludmVyc2Ugb2YgdGhlIGN1cnJlbnQgbWF0cml4IG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBmaW5hbCBNYXRyaXggZ2V0SW52ZXJzZU1hdHJpeCgpIHsKKyAgICAgICAgdXBkYXRlTWF0cml4KCk7CisgICAgICAgIGlmIChtSW52ZXJzZU1hdHJpeERpcnR5KSB7CisgICAgICAgICAgICBpZiAobUludmVyc2VNYXRyaXggPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1JbnZlcnNlTWF0cml4ID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1hdHJpeC5pbnZlcnQobUludmVyc2VNYXRyaXgpOworICAgICAgICAgICAgbUludmVyc2VNYXRyaXhEaXJ0eSA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtSW52ZXJzZU1hdHJpeDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVncmVlcyB0aGF0IHRoZSB2aWV3IGlzIHJvdGF0ZWQgYXJvdW5kIHRoZSBwaXZvdCBwb2ludC4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKiBAcmV0dXJuIFRoZSBkZWdyZWVzIG9mIHJvdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRSb3RhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1Sb3RhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZWdyZWVzIHRoYXQgdGhlIHZpZXcgaXMgcm90YXRlZCBhcm91bmQgdGhlIHBpdm90IHBvaW50LiBJbmNyZWFzaW5nIHZhbHVlcworICAgICAqIHJlc3VsdCBpbiBjbG9ja3dpc2Ugcm90YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm90YXRpb24gVGhlIGRlZ3JlZXMgb2Ygcm90YXRpb24uCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvdGF0aW9uKGZsb2F0IHJvdGF0aW9uKSB7CisgICAgICAgIGlmIChtUm90YXRpb24gIT0gcm90YXRpb24pIHsKKyAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICBpbnZhbGlkYXRlKGZhbHNlKTsKKyAgICAgICAgICAgIG1Sb3RhdGlvbiA9IHJvdGF0aW9uOworICAgICAgICAgICAgbU1hdHJpeERpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgaW52YWxpZGF0ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVncmVlcyB0aGF0IHRoZSB2aWV3IGlzIHJvdGF0ZWQgYXJvdW5kIHRoZSB2ZXJ0aWNhbCBheGlzIHRocm91Z2ggdGhlIHBpdm90IHBvaW50LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIGRlZ3JlZXMgb2YgWSByb3RhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0Um90YXRpb25ZKCkgeworICAgICAgICByZXR1cm4gbVJvdGF0aW9uWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZWdyZWVzIHRoYXQgdGhlIHZpZXcgaXMgcm90YXRlZCBhcm91bmQgdGhlIHZlcnRpY2FsIGF4aXMgdGhyb3VnaCB0aGUgcGl2b3QgcG9pbnQuCisgICAgICogSW5jcmVhc2luZyB2YWx1ZXMgcmVzdWx0IGluIGNvdW50ZXItY2xvY2t3aXNlIHJvdGF0aW9uIGZyb20gdGhlIHZpZXdwb2ludCBvZiBsb29raW5nCisgICAgICogZG93biB0aGUgeSBheGlzLgorICAgICAqCisgICAgICogQHBhcmFtIHJvdGF0aW9uWSBUaGUgZGVncmVlcyBvZiBZIHJvdGF0aW9uLgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb3RhdGlvblkoZmxvYXQgcm90YXRpb25ZKSB7CisgICAgICAgIGlmIChtUm90YXRpb25ZICE9IHJvdGF0aW9uWSkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoZmFsc2UpOworICAgICAgICAgICAgbVJvdGF0aW9uWSA9IHJvdGF0aW9uWTsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZ3JlZXMgdGhhdCB0aGUgdmlldyBpcyByb3RhdGVkIGFyb3VuZCB0aGUgaG9yaXpvbnRhbCBheGlzIHRocm91Z2ggdGhlIHBpdm90IHBvaW50LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIGRlZ3JlZXMgb2YgWCByb3RhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0Um90YXRpb25YKCkgeworICAgICAgICByZXR1cm4gbVJvdGF0aW9uWDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZWdyZWVzIHRoYXQgdGhlIHZpZXcgaXMgcm90YXRlZCBhcm91bmQgdGhlIGhvcml6b250YWwgYXhpcyB0aHJvdWdoIHRoZSBwaXZvdCBwb2ludC4KKyAgICAgKiBJbmNyZWFzaW5nIHZhbHVlcyByZXN1bHQgaW4gY2xvY2t3aXNlIHJvdGF0aW9uIGZyb20gdGhlIHZpZXdwb2ludCBvZiBsb29raW5nIGRvd24gdGhlCisgICAgICogeCBheGlzLgorICAgICAqCisgICAgICogQHBhcmFtIHJvdGF0aW9uWCBUaGUgZGVncmVlcyBvZiBYIHJvdGF0aW9uLgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb3RhdGlvblgoZmxvYXQgcm90YXRpb25YKSB7CisgICAgICAgIGlmIChtUm90YXRpb25YICE9IHJvdGF0aW9uWCkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoZmFsc2UpOworICAgICAgICAgICAgbVJvdGF0aW9uWCA9IHJvdGF0aW9uWDsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCB0aGF0IHRoZSB2aWV3IGlzIHNjYWxlZCBpbiB4IGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQsIGFzIGEgcHJvcG9ydGlvbiBvZgorICAgICAqIHRoZSB2aWV3J3MgdW5zY2FsZWQgd2lkdGguIEEgdmFsdWUgb2YgMSwgdGhlIGRlZmF1bHQsIG1lYW5zIHRoYXQgbm8gc2NhbGluZyBpcyBhcHBsaWVkLgorICAgICAqCisgICAgICogPHA+QnkgZGVmYXVsdCwgdGhpcyBpcyAxLjBmLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIHNjYWxpbmcgZmFjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRTY2FsZVgoKSB7CisgICAgICAgIHJldHVybiBtU2NhbGVYOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGFtb3VudCB0aGF0IHRoZSB2aWV3IGlzIHNjYWxlZCBpbiB4IGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQsIGFzIGEgcHJvcG9ydGlvbiBvZgorICAgICAqIHRoZSB2aWV3J3MgdW5zY2FsZWQgd2lkdGguIEEgdmFsdWUgb2YgMSBtZWFucyB0aGF0IG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY2FsZVggVGhlIHNjYWxpbmcgZmFjdG9yLgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY2FsZVgoZmxvYXQgc2NhbGVYKSB7CisgICAgICAgIGlmIChtU2NhbGVYICE9IHNjYWxlWCkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoZmFsc2UpOworICAgICAgICAgICAgbVNjYWxlWCA9IHNjYWxlWDsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCB0aGF0IHRoZSB2aWV3IGlzIHNjYWxlZCBpbiB5IGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQsIGFzIGEgcHJvcG9ydGlvbiBvZgorICAgICAqIHRoZSB2aWV3J3MgdW5zY2FsZWQgaGVpZ2h0LiBBIHZhbHVlIG9mIDEsIHRoZSBkZWZhdWx0LCBtZWFucyB0aGF0IG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKgorICAgICAqIDxwPkJ5IGRlZmF1bHQsIHRoaXMgaXMgMS4wZi4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKiBAcmV0dXJuIFRoZSBzY2FsaW5nIGZhY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0U2NhbGVZKCkgeworICAgICAgICByZXR1cm4gbVNjYWxlWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhbW91bnQgdGhhdCB0aGUgdmlldyBpcyBzY2FsZWQgaW4gWSBhcm91bmQgdGhlIHBpdm90IHBvaW50LCBhcyBhIHByb3BvcnRpb24gb2YKKyAgICAgKiB0aGUgdmlldydzIHVuc2NhbGVkIHdpZHRoLiBBIHZhbHVlIG9mIDEgbWVhbnMgdGhhdCBubyBzY2FsaW5nIGlzIGFwcGxpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2NhbGVZIFRoZSBzY2FsaW5nIGZhY3Rvci4KKyAgICAgKiBAc2VlICNnZXRQaXZvdFgoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2NhbGVZKGZsb2F0IHNjYWxlWSkgeworICAgICAgICBpZiAobVNjYWxlWSAhPSBzY2FsZVkpIHsKKyAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICBpbnZhbGlkYXRlKGZhbHNlKTsKKyAgICAgICAgICAgIG1TY2FsZVkgPSBzY2FsZVk7CisgICAgICAgICAgICBtTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICBpbnZhbGlkYXRlKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB4IGxvY2F0aW9uIG9mIHRoZSBwb2ludCBhcm91bmQgd2hpY2ggdGhlIHZpZXcgaXMge0BsaW5rICNzZXRSb3RhdGlvbihmbG9hdCkgcm90YXRlZH0KKyAgICAgKiBhbmQge0BsaW5rICNzZXRTY2FsZVgoZmxvYXQpIHNjYWxlZH0uCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRSb3RhdGlvbigpCisgICAgICogQHNlZSAjZ2V0U2NhbGVYKCkKKyAgICAgKiBAc2VlICNnZXRTY2FsZVkoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICogQHJldHVybiBUaGUgeCBsb2NhdGlvbiBvZiB0aGUgcGl2b3QgcG9pbnQuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFBpdm90WCgpIHsKKyAgICAgICAgcmV0dXJuIG1QaXZvdFg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgeCBsb2NhdGlvbiBvZiB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHRoZSB2aWV3IGlzCisgICAgICoge0BsaW5rICNzZXRSb3RhdGlvbihmbG9hdCkgcm90YXRlZH0gYW5kIHtAbGluayAjc2V0U2NhbGVYKGZsb2F0KSBzY2FsZWR9LgorICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBwaXZvdCBwb2ludCBpcyBjZW50ZXJlZCBvbiB0aGUgb2JqZWN0LgorICAgICAqIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBkaXNhYmxlcyB0aGlzIGJlaGF2aW9yIGFuZCBjYXVzZXMgdGhlIHZpZXcgdG8gdXNlIG9ubHkgdGhlCisgICAgICogZXhwbGljaXRseSBzZXQgcGl2b3RYIGFuZCBwaXZvdFkgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHBpdm90WCBUaGUgeCBsb2NhdGlvbiBvZiB0aGUgcGl2b3QgcG9pbnQuCisgICAgICogQHNlZSAjZ2V0Um90YXRpb24oKQorICAgICAqIEBzZWUgI2dldFNjYWxlWCgpCisgICAgICogQHNlZSAjZ2V0U2NhbGVZKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBpdm90WChmbG9hdCBwaXZvdFgpIHsKKyAgICAgICAgbVByaXZhdGVGbGFncyB8PSBQSVZPVF9FWFBMSUNJVExZX1NFVDsKKyAgICAgICAgaWYgKG1QaXZvdFggIT0gcGl2b3RYKSB7CisgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgaW52YWxpZGF0ZShmYWxzZSk7CisgICAgICAgICAgICBtUGl2b3RYID0gcGl2b3RYOworICAgICAgICAgICAgbU1hdHJpeERpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgaW52YWxpZGF0ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgeSBsb2NhdGlvbiBvZiB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHRoZSB2aWV3IGlzIHtAbGluayAjc2V0Um90YXRpb24oZmxvYXQpIHJvdGF0ZWR9CisgICAgICogYW5kIHtAbGluayAjc2V0U2NhbGVZKGZsb2F0KSBzY2FsZWR9LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0Um90YXRpb24oKQorICAgICAqIEBzZWUgI2dldFNjYWxlWCgpCisgICAgICogQHNlZSAjZ2V0U2NhbGVZKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIHkgbG9jYXRpb24gb2YgdGhlIHBpdm90IHBvaW50LgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRQaXZvdFkoKSB7CisgICAgICAgIHJldHVybiBtUGl2b3RZOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHkgbG9jYXRpb24gb2YgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB0aGUgdmlldyBpcyB7QGxpbmsgI3NldFJvdGF0aW9uKGZsb2F0KSByb3RhdGVkfQorICAgICAqIGFuZCB7QGxpbmsgI3NldFNjYWxlWShmbG9hdCkgc2NhbGVkfS4gQnkgZGVmYXVsdCwgdGhlIHBpdm90IHBvaW50IGlzIGNlbnRlcmVkIG9uIHRoZSBvYmplY3QuCisgICAgICogU2V0dGluZyB0aGlzIHByb3BlcnR5IGRpc2FibGVzIHRoaXMgYmVoYXZpb3IgYW5kIGNhdXNlcyB0aGUgdmlldyB0byB1c2Ugb25seSB0aGUKKyAgICAgKiBleHBsaWNpdGx5IHNldCBwaXZvdFggYW5kIHBpdm90WSB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGl2b3RZIFRoZSB5IGxvY2F0aW9uIG9mIHRoZSBwaXZvdCBwb2ludC4KKyAgICAgKiBAc2VlICNnZXRSb3RhdGlvbigpCisgICAgICogQHNlZSAjZ2V0U2NhbGVYKCkKKyAgICAgKiBAc2VlICNnZXRTY2FsZVkoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGl2b3RZKGZsb2F0IHBpdm90WSkgeworICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IFBJVk9UX0VYUExJQ0lUTFlfU0VUOworICAgICAgICBpZiAobVBpdm90WSAhPSBwaXZvdFkpIHsKKyAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICBpbnZhbGlkYXRlKGZhbHNlKTsKKyAgICAgICAgICAgIG1QaXZvdFkgPSBwaXZvdFk7CisgICAgICAgICAgICBtTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICBpbnZhbGlkYXRlKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBvcGFjaXR5IG9mIHRoZSB2aWV3LiBUaGlzIGlzIGEgdmFsdWUgZnJvbSAwIHRvIDEsIHdoZXJlIDAgbWVhbnMgdGhlIHZpZXcgaXMKKyAgICAgKiBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IGFuZCAxIG1lYW5zIHRoZSB2aWV3IGlzIGNvbXBsZXRlbHkgb3BhcXVlLgorICAgICAqCisgICAgICogPHA+QnkgZGVmYXVsdCB0aGlzIGlzIDEuMGYuCisgICAgICogQHJldHVybiBUaGUgb3BhY2l0eSBvZiB0aGUgdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0QWxwaGEoKSB7CisgICAgICAgIHJldHVybiBtQWxwaGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3BhY2l0eSBvZiB0aGUgdmlldy4gVGhpcyBpcyBhIHZhbHVlIGZyb20gMCB0byAxLCB3aGVyZSAwIG1lYW5zIHRoZSB2aWV3IGlzCisgICAgICogY29tcGxldGVseSB0cmFuc3BhcmVudCBhbmQgMSBtZWFucyB0aGUgdmlldyBpcyBjb21wbGV0ZWx5IG9wYXF1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbHBoYSBUaGUgb3BhY2l0eSBvZiB0aGUgdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbHBoYShmbG9hdCBhbHBoYSkgeworICAgICAgICBtQWxwaGEgPSBhbHBoYTsKKyAgICAgICAgaWYgKG9uU2V0QWxwaGEoKGludCkgKGFscGhhICogMjU1KSkpIHsKKyAgICAgICAgICAgIC8vIHN1YmNsYXNzIGlzIGhhbmRsaW5nIGFscGhhIC0gZG9uJ3Qgb3B0aW1pemUgcmVuZGVyaW5nIGNhY2hlIGludmFsaWRhdGlvbgorICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW52YWxpZGF0ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBUb3AgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSB0b3Agb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuCkBAIC00ODU5LDYgKzU0ODYsNTEgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0b3AgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQuIFRoaXMgbWV0aG9kIGlzIG1lYW50IHRvIGJlIGNhbGxlZAorICAgICAqIGJ5IHRoZSBsYXlvdXQgc3lzdGVtIGFuZCBzaG91bGQgbm90IGdlbmVyYWxseSBiZSBjYWxsZWQgb3RoZXJ3aXNlLCBiZWNhdXNlIHRoZSBwcm9wZXJ0eQorICAgICAqIG1heSBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lIGJ5IHRoZSBsYXlvdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdG9wIFRoZSB0b3Agb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0VG9wKGludCB0b3ApIHsKKyAgICAgICAgaWYgKHRvcCAhPSBtVG9wKSB7CisgICAgICAgICAgICB1cGRhdGVNYXRyaXgoKTsKKyAgICAgICAgICAgIGlmIChtTWF0cml4SXNJZGVudGl0eSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdQYXJlbnQgcCA9IG1QYXJlbnQ7CisgICAgICAgICAgICAgICAgaWYgKHAgIT0gbnVsbCAmJiBtQXR0YWNoSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgciA9IG1BdHRhY2hJbmZvLm1UbXBJbnZhbFJlY3Q7CisgICAgICAgICAgICAgICAgICAgIGludCBtaW5Ub3A7CisgICAgICAgICAgICAgICAgICAgIGludCB5TG9jOworICAgICAgICAgICAgICAgICAgICBpZiAodG9wIDwgbVRvcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluVG9wID0gdG9wOworICAgICAgICAgICAgICAgICAgICAgICAgeUxvYyA9IHRvcCAtIG1Ub3A7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5Ub3AgPSBtVG9wOworICAgICAgICAgICAgICAgICAgICAgICAgeUxvYyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgci5zZXQoMCwgeUxvYywgbVJpZ2h0IC0gbUxlZnQsIG1Cb3R0b20gLSBtaW5Ub3ApOworICAgICAgICAgICAgICAgICAgICBwLmludmFsaWRhdGVDaGlsZCh0aGlzLCByKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgd2lkdGggPSBtUmlnaHQgLSBtTGVmdDsKKyAgICAgICAgICAgIGludCBvbGRIZWlnaHQgPSBtQm90dG9tIC0gbVRvcDsKKworICAgICAgICAgICAgbVRvcCA9IHRvcDsKKworICAgICAgICAgICAgb25TaXplQ2hhbmdlZCh3aWR0aCwgbUJvdHRvbSAtIG1Ub3AsIHdpZHRoLCBvbGRIZWlnaHQpOworCisgICAgICAgICAgICBpZiAoIW1NYXRyaXhJc0lkZW50aXR5KSB7CisgICAgICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQm90dG9tIHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgcGFyZW50LgogICAgICAqCiAgICAgICogQHJldHVybiBUaGUgYm90dG9tIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgpAQCAtNDg2OSw2ICs1NTQxLDQ4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB0aGUgYm90dG9tIHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgcGFyZW50LiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBiZQorICAgICAqIGNhbGxlZCBieSB0aGUgbGF5b3V0IHN5c3RlbSBhbmQgc2hvdWxkIG5vdCBnZW5lcmFsbHkgYmUgY2FsbGVkIG90aGVyd2lzZSwgYmVjYXVzZSB0aGUKKyAgICAgKiBwcm9wZXJ0eSBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgdGltZSBieSB0aGUgbGF5b3V0LgorICAgICAqCisgICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldEJvdHRvbShpbnQgYm90dG9tKSB7CisgICAgICAgIGlmIChib3R0b20gIT0gbUJvdHRvbSkgeworICAgICAgICAgICAgdXBkYXRlTWF0cml4KCk7CisgICAgICAgICAgICBpZiAobU1hdHJpeElzSWRlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3UGFyZW50IHAgPSBtUGFyZW50OworICAgICAgICAgICAgICAgIGlmIChwICE9IG51bGwgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IHIgPSBtQXR0YWNoSW5mby5tVG1wSW52YWxSZWN0OworICAgICAgICAgICAgICAgICAgICBpbnQgbWF4Qm90dG9tOworICAgICAgICAgICAgICAgICAgICBpZiAoYm90dG9tIDwgbUJvdHRvbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm90dG9tID0gbUJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdHRvbSA9IGJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByLnNldCgwLCAwLCBtUmlnaHQgLSBtTGVmdCwgbWF4Qm90dG9tIC0gbVRvcCk7CisgICAgICAgICAgICAgICAgICAgIHAuaW52YWxpZGF0ZUNoaWxkKHRoaXMsIHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCB3aWR0aCA9IG1SaWdodCAtIG1MZWZ0OworICAgICAgICAgICAgaW50IG9sZEhlaWdodCA9IG1Cb3R0b20gLSBtVG9wOworCisgICAgICAgICAgICBtQm90dG9tID0gYm90dG9tOworCisgICAgICAgICAgICBvblNpemVDaGFuZ2VkKHdpZHRoLCBtQm90dG9tIC0gbVRvcCwgd2lkdGgsIG9sZEhlaWdodCk7CisKKyAgICAgICAgICAgIGlmICghbU1hdHJpeElzSWRlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBMZWZ0IHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgcGFyZW50LgogICAgICAqCiAgICAgICogQHJldHVybiBUaGUgbGVmdCBlZGdlIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgpAQCAtNDg3OSw2ICs1NTkzLDUyIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGVmdCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHBhcmVudC4gVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gYmUgY2FsbGVkCisgICAgICogYnkgdGhlIGxheW91dCBzeXN0ZW0gYW5kIHNob3VsZCBub3QgZ2VuZXJhbGx5IGJlIGNhbGxlZCBvdGhlcndpc2UsIGJlY2F1c2UgdGhlIHByb3BlcnR5CisgICAgICogbWF5IGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgYnkgdGhlIGxheW91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBib3R0b20gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0TGVmdChpbnQgbGVmdCkgeworICAgICAgICBpZiAobGVmdCAhPSBtTGVmdCkgeworICAgICAgICAgICAgdXBkYXRlTWF0cml4KCk7CisgICAgICAgICAgICBpZiAobU1hdHJpeElzSWRlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3UGFyZW50IHAgPSBtUGFyZW50OworICAgICAgICAgICAgICAgIGlmIChwICE9IG51bGwgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IHIgPSBtQXR0YWNoSW5mby5tVG1wSW52YWxSZWN0OworICAgICAgICAgICAgICAgICAgICBpbnQgbWluTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHhMb2M7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0IDwgbUxlZnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbkxlZnQgPSBsZWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgeExvYyA9IGxlZnQgLSBtTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbkxlZnQgPSBtTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhMb2MgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHIuc2V0KHhMb2MsIDAsIG1SaWdodCAtIG1pbkxlZnQsIG1Cb3R0b20gLSBtVG9wKTsKKyAgICAgICAgICAgICAgICAgICAgcC5pbnZhbGlkYXRlQ2hpbGQodGhpcywgcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IG9sZFdpZHRoID0gbVJpZ2h0IC0gbUxlZnQ7CisgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gbUJvdHRvbSAtIG1Ub3A7CisKKyAgICAgICAgICAgIG1MZWZ0ID0gbGVmdDsKKworICAgICAgICAgICAgb25TaXplQ2hhbmdlZChtUmlnaHQgLSBtTGVmdCwgaGVpZ2h0LCBvbGRXaWR0aCwgaGVpZ2h0KTsKKworICAgICAgICAgICAgaWYgKCFtTWF0cml4SXNJZGVudGl0eSkgeworICAgICAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmlnaHQgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSByaWdodCBlZGdlIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgpAQCAtNDg4OSwxMiArNTY0OSwxODggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHRoZSByaWdodCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHBhcmVudC4gVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gYmUgY2FsbGVkCisgICAgICogYnkgdGhlIGxheW91dCBzeXN0ZW0gYW5kIHNob3VsZCBub3QgZ2VuZXJhbGx5IGJlIGNhbGxlZCBvdGhlcndpc2UsIGJlY2F1c2UgdGhlIHByb3BlcnR5CisgICAgICogbWF5IGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgYnkgdGhlIGxheW91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByaWdodCBUaGUgYm90dG9tIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFJpZ2h0KGludCByaWdodCkgeworICAgICAgICBpZiAocmlnaHQgIT0gbVJpZ2h0KSB7CisgICAgICAgICAgICB1cGRhdGVNYXRyaXgoKTsKKyAgICAgICAgICAgIGlmIChtTWF0cml4SXNJZGVudGl0eSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdQYXJlbnQgcCA9IG1QYXJlbnQ7CisgICAgICAgICAgICAgICAgaWYgKHAgIT0gbnVsbCAmJiBtQXR0YWNoSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgciA9IG1BdHRhY2hJbmZvLm1UbXBJbnZhbFJlY3Q7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXhSaWdodDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0IDwgbVJpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhSaWdodCA9IG1SaWdodDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFJpZ2h0ID0gcmlnaHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgci5zZXQoMCwgMCwgbWF4UmlnaHQgLSBtTGVmdCwgbUJvdHRvbSAtIG1Ub3ApOworICAgICAgICAgICAgICAgICAgICBwLmludmFsaWRhdGVDaGlsZCh0aGlzLCByKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgb2xkV2lkdGggPSBtUmlnaHQgLSBtTGVmdDsKKyAgICAgICAgICAgIGludCBoZWlnaHQgPSBtQm90dG9tIC0gbVRvcDsKKworICAgICAgICAgICAgbVJpZ2h0ID0gcmlnaHQ7CisKKyAgICAgICAgICAgIG9uU2l6ZUNoYW5nZWQobVJpZ2h0IC0gbUxlZnQsIGhlaWdodCwgb2xkV2lkdGgsIGhlaWdodCk7CisKKyAgICAgICAgICAgIGlmICghbU1hdHJpeElzSWRlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmlzdWFsIHggcG9zaXRpb24gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUKKyAgICAgKiB7QGxpbmsgI3NldFRyYW5zbGF0aW9uWChmbG9hdCkgdHJhbnNsYXRpb25YfSBwcm9wZXJ0eSBwbHVzIHRoZSBjdXJyZW50CisgICAgICoge0BsaW5rICNnZXRMZWZ0KCkgbGVmdH0gcHJvcGVydHkuIAorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdmlzdWFsIHggcG9zaXRpb24gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFgoKSB7CisgICAgICAgIHJldHVybiBtTGVmdCArIG1UcmFuc2xhdGlvblg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmlzdWFsIHggcG9zaXRpb24gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuIFRoaXMgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIHRoZQorICAgICAqIHtAbGluayAjc2V0VHJhbnNsYXRpb25YKGZsb2F0KSB0cmFuc2xhdGlvblh9IHByb3BlcnR5IHRvIGJlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKyAgICAgKiB0aGUgeCB2YWx1ZSBwYXNzZWQgaW4gYW5kIHRoZSBjdXJyZW50IHtAbGluayAjZ2V0TGVmdCgpIGxlZnR9IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHggVGhlIHZpc3VhbCB4IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFgoZmxvYXQgeCkgeworICAgICAgICBzZXRUcmFuc2xhdGlvblgoeCAtIG1MZWZ0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmlzdWFsIHkgcG9zaXRpb24gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUKKyAgICAgKiB7QGxpbmsgI3NldFRyYW5zbGF0aW9uWShmbG9hdCkgdHJhbnNsYXRpb25ZfSBwcm9wZXJ0eSBwbHVzIHRoZSBjdXJyZW50CisgICAgICoge0BsaW5rICNnZXRUb3AoKSB0b3B9IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdmlzdWFsIHkgcG9zaXRpb24gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFkoKSB7CisgICAgICAgIHJldHVybiBtVG9wICsgbVRyYW5zbGF0aW9uWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2aXN1YWwgeSBwb3NpdGlvbiBvZiB0aGlzIHZpZXcsIGluIHBpeGVscy4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHNldHRpbmcgdGhlCisgICAgICoge0BsaW5rICNzZXRUcmFuc2xhdGlvblkoZmxvYXQpIHRyYW5zbGF0aW9uWX0gcHJvcGVydHkgdG8gYmUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgorICAgICAqIHRoZSB5IHZhbHVlIHBhc3NlZCBpbiBhbmQgdGhlIGN1cnJlbnQge0BsaW5rICNnZXRUb3AoKSB0b3B9IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHkgVGhlIHZpc3VhbCB5IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFkoZmxvYXQgeSkgeworICAgICAgICBzZXRUcmFuc2xhdGlvblkoeSAtIG1Ub3ApOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGhvcml6b250YWwgbG9jYXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyB7QGxpbmsgI2dldExlZnQoKSBsZWZ0fSBwb3NpdGlvbi4KKyAgICAgKiBUaGlzIHBvc2l0aW9uIGlzIHBvc3QtbGF5b3V0LCBpbiBhZGRpdGlvbiB0byB3aGVyZXZlciB0aGUgb2JqZWN0J3MKKyAgICAgKiBsYXlvdXQgcGxhY2VkIGl0LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIGxlZnQgcG9zaXRpb24sIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0VHJhbnNsYXRpb25YKCkgeworICAgICAgICByZXR1cm4gbVRyYW5zbGF0aW9uWDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBob3Jpem9udGFsIGxvY2F0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMge0BsaW5rICNnZXRMZWZ0KCkgbGVmdH0gcG9zaXRpb24uCisgICAgICogVGhpcyBlZmZlY3RpdmVseSBwb3NpdGlvbnMgdGhlIG9iamVjdCBwb3N0LWxheW91dCwgaW4gYWRkaXRpb24gdG8gd2hlcmV2ZXIgdGhlIG9iamVjdCdzCisgICAgICogbGF5b3V0IHBsYWNlZCBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2xhdGlvblggVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyBsZWZ0IHBvc2l0aW9uLAorICAgICAqIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2xhdGlvblgoZmxvYXQgdHJhbnNsYXRpb25YKSB7CisgICAgICAgIGlmIChtVHJhbnNsYXRpb25YICE9IHRyYW5zbGF0aW9uWCkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoZmFsc2UpOworICAgICAgICAgICAgbVRyYW5zbGF0aW9uWCA9IHRyYW5zbGF0aW9uWDsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGhvcml6b250YWwgbG9jYXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyB7QGxpbmsgI2dldFRvcCgpIHRvcH0gcG9zaXRpb24uCisgICAgICogVGhpcyBwb3NpdGlvbiBpcyBwb3N0LWxheW91dCwgaW4gYWRkaXRpb24gdG8gd2hlcmV2ZXIgdGhlIG9iamVjdCdzCisgICAgICogbGF5b3V0IHBsYWNlZCBpdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgdG9wIHBvc2l0aW9uLAorICAgICAqIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0VHJhbnNsYXRpb25ZKCkgeworICAgICAgICByZXR1cm4gbVRyYW5zbGF0aW9uWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2ZXJ0aWNhbCBsb2NhdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHtAbGluayAjZ2V0VG9wKCkgdG9wfSBwb3NpdGlvbi4KKyAgICAgKiBUaGlzIGVmZmVjdGl2ZWx5IHBvc2l0aW9ucyB0aGUgb2JqZWN0IHBvc3QtbGF5b3V0LCBpbiBhZGRpdGlvbiB0byB3aGVyZXZlciB0aGUgb2JqZWN0J3MKKyAgICAgKiBsYXlvdXQgcGxhY2VkIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zbGF0aW9uWSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyB0b3AgcG9zaXRpb24sCisgICAgICogaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zbGF0aW9uWShmbG9hdCB0cmFuc2xhdGlvblkpIHsKKyAgICAgICAgaWYgKG1UcmFuc2xhdGlvblkgIT0gdHJhbnNsYXRpb25ZKSB7CisgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgaW52YWxpZGF0ZShmYWxzZSk7CisgICAgICAgICAgICBtVHJhbnNsYXRpb25ZID0gdHJhbnNsYXRpb25ZOworICAgICAgICAgICAgbU1hdHJpeERpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgaW52YWxpZGF0ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBIaXQgcmVjdGFuZ2xlIGluIHBhcmVudCdzIGNvb3JkaW5hdGVzCiAgICAgICoKICAgICAgKiBAcGFyYW0gb3V0UmVjdCBUaGUgaGl0IHJlY3RhbmdsZSBvZiB0aGUgdmlldy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBnZXRIaXRSZWN0KFJlY3Qgb3V0UmVjdCkgewotICAgICAgICBvdXRSZWN0LnNldChtTGVmdCwgbVRvcCwgbVJpZ2h0LCBtQm90dG9tKTsKKyAgICAgICAgdXBkYXRlTWF0cml4KCk7CisgICAgICAgIGlmIChtTWF0cml4SXNJZGVudGl0eSB8fCBtQXR0YWNoSW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXRSZWN0LnNldChtTGVmdCwgbVRvcCwgbVJpZ2h0LCBtQm90dG9tKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIFJlY3RGIHRtcFJlY3QgPSBtQXR0YWNoSW5mby5tVG1wVHJhbnNmb3JtUmVjdDsKKyAgICAgICAgICAgIHRtcFJlY3Quc2V0KC1tUGl2b3RYLCAtbVBpdm90WSwgZ2V0V2lkdGgoKSAtIG1QaXZvdFgsIGdldEhlaWdodCgpIC0gbVBpdm90WSk7CisgICAgICAgICAgICBtTWF0cml4Lm1hcFJlY3QodG1wUmVjdCk7CisgICAgICAgICAgICBvdXRSZWN0LnNldCgoaW50KSB0bXBSZWN0LmxlZnQgKyBtTGVmdCwgKGludCkgdG1wUmVjdC50b3AgKyBtVG9wLAorICAgICAgICAgICAgICAgICAgICAoaW50KSB0bXBSZWN0LnJpZ2h0ICsgbUxlZnQsIChpbnQpIHRtcFJlY3QuYm90dG9tICsgbVRvcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIHBvaW50LCBpbiBsb2NhbCBjb29yZGluYXRlcyBpcyBpbnNpZGUgdGhlIHZpZXcuCisgICAgICovCisgICAgLypwYWNrYWdlKi8gZmluYWwgYm9vbGVhbiBwb2ludEluVmlldyhmbG9hdCBsb2NhbFgsIGZsb2F0IGxvY2FsWSkgeworICAgICAgICByZXR1cm4gbG9jYWxYID49IDAgJiYgbG9jYWxYIDwgKG1SaWdodCAtIG1MZWZ0KQorICAgICAgICAgICAgICAgICYmIGxvY2FsWSA+PSAwICYmIGxvY2FsWSA8IChtQm90dG9tIC0gbVRvcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIHBvaW50LCBpbiBsb2NhbCBjb29yZGluYXRlcywKKyAgICAgKiBpcyBpbnNpZGUgdGhlIHZpZXcsIHdoZXJlIHRoZSBhcmVhIG9mIHRoZSB2aWV3IGlzIGV4cGFuZGVkIGJ5IHRoZSBzbG9wIGZhY3Rvci4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hpbGUgcHJvY2Vzc2luZyB0b3VjaC1tb3ZlIGV2ZW50cyB0byBkZXRlcm1pbmUgaWYgdGhlIGV2ZW50CisgICAgICogaXMgc3RpbGwgd2l0aGluIHRoZSB2aWV3LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwb2ludEluVmlldyhmbG9hdCBsb2NhbFgsIGZsb2F0IGxvY2FsWSwgZmxvYXQgc2xvcCkgeworICAgICAgICByZXR1cm4gbG9jYWxYID49IC1zbG9wICYmIGxvY2FsWSA+PSAtc2xvcCAmJiBsb2NhbFggPCAoKG1SaWdodCAtIG1MZWZ0KSArIHNsb3ApICYmCisgICAgICAgICAgICAgICAgbG9jYWxZIDwgKChtQm90dG9tIC0gbVRvcCkgKyBzbG9wKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ5NTcsOCArNTg5MywzOSBAQAogICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG51bWJlciBvZiBwaXhlbHMgdG8gb2Zmc2V0IHRoZSB2aWV3IGJ5CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgb2Zmc2V0VG9wQW5kQm90dG9tKGludCBvZmZzZXQpIHsKLSAgICAgICAgbVRvcCArPSBvZmZzZXQ7Ci0gICAgICAgIG1Cb3R0b20gKz0gb2Zmc2V0OworICAgICAgICBpZiAob2Zmc2V0ICE9IDApIHsKKyAgICAgICAgICAgIHVwZGF0ZU1hdHJpeCgpOworICAgICAgICAgICAgaWYgKG1NYXRyaXhJc0lkZW50aXR5KSB7CisgICAgICAgICAgICAgICAgZmluYWwgVmlld1BhcmVudCBwID0gbVBhcmVudDsKKyAgICAgICAgICAgICAgICBpZiAocCAhPSBudWxsICYmIG1BdHRhY2hJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVjdCByID0gbUF0dGFjaEluZm8ubVRtcEludmFsUmVjdDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1pblRvcDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1heEJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHlMb2M7CisgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5Ub3AgPSBtVG9wICsgb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm90dG9tID0gbUJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHlMb2MgPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5Ub3AgPSBtVG9wOworICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm90dG9tID0gbUJvdHRvbSArIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHlMb2MgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHIuc2V0KDAsIHlMb2MsIG1SaWdodCAtIG1MZWZ0LCBtYXhCb3R0b20gLSBtaW5Ub3ApOworICAgICAgICAgICAgICAgICAgICBwLmludmFsaWRhdGVDaGlsZCh0aGlzLCByKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludmFsaWRhdGUoZmFsc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtVG9wICs9IG9mZnNldDsKKyAgICAgICAgICAgIG1Cb3R0b20gKz0gb2Zmc2V0OworCisgICAgICAgICAgICBpZiAoIW1NYXRyaXhJc0lkZW50aXR5KSB7CisgICAgICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZShmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTQ5NjcsOCArNTkzNCwzNiBAQAogICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG51bWVyIG9mIHBpeGVscyB0byBvZmZzZXQgdGhlIHZpZXcgYnkKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBvZmZzZXRMZWZ0QW5kUmlnaHQoaW50IG9mZnNldCkgewotICAgICAgICBtTGVmdCArPSBvZmZzZXQ7Ci0gICAgICAgIG1SaWdodCArPSBvZmZzZXQ7CisgICAgICAgIGlmIChvZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgdXBkYXRlTWF0cml4KCk7CisgICAgICAgICAgICBpZiAobU1hdHJpeElzSWRlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3UGFyZW50IHAgPSBtUGFyZW50OworICAgICAgICAgICAgICAgIGlmIChwICE9IG51bGwgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IHIgPSBtQXR0YWNoSW5mby5tVG1wSW52YWxSZWN0OworICAgICAgICAgICAgICAgICAgICBpbnQgbWluTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1heFJpZ2h0OworICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluTGVmdCA9IG1MZWZ0ICsgb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmlnaHQgPSBtUmlnaHQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5MZWZ0ID0gbUxlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhSaWdodCA9IG1SaWdodCArIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByLnNldCgwLCAwLCBtYXhSaWdodCAtIG1pbkxlZnQsIG1Cb3R0b20gLSBtVG9wKTsKKyAgICAgICAgICAgICAgICAgICAgcC5pbnZhbGlkYXRlQ2hpbGQodGhpcywgcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUxlZnQgKz0gb2Zmc2V0OworICAgICAgICAgICAgbVJpZ2h0ICs9IG9mZnNldDsKKworICAgICAgICAgICAgaWYgKCFtTWF0cml4SXNJZGVudGl0eSkgeworICAgICAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgICAgIGludmFsaWRhdGUoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC01MjEzLDcgKzYyMDgsOCBAQAogICAgICAgICAgICAgVmlld0RlYnVnLnRyYWNlKHRoaXMsIFZpZXdEZWJ1Zy5IaWVyYXJjaHlUcmFjZVR5cGUuSU5WQUxJREFURSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKG1Qcml2YXRlRmxhZ3MgJiAoRFJBV04gfCBIQVNfQk9VTkRTKSkgPT0gKERSQVdOIHwgSEFTX0JPVU5EUykpIHsKKyAgICAgICAgaWYgKChtUHJpdmF0ZUZsYWdzICYgKERSQVdOIHwgSEFTX0JPVU5EUykpID09IChEUkFXTiB8IEhBU19CT1VORFMpIHx8CisgICAgICAgICAgICAgICAgKG1Qcml2YXRlRmxhZ3MgJiBEUkFXSU5HX0NBQ0hFX1ZBTElEKSA9PSBEUkFXSU5HX0NBQ0hFX1ZBTElEKSB7CiAgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzICY9IH5EUkFXSU5HX0NBQ0hFX1ZBTElEOwogICAgICAgICAgICAgZmluYWwgVmlld1BhcmVudCBwID0gbVBhcmVudDsKICAgICAgICAgICAgIGZpbmFsIEF0dGFjaEluZm8gYWkgPSBtQXR0YWNoSW5mbzsKQEAgLTUyNDQsNyArNjI0MCw4IEBACiAgICAgICAgICAgICBWaWV3RGVidWcudHJhY2UodGhpcywgVmlld0RlYnVnLkhpZXJhcmNoeVRyYWNlVHlwZS5JTlZBTElEQVRFKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgobVByaXZhdGVGbGFncyAmIChEUkFXTiB8IEhBU19CT1VORFMpKSA9PSAoRFJBV04gfCBIQVNfQk9VTkRTKSkgeworICAgICAgICBpZiAoKG1Qcml2YXRlRmxhZ3MgJiAoRFJBV04gfCBIQVNfQk9VTkRTKSkgPT0gKERSQVdOIHwgSEFTX0JPVU5EUykgfHwKKyAgICAgICAgICAgICAgICAobVByaXZhdGVGbGFncyAmIERSQVdJTkdfQ0FDSEVfVkFMSUQpID09IERSQVdJTkdfQ0FDSEVfVkFMSUQpIHsKICAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgJj0gfkRSQVdJTkdfQ0FDSEVfVkFMSUQ7CiAgICAgICAgICAgICBmaW5hbCBWaWV3UGFyZW50IHAgPSBtUGFyZW50OwogICAgICAgICAgICAgZmluYWwgQXR0YWNoSW5mbyBhaSA9IG1BdHRhY2hJbmZvOwpAQCAtNTI2NCwxMiArNjI2MSwzMSBAQAogICAgICAqIFVJIHRocmVhZC4gVG8gY2FsbCBmcm9tIGEgbm9uLVVJIHRocmVhZCwgY2FsbCB7QGxpbmsgI3Bvc3RJbnZhbGlkYXRlKCl9LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGUoKSB7CisgICAgICAgIGludmFsaWRhdGUodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyB3aGVyZSB0aGUgaW52YWxpZGF0ZSgpIHdvcmsgYWN0dWFsbHkgaGFwcGVucy4gQSBmdWxsIGludmFsaWRhdGUoKQorICAgICAqIGNhdXNlcyB0aGUgZHJhd2luZyBjYWNoZSB0byBiZSBpbnZhbGlkYXRlZCwgYnV0IHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCB3aXRoCisgICAgICogaW52YWxpZGF0ZUNhY2hlIHNldCB0byBmYWxzZSB0byBza2lwIHRoYXQgaW52YWxpZGF0aW9uIHN0ZXAgZm9yIGNhc2VzIHRoYXQgZG8gbm90CisgICAgICogbmVlZCBpdCAoZm9yIGV4YW1wbGUsIGEgY29tcG9uZW50IHRoYXQgcmVtYWlucyBhdCB0aGUgc2FtZSBkaW1lbnNpb25zIHdpdGggdGhlIHNhbWUKKyAgICAgKiBjb250ZW50KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnZhbGlkYXRlQ2FjaGUgV2hldGhlciB0aGUgZHJhd2luZyBjYWNoZSBmb3IgdGhpcyB2aWV3IHNob3VsZCBiZSBpbnZhbGlkYXRlZCBhcworICAgICAqIHdlbGwuIFRoaXMgaXMgdXN1YWxseSB0cnVlIGZvciBhIGZ1bGwgaW52YWxpZGF0ZSwgYnV0IG1heSBiZSBzZXQgdG8gZmFsc2UgaWYgdGhlCisgICAgICogVmlldydzIGNvbnRlbnRzIG9yIGRpbWVuc2lvbnMgaGF2ZSBub3QgY2hhbmdlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW52YWxpZGF0ZShib29sZWFuIGludmFsaWRhdGVDYWNoZSkgewogICAgICAgICBpZiAoVmlld0RlYnVnLlRSQUNFX0hJRVJBUkNIWSkgewogICAgICAgICAgICAgVmlld0RlYnVnLnRyYWNlKHRoaXMsIFZpZXdEZWJ1Zy5IaWVyYXJjaHlUcmFjZVR5cGUuSU5WQUxJREFURSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKG1Qcml2YXRlRmxhZ3MgJiAoRFJBV04gfCBIQVNfQk9VTkRTKSkgPT0gKERSQVdOIHwgSEFTX0JPVU5EUykpIHsKLSAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgJj0gfkRSQVdOICYgfkRSQVdJTkdfQ0FDSEVfVkFMSUQ7CisgICAgICAgIGlmICgobVByaXZhdGVGbGFncyAmIChEUkFXTiB8IEhBU19CT1VORFMpKSA9PSAoRFJBV04gfCBIQVNfQk9VTkRTKSB8fAorICAgICAgICAgICAgICAgIChpbnZhbGlkYXRlQ2FjaGUgJiYgKG1Qcml2YXRlRmxhZ3MgJiBEUkFXSU5HX0NBQ0hFX1ZBTElEKSA9PSBEUkFXSU5HX0NBQ0hFX1ZBTElEKSkgeworICAgICAgICAgICAgbVByaXZhdGVGbGFncyAmPSB+RFJBV047CisgICAgICAgICAgICBpZiAoaW52YWxpZGF0ZUNhY2hlKSB7CisgICAgICAgICAgICAgICAgbVByaXZhdGVGbGFncyAmPSB+RFJBV0lOR19DQUNIRV9WQUxJRDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpbmFsIFZpZXdQYXJlbnQgcCA9IG1QYXJlbnQ7CiAgICAgICAgICAgICBmaW5hbCBBdHRhY2hJbmZvIGFpID0gbUF0dGFjaEluZm87CiAgICAgICAgICAgICBpZiAocCAhPSBudWxsICYmIGFpICE9IG51bGwpIHsKQEAgLTYwMDcsOSArNzAyMyw4IEBACiAgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5TY3JvbGxCYXJEcmF3YWJsZQogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3SG9yaXpvbnRhbFNjcm9sbEJhcihDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhd2FibGUgc2Nyb2xsQmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXdIb3Jpem9udGFsU2Nyb2xsQmFyKENhbnZhcyBjYW52YXMsIERyYXdhYmxlIHNjcm9sbEJhciwKKyAgICAgICAgICAgIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7CiAgICAgICAgIHNjcm9sbEJhci5zZXRCb3VuZHMobCwgdCwgciwgYik7CiAgICAgICAgIHNjcm9sbEJhci5kcmF3KGNhbnZhcyk7CiAgICAgfQpAQCAtNjAyOCw5ICs3MDQzLDggQEAKICAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LlNjcm9sbEJhckRyYXdhYmxlCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXdWZXJ0aWNhbFNjcm9sbEJhcihDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIHNjcm9sbEJhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgeworICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhd1ZlcnRpY2FsU2Nyb2xsQmFyKENhbnZhcyBjYW52YXMsIERyYXdhYmxlIHNjcm9sbEJhciwKKyAgICAgICAgICAgIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7CiAgICAgICAgIHNjcm9sbEJhci5zZXRCb3VuZHMobCwgdCwgciwgYik7CiAgICAgICAgIHNjcm9sbEJhci5kcmF3KGNhbnZhcyk7CiAgICAgfQpAQCAtNjM4NCw2ICs3Mzk4LDYzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogPHA+UmV0dXJucyBhIGRpc3BsYXkgbGlzdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGRyYXcgdGhpcyB2aWV3IGFnYWluCisgICAgICogd2l0aG91dCBleGVjdXRpbmcgaXRzIGRyYXcgbWV0aG9kLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEEgRGlzcGxheUxpc3QgcmVhZHkgdG8gcmVwbGF5LCBvciBudWxsIGlmIGNhY2hpbmcgaXMgbm90IGVuYWJsZWQuCisgICAgICovCisgICAgRGlzcGxheUxpc3QgZ2V0RGlzcGxheUxpc3QoKSB7CisgICAgICAgIGlmICgobVZpZXdGbGFncyAmIFdJTExfTk9UX0NBQ0hFX0RSQVdJTkcpID09IFdJTExfTk9UX0NBQ0hFX0RSQVdJTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobUF0dGFjaEluZm8gPT0gbnVsbCB8fCBtQXR0YWNoSW5mby5tSGFyZHdhcmVSZW5kZXJlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgobVZpZXdGbGFncyAmIERSQVdJTkdfQ0FDSEVfRU5BQkxFRCkgPT0gRFJBV0lOR19DQUNIRV9FTkFCTEVEICYmCisgICAgICAgICAgICAgICAgKChtUHJpdmF0ZUZsYWdzICYgRFJBV0lOR19DQUNIRV9WQUxJRCkgPT0gMCB8fCBtRGlzcGxheUxpc3QgPT0gbnVsbCkpIHsKKworICAgICAgICAgICAgaWYgKG1EaXNwbGF5TGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbURpc3BsYXlMaXN0LmRlc3Ryb3koKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbURpc3BsYXlMaXN0ID0gbUF0dGFjaEluZm8ubUhhcmR3YXJlUmVuZGVyZXIuY3JlYXRlRGlzcGxheUxpc3QoKTsKKworICAgICAgICAgICAgZmluYWwgSGFyZHdhcmVDYW52YXMgY2FudmFzID0gbURpc3BsYXlMaXN0LnN0YXJ0KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGludCB3aWR0aCA9IG1SaWdodCAtIG1MZWZ0OworICAgICAgICAgICAgICAgIGludCBoZWlnaHQgPSBtQm90dG9tIC0gbVRvcDsKKworICAgICAgICAgICAgICAgIGNhbnZhcy5zZXRWaWV3cG9ydCh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBjYW52YXMub25QcmVEcmF3KCk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVzdG9yZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKKworICAgICAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV04gfCBEUkFXSU5HX0NBQ0hFX1ZBTElEOworICAgIAorICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aCBmb3IgbGF5b3V0cyB3aXRoIG5vIGJhY2tncm91bmRzCisgICAgICAgICAgICAgICAgaWYgKChtUHJpdmF0ZUZsYWdzICYgU0tJUF9EUkFXKSA9PSBTS0lQX0RSQVcpIHsKKyAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVGbGFncyAmPSB+RElSVFlfTUFTSzsKKyAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hEcmF3KGNhbnZhcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZHJhdyhjYW52YXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQocmVzdG9yZUNvdW50KTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgY2FudmFzLm9uUG9zdERyYXcoKTsKKworICAgICAgICAgICAgICAgIG1EaXNwbGF5TGlzdC5lbmQoKTsKKworICAgICAgICAgICAgICAgIGNhbnZhcy5kZXN0cm95KCk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1EaXNwbGF5TGlzdDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiA8cD5DYWxsaW5nIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyA8Y29kZT5nZXREcmF3aW5nQ2FjaGUoZmFsc2UpPC9jb2RlPi48L3A+CiAgICAgICogCiAgICAgICogQHJldHVybiBBIG5vbi1zY2FsZWQgYml0bWFwIHJlcHJlc2VudGluZyB0aGlzIHZpZXcgb3IgbnVsbCBpZiBjYWNoZSBpcyBkaXNhYmxlZC4KQEAgLTY0MjgsOCArNzQ5OSw3IEBACiAgICAgICAgIGlmICgobVZpZXdGbGFncyAmIERSQVdJTkdfQ0FDSEVfRU5BQkxFRCkgPT0gRFJBV0lOR19DQUNIRV9FTkFCTEVEKSB7CiAgICAgICAgICAgICBidWlsZERyYXdpbmdDYWNoZShhdXRvU2NhbGUpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhdXRvU2NhbGUgPyAobURyYXdpbmdDYWNoZSA9PSBudWxsID8gbnVsbCA6IG1EcmF3aW5nQ2FjaGUuZ2V0KCkpIDoKLSAgICAgICAgICAgICAgICAobVVuc2NhbGVkRHJhd2luZ0NhY2hlID09IG51bGwgPyBudWxsIDogbVVuc2NhbGVkRHJhd2luZ0NhY2hlLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIGF1dG9TY2FsZSA/IG1EcmF3aW5nQ2FjaGUgOiBtVW5zY2FsZWREcmF3aW5nQ2FjaGU7CiAgICAgfQogCiAgICAgLyoqCkBAIC02NDQ0LDE1ICs3NTE0LDE3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZGVzdHJveURyYXdpbmdDYWNoZSgpIHsKICAgICAgICAgaWYgKG1EcmF3aW5nQ2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgQml0bWFwIGJpdG1hcCA9IG1EcmF3aW5nQ2FjaGUuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoYml0bWFwICE9IG51bGwpIGJpdG1hcC5yZWN5Y2xlKCk7CisgICAgICAgICAgICBtRHJhd2luZ0NhY2hlLnJlY3ljbGUoKTsKICAgICAgICAgICAgIG1EcmF3aW5nQ2FjaGUgPSBudWxsOwogICAgICAgICB9CiAgICAgICAgIGlmIChtVW5zY2FsZWREcmF3aW5nQ2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgQml0bWFwIGJpdG1hcCA9IG1VbnNjYWxlZERyYXdpbmdDYWNoZS5nZXQoKTsKLSAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgYml0bWFwLnJlY3ljbGUoKTsKKyAgICAgICAgICAgIG1VbnNjYWxlZERyYXdpbmdDYWNoZS5yZWN5Y2xlKCk7CiAgICAgICAgICAgICBtVW5zY2FsZWREcmF3aW5nQ2FjaGUgPSBudWxsOwogICAgICAgICB9CisgICAgICAgIGlmIChtRGlzcGxheUxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgbURpc3BsYXlMaXN0LmRlc3Ryb3koKTsKKyAgICAgICAgICAgIG1EaXNwbGF5TGlzdCA9IG51bGw7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTY1MTEsMTUgKzc1ODMsMTEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBidWlsZERyYXdpbmdDYWNoZShib29sZWFuIGF1dG9TY2FsZSkgewogICAgICAgICBpZiAoKG1Qcml2YXRlRmxhZ3MgJiBEUkFXSU5HX0NBQ0hFX1ZBTElEKSA9PSAwIHx8IChhdXRvU2NhbGUgPwotICAgICAgICAgICAgICAgIChtRHJhd2luZ0NhY2hlID09IG51bGwgfHwgbURyYXdpbmdDYWNoZS5nZXQoKSA9PSBudWxsKSA6Ci0gICAgICAgICAgICAgICAgKG1VbnNjYWxlZERyYXdpbmdDYWNoZSA9PSBudWxsIHx8IG1VbnNjYWxlZERyYXdpbmdDYWNoZS5nZXQoKSA9PSBudWxsKSkpIHsKKyAgICAgICAgICAgICAgICBtRHJhd2luZ0NhY2hlID09IG51bGwgOiBtVW5zY2FsZWREcmF3aW5nQ2FjaGUgPT0gbnVsbCkpIHsKIAogICAgICAgICAgICAgaWYgKFZpZXdEZWJ1Zy5UUkFDRV9ISUVSQVJDSFkpIHsKICAgICAgICAgICAgICAgICBWaWV3RGVidWcudHJhY2UodGhpcywgVmlld0RlYnVnLkhpZXJhcmNoeVRyYWNlVHlwZS5CVUlMRF9DQUNIRSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5wcm9maWxlRHJhd2luZykgewotICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoNjAwMDIsIGhhc2hDb2RlKCkpOwotICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQgd2lkdGggPSBtUmlnaHQgLSBtTGVmdDsKICAgICAgICAgICAgIGludCBoZWlnaHQgPSBtQm90dG9tIC0gbVRvcDsKQEAgLTY1NDUsOCArNzYxMyw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJvb2xlYW4gY2xlYXIgPSB0cnVlOwotICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IGF1dG9TY2FsZSA/IChtRHJhd2luZ0NhY2hlID09IG51bGwgPyBudWxsIDogbURyYXdpbmdDYWNoZS5nZXQoKSkgOgotICAgICAgICAgICAgICAgICAgICAobVVuc2NhbGVkRHJhd2luZ0NhY2hlID09IG51bGwgPyBudWxsIDogbVVuc2NhbGVkRHJhd2luZ0NhY2hlLmdldCgpKTsKKyAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBhdXRvU2NhbGUgPyBtRHJhd2luZ0NhY2hlIDogbVVuc2NhbGVkRHJhd2luZ0NhY2hlOwogCiAgICAgICAgICAgICBpZiAoYml0bWFwID09IG51bGwgfHwgYml0bWFwLmdldFdpZHRoKCkgIT0gd2lkdGggfHwgYml0bWFwLmdldEhlaWdodCgpICE9IGhlaWdodCkgewogICAgICAgICAgICAgICAgIEJpdG1hcC5Db25maWcgcXVhbGl0eTsKQEAgLTY1NzgsOSArNzY0NSw5IEBACiAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAod2lkdGgsIGhlaWdodCwgcXVhbGl0eSk7CiAgICAgICAgICAgICAgICAgICAgIGJpdG1hcC5zZXREZW5zaXR5KGdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eURwaSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRvU2NhbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EcmF3aW5nQ2FjaGUgPSBuZXcgU29mdFJlZmVyZW5jZTxCaXRtYXA+KGJpdG1hcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRHJhd2luZ0NhY2hlID0gYml0bWFwOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbVVuc2NhbGVkRHJhd2luZ0NhY2hlID0gbmV3IFNvZnRSZWZlcmVuY2U8Qml0bWFwPihiaXRtYXApOworICAgICAgICAgICAgICAgICAgICAgICAgbVVuc2NhbGVkRHJhd2luZ0NhY2hlID0gYml0bWFwOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChvcGFxdWUgJiYgdHJhbnNsdWNlbnRXaW5kb3cpIGJpdG1hcC5zZXRIYXNBbHBoYShmYWxzZSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoT3V0T2ZNZW1vcnlFcnJvciBlKSB7CkBAIC02ODE5LDYgKzc4ODYsMjUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiA8cD5JbmRpY2F0ZXMgd2hldGhlciB0aGlzIHZpZXcgaXMgYXR0YWNoZWQgdG8gYW4gaGFyZHdhcmUgYWNjZWxlcmF0ZWQKKyAgICAgKiB3aW5kb3cgb3Igbm90LjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5FdmVuIGlmIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSwgaXQgZG9lcyBub3QgbWVhbiB0aGF0IGV2ZXJ5IGNhbGwKKyAgICAgKiB0byB7QGxpbmsgI2RyYXcoYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpfSB3aWxsIGJlIG1hZGUgd2l0aCBhbiBoYXJkd2FyZQorICAgICAqIGFjY2VsZXJhdGVkIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhc30uIEZvciBpbnN0YW5jZSwgaWYgdGhpcyB2aWV3CisgICAgICogaXMgZHJhd24gb250byBhbiBvZmZzY3JlbiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXB9IGFuZCBpdHMKKyAgICAgKiB3aW5kb3cgaXMgaGFyZHdhcmUgYWNjZWxlcmF0ZWQsCisgICAgICoge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzI2lzSGFyZHdhcmVBY2NlbGVyYXRlZCgpfSB3aWxsIGxpa2VseQorICAgICAqIHJldHVybiBmYWxzZSwgYW5kIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRydWUuPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdmlldyBpcyBhdHRhY2hlZCB0byBhIHdpbmRvdyBhbmQgdGhlIHdpbmRvdyBpcworICAgICAqICAgICAgICAgaGFyZHdhcmUgYWNjZWxlcmF0ZWQ7IGZhbHNlIGluIGFueSBvdGhlciBjYXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1BdHRhY2hJbmZvICE9IG51bGwgJiYgbUF0dGFjaEluZm8ubUhhcmR3YXJlQWNjZWxlcmF0ZWQ7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIE1hbnVhbGx5IHJlbmRlciB0aGlzIHZpZXcgKGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuKSB0byB0aGUgZ2l2ZW4gQ2FudmFzLgogICAgICAqIFRoZSB2aWV3IG11c3QgaGF2ZSBhbHJlYWR5IGRvbmUgYSBmdWxsIGxheW91dCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcwogICAgICAqIGNhbGxlZC4gIFdoZW4gaW1wbGVtZW50aW5nIGEgdmlldywgZG8gbm90IG92ZXJyaWRlIHRoaXMgbWV0aG9kOyBpbnN0ZWFkLApAQCAtNjk0MywxNiArODAyOSwxNiBAQAogCiAgICAgICAgIGlmICh2ZXJ0aWNhbEVkZ2VzKSB7CiAgICAgICAgICAgICB0b3BGYWRlU3RyZW5ndGggPSBNYXRoLm1heCgwLjBmLCBNYXRoLm1pbigxLjBmLCBnZXRUb3BGYWRpbmdFZGdlU3RyZW5ndGgoKSkpOwotICAgICAgICAgICAgZHJhd1RvcCA9IHRvcEZhZGVTdHJlbmd0aCA+PSAwLjBmOworICAgICAgICAgICAgZHJhd1RvcCA9IHRvcEZhZGVTdHJlbmd0aCA+IDAuMGY7CiAgICAgICAgICAgICBib3R0b21GYWRlU3RyZW5ndGggPSBNYXRoLm1heCgwLjBmLCBNYXRoLm1pbigxLjBmLCBnZXRCb3R0b21GYWRpbmdFZGdlU3RyZW5ndGgoKSkpOwotICAgICAgICAgICAgZHJhd0JvdHRvbSA9IGJvdHRvbUZhZGVTdHJlbmd0aCA+PSAwLjBmOworICAgICAgICAgICAgZHJhd0JvdHRvbSA9IGJvdHRvbUZhZGVTdHJlbmd0aCA+IDAuMGY7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaG9yaXpvbnRhbEVkZ2VzKSB7CiAgICAgICAgICAgICBsZWZ0RmFkZVN0cmVuZ3RoID0gTWF0aC5tYXgoMC4wZiwgTWF0aC5taW4oMS4wZiwgZ2V0TGVmdEZhZGluZ0VkZ2VTdHJlbmd0aCgpKSk7Ci0gICAgICAgICAgICBkcmF3TGVmdCA9IGxlZnRGYWRlU3RyZW5ndGggPj0gMC4wZjsKKyAgICAgICAgICAgIGRyYXdMZWZ0ID0gbGVmdEZhZGVTdHJlbmd0aCA+IDAuMGY7CiAgICAgICAgICAgICByaWdodEZhZGVTdHJlbmd0aCA9IE1hdGgubWF4KDAuMGYsIE1hdGgubWluKDEuMGYsIGdldFJpZ2h0RmFkaW5nRWRnZVN0cmVuZ3RoKCkpKTsKLSAgICAgICAgICAgIGRyYXdSaWdodCA9IHJpZ2h0RmFkZVN0cmVuZ3RoID49IDAuMGY7CisgICAgICAgICAgICBkcmF3UmlnaHQgPSByaWdodEZhZGVTdHJlbmd0aCA+IDAuMGY7CiAgICAgICAgIH0KIAogICAgICAgICBzYXZlQ291bnQgPSBjYW52YXMuZ2V0U2F2ZUNvdW50KCk7CkBAIC03MTU5LDE0ICs4MjQ1LDE5IEBACiAgICAgICoKICAgICAgKiBEZXJpdmVkIGNsYXNzZXMgd2l0aCBjaGlsZHJlbiBzaG91bGQgb3ZlcnJpZGUKICAgICAgKiBvbkxheW91dC4gSW4gdGhhdCBtZXRob2QsIHRoZXkgc2hvdWxkCi0gICAgICogY2FsbCBsYXlvdXQgb24gZWFjaCBvZiB0aGVpciB0aGVpciBjaGlsZHJlbi4KKyAgICAgKiBjYWxsIGxheW91dCBvbiBlYWNoIG9mIHRoZWlyIGNoaWxkcmVuLgogICAgICAqCiAgICAgICogQHBhcmFtIGwgTGVmdCBwb3NpdGlvbiwgcmVsYXRpdmUgdG8gcGFyZW50CiAgICAgICogQHBhcmFtIHQgVG9wIHBvc2l0aW9uLCByZWxhdGl2ZSB0byBwYXJlbnQKICAgICAgKiBAcGFyYW0gciBSaWdodCBwb3NpdGlvbiwgcmVsYXRpdmUgdG8gcGFyZW50CiAgICAgICogQHBhcmFtIGIgQm90dG9tIHBvc2l0aW9uLCByZWxhdGl2ZSB0byBwYXJlbnQKICAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGxheW91dChpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgeworICAgICAgICBpbnQgb2xkTCA9IG1MZWZ0OworICAgICAgICBpbnQgb2xkVCA9IG1Ub3A7CisgICAgICAgIGludCBvbGRCID0gbUJvdHRvbTsKKyAgICAgICAgaW50IG9sZFIgPSBtUmlnaHQ7CiAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IHNldEZyYW1lKGwsIHQsIHIsIGIpOwogICAgICAgICBpZiAoY2hhbmdlZCB8fCAobVByaXZhdGVGbGFncyAmIExBWU9VVF9SRVFVSVJFRCkgPT0gTEFZT1VUX1JFUVVJUkVEKSB7CiAgICAgICAgICAgICBpZiAoVmlld0RlYnVnLlRSQUNFX0hJRVJBUkNIWSkgewpAQCAtNzE3NSw2ICs4MjY2LDE1IEBACiAKICAgICAgICAgICAgIG9uTGF5b3V0KGNoYW5nZWQsIGwsIHQsIHIsIGIpOwogICAgICAgICAgICAgbVByaXZhdGVGbGFncyAmPSB+TEFZT1VUX1JFUVVJUkVEOworCisgICAgICAgICAgICBpZiAobU9uTGF5b3V0Q2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBcnJheUxpc3Q8T25MYXlvdXRDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzQ29weSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0PE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXI+KSBtT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICBpbnQgbnVtTGlzdGVuZXJzID0gbGlzdGVuZXJzQ29weS5zaXplKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1MaXN0ZW5lcnM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnNDb3B5LmdldChpKS5vbkxheW91dENoYW5nZSh0aGlzLCBsLCByLCB0LCBiLCBvbGRMLCBvbGRULCBvbGRSLCBvbGRCKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbVByaXZhdGVGbGFncyAmPSB+Rk9SQ0VfTEFZT1VUOwogICAgIH0KQEAgLTcxODUsNyArODI4NSw3IEBACiAgICAgICoKICAgICAgKiBEZXJpdmVkIGNsYXNzZXMgd2l0aCBjaGlsZHJlbiBzaG91bGQgb3ZlcnJpZGUKICAgICAgKiB0aGlzIG1ldGhvZCBhbmQgY2FsbCBsYXlvdXQgb24gZWFjaCBvZgotICAgICAqIHRoZWlyIHRoZWlyIGNoaWxkcmVuLgorICAgICAqIHRoZWlyIGNoaWxkcmVuLgogICAgICAqIEBwYXJhbSBjaGFuZ2VkIFRoaXMgaXMgYSBuZXcgc2l6ZSBvciBwb3NpdGlvbiBmb3IgdGhpcyB2aWV3CiAgICAgICogQHBhcmFtIGxlZnQgTGVmdCBwb3NpdGlvbiwgcmVsYXRpdmUgdG8gcGFyZW50CiAgICAgICogQHBhcmFtIHRvcCBUb3AgcG9zaXRpb24sIHJlbGF0aXZlIHRvIHBhcmVudApAQCAtNzQzOSwxOCArODUzOSwxMyBAQAogCiAgICAgICAgIGludCBwcml2YXRlRmxhZ3MgPSBtUHJpdmF0ZUZsYWdzOwogCi0gICAgICAgIGludCB2aWV3U3RhdGVJbmRleCA9ICgoKHByaXZhdGVGbGFncyAmIFBSRVNTRUQpICE9IDApID8gMSA6IDApOwotCi0gICAgICAgIHZpZXdTdGF0ZUluZGV4ID0gKHZpZXdTdGF0ZUluZGV4IDw8IDEpCi0gICAgICAgICAgICAgICAgKyAoKChtVmlld0ZsYWdzICYgRU5BQkxFRF9NQVNLKSA9PSBFTkFCTEVEKSA/IDEgOiAwKTsKLQotICAgICAgICB2aWV3U3RhdGVJbmRleCA9ICh2aWV3U3RhdGVJbmRleCA8PCAxKSArIChpc0ZvY3VzZWQoKSA/IDEgOiAwKTsKLQotICAgICAgICB2aWV3U3RhdGVJbmRleCA9ICh2aWV3U3RhdGVJbmRleCA8PCAxKQotICAgICAgICAgICAgICAgICsgKCgocHJpdmF0ZUZsYWdzICYgU0VMRUNURUQpICE9IDApID8gMSA6IDApOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gaGFzV2luZG93Rm9jdXMgPSBoYXNXaW5kb3dGb2N1cygpOwotICAgICAgICB2aWV3U3RhdGVJbmRleCA9ICh2aWV3U3RhdGVJbmRleCA8PCAxKSArIChoYXNXaW5kb3dGb2N1cyA/IDEgOiAwKTsKKyAgICAgICAgaW50IHZpZXdTdGF0ZUluZGV4ID0gMDsKKyAgICAgICAgaWYgKChwcml2YXRlRmxhZ3MgJiBQUkVTU0VEKSAhPSAwKSB2aWV3U3RhdGVJbmRleCB8PSBWSUVXX1NUQVRFX1BSRVNTRUQ7CisgICAgICAgIGlmICgobVZpZXdGbGFncyAmIEVOQUJMRURfTUFTSykgPT0gRU5BQkxFRCkgdmlld1N0YXRlSW5kZXggfD0gVklFV19TVEFURV9FTkFCTEVEOworICAgICAgICBpZiAoaXNGb2N1c2VkKCkpIHZpZXdTdGF0ZUluZGV4IHw9IFZJRVdfU1RBVEVfRk9DVVNFRDsKKyAgICAgICAgaWYgKChwcml2YXRlRmxhZ3MgJiBTRUxFQ1RFRCkgIT0gMCkgdmlld1N0YXRlSW5kZXggfD0gVklFV19TVEFURV9TRUxFQ1RFRDsKKyAgICAgICAgaWYgKGhhc1dpbmRvd0ZvY3VzKCkpIHZpZXdTdGF0ZUluZGV4IHw9IFZJRVdfU1RBVEVfV0lORE9XX0ZPQ1VTRUQ7CisgICAgICAgIGlmICgocHJpdmF0ZUZsYWdzICYgQUNUSVZBVEVEKSAhPSAwKSB2aWV3U3RhdGVJbmRleCB8PSBWSUVXX1NUQVRFX0FDVElWQVRFRDsKIAogICAgICAgICBkcmF3YWJsZVN0YXRlID0gVklFV19TVEFURV9TRVRTW3ZpZXdTdGF0ZUluZGV4XTsKIApAQCAtNzQ2Miw3ICs4NTU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgKyAiIGVuPSIgKyAoKG1WaWV3RmxhZ3MgJiBFTkFCTEVEX01BU0spID09IEVOQUJMRUQpCiAgICAgICAgICAgICAgICAgICAgICsgIiBmbz0iICsgaGFzRm9jdXMoKQogICAgICAgICAgICAgICAgICAgICArICIgc2w9IiArICgocHJpdmF0ZUZsYWdzICYgU0VMRUNURUQpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICsgIiB3Zj0iICsgaGFzV2luZG93Rm9jdXMKKyAgICAgICAgICAgICAgICAgICAgKyAiIHdmPSIgKyBoYXNXaW5kb3dGb2N1cygpCiAgICAgICAgICAgICAgICAgICAgICsgIjogIiArIEFycmF5cy50b1N0cmluZyhkcmF3YWJsZVN0YXRlKSk7CiAgICAgICAgIH0KIApAQCAtNzc3Niw2ICs4ODcxLDQ4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2hhbmdlcyB0aGUgYWN0aXZhdGVkIHN0YXRlIG9mIHRoaXMgdmlldy4gQSB2aWV3IGNhbiBiZSBhY3RpdmF0ZWQgb3Igbm90LgorICAgICAqIE5vdGUgdGhhdCBhY3RpdmF0aW9uIGlzIG5vdCB0aGUgc2FtZSBhcyBzZWxlY3Rpb24uICBTZWxlY3Rpb24gaXMKKyAgICAgKiBhIHRyYW5zaWVudCBwcm9wZXJ0eSwgcmVwcmVzZW50aW5nIHRoZSB2aWV3IChoaWVyYXJjaHkpIHRoZSB1c2VyIGlzCisgICAgICogY3VycmVudGx5IGludGVyYWN0aW5nIHdpdGguICBBY3RpdmF0aW9uIGlzIGEgbG9uZ2VyLXRlcm0gc3RhdGUgdGhhdCB0aGUKKyAgICAgKiB1c2VyIGNhbiBtb3ZlIHZpZXdzIGluIGFuZCBvdXQgb2YuICBGb3IgZXhhbXBsZSwgaW4gYSBsaXN0IHZpZXcgd2l0aAorICAgICAqIHNpbmdsZSBvciBtdWx0aXBsZSBzZWxlY3Rpb24gZW5hYmxlZCwgdGhlIHZpZXdzIGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbgorICAgICAqIHNldCBhcmUgYWN0aXZhdGVkLiAgKFVtLCB5ZWFoLCB3ZSBhcmUgZGVlcGx5IHNvcnJ5IGFib3V0IHRoZSB0ZXJtaW5vbG9neQorICAgICAqIGhlcmUuKSAgVGhlIGFjdGl2YXRlZCBzdGF0ZSBpcyBwcm9wYWdhdGVkIGRvd24gdG8gY2hpbGRyZW4gb2YgdGhlIHZpZXcgaXQKKyAgICAgKiBpcyBzZXQgb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWN0aXZhdGVkIHRydWUgaWYgdGhlIHZpZXcgbXVzdCBiZSBhY3RpdmF0ZWQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2YXRlZChib29sZWFuIGFjdGl2YXRlZCkgeworICAgICAgICBpZiAoKChtUHJpdmF0ZUZsYWdzICYgQUNUSVZBVEVEKSAhPSAwKSAhPSBhY3RpdmF0ZWQpIHsKKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgPSAobVByaXZhdGVGbGFncyAmIH5BQ1RJVkFURUQpIHwgKGFjdGl2YXRlZCA/IEFDVElWQVRFRCA6IDApOworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgcmVmcmVzaERyYXdhYmxlU3RhdGUoKTsKKyAgICAgICAgICAgIGRpc3BhdGNoU2V0QWN0aXZhdGVkKGFjdGl2YXRlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNwYXRjaCBzZXRBY3RpdmF0ZWQgdG8gYWxsIG9mIHRoaXMgVmlldydzIGNoaWxkcmVuLgorICAgICAqCisgICAgICogQHNlZSAjc2V0QWN0aXZhdGVkKGJvb2xlYW4pCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWN0aXZhdGVkIFRoZSBuZXcgYWN0aXZhdGVkIHN0YXRlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2hTZXRBY3RpdmF0ZWQoYm9vbGVhbiBhY3RpdmF0ZWQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhlIGFjdGl2YXRpb24gc3RhdGUgb2YgdGhpcyB2aWV3LgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB2aWV3IGlzIGFjdGl2YXRlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmF0ZWQoKSB7CisgICAgICAgIHJldHVybiAobVByaXZhdGVGbGFncyAmIEFDVElWQVRFRCkgIT0gMDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBWaWV3VHJlZU9ic2VydmVyIGZvciB0aGlzIHZpZXcncyBoaWVyYXJjaHkuIFRoZSB2aWV3IHRyZWUKICAgICAgKiBvYnNlcnZlciBjYW4gYmUgdXNlZCB0byBnZXQgbm90aWZpY2F0aW9ucyB3aGVuIGdsb2JhbCBldmVudHMsIGxpa2UKICAgICAgKiBsYXlvdXQsIGhhcHBlbi4KQEAgLTg2OTEsMTMgKzk4MjgsMjE2IEBACiAgICAgICAgIGlmIChtQXR0YWNoSW5mbyA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKChmbGFncyZIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5GTEFHX0lHTk9SRV9WSUVXX1NFVFRJTkcpID09IDAKKyAgICAgICAgLy9ub2luc3BlY3Rpb24gU2ltcGxpZmlhYmxlSWZTdGF0ZW1lbnQKKyAgICAgICAgaWYgKChmbGFncyAmIEhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkZMQUdfSUdOT1JFX1ZJRVdfU0VUVElORykgPT0gMAogICAgICAgICAgICAgICAgICYmICFpc0hhcHRpY0ZlZWRiYWNrRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1BdHRhY2hJbmZvLm1Sb290Q2FsbGJhY2tzLnBlcmZvcm1IYXB0aWNGZWVkYmFjaygKLSAgICAgICAgICAgICAgICBmZWVkYmFja0NvbnN0YW50LAotICAgICAgICAgICAgICAgIChmbGFncyZIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5GTEFHX0lHTk9SRV9HTE9CQUxfU0VUVElORykgIT0gMCk7CisgICAgICAgIHJldHVybiBtQXR0YWNoSW5mby5tUm9vdENhbGxiYWNrcy5wZXJmb3JtSGFwdGljRmVlZGJhY2soZmVlZGJhY2tDb25zdGFudCwKKyAgICAgICAgICAgICAgICAoZmxhZ3MgJiBIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5GTEFHX0lHTk9SRV9HTE9CQUxfU0VUVElORykgIT0gMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogISEhIFRPRE86IHJlYWwgZG9jcworICAgICAqCisgICAgICogVGhlIGJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gbWFrZXMgdGhlIHRodW1ibmFpbCB0aGUgc2FtZSBzaXplIGFuZCBhcHBlYXJhbmNlCisgICAgICogYXMgdGhlIHZpZXcgaXRzZWxmLCBhbmQgcG9zaXRpb25zIGl0IHdpdGggaXRzIGNlbnRlciBhdCB0aGUgdG91Y2ggcG9pbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEcmFnVGh1bWJuYWlsQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxWaWV3PiBtVmlldzsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0IGEgdGh1bWJuYWlsIGJ1aWxkZXIgb2JqZWN0IGZvciB1c2Ugd2l0aCB0aGUgZ2l2ZW4gdmlldy4KKyAgICAgICAgICogQHBhcmFtIHZpZXcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBEcmFnVGh1bWJuYWlsQnVpbGRlcihWaWV3IHZpZXcpIHsKKyAgICAgICAgICAgIG1WaWV3ID0gbmV3IFdlYWtSZWZlcmVuY2U8Vmlldz4odmlldyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvdmlkZSB0aGUgZHJhZ2dhYmxlLXRodW1ibmFpbCBtZXRyaWNzIGZvciB0aGUgb3BlcmF0aW9uOiB0aGUgZGltZW5zaW9ucyBvZgorICAgICAgICAgKiB0aGUgdGh1bWJuYWlsIGltYWdlIGl0c2VsZiwgYW5kIHRoZSBwb2ludCB3aXRoaW4gdGhhdCB0aHVtYm5haWwgdGhhdCBzaG91bGQKKyAgICAgICAgICogYmUgY2VudGVyZWQgdW5kZXIgdGhlIHRvdWNoIGxvY2F0aW9uIHdoaWxlIGRyYWdnaW5nLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgdGh1bWJuYWlsIHRvIGJlIHRoZQorICAgICAgICAgKiBzYW1lIGFzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBWaWV3IGl0c2VsZiBhbmQgY2VudGVycyB0aGUgdGh1bWJuYWlsIHVuZGVyCisgICAgICAgICAqIHRoZSB0b3VjaCBwb2ludC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRodW1ibmFpbFNpemUgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBzZXQgdGhlIHtAY29kZSB4fSBtZW1iZXIgb2YgdGhpcworICAgICAgICAgKiAgICAgICAgcGFyYW1ldGVyIHRvIHRoZSBkZXNpcmVkIHRodW1ibmFpbCB3aWR0aCwgYW5kIHRoZSB7QGNvZGUgeX0gbWVtYmVyIHRvCisgICAgICAgICAqICAgICAgICB0aGUgZGVzaXJlZCBoZWlnaHQuCisgICAgICAgICAqIEBwYXJhbSB0aHVtYm5haWxUb3VjaFBvaW50IFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgc2V0IHRoaXMgcG9pbnQgdG8gYmUgdGhlCisgICAgICAgICAqICAgICAgICBsb2NhdGlvbiB3aXRoaW4gdGhlIHRodW1ibmFpbCB0aGF0IHNob3VsZCB0cmFjayBkaXJlY3RseSB1bmRlcm5lYXRoCisgICAgICAgICAqICAgICAgICB0aGUgdG91Y2ggcG9pbnQgb24gdGhlIHNjcmVlbiBkdXJpbmcgYSBkcmFnLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlVGh1bWJuYWlsTWV0cmljcyhQb2ludCB0aHVtYm5haWxTaXplLCBQb2ludCB0aHVtYm5haWxUb3VjaFBvaW50KSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBtVmlldy5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHVtYm5haWxTaXplLnNldCh2aWV3LmdldFdpZHRoKCksIHZpZXcuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgIHRodW1ibmFpbFRvdWNoUG9pbnQuc2V0KHRodW1ibmFpbFNpemUueCAvIDIsIHRodW1ibmFpbFNpemUueSAvIDIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cuZShWaWV3LlZJRVdfTE9HX1RBRywgIkFza2VkIGZvciBkcmFnIHRodW1iIG1ldHJpY3MgYnV0IG5vIHZpZXciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEcmF3IHRoZSB0aHVtYm5haWwgaW1hZ2UgZm9yIHRoZSB1cGNvbWluZyBkcmFnLiAgVGhlIHRodW1ibmFpbCBjYW52YXMgd2FzCisgICAgICAgICAqIGNyZWF0ZWQgd2l0aCB0aGUgZGltZW5zaW9ucyBzdXBwbGllZCBieSB0aGUgb25Qcm92aWRlVGh1bWJuYWlsTWV0cmljcygpCisgICAgICAgICAqIGNhbGxiYWNrLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2FudmFzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkRyYXdUaHVtYm5haWwoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gbVZpZXcuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmlldy5kcmF3KGNhbnZhcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExvZy5lKFZpZXcuVklFV19MT0dfVEFHLCAiQXNrZWQgdG8gZHJhdyBkcmFnIHRodW1iIGJ1dCBubyB2aWV3Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEcmFnIGFuZCBkcm9wLiAgQXBwIGNhbGxzIHN0YXJ0RHJhZygpLCB0aGVuIGNhbGxiYWNrcyB0byBvbk1lYXN1cmVEcmFnVGh1bWJuYWlsKCkKKyAgICAgKiBhbmQgb25EcmF3RHJhZ1RodW1ibmFpbCgpIGhhcHBlbiwgdGhlbiB0aGUgZHJhZyBvcGVyYXRpb24gaXMgaGFuZGVkIG92ZXIgdG8gdGhlCisgICAgICogT1MuCisgICAgICogISEhIFRPRE86IHJlYWwgZG9jcworICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc3RhcnREcmFnKENsaXBEYXRhIGRhdGEsIERyYWdUaHVtYm5haWxCdWlsZGVyIHRodW1iQnVpbGRlciwKKyAgICAgICAgICAgIGJvb2xlYW4gbXlXaW5kb3dPbmx5KSB7CisgICAgICAgIGlmIChWaWV3RGVidWcuREVCVUdfRFJBRykgeworICAgICAgICAgICAgTG9nLmQoVklFV19MT0dfVEFHLCAic3RhcnREcmFnOiBkYXRhPSIgKyBkYXRhICsgIiBsb2NhbD0iICsgbXlXaW5kb3dPbmx5KTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIG9rYXkgPSBmYWxzZTsKKworICAgICAgICBQb2ludCB0aHVtYlNpemUgPSBuZXcgUG9pbnQoKTsKKyAgICAgICAgUG9pbnQgdGh1bWJUb3VjaFBvaW50ID0gbmV3IFBvaW50KCk7CisgICAgICAgIHRodW1iQnVpbGRlci5vblByb3ZpZGVUaHVtYm5haWxNZXRyaWNzKHRodW1iU2l6ZSwgdGh1bWJUb3VjaFBvaW50KTsKKworICAgICAgICBpZiAoKHRodW1iU2l6ZS54IDwgMCkgfHwgKHRodW1iU2l6ZS55IDwgMCkgfHwKKyAgICAgICAgICAgICAgICAodGh1bWJUb3VjaFBvaW50LnggPCAwKSB8fCAodGh1bWJUb3VjaFBvaW50LnkgPCAwKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRHJhZyB0aHVtYiBkaW1lbnNpb25zIG11c3Qgbm90IGJlIG5lZ2F0aXZlIik7CisgICAgICAgIH0KKworICAgICAgICBTdXJmYWNlIHN1cmZhY2UgPSBuZXcgU3VyZmFjZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSUJpbmRlciB0b2tlbiA9IG1BdHRhY2hJbmZvLm1TZXNzaW9uLnByZXBhcmVEcmFnKG1BdHRhY2hJbmZvLm1XaW5kb3csCisgICAgICAgICAgICAgICAgICAgIG15V2luZG93T25seSwgbVRodW1ibmFpbFdpZHRoLCBtVGh1bWJuYWlsSGVpZ2h0LCBzdXJmYWNlKTsKKyAgICAgICAgICAgIGlmIChWaWV3RGVidWcuREVCVUdfRFJBRykgTG9nLmQoVklFV19MT0dfVEFHLCAicHJlcGFyZURyYWcgcmV0dXJuZWQgdG9rZW49IiArIHRva2VuCisgICAgICAgICAgICAgICAgICAgICsgIiBzdXJmYWNlPSIgKyBzdXJmYWNlKTsKKyAgICAgICAgICAgIGlmICh0b2tlbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ2FudmFzIGNhbnZhcyA9IHN1cmZhY2UubG9ja0NhbnZhcyhudWxsKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0aHVtYkJ1aWxkZXIub25EcmF3VGh1bWJuYWlsKGNhbnZhcyk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgc3VyZmFjZS51bmxvY2tDYW52YXNBbmRQb3N0KGNhbnZhcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gcmVwdXJwb3NlICd0aHVtYlNpemUnIGZvciB0aGUgbGFzdCB0b3VjaCBwb2ludAorICAgICAgICAgICAgICAgIGdldFZpZXdSb290KCkuZ2V0TGFzdFRvdWNoUG9pbnQodGh1bWJTaXplKTsKKworICAgICAgICAgICAgICAgIG9rYXkgPSBtQXR0YWNoSW5mby5tU2Vzc2lvbi5wZXJmb3JtRHJhZyhtQXR0YWNoSW5mby5tV2luZG93LCB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkgdGh1bWJTaXplLngsIChmbG9hdCkgdGh1bWJTaXplLnksCisgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpIHRodW1iVG91Y2hQb2ludC54LCAoZmxvYXQpIHRodW1iVG91Y2hQb2ludC55LCBkYXRhKTsKKyAgICAgICAgICAgICAgICBpZiAoVmlld0RlYnVnLkRFQlVHX0RSQUcpIExvZy5kKFZJRVdfTE9HX1RBRywgInBlcmZvcm1EcmFnIHJldHVybmVkICIgKyBva2F5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFZJRVdfTE9HX1RBRywgIlVuYWJsZSB0byBpbml0aWF0ZSBkcmFnIiwgZSk7CisgICAgICAgICAgICBzdXJmYWNlLmRlc3Ryb3koKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBva2F5OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBtZWFzdXJlVGh1bWJuYWlsKCkgeworICAgICAgICBtUHJpdmF0ZUZsYWdzICY9IH5NRUFTVVJFRF9ESU1FTlNJT05fU0VUOworCisgICAgICAgIG9uTWVhc3VyZURyYWdUaHVtYm5haWwoKTsKKworICAgICAgICAvLyBmbGFnIG5vdCBzZXQsIHNldERyYWdUaHVtYm5haWxEaW1lbnNpb24oKSB3YXMgbm90IGludm9rZWQsIHdlIHJhaXNlCisgICAgICAgIC8vIGFuIGV4Y2VwdGlvbiB0byB3YXJuIHRoZSBkZXZlbG9wZXIKKyAgICAgICAgaWYgKChtUHJpdmF0ZUZsYWdzICYgTUVBU1VSRURfRElNRU5TSU9OX1NFVCkgIT0gTUVBU1VSRURfRElNRU5TSU9OX1NFVCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigib25NZWFzdXJlRHJhZ1RodW1ibmFpbCgpIGRpZCBub3Qgc2V0IHRoZSIKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1lYXN1cmVkIGRpbWVuc2lvbiBieSBjYWxsaW5nIHNldERyYWdUaHVtYm5haWxEaW1lbnNpb24oKSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFZpZXdEZWJ1Zy5ERUJVR19EUkFHKSB7CisgICAgICAgICAgICBMb2cuZChWSUVXX0xPR19UQUcsICJEcmFnIHRodW1iIG1lYXN1cmVkOiB3PSIgKyBtVGh1bWJuYWlsV2lkdGgKKyAgICAgICAgICAgICAgICAgICAgKyAiIGg9IiArIG1UaHVtYm5haWxIZWlnaHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIFZpZXcgbXVzdCBjYWxsIHRoaXMgbWV0aG9kIGZyb20gb25NZWFzdXJlRHJhZ1RodW1ibmFpbCgpIGluIG9yZGVyIHRvCisgICAgICogc3BlY2lmeSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZHJhZyB0aHVtYm5haWwgaW1hZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2lkdGggVGhlIGRlc2lyZWQgdGh1bWJuYWlsIHdpZHRoLgorICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGRlc2lyZWQgdGh1bWJuYWlsIGhlaWdodC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXREcmFnVGh1bWJuYWlsRGltZW5zaW9uKGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IE1FQVNVUkVEX0RJTUVOU0lPTl9TRVQ7CisgICAgICAgIG1UaHVtYm5haWxXaWR0aCA9IHdpZHRoOworICAgICAgICBtVGh1bWJuYWlsSGVpZ2h0ID0gaGVpZ2h0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNwZWNpZmllcyBhIGRyYWcgdGh1bWJuYWlsIHRoYXQgbWF0Y2hlcyB0aGUKKyAgICAgKiBWaWV3J3MgY3VycmVudCBzaXplIGFuZCBhcHBlYXJhbmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZURyYWdUaHVtYm5haWwoKSB7CisgICAgICAgIHNldERyYWdUaHVtYm5haWxEaW1lbnNpb24oZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QgZHJhd3MgdGhlIGN1cnJlbnQgVmlldyBhcHBlYXJhbmNlIGFzIHRoZSB0aHVtYm5haWwKKyAgICAgKiBAcGFyYW0gY2FudmFzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3RHJhZ1RodW1ibmFpbChDYW52YXMgY2FudmFzKSB7CisgICAgICAgIGRyYXcoY2FudmFzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEcmFnLWFuZC1kcm9wIGV2ZW50IGRpc3BhdGNoLiAgVGhlIGV2ZW50LmdldEFjdGlvbigpIHZlcmIgaXMgb25lIG9mIHRoZSBEcmFnRXZlbnQKKyAgICAgKiBjb25zdGFudHMgRFJBR19TVEFSVEVEX0VWRU5ULCBEUkFHX0VWRU5ULCBEUk9QX0VWRU5ULCBhbmQgRFJBR19FTkRFRF9FVkVOVC4KKyAgICAgKgorICAgICAqIEZvciBEUkFHX1NUQVJURURfRVZFTlQsIGV2ZW50LmdldENsaXBEZXNjcmlwdGlvbigpIGRlc2NyaWJlcyB0aGUgY29udGVudAorICAgICAqIGJlaW5nIGRyYWdnZWQuICBvbkRyYWdFdmVudCgpIHNob3VsZCByZXR1cm4gJ3RydWUnIGlmIHRoZSB2aWV3IGNhbiBoYW5kbGUKKyAgICAgKiBhIGRyb3Agb2YgdGhhdCBjb250ZW50LiAgQSB2aWV3IHRoYXQgcmV0dXJucyAnZmFsc2UnIGhlcmUgd2lsbCByZWNlaXZlIG5vCisgICAgICogZnVydGhlciBjYWxscyB0byBvbkRyYWdFdmVudCgpIGFib3V0IHRoZSBkcmFnL2Ryb3Agb3BlcmF0aW9uLgorICAgICAqCisgICAgICogRm9yIERSQUdfRU5URVJFRCwgZXZlbnQuZ2V0Q2xpcERlc2NyaXB0aW9uKCkgZGVzY3JpYmVzIHRoZSBjb250ZW50IGJlaW5nCisgICAgICogZHJhZ2dlZC4gIFRoaXMgd2lsbCBiZSB0aGUgc2FtZSBjb250ZW50IGRlc2NyaXB0aW9uIHBhc3NlZCBpbiB0aGUKKyAgICAgKiBEUkFHX1NUQVJURURfRVZFTlQgaW52b2NhdGlvbi4KKyAgICAgKgorICAgICAqIEZvciBEUkFHX0VYSVRFRCwgZXZlbnQuZ2V0Q2xpcERlc2NyaXB0aW9uKCkgZGVzY3JpYmVzIHRoZSBjb250ZW50IGJlaW5nCisgICAgICogZHJhZ2dlZC4gIFRoaXMgd2lsbCBiZSB0aGUgc2FtZSBjb250ZW50IGRlc2NyaXB0aW9uIHBhc3NlZCBpbiB0aGUKKyAgICAgKiBEUkFHX1NUQVJURURfRVZFTlQgaW52b2NhdGlvbi4gIFRoZSB2aWV3IHNob3VsZCByZXR1cm4gdG8gaXRzIGFwcHJvcmlhdGUKKyAgICAgKiBkcmFnLWFjY2VwdGFuY2UgdmlzdWFsIHN0YXRlLgorICAgICAqCisgICAgICogRm9yIERSQUdfTE9DQVRJT05fRVZFTlQsIGV2ZW50LmdldFgoKSBhbmQgZXZlbnQuZ2V0WSgpIGdpdmUgdGhlIGxvY2F0aW9uIGluIFZpZXcKKyAgICAgKiBjb29yZGluYXRlcyBvZiB0aGUgY3VycmVudCBkcmFnIHBvaW50LiAgVGhlIHZpZXcgbXVzdCByZXR1cm4gJ3RydWUnIGlmIGl0CisgICAgICogY2FuIGFjY2VwdCBhIGRyb3Agb2YgdGhlIGN1cnJlbnQgZHJhZyBjb250ZW50LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBGb3IgRFJPUF9FVkVOVCwgZXZlbnQuZ2V0WCgpIGFuZCBldmVudC5nZXRZKCkgZ2l2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIGRyb3AKKyAgICAgKiB3aXRoaW4gdGhlIHZpZXc7IGFsc28sIGV2ZW50LmdldENsaXBEYXRhKCkgcmV0dXJucyB0aGUgZnVsbCBkYXRhIHBheWxvYWQKKyAgICAgKiBiZWluZyBkcm9wcGVkLiAgVGhlIHZpZXcgc2hvdWxkIHJldHVybiAndHJ1ZScgaWYgaXQgY29uc3VtZWQgdGhlIGRyb3BwZWQKKyAgICAgKiBjb250ZW50LCAnZmFsc2UnIGlmIGl0IGRpZCBub3QuCisgICAgICoKKyAgICAgKiBGb3IgRFJBR19FTkRFRF9FVkVOVCwgdGhlICdldmVudCcgYXJndW1lbnQgbWF5IGJlIG51bGwuICBUaGUgdmlldyBzaG91bGQgcmV0dXJuCisgICAgICogdG8gaXRzIG5vcm1hbCB2aXN1YWwgc3RhdGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gb25EcmFnRXZlbnQoRHJhZ0V2ZW50IGV2ZW50KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaWV3cyB0eXBpY2FsbHkgZG9uJ3QgbmVlZCB0byBvdmVycmlkZSBkaXNwYXRjaERyYWdFdmVudCgpOyBpdCBqdXN0IGNhbGxzCisgICAgICogb25EcmFnRXZlbnQod2hhdCwgZXZlbnQpIGFuZCBwYXNzZXMgdGhlIHJlc3VsdCB1cCBhcHByb3ByaWF0ZWx5LgorICAgICAqCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hEcmFnRXZlbnQoRHJhZ0V2ZW50IGV2ZW50KSB7CisgICAgICAgIHJldHVybiBvbkRyYWdFdmVudChldmVudCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NzY4LDMxICsxMDEwOCw2IEBACiAgICAgICAgICAgICAgICAgVmlld0NvbmZpZ3VyYXRpb24uZ2V0TG9uZ1ByZXNzVGltZW91dCgpIC0gZGVsYXlPZmZzZXQpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGludFtdIHN0YXRlU2V0VW5pb24oZmluYWwgaW50W10gc3RhdGVTZXQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50W10gc3RhdGVTZXQyKSB7Ci0gICAgICAgIGZpbmFsIGludCBzdGF0ZVNldDFMZW5ndGggPSBzdGF0ZVNldDEubGVuZ3RoOwotICAgICAgICBmaW5hbCBpbnQgc3RhdGVTZXQyTGVuZ3RoID0gc3RhdGVTZXQyLmxlbmd0aDsKLSAgICAgICAgZmluYWwgaW50W10gbmV3U2V0ID0gbmV3IGludFtzdGF0ZVNldDFMZW5ndGggKyBzdGF0ZVNldDJMZW5ndGhdOwotICAgICAgICBpbnQgayA9IDA7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICAvLyBUaGlzIGlzIGEgbWVyZ2Ugb2YgdGhlIHR3byBpbnB1dCBzdGF0ZSBzZXRzIGFuZCBhc3N1bWVzIHRoYXQgdGhlCi0gICAgICAgIC8vIGlucHV0IHNldHMgYXJlIHNvcnRlZCBieSB0aGUgb3JkZXIgaW1wb3NlZCBieSBWaWV3RHJhd2FibGVTdGF0ZXMuCi0gICAgICAgIGZvciAoaW50IHZpZXdTdGF0ZSA6IFIuc3R5bGVhYmxlLlZpZXdEcmF3YWJsZVN0YXRlcykgewotICAgICAgICAgICAgaWYgKGkgPCBzdGF0ZVNldDFMZW5ndGggJiYgc3RhdGVTZXQxW2ldID09IHZpZXdTdGF0ZSkgewotICAgICAgICAgICAgICAgIG5ld1NldFtrKytdID0gdmlld1N0YXRlOwotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaiA8IHN0YXRlU2V0Mkxlbmd0aCAmJiBzdGF0ZVNldDJbal0gPT0gdmlld1N0YXRlKSB7Ci0gICAgICAgICAgICAgICAgbmV3U2V0W2srK10gPSB2aWV3U3RhdGU7Ci0gICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGsgPiAxKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KG5ld1NldFtrIC0gMV0gPiBuZXdTZXRbayAtIDJdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3U2V0OwotICAgIH0KLQogICAgIC8qKgogICAgICAqIEluZmxhdGUgYSB2aWV3IGZyb20gYW4gWE1MIHJlc291cmNlLiAgVGhpcyBjb252ZW5pZW5jZSBtZXRob2Qgd3JhcHMgdGhlIHtAbGluawogICAgICAqIExheW91dEluZmxhdGVyfSBjbGFzcywgd2hpY2ggcHJvdmlkZXMgYSBmdWxsIHJhbmdlIG9mIG9wdGlvbnMgZm9yIHZpZXcgaW5mbGF0aW9uLgpAQCAtODgwOSwxMjggKzEwMTI0LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTY3JvbGwgdGhlIHZpZXcgd2l0aCBzdGFuZGFyZCBiZWhhdmlvciBmb3Igc2Nyb2xsaW5nIGJleW9uZCB0aGUgbm9ybWFsCi0gICAgICogY29udGVudCBib3VuZGFyaWVzLiBWaWV3cyB0aGF0IGNhbGwgdGhpcyBtZXRob2Qgc2hvdWxkIG92ZXJyaWRlCi0gICAgICoge0BsaW5rICNvbk92ZXJzY3JvbGxlZChpbnQsIGludCwgYm9vbGVhbiwgYm9vbGVhbil9IHRvIHJlc3BvbmQgdG8gdGhlCi0gICAgICogcmVzdWx0cyBvZiBhbiBvdmVyc2Nyb2xsIG9wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIFZpZXdzIGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gaGFuZGxlIGFueSB0b3VjaCBvciBmbGluZy1iYXNlZCBzY3JvbGxpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVsdGFYIENoYW5nZSBpbiBYIGluIHBpeGVscwotICAgICAqIEBwYXJhbSBkZWx0YVkgQ2hhbmdlIGluIFkgaW4gcGl4ZWxzCi0gICAgICogQHBhcmFtIHNjcm9sbFggQ3VycmVudCBYIHNjcm9sbCB2YWx1ZSBpbiBwaXhlbHMgYmVmb3JlIGFwcGx5aW5nIGRlbHRhWAotICAgICAqIEBwYXJhbSBzY3JvbGxZIEN1cnJlbnQgWSBzY3JvbGwgdmFsdWUgaW4gcGl4ZWxzIGJlZm9yZSBhcHBseWluZyBkZWx0YVkKLSAgICAgKiBAcGFyYW0gc2Nyb2xsUmFuZ2VYIE1heGltdW0gY29udGVudCBzY3JvbGwgcmFuZ2UgYWxvbmcgdGhlIFggYXhpcwotICAgICAqIEBwYXJhbSBzY3JvbGxSYW5nZVkgTWF4aW11bSBjb250ZW50IHNjcm9sbCByYW5nZSBhbG9uZyB0aGUgWSBheGlzCi0gICAgICogQHBhcmFtIG1heE92ZXJzY3JvbGxYIE51bWJlciBvZiBwaXhlbHMgdG8gb3ZlcnNjcm9sbCBieSBpbiBlaXRoZXIgZGlyZWN0aW9uCi0gICAgICogICAgICAgICAgYWxvbmcgdGhlIFggYXhpcy4KLSAgICAgKiBAcGFyYW0gbWF4T3ZlcnNjcm9sbFkgTnVtYmVyIG9mIHBpeGVscyB0byBvdmVyc2Nyb2xsIGJ5IGluIGVpdGhlciBkaXJlY3Rpb24KLSAgICAgKiAgICAgICAgICBhbG9uZyB0aGUgWSBheGlzLgotICAgICAqIEBwYXJhbSBpc1RvdWNoRXZlbnQgdHJ1ZSBpZiB0aGlzIHNjcm9sbCBvcGVyYXRpb24gaXMgdGhlIHJlc3VsdCBvZiBhIHRvdWNoIGV2ZW50LgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzY3JvbGxpbmcgd2FzIGNsYW1wZWQgdG8gYW4gb3ZlcnNjcm9sbCBib3VuZGFyeSBhbG9uZyBlaXRoZXIKLSAgICAgKiAgICAgICAgICBheGlzLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gb3ZlcnNjcm9sbEJ5KGludCBkZWx0YVgsIGludCBkZWx0YVksCi0gICAgICAgICAgICBpbnQgc2Nyb2xsWCwgaW50IHNjcm9sbFksCi0gICAgICAgICAgICBpbnQgc2Nyb2xsUmFuZ2VYLCBpbnQgc2Nyb2xsUmFuZ2VZLAotICAgICAgICAgICAgaW50IG1heE92ZXJzY3JvbGxYLCBpbnQgbWF4T3ZlcnNjcm9sbFksCi0gICAgICAgICAgICBib29sZWFuIGlzVG91Y2hFdmVudCkgewotICAgICAgICBmaW5hbCBpbnQgb3ZlcnNjcm9sbE1vZGUgPSBtT3ZlcnNjcm9sbE1vZGU7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gY2FuU2Nyb2xsSG9yaXpvbnRhbCA9Ci0gICAgICAgICAgICAgICAgY29tcHV0ZUhvcml6b250YWxTY3JvbGxSYW5nZSgpID4gY29tcHV0ZUhvcml6b250YWxTY3JvbGxFeHRlbnQoKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBjYW5TY3JvbGxWZXJ0aWNhbCA9Ci0gICAgICAgICAgICAgICAgY29tcHV0ZVZlcnRpY2FsU2Nyb2xsUmFuZ2UoKSA+IGNvbXB1dGVWZXJ0aWNhbFNjcm9sbEV4dGVudCgpOwotICAgICAgICBmaW5hbCBib29sZWFuIG92ZXJzY3JvbGxIb3Jpem9udGFsID0gb3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9BTFdBWVMgfHwKLSAgICAgICAgICAgICAgICAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMgJiYgY2FuU2Nyb2xsSG9yaXpvbnRhbCk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gb3ZlcnNjcm9sbFZlcnRpY2FsID0gb3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9BTFdBWVMgfHwKLSAgICAgICAgICAgICAgICAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMgJiYgY2FuU2Nyb2xsVmVydGljYWwpOwotCi0gICAgICAgIGludCBuZXdTY3JvbGxYID0gc2Nyb2xsWCArIGRlbHRhWDsKLSAgICAgICAgaWYgKCFvdmVyc2Nyb2xsSG9yaXpvbnRhbCkgewotICAgICAgICAgICAgbWF4T3ZlcnNjcm9sbFggPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG5ld1Njcm9sbFkgPSBzY3JvbGxZICsgZGVsdGFZOwotICAgICAgICBpZiAoIW92ZXJzY3JvbGxWZXJ0aWNhbCkgewotICAgICAgICAgICAgbWF4T3ZlcnNjcm9sbFkgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2xhbXAgdmFsdWVzIGlmIGF0IHRoZSBsaW1pdHMgYW5kIHJlY29yZAotICAgICAgICBmaW5hbCBpbnQgbGVmdCA9IC1tYXhPdmVyc2Nyb2xsWDsKLSAgICAgICAgZmluYWwgaW50IHJpZ2h0ID0gbWF4T3ZlcnNjcm9sbFggKyBzY3JvbGxSYW5nZVg7Ci0gICAgICAgIGZpbmFsIGludCB0b3AgPSAtbWF4T3ZlcnNjcm9sbFk7Ci0gICAgICAgIGZpbmFsIGludCBib3R0b20gPSBtYXhPdmVyc2Nyb2xsWSArIHNjcm9sbFJhbmdlWTsKLQotICAgICAgICBib29sZWFuIGNsYW1wZWRYID0gZmFsc2U7Ci0gICAgICAgIGlmIChuZXdTY3JvbGxYID4gcmlnaHQpIHsKLSAgICAgICAgICAgIG5ld1Njcm9sbFggPSByaWdodDsKLSAgICAgICAgICAgIGNsYW1wZWRYID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChuZXdTY3JvbGxYIDwgbGVmdCkgewotICAgICAgICAgICAgbmV3U2Nyb2xsWCA9IGxlZnQ7Ci0gICAgICAgICAgICBjbGFtcGVkWCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGNsYW1wZWRZID0gZmFsc2U7Ci0gICAgICAgIGlmIChuZXdTY3JvbGxZID4gYm90dG9tKSB7Ci0gICAgICAgICAgICBuZXdTY3JvbGxZID0gYm90dG9tOwotICAgICAgICAgICAgY2xhbXBlZFkgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKG5ld1Njcm9sbFkgPCB0b3ApIHsKLSAgICAgICAgICAgIG5ld1Njcm9sbFkgPSB0b3A7Ci0gICAgICAgICAgICBjbGFtcGVkWSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBvbk92ZXJzY3JvbGxlZChuZXdTY3JvbGxYLCBuZXdTY3JvbGxZLCBjbGFtcGVkWCwgY2xhbXBlZFkpOwotCi0gICAgICAgIHJldHVybiBjbGFtcGVkWCB8fCBjbGFtcGVkWTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkge0BsaW5rICNvdmVyc2Nyb2xsQnkoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGJvb2xlYW4pfSB0bwotICAgICAqIHJlc3BvbmQgdG8gdGhlIHJlc3VsdHMgb2YgYW4gb3ZlcnNjcm9sbCBvcGVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2Nyb2xsWCBOZXcgWCBzY3JvbGwgdmFsdWUgaW4gcGl4ZWxzCi0gICAgICogQHBhcmFtIHNjcm9sbFkgTmV3IFkgc2Nyb2xsIHZhbHVlIGluIHBpeGVscwotICAgICAqIEBwYXJhbSBjbGFtcGVkWCBUcnVlIGlmIHNjcm9sbFggd2FzIGNsYW1wZWQgdG8gYW4gb3ZlcnNjcm9sbCBib3VuZGFyeQotICAgICAqIEBwYXJhbSBjbGFtcGVkWSBUcnVlIGlmIHNjcm9sbFkgd2FzIGNsYW1wZWQgdG8gYW4gb3ZlcnNjcm9sbCBib3VuZGFyeQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG9uT3ZlcnNjcm9sbGVkKGludCBzY3JvbGxYLCBpbnQgc2Nyb2xsWSwKLSAgICAgICAgICAgIGJvb2xlYW4gY2xhbXBlZFgsIGJvb2xlYW4gY2xhbXBlZFkpIHsKLSAgICAgICAgLy8gSW50ZW50aW9uYWxseSBlbXB0eS4KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvdmVyc2Nyb2xsIG1vZGUgZm9yIHRoaXMgdmlldy4gVGhlIHJlc3VsdCB3aWxsIGJlCi0gICAgICogb25lIG9mIHtAbGluayAjT1ZFUlNDUk9MTF9BTFdBWVN9IChkZWZhdWx0KSwge0BsaW5rICNPVkVSU0NST0xMX0lGX0NPTlRFTlRfU0NST0xMU30KLSAgICAgKiAoYWxsb3cgb3ZlcnNjcm9sbGluZyBvbmx5IGlmIHRoZSB2aWV3IGNvbnRlbnQgaXMgbGFyZ2VyIHRoYW4gdGhlIGNvbnRhaW5lciksCi0gICAgICogb3Ige0BsaW5rICNPVkVSU0NST0xMX05FVkVSfS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhpcyB2aWV3J3Mgb3ZlcnNjcm9sbCBtb2RlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0T3ZlcnNjcm9sbE1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBtT3ZlcnNjcm9sbE1vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBvdmVyc2Nyb2xsIG1vZGUgZm9yIHRoaXMgdmlldy4gVmFsaWQgb3ZlcnNjcm9sbCBtb2RlcyBhcmUKLSAgICAgKiB7QGxpbmsgI09WRVJTQ1JPTExfQUxXQVlTfSAoZGVmYXVsdCksIHtAbGluayAjT1ZFUlNDUk9MTF9JRl9DT05URU5UX1NDUk9MTFN9Ci0gICAgICogKGFsbG93IG92ZXJzY3JvbGxpbmcgb25seSBpZiB0aGUgdmlldyBjb250ZW50IGlzIGxhcmdlciB0aGFuIHRoZSBjb250YWluZXIpLAotICAgICAqIG9yIHtAbGluayAjT1ZFUlNDUk9MTF9ORVZFUn0uCi0gICAgICoKLSAgICAgKiBTZXR0aW5nIHRoZSBvdmVyc2Nyb2xsIG1vZGUgb2YgYSB2aWV3IHdpbGwgaGF2ZSBhbiBlZmZlY3Qgb25seSBpZiB0aGUKLSAgICAgKiB2aWV3IGlzIGNhcGFibGUgb2Ygc2Nyb2xsaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIG92ZXJzY3JvbGxNb2RlIFRoZSBuZXcgb3ZlcnNjcm9sbCBtb2RlIGZvciB0aGlzIHZpZXcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlcnNjcm9sbE1vZGUoaW50IG92ZXJzY3JvbGxNb2RlKSB7Ci0gICAgICAgIGlmIChvdmVyc2Nyb2xsTW9kZSAhPSBPVkVSU0NST0xMX0FMV0FZUyAmJgotICAgICAgICAgICAgICAgIG92ZXJzY3JvbGxNb2RlICE9IE9WRVJTQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTICYmCi0gICAgICAgICAgICAgICAgb3ZlcnNjcm9sbE1vZGUgIT0gT1ZFUlNDUk9MTF9ORVZFUikgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBvdmVyc2Nyb2xsIG1vZGUgIiArIG92ZXJzY3JvbGxNb2RlKTsKLSAgICAgICAgfQotICAgICAgICBtT3ZlcnNjcm9sbE1vZGUgPSBvdmVyc2Nyb2xsTW9kZTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBBIE1lYXN1cmVTcGVjIGVuY2Fwc3VsYXRlcyB0aGUgbGF5b3V0IHJlcXVpcmVtZW50cyBwYXNzZWQgZnJvbSBwYXJlbnQgdG8gY2hpbGQuCiAgICAgICogRWFjaCBNZWFzdXJlU3BlYyByZXByZXNlbnRzIGEgcmVxdWlyZW1lbnQgZm9yIGVpdGhlciB0aGUgd2lkdGggb3IgdGhlIGhlaWdodC4KICAgICAgKiBBIE1lYXN1cmVTcGVjIGlzIGNvbXByaXNlZCBvZiBhIHNpemUgYW5kIGEgbW9kZS4gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlCkBAIC05Mjk1LDYgKzEwNDg4LDkgQEAKICAgICAgICAgSUJpbmRlciBtUGFuZWxQYXJlbnRXaW5kb3dUb2tlbjsKICAgICAgICAgU3VyZmFjZSBtU3VyZmFjZTsKIAorICAgICAgICBib29sZWFuIG1IYXJkd2FyZUFjY2VsZXJhdGVkOworICAgICAgICBIYXJkd2FyZVJlbmRlcmVyIG1IYXJkd2FyZVJlbmRlcmVyOworICAgICAgICAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFNjYWxlIGZhY3RvciB1c2VkIGJ5IHRoZSBjb21wYXRpYmlsaXR5IG1vZGUKICAgICAgICAgICovCkBAIC05NDEyLDYgKzEwNjA4LDEzIEBACiAgICAgICAgICAqLwogICAgICAgICBmaW5hbCBpbnRbXSBtSW52YWxpZGF0ZUNoaWxkTG9jYXRpb24gPSBuZXcgaW50WzJdOwogCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdsb2JhbCB0byB0aGUgdmlldyBoaWVyYXJjaHkgdXNlZCBhcyBhIHRlbXBvcmFyeSBmb3IgZGVhbGluZyB3aXRoCisgICAgICAgICAqIHgveSBsb2NhdGlvbiB3aGVuIHZpZXcgaXMgdHJhbnNmb3JtZWQuCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBmbG9hdFtdIG1UbXBUcmFuc2Zvcm1Mb2NhdGlvbiA9IG5ldyBmbG9hdFsyXTsKKwogICAgICAgICAvKioKICAgICAgICAgICogVGhlIHZpZXcgdHJlZSBvYnNlcnZlciB1c2VkIHRvIGRpc3BhdGNoIGdsb2JhbCBldmVudHMgbGlrZQogICAgICAgICAgKiBsYXlvdXQsIHByZS1kcmF3LCB0b3VjaCBtb2RlIGNoYW5nZSwgZXRjLgpAQCAtOTQ0OCw2ICsxMDY1MSwxMSBAQAogICAgICAgICBmaW5hbCBSZWN0IG1UbXBJbnZhbFJlY3QgPSBuZXcgUmVjdCgpOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBUZW1wb3JhcnkgZm9yIHVzZSBpbiBjb21wdXRpbmcgaGl0IGFyZWFzIHdpdGggdHJhbnNmb3JtZWQgdmlld3MKKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIFJlY3RGIG1UbXBUcmFuc2Zvcm1SZWN0ID0gbmV3IFJlY3RGKCk7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFRlbXBvcmFyeSBsaXN0IGZvciB1c2UgaW4gY29sbGVjdGluZyBmb2N1c2FibGUgZGVzY2VuZGVudHMgb2YgYSB2aWV3LgogICAgICAgICAgKi8KICAgICAgICAgZmluYWwgQXJyYXlMaXN0PFZpZXc+IG1Gb2N1c2FibGVzVGVtcExpc3QgPSBuZXcgQXJyYXlMaXN0PFZpZXc+KDI0KTsKQEAgLTk1MDcsOCArMTA3MTUsOCBAQAogCiAgICAgICAgIHB1YmxpYyBmaW5hbCBJbnRlcnBvbGF0b3Igc2Nyb2xsQmFySW50ZXJwb2xhdG9yID0gbmV3IEludGVycG9sYXRvcigxLCAyKTsKIAotICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0W10gbU9wYXF1ZSA9IHsyNTUuMGZ9OwotICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0W10gbVRyYW5zcGFyZW50ID0gezAuMGZ9OworICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0W10gbU9wYXF1ZSA9IHsgMjU1LjBmIH07CisgICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXRbXSBtVHJhbnNwYXJlbnQgPSB7IDAuMGYgfTsKICAgICAgICAgCiAgICAgICAgIC8qKgogICAgICAgICAgKiBXaGVuIGZhZGluZyBzaG91bGQgc3RhcnQuIFRoaXMgdGltZSBtb3ZlcyBpbnRvIHRoZSBmdXR1cmUgZXZlcnkgdGltZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Q29uZmlndXJhdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Q29uZmlndXJhdGlvbi5qYXZhCmluZGV4IDkyNGM5ZDQuLmFjZGZjMjggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0NvbmZpZ3VyYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdDb25maWd1cmF0aW9uLmphdmEKQEAgLTE0MCwxNiArMTQwLDYgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBTQ1JPTExfRlJJQ1RJT04gPSAwLjAxNWY7CiAKLSAgICAvKioKLSAgICAgKiBNYXggZGlzdGFuY2UgdG8gb3ZlcnNjcm9sbCBmb3IgZWRnZSBlZmZlY3RzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9WRVJTQ1JPTExfRElTVEFOQ0UgPSAwOwotCi0gICAgLyoqCi0gICAgICogTWF4IGRpc3RhbmNlIHRvIG92ZXJmbGluZyBmb3IgZWRnZSBlZmZlY3RzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9WRVJGTElOR19ESVNUQU5DRSA9IDQ7Ci0KICAgICBwcml2YXRlIGZpbmFsIGludCBtRWRnZVNsb3A7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUZhZGluZ0VkZ2VMZW5ndGg7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1pbmltdW1GbGluZ1ZlbG9jaXR5OwpAQCAtMTYwLDggKzE1MCw2IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbURvdWJsZVRhcFNsb3A7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVdpbmRvd1RvdWNoU2xvcDsKICAgICBwcml2YXRlIGZpbmFsIGludCBtTWF4aW11bURyYXdpbmdDYWNoZVNpemU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU92ZXJzY3JvbGxEaXN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtT3ZlcmZsaW5nRGlzdGFuY2U7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTcGFyc2VBcnJheTxWaWV3Q29uZmlndXJhdGlvbj4gc0NvbmZpZ3VyYXRpb25zID0KICAgICAgICAgICAgIG5ldyBTcGFyc2VBcnJheTxWaWV3Q29uZmlndXJhdGlvbj4oMik7CkBAIC0xODIsOCArMTcwLDYgQEAKICAgICAgICAgbVdpbmRvd1RvdWNoU2xvcCA9IFdJTkRPV19UT1VDSF9TTE9QOwogICAgICAgICAvL25vaW5zcGVjdGlvbiBkZXByZWNhdGlvbgogICAgICAgICBtTWF4aW11bURyYXdpbmdDYWNoZVNpemUgPSBNQVhJTVVNX0RSQVdJTkdfQ0FDSEVfU0laRTsKLSAgICAgICAgbU92ZXJzY3JvbGxEaXN0YW5jZSA9IE9WRVJTQ1JPTExfRElTVEFOQ0U7Ci0gICAgICAgIG1PdmVyZmxpbmdEaXN0YW5jZSA9IE9WRVJGTElOR19ESVNUQU5DRTsKICAgICB9CiAKICAgICAvKioKQEAgLTIxMiw5ICsxOTgsNiBAQAogCiAgICAgICAgIC8vIFNpemUgb2YgdGhlIHNjcmVlbiBpbiBieXRlcywgaW4gQVJHQl84ODg4IGZvcm1hdAogICAgICAgICBtTWF4aW11bURyYXdpbmdDYWNoZVNpemUgPSA0ICogbWV0cmljcy53aWR0aFBpeGVscyAqIG1ldHJpY3MuaGVpZ2h0UGl4ZWxzOwotCi0gICAgICAgIG1PdmVyc2Nyb2xsRGlzdGFuY2UgPSAoaW50KSAoZGVuc2l0eSAqIE9WRVJTQ1JPTExfRElTVEFOQ0UgKyAwLjVmKTsKLSAgICAgICAgbU92ZXJmbGluZ0Rpc3RhbmNlID0gKGludCkgKGRlbnNpdHkgKiBPVkVSRkxJTkdfRElTVEFOQ0UgKyAwLjVmKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ3MiwyMCArNDU1LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBtYXhpbXVtIGRpc3RhbmNlIGEgVmlldyBzaG91bGQgb3ZlcnNjcm9sbCBieSB3aGVuIHNob3dpbmcgZWRnZSBlZmZlY3RzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U2NhbGVkT3ZlcnNjcm9sbERpc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbU92ZXJzY3JvbGxEaXN0YW5jZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBtYXhpbXVtIGRpc3RhbmNlIGEgVmlldyBzaG91bGQgb3ZlcmZsaW5nIGJ5IHdoZW4gc2hvd2luZyBlZGdlIGVmZmVjdHMuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTY2FsZWRPdmVyZmxpbmdEaXN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1PdmVyZmxpbmdEaXN0YW5jZTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBUaGUgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgem9vbSBjb250cm9scyBzaG91bGQgYmUKICAgICAgKiBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbiBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzLgogICAgICAqIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3RGVidWcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0RlYnVnLmphdmEKaW5kZXggN2I2OTkxZi4uMTFlNjhjNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3RGVidWcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdEZWJ1Zy5qYXZhCkBAIC0xMTgsMjQgKzExOCwyNyBAQAogICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBARGVidWcuRGVidWdQcm9wZXJ0eQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9maWxlRHJhd2luZyA9IGZhbHNlOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19QUk9GSUxFX0RSQVdJTkcgPSBmYWxzZTsKIAogICAgIC8qKgogICAgICAqIFByb2ZpbGVzIGxheW91dCB0aW1lcyBpbiB0aGUgZXZlbnRzIGxvZy4KICAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgQERlYnVnLkRlYnVnUHJvcGVydHkKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvZmlsZUxheW91dCA9IGZhbHNlOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19QUk9GSUxFX0xBWU9VVCA9IGZhbHNlOwogCiAgICAgLyoqCiAgICAgICogUHJvZmlsZXMgcmVhbCBmcHMgKHRpbWVzIGJldHdlZW4gZHJhd3MpIGFuZCBkaXNwbGF5cyB0aGUgcmVzdWx0LgogICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBARGVidWcuRGVidWdQcm9wZXJ0eQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG93RnBzID0gZmFsc2U7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1NIT1dfRlBTID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBFbmFibGVzIGRldGFpbGVkIGxvZ2dpbmcgb2YgZHJhZy9kcm9wIG9wZXJhdGlvbnMuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfRFJBRyA9IHRydWU7CiAKICAgICAvKioKICAgICAgKiA8cD5FbmFibGVzIG9yIGRpc2FibGVzIHZpZXdzIGNvbnNpc3RlbmN5IGNoZWNrLiBFdmVuIHdoZW4gdGhpcyBwcm9wZXJ0eSBpcyBlbmFibGVkLApAQCAtNDI3LDcgKzQzMCw3IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0Vmlld0luc3RhbmNlQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBWaWV3LnNJbnN0YW5jZUNvdW50OworICAgICAgICByZXR1cm4gRGVidWcuY291bnRJbnN0YW5jZXNPZkNsYXNzKFZpZXcuY2xhc3MpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDM4LDcgKzQ0MSw3IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0Vmlld1Jvb3RJbnN0YW5jZUNvdW50KCkgewotICAgICAgICByZXR1cm4gVmlld1Jvb3QuZ2V0SW5zdGFuY2VDb3VudCgpOworICAgICAgICByZXR1cm4gRGVidWcuY291bnRJbnN0YW5jZXNPZkNsYXNzKFZpZXdSb290LmNsYXNzKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0dyb3VwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdHcm91cC5qYXZhCmluZGV4IGI5ODY0YmEuLjVlYmM5ODEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0dyb3VwLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3R3JvdXAuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQudmlldzsKIAoraW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwpAQCAtMjMsMTUgKzI0LDE1IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludEY7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWdpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CkBAIC02Myw4ICs2NCwxMCBAQAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld0dyb3VwX2Fsd2F5c0RyYXduV2l0aENhY2hlCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3R3JvdXBfYWRkU3RhdGVzRnJvbUNoaWxkcmVuCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3R3JvdXBfZGVzY2VuZGFudEZvY3VzYWJpbGl0eQorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld0dyb3VwX2FuaW1hdGVMYXlvdXRDaGFuZ2VzCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWaWV3R3JvdXAgZXh0ZW5kcyBWaWV3IGltcGxlbWVudHMgVmlld1BhcmVudCwgVmlld01hbmFnZXIgeworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKIAogICAgIC8qKgpAQCAtODYsMTggKzg5LDQ0IEBACiAgICAgLy8gVGhlIHZpZXcgY29udGFpbmVkIHdpdGhpbiB0aGlzIFZpZXdHcm91cCB0aGF0IGhhcyBvciBjb250YWlucyBmb2N1cy4KICAgICBwcml2YXRlIFZpZXcgbUZvY3VzZWQ7CiAKLSAgICAvLyBUaGUgY3VycmVudCB0cmFuc2Zvcm1hdGlvbiB0byBhcHBseSBvbiB0aGUgY2hpbGQgYmVpbmcgZHJhd24KLSAgICBwcml2YXRlIFRyYW5zZm9ybWF0aW9uIG1DaGlsZFRyYW5zZm9ybWF0aW9uOworICAgIC8qKgorICAgICAqIEEgVHJhbnNmb3JtYXRpb24gdXNlZCB3aGVuIGRyYXdpbmcgY2hpbGRyZW4sIHRvCisgICAgICogYXBwbHkgb24gdGhlIGNoaWxkIGJlaW5nIGRyYXduLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgVHJhbnNmb3JtYXRpb24gbUNoaWxkVHJhbnNmb3JtYXRpb24gPSBuZXcgVHJhbnNmb3JtYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gdHJhY2sgdGhlIGN1cnJlbnQgaW52YWxpZGF0aW9uIHJlZ2lvbi4KKyAgICAgKi8KICAgICBwcml2YXRlIFJlY3RGIG1JbnZhbGlkYXRlUmVnaW9uOwogCi0gICAgLy8gVGFyZ2V0IG9mIE1vdGlvbiBldmVudHMKLSAgICBwcml2YXRlIFZpZXcgbU1vdGlvblRhcmdldDsKLSAgICBwcml2YXRlIGZpbmFsIFJlY3QgbVRlbXBSZWN0ID0gbmV3IFJlY3QoKTsKKyAgICAvKioKKyAgICAgKiBBIFRyYW5zZm9ybWF0aW9uIHVzZWQgdG8gY2FsY3VsYXRlIGEgY29ycmVjdAorICAgICAqIGludmFsaWRhdGlvbiBhcmVhIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIGF1dG9zY2FsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBUcmFuc2Zvcm1hdGlvbiBtSW52YWxpZGF0aW9uVHJhbnNmb3JtYXRpb247CisKKyAgICAvLyBWaWV3IGN1cnJlbnRseSB1bmRlciBhbiBvbmdvaW5nIGRyYWcKKyAgICBwcml2YXRlIFZpZXcgbUN1cnJlbnREcmFnVmlldzsKKworICAgIC8vIERvZXMgdGhpcyBncm91cCBoYXZlIGEgY2hpbGQgdGhhdCBjYW4gYWNjZXB0IHRoZSBjdXJyZW50IGRyYWcgcGF5bG9hZD8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUNoaWxkQWNjZXB0c0RyYWc7CisKKyAgICAvLyBVc2VkIGR1cmluZyBkcmFnIGRpc3BhdGNoCisgICAgcHJpdmF0ZSBmaW5hbCBQb2ludEYgbUxvY2FsUG9pbnQgPSBuZXcgUG9pbnRGKCk7CiAKICAgICAvLyBMYXlvdXQgYW5pbWF0aW9uCiAgICAgcHJpdmF0ZSBMYXlvdXRBbmltYXRpb25Db250cm9sbGVyIG1MYXlvdXRBbmltYXRpb25Db250cm9sbGVyOwogICAgIHByaXZhdGUgQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyIG1BbmltYXRpb25MaXN0ZW5lcjsKIAorICAgIC8vIEZpcnN0IHRvdWNoIHRhcmdldCBpbiB0aGUgbGlua2VkIGxpc3Qgb2YgdG91Y2ggdGFyZ2V0cy4KKyAgICBwcml2YXRlIFRvdWNoVGFyZ2V0IG1GaXJzdFRvdWNoVGFyZ2V0OworCisgICAgLy8gVGVtcG9yYXJ5IGFycmF5cyBmb3Igc3BsaXR0aW5nIHBvaW50ZXJzLgorICAgIHByaXZhdGUgaW50W10gbVRtcFBvaW50ZXJJbmRleE1hcDsKKyAgICBwcml2YXRlIGludFtdIG1UbXBQb2ludGVySWRzOworICAgIHByaXZhdGUgTW90aW9uRXZlbnQuUG9pbnRlckNvb3Jkc1tdIG1UbXBQb2ludGVyQ29vcmRzOworCiAgICAgLyoqCiAgICAgICogSW50ZXJuYWwgZmxhZ3MuCiAgICAgICoKQEAgLTIyOCw2ICsyNTcsMTEgQEAKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGTEFHX0RJU0FMTE9XX0lOVEVSQ0VQVCA9IDB4ODAwMDA7CiAKICAgICAvKioKKyAgICAgKiBXaGVuIHNldCwgdGhpcyBWaWV3R3JvdXAgd2lsbCBzcGxpdCBNb3Rpb25FdmVudHMgdG8gbXVsdGlwbGUgY2hpbGQgVmlld3Mgd2hlbiBhcHByb3ByaWF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TUExJVF9NT1RJT05fRVZFTlRTID0gMHgyMDAwMDA7CisKKyAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgd2hpY2ggdHlwZXMgb2YgZHJhd2luZyBjYWNoZXMgYXJlIHRvIGJlIGtlcHQgaW4gbWVtb3J5LgogICAgICAqIFRoaXMgZmllbGQgc2hvdWxkIGJlIG1hZGUgcHJpdmF0ZSwgc28gaXQgaXMgaGlkZGVuIGZyb20gdGhlIFNESy4KICAgICAgKiB7QGhpZGV9CkBAIC0yNzcsNiArMzExLDE4IEBACiAgICAgLy8gVXNlZCB0byBkcmF3IGNhY2hlZCB2aWV3cwogICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUNhY2hlUGFpbnQgPSBuZXcgUGFpbnQoKTsKIAorICAgIC8vIFVzZWQgdG8gYW5pbWF0ZSBhZGQvcmVtb3ZlIGNoYW5nZXMgaW4gbGF5b3V0CisgICAgcHJpdmF0ZSBMYXlvdXRUcmFuc2l0aW9uIG1UcmFuc2l0aW9uOworCisgICAgLy8gVGhlIHNldCBvZiB2aWV3cyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcgdHJhbnNpdGlvbmVkLiBUaGlzIGxpc3QgaXMgdXNlZCB0byB0cmFjayB2aWV3cworICAgIC8vIGJlaW5nIHJlbW92ZWQgdGhhdCBzaG91bGQgbm90IGFjdHVhbGx5IGJlIHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50IHlldCBiZWNhdXNlIHRoZXkgYXJlCisgICAgLy8gYmVpbmcgYW5pbWF0ZWQuCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8Vmlldz4gbVRyYW5zaXRpb25pbmdWaWV3czsKKworICAgIC8vIExpc3Qgb2YgY2hpbGRyZW4gY2hhbmdpbmcgdmlzaWJpbGl0eS4gVGhpcyBpcyB1c2VkIHRvIHBvdGVudGlhbGx5IGtlZXAgcmVuZGVyaW5nCisgICAgLy8gdmlld3MgZHVyaW5nIGEgdHJhbnNpdGlvbiB3aGVuIHRoZXkgb3RoZXJ3aXNlIHdvdWxkIGhhdmUgYmVjb21lIGdvbmUvaW52aXNpYmxlCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8Vmlldz4gbVZpc2liaWxpdHlDaGFuZ2luZ0NoaWxkcmVuOworCiAgICAgcHVibGljIFZpZXdHcm91cChDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCk7CiAgICAgICAgIGluaXRWaWV3R3JvdXAoKTsKQEAgLTM0OCw2ICszOTQsMTUgQEAKICAgICAgICAgICAgICAgICBjYXNlIFIuc3R5bGVhYmxlLlZpZXdHcm91cF9kZXNjZW5kYW50Rm9jdXNhYmlsaXR5OgogICAgICAgICAgICAgICAgICAgICBzZXREZXNjZW5kYW50Rm9jdXNhYmlsaXR5KERFU0NFTkRBTlRfRk9DVVNBQklMSVRZX0ZMQUdTW2EuZ2V0SW50KGF0dHIsIDApXSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUi5zdHlsZWFibGUuVmlld0dyb3VwX3NwbGl0TW90aW9uRXZlbnRzOgorICAgICAgICAgICAgICAgICAgICBzZXRNb3Rpb25FdmVudFNwbGl0dGluZ0VuYWJsZWQoYS5nZXRCb29sZWFuKGF0dHIsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUi5zdHlsZWFibGUuVmlld0dyb3VwX2FuaW1hdGVMYXlvdXRDaGFuZ2VzOgorICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFuaW1hdGVMYXlvdXRDaGFuZ2VzID0gYS5nZXRCb29sZWFuKGF0dHIsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW1hdGVMYXlvdXRDaGFuZ2VzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRMYXlvdXRUcmFuc2l0aW9uKG5ldyBMYXlvdXRUcmFuc2l0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTQ2MSw2ICs1MTYsMTMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQoVmlldyBvcmlnaW5hbFZpZXcsIEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIG1QYXJlbnQgIT0gbnVsbCA/IG1QYXJlbnQuc3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQob3JpZ2luYWxWaWV3LCBjYWxsYmFjaykgOiBudWxsOworICAgIH0KKworICAgIC8qKgogICAgICAqIEZpbmQgdGhlIG5lYXJlc3QgdmlldyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdGlvbiB0aGF0IHdhbnRzIHRvIHRha2UKICAgICAgKiBmb2N1cy4KICAgICAgKgpAQCAtNjk2LDYgKzc1OCwzMiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICogQHBhcmFtIGNoaWxkCisgICAgICogQHBhcmFtIHZpc2liaWxpdHkKKyAgICAgKi8KKyAgICB2b2lkIG9uQ2hpbGRWaXNpYmlsaXR5Q2hhbmdlZChWaWV3IGNoaWxkLCBpbnQgdmlzaWJpbGl0eSkgeworICAgICAgICBpZiAobVRyYW5zaXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHZpc2liaWxpdHkgPT0gVklTSUJMRSkgeworICAgICAgICAgICAgICAgIG1UcmFuc2l0aW9uLnNob3dDaGlsZCh0aGlzLCBjaGlsZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1UcmFuc2l0aW9uLmhpZGVDaGlsZCh0aGlzLCBjaGlsZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmlzaWJpbGl0eSAhPSBWSVNJQkxFKSB7CisgICAgICAgICAgICAgICAgLy8gT25seSB0cmFjayB0aGlzIG9uIGRpc2FwcGVhcmluZyB2aWV3cyAtIGFwcGVhcmluZyB2aWV3cyBhcmUgYWxyZWFkeSB2aXNpYmxlCisgICAgICAgICAgICAgICAgLy8gYW5kIGRvbid0IG5lZWQgc3BlY2lhbCBoYW5kbGluZyBkdXJpbmcgZHJhd0NoaWxkKCkKKyAgICAgICAgICAgICAgICBpZiAobVZpc2liaWxpdHlDaGFuZ2luZ0NoaWxkcmVuID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVZpc2liaWxpdHlDaGFuZ2luZ0NoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxWaWV3PigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVmlzaWJpbGl0eUNoYW5naW5nQ2hpbGRyZW4uYWRkKGNoaWxkKTsKKyAgICAgICAgICAgICAgICBpZiAobVRyYW5zaXRpb25pbmdWaWV3cyAhPSBudWxsICYmIG1UcmFuc2l0aW9uaW5nVmlld3MuY29udGFpbnMoY2hpbGQpKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZERpc2FwcGVhcmluZ1ZpZXcoY2hpbGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKQEAgLTc2Nyw2ICs4NTUsMTI1IEBACiAKICAgICAvKioKICAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICoKKyAgICAgKiAhISEgVE9ETzogd3JpdGUgcmVhbCBkb2NzCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hEcmFnRXZlbnQoRHJhZ0V2ZW50IGV2ZW50KSB7CisgICAgICAgIGJvb2xlYW4gcmV0dmFsID0gZmFsc2U7CisgICAgICAgIGZpbmFsIGZsb2F0IHR4ID0gZXZlbnQubVg7CisgICAgICAgIGZpbmFsIGZsb2F0IHR5ID0gZXZlbnQubVk7CisKKyAgICAgICAgVmlld1Jvb3Qgcm9vdCA9IGdldFZpZXdSb290KCk7CisKKyAgICAgICAgLy8gRGlzcGF0Y2ggZG93biB0aGUgdmlldyBoaWVyYXJjaHkKKyAgICAgICAgc3dpdGNoIChldmVudC5tQWN0aW9uKSB7CisgICAgICAgIGNhc2UgRHJhZ0V2ZW50LkFDVElPTl9EUkFHX1NUQVJURUQ6IHsKKyAgICAgICAgICAgIC8vIGNsZWFyIHN0YXRlIHRvIHJlY2FsY3VsYXRlIHdoaWNoIHZpZXdzIHdlIGRyYWcgb3ZlcgorICAgICAgICAgICAgcm9vdC5zZXREcmFnRm9jdXMoZXZlbnQsIG51bGwpOworCisgICAgICAgICAgICAvLyBOb3cgZGlzcGF0Y2ggZG93biB0byBvdXIgY2hpbGRyZW4sIGNhY2hpbmcgdGhlIHJlc3BvbnNlcworICAgICAgICAgICAgbUNoaWxkQWNjZXB0c0RyYWcgPSBmYWxzZTsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DaGlsZHJlbkNvdW50OworICAgICAgICAgICAgZmluYWwgVmlld1tdIGNoaWxkcmVuID0gbUNoaWxkcmVuOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGNoaWxkcmVuW2ldOworICAgICAgICAgICAgICAgIGlmIChjaGlsZC5nZXRWaXNpYmlsaXR5KCkgPT0gVklTSUJMRSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGhhbmRsZWQgPSBjaGlsZHJlbltpXS5kaXNwYXRjaERyYWdFdmVudChldmVudCk7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW2ldLm1DYW5BY2NlcHREcm9wID0gaGFuZGxlZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DaGlsZEFjY2VwdHNEcmFnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmV0dXJuIEhBTkRMRUQgaWYgb25lIG9mIG91ciBjaGlsZHJlbiBjYW4gYWNjZXB0IHRoZSBkcmFnCisgICAgICAgICAgICBpZiAobUNoaWxkQWNjZXB0c0RyYWcpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgRHJhZ0V2ZW50LkFDVElPTl9EUkFHX0VOREVEOiB7CisgICAgICAgICAgICAvLyBOb3RpZnkgYWxsIG9mIG91ciBjaGlsZHJlbiB0aGF0IHRoZSBkcmFnIGlzIG92ZXIKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DaGlsZHJlbkNvdW50OworICAgICAgICAgICAgZmluYWwgVmlld1tdIGNoaWxkcmVuID0gbUNoaWxkcmVuOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGNoaWxkcmVuW2ldOworICAgICAgICAgICAgICAgIGlmIChjaGlsZC5nZXRWaXNpYmlsaXR5KCkgPT0gVklTSUJMRSkgeworICAgICAgICAgICAgICAgICAgICBjaGlsZC5kaXNwYXRjaERyYWdFdmVudChldmVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gV2UgY29uc2lkZXIgZHJhZy1lbmRlZCB0byBoYXZlIGJlZW4gaGFuZGxlZCBpZiBvbmUgb2Ygb3VyIGNoaWxkcmVuCisgICAgICAgICAgICAvLyBoYWQgb2ZmZXJlZCB0byBoYW5kbGUgdGhlIGRyYWcuCisgICAgICAgICAgICBpZiAobUNoaWxkQWNjZXB0c0RyYWcpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgRHJhZ0V2ZW50LkFDVElPTl9EUkFHX0xPQ0FUSU9OOiB7CisgICAgICAgICAgICAvLyBGaW5kIHRoZSBbcG9zc2libHkgbmV3XSBkcmFnIHRhcmdldAorICAgICAgICAgICAgZmluYWwgVmlldyB0YXJnZXQgPSBmaW5kRnJvbnRtb3N0RHJvcHBhYmxlQ2hpbGRBdChldmVudC5tWCwgZXZlbnQubVksIG1Mb2NhbFBvaW50KTsKKworICAgICAgICAgICAgLy8gSWYgd2UndmUgY2hhbmdlZCBhcHBhcmVudCBkcmFnIHRhcmdldCwgdGVsbCB0aGUgdmlldyByb290IHdoaWNoIHZpZXcKKyAgICAgICAgICAgIC8vIHdlJ3JlIG92ZXIgbm93LiAgVGhpcyB3aWxsIGluIHR1cm4gc2VuZCBvdXQgRFJBR19FTlRFUkVEIC8gRFJBR19FWElURUQKKyAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbnMgYXMgYXBwcm9wcmlhdGUuCisgICAgICAgICAgICBpZiAobUN1cnJlbnREcmFnVmlldyAhPSB0YXJnZXQpIHsKKyAgICAgICAgICAgICAgICByb290LnNldERyYWdGb2N1cyhldmVudCwgdGFyZ2V0KTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudERyYWdWaWV3ID0gdGFyZ2V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgYWN0dWFsIGRyYWcgbG9jYXRpb24gbm90aWNlLCBsb2NhbGl6ZWQgaW50byBpdHMgY29vcmRpbmF0ZXMKKyAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGV2ZW50Lm1YID0gbUxvY2FsUG9pbnQueDsKKyAgICAgICAgICAgICAgICBldmVudC5tWSA9IG1Mb2NhbFBvaW50Lnk7CisKKyAgICAgICAgICAgICAgICByZXR2YWwgPSB0YXJnZXQuZGlzcGF0Y2hEcmFnRXZlbnQoZXZlbnQpOworCisgICAgICAgICAgICAgICAgZXZlbnQubVggPSB0eDsKKyAgICAgICAgICAgICAgICBldmVudC5tWSA9IHR5OworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgRHJhZ0V2ZW50LkFDVElPTl9EUk9QOiB7CisgICAgICAgICAgICBpZiAoVmlld0RlYnVnLkRFQlVHX0RSQUcpIExvZy5kKFZpZXcuVklFV19MT0dfVEFHLCAiRHJvcCBldmVudDogIiArIGV2ZW50KTsKKyAgICAgICAgICAgIFZpZXcgdGFyZ2V0ID0gZmluZEZyb250bW9zdERyb3BwYWJsZUNoaWxkQXQoZXZlbnQubVgsIGV2ZW50Lm1ZLCBtTG9jYWxQb2ludCk7CisgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBldmVudC5tWCA9IG1Mb2NhbFBvaW50Lng7CisgICAgICAgICAgICAgICAgZXZlbnQubVkgPSBtTG9jYWxQb2ludC55OworICAgICAgICAgICAgICAgIHJldHZhbCA9IHRhcmdldC5kaXNwYXRjaERyYWdFdmVudChldmVudCk7CisgICAgICAgICAgICAgICAgZXZlbnQubVggPSB0eDsKKyAgICAgICAgICAgICAgICBldmVudC5tWSA9IHR5OworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgbm9uZSBvZiBvdXIgY2hpbGRyZW4gY291bGQgaGFuZGxlIHRoZSBldmVudCwgdHJ5IGhlcmUKKyAgICAgICAgaWYgKCFyZXR2YWwpIHsKKyAgICAgICAgICAgIHJldHZhbCA9IG9uRHJhZ0V2ZW50KGV2ZW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIC8vIEZpbmQgdGhlIGZyb250bW9zdCBjaGlsZCB2aWV3IHRoYXQgbGllcyB1bmRlciB0aGUgZ2l2ZW4gcG9pbnQsIGFuZCBjYWxjdWxhdGUKKyAgICAvLyB0aGUgcG9zaXRpb24gd2l0aGluIGl0cyBvd24gbG9jYWwgY29vcmRpbmF0ZSBzeXN0ZW0uCisgICAgVmlldyBmaW5kRnJvbnRtb3N0RHJvcHBhYmxlQ2hpbGRBdChmbG9hdCB4LCBmbG9hdCB5LCBQb2ludEYgb3V0TG9jYWxQb2ludCkgeworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtQ2hpbGRyZW5Db3VudDsKKyAgICAgICAgZmluYWwgVmlld1tdIGNoaWxkcmVuID0gbUNoaWxkcmVuOworICAgICAgICBmb3IgKGludCBpID0gY291bnQgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGNoaWxkcmVuW2ldOworICAgICAgICAgICAgaWYgKCFjaGlsZC5tQ2FuQWNjZXB0RHJvcCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaXNUcmFuc2Zvcm1lZFRvdWNoUG9pbnRJblZpZXcoeCwgeSwgY2hpbGQsIG91dExvY2FsUG9pbnQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaEtleUV2ZW50UHJlSW1lKEtleUV2ZW50IGV2ZW50KSB7CkBAIC04MjcsMTE5ICsxMDM0LDUyMyBAQAogICAgICAgICB9CiAKICAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2LmdldEFjdGlvbigpOwotICAgICAgICBmaW5hbCBmbG9hdCB4ZiA9IGV2LmdldFgoKTsKLSAgICAgICAgZmluYWwgZmxvYXQgeWYgPSBldi5nZXRZKCk7Ci0gICAgICAgIGZpbmFsIGZsb2F0IHNjcm9sbGVkWEZsb2F0ID0geGYgKyBtU2Nyb2xsWDsKLSAgICAgICAgZmluYWwgZmxvYXQgc2Nyb2xsZWRZRmxvYXQgPSB5ZiArIG1TY3JvbGxZOwotICAgICAgICBmaW5hbCBSZWN0IGZyYW1lID0gbVRlbXBSZWN0OworICAgICAgICBmaW5hbCBpbnQgYWN0aW9uTWFza2VkID0gYWN0aW9uICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0s7CiAKLSAgICAgICAgYm9vbGVhbiBkaXNhbGxvd0ludGVyY2VwdCA9IChtR3JvdXBGbGFncyAmIEZMQUdfRElTQUxMT1dfSU5URVJDRVBUKSAhPSAwOworICAgICAgICAvLyBIYW5kbGUgYW4gaW5pdGlhbCBkb3duLgorICAgICAgICBpZiAoYWN0aW9uTWFza2VkID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKSB7CisgICAgICAgICAgICAvLyBUaHJvdyBhd2F5IGFsbCBwcmV2aW91cyBzdGF0ZSB3aGVuIHN0YXJ0aW5nIGEgbmV3IHRvdWNoIGdlc3R1cmUuCisgICAgICAgICAgICAvLyBUaGUgZnJhbWV3b3JrIG1heSBoYXZlIGRyb3BwZWQgdGhlIHVwIG9yIGNhbmNlbCBldmVudCBmb3IgdGhlIHByZXZpb3VzIGdlc3R1cmUKKyAgICAgICAgICAgIC8vIGR1ZSB0byBhbiBhcHAgc3dpdGNoLCBBTlIsIG9yIHNvbWUgb3RoZXIgc3RhdGUgY2hhbmdlLgorICAgICAgICAgICAgY2FuY2VsQW5kQ2xlYXJUb3VjaFRhcmdldHMoZXYpOworICAgICAgICAgICAgcmVzZXRUb3VjaFN0YXRlKCk7CisgICAgICAgIH0KIAotICAgICAgICBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKSB7Ci0gICAgICAgICAgICBpZiAobU1vdGlvblRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB3ZWlyZCwgd2UgZ290IGEgcGVuIGRvd24sIGJ1dCB3ZSB0aG91Z2h0IGl0IHdhcwotICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZG93biEKLSAgICAgICAgICAgICAgICAvLyBYWFg6IFdlIHNob3VsZCBwcm9iYWJseSBzZW5kIGFuIEFDVElPTl9VUCB0byB0aGUgY3VycmVudAotICAgICAgICAgICAgICAgIC8vIHRhcmdldC4KLSAgICAgICAgICAgICAgICBtTW90aW9uVGFyZ2V0ID0gbnVsbDsKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGludGVyY2VwdGlvbi4KKyAgICAgICAgZmluYWwgYm9vbGVhbiBpbnRlcmNlcHRlZDsKKyAgICAgICAgaWYgKGFjdGlvbk1hc2tlZCA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTiB8fCBtRmlyc3RUb3VjaFRhcmdldCAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGRpc2FsbG93SW50ZXJjZXB0ID0gKG1Hcm91cEZsYWdzICYgRkxBR19ESVNBTExPV19JTlRFUkNFUFQpICE9IDA7CisgICAgICAgICAgICBpZiAoIWRpc2FsbG93SW50ZXJjZXB0KSB7CisgICAgICAgICAgICAgICAgaW50ZXJjZXB0ZWQgPSBvbkludGVyY2VwdFRvdWNoRXZlbnQoZXYpOworICAgICAgICAgICAgICAgIGV2LnNldEFjdGlvbihhY3Rpb24pOyAvLyByZXN0b3JlIGFjdGlvbiBpbiBjYXNlIG9uSW50ZXJjZXB0VG91Y2hFdmVudCgpIGNoYW5nZWQgaXQKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50ZXJjZXB0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIElmIHdlJ3JlIGRpc2FsbG93aW5nIGludGVyY2VwdCBvciBpZiB3ZSdyZSBhbGxvd2luZyBhbmQgd2UgZGlkbid0Ci0gICAgICAgICAgICAvLyBpbnRlcmNlcHQKLSAgICAgICAgICAgIGlmIChkaXNhbGxvd0ludGVyY2VwdCB8fCAhb25JbnRlcmNlcHRUb3VjaEV2ZW50KGV2KSkgewotICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRoaXMgZXZlbnQncyBhY3Rpb24gKGp1c3QgdG8gcHJvdGVjdCBvdXJzZWx2ZXMpCi0gICAgICAgICAgICAgICAgZXYuc2V0QWN0aW9uKE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKTsKLSAgICAgICAgICAgICAgICAvLyBXZSBrbm93IHdlIHdhbnQgdG8gZGlzcGF0Y2ggdGhlIGV2ZW50IGRvd24sIGZpbmQgYSBjaGlsZAotICAgICAgICAgICAgICAgIC8vIHdobyBjYW4gaGFuZGxlIGl0LCBzdGFydCB3aXRoIHRoZSBmcm9udC1tb3N0IGNoaWxkLgotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzY3JvbGxlZFhJbnQgPSAoaW50KSBzY3JvbGxlZFhGbG9hdDsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsZWRZSW50ID0gKGludCkgc2Nyb2xsZWRZRmxvYXQ7Ci0gICAgICAgICAgICAgICAgZmluYWwgVmlld1tdIGNoaWxkcmVuID0gbUNoaWxkcmVuOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DaGlsZHJlbkNvdW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50ZXJjZXB0ZWQgPSB0cnVlOworICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gY291bnQgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gY2hpbGRyZW5baV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoY2hpbGQubVZpZXdGbGFncyAmIFZJU0lCSUxJVFlfTUFTSykgPT0gVklTSUJMRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNoaWxkLmdldEFuaW1hdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldEhpdFJlY3QoZnJhbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lLmNvbnRhaW5zKHNjcm9sbGVkWEludCwgc2Nyb2xsZWRZSW50KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCB0aGUgZXZlbnQgdG8gdGhlIHZpZXcncyBjb29yZGluYXRlIHN5c3RlbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHhjID0gc2Nyb2xsZWRYRmxvYXQgLSBjaGlsZC5tTGVmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCB5YyA9IHNjcm9sbGVkWUZsb2F0IC0gY2hpbGQubVRvcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5zZXRMb2NhdGlvbih4YywgeWMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLm1Qcml2YXRlRmxhZ3MgJj0gfkNBTkNFTF9ORVhUX1VQX0VWRU5UOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5kaXNwYXRjaFRvdWNoRXZlbnQoZXYpKSAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFdmVudCBoYW5kbGVkLCB3ZSBoYXZlIGEgdGFyZ2V0IG5vdy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1vdGlvblRhcmdldCA9IGNoaWxkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGV2ZW50IGRpZG4ndCBnZXQgaGFuZGxlZCwgdHJ5IHRoZSBuZXh0IHZpZXcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgcmVzZXQgdGhlIGV2ZW50J3MgbG9jYXRpb24sIGl0J3Mgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVjZXNzYXJ5IGhlcmUuCisgICAgICAgIC8vIENoZWNrIGZvciBjYW5jZWxhdGlvbi4KKyAgICAgICAgZmluYWwgYm9vbGVhbiBjYW5jZWxlZCA9IHJlc2V0Q2FuY2VsTmV4dFVwRmxhZyh0aGlzKQorICAgICAgICAgICAgICAgIHx8IGFjdGlvbk1hc2tlZCA9PSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOworCisgICAgICAgIC8vIFVwZGF0ZSBsaXN0IG9mIHRvdWNoIHRhcmdldHMgZm9yIHBvaW50ZXIgZG93biwgaWYgbmVlZGVkLgorICAgICAgICBmaW5hbCBib29sZWFuIHNwbGl0ID0gKG1Hcm91cEZsYWdzICYgRkxBR19TUExJVF9NT1RJT05fRVZFTlRTKSAhPSAwOworICAgICAgICBUb3VjaFRhcmdldCBuZXdUb3VjaFRhcmdldCA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gYWxyZWFkeURpc3BhdGNoZWRUb05ld1RvdWNoVGFyZ2V0ID0gZmFsc2U7CisgICAgICAgIGlmICghY2FuY2VsZWQgJiYgIWludGVyY2VwdGVkKSB7CisgICAgICAgICAgICBpZiAoYWN0aW9uTWFza2VkID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOCisgICAgICAgICAgICAgICAgICAgIHx8IChzcGxpdCAmJiBhY3Rpb25NYXNrZWQgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTikpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYWN0aW9uSW5kZXggPSBldi5nZXRBY3Rpb25JbmRleCgpOyAvLyBhbHdheXMgMCBmb3IgZG93bgorICAgICAgICAgICAgICAgIGZpbmFsIGludCBpZEJpdHNUb0Fzc2lnbiA9IHNwbGl0ID8gMSA8PCBldi5nZXRQb2ludGVySWQoYWN0aW9uSW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICA6IFRvdWNoVGFyZ2V0LkFMTF9QT0lOVEVSX0lEUzsKKworICAgICAgICAgICAgICAgIC8vIENsZWFuIHVwIGVhcmxpZXIgdG91Y2ggdGFyZ2V0cyBmb3IgdGhpcyBwb2ludGVyIGlkIGluIGNhc2UgdGhleQorICAgICAgICAgICAgICAgIC8vIGhhdmUgYmVjb21lIG91dCBvZiBzeW5jLgorICAgICAgICAgICAgICAgIHJlbW92ZVBvaW50ZXJzRnJvbVRvdWNoVGFyZ2V0cyhpZEJpdHNUb0Fzc2lnbik7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRyZW5Db3VudCA9IG1DaGlsZHJlbkNvdW50OworICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbkNvdW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmluZCBhIGNoaWxkIHRoYXQgY2FuIHJlY2VpdmUgdGhlIGV2ZW50LiAgU2NhbiBjaGlsZHJlbiBmcm9tIGZyb250IHRvIGJhY2suCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgeCA9IGV2LmdldFgoYWN0aW9uSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCB5ID0gZXYuZ2V0WShhY3Rpb25JbmRleCk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGNoaWxkcmVuQ291bnQgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGNoaWxkcmVuW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjaGlsZC5tVmlld0ZsYWdzICYgVklTSUJJTElUWV9NQVNLKSAhPSBWSVNJQkxFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNoaWxkLmdldEFuaW1hdGlvbigpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGludmlzaWJsZSBjaGlsZCB1bmxlc3MgaXQgaXMgYW5pbWF0aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVHJhbnNmb3JtZWRUb3VjaFBvaW50SW5WaWV3KHgsIHksIGNoaWxkLCBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBwb2ludGVyIGlzIG91dCBvZiBjaGlsZCdzIGJvdW5kcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgbmV3VG91Y2hUYXJnZXQgPSBnZXRUb3VjaFRhcmdldChjaGlsZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3VG91Y2hUYXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoaWxkIGlzIGFscmVhZHkgcmVjZWl2aW5nIHRvdWNoIHdpdGhpbiBpdHMgYm91bmRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdpdmUgaXQgdGhlIG5ldyBwb2ludGVyIGluIGFkZGl0aW9uIHRvIHRoZSBvbmVzIGl0IGlzIGhhbmRsaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RvdWNoVGFyZ2V0LnBvaW50ZXJJZEJpdHMgfD0gaWRCaXRzVG9Bc3NpZ247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0Q2FuY2VsTmV4dFVwRmxhZyhjaGlsZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlzcGF0Y2hUcmFuc2Zvcm1lZFRvdWNoRXZlbnQoZXYsIGZhbHNlLCBjaGlsZCwgaWRCaXRzVG9Bc3NpZ24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hpbGQgd2FudHMgdG8gcmVjZWl2ZSB0b3VjaCB3aXRoaW4gaXRzIGJvdW5kcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUb3VjaFRhcmdldCA9IGFkZFRvdWNoVGFyZ2V0KGNoaWxkLCBpZEJpdHNUb0Fzc2lnbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeURpc3BhdGNoZWRUb05ld1RvdWNoVGFyZ2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChuZXdUb3VjaFRhcmdldCA9PSBudWxsICYmIG1GaXJzdFRvdWNoVGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRGlkIG5vdCBmaW5kIGEgY2hpbGQgdG8gcmVjZWl2ZSB0aGUgZXZlbnQuCisgICAgICAgICAgICAgICAgICAgIC8vIEFzc2lnbiB0aGUgcG9pbnRlciB0byB0aGUgbGVhc3QgcmVjZW50bHkgYWRkZWQgdGFyZ2V0LgorICAgICAgICAgICAgICAgICAgICBuZXdUb3VjaFRhcmdldCA9IG1GaXJzdFRvdWNoVGFyZ2V0OworICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV3VG91Y2hUYXJnZXQubmV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdUb3VjaFRhcmdldCA9IG5ld1RvdWNoVGFyZ2V0Lm5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmV3VG91Y2hUYXJnZXQucG9pbnRlcklkQml0cyB8PSBpZEJpdHNUb0Fzc2lnbjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBib29sZWFuIGlzVXBPckNhbmNlbCA9IChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB8fAotICAgICAgICAgICAgICAgIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTCk7Ci0KLSAgICAgICAgaWYgKGlzVXBPckNhbmNlbCkgewotICAgICAgICAgICAgLy8gTm90ZSwgd2UndmUgYWxyZWFkeSBjb3BpZWQgdGhlIHByZXZpb3VzIHN0YXRlIHRvIG91ciBsb2NhbAotICAgICAgICAgICAgLy8gdmFyaWFibGUsIHNvIHRoaXMgdGFrZXMgZWZmZWN0IG9uIHRoZSBuZXh0IGV2ZW50Ci0gICAgICAgICAgICBtR3JvdXBGbGFncyAmPSB+RkxBR19ESVNBTExPV19JTlRFUkNFUFQ7CisgICAgICAgIC8vIERpc3BhdGNoIHRvIHRvdWNoIHRhcmdldHMuCisgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOworICAgICAgICBpZiAobUZpcnN0VG91Y2hUYXJnZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTm8gdG91Y2ggdGFyZ2V0cyBzbyB0cmVhdCB0aGlzIGFzIGFuIG9yZGluYXJ5IHZpZXcuCisgICAgICAgICAgICBoYW5kbGVkID0gZGlzcGF0Y2hUcmFuc2Zvcm1lZFRvdWNoRXZlbnQoZXYsIGNhbmNlbGVkLCBudWxsLAorICAgICAgICAgICAgICAgICAgICBUb3VjaFRhcmdldC5BTExfUE9JTlRFUl9JRFMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRGlzcGF0Y2ggdG8gdG91Y2ggdGFyZ2V0cywgZXhjbHVkaW5nIHRoZSBuZXcgdG91Y2ggdGFyZ2V0IGlmIHdlIGFscmVhZHkKKyAgICAgICAgICAgIC8vIGRpc3BhdGNoZWQgdG8gaXQuICBDYW5jZWwgdG91Y2ggdGFyZ2V0cyBpZiBuZWNlc3NhcnkuCisgICAgICAgICAgICBUb3VjaFRhcmdldCBwcmVkZWNlc3NvciA9IG51bGw7CisgICAgICAgICAgICBUb3VjaFRhcmdldCB0YXJnZXQgPSBtRmlyc3RUb3VjaFRhcmdldDsKKyAgICAgICAgICAgIHdoaWxlICh0YXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFRvdWNoVGFyZ2V0IG5leHQgPSB0YXJnZXQubmV4dDsKKyAgICAgICAgICAgICAgICBpZiAoYWxyZWFkeURpc3BhdGNoZWRUb05ld1RvdWNoVGFyZ2V0ICYmIHRhcmdldCA9PSBuZXdUb3VjaFRhcmdldCkgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGNhbmNlbENoaWxkID0gcmVzZXRDYW5jZWxOZXh0VXBGbGFnKHRhcmdldC5jaGlsZCkgfHwgaW50ZXJjZXB0ZWQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwYXRjaFRyYW5zZm9ybWVkVG91Y2hFdmVudChldiwgY2FuY2VsQ2hpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmNoaWxkLCB0YXJnZXQucG9pbnRlcklkQml0cykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjYW5jZWxDaGlsZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWRlY2Vzc29yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RUb3VjaFRhcmdldCA9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRlY2Vzc29yLm5leHQgPSBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmVkZWNlc3NvciA9IHRhcmdldDsKKyAgICAgICAgICAgICAgICB0YXJnZXQgPSBuZXh0OworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gVGhlIGV2ZW50IHdhc24ndCBhbiBBQ1RJT05fRE9XTiwgZGlzcGF0Y2ggaXQgdG8gb3VyIHRhcmdldCBpZgotICAgICAgICAvLyB3ZSBoYXZlIG9uZS4KLSAgICAgICAgZmluYWwgVmlldyB0YXJnZXQgPSBtTW90aW9uVGFyZ2V0OwotICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFdlIGRvbid0IGhhdmUgYSB0YXJnZXQsIHRoaXMgbWVhbnMgd2UncmUgaGFuZGxpbmcgdGhlCi0gICAgICAgICAgICAvLyBldmVudCBhcyBhIHJlZ3VsYXIgdmlldy4KLSAgICAgICAgICAgIGV2LnNldExvY2F0aW9uKHhmLCB5Zik7Ci0gICAgICAgICAgICBpZiAoKG1Qcml2YXRlRmxhZ3MgJiBDQU5DRUxfTkVYVF9VUF9FVkVOVCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGV2LnNldEFjdGlvbihNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMKTsKLSAgICAgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzICY9IH5DQU5DRUxfTkVYVF9VUF9FVkVOVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzdXBlci5kaXNwYXRjaFRvdWNoRXZlbnQoZXYpOworICAgICAgICAvLyBVcGRhdGUgbGlzdCBvZiB0b3VjaCB0YXJnZXRzIGZvciBwb2ludGVyIHVwIG9yIGNhbmNlbCwgaWYgbmVlZGVkLgorICAgICAgICBpZiAoY2FuY2VsZWQgfHwgYWN0aW9uTWFza2VkID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgeworICAgICAgICAgICAgcmVzZXRUb3VjaFN0YXRlKCk7CisgICAgICAgIH0gZWxzZSBpZiAoc3BsaXQgJiYgYWN0aW9uTWFza2VkID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgYWN0aW9uSW5kZXggPSBldi5nZXRBY3Rpb25JbmRleCgpOworICAgICAgICAgICAgZmluYWwgaW50IGlkQml0c1RvUmVtb3ZlID0gMSA8PCBldi5nZXRQb2ludGVySWQoYWN0aW9uSW5kZXgpOworICAgICAgICAgICAgcmVtb3ZlUG9pbnRlcnNGcm9tVG91Y2hUYXJnZXRzKGlkQml0c1RvUmVtb3ZlKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIGlmIGhhdmUgYSB0YXJnZXQsIHNlZSBpZiB3ZSdyZSBhbGxvd2VkIHRvIGFuZCB3YW50IHRvIGludGVyY2VwdCBpdHMKLSAgICAgICAgLy8gZXZlbnRzCi0gICAgICAgIGlmICghZGlzYWxsb3dJbnRlcmNlcHQgJiYgb25JbnRlcmNlcHRUb3VjaEV2ZW50KGV2KSkgewotICAgICAgICAgICAgZmluYWwgZmxvYXQgeGMgPSBzY3JvbGxlZFhGbG9hdCAtIChmbG9hdCkgdGFyZ2V0Lm1MZWZ0OwotICAgICAgICAgICAgZmluYWwgZmxvYXQgeWMgPSBzY3JvbGxlZFlGbG9hdCAtIChmbG9hdCkgdGFyZ2V0Lm1Ub3A7Ci0gICAgICAgICAgICBtUHJpdmF0ZUZsYWdzICY9IH5DQU5DRUxfTkVYVF9VUF9FVkVOVDsKLSAgICAgICAgICAgIGV2LnNldEFjdGlvbihNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMKTsKLSAgICAgICAgICAgIGV2LnNldExvY2F0aW9uKHhjLCB5Yyk7Ci0gICAgICAgICAgICBpZiAoIXRhcmdldC5kaXNwYXRjaFRvdWNoRXZlbnQoZXYpKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGFyZ2V0IGRpZG4ndCBoYW5kbGUgQUNUSU9OX0NBTkNFTC4gbm90IG11Y2ggd2UgY2FuIGRvCi0gICAgICAgICAgICAgICAgLy8gYnV0IHRoZXkgc2hvdWxkIGhhdmUuCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjbGVhciB0aGUgdGFyZ2V0Ci0gICAgICAgICAgICBtTW90aW9uVGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgICAgIC8vIERvbid0IGRpc3BhdGNoIHRoaXMgZXZlbnQgdG8gb3VyIG93biB2aWV3LCBiZWNhdXNlIHdlIGFscmVhZHkKLSAgICAgICAgICAgIC8vIHNhdyBpdCB3aGVuIGludGVyY2VwdGluZzsgd2UganVzdCB3YW50IHRvIGdpdmUgdGhlIGZvbGxvd2luZwotICAgICAgICAgICAgLy8gZXZlbnQgdG8gdGhlIG5vcm1hbCBvblRvdWNoRXZlbnQoKS4KKyAgICAgICAgcmV0dXJuIGhhbmRsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXRzIGFsbCB0b3VjaCBzdGF0ZSBpbiBwcmVwYXJhdGlvbiBmb3IgYSBuZXcgY3ljbGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0VG91Y2hTdGF0ZSgpIHsKKyAgICAgICAgY2xlYXJUb3VjaFRhcmdldHMoKTsKKyAgICAgICAgcmVzZXRDYW5jZWxOZXh0VXBGbGFnKHRoaXMpOworICAgICAgICBtR3JvdXBGbGFncyAmPSB+RkxBR19ESVNBTExPV19JTlRFUkNFUFQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBjYW5jZWwgbmV4dCB1cCBmbGFnLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmxhZyB3YXMgcHJldmlvdXNseSBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlc2V0Q2FuY2VsTmV4dFVwRmxhZyhWaWV3IHZpZXcpIHsKKyAgICAgICAgaWYgKCh2aWV3Lm1Qcml2YXRlRmxhZ3MgJiBDQU5DRUxfTkVYVF9VUF9FVkVOVCkgIT0gMCkgeworICAgICAgICAgICAgdmlldy5tUHJpdmF0ZUZsYWdzICY9IH5DQU5DRUxfTkVYVF9VUF9FVkVOVDsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLSAgICAgICAgaWYgKGlzVXBPckNhbmNlbCkgewotICAgICAgICAgICAgbU1vdGlvblRhcmdldCA9IG51bGw7CisgICAgLyoqCisgICAgICogQ2xlYXJzIGFsbCB0b3VjaCB0YXJnZXRzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjbGVhclRvdWNoVGFyZ2V0cygpIHsKKyAgICAgICAgVG91Y2hUYXJnZXQgdGFyZ2V0ID0gbUZpcnN0VG91Y2hUYXJnZXQ7CisgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIFRvdWNoVGFyZ2V0IG5leHQgPSB0YXJnZXQubmV4dDsKKyAgICAgICAgICAgICAgICB0YXJnZXQucmVjeWNsZSgpOworICAgICAgICAgICAgICAgIHRhcmdldCA9IG5leHQ7CisgICAgICAgICAgICB9IHdoaWxlICh0YXJnZXQgIT0gbnVsbCk7CisgICAgICAgICAgICBtRmlyc3RUb3VjaFRhcmdldCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWxzIGFuZCBjbGVhcnMgYWxsIHRvdWNoIHRhcmdldHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbEFuZENsZWFyVG91Y2hUYXJnZXRzKE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChtRmlyc3RUb3VjaFRhcmdldCAhPSBudWxsKSB7CisgICAgICAgICAgICBib29sZWFuIHN5bnRoZXRpY0V2ZW50ID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoZXZlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgZXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4obm93LCBub3csCisgICAgICAgICAgICAgICAgICAgICAgICBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMLCAwLjBmLCAwLjBmLCAwKTsKKyAgICAgICAgICAgICAgICBzeW50aGV0aWNFdmVudCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoVG91Y2hUYXJnZXQgdGFyZ2V0ID0gbUZpcnN0VG91Y2hUYXJnZXQ7IHRhcmdldCAhPSBudWxsOyB0YXJnZXQgPSB0YXJnZXQubmV4dCkgeworICAgICAgICAgICAgICAgIHJlc2V0Q2FuY2VsTmV4dFVwRmxhZyh0YXJnZXQuY2hpbGQpOworICAgICAgICAgICAgICAgIGRpc3BhdGNoVHJhbnNmb3JtZWRUb3VjaEV2ZW50KGV2ZW50LCB0cnVlLCB0YXJnZXQuY2hpbGQsIHRhcmdldC5wb2ludGVySWRCaXRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsZWFyVG91Y2hUYXJnZXRzKCk7CisKKyAgICAgICAgICAgIGlmIChzeW50aGV0aWNFdmVudCkgeworICAgICAgICAgICAgICAgIGV2ZW50LnJlY3ljbGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHRvdWNoIHRhcmdldCBmb3Igc3BlY2lmaWVkIGNoaWxkIHZpZXcuCisgICAgICogUmV0dXJucyBudWxsIGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFRvdWNoVGFyZ2V0IGdldFRvdWNoVGFyZ2V0KFZpZXcgY2hpbGQpIHsKKyAgICAgICAgZm9yIChUb3VjaFRhcmdldCB0YXJnZXQgPSBtRmlyc3RUb3VjaFRhcmdldDsgdGFyZ2V0ICE9IG51bGw7IHRhcmdldCA9IHRhcmdldC5uZXh0KSB7CisgICAgICAgICAgICBpZiAodGFyZ2V0LmNoaWxkID09IGNoaWxkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgdG91Y2ggdGFyZ2V0IGZvciBzcGVjaWZpZWQgY2hpbGQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdC4KKyAgICAgKiBBc3N1bWVzIHRoZSB0YXJnZXQgY2hpbGQgaXMgbm90IGFscmVhZHkgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFRvdWNoVGFyZ2V0IGFkZFRvdWNoVGFyZ2V0KFZpZXcgY2hpbGQsIGludCBwb2ludGVySWRCaXRzKSB7CisgICAgICAgIFRvdWNoVGFyZ2V0IHRhcmdldCA9IFRvdWNoVGFyZ2V0Lm9idGFpbihjaGlsZCwgcG9pbnRlcklkQml0cyk7CisgICAgICAgIHRhcmdldC5uZXh0ID0gbUZpcnN0VG91Y2hUYXJnZXQ7CisgICAgICAgIG1GaXJzdFRvdWNoVGFyZ2V0ID0gdGFyZ2V0OworICAgICAgICByZXR1cm4gdGFyZ2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIHBvaW50ZXIgaWRzIGZyb20gY29uc2lkZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlUG9pbnRlcnNGcm9tVG91Y2hUYXJnZXRzKGludCBwb2ludGVySWRCaXRzKSB7CisgICAgICAgIFRvdWNoVGFyZ2V0IHByZWRlY2Vzc29yID0gbnVsbDsKKyAgICAgICAgVG91Y2hUYXJnZXQgdGFyZ2V0ID0gbUZpcnN0VG91Y2hUYXJnZXQ7CisgICAgICAgIHdoaWxlICh0YXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgVG91Y2hUYXJnZXQgbmV4dCA9IHRhcmdldC5uZXh0OworICAgICAgICAgICAgaWYgKCh0YXJnZXQucG9pbnRlcklkQml0cyAmIHBvaW50ZXJJZEJpdHMpICE9IDApIHsKKyAgICAgICAgICAgICAgICB0YXJnZXQucG9pbnRlcklkQml0cyAmPSB+cG9pbnRlcklkQml0czsKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LnBvaW50ZXJJZEJpdHMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJlZGVjZXNzb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0VG91Y2hUYXJnZXQgPSBuZXh0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGVjZXNzb3IubmV4dCA9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJlZGVjZXNzb3IgPSB0YXJnZXQ7CisgICAgICAgICAgICB0YXJnZXQgPSBuZXh0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIGEgY2hpbGQgdmlldyBjb250YWlucyB0aGUgc3BlY2lmaWVkIHBvaW50IHdoZW4gdHJhbnNmb3JtZWQKKyAgICAgKiBpbnRvIGl0cyBjb29yZGluYXRlIHNwYWNlLgorICAgICAqIENoaWxkIG11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzVHJhbnNmb3JtZWRUb3VjaFBvaW50SW5WaWV3KGZsb2F0IHgsIGZsb2F0IHksIFZpZXcgY2hpbGQsCisgICAgICAgICAgICBQb2ludEYgb3V0TG9jYWxQb2ludCkgeworICAgICAgICBmbG9hdCBsb2NhbFggPSB4ICsgbVNjcm9sbFggLSBjaGlsZC5tTGVmdDsKKyAgICAgICAgZmxvYXQgbG9jYWxZID0geSArIG1TY3JvbGxZIC0gY2hpbGQubVRvcDsKKyAgICAgICAgaWYgKCEgY2hpbGQuaGFzSWRlbnRpdHlNYXRyaXgoKSAmJiBtQXR0YWNoSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBmbG9hdFtdIGxvY2FsWFkgPSBtQXR0YWNoSW5mby5tVG1wVHJhbnNmb3JtTG9jYXRpb247CisgICAgICAgICAgICBsb2NhbFhZWzBdID0gbG9jYWxYOworICAgICAgICAgICAgbG9jYWxYWVsxXSA9IGxvY2FsWTsKKyAgICAgICAgICAgIGNoaWxkLmdldEludmVyc2VNYXRyaXgoKS5tYXBQb2ludHMobG9jYWxYWSk7CisgICAgICAgICAgICBsb2NhbFggPSBsb2NhbFhZWzBdOworICAgICAgICAgICAgbG9jYWxZID0gbG9jYWxYWVsxXTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBib29sZWFuIGlzSW5WaWV3ID0gY2hpbGQucG9pbnRJblZpZXcobG9jYWxYLCBsb2NhbFkpOworICAgICAgICBpZiAoaXNJblZpZXcgJiYgb3V0TG9jYWxQb2ludCAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXRMb2NhbFBvaW50LnNldChsb2NhbFgsIGxvY2FsWSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGlzSW5WaWV3OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybXMgYSBtb3Rpb24gZXZlbnQgaW50byB0aGUgY29vcmRpbmF0ZSBzcGFjZSBvZiBhIHBhcnRpY3VsYXIgY2hpbGQgdmlldywKKyAgICAgKiBmaWx0ZXJzIG91dCBpcnJlbGV2YW50IHBvaW50ZXIgaWRzLCBhbmQgb3ZlcnJpZGVzIGl0cyBhY3Rpb24gaWYgbmVjZXNzYXJ5LgorICAgICAqIElmIGNoaWxkIGlzIG51bGwsIGFzc3VtZXMgdGhlIE1vdGlvbkV2ZW50IHdpbGwgYmUgc2VudCB0byB0aGlzIFZpZXdHcm91cCBpbnN0ZWFkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkaXNwYXRjaFRyYW5zZm9ybWVkVG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCwgYm9vbGVhbiBjYW5jZWwsCisgICAgICAgICAgICBWaWV3IGNoaWxkLCBpbnQgZGVzaXJlZFBvaW50ZXJJZEJpdHMpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBoYW5kbGVkOworCisgICAgICAgIC8vIENhbmNlbGluZyBtb3Rpb25zIGlzIGEgc3BlY2lhbCBjYXNlLiAgV2UgZG9uJ3QgbmVlZCB0byBwZXJmb3JtIGFueSB0cmFuc2Zvcm1hdGlvbnMKKyAgICAgICAgLy8gb3IgZmlsdGVyaW5nLiAgVGhlIGltcG9ydGFudCBwYXJ0IGlzIHRoZSBhY3Rpb24sIG5vdCB0aGUgY29udGVudHMuCisgICAgICAgIGZpbmFsIGludCBvbGRBY3Rpb24gPSBldmVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgaWYgKGNhbmNlbCB8fCBvbGRBY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTCkgeworICAgICAgICAgICAgZXZlbnQuc2V0QWN0aW9uKE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwpOworICAgICAgICAgICAgaWYgKGNoaWxkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVkID0gc3VwZXIuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGFuZGxlZCA9IGNoaWxkLmRpc3BhdGNoVG91Y2hFdmVudChldmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBldmVudC5zZXRBY3Rpb24ob2xkQWN0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVkOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gZmluYWxseSBvZmZzZXQgdGhlIGV2ZW50IHRvIHRoZSB0YXJnZXQncyBjb29yZGluYXRlIHN5c3RlbSBhbmQKLSAgICAgICAgLy8gZGlzcGF0Y2ggdGhlIGV2ZW50LgotICAgICAgICBmaW5hbCBmbG9hdCB4YyA9IHNjcm9sbGVkWEZsb2F0IC0gKGZsb2F0KSB0YXJnZXQubUxlZnQ7Ci0gICAgICAgIGZpbmFsIGZsb2F0IHljID0gc2Nyb2xsZWRZRmxvYXQgLSAoZmxvYXQpIHRhcmdldC5tVG9wOwotICAgICAgICBldi5zZXRMb2NhdGlvbih4YywgeWMpOwotCi0gICAgICAgIGlmICgodGFyZ2V0Lm1Qcml2YXRlRmxhZ3MgJiBDQU5DRUxfTkVYVF9VUF9FVkVOVCkgIT0gMCkgewotICAgICAgICAgICAgZXYuc2V0QWN0aW9uKE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwpOwotICAgICAgICAgICAgdGFyZ2V0Lm1Qcml2YXRlRmxhZ3MgJj0gfkNBTkNFTF9ORVhUX1VQX0VWRU5UOwotICAgICAgICAgICAgbU1vdGlvblRhcmdldCA9IG51bGw7CisgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHBvaW50ZXJzIHRvIGRlbGl2ZXIuCisgICAgICAgIGZpbmFsIGludCBvbGRQb2ludGVyQ291bnQgPSBldmVudC5nZXRQb2ludGVyQ291bnQoKTsKKyAgICAgICAgaW50IG5ld1BvaW50ZXJDb3VudCA9IDA7CisgICAgICAgIGlmIChkZXNpcmVkUG9pbnRlcklkQml0cyA9PSBUb3VjaFRhcmdldC5BTExfUE9JTlRFUl9JRFMpIHsKKyAgICAgICAgICAgIG5ld1BvaW50ZXJDb3VudCA9IG9sZFBvaW50ZXJDb3VudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2xkUG9pbnRlckNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcG9pbnRlcklkID0gZXZlbnQuZ2V0UG9pbnRlcklkKGkpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBwb2ludGVySWRCaXQgPSAxIDw8IHBvaW50ZXJJZDsKKyAgICAgICAgICAgICAgICBpZiAoKHBvaW50ZXJJZEJpdCAmIGRlc2lyZWRQb2ludGVySWRCaXRzKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld1BvaW50ZXJDb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiB0YXJnZXQuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2KTsKKyAgICAgICAgLy8gSWYgZm9yIHNvbWUgcmVhc29uIHdlIGVuZGVkIHVwIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZSB3aGVyZSBpdCBsb29rcyBsaWtlIHdlCisgICAgICAgIC8vIG1pZ2h0IHByb2R1Y2UgYSBtb3Rpb24gZXZlbnQgd2l0aCBubyBwb2ludGVycyBpbiBpdCwgdGhlbiBkcm9wIHRoZSBldmVudC4KKyAgICAgICAgaWYgKG5ld1BvaW50ZXJDb3VudCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgbnVtYmVyIG9mIHBvaW50ZXJzIGlzIHRoZSBzYW1lIGFuZCB3ZSBkb24ndCBuZWVkIHRvIHBlcmZvcm0gYW55IGZhbmN5CisgICAgICAgIC8vIGlycmV2ZXJzaWJsZSB0cmFuc2Zvcm1hdGlvbnMsIHRoZW4gd2UgY2FuIHJldXNlIHRoZSBtb3Rpb24gZXZlbnQgZm9yIHRoaXMKKyAgICAgICAgLy8gZGlzcGF0Y2ggYXMgbG9uZyBhcyB3ZSBhcmUgY2FyZWZ1bCB0byByZXZlcnQgYW55IGNoYW5nZXMgd2UgbWFrZS4KKyAgICAgICAgZmluYWwgYm9vbGVhbiByZXVzZSA9IG5ld1BvaW50ZXJDb3VudCA9PSBvbGRQb2ludGVyQ291bnQKKyAgICAgICAgICAgICAgICAmJiAoY2hpbGQgPT0gbnVsbCB8fCBjaGlsZC5oYXNJZGVudGl0eU1hdHJpeCgpKTsKKyAgICAgICAgaWYgKHJldXNlKSB7CisgICAgICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGhhbmRsZWQgPSBzdXBlci5kaXNwYXRjaFRvdWNoRXZlbnQoZXZlbnQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCBvZmZzZXRYID0gbVNjcm9sbFggLSBjaGlsZC5tTGVmdDsKKyAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCBvZmZzZXRZID0gbVNjcm9sbFkgLSBjaGlsZC5tVG9wOworICAgICAgICAgICAgICAgIGV2ZW50Lm9mZnNldExvY2F0aW9uKG9mZnNldFgsIG9mZnNldFkpOworCisgICAgICAgICAgICAgICAgaGFuZGxlZCA9IGNoaWxkLmRpc3BhdGNoVG91Y2hFdmVudChldmVudCk7CisKKyAgICAgICAgICAgICAgICBldmVudC5vZmZzZXRMb2NhdGlvbigtb2Zmc2V0WCwgLW9mZnNldFkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgZXZlbnQuCisgICAgICAgIC8vIElmIHRoZSBudW1iZXIgb2YgcG9pbnRlcnMgaXMgZGlmZmVyZW50LCB0aGVuIHdlIG5lZWQgdG8gZmlsdGVyIG91dCBpcnJlbGV2YW50IHBvaW50ZXJzCisgICAgICAgIC8vIGFzIHdlIG1ha2UgYSBjb3B5IG9mIHRoZSBtb3Rpb24gZXZlbnQuCisgICAgICAgIE1vdGlvbkV2ZW50IHRyYW5zZm9ybWVkRXZlbnQ7CisgICAgICAgIGlmIChuZXdQb2ludGVyQ291bnQgPT0gb2xkUG9pbnRlckNvdW50KSB7CisgICAgICAgICAgICB0cmFuc2Zvcm1lZEV2ZW50ID0gTW90aW9uRXZlbnQub2J0YWluKGV2ZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdyb3dUbXBQb2ludGVyQXJyYXlzKG5ld1BvaW50ZXJDb3VudCk7CisgICAgICAgICAgICBmaW5hbCBpbnRbXSBuZXdQb2ludGVySW5kZXhNYXAgPSBtVG1wUG9pbnRlckluZGV4TWFwOworICAgICAgICAgICAgZmluYWwgaW50W10gbmV3UG9pbnRlcklkcyA9IG1UbXBQb2ludGVySWRzOworICAgICAgICAgICAgZmluYWwgTW90aW9uRXZlbnQuUG9pbnRlckNvb3Jkc1tdIG5ld1BvaW50ZXJDb29yZHMgPSBtVG1wUG9pbnRlckNvb3JkczsKKworICAgICAgICAgICAgaW50IG5ld1BvaW50ZXJJbmRleCA9IDA7CisgICAgICAgICAgICBpbnQgb2xkUG9pbnRlckluZGV4ID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChuZXdQb2ludGVySW5kZXggPCBuZXdQb2ludGVyQ291bnQpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcG9pbnRlcklkID0gZXZlbnQuZ2V0UG9pbnRlcklkKG9sZFBvaW50ZXJJbmRleCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHBvaW50ZXJJZEJpdHMgPSAxIDw8IHBvaW50ZXJJZDsKKyAgICAgICAgICAgICAgICBpZiAoKHBvaW50ZXJJZEJpdHMgJiBkZXNpcmVkUG9pbnRlcklkQml0cykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBuZXdQb2ludGVySW5kZXhNYXBbbmV3UG9pbnRlckluZGV4XSA9IG9sZFBvaW50ZXJJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgbmV3UG9pbnRlcklkc1tuZXdQb2ludGVySW5kZXhdID0gcG9pbnRlcklkOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3UG9pbnRlckNvb3Jkc1tuZXdQb2ludGVySW5kZXhdID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BvaW50ZXJDb29yZHNbbmV3UG9pbnRlckluZGV4XSA9IG5ldyBNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBuZXdQb2ludGVySW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb2xkUG9pbnRlckluZGV4ICs9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBuZXdBY3Rpb247CisgICAgICAgICAgICBpZiAoY2FuY2VsKSB7CisgICAgICAgICAgICAgICAgbmV3QWN0aW9uID0gTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IG9sZE1hc2tlZEFjdGlvbiA9IG9sZEFjdGlvbiAmIE1vdGlvbkV2ZW50LkFDVElPTl9NQVNLOworICAgICAgICAgICAgICAgIGlmIChvbGRNYXNrZWRBY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2xkTWFza2VkQWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGFuZ2VkUG9pbnRlcklkID0gZXZlbnQuZ2V0UG9pbnRlcklkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbGRBY3Rpb24gJiBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9JTkRFWF9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfSU5ERVhfU0hJRlQpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2hhbmdlZFBvaW50ZXJJZEJpdHMgPSAxIDw8IGNoYW5nZWRQb2ludGVySWQ7CisgICAgICAgICAgICAgICAgICAgIGlmICgoY2hhbmdlZFBvaW50ZXJJZEJpdHMgJiBkZXNpcmVkUG9pbnRlcklkQml0cykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BvaW50ZXJDb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0L2xhc3QgcG9pbnRlciB3ZW50IGRvd24vdXAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QWN0aW9uID0gb2xkTWFza2VkQWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0RPV04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04gOiBNb3Rpb25FdmVudC5BQ1RJT05fVVA7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc2Vjb25kYXJ5IHBvaW50ZXIgd2VudCBkb3duL3VwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdDaGFuZ2VkUG9pbnRlckluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV3UG9pbnRlcklkc1tuZXdDaGFuZ2VkUG9pbnRlckluZGV4XSAhPSBjaGFuZ2VkUG9pbnRlcklkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NoYW5nZWRQb2ludGVySW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QWN0aW9uID0gb2xkTWFza2VkQWN0aW9uIHwgKG5ld0NoYW5nZWRQb2ludGVySW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0lOREVYX1NISUZUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuIHVucmVsYXRlZCBwb2ludGVyIGNoYW5nZWQuCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBY3Rpb24gPSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZSB1cC9kb3duL2NhbmNlbC9tb3ZlIG1vdGlvbiBhY3Rpb24uCisgICAgICAgICAgICAgICAgICAgIG5ld0FjdGlvbiA9IG9sZE1hc2tlZEFjdGlvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyYW5zZm9ybWVkRXZlbnQgPSBudWxsOworICAgICAgICAgICAgZmluYWwgaW50IGhpc3RvcnlTaXplID0gZXZlbnQuZ2V0SGlzdG9yeVNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGhpc3RvcnlJbmRleCA9IDA7IGhpc3RvcnlJbmRleCA8PSBoaXN0b3J5U2l6ZTsgaGlzdG9yeUluZGV4KyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKG5ld1BvaW50ZXJJbmRleCA9IDA7IG5ld1BvaW50ZXJJbmRleCA8IG5ld1BvaW50ZXJDb3VudDsgbmV3UG9pbnRlckluZGV4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgTW90aW9uRXZlbnQuUG9pbnRlckNvb3JkcyBjID0gbmV3UG9pbnRlckNvb3Jkc1tuZXdQb2ludGVySW5kZXhdOworICAgICAgICAgICAgICAgICAgICBvbGRQb2ludGVySW5kZXggPSBuZXdQb2ludGVySW5kZXhNYXBbbmV3UG9pbnRlckluZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhpc3RvcnlJbmRleCAhPSBoaXN0b3J5U2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0SGlzdG9yaWNhbFBvaW50ZXJDb29yZHMob2xkUG9pbnRlckluZGV4LCBoaXN0b3J5SW5kZXgsIGMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0UG9pbnRlckNvb3JkcyhvbGRQb2ludGVySW5kZXgsIGMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBldmVudFRpbWU7CisgICAgICAgICAgICAgICAgaWYgKGhpc3RvcnlJbmRleCAhPSBoaXN0b3J5U2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBldmVudFRpbWUgPSBldmVudC5nZXRIaXN0b3JpY2FsRXZlbnRUaW1lKGhpc3RvcnlJbmRleCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnRUaW1lID0gZXZlbnQuZ2V0RXZlbnRUaW1lKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWVkRXZlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZEV2ZW50ID0gTW90aW9uRXZlbnQub2J0YWluKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldERvd25UaW1lKCksIGV2ZW50VGltZSwgbmV3QWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BvaW50ZXJDb3VudCwgbmV3UG9pbnRlcklkcywgbmV3UG9pbnRlckNvb3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRNZXRhU3RhdGUoKSwgZXZlbnQuZ2V0WFByZWNpc2lvbigpLCBldmVudC5nZXRZUHJlY2lzaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RGV2aWNlSWQoKSwgZXZlbnQuZ2V0RWRnZUZsYWdzKCksIGV2ZW50LmdldFNvdXJjZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldEZsYWdzKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkRXZlbnQuYWRkQmF0Y2goZXZlbnRUaW1lLCBuZXdQb2ludGVyQ29vcmRzLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIGFueSBuZWNlc3NhcnkgdHJhbnNmb3JtYXRpb25zIGFuZCBkaXNwYXRjaC4KKyAgICAgICAgaWYgKGNoaWxkID09IG51bGwpIHsKKyAgICAgICAgICAgIGhhbmRsZWQgPSBzdXBlci5kaXNwYXRjaFRvdWNoRXZlbnQodHJhbnNmb3JtZWRFdmVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBvZmZzZXRYID0gbVNjcm9sbFggLSBjaGlsZC5tTGVmdDsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IG9mZnNldFkgPSBtU2Nyb2xsWSAtIGNoaWxkLm1Ub3A7CisgICAgICAgICAgICB0cmFuc2Zvcm1lZEV2ZW50Lm9mZnNldExvY2F0aW9uKG9mZnNldFgsIG9mZnNldFkpOworICAgICAgICAgICAgaWYgKCEgY2hpbGQuaGFzSWRlbnRpdHlNYXRyaXgoKSkgeworICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkRXZlbnQudHJhbnNmb3JtKGNoaWxkLmdldEludmVyc2VNYXRyaXgoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhhbmRsZWQgPSBjaGlsZC5kaXNwYXRjaFRvdWNoRXZlbnQodHJhbnNmb3JtZWRFdmVudCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEb25lLgorICAgICAgICB0cmFuc2Zvcm1lZEV2ZW50LnJlY3ljbGUoKTsKKyAgICAgICAgcmV0dXJuIGhhbmRsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5sYXJnZSB0aGUgdGVtcG9yYXJ5IHBvaW50ZXIgYXJyYXlzIGZvciBzcGxpdHRpbmcgcG9pbnRlcnMuCisgICAgICogTWF5IGRpc2NhcmQgY29udGVudHMgKGJ1dCBrZWVwcyBQb2ludGVyQ29vcmRzIG9iamVjdHMgdG8gYXZvaWQgcmVhbGxvY2F0aW5nIHRoZW0pLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBncm93VG1wUG9pbnRlckFycmF5cyhpbnQgZGVzaXJlZENhcGFjaXR5KSB7CisgICAgICAgIGZpbmFsIE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHNbXSBvbGRUbXBQb2ludGVyQ29vcmRzID0gbVRtcFBvaW50ZXJDb29yZHM7CisgICAgICAgIGludCBjYXBhY2l0eTsKKyAgICAgICAgaWYgKG9sZFRtcFBvaW50ZXJDb29yZHMgIT0gbnVsbCkgeworICAgICAgICAgICAgY2FwYWNpdHkgPSBvbGRUbXBQb2ludGVyQ29vcmRzLmxlbmd0aDsKKyAgICAgICAgICAgIGlmIChkZXNpcmVkQ2FwYWNpdHkgPD0gY2FwYWNpdHkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYXBhY2l0eSA9IDQ7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoY2FwYWNpdHkgPCBkZXNpcmVkQ2FwYWNpdHkpIHsKKyAgICAgICAgICAgIGNhcGFjaXR5ICo9IDI7CisgICAgICAgIH0KKworICAgICAgICBtVG1wUG9pbnRlckluZGV4TWFwID0gbmV3IGludFtjYXBhY2l0eV07CisgICAgICAgIG1UbXBQb2ludGVySWRzID0gbmV3IGludFtjYXBhY2l0eV07CisgICAgICAgIG1UbXBQb2ludGVyQ29vcmRzID0gbmV3IE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHNbY2FwYWNpdHldOworCisgICAgICAgIGlmIChvbGRUbXBQb2ludGVyQ29vcmRzICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob2xkVG1wUG9pbnRlckNvb3JkcywgMCwgbVRtcFBvaW50ZXJDb29yZHMsIDAsCisgICAgICAgICAgICAgICAgICAgIG9sZFRtcFBvaW50ZXJDb29yZHMubGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBzcGxpdHRpbmcgb2YgTW90aW9uRXZlbnRzIHRvIG11bHRpcGxlIGNoaWxkcmVuIGR1cmluZyB0b3VjaCBldmVudAorICAgICAqIGRpc3BhdGNoLiBUaGlzIGJlaGF2aW9yIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiA8cD5XaGVuIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQgTW90aW9uRXZlbnRzIG1heSBiZSBzcGxpdCBhbmQgZGlzcGF0Y2hlZCB0byBkaWZmZXJlbnQgY2hpbGQKKyAgICAgKiB2aWV3cyBkZXBlbmRpbmcgb24gd2hlcmUgZWFjaCBwb2ludGVyIGluaXRpYWxseSB3ZW50IGRvd24uIFRoaXMgYWxsb3dzIGZvciB1c2VyIGludGVyYWN0aW9ucworICAgICAqIHN1Y2ggYXMgc2Nyb2xsaW5nIHR3byBwYW5lcyBvZiBjb250ZW50IGluZGVwZW5kZW50bHksIGNob3JkaW5nIG9mIGJ1dHRvbnMsIGFuZCBwZXJmb3JtaW5nCisgICAgICogaW5kZXBlbmRlbnQgZ2VzdHVyZXMgb24gZGlmZmVyZW50IHBpZWNlcyBvZiBjb250ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHNwbGl0IDxjb2RlPnRydWU8L2NvZGU+IHRvIGFsbG93IE1vdGlvbkV2ZW50cyB0byBiZSBzcGxpdCBhbmQgZGlzcGF0Y2hlZCB0byBtdWx0aXBsZQorICAgICAqICAgICAgICAgICAgICBjaGlsZCB2aWV3cy4gPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG9ubHkgYWxsb3cgb25lIGNoaWxkIHZpZXcgdG8gYmUgdGhlIHRhcmdldCBvZgorICAgICAqICAgICAgICAgICAgICBhbnkgTW90aW9uRXZlbnQgcmVjZWl2ZWQgYnkgdGhpcyBWaWV3R3JvdXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW90aW9uRXZlbnRTcGxpdHRpbmdFbmFibGVkKGJvb2xlYW4gc3BsaXQpIHsKKyAgICAgICAgLy8gVE9ETyBBcHBsaWNhdGlvbnMgcmVhbGx5IHNob3VsZG4ndCBjaGFuZ2UgdGhpcyBzZXR0aW5nIG1pZC10b3VjaCBldmVudCwKKyAgICAgICAgLy8gYnV0IHBlcmhhcHMgdGhpcyBzaG91bGQgaGFuZGxlIHRoYXQgY2FzZSBhbmQgc2VuZCBBQ1RJT05fQ0FOQ0VMcyB0byBhbnkgY2hpbGQgdmlld3MKKyAgICAgICAgLy8gd2l0aCBnZXN0dXJlcyBpbiBwcm9ncmVzcyB3aGVuIHRoaXMgaXMgY2hhbmdlZC4KKyAgICAgICAgaWYgKHNwbGl0KSB7CisgICAgICAgICAgICBtR3JvdXBGbGFncyB8PSBGTEFHX1NQTElUX01PVElPTl9FVkVOVFM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtR3JvdXBGbGFncyAmPSB+RkxBR19TUExJVF9NT1RJT05fRVZFTlRTOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIE1vdGlvbkV2ZW50cyBkaXNwYXRjaGVkIHRvIHRoaXMgVmlld0dyb3VwIGNhbiBiZSBzcGxpdCB0byBtdWx0aXBsZSBjaGlsZHJlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc01vdGlvbkV2ZW50U3BsaXR0aW5nRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIChtR3JvdXBGbGFncyAmIEZMQUdfU1BMSVRfTU9USU9OX0VWRU5UUykgPT0gRkxBR19TUExJVF9NT1RJT05fRVZFTlRTOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTE0MiwxOSArMTc1MywxMiBAQAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHZvaWQgZGlzcGF0Y2hEZXRhY2hlZEZyb21XaW5kb3coKSB7Ci0gICAgICAgIC8vIElmIHdlIHN0aWxsIGhhdmUgYSBtb3Rpb24gdGFyZ2V0LCB3ZSBhcmUgc3RpbGwgaW4gdGhlIHByb2Nlc3Mgb2YKKyAgICAgICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBhIHRvdWNoIHRhcmdldCwgd2UgYXJlIHN0aWxsIGluIHRoZSBwcm9jZXNzIG9mCiAgICAgICAgIC8vIGRpc3BhdGNoaW5nIG1vdGlvbiBldmVudHMgdG8gYSBjaGlsZDsgd2UgbmVlZCB0byBnZXQgcmlkIG9mIHRoYXQKICAgICAgICAgLy8gY2hpbGQgdG8gYXZvaWQgZGlzcGF0Y2hpbmcgZXZlbnRzIHRvIGl0IGFmdGVyIHRoZSB3aW5kb3cgaXMgdG9ybgogICAgICAgICAvLyBkb3duLiBUbyBtYWtlIHN1cmUgd2Uga2VlcCB0aGUgY2hpbGQgaW4gYSBjb25zaXN0ZW50IHN0YXRlLCB3ZQogICAgICAgICAvLyBmaXJzdCBzZW5kIGl0IGFuIEFDVElPTl9DQU5DRUwgbW90aW9uIGV2ZW50LgotICAgICAgICBpZiAobU1vdGlvblRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICAgICAgZmluYWwgTW90aW9uRXZlbnQgZXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4obm93LCBub3csCi0gICAgICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwsIDAuMGYsIDAuMGYsIDApOwotICAgICAgICAgICAgbU1vdGlvblRhcmdldC5kaXNwYXRjaFRvdWNoRXZlbnQoZXZlbnQpOwotICAgICAgICAgICAgZXZlbnQucmVjeWNsZSgpOwotICAgICAgICAgICAgbU1vdGlvblRhcmdldCA9IG51bGw7Ci0gICAgICAgIH0KKyAgICAgICAgY2FuY2VsQW5kQ2xlYXJUb3VjaFRhcmdldHMobnVsbCk7CiAKICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CiAgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKQEAgLTExODcsNyArMTc5MSwxMCBAQAogICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtQ2hpbGRyZW5Db3VudDsKICAgICAgICAgZmluYWwgVmlld1tdIGNoaWxkcmVuID0gbUNoaWxkcmVuOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGNoaWxkcmVuW2ldLmRpc3BhdGNoU2F2ZUluc3RhbmNlU3RhdGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgIFZpZXcgYyA9IGNoaWxkcmVuW2ldOworICAgICAgICAgICAgaWYgKChjLm1WaWV3RmxhZ3MgJiBQQVJFTlRfU0FWRV9ESVNBQkxFRF9NQVNLKSAhPSBQQVJFTlRfU0FWRV9ESVNBQkxFRCkgeworICAgICAgICAgICAgICAgIGMuZGlzcGF0Y2hTYXZlSW5zdGFuY2VTdGF0ZShjb250YWluZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjEyLDcgKzE4MTksMTAgQEAKICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CiAgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGlsZHJlbltpXS5kaXNwYXRjaFJlc3RvcmVJbnN0YW5jZVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICBWaWV3IGMgPSBjaGlsZHJlbltpXTsKKyAgICAgICAgICAgIGlmICgoYy5tVmlld0ZsYWdzICYgUEFSRU5UX1NBVkVfRElTQUJMRURfTUFTSykgIT0gUEFSRU5UX1NBVkVfRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBjLmRpc3BhdGNoUmVzdG9yZUluc3RhbmNlU3RhdGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTQ4MiwyMiArMjA5MiwyNCBAQAogICAgICAgICBmaW5hbCBpbnQgZmxhZ3MgPSBtR3JvdXBGbGFnczsKIAogICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19DTEVBUl9UUkFOU0ZPUk1BVElPTikgPT0gRkxBR19DTEVBUl9UUkFOU0ZPUk1BVElPTikgewotICAgICAgICAgICAgaWYgKG1DaGlsZFRyYW5zZm9ybWF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ2hpbGRUcmFuc2Zvcm1hdGlvbi5jbGVhcigpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNoaWxkVHJhbnNmb3JtYXRpb24uY2xlYXIoKTsKICAgICAgICAgICAgIG1Hcm91cEZsYWdzICY9IH5GTEFHX0NMRUFSX1RSQU5TRk9STUFUSU9OOwogICAgICAgICB9CiAKICAgICAgICAgVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtVG9BcHBseSA9IG51bGw7CisgICAgICAgIFRyYW5zZm9ybWF0aW9uIGludmFsaWRhdGlvblRyYW5zZm9ybTsKICAgICAgICAgZmluYWwgQW5pbWF0aW9uIGEgPSBjaGlsZC5nZXRBbmltYXRpb24oKTsKICAgICAgICAgYm9vbGVhbiBjb25jYXRNYXRyaXggPSBmYWxzZTsKIAotICAgICAgICBpZiAoYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobUludmFsaWRhdGVSZWdpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRlUmVnaW9uID0gbmV3IFJlY3RGKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBSZWN0RiByZWdpb24gPSBtSW52YWxpZGF0ZVJlZ2lvbjsKKyAgICAgICAgYm9vbGVhbiBzY2FsaW5nUmVxdWlyZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBjYWNoaW5nID0gZmFsc2U7CisgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0NISUxEUkVOX0RSQVdOX1dJVEhfQ0FDSEUpID09IEZMQUdfQ0hJTERSRU5fRFJBV05fV0lUSF9DQUNIRSB8fAorICAgICAgICAgICAgICAgIChmbGFncyAmIEZMQUdfQUxXQVlTX0RSQVdOX1dJVEhfQ0FDSEUpID09IEZMQUdfQUxXQVlTX0RSQVdOX1dJVEhfQ0FDSEUpIHsKKyAgICAgICAgICAgIGNhY2hpbmcgPSB0cnVlOworICAgICAgICAgICAgaWYgKG1BdHRhY2hJbmZvICE9IG51bGwpIHNjYWxpbmdSZXF1aXJlZCA9IG1BdHRhY2hJbmZvLm1TY2FsaW5nUmVxdWlyZWQ7CisgICAgICAgIH0KIAorICAgICAgICBpZiAoYSAhPSBudWxsKSB7CiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGluaXRpYWxpemVkID0gYS5pc0luaXRpYWxpemVkKCk7CiAgICAgICAgICAgICBpZiAoIWluaXRpYWxpemVkKSB7CiAgICAgICAgICAgICAgICAgYS5pbml0aWFsaXplKGNyIC0gY2wsIGNiIC0gY3QsIGdldFdpZHRoKCksIGdldEhlaWdodCgpKTsKQEAgLTE1MDUsMTAgKzIxMTcsMTcgQEAKICAgICAgICAgICAgICAgICBjaGlsZC5vbkFuaW1hdGlvblN0YXJ0KCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChtQ2hpbGRUcmFuc2Zvcm1hdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNoaWxkVHJhbnNmb3JtYXRpb24gPSBuZXcgVHJhbnNmb3JtYXRpb24oKTsKKyAgICAgICAgICAgIG1vcmUgPSBhLmdldFRyYW5zZm9ybWF0aW9uKGRyYXdpbmdUaW1lLCBtQ2hpbGRUcmFuc2Zvcm1hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgc2NhbGluZ1JlcXVpcmVkID8gbUF0dGFjaEluZm8ubUFwcGxpY2F0aW9uU2NhbGUgOiAxZik7CisgICAgICAgICAgICBpZiAoc2NhbGluZ1JlcXVpcmVkICYmIG1BdHRhY2hJbmZvLm1BcHBsaWNhdGlvblNjYWxlICE9IDFmKSB7CisgICAgICAgICAgICAgICAgaWYgKG1JbnZhbGlkYXRpb25UcmFuc2Zvcm1hdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRpb25UcmFuc2Zvcm1hdGlvbiA9IG5ldyBUcmFuc2Zvcm1hdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRpb25UcmFuc2Zvcm0gPSBtSW52YWxpZGF0aW9uVHJhbnNmb3JtYXRpb247CisgICAgICAgICAgICAgICAgYS5nZXRUcmFuc2Zvcm1hdGlvbihkcmF3aW5nVGltZSwgaW52YWxpZGF0aW9uVHJhbnNmb3JtLCAxZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludmFsaWRhdGlvblRyYW5zZm9ybSA9IG1DaGlsZFRyYW5zZm9ybWF0aW9uOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbW9yZSA9IGEuZ2V0VHJhbnNmb3JtYXRpb24oZHJhd2luZ1RpbWUsIG1DaGlsZFRyYW5zZm9ybWF0aW9uKTsKICAgICAgICAgICAgIHRyYW5zZm9ybVRvQXBwbHkgPSBtQ2hpbGRUcmFuc2Zvcm1hdGlvbjsKIAogICAgICAgICAgICAgY29uY2F0TWF0cml4ID0gYS53aWxsQ2hhbmdlVHJhbnNmb3JtYXRpb25NYXRyaXgoKTsKQEAgLTE1MjUsNyArMjE0NCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZShjbCwgY3QsIGNyLCBjYik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhLmdldEludmFsaWRhdGVSZWdpb24oMCwgMCwgY3IgLSBjbCwgY2IgLSBjdCwgcmVnaW9uLCB0cmFuc2Zvcm1Ub0FwcGx5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1JbnZhbGlkYXRlUmVnaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRlUmVnaW9uID0gbmV3IFJlY3RGKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVjdEYgcmVnaW9uID0gbUludmFsaWRhdGVSZWdpb247CisgICAgICAgICAgICAgICAgICAgIGEuZ2V0SW52YWxpZGF0ZVJlZ2lvbigwLCAwLCBjciAtIGNsLCBjYiAtIGN0LCByZWdpb24sIGludmFsaWRhdGlvblRyYW5zZm9ybSk7CiAKICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNoaWxkIG5lZWQgdG8gZHJhdyBhbiBhbmltYXRpb24sIHBvdGVudGlhbGx5IG9mZnNjcmVlbiwgc28KICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGRvIG5vdCBjYW5jZWwgaW52YWxpZGF0ZSByZXF1ZXN0cwpAQCAtMTUzOCw5ICsyMTYxLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBGTEFHX1NVUFBPUlRfU1RBVElDX1RSQU5TRk9STUFUSU9OUykgPT0KICAgICAgICAgICAgICAgICBGTEFHX1NVUFBPUlRfU1RBVElDX1RSQU5TRk9STUFUSU9OUykgewotICAgICAgICAgICAgaWYgKG1DaGlsZFRyYW5zZm9ybWF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ2hpbGRUcmFuc2Zvcm1hdGlvbiA9IG5ldyBUcmFuc2Zvcm1hdGlvbigpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNUcmFuc2Zvcm0gPSBnZXRDaGlsZFN0YXRpY1RyYW5zZm9ybWF0aW9uKGNoaWxkLCBtQ2hpbGRUcmFuc2Zvcm1hdGlvbik7CiAgICAgICAgICAgICBpZiAoaGFzVHJhbnNmb3JtKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRyYW5zZm9ybVR5cGUgPSBtQ2hpbGRUcmFuc2Zvcm1hdGlvbi5nZXRUcmFuc2Zvcm1hdGlvblR5cGUoKTsKQEAgLTE1NTAsNiArMjE3MCw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBjb25jYXRNYXRyaXggfD0gIWNoaWxkLmhhc0lkZW50aXR5TWF0cml4KCk7CisKICAgICAgICAgLy8gU2V0cyB0aGUgZmxhZyBhcyBlYXJseSBhcyBwb3NzaWJsZSB0byBhbGxvdyBkcmF3KCkgaW1wbGVtZW50YXRpb25zCiAgICAgICAgIC8vIHRvIGNhbGwgaW52YWxpZGF0ZSgpIHN1Y2Nlc3NmdWxseSB3aGVuIGRvaW5nIGFuaW1hdGlvbnMKICAgICAgICAgY2hpbGQubVByaXZhdGVGbGFncyB8PSBEUkFXTjsKQEAgLTE1NjQsMTUgKzIxODYsMTkgQEAKICAgICAgICAgZmluYWwgaW50IHN4ID0gY2hpbGQubVNjcm9sbFg7CiAgICAgICAgIGZpbmFsIGludCBzeSA9IGNoaWxkLm1TY3JvbGxZOwogCi0gICAgICAgIGJvb2xlYW4gc2NhbGluZ1JlcXVpcmVkID0gZmFsc2U7CisgICAgICAgIERpc3BsYXlMaXN0IGRpc3BsYXlMaXN0ID0gbnVsbDsKICAgICAgICAgQml0bWFwIGNhY2hlID0gbnVsbDsKLSAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfQ0hJTERSRU5fRFJBV05fV0lUSF9DQUNIRSkgPT0gRkxBR19DSElMRFJFTl9EUkFXTl9XSVRIX0NBQ0hFIHx8Ci0gICAgICAgICAgICAgICAgKGZsYWdzICYgRkxBR19BTFdBWVNfRFJBV05fV0lUSF9DQUNIRSkgPT0gRkxBR19BTFdBWVNfRFJBV05fV0lUSF9DQUNIRSkgewotICAgICAgICAgICAgY2FjaGUgPSBjaGlsZC5nZXREcmF3aW5nQ2FjaGUodHJ1ZSk7Ci0gICAgICAgICAgICBpZiAobUF0dGFjaEluZm8gIT0gbnVsbCkgc2NhbGluZ1JlcXVpcmVkID0gbUF0dGFjaEluZm8ubVNjYWxpbmdSZXF1aXJlZDsKKyAgICAgICAgaWYgKGNhY2hpbmcpIHsKKyAgICAgICAgICAgIGlmICghY2FudmFzLmlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpKSB7CisgICAgICAgICAgICAgICAgY2FjaGUgPSBjaGlsZC5nZXREcmF3aW5nQ2FjaGUodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGJyaW5nIGJhY2sKKyAgICAgICAgICAgICAgICAvLyBkaXNwbGF5TGlzdCA9IGNoaWxkLmdldERpc3BsYXlMaXN0KCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBmaW5hbCBib29sZWFuIGhhc05vQ2FjaGUgPSBjYWNoZSA9PSBudWxsOworICAgICAgICBmaW5hbCBib29sZWFuIGhhc0Rpc3BsYXlMaXN0ID0gZGlzcGxheUxpc3QgIT0gbnVsbCAmJiBkaXNwbGF5TGlzdC5pc1JlYWR5KCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFzTm9DYWNoZSA9IGNhY2hlID09IG51bGwgfHwgaGFzRGlzcGxheUxpc3Q7CiAKICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVUbyA9IGNhbnZhcy5zYXZlKCk7CiAgICAgICAgIGlmIChoYXNOb0NhY2hlKSB7CkBAIC0xNTg2LDQwICsyMjEyLDYwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBmbG9hdCBhbHBoYSA9IDEuMGY7CisgICAgICAgIGZsb2F0IGFscGhhID0gY2hpbGQuZ2V0QWxwaGEoKTsKIAotICAgICAgICBpZiAodHJhbnNmb3JtVG9BcHBseSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY29uY2F0TWF0cml4KSB7Ci0gICAgICAgICAgICAgICAgaW50IHRyYW5zWCA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IHRyYW5zWSA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKGhhc05vQ2FjaGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNYID0gLXN4OwotICAgICAgICAgICAgICAgICAgICB0cmFuc1kgPSAtc3k7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFVuZG8gdGhlIHNjcm9sbCB0cmFuc2xhdGlvbiwgYXBwbHkgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAvLyB0aGVuIHJlZG8gdGhlIHNjcm9sbCB0cmFuc2xhdGUgdG8gZ2V0IHRoZSBjb3JyZWN0IHJlc3VsdC4KLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC10cmFuc1gsIC10cmFuc1kpOwotICAgICAgICAgICAgICAgIGNhbnZhcy5jb25jYXQodHJhbnNmb3JtVG9BcHBseS5nZXRNYXRyaXgoKSk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSh0cmFuc1gsIHRyYW5zWSk7Ci0gICAgICAgICAgICAgICAgbUdyb3VwRmxhZ3MgfD0gRkxBR19DTEVBUl9UUkFOU0ZPUk1BVElPTjsKKyAgICAgICAgaWYgKHRyYW5zZm9ybVRvQXBwbHkgIT0gbnVsbCB8fCBhbHBoYSA8IDEuMGYgfHwgIWNoaWxkLmhhc0lkZW50aXR5TWF0cml4KCkpIHsKKyAgICAgICAgICAgIGludCB0cmFuc1ggPSAwOworICAgICAgICAgICAgaW50IHRyYW5zWSA9IDA7CisKKyAgICAgICAgICAgIGlmIChoYXNOb0NhY2hlKSB7CisgICAgICAgICAgICAgICAgdHJhbnNYID0gLXN4OworICAgICAgICAgICAgICAgIHRyYW5zWSA9IC1zeTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYWxwaGEgPSB0cmFuc2Zvcm1Ub0FwcGx5LmdldEFscGhhKCk7CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtVG9BcHBseSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbmNhdE1hdHJpeCkgeworICAgICAgICAgICAgICAgICAgICAvLyBVbmRvIHRoZSBzY3JvbGwgdHJhbnNsYXRpb24sIGFwcGx5IHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gcmVkbyB0aGUgc2Nyb2xsIHRyYW5zbGF0ZSB0byBnZXQgdGhlIGNvcnJlY3QgcmVzdWx0LgorICAgICAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC10cmFuc1gsIC10cmFuc1kpOworICAgICAgICAgICAgICAgICAgICBjYW52YXMuY29uY2F0KHRyYW5zZm9ybVRvQXBwbHkuZ2V0TWF0cml4KCkpOworICAgICAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKHRyYW5zWCwgdHJhbnNZKTsKKyAgICAgICAgICAgICAgICAgICAgbUdyb3VwRmxhZ3MgfD0gRkxBR19DTEVBUl9UUkFOU0ZPUk1BVElPTjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmbG9hdCB0cmFuc2Zvcm1BbHBoYSA9IHRyYW5zZm9ybVRvQXBwbHkuZ2V0QWxwaGEoKTsKKyAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtQWxwaGEgPCAxLjBmKSB7CisgICAgICAgICAgICAgICAgICAgIGFscGhhICo9IHRyYW5zZm9ybVRvQXBwbHkuZ2V0QWxwaGEoKTsKKyAgICAgICAgICAgICAgICAgICAgbUdyb3VwRmxhZ3MgfD0gRkxBR19DTEVBUl9UUkFOU0ZPUk1BVElPTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghY2hpbGQuaGFzSWRlbnRpdHlNYXRyaXgoKSkgeworICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXRyYW5zWCwgLXRyYW5zWSk7CisgICAgICAgICAgICAgICAgY2FudmFzLmNvbmNhdChjaGlsZC5nZXRNYXRyaXgoKSk7CisgICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSh0cmFuc1gsIHRyYW5zWSk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChhbHBoYSA8IDEuMGYpIHsKICAgICAgICAgICAgICAgICBtR3JvdXBGbGFncyB8PSBGTEFHX0NMRUFSX1RSQU5TRk9STUFUSU9OOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYWxwaGEgPCAxLjBmICYmIGhhc05vQ2FjaGUpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbXVsdGlwbGllZEFscGhhID0gKGludCkgKDI1NSAqIGFscGhhKTsKLSAgICAgICAgICAgICAgICBpZiAoIWNoaWxkLm9uU2V0QWxwaGEobXVsdGlwbGllZEFscGhhKSkgewotICAgICAgICAgICAgICAgICAgICBjYW52YXMuc2F2ZUxheWVyQWxwaGEoc3gsIHN5LCBzeCArIGNyIC0gY2wsIHN5ICsgY2IgLSBjdCwgbXVsdGlwbGllZEFscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhcy5IQVNfQUxQSEFfTEFZRVJfU0FWRV9GTEFHIHwgQ2FudmFzLkNMSVBfVE9fTEFZRVJfU0FWRV9GTEFHKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjaGlsZC5tUHJpdmF0ZUZsYWdzIHw9IEFMUEhBX1NFVDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChoYXNOb0NhY2hlKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBtdWx0aXBsaWVkQWxwaGEgPSAoaW50KSAoMjU1ICogYWxwaGEpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkLm9uU2V0QWxwaGEobXVsdGlwbGllZEFscGhhKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxheWVyRmxhZ3MgPSBDYW52YXMuSEFTX0FMUEhBX0xBWUVSX1NBVkVfRkxBRzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0NMSVBfQ0hJTERSRU4pID09IEZMQUdfQ0xJUF9DSElMRFJFTikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyRmxhZ3MgfD0gQ2FudmFzLkNMSVBfVE9fTEFZRVJfU0FWRV9GTEFHOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLnNhdmVMYXllckFscGhhKHN4LCBzeSwgc3ggKyBjciAtIGNsLCBzeSArIGNiIC0gY3QsIG11bHRpcGxpZWRBbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJGbGFncyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5tUHJpdmF0ZUZsYWdzIHw9IEFMUEhBX1NFVDsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmICgoY2hpbGQubVByaXZhdGVGbGFncyAmIEFMUEhBX1NFVCkgPT0gQUxQSEFfU0VUKSB7CiAgICAgICAgICAgICBjaGlsZC5vblNldEFscGhhKDI1NSk7CisgICAgICAgICAgICBjaGlsZC5tUHJpdmF0ZUZsYWdzICY9IH5BTFBIQV9TRVQ7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19DTElQX0NISUxEUkVOKSA9PSBGTEFHX0NMSVBfQ0hJTERSRU4pIHsKQEAgLTE2MzUsMTcgKzIyODEsMjEgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChoYXNOb0NhY2hlKSB7Ci0gICAgICAgICAgICAvLyBGYXN0IHBhdGggZm9yIGxheW91dHMgd2l0aCBubyBiYWNrZ3JvdW5kcwotICAgICAgICAgICAgaWYgKChjaGlsZC5tUHJpdmF0ZUZsYWdzICYgU0tJUF9EUkFXKSA9PSBTS0lQX0RSQVcpIHsKLSAgICAgICAgICAgICAgICBpZiAoVmlld0RlYnVnLlRSQUNFX0hJRVJBUkNIWSkgewotICAgICAgICAgICAgICAgICAgICBWaWV3RGVidWcudHJhY2UodGhpcywgVmlld0RlYnVnLkhpZXJhcmNoeVRyYWNlVHlwZS5EUkFXKTsKKyAgICAgICAgICAgIGlmICghaGFzRGlzcGxheUxpc3QpIHsKKyAgICAgICAgICAgICAgICAvLyBGYXN0IHBhdGggZm9yIGxheW91dHMgd2l0aCBubyBiYWNrZ3JvdW5kcworICAgICAgICAgICAgICAgIGlmICgoY2hpbGQubVByaXZhdGVGbGFncyAmIFNLSVBfRFJBVykgPT0gU0tJUF9EUkFXKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChWaWV3RGVidWcuVFJBQ0VfSElFUkFSQ0hZKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBWaWV3RGVidWcudHJhY2UodGhpcywgVmlld0RlYnVnLkhpZXJhcmNoeVRyYWNlVHlwZS5EUkFXKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjaGlsZC5tUHJpdmF0ZUZsYWdzICY9IH5ESVJUWV9NQVNLOworICAgICAgICAgICAgICAgICAgICBjaGlsZC5kaXNwYXRjaERyYXcoY2FudmFzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjaGlsZC5kcmF3KGNhbnZhcyk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNoaWxkLm1Qcml2YXRlRmxhZ3MgJj0gfkRJUlRZX01BU0s7Ci0gICAgICAgICAgICAgICAgY2hpbGQuZGlzcGF0Y2hEcmF3KGNhbnZhcyk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNoaWxkLmRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgICAgICAoKEhhcmR3YXJlQ2FudmFzKSBjYW52YXMpLmRyYXdEaXNwbGF5TGlzdChkaXNwbGF5TGlzdCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIH0gZWxzZSBpZiAoY2FjaGUgIT0gbnVsbCkgewogICAgICAgICAgICAgZmluYWwgUGFpbnQgY2FjaGVQYWludCA9IG1DYWNoZVBhaW50OwogICAgICAgICAgICAgaWYgKGFscGhhIDwgMS4wZikgewogICAgICAgICAgICAgICAgIGNhY2hlUGFpbnQuc2V0QWxwaGEoKGludCkgKGFscGhhICogMjU1KSk7CkBAIC0xNjU0LDkgKzIzMDQsNiBAQAogICAgICAgICAgICAgICAgIGNhY2hlUGFpbnQuc2V0QWxwaGEoMjU1KTsKICAgICAgICAgICAgICAgICBtR3JvdXBGbGFncyAmPSB+RkxBR19BTFBIQV9MT1dFUl9USEFOX09ORTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcgJiYgVmlld0RlYnVnLnByb2ZpbGVEcmF3aW5nKSB7Ci0gICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudCg2MDAwMywgaGFzaENvZGUoKSk7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChjYWNoZSwgMC4wZiwgMC4wZiwgY2FjaGVQYWludCk7CiAgICAgICAgIH0KIApAQCAtMTcwMiwxMCArMjM0OSwyNCBAQAogICAgICAgICBmaW5hbCBWaWV3W10gY2hpbGRyZW4gPSBtQ2hpbGRyZW47CiAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DaGlsZHJlbkNvdW50OwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIAogICAgICAgICAgICAgY2hpbGRyZW5baV0uc2V0U2VsZWN0ZWQoc2VsZWN0ZWQpOwogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoU2V0QWN0aXZhdGVkKGJvb2xlYW4gYWN0aXZhdGVkKSB7CisgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCisgICAgICAgICAgICBjaGlsZHJlbltpXS5zZXRBY3RpdmF0ZWQoYWN0aXZhdGVkKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGRpc3BhdGNoU2V0UHJlc3NlZChib29sZWFuIHByZXNzZWQpIHsKICAgICAgICAgZmluYWwgVmlld1tdIGNoaWxkcmVuID0gbUNoaWxkcmVuOwpAQCAtMTk3Nyw2ICsyNjM4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICJZb3UgbXVzdCBjYWxsIHJlbW92ZVZpZXcoKSBvbiB0aGUgY2hpbGQncyBwYXJlbnQgZmlyc3QuIik7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobVRyYW5zaXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgbVRyYW5zaXRpb24uYWRkQ2hpbGQodGhpcywgY2hpbGQpOworICAgICAgICB9CisKICAgICAgICAgaWYgKCFjaGVja0xheW91dFBhcmFtcyhwYXJhbXMpKSB7CiAgICAgICAgICAgICBwYXJhbXMgPSBnZW5lcmF0ZUxheW91dFBhcmFtcyhwYXJhbXMpOwogICAgICAgICB9CkBAIC0yMDU0LDcgKzI3MTksOSBAQAogICAgIC8vIFRoaXMgbWV0aG9kIGFsc28gc2V0cyB0aGUgY2hpbGQncyBtUGFyZW50IHRvIG51bGwKICAgICBwcml2YXRlIHZvaWQgcmVtb3ZlRnJvbUFycmF5KGludCBpbmRleCkgewogICAgICAgICBmaW5hbCBWaWV3W10gY2hpbGRyZW4gPSBtQ2hpbGRyZW47Ci0gICAgICAgIGNoaWxkcmVuW2luZGV4XS5tUGFyZW50ID0gbnVsbDsKKyAgICAgICAgaWYgKCEobVRyYW5zaXRpb25pbmdWaWV3cyAhPSBudWxsICYmIG1UcmFuc2l0aW9uaW5nVmlld3MuY29udGFpbnMoY2hpbGRyZW5baW5kZXhdKSkpIHsKKyAgICAgICAgICAgIGNoaWxkcmVuW2luZGV4XS5tUGFyZW50ID0gbnVsbDsKKyAgICAgICAgfQogICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtQ2hpbGRyZW5Db3VudDsKICAgICAgICAgaWYgKGluZGV4ID09IGNvdW50IC0gMSkgewogICAgICAgICAgICAgY2hpbGRyZW5bLS1tQ2hpbGRyZW5Db3VudF0gPSBudWxsOwpAQCAtMjE4OSwxMyArMjg1NiwxOSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCByZW1vdmVWaWV3SW50ZXJuYWwoaW50IGluZGV4LCBWaWV3IHZpZXcpIHsKKworICAgICAgICBpZiAobVRyYW5zaXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgbVRyYW5zaXRpb24ucmVtb3ZlQ2hpbGQodGhpcywgdmlldyk7CisgICAgICAgIH0KKwogICAgICAgICBib29sZWFuIGNsZWFyQ2hpbGRGb2N1cyA9IGZhbHNlOwogICAgICAgICBpZiAodmlldyA9PSBtRm9jdXNlZCkgewogICAgICAgICAgICAgdmlldy5jbGVhckZvY3VzRm9yUmVtb3ZhbCgpOwogICAgICAgICAgICAgY2xlYXJDaGlsZEZvY3VzID0gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh2aWV3LmdldEFuaW1hdGlvbigpICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHZpZXcuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCB8fAorICAgICAgICAgICAgICAgIChtVHJhbnNpdGlvbmluZ1ZpZXdzICE9IG51bGwgJiYgbVRyYW5zaXRpb25pbmdWaWV3cy5jb250YWlucyh2aWV3KSkpIHsKICAgICAgICAgICAgIGFkZERpc2FwcGVhcmluZ1ZpZXcodmlldyk7CiAgICAgICAgIH0gZWxzZSBpZiAodmlldy5tQXR0YWNoSW5mbyAhPSBudWxsKSB7CiAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2hEZXRhY2hlZEZyb21XaW5kb3coKTsKQEAgLTIyMTQsNiArMjg4NywzOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgTGF5b3V0VHJhbnNpdGlvbiBvYmplY3QgZm9yIHRoaXMgVmlld0dyb3VwLiBJZiB0aGUgTGF5b3V0VHJhbnNpdGlvbiBvYmplY3QgaXMKKyAgICAgKiBub3QgbnVsbCwgY2hhbmdlcyBpbiBsYXlvdXQgd2hpY2ggb2NjdXIgYmVjYXVzZSBvZiBjaGlsZHJlbiBiZWluZyBhZGRlZCB0byBvciByZW1vdmVkIGZyb20KKyAgICAgKiB0aGUgVmlld0dyb3VwIHdpbGwgYmUgYW5pbWF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBhbmltYXRpb25zIGRlZmluZWQgaW4gdGhhdCBMYXlvdXRUcmFuc2l0aW9uCisgICAgICogb2JqZWN0LiBCeSBkZWZhdWx0LCB0aGUgdHJhbnNpdGlvbiBvYmplY3QgaXMgbnVsbCAoc28gbGF5b3V0IGNoYW5nZXMgYXJlIG5vdCBhbmltYXRlZCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNpdGlvbiBUaGUgTGF5b3V0VHJhbnNpdGlvbiBvYmplY3QgdGhhdCB3aWxsIGFuaW1hdGVkIGNoYW5nZXMgaW4gbGF5b3V0LiBBIHZhbHVlCisgICAgICogb2YgPGNvZGU+bnVsbDwvY29kZT4gbWVhbnMgbm8gdHJhbnNpdGlvbiB3aWxsIHJ1biBvbiBsYXlvdXQgY2hhbmdlcy4KKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3R3JvdXBfYW5pbWF0ZUxheW91dENoYW5nZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMYXlvdXRUcmFuc2l0aW9uKExheW91dFRyYW5zaXRpb24gdHJhbnNpdGlvbikgeworICAgICAgICBpZiAobVRyYW5zaXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgbVRyYW5zaXRpb24ucmVtb3ZlVHJhbnNpdGlvbkxpc3RlbmVyKG1MYXlvdXRUcmFuc2l0aW9uTGlzdGVuZXIpOworICAgICAgICB9CisgICAgICAgIG1UcmFuc2l0aW9uID0gdHJhbnNpdGlvbjsKKyAgICAgICAgaWYgKG1UcmFuc2l0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UcmFuc2l0aW9uLmFkZFRyYW5zaXRpb25MaXN0ZW5lcihtTGF5b3V0VHJhbnNpdGlvbkxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIExheW91dFRyYW5zaXRpb24gb2JqZWN0IGZvciB0aGlzIFZpZXdHcm91cC4gSWYgdGhlIExheW91dFRyYW5zaXRpb24gb2JqZWN0IGlzCisgICAgICogbm90IG51bGwsIGNoYW5nZXMgaW4gbGF5b3V0IHdoaWNoIG9jY3VyIGJlY2F1c2Ugb2YgY2hpbGRyZW4gYmVpbmcgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tCisgICAgICogdGhlIFZpZXdHcm91cCB3aWxsIGJlIGFuaW1hdGVkIGFjY29yZGluZyB0byB0aGUgYW5pbWF0aW9ucyBkZWZpbmVkIGluIHRoYXQgTGF5b3V0VHJhbnNpdGlvbgorICAgICAqIG9iamVjdC4gQnkgZGVmYXVsdCwgdGhlIHRyYW5zaXRpb24gb2JqZWN0IGlzIG51bGwgKHNvIGxheW91dCBjaGFuZ2VzIGFyZSBub3QgYW5pbWF0ZWQpLgorICAgICAqCisgICAgICogQHJldHVybiBMYXlvdXRUcmFuc3Rpb24gVGhlIExheW91dFRyYW5zaXRpb24gb2JqZWN0IHRoYXQgd2lsbCBhbmltYXRlZCBjaGFuZ2VzIGluIGxheW91dC4KKyAgICAgKiBBIHZhbHVlIG9mIDxjb2RlPm51bGw8L2NvZGU+IG1lYW5zIG5vIHRyYW5zaXRpb24gd2lsbCBydW4gb24gbGF5b3V0IGNoYW5nZXMuCisgICAgICovCisgICAgcHVibGljIExheW91dFRyYW5zaXRpb24gZ2V0TGF5b3V0VHJhbnNpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1UcmFuc2l0aW9uOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCByZW1vdmVWaWV3c0ludGVybmFsKGludCBzdGFydCwgaW50IGNvdW50KSB7CiAgICAgICAgIGZpbmFsIE9uSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXIgb25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lciA9IG1PbkhpZXJhcmNoeUNoYW5nZUxpc3RlbmVyOwogICAgICAgICBmaW5hbCBib29sZWFuIG5vdGlmeUxpc3RlbmVyID0gb25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lciAhPSBudWxsOwpAQCAtMjIyNywxMiArMjkzMywxNyBAQAogICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gY2hpbGRyZW5baV07CiAKKyAgICAgICAgICAgIGlmIChtVHJhbnNpdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRyYW5zaXRpb24ucmVtb3ZlQ2hpbGQodGhpcywgdmlldyk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmICh2aWV3ID09IGZvY3VzZWQpIHsKICAgICAgICAgICAgICAgICB2aWV3LmNsZWFyRm9jdXNGb3JSZW1vdmFsKCk7CiAgICAgICAgICAgICAgICAgY2xlYXJDaGlsZEZvY3VzID0gdmlldzsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHZpZXcuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHZpZXcuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCB8fAorICAgICAgICAgICAgICAgIChtVHJhbnNpdGlvbmluZ1ZpZXdzICE9IG51bGwgJiYgbVRyYW5zaXRpb25pbmdWaWV3cy5jb250YWlucyh2aWV3KSkpIHsKICAgICAgICAgICAgICAgICBhZGREaXNhcHBlYXJpbmdWaWV3KHZpZXcpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChkZXRhY2gpIHsKICAgICAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2hEZXRhY2hlZEZyb21XaW5kb3coKTsKQEAgLTIyOTEsMTIgKzMwMDIsMTcgQEAKICAgICAgICAgZm9yIChpbnQgaSA9IGNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IGNoaWxkcmVuW2ldOwogCisgICAgICAgICAgICBpZiAobVRyYW5zaXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1UcmFuc2l0aW9uLnJlbW92ZUNoaWxkKHRoaXMsIHZpZXcpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAodmlldyA9PSBmb2N1c2VkKSB7CiAgICAgICAgICAgICAgICAgdmlldy5jbGVhckZvY3VzRm9yUmVtb3ZhbCgpOwogICAgICAgICAgICAgICAgIGNsZWFyQ2hpbGRGb2N1cyA9IHZpZXc7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICh2aWV3LmdldEFuaW1hdGlvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh2aWV3LmdldEFuaW1hdGlvbigpICE9IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgKG1UcmFuc2l0aW9uaW5nVmlld3MgIT0gbnVsbCAmJiBtVHJhbnNpdGlvbmluZ1ZpZXdzLmNvbnRhaW5zKHZpZXcpKSkgewogICAgICAgICAgICAgICAgIGFkZERpc2FwcGVhcmluZ1ZpZXcodmlldyk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGRldGFjaCkgewogICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaERldGFjaGVkRnJvbVdpbmRvdygpOwpAQCAtMjMyOSwxMSArMzA0NSwxNiBAQAogICAgICAqIEBzZWUgI2RldGFjaFZpZXdGcm9tUGFyZW50KGludCkKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVEZXRhY2hlZFZpZXcoVmlldyBjaGlsZCwgYm9vbGVhbiBhbmltYXRlKSB7CisgICAgICAgIGlmIChtVHJhbnNpdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtVHJhbnNpdGlvbi5yZW1vdmVDaGlsZCh0aGlzLCBjaGlsZCk7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoY2hpbGQgPT0gbUZvY3VzZWQpIHsKICAgICAgICAgICAgIGNoaWxkLmNsZWFyRm9jdXMoKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChhbmltYXRlICYmIGNoaWxkLmdldEFuaW1hdGlvbigpICE9IG51bGwpIHsKKyAgICAgICAgaWYgKChhbmltYXRlICYmIGNoaWxkLmdldEFuaW1hdGlvbigpICE9IG51bGwpIHx8CisgICAgICAgICAgICAgICAgKG1UcmFuc2l0aW9uaW5nVmlld3MgIT0gbnVsbCAmJiBtVHJhbnNpdGlvbmluZ1ZpZXdzLmNvbnRhaW5zKGNoaWxkKSkpIHsKICAgICAgICAgICAgIGFkZERpc2FwcGVhcmluZ1ZpZXcoY2hpbGQpOwogICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLm1BdHRhY2hJbmZvICE9IG51bGwpIHsKICAgICAgICAgICAgIGNoaWxkLmRpc3BhdGNoRGV0YWNoZWRGcm9tV2luZG93KCk7CkBAIC0yNDc1LDYgKzMxOTYsMTUgQEAKICAgICAgICAgICAgIGZpbmFsIGludFtdIGxvY2F0aW9uID0gYXR0YWNoSW5mby5tSW52YWxpZGF0ZUNoaWxkTG9jYXRpb247CiAgICAgICAgICAgICBsb2NhdGlvbltDSElMRF9MRUZUX0lOREVYXSA9IGNoaWxkLm1MZWZ0OwogICAgICAgICAgICAgbG9jYXRpb25bQ0hJTERfVE9QX0lOREVYXSA9IGNoaWxkLm1Ub3A7CisgICAgICAgICAgICBNYXRyaXggY2hpbGRNYXRyaXggPSBjaGlsZC5nZXRNYXRyaXgoKTsKKyAgICAgICAgICAgIGlmICghY2hpbGRNYXRyaXguaXNJZGVudGl0eSgpKSB7CisgICAgICAgICAgICAgICAgUmVjdEYgYm91bmRpbmdSZWN0ID0gYXR0YWNoSW5mby5tVG1wVHJhbnNmb3JtUmVjdDsKKyAgICAgICAgICAgICAgICBib3VuZGluZ1JlY3Quc2V0KGRpcnR5KTsKKyAgICAgICAgICAgICAgICBjaGlsZE1hdHJpeC5tYXBSZWN0KGJvdW5kaW5nUmVjdCk7CisgICAgICAgICAgICAgICAgZGlydHkuc2V0KChpbnQpIGJvdW5kaW5nUmVjdC5sZWZ0LCAoaW50KSBib3VuZGluZ1JlY3QudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGJvdW5kaW5nUmVjdC5yaWdodCArIDAuNWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGJvdW5kaW5nUmVjdC5ib3R0b20gKyAwLjVmKSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIElmIHRoZSBjaGlsZCBpcyBkcmF3aW5nIGFuIGFuaW1hdGlvbiwgd2Ugd2FudCB0byBjb3B5IHRoaXMgZmxhZyBvbnRvCiAgICAgICAgICAgICAvLyBvdXJzZWx2ZXMgYW5kIHRoZSBwYXJlbnQgdG8gbWFrZSBzdXJlIHRoZSBpbnZhbGlkYXRlIHJlcXVlc3QgZ29lcwpAQCAtMjUwOSw2ICszMjM5LDE4IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LmludmFsaWRhdGVDaGlsZEluUGFyZW50KGxvY2F0aW9uLCBkaXJ0eSk7CisgICAgICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBBY2NvdW50IGZvciB0cmFuc2Zvcm0gb24gY3VycmVudCBwYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgTWF0cml4IG0gPSB2aWV3LmdldE1hdHJpeCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIW0uaXNJZGVudGl0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZWN0RiBib3VuZGluZ1JlY3QgPSBhdHRhY2hJbmZvLm1UbXBUcmFuc2Zvcm1SZWN0OworICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRpbmdSZWN0LnNldChkaXJ0eSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtLm1hcFJlY3QoYm91bmRpbmdSZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcnR5LnNldCgoaW50KSBib3VuZGluZ1JlY3QubGVmdCwgKGludCkgYm91bmRpbmdSZWN0LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGJvdW5kaW5nUmVjdC5yaWdodCArIDAuNWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoYm91bmRpbmdSZWN0LmJvdHRvbSArIDAuNWYpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gd2hpbGUgKHBhcmVudCAhPSBudWxsKTsKICAgICAgICAgfQogICAgIH0KQEAgLTI4NzUsNyArMzYxNyw3IEBACiAgICAgICovCiAgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5KGNhdGVnb3J5ID0gImRyYXdpbmciLCBtYXBwaW5nID0gewogICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBQRVJTSVNURU5UX05PX0NBQ0hFLCAgICAgICAgdG8gPSAiTk9ORSIpLAotICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBQRVJTSVNURU5UX0FMTF9DQUNIRVMsICAgICAgdG8gPSAiQU5JTUFUSU9OIiksCisgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IFBFUlNJU1RFTlRfQU5JTUFUSU9OX0NBQ0hFLCB0byA9ICJBTklNQVRJT04iKSwKICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gUEVSU0lTVEVOVF9TQ1JPTExJTkdfQ0FDSEUsIHRvID0gIlNDUk9MTElORyIpLAogICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBQRVJTSVNURU5UX0FMTF9DQUNIRVMsICAgICAgdG8gPSAiQUxMIikKICAgICB9KQpAQCAtMzI4OCw2ICs0MDMwLDgwIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgdGVsbHMgdGhlIFZpZXdHcm91cCB0aGF0IHRoZSBnaXZlbiBWaWV3IG9iamVjdCwgd2hpY2ggc2hvdWxkIGhhdmUgdGhpcworICAgICAqIFZpZXdHcm91cCBhcyBpdHMgcGFyZW50LAorICAgICAqIHNob3VsZCBiZSBrZXB0IGFyb3VuZCAgKHJlLWRpc3BsYXllZCB3aGVuIHRoZSBWaWV3R3JvdXAgZHJhd3MgaXRzIGNoaWxkcmVuKSBldmVuIGlmIGl0CisgICAgICogaXMgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQuIFRoaXMgYWxsb3dzIGFuaW1hdGlvbnMsIHN1Y2ggYXMgdGhvc2UgdXNlZCBieQorICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5GcmFnbWVudH0gYW5kIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5MYXlvdXRUcmFuc2l0aW9ufSB0byBhbmltYXRlCisgICAgICogdGhlIHJlbW92YWwgb2Ygdmlld3MuIEEgY2FsbCB0byB0aGlzIG1ldGhvZCBzaG91bGQgYWx3YXlzIGJlIGFjY29tcGFuaWVkIGJ5IGEgbGF0ZXIgY2FsbAorICAgICAqIHRvIHtAbGluayAjZW5kVmlld1RyYW5zaXRpb24oVmlldyl9LCBzdWNoIGFzIGFmdGVyIGFuIGFuaW1hdGlvbiBvbiB0aGUgVmlldyBoYXMgZmluaXNoZWQsCisgICAgICogc28gdGhhdCB0aGUgVmlldyBmaW5hbGx5IGdldHMgcmVtb3ZlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2aWV3IFRoZSBWaWV3IG9iamVjdCB0byBiZSBrZXB0IHZpc2libGUgZXZlbiBpZiBpdCBnZXRzIHJlbW92ZWQgZnJvbSBpdHMgcGFyZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0Vmlld1RyYW5zaXRpb24oVmlldyB2aWV3KSB7CisgICAgICAgIGlmICh2aWV3Lm1QYXJlbnQgPT0gdGhpcykgeworICAgICAgICAgICAgaWYgKG1UcmFuc2l0aW9uaW5nVmlld3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1UcmFuc2l0aW9uaW5nVmlld3MgPSBuZXcgQXJyYXlMaXN0PFZpZXc+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVHJhbnNpdGlvbmluZ1ZpZXdzLmFkZCh2aWV3KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIGZvbGxvd2luZyBhbiBlYXJsaWVyIGNhbGwgdG8KKyAgICAgKiB7QGxpbmsgI3N0YXJ0Vmlld1RyYW5zaXRpb24oVmlldyl9LiBUaGUgZ2l2ZW4gVmlldyBpcyBmaW5hbGx5IHJlbW92ZWQgZnJvbSBpdHMgcGFyZW50CisgICAgICogYW5kIHdpbGwgbm8gbG9uZ2VyIGJlIGRpc3BsYXllZC4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGRvZXMgbm90IHBlcmZvcm0gdGhlIGZ1bmN0aW9uYWxpdHkKKyAgICAgKiBvZiByZW1vdmluZyBhIHZpZXcgZnJvbSBpdHMgcGFyZW50OyBpdCBqdXN0IGRpc2NvbnRpbnVlcyB0aGUgZGlzcGxheSBvZiBhIFZpZXcgdGhhdAorICAgICAqIGhhcyBwcmV2aW91c2x5IGJlZW4gcmVtb3ZlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdmlldyBUaGUgVmlldyBvYmplY3QgdGhhdCBoYXMgYmVlbiByZW1vdmVkIGJ1dCBpcyBiZWluZyBrZXB0IGFyb3VuZCBpbiB0aGUgdmlzaWJsZQorICAgICAqIGhpZXJhcmNoeSBieSBhbiBlYXJsaWVyIGNhbGwgdG8ge0BsaW5rICNzdGFydFZpZXdUcmFuc2l0aW9uKFZpZXcpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmRWaWV3VHJhbnNpdGlvbihWaWV3IHZpZXcpIHsKKyAgICAgICAgaWYgKG1UcmFuc2l0aW9uaW5nVmlld3MgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRyYW5zaXRpb25pbmdWaWV3cy5yZW1vdmUodmlldyk7CisgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8Vmlldz4gZGlzYXBwZWFyaW5nQ2hpbGRyZW4gPSBtRGlzYXBwZWFyaW5nQ2hpbGRyZW47CisgICAgICAgICAgICBpZiAoZGlzYXBwZWFyaW5nQ2hpbGRyZW4gIT0gbnVsbCAmJiBkaXNhcHBlYXJpbmdDaGlsZHJlbi5jb250YWlucyh2aWV3KSkgeworICAgICAgICAgICAgICAgIGRpc2FwcGVhcmluZ0NoaWxkcmVuLnJlbW92ZSh2aWV3KTsKKyAgICAgICAgICAgICAgICBpZiAobVZpc2liaWxpdHlDaGFuZ2luZ0NoaWxkcmVuICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1WaXNpYmlsaXR5Q2hhbmdpbmdDaGlsZHJlbi5jb250YWlucyh2aWV3KSkgeworICAgICAgICAgICAgICAgICAgICBtVmlzaWJpbGl0eUNoYW5naW5nQ2hpbGRyZW4ucmVtb3ZlKHZpZXcpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3Lm1BdHRhY2hJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2hEZXRhY2hlZEZyb21XaW5kb3coKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodmlldy5tUGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcubVBhcmVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUdyb3VwRmxhZ3MgfD0gRkxBR19JTlZBTElEQVRFX1JFUVVJUkVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBMYXlvdXRUcmFuc2l0aW9uLlRyYW5zaXRpb25MaXN0ZW5lciBtTGF5b3V0VHJhbnNpdGlvbkxpc3RlbmVyID0KKyAgICAgICAgICAgIG5ldyBMYXlvdXRUcmFuc2l0aW9uLlRyYW5zaXRpb25MaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0VHJhbnNpdGlvbihMYXlvdXRUcmFuc2l0aW9uIHRyYW5zaXRpb24sIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgVmlldyB2aWV3LCBpbnQgdHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgICAgIC8vIFdlIG9ubHkgY2FyZSBhYm91dCBkaXNhcHBlYXJpbmcgaXRlbXMsIHNpbmNlIHdlIG5lZWQgc3BlY2lhbCBsb2dpYyB0byBrZWVwCisgICAgICAgICAgICAvLyB0aG9zZSBpdGVtcyB2aXNpYmxlIGFmdGVyIHRoZXkndmUgYmVlbiAncmVtb3ZlZCcKKyAgICAgICAgICAgIGlmICh0cmFuc2l0aW9uVHlwZSA9PSBMYXlvdXRUcmFuc2l0aW9uLkRJU0FQUEVBUklORykgeworICAgICAgICAgICAgICAgIHN0YXJ0Vmlld1RyYW5zaXRpb24odmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW5kVHJhbnNpdGlvbihMYXlvdXRUcmFuc2l0aW9uIHRyYW5zaXRpb24sIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgVmlldyB2aWV3LCBpbnQgdHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgICAgIGlmICh0cmFuc2l0aW9uVHlwZSA9PSBMYXlvdXRUcmFuc2l0aW9uLkRJU0FQUEVBUklORyAmJiBtVHJhbnNpdGlvbmluZ1ZpZXdzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlbmRWaWV3VHJhbnNpdGlvbih2aWV3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC0zNzQ5LDQgKzQ1NjUsNTkgQEAKICAgICAgICAgICAgIGJvdHRvbU1hcmdpbiA9IGJvdHRvbTsKICAgICAgICAgfQogICAgIH0KKworICAgIC8qIERlc2NyaWJlcyBhIHRvdWNoZWQgdmlldyBhbmQgdGhlIGlkcyBvZiB0aGUgcG9pbnRlcnMgdGhhdCBpdCBoYXMgY2FwdHVyZWQuCisgICAgICoKKyAgICAgKiBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHBvaW50ZXIgaWRzIGFyZSBhbHdheXMgaW4gdGhlIHJhbmdlIDAuLjMxIHN1Y2ggdGhhdAorICAgICAqIGl0IGNhbiB1c2UgYSBiaXRmaWVsZCB0byB0cmFjayB3aGljaCBwb2ludGVyIGlkcyBhcmUgcHJlc2VudC4KKyAgICAgKiBBcyBpdCBoYXBwZW5zLCB0aGUgbG93ZXIgbGF5ZXJzIG9mIHRoZSBpbnB1dCBkaXNwYXRjaCBwaXBlbGluZSBhbHNvIHVzZSB0aGUKKyAgICAgKiBzYW1lIHRyaWNrIHNvIHRoZSBhc3N1bXB0aW9uIHNob3VsZCBiZSBzYWZlIGhlcmUuLi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBUb3VjaFRhcmdldCB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUkVDWUNMRUQgPSAzMjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IHNSZWN5Y2xlTG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVG91Y2hUYXJnZXQgc1JlY3ljbGVCaW47CisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBzUmVjeWNsZWRDb3VudDsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfUE9JTlRFUl9JRFMgPSAtMTsgLy8gYWxsIG9uZXMKKworICAgICAgICAvLyBUaGUgdG91Y2hlZCBjaGlsZCB2aWV3LgorICAgICAgICBwdWJsaWMgVmlldyBjaGlsZDsKKworICAgICAgICAvLyBUaGUgY29tYmluZWQgYml0IG1hc2sgb2YgcG9pbnRlciBpZHMgZm9yIGFsbCBwb2ludGVycyBjYXB0dXJlZCBieSB0aGUgdGFyZ2V0LgorICAgICAgICBwdWJsaWMgaW50IHBvaW50ZXJJZEJpdHM7CisKKyAgICAgICAgLy8gVGhlIG5leHQgdGFyZ2V0IGluIHRoZSB0YXJnZXQgbGlzdC4KKyAgICAgICAgcHVibGljIFRvdWNoVGFyZ2V0IG5leHQ7CisKKyAgICAgICAgcHJpdmF0ZSBUb3VjaFRhcmdldCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVG91Y2hUYXJnZXQgb2J0YWluKFZpZXcgY2hpbGQsIGludCBwb2ludGVySWRCaXRzKSB7CisgICAgICAgICAgICBmaW5hbCBUb3VjaFRhcmdldCB0YXJnZXQ7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNSZWN5Y2xlTG9jaykgeworICAgICAgICAgICAgICAgIGlmIChzUmVjeWNsZUJpbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IG5ldyBUb3VjaFRhcmdldCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHNSZWN5Y2xlQmluOworICAgICAgICAgICAgICAgICAgICBzUmVjeWNsZUJpbiA9IHRhcmdldC5uZXh0OworICAgICAgICAgICAgICAgICAgICAgc1JlY3ljbGVkQ291bnQtLTsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Lm5leHQgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhcmdldC5jaGlsZCA9IGNoaWxkOworICAgICAgICAgICAgdGFyZ2V0LnBvaW50ZXJJZEJpdHMgPSBwb2ludGVySWRCaXRzOworICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlY3ljbGUoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNSZWN5Y2xlTG9jaykgeworICAgICAgICAgICAgICAgIGlmIChzUmVjeWNsZWRDb3VudCA8IE1BWF9SRUNZQ0xFRCkgeworICAgICAgICAgICAgICAgICAgICBuZXh0ID0gc1JlY3ljbGVCaW47CisgICAgICAgICAgICAgICAgICAgIHNSZWN5Y2xlQmluID0gdGhpczsKKyAgICAgICAgICAgICAgICAgICAgc1JlY3ljbGVkQ291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdQYXJlbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1BhcmVudC5qYXZhCmluZGV4IGI0NTZjNWQuLmQ3ZDRjM2YgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1BhcmVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1BhcmVudC5qYXZhCkBAIC0xNjIsNiArMTYyLDIwIEBACiAgICAgcHVibGljIHZvaWQgY3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUgbWVudSk7CiAKICAgICAvKioKKyAgICAgKiBTdGFydCBhbiBhY3Rpb24gbW9kZSBmb3IgdGhlIHNwZWNpZmllZCB2aWV3LgorICAgICAqIDxwPgorICAgICAqIEluIG1vc3QgY2FzZXMsIGEgc3ViY2xhc3MgZG9lcyBub3QgbmVlZCB0byBvdmVycmlkZSB0aGlzLiBIb3dldmVyLCBpZiB0aGUKKyAgICAgKiBzdWJjbGFzcyBpcyBhZGRlZCBkaXJlY3RseSB0byB0aGUgd2luZG93IG1hbmFnZXIgKGZvciBleGFtcGxlLAorICAgICAqIHtAbGluayBWaWV3TWFuYWdlciNhZGRWaWV3KFZpZXcsIGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zKX0pCisgICAgICogdGhlbiBpdCBzaG91bGQgb3ZlcnJpZGUgdGhpcyBhbmQgc3RhcnQgdGhlIGFjdGlvbiBtb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIG9yaWdpbmFsVmlldyBUaGUgc291cmNlIHZpZXcgd2hlcmUgdGhlIGFjdGlvbiBtb2RlIHdhcyBmaXJzdCBpbnZva2VkCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0aGF0IHdpbGwgaGFuZGxlIGxpZmVjeWNsZSBldmVudHMgZm9yIHRoZSBhY3Rpb24gbW9kZQorICAgICAqIEByZXR1cm4gVGhlIG5ldyBhY3Rpb24gbW9kZSBpZiBpdCB3YXMgc3RhcnRlZCwgbnVsbCBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGVGb3JDaGlsZChWaWV3IG9yaWdpbmFsVmlldywgQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjayk7CisKKyAgICAvKioKICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gdGhlIHBhcmVudCB3aGVuIGEgY2hpbGQncyBkcmF3YWJsZSBzdGF0ZQogICAgICAqIGhhcyBjaGFuZ2VkLgogICAgICAqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290LmphdmEKaW5kZXggOWMyNDljZS4uMTU1MTIyZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Um9vdC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3QuamF2YQpAQCAtMjQsNiArMjQsOCBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludEY7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOwogaW1wb3J0IGFuZHJvaWQub3MuKjsKQEAgLTQ1LDYgKzQ3LDggQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbXBhdGliaWxpdHlJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGE7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50Q2FsbGJhY2tzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKQEAgLTU2LDEwICs2MCw2IEBACiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC4qOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLio7Ci1pbXBvcnQgc3RhdGljIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTAuKjsKLQogLyoqCiAgKiBUaGUgdG9wIG9mIGEgdmlldyBoaWVyYXJjaHksIGltcGxlbWVudGluZyB0aGUgbmVlZGVkIHByb3RvY29sIGJldHdlZW4gVmlldwogICogYW5kIHRoZSBXaW5kb3dNYW5hZ2VyLiAgVGhpcyBpcyBmb3IgdGhlIG1vc3QgcGFydCBhbiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbgpAQCAtNjcsMTQgKzY3LDEyIEBACiAgKgogICoge0BoaWRlfQogICovCi1AU3VwcHJlc3NXYXJuaW5ncyh7IkVtcHR5Q2F0Y2hCbG9jayJ9KQotcHVibGljIGZpbmFsIGNsYXNzIFZpZXdSb290IGV4dGVuZHMgSGFuZGxlciBpbXBsZW1lbnRzIFZpZXdQYXJlbnQsCi0gICAgICAgIFZpZXcuQXR0YWNoSW5mby5DYWxsYmFja3MgeworQFN1cHByZXNzV2FybmluZ3MoeyJFbXB0eUNhdGNoQmxvY2siLCAiUG9pbnRsZXNzQm9vbGVhbkV4cHJlc3Npb24ifSkKK3B1YmxpYyBmaW5hbCBjbGFzcyBWaWV3Um9vdCBleHRlbmRzIEhhbmRsZXIgaW1wbGVtZW50cyBWaWV3UGFyZW50LCBWaWV3LkF0dGFjaEluZm8uQ2FsbGJhY2tzIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZXdSb290IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0hPV19GUFMgPSBmYWxzZTsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkNvbnN0YW50Q29uZGl0aW9uYWxFeHByZXNzaW9uIn0pCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9MT0dWID0gZmFsc2UgPyBDb25maWcuTE9HRCA6IENvbmZpZy5MT0dWOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HViA9IGZhbHNlOwogICAgIC8qKiBAbm9pbnNwZWN0aW9uIFBvaW50bGVzc0Jvb2xlYW5FeHByZXNzaW9uKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0RSQVcgPSBmYWxzZSB8fCBMT0NBTF9MT0dWOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfTEFZT1VUID0gZmFsc2UgfHwgTE9DQUxfTE9HVjsKQEAgLTk1LDggKzkzLDYgQEAKICAgICAgKi8KICAgICBzdGF0aWMgZmluYWwgaW50IE1BWF9UUkFDS0JBTExfREVMQVkgPSAyNTA7CiAKLSAgICBzdGF0aWMgbG9uZyBzSW5zdGFuY2VDb3VudCA9IDA7Ci0KICAgICBzdGF0aWMgSVdpbmRvd1Nlc3Npb24gc1dpbmRvd1Nlc3Npb247CiAKICAgICBzdGF0aWMgZmluYWwgT2JqZWN0IG1TdGF0aWNJbml0ID0gbmV3IE9iamVjdCgpOwpAQCAtMjA0LDE3ICsyMDAsMTQgQEAKICAgICBpbnQgbUN1clNjcm9sbFk7CiAgICAgU2Nyb2xsZXIgbVNjcm9sbGVyOwogCi0gICAgRUdMMTAgbUVnbDsKLSAgICBFR0xEaXNwbGF5IG1FZ2xEaXNwbGF5OwotICAgIEVHTENvbnRleHQgbUVnbENvbnRleHQ7Ci0gICAgRUdMU3VyZmFjZSBtRWdsU3VyZmFjZTsKLSAgICBHTDExIG1HTDsKLSAgICBDYW52YXMgbUdsQ2FudmFzOwotICAgIGJvb2xlYW4gbVVzZUdMOwotICAgIGJvb2xlYW4gbUdsV2FudGVkOwotCiAgICAgZmluYWwgVmlld0NvbmZpZ3VyYXRpb24gbVZpZXdDb25maWd1cmF0aW9uOwogCisgICAgLyogRHJhZy9kcm9wICovCisgICAgQ2xpcERlc2NyaXB0aW9uIG1EcmFnRGVzY3JpcHRpb247CisgICAgVmlldyBtQ3VycmVudERyYWdWaWV3OworICAgIGZpbmFsIFBvaW50RiBtRHJhZ1BvaW50ID0gbmV3IFBvaW50RigpOworICAgIGZpbmFsIFBvaW50RiBtTGFzdFRvdWNoUG9pbnQgPSBuZXcgUG9pbnRGKCk7CisKICAgICAvKioKICAgICAgKiBzZWUge0BsaW5rICNwbGF5U291bmRFZmZlY3QoaW50KX0KICAgICAgKi8KQEAgLTI0MSwxMyArMjM0LDEyIEBACiAgICAgcHVibGljIFZpZXdSb290KENvbnRleHQgY29udGV4dCkgewogICAgICAgICBzdXBlcigpOwogCi0gICAgICAgIGlmIChNRUFTVVJFX0xBVEVOQ1kgJiYgbHQgPT0gbnVsbCkgewotICAgICAgICAgICAgbHQgPSBuZXcgTGF0ZW5jeVRpbWVyKDEwMCwgMTAwMCk7CisgICAgICAgIGlmIChNRUFTVVJFX0xBVEVOQ1kpIHsKKyAgICAgICAgICAgIGlmIChsdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbHQgPSBuZXcgTGF0ZW5jeVRpbWVyKDEwMCwgMTAwMCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLyBGb3IgZGVidWcgb25seQotICAgICAgICAvLysrc0luc3RhbmNlQ291bnQ7Ci0KICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgc3RhdGljcyB3aGVuIHRoaXMgY2xhc3MgaXMgZmlyc3QgaW5zdGFudGlhdGVkLiBUaGlzIGlzCiAgICAgICAgIC8vIGRvbmUgaGVyZSBpbnN0ZWFkIG9mIGluIHRoZSBzdGF0aWMgYmxvY2sgYmVjYXVzZSBaeWdvdGUgZG9lcyBub3QKICAgICAgICAgLy8gYWxsb3cgdGhlIHNwYXduaW5nIG9mIHRocmVhZHMuCkBAIC0yNjIsNyArMjU0LDcgQEAKICAgICAgICAgbVRlbXBSZWN0ID0gbmV3IFJlY3QoKTsKICAgICAgICAgbVZpc1JlY3QgPSBuZXcgUmVjdCgpOwogICAgICAgICBtV2luRnJhbWUgPSBuZXcgUmVjdCgpOwotICAgICAgICBtV2luZG93ID0gbmV3IFcodGhpcywgY29udGV4dCk7CisgICAgICAgIG1XaW5kb3cgPSBuZXcgVyh0aGlzKTsKICAgICAgICAgbUlucHV0TWV0aG9kQ2FsbGJhY2sgPSBuZXcgSW5wdXRNZXRob2RDYWxsYmFjayh0aGlzKTsKICAgICAgICAgbVZpZXdWaXNpYmlsaXR5ID0gVmlldy5HT05FOwogICAgICAgICBtVHJhbnNwYXJlbnRSZWdpb24gPSBuZXcgUmVnaW9uKCk7CkBAIC0yNzQsMTkgKzI2Niw2IEBACiAgICAgICAgIG1EZW5zaXR5ID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHlEcGk7CiAgICAgfQogCi0gICAgLy8gRm9yIGRlYnVnIG9ubHkKLSAgICAvKgotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgICAgIC0tc0luc3RhbmNlQ291bnQ7Ci0gICAgfQotICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0SW5zdGFuY2VDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIHNJbnN0YW5jZUNvdW50OwotICAgIH0KLQogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGaXJzdERyYXdIYW5kbGVyKFJ1bm5hYmxlIGNhbGxiYWNrKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAoc0ZpcnN0RHJhd0hhbmRsZXJzKSB7CiAgICAgICAgICAgICBpZiAoIXNGaXJzdERyYXdDb21wbGV0ZSkgewpAQCAtMzMwLDEyMiArMzA5LDE4IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUdMKCkgewotICAgICAgICBpbml0aWFsaXplR0xJbm5lcigpOwotICAgICAgICBpbnQgZXJyID0gbUVnbC5lZ2xHZXRFcnJvcigpOwotICAgICAgICBpZiAoZXJyICE9IEVHTDEwLkVHTF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAvLyBnaXZlLXVwIG9uIHVzaW5nIEdMCi0gICAgICAgICAgICBkZXN0cm95R0woKTsKLSAgICAgICAgICAgIG1HbFdhbnRlZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVHTElubmVyKCkgewotICAgICAgICBmaW5hbCBFR0wxMCBlZ2wgPSAoRUdMMTApIEVHTENvbnRleHQuZ2V0RUdMKCk7Ci0gICAgICAgIG1FZ2wgPSBlZ2w7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRvIHRoZSBkZWZhdWx0IGRpc3BsYXkuCi0gICAgICAgICAqLwotICAgICAgICBmaW5hbCBFR0xEaXNwbGF5IGVnbERpc3BsYXkgPSBlZ2wuZWdsR2V0RGlzcGxheShFR0wxMC5FR0xfREVGQVVMVF9ESVNQTEFZKTsKLSAgICAgICAgbUVnbERpc3BsYXkgPSBlZ2xEaXNwbGF5OwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFdlIGNhbiBub3cgaW5pdGlhbGl6ZSBFR0wgZm9yIHRoYXQgZGlzcGxheQotICAgICAgICAgKi8KLSAgICAgICAgaW50W10gdmVyc2lvbiA9IG5ldyBpbnRbMl07Ci0gICAgICAgIGVnbC5lZ2xJbml0aWFsaXplKGVnbERpc3BsYXksIHZlcnNpb24pOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNwZWNpZnkgYSBjb25maWd1cmF0aW9uIGZvciBvdXIgb3BlbmdsIHNlc3Npb24KLSAgICAgICAgICogYW5kIGdyYWIgdGhlIGZpcnN0IGNvbmZpZ3VyYXRpb24gdGhhdCBtYXRjaGVzIGlzCi0gICAgICAgICAqLwotICAgICAgICBmaW5hbCBpbnRbXSBjb25maWdTcGVjID0gewotICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9SRURfU0laRSwgICAgICA1LAotICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9HUkVFTl9TSVpFLCAgICA2LAotICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9CTFVFX1NJWkUsICAgICA1LAotICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9ERVBUSF9TSVpFLCAgICAwLAotICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OT05FCi0gICAgICAgIH07Ci0gICAgICAgIGZpbmFsIEVHTENvbmZpZ1tdIGNvbmZpZ3MgPSBuZXcgRUdMQ29uZmlnWzFdOwotICAgICAgICBmaW5hbCBpbnRbXSBudW1fY29uZmlnID0gbmV3IGludFsxXTsKLSAgICAgICAgZWdsLmVnbENob29zZUNvbmZpZyhlZ2xEaXNwbGF5LCBjb25maWdTcGVjLCBjb25maWdzLCAxLCBudW1fY29uZmlnKTsKLSAgICAgICAgZmluYWwgRUdMQ29uZmlnIGNvbmZpZyA9IGNvbmZpZ3NbMF07Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ3JlYXRlIGFuIE9wZW5HTCBFUyBjb250ZXh0LiBUaGlzIG11c3QgYmUgZG9uZSBvbmx5IG9uY2UsIGFuCi0gICAgICAgICAqIE9wZW5HTCBjb250ZXh0IGlzIGEgc29tZXdoYXQgaGVhdnkgb2JqZWN0LgotICAgICAgICAgKi8KLSAgICAgICAgZmluYWwgRUdMQ29udGV4dCBjb250ZXh0ID0gZWdsLmVnbENyZWF0ZUNvbnRleHQoZWdsRGlzcGxheSwgY29uZmlnLAotICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OT19DT05URVhULCBudWxsKTsKLSAgICAgICAgbUVnbENvbnRleHQgPSBjb250ZXh0OwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENyZWF0ZSBhbiBFR0wgc3VyZmFjZSB3ZSBjYW4gcmVuZGVyIGludG8uCi0gICAgICAgICAqLwotICAgICAgICBmaW5hbCBFR0xTdXJmYWNlIHN1cmZhY2UgPSBlZ2wuZWdsQ3JlYXRlV2luZG93U3VyZmFjZShlZ2xEaXNwbGF5LCBjb25maWcsIG1Ib2xkZXIsIG51bGwpOwotICAgICAgICBtRWdsU3VyZmFjZSA9IHN1cmZhY2U7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQmVmb3JlIHdlIGNhbiBpc3N1ZSBHTCBjb21tYW5kcywgd2UgbmVlZCB0byBtYWtlIHN1cmUKLSAgICAgICAgICogdGhlIGNvbnRleHQgaXMgY3VycmVudCBhbmQgYm91bmQgdG8gYSBzdXJmYWNlLgotICAgICAgICAgKi8KLSAgICAgICAgZWdsLmVnbE1ha2VDdXJyZW50KGVnbERpc3BsYXksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0byB0aGUgYXBwcm9wcmlhdGUgR0wgaW50ZXJmYWNlLgotICAgICAgICAgKiBUaGlzIGlzIHNpbXBseSBkb25lIGJ5IGNhc3RpbmcgdGhlIEdMIGNvbnRleHQgdG8gZWl0aGVyCi0gICAgICAgICAqIEdMMTAgb3IgR0wxMS4KLSAgICAgICAgICovCi0gICAgICAgIGZpbmFsIEdMMTEgZ2wgPSAoR0wxMSkgY29udGV4dC5nZXRHTCgpOwotICAgICAgICBtR0wgPSBnbDsKLSAgICAgICAgbUdsQ2FudmFzID0gbmV3IENhbnZhcyhnbCk7Ci0gICAgICAgIG1Vc2VHTCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRlc3Ryb3lHTCgpIHsKLSAgICAgICAgLy8gaW5mb3JtIHNraWEgdGhhdCB0aGUgY29udGV4dCBpcyBnb25lCi0gICAgICAgIG5hdGl2ZUFiYW5kb25HbENhY2hlcygpOwotCi0gICAgICAgIG1FZ2wuZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIEVHTDEwLkVHTF9OT19TVVJGQUNFLAotICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OT19TVVJGQUNFLCBFR0wxMC5FR0xfTk9fQ09OVEVYVCk7Ci0gICAgICAgIG1FZ2wuZWdsRGVzdHJveUNvbnRleHQobUVnbERpc3BsYXksIG1FZ2xDb250ZXh0KTsKLSAgICAgICAgbUVnbC5lZ2xEZXN0cm95U3VyZmFjZShtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOwotICAgICAgICBtRWdsLmVnbFRlcm1pbmF0ZShtRWdsRGlzcGxheSk7Ci0gICAgICAgIG1FZ2xDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgbUVnbFN1cmZhY2UgPSBudWxsOwotICAgICAgICBtRWdsRGlzcGxheSA9IG51bGw7Ci0gICAgICAgIG1FZ2wgPSBudWxsOwotICAgICAgICBtR2xDYW52YXMgPSBudWxsOwotICAgICAgICBtR0wgPSBudWxsOwotICAgICAgICBtVXNlR0wgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tFZ2xFcnJvcnMoKSB7Ci0gICAgICAgIGlmIChtVXNlR0wpIHsKLSAgICAgICAgICAgIGludCBlcnIgPSBtRWdsLmVnbEdldEVycm9yKCk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IEVHTDEwLkVHTF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIGJhZCBoYXMgaGFwcGVuZWQgcmV2ZXJ0IHRvCi0gICAgICAgICAgICAgICAgLy8gbm9ybWFsIHJlbmRlcmluZy4KLSAgICAgICAgICAgICAgICBkZXN0cm95R0woKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEVHTDExLkVHTF9DT05URVhUX0xPU1QpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UnbGwgdHJ5IGFnYWluIGlmIGl0IHdhcyBjb250ZXh0IGxvc3QKLSAgICAgICAgICAgICAgICAgICAgbUdsV2FudGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogV2UgaGF2ZSBvbmUgY2hpbGQKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWaWV3KFZpZXcgdmlldywgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgYXR0cnMsCi0gICAgICAgICAgICBWaWV3IHBhbmVsUGFyZW50VmlldykgeworICAgIHB1YmxpYyB2b2lkIHNldFZpZXcoVmlldyB2aWV3LCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBhdHRycywgVmlldyBwYW5lbFBhcmVudFZpZXcpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAobVZpZXcgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1WaWV3ID0gdmlldzsKICAgICAgICAgICAgICAgICBtV2luZG93QXR0cmlidXRlcy5jb3B5RnJvbShhdHRycyk7CiAgICAgICAgICAgICAgICAgYXR0cnMgPSBtV2luZG93QXR0cmlidXRlczsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBlbmFibGVIYXJkd2FyZUFjY2VsZXJhdGlvbihhdHRycyk7CisKICAgICAgICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIFJvb3RWaWV3U3VyZmFjZVRha2VyKSB7CiAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlSG9sZGVyQ2FsbGJhY2sgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUm9vdFZpZXdTdXJmYWNlVGFrZXIpdmlldykud2lsbFlvdVRha2VUaGVTdXJmYWNlKCk7CkBAIC01NzUsNiArNDUwLDI0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgZW5hYmxlSGFyZHdhcmVBY2NlbGVyYXRpb24oV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgYXR0cnMpIHsKKyAgICAgICAgLy8gT25seSBlbmFibGUgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlmIHdlIGFyZSBub3QgaW4gdGhlIHN5c3RlbSBwcm9jZXNzCisgICAgICAgIC8vIFRoZSB3aW5kb3cgbWFuYWdlciBjcmVhdGVzIFZpZXdSb290cyB0byBkaXNwbGF5IGFuaW1hdGVkIHByZXZpZXcgd2luZG93cworICAgICAgICAvLyBvZiBsYXVuY2hpbmcgYXBwcyBhbmQgd2UgZG9uJ3Qgd2FudCB0aG9zZSB0byBiZSBoYXJkd2FyZSBhY2NlbGVyYXRlZAorICAgICAgICBpZiAoIUhhcmR3YXJlUmVuZGVyZXIuc1JlbmRlcmVyRGlzYWJsZWQpIHsKKyAgICAgICAgICAgIC8vIFRyeSB0byBlbmFibGUgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlmIHJlcXVlc3RlZAorICAgICAgICAgICAgaWYgKGF0dHJzICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgKGF0dHJzLmZsYWdzICYgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdHJhbnNsdWNlbnQgPSBhdHRycy5mb3JtYXQgIT0gUGl4ZWxGb3JtYXQuT1BBUVVFOworICAgICAgICAgICAgICAgIGlmIChtQXR0YWNoSW5mby5tSGFyZHdhcmVSZW5kZXJlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1IYXJkd2FyZVJlbmRlcmVyLmRlc3Ryb3kodHJ1ZSk7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtQXR0YWNoSW5mby5tSGFyZHdhcmVSZW5kZXJlciA9IEhhcmR3YXJlUmVuZGVyZXIuY3JlYXRlR2xSZW5kZXJlcigyLCB0cmFuc2x1Y2VudCk7CisgICAgICAgICAgICAgICAgbUF0dGFjaEluZm8ubUhhcmR3YXJlQWNjZWxlcmF0ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIFZpZXcgZ2V0VmlldygpIHsKICAgICAgICAgcmV0dXJuIG1WaWV3OwogICAgIH0KQEAgLTczMSw4ICs2MjQsNiBAQAogICAgICAgICBib29sZWFuIHZpZXdWaXNpYmlsaXR5Q2hhbmdlZCA9IG1WaWV3VmlzaWJpbGl0eSAhPSB2aWV3VmlzaWJpbGl0eQogICAgICAgICAgICAgICAgIHx8IG1OZXdTdXJmYWNlTmVlZGVkOwogCi0gICAgICAgIGZsb2F0IGFwcFNjYWxlID0gbUF0dGFjaEluZm8ubUFwcGxpY2F0aW9uU2NhbGU7Ci0KICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgcGFyYW1zID0gbnVsbDsKICAgICAgICAgaWYgKG1XaW5kb3dBdHRyaWJ1dGVzQ2hhbmdlZCkgewogICAgICAgICAgICAgbVdpbmRvd0F0dHJpYnV0ZXNDaGFuZ2VkID0gZmFsc2U7CkBAIC03ODAsOSArNjcxLDkgQEAKICAgICAgICAgICAgIGF0dGFjaEluZm8ubVdpbmRvd1Zpc2liaWxpdHkgPSB2aWV3VmlzaWJpbGl0eTsKICAgICAgICAgICAgIGhvc3QuZGlzcGF0Y2hXaW5kb3dWaXNpYmlsaXR5Q2hhbmdlZCh2aWV3VmlzaWJpbGl0eSk7CiAgICAgICAgICAgICBpZiAodmlld1Zpc2liaWxpdHkgIT0gVmlldy5WSVNJQkxFIHx8IG1OZXdTdXJmYWNlTmVlZGVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Vc2VHTCkgewotICAgICAgICAgICAgICAgICAgICBkZXN0cm95R0woKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1BdHRhY2hJbmZvLm1IYXJkd2FyZVJlbmRlcmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUF0dGFjaEluZm8ubUhhcmR3YXJlUmVuZGVyZXIuZGVzdHJveShmYWxzZSk7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh2aWV3VmlzaWJpbGl0eSA9PSBWaWV3LkdPTkUpIHsKICAgICAgICAgICAgICAgICAvLyBBZnRlciBtYWtpbmcgYSB3aW5kb3cgZ29uZSwgd2Ugd2lsbCBjb3VudCBpdCBhcyBiZWluZwpAQCAtODk3LDEwICs3ODgsMTIgQEAKIAogICAgICAgICBmaW5hbCBib29sZWFuIGNvbXB1dGVzSW50ZXJuYWxJbnNldHMgPQogICAgICAgICAgICAgICAgIGF0dGFjaEluZm8ubVRyZWVPYnNlcnZlci5oYXNDb21wdXRlSW50ZXJuYWxJbnNldHNMaXN0ZW5lcnMoKTsKKwogICAgICAgICBib29sZWFuIGluc2V0c1BlbmRpbmcgPSBmYWxzZTsKICAgICAgICAgaW50IHJlbGF5b3V0UmVzdWx0ID0gMDsKLSAgICAgICAgaWYgKG1GaXJzdCB8fCB3aW5kb3dTaG91bGRSZXNpemUgfHwgaW5zZXRzQ2hhbmdlZAotICAgICAgICAgICAgICAgIHx8IHZpZXdWaXNpYmlsaXR5Q2hhbmdlZCB8fCBwYXJhbXMgIT0gbnVsbCkgeworCisgICAgICAgIGlmIChtRmlyc3QgfHwgd2luZG93U2hvdWxkUmVzaXplIHx8IGluc2V0c0NoYW5nZWQgfHwKKyAgICAgICAgICAgICAgICB2aWV3VmlzaWJpbGl0eUNoYW5nZWQgfHwgcGFyYW1zICE9IG51bGwpIHsKIAogICAgICAgICAgICAgaWYgKHZpZXdWaXNpYmlsaXR5ID09IFZpZXcuVklTSUJMRSkgewogICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgd2luZG93IGlzIGdpdmluZyBpbnRlcm5hbCBpbnNldHMgdG8gdGhlIHdpbmRvdwpAQCAtOTEyLDI2ICs4MDUsMTkgQEAKICAgICAgICAgICAgICAgICAvLyB3aW5kb3csIHdhaXRpbmcgdW50aWwgd2UgY2FuIGZpbmlzaCBsYXlpbmcgb3V0IHRoaXMgd2luZG93CiAgICAgICAgICAgICAgICAgLy8gYW5kIGdldCBiYWNrIHRvIHRoZSB3aW5kb3cgbWFuYWdlciB3aXRoIHRoZSB1bHRpbWF0ZWx5CiAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZWQgaW5zZXRzLgotICAgICAgICAgICAgICAgIGluc2V0c1BlbmRpbmcgPSBjb21wdXRlc0ludGVybmFsSW5zZXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAobUZpcnN0IHx8IHZpZXdWaXNpYmlsaXR5Q2hhbmdlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobVdpbmRvd0F0dHJpYnV0ZXMubWVtb3J5VHlwZSA9PSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5NRU1PUllfVFlQRV9HUFUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBtV2luZG93QXR0cmlidXRlczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtR2xXYW50ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnNldHNQZW5kaW5nID0gY29tcHV0ZXNJbnRlcm5hbEluc2V0cyAmJiAobUZpcnN0IHx8IHZpZXdWaXNpYmlsaXR5Q2hhbmdlZCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtU3VyZmFjZUhvbGRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVN1cmZhY2VIb2xkZXIubVN1cmZhY2VMb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICBtRHJhd2luZ0FsbG93ZWQgPSB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIGJvb2xlYW4gaHdJbnRpYWxpemVkID0gZmFsc2U7CiAgICAgICAgICAgICBib29sZWFuIGNvbnRlbnRJbnNldHNDaGFuZ2VkID0gZmFsc2U7CiAgICAgICAgICAgICBib29sZWFuIHZpc2libGVJbnNldHNDaGFuZ2VkOwogICAgICAgICAgICAgYm9vbGVhbiBoYWRTdXJmYWNlID0gbVN1cmZhY2UuaXNWYWxpZCgpOworCiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGludCBmbCA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcyAhPSBudWxsKSB7CkBAIC05OTEsOSArODc3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxSZWRyYXdOZWVkZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzVHJhbnNwYXJlbnRSZWdpb24uc2V0RW1wdHkoKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1HbFdhbnRlZCAmJiAhbVVzZUdMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUdMKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQgPSBtR2xDYW52YXMgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQXR0YWNoSW5mby5tSGFyZHdhcmVSZW5kZXJlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdJbnRpYWxpemVkID0gbUF0dGFjaEluZm8ubUhhcmR3YXJlUmVuZGVyZXIuaW5pdGlhbGl6ZShtSG9sZGVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1TdXJmYWNlLmlzVmFsaWQoKSkgewpAQCAtMTA3MCwxMCArOTU1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2VIb2xkZXIubVN1cmZhY2VMb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICAgICAgbUdsQ2FudmFzLnNldFZpZXdwb3J0KChpbnQpIChtV2lkdGggKiBhcHBTY2FsZSArIDAuNWYpLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKG1IZWlnaHQgKiBhcHBTY2FsZSArIDAuNWYpKTsKKworICAgICAgICAgICAgaWYgKGh3SW50aWFsaXplZCB8fCAod2luZG93U2hvdWxkUmVzaXplICYmIG1BdHRhY2hJbmZvLm1IYXJkd2FyZVJlbmRlcmVyICE9IG51bGwpKSB7CisgICAgICAgICAgICAgICAgbUF0dGFjaEluZm8ubUhhcmR3YXJlUmVuZGVyZXIuc2V0dXAobVdpZHRoLCBtSGVpZ2h0KTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYm9vbGVhbiBmb2N1c0NoYW5nZWREdWVUb1RvdWNoTW9kZSA9IGVuc3VyZVRvdWNoTW9kZUxvY2FsbHkoCkBAIC0xMTMzLDcgKzEwMTcsNyBAQAogICAgICAgICAgICAgICAgIFRBRywgIkxheWluZyBvdXQgIiArIGhvc3QgKyAiIHRvICgiICsKICAgICAgICAgICAgICAgICBob3N0Lm1NZWFzdXJlZFdpZHRoICsgIiwgIiArIGhvc3QubU1lYXN1cmVkSGVpZ2h0ICsgIikiKTsKICAgICAgICAgICAgIGxvbmcgc3RhcnRUaW1lID0gMEw7Ci0gICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5wcm9maWxlTGF5b3V0KSB7CisgICAgICAgICAgICBpZiAoVmlld0RlYnVnLkRFQlVHX1BST0ZJTEVfTEFZT1VUKSB7CiAgICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBob3N0LmxheW91dCgwLCAwLCBob3N0Lm1NZWFzdXJlZFdpZHRoLCBob3N0Lm1NZWFzdXJlZEhlaWdodCk7CkBAIC0xMTQ2LDcgKzEwMzAsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRyAmJiBWaWV3RGVidWcucHJvZmlsZUxheW91dCkgeworICAgICAgICAgICAgaWYgKFZpZXdEZWJ1Zy5ERUJVR19QUk9GSUxFX0xBWU9VVCkgewogICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoNjAwMDEsIFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gc3RhcnRUaW1lKTsKICAgICAgICAgICAgIH0KIApAQCAtMTM0Niw3ICsxMjMwLDggQEAKICAgICAgICAgaWYgKCFzRmlyc3REcmF3Q29tcGxldGUpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc0ZpcnN0RHJhd0hhbmRsZXJzKSB7CiAgICAgICAgICAgICAgICAgc0ZpcnN0RHJhd0NvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8c0ZpcnN0RHJhd0hhbmRsZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gc0ZpcnN0RHJhd0hhbmRsZXJzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaTwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBwb3N0KHNGaXJzdERyYXdIYW5kbGVycy5nZXQoaSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTEzNzksNjEgKzEyNjQsMjQgQEAKICAgICAgICAgICAgIGRpcnR5LnNldEVtcHR5KCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChtVXNlR0wpIHsKLSAgICAgICAgICAgIGlmICghZGlydHkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgQ2FudmFzIGNhbnZhcyA9IG1HbENhbnZhczsKLSAgICAgICAgICAgICAgICBpZiAobUdMICE9IG51bGwgJiYgY2FudmFzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUdMLmdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgICAgICAgICAgICAgICAgICBtR0wuZ2xDbGVhckNvbG9yKDAsIDAsIDAsIDApOwotICAgICAgICAgICAgICAgICAgICBtR0wuZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgICAgICAgICAgICAgbUdMLmdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUF0dGFjaEluZm8ubURyYXdpbmdUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1JZ25vcmVEaXJ0eVN0YXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZXcubVByaXZhdGVGbGFncyB8PSBWaWV3LkRSQVdOOwotCi0gICAgICAgICAgICAgICAgICAgIGludCBzYXZlQ291bnQgPSBjYW52YXMuc2F2ZShDYW52YXMuTUFUUklYX1NBVkVfRkxBRyk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAsIC15b2ZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVHJhbnNsYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyYW5zbGF0b3IudHJhbnNsYXRlQ2FudmFzKGNhbnZhcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuc2V0U2NyZWVuRGVuc2l0eShzY2FsaW5nUmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFVklDRSA6IDApOwotICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXcuZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRyAmJiBWaWV3RGVidWcuY29uc2lzdGVuY3lDaGVja0VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlldy5kaXNwYXRjaENvbnNpc3RlbmN5Q2hlY2soVmlld0RlYnVnLkNPTlNJU1RFTkNZX0RSQVdJTkcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHNhdmVDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBtQXR0YWNoSW5mby5tSWdub3JlRGlydHlTdGF0ZSA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIG1FZ2wuZWdsU3dhcEJ1ZmZlcnMobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcnMoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoU0hPV19GUFMgfHwgQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5zaG93RnBzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm93ID0gKGludClTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzRHJhd1RpbWUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNob3dGUFMoY2FudmFzLCBub3cgLSBzRHJhd1RpbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc0RyYXdUaW1lID0gbm93OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNjcm9sbGluZykgewotICAgICAgICAgICAgICAgIG1GdWxsUmVkcmF3TmVlZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzY2hlZHVsZVRyYXZlcnNhbHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQogCiAgICAgICAgIGlmIChmdWxsUmVkcmF3TmVlZGVkKSB7CiAgICAgICAgICAgICBtQXR0YWNoSW5mby5tSWdub3JlRGlydHlTdGF0ZSA9IHRydWU7CiAgICAgICAgICAgICBkaXJ0eS51bmlvbigwLCAwLCAoaW50KSAobVdpZHRoICogYXBwU2NhbGUgKyAwLjVmKSwgKGludCkgKG1IZWlnaHQgKiBhcHBTY2FsZSArIDAuNWYpKTsKICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1BdHRhY2hJbmZvLm1IYXJkd2FyZVJlbmRlcmVyICE9IG51bGwgJiYgbUF0dGFjaEluZm8ubUhhcmR3YXJlUmVuZGVyZXIuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGlmICghZGlydHkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbUF0dGFjaEluZm8ubUhhcmR3YXJlUmVuZGVyZXIuZHJhdyhtVmlldywgbUF0dGFjaEluZm8sIHlvZmYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2Nyb2xsaW5nKSB7CisgICAgICAgICAgICAgICAgbUZ1bGxSZWRyYXdOZWVkZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHNjaGVkdWxlVHJhdmVyc2FscygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAogICAgICAgICBpZiAoREVCVUdfT1JJRU5UQVRJT04gfHwgREVCVUdfRFJBVykgewogICAgICAgICAgICAgTG9nLnYoVEFHLCAiRHJhdyAiICsgbVZpZXcgKyAiLyIKQEAgLTE0ODIsNyArMTMzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvL2NhbnZhcy5kcmF3QVJHQigyNTUsIDI1NSwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5wcm9maWxlRHJhd2luZykgeworICAgICAgICAgICAgICAgICAgICBpZiAoVmlld0RlYnVnLkRFQlVHX1BST0ZJTEVfRFJBV0lORykgewogICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMTUwOSw3ICsxMzU3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgbWV0cmljcz0iICsgY3h0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBjb21wYXRpYmlsaXR5SW5mbz0iICsgY3h0LmdldFJlc291cmNlcygpLmdldENvbXBhdGliaWxpdHlJbmZvKCkpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludCBzYXZlQ291bnQgPSBjYW52YXMuc2F2ZShDYW52YXMuTUFUUklYX1NBVkVfRkxBRyk7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAsIC15b2ZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVHJhbnNsYXRvciAhPSBudWxsKSB7CkBAIC0xNTIwLDE0ICsxMzY3LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtVmlldy5kcmF3KGNhbnZhcyk7CiAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0YWNoSW5mby5tSWdub3JlRGlydHlTdGF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHNhdmVDb3VudCk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5jb25zaXN0ZW5jeUNoZWNrRW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXcuZGlzcGF0Y2hDb25zaXN0ZW5jeUNoZWNrKFZpZXdEZWJ1Zy5DT05TSVNURU5DWV9EUkFXSU5HKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChTSE9XX0ZQUyB8fCBDb25maWcuREVCVUcgJiYgVmlld0RlYnVnLnNob3dGcHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFNIT1dfRlBTIHx8IFZpZXdEZWJ1Zy5ERUJVR19TSE9XX0ZQUykgewogICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdyA9IChpbnQpU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc0RyYXdUaW1lICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTaG93RlBTKGNhbnZhcywgbm93IC0gc0RyYXdUaW1lKTsKQEAgLTE1MzUsNyArMTM4MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzRHJhd1RpbWUgPSBub3c7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5wcm9maWxlRHJhd2luZykgeworICAgICAgICAgICAgICAgICAgICBpZiAoVmlld0RlYnVnLkRFQlVHX1BST0ZJTEVfRFJBV0lORykgewogICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudCg2MDAwMCwgU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgLSBzdGFydFRpbWUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMTczOCw4ICsxNTg0LDYgQEAKICAgICB9CiAKICAgICB2b2lkIGRpc3BhdGNoRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBpZiAoQ29uZmlnLkxPR1YpIExvZy52KFRBRywgIkRldGFjaGluZyBpbiAiICsgdGhpcyArICIgb2YgIiArIG1TdXJmYWNlKTsKLQogICAgICAgICBpZiAobVZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgbVZpZXcuZGlzcGF0Y2hEZXRhY2hlZEZyb21XaW5kb3coKTsKICAgICAgICAgfQpAQCAtMTc0OCw5ICsxNTkyLDggQEAKICAgICAgICAgbUF0dGFjaEluZm8ubVJvb3RWaWV3ID0gbnVsbDsKICAgICAgICAgbUF0dGFjaEluZm8ubVN1cmZhY2UgPSBudWxsOwogCi0gICAgICAgIGlmIChtVXNlR0wpIHsKLSAgICAgICAgICAgIGRlc3Ryb3lHTCgpOwotICAgICAgICB9CisgICAgICAgIGRlc3Ryb3lIYXJkd2FyZVJlbmRlcmVyKCk7CisKICAgICAgICAgbVN1cmZhY2UucmVsZWFzZSgpOwogCiAgICAgICAgIGlmIChtSW5wdXRDaGFubmVsICE9IG51bGwpIHsKQEAgLTE4MzcsNiArMTY4MCw3IEBACiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRklOSVNIX0lOUFVUX0NPTk5FQ1RJT04gPSAxMDEyOwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENIRUNLX0ZPQ1VTID0gMTAxMzsKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBDTE9TRV9TWVNURU1fRElBTE9HUyA9IDEwMTQ7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRElTUEFUQ0hfRFJBR19FVkVOVCA9IDEwMTU7CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CkBAIC0xOTM5LDE4ICsxNzgzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpblRvdWNoTW9kZSA9IG1zZy5hcmcyICE9IDA7CiAgICAgICAgICAgICAgICAgICAgIGVuc3VyZVRvdWNoTW9kZUxvY2FsbHkoaW5Ub3VjaE1vZGUpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChtR2xXYW50ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrRWdsRXJyb3JzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBsb3N0IHRoZSBnbCBjb250ZXh0LCBzbyByZWNyZWF0ZSBpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtR2xXYW50ZWQgJiYgIW1Vc2VHTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVHTCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtR2xDYW52YXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhcHBTY2FsZSA9IG1BdHRhY2hJbmZvLm1BcHBsaWNhdGlvblNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtR2xDYW52YXMuc2V0Vmlld3BvcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKG1XaWR0aCAqIGFwcFNjYWxlICsgMC41ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKG1IZWlnaHQgKiBhcHBTY2FsZSArIDAuNWYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtQXR0YWNoSW5mby5tSGFyZHdhcmVSZW5kZXJlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQXR0YWNoSW5mby5tSGFyZHdhcmVSZW5kZXJlci5pbml0aWFsaXplSWZOZWVkZWQobVdpZHRoLCBtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0YWNoSW5mbywgbUhvbGRlcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKQEAgLTIwMDAsOCArMTgzNSw3IEBACiAgICAgICAgICAgICBpZiAoKGV2ZW50LmdldEZsYWdzKCkmS2V5RXZlbnQuRkxBR19GUk9NX1NZU1RFTSkgIT0gMCkgewogICAgICAgICAgICAgICAgIC8vIFRoZSBJTUUgaXMgdHJ5aW5nIHRvIHNheSB0aGlzIGV2ZW50IGlzIGZyb20gdGhlCiAgICAgICAgICAgICAgICAgLy8gc3lzdGVtISAgQmFkIGJhZCBiYWQhCi0gICAgICAgICAgICAgICAgZXZlbnQgPSBLZXlFdmVudC5jaGFuZ2VGbGFncyhldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldEZsYWdzKCkmfktleUV2ZW50LkZMQUdfRlJPTV9TWVNURU0pOworICAgICAgICAgICAgICAgIGV2ZW50ID0gS2V5RXZlbnQuY2hhbmdlRmxhZ3MoZXZlbnQsIGV2ZW50LmdldEZsYWdzKCkgJiB+S2V5RXZlbnQuRkxBR19GUk9NX1NZU1RFTSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZWxpdmVyS2V5RXZlbnRUb1ZpZXdIaWVyYXJjaHkoKEtleUV2ZW50KW1zZy5vYmosIGZhbHNlKTsKICAgICAgICAgfSBicmVhazsKQEAgLTIwMjIsNiArMTg1Niw5IEBACiAgICAgICAgICAgICAgICAgbVZpZXcub25DbG9zZVN5c3RlbURpYWxvZ3MoKFN0cmluZyltc2cub2JqKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBESVNQQVRDSF9EUkFHX0VWRU5UOiB7CisgICAgICAgICAgICBoYW5kbGVEcmFnRXZlbnQoKERyYWdFdmVudCltc2cub2JqKTsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgfQogICAgIH0KICAgICAKQEAgLTIxODksNiArMjAyNiw5IEBACiAgICAgICAgICAgICBpZiAoTUVBU1VSRV9MQVRFTkNZKSB7CiAgICAgICAgICAgICAgICAgbHQuc2FtcGxlKCJBIERpc3BhdGNoaW5nIFRvdWNoRXZlbnRzIiwgU3lzdGVtLm5hbm9UaW1lKCkgLSBldmVudC5nZXRFdmVudFRpbWVOYW5vKCkpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY2FjaGUgZm9yIHBvc3NpYmxlIGRyYWctaW5pdGlhdGlvbgorICAgICAgICAgICAgbUxhc3RUb3VjaFBvaW50LnggPSBldmVudC5nZXRSYXdYKCk7CisgICAgICAgICAgICBtTGFzdFRvdWNoUG9pbnQueSA9IGV2ZW50LmdldFJhd1koKTsKICAgICAgICAgICAgIGhhbmRsZWQgPSBtVmlldy5kaXNwYXRjaFRvdWNoRXZlbnQoZXZlbnQpOwogICAgICAgICAgICAgaWYgKE1FQVNVUkVfTEFURU5DWSkgewogICAgICAgICAgICAgICAgIGx0LnNhbXBsZSgiQiBEaXNwYXRjaGVkIFRvdWNoRXZlbnRzICIsIFN5c3RlbS5uYW5vVGltZSgpIC0gZXZlbnQuZ2V0RXZlbnRUaW1lTmFubygpKTsKQEAgLTI0OTgsOCArMjMzOCw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIGRlbGl2ZXJLZXlFdmVudChLZXlFdmVudCBldmVudCwgYm9vbGVhbiBzZW5kRG9uZSkgewogICAgICAgICAvLyBJZiBtVmlldyBpcyBudWxsLCB3ZSBqdXN0IGNvbnN1bWUgdGhlIGtleSBldmVudCBiZWNhdXNlIGl0IGRvZXNuJ3QKICAgICAgICAgLy8gbWFrZSBzZW5zZSB0byBkbyBhbnl0aGluZyBlbHNlIHdpdGggaXQuCi0gICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IG1WaWV3ICE9IG51bGwKLSAgICAgICAgICAgICAgICA/IG1WaWV3LmRpc3BhdGNoS2V5RXZlbnRQcmVJbWUoZXZlbnQpIDogdHJ1ZTsKKyAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gbVZpZXcgPT0gbnVsbCB8fCBtVmlldy5kaXNwYXRjaEtleUV2ZW50UHJlSW1lKGV2ZW50KTsKICAgICAgICAgaWYgKGhhbmRsZWQpIHsKICAgICAgICAgICAgIGlmIChzZW5kRG9uZSkgewogICAgICAgICAgICAgICAgIGZpbmlzaElucHV0RXZlbnQoKTsKQEAgLTI1MzEsNyArMjM3MCw2IEBACiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHNlbmREb25lID0gc2VxID49IDA7CiAgICAgICAgICAgICBpZiAoIWhhbmRsZWQpIHsKICAgICAgICAgICAgICAgICBkZWxpdmVyS2V5RXZlbnRUb1ZpZXdIaWVyYXJjaHkoZXZlbnQsIHNlbmREb25lKTsKLSAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbmREb25lKSB7CiAgICAgICAgICAgICAgICAgZmluaXNoSW5wdXRFdmVudCgpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTI2MTMsNiArMjQ1MSw5MiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyogZHJhZy9kcm9wICovCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURyYWdFdmVudChEcmFnRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgLy8gRnJvbSB0aGUgcm9vdCwgb25seSBkcmFnIHN0YXJ0L2VuZC9sb2NhdGlvbiBhcmUgZGlzcGF0Y2hlZC4gIGVudGVyZWQvZXhpdGVkCisgICAgICAgIC8vIGFyZSBkZXRlcm1pbmVkIGFuZCBkaXNwYXRjaGVkIGJ5IHRoZSB2aWV3Z3JvdXAgaGllcmFyY2h5LCB3aG8gdGhlbiByZXBvcnQKKyAgICAgICAgLy8gdGhhdCBiYWNrIGhlcmUgZm9yIHVsdGltYXRlIHJlcG9ydGluZyBiYWNrIHRvIHRoZSBmcmFtZXdvcmsuCisgICAgICAgIGlmIChtVmlldyAhPSBudWxsICYmIG1BZGRlZCkgeworICAgICAgICAgICAgZmluYWwgaW50IHdoYXQgPSBldmVudC5tQWN0aW9uOworCisgICAgICAgICAgICBpZiAod2hhdCA9PSBEcmFnRXZlbnQuQUNUSU9OX0RSQUdfRVhJVEVEKSB7CisgICAgICAgICAgICAgICAgLy8gQSBkaXJlY3QgRVhJVEVEIGV2ZW50IG1lYW5zIHRoYXQgdGhlIHdpbmRvdyBtYW5hZ2VyIGtub3dzIHdlJ3ZlIGp1c3QgY3Jvc3NlZAorICAgICAgICAgICAgICAgIC8vIGEgd2luZG93IGJvdW5kYXJ5LCBzbyB0aGUgY3VycmVudCBkcmFnIHRhcmdldCB3aXRoaW4gdGhpcyBvbmUgbXVzdCBoYXZlCisgICAgICAgICAgICAgICAgLy8ganVzdCBiZWVuIGV4aXRlZC4gIFNlbmQgaXQgdGhlIHVzdWFsIG5vdGlmaWNhdGlvbnMgYW5kIHRoZW4gd2UncmUgZG9uZQorICAgICAgICAgICAgICAgIC8vIGZvciBub3cuCisgICAgICAgICAgICAgICAgc2V0RHJhZ0ZvY3VzKGV2ZW50LCBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIGRyYWcgZGVzY3JpcHRpb24gd2hlbiB0aGUgb3BlcmF0aW9uIHN0YXJ0cywgdGhlbiBmaWxsIGl0IGluCisgICAgICAgICAgICAgICAgLy8gb24gc3Vic2VxdWVudCBjYWxscyBhcyBhIGNvbnZlbmllbmNlCisgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gRHJhZ0V2ZW50LkFDVElPTl9EUkFHX1NUQVJURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgbURyYWdEZXNjcmlwdGlvbiA9IGV2ZW50Lm1DbGlwRGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQubUNsaXBEZXNjcmlwdGlvbiA9IG1EcmFnRGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRm9yIGV2ZW50cyB3aXRoIGEgW3NjcmVlbl0gbG9jYXRpb24sIHRyYW5zbGF0ZSBpbnRvIHdpbmRvdyBjb29yZGluYXRlcworICAgICAgICAgICAgICAgIGlmICgod2hhdCA9PSBEcmFnRXZlbnQuQUNUSU9OX0RSQUdfTE9DQVRJT04pIHx8ICh3aGF0ID09IERyYWdFdmVudC5BQ1RJT05fRFJPUCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbURyYWdQb2ludC5zZXQoZXZlbnQubVgsIGV2ZW50Lm1ZKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1UcmFuc2xhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFuc2xhdG9yLnRyYW5zbGF0ZVBvaW50SW5TY3JlZW5Ub0FwcFdpbmRvdyhtRHJhZ1BvaW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VyU2Nyb2xsWSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRHJhZ1BvaW50Lm9mZnNldCgwLCBtQ3VyU2Nyb2xsWSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBldmVudC5tWCA9IG1EcmFnUG9pbnQueDsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQubVkgPSBtRHJhZ1BvaW50Lnk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgd2hvIHRoZSBjdXJyZW50IGRyYWcgdGFyZ2V0IGlzIHByZS1kaXNwYXRjaAorICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgcHJldkRyYWdWaWV3ID0gbUN1cnJlbnREcmFnVmlldzsKKworICAgICAgICAgICAgICAgIC8vIE5vdyBkaXNwYXRjaCB0aGUgZHJhZy9kcm9wIGV2ZW50CisgICAgICAgICAgICAgICAgbVZpZXcuZGlzcGF0Y2hEcmFnRXZlbnQoZXZlbnQpOworCisgICAgICAgICAgICAgICAgLy8gSWYgd2UgY2hhbmdlZCBhcHBhcmVudCBkcmFnIHRhcmdldCwgdGVsbCB0aGUgT1MgYWJvdXQgaXQKKyAgICAgICAgICAgICAgICBpZiAocHJldkRyYWdWaWV3ICE9IG1DdXJyZW50RHJhZ1ZpZXcpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2RHJhZ1ZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNXaW5kb3dTZXNzaW9uLmRyYWdSZWNpcGllbnRFeGl0ZWQobVdpbmRvdyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnREcmFnVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1dpbmRvd1Nlc3Npb24uZHJhZ1JlY2lwaWVudEVudGVyZWQobVdpbmRvdyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiVW5hYmxlIHRvIG5vdGUgZHJhZyB0YXJnZXQgY2hhbmdlIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnREcmFnVmlldyA9IHByZXZEcmFnVmlldzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZXZlbnQucmVjeWNsZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdldExhc3RUb3VjaFBvaW50KFBvaW50IG91dExvY2F0aW9uKSB7CisgICAgICAgIG91dExvY2F0aW9uLnggPSAoaW50KSBtTGFzdFRvdWNoUG9pbnQueDsKKyAgICAgICAgb3V0TG9jYXRpb24ueSA9IChpbnQpIG1MYXN0VG91Y2hQb2ludC55OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERyYWdGb2N1cyhEcmFnRXZlbnQgZXZlbnQsIFZpZXcgbmV3RHJhZ1RhcmdldCkgeworICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXZlbnQubUFjdGlvbjsKKyAgICAgICAgLy8gSWYgd2UndmUgZHJhZ2dlZCBvZmYgb2YgYSB2aWV3LCBzZW5kIGl0IHRoZSBFWElURUQgbWVzc2FnZQorICAgICAgICBpZiAobUN1cnJlbnREcmFnVmlldyAhPSBuZXdEcmFnVGFyZ2V0KSB7CisgICAgICAgICAgICBpZiAobUN1cnJlbnREcmFnVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXZlbnQubUFjdGlvbiA9IERyYWdFdmVudC5BQ1RJT05fRFJBR19FWElURUQ7CisgICAgICAgICAgICAgICAgbUN1cnJlbnREcmFnVmlldy5kaXNwYXRjaERyYWdFdmVudChldmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgd2UndmUgZHJhZ2dlZCBvdmVyIGEgbmV3IHZpZXcsIHNlbmQgaXQgdGhlIEVOVEVSRUQgbWVzc2FnZQorICAgICAgICBpZiAobmV3RHJhZ1RhcmdldCAhPSBudWxsKSB7CisgICAgICAgICAgICBldmVudC5tQWN0aW9uID0gRHJhZ0V2ZW50LkFDVElPTl9EUkFHX0VOVEVSRUQ7CisgICAgICAgICAgICBuZXdEcmFnVGFyZ2V0LmRpc3BhdGNoRHJhZ0V2ZW50KGV2ZW50KTsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudERyYWdWaWV3ID0gbmV3RHJhZ1RhcmdldDsKKyAgICAgICAgZXZlbnQubUFjdGlvbiA9IGFjdGlvbjsgIC8vIHJlc3RvcmUgdGhlIGV2ZW50J3Mgb3JpZ2luYWwgc3RhdGUKKyAgICB9CisKICAgICBwcml2YXRlIEF1ZGlvTWFuYWdlciBnZXRBdWRpb01hbmFnZXIoKSB7CiAgICAgICAgIGlmIChtVmlldyA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZXRBdWRpb01hbmFnZXIgY2FsbGVkIHdoZW4gdGhlcmUgaXMgbm8gbVZpZXciKTsKQEAgLTI3MzAsOSArMjY1NCwxMSBAQAogCiAgICAgdm9pZCBkb0RpZSgpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKLSAgICAgICAgaWYgKENvbmZpZy5MT0dWKSBMb2cudihUQUcsICJESUUgaW4gIiArIHRoaXMgKyAiIG9mICIgKyBtU3VyZmFjZSk7CisgICAgICAgIGlmIChMT0NBTF9MT0dWKSBMb2cudihUQUcsICJESUUgaW4gIiArIHRoaXMgKyAiIG9mICIgKyBtU3VyZmFjZSk7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKG1BZGRlZCAmJiAhbUZpcnN0KSB7CisgICAgICAgICAgICAgICAgZGVzdHJveUhhcmR3YXJlUmVuZGVyZXIoKTsKKwogICAgICAgICAgICAgICAgIGludCB2aWV3VmlzaWJpbGl0eSA9IG1WaWV3LmdldFZpc2liaWxpdHkoKTsKICAgICAgICAgICAgICAgICBib29sZWFuIHZpZXdWaXNpYmlsaXR5Q2hhbmdlZCA9IG1WaWV3VmlzaWJpbGl0eSAhPSB2aWV3VmlzaWJpbGl0eTsKICAgICAgICAgICAgICAgICBpZiAobVdpbmRvd0F0dHJpYnV0ZXNDaGFuZ2VkIHx8IHZpZXdWaXNpYmlsaXR5Q2hhbmdlZCkgewpAQCAtMjc1Nyw2ICsyNjgzLDE0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgZGVzdHJveUhhcmR3YXJlUmVuZGVyZXIoKSB7CisgICAgICAgIGlmIChtQXR0YWNoSW5mby5tSGFyZHdhcmVSZW5kZXJlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQXR0YWNoSW5mby5tSGFyZHdhcmVSZW5kZXJlci5kZXN0cm95KHRydWUpOworICAgICAgICAgICAgbUF0dGFjaEluZm8ubUhhcmR3YXJlUmVuZGVyZXIgPSBudWxsOworICAgICAgICAgICAgbUF0dGFjaEluZm8ubUhhcmR3YXJlQWNjZWxlcmF0ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoRmluaXNoZWRFdmVudChpbnQgc2VxLCBib29sZWFuIGhhbmRsZWQpIHsKICAgICAgICAgTWVzc2FnZSBtc2cgPSBvYnRhaW5NZXNzYWdlKEZJTklTSEVEX0VWRU5UKTsKICAgICAgICAgbXNnLmFyZzEgPSBzZXE7CkBAIC0yODA5LDEzICsyNzQzLDEyIEBACiAgICAgICAgIC8vbm9pbnNwZWN0aW9uIENvbnN0YW50Q29uZGl0aW9ucwogICAgICAgICBpZiAoZmFsc2UgJiYgZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX0RPV04pIHsKICAgICAgICAgICAgIGlmIChldmVudC5nZXRLZXlDb2RlKCkgPT0gS2V5RXZlbnQuS0VZQ09ERV9DQU1FUkEpIHsKLSAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkxPR0QpIExvZy5kKCJrZXlkaXNwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkxPR0QpIExvZy5kKCJrZXlkaXNwIiwgIkZvY3VzZWQgdmlldyBIaWVyYXJjaHkgaXM6Iik7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoImtleWRpc3AiLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoImtleWRpc3AiLCAiRm9jdXNlZCB2aWV3IEhpZXJhcmNoeSBpczoiKTsKKwogICAgICAgICAgICAgICAgIGRlYnVnKCk7CiAKLSAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkxPR0QpIExvZy5kKCJrZXlkaXNwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZCgia2V5ZGlzcCIsICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yODk1LDcgKzI4MjgsMTIgQEAKICAgICAgICAgbXNnLm9iaiA9IHJlYXNvbjsKICAgICAgICAgc2VuZE1lc3NhZ2UobXNnKTsKICAgICB9Ci0gICAgCisKKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaERyYWdFdmVudChEcmFnRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBvYnRhaW5NZXNzYWdlKERJU1BBVENIX0RSQUdfRVZFTlQsIGV2ZW50KTsKKyAgICAgICAgc2VuZE1lc3NhZ2UobXNnKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUaGUgd2luZG93IGlzIGdldHRpbmcgZm9jdXMgc28gaWYgdGhlcmUgaXMgYW55dGhpbmcgZm9jdXNlZC9zZWxlY3RlZAogICAgICAqIHNlbmQgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH0gdG8gYW5ub3VuY2UgdGhhdC4KQEAgLTI5MTUsMTYgKzI4NTMsMTYgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIHB1YmxpYyBBY3Rpb25Nb2RlIHN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKFZpZXcgb3JpZ2luYWxWaWV3LCBBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51IG1lbnUpIHsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBjaGlsZERyYXdhYmxlU3RhdGVDaGFuZ2VkKFZpZXcgY2hpbGQpIHsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgUmVjdCBnZXRXaW5kb3dGcmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1XaW5GcmFtZTsKLSAgICB9Ci0KICAgICB2b2lkIGNoZWNrVGhyZWFkKCkgewogICAgICAgICBpZiAobVRocmVhZCAhPSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQ2FsbGVkRnJvbVdyb25nVGhyZWFkRXhjZXB0aW9uKApAQCAtMzAwMywxNiArMjk0MSwxNSBAQAogICAgIHN0YXRpYyBjbGFzcyBXIGV4dGVuZHMgSVdpbmRvdy5TdHViIHsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPFZpZXdSb290PiBtVmlld1Jvb3Q7CiAKLSAgICAgICAgcHVibGljIFcoVmlld1Jvb3Qgdmlld1Jvb3QsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICBXKFZpZXdSb290IHZpZXdSb290KSB7CiAgICAgICAgICAgICBtVmlld1Jvb3QgPSBuZXcgV2Vha1JlZmVyZW5jZTxWaWV3Um9vdD4odmlld1Jvb3QpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgcmVzaXplZChpbnQgdywgaW50IGgsIFJlY3QgY292ZXJlZEluc2V0cywKLSAgICAgICAgICAgICAgICBSZWN0IHZpc2libGVJbnNldHMsIGJvb2xlYW4gcmVwb3J0RHJhdywgQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcmVzaXplZChpbnQgdywgaW50IGgsIFJlY3QgY292ZXJlZEluc2V0cywgUmVjdCB2aXNpYmxlSW5zZXRzLAorICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVwb3J0RHJhdywgQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKICAgICAgICAgICAgIGZpbmFsIFZpZXdSb290IHZpZXdSb290ID0gbVZpZXdSb290LmdldCgpOwogICAgICAgICAgICAgaWYgKHZpZXdSb290ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2aWV3Um9vdC5kaXNwYXRjaFJlc2l6ZWQodywgaCwgY292ZXJlZEluc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGVJbnNldHMsIHJlcG9ydERyYXcsIG5ld0NvbmZpZyk7CisgICAgICAgICAgICAgICAgdmlld1Jvb3QuZGlzcGF0Y2hSZXNpemVkKHcsIGgsIGNvdmVyZWRJbnNldHMsIHZpc2libGVJbnNldHMsIHJlcG9ydERyYXcsIG5ld0NvbmZpZyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzEwNyw2ICszMDQ0LDE0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgLyogRHJhZy9kcm9wICovCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoRHJhZ0V2ZW50KERyYWdFdmVudCBldmVudCkgeworICAgICAgICAgICAgZmluYWwgVmlld1Jvb3Qgdmlld1Jvb3QgPSBtVmlld1Jvb3QuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmlld1Jvb3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZpZXdSb290LmRpc3BhdGNoRHJhZ0V2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMzQxNSw4ICszMzYwLDQgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVTaG93RlBTKENhbnZhcyBjYW52YXMsIGludCBkdXJhdGlvbk1pbGxpcyk7Ci0KLSAgICAvLyBpbmZvcm0gc2tpYSB0byBqdXN0IGFiYW5kb24gaXRzIHRleHR1cmUgY2FjaGUgSURzCi0gICAgLy8gZG9lc24ndCBjYWxsIGdsRGVsZXRlVGV4dHVyZXMKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVBYmFuZG9uR2xDYWNoZXMoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvdy5qYXZhCmluZGV4IDExYzA5YzEuLjlmYWRjNTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3cuamF2YQpAQCAtNTYsMTEgKzU2LDI4IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9DT05URVhUX01FTlUgPSA2OwogICAgIC8qKiBGbGFnIGZvciBjdXN0b20gdGl0bGUuIFlvdSBjYW5ub3QgY29tYmluZSB0aGlzIGZlYXR1cmUgd2l0aCBvdGhlciB0aXRsZSBmZWF0dXJlcy4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX0NVU1RPTV9USVRMRSA9IDc7Ci0gICAgLyoqIEZsYWcgZm9yIGFza2luZyBmb3IgYW4gT3BlbkdMIGVuYWJsZWQgd2luZG93LgotICAgICAgICBBbGwgMkQgZ3JhcGhpY3Mgd2lsbCBiZSBoYW5kbGVkIGJ5IE9wZW5HTCBFUy4KLSAgICAgICAgQGhpZGUKLSAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfT1BFTkdMID0gODsKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciBlbmFibGluZyB0aGUgQWN0aW9uIEJhci4KKyAgICAgKiBUaGlzIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBmb3Igc29tZSBkZXZpY2VzLiBUaGUgQWN0aW9uIEJhcgorICAgICAqIHJlcGxhY2VzIHRoZSB0aXRsZSBiYXIgYW5kIHByb3ZpZGVzIGFuIGFsdGVybmF0ZSBsb2NhdGlvbgorICAgICAqIGZvciBhbiBvbi1zY3JlZW4gbWVudSBidXR0b24gb24gc29tZSBkZXZpY2VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfQUNUSU9OX0JBUiA9IDg7CisgICAgLyoqCisgICAgICogRmxhZyBmb3IgcmVxdWVzdGluZyBhbiBBY3Rpb24gQmFyIHRoYXQgb3ZlcmxheXMgd2luZG93IGNvbnRlbnQuCisgICAgICogTm9ybWFsbHkgYW4gQWN0aW9uIEJhciB3aWxsIHNpdCBpbiB0aGUgc3BhY2UgYWJvdmUgd2luZG93IGNvbnRlbnQsIGJ1dCBpZiB0aGlzCisgICAgICogZmVhdHVyZSBpcyByZXF1ZXN0ZWQgYWxvbmcgd2l0aCB7QGxpbmsgI0ZFQVRVUkVfQUNUSU9OX0JBUn0gaXQgd2lsbCBiZSBsYXllcmVkIG92ZXIKKyAgICAgKiB0aGUgd2luZG93IGNvbnRlbnQgaXRzZWxmLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd291bGQgbGlrZSB5b3VyIGFwcCB0byBoYXZlIG1vcmUgY29udHJvbAorICAgICAqIG92ZXIgaG93IHRoZSBBY3Rpb24gQmFyIGlzIGRpc3BsYXllZCwgc3VjaCBhcyBsZXR0aW5nIGFwcGxpY2F0aW9uIGNvbnRlbnQgc2Nyb2xsIGJlbmVhdGgKKyAgICAgKiBhbiBBY3Rpb24gQmFyIHdpdGggYSB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kIG9yIG90aGVyd2lzZSBkaXNwbGF5aW5nIGEgdHJhbnNwYXJlbnQvdHJhbnNsdWNlbnQKKyAgICAgKiBBY3Rpb24gQmFyIG92ZXIgYXBwbGljYXRpb24gY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX0FDVElPTl9CQVJfT1ZFUkxBWSA9IDk7CisgICAgLyoqCisgICAgICogRmxhZyBmb3Igc3BlY2lmeWluZyB0aGUgYmVoYXZpb3Igb2YgYWN0aW9uIG1vZGVzIHdoZW4gYW4gQWN0aW9uIEJhciBpcyBub3QgcHJlc2VudC4KKyAgICAgKiBJZiBvdmVybGF5IGlzIGVuYWJsZWQsIHRoZSBhY3Rpb24gbW9kZSBVSSB3aWxsIGJlIGFsbG93ZWQgdG8gY292ZXIgZXhpc3Rpbmcgd2luZG93IGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9BQ1RJT05fTU9ERV9PVkVSTEFZID0gMTA7CiAgICAgLyoqIEZsYWcgZm9yIHNldHRpbmcgdGhlIHByb2dyZXNzIGJhcidzIHZpc2liaWxpdHkgdG8gVklTSUJMRSAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0dSRVNTX1ZJU0lCSUxJVFlfT04gPSAtMTsKICAgICAvKiogRmxhZyBmb3Igc2V0dGluZyB0aGUgcHJvZ3Jlc3MgYmFyJ3MgdmlzaWJpbGl0eSB0byBHT05FICovCkBAIC0xMDksNiArMTI2LDggQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzU29mdElucHV0TW9kZSA9IGZhbHNlOwogICAgIAorICAgIHByaXZhdGUgYm9vbGVhbiBtRGVzdHJveWVkOworCiAgICAgLy8gVGhlIGN1cnJlbnQgd2luZG93IGF0dHJpYnV0ZXMuCiAgICAgcHJpdmF0ZSBmaW5hbCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBtV2luZG93QXR0cmlidXRlcyA9CiAgICAgICAgIG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygpOwpAQCAtMjkyLDYgKzMxMSwxNCBAQAogICAgICAgICAgKiBAc2VlIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uU2VhcmNoUmVxdWVzdGVkKCkgCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblNlYXJjaFJlcXVlc3RlZCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhbiBhY3Rpb24gbW9kZSBpcyBiZWluZyBzdGFydGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gY29udHJvbCB0aGUgbGlmZWN5Y2xlIG9mIHRoaXMgYWN0aW9uIG1vZGUKKyAgICAgICAgICogQHJldHVybiBUaGUgQWN0aW9uTW9kZSB0aGF0IHdhcyBzdGFydGVkLCBvciBudWxsIGlmIGl0IHdhcyBjYW5jZWxlZAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEFjdGlvbk1vZGUgb25TdGFydEFjdGlvbk1vZGUoQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjayk7CiAgICAgfQogCiAgICAgcHVibGljIFdpbmRvdyhDb250ZXh0IGNvbnRleHQpIHsKQEAgLTM1Myw2ICszODAsMTYgQEAKICAgICAgICAgcmV0dXJuIG1IYXNDaGlsZHJlbjsKICAgICB9CiAgICAgCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgbURlc3Ryb3llZCA9IHRydWU7CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEZXN0cm95ZWQoKSB7CisgICAgICAgIHJldHVybiBtRGVzdHJveWVkOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFNldCB0aGUgd2luZG93IG1hbmFnZXIgZm9yIHVzZSBieSB0aGlzIFdpbmRvdyB0bywgZm9yIGV4YW1wbGUsCiAgICAgICogZGlzcGxheSBwYW5lbHMuICBUaGlzIGlzIDxlbT5ub3Q8L2VtPiB1c2VkIGZvciBkaXNwbGF5aW5nIHRoZQpAQCAtMzYwLDIxICszOTcsMzUgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSB3bSBUaGUgVmlld01hbmFnZXIgZm9yIGFkZGluZyBuZXcgd2luZG93cy4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXaW5kb3dNYW5hZ2VyKFdpbmRvd01hbmFnZXIgd20sCi0gICAgICAgICAgICBJQmluZGVyIGFwcFRva2VuLCBTdHJpbmcgYXBwTmFtZSkgeworICAgIHB1YmxpYyB2b2lkIHNldFdpbmRvd01hbmFnZXIoV2luZG93TWFuYWdlciB3bSwgSUJpbmRlciBhcHBUb2tlbiwgU3RyaW5nIGFwcE5hbWUpIHsKKyAgICAgICAgc2V0V2luZG93TWFuYWdlcih3bSwgYXBwVG9rZW4sIGFwcE5hbWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHdpbmRvdyBtYW5hZ2VyIGZvciB1c2UgYnkgdGhpcyBXaW5kb3cgdG8sIGZvciBleGFtcGxlLAorICAgICAqIGRpc3BsYXkgcGFuZWxzLiAgVGhpcyBpcyA8ZW0+bm90PC9lbT4gdXNlZCBmb3IgZGlzcGxheWluZyB0aGUKKyAgICAgKiBXaW5kb3cgaXRzZWxmIC0tIHRoYXQgbXVzdCBiZSBkb25lIGJ5IHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd20gVGhlIFZpZXdNYW5hZ2VyIGZvciBhZGRpbmcgbmV3IHdpbmRvd3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2luZG93TWFuYWdlcihXaW5kb3dNYW5hZ2VyIHdtLCBJQmluZGVyIGFwcFRva2VuLCBTdHJpbmcgYXBwTmFtZSwKKyAgICAgICAgICAgIGJvb2xlYW4gaGFyZHdhcmVBY2NlbGVyYXRlZCkgewogICAgICAgICBtQXBwVG9rZW4gPSBhcHBUb2tlbjsKICAgICAgICAgbUFwcE5hbWUgPSBhcHBOYW1lOwogICAgICAgICBpZiAod20gPT0gbnVsbCkgewogICAgICAgICAgICAgd20gPSBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCk7CiAgICAgICAgIH0KLSAgICAgICAgbVdpbmRvd01hbmFnZXIgPSBuZXcgTG9jYWxXaW5kb3dNYW5hZ2VyKHdtKTsKKyAgICAgICAgbVdpbmRvd01hbmFnZXIgPSBuZXcgTG9jYWxXaW5kb3dNYW5hZ2VyKHdtLCBoYXJkd2FyZUFjY2VsZXJhdGVkKTsKICAgICB9CiAKICAgICBwcml2YXRlIGNsYXNzIExvY2FsV2luZG93TWFuYWdlciBpbXBsZW1lbnRzIFdpbmRvd01hbmFnZXIgewotICAgICAgICBMb2NhbFdpbmRvd01hbmFnZXIoV2luZG93TWFuYWdlciB3bSkgeworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUhhcmR3YXJlQWNjZWxlcmF0ZWQ7CisKKyAgICAgICAgTG9jYWxXaW5kb3dNYW5hZ2VyKFdpbmRvd01hbmFnZXIgd20sIGJvb2xlYW4gaGFyZHdhcmVBY2NlbGVyYXRlZCkgewogICAgICAgICAgICAgbVdpbmRvd01hbmFnZXIgPSB3bTsKICAgICAgICAgICAgIG1EZWZhdWx0RGlzcGxheSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERlZmF1bHREaXNwbGF5KAogICAgICAgICAgICAgICAgICAgICBtV2luZG93TWFuYWdlci5nZXREZWZhdWx0RGlzcGxheSgpKTsKKyAgICAgICAgICAgIG1IYXJkd2FyZUFjY2VsZXJhdGVkID0gaGFyZHdhcmVBY2NlbGVyYXRlZDsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFkZFZpZXcoVmlldyB2aWV3LCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHBhcmFtcykgewpAQCAtNDIxLDYgKzQ3Miw5IEBACiAgICAgICAgICAgICBpZiAod3AucGFja2FnZU5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHdwLnBhY2thZ2VOYW1lID0gbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSGFyZHdhcmVBY2NlbGVyYXRlZCkgeworICAgICAgICAgICAgICAgIHdwLmZsYWdzIHw9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtV2luZG93TWFuYWdlci5hZGRWaWV3KHZpZXcsIHBhcmFtcyk7CiAgICAgICAgIH0KIApAQCAtNzEzLDYgKzc2NywxNSBAQAogICAgICAgICByZXR1cm4gKG1GZWF0dXJlcyZmbGFnKSAhPSAwOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEBoaWRlIFVzZWQgaW50ZXJuYWxseSB0byBoZWxwIHJlc29sdmUgY29uZmxpY3RpbmcgZmVhdHVyZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRmVhdHVyZShpbnQgZmVhdHVyZUlkKSB7CisgICAgICAgIGZpbmFsIGludCBmbGFnID0gMTw8ZmVhdHVyZUlkOworICAgICAgICBtRmVhdHVyZXMgJj0gfmZsYWc7CisgICAgICAgIG1Mb2NhbEZlYXR1cmVzICY9IH4obUNvbnRhaW5lciAhPSBudWxsID8gKGZsYWcmfm1Db250YWluZXIubUZlYXR1cmVzKSA6IGZsYWcpOworICAgIH0KKwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1ha2VBY3RpdmUoKSB7CiAgICAgICAgIGlmIChtQ29udGFpbmVyICE9IG51bGwpIHsKICAgICAgICAgICAgIGlmIChtQ29udGFpbmVyLm1BY3RpdmVDaGlsZCAhPSBudWxsKSB7CkBAIC04MTcsNiArODgwLDggQEAKIAogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRvZ2dsZVBhbmVsKGludCBmZWF0dXJlSWQsIEtleUV2ZW50IGV2ZW50KTsKIAorICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGludmFsaWRhdGVQYW5lbE1lbnUoaW50IGZlYXR1cmVJZCk7CisgICAgCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcGVyZm9ybVBhbmVsU2hvcnRjdXQoaW50IGZlYXR1cmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5Q29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudCBldmVudCwKQEAgLTk5Niw2ICsxMDYxLDE2IEBACiAgICAgewogICAgICAgICByZXR1cm4gbUZlYXR1cmVzOwogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBRdWVyeSBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiBhIGNlcnRhaW4gZmVhdHVyZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmVhdHVyZSBUaGUgZmVhdHVyZSBJRCB0byBjaGVjaworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmVhdHVyZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzRmVhdHVyZShpbnQgZmVhdHVyZSkgeworICAgICAgICByZXR1cm4gKGdldEZlYXR1cmVzKCkgJiAoMSA8PCBmZWF0dXJlKSkgIT0gMDsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGZlYXR1cmUgYml0cyB0aGF0IGFyZSBiZWluZyBpbXBsZW1lbnRlZCBieSB0aGlzIFdpbmRvdy4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyLmphdmEKaW5kZXggOWM0YWVmZS4uZWRkZDA0ZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyLmphdmEKQEAgLTcyLDYgKzcyLDcgQEAKICAgICAgICAgICogV2hlbiB1c2luZyB7QGxpbmsgR3Jhdml0eSNMRUZUfSBvciB7QGxpbmsgR3Jhdml0eSNSSUdIVH0gaXQgcHJvdmlkZXMKICAgICAgICAgICogYW4gb2Zmc2V0IGZyb20gdGhlIGdpdmVuIGVkZ2UuCiAgICAgICAgICAqLworICAgICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKICAgICAgICAgcHVibGljIGludCB4OwogICAgICAgICAKICAgICAgICAgLyoqCkBAIC03OSw2ICs4MCw3IEBACiAgICAgICAgICAqIFdoZW4gdXNpbmcge0BsaW5rIEdyYXZpdHkjVE9QfSBvciB7QGxpbmsgR3Jhdml0eSNCT1RUT019IGl0IHByb3ZpZGVzCiAgICAgICAgICAqIGFuIG9mZnNldCBmcm9tIHRoZSBnaXZlbiBlZGdlLgogICAgICAgICAgKi8KKyAgICAgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CiAgICAgICAgIHB1YmxpYyBpbnQgeTsKIAogICAgICAgICAvKioKQEAgLTg3LDYgKzg5LDcgQEAKICAgICAgICAgICogc2hvdWxkIG5vdCBiZSBzdHJldGNoZWQuIE90aGVyd2lzZSB0aGUgZXh0cmEgcGl4ZWxzIHdpbGwgYmUgcHJvLXJhdGVkCiAgICAgICAgICAqIGFtb25nIGFsbCB2aWV3cyB3aG9zZSB3ZWlnaHQgaXMgZ3JlYXRlciB0aGFuIDAuCiAgICAgICAgICAqLworICAgICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKICAgICAgICAgcHVibGljIGZsb2F0IGhvcml6b250YWxXZWlnaHQ7CiAKICAgICAgICAgLyoqCkBAIC05NSw4ICs5OCw5IEBACiAgICAgICAgICAqIHNob3VsZCBub3QgYmUgc3RyZXRjaGVkLiBPdGhlcndpc2UgdGhlIGV4dHJhIHBpeGVscyB3aWxsIGJlIHByby1yYXRlZAogICAgICAgICAgKiBhbW9uZyBhbGwgdmlld3Mgd2hvc2Ugd2VpZ2h0IGlzIGdyZWF0ZXIgdGhhbiAwLgogICAgICAgICAgKi8KKyAgICAgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CiAgICAgICAgIHB1YmxpYyBmbG9hdCB2ZXJ0aWNhbFdlaWdodDsKLSAgICAgICAgCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBnZW5lcmFsIHR5cGUgb2Ygd2luZG93LiAgVGhlcmUgYXJlIHRocmVlIG1haW4gY2xhc3NlcyBvZgogICAgICAgICAgKiB3aW5kb3cgdHlwZXM6CkBAIC0zNDMsNiArMzQ3LDEzIEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfU1RBVFVTX0JBUl9QQU5FTCAgID0gRklSU1RfU1lTVEVNX1dJTkRPVysxNDsKICAgICAgICAgCiAgICAgICAgIC8qKgorICAgICAgICAgKiBXaW5kb3cgdHlwZTogdGhlIGRyYWctYW5kLWRyb3AgcHNldWRvd2luZG93LiAgVGhlcmUgaXMgb25seSBvbmUKKyAgICAgICAgICogZHJhZyBsYXllciAoYXQgbW9zdCksIGFuZCBpdCBpcyBwbGFjZWQgb24gdG9wIG9mIGFsbCBvdGhlciB3aW5kb3dzLgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9EUkFHICAgICAgICAgICAgICAgPSBGSVJTVF9TWVNURU1fV0lORE9XKzE1OworCisgICAgICAgIC8qKgogICAgICAgICAgKiBFbmQgb2YgdHlwZXMgb2Ygc3lzdGVtIHdpbmRvd3MuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVNUX1NZU1RFTV9XSU5ET1cgICAgICA9IDI5OTk7CkBAIC0zODksNiArNDAwLDcgQEAKICAgICAgICAgICogQHNlZSAjRkxBR19GVUxMU0NSRUVOCiAgICAgICAgICAqIEBzZWUgI0ZMQUdfRk9SQ0VfTk9UX0ZVTExTQ1JFRU4KICAgICAgICAgICogQHNlZSAjRkxBR19JR05PUkVfQ0hFRUtfUFJFU1NFUworICAgICAgICAgKiBAc2VlICNGTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVECiAgICAgICAgICAqLwogICAgICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkoZmxhZ01hcHBpbmcgPSB7CiAgICAgICAgICAgICBAVmlld0RlYnVnLkZsYWdUb1N0cmluZyhtYXNrID0gRkxBR19CTFVSX0JFSElORCwgZXF1YWxzID0gRkxBR19CTFVSX0JFSElORCwKQEAgLTQyMCw3ICs0MzIsOSBAQAogICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEZMQUdfRk9SQ0VfTk9UX0ZVTExTQ1JFRU4sCiAgICAgICAgICAgICAgICAgICAgIGVxdWFscyA9IEZMQUdfRk9SQ0VfTk9UX0ZVTExTQ1JFRU4sIG5hbWUgPSAiRkxBR19GT1JDRV9OT1RfRlVMTFNDUkVFTiIpLAogICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEZMQUdfSUdOT1JFX0NIRUVLX1BSRVNTRVMsCi0gICAgICAgICAgICAgICAgICAgIGVxdWFscyA9IEZMQUdfSUdOT1JFX0NIRUVLX1BSRVNTRVMsIG5hbWUgPSAiRkxBR19JR05PUkVfQ0hFRUtfUFJFU1NFUyIpCisgICAgICAgICAgICAgICAgICAgIGVxdWFscyA9IEZMQUdfSUdOT1JFX0NIRUVLX1BSRVNTRVMsIG5hbWUgPSAiRkxBR19JR05PUkVfQ0hFRUtfUFJFU1NFUyIpLAorICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQsCisgICAgICAgICAgICAgICAgICAgIGVxdWFscyA9IEZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQsIG5hbWUgPSAiRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCIpCiAgICAgICAgIH0pCiAgICAgICAgIHB1YmxpYyBpbnQgZmxhZ3M7CiAgICAgICAgIApAQCAtNjE2LDYgKzYzMCwxMiBAQAogICAgICAgICAgKiBpdCBpcyBjcmVhdGVkLgogICAgICAgICAgKiB7QGhpZGV9ICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfU1lTVEVNX0VSUk9SID0gMHg0MDAwMDAwMDsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHdpbmRvdyBzaG91bGQgYmUgaGFyZHdhcmUgYWNjZWxlcmF0ZWQuCisgICAgICAgICAqIFJlcXVlc3RpbmcgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGRvZXMgbm90IGd1YXJhbnRlZSBpdCB3aWxsIGhhcHBlbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQgPSAweDgwMDAwMDAwOyAgICAgICAgCiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdpdmVuIGEgcGFydGljdWxhciBzZXQgb2Ygd2luZG93IG1hbmFnZXIgZmxhZ3MsIGRldGVybWluZSB3aGV0aGVyCkBAIC0xMDg4LDYgKzExMDgsNyBAQAogICAgICAgICAgICAgICAgIHNjcmVlbk9yaWVudGF0aW9uID0gby5zY3JlZW5PcmllbnRhdGlvbjsKICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IFNDUkVFTl9PUklFTlRBVElPTl9DSEFOR0VEOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICByZXR1cm4gY2hhbmdlczsKICAgICAgICAgfQogICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1hbmFnZXIuamF2YQppbmRleCAwMTg2MjcwLi5mNDA2ZGE5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1hbmFnZXIuamF2YQpAQCAtOTQsNyArOTQsOSBAQAogICAgIHB1YmxpYyBzdGF0aWMgQWNjZXNzaWJpbGl0eU1hbmFnZXIgZ2V0SW5zdGFuY2UoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAoc0luc3RhbmNlU3luYykgewogICAgICAgICAgICAgaWYgKHNJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc0luc3RhbmNlID0gbmV3IEFjY2Vzc2liaWxpdHlNYW5hZ2VyKGNvbnRleHQpOworICAgICAgICAgICAgICAgIElCaW5kZXIgaUJpbmRlciA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5BQ0NFU1NJQklMSVRZX1NFUlZJQ0UpOworICAgICAgICAgICAgICAgIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBzZXJ2aWNlID0gSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoaUJpbmRlcik7CisgICAgICAgICAgICAgICAgc0luc3RhbmNlID0gbmV3IEFjY2Vzc2liaWxpdHlNYW5hZ2VyKGNvbnRleHQsIHNlcnZpY2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzSW5zdGFuY2U7CkBAIC0xMDQsMTMgKzEwNiwxNiBAQAogICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBjb250ZXh0IEEge0BsaW5rIENvbnRleHR9LgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIEFuIGludGVyZmFjZSB0byB0aGUgYmFja2luZyBzZXJ2aWNlLgorICAgICAqCisgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlNYW5hZ2VyKENvbnRleHQgY29udGV4dCkgeworICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihDb250ZXh0IGNvbnRleHQsIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBzZXJ2aWNlKSB7CiAgICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcihjb250ZXh0LmdldE1haW5Mb29wZXIoKSk7Ci0gICAgICAgIElCaW5kZXIgaUJpbmRlciA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5BQ0NFU1NJQklMSVRZX1NFUlZJQ0UpOwotICAgICAgICBtU2VydmljZSA9IElBY2Nlc3NpYmlsaXR5TWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKGlCaW5kZXIpOworICAgICAgICBtU2VydmljZSA9IHNlcnZpY2U7CisKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1TZXJ2aWNlLmFkZENsaWVudChtQ2xpZW50KTsKKyAgICAgICAgICAgIG1Jc0VuYWJsZWQgPSBtU2VydmljZS5hZGRDbGllbnQobUNsaWVudCk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZSkgewogICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZSBpcyBkZWFkIiwgcmUpOwogICAgICAgICB9CkBAIC0xMjgsNiArMTMzLDE4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2xpZW50IGludGVyZmFjZSB0aGlzIGluc3RhbmNlIHJlZ2lzdGVycyBpbgorICAgICAqIHRoZSBjZW50cmFsaXplZCBhY2Nlc3NpYmlsaXR5IG1hbmFnZXIgc2VydmljZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBnZXRDbGllbnQoKSB7CisgICAgICAgcmV0dXJuIChJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQpIG1DbGllbnQuYXNCaW5kZXIoKTsgCisgICAgfQorCisgICAgLyoqCiAgICAgICogU2VuZHMgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH0uIElmIHRoaXMge0BsaW5rIEFjY2Vzc2liaWxpdHlNYW5hZ2VyfSBpcyBub3QKICAgICAgKiBlbmFibGVkIHRoZSBjYWxsIGlzIGEgTk9PUC4KICAgICAgKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5TWFuYWdlci5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5TWFuYWdlci5haWRsCmluZGV4IDMyNzg4YmUuLjc2MzM1NjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9JQWNjZXNzaWJpbGl0eU1hbmFnZXIuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFpZGwKQEAgLTI5LDcgKzI5LDcgQEAKICAqLwogaW50ZXJmYWNlIElBY2Nlc3NpYmlsaXR5TWFuYWdlciB7CiAKLSAgICB2b2lkIGFkZENsaWVudChJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgY2xpZW50KTsKKyAgICBib29sZWFuIGFkZENsaWVudChJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgY2xpZW50KTsKIAogICAgIGJvb2xlYW4gc2VuZEFjY2Vzc2liaWxpdHlFdmVudChpbiBBY2Nlc3NpYmlsaXR5RXZlbnQgdWlFdmVudCk7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uLmphdmEKaW5kZXggMzQ5YjdlNS4uOWExZTQxYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uLmphdmEKQEAgLTE3NCw3ICsxNzQsMTMgQEAKICAgICAgKiBEZXNpcmVkIFogb3JkZXIgbW9kZSBkdXJpbmcgYW5pbWF0aW9uLgogICAgICAqLwogICAgIHByaXZhdGUgaW50IG1aQWRqdXN0bWVudDsKLSAgICAKKworICAgIC8qKgorICAgICAqIHNjYWxlZmFjdG9yIHRvIGFwcGx5IHRvIHBpdm90IHBvaW50cywgZXRjLiBkdXJpbmcgYW5pbWF0aW9uLiBTdWJjbGFzc2VzIHJldHJpZXZlIHRoZQorICAgICAqIHZhbHVlIHZpYSBnZXRTY2FsZUZhY3RvcigpLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbVNjYWxlRmFjdG9yID0gMWY7CisKICAgICAvKioKICAgICAgKiBEb24ndCBhbmltYXRlIHRoZSB3YWxscGFwZXIuCiAgICAgICovCkBAIC0zMDEsNyArMzA3LDcgQEAKICAgICAgKiBhbmltYXRlZCBhcyB3ZWxsIGFzIHRoZSBvYmplY3RzIHBhcmVudHMuIChUaGlzIGlzIHRvIHN1cHBvcnQgYW5pbWF0aW9uCiAgICAgICogc2l6ZXMgYmVpbmcgc3BlY2lmZWQgcmVsYXRpdmUgdG8gdGhlc2UgZGltZW5zaW9ucy4pCiAgICAgICoKLSAgICAgKiA8cD5PYmplY3RzIHRoYXQgaW50ZXJwcmV0IGEgQW5pbWF0aW9ucyBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCB3aGVuCisgICAgICogPHA+T2JqZWN0cyB0aGF0IGludGVycHJldCBBbmltYXRpb25zIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIHdoZW4KICAgICAgKiB0aGUgc2l6ZXMgb2YgdGhlIG9iamVjdCBiZWluZyBhbmltYXRlZCBhbmQgaXRzIHBhcmVudCBhcmUga25vd24sIGFuZAogICAgICAqIGJlZm9yZSBjYWxsaW5nIHtAbGluayAjZ2V0VHJhbnNmb3JtYXRpb259LgogICAgICAqCkBAIC01NTMsNiArNTU5LDE5IEBACiAgICAgfQogICAgIAogICAgIC8qKgorICAgICAqIFRoZSBzY2FsZSBmYWN0b3IgaXMgc2V0IGJ5IHRoZSBjYWxsIHRvIDxjb2RlPmdldFRyYW5zZm9ybWF0aW9uPC9jb2RlPi4gT3ZlcnJpZGVzIG9mIAorICAgICAqIHtAbGluayAjZ2V0VHJhbnNmb3JtYXRpb24obG9uZywgVHJhbnNmb3JtYXRpb24sIGZsb2F0KX0gd2lsbCBnZXQgdGhpcyB2YWx1ZQorICAgICAqIGRpcmVjdGx5LiBPdmVycmlkZXMgb2Yge0BsaW5rICNhcHBseVRyYW5zZm9ybWF0aW9uKGZsb2F0LCBUcmFuc2Zvcm1hdGlvbil9IGNhbgorICAgICAqIGNhbGwgdGhpcyBtZXRob2QgdG8gZ2V0IHRoZSB2YWx1ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGZsb2F0IFRoZSBzY2FsZSBmYWN0b3IgdGhhdCBzaG91bGQgYmUgYXBwbGllZCB0byBwcmUtc2NhbGVkIHZhbHVlcyBpbgorICAgICAqIGFuIEFuaW1hdGlvbiBzdWNoIGFzIHRoZSBwaXZvdCBwb2ludHMgaW4ge0BsaW5rIFNjYWxlQW5pbWF0aW9ufSBhbmQge0BsaW5rIFJvdGF0ZUFuaW1hdGlvbn0uCisgICAgICovCisgICAgcHJvdGVjdGVkIGZsb2F0IGdldFNjYWxlRmFjdG9yKCkgeworICAgICAgICByZXR1cm4gbVNjYWxlRmFjdG9yOworICAgIH0KKworICAgIC8qKgogICAgICAqIElmIGRldGFjaFdhbGxwYXBlciBpcyB0cnVlLCBhbmQgdGhpcyBpcyBhIHdpbmRvdyBhbmltYXRpb24gb2YgYSB3aW5kb3cKICAgICAgKiB0aGF0IGhhcyBhIHdhbGxwYXBlciBiYWNrZ3JvdW5kLCB0aGVuIHRoZSB3aW5kb3cgd2lsbCBiZSBkZXRhY2hlZCBmcm9tCiAgICAgICogdGhlIHdhbGxwYXBlciB3aGlsZSBpdCBydW5zLiAgVGhhdCBpcywgdGhlIGFuaW1hdGlvbiB3aWxsIG9ubHkgYmUgYXBwbGllZApAQCAtNzM1LDYgKzc1NCw3IEBACiAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBhbmltYXRpb24gaXMgc3RpbGwgcnVubmluZwogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGdldFRyYW5zZm9ybWF0aW9uKGxvbmcgY3VycmVudFRpbWUsIFRyYW5zZm9ybWF0aW9uIG91dFRyYW5zZm9ybWF0aW9uKSB7CisKICAgICAgICAgaWYgKG1TdGFydFRpbWUgPT0gLTEpIHsKICAgICAgICAgICAgIG1TdGFydFRpbWUgPSBjdXJyZW50VGltZTsKICAgICAgICAgfQpAQCAtODA2LDYgKzgyNiwyNCBAQAogCiAgICAgICAgIHJldHVybiBtTW9yZTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdHJhbnNmb3JtYXRpb24gdG8gYXBwbHkgYXQgYSBzcGVjaWZpZWQgcG9pbnQgaW4gdGltZS4gSW1wbGVtZW50YXRpb25zIG9mIHRoaXMKKyAgICAgKiBtZXRob2Qgc2hvdWxkIGFsd2F5cyByZXBsYWNlIHRoZSBzcGVjaWZpZWQgVHJhbnNmb3JtYXRpb24gb3IgZG9jdW1lbnQgdGhleSBhcmUgZG9pbmcKKyAgICAgKiBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3VycmVudFRpbWUgV2hlcmUgd2UgYXJlIGluIHRoZSBhbmltYXRpb24uIFRoaXMgaXMgd2FsbCBjbG9jayB0aW1lLgorICAgICAqIEBwYXJhbSBvdXRUcmFuc2Zvcm1hdGlvbiBBIHRyYW5mb3JtYXRpb24gb2JqZWN0IHRoYXQgaXMgcHJvdmlkZWQgYnkgdGhlCisgICAgICogICAgICAgIGNhbGxlciBhbmQgd2lsbCBiZSBmaWxsZWQgaW4gYnkgdGhlIGFuaW1hdGlvbi4KKyAgICAgKiBAcGFyYW0gc2NhbGUgU2NhbGluZyBmYWN0b3IgdG8gYXBwbHkgdG8gYW55IGlucHV0cyB0byB0aGUgdHJhbnNmb3JtIG9wZXJhdGlvbiwgc3VjaAorICAgICAqICAgICAgICBwaXZvdCBwb2ludHMgYmVpbmcgcm90YXRlZCBvciBzY2FsZWQgYXJvdW5kLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgYW5pbWF0aW9uIGlzIHN0aWxsIHJ1bm5pbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRUcmFuc2Zvcm1hdGlvbihsb25nIGN1cnJlbnRUaW1lLCBUcmFuc2Zvcm1hdGlvbiBvdXRUcmFuc2Zvcm1hdGlvbiwKKyAgICAgICAgICAgIGZsb2F0IHNjYWxlKSB7CisgICAgICAgIG1TY2FsZUZhY3RvciA9IHNjYWxlOworICAgICAgICByZXR1cm4gZ2V0VHJhbnNmb3JtYXRpb24oY3VycmVudFRpbWUsIG91dFRyYW5zZm9ybWF0aW9uKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiA8cD5JbmRpY2F0ZXMgd2hldGhlciB0aGlzIGFuaW1hdGlvbiBoYXMgc3RhcnRlZCBvciBub3QuPC9wPgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uU2V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25TZXQuamF2YQppbmRleCAxNTQ2ZGNkLi44NzNjZTUzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25TZXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25TZXQuamF2YQpAQCAtMzEyLDcgKzMxMiw3IEBACiAgICAgICAgICAgICBmaW5hbCBBbmltYXRpb24gYSA9IGFuaW1hdGlvbnMuZ2V0KGkpOwogCiAgICAgICAgICAgICB0ZW1wLmNsZWFyKCk7Ci0gICAgICAgICAgICBtb3JlID0gYS5nZXRUcmFuc2Zvcm1hdGlvbihjdXJyZW50VGltZSwgdGVtcCkgfHwgbW9yZTsKKyAgICAgICAgICAgIG1vcmUgPSBhLmdldFRyYW5zZm9ybWF0aW9uKGN1cnJlbnRUaW1lLCB0ZW1wLCBnZXRTY2FsZUZhY3RvcigpKSB8fCBtb3JlOwogICAgICAgICAgICAgdC5jb21wb3NlKHRlbXApOwogCiAgICAgICAgICAgICBzdGFydGVkID0gc3RhcnRlZCB8fCBhLmhhc1N0YXJ0ZWQoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblV0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25VdGlscy5qYXZhCmluZGV4IDMwODgzODIuLjMyZmY2NDcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uVXRpbHMuamF2YQpAQCAtMzMsNiArMzMsMTQgQEAKICAqCiAgKi8KIHB1YmxpYyBjbGFzcyBBbmltYXRpb25VdGlscyB7CisKKyAgICAvKioKKyAgICAgKiBUaGVzZSBmbGFncyBhcmUgdXNlZCB3aGVuIHBhcnNpbmcgQW5pbWF0b3JTZXQgb2JqZWN0cworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT0dFVEhFUiA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFUVVFTlRJQUxMWSA9IDE7CisKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHRpbWUgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHRpbWUgc2hvdWxkIGJlIHVzZWQgd2hlbiBpbnZva2luZwogICAgICAqIHtAbGluayBBbmltYXRpb24jc2V0U3RhcnRUaW1lKGxvbmcpfS4gUmVmZXIgdG8ge0BsaW5rIGFuZHJvaWQub3MuU3lzdGVtQ2xvY2t9IGZvciBtb3JlCkBAIC00OSw3ICs1Nyw3IEBACiAKICAgICAvKioKICAgICAgKiBMb2FkcyBhbiB7QGxpbmsgQW5pbWF0aW9ufSBvYmplY3QgZnJvbSBhIHJlc291cmNlCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gY29udGV4dCBBcHBsaWNhdGlvbiBjb250ZXh0IHVzZWQgdG8gYWNjZXNzIHJlc291cmNlcwogICAgICAqIEBwYXJhbSBpZCBUaGUgcmVzb3VyY2UgaWQgb2YgdGhlIGFuaW1hdGlvbiB0byBsb2FkCiAgICAgICogQHJldHVybiBUaGUgYW5pbWF0aW9uIG9iamVjdCByZWZlcmVuY2UgYnkgdGhlIHNwZWNpZmllZCBpZApAQCAtODIsMTIgKzkwLDEyIEBACiAKICAgICAgICAgcmV0dXJuIGNyZWF0ZUFuaW1hdGlvbkZyb21YbWwoYywgcGFyc2VyLCBudWxsLCBYbWwuYXNBdHRyaWJ1dGVTZXQocGFyc2VyKSk7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSBzdGF0aWMgQW5pbWF0aW9uIGNyZWF0ZUFuaW1hdGlvbkZyb21YbWwoQ29udGV4dCBjLCBYbWxQdWxsUGFyc2VyIHBhcnNlciwKICAgICAgICAgICAgIEFuaW1hdGlvblNldCBwYXJlbnQsIEF0dHJpYnV0ZVNldCBhdHRycykgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgCisKICAgICAgICAgQW5pbWF0aW9uIGFuaW0gPSBudWxsOwotIAorCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgb24gYSBzdGFydCB0YWcuCiAgICAgICAgIGludCB0eXBlOwogICAgICAgICBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKQEAgLTEwMCw3ICsxMDgsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmcgIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwotICAgIAorCiAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoInNldCIpKSB7CiAgICAgICAgICAgICAgICAgYW5pbSA9IG5ldyBBbmltYXRpb25TZXQoYywgYXR0cnMpOwogICAgICAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGlvbkZyb21YbWwoYywgcGFyc2VyLCAoQW5pbWF0aW9uU2V0KWFuaW0sIGF0dHJzKTsKQEAgLTEyMCw3ICsxMjgsNyBAQAogICAgICAgICAgICAgICAgIHBhcmVudC5hZGRBbmltYXRpb24oYW5pbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAKKwogICAgICAgICByZXR1cm4gYW5pbTsKIAogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL1JvdGF0ZUFuaW1hdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vUm90YXRlQW5pbWF0aW9uLmphdmEKaW5kZXggMjg0Y2NjZS4uNThiZjA4NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vUm90YXRlQW5pbWF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vUm90YXRlQW5pbWF0aW9uLmphdmEKQEAgLTE0OCwxMSArMTQ4LDEyIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlUcmFuc2Zvcm1hdGlvbihmbG9hdCBpbnRlcnBvbGF0ZWRUaW1lLCBUcmFuc2Zvcm1hdGlvbiB0KSB7CiAgICAgICAgIGZsb2F0IGRlZ3JlZXMgPSBtRnJvbURlZ3JlZXMgKyAoKG1Ub0RlZ3JlZXMgLSBtRnJvbURlZ3JlZXMpICogaW50ZXJwb2xhdGVkVGltZSk7Ci0KKyAgICAgICAgZmxvYXQgc2NhbGUgPSBnZXRTY2FsZUZhY3RvcigpOworICAgICAgICAKICAgICAgICAgaWYgKG1QaXZvdFggPT0gMC4wZiAmJiBtUGl2b3RZID09IDAuMGYpIHsKICAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0Um90YXRlKGRlZ3JlZXMpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdC5nZXRNYXRyaXgoKS5zZXRSb3RhdGUoZGVncmVlcywgbVBpdm90WCwgbVBpdm90WSk7CisgICAgICAgICAgICB0LmdldE1hdHJpeCgpLnNldFJvdGF0ZShkZWdyZWVzLCBtUGl2b3RYICogc2NhbGUsIG1QaXZvdFkgKiBzY2FsZSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL1NjYWxlQW5pbWF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9TY2FsZUFuaW1hdGlvbi5qYXZhCmluZGV4IDFhNTZjOGIuLjg1MzdkNDIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL1NjYWxlQW5pbWF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vU2NhbGVBbmltYXRpb24uamF2YQpAQCAtMTYxLDYgKzE2MSw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlUcmFuc2Zvcm1hdGlvbihmbG9hdCBpbnRlcnBvbGF0ZWRUaW1lLCBUcmFuc2Zvcm1hdGlvbiB0KSB7CiAgICAgICAgIGZsb2F0IHN4ID0gMS4wZjsKICAgICAgICAgZmxvYXQgc3kgPSAxLjBmOworICAgICAgICBmbG9hdCBzY2FsZSA9IGdldFNjYWxlRmFjdG9yKCk7CiAKICAgICAgICAgaWYgKG1Gcm9tWCAhPSAxLjBmIHx8IG1Ub1ggIT0gMS4wZikgewogICAgICAgICAgICAgc3ggPSBtRnJvbVggKyAoKG1Ub1ggLSBtRnJvbVgpICogaW50ZXJwb2xhdGVkVGltZSk7CkBAIC0xNzIsNyArMTczLDcgQEAKICAgICAgICAgaWYgKG1QaXZvdFggPT0gMCAmJiBtUGl2b3RZID09IDApIHsKICAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0U2NhbGUoc3gsIHN5KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0U2NhbGUoc3gsIHN5LCBtUGl2b3RYLCBtUGl2b3RZKTsKKyAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0U2NhbGUoc3gsIHN5LCBzY2FsZSAqIG1QaXZvdFgsIHNjYWxlICogbVBpdm90WSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2QuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2QuamF2YQppbmRleCAyZGRmNWY4Li41YWIzZDM0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZC5qYXZhCkBAIC0yMTksNCArMjE5LDEwIEBACiAgICAgICoge0BsaW5rIElucHV0TWV0aG9kTWFuYWdlciNSRVNVTFRfSElEREVOIElucHV0TWV0aG9kTWFuYWdlci5SRVNVTFRfSElEREVOfS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBoaWRlU29mdElucHV0KGludCBmbGFncywgUmVzdWx0UmVjZWl2ZXIgcmVzdWx0UmVjZWl2ZXIpOworCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoYXQgdGhlIGlucHV0IG1ldGhvZCBzdWJ0eXBlIGlzIGJlaW5nIGNoYW5nZWQgaW4gdGhlIHNhbWUgaW5wdXQgbWV0aG9kLgorICAgICAqIEBwYXJhbSBzdWJ0eXBlIE5ldyBzdWJ0eXBlIG9mIHRoZSBub3RpZmllZCBpbnB1dCBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjaGFuZ2VJbnB1dE1ldGhvZFN1YnR5cGUoSW5wdXRNZXRob2RTdWJ0eXBlIHN1YnR5cGUpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZEluZm8uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RJbmZvLmphdmEKaW5kZXggMzU3Y2I1ZmUuLjU0MTAyZjYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RJbmZvLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZEluZm8uamF2YQpAQCAtMzcsMTMgKzM3LDE0IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogLyoqCiAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gc3BlY2lmeSBtZXRhIGluZm9ybWF0aW9uIG9mIGFuIGlucHV0IG1ldGhvZC4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIElucHV0TWV0aG9kSW5mbyBpbXBsZW1lbnRzIFBhcmNlbGFibGUgewogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIklucHV0TWV0aG9kSW5mbyI7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBUaGUgU2VydmljZSB0aGF0IGltcGxlbWVudHMgdGhpcyBpbnB1dCBtZXRob2QgY29tcG9uZW50LgogICAgICAqLwpAQCAtNjgsNyArNjksMTIgQEAKICAgICAgKiBjYW4gY2hhbmdlIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uIChpbiBwYXJ0aWN1bGFyIGxvY2FsZSkuCiAgICAgICovCiAgICAgZmluYWwgaW50IG1Jc0RlZmF1bHRSZXNJZDsKLSAgICAKKworICAgIC8qKgorICAgICAqIFRoZSBhcnJheSBvZiB0aGUgc3VidHlwZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPiBtU3VidHlwZXMgPSBuZXcgQXJyYXlMaXN0PElucHV0TWV0aG9kU3VidHlwZT4oKTsKKwogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yLgogICAgICAqIApAQCAtODEsMTEgKzg3LDExIEBACiAgICAgICAgIG1TZXJ2aWNlID0gc2VydmljZTsKICAgICAgICAgU2VydmljZUluZm8gc2kgPSBzZXJ2aWNlLnNlcnZpY2VJbmZvOwogICAgICAgICBtSWQgPSBuZXcgQ29tcG9uZW50TmFtZShzaS5wYWNrYWdlTmFtZSwgc2kubmFtZSkuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKLSAgICAgICAgCisKICAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CiAgICAgICAgIFN0cmluZyBzZXR0aW5nc0FjdGl2aXR5Q29tcG9uZW50ID0gbnVsbDsKICAgICAgICAgaW50IGlzRGVmYXVsdFJlc0lkID0gMDsKLSAgICAgICAgCisKICAgICAgICAgWG1sUmVzb3VyY2VQYXJzZXIgcGFyc2VyID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHBhcnNlciA9IHNpLmxvYWRYbWxNZXRhRGF0YShwbSwgSW5wdXRNZXRob2QuU0VSVklDRV9NRVRBX0RBVEEpOwpAQCAtMTE2LDEzICsxMjIsMzkgQEAKICAgICAgICAgICAgIGlzRGVmYXVsdFJlc0lkID0gc2EuZ2V0UmVzb3VyY2VJZCgKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuSW5wdXRNZXRob2RfaXNEZWZhdWx0LCAwKTsKICAgICAgICAgICAgIHNhLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgZmluYWwgaW50IGRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisgICAgICAgICAgICAvLyBQYXJzZSBhbGwgc3VidHlwZXMKKyAgICAgICAgICAgIHdoaWxlICgoKHR5cGUgPSBwYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcgfHwgcGFyc2VyLmdldERlcHRoKCkgPiBkZXB0aCkKKyAgICAgICAgICAgICAgICAgICAgJiYgdHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCkgeworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEic3VidHlwZSIuZXF1YWxzKG5vZGVOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXRhLWRhdGEgaW4gaW5wdXQtbWV0aG9kIGRvZXMgbm90IHN0YXJ0IHdpdGggc3VidHlwZSB0YWciKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlZEFycmF5IGEgPSByZXMub2J0YWluQXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuSW5wdXRNZXRob2RfU3VidHlwZSk7CisgICAgICAgICAgICAgICAgICAgIElucHV0TWV0aG9kU3VidHlwZSBzdWJ0eXBlID0gbmV3IElucHV0TWV0aG9kU3VidHlwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmdldFJlc291cmNlSWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5JbnB1dE1ldGhvZF9TdWJ0eXBlX2xhYmVsLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmdldFJlc291cmNlSWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5JbnB1dE1ldGhvZF9TdWJ0eXBlX2ljb24sIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSW5wdXRNZXRob2RfU3VidHlwZV9pbWVTdWJ0eXBlTG9jYWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmdldFJlc291cmNlSWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5JbnB1dE1ldGhvZF9TdWJ0eXBlX2ltZVN1YnR5cGVNb2RlLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLklucHV0TWV0aG9kX1N1YnR5cGVfaW1lU3VidHlwZUV4dHJhVmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgbVN1YnR5cGVzLmFkZChzdWJ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBjcmVhdGUgY29udGV4dCBmb3I6ICIgKyBzaS5wYWNrYWdlTmFtZSk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBpZiAocGFyc2VyICE9IG51bGwpIHBhcnNlci5jbG9zZSgpOwogICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICBtU2V0dGluZ3NBY3Rpdml0eU5hbWUgPSBzZXR0aW5nc0FjdGl2aXR5Q29tcG9uZW50OwogICAgICAgICBtSXNEZWZhdWx0UmVzSWQgPSBpc0RlZmF1bHRSZXNJZDsKICAgICB9CkBAIC0xMzIsOCArMTY0LDkgQEAKICAgICAgICAgbVNldHRpbmdzQWN0aXZpdHlOYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgICAgICAgbUlzRGVmYXVsdFJlc0lkID0gc291cmNlLnJlYWRJbnQoKTsKICAgICAgICAgbVNlcnZpY2UgPSBSZXNvbHZlSW5mby5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoc291cmNlKTsKKyAgICAgICAgc291cmNlLnJlYWRUeXBlZExpc3QobVN1YnR5cGVzLCBJbnB1dE1ldGhvZFN1YnR5cGUuQ1JFQVRPUik7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogVGVtcG9yYXJ5IEFQSSBmb3IgY3JlYXRpbmcgYSBidWlsdC1pbiBpbnB1dCBtZXRob2QuCiAgICAgICovCkBAIC0xNTYsNyArMTg5LDcgQEAKICAgICAgICAgbVNldHRpbmdzQWN0aXZpdHlOYW1lID0gc2V0dGluZ3NBY3Rpdml0eTsKICAgICAgICAgbUlzRGVmYXVsdFJlc0lkID0gMDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gYSB1bmlxdWUgSUQgZm9yIHRoaXMgaW5wdXQgbWV0aG9kLiAgVGhlIElEIGlzIGdlbmVyYXRlZCBmcm9tCiAgICAgICogdGhlIHBhY2thZ2UgYW5kIGNsYXNzIG5hbWUgaW1wbGVtZW50aW5nIHRoZSBtZXRob2QuCkBAIC0xNjQsMTQgKzE5NywxNCBAQAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CiAgICAgICAgIHJldHVybiBtSWQ7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSAuYXBrIHBhY2thZ2UgdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW5wdXQgbWV0aG9kLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7CiAgICAgICAgIHJldHVybiBtU2VydmljZS5zZXJ2aWNlSW5mby5wYWNrYWdlTmFtZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIG5hbWUgb2YgdGhlIHNlcnZpY2UgY29tcG9uZW50IHRoYXQgaW1wbGVtZW50cwogICAgICAqIHRoaXMgaW5wdXQgbWV0aG9kLgpAQCAtMTk2LDcgKzIyOSw3IEBACiAgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50TmFtZShtU2VydmljZS5zZXJ2aWNlSW5mby5wYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBtU2VydmljZS5zZXJ2aWNlSW5mby5uYW1lKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBMb2FkIHRoZSB1c2VyLWRpc3BsYXllZCBsYWJlbCBmb3IgdGhpcyBpbnB1dCBtZXRob2QuCiAgICAgICogCkBAIC0yMDYsNyArMjM5LDcgQEAKICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGxvYWRMYWJlbChQYWNrYWdlTWFuYWdlciBwbSkgewogICAgICAgICByZXR1cm4gbVNlcnZpY2UubG9hZExhYmVsKHBtKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBMb2FkIHRoZSB1c2VyLWRpc3BsYXllZCBpY29uIGZvciB0aGlzIGlucHV0IG1ldGhvZC4KICAgICAgKiAKQEAgLTIxNiw3ICsyNDksNyBAQAogICAgIHB1YmxpYyBEcmF3YWJsZSBsb2FkSWNvbihQYWNrYWdlTWFuYWdlciBwbSkgewogICAgICAgICByZXR1cm4gbVNlcnZpY2UubG9hZEljb24ocG0pOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBvZiBhbiBhY3Rpdml0eSB0aGF0IHByb3ZpZGVzIGEgc2V0dGluZ3MgVUkgZm9yCiAgICAgICogdGhlIGlucHV0IG1ldGhvZC4gIFlvdSBjYW4gbGF1bmNoIHRoaXMgYWN0aXZpdHkgYmUgc3RhcnRpbmcgaXQgd2l0aApAQCAtMjMwLDcgKzI2MywxNCBAQAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2V0dGluZ3NBY3Rpdml0eSgpIHsKICAgICAgICAgcmV0dXJuIG1TZXR0aW5nc0FjdGl2aXR5TmFtZTsKICAgICB9Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHN1YnR5cGVzIG9mIElucHV0IE1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXJyYXlMaXN0PElucHV0TWV0aG9kU3VidHlwZT4gZ2V0U3VidHlwZXMoKSB7CisgICAgICAgIHJldHVybiBtU3VidHlwZXM7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSByZXNvdXJjZSBpZGVudGlmaWVyIG9mIGEgcmVzb3VyY2UgaW5zaWRlIG9mIHRoaXMgaW5wdXQKICAgICAgKiBtZXRob2QncyAuYXBrIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGl0IHNob3VsZCBiZSBjb25zaWRlcmVkIGEKQEAgLTIzOSw3ICsyNzksNyBAQAogICAgIHB1YmxpYyBpbnQgZ2V0SXNEZWZhdWx0UmVzb3VyY2VJZCgpIHsKICAgICAgICAgcmV0dXJuIG1Jc0RlZmF1bHRSZXNJZDsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBkdW1wKFByaW50ZXIgcHcsIFN0cmluZyBwcmVmaXgpIHsKICAgICAgICAgcHcucHJpbnRsbihwcmVmaXggKyAibUlkPSIgKyBtSWQKICAgICAgICAgICAgICAgICArICIgbVNldHRpbmdzQWN0aXZpdHlOYW1lPSIgKyBtU2V0dGluZ3NBY3Rpdml0eU5hbWUpOwpAQCAtMjg1LDEyICszMjUsMTQgQEAKICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtU2V0dGluZ3NBY3Rpdml0eU5hbWUpOwogICAgICAgICBkZXN0LndyaXRlSW50KG1Jc0RlZmF1bHRSZXNJZCk7CiAgICAgICAgIG1TZXJ2aWNlLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICBkZXN0LndyaXRlVHlwZWRMaXN0KG1TdWJ0eXBlcyk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVXNlZCB0byBtYWtlIHRoaXMgY2xhc3MgcGFyY2VsYWJsZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxJbnB1dE1ldGhvZEluZm8+IENSRUFUT1IgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPElucHV0TWV0aG9kSW5mbz4oKSB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8SW5wdXRNZXRob2RJbmZvPiBDUkVBVE9SCisgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8SW5wdXRNZXRob2RJbmZvPigpIHsKICAgICAgICAgcHVibGljIElucHV0TWV0aG9kSW5mbyBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBzb3VyY2UpIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRNZXRob2RJbmZvKHNvdXJjZSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kTWFuYWdlci5qYXZhCmluZGV4IGUzMDY4N2YuLjhiZDMyOTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZE1hbmFnZXIuamF2YQpAQCAtMTM4MCw3ICsxMzgwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHNob3dJbnB1dE1ldGhvZFBpY2tlcigpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtSCkgewogICAgICAgICAgICAgdHJ5IHsKQEAgLTEzOTEsNiArMTM5MSwxNiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgc2hvd0lucHV0TWV0aG9kU3VidHlwZVBpY2tlcigpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtSCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zaG93SW5wdXRNZXRob2RTdWJ0eXBlUGlja2VyRnJvbUNsaWVudChtQ2xpZW50KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSU1FIGRpZWQ6ICIgKyBtQ3VySWQsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgdm9pZCBkb0R1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIGZvdXQsIFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICAgZmluYWwgUHJpbnRlciBwID0gbmV3IFByaW50V3JpdGVyUHJpbnRlcihmb3V0KTsKICAgICAgICAgcC5wcmludGxuKCJJbnB1dCBtZXRob2QgY2xpZW50IHN0YXRlIGZvciAiICsgdGhpcyArICI6Iik7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kU3VidHlwZS5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZFN1YnR5cGUuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDgyYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZFN1YnR5cGUuYWlkbApAQCAtMCwwICsxLDE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2Q7CisKK3BhcmNlbGFibGUgSW5wdXRNZXRob2RTdWJ0eXBlOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZFN1YnR5cGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RTdWJ0eXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFlZDA0NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RTdWJ0eXBlLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZDsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8qKgorICogSW5mb3JtYXRpb24gZ2l2ZW4gdG8gYW4ge0BsaW5rIElucHV0TWV0aG9kfSBhYm91dCBhIGNsaWVudCBjb25uZWN0aW5nCisgKiB0byBpdC4KKyAqLworLyoqCisgKiBJbnB1dE1ldGhvZFN1YnR5cGUgaXMgYSBzdWJ0eXBlIGNvbnRhaW5lZCBpbiB0aGUgaW5wdXQgbWV0aG9kLiBTdWJ0eXBlIGNhbiBkZXNjcmliZQorICogbG9jYWxlcyAoZS5nLiBlbl9VUywgZnJfRlIuLi4pIGFuZCBtb2RlcyAoZS5nLiB2b2ljZSwga2V5Ym9hcmQuLi4pLCBhbmQgaXMgdXNlZCBmb3IKKyAqIElNRSBzd2l0Y2guIFRoZSBzdWJ0eXBlIGFsbG93cyB0aGUgc3lzdGVtIHRvIGNhbGwgdGhlIHNwZWNpZmllZCBzdWJ0eXBlIG9mIElNRSBkaXJlY3RseS4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIElucHV0TWV0aG9kU3VidHlwZSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIHByaXZhdGUgZmluYWwgaW50IG1TdWJ0eXBlTmFtZVJlc0lkOworICAgIHByaXZhdGUgZmluYWwgaW50IG1TdWJ0eXBlSWNvblJlc0lkOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TdWJ0eXBlTG9jYWxlOworICAgIHByaXZhdGUgZmluYWwgaW50IG1TdWJ0eXBlTW9kZVJlc0lkOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TdWJ0eXBlRXh0cmFWYWx1ZTsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtU3VidHlwZUhhc2hDb2RlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKiBAcGFyYW0gbmFtZUlkIFRoZSBuYW1lIG9mIHRoZSBzdWJ0eXBlCisgICAgICogQHBhcmFtIGljb25JZCBUaGUgaWNvbiBvZiB0aGUgc3VidHlwZQorICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZSBzdXBwb3J0ZWQgYnkgdGhlIHN1YnR5cGUKKyAgICAgKiBAcGFyYW0gbW9kZUlkIFRoZSBtb2RlIHN1cHBvcnRlZCBieSB0aGUgc3VidHlwZQorICAgICAqIEBwYXJhbSBleHRyYVZhbHVlIFRoZSBleHRyYSB2YWx1ZSBvZiB0aGUgc3VidHlwZQorICAgICAqLworICAgIElucHV0TWV0aG9kU3VidHlwZShpbnQgbmFtZUlkLCBpbnQgaWNvbklkLCBTdHJpbmcgbG9jYWxlLCBpbnQgbW9kZUlkLCBTdHJpbmcgZXh0cmFWYWx1ZSkgeworICAgICAgICBtU3VidHlwZU5hbWVSZXNJZCA9IG5hbWVJZDsKKyAgICAgICAgbVN1YnR5cGVJY29uUmVzSWQgPSBpY29uSWQ7CisgICAgICAgIG1TdWJ0eXBlTG9jYWxlID0gbG9jYWxlOworICAgICAgICBtU3VidHlwZU1vZGVSZXNJZCA9IG1vZGVJZDsKKyAgICAgICAgbVN1YnR5cGVFeHRyYVZhbHVlID0gZXh0cmFWYWx1ZTsKKyAgICAgICAgbVN1YnR5cGVIYXNoQ29kZSA9IGhhc2hDb2RlSW50ZXJuYWwobVN1YnR5cGVOYW1lUmVzSWQsIG1TdWJ0eXBlSWNvblJlc0lkLCBtU3VidHlwZUxvY2FsZSwKKyAgICAgICAgICAgICAgICBtU3VidHlwZU1vZGVSZXNJZCwgbVN1YnR5cGVFeHRyYVZhbHVlKTsKKyAgICB9CisKKyAgICBJbnB1dE1ldGhvZFN1YnR5cGUoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICBtU3VidHlwZU5hbWVSZXNJZCA9IHNvdXJjZS5yZWFkSW50KCk7CisgICAgICAgIG1TdWJ0eXBlSWNvblJlc0lkID0gc291cmNlLnJlYWRJbnQoKTsKKyAgICAgICAgbVN1YnR5cGVMb2NhbGUgPSBzb3VyY2UucmVhZFN0cmluZygpOworICAgICAgICBtU3VidHlwZU1vZGVSZXNJZCA9IHNvdXJjZS5yZWFkSW50KCk7CisgICAgICAgIG1TdWJ0eXBlRXh0cmFWYWx1ZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CisgICAgICAgIG1TdWJ0eXBlSGFzaENvZGUgPSBoYXNoQ29kZUludGVybmFsKG1TdWJ0eXBlTmFtZVJlc0lkLCBtU3VidHlwZUljb25SZXNJZCwgbVN1YnR5cGVMb2NhbGUsCisgICAgICAgICAgICAgICAgbVN1YnR5cGVNb2RlUmVzSWQsIG1TdWJ0eXBlRXh0cmFWYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgc3VidHlwZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TmFtZVJlc0lkKCkgeworICAgICAgICByZXR1cm4gbVN1YnR5cGVOYW1lUmVzSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgaWNvbiBvZiB0aGUgc3VidHlwZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SWNvblJlc0lkKCkgeworICAgICAgICByZXR1cm4gbVN1YnR5cGVJY29uUmVzSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbG9jYWxlIG9mIHRoZSBzdWJ0eXBlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtU3VidHlwZUxvY2FsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBtb2RlIG9mIHRoZSBzdWJ0eXBlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNb2RlUmVzSWQoKSB7CisgICAgICAgIHJldHVybiBtU3VidHlwZU1vZGVSZXNJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBleHRyYSB2YWx1ZSBvZiB0aGUgc3VidHlwZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXh0cmFWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdWJ0eXBlRXh0cmFWYWx1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gbVN1YnR5cGVIYXNoQ29kZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJbnB1dE1ldGhvZFN1YnR5cGUpIHsKKyAgICAgICAgICAgIElucHV0TWV0aG9kU3VidHlwZSBzdWJ0eXBlID0gKElucHV0TWV0aG9kU3VidHlwZSkgbzsKKyAgICAgICAgICAgIHJldHVybiAoc3VidHlwZS5nZXROYW1lUmVzSWQoKSA9PSBnZXROYW1lUmVzSWQoKSkKKyAgICAgICAgICAgICAgICAmJiAoc3VidHlwZS5nZXRNb2RlUmVzSWQoKSA9PSBnZXRNb2RlUmVzSWQoKSkKKyAgICAgICAgICAgICAgICAmJiAoc3VidHlwZS5nZXRJY29uUmVzSWQoKSA9PSBnZXRJY29uUmVzSWQoKSkKKyAgICAgICAgICAgICAgICAmJiAoc3VidHlwZS5nZXRMb2NhbGUoKS5lcXVhbHMoZ2V0TG9jYWxlKCkpKQorICAgICAgICAgICAgICAgICYmIChzdWJ0eXBlLmdldEV4dHJhVmFsdWUoKS5lcXVhbHMoZ2V0RXh0cmFWYWx1ZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IHBhcmNlbGFibGVGbGFncykgeworICAgICAgICBkZXN0LndyaXRlSW50KG1TdWJ0eXBlTmFtZVJlc0lkKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtU3VidHlwZUljb25SZXNJZCk7CisgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVN1YnR5cGVMb2NhbGUpOworICAgICAgICBkZXN0LndyaXRlSW50KG1TdWJ0eXBlTW9kZVJlc0lkKTsKKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtU3VidHlwZUV4dHJhVmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPElucHV0TWV0aG9kU3VidHlwZT4gQ1JFQVRPUgorICAgICAgICAgICAgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPElucHV0TWV0aG9kU3VidHlwZT4oKSB7CisgICAgICAgIHB1YmxpYyBJbnB1dE1ldGhvZFN1YnR5cGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgc291cmNlKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0TWV0aG9kU3VidHlwZShzb3VyY2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElucHV0TWV0aG9kU3VidHlwZVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0TWV0aG9kU3VidHlwZVtzaXplXTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgaGFzaENvZGVJbnRlcm5hbChpbnQgbmFtZVJlc0lkLCBpbnQgaWNvblJlc0lkLCBTdHJpbmcgbG9jYWxlLAorICAgICAgICAgICAgaW50IG1vZGVSZXNJZCwgU3RyaW5nIGV4dHJhVmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5oYXNoQ29kZShuZXcgT2JqZWN0W10ge25hbWVSZXNJZCwgaWNvblJlc0lkLCBsb2NhbGUsIG1vZGVSZXNJZCwgZXh0cmFWYWx1ZX0pOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQWNjZXNzaWJpbGl0eUluamVjdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQWNjZXNzaWJpbGl0eUluamVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmExNmM4YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9BY2Nlc3NpYmlsaXR5SW5qZWN0b3IuamF2YQpAQCAtMCwwICsxLDQ4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlscy5TaW1wbGVTdHJpbmdTcGxpdHRlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLkV2ZW50SHViOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CisKKy8qKgorICogVGhpcyBjbGFzcyBpbmplY3RzIGFjY2Vzc2liaWxpdHkgaW50byBXZWJWaWV3cyB3aXRoIGRpc2FibGVkIEphdmFTY3JpcHQgb3IKKyAqIFdlYlZpZXdzIHdpdGggZW5hYmxlZCBKYXZhU2NyaXB0IGJ1dCBmb3Igd2hpY2ggd2UgaGF2ZSBubyBhY2Nlc3NpYmlsaXR5CisgKiBzY3JpcHQgdG8gaW5qZWN0LgorICogPC9wPgorICogTm90ZTogVG8gYXZvaWQgY2hhbmdlcyBpbiB0aGUgZnJhbWV3b3JrIHVwb24gY2hhbmdpbmcgdGhlIGF2YWlsYWJsZQorICogICAgICAgbmF2aWdhdGlvbiBheGlzLCBvciByZW9yZGVyaW5nIHRoZSBuYXZpZ2F0aW9uIGF4aXMsIG9yIGNoYW5naW5nCisgKiAgICAgICB0aGUga2V5IGJpbmRpbmdzLCBvciBkZWZpbmluZyBzZXF1ZW5jZSBvZiBhY3Rpb25zIHRvIGJlIGJvdW5kIHRvCisgKiAgICAgICBhIGdpdmVuIGtleSB0aGlzIGNsYXNzIGlzIG5hdmlnYXRpb24gYXhpcyBhZ25vc3RpYy4gSXQgaXMgb25seQorICogICAgICAgYXdhcmUgb2Ygb25lIG5hdmlnYXRpb24gYXhpcyB3aGljaCBpcyBpbiBmYWN0IHRoZSBkZWZhdWx0IGJlaGF2aW9yCisgKiAgICAgICBvZiB3ZWJWaWV3cyB3aGlsZSB1c2luZyB0aGUgRFBBRC9UcmFja0JhbGwuCisgKiA8L3A+CisgKiBJbiBnZW5lcmFsIGEga2V5IGJpbmRpbmcgaXMgYSBtYXBwaW5nIGZyb20gbWV0YSBzdGF0ZSArIGtleSBjb2RlIHRvCisgKiBhIHNlcXVlbmNlIG9mIGFjdGlvbnMuIEZvciBtb3JlIGRldGFpbCBob3cgdG8gc3BlY2lmeSBrZXkgYmluZGluZ3MgcmVmZXIgdG8KKyAqIHtAbGluayBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZSNBQ0NFU1NJQklMSVRZX1dFQl9DT05URU5UX0tFWV9CSU5ESU5HU30uCisgKiA8L3A+CisgKiBUaGUgcG9zc2libGUgYWN0aW9ucyBhcmUgaW52b2NhdGlvbnMgdG8KKyAqIHtAbGluayAjc2V0Q3VycmVudEF4aXMoaW50LCBib29sZWFuLCBTdHJpbmcpfSwgb3IKKyAqIHtAbGluayAjdHJhdmVyc2VDdXJyZW50QXhpcyhpbnQsIGJvb2xlYW4sIFN0cmluZyl9CisgKiB7QGxpbmsgI3RyYXZlcnNlR2l2ZW5BeGlzKGludCwgaW50LCBib29sZWFuLCBTdHJpbmcpfQorICoge0BsaW5rICNwcmVmcm9tQXhpc1RyYW5zaXRpb24oaW50LCBpbnQsIGJvb2xlYW4sIFN0cmluZyl9CisgKiByZWZlcnJlZCB2aWEgdGhlIHZhbHVlcyBvZjoKKyAqIHtAbGluayAjQUNUSU9OX1NFVF9DVVJSRU5UX0FYSVN9LAorICoge0BsaW5rICNBQ1RJT05fVFJBVkVSU0VfQ1VSUkVOVF9BWElTfSwKKyAqIHtAbGluayAjQUNUSU9OX1RSQVZFUlNFX0dJVkVOX0FYSVN9LAorICoge0BsaW5rICNBQ1RJT05fUEVSRk9STV9BWElTX1RSQU5TSVRJT059LAorICogcmVzcGVjdGl2ZWx5LgorICogVGhlIGFyZ3VtZW50cyBmb3IgdGhlIGFjdGlvbiBpbnZvY2F0aW9uIGFyZSBzcGVjaWZpZWQgYXMgb2Zmc2V0CisgKiBoZXhhZGVtaWNhbCBwYWlycy4gTm90ZSB0aGUgbGFzdCBhcmd1bWVudCBvZiB0aGUgaW52b2NhdGlvbgorICogc2hvdWxkIE5PVCBiZSBzcGVjaWZpZWQgaW4gdGhlIGJpbmRpbmcgYXMgaXQgaXMgcHJvdmlkZWQgYnkKKyAqIHRoaXMgY2xhc3MuIEZvciBkZXRhaWxzIGFib3V0IHRoZSBrZXkgYmluZGluZyBpbXBsZW1lbnRhdGlvbgorICogcmVmZXIgdG8ge0BsaW5rIEFjY2Vzc2liaWxpdHlXZWJDb250ZW50S2V5QmluZGluZ30uCisgKi8KK2NsYXNzIEFjY2Vzc2liaWxpdHlJbmplY3RvciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiQWNjZXNzaWJpbGl0eUluamVjdG9yIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9TRVRfQ1VSUkVOVF9BWElTID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1RSQVZFUlNFX0NVUlJFTlRfQVhJUyA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9UUkFWRVJTRV9HSVZFTl9BWElTID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1BFUkZPUk1fQVhJU19UUkFOU0lUSU9OID0gMzsKKworICAgIC8vIHRoZSBkZWZhdWx0IFdlYlZpZXcgYmVoYXZpb3IgYWJzdHJhY3RlZCBhcyBhIG5hdmlnYXRpb24gYXhpcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOQVZJR0FUSU9OX0FYSVNfREVGQVVMVF9XRUJfVklFV19CRUhBVklPUiA9IDc7CisKKyAgICAvLyB0aGVzZSBhcmUgdGhlIHNhbWUgZm9yIGFsbCBpbnN0YW5jZXMgc28gbWFrZSB0aGVtIHByb2Nlc3Mgd2lkZQorICAgIHByaXZhdGUgc3RhdGljIFNwYXJzZUFycmF5PEFjY2Vzc2liaWxpdHlXZWJDb250ZW50S2V5QmluZGluZz4gc0JpbmRpbmdzID0KKyAgICAgICAgbmV3IFNwYXJzZUFycmF5PEFjY2Vzc2liaWxpdHlXZWJDb250ZW50S2V5QmluZGluZz4oKTsKKworICAgIC8vIGhhbmRsZSB0byB0aGUgV2ViVmlldyB0aGlzIGluamVjdG9yIGlzIGFzc29jaWF0ZWQgd2l0aC4KKyAgICBwcml2YXRlIGZpbmFsIFdlYlZpZXcgbVdlYlZpZXc7CisKKyAgICAvLyBldmVudHMgc2NoZWR1bGVkIGZvciBzZW5kaW5nIGFzIHNvb24gYXMgd2UgcmVjZWl2ZSB0aGUgc2VsZWN0ZWQgdGV4dAorICAgIHByaXZhdGUgZmluYWwgU3RhY2s8QWNjZXNzaWJpbGl0eUV2ZW50PiBtU2NoZWR1bGVkRXZlbnRTdGFjayA9IG5ldyBTdGFjazxBY2Nlc3NpYmlsaXR5RXZlbnQ+KCk7CisKKyAgICAvLyB0aGUgY3VycmVudCB0cmF2ZXJzYWwgYXhpcworICAgIHByaXZhdGUgaW50IG1DdXJyZW50QXhpcyA9IDI7IC8vIHNlbnRlbmNlCisKKyAgICAvLyB3ZSBuZWVkIHRvIGNvbnN1bWUgdGhlIHVwIGlmIHdlIGhhdmUgaGFuZGxlZCB0aGUgbGFzdCBkb3duCisgICAgcHJpdmF0ZSBib29sZWFuIG1MYXN0RG93bkV2ZW50SGFuZGxlZDsKKworICAgIC8vIGdldHRpbmcgdHdvIGVtcHR5IHNlbGVjdGlvbiBzdHJpbmdzIGluIGEgcm93IHdlIGxldCB0aGUgV2ViVmlldyBoYW5kbGUgdGhlIGV2ZW50CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0xhc3RTZWxlY3Rpb25TdHJpbmdOdWxsOworCisgICAgLy8ga2VlcCB0cmFjayBvZiBsYXN0IGRpcmVjdGlvbgorICAgIHByaXZhdGUgaW50IG1MYXN0RGlyZWN0aW9uOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbmplY3RvciBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiB7QGxpbmsgV2ViVmlld30uCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2ViVmlldyBUaGUgYXNzb2NpYXRlZCBXZWJWaWV3LgorICAgICAqLworICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5SW5qZWN0b3IoV2ViVmlldyB3ZWJWaWV3KSB7CisgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKKyAgICAgICAgZW5zdXJlV2ViQ29udGVudEtleUJpbmRpbmdzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIGEga2V5IGRvd24gPGNvZGU+ZXZlbnQ8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBldmVudCB3YXMgcHJvY2Vzc2VkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9VUCkgeworICAgICAgICAgICAgcmV0dXJuIG1MYXN0RG93bkV2ZW50SGFuZGxlZDsKKyAgICAgICAgfQorCisgICAgICAgIG1MYXN0RG93bkV2ZW50SGFuZGxlZCA9IGZhbHNlOworCisgICAgICAgIGludCBrZXkgPSBldmVudC5nZXRNZXRhU3RhdGUoKSA8PCBBY2Nlc3NpYmlsaXR5V2ViQ29udGVudEtleUJpbmRpbmcuT0ZGU0VUX01FVEFfU1RBVEUgfAorICAgICAgICAgICAgZXZlbnQuZ2V0S2V5Q29kZSgpIDw8IEFjY2Vzc2liaWxpdHlXZWJDb250ZW50S2V5QmluZGluZy5PRkZTRVRfS0VZX0NPREU7CisKKyAgICAgICAgQWNjZXNzaWJpbGl0eVdlYkNvbnRlbnRLZXlCaW5kaW5nIGJpbmRpbmcgPSBzQmluZGluZ3MuZ2V0KGtleSk7CisgICAgICAgIGlmIChiaW5kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwLCBjb3VudCA9IGJpbmRpbmcuZ2V0QWN0aW9uQ291bnQoKTsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGludCBhY3Rpb25Db2RlID0gYmluZGluZy5nZXRBY3Rpb25Db2RlKGkpOworICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnREZXNjcmlwdGlvbiA9IEludGVnZXIudG9IZXhTdHJpbmcoYmluZGluZy5nZXRBY3Rpb24oaSkpOworICAgICAgICAgICAgc3dpdGNoIChhY3Rpb25Db2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fU0VUX0NVUlJFTlRfQVhJUzoKKyAgICAgICAgICAgICAgICAgICAgaW50IGF4aXMgPSBiaW5kaW5nLmdldEZpcnN0QXJndW1lbnQoaSk7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VuZEV2ZW50ID0gKGJpbmRpbmcuZ2V0U2Vjb25kQXJndW1lbnQoaSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIHNldEN1cnJlbnRBeGlzKGF4aXMsIHNlbmRFdmVudCwgY29udGVudERlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3REb3duRXZlbnRIYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fVFJBVkVSU0VfQ1VSUkVOVF9BWElTOgorICAgICAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uID0gYmluZGluZy5nZXRGaXJzdEFyZ3VtZW50KGkpOworICAgICAgICAgICAgICAgICAgICAvLyBvbiBzZWNvbmQgbnVsbCBzZWxlY3Rpb24gc3RyaW5nIGluIHNhbWUgZGlyZWN0aW9uID0+IFdlYlZpZXcgaGFuZGxlIHRoZSBldmVudAorICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IG1MYXN0RGlyZWN0aW9uICYmIG1Jc0xhc3RTZWxlY3Rpb25TdHJpbmdOdWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERpcmVjdGlvbiA9IGRpcmVjdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0xhc3RTZWxlY3Rpb25TdHJpbmdOdWxsID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUxhc3REaXJlY3Rpb24gPSBkaXJlY3Rpb247CisgICAgICAgICAgICAgICAgICAgIHNlbmRFdmVudCA9IChiaW5kaW5nLmdldFNlY29uZEFyZ3VtZW50KGkpID09IDEpOworICAgICAgICAgICAgICAgICAgICBtTGFzdERvd25FdmVudEhhbmRsZWQgPSB0cmF2ZXJzZUN1cnJlbnRBeGlzKGRpcmVjdGlvbiwgc2VuZEV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnREZXNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQUNUSU9OX1RSQVZFUlNFX0dJVkVOX0FYSVM6CisgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IGJpbmRpbmcuZ2V0Rmlyc3RBcmd1bWVudChpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gb24gc2Vjb25kIG51bGwgc2VsZWN0aW9uIHN0cmluZyBpbiBzYW1lIGRpcmVjdGlvbiA9PiBXZWJWaWV3IGhhbmRsZSB0aGUgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBtTGFzdERpcmVjdGlvbiAmJiBtSXNMYXN0U2VsZWN0aW9uU3RyaW5nTnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REaXJlY3Rpb24gPSBkaXJlY3Rpb247CisgICAgICAgICAgICAgICAgICAgICAgICBtSXNMYXN0U2VsZWN0aW9uU3RyaW5nTnVsbCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1MYXN0RGlyZWN0aW9uID0gZGlyZWN0aW9uOworICAgICAgICAgICAgICAgICAgICBheGlzID0gIGJpbmRpbmcuZ2V0U2Vjb25kQXJndW1lbnQoaSk7CisgICAgICAgICAgICAgICAgICAgIHNlbmRFdmVudCA9IChiaW5kaW5nLmdldFRoaXJkQXJndW1lbnQoaSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlR2l2ZW5BeGlzKGRpcmVjdGlvbiwgYXhpcywgc2VuZEV2ZW50LCBjb250ZW50RGVzY3JpcHRpb24pOworICAgICAgICAgICAgICAgICAgICBtTGFzdERvd25FdmVudEhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFDVElPTl9QRVJGT1JNX0FYSVNfVFJBTlNJVElPTjoKKyAgICAgICAgICAgICAgICAgICAgaW50IGZyb21BeGlzID0gYmluZGluZy5nZXRGaXJzdEFyZ3VtZW50KGkpOworICAgICAgICAgICAgICAgICAgICBpbnQgdG9BeGlzID0gYmluZGluZy5nZXRTZWNvbmRBcmd1bWVudChpKTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZEV2ZW50ID0gKGJpbmRpbmcuZ2V0VGhpcmRBcmd1bWVudChpKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgcHJlZnJvbUF4aXNUcmFuc2l0aW9uKGZyb21BeGlzLCB0b0F4aXMsIHNlbmRFdmVudCwgY29udGVudERlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3REb3duRXZlbnRIYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlVua25vd24gYWN0aW9uIGNvZGU6ICIgKyBhY3Rpb25Db2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtTGFzdERvd25FdmVudEhhbmRsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjdXJyZW50IG5hdmlnYXRpb24gYXhpcyB3aGljaCB3aWxsIGJlIHVzZWQgd2hpbGUKKyAgICAgKiBjYWxsaW5nIHtAbGluayAjdHJhdmVyc2VDdXJyZW50QXhpcyhpbnQsIGJvb2xlYW4sIFN0cmluZyl9LgorICAgICAqCisgICAgICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgdG8gc2V0LgorICAgICAqIEBwYXJhbSBzZW5kRXZlbnQgV2hldGhlciB0byBzZW5kIGFuIGFjY2Vzc2liaWxpdHkgZXZlbnQgdG8KKyAgICAgKiAgICAgICAgYW5ub3VuY2UgdGhlIGNoYW5nZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0Q3VycmVudEF4aXMoaW50IGF4aXMsIGJvb2xlYW4gc2VuZEV2ZW50LCBTdHJpbmcgY29udGVudERlc2NyaXB0aW9uKSB7CisgICAgICAgIG1DdXJyZW50QXhpcyA9IGF4aXM7CisgICAgICAgIGlmIChzZW5kRXZlbnQpIHsKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCA9IGdldFBhcnRpYWx5UG9wdWxhdGVkQWNjZXNzaWJpbGl0eUV2ZW50KCk7CisgICAgICAgICAgICBldmVudC5nZXRUZXh0KCkuYWRkKFN0cmluZy52YWx1ZU9mKGF4aXMpKTsKKyAgICAgICAgICAgIGV2ZW50LnNldENvbnRlbnREZXNjcmlwdGlvbihjb250ZW50RGVzY3JpcHRpb24pOworICAgICAgICAgICAgc2VuZEFjY2Vzc2liaWxpdHlFdmVudChldmVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBjb25kaXRpb25hbCB0cmFuc2l0aW9uIG9uZSBheGlzIHRvIGFub3RoZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbUF4aXMgVGhlIGF4aXMgd2hpY2ggbXVzdCBiZSB0aGUgY3VycmVudCBmb3IgdGhlIHRyYW5zaXRpb24gdG8gb2NjdXIuCisgICAgICogQHBhcmFtIHRvQXhpcyBUaGUgYXhpcyB0byB3aGljaCB0byB0cmFuc2l0aW9uLgorICAgICAqIEBwYXJhbSBzZW5kRXZlbnQgRmxhZyBpZiB0byBzZW5kIGFuIGV2ZW50IHRvIGFubm91bmNlIHN1Y2Nlc3NmdWwgdHJhbnNpdGlvbi4KKyAgICAgKiBAcGFyYW0gY29udGVudERlc2NyaXB0aW9uIEEgZGVzY3JpcHRpb24gb2YgdGhlIHBlcmZvcm1lZCBhY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByZWZyb21BeGlzVHJhbnNpdGlvbihpbnQgZnJvbUF4aXMsIGludCB0b0F4aXMsIGJvb2xlYW4gc2VuZEV2ZW50LAorICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnREZXNjcmlwdGlvbikgeworICAgICAgICBpZiAobUN1cnJlbnRBeGlzID09IGZyb21BeGlzKSB7CisgICAgICAgICAgICBzZXRDdXJyZW50QXhpcyh0b0F4aXMsIHNlbmRFdmVudCwgY29udGVudERlc2NyaXB0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYXZlcnNlIHRoZSBkb2N1bWVudCBhbG9uZyB0aGUgY3VycmVudCBuYXZpZ2F0aW9uIGF4aXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gb2YgdHJhdmVyc2FsLgorICAgICAqIEBwYXJhbSBzZW5kRXZlbnQgV2hldGhlciB0byBzZW5kIGFuIGFjY2Vzc2liaWxpdHkgZXZlbnQgdG8KKyAgICAgKiAgICAgICAgYW5ub3VuY2UgdGhlIGNoYW5nZS4KKyAgICAgKiBAcGFyYW0gY29udGVudERlc2NyaXB0aW9uIEEgZGVzY3JpcHRpb24gb2YgdGhlIHBlcmZvcm1lZCBhY3Rpb24uCisgICAgICogQHNlZSAjc2V0Q3VycmVudEF4aXMoaW50LCBib29sZWFuLCBTdHJpbmcpCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlQ3VycmVudEF4aXMoaW50IGRpcmVjdGlvbiwgYm9vbGVhbiBzZW5kRXZlbnQsCisgICAgICAgICAgICBTdHJpbmcgY29udGVudERlc2NyaXB0aW9uKSB7CisgICAgICAgIHJldHVybiB0cmF2ZXJzZUdpdmVuQXhpcyhkaXJlY3Rpb24sIG1DdXJyZW50QXhpcywgc2VuZEV2ZW50LCBjb250ZW50RGVzY3JpcHRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYXZlcnNlIHRoZSBkb2N1bWVudCBhbG9uZyB0aGUgZ2l2ZW4gbmF2aWdhdGlvbiBheGlzLgorICAgICAqCisgICAgICogQHBhcmFtIGRpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIG9mIHRyYXZlcnNhbC4KKyAgICAgKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyBhbG9uZyB3aGljaCB0byB0cmF2ZXJzZS4KKyAgICAgKiBAcGFyYW0gc2VuZEV2ZW50IFdoZXRoZXIgdG8gc2VuZCBhbiBhY2Nlc3NpYmlsaXR5IGV2ZW50IHRvCisgICAgICogICAgICAgIGFubm91bmNlIHRoZSBjaGFuZ2UuCisgICAgICogQHBhcmFtIGNvbnRlbnREZXNjcmlwdGlvbiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBwZXJmb3JtZWQgYWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUdpdmVuQXhpcyhpbnQgZGlyZWN0aW9uLCBpbnQgYXhpcywgYm9vbGVhbiBzZW5kRXZlbnQsCisgICAgICAgICAgICBTdHJpbmcgY29udGVudERlc2NyaXB0aW9uKSB7CisgICAgICAgIC8vIGlmIHRoZSBheGlzIGlzIHRoZSBkZWZhdWx0IGxldCBXZWJWaWV3IGhhbmRsZSB0aGUgZXZlbnQKKyAgICAgICAgaWYgKGF4aXMgPT0gTkFWSUdBVElPTl9BWElTX0RFRkFVTFRfV0VCX1ZJRVdfQkVIQVZJT1IpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBXZWJWaWV3Q29yZSB3ZWJWaWV3Q29yZSA9IG1XZWJWaWV3LmdldFdlYlZpZXdDb3JlKCk7CisgICAgICAgIGlmICh3ZWJWaWV3Q29yZSAhPSBudWxsKSB7CisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQgPSBudWxsOworICAgICAgICAgICAgaWYgKHNlbmRFdmVudCkgeworICAgICAgICAgICAgICAgIGV2ZW50ID0gZ2V0UGFydGlhbHlQb3B1bGF0ZWRBY2Nlc3NpYmlsaXR5RXZlbnQoKTsKKyAgICAgICAgICAgICAgICAvLyB0aGUgdGV4dCB3aWxsIGJlIHNldCB1cG9uIHJlY2VpdmluZyB0aGUgc2VsZWN0aW9uIHN0cmluZworICAgICAgICAgICAgICAgIGV2ZW50LnNldENvbnRlbnREZXNjcmlwdGlvbihjb250ZW50RGVzY3JpcHRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNjaGVkdWxlZEV2ZW50U3RhY2sucHVzaChldmVudCk7CisgICAgICAgICAgICB3ZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5NT0RJRllfU0VMRUNUSU9OLCBkaXJlY3Rpb24sIGF4aXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSA8Y29kZT5zZWxlY3Rpb25TdHJpbmc8L2NvZGU+IGhhcyBjaGFuZ2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU2VsZWN0aW9uU3RyaW5nQ2hhbmdlKFN0cmluZyBzZWxlY3Rpb25TdHJpbmcpIHsKKyAgICAgICAgbUlzTGFzdFNlbGVjdGlvblN0cmluZ051bGwgPSAoc2VsZWN0aW9uU3RyaW5nID09IG51bGwpOworICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQgPSBtU2NoZWR1bGVkRXZlbnRTdGFjay5wb3AoKTsKKyAgICAgICAgaWYgKGV2ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGV2ZW50LmdldFRleHQoKS5hZGQoc2VsZWN0aW9uU3RyaW5nKTsKKyAgICAgICAgICAgIHNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoZXZlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZHMgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHNlbmQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIkRpc3BhdGNoaW5nOiAiICsgZXZlbnQpOworICAgICAgICB9CisgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKG1XZWJWaWV3LmdldENvbnRleHQoKSkuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChldmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBBbiBhY2Nlc3NpYmlsaXR5IGV2ZW50IHdob3NlIG1lbWJlcnMgYXJlIHBvcHVsYXRlZCBleGNlcHQgaXRzCisgICAgICogICAgICAgICB0ZXh0IGFuZCBjb250ZW50IGRlc2NyaXB0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eUV2ZW50IGdldFBhcnRpYWx5UG9wdWxhdGVkQWNjZXNzaWJpbGl0eUV2ZW50KCkgeworICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfU0VMRUNURUQpOworICAgICAgICBldmVudC5zZXRDbGFzc05hbWUobVdlYlZpZXcuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICBldmVudC5zZXRQYWNrYWdlTmFtZShtV2ViVmlldy5nZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIGV2ZW50LnNldEVuYWJsZWQobVdlYlZpZXcuaXNFbmFibGVkKCkpOworICAgICAgICByZXR1cm4gZXZlbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGF0IHRoZSBXZWIgY29udGVudCBrZXkgYmluZGluZ3MgYXJlIGxvYWRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlV2ViQ29udGVudEtleUJpbmRpbmdzKCkgeworICAgICAgICBpZiAoc0JpbmRpbmdzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyB3ZWJDb250ZW50S2V5QmluZGluZ3NTdHJpbmcgID0gU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5nZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkFDQ0VTU0lCSUxJVFlfV0VCX0NPTlRFTlRfS0VZX0JJTkRJTkdTKTsKKworICAgICAgICBTaW1wbGVTdHJpbmdTcGxpdHRlciBzZW1pQ29sb25TcGxpdHRlciA9IG5ldyBTaW1wbGVTdHJpbmdTcGxpdHRlcignOycpOworICAgICAgICBzZW1pQ29sb25TcGxpdHRlci5zZXRTdHJpbmcod2ViQ29udGVudEtleUJpbmRpbmdzU3RyaW5nKTsKKworICAgICAgICBBcnJheUxpc3Q8QWNjZXNzaWJpbGl0eVdlYkNvbnRlbnRLZXlCaW5kaW5nPiBiaW5kaW5ncyA9CisgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PEFjY2Vzc2liaWxpdHlXZWJDb250ZW50S2V5QmluZGluZz4oKTsKKworICAgICAgICB3aGlsZSAoc2VtaUNvbG9uU3BsaXR0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgYmluZGluZ1N0cmluZyA9IHNlbWlDb2xvblNwbGl0dGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShiaW5kaW5nU3RyaW5nKSkgeworICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJNYWxmb3JtZWQgV2ViIGNvbnRlbnQga2V5IGJpbmRpbmc6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgd2ViQ29udGVudEtleUJpbmRpbmdzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZ1tdIGtleVZhbHVlQXJyYXkgPSBiaW5kaW5nU3RyaW5nLnNwbGl0KCI9Iik7CisgICAgICAgICAgICBpZiAoa2V5VmFsdWVBcnJheS5sZW5ndGggIT0gMikgeworICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJEaXNyZWdhcmRpbmcgbWFsZm9ybWVkIFdlYiBjb250ZW50IGtleSBiaW5kaW5nOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdTdHJpbmcpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTaW1wbGVTdHJpbmdTcGxpdHRlciBjb2xvblNwbGl0dGVyID0gbmV3IFNpbXBsZVN0cmluZ1NwbGl0dGVyKCc6Jyk7Ly9yZW1vdmUKKyAgICAgICAgICAgICAgICBpbnQga2V5ID0gSW50ZWdlci5kZWNvZGUoa2V5VmFsdWVBcnJheVswXS50cmltKCkpOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGFjdGlvblN0cmluZ3MgPSBrZXlWYWx1ZUFycmF5WzFdLnNwbGl0KCI6Iik7CisgICAgICAgICAgICAgICAgaW50W10gYWN0aW9ucyA9IG5ldyBpbnRbYWN0aW9uU3RyaW5ncy5sZW5ndGhdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBjb3VudCA9IGFjdGlvbnMubGVuZ3RoOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBhY3Rpb25zW2ldID0gSW50ZWdlci5kZWNvZGUoYWN0aW9uU3RyaW5nc1tpXS50cmltKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJpbmRpbmdzLmFkZChuZXcgQWNjZXNzaWJpbGl0eVdlYkNvbnRlbnRLZXlCaW5kaW5nKGtleSwgYWN0aW9ucykpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJEaXNyZWdhcmRpbmcgbWFsZm9ybWVkIGtleSBiaW5kaW5nOiAiICsgYmluZGluZ1N0cmluZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEFjY2Vzc2liaWxpdHlXZWJDb250ZW50S2V5QmluZGluZyBiaW5kaW5nIDogYmluZGluZ3MpIHsKKyAgICAgICAgICAgIHNCaW5kaW5ncy5wdXQoYmluZGluZy5nZXRLZXkoKSwgYmluZGluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgd2ViIGNvbnRlbnQga2V5LWJpbmRpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBBY2Nlc3NpYmlsaXR5V2ViQ29udGVudEtleUJpbmRpbmcgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPRkZTRVRfTUVUQV9TVEFURSA9IDB4MDAwMDAwMTA7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BU0tfTUVUQV9TVEFURSA9IDB4RkZGRjAwMDA7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9GRlNFVF9LRVlfQ09ERSA9IDB4MDAwMDAwMDA7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BU0tfS0VZX0NPREUgPSAweDAwMDBGRkZGOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPRkZTRVRfQUNUSU9OID0gMHgwMDAwMDAxODsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19BQ1RJT04gPSAweEZGMDAwMDAwOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPRkZTRVRfRklSU1RfQVJHVU1FTlQgPSAweDAwMDAwMDEwOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVNLX0ZJUlNUX0FSR1VNRU5UID0gMHgwMEZGMDAwMDsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0ZGU0VUX1NFQ09ORF9BUkdVTUVOVCA9IDB4MDAwMDAwMDg7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BU0tfU0VDT05EX0FSR1VNRU5UID0gMHgwMDAwRkYwMDsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0ZGU0VUX1RISVJEX0FSR1VNRU5UID0gMHgwMDAwMDAwMDsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19USElSRF9BUkdVTUVOVCA9IDB4MDAwMDAwRkY7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUtleTsKKworICAgICAgICBwcml2YXRlIGludCBbXSBtQWN0aW9uU2VxdWVuY2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gVGhlIGJpbmRpbmcga2V5IHdpdGgga2V5IGNvZGUgYW5kIG1ldGEgc3RhdGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgI01BU0tfS0VZX0NPREUKKyAgICAgICAgICogQHNlZSAjTUFTS19NRVRBX1NUQVRFCisgICAgICAgICAqIEBzZWUgI09GRlNFVF9LRVlfQ09ERQorICAgICAgICAgKiBAc2VlICNPRkZTRVRfTUVUQV9TVEFURQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRLZXkoKSB7CisgICAgICAgICAgICByZXR1cm4gbUtleTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBrZXkgY29kZSBvZiB0aGUgYmluZGluZyBrZXkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldEtleUNvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gKG1LZXkgJiBNQVNLX0tFWV9DT0RFKSA+PiBPRkZTRVRfS0VZX0NPREU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBUaGUgbWV0YSBzdGF0ZSBvZiB0aGUgYmluZGluZyBrZXkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldE1ldGFTdGF0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAobUtleSAmIE1BU0tfTUVUQV9TVEFURSkgPj4gT0ZGU0VUX01FVEFfU1RBVEU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGFjdGlvbnMgaW4gdGhlIGtleSBiaW5kaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRBY3Rpb25Db3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQWN0aW9uU2VxdWVuY2UubGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSBpbmRleCBUaGUgYWN0aW9uIGZvciBhIGdpdmVuIGFjdGlvbiA8Y29kZT5pbmRleDwvY29kZT4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldEFjdGlvbihpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQWN0aW9uU2VxdWVuY2VbaW5kZXhdOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSBpbmRleCBUaGUgYWN0aW9uIGNvZGUgZm9yIGEgZ2l2ZW4gYWN0aW9uIDxjb2RlPmluZGV4PC9jb2RlPi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0QWN0aW9uQ29kZShpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiAobUFjdGlvblNlcXVlbmNlW2luZGV4XSAmIE1BU0tfQUNUSU9OKSA+PiBPRkZTRVRfQUNUSU9OOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSBpbmRleCBUaGUgZmlyc3QgYXJndW1lbnQgZm9yIGEgZ2l2ZW4gYWN0aW9uIDxjb2RlPmluZGV4PC9jb2RlPi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Rmlyc3RBcmd1bWVudChpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiAobUFjdGlvblNlcXVlbmNlW2luZGV4XSAmIE1BU0tfRklSU1RfQVJHVU1FTlQpID4+IE9GRlNFVF9GSVJTVF9BUkdVTUVOVDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0gaW5kZXggVGhlIHNlY29uZCBhcmd1bWVudCBmb3IgYSBnaXZlbiBhY3Rpb24gPGNvZGU+aW5kZXg8L2NvZGU+LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRTZWNvbmRBcmd1bWVudChpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiAobUFjdGlvblNlcXVlbmNlW2luZGV4XSAmIE1BU0tfU0VDT05EX0FSR1VNRU5UKSA+PiBPRkZTRVRfU0VDT05EX0FSR1VNRU5UOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSBpbmRleCBUaGUgdGhpcmQgYXJndW1lbnQgZm9yIGEgZ2l2ZW4gYWN0aW9uIDxjb2RlPmluZGV4PC9jb2RlPi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0VGhpcmRBcmd1bWVudChpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiAobUFjdGlvblNlcXVlbmNlW2luZGV4XSAmIE1BU0tfVEhJUkRfQVJHVU1FTlQpID4+IE9GRlNFVF9USElSRF9BUkdVTUVOVDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgorICAgICAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSBiaW5kaW5nIChrZXkgYW5kIG1ldGEgc3RhdGUpCisgICAgICAgICAqIEBwYXJhbSBhY3Rpb25TZXF1ZW5jZSBUaGUgc2VxdWVuY2Ugb2YgYWN0aW9uIGZvciB0aGUgYmluZGluZy4KKyAgICAgICAgICogQHNlZSAjZ2V0S2V5KCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5V2ViQ29udGVudEtleUJpbmRpbmcoaW50IGtleSwgaW50W10gYWN0aW9uU2VxdWVuY2UpIHsKKyAgICAgICAgICAgIG1LZXkgPSBrZXk7CisgICAgICAgICAgICBtQWN0aW9uU2VxdWVuY2UgPSBhY3Rpb25TZXF1ZW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJrZXk6ICIpOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZ2V0S2V5KCkpOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgbWV0YVN0YXRlOiAiKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGdldE1ldGFTdGF0ZSgpKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIGtleUNvZGU6ICIpOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZ2V0S2V5Q29kZSgpKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIGFjdGlvbnNbIik7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgY291bnQgPSBnZXRBY3Rpb25Db3VudCgpOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJ7YWN0aW9uQ29kZSIpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGkpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI6ICIpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGdldEFjdGlvbkNvZGUoaSkpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIGZpcnN0QXJndW1lbnQ6ICIpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGdldEZpcnN0QXJndW1lbnQoaSkpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHNlY29uZEFyZ3VtZW50OiAiKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChnZXRTZWNvbmRBcmd1bWVudChpKSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgdGhpcmRBcmd1bWVudDogIik7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZ2V0VGhpcmRBcmd1bWVudChpKSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIn0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJdIik7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0Jyb3dzZXJGcmFtZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0Jyb3dzZXJGcmFtZS5qYXZhCmluZGV4IGEyYzgwZjIuLmVmZTRiOWQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQnJvd3NlckZyYW1lLmphdmEKQEAgLTM4LDYgKzM4LDggQEAKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwogaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CkBAIC03Miw2ICs3NCw5IEBACiAgICAgLy8gcXVldWUgaGFzIGJlZW4gY2xlYXJlZCx0aGV5IGFyZSBpZ25vcmVkLgogICAgIHByaXZhdGUgYm9vbGVhbiBtQmxvY2tNZXNzYWdlcyA9IGZhbHNlOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNEYXRhYmFzZURpcmVjdG9yeTsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc0NhY2hlRGlyZWN0b3J5OworCiAgICAgLy8gSXMgdGhpcyBmcmFtZSB0aGUgbWFpbiBmcmFtZT8KICAgICBwcml2YXRlIGJvb2xlYW4gbUlzTWFpbkZyYW1lOwogCkBAIC0yMjQsNiArMjI5LDEzIEBACiAgICAgICAgIEFzc2V0TWFuYWdlciBhbSA9IGNvbnRleHQuZ2V0QXNzZXRzKCk7CiAgICAgICAgIG5hdGl2ZUNyZWF0ZUZyYW1lKHcsIGFtLCBwcm94eS5nZXRCYWNrRm9yd2FyZExpc3QoKSk7CiAKKyAgICAgICAgaWYgKHNEYXRhYmFzZURpcmVjdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICBzRGF0YWJhc2VEaXJlY3RvcnkgPSBhcHBDb250ZXh0LmdldERhdGFiYXNlUGF0aCgiZHVtbXkiKS5nZXRQYXJlbnQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc0NhY2hlRGlyZWN0b3J5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHNDYWNoZURpcmVjdG9yeSA9IGFwcENvbnRleHQuZ2V0Q2FjaGVEaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLkJST1dTRVJfRlJBTUUpIHsKICAgICAgICAgICAgIExvZy52KExPR1RBRywgIkJyb3dzZXJGcmFtZSBjb25zdHJ1Y3RvcjogdGhpcz0iICsgdGhpcyk7CiAgICAgICAgIH0KQEAgLTI5NCw2ICszMDYsMTggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTYXZlcyB0aGUgY29udGVudHMgb2YgdGhlIGZyYW1lIGFzIGEgd2ViIGFyY2hpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZW5hbWUgVGhlIGZpbGVuYW1lIHdoZXJlIHRoZSBhcmNoaXZlIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICogQHBhcmFtIGF1dG9uYW1lIElmIGZhbHNlLCB0YWtlcyBmaWxlbmFtZSB0byBiZSBhIGZpbGUuIElmIHRydWUsIGZpbGVuYW1lCisgICAgICogICAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gYmUgYSBkaXJlY3RvcnkgaW4gd2hpY2ggYSBmaWxlbmFtZSB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgIGNob3NlbiBhY2NvcmRpbmcgdG8gdGhlIHVybCBvZiB0aGUgY3VycmVudCBwYWdlLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gU3RyaW5nIHNhdmVXZWJBcmNoaXZlKFN0cmluZyBiYXNlbmFtZSwgYm9vbGVhbiBhdXRvbmFtZSkgeworICAgICAgICByZXR1cm4gbmF0aXZlU2F2ZVdlYkFyY2hpdmUoYmFzZW5hbWUsIGF1dG9uYW1lKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBHbyBiYWNrIG9yIGZvcndhcmQgdGhlIG51bWJlciBvZiBzdGVwcyBnaXZlbi4KICAgICAgKiBAcGFyYW0gc3RlcHMgQSBuZWdhdGl2ZSBvciBwb3NpdGl2ZSBudW1iZXIgaW5kaWNhdGluZyB0aGUgZGlyZWN0aW9uCiAgICAgICogICAgICAgICAgICAgIGFuZCBudW1iZXIgb2Ygc3RlcHMgdG8gbW92ZS4KQEAgLTUxMCwxMiArNTM0LDIxIEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgU3RyaW5nIGV4dGVybmFsUmVwcmVzZW50YXRpb24oKTsKIAogICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgdmlzdWFsIHRleHQgb2YgdGhlIGN1cnJlbnQgZnJhbWUsIHB1dHMgaXQgYXMgdGhlIG9iamVjdCBmb3IKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHZpc3VhbCB0ZXh0IG9mIHRoZSBmcmFtZXMsIHB1dHMgaXQgYXMgdGhlIG9iamVjdCBmb3IKICAgICAgKiB0aGUgbWVzc2FnZSBhbmQgc2VuZHMgdGhlIG1lc3NhZ2UuCiAgICAgICogQHBhcmFtIGNhbGxiYWNrIHRoZSBtZXNzYWdlIHRvIHVzZSB0byBzZW5kIHRoZSB2aXN1YWwgdGV4dAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRvY3VtZW50QXNUZXh0KE1lc3NhZ2UgY2FsbGJhY2spIHsKLSAgICAgICAgY2FsbGJhY2sub2JqID0gZG9jdW1lbnRBc1RleHQoKTs7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGlmIChjYWxsYmFjay5hcmcxICE9IDApIHsKKyAgICAgICAgICAgIC8vIER1bXAgdG9wIGZyYW1lIGFzIHRleHQuCisgICAgICAgICAgICB0ZXh0LmFwcGVuZChkb2N1bWVudEFzVGV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FsbGJhY2suYXJnMiAhPSAwKSB7CisgICAgICAgICAgICAvLyBEdW1wIGNoaWxkIGZyYW1lcyBhcyB0ZXh0LgorICAgICAgICAgICAgdGV4dC5hcHBlbmQoY2hpbGRGcmFtZXNBc1RleHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2FsbGJhY2sub2JqID0gdGV4dC50b1N0cmluZygpOwogICAgICAgICBjYWxsYmFjay5zZW5kVG9UYXJnZXQoKTsKICAgICB9CiAKQEAgLTUyNCw2ICs1NTcsMTEgQEAKICAgICAgKi8KICAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgZG9jdW1lbnRBc1RleHQoKTsKIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGV4dCBkcmF3biBvbiB0aGUgY2hpbGQgZnJhbWVzIGFzIGEgc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSBuYXRpdmUgU3RyaW5nIGNoaWxkRnJhbWVzQXNUZXh0KCk7CisKICAgICAvKgogICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBXZWJDb3JlIHRvIGluZm9ybSB0aGUgZnJhbWUgdGhhdAogICAgICAqIHRoZSBKYXZhc2NyaXB0IHdpbmRvdyBvYmplY3QgaGFzIGJlZW4gY2xlYXJlZC4KQEAgLTYxNyw2ICs2NTUsMTEyIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IEpOSS4gR2V0cyB0aGUgYXBwbGljYXRpb24ncyBkYXRhYmFzZSBkaXJlY3RvcnksIGV4Y2x1ZGluZyB0aGUgdHJhaWxpbmcgc2xhc2guCisgICAgICogQHJldHVybiBTdHJpbmcgVGhlIGFwcGxpY2F0aW9uJ3MgZGF0YWJhc2UgZGlyZWN0b3J5CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldERhdGFiYXNlRGlyZWN0b3J5KCkgeworICAgICAgICByZXR1cm4gc0RhdGFiYXNlRGlyZWN0b3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBKTkkuIEdldHMgdGhlIGFwcGxpY2F0aW9uJ3MgY2FjaGUgZGlyZWN0b3J5LCBleGNsdWRpbmcgdGhlIHRyYWlsaW5nIHNsYXNoLgorICAgICAqIEByZXR1cm4gU3RyaW5nIFRoZSBhcHBsaWNhdGlvbidzIGNhY2hlIGRpcmVjdG9yeQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDYWNoZURpcmVjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIHNDYWNoZURpcmVjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgSk5JLgorICAgICAqIFJlYWQgZnJvbSBhbiBJbnB1dFN0cmVhbSBpbnRvIGEgc3VwcGxpZWQgYnl0ZVtdCisgICAgICogVGhpcyBtZXRob2QgY2F0Y2hlcyBhbnkgZXhjZXB0aW9ucyBzbyB0aGV5IGRvbid0IGNyYXNoIHRoZSBKVk0uCisgICAgICogQHBhcmFtIGlucHV0U3RyZWFtIElucHV0U3RyZWFtIHRvIHJlYWQgZnJvbS4KKyAgICAgKiBAcGFyYW0gb3V0cHV0IEJ5dGVhcnJheSB0aGF0IGdldHMgdGhlIG91dHB1dC4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLWkgaWYgdGhlbiBlbmQgb2Ygc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgcmVhZEZyb21TdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGJ5dGVbXSBvdXRwdXQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dFN0cmVhbS5yZWFkKG91dHB1dCk7CisgICAgICAgIH0gY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBnZXQgYW4gZXhjZXB0aW9uLCByZXR1cm4gZW5kIG9mIHN0cmVhbQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBJbnB1dFN0cmVhbSBmb3IgYW4gQW5kcm9pZCByZXNvdXJjZQorICAgICAqIFRoZXJlIGFyZSB0aHJlZSBkaWZmZXJlbnQga2luZHMgb2YgYW5kcm9pZCByZXNvdXJjZXM6CisgICAgICogLSBmaWxlOi8vL2FuZHJvaWRfcmVzCisgICAgICogLSBmaWxlOi8vL2FuZHJvaWRfYXNzZXQKKyAgICAgKiAtIGNvbnRlbnQ6Ly8KKyAgICAgKiBAcGFyYW0gdXJsIFRoZSB1cmwgdG8gbG9hZC4KKyAgICAgKiBAcmV0dXJuIEFuIElucHV0U3RyZWFtIHRvIHRoZSBhbmRyb2lkIHJlc291cmNlCisgICAgICovCisgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbUZvckFuZHJvaWRSZXNvdXJjZShTdHJpbmcgdXJsLCBpbnQgdHlwZSkgeworICAgICAgICBmaW5hbCBpbnQgUkVTT1VSQ0UgPSAxOworICAgICAgICBmaW5hbCBpbnQgQVNTRVQgPSAyOworICAgICAgICBmaW5hbCBpbnQgQ09OVEVOVCA9IDM7CisKKyAgICAgICAgaWYgKHR5cGUgPT0gUkVTT1VSQ0UpIHsKKyAgICAgICAgICAgIC8vIGZpbGU6Ly8vYW5kcm9pZF9yZXMKKyAgICAgICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCB1cmwubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgInVybCBoYXMgbGVuZ3RoIDAgIiArIHVybCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgc2xhc2ggPSB1cmwuaW5kZXhPZignLycpOworICAgICAgICAgICAgaW50IGRvdCA9IHVybC5pbmRleE9mKCcuJywgc2xhc2gpOworICAgICAgICAgICAgaWYgKHNsYXNoID09IC0xIHx8IGRvdCA9PSAtMSkgeworICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgIkluY29ycmVjdCByZXMgcGF0aDogIiArIHVybCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgc3ViQ2xhc3NOYW1lID0gdXJsLnN1YnN0cmluZygwLCBzbGFzaCk7CisgICAgICAgICAgICBTdHJpbmcgZmllbGROYW1lID0gdXJsLnN1YnN0cmluZyhzbGFzaCArIDEsIGRvdCk7CisgICAgICAgICAgICBTdHJpbmcgZXJyb3JNc2cgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBkID0gbUNvbnRleHQuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSArICIuUiQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdWJDbGFzc05hbWUpOworICAgICAgICAgICAgICAgIGZpbmFsIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGZpZWxkID0gZC5nZXRGaWVsZChmaWVsZE5hbWUpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBpZCA9IGZpZWxkLmdldEludChudWxsKTsKKyAgICAgICAgICAgICAgICBUeXBlZFZhbHVlIHZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRWYWx1ZShpZCwgdmFsdWUsIHRydWUpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlID09IFR5cGVkVmFsdWUuVFlQRV9TVFJJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldEFzc2V0cygpLm9wZW5Ob25Bc3NldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5hc3NldENvb2tpZSwgdmFsdWUuc3RyaW5nLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXRNYW5hZ2VyLkFDQ0VTU19TVFJFQU1JTkcpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE9sZCBzdGFjayBvbmx5IHN1cHBvcnRzIFRZUEVfU1RSSU5HIGZvciByZXMgZmlsZXMKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAibm90IG9mIHR5cGUgc3RyaW5nOiAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJFeGNlcHRpb246ICIgKyB1cmwpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBBU1NFVCkgeworICAgICAgICAgICAgLy8gZmlsZTovLy9hbmRyb2lkX2Fzc2V0CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEFzc2V0TWFuYWdlciBhc3NldHMgPSBtQ29udGV4dC5nZXRBc3NldHMoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRzLm9wZW4odXJsLCBBc3NldE1hbmFnZXIuQUNDRVNTX1NUUkVBTUlORyk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBDT05URU5UKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UodXJsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkub3BlbklucHV0U3RyZWFtKHVyaSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgIkV4Y2VwdGlvbjogIiArIHVybCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIFN0YXJ0IGxvYWRpbmcgYSByZXNvdXJjZS4KICAgICAgKiBAcGFyYW0gbG9hZGVySGFuZGxlIFRoZSBuYXRpdmUgUmVzb3VyY2VMb2FkZXIgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZQogICAgICAqICAgICAgICAgICAgICAgICAgICAgZGF0YS4KQEAgLTg0Miw2ICs5ODYsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSUxFX1VQTE9BRF9MQUJFTCA9IDQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU0VUX0xBQkVMID0gNTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1VCTUlUX0xBQkVMID0gNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9VUExPQURfTk9fRklMRV9DSE9TRU4gPSA3OwogCiAgICAgU3RyaW5nIGdldFJhd1Jlc0ZpbGVuYW1lKGludCBpZCkgewogICAgICAgICBpbnQgcmVzaWQ7CkBAIC04NzEsNiArMTAxNiwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zdWJtaXQpOwogCisgICAgICAgICAgICBjYXNlIEZJTEVfVVBMT0FEX05PX0ZJTEVfQ0hPU0VOOgorICAgICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5ub19maWxlX2Nob3Nlbik7CisKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiZ2V0UmF3UmVzRmlsZW5hbWUgZ290IGluY29tcGF0aWJsZSByZXNvdXJjZSBJRCIpOwogICAgICAgICAgICAgICAgIHJldHVybiAiIjsKQEAgLTg5Myw2ICsxMDQyLDQwIEBACiAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IEpOSSB3aGVuIHRoZSBuYXRpdmUgSFRUUCBzdGFjayBnZXRzIGFuIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBXZSBkZWxlZ2F0ZSB0aGUgcmVxdWVzdCB0byBDYWxsYmFja1Byb3h5LCBhbmQgcm91dGUgaXRzIHJlc3BvbnNlIHRvCisgICAgICoge0BsaW5rICNuYXRpdmVBdXRoZW50aWNhdGlvblByb2NlZWQoaW50LCBTdHJpbmcsIFN0cmluZyl9IG9yCisgICAgICoge0BsaW5rICNuYXRpdmVBdXRoZW50aWNhdGlvbkNhbmNlbChpbnQpfS4KKyAgICAgKgorICAgICAqIFdlIGRvbid0IGNhcmUgd2hhdCB0aHJlYWQgdGhlIGNhbGxiYWNrIGlzIGludm9rZWQgb24uIEFsbCB0aHJlYWRpbmcgaXMKKyAgICAgKiBoYW5kbGVkIG9uIHRoZSBDKysgc2lkZSwgYmVjYXVzZSB0aGUgV2ViS2l0IHRocmVhZCBtYXkgYmUgYmxvY2tlZCBvbiBhCisgICAgICogc3luY2hyb25vdXMgY2FsbCBhbmQgdW5hYmxlIHRvIHB1bXAgb3VyIE1lc3NhZ2VRdWV1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKAorICAgICAgICAgICAgZmluYWwgaW50IGhhbmRsZSwgU3RyaW5nIGhvc3QsIFN0cmluZyByZWFsbSwgZmluYWwgYm9vbGVhbiB1c2VDYWNoZWRDcmVkZW50aWFscykgeworCisgICAgICAgIEh0dHBBdXRoSGFuZGxlciBoYW5kbGVyID0gbmV3IEh0dHBBdXRoSGFuZGxlcigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB1c2VIdHRwQXV0aFVzZXJuYW1lUGFzc3dvcmQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHVzZUNhY2hlZENyZWRlbnRpYWxzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb2NlZWQoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVBdXRoZW50aWNhdGlvblByb2NlZWQoaGFuZGxlLCB1c2VybmFtZSwgcGFzc3dvcmQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVBdXRoZW50aWNhdGlvbkNhbmNlbChoYW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBtQ2FsbGJhY2tQcm94eS5vblJlY2VpdmVkSHR0cEF1dGhSZXF1ZXN0KGhhbmRsZXIsIGhvc3QsIHJlYWxtKTsKKyAgICB9CisKICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgLy8gbmF0aXZlIGZ1bmN0aW9ucwogICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTEwMDYsNSArMTE4OSwxMCBAQAogICAgICAqLwogICAgIHByaXZhdGUgbmF0aXZlIEhhc2hNYXAgZ2V0Rm9ybVRleHREYXRhKCk7CiAKKyAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgbmF0aXZlU2F2ZVdlYkFyY2hpdmUoU3RyaW5nIGJhc2VuYW1lLCBib29sZWFuIGF1dG9uYW1lKTsKKwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlT3JpZW50YXRpb25DaGFuZ2VkKGludCBvcmllbnRhdGlvbik7CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUF1dGhlbnRpY2F0aW9uUHJvY2VlZChpbnQgaGFuZGxlLCBTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVBdXRoZW50aWNhdGlvbkNhbmNlbChpbnQgaGFuZGxlKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9DYWxsYmFja1Byb3h5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQ2FsbGJhY2tQcm94eS5qYXZhCmluZGV4IGQ2NWMxMDYuLmIwMGY4OGMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9DYWxsYmFja1Byb3h5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0NhbGxiYWNrUHJveHkuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2Via2l0OwogCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CkBAIC00MSw2ICs0Miw3IEBACiBpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAvKioKICAqIFRoaXMgY2xhc3MgaXMgYSBwcm94eSBjbGFzcyBmb3IgaGFuZGxpbmcgV2ViQ29yZSAtPiBVSSB0aHJlYWQgbWVzc2FnaW5nLiBBbGwKQEAgLTExMiw2ICsxMTQsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERfSElTVE9SWV9JVEVNICAgICAgICAgICAgICAgICAgICA9IDEzNTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSElTVE9SWV9JTkRFWF9DSEFOR0VEICAgICAgICAgICAgICAgPSAxMzY7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFVVEhfQ1JFREVOVElBTFMgICAgICAgICAgICAgICAgICAgID0gMTM3OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRfSU5TVEFMTEFCTEVfV0VCQVBQICAgICAgICAgICAgICA9IDEzODsKIAogICAgIC8vIE1lc3NhZ2UgdHJpZ2dlcmVkIGJ5IHRoZSBjbGllbnQgdG8gcmVzdW1lIGV4ZWN1dGlvbgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RJRlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwMDsKQEAgLTI1MywxNyArMjU2LDEwIEBACiAgICAgICAgIC8vIDMyLWJpdCByZWFkcyBhbmQgd3JpdGVzLgogICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CiAgICAgICAgICAgICBjYXNlIFBBR0VfU1RBUlRFRDoKLSAgICAgICAgICAgICAgICAvLyBldmVyeSB0aW1lIHdlIHN0YXJ0IGEgbmV3IHBhZ2UsIHdlIHdhbnQgdG8gcmVzZXQgdGhlCi0gICAgICAgICAgICAgICAgLy8gV2ViVmlldyBjZXJ0aWZpY2F0ZToKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgbmV3IHNpdGUgaXMgc2VjdXJlLCB3ZSB3aWxsIHJlbG9hZCBpdCBhbmQgZ2V0IGEKLSAgICAgICAgICAgICAgICAvLyBuZXcgY2VydGlmaWNhdGUgc2V0OwotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBuZXcgc2l0ZSBpcyBub3Qgc2VjdXJlLCB0aGUgY2VydGlmaWNhdGUgbXVzdCBiZQotICAgICAgICAgICAgICAgIC8vIG51bGwsIGFuZCB0aGF0IHdpbGwgYmUgdGhlIGNhc2UKLSAgICAgICAgICAgICAgICBtV2ViVmlldy5zZXRDZXJ0aWZpY2F0ZShudWxsKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3RhcnRlZFVybCA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJ1cmwiKTsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5vblBhZ2VTdGFydGVkKHN0YXJ0ZWRVcmwpOwogICAgICAgICAgICAgICAgIGlmIChtV2ViVmlld0NsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q2xpZW50Lm9uUGFnZVN0YXJ0ZWQobVdlYlZpZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmdldERhdGEoKS5nZXRTdHJpbmcoInVybCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCaXRtYXApIG1zZy5vYmopOworICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NsaWVudC5vblBhZ2VTdGFydGVkKG1XZWJWaWV3LCBzdGFydGVkVXJsLCAoQml0bWFwKSBtc2cub2JqKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTUwMCwxOCArNDk2LDMyIEBACiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtc2cuZ2V0RGF0YSgpLmdldFN0cmluZygidXJsIik7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbVdlYkNocm9tZUNsaWVudC5vbkpzQWxlcnQobVdlYlZpZXcsIHVybCwgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRpc3BsYXkgdGhlIGFsZXJ0IGRpYWxvZyBpZiB0aGUgbUNvbnRleHQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGl2aXR5IGFuZCBpdHMgd2luZG93IGhhcyB0aGUgZm9jdXMuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShtQ29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhKChBY3Rpdml0eSkgbUNvbnRleHQpLmhhc1dpbmRvd0ZvY3VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuY2FuY2VsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnNldFJlYWR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihtQ29udGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRpdGxlKGdldEpzRGlhbG9nVGl0bGUodXJsKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1lc3NhZ2UobWVzc2FnZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBvc2l0aXZlQnV0dG9uKFIuc3RyaW5nLm9rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBbGVydERpYWxvZy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2hpY2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jb25maXJtKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q2FuY2VsYWJsZShmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE9uQ2FuY2VsTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNhbmNlbExpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbmNlbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFsb2dJbnRlcmZhY2UgZGlhbG9nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuY2FuY2VsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHJlcy5zZXRSZWFkeSgpOwpAQCAtNTI1LDYgKzUzNSwxNCBAQAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbXNnLmdldERhdGEoKS5nZXRTdHJpbmcoInVybCIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIW1XZWJDaHJvbWVDbGllbnQub25Kc0NvbmZpcm0obVdlYlZpZXcsIHVybCwgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGRpc3BsYXkgdGhlIGFsZXJ0IGRpYWxvZyBpZiB0aGUgbUNvbnRleHQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGl2aXR5IGFuZCBpdHMgd2luZG93IGhhcyB0aGUgZm9jdXMuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShtQ29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhKChBY3Rpdml0eSkgbUNvbnRleHQpLmhhc1dpbmRvd0ZvY3VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuY2FuY2VsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnNldFJlYWR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihtQ29udGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRpdGxlKGdldEpzRGlhbG9nVGl0bGUodXJsKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1lc3NhZ2UobWVzc2FnZSkKQEAgLTU2NSw2ICs1ODMsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJ1cmwiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtV2ViQ2hyb21lQ2xpZW50Lm9uSnNQcm9tcHQobVdlYlZpZXcsIHVybCwgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbCwgcmVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBkaXNwbGF5IHRoZSBhbGVydCBkaWFsb2cgaWYgdGhlIG1Db250ZXh0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpdml0eSBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobUNvbnRleHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgISgoQWN0aXZpdHkpIG1Db250ZXh0KS5oYXNXaW5kb3dGb2N1cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zZXRSZWFkeSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGF5b3V0SW5mbGF0ZXIgZmFjdG9yeSA9IExheW91dEluZmxhdGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tKG1Db250ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IGZhY3RvcnkuaW5mbGF0ZShSLmxheW91dC5qc19wcm9tcHQsCkBAIC02MTYsNiArNjQyLDE0IEBACiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtc2cuZ2V0RGF0YSgpLmdldFN0cmluZygidXJsIik7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbVdlYkNocm9tZUNsaWVudC5vbkpzQmVmb3JlVW5sb2FkKG1XZWJWaWV3LCB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgcmVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBkaXNwbGF5IHRoZSBhbGVydCBkaWFsb2cgaWYgdGhlIG1Db250ZXh0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpdml0eSBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobUNvbnRleHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgISgoQWN0aXZpdHkpIG1Db250ZXh0KS5oYXNXaW5kb3dGb2N1cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zZXRSZWFkeSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG0gPSBtQ29udGV4dC5nZXRTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmpzX2RpYWxvZ19iZWZvcmVfdW5sb2FkLCBtZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKG1Db250ZXh0KQpAQCAtNzI1LDcgKzc1OSw4IEBACiAKICAgICAgICAgICAgIGNhc2UgT1BFTl9GSUxFX0NIT09TRVI6CiAgICAgICAgICAgICAgICAgaWYgKG1XZWJDaHJvbWVDbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtV2ViQ2hyb21lQ2xpZW50Lm9wZW5GaWxlQ2hvb3NlcigoVXBsb2FkRmlsZSkgbXNnLm9iaik7CisgICAgICAgICAgICAgICAgICAgIFVwbG9hZEZpbGVNZXNzYWdlRGF0YSBkYXRhID0gKFVwbG9hZEZpbGVNZXNzYWdlRGF0YSltc2cub2JqOworICAgICAgICAgICAgICAgICAgICBtV2ViQ2hyb21lQ2xpZW50Lm9wZW5GaWxlQ2hvb3NlcihkYXRhLmdldFVwbG9hZEZpbGUoKSwgZGF0YS5nZXRBY2NlcHRUeXBlKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNzUwLDYgKzc4NSw5IEBACiAgICAgICAgICAgICAgICAgbVdlYlZpZXcuc2V0SHR0cEF1dGhVc2VybmFtZVBhc3N3b3JkKAogICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCwgcmVhbG0sIHVzZXJuYW1lLCBwYXNzd29yZCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNFVF9JTlNUQUxMQUJMRV9XRUJBUFA6CisgICAgICAgICAgICAgICAgbVdlYkNocm9tZUNsaWVudC5zZXRJbnN0YWxsYWJsZVdlYkFwcCgpOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDg3LDEwICsxMTI1LDE1IEBACiAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoaW50IG5ld1Byb2dyZXNzKSB7CiAgICAgICAgIC8vIFN5bmNocm9uaXplIHNvIHRoYXQgbUxhdGVzdFByb2dyZXNzIGlzIHVwLXRvLWRhdGUuCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgaWYgKG1XZWJDaHJvbWVDbGllbnQgPT0gbnVsbCB8fCBtTGF0ZXN0UHJvZ3Jlc3MgPT0gbmV3UHJvZ3Jlc3MpIHsKKyAgICAgICAgICAgIC8vIHVwZGF0ZSBtTGF0ZXN0UHJvZ3Jlc3MgZXZlbiBtV2ViQ2hyb21lQ2xpZW50IGlzIG51bGwgYXMKKyAgICAgICAgICAgIC8vIFdlYlZpZXcuZ2V0UHJvZ3Jlc3MoKSBuZWVkcyBpdAorICAgICAgICAgICAgaWYgKG1MYXRlc3RQcm9ncmVzcyA9PSBuZXdQcm9ncmVzcykgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1MYXRlc3RQcm9ncmVzcyA9IG5ld1Byb2dyZXNzOworICAgICAgICAgICAgaWYgKG1XZWJDaHJvbWVDbGllbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghbVByb2dyZXNzVXBkYXRlUGVuZGluZykgewogICAgICAgICAgICAgICAgIHNlbmRFbXB0eU1lc3NhZ2UoUFJPR1JFU1MpOwogICAgICAgICAgICAgICAgIG1Qcm9ncmVzc1VwZGF0ZVBlbmRpbmcgPSB0cnVlOwpAQCAtMTE3Miw5ICsxMjE1LDcgQEAKICAgICAgICAgLy8gZm9yIG51bGwuCiAgICAgICAgIFdlYkhpc3RvcnlJdGVtIGkgPSBtQmFja0ZvcndhcmRMaXN0LmdldEN1cnJlbnRJdGVtKCk7CiAgICAgICAgIGlmIChpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChwcmVjb21wb3NlZCB8fCBpLmdldFRvdWNoSWNvblVybCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpLnNldFRvdWNoSWNvblVybCh1cmwpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgaS5zZXRUb3VjaEljb25VcmwodXJsLCBwcmVjb21wb3NlZCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gRG8gYW4gdW5zeW5jaHJvbml6ZWQgcXVpY2sgY2hlY2sgdG8gYXZvaWQgcG9zdGluZyBpZiBubyBjYWxsYmFjayBoYXMKICAgICAgICAgLy8gYmVlbiBzZXQuCkBAIC0xNDMyLDYgKzE0NzMsMjQgQEAKICAgICAgICAgc2VuZE1lc3NhZ2UobXNnKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBVcGxvYWRGaWxlTWVzc2FnZURhdGEgeworICAgICAgICBwcml2YXRlIFVwbG9hZEZpbGUgbUNhbGxiYWNrOworICAgICAgICBwcml2YXRlIFN0cmluZyBtQWNjZXB0VHlwZTsKKworICAgICAgICBwdWJsaWMgVXBsb2FkRmlsZU1lc3NhZ2VEYXRhKFVwbG9hZEZpbGUgdXBsb2FkRmlsZSwgU3RyaW5nIGFjY2VwdFR5cGUpIHsKKyAgICAgICAgICAgIG1DYWxsYmFjayA9IHVwbG9hZEZpbGU7CisgICAgICAgICAgICBtQWNjZXB0VHlwZSA9IGFjY2VwdFR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVXBsb2FkRmlsZSBnZXRVcGxvYWRGaWxlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1DYWxsYmFjazsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWNjZXB0VHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQWNjZXB0VHlwZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgY2xhc3MgVXBsb2FkRmlsZSBpbXBsZW1lbnRzIFZhbHVlQ2FsbGJhY2s8VXJpPiB7CiAgICAgICAgIHByaXZhdGUgVXJpIG1WYWx1ZTsKICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlVmFsdWUoVXJpIHZhbHVlKSB7CkBAIC0xNDQ4LDEzICsxNTA3LDE0IEBACiAgICAgLyoqCiAgICAgICogQ2FsbGVkIGJ5IFdlYlZpZXdDb3JlIHRvIG9wZW4gYSBmaWxlIGNob29zZXIuCiAgICAgICovCi0gICAgLyogcGFja2FnZSAqLyBVcmkgb3BlbkZpbGVDaG9vc2VyKCkgeworICAgIC8qIHBhY2thZ2UgKi8gVXJpIG9wZW5GaWxlQ2hvb3NlcihTdHJpbmcgYWNjZXB0VHlwZSkgewogICAgICAgICBpZiAobVdlYkNocm9tZUNsaWVudCA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgICAgICBNZXNzYWdlIG15TWVzc2FnZSA9IG9idGFpbk1lc3NhZ2UoT1BFTl9GSUxFX0NIT09TRVIpOwogICAgICAgICBVcGxvYWRGaWxlIHVwbG9hZEZpbGUgPSBuZXcgVXBsb2FkRmlsZSgpOwotICAgICAgICBteU1lc3NhZ2Uub2JqID0gdXBsb2FkRmlsZTsKKyAgICAgICAgVXBsb2FkRmlsZU1lc3NhZ2VEYXRhIGRhdGEgPSBuZXcgVXBsb2FkRmlsZU1lc3NhZ2VEYXRhKHVwbG9hZEZpbGUsIGFjY2VwdFR5cGUpOworICAgICAgICBteU1lc3NhZ2Uub2JqID0gZGF0YTsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBzZW5kTWVzc2FnZShteU1lc3NhZ2UpOwogICAgICAgICAgICAgdHJ5IHsKQEAgLTE0ODMsNCArMTU0MywxMSBAQAogICAgICAgICBNZXNzYWdlIG1zZyA9IG9idGFpbk1lc3NhZ2UoSElTVE9SWV9JTkRFWF9DSEFOR0VELCBpbmRleCwgMCwgaXRlbSk7CiAgICAgICAgIHNlbmRNZXNzYWdlKG1zZyk7CiAgICAgfQorCisgICAgdm9pZCBzZXRJbnN0YWxsYWJsZVdlYkFwcCgpIHsKKyAgICAgICAgaWYgKG1XZWJDaHJvbWVDbGllbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoU0VUX0lOU1RBTExBQkxFX1dFQkFQUCkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWMyZjQzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0RldmljZU9yaWVudGF0aW9uTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgc2ltcGx5IGEgY29udGFpbmVyIGZvciB0aGUgbWV0aG9kcyB1c2VkIHRvIGltcGxlbWVudCBEZXZpY2VPcmllbnRhdGlvbiwKKyAqIGluY2x1ZGluZyB0aGUgbW9jayBEZXZpY2VPcmllbnRhdGlvbkNsaWVudCBmb3IgdXNlIGluIExheW91dFRlc3RzLgorICoKKyAqIFRoaXMgY291bGQgYmUgcGFydCBvZiBXZWJWaWV3Q29yZSwgYnV0IGhhdmUgbW92ZWQgaXQgdG8gaXRzIG93biBjbGFzcyB0bworICogYXZvaWQgYmxvYXQgdGhlcmUuCisgKiBAaGlkZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyIHsKKyAgICBwcml2YXRlIFdlYlZpZXdDb3JlIG1XZWJWaWV3Q29yZTsKKyAgICBwcml2YXRlIERldmljZU9yaWVudGF0aW9uU2VydmljZSBtU2VydmljZTsKKworICAgIHB1YmxpYyBEZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIoV2ViVmlld0NvcmUgd2ViVmlld0NvcmUpIHsKKyAgICAgICAgbVdlYlZpZXdDb3JlID0gd2ViVmlld0NvcmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRoZSBQYWdlIGZvciB0aGlzIFdlYlZpZXdDb3JlIHNob3VsZCB1c2UgYSBtb2NrIERldmljZU9yaWVudGF0aW9uCisgICAgICogY2xpZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVzZU1vY2soKSB7CisgICAgICAgIGFzc2VydCBXZWJWaWV3Q29yZS5USFJFQURfTkFNRS5lcXVhbHMoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICBuYXRpdmVVc2VNb2NrKG1XZWJWaWV3Q29yZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwb3NpdGlvbiBmb3IgdGhlIG1vY2sgRGV2aWNlT3JpZW50YXRpb24gc2VydmljZSBmb3IgdGhpcyBXZWJWaWV3Q29yZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrT3JpZW50YXRpb24oYm9vbGVhbiBjYW5Qcm92aWRlQWxwaGEsIGRvdWJsZSBhbHBoYSwgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwKKyAgICAgICAgICAgIGRvdWJsZSBiZXRhLCBib29sZWFuIGNhblByb3ZpZGVHYW1tYSwgZG91YmxlIGdhbW1hKSB7CisgICAgICAgIGFzc2VydCBXZWJWaWV3Q29yZS5USFJFQURfTkFNRS5lcXVhbHMoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICBuYXRpdmVTZXRNb2NrT3JpZW50YXRpb24obVdlYlZpZXdDb3JlLCBjYW5Qcm92aWRlQWxwaGEsIGFscGhhLCBjYW5Qcm92aWRlQmV0YSwgYmV0YSwKKyAgICAgICAgICAgICAgICBjYW5Qcm92aWRlR2FtbWEsIGdhbW1hKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbk9yaWVudGF0aW9uQ2hhbmdlKERvdWJsZSBhbHBoYSwgRG91YmxlIGJldGEsIERvdWJsZSBnYW1tYSkgeworICAgICAgICBuYXRpdmVPbk9yaWVudGF0aW9uQ2hhbmdlKG1XZWJWaWV3Q29yZSwKKyAgICAgICAgICAgICAgICBhbHBoYSAhPSBudWxsLCBhbHBoYSAhPSBudWxsID8gYWxwaGEuZG91YmxlVmFsdWUoKSA6IDAuMCwKKyAgICAgICAgICAgICAgICBiZXRhICE9IG51bGwsIGJldGEgIT0gbnVsbCA/IGJldGEuZG91YmxlVmFsdWUoKSA6IDAuMCwKKyAgICAgICAgICAgICAgICBnYW1tYSAhPSBudWxsLCBnYW1tYSAhPSBudWxsID8gZ2FtbWEuZG91YmxlVmFsdWUoKSA6IDAuMCk7CisgICAgfQorCisgICAgLy8gTmF0aXZlIGZ1bmN0aW9ucworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVVzZU1vY2soV2ViVmlld0NvcmUgd2ViVmlld0NvcmUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVNldE1vY2tPcmllbnRhdGlvbihXZWJWaWV3Q29yZSB3ZWJWaWV3Q29yZSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUFscGhhLCBkb3VibGUgYWxwaGEsIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsIGRvdWJsZSBiZXRhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlR2FtbWEsIGRvdWJsZSBnYW1tYSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlT25PcmllbnRhdGlvbkNoYW5nZShXZWJWaWV3Q29yZSB3ZWJWaWV3Q29yZSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUFscGhhLCBkb3VibGUgYWxwaGEsIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsIGRvdWJsZSBiZXRhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlR2FtbWEsIGRvdWJsZSBnYW1tYSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWI4NjZkMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9EZXZpY2VPcmllbnRhdGlvblNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckV2ZW50OworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yRXZlbnRMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQud2Via2l0LkRldmljZU9yaWVudGF0aW9uTWFuYWdlcjsKK2ltcG9ydCBqYXZhLmxhbmcuUnVubmFibGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKworZmluYWwgY2xhc3MgRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlIGltcGxlbWVudHMgU2Vuc29yRXZlbnRMaXN0ZW5lciB7CisgICAgLy8gVGhlIGdyYXZpdHkgdmVjdG9yIGV4cHJlc3NlZCBpbiB0aGUgYm9keSBmcmFtZS4KKyAgICBwcml2YXRlIGZsb2F0W10gbUdyYXZpdHlWZWN0b3I7CisgICAgLy8gVGhlIGdlb21hZ25ldGljIHZlY3RvciBleHByZXNzZWQgaW4gdGhlIGJvZHkgZnJhbWUuCisgICAgcHJpdmF0ZSBmbG9hdFtdIG1NYWduZXRpY0ZpZWxkVmVjdG9yOworCisgICAgcHJpdmF0ZSBEZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIgbU1hbmFnZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1J1bm5pbmc7CisgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOworICAgIHByaXZhdGUgU2Vuc29yTWFuYWdlciBtU2Vuc29yTWFuYWdlcjsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBEb3VibGUgbUFscGhhOworICAgIHByaXZhdGUgRG91YmxlIG1CZXRhOworICAgIHByaXZhdGUgRG91YmxlIG1HYW1tYTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhdmVTZW50RXJyb3JFdmVudDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBERUxUQV9ERUdSRVNTID0gMS4wOworCisgICAgcHVibGljIERldmljZU9yaWVudGF0aW9uU2VydmljZShEZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIgbWFuYWdlciwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1NYW5hZ2VyID0gbWFuYWdlcjsKKyAgICAgICAgYXNzZXJ0KG1NYW5hZ2VyICE9IG51bGwpOworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIGFzc2VydChtQ29udGV4dCAhPSBudWxsKTsKKyAgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIG1Jc1J1bm5pbmcgPSB0cnVlOworICAgICAgICByZWdpc3RlckZvclNlbnNvcnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBtSXNSdW5uaW5nID0gZmFsc2U7CisgICAgICAgIHVucmVnaXN0ZXJGcm9tU2Vuc29ycygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN1c3BlbmQoKSB7CisgICAgICAgIGlmIChtSXNSdW5uaW5nKSB7CisgICAgICAgICAgICB1bnJlZ2lzdGVyRnJvbVNlbnNvcnMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc3VtZSgpIHsKKyAgICAgICAgaWYgKG1Jc1J1bm5pbmcpIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyRm9yU2Vuc29ycygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRFcnJvckV2ZW50KCkgeworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgLy8gVGhlIHNwZWMgcmVxdWlyZXMgdGhhdCBlYWNoIGxpc3RlbmVyIHJlY2VpdmVzIHRoZSBlcnJvciBldmVudCBvbmx5IG9uY2UuCisgICAgICAgIGlmIChtSGF2ZVNlbnRFcnJvckV2ZW50KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBtSGF2ZVNlbnRFcnJvckV2ZW50ID0gdHJ1ZTsKKyAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAobUlzUnVubmluZykgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc3BlY2lhbCBjYXNlIG9mIGFsbCBudWxscyBpcyB1c2VkIHRvIHNpZ25pZnkgYSBmYWlsdXJlIHRvIGdldCBkYXRhLgorICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5vbk9yaWVudGF0aW9uQ2hhbmdlKG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyRm9yU2Vuc29ycygpIHsKKyAgICAgICAgaWYgKG1IYW5kbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXJlZ2lzdGVyRm9yQWNjZWxlcm9tZXRlclNlbnNvcigpIHx8ICFyZWdpc3RlckZvck1hZ25ldGljRmllbGRTZW5zb3IoKSkgeworICAgICAgICAgICAgdW5yZWdpc3RlckZyb21TZW5zb3JzKCk7CisgICAgICAgICAgICBzZW5kRXJyb3JFdmVudCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdldE9yaWVudGF0aW9uVXNpbmdHZXRSb3RhdGlvbk1hdHJpeCgpIHsKKyAgICAgICAgaWYgKG1HcmF2aXR5VmVjdG9yID09IG51bGwgfHwgbU1hZ25ldGljRmllbGRWZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IHRoZSByb3RhdGlvbiBtYXRyaXguCisgICAgICAgIC8vIFRoZSByb3RhdGlvbiBtYXRyaXggdGhhdCB0cmFuc2Zvcm1zIGZyb20gdGhlIGJvZHkgZnJhbWUgdG8gdGhlIGVhcnRoIGZyYW1lLgorICAgICAgICBmbG9hdFtdIGRldmljZVJvdGF0aW9uTWF0cml4ID0gbmV3IGZsb2F0WzldOworICAgICAgICBpZiAoIVNlbnNvck1hbmFnZXIuZ2V0Um90YXRpb25NYXRyaXgoCisgICAgICAgICAgICAgICAgZGV2aWNlUm90YXRpb25NYXRyaXgsIG51bGwsIG1HcmF2aXR5VmVjdG9yLCBtTWFnbmV0aWNGaWVsZFZlY3RvcikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbnZlcnQgcm90YXRpb24gbWF0cml4IHRvIHJvdGF0aW9uIGFuZ2xlcy4KKyAgICAgICAgLy8gQXNzdW1pbmcgdGhhdCB0aGUgcm90YXRpb25zIGFyZSBhcHBpZWQgaW4gdGhlIG9yZGVyIGxpc3RlZCBhdAorICAgICAgICAvLyBodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL1NlbnNvckV2ZW50Lmh0bWwjdmFsdWVzCisgICAgICAgIC8vIHRoZSByb3RhdGlvbnMgYXJlIGFwcGxpZWQgYWJvdXQgdGhlIHNhbWUgYXhlcyBhbmQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgcmVxdWlyZWQgYnkgdGhlCisgICAgICAgIC8vIEFQSS4gVGhlIG9ubHkgY29udmVyc2lvbnMgYXJlIHNpZ24gY2hhbmdlcyBhcyBmb2xsb3dzLgorICAgICAgICAvLyBUaGUgYW5nbGVzIGFyZSBpbiByYWRpYW5zCisgICAgICAgIGZsb2F0W10gcm90YXRpb25BbmdsZXMgPSBuZXcgZmxvYXRbM107CisgICAgICAgIFNlbnNvck1hbmFnZXIuZ2V0T3JpZW50YXRpb24oZGV2aWNlUm90YXRpb25NYXRyaXgsIHJvdGF0aW9uQW5nbGVzKTsKKyAgICAgICAgZG91YmxlIGFscGhhID0gTWF0aC50b0RlZ3JlZXMoLXJvdGF0aW9uQW5nbGVzWzBdKSAtIDkwLjA7CisgICAgICAgIHdoaWxlIChhbHBoYSA8IDAuMCkgeyBhbHBoYSArPSAzNjAuMDsgfSAvLyBbMCwgMzYwKQorICAgICAgICBkb3VibGUgYmV0YSA9IE1hdGgudG9EZWdyZWVzKC1yb3RhdGlvbkFuZ2xlc1sxXSk7CisgICAgICAgIHdoaWxlIChiZXRhIDwgLTE4MC4wKSB7IGJldGEgKz0gMzYwLjA7IH0gLy8gWy0xODAsIDE4MCkKKyAgICAgICAgZG91YmxlIGdhbW1hID0gTWF0aC50b0RlZ3JlZXMocm90YXRpb25BbmdsZXNbMl0pOworICAgICAgICB3aGlsZSAoZ2FtbWEgPCAtOTAuMCkgeyBnYW1tYSArPSAzNjAuMDsgfSAvLyBbLTkwLCA5MCkKKworICAgICAgICBtYXliZVNlbmRDaGFuZ2UoYWxwaGEsIGJldGEsIGdhbW1hKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNlbnNvck1hbmFnZXIgZ2V0U2Vuc29yTWFuYWdlcigpIHsKKyAgICAgICAgYXNzZXJ0IFdlYlZpZXdDb3JlLlRIUkVBRF9OQU1FLmVxdWFscyhUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgIGlmIChtU2Vuc29yTWFuYWdlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtU2Vuc29yTWFuYWdlciA9IChTZW5zb3JNYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuU0VOU09SX1NFUlZJQ0UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtU2Vuc29yTWFuYWdlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVnaXN0ZXJGb3JBY2NlbGVyb21ldGVyU2Vuc29yKCkgeworICAgICAgICBMaXN0PFNlbnNvcj4gc2Vuc29ycyA9IGdldFNlbnNvck1hbmFnZXIoKS5nZXRTZW5zb3JMaXN0KFNlbnNvci5UWVBFX0FDQ0VMRVJPTUVURVIpOworICAgICAgICBpZiAoc2Vuc29ycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBDb25zaWRlciBoYW5kbGluZyBtdWx0aXBsZSBzZW5zb3JzLgorICAgICAgICByZXR1cm4gZ2V0U2Vuc29yTWFuYWdlcigpLnJlZ2lzdGVyTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgdGhpcywgc2Vuc29ycy5nZXQoMCksIFNlbnNvck1hbmFnZXIuU0VOU09SX0RFTEFZX0ZBU1RFU1QsIG1IYW5kbGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVnaXN0ZXJGb3JNYWduZXRpY0ZpZWxkU2Vuc29yKCkgeworICAgICAgICBMaXN0PFNlbnNvcj4gc2Vuc29ycyA9IGdldFNlbnNvck1hbmFnZXIoKS5nZXRTZW5zb3JMaXN0KFNlbnNvci5UWVBFX01BR05FVElDX0ZJRUxEKTsKKyAgICAgICAgaWYgKHNlbnNvcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgaGFuZGxpbmcgbXVsdGlwbGUgc2Vuc29ycy4KKyAgICAgICAgcmV0dXJuIGdldFNlbnNvck1hbmFnZXIoKS5yZWdpc3Rlckxpc3RlbmVyKAorICAgICAgICAgICAgICAgIHRoaXMsIHNlbnNvcnMuZ2V0KDApLCBTZW5zb3JNYW5hZ2VyLlNFTlNPUl9ERUxBWV9GQVNURVNULCBtSGFuZGxlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVucmVnaXN0ZXJGcm9tU2Vuc29ycygpIHsKKyAgICAgICAgZ2V0U2Vuc29yTWFuYWdlcigpLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWF5YmVTZW5kQ2hhbmdlKGRvdWJsZSBhbHBoYSwgZG91YmxlIGJldGEsIGRvdWJsZSBnYW1tYSkgeworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKG1BbHBoYSA9PSBudWxsIHx8IG1CZXRhID09IG51bGwgfHwgbUdhbW1hID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCBNYXRoLmFicyhhbHBoYSAtIG1BbHBoYSkgPiBERUxUQV9ERUdSRVNTCisgICAgICAgICAgICAgICAgfHwgTWF0aC5hYnMoYmV0YSAtIG1CZXRhKSA+IERFTFRBX0RFR1JFU1MKKyAgICAgICAgICAgICAgICB8fCBNYXRoLmFicyhnYW1tYSAtIG1HYW1tYSkgPiBERUxUQV9ERUdSRVNTKSB7CisgICAgICAgICAgICBtQWxwaGEgPSBhbHBoYTsKKyAgICAgICAgICAgIG1CZXRhID0gYmV0YTsKKyAgICAgICAgICAgIG1HYW1tYSA9IGdhbW1hOworICAgICAgICAgICAgbU1hbmFnZXIub25PcmllbnRhdGlvbkNoYW5nZShtQWxwaGEsIG1CZXRhLCBtR2FtbWEpOworICAgICAgICAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBzdWNjZXNzZnVsbHkgc2VudCBzb21lIGRhdGEsIHJlc2V0IHdoZXRoZXIgd2UndmUgc2VudCBhbiBlcnJvci4KKyAgICAgICAgICAgIG1IYXZlU2VudEVycm9yRXZlbnQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbnNvckV2ZW50TGlzdGVuZXIgaW1wbGVtZW50YXRpb24uCisgICAgICogQ2FsbGJhY2tzIGhhcHBlbiBvbiB0aGUgdGhyZWFkIG9uIHdoaWNoIHdlIHJlZ2lzdGVyZWQgLSB0aGUgV2ViQ29yZSB0aHJlYWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TZW5zb3JDaGFuZ2VkKFNlbnNvckV2ZW50IGV2ZW50KSB7CisgICAgICAgIGFzc2VydChldmVudC52YWx1ZXMubGVuZ3RoID09IDMpOworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKworICAgICAgICBpZiAoIW1Jc1J1bm5pbmcpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoZXZlbnQuc2Vuc29yLmdldFR5cGUoKSkgeworICAgICAgICAgIGNhc2UgU2Vuc29yLlRZUEVfQUNDRUxFUk9NRVRFUjoKKyAgICAgICAgICAgIGlmIChtR3Jhdml0eVZlY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUdyYXZpdHlWZWN0b3IgPSBuZXcgZmxvYXRbM107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtR3Jhdml0eVZlY3RvclswXSA9IGV2ZW50LnZhbHVlc1swXTsKKyAgICAgICAgICAgIG1HcmF2aXR5VmVjdG9yWzFdID0gZXZlbnQudmFsdWVzWzFdOworICAgICAgICAgICAgbUdyYXZpdHlWZWN0b3JbMl0gPSBldmVudC52YWx1ZXNbMl07CisgICAgICAgICAgICBnZXRPcmllbnRhdGlvblVzaW5nR2V0Um90YXRpb25NYXRyaXgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgU2Vuc29yLlRZUEVfTUFHTkVUSUNfRklFTEQ6CisgICAgICAgICAgICBpZiAobU1hZ25ldGljRmllbGRWZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1NYWduZXRpY0ZpZWxkVmVjdG9yID0gbmV3IGZsb2F0WzNdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1hZ25ldGljRmllbGRWZWN0b3JbMF0gPSBldmVudC52YWx1ZXNbMF07CisgICAgICAgICAgICBtTWFnbmV0aWNGaWVsZFZlY3RvclsxXSA9IGV2ZW50LnZhbHVlc1sxXTsKKyAgICAgICAgICAgIG1NYWduZXRpY0ZpZWxkVmVjdG9yWzJdID0gZXZlbnQudmFsdWVzWzJdOworICAgICAgICAgICAgZ2V0T3JpZW50YXRpb25Vc2luZ0dldFJvdGF0aW9uTWF0cml4KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQWNjdXJhY3lDaGFuZ2VkKFNlbnNvciBzZW5zb3IsIGludCBhY2N1cmFjeSkgeworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRmluZEFjdGlvbk1vZGVDYWxsYmFjay5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0ZpbmRBY3Rpb25Nb2RlQ2FsbGJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzA0M2UwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0ZpbmRBY3Rpb25Nb2RlQ2FsbGJhY2suamF2YQpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOworCitjbGFzcyBGaW5kQWN0aW9uTW9kZUNhbGxiYWNrIGltcGxlbWVudHMgQWN0aW9uTW9kZS5DYWxsYmFjaywgVGV4dFdhdGNoZXIsCisgICAgICAgIFZpZXcuT25Mb25nQ2xpY2tMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21WaWV3OworICAgIHByaXZhdGUgRWRpdFRleHQgbUVkaXRUZXh0OworICAgIHByaXZhdGUgVGV4dFZpZXcgbU1hdGNoZXM7CisgICAgcHJpdmF0ZSBXZWJWaWV3IG1XZWJWaWV3OworICAgIHByaXZhdGUgSW5wdXRNZXRob2RNYW5hZ2VyIG1JbnB1dDsKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzb3VyY2VzOworICAgIHByaXZhdGUgYm9vbGVhbiBtTWF0Y2hlc0ZvdW5kOworICAgIHByaXZhdGUgaW50IG1OdW1iZXJPZk1hdGNoZXM7CisgICAgcHJpdmF0ZSBWaWV3IG1UaXRsZUJhcjsKKyAgICBwcml2YXRlIEFjdGlvbk1vZGUgbUFjdGlvbk1vZGU7CisKKyAgICBGaW5kQWN0aW9uTW9kZUNhbGxiYWNrKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBtQ3VzdG9tVmlldyA9IExheW91dEluZmxhdGVyLmZyb20oY29udGV4dCkuaW5mbGF0ZSgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC53ZWJ2aWV3X2ZpbmQsIG51bGwpOworICAgICAgICBtRWRpdFRleHQgPSAoRWRpdFRleHQpIG1DdXN0b21WaWV3LmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmVkaXQpOworICAgICAgICAvLyBPdmVycmlkZSBsb25nIGNsaWNrIHNvIHRoYXQgc2VsZWN0IEFjdGlvbk1vZGUgaXMgbm90IG9wZW5lZCwgd2hpY2gKKyAgICAgICAgLy8gd291bGQgZXhpdCBmaW5kIEFjdGlvbk1vZGUuCisgICAgICAgIG1FZGl0VGV4dC5zZXRPbkxvbmdDbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICBzZXRUZXh0KCIiKTsKKyAgICAgICAgbU1hdGNoZXMgPSAoVGV4dFZpZXcpIG1DdXN0b21WaWV3LmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLm1hdGNoZXMpOworICAgICAgICBtSW5wdXQgPSAoSW5wdXRNZXRob2RNYW5hZ2VyKQorICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKKyAgICAgICAgbVJlc291cmNlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisgICAgfQorCisgICAgdm9pZCBzZXRUaXRsZUJhcihWaWV3IHYpIHsgbVRpdGxlQmFyID0gdjsgfQorCisgICAgdm9pZCBmaW5pc2goKSB7CisgICAgICAgIG1BY3Rpb25Nb2RlLmZpbmlzaCgpOworICAgIH0KKworICAgIC8qCisgICAgICogUGxhY2UgdGV4dCBpbiB0aGUgdGV4dCBmaWVsZCBzbyBpdCBjYW4gYmUgc2VhcmNoZWQgZm9yLiAgTmVlZCB0byBwcmVzcworICAgICAqIHRoZSBmaW5kIG5leHQgb3IgZmluZCBwcmV2aW91cyBidXR0b24gdG8gZmluZCBhbGwgb2YgdGhlIG1hdGNoZXMuCisgICAgICovCisgICAgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7CisgICAgICAgIG1FZGl0VGV4dC5zZXRUZXh0KHRleHQpOworICAgICAgICBTcGFubmFibGUgc3BhbiA9IChTcGFubmFibGUpIG1FZGl0VGV4dC5nZXRUZXh0KCk7CisgICAgICAgIGludCBsZW5ndGggPSBzcGFuLmxlbmd0aCgpOworICAgICAgICAvLyBJZGVhbGx5LCB3ZSB3b3VsZCBsaWtlIHRvIHNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZSB3aG9sZSBmaWVsZCwKKyAgICAgICAgLy8gYnV0IHRoaXMgYnJpbmdzIHVwIHRoZSBUZXh0IHNlbGVjdGlvbiBDQUIsIHdoaWNoIGRpc21pc3NlcyB0aGlzCisgICAgICAgIC8vIG9uZS4KKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihzcGFuLCBsZW5ndGgsIGxlbmd0aCk7CisgICAgICAgIC8vIE5lY2Vzc2FyeSBlYWNoIHRpbWUgd2Ugc2V0IHRoZSB0ZXh0LCBzbyB0aGF0IHRoaXMgd2lsbCB3YXRjaAorICAgICAgICAvLyBjaGFuZ2VzIHRvIGl0LgorICAgICAgICBzcGFuLnNldFNwYW4odGhpcywgMCwgbGVuZ3RoLCBTcGFubmFibGUuU1BBTl9JTkNMVVNJVkVfSU5DTFVTSVZFKTsKKyAgICAgICAgbU1hdGNoZXNGb3VuZCA9IGZhbHNlOworICAgIH0KKworICAgIC8qCisgICAgICogU2V0IHRoZSBXZWJWaWV3IHRvIHNlYXJjaC4gIE11c3QgYmUgbm9uIG51bGwsIGFuZCBzZXQgYmVmb3JlIGNhbGxpbmcKKyAgICAgKiBzdGFydEFjdGlvbk1vZGUuCisgICAgICovCisgICAgdm9pZCBzZXRXZWJWaWV3KFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBpZiAobnVsbCA9PSB3ZWJWaWV3KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIldlYlZpZXcgc3VwcGxpZWQgdG8gIgorICAgICAgICAgICAgICAgICAgICArICJGaW5kQWN0aW9uTW9kZUNhbGxiYWNrIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgIH0KKworICAgIC8qCisgICAgICogTW92ZSB0aGUgaGlnaGxpZ2h0IHRvIHRoZSBuZXh0IG1hdGNoLgorICAgICAqIEBwYXJhbSBuZXh0IElmIHRydWUsIGZpbmQgdGhlIG5leHQgbWF0Y2ggZnVydGhlciBkb3duIGluIHRoZSBkb2N1bWVudC4KKyAgICAgKiAgICAgICAgICAgICBJZiBmYWxzZSwgZmluZCB0aGUgcHJldmlvdXMgbWF0Y2gsIHVwIGluIHRoZSBkb2N1bWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZmluZE5leHQoYm9vbGVhbiBuZXh0KSB7CisgICAgICAgIGlmIChtV2ViVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJObyBXZWJWaWV3IGZvciBGaW5kQWN0aW9uTW9kZUNhbGxiYWNrOjpmaW5kTmV4dCIpOworICAgICAgICB9CisgICAgICAgIG1XZWJWaWV3LmZpbmROZXh0KG5leHQpOworICAgIH0KKworICAgIC8qCisgICAgICogSGlnaGxpZ2h0IGFsbCB0aGUgaW5zdGFuY2VzIG9mIHRoZSBzdHJpbmcgZnJvbSBtRWRpdFRleHQgaW4gbVdlYlZpZXcuCisgICAgICovCisgICAgdm9pZCBmaW5kQWxsKCkgeworICAgICAgICBpZiAobVdlYlZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAiTm8gV2ViVmlldyBmb3IgRmluZEFjdGlvbk1vZGVDYWxsYmFjazo6ZmluZEFsbCIpOworICAgICAgICB9CisgICAgICAgIENoYXJTZXF1ZW5jZSBmaW5kID0gbUVkaXRUZXh0LmdldFRleHQoKTsKKyAgICAgICAgaWYgKDAgPT0gZmluZC5sZW5ndGgoKSkgeworICAgICAgICAgICAgbVdlYlZpZXcuY2xlYXJNYXRjaGVzKCk7CisgICAgICAgICAgICBtTWF0Y2hlcy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtTWF0Y2hlc0ZvdW5kID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTWF0Y2hlc0ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIG1NYXRjaGVzLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1OdW1iZXJPZk1hdGNoZXMgPSBtV2ViVmlldy5maW5kQWxsKGZpbmQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAoMCA9PSBtTnVtYmVyT2ZNYXRjaGVzKSB7CisgICAgICAgICAgICAgICAgbU1hdGNoZXMuc2V0VGV4dChtUmVzb3VyY2VzLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLm5vX21hdGNoZXMpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdXBkYXRlTWF0Y2hlc1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIHN0cmluZyB3aGljaCB0ZWxscyB0aGUgdXNlciBob3cgbWFueSBtYXRjaGVzIHdlcmUgZm91bmQsIGFuZAorICAgICAqIHdoaWNoIG1hdGNoIGlzIGN1cnJlbnRseSBoaWdobGlnaHRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlTWF0Y2hlc1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIHRlbXBsYXRlID0gbVJlc291cmNlcy5nZXRRdWFudGl0eVN0cmluZygKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnBsdXJhbHMubWF0Y2hlc19mb3VuZCwgbU51bWJlck9mTWF0Y2hlcywKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5maW5kSW5kZXgoKSArIDEsIG1OdW1iZXJPZk1hdGNoZXMpOworCisgICAgICAgIG1NYXRjaGVzLnNldFRleHQodGVtcGxhdGUpOworICAgIH0KKworICAgIC8vIE9uTG9uZ0NsaWNrTGlzdGVuZXIgaW1wbGVtZW50YXRpb24KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uTG9uZ0NsaWNrKFZpZXcgdikgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgLy8gQWN0aW9uTW9kZS5DYWxsYmFjayBpbXBsZW1lbnRhdGlvbgorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgIG1vZGUuc2V0Q3VzdG9tVmlldyhtQ3VzdG9tVmlldyk7CisgICAgICAgIG1vZGUuZ2V0TWVudUluZmxhdGVyKCkuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLm1lbnUud2Vidmlld19maW5kLAorICAgICAgICAgICAgICAgIG1lbnUpOworICAgICAgICBtQWN0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgIEVkaXRhYmxlIGVkaXQgPSBtRWRpdFRleHQuZ2V0VGV4dCgpOworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKGVkaXQsIGVkaXQubGVuZ3RoKCkpOworICAgICAgICBtTWF0Y2hlcy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIG1NYXRjaGVzRm91bmQgPSBmYWxzZTsKKyAgICAgICAgbU1hdGNoZXMuc2V0VGV4dCgiMCIpOworICAgICAgICBtRWRpdFRleHQucmVxdWVzdEZvY3VzKCk7CisgICAgICAgIG1JbnB1dC5zaG93U29mdElucHV0KG1FZGl0VGV4dCwgMCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgIGlmIChtVGl0bGVCYXIgIT0gbnVsbCkgbVdlYlZpZXcuc2V0RW1iZWRkZWRUaXRsZUJhcihtVGl0bGVCYXIpOworICAgICAgICBtV2ViVmlldy5ub3RpZnlGaW5kRGlhbG9nRGlzbWlzc2VkKCk7CisgICAgICAgIG1JbnB1dC5oaWRlU29mdElucHV0RnJvbVdpbmRvdyhtV2ViVmlldy5nZXRXaW5kb3dUb2tlbigpLCAwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkFjdGlvbkl0ZW1DbGlja2VkKEFjdGlvbk1vZGUgbW9kZSwgTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBpZiAoIW1NYXRjaGVzRm91bmQpIHsKKyAgICAgICAgICAgIGZpbmRBbGwoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHN3aXRjaChpdGVtLmdldEl0ZW1JZCgpKSB7CisgICAgICAgICAgICBjYXNlIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuZmluZF9wcmV2OgorICAgICAgICAgICAgICAgIGZpbmROZXh0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5maW5kX25leHQ6CisgICAgICAgICAgICAgICAgZmluZE5leHQodHJ1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB1cGRhdGVNYXRjaGVzU3RyaW5nKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFRleHRXYXRjaGVyIGltcGxlbWVudGF0aW9uCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZnRlcikgeworICAgICAgICAvLyBEb2VzIG5vdGhpbmcuICBOZWVkZWQgdG8gaW1wbGVtZW50IFRleHRXYXRjaGVyLgorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmVmb3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KSB7CisgICAgICAgIGZpbmRBbGwoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZnRlclRleHRDaGFuZ2VkKEVkaXRhYmxlIHMpIHsKKyAgICAgICAgLy8gRG9lcyBub3RoaW5nLiAgTmVlZGVkIHRvIGltcGxlbWVudCBUZXh0V2F0Y2hlci4KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9HZW9sb2NhdGlvblNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9HZW9sb2NhdGlvblNlcnZpY2UuamF2YQppbmRleCAyNDMwNmY0Li45MWRlMWQ4IDEwMDc1NQotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvR2VvbG9jYXRpb25TZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0dlb2xvY2F0aW9uU2VydmljZS5qYXZhCkBAIC00NSwxNCArNDUsMTMgQEAKIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgZnJvbSB3aGljaCB3ZSBvYnRhaW4gdGhlIHN5c3RlbSBzZXJ2aWNlLgogICAgICAqIEBwYXJhbSBuYXRpdmVPYmplY3QgVGhlIG5hdGl2ZSBvYmplY3QgdG8gd2hpY2ggdGhpcyBvYmplY3Qgd2lsbCByZXBvcnQgcG9zaXRpb24gdXBkYXRlcyBhbmQKICAgICAgKiAgICAgZXJyb3JzLgogICAgICAqLwotICAgIHB1YmxpYyBHZW9sb2NhdGlvblNlcnZpY2UobG9uZyBuYXRpdmVPYmplY3QpIHsKKyAgICBwdWJsaWMgR2VvbG9jYXRpb25TZXJ2aWNlKENvbnRleHQgY29udGV4dCwgbG9uZyBuYXRpdmVPYmplY3QpIHsKICAgICAgICAgbU5hdGl2ZU9iamVjdCA9IG5hdGl2ZU9iamVjdDsKICAgICAgICAgLy8gUmVnaXN0ZXIgbmV3TG9jYXRpb25BdmFpbGFibGUgd2l0aCBwbGF0Zm9ybSBzZXJ2aWNlLgotICAgICAgICBBY3Rpdml0eVRocmVhZCB0aHJlYWQgPSBBY3Rpdml0eVRocmVhZC5zeXN0ZW1NYWluKCk7Ci0gICAgICAgIENvbnRleHQgY29udGV4dCA9IHRocmVhZC5nZXRBcHBsaWNhdGlvbigpOwogICAgICAgICBtTG9jYXRpb25NYW5hZ2VyID0gKExvY2F0aW9uTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTE9DQVRJT05fU0VSVklDRSk7CiAgICAgICAgIGlmIChtTG9jYXRpb25NYW5hZ2VyID09IG51bGwpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBnZXQgbG9jYXRpb24gbWFuYWdlci4iKTsKQEAgLTYyLDkgKzYxLDEwIEBACiAgICAgLyoqCiAgICAgICogU3RhcnQgbGlzdGVuaW5nIGZvciBsb2NhdGlvbiB1cGRhdGVzLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0KCkgewogICAgICAgICByZWdpc3RlckZvckxvY2F0aW9uVXBkYXRlcygpOwogICAgICAgICBtSXNSdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIG1Jc05ldHdvcmtQcm92aWRlckF2YWlsYWJsZSB8fCBtSXNHcHNQcm92aWRlckF2YWlsYWJsZTsKICAgICB9CiAKICAgICAvKioKQEAgLTg3LDYgKzg3LDggQEAKICAgICAgICAgICAgICAgICAvLyBvbmx5IHVucmVnaXN0ZXIgZnJvbSBhbGwsIHRoZW4gcmVyZWdpc3RlciB3aXRoIGFsbCBidXQgdGhlIEdQUy4KICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyRnJvbUxvY2F0aW9uVXBkYXRlcygpOwogICAgICAgICAgICAgICAgIHJlZ2lzdGVyRm9yTG9jYXRpb25VcGRhdGVzKCk7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgcHJvdmlkZXJzIGFyZSBzdGlsbCBhdmFpbGFibGUgYWZ0ZXIgd2UgcmUtcmVnaXN0ZXIuCisgICAgICAgICAgICAgICAgbWF5YmVSZXBvcnRFcnJvcigiVGhlIGxhc3QgbG9jYXRpb24gcHJvdmlkZXIgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTU2LDExICsxNTgsMTYgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJGb3JMb2NhdGlvblVwZGF0ZXMoKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLnJlcXVlc3RMb2NhdGlvblVwZGF0ZXMoTG9jYXRpb25NYW5hZ2VyLk5FVFdPUktfUFJPVklERVIsIDAsIDAsIHRoaXMpOwotICAgICAgICAgICAgbUlzTmV0d29ya1Byb3ZpZGVyQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIFJlZ2lzdHJhdGlvbiBtYXkgZmFpbCBpZiBwcm92aWRlcnMgYXJlIG5vdCBwcmVzZW50IG9uIHRoZSBkZXZpY2UuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcyhMb2NhdGlvbk1hbmFnZXIuTkVUV09SS19QUk9WSURFUiwgMCwgMCwgdGhpcyk7CisgICAgICAgICAgICAgICAgbUlzTmV0d29ya1Byb3ZpZGVyQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsgfQogICAgICAgICAgICAgaWYgKG1Jc0dwc0VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLnJlcXVlc3RMb2NhdGlvblVwZGF0ZXMoTG9jYXRpb25NYW5hZ2VyLkdQU19QUk9WSURFUiwgMCwgMCwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgbUlzR3BzUHJvdmlkZXJBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcyhMb2NhdGlvbk1hbmFnZXIuR1BTX1BST1ZJREVSLCAwLCAwLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgbUlzR3BzUHJvdmlkZXJBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgIkNhdWdodCBzZWN1cml0eSBleGNlcHRpb24gcmVnaXN0ZXJpbmcgZm9yIGxvY2F0aW9uIHVwZGF0ZXMgZnJvbSBzeXN0ZW0uICIgKwpAQCAtMTczLDYgKzE4MCw4IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHVucmVnaXN0ZXJGcm9tTG9jYXRpb25VcGRhdGVzKCkgewogICAgICAgICBtTG9jYXRpb25NYW5hZ2VyLnJlbW92ZVVwZGF0ZXModGhpcyk7CisgICAgICAgIG1Jc05ldHdvcmtQcm92aWRlckF2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICBtSXNHcHNQcm92aWRlckF2YWlsYWJsZSA9IGZhbHNlOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1QXVkaW8uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNUF1ZGlvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI5Mjg4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNUF1ZGlvLmphdmEKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uQnVmZmVyaW5nVXBkYXRlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllci5PbkNvbXBsZXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uRXJyb3JMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uUHJlcGFyZWRMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uU2Vla0NvbXBsZXRlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXI7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyVGFzazsKKworLyoqCisgKiA8cD5IVE1MNSBzdXBwb3J0IGNsYXNzIGZvciBBdWRpby4KKyAqLworY2xhc3MgSFRNTDVBdWRpbyBleHRlbmRzIEhhbmRsZXIKKyAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYVBsYXllci5PbkJ1ZmZlcmluZ1VwZGF0ZUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyLk9uQ29tcGxldGlvbkxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyLk9uRXJyb3JMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllci5PblByZXBhcmVkTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIuT25TZWVrQ29tcGxldGVMaXN0ZW5lciB7CisgICAgLy8gTG9nZ2luZyB0YWcuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJIVE1MNUF1ZGlvIjsKKworICAgIHByaXZhdGUgTWVkaWFQbGF5ZXIgbU1lZGlhUGxheWVyOworCisgICAgLy8gVGhlIEMrKyBNZWRpYVBsYXllclByaXZhdGVBbmRyb2lkIG9iamVjdC4KKyAgICBwcml2YXRlIGludCBtTmF0aXZlUG9pbnRlcjsKKworICAgIHByaXZhdGUgc3RhdGljIGludCBJRExFICAgICAgICA9ICAwOworICAgIHByaXZhdGUgc3RhdGljIGludCBJTklUSUFMSVpFRCA9ICAxOworICAgIHByaXZhdGUgc3RhdGljIGludCBQUkVQQVJFRCAgICA9ICAyOworICAgIHByaXZhdGUgc3RhdGljIGludCBTVEFSVEVEICAgICA9ICA0OworICAgIHByaXZhdGUgc3RhdGljIGludCBDT01QTEVURSAgICA9ICA1OworICAgIHByaXZhdGUgc3RhdGljIGludCBQQVVTRUQgICAgICA9ICA2OworICAgIHByaXZhdGUgc3RhdGljIGludCBTVE9QUEVEICAgICA9IC0yOworICAgIHByaXZhdGUgc3RhdGljIGludCBFUlJPUiAgICAgICA9IC0xOworCisgICAgcHJpdmF0ZSBpbnQgbVN0YXRlID0gSURMRTsKKworICAgIHByaXZhdGUgU3RyaW5nIG1Vcmw7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Bc2tUb1BsYXkgPSBmYWxzZTsKKworICAgIC8vIFRpbWVyIHRocmVhZCAtPiBVSSB0aHJlYWQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRVVQREFURSA9IDEwMDsKKworICAgIC8vIFRoZSBzcGVjIHNheXMgdGhlIHRpbWVyIHNob3VsZCBmaXJlIGV2ZXJ5IDI1MCBtcyBvciBsZXNzLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FVVBEQVRFX1BFUklPRCA9IDI1MDsgIC8vIG1zCisgICAgLy8gVGhlIHRpbWVyIGZvciB0aW1ldXBhdGUgZXZlbnRzLgorICAgIC8vIFNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNldmVudC1tZWRpYS10aW1ldXBkYXRlCisgICAgcHJpdmF0ZSBUaW1lciBtVGltZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBUaW1ldXBkYXRlVGFzayBleHRlbmRzIFRpbWVyVGFzayB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIEhUTUw1QXVkaW8udGhpcy5vYnRhaW5NZXNzYWdlKFRJTUVVUERBVEUpLnNlbmRUb1RhcmdldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICBjYXNlIFRJTUVVUERBVEU6IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlICE9IEVSUk9SICYmIG1NZWRpYVBsYXllci5pc1BsYXlpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gbU1lZGlhUGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlT25UaW1ldXBkYXRlKHBvc2l0aW9uLCBtTmF0aXZlUG9pbnRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBFUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBldmVudCBsaXN0ZW5lcnMgZm9yIE1lZGlhUGxheWVyCisgICAgLy8gVGhvc2UgYXJlIGNhbGxlZCBmcm9tIHRoZSBzYW1lIHRocmVhZCB3ZSBjcmVhdGVkIHRoZSBNZWRpYVBsYXllcgorICAgIC8vIChpLmUuIHRoZSB3ZWJ2aWV3Y29yZSB0aHJlYWQgaGVyZSkKKworICAgIC8vIE1lZGlhUGxheWVyLk9uQnVmZmVyaW5nVXBkYXRlTGlzdGVuZXIKKyAgICBwdWJsaWMgdm9pZCBvbkJ1ZmZlcmluZ1VwZGF0ZShNZWRpYVBsYXllciBtcCwgaW50IHBlcmNlbnQpIHsKKyAgICAgICAgbmF0aXZlT25CdWZmZXJpbmcocGVyY2VudCwgbU5hdGl2ZVBvaW50ZXIpOworICAgIH0KKworICAgIC8vIE1lZGlhUGxheWVyLk9uQ29tcGxldGlvbkxpc3RlbmVyOworICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGlvbihNZWRpYVBsYXllciBtcCkgeworICAgICAgICByZXNldE1lZGlhUGxheWVyKCk7CisgICAgICAgIG1TdGF0ZSA9IElETEU7CisgICAgICAgIG5hdGl2ZU9uRW5kZWQobU5hdGl2ZVBvaW50ZXIpOworICAgIH0KKworICAgIC8vIE1lZGlhUGxheWVyLk9uRXJyb3JMaXN0ZW5lcgorICAgIHB1YmxpYyBib29sZWFuIG9uRXJyb3IoTWVkaWFQbGF5ZXIgbXAsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgbVN0YXRlID0gRVJST1I7CisgICAgICAgIHJlc2V0TWVkaWFQbGF5ZXIoKTsKKyAgICAgICAgbVN0YXRlID0gSURMRTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE1lZGlhUGxheWVyLk9uUHJlcGFyZWRMaXN0ZW5lcgorICAgIHB1YmxpYyB2b2lkIG9uUHJlcGFyZWQoTWVkaWFQbGF5ZXIgbXApIHsKKyAgICAgICAgbVN0YXRlID0gUFJFUEFSRUQ7CisgICAgICAgIGlmIChtVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpbWVyLnNjaGVkdWxlKG5ldyBUaW1ldXBkYXRlVGFzaygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVVUERBVEVfUEVSSU9ELCBUSU1FVVBEQVRFX1BFUklPRCk7CisgICAgICAgIH0KKyAgICAgICAgbmF0aXZlT25QcmVwYXJlZChtcC5nZXREdXJhdGlvbigpLCAwLCAwLCBtTmF0aXZlUG9pbnRlcik7CisgICAgICAgIGlmIChtQXNrVG9QbGF5KSB7CisgICAgICAgICAgICBtQXNrVG9QbGF5ID0gZmFsc2U7CisgICAgICAgICAgICBwbGF5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBNZWRpYVBsYXllci5PblNlZWtDb21wbGV0ZUxpc3RlbmVyCisgICAgcHVibGljIHZvaWQgb25TZWVrQ29tcGxldGUoTWVkaWFQbGF5ZXIgbXApIHsKKyAgICAgICAgbmF0aXZlT25UaW1ldXBkYXRlKG1wLmdldEN1cnJlbnRQb3NpdGlvbigpLCBtTmF0aXZlUG9pbnRlcik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbmF0aXZlUHRyIGlzIHRoZSBDKysgcG9pbnRlciB0byB0aGUgTWVkaWFQbGF5ZXJQcml2YXRlIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSFRNTDVBdWRpbyhpbnQgbmF0aXZlUHRyKSB7CisgICAgICAgIC8vIFNhdmUgdGhlIG5hdGl2ZSBwdHIKKyAgICAgICAgbU5hdGl2ZVBvaW50ZXIgPSBuYXRpdmVQdHI7CisgICAgICAgIHJlc2V0TWVkaWFQbGF5ZXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRNZWRpYVBsYXllcigpIHsKKyAgICAgICAgaWYgKG1NZWRpYVBsYXllciA9PSBudWxsKSB7CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIgPSBuZXcgTWVkaWFQbGF5ZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5yZXNldCgpOworICAgICAgICB9CisgICAgICAgIG1NZWRpYVBsYXllci5zZXRPbkJ1ZmZlcmluZ1VwZGF0ZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0T25Db21wbGV0aW9uTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1NZWRpYVBsYXllci5zZXRPbkVycm9yTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1NZWRpYVBsYXllci5zZXRPblByZXBhcmVkTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1NZWRpYVBsYXllci5zZXRPblNlZWtDb21wbGV0ZUxpc3RlbmVyKHRoaXMpOworCisgICAgICAgIGlmIChtVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpbWVyLmNhbmNlbCgpOworICAgICAgICB9CisgICAgICAgIG1UaW1lciA9IG5ldyBUaW1lcigpOworICAgICAgICBtU3RhdGUgPSBJRExFOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXREYXRhU291cmNlKFN0cmluZyB1cmwpIHsKKyAgICAgICAgbVVybCA9IHVybDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gSURMRSkgeworICAgICAgICAgICAgICAgIHJlc2V0TWVkaWFQbGF5ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXREYXRhU291cmNlKHVybCk7CisgICAgICAgICAgICBtU3RhdGUgPSBJTklUSUFMSVpFRDsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5wcmVwYXJlQXN5bmMoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiY291bGRuJ3QgbG9hZCB0aGUgcmVzb3VyY2U6ICIgKyB1cmwgKyAiIGV4YzogIiArIGUpOworICAgICAgICAgICAgcmVzZXRNZWRpYVBsYXllcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBsYXkoKSB7CisgICAgICAgIGlmICgobVN0YXRlID09IEVSUk9SIHx8IG1TdGF0ZSA9PSBJRExFKSAmJiBtVXJsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc2V0TWVkaWFQbGF5ZXIoKTsKKyAgICAgICAgICAgIHNldERhdGFTb3VyY2UobVVybCk7CisgICAgICAgICAgICBtQXNrVG9QbGF5ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtU3RhdGUgPj0gUFJFUEFSRUQpIHsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5zdGFydCgpOworICAgICAgICAgICAgbVN0YXRlID0gU1RBUlRFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwYXVzZSgpIHsKKyAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFSVEVEKSB7CisgICAgICAgICAgICBpZiAobVRpbWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVGltZXIucHVyZ2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5wYXVzZSgpOworICAgICAgICAgICAgbVN0YXRlID0gUEFVU0VEOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlZWsoaW50IG1zZWMpIHsKKyAgICAgICAgaWYgKG1TdGF0ZSA+PSBQUkVQQVJFRCkgeworICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNlZWtUbyhtc2VjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZWFyZG93bigpIHsKKyAgICAgICAgbU1lZGlhUGxheWVyLnJlbGVhc2UoKTsKKyAgICAgICAgbVN0YXRlID0gRVJST1I7CisgICAgICAgIG1OYXRpdmVQb2ludGVyID0gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZsb2F0IGdldE1heFRpbWVTZWVrYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1NZWRpYVBsYXllci5nZXREdXJhdGlvbigpIC8gMTAwMC4wZjsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZU9uQnVmZmVyaW5nKGludCBwZXJjZW50LCBpbnQgbmF0aXZlUG9pbnRlcik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVPbkVuZGVkKGludCBuYXRpdmVQb2ludGVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZU9uUHJlcGFyZWQoaW50IGR1cmF0aW9uLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuYXRpdmVQb2ludGVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZU9uVGltZXVwZGF0ZShpbnQgcG9zaXRpb24sIGludCBuYXRpdmVQb2ludGVyKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IdHRwQXV0aEhhbmRsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IdHRwQXV0aEhhbmRsZXIuamF2YQppbmRleCBlZDg1ZGE2Li4xNzk3ZWI0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSHR0cEF1dGhIYW5kbGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0h0dHBBdXRoSGFuZGxlci5qYXZhCkBAIC0xNiwxNTEgKzE2LDE5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CiAKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogCiAvKioKLSAqIEhUVFAgYXV0aGVudGljYXRpb24gaGFuZGxlcjogbG9jYWwgaGFuZGxlciB0aGF0IHRha2VzIGNhcmUKLSAqIG9mIEhUVFAgYXV0aGVudGljYXRpb24gcmVxdWVzdHMuIFRoaXMgY2xhc3MgaXMgcGFzc2VkIGFzIGEKLSAqIHBhcmFtZXRlciB0byBCcm93c2VyQ2FsbGJhY2suZGlzcGxheUh0dHBBdXRoRGlhbG9nIGFuZCBpcwotICogbWVhbnQgdG8gcmVjZWl2ZSB0aGUgdXNlcidzIHJlc3BvbnNlLgorICogSFRUUCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IHRoYXQgbXVzdCBiZSBoYW5kbGVkIGJ5IHRoZSB1c2VyIGludGVyZmFjZS4KKyAqIFdlYlZpZXcgY3JlYXRlcyB0aGUgb2JqZWN0IGFuZCBoYW5kcyBpdCB0byB0aGUgY3VycmVudCB7QGxpbmsgV2ViVmlld0NsaWVudH0sCisgKiB3aGljaCBtdXN0IGNhbGwgZWl0aGVyIHtAbGluayAjcHJvY2VlZChTdHJpbmcsIFN0cmluZyl9IG9yIHtAbGluayAjY2FuY2VsKCl9LgogICovCiBwdWJsaWMgY2xhc3MgSHR0cEF1dGhIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgLyogSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIGhhbmRsZXIgaXMgaW4gTmV0d29yaywgYmVjYXVzZQotICAgICAqIHdlIHdhbnQgdG8gc2hhcmUgaXQgYWNjcm9zcyBtdWx0aXBsZSBsb2FkZXJzIGFuZCB3aW5kb3dzCi0gICAgICogKGxpa2Ugb3VyIHN1YndpbmRvdyBhbmQgdGhlIG1haW4gd2luZG93KS4KLSAgICAgKi8KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dUQUcgPSAibmV0d29yayI7CiAKICAgICAvKioKLSAgICAgKiBOZXR3b3JrLgorICAgICAqIFBhY2thZ2UtcHJpdmF0ZSBjb25zdHJ1Y3RvciBuZWVkZWQgZm9yIEFQSSBjb21wYXRpYmlsaXR5LgogICAgICAqLwotICAgIHByaXZhdGUgTmV0d29yayBtTmV0d29yazsKLQotICAgIC8qKgotICAgICAqIExvYWRlciBxdWV1ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIExpbmtlZExpc3Q8TG9hZExpc3RlbmVyPiBtTG9hZGVyUXVldWU7Ci0KLQotICAgIC8vIE1lc3NhZ2UgaWQgZm9yIGhhbmRsaW5nIHRoZSB1c2VyIHJlc3BvbnNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFVVEhfUFJPQ0VFRCA9IDEwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVVUSF9DQU5DRUwgPSAyMDA7Ci0KLSAgICAvLyBVc2UgdG8gc3luY2hyb25pemUgd2hlbiBtYWtpbmcgc3luY2hyb25vdXMgY2FsbHMgdG8KLSAgICAvLyBvblJlY2VpdmVkSHR0cEF1dGhSZXF1ZXN0KCkuIFdlIGNhbid0IHVzZSBhIHNpbmdsZSBCb29sZWFuIG9iamVjdCBmb3IKLSAgICAvLyBib3RoIHRoZSBsb2NrIGFuZCB0aGUgc3RhdGUsIGJlY2F1c2UgQm9vbGVhbiBpcyBpbW11dGFibGUuCi0gICAgT2JqZWN0IG1SZXF1ZXN0SW5GbGlnaHRMb2NrID0gbmV3IE9iamVjdCgpOwotICAgIGJvb2xlYW4gbVJlcXVlc3RJbkZsaWdodDsKLSAgICBTdHJpbmcgbVVzZXJuYW1lOwotICAgIFN0cmluZyBtUGFzc3dvcmQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEhUVFAgYXV0aGVudGljYXRpb24gaGFuZGxlciB3aXRoIGFuIGVtcHR5Ci0gICAgICogbG9hZGVyIHF1ZXVlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV0d29yayBUaGUgcGFyZW50IG5ldHdvcmsgb2JqZWN0Ci0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBIdHRwQXV0aEhhbmRsZXIoTmV0d29yayBuZXR3b3JrKSB7Ci0gICAgICAgIG1OZXR3b3JrID0gbmV0d29yazsKLSAgICAgICAgbUxvYWRlclF1ZXVlID0gbmV3IExpbmtlZExpc3Q8TG9hZExpc3RlbmVyPigpOwotICAgIH0KLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICBMb2FkTGlzdGVuZXIgbG9hZGVyID0gbnVsbDsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9hZGVyUXVldWUpIHsKLSAgICAgICAgICAgIGxvYWRlciA9IG1Mb2FkZXJRdWV1ZS5wb2xsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0KGxvYWRlci5pc1N5bmNocm9ub3VzKCkgPT0gZmFsc2UpOwotCi0gICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgIGNhc2UgQVVUSF9QUk9DRUVEOgotICAgICAgICAgICAgICAgIFN0cmluZyB1c2VybmFtZSA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJ1c2VybmFtZSIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJwYXNzd29yZCIpOwotCi0gICAgICAgICAgICAgICAgbG9hZGVyLmhhbmRsZUF1dGhSZXNwb25zZSh1c2VybmFtZSwgcGFzc3dvcmQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEFVVEhfQ0FOQ0VMOgotICAgICAgICAgICAgICAgIGxvYWRlci5oYW5kbGVBdXRoUmVzcG9uc2UobnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm9jZXNzTmV4dExvYWRlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdXNlZCB0byB1bmJsb2NrIGhhbmRsZUF1dGhSZXF1ZXN0KCksIHdoaWNoIGluIHRoZSBjYXNlIG9mIGEKLSAgICAgKiBzeW5jaHJvbm91cyByZXF1ZXN0IHdpbGwgd2FpdCBmb3IgcHJveHkub25SZWNlaXZlZEh0dHBBdXRoUmVxdWVzdCgpIHRvCi0gICAgICogY2FsbCBiYWNrIHRvIGVpdGhlciBwcm9jZWVkKCkgb3IgY2FuY2VsKCkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVGhlIHVzZXJuYW1lIHRvIHVzZSBmb3IgYXV0aGVudGljYXRpb24KLSAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIHVzZSBmb3IgYXV0aGVudGljYXRpb24KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJlcXVlc3QgaXMgc3luY2hyb25vdXMgYW5kIGhhbmRsZUF1dGhSZXF1ZXN0KCkgaGFzCi0gICAgICogYmVlbiB1bmJsb2NrZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlUmVzcG9uc2VGb3JTeW5jaHJvbm91c1JlcXVlc3QoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgTG9hZExpc3RlbmVyIGxvYWRlciA9IG51bGw7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvYWRlclF1ZXVlKSB7Ci0gICAgICAgICAgICBsb2FkZXIgPSBtTG9hZGVyUXVldWUucGVlaygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2FkZXIuaXNTeW5jaHJvbm91cygpKSB7Ci0gICAgICAgICAgICBtVXNlcm5hbWUgPSB1c2VybmFtZTsKLSAgICAgICAgICAgIG1QYXNzd29yZCA9IHBhc3N3b3JkOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzaWduYWxSZXF1ZXN0Q29tcGxldGUoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVJlcXVlc3RJbkZsaWdodExvY2spIHsKLSAgICAgICAgICAgIGFzc2VydChtUmVxdWVzdEluRmxpZ2h0KTsKLSAgICAgICAgICAgIG1SZXF1ZXN0SW5GbGlnaHQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1SZXF1ZXN0SW5GbGlnaHRMb2NrLm5vdGlmeSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VlZCB3aXRoIHRoZSBhdXRob3JpemF0aW9uIHdpdGggdGhlIGdpdmVuIGNyZWRlbnRpYWxzCi0gICAgICoKLSAgICAgKiBNYXkgYmUgY2FsbGVkIG9uIHRoZSBVSSB0aHJlYWQsIHJhdGhlciB0aGFuIHRoZSBXZWJDb3JlIHRocmVhZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1c2VybmFtZSBUaGUgdXNlcm5hbWUgdG8gdXNlIGZvciBhdXRoZW50aWNhdGlvbgotICAgICAqIEBwYXJhbSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gdXNlIGZvciBhdXRoZW50aWNhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb2NlZWQoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgaWYgKGhhbmRsZVJlc3BvbnNlRm9yU3luY2hyb25vdXNSZXF1ZXN0KHVzZXJuYW1lLCBwYXNzd29yZCkpIHsKLSAgICAgICAgICAgIHNpZ25hbFJlcXVlc3RDb21wbGV0ZSgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gb2J0YWluTWVzc2FnZShBVVRIX1BST0NFRUQpOwotICAgICAgICBtc2cuZ2V0RGF0YSgpLnB1dFN0cmluZygidXNlcm5hbWUiLCB1c2VybmFtZSk7Ci0gICAgICAgIG1zZy5nZXREYXRhKCkucHV0U3RyaW5nKCJwYXNzd29yZCIsIHBhc3N3b3JkKTsKLSAgICAgICAgc2VuZE1lc3NhZ2UobXNnKTsKLSAgICAgICAgc2lnbmFsUmVxdWVzdENvbXBsZXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FuY2VsIHRoZSBhdXRob3JpemF0aW9uIHJlcXVlc3QKLSAgICAgKgotICAgICAqIE1heSBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZCwgcmF0aGVyIHRoYW4gdGhlIFdlYkNvcmUgdGhyZWFkLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2FuY2VsKCkgewotICAgICAgICBpZiAoaGFuZGxlUmVzcG9uc2VGb3JTeW5jaHJvbm91c1JlcXVlc3QobnVsbCwgbnVsbCkpIHsKLSAgICAgICAgICAgIHNpZ25hbFJlcXVlc3RDb21wbGV0ZSgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQVVUSF9DQU5DRUwpKTsKLSAgICAgICAgc2lnbmFsUmVxdWVzdENvbXBsZXRlKCk7CisgICAgSHR0cEF1dGhIYW5kbGVyKCkgewogICAgIH0KIAogICAgIC8qKgpAQCAtMTY4LDExMyArMzYsMTggQEAKICAgICAgKiAoaWUsIGlmIHdlIGRpZCBub3QgZmFpbCB0cnlpbmcgdG8gdXNlIHRoZW0gbGFzdCB0aW1lKQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHVzZUh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZCgpIHsKLSAgICAgICAgTG9hZExpc3RlbmVyIGxvYWRlciA9IG51bGw7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvYWRlclF1ZXVlKSB7Ci0gICAgICAgICAgICBsb2FkZXIgPSBtTG9hZGVyUXVldWUucGVlaygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICFsb2FkZXIuYXV0aENyZWRlbnRpYWxzSW52YWxpZCgpOwotICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEVucXVldWVzIHRoZSBsb2FkZXIsIGlmIHRoZSBsb2FkZXIgaXMgdGhlIG9ubHkgZWxlbWVudAotICAgICAqIGluIHRoZSBxdWV1ZSwgc3RhcnRzIHByb2Nlc3NpbmcgdGhlIGxvYWRlcgotICAgICAqCi0gICAgICogQHBhcmFtIGxvYWRlciBUaGUgbG9hZGVyIHRoYXQgcmVzdWx0ZWQgaW4gdGhpcyBodHRwCi0gICAgICogYXV0aGVudGljYXRpb24gcmVxdWVzdAorICAgICAqIENhbmNlbCB0aGUgYXV0aG9yaXphdGlvbiByZXF1ZXN0LgogICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBoYW5kbGVBdXRoUmVxdWVzdChMb2FkTGlzdGVuZXIgbG9hZGVyKSB7Ci0gICAgICAgIC8vIFRoZSBjYWxsIHRvIHByb3h5Lm9uUmVjZWl2ZWRIdHRwQXV0aFJlcXVlc3QoKSBtYXkgYmUgYXN5bmNocm9ub3VzLiBJZgotICAgICAgICAvLyB0aGUgcmVxdWVzdCBpcyBzeW5jaHJvbm91cywgd2UgbXVzdCBibG9jayBoZXJlIHVudGlsIHdlIGhhdmUgYQotICAgICAgICAvLyByZXNwb25zZS4KLSAgICAgICAgaWYgKGxvYWRlci5pc1N5bmNocm9ub3VzKCkpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYSByZXF1ZXN0IGluIGZsaWdodCwgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuIFRoZQotICAgICAgICAgICAgLy8gcmVzcG9uc2Ugd2lsbCBxdWV1ZSBhIG1lc3NhZ2Ugb24gdGhpcyB0aHJlYWQuCi0gICAgICAgICAgICB3YWl0Rm9yUmVxdWVzdFRvQ29tcGxldGUoKTsKLSAgICAgICAgICAgIC8vIE1ha2UgYSByZXF1ZXN0IHRvIHRoZSBwcm94eSBmb3IgdGhpcyByZXF1ZXN0LCBqdW1waW5nIHRoZSBxdWV1ZS4KLSAgICAgICAgICAgIC8vIFdlIHVzZSB0aGUgcXVldWUgc28gdGhhdCB0aGUgbG9hZGVyIGlzIHByZXNlbnQgaW4KLSAgICAgICAgICAgIC8vIHVzZUh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZCgpLgotICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9hZGVyUXVldWUpIHsKLSAgICAgICAgICAgICAgICBtTG9hZGVyUXVldWUuYWRkRmlyc3QobG9hZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb2Nlc3NOZXh0TG9hZGVyKCk7Ci0gICAgICAgICAgICAvLyBXYWl0IGZvciB0aGlzIHJlcXVlc3QgdG8gY29tcGxldGUuCi0gICAgICAgICAgICB3YWl0Rm9yUmVxdWVzdFRvQ29tcGxldGUoKTsKLSAgICAgICAgICAgIC8vIFBvcCB0aGUgbG9hZGVyIGZyb20gdGhlIHF1ZXVlLgotICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9hZGVyUXVldWUpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnQobUxvYWRlclF1ZXVlLnBlZWsoKSA9PSBsb2FkZXIpOwotICAgICAgICAgICAgICAgIG1Mb2FkZXJRdWV1ZS5wb2xsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBDYWxsIGJhY2suCi0gICAgICAgICAgICBsb2FkZXIuaGFuZGxlQXV0aFJlc3BvbnNlKG1Vc2VybmFtZSwgbVBhc3N3b3JkKTsKLSAgICAgICAgICAgIC8vIFRoZSBtZXNzYWdlIHF1ZXVlZCBieSB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgbGFzdCBhc3luY2hyb25vdXMKLSAgICAgICAgICAgIC8vIHJlcXVlc3QsIGlmIHByZXNlbnQsIHdpbGwgc3RhcnQgdGhlIG5leHQgcmVxdWVzdC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gcHJvY2Vzc05leHQgPSBmYWxzZTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2FkZXJRdWV1ZSkgewotICAgICAgICAgICAgbUxvYWRlclF1ZXVlLm9mZmVyKGxvYWRlcik7Ci0gICAgICAgICAgICBwcm9jZXNzTmV4dCA9Ci0gICAgICAgICAgICAgICAgKG1Mb2FkZXJRdWV1ZS5zaXplKCkgPT0gMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvY2Vzc05leHQpIHsKLSAgICAgICAgICAgIHByb2Nlc3NOZXh0TG9hZGVyKCk7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV2FpdCBmb3IgdGhlIHJlcXVlc3QgaW4gZmxpZ2h0LCBpZiBhbnksIHRvIGNvbXBsZXRlCisgICAgICogUHJvY2VlZCB3aXRoIHRoZSBhdXRob3JpemF0aW9uIHdpdGggdGhlIGdpdmVuIGNyZWRlbnRpYWxzLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yUmVxdWVzdFRvQ29tcGxldGUoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVJlcXVlc3RJbkZsaWdodExvY2spIHsKLSAgICAgICAgICAgIHdoaWxlIChtUmVxdWVzdEluRmxpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbVJlcXVlc3RJbkZsaWdodExvY2sud2FpdCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJJbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIGZvciByZXF1ZXN0IHRvIGNvbXBsZXRlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyB0aGUgbmV4dCBsb2FkZXIgaW4gdGhlIHF1ZXVlIChoZWxwZXIgbWV0aG9kKQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTmV4dExvYWRlcigpIHsKLSAgICAgICAgTG9hZExpc3RlbmVyIGxvYWRlciA9IG51bGw7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvYWRlclF1ZXVlKSB7Ci0gICAgICAgICAgICBsb2FkZXIgPSBtTG9hZGVyUXVldWUucGVlaygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtUmVxdWVzdEluRmxpZ2h0TG9jaykgewotICAgICAgICAgICAgICAgIGFzc2VydChtUmVxdWVzdEluRmxpZ2h0ID09IGZhbHNlKTsKLSAgICAgICAgICAgICAgICBtUmVxdWVzdEluRmxpZ2h0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ2FsbGJhY2tQcm94eSBwcm94eSA9IGxvYWRlci5nZXRGcmFtZSgpLmdldENhbGxiYWNrUHJveHkoKTsKLQotICAgICAgICAgICAgU3RyaW5nIGhvc3RuYW1lID0gbG9hZGVyLnByb3h5QXV0aGVudGljYXRlKCkgPwotICAgICAgICAgICAgICAgIG1OZXR3b3JrLmdldFByb3h5SG9zdG5hbWUoKSA6IGxvYWRlci5ob3N0KCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyByZWFsbSA9IGxvYWRlci5yZWFsbSgpOwotCi0gICAgICAgICAgICBwcm94eS5vblJlY2VpdmVkSHR0cEF1dGhSZXF1ZXN0KHRoaXMsIGhvc3RuYW1lLCByZWFsbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmZvcm1zIHRoZSBXZWJWaWV3IG9mIGEgbmV3IHNldCBvZiBjcmVkZW50aWFscy4KLSAgICAgKiBAaGlkZSBQZW5kaW5nIEFQSSBjb3VuY2lsIHJldmlldwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBvblJlY2VpdmVkQ3JlZGVudGlhbHMoTG9hZExpc3RlbmVyIGxvYWRlciwKLSAgICAgICAgICAgIFN0cmluZyBob3N0LCBTdHJpbmcgcmVhbG0sIFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgIENhbGxiYWNrUHJveHkgcHJveHkgPSBsb2FkZXIuZ2V0RnJhbWUoKS5nZXRDYWxsYmFja1Byb3h5KCk7Ci0gICAgICAgIHByb3h5Lm9uUmVjZWl2ZWRIdHRwQXV0aENyZWRlbnRpYWxzKGhvc3QsIHJlYWxtLCB1c2VybmFtZSwgcGFzc3dvcmQpOworICAgIHB1YmxpYyB2b2lkIHByb2NlZWQoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSHR0cEF1dGhIYW5kbGVySW1wbC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0h0dHBBdXRoSGFuZGxlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzA1MTI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0h0dHBBdXRoSGFuZGxlckltcGwuamF2YQpAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworCisvKioKKyAqIEh0dHBBdXRoSGFuZGxlciBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIG9ubHkgYnkgdGhlIEFuZHJvaWQgSmF2YSBIVFRQIHN0YWNrLgorICogPHA+CisgKiBUaGlzIGNsYXNzIGlzIG5vdCBuZWVkZWQgd2hlbiB3ZSdyZSB1c2luZyB0aGUgQ2hyb21pdW0gSFRUUCBzdGFjay4KKyAqLworY2xhc3MgSHR0cEF1dGhIYW5kbGVySW1wbCBleHRlbmRzIEh0dHBBdXRoSGFuZGxlciB7CisgICAgLyoKKyAgICAgKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgaGFuZGxlciBpcyBpbiBOZXR3b3JrLCBiZWNhdXNlIHdlIHdhbnQgdG8gc2hhcmUKKyAgICAgKiBpdCBhY2Nyb3NzIG11bHRpcGxlIGxvYWRlcnMgYW5kIHdpbmRvd3MgKGxpa2Ugb3VyIHN1YndpbmRvdyBhbmQgdGhlIG1haW4KKyAgICAgKiB3aW5kb3cpLgorICAgICAqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJuZXR3b3JrIjsKKworICAgIC8qKgorICAgICAqIE5ldHdvcmsuCisgICAgICovCisgICAgcHJpdmF0ZSBOZXR3b3JrIG1OZXR3b3JrOworCisgICAgLyoqCisgICAgICogTG9hZGVyIHF1ZXVlLgorICAgICAqLworICAgIHByaXZhdGUgTGlua2VkTGlzdDxMb2FkTGlzdGVuZXI+IG1Mb2FkZXJRdWV1ZTsKKworCisgICAgLy8gTWVzc2FnZSBpZCBmb3IgaGFuZGxpbmcgdGhlIHVzZXIgcmVzcG9uc2UKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVVUSF9QUk9DRUVEID0gMTAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBVVRIX0NBTkNFTCA9IDIwMDsKKworICAgIC8vIFVzZSB0byBzeW5jaHJvbml6ZSB3aGVuIG1ha2luZyBzeW5jaHJvbm91cyBjYWxscyB0bworICAgIC8vIG9uUmVjZWl2ZWRIdHRwQXV0aFJlcXVlc3QoKS4gV2UgY2FuJ3QgdXNlIGEgc2luZ2xlIEJvb2xlYW4gb2JqZWN0IGZvcgorICAgIC8vIGJvdGggdGhlIGxvY2sgYW5kIHRoZSBzdGF0ZSwgYmVjYXVzZSBCb29sZWFuIGlzIGltbXV0YWJsZS4KKyAgICBPYmplY3QgbVJlcXVlc3RJbkZsaWdodExvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgYm9vbGVhbiBtUmVxdWVzdEluRmxpZ2h0OworICAgIFN0cmluZyBtVXNlcm5hbWU7CisgICAgU3RyaW5nIG1QYXNzd29yZDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgSFRUUCBhdXRoZW50aWNhdGlvbiBoYW5kbGVyIHdpdGggYW4gZW1wdHkKKyAgICAgKiBsb2FkZXIgcXVldWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXR3b3JrIFRoZSBwYXJlbnQgbmV0d29yayBvYmplY3QKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIEh0dHBBdXRoSGFuZGxlckltcGwoTmV0d29yayBuZXR3b3JrKSB7CisgICAgICAgIG1OZXR3b3JrID0gbmV0d29yazsKKyAgICAgICAgbUxvYWRlclF1ZXVlID0gbmV3IExpbmtlZExpc3Q8TG9hZExpc3RlbmVyPigpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICBMb2FkTGlzdGVuZXIgbG9hZGVyID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9hZGVyUXVldWUpIHsKKyAgICAgICAgICAgIGxvYWRlciA9IG1Mb2FkZXJRdWV1ZS5wb2xsKCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KGxvYWRlci5pc1N5bmNocm9ub3VzKCkgPT0gZmFsc2UpOworCisgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgIGNhc2UgQVVUSF9QUk9DRUVEOgorICAgICAgICAgICAgICAgIFN0cmluZyB1c2VybmFtZSA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJ1c2VybmFtZSIpOworICAgICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJwYXNzd29yZCIpOworCisgICAgICAgICAgICAgICAgbG9hZGVyLmhhbmRsZUF1dGhSZXNwb25zZSh1c2VybmFtZSwgcGFzc3dvcmQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFVVEhfQ0FOQ0VMOgorICAgICAgICAgICAgICAgIGxvYWRlci5oYW5kbGVBdXRoUmVzcG9uc2UobnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBwcm9jZXNzTmV4dExvYWRlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdXNlZCB0byB1bmJsb2NrIGhhbmRsZUF1dGhSZXF1ZXN0KCksIHdoaWNoIGluIHRoZSBjYXNlIG9mIGEKKyAgICAgKiBzeW5jaHJvbm91cyByZXF1ZXN0IHdpbGwgd2FpdCBmb3IgcHJveHkub25SZWNlaXZlZEh0dHBBdXRoUmVxdWVzdCgpIHRvCisgICAgICogY2FsbCBiYWNrIHRvIGVpdGhlciBwcm9jZWVkKCkgb3IgY2FuY2VsKCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVGhlIHVzZXJuYW1lIHRvIHVzZSBmb3IgYXV0aGVudGljYXRpb24KKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIHVzZSBmb3IgYXV0aGVudGljYXRpb24KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJlcXVlc3QgaXMgc3luY2hyb25vdXMgYW5kIGhhbmRsZUF1dGhSZXF1ZXN0KCkgaGFzCisgICAgICogYmVlbiB1bmJsb2NrZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlUmVzcG9uc2VGb3JTeW5jaHJvbm91c1JlcXVlc3QoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgTG9hZExpc3RlbmVyIGxvYWRlciA9IG51bGw7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvYWRlclF1ZXVlKSB7CisgICAgICAgICAgICBsb2FkZXIgPSBtTG9hZGVyUXVldWUucGVlaygpOworICAgICAgICB9CisgICAgICAgIGlmIChsb2FkZXIuaXNTeW5jaHJvbm91cygpKSB7CisgICAgICAgICAgICBtVXNlcm5hbWUgPSB1c2VybmFtZTsKKyAgICAgICAgICAgIG1QYXNzd29yZCA9IHBhc3N3b3JkOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzaWduYWxSZXF1ZXN0Q29tcGxldGUoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobVJlcXVlc3RJbkZsaWdodExvY2spIHsKKyAgICAgICAgICAgIGFzc2VydChtUmVxdWVzdEluRmxpZ2h0KTsKKyAgICAgICAgICAgIG1SZXF1ZXN0SW5GbGlnaHQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1SZXF1ZXN0SW5GbGlnaHRMb2NrLm5vdGlmeSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2VlZCB3aXRoIHRoZSBhdXRob3JpemF0aW9uIHdpdGggdGhlIGdpdmVuIGNyZWRlbnRpYWxzCisgICAgICoKKyAgICAgKiBNYXkgYmUgY2FsbGVkIG9uIHRoZSBVSSB0aHJlYWQsIHJhdGhlciB0aGFuIHRoZSBXZWJDb3JlIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBUaGUgdXNlcm5hbWUgdG8gdXNlIGZvciBhdXRoZW50aWNhdGlvbgorICAgICAqIEBwYXJhbSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gdXNlIGZvciBhdXRoZW50aWNhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByb2NlZWQoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgaWYgKGhhbmRsZVJlc3BvbnNlRm9yU3luY2hyb25vdXNSZXF1ZXN0KHVzZXJuYW1lLCBwYXNzd29yZCkpIHsKKyAgICAgICAgICAgIHNpZ25hbFJlcXVlc3RDb21wbGV0ZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2UgbXNnID0gb2J0YWluTWVzc2FnZShBVVRIX1BST0NFRUQpOworICAgICAgICBtc2cuZ2V0RGF0YSgpLnB1dFN0cmluZygidXNlcm5hbWUiLCB1c2VybmFtZSk7CisgICAgICAgIG1zZy5nZXREYXRhKCkucHV0U3RyaW5nKCJwYXNzd29yZCIsIHBhc3N3b3JkKTsKKyAgICAgICAgc2VuZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgc2lnbmFsUmVxdWVzdENvbXBsZXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuY2VsIHRoZSBhdXRob3JpemF0aW9uIHJlcXVlc3QKKyAgICAgKgorICAgICAqIE1heSBiZSBjYWxsZWQgb24gdGhlIFVJIHRocmVhZCwgcmF0aGVyIHRoYW4gdGhlIFdlYkNvcmUgdGhyZWFkLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2FuY2VsKCkgeworICAgICAgICBpZiAoaGFuZGxlUmVzcG9uc2VGb3JTeW5jaHJvbm91c1JlcXVlc3QobnVsbCwgbnVsbCkpIHsKKyAgICAgICAgICAgIHNpZ25hbFJlcXVlc3RDb21wbGV0ZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQVVUSF9DQU5DRUwpKTsKKyAgICAgICAgc2lnbmFsUmVxdWVzdENvbXBsZXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUcnVlIGlmIHdlIGNhbiB1c2UgdXNlciBjcmVkZW50aWFscyBvbiByZWNvcmQKKyAgICAgKiAoaWUsIGlmIHdlIGRpZCBub3QgZmFpbCB0cnlpbmcgdG8gdXNlIHRoZW0gbGFzdCB0aW1lKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHVzZUh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZCgpIHsKKyAgICAgICAgTG9hZExpc3RlbmVyIGxvYWRlciA9IG51bGw7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvYWRlclF1ZXVlKSB7CisgICAgICAgICAgICBsb2FkZXIgPSBtTG9hZGVyUXVldWUucGVlaygpOworICAgICAgICB9CisgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuICFsb2FkZXIuYXV0aENyZWRlbnRpYWxzSW52YWxpZCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVucXVldWVzIHRoZSBsb2FkZXIsIGlmIHRoZSBsb2FkZXIgaXMgdGhlIG9ubHkgZWxlbWVudAorICAgICAqIGluIHRoZSBxdWV1ZSwgc3RhcnRzIHByb2Nlc3NpbmcgdGhlIGxvYWRlcgorICAgICAqCisgICAgICogQHBhcmFtIGxvYWRlciBUaGUgbG9hZGVyIHRoYXQgcmVzdWx0ZWQgaW4gdGhpcyBodHRwCisgICAgICogYXV0aGVudGljYXRpb24gcmVxdWVzdAorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBoYW5kbGVBdXRoUmVxdWVzdChMb2FkTGlzdGVuZXIgbG9hZGVyKSB7CisgICAgICAgIC8vIFRoZSBjYWxsIHRvIHByb3h5Lm9uUmVjZWl2ZWRIdHRwQXV0aFJlcXVlc3QoKSBtYXkgYmUgYXN5bmNocm9ub3VzLiBJZgorICAgICAgICAvLyB0aGUgcmVxdWVzdCBpcyBzeW5jaHJvbm91cywgd2UgbXVzdCBibG9jayBoZXJlIHVudGlsIHdlIGhhdmUgYQorICAgICAgICAvLyByZXNwb25zZS4KKyAgICAgICAgaWYgKGxvYWRlci5pc1N5bmNocm9ub3VzKCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYSByZXF1ZXN0IGluIGZsaWdodCwgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuIFRoZQorICAgICAgICAgICAgLy8gcmVzcG9uc2Ugd2lsbCBxdWV1ZSBhIG1lc3NhZ2Ugb24gdGhpcyB0aHJlYWQuCisgICAgICAgICAgICB3YWl0Rm9yUmVxdWVzdFRvQ29tcGxldGUoKTsKKyAgICAgICAgICAgIC8vIE1ha2UgYSByZXF1ZXN0IHRvIHRoZSBwcm94eSBmb3IgdGhpcyByZXF1ZXN0LCBqdW1waW5nIHRoZSBxdWV1ZS4KKyAgICAgICAgICAgIC8vIFdlIHVzZSB0aGUgcXVldWUgc28gdGhhdCB0aGUgbG9hZGVyIGlzIHByZXNlbnQgaW4KKyAgICAgICAgICAgIC8vIHVzZUh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZCgpLgorICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9hZGVyUXVldWUpIHsKKyAgICAgICAgICAgICAgICBtTG9hZGVyUXVldWUuYWRkRmlyc3QobG9hZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2Nlc3NOZXh0TG9hZGVyKCk7CisgICAgICAgICAgICAvLyBXYWl0IGZvciB0aGlzIHJlcXVlc3QgdG8gY29tcGxldGUuCisgICAgICAgICAgICB3YWl0Rm9yUmVxdWVzdFRvQ29tcGxldGUoKTsKKyAgICAgICAgICAgIC8vIFBvcCB0aGUgbG9hZGVyIGZyb20gdGhlIHF1ZXVlLgorICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9hZGVyUXVldWUpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQobUxvYWRlclF1ZXVlLnBlZWsoKSA9PSBsb2FkZXIpOworICAgICAgICAgICAgICAgIG1Mb2FkZXJRdWV1ZS5wb2xsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBDYWxsIGJhY2suCisgICAgICAgICAgICBsb2FkZXIuaGFuZGxlQXV0aFJlc3BvbnNlKG1Vc2VybmFtZSwgbVBhc3N3b3JkKTsKKyAgICAgICAgICAgIC8vIFRoZSBtZXNzYWdlIHF1ZXVlZCBieSB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgbGFzdCBhc3luY2hyb25vdXMKKyAgICAgICAgICAgIC8vIHJlcXVlc3QsIGlmIHByZXNlbnQsIHdpbGwgc3RhcnQgdGhlIG5leHQgcmVxdWVzdC4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gcHJvY2Vzc05leHQgPSBmYWxzZTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2FkZXJRdWV1ZSkgeworICAgICAgICAgICAgbUxvYWRlclF1ZXVlLm9mZmVyKGxvYWRlcik7CisgICAgICAgICAgICBwcm9jZXNzTmV4dCA9CisgICAgICAgICAgICAgICAgKG1Mb2FkZXJRdWV1ZS5zaXplKCkgPT0gMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvY2Vzc05leHQpIHsKKyAgICAgICAgICAgIHByb2Nlc3NOZXh0TG9hZGVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWl0IGZvciB0aGUgcmVxdWVzdCBpbiBmbGlnaHQsIGlmIGFueSwgdG8gY29tcGxldGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvclJlcXVlc3RUb0NvbXBsZXRlKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZXF1ZXN0SW5GbGlnaHRMb2NrKSB7CisgICAgICAgICAgICB3aGlsZSAobVJlcXVlc3RJbkZsaWdodCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1SZXF1ZXN0SW5GbGlnaHRMb2NrLndhaXQoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiSW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyBmb3IgcmVxdWVzdCB0byBjb21wbGV0ZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIG5leHQgbG9hZGVyIGluIHRoZSBxdWV1ZSAoaGVscGVyIG1ldGhvZCkKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc05leHRMb2FkZXIoKSB7CisgICAgICAgIExvYWRMaXN0ZW5lciBsb2FkZXIgPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2FkZXJRdWV1ZSkgeworICAgICAgICAgICAgbG9hZGVyID0gbUxvYWRlclF1ZXVlLnBlZWsoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVJlcXVlc3RJbkZsaWdodExvY2spIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQobVJlcXVlc3RJbkZsaWdodCA9PSBmYWxzZSk7CisgICAgICAgICAgICAgICAgbVJlcXVlc3RJbkZsaWdodCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENhbGxiYWNrUHJveHkgcHJveHkgPSBsb2FkZXIuZ2V0RnJhbWUoKS5nZXRDYWxsYmFja1Byb3h5KCk7CisKKyAgICAgICAgICAgIFN0cmluZyBob3N0bmFtZSA9IGxvYWRlci5wcm94eUF1dGhlbnRpY2F0ZSgpID8KKyAgICAgICAgICAgICAgICBtTmV0d29yay5nZXRQcm94eUhvc3RuYW1lKCkgOiBsb2FkZXIuaG9zdCgpOworCisgICAgICAgICAgICBTdHJpbmcgcmVhbG0gPSBsb2FkZXIucmVhbG0oKTsKKworICAgICAgICAgICAgcHJveHkub25SZWNlaXZlZEh0dHBBdXRoUmVxdWVzdCh0aGlzLCBob3N0bmFtZSwgcmVhbG0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5mb3JtcyB0aGUgV2ViVmlldyBvZiBhIG5ldyBzZXQgb2YgY3JlZGVudGlhbHMuCisgICAgICogQGhpZGUgUGVuZGluZyBBUEkgY291bmNpbCByZXZpZXcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgb25SZWNlaXZlZENyZWRlbnRpYWxzKExvYWRMaXN0ZW5lciBsb2FkZXIsCisgICAgICAgICAgICBTdHJpbmcgaG9zdCwgU3RyaW5nIHJlYWxtLCBTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICBDYWxsYmFja1Byb3h5IHByb3h5ID0gbG9hZGVyLmdldEZyYW1lKCkuZ2V0Q2FsbGJhY2tQcm94eSgpOworICAgICAgICBwcm94eS5vblJlY2VpdmVkSHR0cEF1dGhDcmVkZW50aWFscyhob3N0LCByZWFsbSwgdXNlcm5hbWUsIHBhc3N3b3JkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSldlYkNvcmVKYXZhQnJpZGdlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSldlYkNvcmVKYXZhQnJpZGdlLmphdmEKaW5kZXggMWY4ZDUzZi4uOTA4NTI2ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0pXZWJDb3JlSmF2YUJyaWRnZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9KV2ViQ29yZUphdmFCcmlkZ2UuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2Via2l0OwogCitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTUyLDEyICs1MywxNSBAQAogICAgIC8qIHBhY2thZ2UgKi8KICAgICBzdGF0aWMgZmluYWwgaW50IFJFRlJFU0hfUExVR0lOUyA9IDEwMDsKIAorICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbUNvbnRlbnRVcmlUb0ZpbGVQYXRoTWFwOworCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0IGEgbmV3IEpXZWJDb3JlSmF2YUJyaWRnZSB0byBpbnRlcmZhY2Ugd2l0aAogICAgICAqIFdlYkNvcmUgdGltZXJzIGFuZCBjb29raWVzLgogICAgICAqLwogICAgIHB1YmxpYyBKV2ViQ29yZUphdmFCcmlkZ2UoKSB7CiAgICAgICAgIG5hdGl2ZUNvbnN0cnVjdG9yKCk7CisKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTI3MSw2ICsyNzUsMjggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIENhbGxlZCBvbiB0aGUgV2ViQ29yZSB0aHJlYWQgdGhyb3VnaCBKTkkuCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZUZpbGVQYXRoRm9yQ29udGVudFVyaShTdHJpbmcgdXJpKSB7CisgICAgICAgIGlmIChtQ29udGVudFVyaVRvRmlsZVBhdGhNYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gbUNvbnRlbnRVcmlUb0ZpbGVQYXRoTWFwLmdldCh1cmkpOworICAgICAgICAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmlsZU5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBGYWlsc2FmZSBmYWxsYmFjayB0byBqdXN0IHVzZSB0aGUgbGFzdCBwYXRoIHNlZ21lbnQuCisgICAgICAgIC8vIChTZWUgT3BlbmFibGVDb2x1bW5zIGRvY3VtZW50YXRpb24gaW4gdGhlIFNESykKKyAgICAgICAgVXJpIGpVcmkgPSBVcmkucGFyc2UodXJpKTsKKyAgICAgICAgcmV0dXJuIGpVcmkuZ2V0TGFzdFBhdGhTZWdtZW50KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcmVGaWxlUGF0aEZvckNvbnRlbnRVcmkoU3RyaW5nIHBhdGgsIFN0cmluZyBjb250ZW50VXJpKSB7CisgICAgICAgIGlmIChtQ29udGVudFVyaVRvRmlsZVBhdGhNYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgbUNvbnRlbnRVcmlUb0ZpbGVQYXRoTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUNvbnRlbnRVcmlUb0ZpbGVQYXRoTWFwLnB1dChjb250ZW50VXJpLCBwYXRoKTsKKyAgICB9CisKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUNvbnN0cnVjdG9yKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVGaW5hbGl6ZSgpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgc2hhcmVkVGltZXJGaXJlZCgpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0xvYWRMaXN0ZW5lci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0xvYWRMaXN0ZW5lci5qYXZhCmluZGV4IGU2ZmE0MDUuLjhhNTVjNDggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Mb2FkTGlzdGVuZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTG9hZExpc3RlbmVyLmphdmEKQEAgLTExMCw2ICsxMTAsNyBAQAogICAgIHByaXZhdGUgUmVxdWVzdEhhbmRsZSBtUmVxdWVzdEhhbmRsZTsKICAgICBwcml2YXRlIFJlcXVlc3RIYW5kbGUgbVNzbEVycm9yUmVxdWVzdEhhbmRsZTsKICAgICBwcml2YXRlIGxvbmcgICAgIG1Qb3N0SWRlbnRpZmllcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gIG1TZXROYXRpdmVSZXNwb25zZTsKIAogICAgIC8vIFJlcXVlc3QgZGF0YS4gSXQgaXMgb25seSB2YWxpZCB3aGVuIHdlIGFyZSBkb2luZyBhIGxvYWQgZnJvbSB0aGUKICAgICAvLyBjYWNoZS4gSXQgaXMgbmVlZGVkIGlmIHRoZSBjYWNoZSByZXR1cm5zIGEgcmVkaXJlY3QKQEAgLTE4MSw2ICsxODIsNyBAQAogICAgIHByaXZhdGUgdm9pZCBjbGVhck5hdGl2ZUxvYWRlcigpIHsKICAgICAgICAgc05hdGl2ZUxvYWRlckNvdW50IC09IDE7CiAgICAgICAgIG1OYXRpdmVMb2FkZXIgPSAwOworICAgICAgICBtU2V0TmF0aXZlUmVzcG9uc2UgPSBmYWxzZTsKICAgICB9CiAKICAgICAvKgpAQCAtNjgxLDcgKzY4Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdCA9IG1BdXRoSGVhZGVyLmlzUHJveHkoKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmsuZ2V0SW5zdGFuY2UobUNvbnRleHQpLmdldFByb3h5SG9zdG5hbWUoKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VcmkubUhvc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBIdHRwQXV0aEhhbmRsZXIub25SZWNlaXZlZENyZWRlbnRpYWxzKHRoaXMsIGhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBIdHRwQXV0aEhhbmRsZXJJbXBsLm9uUmVjZWl2ZWRDcmVkZW50aWFscyh0aGlzLCBob3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXV0aEhlYWRlci5nZXRSZWFsbSgpLCBtVXNlcm5hbWUsIG1QYXNzd29yZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlQXV0aFJlc3BvbnNlKG1Vc2VybmFtZSwgbVBhc3N3b3JkKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTEwODYsMTMgKzEwODgsMTggQEAKICAgICAgICAgLy8gcmVxdWVzdCB3aXRoIHNvbWUgY3JlZGVudGlhbHMgdGhlbiBkb24ndCBjb21taXQgdGhlIGhlYWRlcnMKICAgICAgICAgLy8gb2YgdGhpcyByZXNwb25zZTsgd2FpdCBmb3IgdGhlIHJlc3BvbnNlIHRvIHRoZSByZXF1ZXN0IHdpdGggdGhlCiAgICAgICAgIC8vIGNyZWRlbnRpYWxzLgotICAgICAgICBpZiAobUF1dGhIZWFkZXIgIT0gbnVsbCkKKyAgICAgICAgaWYgKG1BdXRoSGVhZGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0gICAgICAgIC8vIENvbW1pdCB0aGUgaGVhZGVycyB0byBXZWJDb3JlCisgICAgICAgIHNldE5hdGl2ZVJlc3BvbnNlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldE5hdGl2ZVJlc3BvbnNlKCkgewogICAgICAgICBpbnQgbmF0aXZlUmVzcG9uc2UgPSBjcmVhdGVOYXRpdmVSZXNwb25zZSgpOwogICAgICAgICAvLyBUaGUgbmF0aXZlIGNvZGUgZGVsZXRlcyB0aGUgbmF0aXZlIHJlc3BvbnNlIG9iamVjdC4KICAgICAgICAgbmF0aXZlUmVjZWl2ZWRSZXNwb25zZShuYXRpdmVSZXNwb25zZSk7CisgICAgICAgIG1TZXROYXRpdmVSZXNwb25zZSA9IHRydWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTI3LDYgKzExMzQsOSBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBjb21taXRMb2FkKCkgewogICAgICAgICBpZiAobUNhbmNlbGxlZCkgcmV0dXJuOworICAgICAgICBpZiAoIW1TZXROYXRpdmVSZXNwb25zZSkgeworICAgICAgICAgICAgc2V0TmF0aXZlUmVzcG9uc2UoKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChtSXNNYWluUGFnZUxvYWRlcikgewogICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBzQ2VydGlmaWNhdGVUeXBlTWFwLmdldChtTWltZVR5cGUpOwpAQCAtMTE5Nyw2ICsxMjA3LDEwIEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKG1OYXRpdmVMb2FkZXIgIT0gMCkgewogICAgICAgICAgICAgUGVyZkNoZWNrZXIgY2hlY2tlciA9IG5ldyBQZXJmQ2hlY2tlcigpOworICAgICAgICAgICAgaWYgKCFtU2V0TmF0aXZlUmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICBzZXROYXRpdmVSZXNwb25zZSgpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBuYXRpdmVGaW5pc2hlZCgpOwogICAgICAgICAgICAgY2hlY2tlci5yZXNwb25zZUFsZXJ0KCJyZXMgbmF0aXZlRmluaXNoZWQiKTsKICAgICAgICAgICAgIGNsZWFyTmF0aXZlTG9hZGVyKCk7CkBAIC0xMzEyLDYgKzEzMjYsOSBAQAogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0ID0gbUNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoUi5zdHJpbmcub3Blbl9wZXJtaXNzaW9uX2RlbnkpCiAgICAgICAgICAgICAgICAgICAgICAgICArICJcbiIgKyByZWRpcmVjdFRvOworICAgICAgICAgICAgICAgIGlmICghbVNldE5hdGl2ZVJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICAgIHNldE5hdGl2ZVJlc3BvbnNlKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG5hdGl2ZUFkZERhdGEodGV4dC5nZXRCeXRlcygpLCB0ZXh0Lmxlbmd0aCgpKTsKICAgICAgICAgICAgICAgICBuYXRpdmVGaW5pc2hlZCgpOwogICAgICAgICAgICAgICAgIGNsZWFyTmF0aXZlTG9hZGVyKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9NaW1lVHlwZU1hcC5qYXZhCmluZGV4IGMxYWMxODAuLmYwMDAwNWIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9NaW1lVHlwZU1hcC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9NaW1lVHlwZU1hcC5qYXZhCkBAIC0xNiwzNSArMTYsMjIgQEAKIAogcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKIAoraW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgbGliY29yZS5uZXQuTWltZVV0aWxzOwogCiAvKioKICAqIFR3by13YXkgbWFwIHRoYXQgbWFwcyBNSU1FLXR5cGVzIHRvIGZpbGUgZXh0ZW5zaW9ucyBhbmQgdmljZSB2ZXJzYS4KKyAqCisgKiA8cD5TZWUgYWxzbyB7QGxpbmsgamF2YS5uZXQuVVJMQ29ubmVjdGlvbiNndWVzc0NvbnRlbnRUeXBlRnJvbU5hbWV9CisgKiBhbmQge0BsaW5rIGphdmEubmV0LlVSTENvbm5lY3Rpb24jZ3Vlc3NDb250ZW50VHlwZUZyb21TdHJlYW19LiBUaGlzCisgKiBjbGFzcyBhbmQge0Bjb2RlIFVSTENvbm5lY3Rpb259IHNoYXJlIHRoZSBzYW1lIE1JTUUtdHlwZSBkYXRhYmFzZS4KICAqLwogcHVibGljIGNsYXNzIE1pbWVUeXBlTWFwIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNaW1lVHlwZU1hcCBzTWltZVR5cGVNYXAgPSBuZXcgTWltZVR5cGVNYXAoKTsKIAotICAgIC8qKgotICAgICAqIFNpbmdsZXRvbiBNSU1FLXR5cGUgbWFwIGluc3RhbmNlOgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE1pbWVUeXBlTWFwIHNNaW1lVHlwZU1hcDsKLQotICAgIC8qKgotICAgICAqIE1JTUUtdHlwZSB0byBmaWxlIGV4dGVuc2lvbiBtYXBwaW5nOgotICAgICAqLwotICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbU1pbWVUeXBlVG9FeHRlbnNpb25NYXA7Ci0KLSAgICAvKioKLSAgICAgKiBGaWxlIGV4dGVuc2lvbiB0byBNSU1FIHR5cGUgbWFwcGluZzoKLSAgICAgKi8KLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1FeHRlbnNpb25Ub01pbWVUeXBlTWFwOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBNSU1FLXR5cGUgbWFwLgotICAgICAqLwogICAgIHByaXZhdGUgTWltZVR5cGVNYXAoKSB7Ci0gICAgICAgIG1NaW1lVHlwZVRvRXh0ZW5zaW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIG1FeHRlbnNpb25Ub01pbWVUeXBlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01NSw3ICs0Miw3IEBACiAgICAgICogQHJldHVybiBUaGUgZmlsZSBleHRlbnNpb24gb2YgdGhlIGdpdmVuIHVybC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uRnJvbVVybChTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGlmICh1cmwgIT0gbnVsbCAmJiB1cmwubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodXJsKSkgewogICAgICAgICAgICAgaW50IHF1ZXJ5ID0gdXJsLmxhc3RJbmRleE9mKCc/Jyk7CiAgICAgICAgICAgICBpZiAocXVlcnkgPiAwKSB7CiAgICAgICAgICAgICAgICAgdXJsID0gdXJsLnN1YnN0cmluZygwLCBxdWVyeSk7CkBAIC02Niw3ICs1Myw3IEBACiAKICAgICAgICAgICAgIC8vIGlmIHRoZSBmaWxlbmFtZSBjb250YWlucyBzcGVjaWFsIGNoYXJhY3RlcnMsIHdlIGRvbid0CiAgICAgICAgICAgICAvLyBjb25zaWRlciBpdCB2YWxpZCBmb3Igb3VyIG1hdGNoaW5nIHB1cnBvc2VzOgotICAgICAgICAgICAgaWYgKGZpbGVuYW1lLmxlbmd0aCgpID4gMCAmJgorICAgICAgICAgICAgaWYgKCFmaWxlbmFtZS5pc0VtcHR5KCkgJiYKICAgICAgICAgICAgICAgICBQYXR0ZXJuLm1hdGNoZXMoIlthLXpBLVpfMC05XFwuXFwtXFwoXFwpXFwlXSsiLCBmaWxlbmFtZSkpIHsKICAgICAgICAgICAgICAgICBpbnQgZG90UG9zID0gZmlsZW5hbWUubGFzdEluZGV4T2YoJy4nKTsKICAgICAgICAgICAgICAgICBpZiAoMCA8PSBkb3RQb3MpIHsKQEAgLTc5LDM2ICs2NiwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvYWQgYW4gZW50cnkgaW50byB0aGUgbWFwLiBUaGlzIGRvZXMgbm90IGNoZWNrIGlmIHRoZSBpdGVtIGFscmVhZHkKLSAgICAgKiBleGlzdHMsIGl0IHRydXN0cyB0aGUgY2FsbGVyIQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBsb2FkRW50cnkoU3RyaW5nIG1pbWVUeXBlLCBTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gZXhpc3RpbmcgeCAtLT4geSBtYXBwaW5nLCB3ZSBkbyBub3Qgd2FudCB0bwotICAgICAgICAvLyBvdmVycmlkZSBpdCB3aXRoIGFub3RoZXIgbWFwcGluZyB4IC0tPiA/Ci0gICAgICAgIC8vIHRoaXMgaXMgbW9zdGx5IGJlY2F1c2Ugb2YgdGhlIHdheSB0aGUgbWltZS10eXBlIG1hcCBiZWxvdwotICAgICAgICAvLyBpcyBjb25zdHJ1Y3RlZCAoaWYgYSBtaW1lIHR5cGUgbWFwcyB0byBzZXZlcmFsIGV4dGVuc2lvbnMKLSAgICAgICAgLy8gdGhlIGZpcnN0IGV4dGVuc2lvbiBpcyBjb25zaWRlcmVkIHRoZSBtb3N0IHBvcHVsYXIgYW5kIGlzCi0gICAgICAgIC8vIGFkZGVkIGZpcnN0OyB3ZSBkbyBub3Qgd2FudCB0byBvdmVyd3JpdGUgaXQgbGF0ZXIpLgotICAgICAgICAvLwotICAgICAgICBpZiAoIW1NaW1lVHlwZVRvRXh0ZW5zaW9uTWFwLmNvbnRhaW5zS2V5KG1pbWVUeXBlKSkgewotICAgICAgICAgICAgbU1pbWVUeXBlVG9FeHRlbnNpb25NYXAucHV0KG1pbWVUeXBlLCBleHRlbnNpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgbUV4dGVuc2lvblRvTWltZVR5cGVNYXAucHV0KGV4dGVuc2lvbiwgbWltZVR5cGUpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBNSU1FIHR5cGUgaGFzIGFuIGVudHJ5IGluIHRoZSBtYXAuCiAgICAgICogQHBhcmFtIG1pbWVUeXBlIEEgTUlNRSB0eXBlIChpLmUuIHRleHQvcGxhaW4pCiAgICAgICogQHJldHVybiBUcnVlIGlmZiB0aGVyZSBpcyBhIG1pbWVUeXBlIGVudHJ5IGluIHRoZSBtYXAuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7Ci0gICAgICAgIGlmIChtaW1lVHlwZSAhPSBudWxsICYmIG1pbWVUeXBlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1NaW1lVHlwZVRvRXh0ZW5zaW9uTWFwLmNvbnRhaW5zS2V5KG1pbWVUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIE1pbWVVdGlscy5oYXNNaW1lVHlwZShtaW1lVHlwZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTcsMTYgKzgwLDEyIEBACiAgICAgICogQHJldHVybiBUaGUgTUlNRSB0eXBlIGZvciB0aGUgZ2l2ZW4gZXh0ZW5zaW9uIG9yIG51bGwgaWZmIHRoZXJlIGlzIG5vbmUuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZUZyb21FeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgewotICAgICAgICBpZiAoZXh0ZW5zaW9uICE9IG51bGwgJiYgZXh0ZW5zaW9uLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1FeHRlbnNpb25Ub01pbWVUeXBlTWFwLmdldChleHRlbnNpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBNaW1lVXRpbHMuZ3Vlc3NNaW1lVHlwZUZyb21FeHRlbnNpb24oZXh0ZW5zaW9uKTsKICAgICB9CiAKICAgICAvLyBTdGF0aWMgbWV0aG9kIGNhbGxlZCBieSBqbmkuCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1pbWVUeXBlRnJvbUV4dGVuc2lvbihTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRTaW5nbGV0b24oKS5nZXRNaW1lVHlwZUZyb21FeHRlbnNpb24oZXh0ZW5zaW9uKTsKKyAgICAgICAgcmV0dXJuIE1pbWVVdGlscy5ndWVzc01pbWVUeXBlRnJvbUV4dGVuc2lvbihleHRlbnNpb24pOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM1LDEwICs5NCw3IEBACiAgICAgICogQHJldHVybiBUcnVlIGlmZiB0aGVyZSBpcyBhbiBleHRlbnNpb24gZW50cnkgaW4gdGhlIG1hcC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNFeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgewotICAgICAgICBpZiAoZXh0ZW5zaW9uICE9IG51bGwgJiYgZXh0ZW5zaW9uLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1FeHRlbnNpb25Ub01pbWVUeXBlTWFwLmNvbnRhaW5zS2V5KGV4dGVuc2lvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gTWltZVV0aWxzLmhhc0V4dGVuc2lvbihleHRlbnNpb24pOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTQ5LDExICsxMDUsNyBAQAogICAgICAqIEByZXR1cm4gVGhlIGV4dGVuc2lvbiBmb3IgdGhlIGdpdmVuIE1JTUUgdHlwZSBvciBudWxsIGlmZiB0aGVyZSBpcyBub25lLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uRnJvbU1pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCAmJiBtaW1lVHlwZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBtTWltZVR5cGVUb0V4dGVuc2lvbk1hcC5nZXQobWltZVR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBNaW1lVXRpbHMuZ3Vlc3NFeHRlbnNpb25Gcm9tTWltZVR5cGUobWltZVR5cGUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTYxLDM2MyArMTEzLDYgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIE1JTUUtdHlwZSBtYXAuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBNaW1lVHlwZU1hcCBnZXRTaW5nbGV0b24oKSB7Ci0gICAgICAgIGlmIChzTWltZVR5cGVNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgc01pbWVUeXBlTWFwID0gbmV3IE1pbWVUeXBlTWFwKCk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgdGFibGUgaXMgYmFzZWQgb24gL2V0Yy9taW1lLnR5cGVzIGRhdGEgbWludXMKLSAgICAgICAgICAgIC8vIGNoZW1pY2FsLyogTUlNRSB0eXBlcyBhbmQgTUlNRSB0eXBlcyB0aGF0IGRvbid0IG1hcCB0byBhbnkKLSAgICAgICAgICAgIC8vIGZpbGUgZXh0ZW5zaW9ucy4gV2UgYWxzbyBleGNsdWRlIHRvcC1sZXZlbCBkb21haW4gbmFtZXMgdG8KLSAgICAgICAgICAgIC8vIGRlYWwgd2l0aCBjYXNlcyBsaWtlOgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIG1haWwuZ29vZ2xlLmNvbS9hL2dvb2dsZS5jb20KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBhbmQgImFjdGl2ZSIgTUlNRSB0eXBlcyAoZHVlIHRvIHBvdGVudGlhbCBzZWN1cml0eSBpc3N1ZXMpLgotCi0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9hbmRyZXctaW5zZXQiLCAiZXoiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL2RzcHR5cGUiLCAidHNwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9mdXR1cmVzcGxhc2giLCAic3BsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9odGEiLCAiaHRhIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9tYWMtYmluaGV4NDAiLCAiaHF4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9tYWMtY29tcGFjdHBybyIsICJjcHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL21hdGhlbWF0aWNhIiwgIm5iIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9tc2FjY2VzcyIsICJtZGIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL29kYSIsICJvZGEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL29nZyIsICJvZ2ciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3BkZiIsICJwZGYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3BncC1rZXlzIiwgImtleSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vcGdwLXNpZ25hdHVyZSIsICJwZ3AiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3BpY3MtcnVsZXMiLCAicHJmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9yYXIiLCAicmFyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9yZGYreG1sIiwgInJkZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vcnNzK3htbCIsICJyc3MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ppcCIsICJ6aXAiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5hbmRyb2lkLnBhY2thZ2UtYXJjaGl2ZSIsIAotICAgICAgICAgICAgICAgICAgICAiYXBrIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuY2luZGVyZWxsYSIsICJjZHkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5tcy1wa2kuc3RsIiwgInN0bCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZGF0YWJhc2UiLCAib2RiIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhIiwgIm9kZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3MiLCAib2RnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5ncmFwaGljcy10ZW1wbGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICJvdGciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmltYWdlIiwgIm9kaSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQiLCAib2RzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldC10ZW1wbGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICJvdHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQiLCAib2R0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LW1hc3RlciIsICJvZG0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtdGVtcGxhdGUiLCAib3R0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXdlYiIsICJvdGgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL21zd29yZCIsICJkb2MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL21zd29yZCIsICJkb3QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCIsCi0gICAgICAgICAgICAgICAgICAgICJkb2N4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwudGVtcGxhdGUiLAotICAgICAgICAgICAgICAgICAgICAiZG90eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIiwgInhscyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIiwgInhsdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0IiwKLSAgICAgICAgICAgICAgICAgICAgInhsc3giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50ZW1wbGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICJ4bHR4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCIsICJwcHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50IiwgInBvdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQiLCAicHBzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnByZXNlbnRhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICJwcHR4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRlbXBsYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgInBvdHgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGVzaG93IiwKLSAgICAgICAgICAgICAgICAgICAgInBwc3giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5yaW0uY29kIiwgImNvZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnNtYWYiLCAibW1mIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmNhbGMiLCAic2RjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmRyYXciLCAic2RhIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5pbXByZXNzIiwgInNkZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uaW1wcmVzcyIsICJzZHAiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ubWF0aCIsICJzbWYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ud3JpdGVyIiwKLSAgICAgICAgICAgICAgICAgICAgInNkdyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi53cml0ZXIiLAotICAgICAgICAgICAgICAgICAgICAidm9yIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi53cml0ZXItZ2xvYmFsIiwgInNnbCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuY2FsYyIsICJzeGMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5jYWxjLnRlbXBsYXRlIiwgInN0YyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuZHJhdyIsICJzeGQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5kcmF3LnRlbXBsYXRlIiwgInN0ZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuaW1wcmVzcyIsICJzeGkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5pbXByZXNzLnRlbXBsYXRlIiwgInN0aSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN1bi54bWwubWF0aCIsICJzeG0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlciIsICJzeHciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXIuZ2xvYmFsIiwgInN4ZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlci50ZW1wbGF0ZSIsICJzdHciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC52aXNpbyIsICJ2c2QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtYWJpd29yZCIsICJhYnciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtYXBwbGUtZGlza2ltYWdlIiwgImRtZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1iY3BpbyIsICJiY3BpbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1iaXR0b3JyZW50IiwgInRvcnJlbnQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtY2RmIiwgImNkZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1jZGxpbmsiLCAidmNkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWNoZXNzLXBnbiIsICJwZ24iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtY3BpbyIsICJjcGlvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWRlYmlhbi1wYWNrYWdlIiwgImRlYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1kZWJpYW4tcGFja2FnZSIsICJ1ZGViIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWRpcmVjdG9yIiwgImRjciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1kaXJlY3RvciIsICJkaXIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZGlyZWN0b3IiLCAiZHhyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWRtcyIsICJkbXMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZG9vbSIsICJ3YWQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZHZpIiwgImR2aSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1mbGFjIiwgImZsYWMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZm9udCIsICJwZmEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZm9udCIsICJwZmIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZm9udCIsICJnc2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZm9udCIsICJwY2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZm9udCIsICJwY2YuWiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1mcmVlbWluZCIsICJtbSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1mdXR1cmVzcGxhc2giLCAic3BsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWdudW1lcmljIiwgImdudW1lcmljIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWdvLXNnZiIsICJzZ2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZ3JhcGhpbmctY2FsY3VsYXRvciIsICJnY2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZ3RhciIsICJndGFyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWd0YXIiLCAidGd6Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWd0YXIiLCAidGF6Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWhkZiIsICJoZGYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtaWNhIiwgImljYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1pbnRlcm5ldC1zaWdudXAiLCAiaW5zIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWludGVybmV0LXNpZ251cCIsICJpc3AiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtaXBob25lIiwgImlpaSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1pc285NjYwLWltYWdlIiwgImlzbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1qbW9sIiwgImpteiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rY2hhcnQiLCAiY2hydCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1raWxsdXN0cmF0b3IiLCAia2lsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtvYW4iLCAic2twIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtvYW4iLCAic2tkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtvYW4iLCAic2t0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtvYW4iLCAic2ttIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtwcmVzZW50ZXIiLCAia3ByIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtwcmVzZW50ZXIiLCAia3B0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWtzcHJlYWQiLCAia3NwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWt3b3JkIiwgImt3ZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rd29yZCIsICJrd3QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbGF0ZXgiLCAibGF0ZXgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbGhhIiwgImxoYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1semgiLCAibHpoIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWx6eCIsICJsengiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbWFrZXIiLCAiZnJtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgIm1ha2VyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgImZyYW1lIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgImZiIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgImJvb2siKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbWFrZXIiLCAiZmJkb2MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbWlmIiwgIm1pZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1tcy13bWQiLCAid21kIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1zLXdteiIsICJ3bXoiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbXNpIiwgIm1zaSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1ucy1wcm94eS1hdXRvY29uZmlnIiwgInBhYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1ud2MiLCAibndjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW9iamVjdCIsICJvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW96LWFwcGxpY2F0aW9uIiwgIm96YSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1wa2NzMTIiLCAicDEyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXBrY3M3LWNlcnRyZXFyZXNwIiwgInA3ciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1wa2NzNy1jcmwiLCAiY3JsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXF1aWNrdGltZXBsYXllciIsICJxdGwiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtc2hhciIsICJzaGFyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIsICJzd2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtc3R1ZmZpdCIsICJzaXQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtc3Y0Y3BpbyIsICJzdjRjcGlvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXN2NGNyYyIsICJzdjRjcmMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtdGFyIiwgInRhciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC10ZXhpbmZvIiwgInRleGluZm8iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtdGV4aW5mbyIsICJ0ZXhpIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXRyb2ZmIiwgInQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtdHJvZmYiLCAicm9mZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC10cm9mZi1tYW4iLCAibWFuIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXVzdGFyIiwgInVzdGFyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXdhaXMtc291cmNlIiwgInNyYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC13aW5neiIsICJ3eiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC13ZWJhcmNoaXZlIiwgIndlYmFyY2hpdmUiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gteDUwOS1jYS1jZXJ0IiwgImNydCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC14NTA5LXVzZXItY2VydCIsICJjcnQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gteGNmIiwgInhjZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC14ZmlnIiwgImZpZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veGh0bWwreG1sIiwgInhodG1sIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby8zZ3BwIiwgIjNncHAiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL2FtciIsICJhbXIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL2Jhc2ljIiwgInNuZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbWlkaSIsICJtaWQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21pZGkiLCAibWlkaSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbWlkaSIsICJrYXIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21pZGkiLCAieG1mIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9tb2JpbGUteG1mIiwgIm14bWYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21wZWciLCAibXBnYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbXBlZyIsICJtcGVnYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbXBlZyIsICJtcDIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21wZWciLCAibXAzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9tcGVnIiwgIm00YSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbXBlZ3VybCIsICJtM3UiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3Bycy5zaWQiLCAic2lkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LWFpZmYiLCAiYWlmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LWFpZmYiLCAiYWlmZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1haWZmIiwgImFpZmMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtZ3NtIiwgImdzbSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1tcGVndXJsIiwgIm0zdSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1tcy13bWEiLCAid21hIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LW1zLXdheCIsICJ3YXgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtcG4tcmVhbGF1ZGlvIiwgInJhIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LXBuLXJlYWxhdWRpbyIsICJybSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1wbi1yZWFsYXVkaW8iLCAicmFtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LXJlYWxhdWRpbyIsICJyYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1zY3BscyIsICJwbHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtc2QyIiwgInNkMiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC13YXYiLCAid2F2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9ibXAiLCAiYm1wIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9naWYiLCAiZ2lmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9pY28iLCAiY3VyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9pY28iLCAiaWNvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9pZWYiLCAiaWVmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9qcGVnIiwgImpwZWciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL2pwZWciLCAianBnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9qcGVnIiwgImpwZSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvcGN4IiwgInBjeCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvcG5nIiwgInBuZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2Uvc3ZnK3htbCIsICJzdmciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3N2Zyt4bWwiLCAic3ZneiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvdGlmZiIsICJ0aWZmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS90aWZmIiwgInRpZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2Uvdm5kLmRqdnUiLCAiZGp2dSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2Uvdm5kLmRqdnUiLCAiZGp2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS92bmQud2FwLndibXAiLCAid2JtcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1jbXUtcmFzdGVyIiwgInJhcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1jb3JlbGRyYXciLCAiY2RyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LWNvcmVsZHJhd3BhdHRlcm4iLCAicGF0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LWNvcmVsZHJhd3RlbXBsYXRlIiwgImNkdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1jb3JlbHBob3RvcGFpbnQiLCAiY3B0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LWljb24iLCAiaWNvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LWpnIiwgImFydCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1qbmciLCAiam5nIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LW1zLWJtcCIsICJibXAiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtcGhvdG9zaG9wIiwgInBzZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1wb3J0YWJsZS1hbnltYXAiLCAicG5tIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXBvcnRhYmxlLWJpdG1hcCIsICJwYm0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtcG9ydGFibGUtZ3JheW1hcCIsICJwZ20iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtcG9ydGFibGUtcGl4bWFwIiwgInBwbSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1yZ2IiLCAicmdiIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXhiaXRtYXAiLCAieGJtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXhwaXhtYXAiLCAieHBtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXh3aW5kb3dkdW1wIiwgInh3ZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgibW9kZWwvaWdlcyIsICJpZ3MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIm1vZGVsL2lnZXMiLCAiaWdlcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgibW9kZWwvbWVzaCIsICJtc2giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIm1vZGVsL21lc2giLCAibWVzaCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgibW9kZWwvbWVzaCIsICJzaWxvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L2NhbGVuZGFyIiwgImljcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9jYWxlbmRhciIsICJpY3oiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvY29tbWEtc2VwYXJhdGVkLXZhbHVlcyIsICJjc3YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvY3NzIiwgImNzcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9odG1sIiwgImh0bSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9odG1sIiwgImh0bWwiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvaDMyMyIsICIzMjMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvaXVscyIsICJ1bHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvbWF0aG1sIiwgIm1tbCIpOwotICAgICAgICAgICAgLy8gYWRkIGl0IGZpcnN0IHNvIGl0IHdpbGwgYmUgdGhlIGRlZmF1bHQgZm9yIEV4dGVuc2lvbkZyb21NaW1lVHlwZQotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9wbGFpbiIsICJ0eHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvcGxhaW4iLCAiYXNjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3BsYWluIiwgInRleHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvcGxhaW4iLCAiZGlmZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9wbGFpbiIsICJwbyIpOyAgICAgLy8gcmVzZXJ2ZSAicG90IiBmb3Igdm5kLm1zLXBvd2VycG9pbnQKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvcmljaHRleHQiLCAicnR4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3J0ZiIsICJydGYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvdGV4bWFjcyIsICJ0cyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC90ZXh0IiwgInBocHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXMiLCAidHN2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3htbCIsICJ4bWwiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1iaWJ0ZXgiLCAiYmliIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtYm9vIiwgImJvbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWMrK2hkciIsICJoKysiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jKytoZHIiLCAiaHBwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtYysraGRyIiwgImh4eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWMrK2hkciIsICJoaCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWMrK3NyYyIsICJjKysiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jKytzcmMiLCAiY3BwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtYysrc3JjIiwgImN4eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWNoZHIiLCAiaCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWNvbXBvbmVudCIsICJodGMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jc2giLCAiY3NoIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtY3NyYyIsICJjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtZHNyYyIsICJkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtaGFza2VsbCIsICJocyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWphdmEiLCAiamF2YSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWxpdGVyYXRlLWhhc2tlbGwiLCAibGhzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtbW9jIiwgIm1vYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXBhc2NhbCIsICJwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtcGFzY2FsIiwgInBhcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXBjcy1nY2QiLCAiZ2NkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtc2V0ZXh0IiwgImV0eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXRjbCIsICJ0Y2wiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC10ZXgiLCAidGV4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtdGV4IiwgImx0eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXRleCIsICJzdHkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC10ZXgiLCAiY2xzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtdmNhbGVuZGFyIiwgInZjcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXZjYXJkIiwgInZjZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vM2dwcCIsICIzZ3BwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby8zZ3BwIiwgIjNncCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vM2dwcCIsICIzZzIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL2RsIiwgImRsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9kdiIsICJkaWYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL2R2IiwgImR2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9mbGkiLCAiZmxpIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9tNHYiLCAibTR2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9tcGVnIiwgIm1wZWciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL21wZWciLCAibXBnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9tcGVnIiwgIm1wZSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vbXA0IiwgIm1wNCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vbXBlZyIsICJWT0IiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3F1aWNrdGltZSIsICJxdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vcXVpY2t0aW1lIiwgIm1vdiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vdm5kLm1wZWd1cmwiLCAibXh1Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby94LWxhLWFzZiIsICJsc2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbGEtYXNmIiwgImxzeCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tbmciLCAibW5nIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby94LW1zLWFzZiIsICJhc2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbXMtYXNmIiwgImFzeCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tcy13bSIsICJ3bSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tcy13bXYiLCAid212Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby94LW1zLXdteCIsICJ3bXgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbXMtd3Z4IiwgInd2eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tc3ZpZGVvIiwgImF2aSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1zZ2ktbW92aWUiLCAibW92aWUiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIngtY29uZmVyZW5jZS94LWNvb2x0YWxrIiwgImljZSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgieC1lcG9jL3gtc2lzeC1hcHAiLCAic2lzeCIpOwotICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIHNNaW1lVHlwZU1hcDsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTmV0d29yay5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L05ldHdvcmsuamF2YQppbmRleCA1OThmMjBkLi41OWJlYzI0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTmV0d29yay5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9OZXR3b3JrLmphdmEKQEAgLTE2LDcgKzE2LDEyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CiBpbXBvcnQgYW5kcm9pZC5uZXQuaHR0cC4qOwogaW1wb3J0IGFuZHJvaWQub3MuKjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtNzQsNyArNzksMjAgQEAKICAgICAgKiBIVFRQIGF1dGhlbnRpY2F0aW9uIGhhbmRsZXI6IHRha2VzIGNhcmUgb2Ygc3luY2hyb25pemF0aW9uIG9mIEhUVFAKICAgICAgKiBhdXRoZW50aWNhdGlvbiByZXF1ZXN0cy4KICAgICAgKi8KLSAgICBwcml2YXRlIEh0dHBBdXRoSGFuZGxlciBtSHR0cEF1dGhIYW5kbGVyOworICAgIHByaXZhdGUgSHR0cEF1dGhIYW5kbGVySW1wbCBtSHR0cEF1dGhIYW5kbGVyOworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGUgY3VycmVudGx5IHVzZWQgbmV0d29yayBjb25uZWN0aW9uIGlzIGEgcm9hbWluZyBwaG9uZQorICAgICAqIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1Sb2FtaW5nOworCisgICAgLyoqCisgICAgICogVHJhY2tzIGlmIHdlIGFyZSByb2FtaW5nLgorICAgICAqLworICAgIHByaXZhdGUgUm9hbWluZ01vbml0b3IgbVJvYW1pbmdNb25pdG9yOwogCiAgICAgLyoqCiAgICAgICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBuZXR3b3JrLgpAQCAtMTA3LDYgKzEyNSw3IEBACiAgICAgICAgIGlmICgrK3NQbGF0Zm9ybU5vdGlmaWNhdGlvbkVuYWJsZVJlZkNvdW50ID09IDEpIHsKICAgICAgICAgICAgIGlmIChzTmV0d29yayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgc05ldHdvcmsubVJlcXVlc3RRdWV1ZS5lbmFibGVQbGF0Zm9ybU5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgICAgICAgICBzTmV0d29yay5tb25pdG9yUm9hbWluZygpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzUGxhdGZvcm1Ob3RpZmljYXRpb25zID0gdHJ1ZTsKICAgICAgICAgICAgIH0KQEAgLTEyMSw2ICsxNDAsNyBAQAogICAgICAgICBpZiAoLS1zUGxhdGZvcm1Ob3RpZmljYXRpb25FbmFibGVSZWZDb3VudCA9PSAwKSB7CiAgICAgICAgICAgICBpZiAoc05ldHdvcmsgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHNOZXR3b3JrLm1SZXF1ZXN0UXVldWUuZGlzYWJsZVBsYXRmb3JtTm90aWZpY2F0aW9ucygpOworICAgICAgICAgICAgICAgIHNOZXR3b3JrLnN0b3BNb25pdG9yaW5nUm9hbWluZygpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzUGxhdGZvcm1Ob3RpZmljYXRpb25zID0gZmFsc2U7CiAgICAgICAgICAgICB9CkBAIC0xMzYsMTIgKzE1NiwzOSBAQAogICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS4KICAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZSgpLmVxdWFscyhXZWJWaWV3Q29yZS5USFJFQURfTkFNRSkpOwogICAgICAgICB9CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVNzbEVycm9ySGFuZGxlciA9IG5ldyBTc2xFcnJvckhhbmRsZXIoKTsKLSAgICAgICAgbUh0dHBBdXRoSGFuZGxlciA9IG5ldyBIdHRwQXV0aEhhbmRsZXIodGhpcyk7CisgICAgICAgIG1IdHRwQXV0aEhhbmRsZXIgPSBuZXcgSHR0cEF1dGhIYW5kbGVySW1wbCh0aGlzKTsKIAogICAgICAgICBtUmVxdWVzdFF1ZXVlID0gbmV3IFJlcXVlc3RRdWV1ZShjb250ZXh0KTsKICAgICB9CiAKKyAgICBwcml2YXRlIGNsYXNzIFJvYW1pbmdNb25pdG9yIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgaWYgKCFDb25uZWN0aXZpdHlNYW5hZ2VyLkNPTk5FQ1RJVklUWV9BQ1RJT04uZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBOZXR3b3JrSW5mbyBpbmZvID0gKE5ldHdvcmtJbmZvKWludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoQ29ubmVjdGl2aXR5TWFuYWdlci5FWFRSQV9ORVRXT1JLX0lORk8pOworICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBtUm9hbWluZyA9IGluZm8uaXNSb2FtaW5nKCk7CisgICAgICAgIH07CisgICAgfTsKKworICAgIHByaXZhdGUgdm9pZCBtb25pdG9yUm9hbWluZygpIHsKKyAgICAgICAgbVJvYW1pbmdNb25pdG9yID0gbmV3IFJvYW1pbmdNb25pdG9yKCk7CisgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQ29ubmVjdGl2aXR5TWFuYWdlci5DT05ORUNUSVZJVFlfQUNUSU9OKTsKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihzTmV0d29yay5tUm9hbWluZ01vbml0b3IsIGZpbHRlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0b3BNb25pdG9yaW5nUm9hbWluZygpIHsKKyAgICAgICAgaWYgKG1Sb2FtaW5nTW9uaXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobVJvYW1pbmdNb25pdG9yKTsKKyAgICAgICAgICAgIG1Sb2FtaW5nTW9uaXRvciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXF1ZXN0IGEgdXJsIGZyb20gZWl0aGVyIHRoZSBuZXR3b3JrIG9yIHRoZSBmaWxlIHN5c3RlbS4KICAgICAgKiBAcGFyYW0gdXJsIFRoZSB1cmwgdG8gbG9hZC4KQEAgLTE3MCw2ICsyMTcsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCisgICAgICAgIC8vIElmIHRoaXMgaXMgYSBwcmVmZXRjaCwgYWJvcnQgaXQgaWYgd2UncmUgcm9hbWluZy4KKyAgICAgICAgaWYgKG1Sb2FtaW5nICYmIGhlYWRlcnMuY29udGFpbnNLZXkoIlgtTW96IikgJiYgInByZWZldGNoIi5lcXVhbHMoaGVhZGVycy5nZXQoIlgtTW96IikpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKwogICAgICAgICAvKiBGSVhNRTogdGhpcyBpcyBsYW1lLiAgUGFzcyBhbiBJbnB1dFN0cmVhbSBpbiwgcmF0aGVyIHRoYW4KICAgICAgICAgICAgbWFraW5nIHRoaXMgbGFtZSBvbmUgaGVyZSAqLwogICAgICAgICBJbnB1dFN0cmVhbSBib2R5UHJvdmlkZXIgPSBudWxsOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1BsdWdpbk1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9QbHVnaW5NYW5hZ2VyLmphdmEKaW5kZXggZTVlZWI4Yy4uYWIzYjZkNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1BsdWdpbk1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvUGx1Z2luTWFuYWdlci5qYXZhCkBAIC0xNTksNDEgKzE1OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgPSBQTFVHSU5fU1lTVEVNX0xJQiArIHBrZ0luZm8ucGFja2FnZU5hbWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zCi0gICAgICAgICAgICAgICAgU3RyaW5nIHBlcm1pc3Npb25zW10gPSBwa2dJbmZvLnJlcXVlc3RlZFBlcm1pc3Npb25zOwotICAgICAgICAgICAgICAgIGlmIChwZXJtaXNzaW9ucyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zIGFuZAorICAgICAgICAgICAgICAgIC8vIHNpZ25hdHVyZXMKKyAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5zUGx1Z2luUGVybWlzc2lvbkFuZFNpZ25hdHVyZXMocGtnSW5mbykpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJvb2xlYW4gcGVybWlzc2lvbk9rID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcGVybWl0IDogcGVybWlzc2lvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFBMVUdJTl9QRVJNSVNTSU9OLmVxdWFscyhwZXJtaXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uT2sgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFwZXJtaXNzaW9uT2spIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gZW5zdXJlIHRoZSBwbHVnaW4gaXMgcHJvcGVybHkgc2lnbmVkCi0gICAgICAgICAgICAgICAgU2lnbmF0dXJlIHNpZ25hdHVyZXNbXSA9IHBrZ0luZm8uc2lnbmF0dXJlczsKLSAgICAgICAgICAgICAgICBpZiAoc2lnbmF0dXJlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJyby5zZWN1cmUiLCBmYWxzZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzaWduYXR1cmVNYXRjaCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFNpZ25hdHVyZSBzaWduYXR1cmUgOiBzaWduYXR1cmVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJR05BVFVSRVMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU0lHTkFUVVJFU1tpXS5lcXVhbHMoc2lnbmF0dXJlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVNYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIXNpZ25hdHVyZU1hdGNoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSB0aGUgdHlwZSBvZiBwbHVnaW4gZnJvbSB0aGUgbWFuaWZlc3QKICAgICAgICAgICAgICAgICBpZiAoc2VydmljZUluZm8ubWV0YURhdGEgPT0gbnVsbCkgewpAQCAtMjM2LDYgKzIwNiw2NCBAQAogICAgIH0KIAogICAgIC8qIHBhY2thZ2UgKi8KKyAgICBib29sZWFuIGNvbnRhaW5zUGx1Z2luUGVybWlzc2lvbkFuZFNpZ25hdHVyZXMoU3RyaW5nIHBsdWdpbkFQS05hbWUpIHsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworCisgICAgICAgIC8vIHJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHBsdWdpbidzIG1hbmlmZXN0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQYWNrYWdlSW5mbyBwa2dJbmZvID0gcG0uZ2V0UGFja2FnZUluZm8ocGx1Z2luQVBLTmFtZSwgUGFja2FnZU1hbmFnZXIuR0VUX1BFUk1JU1NJT05TCisgICAgICAgICAgICAgICAgICAgIHwgUGFja2FnZU1hbmFnZXIuR0VUX1NJR05BVFVSRVMpOworICAgICAgICAgICAgaWYgKHBrZ0luZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1BsdWdpblBlcm1pc3Npb25BbmRTaWduYXR1cmVzKHBrZ0luZm8pOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiQ2FuJ3QgZmluZCBwbHVnaW46ICIgKyBwbHVnaW5BUEtOYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWluc1BsdWdpblBlcm1pc3Npb25BbmRTaWduYXR1cmVzKFBhY2thZ2VJbmZvIHBrZ0luZm8pIHsKKworICAgICAgICAvLyBjaGVjayBpZiB0aGUgcGx1Z2luIGhhcyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnMKKyAgICAgICAgU3RyaW5nIHBlcm1pc3Npb25zW10gPSBwa2dJbmZvLnJlcXVlc3RlZFBlcm1pc3Npb25zOworICAgICAgICBpZiAocGVybWlzc2lvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gcGVybWlzc2lvbk9rID0gZmFsc2U7CisgICAgICAgIGZvciAoU3RyaW5nIHBlcm1pdCA6IHBlcm1pc3Npb25zKSB7CisgICAgICAgICAgICBpZiAoUExVR0lOX1BFUk1JU1NJT04uZXF1YWxzKHBlcm1pdCkpIHsKKyAgICAgICAgICAgICAgICBwZXJtaXNzaW9uT2sgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghcGVybWlzc2lvbk9rKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayB0byBlbnN1cmUgdGhlIHBsdWdpbiBpcyBwcm9wZXJseSBzaWduZWQKKyAgICAgICAgU2lnbmF0dXJlIHNpZ25hdHVyZXNbXSA9IHBrZ0luZm8uc2lnbmF0dXJlczsKKyAgICAgICAgaWYgKHNpZ25hdHVyZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChTeXN0ZW1Qcm9wZXJ0aWVzLmdldEJvb2xlYW4oInJvLnNlY3VyZSIsIGZhbHNlKSkgeworICAgICAgICAgICAgYm9vbGVhbiBzaWduYXR1cmVNYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChTaWduYXR1cmUgc2lnbmF0dXJlIDogc2lnbmF0dXJlcykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0lHTkFUVVJFUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoU0lHTkFUVVJFU1tpXS5lcXVhbHMoc2lnbmF0dXJlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlTWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNpZ25hdHVyZU1hdGNoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLwogICAgIFN0cmluZyBnZXRQbHVnaW5zQVBLTmFtZShTdHJpbmcgcGx1Z2luTGliKSB7CiAKICAgICAgICAgLy8gYmFzaWMgZXJyb3IgY2hlY2tpbmcgb24gaW5wdXQgcGFyYW1zCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvU2VsZWN0QWN0aW9uTW9kZUNhbGxiYWNrLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvU2VsZWN0QWN0aW9uTW9kZUNhbGxiYWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y5MTkwMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9TZWxlY3RBY3Rpb25Nb2RlQ2FsbGJhY2suamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQnJvd3NlcjsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworY2xhc3MgU2VsZWN0QWN0aW9uTW9kZUNhbGxiYWNrIGltcGxlbWVudHMgQWN0aW9uTW9kZS5DYWxsYmFjayB7CisgICAgcHJpdmF0ZSBXZWJWaWV3IG1XZWJWaWV3OworICAgIHByaXZhdGUgVmlldyBtVGl0bGVCYXI7CisgICAgcHJpdmF0ZSBBY3Rpb25Nb2RlIG1BY3Rpb25Nb2RlOworCisgICAgdm9pZCBzZXRXZWJWaWV3KFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtV2ViVmlldyA9IHdlYlZpZXc7CisgICAgfQorCisgICAgdm9pZCBzZXRUaXRsZUJhcihWaWV3IHYpIHsgbVRpdGxlQmFyID0gdjsgfQorCisgICAgdm9pZCBmaW5pc2goKSB7CisgICAgICAgIG1BY3Rpb25Nb2RlLmZpbmlzaCgpOworICAgIH0KKworICAgIC8vIEFjdGlvbk1vZGUuQ2FsbGJhY2sgaW1wbGVtZW50YXRpb24KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICBtb2RlLmdldE1lbnVJbmZsYXRlcigpLmluZmxhdGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5tZW51LndlYnZpZXdfY29weSwKKyAgICAgICAgICAgICAgICBtZW51KTsKKyAgICAgICAgbW9kZS5zZXRUaXRsZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy50ZXh0U2VsZWN0aW9uQ0FCVGl0bGUpOworICAgICAgICBtQWN0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25BY3Rpb25JdGVtQ2xpY2tlZChBY3Rpb25Nb2RlIG1vZGUsIE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgc3dpdGNoKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKKyAgICAgICAgICAgIGNhc2UgYW5kcm9pZC5SLmlkLmNvcHk6CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuY29weVNlbGVjdGlvbigpOworICAgICAgICAgICAgICAgIG1vZGUuZmluaXNoKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5zaGFyZToKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uID0gbVdlYlZpZXcuZ2V0U2VsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgQnJvd3Nlci5zZW5kU3RyaW5nKG1XZWJWaWV3LmdldENvbnRleHQoKSwgc2VsZWN0aW9uKTsKKyAgICAgICAgICAgICAgICBtb2RlLmZpbmlzaCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuc2VsZWN0X2FsbDoKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5zZWxlY3RBbGwoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmZpbmQ6CisgICAgICAgICAgICAgICAgU3RyaW5nIHNlbD0gbVdlYlZpZXcuZ2V0U2VsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgbW9kZS5maW5pc2goKTsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5zaG93RmluZERpYWxvZyhzZWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSkgeworICAgICAgICBpZiAobVRpdGxlQmFyICE9IG51bGwpIG1XZWJWaWV3LnNldEVtYmVkZGVkVGl0bGVCYXIobVRpdGxlQmFyKTsKKyAgICAgICAgbVdlYlZpZXcuc2VsZWN0aW9uRG9uZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9VUkxVdGlsLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvVVJMVXRpbC5qYXZhCmluZGV4IDdjNWYyYjAuLmMxMzE5ZTUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9VUkxVdGlsLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1VSTFV0aWwuamF2YQpAQCAtNDcsNyArNDcsNyBAQAogICAgICAgICBTdHJpbmcgcmV0VmFsID0gaW5Vcmw7CiAgICAgICAgIFdlYkFkZHJlc3Mgd2ViQWRkcmVzczsKIAotICAgICAgICBMb2cudihMT0dUQUcsICJndWVzc1VSTCBiZWZvcmUgcXVldWVSZXF1ZXN0OiAiICsgaW5VcmwpOworICAgICAgICBpZiAoRGVidWdGbGFncy5VUkxfVVRJTCkgTG9nLnYoTE9HVEFHLCAiZ3Vlc3NVUkwgYmVmb3JlIHF1ZXVlUmVxdWVzdDogIiArIGluVXJsKTsKIAogICAgICAgICBpZiAoaW5VcmwubGVuZ3RoKCkgPT0gMCkgcmV0dXJuIGluVXJsOwogICAgICAgICBpZiAoaW5Vcmwuc3RhcnRzV2l0aCgiYWJvdXQ6IikpIHJldHVybiBpblVybDsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJDaHJvbWVDbGllbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJDaHJvbWVDbGllbnQuamF2YQppbmRleCA5ZjY0MmMwLi5iMmJhN2UyMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkNocm9tZUNsaWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJDaHJvbWVDbGllbnQuamF2YQpAQCAtMzE0LDI4ICszMTQsMjAgQEAKICAgICAvKioKICAgICAgKiBUZWxsIHRoZSBjbGllbnQgdG8gb3BlbiBhIGZpbGUgY2hvb3Nlci4KICAgICAgKiBAcGFyYW0gdXBsb2FkRmlsZSBBIFZhbHVlQ2FsbGJhY2sgdG8gc2V0IHRoZSBVUkkgb2YgdGhlIGZpbGUgdG8gdXBsb2FkLgotICAgICAqICAgICAgb25SZWNlaXZlVmFsdWUgbXVzdCBiZSBjYWxsZWQgdG8gd2FrZSB1cCB0aGUgdGhyZWFkLgorICAgICAqICAgICAgb25SZWNlaXZlVmFsdWUgbXVzdCBiZSBjYWxsZWQgdG8gd2FrZSB1cCB0aGUgdGhyZWFkLmEKKyAgICAgKiBAcGFyYW0gYWNjZXB0VHlwZSBUaGUgdmFsdWUgb2YgdGhlICdhY2NlcHQnIGF0dHJpYnV0ZSBvZiB0aGUgaW5wdXQgdGFnCisgICAgICogICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWxlIHBpY2tlci4KICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9wZW5GaWxlQ2hvb3NlcihWYWx1ZUNhbGxiYWNrPFVyaT4gdXBsb2FkRmlsZSkgeworICAgIHB1YmxpYyB2b2lkIG9wZW5GaWxlQ2hvb3NlcihWYWx1ZUNhbGxiYWNrPFVyaT4gdXBsb2FkRmlsZSwgU3RyaW5nIGFjY2VwdFR5cGUpIHsKICAgICAgICAgdXBsb2FkRmlsZS5vblJlY2VpdmVWYWx1ZShudWxsKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUZWxsIHRoZSBjbGllbnQgdGhhdCB0aGUgc2VsZWN0aW9uIGhhcyBiZWVuIGluaXRpYXRlZC4KKyAgICAgKiBUZWxsIHRoZSBjbGllbnQgdGhhdCB0aGUgcGFnZSBiZWluZyB2aWV3ZWQgaXMgd2ViIGFwcCBjYXBhYmxlLAorICAgICAqIGkuZS4gaGFzIHNwZWNpZmllZCB0aGUgZnVsbHNjcmVlbi13ZWItYXBwLWNhcGFibGUgbWV0YSB0YWcuCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblNlbGVjdGlvblN0YXJ0KFdlYlZpZXcgdmlldykgewotICAgICAgICAvLyBCeSBkZWZhdWx0IHdlIGNhbmNlbCB0aGUgc2VsZWN0aW9uIGFnYWluLCB0aHVzIGRpc2FibGluZwotICAgICAgICAvLyB0ZXh0IHNlbGVjdGlvbiB1bmxlc3MgdGhlIGNocm9tZSBjbGllbnQgc3VwcG9ydHMgaXQuCi0gICAgICAgIHZpZXcubm90aWZ5U2VsZWN0RGlhbG9nRGlzbWlzc2VkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVsbCB0aGUgY2xpZW50IHRoYXQgdGhlIHNlbGVjdGlvbiBoYXMgYmVlbiBjb3BpZWQgb3IgY2FuY2VsZWQuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblNlbGVjdGlvbkRvbmUoV2ViVmlldyB2aWV3KSB7Ci0gICAgfQorICAgIHB1YmxpYyB2b2lkIHNldEluc3RhbGxhYmxlV2ViQXBwKCkgeyB9CiAKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJIaXN0b3J5SXRlbS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkhpc3RvcnlJdGVtLmphdmEKaW5kZXggNDI4YTU5Yy4uN2MwZTQ3OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkhpc3RvcnlJdGVtLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkhpc3RvcnlJdGVtLmphdmEKQEAgLTE4LDYgKzE4LDkgQEAKIAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKwogLyoqCiAgKiBBIGNvbnZlbmllbmNlIGNsYXNzIGZvciBhY2Nlc3NpbmcgZmllbGRzIGluIGFuIGVudHJ5IGluIHRoZSBiYWNrL2ZvcndhcmQgbGlzdAogICogb2YgYSBXZWJWaWV3LiBFYWNoIFdlYkhpc3RvcnlJdGVtIGlzIGEgc25hcHNob3Qgb2YgdGhlIHJlcXVlc3RlZCBoaXN0b3J5CkBAIC0zOSw4ICs0MiwxMiBAQAogICAgIHByaXZhdGUgQml0bWFwIG1GYXZpY29uOwogICAgIC8vIFRoZSBwcmUtZmxhdHRlbmVkIGRhdGEgdXNlZCBmb3Igc2F2aW5nIHRoZSBzdGF0ZS4KICAgICBwcml2YXRlIGJ5dGVbXSBtRmxhdHRlbmVkRGF0YTsKLSAgICAvLyBUaGUgYXBwbGUtdG91Y2gtaWNvbiB1cmwgZm9yIHVzZSB3aGVuIGFkZGluZyB0aGUgc2l0ZSB0byB0aGUgaG9tZSBzY3JlZW4KLSAgICBwcml2YXRlIFN0cmluZyBtVG91Y2hJY29uVXJsOworICAgIC8vIFRoZSBhcHBsZS10b3VjaC1pY29uIHVybCBmb3IgdXNlIHdoZW4gYWRkaW5nIHRoZSBzaXRlIHRvIHRoZSBob21lIHNjcmVlbiwKKyAgICAvLyBhcyBvYnRhaW5lZCBmcm9tIGEgPGxpbms+IGVsZW1lbnQgaW4gdGhlIHBhZ2UuCisgICAgcHJpdmF0ZSBTdHJpbmcgbVRvdWNoSWNvblVybEZyb21MaW5rOworICAgIC8vIElmIG5vIDxsaW5rPiBpcyBzcGVjaWZpZWQsIHRoaXMgaG9sZHMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlCisgICAgLy8gYXBwbGUtdG91Y2gtaWNvbi4KKyAgICBwcml2YXRlIFN0cmluZyBtVG91Y2hJY29uVXJsU2VydmVyRGVmYXVsdDsKICAgICAvLyBDdXN0b20gY2xpZW50IGRhdGEgdGhhdCBpcyBub3QgZmxhdHRlbmVkIG9yIHJlYWQgYnkgbmF0aXZlIGNvZGUuCiAgICAgcHJpdmF0ZSBPYmplY3QgbUN1c3RvbURhdGE7CiAKQEAgLTEzMiwxMCArMTM5LDI4IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHRvdWNoIGljb24gdXJsLgorICAgICAqIElmIG5vIHRvdWNoIGljb24gPGxpbms+IHRhZyB3YXMgc3BlY2lmaWVkLCByZXR1cm5zCisgICAgICogPGhvc3Q+L2FwcGxlLXRvdWNoLWljb24ucG5nLiBUaGUgRG93bmxvYWRUb3VjaEljb24gY2xhc3MgdGhhdAorICAgICAqIGF0dGVtcHRzIHRvIHJldHJpZXZlIHRoZSB0b3VjaCBpY29uIHdpbGwgaGFuZGxlIHRoZSBjYXNlIHdoZXJlCisgICAgICogdGhhdCBmaWxlIGRvZXMgbm90IGV4aXN0LiBBbiBpY29uIHNldCBieSBhIDxsaW5rPiB0YWcgaXMgYWx3YXlzCisgICAgICogdXNlZCBpbiBwcmVmZXJlbmNlIHRvIGFuIGljb24gc2F2ZWQgb24gdGhlIHNlcnZlci4KICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG91Y2hJY29uVXJsKCkgewotICAgICAgICByZXR1cm4gbVRvdWNoSWNvblVybDsKKyAgICAgICAgaWYgKG1Ub3VjaEljb25VcmxGcm9tTGluayAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbVRvdWNoSWNvblVybEZyb21MaW5rOworICAgICAgICB9IGVsc2UgaWYgKG1Ub3VjaEljb25VcmxTZXJ2ZXJEZWZhdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtVG91Y2hJY29uVXJsU2VydmVyRGVmYXVsdDsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChtT3JpZ2luYWxVcmwpOworICAgICAgICAgICAgbVRvdWNoSWNvblVybFNlcnZlckRlZmF1bHQgPSBuZXcgVVJMKHVybC5nZXRQcm90b2NvbCgpLCB1cmwuZ2V0SG9zdCgpLCB1cmwuZ2V0UG9ydCgpLAorICAgICAgICAgICAgICAgICAgICAiL2FwcGxlLXRvdWNoLWljb24ucG5nIikudG9TdHJpbmcoKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtVG91Y2hJY29uVXJsU2VydmVyRGVmYXVsdDsKICAgICB9CiAKICAgICAvKioKQEAgLTE3MSwxMSArMTk2LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSB0b3VjaCBpY29uIHVybC4KKyAgICAgKiBTZXQgdGhlIHRvdWNoIGljb24gdXJsLiBXaWxsIG5vdCBvdmVyd3JpdGUgYW4gaWNvbiB0aGF0IGhhcyBiZWVuCisgICAgICogc2V0IGFscmVhZHkgZnJvbSBhIDxsaW5rPiB0YWcsIHVubGVzcyB0aGUgbmV3IGljb24gaXMgcHJlY29tcG9zZWQuCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICAvKnBhY2thZ2UqLyB2b2lkIHNldFRvdWNoSWNvblVybChTdHJpbmcgdXJsKSB7Ci0gICAgICAgIG1Ub3VjaEljb25VcmwgPSB1cmw7CisgICAgLypwYWNrYWdlKi8gdm9pZCBzZXRUb3VjaEljb25VcmwoU3RyaW5nIHVybCwgYm9vbGVhbiBwcmVjb21wb3NlZCkgeworICAgICAgICBpZiAocHJlY29tcG9zZWQgfHwgbVRvdWNoSWNvblVybEZyb21MaW5rID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Ub3VjaEljb25VcmxGcm9tTGluayA9IHVybDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlNldHRpbmdzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViU2V0dGluZ3MuamF2YQppbmRleCBkYTBjNjFiLi43YjlhZjViIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViU2V0dGluZ3MuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViU2V0dGluZ3MuamF2YQpAQCAtMTksMTEgKzE5LDEzIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKLWltcG9ydCBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb247CisKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCiAvKioKQEAgLTEwNyw3ICsxMDksNyBAQAogICAgICAqIFVzZSB3aXRoIHtAbGluayAjc2V0Q2FjaGVNb2RlfS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0FEX05PX0NBQ0hFID0gMjsKLSAgICAKKwogICAgIC8qKgogICAgICAqIERvbid0IHVzZSB0aGUgbmV0d29yaywgbG9hZCBmcm9tIGNhY2hlIG9ubHkuCiAgICAgICogVXNlIHdpdGgge0BsaW5rICNzZXRDYWNoZU1vZGV9LgpAQCAtMTc2LDE0ICsxNzgsMjAgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtSmF2YVNjcmlwdENhbk9wZW5XaW5kb3dzQXV0b21hdGljYWxseSA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1Vc2VEb3VibGVUcmVlID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVVzZVdpZGVWaWV3cG9ydCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1Vc2VGaXhlZFZpZXdwb3J0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgbU1heEZpeGVkVmlld3BvcnRXaWR0aCA9IFdlYlZpZXcuREVGQVVMVF9WSUVXUE9SVF9XSURUSDsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtU3VwcG9ydE11bHRpcGxlV2luZG93cyA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1TaHJpbmtzU3RhbmRhbG9uZUltYWdlc1RvRml0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBsb25nICAgICAgICAgICAgbU1heGltdW1EZWNvZGVkSW1hZ2VTaXplID0gMDsgLy8gMCBtZWFucyBkZWZhdWx0CisgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVByaXZhdGVCcm93c2luZ0VuYWJsZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtU3ludGhldGljTGlua3NFbmFibGVkID0gdHJ1ZTsKICAgICAvLyBIVE1MNSBBUEkgZmxhZ3MKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtQXBwQ2FjaGVFbmFibGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbURhdGFiYXNlRW5hYmxlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1Eb21TdG9yYWdlRW5hYmxlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1Xb3JrZXJzRW5hYmxlZCA9IGZhbHNlOyAgLy8gb25seSBhZmZlY3RzIFY4LgogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1HZW9sb2NhdGlvbkVuYWJsZWQgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1YU1NBdWRpdG9yRW5hYmxlZCA9IGZhbHNlOwogICAgIC8vIEhUTUw1IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwogICAgIHByaXZhdGUgbG9uZyAgICAgICAgICAgIG1BcHBDYWNoZU1heFNpemUgPSBMb25nLk1BWF9WQUxVRTsKICAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICBtQXBwQ2FjaGVQYXRoID0gIiI7CkBAIC0xOTksMTUgKzIwNywxNyBAQAogICAgIHByaXZhdGUgUmVuZGVyUHJpb3JpdHkgIG1SZW5kZXJQcmlvcml0eSA9IFJlbmRlclByaW9yaXR5Lk5PUk1BTDsKICAgICBwcml2YXRlIGludCAgICAgICAgICAgICBtT3ZlcnJpZGVDYWNoZU1vZGUgPSBMT0FEX0RFRkFVTFQ7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVNhdmVGb3JtRGF0YSA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUF1dG9GaWxsRW5hYmxlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1TYXZlUGFzc3dvcmQgPSB0cnVlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1MaWdodFRvdWNoRW5hYmxlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1OZWVkSW5pdGlhbEZvY3VzID0gdHJ1ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtTmF2RHVtcCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1TdXBwb3J0Wm9vbSA9IHRydWU7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUJ1aWx0SW5ab29tQ29udHJvbHMgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtRGlzcGxheVpvb21Db250cm9scyA9IHRydWU7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUFsbG93RmlsZUFjY2VzcyA9IHRydWU7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUxvYWRXaXRoT3ZlcnZpZXdNb2RlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVVzZVdlYlZpZXdCYWNrZ3JvdW5kT3ZlcnNjcm9sbEJhY2tncm91bmQgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1FbmFibGVTbW9vdGhUcmFuc2l0aW9uID0gZmFsc2U7CiAKICAgICAvLyBwcml2YXRlIFdlYlNldHRpbmdzLCBub3QgYWNjZXNzaWJsZSBieSB0aGUgaG9zdCBhY3Rpdml0eQogICAgIHN0YXRpYyBwcml2YXRlIGludCAgICAgIG1Eb3VibGVUYXBUb2FzdENvdW50ID0gMzsKQEAgLTI5NywxMyArMzA3LDEzIEBACiAgICAgICAgICAgICAiTW96aWxsYS81LjAgKE1hY2ludG9zaDsgVTsgSW50ZWwgTWFjIE9TIFggMTBfNV83OyBlbi11cykiCiAgICAgICAgICAgICArICIgQXBwbGVXZWJLaXQvNTMwLjE3IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAiCiAgICAgICAgICAgICArICIgU2FmYXJpLzUzMC4xNyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElQSE9ORV9VU0VSQUdFTlQgPSAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVBIT05FX1VTRVJBR0VOVCA9CiAgICAgICAgICAgICAiTW96aWxsYS81LjAgKGlQaG9uZTsgVTsgQ1BVIGlQaG9uZSBPUyAzXzAgbGlrZSBNYWMgT1MgWDsgZW4tdXMpIgogICAgICAgICAgICAgKyAiIEFwcGxlV2ViS2l0LzUyOC4xOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIgogICAgICAgICAgICAgKyAiIE1vYmlsZS83QTM0MSBTYWZhcmkvNTI4LjE2IjsKICAgICBwcml2YXRlIHN0YXRpYyBMb2NhbGUgc0xvY2FsZTsKICAgICBwcml2YXRlIHN0YXRpYyBPYmplY3Qgc0xvY2tGb3JMb2NhbGVTZXR0aW5nczsKLSAgICAKKwogICAgIC8qKgogICAgICAqIFBhY2thZ2UgY29uc3RydWN0b3IgdG8gcHJldmVudCBjbGllbnRzIGZyb20gY3JlYXRpbmcgYSBuZXcgc2V0dGluZ3MKICAgICAgKiBpbnN0YW5jZS4KQEAgLTMxNSw2ICszMjUsMTQgQEAKICAgICAgICAgbURlZmF1bHRUZXh0RW5jb2RpbmcgPSBjb250ZXh0LmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZWZhdWx0X3RleHRfZW5jb2RpbmcpOwogCisgICAgICAgIC8vIERldGVjdCB0YWJsZXQgZGV2aWNlIGZvciBmaXhlZCB2aWV3cG9ydCBtb2RlLgorICAgICAgICBmaW5hbCBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICBmaW5hbCBpbnQgbGFuZHNjYXBlV2lkdGggPSBNYXRoLm1heChtZXRyaWNzLndpZHRoUGl4ZWxzLCBtZXRyaWNzLmhlaWdodFBpeGVscyk7CisgICAgICAgIGZpbmFsIGludCBtaW5UYWJsZXRXaWR0aCA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAorICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5taW5feGxhcmdlX3NjcmVlbl93aWR0aCk7CisgICAgICAgIG1Vc2VGaXhlZFZpZXdwb3J0ID0gKG1ldHJpY3MuZGVuc2l0eSA9PSAxLjBmICYmIGxhbmRzY2FwZVdpZHRoID49IG1pblRhYmxldFdpZHRoKTsKKyAgICAgICAgbU1heEZpeGVkVmlld3BvcnRXaWR0aCA9IChpbnQpIChsYW5kc2NhcGVXaWR0aCAqIDEuMjUpOworCiAgICAgICAgIGlmIChzTG9ja0ZvckxvY2FsZVNldHRpbmdzID09IG51bGwpIHsKICAgICAgICAgICAgIHNMb2NrRm9yTG9jYWxlU2V0dGluZ3MgPSBuZXcgT2JqZWN0KCk7CiAgICAgICAgICAgICBzTG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKQEAgLTMyOCw2ICszNDYsOCBAQAogICAgICAgICAgICAgICAgIGFuZHJvaWQub3MuUHJvY2Vzcy5teVVpZCgpKSAhPSBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQ7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VQVF9MQU5HX0ZPUl9VU19MT0NBTEUgPSAiZW4tVVMiOworCiAgICAgLyoqCiAgICAgICogTG9va3MgYXQgc0xvY2FsZSBhbmQgcmV0dXJucyBjdXJyZW50IEFjY2VwdExhbmd1YWdlIFN0cmluZy4KICAgICAgKiBAcmV0dXJuIEN1cnJlbnQgQWNjZXB0TGFuZ3VhZ2UgU3RyaW5nLgpAQCAtMzM3LDMyICszNTcsNTMgQEAKICAgICAgICAgc3luY2hyb25pemVkKHNMb2NrRm9yTG9jYWxlU2V0dGluZ3MpIHsKICAgICAgICAgICAgIGxvY2FsZSA9IHNMb2NhbGU7CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGxhbmd1YWdlID0gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0gICAgICAgIGlmIChsYW5ndWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKGxhbmd1YWdlKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKTsKLSAgICAgICAgICAgIGlmIChjb3VudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCItIik7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjb3VudHJ5KTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBhZGRMb2NhbGVUb0h0dHBBY2NlcHRMYW5ndWFnZShidWZmZXIsIGxvY2FsZSk7CisKKyAgICAgICAgaWYgKCFMb2NhbGUuVVMuZXF1YWxzKGxvY2FsZSkpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCAiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWxvY2FsZS5lcXVhbHMoTG9jYWxlLlVTKSkgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgIGphdmEudXRpbC5Mb2NhbGUgdXMgPSBMb2NhbGUuVVM7Ci0gICAgICAgICAgICBpZiAodXMuZ2V0TGFuZ3VhZ2UoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCh1cy5nZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9IHVzLmdldENvdW50cnkoKTsKLSAgICAgICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIi0iKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjb3VudHJ5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKEFDQ0VQVF9MQU5HX0ZPUl9VU19MT0NBTEUpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgb2Jzb2xldGUgbGFuZ3VhZ2UgY29kZXMsIGluY2x1ZGluZyBIZWJyZXcvSW5kb25lc2lhbi9ZaWRkaXNoLAorICAgICAqIHRvIG5ldyBzdGFuZGFyZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29udmVydE9ic29sZXRlTGFuZ3VhZ2VDb2RlVG9OZXcoU3RyaW5nIGxhbmdDb2RlKSB7CisgICAgICAgIGlmIChsYW5nQ29kZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIml3Ii5lcXVhbHMobGFuZ0NvZGUpKSB7CisgICAgICAgICAgICAvLyBIZWJyZXcKKyAgICAgICAgICAgIHJldHVybiAiaGUiOworICAgICAgICB9IGVsc2UgaWYgKCJpbiIuZXF1YWxzKGxhbmdDb2RlKSkgeworICAgICAgICAgICAgLy8gSW5kb25lc2lhbgorICAgICAgICAgICAgcmV0dXJuICJpZCI7CisgICAgICAgIH0gZWxzZSBpZiAoImppIi5lcXVhbHMobGFuZ0NvZGUpKSB7CisgICAgICAgICAgICAvLyBZaWRkaXNoCisgICAgICAgICAgICByZXR1cm4gInlpIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFuZ0NvZGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRMb2NhbGVUb0h0dHBBY2NlcHRMYW5ndWFnZShTdHJpbmdCdWlsZGVyIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlKSB7CisgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IGNvbnZlcnRPYnNvbGV0ZUxhbmd1YWdlQ29kZVRvTmV3KGxvY2FsZS5nZXRMYW5ndWFnZSgpKTsKKyAgICAgICAgaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxhbmd1YWdlKTsKKyAgICAgICAgICAgIFN0cmluZyBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKTsKKyAgICAgICAgICAgIGlmIChjb3VudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLSIpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNvdW50cnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogTG9va3MgYXQgc0xvY2FsZSBhbmQgbUNvbnRleHQgYW5kIHJldHVybnMgY3VycmVudCBVc2VyQWdlbnQgU3RyaW5nLgogICAgICAqIEByZXR1cm4gQ3VycmVudCBVc2VyQWdlbnQgU3RyaW5nLgpAQCAtMzgwLDExICs0MjEsMTEgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gIjEuMCIKICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjEuMCIpOwotICAgICAgICB9ICAKKyAgICAgICAgfQogICAgICAgICBidWZmZXIuYXBwZW5kKCI7ICIpOwogICAgICAgICBmaW5hbCBTdHJpbmcgbGFuZ3VhZ2UgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKICAgICAgICAgaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQobGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGNvbnZlcnRPYnNvbGV0ZUxhbmd1YWdlQ29kZVRvTmV3KGxhbmd1YWdlKSk7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9IGxvY2FsZS5nZXRDb3VudHJ5KCk7CiAgICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLSIpOwpAQCAtNDA3LDExICs0NDgsMTMgQEAKICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiBCdWlsZC8iKTsKICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoaWQpOwogICAgICAgICB9CisgICAgICAgIFN0cmluZyBtb2JpbGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRUZXh0KAorICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcud2ViX3VzZXJfYWdlbnRfdGFyZ2V0X2NvbnRlbnQpLnRvU3RyaW5nKCk7CiAgICAgICAgIGZpbmFsIFN0cmluZyBiYXNlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0VGV4dCgKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy53ZWJfdXNlcl9hZ2VudCkudG9TdHJpbmcoKTsKLSAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoYmFzZSwgYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoYmFzZSwgYnVmZmVyLCBtb2JpbGUpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEVuYWJsZXMgZHVtcGluZyB0aGUgcGFnZXMgbmF2aWdhdGlvbiBjYWNoZSB0byBhIHRleHQgZmlsZS4KICAgICAgKi8KQEAgLTQyNyw2ICs0NzAsMjEgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBJZiBXZWJWaWV3IG9ubHkgc3VwcG9ydHMgdG91Y2gsIGEgZGlmZmVyZW50IG5hdmlnYXRpb24gbW9kZWwgd2lsbCBiZQorICAgICAqIGFwcGxpZWQuIE90aGVyd2lzZSwgdGhlIG5hdmlnYXRpb24gdG8gc3VwcG9ydCBib3RoIHRvdWNoIGFuZCBrZXlib2FyZAorICAgICAqIHdpbGwgYmUgdXNlZC4KKyAgICAgKiBAaGlkZQorICAgIHB1YmxpYyB2b2lkIHNldFN1cHBvcnRUb3VjaE9ubHkoYm9vbGVhbiB0b3VjaE9ubHkpIHsKKyAgICAgICAgbVN1cHBvcnRUb3VuY2hPbmx5ID0gdG91Y2hPbmx5OworICAgIH0KKyAgICAgKi8KKworICAgIGJvb2xlYW4gc3VwcG9ydFRvdWNoT25seSgpIHsKKyAgICAgICAgLy8gZm9yIGRlYnVnIG9ubHksIHVzZSBtTGlnaHRUb3VjaEVuYWJsZWQgZm9yIG1TdXBwb3J0VG91bmNoT25seQorICAgICAgICByZXR1cm4gbUxpZ2h0VG91Y2hFbmFibGVkOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldCB3aGV0aGVyIHRoZSBXZWJWaWV3IHN1cHBvcnRzIHpvb20KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTdXBwb3J0Wm9vbShib29sZWFuIHN1cHBvcnQpIHsKQEAgLTQ0OCwxNCArNTA2LDM0IEBACiAgICAgICAgIG1CdWlsdEluWm9vbUNvbnRyb2xzID0gZW5hYmxlZDsKICAgICAgICAgbVdlYlZpZXcudXBkYXRlTXVsdGlUb3VjaFN1cHBvcnQobUNvbnRleHQpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgem9vbSBtZWNoYW5pc20gYnVpbHQgaW50byBXZWJWaWV3IGlzIGJlaW5nIHVzZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0QnVpbHRJblpvb21Db250cm9scygpIHsKICAgICAgICAgcmV0dXJuIG1CdWlsdEluWm9vbUNvbnRyb2xzOwogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGUgb24gc2NyZWVuIHpvb20gYnV0dG9ucyBhcmUgdXNlZC4KKyAgICAgKiBBIGNvbWJpbmF0aW9uIG9mIGJ1aWx0IGluIHpvb20gY29udHJvbHMgZW5hYmxlZAorICAgICAqIGFuZCBvbiBzY3JlZW4gem9vbSBjb250cm9scyBkaXNhYmxlZCBhbGxvd3MgZm9yIHBpbmNoIHRvIHpvb20KKyAgICAgKiB0byB3b3JrIHdpdGhvdXQgdGhlIG9uIHNjcmVlbiBjb250cm9scworICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheVpvb21Db250cm9scyhib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbURpc3BsYXlab29tQ29udHJvbHMgPSBlbmFibGVkOworICAgICAgICBtV2ViVmlldy51cGRhdGVNdWx0aVRvdWNoU3VwcG9ydChtQ29udGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBvbiBzY3JlZW4gem9vbSBidXR0b25zIGFyZSBiZWluZyB1c2VkLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGlzcGxheVpvb21Db250cm9scygpIHsKKyAgICAgICAgcmV0dXJuIG1EaXNwbGF5Wm9vbUNvbnRyb2xzOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIGZpbGUgYWNjZXNzIHdpdGhpbiBXZWJWaWV3LiBGaWxlIGFjY2VzcyBpcyBlbmFibGVkIGJ5CiAgICAgICogZGVmYXVsdC4KQEAgLTQ4NiwyMCArNTY0LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHdoZXRoZXIgdGhlIFdlYlZpZXcgdXNlcyBpdHMgYmFja2dyb3VuZCBmb3Igb3ZlciBzY3JvbGwgYmFja2dyb3VuZC4KLSAgICAgKiBJZiB0cnVlLCBpdCB3aWxsIHVzZSB0aGUgV2ViVmlldydzIGJhY2tncm91bmQuIElmIGZhbHNlLCBpdCB3aWxsIHVzZSBhbgotICAgICAqIGludGVybmFsIHBhdHRlcm4uIERlZmF1bHQgaXMgdHJ1ZS4KKyAgICAgKiBTZXQgd2hldGhlciB0aGUgV2ViVmlldyB3aWxsIGVuYWJsZSBzbW9vdGggdHJhbnNpdGlvbiB3aGlsZSBwYW5uaW5nIG9yCisgICAgICogem9vbWluZy4gSWYgaXQgaXMgdHJ1ZSwgV2ViVmlldyB3aWxsIGNob29zZSBhIHNvbHV0aW9uIHRvIG1heGltaXplIHRoZQorICAgICAqIHBlcmZvcm1hbmNlLiBlLmcuIHRoZSBXZWJWaWV3J3MgY29udGVudCBtYXkgbm90IGJlIHVwZGF0ZWQgZHVyaW5nIHRoZQorICAgICAqIHRyYW5zaXRpb24uIElmIGl0IGlzIGZhbHNlLCBXZWJWaWV3IHdpbGwga2VlcCBpdHMgZmlkZWxpdHkuIFRoZSBkZWZhdWx0CisgICAgICogdmFsdWUgaXMgZmFsc2UuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlV2ViVmlld0JhY2tncm91bmRGb3JPdmVyc2Nyb2xsQmFja2dyb3VuZChib29sZWFuIHZpZXcpIHsKLSAgICAgICAgbVVzZVdlYlZpZXdCYWNrZ3JvdW5kT3ZlcnNjcm9sbEJhY2tncm91bmQgPSB2aWV3OworICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZVNtb290aFRyYW5zaXRpb24oYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgbUVuYWJsZVNtb290aFRyYW5zaXRpb24gPSBlbmFibGU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgV2ViVmlldyB1c2VzIFdlYlZpZXcncyBiYWNrZ3JvdW5kIGluc3RlYWQgb2YKLSAgICAgKiBpbnRlcm5hbCBwYXR0ZXJuIGZvciBvdmVyIHNjcm9sbCBiYWNrZ3JvdW5kLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgV2ViVmlldyBlbmFibGVzIHNtb290aCB0cmFuc2l0aW9uIHdoaWxlIHBhbm5pbmcgb3IKKyAgICAgKiB6b29taW5nLgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldFVzZVdlYlZpZXdCYWNrZ3JvdW5kRm9yT3ZlcnNjcm9sbEJhY2tncm91bmQoKSB7Ci0gICAgICAgIHJldHVybiBtVXNlV2ViVmlld0JhY2tncm91bmRPdmVyc2Nyb2xsQmFja2dyb3VuZDsKKyAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVTbW9vdGhUcmFuc2l0aW9uKCkgeworICAgICAgICByZXR1cm4gbUVuYWJsZVNtb290aFRyYW5zaXRpb247CiAgICAgfQogCiAgICAgLyoqCkBAIC01MTcsNiArNTk3LDIwIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvRmlsbEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1BdXRvRmlsbEVuYWJsZWQgPSBlbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0QXV0b0ZpbGxFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gbUF1dG9GaWxsRW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiAgU3RvcmUgd2hldGhlciB0aGUgV2ViVmlldyBpcyBzYXZpbmcgcGFzc3dvcmQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2F2ZVBhc3N3b3JkKGJvb2xlYW4gc2F2ZSkgewpAQCAtOTg3LDYgKzEwODEsNyBAQAogICAgICAgICBpZiAobUJsb2NrTmV0d29ya0xvYWRzICE9IGZsYWcpIHsKICAgICAgICAgICAgIG1CbG9ja05ldHdvcmtMb2FkcyA9IGZsYWc7CiAgICAgICAgICAgICB2ZXJpZnlOZXR3b3JrQWNjZXNzKCk7CisgICAgICAgICAgICBwb3N0U3luYygpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDAyLDggKzEwOTcsOCBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeU5ldHdvcmtBY2Nlc3MoKSB7CiAgICAgICAgIGlmICghbUJsb2NrTmV0d29ya0xvYWRzKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRleHQuY2hlY2tQZXJtaXNzaW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiLCAKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5vcy5Qcm9jZXNzLm15UGlkKCksIGFuZHJvaWQub3MuUHJvY2Vzcy5teVVpZCgpKSAhPSAKKyAgICAgICAgICAgIGlmIChtQ29udGV4dC5jaGVja1Blcm1pc3Npb24oImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQub3MuUHJvY2Vzcy5teVBpZCgpLCBhbmRyb2lkLm9zLlByb2Nlc3MubXlVaWQoKSkgIT0KICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgKCJQZXJtaXNzaW9uIGRlbmllZCAtICIgKwpAQCAtMTAyOSw2ICsxMTI0LDcgQEAKICAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mCiAgICAgICogICAgICAgICAgICAge0BsaW5rICNzZXRQbHVnaW5TdGF0ZX0KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQbHVnaW5zRW5hYmxlZChib29sZWFuIGZsYWcpIHsKICAgICAgICAgc2V0UGx1Z2luU3RhdGUoUGx1Z2luU3RhdGUuT04pOwogICAgIH0KQEAgLTExOTksNiArMTI5NSwxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciBYU1MgQXVkaXRvciBpcyBlbmFibGVkLgorICAgICAqIEBwYXJhbSBmbGFnIFdoZXRoZXIgWFNTIEF1ZGl0b3Igc2hvdWxkIGJlIGVuYWJsZWQuCisgICAgICogQGhpZGUgT25seSB1c2VkIGJ5IExheW91dFRlc3RDb250cm9sbGVyLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRYU1NBdWRpdG9yRW5hYmxlZChib29sZWFuIGZsYWcpIHsKKyAgICAgICAgaWYgKG1YU1NBdWRpdG9yRW5hYmxlZCAhPSBmbGFnKSB7CisgICAgICAgICAgICBtWFNTQXVkaXRvckVuYWJsZWQgPSBmbGFnOworICAgICAgICAgICAgcG9zdFN5bmMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybiB0cnVlIGlmIGphdmFzY3JpcHQgaXMgZW5hYmxlZC4gPGI+Tm90ZTogVGhlIGRlZmF1bHQgaXMgZmFsc2UuPC9iPgogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBqYXZhc2NyaXB0IGlzIGVuYWJsZWQuCiAgICAgICovCkBAIC0xMjExLDYgKzEzMTksNyBAQAogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBwbHVnaW5zIGFyZSBlbmFibGVkLgogICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHtAbGluayAjZ2V0UGx1Z2luU3RhdGV9CiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZ2V0UGx1Z2luc0VuYWJsZWQoKSB7CiAgICAgICAgIHJldHVybiBtUGx1Z2luU3RhdGUgPT0gUGx1Z2luU3RhdGUuT047CiAgICAgfQpAQCAtMTI4NCw3ICsxMzkzLDcgQEAKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VXNlckFnZW50U3RyaW5nKFN0cmluZyB1YSkgewogICAgICAgICBpZiAodWEgPT0gbnVsbCB8fCB1YS5sZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQoc0xvY2tGb3JMb2NhbGVTZXR0aW5ncykgewotICAgICAgICAgICAgICAgIExvY2FsZSBjdXJyZW50TG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsgCisgICAgICAgICAgICAgICAgTG9jYWxlIGN1cnJlbnRMb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgIGlmICghc0xvY2FsZS5lcXVhbHMoY3VycmVudExvY2FsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgc0xvY2FsZSA9IGN1cnJlbnRMb2NhbGU7CiAgICAgICAgICAgICAgICAgICAgIG1BY2NlcHRMYW5ndWFnZSA9IGdldEN1cnJlbnRBY2NlcHRMYW5ndWFnZSgpOwpAQCAtMTMzOSwxMSArMTQ0OCwxMSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBtQWNjZXB0TGFuZ3VhZ2U7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogVGVsbCB0aGUgV2ViVmlldyB3aGV0aGVyIGl0IG5lZWRzIHRvIHNldCBhIG5vZGUgdG8gaGF2ZSBmb2N1cyB3aGVuCiAgICAgICoge0BsaW5rIFdlYlZpZXcjcmVxdWVzdEZvY3VzKGludCwgYW5kcm9pZC5ncmFwaGljcy5SZWN0KX0gaXMgY2FsbGVkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGZsYWcKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXROZWVkSW5pdGlhbEZvY3VzKGJvb2xlYW4gZmxhZykgewpAQCAtMTM3MCw3ICsxNDc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVyLlBSSU9SSVRZKSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBPdmVycmlkZSB0aGUgd2F5IHRoZSBjYWNoZSBpcyB1c2VkLiBUaGUgd2F5IHRoZSBjYWNoZSBpcyB1c2VkIGlzIGJhc2VkCiAgICAgICogb24gdGhlIG5hdmlnYXRpb24gb3B0aW9uLiBGb3IgYSBub3JtYWwgcGFnZSBsb2FkLCB0aGUgY2FjaGUgaXMgY2hlY2tlZApAQCAtMTM4NCw3ICsxNDkzLDcgQEAKICAgICAgICAgICAgIG1PdmVycmlkZUNhY2hlTW9kZSA9IG1vZGU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc2V0dGluZyBmb3Igb3ZlcnJpZGluZyB0aGUgY2FjaGUgbW9kZS4gRm9yIGEgZnVsbAogICAgICAqIGRlc2NyaXB0aW9uLCBzZWUgdGhlIHtAbGluayAjc2V0Q2FjaGVNb2RlKGludCl9IGZ1bmN0aW9uLgpAQCAtMTM5Miw3ICsxNTAxLDcgQEAKICAgICBwdWJsaWMgaW50IGdldENhY2hlTW9kZSgpIHsKICAgICAgICAgcmV0dXJuIG1PdmVycmlkZUNhY2hlTW9kZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBJZiBzZXQsIHdlYmtpdCBhbHRlcm5hdGVseSBzaHJpbmtzIGFuZCBleHBhbmRzIGltYWdlcyB2aWV3ZWQgb3V0c2lkZQogICAgICAqIG9mIGFuIEhUTUwgcGFnZSB0byBmaXQgdGhlIHNjcmVlbi4gVGhpcyBjb25mbGljdHMgd2l0aCBhdHRlbXB0cyBieQpAQCAtMTQwNyw2ICsxNTE2LDU4IEBACiAgICAgICAgIH0KICAgICAgfQogCisgICAgLyoqCisgICAgICogU3BlY2lmeSB0aGUgbWF4aW11bSBkZWNvZGVkIGltYWdlIHNpemUuIFRoZSBkZWZhdWx0IGlzCisgICAgICogMiBtZWdzIGZvciBzbWFsbCBtZW1vcnkgZGV2aWNlcyBhbmQgOCBtZWdzIGZvciBsYXJnZSBtZW1vcnkgZGV2aWNlcy4KKyAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgbWF4aW11bSBkZWNvZGVkIHNpemUsIG9yIHplcm8gdG8gc2V0IHRvIHRoZSBkZWZhdWx0LgorICAgICAqIEBoaWRlIHBlbmRpbmcgYXBpIGNvdW5jaWwgYXBwcm92YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtRGVjb2RlZEltYWdlU2l6ZShsb25nIHNpemUpIHsKKyAgICAgICAgaWYgKG1NYXhpbXVtRGVjb2RlZEltYWdlU2l6ZSAhPSBzaXplKSB7CisgICAgICAgICAgICBtTWF4aW11bURlY29kZWRJbWFnZVNpemUgPSBzaXplOworICAgICAgICAgICAgcG9zdFN5bmMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0byB1c2UgZml4ZWQgdmlld3BvcnQuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBib29sZWFuIGdldFVzZUZpeGVkVmlld3BvcnQoKSB7CisgICAgICAgIHJldHVybiBtVXNlRml4ZWRWaWV3cG9ydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIG1heGltdW0gZml4ZWQgdmlld3BvcnQgd2lkdGguCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBpbnQgZ2V0TWF4Rml4ZWRWaWV3cG9ydFdpZHRoKCkgeworICAgICAgICByZXR1cm4gbU1heEZpeGVkVmlld3BvcnRXaWR0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgcHJpdmF0ZSBicm93c2luZyBpcyBlbmFibGVkLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbiBpc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBtUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgcHJpdmF0ZSBicm93c2luZyBpcyBlbmFibGVkLgorICAgICAqIEBwYXJhbSBmbGFnIFdoZXRoZXIgcHJpdmF0ZSBicm93c2luZyBzaG91bGQgYmUgZW5hYmxlZC4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCB2b2lkIHNldFByaXZhdGVCcm93c2luZ0VuYWJsZWQoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIGlmIChtUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCAhPSBmbGFnKSB7CisgICAgICAgICAgICBtUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCA9IGZsYWc7CisgICAgICAgICAgICBwb3N0U3luYygpOworICAgICAgICB9CisgICAgfQorCisgICAgc3luY2hyb25pemVkIHZvaWQgc2V0U3ludGhldGljTGlua3NFbmFibGVkKGJvb2xlYW4gZmxhZykgeworICAgICAgICBpZiAobVN5bnRoZXRpY0xpbmtzRW5hYmxlZCAhPSBmbGFnKSB7CisgICAgICAgICAgICBtU3ludGhldGljTGlua3NFbmFibGVkID0gZmxhZzsKKyAgICAgICAgICAgIHBvc3RTeW5jKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpbnQgZ2V0RG91YmxlVGFwVG9hc3RDb3VudCgpIHsKICAgICAgICAgcmV0dXJuIG1Eb3VibGVUYXBUb2FzdENvdW50OwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJUZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlRleHRWaWV3LmphdmEKaW5kZXggMTlhYmVjMS4uMWFmZjE3MCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlRleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlRleHRWaWV3LmphdmEKQEAgLTI4LDYgKzI4LDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuSW5wdXRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dDsKIGltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKQEAgLTQ2LDYgKzQ3LDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dENvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWJzb2x1dGVMYXlvdXQuTGF5b3V0UGFyYW1zOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKQEAgLTEwOSwxNiArMTExLDM1IEBACiAgICAgLy8gRklYTUU6IFRoaXMgY2FuIGJlIHJlcGxhY2VkIHdpdGggVGV4dFZpZXcuTk9fRklMVEVSUyBpZiB0aGF0CiAgICAgLy8gaXMgbWFkZSBwdWJsaWMvcHJvdGVjdGVkLgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElucHV0RmlsdGVyW10gTk9fRklMVEVSUyA9IG5ldyBJbnB1dEZpbHRlclswXTsKKyAgICAvLyBGb3Iga2VlcGluZyB0cmFjayBvZiB0aGUgZmFjdCB0aGF0IHRoZSBkZWxldGUga2V5IHdhcyBwcmVzc2VkLCBzbworICAgIC8vIHdlIGNhbiBzaW1wbHkgcGFzcyBhIGRlbGV0ZSBrZXkgaW5zdGVhZCBvZiBjYWxsaW5nIGRlbGV0ZVNlbGVjdGlvbi4KKyAgICBwcml2YXRlIGJvb2xlYW4gbUdvdERlbGV0ZTsKKyAgICBwcml2YXRlIGludCBtRGVsU2VsU3RhcnQ7CisgICAgcHJpdmF0ZSBpbnQgbURlbFNlbEVuZDsKKworICAgIC8vIEtlZXAgaW4gc3luYyB3aXRoIG5hdGl2ZSBjb25zdGFudCBpbgorICAgIC8vIGV4dGVybmFsL3dlYmtpdC9XZWJLaXQvYW5kcm9pZC9XZWJDb3JlU3VwcG9ydC9hdXRvZmlsbC9XZWJBdXRvRmlsbC5jcHAKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgRk9STV9OT1RfQVVUT0ZJTExBQkxFID0gLTE7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUF1dG9GaWxsYWJsZTsgLy8gSXMgdGhpcyB0ZXh0dmlldyBwYXJ0IG9mIGFuIGF1dG9maWxsYWJsZSBmb3JtPworICAgIHByaXZhdGUgaW50IG1RdWVyeUlkOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgbmV3IFdlYlRleHRWaWV3LgogICAgICAqIEBwYXJhbSAgIGNvbnRleHQgVGhlIENvbnRleHQgZm9yIHRoaXMgV2ViVGV4dFZpZXcuCiAgICAgICogQHBhcmFtICAgd2ViVmlldyBUaGUgV2ViVmlldyB0aGF0IGNyZWF0ZWQgdGhpcy4KICAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIFdlYlRleHRWaWV3KENvbnRleHQgY29udGV4dCwgV2ViVmlldyB3ZWJWaWV3KSB7CisgICAgLyogcGFja2FnZSAqLyBXZWJUZXh0VmlldyhDb250ZXh0IGNvbnRleHQsIFdlYlZpZXcgd2ViVmlldywgaW50IGF1dG9GaWxsUXVlcnlJZCkgewogICAgICAgICBzdXBlcihjb250ZXh0LCBudWxsLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIud2ViVGV4dFZpZXdTdHlsZSk7CiAgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKICAgICAgICAgbU1heExlbmd0aCA9IC0xOworICAgICAgICBzZXRBdXRvRmlsbGFibGUoYXV0b0ZpbGxRdWVyeUlkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvRmlsbGFibGUoaW50IHF1ZXJ5SWQpIHsKKyAgICAgICAgbUF1dG9GaWxsYWJsZSA9IG1XZWJWaWV3LmdldFNldHRpbmdzKCkuZ2V0QXV0b0ZpbGxFbmFibGVkKCkKKyAgICAgICAgICAgICAgICAmJiAocXVlcnlJZCAhPSBGT1JNX05PVF9BVVRPRklMTEFCTEUpOworICAgICAgICBtUXVlcnlJZCA9IHF1ZXJ5SWQ7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNTIsMTMgKzE3MywyMiBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgU3Bhbm5hYmxlIHRleHQgPSAoU3Bhbm5hYmxlKSBnZXRUZXh0KCk7Ci0gICAgICAgIGludCBvbGRMZW5ndGggPSB0ZXh0Lmxlbmd0aCgpOworICAgICAgICBpbnQgb2xkU3RhcnQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQodGV4dCk7CisgICAgICAgIGludCBvbGRFbmQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKHRleHQpOwogICAgICAgICAvLyBOb3JtYWxseSB0aGUgZGVsZXRlIGtleSdzIGRvbSBldmVudHMgYXJlIHNlbnQgdmlhIG9uVGV4dENoYW5nZWQuCi0gICAgICAgIC8vIEhvd2V2ZXIsIGlmIHRoZSBsZW5ndGggaXMgemVybywgdGhlIHRleHQgZGlkIG5vdCBjaGFuZ2UsIHNvIHdlCi0gICAgICAgIC8vIGdvIGFoZWFkIGFuZCBwYXNzIHRoZSBrZXkgZG93biBpbW1lZGlhdGVseS4KLSAgICAgICAgaWYgKEtleUV2ZW50LktFWUNPREVfREVMID09IGtleUNvZGUgJiYgMCA9PSBvbGRMZW5ndGgpIHsKLSAgICAgICAgICAgIHNlbmREb21FdmVudChldmVudCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgLy8gSG93ZXZlciwgaWYgdGhlIGN1cnNvciBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWVsZCwgd2hpY2gKKyAgICAgICAgLy8gaW5jbHVkZXMgdGhlIGNhc2Ugd2hlcmUgaXQgaGFzIHplcm8gbGVuZ3RoLCB0aGVuIHRoZSB0ZXh0IGlzIG5vdAorICAgICAgICAvLyBjaGFuZ2VkLCBzbyBzZW5kIHRoZSBldmVudHMgaW1tZWRpYXRlbHkuCisgICAgICAgIGlmIChLZXlFdmVudC5LRVlDT0RFX0RFTCA9PSBrZXlDb2RlKSB7CisgICAgICAgICAgICBpZiAob2xkU3RhcnQgPT0gMCAmJiBvbGRFbmQgPT0gMCkgeworICAgICAgICAgICAgICAgIHNlbmREb21FdmVudChldmVudCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZG93bikgeworICAgICAgICAgICAgICAgIG1Hb3REZWxldGUgPSB0cnVlOworICAgICAgICAgICAgICAgIG1EZWxTZWxTdGFydCA9IG9sZFN0YXJ0OworICAgICAgICAgICAgICAgIG1EZWxTZWxFbmQgPSBvbGRFbmQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoKG1TaW5nbGUgJiYgS2V5RXZlbnQuS0VZQ09ERV9FTlRFUiA9PSBrZXlDb2RlKSkgewpAQCAtMTk2LDkgKzIyNiw4IEBACiAgICAgICAgIGlmIChnZXRMYXlvdXQoKSA9PSBudWxsKSB7CiAgICAgICAgICAgICBtZWFzdXJlKG1XaWR0aFNwZWMsIG1IZWlnaHRTcGVjKTsKICAgICAgICAgfQotICAgICAgICBpbnQgb2xkU3RhcnQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQodGV4dCk7Ci0gICAgICAgIGludCBvbGRFbmQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKHRleHQpOwogCisgICAgICAgIGludCBvbGRMZW5ndGggPSB0ZXh0Lmxlbmd0aCgpOwogICAgICAgICBib29sZWFuIG1heGVkT3V0ID0gbU1heExlbmd0aCAhPSAtMSAmJiBvbGRMZW5ndGggPT0gbU1heExlbmd0aDsKICAgICAgICAgLy8gSWYgd2UgYXJlIGF0IG1heCBsZW5ndGgsIGFuZCB0aGVyZSBpcyBhIHNlbGVjdGlvbiByYXRoZXIgdGhhbiBhCiAgICAgICAgIC8vIGN1cnNvciwgd2UgbmVlZCB0byBzdG9yZSB0aGUgdGV4dCB0byBjb21wYXJlIGxhdGVyLCBzaW5jZSB0aGUga2V5CkBAIC0zMDAsNiArMzI5LDMzIEBACiAgICAgICAgIHJldHVybiBjb25uZWN0aW9uOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEluIGdlbmVyYWwsIFRleHRWaWV3IG1ha2VzIGEgY2FsbCB0byBJbnB1dE1ldGhvZE1hbmFnZXIudXBkYXRlU2VsZWN0aW9uCisgICAgICogaW4gb25EcmF3LiAgSG93ZXZlciwgaW4gdGhlIGdlbmVyYWwgY2FzZSBvZiBXZWJUZXh0Vmlldywgd2UgZG8gbm90IGRyYXcuCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFdlYlZpZXcub25EcmF3IHRvIHRha2UgY2FyZSBvZiB0aGUgcGFydCB0aGF0CisgICAgICogbmVlZHMgdG8gYmUgY2FsbGVkLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBvbkRyYXdTdWJzdGl0dXRlKCkgeworICAgICAgICBpZiAoIXdpbGxOb3REcmF3KCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBXZWJUZXh0VmlldyBpcyBzZXQgdG8gZHJhdywgc3VjaCBhcyBpbiB0aGUgY2FzZSBvZiBhCisgICAgICAgICAgICAvLyBwYXNzd29yZCwgb25EcmF3IGNhbGxzIHVwZGF0ZVNlbGVjdGlvbigpLCBzbyB0aGlzIGNvZGUgcGF0aCBpcworICAgICAgICAgICAgLy8gdW5uZWNlc3NhcnkuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhpcyBjb2RlIGlzIGNvcGllZCBmcm9tIFRleHRWaWV3Lm9uRHJhdygpLiAgVGhhdCBjb2RlIGRvZXMgbm90IGdldAorICAgICAgICAvLyBleGVjdXRlZCwgaG93ZXZlciwgYmVjYXVzZSB0aGUgV2ViVGV4dFZpZXcgZG9lcyBub3QgZHJhdywgYWxsb3dpbmcKKyAgICAgICAgLy8gd2Via2l0J3MgZHJhd2luZyB0byBzaG93IHRocm91Z2guCisgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBJbnB1dE1ldGhvZE1hbmFnZXIucGVla0luc3RhbmNlKCk7CisgICAgICAgIGlmIChpbW0gIT0gbnVsbCAmJiBpbW0uaXNBY3RpdmUodGhpcykpIHsKKyAgICAgICAgICAgIFNwYW5uYWJsZSBzcCA9IChTcGFubmFibGUpIGdldFRleHQoKTsKKyAgICAgICAgICAgIGludCBzZWxTdGFydCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChzcCk7CisgICAgICAgICAgICBpbnQgc2VsRW5kID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChzcCk7CisgICAgICAgICAgICBpbnQgY2FuZFN0YXJ0ID0gRWRpdGFibGVJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhblN0YXJ0KHNwKTsKKyAgICAgICAgICAgIGludCBjYW5kRW5kID0gRWRpdGFibGVJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhbkVuZChzcCk7CisgICAgICAgICAgICBpbW0udXBkYXRlU2VsZWN0aW9uKHRoaXMsIHNlbFN0YXJ0LCBzZWxFbmQsIGNhbmRTdGFydCwgY2FuZEVuZCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgewogICAgICAgICAvLyBvbkRyYXcgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZvciBwYXNzd29yZCBmaWVsZHMuICBJZiBXZWJUZXh0VmlldyBpcwpAQCAtMzIyLDkgKzM3OCw2IEBACiAgICAgICAgIHN3aXRjaCAoYWN0aW9uQ29kZSkgewogICAgICAgICBjYXNlIEVkaXRvckluZm8uSU1FX0FDVElPTl9ORVhUOgogICAgICAgICAgICAgaWYgKG1XZWJWaWV3Lm5hdGl2ZU1vdmVDdXJzb3JUb05leHRUZXh0SW5wdXQoKSkgewotICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBjdXJzb3Igd2lsbCBubyBsb25nZXIgYmUgaW4gdGhlIHNhbWUgcGxhY2UgYXMgdGhlCi0gICAgICAgICAgICAgICAgLy8gZm9jdXMsIHNldCB0aGUgZm9jdXMgY29udHJvbGxlciBiYWNrIHRvIGluYWN0aXZlCi0gICAgICAgICAgICAgICAgbVdlYlZpZXcuc2V0Rm9jdXNDb250cm9sbGVySW5hY3RpdmUoKTsKICAgICAgICAgICAgICAgICAvLyBQcmVlbXB0aXZlbHkgcmVidWlsZCB0aGUgV2ViVGV4dFZpZXcsIHNvIHRoYXQgdGhlIGFjdGlvbiB3aWxsCiAgICAgICAgICAgICAgICAgLy8gYmUgc2V0IHByb3Blcmx5LgogICAgICAgICAgICAgICAgIG1XZWJWaWV3LnJlYnVpbGRXZWJUZXh0VmlldygpOwpAQCAtMzYwLDE5ICs0MTMsOCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TZWxlY3Rpb25DaGFuZ2VkKGludCBzZWxTdGFydCwgaW50IHNlbEVuZCkgewotICAgICAgICBpZiAobUluU2V0VGV4dEFuZEtlZXBTZWxlY3Rpb24pIHJldHVybjsKLSAgICAgICAgLy8gVGhpcyBjb2RlIGlzIGNvcGllZCBmcm9tIFRleHRWaWV3Lm9uRHJhdygpLiAgVGhhdCBjb2RlIGRvZXMgbm90IGdldAotICAgICAgICAvLyBleGVjdXRlZCwgaG93ZXZlciwgYmVjYXVzZSB0aGUgV2ViVGV4dFZpZXcgZG9lcyBub3QgZHJhdywgYWxsb3dpbmcKLSAgICAgICAgLy8gd2Via2l0J3MgZHJhd2luZyB0byBzaG93IHRocm91Z2guCi0gICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBJbnB1dE1ldGhvZE1hbmFnZXIucGVla0luc3RhbmNlKCk7Ci0gICAgICAgIGlmIChpbW0gIT0gbnVsbCAmJiBpbW0uaXNBY3RpdmUodGhpcykpIHsKLSAgICAgICAgICAgIFNwYW5uYWJsZSBzcCA9IChTcGFubmFibGUpIGdldFRleHQoKTsKLSAgICAgICAgICAgIGludCBjYW5kU3RhcnQgPSBFZGl0YWJsZUlucHV0Q29ubmVjdGlvbi5nZXRDb21wb3NpbmdTcGFuU3RhcnQoc3ApOwotICAgICAgICAgICAgaW50IGNhbmRFbmQgPSBFZGl0YWJsZUlucHV0Q29ubmVjdGlvbi5nZXRDb21wb3NpbmdTcGFuRW5kKHNwKTsKLSAgICAgICAgICAgIGltbS51cGRhdGVTZWxlY3Rpb24odGhpcywgc2VsU3RhcnQsIHNlbEVuZCwgY2FuZFN0YXJ0LCBjYW5kRW5kKTsKLSAgICAgICAgfQogICAgICAgICBpZiAoIW1Gcm9tV2ViS2l0ICYmICFtRnJvbUZvY3VzQ2hhbmdlICYmICFtRnJvbVNldElucHV0VHlwZQotICAgICAgICAgICAgICAgICYmIG1XZWJWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAmJiBtV2ViVmlldyAhPSBudWxsICYmICFtSW5TZXRUZXh0QW5kS2VlcFNlbGVjdGlvbikgewogICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1RFWFRfVklFVykgewogICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIm9uU2VsZWN0aW9uQ2hhbmdlZCBzZWxTdGFydD0iICsgc2VsU3RhcnQKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzZWxFbmQ9IiArIHNlbEVuZCk7CkBAIC0zOTcsMTcgKzQzOSwzOCBAQAogICAgICAgICBtUHJlQ2hhbmdlID0gcG9zdENoYW5nZTsKICAgICAgICAgaWYgKDAgPT0gY291bnQpIHsKICAgICAgICAgICAgIGlmIChiZWZvcmUgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gRm9yIHRoaXMgYW5kIGFsbCBjaGFuZ2VzIHRvIHRoZSB0ZXh0LCB1cGRhdGUgb3VyIGNhY2hlCisgICAgICAgICAgICAgICAgdXBkYXRlQ2FjaGVkVGV4dGZpZWxkKCk7CisgICAgICAgICAgICAgICAgaWYgKG1Hb3REZWxldGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUdvdERlbGV0ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpbnQgb2xkRW5kID0gc3RhcnQgKyBiZWZvcmU7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRGVsU2VsRW5kID09IG9sZEVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChtRGVsU2VsU3RhcnQgPT0gc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobURlbFNlbFN0YXJ0ID09IG9sZEVuZCAmJiBiZWZvcmUgPT0gMSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIHNldCB1cCBwcm9wZXJseSBiZWZvcmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUsIHNlbmQgdGhlIERPTSBldmVudHMuCisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRG9tRXZlbnQobmV3IEtleUV2ZW50KEtleUV2ZW50LkFDVElPTl9ET1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0RFTCkpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZERvbUV2ZW50KG5ldyBLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fVVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LktFWUNPREVfREVMKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gVGhpcyB3YXMgc2ltcGx5IGEgZGVsZXRlIG9yIGEgY3V0LCBzbyBqdXN0IGRlbGV0ZSB0aGUKICAgICAgICAgICAgICAgICAvLyBzZWxlY3Rpb24uCiAgICAgICAgICAgICAgICAgbVdlYlZpZXcuZGVsZXRlU2VsZWN0aW9uKHN0YXJ0LCBzdGFydCArIGJlZm9yZSk7Ci0gICAgICAgICAgICAgICAgLy8gRm9yIHRoaXMgYW5kIGFsbCBjaGFuZ2VzIHRvIHRoZSB0ZXh0LCB1cGRhdGUgb3VyIGNhY2hlCi0gICAgICAgICAgICAgICAgdXBkYXRlQ2FjaGVkVGV4dGZpZWxkKCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBtR290RGVsZXRlID0gZmFsc2U7CiAgICAgICAgICAgICAvLyBiZWZvcmUgc2hvdWxkIG5ldmVyIGJlIG5lZ2F0aXZlLCBzbyB3aGV0aGVyIGl0IHdhcyBhIGN1dAogICAgICAgICAgICAgLy8gKGhhbmRsZWQgYWJvdmUpLCBvciBiZWZvcmUgaXMgMCwgaW4gd2hpY2ggY2FzZSBub3RoaW5nIGhhcwogICAgICAgICAgICAgLy8gY2hhbmdlZCwgd2Ugc2hvdWxkIHJldHVybi4KICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIGZsYWcgZ2V0cyBjbGVhcmVkLCBzaW5jZSB3aXRoIGF1dG9jb3JyZWN0IG9uLCBhCisgICAgICAgIC8vIGRlbGV0ZSBrZXkgcHJlc3MgbWF5IGhhdmUgYSBtb3JlIGNvbXBsZXggcmVzdWx0IHRoYW4gZGVsZXRpbmcgb25lCisgICAgICAgIC8vIGNoYXJhY3RlciBvciB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uLCBzbyBpdCB3aWxsIG5vdCBnZXQgY2xlYXJlZAorICAgICAgICAvLyBhYm92ZS4KKyAgICAgICAgbUdvdERlbGV0ZSA9IGZhbHNlOwogICAgICAgICAvLyBGaW5kIHRoZSBsYXN0IGNoYXJhY3RlciBiZWluZyByZXBsYWNlZC4gIElmIGl0IGNhbiBiZSByZXByZXNlbnRlZCBieQogICAgICAgICAvLyBldmVudHMsIHdlIHdpbGwgcGFzcyB0aGVtIHRvIG5hdGl2ZSAoYWZ0ZXIgcmVwbGFjaW5nIHRoZSBiZWdpbm5pbmcKICAgICAgICAgLy8gb2YgdGhlIGNoYW5nZWQgdGV4dCksIHNvIHdlIGNhbiBzZWUgamF2YXNjcmlwdCBldmVudHMuCkBAIC00ODEsOSArNTQ0LDEwIEBACiAgICAgICAgICAgICAvLyB0byBiaWcgZm9yIHRoZSBjYXNlIG9mIGEgc21hbGwgdGV4dGZpZWxkLgogICAgICAgICAgICAgaW50IHNtYWxsZXJTbG9wID0gc2xvcC8yOwogICAgICAgICAgICAgaWYgKGR4ID4gc21hbGxlclNsb3AgfHwgZHkgPiBzbWFsbGVyU2xvcCkgewotICAgICAgICAgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFNjcm9sbFggPSAoZmxvYXQpIFRvdWNoLmdldE1heFNjcm9sbFgodGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGF5b3V0KCksIG1TY3JvbGxZKTsKKyAgICAgICAgICAgICAgICBMYXlvdXQgbGF5b3V0ID0gZ2V0TGF5b3V0KCk7CisgICAgICAgICAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwgJiYgbGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4U2Nyb2xsWCA9IChmbG9hdCkgVG91Y2guZ2V0TWF4U2Nyb2xsWCh0aGlzLCBsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbFkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVEVYVF9WSUVXKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJvblRvdWNoRXZlbnQgeD0iICsgbVNjcm9sbFggKyAiIHk9IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1TY3JvbGxZICsgIiBtYXhYPSIgKyBtYXhTY3JvbGxYKTsKQEAgLTU3OCwxNiArNjQyLDMxIEBACiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyB2b2lkIHJlbW92ZSgpIHsKICAgICAgICAgLy8gaGlkZSB0aGUgc29mdCBrZXlib2FyZCB3aGVuIHRoZSBlZGl0IHRleHQgaXMgb3V0IG9mIGZvY3VzCi0gICAgICAgIElucHV0TWV0aG9kTWFuYWdlci5nZXRJbnN0YW5jZShtQ29udGV4dCkuaGlkZVNvZnRJbnB1dEZyb21XaW5kb3coCi0gICAgICAgICAgICAgICAgZ2V0V2luZG93VG9rZW4oKSwgMCk7CisgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBJbnB1dE1ldGhvZE1hbmFnZXIuZ2V0SW5zdGFuY2UobUNvbnRleHQpOworICAgICAgICBpZiAoaW1tLmlzQWN0aXZlKHRoaXMpKSB7CisgICAgICAgICAgICBpbW0uaGlkZVNvZnRJbnB1dEZyb21XaW5kb3coZ2V0V2luZG93VG9rZW4oKSwgMCk7CisgICAgICAgIH0KICAgICAgICAgbVdlYlZpZXcucmVtb3ZlVmlldyh0aGlzKTsKICAgICAgICAgbVdlYlZpZXcucmVxdWVzdEZvY3VzKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogTW92ZSB0aGUgY2FyZXQvc2VsZWN0aW9uIGludG8gdmlldy4KKyAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIHZvaWQgYnJpbmdJbnRvVmlldygpIHsKLSAgICAgICAgaWYgKGdldExheW91dCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJyaW5nUG9pbnRJbnRvVmlldyhTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKGdldFRleHQoKSkpOworICAgICAgICBicmluZ1BvaW50SW50b1ZpZXcoU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChnZXRUZXh0KCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBicmluZ1BvaW50SW50b1ZpZXcoaW50IG9mZnNldCkgeworICAgICAgICBpZiAobVdlYlZpZXcgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobVdlYlZpZXcubmF0aXZlRm9jdXNDYW5kaWRhdGVJc1Bhc3N3b3JkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRMYXlvdXQoKSAhPSBudWxsICYmIHN1cGVyLmJyaW5nUG9pbnRJbnRvVmlldyhvZmZzZXQpOwogICAgICAgICB9CisgICAgICAgIC8vIEZvciBub24gcGFzc3dvcmQgdGV4dCBpbnB1dCwgdGVsbCB3ZWJraXQgdG8gbW92ZSB0aGUgY2FyZXQvc2VsZWN0aW9uCisgICAgICAgIC8vIG9uIHNjcmVlbiwgc2luY2Ugd2Via2l0IGRyYXdzIHRoZW0uCisgICAgICAgIG1XZWJWaWV3LnJldmVhbFNlbGVjdGlvbigpOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICAvKioKQEAgLTYwOSw2ICs2ODgsMjIgQEAKICAgICAgICAgICAgIGFkYXB0ZXIuc2V0VGV4dFZpZXcodGhpcyk7CiAgICAgICAgIH0KICAgICAgICAgc3VwZXIuc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICAgICAgaWYgKG1BdXRvRmlsbGFibGUpIHsKKyAgICAgICAgICAgIHNldE9uSXRlbUNsaWNrTGlzdGVuZXIobmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPT0gMCAmJiBwb3NpdGlvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBCbGFuayBvdXQgdGhlIHRleHQgYm94IHdoaWxlIHdlIHdhaXQgZm9yIFdlYkNvcmUgdG8gZmlsbCB0aGUgZm9ybS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VUZXh0KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGwgYSB3ZWJ2aWV3IG1ldGhvZCB0byB0ZWxsIFdlYkNvcmUgdG8gYXV0b2ZpbGwgdGhlIGZvcm0uCisgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5hdXRvRmlsbEZvcm0obVF1ZXJ5SWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG51bGwpOworICAgICAgICB9CisgICAgICAgIHNob3dEcm9wRG93bigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjY3LDYgKzc2Miw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKHRleHQsIHNlbGVjdGlvbiwgc2VsZWN0aW9uKTsKICAgICAgICAgfQorICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCkgbVdlYlZpZXcuaW5jcmVtZW50VGV4dEdlbmVyYXRpb24oKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg5OSw3ICs5OTUsNyBAQAogICAgICAgICAgICAgaWYgKHR5cGUgIT0gMiAvKiBQQVNTV09SRCAqLykgewogICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbVdlYlZpZXcubmF0aXZlRm9jdXNDYW5kaWRhdGVOYW1lKCk7CiAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5yZXF1ZXN0Rm9ybURhdGEobmFtZSwgbU5vZGVQb2ludGVyKTsKKyAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcucmVxdWVzdEZvcm1EYXRhKG5hbWUsIG1Ob2RlUG9pbnRlciwgbUF1dG9GaWxsYWJsZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC05MTksMTQgKzEwMTUsNCBAQAogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCB1cGRhdGVDYWNoZWRUZXh0ZmllbGQoKSB7CiAgICAgICAgIG1XZWJWaWV3LnVwZGF0ZUNhY2hlZFRleHRmaWVsZChnZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdFJlY3RhbmdsZU9uU2NyZWVuKFJlY3QgcmVjdGFuZ2xlKSB7Ci0gICAgICAgIC8vIGRvbid0IHNjcm9sbCB3aGlsZSBpbiB6b29tIGFuaW1hdGlvbi4gV2hlbiBpdCBpcyBkb25lLCB3ZSB3aWxsIGFkanVzdAotICAgICAgICAvLyB0aGUgV2ViVGV4dFZpZXcgaWYgaXQgaXMgaW4gZWRpdGluZyBtb2RlLgotICAgICAgICBpZiAoIW1XZWJWaWV3LmluQW5pbWF0ZVpvb20oKSkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlcXVlc3RSZWN0YW5nbGVPblNjcmVlbihyZWN0YW5nbGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXcuamF2YQppbmRleCBiN2M5MDJiLi5mZWRiODczIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3LmphdmEKQEAgLTE2LDM5ICsxNiw0MSBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2Via2l0OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKLQogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5XaWRnZXQ7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwYm9hcmRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlLk9uQ2FuY2VsTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwU2hhZGVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db3JuZXJQYXRoRWZmZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuRHJhd0ZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkludGVycG9sYXRvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnRGbGFnc0RyYXdGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaWN0dXJlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWdpb247Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5uZXQuaHR0cC5Tc2xDZXJ0aWZpY2F0ZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnRleHQuSUNsaXBib2FyZDsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQuc3BlZWNoLnR0cy5UZXh0VG9TcGVlY2g7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CkBAIC02Niw0MCArNjgsNDIgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFscGhhQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5FZGl0b3JJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dENvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJUZXh0Vmlldy5BdXRvQ29tcGxldGVBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLkV2ZW50SHViOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLlRvdWNoRXZlbnREYXRhOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLlRvdWNoSGlnaGxpZ2h0RGF0YTsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BYnNvbHV0ZUxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNoZWNrZWRUZXh0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FZGdlR2xvdzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuT3ZlclNjcm9sbGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNjcm9sbGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Llpvb21CdXR0b25zQ29udHJvbGxlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5ab29tQ29udHJvbHM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKIC8qKgogICogPHA+QSBWaWV3IHRoYXQgZGlzcGxheXMgd2ViIHBhZ2VzLiBUaGlzIGNsYXNzIGlzIHRoZSBiYXNpcyB1cG9uIHdoaWNoIHlvdQpAQCAtMTE2LDcgKzEyMCw3IEBACiAgKiA8cHJlPiZsdDt1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+PC9wcmU+CiAgKgogICogPHA+VGhpcyBtdXN0IGJlIGEgY2hpbGQgb2YgdGhlIDxhCi0gKiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L21hbmlmZXN0LWVsZW1lbnQuaHRtbCI+e0Bjb2RlICZsdDttYW5pZmVzdCZndDt9PC9hPgorICogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9tYW5pZmVzdC1lbGVtZW50Lmh0bWwiPntAY29kZSA8bWFuaWZlc3Q+fTwvYT4KICAqIGVsZW1lbnQuPC9wPgogICoKICAqIDxwPlNlZSB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdmlld3MvaGVsbG8td2Vidmlldy5odG1sIj5XZWIgVmlldwpAQCAtMTM5LDcgKzE0Myw3IEBACiAgKiA8L3ByZT4KICAqIDxwPlNlZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudH0gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgogICoKLSAqIDxwPlRvIHByb3ZpZGUgYSBXZWJWaWV3IGluIHlvdXIgb3duIEFjdGl2aXR5LCBpbmNsdWRlIGEge0Bjb2RlICZsdDtXZWJWaWV3Jmd0O30gaW4geW91ciBsYXlvdXQsCisgKiA8cD5UbyBwcm92aWRlIGEgV2ViVmlldyBpbiB5b3VyIG93biBBY3Rpdml0eSwgaW5jbHVkZSBhIHtAY29kZSA8V2ViVmlldz59IGluIHlvdXIgbGF5b3V0LAogICogb3Igc2V0IHRoZSBlbnRpcmUgQWN0aXZpdHkgd2luZG93IGFzIGEgV2ViVmlldyBkdXJpbmcge0BsaW5rCiAgKiBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkNyZWF0ZShCdW5kbGUpIG9uQ3JlYXRlKCl9OjwvcD4KICAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij4KQEAgLTI4Niw3ICsyOTAsNyBAQAogICogbG93IGRlbnNpdHkgc2NyZWVucyBzY2FsZSBkb3duLiBUaGlzIGlzIGFsc28gdGhlIGRlZmF1bHQgYmVoYXZpb3IuPC9saT4KICAqIDxsaT57QGNvZGUgbG93LWRwaX0gLSBVc2UgbGRwaSBhcyB0aGUgdGFyZ2V0IGRwaS4gTWVkaXVtIGFuZCBoaWdoIGRlbnNpdHkgc2NyZWVucyBzY2FsZSB1cAogICogYXMgYXBwcm9wcmlhdGUuPC9saT4KLSAqIDxsaT48ZW0+e0Bjb2RlICZsdDt2YWx1ZSZndDt9PC9lbT4gLSBTcGVjaWZ5IGEgZHBpIHZhbHVlIHRvIHVzZSBhcyB0aGUgdGFyZ2V0IGRwaSAoYWNjZXB0ZWQKKyAqIDxsaT48ZW0+e0Bjb2RlIDx2YWx1ZT59PC9lbT4gLSBTcGVjaWZ5IGEgZHBpIHZhbHVlIHRvIHVzZSBhcyB0aGUgdGFyZ2V0IGRwaSAoYWNjZXB0ZWQKICAqIHZhbHVlcyBhcmUgNzAtNDAwKS48L2xpPgogICogPC91bD4KICAqIDxwPkhlcmUncyBhbiBleGFtcGxlIG1ldGEgdGFnIHRvIHNwZWNpZnkgdGhlIHRhcmdldCBkZW5zaXR5OjwvcD4KQEAgLTI5OCw3ICszMDIsNyBAQAogICogcHJvcGVydHkgdG8ge0Bjb2RlIGRldmljZS1kcGl9LiBUaGlzIHN0b3BzIEFuZHJvaWQgZnJvbSBwZXJmb3JtaW5nIHNjYWxpbmcgaW4geW91ciB3ZWIgcGFnZSBhbmQKICAqIGFsbG93cyB5b3UgdG8gbWFrZSB0aGUgbmVjZXNzYXJ5IGFkanVzdG1lbnRzIGZvciBlYWNoIGRlbnNpdHkgdmlhIENTUyBhbmQgSmF2YVNjcmlwdC48L3A+CiAgKgotICogCisgKgogICovCiBAV2lkZ2V0CiBwdWJsaWMgY2xhc3MgV2ViVmlldyBleHRlbmRzIEFic29sdXRlTGF5b3V0CkBAIC0zMTUsNDkgKzMxOSw3IEBACiAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJ3ZWJ2aWV3IjsKIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGV4dGVuZHMgRnJhbWVMYXlvdXQgewotICAgICAgICBwdWJsaWMgRXh0ZW5kZWRab29tQ29udHJvbHMoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gKExheW91dEluZmxhdGVyKQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7Ci0gICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lnpvb21fbWFnbmlmeSwgdGhpcywgdHJ1ZSk7Ci0gICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzID0gKFpvb21Db250cm9scykgZmluZFZpZXdCeUlkKAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnpvb21Db250cm9scyk7Ci0gICAgICAgICAgICBmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC56b29tTWFnbmlmeSkuc2V0VmlzaWJpbGl0eSgKLSAgICAgICAgICAgICAgICAgICAgVmlldy5HT05FKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNob3coYm9vbGVhbiBzaG93Wm9vbSwgYm9vbGVhbiBjYW5ab29tT3V0KSB7Ci0gICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLnNldFZpc2liaWxpdHkoCi0gICAgICAgICAgICAgICAgICAgIHNob3dab29tID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLSAgICAgICAgICAgIGZhZGUoVmlldy5WSVNJQkxFLCAwLjBmLCAxLjBmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7Ci0gICAgICAgICAgICBmYWRlKFZpZXcuR09ORSwgMS4wZiwgMC4wZik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZmFkZShpbnQgdmlzaWJpbGl0eSwgZmxvYXQgc3RhcnRBbHBoYSwgZmxvYXQgZW5kQWxwaGEpIHsKLSAgICAgICAgICAgIEFscGhhQW5pbWF0aW9uIGFuaW0gPSBuZXcgQWxwaGFBbmltYXRpb24oc3RhcnRBbHBoYSwgZW5kQWxwaGEpOwotICAgICAgICAgICAgYW5pbS5zZXREdXJhdGlvbig1MDApOwotICAgICAgICAgICAgc3RhcnRBbmltYXRpb24oYW5pbSk7Ci0gICAgICAgICAgICBzZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsdXNNaW51c1pvb21Db250cm9scy5oYXNGb2N1cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0T25ab29tSW5DbGlja0xpc3RlbmVyKE9uQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAgICAgbVBsdXNNaW51c1pvb21Db250cm9scy5zZXRPblpvb21JbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0T25ab29tT3V0Q2xpY2tMaXN0ZW5lcihPbkNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0T25ab29tT3V0Q2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0KLQotICAgICAgICBab29tQ29udHJvbHMgICAgbVBsdXNNaW51c1pvb21Db250cm9sczsKLSAgICB9CisgICAgcHJpdmF0ZSBab29tTWFuYWdlciBtWm9vbU1hbmFnZXI7CiAKICAgICAvKioKICAgICAgKiAgVHJhbnNwb3J0YXRpb24gb2JqZWN0IGZvciByZXR1cm5pbmcgV2ViVmlldyBhY3Jvc3MgdGhyZWFkIGJvdW5kYXJpZXMuCkBAIC00MDMsNiArMzY1LDggQEAKICAgICAvLyBtb3JlIGtleSBldmVudHMuCiAgICAgcHJpdmF0ZSBpbnQgbVRleHRHZW5lcmF0aW9uOwogCisgICAgLyogcGFja2FnZSAqLyB2b2lkIGluY3JlbWVudFRleHRHZW5lcmF0aW9uKCkgeyBtVGV4dEdlbmVyYXRpb24rKzsgfQorCiAgICAgLy8gVXNlZCBieSBXZWJWaWV3Q29yZSB0byBjcmVhdGUgY2hpbGQgdmlld3MuCiAgICAgLyogcGFja2FnZSAqLyBmaW5hbCBWaWV3TWFuYWdlciBtVmlld01hbmFnZXI7CiAKQEAgLTQ1MCw2ICs0MTQsMTQgQEAKICAgICBwcml2YXRlIGZsb2F0IG1MYXN0VmVsWDsKICAgICBwcml2YXRlIGZsb2F0IG1MYXN0VmVsWTsKIAorICAgIC8vIEEgcG9pbnRlciB0byB0aGUgbmF0aXZlIHNjcm9sbGFibGUgbGF5ZXIgd2hlbiBkcmFnZ2luZyBsYXllcnMuICBPbmx5CisgICAgLy8gdmFsaWQgd2hlbiBtVG91Y2hNb2RlIGlzIFRPVUNIX0RSQUdfTEFZRVJfTU9ERS4KKyAgICBwcml2YXRlIGludCBtU2Nyb2xsaW5nTGF5ZXI7CisKKyAgICAvLyBvbmx5IHRyaWdnZXIgYWNjZWxlcmF0ZWQgZmxpbmcgaWYgdGhlIG5ldyB2ZWxvY2l0eSBpcyBhdCBsZWFzdAorICAgIC8vIE1JTklNVU1fVkVMT0NJVFlfUkFUSU9fRk9SX0FDQ0VMRVJBVElPTiB0aW1lcyBvZiB0aGUgcHJldmlvdXMgdmVsb2NpdHkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBNSU5JTVVNX1ZFTE9DSVRZX1JBVElPX0ZPUl9BQ0NFTEVSQVRJT04gPSAwLjJmOworCiAgICAgLyoqCiAgICAgICogVG91Y2ggbW9kZQogICAgICAqLwpAQCAtNDYyLDExICs0MzQsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9ET1VCTEVfVEFQX01PREUgPSA2OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9ET05FX01PREUgPSA3OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9QSU5DSF9EUkFHID0gODsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgd2UgaGF2ZSBhIHRvdWNoIHBhbmVsIGNhcGFibGUgb2YgZGV0ZWN0aW5nIHNtb290aCBwYW4vc2NhbGUgYXQgdGhlIHNhbWUgdGltZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtQWxsb3dQYW5BbmRTY2FsZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfRFJBR19MQVlFUl9NT0RFID0gOTsKIAogICAgIC8vIFdoZXRoZXIgdG8gZm9yd2FyZCB0aGUgdG91Y2ggZXZlbnRzIHRvIFdlYkNvcmUKICAgICBwcml2YXRlIGJvb2xlYW4gbUZvcndhcmRUb3VjaEV2ZW50cyA9IGZhbHNlOwpAQCAtNDg5LDYgKzQ1Nyw5IEBACiAgICAgLy8gZGVmYXVsdCBpcyBub3Qgc2V0LCB0aGUgVUkgd2lsbCBjb250aW51ZSBoYW5kbGUgdGhlbS4KICAgICBwcml2YXRlIGJvb2xlYW4gbURlZmVyVG91Y2hQcm9jZXNzOwogCisgICAgLy8gaWYgdHJ1ZSwgbXVsdGktdG91Y2ggZXZlbnRzIHdpbGwgYmUgcGFzc2VkIHRvIHdlYmtpdCBkaXJlY3RseSBiZWZvcmUgVUkKKyAgICBwcml2YXRlIGJvb2xlYW4gbURlZmVyTXVsdGl0b3VjaCA9IGZhbHNlOworCiAgICAgLy8gdG8gYXZvaWQgaW50ZXJmZXJpbmcgd2l0aCB0aGUgY3VycmVudCB0b3VjaCBldmVudHMsIHRyYWNrIHRoZW0KICAgICAvLyBzZXBhcmF0ZWx5LiBDdXJyZW50bHkgbm8gc25hcHBpbmcgb3IgZmxpbmcgaW4gdGhlIGRlZmVycmVkIHByb2Nlc3MgbW9kZQogICAgIHByaXZhdGUgaW50IG1EZWZlclRvdWNoTW9kZSA9IFRPVUNIX0RPTkVfTU9ERTsKQEAgLTUwNSwxMCArNDc2LDYgQEAKICAgICAvLyB0cnVlIGlmIG9uUGF1c2UgaGFzIGJlZW4gY2FsbGVkIChhbmQgbm90IG9uUmVzdW1lKQogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNQYXVzZWQ7CiAKLSAgICAvLyB0cnVlIGlmLCBkdXJpbmcgYSB0cmFuc2l0aW9uIHRvIGEgbmV3IHBhZ2UsIHdlJ3JlIGRlbGF5aW5nCi0gICAgLy8gZGVsZXRpbmcgYSByb290IGxheWVyIHVudGlsIHRoZXJlJ3Mgc29tZXRoaW5nIHRvIGRyYXcgb2YgdGhlIG5ldyBwYWdlLgotICAgIHByaXZhdGUgYm9vbGVhbiBtRGVsYXllZERlbGV0ZVJvb3RMYXllcjsKLQogICAgIC8qKgogICAgICAqIEN1c3RvbWl6YWJsZSBjb25zdGFudAogICAgICAqLwpAQCAtNTMwLDkgKzQ5Nyw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9GTElOR19USU1FID0gMjUwOwogICAgIC8vIGRyYXcgdW5maWx0ZXJlZCBhZnRlciBkcmFnIGlzIGhlbGQgd2l0aG91dCBtb3ZlbWVudAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT1RJT05MRVNTX1RJTUUgPSAxMDA7Ci0gICAgLy8gVGhlIHRpbWUgdGhhdCB0aGUgWm9vbSBDb250cm9scyBhcmUgdmlzaWJsZSBiZWZvcmUgZmFkaW5nIGF3YXkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFpPT01fQ09OVFJPTFNfVElNRU9VVCA9Ci0gICAgICAgICAgICBWaWV3Q29uZmlndXJhdGlvbi5nZXRab29tQ29udHJvbHNUaW1lb3V0KCk7CiAgICAgLy8gVGhlIGFtb3VudCBvZiBjb250ZW50IHRvIG92ZXJsYXAgYmV0d2VlbiB0d28gc2NyZWVucyB3aGVuIGdvaW5nIHRocm91Z2gKICAgICAvLyBwYWdlcyB3aXRoIHRoZSBzcGFjZSBiYXIsIGluIHBpeGVscy4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFHRV9TQ1JPTExfT1ZFUkxBUCA9IDI0OwpAQCAtNTY0LDEwICs1MjgsNyBAQAogICAgIC8vIHRpbWUgZm9yIHRoZSBsb25nZXN0IHNjcm9sbCBhbmltYXRpb24KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0RVUkFUSU9OID0gNzUwOyAgIC8vIG1pbGxpc2Vjb25kcwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTElERV9USVRMRV9EVVJBVElPTiA9IDUwMDsgICAvLyBtaWxsaXNlY29uZHMKLSAgICBwcml2YXRlIE92ZXJTY3JvbGxlciBtU2Nyb2xsZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jbk92ZXJTY3JvbGxNb2RlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgUGFpbnQgbU92ZXJTY3JvbGxCYWNrZ3JvdW5kOwotICAgIHByaXZhdGUgc3RhdGljIFBhaW50IG1PdmVyU2Nyb2xsQm9yZGVyOworICAgIHByaXZhdGUgU2Nyb2xsZXIgbVNjcm9sbGVyOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1XcmFwQ29udGVudDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9USU9OTEVTU19GQUxTRSAgICAgICAgICAgPSAwOwpAQCAtNTc2LDE1ICs1MzcsMjggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9USU9OTEVTU19JR05PUkUgICAgICAgICAgPSAzOwogICAgIHByaXZhdGUgaW50IG1IZWxkTW90aW9ubGVzczsKIAotICAgIC8vIHdoZXRoZXIgc3VwcG9ydCBtdWx0aS10b3VjaAotICAgIHByaXZhdGUgYm9vbGVhbiBtU3VwcG9ydE11bHRpVG91Y2g7Ci0gICAgLy8gdXNlIHRoZSBmcmFtZXdvcmsncyBTY2FsZUdlc3R1cmVEZXRlY3RvciB0byBoYW5kbGUgbXVsdGktdG91Y2gKLSAgICBwcml2YXRlIFNjYWxlR2VzdHVyZURldGVjdG9yIG1TY2FsZURldGVjdG9yOworICAgIC8vIEFuIGluc3RhbmNlIGZvciBpbmplY3RpbmcgYWNjZXNzaWJpbGl0eSBpbiBXZWJWaWV3cyB3aXRoIGRpc2FibGVkCisgICAgLy8gSmF2YVNjcmlwdCBvciBvbmVzIGZvciB3aGljaCBubyBhY2Nlc3NpYmlsaXR5IHNjcmlwdCBleGlzdHMKKyAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlJbmplY3RvciBtQWNjZXNzaWJpbGl0eUluamVjdG9yOwogCi0gICAgLy8gdGhlIGFuY2hvciBwb2ludCBpbiB0aGUgZG9jdW1lbnQgc3BhY2Ugd2hlcmUgVklFV19TSVpFX0NIQU5HRUQgc2hvdWxkCi0gICAgLy8gYXBwbHkgdG8KLSAgICBwcml2YXRlIGludCBtQW5jaG9yWDsKLSAgICBwcml2YXRlIGludCBtQW5jaG9yWTsKKyAgICAvLyBmbGFnIGluZGljYXRpbmcgaWYgYWNjZXNzaWJpbGl0eSBzY3JpcHQgaXMgaW5qZWN0ZWQgc28gd2UKKyAgICAvLyBrbm93IHRvIGhhbmRsZSBTaGlmdCBhbmQgYXJyb3dzIG5hdGl2ZWx5IGZpcnN0CisgICAgcHJpdmF0ZSBib29sZWFuIG1BY2Nlc3NpYmlsaXR5U2NyaXB0SW5qZWN0ZWQ7CisKKyAgICAvLyB0aGUgY29sb3IgdXNlZCB0byBoaWdobGlnaHQgdGhlIHRvdWNoIHJlY3RhbmdsZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbUhpZ2h0bGlnaHRDb2xvciA9IDB4MzMwMDAwMDA7CisgICAgLy8gdGhlIHJvdW5kIGNvcm5lciBmb3IgdGhlIGhpZ2hsaWdodCBwYXRoCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgVE9VQ0hfSElHSExJR0hUX0FSQyA9IDUuMGY7CisgICAgLy8gdGhlIHJlZ2lvbiBpbmRpY2F0aW5nIHdoZXJlIHRoZSB1c2VyIHRvdWNoZWQgb24gdGhlIHNjcmVlbgorICAgIHByaXZhdGUgUmVnaW9uIG1Ub3VjaEhpZ2hsaWdodFJlZ2lvbiA9IG5ldyBSZWdpb24oKTsKKyAgICAvLyB0aGUgcGFpbnQgZm9yIHRoZSB0b3VjaCBoaWdobGlnaHQKKyAgICBwcml2YXRlIFBhaW50IG1Ub3VjaEhpZ2h0bGlnaHRQYWludDsKKyAgICAvLyBkZWJ1ZyBvbmx5CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19UT1VDSF9ISUdITElHSFQgPSB0cnVlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9ISUdITElHSFRfRUxBUFNFX1RJTUUgPSAyMDAwOworICAgIHByaXZhdGUgUGFpbnQgbVRvdWNoQ3Jvc3NIYWlyQ29sb3I7CisgICAgcHJpdmF0ZSBpbnQgbVRvdWNoSGlnaGxpZ2h0WDsKKyAgICBwcml2YXRlIGludCBtVG91Y2hIaWdobGlnaHRZOwogCiAgICAgLyoKICAgICAgKiBQcml2YXRlIG1lc3NhZ2UgaWRzCkBAIC02MTgsNyArNTkyLDcgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IFdFQkNPUkVfSU5JVElBTElaRURfTVNHX0lEICAgICAgICAgPSAxMDc7CiAgICAgc3RhdGljIGZpbmFsIGludCBVUERBVEVfVEVYVEZJRUxEX1RFWFRfTVNHX0lEICAgICAgID0gMTA4OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX1pPT01fUkFOR0UgICAgICAgICAgICAgICAgICA9IDEwOTsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1PVkVfT1VUX09GX1BMVUdJTiAgICAgICAgICAgICAgICAgPSAxMTA7CisgICAgc3RhdGljIGZpbmFsIGludCBVTkhBTkRMRURfTkFWX0tFWSAgICAgICAgICAgICAgICAgID0gMTEwOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0xFQVJfVEVYVF9FTlRSWSAgICAgICAgICAgICAgICAgICA9IDExMTsKICAgICBzdGF0aWMgZmluYWwgaW50IFVQREFURV9URVhUX1NFTEVDVElPTl9NU0dfSUQgICAgICAgPSAxMTI7CiAgICAgc3RhdGljIGZpbmFsIGludCBTSE9XX1JFQ1RfTVNHX0lEICAgICAgICAgICAgICAgICAgID0gMTEzOwpAQCAtNjMyLDE2ICs2MDYsMjEgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IFNIT1dfRlVMTFNDUkVFTiAgICAgICAgICAgICAgICAgICAgPSAxMjA7CiAgICAgc3RhdGljIGZpbmFsIGludCBISURFX0ZVTExTQ1JFRU4gICAgICAgICAgICAgICAgICAgID0gMTIxOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgRE9NX0ZPQ1VTX0NIQU5HRUQgICAgICAgICAgICAgICAgICA9IDEyMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IElNTUVESUFURV9SRVBBSU5UX01TR19JRCAgICAgICAgICAgPSAxMjM7Ci0gICAgc3RhdGljIGZpbmFsIGludCBTRVRfUk9PVF9MQVlFUl9NU0dfSUQgICAgICAgICAgICAgID0gMTI0OworICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVQTEFDRV9CQVNFX0NPTlRFTlQgICAgICAgICAgICAgICA9IDEyMzsKKyAgICBzdGF0aWMgZmluYWwgaW50IEZPUk1fRElEX0JMVVIgICAgICAgICAgICAgICAgICAgICAgPSAxMjQ7CiAgICAgc3RhdGljIGZpbmFsIGludCBSRVRVUk5fTEFCRUwgICAgICAgICAgICAgICAgICAgICAgID0gMTI1OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgRklORF9BR0FJTiAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyNjsKICAgICBzdGF0aWMgZmluYWwgaW50IENFTlRFUl9GSVRfUkVDVCAgICAgICAgICAgICAgICAgICAgPSAxMjc7CiAgICAgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX0tFWUJPQVJEX1dJVEhfU0VMRUNUSU9OX01TR19JRCA9IDEyODsKICAgICBzdGF0aWMgZmluYWwgaW50IFNFVF9TQ1JPTExCQVJfTU9ERVMgICAgICAgICAgICAgICAgPSAxMjk7CisgICAgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RJT05fU1RSSU5HX0NIQU5HRUQgICAgICAgICAgID0gMTMwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUyAgICAgICAgICA9IDEzMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFNBVkVfV0VCQVJDSElWRV9GSU5JU0hFRCAgICAgICAgICAgPSAxMzI7CisKKyAgICBzdGF0aWMgZmluYWwgaW50IFNFVF9BVVRPRklMTEFCTEUgICAgICAgICAgICAgICAgICAgPSAxMzM7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfUEFDS0FHRV9NU0dfSUQgPSBTQ1JPTExfVE9fTVNHX0lEOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVNUX1BBQ0tBR0VfTVNHX0lEID0gU0VUX1NDUk9MTEJBUl9NT0RFUzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9QQUNLQUdFX01TR19JRCA9IFNFVF9UT1VDSF9ISUdITElHSFRfUkVDVFM7CiAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gSGFuZGxlclByaXZhdGVEZWJ1Z1N0cmluZyA9IHsKICAgICAgICAgIlJFTUVNQkVSX1BBU1NXT1JEIiwgLy8gICAgICAgICAgICAgID0gMTsKQEAgLTY2Niw3ICs2NDUsNyBAQAogICAgICAgICAiV0VCQ09SRV9JTklUSUFMSVpFRF9NU0dfSUQiLCAvLyAgICAgPSAxMDc7CiAgICAgICAgICJVUERBVEVfVEVYVEZJRUxEX1RFWFRfTVNHX0lEIiwgLy8gICA9IDEwODsKICAgICAgICAgIlVQREFURV9aT09NX1JBTkdFIiwgLy8gICAgICAgICAgICAgID0gMTA5OwotICAgICAgICAiTU9WRV9PVVRfT0ZfUExVR0lOIiwgLy8gICAgICAgICAgICAgPSAxMTA7CisgICAgICAgICJVTkhBTkRMRURfTkFWX0tFWSIsIC8vICAgICAgICAgICAgICA9IDExMDsKICAgICAgICAgIkNMRUFSX1RFWFRfRU5UUlkiLCAvLyAgICAgICAgICAgICAgID0gMTExOwogICAgICAgICAiVVBEQVRFX1RFWFRfU0VMRUNUSU9OX01TR19JRCIsIC8vICAgPSAxMTI7CiAgICAgICAgICJTSE9XX1JFQ1RfTVNHX0lEIiwgLy8gICAgICAgICAgICAgICA9IDExMzsKQEAgLTY3OSwxOCArNjU4LDIyIEBACiAgICAgICAgICJTSE9XX0ZVTExTQ1JFRU4iLCAvLyAgICAgICAgICAgICAgICA9IDEyMDsKICAgICAgICAgIkhJREVfRlVMTFNDUkVFTiIsIC8vICAgICAgICAgICAgICAgID0gMTIxOwogICAgICAgICAiRE9NX0ZPQ1VTX0NIQU5HRUQiLCAvLyAgICAgICAgICAgICAgPSAxMjI7Ci0gICAgICAgICJJTU1FRElBVEVfUkVQQUlOVF9NU0dfSUQiLCAvLyAgICAgICA9IDEyMzsKLSAgICAgICAgIlNFVF9ST09UX0xBWUVSX01TR19JRCIsIC8vICAgICAgICAgID0gMTI0OworICAgICAgICAiUkVQTEFDRV9CQVNFX0NPTlRFTlQiLCAvLyAgICAgICAgICAgPSAxMjM7CisgICAgICAgICJGT1JNX0RJRF9CTFVSIiwgLy8gICAgICAgICAgICAgICAgICA9IDEyNDsKICAgICAgICAgIlJFVFVSTl9MQUJFTCIsIC8vICAgICAgICAgICAgICAgICAgID0gMTI1OwogICAgICAgICAiRklORF9BR0FJTiIsIC8vICAgICAgICAgICAgICAgICAgICAgPSAxMjY7CiAgICAgICAgICJDRU5URVJfRklUX1JFQ1QiLCAvLyAgICAgICAgICAgICAgICA9IDEyNzsKICAgICAgICAgIlJFUVVFU1RfS0VZQk9BUkRfV0lUSF9TRUxFQ1RJT05fTVNHX0lEIiwgLy8gPSAxMjg7Ci0gICAgICAgICJTRVRfU0NST0xMQkFSX01PREVTIiAvLyAgICAgICAgICAgICA9IDEyOTsKKyAgICAgICAgIlNFVF9TQ1JPTExCQVJfTU9ERVMiLCAvLyAgICAgICAgICAgID0gMTI5OworICAgICAgICAiU0VMRUNUSU9OX1NUUklOR19DSEFOR0VEIiwgLy8gICAgICAgPSAxMzA7CisgICAgICAgICJTRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTIiwgLy8gICAgICA9IDEzMTsKKyAgICAgICAgIlNBVkVfV0VCQVJDSElWRV9GSU5JU0hFRCIsIC8vICAgICAgID0gMTMyOworICAgICAgICAiU0VUX0FVVE9GSUxMQUJMRSIgLy8gICAgICAgICAgICAgICAgPSAxMzM7CiAgICAgfTsKIAogICAgIC8vIElmIHRoZSBzaXRlIGRvZXNuJ3QgdXNlIHRoZSB2aWV3cG9ydCBtZXRhIHRhZyB0byBzcGVjaWZ5IHRoZSB2aWV3cG9ydCwKICAgICAvLyB1c2UgREVGQVVMVF9WSUVXUE9SVF9XSURUSCBhcyB0aGUgZGVmYXVsdCB2aWV3cG9ydCB3aWR0aAotICAgIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9WSUVXUE9SVF9XSURUSCA9IDgwMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVklFV1BPUlRfV0lEVEggPSA5ODA7CiAKICAgICAvLyBub3JtYWxseSB3ZSB0cnkgdG8gZml0IHRoZSBjb250ZW50IHRvIHRoZSBtaW5pbXVtIHByZWZlcnJlZCB3aWR0aAogICAgIC8vIGNhbGN1bGF0ZWQgYnkgdGhlIFdlYmtpdC4gVG8gYXZvaWQgdGhlIGJhZCBiZWhhdmlvciB3aGVuIHNvbWUgc2l0ZSdzCkBAIC02OTgsNDkgKzY4MSw5IEBACiAgICAgLy8gdGhlIG1pbmltdW0gcHJlZmVycmVkIHdpZHRoIGlzIGh1Z2UsIGFuIHVwcGVyIGxpbWl0IGlzIG5lZWRlZC4KICAgICBzdGF0aWMgaW50IHNNYXhWaWV3cG9ydFdpZHRoID0gREVGQVVMVF9WSUVXUE9SVF9XSURUSDsKIAotICAgIC8vIGRlZmF1bHQgc2NhbGUgbGltaXQuIERlcGVuZGluZyBvbiB0aGUgZGlzcGxheSBkZW5zaXR5Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgREVGQVVMVF9NQVhfWk9PTV9TQ0FMRTsKLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBERUZBVUxUX01JTl9aT09NX1NDQUxFOwotICAgIC8vIHNjYWxlIGxpbWl0LCB3aGljaCBjYW4gYmUgc2V0IHRocm91Z2ggdmlld3BvcnQgbWV0YSB0YWcgaW4gdGhlIHdlYiBwYWdlCi0gICAgcHJpdmF0ZSBmbG9hdCBtTWF4Wm9vbVNjYWxlOwotICAgIHByaXZhdGUgZmxvYXQgbU1pblpvb21TY2FsZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKLQogICAgIC8vIGluaXRpYWwgc2NhbGUgaW4gcGVyY2VudC4gMCBtZWFucyB1c2luZyBkZWZhdWx0LgogICAgIHByaXZhdGUgaW50IG1Jbml0aWFsU2NhbGVJblBlcmNlbnQgPSAwOwogCi0gICAgLy8gd2hpbGUgaW4gdGhlIHpvb20gb3ZlcnZpZXcgbW9kZSwgdGhlIHBhZ2UncyB3aWR0aCBpcyBmdWxseSBmaXQgdG8gdGhlCi0gICAgLy8gY3VycmVudCB3aW5kb3cuIFRoZSBwYWdlIGlzIGFsaXZlLCBpbiBhbm90aGVyIHdvcmRzLCB5b3UgY2FuIGNsaWNrIHRvCi0gICAgLy8gZm9sbG93IHRoZSBsaW5rcy4gRG91YmxlIHRhcCB3aWxsIHRvZ2dsZSBiZXR3ZWVuIHpvb20gb3ZlcnZpZXcgbW9kZSBhbmQKLSAgICAvLyB0aGUgbGFzdCB6b29tIHNjYWxlLgotICAgIGJvb2xlYW4gbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7Ci0KLSAgICAvLyBpZGVhbGx5IG1ab29tT3ZlcnZpZXdXaWR0aCBzaG91bGQgYmUgbUNvbnRlbnRXaWR0aC4gQnV0IHNpdGVzIGxpa2UgZXNwbiwKLSAgICAvLyBlbmdhZGdldCBhbHdheXMgaGF2ZSB3aWRlciBtQ29udGVudFdpZHRoIG5vIG1hdHRlciB3aGF0IHZpZXdwb3J0IHNpemUgaXMuCi0gICAgaW50IG1ab29tT3ZlcnZpZXdXaWR0aCA9IERFRkFVTFRfVklFV1BPUlRfV0lEVEg7Ci0gICAgZmxvYXQgbVRleHRXcmFwU2NhbGU7Ci0KLSAgICAvLyBkZWZhdWx0IHNjYWxlLiBEZXBlbmRpbmcgb24gdGhlIGRpc3BsYXkgZGVuc2l0eS4KLSAgICBzdGF0aWMgaW50IERFRkFVTFRfU0NBTEVfUEVSQ0VOVDsKLSAgICBwcml2YXRlIGZsb2F0IG1EZWZhdWx0U2NhbGU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCA9IDAuMDFmOwotCi0gICAgLy8gc2V0IHRvIHRydWUgdGVtcG9yYXJpbHkgZHVyaW5nIFNjYWxlR2VzdHVyZSB0cmlnZ2VyZWQgem9vbQotICAgIHByaXZhdGUgYm9vbGVhbiBtUHJldmlld1pvb21Pbmx5ID0gZmFsc2U7Ci0KLSAgICAvLyBjb21wdXRlZCBzY2FsZSBhbmQgaW52ZXJzZSwgZnJvbSBtWm9vbVdpZHRoLgotICAgIHByaXZhdGUgZmxvYXQgbUFjdHVhbFNjYWxlOwotICAgIHByaXZhdGUgZmxvYXQgbUludkFjdHVhbFNjYWxlOwotICAgIC8vIGlmIHRoaXMgaXMgbm9uLXplcm8sIGl0IGlzIHVzZWQgb24gZHJhd2luZyByYXRoZXIgdGhhbiBtQWN0dWFsU2NhbGUKLSAgICBwcml2YXRlIGZsb2F0IG1ab29tU2NhbGU7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtSW52SW5pdGlhbFpvb21TY2FsZTsKLSAgICBwcml2YXRlIGZsb2F0IG1JbnZGaW5hbFpvb21TY2FsZTsKLSAgICBwcml2YXRlIGludCBtSW5pdGlhbFNjcm9sbFg7Ci0gICAgcHJpdmF0ZSBpbnQgbUluaXRpYWxTY3JvbGxZOwotICAgIHByaXZhdGUgbG9uZyBtWm9vbVN0YXJ0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaT09NX0FOSU1BVElPTl9MRU5HVEggPSA1MDA7Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gbVVzZXJTY3JvbGwgPSBmYWxzZTsKIAogICAgIHByaXZhdGUgaW50IG1TbmFwU2Nyb2xsTW9kZSA9IFNOQVBfTk9ORTsKQEAgLTc2NCwyNiArNzA3LDMxIEBACiAgICAgcHJpdmF0ZSBpbnQgbUhvcml6b250YWxTY3JvbGxCYXJNb2RlID0gU0NST0xMQkFSX0FVVE87CiAgICAgcHJpdmF0ZSBpbnQgbVZlcnRpY2FsU2Nyb2xsQmFyTW9kZSA9IFNDUk9MTEJBUl9BVVRPOwogCi0gICAgLyoqCi0gICAgICogTWF4IGRpc3RhbmNlIHRvIG92ZXJzY3JvbGwgYnkgaW4gcGl4ZWxzLgotICAgICAqIFRoaXMgaG93IGZhciBjb250ZW50IGNhbiBiZSBwdWxsZWQgYmV5b25kIGl0cyBub3JtYWwgYm91bmRzIGJ5IHRoZSB1c2VyLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1PdmVyc2Nyb2xsRGlzdGFuY2U7CisgICAgLy8gY29uc3RhbnRzIGZvciBkZXRlcm1pbmluZyBzY3JpcHQgaW5qZWN0aW9uIHN0cmF0ZWd5CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDQ0VTU0lCSUxJVFlfU0NSSVBUX0lOSkVDVElPTl9VTkRFRklORUQgPSAtMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNDRVNTSUJJTElUWV9TQ1JJUFRfSU5KRUNUSU9OX09QVEVEX09VVCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDQ0VTU0lCSUxJVFlfU0NSSVBUX0lOSkVDVElPTl9QUk9WSURFRCA9IDE7CiAKLSAgICAvKioKLSAgICAgKiBNYXggZGlzdGFuY2UgdG8gb3ZlcmZsaW5nIGJ5IGluIHBpeGVscy4KLSAgICAgKiBUaGlzIGlzIGhvdyBmYXIgZmxpbmdlZCBjb250ZW50IGNhbiBtb3ZlIGJleW9uZCB0aGUgZW5kIG9mIGl0cyBub3JtYWwgYm91bmRzLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1PdmVyZmxpbmdEaXN0YW5jZTsKKyAgICAvLyB0aGUgYWxpYXMgdmlhIHdoaWNoIGFjY2Vzc2liaWxpdHkgSmF2YVNjcmlwdCBpbnRlcmZhY2UgaXMgZXhwb3NlZAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTElBU19BQ0NFU1NJQklMSVRZX0pTX0lOVEVSRkFDRSA9ICJhY2Nlc3NpYmlsaXR5IjsKIAotICAgIC8qCi0gICAgICogVGhlc2UgbWFuYWdlIHRoZSBlZGdlIGdsb3cgZWZmZWN0IHdoZW4gZmx1bmcgb3IgcHVsbGVkIGJleW9uZCB0aGUgZWRnZXMuCi0gICAgICogSWYgb25lIGlzIG5vdCBudWxsLCBhbGwgYXJlIG5vdCBudWxsLiBDaGVja2luZyBvbmUgZm9yIG51bGwgaXMgYXMgZ29vZCBhcyBjaGVja2luZyBlYWNoLgotICAgICAqLwotICAgIHByaXZhdGUgRWRnZUdsb3cgbUVkZ2VHbG93VG9wOwotICAgIHByaXZhdGUgRWRnZUdsb3cgbUVkZ2VHbG93Qm90dG9tOwotICAgIHByaXZhdGUgRWRnZUdsb3cgbUVkZ2VHbG93TGVmdDsKLSAgICBwcml2YXRlIEVkZ2VHbG93IG1FZGdlR2xvd1JpZ2h0OworICAgIC8vIEphdmFTY3JpcHQgdG8gaW5qZWN0IHRoZSBzY3JpcHQgY2hvb3NlciB3aGljaCB3aWxsCisgICAgLy8gcGljayB0aGUgcmlnaHQgc2NyaXB0IGZvciB0aGUgY3VycmVudCBVUkwKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVNTSUJJTElUWV9TQ1JJUFRfQ0hPT1NFUl9KQVZBU0NSSVBUID0KKyAgICAgICAgImphdmFzY3JpcHQ6KGZ1bmN0aW9uKCkgeyIgKworICAgICAgICAiICAgIHZhciBjaG9vc2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7IiArCisgICAgICAgICIgICAgY2hvb3Nlci50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7IiArCisgICAgICAgICIgICAgY2hvb3Nlci5zcmMgPSAnaHR0cHM6Ly9zc2wuZ3N0YXRpYy5jb20vYWNjZXNzaWJpbGl0eS9qYXZhc2NyaXB0L2FuZHJvaWQvQW5kcm9pZFNjcmlwdENob29zZXIudXNlci5qcyc7IiArCisgICAgICAgICIgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChjaG9vc2VyKTsiICsKKyAgICAgICAgIiAgfSkoKTsiOworCisgICAgLy8gUmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyB0aGUgImF4cyIgVVJMIHBhcmFtZXRlci4KKyAgICAvLyBUaGUgdmFsdWUgb2YgMCBtZWFucyB0aGUgYWNjZXNzaWJpbGl0eSBzY3JpcHQgaXMgb3B0ZWQgb3V0CisgICAgLy8gVGhlIHZhbHVlIG9mIDEgbWVhbnMgdGhlIGFjY2Vzc2liaWxpdHkgc2NyaXB0IGlzIGFscmVhZHkgaW5qZWN0ZWQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUVEVSTl9NQVRDSF9BWFNfVVJMX1BBUkFNRVRFUiA9ICIoXFw/YXhzPSgwfDEpKXwoJmF4cz0oMHwxKSkiOworCisgICAgLy8gdmFyaWFibGUgdG8gY2FjaGUgdGhlIGFib3ZlIHBhdHRlcm4gaW4gY2FzZSBhY2Nlc3NpYmlsaXR5IGlzIGVuYWJsZWQuCisgICAgcHJpdmF0ZSBQYXR0ZXJuIG1NYXRjaEF4c1VybFBhcmFtZXRlclBhdHRlcm47CiAKICAgICAvLyBVc2VkIHRvIG1hdGNoIGtleSBkb3ducyBhbmQga2V5IHVwcwogICAgIHByaXZhdGUgYm9vbGVhbiBtR290S2V5RG93bjsKQEAgLTc5Myw2ICs3NDEsOCBAQAogICAgIC8vIGZvciBldmVudCBsb2cKICAgICBwcml2YXRlIGxvbmcgbUxhc3RUb3VjaFVwVGltZSA9IDA7CiAKKyAgICBwcml2YXRlIGludCBtQXV0b0ZpbGxRdWVyeUlkID0gV2ViVGV4dFZpZXcuRk9STV9OT1RfQVVUT0ZJTExBQkxFOworCiAgICAgLyoqCiAgICAgICogVVJJIHNjaGVtZSBmb3IgdGVsZXBob25lIG51bWJlcgogICAgICAqLwpAQCAtODg5LDQzICs4MzksNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gVGhlIFZpZXcgY29udGFpbmluZyB0aGUgem9vbSBjb250cm9scwotICAgIHByaXZhdGUgRXh0ZW5kZWRab29tQ29udHJvbHMgbVpvb21Db250cm9sczsKLSAgICBwcml2YXRlIFJ1bm5hYmxlIG1ab29tQ29udHJvbFJ1bm5hYmxlOwotCi0gICAgLy8gbVpvb21CdXR0b25zQ29udHJvbGxlciB3aWxsIGJlIGxhenkgaW5pdGlhbGl6ZWQgaW4KLSAgICAvLyBnZXRab29tQnV0dG9uc0NvbnRyb2xsZXIoKSB0byBnZXQgYmV0dGVyIHBlcmZvcm1hbmNlLgotICAgIHByaXZhdGUgWm9vbUJ1dHRvbnNDb250cm9sbGVyIG1ab29tQnV0dG9uc0NvbnRyb2xsZXI7Ci0KLSAgICAvLyBUaGVzZSBrZWVwIHRyYWNrIG9mIHRoZSBjZW50ZXIgcG9pbnQgb2YgdGhlIHpvb20uICBUaGV5IGFyZSB1c2VkIHRvCi0gICAgLy8gZGV0ZXJtaW5lIHRoZSBwb2ludCBhcm91bmQgd2hpY2ggd2Ugc2hvdWxkIHpvb20uCi0gICAgcHJpdmF0ZSBmbG9hdCBtWm9vbUNlbnRlclg7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtWm9vbUNlbnRlclk7Ci0KLSAgICBwcml2YXRlIFpvb21CdXR0b25zQ29udHJvbGxlci5Pblpvb21MaXN0ZW5lciBtWm9vbUxpc3RlbmVyID0KLSAgICAgICAgICAgIG5ldyBab29tQnV0dG9uc0NvbnRyb2xsZXIuT25ab29tTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25WaXNpYmlsaXR5Q2hhbmdlZChib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKLSAgICAgICAgICAgICAgICAvLyBCcmluZyBiYWNrIHRoZSBoaWRkZW4gem9vbSBjb250cm9scy4KLSAgICAgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpLnNldFZpc2liaWxpdHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVpvb21CdXR0b25zRW5hYmxlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25ab29tKGJvb2xlYW4gem9vbUluKSB7Ci0gICAgICAgICAgICBpZiAoem9vbUluKSB7Ci0gICAgICAgICAgICAgICAgem9vbUluKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHpvb21PdXQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXBkYXRlWm9vbUJ1dHRvbnNFbmFibGVkKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0IGEgbmV3IFdlYlZpZXcgd2l0aCBhIENvbnRleHQgb2JqZWN0LgogICAgICAqIEBwYXJhbSBjb250ZXh0IEEgQ29udGV4dCBvYmplY3QgdXNlZCB0byBhY2Nlc3MgYXBwbGljYXRpb24gYXNzZXRzLgpAQCAtOTUwLDcgKzg2MywxOCBAQAogICAgICAqIEBwYXJhbSBkZWZTdHlsZSBUaGUgZGVmYXVsdCBzdHlsZSByZXNvdXJjZSBJRC4KICAgICAgKi8KICAgICBwdWJsaWMgV2ViVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCBudWxsKTsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgV2ViVmlldyB3aXRoIGxheW91dCBwYXJhbWV0ZXJzIGFuZCBhIGRlZmF1bHQgc3R5bGUuCisgICAgICogQHBhcmFtIGNvbnRleHQgQSBDb250ZXh0IG9iamVjdCB1c2VkIHRvIGFjY2VzcyBhcHBsaWNhdGlvbiBhc3NldHMuCisgICAgICogQHBhcmFtIGF0dHJzIEFuIEF0dHJpYnV0ZVNldCBwYXNzZWQgdG8gb3VyIHBhcmVudC4KKyAgICAgKiBAcGFyYW0gZGVmU3R5bGUgVGhlIGRlZmF1bHQgc3R5bGUgcmVzb3VyY2UgSUQuCisgICAgICovCisgICAgcHVibGljIFdlYlZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSwKKyAgICAgICAgICAgIGJvb2xlYW4gcHJpdmF0ZUJyb3dzaW5nKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCBudWxsLCBwcml2YXRlQnJvd3NpbmcpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTYxLDUzICs4ODUsMTM0IEBACiAgICAgICogQHBhcmFtIGNvbnRleHQgQSBDb250ZXh0IG9iamVjdCB1c2VkIHRvIGFjY2VzcyBhcHBsaWNhdGlvbiBhc3NldHMuCiAgICAgICogQHBhcmFtIGF0dHJzIEFuIEF0dHJpYnV0ZVNldCBwYXNzZWQgdG8gb3VyIHBhcmVudC4KICAgICAgKiBAcGFyYW0gZGVmU3R5bGUgVGhlIGRlZmF1bHQgc3R5bGUgcmVzb3VyY2UgSUQuCi0gICAgICogQHBhcmFtIGphdmFzY3JpcHRJbnRlcmZhY2VzIGlzIGEgTWFwIG9mIGludGFyZWZhY2UgbmFtZXMsIGFzIGtleXMsIGFuZAorICAgICAqIEBwYXJhbSBqYXZhc2NyaXB0SW50ZXJmYWNlcyBpcyBhIE1hcCBvZiBpbnRlcmZhY2UgbmFtZXMsIGFzIGtleXMsIGFuZAogICAgICAqIG9iamVjdCBpbXBsZW1lbnRpbmcgdGhvc2UgaW50ZXJmYWNlcywgYXMgdmFsdWVzLgogICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFdlYlZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSwKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gamF2YXNjcmlwdEludGVyZmFjZXMpIHsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gamF2YXNjcmlwdEludGVyZmFjZXMsIGJvb2xlYW4gcHJpdmF0ZUJyb3dzaW5nKSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7Ci0gICAgICAgIGluaXQoKTsKKworICAgICAgICBpZiAoQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0SW5zdGFuY2UoY29udGV4dCkuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChqYXZhc2NyaXB0SW50ZXJmYWNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgamF2YXNjcmlwdEludGVyZmFjZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4cG9zZUFjY2Vzc2liaWxpdHlKYXZhU2NyaXB0QXBpKGphdmFzY3JpcHRJbnRlcmZhY2VzKTsKKyAgICAgICAgfQogCiAgICAgICAgIG1DYWxsYmFja1Byb3h5ID0gbmV3IENhbGxiYWNrUHJveHkoY29udGV4dCwgdGhpcyk7CiAgICAgICAgIG1WaWV3TWFuYWdlciA9IG5ldyBWaWV3TWFuYWdlcih0aGlzKTsKICAgICAgICAgbVdlYlZpZXdDb3JlID0gbmV3IFdlYlZpZXdDb3JlKGNvbnRleHQsIHRoaXMsIG1DYWxsYmFja1Byb3h5LCBqYXZhc2NyaXB0SW50ZXJmYWNlcyk7CiAgICAgICAgIG1EYXRhYmFzZSA9IFdlYlZpZXdEYXRhYmFzZS5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgICAgbVNjcm9sbGVyID0gbmV3IE92ZXJTY3JvbGxlcihjb250ZXh0KTsKKyAgICAgICAgbVNjcm9sbGVyID0gbmV3IFNjcm9sbGVyKGNvbnRleHQpOworICAgICAgICBtWm9vbU1hbmFnZXIgPSBuZXcgWm9vbU1hbmFnZXIodGhpcywgbUNhbGxiYWNrUHJveHkpOwogCisgICAgICAgIC8qIFRoZSBpbml0IG1ldGhvZCBtdXN0IGZvbGxvdyB0aGUgY3JlYXRpb24gb2YgY2VydGFpbiBtZW1iZXIgdmFyaWFibGVzLAorICAgICAgICAgKiBzdWNoIGFzIHRoZSBtWm9vbU1hbmFnZXIuCisgICAgICAgICAqLworICAgICAgICBpbml0KCk7CisgICAgICAgIHNldHVwUGFja2FnZUxpc3RlbmVyKGNvbnRleHQpOwogICAgICAgICB1cGRhdGVNdWx0aVRvdWNoU3VwcG9ydChjb250ZXh0KTsKKworICAgICAgICBpZiAocHJpdmF0ZUJyb3dzaW5nKSB7CisgICAgICAgICAgICBzdGFydFByaXZhdGVCcm93c2luZygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaGUgaW50ZW50IHJlY2VpdmVyIHRoYXQgbW9uaXRvcnMgZm9yIGNoYW5nZXMgdG8gcmVsZXZhbnQgcGFja2FnZXMgKGUuZy4sCisgICAgICogc0dvb2dsZUFwcHMpIGFuZCBub3RpZmllcyBXZWJWaWV3Q29yZSBvZiB0aGVpciBleGlzdGVuY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQnJvYWRjYXN0UmVjZWl2ZXIgc1BhY2thZ2VJbnN0YWxsYXRpb25SZWNlaXZlciA9IG51bGw7CisKKyAgICAvKgorICAgICAqIEEgc2V0IG9mIEdvb2dsZSBwYWNrYWdlcyB3ZSBtb25pdG9yIGZvciB0aGUKKyAgICAgKiBuYXZpZ2F0b3IuaXNBcHBsaWNhdGlvbkluc3RhbGxlZCgpIEFQSS4gQWRkIGFkZGl0aW9uYWwgcGFja2FnZXMgYXMKKyAgICAgKiBuZWVkZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gc0dvb2dsZUFwcHM7CisgICAgc3RhdGljIHsKKyAgICAgICAgc0dvb2dsZUFwcHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIHNHb29nbGVBcHBzLmFkZCgiY29tLmdvb2dsZS5hbmRyb2lkLnlvdXR1YmUiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0dXBQYWNrYWdlTGlzdGVuZXIoQ29udGV4dCBjb250ZXh0KSB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogd2UgbXVzdCBzeW5jaHJvbml6ZSB0aGUgaW5zdGFuY2UgY2hlY2sgYW5kIHRoZSBjcmVhdGlvbiBvZiB0aGUKKyAgICAgICAgICogcmVjZWl2ZXIgdG8gZW5zdXJlIHRoYXQgb25seSBPTkUgcmVjZWl2ZXIgZXhpc3RzIGZvciBhbGwgV2ViVmlldworICAgICAgICAgKiBpbnN0YW5jZXMuCisgICAgICAgICAqLworICAgICAgICBzeW5jaHJvbml6ZWQgKFdlYlZpZXcuY2xhc3MpIHsKKworICAgICAgICAgICAgLy8gaWYgdGhlIHJlY2VpdmVyIGFscmVhZHkgZXhpc3RzIHRoZW4gd2UgZG8gbm90IG5lZWQgdG8gcmVnaXN0ZXIgaXQKKyAgICAgICAgICAgIC8vIGFnYWluCisgICAgICAgICAgICBpZiAoc1BhY2thZ2VJbnN0YWxsYXRpb25SZWNlaXZlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfQURERUQpOworICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfUkVNT1ZFRCk7CisgICAgICAgICAgICBmaWx0ZXIuYWRkRGF0YVNjaGVtZSgicGFja2FnZSIpOworICAgICAgICAgICAgc1BhY2thZ2VJbnN0YWxsYXRpb25SZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lID0gaW50ZW50LmdldERhdGEoKS5nZXRTY2hlbWVTcGVjaWZpY1BhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZXBsYWNpbmcgPSBpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKEludGVudC5FWFRSQV9SRVBMQUNJTkcsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRU1PVkVELmVxdWFscyhhY3Rpb24pICYmIHJlcGxhY2luZykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgaXQgaXMgcmVwbGFjaW5nLCByZWZyZXNoUGx1Z2lucygpIHdoZW4gYWRkaW5nCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoc0dvb2dsZUFwcHMuY29udGFpbnMocGFja2FnZU5hbWUpICYmIG1XZWJWaWV3Q29yZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSW50ZW50LkFDVElPTl9QQUNLQUdFX0FEREVELmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkFERF9QQUNLQUdFX05BTUUsIHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlJFTU9WRV9QQUNLQUdFX05BTUUsIHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIFBsdWdpbk1hbmFnZXIgcG0gPSBQbHVnaW5NYW5hZ2VyLmdldEluc3RhbmNlKGNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICBpZiAocG0uY29udGFpbnNQbHVnaW5QZXJtaXNzaW9uQW5kU2lnbmF0dXJlcyhwYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBtLnJlZnJlc2hQbHVnaW5zKEludGVudC5BQ1RJT05fUEFDS0FHRV9BRERFRC5lcXVhbHMoYWN0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBjb250ZXh0LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpLnJlZ2lzdGVyUmVjZWl2ZXIoc1BhY2thZ2VJbnN0YWxsYXRpb25SZWNlaXZlciwgZmlsdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGlmIGFueSBvZiB0aGUgbW9uaXRvcmVkIGFwcHMgYXJlIGFscmVhZHkgaW5zdGFsbGVkCisgICAgICAgIEFzeW5jVGFzazxWb2lkLCBWb2lkLCBTZXQ8U3RyaW5nPj4gdGFzayA9IG5ldyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgU2V0PFN0cmluZz4+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBkb0luQmFja2dyb3VuZChWb2lkLi4uIHVudXNlZCkgeworICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IGluc3RhbGxlZFBhY2thZ2VzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgICAgICAgICBMaXN0PFBhY2thZ2VJbmZvPiBwYWNrYWdlcyA9IHBtLmdldEluc3RhbGxlZFBhY2thZ2VzKDApOworICAgICAgICAgICAgICAgIGZvciAoUGFja2FnZUluZm8gcCA6IHBhY2thZ2VzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzR29vZ2xlQXBwcy5jb250YWlucyhwLnBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkUGFja2FnZXMuYWRkKHAucGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YWxsZWRQYWNrYWdlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRXhlY3V0ZXMgb24gdGhlIFVJIHRocmVhZAorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFeGVjdXRlKFNldDxTdHJpbmc+IGluc3RhbGxlZFBhY2thZ2VzKSB7CisgICAgICAgICAgICAgICAgaWYgKG1XZWJWaWV3Q29yZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5BRERfUEFDS0FHRV9OQU1FUywgaW5zdGFsbGVkUGFja2FnZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdGFzay5leGVjdXRlKCk7CiAgICAgfQogCiAgICAgdm9pZCB1cGRhdGVNdWx0aVRvdWNoU3VwcG9ydChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpOwotICAgICAgICBmaW5hbCBQYWNrYWdlTWFuYWdlciBwbSA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKLSAgICAgICAgbVN1cHBvcnRNdWx0aVRvdWNoID0gcG0uaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1RPVUNIU0NSRUVOX01VTFRJVE9VQ0gpCi0gICAgICAgICAgICAgICAgJiYgc2V0dGluZ3Muc3VwcG9ydFpvb20oKSAmJiBzZXR0aW5ncy5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCk7Ci0gICAgICAgIG1BbGxvd1BhbkFuZFNjYWxlID0gcG0uaGFzU3lzdGVtRmVhdHVyZSgKLSAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1RPVUNIU0NSRUVOX01VTFRJVE9VQ0hfRElTVElOQ1QpOwotICAgICAgICBpZiAobVN1cHBvcnRNdWx0aVRvdWNoICYmIChtU2NhbGVEZXRlY3RvciA9PSBudWxsKSkgewotICAgICAgICAgICAgbVNjYWxlRGV0ZWN0b3IgPSBuZXcgU2NhbGVHZXN0dXJlRGV0ZWN0b3IoY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFNjYWxlRGV0ZWN0b3JMaXN0ZW5lcigpKTsKLSAgICAgICAgfSBlbHNlIGlmICghbVN1cHBvcnRNdWx0aVRvdWNoICYmIChtU2NhbGVEZXRlY3RvciAhPSBudWxsKSkgewotICAgICAgICAgICAgbVNjYWxlRGV0ZWN0b3IgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVpvb21CdXR0b25zRW5hYmxlZCgpIHsKLSAgICAgICAgaWYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICBib29sZWFuIGNhblpvb21JbiA9IG1BY3R1YWxTY2FsZSA8IG1NYXhab29tU2NhbGU7Ci0gICAgICAgIGJvb2xlYW4gY2FuWm9vbU91dCA9IG1BY3R1YWxTY2FsZSA+IG1NaW5ab29tU2NhbGUgJiYgIW1Jblpvb21PdmVydmlldzsKLSAgICAgICAgaWYgKCFjYW5ab29tSW4gJiYgIWNhblpvb21PdXQpIHsKLSAgICAgICAgICAgIC8vIEhpZGUgdGhlIHpvb20gaW4gYW5kIG91dCBidXR0b25zLCBhcyB3ZWxsIGFzIHRoZSBmaXQgdG8gcGFnZQotICAgICAgICAgICAgLy8gYnV0dG9uLCBpZiB0aGUgcGFnZSBjYW5ub3Qgem9vbQotICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5nZXRab29tQ29udHJvbHMoKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTZXQgZWFjaCBvbmUgaW5kaXZpZHVhbGx5LCBhcyBhIHBhZ2UgbWF5IGJlIGFibGUgdG8gem9vbSBpbgotICAgICAgICAgICAgLy8gb3Igb3V0LgotICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRab29tSW5FbmFibGVkKGNhblpvb21Jbik7Ci0gICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFpvb21PdXRFbmFibGVkKGNhblpvb21PdXQpOwotICAgICAgICB9CisgICAgICAgIG1ab29tTWFuYWdlci51cGRhdGVNdWx0aVRvdWNoU3VwcG9ydChjb250ZXh0KTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKQEAgLTEwMjcsNTcgKzEwMzIsMzggQEAKICAgICAgICAgLy8gdXNlIG9uZSBsaW5lIGhlaWdodCwgMTYgYmFzZWQgb24gb3VyIGN1cnJlbnQgZGVmYXVsdCBmb250LCBmb3IgaG93CiAgICAgICAgIC8vIGZhciB3ZSBhbGxvdyBhIHRvdWNoIGJlIGF3YXkgZnJvbSB0aGUgZWRnZSBvZiBhIGxpbmsKICAgICAgICAgbU5hdlNsb3AgPSAoaW50KSAoMTYgKiBkZW5zaXR5KTsKLSAgICAgICAgLy8gZGVuc2l0eSBhZGp1c3RlZCBzY2FsZSBmYWN0b3JzCi0gICAgICAgIERFRkFVTFRfU0NBTEVfUEVSQ0VOVCA9IChpbnQpICgxMDAgKiBkZW5zaXR5KTsKLSAgICAgICAgbURlZmF1bHRTY2FsZSA9IGRlbnNpdHk7Ci0gICAgICAgIG1BY3R1YWxTY2FsZSA9IGRlbnNpdHk7Ci0gICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBkZW5zaXR5OwotICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IGRlbnNpdHk7Ci0gICAgICAgIERFRkFVTFRfTUFYX1pPT01fU0NBTEUgPSA0LjBmICogZGVuc2l0eTsKLSAgICAgICAgREVGQVVMVF9NSU5fWk9PTV9TQ0FMRSA9IDAuMjVmICogZGVuc2l0eTsKLSAgICAgICAgbU1heFpvb21TY2FsZSA9IERFRkFVTFRfTUFYX1pPT01fU0NBTEU7Ci0gICAgICAgIG1NaW5ab29tU2NhbGUgPSBERUZBVUxUX01JTl9aT09NX1NDQUxFOworICAgICAgICBtWm9vbU1hbmFnZXIuaW5pdChkZW5zaXR5KTsKICAgICAgICAgbU1heGltdW1GbGluZyA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWF4aW11bUZsaW5nVmVsb2NpdHkoKTsKLSAgICAgICAgbU92ZXJzY3JvbGxEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcnNjcm9sbERpc3RhbmNlKCk7Ci0gICAgICAgIG1PdmVyZmxpbmdEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcmZsaW5nRGlzdGFuY2UoKTsKKworICAgICAgICAvLyBDb21wdXRlIHRoZSBpbnZlcnNlIG9mIHRoZSBkZW5zaXR5IHNxdWFyZWQuCisgICAgICAgIERSQUdfTEFZRVJfSU5WRVJTRV9ERU5TSVRZX1NRVUFSRUQgPSAxIC8gKGRlbnNpdHkgKiBkZW5zaXR5KTsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRPdmVyc2Nyb2xsTW9kZShpbnQgbW9kZSkgewotICAgICAgICBzdXBlci5zZXRPdmVyc2Nyb2xsTW9kZShtb2RlKTsKLSAgICAgICAgaWYgKG1vZGUgIT0gT1ZFUlNDUk9MTF9ORVZFUikgewotICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBlZGdlID0gcmVzLmdldERyYXdhYmxlKFIuZHJhd2FibGUub3ZlcnNjcm9sbF9lZGdlKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBnbG93ID0gcmVzLmdldERyYXdhYmxlKFIuZHJhd2FibGUub3ZlcnNjcm9sbF9nbG93KTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3AgPSBuZXcgRWRnZUdsb3coZWRnZSwgZ2xvdyk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tID0gbmV3IEVkZ2VHbG93KGVkZ2UsIGdsb3cpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd0xlZnQgPSBuZXcgRWRnZUdsb3coZWRnZSwgZ2xvdyk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQgPSBuZXcgRWRnZUdsb3coZWRnZSwgZ2xvdyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRWRnZUdsb3dUb3AgPSBudWxsOwotICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tID0gbnVsbDsKLSAgICAgICAgICAgIG1FZGdlR2xvd0xlZnQgPSBudWxsOwotICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQgPSBudWxsOworICAgIC8qKgorICAgICAqIEV4cG9zZXMgYWNjZXNzaWJpbGl0eSBBUElzIHRvIEphdmFTY3JpcHQgYnkgYXBwZW5kaW5nIHRoZW0gdG8gdGhlIEphdmFTY3JpcHQKKyAgICAgKiBpbnRlcmZhY2VzIG1hcCBwcm92aWRlZCBieSB0aGUgV2ViVmlldyBjbGllbnQuIEluIGNhc2Ugb2YgY29uZmxpY3RpbmcKKyAgICAgKiBhbGlhcyB3aXRoIHRoZSBvbmUgb2YgdGhlIGFjY2Vzc2liaWxpdHkgQVBJIHRoZSB1c2VyIHNwZWNpZmllZCBvbmUgd2lucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqYXZhc2NyaXB0SW50ZXJmYWNlcyBBIG1hcCB3aXRoIGludGVyZmFjZXMgdG8gYmUgZXhwb3NlZCB0byBKYXZhU2NyaXB0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBleHBvc2VBY2Nlc3NpYmlsaXR5SmF2YVNjcmlwdEFwaShNYXA8U3RyaW5nLCBPYmplY3Q+IGphdmFzY3JpcHRJbnRlcmZhY2VzKSB7CisgICAgICAgIGlmIChqYXZhc2NyaXB0SW50ZXJmYWNlcy5jb250YWluc0tleShBTElBU19BQ0NFU1NJQklMSVRZX0pTX0lOVEVSRkFDRSkpIHsKKyAgICAgICAgICAgIExvZy53KExPR1RBRywgIkphdmFTY3JpcHQgaW50ZXJmYWNlIG1hcHBlZCB0byBcIiIgKyBBTElBU19BQ0NFU1NJQklMSVRZX0pTX0lOVEVSRkFDRQorICAgICAgICAgICAgICAgICAgICArICJcIiBvdmVycmlkZXMgdGhlIGFjY2Vzc2liaWxpdHkgQVBJIEphdmFTY3JpcHQgaW50ZXJmYWNlLiBObyBhY2Nlc3NpYmlsaXR5IgorICAgICAgICAgICAgICAgICAgICArICJBUEkgd2lsbCBiZSBleHBvc2VkIHRvIEphdmFTY3JpcHQhIik7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKworICAgICAgICAvLyBleHBvc2UgdGhlIFRUUyBmb3Igbm93IC4uLgorICAgICAgICBqYXZhc2NyaXB0SW50ZXJmYWNlcy5wdXQoQUxJQVNfQUNDRVNTSUJJTElUWV9KU19JTlRFUkZBQ0UsCisgICAgICAgICAgICAgICAgbmV3IFRleHRUb1NwZWVjaChnZXRDb250ZXh0KCksIG51bGwpKTsKICAgICB9CiAKICAgICAvKiBwYWNrYWdlICovdm9pZCB1cGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoaW50IHpvb21EZW5zaXR5KSB7Ci0gICAgICAgIGZpbmFsIGZsb2F0IGRlbnNpdHkgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5CisgICAgICAgIGZpbmFsIGZsb2F0IGRlbnNpdHkgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHkKICAgICAgICAgICAgICAgICAqIDEwMCAvIHpvb21EZW5zaXR5OwotICAgICAgICBpZiAoTWF0aC5hYnMoZGVuc2l0eSAtIG1EZWZhdWx0U2NhbGUpID4gMC4wMSkgewotICAgICAgICAgICAgZmxvYXQgc2NhbGVGYWN0b3IgPSBkZW5zaXR5IC8gbURlZmF1bHRTY2FsZTsKLSAgICAgICAgICAgIC8vIGFkanVzdCB0aGUgbGltaXRzCi0gICAgICAgICAgICBtTmF2U2xvcCA9IChpbnQpICgxNiAqIGRlbnNpdHkpOwotICAgICAgICAgICAgREVGQVVMVF9TQ0FMRV9QRVJDRU5UID0gKGludCkgKDEwMCAqIGRlbnNpdHkpOwotICAgICAgICAgICAgREVGQVVMVF9NQVhfWk9PTV9TQ0FMRSA9IDQuMGYgKiBkZW5zaXR5OwotICAgICAgICAgICAgREVGQVVMVF9NSU5fWk9PTV9TQ0FMRSA9IDAuMjVmICogZGVuc2l0eTsKLSAgICAgICAgICAgIG1EZWZhdWx0U2NhbGUgPSBkZW5zaXR5OwotICAgICAgICAgICAgbU1heFpvb21TY2FsZSAqPSBzY2FsZUZhY3RvcjsKLSAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgKj0gc2NhbGVGYWN0b3I7Ci0gICAgICAgICAgICBzZXROZXdab29tU2NhbGUobUFjdHVhbFNjYWxlICogc2NhbGVGYWN0b3IsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgfQorICAgICAgICBtTmF2U2xvcCA9IChpbnQpICgxNiAqIGRlbnNpdHkpOworICAgICAgICBtWm9vbU1hbmFnZXIudXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KGRlbnNpdHkpOwogICAgIH0KIAogICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbiBvblNhdmVQYXNzd29yZChTdHJpbmcgc2NoZW1lUGx1c0hvc3QsIFN0cmluZyB1c2VybmFtZSwKQEAgLTExOTQsMTYgKzExODAsMTcgQEAKICAgICAgKiByZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIHRpdGxlYmFydmlldyAoaWYgYW55KS4gRG9lcyBub3QgY2FyZSBhYm91dAogICAgICAqIHNjcm9sbGluZwogICAgICAqLwotICAgIHByaXZhdGUgaW50IGdldFRpdGxlSGVpZ2h0KCkgeworICAgIGludCBnZXRUaXRsZUhlaWdodCgpIHsKICAgICAgICAgcmV0dXJuIG1UaXRsZUJhciAhPSBudWxsID8gbVRpdGxlQmFyLmdldEhlaWdodCgpIDogMDsKICAgICB9CiAKICAgICAvKgogICAgICAqIFJldHVybiB0aGUgYW1vdW50IG9mIHRoZSB0aXRsZWJhcnZpZXcgKGlmIGFueSkgdGhhdCBpcyB2aXNpYmxlCisgICAgICoKKyAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHByaXZhdGUgaW50IGdldFZpc2libGVUaXRsZUhlaWdodCgpIHsKLSAgICAgICAgLy8gbmVlZCB0byByZXN0cmljdCBtU2Nyb2xsWSBkdWUgdG8gb3ZlciBzY3JvbGwKLSAgICAgICAgcmV0dXJuIE1hdGgubWF4KGdldFRpdGxlSGVpZ2h0KCkgLSBNYXRoLm1heCgwLCBtU2Nyb2xsWSksIDApOworICAgIHB1YmxpYyBpbnQgZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0KCkgeworICAgICAgICByZXR1cm4gTWF0aC5tYXgoZ2V0VGl0bGVIZWlnaHQoKSAtIG1TY3JvbGxZLCAwKTsKICAgICB9CiAKICAgICAvKgpAQCAtMTI4NCw5ICsxMjcxLDI3IEBACiAgICAgICAgIHJldHVybiBtRGF0YWJhc2UuZ2V0SHR0cEF1dGhVc2VybmFtZVBhc3N3b3JkKGhvc3QsIHJlYWxtKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgRmluZCBvciBTZWxlY3QgQWN0aW9uTW9kZXMsIGlmIGFjdGl2ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2xlYXJBY3Rpb25Nb2RlcygpIHsKKyAgICAgICAgaWYgKG1TZWxlY3RDYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICBtU2VsZWN0Q2FsbGJhY2suZmluaXNoKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1GaW5kQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbUZpbmRDYWxsYmFjay5maW5pc2goKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB0byBjbGVhciBzdGF0ZSB3aGVuIG1vdmluZyBmcm9tIG9uZSBwYWdlIHRvIGFub3RoZXIsIG9yIGNoYW5naW5nCisgICAgICogaW4gc29tZSBvdGhlciB3YXkgdGhhdCBtYWtlcyBlbGVtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgcGFnZQorICAgICAqIChzdWNoIGFzIFdlYlRleHRWaWV3IG9yIEFjdGlvbk1vZGVzKSBubyBsb25nZXIgcmVsZXZhbnQuCisgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGNsZWFySGVscGVycygpIHsKLSAgICAgICAgY2xlYXJUZXh0RW50cnkoZmFsc2UpOwotICAgICAgICBzZWxlY3Rpb25Eb25lKCk7CisgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CisgICAgICAgIGNsZWFyQWN0aW9uTW9kZXMoKTsKKyAgICAgICAgZGlzbWlzc0Z1bGxTY3JlZW5Nb2RlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjk2LDYgKzEzMDEsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CiAgICAgICAgIGNsZWFySGVscGVycygpOworCiAgICAgICAgIGlmIChtV2ViVmlld0NvcmUgIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gU2V0IHRoZSBoYW5kbGVycyB0byBudWxsIGJlZm9yZSBkZXN0cm95aW5nIFdlYlZpZXdDb3JlIHNvIG5vCiAgICAgICAgICAgICAvLyBtb3JlIG1lc3NhZ2VzIHdpbGwgYmUgcG9zdGVkLgpAQCAtMTQyMyw2ICsxNDI5LDggQEAKICAgICAgICAgICAgIG91dFN0YXRlLnB1dEJ1bmRsZSgiY2VydGlmaWNhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNzbENlcnRpZmljYXRlLnNhdmVTdGF0ZShtQ2VydGlmaWNhdGUpKTsKICAgICAgICAgfQorICAgICAgICBvdXRTdGF0ZS5wdXRCb29sZWFuKCJwcml2YXRlQnJvd3NpbmdFbmFibGVkIiwgaXNQcml2YXRlQnJvd3NpbmdFbmFibGVkKCkpOworICAgICAgICBtWm9vbU1hbmFnZXIuc2F2ZVpvb21TdGF0ZShvdXRTdGF0ZSk7CiAgICAgICAgIHJldHVybiBsaXN0OwogICAgIH0KIApAQCAtMTQ2OCwyOSArMTQ3NiwyMyBAQAogICAgICAgICAvLyBub3cgdXBkYXRlIHRoZSBidW5kbGUKICAgICAgICAgYi5wdXRJbnQoInNjcm9sbFgiLCBtU2Nyb2xsWCk7CiAgICAgICAgIGIucHV0SW50KCJzY3JvbGxZIiwgbVNjcm9sbFkpOwotICAgICAgICBiLnB1dEZsb2F0KCJzY2FsZSIsIG1BY3R1YWxTY2FsZSk7Ci0gICAgICAgIGIucHV0RmxvYXQoInRleHR3cmFwU2NhbGUiLCBtVGV4dFdyYXBTY2FsZSk7Ci0gICAgICAgIGIucHV0Qm9vbGVhbigib3ZlcnZpZXciLCBtSW5ab29tT3ZlcnZpZXcpOworICAgICAgICBtWm9vbU1hbmFnZXIuc2F2ZVpvb21TdGF0ZShiKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVIaXN0b3J5UGljdHVyZUZpZWxkcyhQaWN0dXJlIHAsIEJ1bmRsZSBiKSB7CiAgICAgICAgIGludCBzeCA9IGIuZ2V0SW50KCJzY3JvbGxYIiwgMCk7CiAgICAgICAgIGludCBzeSA9IGIuZ2V0SW50KCJzY3JvbGxZIiwgMCk7Ci0gICAgICAgIGZsb2F0IHNjYWxlID0gYi5nZXRGbG9hdCgic2NhbGUiLCAxLjBmKTsKKwogICAgICAgICBtRHJhd0hpc3RvcnkgPSB0cnVlOwogICAgICAgICBtSGlzdG9yeVBpY3R1cmUgPSBwOwogICAgICAgICBtU2Nyb2xsWCA9IHN4OwogICAgICAgICBtU2Nyb2xsWSA9IHN5OworICAgICAgICBtWm9vbU1hbmFnZXIucmVzdG9yZVpvb21TdGF0ZShiKTsKKyAgICAgICAgZmluYWwgZmxvYXQgc2NhbGUgPSBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKTsKICAgICAgICAgbUhpc3RvcnlXaWR0aCA9IE1hdGgucm91bmQocC5nZXRXaWR0aCgpICogc2NhbGUpOwogICAgICAgICBtSGlzdG9yeUhlaWdodCA9IE1hdGgucm91bmQocC5nZXRIZWlnaHQoKSAqIHNjYWxlKTsKLSAgICAgICAgLy8gYXMgZ2V0V2lkdGgoKSAvIGdldEhlaWdodCgpIG9mIHRoZSB2aWV3IGFyZSBub3QgYXZhaWxhYmxlIHlldCwgc2V0IHVwCi0gICAgICAgIC8vIG1BY3R1YWxTY2FsZSwgc28gdGhhdCB3aGVuIG9uU2l6ZUNoYW5nZWQoKSBpcyBjYWxsZWQsIHRoZSByZXN0IHdpbGwKLSAgICAgICAgLy8gYmUgc2V0IGNvcnJlY3RseQotICAgICAgICBtQWN0dWFsU2NhbGUgPSBzY2FsZTsKLSAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIHNjYWxlOwotICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IGIuZ2V0RmxvYXQoInRleHR3cmFwU2NhbGUiLCBzY2FsZSk7Ci0gICAgICAgIG1Jblpvb21PdmVydmlldyA9IGIuZ2V0Qm9vbGVhbigib3ZlcnZpZXciKTsKKwogICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgfQogCkBAIC0xNTkxLDYgKzE1OTMsMTEgQEAKICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGNvcHkgdG8gaGF2ZSB0aGUgY29ycmVjdCBpbmRleC4KICAgICAgICAgICAgICAgICByZXR1cm5MaXN0LnNldEN1cnJlbnRJbmRleChpbmRleCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBSZXN0b3JlIHByaXZhdGUgYnJvd3Npbmcgc2V0dGluZy4KKyAgICAgICAgICAgIGlmIChpblN0YXRlLmdldEJvb2xlYW4oInByaXZhdGVCcm93c2luZ0VuYWJsZWQiKSkgeworICAgICAgICAgICAgICAgIGdldFNldHRpbmdzKCkuc2V0UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5yZXN0b3JlWm9vbVN0YXRlKGluU3RhdGUpOwogICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBwZW5kaW5nIG1lc3NhZ2VzIGJlY2F1c2Ugd2UgYXJlIHJlc3RvcmluZyBwcmV2aW91cwogICAgICAgICAgICAgLy8gc3RhdGUuCiAgICAgICAgICAgICBtV2ViVmlld0NvcmUucmVtb3ZlTWVzc2FnZXMoKTsKQEAgLTE3MDIsNiArMTcwOSw0NSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNhdmVzIHRoZSBjdXJyZW50IHZpZXcgYXMgYSB3ZWIgYXJjaGl2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgZmlsZW5hbWUgd2hlcmUgdGhlIGFyY2hpdmUgc2hvdWxkIGJlIHBsYWNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzYXZlV2ViQXJjaGl2ZShTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICAgICAgc2F2ZVdlYkFyY2hpdmUoZmlsZW5hbWUsIGZhbHNlLCBudWxsKTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjbGFzcyBTYXZlV2ViQXJjaGl2ZU1lc3NhZ2UgeworICAgICAgICBTYXZlV2ViQXJjaGl2ZU1lc3NhZ2UgKFN0cmluZyBiYXNlbmFtZSwgYm9vbGVhbiBhdXRvbmFtZSwgVmFsdWVDYWxsYmFjazxTdHJpbmc+IGNhbGxiYWNrKSB7CisgICAgICAgICAgICBtQmFzZW5hbWUgPSBiYXNlbmFtZTsKKyAgICAgICAgICAgIG1BdXRvbmFtZSA9IGF1dG9uYW1lOworICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgIH0KKworICAgICAgICAvKiBwYWNrYWdlICovIGZpbmFsIFN0cmluZyBtQmFzZW5hbWU7CisgICAgICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgYm9vbGVhbiBtQXV0b25hbWU7CisgICAgICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgVmFsdWVDYWxsYmFjazxTdHJpbmc+IG1DYWxsYmFjazsKKyAgICAgICAgLyogcGFja2FnZSAqLyBTdHJpbmcgbVJlc3VsdEZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZXMgdGhlIGN1cnJlbnQgdmlldyBhcyBhIHdlYiBhcmNoaXZlLgorICAgICAqCisgICAgICogQHBhcmFtIGJhc2VuYW1lIFRoZSBmaWxlbmFtZSB3aGVyZSB0aGUgYXJjaGl2ZSBzaG91bGQgYmUgcGxhY2VkLgorICAgICAqIEBwYXJhbSBhdXRvbmFtZSBJZiBmYWxzZSwgdGFrZXMgYmFzZW5hbWUgdG8gYmUgYSBmaWxlLiBJZiB0cnVlLCBiYXNlbmFtZQorICAgICAqICAgICAgICAgICAgICAgICBpcyBhc3N1bWVkIHRvIGJlIGEgZGlyZWN0b3J5IGluIHdoaWNoIGEgZmlsZW5hbWUgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICBjaG9zZW4gYWNjb3JkaW5nIHRvIHRoZSB1cmwgb2YgdGhlIGN1cnJlbnQgcGFnZS4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHRoZSB3ZWIgYXJjaGl2ZSBoYXMgYmVlbiBzYXZlZC4gVGhlCisgICAgICogICAgICAgICAgICAgICAgIHBhcmFtZXRlciBmb3Igb25SZWNlaXZlVmFsdWUgd2lsbCBlaXRoZXIgYmUgdGhlIGZpbGVuYW1lCisgICAgICogICAgICAgICAgICAgICAgIHVuZGVyIHdoaWNoIHRoZSBmaWxlIHdhcyBzYXZlZCwgb3IgbnVsbCBpZiBzYXZpbmcgdGhlCisgICAgICogICAgICAgICAgICAgICAgIGZpbGUgZmFpbGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNhdmVXZWJBcmNoaXZlKFN0cmluZyBiYXNlbmFtZSwgYm9vbGVhbiBhdXRvbmFtZSwgVmFsdWVDYWxsYmFjazxTdHJpbmc+IGNhbGxiYWNrKSB7CisgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TQVZFX1dFQkFSQ0hJVkUsCisgICAgICAgICAgICBuZXcgU2F2ZVdlYkFyY2hpdmVNZXNzYWdlKGJhc2VuYW1lLCBhdXRvbmFtZSwgY2FsbGJhY2spKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTdG9wIHRoZSBjdXJyZW50IGxvYWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc3RvcExvYWRpbmcoKSB7CkBAIC0xODAxLDYgKzE4NDcsNDggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBwcml2YXRlIGJyb3dzaW5nIGlzIGVuYWJsZWQgaW4gdGhpcyBXZWJWaWV3LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFNldHRpbmdzKCkuaXNQcml2YXRlQnJvd3NpbmdFbmFibGVkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0UHJpdmF0ZUJyb3dzaW5nKCkgeworICAgICAgICBib29sZWFuIHdhc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQgPSBpc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQoKTsKKworICAgICAgICBnZXRTZXR0aW5ncygpLnNldFByaXZhdGVCcm93c2luZ0VuYWJsZWQodHJ1ZSk7CisKKyAgICAgICAgaWYgKCF3YXNQcml2YXRlQnJvd3NpbmdFbmFibGVkKSB7CisgICAgICAgICAgICBsb2FkVXJsKCJicm93c2VyOmluY29nbml0byIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZXRlcyBhbnkgZmlsZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgYXMgYSBwYXJ0IG9mIHRoZSBsYXN0IHByaXZhdGUKKyAgICAgKiBicm93c2luZyBzZXNzaW9uIGFuZCBjbGVhcnMgYW55IGludGVybmFsIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGF0CisgICAgICogc2Vzc2lvbi4gVGhlIGNvbnNlcXVlbmNlcyBvZiBjYWxsaW5nIHRoaXMgbWV0aG9kIHdoaWxlIGEgcHJpdmF0ZQorICAgICAqIGJyb3dzaW5nIHNlc3Npb24gaXMgYWN0aXZlIGFyZSB1bnNwZWNpZmllZC4KKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgc2FtZSBjb250ZXh0IHdoaWNoIHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJpdmF0ZQorICAgICAqICAgICAgICAgICAgICAgIGJyb3dzaW5nIFdlYlZpZXcuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBwcml2YXRlIGJyb3dzaW5nIGZpbGVzIHdlcmUgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQsCisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xlYW51cFByaXZhdGVCcm93c2luZ0ZpbGVzKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAvLyBJdCBzZWVtcyB3cm9uZyB0aGF0IHdlIGhhdmUgdG8gcGFzcyB0aGUgc3RvcmFnZSBsb2NhdGlvbnMgaGVyZSwgZ2l2ZW4KKyAgICAgICAgLy8gdGhhdCB0aGUgc3RvcmFnZSBmaWxlcyBhcmUgY3JlYXRlZCBuYXRpdmUtc2lkZSBpbiBXZWJSZXF1ZXN0Q29udGV4dAorICAgICAgICAvLyAoYWxiZWl0IHVzaW5nIGEgZHVtYiBnZXR0ZXIgb24gQnJvd3NlckZyYW1lIHRvIGdldCB0aGUgcGF0aHMgZnJvbQorICAgICAgICAvLyBKYXZhKS4gSXQgbG9va3MgbGlrZSB0aGlzIGlzIHJlcXVpcmVkIGJlY2F1c2Ugd2UgbWF5IG5lZWQgdG8gY2FsbAorICAgICAgICAvLyB0aGlzIG1ldGhvZCBiZWZvcmUgdGhlIEJyb3dzZXJGcmFtZSBoYXMgYmVlbiBzZXQgdXAuCisgICAgICAgIC8vIFRPRE86IEludmVzdGlnYXRlIHdoZXRoZXIgdGhpcyBjYW4gYmUgYXZvaWRlZC4KKyAgICAgICAgcmV0dXJuIG5hdGl2ZUNsZWFudXBQcml2YXRlQnJvd3NpbmdGaWxlcyhjb250ZXh0LmdldERhdGFiYXNlUGF0aCgiZHVtbXkiKS5nZXRQYXJlbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldENhY2hlRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZUNsZWFudXBQcml2YXRlQnJvd3NpbmdGaWxlcyhTdHJpbmcgZGF0YWJhc2VEaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjYWNoZURpcmVjdG9yeSk7CisKICAgICBwcml2YXRlIGJvb2xlYW4gZXh0ZW5kU2Nyb2xsKGludCB5KSB7CiAgICAgICAgIGludCBmaW5hbFkgPSBtU2Nyb2xsZXIuZ2V0RmluYWxZKCk7CiAgICAgICAgIGludCBuZXdZID0gcGluTG9jWShmaW5hbFkgKyB5KTsKQEAgLTE4NDgsNyArMTkzNiw3IEBACiAgICAgICAgIH0KICAgICAgICAgbmF0aXZlQ2xlYXJDdXJzb3IoKTsgLy8gc3RhcnQgbmV4dCB0cmFja2JhbGwgbW92ZW1lbnQgZnJvbSBwYWdlIGVkZ2UKICAgICAgICAgaWYgKGJvdHRvbSkgewotICAgICAgICAgICAgcmV0dXJuIHBpblNjcm9sbFRvKG1TY3JvbGxYLCBjb21wdXRlUmVhbFZlcnRpY2FsU2Nyb2xsUmFuZ2UoKSwgdHJ1ZSwgMCk7CisgICAgICAgICAgICByZXR1cm4gcGluU2Nyb2xsVG8obVNjcm9sbFgsIGNvbXB1dGVWZXJ0aWNhbFNjcm9sbFJhbmdlKCksIHRydWUsIDApOwogICAgICAgICB9CiAgICAgICAgIC8vIFBhZ2UgZG93bi4KICAgICAgICAgaW50IGggPSBnZXRIZWlnaHQoKTsKQEAgLTE4NzAsNiArMTk1OCw3IEBACiAgICAgcHVibGljIHZvaWQgY2xlYXJWaWV3KCkgewogICAgICAgICBtQ29udGVudFdpZHRoID0gMDsKICAgICAgICAgbUNvbnRlbnRIZWlnaHQgPSAwOworICAgICAgICBpZiAobU5hdGl2ZUNsYXNzICE9IDApIG5hdGl2ZVNldEJhc2VMYXllcigwKTsKICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkNMRUFSX0NPTlRFTlQpOwogICAgIH0KIApAQCAtMTg4Myw4ICsxOTcyLDkgQEAKICAgICAgKiAgICAgICAgIGJvdW5kcyBvZiB0aGUgdmlldy4KICAgICAgKi8KICAgICBwdWJsaWMgUGljdHVyZSBjYXB0dXJlUGljdHVyZSgpIHsKLSAgICAgICAgaWYgKG51bGwgPT0gbVdlYlZpZXdDb3JlKSByZXR1cm4gbnVsbDsgLy8gY2hlY2sgZm9yIG91dCBvZiBtZW1vcnkgdGFiCi0gICAgICAgIHJldHVybiBtV2ViVmlld0NvcmUuY29weUNvbnRlbnRQaWN0dXJlKCk7CisgICAgICAgIFBpY3R1cmUgcmVzdWx0ID0gbmV3IFBpY3R1cmUoKTsKKyAgICAgICAgbmF0aXZlQ29weUJhc2VDb250ZW50VG9QaWN0dXJlKHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xODk2LDE1ICsxOTg2LDEzIEBACiAKICAgICAvKioKICAgICAgKiBSZW1vdmUgdGhlIFdlYlRleHRWaWV3LgotICAgICAqIEBwYXJhbSBkaXNhYmxlRm9jdXNDb250cm9sbGVyIElmIHRydWUsIHNlbmQgYSBtZXNzYWdlIHRvIHdlYmtpdAotICAgICAqICAgICBkaXNhYmxpbmcgdGhlIGZvY3VzIGNvbnRyb2xsZXIsIHNvIHRoZSBjYXJldCBzdG9wcyBibGlua2luZy4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2xlYXJUZXh0RW50cnkoYm9vbGVhbiBkaXNhYmxlRm9jdXNDb250cm9sbGVyKSB7CisgICAgcHJpdmF0ZSB2b2lkIGNsZWFyVGV4dEVudHJ5KCkgewogICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpKSB7CiAgICAgICAgICAgICBtV2ViVGV4dFZpZXcucmVtb3ZlKCk7Ci0gICAgICAgICAgICBpZiAoZGlzYWJsZUZvY3VzQ29udHJvbGxlcikgewotICAgICAgICAgICAgICAgIHNldEZvY3VzQ29udHJvbGxlckluYWN0aXZlKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGUga2V5Ym9hcmQgbWF5IGJlIG9wZW4gd2l0aCB0aGUgV2ViVmlldyBhcyB0aGUgc2VydmVkIHZpZXcKKyAgICAgICAgICAgIGhpZGVTb2Z0S2V5Ym9hcmQoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTkxMyw3ICsyMDAxLDcgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNjYWxlLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRTY2FsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1BY3R1YWxTY2FsZTsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTkyNSw3ICsyMDEzLDcgQEAKICAgICAgKiBAcGFyYW0gc2NhbGVJblBlcmNlbnQgVGhlIGluaXRpYWwgc2NhbGUgaW4gcGVyY2VudC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2NhbGUoaW50IHNjYWxlSW5QZXJjZW50KSB7Ci0gICAgICAgIG1Jbml0aWFsU2NhbGVJblBlcmNlbnQgPSBzY2FsZUluUGVyY2VudDsKKyAgICAgICAgbVpvb21NYW5hZ2VyLnNldEluaXRpYWxTY2FsZUluUGVyY2VudChzY2FsZUluUGVyY2VudCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xOTM4LDE0ICsyMDI2LDggQEAKICAgICAgICAgICAgIExvZy53KExPR1RBRywgIlRoaXMgV2ViVmlldyBkb2Vzbid0IHN1cHBvcnQgem9vbS4iKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBjbGVhclRleHRFbnRyeShmYWxzZSk7Ci0gICAgICAgIGlmIChnZXRTZXR0aW5ncygpLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKSkgewotICAgICAgICAgICAgZ2V0Wm9vbUJ1dHRvbnNDb250cm9sbGVyKCkuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLAotICAgICAgICAgICAgICAgICAgICBaT09NX0NPTlRST0xTX1RJTUVPVVQpOwotICAgICAgICB9CisgICAgICAgIGNsZWFySGVscGVycygpOworICAgICAgICBtWm9vbU1hbmFnZXIuaW52b2tlWm9vbVBpY2tlcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjA2MCw3ICsyMTQyLDcgQEAKICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGludCBwaW5Mb2MoaW50IHgsIGludCB2aWV3TWF4LCBpbnQgZG9jTWF4KSB7CisgICAgc3RhdGljIGludCBwaW5Mb2MoaW50IHgsIGludCB2aWV3TWF4LCBpbnQgZG9jTWF4KSB7CiAvLyAgICAgICAgTG9nLmQoTE9HVEFHLCAiLS0gcGluTG9jICIgKyB4ICsgIiAiICsgdmlld01heCArICIgIiArIGRvY01heCk7CiAgICAgICAgIGlmIChkb2NNYXggPCB2aWV3TWF4KSB7ICAgLy8gdGhlIGRvYyBoYXMgcm9vbSBvbiB0aGUgc2lkZXMgZm9yICJibGFuayIKICAgICAgICAgICAgIC8vIHBpbiB0aGUgc2hvcnQgZG9jdW1lbnQgdG8gdGhlIHRvcC9sZWZ0IG9mIHRoZSBzY3JlZW4KQEAgLTIwNzcsMTYgKzIxNTksMTQgQEAKICAgICB9CiAKICAgICAvLyBFeHBlY3RzIHggaW4gdmlldyBjb29yZGluYXRlcwotICAgIHByaXZhdGUgaW50IHBpbkxvY1goaW50IHgpIHsKLSAgICAgICAgaWYgKG1Jbk92ZXJTY3JvbGxNb2RlKSByZXR1cm4geDsKLSAgICAgICAgcmV0dXJuIHBpbkxvYyh4LCBnZXRWaWV3V2lkdGgoKSwgY29tcHV0ZVJlYWxIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSk7CisgICAgaW50IHBpbkxvY1goaW50IHgpIHsKKyAgICAgICAgcmV0dXJuIHBpbkxvYyh4LCBnZXRWaWV3V2lkdGgoKSwgY29tcHV0ZUhvcml6b250YWxTY3JvbGxSYW5nZSgpKTsKICAgICB9CiAKICAgICAvLyBFeHBlY3RzIHkgaW4gdmlldyBjb29yZGluYXRlcwotICAgIHByaXZhdGUgaW50IHBpbkxvY1koaW50IHkpIHsKLSAgICAgICAgaWYgKG1Jbk92ZXJTY3JvbGxNb2RlKSByZXR1cm4geTsKKyAgICBpbnQgcGluTG9jWShpbnQgeSkgewogICAgICAgICByZXR1cm4gcGluTG9jKHksIGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlUmVhbFZlcnRpY2FsU2Nyb2xsUmFuZ2UoKSArIGdldFRpdGxlSGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVWZXJ0aWNhbFNjcm9sbFJhbmdlKCkgKyBnZXRUaXRsZUhlaWdodCgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIxMTEsNiArMjE5MSwxNiBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RW1iZWRkZWRUaXRsZUJhcihWaWV3IHYpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gdikgeworICAgICAgICAgICAgLy8gSWYgb25lIG9mIG91ciBjYWxsYmFja3MgaXMgaG9sZGluZyBvbnRvIHRoZSB0aXRsZWJhciB0byByZXBsYWNlCisgICAgICAgICAgICAvLyBpdCB3aGVuIGl0cyBBY3Rpb25Nb2RlIGVuZHMsIHJlbW92ZSBpdC4KKyAgICAgICAgICAgIGlmIChtU2VsZWN0Q2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TZWxlY3RDYWxsYmFjay5zZXRUaXRsZUJhcihudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRmluZENhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRmluZENhbGxiYWNrLnNldFRpdGxlQmFyKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGlmIChtVGl0bGVCYXIgPT0gdikgcmV0dXJuOwogICAgICAgICBpZiAobVRpdGxlQmFyICE9IG51bGwpIHsKICAgICAgICAgICAgIHJlbW92ZVZpZXcobVRpdGxlQmFyKTsKQEAgLTIxMzQsNyArMjIyNCw3IEBACiAgICAgICogaGVpZ2h0LgogICAgICAqLwogICAgIHByaXZhdGUgaW50IHZpZXdUb0NvbnRlbnREaW1lbnNpb24oaW50IGQpIHsKLSAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoZCAqIG1JbnZBY3R1YWxTY2FsZSk7CisgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGQgKiBtWm9vbU1hbmFnZXIuZ2V0SW52U2NhbGUoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTYwLDcgKzIyNTAsNyBAQAogICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBhcyBhIGZsb2F0LgogICAgICAqLwogICAgIHByaXZhdGUgZmxvYXQgdmlld1RvQ29udGVudFhmKGludCB4KSB7Ci0gICAgICAgIHJldHVybiB4ICogbUludkFjdHVhbFNjYWxlOworICAgICAgICByZXR1cm4geCAqIG1ab29tTWFuYWdlci5nZXRJbnZTY2FsZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjE2OSw3ICsyMjU5LDcgQEAKICAgICAgKiBlbWJlZGRlZCBpbnRvIHRoZSBXZWJWaWV3LiBSZXR1cm5zIHRoZSByZXN1bHQgYXMgYSBmbG9hdC4KICAgICAgKi8KICAgICBwcml2YXRlIGZsb2F0IHZpZXdUb0NvbnRlbnRZZihpbnQgeSkgewotICAgICAgICByZXR1cm4gKHkgLSBnZXRUaXRsZUhlaWdodCgpKSAqIG1JbnZBY3R1YWxTY2FsZTsKKyAgICAgICAgcmV0dXJuICh5IC0gZ2V0VGl0bGVIZWlnaHQoKSkgKiBtWm9vbU1hbmFnZXIuZ2V0SW52U2NhbGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIxNzksNyArMjI2OSw3IEBACiAgICAgICogaGVpZ2h0LgogICAgICAqLwogICAgIC8qcGFja2FnZSovIGludCBjb250ZW50VG9WaWV3RGltZW5zaW9uKGludCBkKSB7Ci0gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGQgKiBtQWN0dWFsU2NhbGUpOworICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChkICogbVpvb21NYW5hZ2VyLmdldFNjYWxlKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjIyMCw3ICsyMzEwLDcgQEAKICAgICAvLyBDYWxsZWQgYnkgSk5JIHRvIGludmFsaWRhdGUgdGhlIFZpZXcsIGdpdmVuIHJlY3RhbmdsZSBjb29yZGluYXRlcyBpbgogICAgIC8vIGNvbnRlbnQgc3BhY2UKICAgICBwcml2YXRlIHZvaWQgdmlld0ludmFsaWRhdGUoaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKLSAgICAgICAgZmluYWwgZmxvYXQgc2NhbGUgPSBtQWN0dWFsU2NhbGU7CisgICAgICAgIGZpbmFsIGZsb2F0IHNjYWxlID0gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCk7CiAgICAgICAgIGZpbmFsIGludCBkeSA9IGdldFRpdGxlSGVpZ2h0KCk7CiAgICAgICAgIGludmFsaWRhdGUoKGludClNYXRoLmZsb29yKGwgKiBzY2FsZSksCiAgICAgICAgICAgICAgICAgICAgKGludClNYXRoLmZsb29yKHQgKiBzY2FsZSkgKyBkeSwKQEAgLTIyMzEsNyArMjMyMSw3IEBACiAgICAgLy8gQ2FsbGVkIGJ5IEpOSSB0byBpbnZhbGlkYXRlIHRoZSBWaWV3IGFmdGVyIGEgZGVsYXksIGdpdmVuIHJlY3RhbmdsZQogICAgIC8vIGNvb3JkaW5hdGVzIGluIGNvbnRlbnQgc3BhY2UKICAgICBwcml2YXRlIHZvaWQgdmlld0ludmFsaWRhdGVEZWxheWVkKGxvbmcgZGVsYXksIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7Ci0gICAgICAgIGZpbmFsIGZsb2F0IHNjYWxlID0gbUFjdHVhbFNjYWxlOworICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZSA9IG1ab29tTWFuYWdlci5nZXRTY2FsZSgpOwogICAgICAgICBmaW5hbCBpbnQgZHkgPSBnZXRUaXRsZUhlaWdodCgpOwogICAgICAgICBwb3N0SW52YWxpZGF0ZURlbGF5ZWQoZGVsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KU1hdGguZmxvb3IobCAqIHNjYWxlKSwKQEAgLTIyNjksMTMgKzIzNTksNyBAQAogICAgICAgICAgICAgLy8gdXBkYXRlZCB3aGVuIHdlIGdldCBvdXQgb2YgdGhhdCBtb2RlLgogICAgICAgICAgICAgaWYgKCFtRHJhd0hpc3RvcnkpIHsKICAgICAgICAgICAgICAgICAvLyByZXBpbiBvdXIgc2Nyb2xsLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBuZXcgY29udGVudCBzaXplCi0gICAgICAgICAgICAgICAgaW50IG9sZFggPSBtU2Nyb2xsWDsKLSAgICAgICAgICAgICAgICBpbnQgb2xkWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgICAgIG1TY3JvbGxYID0gcGluTG9jWChtU2Nyb2xsWCk7Ci0gICAgICAgICAgICAgICAgbVNjcm9sbFkgPSBwaW5Mb2NZKG1TY3JvbGxZKTsKLSAgICAgICAgICAgICAgICBpZiAob2xkWCAhPSBtU2Nyb2xsWCB8fCBvbGRZICE9IG1TY3JvbGxZKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1cGRhdGVTY3JvbGxDb29yZGluYXRlcyhwaW5Mb2NYKG1TY3JvbGxYKSwgcGluTG9jWShtU2Nyb2xsWSkpOwogICAgICAgICAgICAgICAgIGlmICghbVNjcm9sbGVyLmlzRmluaXNoZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIHNjcm9sbC4gIFJlcGluIHRoZSBmaW5hbCBzY3JvbGwKICAgICAgICAgICAgICAgICAgICAgLy8gcG9zaXRpb24uCkBAIC0yMjg3LDc3ICsyMzcxLDEyIEBACiAgICAgICAgIGNvbnRlbnRTaXplQ2hhbmdlZCh1cGRhdGVMYXlvdXQpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBzZXROZXdab29tU2NhbGUoZmxvYXQgc2NhbGUsIGJvb2xlYW4gdXBkYXRlVGV4dFdyYXBTY2FsZSwKLSAgICAgICAgICAgIGJvb2xlYW4gZm9yY2UpIHsKLSAgICAgICAgaWYgKHNjYWxlIDwgbU1pblpvb21TY2FsZSkgewotICAgICAgICAgICAgc2NhbGUgPSBtTWluWm9vbVNjYWxlOwotICAgICAgICAgICAgLy8gc2V0IG1Jblpvb21PdmVydmlldyBmb3Igbm9uIG1vYmlsZSBzaXRlcwotICAgICAgICAgICAgaWYgKHNjYWxlIDwgbURlZmF1bHRTY2FsZSkgbUluWm9vbU92ZXJ2aWV3ID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChzY2FsZSA+IG1NYXhab29tU2NhbGUpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbU1heFpvb21TY2FsZTsKLSAgICAgICAgfQotICAgICAgICBpZiAodXBkYXRlVGV4dFdyYXBTY2FsZSkgewotICAgICAgICAgICAgbVRleHRXcmFwU2NhbGUgPSBzY2FsZTsKLSAgICAgICAgICAgIC8vIHJlc2V0IG1MYXN0SGVpZ2h0U2VudCB0byBmb3JjZSBWSUVXX1NJWkVfQ0hBTkdFRCBzZW50IHRvIFdlYktpdAotICAgICAgICAgICAgbUxhc3RIZWlnaHRTZW50ID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2NhbGUgIT0gbUFjdHVhbFNjYWxlIHx8IGZvcmNlKSB7Ci0gICAgICAgICAgICBpZiAobURyYXdIaXN0b3J5KSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgaGlzdG9yeSBQaWN0dXJlIGlzIGRyYXduLCBkb24ndCB1cGRhdGUgc2Nyb2xsLiBUaGV5IHdpbGwKLSAgICAgICAgICAgICAgICAvLyBiZSB1cGRhdGVkIHdoZW4gd2UgZ2V0IG91dCBvZiB0aGF0IG1vZGUuCi0gICAgICAgICAgICAgICAgaWYgKHNjYWxlICE9IG1BY3R1YWxTY2FsZSAmJiAhbVByZXZpZXdab29tT25seSkgewotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tQcm94eS5vblNjYWxlQ2hhbmdlZChtQWN0dWFsU2NhbGUsIHNjYWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUFjdHVhbFNjYWxlID0gc2NhbGU7Ci0gICAgICAgICAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIHNjYWxlOwotICAgICAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gdXBkYXRlIG91ciBzY3JvbGwgc28gd2UgZG9uJ3QgYXBwZWFyIHRvIGp1bXAKLSAgICAgICAgICAgICAgICAvLyBpLmUuIGtlZXAgdGhlIGNlbnRlciBvZiB0aGUgZG9jIGluIHRoZSBjZW50ZXIgb2YgdGhlIHZpZXcKLQotICAgICAgICAgICAgICAgIGludCBvbGRYID0gbVNjcm9sbFg7Ci0gICAgICAgICAgICAgICAgaW50IG9sZFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgICAgICBmbG9hdCByYXRpbyA9IHNjYWxlICogbUludkFjdHVhbFNjYWxlOyAgIC8vIG9sZCBpbnZlcnNlCi0gICAgICAgICAgICAgICAgZmxvYXQgc3ggPSByYXRpbyAqIG9sZFggKyAocmF0aW8gLSAxKSAqIG1ab29tQ2VudGVyWDsKLSAgICAgICAgICAgICAgICBmbG9hdCBzeSA9IHJhdGlvICogb2xkWSArIChyYXRpbyAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIChtWm9vbUNlbnRlclkgLSBnZXRUaXRsZUhlaWdodCgpKTsKLQotICAgICAgICAgICAgICAgIC8vIG5vdyB1cGRhdGUgb3VyIG5ldyBzY2FsZSBhbmQgaW52ZXJzZQotICAgICAgICAgICAgICAgIGlmIChzY2FsZSAhPSBtQWN0dWFsU2NhbGUgJiYgIW1QcmV2aWV3Wm9vbU9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrUHJveHkub25TY2FsZUNoYW5nZWQobUFjdHVhbFNjYWxlLCBzY2FsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BY3R1YWxTY2FsZSA9IHNjYWxlOwotICAgICAgICAgICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBzY2FsZTsKLQotICAgICAgICAgICAgICAgIC8vIFNjYWxlIGFsbCB0aGUgY2hpbGQgdmlld3MKLSAgICAgICAgICAgICAgICBtVmlld01hbmFnZXIuc2NhbGVBbGwoKTsKLQotICAgICAgICAgICAgICAgIC8vIGFzIHdlIGRvbid0IGhhdmUgYW5pbWF0aW9uIGZvciBzY2FsaW5nLCBkb24ndCBkbyBhbmltYXRpb24KLSAgICAgICAgICAgICAgICAvLyBmb3Igc2Nyb2xsaW5nLCBhcyBpdCBjYXVzZXMgd2VpcmQgaW50ZXJtZWRpYXRlIHN0YXRlCi0gICAgICAgICAgICAgICAgLy8gICAgICAgIHBpblNjcm9sbFRvKE1hdGgucm91bmQoc3gpLCBNYXRoLnJvdW5kKHN5KSk7Ci0gICAgICAgICAgICAgICAgbVNjcm9sbFggPSBwaW5Mb2NYKE1hdGgucm91bmQoc3gpKTsKLSAgICAgICAgICAgICAgICBtU2Nyb2xsWSA9IHBpbkxvY1koTWF0aC5yb3VuZChzeSkpOwotCi0gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHdlYmtpdAotICAgICAgICAgICAgICAgIGlmIChvbGRYICE9IG1TY3JvbGxYIHx8IG9sZFkgIT0gbVNjcm9sbFkpIHsKLSAgICAgICAgICAgICAgICAgICAgb25TY3JvbGxDaGFuZ2VkKG1TY3JvbGxYLCBtU2Nyb2xsWSwgb2xkWCwgb2xkWSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNjcm9sbCBwb3NpdGlvbiBpcyBhZGp1c3RlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyB6b29tIGFuaW1hdGlvbi4gQnV0IHdlIHdhbnQgdG8gdXBkYXRlIHRoZSBXZWJLaXQgYXQgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB0aGUgem9vbSBhbmltYXRpb24uIFNlZSBjb21tZW50cyBpbiBvblNjYWxlRW5kKCkuCi0gICAgICAgICAgICAgICAgICAgIHNlbmRPdXJWaXNpYmxlUmVjdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kVmlld1NpemVab29tKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvLyBVc2VkIHRvIGF2b2lkIHNlbmRpbmcgbWFueSB2aXNpYmxlIHJlY3QgbWVzc2FnZXMuCiAgICAgcHJpdmF0ZSBSZWN0IG1MYXN0VmlzaWJsZVJlY3RTZW50OwogICAgIHByaXZhdGUgUmVjdCBtTGFzdEdsb2JhbFJlY3Q7CiAKLSAgICBwcml2YXRlIFJlY3Qgc2VuZE91clZpc2libGVSZWN0KCkgewotICAgICAgICBpZiAobVByZXZpZXdab29tT25seSkgcmV0dXJuIG1MYXN0VmlzaWJsZVJlY3RTZW50OworICAgIFJlY3Qgc2VuZE91clZpc2libGVSZWN0KCkgeworICAgICAgICBpZiAobVpvb21NYW5hZ2VyLmlzUHJldmVudGluZ1dlYmtpdFVwZGF0ZXMoKSkgcmV0dXJuIG1MYXN0VmlzaWJsZVJlY3RTZW50OwogCiAgICAgICAgIFJlY3QgcmVjdCA9IG5ldyBSZWN0KCk7CiAgICAgICAgIGNhbGNPdXJDb250ZW50VmlzaWJsZVJlY3QocmVjdCk7CkBAIC0yMzkwLDE1ICsyNDA5LDEyIEBACiAgICAgICAgIFBvaW50IHAgPSBuZXcgUG9pbnQoKTsKICAgICAgICAgZ2V0R2xvYmFsVmlzaWJsZVJlY3QociwgcCk7CiAgICAgICAgIHIub2Zmc2V0KC1wLngsIC1wLnkpOwotICAgICAgICBpZiAobUZpbmRJc1VwKSB7Ci0gICAgICAgICAgICByLmJvdHRvbSAtPSBtRmluZEhlaWdodDsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8vIFNldHMgciB0byBiZSBvdXIgdmlzaWJsZSByZWN0YW5nbGUgaW4gY29udGVudCBjb29yZGluYXRlcwogICAgIHByaXZhdGUgdm9pZCBjYWxjT3VyQ29udGVudFZpc2libGVSZWN0KFJlY3QgcikgewogICAgICAgICBjYWxjT3VyVmlzaWJsZVJlY3Qocik7Ci0gICAgICAgIC8vIHNpbmNlIHdlIG1pZ2h0IG92ZXJzY3JvbGwsIHBpbiB0aGUgcmVjdCB0byB0aGUgYm91bmRzIG9mIHRoZSBjb250ZW50CisgICAgICAgIC8vIHBpbiB0aGUgcmVjdCB0byB0aGUgYm91bmRzIG9mIHRoZSBjb250ZW50CiAgICAgICAgIHIubGVmdCA9IE1hdGgubWF4KHZpZXdUb0NvbnRlbnRYKHIubGVmdCksIDApOwogICAgICAgICAvLyB2aWV3VG9Db250ZW50WSB3aWxsIHJlbW92ZSB0aGUgdG90YWwgaGVpZ2h0IG9mIHRoZSB0aXRsZSBiYXIuICBBZGQKICAgICAgICAgLy8gdGhlIHZpc2libGUgaGVpZ2h0IGJhY2sgaW4gdG8gYWNjb3VudCBmb3IgdGhlIGZhY3QgdGhhdCBpZiB0aGUgdGl0bGUKQEAgLTI0MzksMTYgKzI0NTUsMTkgQEAKIAogICAgIC8qKgogICAgICAqIENvbXB1dGUgdW56b29tZWQgd2lkdGggYW5kIGhlaWdodCwgYW5kIGlmIHRoZXkgZGlmZmVyIGZyb20gdGhlIGxhc3QKLSAgICAgKiB2YWx1ZXMgd2Ugc2VudCwgc2VuZCB0aGVtIHRvIHdlYmtpdCAodG8gYmUgdXNlZCBoYXMgbmV3IHZpZXdwb3J0KQorICAgICAqIHZhbHVlcyB3ZSBzZW50LCBzZW5kIHRoZW0gdG8gd2Via2l0ICh0byBiZSB1c2VkIGFzIG5ldyB2aWV3cG9ydCkKKyAgICAgKgorICAgICAqIEBwYXJhbSBmb3JjZSBlbnN1cmVzIHRoYXQgdGhlIG1lc3NhZ2UgaXMgc2VudCB0byB3ZWJraXQgZXZlbiBpZiB0aGUgd2lkdGgKKyAgICAgKiBvciBoZWlnaHQgaGFzIG5vdCBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IG1lc3NhZ2UKICAgICAgKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuZXcgdmFsdWVzIHdlcmUgc2VudAogICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzZW5kVmlld1NpemVab29tKCkgewotICAgICAgICBpZiAobVByZXZpZXdab29tT25seSkgcmV0dXJuIGZhbHNlOworICAgIGJvb2xlYW4gc2VuZFZpZXdTaXplWm9vbShib29sZWFuIGZvcmNlKSB7CisgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuaXNQcmV2ZW50aW5nV2Via2l0VXBkYXRlcygpKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgaW50IHZpZXdXaWR0aCA9IGdldFZpZXdXaWR0aCgpOwotICAgICAgICBpbnQgbmV3V2lkdGggPSBNYXRoLnJvdW5kKHZpZXdXaWR0aCAqIG1JbnZBY3R1YWxTY2FsZSk7Ci0gICAgICAgIGludCBuZXdIZWlnaHQgPSBNYXRoLnJvdW5kKGdldFZpZXdIZWlnaHQoKSAqIG1JbnZBY3R1YWxTY2FsZSk7CisgICAgICAgIGludCBuZXdXaWR0aCA9IE1hdGgucm91bmQodmlld1dpZHRoICogbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCkpOworICAgICAgICBpbnQgbmV3SGVpZ2h0ID0gTWF0aC5yb3VuZChnZXRWaWV3SGVpZ2h0KCkgKiBtWm9vbU1hbmFnZXIuZ2V0SW52U2NhbGUoKSk7CiAgICAgICAgIC8qCiAgICAgICAgICAqIEJlY2F1c2UgdGhlIG5hdGl2ZSBzaWRlIG1heSBoYXZlIGFscmVhZHkgZG9uZSBhIGxheW91dCBiZWZvcmUgdGhlCiAgICAgICAgICAqIFZpZXcgc3lzdGVtIHdhcyBhYmxlIHRvIG1lYXN1cmUgdXMsIHdlIGhhdmUgdG8gc2VuZCBhIGhlaWdodCBvZiAwIHRvCkBAIC0yNDYxLDg1ICsyNDgwLDUxIEBACiAgICAgICAgICAgICBuZXdIZWlnaHQgPSAwOwogICAgICAgICB9CiAgICAgICAgIC8vIEF2b2lkIHNlbmRpbmcgYW5vdGhlciBtZXNzYWdlIGlmIHRoZSBkaW1lbnNpb25zIGhhdmUgbm90IGNoYW5nZWQuCi0gICAgICAgIGlmIChuZXdXaWR0aCAhPSBtTGFzdFdpZHRoU2VudCB8fCBuZXdIZWlnaHQgIT0gbUxhc3RIZWlnaHRTZW50KSB7CisgICAgICAgIGlmIChuZXdXaWR0aCAhPSBtTGFzdFdpZHRoU2VudCB8fCBuZXdIZWlnaHQgIT0gbUxhc3RIZWlnaHRTZW50IHx8IGZvcmNlKSB7CiAgICAgICAgICAgICBWaWV3U2l6ZURhdGEgZGF0YSA9IG5ldyBWaWV3U2l6ZURhdGEoKTsKICAgICAgICAgICAgIGRhdGEubVdpZHRoID0gbmV3V2lkdGg7CiAgICAgICAgICAgICBkYXRhLm1IZWlnaHQgPSBuZXdIZWlnaHQ7Ci0gICAgICAgICAgICBkYXRhLm1UZXh0V3JhcFdpZHRoID0gTWF0aC5yb3VuZCh2aWV3V2lkdGggLyBtVGV4dFdyYXBTY2FsZSk7OwotICAgICAgICAgICAgZGF0YS5tU2NhbGUgPSBtQWN0dWFsU2NhbGU7Ci0gICAgICAgICAgICBkYXRhLm1JZ25vcmVIZWlnaHQgPSBtWm9vbVNjYWxlICE9IDAgJiYgIW1IZWlnaHRDYW5NZWFzdXJlOwotICAgICAgICAgICAgZGF0YS5tQW5jaG9yWCA9IG1BbmNob3JYOwotICAgICAgICAgICAgZGF0YS5tQW5jaG9yWSA9IG1BbmNob3JZOworICAgICAgICAgICAgZGF0YS5tVGV4dFdyYXBXaWR0aCA9IE1hdGgucm91bmQodmlld1dpZHRoIC8gbVpvb21NYW5hZ2VyLmdldFRleHRXcmFwU2NhbGUoKSk7CisgICAgICAgICAgICBkYXRhLm1TY2FsZSA9IG1ab29tTWFuYWdlci5nZXRTY2FsZSgpOworICAgICAgICAgICAgZGF0YS5tSWdub3JlSGVpZ2h0ID0gbVpvb21NYW5hZ2VyLmlzRml4ZWRMZW5ndGhBbmltYXRpb25JblByb2dyZXNzKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgIW1IZWlnaHRDYW5NZWFzdXJlOworICAgICAgICAgICAgZGF0YS5tQW5jaG9yWCA9IG1ab29tTWFuYWdlci5nZXREb2N1bWVudEFuY2hvclgoKTsKKyAgICAgICAgICAgIGRhdGEubUFuY2hvclkgPSBtWm9vbU1hbmFnZXIuZ2V0RG9jdW1lbnRBbmNob3JZKCk7CiAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVklFV19TSVpFX0NIQU5HRUQsIGRhdGEpOwogICAgICAgICAgICAgbUxhc3RXaWR0aFNlbnQgPSBuZXdXaWR0aDsKICAgICAgICAgICAgIG1MYXN0SGVpZ2h0U2VudCA9IG5ld0hlaWdodDsKLSAgICAgICAgICAgIG1BbmNob3JYID0gbUFuY2hvclkgPSAwOworICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmNsZWFyRG9jdW1lbnRBbmNob3IoKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwcml2YXRlIGludCBjb21wdXRlUmVhbEhvcml6b250YWxTY3JvbGxSYW5nZSgpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSB7CiAgICAgICAgIGlmIChtRHJhd0hpc3RvcnkpIHsKICAgICAgICAgICAgIHJldHVybiBtSGlzdG9yeVdpZHRoOwogICAgICAgICB9IGVsc2UgaWYgKG1Ib3Jpem9udGFsU2Nyb2xsQmFyTW9kZSA9PSBTQ1JPTExCQVJfQUxXQVlTT0ZGCi0gICAgICAgICAgICAgICAgJiYgKG1BY3R1YWxTY2FsZSAtIG1NaW5ab29tU2NhbGUgPD0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpKSB7CisgICAgICAgICAgICAgICAgJiYgIW1ab29tTWFuYWdlci5jYW5ab29tT3V0KCkpIHsKICAgICAgICAgICAgIC8vIG9ubHkgaG9ub3IgdGhlIHNjcm9sbGJhciBtb2RlIHdoZW4gaXQgaXMgYXQgbWluaW11bSB6b29tIGxldmVsCiAgICAgICAgICAgICByZXR1cm4gY29tcHV0ZUhvcml6b250YWxTY3JvbGxFeHRlbnQoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIHRvIGF2b2lkIHJvdW5kaW5nIGVycm9yIGNhdXNlZCB1bm5lY2Vzc2FyeSBzY3JvbGxiYXIsIHVzZSBmbG9vcgotICAgICAgICAgICAgcmV0dXJuIChpbnQpIE1hdGguZmxvb3IobUNvbnRlbnRXaWR0aCAqIG1BY3R1YWxTY2FsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgaW50IGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSB7Ci0gICAgICAgIGludCByYW5nZSA9IGNvbXB1dGVSZWFsSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCk7Ci0KLSAgICAgICAgLy8gQWRqdXN0IHJlcG9ydGVkIHJhbmdlIGlmIG92ZXJzY3JvbGxlZCB0byBjb21wcmVzcyB0aGUgc2Nyb2xsIGJhcnMKLSAgICAgICAgZmluYWwgaW50IHNjcm9sbFggPSBtU2Nyb2xsWDsKLSAgICAgICAgZmluYWwgaW50IG92ZXJzY3JvbGxSaWdodCA9IGNvbXB1dGVNYXhTY3JvbGxYKCk7Ci0gICAgICAgIGlmIChzY3JvbGxYIDwgMCkgewotICAgICAgICAgICAgcmFuZ2UgLT0gc2Nyb2xsWDsKLSAgICAgICAgfSBlbHNlIGlmIChzY3JvbGxYID4gb3ZlcnNjcm9sbFJpZ2h0KSB7Ci0gICAgICAgICAgICByYW5nZSArPSBzY3JvbGxYIC0gb3ZlcnNjcm9sbFJpZ2h0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJhbmdlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBpbnQgY29tcHV0ZUhvcml6b250YWxTY3JvbGxPZmZzZXQoKSB7Ci0gICAgICAgIHJldHVybiBNYXRoLm1heChtU2Nyb2xsWCwgMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgY29tcHV0ZVJlYWxWZXJ0aWNhbFNjcm9sbFJhbmdlKCkgewotICAgICAgICBpZiAobURyYXdIaXN0b3J5KSB7Ci0gICAgICAgICAgICByZXR1cm4gbUhpc3RvcnlIZWlnaHQ7Ci0gICAgICAgIH0gZWxzZSBpZiAobVZlcnRpY2FsU2Nyb2xsQmFyTW9kZSA9PSBTQ1JPTExCQVJfQUxXQVlTT0ZGCi0gICAgICAgICAgICAgICAgJiYgKG1BY3R1YWxTY2FsZSAtIG1NaW5ab29tU2NhbGUgPD0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpKSB7Ci0gICAgICAgICAgICAvLyBvbmx5IGhvbm9yIHRoZSBzY3JvbGxiYXIgbW9kZSB3aGVuIGl0IGlzIGF0IG1pbmltdW0gem9vbSBsZXZlbAotICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVWZXJ0aWNhbFNjcm9sbEV4dGVudCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gdG8gYXZvaWQgcm91bmRpbmcgZXJyb3IgY2F1c2VkIHVubmVjZXNzYXJ5IHNjcm9sbGJhciwgdXNlIGZsb29yCi0gICAgICAgICAgICByZXR1cm4gKGludCkgTWF0aC5mbG9vcihtQ29udGVudEhlaWdodCAqIG1BY3R1YWxTY2FsZSk7CisgICAgICAgICAgICByZXR1cm4gKGludCkgTWF0aC5mbG9vcihtQ29udGVudFdpZHRoICogbVpvb21NYW5hZ2VyLmdldFNjYWxlKCkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGludCBjb21wdXRlVmVydGljYWxTY3JvbGxSYW5nZSgpIHsKLSAgICAgICAgaW50IHJhbmdlID0gY29tcHV0ZVJlYWxWZXJ0aWNhbFNjcm9sbFJhbmdlKCk7Ci0KLSAgICAgICAgLy8gQWRqdXN0IHJlcG9ydGVkIHJhbmdlIGlmIG92ZXJzY3JvbGxlZCB0byBjb21wcmVzcyB0aGUgc2Nyb2xsIGJhcnMKLSAgICAgICAgZmluYWwgaW50IHNjcm9sbFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgZmluYWwgaW50IG92ZXJzY3JvbGxCb3R0b20gPSBjb21wdXRlTWF4U2Nyb2xsWSgpOwotICAgICAgICBpZiAoc2Nyb2xsWSA8IDApIHsKLSAgICAgICAgICAgIHJhbmdlIC09IHNjcm9sbFk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2Nyb2xsWSA+IG92ZXJzY3JvbGxCb3R0b20pIHsKLSAgICAgICAgICAgIHJhbmdlICs9IHNjcm9sbFkgLSBvdmVyc2Nyb2xsQm90dG9tOworICAgICAgICBpZiAobURyYXdIaXN0b3J5KSB7CisgICAgICAgICAgICByZXR1cm4gbUhpc3RvcnlIZWlnaHQ7CisgICAgICAgIH0gZWxzZSBpZiAobVZlcnRpY2FsU2Nyb2xsQmFyTW9kZSA9PSBTQ1JPTExCQVJfQUxXQVlTT0ZGCisgICAgICAgICAgICAgICAgJiYgIW1ab29tTWFuYWdlci5jYW5ab29tT3V0KCkpIHsKKyAgICAgICAgICAgIC8vIG9ubHkgaG9ub3IgdGhlIHNjcm9sbGJhciBtb2RlIHdoZW4gaXQgaXMgYXQgbWluaW11bSB6b29tIGxldmVsCisgICAgICAgICAgICByZXR1cm4gY29tcHV0ZVZlcnRpY2FsU2Nyb2xsRXh0ZW50KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB0byBhdm9pZCByb3VuZGluZyBlcnJvciBjYXVzZWQgdW5uZWNlc3Nhcnkgc2Nyb2xsYmFyLCB1c2UgZmxvb3IKKyAgICAgICAgICAgIHJldHVybiAoaW50KSBNYXRoLmZsb29yKG1Db250ZW50SGVpZ2h0ICogbVpvb21NYW5hZ2VyLmdldFNjYWxlKCkpOwogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjU1NywzMSArMjU0MiwxMCBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhd1ZlcnRpY2FsU2Nyb2xsQmFyKENhbnZhcyBjYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhd2FibGUgc2Nyb2xsQmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7Ci0gICAgICAgIGlmIChtU2Nyb2xsWSA8IDApIHsKLSAgICAgICAgICAgIHQgLT0gbVNjcm9sbFk7Ci0gICAgICAgIH0KICAgICAgICAgc2Nyb2xsQmFyLnNldEJvdW5kcyhsLCB0ICsgZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0KCksIHIsIGIpOwogICAgICAgICBzY3JvbGxCYXIuZHJhdyhjYW52YXMpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uT3ZlcnNjcm9sbGVkKGludCBzY3JvbGxYLCBpbnQgc2Nyb2xsWSwgYm9vbGVhbiBjbGFtcGVkWCwKLSAgICAgICAgICAgIGJvb2xlYW4gY2xhbXBlZFkpIHsKLSAgICAgICAgbUluT3ZlclNjcm9sbE1vZGUgPSBmYWxzZTsKLSAgICAgICAgaW50IG1heFggPSBjb21wdXRlTWF4U2Nyb2xsWCgpOwotICAgICAgICBpZiAobWF4WCA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBkbyBub3Qgb3ZlciBzY3JvbGwgeCBpZiB0aGUgcGFnZSBqdXN0IGZpdHMgdGhlIHNjcmVlbgotICAgICAgICAgICAgc2Nyb2xsWCA9IHBpbkxvY1goc2Nyb2xsWCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2Nyb2xsWCA8IDAgfHwgc2Nyb2xsWCA+IG1heFgpIHsKLSAgICAgICAgICAgIG1Jbk92ZXJTY3JvbGxNb2RlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2Nyb2xsWSA8IDAgfHwgc2Nyb2xsWSA+IGNvbXB1dGVNYXhTY3JvbGxZKCkpIHsKLSAgICAgICAgICAgIG1Jbk92ZXJTY3JvbGxNb2RlID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLnNjcm9sbFRvKHNjcm9sbFgsIHNjcm9sbFkpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIEdldCB0aGUgdXJsIGZvciB0aGUgY3VycmVudCBwYWdlLiBUaGlzIGlzIG5vdCBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIHVybAogICAgICAqIHBhc3NlZCB0byBXZWJWaWV3Q2xpZW50Lm9uUGFnZVN0YXJ0ZWQgYmVjYXVzZSBhbHRob3VnaCB0aGUgbG9hZCBmb3IKQEAgLTI2MjcsNyArMjU5MSw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSB0b3VjaCBpY29uIHVybCBmb3IgdGhlIGFwcGxlLXRvdWNoLWljb24gPGxpbms+IGVsZW1lbnQuCisgICAgICogR2V0IHRoZSB0b3VjaCBpY29uIHVybCBmb3IgdGhlIGFwcGxlLXRvdWNoLWljb24gPGxpbms+IGVsZW1lbnQsIG9yCisgICAgICogYSBVUkwgb24gdGhpcyBzaXRlJ3Mgc2VydmVyIHBvaW50aW5nIHRvIHRoZSBzdGFuZGFyZCBsb2NhdGlvbiBvZiBhCisgICAgICogdG91Y2ggaWNvbi4KICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG91Y2hJY29uVXJsKCkgewpAQCAtMjgwMCwyMiArMjc2Niw0OSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBoaWRlCisgICAgICogU3RhcnQgYW4gQWN0aW9uTW9kZSBmb3IgZmluZGluZyB0ZXh0IGluIHRoaXMgV2ViVmlldy4KKyAgICAgKiBAcGFyYW0gdGV4dCBJZiBub24tbnVsbCwgd2lsbCBiZSB0aGUgaW5pdGlhbCB0ZXh0IHRvIHNlYXJjaCBmb3IuCisgICAgICogICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgbGFzdCBTdHJpbmcgc2VhcmNoZWQgZm9yIGluIHRoaXMgV2ViVmlldyB3aWxsCisgICAgICogICAgICAgICAgICAgYmUgdXNlZCB0byBzdGFydC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaW5kSXNVcChib29sZWFuIGlzVXApIHsKLSAgICAgICAgbUZpbmRJc1VwID0gaXNVcDsKLSAgICAgICAgaWYgKGlzVXApIHsKLSAgICAgICAgICAgIHJlY29yZE5ld0NvbnRlbnRTaXplKG1Db250ZW50V2lkdGgsIG1Db250ZW50SGVpZ2h0ICsgbUZpbmRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICBwdWJsaWMgdm9pZCBzaG93RmluZERpYWxvZyhTdHJpbmcgdGV4dCkgeworICAgICAgICBtRmluZENhbGxiYWNrID0gbmV3IEZpbmRBY3Rpb25Nb2RlQ2FsbGJhY2sobUNvbnRleHQpOworICAgICAgICBzZXRGaW5kSXNVcCh0cnVlKTsKKyAgICAgICAgbUZpbmRDYWxsYmFjay5zZXRXZWJWaWV3KHRoaXMpOworICAgICAgICBWaWV3IHRpdGxlQmFyID0gbVRpdGxlQmFyOworICAgICAgICAvLyBXZSBkbyBub3Qgd2FudCB0byBzaG93IHRoZSBlbWJlZGRlZCB0aXRsZSBiYXIgZHVyaW5nIGZpbmQgb3IKKyAgICAgICAgLy8gc2VsZWN0LCBidXQga2VlcCB0cmFjayBvZiBpdCBzbyB0aGF0IGl0IGNhbiBiZSByZXBsYWNlZCB3aGVuIHRoZQorICAgICAgICAvLyBtb2RlIGlzIGV4aXRlZC4KKyAgICAgICAgc2V0RW1iZWRkZWRUaXRsZUJhcihudWxsKTsKKyAgICAgICAgbUZpbmRDYWxsYmFjay5zZXRUaXRsZUJhcih0aXRsZUJhcik7CisgICAgICAgIHN0YXJ0QWN0aW9uTW9kZShtRmluZENhbGxiYWNrKTsKKyAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGV4dCA9IG1MYXN0RmluZDsKICAgICAgICAgfQorICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICBtRmluZENhbGxiYWNrLnNldFRleHQodGV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBLZWVwIHRyYWNrIG9mIHRoZSBmaW5kIGNhbGxiYWNrIHNvIHRoYXQgd2UgY2FuIHJlbW92ZSBpdHMgdGl0bGViYXIgaWYKKyAgICAgKiBuZWNlc3NhcnkuCisgICAgICovCisgICAgcHJpdmF0ZSBGaW5kQWN0aW9uTW9kZUNhbGxiYWNrIG1GaW5kQ2FsbGJhY2s7CisKKyAgICAvKioKKyAgICAgKiBUb2dnbGUgd2hldGhlciB0aGUgZmluZCBkaWFsb2cgaXMgc2hvd2luZywgZm9yIGJvdGggbmF0aXZlIGFuZCBKYXZhLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRGaW5kSXNVcChib29sZWFuIGlzVXApIHsKKyAgICAgICAgbUZpbmRJc1VwID0gaXNVcDsKICAgICAgICAgaWYgKDAgPT0gbU5hdGl2ZUNsYXNzKSByZXR1cm47IC8vIGNsaWVudCBpc24ndCBpbml0aWFsaXplZAogICAgICAgICBuYXRpdmVTZXRGaW5kSXNVcChpc1VwKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAaGlkZQorICAgICAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnRseSBoaWdobGlnaHRlZCBtYXRjaC4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGZpbmRJbmRleCgpIHsKKyAgICBpbnQgZmluZEluZGV4KCkgewogICAgICAgICBpZiAoMCA9PSBtTmF0aXZlQ2xhc3MpIHJldHVybiAtMTsKICAgICAgICAgcmV0dXJuIG5hdGl2ZUZpbmRJbmRleCgpOwogICAgIH0KQEAgLTI4MjQsOSArMjgxNyw4IEBACiAgICAgLy8gb3Igbm90IHdlIGRyYXcgdGhlIGhpZ2hsaWdodHMgZm9yIG1hdGNoZXMuCiAgICAgcHJpdmF0ZSBib29sZWFuIG1GaW5kSXNVcDsKIAotICAgIHByaXZhdGUgaW50IG1GaW5kSGVpZ2h0OwotICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIGxhc3Qgc3RyaW5nIHNlbnQsIHNvIHdlIGNhbiBzZWFyY2ggYWdhaW4gYWZ0ZXIgYW4KLSAgICAvLyBvcmllbnRhdGlvbiBjaGFuZ2Ugb3IgdGhlIGRpc21pc3NhbCBvZiB0aGUgc29mdCBrZXlib2FyZC4KKyAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHN0cmluZyBzZW50LCBzbyB3ZSBjYW4gc2VhcmNoIGFnYWluIHdoZW4gZmluZCBpcworICAgIC8vIHJlb3BlbmVkLgogICAgIHByaXZhdGUgU3RyaW5nIG1MYXN0RmluZDsKIAogICAgIC8qKgpAQCAtMjg4Myw3ICsyODc1LDYgQEAKICAgICAgKiBDbGVhciB0aGUgaGlnaGxpZ2h0aW5nIHN1cnJvdW5kaW5nIHRleHQgbWF0Y2hlcyBjcmVhdGVkIGJ5IGZpbmRBbGwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJNYXRjaGVzKCkgewotICAgICAgICBtTGFzdEZpbmQgPSAiIjsKICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyA9PSAwKQogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICBuYXRpdmVTZXRGaW5kSXNFbXB0eSgpOwpAQCAtMjg5MSwxNiArMjg4MiwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBoaWRlCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIGZpbmQgQWN0aW9uTW9kZSBlbmRzLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUZpbmREaWFsb2dEaXNtaXNzZWQoKSB7CisgICAgdm9pZCBub3RpZnlGaW5kRGlhbG9nRGlzbWlzc2VkKCkgeworICAgICAgICBtRmluZENhbGxiYWNrID0gbnVsbDsKICAgICAgICAgaWYgKG1XZWJWaWV3Q29yZSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgY2xlYXJNYXRjaGVzKCk7CiAgICAgICAgIHNldEZpbmRJc1VwKGZhbHNlKTsKLSAgICAgICAgcmVjb3JkTmV3Q29udGVudFNpemUobUNvbnRlbnRXaWR0aCwgbUNvbnRlbnRIZWlnaHQgLSBtRmluZEhlaWdodCwKLSAgICAgICAgICAgICAgICBmYWxzZSk7CiAgICAgICAgIC8vIE5vdyB0aGF0IHRoZSBkaWFsb2cgaGFzIGJlZW4gcmVtb3ZlZCwgZW5zdXJlIHRoYXQgd2Ugc2Nyb2xsIHRvIGEKICAgICAgICAgLy8gbG9jYXRpb24gdGhhdCBpcyBub3QgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHBhZ2UuCiAgICAgICAgIHBpblNjcm9sbFRvKG1TY3JvbGxYLCBtU2Nyb2xsWSwgZmFsc2UsIDApOwpAQCAtMjkwOCwxNiArMjg5OCw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaW5kRGlhbG9nSGVpZ2h0KGludCBoZWlnaHQpIHsKLSAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKLSAgICAgICAgICAgIExvZy52KExPR1RBRywgInNldEZpbmREaWFsb2dIZWlnaHQgaGVpZ2h0PSIgKyBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIG1GaW5kSGVpZ2h0ID0gaGVpZ2h0OwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFF1ZXJ5IHRoZSBkb2N1bWVudCB0byBzZWUgaWYgaXQgY29udGFpbnMgYW55IGltYWdlIHJlZmVyZW5jZXMuIFRoZQogICAgICAqIG1lc3NhZ2Ugb2JqZWN0IHdpbGwgYmUgZGlzcGF0Y2hlZCB3aXRoIGFyZzEgYmVpbmcgc2V0IHRvIDEgaWYgaW1hZ2VzCiAgICAgICogd2VyZSBmb3VuZCBhbmQgMCBpZiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgcmVmZXJlbmNlIGFueSBpbWFnZXMuCkBAIC0yOTMwLDU0ICsyOTEwLDMxIEBACiAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5ET0NfSEFTX0lNQUdFUywgcmVzcG9uc2UpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJlcXVlc3QgdGhlIHNjcm9sbGVyIHRvIGFib3J0IGFueSBvbmdvaW5nIGFuaW1hdGlvbgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wU2Nyb2xsKCkgeworICAgICAgICBtU2Nyb2xsZXIuZm9yY2VGaW5pc2hlZCh0cnVlKTsKKyAgICAgICAgbUxhc3RWZWxvY2l0eSA9IDA7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY29tcHV0ZVNjcm9sbCgpIHsKICAgICAgICAgaWYgKG1TY3JvbGxlci5jb21wdXRlU2Nyb2xsT2Zmc2V0KCkpIHsKICAgICAgICAgICAgIGludCBvbGRYID0gbVNjcm9sbFg7CiAgICAgICAgICAgICBpbnQgb2xkWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgaW50IHggPSBtU2Nyb2xsZXIuZ2V0Q3VyclgoKTsKLSAgICAgICAgICAgIGludCB5ID0gbVNjcm9sbGVyLmdldEN1cnJZKCk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7ICAvLyBTbyB3ZSBkcmF3IGFnYWluCi0KLSAgICAgICAgICAgIGlmIChvbGRYICE9IHggfHwgb2xkWSAhPSB5KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJhbmdlWCA9IGNvbXB1dGVNYXhTY3JvbGxYKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJhbmdlWSA9IGNvbXB1dGVNYXhTY3JvbGxZKCk7Ci0gICAgICAgICAgICAgICAgb3ZlcnNjcm9sbEJ5KHggLSBvbGRYLCB5IC0gb2xkWSwgb2xkWCwgb2xkWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlWCwgcmFuZ2VZLAotICAgICAgICAgICAgICAgICAgICAgICAgbU92ZXJmbGluZ0Rpc3RhbmNlLCBtT3ZlcmZsaW5nRGlzdGFuY2UsIGZhbHNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChtRWRnZUdsb3dUb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VZID4gMCB8fCBnZXRPdmVyc2Nyb2xsTW9kZSgpID09IE9WRVJTQ1JPTExfQUxXQVlTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeSA8IDAgJiYgb2xkWSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uQWJzb3JiKChpbnQpIG1TY3JvbGxlci5nZXRDdXJyVmVsb2NpdHkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dCb3R0b20uaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHkgPiByYW5nZVkgJiYgb2xkWSA8PSByYW5nZVkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25BYnNvcmIoKGludCkgbVNjcm9sbGVyLmdldEN1cnJWZWxvY2l0eSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1FZGdlR2xvd1RvcC5pc0ZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZVggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCA8IDAgJiYgb2xkWCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93TGVmdC5vbkFic29yYigoaW50KSBtU2Nyb2xsZXIuZ2V0Q3VyclZlbG9jaXR5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUVkZ2VHbG93UmlnaHQuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0Lm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeCA+IHJhbmdlWCAmJiBvbGRYIDw9IHJhbmdlWCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0Lm9uQWJzb3JiKChpbnQpIG1TY3JvbGxlci5nZXRDdXJyVmVsb2NpdHkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dMZWZ0LmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dMZWZ0Lm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU2Nyb2xsZXIuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoUkVTVU1FX1dFQkNPUkVfUFJJT1JJVFkpOworICAgICAgICAgICAgbVNjcm9sbFggPSBtU2Nyb2xsZXIuZ2V0Q3VyclgoKTsKKyAgICAgICAgICAgIG1TY3JvbGxZID0gbVNjcm9sbGVyLmdldEN1cnJZKCk7CisgICAgICAgICAgICBwb3N0SW52YWxpZGF0ZSgpOyAgLy8gU28gd2UgZHJhdyBhZ2FpbgorICAgICAgICAgICAgaWYgKG9sZFggIT0gbVNjcm9sbFggfHwgb2xkWSAhPSBtU2Nyb2xsWSkgeworICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhYm9ydEFuaW1hdGlvbigpOworICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhSRVNVTUVfV0VCQ09SRV9QUklPUklUWSk7CisgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lUHJpb3JpdHkoKTsKKyAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzdXBlci5jb21wdXRlU2Nyb2xsKCk7CkBAIC0zMDUxLDYgKzMwMDgsMjMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgQ2FsbGJhY2tQcm94eSB3aGVuIHRoZSBwYWdlIHN0YXJ0cyBsb2FkaW5nLgorICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgcGFnZSB3aGljaCBoYXMgc3RhcnRlZCBsb2FkaW5nLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBvblBhZ2VTdGFydGVkKFN0cmluZyB1cmwpIHsKKyAgICAgICAgLy8gZXZlcnkgdGltZSB3ZSBzdGFydCBhIG5ldyBwYWdlLCB3ZSB3YW50IHRvIHJlc2V0IHRoZQorICAgICAgICAvLyBXZWJWaWV3IGNlcnRpZmljYXRlOiAgaWYgdGhlIG5ldyBzaXRlIGlzIHNlY3VyZSwgd2UKKyAgICAgICAgLy8gd2lsbCByZWxvYWQgaXQgYW5kIGdldCBhIG5ldyBjZXJ0aWZpY2F0ZSBzZXQ7CisgICAgICAgIC8vIGlmIHRoZSBuZXcgc2l0ZSBpcyBub3Qgc2VjdXJlLCB0aGUgY2VydGlmaWNhdGUgbXVzdCBiZQorICAgICAgICAvLyBudWxsLCBhbmQgdGhhdCB3aWxsIGJlIHRoZSBjYXNlCisgICAgICAgIHNldENlcnRpZmljYXRlKG51bGwpOworCisgICAgICAgIC8vIHJlc2V0IHRoZSBmbGFnIHNpbmNlIHdlIHNldCB0byB0cnVlIGluIGlmIG5lZWQgYWZ0ZXIKKyAgICAgICAgLy8gbG9hZGluZyBpcyBzZWUgb25QYWdlRmluaXNoZWQoVXJsKQorICAgICAgICBtQWNjZXNzaWJpbGl0eVNjcmlwdEluamVjdGVkID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2FsbGVkIGJ5IENhbGxiYWNrUHJveHkgd2hlbiB0aGUgcGFnZSBmaW5pc2hlcyBsb2FkaW5nLgogICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgcGFnZSB3aGljaCBoYXMgZmluaXNoZWQgbG9hZGluZy4KICAgICAgKi8KQEAgLTMwNjYsNiArMzA0MCw5OSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVBhZ2VUaGF0TmVlZHNUb1NsaWRlVGl0bGVCYXJPZmZTY3JlZW4gPSBudWxsOwogICAgICAgICB9CisKKyAgICAgICAgaW5qZWN0QWNjZXNzaWJpbGl0eUZvclVybCh1cmwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGluamVjdHMgYWNjZXNzaWJpbGl0eSBpbiB0aGUgbG9hZGVkIGRvY3VtZW50IGlmIGFjY2Vzc2liaWxpdHkKKyAgICAgKiBpcyBlbmFibGVkLiBJZiBKYXZhU2NyaXB0IGlzIGVuYWJsZWQgd2UgdHJ5IHRvIGluamVjdCBhIFVSTCBzcGVjaWZpYyBzY3JpcHQuCisgICAgICogSWYgbm8gVVJMIHNwZWNpZmljIHNjcmlwdCBpcyBmb3VuZCBvciBKYXZhU2NyaXB0IGlzIGRpc2FibGVkIHdlIGZhbGxiYWNrIHRvCisgICAgICogdGhlIGRlZmF1bHQge0BsaW5rIEFjY2Vzc2liaWxpdHlJbmplY3Rvcn0gaW1wbGVtZW50YXRpb24uCisgICAgICogPC9wPgorICAgICAqIElmIHRoZSBVUkwgaGFzIHRoZSAiYXhzIiBwYXJhbXRlciBzZXQgdG8gMSBpdCBoYXMgYWxyZWFkeSBkb25lIHRoZQorICAgICAqIHNjcmlwdCBpbmplY3Rpb24gc28gd2UgZG8gbm90aGluZy4gSWYgdGhlIHBhcmFtZXRlciBpcyBzZXQgdG8gMAorICAgICAqIHRoZSBVUkwgb3B0cyBvdXQgYWNjZXNzaWJpbGl0eSBzY3JpcHQgaW5qZWN0aW9uIHNvIHdlIGZhbGwgYmFjayB0bworICAgICAqIHRoZSBkZWZhdWx0IHtAbGluayBBY2Nlc3NpYmlsaXR5SW5qZWN0b3J9LgorICAgICAqIDwvcD4KKyAgICAgKiBOb3RlOiBJZiB0aGUgdXNlciBoYXMgbm90IG9wdGVkLWluIHRoZSBhY2Nlc3NpYmlsaXR5IHNjcmlwdCBpbmplY3Rpb24gbm8gc2NyaXB0cworICAgICAqIGFyZSBpbmplY3RlZCByYXRoZXIgdGhlIGRlZmF1bHQge0BsaW5rIEFjY2Vzc2liaWxpdHlJbmplY3Rvcn0gaW1wbGVtZW50YXRpb24KKyAgICAgKiBpcyB1c2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHVybCBUaGUgVVJMIGxvYWRlZCBieSB0aGlzIHtAbGluayBXZWJWaWV3fS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5qZWN0QWNjZXNzaWJpbGl0eUZvclVybChTdHJpbmcgdXJsKSB7CisgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIGFjY2Vzc2liaWxpdHlNYW5hZ2VyID0gQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0SW5zdGFuY2UobUNvbnRleHQpOworCisgICAgICAgIGlmICghYWNjZXNzaWJpbGl0eU1hbmFnZXIuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIHRoYXQgYWNjZXNzaWJpbGl0eSB3YXMgdHVybmVkIG9mZiBiZXR3ZWVuIHJlbG9hZHMKKyAgICAgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlTY3JpcHRJbmplY3Rvckluc3RhbmNlKGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZ2V0U2V0dGluZ3MoKS5nZXRKYXZhU2NyaXB0RW5hYmxlZCgpKSB7CisgICAgICAgICAgICAvLyBubyBKUyBzbyB3ZSBmYWxsYmFjayB0byB0aGUgYmFzaWMgYnVpbC1pbiBzdXBwb3J0CisgICAgICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5U2NyaXB0SW5qZWN0b3JJbnN0YW5jZSh0cnVlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIHRoZSBVUkwgImF4cyIgcGFyYW1ldGVyIHRvIGNob29zZSBhcHByb3ByaWF0ZSBhY3Rpb24KKyAgICAgICAgaW50IGF4c1BhcmFtZXRlclZhbHVlID0gZ2V0QXhzVXJsUGFyYW1ldGVyVmFsdWUodXJsKTsKKyAgICAgICAgaWYgKGF4c1BhcmFtZXRlclZhbHVlID09IEFDQ0VTU0lCSUxJVFlfU0NSSVBUX0lOSkVDVElPTl9VTkRFRklORUQpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gb25EZXZpY2VTY3JpcHRJbmplY3Rpb25FbmFibGVkID0gKFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgLmdldENvbnRlbnRSZXNvbHZlcigpLCBTZXR0aW5ncy5TZWN1cmUuQUNDRVNTSUJJTElUWV9TQ1JJUFRfSU5KRUNUSU9OLCAwKSA9PSAxKTsKKyAgICAgICAgICAgIGlmIChvbkRldmljZVNjcmlwdEluamVjdGlvbkVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5U2NyaXB0SW5qZWN0b3JJbnN0YW5jZShmYWxzZSk7CisgICAgICAgICAgICAgICAgLy8gbmVpdGhlciBzY3JpcHQgaW5qZWN0ZWQgbm9yIHNjcmlwdCBpbmplY3Rpb24gb3B0ZWQgb3V0ID0+IHdlIGluamVjdAorICAgICAgICAgICAgICAgIGxvYWRVcmwoQUNDRVNTSUJJTElUWV9TQ1JJUFRfQ0hPT1NFUl9KQVZBU0NSSVBUKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBTZXQgdGhpcyBmbGFnIGFmdGVyIHN1Y2Nlc3NmdWxsIHNjcmlwdCBpbmplY3Rpb24uIE1heWJlIHVwb24gaW5qZWN0aW9uCisgICAgICAgICAgICAgICAgLy8gdGhlIGNob29zZXIgc2hvdWxkIHVwZGF0ZSB0aGUgbWV0YSB0YWcgYW5kIHdlIGNoZWNrIGl0IHRvIGRlY2xhcmUgc3VjY2VzcworICAgICAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5U2NyaXB0SW5qZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBpbmplY3Rpb24gZGlzYWJsZWQgc28gd2UgZmFsbGJhY2sgdG8gdGhlIGJhc2ljIGJ1aWx0LWluIHN1cHBvcnQKKyAgICAgICAgICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5U2NyaXB0SW5qZWN0b3JJbnN0YW5jZSh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChheHNQYXJhbWV0ZXJWYWx1ZSA9PSBBQ0NFU1NJQklMSVRZX1NDUklQVF9JTkpFQ1RJT05fT1BURURfT1VUKSB7CisgICAgICAgICAgICAvLyBpbmplY3Rpb24gb3B0ZWQgb3V0IHNvIHdlIGZhbGxiYWNrIHRvIHRoZSBiYXNpYyBidWlsLWluIHN1cHBvcnQKKyAgICAgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlTY3JpcHRJbmplY3Rvckluc3RhbmNlKHRydWUpOworICAgICAgICB9IGVsc2UgaWYgKGF4c1BhcmFtZXRlclZhbHVlID09IEFDQ0VTU0lCSUxJVFlfU0NSSVBUX0lOSkVDVElPTl9QUk9WSURFRCkgeworICAgICAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eVNjcmlwdEluamVjdG9ySW5zdGFuY2UoZmFsc2UpOworICAgICAgICAgICAgLy8gdGhlIFVSTCBwcm92aWRlcyBhY2Nlc3NpYmlsaXR5IGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIGFkZCBvdXIgZ2VuZXJpYyBzY3JpcHQKKyAgICAgICAgICAgIGxvYWRVcmwoQUNDRVNTSUJJTElUWV9TQ1JJUFRfQ0hPT1NFUl9KQVZBU0NSSVBUKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy5lKExPR1RBRywgIlVua25vd24gVVJMIHZhbHVlIGZvciB0aGUgXCJheHNcIiBVUkwgcGFyYW1ldGVyOiAiICsgYXhzUGFyYW1ldGVyVmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGUgaW5zdGFuY2Ugb2YgdGhlIHtAbGluayBBY2Nlc3NpYmlsaXR5SW5qZWN0b3J9IHRvIGJlIHByZXNlbnQgb3Qgbm90LgorICAgICAqCisgICAgICogQHBhcmFtIHByZXNlbnQgVHJ1ZSB0byBlbnN1cmUgYW4gaW5zYW5jZSwgZmFsc2UgdG8gZW5zdXJlIG5vIGluc3RhbmNlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVBY2Nlc3NpYmlsaXR5U2NyaXB0SW5qZWN0b3JJbnN0YW5jZShib29sZWFuIHByZXNlbnQpIHsKKyAgICAgICAgaWYgKHByZXNlbnQgJiYgbUFjY2Vzc2liaWxpdHlJbmplY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eUluamVjdG9yID0gbmV3IEFjY2Vzc2liaWxpdHlJbmplY3Rvcih0aGlzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3IgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgImF4cyIgVVJMIHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgQSB1cmwgdG8gZmV0Y2ggdGhlIHBhcmFtdGVyIGZyb20uCisgICAgICogQHJldHVybiBUaGUgcGFyYW1ldGVyIHZhbHVlIGlmIHN1Y2gsIC0xIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBnZXRBeHNVcmxQYXJhbWV0ZXJWYWx1ZShTdHJpbmcgdXJsKSB7CisgICAgICAgIGlmIChtTWF0Y2hBeHNVcmxQYXJhbWV0ZXJQYXR0ZXJuID09IG51bGwpIHsKKyAgICAgICAgICAgIG1NYXRjaEF4c1VybFBhcmFtZXRlclBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoUEFUVEVSTl9NQVRDSF9BWFNfVVJMX1BBUkFNRVRFUik7CisgICAgICAgIH0KKyAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gbU1hdGNoQXhzVXJsUGFyYW1ldGVyUGF0dGVybi5tYXRjaGVyKHVybCk7CisgICAgICAgIGlmIChtYXRjaGVyLmZpbmQoKSkgeworICAgICAgICAgICAgU3RyaW5nIGtleVZhbHVlUGFpciA9IHVybC5zdWJzdHJpbmcobWF0Y2hlci5zdGFydCgpLCBtYXRjaGVyLmVuZCgpKTsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGtleVZhbHVlUGFpci5zcGxpdCgiPSIpWzFdKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMTgyLDcgKzMyNDksNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgcmVxdWVzdCBhIGxheW91dCwgdHJ5IHRvIHNlbmQgb3VyIHZpZXcgc2l6ZSB0byB0aGUKICAgICAgICAgICAgIC8vIG5hdGl2ZSBzaWRlIHRvIGVuc3VyZSB0aGF0IFdlYkNvcmUgaGFzIHRoZSBjb3JyZWN0IGRpbWVuc2lvbnMuCi0gICAgICAgICAgICBzZW5kVmlld1NpemVab29tKCk7CisgICAgICAgICAgICBzZW5kVmlld1NpemVab29tKGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzMxMiw0NiArMzM3OSw3IEBACiAgICAgICogICAgICAgICBzZXR0aW5ncy4KICAgICAgKi8KICAgICBwdWJsaWMgV2ViU2V0dGluZ3MgZ2V0U2V0dGluZ3MoKSB7Ci0gICAgICAgIHJldHVybiBtV2ViVmlld0NvcmUuZ2V0U2V0dGluZ3MoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gaW5mb3JtIHRoZSB3ZWJ2aWV3IGFib3V0IHBhY2thZ2VzIHRoYXQgYXJlIGluc3RhbGxlZAotICAgICAqIGluIHRoZSBzeXN0ZW0uIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZSB1c2VkIGJ5IHRoZQotICAgICAqIG5hdmlnYXRvci5pc0FwcGxpY2F0aW9uSW5zdGFsbGVkKCkgQVBJLgotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZXMgaXMgYSBzZXQgb2YgcGFja2FnZSBuYW1lcyB0aGF0IGFyZSBrbm93biB0byBiZQotICAgICAqIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtLgotICAgICAqCi0gICAgICogQGhpZGUgbm90IGEgcHVibGljIEFQSQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBhY2thZ2VOYW1lcyhTZXQ8U3RyaW5nPiBwYWNrYWdlTmFtZXMpIHsKLSAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkFERF9QQUNLQUdFX05BTUVTLCBwYWNrYWdlTmFtZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZSB0aGlzIG1ldGhvZCB0byBpbmZvcm0gdGhlIHdlYnZpZXcgYWJvdXQgc2luZ2xlIHBhY2thZ2VzIHRoYXQgYXJlCi0gICAgICogaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0uIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZSB1c2VkIGJ5IHRoZQotICAgICAqIG5hdmlnYXRvci5pc0FwcGxpY2F0aW9uSW5zdGFsbGVkKCkgQVBJLgotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSBpcyB0aGUgbmFtZSBvZiBhIHBhY2thZ2UgdGhhdCBpcyBrbm93biB0byBiZQotICAgICAqIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtLgotICAgICAqCi0gICAgICogQGhpZGUgbm90IGEgcHVibGljIEFQSQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuQUREX1BBQ0tBR0VfTkFNRSwgcGFja2FnZU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZSB0aGlzIG1ldGhvZCB0byBpbmZvcm0gdGhlIHdlYnZpZXcgYWJvdXQgcGFja2FnZXMgdGhhdCBhcmUgdW5pbnN0YWxsZWQKLSAgICAgKiBpbiB0aGUgc3lzdGVtLiBUaGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBieSB0aGUKLSAgICAgKiBuYXZpZ2F0b3IuaXNBcHBsaWNhdGlvbkluc3RhbGxlZCgpIEFQSS4KLSAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgaXMgdGhlIG5hbWUgb2YgYSBwYWNrYWdlIHRoYXQgaGFzIGJlZW4gdW5pbnN0YWxsZWQgaW4KLSAgICAgKiB0aGUgc3lzdGVtLgotICAgICAqCi0gICAgICogQGhpZGUgbm90IGEgcHVibGljIEFQSQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuUkVNT1ZFX1BBQ0tBR0VfTkFNRSwgcGFja2FnZU5hbWUpOworICAgICAgICByZXR1cm4gKG1XZWJWaWV3Q29yZSAhPSBudWxsKSA/IG1XZWJWaWV3Q29yZS5nZXRTZXR0aW5ncygpIDogbnVsbDsKICAgICB9CiAKICAgIC8qKgpAQCAtMzQyNSwzNiArMzQ1Myw2IEBACiAgICAgICAgIH0KIAogICAgICAgICBpbnQgc2F2ZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKLSAgICAgICAgaWYgKG1Jbk92ZXJTY3JvbGxNb2RlICYmICFnZXRTZXR0aW5ncygpCi0gICAgICAgICAgICAgICAgLmdldFVzZVdlYlZpZXdCYWNrZ3JvdW5kRm9yT3ZlcnNjcm9sbEJhY2tncm91bmQoKSkgewotICAgICAgICAgICAgaWYgKG1PdmVyU2Nyb2xsQmFja2dyb3VuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbU92ZXJTY3JvbGxCYWNrZ3JvdW5kID0gbmV3IFBhaW50KCk7Ci0gICAgICAgICAgICAgICAgQml0bWFwIGJtID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0dXNfYmFyX2JhY2tncm91bmQpOwotICAgICAgICAgICAgICAgIG1PdmVyU2Nyb2xsQmFja2dyb3VuZC5zZXRTaGFkZXIobmV3IEJpdG1hcFNoYWRlcihibSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5SRVBFQVQsIFNoYWRlci5UaWxlTW9kZS5SRVBFQVQpKTsKLSAgICAgICAgICAgICAgICBtT3ZlclNjcm9sbEJvcmRlciA9IG5ldyBQYWludCgpOwotICAgICAgICAgICAgICAgIG1PdmVyU2Nyb2xsQm9yZGVyLnNldFN0eWxlKFBhaW50LlN0eWxlLlNUUk9LRSk7Ci0gICAgICAgICAgICAgICAgbU92ZXJTY3JvbGxCb3JkZXIuc2V0U3Ryb2tlV2lkdGgoMCk7Ci0gICAgICAgICAgICAgICAgbU92ZXJTY3JvbGxCb3JkZXIuc2V0Q29sb3IoMHhmZmJiYmJiYik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCB0b3AgPSAwOwotICAgICAgICAgICAgaW50IHJpZ2h0ID0gY29tcHV0ZVJlYWxIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKTsKLSAgICAgICAgICAgIGludCBib3R0b20gPSB0b3AgKyBjb21wdXRlUmVhbFZlcnRpY2FsU2Nyb2xsUmFuZ2UoKTsKLSAgICAgICAgICAgIC8vIGZpcnN0IGRyYXcgdGhlIGJhY2tncm91bmQgYW5kIGFuY2hvciB0byB0aGUgdG9wIG9mIHRoZSB2aWV3Ci0gICAgICAgICAgICBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZShtU2Nyb2xsWCwgbVNjcm9sbFkpOwotICAgICAgICAgICAgY2FudmFzLmNsaXBSZWN0KC1tU2Nyb2xsWCwgdG9wIC0gbVNjcm9sbFksIHJpZ2h0IC0gbVNjcm9sbFgsIGJvdHRvbQotICAgICAgICAgICAgICAgICAgICAtIG1TY3JvbGxZLCBSZWdpb24uT3AuRElGRkVSRU5DRSk7Ci0gICAgICAgICAgICBjYW52YXMuZHJhd1BhaW50KG1PdmVyU2Nyb2xsQmFja2dyb3VuZCk7Ci0gICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOwotICAgICAgICAgICAgLy8gdGhlbiBkcmF3IHRoZSBib3JkZXIKLSAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgtMSwgdG9wIC0gMSwgcmlnaHQsIGJvdHRvbSwgbU92ZXJTY3JvbGxCb3JkZXIpOwotICAgICAgICAgICAgLy8gbmV4dCBjbGlwIHRoZSByZWdpb24gZm9yIHRoZSBjb250ZW50Ci0gICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoMCwgdG9wLCByaWdodCwgYm90dG9tKTsKLSAgICAgICAgfQogICAgICAgICBpZiAobVRpdGxlQmFyICE9IG51bGwpIHsKICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMCwgKGludCkgbVRpdGxlQmFyLmdldEhlaWdodCgpKTsKICAgICAgICAgfQpAQCAtMzQ4MCw3MSArMzQ3OCw1MCBAQAogICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsWSArIGhlaWdodCk7CiAgICAgICAgICAgICBtVGl0bGVTaGFkb3cuZHJhdyhjYW52YXMpOwogICAgICAgICB9Ci0KICAgICAgICAgaWYgKEFVVE9fUkVEUkFXX0hBQ0sgJiYgbUF1dG9SZWRyYXcpIHsKICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgfQorICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpKSBtV2ViVGV4dFZpZXcub25EcmF3U3Vic3RpdHV0ZSgpOwogICAgICAgICBtV2ViVmlld0NvcmUuc2lnbmFsUmVwYWludERvbmUoKTsKLSAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgc3VwZXIuZHJhdyhjYW52YXMpOwotICAgICAgICBpZiAobUVkZ2VHbG93VG9wICE9IG51bGwgJiYgZHJhd0VkZ2VHbG93cyhjYW52YXMpKSB7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIC8vIHBhaW50IHRoZSBoaWdobGlnaHQgaW4gdGhlIGVuZAorICAgICAgICBpZiAoIW1Ub3VjaEhpZ2hsaWdodFJlZ2lvbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmIChtVG91Y2hIaWdodGxpZ2h0UGFpbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2h0bGlnaHRQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2h0bGlnaHRQYWludC5zZXRDb2xvcihtSGlnaHRsaWdodENvbG9yKTsKKyAgICAgICAgICAgICAgICBtVG91Y2hIaWdodGxpZ2h0UGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2h0bGlnaHRQYWludC5zZXRQYXRoRWZmZWN0KG5ldyBDb3JuZXJQYXRoRWZmZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgVE9VQ0hfSElHSExJR0hUX0FSQykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRoKG1Ub3VjaEhpZ2hsaWdodFJlZ2lvbi5nZXRCb3VuZGFyeVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaHRsaWdodFBhaW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoREVCVUdfVE9VQ0hfSElHSExJR0hUKSB7CisgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5nZXROYXZEdW1wKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKG1Ub3VjaEhpZ2hsaWdodFggfCBtVG91Y2hIaWdobGlnaHRZKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtVG91Y2hDcm9zc0hhaXJDb2xvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hDcm9zc0hhaXJDb2xvciA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoQ3Jvc3NIYWlyQ29sb3Iuc2V0Q29sb3IoQ29sb3IuUkVEKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmUobVRvdWNoSGlnaGxpZ2h0WCAtIG1OYXZTbG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFkgLSBtTmF2U2xvcCwgbVRvdWNoSGlnaGxpZ2h0WAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtTmF2U2xvcCArIDEsIG1Ub3VjaEhpZ2hsaWdodFkgKyBtTmF2U2xvcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxLCBtVG91Y2hDcm9zc0hhaXJDb2xvcik7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZShtVG91Y2hIaWdobGlnaHRYICsgbU5hdlNsb3AgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFkgLSBtTmF2U2xvcCwgbVRvdWNoSGlnaGxpZ2h0WAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtTmF2U2xvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdobGlnaHRZICsgbU5hdlNsb3AgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaENyb3NzSGFpckNvbG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBEcmF3IHRoZSBnbG93IGVmZmVjdCBhbG9uZyB0aGUgc2lkZXMgb2YgdGhlIHdpZGdldC4gbUVkZ2VHbG93KiBtdXN0IGJlIG5vbi1udWxsLgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbnZhcyBDYW52YXMgdG8gZHJhdyBpbnRvLCB0cmFuc2Zvcm1lZCBpbnRvIHZpZXcgY29vcmRpbmF0ZXMuCi0gICAgICogQHJldHVybiB0cnVlIGlmIGdsb3cgZWZmZWN0cyBhcmUgc3RpbGwgYW5pbWF0aW5nIGFuZCB0aGUgdmlldyBzaG91bGQgaW52YWxpZGF0ZSBhZ2Fpbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZHJhd0VkZ2VHbG93cyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgIGZpbmFsIGludCBzY3JvbGxYID0gbVNjcm9sbFg7Ci0gICAgICAgIGZpbmFsIGludCBzY3JvbGxZID0gbVNjcm9sbFk7Ci0gICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGdldFdpZHRoKCk7Ci0gICAgICAgIGludCBoZWlnaHQgPSBnZXRIZWlnaHQoKTsKLQotICAgICAgICBib29sZWFuIGludmFsaWRhdGVGb3JHbG93ID0gZmFsc2U7Ci0gICAgICAgIGlmICghbUVkZ2VHbG93VG9wLmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVDb3VudCA9IGNhbnZhcy5zYXZlKCk7Ci0KLSAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXdpZHRoIC8gMiArIHNjcm9sbFgsIE1hdGgubWluKDAsIHNjcm9sbFkpKTsKLSAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5zZXRTaXplKHdpZHRoICogMiwgaGVpZ2h0KTsKLSAgICAgICAgICAgIGludmFsaWRhdGVGb3JHbG93IHw9IG1FZGdlR2xvd1RvcC5kcmF3KGNhbnZhcyk7Ci0gICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQocmVzdG9yZUNvdW50KTsKKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlVG91Y2hIaWdobGlnaHQoYm9vbGVhbiByZW1vdmVQZW5kaW5nTWVzc2FnZSkgeworICAgICAgICBpZiAocmVtb3ZlUGVuZGluZ01lc3NhZ2UpIHsKKyAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5yZW1vdmVNZXNzYWdlcyhFdmVudEh1Yi5HRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTKTsKICAgICAgICAgfQotICAgICAgICBpZiAoIW1FZGdlR2xvd0JvdHRvbS5pc0ZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCByZXN0b3JlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotCi0gICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC13aWR0aCAvIDIgKyBzY3JvbGxYLCBNYXRoLm1heChjb21wdXRlTWF4U2Nyb2xsWSgpLCBzY3JvbGxZKSArIGhlaWdodCk7Ci0gICAgICAgICAgICBjYW52YXMucm90YXRlKDE4MCwgd2lkdGgsIDApOwotICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLnNldFNpemUod2lkdGggKiAyLCBoZWlnaHQpOwotICAgICAgICAgICAgaW52YWxpZGF0ZUZvckdsb3cgfD0gbUVkZ2VHbG93Qm90dG9tLmRyYXcoY2FudmFzKTsKLSAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChyZXN0b3JlQ291bnQpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbUVkZ2VHbG93TGVmdC5pc0ZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCByZXN0b3JlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotCi0gICAgICAgICAgICBjYW52YXMucm90YXRlKDI3MCk7Ci0gICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC1oZWlnaHQgKiAxLjVmIC0gc2Nyb2xsWSwgTWF0aC5taW4oMCwgc2Nyb2xsWCkpOwotICAgICAgICAgICAgbUVkZ2VHbG93TGVmdC5zZXRTaXplKGhlaWdodCAqIDIsIHdpZHRoKTsKLSAgICAgICAgICAgIGludmFsaWRhdGVGb3JHbG93IHw9IG1FZGdlR2xvd0xlZnQuZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtRWRnZUdsb3dSaWdodC5pc0ZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCByZXN0b3JlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotCi0gICAgICAgICAgICBjYW52YXMucm90YXRlKDkwKTsKLSAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLWhlaWdodCAvIDIgKyBzY3JvbGxZLAotICAgICAgICAgICAgICAgICAgICAtKE1hdGgubWF4KGNvbXB1dGVNYXhTY3JvbGxYKCksIHNjcm9sbFgpICsgd2lkdGgpKTsKLSAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0LnNldFNpemUoaGVpZ2h0ICogMiwgd2lkdGgpOwotICAgICAgICAgICAgaW52YWxpZGF0ZUZvckdsb3cgfD0gbUVkZ2VHbG93UmlnaHQuZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGludmFsaWRhdGVGb3JHbG93OworICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuUkVNT1ZFX1RPVUNIX0hJR0hMSUdIVF9SRUNUUyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0zNTYxLDEyICszNTM4LDIwIEBACiAgICAgICAgIC8vIHRvIHdpbmRvd3Mgb3ZlcnZpZXcsIHRoZSBXZWJWaWV3IHdpbGwgYmUgdGVtcG9yYXJpbHkgcmVtb3ZlZCBmcm9tIHRoZQogICAgICAgICAvLyB2aWV3IHN5c3RlbS4gSW4gdGhhdCBjYXNlLCBkbyBub3RoaW5nLgogICAgICAgICBpZiAoZ2V0UGFyZW50KCkgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIEEgbXVsdGktZmluZ2VyIGdlc3R1cmUgY2FuIGxvb2sgbGlrZSBhIGxvbmcgcHJlc3M7IG1ha2Ugc3VyZSB3ZSBkb24ndCB0YWtlCisgICAgICAgIC8vIGxvbmcgcHJlc3MgYWN0aW9ucyBpZiB3ZSdyZSBzY2FsaW5nLgorICAgICAgICBmaW5hbCBTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvciA9IG1ab29tTWFuYWdlci5nZXRNdWx0aVRvdWNoR2VzdHVyZURldGVjdG9yKCk7CisgICAgICAgIGlmIChkZXRlY3RvciAhPSBudWxsICYmIGRldGVjdG9yLmlzSW5Qcm9ncmVzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCiAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCAmJiBuYXRpdmVDdXJzb3JJc1RleHRJbnB1dCgpKSB7CiAgICAgICAgICAgICAvLyBTZW5kIHRoZSBjbGljayBzbyB0aGF0IHRoZSB0ZXh0ZmllbGQgaXMgaW4gZm9jdXMKICAgICAgICAgICAgIGNlbnRlcktleVByZXNzT25UZXh0RmllbGQoKTsKICAgICAgICAgICAgIHJlYnVpbGRXZWJUZXh0VmlldygpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkodHJ1ZSk7CisgICAgICAgICAgICBjbGVhclRleHRFbnRyeSgpOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkpIHsKICAgICAgICAgICAgIHJldHVybiBtV2ViVGV4dFZpZXcucGVyZm9ybUxvbmdDbGljaygpOwpAQCAtMzU4NywyNiArMzU3MiwxNyBAQAogICAgICAgICBzZXRVcFNlbGVjdCgpOwogICAgICAgICBpZiAobU5hdGl2ZUNsYXNzICE9IDAgJiYgbmF0aXZlV29yZFNlbGVjdGlvbih4LCB5KSkgewogICAgICAgICAgICAgbmF0aXZlU2V0RXh0ZW5kU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICBXZWJDaHJvbWVDbGllbnQgY2xpZW50ID0gZ2V0V2ViQ2hyb21lQ2xpZW50KCk7Ci0gICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIGNsaWVudC5vblNlbGVjdGlvblN0YXJ0KHRoaXMpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgbm90aWZ5U2VsZWN0RGlhbG9nRGlzbWlzc2VkKCk7CisgICAgICAgIHNlbGVjdGlvbkRvbmUoKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGJvb2xlYW4gaW5BbmltYXRlWm9vbSgpIHsKLSAgICAgICAgcmV0dXJuIG1ab29tU2NhbGUgIT0gMDsKLSAgICB9Ci0KICAgICAvKioKLSAgICAgKiBOZWVkIHRvIGFkanVzdCB0aGUgV2ViVGV4dFZpZXcgYWZ0ZXIgYSBjaGFuZ2UgaW4gem9vbSwgc2luY2UgbUFjdHVhbFNjYWxlCi0gICAgICogaGFzIGNoYW5nZWQuICBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciBwYXNzd29yZCBmaWVsZHMsIHdoaWNoIGFyZQotICAgICAqIGRyYXduIGJ5IHRoZSBXZWJUZXh0Vmlldywgc2luY2UgaXQgY29udmV5cyBtb3JlIGluZm9ybWF0aW9uIHRoYW4gd2hhdAotICAgICAqIHdlYmtpdCBkcmF3cy4gIFRodXMgd2UgbmVlZCB0byByZXBvc2l0aW9uIGl0IHRvIHNob3cgaW4gdGhlIGNvcnJlY3QKLSAgICAgKiBwbGFjZS4KKyAgICAgKiBLZWVwIHRyYWNrIG9mIHRoZSBDYWxsYmFjayBzbyB3ZSBjYW4gZW5kIGl0cyBBY3Rpb25Nb2RlIG9yIHJlbW92ZSBpdHMKKyAgICAgKiB0aXRsZWJhci4KICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRUb0FkanVzdFdlYlRleHRWaWV3OworICAgIHByaXZhdGUgU2VsZWN0QWN0aW9uTW9kZUNhbGxiYWNrIG1TZWxlY3RDYWxsYmFjazsKIAogICAgIHByaXZhdGUgYm9vbGVhbiBkaWRVcGRhdGVUZXh0Vmlld0JvdW5kcyhib29sZWFuIGFsbG93SW50ZXJzZWN0KSB7CiAgICAgICAgIFJlY3QgY29udGVudEJvdW5kcyA9IG5hdGl2ZUZvY3VzQ2FuZGlkYXRlTm9kZUJvdW5kcygpOwpAQCAtMzYzNSwyNSArMzYxMSw1NCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGRyYXdFeHRyYXMoQ2FudmFzIGNhbnZhcywgaW50IGV4dHJhcywgYm9vbGVhbiBhbmltYXRpb25zUnVubmluZykgewotICAgICAgICAvLyBJZiBtTmF0aXZlQ2xhc3MgaXMgMCwgd2Ugc2hvdWxkIG5vdCByZWFjaCBoZXJlLCBzbyB3ZSBkbyBub3QKLSAgICAgICAgLy8gbmVlZCB0byBjaGVjayBpdCBhZ2Fpbi4KLSAgICAgICAgaWYgKGFuaW1hdGlvbnNSdW5uaW5nKSB7Ci0gICAgICAgICAgICBjYW52YXMuc2V0RHJhd0ZpbHRlcihtV2ViVmlld0NvcmUubVpvb21GaWx0ZXIpOworICAgIHByaXZhdGUgdm9pZCBvblpvb21BbmltYXRpb25TdGFydCgpIHsKKyAgICAgICAgLy8gSWYgaXQgaXMgaW4gcGFzc3dvcmQgbW9kZSwgdHVybiBpdCBvZmYgc28gaXQgZG9lcyBub3QgZHJhdyBtaXNwbGFjZWQuCisgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkgJiYgbmF0aXZlRm9jdXNDYW5kaWRhdGVJc1Bhc3N3b3JkKCkpIHsKKyAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5zZXRJblBhc3N3b3JkKGZhbHNlKTsKICAgICAgICAgfQotICAgICAgICBuYXRpdmVEcmF3RXh0cmFzKGNhbnZhcywgZXh0cmFzKTsKLSAgICAgICAgY2FudmFzLnNldERyYXdGaWx0ZXIobnVsbCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIG9uWm9vbUFuaW1hdGlvbkVuZCgpIHsKKyAgICAgICAgLy8gYWRqdXN0IHRoZSBlZGl0IHRleHQgdmlldyBpZiBuZWVkZWQKKyAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiBkaWRVcGRhdGVUZXh0Vmlld0JvdW5kcyhmYWxzZSkgJiYgbmF0aXZlRm9jdXNDYW5kaWRhdGVJc1Bhc3N3b3JkKCkpIHsKKyAgICAgICAgICAgIC8vIElmIGl0IGlzIGEgcGFzc3dvcmQgZmllbGQsIHN0YXJ0IGRyYXdpbmcgdGhlIFdlYlRleHRWaWV3IG9uY2UKKyAgICAgICAgICAgIC8vIGFnYWluLgorICAgICAgICAgICAgbVdlYlRleHRWaWV3LnNldEluUGFzc3dvcmQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG9uRml4ZWRMZW5ndGhab29tQW5pbWF0aW9uU3RhcnQoKSB7CisgICAgICAgIFdlYlZpZXdDb3JlLnBhdXNlVXBkYXRlUGljdHVyZShnZXRXZWJWaWV3Q29yZSgpKTsKKyAgICAgICAgb25ab29tQW5pbWF0aW9uU3RhcnQoKTsKKyAgICB9CisKKyAgICB2b2lkIG9uRml4ZWRMZW5ndGhab29tQW5pbWF0aW9uRW5kKCkgeworICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7CisgICAgICAgIG9uWm9vbUFuaW1hdGlvbkVuZCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaT09NX0JJVFMgPSBQYWludC5GSUxURVJfQklUTUFQX0ZMQUcgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5ESVRIRVJfRkxBRyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LlNVQlBJWEVMX1RFWFRfRkxBRzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX0JJVFMgPSBQYWludC5GSUxURVJfQklUTUFQX0ZMQUcgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkRJVEhFUl9GTEFHOworCisgICAgcHJpdmF0ZSBmaW5hbCBEcmF3RmlsdGVyIG1ab29tRmlsdGVyID0KKyAgICAgICAgICAgIG5ldyBQYWludEZsYWdzRHJhd0ZpbHRlcihaT09NX0JJVFMsIFBhaW50LkxJTkVBUl9URVhUX0ZMQUcpOworICAgIC8vIElmIHdlIG5lZWQgdG8gdHJhZGUgYmV0dGVyIHF1YWxpdHkgZm9yIHNwZWVkLCBzZXQgbVNjcm9sbEZpbHRlciB0byBudWxsCisgICAgcHJpdmF0ZSBmaW5hbCBEcmF3RmlsdGVyIG1TY3JvbGxGaWx0ZXIgPQorICAgICAgICAgICAgbmV3IFBhaW50RmxhZ3NEcmF3RmlsdGVyKFNDUk9MTF9CSVRTLCAwKTsKKwogICAgIHByaXZhdGUgdm9pZCBkcmF3Q29yZUFuZEN1cnNvclJpbmcoQ2FudmFzIGNhbnZhcywgaW50IGNvbG9yLAogICAgICAgICBib29sZWFuIGRyYXdDdXJzb3JSaW5nKSB7CiAgICAgICAgIGlmIChtRHJhd0hpc3RvcnkpIHsKLSAgICAgICAgICAgIGNhbnZhcy5zY2FsZShtQWN0dWFsU2NhbGUsIG1BY3R1YWxTY2FsZSk7CisgICAgICAgICAgICBjYW52YXMuc2NhbGUobVpvb21NYW5hZ2VyLmdldFNjYWxlKCksIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpKTsKICAgICAgICAgICAgIGNhbnZhcy5kcmF3UGljdHVyZShtSGlzdG9yeVBpY3R1cmUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgPT0gMCkgcmV0dXJuOwogCi0gICAgICAgIGJvb2xlYW4gYW5pbWF0ZVpvb20gPSBtWm9vbVNjYWxlICE9IDA7CisgICAgICAgIGJvb2xlYW4gYW5pbWF0ZVpvb20gPSBtWm9vbU1hbmFnZXIuaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKTsKICAgICAgICAgYm9vbGVhbiBhbmltYXRlU2Nyb2xsID0gKCghbVNjcm9sbGVyLmlzRmluaXNoZWQoKQogICAgICAgICAgICAgICAgIHx8IG1WZWxvY2l0eVRyYWNrZXIgIT0gbnVsbCkKICAgICAgICAgICAgICAgICAmJiAobVRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX01PREUgfHwKQEAgLTM2NzIsNTkgKzM2NzcsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChhbmltYXRlWm9vbSkgewotICAgICAgICAgICAgZmxvYXQgem9vbVNjYWxlOwotICAgICAgICAgICAgaW50IGludGVydmFsID0gKGludCkgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gbVpvb21TdGFydCk7Ci0gICAgICAgICAgICBpZiAoaW50ZXJ2YWwgPCBaT09NX0FOSU1BVElPTl9MRU5HVEgpIHsKLSAgICAgICAgICAgICAgICBmbG9hdCByYXRpbyA9IChmbG9hdCkgaW50ZXJ2YWwgLyBaT09NX0FOSU1BVElPTl9MRU5HVEg7Ci0gICAgICAgICAgICAgICAgem9vbVNjYWxlID0gMS4wZiAvIChtSW52SW5pdGlhbFpvb21TY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAobUludkZpbmFsWm9vbVNjYWxlIC0gbUludkluaXRpYWxab29tU2NhbGUpICogcmF0aW8pOwotICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgem9vbVNjYWxlID0gbVpvb21TY2FsZTsKLSAgICAgICAgICAgICAgICAvLyBzZXQgbVpvb21TY2FsZSB0byBiZSAwIGFzIHdlIGhhdmUgZG9uZSBhbmltYXRpb24KLSAgICAgICAgICAgICAgICBtWm9vbVNjYWxlID0gMDsKLSAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7Ci0gICAgICAgICAgICAgICAgLy8gY2FsbCBpbnZhbGlkYXRlKCkgYWdhaW4gdG8gZHJhdyB3aXRoIHRoZSBmaW5hbCBmaWx0ZXJzCi0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIGlmIChtTmVlZFRvQWRqdXN0V2ViVGV4dFZpZXcpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5lZWRUb0FkanVzdFdlYlRleHRWaWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkaWRVcGRhdGVUZXh0Vmlld0JvdW5kcyhmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQgaXMgYSBwYXNzd29yZCBmaWVsZCwgc3RhcnQgZHJhd2luZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlYlRleHRWaWV3IG9uY2UgYWdhaW4uCi0gICAgICAgICAgICAgICAgICAgICAgICBtV2ViVGV4dFZpZXcuc2V0SW5QYXNzd29yZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgaW50ZXJtZWRpYXRlIHNjcm9sbCBwb3NpdGlvbi4gQXMgd2UgbmVlZCB0byB1c2UKLSAgICAgICAgICAgIC8vIHpvb21TY2FsZSwgd2UgY2FuJ3QgdXNlIHBpbkxvY1gvWSBkaXJlY3RseS4gQ29weSB0aGUgbG9naWMgaGVyZS4KLSAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gem9vbVNjYWxlICogbUludkluaXRpYWxab29tU2NhbGU7Ci0gICAgICAgICAgICBpbnQgdHggPSBNYXRoLnJvdW5kKHNjYWxlICogKG1Jbml0aWFsU2Nyb2xsWCArIG1ab29tQ2VudGVyWCkKLSAgICAgICAgICAgICAgICAgICAgLSBtWm9vbUNlbnRlclgpOwotICAgICAgICAgICAgdHggPSAtcGluTG9jKHR4LCBnZXRWaWV3V2lkdGgoKSwgTWF0aC5yb3VuZChtQ29udGVudFdpZHRoCi0gICAgICAgICAgICAgICAgICAgICogem9vbVNjYWxlKSkgKyBtU2Nyb2xsWDsKLSAgICAgICAgICAgIGludCB0aXRsZUhlaWdodCA9IGdldFRpdGxlSGVpZ2h0KCk7Ci0gICAgICAgICAgICBpbnQgdHkgPSBNYXRoLnJvdW5kKHNjYWxlCi0gICAgICAgICAgICAgICAgICAgICogKG1Jbml0aWFsU2Nyb2xsWSArIG1ab29tQ2VudGVyWSAtIHRpdGxlSGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAtIChtWm9vbUNlbnRlclkgLSB0aXRsZUhlaWdodCkpOwotICAgICAgICAgICAgdHkgPSAtKHR5IDw9IHRpdGxlSGVpZ2h0ID8gTWF0aC5tYXgodHksIDApIDogcGluTG9jKHR5Ci0gICAgICAgICAgICAgICAgICAgIC0gdGl0bGVIZWlnaHQsIGdldFZpZXdIZWlnaHQoKSwgTWF0aC5yb3VuZChtQ29udGVudEhlaWdodAotICAgICAgICAgICAgICAgICAgICAqIHpvb21TY2FsZSkpICsgdGl0bGVIZWlnaHQpICsgbVNjcm9sbFk7Ci0gICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKHR4LCB0eSk7Ci0gICAgICAgICAgICBjYW52YXMuc2NhbGUoem9vbVNjYWxlLCB6b29tU2NhbGUpOwotICAgICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiAhbU5lZWRUb0FkanVzdFdlYlRleHRWaWV3Ci0gICAgICAgICAgICAgICAgICAgICYmIG1ab29tU2NhbGUgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBXZWJUZXh0VmlldyBpcyB1cC4gIEtlZXAgdHJhY2sgb2YgdGhpcyBzbyB3ZSBjYW4gYWRqdXN0Ci0gICAgICAgICAgICAgICAgLy8gaXRzIHNpemUgYW5kIHBsYWNlbWVudCB3aGVuIHdlIGZpbmlzaCB6b29taW5nCi0gICAgICAgICAgICAgICAgbU5lZWRUb0FkanVzdFdlYlRleHRWaWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyBpbiBwYXNzd29yZCBtb2RlLCB0dXJuIGl0IG9mZiBzbyBpdCBkb2VzIG5vdCBkcmF3Ci0gICAgICAgICAgICAgICAgLy8gbWlzcGxhY2VkLgotICAgICAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICBtV2ViVGV4dFZpZXcuc2V0SW5QYXNzd29yZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmFuaW1hdGVab29tKGNhbnZhcyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjYW52YXMuc2NhbGUobUFjdHVhbFNjYWxlLCBtQWN0dWFsU2NhbGUpOworICAgICAgICAgICAgY2FudmFzLnNjYWxlKG1ab29tTWFuYWdlci5nZXRTY2FsZSgpLCBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBib29sZWFuIFVJQW5pbWF0aW9uc1J1bm5pbmcgPSBmYWxzZTsKQEAgLTM3MzYsMjMgKzM2OTEsMzggQEAKICAgICAgICAgICAgIC8vIHdlIGFzayBmb3IgYSByZXBhaW50LgogICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICB9Ci0gICAgICAgIG1XZWJWaWV3Q29yZS5kcmF3Q29udGVudFBpY3R1cmUoY2FudmFzLCBjb2xvciwKLSAgICAgICAgICAgICAgICAoYW5pbWF0ZVpvb20gfHwgbVByZXZpZXdab29tT25seSB8fCBVSUFuaW1hdGlvbnNSdW5uaW5nKSwKLSAgICAgICAgICAgICAgICBhbmltYXRlU2Nyb2xsKTsKLSAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyA9PSAwKSByZXR1cm47CisKICAgICAgICAgLy8gZGVjaWRlIHdoaWNoIGFkb3JubWVudHMgdG8gZHJhdwogICAgICAgICBpbnQgZXh0cmFzID0gRFJBV19FWFRSQVNfTk9ORTsKKyAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKKyAgICAgICAgICAgIExvZy52KExPR1RBRywgIm1GaW5kSXNVcD0iICsgbUZpbmRJc1VwCisgICAgICAgICAgICAgICAgICAgICsgIiBtU2VsZWN0aW5nVGV4dD0iICsgbVNlbGVjdGluZ1RleHQKKyAgICAgICAgICAgICAgICAgICAgKyAiIG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpPSIKKyAgICAgICAgICAgICAgICAgICAgKyBuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKQorICAgICAgICAgICAgICAgICAgICArICIgYW5pbWF0ZVpvb209IiArIGFuaW1hdGVab29tKTsKKyAgICAgICAgfQogICAgICAgICBpZiAobUZpbmRJc1VwKSB7Ci0gICAgICAgICAgICAgICAgZXh0cmFzID0gRFJBV19FWFRSQVNfRklORDsKKyAgICAgICAgICAgIGV4dHJhcyA9IERSQVdfRVhUUkFTX0ZJTkQ7CiAgICAgICAgIH0gZWxzZSBpZiAobVNlbGVjdGluZ1RleHQpIHsKICAgICAgICAgICAgIGV4dHJhcyA9IERSQVdfRVhUUkFTX1NFTEVDVElPTjsKICAgICAgICAgICAgIG5hdGl2ZVNldFNlbGVjdGlvblBvaW50ZXIobURyYXdTZWxlY3Rpb25Qb2ludGVyLAotICAgICAgICAgICAgICAgICAgICBtSW52QWN0dWFsU2NhbGUsCisgICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci5nZXRJbnZTY2FsZSgpLAogICAgICAgICAgICAgICAgICAgICBtU2VsZWN0WCwgbVNlbGVjdFkgLSBnZXRUaXRsZUhlaWdodCgpKTsKICAgICAgICAgfSBlbHNlIGlmIChkcmF3Q3Vyc29yUmluZykgewogICAgICAgICAgICAgZXh0cmFzID0gRFJBV19FWFRSQVNfQ1VSU09SX1JJTkc7CiAgICAgICAgIH0KLSAgICAgICAgZHJhd0V4dHJhcyhjYW52YXMsIGV4dHJhcywgVUlBbmltYXRpb25zUnVubmluZyk7CisgICAgICAgIERyYXdGaWx0ZXIgZGYgPSBudWxsOworICAgICAgICBpZiAobVpvb21NYW5hZ2VyLmlzWm9vbUFuaW1hdGluZygpIHx8IFVJQW5pbWF0aW9uc1J1bm5pbmcpIHsKKyAgICAgICAgICAgIGRmID0gbVpvb21GaWx0ZXI7CisgICAgICAgIH0gZWxzZSBpZiAoYW5pbWF0ZVNjcm9sbCkgeworICAgICAgICAgICAgZGYgPSBtU2Nyb2xsRmlsdGVyOworICAgICAgICB9CisgICAgICAgIGNhbnZhcy5zZXREcmF3RmlsdGVyKGRmKTsKKyAgICAgICAgaW50IGNvbnRlbnQgPSBuYXRpdmVEcmF3KGNhbnZhcywgY29sb3IsIGV4dHJhcywgdHJ1ZSk7CisgICAgICAgIGNhbnZhcy5zZXREcmF3RmlsdGVyKG51bGwpOworICAgICAgICBpZiAoY29udGVudCAhPSAwKSB7CisgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU1BMSVRfUElDVFVSRV9TRVQsIGNvbnRlbnQsIDApOworICAgICAgICB9CiAKICAgICAgICAgaWYgKGV4dHJhcyA9PSBEUkFXX0VYVFJBU19DVVJTT1JfUklORykgewogICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfU0hPUlRQUkVTU19TVEFSVF9NT0RFKSB7CkBAIC0zNzgxLDEwICszNzUxLDE0IEBACiAgICAgICAgIHJldHVybiBtRHJhd0hpc3Rvcnk7CiAgICAgfQogCisgICAgaW50IGdldEhpc3RvcnlQaWN0dXJlV2lkdGgoKSB7CisgICAgICAgIHJldHVybiAobUhpc3RvcnlQaWN0dXJlICE9IG51bGwpID8gbUhpc3RvcnlQaWN0dXJlLmdldFdpZHRoKCkgOiAwOworICAgIH0KKwogICAgIC8vIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiBVSSB0aHJlYWQKICAgICB2b2lkIHN3aXRjaE91dERyYXdIaXN0b3J5KCkgewogICAgICAgICBpZiAobnVsbCA9PSBtV2ViVmlld0NvcmUpIHJldHVybjsgLy8gQ2FsbGJhY2tQcm94eSBtYXkgdHJpZ2dlciB0aGlzCi0gICAgICAgIGlmIChtRHJhd0hpc3RvcnkgJiYgbVdlYlZpZXdDb3JlLnBpY3R1cmVSZWFkeSgpKSB7CisgICAgICAgIGlmIChtRHJhd0hpc3RvcnkgJiYgKGdldFByb2dyZXNzKCkgPT0gMTAwIHx8IG5hdGl2ZUhhc0NvbnRlbnQoKSkpIHsKICAgICAgICAgICAgIG1EcmF3SGlzdG9yeSA9IGZhbHNlOwogICAgICAgICAgICAgbUhpc3RvcnlQaWN0dXJlID0gbnVsbDsKICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKQEAgLTM4MzUsNyArMzgwOSw5IEBACiAgICAgICogIEBwYXJhbSAgZW5kICAgICBFbmQgb2Ygc2VsZWN0aW9uLgogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBzZXRTZWxlY3Rpb24oaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TRVRfU0VMRUNUSU9OLCBzdGFydCwgZW5kKTsKKyAgICAgICAgaWYgKG1XZWJWaWV3Q29yZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU0VUX1NFTEVDVElPTiwgc3RhcnQsIGVuZCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTM4NTMsMTQgKzM4MjksMTEgQEAKICAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IChJbnB1dE1ldGhvZE1hbmFnZXIpCiAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5JTlBVVF9NRVRIT0RfU0VSVklDRSk7CiAKLSAgICAgICAgLy8gYnJpbmcgaXQgYmFjayB0byB0aGUgZGVmYXVsdCBzY2FsZSBzbyB0aGF0IHVzZXIgY2FuIGVudGVyIHRleHQKLSAgICAgICAgYm9vbGVhbiB6b29tID0gbUFjdHVhbFNjYWxlIDwgbURlZmF1bHRTY2FsZTsKKyAgICAgICAgLy8gYnJpbmcgaXQgYmFjayB0byB0aGUgZGVmYXVsdCBsZXZlbCBzY2FsZSBzbyB0aGF0IHVzZXIgY2FuIGVudGVyIHRleHQKKyAgICAgICAgYm9vbGVhbiB6b29tID0gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCkgPCBtWm9vbU1hbmFnZXIuZ2V0RGVmYXVsdFNjYWxlKCk7CiAgICAgICAgIGlmICh6b29tKSB7Ci0gICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IG1MYXN0VG91Y2hYOwotICAgICAgICAgICAgbVpvb21DZW50ZXJZID0gbUxhc3RUb3VjaFk7Ci0gICAgICAgICAgICAvLyBkbyBub3QgY2hhbmdlIHRleHQgd3JhcCBzY2FsZSBzbyB0aGF0IHRoZXJlIGlzIG5vIHJlZmxvdwotICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKG1EZWZhdWx0U2NhbGUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuc2V0Wm9vbUNlbnRlcihtTGFzdFRvdWNoWCwgbUxhc3RUb3VjaFkpOworICAgICAgICAgICAgbVpvb21NYW5hZ2VyLnNldFpvb21TY2FsZShtWm9vbU1hbmFnZXIuZ2V0RGVmYXVsdFNjYWxlKCksIGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICBpZiAoaXNUZXh0VmlldykgewogICAgICAgICAgICAgcmVidWlsZFdlYlRleHRWaWV3KCk7CkBAIC0zODcyLDcgKzM4NDUsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAvLyBVc2VkIGJ5IHBsdWdpbnMuCisgICAgICAgIC8vIFVzZWQgYnkgcGx1Z2lucyBhbmQgY29udGVudEVkaXRhYmxlLgogICAgICAgICAvLyBBbHNvIHVzZWQgaWYgdGhlIG5hdmlnYXRpb24gY2FjaGUgaXMgb3V0IG9mIGRhdGUsIGFuZAogICAgICAgICAvLyBkb2VzIG5vdCByZWNvZ25pemUgdGhhdCBhIHRleHRmaWVsZCBpcyBpbiBmb2N1cy4gIEluIHRoYXQKICAgICAgICAgLy8gY2FzZSwgdXNlIFdlYlZpZXcgYXMgdGhlIHRhcmdldGVkIHZpZXcuCkBAIC0zODgyLDEwICszODU1LDExIEBACiAKICAgICAvLyBDYWxsZWQgYnkgV2ViS2l0IHRvIGluc3RydWN0IHRoZSBVSSB0byBoaWRlIHRoZSBrZXlib2FyZAogICAgIHByaXZhdGUgdm9pZCBoaWRlU29mdEtleWJvYXJkKCkgewotICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gKElucHV0TWV0aG9kTWFuYWdlcikKLSAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKLQotICAgICAgICBpbW0uaGlkZVNvZnRJbnB1dEZyb21XaW5kb3codGhpcy5nZXRXaW5kb3dUb2tlbigpLCAwKTsKKyAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IElucHV0TWV0aG9kTWFuYWdlci5wZWVrSW5zdGFuY2UoKTsKKyAgICAgICAgaWYgKGltbSAhPSBudWxsICYmIChpbW0uaXNBY3RpdmUodGhpcykKKyAgICAgICAgICAgICAgICB8fCAoaW5FZGl0aW5nTW9kZSgpICYmIGltbS5pc0FjdGl2ZShtV2ViVGV4dFZpZXcpKSkpIHsKKyAgICAgICAgICAgIGltbS5oaWRlU29mdElucHV0RnJvbVdpbmRvdyh0aGlzLmdldFdpbmRvd1Rva2VuKCksIDApOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoKQEAgLTM5MTAsNyArMzg4NCw3IEBACiAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIGtub3cgd2UgaGF2ZSBmb3VuZCBhbiBpbnB1dCBmaWVsZCwgc28gZ28gYWhlYWQKICAgICAgICAgLy8gYW5kIGNyZWF0ZSB0aGUgV2ViVGV4dFZpZXcgaWYgbmVjZXNzYXJ5LgogICAgICAgICBpZiAobVdlYlRleHRWaWV3ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1XZWJUZXh0VmlldyA9IG5ldyBXZWJUZXh0VmlldyhtQ29udGV4dCwgV2ViVmlldy50aGlzKTsKKyAgICAgICAgICAgIG1XZWJUZXh0VmlldyA9IG5ldyBXZWJUZXh0VmlldyhtQ29udGV4dCwgV2ViVmlldy50aGlzLCBtQXV0b0ZpbGxRdWVyeUlkKTsKICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgb3VyIGdlbmVyYXRpb24gbnVtYmVyLgogICAgICAgICAgICAgbVRleHRHZW5lcmF0aW9uID0gMDsKICAgICAgICAgfQpAQCAtMzk2MywxOSArMzkzNywzMCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFRlbGwgd2Via2l0IHRvIHB1dCB0aGUgY3Vyc29yIG9uIHNjcmVlbi4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHZvaWQgcmV2ZWFsU2VsZWN0aW9uKCkgeworICAgICAgICBpZiAobVdlYlZpZXdDb3JlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5SRVZFQUxfU0VMRUNUSU9OKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIENhbGxlZCBieSBXZWJUZXh0VmlldyB0byBmaW5kIHNhdmVkIGZvcm0gZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlCiAgICAgICogdGV4dGZpZWxkCiAgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGV4dGZpZWxkLgogICAgICAqIEBwYXJhbSBub2RlUG9pbnRlciBQb2ludGVyIHRvIHRoZSBub2RlIG9mIHRoZSB0ZXh0ZmllbGQsIHNvIGl0IGNhbiBiZQogICAgICAqICAgICAgICAgIGNvbXBhcmVkIHRvIHRoZSBjdXJyZW50bHkgZm9jdXNlZCB0ZXh0ZmllbGQgd2hlbiB0aGUgZGF0YSBpcwogICAgICAqICAgICAgICAgIHJldHJpZXZlZC4KKyAgICAgKiBAcGFyYW0gYXV0b0ZpbGxhYmxlIHRydWUgaWYgV2ViS2l0IGhhcyBkZXRlcm1pbmVkIHRoaXMgZmllbGQgaXMgcGFydCBvZgorICAgICAqICAgICAgICAgIGEgZm9ybSB0aGF0IGNhbiBiZSBhdXRvIGZpbGxlZC4KICAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHZvaWQgcmVxdWVzdEZvcm1EYXRhKFN0cmluZyBuYW1lLCBpbnQgbm9kZVBvaW50ZXIpIHsKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgcmVxdWVzdEZvcm1EYXRhKFN0cmluZyBuYW1lLCBpbnQgbm9kZVBvaW50ZXIsIGJvb2xlYW4gYXV0b0ZpbGxhYmxlKSB7CiAgICAgICAgIGlmIChtV2ViVmlld0NvcmUuZ2V0U2V0dGluZ3MoKS5nZXRTYXZlRm9ybURhdGEoKSkgewogICAgICAgICAgICAgTWVzc2FnZSB1cGRhdGUgPSBtUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZShSRVFVRVNUX0ZPUk1fREFUQSk7CiAgICAgICAgICAgICB1cGRhdGUuYXJnMSA9IG5vZGVQb2ludGVyOwogICAgICAgICAgICAgUmVxdWVzdEZvcm1EYXRhIHVwZGF0ZXIgPSBuZXcgUmVxdWVzdEZvcm1EYXRhKG5hbWUsIGdldFVybCgpLAotICAgICAgICAgICAgICAgICAgICB1cGRhdGUpOworICAgICAgICAgICAgICAgICAgICB1cGRhdGUsIGF1dG9GaWxsYWJsZSk7CiAgICAgICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQodXBkYXRlcik7CiAgICAgICAgICAgICB0LnN0YXJ0KCk7CiAgICAgICAgIH0KQEAgLTQwMDEsMTUgKzM5ODYsMjggQEAKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbU5hbWU7CiAgICAgICAgIHByaXZhdGUgU3RyaW5nIG1Vcmw7CiAgICAgICAgIHByaXZhdGUgTWVzc2FnZSBtVXBkYXRlTWVzc2FnZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1BdXRvRmlsbGFibGU7CiAKLSAgICAgICAgcHVibGljIFJlcXVlc3RGb3JtRGF0YShTdHJpbmcgbmFtZSwgU3RyaW5nIHVybCwgTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgcHVibGljIFJlcXVlc3RGb3JtRGF0YShTdHJpbmcgbmFtZSwgU3RyaW5nIHVybCwgTWVzc2FnZSBtc2csIGJvb2xlYW4gYXV0b0ZpbGxhYmxlKSB7CiAgICAgICAgICAgICBtTmFtZSA9IG5hbWU7CiAgICAgICAgICAgICBtVXJsID0gdXJsOwogICAgICAgICAgICAgbVVwZGF0ZU1lc3NhZ2UgPSBtc2c7CisgICAgICAgICAgICBtQXV0b0ZpbGxhYmxlID0gYXV0b0ZpbGxhYmxlOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcGFzdEVudHJpZXMgPSBtRGF0YWJhc2UuZ2V0Rm9ybURhdGEobVVybCwgbU5hbWUpOworICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcGFzdEVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAgICAgICAgIGlmIChtQXV0b0ZpbGxhYmxlKSB7CisgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGNvZGUgaW5zaWRlIHRoZSBhZGFwdGVyIGNsaWNrIGhhbmRsZXIgaW4gV2ViVGV4dFZpZXcgZGVwZW5kcworICAgICAgICAgICAgICAgIC8vIG9uIHRoZSBBdXRvRmlsbCBpdGVtIGJlaW5nIGF0IHRoZSB0b3Agb2YgdGhlIGRyb3AgZG93biBsaXN0LiBJZiB5b3UgY2hhbmdlCisgICAgICAgICAgICAgICAgLy8gdGhlIG9yZGVyLCBtYWtlIHN1cmUgdG8gZG8gaXQgdGhlcmUgdG9vIQorICAgICAgICAgICAgICAgIHBhc3RFbnRyaWVzLmFkZChnZXRSZXNvdXJjZXMoKS5nZXRUZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuYXV0b2ZpbGxfdGhpc19mb3JtKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFzdEVudHJpZXMuYWRkQWxsKG1EYXRhYmFzZS5nZXRGb3JtRGF0YShtVXJsLCBtTmFtZSkpOworCiAgICAgICAgICAgICBpZiAocGFzdEVudHJpZXMuc2l6ZSgpID4gMCkgewogICAgICAgICAgICAgICAgIEF1dG9Db21wbGV0ZUFkYXB0ZXIgYWRhcHRlciA9IG5ldwogICAgICAgICAgICAgICAgICAgICAgICAgQXV0b0NvbXBsZXRlQWRhcHRlcihtQ29udGV4dCwgcGFzdEVudHJpZXMpOwpAQCAtNDA0OSw2ICs0MDQ3LDI2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IERSVCBvbiBVSSB0aHJlYWQsIG5lZWQgdG8gcHJveHkgdG8gV2ViQ29yZSB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAaGlkZSBkZWJ1ZyBvbmx5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdXNlTW9ja0RldmljZU9yaWVudGF0aW9uKCkgeworICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVVNFX01PQ0tfREVWSUNFX09SSUVOVEFUSU9OKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgRFJUIG9uIFdlYkNvcmUgdGhyZWFkLgorICAgICAqCisgICAgICogQGhpZGUgZGVidWcgb25seQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgbVdlYlZpZXdDb3JlLnNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihjYW5Qcm92aWRlQWxwaGEsIGFscGhhLCBjYW5Qcm92aWRlQmV0YSwgYmV0YSwKKyAgICAgICAgICAgICAgICBjYW5Qcm92aWRlR2FtbWEsIGdhbW1hKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBEdW1wIHRoZSBWOCBjb3VudGVycyB0byBzdGFuZGFyZCBvdXRwdXQuCiAgICAgICogTm90ZSB0aGF0IHlvdSBuZWVkIGEgYnVpbGQgd2l0aCBWOCBhbmQgV0VCQ09SRV9JTlNUUlVNRU5UQVRJT04gc2V0IHRvCiAgICAgICogdHJ1ZS4gT3RoZXJ3aXNlLCB0aGlzIHdpbGwgZG8gbm90aGluZy4KQEAgLTQwOTksMTQgKzQxMTcsMTYgQEAKICAgICAgICAgLy8gQnViYmxlIHVwIHRoZSBrZXkgZXZlbnQgaWYKICAgICAgICAgLy8gMS4gaXQgaXMgYSBzeXN0ZW0ga2V5OyBvcgogICAgICAgICAvLyAyLiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB3YW50cyB0byBoYW5kbGUgaXQ7CisgICAgICAgIC8vIDMuIHRoZSBhY2Nlc3NpYmlsaXR5IGluamVjdG9yIGlzIHByZXNlbnQgYW5kIHdhbnRzIHRvIGhhbmRsZSBpdDsKICAgICAgICAgaWYgKGV2ZW50LmlzU3lzdGVtKCkKLSAgICAgICAgICAgICAgICB8fCBtQ2FsbGJhY2tQcm94eS51aU92ZXJyaWRlS2V5RXZlbnQoZXZlbnQpKSB7CisgICAgICAgICAgICAgICAgfHwgbUNhbGxiYWNrUHJveHkudWlPdmVycmlkZUtleUV2ZW50KGV2ZW50KQorICAgICAgICAgICAgICAgIHx8IChtQWNjZXNzaWJpbGl0eUluamVjdG9yICE9IG51bGwgJiYgbUFjY2Vzc2liaWxpdHlJbmplY3Rvci5vbktleUV2ZW50KGV2ZW50KSkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfU0hJRlRfTEVGVAogICAgICAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9TSElGVF9SSUdIVCkgewotICAgICAgICAgICAgaWYgKG5hdGl2ZUZvY3VzSXNQbHVnaW4oKSkgeworICAgICAgICAgICAgaWYgKHBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpKSB7CiAgICAgICAgICAgICAgICAgbVNoaWZ0SXNQcmVzc2VkID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5hdGl2ZUN1cnNvcldhbnRzS2V5RXZlbnRzKCkgJiYgIW1TZWxlY3RpbmdUZXh0KSB7CiAgICAgICAgICAgICAgICAgc2V0VXBTZWxlY3QoKTsKQEAgLTQxMjYsOCArNDE0Niw4IEBACiAgICAgICAgIGlmIChrZXlDb2RlID49IEtleUV2ZW50LktFWUNPREVfRFBBRF9VUAogICAgICAgICAgICAgICAgICYmIGtleUNvZGUgPD0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hUKSB7CiAgICAgICAgICAgICBzd2l0Y2hPdXREcmF3SGlzdG9yeSgpOwotICAgICAgICAgICAgaWYgKG5hdGl2ZUZvY3VzSXNQbHVnaW4oKSkgewotICAgICAgICAgICAgICAgIGxldFBsdWdpbkhhbmRsZU5hdktleShrZXlDb2RlLCBldmVudC5nZXRFdmVudFRpbWUoKSwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAocGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCkpIHsKKyAgICAgICAgICAgICAgICBsZXRQYWdlSGFuZGxlTmF2S2V5KGtleUNvZGUsIGV2ZW50LmdldEV2ZW50VGltZSgpLCB0cnVlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtU2VsZWN0aW5nVGV4dCkgewpAQCAtNDI1MSwxMyArNDI3MSwxNiBAQAogICAgICAgICAvLyBCdWJibGUgdXAgdGhlIGtleSBldmVudCBpZgogICAgICAgICAvLyAxLiBpdCBpcyBhIHN5c3RlbSBrZXk7IG9yCiAgICAgICAgIC8vIDIuIHRoZSBob3N0IGFwcGxpY2F0aW9uIHdhbnRzIHRvIGhhbmRsZSBpdDsKLSAgICAgICAgaWYgKGV2ZW50LmlzU3lzdGVtKCkgfHwgbUNhbGxiYWNrUHJveHkudWlPdmVycmlkZUtleUV2ZW50KGV2ZW50KSkgeworICAgICAgICAvLyAzLiB0aGUgYWNjZXNzaWJpbGl0eSBpbmplY3RvciBpcyBwcmVzZW50IGFuZCB3YW50cyB0byBoYW5kbGUgaXQ7CisgICAgICAgIGlmIChldmVudC5pc1N5c3RlbSgpCisgICAgICAgICAgICAgICAgfHwgbUNhbGxiYWNrUHJveHkudWlPdmVycmlkZUtleUV2ZW50KGV2ZW50KQorICAgICAgICAgICAgICAgIHx8IChtQWNjZXNzaWJpbGl0eUluamVjdG9yICE9IG51bGwgJiYgbUFjY2Vzc2liaWxpdHlJbmplY3Rvci5vbktleUV2ZW50KGV2ZW50KSkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfU0hJRlRfTEVGVAogICAgICAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9TSElGVF9SSUdIVCkgewotICAgICAgICAgICAgaWYgKG5hdGl2ZUZvY3VzSXNQbHVnaW4oKSkgeworICAgICAgICAgICAgaWYgKHBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpKSB7CiAgICAgICAgICAgICAgICAgbVNoaWZ0SXNQcmVzc2VkID0gZmFsc2U7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvcHlTZWxlY3Rpb24oKSkgewogICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRvbmUoKTsKQEAgLTQyNjcsOCArNDI5MCw4IEBACiAKICAgICAgICAgaWYgKGtleUNvZGUgPj0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQCiAgICAgICAgICAgICAgICAgJiYga2V5Q29kZSA8PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQpIHsKLSAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKLSAgICAgICAgICAgICAgICBsZXRQbHVnaW5IYW5kbGVOYXZLZXkoa2V5Q29kZSwgZXZlbnQuZ2V0RXZlbnRUaW1lKCksIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChwYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkgeworICAgICAgICAgICAgICAgIGxldFBhZ2VIYW5kbGVOYXZLZXkoa2V5Q29kZSwgZXZlbnQuZ2V0RXZlbnRUaW1lKCksIGZhbHNlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGFsd2F5cyBoYW5kbGUgdGhlIG5hdmlnYXRpb24ga2V5cyBpbiB0aGUgVUkgdGhyZWFkCkBAIC00MzExLDggKzQzMzQsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KHRydWUpOwotICAgICAgICAgICAgbmF0aXZlU2V0Rm9sbG93ZWRMaW5rKHRydWUpOworICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkoKTsKKyAgICAgICAgICAgIG5hdGl2ZVNob3dDdXJzb3JUaW1lZCgpOwogICAgICAgICAgICAgaWYgKCFtQ2FsbGJhY2tQcm94eS51aU92ZXJyaWRlVXJsTG9hZGluZyhuYXRpdmVDdXJzb3JUZXh0KCkpKSB7CiAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkNMSUNLLCBkYXRhLm1GcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUN1cnNvck5vZGVQb2ludGVyKCkpOwpAQCAtNDMzMiwxMCArNDM1NSw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVwU2VsZWN0KCkgeworICAgIHByaXZhdGUgdm9pZCBzZXRVcFNlbGVjdCgpIHsKICAgICAgICAgaWYgKDAgPT0gbU5hdGl2ZUNsYXNzKSByZXR1cm47IC8vIGNsaWVudCBpc24ndCBpbml0aWFsaXplZAogICAgICAgICBpZiAoaW5GdWxsU2NyZWVuTW9kZSgpKSByZXR1cm47CiAgICAgICAgIGlmIChtU2VsZWN0aW5nVGV4dCkgcmV0dXJuOwpAQCAtNDM1Niw2ICs0Mzc2LDE1IEBACiAgICAgICAgICAgICBtU2VsZWN0WSA9IG1TY3JvbGxZICsgZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpIC8gMjsKICAgICAgICAgfQogICAgICAgICBuYXRpdmVIaWRlQ3Vyc29yKCk7CisgICAgICAgIG1TZWxlY3RDYWxsYmFjayA9IG5ldyBTZWxlY3RBY3Rpb25Nb2RlQ2FsbGJhY2soKTsKKyAgICAgICAgbVNlbGVjdENhbGxiYWNrLnNldFdlYlZpZXcodGhpcyk7CisgICAgICAgIFZpZXcgdGl0bGVCYXIgPSBtVGl0bGVCYXI7CisgICAgICAgIC8vIFdlIGRvIG5vdCB3YW50IHRvIHNob3cgdGhlIGVtYmVkZGVkIHRpdGxlIGJhciBkdXJpbmcgZmluZCBvcgorICAgICAgICAvLyBzZWxlY3QsIGJ1dCBrZWVwIHRyYWNrIG9mIGl0IHNvIHRoYXQgaXQgY2FuIGJlIHJlcGxhY2VkIHdoZW4gdGhlCisgICAgICAgIC8vIG1vZGUgaXMgZXhpdGVkLgorICAgICAgICBzZXRFbWJlZGRlZFRpdGxlQmFyKG51bGwpOworICAgICAgICBtU2VsZWN0Q2FsbGJhY2suc2V0VGl0bGVCYXIodGl0bGVCYXIpOworICAgICAgICBzdGFydEFjdGlvbk1vZGUobVNlbGVjdENhbGxiYWNrKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQzNjcsOSArNDM5Niw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KKyAgICAgKiBTZWxlY3QgYWxsIG9mIHRoZSB0ZXh0IGluIHRoaXMgV2ViVmlldy4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3RBbGwoKSB7CisgICAgdm9pZCBzZWxlY3RBbGwoKSB7CiAgICAgICAgIGlmICgwID09IG1OYXRpdmVDbGFzcykgcmV0dXJuOyAvLyBjbGllbnQgaXNuJ3QgaW5pdGlhbGl6ZWQKICAgICAgICAgaWYgKGluRnVsbFNjcmVlbk1vZGUoKSkgcmV0dXJuOwogICAgICAgICBpZiAoIW1TZWxlY3RpbmdUZXh0KSBzZXRVcFNlbGVjdCgpOwpAQCAtNDM4MCwzNiArNDQwOSwyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwuCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIHNlbGVjdGlvbiBoYXMgYmVlbiByZW1vdmVkLgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdERpYWxvZ0lzVXAoKSB7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0aW5nVGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVNlbGVjdERpYWxvZ0Rpc21pc3NlZCgpIHsKLSAgICAgICAgbVNlbGVjdGluZ1RleHQgPSBmYWxzZTsKLSAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lVXBkYXRlUGljdHVyZShtV2ViVmlld0NvcmUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uRG9uZSgpIHsKKyAgICB2b2lkIHNlbGVjdGlvbkRvbmUoKSB7CiAgICAgICAgIGlmIChtU2VsZWN0aW5nVGV4dCkgewotICAgICAgICAgICAgV2ViQ2hyb21lQ2xpZW50IGNsaWVudCA9IGdldFdlYkNocm9tZUNsaWVudCgpOwotICAgICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSBjbGllbnQub25TZWxlY3Rpb25Eb25lKHRoaXMpOworICAgICAgICAgICAgbVNlbGVjdGluZ1RleHQgPSBmYWxzZTsKKyAgICAgICAgICAgIC8vIGZpbmlzaCBpcyBpZGVtcG90ZW50LCBzbyB0aGlzIGlzIGZpbmUgZXZlbiBpZiBzZWxlY3Rpb25Eb25lIHdhcworICAgICAgICAgICAgLy8gY2FsbGVkIGJ5IG1TZWxlY3RDYWxsYmFjay5vbkRlc3Ryb3lBY3Rpb25Nb2RlCisgICAgICAgICAgICBtU2VsZWN0Q2FsbGJhY2suZmluaXNoKCk7CisgICAgICAgICAgICBtU2VsZWN0Q2FsbGJhY2sgPSBudWxsOworICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lVXBkYXRlUGljdHVyZShtV2ViVmlld0NvcmUpOwogICAgICAgICAgICAgaW52YWxpZGF0ZSgpOyAvLyByZWRyYXcgd2l0aG91dCBzZWxlY3Rpb24KLSAgICAgICAgICAgIG5vdGlmeVNlbGVjdERpYWxvZ0Rpc21pc3NlZCgpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KKyAgICAgKiBDb3B5IHRoZSBzZWxlY3Rpb24gdG8gdGhlIGNsaXBib2FyZAogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvcHlTZWxlY3Rpb24oKSB7CisgICAgYm9vbGVhbiBjb3B5U2VsZWN0aW9uKCkgewogICAgICAgICBib29sZWFuIGNvcGllZFNvbWV0aGluZyA9IGZhbHNlOwogICAgICAgICBTdHJpbmcgc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgIGlmIChzZWxlY3Rpb24gIT0gIiIpIHsKQEAgLTQ0MjAsMjIgKzQ0MzcsMTggQEAKICAgICAgICAgICAgICAgICAgICAgLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy50ZXh0X2NvcGllZAogICAgICAgICAgICAgICAgICAgICAsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOwogICAgICAgICAgICAgY29waWVkU29tZXRoaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSUNsaXBib2FyZCBjbGlwID0gSUNsaXBib2FyZC5TdHViLmFzSW50ZXJmYWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgiY2xpcGJvYXJkIikpOwotICAgICAgICAgICAgICAgIGNsaXAuc2V0Q2xpcGJvYXJkVGV4dChzZWxlY3Rpb24pOwotICAgICAgICAgICAgfSBjYXRjaCAoYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgIkNsaXBib2FyZCBmYWlsZWQiLCBlKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENsaXBib2FyZE1hbmFnZXIgY20gPSAoQ2xpcGJvYXJkTWFuYWdlcilnZXRDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DTElQQk9BUkRfU0VSVklDRSk7CisgICAgICAgICAgICBjbS5zZXRUZXh0KHNlbGVjdGlvbik7CiAgICAgICAgIH0KICAgICAgICAgaW52YWxpZGF0ZSgpOyAvLyByZW1vdmUgc2VsZWN0aW9uIHJlZ2lvbiBhbmQgcG9pbnRlcgogICAgICAgICByZXR1cm4gY29waWVkU29tZXRoaW5nOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwuCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IGhpZ2hsaWdodGVkIHRleHQgYXMgYSBzdHJpbmcuCiAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3Rpb24oKSB7CisgICAgU3RyaW5nIGdldFNlbGVjdGlvbigpIHsKICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyA9PSAwKSByZXR1cm4gIiI7CiAgICAgICAgIHJldHVybiBuYXRpdmVHZXRTZWxlY3Rpb24oKTsKICAgICB9CkBAIC00NDQ5LDExICs0NDYyLDIxIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CiAgICAgICAgIGNsZWFySGVscGVycygpOwotICAgICAgICBkaXNtaXNzWm9vbUNvbnRyb2woKTsKKyAgICAgICAgbVpvb21NYW5hZ2VyLmRpc21pc3Nab29tUGlja2VyKCk7CiAgICAgICAgIGlmIChoYXNXaW5kb3dGb2N1cygpKSBzZXRBY3RpdmUoZmFsc2UpOwogICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uVmlzaWJpbGl0eUNoYW5nZWQoVmlldyBjaGFuZ2VkVmlldywgaW50IHZpc2liaWxpdHkpIHsKKyAgICAgICAgc3VwZXIub25WaXNpYmlsaXR5Q2hhbmdlZChjaGFuZ2VkVmlldywgdmlzaWJpbGl0eSk7CisgICAgICAgIC8vIFRoZSB6b29tTWFuYWdlciBtYXkgYmUgbnVsbCBpZiB0aGUgd2VidmlldyBpcyBjcmVhdGVkIGZyb20gWE1MIHRoYXQKKyAgICAgICAgLy8gc3BlY2lmaWVzIHRoZSB2aWV3J3MgdmlzaWJpbGl0eSBwYXJhbSBhcyBub3QgdmlzaWJsZSAoc2VlIGh0dHA6Ly9iLzI3OTQ4NDEpCisgICAgICAgIGlmICh2aXNpYmlsaXR5ICE9IFZpZXcuVklTSUJMRSAmJiBtWm9vbU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmRpc21pc3Nab29tUGlja2VyKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBAZGVwcmVjYXRlZCBXZWJWaWV3IG5vIGxvbmdlciBuZWVkcyB0byBpbXBsZW1lbnQKICAgICAgKiBWaWV3R3JvdXAuT25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lci4gIFRoaXMgbWV0aG9kIGRvZXMgbm90aGluZyBub3cuCkBAIC00NDgzLDMyICs0NTA2LDMwIEBACiAgICAgICAgICAgICAgICAgLy8gSWYgb3VyIHdpbmRvdyByZWdhaW5lZCBmb2N1cywgYW5kIHdlIGhhdmUgZm9jdXMsIHRoZW4gYmVnaW4KICAgICAgICAgICAgICAgICAvLyBkcmF3aW5nIHRoZSBjdXJzb3IgcmluZwogICAgICAgICAgICAgICAgIG1EcmF3Q3Vyc29yUmluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgc2V0Rm9jdXNDb250cm9sbGVyQWN0aXZlKHRydWUpOwogICAgICAgICAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBuYXRpdmVSZWNvcmRCdXR0b25zKHRydWUsIGZhbHNlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlNFVF9BQ1RJVkUsIDEsIDApOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBJZiBvdXIgd2luZG93IGdhaW5lZCBmb2N1cywgYnV0IHdlIGRvIG5vdCBoYXZlIGl0LCBkbyBub3QKLSAgICAgICAgICAgICAgICAvLyBkcmF3IHRoZSBjdXJzb3IgcmluZy4KLSAgICAgICAgICAgICAgICBtRHJhd0N1cnNvclJpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoIWluRWRpdGluZ01vZGUoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiBvdXIgd2luZG93IGdhaW5lZCBmb2N1cywgYnV0IHdlIGRvIG5vdCBoYXZlIGl0LCBkbyBub3QKKyAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyB0aGUgY3Vyc29yIHJpbmcuCisgICAgICAgICAgICAgICAgICAgIG1EcmF3Q3Vyc29yUmluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBzZXRGb2N1c0NvbnRyb2xsZXJBY3RpdmUoZmFsc2UpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBXZSBkbyBub3QgY2FsbCBuYXRpdmVSZWNvcmRCdXR0b25zIGhlcmUgYmVjYXVzZSB3ZSBhc3N1bWUKICAgICAgICAgICAgICAgICAvLyB0aGF0IHdoZW4gd2UgbG9zdCBmb2N1cywgb3Igd2luZG93IGZvY3VzLCBpdCBnb3QgY2FsbGVkIHdpdGgKICAgICAgICAgICAgICAgICAvLyBmYWxzZSBmb3IgdGhlIGZpcnN0IHBhcmFtZXRlcgogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1XZWJWaWV3Q29yZSAhPSBudWxsICYmIGdldFNldHRpbmdzKCkuZ2V0QnVpbHRJblpvb21Db250cm9scygpCi0gICAgICAgICAgICAgICAgICAgICYmIChtWm9vbUJ1dHRvbnNDb250cm9sbGVyID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbVpvb21CdXR0b25zQ29udHJvbGxlci5pc1Zpc2libGUoKSkpIHsKKyAgICAgICAgICAgIGlmICghbVpvb21NYW5hZ2VyLmlzWm9vbVBpY2tlclZpc2libGUoKSkgewogICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogVGhlIHpvb20gY29udHJvbHMgY29tZSBpbiB0aGVpciBvd24gd2luZG93LCBzbyBvdXIgd2luZG93Ci0gICAgICAgICAgICAgICAgICogbG9zZXMgZm9jdXMuIE91ciBwb2xpY3kgaXMgdG8gbm90IGRyYXcgdGhlIGN1cnNvciByaW5nIGlmCi0gICAgICAgICAgICAgICAgICogb3VyIHdpbmRvdyBpcyBub3QgZm9jdXNlZCwgYnV0IHRoaXMgaXMgYW4gZXhjZXB0aW9uIHNpbmNlCisgICAgICAgICAgICAgICAgICogVGhlIGV4dGVybmFsIHpvb20gY29udHJvbHMgY29tZSBpbiB0aGVpciBvd24gd2luZG93LCBzbyBvdXIKKyAgICAgICAgICAgICAgICAgKiB3aW5kb3cgbG9zZXMgZm9jdXMuIE91ciBwb2xpY3kgaXMgdG8gbm90IGRyYXcgdGhlIGN1cnNvciByaW5nCisgICAgICAgICAgICAgICAgICogaWYgb3VyIHdpbmRvdyBpcyBub3QgZm9jdXNlZCwgYnV0IHRoaXMgaXMgYW4gZXhjZXB0aW9uIHNpbmNlCiAgICAgICAgICAgICAgICAgICogdGhlIHVzZXIgY2FuIHN0aWxsIG5hdmlnYXRlIHRoZSB3ZWIgcGFnZSB3aXRoIHRoZSB6b29tCiAgICAgICAgICAgICAgICAgICogY29udHJvbHMgc2hvd2luZy4KICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAvLyBJZiBvdXIgd2luZG93IGhhcyBsb3N0IGZvY3VzLCBzdG9wIGRyYXdpbmcgdGhlIGN1cnNvciByaW5nCiAgICAgICAgICAgICAgICAgbURyYXdDdXJzb3JSaW5nID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtR290S2V5RG93biA9IGZhbHNlOwpAQCAtNDUxOCw3ICs0NTM5LDcgQEAKICAgICAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCkgewogICAgICAgICAgICAgICAgIG5hdGl2ZVJlY29yZEJ1dHRvbnMoZmFsc2UsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldEZvY3VzQ29udHJvbGxlckluYWN0aXZlKCk7CisgICAgICAgICAgICBzZXRGb2N1c0NvbnRyb2xsZXJBY3RpdmUoZmFsc2UpOwogICAgICAgICB9CiAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICB9CkBAIC00NTQyLDExICs0NTYzLDkgQEAKICAgICAgKiBub3QgZHJhdyB0aGUgYmxpbmtpbmcgY3Vyc29yLiAgSXQgZ2V0cyBzZXQgdG8gImFjdGl2ZSIgdG8gZHJhdyB0aGUgY3Vyc29yCiAgICAgICogaW4gV2ViVmlld0NvcmUuY3BwLCB3aGVuIHRoZSBXZWJDb3JlIHRocmVhZCByZWNlaXZlcyBrZXkgZXZlbnRzL2NsaWNrcy4KICAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHZvaWQgc2V0Rm9jdXNDb250cm9sbGVySW5hY3RpdmUoKSB7Ci0gICAgICAgIC8vIERvIG5vdCBuZWVkIHRvIGFsc28gY2hlY2sgd2hldGhlciBtV2ViVmlld0NvcmUgaXMgbnVsbCwgYmVjYXVzZQotICAgICAgICAvLyBtTmF0aXZlQ2xhc3MgaXMgb25seSBzZXQgaWYgbVdlYlZpZXdDb3JlIGlzIG5vbiBudWxsCi0gICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgPT0gMCkgcmV0dXJuOwotICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU0VUX0FDVElWRSwgMCwgMCk7CisgICAgLyogcGFja2FnZSAqLyB2b2lkIHNldEZvY3VzQ29udHJvbGxlckFjdGl2ZShib29sZWFuIGFjdGl2ZSkgeworICAgICAgICBpZiAobVdlYlZpZXdDb3JlID09IG51bGwpIHJldHVybjsKKyAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlNFVF9BQ1RJVkUsIGFjdGl2ZSA/IDEgOiAwLCAwKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTQ1NjMsNiArNDU4Miw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVJlY29yZEJ1dHRvbnModHJ1ZSwgZmFsc2UsIHRydWUpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXRGb2N1c0NvbnRyb2xsZXJBY3RpdmUodHJ1ZSk7CiAgICAgICAgICAgICAvL30gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gVGhlIFdlYlZpZXcgaGFzIGdhaW5lZCBmb2N1cyB3aGlsZSB3ZSBkbyBub3QgaGF2ZQogICAgICAgICAgICAgICAgIC8vIHdpbmRvd2ZvY3VzLiAgV2hlbiBvdXIgd2luZG93IGxvc3QgZm9jdXMsIHdlIHNob3VsZCBoYXZlCkBAIC00NTc2LDcgKzQ1OTYsNyBAQAogICAgICAgICAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBuYXRpdmVSZWNvcmRCdXR0b25zKGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldEZvY3VzQ29udHJvbGxlckluYWN0aXZlKCk7CisgICAgICAgICAgICAgICAgc2V0Rm9jdXNDb250cm9sbGVyQWN0aXZlKGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Hb3RLZXlEb3duID0gZmFsc2U7CiAgICAgICAgIH0KQEAgLTQ1OTcsOTQgKzQ2MTcsMzUgQEAKICAgICAgICAgICAgIC8vIHN5c3RlbSB3b24ndCBjYWxsIG9uU2l6ZUNoYW5nZWQgaWYgdGhlIGRpbWVuc2lvbiBpcyBub3QgY2hhbmdlZC4KICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byBjYWxsIHNlbmRWaWV3U2l6ZVpvb20oKSBleHBsaWNpdGx5IHRvCiAgICAgICAgICAgICAvLyBub3RpZnkgdGhlIFdlYktpdCBhYm91dCB0aGUgbmV3IGRpbWVuc2lvbnMuCi0gICAgICAgICAgICBzZW5kVmlld1NpemVab29tKCk7CisgICAgICAgICAgICBzZW5kVmlld1NpemVab29tKGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gY2hhbmdlZDsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQb3N0U2NhbGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIGZpbmFsIFdlYlZpZXcgbVdlYlZpZXc7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gbVVwZGF0ZVRleHRXcmFwOwotCi0gICAgICAgIHB1YmxpYyBQb3N0U2NhbGUoV2ViVmlldyB3ZWJWaWV3LCBib29sZWFuIHVwZGF0ZVRleHRXcmFwKSB7Ci0gICAgICAgICAgICBtV2ViVmlldyA9IHdlYlZpZXc7Ci0gICAgICAgICAgICBtVXBkYXRlVGV4dFdyYXAgPSB1cGRhdGVUZXh0V3JhcDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGlmIChtV2ViVmlldy5tV2ViVmlld0NvcmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGFsd2F5cyBmb3JjZSwgaW4gY2FzZSBvdXIgaGVpZ2h0IGNoYW5nZWQsIGluIHdoaWNoIGNhc2Ugd2UKLSAgICAgICAgICAgICAgICAvLyBzdGlsbCB3YW50IHRvIHNlbmQgdGhlIG5vdGlmaWNhdGlvbiBvdmVyIHRvIHdlYmtpdC4KLSAgICAgICAgICAgICAgICBtV2ViVmlldy5zZXROZXdab29tU2NhbGUobVdlYlZpZXcubUFjdHVhbFNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZVRleHRXcmFwLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHpvb20gYnV0dG9ucyBhcyB0aGUgc2NhbGUgY2FuIGJlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICBpZiAobVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcudXBkYXRlWm9vbUJ1dHRvbnNFbmFibGVkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TaXplQ2hhbmdlZChpbnQgdywgaW50IGgsIGludCBvdywgaW50IG9oKSB7CiAgICAgICAgIHN1cGVyLm9uU2l6ZUNoYW5nZWQodywgaCwgb3csIG9oKTsKLSAgICAgICAgLy8gQ2VudGVyIHpvb21pbmcgdG8gdGhlIGNlbnRlciBvZiB0aGUgc2NyZWVuLgotICAgICAgICBpZiAobVpvb21TY2FsZSA9PSAwKSB7IC8vIHVubGVzcyB3ZSdyZSBhbHJlYWR5IHpvb21pbmcKLSAgICAgICAgICAgIC8vIFRvIGFuY2hvciBhdCB0b3AgbGVmdCBjb3JuZXIuCi0gICAgICAgICAgICBtWm9vbUNlbnRlclggPSAwOwotICAgICAgICAgICAgbVpvb21DZW50ZXJZID0gZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0KCk7Ci0gICAgICAgICAgICBtQW5jaG9yWCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1TY3JvbGxYKTsKLSAgICAgICAgICAgIG1BbmNob3JZID0gdmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVNjcm9sbFkpOwotICAgICAgICB9CiAKICAgICAgICAgLy8gYWRqdXN0IHRoZSBtYXggdmlld3BvcnQgd2lkdGggZGVwZW5kaW5nIG9uIHRoZSB2aWV3IGRpbWVuc2lvbnMuIFRoaXMKICAgICAgICAgLy8gaXMgdG8gZW5zdXJlIHRoZSBzY2FsaW5nIGlzIG5vdCBnb2luZyBpbnNhbmUuIFNvIGRvIG5vdCBzaHJpbmsgaXQgaWYKICAgICAgICAgLy8gdGhlIHZpZXcgc2l6ZSBpcyB0ZW1wb3JhcmlseSBzbWFsbGVyLCBlLmcuIHdoZW4gc29mdCBrZXlib2FyZCBpcyB1cC4KLSAgICAgICAgaW50IG5ld01heFZpZXdwb3J0V2lkdGggPSAoaW50KSAoTWF0aC5tYXgodywgaCkgLyBERUZBVUxUX01JTl9aT09NX1NDQUxFKTsKKyAgICAgICAgaW50IG5ld01heFZpZXdwb3J0V2lkdGggPSAoaW50KSAoTWF0aC5tYXgodywgaCkgLyBtWm9vbU1hbmFnZXIuZ2V0RGVmYXVsdE1pblpvb21TY2FsZSgpKTsKICAgICAgICAgaWYgKG5ld01heFZpZXdwb3J0V2lkdGggPiBzTWF4Vmlld3BvcnRXaWR0aCkgewogICAgICAgICAgICAgc01heFZpZXdwb3J0V2lkdGggPSBuZXdNYXhWaWV3cG9ydFdpZHRoOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gdXBkYXRlIG1NaW5ab29tU2NhbGUgaWYgdGhlIG1pbmltdW0gem9vbSBzY2FsZSBpcyBub3QgZml4ZWQKLSAgICAgICAgaWYgKCFtTWluWm9vbVNjYWxlRml4ZWQpIHsKLSAgICAgICAgICAgIC8vIHdoZW4gY2hhbmdlIGZyb20gbmFycm93IHNjcmVlbiB0byB3aWRlIHNjcmVlbiwgdGhlIG5ldyB2aWV3V2lkdGgKLSAgICAgICAgICAgIC8vIGNhbiBiZSB3aWRlciB0aGFuIHRoZSBvbGQgY29udGVudCB3aWR0aC4gV2UgbGltaXQgdGhlIG1pbmltdW0KLSAgICAgICAgICAgIC8vIHNjYWxlIHRvIDEuMGYuIFRoZSBwcm9wZXIgbWluaW11bSBzY2FsZSB3aWxsIGJlIGNhbGN1bGF0ZWQgd2hlbgotICAgICAgICAgICAgLy8gdGhlIG5ldyBwaWN0dXJlIHNob3dzIHVwLgotICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IE1hdGgubWluKDEuMGYsIChmbG9hdCkgZ2V0Vmlld1dpZHRoKCkKLSAgICAgICAgICAgICAgICAgICAgLyAobURyYXdIaXN0b3J5ID8gbUhpc3RvcnlQaWN0dXJlLmdldFdpZHRoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1ab29tT3ZlcnZpZXdXaWR0aCkpOwotICAgICAgICAgICAgaWYgKG1Jbml0aWFsU2NhbGVJblBlcmNlbnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gbGltaXQgdGhlIG1pblpvb21TY2FsZSB0byB0aGUgaW5pdGlhbFNjYWxlIGlmIGl0IGlzIHNldAotICAgICAgICAgICAgICAgIGZsb2F0IGluaXRpYWxTY2FsZSA9IG1Jbml0aWFsU2NhbGVJblBlcmNlbnQgLyAxMDAuMGY7Ci0gICAgICAgICAgICAgICAgaWYgKG1NaW5ab29tU2NhbGUgPiBpbml0aWFsU2NhbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IGluaXRpYWxTY2FsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBkaXNtaXNzWm9vbUNvbnRyb2woKTsKLQotICAgICAgICAvLyBvblNpemVDaGFuZ2VkKCkgaXMgY2FsbGVkIGR1cmluZyBXZWJWaWV3IGxheW91dC4gQW5kIGFueQotICAgICAgICAvLyByZXF1ZXN0TGF5b3V0KCkgaXMgYmxvY2tlZCBkdXJpbmcgbGF5b3V0LiBBcyBzZXROZXdab29tU2NhbGUoKSB3aWxsCi0gICAgICAgIC8vIGNhbGwgaXRzIGNoaWxkIFZpZXcgdG8gcmVwb3NpdGlvbiBpdHNlbGYgdGhyb3VnaCBWaWV3TWFuYWdlcidzCi0gICAgICAgIC8vIHNjYWxlQWxsKCksIHdlIG5lZWQgdG8gcG9zdCBhIFJ1bm5hYmxlIHRvIGVuc3VyZSByZXF1ZXN0TGF5b3V0KCkuCi0gICAgICAgIC8vIDxiLz4KLSAgICAgICAgLy8gb25seSB1cGRhdGUgdGhlIHRleHQgd3JhcCBzY2FsZSBpZiB3aWR0aCBjaGFuZ2VkLgotICAgICAgICBwb3N0KG5ldyBQb3N0U2NhbGUodGhpcywgdyAhPSBvdykpOworICAgICAgICBtWm9vbU1hbmFnZXIub25TaXplQ2hhbmdlZCh3LCBoLCBvdywgb2gpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uU2Nyb2xsQ2hhbmdlZChpbnQgbCwgaW50IHQsIGludCBvbGRsLCBpbnQgb2xkdCkgewogICAgICAgICBzdXBlci5vblNjcm9sbENoYW5nZWQobCwgdCwgb2xkbCwgb2xkdCk7Ci0gICAgICAgIGlmICghbUluT3ZlclNjcm9sbE1vZGUpIHsKLSAgICAgICAgICAgIHNlbmRPdXJWaXNpYmxlUmVjdCgpOwotICAgICAgICAgICAgLy8gdXBkYXRlIFdlYktpdCBpZiB2aXNpYmxlIHRpdGxlIGJhciBoZWlnaHQgY2hhbmdlZC4gVGhlIGxvZ2ljIGlzIHNhbWUKLSAgICAgICAgICAgIC8vIGFzIGdldFZpc2libGVUaXRsZUhlaWdodC4KLSAgICAgICAgICAgIGludCB0aXRsZUhlaWdodCA9IGdldFRpdGxlSGVpZ2h0KCk7Ci0gICAgICAgICAgICBpZiAoTWF0aC5tYXgodGl0bGVIZWlnaHQgLSB0LCAwKSAhPSBNYXRoLm1heCh0aXRsZUhlaWdodCAtIG9sZHQsIDApKSB7Ci0gICAgICAgICAgICAgICAgc2VuZFZpZXdTaXplWm9vbSgpOwotICAgICAgICAgICAgfQorICAgICAgICBzZW5kT3VyVmlzaWJsZVJlY3QoKTsKKyAgICAgICAgLy8gdXBkYXRlIFdlYktpdCBpZiB2aXNpYmxlIHRpdGxlIGJhciBoZWlnaHQgY2hhbmdlZC4gVGhlIGxvZ2ljIGlzIHNhbWUKKyAgICAgICAgLy8gYXMgZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0LgorICAgICAgICBpbnQgdGl0bGVIZWlnaHQgPSBnZXRUaXRsZUhlaWdodCgpOworICAgICAgICBpZiAoTWF0aC5tYXgodGl0bGVIZWlnaHQgLSB0LCAwKSAhPSBNYXRoLm1heCh0aXRsZUhlaWdodCAtIG9sZHQsIDApKSB7CisgICAgICAgICAgICBzZW5kVmlld1NpemVab29tKGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDY5Miw5ICs0NjUzLDExIEBACiAgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hLZXlFdmVudChLZXlFdmVudCBldmVudCkgewogICAgICAgICBib29sZWFuIGRpc3BhdGNoID0gdHJ1ZTsKIAotICAgICAgICAvLyBUZXh0ZmllbGRzIGFuZCBwbHVnaW5zIG5lZWQgdG8gcmVjZWl2ZSB0aGUgc2hpZnQgdXAga2V5IGV2ZW4gaWYKLSAgICAgICAgLy8gYW5vdGhlciBrZXkgd2FzIHJlbGVhc2VkIHdoaWxlIHRoZSBzaGlmdCBrZXkgd2FzIGhlbGQgZG93bi4KLSAgICAgICAgaWYgKCFpbkVkaXRpbmdNb2RlKCkgJiYgKG1OYXRpdmVDbGFzcyA9PSAwIHx8ICFuYXRpdmVGb2N1c0lzUGx1Z2luKCkpKSB7CisgICAgICAgIC8vIFRleHRmaWVsZHMsIHBsdWdpbnMsIGFuZCBjb250ZW50RWRpdGFibGUgbm9kZXMgbmVlZCB0byByZWNlaXZlIHRoZQorICAgICAgICAvLyBzaGlmdCB1cCBrZXkgZXZlbiBpZiBhbm90aGVyIGtleSB3YXMgcmVsZWFzZWQgd2hpbGUgdGhlIHNoaWZ0IGtleQorICAgICAgICAvLyB3YXMgaGVsZCBkb3duLgorICAgICAgICBpZiAoIWluRWRpdGluZ01vZGUoKSAmJiAobU5hdGl2ZUNsYXNzID09IDAKKyAgICAgICAgICAgICAgICB8fCAhbmF0aXZlUGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCkpKSB7CiAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX0RPV04pIHsKICAgICAgICAgICAgICAgICBtR290S2V5RG93biA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNDc1NCw3ICs0NzE3LDcgQEAKICAgICAgICAgcHVibGljIERyYWdUcmFja2VySGFuZGxlcihmbG9hdCB4LCBmbG9hdCB5LCBEcmFnVHJhY2tlciBwcm94eSkgewogICAgICAgICAgICAgbVByb3h5ID0gcHJveHk7CiAKLSAgICAgICAgICAgIGludCBkb2NCb3R0b20gPSBjb21wdXRlUmVhbFZlcnRpY2FsU2Nyb2xsUmFuZ2UoKSArIGdldFRpdGxlSGVpZ2h0KCk7CisgICAgICAgICAgICBpbnQgZG9jQm90dG9tID0gY29tcHV0ZVZlcnRpY2FsU2Nyb2xsUmFuZ2UoKSArIGdldFRpdGxlSGVpZ2h0KCk7CiAgICAgICAgICAgICBpbnQgdmlld1RvcCA9IGdldFNjcm9sbFkoKTsKICAgICAgICAgICAgIGludCB2aWV3Qm90dG9tID0gdmlld1RvcCArIGdldEhlaWdodCgpOwogCkBAIC00NzY3LDcgKzQ3MzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICIgdXAvZG93bj0gIiArIG1NaW5EWSArICIgIiArIG1NYXhEWSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGludCBkb2NSaWdodCA9IGNvbXB1dGVSZWFsSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCk7CisgICAgICAgICAgICBpbnQgZG9jUmlnaHQgPSBjb21wdXRlSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCk7CiAgICAgICAgICAgICBpbnQgdmlld0xlZnQgPSBnZXRTY3JvbGxYKCk7CiAgICAgICAgICAgICBpbnQgdmlld1JpZ2h0ID0gdmlld0xlZnQgKyBnZXRXaWR0aCgpOwogICAgICAgICAgICAgbVN0YXJ0WCA9IHg7CkBAIC00OTI4LDgxICs0ODkxLDYgQEAKICAgICBwcml2YXRlIERyYWdUcmFja2VyIG1EcmFnVHJhY2tlcjsKICAgICBwcml2YXRlIERyYWdUcmFja2VySGFuZGxlciBtRHJhZ1RyYWNrZXJIYW5kbGVyOwogCi0gICAgcHJpdmF0ZSBjbGFzcyBTY2FsZURldGVjdG9yTGlzdGVuZXIgaW1wbGVtZW50cwotICAgICAgICAgICAgU2NhbGVHZXN0dXJlRGV0ZWN0b3IuT25TY2FsZUdlc3R1cmVMaXN0ZW5lciB7Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25TY2FsZUJlZ2luKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7Ci0gICAgICAgICAgICAvLyBjYW5jZWwgdGhlIHNpbmdsZSB0b3VjaCBoYW5kbGluZwotICAgICAgICAgICAgY2FuY2VsVG91Y2goKTsKLSAgICAgICAgICAgIGRpc21pc3Nab29tQ29udHJvbCgpOwotICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHpvb20gb3ZlcnZpZXcgbW9kZSBzbyB0aGF0IHRoZSBwYWdlIHdvbid0IGF1dG8gZ3JvdwotICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICAvLyBJZiBpdCBpcyBpbiBwYXNzd29yZCBtb2RlLCB0dXJuIGl0IG9mZiBzbyBpdCBkb2VzIG5vdCBkcmF3Ci0gICAgICAgICAgICAvLyBtaXNwbGFjZWQuCi0gICAgICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpICYmIG5hdGl2ZUZvY3VzQ2FuZGlkYXRlSXNQYXNzd29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgbVdlYlRleHRWaWV3LnNldEluUGFzc3dvcmQoZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtVmlld01hbmFnZXIuc3RhcnRab29tKCk7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TY2FsZUVuZChTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvcikgewotICAgICAgICAgICAgaWYgKG1QcmV2aWV3Wm9vbU9ubHkpIHsKLSAgICAgICAgICAgICAgICBtUHJldmlld1pvb21Pbmx5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbUFuY2hvclggPSB2aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtU2Nyb2xsWCk7Ci0gICAgICAgICAgICAgICAgbUFuY2hvclkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtWm9vbUNlbnRlclkgKyBtU2Nyb2xsWSk7Ci0gICAgICAgICAgICAgICAgLy8gZG9uJ3QgcmVmbG93IHdoZW4gem9vbSBpbjsgd2hlbiB6b29tIG91dCwgZG8gcmVmbG93IGlmIHRoZQotICAgICAgICAgICAgICAgIC8vIG5ldyBzY2FsZSBpcyBhbG1vc3QgbWluaW11bSBzY2FsZTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHJlZmxvd05vdyA9IChtQWN0dWFsU2NhbGUgLSBtTWluWm9vbVNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICA8PSBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgobUFjdHVhbFNjYWxlIDw9IDAuOCAqIG1UZXh0V3JhcFNjYWxlKSk7Ci0gICAgICAgICAgICAgICAgLy8gZm9yY2Ugem9vbSBhZnRlciBtUHJldmlld1pvb21Pbmx5IGlzIHNldCB0byBmYWxzZSBzbyB0aGF0IHRoZQotICAgICAgICAgICAgICAgIC8vIG5ldyB2aWV3IHNpemUgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIFdlYktpdAotICAgICAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShtQWN0dWFsU2NhbGUsIHJlZmxvd05vdywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgLy8gY2FsbCBpbnZhbGlkYXRlKCkgdG8gZHJhdyB3aXRob3V0IHpvb20gZmlsdGVyCi0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gYWRqdXN0IHRoZSBlZGl0IHRleHQgdmlldyBpZiBuZWVkZWQKLSAgICAgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkgJiYgZGlkVXBkYXRlVGV4dFZpZXdCb3VuZHMoZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgICYmIG5hdGl2ZUZvY3VzQ2FuZGlkYXRlSXNQYXNzd29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgaXQgaXMgYSBwYXNzd29yZCBmaWVsZCwgc3RhcnQgZHJhd2luZyB0aGUKLSAgICAgICAgICAgICAgICAvLyBXZWJUZXh0VmlldyBvbmNlIGFnYWluLgotICAgICAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5zZXRJblBhc3N3b3JkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gc3RhcnQgYSBkcmFnLCBUT1VDSF9QSU5DSF9EUkFHLCBjYW4ndCB1c2UgVE9VQ0hfSU5JVF9NT0RFIGFzIGl0Ci0gICAgICAgICAgICAvLyBtYXkgdHJpZ2dlciB0aGUgdW53YW50ZWQgY2xpY2ssIGNhbid0IHVzZSBUT1VDSF9EUkFHX01PREUgYXMgaXQKLSAgICAgICAgICAgIC8vIG1heSB0cmlnZ2VyIHRoZSB1bndhbnRlZCBmbGluZy4KLSAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9QSU5DSF9EUkFHOwotICAgICAgICAgICAgbUNvbmZpcm1Nb3ZlID0gdHJ1ZTsKLSAgICAgICAgICAgIHN0YXJ0VG91Y2goZGV0ZWN0b3IuZ2V0Rm9jdXNYKCksIGRldGVjdG9yLmdldEZvY3VzWSgpLAotICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoVGltZSk7Ci0KLSAgICAgICAgICAgIG1WaWV3TWFuYWdlci5lbmRab29tKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblNjYWxlKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7Ci0gICAgICAgICAgICBmbG9hdCBzY2FsZSA9IChmbG9hdCkgKE1hdGgucm91bmQoZGV0ZWN0b3IuZ2V0U2NhbGVGYWN0b3IoKQotICAgICAgICAgICAgICAgICAgICAqIG1BY3R1YWxTY2FsZSAqIDEwMCkgLyAxMDAuMCk7Ci0gICAgICAgICAgICBpZiAoTWF0aC5hYnMoc2NhbGUgLSBtQWN0dWFsU2NhbGUpID49IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgbVByZXZpZXdab29tT25seSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy8gbGltaXQgdGhlIHNjYWxlIGNoYW5nZSBwZXIgc3RlcAotICAgICAgICAgICAgICAgIGlmIChzY2FsZSA+IG1BY3R1YWxTY2FsZSkgewotICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IE1hdGgubWluKHNjYWxlLCBtQWN0dWFsU2NhbGUgKiAxLjI1Zik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBNYXRoLm1heChzY2FsZSwgbUFjdHVhbFNjYWxlICogMC44Zik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IGRldGVjdG9yLmdldEZvY3VzWCgpOwotICAgICAgICAgICAgICAgIG1ab29tQ2VudGVyWSA9IGRldGVjdG9yLmdldEZvY3VzWSgpOwotICAgICAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShzY2FsZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gaGl0Rm9jdXNlZFBsdWdpbihpbnQgY29udGVudFgsIGludCBjb250ZW50WSkgewogICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgewogICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAibmF0aXZlRm9jdXNJc1BsdWdpbigpPSIgKyBuYXRpdmVGb2N1c0lzUGx1Z2luKCkpOwpAQCAtNTAyNCw2ICs0OTEyLDQ4IEBACiAgICAgICAgIHJldHVybiBtRnVsbFNjcmVlbkhvbGRlciAhPSBudWxsOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBkaXNtaXNzRnVsbFNjcmVlbk1vZGUoKSB7CisgICAgICAgIGlmIChpbkZ1bGxTY3JlZW5Nb2RlKCkpIHsKKyAgICAgICAgICAgIG1GdWxsU2NyZWVuSG9sZGVyLmRpc21pc3MoKTsKKyAgICAgICAgICAgIG1GdWxsU2NyZWVuSG9sZGVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgb25QaW5jaFRvWm9vbUFuaW1hdGlvblN0YXJ0KCkgeworICAgICAgICAvLyBjYW5jZWwgdGhlIHNpbmdsZSB0b3VjaCBoYW5kbGluZworICAgICAgICBjYW5jZWxUb3VjaCgpOworICAgICAgICBvblpvb21BbmltYXRpb25TdGFydCgpOworICAgIH0KKworICAgIHZvaWQgb25QaW5jaFRvWm9vbUFuaW1hdGlvbkVuZChTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvcikgeworICAgICAgICBvblpvb21BbmltYXRpb25FbmQoKTsKKyAgICAgICAgLy8gc3RhcnQgYSBkcmFnLCBUT1VDSF9QSU5DSF9EUkFHLCBjYW4ndCB1c2UgVE9VQ0hfSU5JVF9NT0RFIGFzCisgICAgICAgIC8vIGl0IG1heSB0cmlnZ2VyIHRoZSB1bndhbnRlZCBjbGljaywgY2FuJ3QgdXNlIFRPVUNIX0RSQUdfTU9ERQorICAgICAgICAvLyBhcyBpdCBtYXkgdHJpZ2dlciB0aGUgdW53YW50ZWQgZmxpbmcuCisgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9QSU5DSF9EUkFHOworICAgICAgICBtQ29uZmlybU1vdmUgPSB0cnVlOworICAgICAgICBzdGFydFRvdWNoKGRldGVjdG9yLmdldEZvY3VzWCgpLCBkZXRlY3Rvci5nZXRGb2N1c1koKSwgbUxhc3RUb3VjaFRpbWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydFNjcm9sbGluZ0xheWVyKGZsb2F0IGdlc3R1cmVYLCBmbG9hdCBnZXN0dXJlWSkgeworICAgICAgICBpZiAobVRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKKyAgICAgICAgICAgIGludCBjb250ZW50WCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIGdlc3R1cmVYICsgbVNjcm9sbFgpOworICAgICAgICAgICAgaW50IGNvbnRlbnRZID0gdmlld1RvQ29udGVudFkoKGludCkgZ2VzdHVyZVkgKyBtU2Nyb2xsWSk7CisgICAgICAgICAgICBtU2Nyb2xsaW5nTGF5ZXIgPSBuYXRpdmVTY3JvbGxhYmxlTGF5ZXIoY29udGVudFgsIGNvbnRlbnRZKTsKKyAgICAgICAgICAgIGlmIChtU2Nyb2xsaW5nTGF5ZXIgIT0gMCkgeworICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9EUkFHX0xBWUVSX01PREU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAxLyhkZW5zaXR5ICogZGVuc2l0eSkgdXNlZCB0byBjb21wdXRlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHBvaW50cy4KKyAgICAvLyBDb21wdXRlZCBpbiBpbml0KCkuCisgICAgcHJpdmF0ZSBmbG9hdCBEUkFHX0xBWUVSX0lOVkVSU0VfREVOU0lUWV9TUVVBUkVEOworCisgICAgLy8gVGhlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50cyByZXBvcnRlZCBpbiBvblRvdWNoRXZlbnQgc2NhbGVkIGJ5IHRoZQorICAgIC8vIGRlbnNpdHkgb2YgdGhlIHNjcmVlbi4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJBR19MQVlFUl9GSU5HRVJfRElTVEFOQ0UgPSAyMDAwMDsKKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikgewogICAgICAgICBpZiAobU5hdGl2ZUNsYXNzID09IDAgfHwgKCFpc0NsaWNrYWJsZSgpICYmICFpc0xvbmdDbGlja2FibGUoKSkpIHsKQEAgLTUwMzEsNjEgKzQ5NjEsMTIzIEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgewotICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCBldiArICIgYXQgIiArIGV2LmdldEV2ZW50VGltZSgpICsgIiBtVG91Y2hNb2RlPSIKLSAgICAgICAgICAgICAgICAgICAgKyBtVG91Y2hNb2RlKTsKKyAgICAgICAgICAgIExvZy52KExPR1RBRywgZXYgKyAiIGF0ICIgKyBldi5nZXRFdmVudFRpbWUoKQorICAgICAgICAgICAgICAgICsgIiBtVG91Y2hNb2RlPSIgKyBtVG91Y2hNb2RlCisgICAgICAgICAgICAgICAgKyAiIG51bVBvaW50ZXJzPSIgKyBldi5nZXRQb2ludGVyQ291bnQoKSk7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgYWN0aW9uOwotICAgICAgICBmbG9hdCB4LCB5OworICAgICAgICBpbnQgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIGZsb2F0IHggPSBldi5nZXRYKCk7CisgICAgICAgIGZsb2F0IHkgPSBldi5nZXRZKCk7CiAgICAgICAgIGxvbmcgZXZlbnRUaW1lID0gZXYuZ2V0RXZlbnRUaW1lKCk7CiAKLSAgICAgICAgLy8gRklYTUU6IHdlIG1heSBjb25zaWRlciB0byBnaXZlIFdlYktpdCBhbiBvcHRpb24gdG8gaGFuZGxlIG11bHRpLXRvdWNoCi0gICAgICAgIC8vIGV2ZW50cyBsYXRlci4KLSAgICAgICAgaWYgKG1TdXBwb3J0TXVsdGlUb3VjaCAmJiBldi5nZXRQb2ludGVyQ291bnQoKSA+IDEpIHsKLSAgICAgICAgICAgIGlmIChtQWxsb3dQYW5BbmRTY2FsZSB8fCBtTWluWm9vbVNjYWxlIDwgbU1heFpvb21TY2FsZSkgewotICAgICAgICAgICAgICAgIG1TY2FsZURldGVjdG9yLm9uVG91Y2hFdmVudChldik7Ci0gICAgICAgICAgICAgICAgaWYgKG1TY2FsZURldGVjdG9yLmlzSW5Qcm9ncmVzcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hUaW1lID0gZXZlbnRUaW1lOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1BbGxvd1BhbkFuZFNjYWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICBmaW5hbCBTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvciA9CisgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmdldE11bHRpVG91Y2hHZXN0dXJlRGV0ZWN0b3IoKTsKKyAgICAgICAgYm9vbGVhbiBza2lwU2NhbGVHZXN0dXJlID0gZmFsc2U7CisgICAgICAgIC8vIFNldCB0byB0aGUgbWlkLXBvaW50IG9mIGEgdHdvLWZpbmdlciBnZXN0dXJlIHVzZWQgdG8gZGV0ZWN0IGlmIHRoZQorICAgICAgICAvLyB1c2VyIGhhcyB0b3VjaGVkIGEgbGF5ZXIuCisgICAgICAgIGZsb2F0IGdlc3R1cmVYID0geDsKKyAgICAgICAgZmxvYXQgZ2VzdHVyZVkgPSB5OworICAgICAgICBpZiAoZGV0ZWN0b3IgPT0gbnVsbCB8fCAhZGV0ZWN0b3IuaXNJblByb2dyZXNzKCkpIHsKKyAgICAgICAgICAgIC8vIFRoZSBnZXN0dXJlIGZvciBzY3JvbGxpbmcgYSBsYXllciBpcyB0d28gZmluZ2VycyBjbG9zZSB0b2dldGhlci4KKyAgICAgICAgICAgIC8vIEZJWE1FOiB3ZSBtYXkgY29uc2lkZXIgZ2l2aW5nIFdlYktpdCBhbiBvcHRpb24gdG8gaGFuZGxlCisgICAgICAgICAgICAvLyBtdWx0aS10b3VjaCBldmVudHMgbGF0ZXIuCisgICAgICAgICAgICBpZiAoZXYuZ2V0UG9pbnRlckNvdW50KCkgPiAxKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgZHggPSBldi5nZXRYKDEpIC0gZXYuZ2V0WCgwKTsKKyAgICAgICAgICAgICAgICBmbG9hdCBkeSA9IGV2LmdldFkoMSkgLSBldi5nZXRZKDApOworICAgICAgICAgICAgICAgIGZsb2F0IGRpc3QgPSAoZHggKiBkeCArIGR5ICogZHkpICoKKyAgICAgICAgICAgICAgICAgICAgICAgIERSQUdfTEFZRVJfSU5WRVJTRV9ERU5TSVRZX1NRVUFSRUQ7CisgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBhcHByb3hpbWF0ZSBjZW50ZXIgdG8gZGV0ZXJtaW5lIGlmIHRoZSBnZXN0dXJlIGlzIGluCisgICAgICAgICAgICAgICAgLy8gYSBsYXllci4KKyAgICAgICAgICAgICAgICBnZXN0dXJlWCA9IGV2LmdldFgoMCkgKyAoZHggKiAuNWYpOworICAgICAgICAgICAgICAgIGdlc3R1cmVZID0gZXYuZ2V0WSgwKSArIChkeSAqIC41Zik7CisgICAgICAgICAgICAgICAgLy8gTm93IHVzZSBhIGNvbnNpc3RlbnQgcG9pbnQgZm9yIHRyYWNraW5nIG1vdmVtZW50LgorICAgICAgICAgICAgICAgIGlmIChldi5nZXRYKDApIDwgZXYuZ2V0WCgxKSkgeworICAgICAgICAgICAgICAgICAgICB4ID0gZXYuZ2V0WCgwKTsKKyAgICAgICAgICAgICAgICAgICAgeSA9IGV2LmdldFkoMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IGV2LmdldFgoMSk7CisgICAgICAgICAgICAgICAgICAgIHkgPSBldi5nZXRZKDEpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4ID0gbVNjYWxlRGV0ZWN0b3IuZ2V0Rm9jdXNYKCk7Ci0gICAgICAgICAgICAgICAgeSA9IG1TY2FsZURldGVjdG9yLmdldEZvY3VzWSgpOwotICAgICAgICAgICAgICAgIGFjdGlvbiA9IGV2LmdldEFjdGlvbigpICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0s7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9ET1dOKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbmNlbFRvdWNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNldCBtTGFzdFRvdWNoWC9ZIHRvIHRoZSByZW1haW5pbmcgcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFggPSB4OwotICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWSA9IHk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgeCBvciB5IGluZGljYXRlIGl0IGlzIG9uIHRoZSBlZGdlLCBza2lwIGl0LgotICAgICAgICAgICAgICAgICAgICBpZiAoeCA8IDAgfHwgeSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWN0aW9uID0gZXYuZ2V0QWN0aW9uTWFza2VkKCk7CisgICAgICAgICAgICAgICAgaWYgKGRpc3QgPCBEUkFHX0xBWUVSX0ZJTkdFUl9ESVNUQU5DRSkgeworICAgICAgICAgICAgICAgICAgICBza2lwU2NhbGVHZXN0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfRFJBR19MQVlFUl9NT0RFKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpbmdlcnMgbW92ZWQgdG9vIGZhciBhcGFydCB3aGlsZSBkcmFnZ2luZywgdGhlIHVzZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gbWlnaHQgYmUgdHJ5aW5nIHRvIHpvb20uCisgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGFnZSBkaXNhbGxvdyB6b29tLCBza2lwIG11bHRpLXBvaW50ZXIgYWN0aW9uCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKTsKLSAgICAgICAgICAgIHggPSBldi5nZXRYKCk7Ci0gICAgICAgICAgICB5ID0gZXYuZ2V0WSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlIHBhZ2UgZGlzYWxsb3dzIHpvb20sIHBhc3MgbXVsdGktcG9pbnRlciBldmVudHMgdG8gd2Via2l0LgorICAgICAgICBpZiAoZXYuZ2V0UG9pbnRlckNvdW50KCkgPiAxCisgICAgICAgICAgICAmJiAobVpvb21NYW5hZ2VyLmlzWm9vbVNjYWxlRml4ZWQoKSB8fCBtRGVmZXJNdWx0aXRvdWNoKSkgeworICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKKyAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJwYXNzaW5nICIgKyBldi5nZXRQb2ludGVyQ291bnQoKSArICIgcG9pbnRzIHRvIHdlYmtpdCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFzc011bHRpVG91Y2hUb1dlYktpdChldik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuc3VwcG9ydHNNdWx0aVRvdWNoWm9vbSgpICYmIGV2LmdldFBvaW50ZXJDb3VudCgpID4gMSAmJgorICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgIT0gVE9VQ0hfRFJBR19MQVlFUl9NT0RFICYmICFza2lwU2NhbGVHZXN0dXJlKSB7CisgICAgICAgICAgICBpZiAoIWRldGVjdG9yLmlzSW5Qcm9ncmVzcygpICYmCisgICAgICAgICAgICAgICAgICAgIGV2LmdldEFjdGlvbk1hc2tlZCgpICE9IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0RPV04pIHsKKyAgICAgICAgICAgICAgICAvLyBJbnNlcnQgYSBmYWtlIHBvaW50ZXIgZG93biBldmVudCBpbiBvcmRlciB0byBzdGFydAorICAgICAgICAgICAgICAgIC8vIHRoZSB6b29tIHNjYWxlIGRldGVjdG9yLgorICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50IHRlbXAgPSBNb3Rpb25FdmVudC5vYnRhaW4oZXYpOworICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBvcmlnaW5hbCBldmVudCBhbmQgc2V0IGl0IHRvCisgICAgICAgICAgICAgICAgLy8gQUNUSU9OX1BPSU5URVJfRE9XTi4KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0ZW1wLnNldEFjdGlvbih0ZW1wLmdldEFjdGlvbigpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB+TW90aW9uRXZlbnQuQUNUSU9OX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0RPV04pOworICAgICAgICAgICAgICAgICAgICBkZXRlY3Rvci5vblRvdWNoRXZlbnQodGVtcCk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcC5yZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZXRlY3Rvci5vblRvdWNoRXZlbnQoZXYpOworCisgICAgICAgICAgICBpZiAoZGV0ZWN0b3IuaXNJblByb2dyZXNzKCkpIHsKKyAgICAgICAgICAgICAgICBtTGFzdFRvdWNoVGltZSA9IGV2ZW50VGltZTsKKyAgICAgICAgICAgICAgICBjYW5jZWxMb25nUHJlc3MoKTsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoU1dJVENIX1RPX0xPTkdQUkVTUyk7CisgICAgICAgICAgICAgICAgaWYgKCFtWm9vbU1hbmFnZXIuc3VwcG9ydHNQYW5EdXJpbmdab29tKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9EUkFHX01PREU7CisgICAgICAgICAgICAgICAgaWYgKG1WZWxvY2l0eVRyYWNrZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gVmVsb2NpdHlUcmFja2VyLm9idGFpbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeCA9IGRldGVjdG9yLmdldEZvY3VzWCgpOworICAgICAgICAgICAgeSA9IGRldGVjdG9yLmdldEZvY3VzWSgpOworICAgICAgICAgICAgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCkgJiBNb3Rpb25FdmVudC5BQ1RJT05fTUFTSzsKKyAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTikgeworICAgICAgICAgICAgICAgIGNhbmNlbFRvdWNoKCk7CisgICAgICAgICAgICAgICAgYWN0aW9uID0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV047CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUCkgeworICAgICAgICAgICAgICAgIC8vIHNldCBtTGFzdFRvdWNoWC9ZIHRvIHRoZSByZW1haW5pbmcgcG9pbnQKKyAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWCA9IHg7CisgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFkgPSB5OworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpIHsKKyAgICAgICAgICAgICAgICAvLyBuZWdhdGl2ZSB4IG9yIHkgaW5kaWNhdGUgaXQgaXMgb24gdGhlIGVkZ2UsIHNraXAgaXQuCisgICAgICAgICAgICAgICAgaWYgKHggPCAwIHx8IHkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIER1ZSB0byB0aGUgdG91Y2ggc2NyZWVuIGVkZ2UgZWZmZWN0LCBhIHRvdWNoIGNsb3NlciB0byB0aGUgZWRnZQogICAgICAgICAvLyBhbHdheXMgc25hcHBlZCB0byB0aGUgZWRnZS4gQXMgZ2V0Vmlld1dpZHRoKCkgY2FuIGJlIGRpZmZlcmVudCBmcm9tCiAgICAgICAgIC8vIGdldFdpZHRoKCkgZHVlIHRvIHRoZSBzY3JvbGxiYXIsIGFkanVzdGluZyB0aGUgcG9pbnQgdG8gbWF0Y2gKICAgICAgICAgLy8gZ2V0Vmlld1dpZHRoKCkuIFNhbWUgYXBwbGllZCB0byB0aGUgaGVpZ2h0LgotICAgICAgICBpZiAoeCA+IGdldFZpZXdXaWR0aCgpIC0gMSkgewotICAgICAgICAgICAgeCA9IGdldFZpZXdXaWR0aCgpIC0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoeSA+IGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSAtIDEpIHsKLSAgICAgICAgICAgIHkgPSBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCkgLSAxOwotICAgICAgICB9CisgICAgICAgIHggPSBNYXRoLm1pbih4LCBnZXRWaWV3V2lkdGgoKSAtIDEpOworICAgICAgICB5ID0gTWF0aC5taW4oeSwgZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpIC0gMSk7CiAKICAgICAgICAgZmxvYXQgZkRlbHRhWCA9IG1MYXN0VG91Y2hYIC0geDsKICAgICAgICAgZmxvYXQgZkRlbHRhWSA9IG1MYXN0VG91Y2hZIC0geTsKQEAgLTUxMDgsNiArNTEwMCw5IEBACiAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhSRVNVTUVfV0VCQ09SRV9QUklPUklUWSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJpdmF0ZUhhbmRsZXIuaGFzTWVzc2FnZXMoUkVMRUFTRV9TSU5HTEVfVEFQKSkgewogICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoUkVMRUFTRV9TSU5HTEVfVEFQKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZIDwgbURvdWJsZVRhcFNsb3BTcXVhcmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9ET1VCTEVfVEFQX01PREU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC01MTE5LDEzICs1MTE0LDMzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRYLCBjb250ZW50WSkgOiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRoZSBub3JtYWwgY2FzZQotICAgICAgICAgICAgICAgICAgICBtUHJldmlld1pvb21Pbmx5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7CiAgICAgICAgICAgICAgICAgICAgIG1EZWZlclRvdWNoUHJvY2VzcyA9ICghaW5GdWxsU2NyZWVuTW9kZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUZvcndhcmRUb3VjaEV2ZW50cykgPyBoaXRGb2N1c2VkUGx1Z2luKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRYLCBjb250ZW50WSkgOiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SHViLlVQREFURV9GUkFNRV9DQUNIRV9JRl9MT0FESU5HKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUb3VjaEhpZ2hsaWdodERhdGEgZGF0YSA9IG5ldyBUb3VjaEhpZ2hsaWdodERhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubVggPSBjb250ZW50WDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubVkgPSBjb250ZW50WTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubVNsb3AgPSB2aWV3VG9Db250ZW50RGltZW5zaW9uKG1OYXZTbG9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZURlbGF5ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SHViLkdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdDb25maWd1cmF0aW9uLmdldFRhcFRpbWVvdXQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfVE9VQ0hfSElHSExJR0hUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuZ2V0TmF2RHVtcCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFggPSAoaW50KSB4ICsgbVNjcm9sbFg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFkgPSAoaW50KSB5ICsgbVNjcm9sbFk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WCA9IG1Ub3VjaEhpZ2hsaWdodFkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgVE9VQ0hfSElHSExJR0hUX0VMQVBTRV9USU1FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKG1Mb2dFdmVudCAmJiBldmVudFRpbWUgLSBtTGFzdFRvdWNoVXBUaW1lIDwgMTAwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFdmVudExvZ1RhZ3MuQlJPV1NFUl9ET1VCTEVfVEFQX0RVUkFUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnRUaW1lIC0gbUxhc3RUb3VjaFVwVGltZSksIGV2ZW50VGltZSk7CkBAIC01MTU3LDIxICs1MTcyLDE5IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRGb3J3YXJkVG91Y2hFdmVudCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBUb3VjaEV2ZW50RGF0YSB0ZWQgPSBuZXcgVG91Y2hFdmVudERhdGEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tQWN0aW9uID0gYWN0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1YID0gY29udGVudFg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVkgPSBjb250ZW50WTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tUG9pbnRzID0gbmV3IFBvaW50WzFdOworICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1Qb2ludHNbMF0gPSBuZXcgUG9pbnQoY29udGVudFgsIGNvbnRlbnRZKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tTWV0YVN0YXRlID0gZXYuZ2V0TWV0YVN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA9IG1EZWZlclRvdWNoUHJvY2VzczsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5UT1VDSF9FVkVOVCwgdGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaFByb2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCBuZWVkcyB0byBzZXQgdGhlbSBmb3IgY29tcHV0ZSBkZWx0YVgvWQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hYID0geDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbkZ1bGxTY3JlZW5Nb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoUFJFVkVOVF9ERUZBVUxUX1RJTUVPVVQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobVByaXZhdGVIYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2J0YWluTWVzc2FnZShQUkVWRU5UX0RFRkFVTFRfVElNRU9VVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLCAwKSwgVEFQX1RJTUVPVVQpOwpAQCAtNTE5MiwyNCArNTIwNSwyNCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9ET1VCTEVfVEFQX01PREUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBwYXNzIHRoZSB0b3VjaCBldmVudHMgZnJvbSBVSSB0aHJlYWQgdG8gV2ViQ29yZSB0aHJlYWQKICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRm9yd2FyZFRvdWNoRXZlbnQoKSAmJiBtQ29uZmlybU1vdmUgJiYgKGZpcnN0TW92ZQogICAgICAgICAgICAgICAgICAgICAgICAgfHwgZXZlbnRUaW1lIC0gbUxhc3RTZW50VG91Y2hUaW1lID4gbUN1cnJlbnRUb3VjaEludGVydmFsKSkgewotICAgICAgICAgICAgICAgICAgICBtTGFzdFNlbnRUb3VjaFRpbWUgPSBldmVudFRpbWU7CiAgICAgICAgICAgICAgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IG5ldyBUb3VjaEV2ZW50RGF0YSgpOwogICAgICAgICAgICAgICAgICAgICB0ZWQubUFjdGlvbiA9IGFjdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgdGVkLm1YID0gY29udGVudFg7Ci0gICAgICAgICAgICAgICAgICAgIHRlZC5tWSA9IGNvbnRlbnRZOworICAgICAgICAgICAgICAgICAgICB0ZWQubVBvaW50cyA9IG5ldyBQb2ludFsxXTsKKyAgICAgICAgICAgICAgICAgICAgdGVkLm1Qb2ludHNbMF0gPSBuZXcgUG9pbnQoY29udGVudFgsIGNvbnRlbnRZKTsKICAgICAgICAgICAgICAgICAgICAgdGVkLm1NZXRhU3RhdGUgPSBldi5nZXRNZXRhU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgdGVkLm1SZXByb2Nlc3MgPSBtRGVmZXJUb3VjaFByb2Nlc3M7CisgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5UT1VDSF9FVkVOVCwgdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RTZW50VG91Y2hUaW1lID0gZXZlbnRUaW1lOwogICAgICAgICAgICAgICAgICAgICBpZiAobURlZmVyVG91Y2hQcm9jZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdYID0geDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1kgPSB5OwotICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RNb3ZlICYmICFpbkZ1bGxTY3JlZW5Nb2RlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobVByaXZhdGVIYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vYnRhaW5NZXNzYWdlKFBSRVZFTlRfREVGQVVMVF9USU1FT1VULApAQCAtNTIzOCwxMSArNTI1MSwxMyBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX01PREUpIHsKKyAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX01PREUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgIT0gVE9VQ0hfRFJBR19MQVlFUl9NT0RFKSB7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtQ29uZmlybU1vdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgaWYgKG1QcmV2ZW50RGVmYXVsdCA9PSBQUkVWRU5UX0RFRkFVTFRfTUFZQkVfWUVTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbVByZXZlbnREZWZhdWx0ID09IFBSRVZFTlRfREVGQVVMVF9OT19GUk9NX1RPVUNIX0RPV04pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYWNrIG1MYXN0VG91Y2hUaW1lIGFzIHdlIG1heSBuZWVkIHRvIGRvIGZsaW5nIGF0CkBAIC01MjUyLDkgKzUyNjcsOSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBsb2NrIGRyYWdnaW5nIHRvIG9uZSBheGlzIGlmIHdlIGRvbid0IGhhdmUgYSBzY2FsZSBpbiBwcm9ncmVzcy4KLSAgICAgICAgICAgICAgICAgICAgLy8gU2NhbGluZyBpbXBsaWVzIGZyZWUtcm9hbWluZyBtb3ZlbWVudC4gTm90ZSB3ZSdsbCBvbmx5IGV2ZXIgZ2V0IGhlcmUKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgbUFsbG93UGFuQW5kU2NhbGUgaXMgdHJ1ZS4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TY2FsZURldGVjdG9yICE9IG51bGwgJiYgIW1TY2FsZURldGVjdG9yLmlzSW5Qcm9ncmVzcygpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNjYWxpbmcgaW1wbGllcyBmcmVlLXJvYW1pbmcgbW92ZW1lbnQuIE5vdGUgdGhpcyBpcyBvbmx5IGV2ZXIgYSBxdWVzdGlvbgorICAgICAgICAgICAgICAgICAgICAvLyBpZiBtWm9vbU1hbmFnZXIuc3VwcG9ydHNQYW5EdXJpbmdab29tKCkgaXMgdHJ1ZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGRldGVjdG9yICE9IG51bGwgJiYgIWRldGVjdG9yLmlzSW5Qcm9ncmVzcygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCBzdGFydHMgbmVhcmx5IGhvcml6b250YWwgb3IgdmVydGljYWwsIGVuZm9yY2UgaXQKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBheCA9IE1hdGguYWJzKGRlbHRhWCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXkgPSBNYXRoLmFicyhkZWx0YVkpOwpAQCAtNTI3NSw2ICs1MjkwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgZGVsdGFYID0gMDsKICAgICAgICAgICAgICAgICAgICAgZGVsdGFZID0gMDsKIAorICAgICAgICAgICAgICAgICAgICBpZiAoc2tpcFNjYWxlR2VzdHVyZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTY3JvbGxpbmdMYXllcihnZXN0dXJlWCwgZ2VzdHVyZVkpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RHJhZygpOwogICAgICAgICAgICAgICAgIH0KIApAQCAtNTI4Myw2ICs1MzAxLDIwIEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gZG8gcGFuCisgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgIT0gVE9VQ0hfRFJBR19MQVlFUl9NT0RFKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBuZXdTY3JvbGxYID0gcGluTG9jWChtU2Nyb2xsWCArIGRlbHRhWCk7CisgICAgICAgICAgICAgICAgICAgIGludCBuZXdEZWx0YVggPSBuZXdTY3JvbGxYIC0gbVNjcm9sbFg7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVggIT0gbmV3RGVsdGFYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVggPSBuZXdEZWx0YVg7CisgICAgICAgICAgICAgICAgICAgICAgICBmRGVsdGFYID0gKGZsb2F0KSBuZXdEZWx0YVg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50IG5ld1Njcm9sbFkgPSBwaW5Mb2NZKG1TY3JvbGxZICsgZGVsdGFZKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5ld0RlbHRhWSA9IG5ld1Njcm9sbFkgLSBtU2Nyb2xsWTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhWSAhPSBuZXdEZWx0YVkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhWSA9IG5ld0RlbHRhWTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZEZWx0YVkgPSAoZmxvYXQpIG5ld0RlbHRhWTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBib29sZWFuIGtlZXBTY3JvbGxCYXJzVmlzaWJsZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhmRGVsdGFYKSA8IDEuMGYgJiYgTWF0aC5hYnMoZkRlbHRhWSkgPCAxLjBmKSB7CkBAIC01MzQ5LDcgKzUzODEsOSBAQAogCiAgICAgICAgICAgICAgICAgZG9EcmFnKGRlbHRhWCwgZGVsdGFZKTsKIAotICAgICAgICAgICAgICAgIGlmIChrZWVwU2Nyb2xsQmFyc1Zpc2libGUpIHsKKyAgICAgICAgICAgICAgICAvLyBUdXJuIG9mZiBzY3JvbGxiYXJzIHdoZW4gZHJhZ2dpbmcgYSBsYXllci4KKyAgICAgICAgICAgICAgICBpZiAoa2VlcFNjcm9sbEJhcnNWaXNpYmxlICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTEFZRVJfTU9ERSkgewogICAgICAgICAgICAgICAgICAgICBpZiAobUhlbGRNb3Rpb25sZXNzICE9IE1PVElPTkxFU1NfVFJVRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUhlbGRNb3Rpb25sZXNzID0gTU9USU9OTEVTU19UUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwpAQCAtNTM2NCwxOCArNTM5OCwxNSBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6IHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzRm9jdXNlZCgpKSByZXF1ZXN0Rm9jdXMoKTsKICAgICAgICAgICAgICAgICAvLyBwYXNzIHRoZSB0b3VjaCBldmVudHMgZnJvbSBVSSB0aHJlYWQgdG8gV2ViQ29yZSB0aHJlYWQKICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRm9yd2FyZFRvdWNoRXZlbnQoKSkgewogICAgICAgICAgICAgICAgICAgICBUb3VjaEV2ZW50RGF0YSB0ZWQgPSBuZXcgVG91Y2hFdmVudERhdGEoKTsKICAgICAgICAgICAgICAgICAgICAgdGVkLm1BY3Rpb24gPSBhY3Rpb247Ci0gICAgICAgICAgICAgICAgICAgIHRlZC5tWCA9IGNvbnRlbnRYOwotICAgICAgICAgICAgICAgICAgICB0ZWQubVkgPSBjb250ZW50WTsKKyAgICAgICAgICAgICAgICAgICAgdGVkLm1Qb2ludHMgPSBuZXcgUG9pbnRbMV07CisgICAgICAgICAgICAgICAgICAgIHRlZC5tUG9pbnRzWzBdID0gbmV3IFBvaW50KGNvbnRlbnRYLCBjb250ZW50WSk7CiAgICAgICAgICAgICAgICAgICAgIHRlZC5tTWV0YVN0YXRlID0gZXYuZ2V0TWV0YVN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgIHRlZC5tUmVwcm9jZXNzID0gbURlZmVyVG91Y2hQcm9jZXNzOwotICAgICAgICAgICAgICAgICAgICBpZiAobURlZmVyVG91Y2hQcm9jZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdYID0geDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1kgPSB5OwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5UT1VDSF9FVkVOVCwgdGVkKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFVwVGltZSA9IGV2ZW50VGltZTsKQEAgLTUzODYsMTcgKzU0MTcsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbkZ1bGxTY3JlZW5Nb2RlKCkgfHwgbURlZmVyVG91Y2hQcm9jZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG91Y2hFdmVudERhdGEgdGVkID0gbmV3IFRvdWNoRXZlbnREYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1BY3Rpb24gPSBXZWJWaWV3Q29yZS5BQ1RJT05fRE9VQkxFVEFQOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tWCA9IGNvbnRlbnRYOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tWSA9IGNvbnRlbnRZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tUG9pbnRzID0gbmV3IFBvaW50WzFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tUG9pbnRzWzBdID0gbmV3IFBvaW50KGNvbnRlbnRYLCBjb250ZW50WSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1NZXRhU3RhdGUgPSBldi5nZXRNZXRhU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA9IG1EZWZlclRvdWNoUHJvY2VzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobURlZmVyVG91Y2hQcm9jZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1ggPSB4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdZID0geTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJldmVudERlZmF1bHQgIT0gUFJFVkVOVF9ERUZBVUxUX1lFUyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Eb3VibGVUYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtWm9vbU1hbmFnZXIuaGFuZGxlRG91YmxlVGFwKG1MYXN0VG91Y2hYLCBtTGFzdFRvdWNoWSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0RPTkVfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTQxMSw5ICs1NDM4LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QcmV2ZW50RGVmYXVsdCAhPSBQUkVWRU5UX0RFRkFVTFRfWUVTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY29tcHV0ZU1heFNjcm9sbFgoKSA+IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY29tcHV0ZU1heFNjcm9sbFkoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVJIHRha2VzIGNvbnRyb2wgYmFjaywgY2FuY2VsIFdlYkNvcmUgdG91Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsV2ViQ29yZVRvdWNoRXZlbnQoY29udGVudFgsIGNvbnRlbnRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdXNlciBoYXMgcGVyZm9ybWVkIGEgdmVyeSBxdWljayB0b3VjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXF1ZW5jZSBpdCBpcyBwb3NzaWJsZSB0aGF0IHdlIG1heSBnZXQgaGVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgV2ViQ29yZSBoYXMgaGFkIGEgY2hhbmNlIHRvIHByb2Nlc3MgdGhlIGV2ZW50cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCBhbnkgY2FsbCB0byBwcmV2ZW50RGVmYXVsdCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSlMgdG91Y2ggaGFuZGxlciB3aWxsIG5vdCBoYXZlIGJlZW4gZXhlY3V0ZWQgeWV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIZW5jZSB3ZSB3aWxsIHNlZSBib3RoIHRoZSBVSSAobm93KSBhbmQgV2ViQ29yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAod2hlbiBjb250ZXh0IHN3aXRjaGVzKSBoYW5kbGluZyB0aGUgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgd2ViIGRldmVsb3BlciBhY3R1YWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzZXMgcHJldmVudERlZmF1bHQgaW4gdGhlaXIgdG91Y2ggaGFuZGxlci4gVGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB0aGUgbmF0dXJlIG9mIG91ciBhc3luY2hyb25vdXMgdG91Y2ggbW9kZWwuCisKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBub3QgcmV3cml0ZSBkcmFnIGNvZGUgaGVyZSwgYnV0IHdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgdHJ5IGZsaW5nIGlmIGl0IGFwcGxpZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlZHVjZVByaW9yaXR5KCk7CkBAIC01NDMxLDEzICs1NDY2LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGluZ1RleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdGl2ZUhpdFNlbGVjdGlvbihjb250ZW50WCwgY29udGVudFkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5U2VsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhcHBpbmcgb24gc2VsZWN0aW9uIG9yIGNvbnRyb2xzIGRvZXMgbm90aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5hdGl2ZUhpdFNlbGVjdGlvbihjb250ZW50WCwgY29udGVudFkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Eb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfSU5JVF9NT0RFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSB0cmlnZ2VyIGRvdWJsZSB0YXAgaWYgdGhlIFdlYlZpZXcgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX0lOSVRfTU9ERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNhblpvb21JbigpIHx8IGNhblpvb21PdXQoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFTEVBU0VfU0lOR0xFX1RBUCwgVmlld0NvbmZpZ3VyYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREb3VibGVUYXBUaW1lb3V0KCkpOwpAQCAtNTQ2NiwxOCArNTUwNCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWxkTW90aW9ubGVzcyA9IE1PVElPTkxFU1NfSUdOT1JFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRmxpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TY3JvbGxlci5zcHJpbmdiYWNrKG1TY3JvbGxYLCBtU2Nyb2xsWSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVNYXhTY3JvbGxYKCksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlTWF4U2Nyb2xsWSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVkcmF3IGluIGhpZ2gtcXVhbGl0eSwgYXMgd2UncmUgZG9uZSBkcmFnZ2luZwogICAgICAgICAgICAgICAgICAgICAgICAgbUhlbGRNb3Rpb25sZXNzID0gTU9USU9OTEVTU19UUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCiAgICAgICAgICAgICAgICAgICAgIGNhc2UgVE9VQ0hfRFJBR19TVEFSVF9NT0RFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFRPVUNIX0RSQUdfTEFZRVJfTU9ERToKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPVUNIX0RSQUdfU1RBUlRfTU9ERSBzaG91bGQgbm90IGhhcHBlbiBmb3IgdGhlIHJlYWwKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldmljZSBhcyB3ZSBhbG1vc3QgY2VydGFpbiB3aWxsIGdldCBhIE1PVkUuIEJ1dCB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBwb3NzaWJsZSBvbiBlbXVsYXRvci4KQEAgLTU0OTEsOCArNTUyNCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6IHsKICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9EUkFHX01PREUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNjcm9sbGVyLnNwcmluZ2JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVNYXhTY3JvbGxYKCksIDAsIGNvbXB1dGVNYXhTY3JvbGxZKCkpOwogICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhbmNlbFdlYkNvcmVUb3VjaEV2ZW50KGNvbnRlbnRYLCBjb250ZW50WSwgZmFsc2UpOwpAQCAtNTUwMywxNCArNTUzNCwzMiBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgcGFzc011bHRpVG91Y2hUb1dlYktpdChNb3Rpb25FdmVudCBldikgeworICAgICAgICBUb3VjaEV2ZW50RGF0YSB0ZWQgPSBuZXcgVG91Y2hFdmVudERhdGEoKTsKKyAgICAgICAgdGVkLm1BY3Rpb24gPSBldi5nZXRBY3Rpb24oKSAmIE1vdGlvbkV2ZW50LkFDVElPTl9NQVNLOworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBldi5nZXRQb2ludGVyQ291bnQoKTsKKyAgICAgICAgdGVkLm1Qb2ludHMgPSBuZXcgUG9pbnRbY291bnRdOworICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IGNvdW50OyBjKyspIHsKKyAgICAgICAgICAgIGludCB4ID0gdmlld1RvQ29udGVudFgoKGludCkgZXYuZ2V0WChjKSArIG1TY3JvbGxYKTsKKyAgICAgICAgICAgIGludCB5ID0gdmlld1RvQ29udGVudFkoKGludCkgZXYuZ2V0WShjKSArIG1TY3JvbGxZKTsKKyAgICAgICAgICAgIHRlZC5tUG9pbnRzW2NdID0gbmV3IFBvaW50KHgsIHkpOworICAgICAgICB9CisgICAgICAgIHRlZC5tTWV0YVN0YXRlID0gZXYuZ2V0TWV0YVN0YXRlKCk7CisgICAgICAgIHRlZC5tUmVwcm9jZXNzID0gbURlZmVyVG91Y2hQcm9jZXNzOworICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CisgICAgICAgIGNhbmNlbExvbmdQcmVzcygpOworICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoU1dJVENIX1RPX0xPTkdQUkVTUyk7CisgICAgICAgIG1QcmV2ZW50RGVmYXVsdCA9IFBSRVZFTlRfREVGQVVMVF9JR05PUkU7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbFdlYkNvcmVUb3VjaEV2ZW50KGludCB4LCBpbnQgeSwgYm9vbGVhbiByZW1vdmVFdmVudHMpIHsKICAgICAgICAgaWYgKHNob3VsZEZvcndhcmRUb3VjaEV2ZW50KCkpIHsKICAgICAgICAgICAgIGlmIChyZW1vdmVFdmVudHMpIHsKICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUucmVtb3ZlTWVzc2FnZXMoRXZlbnRIdWIuVE9VQ0hfRVZFTlQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgVG91Y2hFdmVudERhdGEgdGVkID0gbmV3IFRvdWNoRXZlbnREYXRhKCk7Ci0gICAgICAgICAgICB0ZWQubVggPSB4OwotICAgICAgICAgICAgdGVkLm1ZID0geTsKKyAgICAgICAgICAgIHRlZC5tUG9pbnRzID0gbmV3IFBvaW50WzFdOworICAgICAgICAgICAgdGVkLm1Qb2ludHNbMF0gPSBuZXcgUG9pbnQoeCwgeSk7CiAgICAgICAgICAgICB0ZWQubUFjdGlvbiA9IE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw7CiAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICBtUHJldmVudERlZmF1bHQgPSBQUkVWRU5UX0RFRkFVTFRfSUdOT1JFOwpAQCAtNTUzNiw3OSArNTU4NSwyNiBAQAogICAgICAgICBpZiAoIW1EcmFnRnJvbVRleHRJbnB1dCkgewogICAgICAgICAgICAgbmF0aXZlSGlkZUN1cnNvcigpOwogICAgICAgICB9Ci0gICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgaWYgKHNldHRpbmdzLnN1cHBvcnRab29tKCkKLSAgICAgICAgICAgICAgICAmJiBzZXR0aW5ncy5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkKLSAgICAgICAgICAgICAgICAmJiAhZ2V0Wm9vbUJ1dHRvbnNDb250cm9sbGVyKCkuaXNWaXNpYmxlKCkKLSAgICAgICAgICAgICAgICAmJiBtTWluWm9vbVNjYWxlIDwgbU1heFpvb21TY2FsZQotICAgICAgICAgICAgICAgICYmIChtSG9yaXpvbnRhbFNjcm9sbEJhck1vZGUgIT0gU0NST0xMQkFSX0FMV0FZU09GRgotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbVZlcnRpY2FsU2Nyb2xsQmFyTW9kZSAhPSBTQ1JPTExCQVJfQUxXQVlTT0ZGKSkgewotICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgaW50IGNvdW50ID0gc2V0dGluZ3MuZ2V0RG91YmxlVGFwVG9hc3RDb3VudCgpOwotICAgICAgICAgICAgaWYgKG1Jblpvb21PdmVydmlldyAmJiBjb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICBzZXR0aW5ncy5zZXREb3VibGVUYXBUb2FzdENvdW50KC0tY291bnQpOwotICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KG1Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuZG91YmxlX3RhcF90b2FzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9MT05HKS5zaG93KCk7Ci0gICAgICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Ib3Jpem9udGFsU2Nyb2xsQmFyTW9kZSAhPSBTQ1JPTExCQVJfQUxXQVlTT0ZGCisgICAgICAgICAgICAgICAgfHwgbVZlcnRpY2FsU2Nyb2xsQmFyTW9kZSAhPSBTQ1JPTExCQVJfQUxXQVlTT0ZGKSB7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuaW52b2tlWm9vbVBpY2tlcigpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGRvRHJhZyhpbnQgZGVsdGFYLCBpbnQgZGVsdGFZKSB7CiAgICAgICAgIGlmICgoZGVsdGFYIHwgZGVsdGFZKSAhPSAwKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgb2xkWCA9IG1TY3JvbGxYOwotICAgICAgICAgICAgZmluYWwgaW50IG9sZFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgIGZpbmFsIGludCByYW5nZVggPSBjb21wdXRlTWF4U2Nyb2xsWCgpOwotICAgICAgICAgICAgZmluYWwgaW50IHJhbmdlWSA9IGNvbXB1dGVNYXhTY3JvbGxZKCk7Ci0gICAgICAgICAgICBvdmVyc2Nyb2xsQnkoZGVsdGFYLCBkZWx0YVksIG9sZFgsIG9sZFksCi0gICAgICAgICAgICAgICAgICAgIHJhbmdlWCwgcmFuZ2VZLAotICAgICAgICAgICAgICAgICAgICBtT3ZlcnNjcm9sbERpc3RhbmNlLCBtT3ZlcnNjcm9sbERpc3RhbmNlLCB0cnVlKTsKLQotICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gRG9uJ3Qgc2hvdyBsZWZ0L3JpZ2h0IGdsb3dzIGlmIHdlIGZpdCB0aGUgd2hvbGUgY29udGVudC4KLSAgICAgICAgICAgICAgICBpZiAocmFuZ2VYID4gMCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcHVsbGVkVG9YID0gb2xkWCArIGRlbHRhWDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHB1bGxlZFRvWCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0xlZnQub25QdWxsKChmbG9hdCkgZGVsdGFYIC8gZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1FZGdlR2xvd1JpZ2h0LmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0Lm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHB1bGxlZFRvWCA+IHJhbmdlWCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQub25QdWxsKChmbG9hdCkgZGVsdGFYIC8gZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1FZGdlR2xvd0xlZnQuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93TGVmdC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfRFJBR19MQVlFUl9NT0RFKSB7CisgICAgICAgICAgICAgICAgZGVsdGFYID0gdmlld1RvQ29udGVudERpbWVuc2lvbihkZWx0YVgpOworICAgICAgICAgICAgICAgIGRlbHRhWSA9IHZpZXdUb0NvbnRlbnREaW1lbnNpb24oZGVsdGFZKTsKKyAgICAgICAgICAgICAgICBpZiAobmF0aXZlU2Nyb2xsTGF5ZXIobVNjcm9sbGluZ0xheWVyLCBkZWx0YVgsIGRlbHRhWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyYW5nZVkgPiAwIHx8IGdldE92ZXJzY3JvbGxNb2RlKCkgPT0gT1ZFUlNDUk9MTF9BTFdBWVMpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHB1bGxlZFRvWSA9IG9sZFkgKyBkZWx0YVk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwdWxsZWRUb1kgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25QdWxsKChmbG9hdCkgZGVsdGFZIC8gZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dCb3R0b20uaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHB1bGxlZFRvWSA+IHJhbmdlWSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uUHVsbCgoZmxvYXQpIGRlbHRhWSAvIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUVkZ2VHbG93VG9wLmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzY3JvbGxCeShkZWx0YVgsIGRlbHRhWSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFnZXRTZXR0aW5ncygpLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKSkgewotICAgICAgICAgICAgYm9vbGVhbiBzaG93UGx1c01pbnVzID0gbU1pblpvb21TY2FsZSA8IG1NYXhab29tU2NhbGU7Ci0gICAgICAgICAgICBpZiAobVpvb21Db250cm9scyAhPSBudWxsICYmIHNob3dQbHVzTWludXMpIHsKLSAgICAgICAgICAgICAgICBpZiAobVpvb21Db250cm9scy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ab29tQ29udHJvbHMuc2hvdyhzaG93UGx1c01pbnVzLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbVpvb21NYW5hZ2VyLmtlZXBab29tUGlja2VyVmlzaWJsZSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzdG9wVG91Y2goKSB7CkBAIC01NjIyLDE0ICs1NjE4LDYgQEAKICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOwogICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CiAgICAgICAgIH0KLQotICAgICAgICAvLyBSZWxlYXNlIGFueSBwdWxsZWQgZ2xvd3MKLSAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dMZWZ0Lm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQub25SZWxlYXNlKCk7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2FuY2VsVG91Y2goKSB7CkBAIC01NjQzLDE2ICs1NjMxLDggQEAKICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOwogICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CiAgICAgICAgIH0KLQotICAgICAgICAvLyBSZWxlYXNlIGFueSBwdWxsZWQgZ2xvd3MKLSAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dMZWZ0Lm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQub25SZWxlYXNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9EUkFHX01PREUpIHsKKyAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfRFJBR19NT0RFIHx8CisgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9PSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVByaW9yaXR5KCk7CiAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7CiAgICAgICAgIH0KQEAgLTU2NjAsNiArNTY0MCw5IEBACiAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhTV0lUQ0hfVE9fTE9OR1BSRVNTKTsKICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKERSQUdfSEVMRF9NT1RJT05MRVNTKTsKICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKEFXQUtFTl9TQ1JPTExfQkFSUyk7CisgICAgICAgIGlmIChnZXRTZXR0aW5ncygpLnN1cHBvcnRUb3VjaE9ubHkoKSkgeworICAgICAgICAgICAgcmVtb3ZlVG91Y2hIaWdobGlnaHQodHJ1ZSk7CisgICAgICAgIH0KICAgICAgICAgbUhlbGRNb3Rpb25sZXNzID0gTU9USU9OTEVTU19UUlVFOwogICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfRE9ORV9NT0RFOwogICAgICAgICBuYXRpdmVIaWRlQ3Vyc29yKCk7CkBAIC01NzU3LDcgKzU3NDAsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBsZXQgY29tbW9uIGNvZGUgaW4gb25LZXlVcCBhdCBpdAogICAgICAgICB9Ci0gICAgICAgIGlmIChtTWFwVHJhY2tiYWxsVG9BcnJvd0tleXMgJiYgbVNoaWZ0SXNQcmVzc2VkID09IGZhbHNlKSB7CisgICAgICAgIGlmICgobU1hcFRyYWNrYmFsbFRvQXJyb3dLZXlzICYmIG1TaGlmdElzUHJlc3NlZCA9PSBmYWxzZSkgfHwKKyAgICAgICAgICAgICAgICAobUFjY2Vzc2liaWxpdHlJbmplY3RvciAhPSBudWxsIHx8IG1BY2Nlc3NpYmlsaXR5U2NyaXB0SW5qZWN0ZWQpKSB7CiAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgTG9nLnYoTE9HVEFHLCAib25UcmFja2JhbGxFdmVudCBnbWFpbCBxdWl0Iik7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTU5MjUsMTEgKzU5MDksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tiYWxsUmVtYWluc1g9IiArIG1UcmFja2JhbGxSZW1haW5zWAogICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2JhbGxSZW1haW5zWT0iICsgbVRyYWNrYmFsbFJlbWFpbnNZKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCAmJiBuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKKyAgICAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCAmJiBuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkgewogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBsZXRQbHVnaW5IYW5kbGVOYXZLZXkoc2VsZWN0S2V5Q29kZSwgdGltZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGxldFBhZ2VIYW5kbGVOYXZLZXkoc2VsZWN0S2V5Q29kZSwgdGltZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxldFBsdWdpbkhhbmRsZU5hdktleShzZWxlY3RLZXlDb2RlLCB0aW1lLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgbGV0UGFnZUhhbmRsZU5hdktleShzZWxlY3RLZXlDb2RlLCB0aW1lLCBmYWxzZSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hdkhhbmRsZWRLZXkoc2VsZWN0S2V5Q29kZSwgY291bnQsIGZhbHNlLCB0aW1lKSkgewogICAgICAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdChrZXlDb2RlVG9Tb3VuZHNFZmZlY3Qoc2VsZWN0S2V5Q29kZSkpOwogICAgICAgICAgICAgfQpAQCAtNTk2MCwxNyArNTk0NCwzMCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGNvbXB1dGVNYXhTY3JvbGxYKCkgewotICAgICAgICByZXR1cm4gTWF0aC5tYXgoY29tcHV0ZVJlYWxIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSAtIGdldFZpZXdXaWR0aCgpLCAwKTsKKyAgICAgICAgcmV0dXJuIE1hdGgubWF4KGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSAtIGdldFZpZXdXaWR0aCgpLCAwKTsKICAgICB9CiAKICAgICBwcml2YXRlIGludCBjb21wdXRlTWF4U2Nyb2xsWSgpIHsKLSAgICAgICAgcmV0dXJuIE1hdGgubWF4KGNvbXB1dGVSZWFsVmVydGljYWxTY3JvbGxSYW5nZSgpICsgZ2V0VGl0bGVIZWlnaHQoKQorICAgICAgICByZXR1cm4gTWF0aC5tYXgoY29tcHV0ZVZlcnRpY2FsU2Nyb2xsUmFuZ2UoKSArIGdldFRpdGxlSGVpZ2h0KCkKICAgICAgICAgICAgICAgICAtIGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSwgMCk7CiAgICAgfQogCisgICAgYm9vbGVhbiB1cGRhdGVTY3JvbGxDb29yZGluYXRlcyhpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgaW50IG9sZFggPSBtU2Nyb2xsWDsKKyAgICAgICAgaW50IG9sZFkgPSBtU2Nyb2xsWTsKKyAgICAgICAgbVNjcm9sbFggPSB4OworICAgICAgICBtU2Nyb2xsWSA9IHk7CisgICAgICAgIGlmIChvbGRYICE9IG1TY3JvbGxYIHx8IG9sZFkgIT0gbVNjcm9sbFkpIHsKKyAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBmbGluZ1Njcm9sbChpbnQgdngsIGludCB2eSkgewogICAgICAgICBtU2Nyb2xsZXIuZmxpbmcobVNjcm9sbFgsIG1TY3JvbGxZLCB2eCwgdnksIDAsIGNvbXB1dGVNYXhTY3JvbGxYKCksIDAsCi0gICAgICAgICAgICAgICAgY29tcHV0ZU1heFNjcm9sbFkoKSwgbU92ZXJmbGluZ0Rpc3RhbmNlLCBtT3ZlcmZsaW5nRGlzdGFuY2UpOworICAgICAgICAgICAgICAgIGNvbXB1dGVNYXhTY3JvbGxZKCkpOwogICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgfQogCkBAIC02MDAwLDIwICs1OTk3LDE5IEBACiAgICAgICAgIGlmICgobWF4WCA9PSAwICYmIHZ5ID09IDApIHx8IChtYXhZID09IDAgJiYgdnggPT0gMCkpIHsKICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVByaW9yaXR5KCk7CiAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7Ci0gICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ2JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLCBjb21wdXRlTWF4U2Nyb2xsWCgpLAotICAgICAgICAgICAgICAgICAgICAwLCBjb21wdXRlTWF4U2Nyb2xsWSgpKSkgewotICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBmbG9hdCBjdXJyZW50VmVsb2NpdHkgPSBtU2Nyb2xsZXIuZ2V0Q3VyclZlbG9jaXR5KCk7Ci0gICAgICAgIGlmIChtTGFzdFZlbG9jaXR5ID4gMCAmJiBjdXJyZW50VmVsb2NpdHkgPiAwKSB7CisgICAgICAgIGZsb2F0IHZlbG9jaXR5ID0gKGZsb2F0KSBNYXRoLmh5cG90KHZ4LCB2eSk7CisgICAgICAgIGlmIChtTGFzdFZlbG9jaXR5ID4gMCAmJiBjdXJyZW50VmVsb2NpdHkgPiAwICYmIHZlbG9jaXR5CisgICAgICAgICAgICAgICAgPiBtTGFzdFZlbG9jaXR5ICogTUlOSU1VTV9WRUxPQ0lUWV9SQVRJT19GT1JfQUNDRUxFUkFUSU9OKSB7CiAgICAgICAgICAgICBmbG9hdCBkZWx0YVIgPSAoZmxvYXQpIChNYXRoLmFicyhNYXRoLmF0YW4yKG1MYXN0VmVsWSwgbUxhc3RWZWxYKQogICAgICAgICAgICAgICAgICAgICAtIE1hdGguYXRhbjIodnksIHZ4KSkpOwogICAgICAgICAgICAgZmluYWwgZmxvYXQgY2lyY2xlID0gKGZsb2F0KSAoTWF0aC5QSSkgKiAyLjBmOwogICAgICAgICAgICAgaWYgKGRlbHRhUiA+IGNpcmNsZSAqIDAuOWYgfHwgZGVsdGFSIDwgY2lyY2xlICogMC4xZikgewogICAgICAgICAgICAgICAgIHZ4ICs9IGN1cnJlbnRWZWxvY2l0eSAqIG1MYXN0VmVsWCAvIG1MYXN0VmVsb2NpdHk7CiAgICAgICAgICAgICAgICAgdnkgKz0gY3VycmVudFZlbG9jaXR5ICogbUxhc3RWZWxZIC8gbUxhc3RWZWxvY2l0eTsKKyAgICAgICAgICAgICAgICB2ZWxvY2l0eSA9IChmbG9hdCkgTWF0aC5oeXBvdCh2eCwgdnkpOwogICAgICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgImRvRmxpbmcgdng9ICIgKyB2eCArICIgdnk9IiArIHZ5KTsKICAgICAgICAgICAgICAgICB9CkBAIC02MDI3LDY3ICs2MDIzLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICsgIiBtYXhYPSIgKyBtYXhYICsgIiBtYXhZPSIgKyBtYXhZCiAgICAgICAgICAgICAgICAgICAgICsgIiBtU2Nyb2xsWD0iICsgbVNjcm9sbFggKyAiIG1TY3JvbGxZPSIgKyBtU2Nyb2xsWSk7CiAgICAgICAgIH0KLQotICAgICAgICAvLyBBbGxvdyBzbG9wcHkgZmxpbmdzIHdpdGhvdXQgb3ZlcnNjcm9sbGluZyBhdCB0aGUgZWRnZXMuCi0gICAgICAgIGlmICgobVNjcm9sbFggPT0gMCB8fCBtU2Nyb2xsWCA9PSBtYXhYKSAmJiBNYXRoLmFicyh2eCkgPCBNYXRoLmFicyh2eSkpIHsKLSAgICAgICAgICAgIHZ4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoKG1TY3JvbGxZID09IDAgfHwgbVNjcm9sbFkgPT0gbWF4WSkgJiYgTWF0aC5hYnModnkpIDwgTWF0aC5hYnModngpKSB7Ci0gICAgICAgICAgICB2eSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU92ZXJzY3JvbGxEaXN0YW5jZSA8IG1PdmVyZmxpbmdEaXN0YW5jZSkgewotICAgICAgICAgICAgaWYgKG1TY3JvbGxYID09IC1tT3ZlcnNjcm9sbERpc3RhbmNlIHx8IG1TY3JvbGxYID09IG1heFggKyBtT3ZlcnNjcm9sbERpc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgdnggPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TY3JvbGxZID09IC1tT3ZlcnNjcm9sbERpc3RhbmNlIHx8IG1TY3JvbGxZID09IG1heFkgKyBtT3ZlcnNjcm9sbERpc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgdnkgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KICAgICAgICAgbUxhc3RWZWxYID0gdng7CiAgICAgICAgIG1MYXN0VmVsWSA9IHZ5OwotICAgICAgICBtTGFzdFZlbG9jaXR5ID0gKGZsb2F0KSBNYXRoLmh5cG90KHZ4LCB2eSk7CisgICAgICAgIG1MYXN0VmVsb2NpdHkgPSB2ZWxvY2l0eTsKIAotICAgICAgICAvLyBubyBob3Jpem9udGFsIG92ZXJzY3JvbGwgaWYgdGhlIGNvbnRlbnQganVzdCBmaXRzCi0gICAgICAgIG1TY3JvbGxlci5mbGluZyhtU2Nyb2xsWCwgbVNjcm9sbFksIC12eCwgLXZ5LCAwLCBtYXhYLCAwLCBtYXhZLAotICAgICAgICAgICAgICAgIG1heFggPT0gMCA/IDAgOiBtT3ZlcmZsaW5nRGlzdGFuY2UsIG1PdmVyZmxpbmdEaXN0YW5jZSk7Ci0gICAgICAgIC8vIER1cmF0aW9uIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdmVsb2NpdHkuIFdpdGggcmFuZ2UgYm91bmRhcmllcyBhbmQgb3ZlcnNjcm9sbAotICAgICAgICAvLyB3ZSBtYXkgbm90IGtub3cgaG93IGxvbmcgdGhlIGZpbmFsIGFuaW1hdGlvbiB3aWxsIHRha2UuIChIZW5jZSB0aGUgZGVwcmVjYXRpb24KLSAgICAgICAgLy8gd2FybmluZyBvbiB0aGUgY2FsbCBiZWxvdy4pIEl0J3Mgbm90IGEgYmlnIGRlYWwgZm9yIHNjcm9sbCBiYXJzIGJ1dCBpZiB3ZWJjb3JlCi0gICAgICAgIC8vIHJlc3VtZXMgZHVyaW5nIHRoaXMgZWZmZWN0IHdlIHdpbGwgdGFrZSBhIHBlcmZvcm1hbmNlIGhpdC4gU2VlIGNvbXB1dGVTY3JvbGw7Ci0gICAgICAgIC8vIHdlIHJlc3VtZSB3ZWJjb3JlIHRoZXJlIHdoZW4gdGhlIGFuaW1hdGlvbiBpcyBmaW5pc2hlZC4KKyAgICAgICAgbVNjcm9sbGVyLmZsaW5nKG1TY3JvbGxYLCBtU2Nyb2xsWSwgLXZ4LCAtdnksIDAsIG1heFgsIDAsIG1heFkpOwogICAgICAgICBmaW5hbCBpbnQgdGltZSA9IG1TY3JvbGxlci5nZXREdXJhdGlvbigpOworICAgICAgICBtUHJpdmF0ZUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoUkVTVU1FX1dFQkNPUkVfUFJJT1JJVFksIHRpbWUpOwogICAgICAgICBhd2FrZW5TY3JvbGxCYXJzKHRpbWUpOwogICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIHpvb21XaXRoUHJldmlldyhmbG9hdCBzY2FsZSwgYm9vbGVhbiB1cGRhdGVUZXh0V3JhcFNjYWxlKSB7Ci0gICAgICAgIGZsb2F0IG9sZFNjYWxlID0gbUFjdHVhbFNjYWxlOwotICAgICAgICBtSW5pdGlhbFNjcm9sbFggPSBtU2Nyb2xsWDsKLSAgICAgICAgbUluaXRpYWxTY3JvbGxZID0gbVNjcm9sbFk7Ci0KLSAgICAgICAgLy8gc25hcCB0byBERUZBVUxUX1NDQUxFIGlmIGl0IGlzIGNsb3NlCi0gICAgICAgIGlmIChNYXRoLmFicyhzY2FsZSAtIG1EZWZhdWx0U2NhbGUpIDwgTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbURlZmF1bHRTY2FsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldE5ld1pvb21TY2FsZShzY2FsZSwgdXBkYXRlVGV4dFdyYXBTY2FsZSwgZmFsc2UpOwotCi0gICAgICAgIGlmIChvbGRTY2FsZSAhPSBtQWN0dWFsU2NhbGUpIHsKLSAgICAgICAgICAgIC8vIHVzZSBtWm9vbVBpY2tlclNjYWxlIHRvIHNlZSB6b29tIHByZXZpZXcgZmlyc3QKLSAgICAgICAgICAgIG1ab29tU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1JbnZJbml0aWFsWm9vbVNjYWxlID0gMS4wZiAvIG9sZFNjYWxlOwotICAgICAgICAgICAgbUludkZpbmFsWm9vbVNjYWxlID0gMS4wZiAvIG1BY3R1YWxTY2FsZTsKLSAgICAgICAgICAgIG1ab29tU2NhbGUgPSBtQWN0dWFsU2NhbGU7Ci0gICAgICAgICAgICBXZWJWaWV3Q29yZS5wYXVzZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKLSAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHZpZXcgY29udGFpbmluZyB6b29tIGNvbnRyb2xzIGkuZS4gKy8tIGJ1dHRvbnMuIFRoZSBjYWxsZXIgaXMKICAgICAgKiBpbiBjaGFyZ2Ugb2YgaW5zdGFsbGluZyB0aGlzIHZpZXcgdG8gdGhlIHZpZXcgaGllcmFyY2h5LiBUaGlzIHZpZXcgd2lsbApAQCAtNjEwNyw4MSArNjA1MywyOSBAQAogICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiVGhpcyBXZWJWaWV3IGRvZXNuJ3Qgc3VwcG9ydCB6b29tLiIpOwogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1ab29tQ29udHJvbHMgPT0gbnVsbCkgewotICAgICAgICAgICAgbVpvb21Db250cm9scyA9IGNyZWF0ZVpvb21Db250cm9scygpOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogbmVlZCB0byBiZSBzZXQgdG8gVklTSUJMRSBmaXJzdCBzbyB0aGF0IGdldE1lYXN1cmVkSGVpZ2h0KCkgaW4KLSAgICAgICAgICAgICAqIHtAbGluayAjb25TaXplQ2hhbmdlZCgpfSBjYW4gcmV0dXJuIHRoZSBtZWFzdXJlZCB2YWx1ZSBmb3IgcHJvcGVyCi0gICAgICAgICAgICAgKiBsYXlvdXQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG1ab29tQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVpvb21Db250cm9sUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotCi0gICAgICAgICAgICAgICAgICAgIC8qIERvbid0IGRpc21pc3MgdGhlIGNvbnRyb2xzIGlmIHRoZSB1c2VyIGhhcwotICAgICAgICAgICAgICAgICAgICAgKiBmb2N1cyBvbiB0aGVtLiBXYWl0IGFuZCBjaGVjayBhZ2FpbiBsYXRlci4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGlmICghbVpvb21Db250cm9scy5oYXNGb2N1cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtWm9vbUNvbnRyb2xzLmhpZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaT09NX0NPTlRST0xTX1RJTUVPVVQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVpvb21Db250cm9sczsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci5nZXRFeHRlcm5hbFpvb21QaWNrZXIoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGNyZWF0ZVpvb21Db250cm9scygpIHsKLSAgICAgICAgRXh0ZW5kZWRab29tQ29udHJvbHMgem9vbUNvbnRyb2xzID0gbmV3IEV4dGVuZGVkWm9vbUNvbnRyb2xzKG1Db250ZXh0Ci0gICAgICAgICAgICAsIG51bGwpOwotICAgICAgICB6b29tQ29udHJvbHMuc2V0T25ab29tSW5DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRpbWUgb3V0Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKLSAgICAgICAgICAgICAgICB6b29tSW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHpvb21Db250cm9scy5zZXRPblpvb21PdXRDbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRpbWUgb3V0Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKLSAgICAgICAgICAgICAgICB6b29tT3V0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gem9vbUNvbnRyb2xzOworICAgIHZvaWQgZGlzbWlzc1pvb21Db250cm9sKCkgeworICAgICAgICBtWm9vbU1hbmFnZXIuZGlzbWlzc1pvb21QaWNrZXIoKTsKKyAgICB9CisKKyAgICBmbG9hdCBnZXREZWZhdWx0Wm9vbVNjYWxlKCkgeworICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLmdldERlZmF1bHRTY2FsZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHtAbGluayBab29tQnV0dG9uc0NvbnRyb2xsZXJ9IHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFkZAotICAgICAqIGFkZGl0aW9uYWwgYnV0dG9ucyB0byB0aGUgem9vbSBjb250cm9scyB3aW5kb3cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgWm9vbUJ1dHRvbnNDb250cm9sbGVyfSB1c2VkIGJ5IHRoaXMgY2xhc3MsCi0gICAgICogICAgICAgICBvciBudWxsIGlmIGl0IGlzIHVuYXZhaWxhYmxlLgotICAgICAqIEBoaWRlCisgICAgICogQHJldHVybiBUUlVFIGlmIHRoZSBXZWJWaWV3IGNhbiBiZSB6b29tZWQgaW4uCiAgICAgICovCi0gICAgcHVibGljIFpvb21CdXR0b25zQ29udHJvbGxlciBnZXRab29tQnV0dG9uc0NvbnRyb2xsZXIoKSB7Ci0gICAgICAgIGlmIChtWm9vbUJ1dHRvbnNDb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPSBuZXcgWm9vbUJ1dHRvbnNDb250cm9sbGVyKHRoaXMpOwotICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRPblpvb21MaXN0ZW5lcihtWm9vbUxpc3RlbmVyKTsKLSAgICAgICAgICAgIC8vIFpvb21CdXR0b25zQ29udHJvbGxlciBwb3NpdGlvbnMgdGhlIGJ1dHRvbnMgYXQgdGhlIGJvdHRvbSwgYnV0IGluCi0gICAgICAgICAgICAvLyB0aGUgbWlkZGxlLiBDaGFuZ2UgdGhlaXIgbGF5b3V0IHBhcmFtZXRlcnMgc28gdGhleSBhcHBlYXIgb24gdGhlCi0gICAgICAgICAgICAvLyByaWdodC4KLSAgICAgICAgICAgIFZpZXcgY29udHJvbHMgPSBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpOwotICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMgPSBjb250cm9scy5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgICAgIGlmIChwYXJhbXMgaW5zdGFuY2VvZiBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMpIHsKLSAgICAgICAgICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMgZnJhbWVQYXJhbXMgPSAoRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKSBwYXJhbXM7Ci0gICAgICAgICAgICAgICAgZnJhbWVQYXJhbXMuZ3Jhdml0eSA9IEdyYXZpdHkuUklHSFQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ab29tQnV0dG9uc0NvbnRyb2xsZXI7CisgICAgcHVibGljIGJvb2xlYW4gY2FuWm9vbUluKCkgeworICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLmNhblpvb21JbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGUgV2ViVmlldyBjYW4gYmUgem9vbWVkIG91dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5ab29tT3V0KCkgeworICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLmNhblpvb21PdXQoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTYxODksMTUgKzYwODMsNyBAQAogICAgICAqIEByZXR1cm4gVFJVRSBpZiB6b29tIGluIHN1Y2NlZWRzLiBGQUxTRSBpZiBubyB6b29tIGNoYW5nZXMuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gem9vbUluKCkgewotICAgICAgICAvLyBUT0RPOiBhbHRlcm5hdGl2ZWx5IHdlIGNhbiBkaXNhbGxvdyB0aGlzIGR1cmluZyBkcmF3IGhpc3RvcnkgbW9kZQotICAgICAgICBzd2l0Y2hPdXREcmF3SGlzdG9yeSgpOwotICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKLSAgICAgICAgLy8gQ2VudGVyIHpvb21pbmcgdG8gdGhlIGNlbnRlciBvZiB0aGUgc2NyZWVuLgotICAgICAgICBtWm9vbUNlbnRlclggPSBnZXRWaWV3V2lkdGgoKSAqIC41ZjsKLSAgICAgICAgbVpvb21DZW50ZXJZID0gZ2V0Vmlld0hlaWdodCgpICogLjVmOwotICAgICAgICBtQW5jaG9yWCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1TY3JvbGxYKTsKLSAgICAgICAgbUFuY2hvclkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtWm9vbUNlbnRlclkgKyBtU2Nyb2xsWSk7Ci0gICAgICAgIHJldHVybiB6b29tV2l0aFByZXZpZXcobUFjdHVhbFNjYWxlICogMS4yNWYsIHRydWUpOworICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLnpvb21JbigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjIwNSwxNCArNjA5MSw3IEBACiAgICAgICogQHJldHVybiBUUlVFIGlmIHpvb20gb3V0IHN1Y2NlZWRzLiBGQUxTRSBpZiBubyB6b29tIGNoYW5nZXMuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gem9vbU91dCgpIHsKLSAgICAgICAgLy8gVE9ETzogYWx0ZXJuYXRpdmVseSB3ZSBjYW4gZGlzYWxsb3cgdGhpcyBkdXJpbmcgZHJhdyBoaXN0b3J5IG1vZGUKLSAgICAgICAgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKLSAgICAgICAgLy8gQ2VudGVyIHpvb21pbmcgdG8gdGhlIGNlbnRlciBvZiB0aGUgc2NyZWVuLgotICAgICAgICBtWm9vbUNlbnRlclggPSBnZXRWaWV3V2lkdGgoKSAqIC41ZjsKLSAgICAgICAgbVpvb21DZW50ZXJZID0gZ2V0Vmlld0hlaWdodCgpICogLjVmOwotICAgICAgICBtQW5jaG9yWCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1TY3JvbGxYKTsKLSAgICAgICAgbUFuY2hvclkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtWm9vbUNlbnRlclkgKyBtU2Nyb2xsWSk7Ci0gICAgICAgIHJldHVybiB6b29tV2l0aFByZXZpZXcobUFjdHVhbFNjYWxlICogMC44ZiwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuem9vbU91dCgpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTZWxlY3Rpb24oKSB7CkBAIC02MzEzLDcgKzYxOTIsMTQgQEAKICAgICAgICAgLy8gbUxhc3RUb3VjaFggYW5kIG1MYXN0VG91Y2hZIGFyZSB0aGUgcG9pbnQgaW4gdGhlIGN1cnJlbnQgdmlld3BvcnQKICAgICAgICAgaW50IGNvbnRlbnRYID0gdmlld1RvQ29udGVudFgoKGludCkgbUxhc3RUb3VjaFggKyBtU2Nyb2xsWCk7CiAgICAgICAgIGludCBjb250ZW50WSA9IHZpZXdUb0NvbnRlbnRZKChpbnQpIG1MYXN0VG91Y2hZICsgbVNjcm9sbFkpOwotICAgICAgICBpZiAobmF0aXZlUG9pbnRJbk5hdkNhY2hlKGNvbnRlbnRYLCBjb250ZW50WSwgbU5hdlNsb3ApKSB7CisgICAgICAgIGlmIChnZXRTZXR0aW5ncygpLnN1cHBvcnRUb3VjaE9ubHkoKSkgeworICAgICAgICAgICAgcmVtb3ZlVG91Y2hIaWdobGlnaHQoZmFsc2UpOworICAgICAgICAgICAgV2ViVmlld0NvcmUuVG91Y2hVcERhdGEgdG91Y2hVcERhdGEgPSBuZXcgV2ViVmlld0NvcmUuVG91Y2hVcERhdGEoKTsKKyAgICAgICAgICAgIC8vIHVzZSAiMCIgYXMgZ2VuZXJhdGlvbiBpZCB0byBpbmZvcm0gV2ViS2l0IHRvIHVzZSB0aGUgc2FtZSB4L3kgYXMKKyAgICAgICAgICAgIC8vIGl0IHVzZWQgd2hlbiBwcm9jZXNzaW5nIEdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMKKyAgICAgICAgICAgIHRvdWNoVXBEYXRhLm1Nb3ZlR2VuZXJhdGlvbiA9IDA7CisgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfVVAsIHRvdWNoVXBEYXRhKTsKKyAgICAgICAgfSBlbHNlIGlmIChuYXRpdmVQb2ludEluTmF2Q2FjaGUoY29udGVudFgsIGNvbnRlbnRZLCBtTmF2U2xvcCkpIHsKICAgICAgICAgICAgIFdlYlZpZXdDb3JlLk1vdGlvblVwRGF0YSBtb3Rpb25VcERhdGEgPSBuZXcgV2ViVmlld0NvcmUKICAgICAgICAgICAgICAgICAgICAgLk1vdGlvblVwRGF0YSgpOwogICAgICAgICAgICAgbW90aW9uVXBEYXRhLm1GcmFtZSA9IG5hdGl2ZUNhY2hlSGl0RnJhbWVQb2ludGVyKCk7CkBAIC02MzQxLDI3ICs2MjI3LDE2IEBACiAgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIHZpZXcgKFBsdWdpbikgaXMgZnVsbHkgdmlzaWJsZSBhbmQgbWF4aW1pemVkIGluc2lkZQogICAgICAqIHRoZSBXZWJWaWV3LgogICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BsdWdpbkZpdE9uU2NyZWVuKFZpZXdNYW5hZ2VyLkNoaWxkVmlldyB2aWV3KSB7Ci0gICAgICAgIGludCB2aWV3V2lkdGggPSBnZXRWaWV3V2lkdGgoKTsKLSAgICAgICAgaW50IHZpZXdIZWlnaHQgPSBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCk7Ci0gICAgICAgIGZsb2F0IHNjYWxlID0gTWF0aC5taW4oKGZsb2F0KSB2aWV3V2lkdGggLyB2aWV3LndpZHRoLAotICAgICAgICAgICAgICAgIChmbG9hdCkgdmlld0hlaWdodCAvIHZpZXcuaGVpZ2h0KTsKLSAgICAgICAgaWYgKHNjYWxlIDwgbU1pblpvb21TY2FsZSkgewotICAgICAgICAgICAgc2NhbGUgPSBtTWluWm9vbVNjYWxlOwotICAgICAgICB9IGVsc2UgaWYgKHNjYWxlID4gbU1heFpvb21TY2FsZSkgewotICAgICAgICAgICAgc2NhbGUgPSBtTWF4Wm9vbVNjYWxlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNYXRoLmFicyhzY2FsZSAtIG1BY3R1YWxTY2FsZSkgPCBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnRUb1ZpZXdYKHZpZXcueCkgPj0gbVNjcm9sbFgKLSAgICAgICAgICAgICAgICAgICAgJiYgY29udGVudFRvVmlld1godmlldy54ICsgdmlldy53aWR0aCkgPD0gbVNjcm9sbFgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZpZXdXaWR0aAotICAgICAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WSh2aWV3LnkpID49IG1TY3JvbGxZCi0gICAgICAgICAgICAgICAgICAgICYmIGNvbnRlbnRUb1ZpZXdZKHZpZXcueSArIHZpZXcuaGVpZ2h0KSA8PSBtU2Nyb2xsWQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmlld0hlaWdodCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBib29sZWFuIGlzUGx1Z2luRml0T25TY3JlZW4oVmlld01hbmFnZXIuQ2hpbGRWaWV3IHZpZXcpIHsKKyAgICAgICAgZmluYWwgaW50IHZpZXdXaWR0aCA9IGdldFZpZXdXaWR0aCgpOworICAgICAgICBmaW5hbCBpbnQgdmlld0hlaWdodCA9IGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKTsKKyAgICAgICAgZmxvYXQgc2NhbGUgPSBNYXRoLm1pbigoZmxvYXQpIHZpZXdXaWR0aCAvIHZpZXcud2lkdGgsIChmbG9hdCkgdmlld0hlaWdodCAvIHZpZXcuaGVpZ2h0KTsKKyAgICAgICAgc2NhbGUgPSBtWm9vbU1hbmFnZXIuY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhzY2FsZSk7CisgICAgICAgIHJldHVybiAhbVpvb21NYW5hZ2VyLndpbGxTY2FsZVRyaWdnZXJab29tKHNjYWxlKQorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRUb1ZpZXdYKHZpZXcueCkgPj0gbVNjcm9sbFgKKyAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WCh2aWV3LnggKyB2aWV3LndpZHRoKSA8PSBtU2Nyb2xsWCArIHZpZXdXaWR0aAorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRUb1ZpZXdZKHZpZXcueSkgPj0gbVNjcm9sbFkKKyAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WSh2aWV3LnkgKyB2aWV3LmhlaWdodCkgPD0gbVNjcm9sbFkgKyB2aWV3SGVpZ2h0OwogICAgIH0KIAogICAgIC8qCkBAIC02MzcwLDIyICs2MjQ1LDE5IEBACiAgICAgICogYW5pbWF0ZWQgc2Nyb2xsIHRvIGNlbnRlciBpdC4gSWYgdGhlIHpvb20gbmVlZHMgdG8gYmUgY2hhbmdlZCwgZmluZCB0aGUKICAgICAgKiB6b29tIGNlbnRlciBhbmQgZG8gYSBzbW9vdGggem9vbSB0cmFuc2l0aW9uLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjZW50ZXJGaXRSZWN0KGludCBkb2NYLCBpbnQgZG9jWSwgaW50IGRvY1dpZHRoLCBpbnQgZG9jSGVpZ2h0KSB7CisgICAgdm9pZCBjZW50ZXJGaXRSZWN0KGludCBkb2NYLCBpbnQgZG9jWSwgaW50IGRvY1dpZHRoLCBpbnQgZG9jSGVpZ2h0KSB7CiAgICAgICAgIGludCB2aWV3V2lkdGggPSBnZXRWaWV3V2lkdGgoKTsKICAgICAgICAgaW50IHZpZXdIZWlnaHQgPSBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCk7CiAgICAgICAgIGZsb2F0IHNjYWxlID0gTWF0aC5taW4oKGZsb2F0KSB2aWV3V2lkdGggLyBkb2NXaWR0aCwgKGZsb2F0KSB2aWV3SGVpZ2h0CiAgICAgICAgICAgICAgICAgLyBkb2NIZWlnaHQpOwotICAgICAgICBpZiAoc2NhbGUgPCBtTWluWm9vbVNjYWxlKSB7Ci0gICAgICAgICAgICBzY2FsZSA9IG1NaW5ab29tU2NhbGU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2NhbGUgPiBtTWF4Wm9vbVNjYWxlKSB7Ci0gICAgICAgICAgICBzY2FsZSA9IG1NYXhab29tU2NhbGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE1hdGguYWJzKHNjYWxlIC0gbUFjdHVhbFNjYWxlKSA8IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7CisgICAgICAgIHNjYWxlID0gbVpvb21NYW5hZ2VyLmNvbXB1dGVTY2FsZVdpdGhMaW1pdHMoc2NhbGUpOworICAgICAgICBpZiAoIW1ab29tTWFuYWdlci53aWxsU2NhbGVUcmlnZ2VyWm9vbShzY2FsZSkpIHsKICAgICAgICAgICAgIHBpblNjcm9sbFRvKGNvbnRlbnRUb1ZpZXdYKGRvY1ggKyBkb2NXaWR0aCAvIDIpIC0gdmlld1dpZHRoIC8gMiwKICAgICAgICAgICAgICAgICAgICAgY29udGVudFRvVmlld1koZG9jWSArIGRvY0hlaWdodCAvIDIpIC0gdmlld0hlaWdodCAvIDIsCiAgICAgICAgICAgICAgICAgICAgIHRydWUsIDApOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmxvYXQgb2xkU2NyZWVuWCA9IGRvY1ggKiBtQWN0dWFsU2NhbGUgLSBtU2Nyb2xsWDsKKyAgICAgICAgICAgIGZsb2F0IGFjdHVhbFNjYWxlID0gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCk7CisgICAgICAgICAgICBmbG9hdCBvbGRTY3JlZW5YID0gZG9jWCAqIGFjdHVhbFNjYWxlIC0gbVNjcm9sbFg7CiAgICAgICAgICAgICBmbG9hdCByZWN0Vmlld1ggPSBkb2NYICogc2NhbGU7CiAgICAgICAgICAgICBmbG9hdCByZWN0Vmlld1dpZHRoID0gZG9jV2lkdGggKiBzY2FsZTsKICAgICAgICAgICAgIGZsb2F0IG5ld01heFdpZHRoID0gbUNvbnRlbnRXaWR0aCAqIHNjYWxlOwpAQCAtNjM5Niw5ICs2MjY4LDkgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U2NyZWVuWCA+IChuZXdNYXhXaWR0aCAtIHJlY3RWaWV3WCAtIHJlY3RWaWV3V2lkdGgpKSB7CiAgICAgICAgICAgICAgICAgbmV3U2NyZWVuWCA9IHZpZXdXaWR0aCAtIChuZXdNYXhXaWR0aCAtIHJlY3RWaWV3WCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtWm9vbUNlbnRlclggPSAob2xkU2NyZWVuWCAqIHNjYWxlIC0gbmV3U2NyZWVuWCAqIG1BY3R1YWxTY2FsZSkKLSAgICAgICAgICAgICAgICAgICAgLyAoc2NhbGUgLSBtQWN0dWFsU2NhbGUpOwotICAgICAgICAgICAgZmxvYXQgb2xkU2NyZWVuWSA9IGRvY1kgKiBtQWN0dWFsU2NhbGUgKyBnZXRUaXRsZUhlaWdodCgpCisgICAgICAgICAgICBmbG9hdCB6b29tQ2VudGVyWCA9IChvbGRTY3JlZW5YICogc2NhbGUgLSBuZXdTY3JlZW5YICogYWN0dWFsU2NhbGUpCisgICAgICAgICAgICAgICAgICAgIC8gKHNjYWxlIC0gYWN0dWFsU2NhbGUpOworICAgICAgICAgICAgZmxvYXQgb2xkU2NyZWVuWSA9IGRvY1kgKiBhY3R1YWxTY2FsZSArIGdldFRpdGxlSGVpZ2h0KCkKICAgICAgICAgICAgICAgICAgICAgLSBtU2Nyb2xsWTsKICAgICAgICAgICAgIGZsb2F0IHJlY3RWaWV3WSA9IGRvY1kgKiBzY2FsZSArIGdldFRpdGxlSGVpZ2h0KCk7CiAgICAgICAgICAgICBmbG9hdCByZWN0Vmlld0hlaWdodCA9IGRvY0hlaWdodCAqIHNjYWxlOwpAQCAtNjQxMCwxMDkgKzYyODIsMTAgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U2NyZWVuWSA+IChuZXdNYXhIZWlnaHQgLSByZWN0Vmlld1kgLSByZWN0Vmlld0hlaWdodCkpIHsKICAgICAgICAgICAgICAgICBuZXdTY3JlZW5ZID0gdmlld0hlaWdodCAtIChuZXdNYXhIZWlnaHQgLSByZWN0Vmlld1kpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbVpvb21DZW50ZXJZID0gKG9sZFNjcmVlblkgKiBzY2FsZSAtIG5ld1NjcmVlblkgKiBtQWN0dWFsU2NhbGUpCi0gICAgICAgICAgICAgICAgICAgIC8gKHNjYWxlIC0gbUFjdHVhbFNjYWxlKTsKLSAgICAgICAgICAgIHpvb21XaXRoUHJldmlldyhzY2FsZSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBkaXNtaXNzWm9vbUNvbnRyb2woKSB7Ci0gICAgICAgIGlmIChtV2ViVmlld0NvcmUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gbWF5YmUgY2FsbGVkIGFmdGVyIFdlYlZpZXcncyBkZXN0cm95KCkuIEFzIHdlIGNhbid0IGdldCBzZXR0aW5ncywKLSAgICAgICAgICAgIC8vIGp1c3QgaGlkZSB6b29tIGNvbnRyb2wgZm9yIGJvdGggc3R5bGVzLgotICAgICAgICAgICAgaWYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVpvb21Db250cm9scyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVpvb21Db250cm9scy5oaWRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpOwotICAgICAgICBpZiAoc2V0dGluZ3MuZ2V0QnVpbHRJblpvb21Db250cm9scygpKSB7Ci0gICAgICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtWm9vbUNvbnRyb2xSdW5uYWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVpvb21Db250cm9scyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVpvb21Db250cm9scy5oaWRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSdWxlIGZvciBkb3VibGUgdGFwOgotICAgIC8vIDEuIGlmIHRoZSBjdXJyZW50IHNjYWxlIGlzIG5vdCBzYW1lIGFzIHRoZSB0ZXh0IHdyYXAgc2NhbGUgYW5kIGxheW91dAotICAgIC8vICAgIGFsZ29yaXRobSBpcyBOQVJST1dfQ09MVU1OUywgZml0IHRvIGNvbHVtbjsKLSAgICAvLyAyLiBpZiB0aGUgY3VycmVudCBzdGF0ZSBpcyBub3Qgb3ZlcnZpZXcgbW9kZSwgY2hhbmdlIHRvIG92ZXJ2aWV3IG1vZGU7Ci0gICAgLy8gMy4gaWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgb3ZlcnZpZXcgbW9kZSwgY2hhbmdlIHRvIGRlZmF1bHQgc2NhbGUuCi0gICAgcHJpdmF0ZSB2b2lkIGRvRG91YmxlVGFwKCkgewotICAgICAgICBpZiAobVdlYlZpZXdDb3JlLmdldFNldHRpbmdzKCkuZ2V0VXNlV2lkZVZpZXdQb3J0KCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtWm9vbUNlbnRlclggPSBtTGFzdFRvdWNoWDsKLSAgICAgICAgbVpvb21DZW50ZXJZID0gbUxhc3RUb3VjaFk7Ci0gICAgICAgIG1BbmNob3JYID0gdmlld1RvQ29udGVudFgoKGludCkgbVpvb21DZW50ZXJYICsgbVNjcm9sbFgpOwotICAgICAgICBtQW5jaG9yWSA9IHZpZXdUb0NvbnRlbnRZKChpbnQpIG1ab29tQ2VudGVyWSArIG1TY3JvbGxZKTsKLSAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpOwotICAgICAgICBzZXR0aW5ncy5zZXREb3VibGVUYXBUb2FzdENvdW50KDApOwotICAgICAgICAvLyByZW1vdmUgdGhlIHpvb20gY29udHJvbCBhZnRlciBkb3VibGUgdGFwCi0gICAgICAgIGRpc21pc3Nab29tQ29udHJvbCgpOwotICAgICAgICBWaWV3TWFuYWdlci5DaGlsZFZpZXcgcGx1Z2luID0gbVZpZXdNYW5hZ2VyLmhpdFRlc3QobUFuY2hvclgsIG1BbmNob3JZKTsKLSAgICAgICAgaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoaXNQbHVnaW5GaXRPblNjcmVlbihwbHVnaW4pKSB7Ci0gICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBGb3JjZSB0aGUgdGl0bGViYXIgZnVsbHkgcmV2ZWFsIGluIG92ZXJ2aWV3IG1vZGUKLSAgICAgICAgICAgICAgICBpZiAobVNjcm9sbFkgPCBnZXRUaXRsZUhlaWdodCgpKSBtU2Nyb2xsWSA9IDA7Ci0gICAgICAgICAgICAgICAgem9vbVdpdGhQcmV2aWV3KChmbG9hdCkgZ2V0Vmlld1dpZHRoKCkgLyBtWm9vbU92ZXJ2aWV3V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgY2VudGVyRml0UmVjdChwbHVnaW4ueCwgcGx1Z2luLnksIHBsdWdpbi53aWR0aCwgcGx1Z2luLmhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiB6b29tVG9EZWZhdWx0ID0gZmFsc2U7Ci0gICAgICAgIGlmICgoc2V0dGluZ3MuZ2V0TGF5b3V0QWxnb3JpdGhtKCkgPT0gV2ViU2V0dGluZ3MuTGF5b3V0QWxnb3JpdGhtLk5BUlJPV19DT0xVTU5TKQotICAgICAgICAgICAgICAgICYmIChNYXRoLmFicyhtQWN0dWFsU2NhbGUgLSBtVGV4dFdyYXBTY2FsZSkgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpKSB7Ci0gICAgICAgICAgICBzZXROZXdab29tU2NhbGUobUFjdHVhbFNjYWxlLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgICAgIGZsb2F0IG92ZXJ2aWV3U2NhbGUgPSAoZmxvYXQpIGdldFZpZXdXaWR0aCgpIC8gbVpvb21PdmVydmlld1dpZHRoOwotICAgICAgICAgICAgaWYgKE1hdGguYWJzKG1BY3R1YWxTY2FsZSAtIG92ZXJ2aWV3U2NhbGUpIDwgTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFtSW5ab29tT3ZlcnZpZXcpIHsKLSAgICAgICAgICAgIGZsb2F0IG5ld1NjYWxlID0gKGZsb2F0KSBnZXRWaWV3V2lkdGgoKSAvIG1ab29tT3ZlcnZpZXdXaWR0aDsKLSAgICAgICAgICAgIGlmIChNYXRoLmFicyhtQWN0dWFsU2NhbGUgLSBuZXdTY2FsZSkgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vIEZvcmNlIHRoZSB0aXRsZWJhciBmdWxseSByZXZlYWwgaW4gb3ZlcnZpZXcgbW9kZQotICAgICAgICAgICAgICAgIGlmIChtU2Nyb2xsWSA8IGdldFRpdGxlSGVpZ2h0KCkpIG1TY3JvbGxZID0gMDsKLSAgICAgICAgICAgICAgICB6b29tV2l0aFByZXZpZXcobmV3U2NhbGUsIHRydWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChNYXRoLmFicyhtQWN0dWFsU2NhbGUgLSBtRGVmYXVsdFNjYWxlKSA+PSBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgewotICAgICAgICAgICAgICAgIHpvb21Ub0RlZmF1bHQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgem9vbVRvRGVmYXVsdCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHpvb21Ub0RlZmF1bHQpIHsKLSAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotICAgICAgICAgICAgaW50IGxlZnQgPSBuYXRpdmVHZXRCbG9ja0xlZnRFZGdlKG1BbmNob3JYLCBtQW5jaG9yWSwgbUFjdHVhbFNjYWxlKTsKLSAgICAgICAgICAgIGlmIChsZWZ0ICE9IE5PX0xFRlRFREdFKSB7Ci0gICAgICAgICAgICAgICAgLy8gYWRkIGEgNXB0IHBhZGRpbmcgdG8gdGhlIGxlZnQgZWRnZS4KLSAgICAgICAgICAgICAgICBpbnQgdmlld0xlZnQgPSBjb250ZW50VG9WaWV3WChsZWZ0IDwgNSA/IDAgOiAobGVmdCAtIDUpKQotICAgICAgICAgICAgICAgICAgICAgICAgLSBtU2Nyb2xsWDsKLSAgICAgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgdGhlIHpvb20gY2VudGVyIHNvIHRoYXQgdGhlIG5ldyBzY3JvbGwgeCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgLy8gb24gdGhlIGxlZnQgZWRnZS4KLSAgICAgICAgICAgICAgICBpZiAodmlld0xlZnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IHZpZXdMZWZ0ICogbURlZmF1bHRTY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKG1EZWZhdWx0U2NhbGUgLSBtQWN0dWFsU2NhbGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjcm9sbEJ5KHZpZXdMZWZ0LCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB6b29tV2l0aFByZXZpZXcobURlZmF1bHRTY2FsZSwgdHJ1ZSk7CisgICAgICAgICAgICBmbG9hdCB6b29tQ2VudGVyWSA9IChvbGRTY3JlZW5ZICogc2NhbGUgLSBuZXdTY3JlZW5ZICogYWN0dWFsU2NhbGUpCisgICAgICAgICAgICAgICAgICAgIC8gKHNjYWxlIC0gYWN0dWFsU2NhbGUpOworICAgICAgICAgICAgbVpvb21NYW5hZ2VyLnNldFpvb21DZW50ZXIoem9vbUNlbnRlclgsIHpvb21DZW50ZXJZKTsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5zdGFydFpvb21BbmltYXRpb24oc2NhbGUsIGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjUyNCw2ICs2Mjk3LDkgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RGb2N1cyhpbnQgZGlyZWN0aW9uLCBSZWN0IHByZXZpb3VzbHlGb2N1c2VkUmVjdCkgeworICAgICAgICAvLyBGSVhNRTogSWYgYSBzdWJ3aW5kb3cgaXMgc2hvd2luZyBmaW5kLCBhbmQgdGhlIHVzZXIgdG91Y2hlcyB0aGUKKyAgICAgICAgLy8gYmFja2dyb3VuZCB3aW5kb3csIGl0IGNhbiBzdGVhbCBmb2N1cy4KKyAgICAgICAgaWYgKG1GaW5kSXNVcCkgcmV0dXJuIGZhbHNlOwogICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwogICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpKSB7CiAgICAgICAgICAgICByZXN1bHQgPSBtV2ViVGV4dFZpZXcucmVxdWVzdEZvY3VzKGRpcmVjdGlvbiwKQEAgLTY2MTEsNiArNjM4NywxMiBAQAogICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RDaGlsZFJlY3RhbmdsZU9uU2NyZWVuKFZpZXcgY2hpbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdCByZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW1tZWRpYXRlKSB7CisgICAgICAgIC8vIGRvbid0IHNjcm9sbCB3aGlsZSBpbiB6b29tIGFuaW1hdGlvbi4gV2hlbiBpdCBpcyBkb25lLCB3ZSB3aWxsIGFkanVzdAorICAgICAgICAvLyB0aGUgbmVjZXNzYXJ5IGNvbXBvbmVudHMgKGUuZy4sIFdlYlRleHRWaWV3IGlmIGl0IGlzIGluIGVkaXRpbmcgbW9kZSkKKyAgICAgICAgaWYgKG1ab29tTWFuYWdlci5pc0ZpeGVkTGVuZ3RoQW5pbWF0aW9uSW5Qcm9ncmVzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKwogICAgICAgICByZWN0Lm9mZnNldChjaGlsZC5nZXRMZWZ0KCkgLSBjaGlsZC5nZXRTY3JvbGxYKCksCiAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0VG9wKCkgLSBjaGlsZC5nZXRTY3JvbGxZKCkpOwogCkBAIC02NzUzLDcgKzY1MzUsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIFNXSVRDSF9UT19TSE9SVFBSRVNTOiB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX0lOSVRfTU9ERSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QcmV2ZW50RGVmYXVsdCAhPSBQUkVWRU5UX0RFRkFVTFRfWUVTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1QcmV2ZW50RGVmYXVsdCAhPSBQUkVWRU5UX0RFRkFVTFRfWUVTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX1NIT1JUUFJFU1NfU1RBUlRfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTZWxlY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC02NzY3LDI2ICs2NTUwLDI1IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIFNXSVRDSF9UT19MT05HUFJFU1M6IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKGluRnVsbFNjcmVlbk1vZGUoKSB8fCBtRGVmZXJUb3VjaFByb2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IG5ldyBUb3VjaEV2ZW50RGF0YSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1BY3Rpb24gPSBXZWJWaWV3Q29yZS5BQ1RJT05fTE9OR1BSRVNTOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1YID0gdmlld1RvQ29udGVudFgoKGludCkgbUxhc3RUb3VjaFggKyBtU2Nyb2xsWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtTGFzdFRvdWNoWSArIG1TY3JvbGxZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tUG9pbnRzID0gbmV3IFBvaW50WzFdOworICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1Qb2ludHNbMF0gPSBuZXcgUG9pbnQodmlld1RvQ29udGVudFgoKGludCkgbUxhc3RUb3VjaFggKyBtU2Nyb2xsWCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3VG9Db250ZW50WSgoaW50KSBtTGFzdFRvdWNoWSArIG1TY3JvbGxZKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXRhU3RhdGUgZm9yIGxvbmcgcHJlc3MgaXMgdHJpY2t5LiBTaG91bGQgaXQgYmUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZSB3aGVuIHRoZSBwcmVzcyBzdGFydGVkIG9yIHdoZW4gdGhlIHByZXNzIHdhcwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsZWFzZWQ/IE9yIHNvbWUgaW50ZXJtZWRpYXJ5IGtleSBzdGF0ZT8gRm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW1wbGljaXR5IGZvciBub3csIHdlIGRvbid0IHNldCBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tTWV0YVN0YXRlID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tUmVwcm9jZXNzID0gbURlZmVyVG91Y2hQcm9jZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWZlclRvdWNoUHJvY2VzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1ggPSBtTGFzdFRvdWNoWDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdZID0gbUxhc3RUb3VjaFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVByZXZlbnREZWZhdWx0ICE9IFBSRVZFTlRfREVGQVVMVF9ZRVMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9ET05FX01PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtTG9uZ0NsaWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkV2ViVGV4dFZpZXcoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC02ODE5LDcwICs2NjAxLDM2IEBACiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ29udGVudFNjcm9sbFRvKG1zZy5hcmcxLCBtc2cuYXJnMik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFX1pPT01fUkFOR0U6IHsKLSAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUuUmVzdG9yZVN0YXRlIHJlc3RvcmVTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKFdlYlZpZXdDb3JlLlJlc3RvcmVTdGF0ZSkgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIHZpZXdTdGF0ZSA9IChXZWJWaWV3Q29yZS5WaWV3U3RhdGUpIG1zZy5vYmo7CiAgICAgICAgICAgICAgICAgICAgIC8vIG1TY3JvbGxYIGNvbnRhaW5zIHRoZSBuZXcgbWluUHJlZldpZHRoCi0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVpvb21SYW5nZShyZXN0b3JlU3RhdGUsIGdldFZpZXdXaWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVTdGF0ZS5tU2Nyb2xsWCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBtWm9vbU1hbmFnZXIudXBkYXRlWm9vbVJhbmdlKHZpZXdTdGF0ZSwgZ2V0Vmlld1dpZHRoKCksIHZpZXdTdGF0ZS5tU2Nyb2xsWCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFJFUExBQ0VfQkFTRV9DT05URU5UOiB7CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVJlcGxhY2VCYXNlQ29udGVudChtc2cuYXJnMSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIE5FV19QSUNUVVJFX01TR19JRDogewotICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSd2ZSBwcmV2aW91c2x5IGRlbGF5ZWQgZGVsZXRpbmcgYSByb290Ci0gICAgICAgICAgICAgICAgICAgIC8vIGxheWVyLCBkbyBpdCBub3cuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtRGVsYXllZERlbGV0ZVJvb3RMYXllcikgewotICAgICAgICAgICAgICAgICAgICAgICAgbURlbGF5ZWREZWxldGVSb290TGF5ZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNldFJvb3RMYXllcigwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3Q29yZS5nZXRTZXR0aW5ncygpOwogICAgICAgICAgICAgICAgICAgICAvLyBjYWxsZWQgZm9yIG5ldyBjb250ZW50Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB2aWV3V2lkdGggPSBnZXRWaWV3V2lkdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgV2ViVmlld0NvcmUuRHJhd0RhdGEgZHJhdyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdlYlZpZXdDb3JlLkRyYXdEYXRhKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBXZWJWaWV3Q29yZS5EcmF3RGF0YSBkcmF3ID0gKFdlYlZpZXdDb3JlLkRyYXdEYXRhKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICBuYXRpdmVTZXRCYXNlTGF5ZXIoZHJhdy5tQmFzZUxheWVyKTsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgUG9pbnQgdmlld1NpemUgPSBkcmF3Lm1WaWV3UG9pbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlV2lkZVZpZXdwb3J0ID0gc2V0dGluZ3MuZ2V0VXNlV2lkZVZpZXdQb3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLlJlc3RvcmVTdGF0ZSByZXN0b3JlU3RhdGUgPSBkcmF3Lm1SZXN0b3JlU3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzUmVzdG9yZVN0YXRlID0gcmVzdG9yZVN0YXRlICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYXNSZXN0b3JlU3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVpvb21SYW5nZShyZXN0b3JlU3RhdGUsIHZpZXdTaXplLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXcubU1pblByZWZXaWR0aCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSB2aWV3U3RhdGUgPSBkcmF3Lm1WaWV3U3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQaWN0dXJlQWZ0ZXJGaXJzdExheW91dCA9IHZpZXdTdGF0ZSAhPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNQaWN0dXJlQWZ0ZXJGaXJzdExheW91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGxhc3Qgc2VudCBkYXRhIGhlcmUgc2luY2UgZGVhbGluZyB3aXRoIG5ldyBwYWdlLgorICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RXaWR0aFNlbnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLm9uRmlyc3RMYXlvdXQoZHJhdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1EcmF3SGlzdG9yeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jbml0aWFsU2NhbGVJblBlcmNlbnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShtSW5pdGlhbFNjYWxlSW5QZXJjZW50IC8gMTAwLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxTY2FsZUluUGVyY2VudCAhPSBtVGV4dFdyYXBTY2FsZSAqIDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IHJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKHJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSB1c2VXaWRlVmlld3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHNldHRpbmdzLmdldExvYWRXaXRoT3ZlcnZpZXdNb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUluWm9vbU92ZXJ2aWV3KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IChmbG9hdCkgdmlld1dpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBERUZBVUxUX1ZJRVdQT1JUX1dJRFRIOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSByZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKHNjYWxlLCBNYXRoLmFicyhzY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtVGV4dFdyYXBTY2FsZSkgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnRTY3JvbGxUbyhyZXN0b3JlU3RhdGUubVNjcm9sbFgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVTdGF0ZS5tU2Nyb2xsWSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29udGVudFNjcm9sbFRvKHZpZXdTdGF0ZS5tU2Nyb2xsWCwgdmlld1N0YXRlLm1TY3JvbGxZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcyB3ZSBhcmUgb24gYSBuZXcgcGFnZSwgcmVtb3ZlIHRoZSBXZWJUZXh0Vmlldy4gVGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5lY2Vzc2FyeSBmb3IgcGFnZSBsb2FkcyBkcml2ZW4gYnkgd2Via2l0LCBhbmQgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJ0aWN1bGFyIHdoZW4gdGhlIHVzZXIgd2FzIG9uIGEgcGFzc3dvcmQgZmllbGQsIHNvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdlYlRleHRWaWV3IHdhcyB2aXNpYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHpvb20gYnV0dG9ucyBhcyB0aGUgc2NhbGUgY2FuIGJlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlWm9vbUJ1dHRvbnNFbmFibGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICAvLyBXZSB1cGRhdGUgdGhlIGxheW91dCAoaS5lLiByZXF1ZXN0IGEgbGF5b3V0IGZyb20gdGhlCiAgICAgICAgICAgICAgICAgICAgIC8vIHZpZXcgc3lzdGVtKSBpZiB0aGUgbGFzdCB2aWV3IHNpemUgdGhhdCB3ZSBzZW50IHRvCiAgICAgICAgICAgICAgICAgICAgIC8vIFdlYkNvcmUgbWF0Y2hlcyB0aGUgdmlldyBzaXplIG9mIHRoZSBwaWN0dXJlIHdlIGp1c3QKQEAgLTY4OTAsNDUgKzY2MzgsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB1cGRhdGVMYXlvdXQgPSB2aWV3U2l6ZS54ID09IG1MYXN0V2lkdGhTZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdmlld1NpemUueSA9PSBtTGFzdEhlaWdodFNlbnQ7CiAgICAgICAgICAgICAgICAgICAgIHJlY29yZE5ld0NvbnRlbnRTaXplKGRyYXcubVdpZHRoSGVpZ2h0LngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy5tV2lkdGhIZWlnaHQueQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKG1GaW5kSXNVcCA/IG1GaW5kSGVpZ2h0IDogMCksIHVwZGF0ZUxheW91dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy5tV2lkdGhIZWlnaHQueSwgdXBkYXRlTGF5b3V0KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFJlY3QgYiA9IGRyYXcubUludmFsUmVnaW9uLmdldEJvdW5kcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiTkVXX1BJQ1RVUkVfTVNHX0lEIHsiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5sZWZ0KyIsIitiLnRvcCsiLCIrYi5yaWdodCsiLCIrYi5ib3R0b20rIn0iKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlQ29udGVudFJlY3QoZHJhdy5tSW52YWxSZWdpb24uZ2V0Qm91bmRzKCkpOworCiAgICAgICAgICAgICAgICAgICAgIGlmIChtUGljdHVyZUxpc3RlbmVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1QaWN0dXJlTGlzdGVuZXIub25OZXdQaWN0dXJlKFdlYlZpZXcudGhpcywgY2FwdHVyZVBpY3R1cmUoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVdpZGVWaWV3cG9ydCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGltaXQgbVpvb21PdmVydmlld1dpZHRoIHVwcGVyIGJvdW5kIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzTWF4Vmlld3BvcnRXaWR0aCBzbyB0aGF0IGlmIHRoZSBwYWdlIGRvZXNuJ3QgYmVoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZWxsLCB0aGUgV2ViVmlldyB3b24ndCBnbyBpbnNhbmUuIGxpbWl0IHRoZSBsb3dlcgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm91bmQgdG8gbWF0Y2ggdGhlIGRlZmF1bHQgc2NhbGUgZm9yIG1vYmlsZSBzaXRlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1ab29tT3ZlcnZpZXdXaWR0aCA9IE1hdGgubWluKHNNYXhWaWV3cG9ydFdpZHRoLCBNYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXgoKGludCkgKHZpZXdXaWR0aCAvIG1EZWZhdWx0U2NhbGUpLCBNYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heChkcmF3Lm1NaW5QcmVmV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Lm1WaWV3UG9pbnQueCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIW1NaW5ab29tU2NhbGVGaXhlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IChmbG9hdCkgdmlld1dpZHRoIC8gbVpvb21PdmVydmlld1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbURyYXdIaXN0b3J5ICYmIG1Jblpvb21PdmVydmlldykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZml0IHRoZSBjb250ZW50IHdpZHRoIHRvIHRoZSBjdXJyZW50IHZpZXcuIElnbm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJvdW5kaW5nIGVycm9yIGNhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoKHZpZXdXaWR0aCAqIG1JbnZBY3R1YWxTY2FsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtWm9vbU92ZXJ2aWV3V2lkdGgpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZSgoZmxvYXQpIHZpZXdXaWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBtWm9vbU92ZXJ2aWV3V2lkdGgsIE1hdGguYWJzKG1BY3R1YWxTY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtVGV4dFdyYXBTY2FsZSkgPCBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgem9vbSBpbmZvcm1hdGlvbiBiYXNlZCBvbiB0aGUgbmV3IHBpY3R1cmUKKyAgICAgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLm9uTmV3UGljdHVyZShkcmF3KTsKKwogICAgICAgICAgICAgICAgICAgICBpZiAoZHJhdy5tRm9jdXNTaXplQ2hhbmdlZCAmJiBpbkVkaXRpbmdNb2RlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb2N1c1NpemVDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUmVzdG9yZVN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1BpY3R1cmVBZnRlckZpcnN0TGF5b3V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmlld01hbmFnZXIucG9zdFJlYWR5VG9EcmF3QWxsKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02OTYyLDE2ICs2NjkwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9LRVlCT0FSRF9XSVRIX1NFTEVDVElPTl9NU0dfSUQ6CiAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTb2Z0S2V5Ym9hcmQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBVUERBVEVfVEVYVF9TRUxFQ1RJT05fTVNHX0lECisgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfVEVYVF9TRUxFQ1RJT05fTVNHX0lEOgogICAgICAgICAgICAgICAgICAgICB1cGRhdGVUZXh0U2VsZWN0aW9uRnJvbU1lc3NhZ2UobXNnLmFyZzEsIG1zZy5hcmcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXZWJWaWV3Q29yZS5UZXh0U2VsZWN0aW9uRGF0YSkgbXNnLm9iaik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFX1RFWFRfU0VMRUNUSU9OX01TR19JRDoKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm8gdGV4dGZpZWxkIHdhcyBpbiBmb2N1cywgYW5kIHRoZSB1c2VyIHRvdWNoZWQgb25lLAotICAgICAgICAgICAgICAgICAgICAvLyBjYXVzaW5nIGl0IHRvIHNlbmQgdGhpcyBtZXNzYWdlLCB0aGVuIFdlYlRleHRWaWV3IGhhcyBub3QKLSAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBzZXQgdXAgeWV0LiAgUmVidWlsZCBpdCBzbyBpdCBjYW4gc2V0IGl0cyBzZWxlY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgIHJlYnVpbGRXZWJUZXh0VmlldygpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVUZXh0U2VsZWN0aW9uRnJvbU1lc3NhZ2UobXNnLmFyZzEsIG1zZy5hcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXZWJWaWV3Q29yZS5UZXh0U2VsZWN0aW9uRGF0YSkgbXNnLm9iaik7CisgICAgICAgICAgICAgICAgY2FzZSBGT1JNX0RJRF9CTFVSOgorICAgICAgICAgICAgICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVdlYlRleHRWaWV3LmlzU2FtZVRleHRGaWVsZChtc2cuYXJnMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVTb2Z0S2V5Ym9hcmQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFJFVFVSTl9MQUJFTDoKICAgICAgICAgICAgICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKQpAQCAtNjk4NywyMCArNjcxNSwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTU9WRV9PVVRfT0ZfUExVR0lOOgorICAgICAgICAgICAgICAgIGNhc2UgVU5IQU5ETEVEX05BVl9LRVk6CiAgICAgICAgICAgICAgICAgICAgIG5hdkhhbmRsZWRLZXkobXNnLmFyZzEsIDEsIGZhbHNlLCAwKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfVEVYVF9FTlRSWV9NU0dfSUQ6CiAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgc2VudCBhZnRlciBmaW5pc2hpbmcgcmVzaXplIGluIFdlYlZpZXdDb3JlLiBNYWtlCiAgICAgICAgICAgICAgICAgICAgIC8vIHN1cmUgdGhlIHRleHQgZWRpdCBib3ggaXMgc3RpbGwgb24gdGhlICBzY3JlZW4uCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiBuYXRpdmVDdXJzb3JJc1RleHRJbnB1dCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVGV4dFZpZXcuYnJpbmdJbnRvVmlldygpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmVidWlsZFdlYlRleHRWaWV3KCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBDTEVBUl9URVhUX0VOVFJZOgotICAgICAgICAgICAgICAgICAgICBjbGVhclRleHRFbnRyeShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgSU5WQUxfUkVDVF9NU0dfSUQ6IHsKICAgICAgICAgICAgICAgICAgICAgUmVjdCByID0gKFJlY3QpbXNnLm9iajsKQEAgLTcwMTMsMjMgKzY3NDAsNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIElNTUVESUFURV9SRVBBSU5UX01TR19JRDogewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFNFVF9ST09UX0xBWUVSX01TR19JRDogewotICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSBtc2cuYXJnMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTnVsbCBpbmRpY2F0ZXMgZGVsZXRpbmcgdGhlIG9sZCBsYXllciwgYnV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBhY3R1YWxseSBkbyBzbyB1bnRpbCB3ZSd2ZSBnb3QgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXcgcGFnZSB0byBkaXNwbGF5LgotICAgICAgICAgICAgICAgICAgICAgICAgbURlbGF5ZWREZWxldGVSb290TGF5ZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbURlbGF5ZWREZWxldGVSb290TGF5ZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNldFJvb3RMYXllcihtc2cuYXJnMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9GT1JNX0RBVEE6CiAgICAgICAgICAgICAgICAgICAgIEF1dG9Db21wbGV0ZUFkYXB0ZXIgYWRhcHRlciA9IChBdXRvQ29tcGxldGVBZGFwdGVyKSBtc2cub2JqOwogICAgICAgICAgICAgICAgICAgICBpZiAobVdlYlRleHRWaWV3LmlzU2FtZVRleHRGaWVsZChtc2cuYXJnMSkpIHsKQEAgLTcwNzMsNDMgKzY3ODMsNDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmVudERlZmF1bHQgPSBtc2cuYXJnMiA9PSAxID8gUFJFVkVOVF9ERUZBVUxUX1lFUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQUkVWRU5UX0RFRkFVTFRfTk87CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVByZXZlbnREZWZhdWx0ID09IFBSRVZFTlRfREVGQVVMVF9ZRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdobGlnaHRSZWdpb24uc2V0RW1wdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtc2cuYXJnMiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGRlZmF1bHQgaXMgbm90IGNhbGxlZCBpbiBXZWJDb3JlLCBzbyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgbmVlZHMgdG8gYmUgcmVwcm9jZXNzZWQgaW4gVUkKICAgICAgICAgICAgICAgICAgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IChUb3VjaEV2ZW50RGF0YSkgbXNnLm9iajsKICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGVkLm1BY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hYID0gdGVkLm1WaWV3WDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWSA9IHRlZC5tVmlld1k7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFggPSBjb250ZW50VG9WaWV3WCh0ZWQubVBvaW50c1swXS54KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFkgPSBjb250ZW50VG9WaWV3WSh0ZWQubVBvaW50c1swXS55KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlclRvdWNoTW9kZSA9IFRPVUNIX0lOSVRfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBzbmFwcGluZyBpbiBkZWZlciBwcm9jZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4ID0gY29udGVudFRvVmlld1godGVkLm1Qb2ludHNbMF0ueCkgLSBtU2Nyb2xsWDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHkgPSBjb250ZW50VG9WaWV3WSh0ZWQubVBvaW50c1swXS55KSAtIG1TY3JvbGxZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobURlZmVyVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTU9ERSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVyVG91Y2hNb2RlID0gVE9VQ0hfRFJBR19NT0RFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWCA9IHRlZC5tVmlld1g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hZID0gdGVkLm1WaWV3WTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFggPSB4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWSA9IHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydERyYWcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGFYID0gcGluTG9jWCgoaW50KSAobVNjcm9sbFgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1MYXN0RGVmZXJUb3VjaFggLSB0ZWQubVZpZXdYKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1MYXN0RGVmZXJUb3VjaFggLSB4KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1TY3JvbGxYOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGFZID0gcGluTG9jWSgoaW50KSAobVNjcm9sbFkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1MYXN0RGVmZXJUb3VjaFkgLSB0ZWQubVZpZXdZKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1MYXN0RGVmZXJUb3VjaFkgLSB5KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1TY3JvbGxZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0RyYWcoZGVsdGFYLCBkZWx0YVkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFYICE9IDApIG1MYXN0RGVmZXJUb3VjaFggPSB0ZWQubVZpZXdYOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFZICE9IDApIG1MYXN0RGVmZXJUb3VjaFkgPSB0ZWQubVZpZXdZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFYICE9IDApIG1MYXN0RGVmZXJUb3VjaFggPSB4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFZICE9IDApIG1MYXN0RGVmZXJUb3VjaFkgPSB5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobURlZmVyVG91Y2hNb2RlID09IFRPVUNIX0RSQUdfTU9ERSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZmxpbmcgaW4gZGVmZXIgcHJvY2VzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbGVyLnNwcmluZ2JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlTWF4U2Nyb2xsWCgpLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlTWF4U2Nyb2xsWSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVByaW9yaXR5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTcxMTcsOSArNjgzMCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV2ViVmlld0NvcmUuQUNUSU9OX0RPVUJMRVRBUDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9Eb3VibGVUYXAoKSBuZWVkcyBtTGFzdFRvdWNoWC9ZIGFzIGFuY2hvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWCA9IHRlZC5tVmlld1g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hZID0gdGVkLm1WaWV3WTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Eb3VibGVUYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFggPSBjb250ZW50VG9WaWV3WCh0ZWQubVBvaW50c1swXS54KSAtIG1TY3JvbGxYOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWSA9IGNvbnRlbnRUb1ZpZXdZKHRlZC5tUG9pbnRzWzBdLnkpIC0gbVNjcm9sbFk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci5oYW5kbGVEb3VibGVUYXAobUxhc3RUb3VjaFgsIG1MYXN0VG91Y2hZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVyVG91Y2hNb2RlID0gVE9VQ0hfRE9ORV9NT0RFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdlYlZpZXdDb3JlLkFDVElPTl9MT05HUFJFU1M6CkBAIC03MTI3LDcgKzY4NDAsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGl0VGVzdCAhPSBudWxsICYmIGhpdFRlc3QubVR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBIaXRUZXN0UmVzdWx0LlVOS05PV05fVFlQRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybUxvbmdDbGljaygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVidWlsZFdlYlRleHRWaWV3KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVyVG91Y2hNb2RlID0gVE9VQ0hfRE9ORV9NT0RFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTcxNDUsOCArNjg1Nyw4IEBACiAKICAgICAgICAgICAgICAgICBjYXNlIEZJTkRfQUdBSU46CiAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpZiBmaW5kIGhhcyBiZWVuIGRpc21pc3NlZC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GaW5kSXNVcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluZEFsbChtTGFzdEZpbmQpOworICAgICAgICAgICAgICAgICAgICBpZiAobUZpbmRJc1VwICYmIG1GaW5kQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUZpbmRDYWxsYmFjay5maW5kQWxsKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTcxNzQsOSArNjg4Niw5IEBACiAgICAgICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IChWaWV3KSBtc2cub2JqOwogICAgICAgICAgICAgICAgICAgICBpbnQgbnBwID0gbXNnLmFyZzE7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GdWxsU2NyZWVuSG9sZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluRnVsbFNjcmVlbk1vZGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiU2hvdWxkIG5vdCBoYXZlIGFub3RoZXIgZnVsbCBzY3JlZW4uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkhvbGRlci5kaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNtaXNzRnVsbFNjcmVlbk1vZGUoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkhvbGRlciA9IG5ldyBQbHVnaW5GdWxsU2NyZWVuSG9sZGVyKFdlYlZpZXcudGhpcywgbnBwKTsKICAgICAgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5Ib2xkZXIuc2V0Q29udGVudFZpZXcodmlldyk7CkBAIC03MTg3LDEwICs2ODk5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgSElERV9GVUxMU0NSRUVOOgotICAgICAgICAgICAgICAgICAgICBpZiAoaW5GdWxsU2NyZWVuTW9kZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkhvbGRlci5kaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkhvbGRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGlzbWlzc0Z1bGxTY3JlZW5Nb2RlKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgY2FzZSBET01fRk9DVVNfQ0hBTkdFRDoKQEAgLTcyNTEsNyArNjk2MCw2IEBACiAKICAgICAgICAgICAgICAgICBjYXNlIENFTlRFUl9GSVRfUkVDVDoKICAgICAgICAgICAgICAgICAgICAgUmVjdCByID0gKFJlY3QpbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGNlbnRlckZpdFJlY3Qoci5sZWZ0LCByLnRvcCwgci53aWR0aCgpLCByLmhlaWdodCgpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTcyNjAsNiArNjk2OCw1MSBAQAogICAgICAgICAgICAgICAgICAgICBtVmVydGljYWxTY3JvbGxCYXJNb2RlID0gbXNnLmFyZzI7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgICAgICAgY2FzZSBTRUxFQ1RJT05fU1RSSU5HX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChtQWNjZXNzaWJpbGl0eUluamVjdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb25TdHJpbmcgPSAoU3RyaW5nKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlJbmplY3Rvci5vblNlbGVjdGlvblN0cmluZ0NoYW5nZShzZWxlY3Rpb25TdHJpbmcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTOgorICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKG1Ub3VjaEhpZ2hsaWdodFJlZ2lvbi5nZXRCb3VuZHMoKSk7CisgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFJlZ2lvbi5zZXRFbXB0eSgpOworICAgICAgICAgICAgICAgICAgICBpZiAobXNnLm9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8UmVjdD4gcmVjdHMgPSAoQXJyYXlMaXN0PFJlY3Q+KSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChSZWN0IHJlY3QgOiByZWN0cykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY3Qgdmlld1JlY3QgPSBjb250ZW50VG9WaWV3UmVjdChyZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb21lIHNpdGVzLCBsaWtlIHN0b3JpZXMgaW4gbnl0aW1lcy5jb20sIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vdXNlIGV2ZW50IGhhbmRsZXIgaW4gdGhlIHRvcCBkaXYuIEl0IGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZXIgZnJpZW5kbHkgdG8gaGlnaGxpZ2h0IHRoZSBkaXYgaWYgaXQgY292ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9yZSB0aGFuIGhhbGYgb2YgdGhlIHNjcmVlbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlld1JlY3Qud2lkdGgoKSA8IGdldFdpZHRoKCkgPj4gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdmlld1JlY3QuaGVpZ2h0KCkgPCBnZXRIZWlnaHQoKSA+PiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFJlZ2lvbi51bmlvbih2aWV3UmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUodmlld1JlY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR1RBRywgIlNraXAgdGhlIGh1Z2Ugc2VsZWN0aW9uIHJlY3Q6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmlld1JlY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU0FWRV9XRUJBUkNISVZFX0ZJTklTSEVEOgorICAgICAgICAgICAgICAgICAgICBTYXZlV2ViQXJjaGl2ZU1lc3NhZ2Ugc2F2ZU1lc3NhZ2UgPSAoU2F2ZVdlYkFyY2hpdmVNZXNzYWdlKW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIGlmIChzYXZlTWVzc2FnZS5tQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZU1lc3NhZ2UubUNhbGxiYWNrLm9uUmVjZWl2ZVZhbHVlKHNhdmVNZXNzYWdlLm1SZXN1bHRGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU0VUX0FVVE9GSUxMQUJMRToKKyAgICAgICAgICAgICAgICAgICAgbUF1dG9GaWxsUXVlcnlJZCA9IG1zZy5hcmcxOworICAgICAgICAgICAgICAgICAgICBpZiAobVdlYlRleHRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5zZXRBdXRvRmlsbGFibGUobUF1dG9GaWxsUXVlcnlJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkV2ViVGV4dFZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmhhbmRsZU1lc3NhZ2UobXNnKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC03NTY3LDM3ICs3MzIwLDYgQEAKICAgICAgICAgICAgICAgICBuZXcgSW52b2tlTGlzdEJveChhcnJheSwgZW5hYmxlZEFycmF5LCBzZWxlY3RlZEFycmF5KSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVpvb21SYW5nZShXZWJWaWV3Q29yZS5SZXN0b3JlU3RhdGUgcmVzdG9yZVN0YXRlLAotICAgICAgICAgICAgaW50IHZpZXdXaWR0aCwgaW50IG1pblByZWZXaWR0aCwgYm9vbGVhbiB1cGRhdGVab29tT3ZlcnZpZXcpIHsKLSAgICAgICAgaWYgKHJlc3RvcmVTdGF0ZS5tTWluU2NhbGUgPT0gMCkgewotICAgICAgICAgICAgaWYgKHJlc3RvcmVTdGF0ZS5tTW9iaWxlU2l0ZSkgewotICAgICAgICAgICAgICAgIGlmIChtaW5QcmVmV2lkdGggPiBNYXRoLm1heCgwLCB2aWV3V2lkdGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSAoZmxvYXQpIHZpZXdXaWR0aCAvIG1pblByZWZXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVab29tT3ZlcnZpZXcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IHNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldExvYWRXaXRoT3ZlcnZpZXdNb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gcmVzdG9yZVN0YXRlLm1EZWZhdWx0U2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGVGaXhlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gREVGQVVMVF9NSU5fWk9PTV9TQ0FMRTsKLSAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSByZXN0b3JlU3RhdGUubU1pblNjYWxlOwotICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzdG9yZVN0YXRlLm1NYXhTY2FsZSA9PSAwKSB7Ci0gICAgICAgICAgICBtTWF4Wm9vbVNjYWxlID0gREVGQVVMVF9NQVhfWk9PTV9TQ0FMRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1NYXhab29tU2NhbGUgPSByZXN0b3JlU3RhdGUubU1heFNjYWxlOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoKICAgICAgKiBSZXF1ZXN0IGEgZHJvcGRvd24gbWVudSBmb3IgYSBsaXN0Ym94IHdpdGggc2luZ2xlIHNlbGVjdGlvbiBvciBhIHNpbmdsZQogICAgICAqIDxzZWxlY3Q+IGVsZW1lbnQuCkBAIC03NjM2LDcgKzczNTgsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBzZW5kTW92ZU1vdXNlSWZMYXRlc3QoYm9vbGVhbiByZW1vdmVGb2N1cykgewogICAgICAgICBpZiAocmVtb3ZlRm9jdXMpIHsKLSAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KHRydWUpOworICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkoKTsKICAgICAgICAgfQogICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU0VUX01PVkVfTU9VU0VfSUZfTEFURVNULAogICAgICAgICAgICAgICAgIGN1cnNvckRhdGEoKSk7CkBAIC03NjgwLDcgKzc0MDIsNyBAQAogICAgICAgICAvLyBGSVhNRSB0aGUgZGl2aXNvciBzaG91bGQgYmUgcmV0cmlldmVkIGZyb20gc29tZXdoZXJlCiAgICAgICAgIC8vIHRoZSBjbG9zZXN0IHRoaW5nIHRvZGF5IGlzIGhhcmQtY29kZWQgaW50byBTY3JvbGxWaWV3LmphdmEKICAgICAgICAgLy8gKGZyb20gU2Nyb2xsVmlldy5qYXZhLCBsaW5lIDM2MykgICBpbnQgbWF4SnVtcCA9IGhlaWdodC8yOwotICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChoZWlnaHQgKiBtSW52QWN0dWFsU2NhbGUpOworICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChoZWlnaHQgKiBtWm9vbU1hbmFnZXIuZ2V0SW52U2NhbGUoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03NjkxLDEwICs3NDEzLDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGFzcyB0aGUga2V5IHRvIHRoZSBwbHVnaW4uICBUaGlzIGFzc3VtZXMgdGhhdCBuYXRpdmVGb2N1c0lzUGx1Z2luKCkKLSAgICAgKiByZXR1cm5lZCB0cnVlLgorICAgICAqIFBhc3MgdGhlIGtleSBkaXJlY3RseSB0byB0aGUgcGFnZS4gIFRoaXMgYXNzdW1lcyB0aGF0CisgICAgICogbmF0aXZlUGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCkgcmV0dXJuZWQgdHJ1ZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbGV0UGx1Z2luSGFuZGxlTmF2S2V5KGludCBrZXlDb2RlLCBsb25nIHRpbWUsIGJvb2xlYW4gZG93bikgeworICAgIHByaXZhdGUgdm9pZCBsZXRQYWdlSGFuZGxlTmF2S2V5KGludCBrZXlDb2RlLCBsb25nIHRpbWUsIGJvb2xlYW4gZG93bikgewogICAgICAgICBpbnQga2V5RXZlbnRBY3Rpb247CiAgICAgICAgIGludCBldmVudEh1YkFjdGlvbjsKICAgICAgICAgaWYgKGRvd24pIHsKQEAgLTc3NjksNiArNzQ5MSwxNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEByZXR1cm4gSWYgdGhlIHBhZ2Ugc2hvdWxkIHJlY2VpdmUgU2hpZnQgYW5kIGFycm93cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCkgeworICAgICAgICAvLyBUT0RPOiBNYXliZSB0aGUgaW5qZWN0ZWQgc2NyaXB0IHNob3VsZCBhbm5vdW5jZSBpdHMgcHJlc2VuY2UgaW4KKyAgICAgICAgLy8gdGhlIHBhZ2UgbWV0YS10YWcgc28gdGhlIG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cworICAgICAgICAvLyB3aWxsIGNoZWNrIHRoYXQgYXMgb25lIG9mIHRoZSBjb25kaXRpb25zIGl0IGxvb2tzIGZvcgorICAgICAgICByZXR1cm4gKG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpIHx8IG1BY2Nlc3NpYmlsaXR5U2NyaXB0SW5qZWN0ZWQpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldCB0aGUgYmFja2dyb3VuZCBjb2xvci4gSXQncyB3aGl0ZSBieSBkZWZhdWx0LiBQYXNzCiAgICAgICogemVybyB0byBtYWtlIHRoZSB2aWV3IHRyYW5zcGFyZW50LgogICAgICAqIEBwYXJhbSBjb2xvciAgIHRoZSBBUkdCIGNvbG9yIGRlc2NyaWJlZCBieSBDb2xvci5qYXZhCkBAIC03NzkxLDcgKzc1MjMsNyBAQAogICAgICAqIEBoaWRlIG9ubHkgbmVlZHMgdG8gYmUgYWNjZXNzaWJsZSB0byBCcm93c2VyIGFuZCB0ZXN0aW5nCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZHJhd1BhZ2UoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBtV2ViVmlld0NvcmUuZHJhd0NvbnRlbnRQaWN0dXJlKGNhbnZhcywgMCwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgbmF0aXZlRHJhdyhjYW52YXMsIDAsIDAsIGZhbHNlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTc4MDUsNiArNzUzNywxNyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFRvZ2dsZSB3aGV0aGVyIG11bHRpIHRvdWNoIGV2ZW50cyBzaG91bGQgYmUgc2VudCB0byB3ZWJraXQKKyAgICAgKiBubyBtYXR0ZXIgaWYgVUkgd2FudHMgdG8gaGFuZGxlIGl0IGZpcnN0LgorICAgICAqCisgICAgICogQGhpZGUgVGhpcyBpcyBvbmx5IHVzZWQgYnkgdGhlIHdlYmtpdCBsYXlvdXQgdGVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWZlck11bHRpVG91Y2goYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICBtRGVmZXJNdWx0aXRvdWNoID0gdmFsdWU7CisgICAgICAgIExvZy52KExPR1RBRywgInNldCBtRGVmZXJNdWx0aXRvdWNoIHRvICIgKyB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogIFVwZGF0ZSBvdXIgY2FjaGUgd2l0aCB1cGRhdGVkVGV4dC4KICAgICAgKiAgQHBhcmFtIHVwZGF0ZWRUZXh0ICBUaGUgbmV3IHRleHQgdG8gcHV0IGluIG91ciBjYWNoZS4KICAgICAgKi8KQEAgLTc4MTQsNiArNzU1NywxMCBAQAogICAgICAgICBuYXRpdmVVcGRhdGVDYWNoZWRUZXh0ZmllbGQodXBkYXRlZFRleHQsIG1UZXh0R2VuZXJhdGlvbik7CiAgICAgfQogCisgICAgLypwYWNrYWdlKi8gdm9pZCBhdXRvRmlsbEZvcm0oaW50IGF1dG9GaWxsUXVlcnlJZCkgeworICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuQVVUT0ZJTExfRk9STSwgYXV0b0ZpbGxRdWVyeUlkLCAvKiB1bnVzZWQgKi8wKTsKKyAgICB9CisKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlQ2FjaGVIaXRGcmFtZVBvaW50ZXIoKTsKICAgICBwcml2YXRlIG5hdGl2ZSBSZWN0IG5hdGl2ZUNhY2hlSGl0Tm9kZUJvdW5kcygpOwogICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVDYWNoZUhpdE5vZGVQb2ludGVyKCk7CkBAIC03ODM1LDEwICs3NTgyLDE4IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlQ3Vyc29yV2FudHNLZXlFdmVudHMoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVEZWJ1Z0R1bXAoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVEZXN0cm95KCk7CisKKyAgICAvKioKKyAgICAgKiBEcmF3IHRoZSBwaWN0dXJlIHNldCB3aXRoIGEgYmFja2dyb3VuZCBjb2xvciBhbmQgZXh0cmEuIElmCisgICAgICogInNwbGl0SWZOZWVkZWQiIGlzIHRydWUgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgbm90IDAsIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgKiBNVVNUIGJlIHBhc3NlZCB0byBXZWJWaWV3Q29yZSB3aXRoIFNQTElUX1BJQ1RVUkVfU0VUIG1lc3NhZ2Ugc28gdGhhdCB0aGUKKyAgICAgKiBuYXRpdmUgYWxsb2NhdGlvbiBjYW4gYmUgZnJlZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZURyYXcoQ2FudmFzIGNhbnZhcywgaW50IGNvbG9yLCBpbnQgZXh0cmEsCisgICAgICAgICAgICBib29sZWFuIHNwbGl0SWZOZWVkZWQpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUR1bXBEaXNwbGF5VHJlZShTdHJpbmcgdXJsT3JOdWxsKTsKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVFdmFsdWF0ZUxheWVyc0FuaW1hdGlvbnMoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVFeHRlbmRTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVEcmF3RXh0cmFzKENhbnZhcyBjYW52YXMsIGludCBleHRyYSk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlRHVtcERpc3BsYXlUcmVlKFN0cmluZyB1cmxPck51bGwpOwogICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZUZpbmRBbGwoU3RyaW5nIGZpbmRMb3dlciwgU3RyaW5nIGZpbmRVcHBlcik7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlRmluZE5leHQoYm9vbGVhbiBmb3J3YXJkKTsKICAgICAvKiBwYWNrYWdlICovIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVGb2N1c0NhbmRpZGF0ZUZyYW1lUG9pbnRlcigpOwpAQCAtNzg3Niw2ICs3NjMxLDE0IEBACiAgICAgICAgICAgICBib29sZWFuIG5vU2Nyb2xsKTsKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVNb3ZlR2VuZXJhdGlvbigpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZU1vdmVTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhZ2Ugc2hvdWxkIGdldCB0aGUgc2hpZnQgYW5kIGFycm93IGtleXMsIHJhdGhlcgorICAgICAqIHRoYW4gc2VsZWN0IHRleHQvbmF2aWdhdGlvbi4KKyAgICAgKgorICAgICAqIElmIHRoZSBmb2N1cyBpcyBhIHBsdWdpbiwgb3IgaWYgdGhlIGZvY3VzIGFuZCBjdXJzb3IgbWF0Y2ggYW5kIGFyZQorICAgICAqIGEgY29udGVudEVkaXRhYmxlIGVsZW1lbnQsIHRoZW4gdGhlIHBhZ2Ugc2hvdWxkIGhhbmRsZSB0aGVzZSBrZXlzLgorICAgICAqLworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpOwogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZVBvaW50SW5OYXZDYWNoZShpbnQgeCwgaW50IHksIGludCBzbG9wKTsKICAgICAvLyBMaWtlIG1hbnkgb3RoZXIgb2Ygb3VyIG5hdGl2ZSBtZXRob2RzLCB5b3UgbXVzdCBtYWtlIHN1cmUgdGhhdAogICAgIC8vIG1OYXRpdmVDbGFzcyBpcyBub3QgbnVsbCBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC4KQEAgLTc4OTAsMTMgKzc2NTMsMTUgQEAKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRFeHRlbmRTZWxlY3Rpb24oKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRGaW5kSXNFbXB0eSgpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNldEZpbmRJc1VwKGJvb2xlYW4gaXNVcCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0Rm9sbG93ZWRMaW5rKGJvb2xlYW4gZm9sbG93ZWQpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNldEhlaWdodENhbk1lYXN1cmUoYm9vbGVhbiBtZWFzdXJlKTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRSb290TGF5ZXIoaW50IGxheWVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRCYXNlTGF5ZXIoaW50IGxheWVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTaG93Q3Vyc29yVGltZWQoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVSZXBsYWNlQmFzZUNvbnRlbnQoaW50IGNvbnRlbnQpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUNvcHlCYXNlQ29udGVudFRvUGljdHVyZShQaWN0dXJlIHBpY3QpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZUhhc0NvbnRlbnQoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRTZWxlY3Rpb25Qb2ludGVyKGJvb2xlYW4gc2V0LAogICAgICAgICAgICAgZmxvYXQgc2NhbGUsIGludCB4LCBpbnQgeSk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlU3RhcnRTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRTZWxlY3Rpb25SZWdpb24oYm9vbGVhbiBzZXQpOwogICAgIHByaXZhdGUgbmF0aXZlIFJlY3QgICAgIG5hdGl2ZVN1YnRyYWN0TGF5ZXJzKFJlY3QgY29udGVudCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgaW50ICAgICAgbmF0aXZlVGV4dEdlbmVyYXRpb24oKTsKICAgICAvLyBOZXZlciBjYWxsIHRoaXMgdmVyc2lvbiBleGNlcHQgYnkgdXBkYXRlQ2FjaGVkVGV4dGZpZWxkKFN0cmluZykgLQpAQCAtNzkwNSw2ICs3NjcwLDEwIEBACiAgICAgICAgICAgICBpbnQgZ2VuZXJhdGlvbik7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlV29yZFNlbGVjdGlvbihpbnQgeCwgaW50IHkpOwogICAgIC8vIHJldHVybiBOT19MRUZURURHRSBtZWFucyBmYWlsdXJlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT19MRUZURURHRSA9IC0xOwotICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZUdldEJsb2NrTGVmdEVkZ2UoaW50IHgsIGludCB5LCBmbG9hdCBzY2FsZSk7CisgICAgc3RhdGljIGZpbmFsIGludCBOT19MRUZURURHRSA9IC0xOworICAgIG5hdGl2ZSBpbnQgbmF0aXZlR2V0QmxvY2tMZWZ0RWRnZShpbnQgeCwgaW50IHksIGZsb2F0IHNjYWxlKTsKKworICAgIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzY3JvbGxhYmxlIExheWVyQW5kcm9pZCBhdCB0aGUgZ2l2ZW4gcG9pbnQuCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50ICAgICAgbmF0aXZlU2Nyb2xsYWJsZUxheWVyKGludCB4LCBpbnQgeSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlU2Nyb2xsTGF5ZXIoaW50IGxheWVyLCBpbnQgZHgsIGludCBkeSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NsaWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDbGllbnQuamF2YQppbmRleCAwMmM3MjEwLi4xZjhlZWJhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NsaWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q2xpZW50LmphdmEKQEAgLTg5LDYgKzg5LDcgQEAKICAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBubyBsb25nZXIgY2FsbGVkLiBXaGVuIHRoZSBXZWJWaWV3IGVuY291bnRlcnMKICAgICAgKiAgICAgICAgICAgICBhIHJlZGlyZWN0IGxvb3AsIGl0IHdpbGwgY2FuY2VsIHRoZSBsb2FkLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgb25Ub29NYW55UmVkaXJlY3RzKFdlYlZpZXcgdmlldywgTWVzc2FnZSBjYW5jZWxNc2csCiAgICAgICAgICAgICBNZXNzYWdlIGNvbnRpbnVlTXNnKSB7CiAgICAgICAgIGNhbmNlbE1zZy5zZW5kVG9UYXJnZXQoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlLmphdmEKaW5kZXggYmY0ZDk1Yi4uN2MwODlkOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlLmphdmEKQEAgLTE3LDMwICsxNywyNSBAQAogcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkRyYXdGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50RmxhZ3NEcmF3RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRmlsZTsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Ccm93c2VyOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuT3BlbmFibGVDb2x1bW5zOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTExNywxMyArMTEyLDE2IEBACiAgICAgcHJpdmF0ZSBpbnQgbVZpZXdwb3J0RGVuc2l0eURwaSA9IC0xOwogCiAgICAgcHJpdmF0ZSBpbnQgbVJlc3RvcmVkU2NhbGUgPSAwOwotICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFNjcmVlbldpZHRoU2NhbGUgPSAwOworICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFRleHRXcmFwU2NhbGUgPSAwOwogICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFggPSAwOwogICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFkgPSAwOwogCiAgICAgcHJpdmF0ZSBpbnQgbVdlYmtpdFNjcm9sbFggPSAwOwogICAgIHByaXZhdGUgaW50IG1XZWJraXRTY3JvbGxZID0gMDsKIAorICAgIHByaXZhdGUgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyIG1EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIgPSBuZXcgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyKHRoaXMpOworICAgIHByaXZhdGUgRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlIG1EZXZpY2VPcmllbnRhdGlvblNlcnZpY2U7CisKICAgICAvLyBUaGUgdGhyZWFkIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGUgV2ViQ29yZSB0aHJlYWQgYW5kIGZvciB1c2UgaW4KICAgICAvLyBkZWJ1Z2dpbmcgb3RoZXIgY2xhc3NlcyB0aGF0IHJlcXVpcmUgb3BlcmF0aW9uIHdpdGhpbiB0aGUgV2ViQ29yZSB0aHJlYWQuCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIUkVBRF9OQU1FID0gIldlYlZpZXdDb3JlVGhyZWFkIjsKQEAgLTI1NSw2ICsyNTMsMTMgQEAKICAgICAgICAgcmV0dXJuIG1TZXR0aW5nczsKICAgICB9CiAKKyAgICAvKgorICAgICAqIEdpdmVuIG1pbWVUeXBlLCBjaGVjayB3aGV0aGVyIGl0J3Mgc3VwcG9ydGVkIGluIEFuZHJvaWQgbWVkaWEgZnJhbWV3b3JrLgorICAgICAqIG1pbWVUeXBlIGNvdWxkIGJlIHN1Y2ggYXMgImF1ZGlvL29nZyIgYW5kICJ2aWRlby9tcDQiLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGJvb2xlYW4gc3VwcG9ydHNNaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIE1lZGlhRmlsZS5nZXRGaWxlVHlwZUZvck1pbWVUeXBlKG1pbWVUeXBlKSA+IDA7CisgICAgfQogICAgIC8qKgogICAgICAqIEFkZCBhbiBlcnJvciBtZXNzYWdlIHRvIHRoZSBjbGllbnQncyBjb25zb2xlLgogICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGFkZApAQCAtMjc2LDM3ICsyODEsNDkgQEAKICAgICAgICAgbUNhbGxiYWNrUHJveHkub25Kc0FsZXJ0KHVybCwgbWVzc2FnZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IEpOSS4gIFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBVSSB0aHJlYWQgdG8gaGlkZSB0aGUgc29mdCBrZXlib2FyZAorICAgICAqIGlmIHRoZSBub2RlIHBvaW50ZWQgdG8gYnkgbm9kZVBvaW50ZXIgaXMgc3RpbGwgaW4gZm9jdXMuCisgICAgICogQHBhcmFtIG5vZGVQb2ludGVyIFRoZSBub2RlIHdoaWNoIGp1c3QgYmx1cnJlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZm9ybURpZEJsdXIoaW50IG5vZGVQb2ludGVyKSB7CisgICAgICAgIGlmIChtV2ViVmlldyA9PSBudWxsKSByZXR1cm47CisgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwgV2ViVmlldy5GT1JNX0RJRF9CTFVSLAorICAgICAgICAgICAgICAgIG5vZGVQb2ludGVyLCAwKS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgSk5JLiAgT3BlbiBhIGZpbGUgY2hvb3NlciB0byB1cGxvYWQgYSBmaWxlLgotICAgICAqIEByZXR1cm4gU3RyaW5nIHZlcnNpb24gb2YgdGhlIFVSSSBwbHVzIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotICAgICAqIEZJWE1FOiBKdXN0IHJldHVybiB0aGUgVVJJIGhlcmUsIGFuZCBpbiBGaWxlU3lzdGVtOjpwYXRoR2V0RmlsZU5hbWUsIGNhbGwKLSAgICAgKiBpbnRvIEphdmEgdG8gZ2V0IHRoZSBmaWxlbmFtZS4KKyAgICAgKiBAcGFyYW0gYWNjZXB0VHlwZSBUaGUgdmFsdWUgb2YgdGhlICdhY2NlcHQnIGF0dHJpYnV0ZSBvZiB0aGUKKyAgICAgKiAgICAgICAgIGlucHV0IHRhZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWxlIHBpY2tlci4KKyAgICAgKiBAcmV0dXJuIFN0cmluZyB2ZXJzaW9uIG9mIHRoZSBVUkkuCiAgICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgb3BlbkZpbGVDaG9vc2VyKCkgewotICAgICAgICBVcmkgdXJpID0gbUNhbGxiYWNrUHJveHkub3BlbkZpbGVDaG9vc2VyKCk7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgcmV0dXJuICIiOwotICAgICAgICAvLyBGaW5kIG91dCB0aGUgbmFtZSwgYW5kIGFwcGVuZCBpdCB0byB0aGUgVVJJLgotICAgICAgICAvLyBXZWJraXQgd2lsbCB0cmVhdCB0aGUgbmFtZSBhcyB0aGUgZmlsZW5hbWUsIGFuZAotICAgICAgICAvLyB0aGUgVVJJIGFzIHRoZSBwYXRoLiAgVGhlIFVSSSB3aWxsIGJlIHVzZWQKLSAgICAgICAgLy8gaW4gQnJvd3NlckZyYW1lIHRvIGdldCB0aGUgYWN0dWFsIGRhdGEuCi0gICAgICAgIEN1cnNvciBjdXJzb3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKLSAgICAgICAgICAgICAgICB1cmksCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgT3BlbmFibGVDb2x1bW5zLkRJU1BMQVlfTkFNRSB9LAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAiIjsKLSAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChjdXJzb3IubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBjdXJzb3IuZ2V0U3RyaW5nKDApOworICAgIHByaXZhdGUgU3RyaW5nIG9wZW5GaWxlQ2hvb3NlcihTdHJpbmcgYWNjZXB0VHlwZSkgeworICAgICAgICBVcmkgdXJpID0gbUNhbGxiYWNrUHJveHkub3BlbkZpbGVDaG9vc2VyKGFjY2VwdFR5cGUpOworICAgICAgICBpZiAodXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlUGF0aCA9ICIiOworICAgICAgICAgICAgLy8gTm90ZSAtIHF1ZXJ5aW5nIGZvciBNZWRpYVN0b3JlLkltYWdlcy5NZWRpYS5EQVRBCisgICAgICAgICAgICAvLyBzZWVtcyB0byB3b3JrIGZvciBhbGwgY29udGVudCBVUklzLCBub3QganVzdCBpbWFnZXMKKyAgICAgICAgICAgIEN1cnNvciBjdXJzb3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgdXJpLAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBNZWRpYVN0b3JlLkltYWdlcy5NZWRpYS5EQVRBIH0sCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gY3Vyc29yLmdldFN0cmluZygwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gdXJpLmdldExhc3RQYXRoU2VnbWVudCgpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHVyaVN0cmluZyA9IHVyaS50b1N0cmluZygpOworICAgICAgICAgICAgQnJvd3NlckZyYW1lLnNKYXZhQnJpZGdlLnN0b3JlRmlsZVBhdGhGb3JDb250ZW50VXJpKGZpbGVQYXRoLCB1cmlTdHJpbmcpOworICAgICAgICAgICAgcmV0dXJuIHVyaVN0cmluZzsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdXJpLnRvU3RyaW5nKCkgKyAiLyIgKyBuYW1lOworICAgICAgICByZXR1cm4gIiI7CiAgICAgfQogCiAgICAgLyoqCkBAIC00MjQsNiArNDQxLDEzIEBACiAgICAgICAgIHJldHVybiBtQ2FsbGJhY2tQcm94eS5vbkpzVGltZW91dCgpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgd2VidmlldyB0aGF0IHRoaXMgaXMgYW4gaW5zdGFsbGFibGUgd2ViIGFwcC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnN0YWxsYWJsZVdlYkFwcCgpIHsKKyAgICAgICAgbUNhbGxiYWNrUHJveHkuc2V0SW5zdGFsbGFibGVXZWJBcHAoKTsKKyAgICB9CisKICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvLyBKTkkgbWV0aG9kcwogICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDM1LDM2ICs0NTksMjEgQEAKICAgICAgKi8KICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUNsZWFyQ29udGVudCgpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgZmxhdCBwaWN0dXJlIGZyb20gdGhlIHNldCBvZiBwaWN0dXJlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUNvcHlDb250ZW50VG9QaWN0dXJlKFBpY3R1cmUgcGljdHVyZSk7Ci0KLSAgICAvKioKLSAgICAgKiBEcmF3IHRoZSBwaWN0dXJlIHNldCB3aXRoIGEgYmFja2dyb3VuZCBjb2xvci4gUmV0dXJucyB0cnVlCi0gICAgICogaWYgc29tZSBpbmRpdmlkdWFsIHBpY3R1cmUgdG9vayB0b28gbG9uZyB0byBkcmF3IGFuZCBjYW4gYmUKLSAgICAgKiBzcGxpdCBpbnRvIHBhcnRzLiBDYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkLgotICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlRHJhd0NvbnRlbnQoQ2FudmFzIGNhbnZhcywgaW50IGNvbG9yKTsKLQotICAgIC8qKgotICAgICAqIGNoZWNrIHRvIHNlZSBpZiBwaWN0dXJlIGlzIGJsYW5rIGFuZCBpbiBwcm9ncmVzcwotICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlUGljdHVyZVJlYWR5KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVDb250ZW50SW52YWxpZGF0ZUFsbCgpOwogCiAgICAgLyoqCiAgICAgICogUmVkcmF3IGEgcG9ydGlvbiBvZiB0aGUgcGljdHVyZSBzZXQuIFRoZSBQb2ludCB3aCByZXR1cm5zIHRoZQogICAgICAqIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIG92ZXJhbGwgcGljdHVyZS4KICAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZVJlY29yZENvbnRlbnQoUmVnaW9uIGludmFsUmVnaW9uLCBQb2ludCB3aCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZVJlY29yZENvbnRlbnQoUmVnaW9uIGludmFsUmVnaW9uLCBQb2ludCB3aCk7CiAKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZUZvY3VzQm91bmRzQ2hhbmdlZCgpOwogCiAgICAgLyoqCi0gICAgICogU3BsaXRzIHNsb3cgcGFydHMgb2YgdGhlIHBpY3R1cmUgc2V0LiBDYWxsZWQgZnJvbSB0aGUgd2Via2l0Ci0gICAgICogdGhyZWFkIGFmdGVyIG5hdGl2ZURyYXdDb250ZW50IHJldHVybnMgdHJ1ZS4KKyAgICAgKiBTcGxpdHMgc2xvdyBwYXJ0cyBvZiB0aGUgcGljdHVyZSBzZXQuIENhbGxlZCBmcm9tIHRoZSB3ZWJraXQgdGhyZWFkIGFmdGVyCisgICAgICogV2ViVmlldy5uYXRpdmVEcmF3KCkgcmV0dXJucyBjb250ZW50IHRvIGJlIHNwbGl0LgogICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlU3BsaXRDb250ZW50KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTcGxpdENvbnRlbnQoaW50IGNvbnRlbnQpOwogCiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVLZXkoaW50IGtleUNvZGUsIGludCB1bmljaGFyLAogICAgICAgICAgICAgaW50IHJlcGVhdENvdW50LCBib29sZWFuIGlzU2hpZnQsIGJvb2xlYW4gaXNBbHQsIGJvb2xlYW4gaXNTeW0sCkBAIC00ODAsMTIgKzQ4OSwxMiBAQAogICAgICAgICBvZiBsYXlvdXQvbGluZS1icmVha2luZy4gVGhlc2UgY29vcmRpbmF0ZXMgYXJlIGluIGRvY3VtZW50IHNwYWNlLAogICAgICAgICB3aGljaCBpcyB0aGUgc2FtZSBhcyBWaWV3IGNvb3JkcyB1bmxlc3Mgd2UgaGF2ZSB6b29tZWQgdGhlIGRvY3VtZW50CiAgICAgICAgIChzZWUgbmF0aXZlU2V0Wm9vbSkuCi0gICAgICAgIHNjcmVlbldpZHRoIGlzIHVzZWQgYnkgbGF5b3V0IHRvIHdyYXAgY29sdW1uIGFyb3VuZC4gSWYgdmlld3BvcnQgdXNlcwotICAgICAgICBmaXhlZCBzaXplLCBzY3JlZW5XaWR0aCBjYW4gYmUgZGlmZmVyZW50IGZyb20gd2lkdGggd2l0aCB6b29taW5nLgorICAgICAgICB0ZXh0V3JhcFdpZHRoIGlzIHVzZWQgYnkgbGF5b3V0IHRvIHdyYXAgY29sdW1uIGFyb3VuZC4gSWYgdmlld3BvcnQgdXNlcworICAgICAgICBmaXhlZCBzaXplLCB0ZXh0V3JhcFdpZHRoIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSB3aWR0aCB3aXRoIHpvb21pbmcuCiAgICAgICAgIHNob3VsZCB0aGlzIGJlIGNhbGxlZCBuYXRpdmVTZXRWaWV3UG9ydFNpemU/CiAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc2NyZWVuV2lkdGgsCi0gICAgICAgICAgICBmbG9hdCBzY2FsZSwgaW50IHJlYWxTY3JlZW5XaWR0aCwgaW50IHNjcmVlbkhlaWdodCwgaW50IGFuY2hvclgsCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHRleHRXcmFwV2lkdGgsCisgICAgICAgICAgICBmbG9hdCBzY2FsZSwgaW50IHNjcmVlbldpZHRoLCBpbnQgc2NyZWVuSGVpZ2h0LCBpbnQgYW5jaG9yWCwKICAgICAgICAgICAgIGludCBhbmNob3JZLCBib29sZWFuIGlnbm9yZUhlaWdodCk7CiAKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlR2V0Q29udGVudE1pblByZWZXaWR0aCgpOwpAQCAtNTE1LDggKzUyNCw4IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVUb3VjaFVwKGludCB0b3VjaEdlbmVyYXRpb24sCiAgICAgICAgICAgICBpbnQgZnJhbWVQdHIsIGludCBub2RlUHRyLCBpbnQgeCwgaW50IHkpOwogCi0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVIYW5kbGVUb3VjaEV2ZW50KGludCBhY3Rpb24sIGludCB4LCBpbnQgeSwKLSAgICAgICAgICAgIGludCBtZXRhU3RhdGUpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlSGFuZGxlVG91Y2hFdmVudChpbnQgYWN0aW9uLCBpbnRbXSB4LCBpbnRbXSB5LAorICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgbWV0YVN0YXRlKTsKIAogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlVXBkYXRlRnJhbWVDYWNoZSgpOwogCkBAIC01NzYsNyArNTg1LDE3IEBACiAgICAgLyoqCiAgICAgICogUHJvdmlkZSBXZWJDb3JlIHdpdGggdGhlIHByZXZpb3VzbHkgdmlzdGVkIGxpbmtzIGZyb20gdGhlIGhpc3RvcnkgZGF0YWJhc2UKICAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICBuYXRpdmVQcm92aWRlVmlzaXRlZEhpc3RvcnkoU3RyaW5nW10gaGlzdG9yeSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVQcm92aWRlVmlzaXRlZEhpc3RvcnkoU3RyaW5nW10gaGlzdG9yeSk7CisKKyAgICAvKioKKyAgICAgKiBNb2RpZmllcyB0aGUgY3VycmVudCBzZWxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdG8gYWx0ZXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZ3JhbnVsYXJpdHkgVGhlIGdyYW51bGFyaXR5IG9mIHRoZSBzZWxlY3Rpb24gbW9kaWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgc2VsZWN0aW9uIHN0cmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgbmF0aXZlTW9kaWZ5U2VsZWN0aW9uKGludCBkaXJlY3Rpb24sIGludCBncmFudWxhcml0eSk7CiAKICAgICAvLyBFdmVudEh1YiBmb3IgcHJvY2Vzc2luZyBtZXNzYWdlcwogICAgIHByaXZhdGUgZmluYWwgRXZlbnRIdWIgbUV2ZW50SHViOwpAQCAtNjk3LDYgKzcxNiwxMiBAQAogICAgICAgICBpbnQgbVk7CiAgICAgfQogCisgICAgc3RhdGljIGNsYXNzIFRvdWNoSGlnaGxpZ2h0RGF0YSB7CisgICAgICAgIGludCBtWDsKKyAgICAgICAgaW50IG1ZOworICAgICAgICBpbnQgbVNsb3A7CisgICAgfQorCiAgICAgLy8gbUFjdGlvbiBvZiBUb3VjaEV2ZW50RGF0YSBjYW4gYmUgTW90aW9uRXZlbnQuZ2V0QWN0aW9uKCkgd2hpY2ggdXNlcyB0aGUKICAgICAvLyBsYXN0IHR3byBieXRlcyBvciBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMKICAgICBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9MT05HUFJFU1MgPSAweDEwMDsKQEAgLTcwNCwxMiArNzI5LDkgQEAKIAogICAgIHN0YXRpYyBjbGFzcyBUb3VjaEV2ZW50RGF0YSB7CiAgICAgICAgIGludCBtQWN0aW9uOwotICAgICAgICBpbnQgbVg7Ci0gICAgICAgIGludCBtWTsKKyAgICAgICAgUG9pbnRbXSBtUG9pbnRzOwogICAgICAgICBpbnQgbU1ldGFTdGF0ZTsKICAgICAgICAgYm9vbGVhbiBtUmVwcm9jZXNzOwotICAgICAgICBmbG9hdCBtVmlld1g7Ci0gICAgICAgIGZsb2F0IG1WaWV3WTsKICAgICB9CiAKICAgICBzdGF0aWMgY2xhc3MgR2VvbG9jYXRpb25QZXJtaXNzaW9uc0RhdGEgewpAQCAtNzE4LDkgKzc0MCw4IEBACiAgICAgICAgIGJvb2xlYW4gbVJlbWVtYmVyOwogICAgIH0KIAotCi0KICAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhhbmRsZXJEZWJ1Z1N0cmluZyA9IHsKKyAgICAgICAgICAgICJSRVZFQUxfU0VMRUNUSU9OIiwgLy8gOTYKICAgICAgICAgICAgICJSRVFVRVNUX0xBQkVMIiwgLy8gOTcKICAgICAgICAgICAgICJVUERBVEVfRlJBTUVfQ0FDSEVfSUZfTE9BRElORyIsIC8vID0gOTgKICAgICAgICAgICAgICJTQ1JPTExfVEVYVF9JTlBVVCIsIC8vID0gOTkKQEAgLTc3MSwxMCArNzkyLDEyIEBACiAgICAgICAgICAgICAiT05fUkVTVU1FIiwgICAgLy8gPSAxNDQKICAgICAgICAgICAgICJGUkVFX01FTU9SWSIsICAvLyA9IDE0NQogICAgICAgICAgICAgIlZBTElEX05PREVfQk9VTkRTIiwgLy8gPSAxNDYKKyAgICAgICAgICAgICJTQVZFX1dFQkFSQ0hJVkUiLCAvLyA9IDE0NwogICAgICAgICB9OwogCiAgICAgY2xhc3MgRXZlbnRIdWIgewogICAgICAgICAvLyBNZXNzYWdlIElkcworICAgICAgICBzdGF0aWMgZmluYWwgaW50IFJFVkVBTF9TRUxFQ1RJT04gPSA5NjsKICAgICAgICAgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX0xBQkVMID0gOTc7CiAgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX0ZSQU1FX0NBQ0hFX0lGX0xPQURJTkcgPSA5ODsKICAgICAgICAgc3RhdGljIGZpbmFsIGludCBTQ1JPTExfVEVYVF9JTlBVVCA9IDk5OwpAQCAtODM3LDYgKzg2MCw5IEBACiAgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgRlJFRV9NRU1PUlkgPSAxNDU7CiAgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgVkFMSURfTk9ERV9CT1VORFMgPSAxNDY7CiAKKyAgICAgICAgLy8gTG9hZCBhbmQgc2F2ZSB3ZWIgYXJjaGl2ZXMKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBTQVZFX1dFQkFSQ0hJVkUgPSAxNDc7CisKICAgICAgICAgLy8gTmV0d29yay1iYXNlZCBtZXNzYWdpbmcKICAgICAgICAgc3RhdGljIGZpbmFsIGludCBDTEVBUl9TU0xfUFJFRl9UQUJMRSA9IDE1MDsKIApAQCAtODY1LDYgKzg5MSwxNiBAQAogICAgICAgICBzdGF0aWMgZmluYWwgaW50IEFERF9QQUNLQUdFX05BTUUgPSAxODU7CiAgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX1BBQ0tBR0VfTkFNRSA9IDE4NjsKIAorICAgICAgICBzdGF0aWMgZmluYWwgaW50IEdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMgPSAxODc7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX1RPVUNIX0hJR0hMSUdIVF9SRUNUUyA9IDE4ODsKKworICAgICAgICAvLyBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBNT0RJRllfU0VMRUNUSU9OID0gMTkwOworCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgVVNFX01PQ0tfREVWSUNFX09SSUVOVEFUSU9OID0gMTkxOworCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQVVUT0ZJTExfRk9STSA9IDE5MjsKKwogICAgICAgICAvLyBwcml2YXRlIG1lc3NhZ2UgaWRzCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVNUUk9ZID0gICAgIDIwMDsKIApAQCAtODg1LDYgKzkyMSw5IEBACiAgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIEV2ZW50SHViKCkge30KIAorICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfUEFDS0FHRV9NU0dfSUQgPSBSRVZFQUxfU0VMRUNUSU9OOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9QQUNLQUdFX01TR19JRCA9IFZBTElEX05PREVfQk9VTkRTOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUcmFuc2ZlciBhbGwgbWVzc2FnZXMgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgd2ViY29yZSB0aHJlYWQgaGFuZGxlci4KICAgICAgICAgICovCkBAIC04OTYsMTEgKzkzNSwxMSBAQAogICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAobXNnLndoYXQgPCBSRVFVRVNUX0xBQkVMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1zZy53aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gVkFMSURfTk9ERV9CT1VORFMgPyBJbnRlZ2VyLnRvU3RyaW5nKG1zZy53aGF0KQorICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAobXNnLndoYXQgPCBGSVJTVF9QQUNLQUdFX01TR19JRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtc2cud2hhdCA+IExBU1RfUEFDS0FHRV9NU0dfSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBJbnRlZ2VyLnRvU3RyaW5nKG1zZy53aGF0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEhhbmRsZXJEZWJ1Z1N0cmluZ1ttc2cud2hhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gUkVRVUVTVF9MQUJFTF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBGSVJTVF9QQUNLQUdFX01TR19JRF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhcmcxPSIgKyBtc2cuYXJnMSArICIgYXJnMj0iICsgbXNnLmFyZzIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG9iaj0iICsgbXNnLm9iaik7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTkyMSw2ICs5NjAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUkVWRUFMX1NFTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVSZXZlYWxTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSRVFVRVNUX0xBQkVMOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub2RlUG9pbnRlciA9IG1zZy5hcmcyOwpAQCAtMTE1NCwxMiArMTE5NywxOSBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRPVUNIX0VWRU5UOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG91Y2hFdmVudERhdGEgdGVkID0gKFRvdWNoRXZlbnREYXRhKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHRlZC5tUG9pbnRzLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXSB4QXJyYXkgPSBuZXcgaW50W2NvdW50XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXSB5QXJyYXkgPSBuZXcgaW50W2NvdW50XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IGNvdW50OyBjKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeEFycmF5W2NdID0gdGVkLm1Qb2ludHNbY10ueDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeUFycmF5W2NdID0gdGVkLm1Qb2ludHNbY10ueTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlBSRVZFTlRfVE9VQ0hfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubUFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUhhbmRsZVRvdWNoRXZlbnQodGVkLm1BY3Rpb24sIHRlZC5tWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1ZLCB0ZWQubU1ldGFTdGF0ZSkgPyAxIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUhhbmRsZVRvdWNoRXZlbnQodGVkLm1BY3Rpb24sIHhBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeUFycmF5LCBjb3VudCwgdGVkLm1NZXRhU3RhdGUpID8gMSA6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA/IHRlZCA6IG51bGwpLnNlbmRUb1RhcmdldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTIzOCw2ICsxMjg4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlU2V0U2VsZWN0aW9uKG1zZy5hcmcxLCBtc2cuYXJnMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTU9ESUZZX1NFTEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uU3RyaW5nID0gbmF0aXZlTW9kaWZ5U2VsZWN0aW9uKG1zZy5hcmcxLCBtc2cuYXJnMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLm9idGFpbk1lc3NhZ2UoV2ViVmlldy5TRUxFQ1RJT05fU1RSSU5HX0NIQU5HRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdHJpbmcpLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExJU1RCT1hfQ0hPSUNFUzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFyc2VCb29sZWFuQXJyYXkgY2hvaWNlcyA9IChTcGFyc2VCb29sZWFuQXJyYXkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cub2JqOwpAQCAtMTI3OCw2ICsxMzM0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlU2V0SnNGbGFncygoU3RyaW5nKW1zZy5vYmopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNBVkVfV0VCQVJDSElWRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlNhdmVXZWJBcmNoaXZlTWVzc2FnZSBzYXZlTWVzc2FnZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXZWJWaWV3LlNhdmVXZWJBcmNoaXZlTWVzc2FnZSltc2cub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVNZXNzYWdlLm1SZXN1bHRGaWxlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZVdlYkFyY2hpdmUoc2F2ZU1lc3NhZ2UubUJhc2VuYW1lLCBzYXZlTWVzc2FnZS5tQXV0b25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlNBVkVfV0VCQVJDSElWRV9GSU5JU0hFRCwgc2F2ZU1lc3NhZ2UpLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdFT0xPQ0FUSU9OX1BFUk1JU1NJT05TX1BST1ZJREU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VvbG9jYXRpb25QZXJtaXNzaW9uc0RhdGEgZGF0YSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR2VvbG9jYXRpb25QZXJtaXNzaW9uc0RhdGEpIG1zZy5vYmo7CkBAIC0xMjkxLDcgKzEzNTYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNQTElUX1BJQ1RVUkVfU0VUOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNwbGl0Q29udGVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNwbGl0Q29udGVudChtc2cuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLm9idGFpbk1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlJFUExBQ0VfQkFTRV9DT05URU5ULCBtc2cuYXJnMSwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNwbGl0UGljdHVyZUlzU2NoZWR1bGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTEzNTcsNiArMTQyNCwyOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJyb3dzZXJGcmFtZS5zSmF2YUJyaWRnZS5yZW1vdmVQYWNrYWdlTmFtZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIG1zZy5vYmopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG91Y2hIaWdobGlnaHREYXRhIGQgPSAoVG91Y2hIaWdobGlnaHREYXRhKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxSZWN0PiByZWN0cyA9IG5hdGl2ZUdldFRvdWNoSGlnaGxpZ2h0UmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkLm1YLCBkLm1ZLCBkLm1TbG9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuU0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUywgcmVjdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUkVNT1ZFX1RPVUNIX0hJR0hMSUdIVF9SRUNUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuU0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUywgbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBVU0VfTU9DS19ERVZJQ0VfT1JJRU5UQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlTW9ja0RldmljZU9yaWVudGF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVUT0ZJTExfRk9STToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVBdXRvRmlsbEZvcm0obXNnLmFyZzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfTsKQEAgLTE1NjIsNiArMTY1MiwxMyBAQAogICAgICAgICBtQnJvd3NlckZyYW1lLmxvYWRVcmwodXJsLCBleHRyYUhlYWRlcnMpOwogICAgIH0KIAorICAgIHByaXZhdGUgU3RyaW5nIHNhdmVXZWJBcmNoaXZlKFN0cmluZyBmaWxlbmFtZSwgYm9vbGVhbiBhdXRvbmFtZSkgeworICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFV19DT1JFKSB7CisgICAgICAgICAgICBMb2cudihMT0dUQUcsICIgQ09SRSBzYXZlV2ViQXJjaGl2ZSAiICsgZmlsZW5hbWUgKyAiICIgKyBhdXRvbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ccm93c2VyRnJhbWUuc2F2ZVdlYkFyY2hpdmUoZmlsZW5hbWUsIGF1dG9uYW1lKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQga2V5KEtleUV2ZW50IGV2dCwgYm9vbGVhbiBpc0Rvd24pIHsKICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgewogICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiQ09SRSBrZXkgYXQgIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIiwgIgpAQCAtMTU4MiwxMSArMTY3OSwxMiBAQAogICAgICAgICAgICAgaWYgKGtleUNvZGUgPj0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQCiAgICAgICAgICAgICAgICAgICAgICYmIGtleUNvZGUgPD0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hUKSB7CiAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJrZXk6IGFycm93IHVudXNlZCBieSBwbHVnaW46ICIgKyBrZXlDb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAia2V5OiBhcnJvdyB1bnVzZWQgYnkgcGFnZTogIiArIGtleUNvZGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCAmJiBldnQuaXNEb3duKCkpIHsKICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuTU9WRV9PVVRfT0ZfUExVR0lOLCBrZXlDb2RlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlVOSEFORExFRF9OQVZfS0VZLCBrZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApLnNlbmRUb1RhcmdldCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC0xNjE3LDcgKzE3MTUsNyBAQAogICAgICAgICBpZiAobVNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpKSB7CiAgICAgICAgICAgICBpZiAobVZpZXdwb3J0V2lkdGggPT0gLTEpIHsKICAgICAgICAgICAgICAgICBpZiAobVNldHRpbmdzLmdldExheW91dEFsZ29yaXRobSgpID09Ci0gICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXR0aW5ncy5MYXlvdXRBbGdvcml0aG0uTk9STUFMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXR0aW5ncy5MYXlvdXRBbGdvcml0aG0uTk9STUFMIHx8IG1TZXR0aW5ncy5nZXRVc2VGaXhlZFZpZXdwb3J0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBXZWJWaWV3LkRFRkFVTFRfVklFV1BPUlRfV0lEVEg7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLyoKQEAgLTE2MzcsNyArMTczNSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlR2V0Q29udGVudE1pblByZWZXaWR0aCgpKSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAobVZpZXdwb3J0V2lkdGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3LCBtVmlld3BvcnRXaWR0aCk7CisgICAgICAgICAgICAgICAgaWYgKG1TZXR0aW5ncy5nZXRVc2VGaXhlZFZpZXdwb3J0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHdlYnNpdGUgc3BlY2lmaWVkIG9yIGRlc2lyZWQgZml4ZWQgdmlld3BvcnQgd2lkdGguCisgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gbVZpZXdwb3J0V2lkdGg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3LCBtVmlld3BvcnRXaWR0aCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB3aWR0aCA9IHRleHR3cmFwV2lkdGg7CiAgICAgICAgICAgICB9CkBAIC0xNjgyLDYgKzE3ODUsMTQgQEAKICAgICAgICAgcmV0dXJuIHVzZWRRdW90YTsKICAgICB9CiAKKyAgICAvLyBjYWxsZWQgZnJvbSBVSSB0aHJlYWQKKyAgICB2b2lkIHNwbGl0Q29udGVudChpbnQgY29udGVudCkgeworICAgICAgICBpZiAoIW1TcGxpdFBpY3R1cmVJc1NjaGVkdWxlZCkgeworICAgICAgICAgICAgbVNwbGl0UGljdHVyZUlzU2NoZWR1bGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKEV2ZW50SHViLlNQTElUX1BJQ1RVUkVfU0VULCBjb250ZW50LCAwKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIFVzZWQgdG8gYXZvaWQgcG9zdGluZyBtb3JlIHRoYW4gb25lIGRyYXcgbWVzc2FnZS4KICAgICBwcml2YXRlIGJvb2xlYW4gbURyYXdJc1NjaGVkdWxlZDsKIApAQCAtMTY5MSwxMSArMTgwMiwxMSBAQAogICAgIC8vIFVzZWQgdG8gc3VzcGVuZCBkcmF3aW5nLgogICAgIHByaXZhdGUgYm9vbGVhbiBtRHJhd0lzUGF1c2VkOwogCi0gICAgLy8gbVJlc3RvcmVTdGF0ZSBpcyBzZXQgaW4gZGlkRmlyc3RMYXlvdXQoKSwgYW5kIHJlc2V0IGluIHRoZSBuZXh0Ci0gICAgLy8gd2Via2l0RHJhdyBhZnRlciBwYXNzaW5nIGl0IHRvIHRoZSBVSSB0aHJlYWQuCi0gICAgcHJpdmF0ZSBSZXN0b3JlU3RhdGUgbVJlc3RvcmVTdGF0ZSA9IG51bGw7CisgICAgLy8gbUluaXRpYWxWaWV3U3RhdGUgaXMgc2V0IGJ5IGRpZEZpcnN0TGF5b3V0KCkgYW5kIHRoZW4gcmVzZXQgaW4gdGhlCisgICAgLy8gbmV4dCB3ZWJraXREcmF3IGFmdGVyIHBhc3NpbmcgdGhlIHN0YXRlIHRvIHRoZSBVSSB0aHJlYWQuCisgICAgcHJpdmF0ZSBWaWV3U3RhdGUgbUluaXRpYWxWaWV3U3RhdGUgPSBudWxsOwogCi0gICAgc3RhdGljIGNsYXNzIFJlc3RvcmVTdGF0ZSB7CisgICAgc3RhdGljIGNsYXNzIFZpZXdTdGF0ZSB7CiAgICAgICAgIGZsb2F0IG1NaW5TY2FsZTsKICAgICAgICAgZmxvYXQgbU1heFNjYWxlOwogICAgICAgICBmbG9hdCBtVmlld1NjYWxlOwpAQCAtMTcwNCwxOSArMTgxNSwyMiBAQAogICAgICAgICBpbnQgbVNjcm9sbFg7CiAgICAgICAgIGludCBtU2Nyb2xsWTsKICAgICAgICAgYm9vbGVhbiBtTW9iaWxlU2l0ZTsKKyAgICAgICAgaW50IG1WaWV3cG9ydFdpZHRoOwogICAgIH0KIAogICAgIHN0YXRpYyBjbGFzcyBEcmF3RGF0YSB7CiAgICAgICAgIERyYXdEYXRhKCkgeworICAgICAgICAgICAgbUJhc2VMYXllciA9IDA7CiAgICAgICAgICAgICBtSW52YWxSZWdpb24gPSBuZXcgUmVnaW9uKCk7CiAgICAgICAgICAgICBtV2lkdGhIZWlnaHQgPSBuZXcgUG9pbnQoKTsKICAgICAgICAgfQorICAgICAgICBpbnQgbUJhc2VMYXllcjsKICAgICAgICAgUmVnaW9uIG1JbnZhbFJlZ2lvbjsKICAgICAgICAgUG9pbnQgbVZpZXdQb2ludDsKICAgICAgICAgUG9pbnQgbVdpZHRoSGVpZ2h0OwogICAgICAgICBpbnQgbU1pblByZWZXaWR0aDsKLSAgICAgICAgUmVzdG9yZVN0YXRlIG1SZXN0b3JlU3RhdGU7IC8vIG9ubHkgbm9uLW51bGwgaWYgaXQgaXMgZm9yIHRoZSBmaXJzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGljdHVyZSBzZXQgYWZ0ZXIgdGhlIGZpcnN0IGxheW91dAorICAgICAgICAvLyBvbmx5IG5vbi1udWxsIGlmIGl0IGlzIGZvciB0aGUgZmlyc3QgcGljdHVyZSBzZXQgYWZ0ZXIgdGhlIGZpcnN0IGxheW91dAorICAgICAgICBWaWV3U3RhdGUgbVZpZXdTdGF0ZTsKICAgICAgICAgYm9vbGVhbiBtRm9jdXNTaXplQ2hhbmdlZDsKICAgICB9CiAKQEAgLTE3MjQsOCArMTgzOCw4IEBACiAgICAgICAgIG1EcmF3SXNTY2hlZHVsZWQgPSBmYWxzZTsKICAgICAgICAgRHJhd0RhdGEgZHJhdyA9IG5ldyBEcmF3RGF0YSgpOwogICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFV19DT1JFKSBMb2cudihMT0dUQUcsICJ3ZWJraXREcmF3IHN0YXJ0Iik7Ci0gICAgICAgIGlmIChuYXRpdmVSZWNvcmRDb250ZW50KGRyYXcubUludmFsUmVnaW9uLCBkcmF3Lm1XaWR0aEhlaWdodCkKLSAgICAgICAgICAgICAgICA9PSBmYWxzZSkgeworICAgICAgICBkcmF3Lm1CYXNlTGF5ZXIgPSBuYXRpdmVSZWNvcmRDb250ZW50KGRyYXcubUludmFsUmVnaW9uLCBkcmF3Lm1XaWR0aEhlaWdodCk7CisgICAgICAgIGlmIChkcmF3Lm1CYXNlTGF5ZXIgPT0gMCkgewogICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgTG9nLnYoTE9HVEFHLCAid2Via2l0RHJhdyBhYm9ydCIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0xNzQxLDkgKzE4NTUsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1WaWV3cG9ydFdpZHRoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUdldENvbnRlbnRNaW5QcmVmV2lkdGgoKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVJlc3RvcmVTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZHJhdy5tUmVzdG9yZVN0YXRlID0gbVJlc3RvcmVTdGF0ZTsKLSAgICAgICAgICAgICAgICBtUmVzdG9yZVN0YXRlID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChtSW5pdGlhbFZpZXdTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZHJhdy5tVmlld1N0YXRlID0gbUluaXRpYWxWaWV3U3RhdGU7CisgICAgICAgICAgICAgICAgaWYgKG1WaWV3cG9ydFdpZHRoID09IC0xICYmIG1TZXR0aW5ncy5nZXRVc2VGaXhlZFZpZXdwb3J0KCkgJiYKKyAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBmaXhlZFZpZXdwb3J0TWFyZ2luID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAorICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uZml4ZWRfdmlld3BvcnRfbWFyZ2luKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHdlYnNpdGUncyBpbml0aWFsIHByZWZlcnJlZCB3aWR0aCBhcyB0aGUgZml4ZWQgdmlld3BvcnQgd2lkdGguCisgICAgICAgICAgICAgICAgICAgIG1WaWV3cG9ydFdpZHRoID0gTWF0aC5taW4obVNldHRpbmdzLmdldE1heEZpeGVkVmlld3BvcnRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy5tTWluUHJlZldpZHRoICsgMiAqIGZpeGVkVmlld3BvcnRNYXJnaW4pOworICAgICAgICAgICAgICAgICAgICBkcmF3Lm1WaWV3U3RhdGUubVZpZXdwb3J0V2lkdGggPSBtVmlld3BvcnRXaWR0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUgPSBudWxsOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgTG9nLnYoTE9HVEFHLCAid2Via2l0RHJhdyBORVdfUElDVFVSRV9NU0dfSUQiKTsKICAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwKQEAgLTE3NTgsNTEgKzE4ODEsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gVGhlc2UgYXJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQsIG5vdCBvdXIgdGhyZWFkCi0KLSAgICBzdGF0aWMgZmluYWwgaW50IFpPT01fQklUUyA9IFBhaW50LkZJTFRFUl9CSVRNQVBfRkxBRyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkRJVEhFUl9GTEFHIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuU1VCUElYRUxfVEVYVF9GTEFHOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX0JJVFMgPSBQYWludC5GSUxURVJfQklUTUFQX0ZMQUcgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkRJVEhFUl9GTEFHOwotCi0gICAgZmluYWwgRHJhd0ZpbHRlciBtWm9vbUZpbHRlciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBQYWludEZsYWdzRHJhd0ZpbHRlcihaT09NX0JJVFMsIFBhaW50LkxJTkVBUl9URVhUX0ZMQUcpOwotICAgIC8vIElmIHdlIG5lZWQgdG8gdHJhZGUgYmV0dGVyIHF1YWxpdHkgZm9yIHNwZWVkLCBzZXQgbVNjcm9sbEZpbHRlciB0byBudWxsCi0gICAgZmluYWwgRHJhd0ZpbHRlciBtU2Nyb2xsRmlsdGVyID0KLSAgICAgICAgICAgICAgICBuZXcgUGFpbnRGbGFnc0RyYXdGaWx0ZXIoU0NST0xMX0JJVFMsIDApOwotCi0gICAgLyogcGFja2FnZSAqLyB2b2lkIGRyYXdDb250ZW50UGljdHVyZShDYW52YXMgY2FudmFzLCBpbnQgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFuaW1hdGluZ1pvb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFuaW1hdGluZ1Njcm9sbCkgewotICAgICAgICBEcmF3RmlsdGVyIGRmID0gbnVsbDsKLSAgICAgICAgaWYgKGFuaW1hdGluZ1pvb20pIHsKLSAgICAgICAgICAgIGRmID0gbVpvb21GaWx0ZXI7Ci0gICAgICAgIH0gZWxzZSBpZiAoYW5pbWF0aW5nU2Nyb2xsKSB7Ci0gICAgICAgICAgICBkZiA9IG1TY3JvbGxGaWx0ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgY2FudmFzLnNldERyYXdGaWx0ZXIoZGYpOwotICAgICAgICBib29sZWFuIHRvb2tUb29Mb25nID0gbmF0aXZlRHJhd0NvbnRlbnQoY2FudmFzLCBjb2xvcik7Ci0gICAgICAgIGNhbnZhcy5zZXREcmF3RmlsdGVyKG51bGwpOwotICAgICAgICBpZiAodG9va1Rvb0xvbmcgJiYgbVNwbGl0UGljdHVyZUlzU2NoZWR1bGVkID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBtU3BsaXRQaWN0dXJlSXNTY2hlZHVsZWQgPSB0cnVlOwotICAgICAgICAgICAgc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU1BMSVRfUElDVFVSRV9TRVQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBwaWN0dXJlUmVhZHkoKSB7Ci0gICAgICAgIHJldHVybiAwICE9IG1OYXRpdmVDbGFzcyA/IG5hdGl2ZVBpY3R1cmVSZWFkeSgpIDogZmFsc2U7Ci0gICAgfQotCi0gICAgLypwYWNrYWdlKi8gc3luY2hyb25pemVkIFBpY3R1cmUgY29weUNvbnRlbnRQaWN0dXJlKCkgewotICAgICAgICBQaWN0dXJlIHJlc3VsdCA9IG5ldyBQaWN0dXJlKCk7Ci0gICAgICAgIGlmICgwICE9IG1OYXRpdmVDbGFzcykgewotICAgICAgICAgICAgbmF0aXZlQ29weUNvbnRlbnRUb1BpY3R1cmUocmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQogICAgIHN0YXRpYyB2b2lkIHJlZHVjZVByaW9yaXR5KCkgewogICAgICAgICAvLyByZW1vdmUgdGhlIHBlbmRpbmcgUkVEVUNFX1BSSU9SSVRZIGFuZCBSRVNVTUVfUFJJT1JJVFkgbWVzc2FnZXMKICAgICAgICAgc1dlYkNvcmVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKFdlYkNvcmVUaHJlYWQuUkVEVUNFX1BSSU9SSVRZKTsKQEAgLTE4MjQsNiArMTkwMiw4IEBACiAgICAgICAgIC8vIGNhbGxlZCBmcm9tIFVJIHRocmVhZCB3aGlsZSBXRUJLSVRfRFJBVyBpcyBqdXN0IHB1bGxlZCBvdXQgb2YgdGhlCiAgICAgICAgIC8vIHF1ZXVlIGluIFdlYkNvcmUgdGhyZWFkIHRvIGJlIGV4ZWN1dGVkLiBUaGVuIHVwZGF0ZSB3b24ndCBiZSBibG9ja2VkLgogICAgICAgICBpZiAoY29yZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIWNvcmUuZ2V0U2V0dGluZ3MoKS5lbmFibGVTbW9vdGhUcmFuc2l0aW9uKCkpIHJldHVybjsKKwogICAgICAgICAgICAgc3luY2hyb25pemVkIChjb3JlKSB7CiAgICAgICAgICAgICAgICAgY29yZS5tRHJhd0lzUGF1c2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBpZiAoY29yZS5tRHJhd0lzU2NoZWR1bGVkKSB7CkBAIC0xODM2LDEyICsxOTE2LDE2IEBACiAKICAgICBzdGF0aWMgdm9pZCByZXN1bWVVcGRhdGVQaWN0dXJlKFdlYlZpZXdDb3JlIGNvcmUpIHsKICAgICAgICAgaWYgKGNvcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gaWYgbURyYXdJc1BhdXNlZCBpcyB0cnVlLCBpZ25vcmUgdGhlIHNldHRpbmcsIGNvbnRpbnVlIHRvIHJlc3VtZQorICAgICAgICAgICAgaWYgKCFjb3JlLm1EcmF3SXNQYXVzZWQKKyAgICAgICAgICAgICAgICAgICAgJiYgIWNvcmUuZ2V0U2V0dGluZ3MoKS5lbmFibGVTbW9vdGhUcmFuc2l0aW9uKCkpIHJldHVybjsKKwogICAgICAgICAgICAgc3luY2hyb25pemVkIChjb3JlKSB7CiAgICAgICAgICAgICAgICAgY29yZS5tRHJhd0lzUGF1c2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKGNvcmUubURyYXdJc1NjaGVkdWxlZCkgewotICAgICAgICAgICAgICAgICAgICBjb3JlLm1EcmF3SXNTY2hlZHVsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgY29yZS5jb250ZW50RHJhdygpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBhbHdheXMgcmVkcmF3IG9uIHJlc3VtZSB0byByZWVuYWJsZSBnaWYgYW5pbWF0aW9ucworICAgICAgICAgICAgICAgIGNvcmUubURyYXdJc1NjaGVkdWxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNvcmUubmF0aXZlQ29udGVudEludmFsaWRhdGVBbGwoKTsKKyAgICAgICAgICAgICAgICBjb3JlLmNvbnRlbnREcmF3KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xOTc4LDI0ICsyMDYyLDYgQEAKICAgICAgICAgbVJlcGFpbnRTY2hlZHVsZWQgPSBmYWxzZTsKICAgICB9CiAKLSAgICAvLyBjYWxsZWQgYnkgSk5JCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRJbW1lZGlhdGVSZXBhaW50KCkgewotICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCAmJiAhbVJlcGFpbnRTY2hlZHVsZWQpIHsKLSAgICAgICAgICAgIG1SZXBhaW50U2NoZWR1bGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuSU1NRURJQVRFX1JFUEFJTlRfTVNHX0lEKS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGNhbGxlZCBieSBKTkkKLSAgICBwcml2YXRlIHZvaWQgc2V0Um9vdExheWVyKGludCBsYXllcikgewotICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5TRVRfUk9PVF9MQVlFUl9NU0dfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciwgMCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKiBwYWNrYWdlICovIFdlYlZpZXcgZ2V0V2ViVmlldygpIHsKICAgICAgICAgcmV0dXJuIG1XZWJWaWV3OwogICAgIH0KQEAgLTIwMTIsMTggKzIwNzgsMjQgQEAKIAogICAgICAgICBpZiAobVdlYlZpZXcgPT0gbnVsbCkgcmV0dXJuOwogCi0gICAgICAgIGJvb2xlYW4gdXBkYXRlUmVzdG9yZVN0YXRlID0gc3RhbmRhcmRMb2FkIHx8IG1SZXN0b3JlZFNjYWxlID4gMDsKLSAgICAgICAgc2V0dXBWaWV3cG9ydCh1cGRhdGVSZXN0b3JlU3RhdGUpOworICAgICAgICBib29sZWFuIHVwZGF0ZVZpZXdTdGF0ZSA9IHN0YW5kYXJkTG9hZCB8fCBtUmVzdG9yZWRTY2FsZSA+IDA7CisgICAgICAgIHNldHVwVmlld3BvcnQodXBkYXRlVmlld1N0YXRlKTsKICAgICAgICAgLy8gaWYgdXBkYXRlUmVzdG9yZVN0YXRlIGlzIHRydWUsIFZpZXdNYW5hZ2VyLnBvc3RSZWFkeVRvRHJhd0FsbCgpIHdpbGwKLSAgICAgICAgLy8gYmUgY2FsbGVkIGFmdGVyIHRoZSBXZWJWaWV3IHJlc3RvcmUgdGhlIHN0YXRlLiBJZiB1cGRhdGVSZXN0b3JlU3RhdGUKKyAgICAgICAgLy8gYmUgY2FsbGVkIGFmdGVyIHRoZSBXZWJWaWV3IHVwZGF0ZXMgaXRzIHN0YXRlLiBJZiB1cGRhdGVSZXN0b3JlU3RhdGUKICAgICAgICAgLy8gaXMgZmFsc2UsIHN0YXJ0IHRvIGRyYXcgbm93IGFzIGl0IGlzIHJlYWR5LgotICAgICAgICBpZiAoIXVwZGF0ZVJlc3RvcmVTdGF0ZSkgeworICAgICAgICBpZiAoIXVwZGF0ZVZpZXdTdGF0ZSkgewogICAgICAgICAgICAgbVdlYlZpZXcubVZpZXdNYW5hZ2VyLnBvc3RSZWFkeVRvRHJhd0FsbCgpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gcmVtb3ZlIHRoZSB0b3VjaCBoaWdobGlnaHQgd2hlbiBtb3ZpbmcgdG8gYSBuZXcgcGFnZQorICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgIG1FdmVudEh1Yi5zZW5kTWVzc2FnZShNZXNzYWdlLm9idGFpbihudWxsLAorICAgICAgICAgICAgICAgICAgICBFdmVudEh1Yi5SRU1PVkVfVE9VQ0hfSElHSExJR0hUX1JFQ1RTKSk7CisgICAgICAgIH0KKwogICAgICAgICAvLyByZXNldCB0aGUgc2Nyb2xsIHBvc2l0aW9uLCB0aGUgcmVzdG9yZWQgb2Zmc2V0IGFuZCBzY2FsZXMKICAgICAgICAgbVdlYmtpdFNjcm9sbFggPSBtV2Via2l0U2Nyb2xsWSA9IG1SZXN0b3JlZFggPSBtUmVzdG9yZWRZCi0gICAgICAgICAgICAgICAgPSBtUmVzdG9yZWRTY2FsZSA9IG1SZXN0b3JlZFNjcmVlbldpZHRoU2NhbGUgPSAwOworICAgICAgICAgICAgICAgID0gbVJlc3RvcmVkU2NhbGUgPSBtUmVzdG9yZWRUZXh0V3JhcFNjYWxlID0gMDsKICAgICB9CiAKICAgICAvLyBjYWxsZWQgYnkgSk5JCkBAIC0yMDM3LDE1ICsyMTA5LDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2V0dXBWaWV3cG9ydChib29sZWFuIHVwZGF0ZVJlc3RvcmVTdGF0ZSkgeworICAgIHByaXZhdGUgdm9pZCBzZXR1cFZpZXdwb3J0KGJvb2xlYW4gdXBkYXRlVmlld1N0YXRlKSB7CiAgICAgICAgIC8vIHNldCB0aGUgdmlld3BvcnQgc2V0dGluZ3MgZnJvbSBXZWJLaXQKICAgICAgICAgc2V0Vmlld3BvcnRTZXR0aW5nc0Zyb21OYXRpdmUoKTsKIAogICAgICAgICAvLyBhZGp1c3QgdGhlIGRlZmF1bHQgc2NhbGUgdG8gbWF0Y2ggdGhlIGRlbnNpdHlEcGkKICAgICAgICAgZmxvYXQgYWRqdXN0ID0gMS4wZjsKICAgICAgICAgaWYgKG1WaWV3cG9ydERlbnNpdHlEcGkgPT0gLTEpIHsKLSAgICAgICAgICAgIGlmIChXZWJWaWV3LkRFRkFVTFRfU0NBTEVfUEVSQ0VOVCAhPSAxMDApIHsKLSAgICAgICAgICAgICAgICBhZGp1c3QgPSBXZWJWaWV3LkRFRkFVTFRfU0NBTEVfUEVSQ0VOVCAvIDEwMC4wZjsKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgZGVmYXVsdCB6b29tIHNjYWxlIHRvIGEgaW50ZWdlciAocGVyY2VudGFnZSkgdG8gYXZvaWQgYW55CisgICAgICAgICAgICAvLyBpc3N1ZXMgd2l0aCBmbG9hdGluZyBwb2ludCBjb21wYXJpc29ucworICAgICAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwgJiYgKGludCkobVdlYlZpZXcuZ2V0RGVmYXVsdFpvb21TY2FsZSgpICogMTAwKSAhPSAxMDApIHsKKyAgICAgICAgICAgICAgICBhZGp1c3QgPSBtV2ViVmlldy5nZXREZWZhdWx0Wm9vbVNjYWxlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobVZpZXdwb3J0RGVuc2l0eURwaSA+IDApIHsKICAgICAgICAgICAgIGFkanVzdCA9IChmbG9hdCkgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5RHBpCkBAIC0yMDg3LDE3ICsyMTYxLDE3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBpZiBtVmlld3BvcnRXaWR0aCBpcyAwLCBpdCBtZWFucyBkZXZpY2Utd2lkdGgsIGFsd2F5cyB1cGRhdGUuCi0gICAgICAgIGlmIChtVmlld3BvcnRXaWR0aCAhPSAwICYmICF1cGRhdGVSZXN0b3JlU3RhdGUpIHsKLSAgICAgICAgICAgIFJlc3RvcmVTdGF0ZSByZXN0b3JlU3RhdGUgPSBuZXcgUmVzdG9yZVN0YXRlKCk7Ci0gICAgICAgICAgICByZXN0b3JlU3RhdGUubU1pblNjYWxlID0gbVZpZXdwb3J0TWluaW11bVNjYWxlIC8gMTAwLjBmOwotICAgICAgICAgICAgcmVzdG9yZVN0YXRlLm1NYXhTY2FsZSA9IG1WaWV3cG9ydE1heGltdW1TY2FsZSAvIDEwMC4wZjsKLSAgICAgICAgICAgIHJlc3RvcmVTdGF0ZS5tRGVmYXVsdFNjYWxlID0gYWRqdXN0OworICAgICAgICBpZiAobVZpZXdwb3J0V2lkdGggIT0gMCAmJiAhdXBkYXRlVmlld1N0YXRlKSB7CisgICAgICAgICAgICBWaWV3U3RhdGUgdmlld1N0YXRlID0gbmV3IFZpZXdTdGF0ZSgpOworICAgICAgICAgICAgdmlld1N0YXRlLm1NaW5TY2FsZSA9IG1WaWV3cG9ydE1pbmltdW1TY2FsZSAvIDEwMC4wZjsKKyAgICAgICAgICAgIHZpZXdTdGF0ZS5tTWF4U2NhbGUgPSBtVmlld3BvcnRNYXhpbXVtU2NhbGUgLyAxMDAuMGY7CisgICAgICAgICAgICB2aWV3U3RhdGUubURlZmF1bHRTY2FsZSA9IGFkanVzdDsKICAgICAgICAgICAgIC8vIGFzIG1WaWV3cG9ydFdpZHRoIGlzIG5vdCAwLCBpdCBpcyBub3QgbW9iaWxlIHNpdGUuCi0gICAgICAgICAgICByZXN0b3JlU3RhdGUubU1vYmlsZVNpdGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHZpZXdTdGF0ZS5tTW9iaWxlU2l0ZSA9IGZhbHNlOwogICAgICAgICAgICAgLy8gZm9yIG5vbi1tb2JpbGUgc2l0ZSwgd2UgZG9uJ3QgbmVlZCBtaW5QcmVmV2lkdGgsIHNldCBpdCBhcyAwCi0gICAgICAgICAgICByZXN0b3JlU3RhdGUubVNjcm9sbFggPSAwOworICAgICAgICAgICAgdmlld1N0YXRlLm1TY3JvbGxYID0gMDsKICAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5VUERBVEVfWk9PTV9SQU5HRSwgcmVzdG9yZVN0YXRlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5VUERBVEVfWk9PTV9SQU5HRSwgdmlld1N0YXRlKS5zZW5kVG9UYXJnZXQoKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC0yMTE4LDMyICsyMTkyLDMyIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB3ZWJWaWV3V2lkdGggPSBNYXRoLnJvdW5kKHZpZXdwb3J0V2lkdGggKiBtQ3VycmVudFZpZXdTY2FsZSk7CiAgICAgICAgIH0KLSAgICAgICAgbVJlc3RvcmVTdGF0ZSA9IG5ldyBSZXN0b3JlU3RhdGUoKTsKLSAgICAgICAgbVJlc3RvcmVTdGF0ZS5tTWluU2NhbGUgPSBtVmlld3BvcnRNaW5pbXVtU2NhbGUgLyAxMDAuMGY7Ci0gICAgICAgIG1SZXN0b3JlU3RhdGUubU1heFNjYWxlID0gbVZpZXdwb3J0TWF4aW11bVNjYWxlIC8gMTAwLjBmOwotICAgICAgICBtUmVzdG9yZVN0YXRlLm1EZWZhdWx0U2NhbGUgPSBhZGp1c3Q7Ci0gICAgICAgIG1SZXN0b3JlU3RhdGUubVNjcm9sbFggPSBtUmVzdG9yZWRYOwotICAgICAgICBtUmVzdG9yZVN0YXRlLm1TY3JvbGxZID0gbVJlc3RvcmVkWTsKLSAgICAgICAgbVJlc3RvcmVTdGF0ZS5tTW9iaWxlU2l0ZSA9ICgwID09IG1WaWV3cG9ydFdpZHRoKTsKKyAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUgPSBuZXcgVmlld1N0YXRlKCk7CisgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1NaW5TY2FsZSA9IG1WaWV3cG9ydE1pbmltdW1TY2FsZSAvIDEwMC4wZjsKKyAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubU1heFNjYWxlID0gbVZpZXdwb3J0TWF4aW11bVNjYWxlIC8gMTAwLjBmOworICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tRGVmYXVsdFNjYWxlID0gYWRqdXN0OworICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tU2Nyb2xsWCA9IG1SZXN0b3JlZFg7CisgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1TY3JvbGxZID0gbVJlc3RvcmVkWTsKKyAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubU1vYmlsZVNpdGUgPSAoMCA9PSBtVmlld3BvcnRXaWR0aCk7CisgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3cG9ydFdpZHRoID0gbVZpZXdwb3J0V2lkdGg7CiAgICAgICAgIGlmIChtUmVzdG9yZWRTY2FsZSA+IDApIHsKLSAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVZpZXdTY2FsZSA9IG1SZXN0b3JlZFNjYWxlIC8gMTAwLjBmOwotICAgICAgICAgICAgaWYgKG1SZXN0b3JlZFNjcmVlbldpZHRoU2NhbGUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzdG9yZWRTY3JlZW5XaWR0aFNjYWxlIC8gMTAwLjBmOworICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZSA9IG1SZXN0b3JlZFNjYWxlIC8gMTAwLjBmOworICAgICAgICAgICAgaWYgKG1SZXN0b3JlZFRleHRXcmFwU2NhbGUgPiAwKSB7CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUgPSBtUmVzdG9yZWRUZXh0V3JhcFNjYWxlIC8gMTAwLjBmOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlID0gbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlOworICAgICAgICAgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlID0gbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChtVmlld3BvcnRJbml0aWFsU2NhbGUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID0gbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZSA9IG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlID0KICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3cG9ydEluaXRpYWxTY2FsZSAvIDEwMC4wZjsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobVZpZXdwb3J0V2lkdGggPiAwICYmIG1WaWV3cG9ydFdpZHRoIDwgd2ViVmlld1dpZHRoKSB7Ci0gICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID0gbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZSA9IG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlID0KICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkgd2ViVmlld1dpZHRoIC8gbVZpZXdwb3J0V2lkdGg7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGUgPSBhZGp1c3Q7CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUgPSBhZGp1c3Q7CiAgICAgICAgICAgICAgICAgLy8gMCB3aWxsIHRyaWdnZXIgV2ViVmlldyB0byB0dXJuIG9uIHpvb20gb3ZlcnZpZXcgbW9kZQotICAgICAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVZpZXdTY2FsZSA9IDA7CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZSA9IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjE4NCwxNSArMjI1OCwxNSBAQAogICAgICAgICAgICAgICAgIC8vIG1WaWV3U2NhbGUgYXMgMCBtZWFucyBpdCBpcyBpbiB6b29tIG92ZXJ2aWV3IG1vZGUuIFNvIHdlIGRvbid0CiAgICAgICAgICAgICAgICAgLy8ga25vdyB0aGUgZXhhY3Qgc2NhbGUuIElmIG1SZXN0b3JlZFNjYWxlIGlzIG5vbi16ZXJvLCB1c2UgaXQ7CiAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGp1c3QgdXNlIG1UZXh0V3JhcFNjYWxlIGFzIHRoZSBpbml0aWFsIHNjYWxlLgotICAgICAgICAgICAgICAgIGRhdGEubVNjYWxlID0gbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID09IDAKKyAgICAgICAgICAgICAgICBkYXRhLm1TY2FsZSA9IG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3U2NhbGUgPT0gMAogICAgICAgICAgICAgICAgICAgICAgICAgPyAobVJlc3RvcmVkU2NhbGUgPiAwID8gbVJlc3RvcmVkU2NhbGUgLyAxMDAuMGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlKQotICAgICAgICAgICAgICAgICAgICAgICAgOiBtUmVzdG9yZVN0YXRlLm1WaWV3U2NhbGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3U2NhbGU7CiAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgewogICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJzZXR1cFZpZXdwb3J0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbVJlc3RvcmVkU2NhbGU9IiArIG1SZXN0b3JlZFNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVmlld1NjYWxlPSIgKyBtUmVzdG9yZVN0YXRlLm1WaWV3U2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1UZXh0V3JhcFNjYWxlPSIgKyBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVmlld1NjYWxlPSIgKyBtSW5pdGlhbFZpZXdTdGF0ZS5tVmlld1NjYWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVGV4dFdyYXBTY2FsZT0iICsgbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZGF0YS5tV2lkdGggPSBNYXRoLnJvdW5kKHdlYlZpZXdXaWR0aCAvIGRhdGEubVNjYWxlKTsKQEAgLTIyMDUsNyArMjI3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKG1XZWJWaWV3LmdldFZpZXdIZWlnaHQoKSAvIGRhdGEubVNjYWxlKQogICAgICAgICAgICAgICAgICAgICAgICAgOiBtQ3VycmVudFZpZXdIZWlnaHQgKiBkYXRhLm1XaWR0aCAvIHZpZXdwb3J0V2lkdGg7CiAgICAgICAgICAgICAgICAgZGF0YS5tVGV4dFdyYXBXaWR0aCA9IE1hdGgucm91bmQod2ViVmlld1dpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAvIG1SZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgLyBtSW5pdGlhbFZpZXdTdGF0ZS5tVGV4dFdyYXBTY2FsZSk7CiAgICAgICAgICAgICAgICAgZGF0YS5tSWdub3JlSGVpZ2h0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgZGF0YS5tQW5jaG9yWCA9IGRhdGEubUFuY2hvclkgPSAwOwogICAgICAgICAgICAgICAgIC8vIHNlbmQgVklFV19TSVpFX0NIQU5HRUQgdG8gdGhlIGZyb250IG9mIHRoZSBxdWV1ZSBzbyB0aGF0IHdlCkBAIC0yMjE4LDIwICsyMjkyLDEyIEBACiAgICAgfQogCiAgICAgLy8gY2FsbGVkIGJ5IEpOSQotICAgIHByaXZhdGUgdm9pZCByZXN0b3JlU2NhbGUoaW50IHNjYWxlKSB7CisgICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVTY2FsZShpbnQgc2NhbGUsIGludCB0ZXh0V3JhcFNjYWxlKSB7CiAgICAgICAgIGlmIChtQnJvd3NlckZyYW1lLmZpcnN0TGF5b3V0RG9uZSgpID09IGZhbHNlKSB7CiAgICAgICAgICAgICBtUmVzdG9yZWRTY2FsZSA9IHNjYWxlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gY2FsbGVkIGJ5IEpOSQotICAgIHByaXZhdGUgdm9pZCByZXN0b3JlU2NyZWVuV2lkdGhTY2FsZShpbnQgc2NhbGUpIHsKLSAgICAgICAgaWYgKCFtU2V0dGluZ3MuZ2V0VXNlV2lkZVZpZXdQb3J0KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQnJvd3NlckZyYW1lLmZpcnN0TGF5b3V0RG9uZSgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBtUmVzdG9yZWRTY3JlZW5XaWR0aFNjYWxlID0gc2NhbGU7CisgICAgICAgICAgICBpZiAobVNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpKSB7CisgICAgICAgICAgICAgICAgbVJlc3RvcmVkVGV4dFdyYXBTY2FsZSA9IHRleHRXcmFwU2NhbGU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIyODEsNiArMjM0Nyw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVVcGRhdGVGcmFtZUNhY2hlSWZMb2FkaW5nKCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVSZXZlYWxTZWxlY3Rpb24oKTsKICAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgbmF0aXZlUmVxdWVzdExhYmVsKGludCBmcmFtZVB0ciwgaW50IG5vZGVQdHIpOwogICAgIC8qKgogICAgICAqIFNjcm9sbCB0aGUgZm9jdXNlZCB0ZXh0ZmllbGQgdG8gKHhQZXJjZW50LCB5KSBpbiBkb2N1bWVudCBzcGFjZQpAQCAtMjMyOSw2ICsyMzk2LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgc2V0V2ViVGV4dFZpZXdBdXRvRmlsbGFibGUoaW50IHF1ZXJ5SWQpIHsKKyAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwgV2ViVmlldy5TRVRfQVVUT0ZJTExBQkxFLCBxdWVyeUlkLAorICAgICAgICAgICAgICAgICAgICAvKiB1bnVzZWQgKi8wKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIGNhbGxlZCBieSBKTkkKICAgICBwcml2YXRlIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKICAgICAgICAgcmV0dXJuIG1Db250ZXh0OwpAQCAtMjQ2OSw2ICsyNTQzLDI0IEBACiAgICAgICAgICAgICAgICAgaE1vZGUsIHZNb2RlKS5zZW5kVG9UYXJnZXQoKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgdXNlTW9ja0RldmljZU9yaWVudGF0aW9uKCkgeworICAgICAgICBtRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyLnVzZU1vY2soKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrRGV2aWNlT3JpZW50YXRpb24oYm9vbGVhbiBjYW5Qcm92aWRlQWxwaGEsIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsIGRvdWJsZSBiZXRhLCBib29sZWFuIGNhblByb3ZpZGVHYW1tYSwgZG91YmxlIGdhbW1hKSB7CisgICAgICAgIG1EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIuc2V0TW9ja09yaWVudGF0aW9uKGNhblByb3ZpZGVBbHBoYSwgYWxwaGEsIGNhblByb3ZpZGVCZXRhLCBiZXRhLAorICAgICAgICAgICAgICAgIGNhblByb3ZpZGVHYW1tYSwgZ2FtbWEpOworICAgIH0KKworICAgIHByb3RlY3RlZCBEZXZpY2VPcmllbnRhdGlvblNlcnZpY2UgZ2V0RGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlKCkgeworICAgICAgICBpZiAobURldmljZU9yaWVudGF0aW9uU2VydmljZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IERldmljZU9yaWVudGF0aW9uU2VydmljZShtRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyLCBtQ29udGV4dCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1EZXZpY2VPcmllbnRhdGlvblNlcnZpY2U7CisgICAgfQorCiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVQYXVzZSgpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlUmVzdW1lKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVGcmVlTWVtb3J5KCk7CkBAIC0yNDc2LDQgKzI1NjgsOCBAQAogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlVmFsaWROb2RlQW5kQm91bmRzKGludCBmcmFtZSwgaW50IG5vZGUsCiAgICAgICAgICAgICBSZWN0IGJvdW5kcyk7CiAKKyAgICBwcml2YXRlIG5hdGl2ZSBBcnJheUxpc3Q8UmVjdD4gbmF0aXZlR2V0VG91Y2hIaWdobGlnaHRSZWN0cyhpbnQgeCwgaW50IHksCisgICAgICAgICAgICBpbnQgc2xvcCk7CisKKyAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlQXV0b0ZpbGxGb3JtKGludCBxdWVyeUlkKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3RGF0YWJhc2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3RGF0YWJhc2UuamF2YQppbmRleCA3YWNkOWJhLi44Zjg5Njc4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0RhdGFiYXNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdEYXRhYmFzZS5qYXZhCkBAIC02Nyw2ICs2Nyw5IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUZvcm1Mb2NrID0gbmV3IE9iamVjdCgpOwogICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1IdHRwQXV0aExvY2sgPSBuZXcgT2JqZWN0KCk7CiAKKyAgICAvLyBUT0RPOiBUaGUgQ2hyb21pdW0gSFRUUCBzdGFjayBoYW5kbGVzIGNvb2tpZXMgaW5kZXBlbmRlbnRseS4KKyAgICAvLyBXZSBzaG91bGQgY29uc2lkZXIgcmVtb3ZpbmcgdGhlIGNvb2tpZXMgdGFibGUgaWYgYW5kIHdoZW4gd2Ugc3dpdGNoIHRvCisgICAgLy8gdGhlIENocm9taXVtIEhUVFAgc3RhY2sgZm9yIGdvb2QuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1UYWJsZU5hbWVzW10gPSB7CiAgICAgICAgICJjb29raWVzIiwgInBhc3N3b3JkIiwgImZvcm11cmwiLCAiZm9ybWRhdGEiLCAiaHR0cGF1dGgiCiAgICAgfTsKQEAgLTE3MywxMTIgKzE3NiwxNDAgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGludCBtQ2FjaGVUcmFuc2FjdGlvblJlZmNvdW50OwogCi0gICAgcHJpdmF0ZSBXZWJWaWV3RGF0YWJhc2UoKSB7CisgICAgLy8gSW5pdGlhbGx5IHRydWUgdW50aWwgdGhlIGJhY2tncm91bmQgdGhyZWFkIGNvbXBsZXRlcy4KKyAgICBwcml2YXRlIGJvb2xlYW4gbUluaXRpYWxpemVkID0gZmFsc2U7CisKKyAgICBwcml2YXRlIFdlYlZpZXdEYXRhYmFzZShmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGluaXQoY29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0uc3RhcnQoKTsKKwogICAgICAgICAvLyBTaW5nbGV0b24gb25seSwgdXNlIGdldEluc3RhbmNlKCkKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBXZWJWaWV3RGF0YWJhc2UgZ2V0SW5zdGFuY2UoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIGlmIChtSW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IFdlYlZpZXdEYXRhYmFzZSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2UgPSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAub3Blbk9yQ3JlYXRlRGF0YWJhc2UoREFUQUJBU0VfRklMRSwgMCwgbnVsbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIHRyeSBhZ2FpbiBieSBkZWxldGluZyB0aGUgb2xkIGRiIGFuZCBjcmVhdGUgYSBuZXcgb25lCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZGVsZXRlRGF0YWJhc2UoREFUQUJBU0VfRklMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZShEQVRBQkFTRV9GSUxFLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBXZWJWaWV3RGF0YWJhc2UoY29udGV4dCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICB9CiAKLSAgICAgICAgICAgIC8vIG1EYXRhYmFzZSBzaG91bGQgbm90IGJlIG51bGwsIAotICAgICAgICAgICAgLy8gdGhlIG9ubHkgY2FzZSBpcyBSZXF1ZXN0QVBJIHRlc3QgaGFzIHByb2JsZW0gdG8gY3JlYXRlIGRiIAotICAgICAgICAgICAgaWYgKG1EYXRhYmFzZSAhPSBudWxsICYmIG1EYXRhYmFzZS5nZXRWZXJzaW9uKCkgIT0gREFUQUJBU0VfVkVSU0lPTikgewotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdXBncmFkZURhdGFiYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbml0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAobUluaXRpYWxpemVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1EYXRhYmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gdXNlIHBlciB0YWJsZSBNdXRleCBsb2NrLCB0dXJuIG9mZiBkYXRhYmFzZSBsb2NrLCB0aGlzCi0gICAgICAgICAgICAgICAgLy8gaW1wcm92ZXMgcGVyZm9ybWFuY2UgYXMgZGF0YWJhc2UncyBSZWVudHJhbnRMb2NrIGlzIGV4cGFuc2l2ZQotICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRMb2NraW5nRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UgPSBjb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKAotICAgICAgICAgICAgICAgICAgICAgICAgQ0FDSEVfREFUQUJBU0VfRklMRSwgMCwgbnVsbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIHRyeSBhZ2FpbiBieSBkZWxldGluZyB0aGUgb2xkIGRiIGFuZCBjcmVhdGUgYSBuZXcgb25lCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZGVsZXRlRGF0YWJhc2UoQ0FDSEVfREFUQUJBU0VfRklMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UgPSBjb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBQ0hFX0RBVEFCQVNFX0ZJTEUsIDAsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbUNhY2hlRGF0YWJhc2Ugc2hvdWxkIG5vdCBiZSBudWxsLCAKLSAgICAgICAgICAgIC8vIHRoZSBvbmx5IGNhc2UgaXMgUmVxdWVzdEFQSSB0ZXN0IGhhcyBwcm9ibGVtIHRvIGNyZWF0ZSBkYiAKLSAgICAgICAgICAgIGlmIChtQ2FjaGVEYXRhYmFzZSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIG1DYWNoZURhdGFiYXNlLmdldFZlcnNpb24oKSAhPSBDQUNIRV9EQVRBQkFTRV9WRVJTSU9OKSB7Ci0gICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZ3JhZGVDYWNoZURhdGFiYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcENhY2hlRGF0YWJhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gRXJhc2UgdGhlIGZpbGVzIGZyb20gdGhlIGZpbGUgc3lzdGVtIGluIHRoZSAKLSAgICAgICAgICAgICAgICAvLyBjYXNlIHRoYXQgdGhlIGRhdGFiYXNlIHdhcyB1cGRhdGVkIGFuZCB0aGUgCi0gICAgICAgICAgICAgICAgLy8gdGhlcmUgd2VyZSBleGlzdGluZyBjYWNoZSBjb250ZW50Ci0gICAgICAgICAgICAgICAgQ2FjaGVNYW5hZ2VyLnJlbW92ZUFsbENhY2hlRmlsZXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1DYWNoZURhdGFiYXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB1c2UgcmVhZF91bmNvbW1pdHRlZCB0byBzcGVlZCB1cCBSRUFECi0gICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UuZXhlY1NRTCgiUFJBR01BIHJlYWRfdW5jb21taXR0ZWQgPSB0cnVlOyIpOwotICAgICAgICAgICAgICAgIC8vIGFzIG9ubHkgUkVBRCBjYW4gYmUgY2FsbGVkIGluIHRoZSBub24tV2ViVmlld1dvcmtlclRocmVhZCwKLSAgICAgICAgICAgICAgICAvLyBhbmQgcmVhZF91bmNvbW1pdHRlZCBpcyB1c2VkLCB3ZSBjYW4gdHVybiBvZmYgZGF0YWJhc2UgbG9jawotICAgICAgICAgICAgICAgIC8vIHRvIHVzZSB0cmFuc2FjdGlvbi4KLSAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZS5zZXRMb2NraW5nRW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyB1c2UgSW5zZXJ0SGVscGVyIGZvciBmYXN0ZXIgaW5zZXJ0aW9uCi0gICAgICAgICAgICAgICAgbUNhY2hlSW5zZXJ0ZXIgPSBuZXcgRGF0YWJhc2VVdGlscy5JbnNlcnRIZWxwZXIobUNhY2hlRGF0YWJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY2FjaGUiKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVVcmxDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfVVJMX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlRmlsZVBhdGhDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRklMRV9QQVRIX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlTGFzdE1vZGlmeUNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9MQVNUX01PRElGWV9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUVUYWdDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRVRBR19DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUV4cGlyZXNDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRVhQSVJFU19DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUV4cGlyZXNTdHJpbmdDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRVhQSVJFU19TVFJJTkdfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVNaW1lVHlwZUNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9NSU1FVFlQRV9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUVuY29kaW5nQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VOQ09ESU5HX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlSHR0cFN0YXR1c0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9IVFRQX1NUQVRVU19DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUxvY2F0aW9uQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0xPQ0FUSU9OX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlQ29udGVudExlbmd0aENvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DT05URU5UTEVOR1RIX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlQ29udGVudERpc3Bvc2l0aW9uQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0NPTlRFTlRESVNQT1NJVElPTl9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUNyb3NzRG9tYWluQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0NST1NTRE9NQUlOX0NPTCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UgPSBjb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKERBVEFCQVNFX0ZJTEUsIDAsIG51bGwpOworICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gdHJ5IGFnYWluIGJ5IGRlbGV0aW5nIHRoZSBvbGQgZGIgYW5kIGNyZWF0ZSBhIG5ldyBvbmUKKyAgICAgICAgICAgIGlmIChjb250ZXh0LmRlbGV0ZURhdGFiYXNlKERBVEFCQVNFX0ZJTEUpKSB7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZShEQVRBQkFTRV9GSUxFLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgICAgICAvLyBtRGF0YWJhc2Ugc2hvdWxkIG5vdCBiZSBudWxsLAorICAgICAgICAvLyB0aGUgb25seSBjYXNlIGlzIFJlcXVlc3RBUEkgdGVzdCBoYXMgcHJvYmxlbSB0byBjcmVhdGUgZGIKKyAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICAgICAgbm90aWZ5KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobURhdGFiYXNlLmdldFZlcnNpb24oKSAhPSBEQVRBQkFTRV9WRVJTSU9OKSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB1cGdyYWRlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdXNlIHBlciB0YWJsZSBNdXRleCBsb2NrLCB0dXJuIG9mZiBkYXRhYmFzZSBsb2NrLCB0aGlzCisgICAgICAgIC8vIGltcHJvdmVzIHBlcmZvcm1hbmNlIGFzIGRhdGFiYXNlJ3MgUmVlbnRyYW50TG9jayBpcworICAgICAgICAvLyBleHBhbnNpdmUKKyAgICAgICAgbURhdGFiYXNlLnNldExvY2tpbmdFbmFibGVkKGZhbHNlKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UgPSBjb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKAorICAgICAgICAgICAgICAgICAgICBDQUNIRV9EQVRBQkFTRV9GSUxFLCAwLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHRyeSBhZ2FpbiBieSBkZWxldGluZyB0aGUgb2xkIGRiIGFuZCBjcmVhdGUgYSBuZXcgb25lCisgICAgICAgICAgICBpZiAoY29udGV4dC5kZWxldGVEYXRhYmFzZShDQUNIRV9EQVRBQkFTRV9GSUxFKSkgeworICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIENBQ0hFX0RBVEFCQVNFX0ZJTEUsIDAsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbUNhY2hlRGF0YWJhc2Ugc2hvdWxkIG5vdCBiZSBudWxsLAorICAgICAgICAvLyB0aGUgb25seSBjYXNlIGlzIFJlcXVlc3RBUEkgdGVzdCBoYXMgcHJvYmxlbSB0byBjcmVhdGUgZGIKKyAgICAgICAgaWYgKG1DYWNoZURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgICAgICBub3RpZnkoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQ2FjaGVEYXRhYmFzZS5nZXRWZXJzaW9uKCkgIT0gQ0FDSEVfREFUQUJBU0VfVkVSU0lPTikgeworICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB1cGdyYWRlQ2FjaGVEYXRhYmFzZSgpOworICAgICAgICAgICAgICAgIGJvb3RzdHJhcENhY2hlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEVyYXNlIHRoZSBmaWxlcyBmcm9tIHRoZSBmaWxlIHN5c3RlbSBpbiB0aGUKKyAgICAgICAgICAgIC8vIGNhc2UgdGhhdCB0aGUgZGF0YWJhc2Ugd2FzIHVwZGF0ZWQgYW5kIHRoZQorICAgICAgICAgICAgLy8gdGhlcmUgd2VyZSBleGlzdGluZyBjYWNoZSBjb250ZW50CisgICAgICAgICAgICBDYWNoZU1hbmFnZXIucmVtb3ZlQWxsQ2FjaGVGaWxlcygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdXNlIHJlYWRfdW5jb21taXR0ZWQgdG8gc3BlZWQgdXAgUkVBRAorICAgICAgICBtQ2FjaGVEYXRhYmFzZS5leGVjU1FMKCJQUkFHTUEgcmVhZF91bmNvbW1pdHRlZCA9IHRydWU7Iik7CisgICAgICAgIC8vIGFzIG9ubHkgUkVBRCBjYW4gYmUgY2FsbGVkIGluIHRoZQorICAgICAgICAvLyBub24tV2ViVmlld1dvcmtlclRocmVhZCwgYW5kIHJlYWRfdW5jb21taXR0ZWQgaXMgdXNlZCwKKyAgICAgICAgLy8gd2UgY2FuIHR1cm4gb2ZmIGRhdGFiYXNlIGxvY2sgdG8gdXNlIHRyYW5zYWN0aW9uLgorICAgICAgICBtQ2FjaGVEYXRhYmFzZS5zZXRMb2NraW5nRW5hYmxlZChmYWxzZSk7CisKKyAgICAgICAgLy8gdXNlIEluc2VydEhlbHBlciBmb3IgZmFzdGVyIGluc2VydGlvbgorICAgICAgICBtQ2FjaGVJbnNlcnRlciA9CisgICAgICAgICAgICAgICAgbmV3IERhdGFiYXNlVXRpbHMuSW5zZXJ0SGVscGVyKG1DYWNoZURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlIik7CisgICAgICAgIG1DYWNoZVVybENvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfVVJMX0NPTCk7CisgICAgICAgIG1DYWNoZUZpbGVQYXRoQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9GSUxFX1BBVEhfQ09MKTsKKyAgICAgICAgbUNhY2hlTGFzdE1vZGlmeUNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfTEFTVF9NT0RJRllfQ09MKTsKKyAgICAgICAgbUNhY2hlRVRhZ0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRVRBR19DT0wpOworICAgICAgICBtQ2FjaGVFeHBpcmVzQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9FWFBJUkVTX0NPTCk7CisgICAgICAgIG1DYWNoZUV4cGlyZXNTdHJpbmdDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VYUElSRVNfU1RSSU5HX0NPTCk7CisgICAgICAgIG1DYWNoZU1pbWVUeXBlQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9NSU1FVFlQRV9DT0wpOworICAgICAgICBtQ2FjaGVFbmNvZGluZ0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRU5DT0RJTkdfQ09MKTsKKyAgICAgICAgbUNhY2hlSHR0cFN0YXR1c0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfSFRUUF9TVEFUVVNfQ09MKTsKKyAgICAgICAgbUNhY2hlTG9jYXRpb25Db2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0xPQ0FUSU9OX0NPTCk7CisgICAgICAgIG1DYWNoZUNvbnRlbnRMZW5ndGhDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0NPTlRFTlRMRU5HVEhfQ09MKTsKKyAgICAgICAgbUNhY2hlQ29udGVudERpc3Bvc2l0aW9uQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DT05URU5URElTUE9TSVRJT05fQ09MKTsKKyAgICAgICAgbUNhY2hlQ3Jvc3NEb21haW5Db2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0NST1NTRE9NQUlOX0NPTCk7CisKKyAgICAgICAgLy8gVGhyZWFkIGRvbmUsIG5vdGlmeS4KKyAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgbm90aWZ5KCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGdyYWRlRGF0YWJhc2UoKSB7CkBAIC0zOTEsOCArNDIyLDI1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBXYWl0IGZvciB0aGUgYmFja2dyb3VuZCBpbml0aWFsaXphdGlvbiB0aHJlYWQgdG8gY29tcGxldGUgYW5kIGNoZWNrIHRoZQorICAgIC8vIGRhdGFiYXNlIGNyZWF0aW9uIHN0YXR1cy4KKyAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tJbml0aWFsaXplZCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICB3aGlsZSAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdhaXQoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgIkNhdWdodCBleGNlcHRpb24gd2hpbGUgY2hlY2tpbmcgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluaXRpYWxpemF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgTG9nLmdldFN0YWNrVHJhY2VTdHJpbmcoZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURhdGFiYXNlICE9IG51bGw7CisgICAgfQorCiAgICAgcHJpdmF0ZSBib29sZWFuIGhhc0VudHJpZXMoaW50IHRhYmxlSWQpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIApAQCAtNDIyLDcgKzQ3MCw3IEBACiAgICAgICovCiAgICAgQXJyYXlMaXN0PENvb2tpZT4gZ2V0Q29va2llc0ZvckRvbWFpbihTdHJpbmcgZG9tYWluKSB7CiAgICAgICAgIEFycmF5TGlzdDxDb29raWU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PENvb2tpZT4oKTsKLSAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gbGlzdDsKICAgICAgICAgfQogCkBAIC00ODEsNyArNTI5LDcgQEAKICAgICAgKiAgICAgICAgICAgIGRlbGV0ZWQuCiAgICAgICovCiAgICAgdm9pZCBkZWxldGVDb29raWVzKFN0cmluZyBkb21haW4sIFN0cmluZyBwYXRoLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAoZG9tYWluID09IG51bGwgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC01MDEsNyArNTQ5LDcgQEAKICAgICAgKi8KICAgICB2b2lkIGFkZENvb2tpZShDb29raWUgY29va2llKSB7CiAgICAgICAgIGlmIChjb29raWUuZG9tYWluID09IG51bGwgfHwgY29va2llLnBhdGggPT0gbnVsbCB8fCBjb29raWUubmFtZSA9PSBudWxsCi0gICAgICAgICAgICAgICAgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNTM0LDcgKzU4Miw3IEBACiAgICAgICogQ2xlYXIgY29va2llIGRhdGFiYXNlCiAgICAgICovCiAgICAgdm9pZCBjbGVhckNvb2tpZXMoKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTU0Nyw3ICs1OTUsNyBAQAogICAgICAqIENsZWFyIHNlc3Npb24gY29va2llcywgd2hpY2ggbWVhbnMgY29va2llIGRvZXNuJ3QgaGF2ZSBFWFBJUkVTLgogICAgICAqLwogICAgIHZvaWQgY2xlYXJTZXNzaW9uQ29va2llcygpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNTY0LDcgKzYxMiw3IEBACiAgICAgICogQHBhcmFtIG5vdyBUaW1lIGZvciBub3cKICAgICAgKi8KICAgICB2b2lkIGNsZWFyRXhwaXJlZENvb2tpZXMobG9uZyBub3cpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNjIwLDcgKzY2OCw3IEBACiAgICAgICogQHJldHVybiBDYWNoZVJlc3VsdCBUaGUgQ2FjaGVNYW5hZ2VyLkNhY2hlUmVzdWx0CiAgICAgICovCiAgICAgQ2FjaGVSZXN1bHQgZ2V0Q2FjaGUoU3RyaW5nIHVybCkgewotICAgICAgICBpZiAodXJsID09IG51bGwgfHwgbUNhY2hlRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIApAQCAtNjYwLDcgKzcwOCw3IEBACiAgICAgICogQHBhcmFtIHVybCBUaGUgdXJsCiAgICAgICovCiAgICAgdm9pZCByZW1vdmVDYWNoZShTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCBtQ2FjaGVEYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNjc0LDcgKzcyMiw3IEBACiAgICAgICogQHBhcmFtIGMgVGhlIENhY2hlTWFuYWdlci5DYWNoZVJlc3VsdAogICAgICAqLwogICAgIHZvaWQgYWRkQ2FjaGUoU3RyaW5nIHVybCwgQ2FjaGVSZXN1bHQgYykgewotICAgICAgICBpZiAodXJsID09IG51bGwgfHwgbUNhY2hlRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTcwMCw3ICs3NDgsNyBAQAogICAgICAqIENsZWFyIGNhY2hlIGRhdGFiYXNlCiAgICAgICovCiAgICAgdm9pZCBjbGVhckNhY2hlKCkgewotICAgICAgICBpZiAobUNhY2hlRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTcwOCw3ICs3NTYsNyBAQAogICAgIH0KIAogICAgIGJvb2xlYW4gaGFzQ2FjaGUoKSB7Ci0gICAgICAgIGlmIChtQ2FjaGVEYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIApAQCAtODM0LDcgKzg4Miw3IEBACiAgICAgICovCiAgICAgdm9pZCBzZXRVc2VybmFtZVBhc3N3b3JkKFN0cmluZyBzY2hlbWVQbHVzSG9zdCwgU3RyaW5nIHVzZXJuYW1lLAogICAgICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCkgewotICAgICAgICBpZiAoc2NoZW1lUGx1c0hvc3QgPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoc2NoZW1lUGx1c0hvc3QgPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtODU2LDcgKzkwNCw3IEBACiAgICAgICogICAgICAgICBTdHJpbmdbMV0gaXMgcGFzc3dvcmQuIFJldHVybiBudWxsIGlmIGl0IGNhbid0IGZpbmQgYW55dGhpbmcuCiAgICAgICovCiAgICAgU3RyaW5nW10gZ2V0VXNlcm5hbWVQYXNzd29yZChTdHJpbmcgc2NoZW1lUGx1c0hvc3QpIHsKLSAgICAgICAgaWYgKHNjaGVtZVBsdXNIb3N0ID09IG51bGwgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKHNjaGVtZVBsdXNIb3N0ID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIApAQCAtOTAyLDcgKzk1MCw3IEBACiAgICAgICogQ2xlYXIgcGFzc3dvcmQgZGF0YWJhc2UKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhclVzZXJuYW1lUGFzc3dvcmQoKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTkyNyw3ICs5NzUsNyBAQAogICAgICAqLwogICAgIHZvaWQgc2V0SHR0cEF1dGhVc2VybmFtZVBhc3N3b3JkKFN0cmluZyBob3N0LCBTdHJpbmcgcmVhbG0sIFN0cmluZyB1c2VybmFtZSwKICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCkgewotICAgICAgICBpZiAoaG9zdCA9PSBudWxsIHx8IHJlYWxtID09IG51bGwgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByZWFsbSA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC05NTIsNyArMTAwMCw3IEBACiAgICAgICogICAgICAgICBTdHJpbmdbMV0gaXMgcGFzc3dvcmQuIFJldHVybiBudWxsIGlmIGl0IGNhbid0IGZpbmQgYW55dGhpbmcuCiAgICAgICovCiAgICAgU3RyaW5nW10gZ2V0SHR0cEF1dGhVc2VybmFtZVBhc3N3b3JkKFN0cmluZyBob3N0LCBTdHJpbmcgcmVhbG0pIHsKLSAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByZWFsbSA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKXsKKyAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByZWFsbSA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIApAQCAtOTk5LDcgKzEwNDcsNyBAQAogICAgICAqIENsZWFyIEhUVFAgYXV0aGVudGljYXRpb24gcGFzc3dvcmQgZGF0YWJhc2UKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhckh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZCgpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMTAyMCw3ICsxMDY4LDcgQEAKICAgICAgKiBAcGFyYW0gZm9ybWRhdGEgVGhlIGZvcm0gZGF0YSBpbiBIYXNoTWFwCiAgICAgICovCiAgICAgdm9pZCBzZXRGb3JtRGF0YShTdHJpbmcgdXJsLCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBmb3JtZGF0YSkgewotICAgICAgICBpZiAodXJsID09IG51bGwgfHwgZm9ybWRhdGEgPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgZm9ybWRhdGEgPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMTA2OSw3ICsxMTE3LDcgQEAKICAgICAgKi8KICAgICBBcnJheUxpc3Q8U3RyaW5nPiBnZXRGb3JtRGF0YShTdHJpbmcgdXJsLCBTdHJpbmcgbmFtZSkgewogICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IG5hbWUgPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgbmFtZSA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7CiAgICAgICAgIH0KIApAQCAtMTEyOSw3ICsxMTc3LDcgQEAKICAgICAgKiBDbGVhciBmb3JtIGRhdGFiYXNlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJGb3JtRGF0YSgpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sQmFzZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOWU4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xCYXNlLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbnRlcmZhY2UgWm9vbUNvbnRyb2xCYXNlIHsKKworICAgIC8qKgorICAgICAqIENhdXNlcyB0aGUgb24tc2NyZWVuIHpvb20gY29udHJvbCB0byBiZSBtYWRlIHZpc2libGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93KCk7CisKKyAgICAvKioKKyAgICAgKiBDYXVzZXMgdGhlIG9uLXNjcmVlbiB6b29tIGNvbnRyb2wgdG8gZGlzYXBwZWFyCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGlkZSgpOworCisgICAgLyoqCisgICAgICogRW5hYmxlcyB0aGUgY29udHJvbCB0byB1cGRhdGUgaXRzIHN0YXRlIGlmIG5lY2Vzc2FyeSBpbiByZXNwb25zZSB0byBhCisgICAgICogY2hhbmdlIGluIHRoZSBwYWdlcyB6b29tIGxldmVsLiBGb3IgZXhhbXBsZSwgaWYgdGhlIG1heCB6b29tIGxldmVsIGlzCisgICAgICogcmVhY2hlZCB0aGVuIHRoZSBjb250cm9sIGNhbiBkaXNhYmxlIHRoZSBidXR0b24gZm9yIHpvb21pbmcgaW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBjb250cm9sIGlzIGN1cnJlbnRseSB2aXNpYmxlIHRvIHRoZSB1c2VyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sRW1iZWRkZWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEVtYmVkZGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI5ZTcyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEVtYmVkZGVkLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuWm9vbUJ1dHRvbnNDb250cm9sbGVyOworCitjbGFzcyBab29tQ29udHJvbEVtYmVkZGVkIGltcGxlbWVudHMgWm9vbUNvbnRyb2xCYXNlIHsKKworICAgIHByaXZhdGUgZmluYWwgWm9vbU1hbmFnZXIgbVpvb21NYW5hZ2VyOworICAgIHByaXZhdGUgZmluYWwgV2ViVmlldyBtV2ViVmlldzsKKworICAgIC8vIFRoZSBjb250cm9sbGVyIGlzIGxhemlseSBpbml0aWFsaXplZCBpbiBnZXRDb250cm9scygpIGZvciBwZXJmb3JtYW5jZS4KKyAgICBwcml2YXRlIFpvb21CdXR0b25zQ29udHJvbGxlciBtWm9vbUJ1dHRvbnNDb250cm9sbGVyOworCisgICAgcHVibGljIFpvb21Db250cm9sRW1iZWRkZWQoWm9vbU1hbmFnZXIgem9vbU1hbmFnZXIsIFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtWm9vbU1hbmFnZXIgPSB6b29tTWFuYWdlcjsKKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIGlmICghZ2V0Q29udHJvbHMoKS5pc1Zpc2libGUoKSAmJiAhbVpvb21NYW5hZ2VyLmlzWm9vbVNjYWxlRml4ZWQoKSkgeworCisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUodHJ1ZSk7CisKKyAgICAgICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IHNldHRpbmdzLmdldERvdWJsZVRhcFRvYXN0Q291bnQoKTsKKyAgICAgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuaXNJblpvb21PdmVydmlldygpICYmIGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIHNldHRpbmdzLnNldERvdWJsZVRhcFRvYXN0Q291bnQoLS1jb3VudCk7CisgICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQobVdlYlZpZXcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuZG91YmxlX3RhcF90b2FzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9MT05HKS5zaG93KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBoaWRlKCkgeworICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworICAgICAgICByZXR1cm4gbVpvb21CdXR0b25zQ29udHJvbGxlciAhPSBudWxsICYmIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuaXNWaXNpYmxlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlKCkgeworICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGNhblpvb21JbiA9IG1ab29tTWFuYWdlci5jYW5ab29tSW4oKTsKKyAgICAgICAgYm9vbGVhbiBjYW5ab29tT3V0ID0gbVpvb21NYW5hZ2VyLmNhblpvb21PdXQoKSAmJiAhbVpvb21NYW5hZ2VyLmlzSW5ab29tT3ZlcnZpZXcoKTsKKyAgICAgICAgaWYgKCFjYW5ab29tSW4gJiYgIWNhblpvb21PdXQpIHsKKyAgICAgICAgICAgIC8vIEhpZGUgdGhlIHpvb20gaW4gYW5kIG91dCBidXR0b25zIGlmIHRoZSBwYWdlIGNhbm5vdCB6b29tCisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFNldCBlYWNoIG9uZSBpbmRpdmlkdWFsbHksIGFzIGEgcGFnZSBtYXkgYmUgYWJsZSB0byB6b29tIGluIG9yIG91dAorICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRab29tSW5FbmFibGVkKGNhblpvb21Jbik7CisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFpvb21PdXRFbmFibGVkKGNhblpvb21PdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBab29tQnV0dG9uc0NvbnRyb2xsZXIgZ2V0Q29udHJvbHMoKSB7CisgICAgICAgIGlmIChtWm9vbUJ1dHRvbnNDb250cm9sbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPSBuZXcgWm9vbUJ1dHRvbnNDb250cm9sbGVyKG1XZWJWaWV3KTsKKyAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0T25ab29tTGlzdGVuZXIobmV3IFpvb21MaXN0ZW5lcigpKTsKKyAgICAgICAgICAgIC8vIFpvb21CdXR0b25zQ29udHJvbGxlciBwb3NpdGlvbnMgdGhlIGJ1dHRvbnMgYXQgdGhlIGJvdHRvbSwgYnV0IGluCisgICAgICAgICAgICAvLyB0aGUgbWlkZGxlLiBDaGFuZ2UgdGhlaXIgbGF5b3V0IHBhcmFtZXRlcnMgc28gdGhleSBhcHBlYXIgb24gdGhlCisgICAgICAgICAgICAvLyByaWdodC4KKyAgICAgICAgICAgIFZpZXcgY29udHJvbHMgPSBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpOworICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMgPSBjb250cm9scy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgIGlmIChwYXJhbXMgaW5zdGFuY2VvZiBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAoKEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcykgcGFyYW1zKS5ncmF2aXR5ID0gR3Jhdml0eS5SSUdIVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVpvb21CdXR0b25zQ29udHJvbGxlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFpvb21MaXN0ZW5lciBpbXBsZW1lbnRzIFpvb21CdXR0b25zQ29udHJvbGxlci5Pblpvb21MaXN0ZW5lciB7CisKKyAgICAgICAgcHVibGljIHZvaWQgb25WaXNpYmlsaXR5Q2hhbmdlZChib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKKyAgICAgICAgICAgICAgICAvLyBCcmluZyBiYWNrIHRoZSBoaWRkZW4gem9vbSBjb250cm9scy4KKyAgICAgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uWm9vbShib29sZWFuIHpvb21JbikgeworICAgICAgICAgICAgaWYgKHpvb21JbikgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3Lnpvb21JbigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy56b29tT3V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEV4dGVybmFsLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xFeHRlcm5hbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NTMxM2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xFeHRlcm5hbC5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbHBoYUFuaW1hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKKworQERlcHJlY2F0ZWQKK2NsYXNzIFpvb21Db250cm9sRXh0ZXJuYWwgaW1wbGVtZW50cyBab29tQ29udHJvbEJhc2UgeworCisgICAgLy8gVGhlIHRpbWUgdGhhdCB0aGUgZXh0ZXJuYWwgY29udHJvbHMgYXJlIHZpc2libGUgYmVmb3JlIGZhZGluZyBhd2F5CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBaT09NX0NPTlRST0xTX1RJTUVPVVQgPQorICAgICAgICAgICAgVmlld0NvbmZpZ3VyYXRpb24uZ2V0Wm9vbUNvbnRyb2xzVGltZW91dCgpOworICAgIC8vIFRoZSB2aWV3IGNvbnRhaW5pbmcgdGhlIGV4dGVybmFsIHpvb20gY29udHJvbHMKKyAgICBwcml2YXRlIEV4dGVuZGVkWm9vbUNvbnRyb2xzIG1ab29tQ29udHJvbHM7CisgICAgcHJpdmF0ZSBSdW5uYWJsZSBtWm9vbUNvbnRyb2xSdW5uYWJsZTsKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbVByaXZhdGVIYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKworICAgIHByaXZhdGUgZmluYWwgV2ViVmlldyBtV2ViVmlldzsKKworICAgIHB1YmxpYyBab29tQ29udHJvbEV4dGVybmFsKFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtV2ViVmlldyA9IHdlYlZpZXc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKyAgICAgICAgaWYobVpvb21Db250cm9sUnVubmFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgZ2V0Q29udHJvbHMoKS5zaG93KHRydWUpOworICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaGlkZSgpIHsKKyAgICAgICAgaWYgKG1ab29tQ29udHJvbFJ1bm5hYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtWm9vbUNvbnRyb2xzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1ab29tQ29udHJvbHMuaGlkZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworICAgICAgICByZXR1cm4gbVpvb21Db250cm9scyAhPSBudWxsICYmIG1ab29tQ29udHJvbHMuaXNTaG93bigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsgfQorCisgICAgcHVibGljIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGdldENvbnRyb2xzKCkgeworICAgICAgICBpZiAobVpvb21Db250cm9scyA9PSBudWxsKSB7CisgICAgICAgICAgICBtWm9vbUNvbnRyb2xzID0gY3JlYXRlWm9vbUNvbnRyb2xzKCk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBuZWVkIHRvIGJlIHNldCB0byBWSVNJQkxFIGZpcnN0IHNvIHRoYXQgZ2V0TWVhc3VyZWRIZWlnaHQoKSBpbgorICAgICAgICAgICAgICoge0BsaW5rICNvblNpemVDaGFuZ2VkKCl9IGNhbiByZXR1cm4gdGhlIG1lYXN1cmVkIHZhbHVlIGZvciBwcm9wZXIKKyAgICAgICAgICAgICAqIGxheW91dC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbVpvb21Db250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtWm9vbUNvbnRyb2xSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IGRpc21pc3MgdGhlIGNvbnRyb2xzIGlmIHRoZSB1c2VyIGhhcworICAgICAgICAgICAgICAgICAgICAgKiBmb2N1cyBvbiB0aGVtLiBXYWl0IGFuZCBjaGVjayBhZ2FpbiBsYXRlci4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmICghbVpvb21Db250cm9scy5oYXNGb2N1cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtWm9vbUNvbnRyb2xzLmhpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaT09NX0NPTlRST0xTX1RJTUVPVVQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVpvb21Db250cm9sczsKKyAgICB9CisKKyAgICBwcml2YXRlIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGNyZWF0ZVpvb21Db250cm9scygpIHsKKyAgICAgICAgRXh0ZW5kZWRab29tQ29udHJvbHMgem9vbUNvbnRyb2xzID0gbmV3IEV4dGVuZGVkWm9vbUNvbnRyb2xzKG1XZWJWaWV3LmdldENvbnRleHQoKSk7CisgICAgICAgIHpvb21Db250cm9scy5zZXRPblpvb21JbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGltZSBvdXQKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuem9vbUluKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB6b29tQ29udHJvbHMuc2V0T25ab29tT3V0Q2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAvLyByZXNldCB0aW1lIG91dAorICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOworICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy56b29tT3V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gem9vbUNvbnRyb2xzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGV4dGVuZHMgRnJhbWVMYXlvdXQgeworCisgICAgICAgIHByaXZhdGUgYW5kcm9pZC53aWRnZXQuWm9vbUNvbnRyb2xzIG1QbHVzTWludXNab29tQ29udHJvbHM7CisKKyAgICAgICAgcHVibGljIEV4dGVuZGVkWm9vbUNvbnRyb2xzKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCk7CisgICAgICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcikKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgICAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC56b29tX21hZ25pZnksIHRoaXMsIHRydWUpOworICAgICAgICAgICAgbVBsdXNNaW51c1pvb21Db250cm9scyA9IChhbmRyb2lkLndpZGdldC5ab29tQ29udHJvbHMpIGZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC56b29tQ29udHJvbHMpOworICAgICAgICAgICAgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuem9vbU1hZ25pZnkpLnNldFZpc2liaWxpdHkoCisgICAgICAgICAgICAgICAgICAgIFZpZXcuR09ORSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzaG93KGJvb2xlYW4gc2hvd1pvb20pIHsKKyAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0VmlzaWJpbGl0eShzaG93Wm9vbSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisgICAgICAgICAgICBmYWRlKFZpZXcuVklTSUJMRSwgMC4wZiwgMS4wZik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBoaWRlKCkgeworICAgICAgICAgICAgZmFkZShWaWV3LkdPTkUsIDEuMGYsIDAuMGYpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGZhZGUoaW50IHZpc2liaWxpdHksIGZsb2F0IHN0YXJ0QWxwaGEsIGZsb2F0IGVuZEFscGhhKSB7CisgICAgICAgICAgICBBbHBoYUFuaW1hdGlvbiBhbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKHN0YXJ0QWxwaGEsIGVuZEFscGhhKTsKKyAgICAgICAgICAgIGFuaW0uc2V0RHVyYXRpb24oNTAwKTsKKyAgICAgICAgICAgIHN0YXJ0QW5pbWF0aW9uKGFuaW0pOworICAgICAgICAgICAgc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1QbHVzTWludXNab29tQ29udHJvbHMuaGFzRm9jdXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE9uWm9vbUluQ2xpY2tMaXN0ZW5lcihPbkNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0T25ab29tSW5DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE9uWm9vbU91dENsaWNrTGlzdGVuZXIoT25DbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLnNldE9uWm9vbU91dENsaWNrTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDk2ZmM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw5NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TY2FsZUdlc3R1cmVEZXRlY3RvcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworLyoqCisgKiBUaGUgWm9vbU1hbmFnZXIgaXMgcmVzcG9uc2libGUgZm9yIG1haW50YWluaW5nIHRoZSBXZWJWaWV3J3MgY3VycmVudCB6b29tCisgKiBsZXZlbCBzdGF0ZS4gIEl0IGlzIGFsc28gcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZSBvbi1zY3JlZW4gem9vbSBjb250cm9scworICogYXMgd2VsbCBhcyBhbnkgYW5pbWF0aW9uIG9mIHRoZSBXZWJWaWV3IGR1ZSB0byB6b29taW5nLgorICoKKyAqIEN1cnJlbnRseSwgdGhlcmUgYXJlIHR3byBtZXRob2RzIGZvciBhbmltYXRpbmcgdGhlIHpvb20gb2YgYSBXZWJWaWV3LgorICoKKyAqICgxKSBUaGUgZmlyc3QgbWV0aG9kIGlzIHRyaWdnZXJlZCBieSBzdGFydFpvb21BbmltYXRpb24oLi4uKSBhbmQgaXMgYSBmaXhlZAorICogbGVuZ3RoIGFuaW1hdGlvbiB3aGVyZSB0aGUgZmluYWwgem9vbSBzY2FsZSBpcyBrbm93biBhdCBzdGFydHVwLiAgVGhpcyB0eXBlIG9mCisgKiBhbmltYXRpb24gbm90aWZpZXMgd2Via2l0IG9mIHRoZSBmaW5hbCBzY2FsZSBCRUZPUkUgaXQgYW5pbWF0ZXMuIFRoZSBhbmltYXRpb24KKyAqIGlzIHRoZW4gZG9uZSBieSBzY2FsaW5nIHRoZSBDQU5WQVMgaW5jcmVtZW50YWxseSBiYXNlZCBvbiBhIHN0ZXBwaW5nIGZ1bmN0aW9uLgorICoKKyAqICgyKSBUaGUgc2Vjb25kIG1ldGhvZCBpcyB0cmlnZ2VyZWQgYnkgYSBtdWx0aS10b3VjaCBwaW5jaCBhbmQgdGhlIG5ldyBzY2FsZQorICogaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgdXNlcidzIGdlc3R1cmUuIFRoaXMgdHlwZSBvZiBhbmltYXRpb24KKyAqIG9ubHkgbm90aWZpZXMgd2Via2l0IG9mIG5ldyBzY2FsZSBBRlRFUiB0aGUgZ2VzdHVyZSBpcyBjb21wbGV0ZS4gVGhlIGFuaW1hdGlvbgorICogZWZmZWN0IGlzIGFjaGlldmVkIGJ5IHNjYWxpbmcgdGhlIFZJRVdTIChib3RoIFdlYlZpZXcgYW5kIFZpZXdNYW5hZ2VyLkNoaWxkVmlldykKKyAqIHRvIHRoZSBuZXcgc2NhbGUgaW4gcmVzcG9uc2UgdG8gZXZlbnRzIHJlbGF0ZWQgdG8gdGhlIHVzZXIncyBnZXN0dXJlLgorICovCitjbGFzcyBab29tTWFuYWdlciB7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJ3ZWJ2aWV3Wm9vbSI7CisKKyAgICBwcml2YXRlIGZpbmFsIFdlYlZpZXcgbVdlYlZpZXc7CisgICAgcHJpdmF0ZSBmaW5hbCBDYWxsYmFja1Byb3h5IG1DYWxsYmFja1Byb3h5OworCisgICAgLy8gV2lkZ2V0cyByZXNwb25zaWJsZSBmb3IgdGhlIG9uLXNjcmVlbiB6b29tIGZ1bmN0aW9ucyBvZiB0aGUgV2ViVmlldy4KKyAgICBwcml2YXRlIFpvb21Db250cm9sRW1iZWRkZWQgbUVtYmVkZGVkWm9vbUNvbnRyb2w7CisgICAgcHJpdmF0ZSBab29tQ29udHJvbEV4dGVybmFsIG1FeHRlcm5hbFpvb21Db250cm9sOworCisgICAgLyoKKyAgICAgKiBGb3IgbGFyZ2Ugc2NyZWVuIGRldmljZXMsIHRoZSBkZWZhdWx0U2NhbGUgdXN1YWxseSBzZXQgdG8gMS4wIGFuZAorICAgICAqIGVxdWFsIHRvIHRoZSBvdmVydmlldyBzY2FsZSwgdG8gZGlmZmVyZW50aWF0ZSB0aGUgem9vbSBsZXZlbCBmb3IgZG91YmxlIHRhcHBpbmcsCisgICAgICogYSBkZWZhdWx0IHJlYWRpbmcgbGV2ZWwgc2NhbGUgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX1JFQURJTkdfTEVWRUxfU0NBTEUgPSAxLjVmOworCisgICAgLyoKKyAgICAgKiBUaGUgc2NhbGUgZmFjdG9ycyB0aGF0IGRldGVybWluZSB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyBmb3IgdGhlCisgICAgICogZGVmYXVsdCB6b29tIHNjYWxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9NQVhfWk9PTV9TQ0FMRV9GQUNUT1IgPSA0LjAwZjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IERFRkFVTFRfTUlOX1pPT01fU0NBTEVfRkFDVE9SID0gMC4yNWY7CisKKyAgICAvLyBUaGUgZGVmYXVsdCBzY2FsZSBsaW1pdHMsIHdoaWNoIGFyZSBkZXBlbmRlbnQgb24gdGhlIGRpc3BsYXkgZGVuc2l0eS4KKyAgICBwcml2YXRlIGZsb2F0IG1EZWZhdWx0TWF4Wm9vbVNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbURlZmF1bHRNaW5ab29tU2NhbGU7CisKKyAgICAvLyBUaGUgYWN0dWFsIHNjYWxlIGxpbWl0cywgd2hpY2ggY2FuIGJlIHNldCB0aHJvdWdoIGEgd2VicGFnZSdzIHZpZXdwb3J0CisgICAgLy8gbWV0YS10YWcuCisgICAgcHJpdmF0ZSBmbG9hdCBtTWF4Wm9vbVNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbU1pblpvb21TY2FsZTsKKworICAgIC8vIExvY2tzIHRoZSBtaW5pbXVtIFpvb21TY2FsZSB0byB0aGUgdmFsdWUgY3VycmVudGx5IHNldCBpbiBtTWluWm9vbVNjYWxlLgorICAgIHByaXZhdGUgYm9vbGVhbiBtTWluWm9vbVNjYWxlRml4ZWQgPSB0cnVlOworCisgICAgLyoKKyAgICAgKiBXaGVuIGxvYWRpbmcgYSBuZXcgcGFnZSB0aGUgV2ViVmlldyBkb2VzIG5vdCBpbml0aWFsbHkga25vdyB0aGUgZmluYWwKKyAgICAgKiB3aWR0aCBvZiB0aGUgcGFnZS4gVGhlcmVmb3JlLCB3aGVuIGEgbmV3IHBhZ2UgaXMgbG9hZGVkIGluIG92ZXJ2aWV3IG1vZGUKKyAgICAgKiB0aGUgb3ZlcnZpZXcgc2NhbGUgaXMgaW5pdGlhbGl6ZWQgdG8gYSBkZWZhdWx0IHZhbHVlLiBUaGlzIGZsYWcgaXMgdGhlbgorICAgICAqIHNldCBhbmQgdXNlZCB0byBub3RpZnkgdGhlIFpvb21NYW5hZ2VyIHRvIHRha2UgdGhlIHdpZHRoIG9mIHRoZSBuZXh0CisgICAgICogcGljdHVyZSBmcm9tIHdlYmtpdCBhbmQgdXNlIHRoYXQgd2lkdGggdG8gZW50ZXIgaW50byB6b29tIG92ZXJ2aWV3IG1vZGUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jbml0aWFsWm9vbU92ZXJ2aWV3ID0gZmFsc2U7CisKKyAgICAvKgorICAgICAqIFdoZW4gaW4gdGhlIHpvb20gb3ZlcnZpZXcgbW9kZSwgdGhlIHBhZ2UncyB3aWR0aCBpcyBmdWxseSBmaXQgdG8gdGhlCisgICAgICogY3VycmVudCB3aW5kb3cuIEFkZGl0aW9uYWxseSB3aGlsZSB0aGUgcGFnZSBpcyBpbiB0aGlzIHN0YXRlIGl0IGlzCisgICAgICogYWN0aXZlLCBpbiBvdGhlciB3b3JkcywgeW91IGNhbiBjbGljayB0byBmb2xsb3cgdGhlIGxpbmtzLiBXZSBjYWNoZSBhCisgICAgICogYm9vbGVhbiB0byBlbmFibGUgdXMgdG8gcXVpY2tseSBjaGVjayB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgaW4gb3ZlcnZpZXcKKyAgICAgKiBtb2RlLCBidXQgdGhpcyB2YWx1ZSBzaG91bGQgb25seSBiZSBtb2RpZmllZCBieSBjaGFuZ2VzIHRvIHRoZSB6b29tCisgICAgICogc2NhbGUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IG1ab29tT3ZlcnZpZXdXaWR0aDsKKyAgICBwcml2YXRlIGZsb2F0IG1JbnZab29tT3ZlcnZpZXdXaWR0aDsKKworICAgIC8qCisgICAgICogVGhlc2UgdmFyaWFibGVzIHRyYWNrIHRoZSBjZW50ZXIgcG9pbnQgb2YgdGhlIHpvb20gYW5kIHRoZXkgYXJlIHVzZWQgdG8KKyAgICAgKiBkZXRlcm1pbmUgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB3ZSBzaG91bGQgem9vbS4gVGhleSBhcmUgc3RvcmVkIGluIHZpZXcKKyAgICAgKiBjb29yZGluYXRlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1ab29tQ2VudGVyWDsKKyAgICBwcml2YXRlIGZsb2F0IG1ab29tQ2VudGVyWTsKKworICAgIC8qCisgICAgICogVGhlc2UgdmFsdWVzIHJlcHJlc2VudCB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHRoZSBzY3JlZW4gc2hvdWxkIGJlCisgICAgICogY2VudGVyZWQgYWZ0ZXIgem9vbWluZy4gSW4gb3RoZXIgd29yZHMgaXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNlbnRlcgorICAgICAqIHBvaW50IG9mIHRoZSB2aXNpYmxlIGRvY3VtZW50IGFmdGVyIHRoZSBwYWdlIGhhcyBmaW5pc2hlZCB6b29taW5nLiBUaGlzCisgICAgICogaXMgaW1wb3J0YW50IGJlY2F1c2UgdGhlIHpvb20gbWF5IGhhdmUgcG90ZW50aWFsbHkgcmVmbG93ZWQgdGhlIHRleHQgYW5kCisgICAgICogd2UgbmVlZCB0byBlbnN1cmUgdGhlIHByb3BlciBwb3J0aW9uIG9mIHRoZSBkb2N1bWVudCByZW1haW5zIG9uIHRoZQorICAgICAqIHNjcmVlbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtQW5jaG9yWDsKKyAgICBwcml2YXRlIGludCBtQW5jaG9yWTsKKworICAgIC8vIFRoZSBzY2FsZSBmYWN0b3IgdGhhdCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgY29sdW1uIHdpZHRoIGZvciB0ZXh0CisgICAgcHJpdmF0ZSBmbG9hdCBtVGV4dFdyYXBTY2FsZTsKKworICAgIC8qCisgICAgICogVGhlIGRlZmF1bHQgem9vbSBzY2FsZSBpcyB0aGUgc2NhbGUgZmFjdG9yIHVzZWQgd2hlbiB0aGUgdXNlciB0cmlnZ2VycyBhCisgICAgICogem9vbSBpbiBieSBkb3VibGUgdGFwcGluZyBvbiB0aGUgV2ViVmlldy4gVGhlIHZhbHVlIGlzIGluaXRpYWxseSBzZXQKKyAgICAgKiBiYXNlZCBvbiB0aGUgZGlzcGxheSBkZW5zaXR5LCBidXQgY2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgdmlhIHRoZQorICAgICAqIFdlYlNldHRpbmdzLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbURlZmF1bHRTY2FsZTsKKyAgICBwcml2YXRlIGZsb2F0IG1JbnZEZWZhdWx0U2NhbGU7CisKKyAgICAvLyB0aGUgY3VycmVudCBjb21wdXRlZCB6b29tIHNjYWxlIGFuZCBpdHMgaW52ZXJzZS4KKyAgICBwcml2YXRlIGZsb2F0IG1BY3R1YWxTY2FsZTsKKyAgICBwcml2YXRlIGZsb2F0IG1JbnZBY3R1YWxTY2FsZTsKKyAgICAKKyAgICAvKgorICAgICAqIFRoZSBpbml0aWFsIHNjYWxlIGZvciB0aGUgV2ViVmlldy4gMCBtZWFucyBkZWZhdWx0LiBJZiBpbml0aWFsIHNjYWxlIGlzCisgICAgICogZ3JlYXRlciB0aGFuIDAgdGhlIFdlYlZpZXcgc3RhcnRzIHdpdGggdGhpcyB2YWx1ZSBhcyBpdHMgaW5pdGlhbCBzY2FsZS4gVGhlCisgICAgICogdmFsdWUgaXMgY29udmVydGVkIGZyb20gYW4gaW50ZWdlciBwZXJjZW50YWdlIHNvIGl0IGlzIGd1YXJlbnRlZWQgdG8gaGF2ZQorICAgICAqIG5vIG1vcmUgdGhhbiAyIHNpZ25pZmljYW50IGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbC4gIFRoaXMgcmVzdHJpY3Rpb24KKyAgICAgKiBhbGxvd3MgdXMgdG8gY29udmVydCB0aGUgc2NhbGUgYmFjayB0byB0aGUgb3JpZ2luYWwgcGVyY2VudGFnZSBieSBzaW1wbHkKKyAgICAgKiBtdWx0aXBseWluZyB0aGUgdmFsdWUgYnkgMTAwLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbUluaXRpYWxTY2FsZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UID0gMC4wMWY7CisKKyAgICAvKgorICAgICAqIFRoZSBmb2xsb3dpbmcgbWVtYmVyIHZhcmlhYmxlcyBhcmUgb25seSB0byBiZSB1c2VkIGZvciBhbmltYXRpbmcgem9vbS4gSWYKKyAgICAgKiBtWm9vbVNjYWxlIGlzIG5vbi16ZXJvIHRoZW4gd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSB6b29tIGFuaW1hdGlvbi4gVGhlCisgICAgICogb3RoZXIgdmFyaWFibGVzIGFyZSB1c2VkIGFzIGEgY2FjaGUgKGUuZy4gaW52ZXJzZSkgb3IgYXMgYSB3YXkgdG8gc3RvcmUKKyAgICAgKiB0aGUgc3RhdGUgb2YgdGhlIHZpZXcgcHJpb3IgdG8gYW5pbWF0aW5nIChlLmcuIGluaXRpYWwgc2Nyb2xsIGNvb3JkcykuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtWm9vbVNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbUludkluaXRpYWxab29tU2NhbGU7CisgICAgcHJpdmF0ZSBmbG9hdCBtSW52RmluYWxab29tU2NhbGU7CisgICAgcHJpdmF0ZSBpbnQgbUluaXRpYWxTY3JvbGxYOworICAgIHByaXZhdGUgaW50IG1Jbml0aWFsU2Nyb2xsWTsKKyAgICBwcml2YXRlIGxvbmcgbVpvb21TdGFydDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaT09NX0FOSU1BVElPTl9MRU5HVEggPSA1MDA7CisKKyAgICAvLyB3aGV0aGVyIHN1cHBvcnQgbXVsdGktdG91Y2gKKyAgICBwcml2YXRlIGJvb2xlYW4gbVN1cHBvcnRNdWx0aVRvdWNoOworICAgIAorICAgIC8qKgorICAgICAqIFRydWUgaWYgd2UgaGF2ZSBhIHRvdWNoIHBhbmVsIGNhcGFibGUgb2YgZGV0ZWN0aW5nIHNtb290aCBwYW4vc2NhbGUgYXQgdGhlIHNhbWUgdGltZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtQWxsb3dQYW5BbmRTY2FsZTsKKworICAgIC8vIHVzZSB0aGUgZnJhbWV3b3JrJ3MgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgdG8gaGFuZGxlIG11bHRpLXRvdWNoCisgICAgcHJpdmF0ZSBTY2FsZUdlc3R1cmVEZXRlY3RvciBtU2NhbGVEZXRlY3RvcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVBpbmNoVG9ab29tQW5pbWF0aW5nID0gZmFsc2U7CisKKyAgICBwdWJsaWMgWm9vbU1hbmFnZXIoV2ViVmlldyB3ZWJWaWV3LCBDYWxsYmFja1Byb3h5IGNhbGxiYWNrUHJveHkpIHsKKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgICAgICBtQ2FsbGJhY2tQcm94eSA9IGNhbGxiYWNrUHJveHk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWRlYWxseSBtWm9vbU92ZXJ2aWV3V2lkdGggc2hvdWxkIGJlIG1Db250ZW50V2lkdGguIEJ1dCBzaXRlcyBsaWtlCisgICAgICAgICAqIEVTUE4gYW5kIEVuZ2FkZ2V0IGFsd2F5cyBoYXZlIHdpZGVyIG1Db250ZW50V2lkdGggbm8gbWF0dGVyIHdoYXQgdGhlCisgICAgICAgICAqIHZpZXdwb3J0IHNpemUgaXMuCisgICAgICAgICAqLworICAgICAgICBzZXRab29tT3ZlcnZpZXdXaWR0aChXZWJWaWV3LkRFRkFVTFRfVklFV1BPUlRfV0lEVEgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgYm90aCB0aGUgZGVmYXVsdCBhbmQgYWN0dWFsIHpvb20gc2NhbGUgdG8gdGhlIGdpdmVuIGRlbnNpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVuc2l0eSBUaGUgbG9naWNhbCBkZW5zaXR5IG9mIHRoZSBkaXNwbGF5LiBUaGlzIGlzIGEgc2NhbGluZyBmYWN0b3IKKyAgICAgKiBmb3IgdGhlIERlbnNpdHkgSW5kZXBlbmRlbnQgUGl4ZWwgdW5pdCwgd2hlcmUgb25lIERJUCBpcyBvbmUgcGl4ZWwgb24gYW4KKyAgICAgKiBhcHByb3hpbWF0ZWx5IDE2MCBkcGkgc2NyZWVuIChzZWUgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzLmRlbnNpdHkpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoZmxvYXQgZGVuc2l0eSkgeworICAgICAgICBhc3NlcnQgZGVuc2l0eSA+IDA7CisKKyAgICAgICAgc2V0RGVmYXVsdFpvb21TY2FsZShkZW5zaXR5KTsKKyAgICAgICAgbUFjdHVhbFNjYWxlID0gZGVuc2l0eTsKKyAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIGRlbnNpdHk7CisgICAgICAgIG1UZXh0V3JhcFNjYWxlID0gZGVuc2l0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIGRlZmF1bHQgem9vbSBzY2FsZSB1c2luZyB0aGUgZ2l2ZW4gZGVuc2l0eS4gSXQgd2lsbCBhbHNvIHJlc2V0CisgICAgICogdGhlIGN1cnJlbnQgbWluIGFuZCBtYXggem9vbSBzY2FsZXMgdG8gdGhlIGRlZmF1bHQgYm91bmRhcmllcyBhcyB3ZWxsIGFzCisgICAgICogZW5zdXJlIHRoYXQgdGhlIGFjdHVhbCBzY2FsZSBmYWxscyB3aXRoaW4gdGhvc2UgYm91bmRhcmllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZW5zaXR5IFRoZSBsb2dpY2FsIGRlbnNpdHkgb2YgdGhlIGRpc3BsYXkuIFRoaXMgaXMgYSBzY2FsaW5nIGZhY3RvcgorICAgICAqIGZvciB0aGUgRGVuc2l0eSBJbmRlcGVuZGVudCBQaXhlbCB1bml0LCB3aGVyZSBvbmUgRElQIGlzIG9uZSBwaXhlbCBvbiBhbgorICAgICAqIGFwcHJveGltYXRlbHkgMTYwIGRwaSBzY3JlZW4gKHNlZSBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3MuZGVuc2l0eSkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KGZsb2F0IGRlbnNpdHkpIHsKKyAgICAgICAgYXNzZXJ0IGRlbnNpdHkgPiAwOworCisgICAgICAgIGlmIChNYXRoLmFicyhkZW5zaXR5IC0gbURlZmF1bHRTY2FsZSkgPiBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgeworICAgICAgICAgICAgLy8gc2V0IHRoZSBuZXcgZGVmYXVsdCBkZW5zaXR5CisgICAgICAgICAgICBzZXREZWZhdWx0Wm9vbVNjYWxlKGRlbnNpdHkpOworICAgICAgICAgICAgLy8gYWRqdXN0IHRoZSBzY2FsZSBpZiBpdCBmYWxscyBvdXRzaWRlIHRoZSBuZXcgem9vbSBib3VuZHMKKyAgICAgICAgICAgIHNldFpvb21TY2FsZShtQWN0dWFsU2NhbGUsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRab29tU2NhbGUoZmxvYXQgZGVmYXVsdFNjYWxlKSB7CisgICAgICAgIG1EZWZhdWx0U2NhbGUgPSBkZWZhdWx0U2NhbGU7CisgICAgICAgIG1JbnZEZWZhdWx0U2NhbGUgPSAxIC8gZGVmYXVsdFNjYWxlOworICAgICAgICBtRGVmYXVsdE1heFpvb21TY2FsZSA9IGRlZmF1bHRTY2FsZSAqIERFRkFVTFRfTUFYX1pPT01fU0NBTEVfRkFDVE9SOworICAgICAgICBtRGVmYXVsdE1pblpvb21TY2FsZSA9IGRlZmF1bHRTY2FsZSAqIERFRkFVTFRfTUlOX1pPT01fU0NBTEVfRkFDVE9SOworICAgICAgICBtTWF4Wm9vbVNjYWxlID0gbURlZmF1bHRNYXhab29tU2NhbGU7CisgICAgICAgIG1NaW5ab29tU2NhbGUgPSBtRGVmYXVsdE1pblpvb21TY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0U2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtQWN0dWFsU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldEludlNjYWxlKCkgeworICAgICAgICByZXR1cm4gbUludkFjdHVhbFNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXRUZXh0V3JhcFNjYWxlKCkgeworICAgICAgICByZXR1cm4gbVRleHRXcmFwU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldE1heFpvb21TY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1NYXhab29tU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldE1pblpvb21TY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1NaW5ab29tU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldERlZmF1bHRTY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0U2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldFJlYWRpbmdMZXZlbFNjYWxlKCkgeworICAgICAgICAvLyBUaGUgcmVhZGluZyBzY2FsZSBpcyBhdCBsZWFzdCAwLjVmIGFwYXJ0IGZyb20gdGhlIG92ZXJ2aWV3IHNjYWxlLgorICAgICAgICBmaW5hbCBmbG9hdCBNSU5fU0NBTEVfRElGRiA9IDAuNWY7CisgICAgICAgIGZpbmFsIGZsb2F0IHpvb21PdmVydmlld1NjYWxlID0gZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKTsKKyAgICAgICAgaWYgKHpvb21PdmVydmlld1NjYWxlID4gREVGQVVMVF9SRUFESU5HX0xFVkVMX1NDQUxFKSB7CisgICAgICAgICAgICByZXR1cm4gTWF0aC5taW4oREVGQVVMVF9SRUFESU5HX0xFVkVMX1NDQUxFLAorICAgICAgICAgICAgICAgIHpvb21PdmVydmlld1NjYWxlIC0gTUlOX1NDQUxFX0RJRkYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBNYXRoLm1heCh6b29tT3ZlcnZpZXdTY2FsZSArIE1JTl9TQ0FMRV9ESUZGLAorICAgICAgICAgICAgREVGQVVMVF9SRUFESU5HX0xFVkVMX1NDQUxFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0SW52RGVmYXVsdFNjYWxlKCkgeworICAgICAgICByZXR1cm4gbUludkRlZmF1bHRTY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0RGVmYXVsdE1heFpvb21TY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0TWF4Wm9vbVNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXREZWZhdWx0TWluWm9vbVNjYWxlKCkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRNaW5ab29tU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGludCBnZXREb2N1bWVudEFuY2hvclgoKSB7CisgICAgICAgIHJldHVybiBtQW5jaG9yWDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgaW50IGdldERvY3VtZW50QW5jaG9yWSgpIHsKKyAgICAgICAgcmV0dXJuIG1BbmNob3JZOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNsZWFyRG9jdW1lbnRBbmNob3IoKSB7CisgICAgICAgIG1BbmNob3JYID0gbUFuY2hvclkgPSAwOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFpvb21DZW50ZXIoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBtWm9vbUNlbnRlclggPSB4OworICAgICAgICBtWm9vbUNlbnRlclkgPSB5OworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldEluaXRpYWxTY2FsZUluUGVyY2VudChpbnQgc2NhbGVJblBlcmNlbnQpIHsKKyAgICAgICAgbUluaXRpYWxTY2FsZSA9IHNjYWxlSW5QZXJjZW50ICogMC4wMWY7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGNvbXB1dGVTY2FsZVdpdGhMaW1pdHMoZmxvYXQgc2NhbGUpIHsKKyAgICAgICAgaWYgKHNjYWxlIDwgbU1pblpvb21TY2FsZSkgeworICAgICAgICAgICAgc2NhbGUgPSBtTWluWm9vbVNjYWxlOworICAgICAgICB9IGVsc2UgaWYgKHNjYWxlID4gbU1heFpvb21TY2FsZSkgeworICAgICAgICAgICAgc2NhbGUgPSBtTWF4Wm9vbVNjYWxlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1pvb21TY2FsZUZpeGVkKCkgeworICAgICAgICByZXR1cm4gbU1pblpvb21TY2FsZSA+PSBtTWF4Wm9vbVNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQoZmxvYXQgc2NhbGVBLCBmbG9hdCBzY2FsZUIpIHsKKyAgICAgICAgcmV0dXJuIE1hdGguYWJzKHNjYWxlQSAtIHNjYWxlQikgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gd2lsbFNjYWxlVHJpZ2dlclpvb20oZmxvYXQgc2NhbGUpIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VlZHNNaW5TY2FsZUluY3JlbWVudChzY2FsZSwgbUFjdHVhbFNjYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBjYW5ab29tSW4oKSB7CisgICAgICAgIHJldHVybiBtTWF4Wm9vbVNjYWxlIC0gbUFjdHVhbFNjYWxlID4gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQ7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gY2FuWm9vbU91dCgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3R1YWxTY2FsZSAtIG1NaW5ab29tU2NhbGUgPiBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB6b29tSW4oKSB7CisgICAgICAgIHJldHVybiB6b29tKDEuMjVmKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB6b29tT3V0KCkgeworICAgICAgICByZXR1cm4gem9vbSgwLjhmKTsKKyAgICB9CisKKyAgICAvLyByZXR1cm5zIFRSVUUgaWYgem9vbSBvdXQgc3VjY2VlZHMgYW5kIEZBTFNFIGlmIG5vIHpvb20gY2hhbmdlcy4KKyAgICBwcml2YXRlIGJvb2xlYW4gem9vbShmbG9hdCB6b29tTXVsdGlwbGllcikgeworICAgICAgICAvLyBUT0RPOiBhbHRlcm5hdGl2ZWx5IHdlIGNhbiBkaXNhbGxvdyB0aGlzIGR1cmluZyBkcmF3IGhpc3RvcnkgbW9kZQorICAgICAgICBtV2ViVmlldy5zd2l0Y2hPdXREcmF3SGlzdG9yeSgpOworICAgICAgICAvLyBDZW50ZXIgem9vbWluZyB0byB0aGUgY2VudGVyIG9mIHRoZSBzY3JlZW4uCisgICAgICAgIG1ab29tQ2VudGVyWCA9IG1XZWJWaWV3LmdldFZpZXdXaWR0aCgpICogLjVmOworICAgICAgICBtWm9vbUNlbnRlclkgPSBtV2ViVmlldy5nZXRWaWV3SGVpZ2h0KCkgKiAuNWY7CisgICAgICAgIG1BbmNob3JYID0gbVdlYlZpZXcudmlld1RvQ29udGVudFgoKGludCkgbVpvb21DZW50ZXJYICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpKTsKKyAgICAgICAgbUFuY2hvclkgPSBtV2ViVmlldy52aWV3VG9Db250ZW50WSgoaW50KSBtWm9vbUNlbnRlclkgKyBtV2ViVmlldy5nZXRTY3JvbGxZKCkpOworICAgICAgICByZXR1cm4gc3RhcnRab29tQW5pbWF0aW9uKG1BY3R1YWxTY2FsZSAqIHpvb21NdWx0aXBsaWVyLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZXMgYW4gYW5pbWF0ZWQgem9vbSBvZiB0aGUgV2ViVmlldy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmV3IHNjYWxlIHRyaWdnZXJlZCBhbiBhbmltYXRpb24gYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFpvb21BbmltYXRpb24oZmxvYXQgc2NhbGUsIGJvb2xlYW4gcmVmbG93VGV4dCkgeworICAgICAgICBmbG9hdCBvbGRTY2FsZSA9IG1BY3R1YWxTY2FsZTsKKyAgICAgICAgbUluaXRpYWxTY3JvbGxYID0gbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpOworICAgICAgICBtSW5pdGlhbFNjcm9sbFkgPSBtV2ViVmlldy5nZXRTY3JvbGxZKCk7CisKKyAgICAgICAgLy8gc25hcCB0byByZWFkaW5nIGxldmVsIHNjYWxlIGlmIGl0IGlzIGNsb3NlCisgICAgICAgIGlmICghZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KHNjYWxlLCBnZXRSZWFkaW5nTGV2ZWxTY2FsZSgpKSkgeworICAgICAgICAgICAgc2NhbGUgPSBnZXRSZWFkaW5nTGV2ZWxTY2FsZSgpOworICAgICAgICB9CisKKyAgICAgICAgc2V0Wm9vbVNjYWxlKHNjYWxlLCByZWZsb3dUZXh0KTsKKworICAgICAgICBpZiAob2xkU2NhbGUgIT0gbUFjdHVhbFNjYWxlKSB7CisgICAgICAgICAgICAvLyB1c2UgbVpvb21QaWNrZXJTY2FsZSB0byBzZWUgem9vbSBwcmV2aWV3IGZpcnN0CisgICAgICAgICAgICBtWm9vbVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgICAgICBtSW52SW5pdGlhbFpvb21TY2FsZSA9IDEuMGYgLyBvbGRTY2FsZTsKKyAgICAgICAgICAgIG1JbnZGaW5hbFpvb21TY2FsZSA9IDEuMGYgLyBtQWN0dWFsU2NhbGU7CisgICAgICAgICAgICBtWm9vbVNjYWxlID0gbUFjdHVhbFNjYWxlOworICAgICAgICAgICAgbVdlYlZpZXcub25GaXhlZExlbmd0aFpvb21BbmltYXRpb25TdGFydCgpOworICAgICAgICAgICAgbVdlYlZpZXcuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIFdlYlZpZXcncyBkcmF3aW5nIGNvZGUgd2hlbiBhIGZpeGVkIGxlbmd0aCB6b29tCisgICAgICogYW5pbWF0aW9uIGlzIG9jY3VycmluZy4gSXRzIHB1cnBvc2UgaXMgdG8gYW5pbWF0ZSB0aGUgem9vbWluZyBvZiB0aGUgY2FudmFzCisgICAgICogdG8gdGhlIGRlc2lyZWQgc2NhbGUgd2hpY2ggd2FzIHNwZWNpZmllZCBpbiBzdGFydFpvb21BbmltYXRpb24oLi4uKS4KKyAgICAgKgorICAgICAqIEEgZml4ZWQgbGVuZ3RoIGFuaW1hdGlvbiBiZWdpbnMgd2hlbiBzdGFydFpvb21BbmltYXRpb24oLi4uKSBpcyBjYWxsZWQgYW5kCisgICAgICogY29udGludWVzIHVudGlsIHRoZSBaT09NX0FOSU1BVElPTl9MRU5HVEggdGltZSBoYXMgZWxhcHNlZC4gRHVyaW5nIHRoYXQKKyAgICAgKiBpbnRlcnZhbCBlYWNoIHRpbWUgdGhlIFdlYlZpZXcgZHJhd3MgaXQgY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGljaCBpcyAKKyAgICAgKiByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQWRkaXRpb25hbGx5LCB0aGUgV2ViVmlldyBjYW4gY2hlY2sgdG8gc2VlIGlmIHN1Y2ggYW4gYW5pbWF0aW9uIGlzIGN1cnJlbnRseQorICAgICAqIGluIHByb2dyZXNzIGJ5IGNhbGxpbmcgaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhbmltYXRlWm9vbShDYW52YXMgY2FudmFzKSB7CisgICAgICAgIGlmIChtWm9vbVNjYWxlID09IDApIHsKKyAgICAgICAgICAgIExvZy53KExPR1RBRywgIkEgV2ViVmlldyBpcyBhdHRlbXB0aW5nIHRvIHBlcmZvcm0gYSBmaXhlZCBsZW5ndGggIgorICAgICAgICAgICAgICAgICAgICArICJ6b29tIGFuaW1hdGlvbiB3aGVuIG5vIHpvb20gaXMgaW4gcHJvZ3Jlc3MiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IHpvb21TY2FsZTsKKyAgICAgICAgaW50IGludGVydmFsID0gKGludCkgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gbVpvb21TdGFydCk7CisgICAgICAgIGlmIChpbnRlcnZhbCA8IFpPT01fQU5JTUFUSU9OX0xFTkdUSCkgeworICAgICAgICAgICAgZmxvYXQgcmF0aW8gPSAoZmxvYXQpIGludGVydmFsIC8gWk9PTV9BTklNQVRJT05fTEVOR1RIOworICAgICAgICAgICAgem9vbVNjYWxlID0gMS4wZiAvIChtSW52SW5pdGlhbFpvb21TY2FsZQorICAgICAgICAgICAgICAgICAgICArIChtSW52RmluYWxab29tU2NhbGUgLSBtSW52SW5pdGlhbFpvb21TY2FsZSkgKiByYXRpbyk7CisgICAgICAgICAgICBtV2ViVmlldy5pbnZhbGlkYXRlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB6b29tU2NhbGUgPSBtWm9vbVNjYWxlOworICAgICAgICAgICAgLy8gc2V0IG1ab29tU2NhbGUgdG8gYmUgMCBhcyB3ZSBoYXZlIGZpbmlzaGVkIGFuaW1hdGluZworICAgICAgICAgICAgbVpvb21TY2FsZSA9IDA7CisgICAgICAgICAgICBtV2ViVmlldy5vbkZpeGVkTGVuZ3RoWm9vbUFuaW1hdGlvbkVuZCgpOworICAgICAgICB9CisgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgaW50ZXJtZWRpYXRlIHNjcm9sbCBwb3NpdGlvbi4gU2luY2Ugd2UgbmVlZCB0byB1c2UKKyAgICAgICAgLy8gem9vbVNjYWxlLCB3ZSBjYW4ndCB1c2UgdGhlIFdlYlZpZXcncyBwaW5Mb2NYL1kgZnVuY3Rpb25zIGRpcmVjdGx5LgorICAgICAgICBmbG9hdCBzY2FsZSA9IHpvb21TY2FsZSAqIG1JbnZJbml0aWFsWm9vbVNjYWxlOworICAgICAgICBpbnQgdHggPSBNYXRoLnJvdW5kKHNjYWxlICogKG1Jbml0aWFsU2Nyb2xsWCArIG1ab29tQ2VudGVyWCkgLSBtWm9vbUNlbnRlclgpOworICAgICAgICB0eCA9IC1XZWJWaWV3LnBpbkxvYyh0eCwgbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCksIE1hdGgucm91bmQobVdlYlZpZXcuZ2V0Q29udGVudFdpZHRoKCkKKyAgICAgICAgICAgICAgICAqIHpvb21TY2FsZSkpICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpOworICAgICAgICBpbnQgdGl0bGVIZWlnaHQgPSBtV2ViVmlldy5nZXRUaXRsZUhlaWdodCgpOworICAgICAgICBpbnQgdHkgPSBNYXRoLnJvdW5kKHNjYWxlCisgICAgICAgICAgICAgICAgKiAobUluaXRpYWxTY3JvbGxZICsgbVpvb21DZW50ZXJZIC0gdGl0bGVIZWlnaHQpCisgICAgICAgICAgICAgICAgLSAobVpvb21DZW50ZXJZIC0gdGl0bGVIZWlnaHQpKTsKKyAgICAgICAgdHkgPSAtKHR5IDw9IHRpdGxlSGVpZ2h0ID8gTWF0aC5tYXgodHksIDApIDogV2ViVmlldy5waW5Mb2ModHkKKyAgICAgICAgICAgICAgICAtIHRpdGxlSGVpZ2h0LCBtV2ViVmlldy5nZXRWaWV3SGVpZ2h0KCksIE1hdGgucm91bmQobVdlYlZpZXcuZ2V0Q29udGVudEhlaWdodCgpCisgICAgICAgICAgICAgICAgKiB6b29tU2NhbGUpKSArIHRpdGxlSGVpZ2h0KSArIG1XZWJWaWV3LmdldFNjcm9sbFkoKTsKKworICAgICAgICBjYW52YXMudHJhbnNsYXRlKHR4LCB0eSk7CisgICAgICAgIGNhbnZhcy5zY2FsZSh6b29tU2NhbGUsIHpvb21TY2FsZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNab29tQW5pbWF0aW5nKCkgeworICAgICAgICByZXR1cm4gaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKSB8fCBtUGluY2hUb1pvb21BbmltYXRpbmc7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKSB7CisgICAgICAgIHJldHVybiBtWm9vbVNjYWxlICE9IDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVmcmVzaFpvb21TY2FsZShib29sZWFuIHJlZmxvd1RleHQpIHsKKyAgICAgICAgc2V0Wm9vbVNjYWxlKG1BY3R1YWxTY2FsZSwgcmVmbG93VGV4dCwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Wm9vbVNjYWxlKGZsb2F0IHNjYWxlLCBib29sZWFuIHJlZmxvd1RleHQpIHsKKyAgICAgICAgc2V0Wm9vbVNjYWxlKHNjYWxlLCByZWZsb3dUZXh0LCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFpvb21TY2FsZShmbG9hdCBzY2FsZSwgYm9vbGVhbiByZWZsb3dUZXh0LCBib29sZWFuIGZvcmNlKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNTY2FsZUxlc3NUaGFuTWluWm9vbSA9IHNjYWxlIDwgbU1pblpvb21TY2FsZTsKKyAgICAgICAgc2NhbGUgPSBjb21wdXRlU2NhbGVXaXRoTGltaXRzKHNjYWxlKTsKKworICAgICAgICAvLyBkZXRlcm1pbmUgd2hldGhlciBvciBub3Qgd2UgYXJlIGluIHRoZSB6b29tIG92ZXJ2aWV3IG1vZGUKKyAgICAgICAgaWYgKGlzU2NhbGVMZXNzVGhhbk1pblpvb20gJiYgbU1pblpvb21TY2FsZSA8IG1EZWZhdWx0U2NhbGUpIHsKKyAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSAhZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KHNjYWxlLCBnZXRab29tT3ZlcnZpZXdTY2FsZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWZsb3dUZXh0KSB7CisgICAgICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IHNjYWxlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNjYWxlICE9IG1BY3R1YWxTY2FsZSB8fCBmb3JjZSkgeworICAgICAgICAgICAgZmxvYXQgb2xkU2NhbGUgPSBtQWN0dWFsU2NhbGU7CisgICAgICAgICAgICBmbG9hdCBvbGRJbnZTY2FsZSA9IG1JbnZBY3R1YWxTY2FsZTsKKworICAgICAgICAgICAgaWYgKHNjYWxlICE9IG1BY3R1YWxTY2FsZSAmJiAhbVBpbmNoVG9ab29tQW5pbWF0aW5nKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrUHJveHkub25TY2FsZUNoYW5nZWQobUFjdHVhbFNjYWxlLCBzY2FsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1BY3R1YWxTY2FsZSA9IHNjYWxlOworICAgICAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIHNjYWxlOworCisgICAgICAgICAgICBpZiAoIW1XZWJWaWV3LmRyYXdIaXN0b3J5KCkpIHsKKworICAgICAgICAgICAgICAgIC8vIElmIGhpc3RvcnkgUGljdHVyZSBpcyBkcmF3biwgZG9uJ3QgdXBkYXRlIHNjcm9sbC4gVGhleSB3aWxsCisgICAgICAgICAgICAgICAgLy8gYmUgdXBkYXRlZCB3aGVuIHdlIGdldCBvdXQgb2YgdGhhdCBtb2RlLgorICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBvdXIgc2Nyb2xsIHNvIHdlIGRvbid0IGFwcGVhciB0byBqdW1wCisgICAgICAgICAgICAgICAgLy8gaS5lLiBrZWVwIHRoZSBjZW50ZXIgb2YgdGhlIGRvYyBpbiB0aGUgY2VudGVyIG9mIHRoZSB2aWV3CisgICAgICAgICAgICAgICAgaW50IG9sZFggPSBtV2ViVmlldy5nZXRTY3JvbGxYKCk7CisgICAgICAgICAgICAgICAgaW50IG9sZFkgPSBtV2ViVmlldy5nZXRTY3JvbGxZKCk7CisgICAgICAgICAgICAgICAgZmxvYXQgcmF0aW8gPSBzY2FsZSAqIG9sZEludlNjYWxlOworICAgICAgICAgICAgICAgIGZsb2F0IHN4ID0gcmF0aW8gKiBvbGRYICsgKHJhdGlvIC0gMSkgKiBtWm9vbUNlbnRlclg7CisgICAgICAgICAgICAgICAgZmxvYXQgc3kgPSByYXRpbyAqIG9sZFkgKyAocmF0aW8gLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgKiAobVpvb21DZW50ZXJZIC0gbVdlYlZpZXcuZ2V0VGl0bGVIZWlnaHQoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBTY2FsZSBhbGwgdGhlIGNoaWxkIHZpZXdzCisgICAgICAgICAgICAgICAgbVdlYlZpZXcubVZpZXdNYW5hZ2VyLnNjYWxlQWxsKCk7CisKKyAgICAgICAgICAgICAgICAvLyBhcyB3ZSBkb24ndCBoYXZlIGFuaW1hdGlvbiBmb3Igc2NhbGluZywgZG9uJ3QgZG8gYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgLy8gZm9yIHNjcm9sbGluZywgYXMgaXQgY2F1c2VzIHdlaXJkIGludGVybWVkaWF0ZSBzdGF0ZQorICAgICAgICAgICAgICAgIGludCBzY3JvbGxYID0gbVdlYlZpZXcucGluTG9jWChNYXRoLnJvdW5kKHN4KSk7CisgICAgICAgICAgICAgICAgaW50IHNjcm9sbFkgPSBtV2ViVmlldy5waW5Mb2NZKE1hdGgucm91bmQoc3kpKTsKKyAgICAgICAgICAgICAgICBpZighbVdlYlZpZXcudXBkYXRlU2Nyb2xsQ29vcmRpbmF0ZXMoc2Nyb2xsWCwgc2Nyb2xsWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNjcm9sbCBwb3NpdGlvbiBpcyBhZGp1c3RlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyB6b29tIGFuaW1hdGlvbi4gQnV0IHdlIHdhbnQgdG8gdXBkYXRlIHRoZSBXZWJLaXQgYXQgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB0aGUgem9vbSBhbmltYXRpb24uIFNlZSBjb21tZW50cyBpbiBvblNjYWxlRW5kKCkuCisgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNlbmRPdXJWaXNpYmxlUmVjdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgdGhlIHdlIG5lZWQgdG8gcmVmbG93IHRoZSB0ZXh0IHRoZW4gZm9yY2UgdGhlIFZJRVdfU0laRV9DSEFOR0VECisgICAgICAgICAgICAvLyBldmVudCB0byBiZSBzZW50IHRvIFdlYktpdAorICAgICAgICAgICAgbVdlYlZpZXcuc2VuZFZpZXdTaXplWm9vbShyZWZsb3dUZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkb3VibGUgdGFwIGdlc3R1cmUgY2FuIHJlc3VsdCBpbiBkaWZmZXJlbnQgYmVoYXZpb3JzIGRlcGVuZGluZyBvbiB0aGUKKyAgICAgKiBjb250ZW50IHRoYXQgaXMgdGFwcGVkLgorICAgICAqCisgICAgICogKDEpIFBMVUdJTlM6IElmIHRoZSB0YXBzIG9jY3VyIG9uIGEgcGx1Z2luIHRoZW4gd2UgbWF4aW1pemUgdGhlIHBsdWdpbiBvbgorICAgICAqIHRoZSBzY3JlZW4uIElmIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBtYXhpbWl6ZWQgdGhlbiB6b29tIHRoZSB1c2VyIGludG8KKyAgICAgKiBvdmVydmlldyBtb2RlLgorICAgICAqCisgICAgICogKDIpIEhUTUwvT1RIRVI6IElmIHRoZSB0YXBzIG9jY3VyIG91dHNpZGUgYSBwbHVnaW4gdGhlbiB0aGUgZm9sbG93aW5nCisgICAgICogaGV1cmlzdGljIGlzIHVzZWQuCisgICAgICogICBBLiBJZiB0aGUgY3VycmVudCBzY2FsZSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHRleHQgd3JhcCBzY2FsZSBhbmQgdGhlCisgICAgICogICAgICBsYXlvdXQgYWxnb3JpdGhtIHNwZWNpZmllcyB0aGUgdXNlIG9mIE5BUlJPV19DT0xVTU5TLCB0aGVuIGZpdCB0bworICAgICAqICAgICAgY29sdW1uIGJ5IHJlZmxvd2luZyB0aGUgdGV4dC4KKyAgICAgKiAgIEIuIElmIHRoZSBwYWdlIGlzIG5vdCBpbiBvdmVydmlldyBtb2RlIHRoZW4gY2hhbmdlIHRvIG92ZXJ2aWV3IG1vZGUuCisgICAgICogICBDLiBJZiB0aGUgcGFnZSBpcyBpbiBvdmVybW9kZSB0aGVuIGNoYW5nZSB0byB0aGUgZGVmYXVsdCBzY2FsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVEb3VibGVUYXAoZmxvYXQgbGFzdFRvdWNoWCwgZmxvYXQgbGFzdFRvdWNoWSkgeworICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3LmdldFNldHRpbmdzKCk7CisgICAgICAgIGlmIChzZXR0aW5ncyA9PSBudWxsIHx8IHNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpID09IGZhbHNlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzZXRab29tQ2VudGVyKGxhc3RUb3VjaFgsIGxhc3RUb3VjaFkpOworICAgICAgICBtQW5jaG9yWCA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRYKChpbnQpIGxhc3RUb3VjaFggKyBtV2ViVmlldy5nZXRTY3JvbGxYKCkpOworICAgICAgICBtQW5jaG9yWSA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRZKChpbnQpIGxhc3RUb3VjaFkgKyBtV2ViVmlldy5nZXRTY3JvbGxZKCkpOworICAgICAgICBzZXR0aW5ncy5zZXREb3VibGVUYXBUb2FzdENvdW50KDApOworCisgICAgICAgIC8vIHJlbW92ZSB0aGUgem9vbSBjb250cm9sIGFmdGVyIGRvdWJsZSB0YXAKKyAgICAgICAgZGlzbWlzc1pvb21QaWNrZXIoKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGUgZG91YmxlIHRhcCB3YXMgb24gYSBwbHVnaW4gdGhlbiBlaXRoZXIgem9vbSB0byBtYXhpbWl6ZSB0aGUKKyAgICAgICAgICogcGx1Z2luIG9uIHRoZSBzY3JlZW4gb3Igc2NhbGUgdG8gb3ZlcnZpZXcgbW9kZS4KKyAgICAgICAgICovCisgICAgICAgIFZpZXdNYW5hZ2VyLkNoaWxkVmlldyBwbHVnaW4gPSBtV2ViVmlldy5tVmlld01hbmFnZXIuaGl0VGVzdChtQW5jaG9yWCwgbUFuY2hvclkpOworICAgICAgICBpZiAocGx1Z2luICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtV2ViVmlldy5pc1BsdWdpbkZpdE9uU2NyZWVuKHBsdWdpbikpIHsKKyAgICAgICAgICAgICAgICB6b29tVG9PdmVydmlldygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5jZW50ZXJGaXRSZWN0KHBsdWdpbi54LCBwbHVnaW4ueSwgcGx1Z2luLndpZHRoLCBwbHVnaW4uaGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXR0aW5ncy5nZXRMYXlvdXRBbGdvcml0aG0oKSA9PSBXZWJTZXR0aW5ncy5MYXlvdXRBbGdvcml0aG0uTkFSUk9XX0NPTFVNTlMKKyAgICAgICAgICAgICAgICAmJiB3aWxsU2NhbGVUcmlnZ2VyWm9vbShtVGV4dFdyYXBTY2FsZSkKKyAgICAgICAgICAgICAgICAvLyBGb3IgdGFibGV0LCBub3QgbXVjaCBuZWVkIHRvIHJlZmxvdyB0ZXh0IHcvbyBkb3VibGUgdGFwcGluZy4KKyAgICAgICAgICAgICAgICAmJiAhc2V0dGluZ3MuZ2V0VXNlRml4ZWRWaWV3cG9ydCgpKSB7CisgICAgICAgICAgICByZWZyZXNoWm9vbVNjYWxlKHRydWUpOworICAgICAgICB9IGVsc2UgaWYgKCFtSW5ab29tT3ZlcnZpZXcpIHsKKyAgICAgICAgICAgIHpvb21Ub092ZXJ2aWV3KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB6b29tVG9SZWFkaW5nTGV2ZWwoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRab29tT3ZlcnZpZXdXaWR0aChpbnQgd2lkdGgpIHsKKyAgICAgICAgbVpvb21PdmVydmlld1dpZHRoID0gd2lkdGg7CisgICAgICAgIG1JbnZab29tT3ZlcnZpZXdXaWR0aCA9IDEuMGYgLyB3aWR0aDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZsb2F0IGdldFpvb21PdmVydmlld1NjYWxlKCkgeworICAgICAgICByZXR1cm4gbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCkgKiBtSW52Wm9vbU92ZXJ2aWV3V2lkdGg7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNJblpvb21PdmVydmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1Jblpvb21PdmVydmlldzsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgem9vbVRvT3ZlcnZpZXcoKSB7CisgICAgICAgIGlmICghd2lsbFNjYWxlVHJpZ2dlclpvb20oZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKSkpIHJldHVybjsKKworICAgICAgICAvLyBGb3JjZSB0aGUgdGl0bGViYXIgZnVsbHkgcmV2ZWFsIGluIG92ZXJ2aWV3IG1vZGUKKyAgICAgICAgaW50IHNjcm9sbFkgPSBtV2ViVmlldy5nZXRTY3JvbGxZKCk7CisgICAgICAgIGlmIChzY3JvbGxZIDwgbVdlYlZpZXcuZ2V0VGl0bGVIZWlnaHQoKSkgeworICAgICAgICAgICAgbVdlYlZpZXcudXBkYXRlU2Nyb2xsQ29vcmRpbmF0ZXMobVdlYlZpZXcuZ2V0U2Nyb2xsWCgpLCAwKTsKKyAgICAgICAgfQorICAgICAgICBzdGFydFpvb21BbmltYXRpb24oZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHpvb21Ub1JlYWRpbmdMZXZlbCgpIHsKKyAgICAgICAgZmluYWwgZmxvYXQgcmVhZGluZ1NjYWxlID0gZ2V0UmVhZGluZ0xldmVsU2NhbGUoKTsKKyAgICAgICAgaW50IGxlZnQgPSBtV2ViVmlldy5uYXRpdmVHZXRCbG9ja0xlZnRFZGdlKG1BbmNob3JYLCBtQW5jaG9yWSwgbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgaWYgKGxlZnQgIT0gV2ViVmlldy5OT19MRUZURURHRSkgeworICAgICAgICAgICAgLy8gYWRkIGEgNXB0IHBhZGRpbmcgdG8gdGhlIGxlZnQgZWRnZS4KKyAgICAgICAgICAgIGludCB2aWV3TGVmdCA9IG1XZWJWaWV3LmNvbnRlbnRUb1ZpZXdYKGxlZnQgPCA1ID8gMCA6IChsZWZ0IC0gNSkpCisgICAgICAgICAgICAgICAgICAgIC0gbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpOworICAgICAgICAgICAgLy8gUmUtY2FsY3VsYXRlIHRoZSB6b29tIGNlbnRlciBzbyB0aGF0IHRoZSBuZXcgc2Nyb2xsIHggd2lsbCBiZQorICAgICAgICAgICAgLy8gb24gdGhlIGxlZnQgZWRnZS4KKyAgICAgICAgICAgIGlmICh2aWV3TGVmdCA+IDApIHsKKyAgICAgICAgICAgICAgICBtWm9vbUNlbnRlclggPSB2aWV3TGVmdCAqIHJlYWRpbmdTY2FsZSAvIChyZWFkaW5nU2NhbGUgLSBtQWN0dWFsU2NhbGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5zY3JvbGxCeSh2aWV3TGVmdCwgMCk7CisgICAgICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGFydFpvb21BbmltYXRpb24ocmVhZGluZ1NjYWxlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVNdWx0aVRvdWNoU3VwcG9ydChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgLy8gY2hlY2sgdGhlIHByZWNvbmRpdGlvbnMKKyAgICAgICAgYXNzZXJ0IG1XZWJWaWV3LmdldFNldHRpbmdzKCkgIT0gbnVsbDsKKworICAgICAgICBmaW5hbCBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3LmdldFNldHRpbmdzKCk7CisgICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIHBtID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBtU3VwcG9ydE11bHRpVG91Y2ggPSBwbS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVE9VQ0hTQ1JFRU5fTVVMVElUT1VDSCkKKyAgICAgICAgICAgICAgICAmJiBzZXR0aW5ncy5zdXBwb3J0Wm9vbSgpICYmIHNldHRpbmdzLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKTsKKyAgICAgICAgbUFsbG93UGFuQW5kU2NhbGUgPSBwbS5oYXNTeXN0ZW1GZWF0dXJlKAorICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVE9VQ0hTQ1JFRU5fTVVMVElUT1VDSF9ESVNUSU5DVCk7CisgICAgICAgIGlmIChtU3VwcG9ydE11bHRpVG91Y2ggJiYgKG1TY2FsZURldGVjdG9yID09IG51bGwpKSB7CisgICAgICAgICAgICBtU2NhbGVEZXRlY3RvciA9IG5ldyBTY2FsZUdlc3R1cmVEZXRlY3Rvcihjb250ZXh0LCBuZXcgU2NhbGVEZXRlY3Rvckxpc3RlbmVyKCkpOworICAgICAgICB9IGVsc2UgaWYgKCFtU3VwcG9ydE11bHRpVG91Y2ggJiYgKG1TY2FsZURldGVjdG9yICE9IG51bGwpKSB7CisgICAgICAgICAgICBtU2NhbGVEZXRlY3RvciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c011bHRpVG91Y2hab29tKCkgeworICAgICAgICByZXR1cm4gbVN1cHBvcnRNdWx0aVRvdWNoOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzUGFuRHVyaW5nWm9vbSgpIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvd1BhbkFuZFNjYWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoZSBjYWxsZXIgdGhhdCB0aGUgWm9vbU1hbmFnZXIgaXMgcmVxdWVzdGluZyB0aGF0IHNjYWxlIHJlbGF0ZWQKKyAgICAgKiB1cGRhdGVzIHNob3VsZCBub3QgYmUgc2VudCB0byB3ZWJraXQuIFRoaXMgY2FuIG9jY3VyIGluIGNhc2VzIHdoZXJlIHRoZQorICAgICAqIFpvb21NYW5hZ2VyIGlzIHBlcmZvcm1pbmcgYW4gYW5pbWF0aW9uIGFuZCBkb2VzIG5vdCB3YW50IHdlYmtpdCB0byB1cGRhdGUKKyAgICAgKiB1bnRpbCB0aGUgYW5pbWF0aW9uIGlzIGNvbXBsZXRlLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHNjYWxlIHJlbGF0ZWQgdXBkYXRlcyBzaG91bGQgbm90IGJlIHNlbnQgdG8gd2Via2l0IGFuZAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUHJldmVudGluZ1dlYmtpdFVwZGF0ZXMoKSB7CisgICAgICAgIC8vIGN1cnJlbnRseSBvbmx5IGFuaW1hdGluZyBhIG11bHRpLXRvdWNoIHpvb20gcHJldmVudHMgdXBkYXRlcywgYnV0CisgICAgICAgIC8vIG90aGVycyBjYW4gYWRkIHRoZWlyIG93biBjb25kaXRpb25zIHRvIHRoaXMgbWV0aG9kIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgcmV0dXJuIG1QaW5jaFRvWm9vbUFuaW1hdGluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZ2V0TXVsdGlUb3VjaEdlc3R1cmVEZXRlY3RvcigpIHsKKyAgICAgICAgcmV0dXJuIG1TY2FsZURldGVjdG9yOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2NhbGVEZXRlY3Rvckxpc3RlbmVyIGltcGxlbWVudHMgU2NhbGVHZXN0dXJlRGV0ZWN0b3IuT25TY2FsZUdlc3R1cmVMaXN0ZW5lciB7CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25TY2FsZUJlZ2luKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgICAgICBkaXNtaXNzWm9vbVBpY2tlcigpOworICAgICAgICAgICAgbVdlYlZpZXcubVZpZXdNYW5hZ2VyLnN0YXJ0Wm9vbSgpOworICAgICAgICAgICAgbVdlYlZpZXcub25QaW5jaFRvWm9vbUFuaW1hdGlvblN0YXJ0KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uU2NhbGUoU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKKyAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gTWF0aC5yb3VuZChkZXRlY3Rvci5nZXRTY2FsZUZhY3RvcigpICogbUFjdHVhbFNjYWxlICogMTAwKSAqIDAuMDFmOworICAgICAgICAgICAgaWYgKHdpbGxTY2FsZVRyaWdnZXJab29tKHNjYWxlKSkgeworICAgICAgICAgICAgICAgIG1QaW5jaFRvWm9vbUFuaW1hdGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgLy8gbGltaXQgdGhlIHNjYWxlIGNoYW5nZSBwZXIgc3RlcAorICAgICAgICAgICAgICAgIGlmIChzY2FsZSA+IG1BY3R1YWxTY2FsZSkgeworICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IE1hdGgubWluKHNjYWxlLCBtQWN0dWFsU2NhbGUgKiAxLjI1Zik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBNYXRoLm1heChzY2FsZSwgbUFjdHVhbFNjYWxlICogMC44Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldFpvb21DZW50ZXIoZGV0ZWN0b3IuZ2V0Rm9jdXNYKCksIGRldGVjdG9yLmdldEZvY3VzWSgpKTsKKyAgICAgICAgICAgICAgICBzZXRab29tU2NhbGUoc2NhbGUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblNjYWxlRW5kKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgICAgICBpZiAobVBpbmNoVG9ab29tQW5pbWF0aW5nKSB7CisgICAgICAgICAgICAgICAgbVBpbmNoVG9ab29tQW5pbWF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbUFuY2hvclggPSBtV2ViVmlldy52aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtV2ViVmlldy5nZXRTY3JvbGxYKCkpOworICAgICAgICAgICAgICAgIG1BbmNob3JZID0gbVdlYlZpZXcudmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpKTsKKyAgICAgICAgICAgICAgICAvLyBkb24ndCByZWZsb3cgd2hlbiB6b29tIGluOyB3aGVuIHpvb20gb3V0LCBkbyByZWZsb3cgaWYgdGhlCisgICAgICAgICAgICAgICAgLy8gbmV3IHNjYWxlIGlzIGFsbW9zdCBtaW5pbXVtIHNjYWxlOworICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVmbG93Tm93ID0gIWNhblpvb21PdXQoKSB8fCAobUFjdHVhbFNjYWxlIDw9IDAuOCAqIG1UZXh0V3JhcFNjYWxlKTsKKyAgICAgICAgICAgICAgICAvLyBmb3JjZSB6b29tIGFmdGVyIG1QcmV2aWV3Wm9vbU9ubHkgaXMgc2V0IHRvIGZhbHNlIHNvIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgLy8gbmV3IHZpZXcgc2l6ZSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgV2ViS2l0CisgICAgICAgICAgICAgICAgcmVmcmVzaFpvb21TY2FsZShyZWZsb3dOb3cpOworICAgICAgICAgICAgICAgIC8vIGNhbGwgaW52YWxpZGF0ZSgpIHRvIGRyYXcgd2l0aG91dCB6b29tIGZpbHRlcgorICAgICAgICAgICAgICAgIG1XZWJWaWV3LmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVdlYlZpZXcubVZpZXdNYW5hZ2VyLmVuZFpvb20oKTsKKyAgICAgICAgICAgIG1XZWJWaWV3Lm9uUGluY2hUb1pvb21BbmltYXRpb25FbmQoZGV0ZWN0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25TaXplQ2hhbmdlZChpbnQgdywgaW50IGgsIGludCBvdywgaW50IG9oKSB7CisgICAgICAgIC8vIHJlc2V0IHpvb20gYW5kIGFuY2hvciB0byB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBzY3JlZW4KKyAgICAgICAgLy8gdW5sZXNzIHdlIGFyZSBhbHJlYWR5IHpvb21pbmcKKyAgICAgICAgaWYgKCFpc0ZpeGVkTGVuZ3RoQW5pbWF0aW9uSW5Qcm9ncmVzcygpKSB7CisgICAgICAgICAgICBpbnQgdmlzaWJsZVRpdGxlSGVpZ2h0ID0gbVdlYlZpZXcuZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0KCk7CisgICAgICAgICAgICBtWm9vbUNlbnRlclggPSAwOworICAgICAgICAgICAgbVpvb21DZW50ZXJZID0gdmlzaWJsZVRpdGxlSGVpZ2h0OworICAgICAgICAgICAgbUFuY2hvclggPSBtV2ViVmlldy52aWV3VG9Db250ZW50WChtV2ViVmlldy5nZXRTY3JvbGxYKCkpOworICAgICAgICAgICAgbUFuY2hvclkgPSBtV2ViVmlldy52aWV3VG9Db250ZW50WSh2aXNpYmxlVGl0bGVIZWlnaHQgKyBtV2ViVmlldy5nZXRTY3JvbGxZKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdXBkYXRlIG1NaW5ab29tU2NhbGUgaWYgdGhlIG1pbmltdW0gem9vbSBzY2FsZSBpcyBub3QgZml4ZWQKKyAgICAgICAgaWYgKCFtTWluWm9vbVNjYWxlRml4ZWQpIHsKKyAgICAgICAgICAgIC8vIHdoZW4gY2hhbmdlIGZyb20gbmFycm93IHNjcmVlbiB0byB3aWRlIHNjcmVlbiwgdGhlIG5ldyB2aWV3V2lkdGgKKyAgICAgICAgICAgIC8vIGNhbiBiZSB3aWRlciB0aGFuIHRoZSBvbGQgY29udGVudCB3aWR0aC4gV2UgbGltaXQgdGhlIG1pbmltdW0KKyAgICAgICAgICAgIC8vIHNjYWxlIHRvIDEuMGYuIFRoZSBwcm9wZXIgbWluaW11bSBzY2FsZSB3aWxsIGJlIGNhbGN1bGF0ZWQgd2hlbgorICAgICAgICAgICAgLy8gdGhlIG5ldyBwaWN0dXJlIHNob3dzIHVwLgorICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IE1hdGgubWluKDEuMGYsIChmbG9hdCkgbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCkKKyAgICAgICAgICAgICAgICAgICAgLyAobVdlYlZpZXcuZHJhd0hpc3RvcnkoKSA/IG1XZWJWaWV3LmdldEhpc3RvcnlQaWN0dXJlV2lkdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbVpvb21PdmVydmlld1dpZHRoKSk7CisgICAgICAgICAgICAvLyBsaW1pdCB0aGUgbWluWm9vbVNjYWxlIHRvIHRoZSBpbml0aWFsU2NhbGUgaWYgaXQgaXMgc2V0CisgICAgICAgICAgICBpZiAobUluaXRpYWxTY2FsZSA+IDAgJiYgbUluaXRpYWxTY2FsZSA8IG1NaW5ab29tU2NhbGUpIHsKKyAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gbUluaXRpYWxTY2FsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRpc21pc3Nab29tUGlja2VyKCk7CisKKyAgICAgICAgLy8gb25TaXplQ2hhbmdlZCgpIGlzIGNhbGxlZCBkdXJpbmcgV2ViVmlldyBsYXlvdXQuIEFuZCBhbnkKKyAgICAgICAgLy8gcmVxdWVzdExheW91dCgpIGlzIGJsb2NrZWQgZHVyaW5nIGxheW91dC4gQXMgcmVmcmVzaFpvb21TY2FsZSgpIHdpbGwKKyAgICAgICAgLy8gY2F1c2UgaXRzIGNoaWxkIFZpZXcgdG8gcmVwb3NpdGlvbiBpdHNlbGYgdGhyb3VnaCBWaWV3TWFuYWdlcidzCisgICAgICAgIC8vIHNjYWxlQWxsKCksIHdlIG5lZWQgdG8gcG9zdCBhIFJ1bm5hYmxlIHRvIGVuc3VyZSByZXF1ZXN0TGF5b3V0KCkuCisgICAgICAgIC8vIEFkZGl0aW9uYWxseSwgb25seSB1cGRhdGUgdGhlIHRleHQgd3JhcCBzY2FsZSBpZiB0aGUgd2lkdGggY2hhbmdlZC4KKyAgICAgICAgbVdlYlZpZXcucG9zdChuZXcgUG9zdFNjYWxlKHcgIT0gb3cpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFBvc3RTY2FsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBtVXBkYXRlVGV4dFdyYXA7CisKKyAgICAgICAgcHVibGljIFBvc3RTY2FsZShib29sZWFuIHVwZGF0ZVRleHRXcmFwKSB7CisgICAgICAgICAgICBtVXBkYXRlVGV4dFdyYXAgPSB1cGRhdGVUZXh0V3JhcDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGlmIChtV2ViVmlldy5nZXRXZWJWaWV3Q29yZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBhbHdheXMgZm9yY2UsIGluIGNhc2Ugb3VyIGhlaWdodCBjaGFuZ2VkLCBpbiB3aGljaCBjYXNlIHdlCisgICAgICAgICAgICAgICAgLy8gc3RpbGwgd2FudCB0byBzZW5kIHRoZSBub3RpZmljYXRpb24gb3ZlciB0byB3ZWJraXQuCisgICAgICAgICAgICAgICAgc2V0Wm9vbVNjYWxlKE1hdGgubWF4KG1BY3R1YWxTY2FsZSwgZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKSksCisgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVUZXh0V3JhcCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSB6b29tIGJ1dHRvbnMgYXMgdGhlIHNjYWxlIGNhbiBiZSBjaGFuZ2VkCisgICAgICAgICAgICAgICAgdXBkYXRlWm9vbVBpY2tlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlWm9vbVJhbmdlKFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSB2aWV3U3RhdGUsCisgICAgICAgICAgICBpbnQgdmlld1dpZHRoLCBpbnQgbWluUHJlZldpZHRoKSB7CisgICAgICAgIGlmICh2aWV3U3RhdGUubU1pblNjYWxlID09IDApIHsKKyAgICAgICAgICAgIGlmICh2aWV3U3RhdGUubU1vYmlsZVNpdGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobWluUHJlZldpZHRoID4gTWF0aC5tYXgoMCwgdmlld1dpZHRoKSkgeworICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gKGZsb2F0KSB2aWV3V2lkdGggLyBtaW5QcmVmV2lkdGg7CisgICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGVGaXhlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSB2aWV3U3RhdGUubURlZmF1bHRTY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSBtRGVmYXVsdE1pblpvb21TY2FsZTsKKyAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSB2aWV3U3RhdGUubU1pblNjYWxlOworICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlld1N0YXRlLm1NYXhTY2FsZSA9PSAwKSB7CisgICAgICAgICAgICBtTWF4Wm9vbVNjYWxlID0gbURlZmF1bHRNYXhab29tU2NhbGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTWF4Wm9vbVNjYWxlID0gdmlld1N0YXRlLm1NYXhTY2FsZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlld1N0YXRlLm1WaWV3cG9ydFdpZHRoID4gMCAmJgorICAgICAgICAgICAgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5nZXRVc2VGaXhlZFZpZXdwb3J0KCkgJiYKKyAgICAgICAgICAgIG1XZWJWaWV3LmdldFNldHRpbmdzKCkuZ2V0VXNlV2lkZVZpZXdQb3J0KCkpIHsKKyAgICAgICAgICAgIC8vIFVzZSB3ZWJzaXRlIHNwZWNpZmllZCB2aWV3cG9ydCB3aWR0aC4KKyAgICAgICAgICAgIHNldFpvb21PdmVydmlld1dpZHRoKHZpZXdTdGF0ZS5tVmlld3BvcnRXaWR0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHpvb20gdmFsdWVzIHdoZW4gV2Via2l0IHByb2R1Y2VzIGEgbmV3IHBpY3R1cmUuIFRoaXMgbWV0aG9kCisgICAgICogc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZCdzIG1lc3NhZ2UgaGFuZGxlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbk5ld1BpY3R1cmUoV2ViVmlld0NvcmUuRHJhd0RhdGEgZHJhd0RhdGEpIHsKKyAgICAgICAgZmluYWwgaW50IHZpZXdXaWR0aCA9IG1XZWJWaWV3LmdldFZpZXdXaWR0aCgpOworCisgICAgICAgIGlmICghbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5nZXRVc2VGaXhlZFZpZXdwb3J0KCkKKyAgICAgICAgICAgICYmIG1XZWJWaWV3LmdldFNldHRpbmdzKCkuZ2V0VXNlV2lkZVZpZXdQb3J0KCkpIHsKKyAgICAgICAgICAgIC8vIGxpbWl0IG1ab29tT3ZlcnZpZXdXaWR0aCB1cHBlciBib3VuZCB0bworICAgICAgICAgICAgLy8gc01heFZpZXdwb3J0V2lkdGggc28gdGhhdCBpZiB0aGUgcGFnZSBkb2Vzbid0IGJlaGF2ZQorICAgICAgICAgICAgLy8gd2VsbCwgdGhlIFdlYlZpZXcgd29uJ3QgZ28gaW5zYW5lLiBsaW1pdCB0aGUgbG93ZXIKKyAgICAgICAgICAgIC8vIGJvdW5kIHRvIG1hdGNoIHRoZSBkZWZhdWx0IHNjYWxlIGZvciBtb2JpbGUgc2l0ZXMuCisgICAgICAgICAgICBzZXRab29tT3ZlcnZpZXdXaWR0aChNYXRoLm1pbihXZWJWaWV3LnNNYXhWaWV3cG9ydFdpZHRoLAorICAgICAgICAgICAgICAgICAgICBNYXRoLm1heCgoaW50KSAodmlld1dpZHRoICogbUludkRlZmF1bHRTY2FsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoZHJhd0RhdGEubU1pblByZWZXaWR0aCwgZHJhd0RhdGEubVZpZXdQb2ludC54KSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGZsb2F0IHpvb21PdmVydmlld1NjYWxlID0gZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKTsKKyAgICAgICAgaWYgKCFtTWluWm9vbVNjYWxlRml4ZWQpIHsKKyAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSB6b29tT3ZlcnZpZXdTY2FsZTsKKyAgICAgICAgfQorICAgICAgICAvLyBmaXQgdGhlIGNvbnRlbnQgd2lkdGggdG8gdGhlIGN1cnJlbnQgdmlldy4gSWdub3JlIHRoZSByb3VuZGluZyBlcnJvciBjYXNlLgorICAgICAgICBpZiAoIW1XZWJWaWV3LmRyYXdIaXN0b3J5KCkgJiYgKG1Jbml0aWFsWm9vbU92ZXJ2aWV3IHx8IChtSW5ab29tT3ZlcnZpZXcKKyAgICAgICAgICAgICAgICAmJiBNYXRoLmFicygodmlld1dpZHRoICogbUludkFjdHVhbFNjYWxlKSAtIG1ab29tT3ZlcnZpZXdXaWR0aCkgPiAxKSkpIHsKKyAgICAgICAgICAgIG1Jbml0aWFsWm9vbU92ZXJ2aWV3ID0gZmFsc2U7CisgICAgICAgICAgICBzZXRab29tU2NhbGUoem9vbU92ZXJ2aWV3U2NhbGUsICF3aWxsU2NhbGVUcmlnZ2VyWm9vbShtVGV4dFdyYXBTY2FsZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlcyB6b29tIHZhbHVlcyBhZnRlciBXZWJraXQgY29tcGxldGVzIHRoZSBpbml0aWFsIHBhZ2UgbGF5b3V0LiBJdAorICAgICAqIGlzIGNhbGxlZCB3aGVuIHZpc2l0aW5nIGEgcGFnZSBmb3IgdGhlIGZpcnN0IHRpbWUgYXMgd2VsbCBhcyB3aGVuIHRoZQorICAgICAqIHVzZXIgbmF2aWdhdGVzIGJhY2sgdG8gYSBwYWdlIChpbiB3aGljaCBjYXNlIHdlIG1heSBuZWVkIHRvIHJlc3RvcmUgdGhlCisgICAgICogem9vbSBsZXZlbHMgdG8gdGhlIHN0YXRlIHRoZXkgd2VyZSB3aGVuIHlvdSBsZWZ0IHRoZSBwYWdlKS4gVGhpcyBtZXRob2QKKyAgICAgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkJ3MgbWVzc2FnZSBoYW5kbGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uRmlyc3RMYXlvdXQoV2ViVmlld0NvcmUuRHJhd0RhdGEgZHJhd0RhdGEpIHsKKyAgICAgICAgLy8gcHJlY29uZGl0aW9uIGNoZWNrCisgICAgICAgIGFzc2VydCBkcmF3RGF0YSAhPSBudWxsOworICAgICAgICBhc3NlcnQgZHJhd0RhdGEubVZpZXdTdGF0ZSAhPSBudWxsOworICAgICAgICBhc3NlcnQgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKSAhPSBudWxsOworCisgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSB2aWV3U3RhdGUgPSBkcmF3RGF0YS5tVmlld1N0YXRlOworICAgICAgICBmaW5hbCBQb2ludCB2aWV3U2l6ZSA9IGRyYXdEYXRhLm1WaWV3UG9pbnQ7CisgICAgICAgIHVwZGF0ZVpvb21SYW5nZSh2aWV3U3RhdGUsIHZpZXdTaXplLngsIGRyYXdEYXRhLm1NaW5QcmVmV2lkdGgpOworCisgICAgICAgIGlmICghbVdlYlZpZXcuZHJhd0hpc3RvcnkoKSkgeworICAgICAgICAgICAgZmluYWwgZmxvYXQgc2NhbGU7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlZmxvd1RleHQ7CisKKyAgICAgICAgICAgIGlmIChtSW5pdGlhbFNjYWxlID4gMCkgeworICAgICAgICAgICAgICAgIHNjYWxlID0gbUluaXRpYWxTY2FsZTsKKyAgICAgICAgICAgICAgICByZWZsb3dUZXh0ID0gZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KG1UZXh0V3JhcFNjYWxlLCBzY2FsZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZpZXdTdGF0ZS5tVmlld1NjYWxlID4gMCkgeworICAgICAgICAgICAgICAgIG1UZXh0V3JhcFNjYWxlID0gdmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlOworICAgICAgICAgICAgICAgIHNjYWxlID0gdmlld1N0YXRlLm1WaWV3U2NhbGU7CisgICAgICAgICAgICAgICAgcmVmbG93VGV4dCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3LmdldFNldHRpbmdzKCk7CisgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpCisgICAgICAgICAgICAgICAgICAgICYmIChzZXR0aW5ncy5nZXRMb2FkV2l0aE92ZXJ2aWV3TW9kZSgpIHx8IHNldHRpbmdzLmdldFVzZUZpeGVkVmlld3BvcnQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxab29tT3ZlcnZpZXcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IChmbG9hdCkgbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCkgLyBtWm9vbU92ZXJ2aWV3V2lkdGg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSB2aWV3U3RhdGUubVRleHRXcmFwU2NhbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlZmxvd1RleHQgPSBleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQobVRleHRXcmFwU2NhbGUsIHNjYWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldFpvb21TY2FsZShzY2FsZSwgcmVmbG93VGV4dCk7CisKKyAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgem9vbSBidXR0b25zIGFzIHRoZSBzY2FsZSBjYW4gYmUgY2hhbmdlZAorICAgICAgICAgICAgdXBkYXRlWm9vbVBpY2tlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2F2ZVpvb21TdGF0ZShCdW5kbGUgYikgeworICAgICAgICBiLnB1dEZsb2F0KCJzY2FsZSIsIG1BY3R1YWxTY2FsZSk7CisgICAgICAgIGIucHV0RmxvYXQoInRleHR3cmFwU2NhbGUiLCBtVGV4dFdyYXBTY2FsZSk7CisgICAgICAgIGIucHV0Qm9vbGVhbigib3ZlcnZpZXciLCBtSW5ab29tT3ZlcnZpZXcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVab29tU3RhdGUoQnVuZGxlIGIpIHsKKyAgICAgICAgLy8gYXMgZ2V0V2lkdGgoKSAvIGdldEhlaWdodCgpIG9mIHRoZSB2aWV3IGFyZSBub3QgYXZhaWxhYmxlIHlldCwgc2V0IHVwCisgICAgICAgIC8vIG1BY3R1YWxTY2FsZSwgc28gdGhhdCB3aGVuIG9uU2l6ZUNoYW5nZWQoKSBpcyBjYWxsZWQsIHRoZSByZXN0IHdpbGwKKyAgICAgICAgLy8gYmUgc2V0IGNvcnJlY3RseQorICAgICAgICBtQWN0dWFsU2NhbGUgPSBiLmdldEZsb2F0KCJzY2FsZSIsIDEuMGYpOworICAgICAgICBtSW52QWN0dWFsU2NhbGUgPSAxIC8gbUFjdHVhbFNjYWxlOworICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IGIuZ2V0RmxvYXQoInRleHR3cmFwU2NhbGUiLCBtQWN0dWFsU2NhbGUpOworICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBiLmdldEJvb2xlYW4oIm92ZXJ2aWV3Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBab29tQ29udHJvbEJhc2UgZ2V0Q3VycmVudFpvb21Db250cm9sKCkgeworICAgICAgICBpZiAobVdlYlZpZXcuZ2V0U2V0dGluZ3MoKSAhPSBudWxsICYmIG1XZWJWaWV3LmdldFNldHRpbmdzKCkuc3VwcG9ydFpvb20oKSkgeworICAgICAgICAgICAgaWYgKG1XZWJWaWV3LmdldFNldHRpbmdzKCkuZ2V0QnVpbHRJblpvb21Db250cm9scygpKSB7CisgICAgICAgICAgICAgICAgaWYgKChtRW1iZWRkZWRab29tQ29udHJvbCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5nZXREaXNwbGF5Wm9vbUNvbnRyb2xzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUVtYmVkZGVkWm9vbUNvbnRyb2wgPSBuZXcgWm9vbUNvbnRyb2xFbWJlZGRlZCh0aGlzLCBtV2ViVmlldyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtRW1iZWRkZWRab29tQ29udHJvbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1FeHRlcm5hbFpvb21Db250cm9sID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUV4dGVybmFsWm9vbUNvbnRyb2wgPSBuZXcgWm9vbUNvbnRyb2xFeHRlcm5hbChtV2ViVmlldyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtRXh0ZXJuYWxab29tQ29udHJvbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnZva2Vab29tUGlja2VyKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250cm9sLnNob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRpc21pc3Nab29tUGlja2VyKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250cm9sLmhpZGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzWm9vbVBpY2tlclZpc2libGUoKSB7CisgICAgICAgIFpvb21Db250cm9sQmFzZSBjb250cm9sID0gZ2V0Q3VycmVudFpvb21Db250cm9sKCk7CisgICAgICAgIHJldHVybiAoY29udHJvbCAhPSBudWxsKSA/IGNvbnRyb2wuaXNWaXNpYmxlKCkgOiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVab29tUGlja2VyKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250cm9sLnVwZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGVtYmVkZGVkIHpvb20gY29udHJvbCBpbnRlcmNlcHRzIHRvdWNoIGV2ZW50cyBhbmQgYXV0b21hdGljYWxseSBzdGF5cworICAgICAqIHZpc2libGUuIFRoZSBleHRlcm5hbCBjb250cm9sIG5lZWRzIHRvIGNvbnN0YW50bHkgcmVmcmVzaCBpdHMgaW50ZXJuYWwKKyAgICAgKiB0aW1lciB0byBzdGF5IHZpc2libGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQga2VlcFpvb21QaWNrZXJWaXNpYmxlKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsICYmIGNvbnRyb2wgPT0gbUV4dGVybmFsWm9vbUNvbnRyb2wpIHsKKyAgICAgICAgICAgIGNvbnRyb2wuc2hvdygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFZpZXcgZ2V0RXh0ZXJuYWxab29tUGlja2VyKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsICYmIGNvbnRyb2wgPT0gbUV4dGVybmFsWm9vbUNvbnRyb2wpIHsKKyAgICAgICAgICAgIHJldHVybiBtRXh0ZXJuYWxab29tQ29udHJvbC5nZXRDb250cm9scygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWJzTGlzdFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCmluZGV4IDQ1NTg4NTQuLmM2OTRmZjEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKQEAgLTM0LDExICszNCwxNiBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvbmdTcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQm9vbGVhbkFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmVsb2NpdHlUcmFja2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtNDYsNyArNTEsNiBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3RGVidWc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5CYXNlSW5wdXRDb25uZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5FZGl0b3JJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dENvbm5lY3Rpb247CkBAIC03MCwxMCArNzQsMTIgQEAKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0Fic0xpc3RWaWV3X2NhY2hlQ29sb3JIaW50CiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBYnNMaXN0Vmlld19mYXN0U2Nyb2xsRW5hYmxlZAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQWJzTGlzdFZpZXdfc21vb3RoU2Nyb2xsYmFyCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBYnNMaXN0Vmlld19jaG9pY2VNb2RlCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnNMaXN0VmlldyBleHRlbmRzIEFkYXB0ZXJWaWV3PExpc3RBZGFwdGVyPiBpbXBsZW1lbnRzIFRleHRXYXRjaGVyLAogICAgICAgICBWaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXIsIEZpbHRlci5GaWx0ZXJMaXN0ZW5lciwKLSAgICAgICAgVmlld1RyZWVPYnNlcnZlci5PblRvdWNoTW9kZUNoYW5nZUxpc3RlbmVyIHsKKyAgICAgICAgVmlld1RyZWVPYnNlcnZlci5PblRvdWNoTW9kZUNoYW5nZUxpc3RlbmVyLAorICAgICAgICBSZW1vdGVWaWV3c0FkYXB0ZXIuUmVtb3RlQWRhcHRlckNvbm5lY3Rpb25DYWxsYmFjayB7CiAKICAgICAvKioKICAgICAgKiBEaXNhYmxlcyB0aGUgdHJhbnNjcmlwdCBtb2RlLgpAQCAtMTMwLDE3ICsxMzYsNiBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfTU9ERV9GTElORyA9IDQ7CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgdGhlIHRvdWNoIGdlc3R1cmUgaXMgYW4gb3ZlcnNjcm9sbCAtIGEgc2Nyb2xsIGJleW9uZCB0aGUgYmVnaW5uaW5nIG9yIGVuZC4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFRPVUNIX01PREVfT1ZFUlNDUk9MTCA9IDU7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgdGhlIHZpZXcgaXMgYmVpbmcgZmx1bmcgb3V0c2lkZSBvZiBub3JtYWwgY29udGVudCBib3VuZHMKLSAgICAgKiBhbmQgd2lsbCBzcHJpbmcgYmFjay4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFRPVUNIX01PREVfT1ZFUkZMSU5HID0gNjsKLQotICAgIC8qKgogICAgICAqIFJlZ3VsYXIgbGF5b3V0IC0gdXN1YWxseSBhbiB1bnNvbGljaXRlZCBsYXlvdXQgZnJvbSB0aGUgdmlldyBzeXN0ZW0KICAgICAgKi8KICAgICBzdGF0aWMgZmluYWwgaW50IExBWU9VVF9OT1JNQUwgPSAwOwpAQCAtMTc4LDYgKzE3Myw1NyBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX01PVkVfU0VMRUNUSU9OID0gNjsKIAogICAgIC8qKgorICAgICAqIE5vcm1hbCBsaXN0IHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2hvaWNlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIT0lDRV9NT0RFX05PTkUgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIGxpc3QgYWxsb3dzIHVwIHRvIG9uZSBjaG9pY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfTU9ERV9TSU5HTEUgPSAxOworCisgICAgLyoqCisgICAgICogVGhlIGxpc3QgYWxsb3dzIG11bHRpcGxlIGNob2ljZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfTU9ERV9NVUxUSVBMRSA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBhbGxvd3MgbXVsdGlwbGUgY2hvaWNlcyBpbiBhIG1vZGFsIHNlbGVjdGlvbiBtb2RlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwgPSAzOworCisgICAgLyoqCisgICAgICogQ29udHJvbHMgaWYvaG93IHRoZSB1c2VyIG1heSBjaG9vc2UvY2hlY2sgaXRlbXMgaW4gdGhlIGxpc3QKKyAgICAgKi8KKyAgICBpbnQgbUNob2ljZU1vZGUgPSBDSE9JQ0VfTU9ERV9OT05FOworCisgICAgLyoqCisgICAgICogQ29udHJvbHMgQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwuIG51bGwgd2hlbiBpbmFjdGl2ZS4KKyAgICAgKi8KKyAgICBBY3Rpb25Nb2RlIG1DaG9pY2VBY3Rpb25Nb2RlOworCisgICAgLyoqCisgICAgICogV3JhcHBlciBmb3IgdGhlIG11bHRpcGxlIGNob2ljZSBtb2RlIGNhbGxiYWNrOyBBYnNMaXN0VmlldyBuZWVkcyB0byBwZXJmb3JtCisgICAgICogYSBmZXcgZXh0cmEgYWN0aW9ucyBhcm91bmQgd2hhdCBhcHBsaWNhdGlvbiBjb2RlIGRvZXMuCisgICAgICovCisgICAgTXVsdGlDaG9pY2VNb2RlV3JhcHBlciBtTXVsdGlDaG9pY2VNb2RlQ2FsbGJhY2s7CisKKyAgICAvKioKKyAgICAgKiBSdW5uaW5nIGNvdW50IG9mIGhvdyBtYW55IGl0ZW1zIGFyZSBjdXJyZW50bHkgY2hlY2tlZAorICAgICAqLworICAgIGludCBtQ2hlY2tlZEl0ZW1Db3VudDsKKworICAgIC8qKgorICAgICAqIFJ1bm5pbmcgc3RhdGUgb2Ygd2hpY2ggcG9zaXRpb25zIGFyZSBjdXJyZW50bHkgY2hlY2tlZAorICAgICAqLworICAgIFNwYXJzZUJvb2xlYW5BcnJheSBtQ2hlY2tTdGF0ZXM7CisKKyAgICAvKioKKyAgICAgKiBSdW5uaW5nIHN0YXRlIG9mIHdoaWNoIElEcyBhcmUgY3VycmVudGx5IGNoZWNrZWQKKyAgICAgKi8KKyAgICBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4gbUNoZWNrZWRJZFN0YXRlczsKKworICAgIC8qKgogICAgICAqIENvbnRyb2xzIGhvdyB0aGUgbmV4dCBsYXlvdXQgd2lsbCBoYXBwZW4KICAgICAgKi8KICAgICBpbnQgbUxheW91dE1vZGUgPSBMQVlPVVRfTk9STUFMOwpAQCAtMTkzLDYgKzIzOSwxMSBAQAogICAgIExpc3RBZGFwdGVyIG1BZGFwdGVyOwogCiAgICAgLyoqCisgICAgICogVGhlIHJlbW90ZSBhZGFwdGVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgZGlzcGxheWVkIGJ5IHRoaXMgdmlldyB0byBiZSBzZXQKKyAgICAgKi8KKyAgICBwcml2YXRlIFJlbW90ZVZpZXdzQWRhcHRlciBtUmVtb3RlQWRhcHRlcjsKKworICAgIC8qKgogICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBsaXN0IHNlbGVjdG9yIHNob3VsZCBiZSBkcmF3biBvbiB0b3Agb2YgdGhlIGNoaWxkcmVuIG9yIGJlaGluZAogICAgICAqLwogICAgIGJvb2xlYW4gbURyYXdTZWxlY3Rvck9uVG9wID0gZmFsc2U7CkBAIC0zODIsMTYgKzQzMyw2IEBACiAgICAgcHJpdmF0ZSBDb250ZXh0TWVudUluZm8gbUNvbnRleHRNZW51SW5mbyA9IG51bGw7CiAgICAgCiAgICAgLyoqCi0gICAgICogTWF4aW11bSBkaXN0YW5jZSB0byByZWNvcmQgb3ZlcnNjcm9sbAotICAgICAqLwotICAgIGludCBtT3ZlcnNjcm9sbE1heDsKLQotICAgIC8qKgotICAgICAqIENvbnRlbnQgaGVpZ2h0IGRpdmlkZWQgYnkgdGhpcyBpcyB0aGUgb3ZlcnNjcm9sbCBsaW1pdC4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IE9WRVJTQ1JPTExfTElNSVRfRElWSVNPUiA9IDM7Ci0KLSAgICAvKioKICAgICAgKiBVc2VkIHRvIHJlcXVlc3QgYSBsYXlvdXQgd2hlbiB3ZSBjaGFuZ2VkIHRvdWNoIG1vZGUKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfTU9ERV9VTktOT1dOID0gLTE7CkBAIC00ODQsNDggKzUyNSw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUE9JTlRFUiA9IC0xOwogCiAgICAgLyoqCi0gICAgICogTWF4aW11bSBkaXN0YW5jZSB0byBvdmVyc2Nyb2xsIGJ5IGR1cmluZyBlZGdlIGVmZmVjdHMKLSAgICAgKi8KLSAgICBpbnQgbU92ZXJzY3JvbGxEaXN0YW5jZTsKLQotICAgIC8qKgotICAgICAqIE1heGltdW0gZGlzdGFuY2UgdG8gb3ZlcmZsaW5nIGR1cmluZyBlZGdlIGVmZmVjdHMKLSAgICAgKi8KLSAgICBpbnQgbU92ZXJmbGluZ0Rpc3RhbmNlOwotCi0gICAgLy8gVGhlc2UgdHdvIEVkZ2VHbG93cyBhcmUgYWx3YXlzIHNldCBhbmQgdXNlZCB0b2dldGhlci4KLSAgICAvLyBDaGVja2luZyBvbmUgZm9yIG51bGwgaXMgYXMgZ29vZCBhcyBjaGVja2luZyBib3RoLgotCi0gICAgLyoqCi0gICAgICogVHJhY2tzIHRoZSBzdGF0ZSBvZiB0aGUgdG9wIGVkZ2UgZ2xvdy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEVkZ2VHbG93IG1FZGdlR2xvd1RvcDsKLQotICAgIC8qKgotICAgICAqIFRyYWNrcyB0aGUgc3RhdGUgb2YgdGhlIGJvdHRvbSBlZGdlIGdsb3cuCi0gICAgICovCi0gICAgcHJpdmF0ZSBFZGdlR2xvdyBtRWRnZUdsb3dCb3R0b207Ci0KLSAgICAvKioKLSAgICAgKiBBbiBlc3RpbWF0ZSBvZiBob3cgbWFueSBwaXhlbHMgYXJlIGJldHdlZW4gdGhlIHRvcCBvZiB0aGUgbGlzdCBhbmQKLSAgICAgKiB0aGUgdG9wIG9mIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiB0aGUgYWRhcHRlciwgYmFzZWQgb24gdGhlIGxhc3QgdGltZQotICAgICAqIHdlIHNhdyBpdC4gVXNlZCB0byBoaW50IHdoZXJlIHRvIGRyYXcgZWRnZSBnbG93cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtRmlyc3RQb3NpdGlvbkRpc3RhbmNlR3Vlc3M7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBlc3RpbWF0ZSBvZiBob3cgbWFueSBwaXhlbHMgYXJlIGJldHdlZW4gdGhlIGJvdHRvbSBvZiB0aGUgbGlzdCBhbmQKLSAgICAgKiB0aGUgYm90dG9tIG9mIHRoZSBsYXN0IHBvc2l0aW9uIGluIHRoZSBhZGFwdGVyLCBiYXNlZCBvbiB0aGUgbGFzdCB0aW1lCi0gICAgICogd2Ugc2F3IGl0LiBVc2VkIHRvIGhpbnQgd2hlcmUgdG8gZHJhdyBlZGdlIGdsb3dzLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1MYXN0UG9zaXRpb25EaXN0YW5jZUd1ZXNzOwotCi0gICAgLyoqCi0gICAgICogVXNlZCBmb3IgZGV0ZXJtaW5pbmcgd2hlbiB0byBjYW5jZWwgb3V0IG9mIG92ZXJzY3JvbGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbURpcmVjdGlvbiA9IDA7Ci0KLSAgICAvKioKICAgICAgKiBJbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGxpc3Qgb3IgZ3JpZAogICAgICAqIGhhcyBiZWVuIHNjcm9sbGVkLgogICAgICAqLwpAQCAtNjI0LDYgKzYyMywxOCBAQAogCiAgICAgICAgIGJvb2xlYW4gc21vb3RoU2Nyb2xsYmFyID0gYS5nZXRCb29sZWFuKFIuc3R5bGVhYmxlLkFic0xpc3RWaWV3X3Ntb290aFNjcm9sbGJhciwgdHJ1ZSk7CiAgICAgICAgIHNldFNtb290aFNjcm9sbGJhckVuYWJsZWQoc21vb3RoU2Nyb2xsYmFyKTsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIGludCBhZGFwdGVySWQgPSBhLmdldFJlc291cmNlSWQoUi5zdHlsZWFibGUuQWJzTGlzdFZpZXdfYWRhcHRlciwgMCk7CisgICAgICAgIGlmIChhZGFwdGVySWQgIT0gMCkgeworICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjID0gY29udGV4dDsKKyAgICAgICAgICAgIHBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0QWRhcHRlcihBZGFwdGVycy5sb2FkQWRhcHRlcihjLCBhZGFwdGVySWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHNldENob2ljZU1vZGUoYS5nZXRJbnQoUi5zdHlsZWFibGUuQWJzTGlzdFZpZXdfY2hvaWNlTW9kZSwgQ0hPSUNFX01PREVfTk9ORSkpOwogCiAgICAgICAgIGEucmVjeWNsZSgpOwogICAgIH0KQEAgLTY0MCwzOSArNjUxLDMxMiBAQAogICAgICAgICBtVG91Y2hTbG9wID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRUb3VjaFNsb3AoKTsKICAgICAgICAgbU1pbmltdW1WZWxvY2l0eSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWluaW11bUZsaW5nVmVsb2NpdHkoKTsKICAgICAgICAgbU1heGltdW1WZWxvY2l0eSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWF4aW11bUZsaW5nVmVsb2NpdHkoKTsKLSAgICAgICAgbU92ZXJzY3JvbGxEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcnNjcm9sbERpc3RhbmNlKCk7Ci0gICAgICAgIG1PdmVyZmxpbmdEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcmZsaW5nRGlzdGFuY2UoKTsKLQogICAgICAgICBtRGVuc2l0eVNjYWxlID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlcnNjcm9sbE1vZGUoaW50IG1vZGUpIHsKLSAgICAgICAgaWYgKG1vZGUgIT0gT1ZFUlNDUk9MTF9ORVZFUikgewotICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBlZGdlID0gcmVzLmdldERyYXdhYmxlKFIuZHJhd2FibGUub3ZlcnNjcm9sbF9lZGdlKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBnbG93ID0gcmVzLmdldERyYXdhYmxlKFIuZHJhd2FibGUub3ZlcnNjcm9sbF9nbG93KTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3AgPSBuZXcgRWRnZUdsb3coZWRnZSwgZ2xvdyk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tID0gbmV3IEVkZ2VHbG93KGVkZ2UsIGdsb3cpOworICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoTGlzdEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSAmJgorICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzID0gbmV3IExvbmdTcGFyc2VBcnJheTxCb29sZWFuPigpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUVkZ2VHbG93VG9wID0gbnVsbDsKLSAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbSA9IG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgc3VwZXIuc2V0T3ZlcnNjcm9sbE1vZGUobW9kZSk7CisKKyAgICAgICAgaWYgKG1DaGVja1N0YXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbGwgbGlzdCBjb250ZW50IGN1cnJlbnRseSBmaXRzIHdpdGhpbiB0aGUgdmlldyBib3VuZGFyaWVzCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGN1cnJlbnRseSBzZWxlY3RlZC4gVGhpcyB3aWxsIG9ubHkgYmUgdmFsaWQKKyAgICAgKiBpZiB0aGUgY2hvaWNlIG1vZGUgaXMgbm90IHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0gKGRlZmF1bHQpLgorICAgICAqCisgICAgICogPHA+VG8gZGV0ZXJtaW5lIHRoZSBzcGVjaWZpYyBpdGVtcyB0aGF0IGFyZSBjdXJyZW50bHkgc2VsZWN0ZWQsIHVzZSBvbmUgb2YKKyAgICAgKiB0aGUgPGNvZGU+Z2V0Q2hlY2tlZCo8L2NvZGU+IG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgaXRlbXMgY3VycmVudGx5IHNlbGVjdGVkCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRDaGVja2VkSXRlbVBvc2l0aW9uKCkKKyAgICAgKiBAc2VlICNnZXRDaGVja2VkSXRlbVBvc2l0aW9ucygpCisgICAgICogQHNlZSAjZ2V0Q2hlY2tlZEl0ZW1JZHMoKQogICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjb250ZW50Rml0cygpIHsKLSAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBnZXRDaGlsZENvdW50KCk7Ci0gICAgICAgIGlmIChjaGlsZENvdW50ICE9IG1JdGVtQ291bnQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBwdWJsaWMgaW50IGdldENoZWNrZWRJdGVtQ291bnQoKSB7CisgICAgICAgIHJldHVybiBtQ2hlY2tlZEl0ZW1Db3VudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIFRoZSByZXN1bHQgaXMgb25seQorICAgICAqIHZhbGlkIGlmIHRoZSBjaG9pY2UgbW9kZSBoYXMgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9CisgICAgICogb3Ige0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIGl0ZW0gd2hvc2UgY2hlY2tlZCBzdGF0ZSB0byByZXR1cm4KKyAgICAgKiBAcmV0dXJuIFRoZSBpdGVtJ3MgY2hlY2tlZCBzdGF0ZSBvciA8Y29kZT5mYWxzZTwvY29kZT4gaWYgY2hvaWNlIG1vZGUKKyAgICAgKiAgICAgICAgIGlzIGludmFsaWQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSXRlbUNoZWNrZWQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FICYmIG1DaGVja1N0YXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzLmdldChwb3NpdGlvbik7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gZ2V0Q2hpbGRBdCgwKS5nZXRUb3AoKSA+PSAwICYmIGdldENoaWxkQXQoY2hpbGRDb3VudCAtIDEpLmdldEJvdHRvbSgpIDw9IG1Cb3R0b207CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgY2hlY2tlZCBpdGVtLiBUaGUgcmVzdWx0IGlzIG9ubHkgdmFsaWQgaWYgdGhlIGNob2ljZQorICAgICAqIG1vZGUgaGFzIGJlZW4gc2V0IHRvIHtAbGluayAjQ0hPSUNFX01PREVfU0lOR0xFfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50bHkgY2hlY2tlZCBpdGVtIG9yCisgICAgICogICAgICAgICB7QGxpbmsgI0lOVkFMSURfUE9TSVRJT059IGlmIG5vdGhpbmcgaXMgc2VsZWN0ZWQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbigpIHsKKyAgICAgICAgaWYgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX1NJTkdMRSAmJiBtQ2hlY2tTdGF0ZXMgIT0gbnVsbCAmJiBtQ2hlY2tTdGF0ZXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2hlY2tTdGF0ZXMua2V5QXQoMCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gSU5WQUxJRF9QT1NJVElPTjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgY2hlY2tlZCBpdGVtcyBpbiB0aGUgbGlzdC4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmCisgICAgICogdGhlIGNob2ljZSBtb2RlIGhhcyBub3QgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gIEEgU3BhcnNlQm9vbGVhbkFycmF5IHdoaWNoIHdpbGwgcmV0dXJuIHRydWUgZm9yIGVhY2ggY2FsbCB0bworICAgICAqICAgICAgICAgIGdldChpbnQgcG9zaXRpb24pIHdoZXJlIHBvc2l0aW9uIGlzIGEgcG9zaXRpb24gaW4gdGhlIGxpc3QsCisgICAgICogICAgICAgICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGNob2ljZSBtb2RlIGlzIHNldCB0bworICAgICAqICAgICAgICAgIHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0uCisgICAgICovCisgICAgcHVibGljIFNwYXJzZUJvb2xlYW5BcnJheSBnZXRDaGVja2VkSXRlbVBvc2l0aW9ucygpIHsKKyAgICAgICAgaWYgKG1DaG9pY2VNb2RlICE9IENIT0lDRV9NT0RFX05PTkUpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2hlY2tTdGF0ZXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGNoZWNrZWQgaXRlbXMgaWRzLiBUaGUgcmVzdWx0IGlzIG9ubHkgdmFsaWQgaWYgdGhlCisgICAgICogY2hvaWNlIG1vZGUgaGFzIG5vdCBiZWVuIHNldCB0byB7QGxpbmsgI0NIT0lDRV9NT0RFX05PTkV9IGFuZCB0aGUgYWRhcHRlcgorICAgICAqIGhhcyBzdGFibGUgSURzLiAoe0BsaW5rIExpc3RBZGFwdGVyI2hhc1N0YWJsZUlkcygpfSA9PSB7QGNvZGUgdHJ1ZX0pCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgbmV3IGFycmF5IHdoaWNoIGNvbnRhaW5zIHRoZSBpZCBvZiBlYWNoIGNoZWNrZWQgaXRlbSBpbiB0aGUKKyAgICAgKiAgICAgICAgIGxpc3QuCisgICAgICovCisgICAgcHVibGljIGxvbmdbXSBnZXRDaGVja2VkSXRlbUlkcygpIHsKKyAgICAgICAgaWYgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX05PTkUgfHwgbUNoZWNrZWRJZFN0YXRlcyA9PSBudWxsIHx8IG1BZGFwdGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgbG9uZ1swXTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIExvbmdTcGFyc2VBcnJheTxCb29sZWFuPiBpZFN0YXRlcyA9IG1DaGVja2VkSWRTdGF0ZXM7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGlkU3RhdGVzLnNpemUoKTsKKyAgICAgICAgZmluYWwgbG9uZ1tdIGlkcyA9IG5ldyBsb25nW2NvdW50XTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlkc1tpXSA9IGlkU3RhdGVzLmtleUF0KGkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGlkczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciBhbnkgY2hvaWNlcyBwcmV2aW91c2x5IHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyQ2hvaWNlcygpIHsKKyAgICAgICAgaWYgKG1DaGVja1N0YXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNoZWNrZWRJZFN0YXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQgPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNoZWNrZWQgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4gVGhlIGlzIG9ubHkgdmFsaWQgaWYKKyAgICAgKiB0aGUgY2hvaWNlIG1vZGUgaGFzIGJlZW4gc2V0IHRvIHtAbGluayAjQ0hPSUNFX01PREVfU0lOR0xFfSBvcgorICAgICAqIHtAbGluayAjQ0hPSUNFX01PREVfTVVMVElQTEV9LgorICAgICAqCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBpdGVtIHdob3NlIGNoZWNrZWQgc3RhdGUgaXMgdG8gYmUgY2hlY2tlZAorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IGNoZWNrZWQgc3RhdGUgZm9yIHRoZSBpdGVtCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SXRlbUNoZWNrZWQoaW50IHBvc2l0aW9uLCBib29sZWFuIHZhbHVlKSB7CisgICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9OT05FKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFydCBzZWxlY3Rpb24gbW9kZSBpZiBuZWVkZWQuIFdlIGRvbid0IG5lZWQgdG8gaWYgd2UncmUgdW5jaGVja2luZyBzb21ldGhpbmcuCisgICAgICAgIGlmICh2YWx1ZSAmJiBtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCAmJiBtQ2hvaWNlQWN0aW9uTW9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ2hvaWNlQWN0aW9uTW9kZSA9IHN0YXJ0QWN0aW9uTW9kZShtTXVsdGlDaG9pY2VNb2RlQ2FsbGJhY2spOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX01VTFRJUExFIHx8IG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX01VTFRJUExFX01PREFMKSB7CisgICAgICAgICAgICBib29sZWFuIG9sZFZhbHVlID0gbUNoZWNrU3RhdGVzLmdldChwb3NpdGlvbik7CisgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCB2YWx1ZSk7CisgICAgICAgICAgICBpZiAobUNoZWNrZWRJZFN0YXRlcyAhPSBudWxsICYmIG1BZGFwdGVyLmhhc1N0YWJsZUlkcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMucHV0KG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbiksIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5kZWxldGUobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSXRlbUNvdW50Kys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUNob2ljZUFjdGlvbk1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgaWQgPSBtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pOworICAgICAgICAgICAgICAgIG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjay5vbkl0ZW1DaGVja2VkU3RhdGVDaGFuZ2VkKG1DaG9pY2VBY3Rpb25Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24sIGlkLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib29sZWFuIHVwZGF0ZUlkcyA9IG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKTsKKyAgICAgICAgICAgIC8vIENsZWFyIGFsbCB2YWx1ZXMgaWYgd2UncmUgY2hlY2tpbmcgc29tZXRoaW5nLCBvciB1bmNoZWNraW5nIHRoZSBjdXJyZW50bHkKKyAgICAgICAgICAgIC8vIHNlbGVjdGVkIGl0ZW0KKyAgICAgICAgICAgIGlmICh2YWx1ZSB8fCBpc0l0ZW1DaGVja2VkKHBvc2l0aW9uKSkgeworICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOworICAgICAgICAgICAgICAgIGlmICh1cGRhdGVJZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5jbGVhcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHRoaXMgbWF5IGVuZCB1cCBzZWxlY3RpbmcgdGhlIHZhbHVlIHdlIGp1c3QgY2xlYXJlZCBidXQgdGhpcyB3YXkKKyAgICAgICAgICAgIC8vIHdlIGVuc3VyZSBsZW5ndGggb2YgbUNoZWNrU3RhdGVzIGlzIDEsIGEgZmFjdCBnZXRDaGVja2VkSXRlbVBvc2l0aW9uIHJlbGllcyBvbgorICAgICAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzLnB1dChwb3NpdGlvbiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUlkcykgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLnB1dChtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pLCBCb29sZWFuLlRSVUUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudCA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1DaGVja1N0YXRlcy5zaXplKCkgPT0gMCB8fCAhbUNoZWNrU3RhdGVzLnZhbHVlQXQoMCkpIHsKKyAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEbyBub3QgZ2VuZXJhdGUgYSBkYXRhIGNoYW5nZSB3aGlsZSB3ZSBhcmUgaW4gdGhlIGxheW91dCBwaGFzZQorICAgICAgICBpZiAoIW1JbkxheW91dCAmJiAhbUJsb2NrTGF5b3V0UmVxdWVzdHMpIHsKKyAgICAgICAgICAgIG1EYXRhQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICByZW1lbWJlclN5bmNTdGF0ZSgpOworICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUl0ZW1DbGljayhWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKKworICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSkgeworICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9NVUxUSVBMRSB8fAorICAgICAgICAgICAgICAgICAgICAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwgJiYgbUNob2ljZUFjdGlvbk1vZGUgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIG5ld1ZhbHVlID0gIW1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCBuZXdWYWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMucHV0KG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbiksIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmRlbGV0ZShtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobUNob2ljZUFjdGlvbk1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtTXVsdGlDaG9pY2VNb2RlQ2FsbGJhY2sub25JdGVtQ2hlY2tlZFN0YXRlQ2hhbmdlZChtQ2hvaWNlQWN0aW9uTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiwgaWQsIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX1NJTkdMRSkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gbmV3VmFsdWUgPSAhbUNoZWNrU3RhdGVzLmdldChwb3NpdGlvbiwgZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzLnB1dChwb3NpdGlvbiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMucHV0KG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbiksIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUNoZWNrU3RhdGVzLnNpemUoKSA9PSAwIHx8ICFtQ2hlY2tTdGF0ZXMudmFsdWVBdCgwKSkgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRGF0YUNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgcmVtZW1iZXJTeW5jU3RhdGUoKTsKKyAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGhhbmRsZWQgfD0gc3VwZXIucGVyZm9ybUl0ZW1DbGljayh2aWV3LCBwb3NpdGlvbiwgaWQpOworCisgICAgICAgIHJldHVybiBoYW5kbGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBjaG9pY2UgbW9kZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q2hvaWNlTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1DaG9pY2VNb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgdGhlIGNob2ljZSBiZWhhdmlvciBmb3IgdGhlIExpc3QuIEJ5IGRlZmF1bHQsIExpc3RzIGRvIG5vdCBoYXZlIGFueSBjaG9pY2UgYmVoYXZpb3IKKyAgICAgKiAoe0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfSkuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9LCB0aGUKKyAgICAgKiBMaXN0IGFsbG93cyB1cCB0byBvbmUgaXRlbSB0byAgYmUgaW4gYSBjaG9zZW4gc3RhdGUuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8KKyAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFfSwgdGhlIGxpc3QgYWxsb3dzIGFueSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgY2hvc2VuLgorICAgICAqCisgICAgICogQHBhcmFtIGNob2ljZU1vZGUgT25lIG9mIHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0sIHtAbGluayAjQ0hPSUNFX01PREVfU0lOR0xFfSwgb3IKKyAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENob2ljZU1vZGUoaW50IGNob2ljZU1vZGUpIHsKKyAgICAgICAgbUNob2ljZU1vZGUgPSBjaG9pY2VNb2RlOworICAgICAgICBpZiAobUNob2ljZUFjdGlvbk1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNob2ljZUFjdGlvbk1vZGUuZmluaXNoKCk7CisgICAgICAgICAgICBtQ2hvaWNlQWN0aW9uTW9kZSA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DaG9pY2VNb2RlICE9IENIT0lDRV9NT0RFX05PTkUpIHsKKyAgICAgICAgICAgIGlmIChtQ2hlY2tTdGF0ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcyA9IG5ldyBTcGFyc2VCb29sZWFuQXJyYXkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzID09IG51bGwgJiYgbUFkYXB0ZXIgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgeworICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMgPSBuZXcgTG9uZ1NwYXJzZUFycmF5PEJvb2xlYW4+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBNb2RhbCBtdWx0aS1jaG9pY2UgbW9kZSBvbmx5IGhhcyBjaG9pY2VzIHdoZW4gdGhlIG1vZGUgaXMgYWN0aXZlLiBDbGVhciB0aGVtLgorICAgICAgICAgICAgaWYgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX01VTFRJUExFX01PREFMKSB7CisgICAgICAgICAgICAgICAgY2xlYXJDaG9pY2VzKCk7CisgICAgICAgICAgICAgICAgc2V0TG9uZ0NsaWNrYWJsZSh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIHtAbGluayBNdWx0aUNob2ljZU1vZGVMaXN0ZW5lcn0gdGhhdCB3aWxsIG1hbmFnZSB0aGUgbGlmZWN5Y2xlIG9mIHRoZQorICAgICAqIHNlbGVjdGlvbiB7QGxpbmsgQWN0aW9uTW9kZX0uIE9ubHkgdXNlZCB3aGVuIHRoZSBjaG9pY2UgbW9kZSBpcyBzZXQgdG8KKyAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFX01PREFMfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBMaXN0ZW5lciB0aGF0IHdpbGwgbWFuYWdlIHRoZSBzZWxlY3Rpb24gbW9kZQorICAgICAqCisgICAgICogQHNlZSAjc2V0Q2hvaWNlTW9kZShpbnQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIoTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjayA9PSBudWxsKSB7CisgICAgICAgICAgICBtTXVsdGlDaG9pY2VNb2RlQ2FsbGJhY2sgPSBuZXcgTXVsdGlDaG9pY2VNb2RlV3JhcHBlcigpOworICAgICAgICB9CisgICAgICAgIG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjay5zZXRXcmFwcGVkKGxpc3RlbmVyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg5Myw2ICsxMTc3LDggQEAKICAgICAgICAgaW50IHBvc2l0aW9uOwogICAgICAgICBpbnQgaGVpZ2h0OwogICAgICAgICBTdHJpbmcgZmlsdGVyOworICAgICAgICBTcGFyc2VCb29sZWFuQXJyYXkgY2hlY2tTdGF0ZTsKKyAgICAgICAgTG9uZ1NwYXJzZUFycmF5PEJvb2xlYW4+IGNoZWNrSWRTdGF0ZTsKIAogICAgICAgICAvKioKICAgICAgICAgICogQ29uc3RydWN0b3IgY2FsbGVkIGZyb20ge0BsaW5rIEFic0xpc3RWaWV3I29uU2F2ZUluc3RhbmNlU3RhdGUoKX0KQEAgLTkxMiw2ICsxMTk4LDEzIEBACiAgICAgICAgICAgICBwb3NpdGlvbiA9IGluLnJlYWRJbnQoKTsKICAgICAgICAgICAgIGhlaWdodCA9IGluLnJlYWRJbnQoKTsKICAgICAgICAgICAgIGZpbHRlciA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIGNoZWNrU3RhdGUgPSBpbi5yZWFkU3BhcnNlQm9vbGVhbkFycmF5KCk7CisgICAgICAgICAgICBsb25nW10gaWRTdGF0ZSA9IGluLmNyZWF0ZUxvbmdBcnJheSgpOworCisgICAgICAgICAgICBpZiAoaWRTdGF0ZS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgY2hlY2tJZFN0YXRlID0gbmV3IExvbmdTcGFyc2VBcnJheTxCb29sZWFuPigpOworICAgICAgICAgICAgICAgIGNoZWNrSWRTdGF0ZS5zZXRWYWx1ZXMoaWRTdGF0ZSwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtOTIzLDYgKzEyMTYsOCBAQAogICAgICAgICAgICAgb3V0LndyaXRlSW50KHBvc2l0aW9uKTsKICAgICAgICAgICAgIG91dC53cml0ZUludChoZWlnaHQpOwogICAgICAgICAgICAgb3V0LndyaXRlU3RyaW5nKGZpbHRlcik7CisgICAgICAgICAgICBvdXQud3JpdGVTcGFyc2VCb29sZWFuQXJyYXkoY2hlY2tTdGF0ZSk7CisgICAgICAgICAgICBvdXQud3JpdGVMb25nQXJyYXkoY2hlY2tJZFN0YXRlICE9IG51bGwgPyBjaGVja0lkU3RhdGUuZ2V0S2V5cygpIDogbmV3IGxvbmdbMF0pOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC05MzQsNyArMTIyOSw4IEBACiAgICAgICAgICAgICAgICAgICAgICsgIiB2aWV3VG9wPSIgKyB2aWV3VG9wCiAgICAgICAgICAgICAgICAgICAgICsgIiBwb3NpdGlvbj0iICsgcG9zaXRpb24KICAgICAgICAgICAgICAgICAgICAgKyAiIGhlaWdodD0iICsgaGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICsgIiBmaWx0ZXI9IiArIGZpbHRlciArICJ9IjsKKyAgICAgICAgICAgICAgICAgICAgKyAiIGZpbHRlcj0iICsgZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICsgIiBjaGVja1N0YXRlPSIgKyBjaGVja1N0YXRlICsgIn0iOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUgpAQCAtOTk4LDYgKzEyOTQsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgc3MuY2hlY2tTdGF0ZSA9IG1DaGVja1N0YXRlczsKKyAgICAgICAgc3MuY2hlY2tJZFN0YXRlID0gbUNoZWNrZWRJZFN0YXRlczsKKwogICAgICAgICByZXR1cm4gc3M7CiAgICAgfQogCkBAIC0xMDI5LDYgKzEzMjgsMTQgQEAKIAogICAgICAgICBzZXRGaWx0ZXJUZXh0KHNzLmZpbHRlcik7CiAKKyAgICAgICAgaWYgKHNzLmNoZWNrU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNoZWNrU3RhdGVzID0gc3MuY2hlY2tTdGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzcy5jaGVja0lkU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9IHNzLmNoZWNrSWRTdGF0ZTsKKyAgICAgICAgfQorCiAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKICAgICB9CiAKQEAgLTExNzEsMTAgKzE0NzgsNiBAQAogICAgICAgICBpbnQgcmVzdWx0OwogICAgICAgICBpZiAobVNtb290aFNjcm9sbGJhckVuYWJsZWQpIHsKICAgICAgICAgICAgIHJlc3VsdCA9IE1hdGgubWF4KG1JdGVtQ291bnQgKiAxMDAsIDApOwotICAgICAgICAgICAgaWYgKG1TY3JvbGxZICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBDb21wZW5zYXRlIGZvciBvdmVyc2Nyb2xsCi0gICAgICAgICAgICAgICAgcmVzdWx0ICs9IE1hdGguYWJzKChpbnQpICgoZmxvYXQpIG1TY3JvbGxZIC8gZ2V0SGVpZ2h0KCkgKiBtSXRlbUNvdW50ICogMTAwKSk7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXN1bHQgPSBtSXRlbUNvdW50OwogICAgICAgICB9CkBAIC0xMjQ3LDggKzE1NTAsNiBAQAogCiAgICAgICAgIGxheW91dENoaWxkcmVuKCk7CiAgICAgICAgIG1JbkxheW91dCA9IGZhbHNlOwotCi0gICAgICAgIG1PdmVyc2Nyb2xsTWF4ID0gKGIgLSB0KSAvIE9WRVJTQ1JPTExfTElNSVRfRElWSVNPUjsKICAgICB9CiAKICAgICAvKioKQEAgLTE2NzgsNiArMTk3OSwxMSBAQAogICAgICAgICAgICAgICAgIHRyZWVPYnNlcnZlci5hZGRPbkdsb2JhbExheW91dExpc3RlbmVyKHRoaXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCAmJiBtRGF0YVNldE9ic2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1EYXRhU2V0T2JzZXJ2ZXIgPSBuZXcgQWRhcHRlckRhdGFTZXRPYnNlcnZlcigpOworICAgICAgICAgICAgbUFkYXB0ZXIucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE2OTgsNiArMjAwNCwxMSBAQAogICAgICAgICAgICAgICAgIG1HbG9iYWxMYXlvdXRMaXN0ZW5lckFkZGVkRmlsdGVyID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFkYXB0ZXIudW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtRGF0YVNldE9ic2VydmVyKTsKKyAgICAgICAgICAgIG1EYXRhU2V0T2JzZXJ2ZXIgPSBudWxsOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNzE1LDcgKzIwMjYsNiBAQAogICAgICAgICAgICAgICAgIG1GbGluZ1J1bm5hYmxlLmVuZEZsaW5nKCk7CiAgICAgICAgICAgICAgICAgaWYgKG1TY3JvbGxZICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbFkgPSAwOwotICAgICAgICAgICAgICAgICAgICBmaW5pc2hHbG93cygpOwogICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTg0OSwxMCArMjE1OSwyMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIHBlcmZvcm1Mb25nUHJlc3MoZmluYWwgVmlldyBjaGlsZCwKKyAgICBib29sZWFuIHBlcmZvcm1Mb25nUHJlc3MoZmluYWwgVmlldyBjaGlsZCwKICAgICAgICAgICAgIGZpbmFsIGludCBsb25nUHJlc3NQb3NpdGlvbiwgZmluYWwgbG9uZyBsb25nUHJlc3NJZCkgewotICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKKyAgICAgICAgLy8gQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwgdGFrZXMgb3ZlciBsb25nIHByZXNzLgorICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwpIHsKKyAgICAgICAgICAgIGlmIChtQ2hvaWNlQWN0aW9uTW9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNob2ljZUFjdGlvbk1vZGUgPSBzdGFydEFjdGlvbk1vZGUobU11bHRpQ2hvaWNlTW9kZUNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICBzZXRJdGVtQ2hlY2tlZChsb25nUHJlc3NQb3NpdGlvbiwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUT0RPIFNob3VsZCB3ZSBzZWxlY3QgdGhlIGxvbmcgcHJlc3NlZCBpdGVtIGlmIHdlIHdlcmUgYWxyZWFkeSBpbgorICAgICAgICAgICAgLy8gc2VsZWN0aW9uIG1vZGU/IChpLmUuIHRyZWF0IGl0IGxpa2UgYW4gaXRlbSBjbGljaz8pCisgICAgICAgICAgICBwZXJmb3JtSGFwdGljRmVlZGJhY2soSGFwdGljRmVlZGJhY2tDb25zdGFudHMuTE9OR19QUkVTUyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQogCisgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOwogICAgICAgICBpZiAobU9uSXRlbUxvbmdDbGlja0xpc3RlbmVyICE9IG51bGwpIHsKICAgICAgICAgICAgIGhhbmRsZWQgPSBtT25JdGVtTG9uZ0NsaWNrTGlzdGVuZXIub25JdGVtTG9uZ0NsaWNrKEFic0xpc3RWaWV3LnRoaXMsIGNoaWxkLAogICAgICAgICAgICAgICAgICAgICBsb25nUHJlc3NQb3NpdGlvbiwgbG9uZ1ByZXNzSWQpOwpAQCAtMjAyNSwxMCArMjM0Niw5IEBACiAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbW92ZWQgZmFyIGVub3VnaCB0aGF0IGl0IGxvb2tzIG1vcmUgbGlrZSBhCiAgICAgICAgIC8vIHNjcm9sbCB0aGFuIGEgdGFwCiAgICAgICAgIGZpbmFsIGludCBkaXN0YW5jZSA9IE1hdGguYWJzKGRlbHRhWSk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gb3ZlcnNjcm9sbCA9IG1TY3JvbGxZICE9IDA7Ci0gICAgICAgIGlmIChvdmVyc2Nyb2xsIHx8IGRpc3RhbmNlID4gbVRvdWNoU2xvcCkgeworICAgICAgICBpZiAoZGlzdGFuY2UgPiBtVG91Y2hTbG9wKSB7CiAgICAgICAgICAgICBjcmVhdGVTY3JvbGxpbmdDYWNoZSgpOwotICAgICAgICAgICAgbVRvdWNoTW9kZSA9IG92ZXJzY3JvbGwgPyBUT1VDSF9NT0RFX09WRVJTQ1JPTEwgOiBUT1VDSF9NT0RFX1NDUk9MTDsKKyAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1NDUk9MTDsKICAgICAgICAgICAgIG1Nb3Rpb25Db3JyZWN0aW9uID0gZGVsdGFZOwogICAgICAgICAgICAgZmluYWwgSGFuZGxlciBoYW5kbGVyID0gZ2V0SGFuZGxlcigpOwogICAgICAgICAgICAgLy8gSGFuZGxlciBzaG91bGQgbm90IGJlIG51bGwgdW5sZXNzIHRoZSBBYnNMaXN0VmlldyBpcyBub3QgYXR0YWNoZWQgdG8gYQpAQCAtMjA2NCwxOSArMjM4NCw2IEBACiAgICAgICAgICAgICAgICAgLy8gdG91Y2ggbW9kZSkuIEZvcmNlIGFuIGluaXRpYWwgbGF5b3V0IHRvIGdldCByaWQgb2YgdGhlIHNlbGVjdGlvbi4KICAgICAgICAgICAgICAgICBsYXlvdXRDaGlsZHJlbigpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IHRvdWNoTW9kZSA9IG1Ub3VjaE1vZGU7Ci0gICAgICAgICAgICBpZiAodG91Y2hNb2RlID09IFRPVUNIX01PREVfT1ZFUlNDUk9MTCB8fCB0b3VjaE1vZGUgPT0gVE9VQ0hfTU9ERV9PVkVSRkxJTkcpIHsKLSAgICAgICAgICAgICAgICBpZiAobUZsaW5nUnVubmFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtRmxpbmdSdW5uYWJsZS5lbmRGbGluZygpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtU2Nyb2xsWSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TY3JvbGxZID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZmluaXNoR2xvd3MoKTsKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMjEwNyw2MyArMjQxNCw0OSBAQAogCiAgICAgICAgIHN3aXRjaCAoYWN0aW9uICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0spIHsKICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjogewotICAgICAgICAgICAgc3dpdGNoIChtVG91Y2hNb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIFRPVUNIX01PREVfT1ZFUkZMSU5HOiB7Ci0gICAgICAgICAgICAgICAgbUZsaW5nUnVubmFibGUuZW5kRmxpbmcoKTsKLSAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9PVkVSU0NST0xMOwotICAgICAgICAgICAgICAgIG1Nb3Rpb25ZID0gbUxhc3RZID0gKGludCkgZXYuZ2V0WSgpOwotICAgICAgICAgICAgICAgIG1Nb3Rpb25Db3JyZWN0aW9uID0gMDsKLSAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gZXYuZ2V0UG9pbnRlcklkKDApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IGV2LmdldFBvaW50ZXJJZCgwKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB4ID0gKGludCkgZXYuZ2V0WCgpOworICAgICAgICAgICAgZmluYWwgaW50IHkgPSAoaW50KSBldi5nZXRZKCk7CisgICAgICAgICAgICBpbnQgbW90aW9uUG9zaXRpb24gPSBwb2ludFRvUG9zaXRpb24oeCwgeSk7CisgICAgICAgICAgICBpZiAoIW1EYXRhQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgIGlmICgobVRvdWNoTW9kZSAhPSBUT1VDSF9NT0RFX0ZMSU5HKSAmJiAobW90aW9uUG9zaXRpb24gPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChnZXRBZGFwdGVyKCkuaXNFbmFibGVkKG1vdGlvblBvc2l0aW9uKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlciBjbGlja2VkIG9uIGFuIGFjdHVhbCB2aWV3IChhbmQgd2FzIG5vdCBzdG9wcGluZyBhIGZsaW5nKS4gSXQgbWlnaHQgYmUgYQorICAgICAgICAgICAgICAgICAgICAvLyBjbGljayBvciBhIHNjcm9sbC4gQXNzdW1lIGl0IGlzIGEgY2xpY2sgdW50aWwgcHJvdmVuIG90aGVyd2lzZQorICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9ET1dOOworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBEZWJvdW5jZQorICAgICAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdDaGVja0ZvclRhcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0NoZWNrRm9yVGFwID0gbmV3IENoZWNrRm9yVGFwKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcG9zdERlbGF5ZWQobVBlbmRpbmdDaGVja0ZvclRhcCwgVmlld0NvbmZpZ3VyYXRpb24uZ2V0VGFwVGltZW91dCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXYuZ2V0RWRnZUZsYWdzKCkgIT0gMCAmJiBtb3Rpb25Qb3NpdGlvbiA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGNvdWxkbid0IGZpbmQgYSB2aWV3IHRvIGNsaWNrIG9uLCBidXQgdGhlIGRvd24gZXZlbnQgd2FzIHRvdWNoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWRnZSwgd2Ugd2lsbCBiYWlsIG91dCBhbmQgdHJ5IGFnYWluLiBUaGlzIGFsbG93cyB0aGUgZWRnZSBjb3JyZWN0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2RlIGluIFZpZXdSb290IHRvIHRyeSB0byBmaW5kIGEgbmVhcmJ5IHZpZXcgdG8gc2VsZWN0CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQoMCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHggPSAoaW50KSBldi5nZXRYKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHkgPSAoaW50KSBldi5nZXRZKCk7Ci0gICAgICAgICAgICAgICAgaW50IG1vdGlvblBvc2l0aW9uID0gcG9pbnRUb1Bvc2l0aW9uKHgsIHkpOwotICAgICAgICAgICAgICAgIGlmICghbURhdGFDaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgobVRvdWNoTW9kZSAhPSBUT1VDSF9NT0RFX0ZMSU5HKSAmJiAobW90aW9uUG9zaXRpb24gPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoZ2V0QWRhcHRlcigpLmlzRW5hYmxlZChtb3Rpb25Qb3NpdGlvbikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2VyIGNsaWNrZWQgb24gYW4gYWN0dWFsIHZpZXcgKGFuZCB3YXMgbm90IHN0b3BwaW5nIGEgZmxpbmcpLiBJdCBtaWdodCBiZSBhCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGljayBvciBhIHNjcm9sbC4gQXNzdW1lIGl0IGlzIGEgY2xpY2sgdW50aWwgcHJvdmVuIG90aGVyd2lzZQotICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfRE9XTjsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIERlYm91bmNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdDaGVja0ZvclRhcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdDaGVja0ZvclRhcCA9IG5ldyBDaGVja0ZvclRhcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcG9zdERlbGF5ZWQobVBlbmRpbmdDaGVja0ZvclRhcCwgVmlld0NvbmZpZ3VyYXRpb24uZ2V0VGFwVGltZW91dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldi5nZXRFZGdlRmxhZ3MoKSAhPSAwICYmIG1vdGlvblBvc2l0aW9uIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGNvdWxkbid0IGZpbmQgYSB2aWV3IHRvIGNsaWNrIG9uLCBidXQgdGhlIGRvd24gZXZlbnQgd2FzIHRvdWNoaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGVkZ2UsIHdlIHdpbGwgYmFpbCBvdXQgYW5kIHRyeSBhZ2Fpbi4gVGhpcyBhbGxvd3MgdGhlIGVkZ2UgY29ycmVjdGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGUgaW4gVmlld1Jvb3QgdG8gdHJ5IHRvIGZpbmQgYSBuZWFyYnkgdmlldyB0byBzZWxlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX01PREVfRkxJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdG9wcGVkIGEgZmxpbmcuIEl0IGlzIGEgc2Nyb2xsLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNjcm9sbGluZ0NhY2hlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfU0NST0xMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25Db3JyZWN0aW9uID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25Qb3NpdGlvbiA9IGZpbmRNb3Rpb25Sb3coeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0U2Nyb2xsU3RhdGVDaGFuZ2UoT25TY3JvbGxMaXN0ZW5lci5TQ1JPTExfU1RBVEVfVE9VQ0hfU0NST0xMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfTU9ERV9GTElORykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RvcHBlZCBhIGZsaW5nLiBJdCBpcyBhIHNjcm9sbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNjcm9sbGluZ0NhY2hlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9TQ1JPTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uQ29ycmVjdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25Qb3NpdGlvbiA9IGZpbmRNb3Rpb25Sb3coeSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRTY3JvbGxTdGF0ZUNoYW5nZShPblNjcm9sbExpc3RlbmVyLlNDUk9MTF9TVEFURV9UT1VDSF9TQ1JPTEwpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1vdGlvblBvc2l0aW9uID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgd2hlcmUgdGhlIG1vdGlvbiBldmVudCBzdGFydGVkCi0gICAgICAgICAgICAgICAgICAgIHYgPSBnZXRDaGlsZEF0KG1vdGlvblBvc2l0aW9uIC0gbUZpcnN0UG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICBtTW90aW9uVmlld09yaWdpbmFsVG9wID0gdi5nZXRUb3AoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU1vdGlvblggPSB4OwotICAgICAgICAgICAgICAgIG1Nb3Rpb25ZID0geTsKLSAgICAgICAgICAgICAgICBtTW90aW9uUG9zaXRpb24gPSBtb3Rpb25Qb3NpdGlvbjsKLSAgICAgICAgICAgICAgICBtTGFzdFkgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChtb3Rpb25Qb3NpdGlvbiA+PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgd2hlcmUgdGhlIG1vdGlvbiBldmVudCBzdGFydGVkCisgICAgICAgICAgICAgICAgdiA9IGdldENoaWxkQXQobW90aW9uUG9zaXRpb24gLSBtRmlyc3RQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgbU1vdGlvblZpZXdPcmlnaW5hbFRvcCA9IHYuZ2V0VG9wKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtTW90aW9uWCA9IHg7CisgICAgICAgICAgICBtTW90aW9uWSA9IHk7CisgICAgICAgICAgICBtTW90aW9uUG9zaXRpb24gPSBtb3Rpb25Qb3NpdGlvbjsKKyAgICAgICAgICAgIG1MYXN0WSA9IEludGVnZXIuTUlOX1ZBTFVFOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjE5NiwyNSArMjQ4OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RGlzYWxsb3dJbnRlcmNlcHRUb3VjaEV2ZW50KHRydWUpOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJhd0RlbHRhWSA9IGRlbHRhWTsKICAgICAgICAgICAgICAgICAgICAgZGVsdGFZIC09IG1Nb3Rpb25Db3JyZWN0aW9uOwogICAgICAgICAgICAgICAgICAgICBpbnQgaW5jcmVtZW50YWxEZWx0YVkgPSBtTGFzdFkgIT0gSW50ZWdlci5NSU5fVkFMVUUgPyB5IC0gbUxhc3RZIDogZGVsdGFZOwogICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1vdGlvbkluZGV4OwotICAgICAgICAgICAgICAgICAgICBpZiAobU1vdGlvblBvc2l0aW9uID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbkluZGV4ID0gbU1vdGlvblBvc2l0aW9uIC0gbUZpcnN0UG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgbW90aW9uIHBvc2l0aW9uIHRoYXQgd2UgY2FuIHJlbGlhYmx5IHRyYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGljayBzb21ldGhpbmcgaW4gdGhlIG1pZGRsZSB0byBtYWtlIGEgYmVzdCBndWVzcyBhdCB0aGluZ3MgYmVsb3cuCi0gICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25JbmRleCA9IGdldENoaWxkQ291bnQoKSAvIDI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpbnQgbW90aW9uVmlld1ByZXZUb3AgPSAwOwotICAgICAgICAgICAgICAgICAgICBWaWV3IG1vdGlvblZpZXcgPSB0aGlzLmdldENoaWxkQXQobW90aW9uSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobW90aW9uVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25WaWV3UHJldlRvcCA9IG1vdGlvblZpZXcuZ2V0VG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGRvIGFsbCB0aGlzIHdvcmsgaWYgd2UncmUgbm90IGdvaW5nIHRvIG1vdmUgYW55d2F5CiAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXRFZGdlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpbmNyZW1lbnRhbERlbHRhWSAhPSAwKSB7CkBAIC0yMjIyLDEwNSArMjQ5OSwyMyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYnVtcGVkIGludG8gdGhlIHNjcm9sbCBsaW1pdAotICAgICAgICAgICAgICAgICAgICBtb3Rpb25WaWV3ID0gdGhpcy5nZXRDaGlsZEF0KG1vdGlvbkluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vdGlvblZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRvcCBvZiB0aGUgbW90aW9uIHZpZXcgaXMgd2hlcmUgaXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBvc2VkIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbW90aW9uVmlld1JlYWxUb3AgPSBtb3Rpb25WaWV3LmdldFRvcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0RWRnZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGx5IG92ZXJzY3JvbGwKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdmVyc2Nyb2xsID0gLWluY3JlbWVudGFsRGVsdGFZIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3Rpb25WaWV3UmVhbFRvcCAtIG1vdGlvblZpZXdQcmV2VG9wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyc2Nyb2xsQnkoMCwgb3ZlcnNjcm9sbCwgMCwgbVNjcm9sbFksIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBtT3ZlcnNjcm9sbERpc3RhbmNlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMobU92ZXJzY3JvbGxEaXN0YW5jZSkgPT0gTWF0aC5hYnMobVNjcm9sbFkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGFsbG93IG92ZXJmbGluZyBpZiB3ZSdyZSBhdCB0aGUgZWRnZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsTW9kZSA9IGdldE92ZXJzY3JvbGxNb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJTQ1JPTExfQUxXQVlTIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNvbnRlbnRGaXRzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EaXJlY3Rpb24gPSAwOyAvLyBSZXNldCB3aGVuIGVudGVyaW5nIG92ZXJzY3JvbGwuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX09WRVJTQ1JPTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdEZWx0YVkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25QdWxsKChmbG9hdCkgb3ZlcnNjcm9sbCAvIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyYXdEZWx0YVkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25QdWxsKChmbG9hdCkgb3ZlcnNjcm9sbCAvIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGF0RWRnZSAmJiBnZXRDaGlsZENvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmVhdCB0aGlzIGxpa2Ugd2UncmUgc3RhcnRpbmcgYSBuZXcgc2Nyb2xsIGZyb20gdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uLiBUaGlzIHdpbGwgbGV0IHRoZSB1c2VyIHN0YXJ0IHNjcm9sbGluZyBiYWNrIGludG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRlbnQgaW1tZWRpYXRlbHkgcmF0aGVyIHRoYW4gbmVlZGluZyB0byBzY3JvbGwgYmFjayB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IHdoZXJlIHRoZXkgaGl0IHRoZSBsaW1pdCBmaXJzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb3Rpb25Qb3NpdGlvbiA9IGZpbmRNb3Rpb25Sb3coeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW90aW9uUG9zaXRpb24gPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgbW90aW9uVmlldyA9IGdldENoaWxkQXQobW90aW9uUG9zaXRpb24gLSBtRmlyc3RQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1vdGlvblZpZXdPcmlnaW5hbFRvcCA9IG1vdGlvblZpZXcuZ2V0VG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uWSA9IHk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uUG9zaXRpb24gPSBtb3Rpb25Qb3NpdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtTGFzdFkgPSB5OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBUT1VDSF9NT0RFX09WRVJTQ1JPTEw6Ci0gICAgICAgICAgICAgICAgaWYgKHkgIT0gbUxhc3RZKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCByYXdEZWx0YVkgPSBkZWx0YVk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhWSAtPSBtTW90aW9uQ29ycmVjdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgaW50IGluY3JlbWVudGFsRGVsdGFZID0gbUxhc3RZICE9IEludGVnZXIuTUlOX1ZBTFVFID8geSAtIG1MYXN0WSA6IGRlbHRhWTsKLQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb2xkU2Nyb2xsID0gbVNjcm9sbFk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBuZXdTY3JvbGwgPSBvbGRTY3JvbGwgLSBpbmNyZW1lbnRhbERlbHRhWTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG5ld0RpcmVjdGlvbiA9IHkgPiBtTGFzdFkgPyAxIDogLTE7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1EaXJlY3Rpb24gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbURpcmVjdGlvbiA9IG5ld0RpcmVjdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtRGlyZWN0aW9uICE9IG5ld0RpcmVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29taW5nIGJhY2sgdG8gJ3JlYWwnIGxpc3Qgc2Nyb2xsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRhbERlbHRhWSA9IC1uZXdTY3JvbGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsWSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gZG8gYWxsIHRoaXMgd29yayBpZiB3ZSdyZSBub3QgZ29pbmcgdG8gbW92ZSBhbnl3YXkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmNyZW1lbnRhbERlbHRhWSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tNb3Rpb25TY3JvbGwoaW5jcmVtZW50YWxEZWx0YVksIGluY3JlbWVudGFsRGVsdGFZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBiYWNrIGluCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWV3IG1vdGlvblZpZXcgPSB0aGlzLmdldENoaWxkQXQobU1vdGlvblBvc2l0aW9uIC0gbUZpcnN0UG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vdGlvblZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1NDUk9MTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRpZCBub3Qgc2Nyb2xsIHRoZSBmdWxsIGFtb3VudC4gVHJlYXQgdGhpcyBlc3NlbnRpYWxseSBsaWtlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG9mIGEgbmV3IHRvdWNoIHNjcm9sbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBtb3Rpb25Qb3NpdGlvbiA9IGZpbmRDbG9zZXN0TW90aW9uUm93KHkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1vdGlvbkNvcnJlY3Rpb24gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvblZpZXcgPSBnZXRDaGlsZEF0KG1vdGlvblBvc2l0aW9uIC0gbUZpcnN0UG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25WaWV3T3JpZ2luYWxUb3AgPSBtb3Rpb25WaWV3LmdldFRvcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25ZID0geTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uUG9zaXRpb24gPSBtb3Rpb25Qb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJzY3JvbGxCeSgwLCAtaW5jcmVtZW50YWxEZWx0YVksIDAsIG1TY3JvbGxZLCAwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBtT3ZlcnNjcm9sbERpc3RhbmNlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsTW9kZSA9IGdldE92ZXJzY3JvbGxNb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9BTFdBWVMgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJTQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNvbnRlbnRGaXRzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd0RlbHRhWSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uUHVsbCgoZmxvYXQpIC1pbmNyZW1lbnRhbERlbHRhWSAvIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJhd0RlbHRhWSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uUHVsbCgoZmxvYXQpIC1pbmNyZW1lbnRhbERlbHRhWSAvIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKG1PdmVyc2Nyb2xsRGlzdGFuY2UpID09IE1hdGguYWJzKG1TY3JvbGxZKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGFsbG93IG92ZXJmbGluZyBpZiB3ZSdyZSBhdCB0aGUgZWRnZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUxhc3RZID0geTsKLSAgICAgICAgICAgICAgICAgICAgbURpcmVjdGlvbiA9IG5ld0RpcmVjdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjM5MiwyOSArMjU4NywxOCBAQAogICAgICAgICAgICAgY2FzZSBUT1VDSF9NT0RFX1NDUk9MTDoKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRDb3VudCA9IGdldENoaWxkQ291bnQoKTsKICAgICAgICAgICAgICAgICBpZiAoY2hpbGRDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGZpcnN0Q2hpbGRUb3AgPSBnZXRDaGlsZEF0KDApLmdldFRvcCgpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGFzdENoaWxkQm90dG9tID0gZ2V0Q2hpbGRBdChjaGlsZENvdW50IC0gMSkuZ2V0Qm90dG9tKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb250ZW50VG9wID0gbUxpc3RQYWRkaW5nLnRvcDsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvbnRlbnRCb3R0b20gPSBnZXRIZWlnaHQoKSAtIG1MaXN0UGFkZGluZy5ib3R0b207Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRmlyc3RQb3NpdGlvbiA9PSAwICYmIGZpcnN0Q2hpbGRUb3AgPj0gY29udGVudFRvcCAmJgorICAgICAgICAgICAgICAgICAgICBpZiAobUZpcnN0UG9zaXRpb24gPT0gMCAmJiBnZXRDaGlsZEF0KDApLmdldFRvcCgpID49IG1MaXN0UGFkZGluZy50b3AgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RQb3NpdGlvbiArIGNoaWxkQ291bnQgPCBtSXRlbUNvdW50ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdENoaWxkQm90dG9tIDw9IGdldEhlaWdodCgpIC0gY29udGVudEJvdHRvbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENoaWxkQXQoY2hpbGRDb3VudCAtIDEpLmdldEJvdHRvbSgpIDw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRIZWlnaHQoKSAtIG1MaXN0UGFkZGluZy5ib3R0b20pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1JFU1Q7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRTY3JvbGxTdGF0ZUNoYW5nZShPblNjcm9sbExpc3RlbmVyLlNDUk9MTF9TVEFURV9JRExFKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZlbG9jaXR5VHJhY2tlciB2ZWxvY2l0eVRyYWNrZXIgPSBtVmVsb2NpdHlUcmFja2VyOwogICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlUcmFja2VyLmNvbXB1dGVDdXJyZW50VmVsb2NpdHkoMTAwMCwgbU1heGltdW1WZWxvY2l0eSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5pdGlhbFZlbG9jaXR5ID0gKGludCkgdmVsb2NpdHlUcmFja2VyLmdldFlWZWxvY2l0eShtQWN0aXZlUG9pbnRlcklkKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmxpbmcgaWYgd2UgaGF2ZSBlbm91Z2ggdmVsb2NpdHkgYW5kIHdlIGFyZW4ndCBhdCBhIGJvdW5kYXJ5LgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UgY2FuIHBvdGVudGlhbGx5IG92ZXJmbGluZyBtb3JlIHRoYW4gd2UgY2FuIG92ZXJzY3JvbGwsIGRvbid0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyB0aGUgd2VpcmQgYmVoYXZpb3Igd2hlcmUgeW91IGNhbiBzY3JvbGwgdG8gYSBib3VuZGFyeSB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmbGluZyBmdXJ0aGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGluaXRpYWxWZWxvY2l0eSkgPiBtTWluaW11bVZlbG9jaXR5ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoKG1GaXJzdFBvc2l0aW9uID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENoaWxkVG9wID09IGNvbnRlbnRUb3AgLSBtT3ZlcnNjcm9sbERpc3RhbmNlKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtRmlyc3RQb3NpdGlvbiArIGNoaWxkQ291bnQgPT0gbUl0ZW1Db3VudCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDaGlsZEJvdHRvbSA9PSBjb250ZW50Qm90dG9tICsgbU92ZXJzY3JvbGxEaXN0YW5jZSkpKSB7CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoaW5pdGlhbFZlbG9jaXR5KSA+IG1NaW5pbXVtVmVsb2NpdHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZsaW5nUnVubmFibGUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmxpbmdSdW5uYWJsZSA9IG5ldyBGbGluZ1J1bm5hYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMjQzMSwzMiArMjYxNSwxMCBAQAogICAgICAgICAgICAgICAgICAgICByZXBvcnRTY3JvbGxTdGF0ZUNoYW5nZShPblNjcm9sbExpc3RlbmVyLlNDUk9MTF9TVEFURV9JRExFKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgVE9VQ0hfTU9ERV9PVkVSU0NST0xMOgotICAgICAgICAgICAgICAgIGlmIChtRmxpbmdSdW5uYWJsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GbGluZ1J1bm5hYmxlID0gbmV3IEZsaW5nUnVubmFibGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgVmVsb2NpdHlUcmFja2VyIHZlbG9jaXR5VHJhY2tlciA9IG1WZWxvY2l0eVRyYWNrZXI7Ci0gICAgICAgICAgICAgICAgdmVsb2NpdHlUcmFja2VyLmNvbXB1dGVDdXJyZW50VmVsb2NpdHkoMTAwMCwgbU1heGltdW1WZWxvY2l0eSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGluaXRpYWxWZWxvY2l0eSA9IChpbnQpIHZlbG9jaXR5VHJhY2tlci5nZXRZVmVsb2NpdHkobUFjdGl2ZVBvaW50ZXJJZCk7Ci0KLSAgICAgICAgICAgICAgICByZXBvcnRTY3JvbGxTdGF0ZUNoYW5nZShPblNjcm9sbExpc3RlbmVyLlNDUk9MTF9TVEFURV9GTElORyk7Ci0gICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGluaXRpYWxWZWxvY2l0eSkgPiBtTWluaW11bVZlbG9jaXR5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GbGluZ1J1bm5hYmxlLnN0YXJ0T3ZlcmZsaW5nKC1pbml0aWFsVmVsb2NpdHkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GbGluZ1J1bm5hYmxlLnN0YXJ0U3ByaW5nYmFjaygpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzZXRQcmVzc2VkKGZhbHNlKTsKIAotICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgLy8gTmVlZCB0byByZWRyYXcgc2luY2Ugd2UgcHJvYmFibHkgYXJlbid0IGRyYXdpbmcgdGhlIHNlbGVjdG9yIGFueW1vcmUKICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKIApAQCAtMjQ4Miw0MiArMjY0NCwyNCBAQAogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOiB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1Ub3VjaE1vZGUpIHsKLSAgICAgICAgICAgIGNhc2UgVE9VQ0hfTU9ERV9PVkVSU0NST0xMOgotICAgICAgICAgICAgICAgIGlmIChtRmxpbmdSdW5uYWJsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GbGluZ1J1bm5hYmxlID0gbmV3IEZsaW5nUnVubmFibGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUZsaW5nUnVubmFibGUuc3RhcnRTcHJpbmdiYWNrKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9SRVNUOworICAgICAgICAgICAgc2V0UHJlc3NlZChmYWxzZSk7CisgICAgICAgICAgICBWaWV3IG1vdGlvblZpZXcgPSB0aGlzLmdldENoaWxkQXQobU1vdGlvblBvc2l0aW9uIC0gbUZpcnN0UG9zaXRpb24pOworICAgICAgICAgICAgaWYgKG1vdGlvblZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1vdGlvblZpZXcuc2V0UHJlc3NlZChmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGVhclNjcm9sbGluZ0NhY2hlKCk7CiAKLSAgICAgICAgICAgIGNhc2UgVE9VQ0hfTU9ERV9PVkVSRkxJTkc6Ci0gICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZyAtIGxldCBpdCBwbGF5IG91dC4KLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGZpbmFsIEhhbmRsZXIgaGFuZGxlciA9IGdldEhhbmRsZXIoKTsKKyAgICAgICAgICAgIGlmIChoYW5kbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUGVuZGluZ0NoZWNrRm9yTG9uZ1ByZXNzKTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9SRVNUOwotICAgICAgICAgICAgICAgIHNldFByZXNzZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIFZpZXcgbW90aW9uVmlldyA9IHRoaXMuZ2V0Q2hpbGRBdChtTW90aW9uUG9zaXRpb24gLSBtRmlyc3RQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKG1vdGlvblZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtb3Rpb25WaWV3LnNldFByZXNzZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjbGVhclNjcm9sbGluZ0NhY2hlKCk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBIYW5kbGVyIGhhbmRsZXIgPSBnZXRIYW5kbGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUGVuZGluZ0NoZWNrRm9yTG9uZ1ByZXNzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobVZlbG9jaXR5VHJhY2tlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOwotICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVZlbG9jaXR5VHJhY2tlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtRWRnZUdsb3dUb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTI1NDIsNjEgKzI2ODYsMTAgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbk92ZXJzY3JvbGxlZChpbnQgc2Nyb2xsWCwgaW50IHNjcm9sbFksCi0gICAgICAgICAgICBib29sZWFuIGNsYW1wZWRYLCBib29sZWFuIGNsYW1wZWRZKSB7Ci0gICAgICAgIG1TY3JvbGxZID0gc2Nyb2xsWTsKLQotICAgICAgICBpZiAoY2xhbXBlZFkpIHsKLSAgICAgICAgICAgIC8vIFZlbG9jaXR5IGlzIGJyb2tlbiBieSBoaXR0aW5nIHRoZSBsaW1pdDsgZG9uJ3Qgc3RhcnQgYSBmbGluZyBvZmYgb2YgdGhpcy4KLSAgICAgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXdha2VuU2Nyb2xsQmFycygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgewogICAgICAgICBzdXBlci5kcmF3KGNhbnZhcyk7Ci0gICAgICAgIGlmIChtRWRnZUdsb3dUb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgaW50IHNjcm9sbFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgIGlmICghbUVkZ2VHbG93VG9wLmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXN0b3JlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGdldFdpZHRoKCk7Ci0KLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC13aWR0aCAvIDIsIE1hdGgubWluKDAsIHNjcm9sbFkgKyBtRmlyc3RQb3NpdGlvbkRpc3RhbmNlR3Vlc3MpKTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Auc2V0U2l6ZSh3aWR0aCAqIDIsIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICBpZiAobUVkZ2VHbG93VG9wLmRyYXcoY2FudmFzKSkgewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChyZXN0b3JlQ291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dCb3R0b20uaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVDb3VudCA9IGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC13aWR0aCAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChoZWlnaHQsIHNjcm9sbFkgKyBtTGFzdFBvc2l0aW9uRGlzdGFuY2VHdWVzcykpOwotICAgICAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUoMTgwLCB3aWR0aCwgMCk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLnNldFNpemUod2lkdGggKiAyLCBoZWlnaHQpOwotICAgICAgICAgICAgICAgIGlmIChtRWRnZUdsb3dCb3R0b20uZHJhdyhjYW52YXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICAgICAgaWYgKG1GYXN0U2Nyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgaW50IHNjcm9sbFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgIGlmIChzY3JvbGxZICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBQaW4gdG8gdGhlIHRvcC9ib3R0b20gZHVyaW5nIG92ZXJzY3JvbGwKLSAgICAgICAgICAgICAgICBpbnQgcmVzdG9yZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAsIChmbG9hdCkgc2Nyb2xsWSk7Ci0gICAgICAgICAgICAgICAgbUZhc3RTY3JvbGxlci5kcmF3KGNhbnZhcyk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1GYXN0U2Nyb2xsZXIuZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbUZhc3RTY3JvbGxlci5kcmF3KGNhbnZhcyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI2MTUsMTAgKzI3MDgsNiBAQAogICAgICAgICBzd2l0Y2ggKGFjdGlvbiAmIE1vdGlvbkV2ZW50LkFDVElPTl9NQVNLKSB7CiAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046IHsKICAgICAgICAgICAgIGludCB0b3VjaE1vZGUgPSBtVG91Y2hNb2RlOwotICAgICAgICAgICAgaWYgKHRvdWNoTW9kZSA9PSBUT1VDSF9NT0RFX09WRVJGTElORyB8fCB0b3VjaE1vZGUgPT0gVE9VQ0hfTU9ERV9PVkVSU0NST0xMKSB7Ci0gICAgICAgICAgICAgICAgbU1vdGlvbkNvcnJlY3Rpb24gPSAwOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICBmaW5hbCBpbnQgeCA9IChpbnQpIGV2LmdldFgoKTsKICAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludCkgZXYuZ2V0WSgpOwpAQCAtMjY4Myw3ICsyNzcyLDYgQEAKICAgICAgICAgICAgIGZpbmFsIGludCBuZXdQb2ludGVySW5kZXggPSBwb2ludGVySW5kZXggPT0gMCA/IDEgOiAwOwogICAgICAgICAgICAgbU1vdGlvblggPSAoaW50KSBldi5nZXRYKG5ld1BvaW50ZXJJbmRleCk7CiAgICAgICAgICAgICBtTW90aW9uWSA9IChpbnQpIGV2LmdldFkobmV3UG9pbnRlckluZGV4KTsKLSAgICAgICAgICAgIG1Nb3Rpb25Db3JyZWN0aW9uID0gMDsKICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQobmV3UG9pbnRlckluZGV4KTsKICAgICAgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNsZWFyKCk7CkBAIC0yNzM5LDcgKzI4MjcsNyBAQAogICAgICAgICAvKioKICAgICAgICAgICogVHJhY2tzIHRoZSBkZWNheSBvZiBhIGZsaW5nIHNjcm9sbAogICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPdmVyU2Nyb2xsZXIgbVNjcm9sbGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIFNjcm9sbGVyIG1TY3JvbGxlcjsKIAogICAgICAgICAvKioKICAgICAgICAgICogWSB2YWx1ZSByZXBvcnRlZCBieSBtU2Nyb2xsZXIgb24gdGhlIHByZXZpb3VzIGZsaW5nCkBAIC0yNzQ3LDcgKzI4MzUsNyBAQAogICAgICAgICBwcml2YXRlIGludCBtTGFzdEZsaW5nWTsKIAogICAgICAgICBGbGluZ1J1bm5hYmxlKCkgewotICAgICAgICAgICAgbVNjcm9sbGVyID0gbmV3IE92ZXJTY3JvbGxlcihnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgbVNjcm9sbGVyID0gbmV3IFNjcm9sbGVyKGdldENvbnRleHQoKSk7CiAgICAgICAgIH0KIAogICAgICAgICB2b2lkIHN0YXJ0KGludCBpbml0aWFsVmVsb2NpdHkpIHsKQEAgLTI3NjYsNDIgKzI4NTQsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgdm9pZCBzdGFydFNwcmluZ2JhY2soKSB7Ci0gICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ2JhY2soMCwgbVNjcm9sbFksIDAsIDAsIDAsIDApKSB7Ci0gICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfT1ZFUkZMSU5HOwotICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICBwb3N0KHRoaXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9SRVNUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzdGFydE92ZXJmbGluZyhpbnQgaW5pdGlhbFZlbG9jaXR5KSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbWluID0gbVNjcm9sbFkgPiAwID8gSW50ZWdlci5NSU5fVkFMVUUgOiAwOwotICAgICAgICAgICAgZmluYWwgaW50IG1heCA9IG1TY3JvbGxZID4gMCA/IDAgOiBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgICAgIG1TY3JvbGxlci5mbGluZygwLCBtU2Nyb2xsWSwgMCwgaW5pdGlhbFZlbG9jaXR5LCAwLCAwLCBtaW4sIG1heCwgMCwgZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfT1ZFUkZMSU5HOwotICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgcG9zdCh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZWRnZVJlYWNoZWQoaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICBtU2Nyb2xsZXIubm90aWZ5VmVydGljYWxFZGdlUmVhY2hlZChtU2Nyb2xsWSwgMCwgbU92ZXJmbGluZ0Rpc3RhbmNlKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsTW9kZSA9IGdldE92ZXJzY3JvbGxNb2RlKCk7Ci0gICAgICAgICAgICBpZiAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9BTFdBWVMgfHwKLSAgICAgICAgICAgICAgICAgICAgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJTQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTICYmICFjb250ZW50Rml0cygpKSkgewotICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX09WRVJGTElORzsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdmVsID0gKGludCkgbVNjcm9sbGVyLmdldEN1cnJWZWxvY2l0eSgpOwotICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uQWJzb3JiKHZlbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uQWJzb3JiKHZlbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgcG9zdCh0aGlzKTsKLSAgICAgICAgfQotCiAgICAgICAgIHZvaWQgc3RhcnRTY3JvbGwoaW50IGRpc3RhbmNlLCBpbnQgZHVyYXRpb24pIHsKICAgICAgICAgICAgIGludCBpbml0aWFsWSA9IGRpc3RhbmNlIDwgMCA/IEludGVnZXIuTUFYX1ZBTFVFIDogMDsKICAgICAgICAgICAgIG1MYXN0RmxpbmdZID0gaW5pdGlhbFk7CkBAIC0yODM0LDcgKzI4ODYsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgZmluYWwgT3ZlclNjcm9sbGVyIHNjcm9sbGVyID0gbVNjcm9sbGVyOworICAgICAgICAgICAgICAgIGZpbmFsIFNjcm9sbGVyIHNjcm9sbGVyID0gbVNjcm9sbGVyOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gbW9yZSA9IHNjcm9sbGVyLmNvbXB1dGVTY3JvbGxPZmZzZXQoKTsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgeSA9IHNjcm9sbGVyLmdldEN1cnJZKCk7CiAKQEAgLTI4NjMsMjQgKzI5MTUsNyBAQAogICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IE1hdGgubWF4KC0oZ2V0SGVpZ2h0KCkgLSBtUGFkZGluZ0JvdHRvbSAtIG1QYWRkaW5nVG9wIC0gMSksIGRlbHRhKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBidW1wZWQgaW50byB0aGUgc2Nyb2xsIGxpbWl0Ci0gICAgICAgICAgICAgICAgVmlldyBtb3Rpb25WaWV3ID0gZ2V0Q2hpbGRBdChtTW90aW9uUG9zaXRpb24gLSBtRmlyc3RQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgaW50IG9sZFRvcCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKG1vdGlvblZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBvbGRUb3AgPSBtb3Rpb25WaWV3LmdldFRvcCgpOwotICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYXRFbmQgPSB0cmFja01vdGlvblNjcm9sbChkZWx0YSwgZGVsdGEpOwotICAgICAgICAgICAgICAgIGlmIChhdEVuZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobW90aW9uVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUd2VhayB0aGUgc2Nyb2xsIGZvciBob3cgZmFyIHdlIG92ZXJzaG90Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3ZlcnNob290ID0gLShkZWx0YSAtIChtb3Rpb25WaWV3LmdldFRvcCgpIC0gb2xkVG9wKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdmVyc2Nyb2xsQnkoMCwgb3ZlcnNob290LCAwLCBtU2Nyb2xsWSwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbU92ZXJmbGluZ0Rpc3RhbmNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWRnZVJlYWNoZWQoZGVsdGEpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAobW9yZSAmJiAhYXRFbmQpIHsKICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwpAQCAtMjg5OCwyNCArMjkzMyw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFRPVUNIX01PREVfT1ZFUkZMSU5HOiB7Ci0gICAgICAgICAgICAgICAgZmluYWwgT3ZlclNjcm9sbGVyIHNjcm9sbGVyID0gbVNjcm9sbGVyOwotICAgICAgICAgICAgICAgIGlmIChzY3JvbGxlci5jb21wdXRlU2Nyb2xsT2Zmc2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNjcm9sbFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGRlbHRhWSA9IHNjcm9sbGVyLmdldEN1cnJZKCkgLSBzY3JvbGxZOwotICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcnNjcm9sbEJ5KDAsIGRlbHRhWSwgMCwgc2Nyb2xsWSwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBtT3ZlcmZsaW5nRGlzdGFuY2UsIGZhbHNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTcHJpbmdiYWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3N0KHRoaXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kRmxpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgfQpAQCAtMjkyOSw2ICsyOTQ2LDcgQEAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PVkVfVVBfUE9TID0gMjsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PVkVfRE9XTl9CT1VORCA9IDM7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT1ZFX1VQX0JPVU5EID0gNDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PVkVfT0ZGU0VUID0gNTsKICAgICAgICAgCiAgICAgICAgIHByaXZhdGUgaW50IG1Nb2RlOwogICAgICAgICBwcml2YXRlIGludCBtVGFyZ2V0UG9zOwpAQCAtMjkzNiw2ICsyOTU0LDggQEAKICAgICAgICAgcHJpdmF0ZSBpbnQgbUxhc3RTZWVuUG9zOwogICAgICAgICBwcml2YXRlIGludCBtU2Nyb2xsRHVyYXRpb247CiAgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1FeHRyYVNjcm9sbDsKKworICAgICAgICBwcml2YXRlIGludCBtT2Zmc2V0RnJvbVRvcDsKICAgICAgICAgCiAgICAgICAgIFBvc2l0aW9uU2Nyb2xsZXIoKSB7CiAgICAgICAgICAgICBtRXh0cmFTY3JvbGwgPSBWaWV3Q29uZmlndXJhdGlvbi5nZXQobUNvbnRleHQpLmdldFNjYWxlZEZhZGluZ0VkZ2VMZW5ndGgoKTsKQEAgLTMwMjcsMTIgKzMwNDcsNDggQEAKICAgICAgICAgICAgIAogICAgICAgICAgICAgcG9zdCh0aGlzKTsKICAgICAgICAgfQotICAgICAgICAKKworICAgICAgICB2b2lkIHN0YXJ0V2l0aE9mZnNldChpbnQgcG9zaXRpb24sIGludCBvZmZzZXQpIHsKKyAgICAgICAgICAgIG1UYXJnZXRQb3MgPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIG1PZmZzZXRGcm9tVG9wID0gb2Zmc2V0OworICAgICAgICAgICAgbUJvdW5kUG9zID0gSU5WQUxJRF9QT1NJVElPTjsKKyAgICAgICAgICAgIG1MYXN0U2VlblBvcyA9IElOVkFMSURfUE9TSVRJT047CisgICAgICAgICAgICBtTW9kZSA9IE1PVkVfT0ZGU0VUOworCisgICAgICAgICAgICBmaW5hbCBpbnQgZmlyc3RQb3MgPSBtRmlyc3RQb3NpdGlvbjsKKyAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZENvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICAgICAgZmluYWwgaW50IGxhc3RQb3MgPSBmaXJzdFBvcyArIGNoaWxkQ291bnQgLSAxOworCisgICAgICAgICAgICBpbnQgdmlld1RyYXZlbENvdW50ID0gMDsKKyAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IGZpcnN0UG9zKSB7CisgICAgICAgICAgICAgICAgdmlld1RyYXZlbENvdW50ID0gZmlyc3RQb3MgLSBwb3NpdGlvbjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPiBsYXN0UG9zKSB7CisgICAgICAgICAgICAgICAgdmlld1RyYXZlbENvdW50ID0gcG9zaXRpb24gLSBsYXN0UG9zOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBPbi1zY3JlZW4sIGp1c3Qgc2Nyb2xsLgorICAgICAgICAgICAgICAgIGZpbmFsIGludCB0YXJnZXRUb3AgPSBnZXRDaGlsZEF0KHBvc2l0aW9uIC0gZmlyc3RQb3MpLmdldFRvcCgpOworICAgICAgICAgICAgICAgIHNtb290aFNjcm9sbEJ5KHRhcmdldFRvcCAtIG9mZnNldCwgU0NST0xMX0RVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEVzdGltYXRlIGhvdyBtYW55IHNjcmVlbnMgd2Ugc2hvdWxkIHRyYXZlbAorICAgICAgICAgICAgZmluYWwgZmxvYXQgc2NyZWVuVHJhdmVsQ291bnQgPSAoZmxvYXQpIHZpZXdUcmF2ZWxDb3VudCAvIGNoaWxkQ291bnQ7CisgICAgICAgICAgICBtU2Nyb2xsRHVyYXRpb24gPSBzY3JlZW5UcmF2ZWxDb3VudCA8IDEgPyAoaW50KSAoc2NyZWVuVHJhdmVsQ291bnQgKiBTQ1JPTExfRFVSQVRJT04pIDoKKyAgICAgICAgICAgICAgICAgICAgKGludCkgKFNDUk9MTF9EVVJBVElPTiAvIHNjcmVlblRyYXZlbENvdW50KTsKKyAgICAgICAgICAgIG1MYXN0U2VlblBvcyA9IElOVkFMSURfUE9TSVRJT047CisKKyAgICAgICAgICAgIHBvc3QodGhpcyk7CisgICAgICAgIH0KKwogICAgICAgICB2b2lkIHN0b3AoKSB7CiAgICAgICAgICAgICByZW1vdmVDYWxsYmFja3ModGhpcyk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgIT0gVE9VQ0hfTU9ERV9GTElORyAmJiBtTGFzdFNlZW5Qb3MgIT0gSU5WQUxJRF9QT1NJVElPTikgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgZmluYWwgaW50IGxpc3RIZWlnaHQgPSBnZXRIZWlnaHQoKTsKICAgICAgICAgICAgIGZpbmFsIGludCBmaXJzdFBvcyA9IG1GaXJzdFBvc2l0aW9uOwogICAgICAgICAgICAgCkBAIC0zMTU3LDYgKzMyMTMsMzUgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSBNT1ZFX09GRlNFVDogeworICAgICAgICAgICAgICAgIGlmIChtTGFzdFNlZW5Qb3MgPT0gZmlyc3RQb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm8gbmV3IHZpZXdzLCBsZXQgdGhpbmdzIGtlZXAgZ29pbmcuCisgICAgICAgICAgICAgICAgICAgIHBvc3QodGhpcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtTGFzdFNlZW5Qb3MgPSBmaXJzdFBvczsKKworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZENvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBwb3NpdGlvbiA9IG1UYXJnZXRQb3M7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGxhc3RQb3MgPSBmaXJzdFBvcyArIGNoaWxkQ291bnQgLSAxOworCisgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgZmlyc3RQb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgc21vb3RoU2Nyb2xsQnkoLWdldEhlaWdodCgpLCBtU2Nyb2xsRHVyYXRpb24pOworICAgICAgICAgICAgICAgICAgICBwb3N0KHRoaXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPiBsYXN0UG9zKSB7CisgICAgICAgICAgICAgICAgICAgIHNtb290aFNjcm9sbEJ5KGdldEhlaWdodCgpLCBtU2Nyb2xsRHVyYXRpb24pOworICAgICAgICAgICAgICAgICAgICBwb3N0KHRoaXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE9uLXNjcmVlbiwganVzdCBzY3JvbGwuCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB0YXJnZXRUb3AgPSBnZXRDaGlsZEF0KHBvc2l0aW9uIC0gZmlyc3RQb3MpLmdldFRvcCgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZGlzdGFuY2UgPSB0YXJnZXRUb3AgLSBtT2Zmc2V0RnJvbVRvcDsKKyAgICAgICAgICAgICAgICAgICAgc21vb3RoU2Nyb2xsQnkoZGlzdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKG1TY3JvbGxEdXJhdGlvbiAqICgoZmxvYXQpIGRpc3RhbmNlIC8gZ2V0SGVpZ2h0KCkpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMzE3Niw2ICszMjYxLDI0IEBACiAgICAgfQogICAgIAogICAgIC8qKgorICAgICAqIFNtb290aGx5IHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgcG9zaXRpb24uIFRoZSB2aWV3IHdpbGwgc2Nyb2xsCisgICAgICogc3VjaCB0aGF0IHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24gaXMgZGlzcGxheWVkIDxjb2RlPm9mZnNldDwvY29kZT4gcGl4ZWxzIGZyb20KKyAgICAgKiB0aGUgdG9wIGVkZ2Ugb2YgdGhlIHZpZXcuIElmIHRoaXMgaXMgaW1wb3NzaWJsZSwgKGUuZy4gdGhlIG9mZnNldCB3b3VsZCBzY3JvbGwKKyAgICAgKiB0aGUgZmlyc3Qgb3IgbGFzdCBpdGVtIGJleW9uZCB0aGUgYm91bmRhcmllcyBvZiB0aGUgbGlzdCkgaXQgd2lsbCBnZXQgYXMgY2xvc2UKKyAgICAgKiBhcyBwb3NzaWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBQb3NpdGlvbiB0byBzY3JvbGwgdG8KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IERlc2lyZWQgZGlzdGFuY2UgaW4gcGl4ZWxzIG9mIDxjb2RlPnBvc2l0aW9uPC9jb2RlPiBmcm9tIHRoZSB0b3AKKyAgICAgKiAgICAgICAgICAgICAgIG9mIHRoZSB2aWV3IHdoZW4gc2Nyb2xsaW5nIGlzIGZpbmlzaGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc21vb3RoU2Nyb2xsVG9Qb3NpdGlvbkZyb21Ub3AoaW50IHBvc2l0aW9uLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGlmIChtUG9zaXRpb25TY3JvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtUG9zaXRpb25TY3JvbGxlciA9IG5ldyBQb3NpdGlvblNjcm9sbGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgbVBvc2l0aW9uU2Nyb2xsZXIuc3RhcnRXaXRoT2Zmc2V0KHBvc2l0aW9uLCBvZmZzZXQpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNtb290aGx5IHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgcG9zaXRpb24uIFRoZSB2aWV3IHdpbGwKICAgICAgKiBzY3JvbGwgc3VjaCB0aGF0IHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24gaXMgZGlzcGxheWVkLCBidXQgaXQgd2lsbAogICAgICAqIHN0b3AgZWFybHkgaWYgc2Nyb2xsaW5nIGZ1cnRoZXIgd291bGQgc2Nyb2xsIGJvdW5kUG9zaXRpb24gb3V0IG9mCkBAIC0zMjA1LDYgKzMzMDgsNDIgQEAKICAgICAgICAgbUZsaW5nUnVubmFibGUuc3RhcnRTY3JvbGwoZGlzdGFuY2UsIGR1cmF0aW9uKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBBbGxvd3MgUmVtb3RlVmlld3MgdG8gc2Nyb2xsIHJlbGF0aXZlbHkgdG8gYSBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIHNtb290aFNjcm9sbEJ5T2Zmc2V0KGludCBwb3NpdGlvbikgeworICAgICAgICBpbnQgaW5kZXggPSAtMTsKKyAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCkgeworICAgICAgICAgICAgaW5kZXggPSBnZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOworICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID4gMCkgeworICAgICAgICAgICAgaW5kZXggPSBnZXRMYXN0VmlzaWJsZVBvc2l0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5kZXggPiAtMSkgeworICAgICAgICAgICAgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaW5kZXggLSBnZXRGaXJzdFZpc2libGVQb3NpdGlvbigpKTsKKyAgICAgICAgICAgIGlmIChjaGlsZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgUmVjdCB2aXNpYmxlUmVjdCA9IG5ldyBSZWN0KCk7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmdldEdsb2JhbFZpc2libGVSZWN0KHZpc2libGVSZWN0KSkgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2hpbGQgaXMgcGFydGlhbGx5IHZpc2libGUKKyAgICAgICAgICAgICAgICAgICAgaW50IGNoaWxkUmVjdEFyZWEgPSBjaGlsZC5nZXRXaWR0aCgpICogY2hpbGQuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgIGludCB2aXNpYmxlUmVjdEFyZWEgPSB2aXNpYmxlUmVjdC53aWR0aCgpICogdmlzaWJsZVJlY3QuaGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZpc2libGVBcmVhID0gKHZpc2libGVSZWN0QXJlYSAvIChmbG9hdCkgY2hpbGRSZWN0QXJlYSk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHZpc2libGVUaHJlc2hvbGQgPSAwLjc1ZjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwb3NpdGlvbiA8IDApICYmICh2aXNpYmxlQXJlYSA8IHZpc2libGVUaHJlc2hvbGQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdG9wIGluZGV4IGlzIG5vdCBwZXJjZWl2YWJseSB2aXNpYmxlIHNvIG9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYWNjb3VudCBmb3Igc2hvd2luZyB0aGF0IHRvcCBpbmRleCBhcyB3ZWxsCisgICAgICAgICAgICAgICAgICAgICAgICArK2luZGV4OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChwb3NpdGlvbiA+IDApICYmICh2aXNpYmxlQXJlYSA8IHZpc2libGVUaHJlc2hvbGQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYm90dG9tIGluZGV4IGlzIG5vdCBwZXJjZWl2YWJseSB2aXNpYmxlIHNvIG9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYWNjb3VudCBmb3Igc2hvd2luZyB0aGF0IGJvdHRvbSBpbmRleCBhcyB3ZWxsCisgICAgICAgICAgICAgICAgICAgICAgICAtLWluZGV4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNtb290aFNjcm9sbFRvUG9zaXRpb24oTWF0aC5tYXgoMCwgTWF0aC5taW4oZ2V0Q291bnQoKSwgaW5kZXggKyBwb3NpdGlvbikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTY3JvbGxpbmdDYWNoZSgpIHsKICAgICAgICAgaWYgKG1TY3JvbGxpbmdDYWNoZUVuYWJsZWQgJiYgIW1DYWNoaW5nU3RhcnRlZCkgewogICAgICAgICAgICAgc2V0Q2hpbGRyZW5EcmF3bldpdGhDYWNoZUVuYWJsZWQodHJ1ZSk7CkBAIC0zMjcyLDI5ICszNDExLDE2IEBACiAKICAgICAgICAgZmluYWwgaW50IGZpcnN0UG9zaXRpb24gPSBtRmlyc3RQb3NpdGlvbjsKIAotICAgICAgICAvLyBVcGRhdGUgb3VyIGd1ZXNzZXMgZm9yIHdoZXJlIHRoZSBmaXJzdCBhbmQgbGFzdCB2aWV3cyBhcmUKLSAgICAgICAgaWYgKGZpcnN0UG9zaXRpb24gPT0gMCkgewotICAgICAgICAgICAgbUZpcnN0UG9zaXRpb25EaXN0YW5jZUd1ZXNzID0gZmlyc3RUb3AgLSBtTGlzdFBhZGRpbmcudG9wOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUZpcnN0UG9zaXRpb25EaXN0YW5jZUd1ZXNzICs9IGluY3JlbWVudGFsRGVsdGFZOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmaXJzdFBvc2l0aW9uICsgY2hpbGRDb3VudCA9PSBtSXRlbUNvdW50KSB7Ci0gICAgICAgICAgICBtTGFzdFBvc2l0aW9uRGlzdGFuY2VHdWVzcyA9IGxhc3RCb3R0b20gKyBtTGlzdFBhZGRpbmcuYm90dG9tOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUxhc3RQb3NpdGlvbkRpc3RhbmNlR3Vlc3MgKz0gaW5jcmVtZW50YWxEZWx0YVk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmlyc3RQb3NpdGlvbiA9PSAwICYmIGZpcnN0VG9wID49IGxpc3RQYWRkaW5nLnRvcCAmJiBpbmNyZW1lbnRhbERlbHRhWSA+PSAwKSB7CisgICAgICAgIGlmIChmaXJzdFBvc2l0aW9uID09IDAgJiYgZmlyc3RUb3AgPj0gbGlzdFBhZGRpbmcudG9wICYmIGRlbHRhWSA+PSAwKSB7CiAgICAgICAgICAgICAvLyBEb24ndCBuZWVkIHRvIG1vdmUgdmlld3MgZG93biBpZiB0aGUgdG9wIG9mIHRoZSBmaXJzdCBwb3NpdGlvbgogICAgICAgICAgICAgLy8gaXMgYWxyZWFkeSB2aXNpYmxlCi0gICAgICAgICAgICByZXR1cm4gaW5jcmVtZW50YWxEZWx0YVkgIT0gMDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGZpcnN0UG9zaXRpb24gKyBjaGlsZENvdW50ID09IG1JdGVtQ291bnQgJiYgbGFzdEJvdHRvbSA8PSBlbmQgJiYKLSAgICAgICAgICAgICAgICBpbmNyZW1lbnRhbERlbHRhWSA8PSAwKSB7CisgICAgICAgIGlmIChmaXJzdFBvc2l0aW9uICsgY2hpbGRDb3VudCA9PSBtSXRlbUNvdW50ICYmIGxhc3RCb3R0b20gPD0gZW5kICYmIGRlbHRhWSA8PSAwKSB7CiAgICAgICAgICAgICAvLyBEb24ndCBuZWVkIHRvIG1vdmUgdmlld3MgdXAgaWYgdGhlIGJvdHRvbSBvZiB0aGUgbGFzdCBwb3NpdGlvbgogICAgICAgICAgICAgLy8gaXMgYWxyZWFkeSB2aXNpYmxlCi0gICAgICAgICAgICByZXR1cm4gaW5jcmVtZW50YWxEZWx0YVkgIT0gMDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgZmluYWwgYm9vbGVhbiBkb3duID0gaW5jcmVtZW50YWxEZWx0YVkgPCAwOwpAQCAtMzU3Niw2ICszNzAyLDcgQEAKIAogICAgICAgICBtUmVzdXJyZWN0VG9Qb3NpdGlvbiA9IElOVkFMSURfUE9TSVRJT047CiAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtRmxpbmdSdW5uYWJsZSk7CisgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtUG9zaXRpb25TY3JvbGxlcik7CiAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1JFU1Q7CiAgICAgICAgIGNsZWFyU2Nyb2xsaW5nQ2FjaGUoKTsKICAgICAgICAgbVNwZWNpZmljVG9wID0gc2VsZWN0ZWRUb3A7CkBAIC00MTE4LDcgKzQyNDUsMTEgQEAKIAogICAgIC8qKgogICAgICAqIFdoZW4gc2V0IHRvIGEgbm9uLXplcm8gdmFsdWUsIHRoZSBjYWNoZSBjb2xvciBoaW50IGluZGljYXRlcyB0aGF0IHRoaXMgbGlzdCBpcyBhbHdheXMgZHJhd24KLSAgICAgKiBvbiB0b3Agb2YgYSBzb2xpZCwgc2luZ2xlLWNvbG9yLCBvcGFxdWUgYmFja2dyb3VuZAorICAgICAqIG9uIHRvcCBvZiBhIHNvbGlkLCBzaW5nbGUtY29sb3IsIG9wYXF1ZSBiYWNrZ3JvdW5kLgorICAgICAqCisgICAgICogWmVybyBtZWFucyB0aGF0IHdoYXQncyBiZWhpbmQgdGhpcyBvYmplY3QgaXMgdHJhbnNsdWNlbnQgKG5vbiBzb2xpZCkgb3IgaXMgbm90IG1hZGUgb2YgYQorICAgICAqIHNpbmdsZSBjb2xvci4gVGhpcyBoaW50IHdpbGwgbm90IGFmZmVjdCBhbnkgZXhpc3RpbmcgYmFja2dyb3VuZCBkcmF3YWJsZSBzZXQgb24gdGhpcyB2aWV3ICgKKyAgICAgKiB0eXBpY2FsbHkgc2V0IHZpYSB7QGxpbmsgI3NldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSl9KS4KICAgICAgKgogICAgICAqIEBwYXJhbSBjb2xvciBUaGUgYmFja2dyb3VuZCBjb2xvcgogICAgICAqLwpAQCAtNDIyOCwxMCArNDM1OSw0MyBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBmaW5pc2hHbG93cygpIHsKLSAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRWRnZUdsb3dUb3AuZmluaXNoKCk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20uZmluaXNoKCk7CisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGlzIEFic0xpc3RWaWV3IHRvIHVzZSBhIHJlbW90ZSB2aWV3cyBhZGFwdGVyIHdoaWNoIGNvbm5lY3RzIHRvIGEgUmVtb3RlVmlld3NTZXJ2aWNlCisgICAgICogdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGludGVudC4KKyAgICAgKiBAcGFyYW0gaW50ZW50IHRoZSBpbnRlbnQgdXNlZCB0byBpZGVudGlmeSB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlIGZvciB0aGUgYWRhcHRlciB0byBjb25uZWN0IHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZVZpZXdzQWRhcHRlcihJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIGRvbid0IGFscmVhZHkgaGF2ZSBhIFJlbW90ZVZpZXdzQWRhcHRlciB0aGF0IGlzIGJvdW5kIHRvIGFuIGV4aXN0aW5nCisgICAgICAgIC8vIHNlcnZpY2UgaGFuZGxpbmcgdGhlIHNwZWNpZmllZCBpbnRlbnQuCisgICAgICAgIGlmIChtUmVtb3RlQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBJbnRlbnQuRmlsdGVyQ29tcGFyaXNvbiBmY05ldyA9IG5ldyBJbnRlbnQuRmlsdGVyQ29tcGFyaXNvbihpbnRlbnQpOworICAgICAgICAgICAgSW50ZW50LkZpbHRlckNvbXBhcmlzb24gZmNPbGQgPSBuZXcgSW50ZW50LkZpbHRlckNvbXBhcmlzb24oCisgICAgICAgICAgICAgICAgICAgIG1SZW1vdGVBZGFwdGVyLmdldFJlbW90ZVZpZXdzU2VydmljZUludGVudCgpKTsKKyAgICAgICAgICAgIGlmIChmY05ldy5lcXVhbHMoZmNPbGQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgYSBuZXcgUmVtb3RlVmlld3NBZGFwdGVyIGZvciBiaW5kaW5nCisgICAgICAgIG1SZW1vdGVBZGFwdGVyID0gbmV3IFJlbW90ZVZpZXdzQWRhcHRlcihnZXRDb250ZXh0KCksIGludGVudCwgdGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJhY2sgd2hlbiB0aGUgYWRhcHRlciBjb25uZWN0cyB0byB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCgpIHsKKyAgICAgICAgaWYgKG1SZW1vdGVBZGFwdGVyICE9IG1BZGFwdGVyKSB7CisgICAgICAgICAgICBzZXRBZGFwdGVyKG1SZW1vdGVBZGFwdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBiYWNrIHdoZW4gdGhlIGFkYXB0ZXIgZGlzY29ubmVjdHMgZnJvbSB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUmVtb3RlQWRhcHRlckRpc2Nvbm5lY3RlZCgpIHsKKyAgICAgICAgaWYgKG1SZW1vdGVBZGFwdGVyID09IG1BZGFwdGVyKSB7CisgICAgICAgICAgICBtUmVtb3RlQWRhcHRlciA9IG51bGw7CisgICAgICAgICAgICBzZXRBZGFwdGVyKG51bGwpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00MjUxLDYgKzQ0MTUsNzUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBBIE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIHJlY2VpdmVzIGV2ZW50cyBmb3Ige0BsaW5rIEFic0xpc3RWaWV3I0NIT0lDRV9NT0RFX01VTFRJUExFX01PREFMfS4KKyAgICAgKiBJdCBhY3RzIGFzIHRoZSB7QGxpbmsgQWN0aW9uTW9kZS5DYWxsYmFja30gZm9yIHRoZSBzZWxlY3Rpb24gbW9kZSBhbmQgYWxzbyByZWNlaXZlcworICAgICAqIHtAbGluayAjb25JdGVtQ2hlY2tlZFN0YXRlQ2hhbmdlZChBY3Rpb25Nb2RlLCBpbnQsIGxvbmcsIGJvb2xlYW4pfSBldmVudHMgd2hlbiB0aGUgdXNlcgorICAgICAqIHNlbGVjdHMgYW5kIGRlc2VsZWN0cyBsaXN0IGl0ZW1zLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIgZXh0ZW5kcyBBY3Rpb25Nb2RlLkNhbGxiYWNrIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGFuIGl0ZW0gaXMgY2hlY2tlZCBvciB1bmNoZWNrZWQgZHVyaW5nIHNlbGVjdGlvbiBtb2RlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbW9kZSBUaGUge0BsaW5rIEFjdGlvbk1vZGV9IHByb3ZpZGluZyB0aGUgc2VsZWN0aW9uIG1vZGUKKyAgICAgICAgICogQHBhcmFtIHBvc2l0aW9uIEFkYXB0ZXIgcG9zaXRpb24gb2YgdGhlIGl0ZW0gdGhhdCB3YXMgY2hlY2tlZCBvciB1bmNoZWNrZWQKKyAgICAgICAgICogQHBhcmFtIGlkIEFkYXB0ZXIgSUQgb2YgdGhlIGl0ZW0gdGhhdCB3YXMgY2hlY2tlZCBvciB1bmNoZWNrZWQKKyAgICAgICAgICogQHBhcmFtIGNoZWNrZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGl0ZW0gaXMgbm93IGNoZWNrZWQsIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgaXRlbSBpcyBub3cgdW5jaGVja2VkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2hlY2tlZFN0YXRlQ2hhbmdlZChBY3Rpb25Nb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uLCBsb25nIGlkLCBib29sZWFuIGNoZWNrZWQpOworICAgIH0KKworICAgIGNsYXNzIE11bHRpQ2hvaWNlTW9kZVdyYXBwZXIgaW1wbGVtZW50cyBNdWx0aUNob2ljZU1vZGVMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIgbVdyYXBwZWQ7CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0V3JhcHBlZChNdWx0aUNob2ljZU1vZGVMaXN0ZW5lciB3cmFwcGVkKSB7CisgICAgICAgICAgICBtV3JhcHBlZCA9IHdyYXBwZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgIGlmIChtV3JhcHBlZC5vbkNyZWF0ZUFjdGlvbk1vZGUobW9kZSwgbWVudSkpIHsKKyAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIGNoZWNrZWQgZ3JhcGhpYyBzdGF0ZT8KKyAgICAgICAgICAgICAgICBzZXRMb25nQ2xpY2thYmxlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgIHJldHVybiBtV3JhcHBlZC5vblByZXBhcmVBY3Rpb25Nb2RlKG1vZGUsIG1lbnUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25BY3Rpb25JdGVtQ2xpY2tlZChBY3Rpb25Nb2RlIG1vZGUsIE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgICAgIHJldHVybiBtV3JhcHBlZC5vbkFjdGlvbkl0ZW1DbGlja2VkKG1vZGUsIGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25EZXN0cm95QWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUpIHsKKyAgICAgICAgICAgIG1XcmFwcGVkLm9uRGVzdHJveUFjdGlvbk1vZGUobW9kZSk7CisgICAgICAgICAgICBtQ2hvaWNlQWN0aW9uTW9kZSA9IG51bGw7CisKKyAgICAgICAgICAgIC8vIEVuZGluZyBzZWxlY3Rpb24gbW9kZSBtZWFucyBkZXNlbGVjdGluZyBldmVyeXRoaW5nLgorICAgICAgICAgICAgY2xlYXJDaG9pY2VzKCk7CisKKyAgICAgICAgICAgIG1EYXRhQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICByZW1lbWJlclN5bmNTdGF0ZSgpOworICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOworCisgICAgICAgICAgICBzZXRMb25nQ2xpY2thYmxlKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2hlY2tlZFN0YXRlQ2hhbmdlZChBY3Rpb25Nb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uLCBsb25nIGlkLCBib29sZWFuIGNoZWNrZWQpIHsKKyAgICAgICAgICAgIG1XcmFwcGVkLm9uSXRlbUNoZWNrZWRTdGF0ZUNoYW5nZWQobW9kZSwgcG9zaXRpb24sIGlkLCBjaGVja2VkKTsKKworICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGl0ZW1zIHNlbGVjdGVkIHdlIG5vIGxvbmdlciBuZWVkIHRoZSBzZWxlY3Rpb24gbW9kZS4KKyAgICAgICAgICAgIGlmIChnZXRDaGVja2VkSXRlbUNvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgICAgIG1vZGUuZmluaXNoKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBBYnNMaXN0VmlldyBleHRlbmRzIExheW91dFBhcmFtcyB0byBwcm92aWRlIGEgcGxhY2UgdG8gaG9sZCB0aGUgdmlldyB0eXBlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGF5b3V0UGFyYW1zIGV4dGVuZHMgVmlld0dyb3VwLkxheW91dFBhcmFtcyB7CkBAIC00NjE4LDcgKzQ4NTEsNyBAQAogICAgICAgICAgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8Vmlldz4gc2NyYXAgPSBtU2NyYXBWaWV3c1tpXTsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNjcmFwQ291bnQgPSBzY3JhcC5zaXplKCk7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2NyYXBDb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY3JhcC5nZXQoaSkuc2V0RHJhd2luZ0NhY2hlQmFja2dyb3VuZENvbG9yKGNvbG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjcmFwLmdldChqKS5zZXREcmF3aW5nQ2FjaGVCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyLmphdmEKaW5kZXggZjJiM2UyYS4uOWI2YzVhNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlci5qYXZhCkBAIC03Miw3ICs3Miw3IEBACiAgICAgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKTsKICAgICAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZWQgd2hldGhlciB0aGUgaXRlbSBpZHMgYXJlIHN0YWJsZSBhY3Jvc3MgY2hhbmdlcyB0byB0aGUKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaXRlbSBpZHMgYXJlIHN0YWJsZSBhY3Jvc3MgY2hhbmdlcyB0byB0aGUKICAgICAgKiB1bmRlcmx5aW5nIGRhdGEuCiAgICAgICogCiAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzYW1lIGlkIGFsd2F5cyByZWZlcnMgdG8gdGhlIHNhbWUgb2JqZWN0LgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXcuamF2YQppbmRleCA4ZmNjMmU4Li5mNWFmYjk0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXcuamF2YQpAQCAtMTcyLDcgKzE3Miw3IEBACiAgICAgaW50IG1JdGVtQ291bnQ7CiAKICAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBhZGFwdGVyIGJlZm9yZSBhIGRhdGEgY2hhbmdlZCBldmVudCBvY2N1cmVkLgorICAgICAqIFRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGFkYXB0ZXIgYmVmb3JlIGEgZGF0YSBjaGFuZ2VkIGV2ZW50IG9jY3VycmVkLgogICAgICAqLwogICAgIGludCBtT2xkSXRlbUNvdW50OwogCkBAIC0yMjgsNyArMjI4LDYgQEAKICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIEludGVyZmFjZSBkZWZpbml0aW9uIGZvciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiBhbiBpdGVtIGluIHRoaXMKICAgICAgKiBBZGFwdGVyVmlldyBoYXMgYmVlbiBjbGlja2VkLgpAQCAtNTU4LDcgKzU1Nyw3IEBACiAgICAgLyoqCiAgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGl0ZW1zIG93bmVkIGJ5IHRoZSBBZGFwdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzCiAgICAgICogICAgICAgICBBZGFwdGVyVmlldy4gKFRoaXMgaXMgdGhlIG51bWJlciBvZiBkYXRhIGl0ZW1zLCB3aGljaCBtYXkgYmUKLSAgICAgKiAgICAgICAgIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgdmlzaWJsZSB2aWV3LikKKyAgICAgKiAgICAgICAgIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgdmlzaWJsZSB2aWV3cy4pCiAgICAgICovCiAgICAgQFZpZXdEZWJ1Zy5DYXB0dXJlZFZpZXdQcm9wZXJ0eQogICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CkBAIC02MjksNiArNjI4LDcgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB2aWV3IHRvIHNob3cgaWYgdGhlIGFkYXB0ZXIgaXMgZW1wdHkKICAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKICAgICBwdWJsaWMgdm9pZCBzZXRFbXB0eVZpZXcoVmlldyBlbXB0eVZpZXcpIHsKICAgICAgICAgbUVtcHR5VmlldyA9IGVtcHR5VmlldzsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3QW5pbWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlld0FuaW1hdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdiMWEyMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlld0FuaW1hdG9yLmphdmEKQEAgLTAsMCArMSw4NTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9ySW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBhIHtAbGluayBBZGFwdGVyVmlld30gdGhhdCB3aWxsIHBlcmZvcm0gYW5pbWF0aW9ucworICogd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBpdHMgdmlld3MuCisgKgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQWRhcHRlclZpZXdBbmltYXRvcl9pbkFuaW1hdGlvbgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQWRhcHRlclZpZXdBbmltYXRvcl9vdXRBbmltYXRpb24KKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0FkYXB0ZXJWaWV3QW5pbWF0b3JfYW5pbWF0ZUZpcnN0VmlldworICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQWRhcHRlclZpZXdBbmltYXRvcl9sb29wVmlld3MKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFkYXB0ZXJWaWV3QW5pbWF0b3IgZXh0ZW5kcyBBZGFwdGVyVmlldzxBZGFwdGVyPgorICAgICAgICBpbXBsZW1lbnRzIFJlbW90ZVZpZXdzQWRhcHRlci5SZW1vdGVBZGFwdGVyQ29ubmVjdGlvbkNhbGxiYWNrIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJlbW90ZVZpZXdBbmltYXRvciI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgY2hpbGQsIHdoaWNoIGFwcGVhcnMgYW55d2hlcmUgZnJvbSB0aGUgYmVnaW5uaW5nCisgICAgICogdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzZXQgb2YgY2hpbGRyZW4sIGFzIHNwZWNpZmllZCBieSB7QGxpbmsgI21BY3RpdmVPZmZzZXR9CisgICAgICovCisgICAgaW50IG1XaGljaENoaWxkID0gMDsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBmaXJzdCB2aWV3KHMpIHNob3VsZCBiZSBhbmltYXRlZCBpbgorICAgICAqLworICAgIGJvb2xlYW4gbUFuaW1hdGVGaXJzdFRpbWUgPSB0cnVlOworCisgICAgLyoqCisgICAgICogIFJlcHJlc2VudHMgd2hlcmUgdGhlIGluIHRoZSBjdXJyZW50IHdpbmRvdyBvZgorICAgICAqICB2aWV3cyB0aGUgY3VycmVudCA8Y29kZT5tRGlzcGxheWVkQ2hpbGQ8L2NvZGU+IHNpdHMKKyAgICAgKi8KKyAgICBpbnQgbUFjdGl2ZU9mZnNldCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIHZpZXdzIHRoYXQgdGhlIHtAbGluayBBZGFwdGVyVmlld0FuaW1hdG9yfSBrZWVwcyBhcyBjaGlsZHJlbiBhdCBhbnkKKyAgICAgKiBnaXZlbiB0aW1lIChub3QgY291bnRpbmcgdmlld3MgdGhhdCBhcmUgcGVuZGluZyByZW1vdmFsLCBzZWUge0BsaW5rICNtUHJldmlvdXNWaWV3c30pLgorICAgICAqLworICAgIGludCBtTnVtQWN0aXZlVmlld3MgPSAxOworCisgICAgLyoqCisgICAgICogTWFwIG9mIHRoZSBjaGlsZHJlbiBvZiB0aGUge0BsaW5rIEFkYXB0ZXJWaWV3QW5pbWF0b3J9LgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcDxJbnRlZ2VyLCBWaWV3QW5kSW5kZXg+IG1WaWV3c01hcCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFZpZXdBbmRJbmRleD4oKTsKKworICAgIC8qKgorICAgICAqIExpc3Qgb2Ygdmlld3MgcGVuZGluZyByZW1vdmFsIGZyb20gdGhlIHtAbGluayBBZGFwdGVyVmlld0FuaW1hdG9yfQorICAgICAqLworICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBtUHJldmlvdXNWaWV3czsKKworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCwgcmVsYXRpdmUgdG8gdGhlIGFkYXB0ZXIsIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHdpbmRvdyBvZiB2aWV3cworICAgICAqLworICAgIGludCBtQ3VycmVudFdpbmRvd1N0YXJ0ID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCwgcmVsYXRpdmUgdG8gdGhlIGFkYXB0ZXIsIG9mIHRoZSBlbmQgb2YgdGhlIHdpbmRvdyBvZiB2aWV3cworICAgICAqLworICAgIGludCBtQ3VycmVudFdpbmRvd0VuZCA9IC0xOworCisgICAgLyoqCisgICAgICogVGhlIHNhbWUgYXMge0BsaW5rICNtQ3VycmVudFdpbmRvd1N0YXJ0fSwgZXhjZXB0IHdoZW4gdGhlIHdlIGhhdmUgYm91bmRlZAorICAgICAqIHtAbGluayAjbUN1cnJlbnRXaW5kb3dTdGFydH0gdG8gYmUgbm9uLW5lZ2F0aXZlCisgICAgICovCisgICAgaW50IG1DdXJyZW50V2luZG93U3RhcnRVbmJvdW5kZWQgPSAwOworCisgICAgLyoqCisgICAgICogSGFuZGxlciB0byBwb3N0IGV2ZW50cyB0byB0aGUgbWFpbiB0aHJlYWQKKyAgICAgKi8KKyAgICBIYW5kbGVyIG1NYWluUXVldWU7CisKKyAgICAvKioKKyAgICAgKiBMaXN0ZW5zIGZvciBkYXRhIGNoYW5nZXMgZnJvbSB0aGUgYWRhcHRlcgorICAgICAqLworICAgIEFkYXB0ZXJEYXRhU2V0T2JzZXJ2ZXIgbURhdGFTZXRPYnNlcnZlcjsKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgQWRhcHRlcn0gZm9yIHRoaXMge0BsaW5rIEFkYXB0ZXJWaWV3QW5pbWF0b3J9CisgICAgICovCisgICAgQWRhcHRlciBtQWRhcHRlcjsKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgUmVtb3RlVmlld3NBZGFwdGVyfSBmb3IgdGhpcyB7QGxpbmsgQWRhcHRlclZpZXdBbmltYXRvcn0KKyAgICAgKi8KKyAgICBSZW1vdGVWaWV3c0FkYXB0ZXIgbVJlbW90ZVZpZXdzQWRhcHRlcjsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIGFuaW1hdG9yIGlzIHNob3dpbmcgdmlld3MKKyAgICAgKi8KKyAgICBib29sZWFuIG1GaXJzdFRpbWUgPSB0cnVlOworCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIGlmIHRoZSBhbmltYXRvciBzaG91bGQgd3JhcCBmcm9tIDAgdG8gdGhlIGVuZCBhbmQgdmljZSB2ZXJzYQorICAgICAqIG9yIGhhdmUgaGFyZCBib3VuZGFyaWVzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZAorICAgICAqLworICAgIGJvb2xlYW4gbUxvb3BWaWV3cyA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiBzb21lIGNoaWxkLCB1c2VkIGFzIGEgc2l6ZSByZWZlcmVuY2UgaW4tY2FzZSBvdXIKKyAgICAgKiBkaW1lbnNpb25zIGFyZSB1bnNwZWNpZmllZCBieSB0aGUgcGFyZW50LgorICAgICAqLworICAgIGludCBtUmVmZXJlbmNlQ2hpbGRXaWR0aCA9IC0xOworICAgIGludCBtUmVmZXJlbmNlQ2hpbGRIZWlnaHQgPSAtMTsKKworICAgIC8qKgorICAgICAqIEluIGFuZCBvdXQgYW5pbWF0aW9ucy4KKyAgICAgKi8KKyAgICBPYmplY3RBbmltYXRvcjw/PiBtSW5BbmltYXRpb247CisgICAgT2JqZWN0QW5pbWF0b3I8Pz4gbU91dEFuaW1hdGlvbjsKKworICAgIHByaXZhdGUgIEFycmF5TGlzdDxWaWV3PiBtVmlld3NUb0JyaW5nVG9Gcm9udDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0FOSU1BVElPTl9EVVJBVElPTiA9IDIwMDsKKworICAgIHB1YmxpYyBBZGFwdGVyVmlld0FuaW1hdG9yKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgaW5pdFZpZXdBbmltYXRvcigpOworICAgIH0KKworICAgIHB1YmxpYyBBZGFwdGVyVmlld0FuaW1hdG9yKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKworICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQWRhcHRlclZpZXdBbmltYXRvcik7CisgICAgICAgIGludCByZXNvdXJjZSA9IGEuZ2V0UmVzb3VyY2VJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BZGFwdGVyVmlld0FuaW1hdG9yX2luQW5pbWF0aW9uLCAwKTsKKyAgICAgICAgaWYgKHJlc291cmNlID4gMCkgeworICAgICAgICAgICAgc2V0SW5BbmltYXRpb24oY29udGV4dCwgcmVzb3VyY2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0SW5BbmltYXRpb24oZ2V0RGVmYXVsdEluQW5pbWF0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmVzb3VyY2UgPSBhLmdldFJlc291cmNlSWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQWRhcHRlclZpZXdBbmltYXRvcl9vdXRBbmltYXRpb24sIDApOworICAgICAgICBpZiAocmVzb3VyY2UgPiAwKSB7CisgICAgICAgICAgICBzZXRPdXRBbmltYXRpb24oY29udGV4dCwgcmVzb3VyY2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0T3V0QW5pbWF0aW9uKGdldERlZmF1bHRPdXRBbmltYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGZsYWcgPSBhLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQWRhcHRlclZpZXdBbmltYXRvcl9hbmltYXRlRmlyc3RWaWV3LCB0cnVlKTsKKyAgICAgICAgc2V0QW5pbWF0ZUZpcnN0VmlldyhmbGFnKTsKKworICAgICAgICBtTG9vcFZpZXdzID0gYS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFkYXB0ZXJWaWV3QW5pbWF0b3JfbG9vcFZpZXdzLCBmYWxzZSk7CisKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgaW5pdFZpZXdBbmltYXRvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhpcyB7QGxpbmsgQWRhcHRlclZpZXdBbmltYXRvcn0KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5pdFZpZXdBbmltYXRvcigpIHsKKyAgICAgICAgbU1haW5RdWV1ZSA9IG5ldyBIYW5kbGVyKExvb3Blci5teUxvb3BlcigpKTsKKyAgICAgICAgbVByZXZpb3VzVmlld3MgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgIG1WaWV3c1RvQnJpbmdUb0Zyb250ID0gbmV3IEFycmF5TGlzdDxWaWV3PigpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgVmlld0FuZEluZGV4IHsKKyAgICAgICAgVmlld0FuZEluZGV4KFZpZXcgdiwgaW50IGkpIHsKKyAgICAgICAgICAgIHZpZXcgPSB2OworICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICB9CisgICAgICAgIFZpZXcgdmlldzsKKyAgICAgICAgaW50IGluZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgc3ViY2xhc3NlcyB0byBjb25maWd1cmUgdGhlIGFuaW1hdG9yIHRvIGRpc3BsYXkgdGhlCisgICAgICogZGVzaXJlZCBudW1iZXIgb2Ygdmlld3MsIGFuZCBzcGVjaWZ5IHRoZSBvZmZzZXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBudW1WaXNpYmxlVmlld3MgVGhlIG51bWJlciBvZiB2aWV3cyB0aGUgYW5pbWF0b3Iga2VlcHMgaW4gdGhlIHtAbGluayBWaWV3R3JvdXB9CisgICAgICogQHBhcmFtIGFjdGl2ZU9mZnNldCBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hlcmUgdGhlIGN1cnJlbnQgaW5kZXggKHtAbGluayAjbVdoaWNoQ2hpbGR9KQorICAgICAqICAgICAgICBzaXRzIHdpdGhpbiB0aGUgd2luZG93LiBGb3IgZXhhbXBsZSBpZiBhY3RpdmVPZmZzZXQgaXMgMSwgYW5kIG51bVZpc2libGVWaWV3cyBpcyAzLAorICAgICAqICAgICAgICBhbmQge0BsaW5rICNzZXREaXNwbGF5ZWRDaGlsZChpbnQpfSBpcyBjYWxsZWQgd2l0aCAxMCwgdGhlbiB0aGUgZWZmZWN0aXZlIHdpbmRvdyB3aWxsCisgICAgICogICAgICAgIGJlIHRoZSBpbmRleGVzIDksIDEwLCBhbmQgMTEuIEluIHRoZSBzYW1lIGV4YW1wbGUsIGlmIGFjdGl2ZU9mZnNldCB3ZXJlIDAsIHRoZW4gdGhlCisgICAgICogICAgICAgIHdpbmRvdyB3b3VsZCBpbnN0ZWFkIGNvbnRhaW4gaW5kZXhlcyAxMCwgMTEgYW5kIDEyLgorICAgICAqIEBwYXJhbSBzaG91bGRMb29wIElmIHRoZSBhbmltYXRvciBpcyBzaG93IHZpZXcgMCwgYW5kIHNldFByZXZpb3VzKCkgaXMgY2FsbGVkLCBkbyB3ZQorICAgICAqICAgICAgICB3ZSBsb29wIGJhY2sgdG8gdGhlIGVuZCwgb3IgZG8gd2UgZG8gbm90aGluZworICAgICAqLworICAgICB2b2lkIGNvbmZpZ3VyZVZpZXdBbmltYXRvcihpbnQgbnVtVmlzaWJsZVZpZXdzLCBpbnQgYWN0aXZlT2Zmc2V0KSB7CisgICAgICAgIGlmIChhY3RpdmVPZmZzZXQgPiBudW1WaXNpYmxlVmlld3MgLSAxKSB7CisgICAgICAgICAgICAvLyBUaHJvdyBhbiBleGNlcHRpb24gaGVyZS4KKyAgICAgICAgfQorICAgICAgICBtTnVtQWN0aXZlVmlld3MgPSBudW1WaXNpYmxlVmlld3M7CisgICAgICAgIG1BY3RpdmVPZmZzZXQgPSBhY3RpdmVPZmZzZXQ7CisgICAgICAgIG1QcmV2aW91c1ZpZXdzLmNsZWFyKCk7CisgICAgICAgIG1WaWV3c01hcC5jbGVhcigpOworICAgICAgICByZW1vdmVBbGxWaWV3c0luTGF5b3V0KCk7CisgICAgICAgIG1DdXJyZW50V2luZG93U3RhcnQgPSAwOworICAgICAgICBtQ3VycmVudFdpbmRvd0VuZCA9IC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0byBjdXN0b21pemUgdmlldyB0cmFuc2l0aW9ucyB3aXRoaW4KKyAgICAgKiB0aGUgc2V0IG9mIHZpc2libGUgdmlld3MKKyAgICAgKgorICAgICAqIEBwYXJhbSBmcm9tSW5kZXggVGhlIHJlbGF0aXZlIGluZGV4IHdpdGhpbiB0aGUgd2luZG93IHRoYXQgdGhlIHZpZXcgd2FzIGluLCAtMSBpZiBpdCB3YXNuJ3QKKyAgICAgKiAgICAgICAgaW4gdGhlIHdpbmRvdworICAgICAqIEBwYXJhbSB0b0luZGV4IFRoZSByZWxhdGl2ZSBpbmRleCB3aXRoaW4gdGhlIHdpbmRvdyB0aGF0IHRoZSB2aWV3IGlzIGdvaW5nIHRvLCAtMSBpZiBpdCBpcworICAgICAqICAgICAgICBiZWluZyByZW1vdmVkCisgICAgICogQHBhcmFtIHZpZXcgVGhlIHZpZXcgdGhhdCBpcyBiZWluZyBhbmltYXRlZAorICAgICAqLworICAgIHZvaWQgYW5pbWF0ZVZpZXdGb3JUcmFuc2l0aW9uKGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBWaWV3IHZpZXcpIHsKKyAgICAgICAgaWYgKGZyb21JbmRleCA9PSAtMSkgeworICAgICAgICAgICAgbUluQW5pbWF0aW9uLnNldFRhcmdldCh2aWV3KTsKKyAgICAgICAgICAgIG1JbkFuaW1hdGlvbi5zdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKHRvSW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIG1PdXRBbmltYXRpb24uc2V0VGFyZ2V0KHZpZXcpOworICAgICAgICAgICAgbU91dEFuaW1hdGlvbi5zdGFydCgpOworICAgICAgICB9CisgICAgfQorCisgICAgT2JqZWN0QW5pbWF0b3I8Pz4gZ2V0RGVmYXVsdEluQW5pbWF0aW9uKCkgeworICAgICAgICByZXR1cm4gbmV3IE9iamVjdEFuaW1hdG9yPEZsb2F0PihERUZBVUxUX0FOSU1BVElPTl9EVVJBVElPTiwgbnVsbCwgImFscGhhIiwgMC4wZiwgMS4wZik7CisgICAgfQorCisgICAgT2JqZWN0QW5pbWF0b3I8Pz4gZ2V0RGVmYXVsdE91dEFuaW1hdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RBbmltYXRvcjxGbG9hdD4oREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT04sIG51bGwsICJhbHBoYSIsIDEuMGYsIDAuMGYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hpY2ggY2hpbGQgdmlldyB3aWxsIGJlIGRpc3BsYXllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3aGljaENoaWxkIHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdmlldyB0byBkaXNwbGF5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheWVkQ2hpbGQoaW50IHdoaWNoQ2hpbGQpIHsKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1XaGljaENoaWxkID0gd2hpY2hDaGlsZDsKKyAgICAgICAgICAgIGlmICh3aGljaENoaWxkID49IG1BZGFwdGVyLmdldENvdW50KCkpIHsKKyAgICAgICAgICAgICAgICBtV2hpY2hDaGlsZCA9IG1Mb29wVmlld3MgPyAwIDogbUFkYXB0ZXIuZ2V0Q291bnQoKSAtIDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoaWNoQ2hpbGQgPCAwKSB7CisgICAgICAgICAgICAgICAgbVdoaWNoQ2hpbGQgPSBtTG9vcFZpZXdzID8gbUFkYXB0ZXIuZ2V0Q291bnQoKSAtIDEgOiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sZWFuIGhhc0ZvY3VzID0gZ2V0Rm9jdXNlZENoaWxkKCkgIT0gbnVsbDsKKyAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBjbGVhciBvbGQgZm9jdXMgaWYgd2UgaGFkIGl0CisgICAgICAgICAgICBzaG93T25seShtV2hpY2hDaGlsZCk7CisgICAgICAgICAgICBpZiAoaGFzRm9jdXMpIHsKKyAgICAgICAgICAgICAgICAvLyBUcnkgdG8gcmV0YWtlIGZvY3VzIGlmIHdlIGhhZCBpdAorICAgICAgICAgICAgICAgIHJlcXVlc3RGb2N1cyhGT0NVU19GT1JXQVJEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRvIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4gVGhpcyBtZXRob2QgYXBwbGllcyBhIHZpZXcgLyBpbmRleCBzcGVjaWZpYworICAgICAqIHRyYW5zZm9ybSB0byB0aGUgY2hpbGQgdmlldy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGlsZAorICAgICAqIEBwYXJhbSByZWxhdGl2ZUluZGV4CisgICAgICovCisgICAgdm9pZCBhcHBseVRyYW5zZm9ybUZvckNoaWxkQXRJbmRleChWaWV3IGNoaWxkLCBpbnQgcmVsYXRpdmVJbmRleCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGNoaWxkIHZpZXcuCisgICAgICovCisgICAgcHVibGljIGludCBnZXREaXNwbGF5ZWRDaGlsZCgpIHsKKyAgICAgICAgcmV0dXJuIG1XaGljaENoaWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hbnVhbGx5IHNob3dzIHRoZSBuZXh0IGNoaWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3dOZXh0KCkgeworICAgICAgICBzZXREaXNwbGF5ZWRDaGlsZChtV2hpY2hDaGlsZCArIDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hbnVhbGx5IHNob3dzIHRoZSBwcmV2aW91cyBjaGlsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93UHJldmlvdXMoKSB7CisgICAgICAgIHNldERpc3BsYXllZENoaWxkKG1XaGljaENoaWxkIC0gMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2hvd3Mgb25seSB0aGUgc3BlY2lmaWVkIGNoaWxkLiBUaGUgb3RoZXIgZGlzcGxheXMgVmlld3MgZXhpdCB0aGUgc2NyZWVuLAorICAgICAqIG9wdGlvbmFsbHkgd2l0aCB0aGUgd2l0aCB0aGUge0BsaW5rICNnZXRPdXRBbmltYXRpb24oKSBvdXQgYW5pbWF0aW9ufSBhbmQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIGNoaWxkIGVudGVycyB0aGUgc2NyZWVuLCBvcHRpb25hbGx5IHdpdGggdGhlCisgICAgICoge0BsaW5rICNnZXRJbkFuaW1hdGlvbigpIGluIGFuaW1hdGlvbn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGRJbmRleCBUaGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIHNob3duLgorICAgICAqIEBwYXJhbSBhbmltYXRlIFdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgaW4gYW5kIG91dCBhbmltYXRpb25zLCBkZWZhdWx0cworICAgICAqICAgICAgICAgICAgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICB2b2lkIHNob3dPbmx5KGludCBjaGlsZEluZGV4LCBib29sZWFuIGFuaW1hdGUpIHsKKyAgICAgICAgc2hvd09ubHkoY2hpbGRJbmRleCwgYW5pbWF0ZSwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IG1vZHVsbyhpbnQgcG9zLCBpbnQgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiAoc2l6ZSArIChwb3MgJSBzaXplKSkgJSBzaXplOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZpZXcgYXQgdGhpcyBpbmRleCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3aW5kb3cncyBzdGFydAorICAgICAqCisgICAgICogQHBhcmFtIHJlbGF0aXZlSW5kZXggUG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd2luZG93J3Mgc3RhcnQKKyAgICAgKiBAcmV0dXJuIFZpZXcgYXQgdGhpcyBpbmRleCwgbnVsbCBpZiB0aGUgaW5kZXggaXMgb3V0c2lkZSB0aGUgYm91bmRzCisgICAgICovCisgICAgVmlldyBnZXRWaWV3QXRSZWxhdGl2ZUluZGV4KGludCByZWxhdGl2ZUluZGV4KSB7CisgICAgICAgIGlmIChyZWxhdGl2ZUluZGV4ID49IDAgJiYgcmVsYXRpdmVJbmRleCA8PSBtTnVtQWN0aXZlVmlld3MgLSAxICYmIG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBhZGFwdGVyQ291bnQgPSAgbUFkYXB0ZXIuZ2V0Q291bnQoKTsKKyAgICAgICAgICAgIGludCBpID0gbW9kdWxvKG1DdXJyZW50V2luZG93U3RhcnRVbmJvdW5kZWQgKyByZWxhdGl2ZUluZGV4LCBhZGFwdGVyQ291bnQpOworICAgICAgICAgICAgcmV0dXJuIG1WaWV3c01hcC5nZXQoaSkudmlldzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBMYXlvdXRQYXJhbXMgY3JlYXRlT3JSZXVzZUxheW91dFBhcmFtcyhWaWV3IHYpIHsKKyAgICAgICAgZmluYWwgVmlld0dyb3VwLkxheW91dFBhcmFtcyBjdXJyZW50THAgPSB2LmdldExheW91dFBhcmFtcygpOworICAgICAgICBpZiAoY3VycmVudExwIGluc3RhbmNlb2YgVmlld0dyb3VwLkxheW91dFBhcmFtcykgeworICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gKExheW91dFBhcmFtcykgY3VycmVudExwOworICAgICAgICAgICAgcmV0dXJuIGxwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcygwLCAwKTsKKyAgICB9CisKKyAgICB2b2lkIHJlZnJlc2hDaGlsZHJlbigpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IG1DdXJyZW50V2luZG93U3RhcnQ7IGkgPD0gbUN1cnJlbnRXaW5kb3dFbmQ7IGkrKykgeworICAgICAgICAgICAgaW50IGluZGV4ID0gbW9kdWxvKGksIG1OdW1BY3RpdmVWaWV3cyk7CisKKyAgICAgICAgICAgIC8vIGdldCB0aGUgZnJlc2ggY2hpbGQgZnJvbSB0aGUgYWRhcHRlcgorICAgICAgICAgICAgVmlldyB1cGRhdGVkQ2hpbGQgPSBtQWRhcHRlci5nZXRWaWV3KGksIG51bGwsIHRoaXMpOworCisgICAgICAgICAgICBpZiAobVZpZXdzTWFwLmNvbnRhaW5zS2V5KGluZGV4KSkgeworICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0IGZsID0gKEZyYW1lTGF5b3V0KSBtVmlld3NNYXAuZ2V0KGluZGV4KS52aWV3OworICAgICAgICAgICAgICAgIC8vIGZsdXNoIG91dCB0aGUgb2xkIGNoaWxkCisgICAgICAgICAgICAgICAgZmwucmVtb3ZlQWxsVmlld3NJbkxheW91dCgpOworICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgbmV3IGNoaWxkIHRvIHRoZSBmcmFtZSwgaWYgaXQgZXhpc3RzCisgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWRDaGlsZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZsLmFkZFZpZXcodXBkYXRlZENoaWxkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBzbyB0aGF0IHN1YmNsYXNzZXMgY2FuIHByb3ZpZGUgYSBjdXN0b20gZnJhbWUgaW4gd2hpY2ggdGhlaXIKKyAgICAgKiBjaGlsZHJlbiBjYW4gbGl2ZS4gRm9yIGV4YW1wbGUsIFN0YWNrVmlldyBhZGRzIHBhZGRpbmcgdG8gaXRzIGNoaWxkcmVucycgZnJhbWVzIHNvIGFzIHRvCisgICAgICogYWNjb21vZGF0ZSBmb3IgdGhlIGhpZ2hsaWdodCBlZmZlY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBGcmFtZUxheW91dCBpbnRvIHdoaWNoIGNoaWxkcmVuIGNhbiBiZSBwbGFjZWQuCisgICAgICovCisgICAgRnJhbWVMYXlvdXQgZ2V0RnJhbWVGb3JDaGlsZCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGcmFtZUxheW91dChtQ29udGV4dCk7CisgICAgfQorCisgICAgdm9pZCBzaG93T25seShpbnQgY2hpbGRJbmRleCwgYm9vbGVhbiBhbmltYXRlLCBib29sZWFuIG9uTGF5b3V0KSB7CisgICAgICAgIGlmIChtQWRhcHRlciA9PSBudWxsKSByZXR1cm47CisgICAgICAgIGZpbmFsIGludCBhZGFwdGVyQ291bnQgPSBtQWRhcHRlci5nZXRDb3VudCgpOworICAgICAgICBpZiAoYWRhcHRlckNvdW50ID09IDApIHJldHVybjsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1QcmV2aW91c1ZpZXdzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBWaWV3IHZpZXdUb1JlbW92ZSA9IG1WaWV3c01hcC5nZXQobVByZXZpb3VzVmlld3MuZ2V0KGkpKS52aWV3OworICAgICAgICAgICAgbVZpZXdzTWFwLnJlbW92ZShtUHJldmlvdXNWaWV3cy5nZXQoaSkpOworICAgICAgICAgICAgdmlld1RvUmVtb3ZlLmNsZWFyQW5pbWF0aW9uKCk7CisgICAgICAgICAgICBpZiAodmlld1RvUmVtb3ZlIGluc3RhbmNlb2YgVmlld0dyb3VwKSB7CisgICAgICAgICAgICAgICAgVmlld0dyb3VwIHZnID0gKFZpZXdHcm91cCkgdmlld1RvUmVtb3ZlOworICAgICAgICAgICAgICAgIHZnLnJlbW92ZUFsbFZpZXdzSW5MYXlvdXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGFwcGx5VHJhbnNmb3JtRm9yQ2hpbGRBdEluZGV4IGhlcmUganVzdCBhbGxvd3MgZm9yIGFueSBjbGVhbnVwCisgICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggdGhpcyB2aWV3IHRoYXQgbWF5IG5lZWQgdG8gYmUgZG9uZSBieSBhIHN1YmNsYXNzCisgICAgICAgICAgICBhcHBseVRyYW5zZm9ybUZvckNoaWxkQXRJbmRleCh2aWV3VG9SZW1vdmUsIC0xKTsKKworICAgICAgICAgICAgcmVtb3ZlVmlld0luTGF5b3V0KHZpZXdUb1JlbW92ZSk7CisgICAgICAgIH0KKyAgICAgICAgbVByZXZpb3VzVmlld3MuY2xlYXIoKTsKKyAgICAgICAgaW50IG5ld1dpbmRvd1N0YXJ0VW5ib3VuZGVkID0gY2hpbGRJbmRleCAtIG1BY3RpdmVPZmZzZXQ7CisgICAgICAgIGludCBuZXdXaW5kb3dFbmRVbmJvdW5kZWQgPSBuZXdXaW5kb3dTdGFydFVuYm91bmRlZCArIG1OdW1BY3RpdmVWaWV3cyAtIDE7CisgICAgICAgIGludCBuZXdXaW5kb3dTdGFydCA9IE1hdGgubWF4KDAsIG5ld1dpbmRvd1N0YXJ0VW5ib3VuZGVkKTsKKyAgICAgICAgaW50IG5ld1dpbmRvd0VuZCA9IE1hdGgubWluKGFkYXB0ZXJDb3VudCAtIDEsIG5ld1dpbmRvd0VuZFVuYm91bmRlZCk7CisKKyAgICAgICAgaWYgKG1Mb29wVmlld3MpIHsKKyAgICAgICAgICAgIG5ld1dpbmRvd1N0YXJ0ID0gbmV3V2luZG93U3RhcnRVbmJvdW5kZWQ7CisgICAgICAgICAgICBuZXdXaW5kb3dFbmQgPSBuZXdXaW5kb3dFbmRVbmJvdW5kZWQ7CisgICAgICAgIH0KKyAgICAgICAgaW50IHJhbmdlU3RhcnQgPSBtb2R1bG8obmV3V2luZG93U3RhcnQsIGFkYXB0ZXJDb3VudCk7CisgICAgICAgIGludCByYW5nZUVuZCA9IG1vZHVsbyhuZXdXaW5kb3dFbmQsIGFkYXB0ZXJDb3VudCk7CisKKyAgICAgICAgYm9vbGVhbiB3cmFwID0gZmFsc2U7CisgICAgICAgIGlmIChyYW5nZVN0YXJ0ID4gcmFuZ2VFbmQpIHsKKyAgICAgICAgICAgIHdyYXAgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBzZWN0aW9uIGNsZWFycyBvdXQgYW55IGl0ZW1zIHRoYXQgYXJlIGluIG91ciBhY3RpdmUgdmlld3MgbGlzdAorICAgICAgICAvLyBidXQgYXJlIG91dHNpZGUgdGhlIGVmZmVjdGl2ZSBib3VuZHMgb2Ygb3VyIHdpbmRvdyAodGhpcyBpcyBiZWNvbWVzIGFuIGlzc3VlCisgICAgICAgIC8vIGF0IHRoZSBleHRyZW1pdGllcyBvZiB0aGUgbGlzdCwgZWcuIHdoZXJlIG5ld1dpbmRvd1N0YXJ0VW5ib3VuZGVkIDwgMCBvcgorICAgICAgICAvLyBuZXdXaW5kb3dFbmRVbmJvdW5kZWQgPiBtQWRhcHRlci5nZXRDb3VudCgpIC0gMQorICAgICAgICBmb3IgKEludGVnZXIgaW5kZXggOiBtVmlld3NNYXAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVtb3ZlID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoIXdyYXAgJiYgKGluZGV4IDwgcmFuZ2VTdGFydCB8fCBpbmRleCA+IHJhbmdlRW5kKSkgeworICAgICAgICAgICAgICAgIHJlbW92ZSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdyYXAgJiYgKGluZGV4ID4gcmFuZ2VFbmQgJiYgaW5kZXggPCByYW5nZVN0YXJ0KSkgeworICAgICAgICAgICAgICAgIHJlbW92ZSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyZW1vdmUpIHsKKyAgICAgICAgICAgICAgICBWaWV3IHByZXZpb3VzVmlldyA9IG1WaWV3c01hcC5nZXQoaW5kZXgpLnZpZXc7CisgICAgICAgICAgICAgICAgaW50IG9sZFJlbGF0aXZlSW5kZXggPSBtVmlld3NNYXAuZ2V0KGluZGV4KS5pbmRleDsKKworICAgICAgICAgICAgICAgIG1QcmV2aW91c1ZpZXdzLmFkZChpbmRleCk7CisgICAgICAgICAgICAgICAgYW5pbWF0ZVZpZXdGb3JUcmFuc2l0aW9uKG9sZFJlbGF0aXZlSW5kZXgsIC0xLCBwcmV2aW91c1ZpZXcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlIHdpbmRvdyBoYXMgY2hhbmdlZAorICAgICAgICBpZiAoIShuZXdXaW5kb3dTdGFydCA9PSBtQ3VycmVudFdpbmRvd1N0YXJ0ICYmIG5ld1dpbmRvd0VuZCA9PSBtQ3VycmVudFdpbmRvd0VuZCkpIHsKKyAgICAgICAgICAgIC8vIFJ1biB0aHJvdWdoIHRoZSBpbmRpY2VzIGluIHRoZSBuZXcgcmFuZ2UKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBuZXdXaW5kb3dTdGFydDsgaSA8PSBuZXdXaW5kb3dFbmQ7IGkrKykgeworCisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbW9kdWxvKGksIGFkYXB0ZXJDb3VudCk7CisgICAgICAgICAgICAgICAgaW50IG9sZFJlbGF0aXZlSW5kZXg7CisgICAgICAgICAgICAgICAgaWYgKG1WaWV3c01hcC5jb250YWluc0tleShpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb2xkUmVsYXRpdmVJbmRleCA9IG1WaWV3c01hcC5nZXQoaW5kZXgpLmluZGV4OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9sZFJlbGF0aXZlSW5kZXggPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG5ld1JlbGF0aXZlSW5kZXggPSBpIC0gbmV3V2luZG93U3RhcnRVbmJvdW5kZWQ7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGl0ZW0gaXMgaW4gdGhlIGN1cnJlbnQgd2luZG93LCBncmVhdCwgd2UganVzdCBuZWVkIHRvIGFwcGx5CisgICAgICAgICAgICAgICAgLy8gdGhlIHRyYW5zZm9ybSBmb3IgaXQncyBuZXcgcmVsYXRpdmUgcG9zaXRpb24gaW4gdGhlIHdpbmRvdywgYW5kIGFuaW1hdGUKKyAgICAgICAgICAgICAgICAvLyBiZXR3ZWVuIGl0J3MgY3VycmVudCBhbmQgbmV3IHJlbGF0aXZlIHBvc2l0aW9ucworICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5PbGRSYW5nZSA9IG1WaWV3c01hcC5jb250YWluc0tleShpbmRleCkgJiYgIW1QcmV2aW91c1ZpZXdzLmNvbnRhaW5zKGluZGV4KTsKKworICAgICAgICAgICAgICAgIGlmIChpbk9sZFJhbmdlKSB7CisgICAgICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IG1WaWV3c01hcC5nZXQoaW5kZXgpLnZpZXc7CisgICAgICAgICAgICAgICAgICAgIG1WaWV3c01hcC5nZXQoaW5kZXgpLmluZGV4ID0gbmV3UmVsYXRpdmVJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgYXBwbHlUcmFuc2Zvcm1Gb3JDaGlsZEF0SW5kZXgodmlldywgbmV3UmVsYXRpdmVJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVWaWV3Rm9yVHJhbnNpdGlvbihvbGRSZWxhdGl2ZUluZGV4LCBuZXdSZWxhdGl2ZUluZGV4LCB2aWV3KTsKKworICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSB0aGlzIHZpZXcgaXMgbmV3IHRvIHRoZSB3aW5kb3cKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG5ldyB2aWV3IGZyb20gdGhlIGFkYXB0ZXIsIGFkZCBpdCBhbmQgYXBwbHkgYW55IHRyYW5zZm9ybSAvIGFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICBWaWV3IG5ld1ZpZXcgPSBtQWRhcHRlci5nZXRWaWV3KG1vZHVsbyhpLCBhZGFwdGVyQ291bnQpLCBudWxsLCB0aGlzKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBXZSB3cmFwIHRoZSBuZXcgdmlldyBpbiBhIEZyYW1lTGF5b3V0IHNvIGFzIHRvIHJlc3BlY3QgdGhlIGNvbnRyYWN0CisgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIGFkYXB0ZXIsIHRoYXQgaXMsIHRoYXQgd2UgZG9uJ3QgbW9kaWZ5IHRoaXMgdmlldyBkaXJlY3RseQorICAgICAgICAgICAgICAgICAgICBGcmFtZUxheW91dCBmbCA9IGdldEZyYW1lRm9yQ2hpbGQoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdmlldyBmcm9tIHRoZSBhZGFwdGVyIGlzIG51bGwsIHdlIHN0aWxsIGtlZXAgYW4gZW1wdHkgZnJhbWUgaW4gcGxhY2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICBmbC5hZGRWaWV3KG5ld1ZpZXcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1WaWV3c01hcC5wdXQoaW5kZXgsIG5ldyBWaWV3QW5kSW5kZXgoZmwsIG5ld1JlbGF0aXZlSW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkQ2hpbGQoZmwpOworICAgICAgICAgICAgICAgICAgICBhcHBseVRyYW5zZm9ybUZvckNoaWxkQXRJbmRleChmbCwgbmV3UmVsYXRpdmVJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVWaWV3Rm9yVHJhbnNpdGlvbigtMSwgbmV3UmVsYXRpdmVJbmRleCwgZmwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVmlld3NNYXAuZ2V0KGluZGV4KS52aWV3LmJyaW5nVG9Gcm9udCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1WaWV3c1RvQnJpbmdUb0Zyb250LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgVmlldyB2ID0gbVZpZXdzVG9CcmluZ1RvRnJvbnQuZ2V0KGkpOworICAgICAgICAgICAgICAgIHYuYnJpbmdUb0Zyb250KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVmlld3NUb0JyaW5nVG9Gcm9udC5jbGVhcigpOworCisgICAgICAgICAgICBtQ3VycmVudFdpbmRvd1N0YXJ0ID0gbmV3V2luZG93U3RhcnQ7CisgICAgICAgICAgICBtQ3VycmVudFdpbmRvd0VuZCA9IG5ld1dpbmRvd0VuZDsKKyAgICAgICAgICAgIG1DdXJyZW50V2luZG93U3RhcnRVbmJvdW5kZWQgPSBuZXdXaW5kb3dTdGFydFVuYm91bmRlZDsKKyAgICAgICAgfQorCisgICAgICAgIG1GaXJzdFRpbWUgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFvbkxheW91dCkgeworICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSWYgdGhlIEFkYXB0ZXIgdHJpZXMgdG8gbGF5b3V0IHRoZSBjdXJyZW50IHZpZXcgd2hlbiB3ZSBnZXQgaXQgdXNpbmcgZ2V0VmlldworICAgICAgICAgICAgLy8gYWJvdmUgdGhlIGxheW91dCB3aWxsIGVuZCB1cCBiZWluZyBpZ25vcmVkIHNpbmNlIHdlIGFyZSBjdXJyZW50bHkgbGF5aW5nIG91dCwgc28KKyAgICAgICAgICAgIC8vIHdlIHBvc3QgYSBkZWxheWVkIHJlcXVlc3RMYXlvdXQgYW5kIGludmFsaWRhdGUKKyAgICAgICAgICAgIG1NYWluUXVldWUucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRDaGlsZChWaWV3IGNoaWxkKSB7CisgICAgICAgIGFkZFZpZXdJbkxheW91dChjaGlsZCwgLTEsIGNyZWF0ZU9yUmV1c2VMYXlvdXRQYXJhbXMoY2hpbGQpKTsKKworICAgICAgICAvLyBUaGlzIGNvZGUgaXMgdXNlZCB0byBvYnRhaW4gYSByZWZlcmVuY2Ugd2lkdGggYW5kIGhlaWdodCBvZiBhIGNoaWxkIGluIGNhc2Ugd2UgbmVlZAorICAgICAgICAvLyB0byBkZWNpZGUgb3VyIG93biBzaXplLiBUT0RPOiBEbyB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgY2hpbGQgdGhhdCB3ZSdyZQorICAgICAgICAvLyB1c2luZyBmb3IgcmVmZXJlbmNlIHNpemU/IElmIHNvLCB3aGVuPworICAgICAgICBpZiAobVJlZmVyZW5jZUNoaWxkV2lkdGggPT0gLTEgfHwgbVJlZmVyZW5jZUNoaWxkSGVpZ2h0ID09IC0xKSB7CisgICAgICAgICAgICBpbnQgbWVhc3VyZVNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoMCwgTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQpOworICAgICAgICAgICAgY2hpbGQubWVhc3VyZShtZWFzdXJlU3BlYywgbWVhc3VyZVNwZWMpOworICAgICAgICAgICAgbVJlZmVyZW5jZUNoaWxkV2lkdGggPSBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgICAgICBtUmVmZXJlbmNlQ2hpbGRIZWlnaHQgPSBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1lYXN1cmVDaGlsZHJlbigpIHsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmaW5hbCBpbnQgY2hpbGRXaWR0aCA9IG1NZWFzdXJlZFdpZHRoIC0gbVBhZGRpbmdMZWZ0IC0gbVBhZGRpbmdSaWdodDsKKyAgICAgICAgZmluYWwgaW50IGNoaWxkSGVpZ2h0ID0gbU1lYXN1cmVkSGVpZ2h0IC0gbVBhZGRpbmdUb3AgLSBtUGFkZGluZ0JvdHRvbTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgY2hpbGQubWVhc3VyZShNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY2hpbGRXaWR0aCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSksCisgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhjaGlsZEhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKKyAgICAgICAgaW50IHdpZHRoU3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOworICAgICAgICBpbnQgaGVpZ2h0U3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgZmluYWwgaW50IHdpZHRoU3BlY01vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKHdpZHRoTWVhc3VyZVNwZWMpOworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0U3BlY01vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKGhlaWdodE1lYXN1cmVTcGVjKTsKKworICAgICAgICBib29sZWFuIGhhdmVDaGlsZFJlZlNpemUgPSAobVJlZmVyZW5jZUNoaWxkV2lkdGggIT0gLTEgJiYgbVJlZmVyZW5jZUNoaWxkSGVpZ2h0ICE9IC0xKTsKKworICAgICAgICAvLyBXZSBuZWVkIHRvIGRlYWwgd2l0aCB0aGUgY2FzZSB3aGVyZSBvdXIgcGFyZW50IGhhc24ndCB0b2xkIHVzIGhvdworICAgICAgICAvLyBiaWcgd2Ugc2hvdWxkIGJlLiBJbiB0aGlzIGNhc2Ugd2UgdHJ5IHRvIHVzZSB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSBmaXJzdAorICAgICAgICAvLyBjaGlsZCBhZGRlZC4KKyAgICAgICAgaWYgKGhlaWdodFNwZWNNb2RlID09IE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKSB7CisgICAgICAgICAgICBoZWlnaHRTcGVjU2l6ZSA9IGhhdmVDaGlsZFJlZlNpemUgPyBtUmVmZXJlbmNlQ2hpbGRIZWlnaHQgKyBtUGFkZGluZ1RvcCArCisgICAgICAgICAgICAgICAgICAgIG1QYWRkaW5nQm90dG9tIDogMDsKKyAgICAgICAgfSBlbHNlIGlmIChoZWlnaHRTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5BVF9NT1NUKSB7CisgICAgICAgICAgICBoZWlnaHRTcGVjU2l6ZSA9IGhhdmVDaGlsZFJlZlNpemUgPyBNYXRoLm1pbihtUmVmZXJlbmNlQ2hpbGRIZWlnaHQgKyBtUGFkZGluZ1RvcCArCisgICAgICAgICAgICAgICAgICAgIG1QYWRkaW5nQm90dG9tLCBoZWlnaHRTcGVjU2l6ZSkgOiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdpZHRoU3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgICAgIHdpZHRoU3BlY1NpemUgPSBoYXZlQ2hpbGRSZWZTaXplID8gbVJlZmVyZW5jZUNoaWxkV2lkdGggKyBtUGFkZGluZ0xlZnQgKworICAgICAgICAgICAgICAgICAgICBtUGFkZGluZ1JpZ2h0IDogMDsKKyAgICAgICAgfSBlbHNlIGlmIChoZWlnaHRTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5BVF9NT1NUKSB7CisgICAgICAgICAgICB3aWR0aFNwZWNTaXplID0gaGF2ZUNoaWxkUmVmU2l6ZSA/IE1hdGgubWluKG1SZWZlcmVuY2VDaGlsZFdpZHRoICsgbVBhZGRpbmdMZWZ0ICsKKyAgICAgICAgICAgICAgICAgICAgbVBhZGRpbmdSaWdodCwgd2lkdGhTcGVjU2l6ZSkgOiAwOworICAgICAgICB9CisKKyAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24od2lkdGhTcGVjU2l6ZSwgaGVpZ2h0U3BlY1NpemUpOworICAgICAgICBtZWFzdXJlQ2hpbGRyZW4oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKKyAgICAgICAgYm9vbGVhbiBkYXRhQ2hhbmdlZCA9IG1EYXRhQ2hhbmdlZDsKKyAgICAgICAgaWYgKGRhdGFDaGFuZ2VkKSB7CisgICAgICAgICAgICBoYW5kbGVEYXRhQ2hhbmdlZCgpOworCisgICAgICAgICAgICAvLyBpZiB0aGUgZGF0YSBjaGFuZ2VzLCBtV2hpY2hDaGlsZCBtaWdodCBiZSBvdXQgb2YgdGhlIGJvdW5kcyBvZiB0aGUgYWRhcHRlcgorICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlLCB3ZSByZXNldCBtV2hpY2hDaGlsZCB0byB0aGUgYmVnaW5uaW5nCisgICAgICAgICAgICBpZiAobVdoaWNoQ2hpbGQgPj0gbUFkYXB0ZXIuZ2V0Q291bnQoKSkgeworICAgICAgICAgICAgICAgIG1XaGljaENoaWxkID0gMDsKKworICAgICAgICAgICAgICAgIHNob3dPbmx5KG1XaGljaENoaWxkLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlZnJlc2hDaGlsZHJlbigpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKKworICAgICAgICAgICAgaW50IGNoaWxkUmlnaHQgPSBtUGFkZGluZ0xlZnQgKyBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgICAgICBpbnQgY2hpbGRCb3R0b20gPSBtUGFkZGluZ1RvcCArIGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCk7CisKKyAgICAgICAgICAgIGNoaWxkLmxheW91dChtUGFkZGluZ0xlZnQsIG1QYWRkaW5nVG9wLCBjaGlsZFJpZ2h0LCBjaGlsZEJvdHRvbSk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFDaGFuZ2VkID0gZmFsc2U7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFNhdmVkU3RhdGUgZXh0ZW5kcyBCYXNlU2F2ZWRTdGF0ZSB7CisgICAgICAgIGludCB3aGljaENoaWxkOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RvciBjYWxsZWQgZnJvbSB7QGxpbmsgQWRhcHRlclZpZXdBbmltYXRvciNvblNhdmVJbnN0YW5jZVN0YXRlKCl9CisgICAgICAgICAqLworICAgICAgICBTYXZlZFN0YXRlKFBhcmNlbGFibGUgc3VwZXJTdGF0ZSwgaW50IHdoaWNoQ2hpbGQpIHsKKyAgICAgICAgICAgIHN1cGVyKHN1cGVyU3RhdGUpOworICAgICAgICAgICAgdGhpcy53aGljaENoaWxkID0gd2hpY2hDaGlsZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RvciBjYWxsZWQgZnJvbSB7QGxpbmsgI0NSRUFUT1J9CisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFNhdmVkU3RhdGUoUGFyY2VsIGluKSB7CisgICAgICAgICAgICBzdXBlcihpbik7CisgICAgICAgICAgICB0aGlzLndoaWNoQ2hpbGQgPSBpbi5yZWFkSW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgb3V0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIHN1cGVyLndyaXRlVG9QYXJjZWwob3V0LCBmbGFncyk7CisgICAgICAgICAgICBvdXQud3JpdGVJbnQodGhpcy53aGljaENoaWxkKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJBZGFwdGVyVmlld0FuaW1hdG9yLlNhdmVkU3RhdGV7IHdoaWNoQ2hpbGQgPSAiICsgdGhpcy53aGljaENoaWxkICsgIiB9IjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPFNhdmVkU3RhdGU+IENSRUFUT1IKKyAgICAgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4oKSB7CisgICAgICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZShpbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhdmVkU3RhdGVbc2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFBhcmNlbGFibGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpIHsKKyAgICAgICAgUGFyY2VsYWJsZSBzdXBlclN0YXRlID0gc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZSgpOworICAgICAgICByZXR1cm4gbmV3IFNhdmVkU3RhdGUoc3VwZXJTdGF0ZSwgbVdoaWNoQ2hpbGQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoUGFyY2VsYWJsZSBzdGF0ZSkgeworICAgICAgICBTYXZlZFN0YXRlIHNzID0gKFNhdmVkU3RhdGUpIHN0YXRlOworICAgICAgICBzdXBlci5vblJlc3RvcmVJbnN0YW5jZVN0YXRlKHNzLmdldFN1cGVyU3RhdGUoKSk7CisKKyAgICAgICAgLy8gSGVyZSB3ZSBzZXQgbVdoaWNoQ2hpbGQgaW4gYWRkaXRpb24gdG8gc2V0RGlzcGxheWVkQ2hpbGQKKyAgICAgICAgLy8gV2UgZG8gdGhlIGZvcm1lciBpbiBjYXNlIG1BZGFwdGVyIGlzIG51bGwsIGFuZCBoZW5jZSBzZXREaXNwbGF5ZWRDaGlsZCB3b24ndAorICAgICAgICAvLyBzZXQgbVdoaWNoQ2hpbGQKKyAgICAgICAgbVdoaWNoQ2hpbGQgPSBzcy53aGljaENoaWxkOworICAgICAgICBzZXREaXNwbGF5ZWRDaGlsZChtV2hpY2hDaGlsZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2hvd3Mgb25seSB0aGUgc3BlY2lmaWVkIGNoaWxkLiBUaGUgb3RoZXIgZGlzcGxheXMgVmlld3MgZXhpdCB0aGUgc2NyZWVuCisgICAgICogd2l0aCB0aGUge0BsaW5rICNnZXRPdXRBbmltYXRpb24oKSBvdXQgYW5pbWF0aW9ufSBhbmQgdGhlIHNwZWNpZmllZCBjaGlsZAorICAgICAqIGVudGVycyB0aGUgc2NyZWVuIHdpdGggdGhlIHtAbGluayAjZ2V0SW5BbmltYXRpb24oKSBpbiBhbmltYXRpb259LgorICAgICAqCisgICAgICogQHBhcmFtIGNoaWxkSW5kZXggVGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBzaG93bi4KKyAgICAgKi8KKyAgICB2b2lkIHNob3dPbmx5KGludCBjaGlsZEluZGV4KSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gYW5pbWF0ZSA9ICghbUZpcnN0VGltZSB8fCBtQW5pbWF0ZUZpcnN0VGltZSk7CisgICAgICAgIHNob3dPbmx5KGNoaWxkSW5kZXgsIGFuaW1hdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFZpZXcgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBjaGlsZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIFZpZXcgY3VycmVudGx5IGRpc3BsYXllZC4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldERpc3BsYXllZENoaWxkKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgVmlldyBnZXRDdXJyZW50VmlldygpIHsKKyAgICAgICAgcmV0dXJuIGdldFZpZXdBdFJlbGF0aXZlSW5kZXgobUFjdGl2ZU9mZnNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBhbmltYXRpb24gdXNlZCB0byBhbmltYXRlIGEgVmlldyB0aGF0IGVudGVycyB0aGUgc2NyZWVuLgorICAgICAqCisgICAgICogQHJldHVybiBBbiBBbmltYXRpb24gb3IgbnVsbCBpZiBub25lIGlzIHNldC4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldEluQW5pbWF0aW9uKGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uKQorICAgICAqIEBzZWUgI3NldEluQW5pbWF0aW9uKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQpCisgICAgICovCisgICAgcHVibGljIE9iamVjdEFuaW1hdG9yPD8+IGdldEluQW5pbWF0aW9uKCkgeworICAgICAgICByZXR1cm4gbUluQW5pbWF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgYW5pbWF0aW9uIHVzZWQgdG8gYW5pbWF0ZSBhIFZpZXcgdGhhdCBlbnRlcnMgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbkFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIHN0YXJ0ZWQgd2hlbiBhIFZpZXcgZW50ZXJzIHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRJbkFuaW1hdGlvbigpCisgICAgICogQHNlZSAjc2V0SW5BbmltYXRpb24oYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbkFuaW1hdGlvbihPYmplY3RBbmltYXRvcjw/PiBpbkFuaW1hdGlvbikgeworICAgICAgICBtSW5BbmltYXRpb24gPSBpbkFuaW1hdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFuaW1hdGlvbiB1c2VkIHRvIGFuaW1hdGUgYSBWaWV3IHRoYXQgZXhpdHMgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQW4gQW5pbWF0aW9uIG9yIG51bGwgaWYgbm9uZSBpcyBzZXQuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRPdXRBbmltYXRpb24oYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24pCisgICAgICogQHNlZSAjc2V0T3V0QW5pbWF0aW9uKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQpCisgICAgICovCisgICAgcHVibGljIE9iamVjdEFuaW1hdG9yPD8+IGdldE91dEFuaW1hdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1PdXRBbmltYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBhbmltYXRpb24gdXNlZCB0byBhbmltYXRlIGEgVmlldyB0aGF0IGV4aXQgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRBbmltYXRpb24gVGhlIGFuaW1hdGlvbiBzdGFydGVkIHdoZW4gYSBWaWV3IGV4aXQgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldE91dEFuaW1hdGlvbigpCisgICAgICogQHNlZSAjc2V0T3V0QW5pbWF0aW9uKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0QW5pbWF0aW9uKE9iamVjdEFuaW1hdG9yPD8+IG91dEFuaW1hdGlvbikgeworICAgICAgICBtT3V0QW5pbWF0aW9uID0gb3V0QW5pbWF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgYW5pbWF0aW9uIHVzZWQgdG8gYW5pbWF0ZSBhIFZpZXcgdGhhdCBlbnRlcnMgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50LgorICAgICAqIEBwYXJhbSByZXNvdXJjZUlEIFRoZSByZXNvdXJjZSBpZCBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0SW5BbmltYXRpb24oKQorICAgICAqIEBzZWUgI3NldEluQW5pbWF0aW9uKGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluQW5pbWF0aW9uKENvbnRleHQgY29udGV4dCwgaW50IHJlc291cmNlSUQpIHsKKyAgICAgICAgc2V0SW5BbmltYXRpb24oKE9iamVjdEFuaW1hdG9yPD8+KSBBbmltYXRvckluZmxhdGVyLmxvYWRBbmltYXRvcihjb250ZXh0LCByZXNvdXJjZUlEKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBhbmltYXRpb24gdXNlZCB0byBhbmltYXRlIGEgVmlldyB0aGF0IGV4aXQgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50LgorICAgICAqIEBwYXJhbSByZXNvdXJjZUlEIFRoZSByZXNvdXJjZSBpZCBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0T3V0QW5pbWF0aW9uKCkKKyAgICAgKiBAc2VlICNzZXRPdXRBbmltYXRpb24oYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24pCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0QW5pbWF0aW9uKENvbnRleHQgY29udGV4dCwgaW50IHJlc291cmNlSUQpIHsKKyAgICAgICAgc2V0T3V0QW5pbWF0aW9uKChPYmplY3RBbmltYXRvcjw/PikgQW5pbWF0b3JJbmZsYXRlci5sb2FkQW5pbWF0b3IoY29udGV4dCwgcmVzb3VyY2VJRCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXJyZW50IFZpZXcgc2hvdWxkIGJlIGFuaW1hdGVkIHRoZSBmaXJzdCB0aW1lCisgICAgICogdGhlIFZpZXdBbmltYXRpb24gaXMgZGlzcGxheWVkLgorICAgICAqCisgICAgICogQHBhcmFtIGFuaW1hdGUgVHJ1ZSB0byBhbmltYXRlIHRoZSBjdXJyZW50IFZpZXcgdGhlIGZpcnN0IHRpbWUgaXQgaXMgZGlzcGxheWVkLAorICAgICAqICAgICAgICAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbmltYXRlRmlyc3RWaWV3KGJvb2xlYW4gYW5pbWF0ZSkgeworICAgICAgICBtQW5pbWF0ZUZpcnN0VGltZSA9IGFuaW1hdGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRCYXNlbGluZSgpIHsKKyAgICAgICAgcmV0dXJuIChnZXRDdXJyZW50VmlldygpICE9IG51bGwpID8gZ2V0Q3VycmVudFZpZXcoKS5nZXRCYXNlbGluZSgpIDogc3VwZXIuZ2V0QmFzZWxpbmUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWRhcHRlciBnZXRBZGFwdGVyKCkgeworICAgICAgICByZXR1cm4gbUFkYXB0ZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwgJiYgbURhdGFTZXRPYnNlcnZlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQWRhcHRlci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOworICAgICAgICB9CisKKyAgICAgICAgbUFkYXB0ZXIgPSBhZGFwdGVyOworICAgICAgICBjaGVja0ZvY3VzKCk7CisKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EYXRhU2V0T2JzZXJ2ZXIgPSBuZXcgQWRhcHRlckRhdGFTZXRPYnNlcnZlcigpOworICAgICAgICAgICAgbUFkYXB0ZXIucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CisgICAgICAgIH0KKyAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhpcyBBZGFwdGVyVmlld0FuaW1hdG9yIHRvIHVzZSBhIHJlbW90ZSB2aWV3cyBhZGFwdGVyIHdoaWNoIGNvbm5lY3RzIHRvIGEKKyAgICAgKiBSZW1vdGVWaWV3c1NlcnZpY2UgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGludGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlbnQgdGhlIGludGVudCB1c2VkIHRvIGlkZW50aWZ5IHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UgZm9yIHRoZSBhZGFwdGVyIHRvCisgICAgICogICAgICAgIGNvbm5lY3QgdG8uCisgICAgICovCisgICAgQGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlVmlld3NBZGFwdGVyKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGEgUmVtb3RlVmlld3NBZGFwdGVyIHRoYXQgaXMgYm91bmQgdG8gYW4gZXhpc3RpbmcKKyAgICAgICAgLy8gc2VydmljZSBoYW5kbGluZyB0aGUgc3BlY2lmaWVkIGludGVudC4KKyAgICAgICAgaWYgKG1SZW1vdGVWaWV3c0FkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgSW50ZW50LkZpbHRlckNvbXBhcmlzb24gZmNOZXcgPSBuZXcgSW50ZW50LkZpbHRlckNvbXBhcmlzb24oaW50ZW50KTsKKyAgICAgICAgICAgIEludGVudC5GaWx0ZXJDb21wYXJpc29uIGZjT2xkID0gbmV3IEludGVudC5GaWx0ZXJDb21wYXJpc29uKAorICAgICAgICAgICAgICAgICAgICBtUmVtb3RlVmlld3NBZGFwdGVyLmdldFJlbW90ZVZpZXdzU2VydmljZUludGVudCgpKTsKKyAgICAgICAgICAgIGlmIChmY05ldy5lcXVhbHMoZmNPbGQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgYSBuZXcgUmVtb3RlVmlld3NBZGFwdGVyIGZvciBiaW5kaW5nCisgICAgICAgIG1SZW1vdGVWaWV3c0FkYXB0ZXIgPSBuZXcgUmVtb3RlVmlld3NBZGFwdGVyKGdldENvbnRleHQoKSwgaW50ZW50LCB0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIHNldERpc3BsYXllZENoaWxkKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBnZXRTZWxlY3RlZFZpZXcoKSB7CisgICAgICAgIHJldHVybiBnZXRWaWV3QXRSZWxhdGl2ZUluZGV4KG1BY3RpdmVPZmZzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBiYWNrIHdoZW4gdGhlIGFkYXB0ZXIgY29ubmVjdHMgdG8gdGhlIFJlbW90ZVZpZXdzU2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblJlbW90ZUFkYXB0ZXJDb25uZWN0ZWQoKSB7CisgICAgICAgIGlmIChtUmVtb3RlVmlld3NBZGFwdGVyICE9IG1BZGFwdGVyKSB7CisgICAgICAgICAgICBzZXRBZGFwdGVyKG1SZW1vdGVWaWV3c0FkYXB0ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJhY2sgd2hlbiB0aGUgYWRhcHRlciBkaXNjb25uZWN0cyBmcm9tIHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25SZW1vdGVBZGFwdGVyRGlzY29ubmVjdGVkKCkgeworICAgICAgICBpZiAobVJlbW90ZVZpZXdzQWRhcHRlciAhPSBtQWRhcHRlcikgeworICAgICAgICAgICAgbVJlbW90ZVZpZXdzQWRhcHRlciA9IG51bGw7CisgICAgICAgICAgICBzZXRBZGFwdGVyKG1SZW1vdGVWaWV3c0FkYXB0ZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3RmxpcHBlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3RmxpcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOWFkZTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXdGbGlwcGVyLmphdmEKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2Q7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbHBoYUFuaW1hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cy5SZW1vdGVWaWV3OworCisvKioKKyAqIFNpbXBsZSB7QGxpbmsgVmlld0FuaW1hdG9yfSB0aGF0IHdpbGwgYW5pbWF0ZSBiZXR3ZWVuIHR3byBvciBtb3JlIHZpZXdzCisgKiB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byBpdC4gIE9ubHkgb25lIGNoaWxkIGlzIHNob3duIGF0IGEgdGltZS4gIElmCisgKiByZXF1ZXN0ZWQsIGNhbiBhdXRvbWF0aWNhbGx5IGZsaXAgYmV0d2VlbiBlYWNoIGNoaWxkIGF0IGEgcmVndWxhciBpbnRlcnZhbC4KKyAqCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBZGFwdGVyVmlld0ZsaXBwZXJfZmxpcEludGVydmFsCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBZGFwdGVyVmlld0ZsaXBwZXJfYXV0b1N0YXJ0CisgKi8KK0BSZW1vdGVWaWV3CitwdWJsaWMgY2xhc3MgQWRhcHRlclZpZXdGbGlwcGVyIGV4dGVuZHMgQWRhcHRlclZpZXdBbmltYXRvciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJWaWV3RmxpcHBlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0dEID0gZmFsc2U7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9JTlRFUlZBTCA9IDEwMDAwOworCisgICAgcHJpdmF0ZSBpbnQgbUZsaXBJbnRlcnZhbCA9IERFRkFVTFRfSU5URVJWQUw7CisgICAgcHJpdmF0ZSBib29sZWFuIG1BdXRvU3RhcnQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtUnVubmluZyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhcnRlZCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtVmlzaWJsZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtVXNlclByZXNlbnQgPSB0cnVlOworCisgICAgcHVibGljIEFkYXB0ZXJWaWV3RmxpcHBlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgfQorCisgICAgcHVibGljIEFkYXB0ZXJWaWV3RmxpcHBlcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisKKyAgICAgICAgVHlwZWRBcnJheSBhID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdGbGlwcGVyKTsKKyAgICAgICAgbUZsaXBJbnRlcnZhbCA9IGEuZ2V0SW50KAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdGbGlwcGVyX2ZsaXBJbnRlcnZhbCwgREVGQVVMVF9JTlRFUlZBTCk7CisgICAgICAgIG1BdXRvU3RhcnQgPSBhLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld0ZsaXBwZXJfYXV0b1N0YXJ0LCBmYWxzZSk7CisKKyAgICAgICAgLy8gQnkgZGVmYXVsdCB3ZSB3YW50IHRoZSBmbGlwcGVyIHRvIGxvb3AKKyAgICAgICAgbUxvb3BWaWV3cyA9IGEuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BZGFwdGVyVmlld0FuaW1hdG9yX2xvb3BWaWV3cywgdHJ1ZSk7CisKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBCcm9hZGNhc3RSZWNlaXZlciBtUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOworICAgICAgICAgICAgaWYgKEludGVudC5BQ1RJT05fU0NSRUVOX09GRi5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIG1Vc2VyUHJlc2VudCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoSW50ZW50LkFDVElPTl9VU0VSX1BSRVNFTlQuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgICAgICBtVXNlclByZXNlbnQgPSB0cnVlOworICAgICAgICAgICAgICAgIHVwZGF0ZVJ1bm5pbmcoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKKyAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7CisKKyAgICAgICAgLy8gTGlzdGVuIGZvciBicm9hZGNhc3RzIHJlbGF0ZWQgdG8gdXNlci1wcmVzZW5jZQorICAgICAgICBmaW5hbCBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fU0NSRUVOX09GRik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9VU0VSX1BSRVNFTlQpOworICAgICAgICBnZXRDb250ZXh0KCkucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGZpbHRlcik7CisKKyAgICAgICAgaWYgKG1BdXRvU3RhcnQpIHsKKyAgICAgICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgc3RhcnQgd2hlbiByZXF1ZXN0ZWQKKyAgICAgICAgICAgIHN0YXJ0RmxpcHBpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOworICAgICAgICBtVmlzaWJsZSA9IGZhbHNlOworCisgICAgICAgIGdldENvbnRleHQoKS51bnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyKTsKKyAgICAgICAgdXBkYXRlUnVubmluZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uV2luZG93VmlzaWJpbGl0eUNoYW5nZWQoaW50IHZpc2liaWxpdHkpIHsKKyAgICAgICAgc3VwZXIub25XaW5kb3dWaXNpYmlsaXR5Q2hhbmdlZCh2aXNpYmlsaXR5KTsKKyAgICAgICAgbVZpc2libGUgPSAodmlzaWJpbGl0eSA9PSBWSVNJQkxFKTsKKyAgICAgICAgdXBkYXRlUnVubmluZyhmYWxzZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgc3VwZXIuc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICAgICAgdXBkYXRlUnVubmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIGZsaXBwaW5nIHRvIHRoZSBuZXh0IHZpZXcKKyAgICAgKgorICAgICAqIEBwYXJhbSBtaWxsaXNlY29uZHMKKyAgICAgKiAgICAgICAgICAgIHRpbWUgaW4gbWlsbGlzZWNvbmRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmxpcEludGVydmFsKGludCBtaWxsaXNlY29uZHMpIHsKKyAgICAgICAgbUZsaXBJbnRlcnZhbCA9IG1pbGxpc2Vjb25kczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBhIHRpbWVyIHRvIGN5Y2xlIHRocm91Z2ggY2hpbGQgdmlld3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEZsaXBwaW5nKCkgeworICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBObyBtb3JlIGZsaXBzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcEZsaXBwaW5nKCkgeworICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgICAgICB1cGRhdGVSdW5uaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgKiB7QGluaGVyaXREb2N9CisgICAgKi8KKyAgIEBPdmVycmlkZQorICAgQFJlbW90YWJsZVZpZXdNZXRob2QKKyAgIHB1YmxpYyB2b2lkIHNob3dOZXh0KCkgeworICAgICAgIC8vIGlmIHRoZSBmbGlwcGVyIGlzIGN1cnJlbnRseSBmbGlwcGluZyBhdXRvbWF0aWNhbGx5LCBhbmQgc2hvd05leHQoKSBpcyBjYWxsZWQKKyAgICAgICAvLyB3ZSBzaG91bGQgd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0byByZXNldCB0aGUgdGltZXIKKyAgICAgICBpZiAobVJ1bm5pbmcpIHsKKyAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoRkxJUF9NU0cpOworICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRkxJUF9NU0cpOworICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCBtRmxpcEludGVydmFsKTsKKyAgICAgICB9CisgICAgICAgc3VwZXIuc2hvd05leHQoKTsKKyAgIH0KKworICAgLyoqCisgICAgKiB7QGluaGVyaXREb2N9CisgICAgKi8KKyAgIEBPdmVycmlkZQorICAgQFJlbW90YWJsZVZpZXdNZXRob2QKKyAgIHB1YmxpYyB2b2lkIHNob3dQcmV2aW91cygpIHsKKyAgICAgICAvLyBpZiB0aGUgZmxpcHBlciBpcyBjdXJyZW50bHkgZmxpcHBpbmcgYXV0b21hdGljYWxseSwgYW5kIHNob3dQcmV2aW91cygpIGlzIGNhbGxlZAorICAgICAgIC8vIHdlIHNob3VsZCB3ZSBzaG91bGQgbWFrZSBzdXJlIHRvIHJlc2V0IHRoZSB0aW1lcgorICAgICAgIGlmIChtUnVubmluZykgeworICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhGTElQX01TRyk7CisgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZShGTElQX01TRyk7CisgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtc2csIG1GbGlwSW50ZXJ2YWwpOworICAgICAgIH0KKyAgICAgICBzdXBlci5zaG93UHJldmlvdXMoKTsKKyAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIG1ldGhvZCB0byBzdGFydCBvciBzdG9wIGRpc3BhdGNoaW5nIGZsaXAge0BsaW5rIE1lc3NhZ2V9IGJhc2VkCisgICAgICogb24ge0BsaW5rICNtUnVubmluZ30gYW5kIHtAbGluayAjbVZpc2libGV9IHN0YXRlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSdW5uaW5nKCkgeworICAgICAgICAvLyBieSBkZWZhdWx0IHdoZW4gd2UgdXBkYXRlIHJ1bm5pbmcsIHdlIHdhbnQgdGhlCisgICAgICAgIC8vIGN1cnJlbnQgdmlldyB0byBhbmltYXRlIGluCisgICAgICAgIHVwZGF0ZVJ1bm5pbmcodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgbWV0aG9kIHRvIHN0YXJ0IG9yIHN0b3AgZGlzcGF0Y2hpbmcgZmxpcCB7QGxpbmsgTWVzc2FnZX0gYmFzZWQKKyAgICAgKiBvbiB7QGxpbmsgI21SdW5uaW5nfSBhbmQge0BsaW5rICNtVmlzaWJsZX0gc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmxpcE5vdyBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRvIGV4ZWN1dGUgdGhlIGFuaW1hdGlvbiBub3csIGluCisgICAgICogICAgICAgICAgICBhZGRpdGlvbiB0byBxdWV1aW5nIGZ1dHVyZSBmbGlwcy4gSWYgb21pdHRlZCwgZGVmYXVsdHMgdG8KKyAgICAgKiAgICAgICAgICAgIHRydWUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJ1bm5pbmcoYm9vbGVhbiBmbGlwTm93KSB7CisgICAgICAgIGJvb2xlYW4gcnVubmluZyA9IG1WaXNpYmxlICYmIG1TdGFydGVkICYmIG1Vc2VyUHJlc2VudCAmJiBtQWRhcHRlciAhPSBudWxsOworICAgICAgICBpZiAocnVubmluZyAhPSBtUnVubmluZykgeworICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICBzaG93T25seShtV2hpY2hDaGlsZCwgZmxpcE5vdyk7CisgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKEZMSVBfTVNHKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCBtRmxpcEludGVydmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoRkxJUF9NU0cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJ1bm5pbmcgPSBydW5uaW5nOworICAgICAgICB9CisgICAgICAgIGlmIChMT0dEKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJ1cGRhdGVSdW5uaW5nKCkgbVZpc2libGU9IiArIG1WaXNpYmxlICsgIiwgbVN0YXJ0ZWQ9IiArIG1TdGFydGVkCisgICAgICAgICAgICAgICAgICAgICsgIiwgbVVzZXJQcmVzZW50PSIgKyBtVXNlclByZXNlbnQgKyAiLCBtUnVubmluZz0iICsgbVJ1bm5pbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjaGlsZCB2aWV3cyBhcmUgZmxpcHBpbmcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGbGlwcGluZygpIHsKKyAgICAgICAgcmV0dXJuIG1TdGFydGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBpZiB0aGlzIHZpZXcgYXV0b21hdGljYWxseSBjYWxscyB7QGxpbmsgI3N0YXJ0RmxpcHBpbmcoKX0gd2hlbiBpdAorICAgICAqIGJlY29tZXMgYXR0YWNoZWQgdG8gYSB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXV0b1N0YXJ0KGJvb2xlYW4gYXV0b1N0YXJ0KSB7CisgICAgICAgIG1BdXRvU3RhcnQgPSBhdXRvU3RhcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmlldyBhdXRvbWF0aWNhbGx5IGNhbGxzIHtAbGluayAjc3RhcnRGbGlwcGluZygpfQorICAgICAqIHdoZW4gaXQgYmVjb21lcyBhdHRhY2hlZCB0byBhIHdpbmRvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0F1dG9TdGFydCgpIHsKKyAgICAgICAgcmV0dXJuIG1BdXRvU3RhcnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgRkxJUF9NU0cgPSAxOworCisgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBpZiAobXNnLndoYXQgPT0gRkxJUF9NU0cpIHsKKyAgICAgICAgICAgICAgICBpZiAobVJ1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgc2hvd05leHQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGQ4ZWMxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJzLmphdmEKQEAgLTAsMCArMSwxMjMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndpZGdldDsKKworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogPHA+VGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBsb2FkIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVyIGFkYXB0ZXJzfSBkZWZpbmVkIGluCisgKiBYTUwgcmVzb3VyY2VzLiBYTUwtZGVmaW5lZCBhZGFwdGVycyBjYW4gYmUgdXNlZCB0byBlYXNpbHkgY3JlYXRlIGFkYXB0ZXJzIGluIHlvdXIKKyAqIG93biBhcHBsaWNhdGlvbiBvciB0byBwYXNzIGFkYXB0ZXJzIHRvIG90aGVyIHByb2Nlc3Nlcy48L3A+CisgKiAKKyAqIDxoMj5UeXBlcyBvZiBhZGFwdGVyczwvaDI+CisgKiA8cD5BZGFwdGVycyBkZWZpbmVkIHVzaW5nIFhNTCByZXNvdXJjZXMgY2FuIG9ubHkgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgc3VwcG9ydGVkCisgKiB0eXBlcy4gQXJiaXRyYXJ5IGFkYXB0ZXJzIGFyZSBub3Qgc3VwcG9ydGVkIHRvIGd1YXJhbnRlZSB0aGUgc2FmZXR5IG9mIHRoZSBsb2FkZWQKKyAqIGNvZGUgd2hlbiBhZGFwdGVycyBhcmUgbG9hZGVkIGFjcm9zcyBwYWNrYWdlcy48L3A+CisgKiA8dWw+CisgKiAgPGxpPjxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXIiPkN1cnNvciBhZGFwdGVyPC9hPjogYSBjdXJzb3IgYWRhcHRlciBjYW4gYmUgdXNlZAorICogIHRvIGRpc3BsYXkgdGhlIGNvbnRlbnQgb2YgYSBjdXJzb3IsIG1vc3Qgb2Z0ZW4gY29taW5nIGZyb20gYSBjb250ZW50IHByb3ZpZGVyPC9saT4KKyAqIDwvdWw+CisgKiA8cD5UaGUgY29tcGxldGUgWE1MIGZvcm1hdCBkZWZpbml0aW9uIG9mIGVhY2ggYWRhcHRlciB0eXBlIGlzIGF2YWlsYWJsZSBiZWxvdy48L3A+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlciIgLz4KKyAqIDxoMj5DdXJzb3IgYWRhcHRlcjwvaDI+CisgKiA8cD5BIGN1cnNvciBhZGFwdGVyIFhNTCBkZWZpbml0aW9uIHN0YXJ0cyB3aXRoIHRoZQorICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci10YWciPjxjb2RlPiZsdDtjdXJzb3ItYWRhcHRlciAvJmd0OzwvY29kZT48L2E+CisgKiB0YWcgYW5kIG1heSBjb250YWluIG9uZSBvciBtb3JlIGluc3RhbmNlcyBvZiB0aGUgZm9sbG93aW5nIHRhZ3M6PC9wPgorICogPHVsPgorICogIDxsaT48YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLXNlbGVjdC10YWciPjxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+PC9hPjwvbGk+CisgKiAgPGxpPjxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC10YWciPjxjb2RlPiZsdDtiaW5kIC8mZ3Q7PC9jb2RlPjwvYT48L2xpPgorICogPC91bD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLXRhZyIgLz4KKyAqIDxoMz4mbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDs8L2gzPgorICogPHA+VGhlIDxjb2RlPiZsdDtjdXJzb3ItYWRhcHRlciAvJmd0OzwvY29kZT4gZWxlbWVudCBkZWZpbmVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgKiBkb2N1bWVudCBhbmQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpsYXlvdXQ8L2NvZGU+OiBSZWZlcmVuY2UgdG8gdGhlIFhNTCBsYXlvdXQgdG8gYmUgaW5mbGF0ZWQgZm9yCisgKiAgZWFjaCBpdGVtIG9mIHRoZSBhZGFwdGVyLiBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkuPC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpzZWxlY3Rpb248L2NvZGU+OiBTZWxlY3Rpb24gZXhwcmVzc2lvbiwgdXNlZCB3aGVuIHRoZQorICogIDxjb2RlPmFuZHJvaWQ6dXJpPC9jb2RlPiBhdHRyaWJ1dGUgaXMgZGVmaW5lZCBvciB3aGVuIHRoZSBhZGFwdGVyIGlzIGxvYWRlZCB3aXRoCisgKiAge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzI2xvYWRDdXJzb3JBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIFN0cmluZywgT2JqZWN0W10pfS4KKyAqICBUaGlzIGF0dHJpYnV0ZSBpcyBvcHRpb25hbC48L2xpPgorICogIDxsaT48Y29kZT5hbmRyb2lkOnNvcnRPcmRlcjwvY29kZT46IFNvcnQgZXhwcmVzc2lvbiwgdXNlZCB3aGVuIHRoZQorICogIDxjb2RlPmFuZHJvaWQ6dXJpPC9jb2RlPiBhdHRyaWJ1dGUgaXMgZGVmaW5lZCBvciB3aGVuIHRoZSBhZGFwdGVyIGlzIGxvYWRlZCB3aXRoCisgKiAge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzI2xvYWRDdXJzb3JBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIFN0cmluZywgT2JqZWN0W10pfS4KKyAqICBUaGlzIGF0dHJpYnV0ZSBpcyBvcHRpb25hbC48L2xpPgorICogIDxsaT48Y29kZT5hbmRyb2lkOnVyaTwvY29kZT46IFVSSSBvZiB0aGUgY29udGVudCBwcm92aWRlciB0byBxdWVyeSB0byByZXRyaWV2ZSBhIGN1cnNvci4KKyAqICBTcGVjaWZ5aW5nIHRoaXMgYXR0cmlidXRlIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZworICogIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycyNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBTdHJpbmcsIE9iamVjdFtdKX0uCisgKiAgSWYgeW91IGNhbGwgdGhpcyBtZXRob2QsIHRoZSB2YWx1ZSBvZiB0aGUgWE1MIGF0dHJpYnV0ZSBpcyBpZ25vcmVkLiBUaGlzIGF0dHJpYnV0ZSBpcworICogIG9wdGlvbmFsLjwvbGk+CisgKiA8L3VsPgorICogPHA+SW4gYWRkaXRpb24sIHlvdSBjYW4gc3BlY2lmeSBvbmUgb3IgbW9yZSBpbnN0YW5jZXMgb2YKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItc2VsZWN0LXRhZyI+PGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT48L2E+IGFuZAorICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLXRhZyI+PGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+PC9hPiB0YWdzIGFzIGNoaWxkcmVuCisgKiBvZiA8Y29kZT4mbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDs8L2NvZGU+LjwvcD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLXNlbGVjdC10YWciIC8+CisgKiA8aDM+Jmx0O3NlbGVjdCAvJmd0OzwvaDM+CisgKiA8cD5UaGUgPGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT4gdGFnIGlzIHVzZWQgdG8gc2VsZWN0IGNvbHVtbnMgZnJvbSB0aGUgY3Vyc29yCisgKiB3aGVuIGRvaW5nIHRoZSBxdWVyeS4gVGhpcyBjYW4gYmUgdmVyeSB1c2VmdWwgd2hlbiB1c2luZyB0cmFuc2Zvcm1hdGlvbnMgaW4gdGhlCisgKiA8Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT4gZWxlbWVudHMuIEl0IGNhbiBhbHNvIGJlIHZlcnkgdXNlZnVsIGlmIHlvdSBhcmUgcHJvdmlkaW5nCisgKiB5b3VyIG93biA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtZGF0YS10eXBlcyI+YmluZGVyPC9hPiBvcgorICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHlwZXMiPnRyYW5zZm9ybWF0aW9uPC9hPiBjbGFzc2VzLgorICogPGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT4gZWxlbWVudHMgYXJlIGlnbm9yZWQgaWYgeW91IHN1cHBseSB0aGUgY3Vyc29yIHlvdXJzZWxmLjwvcD4KKyAqIDxwPlRoZSA8Y29kZT4mbHQ7c2VsZWN0IC8mZ3Q7PC9jb2RlPiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgorICogPHVsPgorICogIDxsaT48Y29kZT5hbmRyb2lkOmNvbHVtbjwvY29kZT46IE5hbWUgb2YgdGhlIGNvbHVtbiB0byBzZWxlY3QgaW4gdGhlIGN1cnNvciBkdXJpbmcgdGhlCisgKiAgcXVlcnkgb3BlcmF0aW9uPC9saT4KKyAqIDwvdWw+CisgKiA8cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBjb2x1bW4gbmFtZWQgPGNvZGU+X2lkPC9jb2RlPiBpcyBhbHdheXMgaW1wbGljaXRseQorICogc2VsZWN0ZWQuPC9wPgorICogCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC10YWciIC8+CisgKiA8aDM+Jmx0O2JpbmQgLyZndDs8L2gzPgorICogPHA+VGhlIDxjb2RlPiZsdDtiaW5kIC8mZ3Q7PC9jb2RlPiB0YWcgaXMgdXNlZCB0byBiaW5kIGEgY29sdW1uIGZyb20gdGhlIGN1cnNvciB0bworICogYSB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXd9LiBBIGNvbHVtbiBib3VuZCB1c2luZyB0aGlzIHRhZyBpcyBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkCisgKiBkdXJpbmcgdGhlIHF1ZXJ5IGFuZCBhIG1hdGNoaW5nCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLXNlbGVjdC10YWciPjxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+IHRhZyBpcyB0aGVyZWZvcmUKKyAqIG5vdCByZXF1aXJlZC48L3A+CisgKiAKKyAqIDxwPkVhY2ggYmluZGluZyBpcyBkZWNsYXJlZCBhcyBhIG9uZSB0byBvbmUgbWF0Y2hpbmcgYnV0CisgKiBjdXN0b20gYmluZGVyIGNsYXNzZXMgb3Igc3BlY2lhbAorICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHJhbnNmb3JtYXRpb24iPmRhdGEgdHJhbnNmb3JtYXRpb25zPC9hPiBjYW4KKyAqIGFsbG93IHlvdSB0byBiaW5kIHNldmVyYWwgY29sdW1ucyB0byBhIHNpbmdsZSB2aWV3LiBJbiB0aGlzIGNhc2UgeW91IG11c3QgdXNlIHRoZQorICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1zZWxlY3QtdGFnIj48Y29kZT4mbHQ7c2VsZWN0IC8mZ3Q7PC9jb2RlPiB0YWcgdG8gbWFrZQorICogc3VyZSBhbnkgcmVxdWlyZWQgY29sdW1uIGlzIHBhcnQgb2YgdGhlIHF1ZXJ5LjwvcD4KKyAqIAorICogPHA+VGhlIDxjb2RlPiZsdDtiaW5kIC8mZ3Q7PC9jb2RlPiB0YWcgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpmcm9tPC9jb2RlPjogVGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byBiaW5kIGZyb20uCisgKiAgVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5LiBOb3RlIHRoYXQgPGNvZGU+QDwvY29kZT4gd2hpY2ggYXJlIG5vdCB1c2VkIHRvIHJlZmVyZW5jZSByZXNvdXJjZXMKKyAqICBzaG91bGQgYmUgYmFja3NsYXNoIHByb3RlY3RlZCBhcyBpbiA8Y29kZT5cQDwvY29kZT4uPC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDp0bzwvY29kZT46IFRoZSBpZCBvZiB0aGUgdmlldyB0byBiaW5kIHRvLiBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkuPC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDphczwvY29kZT46IFRoZSA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtZGF0YS10eXBlcyI+ZGF0YSB0eXBlPC9hPgorICogIG9mIHRoZSBiaW5kaW5nLiBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkuPC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIDxwPkluIGFkZGl0aW9uLCBhIDxjb2RlPiZsdDtiaW5kIC8mZ3Q7PC9jb2RlPiBjYW4gY29udGFpbiB6ZXJvIG9yIG1vcmUgaW5zdGFuY2VzIG9mCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtZGF0YS10cmFuc2Zvcm1hdGlvbiI+ZGF0YSB0cmFuc2Zvcm1hdGlvbnM8L2E+IGNoaWxkcmVuCisgKiB0YWdzLjwvcD4KKyAqCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC1kYXRhLXR5cGVzIiAvPgorICogPGg0PkJpbmRpbmcgZGF0YSB0eXBlczwvaDQ+CisgKiA8cD5Gb3IgYSBiaW5kaW5nIHRvIG9jY3VyIHRoZSBkYXRhIHR5cGUgb2YgdGhlIGJvdW5kIGNvbHVtbi92aWV3IHBhaXIgbXVzdCBiZSBzcGVjaWZpZWQuCisgKiBUaGUgZm9sbG93aW5nIGRhdGEgdHlwZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6PC9wPgorICogPHVsPgorICogIDxsaT48Y29kZT5zdHJpbmc8L2NvZGU+OiBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgc3RyaW5nIGFuZCBtdXN0IGJlCisgKiAgYm91bmQgdG8gYSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXd9PC9saT4KKyAqICA8bGk+PGNvZGU+aW1hZ2U8L2NvZGU+OiBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgYmxvYiBkZXNjcmliaW5nIGFuCisgKiAgaW1hZ2UgYW5kIG11c3QgYmUgYm91bmQgdG8gYW4ge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlld308L2xpPgorICogIDxsaT48Y29kZT5pbWFnZS11cmk8L2NvZGU+OiBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgVVJJIHRvIGFuIGltYWdlCisgKiAgYW5kIG11c3QgYmUgYm91bmQgdG8gYW4ge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlld308L2xpPgorICogIDxsaT48Y29kZT5kcmF3YWJsZTwvY29kZT46IFRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gaXMgaW50ZXJwcmV0ZWQgYXMgYSByZXNvdXJjZSBpZCB0byBhCisgKiAgZHJhd2FibGUgYW5kIG11c3QgYmUgYm91bmQgdG8gYW4ge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlld308L2xpPgorICogIDxsaT48Y29kZT50YWc8L2NvZGU+OiBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgc3RyaW5nIGFuZCB3aWxsIGJlIHNldCBhcworICogIHRoZSB0YWcgKHVzaW5nIHtAbGluayBWaWV3I3NldFRhZyhPYmplY3QpfSBvZiB0aGUgYXNzb2NpYXRlZCBWaWV3LiBUaGlzIGNhbiBiZSB1c2VkIHRvCisgKiAgYXNzb2NpYXRlIG1ldGEtZGF0YSB0byB5b3VyIHZpZXcsIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGluc3RhbmNlIGJ5IGEgbGlzdGVuZXIuPC9saT4KKyAqICA8bGk+QSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZTogVGhlIG5hbWUgb2YgYSBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIGFuIGltcGxlbWVudGF0aW9uIG9mCisgKiAge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvckJpbmRlcn0uIEN1cnNvciBiaW5kZXJzIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUKKyAqICBiaW5kaW5ncyBub3Qgc3VwcG9ydGVkIGJ5IGRlZmF1bHQuIEN1c3RvbSBiaW5kZXJzIGNhbm5vdCBiZSB1c2VkIHdpdGgKKyAqICB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjaXNSZXN0cmljdGVkKCkgcmVzdHJpY3RlZCBjb250ZXh0c30sIGZvciBpbnN0YW5jZSBpbiBhbgorICogIGFwcGxpY2F0aW9uIHdpZGdldDwvbGk+CisgKiA8L3VsPgorICogCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC10cmFuc2Zvcm1hdGlvbiIgLz4KKyAqIDxoND5CaW5kaW5nIHRyYW5zZm9ybWF0aW9uczwvaDQ+CisgKiA8cD5XaGVuIGRlZmluaW5nIGEgZGF0YSBiaW5kaW5nIHlvdSBjYW4gc3BlY2lmeSBhbiBvcHRpb25hbCB0cmFuc2Zvcm1hdGlvbiBieSB1c2luZyBvbmUKKyAqIG9mIHRoZSBmb2xsb3dpbmcgdGFncyBhcyBhIGNoaWxkIG9mIGEgPGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+IGVsZW1lbnRzOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+Jmx0O21hcCAvJmd0OzwvY29kZT46IE1hcHMgYSBjb25zdGFudCBzdHJpbmcgdG8gYSBzdHJpbmcgb3IgYSByZXNvdXJjZS4gVXNlCisgKiAgb25lIGluc3RhbmNlIG9mIHRoaXMgdGFnIHBlciB2YWx1ZSB5b3Ugd2FudCB0byBtYXA8L2xpPgorICogIDxsaT48Y29kZT4mbHQ7dHJhbnNmb3JtIC8mZ3Q7PC9jb2RlPjogVHJhbnNmb3JtcyBhIGNvbHVtbidzIHZhbHVlIHVzaW5nIGFuIGV4cHJlc3Npb24KKyAqICBvciBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb259PC9saT4KKyAqIDwvdWw+CisgKiA8cD5XaGlsZSBzZXZlcmFsIDxjb2RlPiZsdDttYXAgLyZndDs8L2NvZGU+IHRhZ3MgY2FuIGJlIHVzZWQgYXQgdGhlIHNhbWUgdGltZSwgeW91IGNhbm5vdAorICogbWl4IDxjb2RlPiZsdDttYXAgLyZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7dHJhbnNmb3JtIC8mZ3Q7PC9jb2RlPiB0YWdzLiBJZiBzZXZlcmFsCisgKiA8Y29kZT4mbHQ7dHJhbnNmb3JtIC8mZ3Q7PC9jb2RlPiB0YWdzIGFyZSBzcGVjaWZpZWQsIG9ubHkgdGhlIGxhc3Qgb25lIGlzIHJldGFpbmVkLjwvcD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdHJhbnNmb3JtYXRpb24tbWFwIiAvPgorICogPHA+PHN0cm9uZz4mbHQ7bWFwIC8mZ3Q7PC9zdHJvbmc+PC9wPgorICogPHA+QSBtYXAgZWxlbWVudCBzaW1wbHkgc3BlY2lmaWVzIGEgdmFsdWUgdG8gbWF0Y2ggZnJvbSBhbmQgYSB2YWx1ZSB0byBtYXRjaCB0by4gV2hlbgorICogYSBjb2x1bW4ncyB2YWx1ZSBlcXVhbHMgdGhlIHZhbHVlIHRvIG1hdGNoIGZyb20sIGl0IGlzIHJlcGxhY2VkIHdpdGggdGhlIHZhbHVlIHRvIG1hdGNoCisgKiB0by4gVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBzdXBwb3J0ZWQ6PC9wPgorICogPHVsPgorICogIDxsaT48Y29kZT5hbmRyb2lkOmZyb21WYWx1ZTwvY29kZT46IFRoZSB2YWx1ZSB0byBtYXRjaCBmcm9tLiBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnk8L2xpPgorICogIDxsaT48Y29kZT5hbmRyb2lkOnRvVmFsdWU8L2NvZGU+OiBUaGUgdmFsdWUgdG8gbWF0Y2ggdG8uIFRoaXMgdmFsdWUgY2FuIGJlIGVpdGhlciBhIHN0cmluZworICogIG9yIGEgcmVzb3VyY2UgaWRlbnRpZmllci4gVGhpcyB2YWx1ZSBpcyBpbnRlcnByZXRlZCBhcyBhIHJlc291cmNlIGlkZW50aWZpZXIgd2hlbiB0aGUKKyAqICBkYXRhIGJpbmRpbmcgaXMgb2YgdHlwZSA8Y29kZT5kcmF3YWJsZTwvY29kZT4uIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeTwvbGk+CisgKiA8L3VsPgorICogCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC10cmFuc2Zvcm1hdGlvbi10cmFuc2Zvcm0iIC8+CisgKiA8cD48c3Ryb25nPiZsdDt0cmFuc2Zvcm0gLyZndDs8L3N0cm9uZz48L3A+CisgKiA8cD5BIHNpbXBsZSB0cmFuc2Zvcm0gdGhhdCBvY2N1cnMgZWl0aGVyIGJ5IGNhbGxpbmcgYSBzcGVjaWZpZWQgY2xhc3Mgb3IgYnkgcGVyZm9ybWluZworICogc2ltcGxlIHRleHQgc3Vic3RpdHV0aW9uLiBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHN1cHBvcnRlZDo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6d2l0aEV4cHJlc3Npb248L2NvZGU+OiBUaGUgdHJhbnNmb3JtYXRpb24gZXhwcmVzc2lvbi4gVGhlIGV4cHJlc3Npb24gaXMKKyAqICBhIHN0cmluZyBjb250YWluaW5nIGNvbHVtbiBuYW1lcyBzdXJyb3VuZGVkIHdpdGggY3VybHkgYnJhY2VzIHsgYW5kIH0uIER1cmluZyB0aGUKKyAqICB0cmFuc2Zvcm1hdGlvbiBlYWNoIGNvbHVtbiBuYW1lIGlzIHJlcGxhY2VkIGJ5IGl0cyB2YWx1ZS4gQWxsIGNvbHVtbnMgbXVzdCBoYXZlIGJlZW4KKyAqICBzZWxlY3RlZCBpbiB0aGUgcXVlcnkuIEFuIGV4YW1wbGUgb2YgZXhwcmVzc2lvbiBpcyA8Y29kZT4iRmlyc3QgbmFtZToge2ZpcnN0X25hbWV9LAorICogIGxhc3QgbmFtZToge2xhc3RfbmFtZX0iPC9jb2RlPi4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5CisgKiAgaWYgPGNvZGU+YW5kcm9pZDp3aXRoQ2xhc3M8L2NvZGU+IGlzIG5vdCBzcGVjaWZpZWQgYW5kIGlnbm9yZWQgaWYgPGNvZGU+YW5kcm9pZDp3aXRoQ2xhc3M8L2NvZGU+CisgKiAgaXMgc3BlY2lmaWVkPC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDp3aXRoQ2xhc3M8L2NvZGU+OiBBIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gYW4KKyAqICBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb259LiBDdXN0b20KKyAqICB0cmFuc2Zvcm1hdGlvbnMgY2Fubm90IGJlIHVzZWQgd2l0aAorICogIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNpc1Jlc3RyaWN0ZWQoKSByZXN0cmljdGVkIGNvbnRleHRzfSwgZm9yIGluc3RhbmNlIGluCisgKiAgYW4gYXBwIHdpZGdldCBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkgaWYgPGNvZGU+YW5kcm9pZDp3aXRoRXhwcmVzc2lvbjwvY29kZT4gaXMKKyAqICBub3Qgc3BlY2lmaWVkPC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIDxoMz5FeGFtcGxlPC9oMz4KKyAqIDxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWZpbmVzIGEgY3Vyc29yIGFkYXB0ZXIgdGhhdCBxdWVyaWVzIGFsbCB0aGUgY29udGFjdHMgd2l0aAorICogYSBwaG9uZSBudW1iZXIgdXNpbmcgdGhlIGNvbnRhY3RzIGNvbnRlbnQgcHJvdmlkZXIuIEVhY2ggY29udGFjdCBpcyBkaXNwbGF5ZWQgd2l0aAorICogaXRzIGRpc3BsYXkgbmFtZSwgaXRzIGZhdm9yaXRlIHN0YXR1cyBhbmQgaXRzIHBob3RvLiBUbyBkaXNwbGF5IHBob3RvcywgYSBjdXN0b20gZGF0YQorICogYmluZGVyIGlzIGRlY2xhcmVkOjwvcD4KKyAqIAorICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPgorICogJmx0O2N1cnNvci1hZGFwdGVyIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAqICAgICBhbmRyb2lkOnVyaT0iY29udGVudDovL2NvbS5hbmRyb2lkLmNvbnRhY3RzL2NvbnRhY3RzIgorICogICAgIGFuZHJvaWQ6c2VsZWN0aW9uPSJoYXNfcGhvbmVfbnVtYmVyPTEiCisgKiAgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvY29udGFjdF9pdGVtIiZndDsKKyAqCisgKiAgICAgJmx0O2JpbmQgYW5kcm9pZDpmcm9tPSJkaXNwbGF5X25hbWUiIGFuZHJvaWQ6dG89IkBpZC9uYW1lIiBhbmRyb2lkOmFzPSJzdHJpbmciIC8mZ3Q7CisgKiAgICAgJmx0O2JpbmQgYW5kcm9pZDpmcm9tPSJzdGFycmVkIiBhbmRyb2lkOnRvPSJAaWQvc3RhciIgYW5kcm9pZDphcz0iZHJhd2FibGUiJmd0OworICogICAgICAgICAmbHQ7bWFwIGFuZHJvaWQ6ZnJvbVZhbHVlPSIwIiBhbmRyb2lkOnRvVmFsdWU9IkBhbmRyb2lkOmRyYXdhYmxlL3N0YXJfYmlnX29mZiIgLyZndDsKKyAqICAgICAgICAgJmx0O21hcCBhbmRyb2lkOmZyb21WYWx1ZT0iMSIgYW5kcm9pZDp0b1ZhbHVlPSJAYW5kcm9pZDpkcmF3YWJsZS9zdGFyX2JpZ19vbiIgLyZndDsKKyAqICAgICAmbHQ7L2JpbmQmZ3Q7CisgKiAgICAgJmx0O2JpbmQgYW5kcm9pZDpmcm9tPSJfaWQiIGFuZHJvaWQ6dG89IkBpZC9uYW1lIgorICogICAgICAgICAgICAgIGFuZHJvaWQ6YXM9ImNvbS5nb29nbGUuYW5kcm9pZC50ZXN0LmFkYXB0ZXJzLkNvbnRhY3RQaG90b0JpbmRlciIgLyZndDsKKyAqCisgKiAmbHQ7L2N1cnNvci1hZGFwdGVyJmd0OworICogPC9wcmU+CisgKiAKKyAqIDxoMz5SZWxhdGVkIEFQSXM8L2gzPgorICogPHVsPgorICogIDxsaT57QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMjbG9hZEFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgT2JqZWN0W10pfTwvbGk+CisgKiAgPGxpPntAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycyNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciwgT2JqZWN0W10pfTwvbGk+CisgKiAgPGxpPntAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycyNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBTdHJpbmcsIE9iamVjdFtdKX08L2xpPgorICogIDxsaT57QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yQmluZGVyfTwvbGk+CisgKiAgPGxpPntAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbn08L2xpPgorICogIDxsaT57QGxpbmsgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcn08L2xpPgorICogPC91bD4KKyAqIAorICogQHNlZSBhbmRyb2lkLndpZGdldC5BZGFwdGVyCisgKiBAc2VlIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIKKyAqIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9sYXlvdXQgCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX3NlbGVjdGlvbiAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfc29ydE9yZGVyIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl91cmkgCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX0JpbmRJdGVtX2FzIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbV9mcm9tIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbV90bworICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9NYXBJdGVtX2Zyb21WYWx1ZSAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfTWFwSXRlbV90b1ZhbHVlIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9TZWxlY3RJdGVtX2NvbHVtbiAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfVHJhbnNmb3JtSXRlbV93aXRoQ2xhc3MgCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW1fd2l0aEV4cHJlc3Npb24gCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKHsiSmF2YWRvY1JlZmVyZW5jZSJ9KQorcHVibGljIGNsYXNzIEFkYXB0ZXJzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1IgPSAiY3Vyc29yLWFkYXB0ZXIiOworCisgICAgLyoqCisgICAgICogPHA+SW50ZXJmYWNlIHVzZWQgdG8gYmluZCBhIHtAbGluayBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcn0gY29sdW1uIHRvIGEgVmlldy4gVGhpcworICAgICAqIGludGVyZmFjZSBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGJpbmRpbmdzIGZvciBkYXRhIHR5cGVzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCisgICAgICogc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzfS48L3A+CisgICAgICogCisgICAgICogPHA+QSBiaW5kZXIgaXMgcHJvdmlkZWQgd2l0aCBhIGN1cnNvciB0cmFuc2Zvcm1hdGlvbiB3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSB1c2VkCisgICAgICogdG8gdHJhbnNmb3JtIHRoZSB2YWx1ZSByZXRyaWV2ZWQgZnJvbSB0aGUgY3Vyc29yLiBUaGUgdHJhbnNmb3JtYXRpb24gaXMgZ3VhcmFudGVlZAorICAgICAqIHRvIG5ldmVyIGJlIG51bGwgc28gaXQncyBhbHdheXMgc2FmZSB0byBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24uPC9wPgorICAgICAqIAorICAgICAqIDxwPlRoZSBiaW5kZXIgaXMgYXNzb2NpYXRlZCB3aXRoIGEgQ29udGV4dCBidXQgY2FuIGJlIHJlLXVzZWQgd2l0aCBtdWx0aXBsZSBjdXJzb3JzLgorICAgICAqIEFzIHN1Y2gsIHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgbWFrZSBubyBhc3N1bXB0aW9uIGFib3V0IHRoZSBDdXJzb3IgaW4gdXNlLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LlZpZXcgCisgICAgICogQHNlZSBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgorICAgICAqIEBzZWUgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEN1cnNvckJpbmRlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5UaGUgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBiaW5kZXIuPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlRoZSB0cmFuc2Zvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBiaW5kZXIuIFRoaXMgdHJhbnNmb3JtYXRpb24gaXMgbmV2ZXIKKyAgICAgICAgICogbnVsbCBhbmQgbWF5IG9yIG1heSBub3QgYmUgYXBwbGllZCB0byB0aGUgQ3Vyc29yIGRhdGEgZHVyaW5nIHRoZQorICAgICAgICAgKiB7QGxpbmsgI2JpbmQoYW5kcm9pZC52aWV3LlZpZXcsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yLCBpbnQpfSBvcGVyYXRpb24uPC9wPgorICAgICAgICAgKiAKKyAgICAgICAgICogQHNlZSAjYmluZChhbmRyb2lkLnZpZXcuVmlldywgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IsIGludCkgCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gbVRyYW5zZm9ybWF0aW9uOworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5DcmVhdGVzIGEgbmV3IEN1cnNvciBiaW5kZXIuPC9wPiAKKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJpbmRlci4KKyAgICAgICAgICogQHBhcmFtIHRyYW5zZm9ybWF0aW9uIFRoZSB0cmFuc2Zvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBiaW5kZXIuIFRoaXMKKyAgICAgICAgICogICAgICAgIHRyYW5zZm9ybWF0aW9uIG1heSBvciBtYXkgbm90IGJlIGFwcGxpZWQgYnkgdGhlIGJpbmRlciBhbmQgaXMgZ3VhcmFudGVlZAorICAgICAgICAgKiAgICAgICAgdG8gbm90IGJlIG51bGwuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ3Vyc29yQmluZGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgICAgIG1UcmFuc2Zvcm1hdGlvbiA9IHRyYW5zZm9ybWF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPkJpbmRzIHRoZSBzcGVjaWZpZWQgQ3Vyc29yIGNvbHVtbiB0byB0aGUgc3VwcGxpZWQgVmlldy4gVGhlIGJpbmRpbmcgb3BlcmF0aW9uCisgICAgICAgICAqIGNhbiBxdWVyeSBvdGhlciBDdXJzb3IgY29sdW1ucyBhcyBuZWVkZWQuIER1cmluZyB0aGUgYmluZGluZyBvcGVyYXRpb24sIHZhbHVlcworICAgICAgICAgKiByZXRyaWV2ZWQgZnJvbSB0aGUgQ3Vyc29yIG1heSBvciBtYXkgbm90IGJlIHRyYW5zZm9ybWVkIHVzaW5nIHRoaXMgYmluZGVyJ3MKKyAgICAgICAgICogY3Vyc29yIHRyYW5zZm9ybWF0aW9uLjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRvIGJpbmQgZGF0YSB0by4KKyAgICAgICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHRvIGJpbmQgZGF0YSBmcm9tLgorICAgICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggVGhlIGNvbHVtbiBpbmRleCBpbiB0aGUgY3Vyc29yIHdoZXJlIHRoZSBkYXRhIHRvIGJpbmQgcmVzaWRlcy4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzZWUgI21UcmFuc2Zvcm1hdGlvbgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBjb2x1bW4gd2FzIHN1Y2Nlc3NmdWxseSBib3VuZCB0byB0aGUgVmlldywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gYmluZChWaWV3IHZpZXcsIEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+SW50ZXJmYWNlIHVzZWQgdG8gdHJhbnNmb3JtIGRhdGEgY29taW5nIG91dCBvZiBhIHtAbGluayBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcn0KKyAgICAgKiBiZWZvcmUgaXQgaXMgYm91bmQgdG8gYSB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXd9LjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UcmFuc2Zvcm1hdGlvbnMgYXJlIHVzZWQgdG8gdHJhbnNmb3JtIHRleHQtYmFzZWQgZGF0YSAoaW4gdGhlIGZvcm0gb2YgYSBTdHJpbmcpLAorICAgICAqIG9yIHRvIHRyYW5zZm9ybSBkYXRhIGludG8gYSByZXNvdXJjZSBpZGVudGlmaWVyLiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQKKyAgICAgKiB0byBnZW5lcmF0ZSByZXNvdXJjZSBpZGVudGlmaWVycy48L3A+CisgICAgICogCisgICAgICogQHNlZSBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgorICAgICAqIEBzZWUgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yQmluZGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5UaGUgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2Zvcm1hdGlvbi48L3A+CisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Q3JlYXRlcyBhIG5ldyBDdXJzb3IgdHJhbnNmb3JtYXRpb24uPC9wPgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNmb3JtYXRpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ3Vyc29yVHJhbnNmb3JtYXRpb24oQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+VHJhbnNmb3JtcyB0aGUgc3BlY2lmaWVkIEN1cnNvciBjb2x1bW4gaW50byBhIFN0cmluZy4gVGhlIHRyYW5zZm9ybWF0aW9uCisgICAgICAgICAqIGNhbiBzaW1wbHkgcmV0dXJuIHRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gYXMgYSBTdHJpbmcgKHRoaXMgaXMga25vd24KKyAgICAgICAgICogYXMgdGhlIGlkZW50aXR5IHRyYW5zZm9ybWF0aW9uKSBvciBtYW5pcHVsYXRlIHRoZSBjb250ZW50LiBGb3IgaW5zdGFuY2UsCisgICAgICAgICAqIGEgdHJhbnNmb3JtYXRpb24gY2FuIHBlcmZvcm0gdGV4dCBzdWJzdGl0dXRpb25zIG9yIGNvbmNhdGVuYXRlIG90aGVyCisgICAgICAgICAqIGNvbHVtbnMgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbHVtbi48L3A+CisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgdGhhdCBjb250YWlucyB0aGUgZGF0YSB0byB0cmFuc2Zvcm0uIAorICAgICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggVGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gdHJhbnNmb3JtLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiBBIFN0cmluZyBjb250YWluaW5nIHRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSBvZiB0aGUgY29sdW1uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyB0cmFuc2Zvcm0oQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+VHJhbnNmb3JtcyB0aGUgc3BlY2lmaWVkIEN1cnNvciBjb2x1bW4gaW50byBhIHJlc291cmNlIGlkZW50aWZpZXIuCisgICAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSBpbnRlcnByZXRzIHRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4KKyAgICAgICAgICogYXMgYW4gaW50ZWdlci48L3A+CisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgdGhhdCBjb250YWlucyB0aGUgZGF0YSB0byB0cmFuc2Zvcm0uIAorICAgICAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggVGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gdHJhbnNmb3JtLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiBBIHJlc291cmNlIGlkZW50aWZpZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IHRyYW5zZm9ybVRvUmVzb3VyY2UoQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmdldEludChjb2x1bW5JbmRleCk7CisgICAgICAgIH0gICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkxvYWRzIHRoZSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcn0gZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogWE1MIHJlc291cmNlLiBUaGUgY29udGVudCBvZiB0aGUgYWRhcHRlciBpcyBsb2FkZWQgZnJvbSB0aGUgY29udGVudCBwcm92aWRlcgorICAgICAqIGlkZW50aWZpZWQgYnkgdGhlIHN1cHBsaWVkIFVSSS48L3A+CisgICAgICogCisgICAgICogPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBJZiB0aGUgc3VwcGxpZWQge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0fSBpcworICAgICAqIGFuIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eX0sIHRoZSBjdXJzb3IgcmV0dXJuZWQgYnkgdGhlIGNvbnRlbnQgcHJvdmlkZXIKKyAgICAgKiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgbWFuYWdlZC4gT3RoZXJ3aXNlLCB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUKKyAgICAgKiBjdXJzb3IgeW91cnNlbGYuPC9wPgorICAgICAqIAorICAgICAqIDxwPlRoZSBmb3JtYXQgb2YgdGhlIFhNTCBkZWZpbml0aW9uIG9mIHRoZSBjdXJzb3IgYWRhcHRlciBpcyBkb2N1bWVudGVkIGF0CisgICAgICogdGhlIHRvcCBvZiB0aGlzIHBhZ2UuPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGxvYWQgdGhlIFhNTCByZXNvdXJjZSBmcm9tLgorICAgICAqIEBwYXJhbSBpZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgWE1MIHJlc291cmNlIGRlY2xhcmluZyB0aGUgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGNvbnRlbnQgcHJvdmlkZXIuCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBDdXJzb3JBZGFwdGVyLCB1c2VkCisgICAgICogICAgICAgIHRvIHN1YnN0aXR1dGUgdmFsdWVzIGluIHRoZSBzZWxlY3Rpb24gZXhwcmVzc2lvbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9CisgICAgICogCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgdGhlIFhNTCByZXNvdXJjZSBkb2VzIG5vdCBjb250YWluCisgICAgICogICAgICAgICBhIHZhbGlkICZsdDtjdXJzb3ItYWRhcHRlciAvJmd0OyBkZWZpbml0aW9uLgorICAgICAqIAorICAgICAqIEBzZWUgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcgorICAgICAqIEBzZWUgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcgorICAgICAqIEBzZWUgI2xvYWRBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIE9iamVjdFtdKSAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEN1cnNvckFkYXB0ZXIgbG9hZEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgaWQsIFN0cmluZyB1cmksCisgICAgICAgICAgICBPYmplY3QuLi4gcGFyYW1ldGVycykgeworCisgICAgICAgIFhtbEN1cnNvckFkYXB0ZXIgYWRhcHRlciA9IChYbWxDdXJzb3JBZGFwdGVyKSBsb2FkQWRhcHRlcihjb250ZXh0LCBpZCwgQURBUFRFUl9DVVJTT1IsCisgICAgICAgICAgICAgICAgcGFyYW1ldGVycyk7CisKKyAgICAgICAgaWYgKHVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGFwdGVyLnNldFVyaSh1cmkpOworICAgICAgICB9CisgICAgICAgIGFkYXB0ZXIubG9hZCgpOworCisgICAgICAgIHJldHVybiBhZGFwdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkxvYWRzIHRoZSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcn0gZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWVkCisgICAgICogWE1MIHJlc291cmNlLiBUaGUgY29udGVudCBvZiB0aGUgYWRhcHRlciBpcyBsb2FkZWQgZnJvbSB0aGUgc3BlY2lmaWVkIGN1cnNvci4KKyAgICAgKiBZb3UgYXJlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgc3VwcGxpZWQgY3Vyc29yLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgZm9ybWF0IG9mIHRoZSBYTUwgZGVmaW5pdGlvbiBvZiB0aGUgY3Vyc29yIGFkYXB0ZXIgaXMgZG9jdW1lbnRlZCBhdAorICAgICAqIHRoZSB0b3Agb2YgdGhpcyBwYWdlLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBsb2FkIHRoZSBYTUwgcmVzb3VyY2UgZnJvbS4KKyAgICAgKiBAcGFyYW0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIFhNTCByZXNvdXJjZSBkZWNsYXJpbmcgdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIGNvbnRhaW5pbmcgdGhlIGRhdGEgZm9yIHRoZSBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgQ3Vyc29yQWRhcHRlciwgdXNlZAorICAgICAqICAgICAgICB0byBzdWJzdGl0dXRlIHZhbHVlcyBpbiB0aGUgc2VsZWN0aW9uIGV4cHJlc3Npb24uCisgICAgICogCisgICAgICogQHJldHVybiBBIHtAbGluayBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyfQorICAgICAqIAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSBYTUwgcmVzb3VyY2UgZG9lcyBub3QgY29udGFpbgorICAgICAqICAgICAgICAgYSB2YWxpZCAmbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDsgZGVmaW5pdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAc2VlIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIKKyAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIKKyAgICAgKiBAc2VlIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yCisgICAgICogQHNlZSAjbG9hZEFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgT2JqZWN0W10pIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ3Vyc29yQWRhcHRlciBsb2FkQ3Vyc29yQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIGludCBpZCwgQ3Vyc29yIGN1cnNvciwKKyAgICAgICAgICAgIE9iamVjdC4uLiBwYXJhbWV0ZXJzKSB7CisKKyAgICAgICAgWG1sQ3Vyc29yQWRhcHRlciBhZGFwdGVyID0gKFhtbEN1cnNvckFkYXB0ZXIpIGxvYWRBZGFwdGVyKGNvbnRleHQsIGlkLCBBREFQVEVSX0NVUlNPUiwKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzKTsKKworICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkYXB0ZXIuY2hhbmdlQ3Vyc29yKGN1cnNvcik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYWRhcHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5Mb2FkcyB0aGUgYWRhcHRlciBkZWZpbmVkIGluIHRoZSBzcGVjaWZpZWQgWE1MIHJlc291cmNlLiBUaGUgWE1MIGRlZmluaXRpb24gb2YKKyAgICAgKiB0aGUgYWRhcHRlciBtdXN0IGZvbGxvdyB0aGUgZm9ybWF0IGRlZmluaXRpb24gb2Ygb25lIG9mIHRoZSBzdXBwb3J0ZWQgYWRhcHRlcgorICAgICAqIHR5cGVzIGRlc2NyaWJlZCBhdCB0aGUgdG9wIG9mIHRoaXMgcGFnZS48L3A+CisgICAgICogCisgICAgICogPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBJZiB0aGUgbG9hZGVkIGFkYXB0ZXIgaXMgYSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcn0KKyAgICAgKiBhbmQgdGhlIHN1cHBsaWVkIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dH0gaXMgYW4ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5fSwKKyAgICAgKiB0aGUgY3Vyc29yIHJldHVybmVkIGJ5IHRoZSBjb250ZW50IHByb3ZpZGVyIHdpbGwgYmUgYXV0b21hdGljYWxseSBtYW5hZ2VkLiBPdGhlcndpc2UsCisgICAgICogeW91IGFyZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIGN1cnNvciB5b3Vyc2VsZi48L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gbG9hZCB0aGUgWE1MIHJlc291cmNlIGZyb20uCisgICAgICogQHBhcmFtIGlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBYTUwgcmVzb3VyY2UgZGVjbGFyaW5nIHRoZSBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgYWRhcHRlci4KKyAgICAgKiAgCisgICAgICogQHJldHVybiBBbiBhZGFwdGVyIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBzZWUgI2xvYWRDdXJzb3JBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yLCBPYmplY3RbXSkgCisgICAgICogQHNlZSAjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgU3RyaW5nLCBPYmplY3RbXSkgCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCYXNlQWRhcHRlciBsb2FkQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIGludCBpZCwgT2JqZWN0Li4uIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgZmluYWwgQmFzZUFkYXB0ZXIgYWRhcHRlciA9IGxvYWRBZGFwdGVyKGNvbnRleHQsIGlkLCBudWxsLCBwYXJhbWV0ZXJzKTsKKyAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBNYW5hZ2VkQWRhcHRlcikgeworICAgICAgICAgICAgKChNYW5hZ2VkQWRhcHRlcikgYWRhcHRlcikubG9hZCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhZGFwdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWRzIGFuIGFkYXB0ZXIgZnJvbSB0aGUgc3BlY2lmaWVkIFhNTCByZXNvdXJjZS4gVGhlIG9wdGlvbmFsIGFzc2VydE5hbWUgY2FuCisgICAgICogYmUgdXNlZCB0byBleGl0IGVhcmx5IGlmIHRoZSBhZGFwdGVyIGRlZmluZWQgaW4gdGhlIFhNTCByZXNvdXJjZSBpcyBub3Qgb2YgdGhlCisgICAgICogZXhwZWN0ZWQgdHlwZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gaWQgVGhlIHJlc291cmNlIGlkIG9mIHRoZSBYTUwgZG9jdW1lbnQgZGVmaW5pbmcgdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIGFzc2VydE5hbWUgVGhlIG1hbmRhdG9yeSBuYW1lIG9mIHRoZSBhZGFwdGVyIGluIHRoZSBYTUwgZG9jdW1lbnQuCisgICAgICogICAgICAgIElnbm9yZWQgaWYgbnVsbC4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBPcHRpb25hbCBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUgYWRhcHRlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIHtAbGluayBhbmRyb2lkLndpZGdldC5CYXNlQWRhcHRlcn0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQmFzZUFkYXB0ZXIgbG9hZEFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgaWQsIFN0cmluZyBhc3NlcnROYW1lLAorICAgICAgICAgICAgT2JqZWN0Li4uIHBhcmFtZXRlcnMpIHsKKworICAgICAgICBYbWxSZXNvdXJjZVBhcnNlciBwYXJzZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFyc2VyID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRYbWwoaWQpOworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJGcm9tWG1sKGNvbnRleHQsIHBhcnNlciwgWG1sLmFzQXR0cmlidXRlU2V0KHBhcnNlciksCisgICAgICAgICAgICAgICAgICAgIGlkLCBwYXJhbWV0ZXJzLCBhc3NlcnROYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uIHJuZiA9IG5ldyBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDYW4ndCBsb2FkIGFkYXB0ZXIgcmVzb3VyY2UgSUQgIiArCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUoaWQpKTsKKyAgICAgICAgICAgIHJuZi5pbml0Q2F1c2UoZXgpOworICAgICAgICAgICAgdGhyb3cgcm5mOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uIHJuZiA9IG5ldyBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDYW4ndCBsb2FkIGFkYXB0ZXIgcmVzb3VyY2UgSUQgIiArCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUoaWQpKTsKKyAgICAgICAgICAgIHJuZi5pbml0Q2F1c2UoZXgpOworICAgICAgICAgICAgdGhyb3cgcm5mOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHBhcnNlciAhPSBudWxsKSBwYXJzZXIuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBhbiBhZGFwdGVyIHVzaW5nIHRoZSBzcGVjaWZpZWQgWE1MIHBhcnNlci4gVGhpcyBtZXRob2QgaXMgcmVzcG9uc2libGUKKyAgICAgKiBmb3IgY2hvb3NpbmcgdGhlIHR5cGUgb2YgdGhlIGFkYXB0ZXIgdG8gY3JlYXRlIGJhc2VkIG9uIHRoZSBjb250ZW50IG9mIHRoZQorICAgICAqIFhNTCBwYXJzZXIuCisgICAgICogCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBnZW5lcmF0ZSBhbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBpZgorICAgICAqIDxjb2RlPmFzc2VydE5hbWU8L2NvZGU+IGlzIG5vdCBudWxsIGFuZCBkb2VzIG5vdCBtYXRjaCB0aGUgcm9vdCB0YWcgb2YgdGhlIFhNTAorICAgICAqIGRvY3VtZW50LiAKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBCYXNlQWRhcHRlciBjcmVhdGVBZGFwdGVyRnJvbVhtbChDb250ZXh0IGMsCisgICAgICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgaWQsIE9iamVjdFtdIHBhcmFtZXRlcnMsCisgICAgICAgICAgICBTdHJpbmcgYXNzZXJ0TmFtZSkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBCYXNlQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKKworICAgICAgICAvLyBNYWtlIHN1cmUgd2UgYXJlIG9uIGEgc3RhcnQgdGFnLgorICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgaW50IGRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisKKyAgICAgICAgd2hpbGUgKCgodHlwZSA9IHBhcnNlci5uZXh0KCkpICE9IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCBwYXJzZXIuZ2V0RGVwdGgoKSA+IGRlcHRoKSAmJgorICAgICAgICAgICAgICAgIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKworICAgICAgICAgICAgaWYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgaWYgKGFzc2VydE5hbWUgIT0gbnVsbCAmJiAhYXNzZXJ0TmFtZS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgYWRhcHRlciBkZWZpbmVkIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgYy5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShpZCkgKyAiIG11c3QgYmUgYSA8IiArCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnROYW1lICsgIiAvPiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoQURBUFRFUl9DVVJTT1IuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgYWRhcHRlciA9IGNyZWF0ZUN1cnNvckFkYXB0ZXIoYywgcGFyc2VyLCBhdHRycywgaWQsIHBhcmFtZXRlcnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGFkYXB0ZXIgbmFtZSAiICsgcGFyc2VyLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGluICIgKyBjLmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKGlkKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYWRhcHRlcjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gWG1sQ3Vyc29yQWRhcHRlciB1c2luZyBhbiBYbWxDdXJzb3JBZGFwdGVyUGFyc2VyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFhtbEN1cnNvckFkYXB0ZXIgY3JlYXRlQ3Vyc29yQWRhcHRlcihDb250ZXh0IGMsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgaWQsIE9iamVjdFtdIHBhcmFtZXRlcnMpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24geworCisgICAgICAgIHJldHVybiBuZXcgWG1sQ3Vyc29yQWRhcHRlclBhcnNlcihjLCBwYXJzZXIsIGF0dHJzLCBpZCkucGFyc2UocGFyYW1ldGVycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VyIHRoYXQgY2FuIGdlbmVyYXRlIFhtbEN1cnNvckFkYXB0ZXIgaW5zdGFuY2VzLiBUaGlzIHBhcnNlciBpcyByZXNwb25zaWJsZSBmb3IKKyAgICAgKiBoYW5kbGluZyBhbGwgdGhlIGF0dHJpYnV0ZXMgYW5kIGNoaWxkIG5vZGVzIGZvciBhICZsdDtjdXJzb3ItYWRhcHRlciAvJmd0Oy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBYbWxDdXJzb3JBZGFwdGVyUGFyc2VyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0JJTkQgPSAiYmluZCI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9TRUxFQ1QgPSAic2VsZWN0IjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0FTX1NUUklORyA9ICJzdHJpbmciOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfQVNfSU1BR0UgPSAiaW1hZ2UiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfQVNfVEFHID0gInRhZyI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9BU19JTUFHRV9VUkkgPSAiaW1hZ2UtdXJpIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0FTX0RSQVdBQkxFID0gImRyYXdhYmxlIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX01BUCA9ICJtYXAiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfVFJBTlNGT1JNID0gInRyYW5zZm9ybSI7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgICAgICBwcml2YXRlIGZpbmFsIFhtbFB1bGxQYXJzZXIgbVBhcnNlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBdHRyaWJ1dGVTZXQgbUF0dHJzOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtSWQ7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgQ3Vyc29yQmluZGVyPiBtQmluZGVyczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBtRnJvbTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW50ZWdlcj4gbVRvOworICAgICAgICBwcml2YXRlIGZpbmFsIEN1cnNvclRyYW5zZm9ybWF0aW9uIG1JZGVudGl0eTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZXMgbVJlc291cmNlczsKKworICAgICAgICBwdWJsaWMgWG1sQ3Vyc29yQWRhcHRlclBhcnNlcihDb250ZXh0IGMsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBpZCkgeworICAgICAgICAgICAgbUNvbnRleHQgPSBjOworICAgICAgICAgICAgbVBhcnNlciA9IHBhcnNlcjsKKyAgICAgICAgICAgIG1BdHRycyA9IGF0dHJzOworICAgICAgICAgICAgbUlkID0gaWQ7CisKKyAgICAgICAgICAgIG1SZXNvdXJjZXMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIG1CaW5kZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDdXJzb3JCaW5kZXI+KCk7CisgICAgICAgICAgICBtRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgbVRvID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICAgICAgbUlkZW50aXR5ID0gbmV3IElkZW50aXR5VHJhbnNmb3JtYXRpb24obUNvbnRleHQpOyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFhtbEN1cnNvckFkYXB0ZXIgcGFyc2UoT2JqZWN0W10gcGFyYW1ldGVycykKKyAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBtUmVzb3VyY2VzOworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gcmVzb3VyY2VzLm9idGFpbkF0dHJpYnV0ZXMobUF0dHJzLCBhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXIpOworCisgICAgICAgICAgICBTdHJpbmcgdXJpID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX3VyaSk7CisgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX3NlbGVjdGlvbik7CisgICAgICAgICAgICBTdHJpbmcgc29ydE9yZGVyID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX3NvcnRPcmRlcik7CisgICAgICAgICAgICBpbnQgbGF5b3V0ID0gYS5nZXRSZXNvdXJjZUlkKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9sYXlvdXQsIDApOworICAgICAgICAgICAgaWYgKGxheW91dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGxheW91dCBzcGVjaWZpZWQgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICIgZG9lcyBub3QgZXhpc3QiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gbVBhcnNlcjsKKyAgICAgICAgICAgIGludCB0eXBlOworICAgICAgICAgICAgaW50IGRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisKKyAgICAgICAgICAgIHdoaWxlICgoKHR5cGUgPSBwYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcgfHwgcGFyc2VyLmdldERlcHRoKCkgPiBkZXB0aCkgJiYKKyAgICAgICAgICAgICAgICAgICAgdHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCkgeworCisgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOworCisgICAgICAgICAgICAgICAgaWYgKEFEQVBURVJfQ1VSU09SX0JJTkQuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcnNlQmluZFRhZygpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQURBUFRFUl9DVVJTT1JfU0VMRUNULmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBwYXJzZVNlbGVjdFRhZygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIHRhZyBuYW1lICIgKyBwYXJzZXIuZ2V0TmFtZSgpICsgIiBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmdbXSBmcm9tQXJyYXkgPSBtRnJvbS50b0FycmF5KG5ldyBTdHJpbmdbbUZyb20uc2l6ZSgpXSk7CisgICAgICAgICAgICBpbnRbXSB0b0FycmF5ID0gbmV3IGludFttVG8uc2l6ZSgpXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9BcnJheS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHRvQXJyYXlbaV0gPSBtVG8uZ2V0KGkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZWxlY3Rpb25BcmdzID0gbmV3IFN0cmluZ1twYXJhbWV0ZXJzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb25BcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkFyZ3NbaV0gPSAoU3RyaW5nKSBwYXJhbWV0ZXJzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxDdXJzb3JBZGFwdGVyKG1Db250ZXh0LCBsYXlvdXQsIHVyaSwgZnJvbUFycmF5LCB0b0FycmF5LCBzZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkFyZ3MsIHNvcnRPcmRlciwgbUJpbmRlcnMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHBhcnNlU2VsZWN0VGFnKCkgeworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gbVJlc291cmNlcy5vYnRhaW5BdHRyaWJ1dGVzKG1BdHRycywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1NlbGVjdEl0ZW0pOworCisgICAgICAgICAgICBTdHJpbmcgZnJvbU5hbWUgPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfU2VsZWN0SXRlbV9jb2x1bW4pOworICAgICAgICAgICAgaWYgKGZyb21OYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIHNlbGVjdCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgaGF2ZSBhICdjb2x1bW4nIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgbUZyb20uYWRkKGZyb21OYW1lKTsKKyAgICAgICAgICAgIG1Uby5hZGQoVmlldy5OT19JRCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcGFyc2VCaW5kVGFnKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBtUmVzb3VyY2VzOworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gcmVzb3VyY2VzLm9idGFpbkF0dHJpYnV0ZXMobUF0dHJzLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfQmluZEl0ZW0pOworCisgICAgICAgICAgICBTdHJpbmcgZnJvbU5hbWUgPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfQmluZEl0ZW1fZnJvbSk7CisgICAgICAgICAgICBpZiAoZnJvbU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgYmluZCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIGRvZXMgbm90IGhhdmUgYSAnZnJvbScgYXR0cmlidXRlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCB0b05hbWUgPSBhLmdldFJlc291cmNlSWQoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX0JpbmRJdGVtX3RvLCAwKTsKKyAgICAgICAgICAgIGlmICh0b05hbWUgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgYmluZCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIGRvZXMgbm90IGhhdmUgYSAndG8nIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYXNUeXBlID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX0JpbmRJdGVtX2FzKTsKKyAgICAgICAgICAgIGlmIChhc1R5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgYmluZCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIGRvZXMgbm90IGhhdmUgYW4gJ2FzJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUZyb20uYWRkKGZyb21OYW1lKTsKKyAgICAgICAgICAgIG1Uby5hZGQodG9OYW1lKTsKKyAgICAgICAgICAgIG1CaW5kZXJzLnB1dChmcm9tTmFtZSwgZmluZEJpbmRlcihhc1R5cGUpKTsKKworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEN1cnNvckJpbmRlciBmaW5kQmluZGVyKFN0cmluZyB0eXBlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBtUGFyc2VyOworICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gbUNvbnRleHQ7CisgICAgICAgICAgICBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbiA9IG1JZGVudGl0eTsKKworICAgICAgICAgICAgaW50IHRhZ1R5cGU7CisgICAgICAgICAgICBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKKworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0RyYXdhYmxlID0gQURBUFRFUl9DVVJTT1JfQVNfRFJBV0FCTEUuZXF1YWxzKHR5cGUpOyAgICAgICAgICAgIAorCisgICAgICAgICAgICB3aGlsZSAoKCh0YWdUeXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gZGVwdGgpCisgICAgICAgICAgICAgICAgICAgICYmIHRhZ1R5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKworICAgICAgICAgICAgICAgIGlmICh0YWdUeXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKworICAgICAgICAgICAgICAgIGlmIChBREFQVEVSX0NVUlNPUl9UUkFOU0ZPUk0uZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uID0gZmluZFRyYW5zZm9ybWF0aW9uKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBREFQVEVSX0NVUlNPUl9NQVAuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKHRyYW5zZm9ybWF0aW9uIGluc3RhbmNlb2YgTWFwVHJhbnNmb3JtYXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbiA9IG5ldyBNYXBUcmFuc2Zvcm1hdGlvbihjb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaW5kTWFwKCgoTWFwVHJhbnNmb3JtYXRpb24pIHRyYW5zZm9ybWF0aW9uKSwgaXNEcmF3YWJsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVua25vd24gdGFnIG5hbWUgIiArIHBhcnNlci5nZXROYW1lKCkgKyAiIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoQURBUFRFUl9DVVJTT1JfQVNfU1RSSU5HLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nQmluZGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQURBUFRFUl9DVVJTT1JfQVNfVEFHLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGFnQmluZGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQURBUFRFUl9DVVJTT1JfQVNfSU1BR0UuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbWFnZUJpbmRlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7ICAgICAgICAgICAgCisgICAgICAgICAgICB9IGVsc2UgaWYgKEFEQVBURVJfQ1VSU09SX0FTX0lNQUdFX1VSSS5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEltYWdlVXJpQmluZGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNEcmF3YWJsZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRHJhd2FibGVCaW5kZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlQmluZGVyKHR5cGUsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQ3Vyc29yQmluZGVyIGNyZWF0ZUJpbmRlcihTdHJpbmcgdHlwZSwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChtQ29udGV4dC5pc1Jlc3RyaWN0ZWQoKSkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4ga2xhc3MgPSBDbGFzcy5mb3JOYW1lKHR5cGUsIHRydWUsIG1Db250ZXh0LmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICAgIGlmIChDdXJzb3JCaW5kZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShrbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uc3RydWN0b3I8Pz4gYyA9IGtsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5jbGFzcywgQ3Vyc29yVHJhbnNmb3JtYXRpb24uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEN1cnNvckJpbmRlcikgYy5uZXdJbnN0YW5jZShtQ29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSBiaW5kZXIgdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgdHlwZSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSBiaW5kZXIgdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgdHlwZSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgYmluZGVyIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIHR5cGUsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIGJpbmRlciB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyB0eXBlLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSBiaW5kZXIgdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgdHlwZSwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGZpbmRNYXAoTWFwVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24sIGJvb2xlYW4gZHJhd2FibGUpIHsKKyAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBtUmVzb3VyY2VzOworCisgICAgICAgICAgICBUeXBlZEFycmF5IGEgPSByZXNvdXJjZXMub2J0YWluQXR0cmlidXRlcyhtQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9NYXBJdGVtKTsKKworICAgICAgICAgICAgU3RyaW5nIGZyb20gPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfTWFwSXRlbV9mcm9tVmFsdWUpOworICAgICAgICAgICAgaWYgKGZyb20gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgbWFwIGl0ZW0gaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGhhdmUgYSAnZnJvbVZhbHVlJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFkcmF3YWJsZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0byA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9NYXBJdGVtX3RvVmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh0byA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgbWFwIGl0ZW0gaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgaGF2ZSBhICd0b1ZhbHVlJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24uYWRkU3RyaW5nTWFwcGluZyhmcm9tLCB0byk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCB0byA9IGEuZ2V0UmVzb3VyY2VJZChhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfTWFwSXRlbV90b1ZhbHVlLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAodG8gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIG1hcCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGhhdmUgYSAndG9WYWx1ZScgYXR0cmlidXRlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uLmFkZFJlc291cmNlTWFwcGluZyhmcm9tLCB0byk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGEucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBDdXJzb3JUcmFuc2Zvcm1hdGlvbiBmaW5kVHJhbnNmb3JtYXRpb24oKSB7CisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbVJlc291cmNlczsKKyAgICAgICAgICAgIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IHJlc291cmNlcy5vYnRhaW5BdHRyaWJ1dGVzKG1BdHRycywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW0pOworCisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW1fd2l0aENsYXNzKTsKKyAgICAgICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBleHByZXNzaW9uID0gYS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfVHJhbnNmb3JtSXRlbV93aXRoRXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24gPSBjcmVhdGVFeHByZXNzaW9uVHJhbnNmb3JtYXRpb24oZXhwcmVzc2lvbik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFtQ29udGV4dC5pc1Jlc3RyaWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGtsYXMgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgbUNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChDdXJzb3JUcmFuc2Zvcm1hdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGtsYXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25zdHJ1Y3Rvcjw/PiBjID0ga2xhcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKENvbnRleHQuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24gPSAoQ3Vyc29yVHJhbnNmb3JtYXRpb24pIGMubmV3SW5zdGFuY2UobUNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSB0cmFuc2Zvcm0gdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgY2xhc3NOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgdHJhbnNmb3JtIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIGNsYXNzTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSB0cmFuc2Zvcm0gdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgY2xhc3NOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIHRyYW5zZm9ybSB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyBjbGFzc05hbWUsIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgdHJhbnNmb3JtIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIGNsYXNzTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIHRyYW5zZm9ybSBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICIgbXVzdCBoYXZlIGEgJ3dpdGhDbGFzcycgb3IgIiArCisgICAgICAgICAgICAgICAgICAgICInd2l0aEV4cHJlc3Npb24nIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtYXRpb247CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEN1cnNvclRyYW5zZm9ybWF0aW9uIGNyZWF0ZUV4cHJlc3Npb25UcmFuc2Zvcm1hdGlvbihTdHJpbmcgZXhwcmVzc2lvbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uVHJhbnNmb3JtYXRpb24obUNvbnRleHQsIGV4cHJlc3Npb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHVzZWQgYnkgYWRhcHRlcnMgdGhhdCByZXF1aXJlIHRvIGJlIGxvYWRlZCBhZnRlciBjcmVhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnRlcmZhY2UgTWFuYWdlZEFkYXB0ZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogTG9hZHMgdGhlIGNvbnRlbnQgb2YgdGhlIGFkYXB0ZXIsIGFzeW5jaHJvbm91c2x5LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBsb2FkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgYSBDdXJzb3IgYWRhcHRlciBkZWZpbmVkIGluIFhNTC4gVGhpcyBjbGFzcyBpcyBhIHRoaW4gd3JhcHBlcgorICAgICAqIG9mIGEgU2ltcGxlQ3Vyc29yQWRhcHRlci4gVGhlIG1haW4gZGlmZmVyZW5jZSBpcyB0aGUgYWJpbGl0eSB0byBoYW5kbGUgQ3Vyc29yQmluZGVycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBYbWxDdXJzb3JBZGFwdGVyIGV4dGVuZHMgU2ltcGxlQ3Vyc29yQWRhcHRlciBpbXBsZW1lbnRzIE1hbmFnZWRBZGFwdGVyIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVVyaTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVNlbGVjdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBtU2VsZWN0aW9uQXJnczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVNvcnRPcmRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBtQ29sdW1uczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDdXJzb3JCaW5kZXJbXSBtQmluZGVyczsKKyAgICAgICAgcHJpdmF0ZSBBc3luY1Rhc2s8Vm9pZCxWb2lkLEN1cnNvcj4gbUxvYWRUYXNrOworCisgICAgICAgIFhtbEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgbGF5b3V0LCBTdHJpbmcgdXJpLCBTdHJpbmdbXSBmcm9tLCBpbnRbXSB0bywKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgc29ydE9yZGVyLAorICAgICAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBDdXJzb3JCaW5kZXI+IGJpbmRlcnMpIHsKKworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbGF5b3V0LCBudWxsLCBmcm9tLCB0byk7CisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgICAgICBtVXJpID0gdXJpOworICAgICAgICAgICAgbVNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKyAgICAgICAgICAgIG1TZWxlY3Rpb25BcmdzID0gc2VsZWN0aW9uQXJnczsKKyAgICAgICAgICAgIG1Tb3J0T3JkZXIgPSBzb3J0T3JkZXI7CisgICAgICAgICAgICBtQ29sdW1ucyA9IG5ldyBTdHJpbmdbZnJvbS5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgbWFuZGF0b3J5IGluIEN1cnNvckFkYXB0ZXIKKyAgICAgICAgICAgIG1Db2x1bW5zWzBdID0gIl9pZCI7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGZyb20sIDAsIG1Db2x1bW5zLCAxLCBmcm9tLmxlbmd0aCk7CisKKyAgICAgICAgICAgIEN1cnNvckJpbmRlciBiYXNpYyA9IG5ldyBTdHJpbmdCaW5kZXIoY29udGV4dCwgbmV3IElkZW50aXR5VHJhbnNmb3JtYXRpb24oY29udGV4dCkpOworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZnJvbS5sZW5ndGg7CisgICAgICAgICAgICBtQmluZGVycyA9IG5ldyBDdXJzb3JCaW5kZXJbY291bnRdOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBDdXJzb3JCaW5kZXIgYmluZGVyID0gYmluZGVycy5nZXQoZnJvbVtpXSk7CisgICAgICAgICAgICAgICAgaWYgKGJpbmRlciA9PSBudWxsKSBiaW5kZXIgPSBiYXNpYzsKKyAgICAgICAgICAgICAgICBtQmluZGVyc1tpXSA9IGJpbmRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBiaW5kVmlldyhWaWV3IHZpZXcsIENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGN1cnNvcikgeworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVRvLmxlbmd0aDsKKyAgICAgICAgICAgIGZpbmFsIGludFtdIGZyb20gPSBtRnJvbTsKKyAgICAgICAgICAgIGZpbmFsIGludFtdIHRvID0gbVRvOworICAgICAgICAgICAgZmluYWwgQ3Vyc29yQmluZGVyW10gYmluZGVycyA9IG1CaW5kZXJzOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHYgPSB2aWV3LmZpbmRWaWV3QnlJZCh0b1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBiaW5kZXJzW2ldLmJpbmQodiwgY3Vyc29yLCBmcm9tW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBsb2FkKCkgeworICAgICAgICAgICAgaWYgKG1VcmkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Mb2FkVGFzayA9IG5ldyBRdWVyeVRhc2soKS5leGVjdXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldFVyaShTdHJpbmcgdXJpKSB7CisgICAgICAgICAgICBtVXJpID0gdXJpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNoYW5nZUN1cnNvcihDdXJzb3IgYykgeworICAgICAgICAgICAgaWYgKG1Mb2FkVGFzayAhPSBudWxsICYmIG1Mb2FkVGFzay5nZXRTdGF0dXMoKSAhPSBRdWVyeVRhc2suU3RhdHVzLkZJTklTSEVEKSB7CisgICAgICAgICAgICAgICAgbUxvYWRUYXNrLmNhbmNlbCh0cnVlKTsKKyAgICAgICAgICAgICAgICBtTG9hZFRhc2sgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VwZXIuY2hhbmdlQ3Vyc29yKGMpOworICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgUXVlcnlUYXNrIGV4dGVuZHMgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIEN1cnNvcj4geworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgQ3Vyc29yIGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Db250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQWN0aXZpdHkpIG1Db250ZXh0KS5tYW5hZ2VkUXVlcnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJpLnBhcnNlKG1VcmkpLCBtQ29sdW1ucywgbVNlbGVjdGlvbiwgbVNlbGVjdGlvbkFyZ3MsIG1Tb3J0T3JkZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcmkucGFyc2UobVVyaSksIG1Db2x1bW5zLCBtU2VsZWN0aW9uLCBtU2VsZWN0aW9uQXJncywgbVNvcnRPcmRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoQ3Vyc29yIGN1cnNvcikgeworICAgICAgICAgICAgICAgIGlmICghaXNDYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBYbWxDdXJzb3JBZGFwdGVyLnN1cGVyLmNoYW5nZUN1cnNvcihjdXJzb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElkZW50aXR5IHRyYW5zZm9ybWF0aW9uLCByZXR1cm5zIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgY29sdW1uIGFzIGEgU3RyaW5nLAorICAgICAqIHdpdGhvdXQgcGVyZm9ybWluZyBhbnkgbWFuaXB1bGF0aW9uLiBUaGlzIGlzIHVzZWQgd2hlbiBubyB0cmFuc2Zvcm1hdGlvbiBpcyBzcGVjaWZpZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSWRlbnRpdHlUcmFuc2Zvcm1hdGlvbiBleHRlbmRzIEN1cnNvclRyYW5zZm9ybWF0aW9uIHsKKyAgICAgICAgcHVibGljIElkZW50aXR5VHJhbnNmb3JtYXRpb24oQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbkluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGV4cHJlc3Npb24gdHJhbnNmb3JtYXRpb24gaXMgYSBzaW1wbGUgdGVtcGxhdGUgYmFzZWQgcmVwbGFjZW1lbnQgdXRpbGl0eS4KKyAgICAgKiBJbiBhbiBleHByZXNzaW9uLCBlYWNoIHNlZ21lbnQgb2YgdGhlIGZvcm0gPGNvZGU+eyhbXn1dKyl9PC9jb2RlPiBpcyByZXBsYWNlZAorICAgICAqIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4gb2YgbmFtZSAkMS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFeHByZXNzaW9uVHJhbnNmb3JtYXRpb24gZXh0ZW5kcyBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgRXhwcmVzc2lvbk5vZGUgbUZpcnN0Tm9kZSA9IG5ldyBDb25zdGFudEV4cHJlc3Npb25Ob2RlKCIiKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWlsZGVyIG1CdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICBwdWJsaWMgRXhwcmVzc2lvblRyYW5zZm9ybWF0aW9uKENvbnRleHQgY29udGV4dCwgU3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworCisgICAgICAgICAgICBwYXJzZShleHByZXNzaW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwYXJzZShTdHJpbmcgZXhwcmVzc2lvbikgeworICAgICAgICAgICAgRXhwcmVzc2lvbk5vZGUgbm9kZSA9IG1GaXJzdE5vZGU7CisgICAgICAgICAgICBpbnQgc2VnbWVudFN0YXJ0OworICAgICAgICAgICAgaW50IGNvdW50ID0gZXhwcmVzc2lvbi5sZW5ndGgoKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gZXhwcmVzc2lvbi5jaGFyQXQoaSk7CisgICAgICAgICAgICAgICAgLy8gU3RhcnQgYSBjb2x1bW4gbmFtZSBzZWdtZW50CisgICAgICAgICAgICAgICAgc2VnbWVudFN0YXJ0ID0gaTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAneycpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBjb3VudCAmJiAoYyA9IGV4cHJlc3Npb24uY2hhckF0KGkpKSAhPSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQsIGJ1dCB0aGUgZXhwcmVzc2lvbiBkaWRuJ3QgY2xvc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgdHJhbnNmb3JtIGV4cHJlc3Npb24gY29udGFpbnMgYSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1jbG9zZWQgY29sdW1uIG5hbWU6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uLnN1YnN0cmluZyhzZWdtZW50U3RhcnQgKyAxLCBpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbm9kZS5uZXh0ID0gbmV3IENvbHVtbkV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb24uc3Vic3RyaW5nKHNlZ21lbnRTdGFydCArIDEsIGkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGNvdW50ICYmIChjID0gZXhwcmVzc2lvbi5jaGFyQXQoaSkpICE9ICd7JykgeworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5vZGUubmV4dCA9IG5ldyBDb25zdGFudEV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb24uc3Vic3RyaW5nKHNlZ21lbnRTdGFydCwgaSkpOworICAgICAgICAgICAgICAgICAgICAvLyBSZXdpbmQgaWYgd2UndmUgcmVhY2hlZCBhIGNvbHVtbiBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICd7JykgaS0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbUJ1aWxkZXI7CisgICAgICAgICAgICBidWlsZGVyLmRlbGV0ZSgwLCBidWlsZGVyLmxlbmd0aCgpKTsKKworICAgICAgICAgICAgRXhwcmVzc2lvbk5vZGUgbm9kZSA9IG1GaXJzdE5vZGU7CisgICAgICAgICAgICAvLyBTa2lwIHRoZSBmaXJzdCBub2RlCisgICAgICAgICAgICB3aGlsZSAoKG5vZGUgPSBub2RlLm5leHQpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChub2RlLmFzU3RyaW5nKGN1cnNvcikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb25Ob2RlIHsKKyAgICAgICAgICAgIHB1YmxpYyBFeHByZXNzaW9uTm9kZSBuZXh0OworCisgICAgICAgICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGFzU3RyaW5nKEN1cnNvciBjdXJzb3IpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGNsYXNzIENvbnN0YW50RXhwcmVzc2lvbk5vZGUgZXh0ZW5kcyBFeHByZXNzaW9uTm9kZSB7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ29uc3RhbnQ7CisKKyAgICAgICAgICAgIENvbnN0YW50RXhwcmVzc2lvbk5vZGUoU3RyaW5nIGNvbnN0YW50KSB7CisgICAgICAgICAgICAgICAgbUNvbnN0YW50ID0gY29uc3RhbnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBhc1N0cmluZyhDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Db25zdGFudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBjbGFzcyBDb2x1bW5FeHByZXNzaW9uTm9kZSBleHRlbmRzIEV4cHJlc3Npb25Ob2RlIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Db2x1bW5OYW1lOworICAgICAgICAgICAgcHJpdmF0ZSBDdXJzb3IgbVNpZ25hdHVyZTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1Db2x1bW5JbmRleCA9IC0xOworCisgICAgICAgICAgICBDb2x1bW5FeHByZXNzaW9uTm9kZShTdHJpbmcgY29sdW1uTmFtZSkgeworICAgICAgICAgICAgICAgIG1Db2x1bW5OYW1lID0gY29sdW1uTmFtZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGFzU3RyaW5nKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG1TaWduYXR1cmUgfHwgbUNvbHVtbkluZGV4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db2x1bW5JbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChtQ29sdW1uTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYXR1cmUgPSBjdXJzb3I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRTdHJpbmcobUNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbWFwIHRyYW5zZm9ybWF0aW9uIG9mZmVycyBhIHNpbXBsZSBtYXBwaW5nIGJldHdlZW4gc3BlY2lmaWVkIFN0cmluZyB2YWx1ZXMKKyAgICAgKiB0byBTdHJpbmdzIG9yIGludGVnZXJzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1hcFRyYW5zZm9ybWF0aW9uIGV4dGVuZHMgQ3Vyc29yVHJhbnNmb3JtYXRpb24geworICAgICAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1TdHJpbmdNYXBwaW5nczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gbVJlc291cmNlTWFwcGluZ3M7CisKKyAgICAgICAgcHVibGljIE1hcFRyYW5zZm9ybWF0aW9uKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgICAgICBtU3RyaW5nTWFwcGluZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgICAgIG1SZXNvdXJjZU1hcHBpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhZGRTdHJpbmdNYXBwaW5nKFN0cmluZyBmcm9tLCBTdHJpbmcgdG8pIHsKKyAgICAgICAgICAgIG1TdHJpbmdNYXBwaW5ncy5wdXQoZnJvbSwgdG8pOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhZGRSZXNvdXJjZU1hcHBpbmcoU3RyaW5nIGZyb20sIGludCB0bykgeworICAgICAgICAgICAgbVJlc291cmNlTWFwcGluZ3MucHV0KGZyb20sIHRvKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGN1cnNvci5nZXRTdHJpbmcoY29sdW1uSW5kZXgpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRyYW5zZm9ybWVkID0gbVN0cmluZ01hcHBpbmdzLmdldCh2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWQgPT0gbnVsbCA/IHZhbHVlIDogdHJhbnNmb3JtZWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCB0cmFuc2Zvcm1Ub1Jlc291cmNlKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gY3Vyc29yLmdldFN0cmluZyhjb2x1bW5JbmRleCk7CisgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHRyYW5zZm9ybWVkID0gbVJlc291cmNlTWFwcGluZ3MuZ2V0KHZhbHVlKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkID09IG51bGwgPyBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSA6IHRyYW5zZm9ybWVkOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgU3RyaW5nIHRvIGEgVGV4dFZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RyaW5nQmluZGVyIGV4dGVuZHMgQ3Vyc29yQmluZGVyIHsKKyAgICAgICAgcHVibGljIFN0cmluZ0JpbmRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYmluZChWaWV3IHZpZXcsIEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBUZXh0VmlldykgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0ID0gbVRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShjdXJzb3IsIGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgICAgICAoKFRleHRWaWV3KSB2aWV3KS5zZXRUZXh0KHRleHQpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQmluZHMgYW4gaW1hZ2UgYmxvYiB0byBhbiBJbWFnZVZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW1hZ2VCaW5kZXIgZXh0ZW5kcyBDdXJzb3JCaW5kZXIgeworICAgICAgICBwdWJsaWMgSW1hZ2VCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgSW1hZ2VWaWV3KSB7CisgICAgICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGRhdGEgPSBjdXJzb3IuZ2V0QmxvYihjb2x1bW5JbmRleCk7CisgICAgICAgICAgICAgICAgKChJbWFnZVZpZXcpIHZpZXcpLnNldEltYWdlQml0bWFwKEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KGRhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmxlbmd0aCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGFnQmluZGVyIGV4dGVuZHMgQ3Vyc29yQmluZGVyIHsKKyAgICAgICAgcHVibGljIFRhZ0JpbmRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYmluZChWaWV3IHZpZXcsIEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRleHQgPSBtVHJhbnNmb3JtYXRpb24udHJhbnNmb3JtKGN1cnNvciwgY29sdW1uSW5kZXgpOworICAgICAgICAgICAgdmlldy5zZXRUYWcodGV4dCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIGFuIGltYWdlIFVSSSB0byBhbiBJbWFnZVZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW1hZ2VVcmlCaW5kZXIgZXh0ZW5kcyBDdXJzb3JCaW5kZXIgeworICAgICAgICBwdWJsaWMgSW1hZ2VVcmlCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgSW1hZ2VWaWV3KSB7CisgICAgICAgICAgICAgICAgKChJbWFnZVZpZXcpIHZpZXcpLnNldEltYWdlVVJJKFVyaS5wYXJzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFuc2Zvcm1hdGlvbi50cmFuc2Zvcm0oY3Vyc29yLCBjb2x1bW5JbmRleCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgZHJhd2FibGUgcmVzb3VyY2UgaWRlbnRpZmllciB0byBhbiBJbWFnZVZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRHJhd2FibGVCaW5kZXIgZXh0ZW5kcyBDdXJzb3JCaW5kZXIgeworICAgICAgICBwdWJsaWMgRHJhd2FibGVCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgSW1hZ2VWaWV3KSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHJlc291cmNlID0gbVRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybVRvUmVzb3VyY2UoY3Vyc29yLCBjb2x1bW5JbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlID09IDApIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgICgoSW1hZ2VWaWV3KSB2aWV3KS5zZXRJbWFnZVJlc291cmNlKHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BcnJheUFkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BcnJheUFkYXB0ZXIuamF2YQppbmRleCAwM2FkYTk0Li5iNGVjZTI0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQXJyYXlBZGFwdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FycmF5QWRhcHRlci5qYXZhCkBAIC0zMCwxNyArMzAsMTcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiAKIC8qKgotICogQSBMaXN0QWRhcHRlciB0aGF0IG1hbmFnZXMgYSBMaXN0VmlldyBiYWNrZWQgYnkgYW4gYXJyYXkgb2YgYXJiaXRyYXJ5CisgKiBBIGNvbmNyZXRlIEJhc2VBZGFwdGVyIHRoYXQgaXMgYmFja2VkIGJ5IGFuIGFycmF5IG9mIGFyYml0cmFyeQogICogb2JqZWN0cy4gIEJ5IGRlZmF1bHQgdGhpcyBjbGFzcyBleHBlY3RzIHRoYXQgdGhlIHByb3ZpZGVkIHJlc291cmNlIGlkIHJlZmVyZW5jZXMKICAqIGEgc2luZ2xlIFRleHRWaWV3LiAgSWYgeW91IHdhbnQgdG8gdXNlIGEgbW9yZSBjb21wbGV4IGxheW91dCwgdXNlIHRoZSBjb25zdHJ1Y3RvcnMgdGhhdAogICogYWxzbyB0YWtlcyBhIGZpZWxkIGlkLiAgVGhhdCBmaWVsZCBpZCBzaG91bGQgcmVmZXJlbmNlIGEgVGV4dFZpZXcgaW4gdGhlIGxhcmdlciBsYXlvdXQKICAqIHJlc291cmNlLgogICoKLSAqIEhvd2V2ZXIgdGhlIFRleHRWaWV3IGlzIHJlZmVyZW5jZWQsIGl0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHRvU3RyaW5nKCkgb2YgZWFjaCBvYmplY3QgaW4KKyAqIDxwPkhvd2V2ZXIgdGhlIFRleHRWaWV3IGlzIHJlZmVyZW5jZWQsIGl0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHRvU3RyaW5nKCkgb2YgZWFjaCBvYmplY3QgaW4KICAqIHRoZSBhcnJheS4gWW91IGNhbiBhZGQgbGlzdHMgb3IgYXJyYXlzIG9mIGN1c3RvbSBvYmplY3RzLiBPdmVycmlkZSB0aGUgdG9TdHJpbmcoKSBtZXRob2QKICAqIG9mIHlvdXIgb2JqZWN0cyB0byBkZXRlcm1pbmUgd2hhdCB0ZXh0IHdpbGwgYmUgZGlzcGxheWVkIGZvciB0aGUgaXRlbSBpbiB0aGUgbGlzdC4KICAqCi0gKiBUbyB1c2Ugc29tZXRoaW5nIG90aGVyIHRoYW4gVGV4dFZpZXdzIGZvciB0aGUgYXJyYXkgZGlzcGxheSwgZm9yIGluc3RhbmNlLCBJbWFnZVZpZXdzLAorICogPHA+VG8gdXNlIHNvbWV0aGluZyBvdGhlciB0aGFuIFRleHRWaWV3cyBmb3IgdGhlIGFycmF5IGRpc3BsYXksIGZvciBpbnN0YW5jZSwgSW1hZ2VWaWV3cywKICAqIG9yIHRvIGhhdmUgc29tZSBvZiBkYXRhIGJlc2lkZXMgdG9TdHJpbmcoKSByZXN1bHRzIGZpbGwgdGhlIHZpZXdzLAogICogb3ZlcnJpZGUge0BsaW5rICNnZXRWaWV3KGludCwgVmlldywgVmlld0dyb3VwKX0gdG8gcmV0dXJuIHRoZSB0eXBlIG9mIHZpZXcgeW91IHdhbnQuCiAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BdXRvQ29tcGxldGVUZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0F1dG9Db21wbGV0ZVRleHRWaWV3LmphdmEKaW5kZXggMzk3MTQ4Ny4uZTA3YmVmYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0F1dG9Db21wbGV0ZVRleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0F1dG9Db21wbGV0ZVRleHRWaWV3LmphdmEKQEAgLTI5LDEzICsyOSwxMiBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuQ29tcGxldGlvbkluZm87Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIApAQCAtOTMsNDUgKzkyLDIxIEBACiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBdXRvQ29tcGxldGVUZXh0VmlldyI7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSElOVF9WSUVXX0lEID0gMHgxNzsKLQotICAgIC8qKgotICAgICAqIFRoaXMgdmFsdWUgY29udHJvbHMgdGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIHVzZXIKLSAgICAgKiBtdXN0IGxlYXZlIGEgcG9pbnRlciBkb3duIHdpdGhvdXQgc2Nyb2xsaW5nIHRvIGV4cGFuZAotICAgICAqIHRoZSBhdXRvY29tcGxldGUgZHJvcGRvd24gbGlzdCB0byBjb3ZlciB0aGUgSU1FLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfTElTVF9USU1FT1VUID0gMjUwOwotCiAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbUhpbnRUZXh0OworICAgIHByaXZhdGUgVGV4dFZpZXcgbUhpbnRWaWV3OwogICAgIHByaXZhdGUgaW50IG1IaW50UmVzb3VyY2U7CiAKICAgICBwcml2YXRlIExpc3RBZGFwdGVyIG1BZGFwdGVyOwogICAgIHByaXZhdGUgRmlsdGVyIG1GaWx0ZXI7CiAgICAgcHJpdmF0ZSBpbnQgbVRocmVzaG9sZDsKIAotICAgIHByaXZhdGUgUG9wdXBXaW5kb3cgbVBvcHVwOwotICAgIHByaXZhdGUgRHJvcERvd25MaXN0VmlldyBtRHJvcERvd25MaXN0OwotICAgIHByaXZhdGUgaW50IG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0OwotICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQ7CisgICAgcHJpdmF0ZSBMaXN0UG9wdXBXaW5kb3cgbVBvcHVwOwogICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bkFuY2hvcklkOwotICAgIHByaXZhdGUgVmlldyBtRHJvcERvd25BbmNob3JWaWV3OyAgLy8gdmlldyBpcyByZXRyaWV2ZWQgbGF6aWx5IGZyb20gaWQgb25jZSBuZWVkZWQKLSAgICBwcml2YXRlIGludCBtRHJvcERvd25XaWR0aDsKLSAgICBwcml2YXRlIGludCBtRHJvcERvd25IZWlnaHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7Ci0KLSAgICBwcml2YXRlIERyYXdhYmxlIG1Ecm9wRG93bkxpc3RIaWdobGlnaHQ7CiAKICAgICBwcml2YXRlIEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgbUl0ZW1DbGlja0xpc3RlbmVyOwogICAgIHByaXZhdGUgQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBtSXRlbVNlbGVjdGVkTGlzdGVuZXI7CiAKLSAgICBwcml2YXRlIGZpbmFsIERyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIgbURyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIgPQotICAgICAgICAgICAgbmV3IERyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIoKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtRHJvcERvd25BbHdheXNWaXNpYmxlID0gZmFsc2U7Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gbURyb3BEb3duRGlzbWlzc2VkT25Db21wbGV0aW9uID0gdHJ1ZTsKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoID0gZmFsc2U7CiAKICAgICBwcml2YXRlIGludCBtTGFzdEtleUNvZGUgPSBLZXlFdmVudC5LRVlDT0RFX1VOS05PV047CiAgICAgcHJpdmF0ZSBib29sZWFuIG1PcGVuQmVmb3JlOwpAQCAtMTQwLDEwICsxMTUsNiBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1CbG9ja0NvbXBsZXRpb247CiAKLSAgICBwcml2YXRlIExpc3RTZWxlY3RvckhpZGVyIG1IaWRlU2VsZWN0b3I7Ci0gICAgcHJpdmF0ZSBSdW5uYWJsZSBtU2hvd0Ryb3BEb3duUnVubmFibGU7Ci0gICAgcHJpdmF0ZSBSdW5uYWJsZSBtUmVzaXplUG9wdXBSdW5uYWJsZSA9IG5ldyBSZXNpemVQb3B1cFJ1bm5hYmxlKCk7Ci0KICAgICBwcml2YXRlIFBhc3NUaHJvdWdoQ2xpY2tMaXN0ZW5lciBtUGFzc1Rocm91Z2hDbGlja0xpc3RlbmVyOwogICAgIHByaXZhdGUgUG9wdXBEYXRhU2V0T2JzZXJ2ZXIgbU9ic2VydmVyOwogCkBAIC0xNTgsOSArMTI5LDEwIEBACiAgICAgcHVibGljIEF1dG9Db21wbGV0ZVRleHRWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKIAotICAgICAgICBtUG9wdXAgPSBuZXcgUG9wdXBXaW5kb3coY29udGV4dCwgYXR0cnMsCisgICAgICAgIG1Qb3B1cCA9IG5ldyBMaXN0UG9wdXBXaW5kb3coY29udGV4dCwgYXR0cnMsCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmF1dG9Db21wbGV0ZVRleHRWaWV3U3R5bGUpOwogICAgICAgICBtUG9wdXAuc2V0U29mdElucHV0TW9kZShXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX0FESlVTVF9SRVNJWkUpOworICAgICAgICBtUG9wdXAuc2V0UHJvbXB0UG9zaXRpb24oTGlzdFBvcHVwV2luZG93LlBPU0lUSU9OX1BST01QVF9CRUxPVyk7CiAKICAgICAgICAgVHlwZWRBcnJheSBhID0KICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcygKQEAgLTE2OSwxNCArMTQxLDExIEBACiAgICAgICAgIG1UaHJlc2hvbGQgPSBhLmdldEludCgKICAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19jb21wbGV0aW9uVGhyZXNob2xkLCAyKTsKIAotICAgICAgICBtSGludFRleHQgPSBhLmdldFRleHQoUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfY29tcGxldGlvbkhpbnQpOwotCi0gICAgICAgIG1Ecm9wRG93bkxpc3RIaWdobGlnaHQgPSBhLmdldERyYXdhYmxlKAotICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duU2VsZWN0b3IpOwotICAgICAgICBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCA9IChpbnQpCi0gICAgICAgICAgICAgICAgYS5nZXREaW1lbnNpb24oUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25WZXJ0aWNhbE9mZnNldCwgMC4wZik7Ci0gICAgICAgIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQgPSAoaW50KQotICAgICAgICAgICAgICAgIGEuZ2V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duSG9yaXpvbnRhbE9mZnNldCwgMC4wZik7CisgICAgICAgIG1Qb3B1cC5zZXRMaXN0U2VsZWN0b3IoYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93blNlbGVjdG9yKSk7CisgICAgICAgIG1Qb3B1cC5zZXRWZXJ0aWNhbE9mZnNldCgoaW50KQorICAgICAgICAgICAgICAgIGEuZ2V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duVmVydGljYWxPZmZzZXQsIDAuMGYpKTsKKyAgICAgICAgbVBvcHVwLnNldEhvcml6b250YWxPZmZzZXQoKGludCkKKyAgICAgICAgICAgICAgICBhLmdldERpbWVuc2lvbihSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bkhvcml6b250YWxPZmZzZXQsIDAuMGYpKTsKICAgICAgICAgCiAgICAgICAgIC8vIEdldCB0aGUgYW5jaG9yJ3MgaWQgbm93LCBidXQgdGhlIHZpZXcgd29uJ3QgYmUgcmVhZHksIHNvIHdhaXQgdG8gYWN0dWFsbHkgZ2V0IHRoZQogICAgICAgICAvLyB2aWV3IGFuZCBzdG9yZSBpdCBpbiBtRHJvcERvd25BbmNob3JWaWV3IGxhemlseSBpbiBnZXREcm9wRG93bkFuY2hvclZpZXcgbGF0ZXIuCkBAIC0xODcsMTMgKzE1NiwxOCBAQAogICAgICAgICAKICAgICAgICAgLy8gRm9yIGRyb3Bkb3duIHdpZHRoLCB0aGUgZGV2ZWxvcGVyIGNhbiBzcGVjaWZ5IGEgc3BlY2lmaWMgd2lkdGgsIG9yIE1BVENIX1BBUkVOVAogICAgICAgICAvLyAoZm9yIGZ1bGwgc2NyZWVuIHdpZHRoKSBvciBXUkFQX0NPTlRFTlQgKHRvIG1hdGNoIHRoZSB3aWR0aCBvZiB0aGUgYW5jaG9yZWQgdmlldykuCi0gICAgICAgIG1Ecm9wRG93bldpZHRoID0gYS5nZXRMYXlvdXREaW1lbnNpb24oUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25XaWR0aCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0gICAgICAgIG1Ecm9wRG93bkhlaWdodCA9IGEuZ2V0TGF5b3V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duSGVpZ2h0LAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKKyAgICAgICAgbVBvcHVwLnNldFdpZHRoKGEuZ2V0TGF5b3V0RGltZW5zaW9uKAorICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duV2lkdGgsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKTsKKyAgICAgICAgbVBvcHVwLnNldEhlaWdodChhLmdldExheW91dERpbWVuc2lvbigKKyAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bkhlaWdodCwKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkpOwogCiAgICAgICAgIG1IaW50UmVzb3VyY2UgPSBhLmdldFJlc291cmNlSWQoUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfY29tcGxldGlvbkhpbnRWaWV3LAogICAgICAgICAgICAgICAgIFIubGF5b3V0LnNpbXBsZV9kcm9wZG93bl9oaW50KTsKKyAgICAgICAgCisgICAgICAgIG1Qb3B1cC5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG5ldyBEcm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyKCkpOworICAgICAgICBzZXRDb21wbGV0aW9uSGludChhLmdldFRleHQoUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfY29tcGxldGlvbkhpbnQpKTsKIAogICAgICAgICAvLyBBbHdheXMgdHVybiBvbiB0aGUgYXV0byBjb21wbGV0ZSBpbnB1dCB0eXBlIGZsYWcsIHNpbmNlIGl0CiAgICAgICAgIC8vIG1ha2VzIG5vIHNlbnNlIHRvIHVzZSB0aGlzIHdpZGdldCB3aXRob3V0IGl0LgpAQCAtMjQxLDYgKzIxNSwyMCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbXBsZXRpb25IaW50KENoYXJTZXF1ZW5jZSBoaW50KSB7CiAgICAgICAgIG1IaW50VGV4dCA9IGhpbnQ7CisgICAgICAgIGlmIChoaW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtSGludFZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFRleHRWaWV3IGhpbnRWaWV3ID0gKFRleHRWaWV3KSBMYXlvdXRJbmZsYXRlci5mcm9tKGdldENvbnRleHQoKSkuaW5mbGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1IaW50UmVzb3VyY2UsIG51bGwpLmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnRleHQxKTsKKyAgICAgICAgICAgICAgICBoaW50Vmlldy5zZXRUZXh0KG1IaW50VGV4dCk7CisgICAgICAgICAgICAgICAgbUhpbnRWaWV3ID0gaGludFZpZXc7CisgICAgICAgICAgICAgICAgbVBvcHVwLnNldFByb21wdFZpZXcoaGludFZpZXcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSGludFZpZXcuc2V0VGV4dChoaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRQcm9tcHRWaWV3KG51bGwpOworICAgICAgICAgICAgbUhpbnRWaWV3ID0gbnVsbDsKKyAgICAgICAgfQogICAgIH0KICAgICAKICAgICAvKioKQEAgLTI1Myw3ICsyNDEsNyBAQAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0F1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duV2lkdGgKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERyb3BEb3duV2lkdGgoKSB7Ci0gICAgICAgIHJldHVybiBtRHJvcERvd25XaWR0aDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRXaWR0aCgpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTI2Niw3ICsyNTQsNyBAQAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0F1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duV2lkdGgKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREcm9wRG93bldpZHRoKGludCB3aWR0aCkgewotICAgICAgICBtRHJvcERvd25XaWR0aCA9IHdpZHRoOworICAgICAgICBtUG9wdXAuc2V0V2lkdGgod2lkdGgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjgwLDcgKzI2OCw3IEBACiAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25IZWlnaHQKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERyb3BEb3duSGVpZ2h0KCkgewotICAgICAgICByZXR1cm4gbURyb3BEb3duSGVpZ2h0OworICAgICAgICByZXR1cm4gbVBvcHVwLmdldEhlaWdodCgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjk0LDcgKzI4Miw3IEBACiAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25IZWlnaHQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREcm9wRG93bkhlaWdodChpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIG1Ecm9wRG93bkhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgbVBvcHVwLnNldEhlaWdodChoZWlnaHQpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTMxOSw3ICszMDcsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duQW5jaG9yKGludCBpZCkgewogICAgICAgICBtRHJvcERvd25BbmNob3JJZCA9IGlkOwotICAgICAgICBtRHJvcERvd25BbmNob3JWaWV3ID0gbnVsbDsKKyAgICAgICAgbVBvcHVwLnNldEFuY2hvclZpZXcobnVsbCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMzYxLDcgKzM0OSw3IEBACiAgICAgICogQHBhcmFtIG9mZnNldCB0aGUgdmVydGljYWwgb2Zmc2V0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25WZXJ0aWNhbE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICBtUG9wdXAuc2V0VmVydGljYWxPZmZzZXQob2Zmc2V0KTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zNzAsNyArMzU4LDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSB2ZXJ0aWNhbCBvZmZzZXQKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERyb3BEb3duVmVydGljYWxPZmZzZXQoKSB7Ci0gICAgICAgIHJldHVybiBtRHJvcERvd25WZXJ0aWNhbE9mZnNldDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRWZXJ0aWNhbE9mZnNldCgpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTM3OSw3ICszNjcsNyBAQAogICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIGhvcml6b250YWwgb2Zmc2V0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0KGludCBvZmZzZXQpIHsKLSAgICAgICAgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgbVBvcHVwLnNldEhvcml6b250YWxPZmZzZXQob2Zmc2V0KTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zODgsNyArMzc2LDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBob3Jpem9udGFsIG9mZnNldAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0KCkgewotICAgICAgICByZXR1cm4gbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRIb3Jpem9udGFsT2Zmc2V0KCk7CiAgICAgfQogCiAgICAgIC8qKgpAQCAtNDI1LDcgKzQxMyw3IEBACiAgICAgICogQGhpZGUgUGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkgewotICAgICAgICByZXR1cm4gbURyb3BEb3duQWx3YXlzVmlzaWJsZTsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDQyLDcgKzQzMCw3IEBACiAgICAgICogQGhpZGUgUGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duQWx3YXlzVmlzaWJsZShib29sZWFuIGRyb3BEb3duQWx3YXlzVmlzaWJsZSkgewotICAgICAgICBtRHJvcERvd25BbHdheXNWaXNpYmxlID0gZHJvcERvd25BbHdheXNWaXNpYmxlOworICAgICAgICBtUG9wdXAuc2V0RHJvcERvd25BbHdheXNWaXNpYmxlKGRyb3BEb3duQWx3YXlzVmlzaWJsZSk7CiAgICAgfQogICAgCiAgICAgLyoqCkBAIC02MDksMTUgKzU5NywxMyBAQAogICAgICAgICAgICAgbUZpbHRlciA9IG51bGw7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobURyb3BEb3duTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEFkYXB0ZXIobUFkYXB0ZXIpOwotICAgICAgICB9CisgICAgICAgIG1Qb3B1cC5zZXRBZGFwdGVyKG1BZGFwdGVyKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbktleVByZUltZShpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9CQUNLICYmIGlzUG9wdXBTaG93aW5nKCkKLSAgICAgICAgICAgICAgICAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICAgICAgICAgICYmICFtUG9wdXAuaXNEcm9wRG93bkFsd2F5c1Zpc2libGUoKSkgewogICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB0aGUgYmFjayBrZXksIHdlIGRvIG5vdCBldmVuIHRyeSB0byBzZW5kIGl0CiAgICAgICAgICAgICAvLyB0byB0aGUgZHJvcCBkb3duIGxpc3QgYnV0IGluc3RlYWQsIGNvbnN1bWUgaXQgaW1tZWRpYXRlbHkKICAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTiAmJiBldmVudC5nZXRSZXBlYXRDb3VudCgpID09IDApIHsKQEAgLTYzNiwxOCArNjIyLDE2IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbktleVVwKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICBpZiAoaXNQb3B1cFNob3dpbmcoKSAmJiBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCkgPj0gMCkgewotICAgICAgICAgICAgYm9vbGVhbiBjb25zdW1lZCA9IG1Ecm9wRG93bkxpc3Qub25LZXlVcChrZXlDb2RlLCBldmVudCk7Ci0gICAgICAgICAgICBpZiAoY29uc3VtZWQpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleUNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGxpc3QgYWNjZXB0cyB0aGUga2V5IGV2ZW50cyBhbmQgdGhlIGtleSBldmVudAotICAgICAgICAgICAgICAgICAgICAvLyB3YXMgYSBjbGljaywgdGhlIHRleHQgdmlldyBnZXRzIHRoZSBzZWxlY3RlZCBpdGVtCi0gICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGRyb3AgZG93biBhcyBpdHMgY29udGVudAotICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1Db21wbGV0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gY29uc3VtZWQgPSBtUG9wdXAub25LZXlVcChrZXlDb2RlLCBldmVudCk7CisgICAgICAgIGlmIChjb25zdW1lZCkgeworICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICAvLyBpZiB0aGUgbGlzdCBhY2NlcHRzIHRoZSBrZXkgZXZlbnRzIGFuZCB0aGUga2V5IGV2ZW50CisgICAgICAgICAgICAvLyB3YXMgYSBjbGljaywgdGhlIHRleHQgdmlldyBnZXRzIHRoZSBzZWxlY3RlZCBpdGVtCisgICAgICAgICAgICAvLyBmcm9tIHRoZSBkcm9wIGRvd24gYXMgaXRzIGNvbnRlbnQKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9FTlRFUjoKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUjoKKyAgICAgICAgICAgICAgICBwZXJmb3JtQ29tcGxldGlvbigpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdXBlci5vbktleVVwKGtleUNvZGUsIGV2ZW50KTsKQEAgLTY1NSw4NyArNjM5LDExIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIC8vIHdoZW4gdGhlIGRyb3AgZG93biBpcyBzaG93biwgd2UgZHJpdmUgaXQgZGlyZWN0bHkKLSAgICAgICAgaWYgKGlzUG9wdXBTaG93aW5nKCkpIHsKLSAgICAgICAgICAgIC8vIHRoZSBrZXkgZXZlbnRzIGFyZSBmb3J3YXJkZWQgdG8gdGhlIGxpc3QgaW4gdGhlIGRyb3AgZG93biB2aWV3Ci0gICAgICAgICAgICAvLyBub3RlIHRoYXQgTGlzdFZpZXcgaGFuZGxlcyBzcGFjZSBidXQgd2UgZG9uJ3Qgd2FudCB0aGF0IHRvIGhhcHBlbgotICAgICAgICAgICAgLy8gYWxzbyBpZiBzZWxlY3Rpb24gaXMgbm90IGN1cnJlbnRseSBpbiB0aGUgZHJvcCBkb3duLCB0aGVuIGRvbid0Ci0gICAgICAgICAgICAvLyBsZXQgY2VudGVyIG9yIGVudGVyIHByZXNzZXMgZ28gdGhlcmUgc2luY2UgdGhhdCB3b3VsZCBjYXVzZSBpdAotICAgICAgICAgICAgLy8gdG8gc2VsZWN0IG9uZSBvZiBpdHMgaXRlbXMKLSAgICAgICAgICAgIGlmIChrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfU1BBQ0UKLSAgICAgICAgICAgICAgICAgICAgJiYgKG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSA+PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9FTlRFUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYga2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKSkpIHsKLSAgICAgICAgICAgICAgICBpbnQgY3VySW5kZXggPSBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBjb25zdW1lZDsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYmVsb3cgPSAhbVBvcHVwLmlzQWJvdmVBbmNob3IoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIExpc3RBZGFwdGVyIGFkYXB0ZXIgPSBtQWRhcHRlcjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBib29sZWFuIGFsbEVuYWJsZWQ7Ci0gICAgICAgICAgICAgICAgaW50IGZpcnN0SXRlbSA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICAgICAgICAgIGludCBsYXN0SXRlbSA9IEludGVnZXIuTUlOX1ZBTFVFOwotCi0gICAgICAgICAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhbGxFbmFibGVkID0gYWRhcHRlci5hcmVBbGxJdGVtc0VuYWJsZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RJdGVtID0gYWxsRW5hYmxlZCA/IDAgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QubG9va0ZvclNlbGVjdGFibGVQb3NpdGlvbigwLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgbGFzdEl0ZW0gPSBhbGxFbmFibGVkID8gYWRhcHRlci5nZXRDb3VudCgpIC0gMSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5sb29rRm9yU2VsZWN0YWJsZVBvc2l0aW9uKGFkYXB0ZXIuZ2V0Q291bnQoKSAtIDEsIGZhbHNlKTsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoKGJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQICYmIGN1ckluZGV4IDw9IGZpcnN0SXRlbSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICghYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiAmJiBjdXJJbmRleCA+PSBsYXN0SXRlbSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgc2VsZWN0aW9uIGlzIGF0IHRoZSB0b3AsIHdlIGJsb2NrIHRoZSBrZXkKLSAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgdG8gcHJldmVudCBmb2N1cyBmcm9tIG1vdmluZy4KLSAgICAgICAgICAgICAgICAgICAgY2xlYXJMaXN0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRJbnB1dE1ldGhvZE1vZGUoUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05FRURFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBXQVJOSU5HOiBQbGVhc2UgcmVhZCB0aGUgY29tbWVudCB3aGVyZSBtTGlzdFNlbGVjdGlvbkhpZGRlbgotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBpcyBkZWNsYXJlZAotICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY29uc3VtZWQgPSBtRHJvcERvd25MaXN0Lm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJLZXkgZG93bjogY29kZT0iICsga2V5Q29kZSArICIgbGlzdCBjb25zdW1lZD0iICsgY29uc3VtZWQpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIGl0IGhhbmRsZWQgdGhlIGtleSBldmVudCwgdGhlbiB0aGUgdXNlciBpcwotICAgICAgICAgICAgICAgICAgICAvLyBuYXZpZ2F0aW5nIGluIHRoZSBsaXN0LCBzbyB3ZSBzaG91bGQgcHV0IGl0IGluIGZyb250LgotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSGVyZSdzIGEgbGl0dGxlIHRyaWNrIHdlIG5lZWQgdG8gZG8gdG8gbWFrZSBzdXJlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxpc3QgdmlldyBpcyBhY3R1YWxseSBzaG93aW5nIGl0cyBmb2N1cyBpbmRpY2F0b3IsCi0gICAgICAgICAgICAgICAgICAgIC8vIGJ5IGVuc3VyaW5nIGl0IGhhcyBmb2N1cyBhbmQgZ2V0dGluZyBpdHMgd2luZG93IG91dAotICAgICAgICAgICAgICAgICAgICAvLyBvZiB0b3VjaCBtb2RlLgotICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnJlcXVlc3RGb2N1c0Zyb21Ub3VjaCgpOwotICAgICAgICAgICAgICAgICAgICBzaG93RHJvcERvd24oKTsKLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleUNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF2b2lkIHBhc3NpbmcgdGhlIGZvY3VzIGZyb20gdGhlIHRleHQgdmlldyB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgY29tcG9uZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTikgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgc2VsZWN0aW9uIGlzIGF0IHRoZSBib3R0b20sIHdlIGJsb2NrIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgdG8gYXZvaWQgZ29pbmcgdG8gdGhlIG5leHQgZm9jdXNhYmxlIHdpZGdldAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckluZGV4ID09IGxhc3RJdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VySW5kZXggPT0gZmlyc3RJdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1Qb3B1cC5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFpc1BvcHVwU2hvd2luZygpKSB7CiAgICAgICAgICAgICBzd2l0Y2goa2V5Q29kZSkgewogICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTjoKICAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbigpOwpAQCAtNzQ2LDcgKzY1NCw3IEBACiAgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CiAgICAgICAgIG1MYXN0S2V5Q29kZSA9IEtleUV2ZW50LktFWUNPREVfVU5LTk9XTjsKIAotICAgICAgICBpZiAoaGFuZGxlZCAmJiBpc1BvcHVwU2hvd2luZygpICYmIG1Ecm9wRG93bkxpc3QgIT0gbnVsbCkgeworICAgICAgICBpZiAoaGFuZGxlZCAmJiBpc1BvcHVwU2hvd2luZygpKSB7CiAgICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKICAgICAgICAgfQogCkBAIC04MDcsMTEgKzcxNSwxMiBAQAogICAgICAgICBpZiAoZW5vdWdoVG9GaWx0ZXIoKSkgewogICAgICAgICAgICAgaWYgKG1GaWx0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHBlcmZvcm1GaWx0ZXJpbmcoZ2V0VGV4dCgpLCBtTGFzdEtleUNvZGUpOworICAgICAgICAgICAgICAgIGJ1aWxkSW1lQ29tcGxldGlvbnMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGRyb3AgZG93biBpcyBhdXRvbWF0aWNhbGx5IGRpc21pc3NlZCB3aGVuIGVub3VnaCBjaGFyYWN0ZXJzCiAgICAgICAgICAgICAvLyBhcmUgZGVsZXRlZCBmcm9tIHRoZSB0ZXh0IHZpZXcKLSAgICAgICAgICAgIGlmICghbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgZGlzbWlzc0Ryb3BEb3duKCk7CisgICAgICAgICAgICBpZiAoIW1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpKSBkaXNtaXNzRHJvcERvd24oKTsKICAgICAgICAgICAgIGlmIChtRmlsdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtRmlsdGVyLmZpbHRlcihudWxsKTsKICAgICAgICAgICAgIH0KQEAgLTg0NCwxMyArNzUzLDcgQEAKICAgICAgKiBpdCBiYWNrLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyTGlzdFNlbGVjdGlvbigpIHsKLSAgICAgICAgZmluYWwgRHJvcERvd25MaXN0VmlldyBsaXN0ID0gbURyb3BEb3duTGlzdDsKLSAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gV0FSTklORzogUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnQgd2hlcmUgbUxpc3RTZWxlY3Rpb25IaWRkZW4gaXMgZGVjbGFyZWQKLSAgICAgICAgICAgIGxpc3QubUxpc3RTZWxlY3Rpb25IaWRkZW4gPSB0cnVlOwotICAgICAgICAgICAgbGlzdC5oaWRlU2VsZWN0b3IoKTsKLSAgICAgICAgICAgIGxpc3QucmVxdWVzdExheW91dCgpOwotICAgICAgICB9CisgICAgICAgIG1Qb3B1cC5jbGVhckxpc3RTZWxlY3Rpb24oKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC04NTksMTEgKzc2Miw3IEBACiAgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBtb3ZlIHRoZSBzZWxlY3RvciB0by4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRMaXN0U2VsZWN0aW9uKGludCBwb3NpdGlvbikgewotICAgICAgICBpZiAobVBvcHVwLmlzU2hvd2luZygpICYmIChtRHJvcERvd25MaXN0ICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFNlbGVjdGlvbihwb3NpdGlvbik7Ci0gICAgICAgICAgICAvLyBMaXN0Vmlldy5zZXRTZWxlY3Rpb24oKSB3aWxsIGNhbGwgcmVxdWVzdExheW91dCgpCi0gICAgICAgIH0KKyAgICAgICAgbVBvcHVwLnNldFNlbGVjdGlvbihwb3NpdGlvbik7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NzcsMTAgKzc3Niw3IEBACiAgICAgICogQHNlZSBMaXN0VmlldyNnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRMaXN0U2VsZWN0aW9uKCkgewotICAgICAgICBpZiAobVBvcHVwLmlzU2hvd2luZygpICYmIChtRHJvcERvd25MaXN0ICE9IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBMaXN0Vmlldy5JTlZBTElEX1BPU0lUSU9OOworICAgICAgICByZXR1cm4gbVBvcHVwLmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05MTQsMTMgKzgxMCw3IEBACiAgICAgICAgICAgICByZXBsYWNlVGV4dChjb21wbGV0aW9uLmdldFRleHQoKSk7CiAgICAgICAgICAgICBtQmxvY2tDb21wbGV0aW9uID0gZmFsc2U7CiAKLSAgICAgICAgICAgIGlmIChtSXRlbUNsaWNrTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIERyb3BEb3duTGlzdFZpZXcgbGlzdCA9IG1Ecm9wRG93bkxpc3Q7Ci0gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgYSBWaWV3IGhlcmUsIHNvIHdlIHdpbGwgbmVlZCB0bwotICAgICAgICAgICAgICAgIC8vIHN1cHBseSBudWxsLiAgSG9wZWZ1bGx5IG5vIGV4aXN0aW5nIGFwcHMgY3Jhc2guLi4KLSAgICAgICAgICAgICAgICBtSXRlbUNsaWNrTGlzdGVuZXIub25JdGVtQ2xpY2sobGlzdCwgbnVsbCwgY29tcGxldGlvbi5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbi5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Qb3B1cC5wZXJmb3JtSXRlbUNsaWNrKGNvbXBsZXRpb24uZ2V0UG9zaXRpb24oKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTkyOCw3ICs4MTgsNyBAQAogICAgICAgICBpZiAoaXNQb3B1cFNob3dpbmcoKSkgewogICAgICAgICAgICAgT2JqZWN0IHNlbGVjdGVkSXRlbTsKICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IDApIHsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW0gPSBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbSgpOworICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbSA9IG1Qb3B1cC5nZXRTZWxlY3RlZEl0ZW0oKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtID0gbUFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7CiAgICAgICAgICAgICB9CkBAIC05NDIsMTggKzgzMiwxOCBAQAogICAgICAgICAgICAgbUJsb2NrQ29tcGxldGlvbiA9IGZhbHNlOyAgICAgICAgICAgIAogCiAgICAgICAgICAgICBpZiAobUl0ZW1DbGlja0xpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcm9wRG93bkxpc3RWaWV3IGxpc3QgPSBtRHJvcERvd25MaXN0OworICAgICAgICAgICAgICAgIGZpbmFsIExpc3RQb3B1cFdpbmRvdyBsaXN0ID0gbVBvcHVwOwogCiAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkVmlldyA9PSBudWxsIHx8IHBvc2l0aW9uIDwgMCkgewogICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFZpZXcgPSBsaXN0LmdldFNlbGVjdGVkVmlldygpOwogICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgaWQgPSBsaXN0LmdldFNlbGVjdGVkSXRlbUlkKCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1JdGVtQ2xpY2tMaXN0ZW5lci5vbkl0ZW1DbGljayhsaXN0LCBzZWxlY3RlZFZpZXcsIHBvc2l0aW9uLCBpZCk7CisgICAgICAgICAgICAgICAgbUl0ZW1DbGlja0xpc3RlbmVyLm9uSXRlbUNsaWNrKGxpc3QuZ2V0TGlzdFZpZXcoKSwgc2VsZWN0ZWRWaWV3LCBwb3NpdGlvbiwgaWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1Ecm9wRG93bkRpc21pc3NlZE9uQ29tcGxldGlvbiAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICBpZiAobURyb3BEb3duRGlzbWlzc2VkT25Db21wbGV0aW9uICYmICFtUG9wdXAuaXNEcm9wRG93bkFsd2F5c1Zpc2libGUoKSkgewogICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDAzLDcgKzg5Myw2IEBACiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBvbkZpbHRlckNvbXBsZXRlKGludCBjb3VudCkgewogICAgICAgICB1cGRhdGVEcm9wRG93bkZvckZpbHRlcihjb3VudCk7Ci0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdXBkYXRlRHJvcERvd25Gb3JGaWx0ZXIoaW50IGNvdW50KSB7CkBAIC0xMDE3LDExICs5MDYsMTIgQEAKICAgICAgICAgICogdG8gZmlsdGVyLgogICAgICAgICAgKi8KIAotICAgICAgICBpZiAoKGNvdW50ID4gMCB8fCBtRHJvcERvd25BbHdheXNWaXNpYmxlKSAmJiBlbm91Z2hUb0ZpbHRlcigpKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZHJvcERvd25BbHdheXNWaXNpYmxlID0gbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCk7CisgICAgICAgIGlmICgoY291bnQgPiAwIHx8IGRyb3BEb3duQWx3YXlzVmlzaWJsZSkgJiYgZW5vdWdoVG9GaWx0ZXIoKSkgewogICAgICAgICAgICAgaWYgKGhhc0ZvY3VzKCkgJiYgaGFzV2luZG93Rm9jdXMoKSkgewogICAgICAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFtRHJvcERvd25BbHdheXNWaXNpYmxlKSB7CisgICAgICAgIH0gZWxzZSBpZiAoIWRyb3BEb3duQWx3YXlzVmlzaWJsZSkgewogICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDI5LDcgKzkxOSw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25XaW5kb3dGb2N1c0NoYW5nZWQoYm9vbGVhbiBoYXNXaW5kb3dGb2N1cykgewogICAgICAgICBzdXBlci5vbldpbmRvd0ZvY3VzQ2hhbmdlZChoYXNXaW5kb3dGb2N1cyk7Ci0gICAgICAgIGlmICghaGFzV2luZG93Rm9jdXMgJiYgIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIHsKKyAgICAgICAgaWYgKCFoYXNXaW5kb3dGb2N1cyAmJiAhbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTAzOSw3ICs5MjksNyBAQAogICAgICAgICBzdXBlci5vbkRpc3BsYXlIaW50KGhpbnQpOwogICAgICAgICBzd2l0Y2ggKGhpbnQpIHsKICAgICAgICAgICAgIGNhc2UgSU5WSVNJQkxFOgotICAgICAgICAgICAgICAgIGlmICghbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICAgICAgICAgIGlmICghbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTA1Myw3ICs5NDMsNyBAQAogICAgICAgICBpZiAoIWZvY3VzZWQpIHsKICAgICAgICAgICAgIHBlcmZvcm1WYWxpZGF0aW9uKCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFmb2N1c2VkICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKSB7CisgICAgICAgIGlmICghZm9jdXNlZCAmJiAhbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTA3OCw4ICs5NjgsNiBAQAogICAgICAgICAgICAgaW1tLmRpc3BsYXlDb21wbGV0aW9ucyh0aGlzLCBudWxsKTsKICAgICAgICAgfQogICAgICAgICBtUG9wdXAuZGlzbWlzcygpOwotICAgICAgICBtUG9wdXAuc2V0Q29udGVudFZpZXcobnVsbCk7Ci0gICAgICAgIG1Ecm9wRG93bkxpc3QgPSBudWxsOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTA5MiwxOCArOTgwLDYgQEAKIAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5Vc2VkIGZvciBsYXp5IGluc3RhbnRpYXRpb24gb2YgdGhlIGFuY2hvciB2aWV3IGZyb20gdGhlIGlkIHdlIGhhdmUuIElmIHRoZSB2YWx1ZSBvZgotICAgICAqIHRoZSBpZCBpcyBOT19JRCBvciB3ZSBjYW4ndCBmaW5kIGEgdmlldyBmb3IgdGhlIGdpdmVuIGlkLCB3ZSByZXR1cm4gdGhpcyBUZXh0VmlldyBhcwotICAgICAqIHRoZSBkZWZhdWx0IGFuY2hvcmluZyBwb2ludC48L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBWaWV3IGdldERyb3BEb3duQW5jaG9yVmlldygpIHsKLSAgICAgICAgaWYgKG1Ecm9wRG93bkFuY2hvclZpZXcgPT0gbnVsbCAmJiBtRHJvcERvd25BbmNob3JJZCAhPSBWaWV3Lk5PX0lEKSB7Ci0gICAgICAgICAgICBtRHJvcERvd25BbmNob3JWaWV3ID0gZ2V0Um9vdFZpZXcoKS5maW5kVmlld0J5SWQobURyb3BEb3duQW5jaG9ySWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRHJvcERvd25BbmNob3JWaWV3ID09IG51bGwgPyB0aGlzIDogbURyb3BEb3duQW5jaG9yVmlldzsKLSAgICB9CiAKICAgICAvKioKICAgICAgKiBJc3N1ZXMgYSBydW5uYWJsZSB0byBzaG93IHRoZSBkcm9wZG93biBhcyBzb29uIGFzIHBvc3NpYmxlLgpAQCAtMTExMSw3ICs5ODcsNyBAQAogICAgICAqIEBoaWRlIGludGVybmFsIHVzZWQgb25seSBieSBTZWFyY2hEaWFsb2cKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzaG93RHJvcERvd25BZnRlckxheW91dCgpIHsKLSAgICAgICAgcG9zdChtU2hvd0Ryb3BEb3duUnVubmFibGUpOworICAgICAgICBtUG9wdXAucG9zdFNob3coKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xMTIyLDcgKzk5OCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW5zdXJlSW1lVmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZSh2aXNpYmxlCi0gICAgICAgICAgICAgICAgPyBQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEIDogUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQpOworICAgICAgICAgICAgICAgID8gTGlzdFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9ORUVERUQgOiBMaXN0UG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQpOwogICAgICAgICBzaG93RHJvcERvd24oKTsKICAgICB9CiAKQEAgLTExMzAsODkgKzEwMDYsMjEgQEAKICAgICAgKiBAaGlkZSBpbnRlcm5hbCB1c2VkIG9ubHkgaGVyZSBhbmQgU2VhcmNoRGlhbG9nCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNJbnB1dE1ldGhvZE5vdE5lZWRlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBMaXN0UG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQ7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogPHA+RGlzcGxheXMgdGhlIGRyb3AgZG93biBvbiBzY3JlZW4uPC9wPgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNob3dEcm9wRG93bigpIHsKLSAgICAgICAgaW50IGhlaWdodCA9IGJ1aWxkRHJvcERvd24oKTsKLQotICAgICAgICBpbnQgd2lkdGhTcGVjID0gMDsKLSAgICAgICAgaW50IGhlaWdodFNwZWMgPSAwOwotCi0gICAgICAgIGJvb2xlYW4gbm9JbnB1dE1ldGhvZCA9IGlzSW5wdXRNZXRob2ROb3ROZWVkZWQoKTsKLQotICAgICAgICBpZiAobVBvcHVwLmlzU2hvd2luZygpKSB7Ci0gICAgICAgICAgICBpZiAobURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgY2FsbCB0byBQb3B1cFdpbmRvdydzIHVwZGF0ZSBtZXRob2QgYmVsb3cgY2FuIGFjY2VwdCAtMSBmb3IgYW55Ci0gICAgICAgICAgICAgICAgLy8gdmFsdWUgeW91IGRvIG5vdCB3YW50IHRvIHVwZGF0ZS4KLSAgICAgICAgICAgICAgICB3aWR0aFNwZWMgPSAtMTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKLSAgICAgICAgICAgICAgICB3aWR0aFNwZWMgPSBnZXREcm9wRG93bkFuY2hvclZpZXcoKS5nZXRXaWR0aCgpOworICAgICAgICBpZiAobVBvcHVwLmdldEFuY2hvclZpZXcoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAobURyb3BEb3duQW5jaG9ySWQgIT0gVmlldy5OT19JRCkgeworICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRBbmNob3JWaWV3KGdldFJvb3RWaWV3KCkuZmluZFZpZXdCeUlkKG1Ecm9wRG93bkFuY2hvcklkKSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IG1Ecm9wRG93bldpZHRoOworICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRBbmNob3JWaWV3KHRoaXMpOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGNhbGwgdG8gUG9wdXBXaW5kb3cncyB1cGRhdGUgbWV0aG9kIGJlbG93IGNhbiBhY2NlcHQgLTEgZm9yIGFueQotICAgICAgICAgICAgICAgIC8vIHZhbHVlIHlvdSBkbyBub3Qgd2FudCB0byB1cGRhdGUuCi0gICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IG5vSW5wdXRNZXRob2QgPyBoZWlnaHQgOiBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKLSAgICAgICAgICAgICAgICBpZiAobm9JbnB1dE1ldGhvZCkgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA6IDAsIDApOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaW5kb3dMYXlvdXRNb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UIDogMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gaGVpZ2h0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gbURyb3BEb3duSGVpZ2h0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtUG9wdXAuc2V0T3V0c2lkZVRvdWNoYWJsZSghbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKTsKLQotICAgICAgICAgICAgbVBvcHVwLnVwZGF0ZShnZXREcm9wRG93bkFuY2hvclZpZXcoKSwgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duVmVydGljYWxPZmZzZXQsIHdpZHRoU3BlYywgaGVpZ2h0U3BlYyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICB3aWR0aFNwZWMgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaWR0aChnZXREcm9wRG93bkFuY2hvclZpZXcoKS5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2lkdGgobURyb3BEb3duV2lkdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgICAgIGhlaWdodFNwZWMgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SGVpZ2h0KGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldEhlaWdodChtRHJvcERvd25IZWlnaHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVBvcHVwLnNldFdpbmRvd0xheW91dE1vZGUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKLSAgICAgICAgICAgIG1Qb3B1cC5zZXRJbnB1dE1ldGhvZE1vZGUoUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05FRURFRCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHVzZSBvdXRzaWRlIHRvdWNoYWJsZSB0byBkaXNtaXNzIGRyb3AgZG93biB3aGVuIHRvdWNoaW5nIG91dHNpZGUgb2YgaXQsIHNvCi0gICAgICAgICAgICAvLyBvbmx5IHNldCB0aGlzIGlmIHRoZSBkcm9wZG93biBpcyBub3QgYWx3YXlzIHZpc2libGUKLSAgICAgICAgICAgIG1Qb3B1cC5zZXRPdXRzaWRlVG91Y2hhYmxlKCFtRm9yY2VJZ25vcmVPdXRzaWRlVG91Y2ggJiYgIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpOwotICAgICAgICAgICAgbVBvcHVwLnNldFRvdWNoSW50ZXJjZXB0b3IobmV3IFBvcHVwVG91Y2hJbnRlcmNlcHRvcigpKTsKLSAgICAgICAgICAgIG1Qb3B1cC5zaG93QXNEcm9wRG93bihnZXREcm9wRG93bkFuY2hvclZpZXcoKSwKLSAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCwgbURyb3BEb3duVmVydGljYWxPZmZzZXQpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRTZWxlY3Rpb24oTGlzdFZpZXcuSU5WQUxJRF9QT1NJVElPTik7Ci0gICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIHBvc3QobUhpZGVTZWxlY3Rvcik7CiAgICAgICAgIH0KKyAgICAgICAgbVBvcHVwLnNob3coKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xMjIzLDE5ICsxMDMxLDEwIEBACiAgICAgICogQGhpZGUgdXNlZCBvbmx5IGJ5IFNlYXJjaERpYWxvZwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlSWdub3JlT3V0c2lkZVRvdWNoKGJvb2xlYW4gZm9yY2VJZ25vcmVPdXRzaWRlVG91Y2gpIHsKLSAgICAgICAgbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoID0gZm9yY2VJZ25vcmVPdXRzaWRlVG91Y2g7CisgICAgICAgIG1Qb3B1cC5zZXRGb3JjZUlnbm9yZU91dHNpZGVUb3VjaChmb3JjZUlnbm9yZU91dHNpZGVUb3VjaCk7CiAgICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+QnVpbGRzIHRoZSBwb3B1cCB3aW5kb3cncyBjb250ZW50IGFuZCByZXR1cm5zIHRoZSBoZWlnaHQgdGhlIHBvcHVwCi0gICAgICogc2hvdWxkIGhhdmUuIFJldHVybnMgLTEgd2hlbiB0aGUgY29udGVudCBhbHJlYWR5IGV4aXN0cy48L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50J3MgaGVpZ2h0IG9yIC0xIGlmIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBidWlsZERyb3BEb3duKCkgewotICAgICAgICBWaWV3R3JvdXAgZHJvcERvd25WaWV3OwotICAgICAgICBpbnQgb3RoZXJIZWlnaHRzID0gMDsKLQorICAgIAorICAgIHByaXZhdGUgdm9pZCBidWlsZEltZUNvbXBsZXRpb25zKCkgewogICAgICAgICBmaW5hbCBMaXN0QWRhcHRlciBhZGFwdGVyID0gbUFkYXB0ZXI7CiAgICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBJbnB1dE1ldGhvZE1hbmFnZXIucGVla0luc3RhbmNlKCk7CkBAIC0xMjYzLDEzNSArMTA2Miw2IEBACiAgICAgICAgICAgICAgICAgaW1tLmRpc3BsYXlDb21wbGV0aW9ucyh0aGlzLCBjb21wbGV0aW9ucyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBpZiAobURyb3BEb3duTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0KLSAgICAgICAgICAgIG1IaWRlU2VsZWN0b3IgPSBuZXcgTGlzdFNlbGVjdG9ySGlkZXIoKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGlzIFJ1bm5hYmxlIGV4aXN0cyBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBjaGVja2luZyBpZiB0aGUgdmlldyBsYXlvdXQgaGFzIGdvdAotICAgICAgICAgICAgICogY29tcGxldGVkIGFuZCBpZiBzbyBjYWxsIHNob3dEcm9wRG93biB0byBkaXNwbGF5IHRoZSBkcm9wIGRvd24uIFRoaXMgaXMgdXNlZCB0byBzaG93Ci0gICAgICAgICAgICAgKiB0aGUgZHJvcCBkb3duIGFzIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgdXNlciBvcGVucyB1cCB0aGUgc2VhcmNoIGRpYWxvZywgd2l0aG91dAotICAgICAgICAgICAgICogd2FpdGluZyBmb3IgdGhlIG5vcm1hbCBVSSBwaXBlbGluZSB0byBkbyBpdCdzIGpvYiB3aGljaCBpcyBzbG93ZXIgdGhhbiB0aGlzIG1ldGhvZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbVNob3dEcm9wRG93blJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVmlldyBsYXlvdXQgc2hvdWxkIGJlIGFsbCBkb25lIGJlZm9yZSBkaXNwbGF5aW5nIHRoZSBkcm9wIGRvd24uCi0gICAgICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IGdldERyb3BEb3duQW5jaG9yVmlldygpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmlldyAhPSBudWxsICYmIHZpZXcuZ2V0V2luZG93VG9rZW4oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaG93RHJvcERvd24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QgPSBuZXcgRHJvcERvd25MaXN0Vmlldyhjb250ZXh0KTsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0U2VsZWN0b3IobURyb3BEb3duTGlzdEhpZ2hsaWdodCk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEFkYXB0ZXIoYWRhcHRlcik7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFZlcnRpY2FsRmFkaW5nRWRnZUVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobURyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRGb2N1c2FibGUodHJ1ZSk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEcm9wRG93bkxpc3RWaWV3IGRyb3BEb3duTGlzdCA9IG1Ecm9wRG93bkxpc3Q7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wRG93bkxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BEb3duTGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Ob3RoaW5nU2VsZWN0ZWQoQWRhcHRlclZpZXc8Pz4gcGFyZW50KSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uU2Nyb2xsTGlzdGVuZXIobmV3IFBvcHVwU2Nyb2xsTGlzdGVuZXIoKSk7Ci0KLSAgICAgICAgICAgIGlmIChtSXRlbVNlbGVjdGVkTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihtSXRlbVNlbGVjdGVkTGlzdGVuZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkcm9wRG93blZpZXcgPSBtRHJvcERvd25MaXN0OwotCi0gICAgICAgICAgICBWaWV3IGhpbnRWaWV3ID0gZ2V0SGludFZpZXcoY29udGV4dCk7Ci0gICAgICAgICAgICBpZiAoaGludFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGlmIGFuIGhpbnQgaGFzIGJlZW4gc3BlY2lmaWVkLCB3ZSBhY2NvbW9kYXRlIG1vcmUgc3BhY2UgZm9yIGl0IGFuZAotICAgICAgICAgICAgICAgIC8vIGFkZCBhIHRleHQgdmlldyBpbiB0aGUgZHJvcCBkb3duIG1lbnUsIGF0IHRoZSBib3R0b20gb2YgdGhlIGxpc3QKLSAgICAgICAgICAgICAgICBMaW5lYXJMYXlvdXQgaGludENvbnRhaW5lciA9IG5ldyBMaW5lYXJMYXlvdXQoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaGludENvbnRhaW5lci5zZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOwotCi0gICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyBoaW50UGFyYW1zID0gbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgMCwgMS4wZgotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgaGludENvbnRhaW5lci5hZGRWaWV3KGRyb3BEb3duVmlldywgaGludFBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgaGludENvbnRhaW5lci5hZGRWaWV3KGhpbnRWaWV3KTsKLQotICAgICAgICAgICAgICAgIC8vIG1lYXN1cmUgdGhlIGhpbnQncyBoZWlnaHQgdG8gZmluZCBob3cgbXVjaCBtb3JlIHZlcnRpY2FsIHNwYWNlCi0gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBhZGQgdG8gdGhlIGRyb3AgZG93bidzIGhlaWdodAotICAgICAgICAgICAgICAgIGludCB3aWR0aFNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoZ2V0V2lkdGgoKSwgTWVhc3VyZVNwZWMuQVRfTU9TVCk7Ci0gICAgICAgICAgICAgICAgaW50IGhlaWdodFNwZWMgPSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRDsKLSAgICAgICAgICAgICAgICBoaW50Vmlldy5tZWFzdXJlKHdpZHRoU3BlYywgaGVpZ2h0U3BlYyk7Ci0KLSAgICAgICAgICAgICAgICBoaW50UGFyYW1zID0gKExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMpIGhpbnRWaWV3LmdldExheW91dFBhcmFtcygpOwotICAgICAgICAgICAgICAgIG90aGVySGVpZ2h0cyA9IGhpbnRWaWV3LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyBoaW50UGFyYW1zLnRvcE1hcmdpbgotICAgICAgICAgICAgICAgICAgICAgICAgKyBoaW50UGFyYW1zLmJvdHRvbU1hcmdpbjsKLQotICAgICAgICAgICAgICAgIGRyb3BEb3duVmlldyA9IGhpbnRDb250YWluZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Qb3B1cC5zZXRDb250ZW50Vmlldyhkcm9wRG93blZpZXcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gKFZpZXdHcm91cCkgbVBvcHVwLmdldENvbnRlbnRWaWV3KCk7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBkcm9wRG93blZpZXcuZmluZFZpZXdCeUlkKEhJTlRfVklFV19JRCk7Ci0gICAgICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyBoaW50UGFyYW1zID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKSB2aWV3LmdldExheW91dFBhcmFtcygpOwotICAgICAgICAgICAgICAgIG90aGVySGVpZ2h0cyA9IHZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKSArIGhpbnRQYXJhbXMudG9wTWFyZ2luCi0gICAgICAgICAgICAgICAgICAgICAgICArIGhpbnRQYXJhbXMuYm90dG9tTWFyZ2luOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWF4IGhlaWdodCBhdmFpbGFibGUgb24gdGhlIHNjcmVlbiBmb3IgYSBwb3B1cC4KLSAgICAgICAgYm9vbGVhbiBpZ25vcmVCb3R0b21EZWNvcmF0aW9ucyA9Ci0gICAgICAgICAgICAgICAgbVBvcHVwLmdldElucHV0TWV0aG9kTW9kZSgpID09IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEOwotICAgICAgICBmaW5hbCBpbnQgbWF4SGVpZ2h0ID0gbVBvcHVwLmdldE1heEF2YWlsYWJsZUhlaWdodCgKLSAgICAgICAgICAgICAgICBnZXREcm9wRG93bkFuY2hvclZpZXcoKSwgbURyb3BEb3duVmVydGljYWxPZmZzZXQsIGlnbm9yZUJvdHRvbURlY29yYXRpb25zKTsKLQotICAgICAgICAvLyBnZXRNYXhBdmFpbGFibGVIZWlnaHQoKSBzdWJ0cmFjdHMgdGhlIHBhZGRpbmcsIHNvIHdlIHB1dCBpdCBiYWNrLAotICAgICAgICAvLyB0byBnZXQgdGhlIGF2YWlsYWJsZSBoZWlnaHQgZm9yIHRoZSB3aG9sZSB3aW5kb3cKLSAgICAgICAgaW50IHBhZGRpbmcgPSAwOwotICAgICAgICBEcmF3YWJsZSBiYWNrZ3JvdW5kID0gbVBvcHVwLmdldEJhY2tncm91bmQoKTsKLSAgICAgICAgaWYgKGJhY2tncm91bmQgIT0gbnVsbCkgewotICAgICAgICAgICAgYmFja2dyb3VuZC5nZXRQYWRkaW5nKG1UZW1wUmVjdCk7Ci0gICAgICAgICAgICBwYWRkaW5nID0gbVRlbXBSZWN0LnRvcCArIG1UZW1wUmVjdC5ib3R0b207Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobURyb3BEb3duQWx3YXlzVmlzaWJsZSB8fCBtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgIHJldHVybiBtYXhIZWlnaHQgKyBwYWRkaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgaW50IGxpc3RDb250ZW50ID0gbURyb3BEb3duTGlzdC5tZWFzdXJlSGVpZ2h0T2ZDaGlsZHJlbihNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCwKLSAgICAgICAgICAgICAgICAwLCBMaXN0Vmlldy5OT19QT1NJVElPTiwgbWF4SGVpZ2h0IC0gb3RoZXJIZWlnaHRzLCAyKTsKLSAgICAgICAgLy8gYWRkIHBhZGRpbmcgb25seSBpZiB0aGUgbGlzdCBoYXMgaXRlbXMgaW4gaXQsIHRoYXQgd2F5IHdlIGRvbid0IHNob3cKLSAgICAgICAgLy8gdGhlIHBvcHVwIGlmIGl0IGlzIG5vdCBuZWVkZWQKLSAgICAgICAgaWYgKGxpc3RDb250ZW50ID4gMCkgb3RoZXJIZWlnaHRzICs9IHBhZGRpbmc7Ci0KLSAgICAgICAgcmV0dXJuIGxpc3RDb250ZW50ICsgb3RoZXJIZWlnaHRzOwotICAgIH0KLQotICAgIHByaXZhdGUgVmlldyBnZXRIaW50VmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKG1IaW50VGV4dCAhPSBudWxsICYmIG1IaW50VGV4dC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGZpbmFsIFRleHRWaWV3IGhpbnRWaWV3ID0gKFRleHRWaWV3KSBMYXlvdXRJbmZsYXRlci5mcm9tKGNvbnRleHQpLmluZmxhdGUoCi0gICAgICAgICAgICAgICAgICAgIG1IaW50UmVzb3VyY2UsIG51bGwpLmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnRleHQxKTsKLSAgICAgICAgICAgIGhpbnRWaWV3LnNldFRleHQobUhpbnRUZXh0KTsKLSAgICAgICAgICAgIGhpbnRWaWV3LnNldElkKEhJTlRfVklFV19JRCk7Ci0gICAgICAgICAgICByZXR1cm4gaGludFZpZXc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTQ0Myw0NyArMTExMyw2IEBACiAgICAgICAgIHJldHVybiBtRmlsdGVyOwogICAgIH0KIAotICAgIHByaXZhdGUgY2xhc3MgTGlzdFNlbGVjdG9ySGlkZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGNsZWFyTGlzdFNlbGVjdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBSZXNpemVQb3B1cFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKLSAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBQb3B1cFRvdWNoSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBPblRvdWNoTGlzdGVuZXIgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoKFZpZXcgdiwgTW90aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBhY3Rpb24gPSBldmVudC5nZXRBY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04gJiYKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwICE9IG51bGwgJiYgbVBvcHVwLmlzU2hvd2luZygpKSB7Ci0gICAgICAgICAgICAgICAgcG9zdERlbGF5ZWQobVJlc2l6ZVBvcHVwUnVubmFibGUsIEVYUEFORF9MSVNUX1RJTUVPVVQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlQ2FsbGJhY2tzKG1SZXNpemVQb3B1cFJ1bm5hYmxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGNsYXNzIFBvcHVwU2Nyb2xsTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Vmlldy5PblNjcm9sbExpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25TY3JvbGwoQWJzTGlzdFZpZXcgdmlldywgaW50IGZpcnN0VmlzaWJsZUl0ZW0sIGludCB2aXNpYmxlSXRlbUNvdW50LAotICAgICAgICAgICAgICAgIGludCB0b3RhbEl0ZW1Db3VudCkgewotCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblNjcm9sbFN0YXRlQ2hhbmdlZChBYnNMaXN0VmlldyB2aWV3LCBpbnQgc2Nyb2xsU3RhdGUpIHsKLSAgICAgICAgICAgIGlmIChzY3JvbGxTdGF0ZSA9PSBTQ1JPTExfU1RBVEVfVE9VQ0hfU0NST0xMICYmCi0gICAgICAgICAgICAgICAgICAgICFpc0lucHV0TWV0aG9kTm90TmVlZGVkKCkgJiYgbVBvcHVwLmdldENvbnRlbnRWaWV3KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtUmVzaXplUG9wdXBSdW5uYWJsZSk7Ci0gICAgICAgICAgICAgICAgbVJlc2l6ZVBvcHVwUnVubmFibGUucnVuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIGNsYXNzIERyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIgaW1wbGVtZW50cyBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIHsKICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXcgcGFyZW50LCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgewogICAgICAgICAgICAgcGVyZm9ybUNvbXBsZXRpb24odiwgcG9zaXRpb24sIGlkKTsKQEAgLTE0OTEsMTIzICsxMTIwLDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD5XcmFwcGVyIGNsYXNzIGZvciBhIExpc3RWaWV3LiBUaGlzIHdyYXBwZXIgaGlqYWNrcyB0aGUgZm9jdXMgdG8KLSAgICAgKiBtYWtlIHN1cmUgdGhlIGxpc3QgdXNlcyB0aGUgYXBwcm9wcmlhdGUgZHJhd2FibGVzIGFuZCBzdGF0ZXMgd2hlbgotICAgICAqIGRpc3BsYXllZCBvbiBzY3JlZW4gd2l0aGluIGEgZHJvcCBkb3duLiBUaGUgZm9jdXMgaXMgbmV2ZXIgYWN0dWFsbHkKLSAgICAgKiBwYXNzZWQgdG8gdGhlIGRyb3AgZG93bjsgdGhlIGxpc3Qgb25seSBsb29rcyBmb2N1c2VkLjwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEcm9wRG93bkxpc3RWaWV3IGV4dGVuZHMgTGlzdFZpZXcgewotICAgICAgICAvKgotICAgICAgICAgKiBXQVJOSU5HOiBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSB0b3VjaCBtb2RlIGlzc3VlLgotICAgICAgICAgKgotICAgICAgICAgKiBUb3VjaCBtb2RlIGlzIHByb3BhZ2F0ZWQgbGF6aWx5IHRvIHdpbmRvd3MuIFRoaXMgY2F1c2VzIHByb2JsZW1zIGluCi0gICAgICAgICAqIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW86Ci0gICAgICAgICAqIC0gVHlwZSBzb21ldGhpbmcgaW4gdGhlIEF1dG9Db21wbGV0ZVRleHRWaWV3IGFuZCBnZXQgc29tZSByZXN1bHRzCi0gICAgICAgICAqIC0gTW92ZSBkb3duIHdpdGggdGhlIGQtcGFkIHRvIHNlbGVjdCBhbiBpdGVtIGluIHRoZSBsaXN0Ci0gICAgICAgICAqIC0gTW92ZSB1cCB3aXRoIHRoZSBkLXBhZCB1bnRpbCB0aGUgc2VsZWN0aW9uIGRpc2FwcGVhcnMKLSAgICAgICAgICogLSBUeXBlIG1vcmUgdGV4dCBpbiB0aGUgQXV0b0NvbXBsZXRlVGV4dFZpZXcgKnVzaW5nIHRoZSBzb2Z0IGtleWJvYXJkKgotICAgICAgICAgKiAgIGFuZCBnZXQgbmV3IHJlc3VsdHM7IHlvdSBhcmUgbm93IGluIHRvdWNoIG1vZGUKLSAgICAgICAgICogLSBUaGUgc2VsZWN0aW9uIGNvbWVzIGJhY2sgb24gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QsIGV2ZW4gdGhvdWdoCi0gICAgICAgICAqICAgdGhlIGxpc3QgaXMgc3VwcG9zZWQgdG8gYmUgaW4gdG91Y2ggbW9kZQotICAgICAgICAgKgotICAgICAgICAgKiBVc2luZyB0aGUgc29mdCBrZXlib2FyZCB0cmlnZ2VycyB0aGUgdG91Y2ggbW9kZSBjaGFuZ2UgYnV0IHRoYXQgY2hhbmdlCi0gICAgICAgICAqIGlzIHByb3BhZ2F0ZWQgdG8gb3VyIHdpbmRvdyBvbmx5IGFmdGVyIHRoZSBmaXJzdCBsaXN0IGxheW91dCwgdGhlcmVmb3JlCi0gICAgICAgICAqIGFmdGVyIHRoZSBsaXN0IGF0dGVtcHRzIHRvIHJlc3VycmVjdCB0aGUgc2VsZWN0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBUaGUgdHJpY2sgdG8gd29yayBhcm91bmQgdGhpcyBpc3N1ZSBpcyB0byBwcmV0ZW5kIHRoZSBsaXN0IGlzIGluIHRvdWNoCi0gICAgICAgICAqIG1vZGUgd2hlbiB3ZSBrbm93IHRoYXQgdGhlIHNlbGVjdGlvbiBzaG91bGQgbm90IGFwcGVhciwgdGhhdCBpcyB3aGVuCi0gICAgICAgICAqIHdlIGtub3cgdGhlIHVzZXIgbW92ZWQgdGhlIHNlbGVjdGlvbiBhd2F5IGZyb20gdGhlIGxpc3QuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoaXMgYm9vbGVhbiBpcyBzZXQgdG8gdHJ1ZSB3aGVuZXZlciB3ZSBleHBsaWNpdGVseSBoaWRlIHRoZSBsaXN0J3MKLSAgICAgICAgICogc2VsZWN0aW9uIGFuZCByZXNldCB0byBmYWxzZSB3aGVudmVyIHdlIGtub3cgdGhlIHVzZXIgbW92ZWQgdGhlCi0gICAgICAgICAqIHNlbGVjdGlvbiBiYWNrIHRvIHRoZSBsaXN0LgotICAgICAgICAgKgotICAgICAgICAgKiBXaGVuIHRoaXMgYm9vbGVhbiBpcyB0cnVlLCBpc0luVG91Y2hNb2RlKCkgcmV0dXJucyB0cnVlLCBvdGhlcndpc2UgaXQKLSAgICAgICAgICogcmV0dXJucyBzdXBlci5pc0luVG91Y2hNb2RlKCkuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUxpc3RTZWxlY3Rpb25IaWRkZW47Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPkNyZWF0ZXMgYSBuZXcgbGlzdCB2aWV3IHdyYXBwZXIuPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY29udGV4dCB0aGlzIHZpZXcncyBjb250ZXh0Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRHJvcERvd25MaXN0VmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIG51bGwsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5kcm9wRG93bkxpc3RWaWV3U3R5bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPkF2b2lkcyBqYXJyaW5nIHNjcm9sbGluZyBlZmZlY3QgYnkgZW5zdXJpbmcgdGhhdCBsaXN0IGVsZW1lbnRzCi0gICAgICAgICAqIG1hZGUgb2YgYSB0ZXh0IHZpZXcgZml0IG9uIGEgc2luZ2xlIGxpbmUuPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcG9zaXRpb24gdGhlIGl0ZW0gaW5kZXggaW4gdGhlIGxpc3QgdG8gZ2V0IGEgdmlldyBmb3IKLSAgICAgICAgICogQHJldHVybiB0aGUgdmlldyBmb3IgdGhlIHNwZWNpZmllZCBpdGVtCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgVmlldyBvYnRhaW5WaWV3KGludCBwb3NpdGlvbiwgYm9vbGVhbltdIGlzU2NyYXApIHsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IHN1cGVyLm9idGFpblZpZXcocG9zaXRpb24sIGlzU2NyYXApOwotCi0gICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIFRleHRWaWV3KSB7Ci0gICAgICAgICAgICAgICAgKChUZXh0Vmlldykgdmlldykuc2V0SG9yaXpvbnRhbGx5U2Nyb2xsaW5nKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdmlldzsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0luVG91Y2hNb2RlKCkgewotICAgICAgICAgICAgLy8gV0FSTklORzogUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnQgd2hlcmUgbUxpc3RTZWxlY3Rpb25IaWRkZW4gaXMgZGVjbGFyZWQKLSAgICAgICAgICAgIHJldHVybiBtTGlzdFNlbGVjdGlvbkhpZGRlbiB8fCBzdXBlci5pc0luVG91Y2hNb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogPHA+UmV0dXJucyB0aGUgZm9jdXMgc3RhdGUgaW4gdGhlIGRyb3AgZG93bi48L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSBhbHdheXMKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNXaW5kb3dGb2N1cygpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGb2N1c2VkKCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogPHA+UmV0dXJucyB0aGUgZm9jdXMgc3RhdGUgaW4gdGhlIGRyb3AgZG93bi48L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSBhbHdheXMKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNGb2N1cygpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgaW50W10gb25DcmVhdGVEcmF3YWJsZVN0YXRlKGludCBleHRyYVNwYWNlKSB7Ci0gICAgICAgICAgICBpbnRbXSByZXMgPSBzdXBlci5vbkNyZWF0ZURyYXdhYmxlU3RhdGUoZXh0cmFTcGFjZSk7Ci0gICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBDb25zdGFudElmU3RhdGVtZW50Ci0gICAgICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIkNyZWF0ZWQgZHJhd2FibGUgc3RhdGU6IFsiKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8cmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgc2IuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjB4Iik7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKHJlc1tpXSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIl0iKTsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgogICAgICAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHRleHQgZW50ZXJlZCBpbiB0aGlzIFRleHRWaWV3IGNvbXBsaWVzIHRvCiAgICAgICogYSBjZXJ0YWluIGZvcm1hdC4gIFNpbmNlIHRoZXJlIGlzIG5vIGZvb2xwcm9vZiB3YXkgdG8gcHJldmVudCB0aGUgdXNlciBmcm9tIGxlYXZpbmcKICAgICAgKiB0aGlzIFZpZXcgd2l0aCBhbiBpbmNvcnJlY3QgdmFsdWUgaW4gaXQsIGFsbCB3ZSBjYW4gZG8gaXMgdHJ5IHRvIGZpeCBpdCBvdXJzZWx2ZXMKQEAgLTE2NTUsMTAgKzExNjcsNyBAQAogICAgIHByaXZhdGUgY2xhc3MgUG9wdXBEYXRhU2V0T2JzZXJ2ZXIgZXh0ZW5kcyBEYXRhU2V0T2JzZXJ2ZXIgewogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2VkKCkgewotICAgICAgICAgICAgaWYgKGlzUG9wdXBTaG93aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgcmVzaXplIHRoZSBwb3B1cCB0byBmaXQgdGhlIG5ldyBhZGFwdGVyJ3MgY29udGVudAotICAgICAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwb3B1cCBpcyBub3Qgc2hvd2luZyBhbHJlYWR5LCBzaG93aW5nIGl0IHdpbGwgY2F1c2UKICAgICAgICAgICAgICAgICAvLyB0aGUgbGlzdCBvZiBkYXRhIHNldCBvYnNlcnZlcnMgYXR0YWNoZWQgdG8gdGhlIGFkYXB0ZXIgdG8KICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UuIFdlIGNhbid0IGRvIGl0IGZyb20gaGVyZSwgYmVjYXVzZSB3ZSBhcmUgaW4gdGhlIG1pZGRsZQpAQCAtMTY3MywxNCArMTE4Miw1IEBACiAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JbnZhbGlkYXRlZCgpIHsKLSAgICAgICAgICAgIGlmICghbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgewotICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gZGF0YSB0byBkaXNwbGF5IHNvIG1ha2Ugc3VyZSB3ZSdyZSBub3Qgc2hvd2luZwotICAgICAgICAgICAgICAgIC8vIHRoZSBkcm9wIGRvd24gYW5kIGl0cyBsaXN0Ci0gICAgICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQ3Vyc29yQWRhcHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0N1cnNvckFkYXB0ZXIuamF2YQppbmRleCBiYWE2ODMzLi40Y2Y4Nzg1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQ3Vyc29yQWRhcHRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9DdXJzb3JBZGFwdGVyLmphdmEKQEAgLTgwLDYgKzgwLDE4IEBACiAgICAgcHJvdGVjdGVkIEZpbHRlclF1ZXJ5UHJvdmlkZXIgbUZpbHRlclF1ZXJ5UHJvdmlkZXI7CiAKICAgICAvKioKKyAgICAgKiBJZiBzZXQgdGhlIGFkYXB0ZXIgd2lsbCBjYWxsIHJlcXVlcnkoKSBvbiB0aGUgY3Vyc29yIHdoZW5ldmVyIGEgY29udGVudCBjaGFuZ2UKKyAgICAgKiBub3RpZmljYXRpb24gaXMgZGVsaXZlcmVkLiBJbXBsaWVzIHtAbGluayAjRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQVVUT19SRVFVRVJZID0gMHgwMTsKKworICAgIC8qKgorICAgICAqIElmIHNldCB0aGUgYWRhcHRlciB3aWxsIHJlZ2lzdGVyIGEgY29udGVudCBvYnNlcnZlciBvbiB0aGUgY3Vyc29yIGFuZCB3aWxsIGNhbGwKKyAgICAgKiB7QGxpbmsgI29uQ29udGVudENoYW5nZWQoKX0gd2hlbiBhIG5vdGlmaWNhdGlvbiBjb21lcyBpbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVIgPSAweDAyOworCisgICAgLyoqCiAgICAgICogQ29uc3RydWN0b3IuIFRoZSBhZGFwdGVyIHdpbGwgY2FsbCByZXF1ZXJ5KCkgb24gdGhlIGN1cnNvciB3aGVuZXZlcgogICAgICAqIGl0IGNoYW5nZXMgc28gdGhhdCB0aGUgbW9zdCByZWNlbnQgZGF0YSBpcyBhbHdheXMgZGlzcGxheWVkLgogICAgICAqCkBAIC04Nyw3ICs5OSw3IEBACiAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQKICAgICAgKi8KICAgICBwdWJsaWMgQ3Vyc29yQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvciBjKSB7Ci0gICAgICAgIGluaXQoY29udGV4dCwgYywgdHJ1ZSk7CisgICAgICAgIGluaXQoY29udGV4dCwgYywgRkxBR19BVVRPX1JFUVVFUlkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTksMTkgKzExMSw0MyBAQAogICAgICAqICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIGFsd2F5cyBkaXNwbGF5ZWQuCiAgICAgICovCiAgICAgcHVibGljIEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYywgYm9vbGVhbiBhdXRvUmVxdWVyeSkgewotICAgICAgICBpbml0KGNvbnRleHQsIGMsIGF1dG9SZXF1ZXJ5KTsKKyAgICAgICAgaW5pdChjb250ZXh0LCBjLCBhdXRvUmVxdWVyeSA/IEZMQUdfQVVUT19SRVFVRVJZIDogRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqIEBwYXJhbSBjIFRoZSBjdXJzb3IgZnJvbSB3aGljaCB0byBnZXQgdGhlIGRhdGEuCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gZmxhZ3MgZmxhZ3MgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGJlaGF2aW9yIG9mIHRoZSBhZGFwdGVyCisgICAgICovCisgICAgcHVibGljIEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYywgaW50IGZsYWdzKSB7CisgICAgICAgIGluaXQoY29udGV4dCwgYywgZmxhZ3MpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGluaXQoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYywgYm9vbGVhbiBhdXRvUmVxdWVyeSkgeworICAgICAgICBpbml0KGNvbnRleHQsIGMsIGF1dG9SZXF1ZXJ5ID8gRkxBR19BVVRPX1JFUVVFUlkgOiBGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGluaXQoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYywgaW50IGZsYWdzKSB7CisgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FVVE9fUkVRVUVSWSkgPT0gRkxBR19BVVRPX1JFUVVFUlkpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUjsKKyAgICAgICAgICAgIG1BdXRvUmVxdWVyeSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQXV0b1JlcXVlcnkgPSBmYWxzZTsKKyAgICAgICAgfQogICAgICAgICBib29sZWFuIGN1cnNvclByZXNlbnQgPSBjICE9IG51bGw7Ci0gICAgICAgIG1BdXRvUmVxdWVyeSA9IGF1dG9SZXF1ZXJ5OwogICAgICAgICBtQ3Vyc29yID0gYzsKICAgICAgICAgbURhdGFWYWxpZCA9IGN1cnNvclByZXNlbnQ7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVJvd0lEQ29sdW1uID0gY3Vyc29yUHJlc2VudCA/IGMuZ2V0Q29sdW1uSW5kZXhPclRocm93KCJfaWQiKSA6IC0xOwotICAgICAgICBtQ2hhbmdlT2JzZXJ2ZXIgPSBuZXcgQ2hhbmdlT2JzZXJ2ZXIoKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUikgPT0gRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSKSB7CisgICAgICAgICAgICBtQ2hhbmdlT2JzZXJ2ZXIgPSBuZXcgQ2hhbmdlT2JzZXJ2ZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1DaGFuZ2VPYnNlcnZlciA9IG51bGw7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoY3Vyc29yUHJlc2VudCkgewotICAgICAgICAgICAgYy5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtQ2hhbmdlT2JzZXJ2ZXIpOworICAgICAgICAgICAgaWYgKG1DaGFuZ2VPYnNlcnZlciAhPSBudWxsKSBjLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CiAgICAgICAgICAgICBjLnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOwogICAgICAgICB9CiAgICAgfQpAQCAtMjQ2LDEzICsyODIsMTMgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ3Vyc29yLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobUNoYW5nZU9ic2VydmVyKTsKKyAgICAgICAgICAgIGlmIChtQ2hhbmdlT2JzZXJ2ZXIgIT0gbnVsbCkgbUN1cnNvci51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CiAgICAgICAgICAgICBtQ3Vyc29yLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CiAgICAgICAgICAgICBtQ3Vyc29yLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICAgICAgbUN1cnNvciA9IGN1cnNvcjsKICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjdXJzb3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobUNoYW5nZU9ic2VydmVyKTsKKyAgICAgICAgICAgIGlmIChtQ2hhbmdlT2JzZXJ2ZXIgIT0gbnVsbCkgY3Vyc29yLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CiAgICAgICAgICAgICBjdXJzb3IucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CiAgICAgICAgICAgICBtUm93SURDb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KCJfaWQiKTsKICAgICAgICAgICAgIG1EYXRhVmFsaWQgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0VkZ2VHbG93LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRWRnZUdsb3cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY3ZGFhYi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRWRnZUdsb3cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkRlY2VsZXJhdGVJbnRlcnBvbGF0b3I7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwZXJmb3JtcyB0aGUgZ2xvdyBlZmZlY3QgdXNlZCBhdCB0aGUgZWRnZXMgb2Ygc2Nyb2xsYWJsZSB3aWRnZXRzLgotICogQGhpZGUKLSAqLwotcHVibGljIGNsYXNzIEVkZ2VHbG93IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkVkZ2VHbG93IjsKLQotICAgIC8vIFRpbWUgaXQgd2lsbCB0YWtlIHRoZSBlZmZlY3QgdG8gZnVsbHkgcmVjZWRlIGluIG1zCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQ0VERV9USU1FID0gMTAwMDsKLQotICAgIC8vIFRpbWUgaXQgd2lsbCB0YWtlIGJlZm9yZSBhIHB1bGxlZCBnbG93IGJlZ2lucyByZWNlZGluZwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQVUxMX1RJTUUgPSAyNTA7Ci0KLSAgICAvLyBUaW1lIGl0IHdpbGwgdGFrZSBmb3IgYSBwdWxsZWQgZ2xvdyB0byBkZWNheSB0byBwYXJ0aWFsIHN0cmVuZ3RoIGJlZm9yZSByZWxlYXNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBVTExfREVDQVlfVElNRSA9IDEwMDAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUFYX0FMUEhBID0gMS5mOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEhFTERfRURHRV9BTFBIQSA9IDAuN2Y7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgSEVMRF9FREdFX1NDQUxFX1kgPSAwLjVmOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEhFTERfR0xPV19BTFBIQSA9IDAuNWY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgSEVMRF9HTE9XX1NDQUxFX1kgPSAwLjVmOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUFYX0dMT1dfSEVJR0hUID0gMy5mOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgUFVMTF9HTE9XX0JFR0lOID0gMS5mOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IFBVTExfRURHRV9CRUdJTiA9IDAuNmY7Ci0KLSAgICAvLyBNaW5pbXVtIHZlbG9jaXR5IHRoYXQgd2lsbCBiZSBhYnNvcmJlZAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fVkVMT0NJVFkgPSAxMDA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBFUFNJTE9OID0gMC4wMDFmOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBEcmF3YWJsZSBtRWRnZTsKLSAgICBwcml2YXRlIGZpbmFsIERyYXdhYmxlIG1HbG93OwotICAgIHByaXZhdGUgaW50IG1XaWR0aDsKLSAgICBwcml2YXRlIGludCBtSGVpZ2h0OwotCi0gICAgcHJpdmF0ZSBmbG9hdCBtRWRnZUFscGhhOwotICAgIHByaXZhdGUgZmxvYXQgbUVkZ2VTY2FsZVk7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtR2xvd0FscGhhOwotICAgIHByaXZhdGUgZmxvYXQgbUdsb3dTY2FsZVk7Ci0KLSAgICBwcml2YXRlIGZsb2F0IG1FZGdlQWxwaGFTdGFydDsKLSAgICBwcml2YXRlIGZsb2F0IG1FZGdlQWxwaGFGaW5pc2g7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtRWRnZVNjYWxlWVN0YXJ0OwotICAgIHByaXZhdGUgZmxvYXQgbUVkZ2VTY2FsZVlGaW5pc2g7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtR2xvd0FscGhhU3RhcnQ7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtR2xvd0FscGhhRmluaXNoOwotICAgIHByaXZhdGUgZmxvYXQgbUdsb3dTY2FsZVlTdGFydDsKLSAgICBwcml2YXRlIGZsb2F0IG1HbG93U2NhbGVZRmluaXNoOwotCi0gICAgcHJpdmF0ZSBsb25nIG1TdGFydFRpbWU7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtRHVyYXRpb247Ci0KLSAgICBwcml2YXRlIGZpbmFsIEludGVycG9sYXRvciBtSW50ZXJwb2xhdG9yOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lETEUgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QVUxMID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQUJTT1JCID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUkVDRURFID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFVMTF9ERUNBWSA9IDQ7Ci0KLSAgICAvLyBIb3cgbXVjaCBkcmFnZ2luZyBzaG91bGQgZWZmZWN0IHRoZSBoZWlnaHQgb2YgdGhlIGVkZ2UgaW1hZ2UuCi0gICAgLy8gTnVtYmVyIGRldGVybWluZWQgYnkgdXNlciB0ZXN0aW5nLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQVUxMX0RJU1RBTkNFX0VER0VfRkFDVE9SID0gNTsKLQotICAgIC8vIEhvdyBtdWNoIGRyYWdnaW5nIHNob3VsZCBlZmZlY3QgdGhlIGhlaWdodCBvZiB0aGUgZ2xvdyBpbWFnZS4KLSAgICAvLyBOdW1iZXIgZGV0ZXJtaW5lZCBieSB1c2VyIHRlc3RpbmcuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBVTExfRElTVEFOQ0VfR0xPV19GQUNUT1IgPSA1OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZFTE9DSVRZX0VER0VfRkFDVE9SID0gODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkVMT0NJVFlfR0xPV19GQUNUT1IgPSAxNjsKLQotICAgIHByaXZhdGUgaW50IG1TdGF0ZSA9IFNUQVRFX0lETEU7Ci0KLSAgICBwcml2YXRlIGZsb2F0IG1QdWxsRGlzdGFuY2U7Ci0KLSAgICBwdWJsaWMgRWRnZUdsb3coRHJhd2FibGUgZWRnZSwgRHJhd2FibGUgZ2xvdykgewotICAgICAgICBtRWRnZSA9IGVkZ2U7Ci0gICAgICAgIG1HbG93ID0gZ2xvdzsKLQotICAgICAgICBtSW50ZXJwb2xhdG9yID0gbmV3IERlY2VsZXJhdGVJbnRlcnBvbGF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBtV2lkdGggPSB3aWR0aDsKLSAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaGVkKCkgewotICAgICAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX0lETEU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmluaXNoKCkgewotICAgICAgICBtU3RhdGUgPSBTVEFURV9JRExFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIHB1bGxlZCBieSB0aGUgdXNlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZWx0YURpc3RhbmNlIENoYW5nZSBpbiBkaXN0YW5jZSBzaW5jZSB0aGUgbGFzdCBjYWxsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25QdWxsKGZsb2F0IGRlbHRhRGlzdGFuY2UpIHsKLSAgICAgICAgZmluYWwgbG9uZyBub3cgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1BVTExfREVDQVkgJiYgbm93IC0gbVN0YXJ0VGltZSA8IG1EdXJhdGlvbikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfUFVMTCkgewotICAgICAgICAgICAgbUdsb3dTY2FsZVkgPSBQVUxMX0dMT1dfQkVHSU47Ci0gICAgICAgIH0KLSAgICAgICAgbVN0YXRlID0gU1RBVEVfUFVMTDsKLQotICAgICAgICBtU3RhcnRUaW1lID0gbm93OwotICAgICAgICBtRHVyYXRpb24gPSBQVUxMX1RJTUU7Ci0KLSAgICAgICAgbVB1bGxEaXN0YW5jZSArPSBkZWx0YURpc3RhbmNlOwotICAgICAgICBmbG9hdCBkaXN0YW5jZSA9IE1hdGguYWJzKG1QdWxsRGlzdGFuY2UpOwotCi0gICAgICAgIG1FZGdlQWxwaGEgPSBtRWRnZUFscGhhU3RhcnQgPSBNYXRoLm1heChQVUxMX0VER0VfQkVHSU4sIE1hdGgubWluKGRpc3RhbmNlLCBNQVhfQUxQSEEpKTsKLSAgICAgICAgbUVkZ2VTY2FsZVkgPSBtRWRnZVNjYWxlWVN0YXJ0ID0gTWF0aC5tYXgoCi0gICAgICAgICAgICAgICAgSEVMRF9FREdFX1NDQUxFX1ksIE1hdGgubWluKGRpc3RhbmNlICogUFVMTF9ESVNUQU5DRV9FREdFX0ZBQ1RPUiwgMS5mKSk7Ci0KLSAgICAgICAgbUdsb3dBbHBoYSA9IG1HbG93QWxwaGFTdGFydCA9IE1hdGgubWF4KAotICAgICAgICAgICAgICAgIDAuNWYsIE1hdGgubWluKG1HbG93QWxwaGEgKyBNYXRoLmFicyhkZWx0YURpc3RhbmNlKSwgTUFYX0FMUEhBKSk7Ci0KLSAgICAgICAgZmxvYXQgZ2xvd0NoYW5nZSA9IE1hdGguYWJzKGRlbHRhRGlzdGFuY2UpOwotICAgICAgICBpZiAoZGVsdGFEaXN0YW5jZSA+IDAgJiYgbVB1bGxEaXN0YW5jZSA8IDApIHsKLSAgICAgICAgICAgIGdsb3dDaGFuZ2UgPSAtZ2xvd0NoYW5nZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVB1bGxEaXN0YW5jZSA9PSAwKSB7Ci0gICAgICAgICAgICBtR2xvd1NjYWxlWSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgbUdsb3dTY2FsZVkgPSBtR2xvd1NjYWxlWVN0YXJ0ID0gTWF0aC5tYXgoCi0gICAgICAgICAgICAgICAgMCwgbUdsb3dTY2FsZVkgKyBnbG93Q2hhbmdlICogUFVMTF9ESVNUQU5DRV9HTE9XX0ZBQ1RPUik7Ci0KLSAgICAgICAgbUVkZ2VBbHBoYUZpbmlzaCA9IG1FZGdlQWxwaGE7Ci0gICAgICAgIG1FZGdlU2NhbGVZRmluaXNoID0gbUVkZ2VTY2FsZVk7Ci0gICAgICAgIG1HbG93QWxwaGFGaW5pc2ggPSBtR2xvd0FscGhhOwotICAgICAgICBtR2xvd1NjYWxlWUZpbmlzaCA9IG1HbG93U2NhbGVZOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIHJlbGVhc2VkIGFmdGVyIGJlaW5nIHB1bGxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblJlbGVhc2UoKSB7Ci0gICAgICAgIG1QdWxsRGlzdGFuY2UgPSAwOwotCi0gICAgICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfUFVMTCAmJiBtU3RhdGUgIT0gU1RBVEVfUFVMTF9ERUNBWSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVN0YXRlID0gU1RBVEVfUkVDRURFOwotICAgICAgICBtRWRnZUFscGhhU3RhcnQgPSBtRWRnZUFscGhhOwotICAgICAgICBtRWRnZVNjYWxlWVN0YXJ0ID0gbUVkZ2VTY2FsZVk7Ci0gICAgICAgIG1HbG93QWxwaGFTdGFydCA9IG1HbG93QWxwaGE7Ci0gICAgICAgIG1HbG93U2NhbGVZU3RhcnQgPSBtR2xvd1NjYWxlWTsKLQotICAgICAgICBtRWRnZUFscGhhRmluaXNoID0gMC5mOwotICAgICAgICBtRWRnZVNjYWxlWUZpbmlzaCA9IDAuZjsKLSAgICAgICAgbUdsb3dBbHBoYUZpbmlzaCA9IDAuZjsKLSAgICAgICAgbUdsb3dTY2FsZVlGaW5pc2ggPSAwLmY7Ci0KLSAgICAgICAgbVN0YXJ0VGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7Ci0gICAgICAgIG1EdXJhdGlvbiA9IFJFQ0VERV9USU1FOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGwgd2hlbiB0aGUgZWZmZWN0IGFic29yYnMgYW4gaW1wYWN0IGF0IHRoZSBnaXZlbiB2ZWxvY2l0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2ZWxvY2l0eSBWZWxvY2l0eSBhdCBpbXBhY3QgaW4gcGl4ZWxzIHBlciBzZWNvbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25BYnNvcmIoaW50IHZlbG9jaXR5KSB7Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX0FCU09SQjsKLSAgICAgICAgdmVsb2NpdHkgPSBNYXRoLm1heChNSU5fVkVMT0NJVFksIE1hdGguYWJzKHZlbG9jaXR5KSk7Ci0KLSAgICAgICAgbVN0YXJ0VGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7Ci0gICAgICAgIG1EdXJhdGlvbiA9IDAuMWYgKyAodmVsb2NpdHkgKiAwLjAzZik7Ci0KLSAgICAgICAgLy8gVGhlIGVkZ2Ugc2hvdWxkIGFsd2F5cyBiZSBhdCBsZWFzdCBwYXJ0aWFsbHkgdmlzaWJsZSwgcmVnYXJkbGVzcwotICAgICAgICAvLyBvZiB2ZWxvY2l0eS4KLSAgICAgICAgbUVkZ2VBbHBoYVN0YXJ0ID0gMC41ZjsKLSAgICAgICAgbUVkZ2VTY2FsZVlTdGFydCA9IDAuMmY7Ci0gICAgICAgIC8vIFRoZSBnbG93IGRlcGVuZHMgbW9yZSBvbiB0aGUgdmVsb2NpdHksIGFuZCB0aGVyZWZvcmUgc3RhcnRzIG91dAotICAgICAgICAvLyBuZWFybHkgaW52aXNpYmxlLgotICAgICAgICBtR2xvd0FscGhhU3RhcnQgPSAwLjVmOwotICAgICAgICBtR2xvd1NjYWxlWVN0YXJ0ID0gMC5mOwotCi0gICAgICAgIC8vIEZhY3RvciB0aGUgdmVsb2NpdHkgYnkgOC4gVGVzdGluZyBvbiBkZXZpY2Ugc2hvd3MgdGhpcyB3b3JrcyBiZXN0IHRvCi0gICAgICAgIC8vIHJlZmxlY3QgdGhlIHN0cmVuZ3RoIG9mIHRoZSB1c2VyJ3Mgc2Nyb2xsaW5nLgotICAgICAgICBtRWRnZUFscGhhRmluaXNoID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odmVsb2NpdHkgKiBWRUxPQ0lUWV9FREdFX0ZBQ1RPUiwgMSkpOwotICAgICAgICAvLyBFZGdlIHNob3VsZCBuZXZlciBnZXQgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgaXRzIGFzc2V0LgotICAgICAgICBtRWRnZVNjYWxlWUZpbmlzaCA9IDEuZjsKLQotICAgICAgICAvLyBHcm93dGggZm9yIHRoZSBzaXplIG9mIHRoZSBnbG93IHNob3VsZCBiZSBxdWFkcmF0aWMgdG8gcHJvcGVybHkKLSAgICAgICAgLy8gcmVzcG9uZAotICAgICAgICAvLyB0byBhIHVzZXIncyBzY3JvbGxpbmcgc3BlZWQuIFRoZSBmYXN0ZXIgdGhlIHNjcm9sbGluZyBzcGVlZCwgdGhlIG1vcmUKLSAgICAgICAgLy8gaW50ZW5zZSB0aGUgZWZmZWN0IHNob3VsZCBiZSBmb3IgYm90aCB0aGUgc2l6ZSBhbmQgdGhlIHNhdHVyYXRpb24uCi0gICAgICAgIG1HbG93U2NhbGVZRmluaXNoID0gTWF0aC5taW4oMC4wMjVmICsgKHZlbG9jaXR5ICogKHZlbG9jaXR5IC8gMTAwKSAqIDAuMDAwMTVmKSwgMS43NWYpOwotICAgICAgICAvLyBBbHBoYSBzaG91bGQgY2hhbmdlIGZvciB0aGUgZ2xvdyBhcyB3ZWxsIGFzIHNpemUuCi0gICAgICAgIG1HbG93QWxwaGFGaW5pc2ggPSBNYXRoLm1heCgKLSAgICAgICAgICAgICAgICBtR2xvd0FscGhhU3RhcnQsIE1hdGgubWluKHZlbG9jaXR5ICogVkVMT0NJVFlfR0xPV19GQUNUT1IgKiAuMDAwMDFmLCBNQVhfQUxQSEEpKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIERyYXcgaW50byB0aGUgcHJvdmlkZWQgY2FudmFzLiBBc3N1bWVzIHRoYXQgdGhlIGNhbnZhcyBoYXMgYmVlbiByb3RhdGVkCi0gICAgICogYWNjb3JkaW5nbHkgYW5kIHRoZSBzaXplIGhhcyBiZWVuIHNldC4gVGhlIGVmZmVjdCB3aWxsIGJlIGRyYXduIHRoZSBmdWxsCi0gICAgICogd2lkdGggb2YgWD0wIHRvIFg9d2lkdGgsIGVtaXR0aW5nIGZyb20gWT0wIGFuZCBleHRlbmRpbmcgdG8gc29tZSBmYWN0b3IgPAotICAgICAqIDEuZiBvZiBoZWlnaHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FudmFzIENhbnZhcyB0byBkcmF3IGludG8KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZHJhd2luZyBzaG91bGQgY29udGludWUgYmV5b25kIHRoaXMgZnJhbWUgdG8gY29udGludWUgdGhlCi0gICAgICogICAgICAgICBhbmltYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBkcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgdXBkYXRlKCk7Ci0KLSAgICAgICAgZmluYWwgaW50IGVkZ2VIZWlnaHQgPSBtRWRnZS5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKLSAgICAgICAgZmluYWwgaW50IGdsb3dIZWlnaHQgPSBtR2xvdy5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKLQotICAgICAgICBmaW5hbCBmbG9hdCBkaXN0U2NhbGUgPSAoZmxvYXQpIG1IZWlnaHQgLyBtV2lkdGg7Ci0KLSAgICAgICAgbUdsb3cuc2V0QWxwaGEoKGludCkgKE1hdGgubWF4KDAsIE1hdGgubWluKG1HbG93QWxwaGEsIDEpKSAqIDI1NSkpOwotICAgICAgICAvLyBXaWR0aCBvZiB0aGUgaW1hZ2Ugc2hvdWxkIGJlIDMgKiB0aGUgd2lkdGggb2YgdGhlIHNjcmVlbi4KLSAgICAgICAgLy8gU2hvdWxkIHN0YXJ0IG9mZiBzY3JlZW4gdG8gdGhlIGxlZnQuCi0gICAgICAgIG1HbG93LnNldEJvdW5kcygtbVdpZHRoLCAwLCBtV2lkdGggKiAyLCAoaW50KSBNYXRoLm1pbigKLSAgICAgICAgICAgICAgICBnbG93SGVpZ2h0ICogbUdsb3dTY2FsZVkgKiBkaXN0U2NhbGUgKiAwLjZmLCBtSGVpZ2h0ICogTUFYX0dMT1dfSEVJR0hUKSk7Ci0gICAgICAgIG1HbG93LmRyYXcoY2FudmFzKTsKLQotICAgICAgICBtRWRnZS5zZXRBbHBoYSgoaW50KSAoTWF0aC5tYXgoMCwgTWF0aC5taW4obUVkZ2VBbHBoYSwgMSkpICogMjU1KSk7Ci0gICAgICAgIG1FZGdlLnNldEJvdW5kcygwLCAwLCBtV2lkdGgsIChpbnQpIChlZGdlSGVpZ2h0ICogbUVkZ2VTY2FsZVkpKTsKLSAgICAgICAgbUVkZ2UuZHJhdyhjYW52YXMpOwotCi0gICAgICAgIHJldHVybiBtU3RhdGUgIT0gU1RBVEVfSURMRTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlKCkgewotICAgICAgICBmaW5hbCBsb25nIHRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICBmaW5hbCBmbG9hdCB0ID0gTWF0aC5taW4oKHRpbWUgLSBtU3RhcnRUaW1lKSAvIG1EdXJhdGlvbiwgMS5mKTsKLQotICAgICAgICBmaW5hbCBmbG9hdCBpbnRlcnAgPSBtSW50ZXJwb2xhdG9yLmdldEludGVycG9sYXRpb24odCk7Ci0KLSAgICAgICAgbUVkZ2VBbHBoYSA9IG1FZGdlQWxwaGFTdGFydCArIChtRWRnZUFscGhhRmluaXNoIC0gbUVkZ2VBbHBoYVN0YXJ0KSAqIGludGVycDsKLSAgICAgICAgbUVkZ2VTY2FsZVkgPSBtRWRnZVNjYWxlWVN0YXJ0ICsgKG1FZGdlU2NhbGVZRmluaXNoIC0gbUVkZ2VTY2FsZVlTdGFydCkgKiBpbnRlcnA7Ci0gICAgICAgIG1HbG93QWxwaGEgPSBtR2xvd0FscGhhU3RhcnQgKyAobUdsb3dBbHBoYUZpbmlzaCAtIG1HbG93QWxwaGFTdGFydCkgKiBpbnRlcnA7Ci0gICAgICAgIG1HbG93U2NhbGVZID0gbUdsb3dTY2FsZVlTdGFydCArIChtR2xvd1NjYWxlWUZpbmlzaCAtIG1HbG93U2NhbGVZU3RhcnQpICogaW50ZXJwOwotCi0gICAgICAgIGlmICh0ID49IDEuZiAtIEVQU0lMT04pIHsKLSAgICAgICAgICAgIHN3aXRjaCAobVN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9BQlNPUkI6Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1JFQ0VERTsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1EdXJhdGlvbiA9IFJFQ0VERV9USU1FOwotCi0gICAgICAgICAgICAgICAgICAgIG1FZGdlQWxwaGFTdGFydCA9IG1FZGdlQWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgIG1FZGdlU2NhbGVZU3RhcnQgPSBtRWRnZVNjYWxlWTsKLSAgICAgICAgICAgICAgICAgICAgbUdsb3dBbHBoYVN0YXJ0ID0gbUdsb3dBbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgbUdsb3dTY2FsZVlTdGFydCA9IG1HbG93U2NhbGVZOwotCi0gICAgICAgICAgICAgICAgICAgIG1FZGdlQWxwaGFGaW5pc2ggPSAwLmY7Ci0gICAgICAgICAgICAgICAgICAgIG1FZGdlU2NhbGVZRmluaXNoID0gbUVkZ2VTY2FsZVk7Ci0gICAgICAgICAgICAgICAgICAgIG1HbG93QWxwaGFGaW5pc2ggPSAwLmY7Ci0gICAgICAgICAgICAgICAgICAgIG1HbG93U2NhbGVZRmluaXNoID0gbUdsb3dTY2FsZVk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfUFVMTDoKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUFVMTF9ERUNBWTsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1EdXJhdGlvbiA9IFBVTExfREVDQVlfVElNRTsKLQotICAgICAgICAgICAgICAgICAgICBtRWRnZUFscGhhU3RhcnQgPSBtRWRnZUFscGhhOwotICAgICAgICAgICAgICAgICAgICBtRWRnZVNjYWxlWVN0YXJ0ID0gbUVkZ2VTY2FsZVk7Ci0gICAgICAgICAgICAgICAgICAgIG1HbG93QWxwaGFTdGFydCA9IG1HbG93QWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgIG1HbG93U2NhbGVZU3RhcnQgPSBtR2xvd1NjYWxlWTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBBZnRlciBhIHB1bGwsIHRoZSBnbG93IHNob3VsZCBmYWRlIHRvIG5vdGhpbmcuCi0gICAgICAgICAgICAgICAgICAgIG1FZGdlQWxwaGFGaW5pc2ggPSAwLmY7Ci0gICAgICAgICAgICAgICAgICAgIG1FZGdlU2NhbGVZRmluaXNoID0gMC5mOwotICAgICAgICAgICAgICAgICAgICBtR2xvd0FscGhhRmluaXNoID0gMC5mOwotICAgICAgICAgICAgICAgICAgICBtR2xvd1NjYWxlWUZpbmlzaCA9IDAuZjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9QVUxMX0RFQ0FZOgotICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nOyB3YWl0IGZvciByZWxlYXNlCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfUkVDRURFOgotICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9JRExFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9FeHBhbmRhYmxlTGlzdFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9FeHBhbmRhYmxlTGlzdFZpZXcuamF2YQppbmRleCA4YmQ3OTdiLi4zZDIxMDQ4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRXhwYW5kYWJsZUxpc3RWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0V4cGFuZGFibGVMaXN0Vmlldy5qYXZhCkBAIC0xODUsNyArMTg1LDYgQEAKICAgICAKICAgICAvKiogRHJhd2FibGUgdG8gYmUgdXNlZCBhcyBhIGRpdmlkZXIgd2hlbiBpdCBpcyBhZGphY2VudCB0byBhbnkgY2hpbGRyZW4gKi8KICAgICBwcml2YXRlIERyYXdhYmxlIG1DaGlsZERpdmlkZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1DbGlwQ2hpbGREaXZpZGVyOwogCiAgICAgLy8gQm91bmRzIG9mIHRoZSBpbmRpY2F0b3IgdG8gYmUgZHJhd24KICAgICBwcml2YXRlIGZpbmFsIFJlY3QgbUluZGljYXRvclJlY3QgPSBuZXcgUmVjdCgpOwpAQCAtMzc5LDcgKzM3OCw2IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q2hpbGREaXZpZGVyKERyYXdhYmxlIGNoaWxkRGl2aWRlcikgewogICAgICAgICBtQ2hpbGREaXZpZGVyID0gY2hpbGREaXZpZGVyOwotICAgICAgICBtQ2xpcENoaWxkRGl2aWRlciA9IGNoaWxkRGl2aWRlciAhPSBudWxsICYmIGNoaWxkRGl2aWRlciBpbnN0YW5jZW9mIENvbG9yRHJhd2FibGU7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0zOTYsMTcgKzM5NCw4IEBACiAgICAgICAgICAgICAgICAgICAgIHBvcy5ncm91cE1ldGFkYXRhLmxhc3RDaGlsZEZsUG9zICE9IHBvcy5ncm91cE1ldGFkYXRhLmZsUG9zKSkgewogICAgICAgICAgICAgICAgIC8vIFRoZXNlIGFyZSB0aGUgY2FzZXMgd2hlcmUgd2UgZHJhdyB0aGUgY2hpbGQgZGl2aWRlcgogICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGRpdmlkZXIgPSBtQ2hpbGREaXZpZGVyOwotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gY2xpcCA9IG1DbGlwQ2hpbGREaXZpZGVyOwotICAgICAgICAgICAgICAgIGlmICghY2xpcCkgewotICAgICAgICAgICAgICAgICAgICBkaXZpZGVyLnNldEJvdW5kcyhib3VuZHMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdChib3VuZHMpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkaXZpZGVyLnNldEJvdW5kcyhib3VuZHMpOwogICAgICAgICAgICAgICAgIGRpdmlkZXIuZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgICAgIGlmIChjbGlwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHBvcy5yZWN5Y2xlKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0ZyYW1lTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRnJhbWVMYXlvdXQuamF2YQppbmRleCBlNDQ1MTgwLi41NTlhNWZlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRnJhbWVMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRnJhbWVMYXlvdXQuamF2YQpAQCAtMzIsOCArMzIsOCBAQAogCiAvKioKICAqIEZyYW1lTGF5b3V0IGlzIGRlc2lnbmVkIHRvIGJsb2NrIG91dCBhbiBhcmVhIG9uIHRoZSBzY3JlZW4gdG8gZGlzcGxheQotICogYSBzaW5nbGUgaXRlbS4gWW91IGNhbiBhZGQgbXVsdGlwbGUgY2hpbGRyZW4gdG8gYSBGcmFtZUxheW91dCwgYnV0IGFsbAotICogY2hpbGRyZW4gYXJlIHBlZ2dlZCB0byB0aGUgdG9wIGxlZnQgb2YgdGhlIHNjcmVlbi4KKyAqIGEgc2luZ2xlIGl0ZW0uIFlvdSBjYW4gYWRkIG11bHRpcGxlIGNoaWxkcmVuIHRvIGEgRnJhbWVMYXlvdXQgYW5kIGNvbnRyb2wgdGhlaXIKKyAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgRnJhbWVMYXlvdXQgdXNpbmcge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0LkxheW91dFBhcmFtcyNncmF2aXR5fS4KICAqIENoaWxkcmVuIGFyZSBkcmF3biBpbiBhIHN0YWNrLCB3aXRoIHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIGNoaWxkIG9uIHRvcC4KICAqIFRoZSBzaXplIG9mIHRoZSBmcmFtZSBsYXlvdXQgaXMgdGhlIHNpemUgb2YgaXRzIGxhcmdlc3QgY2hpbGQgKHBsdXMgcGFkZGluZyksIHZpc2libGUKICAqIG9yIG5vdCAoaWYgdGhlIEZyYW1lTGF5b3V0J3MgcGFyZW50IHBlcm1pdHMpLiBWaWV3cyB0aGF0IGFyZSBHT05FIGFyZSB1c2VkIGZvciBzaXppbmcKQEAgLTQ0MCw2ICs0NDAsOCBAQAogICAgICAqIFBlci1jaGlsZCBsYXlvdXQgaW5mb3JtYXRpb24gZm9yIGxheW91dHMgdGhhdCBzdXBwb3J0IG1hcmdpbnMuCiAgICAgICogU2VlIHtAbGluayBhbmRyb2lkLlIuc3R5bGVhYmxlI0ZyYW1lTGF5b3V0X0xheW91dCBGcmFtZUxheW91dCBMYXlvdXQgQXR0cmlidXRlc30KICAgICAgKiBmb3IgYSBsaXN0IG9mIGFsbCBjaGlsZCB2aWV3IGF0dHJpYnV0ZXMgdGhhdCB0aGlzIGNsYXNzIHN1cHBvcnRzLgorICAgICAqIAorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0ZyYW1lTGF5b3V0X0xheW91dF9sYXlvdXRfZ3Jhdml0eQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGF5b3V0UGFyYW1zIGV4dGVuZHMgTWFyZ2luTGF5b3V0UGFyYW1zIHsKICAgICAgICAgLyoqCkBAIC00NDcsNiArNDQ5LDggQEAKICAgICAgICAgICogYXJlIGFzc29jaWF0ZWQuCiAgICAgICAgICAqCiAgICAgICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LkdyYXZpdHkKKyAgICAgICAgICogCisgICAgICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0ZyYW1lTGF5b3V0X0xheW91dF9sYXlvdXRfZ3Jhdml0eQogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGludCBncmF2aXR5ID0gLTE7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HYWxsZXJ5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR2FsbGVyeS5qYXZhCmluZGV4IGNjZDM3ZDMuLjk3ODk2NTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HYWxsZXJ5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dhbGxlcnkuamF2YQpAQCAtMTIxMCw3ICsxMjEwLDcgQEAKIAogICAgICAgICAvLyBXZSB1bmZvY3VzIHRoZSBvbGQgY2hpbGQgZG93biBoZXJlIHNvIHRoZSBhYm92ZSBoYXNGb2N1cyBjaGVjawogICAgICAgICAvLyByZXR1cm5zIHRydWUKLSAgICAgICAgaWYgKG9sZFNlbGVjdGVkQ2hpbGQgIT0gbnVsbCkgeworICAgICAgICBpZiAob2xkU2VsZWN0ZWRDaGlsZCAhPSBudWxsICYmIG9sZFNlbGVjdGVkQ2hpbGQgIT0gY2hpbGQpIHsKIAogICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGl0cyBkcmF3YWJsZSBzdGF0ZSBkb2Vzbid0IGNvbnRhaW4gJ3NlbGVjdGVkJwogICAgICAgICAgICAgb2xkU2VsZWN0ZWRDaGlsZC5zZXRTZWxlY3RlZChmYWxzZSk7CkBAIC0xMjY2LDYgKzEyNjYsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgaWYgKGdhaW5Gb2N1cyAmJiBtU2VsZWN0ZWRDaGlsZCAhPSBudWxsKSB7CiAgICAgICAgICAgICBtU2VsZWN0ZWRDaGlsZC5yZXF1ZXN0Rm9jdXMoZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIG1TZWxlY3RlZENoaWxkLnNldFNlbGVjdGVkKHRydWUpOwogICAgICAgICB9CiAKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HcmlkVmlldy5qYXZhCmluZGV4IGE3MzAwYzIuLjQ2YzdkMzMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HcmlkVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HcmlkVmlldy5qYXZhCkBAIC0xNywxNSArMTcsMTggQEAKIHBhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU291bmRFZmZlY3RDb25zdGFudHM7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uR3JpZExheW91dEFuaW1hdGlvbkNvbnRyb2xsZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MuUmVtb3RlVmlldzsKIAogCiAvKioKQEAgLTM1LDYgKzM4LDcgQEAKICAqIDxwPlNlZSB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdmlld3MvaGVsbG8tZ3JpZHZpZXcuaHRtbCI+R3JpZAogICogVmlldyB0dXRvcmlhbDwvYT4uPC9wPgogICovCitAUmVtb3RlVmlldwogcHVibGljIGNsYXNzIEdyaWRWaWV3IGV4dGVuZHMgQWJzTGlzdFZpZXcgewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX1NUUkVUQ0ggPSAwOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUkVUQ0hfU1BBQ0lORyA9IDE7CkBAIC0xMDMsMTkgKzEwNyw0OSBAQAogICAgICAgICBhLnJlY3ljbGUoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZXQgaG93IHRoZSB1c2VyIG1heSBzZWxlY3QgaXRlbXMgZnJvbSB0aGUgZ3JpZC4KKyAgICAgKgorICAgICAqIDxwPkdyaWRWaWV3IG9ubHkgc3VwcG9ydHMge0BsaW5rIEFic0xpc3RWaWV3I0NIT0lDRV9NT0RFX05PTkV9IGFuZAorICAgICAqIHtAbGluayBBYnNMaXN0VmlldyNDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTH0uIEF0dGVtcHRpbmcgdG8gc2V0IGFuIHVuc3VwcG9ydGVkIGNob2ljZQorICAgICAqIG1vZGUgd2lsbCB0aHJvdyBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRDaG9pY2VNb2RlKGludCBjaG9pY2VNb2RlKSB7CisgICAgICAgIHN3aXRjaCAoY2hvaWNlTW9kZSkgeworICAgICAgICBjYXNlIENIT0lDRV9NT0RFX05PTkU6CisgICAgICAgIGNhc2UgQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUw6CisgICAgICAgICAgICBzdXBlci5zZXRDaG9pY2VNb2RlKGNob2ljZU1vZGUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgY2hvaWNlIG1vZGUgIiArIGNob2ljZU1vZGUpOworICAgICAgICB9CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIExpc3RBZGFwdGVyIGdldEFkYXB0ZXIoKSB7CiAgICAgICAgIHJldHVybiBtQWRhcHRlcjsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoaXMgQWJzTGlzdFZpZXcgdG8gdXNlIGEgcmVtb3RlIHZpZXdzIGFkYXB0ZXIgd2hpY2ggY29ubmVjdHMgdG8gYSBSZW1vdGVWaWV3c1NlcnZpY2UKKyAgICAgKiB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgaW50ZW50LgorICAgICAqIEBwYXJhbSBpbnRlbnQgdGhlIGludGVudCB1c2VkIHRvIGlkZW50aWZ5IHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UgZm9yIHRoZSBhZGFwdGVyIHRvIGNvbm5lY3QgdG8uCisgICAgICovCisgICAgQGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlVmlld3NBZGFwdGVyKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgc3VwZXIuc2V0UmVtb3RlVmlld3NBZGFwdGVyKGludGVudCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZGF0YSBiZWhpbmQgdGhpcyBHcmlkVmlldy4KICAgICAgKgogICAgICAqIEBwYXJhbSBhZGFwdGVyIHRoZSBhZGFwdGVyIHByb3ZpZGluZyB0aGUgZ3JpZCdzIGRhdGEKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKLSAgICAgICAgaWYgKG51bGwgIT0gbUFkYXB0ZXIpIHsKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwgJiYgbURhdGFTZXRPYnNlcnZlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBtQWRhcHRlci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOwogICAgICAgICB9CiAKQEAgLTEyNSw3ICsxNTksMTAgQEAKIAogICAgICAgICBtT2xkU2VsZWN0ZWRQb3NpdGlvbiA9IElOVkFMSURfUE9TSVRJT047CiAgICAgICAgIG1PbGRTZWxlY3RlZFJvd0lkID0gSU5WQUxJRF9ST1dfSUQ7Ci0gICAgICAgIAorCisgICAgICAgIC8vIEFic0xpc3RWaWV3I3NldEFkYXB0ZXIgd2lsbCB1cGRhdGUgY2hvaWNlIG1vZGUgc3RhdGVzLgorICAgICAgICBzdXBlci5zZXRBZGFwdGVyKGFkYXB0ZXIpOworCiAgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBtT2xkSXRlbUNvdW50ID0gbUl0ZW1Db3VudDsKICAgICAgICAgICAgIG1JdGVtQ291bnQgPSBtQWRhcHRlci5nZXRDb3VudCgpOwpAQCAtNzQyLDYgKzc3OSwyNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNtb290aGx5IHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgcG9zaXRpb24uIFRoZSB2aWV3IHdpbGwKKyAgICAgKiBzY3JvbGwgc3VjaCB0aGF0IHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24gaXMgZGlzcGxheWVkLgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBTY3JvbGwgdG8gdGhpcyBhZGFwdGVyIHBvc2l0aW9uLgorICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAorICAgIHB1YmxpYyB2b2lkIHNtb290aFNjcm9sbFRvUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIHN1cGVyLnNtb290aFNjcm9sbFRvUG9zaXRpb24ocG9zaXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNtb290aGx5IHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgcG9zaXRpb24gb2Zmc2V0LiBUaGUgdmlldyB3aWxsCisgICAgICogc2Nyb2xsIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBhbW91bnQgdG8gb2Zmc2V0IGZyb20gdGhlIGFkYXB0ZXIgcG9zaXRpb24gdG8gc2Nyb2xsIHRvLgorICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAorICAgIHB1YmxpYyB2b2lkIHNtb290aFNjcm9sbEJ5T2Zmc2V0KGludCBvZmZzZXQpIHsKKyAgICAgICAgc3VwZXIuc21vb3RoU2Nyb2xsQnlPZmZzZXQob2Zmc2V0KTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBGaWxscyB0aGUgZ3JpZCBiYXNlZCBvbiBwb3NpdGlvbmluZyB0aGUgbmV3IHNlbGVjdGlvbiByZWxhdGl2ZSB0byB0aGUgb2xkCiAgICAgICogc2VsZWN0aW9uLiBUaGUgbmV3IHNlbGVjdGlvbiB3aWxsIGJlIHBsYWNlZCBhdCwgYWJvdmUsIG9yIGJlbG93IHRoZQogICAgICAqIGxvY2F0aW9uIG9mIHRoZSBuZXcgc2VsZWN0aW9uIGRlcGVuZGluZyBvbiBob3cgdGhlIHNlbGVjdGlvbiBpcyBtb3ZpbmcuCkBAIC0xMjgxLDYgKzEzMzgsMTUgQEAKICAgICAgICAgICAgIGNoaWxkLnNldFByZXNzZWQoaXNQcmVzc2VkKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FICYmIG1DaGVja1N0YXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBDaGVja2FibGUpIHsKKyAgICAgICAgICAgICAgICAoKENoZWNrYWJsZSkgY2hpbGQpLnNldENoZWNrZWQobUNoZWNrU3RhdGVzLmdldChwb3NpdGlvbikpOworICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25JbmZvKCkudGFyZ2V0U2RrVmVyc2lvbgorICAgICAgICAgICAgICAgICAgICA+PSBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMuSE9ORVlDT01CKSB7CisgICAgICAgICAgICAgICAgY2hpbGQuc2V0QWN0aXZhdGVkKG1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGlmIChuZWVkVG9NZWFzdXJlKSB7CiAgICAgICAgICAgICBpbnQgY2hpbGRIZWlnaHRTcGVjID0gVmlld0dyb3VwLmdldENoaWxkTWVhc3VyZVNwZWMoCiAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygwLCBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCksIDAsIHAuaGVpZ2h0KTsKQEAgLTE0OTEsOSArMTU1Nyw5IEBACiAgICAgICAgIGludCBuZXh0UGFnZSA9IC0xOwogCiAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gRk9DVVNfVVApIHsKLSAgICAgICAgICAgIG5leHRQYWdlID0gTWF0aC5tYXgoMCwgbVNlbGVjdGVkUG9zaXRpb24gLSBnZXRDaGlsZENvdW50KCkgLSAxKTsKKyAgICAgICAgICAgIG5leHRQYWdlID0gTWF0aC5tYXgoMCwgbVNlbGVjdGVkUG9zaXRpb24gLSBnZXRDaGlsZENvdW50KCkpOwogICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBGT0NVU19ET1dOKSB7Ci0gICAgICAgICAgICBuZXh0UGFnZSA9IE1hdGgubWluKG1JdGVtQ291bnQgLSAxLCBtU2VsZWN0ZWRQb3NpdGlvbiArIGdldENoaWxkQ291bnQoKSAtIDEpOworICAgICAgICAgICAgbmV4dFBhZ2UgPSBNYXRoLm1pbihtSXRlbUNvdW50IC0gMSwgbVNlbGVjdGVkUG9zaXRpb24gKyBnZXRDaGlsZENvdW50KCkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG5leHRQYWdlID49IDApIHsKQEAgLTE3NzcsNiArMTg0MywxOSBAQAogICAgICAgICAgICAgcmVxdWVzdExheW91dElmTmVjZXNzYXJ5KCk7CiAgICAgICAgIH0KICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgZ3JpZC4gCisgICAgICogUmV0dXJucyB7QGxpbmsgI0FVVE9fRklUfSBpZiB0aGUgR3JpZCBoYXMgbmV2ZXIgYmVlbiBsYWlkIG91dC4KKyAgICAgKgorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0dyaWRWaWV3X251bUNvbHVtbnMKKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXROdW1Db2x1bW5zKGludCkKKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwdWJsaWMgaW50IGdldE51bUNvbHVtbnMoKSB7ICAKKyAgICAgICAgcmV0dXJuIG1OdW1Db2x1bW5zOworICAgIH0KIAogICAgIC8qKgogICAgICAqIE1ha2Ugc3VyZSB2aWV3cyBhcmUgdG91Y2hpbmcgdGhlIHRvcCBvciBib3R0b20gZWRnZSwgYXMgYXBwcm9wcmlhdGUgZm9yCkBAIC0xODc2LDEyICsxOTU1LDcgQEAKICAgICAgICAgLy8gVE9ETzogQWNjb3VudCBmb3IgdmVydGljYWwgc3BhY2luZyB0b28KICAgICAgICAgZmluYWwgaW50IG51bUNvbHVtbnMgPSBtTnVtQ29sdW1uczsKICAgICAgICAgZmluYWwgaW50IHJvd0NvdW50ID0gKG1JdGVtQ291bnQgKyBudW1Db2x1bW5zIC0gMSkgLyBudW1Db2x1bW5zOwotICAgICAgICBpbnQgcmVzdWx0ID0gTWF0aC5tYXgocm93Q291bnQgKiAxMDAsIDApOwotICAgICAgICBpZiAobVNjcm9sbFkgIT0gMCkgewotICAgICAgICAgICAgLy8gQ29tcGVuc2F0ZSBmb3Igb3ZlcnNjcm9sbAotICAgICAgICAgICAgcmVzdWx0ICs9IE1hdGguYWJzKChpbnQpICgoZmxvYXQpIG1TY3JvbGxZIC8gZ2V0SGVpZ2h0KCkgKiByb3dDb3VudCAqIDEwMCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIHJldHVybiBNYXRoLm1heChyb3dDb3VudCAqIDEwMCwgMCk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvSG9yaXpvbnRhbFNjcm9sbFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Ib3Jpem9udGFsU2Nyb2xsVmlldy5qYXZhCmluZGV4IGNkMTBhNTkuLmUzMGQ0YzggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Ib3Jpem9udGFsU2Nyb2xsVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Ib3Jpem9udGFsU2Nyb2xsVmlldy5qYXZhCkBAIC0xNiwyNCArMTYsMTkgQEAKIAogcGFja2FnZSBhbmRyb2lkLndpZGdldDsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7Ci0KLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5Gb2N1c0ZpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WZWxvY2l0eVRyYWNrZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5Gb2N1c0ZpbmRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdQYXJlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIApAQCAtNTgsNiArNTMsOCBAQAogICogd2l0aGluIGEgbGFyZ2VyIGNvbnRhaW5lci4KICAqCiAgKiA8cD5Ib3Jpem9udGFsU2Nyb2xsVmlldyBvbmx5IHN1cHBvcnRzIGhvcml6b250YWwgc2Nyb2xsaW5nLgorICogCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNIb3Jpem9udGFsU2Nyb2xsVmlld19maWxsVmlld3BvcnQgCiAgKi8KIHB1YmxpYyBjbGFzcyBIb3Jpem9udGFsU2Nyb2xsVmlldyBleHRlbmRzIEZyYW1lTGF5b3V0IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQU5JTUFURURfU0NST0xMX0dBUCA9IFNjcm9sbFZpZXcuQU5JTUFURURfU0NST0xMX0dBUDsKQEAgLTY4LDkgKzY1LDcgQEAKICAgICBwcml2YXRlIGxvbmcgbUxhc3RTY3JvbGw7CiAKICAgICBwcml2YXRlIGZpbmFsIFJlY3QgbVRlbXBSZWN0ID0gbmV3IFJlY3QoKTsKLSAgICBwcml2YXRlIE92ZXJTY3JvbGxlciBtU2Nyb2xsZXI7Ci0gICAgcHJpdmF0ZSBFZGdlR2xvdyBtRWRnZUdsb3dMZWZ0OwotICAgIHByaXZhdGUgRWRnZUdsb3cgbUVkZ2VHbG93UmlnaHQ7CisgICAgcHJpdmF0ZSBTY3JvbGxlciBtU2Nyb2xsZXI7CiAKICAgICAvKioKICAgICAgKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgd2UgYXJlIG1vdmluZyBmb2N1cyBvdXJzZWx2ZXMuIFRoaXMgaXMgc28gdGhlCkBAIC0xMjQsOSArMTE5LDYgQEAKICAgICBwcml2YXRlIGludCBtTWluaW11bVZlbG9jaXR5OwogICAgIHByaXZhdGUgaW50IG1NYXhpbXVtVmVsb2NpdHk7CiAgICAgCi0gICAgcHJpdmF0ZSBpbnQgbU92ZXJzY3JvbGxEaXN0YW5jZTsKLSAgICBwcml2YXRlIGludCBtT3ZlcmZsaW5nRGlzdGFuY2U7Ci0KICAgICAvKioKICAgICAgKiBJRCBvZiB0aGUgYWN0aXZlIHBvaW50ZXIuIFRoaXMgaXMgdXNlZCB0byByZXRhaW4gY29uc2lzdGVuY3kgZHVyaW5nCiAgICAgICogZHJhZ3MvZmxpbmdzIGlmIG11bHRpcGxlIHBvaW50ZXJzIGFyZSB1c2VkLgpAQCAtMTk5LDcgKzE5MSw3IEBACiAKIAogICAgIHByaXZhdGUgdm9pZCBpbml0U2Nyb2xsVmlldygpIHsKLSAgICAgICAgbVNjcm9sbGVyID0gbmV3IE92ZXJTY3JvbGxlcihnZXRDb250ZXh0KCkpOworICAgICAgICBtU2Nyb2xsZXIgPSBuZXcgU2Nyb2xsZXIoZ2V0Q29udGV4dCgpKTsKICAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOwogICAgICAgICBzZXREZXNjZW5kYW50Rm9jdXNhYmlsaXR5KEZPQ1VTX0FGVEVSX0RFU0NFTkRBTlRTKTsKICAgICAgICAgc2V0V2lsbE5vdERyYXcoZmFsc2UpOwpAQCAtMjA3LDggKzE5OSw2IEBACiAgICAgICAgIG1Ub3VjaFNsb3AgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZFRvdWNoU2xvcCgpOwogICAgICAgICBtTWluaW11bVZlbG9jaXR5ID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRNaW5pbXVtRmxpbmdWZWxvY2l0eSgpOwogICAgICAgICBtTWF4aW11bVZlbG9jaXR5ID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRNYXhpbXVtRmxpbmdWZWxvY2l0eSgpOwotICAgICAgICBtT3ZlcnNjcm9sbERpc3RhbmNlID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRPdmVyc2Nyb2xsRGlzdGFuY2UoKTsKLSAgICAgICAgbU92ZXJmbGluZ0Rpc3RhbmNlID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRPdmVyZmxpbmdEaXN0YW5jZSgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjYwLDIwICsyNTAsMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIFNjcm9sbFZpZXcncyBjb250ZW50IGlzIHN0cmV0Y2hlZCB0byBmaWxsIHRoZSB2aWV3cG9ydC4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIEhvcml6b250YWxTY3JvbGxWaWV3J3MgY29udGVudCBpcyBzdHJldGNoZWQgdG8KKyAgICAgKiBmaWxsIHRoZSB2aWV3cG9ydC4KICAgICAgKgogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29udGVudCBmaWxscyB0aGUgdmlld3BvcnQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0hvcml6b250YWxTY3JvbGxWaWV3X2ZpbGxWaWV3cG9ydAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRmlsbFZpZXdwb3J0KCkgewogICAgICAgICByZXR1cm4gbUZpbGxWaWV3cG9ydDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgdGhpcyBTY3JvbGxWaWV3IHdoZXRoZXIgaXQgc2hvdWxkIHN0cmV0Y2ggaXRzIGNvbnRlbnQgd2lkdGggdG8gZmlsbAotICAgICAqIHRoZSB2aWV3cG9ydCBvciBub3QuCisgICAgICogSW5kaWNhdGVzIHRoaXMgSG9yaXpvbnRhbFNjcm9sbFZpZXcgd2hldGhlciBpdCBzaG91bGQgc3RyZXRjaCBpdHMgY29udGVudCB3aWR0aAorICAgICAqIHRvIGZpbGwgdGhlIHZpZXdwb3J0IG9yIG5vdC4KICAgICAgKgogICAgICAqIEBwYXJhbSBmaWxsVmlld3BvcnQgVHJ1ZSB0byBzdHJldGNoIHRoZSBjb250ZW50J3Mgd2lkdGggdG8gdGhlIHZpZXdwb3J0J3MKICAgICAgKiAgICAgICAgYm91bmRhcmllcywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIAorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0hvcml6b250YWxTY3JvbGxWaWV3X2ZpbGxWaWV3cG9ydAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZpbGxWaWV3cG9ydChib29sZWFuIGZpbGxWaWV3cG9ydCkgewogICAgICAgICBpZiAoZmlsbFZpZXdwb3J0ICE9IG1GaWxsVmlld3BvcnQpIHsKQEAgLTQ2OCw5ICs0NjMsNiBAQAogICAgICAgICAgICAgICAgIC8qIFJlbGVhc2UgdGhlIGRyYWcgKi8KICAgICAgICAgICAgICAgICBtSXNCZWluZ0RyYWdnZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOwotICAgICAgICAgICAgICAgIGlmIChtU2Nyb2xsZXIuc3ByaW5nYmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsIGdldFNjcm9sbFJhbmdlKCksIDAsIDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQOgogICAgICAgICAgICAgICAgIG9uU2Vjb25kYXJ5UG9pbnRlclVwKGV2KTsKQEAgLTUwMyw3ICs0OTUsOSBAQAogICAgICAgICBzd2l0Y2ggKGFjdGlvbiAmIE1vdGlvbkV2ZW50LkFDVElPTl9NQVNLKSB7CiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOiB7CiAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgeCA9IGV2LmdldFgoKTsKLSAgICAgICAgICAgICAgICBtSXNCZWluZ0RyYWdnZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmICghKG1Jc0JlaW5nRHJhZ2dlZCA9IGluQ2hpbGQoKGludCkgeCwgKGludCkgZXYuZ2V0WSgpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogSWYgYmVpbmcgZmxpbmdlZCBhbmQgdXNlciB0b3VjaGVzLCBzdG9wIHRoZSBmbGluZy4gaXNGaW5pc2hlZApAQCAtNTI2LDI2ICs1MjAsNyBAQAogICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZGVsdGFYID0gKGludCkgKG1MYXN0TW90aW9uWCAtIHgpOwogICAgICAgICAgICAgICAgICAgICBtTGFzdE1vdGlvblggPSB4OwogCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBvbGRYID0gbVNjcm9sbFg7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBvbGRZID0gbVNjcm9sbFk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCByYW5nZSA9IGdldFNjcm9sbFJhbmdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdmVyc2Nyb2xsQnkoZGVsdGFYLCAwLCBtU2Nyb2xsWCwgMCwgcmFuZ2UsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU92ZXJzY3JvbGxEaXN0YW5jZSwgMCwgdHJ1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJyZWFrIG91ciB2ZWxvY2l0eSBpZiB3ZSBoaXQgYSBzY3JvbGwgYmFycmllci4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQobVNjcm9sbFgsIG1TY3JvbGxZLCBvbGRYLCBvbGRZKTsKLQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb3ZlcnNjcm9sbE1vZGUgPSBnZXRPdmVyc2Nyb2xsTW9kZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9BTFdBWVMgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMgJiYgcmFuZ2UgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHB1bGxlZFRvWCA9IG9sZFggKyBkZWx0YVg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHVsbGVkVG9YIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0xlZnQub25QdWxsKChmbG9hdCkgZGVsdGFYIC8gZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHB1bGxlZFRvWCA+IHJhbmdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQub25QdWxsKChmbG9hdCkgZGVsdGFYIC8gZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQnkoZGVsdGFYLCAwKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDoKQEAgLTU1NCwxNSArNTI5LDggQEAKICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlUcmFja2VyLmNvbXB1dGVDdXJyZW50VmVsb2NpdHkoMTAwMCwgbU1heGltdW1WZWxvY2l0eSk7CiAgICAgICAgICAgICAgICAgICAgIGludCBpbml0aWFsVmVsb2NpdHkgPSAoaW50KSB2ZWxvY2l0eVRyYWNrZXIuZ2V0WFZlbG9jaXR5KG1BY3RpdmVQb2ludGVySWQpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChnZXRDaGlsZENvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKE1hdGguYWJzKGluaXRpYWxWZWxvY2l0eSkgPiBtTWluaW11bVZlbG9jaXR5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaW5nKC1pbml0aWFsVmVsb2NpdHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmlnaHQgPSBnZXRTY3JvbGxSYW5nZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2Nyb2xsZXIuc3ByaW5nYmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsIHJpZ2h0LCAwLCAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0Q2hpbGRDb3VudCgpID4gMCAmJiBNYXRoLmFicyhpbml0aWFsVmVsb2NpdHkpID4gbU1pbmltdW1WZWxvY2l0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxpbmcoLWluaXRpYWxWZWxvY2l0eSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7CkBAIC01NzIsMjcgKzU0MCwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobUVkZ2VHbG93TGVmdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dMZWZ0Lm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6CiAgICAgICAgICAgICAgICAgaWYgKG1Jc0JlaW5nRHJhZ2dlZCAmJiBnZXRDaGlsZENvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU2Nyb2xsZXIuc3ByaW5nYmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsIGdldFNjcm9sbFJhbmdlKCksIDAsIDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUjsKICAgICAgICAgICAgICAgICAgICAgbUlzQmVpbmdEcmFnZ2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd0xlZnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93TGVmdC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0Lm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUDoKQEAgLTYxOSwyOCArNTc2LDEyIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25PdmVyc2Nyb2xsZWQoaW50IHNjcm9sbFgsIGludCBzY3JvbGxZLAotICAgICAgICAgICAgYm9vbGVhbiBjbGFtcGVkWCwgYm9vbGVhbiBjbGFtcGVkWSkgewotICAgICAgICAvLyBUcmVhdCBhbmltYXRpbmcgc2Nyb2xscyBkaWZmZXJlbnRseTsgc2VlICNjb21wdXRlU2Nyb2xsKCkgZm9yIHdoeS4KLSAgICAgICAgaWYgKCFtU2Nyb2xsZXIuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICBtU2Nyb2xsWCA9IHNjcm9sbFg7Ci0gICAgICAgICAgICBtU2Nyb2xsWSA9IHNjcm9sbFk7Ci0gICAgICAgICAgICBpZiAoY2xhbXBlZFgpIHsKLSAgICAgICAgICAgICAgICBtU2Nyb2xsZXIuc3ByaW5nYmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsIGdldFNjcm9sbFJhbmdlKCksIDAsIDApOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIuc2Nyb2xsVG8oc2Nyb2xsWCwgc2Nyb2xsWSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXdha2VuU2Nyb2xsQmFycygpOwotICAgIH0KLQogICAgIHByaXZhdGUgaW50IGdldFNjcm9sbFJhbmdlKCkgewogICAgICAgICBpbnQgc2Nyb2xsUmFuZ2UgPSAwOwogICAgICAgICBpZiAoZ2V0Q2hpbGRDb3VudCgpID4gMCkgewogICAgICAgICAgICAgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoMCk7CiAgICAgICAgICAgICBzY3JvbGxSYW5nZSA9IE1hdGgubWF4KDAsCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldFdpZHRoKCkgLSAoZ2V0V2lkdGgoKSAtIG1QYWRkaW5nTGVmdCAtIG1QYWRkaW5nUmlnaHQpKTsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0V2lkdGgoKSAtIGdldFdpZHRoKCkgLSBtUGFkZGluZ0xlZnQgLSBtUGFkZGluZ1JpZ2h0KTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc2Nyb2xsUmFuZ2U7CiAgICAgfQpAQCAtMTAxNywxNiArOTU4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBjb250ZW50V2lkdGg7CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGludCBzY3JvbGxSYW5nZSA9IGdldENoaWxkQXQoMCkuZ2V0UmlnaHQoKTsKLSAgICAgICAgZmluYWwgaW50IHNjcm9sbFggPSBtU2Nyb2xsWDsKLSAgICAgICAgZmluYWwgaW50IG92ZXJzY3JvbGxSaWdodCA9IE1hdGgubWF4KDAsIHNjcm9sbFJhbmdlIC0gY29udGVudFdpZHRoKTsKLSAgICAgICAgaWYgKHNjcm9sbFggPCAwKSB7Ci0gICAgICAgICAgICBzY3JvbGxSYW5nZSAtPSBzY3JvbGxYOwotICAgICAgICB9IGVsc2UgaWYgKHNjcm9sbFggPiBvdmVyc2Nyb2xsUmlnaHQpIHsKLSAgICAgICAgICAgIHNjcm9sbFJhbmdlICs9IHNjcm9sbFggLSBvdmVyc2Nyb2xsUmlnaHQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2Nyb2xsUmFuZ2U7CisgICAgICAgIHJldHVybiBnZXRDaGlsZEF0KDApLmdldFJpZ2h0KCk7CiAgICAgfQogICAgIAogICAgIEBPdmVycmlkZQpAQCAtMTA4NywyMCArMTAxOSwxNCBAQAogICAgICAgICAgICAgaW50IHggPSBtU2Nyb2xsZXIuZ2V0Q3VyclgoKTsKICAgICAgICAgICAgIGludCB5ID0gbVNjcm9sbGVyLmdldEN1cnJZKCk7CiAKLSAgICAgICAgICAgIGlmIChvbGRYICE9IHggfHwgb2xkWSAhPSB5KSB7Ci0gICAgICAgICAgICAgICAgb3ZlcnNjcm9sbEJ5KHggLSBvbGRYLCB5IC0gb2xkWSwgb2xkWCwgb2xkWSwgZ2V0U2Nyb2xsUmFuZ2UoKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1PdmVyZmxpbmdEaXN0YW5jZSwgMCwgZmFsc2UpOwotICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOwotCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJhbmdlID0gZ2V0U2Nyb2xsUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb3ZlcnNjcm9sbE1vZGUgPSBnZXRPdmVyc2Nyb2xsTW9kZSgpOwotICAgICAgICAgICAgICAgIGlmIChvdmVyc2Nyb2xsTW9kZSA9PSBPVkVSU0NST0xMX0FMV0FZUyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJTQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTICYmIHJhbmdlID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHggPCAwICYmIG9sZFggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93TGVmdC5vbkFic29yYigoaW50KSBtU2Nyb2xsZXIuZ2V0Q3VyclZlbG9jaXR5KCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHggPiByYW5nZSAmJiBvbGRYIDw9IHJhbmdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dSaWdodC5vbkFic29yYigoaW50KSBtU2Nyb2xsZXIuZ2V0Q3VyclZlbG9jaXR5KCkpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0Q2hpbGRDb3VudCgpID4gMCkgeworICAgICAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KDApOworICAgICAgICAgICAgICAgIHggPSBjbGFtcCh4LCBnZXRXaWR0aCgpIC0gbVBhZGRpbmdSaWdodCAtIG1QYWRkaW5nTGVmdCwgY2hpbGQuZ2V0V2lkdGgoKSk7CisgICAgICAgICAgICAgICAgeSA9IGNsYW1wKHksIGdldEhlaWdodCgpIC0gbVBhZGRpbmdCb3R0b20gLSBtUGFkZGluZ1RvcCwgY2hpbGQuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgIGlmICh4ICE9IG9sZFggfHwgeSAhPSBvbGRZKSB7CisgICAgICAgICAgICAgICAgICAgIG1TY3JvbGxYID0geDsKKyAgICAgICAgICAgICAgICAgICAgbVNjcm9sbFkgPSB5OworICAgICAgICAgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQoeCwgeSwgb2xkWCwgb2xkWSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXdha2VuU2Nyb2xsQmFycygpOwpAQCAtMTMzNyw3ICsxMjYzLDcgQEAKICAgICAgICAgICAgIGludCByaWdodCA9IGdldENoaWxkQXQoMCkuZ2V0V2lkdGgoKTsKICAgICAKICAgICAgICAgICAgIG1TY3JvbGxlci5mbGluZyhtU2Nyb2xsWCwgbVNjcm9sbFksIHZlbG9jaXR5WCwgMCwgMCwgCi0gICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KDAsIHJpZ2h0IC0gd2lkdGgpLCAwLCAwLCB3aWR0aC8yLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoMCwgcmlnaHQgLSB3aWR0aCksIDAsIDApOwogICAgIAogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBtb3ZpbmdSaWdodCA9IHZlbG9jaXR5WCA+IDA7CiAgICAgCkBAIC0xMzc1LDU2ICsxMzAxLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJzY3JvbGxNb2RlKGludCBtb2RlKSB7Ci0gICAgICAgIGlmIChtb2RlICE9IE9WRVJTQ1JPTExfTkVWRVIpIHsKLSAgICAgICAgICAgIGlmIChtRWRnZUdsb3dMZWZ0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGVkZ2UgPSByZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5vdmVyc2Nyb2xsX2VkZ2UpOwotICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGdsb3cgPSByZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5vdmVyc2Nyb2xsX2dsb3cpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd0xlZnQgPSBuZXcgRWRnZUdsb3coZWRnZSwgZ2xvdyk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQgPSBuZXcgRWRnZUdsb3coZWRnZSwgZ2xvdyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRWRnZUdsb3dMZWZ0ID0gbnVsbDsKLSAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5zZXRPdmVyc2Nyb2xsTW9kZShtb2RlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgc3VwZXIuZHJhdyhjYW52YXMpOwotICAgICAgICBpZiAobUVkZ2VHbG93TGVmdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWCA9IG1TY3JvbGxYOwotICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dMZWZ0LmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXN0b3JlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBnZXRIZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUoMjcwKTsKLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC1oZWlnaHQgKiAxLjVmLCBNYXRoLm1pbigwLCBzY3JvbGxYKSk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93TGVmdC5zZXRTaXplKGdldEhlaWdodCgpICogMiwgZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd0xlZnQuZHJhdyhjYW52YXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGdlR2xvd1JpZ2h0LmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXN0b3JlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGdldFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IGdldEhlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgY2FudmFzLnJvdGF0ZSg5MCk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtaGVpZ2h0IC8gMiwgLShNYXRoLm1heChnZXRTY3JvbGxSYW5nZSgpLCBzY3JvbGxYKSArIHdpZHRoKSk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQuc2V0U2l6ZShoZWlnaHQgKiAyLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1JpZ2h0LmRyYXcoY2FudmFzKSkgewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChyZXN0b3JlQ291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBpbnQgY2xhbXAoaW50IG4sIGludCBteSwgaW50IGNoaWxkKSB7CiAgICAgICAgIGlmIChteSA+PSBjaGlsZCB8fCBuIDwgMCkgewogICAgICAgICAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvSW1hZ2VCdXR0b24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9JbWFnZUJ1dHRvbi5qYXZhCmluZGV4IDEyYTY4ZGIuLmQ2ODBmYWQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9JbWFnZUJ1dHRvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9JbWFnZUJ1dHRvbi5qYXZhCkBAIC0zMiw3ICszMiw3IEBACiAgKiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQnV0dG9ufSwgd2l0aCB0aGUgc3RhbmRhcmQgYnV0dG9uIGJhY2tncm91bmQKICAqIHRoYXQgY2hhbmdlcyBjb2xvciBkdXJpbmcgZGlmZmVyZW50IGJ1dHRvbiBzdGF0ZXMuIFRoZSBpbWFnZSBvbiB0aGUgc3VyZmFjZQogICogb2YgdGhlIGJ1dHRvbiBpcyBkZWZpbmVkIGVpdGhlciBieSB0aGUge0Bjb2RlIGFuZHJvaWQ6c3JjfSBhdHRyaWJ1dGUgaW4gdGhlCi0gKiB7QGNvZGUgJmx0O0ltYWdlQnV0dG9uJmd0O30gWE1MIGVsZW1lbnQgb3IgYnkgdGhlIAorICoge0Bjb2RlIDxJbWFnZUJ1dHRvbj59IFhNTCBlbGVtZW50IG9yIGJ5IHRoZQogICoge0BsaW5rICNzZXRJbWFnZVJlc291cmNlKGludCl9IG1ldGhvZC48L3A+CiAgKiAKICAqIDxwPlRvIHJlbW92ZSB0aGUgc3RhbmRhcmQgYnV0dG9uIGJhY2tncm91bmQgaW1hZ2UsIGRlZmluZSB5b3VyIG93biAKQEAgLTU3LDcgKzU3LDcgQEAKICAqIGJhc2VkIG9uIHRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9uIGFuZCB0aGUgY29ycmVzcG9uZGluZyBpbWFnZXMKICAqIGRlZmluZWQgaW4gdGhlIFhNTC48L3A+CiAgKgotICogPHA+VGhlIG9yZGVyIG9mIHRoZSB7QGNvZGUgJmx0O2l0ZW0+fSBlbGVtZW50cyBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGV5IGFyZQorICogPHA+VGhlIG9yZGVyIG9mIHRoZSB7QGNvZGUgPGl0ZW0+fSBlbGVtZW50cyBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGV5IGFyZQogICogZXZhbHVhdGVkIGluIG9yZGVyLiBUaGlzIGlzIHdoeSB0aGUgIm5vcm1hbCIgYnV0dG9uIGltYWdlIGNvbWVzIGxhc3QsIGJlY2F1c2UKICAqIGl0IHdpbGwgb25seSBiZSBhcHBsaWVkIGFmdGVyIHtAY29kZSBhbmRyb2lkOnN0YXRlX3ByZXNzZWR9IGFuZCB7QGNvZGUKICAqIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZH0gaGF2ZSBib3RoIGV2YWx1YXRlZCBmYWxzZS48L3A+CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0LmphdmEKaW5kZXggZmFmMDgyZC4uMWU1NDg5YSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpbmVhckxheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaW5lYXJMYXlvdXQuamF2YQpAQCAtNDMsNiArNDMsMTMgQEAKICAqIDxwPgogICogQWxzbyBzZWUge0BsaW5rIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0LkxheW91dFBhcmFtc30KICAqIGZvciBsYXlvdXQgYXR0cmlidXRlcyA8L3A+CisgKgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X2Jhc2VsaW5lQWxpZ25lZAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X2Jhc2VsaW5lQWxpZ25lZENoaWxkSW5kZXgKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpbmVhckxheW91dF9ncmF2aXR5CisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaW5lYXJMYXlvdXRfbWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpbmVhckxheW91dF9vcmllbnRhdGlvbgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X3dlaWdodFN1bQogICovCiBAUmVtb3RlVmlldwogcHVibGljIGNsYXNzIExpbmVhckxheW91dCBleHRlbmRzIFZpZXdHcm91cCB7CkBAIC0xMTcsNyArMTI0LDExIEBACiAgICAgfQogCiAgICAgcHVibGljIExpbmVhckxheW91dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTGluZWFyTGF5b3V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKIAogICAgICAgICBUeXBlZEFycmF5IGEgPSAKICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTGluZWFyTGF5b3V0KTsKQEAgLTE0Miw4ICsxNTMsNyBAQAogICAgICAgICBtQmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleCA9CiAgICAgICAgICAgICAgICAgYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTGluZWFyTGF5b3V0X2Jhc2VsaW5lQWxpZ25lZENoaWxkSW5kZXgsIC0xKTsKIAotICAgICAgICAvLyBUT0RPOiBCZXR0ZXIgbmFtZSwgYWRkIEphdmEgQVBJcywgbWFrZSBpdCBwdWJsaWMKLSAgICAgICAgbVVzZUxhcmdlc3RDaGlsZCA9IGEuZ2V0Qm9vbGVhbihSLnN0eWxlYWJsZS5MaW5lYXJMYXlvdXRfdXNlTGFyZ2VzdENoaWxkLCBmYWxzZSk7CisgICAgICAgIG1Vc2VMYXJnZXN0Q2hpbGQgPSBhLmdldEJvb2xlYW4oUi5zdHlsZWFibGUuTGluZWFyTGF5b3V0X21lYXN1cmVXaXRoTGFyZ2VzdENoaWxkLCBmYWxzZSk7CiAKICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgfQpAQCAtMTcyLDYgKzE4MiwzMyBAQAogICAgICAgICBtQmFzZWxpbmVBbGlnbmVkID0gYmFzZWxpbmVBbGlnbmVkOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFdoZW4gdHJ1ZSwgYWxsIGNoaWxkcmVuIHdpdGggYSB3ZWlnaHQgd2lsbCBiZSBjb25zaWRlcmVkIGhhdmluZworICAgICAqIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQuIElmIGZhbHNlLCBhbGwgY2hpbGRyZW4gYXJlCisgICAgICogbWVhc3VyZWQgbm9ybWFsbHkuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIHRvIG1lYXN1cmUgY2hpbGRyZW4gd2l0aCBhIHdlaWdodCB1c2luZyB0aGUgbWluaW11bQorICAgICAqICAgICAgICAgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjaGlsZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGRFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gbVVzZUxhcmdlc3RDaGlsZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHNldCB0byB0cnVlLCBhbGwgY2hpbGRyZW4gd2l0aCBhIHdlaWdodCB3aWxsIGJlIGNvbnNpZGVyZWQgaGF2aW5nCisgICAgICogdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjaGlsZC4gSWYgZmFsc2UsIGFsbCBjaGlsZHJlbiBhcmUKKyAgICAgKiBtZWFzdXJlZCBub3JtYWxseS4KKyAgICAgKiAKKyAgICAgKiBEaXNhYmxlZCBieSBkZWZhdWx0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbmFibGVkIFRydWUgdG8gbWVhc3VyZSBjaGlsZHJlbiB3aXRoIGEgd2VpZ2h0IHVzaW5nIHRoZQorICAgICAqICAgICAgICBtaW5pbXVtIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzZXRNZWFzdXJlV2l0aExhcmdlc3RDaGlsZEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1Vc2VMYXJnZXN0Q2hpbGQgPSBlbmFibGVkOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0QmFzZWxpbmUoKSB7CiAgICAgICAgIGlmIChtQmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleCA8IDApIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0UG9wdXBXaW5kb3cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0UG9wdXBXaW5kb3cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjIxNjEyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RQb3B1cFdpbmRvdy5qYXZhCkBAIC0wLDAgKzEsMTIzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1BhcmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PblRvdWNoTGlzdGVuZXI7CisKKy8qKgorICogQSBMaXN0UG9wdXBXaW5kb3cgYW5jaG9ycyBpdHNlbGYgdG8gYSBob3N0IHZpZXcgYW5kIGRpc3BsYXlzIGEKKyAqIGxpc3Qgb2YgY2hvaWNlcy4KKyAqIAorICogPHA+TGlzdFBvcHVwV2luZG93IGNvbnRhaW5zIGEgbnVtYmVyIG9mIHRyaWNreSBiZWhhdmlvcnMgc3Vycm91bmRpbmcKKyAqIHBvc2l0aW9uaW5nLCBzY3JvbGxpbmcgcGFyZW50cyB0byBmaXQgdGhlIGRyb3Bkb3duLCBpbnRlcmFjdGluZworICogc2FuZWx5IHdpdGggdGhlIElNRSBpZiBwcmVzZW50LCBhbmQgb3RoZXJzLgorICogCisgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3CisgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LlNwaW5uZXIKKyAqLworcHVibGljIGNsYXNzIExpc3RQb3B1cFdpbmRvdyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJMaXN0UG9wdXBXaW5kb3ciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFRoaXMgdmFsdWUgY29udHJvbHMgdGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIHVzZXIKKyAgICAgKiBtdXN0IGxlYXZlIGEgcG9pbnRlciBkb3duIHdpdGhvdXQgc2Nyb2xsaW5nIHRvIGV4cGFuZAorICAgICAqIHRoZSBhdXRvY29tcGxldGUgZHJvcGRvd24gbGlzdCB0byBjb3ZlciB0aGUgSU1FLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfTElTVF9USU1FT1VUID0gMjUwOworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgUG9wdXBXaW5kb3cgbVBvcHVwOworICAgIHByaXZhdGUgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgcHJpdmF0ZSBEcm9wRG93bkxpc3RWaWV3IG1Ecm9wRG93bkxpc3Q7CisKKyAgICBwcml2YXRlIGludCBtRHJvcERvd25IZWlnaHQgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVDsKKyAgICBwcml2YXRlIGludCBtRHJvcERvd25XaWR0aCA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOworICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQ7CisgICAgcHJpdmF0ZSBpbnQgbURyb3BEb3duVmVydGljYWxPZmZzZXQ7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbURyb3BEb3duQWx3YXlzVmlzaWJsZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtRm9yY2VJZ25vcmVPdXRzaWRlVG91Y2ggPSBmYWxzZTsKKworICAgIHByaXZhdGUgVmlldyBtUHJvbXB0VmlldzsKKyAgICBwcml2YXRlIGludCBtUHJvbXB0UG9zaXRpb24gPSBQT1NJVElPTl9QUk9NUFRfQUJPVkU7CisKKyAgICBwcml2YXRlIERhdGFTZXRPYnNlcnZlciBtT2JzZXJ2ZXI7CisKKyAgICBwcml2YXRlIFZpZXcgbURyb3BEb3duQW5jaG9yVmlldzsKKworICAgIHByaXZhdGUgRHJhd2FibGUgbURyb3BEb3duTGlzdEhpZ2hsaWdodDsKKworICAgIHByaXZhdGUgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciBtSXRlbUNsaWNrTGlzdGVuZXI7CisgICAgcHJpdmF0ZSBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyIG1JdGVtU2VsZWN0ZWRMaXN0ZW5lcjsKKworICAgIHByaXZhdGUgZmluYWwgUmVzaXplUG9wdXBSdW5uYWJsZSBtUmVzaXplUG9wdXBSdW5uYWJsZSA9IG5ldyBSZXNpemVQb3B1cFJ1bm5hYmxlKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBQb3B1cFRvdWNoSW50ZXJjZXB0b3IgbVRvdWNoSW50ZXJjZXB0b3IgPSBuZXcgUG9wdXBUb3VjaEludGVyY2VwdG9yKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBQb3B1cFNjcm9sbExpc3RlbmVyIG1TY3JvbGxMaXN0ZW5lciA9IG5ldyBQb3B1cFNjcm9sbExpc3RlbmVyKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0U2VsZWN0b3JIaWRlciBtSGlkZVNlbGVjdG9yID0gbmV3IExpc3RTZWxlY3RvckhpZGVyKCk7CisgICAgcHJpdmF0ZSBSdW5uYWJsZSBtU2hvd0Ryb3BEb3duUnVubmFibGU7CisKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworCisgICAgcHJpdmF0ZSBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbU1vZGFsOworCisgICAgLyoqCisgICAgICogVGhlIHByb3ZpZGVkIHByb21wdCB2aWV3IHNob3VsZCBhcHBlYXIgYWJvdmUgbGlzdCBjb250ZW50LgorICAgICAqIAorICAgICAqIEBzZWUgI3NldFByb21wdFBvc2l0aW9uKGludCkKKyAgICAgKiBAc2VlICNnZXRQcm9tcHRQb3NpdGlvbigpCisgICAgICogQHNlZSAjc2V0UHJvbXB0VmlldyhWaWV3KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU0lUSU9OX1BST01QVF9BQk9WRSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvdmlkZWQgcHJvbXB0IHZpZXcgc2hvdWxkIGFwcGVhciBiZWxvdyBsaXN0IGNvbnRlbnQuCisgICAgICogCisgICAgICogQHNlZSAjc2V0UHJvbXB0UG9zaXRpb24oaW50KQorICAgICAqIEBzZWUgI2dldFByb21wdFBvc2l0aW9uKCkKKyAgICAgKiBAc2VlICNzZXRQcm9tcHRWaWV3KFZpZXcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TSVRJT05fUFJPTVBUX0JFTE9XID0gMTsKKworICAgIC8qKgorICAgICAqIEFsaWFzIGZvciB7QGxpbmsgVmlld0dyb3VwLkxheW91dFBhcmFtcyNNQVRDSF9QQVJFTlR9LgorICAgICAqIElmIHVzZWQgdG8gc3BlY2lmeSBhIHBvcHVwIHdpZHRoLCB0aGUgcG9wdXAgd2lsbCBtYXRjaCB0aGUgd2lkdGggb2YgdGhlIGFuY2hvciB2aWV3LgorICAgICAqIElmIHVzZWQgdG8gc3BlY2lmeSBhIHBvcHVwIGhlaWdodCwgdGhlIHBvcHVwIHdpbGwgZmlsbCBhdmFpbGFibGUgc3BhY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFUQ0hfUEFSRU5UID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgCisgICAgLyoqCisgICAgICogQWxpYXMgZm9yIHtAbGluayBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zI1dSQVBfQ09OVEVOVH0uCisgICAgICogSWYgdXNlZCB0byBzcGVjaWZ5IGEgcG9wdXAgd2lkdGgsIHRoZSBwb3B1cCB3aWxsIHVzZSB0aGUgd2lkdGggb2YgaXRzIGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1JBUF9DT05URU5UID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7CisgICAgCisgICAgLyoqCisgICAgICogTW9kZSBmb3Ige0BsaW5rICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KX06IHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZQorICAgICAqIGlucHV0IG1ldGhvZCBzaG91bGQgYmUgYmFzZWQgb24gdGhlIGZvY3VzYWJpbGl0eSBvZiB0aGUgcG9wdXAuICBUaGF0IGlzCisgICAgICogaWYgaXQgaXMgZm9jdXNhYmxlIHRoYW4gaXQgbmVlZHMgdG8gd29yayB3aXRoIHRoZSBpbnB1dCBtZXRob2QsIGVsc2UKKyAgICAgKiBpdCBkb2Vzbid0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUX01FVEhPRF9GUk9NX0ZPQ1VTQUJMRSA9IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9GUk9NX0ZPQ1VTQUJMRTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBNb2RlIGZvciB7QGxpbmsgI3NldElucHV0TWV0aG9kTW9kZShpbnQpfTogdGhpcyBwb3B1cCBhbHdheXMgbmVlZHMgdG8KKyAgICAgKiB3b3JrIHdpdGggYW4gaW5wdXQgbWV0aG9kLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgZm9jdXNhYmxlLiAgVGhpcworICAgICAqIG1lYW5zIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgZGlzcGxheWVkIHNvIHRoYXQgdGhlIHVzZXIgY2FuIGFsc28gb3BlcmF0ZQorICAgICAqIHRoZSBpbnB1dCBtZXRob2Qgd2hpbGUgaXQgaXMgc2hvd24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5QVVRfTUVUSE9EX05FRURFRCA9IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9ORUVERUQ7CisgICAgCisgICAgLyoqCisgICAgICogTW9kZSBmb3Ige0BsaW5rICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KX06IHRoaXMgcG9wdXAgbmV2ZXIgbmVlZHMgdG8KKyAgICAgKiB3b3JrIHdpdGggYW4gaW5wdXQgbWV0aG9kLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgZm9jdXNhYmxlLiAgVGhpcworICAgICAqIG1lYW5zIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgZGlzcGxheWVkIHRvIHVzZSBhcyBtdWNoIHNwYWNlIG9uIHRoZQorICAgICAqIHNjcmVlbiBhcyBuZWVkZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIGNvdmVycyB0aGUgaW5wdXQgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUX01FVEhPRF9OT1RfTkVFREVEID0gUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcsIGVtcHR5IHBvcHVwIHdpbmRvdyBjYXBhYmxlIG9mIGRpc3BsYXlpbmcgaXRlbXMgZnJvbSBhIExpc3RBZGFwdGVyLgorICAgICAqIEJhY2tncm91bmRzIHNob3VsZCBiZSBzZXQgdXNpbmcge0BsaW5rICNzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHVzZWQgZm9yIGNvbnRhaW5lZCB2aWV3cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwsIDAsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldywgZW1wdHkgcG9wdXAgd2luZG93IGNhcGFibGUgb2YgZGlzcGxheWluZyBpdGVtcyBmcm9tIGEgTGlzdEFkYXB0ZXIuCisgICAgICogQmFja2dyb3VuZHMgc2hvdWxkIGJlIHNldCB1c2luZyB7QGxpbmsgI3NldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdXNlZCBmb3IgY29udGFpbmVkIHZpZXdzLgorICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIGZyb20gaW5mbGF0aW5nIHBhcmVudCB2aWV3cyB1c2VkIHRvIHN0eWxlIHRoZSBwb3B1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5saXN0UG9wdXBXaW5kb3dTdHlsZSwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3LCBlbXB0eSBwb3B1cCB3aW5kb3cgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIGl0ZW1zIGZyb20gYSBMaXN0QWRhcHRlci4KKyAgICAgKiBCYWNrZ3JvdW5kcyBzaG91bGQgYmUgc2V0IHVzaW5nIHtAbGluayAjc2V0QmFja2dyb3VuZERyYXdhYmxlKERyYXdhYmxlKX0uCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB1c2VkIGZvciBjb250YWluZWQgdmlld3MuCisgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgZnJvbSBpbmZsYXRpbmcgcGFyZW50IHZpZXdzIHVzZWQgdG8gc3R5bGUgdGhlIHBvcHVwLgorICAgICAqIEBwYXJhbSBkZWZTdHlsZUF0dHIgRGVmYXVsdCBzdHlsZSBhdHRyaWJ1dGUgdG8gdXNlIGZvciBwb3B1cCBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0UG9wdXBXaW5kb3coQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcsIGVtcHR5IHBvcHVwIHdpbmRvdyBjYXBhYmxlIG9mIGRpc3BsYXlpbmcgaXRlbXMgZnJvbSBhIExpc3RBZGFwdGVyLgorICAgICAqIEJhY2tncm91bmRzIHNob3VsZCBiZSBzZXQgdXNpbmcge0BsaW5rICNzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHVzZWQgZm9yIGNvbnRhaW5lZCB2aWV3cy4KKyAgICAgKiBAcGFyYW0gYXR0cnMgQXR0cmlidXRlcyBmcm9tIGluZmxhdGluZyBwYXJlbnQgdmlld3MgdXNlZCB0byBzdHlsZSB0aGUgcG9wdXAuCisgICAgICogQHBhcmFtIGRlZlN0eWxlQXR0ciBTdHlsZSBhdHRyaWJ1dGUgdG8gcmVhZCBmb3IgZGVmYXVsdCBzdHlsaW5nIG9mIHBvcHVwIGNvbnRlbnQuCisgICAgICogQHBhcmFtIGRlZlN0eWxlUmVzIFN0eWxlIHJlc291cmNlIElEIHRvIHVzZSBmb3IgZGVmYXVsdCBzdHlsaW5nIG9mIHBvcHVwIGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIExpc3RQb3B1cFdpbmRvdyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbVBvcHVwID0gbmV3IFBvcHVwV2luZG93KGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhZGFwdGVyIHRoYXQgcHJvdmlkZXMgdGhlIGRhdGEgYW5kIHRoZSB2aWV3cyB0byByZXByZXNlbnQgdGhlIGRhdGEKKyAgICAgKiBpbiB0aGlzIHBvcHVwIHdpbmRvdy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBhZGFwdGVyIHRvIHVzZSB0byBjcmVhdGUgdGhpcyB3aW5kb3cncyBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoTGlzdEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBpZiAobU9ic2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1PYnNlcnZlciA9IG5ldyBQb3B1cERhdGFTZXRPYnNlcnZlcigpOworICAgICAgICB9IGVsc2UgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BZGFwdGVyLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobU9ic2VydmVyKTsKKyAgICAgICAgfQorICAgICAgICBtQWRhcHRlciA9IGFkYXB0ZXI7CisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGFwdGVyLnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1PYnNlcnZlcik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtRHJvcERvd25MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0QWRhcHRlcihtQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hlcmUgdGhlIG9wdGlvbmFsIHByb21wdCB2aWV3IHNob3VsZCBhcHBlYXIuIFRoZSBkZWZhdWx0IGlzCisgICAgICoge0BsaW5rICNQT1NJVElPTl9QUk9NUFRfQUJPVkV9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBBIHBvc2l0aW9uIGNvbnN0YW50IGRlY2xhcmluZyB3aGVyZSB0aGUgcHJvbXB0IHNob3VsZCBiZSBkaXNwbGF5ZWQuCisgICAgICogCisgICAgICogQHNlZSAjUE9TSVRJT05fUFJPTVBUX0FCT1ZFCisgICAgICogQHNlZSAjUE9TSVRJT05fUFJPTVBUX0JFTE9XCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvbXB0UG9zaXRpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIG1Qcm9tcHRQb3NpdGlvbiA9IHBvc2l0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gV2hlcmUgdGhlIG9wdGlvbmFsIHByb21wdCB2aWV3IHNob3VsZCBhcHBlYXIuCisgICAgICogCisgICAgICogQHNlZSAjUE9TSVRJT05fUFJPTVBUX0FCT1ZFCisgICAgICogQHNlZSAjUE9TSVRJT05fUFJPTVBUX0JFTE9XCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQcm9tcHRQb3NpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9tcHRQb3NpdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0aGlzIHdpbmRvdyBzaG91bGQgYmUgbW9kYWwgd2hlbiBzaG93bi4KKyAgICAgKiAKKyAgICAgKiA8cD5JZiBhIHBvcHVwIHdpbmRvdyBpcyBtb2RhbCwgaXQgd2lsbCByZWNlaXZlIGFsbCB0b3VjaCBhbmQga2V5IGlucHV0LgorICAgICAqIElmIHRoZSB1c2VyIHRvdWNoZXMgb3V0c2lkZSB0aGUgcG9wdXAgd2luZG93J3MgY29udGVudCBhcmVhIHRoZSBwb3B1cCB3aW5kb3cKKyAgICAgKiB3aWxsIGJlIGRpc21pc3NlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbW9kYWwge0Bjb2RlIHRydWV9IGlmIHRoZSBwb3B1cCB3aW5kb3cgc2hvdWxkIGJlIG1vZGFsLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb2RhbChib29sZWFuIG1vZGFsKSB7CisgICAgICAgIG1Nb2RhbCA9IHRydWU7CisgICAgICAgIG1Qb3B1cC5zZXRGb2N1c2FibGUobW9kYWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcG9wdXAgd2luZG93IHdpbGwgYmUgbW9kYWwgd2hlbiBzaG93bi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcG9wdXAgd2luZG93IHdpbGwgYmUgbW9kYWwsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTW9kYWwoKSB7CisgICAgICAgIHJldHVybiBtTW9kYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yY2VzIG91dHNpZGUgdG91Y2hlcyB0byBiZSBpZ25vcmVkLiBOb3JtYWxseSBpZiB7QGxpbmsgI2lzRHJvcERvd25BbHdheXNWaXNpYmxlKCl9IGlzCisgICAgICogZmFsc2UsIHdlIGFsbG93IG91dHNpZGUgdG91Y2ggdG8gZGlzbWlzcyB0aGUgZHJvcGRvd24uIElmIHRoaXMgaXMgc2V0IHRvIHRydWUsIHRoZW4gd2UKKyAgICAgKiBpZ25vcmUgb3V0c2lkZSB0b3VjaCBldmVuIHdoZW4gdGhlIGRyb3AgZG93biBpcyBub3Qgc2V0IHRvIGFsd2F5cyB2aXNpYmxlLgorICAgICAqIAorICAgICAqIEBoaWRlIFVzZWQgb25seSBieSBBdXRvQ29tcGxldGVUZXh0VmlldyB0byBoYW5kbGUgc29tZSBpbnRlcm5hbCBzcGVjaWFsIGNhc2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlSWdub3JlT3V0c2lkZVRvdWNoKGJvb2xlYW4gZm9yY2VJZ25vcmVPdXRzaWRlVG91Y2gpIHsKKyAgICAgICAgbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoID0gZm9yY2VJZ25vcmVPdXRzaWRlVG91Y2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRoZSBkcm9wLWRvd24gc2hvdWxkIHJlbWFpbiB2aXNpYmxlIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucy4KKyAgICAgKgorICAgICAqIFRoZSBkcm9wLWRvd24gd2lsbCBvY2N1cHkgdGhlIGVudGlyZSBzY3JlZW4gYmVsb3cge0BsaW5rICNnZXRBbmNob3JWaWV3fSByZWdhcmRsZXNzCisgICAgICogb2YgdGhlIHNpemUgb3IgY29udGVudCBvZiB0aGUgbGlzdC4gIHtAbGluayAjZ2V0QmFja2dyb3VuZCgpfSB3aWxsIGZpbGwgYW55IHNwYWNlCisgICAgICogdGhhdCBpcyBub3QgdXNlZCBieSB0aGUgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkcm9wRG93bkFsd2F5c1Zpc2libGUgV2hldGhlciB0byBrZWVwIHRoZSBkcm9wLWRvd24gdmlzaWJsZS4KKyAgICAgKgorICAgICAqIEBoaWRlIE9ubHkgdXNlZCBieSBBdXRvQ29tcGxldGVUZXh0VmlldyB1bmRlciBzcGVjaWFsIGNvbmRpdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25BbHdheXNWaXNpYmxlKGJvb2xlYW4gZHJvcERvd25BbHdheXNWaXNpYmxlKSB7CisgICAgICAgIG1Ecm9wRG93bkFsd2F5c1Zpc2libGUgPSBkcm9wRG93bkFsd2F5c1Zpc2libGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBXaGV0aGVyIHRoZSBkcm9wLWRvd24gaXMgdmlzaWJsZSB1bmRlciBzcGVjaWFsIGNvbmRpdGlvbnMuCisgICAgICoKKyAgICAgKiBAaGlkZSBPbmx5IHVzZWQgYnkgQXV0b0NvbXBsZXRlVGV4dFZpZXcgdW5kZXIgc3BlY2lhbCBjb25kaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duQWx3YXlzVmlzaWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvcGVyYXRpbmcgbW9kZSBmb3IgdGhlIHNvZnQgaW5wdXQgYXJlYS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBkZXNpcmVkIG1vZGUsIHNlZQorICAgICAqICAgICAgICB7QGxpbmsgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zI3NvZnRJbnB1dE1vZGV9CisgICAgICogICAgICAgIGZvciB0aGUgZnVsbCBsaXN0CisgICAgICoKKyAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyNzb2Z0SW5wdXRNb2RlCisgICAgICogQHNlZSAjZ2V0U29mdElucHV0TW9kZSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U29mdElucHV0TW9kZShpbnQgbW9kZSkgeworICAgICAgICBtUG9wdXAuc2V0U29mdElucHV0TW9kZShtb2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIGluIHtAbGluayAjc2V0U29mdElucHV0TW9kZShpbnQpfS4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldFNvZnRJbnB1dE1vZGUoaW50KQorICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zI3NvZnRJbnB1dE1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNvZnRJbnB1dE1vZGUoKSB7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0U29mdElucHV0TW9kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBkcmF3YWJsZSB0byB1c2UgYXMgdGhlIGxpc3QgaXRlbSBzZWxlY3Rvci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgTGlzdCBzZWxlY3RvciBkcmF3YWJsZSB0byB1c2UgaW4gdGhlIHBvcHVwLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpc3RTZWxlY3RvcihEcmF3YWJsZSBzZWxlY3RvcikgeworICAgICAgICBtRHJvcERvd25MaXN0SGlnaGxpZ2h0ID0gc2VsZWN0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgYmFja2dyb3VuZCBkcmF3YWJsZSBmb3IgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRHJhd2FibGUgZ2V0QmFja2dyb3VuZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRCYWNrZ3JvdW5kKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIGRyYXdhYmxlIHRvIGJlIHRoZSBiYWNrZ3JvdW5kIGZvciB0aGUgcG9wdXAgd2luZG93LgorICAgICAqIAorICAgICAqIEBwYXJhbSBkIEEgZHJhd2FibGUgdG8gc2V0IGFzIHRoZSBiYWNrZ3JvdW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSBkKSB7CisgICAgICAgIG1Qb3B1cC5zZXRCYWNrZ3JvdW5kRHJhd2FibGUoZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGFuIGFuaW1hdGlvbiBzdHlsZSB0byB1c2Ugd2hlbiB0aGUgcG9wdXAgd2luZG93IGlzIHNob3duIG9yIGRpc21pc3NlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYW5pbWF0aW9uU3R5bGUgQW5pbWF0aW9uIHN0eWxlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbmltYXRpb25TdHlsZShpbnQgYW5pbWF0aW9uU3R5bGUpIHsKKyAgICAgICAgbVBvcHVwLnNldEFuaW1hdGlvblN0eWxlKGFuaW1hdGlvblN0eWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbmltYXRpb24gc3R5bGUgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB0aGUgcG9wdXAgd2luZG93IGlzCisgICAgICogc2hvd24gb3IgZGlzbWlzc2VkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gQW5pbWF0aW9uIHN0eWxlIHRoYXQgd2lsbCBiZSB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QW5pbWF0aW9uU3R5bGUoKSB7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0QW5pbWF0aW9uU3R5bGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2aWV3IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGFuY2hvciB0aGlzIHBvcHVwLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIHBvcHVwJ3MgYW5jaG9yIHZpZXcKKyAgICAgKi8KKyAgICBwdWJsaWMgVmlldyBnZXRBbmNob3JWaWV3KCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duQW5jaG9yVmlldzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwb3B1cCdzIGFuY2hvciB2aWV3LiBUaGlzIHBvcHVwIHdpbGwgYWx3YXlzIGJlIHBvc2l0aW9uZWQgcmVsYXRpdmUgdG8KKyAgICAgKiB0aGUgYW5jaG9yIHZpZXcgd2hlbiBzaG93bi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYW5jaG9yIFRoZSB2aWV3IHRvIHVzZSBhcyBhbiBhbmNob3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QW5jaG9yVmlldyhWaWV3IGFuY2hvcikgeworICAgICAgICBtRHJvcERvd25BbmNob3JWaWV3ID0gYW5jaG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGhvcml6b250YWwgb2Zmc2V0IG9mIHRoZSBwb3B1cCBmcm9tIGl0cyBhbmNob3IgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SG9yaXpvbnRhbE9mZnNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBob3Jpem9udGFsIG9mZnNldCBvZiB0aGlzIHBvcHVwIGZyb20gaXRzIGFuY2hvciB2aWV3IGluIHBpeGVscy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBob3Jpem9udGFsIG9mZnNldCBvZiB0aGUgcG9wdXAgZnJvbSBpdHMgYW5jaG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhvcml6b250YWxPZmZzZXQoaW50IG9mZnNldCkgeworICAgICAgICBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0ID0gb2Zmc2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIHZlcnRpY2FsIG9mZnNldCBvZiB0aGUgcG9wdXAgZnJvbSBpdHMgYW5jaG9yIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFZlcnRpY2FsT2Zmc2V0KCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duVmVydGljYWxPZmZzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2ZXJ0aWNhbCBvZmZzZXQgb2YgdGhpcyBwb3B1cCBmcm9tIGl0cyBhbmNob3IgdmlldyBpbiBwaXhlbHMuCisgICAgICogCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgdmVydGljYWwgb2Zmc2V0IG9mIHRoZSBwb3B1cCBmcm9tIGl0cyBhbmNob3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVydGljYWxPZmZzZXQoaW50IG9mZnNldCkgeworICAgICAgICBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCA9IG9mZnNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB3aWR0aCBvZiB0aGUgcG9wdXAgd2luZG93IGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFdpZHRoKCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duV2lkdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgd2lkdGggb2YgdGhlIHBvcHVwIHdpbmRvdyBpbiBwaXhlbHMuIENhbiBhbHNvIGJlIHtAbGluayAjTUFUQ0hfUEFSRU5UfQorICAgICAqIG9yIHtAbGluayAjV1JBUF9DT05URU5UfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd2lkdGggV2lkdGggb2YgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaWR0aChpbnQgd2lkdGgpIHsKKyAgICAgICAgbURyb3BEb3duV2lkdGggPSB3aWR0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB3aWR0aCBvZiB0aGUgcG9wdXAgd2luZG93IGJ5IHRoZSBzaXplIG9mIGl0cyBjb250ZW50LiBUaGUgZmluYWwgd2lkdGggbWF5IGJlCisgICAgICogbGFyZ2VyIHRvIGFjY29tbW9kYXRlIHN0eWxlZCB3aW5kb3cgZHJlc3NpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2lkdGggRGVzaXJlZCB3aWR0aCBvZiBjb250ZW50IGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50V2lkdGgoaW50IHdpZHRoKSB7CisgICAgICAgIERyYXdhYmxlIHBvcHVwQmFja2dyb3VuZCA9IG1Qb3B1cC5nZXRCYWNrZ3JvdW5kKCk7CisgICAgICAgIGlmIChwb3B1cEJhY2tncm91bmQgIT0gbnVsbCkgeworICAgICAgICAgICAgbURyb3BEb3duV2lkdGggPSBwb3B1cEJhY2tncm91bmQuZ2V0SW50cmluc2ljV2lkdGgoKSArIHdpZHRoOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgaGVpZ2h0IG9mIHRoZSBwb3B1cCB3aW5kb3cgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkgeworICAgICAgICByZXR1cm4gbURyb3BEb3duSGVpZ2h0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGhlaWdodCBvZiB0aGUgcG9wdXAgd2luZG93IGluIHBpeGVscy4gQ2FuIGFsc28gYmUge0BsaW5rICNNQVRDSF9QQVJFTlR9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBoZWlnaHQgSGVpZ2h0IG9mIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCBoZWlnaHQpIHsKKyAgICAgICAgbURyb3BEb3duSGVpZ2h0ID0gaGVpZ2h0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBsaXN0ZW5lciB0byByZWNlaXZlIGV2ZW50cyB3aGVuIGEgbGlzdCBpdGVtIGlzIGNsaWNrZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGNsaWNrTGlzdGVuZXIgTGlzdGVuZXIgdG8gcmVnaXN0ZXIKKyAgICAgKiAKKyAgICAgKiBAc2VlIExpc3RWaWV3I3NldE9uSXRlbUNsaWNrTGlzdGVuZXIoYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPbkl0ZW1DbGlja0xpc3RlbmVyKEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgY2xpY2tMaXN0ZW5lcikgeworICAgICAgICBtSXRlbUNsaWNrTGlzdGVuZXIgPSBjbGlja0xpc3RlbmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBsaXN0ZW5lciB0byByZWNlaXZlIGV2ZW50cyB3aGVuIGEgbGlzdCBpdGVtIGlzIHNlbGVjdGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZWxlY3RlZExpc3RlbmVyIExpc3RlbmVyIHRvIHJlZ2lzdGVyLgorICAgICAqIAorICAgICAqIEBzZWUgTGlzdFZpZXcjc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBzZWxlY3RlZExpc3RlbmVyKSB7CisgICAgICAgIG1JdGVtU2VsZWN0ZWRMaXN0ZW5lciA9IHNlbGVjdGVkTGlzdGVuZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgdmlldyB0byBhY3QgYXMgYSB1c2VyIHByb21wdCBmb3IgdGhpcyBwb3B1cCB3aW5kb3cuIFdoZXJlIHRoZSBwcm9tcHQgdmlldyB3aWxsIGFwcGVhcgorICAgICAqIGlzIGNvbnRyb2xsZWQgYnkge0BsaW5rICNzZXRQcm9tcHRQb3NpdGlvbihpbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvbXB0IFZpZXcgdG8gdXNlIGFzIGFuIGluZm9ybWF0aW9uYWwgcHJvbXB0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb21wdFZpZXcoVmlldyBwcm9tcHQpIHsKKyAgICAgICAgYm9vbGVhbiBzaG93aW5nID0gaXNTaG93aW5nKCk7CisgICAgICAgIGlmIChzaG93aW5nKSB7CisgICAgICAgICAgICByZW1vdmVQcm9tcHRWaWV3KCk7CisgICAgICAgIH0KKyAgICAgICAgbVByb21wdFZpZXcgPSBwcm9tcHQ7CisgICAgICAgIGlmIChzaG93aW5nKSB7CisgICAgICAgICAgICBzaG93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3N0IGEge0BsaW5rICNzaG93KCl9IGNhbGwgdG8gdGhlIFVJIHRocmVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwb3N0U2hvdygpIHsKKyAgICAgICAgbUhhbmRsZXIucG9zdChtU2hvd0Ryb3BEb3duUnVubmFibGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3cgdGhlIHBvcHVwIGxpc3QuIElmIHRoZSBsaXN0IGlzIGFscmVhZHkgc2hvd2luZywgdGhpcyBtZXRob2QKKyAgICAgKiB3aWxsIHJlY2FsY3VsYXRlIHRoZSBwb3B1cCdzIHNpemUgYW5kIHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIGludCBoZWlnaHQgPSBidWlsZERyb3BEb3duKCk7CisKKyAgICAgICAgaW50IHdpZHRoU3BlYyA9IDA7CisgICAgICAgIGludCBoZWlnaHRTcGVjID0gMDsKKworICAgICAgICBib29sZWFuIG5vSW5wdXRNZXRob2QgPSBpc0lucHV0TWV0aG9kTm90TmVlZGVkKCk7CisKKyAgICAgICAgaWYgKG1Qb3B1cC5pc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGNhbGwgdG8gUG9wdXBXaW5kb3cncyB1cGRhdGUgbWV0aG9kIGJlbG93IGNhbiBhY2NlcHQgLTEgZm9yIGFueQorICAgICAgICAgICAgICAgIC8vIHZhbHVlIHlvdSBkbyBub3Qgd2FudCB0byB1cGRhdGUuCisgICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gLTE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7CisgICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gZ2V0QW5jaG9yVmlldygpLmdldFdpZHRoKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IG1Ecm9wRG93bldpZHRoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGNhbGwgdG8gUG9wdXBXaW5kb3cncyB1cGRhdGUgbWV0aG9kIGJlbG93IGNhbiBhY2NlcHQgLTEgZm9yIGFueQorICAgICAgICAgICAgICAgIC8vIHZhbHVlIHlvdSBkbyBub3Qgd2FudCB0byB1cGRhdGUuCisgICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IG5vSW5wdXRNZXRob2QgPyBoZWlnaHQgOiBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKKyAgICAgICAgICAgICAgICBpZiAobm9JbnB1dE1ldGhvZCkgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA6IDAsIDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaW5kb3dMYXlvdXRNb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKKyAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gaGVpZ2h0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gbURyb3BEb3duSGVpZ2h0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUG9wdXAuc2V0T3V0c2lkZVRvdWNoYWJsZSghbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKTsKKworICAgICAgICAgICAgbVBvcHVwLnVwZGF0ZShnZXRBbmNob3JWaWV3KCksIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0LCB3aWR0aFNwZWMsIGhlaWdodFNwZWMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgd2lkdGhTcGVjID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2lkdGgoZ2V0QW5jaG9yVmlldygpLmdldFdpZHRoKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaWR0aChtRHJvcERvd25XaWR0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRIZWlnaHQoaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SGVpZ2h0KG1Ecm9wRG93bkhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSh3aWR0aFNwZWMsIGhlaWdodFNwZWMpOworICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gdXNlIG91dHNpZGUgdG91Y2hhYmxlIHRvIGRpc21pc3MgZHJvcCBkb3duIHdoZW4gdG91Y2hpbmcgb3V0c2lkZSBvZiBpdCwgc28KKyAgICAgICAgICAgIC8vIG9ubHkgc2V0IHRoaXMgaWYgdGhlIGRyb3Bkb3duIGlzIG5vdCBhbHdheXMgdmlzaWJsZQorICAgICAgICAgICAgbVBvcHVwLnNldE91dHNpZGVUb3VjaGFibGUoIW1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSk7CisgICAgICAgICAgICBtUG9wdXAuc2V0VG91Y2hJbnRlcmNlcHRvcihtVG91Y2hJbnRlcmNlcHRvcik7CisgICAgICAgICAgICBtUG9wdXAuc2hvd0FzRHJvcERvd24oZ2V0QW5jaG9yVmlldygpLAorICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0LCBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCk7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFNlbGVjdGlvbihMaXN0Vmlldy5JTlZBTElEX1BPU0lUSU9OKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCFtTW9kYWwgfHwgbURyb3BEb3duTGlzdC5pc0luVG91Y2hNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbU1vZGFsKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdChtSGlkZVNlbGVjdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERpc21pc3MgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCkgeworICAgICAgICBtUG9wdXAuZGlzbWlzcygpOworICAgICAgICByZW1vdmVQcm9tcHRWaWV3KCk7CisgICAgICAgIG1Qb3B1cC5zZXRDb250ZW50VmlldyhudWxsKTsKKyAgICAgICAgbURyb3BEb3duTGlzdCA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSBhIGNhbGxiYWNrIHdoZW4gdGhlIHBvcHVwIGlzIGRpc21pc3NlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBMaXN0ZW5lciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgcG9wdXAgaXMgZGlzbWlzc2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9uRGlzbWlzc0xpc3RlbmVyKFBvcHVwV2luZG93Lk9uRGlzbWlzc0xpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1Qb3B1cC5zZXRPbkRpc21pc3NMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVByb21wdFZpZXcoKSB7CisgICAgICAgIGlmIChtUHJvbXB0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3UGFyZW50IHBhcmVudCA9IG1Qcm9tcHRWaWV3LmdldFBhcmVudCgpOworICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFZpZXdHcm91cCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdHcm91cCBncm91cCA9IChWaWV3R3JvdXApIHBhcmVudDsKKyAgICAgICAgICAgICAgICBncm91cC5yZW1vdmVWaWV3KG1Qcm9tcHRWaWV3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRyb2wgaG93IHRoZSBwb3B1cCBvcGVyYXRlcyB3aXRoIGFuIGlucHV0IG1ldGhvZDogb25lIG9mCisgICAgICoge0BsaW5rICNJTlBVVF9NRVRIT0RfRlJPTV9GT0NVU0FCTEV9LCB7QGxpbmsgI0lOUFVUX01FVEhPRF9ORUVERUR9LAorICAgICAqIG9yIHtAbGluayAjSU5QVVRfTUVUSE9EX05PVF9ORUVERUR9LgorICAgICAqIAorICAgICAqIDxwPklmIHRoZSBwb3B1cCBpcyBzaG93aW5nLCBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgdGFrZSBlZmZlY3Qgb25seQorICAgICAqIHRoZSBuZXh0IHRpbWUgdGhlIHBvcHVwIGlzIHNob3duIG9yIHRocm91Z2ggYSBtYW51YWwgY2FsbCB0byB0aGUge0BsaW5rICNzaG93KCl9CisgICAgICogbWV0aG9kLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNnZXRJbnB1dE1ldGhvZE1vZGUoKQorICAgICAqIEBzZWUgI3Nob3coKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElucHV0TWV0aG9kTW9kZShpbnQgbW9kZSkgeworICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKG1vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBpbiB7QGxpbmsgI3NldElucHV0TWV0aG9kTW9kZShpbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5wdXRNZXRob2RNb2RlKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldElucHV0TWV0aG9kTW9kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2VsZWN0ZWQgcG9zaXRpb24gb2YgdGhlIGxpc3QuCisgICAgICogT25seSB2YWxpZCB3aGVuIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSB0cnVlfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gTGlzdCBwb3NpdGlvbiB0byBzZXQgYXMgc2VsZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBEcm9wRG93bkxpc3RWaWV3IGxpc3QgPSBtRHJvcERvd25MaXN0OworICAgICAgICBpZiAoaXNTaG93aW5nKCkgJiYgbGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBsaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7CisgICAgICAgICAgICBsaXN0LnNldFNlbGVjdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICBpZiAobGlzdC5nZXRDaG9pY2VNb2RlKCkgIT0gTGlzdFZpZXcuQ0hPSUNFX01PREVfTk9ORSkgeworICAgICAgICAgICAgICAgIGxpc3Quc2V0SXRlbUNoZWNrZWQocG9zaXRpb24sIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgYW55IGN1cnJlbnQgbGlzdCBzZWxlY3Rpb24uCisgICAgICogT25seSB2YWxpZCB3aGVuIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSB0cnVlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhckxpc3RTZWxlY3Rpb24oKSB7CisgICAgICAgIGZpbmFsIERyb3BEb3duTGlzdFZpZXcgbGlzdCA9IG1Ecm9wRG93bkxpc3Q7CisgICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFdBUk5JTkc6IFBsZWFzZSByZWFkIHRoZSBjb21tZW50IHdoZXJlIG1MaXN0U2VsZWN0aW9uSGlkZGVuIGlzIGRlY2xhcmVkCisgICAgICAgICAgICBsaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gdHJ1ZTsKKyAgICAgICAgICAgIGxpc3QuaGlkZVNlbGVjdG9yKCk7CisgICAgICAgICAgICBsaXN0LnJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBwb3B1cCBpcyBjdXJyZW50bHkgc2hvd2luZywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmlzU2hvd2luZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgcG9wdXAgaXMgY29uZmlndXJlZCB0byBhc3N1bWUgdGhlIHVzZXIgZG9lcyBub3QgbmVlZAorICAgICAqIHRvIGludGVyYWN0IHdpdGggdGhlIElNRSB3aGlsZSBpdCBpcyBzaG93aW5nLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0lucHV0TWV0aG9kTm90TmVlZGVkKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldElucHV0TWV0aG9kTW9kZSgpID09IElOUFVUX01FVEhPRF9OT1RfTkVFREVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW4gaXRlbSBjbGljayBvcGVyYXRpb24gb24gdGhlIHNwZWNpZmllZCBsaXN0IGFkYXB0ZXIgcG9zaXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIHBvc2l0aW9uIEFkYXB0ZXIgcG9zaXRpb24gZm9yIHBlcmZvcm1pbmcgdGhlIGNsaWNrCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjbGljayBhY3Rpb24gY291bGQgYmUgcGVyZm9ybWVkLCBmYWxzZSBpZiBub3QuCisgICAgICogICAgICAgICAoZS5nLiBpZiB0aGUgcG9wdXAgd2FzIG5vdCBzaG93aW5nLCB0aGlzIG1ldGhvZCB3b3VsZCByZXR1cm4gZmFsc2UuKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1JdGVtQ2xpY2soaW50IHBvc2l0aW9uKSB7CisgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgaWYgKG1JdGVtQ2xpY2tMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRHJvcERvd25MaXN0VmlldyBsaXN0ID0gbURyb3BEb3duTGlzdDsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbGlzdC5nZXRDaGlsZEF0KHBvc2l0aW9uIC0gbGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBMaXN0QWRhcHRlciBhZGFwdGVyID0gbGlzdC5nZXRBZGFwdGVyKCk7CisgICAgICAgICAgICAgICAgbUl0ZW1DbGlja0xpc3RlbmVyLm9uSXRlbUNsaWNrKGxpc3QsIGNoaWxkLCBwb3NpdGlvbiwgYWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBvciBudWxsIGlmIHRoZSBwb3B1cCBpcyBub3Qgc2hvd2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkSXRlbSgpIHsKKyAgICAgICAgaWYgKCFpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtIG9yIHtAbGluayBMaXN0VmlldyNJTlZBTElEX1BPU0lUSU9OfQorICAgICAqIGlmIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSBmYWxzZX0uCisgICAgICogCisgICAgICogQHNlZSBMaXN0VmlldyNnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpIHsKKyAgICAgICAgaWYgKCFpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIExpc3RWaWV3LklOVkFMSURfUE9TSVRJT047CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBJRCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0gb3Ige0BsaW5rIExpc3RWaWV3I0lOVkFMSURfUk9XX0lEfQorICAgICAqIGlmIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSBmYWxzZX0uCisgICAgICogCisgICAgICogQHNlZSBMaXN0VmlldyNnZXRTZWxlY3RlZEl0ZW1JZCgpCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0U2VsZWN0ZWRJdGVtSWQoKSB7CisgICAgICAgIGlmICghaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBMaXN0Vmlldy5JTlZBTElEX1JPV19JRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1JZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIFZpZXcgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBvciBudWxsIGlmCisgICAgICoge0BsaW5rICNpc1Nob3dpbmcoKX0gPT0ge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiAKKyAgICAgKiBAc2VlIExpc3RWaWV3I2dldFNlbGVjdGVkVmlldygpCisgICAgICovCisgICAgcHVibGljIFZpZXcgZ2V0U2VsZWN0ZWRWaWV3KCkgeworICAgICAgICBpZiAoIWlzU2hvd2luZygpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZFZpZXcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgTGlzdFZpZXd9IGRpc3BsYXllZCB3aXRoaW4gdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKiBPbmx5IHZhbGlkIHdoZW4ge0BsaW5rICNpc1Nob3dpbmcoKX0gPT0ge0Bjb2RlIHRydWV9LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0VmlldyBnZXRMaXN0VmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsdGVyIGtleSBkb3duIGV2ZW50cy4gQnkgZm9yd2FyZGluZyBrZXkgdXAgZXZlbnRzIHRvIHRoaXMgZnVuY3Rpb24sCisgICAgICogdmlld3MgdXNpbmcgbm9uLW1vZGFsIExpc3RQb3B1cFdpbmRvdyBjYW4gaGF2ZSBpdCBoYW5kbGUga2V5IHNlbGVjdGlvbiBvZiBpdGVtcy4KKyAgICAgKiAgCisgICAgICogQHBhcmFtIGtleUNvZGUga2V5Q29kZSBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5RG93bgorICAgICAqIEBwYXJhbSBldmVudCBldmVudCBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5RG93bgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIGZhbHNlIGlmIGl0IHdhcyBpZ25vcmVkLgorICAgICAqIAorICAgICAqIEBzZWUgI3NldE1vZGFsKGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICAvLyB3aGVuIHRoZSBkcm9wIGRvd24gaXMgc2hvd24sIHdlIGRyaXZlIGl0IGRpcmVjdGx5CisgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgLy8gdGhlIGtleSBldmVudHMgYXJlIGZvcndhcmRlZCB0byB0aGUgbGlzdCBpbiB0aGUgZHJvcCBkb3duIHZpZXcKKyAgICAgICAgICAgIC8vIG5vdGUgdGhhdCBMaXN0VmlldyBoYW5kbGVzIHNwYWNlIGJ1dCB3ZSBkb24ndCB3YW50IHRoYXQgdG8gaGFwcGVuCisgICAgICAgICAgICAvLyBhbHNvIGlmIHNlbGVjdGlvbiBpcyBub3QgY3VycmVudGx5IGluIHRoZSBkcm9wIGRvd24sIHRoZW4gZG9uJ3QKKyAgICAgICAgICAgIC8vIGxldCBjZW50ZXIgb3IgZW50ZXIgcHJlc3NlcyBnbyB0aGVyZSBzaW5jZSB0aGF0IHdvdWxkIGNhdXNlIGl0CisgICAgICAgICAgICAvLyB0byBzZWxlY3Qgb25lIG9mIGl0cyBpdGVtcworICAgICAgICAgICAgaWYgKGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9TUEFDRQorICAgICAgICAgICAgICAgICAgICAmJiAobURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpID49IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoa2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpKSkgeworICAgICAgICAgICAgICAgIGludCBjdXJJbmRleCA9IG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGNvbnN1bWVkOworCisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBiZWxvdyA9ICFtUG9wdXAuaXNBYm92ZUFuY2hvcigpOworCisgICAgICAgICAgICAgICAgZmluYWwgTGlzdEFkYXB0ZXIgYWRhcHRlciA9IG1BZGFwdGVyOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxsRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBpbnQgZmlyc3RJdGVtID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICAgICAgaW50IGxhc3RJdGVtID0gSW50ZWdlci5NSU5fVkFMVUU7CisKKyAgICAgICAgICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbEVuYWJsZWQgPSBhZGFwdGVyLmFyZUFsbEl0ZW1zRW5hYmxlZCgpOworICAgICAgICAgICAgICAgICAgICBmaXJzdEl0ZW0gPSBhbGxFbmFibGVkID8gMCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5sb29rRm9yU2VsZWN0YWJsZVBvc2l0aW9uKDAsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBsYXN0SXRlbSA9IGFsbEVuYWJsZWQgPyBhZGFwdGVyLmdldENvdW50KCkgLSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0Lmxvb2tGb3JTZWxlY3RhYmxlUG9zaXRpb24oYWRhcHRlci5nZXRDb3VudCgpIC0gMSwgZmFsc2UpOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICgoYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAgJiYgY3VySW5kZXggPD0gZmlyc3RJdGVtKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKCFiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOICYmIGN1ckluZGV4ID49IGxhc3RJdGVtKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBzZWxlY3Rpb24gaXMgYXQgdGhlIHRvcCwgd2UgYmxvY2sgdGhlIGtleQorICAgICAgICAgICAgICAgICAgICAvLyBldmVudCB0byBwcmV2ZW50IGZvY3VzIGZyb20gbW92aW5nLgorICAgICAgICAgICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEKTsKKyAgICAgICAgICAgICAgICAgICAgc2hvdygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBXQVJOSU5HOiBQbGVhc2UgcmVhZCB0aGUgY29tbWVudCB3aGVyZSBtTGlzdFNlbGVjdGlvbkhpZGRlbgorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBpcyBkZWNsYXJlZAorICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29uc3VtZWQgPSBtRHJvcERvd25MaXN0Lm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJLZXkgZG93bjogY29kZT0iICsga2V5Q29kZSArICIgbGlzdCBjb25zdW1lZD0iICsgY29uc3VtZWQpOworCisgICAgICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0IGhhbmRsZWQgdGhlIGtleSBldmVudCwgdGhlbiB0aGUgdXNlciBpcworICAgICAgICAgICAgICAgICAgICAvLyBuYXZpZ2F0aW5nIGluIHRoZSBsaXN0LCBzbyB3ZSBzaG91bGQgcHV0IGl0IGluIGZyb250LgorICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSGVyZSdzIGEgbGl0dGxlIHRyaWNrIHdlIG5lZWQgdG8gZG8gdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxpc3QgdmlldyBpcyBhY3R1YWxseSBzaG93aW5nIGl0cyBmb2N1cyBpbmRpY2F0b3IsCisgICAgICAgICAgICAgICAgICAgIC8vIGJ5IGVuc3VyaW5nIGl0IGhhcyBmb2N1cyBhbmQgZ2V0dGluZyBpdHMgd2luZG93IG91dAorICAgICAgICAgICAgICAgICAgICAvLyBvZiB0b3VjaCBtb2RlLgorICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnJlcXVlc3RGb2N1c0Zyb21Ub3VjaCgpOworICAgICAgICAgICAgICAgICAgICBzaG93KCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZCBwYXNzaW5nIHRoZSBmb2N1cyBmcm9tIHRoZSB0ZXh0IHZpZXcgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGNvbXBvbmVudAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBhdCB0aGUgYm90dG9tLCB3ZSBibG9jayB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IHRvIGF2b2lkIGdvaW5nIHRvIHRoZSBuZXh0IGZvY3VzYWJsZSB3aWRnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJJbmRleCA9PSBsYXN0SXRlbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckluZGV4ID09IGZpcnN0SXRlbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsdGVyIGtleSBkb3duIGV2ZW50cy4gQnkgZm9yd2FyZGluZyBrZXkgdXAgZXZlbnRzIHRvIHRoaXMgZnVuY3Rpb24sCisgICAgICogdmlld3MgdXNpbmcgbm9uLW1vZGFsIExpc3RQb3B1cFdpbmRvdyBjYW4gaGF2ZSBpdCBoYW5kbGUga2V5IHNlbGVjdGlvbiBvZiBpdGVtcy4KKyAgICAgKiAgCisgICAgICogQHBhcmFtIGtleUNvZGUga2V5Q29kZSBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5VXAKKyAgICAgKiBAcGFyYW0gZXZlbnQgZXZlbnQgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleVVwCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgZmFsc2UgaWYgaXQgd2FzIGlnbm9yZWQuCisgICAgICogCisgICAgICogQHNlZSAjc2V0TW9kYWwoYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleVVwKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICBpZiAoaXNTaG93aW5nKCkgJiYgbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpID49IDApIHsKKyAgICAgICAgICAgIGJvb2xlYW4gY29uc3VtZWQgPSBtRHJvcERvd25MaXN0Lm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOworICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBsaXN0IGFjY2VwdHMgdGhlIGtleSBldmVudHMgYW5kIHRoZSBrZXkgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgLy8gd2FzIGEgY2xpY2ssIHRoZSB0ZXh0IHZpZXcgZ2V0cyB0aGUgc2VsZWN0ZWQgaXRlbQorICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBkcm9wIGRvd24gYXMgaXRzIGNvbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY29uc3VtZWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciBwcmUtSU1FIGtleSBldmVudHMuIEJ5IGZvcndhcmRpbmcge0BsaW5rIFZpZXcjb25LZXlQcmVJbWUoaW50LCBLZXlFdmVudCl9CisgICAgICogZXZlbnRzIHRvIHRoaXMgZnVuY3Rpb24sIHZpZXdzIHVzaW5nIExpc3RQb3B1cFdpbmRvdyBjYW4gaGF2ZSBpdCBkaXNtaXNzIHRoZSBwb3B1cAorICAgICAqIHdoZW4gdGhlIGJhY2sga2V5IGlzIHByZXNzZWQuCisgICAgICogIAorICAgICAqIEBwYXJhbSBrZXlDb2RlIGtleUNvZGUgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleVByZUltZQorICAgICAqIEBwYXJhbSBldmVudCBldmVudCBwYXJhbSBwYXNzZWQgdG8gdGhlIGhvc3QgdmlldydzIG9uS2V5UHJlSW1lCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgZmFsc2UgaWYgaXQgd2FzIGlnbm9yZWQuCisgICAgICogCisgICAgICogQHNlZSAjc2V0TW9kYWwoYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleVByZUltZShpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9CQUNLICYmIGlzU2hvd2luZygpKSB7CisgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHRoZSBiYWNrIGtleSwgd2UgZG8gbm90IGV2ZW4gdHJ5IHRvIHNlbmQgaXQKKyAgICAgICAgICAgIC8vIHRvIHRoZSBkcm9wIGRvd24gbGlzdCBidXQgaW5zdGVhZCwgY29uc3VtZSBpdCBpbW1lZGlhdGVseQorICAgICAgICAgICAgZmluYWwgVmlldyBhbmNob3JWaWV3ID0gbURyb3BEb3duQW5jaG9yVmlldzsKKyAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTiAmJiBldmVudC5nZXRSZXBlYXRDb3VudCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBhbmNob3JWaWV3LmdldEtleURpc3BhdGNoZXJTdGF0ZSgpLnN0YXJ0VHJhY2tpbmcoZXZlbnQsIHRoaXMpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fVVApIHsKKyAgICAgICAgICAgICAgICBhbmNob3JWaWV3LmdldEtleURpc3BhdGNoZXJTdGF0ZSgpLmhhbmRsZVVwRXZlbnQoZXZlbnQpOworICAgICAgICAgICAgICAgIGlmIChldmVudC5pc1RyYWNraW5nKCkgJiYgIWV2ZW50LmlzQ2FuY2VsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+QnVpbGRzIHRoZSBwb3B1cCB3aW5kb3cncyBjb250ZW50IGFuZCByZXR1cm5zIHRoZSBoZWlnaHQgdGhlIHBvcHVwCisgICAgICogc2hvdWxkIGhhdmUuIFJldHVybnMgLTEgd2hlbiB0aGUgY29udGVudCBhbHJlYWR5IGV4aXN0cy48L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50J3MgaGVpZ2h0IG9yIC0xIGlmIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBidWlsZERyb3BEb3duKCkgeworICAgICAgICBWaWV3R3JvdXAgZHJvcERvd25WaWV3OworICAgICAgICBpbnQgb3RoZXJIZWlnaHRzID0gMDsKKworICAgICAgICBpZiAobURyb3BEb3duTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBtQ29udGV4dDsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGlzIFJ1bm5hYmxlIGV4aXN0cyBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBjaGVja2luZyBpZiB0aGUgdmlldyBsYXlvdXQgaGFzIGdvdAorICAgICAgICAgICAgICogY29tcGxldGVkIGFuZCBpZiBzbyBjYWxsIHNob3dEcm9wRG93biB0byBkaXNwbGF5IHRoZSBkcm9wIGRvd24uIFRoaXMgaXMgdXNlZCB0byBzaG93CisgICAgICAgICAgICAgKiB0aGUgZHJvcCBkb3duIGFzIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgdXNlciBvcGVucyB1cCB0aGUgc2VhcmNoIGRpYWxvZywgd2l0aG91dAorICAgICAgICAgICAgICogd2FpdGluZyBmb3IgdGhlIG5vcm1hbCBVSSBwaXBlbGluZSB0byBkbyBpdCdzIGpvYiB3aGljaCBpcyBzbG93ZXIgdGhhbiB0aGlzIG1ldGhvZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbVNob3dEcm9wRG93blJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVmlldyBsYXlvdXQgc2hvdWxkIGJlIGFsbCBkb25lIGJlZm9yZSBkaXNwbGF5aW5nIHRoZSBkcm9wIGRvd24uCisgICAgICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IGdldEFuY2hvclZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCAmJiB2aWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2hvdygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbURyb3BEb3duTGlzdCA9IG5ldyBEcm9wRG93bkxpc3RWaWV3KGNvbnRleHQsICFtTW9kYWwpOworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkxpc3RIaWdobGlnaHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0U2VsZWN0b3IobURyb3BEb3duTGlzdEhpZ2hsaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEFkYXB0ZXIobUFkYXB0ZXIpOworICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRWZXJ0aWNhbEZhZGluZ0VkZ2VFbmFibGVkKHRydWUpOworICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG1JdGVtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIobmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU2VsZWN0ZWQoQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERyb3BEb3duTGlzdFZpZXcgZHJvcERvd25MaXN0ID0gbURyb3BEb3duTGlzdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyb3BEb3duTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbk5vdGhpbmdTZWxlY3RlZChBZGFwdGVyVmlldzw/PiBwYXJlbnQpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0T25TY3JvbGxMaXN0ZW5lcihtU2Nyb2xsTGlzdGVuZXIpOworCisgICAgICAgICAgICBpZiAobUl0ZW1TZWxlY3RlZExpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIobUl0ZW1TZWxlY3RlZExpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gbURyb3BEb3duTGlzdDsKKworICAgICAgICAgICAgVmlldyBoaW50VmlldyA9IG1Qcm9tcHRWaWV3OworICAgICAgICAgICAgaWYgKGhpbnRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBhbiBoaW50IGhhcyBiZWVuIHNwZWNpZmllZCwgd2UgYWNjb21vZGF0ZSBtb3JlIHNwYWNlIGZvciBpdCBhbmQKKyAgICAgICAgICAgICAgICAvLyBhZGQgYSB0ZXh0IHZpZXcgaW4gdGhlIGRyb3AgZG93biBtZW51LCBhdCB0aGUgYm90dG9tIG9mIHRoZSBsaXN0CisgICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0IGhpbnRDb250YWluZXIgPSBuZXcgTGluZWFyTGF5b3V0KGNvbnRleHQpOworICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKKworICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgaGludFBhcmFtcyA9IG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIDAsIDEuMGYKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN3aXRjaCAobVByb21wdFBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSBQT1NJVElPTl9QUk9NUFRfQkVMT1c6CisgICAgICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhkcm9wRG93blZpZXcsIGhpbnRQYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBoaW50Q29udGFpbmVyLmFkZFZpZXcoaGludFZpZXcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSBQT1NJVElPTl9QUk9NUFRfQUJPVkU6CisgICAgICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhoaW50Vmlldyk7CisgICAgICAgICAgICAgICAgICAgIGhpbnRDb250YWluZXIuYWRkVmlldyhkcm9wRG93blZpZXcsIGhpbnRQYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCBoaW50IHBvc2l0aW9uICIgKyBtUHJvbXB0UG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBtZWFzdXJlIHRoZSBoaW50J3MgaGVpZ2h0IHRvIGZpbmQgaG93IG11Y2ggbW9yZSB2ZXJ0aWNhbCBzcGFjZQorICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gYWRkIHRvIHRoZSBkcm9wIGRvd24ncyBoZWlnaHQKKyAgICAgICAgICAgICAgICBpbnQgd2lkdGhTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKG1Ecm9wRG93bldpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKTsKKyAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0U3BlYyA9IE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEOworICAgICAgICAgICAgICAgIGhpbnRWaWV3Lm1lYXN1cmUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKKworICAgICAgICAgICAgICAgIGhpbnRQYXJhbXMgPSAoTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcykgaGludFZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgb3RoZXJIZWlnaHRzID0gaGludFZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKSArIGhpbnRQYXJhbXMudG9wTWFyZ2luCisgICAgICAgICAgICAgICAgICAgICAgICArIGhpbnRQYXJhbXMuYm90dG9tTWFyZ2luOworCisgICAgICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gaGludENvbnRhaW5lcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVBvcHVwLnNldENvbnRlbnRWaWV3KGRyb3BEb3duVmlldyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkcm9wRG93blZpZXcgPSAoVmlld0dyb3VwKSBtUG9wdXAuZ2V0Q29udGVudFZpZXcoKTsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IG1Qcm9tcHRWaWV3OworICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgaGludFBhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAoTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcykgdmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgICAgICBvdGhlckhlaWdodHMgPSB2aWV3LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyBoaW50UGFyYW1zLnRvcE1hcmdpbgorICAgICAgICAgICAgICAgICAgICAgICAgKyBoaW50UGFyYW1zLmJvdHRvbU1hcmdpbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE1heCBoZWlnaHQgYXZhaWxhYmxlIG9uIHRoZSBzY3JlZW4gZm9yIGEgcG9wdXAuCisgICAgICAgIGJvb2xlYW4gaWdub3JlQm90dG9tRGVjb3JhdGlvbnMgPQorICAgICAgICAgICAgICAgIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRDsKKyAgICAgICAgZmluYWwgaW50IG1heEhlaWdodCA9IG1Qb3B1cC5nZXRNYXhBdmFpbGFibGVIZWlnaHQoCisgICAgICAgICAgICAgICAgZ2V0QW5jaG9yVmlldygpLCBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCwgaWdub3JlQm90dG9tRGVjb3JhdGlvbnMpOworCisgICAgICAgIC8vIGdldE1heEF2YWlsYWJsZUhlaWdodCgpIHN1YnRyYWN0cyB0aGUgcGFkZGluZywgc28gd2UgcHV0IGl0IGJhY2ssCisgICAgICAgIC8vIHRvIGdldCB0aGUgYXZhaWxhYmxlIGhlaWdodCBmb3IgdGhlIHdob2xlIHdpbmRvdworICAgICAgICBpbnQgcGFkZGluZyA9IDA7CisgICAgICAgIERyYXdhYmxlIGJhY2tncm91bmQgPSBtUG9wdXAuZ2V0QmFja2dyb3VuZCgpOworICAgICAgICBpZiAoYmFja2dyb3VuZCAhPSBudWxsKSB7CisgICAgICAgICAgICBiYWNrZ3JvdW5kLmdldFBhZGRpbmcobVRlbXBSZWN0KTsKKyAgICAgICAgICAgIHBhZGRpbmcgPSBtVGVtcFJlY3QudG9wICsgbVRlbXBSZWN0LmJvdHRvbTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRHJvcERvd25BbHdheXNWaXNpYmxlIHx8IG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgeworICAgICAgICAgICAgcmV0dXJuIG1heEhlaWdodCArIHBhZGRpbmc7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgbGlzdENvbnRlbnQgPSBtRHJvcERvd25MaXN0Lm1lYXN1cmVIZWlnaHRPZkNoaWxkcmVuKE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgIDAsIExpc3RWaWV3Lk5PX1BPU0lUSU9OLCBtYXhIZWlnaHQgLSBvdGhlckhlaWdodHMsIDIpOworICAgICAgICAvLyBhZGQgcGFkZGluZyBvbmx5IGlmIHRoZSBsaXN0IGhhcyBpdGVtcyBpbiBpdCwgdGhhdCB3YXkgd2UgZG9uJ3Qgc2hvdworICAgICAgICAvLyB0aGUgcG9wdXAgaWYgaXQgaXMgbm90IG5lZWRlZAorICAgICAgICBpZiAobGlzdENvbnRlbnQgPiAwKSBvdGhlckhlaWdodHMgKz0gcGFkZGluZzsKKworICAgICAgICByZXR1cm4gbGlzdENvbnRlbnQgKyBvdGhlckhlaWdodHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+V3JhcHBlciBjbGFzcyBmb3IgYSBMaXN0Vmlldy4gVGhpcyB3cmFwcGVyIGNhbiBoaWphY2sgdGhlIGZvY3VzIHRvCisgICAgICogbWFrZSBzdXJlIHRoZSBsaXN0IHVzZXMgdGhlIGFwcHJvcHJpYXRlIGRyYXdhYmxlcyBhbmQgc3RhdGVzIHdoZW4KKyAgICAgKiBkaXNwbGF5ZWQgb24gc2NyZWVuIHdpdGhpbiBhIGRyb3AgZG93bi4gVGhlIGZvY3VzIGlzIG5ldmVyIGFjdHVhbGx5CisgICAgICogcGFzc2VkIHRvIHRoZSBkcm9wIGRvd24gaW4gdGhpcyBtb2RlOyB0aGUgbGlzdCBvbmx5IGxvb2tzIGZvY3VzZWQuPC9wPgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERyb3BEb3duTGlzdFZpZXcgZXh0ZW5kcyBMaXN0VmlldyB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBMaXN0UG9wdXBXaW5kb3cuVEFHICsgIi5Ecm9wRG93bkxpc3RWaWV3IjsKKyAgICAgICAgLyoKKyAgICAgICAgICogV0FSTklORzogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGEgdG91Y2ggbW9kZSBpc3N1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogVG91Y2ggbW9kZSBpcyBwcm9wYWdhdGVkIGxhemlseSB0byB3aW5kb3dzLiBUaGlzIGNhdXNlcyBwcm9ibGVtcyBpbgorICAgICAgICAgKiB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOgorICAgICAgICAgKiAtIFR5cGUgc29tZXRoaW5nIGluIHRoZSBBdXRvQ29tcGxldGVUZXh0VmlldyBhbmQgZ2V0IHNvbWUgcmVzdWx0cworICAgICAgICAgKiAtIE1vdmUgZG93biB3aXRoIHRoZSBkLXBhZCB0byBzZWxlY3QgYW4gaXRlbSBpbiB0aGUgbGlzdAorICAgICAgICAgKiAtIE1vdmUgdXAgd2l0aCB0aGUgZC1wYWQgdW50aWwgdGhlIHNlbGVjdGlvbiBkaXNhcHBlYXJzCisgICAgICAgICAqIC0gVHlwZSBtb3JlIHRleHQgaW4gdGhlIEF1dG9Db21wbGV0ZVRleHRWaWV3ICp1c2luZyB0aGUgc29mdCBrZXlib2FyZCoKKyAgICAgICAgICogICBhbmQgZ2V0IG5ldyByZXN1bHRzOyB5b3UgYXJlIG5vdyBpbiB0b3VjaCBtb2RlCisgICAgICAgICAqIC0gVGhlIHNlbGVjdGlvbiBjb21lcyBiYWNrIG9uIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LCBldmVuIHRob3VnaAorICAgICAgICAgKiAgIHRoZSBsaXN0IGlzIHN1cHBvc2VkIHRvIGJlIGluIHRvdWNoIG1vZGUKKyAgICAgICAgICoKKyAgICAgICAgICogVXNpbmcgdGhlIHNvZnQga2V5Ym9hcmQgdHJpZ2dlcnMgdGhlIHRvdWNoIG1vZGUgY2hhbmdlIGJ1dCB0aGF0IGNoYW5nZQorICAgICAgICAgKiBpcyBwcm9wYWdhdGVkIHRvIG91ciB3aW5kb3cgb25seSBhZnRlciB0aGUgZmlyc3QgbGlzdCBsYXlvdXQsIHRoZXJlZm9yZQorICAgICAgICAgKiBhZnRlciB0aGUgbGlzdCBhdHRlbXB0cyB0byByZXN1cnJlY3QgdGhlIHNlbGVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIHRyaWNrIHRvIHdvcmsgYXJvdW5kIHRoaXMgaXNzdWUgaXMgdG8gcHJldGVuZCB0aGUgbGlzdCBpcyBpbiB0b3VjaAorICAgICAgICAgKiBtb2RlIHdoZW4gd2Uga25vdyB0aGF0IHRoZSBzZWxlY3Rpb24gc2hvdWxkIG5vdCBhcHBlYXIsIHRoYXQgaXMgd2hlbgorICAgICAgICAgKiB3ZSBrbm93IHRoZSB1c2VyIG1vdmVkIHRoZSBzZWxlY3Rpb24gYXdheSBmcm9tIHRoZSBsaXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGJvb2xlYW4gaXMgc2V0IHRvIHRydWUgd2hlbmV2ZXIgd2UgZXhwbGljaXRseSBoaWRlIHRoZSBsaXN0J3MKKyAgICAgICAgICogc2VsZWN0aW9uIGFuZCByZXNldCB0byBmYWxzZSB3aGVuZXZlciB3ZSBrbm93IHRoZSB1c2VyIG1vdmVkIHRoZQorICAgICAgICAgKiBzZWxlY3Rpb24gYmFjayB0byB0aGUgbGlzdC4KKyAgICAgICAgICoKKyAgICAgICAgICogV2hlbiB0aGlzIGJvb2xlYW4gaXMgdHJ1ZSwgaXNJblRvdWNoTW9kZSgpIHJldHVybnMgdHJ1ZSwgb3RoZXJ3aXNlIGl0CisgICAgICAgICAqIHJldHVybnMgc3VwZXIuaXNJblRvdWNoTW9kZSgpLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1MaXN0U2VsZWN0aW9uSGlkZGVuOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRydWUgaWYgdGhpcyB3cmFwcGVyIHNob3VsZCBmYWtlIGZvY3VzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1IaWphY2tGb2N1czsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Q3JlYXRlcyBhIG5ldyBsaXN0IHZpZXcgd3JhcHBlci48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IHRoaXMgdmlldydzIGNvbnRleHQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBEcm9wRG93bkxpc3RWaWV3KENvbnRleHQgY29udGV4dCwgYm9vbGVhbiBoaWphY2tGb2N1cykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmRyb3BEb3duTGlzdFZpZXdTdHlsZSk7CisgICAgICAgICAgICBtSGlqYWNrRm9jdXMgPSBoaWphY2tGb2N1czsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5Bdm9pZHMgamFycmluZyBzY3JvbGxpbmcgZWZmZWN0IGJ5IGVuc3VyaW5nIHRoYXQgbGlzdCBlbGVtZW50cworICAgICAgICAgKiBtYWRlIG9mIGEgdGV4dCB2aWV3IGZpdCBvbiBhIHNpbmdsZSBsaW5lLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBvc2l0aW9uIHRoZSBpdGVtIGluZGV4IGluIHRoZSBsaXN0IHRvIGdldCBhIHZpZXcgZm9yCisgICAgICAgICAqIEByZXR1cm4gdGhlIHZpZXcgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbQorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIFZpZXcgb2J0YWluVmlldyhpbnQgcG9zaXRpb24sIGJvb2xlYW5bXSBpc1NjcmFwKSB7CisgICAgICAgICAgICBWaWV3IHZpZXcgPSBzdXBlci5vYnRhaW5WaWV3KHBvc2l0aW9uLCBpc1NjcmFwKTsKKworICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBUZXh0VmlldykgeworICAgICAgICAgICAgICAgICgoVGV4dFZpZXcpIHZpZXcpLnNldEhvcml6b250YWxseVNjcm9sbGluZyh0cnVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHZpZXc7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJblRvdWNoTW9kZSgpIHsKKyAgICAgICAgICAgIC8vIFdBUk5JTkc6IFBsZWFzZSByZWFkIHRoZSBjb21tZW50IHdoZXJlIG1MaXN0U2VsZWN0aW9uSGlkZGVuIGlzIGRlY2xhcmVkCisgICAgICAgICAgICByZXR1cm4gKG1IaWphY2tGb2N1cyAmJiBtTGlzdFNlbGVjdGlvbkhpZGRlbikgfHwgc3VwZXIuaXNJblRvdWNoTW9kZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzIGlmIGhpamFja2luZyBmb2N1cworICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1dpbmRvd0ZvY3VzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1IaWphY2tGb2N1cyB8fCBzdXBlci5oYXNXaW5kb3dGb2N1cygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzIGlmIGhpamFja2luZyBmb2N1cworICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRm9jdXNlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSGlqYWNrRm9jdXMgfHwgc3VwZXIuaXNGb2N1c2VkKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+UmV0dXJucyB0aGUgZm9jdXMgc3RhdGUgaW4gdGhlIGRyb3AgZG93bi48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBhbHdheXMgaWYgaGlqYWNraW5nIGZvY3VzCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbUhpamFja0ZvY3VzIHx8IHN1cGVyLmhhc0ZvY3VzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFBvcHVwRGF0YVNldE9ic2VydmVyIGV4dGVuZHMgRGF0YVNldE9ic2VydmVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlZCgpIHsKKyAgICAgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgICAgIC8vIFJlc2l6ZSB0aGUgcG9wdXAgdG8gZml0IG5ldyBjb250ZW50CisgICAgICAgICAgICAgICAgc2hvdygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25JbnZhbGlkYXRlZCgpIHsKKyAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTGlzdFNlbGVjdG9ySGlkZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGNsZWFyTGlzdFNlbGVjdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBSZXNpemVQb3B1cFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKKyAgICAgICAgICAgIHNob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUG9wdXBUb3VjaEludGVyY2VwdG9yIGltcGxlbWVudHMgT25Ub3VjaExpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaChWaWV3IHYsIE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXZlbnQuZ2V0QWN0aW9uKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgeCA9IChpbnQpIGV2ZW50LmdldFgoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludCkgZXZlbnQuZ2V0WSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOICYmCisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cCAhPSBudWxsICYmIG1Qb3B1cC5pc1Nob3dpbmcoKSAmJgorICAgICAgICAgICAgICAgICAgICAoeCA+PSAwICYmIHggPCBnZXRXaWR0aCgpICYmIHkgPj0gMCAmJiB5IDwgZ2V0SGVpZ2h0KCkpKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobVJlc2l6ZVBvcHVwUnVubmFibGUsIEVYUEFORF9MSVNUX1RJTUVPVVQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1SZXNpemVQb3B1cFJ1bm5hYmxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUG9wdXBTY3JvbGxMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RWaWV3Lk9uU2Nyb2xsTGlzdGVuZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBvblNjcm9sbChBYnNMaXN0VmlldyB2aWV3LCBpbnQgZmlyc3RWaXNpYmxlSXRlbSwgaW50IHZpc2libGVJdGVtQ291bnQsCisgICAgICAgICAgICAgICAgaW50IHRvdGFsSXRlbUNvdW50KSB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2Nyb2xsU3RhdGVDaGFuZ2VkKEFic0xpc3RWaWV3IHZpZXcsIGludCBzY3JvbGxTdGF0ZSkgeworICAgICAgICAgICAgaWYgKHNjcm9sbFN0YXRlID09IFNDUk9MTF9TVEFURV9UT1VDSF9TQ1JPTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgIWlzSW5wdXRNZXRob2ROb3ROZWVkZWQoKSAmJiBtUG9wdXAuZ2V0Q29udGVudFZpZXcoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1SZXNpemVQb3B1cFJ1bm5hYmxlKTsKKyAgICAgICAgICAgICAgICBtUmVzaXplUG9wdXBSdW5uYWJsZS5ydW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3LmphdmEKaW5kZXggNDZjZDQ1YS4uN2M0ODk3YSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RWaWV3LmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmFuZHJvaWQuY29sbGVjdC5MaXN0czsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CkBAIC0yNywxMCArMjgsNyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9uZ1NwYXJzZUFycmF5OwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkZvY3VzRmluZGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKQEAgLTQxLDYgKzM5LDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3UGFyZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cy5SZW1vdGVWaWV3OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIApAQCAtNjQsMTAgKzYzLDEwIEBACiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19lbnRyaWVzCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19kaXZpZGVyCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19kaXZpZGVySGVpZ2h0Ci0gKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19jaG9pY2VNb2RlCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19oZWFkZXJEaXZpZGVyc0VuYWJsZWQKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpc3RWaWV3X2Zvb3RlckRpdmlkZXJzRW5hYmxlZAogICovCitAUmVtb3RlVmlldwogcHVibGljIGNsYXNzIExpc3RWaWV3IGV4dGVuZHMgQWJzTGlzdFZpZXcgewogICAgIC8qKgogICAgICAqIFVzZWQgdG8gaW5kaWNhdGUgYSBubyBwcmVmZXJlbmNlIGZvciBhIHBvc2l0aW9uIHR5cGUuCkBAIC03NSwyMSArNzQsNiBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fUE9TSVRJT04gPSAtMTsKIAogICAgIC8qKgotICAgICAqIE5vcm1hbCBsaXN0IHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2hvaWNlcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIT0lDRV9NT0RFX05PTkUgPSAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGxpc3QgYWxsb3dzIHVwIHRvIG9uZSBjaG9pY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfTU9ERV9TSU5HTEUgPSAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGxpc3QgYWxsb3dzIG11bHRpcGxlIGNob2ljZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfTU9ERV9NVUxUSVBMRSA9IDI7Ci0KLSAgICAvKioKICAgICAgKiBXaGVuIGFycm93IHNjcm9sbGluZywgTGlzdFZpZXcgd2lsbCBuZXZlciBzY3JvbGwgbW9yZSB0aGFuIHRoaXMgZmFjdG9yCiAgICAgICogdGltZXMgdGhlIGhlaWdodCBvZiB0aGUgbGlzdC4KICAgICAgKi8KQEAgLTEyMSwxMiArMTA1LDggQEAKICAgICBEcmF3YWJsZSBtRGl2aWRlcjsKICAgICBpbnQgbURpdmlkZXJIZWlnaHQ7CiAgICAgCi0gICAgRHJhd2FibGUgbU92ZXJzY3JvbGxIZWFkZXI7Ci0gICAgRHJhd2FibGUgbU92ZXJzY3JvbGxGb290ZXI7Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gbUlzQ2FjaGVDb2xvck9wYXF1ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbURpdmlkZXJJc09wYXF1ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUNsaXBEaXZpZGVyOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1IZWFkZXJEaXZpZGVyc0VuYWJsZWQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1Gb290ZXJEaXZpZGVyc0VuYWJsZWQ7CkBAIC0xMzUsMTEgKzExNSw2IEBACiAKICAgICBwcml2YXRlIGJvb2xlYW4gbUl0ZW1zQ2FuRm9jdXMgPSBmYWxzZTsKIAotICAgIHByaXZhdGUgaW50IG1DaG9pY2VNb2RlID0gQ0hPSUNFX01PREVfTk9ORTsKLQotICAgIHByaXZhdGUgU3BhcnNlQm9vbGVhbkFycmF5IG1DaGVja1N0YXRlczsKLSAgICBwcml2YXRlIExvbmdTcGFyc2VBcnJheTxCb29sZWFuPiBtQ2hlY2tlZElkU3RhdGVzOwotCiAgICAgLy8gdXNlZCBmb3IgdGVtcG9yYXJ5IGNhbGN1bGF0aW9ucy4KICAgICBwcml2YXRlIGZpbmFsIFJlY3QgbVRlbXBSZWN0ID0gbmV3IFJlY3QoKTsKICAgICBwcml2YXRlIFBhaW50IG1EaXZpZGVyUGFpbnQ7CkBAIC0xNTAsNyArMTI1LDcgQEAKIAogICAgIC8vIEtlZXBzIGZvY3VzZWQgY2hpbGRyZW4gdmlzaWJsZSB0aHJvdWdoIHJlc2l6ZXMKICAgICBwcml2YXRlIEZvY3VzU2VsZWN0b3IgbUZvY3VzU2VsZWN0b3I7Ci0gICAgCisKICAgICBwdWJsaWMgTGlzdFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CiAgICAgfQpAQCAtMTc4LDE2ICsxNTMsNiBAQAogICAgICAgICAgICAgc2V0RGl2aWRlcihkKTsKICAgICAgICAgfQogICAgICAgICAKLSAgICAgICAgZmluYWwgRHJhd2FibGUgb3NIZWFkZXIgPSBhLmdldERyYXdhYmxlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkxpc3RWaWV3X292ZXJzY3JvbGxIZWFkZXIpOwotICAgICAgICBpZiAob3NIZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0T3ZlcnNjcm9sbEhlYWRlcihvc0hlYWRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBEcmF3YWJsZSBvc0Zvb3RlciA9IGEuZ2V0RHJhd2FibGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTGlzdFZpZXdfb3ZlcnNjcm9sbEZvb3Rlcik7Ci0gICAgICAgIGlmIChvc0Zvb3RlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRPdmVyc2Nyb2xsRm9vdGVyKG9zRm9vdGVyKTsKLSAgICAgICAgfQotCiAgICAgICAgIC8vIFVzZSB0aGUgaGVpZ2h0IHNwZWNpZmllZCwgemVybyBiZWluZyB0aGUgZGVmYXVsdAogICAgICAgICBmaW5hbCBpbnQgZGl2aWRlckhlaWdodCA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkxpc3RWaWV3X2RpdmlkZXJIZWlnaHQsIDApOwpAQCAtMTk1LDggKzE2MCw2IEBACiAgICAgICAgICAgICBzZXREaXZpZGVySGVpZ2h0KGRpdmlkZXJIZWlnaHQpOwogICAgICAgICB9CiAKLSAgICAgICAgc2V0Q2hvaWNlTW9kZShhLmdldEludChSLnN0eWxlYWJsZS5MaXN0Vmlld19jaG9pY2VNb2RlLCBDSE9JQ0VfTU9ERV9OT05FKSk7Ci0gICAgICAgIAogICAgICAgICBtSGVhZGVyRGl2aWRlcnNFbmFibGVkID0gYS5nZXRCb29sZWFuKFIuc3R5bGVhYmxlLkxpc3RWaWV3X2hlYWRlckRpdmlkZXJzRW5hYmxlZCwgdHJ1ZSk7CiAgICAgICAgIG1Gb290ZXJEaXZpZGVyc0VuYWJsZWQgPSBhLmdldEJvb2xlYW4oUi5zdHlsZWFibGUuTGlzdFZpZXdfZm9vdGVyRGl2aWRlcnNFbmFibGVkLCB0cnVlKTsKIApAQCAtNDE3LDYgKzM4MCwxNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhpcyBBYnNMaXN0VmlldyB0byB1c2UgYSByZW1vdGUgdmlld3MgYWRhcHRlciB3aGljaCBjb25uZWN0cyB0byBhIFJlbW90ZVZpZXdzU2VydmljZQorICAgICAqIHRocm91Z2ggdGhlIHNwZWNpZmllZCBpbnRlbnQuCisgICAgICogQHBhcmFtIGludGVudCB0aGUgaW50ZW50IHVzZWQgdG8gaWRlbnRpZnkgdGhlIFJlbW90ZVZpZXdzU2VydmljZSBmb3IgdGhlIGFkYXB0ZXIgdG8gY29ubmVjdCB0by4KKyAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdGVWaWV3c0FkYXB0ZXIoSW50ZW50IGludGVudCkgeworICAgICAgICBzdXBlci5zZXRSZW1vdGVWaWV3c0FkYXB0ZXIoaW50ZW50KTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZXRzIHRoZSBkYXRhIGJlaGluZCB0aGlzIExpc3RWaWV3LgogICAgICAqCiAgICAgICogVGhlIGFkYXB0ZXIgcGFzc2VkIHRvIHRoaXMgbWV0aG9kIG1heSBiZSB3cmFwcGVkIGJ5IGEge0BsaW5rIFdyYXBwZXJMaXN0QWRhcHRlcn0sCkBAIC00MzEsNyArNDA0LDcgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKLSAgICAgICAgaWYgKG51bGwgIT0gbUFkYXB0ZXIpIHsKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwgJiYgbURhdGFTZXRPYnNlcnZlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBtQWRhcHRlci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOwogICAgICAgICB9CiAKQEAgLTQ0Niw2ICs0MTksMTAgQEAKIAogICAgICAgICBtT2xkU2VsZWN0ZWRQb3NpdGlvbiA9IElOVkFMSURfUE9TSVRJT047CiAgICAgICAgIG1PbGRTZWxlY3RlZFJvd0lkID0gSU5WQUxJRF9ST1dfSUQ7CisKKyAgICAgICAgLy8gQWJzTGlzdFZpZXcjc2V0QWRhcHRlciB3aWxsIHVwZGF0ZSBjaG9pY2UgbW9kZSBzdGF0ZXMuCisgICAgICAgIHN1cGVyLnNldEFkYXB0ZXIoYWRhcHRlcik7CisKICAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIG1BcmVBbGxJdGVtc1NlbGVjdGFibGUgPSBtQWRhcHRlci5hcmVBbGxJdGVtc0VuYWJsZWQoKTsKICAgICAgICAgICAgIG1PbGRJdGVtQ291bnQgPSBtSXRlbUNvdW50OwpAQCAtNDcwLDEzICs0NDcsNiBAQAogICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgc2VsZWN0ZWQKICAgICAgICAgICAgICAgICBjaGVja1NlbGVjdGlvbkNoYW5nZWQoKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1DaG9pY2VNb2RlICE9IENIT0lDRV9NT0RFX05PTkUgJiYKLSAgICAgICAgICAgICAgICAgICAgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKLSAgICAgICAgICAgIH0KLQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUFyZUFsbEl0ZW1zU2VsZWN0YWJsZSA9IHRydWU7CiAgICAgICAgICAgICBjaGVja0ZvY3VzKCk7CkBAIC00ODQsMTQgKzQ1NCw2IEBACiAgICAgICAgICAgICBjaGVja1NlbGVjdGlvbkNoYW5nZWQoKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtQ2hlY2tTdGF0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNoZWNrU3RhdGVzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuY2xlYXIoKTsKLSAgICAgICAgfQotCiAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKICAgICB9CiAKQEAgLTg3OSw2ICs4NDEsMjUgQEAKICAgICAgICAgcmV0dXJuIHRvcFNlbGVjdGlvblBpeGVsOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFNtb290aGx5IHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgcG9zaXRpb24uIFRoZSB2aWV3IHdpbGwKKyAgICAgKiBzY3JvbGwgc3VjaCB0aGF0IHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24gaXMgZGlzcGxheWVkLgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBTY3JvbGwgdG8gdGhpcyBhZGFwdGVyIHBvc2l0aW9uLgorICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAorICAgIHB1YmxpYyB2b2lkIHNtb290aFNjcm9sbFRvUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIHN1cGVyLnNtb290aFNjcm9sbFRvUG9zaXRpb24ocG9zaXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNtb290aGx5IHNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgcG9zaXRpb24gb2Zmc2V0LiBUaGUgdmlldyB3aWxsCisgICAgICogc2Nyb2xsIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBhbW91bnQgdG8gb2Zmc2V0IGZyb20gdGhlIGFkYXB0ZXIgcG9zaXRpb24gdG8gc2Nyb2xsIHRvLgorICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAorICAgIHB1YmxpYyB2b2lkIHNtb290aFNjcm9sbEJ5T2Zmc2V0KGludCBvZmZzZXQpIHsKKyAgICAgICAgc3VwZXIuc21vb3RoU2Nyb2xsQnlPZmZzZXQob2Zmc2V0KTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBGaWxscyB0aGUgbGlzdCBiYXNlZCBvbiBwb3NpdGlvbmluZyB0aGUgbmV3IHNlbGVjdGlvbiByZWxhdGl2ZSB0byB0aGUgb2xkCkBAIC0xODAzLDYgKzE3ODQsOSBAQAogICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSAmJiBtQ2hlY2tTdGF0ZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ2hlY2thYmxlKSB7CiAgICAgICAgICAgICAgICAgKChDaGVja2FibGUpIGNoaWxkKS5zZXRDaGVja2VkKG1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24pKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0Q29udGV4dCgpLmdldEFwcGxpY2F0aW9uSW5mbygpLnRhcmdldFNka1ZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgPj0gYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTLkhPTkVZQ09NQikgeworICAgICAgICAgICAgICAgIGNoaWxkLnNldEFjdGl2YXRlZChtQ2hlY2tTdGF0ZXMuZ2V0KHBvc2l0aW9uKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjk1OCw1MiArMjk0MiwxNCBAQAogICAgICAgICB9CiAgICAgICAgIHN1cGVyLnNldENhY2hlQ29sb3JIaW50KGNvbG9yKTsKICAgICB9Ci0KLSAgICB2b2lkIGRyYXdPdmVyc2Nyb2xsSGVhZGVyKENhbnZhcyBjYW52YXMsIERyYXdhYmxlIGRyYXdhYmxlLCBSZWN0IGJvdW5kcykgewotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZHJhd2FibGUuZ2V0TWluaW11bUhlaWdodCgpOwotCi0gICAgICAgIGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgIGNhbnZhcy5jbGlwUmVjdChib3VuZHMpOwotCi0gICAgICAgIGZpbmFsIGludCBzcGFuID0gYm91bmRzLmJvdHRvbSAtIGJvdW5kcy50b3A7Ci0gICAgICAgIGlmIChzcGFuIDwgaGVpZ2h0KSB7Ci0gICAgICAgICAgICBib3VuZHMudG9wID0gYm91bmRzLmJvdHRvbSAtIGhlaWdodDsKLSAgICAgICAgfQotCi0gICAgICAgIGRyYXdhYmxlLnNldEJvdW5kcyhib3VuZHMpOwotICAgICAgICBkcmF3YWJsZS5kcmF3KGNhbnZhcyk7Ci0KLSAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGRyYXdPdmVyc2Nyb2xsRm9vdGVyKENhbnZhcyBjYW52YXMsIERyYXdhYmxlIGRyYXdhYmxlLCBSZWN0IGJvdW5kcykgewotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZHJhd2FibGUuZ2V0TWluaW11bUhlaWdodCgpOwotCi0gICAgICAgIGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgIGNhbnZhcy5jbGlwUmVjdChib3VuZHMpOwotCi0gICAgICAgIGZpbmFsIGludCBzcGFuID0gYm91bmRzLmJvdHRvbSAtIGJvdW5kcy50b3A7Ci0gICAgICAgIGlmIChzcGFuIDwgaGVpZ2h0KSB7Ci0gICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm91bmRzLnRvcCArIGhlaWdodDsKLSAgICAgICAgfQotCi0gICAgICAgIGRyYXdhYmxlLnNldEJvdW5kcyhib3VuZHMpOwotICAgICAgICBkcmF3YWJsZS5kcmF3KGNhbnZhcyk7Ci0KLSAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKLSAgICB9Ci0KKyAgICAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaERyYXcoQ2FudmFzIGNhbnZhcykgewogICAgICAgICAvLyBEcmF3IHRoZSBkaXZpZGVycwogICAgICAgICBmaW5hbCBpbnQgZGl2aWRlckhlaWdodCA9IG1EaXZpZGVySGVpZ2h0OwotICAgICAgICBmaW5hbCBEcmF3YWJsZSBvdmVyc2Nyb2xsSGVhZGVyID0gbU92ZXJzY3JvbGxIZWFkZXI7Ci0gICAgICAgIGZpbmFsIERyYXdhYmxlIG92ZXJzY3JvbGxGb290ZXIgPSBtT3ZlcnNjcm9sbEZvb3RlcjsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBkcmF3T3ZlcnNjcm9sbEhlYWRlciA9IG92ZXJzY3JvbGxIZWFkZXIgIT0gbnVsbDsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBkcmF3T3ZlcnNjcm9sbEZvb3RlciA9IG92ZXJzY3JvbGxGb290ZXIgIT0gbnVsbDsKICAgICAgICAgZmluYWwgYm9vbGVhbiBkcmF3RGl2aWRlcnMgPSBkaXZpZGVySGVpZ2h0ID4gMCAmJiBtRGl2aWRlciAhPSBudWxsOwogCi0gICAgICAgIGlmIChkcmF3RGl2aWRlcnMgfHwgZHJhd092ZXJzY3JvbGxIZWFkZXIgfHwgZHJhd092ZXJzY3JvbGxGb290ZXIpIHsKKyAgICAgICAgaWYgKGRyYXdEaXZpZGVycykgewogICAgICAgICAgICAgLy8gT25seSBtb2RpZnkgdGhlIHRvcCBhbmQgYm90dG9tIGluIHRoZSBsb29wLCB3ZSBzZXQgdGhlIGxlZnQgYW5kIHJpZ2h0IGhlcmUKICAgICAgICAgICAgIGZpbmFsIFJlY3QgYm91bmRzID0gbVRlbXBSZWN0OwogICAgICAgICAgICAgYm91bmRzLmxlZnQgPSBtUGFkZGluZ0xlZnQ7CkBAIC0zMDIyLDcgKzI5NjgsNyBAQAogICAgICAgICAgICAgLy8gZmlsbCBhIHJlY3Qgd2hlcmUgdGhlIGRpdmlkZXJzIHdvdWxkIGJlIGZvciBub24tc2VsZWN0YWJsZSBpdGVtcwogICAgICAgICAgICAgLy8gSWYgdGhlIGxpc3QgaXMgb3BhcXVlIGFuZCB0aGUgYmFja2dyb3VuZCBpcyBhbHNvIG9wYXF1ZSwgd2UgZG9uJ3QKICAgICAgICAgICAgIC8vIG5lZWQgdG8gZHJhdyBhbnl0aGluZyBzaW5jZSB0aGUgYmFja2dyb3VuZCB3aWxsIGRvIGl0IGZvciB1cwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBmaWxsRm9yTWlzc2luZ0RpdmlkZXJzID0gZHJhd0RpdmlkZXJzICYmIGlzT3BhcXVlKCkgJiYgIXN1cGVyLmlzT3BhcXVlKCk7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGZpbGxGb3JNaXNzaW5nRGl2aWRlcnMgPSBpc09wYXF1ZSgpICYmICFzdXBlci5pc09wYXF1ZSgpOwogCiAgICAgICAgICAgICBpZiAoZmlsbEZvck1pc3NpbmdEaXZpZGVycyAmJiBtRGl2aWRlclBhaW50ID09IG51bGwgJiYgbUlzQ2FjaGVDb2xvck9wYXF1ZSkgewogICAgICAgICAgICAgICAgIG1EaXZpZGVyUGFpbnQgPSBuZXcgUGFpbnQoKTsKQEAgLTMwMzIsNzIgKzI5NzgsNDEgQEAKIAogICAgICAgICAgICAgZmluYWwgaW50IGxpc3RCb3R0b20gPSBtQm90dG9tIC0gbVRvcCAtIG1MaXN0UGFkZGluZy5ib3R0b20gKyBtU2Nyb2xsWTsKICAgICAgICAgICAgIGlmICghbVN0YWNrRnJvbUJvdHRvbSkgewotICAgICAgICAgICAgICAgIGludCBib3R0b20gPSAwOworICAgICAgICAgICAgICAgIGludCBib3R0b207CiAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gRHJhdyB0b3AgZGl2aWRlciBvciBoZWFkZXIgZm9yIG92ZXJzY3JvbGwKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDAgJiYgc2Nyb2xsWSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXdPdmVyc2Nyb2xsSGVhZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy50b3AgPSBzY3JvbGxZOwotICAgICAgICAgICAgICAgICAgICAgICAgZHJhd092ZXJzY3JvbGxIZWFkZXIoY2FudmFzLCBvdmVyc2Nyb2xsSGVhZGVyLCBib3VuZHMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRyYXdEaXZpZGVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLmJvdHRvbSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gLWRpdmlkZXJIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcmF3RGl2aWRlcihjYW52YXMsIGJvdW5kcywgLTEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICgoaGVhZGVyRGl2aWRlcnMgfHwgZmlyc3QgKyBpID49IGhlYWRlckNvdW50KSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb290ZXJEaXZpZGVycyB8fCBmaXJzdCArIGkgPCBmb290ZXJMaW1pdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tID0gY2hpbGQuZ2V0Qm90dG9tKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBkcmF3IGRpdmlkZXJzIG5leHQgdG8gaXRlbXMgdGhhdCBhcmUgbm90IGVuYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcmF3RGl2aWRlcnMgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJvdHRvbSA8IGxpc3RCb3R0b20gJiYgIShkcmF3T3ZlcnNjcm9sbEZvb3RlciAmJiBpID09IGNvdW50IC0gMSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhcmVBbGxJdGVtc1NlbGVjdGFibGUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGFwdGVyLmlzRW5hYmxlZChmaXJzdCArIGkpICYmIChpID09IGNvdW50IC0gMSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLmlzRW5hYmxlZChmaXJzdCArIGkgKyAxKSkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm90dG9tICsgZGl2aWRlckhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0RpdmlkZXIoY2FudmFzLCBib3VuZHMsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsbEZvck1pc3NpbmdEaXZpZGVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm90dG9tICsgZGl2aWRlckhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KGJvdW5kcywgcGFpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYXJlQWxsSXRlbXNTZWxlY3RhYmxlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGFwdGVyLmlzRW5hYmxlZChmaXJzdCArIGkpICYmIChpID09IGNvdW50IC0gMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuaXNFbmFibGVkKGZpcnN0ICsgaSArIDEpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLnRvcCA9IGJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm90dG9tICsgZGl2aWRlckhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3RGl2aWRlcihjYW52YXMsIGJvdW5kcywgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGxGb3JNaXNzaW5nRGl2aWRlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBib3R0b20gKyBkaXZpZGVySGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdChib3VuZHMsIHBhaW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBvdmVyRm9vdGVyQm90dG9tID0gbUJvdHRvbSArIG1TY3JvbGxZOwotICAgICAgICAgICAgICAgIGlmIChkcmF3T3ZlcnNjcm9sbEZvb3RlciAmJiBmaXJzdCArIGNvdW50ID09IGl0ZW1Db3VudCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgb3ZlckZvb3RlckJvdHRvbSA+IGJvdHRvbSkgewotICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOwotICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gb3ZlckZvb3RlckJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgZHJhd092ZXJzY3JvbGxGb290ZXIoY2FudmFzLCBvdmVyc2Nyb2xsRm9vdGVyLCBib3VuZHMpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaW50IHRvcDsKICAgICAgICAgICAgICAgICBpbnQgbGlzdFRvcCA9IG1MaXN0UGFkZGluZy50b3A7CiAKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWSA9IG1TY3JvbGxZOwogCi0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCAmJiBkcmF3T3ZlcnNjcm9sbEhlYWRlcikgewotICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gc2Nyb2xsWTsKLSAgICAgICAgICAgICAgICAgICAgYm91bmRzLmJvdHRvbSA9IGdldENoaWxkQXQoMCkuZ2V0VG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRyYXdPdmVyc2Nyb2xsSGVhZGVyKGNhbnZhcywgb3ZlcnNjcm9sbEhlYWRlciwgYm91bmRzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3RhcnQgPSBkcmF3T3ZlcnNjcm9sbEhlYWRlciA/IDEgOiAwOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKChoZWFkZXJEaXZpZGVycyB8fCBmaXJzdCArIGkgPj0gaGVhZGVyQ291bnQpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvb3RlckRpdmlkZXJzIHx8IGZpcnN0ICsgaSA8IGZvb3RlckxpbWl0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSBjaGlsZC5nZXRUb3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGRyYXcgZGl2aWRlcnMgbmV4dCB0byBpdGVtcyB0aGF0IGFyZSBub3QgZW5hYmxlZAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXdEaXZpZGVycyAmJiB0b3AgPiBsaXN0VG9wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9wID4gbGlzdFRvcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYXJlQWxsSXRlbXNTZWxlY3RhYmxlIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRhcHRlci5pc0VuYWJsZWQoZmlyc3QgKyBpKSAmJiAoaSA9PSBjb3VudCAtIDEgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci5pc0VuYWJsZWQoZmlyc3QgKyBpICsgMSkpKSkpIHsKQEAgLTMxMTgsMTYgKzMwMzMsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwICYmIHNjcm9sbFkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkcmF3T3ZlcnNjcm9sbEZvb3RlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGFic0xpc3RCb3R0b20gPSBtQm90dG9tOwotICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLnRvcCA9IGFic0xpc3RCb3R0b207Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYWJzTGlzdEJvdHRvbSArIHNjcm9sbFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcmF3T3ZlcnNjcm9sbEZvb3RlcihjYW52YXMsIG92ZXJzY3JvbGxGb290ZXIsIGJvdW5kcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHJhd0RpdmlkZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gbGlzdEJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBsaXN0Qm90dG9tICsgZGl2aWRlckhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdEaXZpZGVyKGNhbnZhcywgYm91bmRzLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYm91bmRzLnRvcCA9IGxpc3RCb3R0b207CisgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBsaXN0Qm90dG9tICsgZGl2aWRlckhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgZHJhd0RpdmlkZXIoY2FudmFzLCBib3VuZHMsIC0xKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTMxNDgsMjAgKzMwNTYsOSBAQAogICAgIHZvaWQgZHJhd0RpdmlkZXIoQ2FudmFzIGNhbnZhcywgUmVjdCBib3VuZHMsIGludCBjaGlsZEluZGV4KSB7CiAgICAgICAgIC8vIFRoaXMgd2lkZ2V0IGRyYXdzIHRoZSBzYW1lIGRpdmlkZXIgZm9yIGFsbCBjaGlsZHJlbgogICAgICAgICBmaW5hbCBEcmF3YWJsZSBkaXZpZGVyID0gbURpdmlkZXI7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gY2xpcERpdmlkZXIgPSBtQ2xpcERpdmlkZXI7CiAKLSAgICAgICAgaWYgKCFjbGlwRGl2aWRlcikgewotICAgICAgICAgICAgZGl2aWRlci5zZXRCb3VuZHMoYm91bmRzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoYm91bmRzKTsKLSAgICAgICAgfQotCisgICAgICAgIGRpdmlkZXIuc2V0Qm91bmRzKGJvdW5kcyk7CiAgICAgICAgIGRpdmlkZXIuZHJhdyhjYW52YXMpOwotCi0gICAgICAgIGlmIChjbGlwRGl2aWRlcikgewotICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMzE4MiwxMCArMzA3OSw4IEBACiAgICAgcHVibGljIHZvaWQgc2V0RGl2aWRlcihEcmF3YWJsZSBkaXZpZGVyKSB7CiAgICAgICAgIGlmIChkaXZpZGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIG1EaXZpZGVySGVpZ2h0ID0gZGl2aWRlci5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKLSAgICAgICAgICAgIG1DbGlwRGl2aWRlciA9IGRpdmlkZXIgaW5zdGFuY2VvZiBDb2xvckRyYXdhYmxlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbURpdmlkZXJIZWlnaHQgPSAwOwotICAgICAgICAgICAgbUNsaXBEaXZpZGVyID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgbURpdmlkZXIgPSBkaXZpZGVyOwogICAgICAgICBtRGl2aWRlcklzT3BhcXVlID0gZGl2aWRlciA9PSBudWxsIHx8IGRpdmlkZXIuZ2V0T3BhY2l0eSgpID09IFBpeGVsRm9ybWF0Lk9QQVFVRTsKQEAgLTMyMzYsNDUgKzMxMzEsNiBAQAogICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgfQogICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRyYXdhYmxlIHRoYXQgd2lsbCBiZSBkcmF3biBhYm92ZSBhbGwgb3RoZXIgbGlzdCBjb250ZW50LgotICAgICAqIFRoaXMgYXJlYSBjYW4gYmVjb21lIHZpc2libGUgd2hlbiB0aGUgdXNlciBvdmVyc2Nyb2xscyB0aGUgbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoZWFkZXIgVGhlIGRyYXdhYmxlIHRvIHVzZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJzY3JvbGxIZWFkZXIoRHJhd2FibGUgaGVhZGVyKSB7Ci0gICAgICAgIG1PdmVyc2Nyb2xsSGVhZGVyID0gaGVhZGVyOwotICAgICAgICBpZiAobVNjcm9sbFkgPCAwKSB7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBkcmF3YWJsZSB0aGF0IHdpbGwgYmUgZHJhd24gYWJvdmUgYWxsIG90aGVyIGxpc3QgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBEcmF3YWJsZSBnZXRPdmVyc2Nyb2xsSGVhZGVyKCkgewotICAgICAgICByZXR1cm4gbU92ZXJzY3JvbGxIZWFkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZHJhd2FibGUgdGhhdCB3aWxsIGJlIGRyYXduIGJlbG93IGFsbCBvdGhlciBsaXN0IGNvbnRlbnQuCi0gICAgICogVGhpcyBhcmVhIGNhbiBiZWNvbWUgdmlzaWJsZSB3aGVuIHRoZSB1c2VyIG92ZXJzY3JvbGxzIHRoZSBsaXN0LAotICAgICAqIG9yIHdoZW4gdGhlIGxpc3QncyBjb250ZW50IGRvZXMgbm90IGZ1bGx5IGZpbGwgdGhlIGNvbnRhaW5lciBhcmVhLgotICAgICAqCi0gICAgICogQHBhcmFtIGZvb3RlciBUaGUgZHJhd2FibGUgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlcnNjcm9sbEZvb3RlcihEcmF3YWJsZSBmb290ZXIpIHsKLSAgICAgICAgbU92ZXJzY3JvbGxGb290ZXIgPSBmb290ZXI7Ci0gICAgICAgIGludmFsaWRhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBkcmF3YWJsZSB0aGF0IHdpbGwgYmUgZHJhd24gYmVsb3cgYWxsIG90aGVyIGxpc3QgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBEcmF3YWJsZSBnZXRPdmVyc2Nyb2xsRm9vdGVyKCkgewotICAgICAgICByZXR1cm4gbU92ZXJzY3JvbGxGb290ZXI7Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25Gb2N1c0NoYW5nZWQoYm9vbGVhbiBnYWluRm9jdXMsIGludCBkaXJlY3Rpb24sIFJlY3QgcHJldmlvdXNseUZvY3VzZWRSZWN0KSB7CiAgICAgICAgIHN1cGVyLm9uRm9jdXNDaGFuZ2VkKGdhaW5Gb2N1cywgZGlyZWN0aW9uLCBwcmV2aW91c2x5Rm9jdXNlZFJlY3QpOwpAQCAtMzQ0NSwxNzcgKzMzMDEsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY3VycmVudCBjaG9pY2UgbW9kZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q2hvaWNlTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1DaG9pY2VNb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlZmluZXMgdGhlIGNob2ljZSBiZWhhdmlvciBmb3IgdGhlIExpc3QuIEJ5IGRlZmF1bHQsIExpc3RzIGRvIG5vdCBoYXZlIGFueSBjaG9pY2UgYmVoYXZpb3IKLSAgICAgKiAoe0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfSkuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9LCB0aGUKLSAgICAgKiBMaXN0IGFsbG93cyB1cCB0byBvbmUgaXRlbSB0byAgYmUgaW4gYSBjaG9zZW4gc3RhdGUuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8KLSAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFfSwgdGhlIGxpc3QgYWxsb3dzIGFueSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgY2hvc2VuLgotICAgICAqCi0gICAgICogQHBhcmFtIGNob2ljZU1vZGUgT25lIG9mIHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0sIHtAbGluayAjQ0hPSUNFX01PREVfU0lOR0xFfSwgb3IKLSAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENob2ljZU1vZGUoaW50IGNob2ljZU1vZGUpIHsKLSAgICAgICAgbUNob2ljZU1vZGUgPSBjaG9pY2VNb2RlOwotICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSkgewotICAgICAgICAgICAgaWYgKG1DaGVja1N0YXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzID0gbmV3IFNwYXJzZUJvb2xlYW5BcnJheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgPT0gbnVsbCAmJiBtQWRhcHRlciAhPSBudWxsICYmIG1BZGFwdGVyLmhhc1N0YWJsZUlkcygpKSB7Ci0gICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1JdGVtQ2xpY2soVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKLSAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKG1DaG9pY2VNb2RlICE9IENIT0lDRV9NT0RFX05PTkUpIHsKLSAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotCi0gICAgICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIG5ld1ZhbHVlID0gIW1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24sIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMucHV0KG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbiksIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmRlbGV0ZShtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBuZXdWYWx1ZSA9ICFtQ2hlY2tTdGF0ZXMuZ2V0KHBvc2l0aW9uLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5wdXQobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EYXRhQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICByZW1lbWJlclN5bmNTdGF0ZSgpOwotICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlZCB8PSBzdXBlci5wZXJmb3JtSXRlbUNsaWNrKHZpZXcsIHBvc2l0aW9uLCBpZCk7Ci0KLSAgICAgICAgcmV0dXJuIGhhbmRsZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2hlY2tlZCBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiBUaGUgaXMgb25seSB2YWxpZCBpZgotICAgICAqIHRoZSBjaG9pY2UgbW9kZSBoYXMgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9IG9yCi0gICAgICoge0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRX0uCi0gICAgICogCi0gICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBpdGVtIHdob3NlIGNoZWNrZWQgc3RhdGUgaXMgdG8gYmUgY2hlY2tlZAotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IGNoZWNrZWQgc3RhdGUgZm9yIHRoZSBpdGVtCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SXRlbUNoZWNrZWQoaW50IHBvc2l0aW9uLCBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEUpIHsKLSAgICAgICAgICAgIG1DaGVja1N0YXRlcy5wdXQocG9zaXRpb24sIHZhbHVlKTsKLSAgICAgICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5wdXQobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmRlbGV0ZShtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBib29sZWFuIHVwZGF0ZUlkcyA9IG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKTsKLSAgICAgICAgICAgIC8vIENsZWFyIGFsbCB2YWx1ZXMgaWYgd2UncmUgY2hlY2tpbmcgc29tZXRoaW5nLCBvciB1bmNoZWNraW5nIHRoZSBjdXJyZW50bHkKLSAgICAgICAgICAgIC8vIHNlbGVjdGVkIGl0ZW0KLSAgICAgICAgICAgIGlmICh2YWx1ZSB8fCBpc0l0ZW1DaGVja2VkKHBvc2l0aW9uKSkgewotICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIGlmICh1cGRhdGVJZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHRoaXMgbWF5IGVuZCB1cCBzZWxlY3RpbmcgdGhlIHZhbHVlIHdlIGp1c3QgY2xlYXJlZCBidXQgdGhpcyB3YXkKLSAgICAgICAgICAgIC8vIHdlIGVuc3VyZSBsZW5ndGggb2YgbUNoZWNrU3RhdGVzIGlzIDEsIGEgZmFjdCBnZXRDaGVja2VkSXRlbVBvc2l0aW9uIHJlbGllcyBvbgotICAgICAgICAgICAgaWYgKHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzLnB1dChwb3NpdGlvbiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUlkcykgewotICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLnB1dChtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIERvIG5vdCBnZW5lcmF0ZSBhIGRhdGEgY2hhbmdlIHdoaWxlIHdlIGFyZSBpbiB0aGUgbGF5b3V0IHBoYXNlCi0gICAgICAgIGlmICghbUluTGF5b3V0ICYmICFtQmxvY2tMYXlvdXRSZXF1ZXN0cykgewotICAgICAgICAgICAgbURhdGFDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIHJlbWVtYmVyU3luY1N0YXRlKCk7Ci0gICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIFRoZSByZXN1bHQgaXMgb25seQotICAgICAqIHZhbGlkIGlmIHRoZSBjaG9pY2UgbW9kZSBoYXMgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9Ci0gICAgICogb3Ige0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIGl0ZW0gd2hvc2UgY2hlY2tlZCBzdGF0ZSB0byByZXR1cm4KLSAgICAgKiBAcmV0dXJuIFRoZSBpdGVtJ3MgY2hlY2tlZCBzdGF0ZSBvciA8Y29kZT5mYWxzZTwvY29kZT4gaWYgY2hvaWNlIG1vZGUKLSAgICAgKiAgICAgICAgIGlzIGludmFsaWQKLSAgICAgKgotICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSXRlbUNoZWNrZWQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FICYmIG1DaGVja1N0YXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzLmdldChwb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IGNoZWNrZWQgaXRlbS4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZSBjaG9pY2UKLSAgICAgKiBtb2RlIGhhcyBiZWVuIHNldCB0byB7QGxpbmsgI0NIT0lDRV9NT0RFX1NJTkdMRX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudGx5IGNoZWNrZWQgaXRlbSBvcgotICAgICAqICAgICAgICAge0BsaW5rICNJTlZBTElEX1BPU0lUSU9OfSBpZiBub3RoaW5nIGlzIHNlbGVjdGVkCi0gICAgICoKLSAgICAgKiBAc2VlICNzZXRDaG9pY2VNb2RlKGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENoZWNrZWRJdGVtUG9zaXRpb24oKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9TSU5HTEUgJiYgbUNoZWNrU3RhdGVzICE9IG51bGwgJiYgbUNoZWNrU3RhdGVzLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzLmtleUF0KDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIElOVkFMSURfUE9TSVRJT047Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGNoZWNrZWQgaXRlbXMgaW4gdGhlIGxpc3QuIFRoZSByZXN1bHQgaXMgb25seSB2YWxpZCBpZgotICAgICAqIHRoZSBjaG9pY2UgbW9kZSBoYXMgbm90IGJlZW4gc2V0IHRvIHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICBBIFNwYXJzZUJvb2xlYW5BcnJheSB3aGljaCB3aWxsIHJldHVybiB0cnVlIGZvciBlYWNoIGNhbGwgdG8KLSAgICAgKiAgICAgICAgICBnZXQoaW50IHBvc2l0aW9uKSB3aGVyZSBwb3NpdGlvbiBpcyBhIHBvc2l0aW9uIGluIHRoZSBsaXN0LAotICAgICAqICAgICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjaG9pY2UgbW9kZSBpcyBzZXQgdG8KLSAgICAgKiAgICAgICAgICB7QGxpbmsgI0NIT0lDRV9NT0RFX05PTkV9LgotICAgICAqLwotICAgIHB1YmxpYyBTcGFyc2VCb29sZWFuQXJyYXkgZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbnMoKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBjaGVja2VkIGl0ZW1zIGlkcy4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZQogICAgICAqIGNob2ljZSBtb2RlIGhhcyBub3QgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfS4KICAgICAgKiAKQEAgLTM2MjQsNiArMzMwOSw3IEBACiAgICAgICogICAgICAgICAKICAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRDaGVja2VkSXRlbUlkcygpfSBpbnN0ZWFkLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGxvbmdbXSBnZXRDaGVja0l0ZW1JZHMoKSB7CiAgICAgICAgIC8vIFVzZSBuZXcgYmVoYXZpb3IgdGhhdCBjb3JyZWN0bHkgaGFuZGxlcyBzdGFibGUgSUQgbWFwcGluZy4KICAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkpIHsKQEAgLTM2NTgsMTE1ICszMzQ0LDQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbmV3IGxvbmdbMF07CiAgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBjaGVja2VkIGl0ZW1zIGlkcy4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZQotICAgICAqIGNob2ljZSBtb2RlIGhhcyBub3QgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfSBhbmQgdGhlIGFkYXB0ZXIKLSAgICAgKiBoYXMgc3RhYmxlIElEcy4gKHtAbGluayBMaXN0QWRhcHRlciNoYXNTdGFibGVJZHMoKX0gPT0ge0Bjb2RlIHRydWV9KQotICAgICAqIAotICAgICAqIEByZXR1cm4gQSBuZXcgYXJyYXkgd2hpY2ggY29udGFpbnMgdGhlIGlkIG9mIGVhY2ggY2hlY2tlZCBpdGVtIGluIHRoZQotICAgICAqICAgICAgICAgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZ1tdIGdldENoZWNrZWRJdGVtSWRzKCkgewotICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTk9ORSB8fCBtQ2hlY2tlZElkU3RhdGVzID09IG51bGwgfHwgbUFkYXB0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBsb25nWzBdOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4gaWRTdGF0ZXMgPSBtQ2hlY2tlZElkU3RhdGVzOwotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBpZFN0YXRlcy5zaXplKCk7Ci0gICAgICAgIGZpbmFsIGxvbmdbXSBpZHMgPSBuZXcgbG9uZ1tjb3VudF07Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGlkc1tpXSA9IGlkU3RhdGVzLmtleUF0KGkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaWRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFyIGFueSBjaG9pY2VzIHByZXZpb3VzbHkgc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJDaG9pY2VzKCkgewotICAgICAgICBpZiAobUNoZWNrU3RhdGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBTYXZlZFN0YXRlIGV4dGVuZHMgQmFzZVNhdmVkU3RhdGUgewotICAgICAgICBTcGFyc2VCb29sZWFuQXJyYXkgY2hlY2tTdGF0ZTsKLSAgICAgICAgTG9uZ1NwYXJzZUFycmF5PEJvb2xlYW4+IGNoZWNrSWRTdGF0ZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3IgY2FsbGVkIGZyb20ge0BsaW5rIExpc3RWaWV3I29uU2F2ZUluc3RhbmNlU3RhdGUoKX0KLSAgICAgICAgICovCi0gICAgICAgIFNhdmVkU3RhdGUoUGFyY2VsYWJsZSBzdXBlclN0YXRlLCBTcGFyc2VCb29sZWFuQXJyYXkgY2hlY2tTdGF0ZSwKLSAgICAgICAgICAgICAgICBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4gY2hlY2tJZFN0YXRlKSB7Ci0gICAgICAgICAgICBzdXBlcihzdXBlclN0YXRlKTsKLSAgICAgICAgICAgIHRoaXMuY2hlY2tTdGF0ZSA9IGNoZWNrU3RhdGU7Ci0gICAgICAgICAgICB0aGlzLmNoZWNrSWRTdGF0ZSA9IGNoZWNrSWRTdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RvciBjYWxsZWQgZnJvbSB7QGxpbmsgI0NSRUFUT1J9Ci0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFNhdmVkU3RhdGUoUGFyY2VsIGluKSB7Ci0gICAgICAgICAgICBzdXBlcihpbik7Ci0gICAgICAgICAgICBjaGVja1N0YXRlID0gaW4ucmVhZFNwYXJzZUJvb2xlYW5BcnJheSgpOwotICAgICAgICAgICAgbG9uZ1tdIGlkU3RhdGUgPSBpbi5jcmVhdGVMb25nQXJyYXkoKTsKLQotICAgICAgICAgICAgaWYgKGlkU3RhdGUubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGNoZWNrSWRTdGF0ZSA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKLSAgICAgICAgICAgICAgICBjaGVja0lkU3RhdGUuc2V0VmFsdWVzKGlkU3RhdGUsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgb3V0LCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgICAgIHN1cGVyLndyaXRlVG9QYXJjZWwob3V0LCBmbGFncyk7Ci0gICAgICAgICAgICBvdXQud3JpdGVTcGFyc2VCb29sZWFuQXJyYXkoY2hlY2tTdGF0ZSk7Ci0gICAgICAgICAgICBvdXQud3JpdGVMb25nQXJyYXkoY2hlY2tJZFN0YXRlICE9IG51bGwgPyBjaGVja0lkU3RhdGUuZ2V0S2V5cygpIDogbmV3IGxvbmdbMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkxpc3RWaWV3LlNhdmVkU3RhdGV7IgotICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcykpCi0gICAgICAgICAgICAgICAgICAgICsgIiBjaGVja1N0YXRlPSIgKyBjaGVja1N0YXRlICsgIn0iOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUgotICAgICAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlKGluKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZVtzaXplXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUGFyY2VsYWJsZSBvblNhdmVJbnN0YW5jZVN0YXRlKCkgewotICAgICAgICBQYXJjZWxhYmxlIHN1cGVyU3RhdGUgPSBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKCk7Ci0gICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZShzdXBlclN0YXRlLCBtQ2hlY2tTdGF0ZXMsIG1DaGVja2VkSWRTdGF0ZXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoUGFyY2VsYWJsZSBzdGF0ZSkgewotICAgICAgICBTYXZlZFN0YXRlIHNzID0gKFNhdmVkU3RhdGUpIHN0YXRlOwotCi0gICAgICAgIHN1cGVyLm9uUmVzdG9yZUluc3RhbmNlU3RhdGUoc3MuZ2V0U3VwZXJTdGF0ZSgpKTsKLQotICAgICAgICBpZiAoc3MuY2hlY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgIG1DaGVja1N0YXRlcyA9IHNzLmNoZWNrU3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3MuY2hlY2tJZFN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMgPSBzcy5jaGVja0lkU3RhdGU7Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvT3ZlclNjcm9sbGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvT3ZlclNjcm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OTczYWQuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L092ZXJTY3JvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5GbG9hdE1hdGg7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgc2Nyb2xsaW5nIHdpdGggdGhlIGFiaWxpdHkgdG8gb3ZlcnNob290IHRoZSBib3VuZHMKLSAqIG9mIGEgc2Nyb2xsaW5nIG9wZXJhdGlvbi4gVGhpcyBjbGFzcyBpcyBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yCi0gKiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuU2Nyb2xsZXJ9IGluIG1vc3QgY2FzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBPdmVyU2Nyb2xsZXIgewotICAgIHByaXZhdGUgaW50IG1Nb2RlOwotCi0gICAgcHJpdmF0ZSBNYWduZXRpY092ZXJTY3JvbGxlciBtU2Nyb2xsZXJYOwotICAgIHByaXZhdGUgTWFnbmV0aWNPdmVyU2Nyb2xsZXIgbVNjcm9sbGVyWTsKLQotICAgIHByaXZhdGUgZmluYWwgSW50ZXJwb2xhdG9yIG1JbnRlcnBvbGF0b3I7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9EVVJBVElPTiA9IDI1MDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX01PREUgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTElOR19NT0RFID0gMTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gT3ZlclNjcm9sbGVyIHdpdGggYSB2aXNjb3VzIGZsdWlkIHNjcm9sbCBpbnRlcnBvbGF0b3IuCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgT3ZlclNjcm9sbGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gT3ZlclNjcm9sbGVyIHdpdGggZGVmYXVsdCBlZGdlIGJvdW5jZSBjb2VmZmljaWVudHMuCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhpcyBhcHBsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gaW50ZXJwb2xhdG9yIFRoZSBzY3JvbGwgaW50ZXJwb2xhdG9yLiBJZiBudWxsLCBhIGRlZmF1bHQgKHZpc2NvdXMpIGludGVycG9sYXRvciB3aWxsCi0gICAgICogYmUgdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT3ZlclNjcm9sbGVyKENvbnRleHQgY29udGV4dCwgSW50ZXJwb2xhdG9yIGludGVycG9sYXRvcikgewotICAgICAgICB0aGlzKGNvbnRleHQsIGludGVycG9sYXRvciwgTWFnbmV0aWNPdmVyU2Nyb2xsZXIuREVGQVVMVF9CT1VOQ0VfQ09FRkZJQ0lFTlQsCi0gICAgICAgICAgICAgICAgTWFnbmV0aWNPdmVyU2Nyb2xsZXIuREVGQVVMVF9CT1VOQ0VfQ09FRkZJQ0lFTlQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gT3ZlclNjcm9sbGVyLgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoaXMgYXBwbGljYXRpb24uCi0gICAgICogQHBhcmFtIGludGVycG9sYXRvciBUaGUgc2Nyb2xsIGludGVycG9sYXRvci4gSWYgbnVsbCwgYSBkZWZhdWx0ICh2aXNjb3VzKSBpbnRlcnBvbGF0b3Igd2lsbAotICAgICAqIGJlIHVzZWQuCi0gICAgICogQHBhcmFtIGJvdW5jZUNvZWZmaWNpZW50WCBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMSB0aGF0IHdpbGwgZGV0ZXJtaW5lIHRoZSBwcm9wb3J0aW9uIG9mIHRoZQotICAgICAqIHZlbG9jaXR5IHdoaWNoIGlzIHByZXNlcnZlZCBpbiB0aGUgYm91bmNlIHdoZW4gdGhlIGhvcml6b250YWwgZWRnZSBpcyByZWFjaGVkLiBBIG51bGwgdmFsdWUKLSAgICAgKiBtZWFucyBubyBib3VuY2UuCi0gICAgICogQHBhcmFtIGJvdW5jZUNvZWZmaWNpZW50WSBTYW1lIGFzIGJvdW5jZUNvZWZmaWNpZW50WCBidXQgZm9yIHRoZSB2ZXJ0aWNhbCBkaXJlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIE92ZXJTY3JvbGxlcihDb250ZXh0IGNvbnRleHQsIEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IsCi0gICAgICAgICAgICBmbG9hdCBib3VuY2VDb2VmZmljaWVudFgsIGZsb2F0IGJvdW5jZUNvZWZmaWNpZW50WSkgewotICAgICAgICBtSW50ZXJwb2xhdG9yID0gaW50ZXJwb2xhdG9yOwotICAgICAgICBtU2Nyb2xsZXJYID0gbmV3IE1hZ25ldGljT3ZlclNjcm9sbGVyKCk7Ci0gICAgICAgIG1TY3JvbGxlclkgPSBuZXcgTWFnbmV0aWNPdmVyU2Nyb2xsZXIoKTsKLSAgICAgICAgTWFnbmV0aWNPdmVyU2Nyb2xsZXIuaW5pdGlhbGl6ZUZyb21Db250ZXh0KGNvbnRleHQpOwotCi0gICAgICAgIG1TY3JvbGxlclguc2V0Qm91bmNlQ29lZmZpY2llbnQoYm91bmNlQ29lZmZpY2llbnRYKTsKLSAgICAgICAgbVNjcm9sbGVyWS5zZXRCb3VuY2VDb2VmZmljaWVudChib3VuY2VDb2VmZmljaWVudFkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzY3JvbGxlciBoYXMgZmluaXNoZWQgc2Nyb2xsaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzY3JvbGxlciBoYXMgZmluaXNoZWQgc2Nyb2xsaW5nLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1TY3JvbGxlclgubUZpbmlzaGVkICYmIG1TY3JvbGxlclkubUZpbmlzaGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcmNlIHRoZSBmaW5pc2hlZCBmaWVsZCB0byBhIHBhcnRpY3VsYXIgdmFsdWUuIENvbnRyYXJ5IHRvCi0gICAgICoge0BsaW5rICNhYm9ydEFuaW1hdGlvbigpfSwgZm9yY2luZyB0aGUgYW5pbWF0aW9uIHRvIGZpbmlzaGVkCi0gICAgICogZG9lcyBOT1QgY2F1c2UgdGhlIHNjcm9sbGVyIHRvIG1vdmUgdG8gdGhlIGZpbmFsIHggYW5kIHkKLSAgICAgKiBwb3NpdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaW5pc2hlZCBUaGUgbmV3IGZpbmlzaGVkIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGZvcmNlRmluaXNoZWQoYm9vbGVhbiBmaW5pc2hlZCkgewotICAgICAgICBtU2Nyb2xsZXJYLm1GaW5pc2hlZCA9IG1TY3JvbGxlclkubUZpbmlzaGVkID0gZmluaXNoZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBYIG9mZnNldCBpbiB0aGUgc2Nyb2xsLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbmV3IFggb2Zmc2V0IGFzIGFuIGFic29sdXRlIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldEN1cnJYKCkgewotICAgICAgICByZXR1cm4gbVNjcm9sbGVyWC5tQ3VycmVudFBvc2l0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgWSBvZmZzZXQgaW4gdGhlIHNjcm9sbC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBZIG9mZnNldCBhcyBhbiBhYnNvbHV0ZSBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRDdXJyWSgpIHsKLSAgICAgICAgcmV0dXJuIG1TY3JvbGxlclkubUN1cnJlbnRQb3NpdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmVsb2NpdHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBvcmlnaW5hbCB2ZWxvY2l0eSBsZXNzIHRoZSBkZWNlbGVyYXRpb24sIG5vcm0gb2YgdGhlIFggYW5kIFkgdmVsb2NpdHkgdmVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBmbG9hdCBnZXRDdXJyVmVsb2NpdHkoKSB7Ci0gICAgICAgIGZsb2F0IHNxdWFyZWROb3JtID0gbVNjcm9sbGVyWC5tQ3VyclZlbG9jaXR5ICogbVNjcm9sbGVyWC5tQ3VyclZlbG9jaXR5OwotICAgICAgICBzcXVhcmVkTm9ybSArPSBtU2Nyb2xsZXJZLm1DdXJyVmVsb2NpdHkgKiBtU2Nyb2xsZXJZLm1DdXJyVmVsb2NpdHk7Ci0gICAgICAgIHJldHVybiBGbG9hdE1hdGguc3FydChzcXVhcmVkTm9ybSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RhcnQgWCBvZmZzZXQgaW4gdGhlIHNjcm9sbC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHN0YXJ0IFggb2Zmc2V0IGFzIGFuIGFic29sdXRlIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFN0YXJ0WCgpIHsKLSAgICAgICAgcmV0dXJuIG1TY3JvbGxlclgubVN0YXJ0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0YXJ0IFkgb2Zmc2V0IGluIHRoZSBzY3JvbGwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzdGFydCBZIG9mZnNldCBhcyBhbiBhYnNvbHV0ZSBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRTdGFydFkoKSB7Ci0gICAgICAgIHJldHVybiBtU2Nyb2xsZXJZLm1TdGFydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXJlIHRoZSBzY3JvbGwgd2lsbCBlbmQuIFZhbGlkIG9ubHkgZm9yICJmbGluZyIgc2Nyb2xscy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGZpbmFsIFggb2Zmc2V0IGFzIGFuIGFic29sdXRlIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldEZpbmFsWCgpIHsKLSAgICAgICAgcmV0dXJuIG1TY3JvbGxlclgubUZpbmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hlcmUgdGhlIHNjcm9sbCB3aWxsIGVuZC4gVmFsaWQgb25seSBmb3IgImZsaW5nIiBzY3JvbGxzLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZmluYWwgWSBvZmZzZXQgYXMgYW4gYWJzb2x1dGUgZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RmluYWxZKCkgewotICAgICAgICByZXR1cm4gbVNjcm9sbGVyWS5tRmluYWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBob3cgbG9uZyB0aGUgc2Nyb2xsIGV2ZW50IHdpbGwgdGFrZSwgaW4gbWlsbGlzZWNvbmRzLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZHVyYXRpb24gb2YgdGhlIHNjcm9sbCBpbiBtaWxsaXNlY29uZHMuCi0gICAgICoKLSAgICAgKiBAaGlkZSBQZW5kaW5nIHJlbW92YWwgb25jZSBub3RoaW5nIGRlcGVuZHMgb24gaXQKLSAgICAgKiBAZGVwcmVjYXRlZCBPdmVyU2Nyb2xsZXJzIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgYSBmaXhlZCBkdXJhdGlvbi4KLSAgICAgKiAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgbGllIHRvIHRoZSBiZXN0IG9mIGl0cyBhYmlsaXR5LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RHVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBNYXRoLm1heChtU2Nyb2xsZXJYLm1EdXJhdGlvbiwgbVNjcm9sbGVyWS5tRHVyYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4dGVuZCB0aGUgc2Nyb2xsIGFuaW1hdGlvbi4gVGhpcyBhbGxvd3MgYSBydW5uaW5nIGFuaW1hdGlvbiB0byBzY3JvbGwKLSAgICAgKiBmdXJ0aGVyIGFuZCBsb25nZXIsIHdoZW4gdXNlZCB3aXRoIHtAbGluayAjc2V0RmluYWxYKGludCl9IG9yIHtAbGluayAjc2V0RmluYWxZKGludCl9LgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dGVuZCBBZGRpdGlvbmFsIHRpbWUgdG8gc2Nyb2xsIGluIG1pbGxpc2Vjb25kcy4KLSAgICAgKiBAc2VlICNzZXRGaW5hbFgoaW50KQotICAgICAqIEBzZWUgI3NldEZpbmFsWShpbnQpCi0gICAgICoKLSAgICAgKiBAaGlkZSBQZW5kaW5nIHJlbW92YWwgb25jZSBub3RoaW5nIGRlcGVuZHMgb24gaXQKLSAgICAgKiBAZGVwcmVjYXRlZCBPdmVyU2Nyb2xsZXJzIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgYSBmaXhlZCBkdXJhdGlvbi4KLSAgICAgKiAgICAgICAgICAgICBJbnN0ZWFkIG9mIHNldHRpbmcgYSBuZXcgZmluYWwgcG9zaXRpb24gYW5kIGV4dGVuZGluZwotICAgICAqICAgICAgICAgICAgIHRoZSBkdXJhdGlvbiBvZiBhbiBleGlzdGluZyBzY3JvbGwsIHVzZSBzdGFydFNjcm9sbAotICAgICAqICAgICAgICAgICAgIHRvIGJlZ2luIGEgbmV3IGFuaW1hdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleHRlbmREdXJhdGlvbihpbnQgZXh0ZW5kKSB7Ci0gICAgICAgIG1TY3JvbGxlclguZXh0ZW5kRHVyYXRpb24oZXh0ZW5kKTsKLSAgICAgICAgbVNjcm9sbGVyWS5leHRlbmREdXJhdGlvbihleHRlbmQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZpbmFsIHBvc2l0aW9uIChYKSBmb3IgdGhpcyBzY3JvbGxlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXdYIFRoZSBuZXcgWCBvZmZzZXQgYXMgYW4gYWJzb2x1dGUgZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luLgotICAgICAqIEBzZWUgI2V4dGVuZER1cmF0aW9uKGludCkKLSAgICAgKiBAc2VlICNzZXRGaW5hbFkoaW50KQotICAgICAqCi0gICAgICogQGhpZGUgUGVuZGluZyByZW1vdmFsIG9uY2Ugbm90aGluZyBkZXBlbmRzIG9uIGl0Ci0gICAgICogQGRlcHJlY2F0ZWQgT3ZlclNjcm9sbGVyJ3MgZmluYWwgcG9zaXRpb24gbWF5IGNoYW5nZSBkdXJpbmcgYW4gYW5pbWF0aW9uLgotICAgICAqICAgICAgICAgICAgIEluc3RlYWQgb2Ygc2V0dGluZyBhIG5ldyBmaW5hbCBwb3NpdGlvbiBhbmQgZXh0ZW5kaW5nCi0gICAgICogICAgICAgICAgICAgdGhlIGR1cmF0aW9uIG9mIGFuIGV4aXN0aW5nIHNjcm9sbCwgdXNlIHN0YXJ0U2Nyb2xsCi0gICAgICogICAgICAgICAgICAgdG8gYmVnaW4gYSBuZXcgYW5pbWF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbmFsWChpbnQgbmV3WCkgewotICAgICAgICBtU2Nyb2xsZXJYLnNldEZpbmFsUG9zaXRpb24obmV3WCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmluYWwgcG9zaXRpb24gKFkpIGZvciB0aGlzIHNjcm9sbGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIG5ld1kgVGhlIG5ldyBZIG9mZnNldCBhcyBhbiBhYnNvbHV0ZSBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4uCi0gICAgICogQHNlZSAjZXh0ZW5kRHVyYXRpb24oaW50KQotICAgICAqIEBzZWUgI3NldEZpbmFsWChpbnQpCi0gICAgICoKLSAgICAgKiBAaGlkZSBQZW5kaW5nIHJlbW92YWwgb25jZSBub3RoaW5nIGRlcGVuZHMgb24gaXQKLSAgICAgKiBAZGVwcmVjYXRlZCBPdmVyU2Nyb2xsZXIncyBmaW5hbCBwb3NpdGlvbiBtYXkgY2hhbmdlIGR1cmluZyBhbiBhbmltYXRpb24uCi0gICAgICogICAgICAgICAgICAgSW5zdGVhZCBvZiBzZXR0aW5nIGEgbmV3IGZpbmFsIHBvc2l0aW9uIGFuZCBleHRlbmRpbmcKLSAgICAgKiAgICAgICAgICAgICB0aGUgZHVyYXRpb24gb2YgYW4gZXhpc3Rpbmcgc2Nyb2xsLCB1c2Ugc3RhcnRTY3JvbGwKLSAgICAgKiAgICAgICAgICAgICB0byBiZWdpbiBhIG5ldyBhbmltYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmluYWxZKGludCBuZXdZKSB7Ci0gICAgICAgIG1TY3JvbGxlclkuc2V0RmluYWxQb3NpdGlvbihuZXdZKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsIHRoaXMgd2hlbiB5b3Ugd2FudCB0byBrbm93IHRoZSBuZXcgbG9jYXRpb24uIElmIGl0IHJldHVybnMgdHJ1ZSwgdGhlCi0gICAgICogYW5pbWF0aW9uIGlzIG5vdCB5ZXQgZmluaXNoZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29tcHV0ZVNjcm9sbE9mZnNldCgpIHsKLSAgICAgICAgaWYgKGlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChtTW9kZSkgewotICAgICAgICAgICAgY2FzZSBTQ1JPTExfTU9ERToKLSAgICAgICAgICAgICAgICBsb25nIHRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIC8vIEFueSBzY3JvbGxlciBjYW4gYmUgdXNlZCBmb3IgdGltZSwgc2luY2UgdGhleSB3ZXJlIHN0YXJ0ZWQKLSAgICAgICAgICAgICAgICAvLyB0b2dldGhlciBpbiBzY3JvbGwgbW9kZS4gV2UgdXNlIFggaGVyZS4KLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGVsYXBzZWRUaW1lID0gdGltZSAtIG1TY3JvbGxlclgubVN0YXJ0VGltZTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBkdXJhdGlvbiA9IG1TY3JvbGxlclgubUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIGlmIChlbGFwc2VkVGltZSA8IGR1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IHEgPSAoZmxvYXQpIChlbGFwc2VkVGltZSkgLyBkdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobUludGVycG9sYXRvciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgcSA9IFNjcm9sbGVyLnZpc2NvdXNGbHVpZChxKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcSA9IG1JbnRlcnBvbGF0b3IuZ2V0SW50ZXJwb2xhdGlvbihxKTsKLQotICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsZXJYLnVwZGF0ZVNjcm9sbChxKTsKLSAgICAgICAgICAgICAgICAgICAgbVNjcm9sbGVyWS51cGRhdGVTY3JvbGwocSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWJvcnRBbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRkxJTkdfTU9ERToKLSAgICAgICAgICAgICAgICBpZiAoIW1TY3JvbGxlclgubUZpbmlzaGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVNjcm9sbGVyWC51cGRhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtU2Nyb2xsZXJYLmNvbnRpbnVlV2hlbkZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsZXJYLmZpbmlzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFtU2Nyb2xsZXJZLm1GaW5pc2hlZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIW1TY3JvbGxlclkudXBkYXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbVNjcm9sbGVyWS5jb250aW51ZVdoZW5GaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbGVyWS5maW5pc2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgc2Nyb2xsaW5nIGJ5IHByb3ZpZGluZyBhIHN0YXJ0aW5nIHBvaW50IGFuZCB0aGUgZGlzdGFuY2UgdG8gdHJhdmVsLgotICAgICAqIFRoZSBzY3JvbGwgd2lsbCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgMjUwIG1pbGxpc2Vjb25kcyBmb3IgdGhlCi0gICAgICogZHVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRYIFN0YXJ0aW5nIGhvcml6b250YWwgc2Nyb2xsIG9mZnNldCBpbiBwaXhlbHMuIFBvc2l0aXZlCi0gICAgICogICAgICAgIG51bWJlcnMgd2lsbCBzY3JvbGwgdGhlIGNvbnRlbnQgdG8gdGhlIGxlZnQuCi0gICAgICogQHBhcmFtIHN0YXJ0WSBTdGFydGluZyB2ZXJ0aWNhbCBzY3JvbGwgb2Zmc2V0IGluIHBpeGVscy4gUG9zaXRpdmUgbnVtYmVycwotICAgICAqICAgICAgICB3aWxsIHNjcm9sbCB0aGUgY29udGVudCB1cC4KLSAgICAgKiBAcGFyYW0gZHggSG9yaXpvbnRhbCBkaXN0YW5jZSB0byB0cmF2ZWwuIFBvc2l0aXZlIG51bWJlcnMgd2lsbCBzY3JvbGwgdGhlCi0gICAgICogICAgICAgIGNvbnRlbnQgdG8gdGhlIGxlZnQuCi0gICAgICogQHBhcmFtIGR5IFZlcnRpY2FsIGRpc3RhbmNlIHRvIHRyYXZlbC4gUG9zaXRpdmUgbnVtYmVycyB3aWxsIHNjcm9sbCB0aGUKLSAgICAgKiAgICAgICAgY29udGVudCB1cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFNjcm9sbChpbnQgc3RhcnRYLCBpbnQgc3RhcnRZLCBpbnQgZHgsIGludCBkeSkgewotICAgICAgICBzdGFydFNjcm9sbChzdGFydFgsIHN0YXJ0WSwgZHgsIGR5LCBERUZBVUxUX0RVUkFUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBzY3JvbGxpbmcgYnkgcHJvdmlkaW5nIGEgc3RhcnRpbmcgcG9pbnQgYW5kIHRoZSBkaXN0YW5jZSB0byB0cmF2ZWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRYIFN0YXJ0aW5nIGhvcml6b250YWwgc2Nyb2xsIG9mZnNldCBpbiBwaXhlbHMuIFBvc2l0aXZlCi0gICAgICogICAgICAgIG51bWJlcnMgd2lsbCBzY3JvbGwgdGhlIGNvbnRlbnQgdG8gdGhlIGxlZnQuCi0gICAgICogQHBhcmFtIHN0YXJ0WSBTdGFydGluZyB2ZXJ0aWNhbCBzY3JvbGwgb2Zmc2V0IGluIHBpeGVscy4gUG9zaXRpdmUgbnVtYmVycwotICAgICAqICAgICAgICB3aWxsIHNjcm9sbCB0aGUgY29udGVudCB1cC4KLSAgICAgKiBAcGFyYW0gZHggSG9yaXpvbnRhbCBkaXN0YW5jZSB0byB0cmF2ZWwuIFBvc2l0aXZlIG51bWJlcnMgd2lsbCBzY3JvbGwgdGhlCi0gICAgICogICAgICAgIGNvbnRlbnQgdG8gdGhlIGxlZnQuCi0gICAgICogQHBhcmFtIGR5IFZlcnRpY2FsIGRpc3RhbmNlIHRvIHRyYXZlbC4gUG9zaXRpdmUgbnVtYmVycyB3aWxsIHNjcm9sbCB0aGUKLSAgICAgKiAgICAgICAgY29udGVudCB1cC4KLSAgICAgKiBAcGFyYW0gZHVyYXRpb24gRHVyYXRpb24gb2YgdGhlIHNjcm9sbCBpbiBtaWxsaXNlY29uZHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRTY3JvbGwoaW50IHN0YXJ0WCwgaW50IHN0YXJ0WSwgaW50IGR4LCBpbnQgZHksIGludCBkdXJhdGlvbikgewotICAgICAgICBtTW9kZSA9IFNDUk9MTF9NT0RFOwotICAgICAgICBtU2Nyb2xsZXJYLnN0YXJ0U2Nyb2xsKHN0YXJ0WCwgZHgsIGR1cmF0aW9uKTsKLSAgICAgICAgbVNjcm9sbGVyWS5zdGFydFNjcm9sbChzdGFydFksIGR5LCBkdXJhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbCB0aGlzIHdoZW4geW91IHdhbnQgdG8gJ3NwcmluZyBiYWNrJyBpbnRvIGEgdmFsaWQgY29vcmRpbmF0ZSByYW5nZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdGFydFggU3RhcnRpbmcgWCBjb29yZGluYXRlCi0gICAgICogQHBhcmFtIHN0YXJ0WSBTdGFydGluZyBZIGNvb3JkaW5hdGUKLSAgICAgKiBAcGFyYW0gbWluWCBNaW5pbXVtIHZhbGlkIFggdmFsdWUKLSAgICAgKiBAcGFyYW0gbWF4WCBNYXhpbXVtIHZhbGlkIFggdmFsdWUKLSAgICAgKiBAcGFyYW0gbWluWSBNaW5pbXVtIHZhbGlkIFkgdmFsdWUKLSAgICAgKiBAcGFyYW0gbWF4WSBNaW5pbXVtIHZhbGlkIFkgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSBzcHJpbmdiYWNrIHdhcyBpbml0aWF0ZWQsIGZhbHNlIGlmIHN0YXJ0WCBhbmQgc3RhcnRZIHdlcmUKLSAgICAgKiAgICAgICAgICBhbHJlYWR5IHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3ByaW5nYmFjayhpbnQgc3RhcnRYLCBpbnQgc3RhcnRZLCBpbnQgbWluWCwgaW50IG1heFgsIGludCBtaW5ZLCBpbnQgbWF4WSkgewotICAgICAgICBtTW9kZSA9IEZMSU5HX01PREU7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIGJvdGggbWV0aG9kcyBhcmUgY2FsbGVkLgotICAgICAgICBmaW5hbCBib29sZWFuIHNwaW5nYmFja1ggPSBtU2Nyb2xsZXJYLnNwcmluZ2JhY2soc3RhcnRYLCBtaW5YLCBtYXhYKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBzcGluZ2JhY2tZID0gbVNjcm9sbGVyWS5zcHJpbmdiYWNrKHN0YXJ0WSwgbWluWSwgbWF4WSk7Ci0gICAgICAgIHJldHVybiBzcGluZ2JhY2tYIHx8IHNwaW5nYmFja1k7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmxpbmcoaW50IHN0YXJ0WCwgaW50IHN0YXJ0WSwgaW50IHZlbG9jaXR5WCwgaW50IHZlbG9jaXR5WSwKLSAgICAgICAgICAgIGludCBtaW5YLCBpbnQgbWF4WCwgaW50IG1pblksIGludCBtYXhZKSB7Ci0gICAgICAgIGZsaW5nKHN0YXJ0WCwgc3RhcnRZLCB2ZWxvY2l0eVgsIHZlbG9jaXR5WSwgbWluWCwgbWF4WCwgbWluWSwgbWF4WSwgMCwgMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgc2Nyb2xsaW5nIGJhc2VkIG9uIGEgZmxpbmcgZ2VzdHVyZS4gVGhlIGRpc3RhbmNlIHRyYXZlbGVkIHdpbGwKLSAgICAgKiBkZXBlbmQgb24gdGhlIGluaXRpYWwgdmVsb2NpdHkgb2YgdGhlIGZsaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXJ0WCBTdGFydGluZyBwb2ludCBvZiB0aGUgc2Nyb2xsIChYKQotICAgICAqIEBwYXJhbSBzdGFydFkgU3RhcnRpbmcgcG9pbnQgb2YgdGhlIHNjcm9sbCAoWSkKLSAgICAgKiBAcGFyYW0gdmVsb2NpdHlYIEluaXRpYWwgdmVsb2NpdHkgb2YgdGhlIGZsaW5nIChYKSBtZWFzdXJlZCBpbiBwaXhlbHMgcGVyCi0gICAgICogICAgICAgICAgICBzZWNvbmQuCi0gICAgICogQHBhcmFtIHZlbG9jaXR5WSBJbml0aWFsIHZlbG9jaXR5IG9mIHRoZSBmbGluZyAoWSkgbWVhc3VyZWQgaW4gcGl4ZWxzIHBlcgotICAgICAqICAgICAgICAgICAgc2Vjb25kCi0gICAgICogQHBhcmFtIG1pblggTWluaW11bSBYIHZhbHVlLiBUaGUgc2Nyb2xsZXIgd2lsbCBub3Qgc2Nyb2xsIHBhc3QgdGhpcyBwb2ludAotICAgICAqICAgICAgICAgICAgdW5sZXNzIG92ZXJYID4gMC4gSWYgb3ZlcmZsaW5nIGlzIGFsbG93ZWQsIGl0IHdpbGwgdXNlIG1pblggYXMKLSAgICAgKiAgICAgICAgICAgIGEgc3ByaW5nYmFjayBib3VuZGFyeS4KLSAgICAgKiBAcGFyYW0gbWF4WCBNYXhpbXVtIFggdmFsdWUuIFRoZSBzY3JvbGxlciB3aWxsIG5vdCBzY3JvbGwgcGFzdCB0aGlzIHBvaW50Ci0gICAgICogICAgICAgICAgICB1bmxlc3Mgb3ZlclggPiAwLiBJZiBvdmVyZmxpbmcgaXMgYWxsb3dlZCwgaXQgd2lsbCB1c2UgbWF4WCBhcwotICAgICAqICAgICAgICAgICAgYSBzcHJpbmdiYWNrIGJvdW5kYXJ5LgotICAgICAqIEBwYXJhbSBtaW5ZIE1pbmltdW0gWSB2YWx1ZS4gVGhlIHNjcm9sbGVyIHdpbGwgbm90IHNjcm9sbCBwYXN0IHRoaXMgcG9pbnQKLSAgICAgKiAgICAgICAgICAgIHVubGVzcyBvdmVyWSA+IDAuIElmIG92ZXJmbGluZyBpcyBhbGxvd2VkLCBpdCB3aWxsIHVzZSBtaW5ZIGFzCi0gICAgICogICAgICAgICAgICBhIHNwcmluZ2JhY2sgYm91bmRhcnkuCi0gICAgICogQHBhcmFtIG1heFkgTWF4aW11bSBZIHZhbHVlLiBUaGUgc2Nyb2xsZXIgd2lsbCBub3Qgc2Nyb2xsIHBhc3QgdGhpcyBwb2ludAotICAgICAqICAgICAgICAgICAgdW5sZXNzIG92ZXJZID4gMC4gSWYgb3ZlcmZsaW5nIGlzIGFsbG93ZWQsIGl0IHdpbGwgdXNlIG1heFkgYXMKLSAgICAgKiAgICAgICAgICAgIGEgc3ByaW5nYmFjayBib3VuZGFyeS4KLSAgICAgKiBAcGFyYW0gb3ZlclggT3ZlcmZsaW5nIHJhbmdlLiBJZiA+IDAsIGhvcml6b250YWwgb3ZlcmZsaW5nIGluIGVpdGhlcgotICAgICAqICAgICAgICAgICAgZGlyZWN0aW9uIHdpbGwgYmUgcG9zc2libGUuCi0gICAgICogQHBhcmFtIG92ZXJZIE92ZXJmbGluZyByYW5nZS4gSWYgPiAwLCB2ZXJ0aWNhbCBvdmVyZmxpbmcgaW4gZWl0aGVyCi0gICAgICogICAgICAgICAgICBkaXJlY3Rpb24gd2lsbCBiZSBwb3NzaWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmbGluZyhpbnQgc3RhcnRYLCBpbnQgc3RhcnRZLCBpbnQgdmVsb2NpdHlYLCBpbnQgdmVsb2NpdHlZLAotICAgICAgICAgICAgaW50IG1pblgsIGludCBtYXhYLCBpbnQgbWluWSwgaW50IG1heFksIGludCBvdmVyWCwgaW50IG92ZXJZKSB7Ci0gICAgICAgIG1Nb2RlID0gRkxJTkdfTU9ERTsKLSAgICAgICAgbVNjcm9sbGVyWC5mbGluZyhzdGFydFgsIHZlbG9jaXR5WCwgbWluWCwgbWF4WCwgb3ZlclgpOwotICAgICAgICBtU2Nyb2xsZXJZLmZsaW5nKHN0YXJ0WSwgdmVsb2NpdHlZLCBtaW5ZLCBtYXhZLCBvdmVyWSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZ5IHRoZSBzY3JvbGxlciB0aGF0IHdlJ3ZlIHJlYWNoZWQgYSBob3Jpem9udGFsIGJvdW5kYXJ5LgotICAgICAqIE5vcm1hbGx5IHRoZSBpbmZvcm1hdGlvbiB0byBoYW5kbGUgdGhpcyB3aWxsIGFscmVhZHkgYmUga25vd24KLSAgICAgKiB3aGVuIHRoZSBhbmltYXRpb24gaXMgc3RhcnRlZCwgc3VjaCBhcyBpbiBhIGNhbGwgdG8gb25lIG9mIHRoZQotICAgICAqIGZsaW5nIGZ1bmN0aW9ucy4gSG93ZXZlciB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhpcyBjYW5ub3QgYmUga25vd24KLSAgICAgKiBpbiBhZHZhbmNlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdHJhbnNpdGlvbiB0aGUgY3VycmVudCBtb3Rpb24gYW5kCi0gICAgICogYW5pbWF0ZSBmcm9tIHN0YXJ0WCB0byBmaW5hbFggYXMgYXBwcm9wcmlhdGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRYIFN0YXJ0aW5nL2N1cnJlbnQgWCBwb3NpdGlvbgotICAgICAqIEBwYXJhbSBmaW5hbFggRGVzaXJlZCBmaW5hbCBYIHBvc2l0aW9uCi0gICAgICogQHBhcmFtIG92ZXJYIE1hZ25pdHVkZSBvZiBvdmVyc2Nyb2xsIGFsbG93ZWQuIFRoaXMgc2hvdWxkIGJlIHRoZSBtYXhpbXVtCi0gICAgICogICAgICAgICAgICAgIGRlc2lyZWQgZGlzdGFuY2UgZnJvbSBmaW5hbFguIEFic29sdXRlIHZhbHVlIC0gbXVzdCBiZSBwb3NpdGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlIb3Jpem9udGFsRWRnZVJlYWNoZWQoaW50IHN0YXJ0WCwgaW50IGZpbmFsWCwgaW50IG92ZXJYKSB7Ci0gICAgICAgIG1TY3JvbGxlclgubm90aWZ5RWRnZVJlYWNoZWQoc3RhcnRYLCBmaW5hbFgsIG92ZXJYKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZnkgdGhlIHNjcm9sbGVyIHRoYXQgd2UndmUgcmVhY2hlZCBhIHZlcnRpY2FsIGJvdW5kYXJ5LgotICAgICAqIE5vcm1hbGx5IHRoZSBpbmZvcm1hdGlvbiB0byBoYW5kbGUgdGhpcyB3aWxsIGFscmVhZHkgYmUga25vd24KLSAgICAgKiB3aGVuIHRoZSBhbmltYXRpb24gaXMgc3RhcnRlZCwgc3VjaCBhcyBpbiBhIGNhbGwgdG8gb25lIG9mIHRoZQotICAgICAqIGZsaW5nIGZ1bmN0aW9ucy4gSG93ZXZlciB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhpcyBjYW5ub3QgYmUga25vd24KLSAgICAgKiBpbiBhZHZhbmNlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYW5pbWF0ZSBhIHBhcmFib2xpYyBtb3Rpb24gZnJvbQotICAgICAqIHN0YXJ0WSB0byBmaW5hbFkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRZIFN0YXJ0aW5nL2N1cnJlbnQgWSBwb3NpdGlvbgotICAgICAqIEBwYXJhbSBmaW5hbFkgRGVzaXJlZCBmaW5hbCBZIHBvc2l0aW9uCi0gICAgICogQHBhcmFtIG92ZXJZIE1hZ25pdHVkZSBvZiBvdmVyc2Nyb2xsIGFsbG93ZWQuIFRoaXMgc2hvdWxkIGJlIHRoZSBtYXhpbXVtCi0gICAgICogICAgICAgICAgICAgIGRlc2lyZWQgZGlzdGFuY2UgZnJvbSBmaW5hbFkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbm90aWZ5VmVydGljYWxFZGdlUmVhY2hlZChpbnQgc3RhcnRZLCBpbnQgZmluYWxZLCBpbnQgb3ZlclkpIHsKLSAgICAgICAgbVNjcm9sbGVyWS5ub3RpZnlFZGdlUmVhY2hlZChzdGFydFksIGZpbmFsWSwgb3ZlclkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBTY3JvbGxlciBpcyBjdXJyZW50bHkgcmV0dXJuaW5nIHRvIGEgdmFsaWQgcG9zaXRpb24uCi0gICAgICogVmFsaWQgYm91bmRzIHdlcmUgcHJvdmlkZWQgYnkgdGhlCi0gICAgICoge0BsaW5rICNmbGluZyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpfSBtZXRob2QuCi0gICAgICoKLSAgICAgKiBPbmUgc2hvdWxkIGNoZWNrIHRoaXMgdmFsdWUgYmVmb3JlIGNhbGxpbmcKLSAgICAgKiB7QGxpbmsgI3N0YXJ0U2Nyb2xsKGludCwgaW50LCBpbnQsIGludCl9IGFzIHRoZSBpbnRlcnBvbGF0aW9uIGN1cnJlbnRseSBpbiBwcm9ncmVzcwotICAgICAqIHRvIHJlc3RvcmUgYSB2YWxpZCBwb3NpdGlvbiB3aWxsIHRoZW4gYmUgc3RvcHBlZC4gVGhlIGNhbGxlciBoYXMgdG8gdGFrZSBpbnRvIGFjY291bnQKLSAgICAgKiB0aGUgZmFjdCB0aGF0IHRoZSBzdGFydGVkIHNjcm9sbCB3aWxsIHN0YXJ0IGZyb20gYW4gb3ZlcnNjcm9sbGVkIHBvc2l0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgb3ZlcnNjcm9sbGVkIGFuZCBpbiB0aGUgcHJvY2VzcyBvZgotICAgICAqICAgICAgICAgaW50ZXJwb2xhdGluZyBiYWNrIHRvIGEgdmFsaWQgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNPdmVyc2Nyb2xsZWQoKSB7Ci0gICAgICAgIHJldHVybiAoKCFtU2Nyb2xsZXJYLm1GaW5pc2hlZCAmJgotICAgICAgICAgICAgICAgIG1TY3JvbGxlclgubVN0YXRlICE9IE1hZ25ldGljT3ZlclNjcm9sbGVyLlRPX0VER0UpIHx8Ci0gICAgICAgICAgICAgICAgKCFtU2Nyb2xsZXJZLm1GaW5pc2hlZCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbGVyWS5tU3RhdGUgIT0gTWFnbmV0aWNPdmVyU2Nyb2xsZXIuVE9fRURHRSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3BzIHRoZSBhbmltYXRpb24uIENvbnRyYXJ5IHRvIHtAbGluayAjZm9yY2VGaW5pc2hlZChib29sZWFuKX0sCi0gICAgICogYWJvcnRpbmcgdGhlIGFuaW1hdGluZyBjYXVzZXMgdGhlIHNjcm9sbGVyIHRvIG1vdmUgdG8gdGhlIGZpbmFsIHggYW5kIHkKLSAgICAgKiBwb3NpdGlvbnMuCi0gICAgICoKLSAgICAgKiBAc2VlICNmb3JjZUZpbmlzaGVkKGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWJvcnRBbmltYXRpb24oKSB7Ci0gICAgICAgIG1TY3JvbGxlclguZmluaXNoKCk7Ci0gICAgICAgIG1TY3JvbGxlclkuZmluaXNoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGltZSBlbGFwc2VkIHNpbmNlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNjcm9sbGluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGVsYXBzZWQgdGltZSBpbiBtaWxsaXNlY29uZHMuCi0gICAgICoKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgdGltZVBhc3NlZCgpIHsKLSAgICAgICAgZmluYWwgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgZmluYWwgbG9uZyBzdGFydFRpbWUgPSBNYXRoLm1pbihtU2Nyb2xsZXJYLm1TdGFydFRpbWUsIG1TY3JvbGxlclkubVN0YXJ0VGltZSk7Ci0gICAgICAgIHJldHVybiAoaW50KSAodGltZSAtIHN0YXJ0VGltZSk7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIE1hZ25ldGljT3ZlclNjcm9sbGVyIHsKLSAgICAgICAgLy8gSW5pdGlhbCBwb3NpdGlvbgotICAgICAgICBpbnQgbVN0YXJ0OwotCi0gICAgICAgIC8vIEN1cnJlbnQgcG9zaXRpb24KLSAgICAgICAgaW50IG1DdXJyZW50UG9zaXRpb247Ci0KLSAgICAgICAgLy8gRmluYWwgcG9zaXRpb24KLSAgICAgICAgaW50IG1GaW5hbDsKLQotICAgICAgICAvLyBJbml0aWFsIHZlbG9jaXR5Ci0gICAgICAgIGludCBtVmVsb2NpdHk7Ci0KLSAgICAgICAgLy8gQ3VycmVudCB2ZWxvY2l0eQotICAgICAgICBmbG9hdCBtQ3VyclZlbG9jaXR5OwotCi0gICAgICAgIC8vIENvbnN0YW50IGN1cnJlbnQgZGVjZWxlcmF0aW9uCi0gICAgICAgIGZsb2F0IG1EZWNlbGVyYXRpb247Ci0KLSAgICAgICAgLy8gQW5pbWF0aW9uIHN0YXJ0aW5nIHRpbWUsIGluIHN5c3RlbSBtaWxsaXNlY29uZHMKLSAgICAgICAgbG9uZyBtU3RhcnRUaW1lOwotCi0gICAgICAgIC8vIEFuaW1hdGlvbiBkdXJhdGlvbiwgaW4gbWlsbGlzZWNvbmRzCi0gICAgICAgIGludCBtRHVyYXRpb247Ci0KLSAgICAgICAgLy8gV2hldGhlciB0aGUgYW5pbWF0aW9uIGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcwotICAgICAgICBib29sZWFuIG1GaW5pc2hlZDsKLQotICAgICAgICAvLyBDb25zdGFudCBncmF2aXR5IHZhbHVlLCB1c2VkIHRvIHNjYWxlIGRlY2VsZXJhdGlvbgotICAgICAgICBzdGF0aWMgZmxvYXQgR1JBVklUWTsKLQotICAgICAgICBzdGF0aWMgdm9pZCBpbml0aWFsaXplRnJvbUNvbnRleHQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCBwcGkgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eSAqIDE2MC4wZjsKLSAgICAgICAgICAgIEdSQVZJVFkgPSBTZW5zb3JNYW5hZ2VyLkdSQVZJVFlfRUFSVEggLy8gZyAobS9zXjIpCi0gICAgICAgICAgICAgICAgICAgICogMzkuMzdmIC8vIGluY2gvbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgKiBwcGkgLy8gcGl4ZWxzIHBlciBpbmNoCi0gICAgICAgICAgICAgICAgICAgICogVmlld0NvbmZpZ3VyYXRpb24uZ2V0U2Nyb2xsRnJpY3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT19FREdFID0gMDsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPX0JPVU5EQVJZID0gMTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPX0JPVU5DRSA9IDI7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbVN0YXRlID0gVE9fRURHRTsKLQotICAgICAgICAvLyBUaGUgYWxsb3dlZCBvdmVyc2hvdCBkaXN0YW5jZSBiZWZvcmUgYm91bmRhcnkgaXMgcmVhY2hlZC4KLSAgICAgICAgcHJpdmF0ZSBpbnQgbU92ZXI7Ci0KLSAgICAgICAgLy8gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHRvIGdvIGJhY2sgZnJvbSBlZGdlIHRvIGVkZ2UuIFNwcmluZ2JhY2sgaXMgaGFsZiBvZiBpdC4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9WRVJTQ1JPTExfU1BSSU5HQkFDS19EVVJBVElPTiA9IDIwMDsKLQotICAgICAgICAvLyBPc2NpbGxhdGlvbiBwZXJpb2QKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgVElNRV9DT0VGID0KLSAgICAgICAgICAgIDEwMDAuMGYgKiAoZmxvYXQpIE1hdGguUEkgLyBPVkVSU0NST0xMX1NQUklOR0JBQ0tfRFVSQVRJT047Ci0KLSAgICAgICAgLy8gSWYgdGhlIHZlbG9jaXR5IGlzIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLCBubyBib3VuY2UgaXMgdHJpZ2dlcmVkCi0gICAgICAgIC8vIHdoZW4gdGhlIGVkZ2UgbGltaXRzIGFyZSByZWFjaGVkICh3b3VsZCByZXN1bHQgaW4gYSB6ZXJvIHBpeGVscwotICAgICAgICAvLyBkaXNwbGFjZW1lbnQgYW55d2F5KS4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUlOSU1VTV9WRUxPQ0lUWV9GT1JfQk9VTkNFID0gRmxvYXQuTUFYX1ZBTFVFOy8vMTQwLjBmOwotCi0gICAgICAgIC8vIFByb3BvcnRpb24gb2YgdGhlIHZlbG9jaXR5IHRoYXQgaXMgcHJlc2VydmVkIHdoZW4gdGhlIGVkZ2UgaXMgcmVhY2hlZC4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9CT1VOQ0VfQ09FRkZJQ0lFTlQgPSAwLjE2ZjsKLQotICAgICAgICBwcml2YXRlIGZsb2F0IG1Cb3VuY2VDb2VmZmljaWVudCA9IERFRkFVTFRfQk9VTkNFX0NPRUZGSUNJRU5UOwotCi0gICAgICAgIE1hZ25ldGljT3ZlclNjcm9sbGVyKCkgewotICAgICAgICAgICAgbUZpbmlzaGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdXBkYXRlU2Nyb2xsKGZsb2F0IHEpIHsKLSAgICAgICAgICAgIG1DdXJyZW50UG9zaXRpb24gPSBtU3RhcnQgKyBNYXRoLnJvdW5kKHEgKiAobUZpbmFsIC0gbVN0YXJ0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgYSBzaWduZWQgZGVjZWxlcmF0aW9uIHRoYXQgd2lsbCByZWR1Y2UgdGhlIHZlbG9jaXR5LgotICAgICAgICAgKi8KLSAgICAgICAgc3RhdGljIGZsb2F0IGdldERlY2VsZXJhdGlvbihpbnQgdmVsb2NpdHkpIHsKLSAgICAgICAgICAgIHJldHVybiB2ZWxvY2l0eSA+IDAgPyAtR1JBVklUWSA6IEdSQVZJVFk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSB0aW1lIChpbiBtaWxsaXNlY29uZHMpIGl0IHdpbGwgdGFrZSB0byBnbyBmcm9tIHN0YXJ0IHRvIGVuZC4KLSAgICAgICAgICovCi0gICAgICAgIHN0YXRpYyBpbnQgY29tcHV0ZUR1cmF0aW9uKGludCBzdGFydCwgaW50IGVuZCwgZmxvYXQgaW5pdGlhbFZlbG9jaXR5LCBmbG9hdCBkZWNlbGVyYXRpb24pIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBkaXN0YW5jZSA9IHN0YXJ0IC0gZW5kOwotICAgICAgICAgICAgZmluYWwgZmxvYXQgZGlzY3JpbWluYW50ID0gaW5pdGlhbFZlbG9jaXR5ICogaW5pdGlhbFZlbG9jaXR5IC0gMi4wZiAqIGRlY2VsZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAqIGRpc3RhbmNlOwotICAgICAgICAgICAgaWYgKGRpc2NyaW1pbmFudCA+PSAwLjBmKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgZGVsdGEgPSAoZmxvYXQpIE1hdGguc3FydChkaXNjcmltaW5hbnQpOwotICAgICAgICAgICAgICAgIGlmIChkZWNlbGVyYXRpb24gPCAwLjBmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhID0gLWRlbHRhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gKGludCkgKDEwMDAuMGYgKiAoLWluaXRpYWxWZWxvY2l0eSAtIGRlbHRhKSAvIGRlY2VsZXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEVuZCBwb3NpdGlvbiBjYW4gbm90IGJlIHJlYWNoZWQKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzdGFydFNjcm9sbChpbnQgc3RhcnQsIGludCBkaXN0YW5jZSwgaW50IGR1cmF0aW9uKSB7Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgbVN0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgICAgICBtRmluYWwgPSBzdGFydCArIGRpc3RhbmNlOwotCi0gICAgICAgICAgICBtU3RhcnRUaW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1EdXJhdGlvbiA9IGR1cmF0aW9uOwotCi0gICAgICAgICAgICAvLyBVbnVzZWQKLSAgICAgICAgICAgIG1EZWNlbGVyYXRpb24gPSAwLjBmOwotICAgICAgICAgICAgbVZlbG9jaXR5ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZmxpbmcoaW50IHN0YXJ0LCBpbnQgdmVsb2NpdHksIGludCBtaW4sIGludCBtYXgpIHsKLSAgICAgICAgICAgIG1GaW5pc2hlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBtU3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgIG1TdGFydFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotCi0gICAgICAgICAgICBtVmVsb2NpdHkgPSB2ZWxvY2l0eTsKLQotICAgICAgICAgICAgbURlY2VsZXJhdGlvbiA9IGdldERlY2VsZXJhdGlvbih2ZWxvY2l0eSk7Ci0KLSAgICAgICAgICAgIC8vIEEgc3RhcnQgZnJvbSBhbiBpbnZhbGlkIHBvc2l0aW9uIGltbWVkaWF0ZWx5IGJyaW5ncyBiYWNrIHRvIGEgdmFsaWQgcG9zaXRpb24KLSAgICAgICAgICAgIGlmIChtU3RhcnQgPCBtaW4pIHsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSAwOwotICAgICAgICAgICAgICAgIG1GaW5hbCA9IG1pbjsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtU3RhcnQgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSAwOwotICAgICAgICAgICAgICAgIG1GaW5hbCA9IG1heDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIER1cmF0aW9uIGFyZSBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzCi0gICAgICAgICAgICBtRHVyYXRpb24gPSAoaW50KSAoLTEwMDAuMGYgKiB2ZWxvY2l0eSAvIG1EZWNlbGVyYXRpb24pOwotCi0gICAgICAgICAgICBtRmluYWwgPSBzdGFydCAtIE1hdGgucm91bmQoKHZlbG9jaXR5ICogdmVsb2NpdHkpIC8gKDIuMGYgKiBtRGVjZWxlcmF0aW9uKSk7Ci0KLSAgICAgICAgICAgIC8vIENsYW1wIHRvIGEgdmFsaWQgZmluYWwgcG9zaXRpb24KLSAgICAgICAgICAgIGlmIChtRmluYWwgPCBtaW4pIHsKLSAgICAgICAgICAgICAgICBtRmluYWwgPSBtaW47Ci0gICAgICAgICAgICAgICAgbUR1cmF0aW9uID0gY29tcHV0ZUR1cmF0aW9uKG1TdGFydCwgbWluLCBtVmVsb2NpdHksIG1EZWNlbGVyYXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUZpbmFsID4gbWF4KSB7Ci0gICAgICAgICAgICAgICAgbUZpbmFsID0gbWF4OwotICAgICAgICAgICAgICAgIG1EdXJhdGlvbiA9IGNvbXB1dGVEdXJhdGlvbihtU3RhcnQsIG1heCwgbVZlbG9jaXR5LCBtRGVjZWxlcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZmluaXNoKCkgewotICAgICAgICAgICAgbUN1cnJlbnRQb3NpdGlvbiA9IG1GaW5hbDsKLSAgICAgICAgICAgIC8vIE5vdCByZXNldCBzaW5jZSBXZWJWaWV3IHJlbGllcyBvbiB0aGlzIHZhbHVlIGZvciBmYXN0IGZsaW5nLgotICAgICAgICAgICAgLy8gbUN1cnJWZWxvY2l0eSA9IDAuMGY7Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRGaW5hbFBvc2l0aW9uKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgbUZpbmFsID0gcG9zaXRpb247Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZXh0ZW5kRHVyYXRpb24oaW50IGV4dGVuZCkgewotICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBlbGFwc2VkVGltZSA9IChpbnQpICh0aW1lIC0gbVN0YXJ0VGltZSk7Ci0gICAgICAgICAgICBtRHVyYXRpb24gPSBlbGFwc2VkVGltZSArIGV4dGVuZDsKLSAgICAgICAgICAgIG1GaW5pc2hlZCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRCb3VuY2VDb2VmZmljaWVudChmbG9hdCBjb2VmZmljaWVudCkgewotICAgICAgICAgICAgbUJvdW5jZUNvZWZmaWNpZW50ID0gY29lZmZpY2llbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHNwcmluZ2JhY2soaW50IHN0YXJ0LCBpbnQgbWluLCBpbnQgbWF4KSB7Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSB0cnVlOwotCi0gICAgICAgICAgICBtU3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgIG1WZWxvY2l0eSA9IDA7Ci0KLSAgICAgICAgICAgIG1TdGFydFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICAgICAgbUR1cmF0aW9uID0gMDsKLQotICAgICAgICAgICAgaWYgKHN0YXJ0IDwgbWluKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnRTcHJpbmdiYWNrKHN0YXJ0LCBtaW4sIGZhbHNlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnQgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBzdGFydFNwcmluZ2JhY2soc3RhcnQsIG1heCwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAhbUZpbmlzaGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0U3ByaW5nYmFjayhpbnQgc3RhcnQsIGludCBlbmQsIGJvb2xlYW4gcG9zaXRpdmUpIHsKLSAgICAgICAgICAgIG1GaW5pc2hlZCA9IGZhbHNlOwotICAgICAgICAgICAgbVN0YXRlID0gVE9fQk9VTkNFOwotICAgICAgICAgICAgbVN0YXJ0ID0gbUZpbmFsID0gZW5kOwotICAgICAgICAgICAgbUR1cmF0aW9uID0gT1ZFUlNDUk9MTF9TUFJJTkdCQUNLX0RVUkFUSU9OOwotICAgICAgICAgICAgbVN0YXJ0VGltZSAtPSBPVkVSU0NST0xMX1NQUklOR0JBQ0tfRFVSQVRJT04gLyAyOwotICAgICAgICAgICAgbVZlbG9jaXR5ID0gKGludCkgKE1hdGguYWJzKGVuZCAtIHN0YXJ0KSAqIFRJTUVfQ09FRiAqIChwb3NpdGl2ZSA/IDEuMCA6IC0xLjBmKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGZsaW5nKGludCBzdGFydCwgaW50IHZlbG9jaXR5LCBpbnQgbWluLCBpbnQgbWF4LCBpbnQgb3ZlcikgewotICAgICAgICAgICAgbVN0YXRlID0gVE9fRURHRTsKLSAgICAgICAgICAgIG1PdmVyID0gb3ZlcjsKLQotICAgICAgICAgICAgbUZpbmlzaGVkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIG1TdGFydCA9IHN0YXJ0OwotICAgICAgICAgICAgbVN0YXJ0VGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgICAgIG1WZWxvY2l0eSA9IHZlbG9jaXR5OwotCi0gICAgICAgICAgICBtRGVjZWxlcmF0aW9uID0gZ2V0RGVjZWxlcmF0aW9uKHZlbG9jaXR5KTsKLQotICAgICAgICAgICAgLy8gRHVyYXRpb24gYXJlIGV4cHJlc3NlZCBpbiBtaWxsaXNlY29uZHMKLSAgICAgICAgICAgIG1EdXJhdGlvbiA9IChpbnQpICgtMTAwMC4wZiAqIHZlbG9jaXR5IC8gbURlY2VsZXJhdGlvbik7Ci0KLSAgICAgICAgICAgIG1GaW5hbCA9IHN0YXJ0IC0gTWF0aC5yb3VuZCgodmVsb2NpdHkgKiB2ZWxvY2l0eSkgLyAoMi4wZiAqIG1EZWNlbGVyYXRpb24pKTsKLQotICAgICAgICAgICAgLy8gQ2xhbXAgdG8gYSB2YWxpZCBmaW5hbCBwb3NpdGlvbgotICAgICAgICAgICAgaWYgKG1GaW5hbCA8IG1pbikgewotICAgICAgICAgICAgICAgIG1GaW5hbCA9IG1pbjsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSBjb21wdXRlRHVyYXRpb24obVN0YXJ0LCBtaW4sIG1WZWxvY2l0eSwgbURlY2VsZXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRmluYWwgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBtRmluYWwgPSBtYXg7Ci0gICAgICAgICAgICAgICAgbUR1cmF0aW9uID0gY29tcHV0ZUR1cmF0aW9uKG1TdGFydCwgbWF4LCBtVmVsb2NpdHksIG1EZWNlbGVyYXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc3RhcnQgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gbWF4ICsgb3ZlcikgewotICAgICAgICAgICAgICAgICAgICBzcHJpbmdiYWNrKG1heCArIG92ZXIsIG1pbiwgbWF4KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAodmVsb2NpdHkgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nYmFjayhzdGFydCwgbWluLCBtYXgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGRvdWJsZSBkdXJhdGlvblNpbmNlRWRnZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5hdGFuKChzdGFydC1tYXgpICogVElNRV9DT0VGIC8gdmVsb2NpdHkpIC8gVElNRV9DT0VGOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSA9IChpbnQpICh0aW1lIC0gMTAwMC4wZiAqIGR1cmF0aW9uU2luY2VFZGdlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2ltdWxhdGUgYSBib3VuY2UgdGhhdCBzdGFydGVkIGZyb20gZWRnZQotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ID0gbWF4OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHkgPSAoaW50KSAodmVsb2NpdHkgLyBNYXRoLmNvcyhkdXJhdGlvblNpbmNlRWRnZSAqIFRJTUVfQ09FRikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBvbkVkZ2VSZWFjaGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChzdGFydCA8IG1pbikgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPD0gbWluIC0gb3ZlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nYmFjayhtaW4gLSBvdmVyLCBtaW4sIG1heCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVsb2NpdHkgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmluZ2JhY2soc3RhcnQsIG1pbiwgbWF4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBkb3VibGUgZHVyYXRpb25TaW5jZUVkZ2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmF0YW4oKHN0YXJ0LW1pbikgKiBUSU1FX0NPRUYgLyB2ZWxvY2l0eSkgLyBUSU1FX0NPRUY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSA9IChpbnQpICh0aW1lIC0gMTAwMC4wZiAqIGR1cmF0aW9uU2luY2VFZGdlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRlIGEgYm91bmNlIHRoYXQgc3RhcnRlZCBmcm9tIGVkZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnQgPSBtaW47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHkgPSAoaW50KSAodmVsb2NpdHkgLyBNYXRoLmNvcyhkdXJhdGlvblNpbmNlRWRnZSAqIFRJTUVfQ09FRikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FZGdlUmVhY2hlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIG5vdGlmeUVkZ2VSZWFjaGVkKGludCBzdGFydCwgaW50IGVuZCwgaW50IG92ZXIpIHsKLSAgICAgICAgICAgIG1EZWNlbGVyYXRpb24gPSBnZXREZWNlbGVyYXRpb24obVZlbG9jaXR5KTsKLQotICAgICAgICAgICAgLy8gTG9jYWwgdGltZSwgdXNlZCB0byBjb21wdXRlIGVkZ2UgY3Jvc3NpbmcgdGltZS4KLSAgICAgICAgICAgIGZsb2F0IHRpbWVDdXJyZW50ID0gbUN1cnJWZWxvY2l0eSAvIG1EZWNlbGVyYXRpb247Ci0gICAgICAgICAgICBmaW5hbCBpbnQgZGlzdGFuY2UgPSBlbmQgLSBzdGFydDsKLSAgICAgICAgICAgIGZsb2F0IHRpbWVFZGdlID0gLShmbG9hdCkgTWF0aC5zcXJ0KCgyLjBmICogZGlzdGFuY2UgLyBtRGVjZWxlcmF0aW9uKQotICAgICAgICAgICAgICAgICAgICArICh0aW1lQ3VycmVudCAqIHRpbWVDdXJyZW50KSk7Ci0KLSAgICAgICAgICAgIG1WZWxvY2l0eSA9IChpbnQpIChtRGVjZWxlcmF0aW9uICogdGltZUVkZ2UpOwotCi0gICAgICAgICAgICAvLyBTaW11bGF0ZSBhIHN5bW1ldHJpYyBib3VuY2UgdGhhdCBzdGFydGVkIGZyb20gZWRnZQotICAgICAgICAgICAgbVN0YXJ0ID0gZW5kOwotCi0gICAgICAgICAgICBtT3ZlciA9IG92ZXI7Ci0KLSAgICAgICAgICAgIGxvbmcgdGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtU3RhcnRUaW1lID0gKGludCkgKHRpbWUgLSAxMDAwLjBmICogKHRpbWVDdXJyZW50IC0gdGltZUVkZ2UpKTsKLQotICAgICAgICAgICAgb25FZGdlUmVhY2hlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG9uRWRnZVJlYWNoZWQoKSB7Ci0gICAgICAgICAgICAvLyBtU3RhcnQsIG1WZWxvY2l0eSBhbmQgbVN0YXJ0VGltZSB3ZXJlIGFkanVzdGVkIHRvIHRoZWlyIHZhbHVlcyB3aGVuIGVkZ2Ugd2FzIHJlYWNoZWQuCi0gICAgICAgICAgICBmaW5hbCBmbG9hdCBkaXN0YW5jZSA9IG1WZWxvY2l0eSAvIFRJTUVfQ09FRjsKLQotICAgICAgICAgICAgaWYgKE1hdGguYWJzKGRpc3RhbmNlKSA8IG1PdmVyKSB7Ci0gICAgICAgICAgICAgICAgLy8gU3ByaW5nIGZvcmNlIHdpbGwgYnJpbmcgdXMgYmFjayB0byBmaW5hbCBwb3NpdGlvbgotICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFRPX0JPVU5DRTsKLSAgICAgICAgICAgICAgICBtRmluYWwgPSBtU3RhcnQ7Ci0gICAgICAgICAgICAgICAgbUR1cmF0aW9uID0gT1ZFUlNDUk9MTF9TUFJJTkdCQUNLX0RVUkFUSU9OOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBWZWxvY2l0eSBpcyB0b28gaGlnaCwgd2Ugd2lsbCBoaXQgdGhlIGJvdW5kYXJ5IGxpbWl0Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gVE9fQk9VTkRBUlk7Ci0gICAgICAgICAgICAgICAgaW50IG92ZXIgPSBtVmVsb2NpdHkgPiAwID8gbU92ZXIgOiAtbU92ZXI7Ci0gICAgICAgICAgICAgICAgbUZpbmFsID0gbVN0YXJ0ICsgb3ZlcjsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSAoaW50KSAoMTAwMC4wZiAqIE1hdGguYXNpbihvdmVyIC8gZGlzdGFuY2UpIC8gVElNRV9DT0VGKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gY29udGludWVXaGVuRmluaXNoZWQoKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgVE9fRURHRToKLSAgICAgICAgICAgICAgICAgICAgLy8gRHVyYXRpb24gZnJvbSBzdGFydCB0byBudWxsIHZlbG9jaXR5Ci0gICAgICAgICAgICAgICAgICAgIGludCBkdXJhdGlvbiA9IChpbnQpICgtMTAwMC4wZiAqIG1WZWxvY2l0eSAvIG1EZWNlbGVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBpZiAobUR1cmF0aW9uIDwgZHVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhbmltYXRpb24gd2FzIGNsYW1wZWQsIHdlIHJlYWNoZWQgdGhlIGVkZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydCA9IG1GaW5hbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNwZWVkIHdoZW4gZWRnZSB3YXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5ID0gKGludCkgKG1WZWxvY2l0eSArIG1EZWNlbGVyYXRpb24gKiBtRHVyYXRpb24gLyAxMDAwLjBmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgKz0gbUR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgb25FZGdlUmVhY2hlZCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsIHN0b3AsIG5vIG5lZWQgdG8gY29udGludWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRPX0JPVU5EQVJZOgotICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lICs9IG1EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRTcHJpbmdiYWNrKG1GaW5hbCwgbUZpbmFsIC0gKG1WZWxvY2l0eSA+IDAgPyBtT3ZlcjotbU92ZXIpLCBtVmVsb2NpdHkgPiAwKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUT19CT1VOQ0U6Ci0gICAgICAgICAgICAgICAgICAgIC8vbVZlbG9jaXR5ID0gKGludCkgKG1WZWxvY2l0eSAqIEJPVU5DRV9DT0VGRklDSUVOVCk7Ci0gICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eSA9IChpbnQpIChtVmVsb2NpdHkgKiBtQm91bmNlQ29lZmZpY2llbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMobVZlbG9jaXR5KSA8IE1JTklNVU1fVkVMT0NJVFlfRk9SX0JPVU5DRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgKz0gbUR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFVwZGF0ZSB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgdmVsb2NpdHkgZm9yIGN1cnJlbnQgdGltZS4gUmV0dXJucwotICAgICAgICAgKiB0cnVlIGlmIHVwZGF0ZSBoYXMgYmVlbiBkb25lIGFuZCBmYWxzZSBpZiBhbmltYXRpb24gZHVyYXRpb24gaGFzIGJlZW4KLSAgICAgICAgICogcmVhY2hlZC4KLSAgICAgICAgICovCi0gICAgICAgIGJvb2xlYW4gdXBkYXRlKCkgewotICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgZHVyYXRpb24gPSB0aW1lIC0gbVN0YXJ0VGltZTsKLQotICAgICAgICAgICAgaWYgKGR1cmF0aW9uID4gbUR1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkb3VibGUgZGlzdGFuY2U7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCB0ID0gZHVyYXRpb24gLyAxMDAwLjBmOwotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBUT19FREdFKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJWZWxvY2l0eSA9IG1WZWxvY2l0eSArIG1EZWNlbGVyYXRpb24gKiB0OwotICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gbVZlbG9jaXR5ICogdCArIG1EZWNlbGVyYXRpb24gKiB0ICogdCAvIDIuMGY7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IGQgPSB0ICogVElNRV9DT0VGOwotICAgICAgICAgICAgICAgIG1DdXJyVmVsb2NpdHkgPSBtVmVsb2NpdHkgKiAoZmxvYXQpTWF0aC5jb3MoZCk7Ci0gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBtVmVsb2NpdHkgLyBUSU1FX0NPRUYgKiBNYXRoLnNpbihkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUN1cnJlbnRQb3NpdGlvbiA9IG1TdGFydCArIChpbnQpIGRpc3RhbmNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUG9wdXBNZW51LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUG9wdXBNZW51LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3NzBhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qb3B1cE1lbnUuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVQb3B1cEhlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworLyoqCisgKiBBIFBvcHVwTWVudSBkaXNwbGF5cyBhIHtAbGluayBNZW51fSBpbiBhIG1vZGFsIHBvcHVwIHdpbmRvdyBhbmNob3JlZCB0byBhIHtAbGluayBWaWV3fS4KKyAqIFRoZSBwb3B1cCB3aWxsIGFwcGVhciBiZWxvdyB0aGUgYW5jaG9yIHZpZXcgaWYgdGhlcmUgaXMgcm9vbSwgb3IgYWJvdmUgaXQgaWYgdGhlcmUgaXMgbm90LgorICogSWYgdGhlIElNRSBpcyB2aXNpYmxlIHRoZSBwb3B1cCB3aWxsIG5vdCBvdmVybGFwIGl0IHVudGlsIGl0IGlzIHRvdWNoZWQuIFRvdWNoaW5nIG91dHNpZGUKKyAqIG9mIHRoZSBwb3B1cCB3aWxsIGRpc21pc3MgaXQuCisgKi8KK3B1YmxpYyBjbGFzcyBQb3B1cE1lbnUgaW1wbGVtZW50cyBNZW51QnVpbGRlci5DYWxsYmFjayB7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU1lbnU7CisgICAgcHJpdmF0ZSBWaWV3IG1BbmNob3I7CisgICAgcHJpdmF0ZSBNZW51UG9wdXBIZWxwZXIgbVBvcHVwOworICAgIHByaXZhdGUgT25NZW51SXRlbUNsaWNrTGlzdGVuZXIgbU1lbnVJdGVtQ2xpY2tMaXN0ZW5lcjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBQb3B1cE1lbnUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGZvciB0aGUgUG9wdXBNZW51LgorICAgICAqIEBwYXJhbSBhbmNob3IgQW5jaG9yIHZpZXcgZm9yIHRoaXMgcG9wdXAuIFRoZSBwb3B1cCB3aWxsIGFwcGVhciBiZWxvdyB0aGUgYW5jaG9yIGlmIHRoZXJlCisgICAgICogICAgICAgICAgICAgICBpcyByb29tLCBvciBhYm92ZSBpdCBpZiB0aGVyZSBpcyBub3QuCisgICAgICovCisgICAgcHVibGljIFBvcHVwTWVudShDb250ZXh0IGNvbnRleHQsIFZpZXcgYW5jaG9yKSB7CisgICAgICAgIC8vIFRPRE8gVGhlbWU/CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbU1lbnUgPSBuZXcgTWVudUJ1aWxkZXIoY29udGV4dCk7CisgICAgICAgIG1NZW51LnNldENhbGxiYWNrKHRoaXMpOworICAgICAgICBtQW5jaG9yID0gYW5jaG9yOworICAgICAgICBtUG9wdXAgPSBuZXcgTWVudVBvcHVwSGVscGVyKGNvbnRleHQsIG1NZW51LCBhbmNob3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBNZW51fSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwb3B1cC4gUG9wdWxhdGUgdGhlIHJldHVybmVkIE1lbnUgd2l0aAorICAgICAqIGl0ZW1zIGJlZm9yZSBjYWxsaW5nIHtAbGluayAjc2hvdygpfS4KKyAgICAgKgorICAgICAqIEBzZWUgI3Nob3coKQorICAgICAqIEBzZWUgI2dldE1lbnVJbmZsYXRlcigpCisgICAgICovCisgICAgcHVibGljIE1lbnUgZ2V0TWVudSgpIHsKKyAgICAgICAgcmV0dXJuIG1NZW51OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSB7QGxpbmsgTWVudUluZmxhdGVyfSB0aGF0IGNhbiBiZSB1c2VkIHRvIGluZmxhdGUgbWVudSBpdGVtcyBmcm9tIFhNTCBpbnRvIHRoZQorICAgICAqIG1lbnUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRNZW51KCl9LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0TWVudSgpCisgICAgICovCisgICAgcHVibGljIE1lbnVJbmZsYXRlciBnZXRNZW51SW5mbGF0ZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVudUluZmxhdGVyKG1Db250ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93IHRoZSBtZW51IHBvcHVwIGFuY2hvcmVkIHRvIHRoZSB2aWV3IHNwZWNpZmllZCBkdXJpbmcgY29uc3RydWN0aW9uLgorICAgICAqIEBzZWUgI2Rpc21pc3MoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIG1Qb3B1cC5zaG93KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzbWlzcyB0aGUgbWVudSBwb3B1cC4KKyAgICAgKiBAc2VlICNzaG93KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCkgeworICAgICAgICBtUG9wdXAuZGlzbWlzcygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1NZW51SXRlbUNsaWNrTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1TZWxlY3RlZChNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIGlmIChtTWVudUl0ZW1DbGlja0xpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudUl0ZW1DbGlja0xpc3RlbmVyLm9uTWVudUl0ZW1DbGljayhpdGVtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNsb3NlTWVudShNZW51QnVpbGRlciBtZW51LCBib29sZWFuIGFsbE1lbnVzQXJlQ2xvc2luZykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25TdWJNZW51U2VsZWN0ZWQoU3ViTWVudUJ1aWxkZXIgc3ViTWVudSkgeworICAgICAgICBpZiAoIXN1Yk1lbnUuaGFzVmlzaWJsZUl0ZW1zKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3VycmVudCBtZW51IHdpbGwgYmUgZGlzbWlzc2VkIGJ5IHRoZSBub3JtYWwgaGVscGVyLCBzdWJtZW51IHdpbGwgYmUgc2hvd24gaW4gaXRzIHBsYWNlLgorICAgICAgICBuZXcgTWVudVBvcHVwSGVscGVyKG1Db250ZXh0LCBzdWJNZW51LCBtQW5jaG9yKS5zaG93KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25DbG9zZVN1Yk1lbnUoU3ViTWVudUJ1aWxkZXIgbWVudSkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25NZW51TW9kZUNoYW5nZShNZW51QnVpbGRlciBtZW51KSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHJlc3BvbnNpYmxlIGZvciByZWNlaXZpbmcgbWVudSBpdGVtIGNsaWNrIGV2ZW50cyBpZiB0aGUgaXRlbXMgdGhlbXNlbHZlcworICAgICAqIGRvIG5vdCBoYXZlIGluZGl2aWR1YWwgaXRlbSBjbGljayBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgd2hlbiBhIG1lbnUgaXRlbSBpcyBjbGlja2VkIGlmIHRoZSBpdGVtIGl0c2VsZiBkaWQKKyAgICAgICAgICogbm90IGFscmVhZHkgaGFuZGxlIHRoZSBldmVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGl0ZW0ge0BsaW5rIE1lbnVJdGVtfSB0aGF0IHdhcyBjbGlja2VkCisgICAgICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGV2ZW50IHdhcyBoYW5kbGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKE1lbnVJdGVtIGl0ZW0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qb3B1cFdpbmRvdy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEKaW5kZXggMDU1YmE4Ny4uZDZjMmRiMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEKQEAgLTE5LDIyICsxOSwyNCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyLk9uU2Nyb2xsQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uVG91Y2hMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uVG91Y2hMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyLk9uU2Nyb2xsQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwogCkBAIC0xMjMsNyArMTI1LDcgQEAKICAgICBwcml2YXRlIE9uU2Nyb2xsQ2hhbmdlZExpc3RlbmVyIG1PblNjcm9sbENoYW5nZWRMaXN0ZW5lciA9CiAgICAgICAgIG5ldyBPblNjcm9sbENoYW5nZWRMaXN0ZW5lcigpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2Nyb2xsQ2hhbmdlZCgpIHsKLSAgICAgICAgICAgICAgICBWaWV3IGFuY2hvciA9IG1BbmNob3IuZ2V0KCk7CisgICAgICAgICAgICAgICAgVmlldyBhbmNob3IgPSBtQW5jaG9yICE9IG51bGwgPyBtQW5jaG9yLmdldCgpIDogbnVsbDsKICAgICAgICAgICAgICAgICBpZiAoYW5jaG9yICE9IG51bGwgJiYgbVBvcHVwVmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHAgPSAoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvcHVwVmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKQEAgLTE1OSwxMiArMTYxLDIxIEBACiAgICAgICogPHA+VGhlIHBvcHVwIGRvZXMgcHJvdmlkZSBhIGJhY2tncm91bmQuPC9wPgogICAgICAqLwogICAgIHB1YmxpYyBQb3B1cFdpbmRvdyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCAwKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogPHA+Q3JlYXRlIGEgbmV3LCBlbXB0eSwgbm9uIGZvY3VzYWJsZSBwb3B1cCB3aW5kb3cgb2YgZGltZW5zaW9uICgwLDApLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgcG9wdXAgZG9lcyBub3QgcHJvdmlkZSBhIGJhY2tncm91bmQuPC9wPgorICAgICAqLworICAgIHB1YmxpYyBQb3B1cFdpbmRvdyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVdpbmRvd01hbmFnZXIgPSAoV2luZG93TWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7CiAKICAgICAgICAgVHlwZWRBcnJheSBhID0KICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcygKLSAgICAgICAgICAgICAgICBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUG9wdXBXaW5kb3csIGRlZlN0eWxlLCAwKTsKKyAgICAgICAgICAgICAgICBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUG9wdXBXaW5kb3csIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwogCiAgICAgICAgIG1CYWNrZ3JvdW5kID0gYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5Qb3B1cFdpbmRvd19wb3B1cEJhY2tncm91bmQpOwogCkBAIC0xMDg4LDcgKzEwOTksOSBAQAogICAgICAgICAKICAgICAgICAgaW50IGJvdHRvbUVkZ2UgPSBkaXNwbGF5RnJhbWUuYm90dG9tOwogICAgICAgICBpZiAoaWdub3JlQm90dG9tRGVjb3JhdGlvbnMpIHsKLSAgICAgICAgICAgIGJvdHRvbUVkZ2UgPSBhbmNob3IuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuaGVpZ2h0UGl4ZWxzOworICAgICAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGFuY2hvci5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBib3R0b21FZGdlID0gcmVzLmdldERpc3BsYXlNZXRyaWNzKCkuaGVpZ2h0UGl4ZWxzIC0KKyAgICAgICAgICAgICAgICAgICAgKGludCkgcmVzLmdldERpbWVuc2lvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnNjcmVlbl9tYXJnaW5fYm90dG9tKTsKICAgICAgICAgfQogICAgICAgICBmaW5hbCBpbnQgZGlzdGFuY2VUb0JvdHRvbSA9IGJvdHRvbUVkZ2UgLSAoYW5jaG9yUG9zWzFdICsgYW5jaG9yLmdldEhlaWdodCgpKSAtIHlPZmZzZXQ7CiAgICAgICAgIGZpbmFsIGludCBkaXN0YW5jZVRvVG9wID0gYW5jaG9yUG9zWzFdIC0gZGlzcGxheUZyYW1lLnRvcCArIHlPZmZzZXQ7CkBAIC0xMzgxLDYgKzEzOTQsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgUG9wdXBWaWV3Q29udGFpbmVyIGV4dGVuZHMgRnJhbWVMYXlvdXQgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlBvcHVwV2luZG93LlBvcHVwVmlld0NvbnRhaW5lciI7CiAKICAgICAgICAgcHVibGljIFBvcHVwVmlld0NvbnRhaW5lcihDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Byb2dyZXNzQmFyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQppbmRleCBlYzdkOTI3Li4zYTQ0ODdjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQpAQCAtNzE2LDggKzcxNiw4IEBACiAgICAgICAgICAgICBtQW5pbWF0aW9uLnNldER1cmF0aW9uKG1EdXJhdGlvbik7CiAgICAgICAgICAgICBtQW5pbWF0aW9uLnNldEludGVycG9sYXRvcihtSW50ZXJwb2xhdG9yKTsKICAgICAgICAgICAgIG1BbmltYXRpb24uc2V0U3RhcnRUaW1lKEFuaW1hdGlvbi5TVEFSVF9PTl9GSVJTVF9GUkFNRSk7Ci0gICAgICAgICAgICBwb3N0SW52YWxpZGF0ZSgpOwogICAgICAgICB9CisgICAgICAgIHBvc3RJbnZhbGlkYXRlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MzAsNiArNzMwLDcgQEAKICAgICAgICAgICAgICgoQW5pbWF0YWJsZSkgbUluZGV0ZXJtaW5hdGVEcmF3YWJsZSkuc3RvcCgpOwogICAgICAgICAgICAgbVNob3VsZFN0YXJ0QW5pbWF0aW9uRHJhd2FibGUgPSBmYWxzZTsKICAgICAgICAgfQorICAgICAgICBwb3N0SW52YWxpZGF0ZSgpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1F1aWNrQ29udGFjdEJhZGdlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YQppbmRleCA0YmJiNTQwLi41NTk4YzY1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YQpAQCAtNDgsNiArNDgsNyBAQAogICAgIHByaXZhdGUgUXVlcnlIYW5kbGVyIG1RdWVyeUhhbmRsZXI7CiAgICAgcHJpdmF0ZSBEcmF3YWJsZSBtQmFkZ2VCYWNrZ3JvdW5kOwogICAgIHByaXZhdGUgRHJhd2FibGUgbU5vQmFkZ2VCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgRHJhd2FibGUgbURlZmF1bHRBdmF0YXI7CiAKICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gbUV4Y2x1ZGVNaW1lcyA9IG51bGw7CiAKQEAgLTExNyw2ICsxMTgsMTYgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRNb2RlKGludCBzaXplKSB7CiAgICAgICAgIG1Nb2RlID0gc2l6ZTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBjb250YWN0IHBob3RvIHRvIHRoZSBkZWZhdWx0IHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEltYWdlVG9EZWZhdWx0KCkgeworICAgICAgICBpZiAobURlZmF1bHRBdmF0YXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbURlZmF1bHRBdmF0YXIgPSBnZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2NvbnRhY3RfcGljdHVyZSk7CisgICAgICAgIH0KKyAgICAgICAgc2V0SW1hZ2VEcmF3YWJsZShtRGVmYXVsdEF2YXRhcik7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogQXNzaWduIHRoZSBjb250YWN0IHVyaSB0aGF0IHRoaXMgUXVpY2tDb250YWN0QmFkZ2Ugc2hvdWxkIGJlIGFzc29jaWF0ZWQKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3cy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzLmphdmEKaW5kZXggN2E3MGM4MC4uOWQyMTRmYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzLmphdmEKQEAgLTE2LDcgKzE2LDE1IEBACiAKIHBhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CiAKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKwogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHB3aWRnZXQuQXBwV2lkZ2V0SG9zdFZpZXc7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyOwpAQCAtMzgsMTMgKzQ2LDYgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIuRmlsdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKIAotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCiAKIC8qKgogICogQSBjbGFzcyB0aGF0IGRlc2NyaWJlcyBhIHZpZXcgaGllcmFyY2h5IHRoYXQgY2FuIGJlIGRpc3BsYXllZCBpbgpAQCAtNjAsMTIgKzYxLDEyIEBACiAgICAgICogVGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgcGFja2FnZSBjb250YWluaW5nIHRoZSBsYXlvdXQgCiAgICAgICogcmVzb3VyY2UuIChBZGRlZCB0byB0aGUgcGFyY2VsKQogICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1QYWNrYWdlOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYWNrYWdlOwogICAgIAogICAgIC8qKgogICAgICAqIFRoZSByZXNvdXJjZSBJRCBvZiB0aGUgbGF5b3V0IGZpbGUuIChBZGRlZCB0byB0aGUgcGFyY2VsKQogICAgICAqLwotICAgIHByaXZhdGUgaW50IG1MYXlvdXRJZDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtTGF5b3V0SWQ7CiAKICAgICAvKioKICAgICAgKiBBbiBhcnJheSBvZiBhY3Rpb25zIHRvIHBlcmZvcm0gb24gdGhlIHZpZXcgdHJlZSBvbmNlIGl0IGhhcyBiZWVuCkBAIC03Myw4ICs3NCwyMiBAQAogICAgICAqLwogICAgIHByaXZhdGUgQXJyYXlMaXN0PEFjdGlvbj4gbUFjdGlvbnM7CiAgICAgCisgICAgLyoqCisgICAgICogQSBjbGFzcyB0byBrZWVwIHRyYWNrIG9mIG1lbW9yeSB1c2FnZSBieSB0aGlzIFJlbW90ZVZpZXdzCisgICAgICovCisgICAgcHJpdmF0ZSBNZW1vcnlVc2FnZUNvdW50ZXIgbU1lbW9yeVVzYWdlQ291bnRlcjsKKwogICAgIAogICAgIC8qKgorICAgICAqIFRoaXMgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIFJlbW90ZVZpZXdzIG9iamVjdCBpcyBiZWluZyBjcmVhdGVkIGZyb20gYQorICAgICAqIFJlbW90ZVZpZXdzU2VydmljZSBmb3IgdXNlIGFzIGEgY2hpbGQgb2YgYSB3aWRnZXQgY29sbGVjdGlvbi4gVGhpcyBmbGFnIGlzIHVzZWQKKyAgICAgKiB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgY2VydGFpbiBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlLCBpbiBwYXJ0aWN1bGFyLAorICAgICAqIHNldHRpbmcgb24gY2xpY2sgZXh0cmFzIGFuZCBzZXR0aW5nIG9uIGNsaWNrIHBlbmRpbmcgaW50ZW50cy4gVGhlIGZvcm1lciBpcyBlbmFibGVkLAorICAgICAqIGFuZCB0aGUgbGF0dGVyIGRpc2FibGVkIHdoZW4gdGhpcyBmbGFnIGlzIHRydWUuCisgICAgICovCisgICAgIHByaXZhdGUgYm9vbGVhbiBtSXNXaWRnZXRDb2xsZWN0aW9uQ2hpbGQgPSBmYWxzZTsKKworICAgIC8qKgogICAgICAqIFRoaXMgYW5ub3RhdGlvbiBpbmRpY2F0ZXMgdGhhdCBhIHN1YmNsYXNzIG9mIFZpZXcgaXMgYWxsbG93ZWQgdG8gYmUgdXNlZAogICAgICAqIHdpdGggdGhlIHtAbGluayBSZW1vdGVWaWV3c30gbWVjaGFuaXNtLgogICAgICAqLwpAQCAtMTA4LDYgKzEyMywyNjYgQEAKICAgICAgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgewogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogT3ZlcnJpZGRlbiBieSBlYWNoIGNsYXNzIHRvIHJlcG9ydCBvbiBpdCdzIG93biBtZW1vcnkgdXNhZ2UKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU1lbW9yeVVzYWdlRXN0aW1hdGUoTWVtb3J5VXNhZ2VDb3VudGVyIGNvdW50ZXIpIHsKKyAgICAgICAgICAgIC8vIFdlIGN1cnJlbnRseSBvbmx5IGNhbGN1bGF0ZSBCaXRtYXAgbWVtb3J5IHVzYWdlLCBzbyBieSBkZWZhdWx0LCBkb24ndCBkbyBhbnl0aGluZworICAgICAgICAgICAgLy8gaGVyZQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBTZXRFbXB0eVZpZXcgZXh0ZW5kcyBBY3Rpb24geworICAgICAgICBpbnQgdmlld0lkOworICAgICAgICBpbnQgZW1wdHlWaWV3SWQ7CisKKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVEFHID0gNjsKKworICAgICAgICBTZXRFbXB0eVZpZXcoaW50IHZpZXdJZCwgaW50IGVtcHR5Vmlld0lkKSB7CisgICAgICAgICAgICB0aGlzLnZpZXdJZCA9IHZpZXdJZDsKKyAgICAgICAgICAgIHRoaXMuZW1wdHlWaWV3SWQgPSBlbXB0eVZpZXdJZDsKKyAgICAgICAgfQorCisgICAgICAgIFNldEVtcHR5VmlldyhQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHRoaXMudmlld0lkID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgdGhpcy5lbXB0eVZpZXdJZCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIG91dCwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBvdXQud3JpdGVJbnQoVEFHKTsKKyAgICAgICAgICAgIG91dC53cml0ZUludCh0aGlzLnZpZXdJZCk7CisgICAgICAgICAgICBvdXQud3JpdGVJbnQodGhpcy5lbXB0eVZpZXdJZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoVmlldyByb290KSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSByb290LmZpbmRWaWV3QnlJZCh2aWV3SWQpOworICAgICAgICAgICAgaWYgKCEodmlldyBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3PD8+KSkgcmV0dXJuOworCisgICAgICAgICAgICBBZGFwdGVyVmlldzw/PiBhZGFwdGVyVmlldyA9IChBZGFwdGVyVmlldzw/PikgdmlldzsKKworICAgICAgICAgICAgZmluYWwgVmlldyBlbXB0eVZpZXcgPSByb290LmZpbmRWaWV3QnlJZChlbXB0eVZpZXdJZCk7CisgICAgICAgICAgICBpZiAoZW1wdHlWaWV3ID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgYWRhcHRlclZpZXcuc2V0RW1wdHlWaWV3KGVtcHR5Vmlldyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFNldE9uQ2xpY2tGaWxsSW5JbnRlbnQgZXh0ZW5kcyBBY3Rpb24geworICAgICAgICBwdWJsaWMgU2V0T25DbGlja0ZpbGxJbkludGVudChpbnQgaWQsIEludGVudCBmaWxsSW5JbnRlbnQpIHsKKyAgICAgICAgICAgIHRoaXMudmlld0lkID0gaWQ7CisgICAgICAgICAgICB0aGlzLmZpbGxJbkludGVudCA9IGZpbGxJbkludGVudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTZXRPbkNsaWNrRmlsbEluSW50ZW50KFBhcmNlbCBwYXJjZWwpIHsKKyAgICAgICAgICAgIHZpZXdJZCA9IHBhcmNlbC5yZWFkSW50KCk7CisgICAgICAgICAgICBmaWxsSW5JbnRlbnQgPSBJbnRlbnQuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoVEFHKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQodmlld0lkKTsKKyAgICAgICAgICAgIGZpbGxJbkludGVudC53cml0ZVRvUGFyY2VsKGRlc3QsIDAgLyogbm8gZmxhZ3MgKi8pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KFZpZXcgcm9vdCkgeworICAgICAgICAgICAgZmluYWwgVmlldyB0YXJnZXQgPSByb290LmZpbmRWaWV3QnlJZCh2aWV3SWQpOworCisgICAgICAgICAgICBpZiAoIW1Jc1dpZGdldENvbGxlY3Rpb25DaGlsZCkgeworICAgICAgICAgICAgICAgIExvZy5lKCJSZW1vdGVWaWV3cyIsICJUaGUgbWV0aG9kIHNldE9uQ2xpY2tGaWxsSW5JbnRlbnQgaXMgYXZhaWxhYmxlICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIm9ubHkgZnJvbSBSZW1vdGVWaWV3c0ZhY3RvcnkgKGllLiBvbiBjb2xsZWN0aW9uIGl0ZW1zKS4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCAmJiBmaWxsSW5JbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIE9uQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnN1cmUgdGhhdCB0aGlzIHZpZXcgaXMgYSBjaGlsZCBvZiBhbiBBZGFwdGVyVmlldworICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBwYXJlbnQgPSAoVmlldykgdi5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3PD8+KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIEFwcFdpZGdldEhvc3RWaWV3KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IChWaWV3KSBwYXJlbnQuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBBcHBXaWRnZXRIb3N0VmlldykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvbWVob3cgdGhleSd2ZSBtYW5hZ2VkIHRvIGdldCB0aGlzIGZhciB3aXRob3V0IGhhdmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBBZGFwdGVyVmlldyBhcyBhIHBhcmVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZSgiUmVtb3RlVmlld3MiLCAiQ29sbGVjdGlvbiBpdGVtIGRvZXNuJ3QgaGF2ZSBBZGFwdGVyVmlldyBwYXJlbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc3VyZSB0aGF0IGEgdGVtcGxhdGUgcGVuZGluZyBpbnRlbnQgaGFzIGJlZW4gc2V0IG9uIGFuIGFuY2VzdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShwYXJlbnQuZ2V0VGFnKCkgaW5zdGFuY2VvZiBQZW5kaW5nSW50ZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKCJSZW1vdGVWaWV3cyIsICJBdHRlbXB0aW5nIHNldE9uQ2xpY2tGaWxsSW5JbnRlbnQgd2l0aG91dCIgKworCQkJCQkiIGNhbGxpbmcgc2V0UGVuZGluZ0ludGVudFRlbXBsYXRlIG9uIHBhcmVudC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgcGVuZGluZ0ludGVudCA9IChQZW5kaW5nSW50ZW50KSBwYXJlbnQuZ2V0VGFnKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IGFwcFNjYWxlID0gdi5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb21wYXRpYmlsaXR5SW5mbygpLmFwcGxpY2F0aW9uU2NhbGU7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnRbXSBwb3MgPSBuZXcgaW50WzJdOworICAgICAgICAgICAgICAgICAgICAgICAgdi5nZXRMb2NhdGlvbk9uU2NyZWVuKHBvcyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgcmVjdCA9IG5ldyBSZWN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmxlZnQgPSAoaW50KSAocG9zWzBdICogYXBwU2NhbGUgKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QudG9wID0gKGludCkgKHBvc1sxXSAqIGFwcFNjYWxlICsgMC41Zik7CisgICAgICAgICAgICAgICAgICAgICAgICByZWN0LnJpZ2h0ID0gKGludCkgKChwb3NbMF0gKyB2LmdldFdpZHRoKCkpICogYXBwU2NhbGUgKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QuYm90dG9tID0gKGludCkgKChwb3NbMV0gKyB2LmdldEhlaWdodCgpKSAqIGFwcFNjYWxlICsgMC41Zik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxJbkludGVudC5zZXRTb3VyY2VCb3VuZHMocmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFVucmVnaXN0ZXIgdGhpcyBoYW5kbGVyIGlmIFBlbmRpbmdJbnRlbnQuRkxBR19PTkVfU0hPVD8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LmdldENvbnRleHQoKS5zdGFydEludGVudFNlbmRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdJbnRlbnQuZ2V0SW50ZW50U2VuZGVyKCksIGZpbGxJbkludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0ssIDApOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZW50U2VuZGVyLlNlbmRJbnRlbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cuZShMT0dfVEFHLCAiQ2Fubm90IHNlbmQgcGVuZGluZyBpbnRlbnQ6ICIsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHRhcmdldC5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IHZpZXdJZDsKKyAgICAgICAgSW50ZW50IGZpbGxJbkludGVudDsKKworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBUQUcgPSA5OworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2V0T25DbGlja0V4dHJhcyBleHRlbmRzIEFjdGlvbiB7CisgICAgICAgIHB1YmxpYyBTZXRPbkNsaWNrRXh0cmFzKGludCBpZCwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgdGhpcy52aWV3SWQgPSBpZDsKKyAgICAgICAgICAgIHRoaXMuZXh0cmFzID0gZXh0cmFzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNldE9uQ2xpY2tFeHRyYXMoUGFyY2VsIHBhcmNlbCkgeworICAgICAgICAgICAgdmlld0lkID0gcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGV4dHJhcyA9IEJ1bmRsZS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICAgICAgZGVzdC53cml0ZUludChUQUcpOworICAgICAgICAgICAgZGVzdC53cml0ZUludCh2aWV3SWQpOworICAgICAgICAgICAgZXh0cmFzLndyaXRlVG9QYXJjZWwoZGVzdCwgMCAvKiBubyBmbGFncyAqLyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoVmlldyByb290KSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IHRhcmdldCA9IHJvb3QuZmluZFZpZXdCeUlkKHZpZXdJZCk7CisKKyAgICAgICAgICAgIGlmICghbUlzV2lkZ2V0Q29sbGVjdGlvbkNoaWxkKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoIlJlbW90ZVZpZXdzIiwgIlRoZSBtZXRob2Qgc2V0T25DbGlja0V4dHJhcyBpcyBhdmFpbGFibGUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAib25seSBmcm9tIFJlbW90ZVZpZXdzRmFjdG9yeSAoaWUuIG9uIGNvbGxlY3Rpb24gaXRlbXMpLiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsICYmIGV4dHJhcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgT25DbGlja0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc3VyZSB0aGF0IHRoaXMgdmlldyBpcyBhIGNoaWxkIG9mIGFuIEFkYXB0ZXJWaWV3CisgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IHBhcmVudCA9IChWaWV3KSB2LmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgQWRhcHRlclZpZXc8Pz4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICEocGFyZW50IGluc3RhbmNlb2YgQXBwV2lkZ2V0SG9zdFZpZXcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gKFZpZXcpIHBhcmVudC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFwcFdpZGdldEhvc3RWaWV3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU29tZWhvdyB0aGV5J3ZlIG1hbmFnZWQgdG8gZ2V0IHRoaXMgZmFyIHdpdGhvdXQgaGF2aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIEFkYXB0ZXJWaWV3IGFzIGEgcGFyZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKCJSZW1vdGVWaWV3cyIsICJDb2xsZWN0aW9uIGl0ZW0gZG9lc24ndCBoYXZlIEFkYXB0ZXJWaWV3IHBhcmVudCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5zdXJlIHRoYXQgYSB0ZW1wbGF0ZSBwZW5kaW5nIGludGVudCBoYXMgYmVlbiBzZXQgb24gYW4gYW5jZXN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHBhcmVudC5nZXRUYWcoKSBpbnN0YW5jZW9mIFBlbmRpbmdJbnRlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoIlJlbW90ZVZpZXdzIiwgIkF0dGVtcHRpbmcgc2V0T25DbGlja0V4dHJhcyB3aXRob3V0IGNhbGxpbmcgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRQZW5kaW5nSW50ZW50VGVtcGxhdGUgb24gcGFyZW50LiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgUGVuZGluZ0ludGVudCBwZW5kaW5nSW50ZW50ID0gKFBlbmRpbmdJbnRlbnQpIHBhcmVudC5nZXRUYWcoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgYXBwU2NhbGUgPSB2LmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbXBhdGliaWxpdHlJbmZvKCkuYXBwbGljYXRpb25TY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludFtdIHBvcyA9IG5ldyBpbnRbMl07CisgICAgICAgICAgICAgICAgICAgICAgICB2LmdldExvY2F0aW9uT25TY3JlZW4ocG9zKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVjdCByZWN0ID0gbmV3IFJlY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubGVmdCA9IChpbnQpIChwb3NbMF0gKiBhcHBTY2FsZSArIDAuNWYpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC50b3AgPSAoaW50KSAocG9zWzFdICogYXBwU2NhbGUgKyAwLjVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QucmlnaHQgPSAoaW50KSAoKHBvc1swXSArIHYuZ2V0V2lkdGgoKSkgKiBhcHBTY2FsZSArIDAuNWYpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5ib3R0b20gPSAoaW50KSAoKHBvc1sxXSArIHYuZ2V0SGVpZ2h0KCkpICogYXBwU2NhbGUgKyAwLjVmKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5zZXRTb3VyY2VCb3VuZHMocmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmFzKGV4dHJhcyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogVW5yZWdpc3RlciB0aGlzIGhhbmRsZXIgaWYgUGVuZGluZ0ludGVudC5GTEFHX09ORV9TSE9UPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuZ2V0Q29udGV4dCgpLnN0YXJ0SW50ZW50U2VuZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0ludGVudC5nZXRJbnRlbnRTZW5kZXIoKSwgaW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSywgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlbnRTZW5kZXIuU2VuZEludGVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKExPR19UQUcsICJDYW5ub3Qgc2VuZCBwZW5kaW5nIGludGVudDogIiwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgdGFyZ2V0LnNldE9uQ2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgdmlld0lkOworICAgICAgICBCdW5kbGUgZXh0cmFzOworCisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRBRyA9IDc7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBTZXRQZW5kaW5nSW50ZW50VGVtcGxhdGUgZXh0ZW5kcyBBY3Rpb24geworICAgICAgICBwdWJsaWMgU2V0UGVuZGluZ0ludGVudFRlbXBsYXRlKGludCBpZCwgUGVuZGluZ0ludGVudCBwZW5kaW5nSW50ZW50VGVtcGxhdGUpIHsKKyAgICAgICAgICAgIHRoaXMudmlld0lkID0gaWQ7CisgICAgICAgICAgICB0aGlzLnBlbmRpbmdJbnRlbnRUZW1wbGF0ZSA9IHBlbmRpbmdJbnRlbnRUZW1wbGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTZXRQZW5kaW5nSW50ZW50VGVtcGxhdGUoUGFyY2VsIHBhcmNlbCkgeworICAgICAgICAgICAgdmlld0lkID0gcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIHBlbmRpbmdJbnRlbnRUZW1wbGF0ZSA9IFBlbmRpbmdJbnRlbnQucmVhZFBlbmRpbmdJbnRlbnRPck51bGxGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoVEFHKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQodmlld0lkKTsKKyAgICAgICAgICAgIHBlbmRpbmdJbnRlbnRUZW1wbGF0ZS53cml0ZVRvUGFyY2VsKGRlc3QsIDAgLyogbm8gZmxhZ3MgKi8pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KFZpZXcgcm9vdCkgeworICAgICAgICAgICAgZmluYWwgVmlldyB0YXJnZXQgPSByb290LmZpbmRWaWV3QnlJZCh2aWV3SWQpOworCisgICAgICAgICAgICAvLyBJZiB0aGUgdmlldyBpc24ndCBhbiBBZGFwdGVyVmlldywgc2V0dGluZyBhIFBlbmRpbmdJbnRlbnQgdGVtcGxhdGUgZG9lc24ndCBtYWtlIHNlbnNlCisgICAgICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQWRhcHRlclZpZXc8Pz4pIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgUGVuZGluZ0ludGVudCB0ZW1wbGF0ZSBpcyBzdG9yZWQgaW4gdGhlIHZpZXcncyB0YWcuCisgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFRhZyhwZW5kaW5nSW50ZW50VGVtcGxhdGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cuZSgiUmVtb3RlVmlld3MiLCAiQ2Fubm90IHNldFBlbmRpbmdJbnRlbnRUZW1wbGF0ZSBvbiBhIHZpZXcgd2hpY2ggaXMgbm90IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiYW4gQWRhcHRlclZpZXcgKGlkOiAiICsgdmlld0lkICsgIikiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgdmlld0lkOworICAgICAgICBQZW5kaW5nSW50ZW50IHBlbmRpbmdJbnRlbnRUZW1wbGF0ZTsKKworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBUQUcgPSA4OwogICAgIH0KIAogICAgIC8qKgpAQCAtMTIwLDIxICszOTUsMzAgQEAKICAgICAgICAgICAgIHRoaXMudmlld0lkID0gaWQ7CiAgICAgICAgICAgICB0aGlzLnBlbmRpbmdJbnRlbnQgPSBwZW5kaW5nSW50ZW50OwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHB1YmxpYyBTZXRPbkNsaWNrUGVuZGluZ0ludGVudChQYXJjZWwgcGFyY2VsKSB7CiAgICAgICAgICAgICB2aWV3SWQgPSBwYXJjZWwucmVhZEludCgpOwogICAgICAgICAgICAgcGVuZGluZ0ludGVudCA9IFBlbmRpbmdJbnRlbnQucmVhZFBlbmRpbmdJbnRlbnRPck51bGxGcm9tUGFyY2VsKHBhcmNlbCk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CiAgICAgICAgICAgICBkZXN0LndyaXRlSW50KFRBRyk7CiAgICAgICAgICAgICBkZXN0LndyaXRlSW50KHZpZXdJZCk7CiAgICAgICAgICAgICBwZW5kaW5nSW50ZW50LndyaXRlVG9QYXJjZWwoZGVzdCwgMCAvKiBubyBmbGFncyAqLyk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KFZpZXcgcm9vdCkgewogICAgICAgICAgICAgZmluYWwgVmlldyB0YXJnZXQgPSByb290LmZpbmRWaWV3QnlJZCh2aWV3SWQpOworCisgICAgICAgICAgICAvLyBJZiB0aGUgdmlldyBpcyBhbiBBZGFwdGVyVmlldywgc2V0dGluZyBhIFBlbmRpbmdJbnRlbnQgb24gY2xpY2sgZG9lc24ndCBtYWtlIG11Y2gKKyAgICAgICAgICAgIC8vIHNlbnNlLCBkbyB0aGV5IG1lYW4gdG8gc2V0IGEgUGVuZGluZ0ludGVudCB0ZW1wbGF0ZSBmb3IgdGhlIEFkYXB0ZXJWaWV3J3MgY2hpbGRyZW4/CisgICAgICAgICAgICBpZiAobUlzV2lkZ2V0Q29sbGVjdGlvbkNoaWxkKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoIlJlbW90ZVZpZXdzIiwgIkNhbm5vdCBzZXRPbkNsaWNrUGVuZGluZ0ludGVudCBmb3IgY29sbGVjdGlvbiBpdGVtICIgKworCQkJCSIoaWQ6ICIgKyB2aWV3SWQgKyAiKSIpOworICAgICAgICAgICAgICAgIC8vIFRPRE86IHJldHVybjsgV2UnbGwgbGV0IHRoaXMgc2xpZGUgdW50aWwgYXBwcyBhcmUgdXAgdG8gZGF0ZS4KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsICYmIHBlbmRpbmdJbnRlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIE9uQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CkBAIC0yNTUsNyArNTM5LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgaW50IHZpZXdJZDsKICAgICAgICAgYm9vbGVhbiB0YXJnZXRCYWNrZ3JvdW5kOwogICAgICAgICBpbnQgYWxwaGE7CkBAIC0yNjYsNiArNTUwLDYzIEBACiAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRBRyA9IDM7CiAgICAgfQogICAgIAorICAgIHByaXZhdGUgY2xhc3MgUmVmbGVjdGlvbkFjdGlvbldpdGhvdXRQYXJhbXMgZXh0ZW5kcyBBY3Rpb24geworICAgICAgICBpbnQgdmlld0lkOworICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZTsKKworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBUQUcgPSA1OworCisgICAgICAgIFJlZmxlY3Rpb25BY3Rpb25XaXRob3V0UGFyYW1zKGludCB2aWV3SWQsIFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgICAgICAgICB0aGlzLnZpZXdJZCA9IHZpZXdJZDsKKyAgICAgICAgICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBSZWZsZWN0aW9uQWN0aW9uV2l0aG91dFBhcmFtcyhQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHRoaXMudmlld0lkID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgdGhpcy5tZXRob2ROYW1lID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgb3V0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIG91dC53cml0ZUludChUQUcpOworICAgICAgICAgICAgb3V0LndyaXRlSW50KHRoaXMudmlld0lkKTsKKyAgICAgICAgICAgIG91dC53cml0ZVN0cmluZyh0aGlzLm1ldGhvZE5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KFZpZXcgcm9vdCkgeworICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gcm9vdC5maW5kVmlld0J5SWQodmlld0lkKTsKKyAgICAgICAgICAgIGlmICh2aWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWN0aW9uRXhjZXB0aW9uKCJjYW4ndCBmaW5kIHZpZXc6IDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcodmlld0lkKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENsYXNzIGtsYXNzID0gdmlldy5nZXRDbGFzcygpOworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWV0aG9kID0ga2xhc3MuZ2V0TWV0aG9kKHRoaXMubWV0aG9kTmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWN0aW9uRXhjZXB0aW9uKCJ2aWV3OiAiICsga2xhc3MuZ2V0TmFtZSgpICsgIiBkb2Vzbid0IGhhdmUgbWV0aG9kOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHRoaXMubWV0aG9kTmFtZSArICIoKSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1ldGhvZC5pc0Fubm90YXRpb25QcmVzZW50KFJlbW90YWJsZVZpZXdNZXRob2QuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjdGlvbkV4Y2VwdGlvbigidmlldzogIiArIGtsYXNzLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNhbid0IHVzZSBtZXRob2Qgd2l0aCBSZW1vdGVWaWV3czogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLm1ldGhvZE5hbWUgKyAiKCkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBDb25zdGFudElmU3RhdGVtZW50CisgICAgICAgICAgICAgICAgaWYgKGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKCJSZW1vdGVWaWV3cyIsICJ2aWV3OiAiICsga2xhc3MuZ2V0TmFtZSgpICsgIiBjYWxsaW5nIG1ldGhvZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLm1ldGhvZE5hbWUgKyAiKCkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZSh2aWV3KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBY3Rpb25FeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQmFzZSBjbGFzcyBmb3IgdGhlIHJlZmxlY3Rpb24gYWN0aW9ucy4KICAgICAgKi8KQEAgLTI4NSw2ICs2MjYsNyBAQAogICAgICAgICBzdGF0aWMgZmluYWwgaW50IFVSSSA9IDExOwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IEJJVE1BUCA9IDEyOwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IEJVTkRMRSA9IDEzOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IElOVEVOVCA9IDE0OwogCiAgICAgICAgIGludCB2aWV3SWQ7CiAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lOwpAQCAtMzQ3LDYgKzY4OSw5IEBACiAgICAgICAgICAgICAgICAgY2FzZSBCVU5ETEU6CiAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBpbi5yZWFkQnVuZGxlKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU5URU5UOgorICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gSW50ZW50LkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNDAyLDYgKzc0Nyw5IEBACiAgICAgICAgICAgICAgICAgY2FzZSBCVU5ETEU6CiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUJ1bmRsZSgoQnVuZGxlKSB0aGlzLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJTlRFTlQ6CisgICAgICAgICAgICAgICAgICAgICgoSW50ZW50KXRoaXMudmFsdWUpLndyaXRlVG9QYXJjZWwob3V0LCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNDM1LDYgKzc4Myw4IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCaXRtYXAuY2xhc3M7CiAgICAgICAgICAgICAgICAgY2FzZSBCVU5ETEU6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCdW5kbGUuY2xhc3M7CisgICAgICAgICAgICAgICAgY2FzZSBJTlRFTlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlbnQuY2xhc3M7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CkBAIC00ODEsNiArODMxLDM1IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjdGlvbkV4Y2VwdGlvbihleCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlTWVtb3J5VXNhZ2VFc3RpbWF0ZShNZW1vcnlVc2FnZUNvdW50ZXIgY291bnRlcikgeworICAgICAgICAgICAgLy8gV2UgY3VycmVudGx5IG9ubHkgY2FsY3VsYXRlIEJpdG1hcCBtZW1vcnkgdXNhZ2UKKyAgICAgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBCSVRNQVA6CisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJpdG1hcCBiID0gKEJpdG1hcCkgdGhpcy52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJpdG1hcC5Db25maWcgYyA9IGIuZ2V0Q29uZmlnKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnBwID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBTFBIQV84OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwcCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJHQl81NjU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFSR0JfNDQ0NDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicHAgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBUkdCXzg4ODg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnBwID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIuYml0bWFwSW5jcmVtZW50KGIuZ2V0V2lkdGgoKSAqIGIuZ2V0SGVpZ2h0KCkgKiBicHApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC01MTgsNiArODk3LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlTWVtb3J5VXNhZ2VFc3RpbWF0ZShNZW1vcnlVc2FnZUNvdW50ZXIgY291bnRlcikgeworICAgICAgICAgICAgaWYgKG5lc3RlZFZpZXdzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb3VudGVyLmJpdG1hcEluY3JlbWVudChuZXN0ZWRWaWV3cy5lc3RpbWF0ZUJpdG1hcE1lbW9yeVVzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgaW50IHZpZXdJZDsKICAgICAgICAgUmVtb3RlVmlld3MgbmVzdGVkVmlld3M7CiAKQEAgLTUyNSw2ICs5MTEsMjYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTaW1wbGUgY2xhc3MgdXNlZCB0byBrZWVwIHRyYWNrIG9mIG1lbW9yeSB1c2FnZSBpbiBhIFJlbW90ZVZpZXdzLgorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBNZW1vcnlVc2FnZUNvdW50ZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIG1CaXRtYXBIZWFwTWVtb3J5VXNhZ2UgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYml0bWFwSW5jcmVtZW50KGludCBudW1CeXRlcykgeworICAgICAgICAgICAgbUJpdG1hcEhlYXBNZW1vcnlVc2FnZSArPSBudW1CeXRlczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Qml0bWFwSGVhcE1lbW9yeVVzYWdlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1CaXRtYXBIZWFwTWVtb3J5VXNhZ2U7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbUJpdG1hcEhlYXBNZW1vcnlVc2FnZTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDcmVhdGUgYSBuZXcgUmVtb3RlVmlld3Mgb2JqZWN0IHRoYXQgd2lsbCBkaXNwbGF5IHRoZSB2aWV3cyBjb250YWluZWQKICAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIGxheW91dCBmaWxlLgogICAgICAqIApAQCAtNTM0LDYgKzk0MCwxMCBAQAogICAgIHB1YmxpYyBSZW1vdGVWaWV3cyhTdHJpbmcgcGFja2FnZU5hbWUsIGludCBsYXlvdXRJZCkgewogICAgICAgICBtUGFja2FnZSA9IHBhY2thZ2VOYW1lOwogICAgICAgICBtTGF5b3V0SWQgPSBsYXlvdXRJZDsKKworICAgICAgICAvLyBzZXR1cCB0aGUgbWVtb3J5IHVzYWdlIHN0YXRpc3RpY3MKKyAgICAgICAgbU1lbW9yeVVzYWdlQ291bnRlciA9IG5ldyBNZW1vcnlVc2FnZUNvdW50ZXIoKTsKKyAgICAgICAgcmVjYWxjdWxhdGVNZW1vcnlVc2FnZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTQ0LDYgKzk1NCw4IEBACiAgICAgcHVibGljIFJlbW90ZVZpZXdzKFBhcmNlbCBwYXJjZWwpIHsKICAgICAgICAgbVBhY2thZ2UgPSBwYXJjZWwucmVhZFN0cmluZygpOwogICAgICAgICBtTGF5b3V0SWQgPSBwYXJjZWwucmVhZEludCgpOworICAgICAgICBtSXNXaWRnZXRDb2xsZWN0aW9uQ2hpbGQgPSBwYXJjZWwucmVhZEludCgpID09IDEgPyB0cnVlIDogZmFsc2U7CisKICAgICAgICAgaW50IGNvdW50ID0gcGFyY2VsLnJlYWRJbnQoKTsKICAgICAgICAgaWYgKGNvdW50ID4gMCkgewogICAgICAgICAgICAgbUFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFjdGlvbj4oY291bnQpOwpAQCAtNTYyLDE4ICs5NzQsNDEgQEAKICAgICAgICAgICAgICAgICBjYXNlIFZpZXdHcm91cEFjdGlvbi5UQUc6CiAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25zLmFkZChuZXcgVmlld0dyb3VwQWN0aW9uKHBhcmNlbCkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJlZmxlY3Rpb25BY3Rpb25XaXRob3V0UGFyYW1zLlRBRzoKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbnMuYWRkKG5ldyBSZWZsZWN0aW9uQWN0aW9uV2l0aG91dFBhcmFtcyhwYXJjZWwpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTZXRFbXB0eVZpZXcuVEFHOgorICAgICAgICAgICAgICAgICAgICBtQWN0aW9ucy5hZGQobmV3IFNldEVtcHR5VmlldyhwYXJjZWwpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTZXRPbkNsaWNrRXh0cmFzLlRBRzoKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbnMuYWRkKG5ldyBTZXRPbkNsaWNrRXh0cmFzKHBhcmNlbCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNldFBlbmRpbmdJbnRlbnRUZW1wbGF0ZS5UQUc6CisgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25zLmFkZChuZXcgU2V0UGVuZGluZ0ludGVudFRlbXBsYXRlKHBhcmNlbCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNldE9uQ2xpY2tGaWxsSW5JbnRlbnQuVEFHOgorICAgICAgICAgICAgICAgICAgICBtQWN0aW9ucy5hZGQobmV3IFNldE9uQ2xpY2tGaWxsSW5JbnRlbnQocGFyY2VsKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBY3Rpb25FeGNlcHRpb24oIlRhZyAiICsgdGFnICsgIiBub3QgZm91bmQiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICAvLyBzZXR1cCB0aGUgbWVtb3J5IHVzYWdlIHN0YXRpc3RpY3MKKyAgICAgICAgbU1lbW9yeVVzYWdlQ291bnRlciA9IG5ldyBNZW1vcnlVc2FnZUNvdW50ZXIoKTsKKyAgICAgICAgcmVjYWxjdWxhdGVNZW1vcnlVc2FnZSgpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBjbG9uZSgpIHsKICAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgdGhhdCA9IG5ldyBSZW1vdGVWaWV3cyhtUGFja2FnZSwgbUxheW91dElkKTsKICAgICAgICAgaWYgKG1BY3Rpb25zICE9IG51bGwpIHsKICAgICAgICAgICAgIHRoYXQubUFjdGlvbnMgPSAoQXJyYXlMaXN0PEFjdGlvbj4pbUFjdGlvbnMuY2xvbmUoKTsKICAgICAgICAgfQorCisgICAgICAgIC8vIHVwZGF0ZSB0aGUgbWVtb3J5IHVzYWdlIHN0YXRzIG9mIHRoZSBjbG9uZWQgUmVtb3RlVmlld3MKKyAgICAgICAgdGhhdC5yZWNhbGN1bGF0ZU1lbW9yeVVzYWdlKCk7CiAgICAgICAgIHJldHVybiB0aGF0OwogICAgIH0KIApAQCAtNTg1LDYgKzEwMjAsMzkgQEAKICAgICAgICAgcmV0dXJuIG1MYXlvdXRJZDsKICAgICB9CiAKKyAgICAvKgorICAgICAqIFRoaXMgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIFJlbW90ZVZpZXdzIG9iamVjdCBpcyBiZWluZyBjcmVhdGVkIGZyb20gYQorICAgICAqIFJlbW90ZVZpZXdzU2VydmljZSBmb3IgdXNlIGFzIGEgY2hpbGQgb2YgYSB3aWRnZXQgY29sbGVjdGlvbi4gVGhpcyBmbGFnIGlzIHVzZWQKKyAgICAgKiB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgY2VydGFpbiBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlLCBpbiBwYXJ0aWN1bGFyLAorICAgICAqIHNldHRpbmcgb24gY2xpY2sgZXh0cmFzIGFuZCBzZXR0aW5nIG9uIGNsaWNrIHBlbmRpbmcgaW50ZW50cy4gVGhlIGZvcm1lciBpcyBlbmFibGVkLAorICAgICAqIGFuZCB0aGUgbGF0dGVyIGRpc2FibGVkIHdoZW4gdGhpcyBmbGFnIGlzIHRydWUuCisgICAgICovCisgICAgdm9pZCBzZXRJc1dpZGdldENvbGxlY3Rpb25DaGlsZChib29sZWFuIGlzV2lkZ2V0Q29sbGVjdGlvbkNoaWxkKSB7CisgICAgICAgIG1Jc1dpZGdldENvbGxlY3Rpb25DaGlsZCA9IGlzV2lkZ2V0Q29sbGVjdGlvbkNoaWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgdGhlIG1lbW9yeSB1c2FnZSBzdGF0aXN0aWNzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWNhbGN1bGF0ZU1lbW9yeVVzYWdlKCkgeworICAgICAgICBtTWVtb3J5VXNhZ2VDb3VudGVyLmNsZWFyKCk7CisKKyAgICAgICAgLy8gQWNjdW11bGF0ZSB0aGUgbWVtb3J5IHVzYWdlIGZvciBlYWNoIGFjdGlvbgorICAgICAgICBpZiAobUFjdGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUFjdGlvbnMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBtQWN0aW9ucy5nZXQoaSkudXBkYXRlTWVtb3J5VXNhZ2VFc3RpbWF0ZShtTWVtb3J5VXNhZ2VDb3VudGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gZXN0aW1hdGUgb2YgdGhlIGJpdG1hcCBoZWFwIG1lbW9yeSB1c2FnZSBmb3IgdGhpcyBSZW1vdGVWaWV3cy4KKyAgICAgKi8KKyAgICBpbnQgZXN0aW1hdGVCaXRtYXBNZW1vcnlVc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIG1NZW1vcnlVc2FnZUNvdW50ZXIuZ2V0Qml0bWFwSGVhcE1lbW9yeVVzYWdlKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQWRkIGFuIGFjdGlvbiB0byBiZSBleGVjdXRlZCBvbiB0aGUgcmVtb3RlIHNpZGUgd2hlbiBhcHBseSBpcyBjYWxsZWQuCiAgICAgICogCkBAIC01OTUsNiArMTA2Myw5IEBACiAgICAgICAgICAgICBtQWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QWN0aW9uPigpOwogICAgICAgICB9CiAgICAgICAgIG1BY3Rpb25zLmFkZChhKTsKKworICAgICAgICAvLyB1cGRhdGUgdGhlIG1lbW9yeSB1c2FnZSBzdGF0cworICAgICAgICBhLnVwZGF0ZU1lbW9yeVVzYWdlRXN0aW1hdGUobU1lbW9yeVVzYWdlQ291bnRlcik7CiAgICAgfQogCiAgICAgLyoqCkBAIC02MjIsNiArMTA5MywyNCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyB7QGxpbmsgQWRhcHRlclZpZXdGbGlwcGVyI3Nob3dOZXh0KCl9CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyBvbiB3aGljaCB0byBjYWxsIHtAbGluayBBZGFwdGVyVmlld0ZsaXBwZXIjc2hvd05leHQoKX0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93TmV4dChpbnQgdmlld0lkKSB7CisgICAgICAgIGFkZEFjdGlvbihuZXcgUmVmbGVjdGlvbkFjdGlvbldpdGhvdXRQYXJhbXModmlld0lkLCAic2hvd05leHQiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIHtAbGluayBBZGFwdGVyVmlld0ZsaXBwZXIjc2hvd1ByZXZpb3VzKCl9CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyBvbiB3aGljaCB0byBjYWxsIHtAbGluayBBZGFwdGVyVmlld0ZsaXBwZXIjc2hvd1ByZXZpb3VzKCl9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2hvd1ByZXZpb3VzKGludCB2aWV3SWQpIHsKKyAgICAgICAgYWRkQWN0aW9uKG5ldyBSZWZsZWN0aW9uQWN0aW9uV2l0aG91dFBhcmFtcyh2aWV3SWQsICJzaG93UHJldmlvdXMiKSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIFZpZXcuc2V0VmlzaWJpbGl0eQogICAgICAqIAogICAgICAqIEBwYXJhbSB2aWV3SWQgVGhlIGlkIG9mIHRoZSB2aWV3IHdob3NlIHZpc2liaWxpdHkgc2hvdWxkIGNoYW5nZQpAQCAtNjMwLDcgKzExMTksNyBAQAogICAgIHB1YmxpYyB2b2lkIHNldFZpZXdWaXNpYmlsaXR5KGludCB2aWV3SWQsIGludCB2aXNpYmlsaXR5KSB7CiAgICAgICAgIHNldEludCh2aWV3SWQsICJzZXRWaXNpYmlsaXR5IiwgdmlzaWJpbGl0eSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIFRleHRWaWV3LnNldFRleHQKICAgICAgKiAKQEAgLTY3Miw2ICsxMTYxLDE2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIEFkYXB0ZXJWaWV3LnNldEVtcHR5VmlldworICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIHZpZXcgb24gd2hpY2ggdG8gc2V0IHRoZSBlbXB0eSB2aWV3CisgICAgICogQHBhcmFtIGVtcHR5Vmlld0lkIFRoZSB2aWV3IGlkIG9mIHRoZSBlbXB0eSB2aWV3CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW1wdHlWaWV3KGludCB2aWV3SWQsIGludCBlbXB0eVZpZXdJZCkgeworICAgICAgICBhZGRBY3Rpb24obmV3IFNldEVtcHR5Vmlldyh2aWV3SWQsIGVtcHR5Vmlld0lkKSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIHtAbGluayBDaHJvbm9tZXRlciNzZXRCYXNlIENocm9ub21ldGVyLnNldEJhc2V9LAogICAgICAqIHtAbGluayBDaHJvbm9tZXRlciNzZXRGb3JtYXQgQ2hyb25vbWV0ZXIuc2V0Rm9ybWF0fSwKICAgICAgKiBhbmQge0BsaW5rIENocm9ub21ldGVyI3N0YXJ0IENocm9ub21ldGVyLnN0YXJ0KCl9IG9yCkBAIC03MTgsNiArMTIxNywxMSBAQAogICAgICAqIHtAbGluayBhbmRyb2lkLnZpZXcuVmlldyNzZXRPbkNsaWNrTGlzdGVuZXIoYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyKX0KICAgICAgKiB0byBsYXVuY2ggdGhlIHByb3ZpZGVkIHtAbGluayBQZW5kaW5nSW50ZW50fS4KICAgICAgKiAKKyAgICAgKiBXaGVuIHNldHRpbmcgdGhlIG9uLWNsaWNrIGFjdGlvbiBvZiBpdGVtcyB3aXRoaW4gY29sbGVjdGlvbnMgKGVnLiB7QGxpbmsgTGlzdFZpZXd9LAorICAgICAqIHtAbGluayBTdGFja1ZpZXd9IGV0Yy4pLCB0aGlzIG1ldGhvZCB3aWxsIG5vdCB3b3JrLiBJbnN0ZWFkLCB1c2Uge0BsaW5rCisgICAgICogUmVtb3RlVmlld3Mjc2V0UGVuZGluZ0ludGVudFRlbXBsYXRlKGludCwgUGVuZGluZ0ludGVudCkgaW4gY29uanVuY3Rpb24gd2l0aAorICAgICAqIFJlbW90ZVZpZXdzI3NldE9uQ2xpY2tGaWxsSW5JbnRlbnQoaW50LCBJbnRlbnQpLgorICAgICAqCiAgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIHZpZXcgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIHtAbGluayBQZW5kaW5nSW50ZW50fSB3aGVuIGNsaWNrZWQKICAgICAgKiBAcGFyYW0gcGVuZGluZ0ludGVudCBUaGUge0BsaW5rIFBlbmRpbmdJbnRlbnR9IHRvIHNlbmQgd2hlbiB1c2VyIGNsaWNrcwogICAgICAqLwpAQCAtNzI2LDYgKzEyMzAsNTUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBXaGVuIHVzaW5nIGNvbGxlY3Rpb25zIChlZy4ge0BsaW5rIExpc3RWaWV3fSwge0BsaW5rIFN0YWNrVmlld30gZXRjLikgaW4gd2lkZ2V0cywgaXQgaXMgdmVyeQorICAgICAqIGNvc3RseSB0byBzZXQgUGVuZGluZ0ludGVudHMgb24gdGhlIGluZGl2aWR1YWwgaXRlbXMsIGFuZCBpcyBoZW5jZSBub3QgcGVybWl0dGVkLiBJbnN0ZWFkCisgICAgICogdGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgdG8gc2V0IGEgc2luZ2xlIFBlbmRpbmdJbnRlbnQgdGVtcGxhdGUgb24gdGhlIGNvbGxlY3Rpb24sIGFuZAorICAgICAqIGluZGl2aWR1YWwgaXRlbXMgY2FuIGRpZmZlcmVudGlhdGUgdGhlaXIgb24tY2xpY2sgYmVoYXZpb3IgdXNpbmcKKyAgICAgKiB7QGxpbmsgUmVtb3RlVmlld3Mjc2V0T25DbGlja0ZpbGxJbkludGVudChpbnQsIEludGVudCl9LgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIGNvbGxlY3Rpb24gd2hvJ3MgY2hpbGRyZW4gd2lsbCB1c2UgdGhpcyBQZW5kaW5nSW50ZW50IHRlbXBsYXRlCisgICAgICogICAgICAgICAgd2hlbiBjbGlja2VkCisgICAgICogQHBhcmFtIHBlbmRpbmdJbnRlbnRUZW1wbGF0ZSBUaGUge0BsaW5rIFBlbmRpbmdJbnRlbnR9IHRvIGJlIGNvbWJpbmVkIHdpdGggZXh0cmFzIHNwZWNpZmllZAorICAgICAqICAgICAgICAgIGJ5IGEgY2hpbGQgb2Ygdmlld0lkIGFuZCBleGVjdXRlZCB3aGVuIHRoYXQgY2hpbGQgaXMgY2xpY2tlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBlbmRpbmdJbnRlbnRUZW1wbGF0ZShpbnQgdmlld0lkLCBQZW5kaW5nSW50ZW50IHBlbmRpbmdJbnRlbnRUZW1wbGF0ZSkgeworICAgICAgICBhZGRBY3Rpb24obmV3IFNldFBlbmRpbmdJbnRlbnRUZW1wbGF0ZSh2aWV3SWQsIHBlbmRpbmdJbnRlbnRUZW1wbGF0ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJlaW5nIGRlcHJlY2F0ZWQuIFNlZSB7QGxpbmsgUmVtb3RlVmlld3Mjc2V0T25DbGlja0ZpbGxJbkludGVudChpbnQsIEludGVudCl9LgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZAorICAgICAqIEBwYXJhbSBleHRyYXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPbkNsaWNrRXh0cmFzKGludCB2aWV3SWQsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgYWRkQWN0aW9uKG5ldyBTZXRPbkNsaWNrRXh0cmFzKHZpZXdJZCwgZXh0cmFzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiB1c2luZyBjb2xsZWN0aW9ucyAoZWcuIHtAbGluayBMaXN0Vmlld30sIHtAbGluayBTdGFja1ZpZXd9IGV0Yy4pIGluIHdpZGdldHMsIGl0IGlzIHZlcnkKKyAgICAgKiBjb3N0bHkgdG8gc2V0IFBlbmRpbmdJbnRlbnRzIG9uIHRoZSBpbmRpdmlkdWFsIGl0ZW1zLCBhbmQgaXMgaGVuY2Ugbm90IHBlcm1pdHRlZC4gSW5zdGVhZAorICAgICAqIGEgc2luZ2xlIFBlbmRpbmdJbnRlbnQgdGVtcGxhdGUgY2FuIGJlIHNldCBvbiB0aGUgY29sbGVjdGlvbiwgc2VlIHtAbGluaworICAgICAqIFJlbW90ZVZpZXdzI3NldFBlbmRpbmdJbnRlbnRUZW1wbGF0ZShpbnQsIFBlbmRpbmdJbnRlbnQpfSwgYW5kIHRoZSBpbmRpdmlkdWFsIG9uLWNsaWNrCisgICAgICogYWN0aW9uIG9mIGEgZ2l2ZW4gaXRlbSBjYW4gYmUgZGlzdGluZ3Vpc2hlZCBieSBzZXR0aW5nIGEgZmlsbEluSW50ZW50IG9uIHRoYXQgaXRlbS4gVGhlCisgICAgICogZmlsbEluSW50ZW50IGlzIHRoZW4gY29tYmluZWQgd2l0aCB0aGUgUGVuZGluZ0ludGVudCB0ZW1wbGF0ZSBpbiBvcmRlciB0byBkZXRlcm1pbmUgdGhlIGZpbmFsCisgICAgICogaW50ZW50IHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgaXRlbSBpcyBjbGlja2VkLiBUaGlzIHdvcmtzIGFzIGZvbGxvd3M6IGFueSBmaWVsZHMKKyAgICAgKiB3aGljaCBhcmUgbGVmdCBibGFuayBpbiB0aGUgUGVuZGluZ0ludGVudCB0ZW1wbGF0ZSwgYnV0IGFyZSBwcm92aWRlZCBieSB0aGUgZmlsbEluSW50ZW50CisgICAgICogd2lsbCBiZSBvdmVyd3JpdHRlbiwgYW5kIHRoZSByZXN1bHRpbmcgUGVuZGluZ0ludGVudCB3aWxsIGJlIHVzZWQuCisgICAgICoKKyAgICAgKgorICAgICAqIG9mIHRoZSBQZW5kaW5nSW50ZW50IHRlbXBsYXRlIHdpbGwgdGhlbiBiZSBmaWxsZWQgaW4gd2l0aCB0aGUgYXNzb2NpYXRlZCBmaWVsZHMgdGhhdCBhcmUKKyAgICAgKiBzZXQgaW4gZmlsbEluSW50ZW50LiBTZWUge0BsaW5rIEludGVudCNmaWxsSW4oSW50ZW50LCBpbnQpfSBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIHZpZXcgb24gd2hpY2ggdG8gc2V0IHRoZSBmaWxsSW5JbnRlbnQKKyAgICAgKiBAcGFyYW0gZmlsbEluSW50ZW50IFRoZSBpbnRlbnQgd2hpY2ggd2lsbCBiZSBjb21iaW5lZCB3aXRoIHRoZSBwYXJlbnQncyBQZW5kaW5nSW50ZW50CisgICAgICogICAgICAgIGluIG9yZGVyIHRvIGRldGVybWluZSB0aGUgb24tY2xpY2sgYmVoYXZpb3Igb2YgdGhlIHZpZXcgc3BlY2lmaWVkIGJ5IHZpZXdJZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9uQ2xpY2tGaWxsSW5JbnRlbnQoaW50IHZpZXdJZCwgSW50ZW50IGZpbGxJbkludGVudCkgeworICAgICAgICBhZGRBY3Rpb24obmV3IFNldE9uQ2xpY2tGaWxsSW5JbnRlbnQodmlld0lkLCBmaWxsSW5JbnRlbnQpKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBhIGNvbWJpbmF0aW9uIG9mIHtAbGluayBEcmF3YWJsZSNzZXRBbHBoYShpbnQpfSwKICAgICAgKiB7QGxpbmsgRHJhd2FibGUjc2V0Q29sb3JGaWx0ZXIoaW50LCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSl9LApAQCAtNzY5LDYgKzEzMjIsMzcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3I3NldFJlbW90ZVZpZXdzQWRhcHRlcihJbnRlbnQpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2aWV3SWQgVGhlIGlkIG9mIHRoZSB2aWV3IHdob3NlIHRleHQgc2hvdWxkIGNoYW5nZQorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGludGVudCBvZiB0aGUgc2VydmljZSB3aGljaCB3aWxsIGJlCisgICAgICogICAgICAgICAgICBwcm92aWRpbmcgZGF0YSB0byB0aGUgUmVtb3RlVmlld3NBZGFwdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlQWRhcHRlcihpbnQgdmlld0lkLCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHNldEludGVudCh2aWV3SWQsICJzZXRSZW1vdGVWaWV3c0FkYXB0ZXIiLCBpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcjc21vb3RoU2Nyb2xsVG9Qb3NpdGlvbihpbnQsIGludCl9LgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIHZpZXcgd2hvc2UgdGV4dCBzaG91bGQgY2hhbmdlCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFNjcm9sbCB0byB0aGlzIGFkYXB0ZXIgcG9zaXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY3JvbGxQb3NpdGlvbihpbnQgdmlld0lkLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgc2V0SW50KHZpZXdJZCwgInNtb290aFNjcm9sbFRvUG9zaXRpb24iLCBwb3NpdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIHtAbGluayBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyNzbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKGludCwgaW50KX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyB3aG9zZSB0ZXh0IHNob3VsZCBjaGFuZ2UKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFNjcm9sbCBieSB0aGlzIGFkYXB0ZXIgcG9zaXRpb24gb2Zmc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVsYXRpdmVTY3JvbGxQb3NpdGlvbihpbnQgdmlld0lkLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHNldEludCh2aWV3SWQsICJzbW9vdGhTY3JvbGxCeU9mZnNldCIsIG9mZnNldCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2FsbCBhIG1ldGhvZCB0YWtpbmcgb25lIGJvb2xlYW4gb24gYSB2aWV3IGluIHRoZSBsYXlvdXQgZm9yIHRoaXMgUmVtb3RlVmlld3MuCiAgICAgICoKICAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyB3aG9zZSB0ZXh0IHNob3VsZCBjaGFuZ2UKQEAgLTkxNSw2ICsxNDk5LDE2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld0lkCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRlbnQoaW50IHZpZXdJZCwgU3RyaW5nIG1ldGhvZE5hbWUsIEludGVudCB2YWx1ZSkgeworICAgICAgICBhZGRBY3Rpb24obmV3IFJlZmxlY3Rpb25BY3Rpb24odmlld0lkLCBtZXRob2ROYW1lLCBSZWZsZWN0aW9uQWN0aW9uLklOVEVOVCwgdmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBJbmZsYXRlcyB0aGUgdmlldyBoaWVyYXJjaHkgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QgYW5kIGFwcGxpZXMKICAgICAgKiBhbGwgb2YgdGhlIGFjdGlvbnMuCiAgICAgICogCkBAIC0xMDAwLDYgKzE1OTQsNyBAQAogICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgewogICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1QYWNrYWdlKTsKICAgICAgICAgZGVzdC53cml0ZUludChtTGF5b3V0SWQpOworICAgICAgICBkZXN0LndyaXRlSW50KG1Jc1dpZGdldENvbGxlY3Rpb25DaGlsZCA/IDEgOiAwKTsKICAgICAgICAgaW50IGNvdW50OwogICAgICAgICBpZiAobUFjdGlvbnMgIT0gbnVsbCkgewogICAgICAgICAgICAgY291bnQgPSBtQWN0aW9ucy5zaXplKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3NBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3NBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkNjc1OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3c0FkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDg4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LklSZW1vdGVWaWV3c0ZhY3Rvcnk7CisKKy8qKgorICogQW4gYWRhcHRlciB0byBhIFJlbW90ZVZpZXdzU2VydmljZSB3aGljaCBmZXRjaGVzIGFuZCBjYWNoZXMgUmVtb3RlVmlld3MKKyAqIHRvIGJlIGxhdGVyIGluZmxhdGVkIGFzIGNoaWxkIHZpZXdzLgorICovCisvKiogQGhpZGUgKi8KK3B1YmxpYyBjbGFzcyBSZW1vdGVWaWV3c0FkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSZW1vdGVWaWV3c0FkYXB0ZXIiOworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgSW50ZW50IG1JbnRlbnQ7CisgICAgcHJpdmF0ZSBSZW1vdGVWaWV3c0FkYXB0ZXJTZXJ2aWNlQ29ubmVjdGlvbiBtU2VydmljZUNvbm5lY3Rpb247CisgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPFJlbW90ZUFkYXB0ZXJDb25uZWN0aW9uQ2FsbGJhY2s+IG1DYWxsYmFjazsKKyAgICBwcml2YXRlIEZpeGVkU2l6ZVJlbW90ZVZpZXdzQ2FjaGUgbUNhY2hlOworCisgICAgLy8gVGhlIHNldCBvZiByZXF1ZXN0ZWQgdmlld3MgdGhhdCBhcmUgdG8gYmUgbm90aWZpZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBSZW1vdGVWaWV3cyBhcmUKKyAgICAvLyBsb2FkZWQuCisgICAgcHJpdmF0ZSBSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0UmVmU2V0IG1SZXF1ZXN0ZWRWaWV3czsKKworICAgIHByaXZhdGUgSGFuZGxlclRocmVhZCBtV29ya2VyVGhyZWFkOworICAgIC8vIGl0ZW1zIG1heSBiZSBpbnRlcnJ1cHRlZCB3aXRoaW4gdGhlIG5vcm1hbGx5IHByb2Nlc3NlZCBxdWV1ZXMKKyAgICBwcml2YXRlIEhhbmRsZXIgbVdvcmtlclF1ZXVlOworICAgIHByaXZhdGUgSGFuZGxlciBtTWFpblF1ZXVlOworCisgICAgLyoqCisgICAgICogQW4gaW50ZXJmYWNlIGZvciB0aGUgUmVtb3RlQWRhcHRlciB0byBub3RpZnkgb3RoZXIgY2xhc3NlcyB3aGVuIGFkYXB0ZXJzCisgICAgICogYXJlIGFjdHVhbGx5IGNvbm5lY3RlZCB0by9kaXNjb25uZWN0ZWQgZnJvbSB0aGVpciBhY3R1YWwgc2VydmljZXMuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBSZW1vdGVBZGFwdGVyQ29ubmVjdGlvbkNhbGxiYWNrIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25SZW1vdGVBZGFwdGVyQ29ubmVjdGVkKCk7CisKKyAgICAgICAgcHVibGljIHZvaWQgb25SZW1vdGVBZGFwdGVyRGlzY29ubmVjdGVkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHNlcnZpY2UgY29ubmVjdGlvbiB0aGF0IGdldHMgcG9wdWxhdGVkIHdoZW4gdGhlIFJlbW90ZVZpZXdzU2VydmljZSBpcworICAgICAqIGJvdW5kLiAgVGhpcyBtdXN0IGJlIGEgc3RhdGljIGlubmVyIGNsYXNzIHRvIGVuc3VyZSB0aGF0IG5vIHJlZmVyZW5jZXMgdG8gdGhlIG91dGVyCisgICAgICogUmVtb3RlVmlld3NBZGFwdGVyIGluc3RhbmNlIGlzIHJldGFpbmVkICh0aGlzIHdvdWxkIHByZXZlbnQgdGhlIFJlbW90ZVZpZXdzQWRhcHRlciBmcm9tIGJlaW5nCisgICAgICogZ2FyYmFnZSBjb2xsZWN0ZWQsIGFuZCB3b3VsZCBjYXVzZSB1cyB0byBsZWFrIGFjdGl2aXRpZXMgZHVlIHRvIHRoZSBjYWNoaW5nIG1lY2hhbmlzbSBmb3IKKyAgICAgKiBGcmFtZUxheW91dHMgaW4gdGhlIGFkYXB0ZXIpLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlbW90ZVZpZXdzQWRhcHRlclNlcnZpY2VDb25uZWN0aW9uIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24geworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNvbm5lY3RlZDsKKyAgICAgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPFJlbW90ZVZpZXdzQWRhcHRlcj4gbUFkYXB0ZXI7CisgICAgICAgIHByaXZhdGUgSVJlbW90ZVZpZXdzRmFjdG9yeSBtUmVtb3RlVmlld3NGYWN0b3J5OworCisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3c0FkYXB0ZXJTZXJ2aWNlQ29ubmVjdGlvbihSZW1vdGVWaWV3c0FkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICAgICAgbUFkYXB0ZXIgPSBuZXcgV2Vha1JlZmVyZW5jZTxSZW1vdGVWaWV3c0FkYXB0ZXI+KGFkYXB0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwKKyAgICAgICAgICAgICAgICBJQmluZGVyIHNlcnZpY2UpIHsKKyAgICAgICAgICAgIG1SZW1vdGVWaWV3c0ZhY3RvcnkgPSBJUmVtb3RlVmlld3NGYWN0b3J5LlN0dWIuYXNJbnRlcmZhY2Uoc2VydmljZSk7CisgICAgICAgICAgICBtQ29ubmVjdGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgLy8gUXVldWUgdXAgd29yayB0aGF0IHdlIG5lZWQgdG8gZG8gZm9yIHRoZSBjYWxsYmFjayB0byBydW4KKyAgICAgICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzQWRhcHRlciBhZGFwdGVyID0gbUFkYXB0ZXIuZ2V0KCk7CisgICAgICAgICAgICBpZiAoYWRhcHRlciA9PSBudWxsKSByZXR1cm47CisgICAgICAgICAgICBhZGFwdGVyLm1Xb3JrZXJRdWV1ZS5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENhbGwgYmFjayB0byB0aGUgc2VydmljZSB0byBub3RpZnkgdGhhdCB0aGUgZGF0YSBzZXQgY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICBpZiAoYWRhcHRlci5tU2VydmljZUNvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgSVJlbW90ZVZpZXdzRmFjdG9yeSBmYWN0b3J5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLm1TZXJ2aWNlQ29ubmVjdGlvbi5nZXRSZW1vdGVWaWV3c0ZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbCBiYWNrIHRvIHRoZSBmYWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS5vbkRhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIG5vdGlmeWluZyBmYWN0b3J5IG9mIGRhdGEgc2V0IGNoYW5nZWQgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uU2VydmljZUNvbm5lY3RlZCgpOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gZWFybHkgdG8gcHJldmVudCBhbnl0aGluZyBmdXJ0aGVyIGZyb20gYmVpbmcgbm90aWZpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZWZmZWN0aXZlbHkgbm90aGluZyBoYXMgY2hhbmdlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcXVlc3QgbWV0YSBkYXRhIHNvIHRoYXQgd2UgaGF2ZSB1cCB0byBkYXRlIGRhdGEgd2hlbiBjYWxsaW5nIGJhY2sgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZW1vdGUgYWRhcHRlciBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci51cGRhdGVNZXRhRGF0YSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBQb3N0IGEgcnVubmFibGUgdG8gY2FsbCBiYWNrIHRvIHRoZSB2aWV3IHRvIG5vdGlmeSBpdCB0aGF0IHdlIGhhdmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbm5lY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci5tTWFpblF1ZXVlLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVtb3RlQWRhcHRlckNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjayA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLm1DYWxsYmFjay5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKKyAgICAgICAgICAgIG1Db25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1SZW1vdGVWaWV3c0ZhY3RvcnkgPSBudWxsOworCisgICAgICAgICAgICBmaW5hbCBSZW1vdGVWaWV3c0FkYXB0ZXIgYWRhcHRlciA9IG1BZGFwdGVyLmdldCgpOworICAgICAgICAgICAgaWYgKGFkYXB0ZXIgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBDbGVhciB0aGUgbWFpbi93b3JrZXIgcXVldWVzCisgICAgICAgICAgICBhZGFwdGVyLm1NYWluUXVldWUucmVtb3ZlTWVzc2FnZXMoMCk7CisgICAgICAgICAgICBhZGFwdGVyLm1Xb3JrZXJRdWV1ZS5yZW1vdmVNZXNzYWdlcygwKTsKKworICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGNhY2hlICh0aGUgbWV0YSBkYXRhIHdpbGwgYmUgcmUtcmVxdWVzdGVkIG9uIHNlcnZpY2UgcmUtY29ubmVjdGlvbikKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoYWRhcHRlci5tQ2FjaGUpIHsKKyAgICAgICAgICAgICAgICBhZGFwdGVyLm1DYWNoZS5yZXNldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBSZW1vdGVBZGFwdGVyQ29ubmVjdGlvbkNhbGxiYWNrIGNhbGxiYWNrID0gYWRhcHRlci5tQ2FsbGJhY2suZ2V0KCk7CisgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUmVtb3RlQWRhcHRlckRpc2Nvbm5lY3RlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElSZW1vdGVWaWV3c0ZhY3RvcnkgZ2V0UmVtb3RlVmlld3NGYWN0b3J5KCkgeworICAgICAgICAgICAgcmV0dXJuIG1SZW1vdGVWaWV3c0ZhY3Rvcnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29ubmVjdGVkOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBGcmFtZUxheW91dCB3aGljaCBjb250YWlucyBhIGxvYWRpbmcgdmlldywgYW5kIG1hbmFnZXMgdGhlIHJlL2FwcGx5aW5nIG9mIFJlbW90ZVZpZXdzIHdoZW4KKyAgICAgKiB0aGV5IGFyZSBsb2FkZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0IGV4dGVuZHMgRnJhbWVMYXlvdXQgeworICAgICAgICBwdWJsaWMgUmVtb3RlVmlld3NGcmFtZUxheW91dChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVwZGF0ZXMgdGhpcyBSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0IGRlcGVuZGluZyBvbiB0aGUgdmlldyB0aGF0IHdhcyBsb2FkZWQuCisgICAgICAgICAqIEBwYXJhbSB2aWV3IHRoZSBSZW1vdGVWaWV3cyB0aGF0IHdhcyBsb2FkZWQuIElmIG51bGwsIHRoZSBSZW1vdGVWaWV3cyB3YXMgbm90IGxvYWRlZAorICAgICAgICAgKiAgICAgICAgICAgICBzdWNjZXNzZnVsbHkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblJlbW90ZVZpZXdzTG9hZGVkKFJlbW90ZVZpZXdzIHZpZXcpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhpcyBsYXlvdXQgZmlyc3QKKyAgICAgICAgICAgICAgICByZW1vdmVBbGxWaWV3cygpOworICAgICAgICAgICAgICAgIGFkZFZpZXcodmlldy5hcHBseShnZXRDb250ZXh0KCksIHRoaXMpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGFwcGx5IFJlbW90ZVZpZXdzLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcmVzIHRoZSByZWZlcmVuY2VzIG9mIGFsbCB0aGUgUmVtb3RlVmlld3NGcmFtZUxheW91dHMgdGhhdCBoYXZlIGJlZW4gcmV0dXJuZWQgYnkgdGhlCisgICAgICogYWRhcHRlciB0aGF0IGhhdmUgbm90IHlldCBoYWQgdGhlaXIgUmVtb3RlVmlld3MgbG9hZGVkLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgUmVtb3RlVmlld3NGcmFtZUxheW91dFJlZlNldCB7CisgICAgICAgIHByaXZhdGUgSGFzaE1hcDxJbnRlZ2VyLCBMaW5rZWRMaXN0PFJlbW90ZVZpZXdzRnJhbWVMYXlvdXQ+PiBtUmVmZXJlbmNlczsKKworICAgICAgICBwdWJsaWMgUmVtb3RlVmlld3NGcmFtZUxheW91dFJlZlNldCgpIHsKKyAgICAgICAgICAgIG1SZWZlcmVuY2VzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgTGlua2VkTGlzdDxSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0Pj4oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgbmV3IHJlZmVyZW5jZSB0byBhIFJlbW90ZVZpZXdzRnJhbWVMYXlvdXQgcmV0dXJuZWQgYnkgdGhlIGFkYXB0ZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhZGQoaW50IHBvc2l0aW9uLCBSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0IGxheW91dCkgeworICAgICAgICAgICAgZmluYWwgSW50ZWdlciBwb3MgPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIExpbmtlZExpc3Q8UmVtb3RlVmlld3NGcmFtZUxheW91dD4gcmVmczsKKworICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBsaXN0IGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgaWYgKG1SZWZlcmVuY2VzLmNvbnRhaW5zS2V5KHBvcykpIHsKKyAgICAgICAgICAgICAgICByZWZzID0gbVJlZmVyZW5jZXMuZ2V0KHBvcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlZnMgPSBuZXcgTGlua2VkTGlzdDxSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0PigpOworICAgICAgICAgICAgICAgIG1SZWZlcmVuY2VzLnB1dChwb3MsIHJlZnMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBZGQgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIGxpc3QKKyAgICAgICAgICAgIHJlZnMuYWRkKGxheW91dCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTm90aWZpZXMgZWFjaCBvZiB0aGUgUmVtb3RlVmlld3NGcmFtZUxheW91dHMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBwb3NpdGlvbiB0aGF0CisgICAgICAgICAqIHRoZSBhc3NvY2lhdGVkIFJlbW90ZVZpZXdzIGhhcyBsb2FkZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlPblJlbW90ZVZpZXdzTG9hZGVkKGludCBwb3NpdGlvbiwgUmVtb3RlVmlld3MgdmlldywgaW50IHR5cGVJZCkgeworICAgICAgICAgICAgaWYgKHZpZXcgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHBvcyA9IHBvc2l0aW9uOworICAgICAgICAgICAgaWYgKG1SZWZlcmVuY2VzLmNvbnRhaW5zS2V5KHBvcykpIHsKKyAgICAgICAgICAgICAgICAvLyBOb3RpZnkgYWxsIHRoZSByZWZlcmVuY2VzIGZvciB0aGF0IHBvc2l0aW9uIG9mIHRoZSBuZXdseSBsb2FkZWQgUmVtb3RlVmlld3MKKyAgICAgICAgICAgICAgICBmaW5hbCBMaW5rZWRMaXN0PFJlbW90ZVZpZXdzRnJhbWVMYXlvdXQ+IHJlZnMgPSBtUmVmZXJlbmNlcy5nZXQocG9zKTsKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFJlbW90ZVZpZXdzRnJhbWVMYXlvdXQgcmVmIDogcmVmcykgeworICAgICAgICAgICAgICAgICAgICByZWYub25SZW1vdGVWaWV3c0xvYWRlZCh2aWV3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVmcy5jbGVhcigpOworCisgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoaXMgc2V0IGZyb20gdGhlIG9yaWdpbmFsIG1hcHBpbmcKKyAgICAgICAgICAgICAgICBtUmVmZXJlbmNlcy5yZW1vdmUocG9zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZW1vdmVzIGFsbCByZWZlcmVuY2VzIHRvIGFsbCBSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0cyByZXR1cm5lZCBieSB0aGUgYWRhcHRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgLy8gV2UgY3VycmVudGx5IGp1c3QgY2xlYXIgdGhlIHJlZmVyZW5jZXMsIGFuZCBsZWF2ZSBhbGwgdGhlIHByZXZpb3VzIGxheW91dHMgcmV0dXJuZWQKKyAgICAgICAgICAgIC8vIGluIHRoZWlyIGRlZmF1bHQgc3RhdGUgb2YgdGhlIGxvYWRpbmcgdmlldy4KKyAgICAgICAgICAgIG1SZWZlcmVuY2VzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0YS1kYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FjaGUgaW4gaXQncyBjdXJyZW50IHN0YXRlLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgUmVtb3RlVmlld3NNZXRhRGF0YSB7CisgICAgICAgIGludCBjb3VudDsKKyAgICAgICAgaW50IHZpZXdUeXBlQ291bnQ7CisgICAgICAgIGJvb2xlYW4gaGFzU3RhYmxlSWRzOworICAgICAgICBib29sZWFuIGlzRGF0YURpcnR5OworCisgICAgICAgIC8vIFVzZWQgdG8gZGV0ZXJtaW5lIGhvdyB0byBjb25zdHJ1Y3QgbG9hZGluZyB2aWV3cy4gIElmIGEgbG9hZGluZyB2aWV3IGlzIG5vdCBzcGVjaWZpZWQKKyAgICAgICAgLy8gYnkgdGhlIHVzZXIsIHRoZW4gd2UgdHJ5IGFuZCBsb2FkIHRoZSBmaXJzdCB2aWV3LCBhbmQgdXNlIGl0cyBoZWlnaHQgYXMgdGhlIGhlaWdodCBmb3IKKyAgICAgICAgLy8gdGhlIGRlZmF1bHQgbG9hZGluZyB2aWV3LgorICAgICAgICBSZW1vdGVWaWV3cyBtVXNlckxvYWRpbmdWaWV3OworICAgICAgICBSZW1vdGVWaWV3cyBtRmlyc3RWaWV3OworICAgICAgICBpbnQgbUZpcnN0Vmlld0hlaWdodDsKKworICAgICAgICAvLyBBIG1hcHBpbmcgZnJvbSB0eXBlIGlkIHRvIGEgc2V0IG9mIHVuaXF1ZSB0eXBlIGlkcworICAgICAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtVHlwZUlkSW5kZXhNYXA7CisKKyAgICAgICAgcHVibGljIFJlbW90ZVZpZXdzTWV0YURhdGEoKSB7CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgICAgICAgICAvLyBieSBkZWZhdWx0IHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBkdW1teSB2aWV3IHR5cGUKKyAgICAgICAgICAgIHZpZXdUeXBlQ291bnQgPSAxOworICAgICAgICAgICAgaGFzU3RhYmxlSWRzID0gdHJ1ZTsKKyAgICAgICAgICAgIGlzRGF0YURpcnR5ID0gZmFsc2U7CisgICAgICAgICAgICBtVXNlckxvYWRpbmdWaWV3ID0gbnVsbDsKKyAgICAgICAgICAgIG1GaXJzdFZpZXcgPSBudWxsOworICAgICAgICAgICAgbUZpcnN0Vmlld0hlaWdodCA9IDA7CisgICAgICAgICAgICBtVHlwZUlkSW5kZXhNYXAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TG9hZGluZ1ZpZXdUZW1wbGF0ZXMoUmVtb3RlVmlld3MgbG9hZGluZ1ZpZXcsIFJlbW90ZVZpZXdzIGZpcnN0VmlldykgeworICAgICAgICAgICAgbVVzZXJMb2FkaW5nVmlldyA9IGxvYWRpbmdWaWV3OworICAgICAgICAgICAgaWYgKGZpcnN0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUZpcnN0VmlldyA9IGZpcnN0VmlldzsKKyAgICAgICAgICAgICAgICBtRmlyc3RWaWV3SGVpZ2h0ID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldE1hcHBlZFZpZXdUeXBlKGludCB0eXBlSWQpIHsKKyAgICAgICAgICAgIGlmIChtVHlwZUlkSW5kZXhNYXAuY29udGFpbnNLZXkodHlwZUlkKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtVHlwZUlkSW5kZXhNYXAuZ2V0KHR5cGVJZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdlICsxIGJlY2F1c2UgdGhlIGxvYWRpbmcgdmlldyBhbHdheXMgaGFzIHZpZXcgdHlwZSBpZCBvZiAwCisgICAgICAgICAgICAgICAgaW50IGluY3JlbWVudGFsVHlwZUlkID0gbVR5cGVJZEluZGV4TWFwLnNpemUoKSArIDE7CisgICAgICAgICAgICAgICAgbVR5cGVJZEluZGV4TWFwLnB1dCh0eXBlSWQsIGluY3JlbWVudGFsVHlwZUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5jcmVtZW50YWxUeXBlSWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFJlbW90ZVZpZXdzRnJhbWVMYXlvdXQgY3JlYXRlTG9hZGluZ1ZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LAorICAgICAgICAgICAgICAgIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IEZyYW1lTGF5b3V0LCBhbmQgc2V0dXAgdGhlIHJlZmVyZW5jZXMgZm9yIHRoaXMgcG9zaXRpb24KKyAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IHBhcmVudC5nZXRDb250ZXh0KCk7CisgICAgICAgICAgICBSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0IGxheW91dCA9IG5ldyBSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0KGNvbnRleHQpOworCisgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgbG9hZGluZyB2aWV3CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1DYWNoZSkgeworICAgICAgICAgICAgICAgIGlmIChtVXNlckxvYWRpbmdWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQSB1c2VyLXNwZWNpZmllZCBsb2FkaW5nIHZpZXcKKyAgICAgICAgICAgICAgICAgICAgVmlldyBsb2FkaW5nVmlldyA9IG1Vc2VyTG9hZGluZ1ZpZXcuYXBwbHkocGFyZW50LmdldENvbnRleHQoKSwgcGFyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGluZ1ZpZXcuc2V0VGFnKG5ldyBJbnRlZ2VyKDApKTsKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmFkZFZpZXcobG9hZGluZ1ZpZXcpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEEgZGVmYXVsdCBsb2FkaW5nIHZpZXcKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBzaXplIG9mIHRoZSBmaXJzdCByb3cgYXMgYSBndWlkZSBmb3IgdGhlIHNpemUgb2YgdGhlIGxvYWRpbmcgdmlldworICAgICAgICAgICAgICAgICAgICBpZiAobUZpcnN0Vmlld0hlaWdodCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgZmlyc3RWaWV3ID0gbUZpcnN0Vmlldy5hcHBseShwYXJlbnQuZ2V0Q29udGV4dCgpLCBwYXJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3Lm1lYXN1cmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygwLCBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygwLCBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0Vmlld0hlaWdodCA9IGZpcnN0Vmlldy5nZXRNZWFzdXJlZEhlaWdodCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0VmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBDb21wb3NlIHRoZSBsb2FkaW5nIHZpZXcgdGV4dAorICAgICAgICAgICAgICAgICAgICBUZXh0VmlldyB0ZXh0VmlldyA9IG5ldyBUZXh0VmlldyhwYXJlbnQuZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5sb2FkaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0SGVpZ2h0KG1GaXJzdFZpZXdIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSX0hPUklaT05UQUwgfCBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCk7CisgICAgICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldFRleHRTaXplKDE4LjBmKTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dENvbG9yKENvbG9yLmFyZ2IoOTYsIDI1NSwgMjU1LCAyNTUpKTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0U2hhZG93TGF5ZXIoMi4wZiwgMC4wZiwgMS4wZiwgQ29sb3IuQkxBQ0spOworICAgICAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRUYWcobmV3IEludGVnZXIoMCkpOworCisgICAgICAgICAgICAgICAgICAgIGxheW91dC5hZGRWaWV3KHRleHRWaWV3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBsYXlvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0YS1kYXRhIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBpdGVtIGluIHRoZSBjYWNoZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFJlbW90ZVZpZXdzSW5kZXhNZXRhRGF0YSB7CisgICAgICAgIGludCB0eXBlSWQ7CisgICAgICAgIGxvbmcgaXRlbUlkOworCisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3c0luZGV4TWV0YURhdGEoUmVtb3RlVmlld3MgdiwgbG9uZyBpdGVtSWQpIHsKKyAgICAgICAgICAgIHNldCh2LCBpdGVtSWQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0KFJlbW90ZVZpZXdzIHYsIGxvbmcgaWQpIHsKKyAgICAgICAgICAgIGl0ZW1JZCA9IGlkOworICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0eXBlSWQgPSB2LmdldExheW91dElkKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHlwZUlkID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBGaXhlZFNpemVSZW1vdGVWaWV3c0NhY2hlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJGaXhlZFNpemVSZW1vdGVWaWV3c0NhY2hlIjsKKworICAgICAgICAvLyBUaGUgbWV0YSBkYXRhIHJlbGF0ZWQgdG8gYWxsIHRoZSBSZW1vdGVWaWV3cywgaWUuIGNvdW50LCBpcyBzdGFibGUsIGV0Yy4KKyAgICAgICAgcHJpdmF0ZSBSZW1vdGVWaWV3c01ldGFEYXRhIG1NZXRhRGF0YTsKKworICAgICAgICAvLyBUaGUgY2FjaGUvbWFwcGluZyBvZiBwb3NpdGlvbiB0byBSZW1vdGVWaWV3c01ldGFEYXRhLiAgVGhpcyBzZXQgaXMgZ3VhcmFudGVlZCB0byBiZQorICAgICAgICAvLyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNldCBvZiBSZW1vdGVWaWV3cy4KKyAgICAgICAgLy8gTm90ZTogVGhlIHJlYXNvbiB0aGF0IHdlIGtlZXAgdGhpcyBzZXBhcmF0ZSBmcm9tIHRoZSBSZW1vdGVWaWV3cyBjYWNoZSBiZWxvdyBpcyB0aGF0IHRoaXMKKyAgICAgICAgLy8gd2Ugc3RpbGwgbmVlZCB0byBiZSBhYmxlIHRvIGFjY2VzcyB0aGUgbWFwcGluZyBvZiBwb3NpdGlvbiB0byBtZXRhIGRhdGEsIHdpdGhvdXQga2VlcGluZworICAgICAgICAvLyB0aGUgaGVhdnkgUmVtb3RlVmlld3MgYXJvdW5kLiAgVGhlIFJlbW90ZVZpZXdzIGNhY2hlIGlzIHRyaW1tZWQgdG8gZml4ZWQgY29uc3RyYWludHMgd3J0LgorICAgICAgICAvLyBtZW1vcnkgYW5kIHNpemUsIGJ1dCB0aGlzIG1ldGFkYXRhIGNhY2hlIHdpbGwgcmV0YWluIGluZm9ybWF0aW9uIHVudGlsIHRoZSBkYXRhIGF0IHRoZQorICAgICAgICAvLyBwb3NpdGlvbiBpcyBndWFyYW50ZWVkIGFzIG5vdCBiZWluZyBuZWNlc3NhcnkgYW55IG1vcmUgKHVzdWFsbHkgb24gbm90aWZ5RGF0YVNldENoYW5nZWQpLgorICAgICAgICBwcml2YXRlIEhhc2hNYXA8SW50ZWdlciwgUmVtb3RlVmlld3NJbmRleE1ldGFEYXRhPiBtSW5kZXhNZXRhRGF0YTsKKworICAgICAgICAvLyBUaGUgY2FjaGUgb2YgYWN0dWFsIFJlbW90ZVZpZXdzLCB3aGljaCBtYXkgYmUgcHJ1bmVkIGlmIHRoZSBjYWNoZSBnZXRzIHRvbyBsYXJnZSwgb3IgdXNlcworICAgICAgICAvLyB0b28gbXVjaCBtZW1vcnkuCisgICAgICAgIHByaXZhdGUgSGFzaE1hcDxJbnRlZ2VyLCBSZW1vdGVWaWV3cz4gbUluZGV4UmVtb3RlVmlld3M7CisKKyAgICAgICAgLy8gVGhlIHNldCBvZiBpbmRpY2VzIHRoYXQgaGF2ZSBiZWVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGJ5IHRoZSBjb2xsZWN0aW9uIHZpZXcKKyAgICAgICAgcHJpdmF0ZSBIYXNoU2V0PEludGVnZXI+IG1SZXF1ZXN0ZWRJbmRpY2VzOworCisgICAgICAgIC8vIFRoZSBzZXQgb2YgaW5kaWNlcyB0byBsb2FkLCBpbmNsdWRpbmcgdGhvc2UgZXhwbGljaXRseSByZXF1ZXN0ZWQsIGFzIHdlbGwgYXMgdGhvc2UKKyAgICAgICAgLy8gZGV0ZXJtaW5lZCBieSB0aGUgcHJlbG9hZGluZyBhbGdvcml0aG0gdG8gYmUgcHJlZmV0Y2hlZAorICAgICAgICBwcml2YXRlIEhhc2hTZXQ8SW50ZWdlcj4gbUxvYWRJbmRpY2VzOworCisgICAgICAgIC8vIFRoZSBsb3dlciBhbmQgdXBwZXIgYm91bmRzIG9mIHRoZSBwcmVsb2FkZWQgcmFuZ2UKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVByZWxvYWRMb3dlckJvdW5kOworICAgICAgICBwcml2YXRlIGludCBtUHJlbG9hZFVwcGVyQm91bmQ7CisKKyAgICAgICAgLy8gVGhlIGJvdW5kcyBvZiB0aGlzIGZpeGVkIGNhY2hlLCB3ZSB3aWxsIHRyeSBhbmQgZmlsbCBhcyBtYW55IGl0ZW1zIGludG8gdGhlIGNhY2hlIHVwIHRvCisgICAgICAgIC8vIHRoZSBtYXhDb3VudCBudW1iZXIgb2YgaXRlbXMsIG9yIHRoZSBtYXhTaXplIG1lbW9yeSB1c2FnZS4KKyAgICAgICAgLy8gVGhlIG1heENvdW50U2xhY2sgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBuZXcgcG9zaXRpb24gaW4gdGhlIGNhY2hlIHRvIGJlIGxvYWRlZCBpcworICAgICAgICAvLyBzdWZmaWNpZW50bHkgb3VzaWRlIHRoZSBvbGQgc2V0LCBwcm9tcHRpbmcgYSBzaGlmdGluZyBvZiB0aGUgIndpbmRvdyIgb2YgaXRlbXMgdG8gYmUKKyAgICAgICAgLy8gcHJlbG9hZGVkLgorICAgICAgICBwcml2YXRlIGludCBtTWF4Q291bnQ7CisgICAgICAgIHByaXZhdGUgaW50IG1NYXhDb3VudFNsYWNrOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBzTWF4Q291bnRTbGFja1BlcmNlbnQgPSAwLjc1ZjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHNNYXhNZW1vcnlVc2FnZSA9IDEwMjQgKiAxMDI0OworCisgICAgICAgIHB1YmxpYyBGaXhlZFNpemVSZW1vdGVWaWV3c0NhY2hlKGludCBtYXhDYWNoZVNpemUpIHsKKyAgICAgICAgICAgIG1NYXhDb3VudCA9IG1heENhY2hlU2l6ZTsKKyAgICAgICAgICAgIG1NYXhDb3VudFNsYWNrID0gTWF0aC5yb3VuZChzTWF4Q291bnRTbGFja1BlcmNlbnQgKiAobU1heENvdW50IC8gMikpOworICAgICAgICAgICAgbVByZWxvYWRMb3dlckJvdW5kID0gMDsKKyAgICAgICAgICAgIG1QcmVsb2FkVXBwZXJCb3VuZCA9IC0xOworICAgICAgICAgICAgbU1ldGFEYXRhID0gbmV3IFJlbW90ZVZpZXdzTWV0YURhdGEoKTsKKyAgICAgICAgICAgIG1JbmRleE1ldGFEYXRhID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgUmVtb3RlVmlld3NJbmRleE1ldGFEYXRhPigpOworICAgICAgICAgICAgbUluZGV4UmVtb3RlVmlld3MgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBSZW1vdGVWaWV3cz4oKTsKKyAgICAgICAgICAgIG1SZXF1ZXN0ZWRJbmRpY2VzID0gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKTsKKyAgICAgICAgICAgIG1Mb2FkSW5kaWNlcyA9IG5ldyBIYXNoU2V0PEludGVnZXI+KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBpbnNlcnQoaW50IHBvc2l0aW9uLCBSZW1vdGVWaWV3cyB2LCBsb25nIGl0ZW1JZCkgeworICAgICAgICAgICAgLy8gVHJpbSB0aGUgY2FjaGUgaWYgd2UgZ28gYmV5b25kIHRoZSBjb3VudAorICAgICAgICAgICAgaWYgKG1JbmRleFJlbW90ZVZpZXdzLnNpemUoKSA+PSBtTWF4Q291bnQpIHsKKyAgICAgICAgICAgICAgICBtSW5kZXhSZW1vdGVWaWV3cy5yZW1vdmUoZ2V0RmFydGhlc3RQb3NpdGlvbkZyb20ocG9zaXRpb24pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVHJpbSB0aGUgY2FjaGUgaWYgd2UgZ28gYmV5b25kIHRoZSBhdmFpbGFibGUgbWVtb3J5IHNpemUgY29uc3RyYWludHMKKyAgICAgICAgICAgIHdoaWxlIChnZXRSZW1vdGVWaWV3c0JpdG1hcE1lbW9yeVVzYWdlKCkgPj0gc01heE1lbW9yeVVzYWdlKSB7CisgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhpcyBpcyBjdXJyZW50bHkgdGhlIG1vc3QgbmFpdmUgbWVjaGFuaXNtIGZvciBkZWNpZGluZyB3aGF0IHRvIHBydW5lIHdoZW4KKyAgICAgICAgICAgICAgICAvLyB3ZSBoaXQgdGhlIG1lbW9yeSBsaW1pdC4gIEluIHRoZSBmdXR1cmUsIHdlIG1heSB3YW50IHRvIGNhbGN1bGF0ZSB3aGljaCBpbmRleCB0bworICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBiYXNlZCBvbiBib3RoIGl0cyBwb3NpdGlvbiBhcyB3ZWxsIGFzIGl0J3MgY3VycmVudCBtZW1vcnkgdXNhZ2UsIGFzIHdlbGwKKyAgICAgICAgICAgICAgICAvLyBhcyB3aGV0aGVyIGl0IHdhcyBkaXJlY3RseSByZXF1ZXN0ZWQgdnMuIHdoZXRoZXIgaXQgd2FzIHByZWxvYWRlZCBieSBvdXIgY2FjaGluZworICAgICAgICAgICAgICAgIC8vIG1lY2hhbmlzbS4KKyAgICAgICAgICAgICAgICBtSW5kZXhSZW1vdGVWaWV3cy5yZW1vdmUoZ2V0RmFydGhlc3RQb3NpdGlvbkZyb20ocG9zaXRpb24pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBtZXRhZGF0YSBjYWNoZQorICAgICAgICAgICAgaWYgKG1JbmRleE1ldGFEYXRhLmNvbnRhaW5zS2V5KHBvc2l0aW9uKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzSW5kZXhNZXRhRGF0YSBtZXRhRGF0YSA9IG1JbmRleE1ldGFEYXRhLmdldChwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgbWV0YURhdGEuc2V0KHYsIGl0ZW1JZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1JbmRleE1ldGFEYXRhLnB1dChwb3NpdGlvbiwgbmV3IFJlbW90ZVZpZXdzSW5kZXhNZXRhRGF0YSh2LCBpdGVtSWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbmRleFJlbW90ZVZpZXdzLnB1dChwb3NpdGlvbiwgdik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVtb3RlVmlld3NNZXRhRGF0YSBnZXRNZXRhRGF0YSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWV0YURhdGE7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFJlbW90ZVZpZXdzIGdldFJlbW90ZVZpZXdzQXQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpZiAobUluZGV4UmVtb3RlVmlld3MuY29udGFpbnNLZXkocG9zaXRpb24pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1JbmRleFJlbW90ZVZpZXdzLmdldChwb3NpdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgUmVtb3RlVmlld3NJbmRleE1ldGFEYXRhIGdldE1ldGFEYXRhQXQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpZiAobUluZGV4TWV0YURhdGEuY29udGFpbnNLZXkocG9zaXRpb24pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1JbmRleE1ldGFEYXRhLmdldChwb3NpdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IGdldFJlbW90ZVZpZXdzQml0bWFwTWVtb3J5VXNhZ2UoKSB7CisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG1lbW9yeSB1c2FnZSBvZiBhbGwgdGhlIFJlbW90ZVZpZXdzIGJpdG1hcHMgYmVpbmcgY2FjaGVkCisgICAgICAgICAgICBpbnQgbWVtID0gMDsKKyAgICAgICAgICAgIGZvciAoSW50ZWdlciBpIDogbUluZGV4UmVtb3RlVmlld3Mua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyB2ID0gbUluZGV4UmVtb3RlVmlld3MuZ2V0KGkpOworICAgICAgICAgICAgICAgIG1lbSArPSB2LmVzdGltYXRlQml0bWFwTWVtb3J5VXNhZ2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtZW07CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBpbnQgZ2V0RmFydGhlc3RQb3NpdGlvbkZyb20oaW50IHBvcykgeworICAgICAgICAgICAgLy8gRmluZCB0aGUgaW5kZXggZmFydGhlc3QgYXdheSBhbmQgcmVtb3ZlIHRoYXQKKyAgICAgICAgICAgIGludCBtYXhEaXN0ID0gMDsKKyAgICAgICAgICAgIGludCBtYXhEaXN0SW5kZXggPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgOiBtSW5kZXhSZW1vdGVWaWV3cy5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgIGludCBkaXN0ID0gTWF0aC5hYnMoaS1wb3MpOworICAgICAgICAgICAgICAgIGlmIChkaXN0ID4gbWF4RGlzdCkgeworICAgICAgICAgICAgICAgICAgICBtYXhEaXN0SW5kZXggPSBpOworICAgICAgICAgICAgICAgICAgICBtYXhEaXN0ID0gZGlzdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWF4RGlzdEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcXVldWVSZXF1ZXN0ZWRQb3NpdGlvblRvTG9hZChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvYWRJbmRpY2VzKSB7CisgICAgICAgICAgICAgICAgbVJlcXVlc3RlZEluZGljZXMuYWRkKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBtTG9hZEluZGljZXMuYWRkKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBxdWV1ZVBvc2l0aW9uc1RvQmVQcmVsb2FkZWRGcm9tUmVxdWVzdGVkUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHByZWxvYWQgYW55IGl0ZW1zCisgICAgICAgICAgICBpZiAobVByZWxvYWRMb3dlckJvdW5kIDw9IHBvc2l0aW9uICYmIHBvc2l0aW9uIDw9IG1QcmVsb2FkVXBwZXJCb3VuZCkgeworICAgICAgICAgICAgICAgIGludCBjZW50ZXIgPSAobVByZWxvYWRVcHBlckJvdW5kICsgbVByZWxvYWRMb3dlckJvdW5kKSAvIDI7CisgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKHBvc2l0aW9uIC0gY2VudGVyKSA8IG1NYXhDb3VudFNsYWNrKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1NZXRhRGF0YSkgeworICAgICAgICAgICAgICAgIGNvdW50ID0gbU1ldGFEYXRhLmNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9hZEluZGljZXMpIHsKKyAgICAgICAgICAgICAgICBtTG9hZEluZGljZXMuY2xlYXIoKTsKKworICAgICAgICAgICAgICAgIC8vIEFkZCBhbGwgdGhlIHJlcXVlc3RlZCBpbmRpY2VzCisgICAgICAgICAgICAgICAgbUxvYWRJbmRpY2VzLmFkZEFsbChtUmVxdWVzdGVkSW5kaWNlcyk7CisKKyAgICAgICAgICAgICAgICAvLyBBZGQgYWxsIHRoZSBwcmVsb2FkIGluZGljZXMKKyAgICAgICAgICAgICAgICBpbnQgaGFsZk1heENvdW50ID0gbU1heENvdW50IC8gMjsKKyAgICAgICAgICAgICAgICBtUHJlbG9hZExvd2VyQm91bmQgPSBwb3NpdGlvbiAtIGhhbGZNYXhDb3VudDsKKyAgICAgICAgICAgICAgICBtUHJlbG9hZFVwcGVyQm91bmQgPSBwb3NpdGlvbiArIGhhbGZNYXhDb3VudDsKKyAgICAgICAgICAgICAgICBpbnQgZWZmZWN0aXZlTG93ZXJCb3VuZCA9IE1hdGgubWF4KDAsIG1QcmVsb2FkTG93ZXJCb3VuZCk7CisgICAgICAgICAgICAgICAgaW50IGVmZmVjdGl2ZVVwcGVyQm91bmQgPSBNYXRoLm1pbihtUHJlbG9hZFVwcGVyQm91bmQsIGNvdW50IC0gMSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGVmZmVjdGl2ZUxvd2VyQm91bmQ7IGkgPD0gZWZmZWN0aXZlVXBwZXJCb3VuZDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkSW5kaWNlcy5hZGQoaSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQnV0IHJlbW92ZSBhbGwgdGhlIGluZGljZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBsb2FkZWQgYW5kIGFyZSBjYWNoZWQKKyAgICAgICAgICAgICAgICBtTG9hZEluZGljZXMucmVtb3ZlQWxsKG1JbmRleFJlbW90ZVZpZXdzLmtleVNldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IGdldE5leHRJbmRleFRvTG9hZCgpIHsKKyAgICAgICAgICAgIC8vIFdlIHRyeSBhbmQgcHJpb3JpdGl6ZSBpdGVtcyB0aGF0IGhhdmUgYmVlbiByZXF1ZXN0ZWQgZGlyZWN0bHksIGluc3RlYWQKKyAgICAgICAgICAgIC8vIG9mIGl0ZW1zIHRoYXQgYXJlIGxvYWRlZCBhcyBhIHJlc3VsdCBvZiB0aGUgY2FjaGluZyBtZWNoYW5pc20KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvYWRJbmRpY2VzKSB7CisgICAgICAgICAgICAgICAgLy8gUHJpb3JpdGl6ZSByZXF1ZXN0ZWQgaW5kaWNlcyB0byBiZSBsb2FkZWQgZmlyc3QKKyAgICAgICAgICAgICAgICBpZiAoIW1SZXF1ZXN0ZWRJbmRpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGkgPSBtUmVxdWVzdGVkSW5kaWNlcy5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgbVJlcXVlc3RlZEluZGljZXMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgICAgICBtTG9hZEluZGljZXMucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgcHJlbG9hZCBvdGhlciBpbmRpY2VzIGFzIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgIGlmICghbUxvYWRJbmRpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGkgPSBtTG9hZEluZGljZXMuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkSW5kaWNlcy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNSZW1vdGVWaWV3QXQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gbUluZGV4UmVtb3RlVmlld3MuY29udGFpbnNLZXkocG9zaXRpb24pOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zTWV0YURhdGFBdChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5kZXhNZXRhRGF0YS5jb250YWluc0tleShwb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IFdlIGRvIG5vdCB0cnkgYW5kIHJlc2V0IHRoZSBtZXRhIGRhdGEsIHNpbmNlIHRoYXQgaW5mb3JtYXRpb24gaXMgc3RpbGwgdXNlZCBieQorICAgICAgICAgICAgLy8gY29sbGVjdGlvbiB2aWV3cyB0byB2YWxpZGF0ZSBpdCdzIG93biBjb250ZW50cyAoYW5kIHdpbGwgYmUgcmUtcmVxdWVzdGVkIGlmIHRoZSBkYXRhCisgICAgICAgICAgICAvLyBpcyBpbnZhbGlkYXRlZCB0aHJvdWdoIHRoZSBub3RpZnlEYXRhU2V0Q2hhbmdlZCgpIGZsb3cpLgorCisgICAgICAgICAgICBtUHJlbG9hZExvd2VyQm91bmQgPSAwOworICAgICAgICAgICAgbVByZWxvYWRVcHBlckJvdW5kID0gLTE7CisgICAgICAgICAgICBtSW5kZXhSZW1vdGVWaWV3cy5jbGVhcigpOworICAgICAgICAgICAgbUluZGV4TWV0YURhdGEuY2xlYXIoKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvYWRJbmRpY2VzKSB7CisgICAgICAgICAgICAgICAgbVJlcXVlc3RlZEluZGljZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtTG9hZEluZGljZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBSZW1vdGVWaWV3c0FkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50LCBSZW1vdGVBZGFwdGVyQ29ubmVjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbUludGVudCA9IGludGVudDsKKyAgICAgICAgaWYgKG1JbnRlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm9uLW51bGwgSW50ZW50IG11c3QgYmUgc3BlY2lmaWVkLiIpOworICAgICAgICB9CisgICAgICAgIG1SZXF1ZXN0ZWRWaWV3cyA9IG5ldyBSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0UmVmU2V0KCk7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgd29ya2VyIHRocmVhZAorICAgICAgICBtV29ya2VyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIlJlbW90ZVZpZXdzQ2FjaGUtbG9hZGVyIik7CisgICAgICAgIG1Xb3JrZXJUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbVdvcmtlclF1ZXVlID0gbmV3IEhhbmRsZXIobVdvcmtlclRocmVhZC5nZXRMb29wZXIoKSk7CisgICAgICAgIG1NYWluUXVldWUgPSBuZXcgSGFuZGxlcihMb29wZXIubXlMb29wZXIoKSk7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgY2FjaGUgYW5kIHRoZSBzZXJ2aWNlIGNvbm5lY3Rpb24gb24gc3RhcnR1cAorICAgICAgICBtQ2FjaGUgPSBuZXcgRml4ZWRTaXplUmVtb3RlVmlld3NDYWNoZSg1MCk7CisgICAgICAgIG1DYWxsYmFjayA9IG5ldyBXZWFrUmVmZXJlbmNlPFJlbW90ZUFkYXB0ZXJDb25uZWN0aW9uQ2FsbGJhY2s+KGNhbGxiYWNrKTsKKyAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uID0gbmV3IFJlbW90ZVZpZXdzQWRhcHRlclNlcnZpY2VDb25uZWN0aW9uKHRoaXMpOworICAgICAgICByZXF1ZXN0QmluZFNlcnZpY2UoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9hZE5leHRJbmRleEluQmFja2dyb3VuZCgpIHsKKyAgICAgICAgbVdvcmtlclF1ZXVlLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IGluZGV4IHRvIGxvYWQKKyAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSAtMTsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1DYWNoZSkgeworICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IG1DYWNoZS5nZXROZXh0SW5kZXhUb0xvYWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCB0aGUgaXRlbSwgYW5kIG5vdGlmeSBhbnkgZXhpc3RpbmcgUmVtb3RlVmlld3NGcmFtZUxheW91dHMKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlUmVtb3RlVmlld3MocG9zaXRpb24pOworCisgICAgICAgICAgICAgICAgICAgIC8vIFF1ZXVlIHVwIGZvciB0aGUgbmV4dCBvbmUgdG8gbG9hZAorICAgICAgICAgICAgICAgICAgICBsb2FkTmV4dEluZGV4SW5CYWNrZ3JvdW5kKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlTWV0YURhdGEoKSB7CisgICAgICAgIGlmIChtU2VydmljZUNvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJUmVtb3RlVmlld3NGYWN0b3J5IGZhY3RvcnkgPSBtU2VydmljZUNvbm5lY3Rpb24uZ2V0UmVtb3RlVmlld3NGYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHByb3BlcnRpZXMvZmlyc3QgdmlldyAoc28gdGhhdCB3ZSBjYW4gdXNlIGl0IHRvCisgICAgICAgICAgICAgICAgLy8gbWVhc3VyZSBvdXIgZHVtbXkgdmlld3MpCisgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNTdGFibGVJZHMgPSBmYWN0b3J5Lmhhc1N0YWJsZUlkcygpOworICAgICAgICAgICAgICAgIGludCB2aWV3VHlwZUNvdW50ID0gZmFjdG9yeS5nZXRWaWV3VHlwZUNvdW50KCk7CisgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gZmFjdG9yeS5nZXRDb3VudCgpOworICAgICAgICAgICAgICAgIFJlbW90ZVZpZXdzIGxvYWRpbmdWaWV3ID0gZmFjdG9yeS5nZXRMb2FkaW5nVmlldygpOworICAgICAgICAgICAgICAgIFJlbW90ZVZpZXdzIGZpcnN0VmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKChjb3VudCA+IDApICYmIChsb2FkaW5nVmlldyA9PSBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXcgPSBmYWN0b3J5LmdldFZpZXdBdCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWwgUmVtb3RlVmlld3NNZXRhRGF0YSBtZXRhRGF0YSA9IG1DYWNoZS5nZXRNZXRhRGF0YSgpOworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobWV0YURhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEuaGFzU3RhYmxlSWRzID0gaGFzU3RhYmxlSWRzOworICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YS52aWV3VHlwZUNvdW50ID0gdmlld1R5cGVDb3VudCArIDE7CisgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhLmNvdW50ID0gY291bnQ7CisgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhLnNldExvYWRpbmdWaWV3VGVtcGxhdGVzKGxvYWRpbmdWaWV3LCBmaXJzdFZpZXcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gcHJpbnQgdGhlIGVycm9yCisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgaW4gcmVxdWVzdE1ldGFEYXRhKCk6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisKKyAgICAgICAgICAgICAgICAvLyByZXNldCBhbnkgbWVtYmVycyBhZnRlciB0aGUgZmFpbGVkIGNhbGwKKyAgICAgICAgICAgICAgICBmaW5hbCBSZW1vdGVWaWV3c01ldGFEYXRhIG1ldGFEYXRhID0gbUNhY2hlLmdldE1ldGFEYXRhKCk7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtZXRhRGF0YSkgeworICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YS5yZXNldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSZW1vdGVWaWV3cyhmaW5hbCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICBJUmVtb3RlVmlld3NGYWN0b3J5IGZhY3RvcnkgPSBtU2VydmljZUNvbm5lY3Rpb24uZ2V0UmVtb3RlVmlld3NGYWN0b3J5KCk7CisKKyAgICAgICAgICAgIC8vIExvYWQgdGhlIGl0ZW0gaW5mb3JtYXRpb24gZnJvbSB0aGUgcmVtb3RlIHNlcnZpY2UKKyAgICAgICAgICAgIFJlbW90ZVZpZXdzIHJlbW90ZVZpZXdzID0gbnVsbDsKKyAgICAgICAgICAgIGxvbmcgaXRlbUlkID0gMDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVtb3RlVmlld3MgPSBmYWN0b3J5LmdldFZpZXdBdChwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgaXRlbUlkID0gZmFjdG9yeS5nZXRJdGVtSWQocG9zaXRpb24pOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBQcmludCB0aGUgZXJyb3IKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBpbiB1cGRhdGVSZW1vdGVWaWV3c0luZm8oIiArIHBvc2l0aW9uICsgIik6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisKKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gZWFybHkgdG8gcHJldmVudCBhZGRpdGlvbmFsIHdvcmsgaW4gcmUtY2VudGVyaW5nIHRoZSB2aWV3IGNhY2hlLCBhbmQKKyAgICAgICAgICAgICAgICAvLyBzd2FwcGluZyBmcm9tIHRoZSBsb2FkaW5nIHZpZXcKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUNhY2hlKSB7CisgICAgICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIFJlbW90ZVZpZXdzIHdlIGxvYWRlZAorICAgICAgICAgICAgICAgIG1DYWNoZS5pbnNlcnQocG9zaXRpb24sIHJlbW90ZVZpZXdzLCBpdGVtSWQpOworCisgICAgICAgICAgICAgICAgLy8gTm90aWZ5IGFsbCB0aGUgdmlld3MgdGhhdCB3ZSBoYXZlIHByZXZpb3VzbHkgcmV0dXJuZWQgZm9yIHRoaXMgaW5kZXggdGhhdAorICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5ldyBkYXRhIGZvciBpdC4KKyAgICAgICAgICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBydiA9IHJlbW90ZVZpZXdzOworICAgICAgICAgICAgICAgIGZpbmFsIGludCB0eXBlSWQgPSBtQ2FjaGUuZ2V0TWV0YURhdGFBdChwb3NpdGlvbikudHlwZUlkOworICAgICAgICAgICAgICAgIG1NYWluUXVldWUucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUmVxdWVzdGVkVmlld3Mubm90aWZ5T25SZW1vdGVWaWV3c0xvYWRlZChwb3NpdGlvbiwgcnYsIHR5cGVJZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBJbnRlbnQgZ2V0UmVtb3RlVmlld3NTZXJ2aWNlSW50ZW50KCkgeworICAgICAgICByZXR1cm4gbUludGVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICByZXF1ZXN0QmluZFNlcnZpY2UoKTsKKyAgICAgICAgZmluYWwgUmVtb3RlVmlld3NNZXRhRGF0YSBtZXRhRGF0YSA9IG1DYWNoZS5nZXRNZXRhRGF0YSgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1ldGFEYXRhKSB7CisgICAgICAgICAgICByZXR1cm4gbWV0YURhdGEuY291bnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEl0ZW0oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIC8vIERpc2FsbG93IGFyYml0cmFyeSBvYmplY3QgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGFuIGl0ZW0gZm9yIHRoZSB0aW1lIGJlaW5nCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgcmVxdWVzdEJpbmRTZXJ2aWNlKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAobUNhY2hlKSB7CisgICAgICAgICAgICBpZiAobUNhY2hlLmNvbnRhaW5zTWV0YURhdGFBdChwb3NpdGlvbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNhY2hlLmdldE1ldGFEYXRhQXQocG9zaXRpb24pLml0ZW1JZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJdGVtVmlld1R5cGUoaW50IHBvc2l0aW9uKSB7CisgICAgICAgIHJlcXVlc3RCaW5kU2VydmljZSgpOworICAgICAgICBpbnQgdHlwZUlkID0gMDsKKyAgICAgICAgc3luY2hyb25pemVkIChtQ2FjaGUpIHsKKyAgICAgICAgICAgIGlmIChtQ2FjaGUuY29udGFpbnNNZXRhRGF0YUF0KHBvc2l0aW9uKSkgeworICAgICAgICAgICAgICAgIHR5cGVJZCA9IG1DYWNoZS5nZXRNZXRhRGF0YUF0KHBvc2l0aW9uKS50eXBlSWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgUmVtb3RlVmlld3NNZXRhRGF0YSBtZXRhRGF0YSA9IG1DYWNoZS5nZXRNZXRhRGF0YSgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1ldGFEYXRhKSB7CisgICAgICAgICAgICByZXR1cm4gbWV0YURhdGEuZ2V0TWFwcGVkVmlld1R5cGUodHlwZUlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGl0ZW0gdHlwZSBpZCBmb3IgdGhlIHNwZWNpZmllZCBjb252ZXJ0IHZpZXcuICBSZXR1cm5zIC0xIGlmIHRoZSBjb252ZXJ0IHZpZXcKKyAgICAgKiBpcyBpbnZhbGlkLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGdldENvbnZlcnRWaWV3VHlwZUlkKFZpZXcgY29udmVydFZpZXcpIHsKKyAgICAgICAgaW50IHR5cGVJZCA9IC0xOworICAgICAgICBpZiAoY29udmVydFZpZXcgIT0gbnVsbCAmJiBjb252ZXJ0Vmlldy5nZXRUYWcoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0eXBlSWQgPSAoSW50ZWdlcikgY29udmVydFZpZXcuZ2V0VGFnKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHR5cGVJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICByZXF1ZXN0QmluZFNlcnZpY2UoKTsKKyAgICAgICAgaWYgKG1TZXJ2aWNlQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICAvLyAiUmVxdWVzdCIgYW4gaW5kZXggc28gdGhhdCB3ZSBjYW4gcXVldWUgaXQgZm9yIGxvYWRpbmcsIGluaXRpYXRlIHN1YnNlcXVlbnQKKyAgICAgICAgICAgIC8vIHByZWxvYWRpbmcsIGV0Yy4KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUNhY2hlKSB7CisgICAgICAgICAgICAgICAgLy8gUXVldWUgdXAgb3RoZXIgaW5kaWNlcyB0byBiZSBwcmVsb2FkZWQgYmFzZWQgb24gdGhpcyBwb3NpdGlvbgorICAgICAgICAgICAgICAgIG1DYWNoZS5xdWV1ZVBvc2l0aW9uc1RvQmVQcmVsb2FkZWRGcm9tUmVxdWVzdGVkUG9zaXRpb24ocG9zaXRpb24pOworCisgICAgICAgICAgICAgICAgUmVtb3RlVmlld3NGcmFtZUxheW91dCBsYXlvdXQgPSAoUmVtb3RlVmlld3NGcmFtZUxheW91dCkgY29udmVydFZpZXc7CisgICAgICAgICAgICAgICAgVmlldyBjb252ZXJ0Vmlld0NoaWxkID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpbnQgY29udmVydFZpZXdUeXBlSWQgPSAwOworICAgICAgICAgICAgICAgIGlmIChjb252ZXJ0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRWaWV3Q2hpbGQgPSBsYXlvdXQuZ2V0Q2hpbGRBdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgY29udmVydFZpZXdUeXBlSWQgPSBnZXRDb252ZXJ0Vmlld1R5cGVJZChjb252ZXJ0Vmlld0NoaWxkKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBTZWNvbmQsIHdlIHRyeSBhbmQgcmV0cmlldmUgdGhlIFJlbW90ZVZpZXdzIGZyb20gdGhlIGNhY2hlLCByZXR1cm5pbmcgYSBsb2FkaW5nCisgICAgICAgICAgICAgICAgLy8gdmlldyBhbmQgcXVldWVpbmcgaXQgdG8gYmUgbG9hZGVkIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGxvYWRlZC4KKyAgICAgICAgICAgICAgICBpZiAobUNhY2hlLmNvbnRhaW5zUmVtb3RlVmlld0F0KHBvc2l0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBwYXJlbnQuZ2V0Q29udGV4dCgpOworICAgICAgICAgICAgICAgICAgICBSZW1vdGVWaWV3cyBydiA9IG1DYWNoZS5nZXRSZW1vdGVWaWV3c0F0KHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHR5cGVJZCA9IG1DYWNoZS5nZXRNZXRhRGF0YUF0KHBvc2l0aW9uKS50eXBlSWQ7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2UgdGhlIGNvbnZlcnQgdmlldyB3aGVyZSBwb3NzaWJsZQorICAgICAgICAgICAgICAgICAgICBpZiAoY29udmVydFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnZlcnRWaWV3VHlwZUlkID09IHR5cGVJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2LnJlYXBwbHkoY29udGV4dCwgY29udmVydFZpZXdDaGlsZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRWaWV3OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgYSBuZXcgdmlldyB0byBiZSByZXR1cm5lZAorICAgICAgICAgICAgICAgICAgICBWaWV3IG5ld1ZpZXcgPSBydi5hcHBseShjb250ZXh0LCBwYXJlbnQpOworICAgICAgICAgICAgICAgICAgICBuZXdWaWV3LnNldFRhZyhuZXcgSW50ZWdlcih0eXBlSWQpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnZlcnRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dC5yZW1vdmVBbGxWaWV3cygpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0ID0gbmV3IFJlbW90ZVZpZXdzRnJhbWVMYXlvdXQoY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmFkZFZpZXcobmV3Vmlldyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXlvdXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNhY2hlIGRvZXMgbm90IGhhdmUgdGhlIFJlbW90ZVZpZXdzIGF0IHRoaXMgcG9zaXRpb24sIHRoZW4gY3JlYXRlIGEKKyAgICAgICAgICAgICAgICAgICAgLy8gbG9hZGluZyB2aWV3IGFuZCBxdWV1ZSB0aGUgYWN0dWFsIHBvc2l0aW9uIHRvIGJlIGxvYWRlZCBpbiB0aGUgYmFja2dyb3VuZAorICAgICAgICAgICAgICAgICAgICBSZW1vdGVWaWV3c0ZyYW1lTGF5b3V0IGxvYWRpbmdWaWV3ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVtb3RlVmlld3NNZXRhRGF0YSBtZXRhRGF0YSA9IG1DYWNoZS5nZXRNZXRhRGF0YSgpOworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1ldGFEYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2FkaW5nVmlldyA9IG1ldGFEYXRhLmNyZWF0ZUxvYWRpbmdWaWV3KHBvc2l0aW9uLCBjb252ZXJ0VmlldywgcGFyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1SZXF1ZXN0ZWRWaWV3cy5hZGQocG9zaXRpb24sIGxvYWRpbmdWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgbUNhY2hlLnF1ZXVlUmVxdWVzdGVkUG9zaXRpb25Ub0xvYWQocG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBsb2FkTmV4dEluZGV4SW5CYWNrZ3JvdW5kKCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRpbmdWaWV3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFZpZXcocGFyZW50LmdldENvbnRleHQoKSk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRWaWV3VHlwZUNvdW50KCkgeworICAgICAgICByZXF1ZXN0QmluZFNlcnZpY2UoKTsKKyAgICAgICAgZmluYWwgUmVtb3RlVmlld3NNZXRhRGF0YSBtZXRhRGF0YSA9IG1DYWNoZS5nZXRNZXRhRGF0YSgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1ldGFEYXRhKSB7CisgICAgICAgICAgICByZXR1cm4gbWV0YURhdGEudmlld1R5cGVDb3VudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpIHsKKyAgICAgICAgcmVxdWVzdEJpbmRTZXJ2aWNlKCk7CisgICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzTWV0YURhdGEgbWV0YURhdGEgPSBtQ2FjaGUuZ2V0TWV0YURhdGEoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtZXRhRGF0YSkgeworICAgICAgICAgICAgcmV0dXJuIG1ldGFEYXRhLmhhc1N0YWJsZUlkczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBnZXRDb3VudCgpIDw9IDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YVNldENoYW5nZWQoKSB7CisgICAgICAgIG1Xb3JrZXJRdWV1ZS5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIC8vIENvbXBsZXRlIHRoZSBhY3R1YWwgbm90aWZ5RGF0YVNldENoYW5nZWQoKSBjYWxsIGluaXRpYXRlZCBlYXJsaWVyCisgICAgICAgICAgICAgICAgaWYgKG1TZXJ2aWNlQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIElSZW1vdGVWaWV3c0ZhY3RvcnkgZmFjdG9yeSA9IG1TZXJ2aWNlQ29ubmVjdGlvbi5nZXRSZW1vdGVWaWV3c0ZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcnkub25EYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgaW4gdXBkYXRlTm90aWZ5RGF0YVNldENoYW5nZWQoKTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGVhcmx5IHRvIHByZXZlbnQgZnJvbSBmdXJ0aGVyIGJlaW5nIG5vdGlmaWVkIChzaW5jZSBub3RoaW5nIGhhcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEZsdXNoIHRoZSBjYWNoZSBzbyB0aGF0IHdlIGNhbiByZWxvYWQgbmV3IGl0ZW1zIGZyb20gdGhlIHNlcnZpY2UKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1DYWNoZSkgeworICAgICAgICAgICAgICAgICAgICBtQ2FjaGUucmVzZXQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBSZS1yZXF1ZXN0IHRoZSBuZXcgbWV0YWRhdGEgKG9ubHkgYWZ0ZXIgdGhlIG5vdGlmaWNhdGlvbiB0byB0aGUgZmFjdG9yeSkKKyAgICAgICAgICAgICAgICB1cGRhdGVNZXRhRGF0YSgpOworCisgICAgICAgICAgICAgICAgLy8gUHJvcGFnYXRlIHRoZSBub3RpZmljYXRpb24gYmFjayB0byB0aGUgYmFzZSBhZGFwdGVyCisgICAgICAgICAgICAgICAgbU1haW5RdWV1ZS5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyTm90aWZ5RGF0YVNldENoYW5nZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBOb3RlOiB3ZSBkbyBub3QgY2FsbCBzdXBlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpIHVudGlsIHRoZSBSZW1vdGVWaWV3c0ZhY3RvcnkgaGFzIGhhZAorICAgICAgICAvLyBhIGNoYW5jZSB0byB1cGRhdGUgaXRzZWxmIGFuZCByZXR1cm4gbmV3IG1ldGEgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyBkYXRhLgorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdXBlck5vdGlmeURhdGFTZXRDaGFuZ2VkKCkgeworICAgICAgICBzdXBlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiByZXF1ZXN0QmluZFNlcnZpY2UoKSB7CisgICAgICAgIC8vIHRyeSBiaW5kaW5nIHRoZSBzZXJ2aWNlICh3aGljaCB3aWxsIHN0YXJ0IGl0IGlmIGl0J3Mgbm90IGFscmVhZHkgcnVubmluZykKKyAgICAgICAgaWYgKCFtU2VydmljZUNvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgbUNvbnRleHQuYmluZFNlcnZpY2UobUludGVudCwgbVNlcnZpY2VDb25uZWN0aW9uLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1TZXJ2aWNlQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3c1NlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3c1NlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjEyNmFhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndpZGdldDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LklSZW1vdGVWaWV3c0ZhY3Rvcnk7CisKKy8qKgorICogVGhlIHNlcnZpY2UgdG8gYmUgY29ubmVjdGVkIHRvIGZvciBhIHJlbW90ZSBhZGFwdGVyIHRvIHJlcXVlc3QgUmVtb3RlVmlld3MuICBVc2VycyBzaG91bGQKKyAqIGV4dGVuZCB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlIHRvIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIFJlbW90ZVZpZXdzRmFjdG9yeSdzIHVzZWQgdG8KKyAqIHBvcHVsYXRlIHRoZSByZW1vdGUgY29sbGVjdGlvbiB2aWV3IChMaXN0VmlldywgR3JpZFZpZXcsIGV0YykuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZW1vdGVWaWV3c1NlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlJlbW90ZVZpZXdzU2VydmljZSI7CisKKyAgICAvLyBtdWx0aW1hcCBpbXBsZW1lbnRhdGlvbiBmb3IgcmVmZXJlbmNlIGNvdW50aW5nCisgICAgcHJpdmF0ZSBIYXNoTWFwPEludGVudC5GaWx0ZXJDb21wYXJpc29uLCBQYWlyPFJlbW90ZVZpZXdzRmFjdG9yeSwgSW50ZWdlcj4+IG1SZW1vdGVWaWV3RmFjdG9yaWVzOworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgLyoqCisgICAgICogQW4gaW50ZXJmYWNlIGZvciBhbiBhZGFwdGVyIGJldHdlZW4gYSByZW1vdGUgY29sbGVjdGlvbiB2aWV3IChMaXN0VmlldywgR3JpZFZpZXcsIGV0YykgYW5kCisgICAgICogdGhlIHVuZGVybHlpbmcgZGF0YSBmb3IgdGhhdCB2aWV3LiAgVGhlIGltcGxlbWVudG9yIGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgYSBSZW1vdGVWaWV3CisgICAgICogZm9yIGVhY2ggaXRlbSBpbiB0aGUgZGF0YSBzZXQuCisgICAgICogCisgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5BZGFwdGVyCisgICAgICogQHNlZSBhbmRyb2lkLmFwcHdpZGdldC5BcHBXaWRnZXRNYW5hZ2VyCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBSZW1vdGVWaWV3c0ZhY3RvcnkgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4geW91ciBmYWN0b3J5IGlzIGZpcnN0IGNvbnN0cnVjdGVkLiBUaGUgc2FtZSBmYWN0b3J5IG1heSBiZSBzaGFyZWQgYWNyb3NzCisgICAgICAgICAqIG11bHRpcGxlIFJlbW90ZVZpZXdBZGFwdGVycyBkZXBlbmRpbmcgb24gdGhlIGludGVudCBwYXNzZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpOworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gbm90aWZ5RGF0YVNldENoYW5nZWQoKSBpcyB0cmlnZ2VyZWQgb24gdGhlIHJlbW90ZSBhZGFwdGVyLiBUaGlzIGFsbG93cyBhCisgICAgICAgICAqIFJlbW90ZVZpZXdzRmFjdG9yeSB0byByZXNwb25kIHRvIGRhdGEgY2hhbmdlcyBieSB1cGRhdGluZyBhbnkgaW50ZXJuYWwgcmVmZXJlbmNlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBhbmRyb2lkLmFwcHdpZGdldC5BcHBXaWRnZXRNYW5hZ2VyI25vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChpbnRbXSwgaW50KQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25EYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGxhc3QgUmVtb3RlVmlld3NBZGFwdGVyIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmFjdG9yeSBpcworICAgICAgICAgKiB1bmJvdW5kLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCk7CisKKyAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpOworICAgICAgICBwdWJsaWMgUmVtb3RlVmlld3MgZ2V0Vmlld0F0KGludCBwb3NpdGlvbik7CisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBnZXRMb2FkaW5nVmlldygpOworICAgICAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlQ291bnQoKTsKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbik7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgcHJpdmF0ZSBwcm94eSBjbGFzcyBmb3IgdGhlIHByaXZhdGUgSVJlbW90ZVZpZXdzRmFjdG9yeSBpbnRlcmZhY2UgdGhyb3VnaCB0aGUKKyAgICAgKiBwdWJsaWMgUmVtb3RlVmlld3NGYWN0b3J5IGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFJlbW90ZVZpZXdzRmFjdG9yeUFkYXB0ZXIgZXh0ZW5kcyBJUmVtb3RlVmlld3NGYWN0b3J5LlN0dWIgeworICAgICAgICBwdWJsaWMgUmVtb3RlVmlld3NGYWN0b3J5QWRhcHRlcihSZW1vdGVWaWV3c0ZhY3RvcnkgZmFjdG9yeSkgeworICAgICAgICAgICAgbUZhY3RvcnkgPSBmYWN0b3J5OworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBvbkRhdGFTZXRDaGFuZ2VkKCkgeworICAgICAgICAgICAgbUZhY3Rvcnkub25EYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldENvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1GYWN0b3J5LmdldENvdW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBSZW1vdGVWaWV3cyBnZXRWaWV3QXQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBSZW1vdGVWaWV3cyBydiA9IG1GYWN0b3J5LmdldFZpZXdBdChwb3NpdGlvbik7CisgICAgICAgICAgICBydi5zZXRJc1dpZGdldENvbGxlY3Rpb25DaGlsZCh0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiBydjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIFJlbW90ZVZpZXdzIGdldExvYWRpbmdWaWV3KCkgeworICAgICAgICAgICAgcmV0dXJuIG1GYWN0b3J5LmdldExvYWRpbmdWaWV3KCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0Vmlld1R5cGVDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmFjdG9yeS5nZXRWaWV3VHlwZUNvdW50KCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBtRmFjdG9yeS5nZXRJdGVtSWQocG9zaXRpb24pOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNTdGFibGVJZHMoKSB7CisgICAgICAgICAgICByZXR1cm4gbUZhY3RvcnkuaGFzU3RhYmxlSWRzKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFJlbW90ZVZpZXdzRmFjdG9yeSBtRmFjdG9yeTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVtb3RlVmlld3NTZXJ2aWNlKCkgeworICAgICAgICBtUmVtb3RlVmlld0ZhY3RvcmllcyA9CisgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8SW50ZW50LkZpbHRlckNvbXBhcmlzb24sIFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPj4oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAvLyBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCB0byB0aGUgcGFydGljdWxhciBmYWN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGludGVudAorICAgICAgICAgICAgSW50ZW50LkZpbHRlckNvbXBhcmlzb24gZmMgPSBuZXcgSW50ZW50LkZpbHRlckNvbXBhcmlzb24oaW50ZW50KTsKKyAgICAgICAgICAgIFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPiBmYWN0b3J5UmVmID0gbnVsbDsKKyAgICAgICAgICAgIFJlbW90ZVZpZXdzRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgICAgIGlmICghbVJlbW90ZVZpZXdGYWN0b3JpZXMuY29udGFpbnNLZXkoZmMpKSB7CisgICAgICAgICAgICAgICAgZmFjdG9yeSA9IG9uR2V0Vmlld0ZhY3RvcnkoaW50ZW50KTsKKyAgICAgICAgICAgICAgICBmYWN0b3J5UmVmID0gbmV3IFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPihmYWN0b3J5LCAxKTsKKyAgICAgICAgICAgICAgICBtUmVtb3RlVmlld0ZhY3Rvcmllcy5wdXQoZmMsIGZhY3RvcnlSZWYpOworICAgICAgICAgICAgICAgIGZhY3Rvcnkub25DcmVhdGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUGFpcjxSZW1vdGVWaWV3c0ZhY3RvcnksIEludGVnZXI+IG9sZEZhY3RvcnlSZWYgPSBtUmVtb3RlVmlld0ZhY3Rvcmllcy5nZXQoZmMpOworICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBvbGRGYWN0b3J5UmVmLmZpcnN0OworICAgICAgICAgICAgICAgIGludCBuZXdSZWZDb3VudCA9IG9sZEZhY3RvcnlSZWYuc2Vjb25kLmludFZhbHVlKCkgKyAxOworICAgICAgICAgICAgICAgIGZhY3RvcnlSZWYgPSBuZXcgUGFpcjxSZW1vdGVWaWV3c0ZhY3RvcnksIEludGVnZXI+KG9sZEZhY3RvcnlSZWYuZmlyc3QsIG5ld1JlZkNvdW50KTsKKyAgICAgICAgICAgICAgICBtUmVtb3RlVmlld0ZhY3Rvcmllcy5wdXQoZmMsIGZhY3RvcnlSZWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBSZW1vdGVWaWV3c0ZhY3RvcnlBZGFwdGVyKGZhY3RvcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25VbmJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBJbnRlbnQuRmlsdGVyQ29tcGFyaXNvbiBmYyA9IG5ldyBJbnRlbnQuRmlsdGVyQ29tcGFyaXNvbihpbnRlbnQpOworICAgICAgICAgICAgaWYgKG1SZW1vdGVWaWV3RmFjdG9yaWVzLmNvbnRhaW5zS2V5KGZjKSkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsZXZpYXRlcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IG9mIGhhdmluZyB0byBjbGVhciBhbGwgZmFjdG9yaWVzCisgICAgICAgICAgICAgICAgUGFpcjxSZW1vdGVWaWV3c0ZhY3RvcnksIEludGVnZXI+IG9sZEZhY3RvcnlSZWYgPQorICAgICAgICAgICAgICAgICAgICAgICAgbVJlbW90ZVZpZXdGYWN0b3JpZXMuZ2V0KGZjKTsKKyAgICAgICAgICAgICAgICBpbnQgbmV3UmVmQ291bnQgPSBvbGRGYWN0b3J5UmVmLnNlY29uZC5pbnRWYWx1ZSgpIC0gMTsKKyAgICAgICAgICAgICAgICBpZiAobmV3UmVmQ291bnQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBvbGRGYWN0b3J5UmVmLmZpcnN0Lm9uRGVzdHJveSgpOworICAgICAgICAgICAgICAgICAgICBtUmVtb3RlVmlld0ZhY3Rvcmllcy5yZW1vdmUoZmMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPiBmYWN0b3J5UmVmID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGFpcjxSZW1vdGVWaWV3c0ZhY3RvcnksIEludGVnZXI+KG9sZEZhY3RvcnlSZWYuZmlyc3QsIG5ld1JlZkNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgbVJlbW90ZVZpZXdGYWN0b3JpZXMucHV0KGZjLCBmYWN0b3J5UmVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uVW5iaW5kKGludGVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRlcml2ZWQgc2VydmljZSB0byBnZW5lcmF0ZSBhcHByb3ByaWF0ZSBmYWN0b3JpZXMgZm9yCisgICAgICogdGhlIGRhdGEuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFJlbW90ZVZpZXdzRmFjdG9yeSBvbkdldFZpZXdGYWN0b3J5KEludGVudCBpbnRlbnQpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Jlc291cmNlQ3Vyc29yQWRhcHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Jlc291cmNlQ3Vyc29yQWRhcHRlci5qYXZhCmluZGV4IGM5YzIxN2EuLmFlZTQxMWUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZXNvdXJjZUN1cnNvckFkYXB0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVzb3VyY2VDdXJzb3JBZGFwdGVyLmphdmEKQEAgLTM2LDkgKzM2LDggQEAKICAgICAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGUgTGlzdFZpZXcgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAgICAgKiAgICAgICAgICAgIFNpbXBsZUxpc3RJdGVtRmFjdG9yeSBpcyBydW5uaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGUgTGlzdFZpZXcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYWRhcHRlciBpcyBydW5uaW5nCiAgICAgICogQHBhcmFtIGxheW91dCByZXNvdXJjZSBpZGVudGlmaWVyIG9mIGEgbGF5b3V0IGZpbGUgdGhhdCBkZWZpbmVzIHRoZSB2aWV3cwogICAgICAqICAgICAgICAgICAgZm9yIHRoaXMgbGlzdCBpdGVtLiAgVW5sZXNzIHlvdSBvdmVycmlkZSB0aGVtIGxhdGVyLCB0aGlzIHdpbGwKICAgICAgKiAgICAgICAgICAgIGRlZmluZSBib3RoIHRoZSBpdGVtIHZpZXdzIGFuZCB0aGUgZHJvcCBkb3duIHZpZXdzLgpAQCAtNTEsOSArNTAsOCBAQAogICAgIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoZSBMaXN0VmlldyBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAgICAqICAgICAgICAgICAgU2ltcGxlTGlzdEl0ZW1GYWN0b3J5IGlzIHJ1bm5pbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoZSBMaXN0VmlldyBhc3NvY2lhdGVkIHdpdGggdGhpcyBhZGFwdGVyIGlzIHJ1bm5pbmcKICAgICAgKiBAcGFyYW0gbGF5b3V0IHJlc291cmNlIGlkZW50aWZpZXIgb2YgYSBsYXlvdXQgZmlsZSB0aGF0IGRlZmluZXMgdGhlIHZpZXdzCiAgICAgICogICAgICAgICAgICBmb3IgdGhpcyBsaXN0IGl0ZW0uICBVbmxlc3MgeW91IG92ZXJyaWRlIHRoZW0gbGF0ZXIsIHRoaXMgd2lsbAogICAgICAqICAgICAgICAgICAgZGVmaW5lIGJvdGggdGhlIGl0ZW0gdmlld3MgYW5kIHRoZSBkcm9wIGRvd24gdmlld3MuCkBAIC02OSw2ICs2NywyMiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhlIExpc3RWaWV3IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFkYXB0ZXIgaXMgcnVubmluZworICAgICAqIEBwYXJhbSBsYXlvdXQgcmVzb3VyY2UgaWRlbnRpZmllciBvZiBhIGxheW91dCBmaWxlIHRoYXQgZGVmaW5lcyB0aGUgdmlld3MKKyAgICAgKiAgICAgICAgICAgIGZvciB0aGlzIGxpc3QgaXRlbS4gIFVubGVzcyB5b3Ugb3ZlcnJpZGUgdGhlbSBsYXRlciwgdGhpcyB3aWxsCisgICAgICogICAgICAgICAgICBkZWZpbmUgYm90aCB0aGUgaXRlbSB2aWV3cyBhbmQgdGhlIGRyb3AgZG93biB2aWV3cy4KKyAgICAgKiBAcGFyYW0gYyBUaGUgY3Vyc29yIGZyb20gd2hpY2ggdG8gZ2V0IHRoZSBkYXRhLgorICAgICAqIEBwYXJhbSBmbGFncyBmbGFncyB1c2VkIHRvIGRldGVybWluZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGFkYXB0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGxheW91dCwgQ3Vyc29yIGMsIGludCBmbGFncykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBjLCBmbGFncyk7CisgICAgICAgIG1MYXlvdXQgPSBtRHJvcERvd25MYXlvdXQgPSBsYXlvdXQ7CisgICAgICAgIG1JbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEluZmxhdGVzIHZpZXcocykgZnJvbSB0aGUgc3BlY2lmaWVkIFhNTCBmaWxlLgogICAgICAqIAogICAgICAqIEBzZWUgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciNuZXdWaWV3KGFuZHJvaWQuY29udGVudC5Db250ZXh0LApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbEJhckRyYXdhYmxlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsQmFyRHJhd2FibGUuamF2YQppbmRleCAzYjExM2FlLi45M2ExMTc5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsQmFyRHJhd2FibGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsQmFyRHJhd2FibGUuamF2YQpAQCAtMTExLDggKzExMSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBSZWN0IHIgPSBnZXRCb3VuZHMoKTsKLSAgICAgICAgaWYgKGNhbnZhcy5xdWlja1JlamVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgCi0gICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkFBKSkgeworICAgICAgICBpZiAoY2FudmFzLnF1aWNrUmVqZWN0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tLCBDYW52YXMuRWRnZVR5cGUuQUEpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgaWYgKGRyYXdUcmFjaykgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TY3JvbGxWaWV3LmphdmEKaW5kZXggODQ3MmQ5Yy4uZWI1MjdlYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsVmlldy5qYXZhCkBAIC0xOSwxMSArMTksOCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuRm9jdXNGaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwpAQCAtNTIsNiArNDksOCBAQAogICogd2l0aGluIGEgbGFyZ2VyIGNvbnRhaW5lci4KICAqIAogICogPHA+U2Nyb2xsVmlldyBvbmx5IHN1cHBvcnRzIHZlcnRpY2FsIHNjcm9sbGluZy4KKyAqCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNTY3JvbGxWaWV3X2ZpbGxWaWV3cG9ydAogICovCiBwdWJsaWMgY2xhc3MgU2Nyb2xsVmlldyBleHRlbmRzIEZyYW1lTGF5b3V0IHsKICAgICBzdGF0aWMgZmluYWwgaW50IEFOSU1BVEVEX1NDUk9MTF9HQVAgPSAyNTA7CkBAIC02Miw5ICs2MSw3IEBACiAgICAgcHJpdmF0ZSBsb25nIG1MYXN0U2Nyb2xsOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7Ci0gICAgcHJpdmF0ZSBPdmVyU2Nyb2xsZXIgbVNjcm9sbGVyOwotICAgIHByaXZhdGUgRWRnZUdsb3cgbUVkZ2VHbG93VG9wOwotICAgIHByaXZhdGUgRWRnZUdsb3cgbUVkZ2VHbG93Qm90dG9tOworICAgIHByaXZhdGUgU2Nyb2xsZXIgbVNjcm9sbGVyOwogCiAgICAgLyoqCiAgICAgICogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHdlIGFyZSBtb3ZpbmcgZm9jdXMgb3Vyc2VsdmVzLiBUaGlzIGlzIHNvIHRoZQpAQCAtMTE4LDkgKzExNSw2IEBACiAgICAgcHJpdmF0ZSBpbnQgbU1pbmltdW1WZWxvY2l0eTsKICAgICBwcml2YXRlIGludCBtTWF4aW11bVZlbG9jaXR5OwogICAgIAotICAgIHByaXZhdGUgaW50IG1PdmVyc2Nyb2xsRGlzdGFuY2U7Ci0gICAgcHJpdmF0ZSBpbnQgbU92ZXJmbGluZ0Rpc3RhbmNlOwotCiAgICAgLyoqCiAgICAgICogSUQgb2YgdGhlIGFjdGl2ZSBwb2ludGVyLiBUaGlzIGlzIHVzZWQgdG8gcmV0YWluIGNvbnNpc3RlbmN5IGR1cmluZwogICAgICAqIGRyYWdzL2ZsaW5ncyBpZiBtdWx0aXBsZSBwb2ludGVycyBhcmUgdXNlZC4KQEAgLTE5Myw3ICsxODcsNyBAQAogCiAKICAgICBwcml2YXRlIHZvaWQgaW5pdFNjcm9sbFZpZXcoKSB7Ci0gICAgICAgIG1TY3JvbGxlciA9IG5ldyBPdmVyU2Nyb2xsZXIoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgbVNjcm9sbGVyID0gbmV3IFNjcm9sbGVyKGdldENvbnRleHQoKSk7CiAgICAgICAgIHNldEZvY3VzYWJsZSh0cnVlKTsKICAgICAgICAgc2V0RGVzY2VuZGFudEZvY3VzYWJpbGl0eShGT0NVU19BRlRFUl9ERVNDRU5EQU5UUyk7CiAgICAgICAgIHNldFdpbGxOb3REcmF3KGZhbHNlKTsKQEAgLTIwMSw4ICsxOTUsNiBAQAogICAgICAgICBtVG91Y2hTbG9wID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRUb3VjaFNsb3AoKTsKICAgICAgICAgbU1pbmltdW1WZWxvY2l0eSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWluaW11bUZsaW5nVmVsb2NpdHkoKTsKICAgICAgICAgbU1heGltdW1WZWxvY2l0eSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWF4aW11bUZsaW5nVmVsb2NpdHkoKTsKLSAgICAgICAgbU92ZXJzY3JvbGxEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcnNjcm9sbERpc3RhbmNlKCk7Ci0gICAgICAgIG1PdmVyZmxpbmdEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcmZsaW5nRGlzdGFuY2UoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTI1Nyw2ICsyNDksOCBAQAogICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgU2Nyb2xsVmlldydzIGNvbnRlbnQgaXMgc3RyZXRjaGVkIHRvIGZpbGwgdGhlIHZpZXdwb3J0LgogICAgICAqCiAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBjb250ZW50IGZpbGxzIHRoZSB2aWV3cG9ydCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIAorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1Njcm9sbFZpZXdfZmlsbFZpZXdwb3J0CiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNGaWxsVmlld3BvcnQoKSB7CiAgICAgICAgIHJldHVybiBtRmlsbFZpZXdwb3J0OwpAQCAtMjY4LDYgKzI2Miw4IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gZmlsbFZpZXdwb3J0IFRydWUgdG8gc3RyZXRjaCB0aGUgY29udGVudCdzIGhlaWdodCB0byB0aGUgdmlld3BvcnQncwogICAgICAqICAgICAgICBib3VuZGFyaWVzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogCisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjU2Nyb2xsVmlld19maWxsVmlld3BvcnQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGaWxsVmlld3BvcnQoYm9vbGVhbiBmaWxsVmlld3BvcnQpIHsKICAgICAgICAgaWYgKGZpbGxWaWV3cG9ydCAhPSBtRmlsbFZpZXdwb3J0KSB7CkBAIC00NjMsOSArNDU5LDYgQEAKICAgICAgICAgICAgICAgICAvKiBSZWxlYXNlIHRoZSBkcmFnICovCiAgICAgICAgICAgICAgICAgbUlzQmVpbmdEcmFnZ2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUjsKLSAgICAgICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ2JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLCAwLCAwLCBnZXRTY3JvbGxSYW5nZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUDoKICAgICAgICAgICAgICAgICBvblNlY29uZGFyeVBvaW50ZXJVcChldik7CkBAIC00OTgsNyArNDkxLDkgQEAKICAgICAgICAgc3dpdGNoIChhY3Rpb24gJiBNb3Rpb25FdmVudC5BQ1RJT05fTUFTSykgewogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjogewogICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHkgPSBldi5nZXRZKCk7Ci0gICAgICAgICAgICAgICAgbUlzQmVpbmdEcmFnZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoIShtSXNCZWluZ0RyYWdnZWQgPSBpbkNoaWxkKChpbnQpIGV2LmdldFgoKSwgKGludCkgeSkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBJZiBiZWluZyBmbGluZ2VkIGFuZCB1c2VyIHRvdWNoZXMsIHN0b3AgdGhlIGZsaW5nLiBpc0ZpbmlzaGVkCkBAIC01MjEsMjYgKzUxNiw3IEBACiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBkZWx0YVkgPSAoaW50KSAobUxhc3RNb3Rpb25ZIC0geSk7CiAgICAgICAgICAgICAgICAgICAgIG1MYXN0TW90aW9uWSA9IHk7CiAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG9sZFggPSBtU2Nyb2xsWDsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG9sZFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJhbmdlID0gZ2V0U2Nyb2xsUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJzY3JvbGxCeSgwLCBkZWx0YVksIDAsIG1TY3JvbGxZLCAwLCByYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBtT3ZlcnNjcm9sbERpc3RhbmNlLCB0cnVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnJlYWsgb3VyIHZlbG9jaXR5IGlmIHdlIGhpdCBhIHNjcm9sbCBiYXJyaWVyLgotICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOwotCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsTW9kZSA9IGdldE92ZXJzY3JvbGxNb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdmVyc2Nyb2xsTW9kZSA9PSBPVkVSU0NST0xMX0FMV0FZUyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdmVyc2Nyb2xsTW9kZSA9PSBPVkVSU0NST0xMX0lGX0NPTlRFTlRfU0NST0xMUyAmJiByYW5nZSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcHVsbGVkVG9ZID0gb2xkWSArIGRlbHRhWTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdWxsZWRUb1kgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uUHVsbCgoZmxvYXQpIGRlbHRhWSAvIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHVsbGVkVG9ZID4gcmFuZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25QdWxsKChmbG9hdCkgZGVsdGFZIC8gZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNjcm9sbEJ5KDAsIGRlbHRhWSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6IApAQCAtNTQ5LDE1ICs1MjUsOCBAQAogICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eVRyYWNrZXIuY29tcHV0ZUN1cnJlbnRWZWxvY2l0eSgxMDAwLCBtTWF4aW11bVZlbG9jaXR5KTsKICAgICAgICAgICAgICAgICAgICAgaW50IGluaXRpYWxWZWxvY2l0eSA9IChpbnQpIHZlbG9jaXR5VHJhY2tlci5nZXRZVmVsb2NpdHkobUFjdGl2ZVBvaW50ZXJJZCk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldENoaWxkQ291bnQoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoTWF0aC5hYnMoaW5pdGlhbFZlbG9jaXR5KSA+IG1NaW5pbXVtVmVsb2NpdHkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxpbmcoLWluaXRpYWxWZWxvY2l0eSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBib3R0b20gPSBnZXRTY3JvbGxSYW5nZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2Nyb2xsZXIuc3ByaW5nYmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsIDAsIDAsIGJvdHRvbSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldENoaWxkQ291bnQoKSA+IDAgJiYgTWF0aC5hYnMoaW5pdGlhbFZlbG9jaXR5KSA+IG1NaW5pbXVtVmVsb2NpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsaW5nKC1pbml0aWFsVmVsb2NpdHkpOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUjsKQEAgLTU2NywyNyArNTM2LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLnJlY3ljbGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRWRnZUdsb3dUb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOgogICAgICAgICAgICAgICAgIGlmIChtSXNCZWluZ0RyYWdnZWQgJiYgZ2V0Q2hpbGRDb3VudCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ2JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLCAwLCAwLCBnZXRTY3JvbGxSYW5nZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7CiAgICAgICAgICAgICAgICAgICAgIG1Jc0JlaW5nRHJhZ2dlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBpZiAobVZlbG9jaXR5VHJhY2tlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLnJlY3ljbGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRWRnZUdsb3dUb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUDoKQEAgLTYxNCwzMiArNTcyLDYgQEAKICAgICAgICAgfQogICAgIH0KICAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbk92ZXJzY3JvbGxlZChpbnQgc2Nyb2xsWCwgaW50IHNjcm9sbFksCi0gICAgICAgICAgICBib29sZWFuIGNsYW1wZWRYLCBib29sZWFuIGNsYW1wZWRZKSB7Ci0gICAgICAgIC8vIFRyZWF0IGFuaW1hdGluZyBzY3JvbGxzIGRpZmZlcmVudGx5OyBzZWUgI2NvbXB1dGVTY3JvbGwoKSBmb3Igd2h5LgotICAgICAgICBpZiAoIW1TY3JvbGxlci5pc0ZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgIG1TY3JvbGxYID0gc2Nyb2xsWDsKLSAgICAgICAgICAgIG1TY3JvbGxZID0gc2Nyb2xsWTsKLSAgICAgICAgICAgIGlmIChjbGFtcGVkWSkgewotICAgICAgICAgICAgICAgIG1TY3JvbGxlci5zcHJpbmdiYWNrKG1TY3JvbGxYLCBtU2Nyb2xsWSwgMCwgMCwgMCwgZ2V0U2Nyb2xsUmFuZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdXBlci5zY3JvbGxUbyhzY3JvbGxYLCBzY3JvbGxZKTsKLSAgICAgICAgfQotICAgICAgICBhd2FrZW5TY3JvbGxCYXJzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0U2Nyb2xsUmFuZ2UoKSB7Ci0gICAgICAgIGludCBzY3JvbGxSYW5nZSA9IDA7Ci0gICAgICAgIGlmIChnZXRDaGlsZENvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdCgwKTsKLSAgICAgICAgICAgIHNjcm9sbFJhbmdlID0gTWF0aC5tYXgoMCwKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0SGVpZ2h0KCkgLSAoZ2V0SGVpZ2h0KCkgLSBtUGFkZGluZ0JvdHRvbSAtIG1QYWRkaW5nVG9wKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNjcm9sbFJhbmdlOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIDxwPgogICAgICAqIEZpbmRzIHRoZSBuZXh0IGZvY3VzYWJsZSBjb21wb25lbnQgdGhhdCBmaXRzIGluIHRoaXMgVmlldydzIGJvdW5kcwpAQCAtMTAxNiwxNiArOTQ4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBjb250ZW50SGVpZ2h0OwogICAgICAgICB9CiAgICAgICAgIAotICAgICAgICBpbnQgc2Nyb2xsUmFuZ2UgPSBnZXRDaGlsZEF0KDApLmdldEJvdHRvbSgpOwotICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWSA9IG1TY3JvbGxZOwotICAgICAgICBmaW5hbCBpbnQgb3ZlcnNjcm9sbEJvdHRvbSA9IE1hdGgubWF4KDAsIHNjcm9sbFJhbmdlIC0gY29udGVudEhlaWdodCk7Ci0gICAgICAgIGlmIChzY3JvbGxZIDwgMCkgewotICAgICAgICAgICAgc2Nyb2xsUmFuZ2UgLT0gc2Nyb2xsWTsKLSAgICAgICAgfSBlbHNlIGlmIChzY3JvbGxZID4gb3ZlcnNjcm9sbEJvdHRvbSkgewotICAgICAgICAgICAgc2Nyb2xsUmFuZ2UgKz0gc2Nyb2xsWSAtIG92ZXJzY3JvbGxCb3R0b207Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2Nyb2xsUmFuZ2U7CisgICAgICAgIHJldHVybiBnZXRDaGlsZEF0KDApLmdldEJvdHRvbSgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTA4NiwyMCArMTAwOSwxNCBAQAogICAgICAgICAgICAgaW50IHggPSBtU2Nyb2xsZXIuZ2V0Q3VyclgoKTsKICAgICAgICAgICAgIGludCB5ID0gbVNjcm9sbGVyLmdldEN1cnJZKCk7CiAKLSAgICAgICAgICAgIGlmIChvbGRYICE9IHggfHwgb2xkWSAhPSB5KSB7Ci0gICAgICAgICAgICAgICAgb3ZlcnNjcm9sbEJ5KHggLSBvbGRYLCB5IC0gb2xkWSwgb2xkWCwgb2xkWSwgMCwgZ2V0U2Nyb2xsUmFuZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIDAsIG1PdmVyZmxpbmdEaXN0YW5jZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOwotCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJhbmdlID0gZ2V0U2Nyb2xsUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb3ZlcnNjcm9sbE1vZGUgPSBnZXRPdmVyc2Nyb2xsTW9kZSgpOwotICAgICAgICAgICAgICAgIGlmIChvdmVyc2Nyb2xsTW9kZSA9PSBPVkVSU0NST0xMX0FMV0FZUyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJTQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTICYmIHJhbmdlID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHkgPCAwICYmIG9sZFkgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uQWJzb3JiKChpbnQpIG1TY3JvbGxlci5nZXRDdXJyVmVsb2NpdHkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeSA+IHJhbmdlICYmIG9sZFkgPD0gcmFuZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vbkFic29yYigoaW50KSBtU2Nyb2xsZXIuZ2V0Q3VyclZlbG9jaXR5KCkpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0Q2hpbGRDb3VudCgpID4gMCkgeworICAgICAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KDApOworICAgICAgICAgICAgICAgIHggPSBjbGFtcCh4LCBnZXRXaWR0aCgpIC0gbVBhZGRpbmdSaWdodCAtIG1QYWRkaW5nTGVmdCwgY2hpbGQuZ2V0V2lkdGgoKSk7CisgICAgICAgICAgICAgICAgeSA9IGNsYW1wKHksIGdldEhlaWdodCgpIC0gbVBhZGRpbmdCb3R0b20gLSBtUGFkZGluZ1RvcCwgY2hpbGQuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgIGlmICh4ICE9IG9sZFggfHwgeSAhPSBvbGRZKSB7CisgICAgICAgICAgICAgICAgICAgIG1TY3JvbGxYID0geDsKKyAgICAgICAgICAgICAgICAgICAgbVNjcm9sbFkgPSB5OworICAgICAgICAgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQoeCwgeSwgb2xkWCwgb2xkWSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXdha2VuU2Nyb2xsQmFycygpOwpAQCAtMTMzNyw3ICsxMjU0LDcgQEAKICAgICAgICAgICAgIGludCBib3R0b20gPSBnZXRDaGlsZEF0KDApLmdldEhlaWdodCgpOwogICAgIAogICAgICAgICAgICAgbVNjcm9sbGVyLmZsaW5nKG1TY3JvbGxYLCBtU2Nyb2xsWSwgMCwgdmVsb2NpdHlZLCAwLCAwLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoMCwgYm90dG9tIC0gaGVpZ2h0KSwgMCwgaGVpZ2h0LzIpOworICAgICAgICAgICAgICAgICAgICBNYXRoLm1heCgwLCBib3R0b20gLSBoZWlnaHQpKTsKICAgICAKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbW92aW5nRG93biA9IHZlbG9jaXR5WSA+IDA7CiAgICAgCkBAIC0xMzc1LDU1ICsxMjkyLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJzY3JvbGxNb2RlKGludCBtb2RlKSB7Ci0gICAgICAgIGlmIChtb2RlICE9IE9WRVJTQ1JPTExfTkVWRVIpIHsKLSAgICAgICAgICAgIGlmIChtRWRnZUdsb3dUb3AgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgZWRnZSA9IHJlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLm92ZXJzY3JvbGxfZWRnZSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgZ2xvdyA9IHJlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLm92ZXJzY3JvbGxfZ2xvdyk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wID0gbmV3IEVkZ2VHbG93KGVkZ2UsIGdsb3cpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbSA9IG5ldyBFZGdlR2xvdyhlZGdlLCBnbG93KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1FZGdlR2xvd1RvcCA9IG51bGw7Ci0gICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20gPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLnNldE92ZXJzY3JvbGxNb2RlKG1vZGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBzdXBlci5kcmF3KGNhbnZhcyk7Ci0gICAgICAgIGlmIChtRWRnZUdsb3dUb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgaW50IHNjcm9sbFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgIGlmICghbUVkZ2VHbG93VG9wLmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXN0b3JlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGdldFdpZHRoKCk7Ci0KLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC13aWR0aCAvIDIsIE1hdGgubWluKDAsIHNjcm9sbFkpKTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Auc2V0U2l6ZSh3aWR0aCAqIDIsIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICBpZiAobUVkZ2VHbG93VG9wLmRyYXcoY2FudmFzKSkgewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChyZXN0b3JlQ291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dCb3R0b20uaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVDb3VudCA9IGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC13aWR0aCAvIDIsIE1hdGgubWF4KGdldFNjcm9sbFJhbmdlKCksIHNjcm9sbFkpICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBjYW52YXMucm90YXRlKDE4MCwgd2lkdGgsIDApOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5zZXRTaXplKHdpZHRoICogMiwgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBpZiAobUVkZ2VHbG93Qm90dG9tLmRyYXcoY2FudmFzKSkgewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChyZXN0b3JlQ291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBpbnQgY2xhbXAoaW50IG4sIGludCBteSwgaW50IGNoaWxkKSB7CiAgICAgICAgIGlmIChteSA+PSBjaGlsZCB8fCBuIDwgMCkgewogICAgICAgICAgICAgLyogbXkgPj0gY2hpbGQgaXMgdGhpcyBjYXNlOgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsZXIuamF2YQppbmRleCAyM2Y3MmI2Li40Y2IwODM5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsZXIuamF2YQpAQCAtNTAsNiArNTAsOCBAQAogICAgIHByaXZhdGUgZmxvYXQgbUR1cmF0aW9uUmVjaXByb2NhbDsKICAgICBwcml2YXRlIGZsb2F0IG1EZWx0YVg7CiAgICAgcHJpdmF0ZSBmbG9hdCBtRGVsdGFZOworICAgIHByaXZhdGUgZmxvYXQgbVZpc2NvdXNGbHVpZFNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbVZpc2NvdXNGbHVpZE5vcm1hbGl6ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbUZpbmlzaGVkOwogICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1JbnRlcnBvbGF0b3I7CiAKQEAgLTYzLDE3ICs2NSw2IEBACiAKICAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1EZWNlbGVyYXRpb247CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBzVmlzY291c0ZsdWlkU2NhbGU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgc1Zpc2NvdXNGbHVpZE5vcm1hbGl6ZTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIFRoaXMgY29udHJvbHMgdGhlIHZpc2NvdXMgZmx1aWQgZWZmZWN0IChob3cgbXVjaCBvZiBpdCkKLSAgICAgICAgc1Zpc2NvdXNGbHVpZFNjYWxlID0gOC4wZjsKLSAgICAgICAgLy8gbXVzdCBiZSBzZXQgdG8gMS4wICh1c2VkIGluIHZpc2NvdXNGbHVpZCgpKQotICAgICAgICBzVmlzY291c0ZsdWlkTm9ybWFsaXplID0gMS4wZjsKLSAgICAgICAgc1Zpc2NvdXNGbHVpZE5vcm1hbGl6ZSA9IDEuMGYgLyB2aXNjb3VzRmx1aWQoMS4wZik7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgU2Nyb2xsZXIgd2l0aCB0aGUgZGVmYXVsdCBkdXJhdGlvbiBhbmQgaW50ZXJwb2xhdG9yLgogICAgICAqLwpAQCAtMjg2LDYgKzI3NywxMSBAQAogICAgICAgICBtRGVsdGFYID0gZHg7CiAgICAgICAgIG1EZWx0YVkgPSBkeTsKICAgICAgICAgbUR1cmF0aW9uUmVjaXByb2NhbCA9IDEuMGYgLyAoZmxvYXQpIG1EdXJhdGlvbjsKKyAgICAgICAgLy8gVGhpcyBjb250cm9scyB0aGUgdmlzY291cyBmbHVpZCBlZmZlY3QgKGhvdyBtdWNoIG9mIGl0KQorICAgICAgICBtVmlzY291c0ZsdWlkU2NhbGUgPSA4LjBmOworICAgICAgICAvLyBtdXN0IGJlIHNldCB0byAxLjAgKHVzZWQgaW4gdmlzY291c0ZsdWlkKCkpCisgICAgICAgIG1WaXNjb3VzRmx1aWROb3JtYWxpemUgPSAxLjBmOworICAgICAgICBtVmlzY291c0ZsdWlkTm9ybWFsaXplID0gMS4wZiAvIHZpc2NvdXNGbHVpZCgxLjBmKTsKICAgICB9CiAKICAgICAvKioKQEAgLTM0Myw5ICszMzksMTEgQEAKICAgICAgICAgbUZpbmFsWSA9IE1hdGgubWF4KG1GaW5hbFksIG1NaW5ZKTsKICAgICB9CiAgICAgCi0gICAgc3RhdGljIGZsb2F0IHZpc2NvdXNGbHVpZChmbG9hdCB4KQorICAgIAorICAgIAorICAgIHByaXZhdGUgZmxvYXQgdmlzY291c0ZsdWlkKGZsb2F0IHgpCiAgICAgewotICAgICAgICB4ICo9IHNWaXNjb3VzRmx1aWRTY2FsZTsKKyAgICAgICAgeCAqPSBtVmlzY291c0ZsdWlkU2NhbGU7CiAgICAgICAgIGlmICh4IDwgMS4wZikgewogICAgICAgICAgICAgeCAtPSAoMS4wZiAtIChmbG9hdClNYXRoLmV4cCgteCkpOwogICAgICAgICB9IGVsc2UgewpAQCAtMzUzLDcgKzM1MSw3IEBACiAgICAgICAgICAgICB4ID0gMS4wZiAtIChmbG9hdClNYXRoLmV4cCgxLjBmIC0geCk7CiAgICAgICAgICAgICB4ID0gc3RhcnQgKyB4ICogKDEuMGYgLSBzdGFydCk7CiAgICAgICAgIH0KLSAgICAgICAgeCAqPSBzVmlzY291c0ZsdWlkTm9ybWFsaXplOworICAgICAgICB4ICo9IG1WaXNjb3VzRmx1aWROb3JtYWxpemU7CiAgICAgICAgIHJldHVybiB4OwogICAgIH0KICAgICAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TZWFyY2hWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2VhcmNoVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNjcxOTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2VhcmNoVmlldy5qYXZhCkBAIC0wLDAgKzEsNzM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndpZGdldDsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLndpZGdldC5TdWdnZXN0aW9uc0FkYXB0ZXIuZ2V0Q29sdW1uU3RyaW5nOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlNlYXJjaE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuU2VhcmNoYWJsZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0Vmlldy5PbkVkaXRvckFjdGlvbkxpc3RlbmVyOworCitpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOworCisvKioKKyAqIFByb3ZpZGVzIHRoZSB1c2VyIGludGVyZmFjZSBlbGVtZW50cyBmb3IgdGhlIHVzZXIgdG8gZW50ZXIgYSBzZWFyY2ggcXVlcnkgYW5kIHN1Ym1pdCBhCisgKiByZXF1ZXN0IHRvIGEgc2VhcmNoIHByb3ZpZGVyLiBTaG93cyBhIGxpc3Qgb2YgcXVlcnkgc3VnZ2VzdGlvbnMgb3IgcmVzdWx0cywgaWYKKyAqIGF2YWlsYWJsZSBhbmQgYWxsb3dzIHRoZSB1c2VyIHRvIHBpY2sgYSBzdWdnZXN0aW9uIG9yIHJlc3VsdCB0byBsYXVuY2ggaW50by4KKyAqLworcHVibGljIGNsYXNzIFNlYXJjaFZpZXcgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJTZWFyY2hWaWV3IjsKKworICAgIHByaXZhdGUgT25RdWVyeUNoYW5nZUxpc3RlbmVyIG1PblF1ZXJ5Q2hhbmdlTGlzdGVuZXI7CisgICAgcHJpdmF0ZSBPbkNsb3NlTGlzdGVuZXIgbU9uQ2xvc2VMaXN0ZW5lcjsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtSWNvbmlmaWVkQnlEZWZhdWx0OworICAgIHByaXZhdGUgYm9vbGVhbiBtSWNvbmlmaWVkOworICAgIHByaXZhdGUgQ3Vyc29yQWRhcHRlciBtU3VnZ2VzdGlvbnNBZGFwdGVyOworICAgIHByaXZhdGUgVmlldyBtU2VhcmNoQnV0dG9uOworICAgIHByaXZhdGUgVmlldyBtU3VibWl0QnV0dG9uOworICAgIHByaXZhdGUgVmlldyBtQ2xvc2VCdXR0b247CisgICAgcHJpdmF0ZSBWaWV3IG1TZWFyY2hFZGl0RnJhbWU7CisgICAgcHJpdmF0ZSBBdXRvQ29tcGxldGVUZXh0VmlldyBtUXVlcnlUZXh0VmlldzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVN1Ym1pdEJ1dHRvbkVuYWJsZWQ7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVF1ZXJ5SGludDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVF1ZXJ5UmVmaW5lbWVudDsKKworICAgIHByaXZhdGUgU2VhcmNoYWJsZUluZm8gbVNlYXJjaGFibGU7CisKKyAgICAvLyBBIHdlYWsgbWFwIG9mIGRyYXdhYmxlcyB3ZSd2ZSBnb3R0ZW4gZnJvbSBvdGhlciBwYWNrYWdlcywgc28gd2UgZG9uJ3QgbG9hZCB0aGVtCisgICAgLy8gbW9yZSB0aGFuIG9uY2UuCisgICAgcHJpdmF0ZSBmaW5hbCBXZWFrSGFzaE1hcDxTdHJpbmcsIERyYXdhYmxlLkNvbnN0YW50U3RhdGU+IG1PdXRzaWRlRHJhd2FibGVzQ2FjaGUgPQorICAgICAgICAgICAgbmV3IFdlYWtIYXNoTWFwPFN0cmluZywgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZT4oKTsKKworICAgIC8qKgorICAgICAqIENhbGxiYWNrcyBmb3IgY2hhbmdlcyB0byB0aGUgcXVlcnkgdGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uUXVlcnlDaGFuZ2VMaXN0ZW5lciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIHN1Ym1pdHMgdGhlIHF1ZXJ5LiBUaGlzIGNvdWxkIGJlIGR1ZSB0byBhIGtleSBwcmVzcyBvbiB0aGUKKyAgICAgICAgICoga2V5Ym9hcmQgb3IgZHVlIHRvIHByZXNzaW5nIGEgc3VibWl0IGJ1dHRvbi4KKyAgICAgICAgICogVGhlIGxpc3RlbmVyIGNhbiBvdmVycmlkZSB0aGUgc3RhbmRhcmQgYmVoYXZpb3IgYnkgcmV0dXJuaW5nIHRydWUKKyAgICAgICAgICogdG8gaW5kaWNhdGUgdGhhdCBpdCBoYXMgaGFuZGxlZCB0aGUgc3VibWl0IHJlcXVlc3QuIE90aGVyd2lzZSByZXR1cm4gZmFsc2UgdG8KKyAgICAgICAgICogbGV0IHRoZSBTZWFyY2hWaWV3IGhhbmRsZSB0aGUgc3VibWlzc2lvbiBieSBsYXVuY2hpbmcgYW55IGFzc29jaWF0ZWQgaW50ZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcXVlcnkgdGhlIHF1ZXJ5IHRleHQgdGhhdCBpcyB0byBiZSBzdWJtaXR0ZWQKKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBxdWVyeSBoYXMgYmVlbiBoYW5kbGVkIGJ5IHRoZSBsaXN0ZW5lciwgZmFsc2UgdG8gbGV0IHRoZQorICAgICAgICAgKiBTZWFyY2hWaWV3IHBlcmZvcm0gdGhlIGRlZmF1bHQgYWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBvblN1Ym1pdFF1ZXJ5KFN0cmluZyBxdWVyeSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBxdWVyeSB0ZXh0IGlzIGNoYW5nZWQgYnkgdGhlIHVzZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuZXdUZXh0IHRoZSBuZXcgY29udGVudCBvZiB0aGUgcXVlcnkgdGV4dCBmaWVsZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBmYWxzZSBpZiB0aGUgU2VhcmNoVmlldyBzaG91bGQgcGVyZm9ybSB0aGUgZGVmYXVsdCBhY3Rpb24gb2Ygc2hvd2luZyBhbnkKKyAgICAgICAgICogc3VnZ2VzdGlvbnMgaWYgYXZhaWxhYmxlLCB0cnVlIGlmIHRoZSBhY3Rpb24gd2FzIGhhbmRsZWQgYnkgdGhlIGxpc3RlbmVyLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBvblF1ZXJ5VGV4dENoYW5nZWQoU3RyaW5nIG5ld1RleHQpOworICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25DbG9zZUxpc3RlbmVyIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHVzZXIgaXMgYXR0ZW1wdGluZyB0byBjbG9zZSB0aGUgU2VhcmNoVmlldy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBsaXN0ZW5lciB3YW50cyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBjbGVhcmluZyB0aGUKKyAgICAgICAgICogdGV4dCBmaWVsZCBhbmQgZGlzbWlzc2luZyBpdCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBvbkNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIFNlYXJjaFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIFNlYXJjaFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworCisgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gKExheW91dEluZmxhdGVyKSBjb250ZXh0CisgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7CisgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuc2VhcmNoX3ZpZXcsIHRoaXMsIHRydWUpOworCisgICAgICAgIG1TZWFyY2hCdXR0b24gPSBmaW5kVmlld0J5SWQoUi5pZC5zZWFyY2hfYnV0dG9uKTsKKyAgICAgICAgbVF1ZXJ5VGV4dFZpZXcgPSAoQXV0b0NvbXBsZXRlVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnNlYXJjaF9zcmNfdGV4dCk7CisgICAgICAgIG1TZWFyY2hFZGl0RnJhbWUgPSBmaW5kVmlld0J5SWQoUi5pZC5zZWFyY2hfZWRpdF9mcmFtZSk7CisgICAgICAgIG1TdWJtaXRCdXR0b24gPSBmaW5kVmlld0J5SWQoUi5pZC5zZWFyY2hfZ29fYnRuKTsKKyAgICAgICAgbUNsb3NlQnV0dG9uID0gZmluZFZpZXdCeUlkKFIuaWQuc2VhcmNoX2Nsb3NlX2J0bik7CisKKyAgICAgICAgbVNlYXJjaEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobU9uQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIG1DbG9zZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobU9uQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIG1TdWJtaXRCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1PbkNsaWNrTGlzdGVuZXIpOworICAgICAgICBtUXVlcnlUZXh0Vmlldy5hZGRUZXh0Q2hhbmdlZExpc3RlbmVyKG1UZXh0V2F0Y2hlcik7CisgICAgICAgIG1RdWVyeVRleHRWaWV3LnNldE9uRWRpdG9yQWN0aW9uTGlzdGVuZXIobU9uRWRpdG9yQWN0aW9uTGlzdGVuZXIpOworICAgICAgICBtUXVlcnlUZXh0Vmlldy5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG1Pbkl0ZW1DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgbVF1ZXJ5VGV4dFZpZXcuc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihtT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcik7CisKKyAgICAgICAgVHlwZWRBcnJheSBhID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLCBSLnN0eWxlYWJsZS5TZWFyY2hWaWV3LCAwLCAwKTsKKyAgICAgICAgc2V0SWNvbmlmaWVkQnlEZWZhdWx0KGEuZ2V0Qm9vbGVhbihSLnN0eWxlYWJsZS5TZWFyY2hWaWV3X2ljb25pZmllZEJ5RGVmYXVsdCwgdHJ1ZSkpOworICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICB1cGRhdGVWaWV3c1Zpc2liaWxpdHkobUljb25pZmllZEJ5RGVmYXVsdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgU2VhcmNoYWJsZUluZm8gZm9yIHRoaXMgU2VhcmNoVmlldy4gUHJvcGVydGllcyBpbiB0aGUgU2VhcmNoYWJsZUluZm8gYXJlIHVzZWQKKyAgICAgKiB0byBkaXNwbGF5IGxhYmVscywgaGludHMsIHN1Z2dlc3Rpb25zLCBjcmVhdGUgaW50ZW50cyBmb3IgbGF1bmNoaW5nIHNlYXJjaCByZXN1bHRzIHNjcmVlbnMKKyAgICAgKiBhbmQgY29udHJvbGxpbmcgb3RoZXIgYWZmb3JkYW5jZXMgc3VjaCBhcyBhIHZvaWNlIGJ1dHRvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWFyY2hhYmxlIGEgU2VhcmNoYWJsZUluZm8gY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBTZWFyY2hNYW5hZ2VyLCBmb3IgYSBzcGVjaWZpYworICAgICAqIGFjdGl2aXR5IG9yIGEgZ2xvYmFsIHNlYXJjaCBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZWFyY2hhYmxlSW5mbyhTZWFyY2hhYmxlSW5mbyBzZWFyY2hhYmxlKSB7CisgICAgICAgIG1TZWFyY2hhYmxlID0gc2VhcmNoYWJsZTsKKyAgICAgICAgaWYgKG1TZWFyY2hhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHVwZGF0ZVNlYXJjaEF1dG9Db21wbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIHVwZGF0ZVZpZXdzVmlzaWJpbGl0eShtSWNvbmlmaWVkQnlEZWZhdWx0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgbGlzdGVuZXIgZm9yIHVzZXIgYWN0aW9ucyB3aXRoaW4gdGhlIFNlYXJjaFZpZXcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIG9iamVjdCB0aGF0IHJlY2VpdmVzIGNhbGxiYWNrcyB3aGVuIHRoZSB1c2VyIHBlcmZvcm1zCisgICAgICogYWN0aW9ucyBpbiB0aGUgU2VhcmNoVmlldyBzdWNoIGFzIGNsaWNraW5nIG9uIGJ1dHRvbnMgb3IgdHlwaW5nIGEgcXVlcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T25RdWVyeUNoYW5nZUxpc3RlbmVyKE9uUXVlcnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtT25RdWVyeUNoYW5nZUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIGxpc3RlbmVyIHRvIGluZm9ybSB3aGVuIHRoZSB1c2VyIGNsb3NlcyB0aGUgU2VhcmNoVmlldy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gY2FsbCB3aGVuIHRoZSB1c2VyIGNsb3NlcyB0aGUgU2VhcmNoVmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPbkNsb3NlTGlzdGVuZXIoT25DbG9zZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1PbkNsb3NlTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgcXVlcnkgc3RyaW5nIGluIHRoZSB0ZXh0IGZpZWxkIGFuZCBvcHRpb25hbGx5IHN1Ym1pdHMgdGhlIHF1ZXJ5IGFzIHdlbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcXVlcnkgdGhlIHF1ZXJ5IHN0cmluZy4gVGhpcyByZXBsYWNlcyBhbnkgcXVlcnkgdGV4dCBhbHJlYWR5IHByZXNlbnQgaW4gdGhlCisgICAgICogdGV4dCBmaWVsZC4KKyAgICAgKiBAcGFyYW0gc3VibWl0IHdoZXRoZXIgdG8gc3VibWl0IHRoZSBxdWVyeSByaWdodCBub3cgb3Igb25seSB1cGRhdGUgdGhlIGNvbnRlbnRzIG9mCisgICAgICogdGV4dCBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRRdWVyeShDaGFyU2VxdWVuY2UgcXVlcnksIGJvb2xlYW4gc3VibWl0KSB7CisgICAgICAgIG1RdWVyeVRleHRWaWV3LnNldFRleHQocXVlcnkpOworICAgICAgICAvLyBJZiB0aGUgcXVlcnkgaXMgbm90IGVtcHR5IGFuZCBzdWJtaXQgaXMgcmVxdWVzdGVkLCBzdWJtaXQgdGhlIHF1ZXJ5CisgICAgICAgIGlmIChzdWJtaXQgJiYgIVRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgeworICAgICAgICAgICAgb25TdWJtaXRRdWVyeSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgaGludCB0ZXh0IHRvIGRpc3BsYXkgaW4gdGhlIHF1ZXJ5IHRleHQgZmllbGQuIFRoaXMgb3ZlcnJpZGVzIGFueSBoaW50IHNwZWNpZmllZAorICAgICAqIGluIHRoZSBTZWFyY2hhYmxlSW5mby4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoaW50IHRoZSBoaW50IHRleHQgdG8gZGlzcGxheQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5SGludChDaGFyU2VxdWVuY2UgaGludCkgeworICAgICAgICBtUXVlcnlIaW50ID0gaGludDsKKyAgICAgICAgdXBkYXRlUXVlcnlIaW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVmYXVsdCBvciByZXN0aW5nIHN0YXRlIG9mIHRoZSBzZWFyY2ggZmllbGQuIElmIHRydWUsIGEgc2luZ2xlIHNlYXJjaCBpY29uIGlzCisgICAgICogc2hvd24gYnkgZGVmYXVsdCBhbmQgZXhwYW5kcyB0byBzaG93IHRoZSB0ZXh0IGZpZWxkIGFuZCBvdGhlciBidXR0b25zIHdoZW4gcHJlc3NlZC4gQWxzbywKKyAgICAgKiBpZiB0aGUgZGVmYXVsdCBzdGF0ZSBpcyBpY29uaWZpZWQsIHRoZW4gaXQgY29sbGFwc2VzIHRvIHRoYXQgc3RhdGUgd2hlbiB0aGUgY2xvc2UgYnV0dG9uCisgICAgICogaXMgcHJlc3NlZC4gQ2hhbmdlcyB0byB0aGlzIHByb3BlcnR5IHdpbGwgdGFrZSBlZmZlY3QgaW1tZWRpYXRlbHkuCisgICAgICoKKyAgICAgKiA8cD5UaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gaWNvbmlmaWVkIHdoZXRoZXIgdGhlIHNlYXJjaCBmaWVsZCBzaG91bGQgYmUgaWNvbmlmaWVkIGJ5IGRlZmF1bHQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJY29uaWZpZWRCeURlZmF1bHQoYm9vbGVhbiBpY29uaWZpZWQpIHsKKyAgICAgICAgbUljb25pZmllZEJ5RGVmYXVsdCA9IGljb25pZmllZDsKKyAgICAgICAgdXBkYXRlVmlld3NWaXNpYmlsaXR5KGljb25pZmllZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBpY29uaWZpZWQgc3RhdGUgb2YgdGhlIHNlYXJjaCBmaWVsZC4KKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJY29uZmllZEJ5RGVmYXVsdCgpIHsKKyAgICAgICAgcmV0dXJuIG1JY29uaWZpZWRCeURlZmF1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWNvbmlmaWVzIG9yIGV4cGFuZHMgdGhlIFNlYXJjaFZpZXcuIEFueSBxdWVyeSB0ZXh0IGlzIGNsZWFyZWQgd2hlbiBpY29uaWZpZWQuIFRoaXMgaXMKKyAgICAgKiBhIHRlbXBvcmFyeSBzdGF0ZSBhbmQgZG9lcyBub3Qgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgaWNvbmlmaWVkIHN0YXRlIHNldCBieQorICAgICAqIHtAbGluayAjc2V0SWNvbmlmaWVkQnlEZWZhdWx0KGJvb2xlYW4pfS4gSWYgdGhlIGRlZmF1bHQgc3RhdGUgaXMgaWNvbmlmaWVkLCB0aGVuCisgICAgICogYSBmYWxzZSBoZXJlIHdpbGwgb25seSBiZSB2YWxpZCB1bnRpbCB0aGUgdXNlciBjbG9zZXMgdGhlIGZpZWxkLiBBbmQgaWYgdGhlIGRlZmF1bHQKKyAgICAgKiBzdGF0ZSBpcyBleHBhbmRlZCwgdGhlbiBhIHRydWUgaGVyZSB3aWxsIG9ubHkgY2xlYXIgdGhlIHRleHQgZmllbGQgYW5kIG5vdCBjbG9zZSBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpY29uaWZ5IGEgdHJ1ZSB2YWx1ZSB3aWxsIGNvbGxhcHNlIHRoZSBTZWFyY2hWaWV3IHRvIGFuIGljb24sIHdoaWxlIGEgZmFsc2Ugd2lsbAorICAgICAqIGV4cGFuZCBpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJY29uaWZpZWQoYm9vbGVhbiBpY29uaWZ5KSB7CisgICAgICAgIGlmIChpY29uaWZ5KSB7CisgICAgICAgICAgICBvbkNsb3NlQ2xpY2tlZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb25TZWFyY2hDbGlja2VkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGljb25pZmllZCBzdGF0ZSBvZiB0aGUgU2VhcmNoVmlldy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgU2VhcmNoVmlldyBpcyBjdXJyZW50bHkgaWNvbmlmaWVkLCBmYWxzZSBpZiB0aGUgc2VhcmNoIGZpZWxkIGlzCisgICAgICogZnVsbHkgdmlzaWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ljb25pZmllZCgpIHsKKyAgICAgICAgcmV0dXJuIG1JY29uaWZpZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlcyBzaG93aW5nIGEgc3VibWl0IGJ1dHRvbiB3aGVuIHRoZSBxdWVyeSBpcyBub24tZW1wdHkuIEluIGNhc2VzIHdoZXJlIHRoZSBTZWFyY2hWaWV3CisgICAgICogaXMgYmVpbmcgdXNlZCB0byBmaWx0ZXIgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGFjdGl2aXR5IGFuZCBkb2Vzbid0IGxhdW5jaCBhIHNlcGFyYXRlCisgICAgICogcmVzdWx0cyBhY3Rpdml0eSwgdGhlbiB0aGUgc3VibWl0IGJ1dHRvbiBzaG91bGQgYmUgZGlzYWJsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCB0cnVlIHRvIHNob3cgYSBzdWJtaXQgYnV0dG9uIGZvciBzdWJtaXR0aW5nIHF1ZXJpZXMsIGZhbHNlIGlmIGEgc3VibWl0CisgICAgICogYnV0dG9uIGlzIG5vdCByZXF1aXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJtaXRCdXR0b25FbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtU3VibWl0QnV0dG9uLnNldFZpc2liaWxpdHkoZW5hYmxlZCA/IFZJU0lCTEUgOiBHT05FKTsKKyAgICAgICAgbVN1Ym1pdEJ1dHRvbkVuYWJsZWQgPSBlbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgc3VibWl0IGJ1dHRvbiBpcyBlbmFibGVkIHdoZW4gbmVjZXNzYXJ5IG9yIG5ldmVyIGRpc3BsYXllZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgc3VibWl0IGJ1dHRvbiBpcyBlbmFibGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBuZWNlc3NhcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N1Ym1pdEJ1dHRvbkVuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBtU3VibWl0QnV0dG9uRW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgaWYgYSBxdWVyeSByZWZpbmVtZW50IGJ1dHRvbiBzaG91bGQgYmUgZGlzcGxheWVkIGFsb25nc2lkZSBlYWNoIHN1Z2dlc3Rpb24KKyAgICAgKiBvciBpZiBpdCBzaG91bGQgZGVwZW5kIG9uIHRoZSBmbGFncyBzZXQgaW4gdGhlIGluZGl2aWR1YWwgaXRlbXMgcmV0cmlldmVkIGZyb20gdGhlCisgICAgICogc3VnZ2VzdGlvbnMgcHJvdmlkZXIuIENsaWNraW5nIG9uIHRoZSBxdWVyeSByZWZpbmVtZW50IGJ1dHRvbiB3aWxsIHJlcGxhY2UgdGhlIHRleHQKKyAgICAgKiBpbiB0aGUgcXVlcnkgdGV4dCBmaWVsZCB3aXRoIHRoZSB0ZXh0IGZyb20gdGhlIHN1Z2dlc3Rpb24uIFRoaXMgZmxhZyBvbmx5IHRha2VzIGVmZmVjdAorICAgICAqIGlmIGEgU2VhcmNoYWJsZUluZm8gaGFzIGJlZW4gc3BlY2lmaWVkIHdpdGgge0BsaW5rICNzZXRTZWFyY2hhYmxlSW5mbyhTZWFyY2hhYmxlSW5mbyl9CisgICAgICogYW5kIG5vdCB3aGVuIHVzaW5nIGEgY3VzdG9tIGFkYXB0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5hYmxlIHRydWUgaWYgYWxsIGl0ZW1zIHNob3VsZCBoYXZlIGEgcXVlcnkgcmVmaW5lbWVudCBidXR0b24sIGZhbHNlIGlmIG9ubHkKKyAgICAgKiB0aG9zZSBpdGVtcyB0aGF0IGhhdmUgYSBxdWVyeSByZWZpbmVtZW50IGZsYWcgc2V0IHNob3VsZCBoYXZlIHRoZSBidXR0b24uCisgICAgICoKKyAgICAgKiBAc2VlIFNlYXJjaE1hbmFnZXIjU1VHR0VTVF9DT0xVTU5fRkxBR1MKKyAgICAgKiBAc2VlIFNlYXJjaE1hbmFnZXIjRkxBR19RVUVSWV9SRUZJTkVNRU5UCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UXVlcnlSZWZpbmVtZW50RW5hYmxlZChib29sZWFuIGVuYWJsZSkgeworICAgICAgICBtUXVlcnlSZWZpbmVtZW50ID0gZW5hYmxlOworICAgICAgICBpZiAobVN1Z2dlc3Rpb25zQWRhcHRlciBpbnN0YW5jZW9mIFN1Z2dlc3Rpb25zQWRhcHRlcikgeworICAgICAgICAgICAgKChTdWdnZXN0aW9uc0FkYXB0ZXIpIG1TdWdnZXN0aW9uc0FkYXB0ZXIpLnNldFF1ZXJ5UmVmaW5lbWVudCgKKyAgICAgICAgICAgICAgICAgICAgZW5hYmxlID8gU3VnZ2VzdGlvbnNBZGFwdGVyLlJFRklORV9BTEwgOiBTdWdnZXN0aW9uc0FkYXB0ZXIuUkVGSU5FX0JZX0VOVFJZKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBxdWVyeSByZWZpbmVtZW50IGlzIGVuYWJsZWQgZm9yIGFsbCBpdGVtcyBvciBvbmx5IHNwZWNpZmljIG9uZXMuCisgICAgICogQHJldHVybiB0cnVlIGlmIGVuYWJsZWQgZm9yIGFsbCBpdGVtcywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUXVlcnlSZWZpbmVtZW50RW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1RdWVyeVJlZmluZW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogWW91IGNhbiBzZXQgYSBjdXN0b20gYWRhcHRlciBpZiB5b3Ugd2lzaC4gT3RoZXJ3aXNlIHRoZSBkZWZhdWx0IGFkYXB0ZXIgaXMgdXNlZCB0bworICAgICAqIGRpc3BsYXkgdGhlIHN1Z2dlc3Rpb25zIGZyb20gdGhlIHN1Z2dlc3Rpb25zIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgU2VhcmNoYWJsZUluZm8uCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTZWFyY2hhYmxlSW5mbyhTZWFyY2hhYmxlSW5mbykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdWdnZXN0aW9uc0FkYXB0ZXIoQ3Vyc29yQWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIG1TdWdnZXN0aW9uc0FkYXB0ZXIgPSBhZGFwdGVyOworCisgICAgICAgIG1RdWVyeVRleHRWaWV3LnNldEFkYXB0ZXIobVN1Z2dlc3Rpb25zQWRhcHRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWRhcHRlciB1c2VkIGZvciBzdWdnZXN0aW9ucywgaWYgYW55LgorICAgICAqIEByZXR1cm4gdGhlIHN1Z2dlc3Rpb25zIGFkYXB0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgQ3Vyc29yQWRhcHRlciBnZXRTdWdnZXN0aW9uc0FkYXB0ZXIoKSB7CisgICAgICAgIHJldHVybiBtU3VnZ2VzdGlvbnNBZGFwdGVyOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVWaWV3c1Zpc2liaWxpdHkoZmluYWwgYm9vbGVhbiBjb2xsYXBzZWQpIHsKKyAgICAgICAgbUljb25pZmllZCA9IGNvbGxhcHNlZDsKKyAgICAgICAgLy8gVmlzaWJpbGl0eSBvZiB2aWV3cyB0aGF0IGFyZSB2aXNpYmxlIHdoZW4gY29sbGFwc2VkCisgICAgICAgIGZpbmFsIGludCB2aXNDb2xsYXBzZWQgPSBjb2xsYXBzZWQgPyBWSVNJQkxFIDogR09ORTsKKyAgICAgICAgLy8gVmlzaWJpbGl0eSBvZiB2aWV3cyB0aGF0IGFyZSB2aXNpYmxlIHdoZW4gZXhwYW5kZWQKKyAgICAgICAgZmluYWwgaW50IHZpc0V4cGFuZGVkID0gY29sbGFwc2VkID8gR09ORSA6IFZJU0lCTEU7CisKKyAgICAgICAgbVNlYXJjaEJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc0NvbGxhcHNlZCk7CisgICAgICAgIG1TdWJtaXRCdXR0b24uc2V0VmlzaWJpbGl0eShtU3VibWl0QnV0dG9uRW5hYmxlZCA/IHZpc0V4cGFuZGVkIDogR09ORSk7CisgICAgICAgIG1TZWFyY2hFZGl0RnJhbWUuc2V0VmlzaWJpbGl0eSh2aXNFeHBhbmRlZCk7CisKKyAgICAgICAgc2V0SW1lVmlzaWJpbGl0eSghY29sbGFwc2VkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0SW1lVmlzaWJpbGl0eShib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgLy8gZG9uJ3QgbWVzcyB3aXRoIHRoZSBzb2Z0IGlucHV0IGlmIHdlJ3JlIG5vdCBpY29uaWZpZWQgYnkgZGVmYXVsdAorICAgICAgICBpZiAobUljb25pZmllZEJ5RGVmYXVsdCkgeworICAgICAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IChJbnB1dE1ldGhvZE1hbmFnZXIpCisgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKKworICAgICAgICAgICAgLy8gV2UgbWFkZSBzdXJlIHRoZSBJTUUgd2FzIGRpc3BsYXllZCwgc28gYWxzbyBtYWtlIHN1cmUgaXQgaXMgY2xvc2VkCisgICAgICAgICAgICAvLyB3aGVuIHdlIGdvIGF3YXkuCisgICAgICAgICAgICBpZiAoaW1tICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAodmlzaWJsZSkgeworICAgICAgICAgICAgICAgICAgICBpbW0uc2hvd1NvZnRJbnB1dFVuY2hlY2tlZCgwLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbW0uaGlkZVNvZnRJbnB1dEZyb21XaW5kb3coZ2V0V2luZG93VG9rZW4oKSwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBTdWdnZXN0aW9uc0FkYXB0ZXIKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi92b2lkIG9uUXVlcnlSZWZpbmUoQ2hhclNlcXVlbmNlIHF1ZXJ5VGV4dCkgeworICAgICAgICBzZXRRdWVyeShxdWVyeVRleHQpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgT25DbGlja0xpc3RlbmVyIG1PbkNsaWNrTGlzdGVuZXIgPSBuZXcgT25DbGlja0xpc3RlbmVyKCkgeworCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICBpZiAodiA9PSBtU2VhcmNoQnV0dG9uKSB7CisgICAgICAgICAgICAgICAgb25TZWFyY2hDbGlja2VkKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHYgPT0gbUNsb3NlQnV0dG9uKSB7CisgICAgICAgICAgICAgICAgb25DbG9zZUNsaWNrZWQoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodiA9PSBtU3VibWl0QnV0dG9uKSB7CisgICAgICAgICAgICAgICAgb25TdWJtaXRRdWVyeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEhhbmRsZXMgdGhlIGtleSBkb3duIGV2ZW50IGZvciBkZWFsaW5nIHdpdGggYWN0aW9uIGtleXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5Q29kZSBUaGlzIGlzIHRoZSBrZXljb2RlIG9mIHRoZSB0eXBlZCBrZXksIGFuZCBpcyB0aGUgc2FtZSB2YWx1ZSBhcworICAgICAqICAgICAgICBmb3VuZCBpbiB0aGUgS2V5RXZlbnQgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgY29tcGxldGUgZXZlbnQgcmVjb3JkIGZvciB0aGUgdHlwZWQga2V5CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV2ZW50IHdhcyBoYW5kbGVkIGhlcmUsIG9yIGZhbHNlIGlmIG5vdC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChtU2VhcmNoYWJsZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBpdCdzIGFuIGFjdGlvbiBzcGVjaWZpZWQgYnkgdGhlIHNlYXJjaGFibGUgYWN0aXZpdHksIGxhdW5jaCB0aGUKKyAgICAgICAgLy8gZW50ZXJlZCBxdWVyeSB3aXRoIHRoZSBhY3Rpb24ga2V5CisgICAgICAgIFNlYXJjaGFibGVJbmZvLkFjdGlvbktleUluZm8gYWN0aW9uS2V5ID0gbVNlYXJjaGFibGUuZmluZEFjdGlvbktleShrZXlDb2RlKTsKKyAgICAgICAgaWYgKChhY3Rpb25LZXkgIT0gbnVsbCkgJiYgKGFjdGlvbktleS5nZXRRdWVyeUFjdGlvbk1zZygpICE9IG51bGwpKSB7CisgICAgICAgICAgICBsYXVuY2hRdWVyeVNlYXJjaChrZXlDb2RlLCBhY3Rpb25LZXkuZ2V0UXVlcnlBY3Rpb25Nc2coKSwgbVF1ZXJ5VGV4dFZpZXcuZ2V0VGV4dCgpCisgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVF1ZXJ5SGludCgpIHsKKyAgICAgICAgaWYgKG1RdWVyeUhpbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgbVF1ZXJ5VGV4dFZpZXcuc2V0SGludChtUXVlcnlIaW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChtU2VhcmNoYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgaGludCA9IG51bGw7CisgICAgICAgICAgICBpbnQgaGludElkID0gbVNlYXJjaGFibGUuZ2V0SGludElkKCk7CisgICAgICAgICAgICBpZiAoaGludElkICE9IDApIHsKKyAgICAgICAgICAgICAgICBoaW50ID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZyhoaW50SWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhpbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1RdWVyeVRleHRWaWV3LnNldEhpbnQoaGludCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHRoZSBhdXRvLWNvbXBsZXRlIHRleHQgdmlldy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2VhcmNoQXV0b0NvbXBsZXRlKCkgeworICAgICAgICAvLyBjbG9zZSBhbnkgZXhpc3Rpbmcgc3VnZ2VzdGlvbnMgYWRhcHRlcgorICAgICAgICAvL2Nsb3NlU3VnZ2VzdGlvbnNBZGFwdGVyKCk7CisKKyAgICAgICAgbVF1ZXJ5VGV4dFZpZXcuc2V0RHJvcERvd25BbmltYXRpb25TdHlsZSgwKTsgLy8gbm8gYW5pbWF0aW9uCisKKyAgICAgICAgLy8gYXR0YWNoIHRoZSBzdWdnZXN0aW9ucyBhZGFwdGVyLCBpZiBzdWdnZXN0aW9ucyBhcmUgYXZhaWxhYmxlCisgICAgICAgIC8vIFRoZSBleGlzdGVuY2Ugb2YgYSBzdWdnZXN0aW9ucyBhdXRob3JpdHkgaXMgdGhlIHByb3h5IGZvciAic3VnZ2VzdGlvbnMgYXZhaWxhYmxlIGhlcmUiCisgICAgICAgIGlmIChtU2VhcmNoYWJsZS5nZXRTdWdnZXN0QXV0aG9yaXR5KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgbVN1Z2dlc3Rpb25zQWRhcHRlciA9IG5ldyBTdWdnZXN0aW9uc0FkYXB0ZXIoZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICB0aGlzLCBtU2VhcmNoYWJsZSwgbU91dHNpZGVEcmF3YWJsZXNDYWNoZSk7CisgICAgICAgICAgICBtUXVlcnlUZXh0Vmlldy5zZXRBZGFwdGVyKG1TdWdnZXN0aW9uc0FkYXB0ZXIpOworICAgICAgICAgICAgKChTdWdnZXN0aW9uc0FkYXB0ZXIpIG1TdWdnZXN0aW9uc0FkYXB0ZXIpLnNldFF1ZXJ5UmVmaW5lbWVudCgKKyAgICAgICAgICAgICAgICAgICAgbVF1ZXJ5UmVmaW5lbWVudCA/IFN1Z2dlc3Rpb25zQWRhcHRlci5SRUZJTkVfQUxMCisgICAgICAgICAgICAgICAgICAgIDogU3VnZ2VzdGlvbnNBZGFwdGVyLlJFRklORV9CWV9FTlRSWSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIE9uRWRpdG9yQWN0aW9uTGlzdGVuZXIgbU9uRWRpdG9yQWN0aW9uTGlzdGVuZXIgPSBuZXcgT25FZGl0b3JBY3Rpb25MaXN0ZW5lcigpIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGlucHV0IG1ldGhvZCBkZWZhdWx0IGFjdGlvbiBrZXkgaXMgcHJlc3NlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uRWRpdG9yQWN0aW9uKFRleHRWaWV3IHYsIGludCBhY3Rpb25JZCwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIG9uU3VibWl0UXVlcnkoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBuZXdUZXh0KSB7CisgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gbVF1ZXJ5VGV4dFZpZXcuZ2V0VGV4dCgpOworICAgICAgICBib29sZWFuIGhhc1RleHQgPSAhVGV4dFV0aWxzLmlzRW1wdHkodGV4dCk7CisgICAgICAgIGlmIChpc1N1Ym1pdEJ1dHRvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgbVN1Ym1pdEJ1dHRvbi5zZXRWaXNpYmlsaXR5KGhhc1RleHQgPyBWSVNJQkxFIDogR09ORSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1PblF1ZXJ5Q2hhbmdlTGlzdGVuZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIG1PblF1ZXJ5Q2hhbmdlTGlzdGVuZXIub25RdWVyeVRleHRDaGFuZ2VkKG5ld1RleHQudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uU3VibWl0UXVlcnkoKSB7CisgICAgICAgIENoYXJTZXF1ZW5jZSBxdWVyeSA9IG1RdWVyeVRleHRWaWV3LmdldFRleHQoKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKKyAgICAgICAgICAgIGlmIChtT25RdWVyeUNoYW5nZUxpc3RlbmVyID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgfHwgIW1PblF1ZXJ5Q2hhbmdlTGlzdGVuZXIub25TdWJtaXRRdWVyeShxdWVyeS50b1N0cmluZygpKSkgeworICAgICAgICAgICAgICAgIGlmIChtU2VhcmNoYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGxhdW5jaFF1ZXJ5U2VhcmNoKEtleUV2ZW50LktFWUNPREVfVU5LTk9XTiwgbnVsbCwgcXVlcnkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uQ2xvc2VDbGlja2VkKCkgeworICAgICAgICBpZiAobU9uQ2xvc2VMaXN0ZW5lciA9PSBudWxsIHx8ICFtT25DbG9zZUxpc3RlbmVyLm9uQ2xvc2UoKSkgeworICAgICAgICAgICAgbVF1ZXJ5VGV4dFZpZXcuc2V0VGV4dCgiIik7CisgICAgICAgICAgICB1cGRhdGVWaWV3c1Zpc2liaWxpdHkobUljb25pZmllZEJ5RGVmYXVsdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25TZWFyY2hDbGlja2VkKCkgeworICAgICAgICBtUXVlcnlUZXh0Vmlldy5yZXF1ZXN0Rm9jdXMoKTsKKyAgICAgICAgdXBkYXRlVmlld3NWaXNpYmlsaXR5KGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIE9uSXRlbUNsaWNrTGlzdGVuZXIgbU9uSXRlbUNsaWNrTGlzdGVuZXIgPSBuZXcgT25JdGVtQ2xpY2tMaXN0ZW5lcigpIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogSW1wbGVtZW50cyBPbkl0ZW1DbGlja0xpc3RlbmVyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICBpZiAoREJHKQorICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJvbkl0ZW1DbGljaygpIHBvc2l0aW9uICIgKyBwb3NpdGlvbik7CisgICAgICAgICAgICBsYXVuY2hTdWdnZXN0aW9uKHBvc2l0aW9uLCBLZXlFdmVudC5LRVlDT0RFX1VOS05PV04sIG51bGwpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBtT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciA9IG5ldyBPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKCkgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbXBsZW1lbnRzIE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgIGlmIChEQkcpCisgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIm9uSXRlbVNlbGVjdGVkKCkgcG9zaXRpb24gIiArIHBvc2l0aW9uKTsKKyAgICAgICAgICAgIC8vIEEgc3VnZ2VzdGlvbiBoYXMgYmVlbiBzZWxlY3RlZCwgcmV3cml0ZSB0aGUgcXVlcnkgaWYgcG9zc2libGUsCisgICAgICAgICAgICAvLyBvdGhlcndpc2UgdGhlIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHF1ZXJ5LgorICAgICAgICAgICAgcmV3cml0ZVF1ZXJ5RnJvbVN1Z2dlc3Rpb24ocG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEltcGxlbWVudHMgT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Ob3RoaW5nU2VsZWN0ZWQoQWRhcHRlclZpZXc8Pz4gcGFyZW50KSB7CisgICAgICAgICAgICBpZiAoREJHKQorICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJvbk5vdGhpbmdTZWxlY3RlZCgpIik7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogUXVlcnkgcmV3cml0aW5nLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXdyaXRlUXVlcnlGcm9tU3VnZ2VzdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgQ2hhclNlcXVlbmNlIG9sZFF1ZXJ5ID0gbVF1ZXJ5VGV4dFZpZXcuZ2V0VGV4dCgpOworICAgICAgICBDdXJzb3IgYyA9IG1TdWdnZXN0aW9uc0FkYXB0ZXIuZ2V0Q3Vyc29yKCk7CisgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYy5tb3ZlVG9Qb3NpdGlvbihwb3NpdGlvbikpIHsKKyAgICAgICAgICAgIC8vIEdldCB0aGUgbmV3IHF1ZXJ5IGZyb20gdGhlIHN1Z2dlc3Rpb24uCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgbmV3UXVlcnkgPSBtU3VnZ2VzdGlvbnNBZGFwdGVyLmNvbnZlcnRUb1N0cmluZyhjKTsKKyAgICAgICAgICAgIGlmIChuZXdRdWVyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHN1Z2dlc3Rpb24gcmV3cml0ZXMgdGhlIHF1ZXJ5LgorICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgdGV4dCBmaWVsZCwgd2l0aG91dCBnZXR0aW5nIG5ldyBzdWdnZXN0aW9ucy4KKyAgICAgICAgICAgICAgICBzZXRRdWVyeShuZXdRdWVyeSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoZSBzdWdnZXN0aW9uIGRvZXMgbm90IHJld3JpdGUgdGhlIHF1ZXJ5LCByZXN0b3JlIHRoZSB1c2VyJ3MgcXVlcnkuCisgICAgICAgICAgICAgICAgc2V0UXVlcnkob2xkUXVlcnkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gV2UgZ290IGEgYmFkIHBvc2l0aW9uLCByZXN0b3JlIHRoZSB1c2VyJ3MgcXVlcnkuCisgICAgICAgICAgICBzZXRRdWVyeShvbGRRdWVyeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMYXVuY2hlcyBhbiBpbnRlbnQgYmFzZWQgb24gYSBzdWdnZXN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBpbmRleCBvZiB0aGUgc3VnZ2VzdGlvbiB0byBjcmVhdGUgdGhlIGludGVudCBmcm9tLgorICAgICAqIEBwYXJhbSBhY3Rpb25LZXkgVGhlIGtleSBjb2RlIG9mIHRoZSBhY3Rpb24ga2V5IHRoYXQgd2FzIHByZXNzZWQsCisgICAgICogICAgICAgIG9yIHtAbGluayBLZXlFdmVudCNLRVlDT0RFX1VOS05PV059IGlmIG5vbmUuCisgICAgICogQHBhcmFtIGFjdGlvbk1zZyBUaGUgbWVzc2FnZSBmb3IgdGhlIGFjdGlvbiBrZXkgdGhhdCB3YXMgcHJlc3NlZCwKKyAgICAgKiAgICAgICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSBzdWNjZXNzZnVsIGxhdW5jaCwgZmFsc2UgaWYgY291bGQgbm90IChlLmcuIGJhZCBwb3NpdGlvbikuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGxhdW5jaFN1Z2dlc3Rpb24oaW50IHBvc2l0aW9uLCBpbnQgYWN0aW9uS2V5LCBTdHJpbmcgYWN0aW9uTXNnKSB7CisgICAgICAgIEN1cnNvciBjID0gbVN1Z2dlc3Rpb25zQWRhcHRlci5nZXRDdXJzb3IoKTsKKyAgICAgICAgaWYgKChjICE9IG51bGwpICYmIGMubW92ZVRvUG9zaXRpb24ocG9zaXRpb24pKSB7CisKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBjcmVhdGVJbnRlbnRGcm9tU3VnZ2VzdGlvbihjLCBhY3Rpb25LZXksIGFjdGlvbk1zZyk7CisKKyAgICAgICAgICAgIC8vIGxhdW5jaCB0aGUgaW50ZW50CisgICAgICAgICAgICBsYXVuY2hJbnRlbnQoaW50ZW50KTsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIExhdW5jaGVzIGFuIGludGVudCwgaW5jbHVkaW5nIGFueSBzcGVjaWFsIGludGVudCBoYW5kbGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbGF1bmNoSW50ZW50KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgaWYgKGludGVudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBpbnRlbnQgd2FzIGNyZWF0ZWQgZnJvbSBhIHN1Z2dlc3Rpb24sIGl0IHdpbGwgYWx3YXlzIGhhdmUgYW4gZXhwbGljaXQKKyAgICAgICAgICAgIC8vIGNvbXBvbmVudCBoZXJlLgorICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCBsYXVuY2ggYWN0aXZpdHk6ICIgKyBpbnRlbnQsIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRleHQgaW4gdGhlIHF1ZXJ5IGJveCwgd2l0aG91dCB1cGRhdGluZyB0aGUgc3VnZ2VzdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldFF1ZXJ5KENoYXJTZXF1ZW5jZSBxdWVyeSkgeworICAgICAgICBtUXVlcnlUZXh0Vmlldy5zZXRUZXh0KHF1ZXJ5LCB0cnVlKTsKKyAgICAgICAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQKKyAgICAgICAgbVF1ZXJ5VGV4dFZpZXcuc2V0U2VsZWN0aW9uKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSA/IDAgOiBxdWVyeS5sZW5ndGgoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxhdW5jaFF1ZXJ5U2VhcmNoKGludCBhY3Rpb25LZXksIFN0cmluZyBhY3Rpb25Nc2csIFN0cmluZyBxdWVyeSkgeworICAgICAgICBTdHJpbmcgYWN0aW9uID0gSW50ZW50LkFDVElPTl9TRUFSQ0g7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBjcmVhdGVJbnRlbnQoYWN0aW9uLCBudWxsLCBudWxsLCBxdWVyeSwgYWN0aW9uS2V5LCBhY3Rpb25Nc2cpOworICAgICAgICBnZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gaW50ZW50IGZyb20gdGhlIGdpdmVuIGluZm9ybWF0aW9uIGFuZCB0aGUgc2VhcmNoIGRpYWxvZyBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY3Rpb24gSW50ZW50IGFjdGlvbi4KKyAgICAgKiBAcGFyYW0gZGF0YSBJbnRlbnQgZGF0YSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGV4dHJhRGF0YSBEYXRhIGZvciB7QGxpbmsgU2VhcmNoTWFuYWdlciNFWFRSQV9EQVRBX0tFWX0gb3IgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHF1ZXJ5IEludGVudCBxdWVyeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGFjdGlvbktleSBUaGUga2V5IGNvZGUgb2YgdGhlIGFjdGlvbiBrZXkgdGhhdCB3YXMgcHJlc3NlZCwKKyAgICAgKiAgICAgICAgb3Ige0BsaW5rIEtleUV2ZW50I0tFWUNPREVfVU5LTk9XTn0gaWYgbm9uZS4KKyAgICAgKiBAcGFyYW0gYWN0aW9uTXNnIFRoZSBtZXNzYWdlIGZvciB0aGUgYWN0aW9uIGtleSB0aGF0IHdhcyBwcmVzc2VkLAorICAgICAqICAgICAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBzZWFyY2ggbW9kZSwgb25lIG9mIHRoZSBhY2NlcHRhYmxlIHZhbHVlcyBmb3IKKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgU2VhcmNoTWFuYWdlciNTRUFSQ0hfTU9ERX0sIG9yIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcmV0dXJuIFRoZSBpbnRlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBJbnRlbnQgY3JlYXRlSW50ZW50KFN0cmluZyBhY3Rpb24sIFVyaSBkYXRhLCBTdHJpbmcgZXh0cmFEYXRhLCBTdHJpbmcgcXVlcnksCisgICAgICAgICAgICBpbnQgYWN0aW9uS2V5LCBTdHJpbmcgYWN0aW9uTXNnKSB7CisgICAgICAgIC8vIE5vdyBidWlsZCB0aGUgSW50ZW50CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGFjdGlvbik7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgIC8vIFdlIG5lZWQgQ0xFQVJfVE9QIHRvIGF2b2lkIHJldXNpbmcgYW4gb2xkIHRhc2sgdGhhdCBoYXMgb3RoZXIgYWN0aXZpdGllcworICAgICAgICAvLyBvbiB0b3Agb2YgdGhlIG9uZSB3ZSB3YW50LiBXZSBkb24ndCB3YW50IHRvIGRvIHRoaXMgaW4gaW4tYXBwIHNlYXJjaCB0aG91Z2gsCisgICAgICAgIC8vIGFzIGl0IGNhbiBiZSBkZXN0cnVjdGl2ZSB0byB0aGUgYWN0aXZpdHkgc3RhY2suCisgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludGVudC5zZXREYXRhKGRhdGEpOworICAgICAgICB9CisgICAgICAgIGludGVudC5wdXRFeHRyYShTZWFyY2hNYW5hZ2VyLlVTRVJfUVVFUlksIHF1ZXJ5KTsKKyAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShTZWFyY2hNYW5hZ2VyLlFVRVJZLCBxdWVyeSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4dHJhRGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoU2VhcmNoTWFuYWdlci5FWFRSQV9EQVRBX0tFWSwgZXh0cmFEYXRhKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWN0aW9uS2V5ICE9IEtleUV2ZW50LktFWUNPREVfVU5LTk9XTikgeworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFNlYXJjaE1hbmFnZXIuQUNUSU9OX0tFWSwgYWN0aW9uS2V5KTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShTZWFyY2hNYW5hZ2VyLkFDVElPTl9NU0csIGFjdGlvbk1zZyk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChtU2VhcmNoYWJsZS5nZXRTZWFyY2hBY3Rpdml0eSgpKTsKKyAgICAgICAgcmV0dXJuIGludGVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIGEgcGFydGljdWxhciBzdWdnZXN0aW9uIGhhcyBiZWVuIHNlbGVjdGVkLCBwZXJmb3JtIHRoZSB2YXJpb3VzIGxvb2t1cHMgcmVxdWlyZWQKKyAgICAgKiB0byB1c2UgdGhlIHN1Z2dlc3Rpb24uICBUaGlzIGluY2x1ZGVzIGNoZWNraW5nIHRoZSBjdXJzb3IgZm9yIHN1Z2dlc3Rpb24tc3BlY2lmaWMgZGF0YSwKKyAgICAgKiBhbmQvb3IgZmFsbGluZyBiYWNrIHRvIHRoZSBYTUwgZm9yIGRlZmF1bHRzOyAgSXQgYWxzbyBjcmVhdGVzIFJFU1Qgc3R5bGUgVXJpIGRhdGEgd2hlbgorICAgICAqIHRoZSBzdWdnZXN0aW9uIGluY2x1ZGVzIGEgZGF0YSBpZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIFRoZSBzdWdnZXN0aW9ucyBjdXJzb3IsIG1vdmVkIHRvIHRoZSByb3cgb2YgdGhlIHVzZXIncyBzZWxlY3Rpb24KKyAgICAgKiBAcGFyYW0gYWN0aW9uS2V5IFRoZSBrZXkgY29kZSBvZiB0aGUgYWN0aW9uIGtleSB0aGF0IHdhcyBwcmVzc2VkLAorICAgICAqICAgICAgICBvciB7QGxpbmsgS2V5RXZlbnQjS0VZQ09ERV9VTktOT1dOfSBpZiBub25lLgorICAgICAqIEBwYXJhbSBhY3Rpb25Nc2cgVGhlIG1lc3NhZ2UgZm9yIHRoZSBhY3Rpb24ga2V5IHRoYXQgd2FzIHByZXNzZWQsCisgICAgICogICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisgICAgICogQHJldHVybiBBbiBpbnRlbnQgZm9yIHRoZSBzdWdnZXN0aW9uIGF0IHRoZSBjdXJzb3IncyBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEludGVudCBjcmVhdGVJbnRlbnRGcm9tU3VnZ2VzdGlvbihDdXJzb3IgYywgaW50IGFjdGlvbktleSwgU3RyaW5nIGFjdGlvbk1zZykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gdXNlIHNwZWNpZmljIGFjdGlvbiBpZiBzdXBwbGllZCwgb3IgZGVmYXVsdCBhY3Rpb24gaWYgc3VwcGxpZWQsIG9yIGZpeGVkIGRlZmF1bHQKKyAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBnZXRDb2x1bW5TdHJpbmcoYywgU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9JTlRFTlRfQUNUSU9OKTsKKworICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWN0aW9uID0gbVNlYXJjaGFibGUuZ2V0U3VnZ2VzdEludGVudEFjdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWN0aW9uID0gSW50ZW50LkFDVElPTl9TRUFSQ0g7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHVzZSBzcGVjaWZpYyBkYXRhIGlmIHN1cHBsaWVkLCBvciBkZWZhdWx0IGRhdGEgaWYgc3VwcGxpZWQKKyAgICAgICAgICAgIFN0cmluZyBkYXRhID0gZ2V0Q29sdW1uU3RyaW5nKGMsIFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fSU5URU5UX0RBVEEpOworICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRhdGEgPSBtU2VhcmNoYWJsZS5nZXRTdWdnZXN0SW50ZW50RGF0YSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gdGhlbiwgaWYgYW4gSUQgd2FzIHByb3ZpZGVkLCBhcHBlbmQgaXQuCisgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gZ2V0Q29sdW1uU3RyaW5nKGMsIFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fSU5URU5UX0RBVEFfSUQpOworICAgICAgICAgICAgICAgIGlmIChpZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhICsgIi8iICsgVXJpLmVuY29kZShpZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgVXJpIGRhdGFVcmkgPSAoZGF0YSA9PSBudWxsKSA/IG51bGwgOiBVcmkucGFyc2UoZGF0YSk7CisKKyAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9IGdldENvbHVtblN0cmluZyhjLCBTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX1FVRVJZKTsKKyAgICAgICAgICAgIFN0cmluZyBleHRyYURhdGEgPSBnZXRDb2x1bW5TdHJpbmcoYywgU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9JTlRFTlRfRVhUUkFfREFUQSk7CisKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnRlbnQoYWN0aW9uLCBkYXRhVXJpLCBleHRyYURhdGEsIHF1ZXJ5LCBhY3Rpb25LZXksIGFjdGlvbk1zZyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSApIHsKKyAgICAgICAgICAgIGludCByb3dOdW07CisgICAgICAgICAgICB0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgLy8gYmUgcmVhbGx5IHBhcmFub2lkIG5vdworICAgICAgICAgICAgICAgIHJvd051bSA9IGMuZ2V0UG9zaXRpb24oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZTIgKSB7CisgICAgICAgICAgICAgICAgcm93TnVtID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiU2VhcmNoIFN1Z2dlc3Rpb25zIGN1cnNvciBhdCByb3cgIiArIHJvd051bSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXR1cm5lZCBleGNlcHRpb24iICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgdG8gd2F0Y2ggdGhlIHRleHQgZmllbGQgZm9yIGVtcHR5L25vbi1lbXB0eQorICAgICAqLworICAgIHByaXZhdGUgVGV4dFdhdGNoZXIgbVRleHRXYXRjaGVyID0gbmV3IFRleHRXYXRjaGVyKCkgeworCisgICAgICAgIHB1YmxpYyB2b2lkIGJlZm9yZVRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBiZWZvcmUsIGludCBhZnRlcikgeyB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgIGludCBiZWZvcmUsIGludCBhZnRlcikgeworICAgICAgICAgICAgU2VhcmNoVmlldy50aGlzLm9uVGV4dENoYW5nZWQocyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclRleHRDaGFuZ2VkKEVkaXRhYmxlIHMpIHsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKgorICAgICAqIEF2b2lkIGdldHRpbmcgZm9jdXMgd2hlbiBzZWFyY2hpbmcgZm9yIHNvbWV0aGluZyB0byBmb2N1cyBvbi4KKyAgICAgKiBUaGUgdXNlciB3aWxsIGhhdmUgdG8gdG91Y2ggdGhlIHRleHQgdmlldyB0byBnZXQgZm9jdXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gb25SZXF1ZXN0Rm9jdXNJbkRlc2NlbmRhbnRzKGludCBkaXJlY3Rpb24sCisgICAgICAgICAgICBSZWN0IHByZXZpb3VzbHlGb2N1c2VkUmVjdCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TaW1wbGVDdXJzb3JBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2ltcGxlQ3Vyc29yQWRhcHRlci5qYXZhCmluZGV4IDdkMzQ1OWUuLmQxYzIyNzAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TaW1wbGVDdXJzb3JBZGFwdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NpbXBsZUN1cnNvckFkYXB0ZXIuamF2YQpAQCAtNjIsNyArNjIsOCBAQAogICAgIHByaXZhdGUgaW50IG1TdHJpbmdDb252ZXJzaW9uQ29sdW1uID0gLTE7CiAgICAgcHJpdmF0ZSBDdXJzb3JUb1N0cmluZ0NvbnZlcnRlciBtQ3Vyc29yVG9TdHJpbmdDb252ZXJ0ZXI7CiAgICAgcHJpdmF0ZSBWaWV3QmluZGVyIG1WaWV3QmluZGVyOwotICAgIHByaXZhdGUgU3RyaW5nW10gbU9yaWdpbmFsRnJvbTsKKworICAgIFN0cmluZ1tdIG1PcmlnaW5hbEZyb207CiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3Rvci4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGlubmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3Bpbm5lci5qYXZhCmluZGV4IDhkZGIwNmMuLmMwY2JiMTkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGlubmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NwaW5uZXIuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogCkBAIC00MCwyNyArNDEsMTUxIEBACiAgKi8KIEBXaWRnZXQKIHB1YmxpYyBjbGFzcyBTcGlubmVyIGV4dGVuZHMgQWJzU3Bpbm5lciBpbXBsZW1lbnRzIE9uQ2xpY2tMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTcGlubmVyIjsKICAgICAKLSAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtUHJvbXB0OwotICAgIHByaXZhdGUgQWxlcnREaWFsb2cgbVBvcHVwOworICAgIC8qKgorICAgICAqIFVzZSBhIGRpYWxvZyB3aW5kb3cgZm9yIHNlbGVjdGluZyBzcGlubmVyIG9wdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9ESUFMT0cgPSAwOworICAgIAorICAgIC8qKgorICAgICAqIFVzZSBhIGRyb3Bkb3duIGFuY2hvcmVkIHRvIHRoZSBTcGlubmVyIGZvciBzZWxlY3Rpbmcgc3Bpbm5lciBvcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfRFJPUERPV04gPSAxOworICAgIAorICAgIC8qKgorICAgICAqIFVzZSB0aGUgdGhlbWUtc3VwcGxpZWQgdmFsdWUgdG8gc2VsZWN0IHRoZSBkcm9wZG93biBtb2RlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX1RIRU1FID0gLTE7CisgICAgCisgICAgcHJpdmF0ZSBTcGlubmVyUG9wdXAgbVBvcHVwOworICAgIHByaXZhdGUgRHJvcERvd25BZGFwdGVyIG1UZW1wQWRhcHRlcjsKIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBzcGlubmVyIHdpdGggdGhlIGdpdmVuIGNvbnRleHQncyB0aGVtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBDb250ZXh0IHRoZSB2aWV3IGlzIHJ1bm5pbmcgaW4sIHRocm91Z2ggd2hpY2ggaXQgY2FuCisgICAgICogICAgICAgIGFjY2VzcyB0aGUgY3VycmVudCB0aGVtZSwgcmVzb3VyY2VzLCBldGMuCisgICAgICovCiAgICAgcHVibGljIFNwaW5uZXIoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IHNwaW5uZXIgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCdzIHRoZW1lIGFuZCB0aGUgc3VwcGxpZWQKKyAgICAgKiBtb2RlIG9mIGRpc3BsYXlpbmcgY2hvaWNlcy4gPGNvZGU+bW9kZTwvY29kZT4gbWF5IGJlIG9uZSBvZgorICAgICAqIHtAbGluayAjTU9ERV9ESUFMT0d9IG9yIHtAbGluayAjTU9ERV9EUk9QRE9XTn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgQ29udGV4dCB0aGUgdmlldyBpcyBydW5uaW5nIGluLCB0aHJvdWdoIHdoaWNoIGl0IGNhbgorICAgICAqICAgICAgICBhY2Nlc3MgdGhlIGN1cnJlbnQgdGhlbWUsIHJlc291cmNlcywgZXRjLgorICAgICAqIEBwYXJhbSBtb2RlIENvbnN0YW50IGRlc2NyaWJpbmcgaG93IHRoZSB1c2VyIHdpbGwgc2VsZWN0IGNob2ljZXMgZnJvbSB0aGUgc3Bpbm5lci4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNNT0RFX0RJQUxPRworICAgICAqIEBzZWUgI01PREVfRFJPUERPV04KKyAgICAgKi8KKyAgICBwdWJsaWMgU3Bpbm5lcihDb250ZXh0IGNvbnRleHQsIGludCBtb2RlKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLnNwaW5uZXJTdHlsZSwgbW9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IHNwaW5uZXIgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCdzIHRoZW1lIGFuZCB0aGUgc3VwcGxpZWQgYXR0cmlidXRlIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBDb250ZXh0IHRoZSB2aWV3IGlzIHJ1bm5pbmcgaW4sIHRocm91Z2ggd2hpY2ggaXQgY2FuCisgICAgICogICAgICAgIGFjY2VzcyB0aGUgY3VycmVudCB0aGVtZSwgcmVzb3VyY2VzLCBldGMuCisgICAgICogQHBhcmFtIGF0dHJzIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBYTUwgdGFnIHRoYXQgaXMgaW5mbGF0aW5nIHRoZSB2aWV3LgorICAgICAqLwogICAgIHB1YmxpYyBTcGlubmVyKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CiAgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5zcGlubmVyU3R5bGUpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBzcGlubmVyIHdpdGggdGhlIGdpdmVuIGNvbnRleHQncyB0aGVtZSwgdGhlIHN1cHBsaWVkIGF0dHJpYnV0ZSBzZXQsCisgICAgICogYW5kIGRlZmF1bHQgc3R5bGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgQ29udGV4dCB0aGUgdmlldyBpcyBydW5uaW5nIGluLCB0aHJvdWdoIHdoaWNoIGl0IGNhbgorICAgICAqICAgICAgICBhY2Nlc3MgdGhlIGN1cnJlbnQgdGhlbWUsIHJlc291cmNlcywgZXRjLgorICAgICAqIEBwYXJhbSBhdHRycyBUaGUgYXR0cmlidXRlcyBvZiB0aGUgWE1MIHRhZyB0aGF0IGlzIGluZmxhdGluZyB0aGUgdmlldy4KKyAgICAgKiBAcGFyYW0gZGVmU3R5bGUgVGhlIGRlZmF1bHQgc3R5bGUgdG8gYXBwbHkgdG8gdGhpcyB2aWV3LiBJZiAwLCBubyBzdHlsZQorICAgICAqICAgICAgICB3aWxsIGJlIGFwcGxpZWQgKGJleW9uZCB3aGF0IGlzIGluY2x1ZGVkIGluIHRoZSB0aGVtZSkuIFRoaXMgbWF5CisgICAgICogICAgICAgIGVpdGhlciBiZSBhbiBhdHRyaWJ1dGUgcmVzb3VyY2UsIHdob3NlIHZhbHVlIHdpbGwgYmUgcmV0cmlldmVkCisgICAgICogICAgICAgIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUsIG9yIGFuIGV4cGxpY2l0IHN0eWxlIHJlc291cmNlLgorICAgICAqLwogICAgIHB1YmxpYyBTcGlubmVyKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIE1PREVfVEhFTUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBzcGlubmVyIHdpdGggdGhlIGdpdmVuIGNvbnRleHQncyB0aGVtZSwgdGhlIHN1cHBsaWVkIGF0dHJpYnV0ZSBzZXQsCisgICAgICogYW5kIGRlZmF1bHQgc3R5bGUuIDxjb2RlPm1vZGU8L2NvZGU+IG1heSBiZSBvbmUgb2Yge0BsaW5rICNNT0RFX0RJQUxPR30gb3IKKyAgICAgKiB7QGxpbmsgI01PREVfRFJPUERPV059IGFuZCBkZXRlcm1pbmVzIGhvdyB0aGUgdXNlciB3aWxsIHNlbGVjdCBjaG9pY2VzIGZyb20gdGhlIHNwaW5uZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgQ29udGV4dCB0aGUgdmlldyBpcyBydW5uaW5nIGluLCB0aHJvdWdoIHdoaWNoIGl0IGNhbgorICAgICAqICAgICAgICBhY2Nlc3MgdGhlIGN1cnJlbnQgdGhlbWUsIHJlc291cmNlcywgZXRjLgorICAgICAqIEBwYXJhbSBhdHRycyBUaGUgYXR0cmlidXRlcyBvZiB0aGUgWE1MIHRhZyB0aGF0IGlzIGluZmxhdGluZyB0aGUgdmlldy4KKyAgICAgKiBAcGFyYW0gZGVmU3R5bGUgVGhlIGRlZmF1bHQgc3R5bGUgdG8gYXBwbHkgdG8gdGhpcyB2aWV3LiBJZiAwLCBubyBzdHlsZQorICAgICAqICAgICAgICB3aWxsIGJlIGFwcGxpZWQgKGJleW9uZCB3aGF0IGlzIGluY2x1ZGVkIGluIHRoZSB0aGVtZSkuIFRoaXMgbWF5CisgICAgICogICAgICAgIGVpdGhlciBiZSBhbiBhdHRyaWJ1dGUgcmVzb3VyY2UsIHdob3NlIHZhbHVlIHdpbGwgYmUgcmV0cmlldmVkCisgICAgICogICAgICAgIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUsIG9yIGFuIGV4cGxpY2l0IHN0eWxlIHJlc291cmNlLgorICAgICAqIEBwYXJhbSBtb2RlIENvbnN0YW50IGRlc2NyaWJpbmcgaG93IHRoZSB1c2VyIHdpbGwgc2VsZWN0IGNob2ljZXMgZnJvbSB0aGUgc3Bpbm5lci4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNNT0RFX0RJQUxPRworICAgICAqIEBzZWUgI01PREVfRFJPUERPV04KKyAgICAgKi8KKyAgICBwdWJsaWMgU3Bpbm5lcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlLCBpbnQgbW9kZSkgewogICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOwogCiAgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyLCBkZWZTdHlsZSwgMCk7CisKKyAgICAgICAgaWYgKG1vZGUgPT0gTU9ERV9USEVNRSkgeworICAgICAgICAgICAgbW9kZSA9IGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfc3Bpbm5lck1vZGUsIE1PREVfRElBTE9HKTsKKyAgICAgICAgfQogICAgICAgICAKLSAgICAgICAgbVByb21wdCA9IGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfcHJvbXB0KTsKKyAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgTU9ERV9ESUFMT0c6IHsKKyAgICAgICAgICAgIG1Qb3B1cCA9IG5ldyBEaWFsb2dQb3B1cCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1PREVfRFJPUERPV046IHsKKyAgICAgICAgICAgIGZpbmFsIGludCBoaW50UmVzb3VyY2UgPSBhLmdldFJlc291cmNlSWQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfcG9wdXBQcm9tcHRWaWV3LCAwKTsKKworICAgICAgICAgICAgRHJvcGRvd25Qb3B1cCBwb3B1cCA9IG5ldyBEcm9wZG93blBvcHVwKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSwgaGludFJlc291cmNlKTsKKworICAgICAgICAgICAgcG9wdXAuc2V0QmFja2dyb3VuZERyYXdhYmxlKGEuZ2V0RHJhd2FibGUoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfcG9wdXBCYWNrZ3JvdW5kKSk7CisgICAgICAgICAgICBwb3B1cC5zZXRWZXJ0aWNhbE9mZnNldChhLmdldERpbWVuc2lvblBpeGVsT2Zmc2V0KAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyX2Ryb3BEb3duVmVydGljYWxPZmZzZXQsIDApKTsKKyAgICAgICAgICAgIHBvcHVwLnNldEhvcml6b250YWxPZmZzZXQoYS5nZXREaW1lbnNpb25QaXhlbE9mZnNldCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3Bpbm5lcl9kcm9wRG93bkhvcml6b250YWxPZmZzZXQsIDApKTsKKworICAgICAgICAgICAgbVBvcHVwID0gcG9wdXA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtUG9wdXAuc2V0UHJvbXB0VGV4dChhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyX3Byb21wdCkpOwogCiAgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgIC8vIEJhc2UgY29uc3RydWN0b3IgY2FuIGNhbGwgc2V0QWRhcHRlciBiZWZvcmUgd2UgaW5pdGlhbGl6ZSBtUG9wdXAuCisgICAgICAgIC8vIEZpbmlzaCBzZXR0aW5nIHRoaW5ncyB1cCBpZiB0aGlzIGhhcHBlbmVkLgorICAgICAgICBpZiAobVRlbXBBZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRBZGFwdGVyKG1UZW1wQWRhcHRlcik7CisgICAgICAgICAgICBtVGVtcEFkYXB0ZXIgPSBudWxsOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoU3Bpbm5lckFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBzdXBlci5zZXRBZGFwdGVyKGFkYXB0ZXIpOworCisgICAgICAgIGlmIChtUG9wdXAgIT0gbnVsbCkgeworICAgICAgICAgICAgbVBvcHVwLnNldEFkYXB0ZXIobmV3IERyb3BEb3duQWRhcHRlcihhZGFwdGVyKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVGVtcEFkYXB0ZXIgPSBuZXcgRHJvcERvd25BZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC04Nyw3ICsyMTIsNiBAQAogICAgICAgICAKICAgICAgICAgaWYgKG1Qb3B1cCAhPSBudWxsICYmIG1Qb3B1cC5pc1Nob3dpbmcoKSkgewogICAgICAgICAgICAgbVBvcHVwLmRpc21pc3MoKTsKLSAgICAgICAgICAgIG1Qb3B1cCA9IG51bGw7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE5Nyw4ICszMjEsNiBAQAogICAgICAgICByZXR1cm4gY2hpbGQ7CiAgICAgfQogCi0KLQogICAgIC8qKgogICAgICAqIEhlbHBlciBmb3IgbWFrZUFuZEFkZFZpZXcgdG8gc2V0IHRoZSBwb3NpdGlvbiBvZiBhIHZpZXcKICAgICAgKiBhbmQgZmlsbCBvdXQgaXRzIGxheW91dCBwYXJhbXRlcnMuCkBAIC0yNDksMTUgKzM3MSwxMCBAQAogICAgICAgICAKICAgICAgICAgaWYgKCFoYW5kbGVkKSB7CiAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgRHJvcERvd25BZGFwdGVyIGFkYXB0ZXIgPSBuZXcgRHJvcERvd25BZGFwdGVyKGdldEFkYXB0ZXIoKSk7CiAKLSAgICAgICAgICAgIEFsZXJ0RGlhbG9nLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKGNvbnRleHQpOwotICAgICAgICAgICAgaWYgKG1Qcm9tcHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0VGl0bGUobVByb21wdCk7CisgICAgICAgICAgICBpZiAoIW1Qb3B1cC5pc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgICAgIG1Qb3B1cC5zaG93KCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUG9wdXAgPSBidWlsZGVyLnNldFNpbmdsZUNob2ljZUl0ZW1zKGFkYXB0ZXIsIGdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCksIHRoaXMpLnNob3coKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBoYW5kbGVkOwpAQCAtMjY2LDcgKzM4Myw2IEBACiAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKICAgICAgICAgc2V0U2VsZWN0aW9uKHdoaWNoKTsKICAgICAgICAgZGlhbG9nLmRpc21pc3MoKTsKLSAgICAgICAgbVBvcHVwID0gbnVsbDsKICAgICB9CiAKICAgICAvKioKQEAgLTI3NCw3ICszOTAsNyBAQAogICAgICAqIEBwYXJhbSBwcm9tcHQgdGhlIHByb21wdCB0byBzZXQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQcm9tcHQoQ2hhclNlcXVlbmNlIHByb21wdCkgewotICAgICAgICBtUHJvbXB0ID0gcHJvbXB0OworICAgICAgICBtUG9wdXAuc2V0UHJvbXB0VGV4dChwcm9tcHQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjgyLDE0ICszOTgsMTQgQEAKICAgICAgKiBAcGFyYW0gcHJvbXB0SWQgdGhlIHJlc291cmNlIElEIG9mIHRoZSBwcm9tcHQgdG8gZGlzcGxheSB3aGVuIHRoZSBkaWFsb2cgaXMgc2hvd24KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQcm9tcHRJZChpbnQgcHJvbXB0SWQpIHsKLSAgICAgICAgbVByb21wdCA9IGdldENvbnRleHQoKS5nZXRUZXh0KHByb21wdElkKTsKKyAgICAgICAgc2V0UHJvbXB0KGdldENvbnRleHQoKS5nZXRUZXh0KHByb21wdElkKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQHJldHVybiBUaGUgcHJvbXB0IHRvIGRpc3BsYXkgd2hlbiB0aGUgZGlhbG9nIGlzIHNob3duCiAgICAgICovCiAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRQcm9tcHQoKSB7Ci0gICAgICAgIHJldHVybiBtUHJvbXB0OworICAgICAgICByZXR1cm4gbVBvcHVwLmdldEhpbnRUZXh0KCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMzg3LDQgKzUwMywxMjQgQEAKICAgICAgICAgICAgIHJldHVybiBnZXRDb3VudCgpID09IDA7CiAgICAgICAgIH0KICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogSW1wbGVtZW50cyBzb21lIHNvcnQgb2YgcG9wdXAgc2VsZWN0aW9uIGludGVyZmFjZSBmb3Igc2VsZWN0aW5nIGEgc3Bpbm5lciBvcHRpb24uCisgICAgICogQWxsb3dzIGZvciBkaWZmZXJlbnQgc3Bpbm5lciBtb2Rlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludGVyZmFjZSBTcGlubmVyUG9wdXAgeworICAgICAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNob3cgdGhlIHBvcHVwCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzaG93KCk7CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogRGlzbWlzcyB0aGUgcG9wdXAKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc21pc3MoKTsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBvcHVwIGlzIHNob3dpbmcsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2hvd2luZygpOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBoaW50IHRleHQgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyLiBUaGlzIHNob3VsZCBwcm92aWRlCisgICAgICAgICAqIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNob2ljZSBiZWluZyBtYWRlLgorICAgICAgICAgKiBAcGFyYW0gaGludFRleHQgSGludCB0ZXh0IHRvIHNldC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByb21wdFRleHQoQ2hhclNlcXVlbmNlIGhpbnRUZXh0KTsKKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRIaW50VGV4dCgpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGNsYXNzIERpYWxvZ1BvcHVwIGltcGxlbWVudHMgU3Bpbm5lclBvcHVwLCBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBBbGVydERpYWxvZyBtUG9wdXA7CisgICAgICAgIHByaXZhdGUgTGlzdEFkYXB0ZXIgbUxpc3RBZGFwdGVyOworICAgICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtUHJvbXB0OworCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc21pc3MoKSB7CisgICAgICAgICAgICBtUG9wdXAuZGlzbWlzcygpOworICAgICAgICAgICAgbVBvcHVwID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2hvd2luZygpIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9wdXAgIT0gbnVsbCA/IG1Qb3B1cC5pc1Nob3dpbmcoKSA6IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihMaXN0QWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgICAgICBtTGlzdEFkYXB0ZXIgPSBhZGFwdGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvbXB0VGV4dChDaGFyU2VxdWVuY2UgaGludFRleHQpIHsKKyAgICAgICAgICAgIG1Qcm9tcHQgPSBoaW50VGV4dDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRIaW50VGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUHJvbXB0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKyAgICAgICAgICAgIEFsZXJ0RGlhbG9nLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKGdldENvbnRleHQoKSk7CisgICAgICAgICAgICBpZiAobVByb21wdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRUaXRsZShtUHJvbXB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Qb3B1cCA9IGJ1aWxkZXIuc2V0U2luZ2xlQ2hvaWNlSXRlbXMobUxpc3RBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICBnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpLCB0aGlzKS5zaG93KCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7CisgICAgICAgICAgICBzZXRTZWxlY3Rpb24od2hpY2gpOworICAgICAgICAgICAgZGlzbWlzcygpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgY2xhc3MgRHJvcGRvd25Qb3B1cCBleHRlbmRzIExpc3RQb3B1cFdpbmRvdyBpbXBsZW1lbnRzIFNwaW5uZXJQb3B1cCB7CisgICAgICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1IaW50VGV4dDsKKyAgICAgICAgcHJpdmF0ZSBUZXh0VmlldyBtSGludFZpZXc7CisgICAgICAgIHByaXZhdGUgaW50IG1IaW50UmVzb3VyY2U7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgRHJvcGRvd25Qb3B1cChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywKKyAgICAgICAgICAgICAgICBpbnQgZGVmU3R5bGVSZXMsIGludCBoaW50UmVzb3VyY2UpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCAwLCBkZWZTdHlsZVJlcyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1IaW50UmVzb3VyY2UgPSBoaW50UmVzb3VyY2U7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHNldEFuY2hvclZpZXcoU3Bpbm5lci50aGlzKTsKKyAgICAgICAgICAgIHNldE1vZGFsKHRydWUpOworICAgICAgICAgICAgc2V0UHJvbXB0UG9zaXRpb24oUE9TSVRJT05fUFJPTVBUX0JFTE9XKTsKKyAgICAgICAgICAgIHNldE9uSXRlbUNsaWNrTGlzdGVuZXIobmV3IE9uSXRlbUNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXcgcGFyZW50LCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgICAgICAgICBTcGlubmVyLnRoaXMuc2V0U2VsZWN0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgZGlzbWlzcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEhpbnRUZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1IaW50VGV4dDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvbXB0VGV4dChDaGFyU2VxdWVuY2UgaGludFRleHQpIHsKKyAgICAgICAgICAgIG1IaW50VGV4dCA9IGhpbnRUZXh0OworICAgICAgICAgICAgaWYgKG1IaW50VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUhpbnRWaWV3LnNldFRleHQoaGludFRleHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgICAgICBpZiAobUhpbnRWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUZXh0VmlldyB0ZXh0VmlldyA9IChUZXh0VmlldykgTGF5b3V0SW5mbGF0ZXIuZnJvbShnZXRDb250ZXh0KCkpLmluZmxhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBtSGludFJlc291cmNlLCBudWxsKS5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC50ZXh0MSk7CisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dChtSGludFRleHQpOworICAgICAgICAgICAgICAgIHNldFByb21wdFZpZXcodGV4dFZpZXcpOworICAgICAgICAgICAgICAgIG1IaW50VmlldyA9IHRleHRWaWV3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VwZXIuc2hvdygpOworICAgICAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRDaG9pY2VNb2RlKExpc3RWaWV3LkNIT0lDRV9NT0RFX1NJTkdMRSk7CisgICAgICAgICAgICBzZXRTZWxlY3Rpb24oU3Bpbm5lci50aGlzLmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCkpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1N0YWNrVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1N0YWNrVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwOTU0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3RhY2tWaWV3LmphdmEKQEAgLTAsMCArMSwxMDE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndpZGdldDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5VmFsdWVzSG9sZGVyOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQmx1ck1hc2tGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5UYWJsZU1hc2tGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZlbG9jaXR5VHJhY2tlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkxpbmVhckludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cy5SZW1vdGVWaWV3OworCitAUmVtb3RlVmlldworLyoqCisgKiBBIHZpZXcgdGhhdCBkaXNwbGF5cyBpdHMgY2hpbGRyZW4gaW4gYSBzdGFjayBhbmQgYWxsb3dzIHVzZXJzIHRvIGRpc2NyZXRlbHkgc3dpcGUKKyAqIHRocm91Z2ggdGhlIGNoaWxkcmVuLgorICovCitwdWJsaWMgY2xhc3MgU3RhY2tWaWV3IGV4dGVuZHMgQWRhcHRlclZpZXdBbmltYXRvciB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFHID0gIlN0YWNrVmlldyI7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGFuaW1hdGlvbiBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT04gPSA0MDA7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgTUlOSU1VTV9BTklNQVRJT05fRFVSQVRJT04gPSA1MDsKKworICAgIC8qKgorICAgICAqIFBhcmFtZXRlcnMgZWZmZWN0aW5nIHRoZSBwZXJzcGVjdGl2ZSB2aXN1YWxzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgUEVSU1BFQ1RJVkVfU0hJRlRfRkFDVE9SID0gMC4xMmY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgUEVSU1BFQ1RJVkVfU0NBTEVfRkFDVE9SID0gMC4zNWY7CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnQgdGhlIHR3byBwb3NzaWJsZSBzdGFjayBtb2Rlcywgb25lIHdoZXJlIGl0ZW1zIHNsaWRlIHVwLCBhbmQgdGhlIG90aGVyCisgICAgICogd2hlcmUgaXRlbXMgc2xpZGUgZG93bi4gVGhlIHBlcnNwZWN0aXZlIGlzIGFsc28gaW52ZXJ0ZWQgYmV0d2VlbiB0aGVzZSB0d28gbW9kZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElURU1TX1NMSURFX1VQID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVRFTVNfU0xJREVfRE9XTiA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGVzZSBzcGVjaWZ5IHRoZSBkaWZmZXJlbnQgZ2VzdHVyZSBzdGF0ZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VTVFVSRV9OT05FID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VTVFVSRV9TTElERV9VUCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFU1RVUkVfU0xJREVfRE9XTiA9IDI7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgaG93IGZhciB5b3UgbmVlZCB0byBzd2lwZSAodXAgb3IgZG93bikgYmVmb3JlIGl0CisgICAgICogd2lsbCBiZSBjb25zaWRlciBhIGNvbXBsZXRlZCBnZXN0dXJlIHdoZW4geW91IGxpZnQgeW91ciBmaW5nZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBTV0lQRV9USFJFU0hPTERfUkFUSU8gPSAwLjM1ZjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBTTElERV9VUF9SQVRJTyA9IDAuN2Y7CisKKyAgICAvKioKKyAgICAgKiBTZW50aW5lbCB2YWx1ZSBmb3Igbm8gY3VycmVudCBhY3RpdmUgcG9pbnRlci4KKyAgICAgKiBVc2VkIGJ5IHtAbGluayAjbUFjdGl2ZVBvaW50ZXJJZH0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUE9JTlRFUiA9IC0xOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGFjdGl2ZSB2aWV3cyBpbiB0aGUgc3RhY2suIE9uZSBmZXdlciB2aWV3IGlzIGFjdHVhbGx5IHZpc2libGUsIGFzIG9uZSBpcyBoaWRkZW4uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9BQ1RJVkVfVklFV1MgPSA1OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZSQU1FX1BBRERJTkcgPSA0OworCisgICAgLyoqCisgICAgICogVGhlc2UgdmFyaWFibGVzIGFyZSBhbGwgcmVsYXRlZCB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiB0b3VjaCBpbnRlcmFjdGlvbgorICAgICAqIHdpdGggdGhlIHN0YWNrCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtSW5pdGlhbFk7CisgICAgcHJpdmF0ZSBmbG9hdCBtSW5pdGlhbFg7CisgICAgcHJpdmF0ZSBpbnQgbUFjdGl2ZVBvaW50ZXJJZDsKKyAgICBwcml2YXRlIGludCBtWVZlbG9jaXR5ID0gMDsKKyAgICBwcml2YXRlIGludCBtU3dpcGVHZXN0dXJlVHlwZSA9IEdFU1RVUkVfTk9ORTsKKyAgICBwcml2YXRlIGludCBtU2xpZGVBbW91bnQ7CisgICAgcHJpdmF0ZSBpbnQgbVN3aXBlVGhyZXNob2xkOworICAgIHByaXZhdGUgaW50IG1Ub3VjaFNsb3A7CisgICAgcHJpdmF0ZSBpbnQgbU1heGltdW1WZWxvY2l0eTsKKyAgICBwcml2YXRlIFZlbG9jaXR5VHJhY2tlciBtVmVsb2NpdHlUcmFja2VyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgSG9sb2dyYXBoaWNIZWxwZXIgc0hvbG9ncmFwaGljSGVscGVyOworICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1IaWdobGlnaHQ7CisgICAgcHJpdmF0ZSBTdGFja1NsaWRlciBtU3RhY2tTbGlkZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1GaXJzdExheW91dEhhcHBlbmVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUFuY2VzdG9yQ29udGFpbmluZ0FsbENoaWxkcmVuID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBtQW5jZXN0b3JIZWlnaHQgPSAwOworICAgIHByaXZhdGUgaW50IG1TdGFja01vZGU7CisgICAgcHJpdmF0ZSBpbnQgbUZyYW1lUGFkZGluZzsKKworICAgIHB1YmxpYyBTdGFja1ZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBpbml0U3RhY2tWaWV3KCk7CisgICAgfQorCisgICAgcHVibGljIFN0YWNrVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIGluaXRTdGFja1ZpZXcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFN0YWNrVmlldygpIHsKKyAgICAgICAgY29uZmlndXJlVmlld0FuaW1hdG9yKE5VTV9BQ1RJVkVfVklFV1MsIE5VTV9BQ1RJVkVfVklFV1MgLSAyKTsKKyAgICAgICAgc2V0U3RhdGljVHJhbnNmb3JtYXRpb25zRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgZmluYWwgVmlld0NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IFZpZXdDb25maWd1cmF0aW9uLmdldChnZXRDb250ZXh0KCkpOworICAgICAgICBtVG91Y2hTbG9wID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRUb3VjaFNsb3AoKTsKKyAgICAgICAgbU1heGltdW1WZWxvY2l0eSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWF4aW11bUZsaW5nVmVsb2NpdHkoKTsKKyAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUjsKKworICAgICAgICBtSGlnaGxpZ2h0ID0gbmV3IEltYWdlVmlldyhnZXRDb250ZXh0KCkpOworICAgICAgICBtSGlnaGxpZ2h0LnNldExheW91dFBhcmFtcyhuZXcgTGF5b3V0UGFyYW1zKG1IaWdobGlnaHQpKTsKKyAgICAgICAgYWRkVmlld0luTGF5b3V0KG1IaWdobGlnaHQsIC0xLCBuZXcgTGF5b3V0UGFyYW1zKG1IaWdobGlnaHQpKTsKKyAgICAgICAgbVN0YWNrU2xpZGVyID0gbmV3IFN0YWNrU2xpZGVyKCk7CisKKyAgICAgICAgaWYgKHNIb2xvZ3JhcGhpY0hlbHBlciA9PSBudWxsKSB7CisgICAgICAgICAgICBzSG9sb2dyYXBoaWNIZWxwZXIgPSBuZXcgSG9sb2dyYXBoaWNIZWxwZXIobUNvbnRleHQpOworICAgICAgICB9CisgICAgICAgIHNldENsaXBDaGlsZHJlbihmYWxzZSk7CisgICAgICAgIHNldENsaXBUb1BhZGRpbmcoZmFsc2UpOworCisgICAgICAgIC8vIFRoaXMgc2V0cyB0aGUgZm9ybSBvZiB0aGUgU3RhY2tWaWV3LCB3aGljaCBpcyBjdXJyZW50bHkgdG8gaGF2ZSB0aGUgcGVyc3BlY3RpdmUtc2hpZnRlZAorICAgICAgICAvLyB2aWV3cyBhYm92ZSB0aGUgYWN0aXZlIHZpZXcsIGFuZCBoYXZlIGl0ZW1zIHNsaWRlIGRvd24gd2hlbiBzbGlkaW5nIG91dC4gVGhlIG9wcG9zaXRlIGlzCisgICAgICAgIC8vIGF2YWlsYWJsZSBieSB1c2luZyBJVEVNU19TTElERV9VUC4KKyAgICAgICAgbVN0YWNrTW9kZSA9IElURU1TX1NMSURFX0RPV047CisKKyAgICAgICAgLy8gVGhpcyBpcyBhIGZsYWcgdG8gaW5kaWNhdGUgdGhlIHRoZSBzdGFjayBpcyBsb2FkaW5nIGZvciB0aGUgZmlyc3QgdGltZQorICAgICAgICBtV2hpY2hDaGlsZCA9IC0xOworCisgICAgICAgIC8vIEFkanVzdCB0aGUgZnJhbWUgcGFkZGluZyBiYXNlZCBvbiB0aGUgZGVuc2l0eSwgc2luY2UgdGhlIGhpZ2hsaWdodCBjaGFuZ2VzIGJhc2VkCisgICAgICAgIC8vIG9uIHRoZSBkZW5zaXR5CisgICAgICAgIGZpbmFsIGZsb2F0IGRlbnNpdHkgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHk7CisgICAgICAgIG1GcmFtZVBhZGRpbmcgPSAoaW50KSBNYXRoLmNlaWwoZGVuc2l0eSAqIEZSQU1FX1BBRERJTkcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFuaW1hdGUgdGhlIHZpZXdzIGJldHdlZW4gZGlmZmVyZW50IHJlbGF0aXZlIGluZGV4ZXMgd2l0aGluIHRoZSB7QGxpbmsgQWRhcHRlclZpZXdBbmltYXRvcn0KKyAgICAgKi8KKyAgICB2b2lkIGFuaW1hdGVWaWV3Rm9yVHJhbnNpdGlvbihpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgVmlldyB2aWV3KSB7CisgICAgICAgIGlmIChmcm9tSW5kZXggPT0gLTEgJiYgdG9JbmRleCA9PSAwKSB7CisgICAgICAgICAgICAvLyBGYWRlIGl0ZW0gaW4KKyAgICAgICAgICAgIGlmICh2aWV3LmdldEFscGhhKCkgPT0gMSkgeworICAgICAgICAgICAgICAgIHZpZXcuc2V0QWxwaGEoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aWV3LnNldFZpc2liaWxpdHkoVklTSUJMRSk7CisKKyAgICAgICAgICAgIE9iamVjdEFuaW1hdG9yPEZsb2F0PiBmYWRlSW4gPSBuZXcgT2JqZWN0QW5pbWF0b3I8RmxvYXQ+KERFRkFVTFRfQU5JTUFUSU9OX0RVUkFUSU9OLAorICAgICAgICAgICAgICAgICAgICB2aWV3LCAiYWxwaGEiLCB2aWV3LmdldEFscGhhKCksIDEuMGYpOworICAgICAgICAgICAgZmFkZUluLnN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSBpZiAoZnJvbUluZGV4ID09IG1OdW1BY3RpdmVWaWV3cyAtIDEgJiYgdG9JbmRleCA9PSBtTnVtQWN0aXZlVmlld3MgLSAyKSB7CisgICAgICAgICAgICAvLyBTbGlkZSBpdGVtIGluCisgICAgICAgICAgICB2aWV3LnNldFZpc2liaWxpdHkoVklTSUJMRSk7CisKKyAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IChMYXlvdXRQYXJhbXMpIHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICBpbnQgZHVyYXRpb24gPSBNYXRoLnJvdW5kKG1TdGFja1NsaWRlci5nZXREdXJhdGlvbkZvck5ldXRyYWxQb3NpdGlvbihtWVZlbG9jaXR5KSk7CisKKyAgICAgICAgICAgIFN0YWNrU2xpZGVyIGFuaW1hdGlvblNsaWRlciA9IG5ldyBTdGFja1NsaWRlcihtU3RhY2tTbGlkZXIpOworICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+IHNsaWRlSW5ZID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PigiWVByb2dyZXNzIiwgMC4wZik7CisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4gc2xpZGVJblggPQorICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+KCJYUHJvZ3Jlc3MiLCAwLjBmKTsKKyAgICAgICAgICAgIE9iamVjdEFuaW1hdG9yIHBhID0gbmV3IE9iamVjdEFuaW1hdG9yKGR1cmF0aW9uLCBhbmltYXRpb25TbGlkZXIsCisgICAgICAgICAgICAgICAgICAgIHNsaWRlSW5YLCBzbGlkZUluWSk7CisgICAgICAgICAgICBwYS5zZXRJbnRlcnBvbGF0b3IobmV3IExpbmVhckludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgIHBhLnN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSBpZiAoZnJvbUluZGV4ID09IG1OdW1BY3RpdmVWaWV3cyAtIDIgJiYgdG9JbmRleCA9PSBtTnVtQWN0aXZlVmlld3MgLSAxKSB7CisgICAgICAgICAgICAvLyBTbGlkZSBpdGVtIG91dAorICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gKExheW91dFBhcmFtcykgdmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKworICAgICAgICAgICAgaW50IGR1cmF0aW9uID0gTWF0aC5yb3VuZChtU3RhY2tTbGlkZXIuZ2V0RHVyYXRpb25Gb3JPZmZzY3JlZW5Qb3NpdGlvbihtWVZlbG9jaXR5KSk7CisKKyAgICAgICAgICAgIFN0YWNrU2xpZGVyIGFuaW1hdGlvblNsaWRlciA9IG5ldyBTdGFja1NsaWRlcihtU3RhY2tTbGlkZXIpOworICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+IHNsaWRlT3V0WSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4oIllQcm9ncmVzcyIsIDEuMGYpOworICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+IHNsaWRlT3V0WCA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4oIlhQcm9ncmVzcyIsIDAuMGYpOworICAgICAgICAgICAgT2JqZWN0QW5pbWF0b3IgcGEgPSBuZXcgT2JqZWN0QW5pbWF0b3IoZHVyYXRpb24sIGFuaW1hdGlvblNsaWRlciwKKyAgICAgICAgICAgICAgICAgICBzbGlkZU91dFgsIHNsaWRlT3V0WSk7CisgICAgICAgICAgICBwYS5zZXRJbnRlcnBvbGF0b3IobmV3IExpbmVhckludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgIHBhLnN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSBpZiAoZnJvbUluZGV4ID09IC0xICYmIHRvSW5kZXggPT0gbU51bUFjdGl2ZVZpZXdzIC0gMSkgeworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgdmlldyB0aGF0IGlzICJ3YWl0aW5nIGluIHRoZSB3aW5ncyIgaXMgaW52aXNpYmxlCisgICAgICAgICAgICB2aWV3LnNldEFscGhhKDAuMGYpOworICAgICAgICAgICAgdmlldy5zZXRWaXNpYmlsaXR5KElOVklTSUJMRSk7CisgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSAoTGF5b3V0UGFyYW1zKSB2aWV3LmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgbHAuc2V0VmVydGljYWxPZmZzZXQoLW1TbGlkZUFtb3VudCk7CisgICAgICAgIH0gZWxzZSBpZiAodG9JbmRleCA9PSAtMSkgeworICAgICAgICAgICAgLy8gRmFkZSBpdGVtIG91dAorICAgICAgICAgICAgT2JqZWN0QW5pbWF0b3I8RmxvYXQ+IGZhZGVPdXQgPSBuZXcgT2JqZWN0QW5pbWF0b3I8RmxvYXQ+CisgICAgICAgICAgICAgICAgICAgIChERUZBVUxUX0FOSU1BVElPTl9EVVJBVElPTiwgdmlldywgImFscGhhIiwgdmlldy5nZXRBbHBoYSgpLCAwLjBmKTsKKyAgICAgICAgICAgIGZhZGVPdXQuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEltcGxlbWVudCB0aGUgZmFrZWQgcGVyc3BlY3RpdmUKKyAgICAgICAgaWYgKHRvSW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgIHRyYW5zZm9ybVZpZXdBdEluZGV4KHRvSW5kZXgsIHZpZXcpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRyYW5zZm9ybVZpZXdBdEluZGV4KGludCBpbmRleCwgVmlldyB2aWV3KSB7CisgICAgICAgIGZsb2F0IG1heFBlcnBlY3RpdmVTaGlmdCA9IG1NZWFzdXJlZEhlaWdodCAqIFBFUlNQRUNUSVZFX1NISUZUX0ZBQ1RPUjsKKworICAgICAgICBpZiAoaW5kZXggPT0gbU51bUFjdGl2ZVZpZXdzIC0xKSBpbmRleC0tOworCisgICAgICAgIGZsb2F0IHIgPSAoaW5kZXggKiAxLjBmKSAvIChtTnVtQWN0aXZlVmlld3MgLSAyKTsKKworICAgICAgICBmbG9hdCBzY2FsZSA9IDEgLSBQRVJTUEVDVElWRV9TQ0FMRV9GQUNUT1IgKiAoMSAtIHIpOworICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4gc2NhbGVYID0gbmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0Pigic2NhbGVYIiwgc2NhbGUpOworICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4gc2NhbGVZID0gbmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0Pigic2NhbGVZIiwgc2NhbGUpOworCisgICAgICAgIHIgPSAoZmxvYXQpIE1hdGgucG93KHIsIDIpOworCisgICAgICAgIGludCBzdGFja0RpcmVjdGlvbiA9IChtU3RhY2tNb2RlID09IElURU1TX1NMSURFX1VQKSA/IDEgOiAtMTsKKyAgICAgICAgZmxvYXQgcGVyc3BlY3RpdmVUcmFuc2xhdGlvbiA9IC1zdGFja0RpcmVjdGlvbiAqIHIgKiBtYXhQZXJwZWN0aXZlU2hpZnQ7CisgICAgICAgIGZsb2F0IHNjYWxlU2hpZnRDb3JyZWN0aW9uID0gc3RhY2tEaXJlY3Rpb24gKiAoMSAtIHNjYWxlKSAqCisgICAgICAgICAgICAgICAgKG1NZWFzdXJlZEhlaWdodCAqICgxIC0gUEVSU1BFQ1RJVkVfU0hJRlRfRkFDVE9SKSAvIDIuMGYpOworICAgICAgICBmbG9hdCB0cmFuc1kgPSBwZXJzcGVjdGl2ZVRyYW5zbGF0aW9uICsgc2NhbGVTaGlmdENvcnJlY3Rpb247CisKKyAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+IHRyYW5zbGF0aW9uWSA9CisgICAgICAgICAgICAgICAgbmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PigidHJhbnNsYXRpb25ZIiwgdHJhbnNZKTsKKyAgICAgICAgT2JqZWN0QW5pbWF0b3IgcGEgPSBuZXcgT2JqZWN0QW5pbWF0b3IoMTAwLCB2aWV3LCBzY2FsZVgsIHNjYWxlWSwgdHJhbnNsYXRpb25ZKTsKKyAgICAgICAgcGEuc3RhcnQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ2hpbGRUcmFuc2Zvcm1zKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1BY3RpdmVWaWV3cyAtIDE7IGkrKykgeworICAgICAgICAgICAgVmlldyB2ID0gZ2V0Vmlld0F0UmVsYXRpdmVJbmRleChpKTsKKyAgICAgICAgICAgIGlmICh2ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm1WaWV3QXRJbmRleChpLCB2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEZyYW1lTGF5b3V0IGdldEZyYW1lRm9yQ2hpbGQoKSB7CisgICAgICAgIEZyYW1lTGF5b3V0IGZsID0gbmV3IEZyYW1lTGF5b3V0KG1Db250ZXh0KTsKKyAgICAgICAgZmwuc2V0UGFkZGluZyhtRnJhbWVQYWRkaW5nLCBtRnJhbWVQYWRkaW5nLCBtRnJhbWVQYWRkaW5nLCBtRnJhbWVQYWRkaW5nKTsKKyAgICAgICAgcmV0dXJuIGZsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGx5IGFueSBuZWNlc3NhcnkgdHJhbmZvcm1zIGZvciB0aGUgY2hpbGQgdGhhdCBpcyBiZWluZyBhZGRlZC4KKyAgICAgKi8KKyAgICB2b2lkIGFwcGx5VHJhbnNmb3JtRm9yQ2hpbGRBdEluZGV4KFZpZXcgY2hpbGQsIGludCByZWxhdGl2ZUluZGV4KSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2hEcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgc3VwZXIuZGlzcGF0Y2hEcmF3KGNhbnZhcyk7CisgICAgfQorCisgICAgLy8gVE9ETzogcmlnaHQgbm93LCB0aGlzIGNvZGUgd2Fsa3MgdXAgdGhlIGhpZXJhcmNoeSBhcyBmYXIgYXMgbmVlZGVkIGFuZCBkaXNhYmxlcyBjbGlwcGluZworICAgIC8vIHNvIHRoYXQgdGhlIHN0YWNrJ3MgY2hpbGRyZW4gY2FuIGRyYXcgb3V0c2lkZSBvZiB0aGUgc3RhY2sncyBib3VuZHMuIFRoaXMgaXMgZmluZSB3aXRoaW4KKyAgICAvLyB0aGUgY29udGV4dCBvZiB3aWRnZXRzIGluIHRoZSBsYXVuY2hlciwgYnV0IGlzIGRlc3RydWN0aXZlIGluIGdlbmVyYWwsIGFzIHRoZSBjbGlwcGluZworICAgIC8vIHZhbHVlcyBhcmUgbm90IGJlaW5nIHJlc2V0LiBGb3IgdGhpcyB0byBiZSBhIGZ1bGwgZnJhbWV3b3JrIGxldmVsIHdpZGdldCwgd2Ugd2lsbCBuZWVkCisgICAgLy8gZnJhbWV3b3JrIGxldmVsIHN1cHBvcnQgZm9yIGRyYXdpbmcgb3V0c2lkZSBvZiBhIHBhcmVudCdzIGJvdW5kcy4KKyAgICBwcml2YXRlIHZvaWQgZGlzYWJsZVBhcmVudGFsQ2xpcHBpbmcoKSB7CisgICAgICAgIGlmIChtQW5jZXN0b3JDb250YWluaW5nQWxsQ2hpbGRyZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgVmlld0dyb3VwIHZnID0gdGhpczsKKyAgICAgICAgICAgIHdoaWxlICh2Zy5nZXRQYXJlbnQoKSAhPSBudWxsICYmIHZnLmdldFBhcmVudCgpIGluc3RhbmNlb2YgVmlld0dyb3VwKSB7CisgICAgICAgICAgICAgICAgaWYgKHZnID09IG1BbmNlc3RvckNvbnRhaW5pbmdBbGxDaGlsZHJlbikgYnJlYWs7CisgICAgICAgICAgICAgICAgdmcgPSAoVmlld0dyb3VwKSB2Zy5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICB2Zy5zZXRDbGlwQ2hpbGRyZW4oZmFsc2UpOworICAgICAgICAgICAgICAgIHZnLnNldENsaXBUb1BhZGRpbmcoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uTGF5b3V0KCkgeworICAgICAgICBpZiAoIW1GaXJzdExheW91dEhhcHBlbmVkKSB7CisgICAgICAgICAgICBtU2xpZGVBbW91bnQgPSBNYXRoLnJvdW5kKFNMSURFX1VQX1JBVElPICogZ2V0TWVhc3VyZWRIZWlnaHQoKSk7CisgICAgICAgICAgICB1cGRhdGVDaGlsZFRyYW5zZm9ybXMoKTsKKyAgICAgICAgICAgIG1Td2lwZVRocmVzaG9sZCA9IE1hdGgucm91bmQoU1dJUEVfVEhSRVNIT0xEX1JBVElPICogbVNsaWRlQW1vdW50KTsKKyAgICAgICAgICAgIG1GaXJzdExheW91dEhhcHBlbmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uSW50ZXJjZXB0VG91Y2hFdmVudChNb3Rpb25FdmVudCBldikgeworICAgICAgICBpbnQgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIHN3aXRjaChhY3Rpb24gJiBNb3Rpb25FdmVudC5BQ1RJT05fTUFTSykgeworICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjogeworICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlUG9pbnRlcklkID09IElOVkFMSURfUE9JTlRFUikgeworICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbFggPSBldi5nZXRYKCk7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0aWFsWSA9IGV2LmdldFkoKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IGV2LmdldFBvaW50ZXJJZCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOiB7CisgICAgICAgICAgICAgICAgaW50IHBvaW50ZXJJbmRleCA9IGV2LmZpbmRQb2ludGVySW5kZXgobUFjdGl2ZVBvaW50ZXJJZCk7CisgICAgICAgICAgICAgICAgaWYgKHBvaW50ZXJJbmRleCA9PSBJTlZBTElEX1BPSU5URVIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gZGF0YSBmb3Igb3VyIHByaW1hcnkgcG9pbnRlciwgdGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBsb2cgaXQKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXJyb3I6IE5vIGRhdGEgZm9yIG91ciBwcmltYXJ5IHBvaW50ZXIuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmxvYXQgbmV3WSA9IGV2LmdldFkocG9pbnRlckluZGV4KTsKKyAgICAgICAgICAgICAgICBmbG9hdCBkZWx0YVkgPSBuZXdZIC0gbUluaXRpYWxZOworCisgICAgICAgICAgICAgICAgYmVnaW5HZXN0dXJlSWZOZWVkZWQoZGVsdGFZKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVA6IHsKKyAgICAgICAgICAgICAgICBvblNlY29uZGFyeVBvaW50ZXJVcChldik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDoKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDogeworICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7CisgICAgICAgICAgICAgICAgbVN3aXBlR2VzdHVyZVR5cGUgPSBHRVNUVVJFX05PTkU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbVN3aXBlR2VzdHVyZVR5cGUgIT0gR0VTVFVSRV9OT05FOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBiZWdpbkdlc3R1cmVJZk5lZWRlZChmbG9hdCBkZWx0YVkpIHsKKyAgICAgICAgaWYgKChpbnQpIE1hdGguYWJzKGRlbHRhWSkgPiBtVG91Y2hTbG9wICYmIG1Td2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfTk9ORSkgeworICAgICAgICAgICAgaW50IHN3aXBlR2VzdHVyZVR5cGUgPSBkZWx0YVkgPCAwID8gR0VTVFVSRV9TTElERV9VUCA6IEdFU1RVUkVfU0xJREVfRE9XTjsKKyAgICAgICAgICAgIGNhbmNlbExvbmdQcmVzcygpOworICAgICAgICAgICAgcmVxdWVzdERpc2FsbG93SW50ZXJjZXB0VG91Y2hFdmVudCh0cnVlKTsKKworICAgICAgICAgICAgaW50IGFjdGl2ZUluZGV4OworICAgICAgICAgICAgaWYgKG1TdGFja01vZGUgPT0gSVRFTVNfU0xJREVfVVApIHsKKyAgICAgICAgICAgICAgICBhY3RpdmVJbmRleCA9IChzd2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfRE9XTikgPworICAgICAgICAgICAgICAgICAgICAgICAgbU51bUFjdGl2ZVZpZXdzIC0gMSA6IG1OdW1BY3RpdmVWaWV3cyAtIDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFjdGl2ZUluZGV4ID0gKHN3aXBlR2VzdHVyZVR5cGUgPT0gR0VTVFVSRV9TTElERV9ET1dOKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBtTnVtQWN0aXZlVmlld3MgLSAyIDogbU51bUFjdGl2ZVZpZXdzIC0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1BZGFwdGVyID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgaWYgKG1Mb29wVmlld3MpIHsKKyAgICAgICAgICAgICAgICBtU3RhY2tTbGlkZXIuc2V0TW9kZShTdGFja1NsaWRlci5OT1JNQUxfTU9ERSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1DdXJyZW50V2luZG93U3RhcnRVbmJvdW5kZWQgKyBhY3RpdmVJbmRleCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbVN0YWNrU2xpZGVyLnNldE1vZGUoU3RhY2tTbGlkZXIuQkVHSU5OSU5HX09GX1NUQUNLX01PREUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtQ3VycmVudFdpbmRvd1N0YXJ0VW5ib3VuZGVkICsgYWN0aXZlSW5kZXggPT0gbUFkYXB0ZXIuZ2V0Q291bnQoKSkgeworICAgICAgICAgICAgICAgIGFjdGl2ZUluZGV4LS07CisgICAgICAgICAgICAgICAgbVN0YWNrU2xpZGVyLnNldE1vZGUoU3RhY2tTbGlkZXIuRU5EX09GX1NUQUNLX01PREUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU3RhY2tTbGlkZXIuc2V0TW9kZShTdGFja1NsaWRlci5OT1JNQUxfTU9ERSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFZpZXcgdiA9IGdldFZpZXdBdFJlbGF0aXZlSW5kZXgoYWN0aXZlSW5kZXgpOworICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICBtSGlnaGxpZ2h0LnNldEltYWdlQml0bWFwKHNIb2xvZ3JhcGhpY0hlbHBlci5jcmVhdGVPdXRsaW5lKHYpKTsKKyAgICAgICAgICAgIG1IaWdobGlnaHQuc2V0Um90YXRpb24odi5nZXRSb3RhdGlvbigpKTsKKyAgICAgICAgICAgIG1IaWdobGlnaHQuc2V0VHJhbnNsYXRpb25ZKHYuZ2V0VHJhbnNsYXRpb25ZKCkpOworICAgICAgICAgICAgbUhpZ2hsaWdodC5icmluZ1RvRnJvbnQoKTsKKyAgICAgICAgICAgIHYuYnJpbmdUb0Zyb250KCk7CisgICAgICAgICAgICBtU3RhY2tTbGlkZXIuc2V0Vmlldyh2KTsKKworICAgICAgICAgICAgaWYgKHN3aXBlR2VzdHVyZVR5cGUgPT0gR0VTVFVSRV9TTElERV9ET1dOKQorICAgICAgICAgICAgICAgIHYuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKworICAgICAgICAgICAgLy8gV2Ugb25seSByZWdpc3RlciB0aGlzIGdlc3R1cmUgaWYgd2UndmUgbWFkZSBpdCB0aGlzIGZhciB3aXRob3V0IGEgcHJvYmxlbQorICAgICAgICAgICAgbVN3aXBlR2VzdHVyZVR5cGUgPSBzd2lwZUdlc3R1cmVUeXBlOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIGludCBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgaW50IHBvaW50ZXJJbmRleCA9IGV2LmZpbmRQb2ludGVySW5kZXgobUFjdGl2ZVBvaW50ZXJJZCk7CisgICAgICAgIGlmIChwb2ludGVySW5kZXggPT0gSU5WQUxJRF9QT0lOVEVSKSB7CisgICAgICAgICAgICAvLyBubyBkYXRhIGZvciBvdXIgcHJpbWFyeSBwb2ludGVyLCB0aGlzIHNob3VsZG4ndCBoYXBwZW4sIGxvZyBpdAorICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXJyb3I6IE5vIGRhdGEgZm9yIG91ciBwcmltYXJ5IHBvaW50ZXIuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBuZXdZID0gZXYuZ2V0WShwb2ludGVySW5kZXgpOworICAgICAgICBmbG9hdCBuZXdYID0gZXYuZ2V0WChwb2ludGVySW5kZXgpOworICAgICAgICBmbG9hdCBkZWx0YVkgPSBuZXdZIC0gbUluaXRpYWxZOworICAgICAgICBmbG9hdCBkZWx0YVggPSBuZXdYIC0gbUluaXRpYWxYOworICAgICAgICBpZiAobVZlbG9jaXR5VHJhY2tlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gVmVsb2NpdHlUcmFja2VyLm9idGFpbigpOworICAgICAgICB9CisgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuYWRkTW92ZW1lbnQoZXYpOworCisgICAgICAgIHN3aXRjaCAoYWN0aW9uICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0spIHsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6IHsKKyAgICAgICAgICAgICAgICBiZWdpbkdlc3R1cmVJZk5lZWRlZChkZWx0YVkpOworCisgICAgICAgICAgICAgICAgZmxvYXQgcnggPSBkZWx0YVggLyAobVNsaWRlQW1vdW50ICogMS4wZik7CisgICAgICAgICAgICAgICAgaWYgKG1Td2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfRE9XTikgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCByID0gKGRlbHRhWSAtIG1Ub3VjaFNsb3AgKiAxLjBmKSAvIG1TbGlkZUFtb3VudCAqIDEuMGY7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhY2tNb2RlID09IElURU1TX1NMSURFX0RPV04pIHIgPSAxIC0gcjsKKyAgICAgICAgICAgICAgICAgICAgbVN0YWNrU2xpZGVyLnNldFlQcm9ncmVzcygxIC0gcik7CisgICAgICAgICAgICAgICAgICAgIG1TdGFja1NsaWRlci5zZXRYUHJvZ3Jlc3MocngpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Td2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfVVApIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgciA9IC0oZGVsdGFZICsgbVRvdWNoU2xvcCAqIDEuMGYpIC8gbVNsaWRlQW1vdW50ICogMS4wZjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGFja01vZGUgPT0gSVRFTVNfU0xJREVfRE9XTikgciA9IDEgLSByOworICAgICAgICAgICAgICAgICAgICBtU3RhY2tTbGlkZXIuc2V0WVByb2dyZXNzKHIpOworICAgICAgICAgICAgICAgICAgICBtU3RhY2tTbGlkZXIuc2V0WFByb2dyZXNzKHJ4KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6IHsKKyAgICAgICAgICAgICAgICBoYW5kbGVQb2ludGVyVXAoZXYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUDogeworICAgICAgICAgICAgICAgIG9uU2Vjb25kYXJ5UG9pbnRlclVwKGV2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDogeworICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7CisgICAgICAgICAgICAgICAgbVN3aXBlR2VzdHVyZVR5cGUgPSBHRVNUVVJFX05PTkU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBSZWN0IHRvdWNoUmVjdCA9IG5ldyBSZWN0KCk7CisgICAgcHJpdmF0ZSB2b2lkIG9uU2Vjb25kYXJ5UG9pbnRlclVwKE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIGZpbmFsIGludCBhY3RpdmVQb2ludGVySW5kZXggPSBldi5nZXRBY3Rpb25JbmRleCgpOworICAgICAgICBmaW5hbCBpbnQgcG9pbnRlcklkID0gZXYuZ2V0UG9pbnRlcklkKGFjdGl2ZVBvaW50ZXJJbmRleCk7CisgICAgICAgIGlmIChwb2ludGVySWQgPT0gbUFjdGl2ZVBvaW50ZXJJZCkgeworCisgICAgICAgICAgICBpbnQgYWN0aXZlVmlld0luZGV4ID0gKG1Td2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfRE9XTikgPyBtTnVtQWN0aXZlVmlld3MgLSAxCisgICAgICAgICAgICAgICAgICAgIDogbU51bUFjdGl2ZVZpZXdzIC0gMjsKKworICAgICAgICAgICAgVmlldyB2ID0gZ2V0Vmlld0F0UmVsYXRpdmVJbmRleChhY3RpdmVWaWV3SW5kZXgpOworICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICAvLyBPdXIgcHJpbWFyeSBwb2ludGVyIGhhcyBnb25lIHVwIC0tIGxldCdzIHNlZSBpZiB3ZSBjYW4gZmluZAorICAgICAgICAgICAgLy8gYW5vdGhlciBwb2ludGVyIG9uIHRoZSB2aWV3LiBJZiBzbywgdGhlbiB3ZSBzaG91bGQgcmVwbGFjZQorICAgICAgICAgICAgLy8gb3VyIHByaW1hcnkgcG9pbnRlciB3aXRoIHRoaXMgbmV3IHBvaW50ZXIgYW5kIGFkanVzdCB0aGluZ3MKKyAgICAgICAgICAgIC8vIHNvIHRoYXQgdGhlIHZpZXcgZG9lc24ndCBqdW1wCisgICAgICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZXYuZ2V0UG9pbnRlckNvdW50KCk7IGluZGV4KyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gYWN0aXZlUG9pbnRlckluZGV4KSB7CisKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCA9IGV2LmdldFgoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBmbG9hdCB5ID0gZXYuZ2V0WShpbmRleCk7CisKKyAgICAgICAgICAgICAgICAgICAgdG91Y2hSZWN0LnNldCh2LmdldExlZnQoKSwgdi5nZXRUb3AoKSwgdi5nZXRSaWdodCgpLCB2LmdldEJvdHRvbSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRvdWNoUmVjdC5jb250YWlucyhNYXRoLnJvdW5kKHgpLCBNYXRoLnJvdW5kKHkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgb2xkWCA9IGV2LmdldFgoYWN0aXZlUG9pbnRlckluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG9sZFkgPSBldi5nZXRZKGFjdGl2ZVBvaW50ZXJJbmRleCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkanVzdCBvdXIgZnJhbWUgb2YgcmVmZXJlbmNlIHRvIGF2b2lkIGEganVtcAorICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxZICs9ICh5IC0gb2xkWSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbFggKz0gKHggLSBvbGRYKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IGV2LmdldFBvaW50ZXJJZChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVZlbG9jaXR5VHJhY2tlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2ssIHdlJ3JlIGdvb2QsIHdlIGZvdW5kIGEgbmV3IHBvaW50ZXIgd2hpY2ggaXMgdG91Y2hpbmcgdGhlIGFjdGl2ZSB2aWV3CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpZiB3ZSBtYWRlIGl0IHRoaXMgZmFyLCBpdCBtZWFucyB3ZSBkaWRuJ3QgZmluZCBhIHNhdGlzZmFjdG9yeSBuZXcgcG9pbnRlciA6KCwKKyAgICAgICAgICAgIC8vIHNvIGVuZCB0aGUgZ2VzdHVyZQorICAgICAgICAgICAgaGFuZGxlUG9pbnRlclVwKGV2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVQb2ludGVyVXAoTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgaW50IHBvaW50ZXJJbmRleCA9IGV2LmZpbmRQb2ludGVySW5kZXgobUFjdGl2ZVBvaW50ZXJJZCk7CisgICAgICAgIGZsb2F0IG5ld1kgPSBldi5nZXRZKHBvaW50ZXJJbmRleCk7CisgICAgICAgIGludCBkZWx0YVkgPSAoaW50KSAobmV3WSAtIG1Jbml0aWFsWSk7CisKKyAgICAgICAgaWYgKG1WZWxvY2l0eVRyYWNrZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5jb21wdXRlQ3VycmVudFZlbG9jaXR5KDEwMDAsIG1NYXhpbXVtVmVsb2NpdHkpOworICAgICAgICAgICAgbVlWZWxvY2l0eSA9IChpbnQpIG1WZWxvY2l0eVRyYWNrZXIuZ2V0WVZlbG9jaXR5KG1BY3RpdmVQb2ludGVySWQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1WZWxvY2l0eVRyYWNrZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7CisgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZWx0YVkgPiBtU3dpcGVUaHJlc2hvbGQgJiYgbVN3aXBlR2VzdHVyZVR5cGUgPT0gR0VTVFVSRV9TTElERV9ET1dOCisgICAgICAgICAgICAgICAgJiYgbVN0YWNrU2xpZGVyLm1Nb2RlID09IFN0YWNrU2xpZGVyLk5PUk1BTF9NT0RFKSB7CisgICAgICAgICAgICAvLyBTd2lwZSB0aHJlc2hvbGQgZXhjZWVkZWQsIHN3aXBlIGRvd24KKyAgICAgICAgICAgIGlmIChtU3RhY2tNb2RlID09IElURU1TX1NMSURFX1VQKSB7CisgICAgICAgICAgICAgICAgc2hvd05leHQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2hvd1ByZXZpb3VzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSGlnaGxpZ2h0LmJyaW5nVG9Gcm9udCgpOworICAgICAgICB9IGVsc2UgaWYgKGRlbHRhWSA8IC1tU3dpcGVUaHJlc2hvbGQgJiYgbVN3aXBlR2VzdHVyZVR5cGUgPT0gR0VTVFVSRV9TTElERV9VUAorICAgICAgICAgICAgICAgICYmIG1TdGFja1NsaWRlci5tTW9kZSA9PSBTdGFja1NsaWRlci5OT1JNQUxfTU9ERSkgeworICAgICAgICAgICAgLy8gU3dpcGUgdGhyZXNob2xkIGV4Y2VlZGVkLCBzd2lwZSB1cAorICAgICAgICAgICAgaWYgKG1TdGFja01vZGUgPT0gSVRFTVNfU0xJREVfVVApIHsKKyAgICAgICAgICAgICAgICBzaG93UHJldmlvdXMoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2hvd05leHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUhpZ2hsaWdodC5icmluZ1RvRnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX1VQICkgeworICAgICAgICAgICAgLy8gRGlkbid0IHN3aXBlIHVwIGZhciBlbm91Z2gsIHNuYXAgYmFjayBkb3duCisgICAgICAgICAgICBpbnQgZHVyYXRpb247CisgICAgICAgICAgICBmbG9hdCBmaW5hbFlQcm9ncmVzcyA9IChtU3RhY2tNb2RlID09IElURU1TX1NMSURFX0RPV04pID8gMSA6IDA7CisgICAgICAgICAgICBpZiAobVN0YWNrTW9kZSA9PSBJVEVNU19TTElERV9VUCB8fCBtU3RhY2tTbGlkZXIubU1vZGUgIT0gU3RhY2tTbGlkZXIuTk9STUFMX01PREUpIHsKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IE1hdGgucm91bmQobVN0YWNrU2xpZGVyLmdldER1cmF0aW9uRm9yTmV1dHJhbFBvc2l0aW9uKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IE1hdGgucm91bmQobVN0YWNrU2xpZGVyLmdldER1cmF0aW9uRm9yT2Zmc2NyZWVuUG9zaXRpb24oKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0YWNrU2xpZGVyIGFuaW1hdGlvblNsaWRlciA9IG5ldyBTdGFja1NsaWRlcihtU3RhY2tTbGlkZXIpOworICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+IHNuYXBCYWNrWSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4oIllQcm9ncmVzcyIsIGZpbmFsWVByb2dyZXNzKTsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PiBzbmFwQmFja1ggPQorICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+KCJYUHJvZ3Jlc3MiLCAwLjBmKTsKKyAgICAgICAgICAgIE9iamVjdEFuaW1hdG9yIHBhID0gbmV3IE9iamVjdEFuaW1hdG9yKGR1cmF0aW9uLCBhbmltYXRpb25TbGlkZXIsCisgICAgICAgICAgICAgICAgICAgIHNuYXBCYWNrWCwgc25hcEJhY2tZKTsKKyAgICAgICAgICAgIHBhLnNldEludGVycG9sYXRvcihuZXcgTGluZWFySW50ZXJwb2xhdG9yKCkpOworICAgICAgICAgICAgcGEuc3RhcnQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX0RPV04pIHsKKyAgICAgICAgICAgIC8vIERpZG4ndCBzd2lwZSBkb3duIGZhciBlbm91Z2gsIHNuYXAgYmFjayB1cAorICAgICAgICAgICAgZmxvYXQgZmluYWxZUHJvZ3Jlc3MgPSAobVN0YWNrTW9kZSA9PSBJVEVNU19TTElERV9ET1dOKSA/IDAgOiAxOworICAgICAgICAgICAgaW50IGR1cmF0aW9uOworICAgICAgICAgICAgaWYgKG1TdGFja01vZGUgPT0gSVRFTVNfU0xJREVfRE9XTiB8fCBtU3RhY2tTbGlkZXIubU1vZGUgIT0gU3RhY2tTbGlkZXIuTk9STUFMX01PREUpIHsKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IE1hdGgucm91bmQobVN0YWNrU2xpZGVyLmdldER1cmF0aW9uRm9yTmV1dHJhbFBvc2l0aW9uKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IE1hdGgucm91bmQobVN0YWNrU2xpZGVyLmdldER1cmF0aW9uRm9yT2Zmc2NyZWVuUG9zaXRpb24oKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0YWNrU2xpZGVyIGFuaW1hdGlvblNsaWRlciA9IG5ldyBTdGFja1NsaWRlcihtU3RhY2tTbGlkZXIpOworICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+IHNuYXBCYWNrWSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4oIllQcm9ncmVzcyIsIGZpbmFsWVByb2dyZXNzKTsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PiBzbmFwQmFja1ggPQorICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+KCJYUHJvZ3Jlc3MiLCAwLjBmKTsKKyAgICAgICAgICAgIE9iamVjdEFuaW1hdG9yIHBhID0gbmV3IE9iamVjdEFuaW1hdG9yKGR1cmF0aW9uLCBhbmltYXRpb25TbGlkZXIsCisgICAgICAgICAgICAgICAgICAgIHNuYXBCYWNrWCwgc25hcEJhY2tZKTsKKyAgICAgICAgICAgIHBhLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOworICAgICAgICBtU3dpcGVHZXN0dXJlVHlwZSA9IEdFU1RVUkVfTk9ORTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFN0YWNrU2xpZGVyIHsKKyAgICAgICAgVmlldyBtVmlldzsKKyAgICAgICAgZmxvYXQgbVlQcm9ncmVzczsKKyAgICAgICAgZmxvYXQgbVhQcm9ncmVzczsKKworICAgICAgICBzdGF0aWMgZmluYWwgaW50IE5PUk1BTF9NT0RFID0gMDsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBCRUdJTk5JTkdfT0ZfU1RBQ0tfTU9ERSA9IDE7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgRU5EX09GX1NUQUNLX01PREUgPSAyOworCisgICAgICAgIGludCBtTW9kZSA9IE5PUk1BTF9NT0RFOworCisgICAgICAgIHB1YmxpYyBTdGFja1NsaWRlcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdGFja1NsaWRlcihTdGFja1NsaWRlciBjb3B5KSB7CisgICAgICAgICAgICBtVmlldyA9IGNvcHkubVZpZXc7CisgICAgICAgICAgICBtWVByb2dyZXNzID0gY29weS5tWVByb2dyZXNzOworICAgICAgICAgICAgbVhQcm9ncmVzcyA9IGNvcHkubVhQcm9ncmVzczsKKyAgICAgICAgICAgIG1Nb2RlID0gY29weS5tTW9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmxvYXQgY3ViaWMoZmxvYXQgcikgeworICAgICAgICAgICAgcmV0dXJuIChmbG9hdCkgKE1hdGgucG93KDIgKiByIC0gMSwgMykgKyAxKSAvIDIuMGY7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZsb2F0IGhpZ2hsaWdodEFscGhhSW50ZXJwb2xhdG9yKGZsb2F0IHIpIHsKKyAgICAgICAgICAgIGZsb2F0IHBpdm90ID0gMC40ZjsKKyAgICAgICAgICAgIGlmIChyIDwgcGl2b3QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMC44NWYgKiBjdWJpYyhyIC8gcGl2b3QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMC44NWYgKiBjdWJpYygxIC0gKHIgLSBwaXZvdCkgLyAoMSAtIHBpdm90KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZsb2F0IHZpZXdBbHBoYUludGVycG9sYXRvcihmbG9hdCByKSB7CisgICAgICAgICAgICBmbG9hdCBwaXZvdCA9IDAuM2Y7CisgICAgICAgICAgICBpZiAociA+IHBpdm90KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChyIC0gcGl2b3QpIC8gKDEgLSBwaXZvdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCByb3RhdGlvbkludGVycG9sYXRvcihmbG9hdCByKSB7CisgICAgICAgICAgICBmbG9hdCBwaXZvdCA9IDAuMmY7CisgICAgICAgICAgICBpZiAociA8IHBpdm90KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAociAtIHBpdm90KSAvICgxIC0gcGl2b3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRWaWV3KFZpZXcgdikgeworICAgICAgICAgICAgbVZpZXcgPSB2OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0WVByb2dyZXNzKGZsb2F0IHIpIHsKKyAgICAgICAgICAgIC8vIGVuZm9yY2UgciBiZXR3ZWVuIDAgYW5kIDEKKyAgICAgICAgICAgIHIgPSBNYXRoLm1pbigxLjBmLCByKTsKKyAgICAgICAgICAgIHIgPSBNYXRoLm1heCgwLCByKTsKKworICAgICAgICAgICAgbVlQcm9ncmVzcyA9IHI7CisgICAgICAgICAgICBmaW5hbCBMYXlvdXRQYXJhbXMgdmlld0xwID0gKExheW91dFBhcmFtcykgbVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICBmaW5hbCBMYXlvdXRQYXJhbXMgaGlnaGxpZ2h0THAgPSAoTGF5b3V0UGFyYW1zKSBtSGlnaGxpZ2h0LmdldExheW91dFBhcmFtcygpOworCisgICAgICAgICAgICBpbnQgc3RhY2tEaXJlY3Rpb24gPSAobVN0YWNrTW9kZSA9PSBJVEVNU19TTElERV9VUCkgPyAxIDogLTE7CisKKyAgICAgICAgICAgIHN3aXRjaCAobU1vZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5PUk1BTF9NT0RFOgorICAgICAgICAgICAgICAgICAgICB2aWV3THAuc2V0VmVydGljYWxPZmZzZXQoTWF0aC5yb3VuZCgtciAqIHN0YWNrRGlyZWN0aW9uICogbVNsaWRlQW1vdW50KSk7CisgICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodExwLnNldFZlcnRpY2FsT2Zmc2V0KE1hdGgucm91bmQoLXIgKiBzdGFja0RpcmVjdGlvbiAqIG1TbGlkZUFtb3VudCkpOworICAgICAgICAgICAgICAgICAgICBtSGlnaGxpZ2h0LnNldEFscGhhKGhpZ2hsaWdodEFscGhhSW50ZXJwb2xhdG9yKHIpKTsKKworICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9IHZpZXdBbHBoYUludGVycG9sYXRvcigxIC0gcik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWFrZSBzdXJlIHRoYXQgdmlld3Mgd2hpY2ggY2FuJ3QgYmUgc2VlbiAoaGF2ZSAwIGFscGhhKSBhcmUgYWxzbyBpbnZpc2libGUKKyAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCB0aGV5IGRvbid0IGludGVyZmVyZSB3aXRoIGNsaWNrIGV2ZW50cy4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWV3LmdldEFscGhhKCkgPT0gMCAmJiBhbHBoYSAhPSAwICYmIG1WaWV3LmdldFZpc2liaWxpdHkoKSAhPSBWSVNJQkxFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVmlldy5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFscGhhID09IDAgJiYgbVZpZXcuZ2V0QWxwaGEoKSAhPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVZpZXcuZ2V0VmlzaWJpbGl0eSgpID09IFZJU0lCTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3LnNldFZpc2liaWxpdHkoSU5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1WaWV3LnNldEFscGhhKGFscGhhKTsKKyAgICAgICAgICAgICAgICAgICAgbVZpZXcuc2V0Um90YXRpb25YKHN0YWNrRGlyZWN0aW9uICogOTAuMGYgKiByb3RhdGlvbkludGVycG9sYXRvcihyKSk7CisgICAgICAgICAgICAgICAgICAgIG1IaWdobGlnaHQuc2V0Um90YXRpb25YKHN0YWNrRGlyZWN0aW9uICogOTAuMGYgKiByb3RhdGlvbkludGVycG9sYXRvcihyKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkVHSU5OSU5HX09GX1NUQUNLX01PREU6CisgICAgICAgICAgICAgICAgICAgIHIgPSByICogMC4yZjsKKyAgICAgICAgICAgICAgICAgICAgdmlld0xwLnNldFZlcnRpY2FsT2Zmc2V0KE1hdGgucm91bmQoLXN0YWNrRGlyZWN0aW9uICogciAqIG1TbGlkZUFtb3VudCkpOworICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHRMcC5zZXRWZXJ0aWNhbE9mZnNldChNYXRoLnJvdW5kKC1zdGFja0RpcmVjdGlvbiAqIHIgKiBtU2xpZGVBbW91bnQpKTsKKyAgICAgICAgICAgICAgICAgICAgbUhpZ2hsaWdodC5zZXRBbHBoYShoaWdobGlnaHRBbHBoYUludGVycG9sYXRvcihyKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRU5EX09GX1NUQUNLX01PREU6CisgICAgICAgICAgICAgICAgICAgIHIgPSAoMS1yKSAqIDAuMmY7CisgICAgICAgICAgICAgICAgICAgIHZpZXdMcC5zZXRWZXJ0aWNhbE9mZnNldChNYXRoLnJvdW5kKHN0YWNrRGlyZWN0aW9uICogciAqIG1TbGlkZUFtb3VudCkpOworICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHRMcC5zZXRWZXJ0aWNhbE9mZnNldChNYXRoLnJvdW5kKHN0YWNrRGlyZWN0aW9uICogciAqIG1TbGlkZUFtb3VudCkpOworICAgICAgICAgICAgICAgICAgICBtSGlnaGxpZ2h0LnNldEFscGhhKGhpZ2hsaWdodEFscGhhSW50ZXJwb2xhdG9yKHIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRYUHJvZ3Jlc3MoZmxvYXQgcikgeworICAgICAgICAgICAgLy8gZW5mb3JjZSByIGJldHdlZW4gMCBhbmQgMQorICAgICAgICAgICAgciA9IE1hdGgubWluKDIuMGYsIHIpOworICAgICAgICAgICAgciA9IE1hdGgubWF4KC0yLjBmLCByKTsKKworICAgICAgICAgICAgbVhQcm9ncmVzcyA9IHI7CisKKyAgICAgICAgICAgIGZpbmFsIExheW91dFBhcmFtcyB2aWV3THAgPSAoTGF5b3V0UGFyYW1zKSBtVmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgIGZpbmFsIExheW91dFBhcmFtcyBoaWdobGlnaHRMcCA9IChMYXlvdXRQYXJhbXMpIG1IaWdobGlnaHQuZ2V0TGF5b3V0UGFyYW1zKCk7CisKKyAgICAgICAgICAgIHIgKj0gMC4yZjsKKyAgICAgICAgICAgIHZpZXdMcC5zZXRIb3Jpem9udGFsT2Zmc2V0KE1hdGgucm91bmQociAqIG1TbGlkZUFtb3VudCkpOworICAgICAgICAgICAgaGlnaGxpZ2h0THAuc2V0SG9yaXpvbnRhbE9mZnNldChNYXRoLnJvdW5kKHIgKiBtU2xpZGVBbW91bnQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0TW9kZShpbnQgbW9kZSkgeworICAgICAgICAgICAgbU1vZGUgPSBtb2RlOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgZ2V0RHVyYXRpb25Gb3JOZXV0cmFsUG9zaXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0RHVyYXRpb24oZmFsc2UsIDApOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgZ2V0RHVyYXRpb25Gb3JPZmZzY3JlZW5Qb3NpdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXREdXJhdGlvbih0cnVlLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGdldER1cmF0aW9uRm9yTmV1dHJhbFBvc2l0aW9uKGZsb2F0IHZlbG9jaXR5KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0RHVyYXRpb24oZmFsc2UsIHZlbG9jaXR5KTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGdldER1cmF0aW9uRm9yT2Zmc2NyZWVuUG9zaXRpb24oZmxvYXQgdmVsb2NpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXREdXJhdGlvbih0cnVlLCB2ZWxvY2l0eSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZsb2F0IGdldER1cmF0aW9uKGJvb2xlYW4gaW52ZXJ0LCBmbG9hdCB2ZWxvY2l0eSkgeworICAgICAgICAgICAgaWYgKG1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBMYXlvdXRQYXJhbXMgdmlld0xwID0gKExheW91dFBhcmFtcykgbVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisKKyAgICAgICAgICAgICAgICBmbG9hdCBkID0gKGZsb2F0KSBNYXRoLnNxcnQoTWF0aC5wb3codmlld0xwLmhvcml6b250YWxPZmZzZXQsIDIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgucG93KHZpZXdMcC52ZXJ0aWNhbE9mZnNldCwgMikpOworICAgICAgICAgICAgICAgIGZsb2F0IG1heGQgPSAoZmxvYXQpIE1hdGguc3FydChNYXRoLnBvdyhtU2xpZGVBbW91bnQsIDIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgucG93KDAuNGYgKiBtU2xpZGVBbW91bnQsIDIpKTsKKworICAgICAgICAgICAgICAgIGlmICh2ZWxvY2l0eSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW52ZXJ0ID8gKDEgLSBkIC8gbWF4ZCkgOiBkIC8gbWF4ZCkgKiBERUZBVUxUX0FOSU1BVElPTl9EVVJBVElPTjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBkdXJhdGlvbiA9IGludmVydCA/IGQgLyBNYXRoLmFicyh2ZWxvY2l0eSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXhkIC0gZCkgLyBNYXRoLmFicyh2ZWxvY2l0eSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvbiA8IE1JTklNVU1fQU5JTUFUSU9OX0RVUkFUSU9OIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPiBERUZBVUxUX0FOSU1BVElPTl9EVVJBVElPTikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldER1cmF0aW9uKGludmVydCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHVyYXRpb247CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRZUHJvZ3Jlc3MoKSB7CisgICAgICAgICAgICByZXR1cm4gbVlQcm9ncmVzczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRYUHJvZ3Jlc3MoKSB7CisgICAgICAgICAgICByZXR1cm4gbVhQcm9ncmVzczsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCgpIHsKKyAgICAgICAgc3VwZXIub25SZW1vdGVBZGFwdGVyQ29ubmVjdGVkKCk7CisgICAgICAgIC8vIE9uIGZpcnN0IHJ1biwgd2Ugd2FudCB0byBzZXQgdGhlIHN0YWNrIHRvIHRoZSBlbmQuCisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsICYmIG1XaGljaENoaWxkID09IC0xKSB7CisgICAgICAgICAgICBtV2hpY2hDaGlsZCA9IG1BZGFwdGVyLmdldENvdW50KCkgLSAxOworICAgICAgICB9CisgICAgICAgIGlmIChtV2hpY2hDaGlsZCA+PSAwKSB7CisgICAgICAgICAgICBzZXREaXNwbGF5ZWRDaGlsZChtV2hpY2hDaGlsZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMYXlvdXRQYXJhbXMgY3JlYXRlT3JSZXVzZUxheW91dFBhcmFtcyhWaWV3IHYpIHsKKyAgICAgICAgZmluYWwgVmlld0dyb3VwLkxheW91dFBhcmFtcyBjdXJyZW50THAgPSB2LmdldExheW91dFBhcmFtcygpOworICAgICAgICBpZiAoY3VycmVudExwIGluc3RhbmNlb2YgTGF5b3V0UGFyYW1zKSB7CisgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSAoTGF5b3V0UGFyYW1zKSBjdXJyZW50THA7CisgICAgICAgICAgICBscC5zZXRIb3Jpem9udGFsT2Zmc2V0KDApOworICAgICAgICAgICAgbHAuc2V0VmVydGljYWxPZmZzZXQoMCk7CisgICAgICAgICAgICBscC53aWR0aCA9IDA7CisgICAgICAgICAgICBscC53aWR0aCA9IDA7CisgICAgICAgICAgICByZXR1cm4gbHA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBMYXlvdXRQYXJhbXModik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7CisgICAgICAgIGJvb2xlYW4gZGF0YUNoYW5nZWQgPSBtRGF0YUNoYW5nZWQ7CisgICAgICAgIGlmIChkYXRhQ2hhbmdlZCkgeworICAgICAgICAgICAgaGFuZGxlRGF0YUNoYW5nZWQoKTsKKworICAgICAgICAgICAgLy8gaWYgdGhlIGRhdGEgY2hhbmdlcywgbVdoaWNoQ2hpbGQgbWlnaHQgYmUgb3V0IG9mIHRoZSBib3VuZHMgb2YgdGhlIGFkYXB0ZXIKKyAgICAgICAgICAgIC8vIGluIHRoaXMgY2FzZSwgd2UgcmVzZXQgbVdoaWNoQ2hpbGQgdG8gdGhlIGJlZ2lubmluZworICAgICAgICAgICAgaWYgKG1XaGljaENoaWxkID49IG1BZGFwdGVyLmdldENvdW50KCkpCisgICAgICAgICAgICAgICAgbVdoaWNoQ2hpbGQgPSAwOworCisgICAgICAgICAgICBzaG93T25seShtV2hpY2hDaGlsZCwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICByZWZyZXNoQ2hpbGRyZW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBjaGlsZENvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaSk7CisKKyAgICAgICAgICAgIGludCBjaGlsZFJpZ2h0ID0gbVBhZGRpbmdMZWZ0ICsgY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICAgICAgaW50IGNoaWxkQm90dG9tID0gbVBhZGRpbmdUb3AgKyBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpOworICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gKExheW91dFBhcmFtcykgY2hpbGQuZ2V0TGF5b3V0UGFyYW1zKCk7CisKKyAgICAgICAgICAgIGNoaWxkLmxheW91dChtUGFkZGluZ0xlZnQgKyBscC5ob3Jpem9udGFsT2Zmc2V0LCBtUGFkZGluZ1RvcCArIGxwLnZlcnRpY2FsT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBjaGlsZFJpZ2h0ICsgbHAuaG9yaXpvbnRhbE9mZnNldCwgY2hpbGRCb3R0b20gKyBscC52ZXJ0aWNhbE9mZnNldCk7CisKKyAgICAgICAgfQorCisgICAgICAgIG1EYXRhQ2hhbmdlZCA9IGZhbHNlOworICAgICAgICBvbkxheW91dCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBtZWFzdXJlQ2hpbGRyZW4oKSB7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgZmluYWwgaW50IGNoaWxkV2lkdGggPSBtTWVhc3VyZWRXaWR0aCAtIG1QYWRkaW5nTGVmdCAtIG1QYWRkaW5nUmlnaHQ7CisgICAgICAgIGZpbmFsIGludCBjaGlsZEhlaWdodCA9IE1hdGgucm91bmQobU1lYXN1cmVkSGVpZ2h0KigxLVBFUlNQRUNUSVZFX1NISUZUX0ZBQ1RPUikpCisgICAgICAgICAgICAgICAgLSBtUGFkZGluZ1RvcCAtIG1QYWRkaW5nQm90dG9tOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaSk7CisgICAgICAgICAgICBjaGlsZC5tZWFzdXJlKE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhjaGlsZFdpZHRoLCBNZWFzdXJlU3BlYy5FWEFDVExZKSwKKyAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGNoaWxkSGVpZ2h0LCBNZWFzdXJlU3BlYy5FWEFDVExZKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICBpbnQgd2lkdGhTcGVjU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7CisgICAgICAgIGludCBoZWlnaHRTcGVjU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUoaGVpZ2h0TWVhc3VyZVNwZWMpOworICAgICAgICBmaW5hbCBpbnQgd2lkdGhTcGVjTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUod2lkdGhNZWFzdXJlU3BlYyk7CisgICAgICAgIGZpbmFsIGludCBoZWlnaHRTcGVjTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUoaGVpZ2h0TWVhc3VyZVNwZWMpOworCisgICAgICAgIGJvb2xlYW4gaGF2ZUNoaWxkUmVmU2l6ZSA9IChtUmVmZXJlbmNlQ2hpbGRXaWR0aCAhPSAtMSAmJiBtUmVmZXJlbmNlQ2hpbGRIZWlnaHQgIT0gLTEpOworCisgICAgICAgIC8vIFdlIG5lZWQgdG8gZGVhbCB3aXRoIHRoZSBjYXNlIHdoZXJlIG91ciBwYXJlbnQgaGFzbid0IHRvbGQgdXMgaG93CisgICAgICAgIC8vIGJpZyB3ZSBzaG91bGQgYmUuIEluIHRoaXMgY2FzZSB3ZSBzaG91bGQKKyAgICAgICAgZmxvYXQgZmFjdG9yID0gMS8oMSAtIFBFUlNQRUNUSVZFX1NISUZUX0ZBQ1RPUik7CisgICAgICAgIGlmIChoZWlnaHRTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCkgeworICAgICAgICAgICAgaGVpZ2h0U3BlY1NpemUgPSBoYXZlQ2hpbGRSZWZTaXplID8KKyAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZChtUmVmZXJlbmNlQ2hpbGRIZWlnaHQgKiAoMSArIGZhY3RvcikpICsKKyAgICAgICAgICAgICAgICAgICAgbVBhZGRpbmdUb3AgKyBtUGFkZGluZ0JvdHRvbSA6IDA7CisgICAgICAgIH0gZWxzZSBpZiAoaGVpZ2h0U3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuQVRfTU9TVCkgeworICAgICAgICAgICAgaGVpZ2h0U3BlY1NpemUgPSBoYXZlQ2hpbGRSZWZTaXplID8gTWF0aC5taW4oCisgICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQobVJlZmVyZW5jZUNoaWxkSGVpZ2h0ICogKDEgKyBmYWN0b3IpKSArIG1QYWRkaW5nVG9wICsKKyAgICAgICAgICAgICAgICAgICAgbVBhZGRpbmdCb3R0b20sIGhlaWdodFNwZWNTaXplKSA6IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAod2lkdGhTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCkgeworICAgICAgICAgICAgd2lkdGhTcGVjU2l6ZSA9IGhhdmVDaGlsZFJlZlNpemUgPyBtUmVmZXJlbmNlQ2hpbGRXaWR0aCArIG1QYWRkaW5nTGVmdCArCisgICAgICAgICAgICAgICAgICAgIG1QYWRkaW5nUmlnaHQgOiAwOworICAgICAgICB9IGVsc2UgaWYgKGhlaWdodFNwZWNNb2RlID09IE1lYXN1cmVTcGVjLkFUX01PU1QpIHsKKyAgICAgICAgICAgIHdpZHRoU3BlY1NpemUgPSBoYXZlQ2hpbGRSZWZTaXplID8gTWF0aC5taW4obVJlZmVyZW5jZUNoaWxkV2lkdGggKyBtUGFkZGluZ0xlZnQgKworICAgICAgICAgICAgICAgICAgICBtUGFkZGluZ1JpZ2h0LCB3aWR0aFNwZWNTaXplKSA6IDA7CisgICAgICAgIH0KKworICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbih3aWR0aFNwZWNTaXplLCBoZWlnaHRTcGVjU2l6ZSk7CisgICAgICAgIG1lYXN1cmVDaGlsZHJlbigpOworICAgIH0KKworICAgIGNsYXNzIExheW91dFBhcmFtcyBleHRlbmRzIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgeworICAgICAgICBpbnQgaG9yaXpvbnRhbE9mZnNldDsKKyAgICAgICAgaW50IHZlcnRpY2FsT2Zmc2V0OworICAgICAgICBWaWV3IG1WaWV3OworCisgICAgICAgIExheW91dFBhcmFtcyhWaWV3IHZpZXcpIHsKKyAgICAgICAgICAgIHN1cGVyKDAsIDApOworICAgICAgICAgICAgd2lkdGggPSAwOworICAgICAgICAgICAgaGVpZ2h0ID0gMDsKKyAgICAgICAgICAgIGhvcml6b250YWxPZmZzZXQgPSAwOworICAgICAgICAgICAgdmVydGljYWxPZmZzZXQgPSAwOworICAgICAgICAgICAgbVZpZXcgPSB2aWV3OworICAgICAgICB9CisKKyAgICAgICAgTGF5b3V0UGFyYW1zKENvbnRleHQgYywgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgICAgICBzdXBlcihjLCBhdHRycyk7CisgICAgICAgICAgICBob3Jpem9udGFsT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHdpZHRoID0gMDsKKyAgICAgICAgICAgIGhlaWdodCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFJlY3QgcGFyZW50UmVjdCA9IG5ldyBSZWN0KCk7CisgICAgICAgIHZvaWQgaW52YWxpZGF0ZUdsb2JhbFJlZ2lvbihWaWV3IHYsIFJlY3QgcikgeworICAgICAgICAgICAgVmlldyBwID0gdjsKKyAgICAgICAgICAgIGlmICghKHYuZ2V0UGFyZW50KCkgIT0gbnVsbCAmJiB2LmdldFBhcmVudCgpIGluc3RhbmNlb2YgVmlldykpIHJldHVybjsKKworICAgICAgICAgICAgYm9vbGVhbiBmaXJzdFBhc3MgPSB0cnVlOworICAgICAgICAgICAgcGFyZW50UmVjdC5zZXQoMCwgMCwgMCwgMCk7CisgICAgICAgICAgICBpbnQgZGVwdGggPSAwOworICAgICAgICAgICAgd2hpbGUgKHAuZ2V0UGFyZW50KCkgIT0gbnVsbCAmJiBwLmdldFBhcmVudCgpIGluc3RhbmNlb2YgVmlldworICAgICAgICAgICAgICAgICAgICAmJiAhcGFyZW50UmVjdC5jb250YWlucyhyKSkgeworICAgICAgICAgICAgICAgIGlmICghZmlyc3RQYXNzKSB7CisgICAgICAgICAgICAgICAgICAgIHIub2Zmc2V0KHAuZ2V0TGVmdCgpIC0gcC5nZXRTY3JvbGxYKCksIHAuZ2V0VG9wKCkgLSBwLmdldFNjcm9sbFkoKSk7CisgICAgICAgICAgICAgICAgICAgIGRlcHRoKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpcnN0UGFzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHAgPSAoVmlldykgcC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICBwYXJlbnRSZWN0LnNldChwLmdldFNjcm9sbFgoKSwgcC5nZXRTY3JvbGxZKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5nZXRXaWR0aCgpICsgcC5nZXRTY3JvbGxYKCksIHAuZ2V0SGVpZ2h0KCkgKyBwLmdldFNjcm9sbFkoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiB3ZSBuZWVkIHRvIHN0b3AgZWFybHkgaGVyZSBpZiB3ZSd2ZSBoaXQgdGhlIGVkZ2Ugb2YgdGhlIHNjcmVlbgorICAgICAgICAgICAgICAgIC8vIHNvIGFzIHRvIHByZXZlbnQgdXMgZnJvbSB3YWxraW5nIHRvbyBoaWdoIGluIHRoZSBoaWVyYXJjaHkuIEEgbG90IG9mIHRoaXMKKyAgICAgICAgICAgICAgICAvLyBjb2RlIG1pZ2h0IGJlY29tZSBhIGxvdCBtb3JlIHN0cmFpZ2h0Zm9yd2FyZC4KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRlcHRoID4gbUFuY2VzdG9ySGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgbUFuY2VzdG9yQ29udGFpbmluZ0FsbENoaWxkcmVuID0gKFZpZXdHcm91cCkgcDsKKyAgICAgICAgICAgICAgICBtQW5jZXN0b3JIZWlnaHQgPSBkZXB0aDsKKyAgICAgICAgICAgICAgICBkaXNhYmxlUGFyZW50YWxDbGlwcGluZygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwLmludmFsaWRhdGUoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBSZWN0IGludmFsaWRhdGVSZWN0ID0gbmV3IFJlY3QoKTsKKyAgICAgICAgcHJpdmF0ZSBSZWN0RiBpbnZhbGlkYXRlUmVjdGYgPSBuZXcgUmVjdEYoKTsKKyAgICAgICAgLy8gVGhpcyBpcyBwdWJsaWMgc28gdGhhdCBPYmplY3RBbmltYXRvciBjYW4gYWNjZXNzIGl0CisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZlcnRpY2FsT2Zmc2V0KGludCBuZXdWZXJ0aWNhbE9mZnNldCkgeworICAgICAgICAgICAgaW50IG9mZnNldERlbHRhID0gbmV3VmVydGljYWxPZmZzZXQgLSB2ZXJ0aWNhbE9mZnNldDsKKyAgICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0ID0gbmV3VmVydGljYWxPZmZzZXQ7CisKKyAgICAgICAgICAgIGlmIChtVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVZpZXcucmVxdWVzdExheW91dCgpOworICAgICAgICAgICAgICAgIGludCB0b3AgPSBNYXRoLm1pbihtVmlldy5nZXRUb3AoKSArIG9mZnNldERlbHRhLCBtVmlldy5nZXRUb3AoKSk7CisgICAgICAgICAgICAgICAgaW50IGJvdHRvbSA9IE1hdGgubWF4KG1WaWV3LmdldEJvdHRvbSgpICsgb2Zmc2V0RGVsdGEsIG1WaWV3LmdldEJvdHRvbSgpKTsKKworICAgICAgICAgICAgICAgIGludmFsaWRhdGVSZWN0Zi5zZXQobVZpZXcuZ2V0TGVmdCgpLCAgdG9wLCBtVmlldy5nZXRSaWdodCgpLCBib3R0b20pOworCisgICAgICAgICAgICAgICAgZmxvYXQgeG9mZnNldCA9IC1pbnZhbGlkYXRlUmVjdGYubGVmdDsKKyAgICAgICAgICAgICAgICBmbG9hdCB5b2Zmc2V0ID0gLWludmFsaWRhdGVSZWN0Zi50b3A7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVJlY3RmLm9mZnNldCh4b2Zmc2V0LCB5b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBtVmlldy5nZXRNYXRyaXgoKS5tYXBSZWN0KGludmFsaWRhdGVSZWN0Zik7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVJlY3RmLm9mZnNldCgteG9mZnNldCwgLXlvZmZzZXQpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVSZWN0LnNldCgoaW50KSBNYXRoLmZsb29yKGludmFsaWRhdGVSZWN0Zi5sZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIE1hdGguZmxvb3IoaW52YWxpZGF0ZVJlY3RmLnRvcCksCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBNYXRoLmNlaWwoaW52YWxpZGF0ZVJlY3RmLnJpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIE1hdGguY2VpbChpbnZhbGlkYXRlUmVjdGYuYm90dG9tKSk7CisKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlR2xvYmFsUmVnaW9uKG1WaWV3LCBpbnZhbGlkYXRlUmVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRIb3Jpem9udGFsT2Zmc2V0KGludCBuZXdIb3Jpem9udGFsT2Zmc2V0KSB7CisgICAgICAgICAgICBpbnQgb2Zmc2V0RGVsdGEgPSBuZXdIb3Jpem9udGFsT2Zmc2V0IC0gaG9yaXpvbnRhbE9mZnNldDsKKyAgICAgICAgICAgIGhvcml6b250YWxPZmZzZXQgPSBuZXdIb3Jpem9udGFsT2Zmc2V0OworCisgICAgICAgICAgICBpZiAobVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1WaWV3LnJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgICAgICAgICBpbnQgbGVmdCA9IE1hdGgubWluKG1WaWV3LmdldExlZnQoKSArIG9mZnNldERlbHRhLCBtVmlldy5nZXRMZWZ0KCkpOworICAgICAgICAgICAgICAgIGludCByaWdodCA9IE1hdGgubWF4KG1WaWV3LmdldFJpZ2h0KCkgKyBvZmZzZXREZWx0YSwgbVZpZXcuZ2V0UmlnaHQoKSk7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVJlY3RmLnNldChsZWZ0LCAgbVZpZXcuZ2V0VG9wKCksIHJpZ2h0LCBtVmlldy5nZXRCb3R0b20oKSk7CisKKyAgICAgICAgICAgICAgICBmbG9hdCB4b2Zmc2V0ID0gLWludmFsaWRhdGVSZWN0Zi5sZWZ0OworICAgICAgICAgICAgICAgIGZsb2F0IHlvZmZzZXQgPSAtaW52YWxpZGF0ZVJlY3RmLnRvcDsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUmVjdGYub2Zmc2V0KHhvZmZzZXQsIHlvZmZzZXQpOworICAgICAgICAgICAgICAgIG1WaWV3LmdldE1hdHJpeCgpLm1hcFJlY3QoaW52YWxpZGF0ZVJlY3RmKTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUmVjdGYub2Zmc2V0KC14b2Zmc2V0LCAteW9mZnNldCk7CisKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUmVjdC5zZXQoKGludCkgTWF0aC5mbG9vcihpbnZhbGlkYXRlUmVjdGYubGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBNYXRoLmZsb29yKGludmFsaWRhdGVSZWN0Zi50b3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgTWF0aC5jZWlsKGludmFsaWRhdGVSZWN0Zi5yaWdodCksCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBNYXRoLmNlaWwoaW52YWxpZGF0ZVJlY3RmLmJvdHRvbSkpOworCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZUdsb2JhbFJlZ2lvbihtVmlldywgaW52YWxpZGF0ZVJlY3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSG9sb2dyYXBoaWNIZWxwZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1Ib2xvZ3JhcGhpY1BhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUVyYXNlUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtQmx1clBhaW50ID0gbmV3IFBhaW50KCk7CisKKyAgICAgICAgSG9sb2dyYXBoaWNIZWxwZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBpbml0aWFsaXplUGFpbnRzKGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBpbml0aWFsaXplUGFpbnRzKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgZmluYWwgZmxvYXQgZGVuc2l0eSA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5OworCisgICAgICAgICAgICBtSG9sb2dyYXBoaWNQYWludC5zZXRDb2xvcigweGZmNjY5OWZmKTsKKyAgICAgICAgICAgIG1Ib2xvZ3JhcGhpY1BhaW50LnNldEZpbHRlckJpdG1hcCh0cnVlKTsKKyAgICAgICAgICAgIG1Ib2xvZ3JhcGhpY1BhaW50LnNldE1hc2tGaWx0ZXIoVGFibGVNYXNrRmlsdGVyLkNyZWF0ZUNsaXBUYWJsZSgwLCAzMCkpOworICAgICAgICAgICAgbUVyYXNlUGFpbnQuc2V0WGZlcm1vZGUobmV3IFBvcnRlckR1ZmZYZmVybW9kZShQb3J0ZXJEdWZmLk1vZGUuRFNUX09VVCkpOworICAgICAgICAgICAgbUVyYXNlUGFpbnQuc2V0RmlsdGVyQml0bWFwKHRydWUpOworICAgICAgICAgICAgbUJsdXJQYWludC5zZXRNYXNrRmlsdGVyKG5ldyBCbHVyTWFza0ZpbHRlcigyKmRlbnNpdHksIEJsdXJNYXNrRmlsdGVyLkJsdXIuTk9STUFMKSk7CisgICAgICAgIH0KKworICAgICAgICBCaXRtYXAgY3JlYXRlT3V0bGluZShWaWV3IHYpIHsKKyAgICAgICAgICAgIGlmICh2LmdldE1lYXN1cmVkV2lkdGgoKSA9PSAwIHx8IHYuZ2V0TWVhc3VyZWRIZWlnaHQoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHYuZ2V0TWVhc3VyZWRXaWR0aCgpLCB2LmdldE1lYXN1cmVkSGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgIEJpdG1hcC5Db25maWcuQVJHQl84ODg4KTsKKyAgICAgICAgICAgIENhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKGJpdG1hcCk7CisKKyAgICAgICAgICAgIGZsb2F0IHJvdGF0aW9uWCA9IHYuZ2V0Um90YXRpb25YKCk7CisgICAgICAgICAgICBmbG9hdCByb3RhdGlvbiA9IHYuZ2V0Um90YXRpb24oKTsKKyAgICAgICAgICAgIGZsb2F0IHRyYW5zbGF0aW9uWSA9IHYuZ2V0VHJhbnNsYXRpb25ZKCk7CisgICAgICAgICAgICB2LnNldFJvdGF0aW9uWCgwKTsKKyAgICAgICAgICAgIHYuc2V0Um90YXRpb24oMCk7CisgICAgICAgICAgICB2LnNldFRyYW5zbGF0aW9uWSgwKTsKKyAgICAgICAgICAgIHYuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgdi5zZXRSb3RhdGlvblgocm90YXRpb25YKTsKKyAgICAgICAgICAgIHYuc2V0Um90YXRpb24ocm90YXRpb24pOworICAgICAgICAgICAgdi5zZXRUcmFuc2xhdGlvblkodHJhbnNsYXRpb25ZKTsKKworICAgICAgICAgICAgZHJhd091dGxpbmUoY2FudmFzLCBiaXRtYXApOworICAgICAgICAgICAgcmV0dXJuIGJpdG1hcDsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIE1hdHJpeCBpZCA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgdm9pZCBkcmF3T3V0bGluZShDYW52YXMgZGVzdCwgQml0bWFwIHNyYykgeworICAgICAgICAgICAgaW50W10geHkgPSBuZXcgaW50WzJdOworICAgICAgICAgICAgQml0bWFwIG1hc2sgPSBzcmMuZXh0cmFjdEFscGhhKG1CbHVyUGFpbnQsIHh5KTsKKyAgICAgICAgICAgIENhbnZhcyBtYXNrQ2FudmFzID0gbmV3IENhbnZhcyhtYXNrKTsKKyAgICAgICAgICAgIG1hc2tDYW52YXMuZHJhd0JpdG1hcChzcmMsIC14eVswXSwgLXh5WzFdLCBtRXJhc2VQYWludCk7CisgICAgICAgICAgICBkZXN0LmRyYXdDb2xvcigwLCBQb3J0ZXJEdWZmLk1vZGUuQ0xFQVIpOworICAgICAgICAgICAgZGVzdC5zZXRNYXRyaXgoaWQpOworICAgICAgICAgICAgZGVzdC5kcmF3Qml0bWFwKG1hc2ssIHh5WzBdLCB4eVsxXSwgbUhvbG9ncmFwaGljUGFpbnQpOworICAgICAgICAgICAgbWFzay5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3VnZ2VzdGlvbnNBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3VnZ2VzdGlvbnNBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWViZTYyMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TdWdnZXN0aW9uc0FkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDcwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuU2VhcmNoRGlhbG9nOworaW1wb3J0IGFuZHJvaWQuYXBwLlNlYXJjaE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuU2VhcmNoYWJsZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyLk9wZW5SZXNvdXJjZUlkUmVzdWx0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVGV4dEFwcGVhcmFuY2VTcGFuOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyOworCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKKworLyoqCisgKiBQcm92aWRlcyB0aGUgY29udGVudHMgZm9yIHRoZSBzdWdnZXN0aW9uIGRyb3AtZG93biBsaXN0LmluIHtAbGluayBTZWFyY2hEaWFsb2d9LgorICoKKyAqIEBoaWRlCisgKi8KK2NsYXNzIFN1Z2dlc3Rpb25zQWRhcHRlciBleHRlbmRzIFJlc291cmNlQ3Vyc29yQWRhcHRlciBpbXBsZW1lbnRzIE9uQ2xpY2tMaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlN1Z2dlc3Rpb25zQWRhcHRlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFFVRVJZX0xJTUlUID0gNTA7CisKKyAgICBzdGF0aWMgZmluYWwgaW50IFJFRklORV9OT05FID0gMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IFJFRklORV9CWV9FTlRSWSA9IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBSRUZJTkVfQUxMID0gMjsKKworICAgIHByaXZhdGUgU2VhcmNoTWFuYWdlciBtU2VhcmNoTWFuYWdlcjsKKyAgICBwcml2YXRlIFNlYXJjaFZpZXcgbVNlYXJjaFZpZXc7CisgICAgcHJpdmF0ZSBTZWFyY2hhYmxlSW5mbyBtU2VhcmNoYWJsZTsKKyAgICBwcml2YXRlIENvbnRleHQgbVByb3ZpZGVyQ29udGV4dDsKKyAgICBwcml2YXRlIFdlYWtIYXNoTWFwPFN0cmluZywgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZT4gbU91dHNpZGVEcmF3YWJsZXNDYWNoZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUNsb3NlZCA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IG1RdWVyeVJlZmluZW1lbnQgPSBSRUZJTkVfQllfRU5UUlk7CisKKyAgICAvLyBVUkwgY29sb3IKKyAgICBwcml2YXRlIENvbG9yU3RhdGVMaXN0IG1VcmxDb2xvcjsKKworICAgIC8vIENhY2hlZCBjb2x1bW4gaW5kZXhlcywgdXBkYXRlZCB3aGVuIHRoZSBjdXJzb3IgY2hhbmdlcy4KKyAgICBwcml2YXRlIGludCBtVGV4dDFDb2w7CisgICAgcHJpdmF0ZSBpbnQgbVRleHQyQ29sOworICAgIHByaXZhdGUgaW50IG1UZXh0MlVybENvbDsKKyAgICBwcml2YXRlIGludCBtSWNvbk5hbWUxQ29sOworICAgIHByaXZhdGUgaW50IG1JY29uTmFtZTJDb2w7CisgICAgcHJpdmF0ZSBpbnQgbUZsYWdzQ29sOworCisgICAgc3RhdGljIGZpbmFsIGludCBOT05FID0gLTE7CisKKyAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1TdGFydFNwaW5uZXJSdW5uYWJsZTsKKyAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1TdG9wU3Bpbm5lclJ1bm5hYmxlOworCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiB0aW1lIHdlIGRlbGF5IGluIHRoZSBmaWx0ZXIgd2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSBkZWxldGUga2V5LgorICAgICAqIEBzZWUgRmlsdGVyI3NldERlbGF5ZXIoYW5kcm9pZC53aWRnZXQuRmlsdGVyLkRlbGF5ZXIpLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVMRVRFX0tFWV9QT1NUX0RFTEFZID0gNTAwTDsKKworICAgIHB1YmxpYyBTdWdnZXN0aW9uc0FkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBTZWFyY2hWaWV3IHNlYXJjaFZpZXcsCisgICAgICAgICAgICBTZWFyY2hhYmxlSW5mbyBzZWFyY2hhYmxlLAorICAgICAgICAgICAgV2Vha0hhc2hNYXA8U3RyaW5nLCBEcmF3YWJsZS5Db25zdGFudFN0YXRlPiBvdXRzaWRlRHJhd2FibGVzQ2FjaGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5zZWFyY2hfZHJvcGRvd25faXRlbV9pY29uc18ybGluZSwKKyAgICAgICAgICAgICAgICBudWxsLCAgIC8vIG5vIGluaXRpYWwgY3Vyc29yCisgICAgICAgICAgICAgICAgdHJ1ZSk7ICAvLyBhdXRvLXJlcXVlcnkKKyAgICAgICAgbVNlYXJjaE1hbmFnZXIgPSAoU2VhcmNoTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlNFQVJDSF9TRVJWSUNFKTsKKyAgICAgICAgbVNlYXJjaFZpZXcgPSBzZWFyY2hWaWV3OworICAgICAgICBtU2VhcmNoYWJsZSA9IHNlYXJjaGFibGU7CisgICAgICAgIC8vIHNldCB1cCBwcm92aWRlciByZXNvdXJjZXMgKGdpdmVzIHVzIGljb25zLCBldGMuKQorICAgICAgICBDb250ZXh0IGFjdGl2aXR5Q29udGV4dCA9IG1TZWFyY2hhYmxlLmdldEFjdGl2aXR5Q29udGV4dChtQ29udGV4dCk7CisgICAgICAgIG1Qcm92aWRlckNvbnRleHQgPSBtU2VhcmNoYWJsZS5nZXRQcm92aWRlckNvbnRleHQobUNvbnRleHQsIGFjdGl2aXR5Q29udGV4dCk7CisKKyAgICAgICAgbU91dHNpZGVEcmF3YWJsZXNDYWNoZSA9IG91dHNpZGVEcmF3YWJsZXNDYWNoZTsKKyAgICAgICAgCisgICAgICAgIG1TdGFydFNwaW5uZXJSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgLy8gbVNlYXJjaFZpZXcuc2V0V29ya2luZyh0cnVlKTsgLy8gVE9ETzoKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgIG1TdG9wU3Bpbm5lclJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIC8vIG1TZWFyY2hWaWV3LnNldFdvcmtpbmcoZmFsc2UpOyAvLyBUT0RPOgorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8vIGRlbGF5IDUwMG1zIHdoZW4gZGVsZXRpbmcKKyAgICAgICAgZ2V0RmlsdGVyKCkuc2V0RGVsYXllcihuZXcgRmlsdGVyLkRlbGF5ZXIoKSB7CisKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1QcmV2aW91c0xlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldFBvc3RpbmdEZWxheShDaGFyU2VxdWVuY2UgY29uc3RyYWludCkgeworICAgICAgICAgICAgICAgIGlmIChjb25zdHJhaW50ID09IG51bGwpIHJldHVybiAwOworCisgICAgICAgICAgICAgICAgbG9uZyBkZWxheSA9IGNvbnN0cmFpbnQubGVuZ3RoKCkgPCBtUHJldmlvdXNMZW5ndGggPyBERUxFVEVfS0VZX1BPU1RfREVMQVkgOiAwOworICAgICAgICAgICAgICAgIG1QcmV2aW91c0xlbmd0aCA9IGNvbnN0cmFpbnQubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGF5OworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGVzIHF1ZXJ5IHJlZmluZW1lbnQgZm9yIGFsbCBzdWdnZXN0aW9ucy4gVGhpcyBtZWFucyB0aGF0IGFuIGFkZGl0aW9uYWwgaWNvbgorICAgICAqIHdpbGwgYmUgc2hvd24gZm9yIGVhY2ggZW50cnkuIFdoZW4gY2xpY2tlZCwgdGhlIHN1Z2dlc3RlZCB0ZXh0IG9uIHRoYXQgbGluZSB3aWxsIGJlCisgICAgICogY29waWVkIHRvIHRoZSBxdWVyeSB0ZXh0IGZpZWxkLgorICAgICAqIDxwPgorICAgICAqCisgICAgICogQHBhcmFtIHJlZmluZSB3aGljaCBxdWVyaWVzIHRvIHJlZmluZS4gUG9zc2libGUgdmFsdWVzIGFyZSB7QGxpbmsgI1JFRklORV9OT05FfSwKKyAgICAgKiB7QGxpbmsgI1JFRklORV9CWV9FTlRSWX0sIGFuZCB7QGxpbmsgI1JFRklORV9BTEx9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5UmVmaW5lbWVudChpbnQgcmVmaW5lV2hhdCkgeworICAgICAgICBtUXVlcnlSZWZpbmVtZW50ID0gcmVmaW5lV2hhdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHF1ZXJ5IHJlZmluZW1lbnQgcHJlZmVyZW5jZS4KKyAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHF1ZXJ5IHJlZmluZW1lbnQgcHJlZmVyZW5jZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UXVlcnlSZWZpbmVtZW50KCkgeworICAgICAgICByZXR1cm4gbVF1ZXJ5UmVmaW5lbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZGVuIHRvIGFsd2F5cyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LCBzaW5jZSB3ZSBjYW5ub3QgYmUgc3VyZSB0aGF0CisgICAgICogc3VnZ2VzdGlvbiBzb3VyY2VzIHJldHVybiBzdGFibGUgSURzLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZSB0aGUgc2VhcmNoIHN1Z2dlc3Rpb25zIHByb3ZpZGVyIHRvIG9idGFpbiBhIGxpdmUgY3Vyc29yLiAgVGhpcyB3aWxsIGJlIGNhbGxlZAorICAgICAqIGluIGEgd29ya2VyIHRocmVhZCwgc28gaXQncyBPSyBpZiB0aGUgcXVlcnkgaXMgc2xvdyAoZS5nLiByb3VuZCB0cmlwIGZvciBzdWdnZXN0aW9ucykuCisgICAgICogVGhlIHJlc3VsdHMgd2lsbCBiZSBwcm9jZXNzZWQgaW4gdGhlIFVJIHRocmVhZCBhbmQgY2hhbmdlQ3Vyc29yKCkgd2lsbCBiZSBjYWxsZWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEN1cnNvciBydW5RdWVyeU9uQmFja2dyb3VuZFRocmVhZChDaGFyU2VxdWVuY2UgY29uc3RyYWludCkgeworICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAicnVuUXVlcnlPbkJhY2tncm91bmRUaHJlYWQoIiArIGNvbnN0cmFpbnQgKyAiKSIpOworICAgICAgICBTdHJpbmcgcXVlcnkgPSAoY29uc3RyYWludCA9PSBudWxsKSA/ICIiIDogY29uc3RyYWludC50b1N0cmluZygpOworICAgICAgICAvKioKKyAgICAgICAgICogZm9yIGluIGFwcCBzZWFyY2ggd2Ugc2hvdyB0aGUgcHJvZ3Jlc3Mgc3Bpbm5lciB1bnRpbCB0aGUgY3Vyc29yIGlzIHJldHVybmVkIHdpdGgKKyAgICAgICAgICogdGhlIHJlc3VsdHMuCisgICAgICAgICAqLworICAgICAgICBDdXJzb3IgY3Vyc29yID0gbnVsbDsKKyAgICAgICAgLy9tU2VhcmNoVmlldy5nZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKS5wb3N0KG1TdGFydFNwaW5uZXJSdW5uYWJsZSk7IC8vIFRPRE86CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjdXJzb3IgPSBtU2VhcmNoTWFuYWdlci5nZXRTdWdnZXN0aW9ucyhtU2VhcmNoYWJsZSwgcXVlcnksIFFVRVJZX0xJTUlUKTsKKyAgICAgICAgICAgIC8vIHRyaWdnZXIgZmlsbCB3aW5kb3cgc28gdGhlIHNwaW5uZXIgc3RheXMgdXAgdW50aWwgdGhlIHJlc3VsdHMgYXJlIGNvcGllZCBvdmVyIGFuZAorICAgICAgICAgICAgLy8gY2xvc2VyIHRvIGJlaW5nIHJlYWR5CisgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjdXJzb3IuZ2V0Q291bnQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3Vyc29yOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJTZWFyY2ggc3VnZ2VzdGlvbnMgcXVlcnkgdGhyZXcgYW4gZXhjZXB0aW9uLiIsIGUpOworICAgICAgICB9CisgICAgICAgIC8vIElmIGN1cnNvciBpcyBudWxsIG9yIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLCBzdG9wIHRoZSBzcGlubmVyIGFuZCByZXR1cm4gbnVsbC4KKyAgICAgICAgLy8gY2hhbmdlQ3Vyc29yIGRvZXNuJ3QgZ2V0IGNhbGxlZCBpZiBjdXJzb3IgaXMgbnVsbAorICAgICAgICAvLyBtU2VhcmNoVmlldy5nZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKS5wb3N0KG1TdG9wU3Bpbm5lclJ1bm5hYmxlKTsgLy8gVE9ETzoKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJjbG9zZSgpIik7CisgICAgICAgIGNoYW5nZUN1cnNvcihudWxsKTsKKyAgICAgICAgbUNsb3NlZCA9IHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YVNldENoYW5nZWQoKSB7CisgICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJub3RpZnlEYXRhU2V0Q2hhbmdlZCIpOworICAgICAgICBzdXBlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworCisgICAgICAgIC8vIG1TZWFyY2hWaWV3Lm9uRGF0YVNldENoYW5nZWQoKTsgLy8gVE9ETzoKKworICAgICAgICB1cGRhdGVTcGlubmVyU3RhdGUoZ2V0Q3Vyc29yKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFTZXRJbnZhbGlkYXRlZCgpIHsKKyAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIm5vdGlmeURhdGFTZXRJbnZhbGlkYXRlZCIpOworICAgICAgICBzdXBlci5ub3RpZnlEYXRhU2V0SW52YWxpZGF0ZWQoKTsKKworICAgICAgICB1cGRhdGVTcGlubmVyU3RhdGUoZ2V0Q3Vyc29yKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTcGlubmVyU3RhdGUoQ3Vyc29yIGN1cnNvcikgeworICAgICAgICBCdW5kbGUgZXh0cmFzID0gY3Vyc29yICE9IG51bGwgPyBjdXJzb3IuZ2V0RXh0cmFzKCkgOiBudWxsOworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAidXBkYXRlU3Bpbm5lclN0YXRlIC0gZXh0cmEgPSAiCisgICAgICAgICAgICAgICAgKyAoZXh0cmFzICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgID8gZXh0cmFzLmdldEJvb2xlYW4oU2VhcmNoTWFuYWdlci5DVVJTT1JfRVhUUkFfS0VZX0lOX1BST0dSRVNTKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIEN1cnNvciBpbmRpY2F0ZXMgdGhhdCB0aGUgcXVlcnkgaXMgbm90IGNvbXBsZXRlIGFuZCBzaG93IHRoZSBzcGlubmVyCisgICAgICAgIGlmIChleHRyYXMgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGV4dHJhcy5nZXRCb29sZWFuKFNlYXJjaE1hbmFnZXIuQ1VSU09SX0VYVFJBX0tFWV9JTl9QUk9HUkVTUykpIHsKKyAgICAgICAgICAgIC8vIG1TZWFyY2hWaWV3LmdldFdpbmRvdygpLmdldERlY29yVmlldygpLnBvc3QobVN0YXJ0U3Bpbm5lclJ1bm5hYmxlKTsgLy8gVE9ETzoKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiBjdXJzb3IgaXMgbnVsbCBvciBpcyBkb25lLCBzdG9wIHRoZSBzcGlubmVyCisgICAgICAgIC8vIG1TZWFyY2hWaWV3LmdldFdpbmRvdygpLmdldERlY29yVmlldygpLnBvc3QobVN0b3BTcGlubmVyUnVubmFibGUpOyAvLyBUT0RPOgorICAgIH0KKworICAgIC8qKgorICAgICAqIENhY2hlIGNvbHVtbnMuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2hhbmdlQ3Vyc29yKEN1cnNvciBjKSB7CisgICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJjaGFuZ2VDdXJzb3IoIiArIGMgKyAiKSIpOworCisgICAgICAgIGlmIChtQ2xvc2VkKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVHJpZWQgdG8gY2hhbmdlIGN1cnNvciBhZnRlciBhZGFwdGVyIHdhcyBjbG9zZWQuIik7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VwZXIuY2hhbmdlQ3Vyc29yKGMpOworCisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRleHQxQ29sID0gYy5nZXRDb2x1bW5JbmRleChTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX1RFWFRfMSk7CisgICAgICAgICAgICAgICAgbVRleHQyQ29sID0gYy5nZXRDb2x1bW5JbmRleChTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX1RFWFRfMik7CisgICAgICAgICAgICAgICAgbVRleHQyVXJsQ29sID0gYy5nZXRDb2x1bW5JbmRleChTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX1RFWFRfMl9VUkwpOworICAgICAgICAgICAgICAgIG1JY29uTmFtZTFDb2wgPSBjLmdldENvbHVtbkluZGV4KFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fSUNPTl8xKTsKKyAgICAgICAgICAgICAgICBtSWNvbk5hbWUyQ29sID0gYy5nZXRDb2x1bW5JbmRleChTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX0lDT05fMik7CisgICAgICAgICAgICAgICAgbUZsYWdzQ29sID0gYy5nZXRDb2x1bW5JbmRleChTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX0ZMQUdTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJlcnJvciBjaGFuZ2luZyBjdXJzb3IgYW5kIGNhY2hpbmcgY29sdW1ucyIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGFncyB0aGUgdmlldyB3aXRoIGNhY2hlZCBjaGlsZCB2aWV3IGxvb2stdXBzLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWV3IG5ld1ZpZXcoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgY3Vyc29yLCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgIFZpZXcgdiA9IHN1cGVyLm5ld1ZpZXcoY29udGV4dCwgY3Vyc29yLCBwYXJlbnQpOworICAgICAgICB2LnNldFRhZyhuZXcgQ2hpbGRWaWV3Q2FjaGUodikpOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWNoZSBvZiB0aGUgY2hpbGQgdmlld3Mgb2YgZHJvcC1kcm93biBsaXN0IGl0ZW1zLCB0byBhdm9pZCBsb29raW5nIHVwIHRoZSBjaGlsZHJlbgorICAgICAqIGVhY2ggdGltZSB0aGUgY29udGVudHMgb2YgYSBsaXN0IGl0ZW0gYXJlIGNoYW5nZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgQ2hpbGRWaWV3Q2FjaGUgeworICAgICAgICBwdWJsaWMgZmluYWwgVGV4dFZpZXcgbVRleHQxOworICAgICAgICBwdWJsaWMgZmluYWwgVGV4dFZpZXcgbVRleHQyOworICAgICAgICBwdWJsaWMgZmluYWwgSW1hZ2VWaWV3IG1JY29uMTsKKyAgICAgICAgcHVibGljIGZpbmFsIEltYWdlVmlldyBtSWNvbjI7CisgICAgICAgIHB1YmxpYyBmaW5hbCBJbWFnZVZpZXcgbUljb25SZWZpbmU7CisKKyAgICAgICAgcHVibGljIENoaWxkVmlld0NhY2hlKFZpZXcgdikgeworICAgICAgICAgICAgbVRleHQxID0gKFRleHRWaWV3KSB2LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnRleHQxKTsKKyAgICAgICAgICAgIG1UZXh0MiA9IChUZXh0Vmlldykgdi5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC50ZXh0Mik7CisgICAgICAgICAgICBtSWNvbjEgPSAoSW1hZ2VWaWV3KSB2LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmljb24xKTsKKyAgICAgICAgICAgIG1JY29uMiA9IChJbWFnZVZpZXcpIHYuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuaWNvbjIpOworICAgICAgICAgICAgbUljb25SZWZpbmUgPSAoSW1hZ2VWaWV3KSB2LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmVkaXRfcXVlcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYmluZFZpZXcoVmlldyB2aWV3LCBDb250ZXh0IGNvbnRleHQsIEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgQ2hpbGRWaWV3Q2FjaGUgdmlld3MgPSAoQ2hpbGRWaWV3Q2FjaGUpIHZpZXcuZ2V0VGFnKCk7CisKKyAgICAgICAgaW50IGZsYWdzID0gMDsKKyAgICAgICAgaWYgKG1GbGFnc0NvbCAhPSAtMSkgeworICAgICAgICAgICAgZmxhZ3MgPSBjdXJzb3IuZ2V0SW50KG1GbGFnc0NvbCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZXdzLm1UZXh0MSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdGV4dDEgPSBnZXRTdHJpbmdPck51bGwoY3Vyc29yLCBtVGV4dDFDb2wpOworICAgICAgICAgICAgc2V0Vmlld1RleHQodmlld3MubVRleHQxLCB0ZXh0MSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZXdzLm1UZXh0MiAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBGaXJzdCBjaGVjayBURVhUXzJfVVJMCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dDIgPSBnZXRTdHJpbmdPck51bGwoY3Vyc29yLCBtVGV4dDJVcmxDb2wpOworICAgICAgICAgICAgaWYgKHRleHQyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0ZXh0MiA9IGZvcm1hdFVybCh0ZXh0Mik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRleHQyID0gZ2V0U3RyaW5nT3JOdWxsKGN1cnNvciwgbVRleHQyQ29sKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgbm8gc2Vjb25kIGxpbmUgb2YgdGV4dCBpcyBpbmRpY2F0ZWQsIGFsbG93IHRoZSBmaXJzdCBsaW5lIG9mIHRleHQKKyAgICAgICAgICAgIC8vIHRvIGJlIHVwIHRvIHR3byBsaW5lcyBpZiBpdCB3YW50cyB0byBiZS4KKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh0ZXh0MikpIHsKKyAgICAgICAgICAgICAgICBpZiAodmlld3MubVRleHQxICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmlld3MubVRleHQxLnNldFNpbmdsZUxpbmUoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB2aWV3cy5tVGV4dDEuc2V0TWF4TGluZXMoMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAodmlld3MubVRleHQxICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmlld3MubVRleHQxLnNldFNpbmdsZUxpbmUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHZpZXdzLm1UZXh0MS5zZXRNYXhMaW5lcygxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRWaWV3VGV4dCh2aWV3cy5tVGV4dDIsIHRleHQyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2aWV3cy5tSWNvbjEgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0Vmlld0RyYXdhYmxlKHZpZXdzLm1JY29uMSwgZ2V0SWNvbjEoY3Vyc29yKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZXdzLm1JY29uMiAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXRWaWV3RHJhd2FibGUodmlld3MubUljb24yLCBnZXRJY29uMihjdXJzb3IpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVF1ZXJ5UmVmaW5lbWVudCA9PSBSRUZJTkVfQUxMCisgICAgICAgICAgICAgICAgfHwgKG1RdWVyeVJlZmluZW1lbnQgPT0gUkVGSU5FX0JZX0VOVFJZCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoZmxhZ3MgJiBTZWFyY2hNYW5hZ2VyLkZMQUdfUVVFUllfUkVGSU5FTUVOVCkgIT0gMCkpIHsKKyAgICAgICAgICAgIHZpZXdzLm1JY29uUmVmaW5lLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIHZpZXdzLm1JY29uUmVmaW5lLnNldFRhZyh2aWV3cy5tVGV4dDEuZ2V0VGV4dCgpKTsKKyAgICAgICAgICAgIHZpZXdzLm1JY29uUmVmaW5lLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZpZXdzLm1JY29uUmVmaW5lLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgIE9iamVjdCB0YWcgPSB2LmdldFRhZygpOworICAgICAgICBpZiAodGFnIGluc3RhbmNlb2YgQ2hhclNlcXVlbmNlKSB7CisgICAgICAgICAgICBtU2VhcmNoVmlldy5vblF1ZXJ5UmVmaW5lKChDaGFyU2VxdWVuY2UpIHRhZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBmb3JtYXRVcmwoQ2hhclNlcXVlbmNlIHVybCkgeworICAgICAgICBpZiAobVVybENvbG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIExhemlseSBnZXQgdGhlIFVSTCBjb2xvciBmcm9tIHRoZSBjdXJyZW50IHRoZW1lLgorICAgICAgICAgICAgVHlwZWRWYWx1ZSBjb2xvclZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKKyAgICAgICAgICAgIG1Db250ZXh0LmdldFRoZW1lKCkucmVzb2x2ZUF0dHJpYnV0ZShSLmF0dHIudGV4dENvbG9yU2VhcmNoVXJsLCBjb2xvclZhbHVlLCB0cnVlKTsKKyAgICAgICAgICAgIG1VcmxDb2xvciA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldENvbG9yU3RhdGVMaXN0KGNvbG9yVmFsdWUucmVzb3VyY2VJZCk7CisgICAgICAgIH0KKworICAgICAgICBTcGFubmFibGVTdHJpbmcgdGV4dCA9IG5ldyBTcGFubmFibGVTdHJpbmcodXJsKTsKKyAgICAgICAgdGV4dC5zZXRTcGFuKG5ldyBUZXh0QXBwZWFyYW5jZVNwYW4obnVsbCwgMCwgMCwgbVVybENvbG9yLCBudWxsKSwKKyAgICAgICAgICAgICAgICAwLCB1cmwubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7CisgICAgICAgIHJldHVybiB0ZXh0OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRWaWV3VGV4dChUZXh0VmlldyB2LCBDaGFyU2VxdWVuY2UgdGV4dCkgeworICAgICAgICAvLyBTZXQgdGhlIHRleHQgZXZlbiBpZiBpdCdzIG51bGwsIHNpbmNlIHdlIG5lZWQgdG8gY2xlYXIgYW55IHByZXZpb3VzIHRleHQuCisgICAgICAgIHYuc2V0VGV4dCh0ZXh0KTsKKworICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkodGV4dCkpIHsKKyAgICAgICAgICAgIHYuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIERyYXdhYmxlIGdldEljb24xKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgaWYgKG1JY29uTmFtZTFDb2wgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgdmFsdWUgPSBjdXJzb3IuZ2V0U3RyaW5nKG1JY29uTmFtZTFDb2wpOworICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IGdldERyYXdhYmxlRnJvbVJlc291cmNlVmFsdWUodmFsdWUpOworICAgICAgICBpZiAoZHJhd2FibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGRyYXdhYmxlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXREZWZhdWx0SWNvbjEoY3Vyc29yKTsKKyAgICB9CisKKyAgICBwcml2YXRlIERyYXdhYmxlIGdldEljb24yKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgaWYgKG1JY29uTmFtZTJDb2wgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgdmFsdWUgPSBjdXJzb3IuZ2V0U3RyaW5nKG1JY29uTmFtZTJDb2wpOworICAgICAgICByZXR1cm4gZ2V0RHJhd2FibGVGcm9tUmVzb3VyY2VWYWx1ZSh2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZHJhd2FibGUgaW4gYW4gaW1hZ2UgdmlldywgbWFrZXMgc3VyZSB0aGUgdmlldyBpcyBvbmx5IHZpc2libGUgaWYgdGhlcmUKKyAgICAgKiBpcyBhIGRyYXdhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRWaWV3RHJhd2FibGUoSW1hZ2VWaWV3IHYsIERyYXdhYmxlIGRyYXdhYmxlKSB7CisgICAgICAgIC8vIFNldCB0aGUgaWNvbiBldmVuIGlmIHRoZSBkcmF3YWJsZSBpcyBudWxsLCBzaW5jZSB3ZSBuZWVkIHRvIGNsZWFyIGFueQorICAgICAgICAvLyBwcmV2aW91cyBpY29uLgorICAgICAgICB2LnNldEltYWdlRHJhd2FibGUoZHJhd2FibGUpOworCisgICAgICAgIGlmIChkcmF3YWJsZSA9PSBudWxsKSB7CisgICAgICAgICAgICB2LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHYuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworCisgICAgICAgICAgICAvLyBUaGlzIGlzIGEgaGFjayB0byBnZXQgYW55IGFuaW1hdGVkIGRyYXdhYmxlcyAobGlrZSBhICd3b3JraW5nJyBzcGlubmVyKQorICAgICAgICAgICAgLy8gdG8gYW5pbWF0ZS4gWW91IGhhdmUgdG8gc2V0VmlzaWJsZSB0cnVlIG9uIGFuIEFuaW1hdGlvbkRyYXdhYmxlIHRvIGdldAorICAgICAgICAgICAgLy8gaXQgdG8gc3RhcnQgYW5pbWF0aW5nLCBidXQgaXQgbXVzdCBmaXJzdCBoYXZlIGJlZW4gZmFsc2Ugb3IgZWxzZSB0aGUKKyAgICAgICAgICAgIC8vIGNhbGwgdG8gc2V0VmlzaWJsZSB3aWxsIGJlIGluZWZmZWN0aXZlLiBXZSBuZWVkIHRvIGNsZWFyIHVwIHRoZSBzdG9yeQorICAgICAgICAgICAgLy8gYWJvdXQgYW5pbWF0ZWQgZHJhd2FibGVzIGluIHRoZSBmdXR1cmUsIHNlZSBodHRwOi8vYi8xODc4NDMwLgorICAgICAgICAgICAgZHJhd2FibGUuc2V0VmlzaWJsZShmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgZHJhd2FibGUuc2V0VmlzaWJsZSh0cnVlLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0ZXh0IHRvIHNob3cgaW4gdGhlIHF1ZXJ5IGZpZWxkIHdoZW4gYSBzdWdnZXN0aW9uIGlzIHNlbGVjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGN1cnNvciBUaGUgQ3Vyc29yIHRvIHJlYWQgdGhlIHN1Z2dlc3Rpb24gZGF0YSBmcm9tLiBUaGUgQ3Vyc29yIHNob3VsZCBhbHJlYWR5CisgICAgICogICAgICAgIGJlIG1vdmVkIHRvIHRoZSBzdWdnZXN0aW9uIHRoYXQgaXMgdG8gYmUgcmVhZCBmcm9tLgorICAgICAqIEByZXR1cm4gVGhlIHRleHQgdG8gc2hvdywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHF1ZXJ5IHNob3VsZCBub3QgYmUKKyAgICAgKiAgICAgICAgIGNoYW5nZWQgd2hlbiBzZWxlY3RpbmcgdGhpcyBzdWdnZXN0aW9uLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgY29udmVydFRvU3RyaW5nKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgaWYgKGN1cnNvciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBxdWVyeSA9IGdldENvbHVtblN0cmluZyhjdXJzb3IsIFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fUVVFUlkpOworICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1TZWFyY2hhYmxlLnNob3VsZFJld3JpdGVRdWVyeUZyb21EYXRhKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBkYXRhID0gZ2V0Q29sdW1uU3RyaW5nKGN1cnNvciwgU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9JTlRFTlRfREFUQSk7CisgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobVNlYXJjaGFibGUuc2hvdWxkUmV3cml0ZVF1ZXJ5RnJvbVRleHQoKSkgeworICAgICAgICAgICAgU3RyaW5nIHRleHQxID0gZ2V0Q29sdW1uU3RyaW5nKGN1cnNvciwgU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9URVhUXzEpOworICAgICAgICAgICAgaWYgKHRleHQxICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIHB1cmVseSB0byBwcm92aWRlIGEgYml0IG9mIHByb3RlY3Rpb24gYWdhaW5zdAorICAgICAqIGZsYWt5IGNvbnRlbnQgcHJvdmlkZXJzLgorICAgICAqCisgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciNnZXRWaWV3KGludCwgVmlldywgVmlld0dyb3VwKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Vmlldyhwb3NpdGlvbiwgY29udmVydFZpZXcsIHBhcmVudCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlNlYXJjaCBzdWdnZXN0aW9ucyBjdXJzb3IgdGhyZXcgZXhjZXB0aW9uLiIsIGUpOworICAgICAgICAgICAgLy8gUHV0IGV4Y2VwdGlvbiBzdHJpbmcgaW4gaXRlbSB0aXRsZQorICAgICAgICAgICAgVmlldyB2ID0gbmV3VmlldyhtQ29udGV4dCwgbUN1cnNvciwgcGFyZW50KTsKKyAgICAgICAgICAgIGlmICh2ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDaGlsZFZpZXdDYWNoZSB2aWV3cyA9IChDaGlsZFZpZXdDYWNoZSkgdi5nZXRUYWcoKTsKKyAgICAgICAgICAgICAgICBUZXh0VmlldyB0diA9IHZpZXdzLm1UZXh0MTsKKyAgICAgICAgICAgICAgICB0di5zZXRUZXh0KGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSBkcmF3YWJsZSBnaXZlbiBhIHZhbHVlIHByb3ZpZGVkIGJ5IGEgc3VnZ2VzdGlvbiBwcm92aWRlci4KKyAgICAgKgorICAgICAqIFRoaXMgdmFsdWUgY291bGQgYmUganVzdCB0aGUgc3RyaW5nIHZhbHVlIG9mIGEgcmVzb3VyY2UgaWQKKyAgICAgKiAoZS5nLiwgIjIxMzA4Mzc1MjQiKSwgaW4gd2hpY2ggY2FzZSB3ZSB3aWxsIHRyeSB0byByZXRyaWV2ZSBhIGRyYXdhYmxlIGZyb20KKyAgICAgKiB0aGUgcHJvdmlkZXIncyByZXNvdXJjZXMuIElmIHRoZSB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlciwgaXQgaXMKKyAgICAgKiB0cmVhdGVkIGFzIGEgVXJpIGFuZCBvcGVuZWQgd2l0aAorICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjb3Blbk91dHB1dFN0cmVhbShhbmRyb2lkLm5ldC5VcmksIFN0cmluZyl9LgorICAgICAqCisgICAgICogQWxsIHJlc291cmNlcyBhbmQgVVJJcyBhcmUgcmVhZCB1c2luZyB0aGUgc3VnZ2VzdGlvbiBwcm92aWRlcidzIGNvbnRleHQuCisgICAgICoKKyAgICAgKiBJZiB0aGUgc3RyaW5nIGlzIG5vdCBmb3JtYXR0ZWQgYXMgZXhwZWN0ZWQsIG9yIG5vIGRyYXdhYmxlIGNhbiBiZSBmb3VuZCBmb3IKKyAgICAgKiB0aGUgcHJvdmlkZWQgdmFsdWUsIHRoaXMgbWV0aG9kIHJldHVybnMgbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkcmF3YWJsZUlkIGEgc3RyaW5nIGxpa2UgIjIxMzA4Mzc1MjQiLAorICAgICAqICAgICAgICAiYW5kcm9pZC5yZXNvdXJjZTovL2NvbS5hbmRyb2lkLmFsYXJtY2xvY2svMjEzMDgzNzUyNCIsCisgICAgICogICAgICAgIG9yICJjb250ZW50Oi8vY29udGFjdHMvcGhvdG9zLzI1MyIuCisgICAgICogQHJldHVybiBhIERyYXdhYmxlLCBvciBudWxsIGlmIG5vbmUgZm91bmQKKyAgICAgKi8KKyAgICBwcml2YXRlIERyYXdhYmxlIGdldERyYXdhYmxlRnJvbVJlc291cmNlVmFsdWUoU3RyaW5nIGRyYXdhYmxlSWQpIHsKKyAgICAgICAgaWYgKGRyYXdhYmxlSWQgPT0gbnVsbCB8fCBkcmF3YWJsZUlkLmxlbmd0aCgpID09IDAgfHwgIjAiLmVxdWFscyhkcmF3YWJsZUlkKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEZpcnN0LCBzZWUgaWYgaXQncyBqdXN0IGFuIGludGVnZXIKKyAgICAgICAgICAgIGludCByZXNvdXJjZUlkID0gSW50ZWdlci5wYXJzZUludChkcmF3YWJsZUlkKTsKKyAgICAgICAgICAgIC8vIEl0J3MgYW4gaW50LCBsb29rIGZvciBpdCBpbiB0aGUgY2FjaGUKKyAgICAgICAgICAgIFN0cmluZyBkcmF3YWJsZVVyaSA9IENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQU5EUk9JRF9SRVNPVVJDRQorICAgICAgICAgICAgICAgICAgICArICI6Ly8iICsgbVByb3ZpZGVyQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpICsgIi8iICsgcmVzb3VyY2VJZDsKKyAgICAgICAgICAgIC8vIE11c3QgdXNlIFVSSSBhcyBjYWNoZSBrZXksIHNpbmNlIGludHMgYXJlIGFwcC1zcGVjaWZpYworICAgICAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBjaGVja0ljb25DYWNoZShkcmF3YWJsZVVyaSk7CisgICAgICAgICAgICBpZiAoZHJhd2FibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBkcmF3YWJsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5vdCBjYWNoZWQsIGZpbmQgaXQgYnkgcmVzb3VyY2UgSUQKKyAgICAgICAgICAgIGRyYXdhYmxlID0gbVByb3ZpZGVyQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShyZXNvdXJjZUlkKTsKKyAgICAgICAgICAgIC8vIFN0aWNrIGl0IGluIHRoZSBjYWNoZSwgdXNpbmcgdGhlIFVSSSBhcyBrZXkKKyAgICAgICAgICAgIHN0b3JlSW5JY29uQ2FjaGUoZHJhd2FibGVVcmksIGRyYXdhYmxlKTsKKyAgICAgICAgICAgIHJldHVybiBkcmF3YWJsZTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworICAgICAgICAgICAgLy8gSXQncyBub3QgYW4gaW50ZWdlciwgdXNlIGl0IGFzIGEgVVJJCisgICAgICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IGNoZWNrSWNvbkNhY2hlKGRyYXdhYmxlSWQpOworICAgICAgICAgICAgaWYgKGRyYXdhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZHJhd2FibGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKGRyYXdhYmxlSWQpOworICAgICAgICAgICAgZHJhd2FibGUgPSBnZXREcmF3YWJsZSh1cmkpOworICAgICAgICAgICAgc3RvcmVJbkljb25DYWNoZShkcmF3YWJsZUlkLCBkcmF3YWJsZSk7CisgICAgICAgICAgICByZXR1cm4gZHJhd2FibGU7CisgICAgICAgIH0gY2F0Y2ggKFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgIC8vIEl0IHdhcyBhbiBpbnRlZ2VyLCBidXQgaXQgY291bGRuJ3QgYmUgZm91bmQsIGJhaWwgb3V0CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiSWNvbiByZXNvdXJjZSBub3QgZm91bmQ6ICIgKyBkcmF3YWJsZUlkKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhIGRyYXdhYmxlIGJ5IFVSSSwgd2l0aG91dCB1c2luZyB0aGUgY2FjaGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgZHJhd2FibGUsIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgZHJhd2FibGUgY291bGQgbm90IGJlIGxvYWRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIERyYXdhYmxlIGdldERyYXdhYmxlKFVyaSB1cmkpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBzY2hlbWUgPSB1cmkuZ2V0U2NoZW1lKCk7CisgICAgICAgICAgICBpZiAoQ29udGVudFJlc29sdmVyLlNDSEVNRV9BTkRST0lEX1JFU09VUkNFLmVxdWFscyhzY2hlbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gTG9hZCBkcmF3YWJsZXMgdGhyb3VnaCBSZXNvdXJjZXMsIHRvIGdldCB0aGUgc291cmNlIGRlbnNpdHkgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICBPcGVuUmVzb3VyY2VJZFJlc3VsdCByID0KKyAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVyQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5nZXRSZXNvdXJjZUlkKHVyaSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuci5nZXREcmF3YWJsZShyLmlkKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiUmVzb3VyY2UgZG9lcyBub3QgZXhpc3Q6ICIgKyB1cmkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gTGV0IHRoZSBDb250ZW50UmVzb2x2ZXIgaGFuZGxlIGNvbnRlbnQgYW5kIGZpbGUgVVJJcy4KKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBtUHJvdmlkZXJDb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbSh1cmkpOworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJGYWlsZWQgdG8gb3BlbiAiICsgdXJpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERyYXdhYmxlLmNyZWF0ZUZyb21TdHJlYW0oc3RyZWFtLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRXJyb3IgY2xvc2luZyBpY29uIHN0cmVhbSBmb3IgIiArIHVyaSwgZXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkljb24gbm90IGZvdW5kOiAiICsgdXJpICsgIiwgIiArIGZuZmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBEcmF3YWJsZSBjaGVja0ljb25DYWNoZShTdHJpbmcgcmVzb3VyY2VVcmkpIHsKKyAgICAgICAgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSBjYWNoZWQgPSBtT3V0c2lkZURyYXdhYmxlc0NhY2hlLmdldChyZXNvdXJjZVVyaSk7CisgICAgICAgIGlmIChjYWNoZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIkZvdW5kIGljb24gaW4gY2FjaGU6ICIgKyByZXNvdXJjZVVyaSk7CisgICAgICAgIHJldHVybiBjYWNoZWQubmV3RHJhd2FibGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RvcmVJbkljb25DYWNoZShTdHJpbmcgcmVzb3VyY2VVcmksIERyYXdhYmxlIGRyYXdhYmxlKSB7CisgICAgICAgIGlmIChkcmF3YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtT3V0c2lkZURyYXdhYmxlc0NhY2hlLnB1dChyZXNvdXJjZVVyaSwgZHJhd2FibGUuZ2V0Q29uc3RhbnRTdGF0ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxlZnQtaGFuZCBzaWRlIGljb24gdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBjdXJyZW50IHN1Z2dlc3Rpb24KKyAgICAgKiBpZiB0aGUgc3VnZ2VzdGlvbiBjb250YWlucyBhbiBpY29uIGNvbHVtbiBidXQgbm8gaWNvbiBvciBhIGJyb2tlbiBpY29uLgorICAgICAqCisgICAgICogQHBhcmFtIGN1cnNvciBBIGN1cnNvciBwb3NpdGlvbmVkIGF0IHRoZSBjdXJyZW50IHN1Z2dlc3Rpb24uCisgICAgICogQHJldHVybiBBIG5vbi1udWxsIGRyYXdhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgRHJhd2FibGUgZ2V0RGVmYXVsdEljb24xKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgLy8gQ2hlY2sgdGhlIGNvbXBvbmVudCB0aGF0IGdhdmUgdXMgdGhlIHN1Z2dlc3Rpb24KKyAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBnZXRBY3Rpdml0eUljb25XaXRoQ2FjaGUobVNlYXJjaGFibGUuZ2V0U2VhcmNoQWN0aXZpdHkoKSk7CisgICAgICAgIGlmIChkcmF3YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZHJhd2FibGU7CisgICAgICAgIH0KKworICAgICAgICAvLyBGYWxsIGJhY2sgdG8gYSBkZWZhdWx0IGljb24KKyAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0RGVmYXVsdEFjdGl2aXR5SWNvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGFjdGl2aXR5IG9yIGFwcGxpY2F0aW9uIGljb24gZm9yIGFuIGFjdGl2aXR5LgorICAgICAqIFVzZXMgdGhlIGxvY2FsIGljb24gY2FjaGUgZm9yIGZhc3QgcmVwZWF0ZWQgbG9va3Vwcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb25lbnQgTmFtZSBvZiBhbiBhY3Rpdml0eS4KKyAgICAgKiBAcmV0dXJuIEEgZHJhd2FibGUsIG9yIHtAY29kZSBudWxsfSBpZiBuZWl0aGVyIHRoZSBhY3Rpdml0eSBub3IgdGhlIGFwcGxpY2F0aW9uCisgICAgICogICAgICAgICBoYXMgYW4gaWNvbiBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBEcmF3YWJsZSBnZXRBY3Rpdml0eUljb25XaXRoQ2FjaGUoQ29tcG9uZW50TmFtZSBjb21wb25lbnQpIHsKKyAgICAgICAgLy8gRmlyc3QgY2hlY2sgdGhlIGljb24gY2FjaGUKKyAgICAgICAgU3RyaW5nIGNvbXBvbmVudEljb25LZXkgPSBjb21wb25lbnQuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKKyAgICAgICAgLy8gVXNpbmcgY29udGFpbnNLZXkoKSBzaW5jZSB3ZSBhbHNvIHN0b3JlIG51bGwgdmFsdWVzLgorICAgICAgICBpZiAobU91dHNpZGVEcmF3YWJsZXNDYWNoZS5jb250YWluc0tleShjb21wb25lbnRJY29uS2V5KSkgeworICAgICAgICAgICAgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSBjYWNoZWQgPSBtT3V0c2lkZURyYXdhYmxlc0NhY2hlLmdldChjb21wb25lbnRJY29uS2V5KTsKKyAgICAgICAgICAgIHJldHVybiBjYWNoZWQgPT0gbnVsbCA/IG51bGwgOiBjYWNoZWQubmV3RHJhd2FibGUobVByb3ZpZGVyQ29udGV4dC5nZXRSZXNvdXJjZXMoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlbiB0cnkgdGhlIGFjdGl2aXR5IG9yIGFwcGxpY2F0aW9uIGljb24KKyAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBnZXRBY3Rpdml0eUljb24oY29tcG9uZW50KTsKKyAgICAgICAgLy8gU3RpY2sgaXQgaW4gdGhlIGNhY2hlIHNvIHdlIGRvbid0IGRvIHRoaXMgbG9va3VwIGFnYWluLgorICAgICAgICBEcmF3YWJsZS5Db25zdGFudFN0YXRlIHRvQ2FjaGUgPSBkcmF3YWJsZSA9PSBudWxsID8gbnVsbCA6IGRyYXdhYmxlLmdldENvbnN0YW50U3RhdGUoKTsKKyAgICAgICAgbU91dHNpZGVEcmF3YWJsZXNDYWNoZS5wdXQoY29tcG9uZW50SWNvbktleSwgdG9DYWNoZSk7CisgICAgICAgIHJldHVybiBkcmF3YWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhY3Rpdml0eSBvciBhcHBsaWNhdGlvbiBpY29uIGZvciBhbiBhY3Rpdml0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb25lbnQgTmFtZSBvZiBhbiBhY3Rpdml0eS4KKyAgICAgKiBAcmV0dXJuIEEgZHJhd2FibGUsIG9yIHtAY29kZSBudWxsfSBpZiBuZWl0aGVyIHRoZSBhY2l0aXZ5IG9yIHRoZSBhcHBsaWNhdGlvbgorICAgICAqICAgICAgICAgaGF2ZSBhbiBpY29uIHNldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIERyYXdhYmxlIGdldEFjdGl2aXR5SWNvbihDb21wb25lbnROYW1lIGNvbXBvbmVudCkgeworICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5SW5mbyBhY3Rpdml0eUluZm87CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhY3Rpdml0eUluZm8gPSBwbS5nZXRBY3Rpdml0eUluZm8oY29tcG9uZW50LCBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCBleC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGludCBpY29uSWQgPSBhY3Rpdml0eUluZm8uZ2V0SWNvblJlc291cmNlKCk7CisgICAgICAgIGlmIChpY29uSWQgPT0gMCkgcmV0dXJuIG51bGw7CisgICAgICAgIFN0cmluZyBwa2cgPSBjb21wb25lbnQuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBwbS5nZXREcmF3YWJsZShwa2csIGljb25JZCwgYWN0aXZpdHlJbmZvLmFwcGxpY2F0aW9uSW5mbyk7CisgICAgICAgIGlmIChkcmF3YWJsZSA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiSW52YWxpZCBpY29uIHJlc291cmNlICIgKyBpY29uSWQgKyAiIGZvciAiCisgICAgICAgICAgICAgICAgICAgICsgY29tcG9uZW50LmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRyYXdhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3RyaW5nIGNvbHVtbiBieSBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGN1cnNvciBDdXJzb3IgdG8gcmVhZCB0aGUgdmFsdWUgZnJvbS4KKyAgICAgKiBAcGFyYW0gY29sdW1uTmFtZSBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQuCisgICAgICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiwgb3IgPGNvZGU+bnVsbDwvbnVsbD4KKyAgICAgKiAgICAgICAgIGlmIHRoZSBjdXJzb3IgZG9lcyBub3QgY29udGFpbiB0aGUgZ2l2ZW4gY29sdW1uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbHVtblN0cmluZyhDdXJzb3IgY3Vyc29yLCBTdHJpbmcgY29sdW1uTmFtZSkgeworICAgICAgICBpbnQgY29sID0gY3Vyc29yLmdldENvbHVtbkluZGV4KGNvbHVtbk5hbWUpOworICAgICAgICByZXR1cm4gZ2V0U3RyaW5nT3JOdWxsKGN1cnNvciwgY29sKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nT3JOdWxsKEN1cnNvciBjdXJzb3IsIGludCBjb2wpIHsKKyAgICAgICAgaWYgKGNvbCA9PSBOT05FKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRTdHJpbmcoY29sKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsCisgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIGVycm9yIHJldHJpZXZpbmcgdmFsaWQgY29sdW1uIGZyb20gY3Vyc29yLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGlkIHRoZSByZW1vdGUgcHJvY2VzcyBkaWU/IiwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKaW5kZXggNTM1MDQ3OC4uNzBjNjM3OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKQEAgLTIxLDggKzIxLDkgQEAKIAogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGE7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBib2FyZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKQEAgLTM2LDYgKzM3LDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuRXh0cmFjdEVkaXRUZXh0OworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwpAQCAtNDQsNyArNDYsNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLnRleHQuQm9yaW5nTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5DbGlwYm9hcmRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5EeW5hbWljTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuR2V0Q2hhcnM7CkBAIC04NCwxMCArODUsMTMgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuRmxvYXRNYXRoOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5IYXB0aWNGZWVkYmFja0NvbnN0YW50czsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CkBAIC0xOTAsNyArMTk0LDkgQEAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVGV4dFZpZXciOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0VYVFJBQ1QgPSBmYWxzZTsKICAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgUFJJT1JJVFkgPSAxMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZID0gMTAwOworCisgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRBbHBoYSA9IDI1NTsgICAgCiAKICAgICBwcml2YXRlIGZpbmFsIGludFtdIG1UZW1wQ29vcmRzID0gbmV3IGludFsyXTsKIApAQCAtMjgxMyw2ICsyODE5LDE0IEBACiAgICAgICAgICAgICBjLmRyYXdUZXh0KG1DaGFycywgc3RhcnQgKyBtU3RhcnQsIGVuZCAtIHN0YXJ0LCB4LCB5LCBwKTsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0UnVuKENhbnZhcyBjLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGZsb2F0IHgsIGZsb2F0IHksIGludCBmbGFncywgUGFpbnQgcCkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4obUNoYXJzLCBzdGFydCArIG1TdGFydCwgY291bnQsIGNvbnRleHRTdGFydCArIG1TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dENvdW50LCB4LCB5LCBmbGFncywgcCk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgZmxvYXQgbWVhc3VyZVRleHQoaW50IHN0YXJ0LCBpbnQgZW5kLCBQYWludCBwKSB7CiAgICAgICAgICAgICByZXR1cm4gcC5tZWFzdXJlVGV4dChtQ2hhcnMsIHN0YXJ0ICsgbVN0YXJ0LCBlbmQgLSBzdGFydCk7CiAgICAgICAgIH0KQEAgLTI4MjAsNiArMjgzNCwyMyBAQAogICAgICAgICBwdWJsaWMgaW50IGdldFRleHRXaWR0aHMoaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdFtdIHdpZHRocywgUGFpbnQgcCkgewogICAgICAgICAgICAgcmV0dXJuIHAuZ2V0VGV4dFdpZHRocyhtQ2hhcnMsIHN0YXJ0ICsgbVN0YXJ0LCBlbmQgLSBzdGFydCwgd2lkdGhzKTsKICAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXMoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LAorICAgICAgICAgICAgICAgIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsIGludCBhZHZhbmNlc0luZGV4LAorICAgICAgICAgICAgICAgIFBhaW50IHApIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IGVuZCAtIHN0YXJ0OworICAgICAgICAgICAgaW50IGNvbnRleHRDb3VudCA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgICAgICByZXR1cm4gcC5nZXRUZXh0UnVuQWR2YW5jZXMobUNoYXJzLCBzdGFydCArIG1TdGFydCwgY291bnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCArIG1TdGFydCwgY29udGV4dENvdW50LCBmbGFncywgYWR2YW5jZXMsCisgICAgICAgICAgICAgICAgICAgIGFkdmFuY2VzSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRUZXh0UnVuQ3Vyc29yKGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IGN1cnNvck9wdCwgUGFpbnQgcCkgeworICAgICAgICAgICAgaW50IGNvbnRleHRDb3VudCA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgICAgICByZXR1cm4gcC5nZXRUZXh0UnVuQ3Vyc29yKG1DaGFycywgY29udGV4dFN0YXJ0ICsgbVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0Q291bnQsIGZsYWdzLCBvZmZzZXQgKyBtU3RhcnQsIGN1cnNvck9wdCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTM3MzIsNyArMzc2Myw3IEBACiAgICAgICAgIC8vICAgYWxsb3cgdG8gdGVzdCBmb3IgaGFzU2VsZWN0aW9uIGluIG9uRm9jdXNDaGFuZ2VkLCB3aGljaCB3b3VsZCB0cmlnZ2VyIGEKICAgICAgICAgLy8gICBzdGFydFRleHRTZWxlY3Rpb25Nb2RlIGhlcmUuIFRPRE8KICAgICAgICAgaWYgKHNlbGVjdGlvbkNvbnRyb2xsZXIgIT0gbnVsbCAmJiBoYXNTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgc3RhcnRUZXh0U2VsZWN0aW9uTW9kZSgpOworICAgICAgICAgICAgc3RhcnRTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CiAgICAgICAgIH0KIAogICAgICAgICBtUHJlRHJhd1N0YXRlID0gUFJFRFJBV19ET05FOwpAQCAtMzg3Miw2ICszOTAzLDIyIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gb25TZXRBbHBoYShpbnQgYWxwaGEpIHsKKyAgICAgICAgaWYgKG1Nb3ZlbWVudCA9PSBudWxsICYmIGdldEJhY2tncm91bmQoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ3VycmVudEFscGhhID0gYWxwaGE7CisgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZXMgZHIgPSBtRHJhd2FibGVzOworICAgICAgICAgICAgaWYgKGRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoZHIubURyYXdhYmxlTGVmdCAhPSBudWxsKSBkci5tRHJhd2FibGVMZWZ0Lm11dGF0ZSgpLnNldEFscGhhKGFscGhhKTsKKyAgICAgICAgICAgICAgICBpZiAoZHIubURyYXdhYmxlVG9wICE9IG51bGwpIGRyLm1EcmF3YWJsZVRvcC5tdXRhdGUoKS5zZXRBbHBoYShhbHBoYSk7CisgICAgICAgICAgICAgICAgaWYgKGRyLm1EcmF3YWJsZVJpZ2h0ICE9IG51bGwpIGRyLm1EcmF3YWJsZVJpZ2h0Lm11dGF0ZSgpLnNldEFscGhhKGFscGhhKTsKKyAgICAgICAgICAgICAgICBpZiAoZHIubURyYXdhYmxlQm90dG9tICE9IG51bGwpIGRyLm1EcmF3YWJsZUJvdHRvbS5tdXRhdGUoKS5zZXRBbHBoYShhbHBoYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKICAgICAgICAgcmVzdGFydE1hcnF1ZWVJZk5lZWRlZCgpOwogCkBAIC0zOTY4LDYgKzQwMTUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgbVRleHRQYWludC5zZXRDb2xvcihjb2xvcik7CisgICAgICAgIG1UZXh0UGFpbnQuc2V0QWxwaGEobUN1cnJlbnRBbHBoYSk7CiAgICAgICAgIG1UZXh0UGFpbnQuZHJhd2FibGVTdGF0ZSA9IGdldERyYXdhYmxlU3RhdGUoKTsKIAogICAgICAgICBjYW52YXMuc2F2ZSgpOwpAQCAtNDM1Myw4ICs0NDAxLDggQEAKIAogICAgICAgICAgICAgICAgIC8vIEhhcyB0byBiZSBkb25lIG9uIGtleSBkb3duIChhbmQgbm90IG9uIGtleSB1cCkgdG8gY29ycmVjdGx5IGJlIGludGVyY2VwdGVkLgogICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0JBQ0s6Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc0luVGV4dFNlbGVjdGlvbk1vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RvcFRleHRTZWxlY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3Rpb25BY3Rpb25Nb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RvcFNlbGVjdGlvbkFjdGlvbk1vZGUoKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTQ4NTEsNyArNDg5OSw3IEBACiAgICAgICAgICAgICAgICAgbWFrZUJsaW5rKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgY2hlY2tGb3JSZXNpemUoKTsKICAgICB9CiAgICAgCkBAIC00OTQyLDYgKzQ5OTAsOCBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlIEdyYXZpdHkuUklHSFQ6CisgICAgICAgICAgICAgICAgLy8gTm90ZSwgTGF5b3V0IHJlc29sdmVzIEFMSUdOX09QUE9TSVRFIHRvIGxlZnQgb3IKKyAgICAgICAgICAgICAgICAvLyByaWdodCBiYXNlZCBvbiB0aGUgcGFyYWdyYXBoIGRpcmVjdGlvbi4KICAgICAgICAgICAgICAgICBhbGlnbm1lbnQgPSBMYXlvdXQuQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC01MTA2LDYgKzUxNTYsOCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBjb21wcmVzc1RleHQoZmxvYXQgd2lkdGgpIHsKKyAgICAgICAgaWYgKGlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIAogICAgICAgICAvLyBPbmx5IGNvbXByZXNzIHRoZSB0ZXh0IGlmIGl0IGhhc24ndCBiZWVuIGNvbXByZXNzZWQgYnkgdGhlIHByZXZpb3VzIHBhc3MKICAgICAgICAgaWYgKHdpZHRoID4gMC4wZiAmJiBtTGF5b3V0ICE9IG51bGwgJiYgZ2V0TGluZUNvdW50KCkgPT0gMSAmJiAhbVVzZXJTZXRUZXh0U2NhbGVYICYmCiAgICAgICAgICAgICAgICAgbVRleHRQYWludC5nZXRUZXh0U2NhbGVYKCkgPT0gMS4wZikgewpAQCAtNTc2NiwxMSArNTgxOCwxNSBAQAogICAgICAgICBmaW5hbCBpbnQgbGVmdENoYXIgPSBtTGF5b3V0LmdldE9mZnNldEZvckhvcml6b250YWwobGluZSwgaHMpOwogICAgICAgICBmaW5hbCBpbnQgcmlnaHRDaGFyID0gbUxheW91dC5nZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUsIGhzcGFjZStocyk7CiAgICAgICAgIAorICAgICAgICAvLyBsaW5lIG1pZ2h0IGNvbnRhaW4gYmlkaXJlY3Rpb25hbCB0ZXh0CisgICAgICAgIGZpbmFsIGludCBsb3dDaGFyID0gbGVmdENoYXIgPCByaWdodENoYXIgPyBsZWZ0Q2hhciA6IHJpZ2h0Q2hhcjsKKyAgICAgICAgZmluYWwgaW50IGhpZ2hDaGFyID0gbGVmdENoYXIgPiByaWdodENoYXIgPyBsZWZ0Q2hhciA6IHJpZ2h0Q2hhcjsKKwogICAgICAgICBpbnQgbmV3U3RhcnQgPSBzdGFydDsKLSAgICAgICAgaWYgKG5ld1N0YXJ0IDwgbGVmdENoYXIpIHsKLSAgICAgICAgICAgIG5ld1N0YXJ0ID0gbGVmdENoYXI7Ci0gICAgICAgIH0gZWxzZSBpZiAobmV3U3RhcnQgPiByaWdodENoYXIpIHsKLSAgICAgICAgICAgIG5ld1N0YXJ0ID0gcmlnaHRDaGFyOworICAgICAgICBpZiAobmV3U3RhcnQgPCBsb3dDaGFyKSB7CisgICAgICAgICAgICBuZXdTdGFydCA9IGxvd0NoYXI7CisgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhcnQgPiBoaWdoQ2hhcikgeworICAgICAgICAgICAgbmV3U3RhcnQgPSBoaWdoQ2hhcjsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgaWYgKG5ld1N0YXJ0ICE9IHN0YXJ0KSB7CkBAIC02NjAxLDExICs2NjU3LDE0IEBACiAKICAgICAgICAgICAgIGhpZGVJbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIoKTsKICAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgRXh0cmFjdEVkaXRUZXh0KSB7Ci0gICAgICAgICAgICAgICAgLy8gdGVybWluYXRlVGV4dFNlbGVjdGlvbk1vZGUgd291bGQgcmVtb3ZlIHNlbGVjdGlvbiwgd2hpY2ggd2Ugd2FudCB0byBrZWVwIHdoZW4KKyAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hdGVUZXh0U2VsZWN0aW9uTW9kZSByZW1vdmVzIHNlbGVjdGlvbiwgd2hpY2ggd2Ugd2FudCB0byBrZWVwIHdoZW4KICAgICAgICAgICAgICAgICAvLyBFeHRyYWN0RWRpdFRleHQgZ29lcyBvdXQgb2YgZm9jdXMuCi0gICAgICAgICAgICAgICAgbUlzSW5UZXh0U2VsZWN0aW9uTW9kZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBzZWxTdGFydCA9IGdldFNlbGVjdGlvblN0YXJ0KCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHNlbEVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOworICAgICAgICAgICAgICAgIHRlcm1pbmF0ZVNlbGVjdGlvbkFjdGlvbk1vZGUoKTsKKyAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBzZWxTdGFydCwgc2VsRW5kKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGVybWluYXRlVGV4dFNlbGVjdGlvbk1vZGUoKTsKKyAgICAgICAgICAgICAgICB0ZXJtaW5hdGVTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1MYXN0VG91Y2hPZmZzZXQgPSAtMTsKQEAgLTY3MDksNyArNjc2OCw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBUYXBwaW5nIG91dHNpZGUgc3RvcHMgc2VsZWN0aW9uIG1vZGUsIGlmIGFueQotICAgICAgICAgICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOworICAgICAgICAgICAgICAgIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CiAKICAgICAgICAgICAgICAgICBpZiAobUluc2VydGlvblBvaW50Q3Vyc29yQ29udHJvbGxlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIuc2hvdygpOwpAQCAtNjcyMiwxMyArNjc4MSwxMyBAQAogCiAgICAgY2xhc3MgQ29tbWl0U2VsZWN0aW9uUmVjZWl2ZXIgZXh0ZW5kcyBSZXN1bHRSZWNlaXZlciB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1QcmV2U3RhcnQsIG1QcmV2RW5kOwotICAgICAgICAKKwogICAgICAgICBwdWJsaWMgQ29tbWl0U2VsZWN0aW9uUmVjZWl2ZXIoaW50IHByZXZTdGFydCwgaW50IHByZXZFbmQpIHsKICAgICAgICAgICAgIHN1cGVyKGdldEhhbmRsZXIoKSk7CiAgICAgICAgICAgICBtUHJldlN0YXJ0ID0gcHJldlN0YXJ0OwogICAgICAgICAgICAgbVByZXZFbmQgPSBwcmV2RW5kOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblJlY2VpdmVSZXN1bHQoaW50IHJlc3VsdENvZGUsIEJ1bmRsZSByZXN1bHREYXRhKSB7CiAgICAgICAgICAgICAvLyBJZiB0aGlzIHRhcCB3YXMgYWN0dWFsbHkgdXNlZCB0byBzaG93IHRoZSBJTU0sIGxlYXZlIGN1cnNvciBvciBzZWxlY3Rpb24gdW5jaGFuZ2VkCkBAIC02NzQwLDEyICs2Nzk5LDEyIEBACiAgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKW1UZXh0LCBzdGFydCwgZW5kKTsKIAogICAgICAgICAgICAgICAgIGlmIChoYXNTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgICAgICAgICBzdGFydFRleHRTZWxlY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgewogICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXZlbnQuZ2V0QWN0aW9uTWFza2VkKCk7CkBAIC02ODQ3LDcgKzY5MDYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gU3RvcCBzZWxlY3Rpb24gbW9kZSBpZiB0aGUgY29udHJvbGxlciBiZWNvbWVzIHVuYXZhaWxhYmxlLgotICAgICAgICAgICAgc3RvcFRleHRTZWxlY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICBzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgICAgICAgICAgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciA9IG51bGw7CiAgICAgICAgIH0KICAgICB9CkBAIC02OTg3LDggKzcwNDYsMTAgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBpbnQgY29tcHV0ZUhvcml6b250YWxTY3JvbGxSYW5nZSgpIHsKLSAgICAgICAgaWYgKG1MYXlvdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBtTGF5b3V0LmdldFdpZHRoKCk7CisgICAgICAgIGlmIChtTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtU2luZ2xlTGluZSAmJiAobUdyYXZpdHkgJiBHcmF2aXR5LkhPUklaT05UQUxfR1JBVklUWV9NQVNLKSA9PSBHcmF2aXR5LkxFRlQgPworICAgICAgICAgICAgICAgICAgICAoaW50KSBtTGF5b3V0LmdldExpbmVXaWR0aCgwKSA6IG1MYXlvdXQuZ2V0V2lkdGgoKTsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBzdXBlci5jb21wdXRlSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCk7CiAgICAgfQpAQCAtNzEzNSw3ICs3MTk2LDcgQEAKICAgICAgICAgICAgICAgICBnZXRTZWxlY3Rpb25TdGFydCgpID49IDAgJiYKICAgICAgICAgICAgICAgICBnZXRTZWxlY3Rpb25FbmQoKSA+PSAwICYmCiAgICAgICAgICAgICAgICAgKChDbGlwYm9hcmRNYW5hZ2VyKWdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0xJUEJPQVJEX1NFUlZJQ0UpKS4KLSAgICAgICAgICAgICAgICBoYXNUZXh0KCkpOworICAgICAgICAgICAgICAgIGhhc1ByaW1hcnlDbGlwKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzIyNyw3ICs3Mjg4LDcgQEAKICAgICAgICAgLy8gVHdvIGludHMgcGFja2VkIGluIGEgbG9uZwogICAgICAgICByZXR1cm4gKCgobG9uZykgc3RhcnQpIDw8IDMyKSB8IGVuZDsKICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIHZvaWQgc2VsZWN0Q3VycmVudFdvcmQoKSB7CiAgICAgICAgIC8vIEluIGNhc2Ugc2VsZWN0aW9uIG1vZGUgaXMgc3RhcnRlZCBhZnRlciBhbiBvcmllbnRhdGlvbiBjaGFuZ2Ugb3IgYWZ0ZXIgYSBzZWxlY3QgYWxsLAogICAgICAgICAvLyB1c2UgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGluc3RlYWQgb2YgY3JlYXRpbmcgb25lCkBAIC03MjQyLDcgKzczMDMsNTAgQEAKICAgICAgICAgICAgICgoU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyKSBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyKTsKICAgICAgICAgaW50IG1pbk9mZnNldCA9IHNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlci5nZXRNaW5Ub3VjaE9mZnNldCgpOwogICAgICAgICBpbnQgbWF4T2Zmc2V0ID0gc2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyLmdldE1heFRvdWNoT2Zmc2V0KCk7Ci0gICAgICAgIAorCisgICAgICAgIGlmIChtaW5PZmZzZXQgPT0gbWF4T2Zmc2V0KSB7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obWluT2Zmc2V0LCBtVHJhbnNmb3JtZWQubGVuZ3RoKCkpKTsKKworICAgICAgICAgICAgLy8gVG9sZXJhbmNlLCBudW1iZXIgb2YgY2hhcmF0ZXJzIGFyb3VuZCB0YXBwZWQgcG9zaXRpb24KKyAgICAgICAgICAgIGZpbmFsIGludCByYW5nZSA9IDE7CisgICAgICAgICAgICBmaW5hbCBpbnQgbWF4ID0gbVRyYW5zZm9ybWVkLmxlbmd0aCgpIC0gMTsKKworICAgICAgICAgICAgLy8gJ1NtYXJ0JyB3b3JkIHNlbGVjdGlvbjogZGV0ZWN0IHBvc2l0aW9uIGJldHdlZW4gd29yZHMKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAtcmFuZ2U7IGkgPD0gcmFuZ2U7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG9mZnNldCArIGk7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPD0gbWF4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNTcGFjZUNoYXIobVRyYW5zZm9ybWVkLmNoYXJBdChpbmRleCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWxlY3QgY3VycmVudCBzcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQgPSBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkVuZCA9IHNlbGVjdGlvblN0YXJ0ICsgMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0ZW5kIHNlbGVjdGlvbiB0byBtYXhpbXVtIHNwYWNlIHJhbmdlCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc2VsZWN0aW9uU3RhcnQgPiAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci5pc1NwYWNlQ2hhcihtVHJhbnNmb3JtZWQuY2hhckF0KHNlbGVjdGlvblN0YXJ0IC0gMSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzZWxlY3Rpb25FbmQgPCBtYXggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLmlzU3BhY2VDaGFyKG1UcmFuc2Zvcm1lZC5jaGFyQXQoc2VsZWN0aW9uRW5kKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25FbmQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKSBtVGV4dCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vICdTbWFydCcgd29yZCBzZWxlY3Rpb246IGRldGVjdCBwb3NpdGlvbiBhdCBiZWdpbm5pbmcgb3IgZW5kIG9mIHRleHQuCisgICAgICAgICAgICBpZiAob2Zmc2V0IDw9IHJhbmdlKSB7CisgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKSBtVGV4dCwgMCwgMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9mZnNldCA+PSAobWF4IC0gcmFuZ2UpKSB7CisgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKSBtVGV4dCwgbWF4ICsgMSwgbWF4ICsgMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgbG9uZyB3b3JkTGltaXRzID0gZ2V0V29yZExpbWl0c0F0KG1pbk9mZnNldCk7CiAgICAgICAgIGlmICh3b3JkTGltaXRzID49IDApIHsKICAgICAgICAgICAgIHNlbGVjdGlvblN0YXJ0ID0gKGludCkgKHdvcmRMaW1pdHMgPj4+IDMyKTsKQEAgLTcyNTksMjIgKzczNjMsNyBAQAogCiAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpOwogICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRXb3JkRm9yRGljdGlvbmFyeSgpIHsKLSAgICAgICAgaWYgKG1MYXN0VG91Y2hPZmZzZXQgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQogCi0gICAgICAgIGxvbmcgd29yZExpbWl0cyA9IGdldFdvcmRMaW1pdHNBdChtTGFzdFRvdWNoT2Zmc2V0KTsKLSAgICAgICAgaWYgKHdvcmRMaW1pdHMgPj0gMCkgewotICAgICAgICAgICAgaW50IHN0YXJ0ID0gKGludCkgKHdvcmRMaW1pdHMgPj4+IDMyKTsKLSAgICAgICAgICAgIGludCBlbmQgPSAoaW50KSAod29yZExpbWl0cyAmIDB4MDAwMDAwMDBGRkZGRkZGRkwpOwotICAgICAgICAgICAgcmV0dXJuIG1UcmFuc2Zvcm1lZC5zdWJTZXF1ZW5jZShzdGFydCwgZW5kKS50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hQb3B1bGF0ZUFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgaWYgKCFpc1Nob3duKCkpIHsKQEAgLTczMTYsOTMgKzc0MDUsMzQgQEAKICAgICAgICAgc3VwZXIub25DcmVhdGVDb250ZXh0TWVudShtZW51KTsKICAgICAgICAgYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwogCi0gICAgICAgIGlmIChtSXNJblRleHRTZWxlY3Rpb25Nb2RlKSB7Ci0gICAgICAgICAgICBNZW51SGFuZGxlciBoYW5kbGVyID0gbmV3IE1lbnVIYW5kbGVyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjYW5DdXQoKSkgewotICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX0NVVCwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY3V0KS4KLSAgICAgICAgICAgICAgICAgICAgIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKGhhbmRsZXIpLgotICAgICAgICAgICAgICAgICAgICAgc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCd4Jyk7CisgICAgICAgIE1lbnVIYW5kbGVyIGhhbmRsZXIgPSBuZXcgTWVudUhhbmRsZXIoKTsKKworICAgICAgICBpZiAobVRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CisgICAgICAgICAgICBpbnQgc2VsU3RhcnQgPSBnZXRTZWxlY3Rpb25TdGFydCgpOworICAgICAgICAgICAgaW50IHNlbEVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOworCisgICAgICAgICAgICBpbnQgbWluID0gTWF0aC5taW4oc2VsU3RhcnQsIHNlbEVuZCk7CisgICAgICAgICAgICBpbnQgbWF4ID0gTWF0aC5tYXgoc2VsU3RhcnQsIHNlbEVuZCk7CisKKyAgICAgICAgICAgIFVSTFNwYW5bXSB1cmxzID0gKChTcGFubmVkKSBtVGV4dCkuZ2V0U3BhbnMobWluLCBtYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTFNwYW4uY2xhc3MpOworICAgICAgICAgICAgaWYgKHVybHMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9DT1BZX1VSTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5jb3B5VXJsKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKKwogICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNhbkNvcHkoKSkgewotICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX0NPUFksIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmNvcHkpLgotICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcikuCi0gICAgICAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ2MnKTsKLSAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjYW5QYXN0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfUEFTVEUsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBhc3RlKS4KLSAgICAgICAgICAgICAgICAgICAgIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKGhhbmRsZXIpLgotICAgICAgICAgICAgICAgICAgICAgc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCd2Jyk7Ci0gICAgICAgICAgICAgICAgYWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgIGlmICghaXNGb2N1c2VkKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNGb2N1c2FibGUoKSAmJiBtSW5wdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2FuQ29weSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZW51SGFuZGxlciBoYW5kbGVyID0gbmV3IE1lbnVIYW5kbGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9DT1BZLCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5jb3B5KS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcikuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgnYycpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVudS5zZXRIZWFkZXJUaXRsZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5lZGl0VGV4dE1lbnVUaXRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL3JldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTWVudUhhbmRsZXIgaGFuZGxlciA9IG5ldyBNZW51SGFuZGxlcigpOwotCi0gICAgICAgICAgICBpZiAoY2FuU2VsZWN0VGV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfU1RBUlRfU0VMRUNUSU5HX1RFWFQsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnNlbGVjdFRleHQpLgotICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfU0VMRUNUX0FMTCwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuc2VsZWN0QWxsKS4KLSAgICAgICAgICAgICAgICAgICAgIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKGhhbmRsZXIpLgotICAgICAgICAgICAgICAgICAgICAgc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCdhJyk7Ci0gICAgICAgICAgICAgICAgYWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNlbFN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKLSAgICAgICAgICAgICAgICBpbnQgc2VsRW5kID0gZ2V0U2VsZWN0aW9uRW5kKCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgbWluID0gTWF0aC5taW4oc2VsU3RhcnQsIHNlbEVuZCk7Ci0gICAgICAgICAgICAgICAgaW50IG1heCA9IE1hdGgubWF4KHNlbFN0YXJ0LCBzZWxFbmQpOwotCi0gICAgICAgICAgICAgICAgVVJMU3BhbltdIHVybHMgPSAoKFNwYW5uZWQpIG1UZXh0KS5nZXRTcGFucyhtaW4sIG1heCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFVSTFNwYW4uY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmICh1cmxzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX0NPUFlfVVJMLCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5jb3B5VXJsKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNhblBhc3RlKCkpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9QQVNURSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucGFzdGUpLgotICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcikuCi0gICAgICAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ3YnKTsKLSAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc0lucHV0TWV0aG9kVGFyZ2V0KCkpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZCgxLCBJRF9TV0lUQ0hfSU5QVVRfTUVUSE9ELCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5pbnB1dE1ldGhvZCkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyB3b3JkID0gZ2V0V29yZEZvckRpY3Rpb25hcnkoKTsKLSAgICAgICAgICAgIGlmICh3b3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZCgxLCBJRF9BRERfVE9fRElDVElPTkFSWSwgMCwKLSAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuYWRkVG9EaWN0aW9uYXJ5LCB3b3JkKSkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gVGhlIGNvbnRleHQgbWVudSBpcyBub3QgZW1wdHksIHdoaWNoIHdpbGwgcHJldmVudCB0aGUgc2VsZWN0aW9uIG1vZGUgZnJvbSBzdGFydGluZy4KKyAgICAgICAgLy8gQWRkIGEgZW50cnkgdG8gc3RhcnQgaXQgaW4gdGhlIGNvbnRleHQgbWVudS4KKyAgICAgICAgLy8gVE9ETyBEb2VzIG5vdCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYSBzdWJjbGFzcyBkb2VzIG5vdCBjYWxsIHN1cGVyLnRoaXNNZXRob2Qgb3IKKyAgICAgICAgLy8gcG9wdWxhdGVzIHRoZSBtZW51IEFGVEVSIHRoaXMgY2FsbC4KKyAgICAgICAgaWYgKG1lbnUuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfU0VMRUNUSU9OX01PREUsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnNlbGVjdFRleHRNb2RlKS4KKyAgICAgICAgICAgIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKGhhbmRsZXIpOworICAgICAgICAgICAgYWRkZWQgPSB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGFkZGVkKSB7CkBAIC03NDE5LDE1ICs3NDQ5LDE0IEBACiAgICAgICAgIHJldHVybiBpbW0gIT0gbnVsbCAmJiBpbW0uaXNBY3RpdmUodGhpcyk7CiAgICAgfQogICAgIAotICAgIC8vIENvbnRleHQgbWVudSBlbnRyaWVzCisgICAgLy8gU2VsZWN0aW9uIGNvbnRleHQgbW9kZQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9TRUxFQ1RfQUxMID0gYW5kcm9pZC5SLmlkLnNlbGVjdEFsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfU1RBUlRfU0VMRUNUSU5HX1RFWFQgPSBhbmRyb2lkLlIuaWQuc3RhcnRTZWxlY3RpbmdUZXh0OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9DVVQgPSBhbmRyb2lkLlIuaWQuY3V0OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9DT1BZID0gYW5kcm9pZC5SLmlkLmNvcHk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX1BBU1RFID0gYW5kcm9pZC5SLmlkLnBhc3RlOworICAgIC8vIENvbnRleHQgbWVudSBlbnRyaWVzCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX0NPUFlfVVJMID0gYW5kcm9pZC5SLmlkLmNvcHlVcmw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX1NXSVRDSF9JTlBVVF9NRVRIT0QgPSBhbmRyb2lkLlIuaWQuc3dpdGNoSW5wdXRNZXRob2Q7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX0FERF9UT19ESUNUSU9OQVJZID0gYW5kcm9pZC5SLmlkLmFkZFRvRGljdGlvbmFyeTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfU0VMRUNUSU9OX01PREUgPSBhbmRyb2lkLlIuaWQuc2VsZWN0VGV4dE1vZGU7CiAKICAgICBwcml2YXRlIGNsYXNzIE1lbnVIYW5kbGVyIGltcGxlbWVudHMgTWVudUl0ZW0uT25NZW51SXRlbUNsaWNrTGlzdGVuZXIgewogICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbk1lbnVJdGVtQ2xpY2soTWVudUl0ZW0gaXRlbSkgewpAQCAtNzQzNywxMSArNzQ2Niw3IEBACiAKICAgICAvKioKICAgICAgKiBDYWxsZWQgd2hlbiBhIGNvbnRleHQgbWVudSBvcHRpb24gZm9yIHRoZSB0ZXh0IHZpZXcgaXMgc2VsZWN0ZWQuICBDdXJyZW50bHkKLSAgICAgKiB0aGlzIHdpbGwgYmUgb25lIG9mOiB7QGxpbmsgYW5kcm9pZC5SLmlkI3NlbGVjdEFsbH0sCi0gICAgICoge0BsaW5rIGFuZHJvaWQuUi5pZCNzdGFydFNlbGVjdGluZ1RleHR9LAotICAgICAqIHtAbGluayBhbmRyb2lkLlIuaWQjY3V0fSwge0BsaW5rIGFuZHJvaWQuUi5pZCNjb3B5fSwKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5SLmlkI3Bhc3RlfSwge0BsaW5rIGFuZHJvaWQuUi5pZCNjb3B5VXJsfSwKLSAgICAgKiBvciB7QGxpbmsgYW5kcm9pZC5SLmlkI3N3aXRjaElucHV0TWV0aG9kfS4KKyAgICAgKiB0aGlzIHdpbGwgYmUge0BsaW5rIGFuZHJvaWQuUi5pZCNjb3B5VXJsfSBvciB7QGxpbmsgYW5kcm9pZC5SLmlkI3NlbGVjdFRleHRNb2RlfS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBvblRleHRDb250ZXh0TWVudUl0ZW0oaW50IGlkKSB7CiAgICAgICAgIGludCBtaW4gPSAwOwpAQCAtNzQ1NSw5MyArNzQ4MCwzMSBAQAogICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgoMCwgTWF0aC5tYXgoc2VsU3RhcnQsIHNlbEVuZCkpOwogICAgICAgICB9CiAKLSAgICAgICAgQ2xpcGJvYXJkTWFuYWdlciBjbGlwID0gKENsaXBib2FyZE1hbmFnZXIpZ2V0Q29udGV4dCgpCisgICAgICAgIENsaXBib2FyZE1hbmFnZXIgY2xpcGJvYXJkID0gKENsaXBib2FyZE1hbmFnZXIpZ2V0Q29udGV4dCgpCiAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DTElQQk9BUkRfU0VSVklDRSk7CiAKICAgICAgICAgc3dpdGNoIChpZCkgewotICAgICAgICAgICAgY2FzZSBJRF9TRUxFQ1RfQUxMOgotICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIDAsIG1UZXh0Lmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICBzdGFydFRleHRTZWxlY3Rpb25Nb2RlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgIGNhc2UgSURfU1RBUlRfU0VMRUNUSU5HX1RFWFQ6Ci0gICAgICAgICAgICAgICAgc3RhcnRUZXh0U2VsZWN0aW9uTW9kZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBjYXNlIElEX0NVVDogICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY2xpcC5zZXRUZXh0KG1UcmFuc2Zvcm1lZC5zdWJTZXF1ZW5jZShtaW4sIG1heCkpOwotICAgICAgICAgICAgICAgICgoRWRpdGFibGUpIG1UZXh0KS5kZWxldGUobWluLCBtYXgpOwotICAgICAgICAgICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBjYXNlIElEX0NPUFk6Ci0gICAgICAgICAgICAgICAgY2xpcC5zZXRUZXh0KG1UcmFuc2Zvcm1lZC5zdWJTZXF1ZW5jZShtaW4sIG1heCkpOwotICAgICAgICAgICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBjYXNlIElEX1BBU1RFOgotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBwYXN0ZSA9IGNsaXAuZ2V0VGV4dCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHBhc3RlICE9IG51bGwgJiYgcGFzdGUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFBhc3RlIGFkZHMvcmVtb3ZlcyBzcGFjZXMgYmVmb3JlIG9yIGFmdGVyIGluc2VydGlvbiBhcyBuZWVkZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc1NwYWNlQ2hhcihwYXN0ZS5jaGFyQXQoMCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWluID4gMCAmJiBDaGFyYWN0ZXIuaXNTcGFjZUNoYXIobVRyYW5zZm9ybWVkLmNoYXJBdChtaW4gLSAxKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUd28gc3BhY2VzIGF0IGJlZ2lubmluZyBvZiBwYXN0ZTogcmVtb3ZlIG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGUpIG1UZXh0KS5yZXBsYWNlKG1pbiAtIDEsIG1pbiwgIiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IG1pbiAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gbWF4IC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW4gPiAwICYmICFDaGFyYWN0ZXIuaXNTcGFjZUNoYXIobVRyYW5zZm9ybWVkLmNoYXJBdChtaW4gLSAxKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBzcGFjZSBhdCBiZWdpbm5pbmcgb2YgcGFzdGU6IGFkZCBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlKSBtVGV4dCkucmVwbGFjZShtaW4sIG1pbiwgIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4gPSBtaW4gKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IG1heCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzU3BhY2VDaGFyKHBhc3RlLmNoYXJBdChwYXN0ZS5sZW5ndGgoKSAtIDEpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heCA8IG1UZXh0Lmxlbmd0aCgpICYmIENoYXJhY3Rlci5pc1NwYWNlQ2hhcihtVHJhbnNmb3JtZWQuY2hhckF0KG1heCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHdvIHNwYWNlcyBhdCBlbmQgb2YgcGFzdGU6IHJlbW92ZSBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlKSBtVGV4dCkucmVwbGFjZShtYXgsIG1heCArIDEsICIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXggPCBtVGV4dC5sZW5ndGgoKSAmJiAhQ2hhcmFjdGVyLmlzU3BhY2VDaGFyKG1UcmFuc2Zvcm1lZC5jaGFyQXQobWF4KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBzcGFjZSBhdCBlbmQgb2YgcGFzdGU6IGFkZCBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlKSBtVGV4dCkucmVwbGFjZShtYXgsIG1heCwgIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIG1heCk7Ci0gICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGUpIG1UZXh0KS5yZXBsYWNlKG1pbiwgbWF4LCBwYXN0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQogICAgICAgICAgICAgY2FzZSBJRF9DT1BZX1VSTDoKKwogICAgICAgICAgICAgICAgIFVSTFNwYW5bXSB1cmxzID0gKChTcGFubmVkKSBtVGV4dCkuZ2V0U3BhbnMobWluLCBtYXgsIFVSTFNwYW4uY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmICh1cmxzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsaXAuc2V0VGV4dCh1cmxzWzBdLmdldFVSTCgpKTsKKyAgICAgICAgICAgICAgICBpZiAodXJscy5sZW5ndGggPj0gMSkgeworICAgICAgICAgICAgICAgICAgICBDbGlwRGF0YSBjbGlwID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHVybHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UodXJsc1swXS5nZXRVUkwoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcCA9IENsaXBEYXRhLm5ld1Jhd1VyaShudWxsLCBudWxsLCB1cmkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwLmFkZEl0ZW0obmV3IENsaXBEYXRhLkl0ZW0odXJpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xpcGJvYXJkLnNldFByaW1hcnlDbGlwKGNsaXApOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogCi0gICAgICAgICAgICBjYXNlIElEX1NXSVRDSF9JTlBVVF9NRVRIT0Q6Ci0gICAgICAgICAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IElucHV0TWV0aG9kTWFuYWdlci5wZWVrSW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW1tICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW1tLnNob3dJbnB1dE1ldGhvZFBpY2tlcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgY2FzZSBJRF9BRERfVE9fRElDVElPTkFSWToKLSAgICAgICAgICAgICAgICBTdHJpbmcgd29yZCA9IGdldFdvcmRGb3JEaWN0aW9uYXJ5KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAod29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEludGVudCBpID0gbmV3IEludGVudCgiY29tLmFuZHJvaWQuc2V0dGluZ3MuVVNFUl9ESUNUSU9OQVJZX0lOU0VSVCIpOwotICAgICAgICAgICAgICAgICAgICBpLnB1dEV4dHJhKCJ3b3JkIiwgd29yZCk7Ci0gICAgICAgICAgICAgICAgICAgIGkuc2V0RmxhZ3MoaS5nZXRGbGFncygpIHwgSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwotICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eShpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIElEX1NFTEVDVElPTl9NT0RFOgorICAgICAgICAgICAgICAgIHN0YXJ0U2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogCkBAIC03NTU0LDM1ICs3NTE3LDgxIEBACiAgICAgICAgICAgICBtRWF0VG91Y2hSZWxlYXNlID0gdHJ1ZTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoc3RhcnRTZWxlY3Rpb25BY3Rpb25Nb2RlKCkpIHsKKyAgICAgICAgICAgIHBlcmZvcm1IYXB0aWNGZWVkYmFjayhIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5MT05HX1BSRVNTKTsKKyAgICAgICAgICAgIG1FYXRUb3VjaFJlbGVhc2UgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0VGV4dFNlbGVjdGlvbk1vZGUoKSB7Ci0gICAgICAgIGlmICghbUlzSW5UZXh0U2VsZWN0aW9uTW9kZSkgewotICAgICAgICAgICAgaWYgKG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJUZXh0VmlldyBoYXMgbm8gc2VsZWN0aW9uIGNvbnRyb2xsZXIuIEFjdGlvbiBtb2RlIGNhbmNlbGxlZC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9CisgICAgcHJpdmF0ZSBib29sZWFuIHRvdWNoUG9zaXRpb25Jc0luU2VsZWN0aW9uKCkgeworICAgICAgICBpbnQgc2VsZWN0aW9uU3RhcnQgPSBnZXRTZWxlY3Rpb25TdGFydCgpOworICAgICAgICBpbnQgc2VsZWN0aW9uRW5kID0gZ2V0U2VsZWN0aW9uRW5kKCk7CiAKLSAgICAgICAgICAgIGlmICghcmVxdWVzdEZvY3VzKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlbGVjdEN1cnJlbnRXb3JkKCk7Ci0gICAgICAgICAgICBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyLnNob3coKTsKLSAgICAgICAgICAgIG1Jc0luVGV4dFNlbGVjdGlvbk1vZGUgPSB0cnVlOworICAgICAgICBpZiAoc2VsZWN0aW9uU3RhcnQgPT0gc2VsZWN0aW9uRW5kKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZWN0aW9uU3RhcnQgPiBzZWxlY3Rpb25FbmQpIHsKKyAgICAgICAgICAgIGludCB0bXAgPSBzZWxlY3Rpb25TdGFydDsKKyAgICAgICAgICAgIHNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uRW5kOworICAgICAgICAgICAgc2VsZWN0aW9uRW5kID0gdG1wOworICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKSBtVGV4dCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCk7CisgICAgICAgIH0KKworICAgICAgICBTZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgc2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyID0KKyAgICAgICAgICAgICgoU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyKSBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyKTsKKyAgICAgICAgaW50IG1pbk9mZnNldCA9IHNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlci5nZXRNaW5Ub3VjaE9mZnNldCgpOworICAgICAgICBpbnQgbWF4T2Zmc2V0ID0gc2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyLmdldE1heFRvdWNoT2Zmc2V0KCk7CisKKyAgICAgICAgcmV0dXJuICgobWluT2Zmc2V0ID49IHNlbGVjdGlvblN0YXJ0KSAmJiAobWF4T2Zmc2V0IDwgc2VsZWN0aW9uRW5kKSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogU2FtZSBhcyB7QGxpbmsgI3N0b3BUZXh0U2VsZWN0aW9uTW9kZSgpfSwgZXhjZXB0IHRoYXQgdGhlcmUgaXMgbm8gY3Vyc29yIGNvbnRyb2xsZXIKKyAgICAgKiBQcm92aWRlcyB0aGUgY2FsbGJhY2sgdXNlZCB0byBzdGFydCBhIHNlbGVjdGlvbiBhY3Rpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBjYWxsYmFjayBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBzdGFydCBzZWxlY3Rpb24gbW9kZSwgb3IgbnVsbCBpZiBzZWxlY3Rpb24KKyAgICAgKiBtb2RlIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBBY3Rpb25Nb2RlLkNhbGxiYWNrIGdldEFjdGlvbk1vZGVDYWxsYmFjaygpIHsKKyAgICAgICAgLy8gTG9uZyBwcmVzcyBpbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uCisgICAgICAgIC8vIFNob3VsZCBpbml0aWF0ZSBhIGRyYWcuIFJldHVybiBmYWxzZSwgdG8gcmVseSBvbiBjb250ZXh0IG1lbnUgZm9yIG5vdy4KKyAgICAgICAgaWYgKGNhblNlbGVjdFRleHQoKSAmJiAhdG91Y2hQb3NpdGlvbklzSW5TZWxlY3Rpb24oKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb25BY3Rpb25Nb2RlQ2FsbGJhY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2VsZWN0aW9uIG1vZGUgd2FzIGFjdHVhbGx5IHN0YXJ0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0U2VsZWN0aW9uQWN0aW9uTW9kZSgpIHsKKyAgICAgICAgaWYgKG1TZWxlY3Rpb25BY3Rpb25Nb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFNlbGVjdGlvbiBhY3Rpb24gbW9kZSBpcyBhbHJlYWR5IHN0YXJ0ZWQKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEFjdGlvbk1vZGUuQ2FsbGJhY2sgYWN0aW9uTW9kZUNhbGxiYWNrID0gZ2V0QWN0aW9uTW9kZUNhbGxiYWNrKCk7CisgICAgICAgIGlmIChhY3Rpb25Nb2RlQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbGVjdGlvbkFjdGlvbk1vZGUgPSBzdGFydEFjdGlvbk1vZGUoYWN0aW9uTW9kZUNhbGxiYWNrKTsKKyAgICAgICAgICAgIHJldHVybiBtU2VsZWN0aW9uQWN0aW9uTW9kZSAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhbWUgYXMge0BsaW5rICNzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpfSwgZXhjZXB0IHRoYXQgdGhlcmUgaXMgbm8gY3Vyc29yIGNvbnRyb2xsZXIKICAgICAgKiBmYWRlIG91dCBhbmltYXRpb24uIE5lZWRlZCBzaW5jZSB0aGUgZHJhd2FibGUgYW5kIHRoZWlyIGFscGhhIHZhbHVlcyBhcmUgc2hhcmVkIGJ5IGFsbAogICAgICAqIFRleHRWaWV3cy4gU3dpdGNoaW5nIGZyb20gb25lIFRleHRWaWV3IHRvIGFub3RoZXIgd291bGQgZmFkZSB0aGUgY3Vyc29yIGNvbnRyb2xsZXJzIGluIHRoZQogICAgICAqIG5ldyBvbmUgb3RoZXJ3aXNlLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXJtaW5hdGVUZXh0U2VsZWN0aW9uTW9kZSgpIHsKLSAgICAgICAgc3RvcFRleHRTZWxlY3Rpb25Nb2RlKCk7CisgICAgcHJpdmF0ZSB2b2lkIHRlcm1pbmF0ZVNlbGVjdGlvbkFjdGlvbk1vZGUoKSB7CisgICAgICAgIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CiAgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIFNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciBzZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgPQogICAgICAgICAgICAgICAgIChTZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIpIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXI7CkBAIC03NTkwLDE0ICs3NTk5LDE0NiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpIHsKLSAgICAgICAgaWYgKG1Jc0luVGV4dFNlbGVjdGlvbk1vZGUpIHsKLSAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIGdldFNlbGVjdGlvbkVuZCgpKTsKKyAgICBwcml2YXRlIHZvaWQgc3RvcFNlbGVjdGlvbkFjdGlvbk1vZGUoKSB7CisgICAgICAgIGlmIChtU2VsZWN0aW9uQWN0aW9uTW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtU2VsZWN0aW9uQWN0aW9uTW9kZS5maW5pc2goKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2VsZWN0aW9uQWN0aW9uTW9kZUNhbGxiYWNrIGltcGxlbWVudHMgQWN0aW9uTW9kZS5DYWxsYmFjayB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICAgICAgaWYgKG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJUZXh0VmlldyBoYXMgbm8gc2VsZWN0aW9uIGNvbnRyb2xsZXIuIEFjdGlvbiBtb2RlIGNhbmNlbGxlZC4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghcmVxdWVzdEZvY3VzKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1vZGUuc2V0VGl0bGUobUNvbnRleHQuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnRleHRTZWxlY3Rpb25DQUJUaXRsZSkpOworICAgICAgICAgICAgbW9kZS5zZXRTdWJ0aXRsZShudWxsKTsKKworICAgICAgICAgICAgc2VsZWN0Q3VycmVudFdvcmQoKTsKKworICAgICAgICAgICAgYm9vbGVhbiBhdExlYXN0T25lID0gZmFsc2U7CisKKyAgICAgICAgICAgIGlmIChjYW5TZWxlY3RUZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9TRUxFQ1RfQUxMLCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zZWxlY3RBbGwpLgorICAgICAgICAgICAgICAgICAgICBzZXRJY29uKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuaWNfbWVudV9zZWxlY3RfYWxsKS4KKyAgICAgICAgICAgICAgICAgICAgc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCdhJyk7CisgICAgICAgICAgICAgICAgYXRMZWFzdE9uZSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjYW5DdXQoKSkgeworICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX0NVVCwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY3V0KS4KKyAgICAgICAgICAgICAgICAgICAgc2V0SWNvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLmljX21lbnVfY3V0KS4KKyAgICAgICAgICAgICAgICAgICAgc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCd4Jyk7CisgICAgICAgICAgICAgICAgYXRMZWFzdE9uZSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjYW5Db3B5KCkpIHsKKyAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9DT1BZLCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5jb3B5KS4KKyAgICAgICAgICAgICAgICAgICAgc2V0SWNvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLmljX21lbnVfY29weSkuCisgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgnYycpOworICAgICAgICAgICAgICAgIGF0TGVhc3RPbmUgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2FuUGFzdGUoKSkgeworICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1BBU1RFLCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wYXN0ZSkuCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRJY29uKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuaWNfbWVudV9wYXN0ZSkuCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ3YnKTsKKyAgICAgICAgICAgICAgICBhdExlYXN0T25lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGF0TGVhc3RPbmUpIHsKKyAgICAgICAgICAgICAgICBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyLnNob3coKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQWN0aW9uSXRlbUNsaWNrZWQoQWN0aW9uTW9kZSBtb2RlLCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgaXRlbUlkID0gaXRlbS5nZXRJdGVtSWQoKTsKKworICAgICAgICAgICAgaWYgKGl0ZW1JZCA9PSBJRF9TRUxFQ1RfQUxMKSB7CisgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKSBtVGV4dCwgMCwgbVRleHQubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBjb250cm9sbGVyIHBvc2l0aW9ucyBhZnRlciBzZWxlY3Rpb24gY2hhbmdlLgorICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlci5zaG93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDbGlwYm9hcmRNYW5hZ2VyIGNsaXBib2FyZCA9IChDbGlwYm9hcmRNYW5hZ2VyKSBnZXRDb250ZXh0KCkuCisgICAgICAgICAgICAgICAgICAgIGdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DTElQQk9BUkRfU0VSVklDRSk7CisKKyAgICAgICAgICAgIGludCBtaW4gPSAwOworICAgICAgICAgICAgaW50IG1heCA9IG1UZXh0Lmxlbmd0aCgpOworCisgICAgICAgICAgICBpZiAoaXNGb2N1c2VkKCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2VsU3RhcnQgPSBnZXRTZWxlY3Rpb25TdGFydCgpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBzZWxFbmQgPSBnZXRTZWxlY3Rpb25FbmQoKTsKKworICAgICAgICAgICAgICAgIG1pbiA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNlbFN0YXJ0LCBzZWxFbmQpKTsKKyAgICAgICAgICAgICAgICBtYXggPSBNYXRoLm1heCgwLCBNYXRoLm1heChzZWxTdGFydCwgc2VsRW5kKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoaXRlbS5nZXRJdGVtSWQoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgSURfUEFTVEU6CisgICAgICAgICAgICAgICAgICAgIENsaXBEYXRhIGNsaXAgPSBjbGlwYm9hcmQuZ2V0UHJpbWFyeUNsaXAoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkaWRmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGNsaXAuZ2V0SXRlbUNvdW50KCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBwYXN0ZSA9IGNsaXAuZ2V0SXRlbShpKS5jb2VyY2VUb1RleHQoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRpZGZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBtYXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZSkgbVRleHQpLnJlcGxhY2UobWluLCBtYXgsIHBhc3RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGUpIG1UZXh0KS5pbnNlcnQoZ2V0U2VsZWN0aW9uRW5kKCksICJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZSkgbVRleHQpLmluc2VydChnZXRTZWxlY3Rpb25FbmQoKSwgcGFzdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcFNlbGVjdGlvbkFjdGlvbk1vZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAgICAgY2FzZSBJRF9DVVQ6CisgICAgICAgICAgICAgICAgICAgIGNsaXBib2FyZC5zZXRQcmltYXJ5Q2xpcChDbGlwRGF0YS5uZXdQbGFpblRleHQobnVsbCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHJhbnNmb3JtZWQuc3ViU2VxdWVuY2UobWluLCBtYXgpKSk7CisgICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGUpIG1UZXh0KS5kZWxldGUobWluLCBtYXgpOworICAgICAgICAgICAgICAgICAgICBzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGNhc2UgSURfQ09QWToKKyAgICAgICAgICAgICAgICAgICAgY2xpcGJvYXJkLnNldFByaW1hcnlDbGlwKENsaXBEYXRhLm5ld1BsYWluVGV4dChudWxsLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFuc2Zvcm1lZC5zdWJTZXF1ZW5jZShtaW4sIG1heCkpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcFNlbGVjdGlvbkFjdGlvbk1vZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSkgeworICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKSBtVGV4dCwgZ2V0U2VsZWN0aW9uU3RhcnQoKSk7CiAgICAgICAgICAgICBpZiAobVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlci5oaWRlKCk7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Jc0luVGV4dFNlbGVjdGlvbk1vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgIG1TZWxlY3Rpb25BY3Rpb25Nb2RlID0gbnVsbDsKICAgICAgICAgfQogICAgIH0KIApAQCAtODA0OCw3ICs4MTg5LDcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBoaWRlQ29udHJvbGxlcnMoKSB7CiAgICAgICAgIGhpZGVJbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIoKTsKLSAgICAgICAgc3RvcFRleHRTZWxlY3Rpb25Nb2RlKCk7CisgICAgICAgIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBpbnQgZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChpbnQgbGluZSwgaW50IHgpIHsKQEAgLTgxMTEsNyArODI1Miw4IEBACiAgICAgICAgIHJldHVybiBnZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUsIHgpOwogICAgIH0KIAotICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5KGNhdGVnb3J5ID0gInRleHQiKQogICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlICAgICAgICAgICAgbVRleHQ7CiAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgICAgICAgICAgICBtVHJhbnNmb3JtZWQ7CiAgICAgcHJpdmF0ZSBCdWZmZXJUeXBlICAgICAgICAgICAgICBtQnVmZmVyVHlwZSA9IEJ1ZmZlclR5cGUuTk9STUFMOwpAQCAtODE0Miw3ICs4Mjg0LDcgQEAKICAgICAvLyBDdXJzb3IgQ29udHJvbGxlcnMuIE51bGwgd2hlbiBkaXNhYmxlZC4KICAgICBwcml2YXRlIEN1cnNvckNvbnRyb2xsZXIgICAgICAgIG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXI7CiAgICAgcHJpdmF0ZSBDdXJzb3JDb250cm9sbGVyICAgICAgICBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyOwotICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgbUlzSW5UZXh0U2VsZWN0aW9uTW9kZSA9IGZhbHNlOworICAgIHByaXZhdGUgQWN0aW9uTW9kZSAgICAgICAgICAgICAgbVNlbGVjdGlvbkFjdGlvbk1vZGU7CiAgICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoT2Zmc2V0ID0gLTE7CiAgICAgLy8gQ3JlYXRlZCBvbmNlIGFuZCBzaGFyZWQgYnkgZGlmZmVyZW50IEN1cnNvckNvbnRyb2xsZXIgaGVscGVyIG1ldGhvZHMuCiAgICAgLy8gT25seSBvbmUgY3Vyc29yIGNvbnRyb2xsZXIgaXMgYWN0aXZlIGF0IGFueSB0aW1lIHdoaWNoIHByZXZlbnQgcmFjZSBjb25kaXRpb25zLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdBbmltYXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdBbmltYXRvci5qYXZhCmluZGV4IDkwN2NmYjMuLjdiNjY4OTMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9WaWV3QW5pbWF0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0FuaW1hdG9yLmphdmEKQEAgLTMxLDExICszMSwxMyBAQAogICoKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ZpZXdBbmltYXRvcl9pbkFuaW1hdGlvbgogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld0FuaW1hdG9yX291dEFuaW1hdGlvbgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld0FuaW1hdG9yX2FuaW1hdGVGaXJzdFZpZXcKICAqLwogcHVibGljIGNsYXNzIFZpZXdBbmltYXRvciBleHRlbmRzIEZyYW1lTGF5b3V0IHsKIAogICAgIGludCBtV2hpY2hDaGlsZCA9IDA7CiAgICAgYm9vbGVhbiBtRmlyc3RUaW1lID0gdHJ1ZTsKKwogICAgIGJvb2xlYW4gbUFuaW1hdGVGaXJzdFRpbWUgPSB0cnVlOwogCiAgICAgQW5pbWF0aW9uIG1JbkFuaW1hdGlvbjsKQEAgLTU5LDYgKzYxLDEwIEBACiAgICAgICAgIGlmIChyZXNvdXJjZSA+IDApIHsKICAgICAgICAgICAgIHNldE91dEFuaW1hdGlvbihjb250ZXh0LCByZXNvdXJjZSk7CiAgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGZsYWcgPSBhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld0FuaW1hdG9yX2FuaW1hdGVGaXJzdFZpZXcsIHRydWUpOworICAgICAgICBzZXRBbmltYXRlRmlyc3RWaWV3KGZsYWcpOworCiAgICAgICAgIGEucmVjeWNsZSgpOwogCiAgICAgICAgIGluaXRWaWV3QW5pbWF0b3IoY29udGV4dCwgYXR0cnMpOwpAQCAtODQsMTAgKzkwLDEwIEBACiAgICAgICAgIHNldE1lYXN1cmVBbGxDaGlsZHJlbihtZWFzdXJlQWxsQ2hpbGRyZW4pOwogICAgICAgICBhLnJlY3ljbGUoKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBTZXRzIHdoaWNoIGNoaWxkIHZpZXcgd2lsbCBiZSBkaXNwbGF5ZWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gd2hpY2hDaGlsZCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHZpZXcgdG8gZGlzcGxheQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXllZENoaWxkKGludCB3aGljaENoaWxkKSB7CkBAIC0xMDUsMTQgKzExMSwxNCBAQAogICAgICAgICAgICAgcmVxdWVzdEZvY3VzKEZPQ1VTX0ZPUldBUkQpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgY2hpbGQgdmlldy4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERpc3BsYXllZENoaWxkKCkgewogICAgICAgICByZXR1cm4gbVdoaWNoQ2hpbGQ7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogTWFudWFsbHkgc2hvd3MgdGhlIG5leHQgY2hpbGQuCiAgICAgICovCkBAIC0xMjgsNiArMTM0LDM1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2hvd3Mgb25seSB0aGUgc3BlY2lmaWVkIGNoaWxkLiBUaGUgb3RoZXIgZGlzcGxheXMgVmlld3MgZXhpdCB0aGUgc2NyZWVuLAorICAgICAqIG9wdGlvbmFsbHkgd2l0aCB0aGUgd2l0aCB0aGUge0BsaW5rICNnZXRPdXRBbmltYXRpb24oKSBvdXQgYW5pbWF0aW9ufSBhbmQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIGNoaWxkIGVudGVycyB0aGUgc2NyZWVuLCBvcHRpb25hbGx5IHdpdGggdGhlCisgICAgICoge0BsaW5rICNnZXRJbkFuaW1hdGlvbigpIGluIGFuaW1hdGlvbn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGRJbmRleCBUaGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIHNob3duLgorICAgICAqIEBwYXJhbSBhbmltYXRlIFdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgaW4gYW5kIG91dCBhbmltYXRpb25zLCBkZWZhdWx0cworICAgICAqICAgICAgICAgICAgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICB2b2lkIHNob3dPbmx5KGludCBjaGlsZEluZGV4LCBib29sZWFuIGFuaW1hdGUpIHsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgaWYgKGkgPT0gY2hpbGRJbmRleCkgeworICAgICAgICAgICAgICAgIGlmIChhbmltYXRlICYmIG1JbkFuaW1hdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0YXJ0QW5pbWF0aW9uKG1JbkFuaW1hdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoaWxkLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICBtRmlyc3RUaW1lID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChhbmltYXRlICYmIG1PdXRBbmltYXRpb24gIT0gbnVsbCAmJiBjaGlsZC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0YXJ0QW5pbWF0aW9uKG1PdXRBbmltYXRpb24pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQuZ2V0QW5pbWF0aW9uKCkgPT0gbUluQW5pbWF0aW9uKQorICAgICAgICAgICAgICAgICAgICBjaGlsZC5jbGVhckFuaW1hdGlvbigpOworICAgICAgICAgICAgICAgIGNoaWxkLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKICAgICAgKiBTaG93cyBvbmx5IHRoZSBzcGVjaWZpZWQgY2hpbGQuIFRoZSBvdGhlciBkaXNwbGF5cyBWaWV3cyBleGl0IHRoZSBzY3JlZW4KICAgICAgKiB3aXRoIHRoZSB7QGxpbmsgI2dldE91dEFuaW1hdGlvbigpIG91dCBhbmltYXRpb259IGFuZCB0aGUgc3BlY2lmaWVkIGNoaWxkCiAgICAgICogZW50ZXJzIHRoZSBzY3JlZW4gd2l0aCB0aGUge0BsaW5rICNnZXRJbkFuaW1hdGlvbigpIGluIGFuaW1hdGlvbn0uCkBAIC0xMzUsMjQgKzE3MCw4IEBACiAgICAgICogQHBhcmFtIGNoaWxkSW5kZXggVGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBzaG93bi4KICAgICAgKi8KICAgICB2b2lkIHNob3dPbmx5KGludCBjaGlsZEluZGV4KSB7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdldENoaWxkQ291bnQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gY2hlY2tGb3JGaXJzdCA9ICghbUZpcnN0VGltZSB8fCBtQW5pbWF0ZUZpcnN0VGltZSk7Ci0gICAgICAgICAgICBpZiAoaSA9PSBjaGlsZEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrRm9yRmlyc3QgJiYgbUluQW5pbWF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RhcnRBbmltYXRpb24obUluQW5pbWF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hpbGQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1GaXJzdFRpbWUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrRm9yRmlyc3QgJiYgbU91dEFuaW1hdGlvbiAhPSBudWxsICYmIGNoaWxkLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RhcnRBbmltYXRpb24obU91dEFuaW1hdGlvbik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5nZXRBbmltYXRpb24oKSA9PSBtSW5BbmltYXRpb24pCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkLmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY2hpbGQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGZpbmFsIGJvb2xlYW4gYW5pbWF0ZSA9ICghbUZpcnN0VGltZSB8fCBtQW5pbWF0ZUZpcnN0VGltZSk7CisgICAgICAgIHNob3dPbmx5KGNoaWxkSW5kZXgsIGFuaW1hdGUpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdGbGlwcGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0ZsaXBwZXIuamF2YQppbmRleCA4MDM0OTYxLi5jNmY2ZTgxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0ZsaXBwZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0ZsaXBwZXIuamF2YQpAQCAtNzUsNyArNzUsNyBAQAogICAgICAgICAgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoSW50ZW50LkFDVElPTl9VU0VSX1BSRVNFTlQuZXF1YWxzKGFjdGlvbikpIHsKICAgICAgICAgICAgICAgICBtVXNlclByZXNlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVSdW5uaW5nKGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH07CkBAIC0xMDksNyArMTA5LDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBvbldpbmRvd1Zpc2liaWxpdHlDaGFuZ2VkKGludCB2aXNpYmlsaXR5KSB7CiAgICAgICAgIHN1cGVyLm9uV2luZG93VmlzaWJpbGl0eUNoYW5nZWQodmlzaWJpbGl0eSk7CiAgICAgICAgIG1WaXNpYmxlID0gdmlzaWJpbGl0eSA9PSBWSVNJQkxFOwotICAgICAgICB1cGRhdGVSdW5uaW5nKCk7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcoZmFsc2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTQ0LDEwICsxNDQsMjIgQEAKICAgICAgKiBvbiB7QGxpbmsgI21SdW5uaW5nfSBhbmQge0BsaW5rICNtVmlzaWJsZX0gc3RhdGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJ1bm5pbmcoKSB7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgbWV0aG9kIHRvIHN0YXJ0IG9yIHN0b3AgZGlzcGF0Y2hpbmcgZmxpcCB7QGxpbmsgTWVzc2FnZX0gYmFzZWQKKyAgICAgKiBvbiB7QGxpbmsgI21SdW5uaW5nfSBhbmQge0BsaW5rICNtVmlzaWJsZX0gc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmxpcE5vdyBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRvIGV4ZWN1dGUgdGhlIGFuaW1hdGlvbiBub3csIGluCisgICAgICogICAgICAgICAgICBhZGRpdGlvbiB0byBxdWV1aW5nIGZ1dHVyZSBmbGlwcy4gSWYgb21pdHRlZCwgZGVmYXVsdHMgdG8KKyAgICAgKiAgICAgICAgICAgIHRydWUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJ1bm5pbmcoYm9vbGVhbiBmbGlwTm93KSB7CiAgICAgICAgIGJvb2xlYW4gcnVubmluZyA9IG1WaXNpYmxlICYmIG1TdGFydGVkICYmIG1Vc2VyUHJlc2VudDsKICAgICAgICAgaWYgKHJ1bm5pbmcgIT0gbVJ1bm5pbmcpIHsKICAgICAgICAgICAgIGlmIChydW5uaW5nKSB7Ci0gICAgICAgICAgICAgICAgc2hvd09ubHkobVdoaWNoQ2hpbGQpOworICAgICAgICAgICAgICAgIHNob3dPbmx5KG1XaGljaENoaWxkLCBmbGlwTm93KTsKICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRkxJUF9NU0cpOwogICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtc2csIG1GbGlwSW50ZXJ2YWwpOwogICAgICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9ab29tQnV0dG9uc0NvbnRyb2xsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9ab29tQnV0dG9uc0NvbnRyb2xsZXIuamF2YQppbmRleCAzZGY0MTlhLi40NTBjOTY2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvWm9vbUJ1dHRvbnNDb250cm9sbGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1pvb21CdXR0b25zQ29udHJvbGxlci5qYXZhCkBAIC02Niw4ICs2Niw5IEBACiAgKiB7QGxpbmsgI3NldFpvb21JbkVuYWJsZWQoYm9vbGVhbil9IGFuZCB7QGxpbmsgI3NldFpvb21PdXRFbmFibGVkKGJvb2xlYW4pfS4KICAqIDxwPgogICogSWYgeW91IGFyZSB1c2luZyB0aGlzIHdpdGggYSBjdXN0b20gVmlldywgcGxlYXNlIGNhbGwKLSAqIHtAbGluayAjc2V0VmlzaWJsZShib29sZWFuKSBzZXRWaXNpYmxlKGZhbHNlKX0gZnJvbSB0aGUKLSAqIHtAbGluayBWaWV3I29uRGV0YWNoZWRGcm9tV2luZG93fS4KKyAqIHtAbGluayAjc2V0VmlzaWJsZShib29sZWFuKSBzZXRWaXNpYmxlKGZhbHNlKX0gZnJvbQorICoge0BsaW5rIFZpZXcjb25EZXRhY2hlZEZyb21XaW5kb3d9IGFuZCBmcm9tIHtAbGluayBWaWV3I29uVmlzaWJpbGl0eUNoYW5nZWR9CisgKiB3aGVuIDxjb2RlPnZpc2liaWxpdHkgIT0gVmlldy5WSVNJQkxFPC9jb2RlPi4KICAqCiAgKi8KIHB1YmxpYyBjbGFzcyBab29tQnV0dG9uc0NvbnRyb2xsZXIgaW1wbGVtZW50cyBWaWV3Lk9uVG91Y2hMaXN0ZW5lciB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FjdGlvbkJhckltcGwuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvQWN0aW9uQmFySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMDI5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FjdGlvbkJhckltcGwuamF2YQpAQCAtMCwwICsxLDU2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51UG9wdXBIZWxwZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LlN1Yk1lbnVCdWlsZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJDb250ZXh0VmlldzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldzsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGlvbkJhcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lckFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlld0FuaW1hdG9yOworCitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogQWN0aW9uQmFySW1wbCBpcyB0aGUgQWN0aW9uQmFyIGltcGxlbWVudGF0aW9uIHVzZWQKKyAqIGJ5IGRldmljZXMgb2YgYWxsIHNjcmVlbiBzaXplcy4gSWYgaXQgZGV0ZWN0cyBhIGNvbXBhdGlibGUgZGVjb3IsCisgKiBpdCB3aWxsIHNwbGl0IGNvbnRleHR1YWwgbW9kZXMgYWNyb3NzIGJvdGggdGhlIEFjdGlvbkJhclZpZXcgYXQKKyAqIHRoZSB0b3Agb2YgdGhlIHNjcmVlbiBhbmQgYSBob3Jpem9udGFsIExpbmVhckxheW91dCBhdCB0aGUgYm90dG9tCisgKiB3aGljaCBpcyBub3JtYWxseSBoaWRkZW4uCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25CYXJJbXBsIGV4dGVuZHMgQWN0aW9uQmFyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9STUFMX1ZJRVcgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05URVhUX1ZJRVcgPSAxOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJfU1dJVENIX1NIT1dfSElERSA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQl9TV0lUQ0hfQUREX1JFTU9WRSA9IDE7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBBY3Rpdml0eSBtQWN0aXZpdHk7CisgICAgcHJpdmF0ZSBEaWFsb2cgbURpYWxvZzsKKworICAgIHByaXZhdGUgVmlld0FuaW1hdG9yIG1BbmltYXRvclZpZXc7CisgICAgcHJpdmF0ZSBBY3Rpb25CYXJWaWV3IG1BY3Rpb25WaWV3OworICAgIHByaXZhdGUgQWN0aW9uQmFyQ29udGV4dFZpZXcgbVVwcGVyQ29udGV4dFZpZXc7CisgICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbUxvd2VyQ29udGV4dFZpZXc7CisKKyAgICBwcml2YXRlIEFycmF5TGlzdDxUYWJJbXBsPiBtVGFicyA9IG5ldyBBcnJheUxpc3Q8VGFiSW1wbD4oKTsKKworICAgIHByaXZhdGUgaW50IG1UYWJDb250YWluZXJWaWV3SWQgPSBhbmRyb2lkLlIuaWQuY29udGVudDsKKyAgICBwcml2YXRlIFRhYkltcGwgbVNlbGVjdGVkVGFiOworICAgIHByaXZhdGUgaW50IG1UYWJTd2l0Y2hNb2RlID0gVEFCX1NXSVRDSF9BRERfUkVNT1ZFOworICAgIAorICAgIHByaXZhdGUgQWN0aW9uTW9kZSBtQWN0aW9uTW9kZTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVYVF9ESVNQTEFZX05PUk1BTCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRFWFRfRElTUExBWV9TUExJVCA9IDE7CisgICAgCisgICAgcHJpdmF0ZSBpbnQgbUNvbnRleHREaXNwbGF5TW9kZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtQ2xvc2luZ0NvbnRleHQ7CisKKyAgICBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICBmaW5hbCBSdW5uYWJsZSBtQ2xvc2VDb250ZXh0ID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBtVXBwZXJDb250ZXh0Vmlldy5jbG9zZU1vZGUoKTsKKyAgICAgICAgICAgIGlmIChtTG93ZXJDb250ZXh0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxvd2VyQ29udGV4dFZpZXcucmVtb3ZlQWxsVmlld3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DbG9zaW5nQ29udGV4dCA9IGZhbHNlOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBBY3Rpb25CYXJJbXBsKEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgIG1BY3Rpdml0eSA9IGFjdGl2aXR5OworICAgICAgICBpbml0KGFjdGl2aXR5LmdldFdpbmRvdygpLmdldERlY29yVmlldygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWN0aW9uQmFySW1wbChEaWFsb2cgZGlhbG9nKSB7CisgICAgICAgIG1EaWFsb2cgPSBkaWFsb2c7CisgICAgICAgIGluaXQoZGlhbG9nLmdldFdpbmRvdygpLmdldERlY29yVmlldygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdChWaWV3IGRlY29yKSB7CisgICAgICAgIG1Db250ZXh0ID0gZGVjb3IuZ2V0Q29udGV4dCgpOworICAgICAgICBtQWN0aW9uVmlldyA9IChBY3Rpb25CYXJWaWV3KSBkZWNvci5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5hY3Rpb25fYmFyKTsKKyAgICAgICAgbVVwcGVyQ29udGV4dFZpZXcgPSAoQWN0aW9uQmFyQ29udGV4dFZpZXcpIGRlY29yLmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmFjdGlvbl9jb250ZXh0X2Jhcik7CisgICAgICAgIG1Mb3dlckNvbnRleHRWaWV3ID0gKExpbmVhckxheW91dCkgZGVjb3IuZmluZFZpZXdCeUlkKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQubG93ZXJfYWN0aW9uX2NvbnRleHRfYmFyKTsKKyAgICAgICAgbUFuaW1hdG9yVmlldyA9IChWaWV3QW5pbWF0b3IpIGRlY29yLmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmFjdGlvbl9iYXJfYW5pbWF0b3IpOworCisgICAgICAgIGlmIChtQWN0aW9uVmlldyA9PSBudWxsIHx8IG1VcHBlckNvbnRleHRWaWV3ID09IG51bGwgfHwgbUFuaW1hdG9yVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiBjYW4gb25seSBiZSB1c2VkICIgKworICAgICAgICAgICAgICAgICAgICAid2l0aCBhIGNvbXBhdGlibGUgd2luZG93IGRlY29yIGxheW91dCIpOworICAgICAgICB9CisKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0Q29udGV4dFZpZXcobVVwcGVyQ29udGV4dFZpZXcpOworICAgICAgICBtQ29udGV4dERpc3BsYXlNb2RlID0gbUxvd2VyQ29udGV4dFZpZXcgPT0gbnVsbCA/CisgICAgICAgICAgICAgICAgQ09OVEVYVF9ESVNQTEFZX05PUk1BTCA6IENPTlRFWFRfRElTUExBWV9TUExJVDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShpbnQgcmVzSWQpIHsKKyAgICAgICAgc2V0VGl0bGUobUNvbnRleHQuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoaW50IHJlc0lkKSB7CisgICAgICAgIHNldFN1YnRpdGxlKG1Db250ZXh0LmdldFN0cmluZyhyZXNJZCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbU5hdmlnYXRpb25Nb2RlKFZpZXcgdmlldykgeworICAgICAgICBjbGVhbnVwVGFicygpOworICAgICAgICBtQWN0aW9uVmlldy5zZXRDdXN0b21OYXZpZ2F0aW9uVmlldyh2aWV3KTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0Q2FsbGJhY2sobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShTcGlubmVyQWRhcHRlciBhZGFwdGVyLCBOYXZpZ2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShhZGFwdGVyLCBjYWxsYmFjaywgLTEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERyb3Bkb3duTmF2aWdhdGlvbk1vZGUoU3Bpbm5lckFkYXB0ZXIgYWRhcHRlciwgTmF2aWdhdGlvbkNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgaW50IGRlZmF1bHRTZWxlY3RlZFBvc2l0aW9uKSB7CisgICAgICAgIGNsZWFudXBUYWJzKCk7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldE5hdmlnYXRpb25Nb2RlKE5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0RHJvcGRvd25BZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICBpZiAoZGVmYXVsdFNlbGVjdGVkUG9zaXRpb24gPj0gMCkgeworICAgICAgICAgICAgbUFjdGlvblZpZXcuc2V0RHJvcGRvd25TZWxlY3RlZFBvc2l0aW9uKGRlZmF1bHRTZWxlY3RlZFBvc2l0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBtQWN0aW9uVmlldy5zZXRDYWxsYmFjayhjYWxsYmFjayk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSgpIHsKKyAgICAgICAgY2xlYW51cFRhYnMoKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0TmF2aWdhdGlvbk1vZGUoTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0Q2FsbGJhY2sobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgc3dpdGNoIChtQWN0aW9uVmlldy5nZXROYXZpZ2F0aW9uTW9kZSgpKSB7CisgICAgICAgIGNhc2UgTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICBzZWxlY3RUYWIobVRhYnMuZ2V0KHBvc2l0aW9uKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKKyAgICAgICAgICAgIG1BY3Rpb25WaWV3LnNldERyb3Bkb3duU2VsZWN0ZWRQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJzZXRTZWxlY3RlZE5hdmlnYXRpb25JdGVtIG5vdCB2YWxpZCBmb3IgY3VycmVudCBuYXZpZ2F0aW9uIG1vZGUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbSgpIHsKKyAgICAgICAgc3dpdGNoIChtQWN0aW9uVmlldy5nZXROYXZpZ2F0aW9uTW9kZSgpKSB7CisgICAgICAgIGNhc2UgTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICByZXR1cm4gbVNlbGVjdGVkVGFiLmdldFBvc2l0aW9uKCk7CisgICAgICAgIGNhc2UgTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0RHJvcGRvd25TZWxlY3RlZFBvc2l0aW9uKCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2xlYW51cFRhYnMoKSB7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUYWIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VsZWN0VGFiKG51bGwpOworICAgICAgICB9CisgICAgICAgIG1UYWJzLmNsZWFyKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldFRpdGxlKHRpdGxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpIHsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0U3VidGl0bGUoc3VidGl0bGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlPcHRpb25zKGludCBvcHRpb25zKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldERpc3BsYXlPcHRpb25zKG9wdGlvbnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlPcHRpb25zKGludCBvcHRpb25zLCBpbnQgbWFzaykgeworICAgICAgICBmaW5hbCBpbnQgY3VycmVudCA9IG1BY3Rpb25WaWV3LmdldERpc3BsYXlPcHRpb25zKCk7IAorICAgICAgICBtQWN0aW9uVmlldy5zZXREaXNwbGF5T3B0aW9ucygob3B0aW9ucyAmIG1hc2spIHwgKGN1cnJlbnQgJiB+bWFzaykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSBkKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldEJhY2tncm91bmREcmF3YWJsZShkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlldyBnZXRDdXN0b21OYXZpZ2F0aW9uVmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25WaWV3LmdldEN1c3RvbU5hdmlnYXRpb25WaWV3KCk7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25WaWV3LmdldFRpdGxlKCk7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25WaWV3LmdldFN1YnRpdGxlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXROYXZpZ2F0aW9uTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25WaWV3LmdldE5hdmlnYXRpb25Nb2RlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREaXNwbGF5T3B0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25WaWV3LmdldERpc3BsYXlPcHRpb25zKCk7CisgICAgfQorCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlKEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgaWYgKG1BY3Rpb25Nb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BY3Rpb25Nb2RlLmZpbmlzaCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRG9uJ3Qgd2FpdCBmb3IgdGhlIGNsb3NlIGNvbnRleHQgbW9kZSBhbmltYXRpb24gdG8gZmluaXNoLgorICAgICAgICBpZiAobUNsb3NpbmdDb250ZXh0KSB7CisgICAgICAgICAgICBtQW5pbWF0b3JWaWV3LmNsZWFyQW5pbWF0aW9uKCk7CisgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobUNsb3NlQ29udGV4dCk7CisgICAgICAgICAgICBtQ2xvc2VDb250ZXh0LnJ1bigpOworICAgICAgICB9CisKKyAgICAgICAgQWN0aW9uTW9kZSBtb2RlID0gbmV3IEFjdGlvbk1vZGVJbXBsKGNhbGxiYWNrKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrLm9uQ3JlYXRlQWN0aW9uTW9kZShtb2RlLCBtb2RlLmdldE1lbnUoKSkpIHsKKyAgICAgICAgICAgIG1vZGUuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbVVwcGVyQ29udGV4dFZpZXcuaW5pdEZvck1vZGUobW9kZSk7CisgICAgICAgICAgICBtQW5pbWF0b3JWaWV3LnNldERpc3BsYXllZENoaWxkKENPTlRFWFRfVklFVyk7CisgICAgICAgICAgICBpZiAobUxvd2VyQ29udGV4dFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gYW5pbWF0ZSB0aGlzCisgICAgICAgICAgICAgICAgbUxvd2VyQ29udGV4dFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUFjdGlvbk1vZGUgPSBtb2RlOworICAgICAgICAgICAgcmV0dXJuIG1vZGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVRhYihUYWIgdGFiLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgZmluYWwgVGFiSW1wbCB0YWJpID0gKFRhYkltcGwpIHRhYjsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0ZpcnN0VGFiID0gbVRhYnMuaXNFbXB0eSgpOworICAgICAgICBmaW5hbCBBY3Rpb25CYXIuVGFiTGlzdGVuZXIgY2FsbGJhY2sgPSB0YWJpLmdldENhbGxiYWNrKCk7CisKKyAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFjdGlvbiBCYXIgVGFiIG11c3QgaGF2ZSBhIENhbGxiYWNrIik7CisgICAgICAgIH0KKworICAgICAgICB0YWJpLnNldFBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgbVRhYnMuYWRkKHBvc2l0aW9uLCB0YWJpKTsKKworICAgICAgICBpZiAoaXNGaXJzdFRhYikgeworICAgICAgICAgICAgZmluYWwgRnJhZ21lbnRUcmFuc2FjdGlvbiB0cmFucyA9IG1BY3Rpdml0eS5nZXRGcmFnbWVudE1hbmFnZXIoKS5vcGVuVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIG1TZWxlY3RlZFRhYiA9IHRhYmk7CisgICAgICAgICAgICBjYWxsYmFjay5vblRhYlNlbGVjdGVkKHRhYiwgdHJhbnMpOworICAgICAgICAgICAgaWYgKCF0cmFucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB0cmFucy5jb21taXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFRhYihUYWIgdGFiKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LmFkZFRhYih0YWIpOworICAgICAgICBjb25maWd1cmVUYWIodGFiLCBtVGFicy5zaXplKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFRhYihUYWIgdGFiLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgbUFjdGlvblZpZXcuYWRkVGFiKHRhYiwgcG9zaXRpb24pOworICAgICAgICBjb25maWd1cmVUYWIodGFiLCBwb3NpdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRhYiBuZXdUYWIoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGFiSW1wbCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRhYihUYWIgdGFiKSB7CisgICAgICAgIHJlbW92ZVRhYkF0KHRhYi5nZXRQb3NpdGlvbigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVUYWJBdChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgbUFjdGlvblZpZXcucmVtb3ZlVGFiQXQocG9zaXRpb24pOworICAgICAgICBtVGFicy5yZW1vdmUocG9zaXRpb24pOworCisgICAgICAgIGZpbmFsIGludCBuZXdUYWJDb3VudCA9IG1UYWJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IHBvc2l0aW9uOyBpIDwgbmV3VGFiQ291bnQ7IGkrKykgeworICAgICAgICAgICAgbVRhYnMuZ2V0KGkpLnNldFBvc2l0aW9uKGkpOworICAgICAgICB9CisKKyAgICAgICAgc2VsZWN0VGFiKG1UYWJzLmlzRW1wdHkoKSA/IG51bGwgOiBtVGFicy5nZXQoTWF0aC5tYXgoMCwgcG9zaXRpb24gLSAxKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFRhYk5hdmlnYXRpb25Nb2RlKCkgeworICAgICAgICBpZiAobUFjdGl2aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJUYWIgbmF2aWdhdGlvbiBtb2RlIGNhbm5vdCBiZSB1c2VkIG91dHNpZGUgb2YgYW4gQWN0aXZpdHkiKTsKKyAgICAgICAgfQorICAgICAgICBtQWN0aW9uVmlldy5zZXROYXZpZ2F0aW9uTW9kZShOQVZJR0FUSU9OX01PREVfVEFCUyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2VsZWN0VGFiKFRhYiB0YWIpIHsKKyAgICAgICAgaWYgKG1TZWxlY3RlZFRhYiA9PSB0YWIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1BY3Rpb25WaWV3LnNldFRhYlNlbGVjdGVkKHRhYiAhPSBudWxsID8gdGFiLmdldFBvc2l0aW9uKCkgOiBUYWIuSU5WQUxJRF9QT1NJVElPTik7CisgICAgICAgIGZpbmFsIEZyYWdtZW50VHJhbnNhY3Rpb24gdHJhbnMgPSBtQWN0aXZpdHkuZ2V0RnJhZ21lbnRNYW5hZ2VyKCkub3BlblRyYW5zYWN0aW9uKCk7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUYWIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbGVjdGVkVGFiLmdldENhbGxiYWNrKCkub25UYWJVbnNlbGVjdGVkKG1TZWxlY3RlZFRhYiwgdHJhbnMpOworICAgICAgICB9CisgICAgICAgIG1TZWxlY3RlZFRhYiA9IChUYWJJbXBsKSB0YWI7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUYWIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbGVjdGVkVGFiLmdldENhbGxiYWNrKCkub25UYWJTZWxlY3RlZChtU2VsZWN0ZWRUYWIsIHRyYW5zKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdHJhbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0cmFucy5jb21taXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUYWIgZ2V0U2VsZWN0ZWRUYWIoKSB7CisgICAgICAgIHJldHVybiBtU2VsZWN0ZWRUYWI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRIZWlnaHQoKSB7CisgICAgICAgIHJldHVybiBtQWN0aW9uVmlldy5nZXRIZWlnaHQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICAvLyBUT0RPIGFuaW1hdGUhCisgICAgICAgIG1BbmltYXRvclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7CisgICAgICAgIC8vIFRPRE8gYW5pbWF0ZSEKKyAgICAgICAgbUFuaW1hdG9yVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCkgeworICAgICAgICByZXR1cm4gbUFuaW1hdG9yVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlIAorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBBY3Rpb25Nb2RlSW1wbCBleHRlbmRzIEFjdGlvbk1vZGUgaW1wbGVtZW50cyBNZW51QnVpbGRlci5DYWxsYmFjayB7CisgICAgICAgIHByaXZhdGUgQWN0aW9uTW9kZS5DYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU1lbnU7CisgICAgICAgIHByaXZhdGUgV2Vha1JlZmVyZW5jZTxWaWV3PiBtQ3VzdG9tVmlldzsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBBY3Rpb25Nb2RlSW1wbChBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgICAgIG1NZW51ID0gbmV3IE1lbnVCdWlsZGVyKG1BY3Rpb25WaWV3LmdldENvbnRleHQoKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldERlZmF1bHRTaG93QXNBY3Rpb24oTWVudUl0ZW0uU0hPV19BU19BQ1RJT05fSUZfUk9PTSk7CisgICAgICAgICAgICBtTWVudS5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWVudUluZmxhdGVyIGdldE1lbnVJbmZsYXRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVudUluZmxhdGVyKG1Db250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWVudSBnZXRNZW51KCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZW51OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHsKKyAgICAgICAgICAgIGlmIChtQWN0aW9uTW9kZSAhPSB0aGlzKSB7CisgICAgICAgICAgICAgICAgLy8gTm90IHRoZSBhY3RpdmUgYWN0aW9uIG1vZGUgLSBuby1vcAorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUNhbGxiYWNrLm9uRGVzdHJveUFjdGlvbk1vZGUodGhpcyk7CisgICAgICAgICAgICBtQW5pbWF0b3JWaWV3LnNldERpc3BsYXllZENoaWxkKE5PUk1BTF9WSUVXKTsKKworICAgICAgICAgICAgLy8gQ2xlYXIgb3V0IHRoZSBjb250ZXh0IG1vZGUgdmlld3MgYWZ0ZXIgdGhlIGFuaW1hdGlvbiBmaW5pc2hlcworICAgICAgICAgICAgbUNsb3NpbmdDb250ZXh0ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG1DbG9zZUNvbnRleHQsIG1BbmltYXRvclZpZXcuZ2V0T3V0QW5pbWF0aW9uKCkuZ2V0RHVyYXRpb24oKSk7CisKKyAgICAgICAgICAgIGlmIChtTG93ZXJDb250ZXh0VmlldyAhPSBudWxsICYmIG1Mb3dlckNvbnRleHRWaWV3LmdldFZpc2liaWxpdHkoKSAhPSBWaWV3LkdPTkUpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIEFuaW1hdGUgdGhpcworICAgICAgICAgICAgICAgIG1Mb3dlckNvbnRleHRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1BY3Rpb25Nb2RlID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICAgICAgaWYgKG1DYWxsYmFjay5vblByZXBhcmVBY3Rpb25Nb2RlKHRoaXMsIG1NZW51KSkgeworICAgICAgICAgICAgICAgIC8vIFJlZnJlc2ggY29udGVudCBpbiBib3RoIGNvbnRleHQgdmlld3MKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21WaWV3KFZpZXcgdmlldykgeworICAgICAgICAgICAgbVVwcGVyQ29udGV4dFZpZXcuc2V0Q3VzdG9tVmlldyh2aWV3KTsKKyAgICAgICAgICAgIG1DdXN0b21WaWV3ID0gbmV3IFdlYWtSZWZlcmVuY2U8Vmlldz4odmlldyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlIHN1YnRpdGxlKSB7CisgICAgICAgICAgICBtVXBwZXJDb250ZXh0Vmlldy5zZXRTdWJ0aXRsZShzdWJ0aXRsZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgICAgICBtVXBwZXJDb250ZXh0Vmlldy5zZXRUaXRsZSh0aXRsZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoaW50IHJlc0lkKSB7CisgICAgICAgICAgICBzZXRUaXRsZShtQWN0aXZpdHkuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoaW50IHJlc0lkKSB7CisgICAgICAgICAgICBzZXRTdWJ0aXRsZShtQWN0aXZpdHkuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVXBwZXJDb250ZXh0Vmlldy5nZXRUaXRsZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0U3VidGl0bGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVVwcGVyQ29udGV4dFZpZXcuZ2V0U3VidGl0bGUoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IGdldEN1c3RvbVZpZXcoKSB7CisgICAgICAgICAgICByZXR1cm4gbUN1c3RvbVZpZXcgIT0gbnVsbCA/IG1DdXN0b21WaWV3LmdldCgpIDogbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1TZWxlY3RlZChNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICByZXR1cm4gbUNhbGxiYWNrLm9uQWN0aW9uSXRlbUNsaWNrZWQodGhpcywgaXRlbSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsb3NlTWVudShNZW51QnVpbGRlciBtZW51LCBib29sZWFuIGFsbE1lbnVzQXJlQ2xvc2luZykgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25TdWJNZW51U2VsZWN0ZWQoU3ViTWVudUJ1aWxkZXIgc3ViTWVudSkgeworICAgICAgICAgICAgaWYgKCFzdWJNZW51Lmhhc1Zpc2libGVJdGVtcygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5ldyBNZW51UG9wdXBIZWxwZXIobUNvbnRleHQsIHN1Yk1lbnUpLnNob3coKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25DbG9zZVN1Yk1lbnUoU3ViTWVudUJ1aWxkZXIgbWVudSkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25NZW51TW9kZUNoYW5nZShNZW51QnVpbGRlciBtZW51KSB7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBtVXBwZXJDb250ZXh0Vmlldy5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBUYWJJbXBsIGV4dGVuZHMgQWN0aW9uQmFyLlRhYiB7CisgICAgICAgIHByaXZhdGUgQWN0aW9uQmFyLlRhYkxpc3RlbmVyIG1DYWxsYmFjazsKKyAgICAgICAgcHJpdmF0ZSBPYmplY3QgbVRhZzsKKyAgICAgICAgcHJpdmF0ZSBEcmF3YWJsZSBtSWNvbjsKKyAgICAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRleHQ7CisgICAgICAgIHByaXZhdGUgaW50IG1Qb3NpdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21WaWV3OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRhZygpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGFnOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRhZyhPYmplY3QgdGFnKSB7CisgICAgICAgICAgICBtVGFnID0gdGFnOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFjdGlvbkJhci5UYWJMaXN0ZW5lciBnZXRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2FsbGJhY2s7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGFiTGlzdGVuZXIoQWN0aW9uQmFyLlRhYkxpc3RlbmVyIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBnZXRDdXN0b21WaWV3KCkgeworICAgICAgICAgICAgcmV0dXJuIG1DdXN0b21WaWV3OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbVZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgICAgICBtQ3VzdG9tVmlldyA9IHZpZXc7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIERyYXdhYmxlIGdldEljb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbUljb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRQb3NpdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9zaXRpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQb3NpdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIG1Qb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRJY29uKERyYXdhYmxlIGljb24pIHsKKyAgICAgICAgICAgIG1JY29uID0gaWNvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgICAgICBtVGV4dCA9IHRleHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0KCkgeworICAgICAgICAgICAgc2VsZWN0VGFiKHRoaXMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9Mb2NhbGVQaWNrZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTG9jYWxlUGlja2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlMzkzNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTG9jYWxlUGlja2VyLmphdmEKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJOYXRpdmU7CitpbXBvcnQgYW5kcm9pZC5hcHAuSUFjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5MaXN0RnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuYmFja3VwLkJhY2t1cE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCitpbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworcHVibGljIGNsYXNzIExvY2FsZVBpY2tlciBleHRlbmRzIExpc3RGcmFnbWVudCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJMb2NhbGVQaWNrZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIExvY2FsZVNlbGVjdGlvbkxpc3RlbmVyIHsKKyAgICAgICAgLy8gWW91IGNhbiBhZGQgYW55IGFyZ3VtZW50IGlmIHlvdSByZWFsbHkgbmVlZCBpdC4uLgorICAgICAgICBwdWJsaWMgdm9pZCBvbkxvY2FsZVNlbGVjdGVkKExvY2FsZSBsb2NhbGUpOworICAgIH0KKworICAgIExvY1tdIG1Mb2NhbGVzOworICAgIFN0cmluZ1tdIG1TcGVjaWFsTG9jYWxlQ29kZXM7CisgICAgU3RyaW5nW10gbVNwZWNpYWxMb2NhbGVOYW1lczsKKworICAgIHByaXZhdGUgTG9jYWxlIG1OZXdMb2NhbGU7CisKKyAgICBMb2NhbGVTZWxlY3Rpb25MaXN0ZW5lciBtTGlzdGVuZXI7ICAvLyBkZWZhdWx0IHRvIG51bGwKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExvYyBpbXBsZW1lbnRzIENvbXBhcmFibGU8TG9jPiB7CisgICAgICAgIHN0YXRpYyBDb2xsYXRvciBzQ29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOworCisgICAgICAgIFN0cmluZyBsYWJlbDsKKyAgICAgICAgTG9jYWxlIGxvY2FsZTsKKworICAgICAgICBwdWJsaWMgTG9jKFN0cmluZyBsYWJlbCwgTG9jYWxlIGxvY2FsZSkgeworICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgICAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmxhYmVsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKExvYyBhbm90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gc0NvbGxhdG9yLmNvbXBhcmUodGhpcy5sYWJlbCwgYW5vdGhlci5sYWJlbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0VXBMb2NhbGVMaXN0KCkgeworICAgICAgICBmaW5hbCBBY3Rpdml0eSBhY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7CisgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXNvdXJjZXMgPSBhY3Rpdml0eS5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgbVNwZWNpYWxMb2NhbGVDb2RlcyA9IHJlc291cmNlcy5nZXRTdHJpbmdBcnJheShSLmFycmF5LnNwZWNpYWxfbG9jYWxlX2NvZGVzKTsKKyAgICAgICAgbVNwZWNpYWxMb2NhbGVOYW1lcyA9IHJlc291cmNlcy5nZXRTdHJpbmdBcnJheShSLmFycmF5LnNwZWNpYWxfbG9jYWxlX25hbWVzKTsKKworICAgICAgICBmaW5hbCBTdHJpbmdbXSBsb2NhbGVzID0gYWN0aXZpdHkuZ2V0QXNzZXRzKCkuZ2V0TG9jYWxlcygpOworICAgICAgICBBcnJheXMuc29ydChsb2NhbGVzKTsKKyAgICAgICAgZmluYWwgaW50IG9yaWdTaXplID0gbG9jYWxlcy5sZW5ndGg7CisgICAgICAgIExvY1tdIHByZXByb2Nlc3MgPSBuZXcgTG9jW29yaWdTaXplXTsKKyAgICAgICAgaW50IGZpbmFsU2l6ZSA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG9yaWdTaXplOyBpKysgKSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9IGxvY2FsZXNbaV07CisgICAgICAgICAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChsZW4gPT0gNSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IHMuc3Vic3RyaW5nKDAsIDIpOworICAgICAgICAgICAgICAgIFN0cmluZyBjb3VudHJ5ID0gcy5zdWJzdHJpbmcoMywgNSk7CisgICAgICAgICAgICAgICAgTG9jYWxlIGwgPSBuZXcgTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5KTsKKworICAgICAgICAgICAgICAgIGlmIChmaW5hbFNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgImFkZGluZyBpbml0aWFsICIrIHRvVGl0bGVDYXNlKGwuZ2V0RGlzcGxheUxhbmd1YWdlKGwpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc1tmaW5hbFNpemUrK10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2ModG9UaXRsZUNhc2UobC5nZXREaXNwbGF5TGFuZ3VhZ2UobCkpLCBsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBwcmV2aW91cyBlbnRyeToKKyAgICAgICAgICAgICAgICAgICAgLy8gIHNhbWUgbGFuZyBhbmQgYSBjb3VudHJ5IC0+IHVwZ3JhZGUgdG8gZnVsbCBuYW1lIGFuZAorICAgICAgICAgICAgICAgICAgICAvLyAgICBpbnNlcnQgb3VycyB3aXRoIGZ1bGwgbmFtZQorICAgICAgICAgICAgICAgICAgICAvLyAgZGlmZiBsYW5nIC0+IGluc2VydCBvdXJzIHdpdGggbGFuZy1vbmx5IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXByb2Nlc3NbZmluYWxTaXplLTFdLmxvY2FsZS5nZXRMYW5ndWFnZSgpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgImJhY2tpbmcgdXAgYW5kIGZpeGluZyAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc1tmaW5hbFNpemUtMV0ubGFiZWwrIiB0byAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGlzcGxheU5hbWUocHJlcHJvY2Vzc1tmaW5hbFNpemUtMV0ubG9jYWxlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVwcm9jZXNzW2ZpbmFsU2l6ZS0xXS5sYWJlbCA9IHRvVGl0bGVDYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREaXNwbGF5TmFtZShwcmVwcm9jZXNzW2ZpbmFsU2l6ZS0xXS5sb2NhbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIiAgYW5kIGFkZGluZyAiKyB0b1RpdGxlQ2FzZShnZXREaXNwbGF5TmFtZShsKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc1tmaW5hbFNpemUrK10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9jKHRvVGl0bGVDYXNlKGdldERpc3BsYXlOYW1lKGwpKSwgbCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGlzcGxheU5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5lcXVhbHMoInp6X1paIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZSA9ICJQc2V1ZG8uLi4iOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZSA9IHRvVGl0bGVDYXNlKGwuZ2V0RGlzcGxheUxhbmd1YWdlKGwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgImFkZGluZyAiK2Rpc3BsYXlOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXByb2Nlc3NbZmluYWxTaXplKytdID0gbmV3IExvYyhkaXNwbGF5TmFtZSwgbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUxvY2FsZXMgPSBuZXcgTG9jW2ZpbmFsU2l6ZV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmluYWxTaXplIDsgaSsrKSB7CisgICAgICAgICAgICBtTG9jYWxlc1tpXSA9IHByZXByb2Nlc3NbaV07CisgICAgICAgIH0KKyAgICAgICAgQXJyYXlzLnNvcnQobUxvY2FsZXMpOworICAgICAgICBmaW5hbCBpbnQgbGF5b3V0SWQgPSBSLmxheW91dC5sb2NhbGVfcGlja2VyX2l0ZW07CisgICAgICAgIGZpbmFsIGludCBmaWVsZElkID0gUi5pZC5sb2NhbGU7CisgICAgICAgIGZpbmFsIEFycmF5QWRhcHRlcjxMb2M+IGFkYXB0ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBBcnJheUFkYXB0ZXI8TG9jPihhY3Rpdml0eSwgbGF5b3V0SWQsIGZpZWxkSWQsIG1Mb2NhbGVzKTsKKyAgICAgICAgc2V0TGlzdEFkYXB0ZXIoYWRhcHRlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoZmluYWwgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkFjdGl2aXR5Q3JlYXRlZChzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRVcExvY2FsZUxpc3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGVTZWxlY3Rpb25MaXN0ZW5lcihMb2NhbGVTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9UaXRsZUNhc2UoU3RyaW5nIHMpIHsKKyAgICAgICAgaWYgKHMubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHMuY2hhckF0KDApKSArIHMuc3Vic3RyaW5nKDEpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldERpc3BsYXlOYW1lKExvY2FsZSBsKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gbC50b1N0cmluZygpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVNwZWNpYWxMb2NhbGVDb2Rlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG1TcGVjaWFsTG9jYWxlQ29kZXNbaV0uZXF1YWxzKGNvZGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TcGVjaWFsTG9jYWxlTmFtZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbC5nZXREaXNwbGF5TmFtZShsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgZ2V0TGlzdFZpZXcoKS5yZXF1ZXN0Rm9jdXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFYWNoIGxpc3RlbmVyIG5lZWRzIHRvIGNhbGwge0BsaW5rICN1cGRhdGVMb2NhbGUoTG9jYWxlKX0gdG8gYWN0dWFsbHkgY2hhbmdlIHRoZSBsb2NhbGUuCisgICAgICoKKyAgICAgKiBXZSBkb24ndCBjYWxsIHtAbGluayAjdXBkYXRlTG9jYWxlKExvY2FsZSl9IGF1dG9tYXRpY2FsbHksIGFzIGl0IGhhbHQgdGhlIHN5c3RlbSBmb3IKKyAgICAgKiBhIG1vbWVudCBhbmQgc29tZSBjYWxsZXJzIHdvbid0IHdhbnQgaXQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25MaXN0SXRlbUNsaWNrKExpc3RWaWV3IGwsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxpc3RlbmVyLm9uTG9jYWxlU2VsZWN0ZWQobUxvY2FsZXNbcG9zaXRpb25dLmxvY2FsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0cyB0aGUgc3lzdGVtIHRvIHVwZGF0ZSB0aGUgc3lzdGVtIGxvY2FsZS4gTm90ZSB0aGF0IHRoZSBzeXN0ZW0gbG9va3MgaGFsdGVkCisgICAgICogZm9yIGEgd2hpbGUgZHVyaW5nIHRoZSBMb2NhbGUgbWlncmF0aW9uLCBzbyB0aGUgY2FsbGVyIG5lZWQgdG8gdGFrZSBjYXJlIG9mIGl0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVMb2NhbGUoTG9jYWxlIGxvY2FsZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSUFjdGl2aXR5TWFuYWdlciBhbSA9IEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCk7CisgICAgICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZyA9IGFtLmdldENvbmZpZ3VyYXRpb24oKTsKKworICAgICAgICAgICAgY29uZmlnLmxvY2FsZSA9IGxvY2FsZTsKKworICAgICAgICAgICAgLy8gaW5kaWNhdGUgdGhpcyBpc24ndCBzb21lIHBhc3NpbmcgZGVmYXVsdCAtIHRoZSB1c2VyIHdhbnRzIHRoaXMgcmVtZW1iZXJlZAorICAgICAgICAgICAgY29uZmlnLnVzZXJTZXRMb2NhbGUgPSB0cnVlOworCisgICAgICAgICAgICBhbS51cGRhdGVDb25maWd1cmF0aW9uKGNvbmZpZyk7CisgICAgICAgICAgICAvLyBUcmlnZ2VyIHRoZSBkaXJ0eSBiaXQgZm9yIHRoZSBTZXR0aW5ncyBQcm92aWRlci4KKyAgICAgICAgICAgIEJhY2t1cE1hbmFnZXIuZGF0YUNoYW5nZWQoImNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncyIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rCisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0SG9zdC5haWRsIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0SG9zdC5haWRsCmluZGV4IDJlZDQ3NzMuLjIxNmQ5ODUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHB3aWRnZXQvSUFwcFdpZGdldEhvc3QuYWlkbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwd2lkZ2V0L0lBcHBXaWRnZXRIb3N0LmFpZGwKQEAgLTI0LDUgKzI0LDYgQEAKIG9uZXdheSBpbnRlcmZhY2UgSUFwcFdpZGdldEhvc3QgewogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0KGludCBhcHBXaWRnZXRJZCwgaW4gUmVtb3RlVmlld3Mgdmlld3MpOwogICAgIHZvaWQgcHJvdmlkZXJDaGFuZ2VkKGludCBhcHBXaWRnZXRJZCwgaW4gQXBwV2lkZ2V0UHJvdmlkZXJJbmZvIGluZm8pOworICAgIHZvaWQgdmlld0RhdGFDaGFuZ2VkKGludCBhcHBXaWRnZXRJZCwgaW50IHZpZXdJZCk7CiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHB3aWRnZXQvSUFwcFdpZGdldFNlcnZpY2UuYWlkbCBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHB3aWRnZXQvSUFwcFdpZGdldFNlcnZpY2UuYWlkbAppbmRleCA0OTZhYTFhLi40ZDU2NzQ1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwd2lkZ2V0L0lBcHBXaWRnZXRTZXJ2aWNlLmFpZGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0U2VydmljZS5haWRsCkBAIC00MCw3ICs0MCw5IEBACiAgICAgLy8gZm9yIEFwcFdpZGdldE1hbmFnZXIKICAgICAvLwogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0SWRzKGluIGludFtdIGFwcFdpZGdldElkcywgaW4gUmVtb3RlVmlld3Mgdmlld3MpOworICAgIHZvaWQgcGFydGlhbGx5VXBkYXRlQXBwV2lkZ2V0SWRzKGluIGludFtdIGFwcFdpZGdldElkcywgaW4gUmVtb3RlVmlld3Mgdmlld3MpOwogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0UHJvdmlkZXIoaW4gQ29tcG9uZW50TmFtZSBwcm92aWRlciwgaW4gUmVtb3RlVmlld3Mgdmlld3MpOworICAgIHZvaWQgbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkKGluIGludFtdIGFwcFdpZGdldElkcywgaW50IHZpZXdJZCk7CiAgICAgTGlzdDxBcHBXaWRnZXRQcm92aWRlckluZm8+IGdldEluc3RhbGxlZFByb3ZpZGVycygpOwogICAgIEFwcFdpZGdldFByb3ZpZGVySW5mbyBnZXRBcHBXaWRnZXRJbmZvKGludCBhcHBXaWRnZXRJZCk7CiAgICAgdm9pZCBiaW5kQXBwV2lkZ2V0SWQoaW50IGFwcFdpZGdldElkLCBpbiBDb21wb25lbnROYW1lIHByb3ZpZGVyKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9kYXRhYmFzZS9Tb3J0Q3Vyc29yLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvZGF0YWJhc2UvU29ydEN1cnNvci5qYXZhCmluZGV4IDk5NDEwYmMuLjAwMjU1MTIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9kYXRhYmFzZS9Tb3J0Q3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2RhdGFiYXNlL1NvcnRDdXJzb3IuamF2YQpAQCAtMTgyLDI0ICsxODIsNiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpCi0gICAgewotICAgICAgICByZXR1cm4gbUN1cnNvci5kZWxldGVSb3coKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKCkgewotICAgICAgICBpbnQgbGVuZ3RoID0gbUN1cnNvcnMubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBsZW5ndGggOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtQ3Vyc29yc1tpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnNvcnNbaV0uY29tbWl0VXBkYXRlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG9uQ2hhbmdlKHRydWUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgY29sdW1uKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbik7CkBAIC0yMzYsNiArMjE4LDExIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRUeXBlKGludCBjb2x1bW4pIHsKKyAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0VHlwZShjb2x1bW4pOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuaXNOdWxsKGNvbHVtbik7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvQmF0dGVyeVN0YXRzSW1wbC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL0JhdHRlcnlTdGF0c0ltcGwuamF2YQppbmRleCA2NjE0OWFjLi44ZWEwMmFhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvQmF0dGVyeVN0YXRzSW1wbC5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9CYXR0ZXJ5U3RhdHNJbXBsLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSm91cm5hbGVkRmlsZTsKIAoraW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIZWFkc2V0OwogaW1wb3J0IGFuZHJvaWQubmV0LlRyYWZmaWNTdGF0czsKIGltcG9ydCBhbmRyb2lkLm9zLkJhdHRlcnlNYW5hZ2VyOwpAQCAtNTAsNiArNTEsNyBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKIApAQCAtMTE1MCw3ICsxMTUyLDExIEBACiAKICAgICBwcml2YXRlIGludCBnZXRDdXJyZW50Qmx1ZXRvb3RoUGluZ0NvdW50KCkgewogICAgICAgICBpZiAobUJ0SGVhZHNldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJ0SGVhZHNldC5nZXRCYXR0ZXJ5VXNhZ2VIaW50KCk7CisgICAgICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VTZXQgPSBtQnRIZWFkc2V0LmdldENvbm5lY3RlZERldmljZXMoKTsKKyAgICAgICAgICAgIEJsdWV0b290aERldmljZVtdIGRldmljZXMgPSBkZXZpY2VTZXQudG9BcnJheShuZXcgQmx1ZXRvb3RoRGV2aWNlW2RldmljZVNldC5zaXplKCldKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2VzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUJ0SGVhZHNldC5nZXRCYXR0ZXJ5VXNhZ2VIaW50KGRldmljZXNbMF0pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvUnVudGltZUluaXQuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9SdW50aW1lSW5pdC5qYXZhCmluZGV4IDU5NjAwZGMuLjU3Njc4MzIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9SdW50aW1lSW5pdC5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9SdW50aW1lSW5pdC5qYXZhCkBAIC0yNCw2ICsyNCw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQudXRpbC5GaW5hbGl6ZXJzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CiAKQEAgLTE0MSw2ICsxNDIsMTIgQEAKICAgICAgICAgICAgIERlYnVnLmVuYWJsZUVtdWxhdG9yVHJhY2VPdXRwdXQoKTsKICAgICAgICAgfQogCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbml0aWFsaXplIHRoZSB0aHJlYWQgdXNlZCB0byByZWNsYWltIHJlc291cmNlcyB3aXRob3V0CisgICAgICAgICAqIGdvaW5nIHRocm91Z2ggZmluYWxpemVycy4KKyAgICAgICAgICovCisgICAgICAgIEZpbmFsaXplcnMuaW5pdCgpOworCiAgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKICAgICB9CiAKQEAgLTMzMSw5ICszMzgsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqIENvdW50ZXIgdXNlZCB0byBwcmV2ZW50IHJlZW50cmFuY3kgaW4ge0BsaW5rICNyZXBvcnRFeGNlcHRpb259LiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgc0luUmVwb3J0RXhjZXB0aW9uID0gbmV3IEF0b21pY0ludGVnZXIoKTsKLQogICAgIC8qKgogICAgICAqIFNldCB0aGUgb2JqZWN0IGlkZW50aWZ5aW5nIHRoaXMgYXBwbGljYXRpb24vcHJvY2VzcywgZm9yIHJlcG9ydGluZyBWTQogICAgICAqIGVycm9ycy4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uamF2YQppbmRleCBlYTI3OGE2Li5iODdhYzkwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1NhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5qYXZhCkBAIC0yNiw3ICsyNiw5IEBACiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm87CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLm9zLio7CiAKQEAgLTM3LDE1ICszOSwyNyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24iOwogCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU05BUFNIT1RfRElSID0gIi9kYXRhL3NuYXBzaG90cyI7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGVuYWJsZWQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhlY3V0b3Igc25hcHNob3RXcml0ZXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHNhbXBsaW5nUHJvZmlsZXJIejsKKworICAgIC8qKiBXaGV0aGVyIG9yIG5vdCB3ZSd2ZSBjcmVhdGVkIHRoZSBzbmFwc2hvdHMgZGlyLiAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGlyTWFkZSA9IGZhbHNlOworCisgICAgLyoqIFdoZXRoZXIgb3Igbm90IGEgc25hcHNob3QgaXMgYmVpbmcgcGVyc2lzdGVkLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0Jvb2xlYW4gcGVuZGluZyA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKwogICAgIHN0YXRpYyB7Ci0gICAgICAgIGVuYWJsZWQgPSAiMSIuZXF1YWxzKFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJwZXJzaXN0LnNhbXBsaW5nX3Byb2ZpbGVyIikpOwotICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBzYW1wbGluZ1Byb2ZpbGVySHogPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEludCgicGVyc2lzdC5zeXMucHJvZmlsZXJfaHoiLCAwKTsKKyAgICAgICAgaWYgKHNhbXBsaW5nUHJvZmlsZXJIeiA+IDApIHsKICAgICAgICAgICAgIHNuYXBzaG90V3JpdGVyID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJQcm9maWxlciBpcyBlbmFibGVkLiIpOworICAgICAgICAgICAgZW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICBMb2cuaShUQUcsICJQcm9maWxlciBpcyBlbmFibGVkLiBTYW1wbGluZyBQcm9maWxlciBIejogIiArIHNhbXBsaW5nUHJvZmlsZXJIeik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzbmFwc2hvdFdyaXRlciA9IG51bGw7CisgICAgICAgICAgICBlbmFibGVkID0gZmFsc2U7CiAgICAgICAgICAgICBMb2cuaShUQUcsICJQcm9maWxlciBpcyBkaXNhYmxlZC4iKTsKICAgICAgICAgfQogICAgIH0KQEAgLTY5LDQ4ICs4Myw0NyBAQAogICAgICAgICBUaHJlYWRHcm91cCBncm91cCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0VGhyZWFkR3JvdXAoKTsKICAgICAgICAgU2FtcGxpbmdQcm9maWxlci5UaHJlYWRTZXQgdGhyZWFkU2V0ID0gU2FtcGxpbmdQcm9maWxlci5uZXdUaHJlYWRHcm91cFRoZWFkU2V0KGdyb3VwKTsKICAgICAgICAgSU5TVEFOQ0UgPSBuZXcgU2FtcGxpbmdQcm9maWxlcig0LCB0aHJlYWRTZXQpOwotICAgICAgICBJTlNUQU5DRS5zdGFydCgxMCk7CisgICAgICAgIElOU1RBTkNFLnN0YXJ0KHNhbXBsaW5nUHJvZmlsZXJIeik7CiAgICAgfQogCi0gICAgLyoqIFdoZXRoZXIgb3Igbm90IHdlJ3ZlIGNyZWF0ZWQgdGhlIHNuYXBzaG90cyBkaXIuICovCi0gICAgc3RhdGljIGJvb2xlYW4gZGlyTWFkZSA9IGZhbHNlOwotCi0gICAgLyoqIFdoZXRoZXIgb3Igbm90IGEgc25hcHNob3QgaXMgYmVpbmcgcGVyc2lzdGVkLiAqLwotICAgIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIHBlbmRpbmc7Ci0KICAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBzbmFwc2hvdCB0byB0aGUgU0QgY2FyZCBpZiBwcm9maWxpbmcgaXMgZW5hYmxlZC4KKyAgICAgKiBXcml0ZXMgYSBzbmFwc2hvdCBpZiBwcm9maWxpbmcgaXMgZW5hYmxlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVTbmFwc2hvdChmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVNuYXBzaG90KGZpbmFsIFN0cmluZyBwcm9jZXNzTmFtZSwgZmluYWwgUGFja2FnZUluZm8gcGFja2FnZUluZm8pIHsKICAgICAgICAgaWYgKCFlbmFibGVkKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAogICAgICAgICAvKgotICAgICAgICAgKiBJZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgYSBzbmFwc2hvdCwgZG9uJ3QgYm90aGVyIGVucXVlaW5nIGFub3RoZXIKKyAgICAgICAgICogSWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIGEgc25hcHNob3QsIGRvbid0IGJvdGhlciBlbnF1ZXVlaW5nIGFub3RoZXIKICAgICAgICAgICogcmVxdWVzdCByaWdodCBub3cuIFRoaXMgd2lsbCByZWR1Y2UgdGhlIG51bWJlciBvZiBpbmRpdmlkdWFsCiAgICAgICAgICAqIHNuYXBzaG90cyBhbmQgaW4gdHVybiB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSBjb25zdW1lZCAob25lIGJpZwogICAgICAgICAgKiBzbmFwc2hvdCBpcyBzbWFsbGVyIHRoYW4gTiBzdWJzZXQgc25hcHNob3RzKS4KICAgICAgICAgICovCi0gICAgICAgIGlmICghcGVuZGluZykgewotICAgICAgICAgICAgcGVuZGluZyA9IHRydWU7CisgICAgICAgIGlmIChwZW5kaW5nLmNvbXBhcmVBbmRTZXQoZmFsc2UsIHRydWUpKSB7CiAgICAgICAgICAgICBzbmFwc2hvdFdyaXRlci5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBkaXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkuZ2V0UGF0aCgpICsgIi9zbmFwc2hvdHMiOwogICAgICAgICAgICAgICAgICAgICBpZiAoIWRpck1hZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGRpcikubWtkaXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3IEZpbGUoZGlyKS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKFNOQVBTSE9UX0RJUik7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXIubWtkaXJzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIHdyaXRhYmxlIHRvIGFueWJvZHkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpci5zZXRXcml0YWJsZSh0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIGV4ZWN1dGFibGUgdG8gYW55Ym9keQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyB3aHkgeWV0LCBidXQgbW9kZSA3MjMgd291bGQgd29yaywgd2hpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZGUgNzIyIHRocm93cyBGaWxlTm90Rm91bmRFeGVjcHRpb24gYXQgbGluZSAxNTEKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpci5zZXRFeGVjdXRhYmxlKHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXcgRmlsZShTTkFQU0hPVF9ESVIpLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJNYWRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ3JlYXRpb24gb2YgIiArIGRpciArICIgZmFpbGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNyZWF0aW9uIG9mICIgKyBTTkFQU0hPVF9ESVIgKyAiIGZhaWxlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLnNldChmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNuYXBzaG90KGRpciwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNuYXBzaG90KFNOQVBTSE9UX0RJUiwgcHJvY2Vzc05hbWUsIHBhY2thZ2VJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcuc2V0KGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOwpAQCAtMTI0LDE1ICsxMzcsMTUgQEAKICAgICAgICAgaWYgKCFlbmFibGVkKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZGlyID0gIi9kYXRhL3p5Z290ZS9zbmFwc2hvdHMiOwotICAgICAgICBuZXcgRmlsZShkaXIpLm1rZGlycygpOwotICAgICAgICB3cml0ZVNuYXBzaG90KGRpciwgInp5Z290ZSIpOworICAgICAgICB3cml0ZVNuYXBzaG90KCJ6eWdvdGUiLCBudWxsKTsKICAgICAgICAgSU5TVEFOQ0Uuc2h1dGRvd24oKTsKICAgICAgICAgSU5TVEFOQ0UgPSBudWxsOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTbmFwc2hvdChTdHJpbmcgZGlyLCBTdHJpbmcgbmFtZSkgeworICAgIC8qKgorICAgICAqIHBhc3MgaW4gUGFja2FnZUluZm8gdG8gcmV0cmlldmUgdmFyaW91cyB2YWx1ZXMgZm9yIHNuYXBzaG90IGhlYWRlcgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTbmFwc2hvdChTdHJpbmcgZGlyLCBTdHJpbmcgcHJvY2Vzc05hbWUsIFBhY2thZ2VJbmZvIHBhY2thZ2VJbmZvKSB7CiAgICAgICAgIGlmICghZW5hYmxlZCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0xNDQsNDAgKzE1Nyw1NSBAQAogICAgICAgICAgKiB3ZSBjYXB0dXJlIHR3byBzbmFwc2hvdHMgaW4gcmFwaWQgc3VjY2Vzc2lvbi4KICAgICAgICAgICovCiAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgU3RyaW5nIHBhdGggPSBkaXIgKyAiLyIgKyBuYW1lLnJlcGxhY2UoJzonLCAnLicpICsgIi0iCi0gICAgICAgICAgICAgICAgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIuc25hcHNob3QiOwotCi0gICAgICAgIC8vIFRyeSB0byBvcGVuIHRoZSBmaWxlIGEgZmV3IHRpbWVzLiBUaGUgU0QgY2FyZCBtYXkgbm90IGJlIG1vdW50ZWQuCi0gICAgICAgIFByaW50U3RyZWFtIG91dDsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3V0ID0gbmV3IFByaW50U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShwYXRoKSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoKytjb3VudCA+IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IG9wZW4gIiArIHBhdGggKyAiLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gU2xlZXAgZm9yIGEgYml0IGFuZCB0aGVuIHRyeSBhZ2Fpbi4KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjUwMCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsgLyogaWdub3JlICovIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCisgICAgICAgIFN0cmluZyBuYW1lID0gcHJvY2Vzc05hbWUucmVwbGFjZUFsbCgiOiIsICIuIik7CisgICAgICAgIFN0cmluZyBwYXRoID0gZGlyICsgIi8iICsgbmFtZSArICItIiArU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLnNuYXBzaG90IjsKKyAgICAgICAgUHJpbnRTdHJlYW0gb3V0ID0gbnVsbDsKICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dCA9IG5ldyBQcmludFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0ocGF0aCkpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IG9wZW4gIiArIHBhdGggKyAiOiIgKyBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2VuZXJhdGVTbmFwc2hvdEhlYWRlcihuYW1lLCBwYWNrYWdlSW5mbywgb3V0KTsKICAgICAgICAgICAgIElOU1RBTkNFLndyaXRlSHByb2ZEYXRhKG91dCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKICAgICAgICAgfQogICAgICAgICBpZiAob3V0LmNoZWNrRXJyb3IoKSkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3Igd3JpdGluZyBzbmFwc2hvdC4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvbmcgZWxhcHNlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJXcm90ZSBzbmFwc2hvdCBmb3IgIiArIG5hbWUKLSAgICAgICAgICAgICAgICAgICsgIiBpbiAiICsgZWxhcHNlZCArICJtcy4iKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICAvLyBzZXQgZmlsZSByZWFkYWJsZSB0byB0aGUgd29ybGQgc28gdGhhdCBTYW1wbGluZ1Byb2ZpbGVyU2VydmljZQorICAgICAgICAvLyBjYW4gcHV0IGl0IHRvIGRyb3Bib3gKKyAgICAgICAgbmV3IEZpbGUocGF0aCkuc2V0UmVhZGFibGUodHJ1ZSwgZmFsc2UpOworCisgICAgICAgIGxvbmcgZWxhcHNlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7CisgICAgICAgIExvZy5pKFRBRywgIldyb3RlIHNuYXBzaG90IGZvciAiICsgbmFtZSArICIgaW4gIiArIGVsYXBzZWQgKyAibXMuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2VuZXJhdGUgaGVhZGVyIGZvciBzbmFwc2hvdHMsIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtYXQgKGxpa2UgaHR0cCBoZWFkZXIpOgorICAgICAqCisgICAgICogVmVyc2lvbjogPHZlcnNpb24gbnVtYmVyIG9mIHByb2ZpbGVyPlxuCisgICAgICogUHJvY2VzczogPHByb2Nlc3MgbmFtZT5cbgorICAgICAqIFBhY2thZ2U6IDxwYWNrYWdlIG5hbWUsIGlmIGV4aXN0cz5cbgorICAgICAqIFBhY2thZ2UtVmVyc2lvbjogPHZlcnNpb24gbnVtYmVyIG9mIHRoZSBwYWNrYWdlLCBpZiBleGlzdHM+XG4KKyAgICAgKiBCdWlsZDogPGZpbmdlcnByaW50PlxuCisgICAgICogXG4KKyAgICAgKiA8dGhlIGFjdHVhbCBzbmFwc2hvdCBjb250ZW50IGJlZ2lucyBoZXJlLi4uPgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2VuZXJhdGVTbmFwc2hvdEhlYWRlcihTdHJpbmcgcHJvY2Vzc05hbWUsIFBhY2thZ2VJbmZvIHBhY2thZ2VJbmZvLAorICAgICAgICAgICAgUHJpbnRTdHJlYW0gb3V0KSB7CisgICAgICAgIC8vIHByb2ZpbGVyIHZlcnNpb24KKyAgICAgICAgb3V0LnByaW50bG4oIlZlcnNpb246IDIiKTsKKyAgICAgICAgb3V0LnByaW50bG4oIlByb2Nlc3M6ICIgKyBwcm9jZXNzTmFtZSk7CisgICAgICAgIGlmIChwYWNrYWdlSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiUGFja2FnZTogIiArIHBhY2thZ2VJbmZvLnBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCJQYWNrYWdlLVZlcnNpb246ICIgKyBwYWNrYWdlSW5mby52ZXJzaW9uQ29kZSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oIkJ1aWxkOiAiICsgQnVpbGQuRklOR0VSUFJJTlQpOworICAgICAgICAvLyBzaW5nbGUgYmxhbmsgbGluZSBtZWFucyB0aGUgZW5kIG9mIHNuYXBzaG90IGhlYWRlci4KKyAgICAgICAgb3V0LnByaW50bG4oKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1p5Z290ZUluaXQuamF2YQppbmRleCBhNDA5ZWM4Li5mMGYzMzg3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdC5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVJbml0LmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQubmV0LkxvY2FsU2VydmVyU29ja2V0OwogaW1wb3J0IGFuZHJvaWQub3MuRGVidWc7CitpbXBvcnQgYW5kcm9pZC5vcy5GaWxlVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKQEAgLTUwNiw2ICs1MDcsOSBAQAogCiAgICAgICAgIGNsb3NlU2VydmVyU29ja2V0KCk7CiAKKyAgICAgICAgLy8gc2V0IHVtYXNrIHRvIDAwNzcgc28gbmV3IGZpbGVzIGFuZCBkaXJlY3RvcmllcyB3aWxsIGRlZmF1bHQgdG8gb3duZXItb25seSBwZXJtaXNzaW9ucy4KKyAgICAgICAgRmlsZVV0aWxzLnNldFVNYXNrKEZpbGVVdGlscy5TX0lSV1hHIHwgRmlsZVV0aWxzLlNfSVJXWE8pOworCiAgICAgICAgIC8qCiAgICAgICAgICAqIFBhc3MgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgdG8gU3lzdGVtU2VydmVyLgogICAgICAgICAgKiAiLS1uaWNlLW5hbWU9c3lzdGVtX3NlcnZlciBjb20uYW5kcm9pZC5zZXJ2ZXIuU3lzdGVtU2VydmVyIgpAQCAtNTIzLDcgKzUyNyw3IEBACiAgICAgICAgIFN0cmluZyBhcmdzW10gPSB7CiAgICAgICAgICAgICAiLS1zZXR1aWQ9MTAwMCIsCiAgICAgICAgICAgICAiLS1zZXRnaWQ9MTAwMCIsCi0gICAgICAgICAgICAiLS1zZXRncm91cHM9MTAwMSwxMDAyLDEwMDMsMTAwNCwxMDA1LDEwMDYsMTAwNywxMDA4LDEwMDksMTAxMCwzMDAxLDMwMDIsMzAwMyIsCisgICAgICAgICAgICAiLS1zZXRncm91cHM9MTAwMSwxMDAyLDEwMDMsMTAwNCwxMDA1LDEwMDYsMTAwNywxMDA4LDEwMDksMTAxMCwxMDE4LDMwMDEsMzAwMiwzMDAzIiwKICAgICAgICAgICAgICItLWNhcGFiaWxpdGllcz0xMzAxMDQzNTIsMTMwMTA0MzUyIiwKICAgICAgICAgICAgICItLXJ1bnRpbWUtaW5pdCIsCiAgICAgICAgICAgICAiLS1uaWNlLW5hbWU9c3lzdGVtX3NlcnZlciIsCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3RhdHVzYmFyL0lTdGF0dXNCYXIuYWlkbCBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0Jhci5haWRsCmluZGV4IDQ1MDFiZDcuLmU4ODRhZjggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0Jhci5haWRsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0Jhci5haWRsCkBAIC0zMCw1ICszMCw2IEBACiAgICAgdm9pZCBkaXNhYmxlKGludCBzdGF0ZSk7CiAgICAgdm9pZCBhbmltYXRlRXhwYW5kKCk7CiAgICAgdm9pZCBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICB2b2lkIHNldExpZ2h0c09uKGJvb2xlYW4gb24pOwogfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3RhdHVzYmFyL0lTdGF0dXNCYXJTZXJ2aWNlLmFpZGwgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3RhdHVzYmFyL0lTdGF0dXNCYXJTZXJ2aWNlLmFpZGwKaW5kZXggODUyNjMwZC4uMDc2M2Y1ZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3N0YXR1c2Jhci9JU3RhdHVzQmFyU2VydmljZS5haWRsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0JhclNlcnZpY2UuYWlkbApAQCAtMzAsMTQgKzMwLDE4IEBACiAgICAgdm9pZCBzZXRJY29uKFN0cmluZyBzbG90LCBTdHJpbmcgaWNvblBhY2thZ2UsIGludCBpY29uSWQsIGludCBpY29uTGV2ZWwpOwogICAgIHZvaWQgc2V0SWNvblZpc2liaWxpdHkoU3RyaW5nIHNsb3QsIGJvb2xlYW4gdmlzaWJsZSk7CiAgICAgdm9pZCByZW1vdmVJY29uKFN0cmluZyBzbG90KTsKKyAgICB2b2lkIHNldEFjdGl2ZVdpbmRvd0lzRnVsbHNjcmVlbihib29sZWFuIGZ1bGxzY3JlZW4pOwogCiAgICAgLy8gLS0tLSBNZXRob2RzIGJlbG93IGFyZSBmb3IgdXNlIGJ5IHRoZSBzdGF0dXMgYmFyIHBvbGljeSBzZXJ2aWNlcyAtLS0tCiAgICAgLy8gWW91IG5lZWQgdGhlIFNUQVRVU19CQVJfU0VSVklDRSBwZXJtaXNzaW9uCiAgICAgdm9pZCByZWdpc3RlclN0YXR1c0JhcihJU3RhdHVzQmFyIGNhbGxiYWNrcywgb3V0IFN0YXR1c0Jhckljb25MaXN0IGljb25MaXN0LAotICAgICAgICAgICAgb3V0IExpc3Q8SUJpbmRlcj4gbm90aWZpY2F0aW9uS2V5cywgb3V0IExpc3Q8U3RhdHVzQmFyTm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25zKTsKKyAgICAgICAgICAgIG91dCBMaXN0PElCaW5kZXI+IG5vdGlmaWNhdGlvbktleXMsIG91dCBMaXN0PFN0YXR1c0Jhck5vdGlmaWNhdGlvbj4gbm90aWZpY2F0aW9ucywKKyAgICAgICAgICAgIG91dCBib29sZWFuW10gbGlnaHRzT24pOwogICAgIHZvaWQgb25QYW5lbFJldmVhbGVkKCk7CiAgICAgdm9pZCBvbk5vdGlmaWNhdGlvbkNsaWNrKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCk7CiAgICAgdm9pZCBvbk5vdGlmaWNhdGlvbkVycm9yKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCwKICAgICAgICAgICAgIGludCB1aWQsIGludCBpbml0aWFsUGlkLCBTdHJpbmcgbWVzc2FnZSk7CiAgICAgdm9pZCBvbkNsZWFyQWxsTm90aWZpY2F0aW9ucygpOworICAgIHZvaWQgb25Ob3RpZmljYXRpb25DbGVhcihTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpOworICAgIHZvaWQgc2V0TGlnaHRzT24oYm9vbGVhbiBvbik7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3RhdHVzYmFyL1N0YXR1c0Jhck5vdGlmaWNhdGlvbi5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3N0YXR1c2Jhci9TdGF0dXNCYXJOb3RpZmljYXRpb24uamF2YQppbmRleCBhYTM0MGZiLi4yYjk2YmY2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3RhdHVzYmFyL1N0YXR1c0Jhck5vdGlmaWNhdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvU3RhdHVzQmFyTm90aWZpY2F0aW9uLmphdmEKQEAgLTEyMSw2ICsxMjEsMTAgQEAKICAgICAgICAgcmV0dXJuIChub3RpZmljYXRpb24uZmxhZ3MgJiBOb3RpZmljYXRpb24uRkxBR19PTkdPSU5HX0VWRU5UKSAhPSAwOwogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIGlzQ2xlYXJhYmxlKCkgeworICAgICAgICByZXR1cm4gKChub3RpZmljYXRpb24uZmxhZ3MgJiBOb3RpZmljYXRpb24uRkxBR19PTkdPSU5HX0VWRU5UKSA9PSAwKQorICAgICAgICAgICAgICAgICYmICgobm90aWZpY2F0aW9uLmZsYWdzICYgTm90aWZpY2F0aW9uLkZMQUdfTk9fQ0xFQVIpID09IDApOworICAgIH0KIH0KIAogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9IaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL0hpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5qYXZhCmluZGV4IGY3ODkzMDEuLjMwMzAzMTYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL0hpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL0hpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5qYXZhCkBAIC0xMTk3LDYgKzExOTcsMzUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBHZXQgYSBtZXNzYWdlIGFuZCBzZXQgTWVzc2FnZS50YXJnZXQgPSB0aGlzLAorICAgICAqIHdoYXQsIGFyZzEgYW5kIGFyZzIKKyAgICAgKgorICAgICAqIEBwYXJhbSB3aGF0ICBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLndoYXQKKyAgICAgKiBAcGFyYW0gYXJnMSAgaXMgYXNzaWduZWQgdG8gTWVzc2FnZS5hcmcxCisgICAgICogQHBhcmFtIGFyZzIgIGlzIGFzc2lnbmVkIHRvIE1lc3NhZ2UuYXJnMgorICAgICAqIEByZXR1cm4gIEEgTWVzc2FnZSBvYmplY3QgZnJvbSB0aGUgZ2xvYmFsIHBvb2wuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIE1lc3NhZ2Ugb2J0YWluTWVzc2FnZShpbnQgd2hhdCwgaW50IGFyZzEsIGludCBhcmcyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1lc3NhZ2Uub2J0YWluKG1Ic21IYW5kbGVyLCB3aGF0LCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBtZXNzYWdlIGFuZCBzZXQgTWVzc2FnZS50YXJnZXQgPSB0aGlzLAorICAgICAqIHdoYXQsIGFyZzEsIGFyZzIgYW5kIG9iagorICAgICAqCisgICAgICogQHBhcmFtIHdoYXQgIGlzIGFzc2lnbmVkIHRvIE1lc3NhZ2Uud2hhdAorICAgICAqIEBwYXJhbSBhcmcxICBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLmFyZzEKKyAgICAgKiBAcGFyYW0gYXJnMiAgaXMgYXNzaWduZWQgdG8gTWVzc2FnZS5hcmcyCisgICAgICogQHBhcmFtIG9iaiBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLm9iagorICAgICAqIEByZXR1cm4gIEEgTWVzc2FnZSBvYmplY3QgZnJvbSB0aGUgZ2xvYmFsIHBvb2wuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIE1lc3NhZ2Ugb2J0YWluTWVzc2FnZShpbnQgd2hhdCwgaW50IGFyZzEsIGludCBhcmcyLCBPYmplY3Qgb2JqKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1lc3NhZ2Uub2J0YWluKG1Ic21IYW5kbGVyLCB3aGF0LCBhcmcxLCBhcmcyLCBvYmopOworICAgIH0KKworICAgIC8qKgogICAgICAqIEVucXVldWUgYSBtZXNzYWdlIHRvIHRoaXMgc3RhdGUgbWFjaGluZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBzZW5kTWVzc2FnZShpbnQgd2hhdCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvVHlwZWRQcm9wZXJ0aWVzLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9UeXBlZFByb3BlcnRpZXMuamF2YQppbmRleCBjMmNlMjEwLi41NjEzOTk5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9UeXBlZFByb3BlcnRpZXMuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9UeXBlZFByb3BlcnRpZXMuamF2YQpAQCAtNDEyLDcgKzQxMiw3IEBACiAgICAgICovCiAKICAgICAvKioKLSAgICAgKiBBbiB1bmNoZWNrZWQgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIGlmIGEge0Bjb2RlIGdldCZsdDtUWVBFJmd0OygpfSBtZXRob2QKKyAgICAgKiBBbiB1bmNoZWNrZWQgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIGlmIGEge0Bjb2RlIGdldDxUWVBFPigpfSBtZXRob2QKICAgICAgKiBpcyB1c2VkIHRvIHJldHJpZXZlIGEgcGFyYW1ldGVyIHdob3NlIHR5cGUgZG9lcyBub3QgbWF0Y2ggdGhlIG1ldGhvZCBuYW1lLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHlwZUV4Y2VwdGlvbiBleHRlbmRzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9YbWxVdGlscy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvWG1sVXRpbHMuamF2YQppbmRleCA4ZDhkZjE2Li5lMDBhODUzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9YbWxVdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1htbFV0aWxzLmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtMjg0LDYgKzI4NSwyNiBAQAogCiAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgImxpc3QiKTsKICAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHdyaXRlU2V0WG1sKFNldCB2YWwsIFN0cmluZyBuYW1lLCBYbWxTZXJpYWxpemVyIG91dCkKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm51bGwiKTsKKyAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm51bGwiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJzZXQiKTsKKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAibmFtZSIsIG5hbWUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmb3IgKE9iamVjdCB2IDogdmFsKSB7CisgICAgICAgICAgICB3cml0ZVZhbHVlWG1sKHYsIG51bGwsIG91dCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG91dC5lbmRUYWcobnVsbCwgInNldCIpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIEZsYXR0ZW4gYSBieXRlW10gaW50byBhbiBYbWxTZXJpYWxpemVyLiAgVGhlIGxpc3QgY2FuIGxhdGVyIGJlIHJlYWQgYmFjawpAQCAtNDI2LDYgKzQ0Nyw5IEBACiAgICAgICAgIH0gZWxzZSBpZiAodiBpbnN0YW5jZW9mIExpc3QpIHsKICAgICAgICAgICAgIHdyaXRlTGlzdFhtbCgoTGlzdCl2LCBuYW1lLCBvdXQpOwogICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBTZXQpIHsKKyAgICAgICAgICAgIHdyaXRlU2V0WG1sKChTZXQpdiwgbmFtZSwgb3V0KTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfSBlbHNlIGlmICh2IGluc3RhbmNlb2YgQ2hhclNlcXVlbmNlKSB7CiAgICAgICAgICAgICAvLyBYWFggVGhpcyBpcyB0byBhbGxvdyB1cyB0byBhdCBsZWFzdCB3cml0ZSBzb21ldGhpbmcgaWYKICAgICAgICAgICAgIC8vIHdlIGVuY291bnRlciBzdHlsZWQgdGV4dC4uLiAgYnV0IGl0IG1lYW5zIHdlIHdpbGwgZHJvcCBhbGwKQEAgLTQ3Niw3ICs1MDAsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGluIFRoZSBJbnB1dFN0cmVhbSBmcm9tIHdoaWNoIHRvIHJlYWQuCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIEhhc2hNYXAgVGhlIHJlc3VsdGluZyBsaXN0LgorICAgICAqIEByZXR1cm4gQXJyYXlMaXN0IFRoZSByZXN1bHRpbmcgbGlzdC4KICAgICAgKgogICAgICAqIEBzZWUgI3JlYWRNYXBYbWwKICAgICAgKiBAc2VlICNyZWFkVmFsdWVYbWwKQEAgLTQ5MCw2ICs1MTQsMjkgQEAKICAgICAgICAgcGFyc2VyLnNldElucHV0KGluLCBudWxsKTsKICAgICAgICAgcmV0dXJuIChBcnJheUxpc3QpcmVhZFZhbHVlWG1sKHBhcnNlciwgbmV3IFN0cmluZ1sxXSk7CiAgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJlYWQgYSBIYXNoU2V0IGZyb20gYW4gSW5wdXRTdHJlYW0gY29udGFpbmluZyBYTUwuIFRoZSBzdHJlYW0gY2FuCisgICAgICogcHJldmlvdXNseSBoYXZlIGJlZW4gd3JpdHRlbiBieSB3cml0ZVNldFhtbCgpLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbiBUaGUgSW5wdXRTdHJlYW0gZnJvbSB3aGljaCB0byByZWFkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gSGFzaFNldCBUaGUgcmVzdWx0aW5nIHNldC4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICAgKiAKKyAgICAgKiBAc2VlICNyZWFkVmFsdWVYbWwKKyAgICAgKiBAc2VlICNyZWFkVGhpc1NldFhtbAorICAgICAqIEBzZWUgI3dyaXRlU2V0WG1sCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBIYXNoU2V0IHJlYWRTZXRYbWwoSW5wdXRTdHJlYW0gaW4pCisgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gWG1sLm5ld1B1bGxQYXJzZXIoKTsKKyAgICAgICAgcGFyc2VyLnNldElucHV0KGluLCBudWxsKTsKKyAgICAgICAgcmV0dXJuIChIYXNoU2V0KSByZWFkVmFsdWVYbWwocGFyc2VyLCBuZXcgU3RyaW5nWzFdKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBSZWFkIGEgSGFzaE1hcCBvYmplY3QgZnJvbSBhbiBYbWxQdWxsUGFyc2VyLiAgVGhlIFhNTCBkYXRhIGNvdWxkCkBAIC01NzMsNiArNjIwLDQ3IEBACiAgICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKAogICAgICAgICAgICAgIkRvY3VtZW50IGVuZGVkIGJlZm9yZSAiICsgZW5kVGFnICsgIiBlbmQgdGFnIik7CiAgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlYWQgYSBIYXNoU2V0IG9iamVjdCBmcm9tIGFuIFhtbFB1bGxQYXJzZXIuIFRoZSBYTUwgZGF0YSBjb3VsZCBwcmV2aW91c2x5CisgICAgICogaGF2ZSBiZWVuIGdlbmVyYXRlZCBieSB3cml0ZVNldFhtbCgpLiBUaGUgWG1sUHVsbFBhcnNlciBtdXN0IGJlIHBvc2l0aW9uZWQKKyAgICAgKiA8ZW0+YWZ0ZXI8L2VtPiB0aGUgdGFnIHRoYXQgYmVnaW5zIHRoZSBzZXQuCisgICAgICogCisgICAgICogQHBhcmFtIHBhcnNlciBUaGUgWG1sUHVsbFBhcnNlciBmcm9tIHdoaWNoIHRvIHJlYWQgdGhlIHNldCBkYXRhLgorICAgICAqIEBwYXJhbSBlbmRUYWcgTmFtZSBvZiB0aGUgdGFnIHRoYXQgd2lsbCBlbmQgdGhlIHNldCwgdXN1YWxseSAic2V0Ii4KKyAgICAgKiBAcGFyYW0gbmFtZSBBbiBhcnJheSBvZiBvbmUgc3RyaW5nLCB1c2VkIHRvIHJldHVybiB0aGUgbmFtZSBhdHRyaWJ1dGUKKyAgICAgKiAgICAgICAgICAgICBvZiB0aGUgc2V0J3MgdGFnLgorICAgICAqCisgICAgICogQHJldHVybiBIYXNoU2V0IFRoZSBuZXdseSBnZW5lcmF0ZWQgc2V0LgorICAgICAqIAorICAgICAqIEB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICAgICAqIAorICAgICAqIEBzZWUgI3JlYWRTZXRYbWwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhhc2hTZXQgcmVhZFRoaXNTZXRYbWwoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFN0cmluZyBlbmRUYWcsIFN0cmluZ1tdIG5hbWUpCisgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIEhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgCisgICAgICAgIGludCBldmVudFR5cGUgPSBwYXJzZXIuZ2V0RXZlbnRUeXBlKCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gcGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgIE9iamVjdCB2YWwgPSByZWFkVGhpc1ZhbHVlWG1sKHBhcnNlciwgbmFtZSk7CisgICAgICAgICAgICAgICAgc2V0LmFkZCh2YWwpOworICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgdG8gc2V0OiAiICsgdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09IHBhcnNlci5FTkRfVEFHKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhcnNlci5nZXROYW1lKCkuZXF1YWxzKGVuZFRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgIiArIGVuZFRhZyArICIgZW5kIHRhZyBhdDogIiArIHBhcnNlci5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXZlbnRUeXBlID0gcGFyc2VyLm5leHQoKTsKKyAgICAgICAgfSB3aGlsZSAoZXZlbnRUeXBlICE9IHBhcnNlci5FTkRfRE9DVU1FTlQpOworICAgICAgICAKKyAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkRvY3VtZW50IGVuZGVkIGJlZm9yZSAiICsgZW5kVGFnICsgIiBlbmQgdGFnIik7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogUmVhZCBhbiBpbnRbXSBvYmplY3QgZnJvbSBhbiBYbWxQdWxsUGFyc2VyLiAgVGhlIFhNTCBkYXRhIGNvdWxkCkBAIC03NDAsNiArODI4LDEyIEBACiAgICAgICAgICAgICBuYW1lWzBdID0gdmFsdWVOYW1lOwogICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJldHVybmluZyB2YWx1ZSBmb3IgIiArIHZhbHVlTmFtZSArICI6ICIgKyByZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfSBlbHNlIGlmICh0YWdOYW1lLmVxdWFscygic2V0IikpIHsKKyAgICAgICAgICAgIHBhcnNlci5uZXh0KCk7CisgICAgICAgICAgICByZXMgPSByZWFkVGhpc1NldFhtbChwYXJzZXIsICJzZXQiLCBuYW1lKTsKKyAgICAgICAgICAgIG5hbWVbMF0gPSB2YWx1ZU5hbWU7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiUmV0dXJuaW5nIHZhbHVlIGZvciAiICsgdmFsdWVOYW1lICsgIjogIiArIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgIlVua25vd24gdGFnOiAiICsgdGFnTmFtZSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9CYXNlSVdpbmRvdy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvQmFzZUlXaW5kb3cuamF2YQppbmRleCA0ZGE3NGU2Li5kNTIxM2RiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9CYXNlSVdpbmRvdy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0Jhc2VJV2luZG93LmphdmEKQEAgLTE2LDExICsxNiwxNCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGE7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LkRyYWdFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSVdpbmRvdzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSVdpbmRvd1Nlc3Npb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwpAQCAtNjYsNyArNjksMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKworICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoRHJhZ0V2ZW50KERyYWdFdmVudCBldmVudCkgeworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoV2FsbHBhcGVyQ29tbWFuZChTdHJpbmcgYWN0aW9uLCBpbnQgeCwgaW50IHksCiAgICAgICAgICAgICBpbnQgeiwgQnVuZGxlIGV4dHJhcywgYm9vbGVhbiBzeW5jKSB7CiAgICAgICAgIGlmIChzeW5jKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9JSW5wdXRNZXRob2QuYWlkbCBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0lJbnB1dE1ldGhvZC5haWRsCmluZGV4IDhmZjE4ZWQuLmM3ZmNhYjggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0lJbnB1dE1ldGhvZC5haWRsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0lJbnB1dE1ldGhvZC5haWRsCkBAIC0yMyw2ICsyMyw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5FZGl0b3JJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dEJpbmRpbmc7CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kU3VidHlwZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LklJbnB1dENvbnRleHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5JSW5wdXRNZXRob2RDYWxsYmFjazsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LklJbnB1dE1ldGhvZFNlc3Npb247CkBAIC01Miw0ICs1Myw2IEBACiAgICAgdm9pZCBzaG93U29mdElucHV0KGludCBmbGFncywgaW4gUmVzdWx0UmVjZWl2ZXIgcmVzdWx0UmVjZWl2ZXIpOwogICAgIAogICAgIHZvaWQgaGlkZVNvZnRJbnB1dChpbnQgZmxhZ3MsIGluIFJlc3VsdFJlY2VpdmVyIHJlc3VsdFJlY2VpdmVyKTsKKworICAgIHZvaWQgY2hhbmdlSW5wdXRNZXRob2RTdWJ0eXBlKGluIElucHV0TWV0aG9kU3VidHlwZSBzdWJ0eXBlKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0lJbnB1dE1ldGhvZE1hbmFnZXIuYWlkbCBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0lJbnB1dE1ldGhvZE1hbmFnZXIuYWlkbAppbmRleCBhZGVjMGE3Li5kMDEyYjBmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9JSW5wdXRNZXRob2RNYW5hZ2VyLmFpZGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvSUlucHV0TWV0aG9kTWFuYWdlci5haWRsCkBAIC00OCw2ICs0OCw3IEBACiAgICAgICAgICAgICBpbnQgc29mdElucHV0TW9kZSwgYm9vbGVhbiBmaXJzdCwgaW50IHdpbmRvd0ZsYWdzKTsKICAgICAgICAgICAgIAogICAgIHZvaWQgc2hvd0lucHV0TWV0aG9kUGlja2VyRnJvbUNsaWVudChpbiBJSW5wdXRNZXRob2RDbGllbnQgY2xpZW50KTsKKyAgICB2b2lkIHNob3dJbnB1dE1ldGhvZFN1YnR5cGVQaWNrZXJGcm9tQ2xpZW50KGluIElJbnB1dE1ldGhvZENsaWVudCBjbGllbnQpOwogICAgIHZvaWQgc2V0SW5wdXRNZXRob2QoaW4gSUJpbmRlciB0b2tlbiwgU3RyaW5nIGlkKTsKICAgICB2b2lkIGhpZGVNeVNvZnRJbnB1dChpbiBJQmluZGVyIHRva2VuLCBpbnQgZmxhZ3MpOwogICAgIHZvaWQgc2hvd015U29mdElucHV0KGluIElCaW5kZXIgdG9rZW4sIGludCBmbGFncyk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9TdGFuZGFsb25lQWN0aW9uTW9kZS5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvU3RhbmRhbG9uZUFjdGlvbk1vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzgxOTAxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvU3RhbmRhbG9uZUFjdGlvbk1vZGUuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVQb3B1cEhlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhckNvbnRleHRWaWV3OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CisKK3B1YmxpYyBjbGFzcyBTdGFuZGFsb25lQWN0aW9uTW9kZSBleHRlbmRzIEFjdGlvbk1vZGUgaW1wbGVtZW50cyBNZW51QnVpbGRlci5DYWxsYmFjayB7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgQWN0aW9uQmFyQ29udGV4dFZpZXcgbUNvbnRleHRWaWV3OworICAgIHByaXZhdGUgQWN0aW9uTW9kZS5DYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPFZpZXc+IG1DdXN0b21WaWV3OworICAgIHByaXZhdGUgYm9vbGVhbiBtRmluaXNoZWQ7CisKKyAgICBwcml2YXRlIE1lbnVCdWlsZGVyIG1NZW51OworCisgICAgcHVibGljIFN0YW5kYWxvbmVBY3Rpb25Nb2RlKENvbnRleHQgY29udGV4dCwgQWN0aW9uQmFyQ29udGV4dFZpZXcgdmlldywKKyAgICAgICAgICAgIEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtQ29udGV4dFZpZXcgPSB2aWV3OworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKworICAgICAgICBtTWVudSA9IG5ldyBNZW51QnVpbGRlcihjb250ZXh0KS5zZXREZWZhdWx0U2hvd0FzQWN0aW9uKE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX0lGX1JPT00pOworICAgICAgICBtTWVudS5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbUNvbnRleHRWaWV3LnNldFRpdGxlKHRpdGxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpIHsKKyAgICAgICAgbUNvbnRleHRWaWV3LnNldFN1YnRpdGxlKHN1YnRpdGxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShpbnQgcmVzSWQpIHsKKyAgICAgICAgc2V0VGl0bGUobUNvbnRleHQuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoaW50IHJlc0lkKSB7CisgICAgICAgIHNldFN1YnRpdGxlKG1Db250ZXh0LmdldFN0cmluZyhyZXNJZCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbVZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgIG1Db250ZXh0Vmlldy5zZXRDdXN0b21WaWV3KHZpZXcpOworICAgICAgICBtQ3VzdG9tVmlldyA9IHZpZXcgIT0gbnVsbCA/IG5ldyBXZWFrUmVmZXJlbmNlPFZpZXc+KHZpZXcpIDogbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICBtQ2FsbGJhY2sub25QcmVwYXJlQWN0aW9uTW9kZSh0aGlzLCBtTWVudSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgICAgICBpZiAobUZpbmlzaGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUZpbmlzaGVkID0gdHJ1ZTsKKworICAgICAgICBtQ2FsbGJhY2sub25EZXN0cm95QWN0aW9uTW9kZSh0aGlzKTsKKyAgICAgICAgbUNvbnRleHRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVudSBnZXRNZW51KCkgeworICAgICAgICByZXR1cm4gbU1lbnU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0Vmlldy5nZXRUaXRsZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0U3VidGl0bGUoKSB7CisgICAgICAgIHJldHVybiBtQ29udGV4dFZpZXcuZ2V0U3VidGl0bGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBnZXRDdXN0b21WaWV3KCkgeworICAgICAgICByZXR1cm4gbUN1c3RvbVZpZXcgIT0gbnVsbCA/IG1DdXN0b21WaWV3LmdldCgpIDogbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVudUluZmxhdGVyIGdldE1lbnVJbmZsYXRlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZW51SW5mbGF0ZXIobUNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1TZWxlY3RlZChNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIHJldHVybiBtQ2FsbGJhY2sub25BY3Rpb25JdGVtQ2xpY2tlZCh0aGlzLCBpdGVtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkNsb3NlTWVudShNZW51QnVpbGRlciBtZW51LCBib29sZWFuIGFsbE1lbnVzQXJlQ2xvc2luZykgeworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9uU3ViTWVudVNlbGVjdGVkKFN1Yk1lbnVCdWlsZGVyIHN1Yk1lbnUpIHsKKyAgICAgICAgaWYgKCFzdWJNZW51Lmhhc1Zpc2libGVJdGVtcygpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIG5ldyBNZW51UG9wdXBIZWxwZXIobUNvbnRleHQsIHN1Yk1lbnUpLnNob3coKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25DbG9zZVN1Yk1lbnUoU3ViTWVudUJ1aWxkZXIgbWVudSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uTWVudU1vZGVDaGFuZ2UoTWVudUJ1aWxkZXIgbWVudSkgeworICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIG1Db250ZXh0Vmlldy5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDQ0ZWJjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3ViTWVudTsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uTWVudSBpbXBsZW1lbnRzIE1lbnUgeworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzUXdlcnR5OworICAgIAorICAgIHByaXZhdGUgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBtSXRlbXM7CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnUoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbUl0ZW1zID0gbmV3IEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4oKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0OworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBhZGQoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIHJldHVybiBhZGQoMCwgMCwgMCwgdGl0bGUpOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBhZGQoaW50IHRpdGxlUmVzKSB7CisgICAgICAgIHJldHVybiBhZGQoMCwgMCwgMCwgdGl0bGVSZXMpOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBhZGQoaW50IGdyb3VwSWQsIGludCBpdGVtSWQsIGludCBvcmRlciwgaW50IHRpdGxlUmVzKSB7CisgICAgICAgIHJldHVybiBhZGQoZ3JvdXBJZCwgaXRlbUlkLCBvcmRlciwgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKHRpdGxlUmVzKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNZW51SXRlbSBhZGQoaW50IGdyb3VwSWQsIGludCBpdGVtSWQsIGludCBvcmRlciwgQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIEFjdGlvbk1lbnVJdGVtIGl0ZW0gPSBuZXcgQWN0aW9uTWVudUl0ZW0oZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgIGdyb3VwSWQsIGl0ZW1JZCwgMCwgb3JkZXIsIHRpdGxlKTsKKyAgICAgICAgbUl0ZW1zLmFkZChvcmRlciwgaXRlbSk7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYWRkSW50ZW50T3B0aW9ucyhpbnQgZ3JvdXBJZCwgaW50IGl0ZW1JZCwgaW50IG9yZGVyLAorICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBjYWxsZXIsIEludGVudFtdIHNwZWNpZmljcywgSW50ZW50IGludGVudCwgaW50IGZsYWdzLAorICAgICAgICAgICAgTWVudUl0ZW1bXSBvdXRTcGVjaWZpY0l0ZW1zKSB7CisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgZmluYWwgTGlzdDxSZXNvbHZlSW5mbz4gbHJpID0KKyAgICAgICAgICAgICAgICBwbS5xdWVyeUludGVudEFjdGl2aXR5T3B0aW9ucyhjYWxsZXIsIHNwZWNpZmljcywgaW50ZW50LCAwKTsKKyAgICAgICAgZmluYWwgaW50IE4gPSBscmkgIT0gbnVsbCA/IGxyaS5zaXplKCkgOiAwOworCisgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FQUEVORF9UT19HUk9VUCkgPT0gMCkgeworICAgICAgICAgICAgcmVtb3ZlR3JvdXAoZ3JvdXBJZCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBSZXNvbHZlSW5mbyByaSA9IGxyaS5nZXQoaSk7CisgICAgICAgICAgICBJbnRlbnQgcmludGVudCA9IG5ldyBJbnRlbnQoCisgICAgICAgICAgICAgICAgcmkuc3BlY2lmaWNJbmRleCA8IDAgPyBpbnRlbnQgOiBzcGVjaWZpY3Nbcmkuc3BlY2lmaWNJbmRleF0pOworICAgICAgICAgICAgcmludGVudC5zZXRDb21wb25lbnQobmV3IENvbXBvbmVudE5hbWUoCisgICAgICAgICAgICAgICAgICAgIHJpLmFjdGl2aXR5SW5mby5hcHBsaWNhdGlvbkluZm8ucGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgIHJpLmFjdGl2aXR5SW5mby5uYW1lKSk7CisgICAgICAgICAgICBmaW5hbCBNZW51SXRlbSBpdGVtID0gYWRkKGdyb3VwSWQsIGl0ZW1JZCwgb3JkZXIsIHJpLmxvYWRMYWJlbChwbSkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKHJpLmxvYWRJY29uKHBtKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldEludGVudChyaW50ZW50KTsKKyAgICAgICAgICAgIGlmIChvdXRTcGVjaWZpY0l0ZW1zICE9IG51bGwgJiYgcmkuc3BlY2lmaWNJbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgb3V0U3BlY2lmaWNJdGVtc1tyaS5zcGVjaWZpY0luZGV4XSA9IGl0ZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gTjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ViTWVudSBhZGRTdWJNZW51KENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICAvLyBUT0RPIEltcGxlbWVudCBzdWJtZW51cworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ViTWVudSBhZGRTdWJNZW51KGludCB0aXRsZVJlcykgeworICAgICAgICAvLyBUT0RPIEltcGxlbWVudCBzdWJtZW51cworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ViTWVudSBhZGRTdWJNZW51KGludCBncm91cElkLCBpbnQgaXRlbUlkLCBpbnQgb3JkZXIsCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgLy8gVE9ETyBJbXBsZW1lbnQgc3VibWVudXMKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN1Yk1lbnUgYWRkU3ViTWVudShpbnQgZ3JvdXBJZCwgaW50IGl0ZW1JZCwgaW50IG9yZGVyLCBpbnQgdGl0bGVSZXMpIHsKKyAgICAgICAgLy8gVE9ETyBJbXBsZW1lbnQgc3VibWVudXMKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIG1JdGVtcy5jbGVhcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGludCBmaW5kSXRlbUluZGV4KGludCBpZCkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaXRlbXMuZ2V0KGkpLmdldEl0ZW1JZCgpID09IGlkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gZmluZEl0ZW0oaW50IGlkKSB7CisgICAgICAgIHJldHVybiBtSXRlbXMuZ2V0KGZpbmRJdGVtSW5kZXgoaWQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gZ2V0SXRlbShpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQoaW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1Zpc2libGVJdGVtcygpIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBpdGVtcyA9IG1JdGVtczsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpdGVtcy5nZXQoaSkuaXNWaXNpYmxlKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIEFjdGlvbk1lbnVJdGVtIGZpbmRJdGVtV2l0aFNob3J0Y3V0KGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICAvLyBUT0RPIE1ha2UgdGhpcyBzbWFydGVyLgorICAgICAgICBmaW5hbCBib29sZWFuIHF3ZXJ0eSA9IG1Jc1F3ZXJ0eTsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBpdGVtcyA9IG1JdGVtczsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEFjdGlvbk1lbnVJdGVtIGl0ZW0gPSBpdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBmaW5hbCBjaGFyIHNob3J0Y3V0ID0gcXdlcnR5ID8gaXRlbS5nZXRBbHBoYWJldGljU2hvcnRjdXQoKSA6CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uZ2V0TnVtZXJpY1Nob3J0Y3V0KCk7CisgICAgICAgICAgICBpZiAoa2V5Q29kZSA9PSBzaG9ydGN1dCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2hvcnRjdXRLZXkoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIHJldHVybiBmaW5kSXRlbVdpdGhTaG9ydGN1dChrZXlDb2RlLCBldmVudCkgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtSWRlbnRpZmllckFjdGlvbihpbnQgaWQsIGludCBmbGFncykgeworICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBmaW5kSXRlbUluZGV4KGlkKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQoaW5kZXgpLmludm9rZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1TaG9ydGN1dChpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQsIGludCBmbGFncykgeworICAgICAgICBBY3Rpb25NZW51SXRlbSBpdGVtID0gZmluZEl0ZW1XaXRoU2hvcnRjdXQoa2V5Q29kZSwgZXZlbnQpOworICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBpdGVtLmludm9rZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUdyb3VwKGludCBncm91cElkKSB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4gaXRlbXMgPSBtSXRlbXM7CisgICAgICAgIGludCBpdGVtQ291bnQgPSBpdGVtcy5zaXplKCk7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBpdGVtQ291bnQpIHsKKyAgICAgICAgICAgIGlmIChpdGVtcy5nZXQoaSkuZ2V0R3JvdXBJZCgpID09IGdyb3VwSWQpIHsKKyAgICAgICAgICAgICAgICBpdGVtcy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgaXRlbUNvdW50LS07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUl0ZW0oaW50IGlkKSB7CisgICAgICAgIG1JdGVtcy5yZW1vdmUoZmluZEl0ZW1JbmRleChpZCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwQ2hlY2thYmxlKGludCBncm91cCwgYm9vbGVhbiBjaGVja2FibGUsCisgICAgICAgICAgICBib29sZWFuIGV4Y2x1c2l2ZSkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQWN0aW9uTWVudUl0ZW0gaXRlbSA9IGl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtLmdldEdyb3VwSWQoKSA9PSBncm91cCkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0Q2hlY2thYmxlKGNoZWNrYWJsZSk7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRFeGNsdXNpdmVDaGVja2FibGUoZXhjbHVzaXZlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwRW5hYmxlZChpbnQgZ3JvdXAsIGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQWN0aW9uTWVudUl0ZW0gaXRlbSA9IGl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtLmdldEdyb3VwSWQoKSA9PSBncm91cCkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwVmlzaWJsZShpbnQgZ3JvdXAsIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQWN0aW9uTWVudUl0ZW0gaXRlbSA9IGl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtLmdldEdyb3VwSWQoKSA9PSBncm91cCkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0VmlzaWJsZSh2aXNpYmxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFF3ZXJ0eU1vZGUoYm9vbGVhbiBpc1F3ZXJ0eSkgeworICAgICAgICBtSXNRd2VydHkgPSBpc1F3ZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiBtSXRlbXMuc2l6ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW0uamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjg1MWE5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbS5qYXZhCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1Yk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEFjdGlvbk1lbnVJdGVtIGltcGxlbWVudHMgTWVudUl0ZW0geworICAgIHByaXZhdGUgZmluYWwgaW50IG1JZDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtR3JvdXA7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUNhdGVnb3J5T3JkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU9yZGVyaW5nOworICAgIAorICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1UaXRsZTsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGVDb25kZW5zZWQ7CisgICAgcHJpdmF0ZSBJbnRlbnQgbUludGVudDsKKyAgICBwcml2YXRlIGNoYXIgbVNob3J0Y3V0TnVtZXJpY0NoYXI7CisgICAgcHJpdmF0ZSBjaGFyIG1TaG9ydGN1dEFscGhhYmV0aWNDaGFyOworICAgIAorICAgIHByaXZhdGUgRHJhd2FibGUgbUljb25EcmF3YWJsZTsKKyAgICBwcml2YXRlIGludCBtSWNvblJlc0lkID0gTk9fSUNPTjsKKyAgICAKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgCisgICAgcHJpdmF0ZSBNZW51SXRlbS5Pbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciBtQ2xpY2tMaXN0ZW5lcjsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9fSUNPTiA9IDA7CisgICAgCisgICAgcHJpdmF0ZSBpbnQgbUZsYWdzID0gRU5BQkxFRDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hFQ0tBQkxFICAgICAgPSAweDAwMDAwMDAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEVDS0VEICAgICAgICA9IDB4MDAwMDAwMDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYQ0xVU0lWRSAgICAgID0gMHgwMDAwMDAwNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSElEREVOICAgICAgICAgPSAweDAwMDAwMDA4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkFCTEVEICAgICAgICA9IDB4MDAwMDAwMTA7CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnVJdGVtKENvbnRleHQgY29udGV4dCwgaW50IGdyb3VwLCBpbnQgaWQsIGludCBjYXRlZ29yeU9yZGVyLCBpbnQgb3JkZXJpbmcsCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtSWQgPSBpZDsKKyAgICAgICAgbUdyb3VwID0gZ3JvdXA7CisgICAgICAgIG1DYXRlZ29yeU9yZGVyID0gY2F0ZWdvcnlPcmRlcjsKKyAgICAgICAgbU9yZGVyaW5nID0gb3JkZXJpbmc7CisgICAgICAgIG1UaXRsZSA9IHRpdGxlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgY2hhciBnZXRBbHBoYWJldGljU2hvcnRjdXQoKSB7CisgICAgICAgIHJldHVybiBtU2hvcnRjdXRBbHBoYWJldGljQ2hhcjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEdyb3VwSWQoKSB7CisgICAgICAgIHJldHVybiBtR3JvdXA7CisgICAgfQorCisgICAgcHVibGljIERyYXdhYmxlIGdldEljb24oKSB7CisgICAgICAgIHJldHVybiBtSWNvbkRyYXdhYmxlOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlbnQgZ2V0SW50ZW50KCkgeworICAgICAgICByZXR1cm4gbUludGVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEl0ZW1JZCgpIHsKKyAgICAgICAgcmV0dXJuIG1JZDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29udGV4dE1lbnVJbmZvIGdldE1lbnVJbmZvKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgY2hhciBnZXROdW1lcmljU2hvcnRjdXQoKSB7CisgICAgICAgIHJldHVybiBtU2hvcnRjdXROdW1lcmljQ2hhcjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE9yZGVyKCkgeworICAgICAgICByZXR1cm4gbU9yZGVyaW5nOworICAgIH0KKworICAgIHB1YmxpYyBTdWJNZW51IGdldFN1Yk1lbnUoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKSB7CisgICAgICAgIHJldHVybiBtVGl0bGU7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZUNvbmRlbnNlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1UaXRsZUNvbmRlbnNlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdWJNZW51KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2FibGUoKSB7CisgICAgICAgIHJldHVybiAobUZsYWdzICYgQ0hFQ0tBQkxFKSAhPSAwOyAKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoKSB7CisgICAgICAgIHJldHVybiAobUZsYWdzICYgQ0hFQ0tFRCkgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiAobUZsYWdzICYgRU5BQkxFRCkgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CisgICAgICAgIHJldHVybiAobUZsYWdzICYgSElEREVOKSA9PSAwOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRBbHBoYWJldGljU2hvcnRjdXQoY2hhciBhbHBoYUNoYXIpIHsKKyAgICAgICAgbVNob3J0Y3V0QWxwaGFiZXRpY0NoYXIgPSBhbHBoYUNoYXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRDaGVja2FibGUoYm9vbGVhbiBjaGVja2FibGUpIHsKKyAgICAgICAgbUZsYWdzID0gKG1GbGFncyAmIH5DSEVDS0FCTEUpIHwgKGNoZWNrYWJsZSA/IENIRUNLQUJMRSA6IDApOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnVJdGVtIHNldEV4Y2x1c2l2ZUNoZWNrYWJsZShib29sZWFuIGV4Y2x1c2l2ZSkgeworICAgICAgICBtRmxhZ3MgPSAobUZsYWdzICYgfkVYQ0xVU0lWRSkgfCAoZXhjbHVzaXZlID8gRVhDTFVTSVZFIDogMCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRDaGVja2VkKGJvb2xlYW4gY2hlY2tlZCkgeworICAgICAgICBtRmxhZ3MgPSAobUZsYWdzICYgfkNIRUNLRUQpIHwgKGNoZWNrZWQgPyBDSEVDS0VEIDogMCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtRmxhZ3MgPSAobUZsYWdzICYgfkVOQUJMRUQpIHwgKGVuYWJsZWQgPyBFTkFCTEVEIDogMCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRJY29uKERyYXdhYmxlIGljb24pIHsKKyAgICAgICAgbUljb25EcmF3YWJsZSA9IGljb247CisgICAgICAgIG1JY29uUmVzSWQgPSBOT19JQ09OOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0SWNvbihpbnQgaWNvblJlcykgeworICAgICAgICBtSWNvblJlc0lkID0gaWNvblJlczsKKyAgICAgICAgbUljb25EcmF3YWJsZSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERyYXdhYmxlKGljb25SZXMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0SW50ZW50KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgbUludGVudCA9IGludGVudDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldE51bWVyaWNTaG9ydGN1dChjaGFyIG51bWVyaWNDaGFyKSB7CisgICAgICAgIG1TaG9ydGN1dE51bWVyaWNDaGFyID0gbnVtZXJpY0NoYXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciBtZW51SXRlbUNsaWNrTGlzdGVuZXIpIHsKKyAgICAgICAgbUNsaWNrTGlzdGVuZXIgPSBtZW51SXRlbUNsaWNrTGlzdGVuZXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRTaG9ydGN1dChjaGFyIG51bWVyaWNDaGFyLCBjaGFyIGFscGhhQ2hhcikgeworICAgICAgICBtU2hvcnRjdXROdW1lcmljQ2hhciA9IG51bWVyaWNDaGFyOworICAgICAgICBtU2hvcnRjdXRBbHBoYWJldGljQ2hhciA9IGFscGhhQ2hhcjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtVGl0bGUgPSB0aXRsZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldFRpdGxlKGludCB0aXRsZSkgeworICAgICAgICBtVGl0bGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcodGl0bGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0VGl0bGVDb25kZW5zZWQoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIG1UaXRsZUNvbmRlbnNlZCA9IHRpdGxlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgbUZsYWdzID0gKG1GbGFncyAmIEhJRERFTikgfCAodmlzaWJsZSA/IDAgOiBISURERU4pOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpbnZva2UoKSB7CisgICAgICAgIGlmIChtQ2xpY2tMaXN0ZW5lciAhPSBudWxsICYmIG1DbGlja0xpc3RlbmVyLm9uTWVudUl0ZW1DbGljayh0aGlzKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkobUludGVudCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93QXNBY3Rpb24oaW50IHNob3cpIHsKKyAgICAgICAgLy8gRG8gbm90aGluZy4gQWN0aW9uTWVudUl0ZW1zIGFsd2F5cyBzaG93IGFzIGFjdGlvbiBidXR0b25zLgorICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRBY3Rpb25WaWV3KFZpZXcgYWN0aW9uVmlldykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlldyBnZXRBY3Rpb25WaWV3KCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtVmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA0MzhjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbVZpZXcuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uTWVudUl0ZW1WaWV3IGV4dGVuZHMgRnJhbWVMYXlvdXQKKyAgICAgICAgaW1wbGVtZW50cyBNZW51Vmlldy5JdGVtVmlldywgVmlldy5PbkNsaWNrTGlzdGVuZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQWN0aW9uTWVudUl0ZW1WaWV3IjsKKworICAgIHByaXZhdGUgTWVudUl0ZW1JbXBsIG1JdGVtRGF0YTsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGU7CisgICAgcHJpdmF0ZSBNZW51QnVpbGRlci5JdGVtSW52b2tlciBtSXRlbUludm9rZXI7CisKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1JbWFnZUJ1dHRvbjsKKyAgICBwcml2YXRlIEJ1dHRvbiBtVGV4dEJ1dHRvbjsKKworICAgIHB1YmxpYyBBY3Rpb25NZW51SXRlbVZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIEFjdGlvbk1lbnVJdGVtVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuYWN0aW9uQnV0dG9uU3R5bGUpOworICAgIH0KKworICAgIHB1YmxpYyBBY3Rpb25NZW51SXRlbVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoSW5mbGF0ZSgpIHsKKyAgICAgICAgbUltYWdlQnV0dG9uID0gKEltYWdlQnV0dG9uKSBmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5pbWFnZUJ1dHRvbik7CisgICAgICAgIG1UZXh0QnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQudGV4dEJ1dHRvbik7CisgICAgICAgIG1JbWFnZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1UZXh0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW1JbXBsIGdldEl0ZW1EYXRhKCkgeworICAgICAgICByZXR1cm4gbUl0ZW1EYXRhOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoTWVudUl0ZW1JbXBsIGl0ZW1EYXRhLCBpbnQgbWVudVR5cGUpIHsKKyAgICAgICAgbUl0ZW1EYXRhID0gaXRlbURhdGE7CisKKyAgICAgICAgc2V0Q2xpY2thYmxlKHRydWUpOworICAgICAgICBzZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgICAgIHNldEljb24oaXRlbURhdGEuZ2V0SWNvbigpKTsKKyAgICAgICAgc2V0VGl0bGUoaXRlbURhdGEuZ2V0VGl0bGUoKSk7IC8vIFRpdGxlIG9ubHkgdGFrZXMgZWZmZWN0IGlmIHRoZXJlIGlzIG5vIGljb24KKyAgICAgICAgc2V0SWQoaXRlbURhdGEuZ2V0SXRlbUlkKCkpOworCisgICAgICAgIHNldFZpc2liaWxpdHkoaXRlbURhdGEuaXNWaXNpYmxlKCkgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOworICAgICAgICBzZXRFbmFibGVkKGl0ZW1EYXRhLmlzRW5hYmxlZCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBzdXBlci5zZXRFbmFibGVkKGVuYWJsZWQpOworICAgICAgICBtSW1hZ2VCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgbVRleHRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICBpZiAobUl0ZW1JbnZva2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1JdGVtSW52b2tlci5pbnZva2VJdGVtKG1JdGVtRGF0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJdGVtSW52b2tlcihNZW51QnVpbGRlci5JdGVtSW52b2tlciBpbnZva2VyKSB7CisgICAgICAgIG1JdGVtSW52b2tlciA9IGludm9rZXI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcHJlZmVyc0NvbmRlbnNlZFRpdGxlKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2hlY2thYmxlKGJvb2xlYW4gY2hlY2thYmxlKSB7CisgICAgICAgIC8vIFRPRE8gU3VwcG9ydCBjaGVja2FibGUgYWN0aW9uIGl0ZW1zCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2hlY2tlZChib29sZWFuIGNoZWNrZWQpIHsKKyAgICAgICAgLy8gVE9ETyBTdXBwb3J0IGNoZWNrYWJsZSBhY3Rpb24gaXRlbXMKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJY29uKERyYXdhYmxlIGljb24pIHsKKyAgICAgICAgbUltYWdlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoaWNvbik7CisgICAgICAgIGlmIChpY29uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1JbWFnZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworICAgICAgICAgICAgbVRleHRCdXR0b24uc2V0VmlzaWJpbGl0eShHT05FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbWFnZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KEdPTkUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2hvcnRjdXQoYm9vbGVhbiBzaG93U2hvcnRjdXQsIGNoYXIgc2hvcnRjdXRLZXkpIHsKKyAgICAgICAgLy8gQWN0aW9uIGJ1dHRvbnMgZG9uJ3Qgc2hvdyB0ZXh0IGZvciBzaG9ydGN1dCBrZXlzLgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtVGl0bGUgPSB0aXRsZTsKKworICAgICAgICAvLyBwb3B1bGF0ZSBhY2Nlc3NpYmlsaXR5IGRlc2NyaXB0aW9uIHdpdGggdGl0bGUKKyAgICAgICAgc2V0Q29udGVudERlc2NyaXB0aW9uKHRpdGxlKTsKKworICAgICAgICBpZiAobUltYWdlQnV0dG9uLmdldERyYXdhYmxlKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgbVRleHRCdXR0b24uc2V0VGV4dChtVGl0bGUpOworICAgICAgICAgICAgbVRleHRCdXR0b24uc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNob3dzSWNvbigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51Vmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51Vmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOTM5YWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVWaWV3LmphdmEKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25NZW51VmlldyBleHRlbmRzIExpbmVhckxheW91dCBpbXBsZW1lbnRzIE1lbnVCdWlsZGVyLkl0ZW1JbnZva2VyLCBNZW51VmlldyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBY3Rpb25NZW51VmlldyI7CisgICAgCisgICAgcHJpdmF0ZSBNZW51QnVpbGRlciBtTWVudTsKKworICAgIHByaXZhdGUgaW50IG1JdGVtUGFkZGluZzsKKyAgICBwcml2YXRlIGludCBtSXRlbU1hcmdpbjsKKyAgICBwcml2YXRlIGludCBtTWF4SXRlbXM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1SZXNlcnZlT3ZlcmZsb3c7CisgICAgcHJpdmF0ZSBPdmVyZmxvd01lbnVCdXR0b24gbU92ZXJmbG93QnV0dG9uOworICAgIHByaXZhdGUgTWVudVBvcHVwSGVscGVyIG1PdmVyZmxvd1BvcHVwOworCisgICAgcHJpdmF0ZSBSdW5uYWJsZSBtU2hvd092ZXJmbG93ID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBzaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0KKyAgICB9OworICAgIAorICAgIHB1YmxpYyBBY3Rpb25NZW51VmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnVWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5UaGVtZSk7CisgICAgICAgIG1JdGVtUGFkZGluZyA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxPZmZzZXQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVGhlbWVfYWN0aW9uQnV0dG9uUGFkZGluZywgMCk7CisgICAgICAgIG1JdGVtTWFyZ2luID0gbUl0ZW1QYWRkaW5nIC8gMjsKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgLy8gTWVhc3VyZSBmb3IgaW5pdGlhbCBjb25maWd1cmF0aW9uCisgICAgICAgIG1NYXhJdGVtcyA9IG1lYXN1cmVNYXhBY3Rpb25CdXR0b25zKCk7CisKKyAgICAgICAgLy8gVE9ETyBUaGVyZSBoYXMgdG8gYmUgYSBiZXR0ZXIgd2F5IHRvIGluZGljYXRlIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIGhhcmQgbWVudSBrZXkuCisgICAgICAgIGZpbmFsIGludCBzY3JlZW4gPSBnZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCkuc2NyZWVuTGF5b3V0OworICAgICAgICBtUmVzZXJ2ZU92ZXJmbG93ID0gKHNjcmVlbiAmIENvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfTUFTSykgPT0KKyAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX1hMQVJHRTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7CisgICAgICAgIGZpbmFsIGludCBzY3JlZW4gPSBuZXdDb25maWcuc2NyZWVuTGF5b3V0OworICAgICAgICBtUmVzZXJ2ZU92ZXJmbG93ID0gKHNjcmVlbiAmIENvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfTUFTSykgPT0KKyAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX1hMQVJHRTsKKyAgICAgICAgbU1heEl0ZW1zID0gbWVhc3VyZU1heEFjdGlvbkJ1dHRvbnMoKTsKKyAgICAgICAgaWYgKG1NZW51ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1NZW51LnNldE1heEFjdGlvbkl0ZW1zKG1NYXhJdGVtcyk7CisgICAgICAgICAgICB1cGRhdGVDaGlsZHJlbihmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobU92ZXJmbG93UG9wdXAgIT0gbnVsbCAmJiBtT3ZlcmZsb3dQb3B1cC5pc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgbU92ZXJmbG93UG9wdXAuZGlzbWlzcygpOworICAgICAgICAgICAgcG9zdChtU2hvd092ZXJmbG93KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IG1lYXN1cmVNYXhBY3Rpb25CdXR0b25zKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIGZpbmFsIGludCBzaXplID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLmFjdGlvbl9pY29uX3NpemUpOworICAgICAgICBmaW5hbCBpbnQgc3BhY2VBdmFpbGFibGUgPSByZXMuZ2V0RGlzcGxheU1ldHJpY3MoKS53aWR0aFBpeGVscyAvIDI7CisgICAgICAgIGZpbmFsIGludCBpdGVtU3BhY2UgPSBzaXplICsgbUl0ZW1QYWRkaW5nOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHNwYWNlQXZhaWxhYmxlIC8gKGl0ZW1TcGFjZSA+IDAgPyBpdGVtU3BhY2UgOiAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJmbG93UmVzZXJ2ZWQoKSB7CisgICAgICAgIHJldHVybiBtUmVzZXJ2ZU92ZXJmbG93OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRPdmVyZmxvd1Jlc2VydmVkKGJvb2xlYW4gcmVzZXJ2ZU92ZXJmbG93KSB7CisgICAgICAgIG1SZXNlcnZlT3ZlcmZsb3cgPSByZXNlcnZlT3ZlcmZsb3c7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tMYXlvdXRQYXJhbXMoVmlld0dyb3VwLkxheW91dFBhcmFtcyBwKSB7CisgICAgICAgIGlmIChwIGluc3RhbmNlb2YgTGF5b3V0UGFyYW1zKSB7CisgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSAoTGF5b3V0UGFyYW1zKSBwOworICAgICAgICAgICAgcmV0dXJuIGxwLmxlZnRNYXJnaW4gPT0gbUl0ZW1NYXJnaW4gJiYgbHAucmlnaHRNYXJnaW4gPT0gbUl0ZW1NYXJnaW4gJiYKKyAgICAgICAgICAgICAgICAgICAgbHAuZ3Jhdml0eSA9PSBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCAmJgorICAgICAgICAgICAgICAgICAgICBscC53aWR0aCA9PSBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UICYmIGxwLmhlaWdodCA9PSBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIExheW91dFBhcmFtcyBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXMoKSB7CisgICAgICAgIExheW91dFBhcmFtcyBwYXJhbXMgPSBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7CisgICAgICAgIHBhcmFtcy5sZWZ0TWFyZ2luID0gbUl0ZW1NYXJnaW47CisgICAgICAgIHBhcmFtcy5yaWdodE1hcmdpbiA9IG1JdGVtTWFyZ2luOworICAgICAgICBwYXJhbXMuZ3Jhdml0eSA9IEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMOworICAgICAgICByZXR1cm4gcGFyYW1zOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcCkgeworICAgICAgICByZXR1cm4gZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0SXRlbU1hcmdpbigpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtTWFyZ2luOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGludm9rZUl0ZW0oTWVudUl0ZW1JbXBsIGl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIG1NZW51LnBlcmZvcm1JdGVtQWN0aW9uKGl0ZW0sIDApOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0V2luZG93QW5pbWF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShNZW51QnVpbGRlciBtZW51LCBpbnQgbWVudVR5cGUpIHsKKyAgICAgICAgbWVudS5zZXRNYXhBY3Rpb25JdGVtcyhtTWF4SXRlbXMpOworICAgICAgICBtTWVudSA9IG1lbnU7CisgICAgICAgIHVwZGF0ZUNoaWxkcmVuKHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUNoaWxkcmVuKGJvb2xlYW4gY2xlYXJlZCkgeworICAgICAgICBmaW5hbCBib29sZWFuIHJlc2VydmVPdmVyZmxvdyA9IG1SZXNlcnZlT3ZlcmZsb3c7CisgICAgICAgIHJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgIAorICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBpdGVtc1RvU2hvdyA9IG1NZW51LmdldEFjdGlvbkl0ZW1zKHJlc2VydmVPdmVyZmxvdyk7CisgICAgICAgIGZpbmFsIGludCBpdGVtQ291bnQgPSBpdGVtc1RvU2hvdy5zaXplKCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBNZW51SXRlbUltcGwgaXRlbURhdGEgPSBpdGVtc1RvU2hvdy5nZXQoaSk7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGFjdGlvblZpZXcgPSBpdGVtRGF0YS5nZXRBY3Rpb25WaWV3KCk7CisgICAgICAgICAgICBpZiAoYWN0aW9uVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWRkVmlldyhhY3Rpb25WaWV3KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWRkSXRlbVZpZXcoKEFjdGlvbk1lbnVJdGVtVmlldykgaXRlbURhdGEuZ2V0SXRlbVZpZXcoCisgICAgICAgICAgICAgICAgICAgICAgICBNZW51QnVpbGRlci5UWVBFX0FDVElPTl9CVVRUT04sIHRoaXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXNlcnZlT3ZlcmZsb3cpIHsKKyAgICAgICAgICAgIGlmIChtTWVudS5nZXROb25BY3Rpb25JdGVtcyh0cnVlKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgT3ZlcmZsb3dNZW51QnV0dG9uIGJ1dHRvbiA9IG5ldyBPdmVyZmxvd01lbnVCdXR0b24obUNvbnRleHQpOworICAgICAgICAgICAgICAgIGFkZFZpZXcoYnV0dG9uKTsKKyAgICAgICAgICAgICAgICBtT3ZlcmZsb3dCdXR0b24gPSBidXR0b247CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1PdmVyZmxvd0J1dHRvbiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzaG93T3ZlcmZsb3dNZW51KCkgeworICAgICAgICBpZiAobU92ZXJmbG93QnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIE1lbnVQb3B1cEhlbHBlciBwb3B1cCA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBNZW51UG9wdXBIZWxwZXIoZ2V0Q29udGV4dCgpLCBtTWVudSwgbU92ZXJmbG93QnV0dG9uLCB0cnVlKTsKKyAgICAgICAgICAgIC8vIFBvc3QgdGhpcyBmb3IgbGF0ZXI7IHdlIG1pZ2h0IHN0aWxsIG5lZWQgYSBsYXlvdXQgZm9yIHRoZSBhbmNob3IgdG8gYmUgcmlnaHQuCisgICAgICAgICAgICBwb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHBvcHVwLnNob3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG1PdmVyZmxvd1BvcHVwID0gcG9wdXA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNPdmVyZmxvd01lbnVTaG93aW5nKCkgeworICAgICAgICBNZW51UG9wdXBIZWxwZXIgcG9wdXAgPSBtT3ZlcmZsb3dQb3B1cDsKKyAgICAgICAgaWYgKHBvcHVwICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBwb3B1cC5pc1Nob3dpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGlkZU92ZXJmbG93TWVudSgpIHsKKyAgICAgICAgTWVudVBvcHVwSGVscGVyIHBvcHVwID0gbU92ZXJmbG93UG9wdXA7CisgICAgICAgIGlmIChwb3B1cCAhPSBudWxsKSB7CisgICAgICAgICAgICBwb3B1cC5kaXNtaXNzKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZEl0ZW1WaWV3KEFjdGlvbk1lbnVJdGVtVmlldyB2aWV3KSB7CisgICAgICAgIHZpZXcuc2V0SXRlbUludm9rZXIodGhpcyk7CisgICAgICAgIGFkZFZpZXcodmlldyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBPdmVyZmxvd01lbnVCdXR0b24gZXh0ZW5kcyBJbWFnZUJ1dHRvbiB7CisgICAgICAgIHB1YmxpYyBPdmVyZmxvd01lbnVCdXR0b24oQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBudWxsLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuYWN0aW9uT3ZlcmZsb3dCdXR0b25TdHlsZSk7CisKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOworICAgICAgICAgICAgc2V0Q2xpY2thYmxlKHRydWUpOworICAgICAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOworICAgICAgICAgICAgc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgIHNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUNsaWNrKCkgeworICAgICAgICAgICAgaWYgKHN1cGVyLnBlcmZvcm1DbGljaygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoYW5nZSB0byBvdmVyZmxvdyBtb2RlCisgICAgICAgICAgICBtTWVudS5nZXRDYWxsYmFjaygpLm9uTWVudU1vZGVDaGFuZ2UobU1lbnUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0ljb25NZW51Vmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9JY29uTWVudVZpZXcuamF2YQppbmRleCBiZWI1N2JhLi4xNzhkY2RlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0ljb25NZW51Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvSWNvbk1lbnVWaWV3LmphdmEKQEAgLTMzNyw3ICszMzcsOSBAQAogICAgICAgICAvLyBUaGlzIG1ldGhvZCBkb2VzIGEgY2xlYXIgcmVmcmVzaCBvZiBjaGlsZHJlbgogICAgICAgICByZW1vdmVBbGxWaWV3cygpOwogICAgICAgICAKLSAgICAgICAgZmluYWwgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gaXRlbXNUb1Nob3cgPSBtTWVudS5nZXRWaXNpYmxlSXRlbXMoKTsKKyAgICAgICAgLy8gSWNvbk1lbnVWaWV3IG5ldmVyIHdhbnRzIGNvbnRlbnQgc29ydGVkIGZvciBhbiBvdmVyZmxvdyBhY3Rpb24gYnV0dG9uLCBzaW5jZQorICAgICAgICAvLyBpdCBpcyBuZXZlciB1c2VkIGluIHRoZSBwcmVzZW5jZSBvZiBhbiBvdmVyZmxvdyBidXR0b24uCisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IGl0ZW1zVG9TaG93ID0gbU1lbnUuZ2V0Tm9uQWN0aW9uSXRlbXMoZmFsc2UpOwogICAgICAgICBmaW5hbCBpbnQgbnVtSXRlbXMgPSBpdGVtc1RvU2hvdy5zaXplKCk7CiAgICAgICAgIGZpbmFsIGludCBudW1JdGVtc1RoYXRDYW5GaXQgPSBtTWF4SXRlbXM7CiAgICAgICAgIC8vIE1pbmltdW0gb2YgdGhlIG51bSB0aGF0IGNhbiBmaXQgYW5kIHRoZSBudW0gdGhhdCB3ZSBoYXZlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVCdWlsZGVyLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVCdWlsZGVyLmphdmEKaW5kZXggMjI4ZDVkMC4uZDUxN2Q0YyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51QnVpbGRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUJ1aWxkZXIuamF2YQpAQCAtMjcsMTYgKzI3LDE3IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUNoYXJhY3Rlck1hcDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3ViTWVudTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VBZGFwdGVyOwpAQCAtNTQsNyArNTUsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dUQUcgPSAiTWVudUJ1aWxkZXIiOwogICAgIAogICAgIC8qKiBUaGUgbnVtYmVyIG9mIGRpZmZlcmVudCBtZW51IHR5cGVzICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1RZUEVTID0gMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1fVFlQRVMgPSA1OwogICAgIC8qKiBUaGUgbWVudSB0eXBlIHRoYXQgcmVwcmVzZW50cyB0aGUgaWNvbiBtZW51IHZpZXcgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0lDT04gPSAwOwogICAgIC8qKiBUaGUgbWVudSB0eXBlIHRoYXQgcmVwcmVzZW50cyB0aGUgZXhwYW5kZWQgbWVudSB2aWV3ICovCkBAIC02NSwxNCArNjYsMjcgQEAKICAgICAgKiBoYXZlIGFuIEl0ZW1WaWV3LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRElBTE9HID0gMjsKKyAgICAvKioKKyAgICAgKiBUaGUgbWVudSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhIGJ1dHRvbiBpbiB0aGUgYXBwbGljYXRpb24ncyBhY3Rpb24gYmFyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQUNUSU9OX0JVVFRPTiA9IDM7CisgICAgLyoqCisgICAgICogVGhlIG1lbnUgdHlwZSB0aGF0IHJlcHJlc2VudHMgYSBtZW51IHBvcHVwLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfUE9QVVAgPSA0OwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdTX1RBRyA9ICJhbmRyb2lkOnZpZXdzIjsKLSAgICAKKwogICAgIC8vIE9yZGVyIG11c3QgYmUgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIFRZUEVfKgorICAgIC8vIFNwZWNpYWwgdmFsdWVzOgorICAgIC8vIDA6IFVzZSB0aGUgc3lzdGVtIGRlZmF1bHQgdGhlbWUKKyAgICAvLyAtMTogVXNlIHRoZSBhcHAncyBvd24gdGhlbWUKICAgICBzdGF0aWMgZmluYWwgaW50IFRIRU1FX1JFU19GT1JfVFlQRVtdID0gbmV3IGludFtdIHsKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9JY29uTWVudSwKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9FeHBhbmRlZE1lbnUsCi0gICAgICAgIDAsCisgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfTGlnaHQsCisgICAgICAgIC0xLAorICAgICAgICAtMSwKICAgICB9OwogICAgIAogICAgIC8vIE9yZGVyIG11c3QgYmUgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIFRZUEVfKgpAQCAtODAsNiArOTQsOCBAQAogICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5pY29uX21lbnVfbGF5b3V0LAogICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5leHBhbmRlZF9tZW51X2xheW91dCwKICAgICAgICAgMCwKKyAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuYWN0aW9uX21lbnVfbGF5b3V0LAorICAgICAgICAwLAogICAgIH07CiAKICAgICAvLyBPcmRlciBtdXN0IGJlIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBUWVBFXyoKQEAgLTg3LDYgKzEwMyw4IEBACiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmljb25fbWVudV9pdGVtX2xheW91dCwKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQubGlzdF9tZW51X2l0ZW1fbGF5b3V0LAogICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5saXN0X21lbnVfaXRlbV9sYXlvdXQsCisgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LmFjdGlvbl9tZW51X2l0ZW1fbGF5b3V0LAorICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5wb3B1cF9tZW51X2l0ZW1fbGF5b3V0LAogICAgIH07CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSAgc0NhdGVnb3J5VG9PcmRlciA9IG5ldyBpbnRbXSB7CkBAIC0xMzAsNiArMTQ4LDM1IEBACiAgICAgICogZmV0Y2hlZCBmcm9tIHtAbGluayAjZ2V0VmlzaWJsZUl0ZW1zKCl9CiAgICAgICovIAogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNWaXNpYmxlSXRlbXNTdGFsZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb250YWlucyBvbmx5IHRoZSBpdGVtcyB0aGF0IHNob3VsZCBhcHBlYXIgaW4gdGhlIEFjdGlvbiBCYXIsIGlmIHByZXNlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBtQWN0aW9uSXRlbXM7CisgICAgLyoqCisgICAgICogQ29udGFpbnMgaXRlbXMgdGhhdCBzaG91bGQgTk9UIGFwcGVhciBpbiB0aGUgQWN0aW9uIEJhciwgaWYgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IG1Ob25BY3Rpb25JdGVtczsKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIHZpc2libGUgYWN0aW9uIGJ1dHRvbnMgcGVybWl0dGVkIGluIHRoaXMgbWVudQorICAgICAqLworICAgIHByaXZhdGUgaW50IG1NYXhBY3Rpb25JdGVtczsKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgaXRlbXMgKG9yIGFueSBvbmUgaXRlbSdzIGFjdGlvbiBzdGF0ZSkgaGFzIGNoYW5nZWQgc2luY2UgaXQgd2FzCisgICAgICogbGFzdCBmZXRjaGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBY3Rpb25JdGVtc1N0YWxlOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgcHJvY2VzcyBvZiBncmFudGluZyBzcGFjZSBhcyBhY3Rpb24gaXRlbXMgc2hvdWxkIHJlc2VydmUgYSBzcGFjZSBmb3IKKyAgICAgKiBhbiBvdmVyZmxvdyBvcHRpb24gaW4gdGhlIGFjdGlvbiBsaXN0LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzZXJ2ZUFjdGlvbk92ZXJmbG93OworCisgICAgLyoqCisgICAgICogRGVmYXVsdCB2YWx1ZSBmb3IgaG93IGFkZGVkIGl0ZW1zIHNob3VsZCBzaG93IGluIHRoZSBhY3Rpb24gbGlzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtRGVmYXVsdFNob3dBc0FjdGlvbiA9IE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX05FVkVSOwogCiAgICAgLyoqCiAgICAgICogQ3VycmVudCB1c2UgY2FzZSBpcyBDb250ZXh0IE1lbnVzOiBBcyBWaWV3cyBwb3B1bGF0ZSB0aGUgY29udGV4dCBtZW51LCBlYWNoIG9uZSBoYXMKQEAgLTE3Niw4ICsyMjMsOSBAQAogICAgICAgICBMYXlvdXRJbmZsYXRlciBnZXRJbmZsYXRlcigpIHsKICAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBpbmZsYXRlciB0aGF0IHVzZXMgdGhlIGdpdmVuIHRoZW1lIGZvciB0aGUgVmlld3MgaXQgaW5mbGF0ZXMKICAgICAgICAgICAgIGlmIChtSW5mbGF0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENvbnRleHQgd3JhcHBlZENvbnRleHQgPSBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihtQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRIRU1FX1JFU19GT1JfVFlQRVttTWVudVR5cGVdKTsgCisgICAgICAgICAgICAgICAgaW50IHRoZW1lUmVzRm9yVHlwZSA9IFRIRU1FX1JFU19GT1JfVFlQRVttTWVudVR5cGVdOworICAgICAgICAgICAgICAgIENvbnRleHQgd3JhcHBlZENvbnRleHQgPSB0aGVtZVJlc0ZvclR5cGUgPCAwID8gbUNvbnRleHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbnRleHRUaGVtZVdyYXBwZXIobUNvbnRleHQsIHRoZW1lUmVzRm9yVHlwZSk7CiAgICAgICAgICAgICAgICAgbUluZmxhdGVyID0gKExheW91dEluZmxhdGVyKSB3cmFwcGVkQ29udGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7CiAgICAgICAgICAgICB9CkBAIC0yODEsMTAgKzMyOSwxOSBAQAogICAgICAgICBtVmlzaWJsZUl0ZW1zID0gbmV3IEFycmF5TGlzdDxNZW51SXRlbUltcGw+KCk7CiAgICAgICAgIG1Jc1Zpc2libGVJdGVtc1N0YWxlID0gdHJ1ZTsKICAgICAgICAgCisgICAgICAgIG1BY3Rpb25JdGVtcyA9IG5ldyBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPigpOworICAgICAgICBtTm9uQWN0aW9uSXRlbXMgPSBuZXcgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4oKTsKKyAgICAgICAgbUlzQWN0aW9uSXRlbXNTdGFsZSA9IHRydWU7CisgICAgICAgIAogICAgICAgICBtU2hvcnRjdXRzVmlzaWJsZSA9CiAgICAgICAgICAgICAgICAgKG1SZXNvdXJjZXMuZ2V0Q29uZmlndXJhdGlvbigpLmtleWJvYXJkICE9IENvbmZpZ3VyYXRpb24uS0VZQk9BUkRfTk9LRVlTKTsKICAgICB9CiAgICAgCisgICAgcHVibGljIE1lbnVCdWlsZGVyIHNldERlZmF1bHRTaG93QXNBY3Rpb24oaW50IGRlZmF1bHRTaG93QXNBY3Rpb24pIHsKKyAgICAgICAgbURlZmF1bHRTaG93QXNBY3Rpb24gPSBkZWZhdWx0U2hvd0FzQWN0aW9uOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCiAgICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgfQpAQCAtMzY4LDcgKzQyNSw4IEBACiAgICAgcHJpdmF0ZSBNZW51SXRlbSBhZGRJbnRlcm5hbChpbnQgZ3JvdXAsIGludCBpZCwgaW50IGNhdGVnb3J5T3JkZXIsIENoYXJTZXF1ZW5jZSB0aXRsZSkgewogICAgICAgICBmaW5hbCBpbnQgb3JkZXJpbmcgPSBnZXRPcmRlcmluZyhjYXRlZ29yeU9yZGVyKTsKICAgICAgICAgCi0gICAgICAgIGZpbmFsIE1lbnVJdGVtSW1wbCBpdGVtID0gbmV3IE1lbnVJdGVtSW1wbCh0aGlzLCBncm91cCwgaWQsIGNhdGVnb3J5T3JkZXIsIG9yZGVyaW5nLCB0aXRsZSk7CisgICAgICAgIGZpbmFsIE1lbnVJdGVtSW1wbCBpdGVtID0gbmV3IE1lbnVJdGVtSW1wbCh0aGlzLCBncm91cCwgaWQsIGNhdGVnb3J5T3JkZXIsCisgICAgICAgICAgICAgICAgb3JkZXJpbmcsIHRpdGxlLCBtRGVmYXVsdFNob3dBc0FjdGlvbik7CiAKICAgICAgICAgaWYgKG1DdXJyZW50TWVudUluZm8gIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gUGFzcyBhbG9uZyB0aGUgY3VycmVudCBtZW51IGluZm8KQEAgLTYzMyw2ICs2OTEsMTEgQEAKICAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQoaW5kZXgpOwogICAgIH0KIAorICAgIHB1YmxpYyBNZW51SXRlbSBnZXRPdmVyZmxvd0l0ZW0oaW50IGluZGV4KSB7CisgICAgICAgIGZsYWdBY3Rpb25JdGVtcyh0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1Ob25BY3Rpb25JdGVtcy5nZXQoaW5kZXgpOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzU2hvcnRjdXRLZXkoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIHJldHVybiBmaW5kSXRlbVdpdGhTaG9ydGN1dEZvcktleShrZXlDb2RlLCBldmVudCkgIT0gbnVsbDsKICAgICB9CkBAIC05MDAsNiArOTYzLDcgQEAKICAgICBwcml2YXRlIHZvaWQgb25JdGVtc0NoYW5nZWQoYm9vbGVhbiBjbGVhcmVkKSB7CiAgICAgICAgIGlmICghbVByZXZlbnREaXNwYXRjaGluZ0l0ZW1zQ2hhbmdlZCkgewogICAgICAgICAgICAgaWYgKG1Jc1Zpc2libGVJdGVtc1N0YWxlID09IGZhbHNlKSBtSXNWaXNpYmxlSXRlbXNTdGFsZSA9IHRydWU7CisgICAgICAgICAgICBpZiAobUlzQWN0aW9uSXRlbXNTdGFsZSA9PSBmYWxzZSkgbUlzQWN0aW9uSXRlbXNTdGFsZSA9IHRydWU7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIE1lbnVUeXBlW10gbWVudVR5cGVzID0gbU1lbnVUeXBlczsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RZUEVTOyBpKyspIHsKQEAgLTkyMCw2ICs5ODQsMTUgQEAKICAgICAgICAgb25JdGVtc0NoYW5nZWQoZmFsc2UpOwogICAgIH0KICAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkge0BsaW5rIE1lbnVJdGVtSW1wbH0gd2hlbiBpdHMgYWN0aW9uIHJlcXVlc3Qgc3RhdHVzIGlzIGNoYW5nZWQuCisgICAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdGhhdCBoYXMgZ29uZSB0aHJvdWdoIGEgY2hhbmdlIGluIGFjdGlvbiByZXF1ZXN0IHN0YXR1cy4KKyAgICAgKi8KKyAgICB2b2lkIG9uSXRlbUFjdGlvblJlcXVlc3RDaGFuZ2VkKE1lbnVJdGVtSW1wbCBpdGVtKSB7CisgICAgICAgIC8vIE5vdGlmeSBvZiBpdGVtcyBiZWluZyBjaGFuZ2VkCisgICAgICAgIG9uSXRlbXNDaGFuZ2VkKGZhbHNlKTsKKyAgICB9CisgICAgCiAgICAgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gZ2V0VmlzaWJsZUl0ZW1zKCkgewogICAgICAgICBpZiAoIW1Jc1Zpc2libGVJdGVtc1N0YWxlKSByZXR1cm4gbVZpc2libGVJdGVtczsKICAgICAgICAgCkBAIC05MzQsOSArMTAwNyw4MyBAQAogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBtSXNWaXNpYmxlSXRlbXNTdGFsZSA9IGZhbHNlOworICAgICAgICBtSXNBY3Rpb25JdGVtc1N0YWxlID0gdHJ1ZTsKICAgICAgICAgCiAgICAgICAgIHJldHVybiBtVmlzaWJsZUl0ZW1zOwogICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgZmxhZ0FjdGlvbkl0ZW1zKGJvb2xlYW4gcmVzZXJ2ZUFjdGlvbk92ZXJmbG93KSB7CisgICAgICAgIGlmIChyZXNlcnZlQWN0aW9uT3ZlcmZsb3cgIT0gbVJlc2VydmVBY3Rpb25PdmVyZmxvdykgeworICAgICAgICAgICAgbVJlc2VydmVBY3Rpb25PdmVyZmxvdyA9IHJlc2VydmVBY3Rpb25PdmVyZmxvdzsKKyAgICAgICAgICAgIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtSXNBY3Rpb25JdGVtc1N0YWxlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiB2aXNpYmxlSXRlbXMgPSBnZXRWaXNpYmxlSXRlbXMoKTsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1zU2l6ZSA9IHZpc2libGVJdGVtcy5zaXplKCk7CisgICAgICAgIGludCBtYXhBY3Rpb25zID0gbU1heEFjdGlvbkl0ZW1zOworCisgICAgICAgIGludCByZXF1aXJlZEl0ZW1zID0gMDsKKyAgICAgICAgaW50IHJlcXVlc3RlZEl0ZW1zID0gMDsKKyAgICAgICAgYm9vbGVhbiBoYXNPdmVyZmxvdyA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBNZW51SXRlbUltcGwgaXRlbSA9IHZpc2libGVJdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbS5yZXF1aXJlc0FjdGlvbkJ1dHRvbigpKSB7CisgICAgICAgICAgICAgICAgcmVxdWlyZWRJdGVtcysrOworICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnJlcXVlc3RzQWN0aW9uQnV0dG9uKCkpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRJdGVtcysrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoYXNPdmVyZmxvdyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNlcnZlIGEgc3BvdCBmb3IgdGhlIG92ZXJmbG93IGl0ZW0gaWYgbmVlZGVkLgorICAgICAgICBpZiAocmVzZXJ2ZUFjdGlvbk92ZXJmbG93ICYmCisgICAgICAgICAgICAgICAgKGhhc092ZXJmbG93IHx8IHJlcXVpcmVkSXRlbXMgKyByZXF1ZXN0ZWRJdGVtcyA+IG1heEFjdGlvbnMpKSB7CisgICAgICAgICAgICBtYXhBY3Rpb25zLS07CisgICAgICAgIH0KKyAgICAgICAgbWF4QWN0aW9ucyAtPSByZXF1aXJlZEl0ZW1zOworCisgICAgICAgIC8vIEZsYWcgYXMgbWFueSBtb3JlIHJlcXVlc3RlZCBpdGVtcyBhcyB3aWxsIGZpdC4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtc1NpemU7IGkrKykgeworICAgICAgICAgICAgTWVudUl0ZW1JbXBsIGl0ZW0gPSB2aXNpYmxlSXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW0ucmVxdWVzdHNBY3Rpb25CdXR0b24oKSkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0SXNBY3Rpb25CdXR0b24obWF4QWN0aW9ucyA+IDApOworICAgICAgICAgICAgICAgIG1heEFjdGlvbnMtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1BY3Rpb25JdGVtcy5jbGVhcigpOworICAgICAgICBtTm9uQWN0aW9uSXRlbXMuY2xlYXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtc1NpemU7IGkrKykgeworICAgICAgICAgICAgTWVudUl0ZW1JbXBsIGl0ZW0gPSB2aXNpYmxlSXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW0uaXNBY3Rpb25CdXR0b24oKSkgeworICAgICAgICAgICAgICAgIG1BY3Rpb25JdGVtcy5hZGQoaXRlbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Ob25BY3Rpb25JdGVtcy5hZGQoaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtSXNBY3Rpb25JdGVtc1N0YWxlID0gZmFsc2U7CisgICAgfQorICAgIAorICAgIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IGdldEFjdGlvbkl0ZW1zKGJvb2xlYW4gcmVzZXJ2ZUFjdGlvbk92ZXJmbG93KSB7CisgICAgICAgIGZsYWdBY3Rpb25JdGVtcyhyZXNlcnZlQWN0aW9uT3ZlcmZsb3cpOworICAgICAgICByZXR1cm4gbUFjdGlvbkl0ZW1zOworICAgIH0KKyAgICAKKyAgICBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBnZXROb25BY3Rpb25JdGVtcyhib29sZWFuIHJlc2VydmVBY3Rpb25PdmVyZmxvdykgeworICAgICAgICBmbGFnQWN0aW9uSXRlbXMocmVzZXJ2ZUFjdGlvbk92ZXJmbG93KTsKKyAgICAgICAgcmV0dXJuIG1Ob25BY3Rpb25JdGVtczsKKyAgICB9CisgICAgCisgICAgdm9pZCBzZXRNYXhBY3Rpb25JdGVtcyhpbnQgbWF4QWN0aW9uSXRlbXMpIHsKKyAgICAgICAgbU1heEFjdGlvbkl0ZW1zID0gbWF4QWN0aW9uSXRlbXM7CisgICAgICAgIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSB0cnVlOworICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNsZWFySGVhZGVyKCkgewogICAgICAgICBtSGVhZGVySWNvbiA9IG51bGw7CkBAIC0xMDc4LDYgKzEyMjUsMTYgQEAKICAgICAgICAgcmV0dXJuIG5ldyBNZW51QWRhcHRlcihtZW51VHlwZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyBhbiBhZGFwdGVyIGZvciBwcm92aWRpbmcgb3ZlcmZsb3cgKG5vbi1hY3Rpb24pIGl0ZW1zIGFuZCB0aGVpciB2aWV3cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZW51VHlwZSBUaGUgdHlwZSBvZiBtZW51IHRvIGdldCBhbiBhZGFwdGVyIGZvci4KKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rIE1lbnVBZGFwdGVyfSBmb3IgdGhpcyBtZW51IHdpdGggdGhlIGdpdmVuIG1lbnUgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVudUFkYXB0ZXIgZ2V0T3ZlcmZsb3dNZW51QWRhcHRlcihpbnQgbWVudVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPdmVyZmxvd01lbnVBZGFwdGVyKG1lbnVUeXBlKTsKKyAgICB9CisKICAgICB2b2lkIHNldE9wdGlvbmFsSWNvbnNWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewogICAgICAgICBtT3B0aW9uYWxJY29uc1Zpc2libGUgPSB2aXNpYmxlOwogICAgIH0KQEAgLTExNTUsOCArMTMxMiw0MiBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHJldHVybiAoKE1lbnVJdGVtSW1wbCkgZ2V0SXRlbShwb3NpdGlvbikpLmdldEl0ZW1WaWV3KG1NZW51VHlwZSwgcGFyZW50KTsKKyAgICAgICAgICAgIGlmIChjb252ZXJ0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTWVudVZpZXcuSXRlbVZpZXcgaXRlbVZpZXcgPSAoTWVudVZpZXcuSXRlbVZpZXcpIGNvbnZlcnRWaWV3OworICAgICAgICAgICAgICAgIGl0ZW1WaWV3LmdldEl0ZW1EYXRhKCkuc2V0SXRlbVZpZXcobU1lbnVUeXBlLCBudWxsKTsKKworICAgICAgICAgICAgICAgIE1lbnVJdGVtSW1wbCBpdGVtID0gKE1lbnVJdGVtSW1wbCkgZ2V0SXRlbShwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgaXRlbVZpZXcuaW5pdGlhbGl6ZShpdGVtLCBtTWVudVR5cGUpOworICAgICAgICAgICAgICAgIGl0ZW0uc2V0SXRlbVZpZXcobU1lbnVUeXBlLCBpdGVtVmlldyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRWaWV3OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBNZW51SXRlbUltcGwgaXRlbSA9IChNZW51SXRlbUltcGwpIGdldEl0ZW0ocG9zaXRpb24pOworICAgICAgICAgICAgICAgIGl0ZW0uc2V0SXRlbVZpZXcobU1lbnVUeXBlLCBudWxsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5nZXRJdGVtVmlldyhtTWVudVR5cGUsIHBhcmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIGFuIHtAbGluayBBZGFwdGVyVmlld30gdG8gdXNlIHRoaXMge0BsaW5rIE1lbnVCdWlsZGVyfSBhcyBhIGRhdGEKKyAgICAgKiBzb3VyY2UgZm9yIG92ZXJmbG93IG1lbnUgaXRlbXMgdGhhdCBkbyBub3QgZml0IGluIHRoZSBsaXN0IG9mIGFjdGlvbiBpdGVtcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIE92ZXJmbG93TWVudUFkYXB0ZXIgZXh0ZW5kcyBNZW51QWRhcHRlciB7CisgICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gbU92ZXJmbG93SXRlbXM7CisKKyAgICAgICAgcHVibGljIE92ZXJmbG93TWVudUFkYXB0ZXIoaW50IG1lbnVUeXBlKSB7CisgICAgICAgICAgICBzdXBlcihtZW51VHlwZSk7CisgICAgICAgICAgICBtT3ZlcmZsb3dJdGVtcyA9IGdldE5vbkFjdGlvbkl0ZW1zKHRydWUpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNZW51SXRlbUltcGwgZ2V0SXRlbShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBtT3ZlcmZsb3dJdGVtcy5nZXQocG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbU92ZXJmbG93SXRlbXMuc2l6ZSgpOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGwuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUl0ZW1JbXBsLmphdmEKaW5kZXggOWI1ODIwNS4uNDJmOTc3MSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGwuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVJdGVtSW1wbC5qYXZhCkBAIC03NCw2ICs3NCwxMSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWENMVVNJVkUgICAgICA9IDB4MDAwMDAwMDQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhJRERFTiAgICAgICAgID0gMHgwMDAwMDAwODsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5BQkxFRCAgICAgICAgPSAweDAwMDAwMDEwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJU19BQ1RJT04gICAgICA9IDB4MDAwMDAwMjA7CisKKyAgICBwcml2YXRlIGludCBtU2hvd0FzQWN0aW9uID0gU0hPV19BU19BQ1RJT05fTkVWRVI7CisKKyAgICBwcml2YXRlIFZpZXcgbUFjdGlvblZpZXc7CiAKICAgICAvKiogVXNlZCBmb3IgdGhlIGljb24gcmVzb3VyY2UgSUQgaWYgdGhpcyBpdGVtIGRvZXMgbm90IGhhdmUgYW4gaWNvbiAqLwogICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fSUNPTiA9IDA7CkBAIC0xMDUsNyArMTEwLDcgQEAKICAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRleHQgdG8gZGlzcGxheSBmb3IgdGhlIGl0ZW0uCiAgICAgICovCiAgICAgTWVudUl0ZW1JbXBsKE1lbnVCdWlsZGVyIG1lbnUsIGludCBncm91cCwgaW50IGlkLCBpbnQgY2F0ZWdvcnlPcmRlciwgaW50IG9yZGVyaW5nLAotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUsIGludCBzaG93QXNBY3Rpb24pIHsKIAogICAgICAgICBpZiAoc1ByZXBlbmRTaG9ydGN1dExhYmVsID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIFRoaXMgaXMgaW5zdGFudGlhdGVkIGZyb20gdGhlIFVJIHRocmVhZCwgc28gbm8gY2hhbmNlIG9mIHN5bmMgaXNzdWVzIApAQCAtMTI2LDYgKzEzMSw3IEBACiAgICAgICAgIG1DYXRlZ29yeU9yZGVyID0gY2F0ZWdvcnlPcmRlcjsKICAgICAgICAgbU9yZGVyaW5nID0gb3JkZXJpbmc7CiAgICAgICAgIG1UaXRsZSA9IHRpdGxlOworICAgICAgICBtU2hvd0FzQWN0aW9uID0gc2hvd0FzQWN0aW9uOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTU4MCw2ICs1ODYsMTAgQEAKICAgICAgICAgcmV0dXJuIChWaWV3KSBtSXRlbVZpZXdzW21lbnVUeXBlXS5nZXQoKTsKICAgICB9CiAKKyAgICB2b2lkIHNldEl0ZW1WaWV3KGludCBtZW51VHlwZSwgSXRlbVZpZXcgdmlldykgeworICAgICAgICBtSXRlbVZpZXdzW21lbnVUeXBlXSA9IG5ldyBXZWFrUmVmZXJlbmNlPEl0ZW1WaWV3Pih2aWV3KTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDcmVhdGUgYW5kIGluaXRpYWxpemVzIGEgbWVudSBpdGVtIHZpZXcgdGhhdCBpbXBsZW1lbnRzIHtAbGluayBNZW51Vmlldy5JdGVtVmlld30uCiAgICAgICogQHBhcmFtIG1lbnVUeXBlIFRoZSB0eXBlIG9mIG1lbnUgdG8gZ2V0IGEgVmlldyBmb3IgKG11c3QgYmUgb25lIG9mCkBAIC02MjgsNiArNjM4LDQzIEBACiAgICAgICogQHJldHVybiBXaGV0aGVyIHRoZSBnaXZlbiBtZW51IHR5cGUgc2hvdWxkIHNob3cgaWNvbnMgZm9yIG1lbnUgaXRlbXMuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc2hvdWxkU2hvd0ljb24oaW50IG1lbnVUeXBlKSB7Ci0gICAgICAgIHJldHVybiBtZW51VHlwZSA9PSBNZW51QnVpbGRlci5UWVBFX0lDT04gfHwgbU1lbnUuZ2V0T3B0aW9uYWxJY29uc1Zpc2libGUoKTsKKyAgICAgICAgcmV0dXJuIG1lbnVUeXBlID09IE1lbnVCdWlsZGVyLlRZUEVfSUNPTiB8fAorICAgICAgICAgICAgICAgIG1lbnVUeXBlID09IE1lbnVCdWlsZGVyLlRZUEVfQUNUSU9OX0JVVFRPTiB8fAorICAgICAgICAgICAgICAgIG1lbnVUeXBlID09IE1lbnVCdWlsZGVyLlRZUEVfUE9QVVAgfHwKKyAgICAgICAgICAgICAgICBtTWVudS5nZXRPcHRpb25hbEljb25zVmlzaWJsZSgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGlvbkJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBJU19BQ1RJT04pID09IElTX0FDVElPTiB8fCByZXF1aXJlc0FjdGlvbkJ1dHRvbigpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0c0FjdGlvbkJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIG1TaG93QXNBY3Rpb24gPT0gU0hPV19BU19BQ1RJT05fSUZfUk9PTTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNBY3Rpb25CdXR0b24oKSB7CisgICAgICAgIHJldHVybiBtU2hvd0FzQWN0aW9uID09IFNIT1dfQVNfQUNUSU9OX0FMV0FZUzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJc0FjdGlvbkJ1dHRvbihib29sZWFuIGlzQWN0aW9uQnV0dG9uKSB7CisgICAgICAgIGlmIChpc0FjdGlvbkJ1dHRvbikgeworICAgICAgICAgICAgbUZsYWdzIHw9IElTX0FDVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1GbGFncyAmPSB+SVNfQUNUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2hvd0FzQWN0aW9uKGludCBhY3Rpb25FbnVtKSB7CisgICAgICAgIG1TaG93QXNBY3Rpb24gPSBhY3Rpb25FbnVtOworICAgICAgICBtTWVudS5vbkl0ZW1BY3Rpb25SZXF1ZXN0Q2hhbmdlZCh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0QWN0aW9uVmlldyhWaWV3IHZpZXcpIHsKKyAgICAgICAgbUFjdGlvblZpZXcgPSB2aWV3OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlldyBnZXRBY3Rpb25WaWV3KCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXc7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51UG9wdXBIZWxwZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudVBvcHVwSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0NzgyNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudVBvcHVwSGVscGVyLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlci5NZW51QWRhcHRlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk1lYXN1cmVTcGVjOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Qb3B1cFdpbmRvdzsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgTWVudVBvcHVwSGVscGVyIGltcGxlbWVudHMgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciwgVmlldy5PbktleUxpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lbnVQb3B1cEhlbHBlciI7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBMaXN0UG9wdXBXaW5kb3cgbVBvcHVwOworICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU1lbnU7CisgICAgcHJpdmF0ZSBpbnQgbVBvcHVwTWF4V2lkdGg7CisgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPFZpZXc+IG1BbmNob3JWaWV3OworICAgIHByaXZhdGUgYm9vbGVhbiBtT3ZlcmZsb3dPbmx5OworCisgICAgcHJpdmF0ZSBQb3B1cFdpbmRvdy5PbkRpc21pc3NMaXN0ZW5lciBtRGlzbWlzc0xpc3RlbmVyID0gbmV3IFBvcHVwV2luZG93Lk9uRGlzbWlzc0xpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkRpc21pc3MoKSB7CisgICAgICAgICAgICBtUG9wdXAgPSBudWxsOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBNZW51UG9wdXBIZWxwZXIoQ29udGV4dCBjb250ZXh0LCBNZW51QnVpbGRlciBtZW51KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbWVudSwgbnVsbCwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBNZW51UG9wdXBIZWxwZXIoQ29udGV4dCBjb250ZXh0LCBNZW51QnVpbGRlciBtZW51LCBWaWV3IGFuY2hvclZpZXcpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBtZW51LCBhbmNob3JWaWV3LCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIE1lbnVQb3B1cEhlbHBlcihDb250ZXh0IGNvbnRleHQsIE1lbnVCdWlsZGVyIG1lbnUsCisgICAgICAgICAgICBWaWV3IGFuY2hvclZpZXcsIGJvb2xlYW4gb3ZlcmZsb3dPbmx5KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbU1lbnUgPSBtZW51OworICAgICAgICBtT3ZlcmZsb3dPbmx5ID0gb3ZlcmZsb3dPbmx5OworCisgICAgICAgIGZpbmFsIERpc3BsYXlNZXRyaWNzIG1ldHJpY3MgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCk7CisgICAgICAgIG1Qb3B1cE1heFdpZHRoID0gbWV0cmljcy53aWR0aFBpeGVscyAvIDI7CisKKyAgICAgICAgaWYgKGFuY2hvclZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFuY2hvclZpZXcgPSBuZXcgV2Vha1JlZmVyZW5jZTxWaWV3PihhbmNob3JWaWV3KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIG1Qb3B1cCA9IG5ldyBMaXN0UG9wdXBXaW5kb3cobUNvbnRleHQsIG51bGwsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5wb3B1cE1lbnVTdHlsZSk7CisgICAgICAgIG1Qb3B1cC5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICBtUG9wdXAuc2V0T25EaXNtaXNzTGlzdGVuZXIobURpc21pc3NMaXN0ZW5lcik7CisKKyAgICAgICAgZmluYWwgTWVudUFkYXB0ZXIgYWRhcHRlciA9IG1PdmVyZmxvd09ubHkgPworICAgICAgICAgICAgICAgIG1NZW51LmdldE92ZXJmbG93TWVudUFkYXB0ZXIoTWVudUJ1aWxkZXIuVFlQRV9QT1BVUCkgOgorICAgICAgICAgICAgICAgIG1NZW51LmdldE1lbnVBZGFwdGVyKE1lbnVCdWlsZGVyLlRZUEVfUE9QVVApOworICAgICAgICBtUG9wdXAuc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICAgICAgbVBvcHVwLnNldE1vZGFsKHRydWUpOworCisgICAgICAgIGlmIChtQW5jaG9yVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUG9wdXAuc2V0QW5jaG9yVmlldyhtQW5jaG9yVmlldy5nZXQoKSk7CisgICAgICAgIH0gZWxzZSBpZiAobU1lbnUgaW5zdGFuY2VvZiBTdWJNZW51QnVpbGRlcikgeworICAgICAgICAgICAgU3ViTWVudUJ1aWxkZXIgc3ViTWVudSA9IChTdWJNZW51QnVpbGRlcikgbU1lbnU7CisgICAgICAgICAgICBmaW5hbCBNZW51SXRlbUltcGwgaXRlbUltcGwgPSAoTWVudUl0ZW1JbXBsKSBzdWJNZW51LmdldEl0ZW0oKTsKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRBbmNob3JWaWV3KGl0ZW1JbXBsLmdldEl0ZW1WaWV3KE1lbnVCdWlsZGVyLlRZUEVfQUNUSU9OX0JVVFRPTiwgbnVsbCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWVudVBvcHVwSGVscGVyIGNhbm5vdCBiZSB1c2VkIHdpdGhvdXQgYW4gYW5jaG9yIik7CisgICAgICAgIH0KKworICAgICAgICBtUG9wdXAuc2V0Q29udGVudFdpZHRoKE1hdGgubWluKG1lYXN1cmVDb250ZW50V2lkdGgoYWRhcHRlciksIG1Qb3B1cE1heFdpZHRoKSk7CisgICAgICAgIG1Qb3B1cC5zaG93KCk7CisgICAgICAgIG1Qb3B1cC5nZXRMaXN0VmlldygpLnNldE9uS2V5TGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGlzbWlzcygpIHsKKyAgICAgICAgaWYgKGlzU2hvd2luZygpKSB7CisgICAgICAgICAgICBtUG9wdXAuZGlzbWlzcygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwICE9IG51bGwgJiYgbVBvcHVwLmlzU2hvd2luZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgTWVudUl0ZW0gaXRlbSA9IG51bGw7CisgICAgICAgIGlmIChtT3ZlcmZsb3dPbmx5KSB7CisgICAgICAgICAgICBpdGVtID0gbU1lbnUuZ2V0T3ZlcmZsb3dJdGVtKHBvc2l0aW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0ZW0gPSBtTWVudS5nZXRJdGVtKHBvc2l0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBtTWVudS5wZXJmb3JtSXRlbUFjdGlvbihpdGVtLCAwKTsKKyAgICAgICAgbVBvcHVwLmRpc21pc3MoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleShWaWV3IHYsIGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX1VQICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9NRU5VKSB7CisgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgbWVhc3VyZUNvbnRlbnRXaWR0aChNZW51QWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIC8vIE1lbnVzIGRvbid0IHRlbmQgdG8gYmUgbG9uZywgc28gdGhpcyBpcyBtb3JlIHNhbmUgdGhhbiBpdCBsb29rcy4KKyAgICAgICAgaW50IHdpZHRoID0gMDsKKyAgICAgICAgVmlldyBpdGVtVmlldyA9IG51bGw7CisgICAgICAgIGZpbmFsIGludCB3aWR0aE1lYXN1cmVTcGVjID0KKyAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygwLCBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCk7CisgICAgICAgIGZpbmFsIGludCBoZWlnaHRNZWFzdXJlU3BlYyA9CisgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoMCwgTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQpOworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBhZGFwdGVyLmdldENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgaXRlbVZpZXcgPSBhZGFwdGVyLmdldFZpZXcoaSwgaXRlbVZpZXcsIG51bGwpOworICAgICAgICAgICAgaXRlbVZpZXcubWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBpdGVtVmlldy5nZXRNZWFzdXJlZFdpZHRoKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB3aWR0aDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhckNvbnRleHRWaWV3LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhckNvbnRleHRWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVlNTdjMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyQ29udGV4dFZpZXcuamF2YQpAQCAtMCwwICsxLDMzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVWaWV3OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuTWVhc3VyZVNwZWM7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25CYXJDb250ZXh0VmlldyBleHRlbmRzIFZpZXdHcm91cCB7CisgICAgcHJpdmF0ZSBpbnQgbUl0ZW1QYWRkaW5nOworICAgIHByaXZhdGUgaW50IG1BY3Rpb25TcGFjaW5nOworICAgIHByaXZhdGUgaW50IG1Db250ZW50SGVpZ2h0OworICAgIAorICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1UaXRsZTsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtU3VidGl0bGU7CisgICAgCisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtQ2xvc2VCdXR0b247CisgICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21WaWV3OworICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1UaXRsZUxheW91dDsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtU3VidGl0bGVWaWV3OworICAgIHByaXZhdGUgaW50IG1UaXRsZVN0eWxlUmVzOworICAgIHByaXZhdGUgaW50IG1TdWJ0aXRsZVN0eWxlUmVzOworICAgIHByaXZhdGUgQWN0aW9uTWVudVZpZXcgbU1lbnVWaWV3OworICAgIAorICAgIHB1YmxpYyBBY3Rpb25CYXJDb250ZXh0VmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFjdGlvbkJhckNvbnRleHRWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5hY3Rpb25Nb2RlU3R5bGUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uQmFyQ29udGV4dFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOworICAgICAgICAKKyAgICAgICAgVHlwZWRBcnJheSBhID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLCBSLnN0eWxlYWJsZS5BY3Rpb25Nb2RlLCBkZWZTdHlsZSwgMCk7CisgICAgICAgIG1JdGVtUGFkZGluZyA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxPZmZzZXQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQWN0aW9uTW9kZV9pdGVtUGFkZGluZywgMCk7CisgICAgICAgIHNldEJhY2tncm91bmREcmF3YWJsZShhLmdldERyYXdhYmxlKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFjdGlvbk1vZGVfYmFja2dyb3VuZCkpOworICAgICAgICBtVGl0bGVTdHlsZVJlcyA9IGEuZ2V0UmVzb3VyY2VJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BY3Rpb25Nb2RlX3RpdGxlVGV4dFN0eWxlLCAwKTsKKyAgICAgICAgbVN1YnRpdGxlU3R5bGVSZXMgPSBhLmdldFJlc291cmNlSWQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQWN0aW9uTW9kZV9zdWJ0aXRsZVRleHRTdHlsZSwgMCk7CisKKyAgICAgICAgbUNvbnRlbnRIZWlnaHQgPSBhLmdldExheW91dERpbWVuc2lvbigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BY3Rpb25Nb2RlX2hlaWdodCwgMCk7CisgICAgICAgIGEucmVjeWNsZSgpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGVGb3JDaGlsZChWaWV3IGNoaWxkLCBBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIC8vIE5vIHN0YXJ0aW5nIGFuIGFjdGlvbiBtb2RlIGZvciBhbiBleGlzdGluZyBhY3Rpb24gbW9kZSBVSSBjaGlsZCEgKFdoZXJlIHdvdWxkIGl0IGdvPykKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCBoZWlnaHQpIHsKKyAgICAgICAgbUNvbnRlbnRIZWlnaHQgPSBoZWlnaHQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tVmlldyhWaWV3IHZpZXcpIHsKKyAgICAgICAgaWYgKG1DdXN0b21WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlbW92ZVZpZXcobUN1c3RvbVZpZXcpOworICAgICAgICB9CisgICAgICAgIG1DdXN0b21WaWV3ID0gdmlldzsKKyAgICAgICAgaWYgKG1UaXRsZUxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICByZW1vdmVWaWV3KG1UaXRsZUxheW91dCk7CisgICAgICAgICAgICBtVGl0bGVMYXlvdXQgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICh2aWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZFZpZXcodmlldyk7CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtVGl0bGUgPSB0aXRsZTsKKyAgICAgICAgaW5pdFRpdGxlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlIHN1YnRpdGxlKSB7CisgICAgICAgIG1TdWJ0aXRsZSA9IHN1YnRpdGxlOworICAgICAgICBpbml0VGl0bGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gbVRpdGxlOworICAgIH0KKworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0U3VidGl0bGUoKSB7CisgICAgICAgIHJldHVybiBtU3VidGl0bGU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRUaXRsZSgpIHsKKyAgICAgICAgaWYgKG1UaXRsZUxheW91dCA9PSBudWxsKSB7CisgICAgICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IExheW91dEluZmxhdGVyLmZyb20oZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgIG1UaXRsZUxheW91dCA9IChMaW5lYXJMYXlvdXQpIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuYWN0aW9uX2Jhcl90aXRsZV9pdGVtLCBudWxsKTsKKyAgICAgICAgICAgIG1UaXRsZVZpZXcgPSAoVGV4dFZpZXcpIG1UaXRsZUxheW91dC5maW5kVmlld0J5SWQoUi5pZC5hY3Rpb25fYmFyX3RpdGxlKTsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcgPSAoVGV4dFZpZXcpIG1UaXRsZUxheW91dC5maW5kVmlld0J5SWQoUi5pZC5hY3Rpb25fYmFyX3N1YnRpdGxlKTsKKyAgICAgICAgICAgIGlmIChtVGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChtVGl0bGUpOworICAgICAgICAgICAgICAgIGlmIChtVGl0bGVTdHlsZVJlcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dEFwcGVhcmFuY2UobUNvbnRleHQsIG1UaXRsZVN0eWxlUmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVN1YnRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFRleHQobVN1YnRpdGxlKTsKKyAgICAgICAgICAgICAgICBpZiAobVN1YnRpdGxlU3R5bGVSZXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFRleHRBcHBlYXJhbmNlKG1Db250ZXh0LCBtU3VidGl0bGVTdHlsZVJlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZFZpZXcobVRpdGxlTGF5b3V0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChtVGl0bGUpOworICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0KG1TdWJ0aXRsZSk7CisgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFZpc2liaWxpdHkobVN1YnRpdGxlICE9IG51bGwgPyBWSVNJQkxFIDogR09ORSk7CisgICAgICAgICAgICBpZiAobVRpdGxlTGF5b3V0LmdldFBhcmVudCgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1UaXRsZUxheW91dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0Rm9yTW9kZShmaW5hbCBBY3Rpb25Nb2RlIG1vZGUpIHsKKyAgICAgICAgaWYgKG1DbG9zZUJ1dHRvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ2xvc2VCdXR0b24gPSBuZXcgSW1hZ2VCdXR0b24oZ2V0Q29udGV4dCgpLCBudWxsLAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuYWN0aW9uTW9kZUNsb3NlQnV0dG9uU3R5bGUpOworICAgICAgICB9CisgICAgICAgIG1DbG9zZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgbW9kZS5maW5pc2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIGFkZFZpZXcobUNsb3NlQnV0dG9uKTsKKworICAgICAgICBmaW5hbCBNZW51QnVpbGRlciBtZW51ID0gKE1lbnVCdWlsZGVyKSBtb2RlLmdldE1lbnUoKTsKKyAgICAgICAgbU1lbnVWaWV3ID0gKEFjdGlvbk1lbnVWaWV3KSBtZW51LmdldE1lbnVWaWV3KE1lbnVCdWlsZGVyLlRZUEVfQUNUSU9OX0JVVFRPTiwgdGhpcyk7CisgICAgICAgIG1NZW51Vmlldy5zZXRPdmVyZmxvd1Jlc2VydmVkKHRydWUpOworICAgICAgICBtTWVudVZpZXcudXBkYXRlQ2hpbGRyZW4oZmFsc2UpOworICAgICAgICBhZGRWaWV3KG1NZW51Vmlldyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2VNb2RlKCkgeworICAgICAgICByZW1vdmVBbGxWaWV3cygpOworICAgICAgICBtQ3VzdG9tVmlldyA9IG51bGw7CisgICAgICAgIG1NZW51VmlldyA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2hvd092ZXJmbG93TWVudSgpIHsKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbU1lbnVWaWV3LnNob3dPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGlkZU92ZXJmbG93TWVudSgpIHsKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbU1lbnVWaWV3LmhpZGVPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNPdmVyZmxvd01lbnVTaG93aW5nKCkgeworICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudVZpZXcuaXNPdmVyZmxvd01lbnVTaG93aW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBMYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zKCkgeworICAgICAgICAvLyBVc2VkIGJ5IGN1c3RvbSB2aWV3cyBpZiB0aGV5IGRvbid0IHN1cHBseSBsYXlvdXQgcGFyYW1zLiBFdmVyeXRoaW5nIGVsc2UKKyAgICAgICAgLy8gYWRkZWQgdG8gYW4gQWN0aW9uQmFyQ29udGV4dFZpZXcgc2hvdWxkIGhhdmUgdGhlbSBhbHJlYWR5LgorICAgICAgICByZXR1cm4gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICBmaW5hbCBpbnQgd2lkdGhNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaWYgKHdpZHRoTW9kZSAhPSBNZWFzdXJlU3BlYy5FWEFDVExZKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiBjYW4gb25seSBiZSB1c2VkICIgKworICAgICAgICAgICAgICAgICAgICAid2l0aCBhbmRyb2lkOmxheW91dF93aWR0aD1cIm1hdGNoX3BhcmVudFwiIChvciBmaWxsX3BhcmVudCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBoZWlnaHRNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgIGlmIChoZWlnaHRNb2RlICE9IE1lYXN1cmVTcGVjLkFUX01PU1QpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiIGNhbiBvbmx5IGJlIHVzZWQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aXRoIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD1cIndyYXBfY29udGVudFwiIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZpbmFsIGludCBjb250ZW50V2lkdGggPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOworICAgICAgICBmaW5hbCBpbnQgaXRlbU1hcmdpbiA9IG1JdGVtUGFkZGluZzsKKworICAgICAgICBpbnQgbWF4SGVpZ2h0ID0gbUNvbnRlbnRIZWlnaHQgPiAwID8KKyAgICAgICAgICAgICAgICBtQ29udGVudEhlaWdodCA6IE1lYXN1cmVTcGVjLmdldFNpemUoaGVpZ2h0TWVhc3VyZVNwZWMpOworCisgICAgICAgIGZpbmFsIGludCB2ZXJ0aWNhbFBhZGRpbmcgPSBnZXRQYWRkaW5nVG9wKCkgKyBnZXRQYWRkaW5nQm90dG9tKCk7CisgICAgICAgIGludCBhdmFpbGFibGVXaWR0aCA9IGNvbnRlbnRXaWR0aCAtIGdldFBhZGRpbmdMZWZ0KCkgLSBnZXRQYWRkaW5nUmlnaHQoKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IG1heEhlaWdodCAtIHZlcnRpY2FsUGFkZGluZzsKKyAgICAgICAgZmluYWwgaW50IGNoaWxkU3BlY0hlaWdodCA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhoZWlnaHQsIE1lYXN1cmVTcGVjLkFUX01PU1QpOworICAgICAgICAKKyAgICAgICAgaWYgKG1DbG9zZUJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IG1lYXN1cmVDaGlsZFZpZXcobUNsb3NlQnV0dG9uLCBhdmFpbGFibGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRTcGVjSGVpZ2h0LCBpdGVtTWFyZ2luKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtVGl0bGVMYXlvdXQgIT0gbnVsbCAmJiBtQ3VzdG9tVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IG1lYXN1cmVDaGlsZFZpZXcobVRpdGxlTGF5b3V0LCBhdmFpbGFibGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRTcGVjSGVpZ2h0LCBpdGVtTWFyZ2luKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBjaGlsZENvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaSk7CisgICAgICAgICAgICBpZiAoY2hpbGQgPT0gbUNsb3NlQnV0dG9uIHx8IGNoaWxkID09IG1UaXRsZUxheW91dCB8fCBjaGlsZCA9PSBtQ3VzdG9tVmlldykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IG1lYXN1cmVDaGlsZFZpZXcoY2hpbGQsIGF2YWlsYWJsZVdpZHRoLCBjaGlsZFNwZWNIZWlnaHQsIGl0ZW1NYXJnaW4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1DdXN0b21WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IG1DdXN0b21WaWV3LmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgZmluYWwgaW50IGN1c3RvbVdpZHRoTW9kZSA9IGxwLndpZHRoICE9IExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQgPworICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5FWEFDVExZIDogTWVhc3VyZVNwZWMuQVRfTU9TVDsKKyAgICAgICAgICAgIGZpbmFsIGludCBjdXN0b21XaWR0aCA9IGxwLndpZHRoID49IDAgPworICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihscC53aWR0aCwgYXZhaWxhYmxlV2lkdGgpIDogYXZhaWxhYmxlV2lkdGg7CisgICAgICAgICAgICBmaW5hbCBpbnQgY3VzdG9tSGVpZ2h0TW9kZSA9IGxwLmhlaWdodCAhPSBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UID8KKyAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMuRVhBQ1RMWSA6IE1lYXN1cmVTcGVjLkFUX01PU1Q7CisgICAgICAgICAgICBmaW5hbCBpbnQgY3VzdG9tSGVpZ2h0ID0gbHAuaGVpZ2h0ID49IDAgPworICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihscC5oZWlnaHQsIGhlaWdodCkgOiBoZWlnaHQ7CisgICAgICAgICAgICBtQ3VzdG9tVmlldy5tZWFzdXJlKE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhjdXN0b21XaWR0aCwgY3VzdG9tV2lkdGhNb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGN1c3RvbUhlaWdodCwgY3VzdG9tSGVpZ2h0TW9kZSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Db250ZW50SGVpZ2h0IDw9IDApIHsKKyAgICAgICAgICAgIGludCBtZWFzdXJlZEhlaWdodCA9IDA7CisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBWaWV3IHYgPSBnZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgICAgIGludCBwYWRkZWRWaWV3SGVpZ2h0ID0gdi5nZXRNZWFzdXJlZEhlaWdodCgpICsgdmVydGljYWxQYWRkaW5nOworICAgICAgICAgICAgICAgIGlmIChwYWRkZWRWaWV3SGVpZ2h0ID4gbWVhc3VyZWRIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRIZWlnaHQgPSBwYWRkZWRWaWV3SGVpZ2h0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKGNvbnRlbnRXaWR0aCwgbWVhc3VyZWRIZWlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24oY29udGVudFdpZHRoLCBtYXhIZWlnaHQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgeworICAgICAgICBpbnQgeCA9IGdldFBhZGRpbmdMZWZ0KCk7CisgICAgICAgIGZpbmFsIGludCB5ID0gZ2V0UGFkZGluZ1RvcCgpOworICAgICAgICBmaW5hbCBpbnQgY29udGVudEhlaWdodCA9IGIgLSB0IC0gZ2V0UGFkZGluZ1RvcCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOworICAgICAgICBmaW5hbCBpbnQgaXRlbU1hcmdpbiA9IG1JdGVtUGFkZGluZzsKKyAgICAgICAgCisgICAgICAgIGlmIChtQ2xvc2VCdXR0b24gIT0gbnVsbCAmJiBtQ2xvc2VCdXR0b24uZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUpIHsKKyAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtQ2xvc2VCdXR0b24sIHgsIHksIGNvbnRlbnRIZWlnaHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobVRpdGxlTGF5b3V0ICE9IG51bGwgJiYgbUN1c3RvbVZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1UaXRsZUxheW91dCwgeCwgeSwgY29udGVudEhlaWdodCkgKyBpdGVtTWFyZ2luOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobUN1c3RvbVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1DdXN0b21WaWV3LCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIGl0ZW1NYXJnaW47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHggPSByIC0gbCAtIGdldFBhZGRpbmdSaWdodCgpOworCisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgeCAtPSBwb3NpdGlvbkNoaWxkSW52ZXJzZShtTWVudVZpZXcsIHggKyBtQWN0aW9uU3BhY2luZywgeSwgY29udGVudEhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgLSBtQWN0aW9uU3BhY2luZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IG1lYXN1cmVDaGlsZFZpZXcoVmlldyBjaGlsZCwgaW50IGF2YWlsYWJsZVdpZHRoLCBpbnQgY2hpbGRTcGVjSGVpZ2h0LCBpbnQgc3BhY2luZykgeworICAgICAgICBjaGlsZC5tZWFzdXJlKE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhhdmFpbGFibGVXaWR0aCwgTWVhc3VyZVNwZWMuQVRfTU9TVCksCisgICAgICAgICAgICAgICAgY2hpbGRTcGVjSGVpZ2h0KTsKKworICAgICAgICBhdmFpbGFibGVXaWR0aCAtPSBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgIGF2YWlsYWJsZVdpZHRoIC09IHNwYWNpbmc7CisKKyAgICAgICAgcmV0dXJuIGF2YWlsYWJsZVdpZHRoOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGludCBwb3NpdGlvbkNoaWxkKFZpZXcgY2hpbGQsIGludCB4LCBpbnQgeSwgaW50IGNvbnRlbnRIZWlnaHQpIHsKKyAgICAgICAgaW50IGNoaWxkV2lkdGggPSBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgIGludCBjaGlsZEhlaWdodCA9IGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCk7CisgICAgICAgIGludCBjaGlsZFRvcCA9IHkgKyAoY29udGVudEhlaWdodCAtIGNoaWxkSGVpZ2h0KSAvIDI7CisKKyAgICAgICAgY2hpbGQubGF5b3V0KHgsIGNoaWxkVG9wLCB4ICsgY2hpbGRXaWR0aCwgY2hpbGRUb3AgKyBjaGlsZEhlaWdodCk7CisKKyAgICAgICAgcmV0dXJuIGNoaWxkV2lkdGg7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgaW50IHBvc2l0aW9uQ2hpbGRJbnZlcnNlKFZpZXcgY2hpbGQsIGludCB4LCBpbnQgeSwgaW50IGNvbnRlbnRIZWlnaHQpIHsKKyAgICAgICAgaW50IGNoaWxkV2lkdGggPSBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgIGludCBjaGlsZEhlaWdodCA9IGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCk7CisgICAgICAgIGludCBjaGlsZFRvcCA9IHkgKyAoY29udGVudEhlaWdodCAtIGNoaWxkSGVpZ2h0KSAvIDI7CisKKyAgICAgICAgY2hpbGQubGF5b3V0KHggLSBjaGlsZFdpZHRoLCBjaGlsZFRvcCwgeCwgY2hpbGRUb3AgKyBjaGlsZEhlaWdodCk7CisKKyAgICAgICAgcmV0dXJuIGNoaWxkV2lkdGg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJWaWV3LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhclZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDhhNzA5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJWaWV3LmphdmEKQEAgLTAsMCArMSw3NzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVJdGVtOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51VmlldzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpb25CYXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aW9uQmFyLk5hdmlnYXRpb25DYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlscy5UcnVuY2F0ZUF0OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkhvcml6b250YWxTY3JvbGxWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TcGlubmVyQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uQmFyVmlldyBleHRlbmRzIFZpZXdHcm91cCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBY3Rpb25CYXJWaWV3IjsKKyAgICAKKyAgICAvLyBUT0RPOiBUaGlzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgZGVmYXVsdCB0aGVtZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05URU5UX1BBRERJTkdfRElQID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9TUEFDSU5HX0RJUCA9IDY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfQUNUSU9OX1NQQUNJTkdfRElQID0gMTI7CisgICAgCisgICAgLyoqCisgICAgICogRGlzcGxheSBvcHRpb25zIGFwcGxpZWQgYnkgZGVmYXVsdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1BMQVlfREVGQVVMVCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IG9wdGlvbnMgdGhhdCByZXF1aXJlIHJlLWxheW91dCBhcyBvcHBvc2VkIHRvIGEgc2ltcGxlIGludmFsaWRhdGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9SRUxBWU9VVF9NQVNLID0KKyAgICAgICAgICAgIEFjdGlvbkJhci5ESVNQTEFZX0hJREVfSE9NRSB8CisgICAgICAgICAgICBBY3Rpb25CYXIuRElTUExBWV9VU0VfTE9HTzsKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIGludCBtQ29udGVudEhlaWdodDsKKworICAgIHByaXZhdGUgaW50IG1OYXZpZ2F0aW9uTW9kZTsKKyAgICBwcml2YXRlIGludCBtRGlzcGxheU9wdGlvbnM7CisgICAgcHJpdmF0ZSBpbnQgbVNwYWNpbmc7CisgICAgcHJpdmF0ZSBpbnQgbUFjdGlvblNwYWNpbmc7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRpdGxlOworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1TdWJ0aXRsZTsKKyAgICBwcml2YXRlIERyYXdhYmxlIG1JY29uOworICAgIHByaXZhdGUgRHJhd2FibGUgbUxvZ287CisKKyAgICBwcml2YXRlIEltYWdlVmlldyBtSWNvblZpZXc7CisgICAgcHJpdmF0ZSBJbWFnZVZpZXcgbUxvZ29WaWV3OworICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1UaXRsZUxheW91dDsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtU3VidGl0bGVWaWV3OworICAgIHByaXZhdGUgU3Bpbm5lciBtU3Bpbm5lcjsKKyAgICBwcml2YXRlIEhvcml6b250YWxTY3JvbGxWaWV3IG1UYWJTY3JvbGxWaWV3OworICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1UYWJMYXlvdXQ7CisgICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21OYXZWaWV3OworICAgIAorICAgIHByaXZhdGUgaW50IG1UaXRsZVN0eWxlUmVzOworICAgIHByaXZhdGUgaW50IG1TdWJ0aXRsZVN0eWxlUmVzOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1TaG93TWVudTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVVzZXJUaXRsZTsKKworICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU9wdGlvbnNNZW51OworICAgIHByaXZhdGUgQWN0aW9uTWVudVZpZXcgbU1lbnVWaWV3OworICAgIAorICAgIHByaXZhdGUgQWN0aW9uQmFyQ29udGV4dFZpZXcgbUNvbnRleHRWaWV3OworCisgICAgcHJpdmF0ZSBBY3Rpb25NZW51SXRlbSBtTG9nb05hdkl0ZW07CisgICAgCisgICAgcHJpdmF0ZSBOYXZpZ2F0aW9uQ2FsbGJhY2sgbUNhbGxiYWNrOworCisgICAgcHJpdmF0ZSBmaW5hbCBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyIG1OYXZJdGVtU2VsZWN0ZWRMaXN0ZW5lciA9CisgICAgICAgICAgICBuZXcgQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU2VsZWN0ZWQoQWRhcHRlclZpZXcgcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uTmF2aWdhdGlvbkl0ZW1TZWxlY3RlZChwb3NpdGlvbiwgaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIG9uTm90aGluZ1NlbGVjdGVkKEFkYXB0ZXJWaWV3IHBhcmVudCkgeworICAgICAgICAgICAgLy8gRG8gbm90aGluZworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgT25DbGlja0xpc3RlbmVyIG1Ib21lQ2xpY2tMaXN0ZW5lciA9IG51bGw7CisKKyAgICBwcml2YXRlIE9uQ2xpY2tMaXN0ZW5lciBtVGFiQ2xpY2tMaXN0ZW5lciA9IG51bGw7CisKKyAgICBwdWJsaWMgQWN0aW9uQmFyVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisKKyAgICAgICAgZmluYWwgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKTsKKworICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsIFIuc3R5bGVhYmxlLkFjdGlvbkJhcik7CisKKyAgICAgICAgZmluYWwgaW50IGNvbG9yRmlsdGVyID0gYS5nZXRDb2xvcihSLnN0eWxlYWJsZS5BY3Rpb25CYXJfY29sb3JGaWx0ZXIsIDApOworCisgICAgICAgIGlmIChjb2xvckZpbHRlciAhPSAwKSB7CisgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBkID0gZ2V0QmFja2dyb3VuZCgpOworICAgICAgICAgICAgZC5zZXREaXRoZXIodHJ1ZSk7CisgICAgICAgICAgICBkLnNldENvbG9yRmlsdGVyKG5ldyBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIoY29sb3JGaWx0ZXIsIFBvcnRlckR1ZmYuTW9kZS5PVkVSTEFZKSk7CisgICAgICAgIH0KKworICAgICAgICBBcHBsaWNhdGlvbkluZm8gaW5mbyA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb25JbmZvKCk7CisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBtTmF2aWdhdGlvbk1vZGUgPSBhLmdldEludChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfbmF2aWdhdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9TVEFOREFSRCk7CisgICAgICAgIG1UaXRsZSA9IGEuZ2V0VGV4dChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfdGl0bGUpOworICAgICAgICBtU3VidGl0bGUgPSBhLmdldFRleHQoUi5zdHlsZWFibGUuQWN0aW9uQmFyX3N1YnRpdGxlKTsKKyAgICAgICAgbURpc3BsYXlPcHRpb25zID0gYS5nZXRJbnQoUi5zdHlsZWFibGUuQWN0aW9uQmFyX2Rpc3BsYXlPcHRpb25zLCBESVNQTEFZX0RFRkFVTFQpOworICAgICAgICAKKyAgICAgICAgbUxvZ28gPSBhLmdldERyYXdhYmxlKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9sb2dvKTsKKyAgICAgICAgaWYgKG1Mb2dvID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2dvID0gaW5mby5sb2FkTG9nbyhwbSk7CisgICAgICAgIH0KKyAgICAgICAgbUljb24gPSBhLmdldERyYXdhYmxlKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9pY29uKTsKKyAgICAgICAgaWYgKG1JY29uID09IG51bGwpIHsKKyAgICAgICAgICAgIG1JY29uID0gaW5mby5sb2FkSWNvbihwbSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIERyYXdhYmxlIGJhY2tncm91bmQgPSBhLmdldERyYXdhYmxlKFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9iYWNrZ3JvdW5kKTsKKyAgICAgICAgaWYgKGJhY2tncm91bmQgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0QmFja2dyb3VuZERyYXdhYmxlKGJhY2tncm91bmQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtVGl0bGVTdHlsZVJlcyA9IGEuZ2V0UmVzb3VyY2VJZChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfdGl0bGVUZXh0U3R5bGUsIDApOworICAgICAgICBtU3VidGl0bGVTdHlsZVJlcyA9IGEuZ2V0UmVzb3VyY2VJZChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfc3VidGl0bGVUZXh0U3R5bGUsIDApOworCisgICAgICAgIGZpbmFsIGludCBjdXN0b21OYXZJZCA9IGEuZ2V0UmVzb3VyY2VJZChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfY3VzdG9tTmF2aWdhdGlvbkxheW91dCwgMCk7CisgICAgICAgIGlmIChjdXN0b21OYXZJZCAhPSAwKSB7CisgICAgICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IExheW91dEluZmxhdGVyLmZyb20oY29udGV4dCk7CisgICAgICAgICAgICBtQ3VzdG9tTmF2VmlldyA9IChWaWV3KSBpbmZsYXRlci5pbmZsYXRlKGN1c3RvbU5hdklkLCBudWxsKTsKKyAgICAgICAgICAgIG1OYXZpZ2F0aW9uTW9kZSA9IEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfQ1VTVE9NOworICAgICAgICB9CisKKyAgICAgICAgbUNvbnRlbnRIZWlnaHQgPSBhLmdldExheW91dERpbWVuc2lvbihSLnN0eWxlYWJsZS5BY3Rpb25CYXJfaGVpZ2h0LCAwKTsKKworICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAvLyBUT0RPOiBTZXQgdGhpcyBpbiB0aGUgdGhlbWUKKyAgICAgICAgbVNwYWNpbmcgPSAoaW50KSAoQ09OVEVOVF9TUEFDSU5HX0RJUCAqIG1ldHJpY3MuZGVuc2l0eSArIDAuNWYpOworICAgICAgICBtQWN0aW9uU3BhY2luZyA9IChpbnQpIChDT05URU5UX0FDVElPTl9TUEFDSU5HX0RJUCAqIG1ldHJpY3MuZGVuc2l0eSArIDAuNWYpOworICAgICAgICAKKyAgICAgICAgaWYgKG1Mb2dvICE9IG51bGwgfHwgbUljb24gIT0gbnVsbCB8fCBtVGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvZ29OYXZJdGVtID0gbmV3IEFjdGlvbk1lbnVJdGVtKGNvbnRleHQsIDAsIGFuZHJvaWQuUi5pZC5ob21lLCAwLCAwLCBtVGl0bGUpOworICAgICAgICAgICAgbUhvbWVDbGlja0xpc3RlbmVyID0gbmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBjb250ZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHkub25PcHRpb25zSXRlbVNlbGVjdGVkKG1Mb2dvTmF2SXRlbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQoVmlldyBjaGlsZCwgQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAvLyBObyBzdGFydGluZyBhbiBhY3Rpb24gbW9kZSBmb3IgYW4gYWN0aW9uIGJhciBjaGlsZCEgKFdoZXJlIHdvdWxkIGl0IGdvPykKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soTmF2aWdhdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1lbnUoTWVudSBtZW51KSB7CisgICAgICAgIE1lbnVCdWlsZGVyIGJ1aWxkZXIgPSAoTWVudUJ1aWxkZXIpIG1lbnU7CisgICAgICAgIG1PcHRpb25zTWVudSA9IGJ1aWxkZXI7CisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVtb3ZlVmlldyhtTWVudVZpZXcpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEFjdGlvbk1lbnVWaWV3IG1lbnVWaWV3ID0gKEFjdGlvbk1lbnVWaWV3KSBidWlsZGVyLmdldE1lbnVWaWV3KAorICAgICAgICAgICAgICAgIE1lbnVCdWlsZGVyLlRZUEVfQUNUSU9OX0JVVFRPTiwgbnVsbCk7CisgICAgICAgIG1BY3Rpb25TcGFjaW5nID0gbWVudVZpZXcuZ2V0SXRlbU1hcmdpbigpOworICAgICAgICBmaW5hbCBMYXlvdXRQYXJhbXMgbGF5b3V0UGFyYW1zID0gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOworICAgICAgICBtZW51Vmlldy5zZXRMYXlvdXRQYXJhbXMobGF5b3V0UGFyYW1zKTsKKyAgICAgICAgYWRkVmlldyhtZW51Vmlldyk7CisgICAgICAgIG1NZW51VmlldyA9IG1lbnVWaWV3OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNob3dPdmVyZmxvd01lbnUoKSB7CisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZW51Vmlldy5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvc3RTaG93T3ZlcmZsb3dNZW51KCkgeworICAgICAgICBwb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBzaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhpZGVPdmVyZmxvd01lbnUoKSB7CisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZW51Vmlldy5oaWRlT3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzT3ZlcmZsb3dNZW51U2hvd2luZygpIHsKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbU1lbnVWaWV3LmlzT3ZlcmZsb3dNZW51U2hvd2luZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJmbG93UmVzZXJ2ZWQoKSB7CisgICAgICAgIHJldHVybiBtTWVudVZpZXcgIT0gbnVsbCAmJiBtTWVudVZpZXcuaXNPdmVyZmxvd1Jlc2VydmVkKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tTmF2aWdhdGlvblZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgIG1DdXN0b21OYXZWaWV3ID0gdmlldzsKKyAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0TmF2aWdhdGlvbk1vZGUoQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT00pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UaXRsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgdGl0bGUuIFRoaXMgd2lsbCBhbHdheXMgcmVwbGFjZSBvciBvdmVycmlkZSB3aW5kb3cgdGl0bGVzLgorICAgICAqIEBwYXJhbSB0aXRsZSBUaXRsZSB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFdpbmRvd1RpdGxlKENoYXJTZXF1ZW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVVzZXJUaXRsZSA9IHRydWU7CisgICAgICAgIHNldFRpdGxlSW1wbCh0aXRsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB3aW5kb3cgdGl0bGUuIEEgd2luZG93IHRpdGxlIHdpbGwgYWx3YXlzIGJlIHJlcGxhY2VkIG9yIG92ZXJyaWRkZW4gYnkgYSB1c2VyIHRpdGxlLgorICAgICAqIEBwYXJhbSB0aXRsZSBUaXRsZSB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFRpdGxlKENoYXJTZXF1ZW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaW5kb3dUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgaWYgKCFtVXNlclRpdGxlKSB7CisgICAgICAgICAgICBzZXRUaXRsZUltcGwodGl0bGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFRpdGxlSW1wbChDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgICAgIGlmIChtVGl0bGVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Mb2dvTmF2SXRlbSAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9nb05hdkl0ZW0uc2V0VGl0bGUodGl0bGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdWJ0aXRsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpIHsKKyAgICAgICAgbVN1YnRpdGxlID0gc3VidGl0bGU7CisgICAgICAgIGlmIChtU3VidGl0bGVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dChzdWJ0aXRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5T3B0aW9ucyhpbnQgb3B0aW9ucykgeworICAgICAgICBmaW5hbCBpbnQgZmxhZ3NDaGFuZ2VkID0gb3B0aW9ucyBeIG1EaXNwbGF5T3B0aW9uczsKKyAgICAgICAgbURpc3BsYXlPcHRpb25zID0gb3B0aW9uczsKKyAgICAgICAgaWYgKChmbGFnc0NoYW5nZWQgJiBESVNQTEFZX1JFTEFZT1VUX01BU0spICE9IDApIHsKKyAgICAgICAgICAgIGZpbmFsIGludCB2aXMgPSAob3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX0hJREVfSE9NRSkgIT0gMCA/IEdPTkUgOiBWSVNJQkxFOworICAgICAgICAgICAgaWYgKG1Mb2dvVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3LnNldFZpc2liaWxpdHkodmlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSWNvblZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1JY29uVmlldy5zZXRWaXNpYmlsaXR5KHZpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hdmlnYXRpb25Nb2RlKGludCBtb2RlKSB7CisgICAgICAgIGZpbmFsIGludCBvbGRNb2RlID0gbU5hdmlnYXRpb25Nb2RlOworICAgICAgICBpZiAobW9kZSAhPSBvbGRNb2RlKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9sZE1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9TVEFOREFSRDoKKyAgICAgICAgICAgICAgICBpZiAobVRpdGxlTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVmlldyhtVGl0bGVMYXlvdXQpOworICAgICAgICAgICAgICAgICAgICBtVGl0bGVMYXlvdXQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICAgICAgaWYgKG1TcGlubmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVmlldyhtU3Bpbm5lcik7CisgICAgICAgICAgICAgICAgICAgIG1TcGlubmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfQ1VTVE9NOgorICAgICAgICAgICAgICAgIGlmIChtQ3VzdG9tTmF2VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVZpZXcobUN1c3RvbU5hdlZpZXcpOworICAgICAgICAgICAgICAgICAgICBtQ3VzdG9tTmF2VmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICAgICAgaWYgKG1UYWJMYXlvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVWaWV3KG1UYWJTY3JvbGxWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgbVRhYkxheW91dCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIG1UYWJTY3JvbGxWaWV3ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEOgorICAgICAgICAgICAgICAgIGluaXRUaXRsZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICAgICAgbVNwaW5uZXIgPSBuZXcgU3Bpbm5lcihtQ29udGV4dCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5kcm9wRG93blNwaW5uZXJTdHlsZSk7CisgICAgICAgICAgICAgICAgbVNwaW5uZXIuc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihtTmF2SXRlbVNlbGVjdGVkTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIGFkZFZpZXcobVNwaW5uZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1DdXN0b21OYXZWaWV3KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTOgorICAgICAgICAgICAgICAgIG1UYWJTY3JvbGxWaWV3ID0gbmV3IEhvcml6b250YWxTY3JvbGxWaWV3KGdldENvbnRleHQoKSk7CisgICAgICAgICAgICAgICAgbVRhYkxheW91dCA9IG5ldyBMaW5lYXJMYXlvdXQoZ2V0Q29udGV4dCgpLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmFjdGlvbkJhclRhYkJhclN0eWxlKTsKKyAgICAgICAgICAgICAgICBtVGFiU2Nyb2xsVmlldy5hZGRWaWV3KG1UYWJMYXlvdXQpOworICAgICAgICAgICAgICAgIGFkZFZpZXcobVRhYlNjcm9sbFZpZXcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU5hdmlnYXRpb25Nb2RlID0gbW9kZTsKKyAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXREcm9wZG93bkFkYXB0ZXIoU3Bpbm5lckFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBtU3Bpbm5lci5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERyb3Bkb3duU2VsZWN0ZWRQb3NpdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgbVNwaW5uZXIuc2V0U2VsZWN0aW9uKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldERyb3Bkb3duU2VsZWN0ZWRQb3NpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1TcGlubmVyLmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIFZpZXcgZ2V0Q3VzdG9tTmF2aWdhdGlvblZpZXcoKSB7CisgICAgICAgIHJldHVybiBtQ3VzdG9tTmF2VmlldzsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXROYXZpZ2F0aW9uTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1OYXZpZ2F0aW9uTW9kZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXREaXNwbGF5T3B0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIG1EaXNwbGF5T3B0aW9uczsKKyAgICB9CisKKyAgICBwcml2YXRlIFRhYlZpZXcgY3JlYXRlVGFiVmlldyhBY3Rpb25CYXIuVGFiIHRhYikgeworICAgICAgICBmaW5hbCBUYWJWaWV3IHRhYlZpZXcgPSBuZXcgVGFiVmlldyhnZXRDb250ZXh0KCksIHRhYik7CisgICAgICAgIHRhYlZpZXcuc2V0Rm9jdXNhYmxlKHRydWUpOworCisgICAgICAgIGlmIChtVGFiQ2xpY2tMaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICBtVGFiQ2xpY2tMaXN0ZW5lciA9IG5ldyBUYWJDbGlja0xpc3RlbmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgdGFiVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIobVRhYkNsaWNrTGlzdGVuZXIpOworICAgICAgICByZXR1cm4gdGFiVmlldzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRUYWIoQWN0aW9uQmFyLlRhYiB0YWIpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0ZpcnN0ID0gbVRhYkxheW91dC5nZXRDaGlsZENvdW50KCkgPT0gMDsKKyAgICAgICAgVmlldyB0YWJWaWV3ID0gY3JlYXRlVGFiVmlldyh0YWIpOworICAgICAgICBtVGFiTGF5b3V0LmFkZFZpZXcodGFiVmlldyk7CisgICAgICAgIGlmIChpc0ZpcnN0KSB7CisgICAgICAgICAgICB0YWJWaWV3LnNldFNlbGVjdGVkKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVGFiKEFjdGlvbkJhci5UYWIgdGFiLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0ZpcnN0ID0gbVRhYkxheW91dC5nZXRDaGlsZENvdW50KCkgPT0gMDsKKyAgICAgICAgZmluYWwgVGFiVmlldyB0YWJWaWV3ID0gY3JlYXRlVGFiVmlldyh0YWIpOworICAgICAgICBtVGFiTGF5b3V0LmFkZFZpZXcodGFiVmlldywgcG9zaXRpb24pOworICAgICAgICBpZiAoaXNGaXJzdCkgeworICAgICAgICAgICAgdGFiVmlldy5zZXRTZWxlY3RlZCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRhYkF0KGludCBwb3NpdGlvbikgeworICAgICAgICBtVGFiTGF5b3V0LnJlbW92ZVZpZXdBdChwb3NpdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIExheW91dFBhcmFtcyBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXMoKSB7CisgICAgICAgIC8vIFVzZWQgYnkgY3VzdG9tIG5hdiB2aWV3cyBpZiB0aGV5IGRvbid0IHN1cHBseSBsYXlvdXQgcGFyYW1zLiBFdmVyeXRoaW5nIGVsc2UKKyAgICAgICAgLy8gYWRkZWQgdG8gYW4gQWN0aW9uQmFyVmlldyBzaG91bGQgaGF2ZSB0aGVtIGFscmVhZHkuCisgICAgICAgIHJldHVybiBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRmluaXNoSW5mbGF0ZSgpIHsKKyAgICAgICAgc3VwZXIub25GaW5pc2hJbmZsYXRlKCk7CisKKyAgICAgICAgaWYgKChtRGlzcGxheU9wdGlvbnMgJiBBY3Rpb25CYXIuRElTUExBWV9ISURFX0hPTUUpID09IDApIHsKKyAgICAgICAgICAgIGlmIChtTG9nbyAhPSBudWxsICYmIChtRGlzcGxheU9wdGlvbnMgJiBBY3Rpb25CYXIuRElTUExBWV9VU0VfTE9HTykgIT0gMCkgeworICAgICAgICAgICAgICAgIG1Mb2dvVmlldyA9IG5ldyBJbWFnZVZpZXcoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICBtTG9nb1ZpZXcuc2V0QWRqdXN0Vmlld0JvdW5kcyh0cnVlKTsKKyAgICAgICAgICAgICAgICBtTG9nb1ZpZXcuc2V0TGF5b3V0UGFyYW1zKG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpKTsKKyAgICAgICAgICAgICAgICBtTG9nb1ZpZXcuc2V0SW1hZ2VEcmF3YWJsZShtTG9nbyk7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3LnNldENsaWNrYWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBtTG9nb1ZpZXcuc2V0Rm9jdXNhYmxlKHRydWUpOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIobUhvbWVDbGlja0xpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1Mb2dvVmlldyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1JY29uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcgPSBuZXcgSW1hZ2VWaWV3KGdldENvbnRleHQoKSk7CisgICAgICAgICAgICAgICAgbUljb25WaWV3LnNldEFkanVzdFZpZXdCb3VuZHModHJ1ZSk7CisgICAgICAgICAgICAgICAgbUljb25WaWV3LnNldExheW91dFBhcmFtcyhuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSk7CisgICAgICAgICAgICAgICAgbUljb25WaWV3LnNldEltYWdlRHJhd2FibGUobUljb24pOworICAgICAgICAgICAgICAgIG1JY29uVmlldy5zZXRDbGlja2FibGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgbUljb25WaWV3LnNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0T25DbGlja0xpc3RlbmVyKG1Ib21lQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgYWRkVmlldyhtSWNvblZpZXcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChtTmF2aWdhdGlvbk1vZGUpIHsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEOgorICAgICAgICAgICAgaWYgKG1Mb2dvVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5pdFRpdGxlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkluZmxhdGluZyBkcm9wZG93biBsaXN0IG5hdmlnYXRpb24gaXNuJ3Qgc3VwcG9ydGVkIHlldCEiKTsKKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfVEFCUzoKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkluZmxhdGluZyB0YWIgbmF2aWdhdGlvbiBpc24ndCBzdXBwb3J0ZWQgeWV0ISIpOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT006CisgICAgICAgICAgICBpZiAobUN1c3RvbU5hdlZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFkZFZpZXcobUN1c3RvbU5hdlZpZXcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGluaXRUaXRsZSgpIHsKKyAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKGdldENvbnRleHQoKSk7CisgICAgICAgIG1UaXRsZUxheW91dCA9IChMaW5lYXJMYXlvdXQpIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuYWN0aW9uX2Jhcl90aXRsZV9pdGVtLCBudWxsKTsKKyAgICAgICAgbVRpdGxlVmlldyA9IChUZXh0VmlldykgbVRpdGxlTGF5b3V0LmZpbmRWaWV3QnlJZChSLmlkLmFjdGlvbl9iYXJfdGl0bGUpOworICAgICAgICBtU3VidGl0bGVWaWV3ID0gKFRleHRWaWV3KSBtVGl0bGVMYXlvdXQuZmluZFZpZXdCeUlkKFIuaWQuYWN0aW9uX2Jhcl9zdWJ0aXRsZSk7CisKKyAgICAgICAgaWYgKG1UaXRsZVN0eWxlUmVzICE9IDApIHsKKyAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dEFwcGVhcmFuY2UobUNvbnRleHQsIG1UaXRsZVN0eWxlUmVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChtVGl0bGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1TdWJ0aXRsZVN0eWxlUmVzICE9IDApIHsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dEFwcGVhcmFuY2UobUNvbnRleHQsIG1TdWJ0aXRsZVN0eWxlUmVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVN1YnRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dChtU3VidGl0bGUpOworICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworICAgICAgICB9CisKKyAgICAgICAgYWRkVmlldyhtVGl0bGVMYXlvdXQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRhYlNlbGVjdGVkKGludCBwb3NpdGlvbikgeworICAgICAgICBmaW5hbCBpbnQgdGFiQ291bnQgPSBtVGFiTGF5b3V0LmdldENoaWxkQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbVRhYkxheW91dC5nZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgY2hpbGQuc2V0U2VsZWN0ZWQoaSA9PSBwb3NpdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0VmlldyhBY3Rpb25CYXJDb250ZXh0VmlldyB2aWV3KSB7CisgICAgICAgIG1Db250ZXh0VmlldyA9IHZpZXc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKKyAgICAgICAgaW50IHdpZHRoTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUod2lkdGhNZWFzdXJlU3BlYyk7CisgICAgICAgIGlmICh3aWR0aE1vZGUgIT0gTWVhc3VyZVNwZWMuRVhBQ1RMWSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgY2FuIG9ubHkgYmUgdXNlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpdGggYW5kcm9pZDpsYXlvdXRfd2lkdGg9XCJtYXRjaF9wYXJlbnRcIiAob3IgZmlsbF9wYXJlbnQpIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGludCBoZWlnaHRNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgIGlmIChoZWlnaHRNb2RlICE9IE1lYXN1cmVTcGVjLkFUX01PU1QpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiIGNhbiBvbmx5IGJlIHVzZWQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aXRoIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD1cIndyYXBfY29udGVudFwiIik7CisgICAgICAgIH0KKworICAgICAgICBpbnQgY29udGVudFdpZHRoID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKKworICAgICAgICBpbnQgbWF4SGVpZ2h0ID0gbUNvbnRlbnRIZWlnaHQgPiAwID8KKyAgICAgICAgICAgICAgICBtQ29udGVudEhlaWdodCA6IE1lYXN1cmVTcGVjLmdldFNpemUoaGVpZ2h0TWVhc3VyZVNwZWMpOworICAgICAgICAKKyAgICAgICAgZmluYWwgaW50IHZlcnRpY2FsUGFkZGluZyA9IGdldFBhZGRpbmdUb3AoKSArIGdldFBhZGRpbmdCb3R0b20oKTsKKyAgICAgICAgaW50IGF2YWlsYWJsZVdpZHRoID0gY29udGVudFdpZHRoIC0gZ2V0UGFkZGluZ0xlZnQoKSAtIGdldFBhZGRpbmdSaWdodCgpOworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gbWF4SGVpZ2h0IC0gdmVydGljYWxQYWRkaW5nOworICAgICAgICBmaW5hbCBpbnQgY2hpbGRTcGVjSGVpZ2h0ID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuQVRfTU9TVCk7CisKKyAgICAgICAgaWYgKG1Mb2dvVmlldyAhPSBudWxsICYmIG1Mb2dvVmlldy5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgeworICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBtZWFzdXJlQ2hpbGRWaWV3KG1Mb2dvVmlldywgYXZhaWxhYmxlV2lkdGgsIGNoaWxkU3BlY0hlaWdodCwgbVNwYWNpbmcpOworICAgICAgICB9CisgICAgICAgIGlmIChtSWNvblZpZXcgIT0gbnVsbCAmJiBtSWNvblZpZXcuZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUpIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhtSWNvblZpZXcsIGF2YWlsYWJsZVdpZHRoLCBjaGlsZFNwZWNIZWlnaHQsIG1TcGFjaW5nKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IG1lYXN1cmVDaGlsZFZpZXcobU1lbnVWaWV3LCBhdmFpbGFibGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRTcGVjSGVpZ2h0LCAwKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc3dpdGNoIChtTmF2aWdhdGlvbk1vZGUpIHsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEOgorICAgICAgICAgICAgaWYgKG1UaXRsZUxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbWVhc3VyZUNoaWxkVmlldyhtVGl0bGVMYXlvdXQsIGF2YWlsYWJsZVdpZHRoLCBjaGlsZFNwZWNIZWlnaHQsIG1TcGFjaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKKyAgICAgICAgICAgIGlmIChtU3Bpbm5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVNwaW5uZXIubWVhc3VyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhhdmFpbGFibGVXaWR0aCwgTWVhc3VyZVNwZWMuQVRfTU9TVCksCisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoaGVpZ2h0LCBNZWFzdXJlU3BlYy5BVF9NT1NUKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgIGlmIChtQ3VzdG9tTmF2VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gbUN1c3RvbU5hdlZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGN1c3RvbU5hdldpZHRoTW9kZSA9IGxwLndpZHRoICE9IExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQgPworICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMuRVhBQ1RMWSA6IE1lYXN1cmVTcGVjLkFUX01PU1Q7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGN1c3RvbU5hdldpZHRoID0gbHAud2lkdGggPj0gMCA/CisgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihscC53aWR0aCwgYXZhaWxhYmxlV2lkdGgpIDogYXZhaWxhYmxlV2lkdGg7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYWN0aW9uIGJhciBpcyB3cmFwcGluZyB0byBpdHMgY29udGVudCBoZWlnaHQsIGRvbid0IGFsbG93IGEgY3VzdG9tCisgICAgICAgICAgICAgICAgLy8gdmlldyB0byBNQVRDSF9QQVJFTlQuCisgICAgICAgICAgICAgICAgaW50IGN1c3RvbU5hdkhlaWdodE1vZGU7CisgICAgICAgICAgICAgICAgaWYgKG1Db250ZW50SGVpZ2h0IDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY3VzdG9tTmF2SGVpZ2h0TW9kZSA9IE1lYXN1cmVTcGVjLkFUX01PU1Q7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY3VzdG9tTmF2SGVpZ2h0TW9kZSA9IGxwLmhlaWdodCAhPSBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5FWEFDVExZIDogTWVhc3VyZVNwZWMuQVRfTU9TVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGN1c3RvbU5hdkhlaWdodCA9IGxwLmhlaWdodCA+PSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKGxwLmhlaWdodCwgaGVpZ2h0KSA6IGhlaWdodDsKKyAgICAgICAgICAgICAgICBtQ3VzdG9tTmF2Vmlldy5tZWFzdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGN1c3RvbU5hdldpZHRoLCBjdXN0b21OYXZXaWR0aE1vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGN1c3RvbU5hdkhlaWdodCwgY3VzdG9tTmF2SGVpZ2h0TW9kZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTOgorICAgICAgICAgICAgaWYgKG1UYWJTY3JvbGxWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVGFiU2Nyb2xsVmlldy5tZWFzdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhoZWlnaHQsIE1lYXN1cmVTcGVjLkVYQUNUTFkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Db250ZW50SGVpZ2h0IDw9IDApIHsKKyAgICAgICAgICAgIGludCBtZWFzdXJlZEhlaWdodCA9IDA7CisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBWaWV3IHYgPSBnZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgICAgIGludCBwYWRkZWRWaWV3SGVpZ2h0ID0gdi5nZXRNZWFzdXJlZEhlaWdodCgpICsgdmVydGljYWxQYWRkaW5nOworICAgICAgICAgICAgICAgIGlmIChwYWRkZWRWaWV3SGVpZ2h0ID4gbWVhc3VyZWRIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRIZWlnaHQgPSBwYWRkZWRWaWV3SGVpZ2h0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKGNvbnRlbnRXaWR0aCwgbWVhc3VyZWRIZWlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24oY29udGVudFdpZHRoLCBtYXhIZWlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Db250ZXh0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ29udGV4dFZpZXcuc2V0SGVpZ2h0KGdldE1lYXN1cmVkSGVpZ2h0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgbWVhc3VyZUNoaWxkVmlldyhWaWV3IGNoaWxkLCBpbnQgYXZhaWxhYmxlV2lkdGgsIGludCBjaGlsZFNwZWNIZWlnaHQsIGludCBzcGFjaW5nKSB7CisgICAgICAgIGNoaWxkLm1lYXN1cmUoTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICBjaGlsZFNwZWNIZWlnaHQpOworCisgICAgICAgIGF2YWlsYWJsZVdpZHRoIC09IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgYXZhaWxhYmxlV2lkdGggLT0gc3BhY2luZzsKKworICAgICAgICByZXR1cm4gYXZhaWxhYmxlV2lkdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgeworICAgICAgICBpbnQgeCA9IGdldFBhZGRpbmdMZWZ0KCk7CisgICAgICAgIGZpbmFsIGludCB5ID0gZ2V0UGFkZGluZ1RvcCgpOworICAgICAgICBmaW5hbCBpbnQgY29udGVudEhlaWdodCA9IGIgLSB0IC0gZ2V0UGFkZGluZ1RvcCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOworCisgICAgICAgIGlmIChtTG9nb1ZpZXcgIT0gbnVsbCAmJiBtTG9nb1ZpZXcuZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUpIHsKKyAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtTG9nb1ZpZXcsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgbVNwYWNpbmc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1JY29uVmlldyAhPSBudWxsICYmIG1JY29uVmlldy5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgeworICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1JY29uVmlldywgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc3dpdGNoIChtTmF2aWdhdGlvbk1vZGUpIHsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEOgorICAgICAgICAgICAgaWYgKG1UaXRsZUxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1UaXRsZUxheW91dCwgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKKyAgICAgICAgICAgIGlmIChtU3Bpbm5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1TcGlubmVyLCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIG1TcGFjaW5nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT006CisgICAgICAgICAgICBpZiAobUN1c3RvbU5hdlZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtQ3VzdG9tTmF2VmlldywgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfVEFCUzoKKyAgICAgICAgICAgIGlmIChtVGFiU2Nyb2xsVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1UYWJTY3JvbGxWaWV3LCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIG1TcGFjaW5nOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgeCA9IHIgLSBsIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7CisKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICB4IC09IHBvc2l0aW9uQ2hpbGRJbnZlcnNlKG1NZW51VmlldywgeCArIG1BY3Rpb25TcGFjaW5nLCB5LCBjb250ZW50SGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAtIG1BY3Rpb25TcGFjaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgcG9zaXRpb25DaGlsZChWaWV3IGNoaWxkLCBpbnQgeCwgaW50IHksIGludCBjb250ZW50SGVpZ2h0KSB7CisgICAgICAgIGludCBjaGlsZFdpZHRoID0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICBpbnQgY2hpbGRIZWlnaHQgPSBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpOworICAgICAgICBpbnQgY2hpbGRUb3AgPSB5ICsgKGNvbnRlbnRIZWlnaHQgLSBjaGlsZEhlaWdodCkgLyAyOworCisgICAgICAgIGNoaWxkLmxheW91dCh4LCBjaGlsZFRvcCwgeCArIGNoaWxkV2lkdGgsIGNoaWxkVG9wICsgY2hpbGRIZWlnaHQpOworCisgICAgICAgIHJldHVybiBjaGlsZFdpZHRoOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGludCBwb3NpdGlvbkNoaWxkSW52ZXJzZShWaWV3IGNoaWxkLCBpbnQgeCwgaW50IHksIGludCBjb250ZW50SGVpZ2h0KSB7CisgICAgICAgIGludCBjaGlsZFdpZHRoID0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICBpbnQgY2hpbGRIZWlnaHQgPSBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpOworICAgICAgICBpbnQgY2hpbGRUb3AgPSB5ICsgKGNvbnRlbnRIZWlnaHQgLSBjaGlsZEhlaWdodCkgLyAyOworCisgICAgICAgIGNoaWxkLmxheW91dCh4IC0gY2hpbGRXaWR0aCwgY2hpbGRUb3AsIHgsIGNoaWxkVG9wICsgY2hpbGRIZWlnaHQpOworCisgICAgICAgIHJldHVybiBjaGlsZFdpZHRoOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRhYlZpZXcgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgeworICAgICAgICBwcml2YXRlIEFjdGlvbkJhci5UYWIgbVRhYjsKKworICAgICAgICBwdWJsaWMgVGFiVmlldyhDb250ZXh0IGNvbnRleHQsIEFjdGlvbkJhci5UYWIgdGFiKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBudWxsLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuYWN0aW9uQmFyVGFiU3R5bGUpOworICAgICAgICAgICAgbVRhYiA9IHRhYjsKKworICAgICAgICAgICAgZmluYWwgVmlldyBjdXN0b20gPSB0YWIuZ2V0Q3VzdG9tVmlldygpOworICAgICAgICAgICAgaWYgKGN1c3RvbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWRkVmlldyhjdXN0b20pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIFN0eWxlIHRhYnMgYmFzZWQgb24gdGhlIHRoZW1lCisKKyAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBpY29uID0gdGFiLmdldEljb24oKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2UgdGV4dCA9IHRhYi5nZXRUZXh0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoaWNvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEltYWdlVmlldyBpY29uVmlldyA9IG5ldyBJbWFnZVZpZXcoY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIGljb25WaWV3LnNldEltYWdlRHJhd2FibGUoaWNvbik7CisgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKKyAgICAgICAgICAgICAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMOworICAgICAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRMYXlvdXRQYXJhbXMobHApOworICAgICAgICAgICAgICAgICAgICBhZGRWaWV3KGljb25WaWV3KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFRleHRWaWV3IHRleHRWaWV3ID0gbmV3IFRleHRWaWV3KGNvbnRleHQsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmFjdGlvbkJhclRhYlRleHRTdHlsZSk7CisgICAgICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldFRleHQodGV4dCk7CisgICAgICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldFNpbmdsZUxpbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0RWxsaXBzaXplKFRydW5jYXRlQXQuRU5EKTsKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOworICAgICAgICAgICAgICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5DRU5URVJfVkVSVElDQUw7CisgICAgICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldExheW91dFBhcmFtcyhscCk7CisgICAgICAgICAgICAgICAgICAgIGFkZFZpZXcodGV4dFZpZXcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0TGF5b3V0UGFyYW1zKG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgMSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFjdGlvbkJhci5UYWIgZ2V0VGFiKCkgeworICAgICAgICAgICAgcmV0dXJuIG1UYWI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFRhYkNsaWNrTGlzdGVuZXIgaW1wbGVtZW50cyBPbkNsaWNrTGlzdGVuZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdmlldykgeworICAgICAgICAgICAgVGFiVmlldyB0YWJWaWV3ID0gKFRhYlZpZXcpIHZpZXc7CisgICAgICAgICAgICB0YWJWaWV3LmdldFRhYigpLnNlbGVjdCgpOworICAgICAgICAgICAgZmluYWwgaW50IHRhYkNvdW50ID0gbVRhYkxheW91dC5nZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbVRhYkxheW91dC5nZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgICAgIGNoaWxkLnNldFNlbGVjdGVkKGNoaWxkID09IHZpZXcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Db250YWN0SGVhZGVyV2lkZ2V0LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0NvbnRhY3RIZWFkZXJXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyMTQ2Ni4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0NvbnRhY3RIZWFkZXJXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwotCi1pbXBvcnQgYW5kcm9pZC5NYW5pZmVzdDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQXN5bmNRdWVyeUhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFVyaXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUGhvbmVMb29rdXA7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5TdGF0dXNVcGRhdGVzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZVV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQ2hlY2tCb3g7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUXVpY2tDb250YWN0QmFkZ2U7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi0vKioKLSAqIEhlYWRlciB1c2VkIGFjcm9zcyBzeXN0ZW0gZm9yIGRpc3BsYXlpbmcgYSB0aXRsZSBiYXIgd2l0aCBjb250YWN0IGluZm8uIFlvdQotICogY2FuIGJpbmQgc3BlY2lmaWMgdmFsdWVzIG9uIHRoZSBoZWFkZXIsIG9yIHVzZSBoZWxwZXIgbWV0aG9kcyBsaWtlCi0gKiB7QGxpbmsgI2JpbmRGcm9tQ29udGFjdElkKGxvbmcpfSB0byBwb3B1bGF0ZSBhc3luY2hyb25vdXNseS4KLSAqIDxwPgotICogVGhlIHBhcmVudCBtdXN0IHJlcXVlc3QgdGhlIHtAbGluayBNYW5pZmVzdC5wZXJtaXNzaW9uI1JFQURfQ09OVEFDVFN9Ci0gKiBwZXJtaXNzaW9uIHRvIGFjY2VzcyBjb250YWN0IGRhdGEuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250YWN0SGVhZGVyV2lkZ2V0IGV4dGVuZHMgRnJhbWVMYXlvdXQgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNvbnRhY3RIZWFkZXJXaWRnZXQiOwotCi0gICAgcHJpdmF0ZSBUZXh0VmlldyBtRGlzcGxheU5hbWVWaWV3OwotICAgIHByaXZhdGUgVmlldyBtQWdncmVnYXRlQmFkZ2U7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtUGhvbmV0aWNOYW1lVmlldzsKLSAgICBwcml2YXRlIENoZWNrQm94IG1TdGFycmVkVmlldzsKLSAgICBwcml2YXRlIFF1aWNrQ29udGFjdEJhZGdlIG1QaG90b1ZpZXc7Ci0gICAgcHJpdmF0ZSBJbWFnZVZpZXcgbVByZXNlbmNlVmlldzsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1TdGF0dXNWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1c0F0dHJpYnV0aW9uVmlldzsKLSAgICBwcml2YXRlIGludCBtTm9QaG90b1Jlc291cmNlOwotICAgIHByaXZhdGUgUXVlcnlIYW5kbGVyIG1RdWVyeUhhbmRsZXI7Ci0KLSAgICBwcm90ZWN0ZWQgVXJpIG1Db250YWN0VXJpOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIG1FeGNsdWRlTWltZXMgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIGZvciBjYWxsYmFja3MgaW52b2tlZCB3aGVuIHRoZSB1c2VyIGludGVyYWN0cyB3aXRoIGEgaGVhZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgQ29udGFjdEhlYWRlckxpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25QaG90b0NsaWNrKFZpZXcgdmlldyk7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uRGlzcGxheU5hbWVDbGljayhWaWV3IHZpZXcpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29udGFjdEhlYWRlckxpc3RlbmVyIG1MaXN0ZW5lcjsKLQotCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgQ29udGFjdFF1ZXJ5IHsKLSAgICAgICAgLy9Qcm9qZWN0aW9uIHVzZWQgZm9yIHRoZSBzdW1tYXJ5IGluZm8gaW4gdGhlIGhlYWRlci4KLSAgICAgICAgU3RyaW5nW10gQ09MVU1OUyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICBDb250YWN0cy5fSUQsCi0gICAgICAgICAgICBDb250YWN0cy5MT09LVVBfS0VZLAotICAgICAgICAgICAgQ29udGFjdHMuUEhPVE9fSUQsCi0gICAgICAgICAgICBDb250YWN0cy5ESVNQTEFZX05BTUUsCi0gICAgICAgICAgICBDb250YWN0cy5QSE9ORVRJQ19OQU1FLAotICAgICAgICAgICAgQ29udGFjdHMuU1RBUlJFRCwKLSAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfUFJFU0VOQ0UsCi0gICAgICAgICAgICBDb250YWN0cy5DT05UQUNUX1NUQVRVUywKLSAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfU1RBVFVTX1RJTUVTVEFNUCwKLSAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfU1RBVFVTX1JFU19QQUNLQUdFLAotICAgICAgICAgICAgQ29udGFjdHMuQ09OVEFDVF9TVEFUVVNfTEFCRUwsCi0gICAgICAgIH07Ci0gICAgICAgIGludCBfSUQgPSAwOwotICAgICAgICBpbnQgTE9PS1VQX0tFWSA9IDE7Ci0gICAgICAgIGludCBQSE9UT19JRCA9IDI7Ci0gICAgICAgIGludCBESVNQTEFZX05BTUUgPSAzOwotICAgICAgICBpbnQgUEhPTkVUSUNfTkFNRSA9IDQ7Ci0gICAgICAgIC8vVE9ETzogV2UgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB3ZSdyZSBnb2luZyB0byBnZXQgdGhlIHBob25ldGljIG5hbWUuCi0gICAgICAgIC8vc3RhdGljIGZpbmFsIGludCBIRUFERVJfUEhPTkVUSUNfTkFNRV9DT0xVTU5fSU5ERVgKLSAgICAgICAgaW50IFNUQVJSRUQgPSA1OwotICAgICAgICBpbnQgQ09OVEFDVF9QUkVTRU5DRV9TVEFUVVMgPSA2OwotICAgICAgICBpbnQgQ09OVEFDVF9TVEFUVVMgPSA3OwotICAgICAgICBpbnQgQ09OVEFDVF9TVEFUVVNfVElNRVNUQU1QID0gODsKLSAgICAgICAgaW50IENPTlRBQ1RfU1RBVFVTX1JFU19QQUNLQUdFID0gOTsKLSAgICAgICAgaW50IENPTlRBQ1RfU1RBVFVTX0xBQkVMID0gMTA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgUGhvdG9RdWVyeSB7Ci0gICAgICAgIFN0cmluZ1tdIENPTFVNTlMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgUGhvdG8uUEhPVE8KLSAgICAgICAgfTsKLQotICAgICAgICBpbnQgUEhPVE8gPSAwOwotICAgIH0KLQotICAgIC8vUHJvamVjdGlvbiB1c2VkIGZvciBsb29raW5nIHVwIGNvbnRhY3QgaWQgZnJvbSBwaG9uZSBudW1iZXIKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBIT05FX0xPT0tVUF9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgUGhvbmVMb29rdXAuX0lELAotICAgICAgICBQaG9uZUxvb2t1cC5MT09LVVBfS0VZLAotICAgIH07Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUEhPTkVfTE9PS1VQX0NPTlRBQ1RfSURfQ09MVU1OX0lOREVYID0gMDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQSE9ORV9MT09LVVBfQ09OVEFDVF9MT09LVVBfS0VZX0NPTFVNTl9JTkRFWCA9IDE7Ci0KLSAgICAvL1Byb2plY3Rpb24gdXNlZCBmb3IgbG9va2luZyB1cCBjb250YWN0IGlkIGZyb20gZW1haWwgYWRkcmVzcwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1BSUxfTE9PS1VQX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBSYXdDb250YWN0cy5DT05UQUNUX0lELAotICAgICAgICBDb250YWN0cy5MT09LVVBfS0VZLAotICAgIH07Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRU1BSUxfTE9PS1VQX0NPTlRBQ1RfSURfQ09MVU1OX0lOREVYID0gMDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFTUFJTF9MT09LVVBfQ09OVEFDVF9MT09LVVBfS0VZX0NPTFVNTl9JTkRFWCA9IDE7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTlRBQ1RfTE9PS1VQX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBDb250YWN0cy5fSUQsCi0gICAgfTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT05UQUNUX0xPT0tVUF9JRF9DT0xVTU5fSU5ERVggPSAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX0NPTlRBQ1RfSU5GTyA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX1BIT05FX0xPT0tVUCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX0VNQUlMX0xPT0tVUCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX1BIT1RPX1FVRVJZID0gMzsKLQotICAgIHB1YmxpYyBDb250YWN0SGVhZGVyV2lkZ2V0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0SGVhZGVyV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0SGVhZGVyV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKLQotICAgICAgICBtQ29udGVudFJlc29sdmVyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0KLSAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPQotICAgICAgICAgICAgKExheW91dEluZmxhdGVyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOwotICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmNvbnRhY3RfaGVhZGVyLCB0aGlzKTsKLQotICAgICAgICBtRGlzcGxheU5hbWVWaWV3ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5uYW1lKTsKLSAgICAgICAgbUFnZ3JlZ2F0ZUJhZGdlID0gZmluZFZpZXdCeUlkKFIuaWQuYWdncmVnYXRlX2JhZGdlKTsKLQotICAgICAgICBtUGhvbmV0aWNOYW1lVmlldyA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQucGhvbmV0aWNfbmFtZSk7Ci0KLSAgICAgICAgbVN0YXJyZWRWaWV3ID0gKENoZWNrQm94KWZpbmRWaWV3QnlJZChSLmlkLnN0YXIpOwotICAgICAgICBtU3RhcnJlZFZpZXcuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOwotCi0gICAgICAgIG1QaG90b1ZpZXcgPSAoUXVpY2tDb250YWN0QmFkZ2UpIGZpbmRWaWV3QnlJZChSLmlkLnBob3RvKTsKLQotICAgICAgICBtUHJlc2VuY2VWaWV3ID0gKEltYWdlVmlldykgZmluZFZpZXdCeUlkKFIuaWQucHJlc2VuY2UpOwotCi0gICAgICAgIG1TdGF0dXNWaWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnN0YXR1cyk7Ci0gICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzX2RhdGUpOwotCi0gICAgICAgIC8vIFNldCB0aGUgcGhvdG8gd2l0aCBhIHJhbmRvbSAibm8gY29udGFjdCIgaW1hZ2UKLSAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKLSAgICAgICAgaW50IG51bSA9IChpbnQpIG5vdyAmIDB4ZjsKLSAgICAgICAgaWYgKG51bSA8IDkpIHsKLSAgICAgICAgICAgIC8vIExlYW5pbmcgaW4gZnJvbSByaWdodCwgY29tbW9uCi0gICAgICAgICAgICBtTm9QaG90b1Jlc291cmNlID0gUi5kcmF3YWJsZS5pY19jb250YWN0X3BpY3R1cmU7Ci0gICAgICAgIH0gZWxzZSBpZiAobnVtIDwgMTQpIHsKLSAgICAgICAgICAgIC8vIExlYW5pbmcgaW4gZnJvbSBsZWZ0IHVuY29tbW9uCi0gICAgICAgICAgICBtTm9QaG90b1Jlc291cmNlID0gUi5kcmF3YWJsZS5pY19jb250YWN0X3BpY3R1cmVfMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIENvbWluZyBpbiBmcm9tIHRoZSB0b3AsIHJhcmUKLSAgICAgICAgICAgIG1Ob1Bob3RvUmVzb3VyY2UgPSBSLmRyYXdhYmxlLmljX2NvbnRhY3RfcGljdHVyZV8zOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuYWJsZUNsaWNrTGlzdGVuZXJzKCkgewotICAgICAgICBtRGlzcGxheU5hbWVWaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgbVBob3RvVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBnaXZlbiB7QGxpbmsgQ29udGFjdEhlYWRlckxpc3RlbmVyfSB0byBoYW5kbGUgaGVhZGVyIGV2ZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250YWN0SGVhZGVyTGlzdGVuZXIoQ29udGFjdEhlYWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtUGhvdG9DbGljaygpIHsKLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXIub25QaG90b0NsaWNrKG1QaG90b1ZpZXcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXNwbGF5TmFtZUNsaWNrKCkgewotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lci5vbkRpc3BsYXlOYW1lQ2xpY2sobURpc3BsYXlOYW1lVmlldyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFF1ZXJ5SGFuZGxlciBleHRlbmRzIEFzeW5jUXVlcnlIYW5kbGVyIHsKLQotICAgICAgICBwdWJsaWMgUXVlcnlIYW5kbGVyKENvbnRlbnRSZXNvbHZlciBjcikgewotICAgICAgICAgICAgc3VwZXIoY3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUXVlcnlDb21wbGV0ZShpbnQgdG9rZW4sIE9iamVjdCBjb29raWUsIEN1cnNvciBjdXJzb3IpIHsKLSAgICAgICAgICAgIHRyeXsKLSAgICAgICAgICAgICAgICBpZiAodGhpcyAhPSBtUXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUXVlcnlDb21wbGV0ZTogZGlzY2FyZCByZXN1bHQsIHRoZSBxdWVyeSBoYW5kbGVyIGlzIHJlc2V0ISIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3dpdGNoICh0b2tlbikgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX1BIT1RPX1FVRVJZOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL1NldCB0aGUgcGhvdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBwaG90b0JpdG1hcCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwgJiYgY3Vyc29yLm1vdmVUb0ZpcnN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWN1cnNvci5pc051bGwoUGhvdG9RdWVyeS5QSE9UTykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gcGhvdG9EYXRhID0gY3Vyc29yLmdldEJsb2IoUGhvdG9RdWVyeS5QSE9UTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvdG9CaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUJ5dGVBcnJheShwaG90b0RhdGEsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG90b0RhdGEubGVuZ3RoLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBob3RvQml0bWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG90b0JpdG1hcCA9IGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVBob3RvVmlldy5zZXRJbWFnZUJpdG1hcChwaG90b0JpdG1hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29va2llICE9IG51bGwgJiYgY29va2llIGluc3RhbmNlb2YgVXJpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBob3RvVmlldy5hc3NpZ25Db250YWN0VXJpKChVcmkpIGNvb2tpZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX0NPTlRBQ1RfSU5GTzogewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmIGN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZENvbnRhY3RJbmZvKGN1cnNvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJpIGxvb2t1cFVyaSA9IENvbnRhY3RzLmdldExvb2t1cFVyaShjdXJzb3IuZ2V0TG9uZyhDb250YWN0UXVlcnkuX0lEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LkxPT0tVUF9LRVkpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcGhvdG9JZCA9IGN1cnNvci5nZXRMb25nKENvbnRhY3RRdWVyeS5QSE9UT19JRCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGhvdG9JZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QaG90b1ZpZXcuc2V0SW1hZ2VCaXRtYXAobG9hZFBsYWNlaG9sZGVyUGhvdG8obnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29va2llICE9IG51bGwgJiYgY29va2llIGluc3RhbmNlb2YgVXJpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LmFzc2lnbkNvbnRhY3RVcmkoKFVyaSkgY29va2llKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQaG90b1F1ZXJ5KHBob3RvSWQsIGxvb2t1cFVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBkb24ndCByZXNldCBxdWVyeSBoYW5kbGVyICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZG4ndCByZWFsbHkgaGFwcGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheU5hbWUobnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U29jaWFsU25pcHBldChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQaG90byhsb2FkUGxhY2Vob2xkZXJQaG90byhudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRPS0VOX1BIT05FX0xPT0tVUDogewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmIGN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBjb250YWN0SWQgPSBjdXJzb3IuZ2V0TG9uZyhQSE9ORV9MT09LVVBfQ09OVEFDVF9JRF9DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb29rdXBLZXkgPSBjdXJzb3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhPTkVfTE9PS1VQX0NPTlRBQ1RfTE9PS1VQX0tFWV9DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRGcm9tQ29udGFjdFVyaUludGVybmFsKENvbnRhY3RzLmdldExvb2t1cFVyaShjb250YWN0SWQsIGxvb2t1cEtleSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBkb24ndCByZXNldCBxdWVyeSBoYW5kbGVyICovKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBob25lTnVtYmVyID0gKFN0cmluZykgY29va2llOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERpc3BsYXlOYW1lKHBob25lTnVtYmVyLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTb2NpYWxTbmlwcGV0KG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBob3RvKGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LmFzc2lnbkNvbnRhY3RGcm9tUGhvbmUocGhvbmVOdW1iZXIsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUT0tFTl9FTUFJTF9MT09LVVA6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCAmJiBjdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgY29udGFjdElkID0gY3Vyc29yLmdldExvbmcoRU1BSUxfTE9PS1VQX0NPTlRBQ1RfSURfQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9va3VwS2V5ID0gY3Vyc29yLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVNQUlMX0xPT0tVUF9DT05UQUNUX0xPT0tVUF9LRVlfQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kRnJvbUNvbnRhY3RVcmlJbnRlcm5hbChDb250YWN0cy5nZXRMb29rdXBVcmkoY29udGFjdElkLCBsb29rdXBLZXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogZG9uJ3QgcmVzZXQgcXVlcnkgaGFuZGxlciAqLyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbWFpbEFkZHJlc3MgPSAoU3RyaW5nKSBjb29raWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheU5hbWUoZW1haWxBZGRyZXNzLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTb2NpYWxTbmlwcGV0KG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBob3RvKGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LmFzc2lnbkNvbnRhY3RGcm9tRW1haWwoZW1haWxBZGRyZXNzLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHVybiBvbi9vZmYgc2hvd2luZyBvZiB0aGUgYWdncmVnYXRlIGJhZGdlIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd0FnZ3JlZ2F0ZUJhZGdlKGJvb2xlYW4gc2hvd0JhZ2RlKSB7Ci0gICAgICAgIG1BZ2dyZWdhdGVCYWRnZS5zZXRWaXNpYmlsaXR5KHNob3dCYWdkZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHVybiBvbi9vZmYgc2hvd2luZyBvZiB0aGUgc3RhciBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3dTdGFyKGJvb2xlYW4gc2hvd1N0YXIpIHsKLSAgICAgICAgbVN0YXJyZWRWaWV3LnNldFZpc2liaWxpdHkoc2hvd1N0YXIgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbnVhbGx5IHNldCB0aGUgc3RhcnJlZCBzdGF0ZSBvZiB0aGlzIGhlYWRlciB3aWRnZXQuIFRoaXMgZG9lc24ndCBjaGFuZ2UKLSAgICAgKiB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ29udGFjdHN9IHZhbHVlLCBvbmx5IHRoZSBVSSBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdGFyZWQoYm9vbGVhbiBzdGFycmVkKSB7Ci0gICAgICAgIG1TdGFycmVkVmlldy5zZXRDaGVja2VkKHN0YXJyZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbnVhbGx5IHNldCB0aGUgcHJlc2VuY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJlc2VuY2UoaW50IHByZXNlbmNlKSB7Ci0gICAgICAgIG1QcmVzZW5jZVZpZXcuc2V0SW1hZ2VSZXNvdXJjZShTdGF0dXNVcGRhdGVzLmdldFByZXNlbmNlSWNvblJlc291cmNlSWQocHJlc2VuY2UpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIGNvbnRhY3QgdXJpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFjdFVyaShVcmkgdXJpKSB7Ci0gICAgICAgIHNldENvbnRhY3RVcmkodXJpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIGNvbnRhY3QgdXJpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFjdFVyaShVcmkgdXJpLCBib29sZWFuIHNlbmRUb0Zhc3RyYWNrKSB7Ci0gICAgICAgIG1Db250YWN0VXJpID0gdXJpOwotICAgICAgICBpZiAoc2VuZFRvRmFzdHJhY2spIHsKLSAgICAgICAgICAgIG1QaG90b1ZpZXcuYXNzaWduQ29udGFjdFVyaSh1cmkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFudWFsbHkgc2V0IHRoZSBwaG90byB0byBkaXNwbGF5IGluIHRoZSBoZWFkZXIuIFRoaXMgZG9lc24ndCBjaGFuZ2UgdGhlCi0gICAgICogdW5kZXJseWluZyB7QGxpbmsgQ29udGFjdHN9LCBvbmx5IHRoZSBVSSBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQaG90byhCaXRtYXAgYml0bWFwKSB7Ci0gICAgICAgIG1QaG90b1ZpZXcuc2V0SW1hZ2VCaXRtYXAoYml0bWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIGRpc3BsYXkgbmFtZSBhbmQgcGhvbmV0aWMgbmFtZSB0byBzaG93IGluIHRoZSBoZWFkZXIuCi0gICAgICogVGhpcyBkb2Vzbid0IGNoYW5nZSB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ29udGFjdHN9LCBvbmx5IHRoZSBVSSBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShDaGFyU2VxdWVuY2UgZGlzcGxheU5hbWUsIENoYXJTZXF1ZW5jZSBwaG9uZXRpY05hbWUpIHsKLSAgICAgICAgbURpc3BsYXlOYW1lVmlldy5zZXRUZXh0KGRpc3BsYXlOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY05hbWUpKSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNOYW1lVmlldy5zZXRUZXh0KHBob25ldGljTmFtZSk7Ci0gICAgICAgICAgICBtUGhvbmV0aWNOYW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNOYW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIHNvY2lhbCBzbmlwcGV0IHRleHQgdG8gZGlzcGxheSBpbiB0aGUgaGVhZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNvY2lhbFNuaXBwZXQoQ2hhclNlcXVlbmNlIHNuaXBwZXQpIHsKLSAgICAgICAgaWYgKHNuaXBwZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN0YXR1c0F0dHJpYnV0aW9uVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRUZXh0KHNuaXBwZXQpOwotICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGEgbGlzdCBvZiBzcGVjaWZpYyBNSU1FLXR5cGVzIHRvIGV4Y2x1ZGUgYW5kIG5vdCBkaXNwbGF5LiBGb3IKLSAgICAgKiBleGFtcGxlLCB0aGlzIGNhbiBiZSB1c2VkIHRvIGhpZGUgdGhlIHtAbGluayBDb250YWN0cyNDT05URU5UX0lURU1fVFlQRX0KLSAgICAgKiBwcm9maWxlIGljb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZU1pbWVzKFN0cmluZ1tdIGV4Y2x1ZGVNaW1lcykgewotICAgICAgICBtRXhjbHVkZU1pbWVzID0gZXhjbHVkZU1pbWVzOwotICAgICAgICBtUGhvdG9WaWV3LnNldEV4Y2x1ZGVNaW1lcyhleGNsdWRlTWltZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgYmluZGluZyBhbGwgYXZhaWxhYmxlIGRhdGEgZnJvbSBhbiBleGlzdGluZwotICAgICAqIGNvbnRhY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGFjdExvb2t1cFVyaSBhIHtDb250YWN0cy5DT05URU5UX0xPT0tVUF9VUkl9IHN0eWxlIFVSSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiaW5kRnJvbUNvbnRhY3RMb29rdXBVcmkoVXJpIGNvbnRhY3RMb29rdXBVcmkpIHsKLSAgICAgICAgYmluZEZyb21Db250YWN0VXJpSW50ZXJuYWwoY29udGFjdExvb2t1cFVyaSwgdHJ1ZSAvKiByZXNldCBxdWVyeSBoYW5kbGVyICovKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGJpbmRpbmcgYWxsIGF2YWlsYWJsZSBkYXRhIGZyb20gYW4gZXhpc3RpbmcKLSAgICAgKiBjb250YWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRhY3RVcmkgYSB7Q29udGFjdHMuQ09OVEVOVF9VUkl9IHN0eWxlIFVSSS4KLSAgICAgKiBAcGFyYW0gcmVzZXRRdWVyeUhhbmRsZXIgd2hldGhlciB0byB1c2UgYSBuZXcgQXN5bmNRdWVyeUhhbmRsZXIgb3Igbm90LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBiaW5kRnJvbUNvbnRhY3RVcmlJbnRlcm5hbChVcmkgY29udGFjdFVyaSwgYm9vbGVhbiByZXNldFF1ZXJ5SGFuZGxlcikgewotICAgICAgICBtQ29udGFjdFVyaSA9IGNvbnRhY3RVcmk7Ci0gICAgICAgIHN0YXJ0Q29udGFjdFF1ZXJ5KGNvbnRhY3RVcmksIHJlc2V0UXVlcnlIYW5kbGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGJpbmRpbmcgYWxsIGF2YWlsYWJsZSBkYXRhIGZyb20gYW4gZXhpc3RpbmcKLSAgICAgKiBjb250YWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGVtYWlsQWRkcmVzcyBUaGUgZW1haWwgYWRkcmVzcyB1c2VkIHRvIGRvIGEgcmV2ZXJzZSBsb29rdXAgaW4KLSAgICAgKiB0aGUgY29udGFjdHMgZGF0YWJhc2UuIElmIG1vcmUgdGhhbiBvbmUgY29udGFjdCBjb250YWlucyB0aGlzIGVtYWlsCi0gICAgICogYWRkcmVzcywgb25lIG9mIHRoZW0gd2lsbCBiZSBjaG9zZW4gdG8gYmluZCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiaW5kRnJvbUVtYWlsKFN0cmluZyBlbWFpbEFkZHJlc3MpIHsKLSAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotCi0gICAgICAgIG1RdWVyeUhhbmRsZXIuc3RhcnRRdWVyeShUT0tFTl9FTUFJTF9MT09LVVAsIGVtYWlsQWRkcmVzcywKLSAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChFbWFpbC5DT05URU5UX0xPT0tVUF9VUkksIFVyaS5lbmNvZGUoZW1haWxBZGRyZXNzKSksCi0gICAgICAgICAgICAgICAgRU1BSUxfTE9PS1VQX1BST0pFQ1RJT04sIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgYmluZGluZyBhbGwgYXZhaWxhYmxlIGRhdGEgZnJvbSBhbiBleGlzdGluZwotICAgICAqIGNvbnRhY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbnVtYmVyIFRoZSBwaG9uZSBudW1iZXIgdXNlZCB0byBkbyBhIHJldmVyc2UgbG9va3VwIGluCi0gICAgICogdGhlIGNvbnRhY3RzIGRhdGFiYXNlLiBJZiBtb3JlIHRoYW4gb25lIGNvbnRhY3QgY29udGFpbnMgdGhpcyBwaG9uZQotICAgICAqIG51bWJlciwgb25lIG9mIHRoZW0gd2lsbCBiZSBjaG9zZW4gdG8gYmluZCB0by4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiaW5kRnJvbVBob25lTnVtYmVyKFN0cmluZyBudW1iZXIpIHsKLSAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotCi0gICAgICAgIG1RdWVyeUhhbmRsZXIuc3RhcnRRdWVyeShUT0tFTl9QSE9ORV9MT09LVVAsIG51bWJlciwKLSAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChQaG9uZUxvb2t1cC5DT05URU5UX0ZJTFRFUl9VUkksIFVyaS5lbmNvZGUobnVtYmVyKSksCi0gICAgICAgICAgICAgICAgUEhPTkVfTE9PS1VQX1BST0pFQ1RJT04sIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHN0YXJ0Q29udGFjdFF1ZXJ5Ci0gICAgICoKLSAgICAgKiBpbnRlcm5hbCBtZXRob2QgdG8gcXVlcnkgY29udGFjdCBieSBVcmkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGFjdFVyaSB0aGUgY29udGFjdCB1cmkKLSAgICAgKiBAcGFyYW0gcmVzZXRRdWVyeUhhbmRsZXIgd2hldGhlciB0byB1c2UgYSBuZXcgQXN5bmNRdWVyeUhhbmRsZXIgb3Igbm90Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0Q29udGFjdFF1ZXJ5KFVyaSBjb250YWN0VXJpLCBib29sZWFuIHJlc2V0UXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgIGlmIChyZXNldFF1ZXJ5SGFuZGxlcikgewotICAgICAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVF1ZXJ5SGFuZGxlci5zdGFydFF1ZXJ5KFRPS0VOX0NPTlRBQ1RfSU5GTywgY29udGFjdFVyaSwgY29udGFjdFVyaSwgQ29udGFjdFF1ZXJ5LkNPTFVNTlMsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc3RhcnRQaG90b1F1ZXJ5Ci0gICAgICoKLSAgICAgKiBpbnRlcm5hbCBtZXRob2QgdG8gcXVlcnkgY29udGFjdCBwaG90byBieSBwaG90byBpZCBhbmQgdXJpLgotICAgICAqCi0gICAgICogQHBhcmFtIHBob3RvSWQgdGhlIHBob3RvIGlkLgotICAgICAqIEBwYXJhbSBsb29rdXBLZXkgdGhlIGxvb2t1cCB1cmkuCi0gICAgICogQHBhcmFtIHJlc2V0UXVlcnlIYW5kbGVyIHdoZXRoZXIgdG8gdXNlIGEgbmV3IEFzeW5jUXVlcnlIYW5kbGVyIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydFBob3RvUXVlcnkobG9uZyBwaG90b0lkLCBVcmkgbG9va3VwS2V5LCBib29sZWFuIHJlc2V0UXVlcnlIYW5kbGVyKSB7Ci0gICAgICAgIGlmIChyZXNldFF1ZXJ5SGFuZGxlcikgewotICAgICAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVF1ZXJ5SGFuZGxlci5zdGFydFF1ZXJ5KFRPS0VOX1BIT1RPX1FVRVJZLCBsb29rdXBLZXksCi0gICAgICAgICAgICAgICAgQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoRGF0YS5DT05URU5UX1VSSSwgcGhvdG9JZCksIFBob3RvUXVlcnkuQ09MVU1OUywKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdG8gZm9yY2UgdGhpcyB3aWRnZXQgdG8gZm9yZ2V0IGV2ZXJ5dGhpbmcgaXQga25vd3MgYWJvdXQgdGhlIGNvbnRhY3QuCi0gICAgICogV2UgbmVlZCB0byBzdG9wIGFueSBleGlzdGluZyBhc3luYyBxdWVyaWVzIGZvciBwaG9uZSwgZW1haWwsIGNvbnRhY3QsIGFuZCBwaG90b3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2lwZUNsZWFuKCkgewotICAgICAgICByZXNldEFzeW5jUXVlcnlIYW5kbGVyKCk7Ci0KLSAgICAgICAgc2V0RGlzcGxheU5hbWUobnVsbCwgbnVsbCk7Ci0gICAgICAgIHNldFBob3RvKGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpKTsKLSAgICAgICAgc2V0U29jaWFsU25pcHBldChudWxsKTsKLSAgICAgICAgc2V0UHJlc2VuY2UoMCk7Ci0gICAgICAgIG1Db250YWN0VXJpID0gbnVsbDsKLSAgICAgICAgbUV4Y2x1ZGVNaW1lcyA9IG51bGw7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpIHsKLSAgICAgICAgLy8gdGhlIGFwaSBBc3luY1F1ZXJ5SGFuZGxlci5jYW5jZWxPcGVyYXRpb24oKSBkb2Vzbid0IHJlYWxseSB3b3JrLiBTaW5jZSB3ZSByZWFsbHkKLSAgICAgICAgLy8gbmVlZCB0aGUgb2xkIGFzeW5jIHF1ZXJpZXMgdG8gYmUgY2FuY2VsbGVkLCBsZXQncyBkbyBpdCB0aGUgaGFyZCB3YXkuCi0gICAgICAgIG1RdWVyeUhhbmRsZXIgPSBuZXcgUXVlcnlIYW5kbGVyKG1Db250ZW50UmVzb2x2ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJpbmQgdGhlIGNvbnRhY3QgZGV0YWlscyBwcm92aWRlZCBieSB0aGUgZ2l2ZW4ge0BsaW5rIEN1cnNvcn0uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYmluZENvbnRhY3RJbmZvKEN1cnNvciBjKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkaXNwbGF5TmFtZSA9IGMuZ2V0U3RyaW5nKENvbnRhY3RRdWVyeS5ESVNQTEFZX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNOYW1lID0gYy5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LlBIT05FVElDX05BTUUpOwotICAgICAgICB0aGlzLnNldERpc3BsYXlOYW1lKGRpc3BsYXlOYW1lLCBwaG9uZXRpY05hbWUpOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gc3RhcnJlZCA9IGMuZ2V0SW50KENvbnRhY3RRdWVyeS5TVEFSUkVEKSAhPSAwOwotICAgICAgICBtU3RhcnJlZFZpZXcuc2V0Q2hlY2tlZChzdGFycmVkKTsKLQotICAgICAgICAvL1NldCB0aGUgcHJlc2VuY2Ugc3RhdHVzCi0gICAgICAgIGlmICghYy5pc051bGwoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfUFJFU0VOQ0VfU1RBVFVTKSkgewotICAgICAgICAgICAgaW50IHByZXNlbmNlID0gYy5nZXRJbnQoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfUFJFU0VOQ0VfU1RBVFVTKTsKLSAgICAgICAgICAgIG1QcmVzZW5jZVZpZXcuc2V0SW1hZ2VSZXNvdXJjZShTdGF0dXNVcGRhdGVzLmdldFByZXNlbmNlSWNvblJlc291cmNlSWQocHJlc2VuY2UpKTsKLSAgICAgICAgICAgIG1QcmVzZW5jZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVByZXNlbmNlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL1NldCB0aGUgc3RhdHVzIHVwZGF0ZQotICAgICAgICBTdHJpbmcgc3RhdHVzID0gYy5nZXRTdHJpbmcoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfU1RBVFVTKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShzdGF0dXMpKSB7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRUZXh0KHN0YXR1cyk7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aW1lc3RhbXAgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoIWMuaXNOdWxsKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19USU1FU1RBTVApKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBkYXRlID0gYy5nZXRMb25nKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19USU1FU1RBTVApOwotCi0gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBkYXRlL3RpbWUgZmllbGQgYnkgbWl4aW5nIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZQotICAgICAgICAgICAgICAgIC8vIHRpbWVzLgotICAgICAgICAgICAgICAgIGludCBmbGFncyA9IERhdGVVdGlscy5GT1JNQVRfQUJCUkVWX1JFTEFUSVZFOwotCi0gICAgICAgICAgICAgICAgdGltZXN0YW1wID0gRGF0ZVV0aWxzLmdldFJlbGF0aXZlVGltZVNwYW5TdHJpbmcoZGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLCBEYXRlVXRpbHMuTUlOVVRFX0lOX01JTExJUywgZmxhZ3MpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoIWMuaXNOdWxsKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19MQUJFTCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzUGFja2FnZSA9IGMuZ2V0U3RyaW5nKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVU19SRVNfUEFDS0FHRSk7Ci0gICAgICAgICAgICAgICAgaW50IGxhYmVsUmVzb3VyY2UgPSBjLmdldEludChDb250YWN0UXVlcnkuQ09OVEFDVF9TVEFUVVNfTEFCRUwpOwotICAgICAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXM7Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJlc1BhY2thZ2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IGdldFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgPSBwbS5nZXRSZXNvdXJjZXNGb3JBcHBsaWNhdGlvbihyZXNQYWNrYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRhY3Qgc3RhdHVzIHVwZGF0ZSByZXNvdXJjZSBwYWNrYWdlIG5vdCBmb3VuZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlc1BhY2thZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSByZXNvdXJjZXMuZ2V0U3RyaW5nKGxhYmVsUmVzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250YWN0IHN0YXR1cyB1cGRhdGUgcmVzb3VyY2Ugbm90IGZvdW5kOiAiICsgcmVzUGFja2FnZSArICJAIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxhYmVsUmVzb3VyY2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgYXR0cmlidXRpb247Ci0gICAgICAgICAgICBpZiAodGltZXN0YW1wICE9IG51bGwgJiYgbGFiZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIGxhYmVsKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZXN0YW1wID09IG51bGwgJiYgbGFiZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZXN0YW1wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbiA9IHRpbWVzdGFtcDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRpb24gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF0dHJpYnV0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzQXR0cmlidXRpb25WaWV3LnNldFRleHQoYXR0cmlidXRpb24pOwotICAgICAgICAgICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzQXR0cmlidXRpb25WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHZpZXcpIHsKLSAgICAgICAgc3dpdGNoICh2aWV3LmdldElkKCkpIHsKLSAgICAgICAgICAgIGNhc2UgUi5pZC5zdGFyOiB7Ci0gICAgICAgICAgICAgICAgLy8gVG9nZ2xlICJzdGFycmVkIiBzdGF0ZQotICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIGNvbnRhY3QKLSAgICAgICAgICAgICAgICBpZiAobUNvbnRhY3RVcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKDEpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KENvbnRhY3RzLlNUQVJSRUQsIG1TdGFycmVkVmlldy5pc0NoZWNrZWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIudXBkYXRlKG1Db250YWN0VXJpLCB2YWx1ZXMsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUi5pZC5waG90bzogewotICAgICAgICAgICAgICAgIHBlcmZvcm1QaG90b0NsaWNrKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFIuaWQubmFtZTogewotICAgICAgICAgICAgICAgIHBlcmZvcm1EaXNwbGF5TmFtZUNsaWNrKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEJpdG1hcCBsb2FkUGxhY2Vob2xkZXJQaG90byhCaXRtYXBGYWN0b3J5Lk9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICBpZiAobU5vUGhvdG9SZXNvdXJjZSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShtQ29udGV4dC5nZXRSZXNvdXJjZXMoKSwKLSAgICAgICAgICAgICAgICBtTm9QaG90b1Jlc291cmNlLCBvcHRpb25zKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RpZ2l0YWxDbG9jay5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9EaWdpdGFsQ2xvY2suamF2YQppbmRleCBmYTQ3ZmY2Li4yM2UyMjc3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RpZ2l0YWxDbG9jay5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRGlnaXRhbENsb2NrLmphdmEKQEAgLTMwLDcgKzMwLDcgQEAKIGltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVGb3JtYXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKIGltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdFN5bWJvbHM7CkBAIC0zOSw3ICszOSw3IEBACiAvKioKICAqIERpc3BsYXlzIHRoZSB0aW1lCiAgKi8KLXB1YmxpYyBjbGFzcyBEaWdpdGFsQ2xvY2sgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgeworcHVibGljIGNsYXNzIERpZ2l0YWxDbG9jayBleHRlbmRzIFJlbGF0aXZlTGF5b3V0IHsKIAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBNMTIgPSAiaDptbSI7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE0yNCA9ICJrazptbSI7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RyYXdhYmxlSG9sZGVyLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RyYXdhYmxlSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzODYwYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRHJhd2FibGVIb2xkZXIuamF2YQpAQCAtMCwwICsxLDIzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlZhbHVlQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5EZWNlbGVyYXRlSW50ZXJwb2xhdG9yOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBjb250YWluZXIgZm9yIGEgRHJhd2FibGUgd2l0aCBtdWx0aXBsZSBhbmltYXRlZCBwcm9wZXJ0aWVzLgorICoKKyAqLworcHVibGljIGNsYXNzIERyYXdhYmxlSG9sZGVyIGltcGxlbWVudHMgQW5pbWF0b3JMaXN0ZW5lciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBEZWNlbGVyYXRlSW50ZXJwb2xhdG9yIEVBU0VfT1VUX0lOVEVSUE9MQVRPUiA9IG5ldyBEZWNlbGVyYXRlSW50ZXJwb2xhdG9yKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEcmF3YWJsZUhvbGRlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKyAgICBwcml2YXRlIGZsb2F0IG1YID0gMC4wZjsKKyAgICBwcml2YXRlIGZsb2F0IG1ZID0gMC4wZjsKKyAgICBwcml2YXRlIGZsb2F0IG1TY2FsZVggPSAxLjBmOworICAgIHByaXZhdGUgZmxvYXQgbVNjYWxlWSA9IDEuMGY7CisgICAgcHJpdmF0ZSBCaXRtYXBEcmF3YWJsZSBtRHJhd2FibGU7CisgICAgcHJpdmF0ZSBmbG9hdCBtQWxwaGEgPSAxZjsKKyAgICBwcml2YXRlIEFycmF5TGlzdDxPYmplY3RBbmltYXRvcjxGbG9hdD4+IG1BbmltYXRvcnMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdEFuaW1hdG9yPEZsb2F0Pj4oKTsKKyAgICBwcml2YXRlIEFycmF5TGlzdDxPYmplY3RBbmltYXRvcjxGbG9hdD4+IG1OZWVkVG9TdGFydCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0QW5pbWF0b3I8RmxvYXQ+PigpOworCisgICAgcHVibGljIERyYXdhYmxlSG9sZGVyKEJpdG1hcERyYXdhYmxlIGRyYXdhYmxlKSB7CisgICAgICAgIHRoaXMoZHJhd2FibGUsIDAuMGYsIDAuMGYpOworICAgIH0KKworICAgIHB1YmxpYyBEcmF3YWJsZUhvbGRlcihCaXRtYXBEcmF3YWJsZSBkcmF3YWJsZSwgZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBtRHJhd2FibGUgPSBkcmF3YWJsZTsKKyAgICAgICAgbVggPSB4OworICAgICAgICBtWSA9IHk7CisgICAgICAgIG1EcmF3YWJsZS5nZXRQYWludCgpLnNldEFudGlBbGlhcyh0cnVlKTsgLy8gRm9yY2UgQUEKKyAgICAgICAgbURyYXdhYmxlLnNldEJvdW5kcygwLCAwLCBtRHJhd2FibGUuZ2V0SW50cmluc2ljV2lkdGgoKSwgbURyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEFkZHMgYW4gYW5pbWF0aW9uIHRoYXQgaW50ZXJwb2xhdGVzIGdpdmVuIHByb3BlcnR5IGZyb20gaXRzIGN1cnJlbnQgdmFsdWUKKyAgICAgKiB0byB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gdGhlIGR1cmF0aW9uLCBpbiBtcy4KKyAgICAgKiBAcGFyYW0gZGVsYXkgdGhlIGRlbGF5IHRvIHN0YXJ0IHRoZSBhbmltYXRpb24sIGluIG1zLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkgdG8gYW5pbWF0ZQorICAgICAqIEBwYXJhbSB0b1ZhbHVlIHRoZSB0YXJnZXQgdmFsdWUKKyAgICAgKiBAcGFyYW0gcmVwbGFjZSBpZiB0cnVlLCByZXBsYWNlIHRoZSBjdXJyZW50IGFuaW1hdGlvbiB3aXRoIHRoaXMgb25lLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3RBbmltYXRvcjxGbG9hdD4gYWRkQW5pbVRvKGxvbmcgZHVyYXRpb24sIGxvbmcgZGVsYXksCisgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHksIGZsb2F0IHRvVmFsdWUsIGJvb2xlYW4gcmVwbGFjZSkgeworCisgICAgICAgIGlmIChyZXBsYWNlKSByZW1vdmVBbmltYXRpb25Gb3IocHJvcGVydHkpOworCisgICAgICAgIE9iamVjdEFuaW1hdG9yPEZsb2F0PiBhbmltID0gbmV3IE9iamVjdEFuaW1hdG9yPEZsb2F0PihkdXJhdGlvbiwgdGhpcywgcHJvcGVydHksIHRvVmFsdWUpOworICAgICAgICBhbmltLnNldFN0YXJ0RGVsYXkoZGVsYXkpOworICAgICAgICBhbmltLnNldEludGVycG9sYXRvcihFQVNFX09VVF9JTlRFUlBPTEFUT1IpOworICAgICAgICB0aGlzLmFkZEFuaW1hdGlvbihhbmltLCByZXBsYWNlKTsKKyAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiYW5pbWF0aW9uQ291bnQgPSAiICsgbUFuaW1hdG9ycy5zaXplKCkpOworICAgICAgICByZXR1cm4gYW5pbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyBhbGwgYW5pbWF0aW9ucyBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IGFuZCByZW1vdmVzIGl0IGZyb20gdGhlIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBbmltYXRpb25Gb3IoU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIEFycmF5TGlzdDxPYmplY3RBbmltYXRvcjxGbG9hdD4+IHJlbW92YWxMaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3RBbmltYXRvcjxGbG9hdD4+KCk7CisgICAgICAgIGZvciAoT2JqZWN0QW5pbWF0b3I8RmxvYXQ+IGN1cnJlbnRBbmltIDogbUFuaW1hdG9ycykgeworICAgICAgICAgICAgaWYgKHByb3BlcnR5LmVxdWFscyhjdXJyZW50QW5pbS5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50QW5pbS5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICByZW1vdmFsTGlzdC5hZGQoY3VycmVudEFuaW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIlJlbW92ZSBsaXN0IHNpemU6ICIgKyByZW1vdmFsTGlzdC5zaXplKCkpOworICAgICAgICBtQW5pbWF0b3JzLnJlbW92ZUFsbChyZW1vdmFsTGlzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcHMgYWxsIGFuaW1hdGlvbnMgYW5kIHJlbW92ZXMgdGhlbSBmcm9tIHRoZSBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyQW5pbWF0aW9ucygpIHsKKyAgICAgICAgZm9yIChPYmplY3RBbmltYXRvcjxGbG9hdD4gY3VycmVudEFuaW0gOiBtQW5pbWF0b3JzKSB7CisgICAgICAgICAgICBjdXJyZW50QW5pbS5jYW5jZWwoKTsKKyAgICAgICAgfQorICAgICAgICBtQW5pbWF0b3JzLmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgZ2l2ZW4gYW5pbWF0aW9uIHRvIHRoZSBsaXN0IG9mIGFuaW1hdGlvbnMgZm9yIHRoaXMgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGFuaW0KKyAgICAgKiBAcGFyYW0gb3ZlcndyaXRlCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHByaXZhdGUgRHJhd2FibGVIb2xkZXIgYWRkQW5pbWF0aW9uKE9iamVjdEFuaW1hdG9yPEZsb2F0PiBhbmltLCBib29sZWFuIG92ZXJ3cml0ZSkgeworICAgICAgICBpZiAoYW5pbSAhPSBudWxsKQorICAgICAgICAgICAgbUFuaW1hdG9ycy5hZGQoYW5pbSk7CisgICAgICAgIG1OZWVkVG9TdGFydC5hZGQoYW5pbSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIERyYXcgdGhpcyBvYmplY3QgdG8gdGhlIGNhbnZhcyB1c2luZyB0aGUgcHJvcGVydGllcyBkZWZpbmVkIGluIHRoaXMgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FudmFzIGNhbnZhcyB0byBkcmF3IGludG8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgZmluYWwgZmxvYXQgdGhyZXNob2xkID0gMS4wZiAvIDI1Ni4wZjsgLy8gY29udHJpYnV0aW9uIGxlc3MgdGhhbiAxIExTQiBvZiBSR0IgYnl0ZQorICAgICAgICBpZiAobUFscGhhIDw9IHRocmVzaG9sZCkgLy8gZG9uJ3QgYm90aGVyIGlmIGl0IHdvbid0IHNob3cgdXAKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FudmFzLnNhdmUoQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcpOworICAgICAgICBjYW52YXMudHJhbnNsYXRlKG1YLCBtWSk7CisgICAgICAgIGNhbnZhcy5zY2FsZShtU2NhbGVYLCBtU2NhbGVZKTsKKyAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtMC41ZipnZXRXaWR0aCgpLCAtMC41ZipnZXRIZWlnaHQoKSk7CisgICAgICAgIG1EcmF3YWJsZS5zZXRBbHBoYSgoaW50KSBNYXRoLnJvdW5kKG1BbHBoYSAqIDI1NWYpKTsKKyAgICAgICAgbURyYXdhYmxlLmRyYXcoY2FudmFzKTsKKyAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydHMgYWxsIGFuaW1hdGlvbnMgYWRkZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLiAgVXNlZCB0byBzeW5jaHJvbml6ZQorICAgICAqIGFuaW1hdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgYW4gb3B0aW9uYWwgbGlzdGVuZXIgdG8gYWRkIHRvIHRoZSBhbmltYXRpb25zLiBUeXBpY2FsbHkgdXNlZCB0byBrbm93IHdoZW4KKyAgICAgKiB0byBpbnZhbGlkYXRlIHRoZSBzdXJmYWNlIHRoZXNlIGFyZSBiZWluZyBkcmF3biB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEFuaW1hdGlvbnMoVmFsdWVBbmltYXRvci5BbmltYXRvclVwZGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU5lZWRUb1N0YXJ0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBPYmplY3RBbmltYXRvcjxGbG9hdD4gYW5pbSA9IG1OZWVkVG9TdGFydC5nZXQoaSk7CisgICAgICAgICAgICBhbmltLmFkZFVwZGF0ZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIGFuaW0uYWRkTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICBhbmltLnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICAgICAgbU5lZWRUb1N0YXJ0LmNsZWFyKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgRHJhd2FibGVIb2xkZXIgc2V0WChmbG9hdCB2YWx1ZSkgeworICAgICAgICBtWCA9IHZhbHVlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRHJhd2FibGVIb2xkZXIgc2V0WShmbG9hdCB2YWx1ZSkgeworICAgICAgICBtWSA9IHZhbHVlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRHJhd2FibGVIb2xkZXIgc2V0U2NhbGVYKGZsb2F0IHZhbHVlKSB7CisgICAgICAgIG1TY2FsZVggPSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIERyYXdhYmxlSG9sZGVyIHNldFNjYWxlWShmbG9hdCB2YWx1ZSkgeworICAgICAgICBtU2NhbGVZID0gdmFsdWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBEcmF3YWJsZUhvbGRlciBzZXRBbHBoYShmbG9hdCBhbHBoYSkgeworICAgICAgICBtQWxwaGEgPSBhbHBoYTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldFgoKSB7CisgICAgICAgIHJldHVybiBtWDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0WSgpIHsKKyAgICAgICAgcmV0dXJuIG1ZOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRTY2FsZVgoKSB7CisgICAgICAgIHJldHVybiBtU2NhbGVYOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRTY2FsZVkoKSB7CisgICAgICAgIHJldHVybiBtU2NhbGVZOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRBbHBoYSgpIHsKKyAgICAgICAgcmV0dXJuIG1BbHBoYTsKKyAgICB9CisKKyAgICBwdWJsaWMgQml0bWFwRHJhd2FibGUgZ2V0RHJhd2FibGUoKSB7CisgICAgICAgIHJldHVybiBtRHJhd2FibGU7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRXaWR0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1EcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkgeworICAgICAgICByZXR1cm4gbURyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uQ2FuY2VsKEFuaW1hdG9yIGFuaW1hdGlvbikgeworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgIG1BbmltYXRvcnMucmVtb3ZlKGFuaW1hdGlvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdG9yIGFuaW1hdGlvbikgeworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9FZGl0U3R5bGVkVGV4dC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9FZGl0U3R5bGVkVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjE5N2MwLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRWRpdFN0eWxlZFRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0OwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2cuQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TaGFwZURyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuc2hhcGVzLlJlY3RTaGFwZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LkVkaXRhYmxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5IdG1sOwotaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZDsKLWltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLkFycm93S2V5TW92ZW1lbnRNZXRob2Q7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkFic29sdXRlU2l6ZVNwYW47Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkFsaWdubWVudFNwYW47Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkNoYXJhY3RlclN0eWxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5Gb3JlZ3JvdW5kQ29sb3JTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5JbWFnZVNwYW47Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlBhcmFncmFwaFN0eWxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5RdW90ZVNwYW47Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotLyoqCi0gKiBFZGl0U3R5bGVkVGV4dCBleHRlbmRzIEVkaXRUZXh0IGZvciBtYW5hZ2luZyB0aGUgZmxvdyBhbmQgc3RhdHVzIHRvIGVkaXQKLSAqIHRoZSBzdHlsZWQgdGV4dC4gVGhpcyBtYW5hZ2VzIHRoZSBzdGF0ZXMgYW5kIGZsb3dzIG9mIGVkaXRpbmcsIHN1cHBvcnRzCi0gKiBpbnNlcnRpbmcgaW1hZ2UsIGltcG9ydC9leHBvcnQgSFRNTC4KLSAqLwotcHVibGljIGNsYXNzIEVkaXRTdHlsZWRUZXh0IGV4dGVuZHMgRWRpdFRleHQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiRWRpdFN0eWxlZFRleHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbW9kZXMgb2YgZWRpdGluZyBhY3Rpb25zLgotICAgICAqLwotICAgIC8qKiBUaGUgbW9kZSB0aGF0IG5vIGVkaXRpbmcgYWN0aW9uIGlzIGRvbmUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9OT1RISU5HID0gMDsKLSAgICAvKiogVGhlIG1vZGUgb2YgY29weS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0NPUFkgPSAxOwotICAgIC8qKiBUaGUgbW9kZSBvZiBwYXN0ZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX1BBU1RFID0gMjsKLSAgICAvKiogVGhlIG1vZGUgb2YgY2hhbmdpbmcgc2l6ZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX1NJWkUgPSAzOwotICAgIC8qKiBUaGUgbW9kZSBvZiBjaGFuZ2luZyBjb2xvci4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0NPTE9SID0gNDsKLSAgICAvKiogVGhlIG1vZGUgb2Ygc2VsZWN0aW9uLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfU0VMRUNUID0gNTsKLSAgICAvKiogVGhlIG1vZGUgb2YgY2hhbmdpbmcgYWxpZ25tZW50LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfQUxJR04gPSA2OwotICAgIC8qKiBUaGUgbW9kZSBvZiBjaGFuZ2luZyBjdXQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9DVVQgPSA3OwotCi0gICAgLyoqCi0gICAgICogVGhlIHN0YXRlIG9mIHNlbGVjdGlvbi4KLSAgICAgKi8KLSAgICAvKiogVGhlIHN0YXRlIHRoYXQgc2VsZWN0aW9uIGlzbid0IHN0YXJ0ZWQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU0VMRUNUX09GRiA9IDA7Ci0gICAgLyoqIFRoZSBzdGF0ZSB0aGF0IHNlbGVjdGlvbiBpcyBzdGFydGVkLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NFTEVDVF9PTiA9IDE7Ci0gICAgLyoqIFRoZSBzdGF0ZSB0aGF0IHNlbGVjdGlvbiBpcyBkb25lLCBidXQgbm90IGZpeGVkLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NFTEVDVEVEID0gMjsKLSAgICAvKiogVGhlIHN0YXRlIHRoYXQgc2VsZWN0aW9uIGlzIGRvbmUgYW5kIG5vdCBmaXhlZC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9TRUxFQ1RfRklYID0gMzsKLQotICAgIC8qKgotICAgICAqIFRoZSBoZWxwIG1lc3NhZ2Ugc3RyaW5ncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBISU5UX01TR19OVUxMID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBISU5UX01TR19DT1BZX0JVRl9CTEFOSyA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElOVF9NU0dfU0VMRUNUX1NUQVJUID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBISU5UX01TR19TRUxFQ1RfRU5EID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBISU5UX01TR19QVVNIX0NPTVBFVEUgPSA0OwotCi0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGhlbHAgbWVzc2FnZSBzdHJpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUiA9IDB4MDBGRkZGRkY7Ci0KLSAgICAvKioKLSAgICAgKiBFZGl0U3R5bGVkVGV4dEludGVyZmFjZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIG5vdGlmeWluZyBtZXNzYWdlcyB0bwotICAgICAqIGNhbGxpbmcgY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBFZGl0U3R5bGVkVGV4dE5vdGlmaWVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5SGludE1zZyhpbnQgbXNnSWQpOwotICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlTdGF0ZUNoYW5nZWQoaW50IG1vZGUsIGludCBzdGF0ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFZGl0U3R5bGVkVGV4dE5vdGlmaWVyIG1FU1RJbnRlcmZhY2U7Ci0KLSAgICAvKioKLSAgICAgKiBFZGl0U3R5bGVkVGV4dEVkaXRvck1hbmFnZXIgbWFuYWdlcyB0aGUgZmxvdyBhbmQgc3RhdHVzIG9mIGVhY2gKLSAgICAgKiBmdW5jdGlvbiBmb3IgZWRpdGluZyBzdHlsZWQgdGV4dC4KLSAgICAgKi8KLSAgICBwcml2YXRlIEVkaXRvck1hbmFnZXIgbU1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBTdHlsZWRUZXh0Q29udmVydGVyIG1Db252ZXJ0ZXI7Ci0gICAgcHJpdmF0ZSBTdHlsZWRUZXh0RGlhbG9nIG1EaWFsb2c7Ci0gICAgcHJpdmF0ZSBEcmF3YWJsZSBtRGVmYXVsdEJhY2tncm91bmQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUJhY2tncm91bmRDb2xvcjsKLQotICAgIC8qKgotICAgICAqIEVkaXRTdHlsZWRUZXh0IGV4dGVuZHMgRWRpdFRleHQgZm9yIG1hbmFnaW5nIGZsb3cgb2YgZWFjaCBlZGl0aW5nCi0gICAgICogYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBFZGl0U3R5bGVkVGV4dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWRpdFN0eWxlZFRleHQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVkaXRTdHlsZWRUZXh0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBOb3RpZmllci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROb3RpZmllcihFZGl0U3R5bGVkVGV4dE5vdGlmaWVyIGVzdEludGVyZmFjZSkgewotICAgICAgICBtRVNUSW50ZXJmYWNlID0gZXN0SW50ZXJmYWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBCdWlsZGVyIGZvciBBbGVydERpYWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVpbGRlcgotICAgICAqICAgICAgICAgICAgQnVpbGRlciBmb3Igb3BlbmluZyBBbGVydCBEaWFsb2cuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QnVpbGRlcihCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgbURpYWxvZy5zZXRCdWlsZGVyKGJ1aWxkZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBQYXJhbWV0ZXJzIGZvciBDb2xvckFsZXJ0RGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xvcnRpdGxlCi0gICAgICogICAgICAgICAgICBUaXRsZSBmb3IgQWxlcnQgRGlhbG9nLgotICAgICAqIEBwYXJhbSBjb2xvcm5hbWVzCi0gICAgICogICAgICAgICAgICBMaXN0IG9mIG5hbWUgb2Ygc2VsZWN0aW5nIGNvbG9yLgotICAgICAqIEBwYXJhbSBjb2xvcmludHMKLSAgICAgKiAgICAgICAgICAgIExpc3Qgb2YgaW50IG9mIGNvbG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbG9yQWxlcnRQYXJhbXMoQ2hhclNlcXVlbmNlIGNvbG9ydGl0bGUsCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2VbXSBjb2xvcm5hbWVzLCBDaGFyU2VxdWVuY2VbXSBjb2xvcmludHMpIHsKLSAgICAgICAgbURpYWxvZy5zZXRDb2xvckFsZXJ0UGFyYW1zKGNvbG9ydGl0bGUsIGNvbG9ybmFtZXMsIGNvbG9yaW50cyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IFBhcmFtZXRlcnMgZm9yIFNpemVBbGVydERpYWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2l6ZXRpdGxlCi0gICAgICogICAgICAgICAgICBUaXRsZSBmb3IgQWxlcnQgRGlhbG9nLgotICAgICAqIEBwYXJhbSBzaXplbmFtZXMKLSAgICAgKiAgICAgICAgICAgIExpc3Qgb2YgbmFtZSBvZiBzZWxlY3Rpbmcgc2l6ZS4KLSAgICAgKiBAcGFyYW0gc2l6ZWRpc3BsYXlpbnRzCi0gICAgICogICAgICAgICAgICBMaXN0IG9mIGludCBvZiBzaXplIGRpc3BsYXllZCBpbiBUZXh0Vmlldy4KLSAgICAgKiBAcGFyYW0gc2l6ZXNlbmRpbnRzCi0gICAgICogICAgICAgICAgICBMaXN0IG9mIGludCBvZiBzaXplIGV4cG9ydGVkIHRvIEhUTUwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2l6ZUFsZXJ0UGFyYW1zKENoYXJTZXF1ZW5jZSBzaXpldGl0bGUsCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2VbXSBzaXplbmFtZXMsIENoYXJTZXF1ZW5jZVtdIHNpemVkaXNwbGF5aW50cywKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIHNpemVzZW5kaW50cykgewotICAgICAgICBtRGlhbG9nLnNldFNpemVBbGVydFBhcmFtcyhzaXpldGl0bGUsIHNpemVuYW1lcywgc2l6ZWRpc3BsYXlpbnRzLAotICAgICAgICAgICAgICAgIHNpemVzZW5kaW50cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWxpZ25BbGVydFBhcmFtcyhDaGFyU2VxdWVuY2UgYWxpZ250aXRsZSwKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIGFsaWdubmFtZXMpIHsKLSAgICAgICAgbURpYWxvZy5zZXRBbGlnbkFsZXJ0UGFyYW1zKGFsaWdudGl0bGUsIGFsaWdubmFtZXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBpZiAobU1hbmFnZXIuaXNTb2Z0S2V5QmxvY2tlZCgpICYmCi0gICAgICAgICAgICAgICAgZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7Ci0gICAgICAgICAgICBjYW5jZWxMb25nUHJlc3MoKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBib29sZWFuIHN1cGVyUmVzdWx0ID0gc3VwZXIub25Ub3VjaEV2ZW50KGV2ZW50KTsKLSAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25Ub3VjaEV2ZW50Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTWFuYWdlci5vbkN1cnNvck1vdmVkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyUmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0IGVkaXRpbmcuIFRoaXMgZnVuY3Rpb24gaGF2ZSB0byBiZSBjYWxsZWQgYmVmb3JlIG90aGVyIGVkaXRpbmcKLSAgICAgKiBhY3Rpb25zLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRFZGl0KCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0RWRpdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuZCBlZGl0aW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uRW5kRWRpdCgpIHsKLSAgICAgICAgbU1hbmFnZXIub25FbmRFZGl0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgIkNvcHkiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0Q29weSgpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydENvcHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCAiQ3V0IiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydEN1dCgpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydEN1dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0ICJQYXN0ZSIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRQYXN0ZSgpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydFBhc3RlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgY2hhbmdpbmcgIlNpemUiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0U2l6ZSgpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydFNpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBjaGFuZ2luZyAiQ29sb3IiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0Q29sb3IoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRDb2xvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0IGNoYW5naW5nICJCYWNrZ3JvdW5kQ29sb3IiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0QmFja2dyb3VuZENvbG9yKCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0QmFja2dyb3VuZENvbG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgY2hhbmdpbmcgIkFsaWdubWVudCIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRBbGlnbigpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydEFsaWduKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgIlNlbGVjdCIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRTZWxlY3QoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRTZWxlY3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCAiU2VsZWN0QWxsIiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydFNlbGVjdEFsbCgpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydFNlbGVjdEFsbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpeCBTZWxlY3RlZCBJdGVtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uRml4U2VsZWN0ZWRJdGVtKCkgewotICAgICAgICBtTWFuYWdlci5vbkZpeFNlbGVjdGVkSXRlbSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydEltYWdlIHRvIFRleHRWaWV3IGJ5IHVzaW5nIFVSSQotICAgICAqIAotICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKiAgICAgICAgICAgIFVSSSBvZiB0aGUgaWFtZ2UgaW5zZXJ0ZWQgdG8gVGV4dFZpZXcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25JbnNlcnRJbWFnZShVcmkgdXJpKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uSW5zZXJ0SW1hZ2UodXJpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRJbWFnZSB0byBUZXh0VmlldyBieSB1c2luZyByZXNvdXJjZSBJRAotICAgICAqIAotICAgICAqIEBwYXJhbSByZXNJZAotICAgICAqICAgICAgICAgICAgUmVzb3VyY2UgSUQgb2YgdGhlIGlhbWdlIGluc2VydGVkIHRvIFRleHRWaWV3LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uSW5zZXJ0SW1hZ2UoaW50IHJlc0lkKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uSW5zZXJ0SW1hZ2UocmVzSWQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uSW5zZXJ0SG9yaXpvbnRhbExpbmUoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uSW5zZXJ0SG9yaXpvbnRhbExpbmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkNsZWFyU3R5bGVzKCkgewotICAgICAgICBtTWFuYWdlci5vbkNsZWFyU3R5bGVzKCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFNldCBTaXplIG9mIHRoZSBJdGVtLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzaXplCi0gICAgICogICAgICAgICAgICBUaGUgc2l6ZSBvZiB0aGUgSXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJdGVtU2l6ZShpbnQgc2l6ZSkgewotICAgICAgICBtTWFuYWdlci5zZXRJdGVtU2l6ZShzaXplKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgQ29sb3Igb2YgdGhlIEl0ZW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yCi0gICAgICogICAgICAgICAgICBUaGUgY29sb3Igb2YgdGhlIEl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SXRlbUNvbG9yKGludCBjb2xvcikgewotICAgICAgICBtTWFuYWdlci5zZXRJdGVtQ29sb3IoY29sb3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBBbGlnbm1lbnQgb2YgdGhlIEl0ZW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yCi0gICAgICogICAgICAgICAgICBUaGUgY29sb3Igb2YgdGhlIEl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWxpZ25tZW50KExheW91dC5BbGlnbm1lbnQgYWxpZ24pIHsKLSAgICAgICAgbU1hbmFnZXIuc2V0QWxpZ25tZW50KGFsaWduKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgQmFja2dyb3VuZCBjb2xvciBvZiBWaWV3LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xvcgotICAgICAqICAgICAgICAgICAgVGhlIGJhY2tncm91bmQgY29sb3Igb2Ygdmlldy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoaW50IGNvbG9yKSB7Ci0gICAgICAgIHN1cGVyLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7Ci0gICAgICAgIG1CYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgaHRtbCB0byBFZGl0U3R5bGVkVGV4dC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaHRtbAotICAgICAqICAgICAgICAgICAgVGhlIGh0bWwgdG8gYmUgc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEh0bWwoU3RyaW5nIGh0bWwpIHsKLSAgICAgICAgbUNvbnZlcnRlci5TZXRIdG1sKGh0bWwpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBDaGVjayB3aGV0aGVyIGVkaXRpbmcgaXMgc3RhcnRlZCBvciBub3QuCi0gICAgICogCi0gICAgICogQHJldHVybiBXaGV0aGVyIGVkaXRpbmcgaXMgc3RhcnRlZCBvciBub3QuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFZGl0dGluZygpIHsKLSAgICAgICAgcmV0dXJuIG1NYW5hZ2VyLmlzRWRpdHRpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayB3aGV0aGVyIHN0eWxlZCB0ZXh0IG9yIG5vdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFdoZXRoZXIgc3R5bGVkIHRleHQgb3Igbm90LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU3R5bGVkVGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG1NYW5hZ2VyLmlzU3R5bGVkVGV4dCgpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBDaGVjayB3aGV0aGVyIFNvZnRLZXkgaXMgQmxvY2tlZCBvciBub3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB3aGV0aGVyIFNvZnRLZXkgaXMgQmxvY2tlZCBvciBub3QuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTb2Z0S2V5QmxvY2tlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1NYW5hZ2VyLmlzU29mdEtleUJsb2NrZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG1vZGUgb2YgdGhlIGFjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBtb2RlIG9mIHRoZSBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRFZGl0TW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1NYW5hZ2VyLmdldEVkaXRNb2RlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzdGF0ZSBvZiB0aGUgc2VsZWN0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBzZWxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTZWxlY3RTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1NYW5hZ2VyLmdldFNlbGVjdFN0YXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1bmRsZSBnZXRJbnB1dEV4dHJhcyhib29sZWFuIGNyZWF0ZSkgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tZ2V0SW5wdXRFeHRyYXMiKTsKLSAgICAgICAgfQotICAgICAgICBCdW5kbGUgYnVuZGxlID0gc3VwZXIuZ2V0SW5wdXRFeHRyYXMoY3JlYXRlKTsKLSAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVuZGxlLnB1dEJvb2xlYW4oImFsbG93RW1vamkiLCB0cnVlKTsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHN0YXRlIG9mIHRoZSBzZWxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIHNlbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEh0bWwoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udmVydGVyLmdldEh0bWwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHN0YXRlIG9mIHRoZSBzZWxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaXMKLSAgICAgKiAgICAgICAgICAgIFRoZSBhcnJheSBvZiB1c2VkIHVyaXMuCi0gICAgICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIHNlbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEh0bWwoQXJyYXlMaXN0PFVyaT4gdXJpcykgewotICAgICAgICBtQ29udmVydGVyLmdldFVyaUFycmF5KHVyaXMsIGdldFRleHQoKSk7Ci0gICAgICAgIHJldHVybiBtQ29udmVydGVyLmdldEh0bWwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgQmFja2dyb3VuZCBjb2xvciBvZiBWaWV3LgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGJhY2tncm91bmQgY29sb3Igb2YgVmlldy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEJhY2tncm91bmRDb2xvcigpIHsKLSAgICAgICAgcmV0dXJuIG1CYWNrZ3JvdW5kQ29sb3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IEZvcmVncm91bmQgY29sb3Igb2YgVmlldy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIFZpZXcuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRGb3JlR3JvdW5kQ29sb3IoaW50IHBvcykgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tZ2V0Rm9yZUdyb3VuZENvbG9yOiAiICsgcG9zKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocG9zIDwgMCB8fCBwb3MgPiBnZXRUZXh0KCkubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS1nZXRGb3JlR3JvdW5kQ29sb3I6IElsbGlnYWwgcG9zaXRpb24uIik7Ci0gICAgICAgICAgICByZXR1cm4gREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRm9yZWdyb3VuZENvbG9yU3BhbltdIHNwYW5zID0KLSAgICAgICAgICAgICAgICBnZXRUZXh0KCkuZ2V0U3BhbnMocG9zLCBwb3MsIEZvcmVncm91bmRDb2xvclNwYW4uY2xhc3MpOwotICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3BhbnNbMF0uZ2V0Rm9yZWdyb3VuZENvbG9yKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIG1lbWJlcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaW5pdCIpOwotICAgICAgICB9Ci0gICAgICAgIHJlcXVlc3RGb2N1cygpOwotICAgICAgICBtRGVmYXVsdEJhY2tncm91bmQgPSBnZXRCYWNrZ3JvdW5kKCk7Ci0gICAgICAgIG1CYWNrZ3JvdW5kQ29sb3IgPSBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1I7Ci0gICAgICAgIG1NYW5hZ2VyID0gbmV3IEVkaXRvck1hbmFnZXIodGhpcyk7Ci0gICAgICAgIG1Db252ZXJ0ZXIgPSBuZXcgU3R5bGVkVGV4dENvbnZlcnRlcih0aGlzKTsKLSAgICAgICAgbURpYWxvZyA9IG5ldyBTdHlsZWRUZXh0RGlhbG9nKHRoaXMpOwotICAgICAgICBzZXRNb3ZlbWVudE1ldGhvZChuZXcgU3R5bGVkVGV4dEFycm93S2V5TWV0aG9kKG1NYW5hZ2VyKSk7Ci0gICAgICAgIG1NYW5hZ2VyLmJsb2NrU29mdEtleSgpOwotICAgICAgICBtTWFuYWdlci51bmJsb2NrU29mdEtleSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3cgRm9yZWdyb3VuZCBDb2xvciBTZWxlY3RpbmcgRGlhbG9nLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvblNob3dGb3JlZ3JvdW5kQ29sb3JBbGVydCgpIHsKLSAgICAgICAgbURpYWxvZy5vblNob3dGb3JlZ3JvdW5kQ29sb3JBbGVydERpYWxvZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3cgQmFja2dyb3VuZCBDb2xvciBTZWxlY3RpbmcgRGlhbG9nLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvblNob3dCYWNrZ3JvdW5kQ29sb3JBbGVydCgpIHsKLSAgICAgICAgbURpYWxvZy5vblNob3dCYWNrZ3JvdW5kQ29sb3JBbGVydERpYWxvZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3cgU2l6ZSBTZWxlY3RpbmcgRGlhbG9nLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvblNob3dTaXplQWxlcnQoKSB7Ci0gICAgICAgIG1EaWFsb2cub25TaG93U2l6ZUFsZXJ0RGlhbG9nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyBBbGlnbm1lbnQgU2VsZWN0aW5nIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb25TaG93QWxpZ25BbGVydCgpIHsKLSAgICAgICAgbURpYWxvZy5vblNob3dBbGlnbkFsZXJ0RGlhbG9nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZ5IGhpbnQgbWVzc2FnZXMgd2hhdCBhY3Rpb24gaXMgZXhwZWN0ZWQgdG8gY2FsbGluZyBjbGFzcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbXNnSWQKLSAgICAgKiAgICAgICAgICAgIElkIG9mIHRoZSBoaW50IG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldEhpbnRNZXNzYWdlKGludCBtc2dJZCkgewotICAgICAgICBpZiAobUVTVEludGVyZmFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRVNUSW50ZXJmYWNlLm5vdGlmeUhpbnRNc2cobXNnSWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZ5IHRoZSBldmVudCB0aGF0IHRoZSBtb2RlIGFuZCBzdGF0ZSBhcmUgY2hhbmdlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbW9kZQotICAgICAqICAgICAgICAgICAgTW9kZSBvZiB0aGUgZWRpdGluZyBhY3Rpb24uCi0gICAgICogQHBhcmFtIHN0YXRlCi0gICAgICogICAgICAgICAgICBNb2RlIG9mIHRoZSBzZWxlY3Rpb24gc3RhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVN0YXRlQ2hhbmdlZChpbnQgbW9kZSwgaW50IHN0YXRlKSB7Ci0gICAgICAgIGlmIChtRVNUSW50ZXJmYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1FU1RJbnRlcmZhY2Uubm90aWZ5U3RhdGVDaGFuZ2VkKG1vZGUsIHN0YXRlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVkaXRvck1hbmFnZXIgbWFuYWdlcyB0aGUgZmxvdyBhbmQgc3RhdHVzIG9mIGVkaXRpbmcgYWN0aW9ucy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIEVkaXRvck1hbmFnZXIgewotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUVkaXRGbGFnID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtU29mdEtleUJsb2NrRmxhZyA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIGludCBtTW9kZSA9IDA7Ci0gICAgICAgIHByaXZhdGUgaW50IG1TdGF0ZSA9IDA7Ci0gICAgICAgIHByaXZhdGUgaW50IG1DdXJTdGFydCA9IDA7Ci0gICAgICAgIHByaXZhdGUgaW50IG1DdXJFbmQgPSAwOwotICAgICAgICBwcml2YXRlIEVkaXRTdHlsZWRUZXh0IG1FU1Q7Ci0KLSAgICAgICAgRWRpdG9yTWFuYWdlcihFZGl0U3R5bGVkVGV4dCBlc3QpIHsKLSAgICAgICAgICAgIG1FU1QgPSBlc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0RWRpdCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU3RhcnRFZGl0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uc3RhcnRlZGl0OiIpOwotICAgICAgICAgICAgaGFuZGxlUmVzZXRFZGl0KCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRW5kRWRpdCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uRW5kRWRpdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlQ2FuY2VsKCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRDb3B5KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TdGFydENvcHkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZUNvcHkoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydEN1dCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU3RhcnRDdXQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZUN1dCgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0UGFzdGUoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblN0YXJ0UGFzdGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZVBhc3RlKCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRTaXplKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TdGFydFNpemUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZVNpemUoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydEFsaWduKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TdGFydEFsaWduUmlnaHQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZUFsaWduKCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRDb2xvcigpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uQ2xpY2tDb2xvciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlQ29sb3IoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydEJhY2tncm91bmRDb2xvcigpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uQ2xpY2tDb2xvciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVTVC5vblNob3dCYWNrZ3JvdW5kQ29sb3JBbGVydCgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0U2VsZWN0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja1NlbGVjdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1NFTEVDVDsKLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX09GRikgewotICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1bnNldFNlbGVjdCgpOwotICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkN1cnNvck1vdmVkKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja1ZpZXciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX09OIHx8IG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RFRCkgewotICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdCgpOwotICAgICAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFNlbGVjdEFsbCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uQ2xpY2tTZWxlY3RBbGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZVNlbGVjdEFsbCgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkZpeFNlbGVjdGVkSXRlbSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uQ2xpY2tDb21wbGV0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlQ29tcGxldGUoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25JbnNlcnRJbWFnZShVcmkgdXJpKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkluc2VydEltYWdlIGJ5IFVSSTogIiArIHVyaS5nZXRQYXRoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwiICsgdXJpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5zZXJ0SW1hZ2VTcGFuKG5ldyBJbWFnZVNwYW4obUVTVC5nZXRDb250ZXh0KCksIHVyaSkpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkluc2VydEltYWdlKGludCByZXNJRCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25JbnNlcnRJbWFnZSBieSByZXNJRCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5zZXJ0SW1hZ2VTcGFuKG5ldyBJbWFnZVNwYW4obUVTVC5nZXRDb250ZXh0KCksIHJlc0lEKSk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSW5zZXJ0SG9yaXpvbnRhbExpbmUoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkluc2VydEhvcml6b250YWxMaW5lOiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5zZXJ0SW1hZ2VTcGFuKG5ldyBIb3Jpem9udGFsTGluZVNwYW4oMHhGRjAwMDAwMCwgbUVTVCkpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsZWFyU3R5bGVzKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGVhclN0eWxlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRWRpdGFibGUgdHh0ID0gbUVTVC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBpbnQgbGVuID0gdHh0Lmxlbmd0aCgpOwotICAgICAgICAgICAgT2JqZWN0W10gc3R5bGVzID0gdHh0LmdldFNwYW5zKDAsIGxlbiwgT2JqZWN0LmNsYXNzKTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IHN0eWxlIDogc3R5bGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0eWxlIGluc3RhbmNlb2YgUGFyYWdyYXBoU3R5bGUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlIGluc3RhbmNlb2YgUXVvdGVTcGFuIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSBpbnN0YW5jZW9mIENoYXJhY3RlclN0eWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZSBpbnN0YW5jZW9mIEltYWdlU3BhbikgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gdHh0LmdldFNwYW5TdGFydChzdHlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5kID0gdHh0LmdldFNwYW5FbmQoc3R5bGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHh0LnJlcGxhY2Uoc3RhcnQsIGVuZCwgIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHR4dC5yZW1vdmVTcGFuKHN0eWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRVNULnNldEJhY2tncm91bmREcmF3YWJsZShtRVNULm1EZWZhdWx0QmFja2dyb3VuZCk7Ci0gICAgICAgICAgICBtRVNULm1CYWNrZ3JvdW5kQ29sb3IgPSBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRJdGVtU2l6ZShpbnQgc2l6ZSkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja1NpemVJdGVtIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEIHx8IG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfRklYKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlU2l6ZVNlbGVjdGVkVGV4dChzaXplKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVSZXNldEVkaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEl0ZW1Db2xvcihpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uQ2xpY2tDb2xvckl0ZW0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQgfHwgbVN0YXRlID09IFNUQVRFX1NFTEVDVF9GSVgpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VDb2xvclNlbGVjdGVkVGV4dChjb2xvcik7Ci0gICAgICAgICAgICAgICAgaGFuZGxlUmVzZXRFZGl0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBbGlnbm1lbnQoTGF5b3V0LkFsaWdubWVudCBhbGlnbikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja0NvbG9ySXRlbSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RFRCB8fCBtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX0ZJWCkgewotICAgICAgICAgICAgICAgIGNoYW5nZUFsaWduKGFsaWduKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVSZXNldEVkaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRWRpdHRpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUVkaXRGbGFnOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSWYgdGhlIHN0eWxlIG9mIHRoZSBzcGFuIGlzIGFkZGVkLCBhZGQgY2hlY2sgY2FzZSBmb3IgdGhhdCBzdHlsZSAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1N0eWxlZFRleHQoKSB7Ci0gICAgICAgICAgICBFZGl0YWJsZSB0eHQgPSBtRVNULmdldFRleHQoKTsKLSAgICAgICAgICAgIGludCBsZW4gPSB0eHQubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAodHh0LmdldFNwYW5zKDAsIGxlbiAtMSwgUGFyYWdyYXBoU3R5bGUuY2xhc3MpLmxlbmd0aCA+IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgdHh0LmdldFNwYW5zKDAsIGxlbiAtMSwgUXVvdGVTcGFuLmNsYXNzKS5sZW5ndGggPiAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIHR4dC5nZXRTcGFucygwLCBsZW4gLTEsIENoYXJhY3RlclN0eWxlLmNsYXNzKS5sZW5ndGggPiAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIG1FU1QubUJhY2tncm91bmRDb2xvciAhPSBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzU29mdEtleUJsb2NrZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNvZnRLZXlCbG9ja0ZsYWc7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldEVkaXRNb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Nb2RlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRTZWxlY3RTdGF0ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtU3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldFNlbGVjdGlvblN0YXJ0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1DdXJTdGFydDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0aW9uRW5kKCkgewotICAgICAgICAgICAgcmV0dXJuIG1DdXJFbmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZG9OZXh0SGFuZGxlKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZG9OZXh0SGFuZGxlOiAiICsgbU1vZGUgKyAiLCIgKyBtU3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChtTW9kZSkgewotICAgICAgICAgICAgY2FzZSBNT0RFX0NPUFk6Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ29weSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNT0RFX0NVVDoKLSAgICAgICAgICAgICAgICBoYW5kbGVDdXQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTU9ERV9QQVNURToKLSAgICAgICAgICAgICAgICBoYW5kbGVQYXN0ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNT0RFX1NJWkU6Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2l6ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNT0RFX0NPTE9SOgotICAgICAgICAgICAgICAgIGhhbmRsZUNvbG9yKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1PREVfQUxJR046Ci0gICAgICAgICAgICAgICAgaGFuZGxlQWxpZ24oKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ2FuY2VsKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlQ2FuY2VsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTW9kZSA9IE1PREVfTk9USElORzsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVF9PRkY7Ci0gICAgICAgICAgICBtRWRpdEZsYWcgPSBmYWxzZTsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlQ2FuY2VsOiIgKyBtRVNULmdldElucHV0VHlwZSgpKTsKLSAgICAgICAgICAgIHVuYmxvY2tTb2Z0S2V5KCk7Ci0gICAgICAgICAgICB1bnNldFNlbGVjdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNvbXBsZXRlKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlQ29tcGxldGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUVkaXRGbGFnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RFRCkgewotICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVF9GSVg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkb05leHRIYW5kbGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVUZXh0Vmlld0Z1bmMoaW50IG1vZGUsIGludCBpZCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlVGV4dFZpZXc6ICIgKyBtTW9kZSArICIsIiArIG1TdGF0ZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLCIgKyBpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGl0RmxhZykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX05PVEhJTkcgfHwgbU1vZGUgPT0gTU9ERV9TRUxFQ1QpIHsKLSAgICAgICAgICAgICAgICBtTW9kZSA9IG1vZGU7Ci0gICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TRUxFQ1RfRklYOwotICAgICAgICAgICAgICAgICAgICBoYW5kbGVUZXh0Vmlld0Z1bmMobW9kZSwgaWQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgIT0gbW9kZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUNhbmNlbCgpOwotICAgICAgICAgICAgICAgIG1Nb2RlID0gbW9kZTsKLSAgICAgICAgICAgICAgICBoYW5kbGVUZXh0Vmlld0Z1bmMobW9kZSwgaWQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX0ZJWCkgewotICAgICAgICAgICAgICAgIG1FU1Qub25UZXh0Q29udGV4dE1lbnVJdGVtKGlkKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVSZXNldEVkaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDb3B5KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlQ29weTogIiArIG1Nb2RlICsgIiwiICsgbVN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZVRleHRWaWV3RnVuYyhNT0RFX0NPUFksIGFuZHJvaWQuUi5pZC5jb3B5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDdXQoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVDb3B5OiAiICsgbU1vZGUgKyAiLCIgKyBtU3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlVGV4dFZpZXdGdW5jKE1PREVfQ1VULCBhbmRyb2lkLlIuaWQuY3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVQYXN0ZSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZVBhc3RlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGl0RmxhZykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FU1Qub25UZXh0Q29udGV4dE1lbnVJdGVtKGFuZHJvaWQuUi5pZC5wYXN0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2V0U3BhbihpbnQgbW9kZSkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlU2V0U3BhbjoiICsgbUVkaXRGbGFnICsgIiwiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1TdGF0ZSArICcsJyArIG1Nb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUVkaXRGbGFnKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBoYW5kbGVTZXRTcGFuOiBFZGl0aW5nIGlzIG5vdCBzdGFydGVkLiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX05PVEhJTkcgfHwgbU1vZGUgPT0gTU9ERV9TRUxFQ1QpIHsKLSAgICAgICAgICAgICAgICBtTW9kZSA9IG1vZGU7Ci0gICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TRUxFQ1RfRklYOwotICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZXRTcGFuKG1vZGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgIT0gbW9kZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUNhbmNlbCgpOwotICAgICAgICAgICAgICAgIG1Nb2RlID0gbW9kZTsKLSAgICAgICAgICAgICAgICBoYW5kbGVTZXRTcGFuKG1vZGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVF9GSVgpIHsKLSAgICAgICAgICAgICAgICAgICAgbUVTVC5zZXRIaW50TWVzc2FnZShISU5UX01TR19OVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTU9ERV9DT0xPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FU1Qub25TaG93Rm9yZWdyb3VuZENvbG9yQWxlcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1PREVfU0laRToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FU1Qub25TaG93U2l6ZUFsZXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNT0RFX0FMSUdOOgotICAgICAgICAgICAgICAgICAgICAgICAgbUVTVC5vblNob3dBbGlnbkFsZXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gaGFuZGxlU2V0U3BhbjogaW52YWxpZCBtb2RlLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZVNldFNwYW46IGRvIG5vdGhpbmcuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNpemUoKSB7Ci0gICAgICAgICAgICBoYW5kbGVTZXRTcGFuKE1PREVfU0laRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ29sb3IoKSB7Ci0gICAgICAgICAgICBoYW5kbGVTZXRTcGFuKE1PREVfQ09MT1IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUFsaWduKCkgewotICAgICAgICAgICAgaGFuZGxlU2V0U3BhbihNT0RFX0FMSUdOKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3QoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVTZWxlY3Q6IiArIG1FZGl0RmxhZyArICIsIiArIG1TdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGl0RmxhZykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX09GRikgewotICAgICAgICAgICAgICAgIGlmIChpc1RleHRTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJTZWxlY3Rpb24gaXMgb2ZmLCBidXQgc2VsZWN0ZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2V0U2VsZWN0U3RhcnRQb3MoKTsKLSAgICAgICAgICAgICAgICBibG9ja1NvZnRLZXkoKTsKLSAgICAgICAgICAgICAgICBtRVNULnNldEhpbnRNZXNzYWdlKEhJTlRfTVNHX1NFTEVDVF9FTkQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX09OKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzVGV4dFNlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlNlbGVjdGlvbiBub3cgc3RhcnQsIGJ1dCBzZWxlY3RlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZEVuZFBvcygpOwotICAgICAgICAgICAgICAgIG1FU1Quc2V0SGludE1lc3NhZ2UoSElOVF9NU0dfUFVTSF9DT01QRVRFKTsKLSAgICAgICAgICAgICAgICBkb05leHRIYW5kbGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc1RleHRTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJTZWxlY3Rpb24gaXMgZG9uZSwgYnV0IG5vdCBzZWxlY3RlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZEVuZFBvcygpOwotICAgICAgICAgICAgICAgIGRvTmV4dEhhbmRsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdEFsbCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZVNlbGVjdEFsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtRWRpdEZsYWcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRVNULnNlbGVjdEFsbCgpOwotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNURUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlUmVzZXRFZGl0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJSZXNldCBFZGl0b3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJsb2NrU29mdEtleSgpOwotICAgICAgICAgICAgaGFuZGxlQ2FuY2VsKCk7Ci0gICAgICAgICAgICBtRWRpdEZsYWcgPSB0cnVlOwotICAgICAgICAgICAgbUVTVC5zZXRIaW50TWVzc2FnZShISU5UX01TR19TRUxFQ1RfU1RBUlQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGlvbigpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU2VsZWN0OiIgKyBtQ3VyU3RhcnQgKyAiLCIgKyBtQ3VyRW5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQ3VyU3RhcnQgPj0gMCAmJiBtQ3VyU3RhcnQgPD0gbUVTVC5nZXRUZXh0KCkubGVuZ3RoKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgbUN1ckVuZCA+PSAwICYmIG1DdXJFbmQgPD0gbUVTVC5nZXRUZXh0KCkubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobUN1clN0YXJ0IDwgbUN1ckVuZCkgewotICAgICAgICAgICAgICAgICAgICBtRVNULnNldFNlbGVjdGlvbihtQ3VyU3RhcnQsIG1DdXJFbmQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FU1Quc2V0U2VsZWN0aW9uKG1DdXJFbmQsIG1DdXJTdGFydCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVEVEOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgIlNlbGVjdCBpcyBvbiwgYnV0IGN1cnNvciBwb3NpdGlvbnMgYXJlIGlsbGlnYWwuOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRVNULmdldFRleHQoKS5sZW5ndGgoKSArICIsIiArIG1DdXJTdGFydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIiArIG1DdXJFbmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVuc2V0U2VsZWN0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb2ZmU2VsZWN0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgY3VycnBvcyA9IG1FU1QuZ2V0U2VsZWN0aW9uU3RhcnQoKTsKLSAgICAgICAgICAgIG1FU1Quc2V0U2VsZWN0aW9uKGN1cnJwb3MsIGN1cnJwb3MpOwotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNUX09GRjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRTZWxlY3RTdGFydFBvcygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHNldFNlbGVjdFN0YXJ0UG9zIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ3VyU3RhcnQgPSBtRVNULmdldFNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TRUxFQ1RfT047Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRFbmRQb3MoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBzZXRTZWxlY3RFbmRQb3M6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUVTVC5nZXRTZWxlY3Rpb25TdGFydCgpID09IG1DdXJTdGFydCkgewotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkRW5kUG9zKG1FU1QuZ2V0U2VsZWN0aW9uRW5kKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZEVuZFBvcyhtRVNULmdldFNlbGVjdGlvblN0YXJ0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRFbmRQb3MoaW50IHBvcykgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gc2V0U2VsZWN0ZWRFbmRQb3M6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ3VyRW5kID0gcG9zOwotICAgICAgICAgICAgc2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNUZXh0U2VsZWN0ZWQoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBpc1RleHRTZWxlY3RlZDoiICsgbUN1clN0YXJ0ICsgIiwiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1DdXJFbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIChtQ3VyU3RhcnQgIT0gbUN1ckVuZCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RFRCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfRklYKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRTdHlsZWRUZXh0U3BhbihPYmplY3Qgc3BhbiwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBzZXRTdHlsZWRUZXh0U3BhbjoiICsgbU1vZGUgKyAiLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgc3RhcnQgKyAiLCIgKyBlbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0YXJ0IDwgZW5kKSB7Ci0gICAgICAgICAgICAgICAgbUVTVC5nZXRUZXh0KCkuc2V0U3BhbihzcGFuLCBzdGFydCwgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1FU1QuZ2V0VGV4dCgpLnNldFNwYW4oc3BhbiwgZW5kLCBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uYWJsZS5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNoYW5nZVNpemVTZWxlY3RlZFRleHQoaW50IHNpemUpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGNoYW5nZVNpemU6IiArIHNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0U3R5bGVkVGV4dFNwYW4obmV3IEFic29sdXRlU2l6ZVNwYW4oc2l6ZSksCi0gICAgICAgICAgICAgICAgbUN1clN0YXJ0LCBtQ3VyRW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBjaGFuZ2VDb2xvclNlbGVjdGVkVGV4dChpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGNoYW5nZUNvbG9yOiIgKyBjb2xvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRTdHlsZWRUZXh0U3BhbihuZXcgRm9yZWdyb3VuZENvbG9yU3Bhbihjb2xvciksCi0gICAgICAgICAgICAgICAgbUN1clN0YXJ0LCBtQ3VyRW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBjaGFuZ2VBbGlnbihMYXlvdXQuQWxpZ25tZW50IGFsaWduKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBjaGFuZ2VBbGlnbjoiICsgYWxpZ24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0U3R5bGVkVGV4dFNwYW4obmV3IEFsaWdubWVudFNwYW4uU3RhbmRhcmQoYWxpZ24pLAotICAgICAgICAgICAgICAgICAgICBmaW5kTGluZVN0YXJ0KG1FU1QuZ2V0VGV4dCgpLCBtQ3VyU3RhcnQpLAotICAgICAgICAgICAgICAgICAgICBmaW5kTGluZUVuZChtRVNULmdldFRleHQoKSwgbUN1ckVuZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZmluZExpbmVTdGFydChFZGl0YWJsZSB0ZXh0LCBpbnQgY3VycmVudCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZmluZExpbmVTdGFydDogY3VycjoiICsgY3VycmVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLCBsZW5ndGg6IiArIHRleHQubGVuZ3RoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHBvcyA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICBmb3IgKDsgcG9zID4gMDsgcG9zLS0pIHsKLSAgICAgICAgICAgICAgICBpZiAodGV4dC5jaGFyQXQocG9zIC0gMSkgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcG9zOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGluc2VydEltYWdlU3BhbihJbWFnZVNwYW4gc3BhbikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaW5zZXJ0SW1hZ2VTcGFuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3BhbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBpbnNlcnRpbWFnZXNwYW46IiArIHNwYW4uZ2V0RHJhd2FibGUoKS5nZXRJbnRyaW5zaWNIZWlnaHQoKSArICIsIiArIHNwYW4uZ2V0RHJhd2FibGUoKS5nZXRJbnRyaW5zaWNXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGluc2VydGltYWdlc3BhbjoiICsgc3Bhbi5nZXREcmF3YWJsZSgpLmdldENsYXNzKCkpOwotICAgICAgICAgICAgICAgIGludCBjdXJwb3MgPSBtRVNULmdldFNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgbUVTVC5nZXRUZXh0KCkuaW5zZXJ0KGN1cnBvcywgIlx1RkZGQyIpOwotICAgICAgICAgICAgICAgIG1FU1QuZ2V0VGV4dCgpLnNldFNwYW4oc3BhbiwgY3VycG9zLCBjdXJwb3MgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gaW5zZXJ0SW1hZ2VTcGFuOiBudWxsIHNwYW4gd2FzIGluc2VydGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBmaW5kTGluZUVuZChFZGl0YWJsZSB0ZXh0LCBpbnQgY3VycmVudCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZmluZExpbmVFbmQ6IGN1cnI6IiArIGN1cnJlbnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiwgbGVuZ3RoOiIgKyB0ZXh0Lmxlbmd0aCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBwb3MgPSBjdXJyZW50OwotICAgICAgICAgICAgZm9yICg7IHBvcyA8IHRleHQubGVuZ3RoKCk7IHBvcysrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvcyA+IDAgJiYgdGV4dC5jaGFyQXQocG9zIC0gMSkgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcG9zOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGJsb2NrU29mdEtleSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGJsb2NrU29mdEtleToiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSAoSW5wdXRNZXRob2RNYW5hZ2VyKSBtRVNULmdldENvbnRleHQoKS4KLSAgICAgICAgICAgIGdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5JTlBVVF9NRVRIT0RfU0VSVklDRSk7Ci0gICAgICAgICAgICBpbW0uaGlkZVNvZnRJbnB1dEZyb21XaW5kb3cobUVTVC5nZXRXaW5kb3dUb2tlbigpLCAwKTsKLSAgICAgICAgICAgIG1FU1Quc2V0T25DbGlja0xpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9udHJhY2tiYWxsY2xpY2s6Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25GaXhTZWxlY3RlZEl0ZW0oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgbVNvZnRLZXlCbG9ja0ZsYWcgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVuYmxvY2tTb2Z0S2V5KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gdW5ibG9ja1NvZnRLZXk6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRVNULnNldE9uQ2xpY2tMaXN0ZW5lcihudWxsKTsKLSAgICAgICAgICAgIG1Tb2Z0S2V5QmxvY2tGbGFnID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFN0eWxlZFRleHRDb252ZXJ0ZXIgewotICAgICAgICBwcml2YXRlIEVkaXRTdHlsZWRUZXh0IG1FU1Q7Ci0KLSAgICAgICAgcHVibGljIFN0eWxlZFRleHRDb252ZXJ0ZXIoRWRpdFN0eWxlZFRleHQgZXN0KSB7Ci0gICAgICAgICAgICBtRVNUID0gZXN0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRIdG1sKCkgewotICAgICAgICAgICAgU3RyaW5nIGh0bWxCb2R5ID0gSHRtbC50b0h0bWwobUVTVC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZ2V0Q29udmVydGVkQm9keToiICsgaHRtbEJvZHkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGh0bWxCb2R5OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZ2V0VXJpQXJyYXkoQXJyYXlMaXN0PFVyaT4gdXJpcywgRWRpdGFibGUgdGV4dCkgewotICAgICAgICAgICAgdXJpcy5jbGVhcigpOwotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZ2V0VXJpQXJyYXk6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgbGVuID0gdGV4dC5sZW5ndGgoKTsKLSAgICAgICAgICAgIGludCBuZXh0OwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aCgpOyBpID0gbmV4dCkgewotICAgICAgICAgICAgICAgIG5leHQgPSB0ZXh0Lm5leHRTcGFuVHJhbnNpdGlvbihpLCBsZW4sIEltYWdlU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgSW1hZ2VTcGFuW10gaW1hZ2VzID0gdGV4dC5nZXRTcGFucyhpLCBuZXh0LCBJbWFnZVNwYW4uY2xhc3MpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaW1hZ2VzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZ2V0VXJpQXJyYXk6IGZvdW5kQXJyYXkiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJbWFnZVNwYW4pIGltYWdlc1tqXSkuZ2V0U291cmNlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHVyaXMuYWRkKFVyaS5wYXJzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEltYWdlU3BhbikgaW1hZ2VzW2pdKS5nZXRTb3VyY2UoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldEh0bWwgKFN0cmluZyBodG1sKSB7Ci0gICAgICAgICAgICBmaW5hbCBTcGFubmVkIHNwYW5uZWQgPSBIdG1sLmZyb21IdG1sKGh0bWwsIG5ldyBIdG1sLkltYWdlR2V0dGVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBEcmF3YWJsZSBnZXREcmF3YWJsZShTdHJpbmcgc3JjKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gc2V0aHRtbDogc3JjPSIrc3JjKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNyYy5zdGFydHNXaXRoKCJjb250ZW50Oi8vIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2Uoc3JjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBtRVNULmdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5vcGVuSW5wdXRTdHJlYW0odXJpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVTdHJlYW0oaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gbmV3IEJpdG1hcERyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLCBiaXRtYXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdhYmxlLnNldEJvdW5kcygwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd2FibGUuZ2V0SW50cmluc2ljV2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkcmF3YWJsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBzZXQgaHRtbDogRmFpbGVkIHRvIGxvYWRlZCBjb250ZW50ICIgKyB1cmksIGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICIgIHVua25vd24gc3JjPSIrc3JjKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwgbnVsbCk7Ci0gICAgICAgICAgICBtRVNULnNldFRleHQoc3Bhbm5lZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFN0eWxlZFRleHREaWFsb2cgewotICAgICAgICBCdWlsZGVyIG1CdWlsZGVyOwotICAgICAgICBDaGFyU2VxdWVuY2UgbUNvbG9yVGl0bGU7Ci0gICAgICAgIENoYXJTZXF1ZW5jZSBtU2l6ZVRpdGxlOwotICAgICAgICBDaGFyU2VxdWVuY2UgbUFsaWduVGl0bGU7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1Db2xvck5hbWVzOwotICAgICAgICBDaGFyU2VxdWVuY2VbXSBtQ29sb3JJbnRzOwotICAgICAgICBDaGFyU2VxdWVuY2VbXSBtU2l6ZU5hbWVzOwotICAgICAgICBDaGFyU2VxdWVuY2VbXSBtU2l6ZURpc3BsYXlJbnRzOwotICAgICAgICBDaGFyU2VxdWVuY2VbXSBtU2l6ZVNlbmRJbnRzOwotICAgICAgICBDaGFyU2VxdWVuY2VbXSBtQWxpZ25OYW1lczsKLSAgICAgICAgRWRpdFN0eWxlZFRleHQgbUVTVDsKLQotICAgICAgICBwdWJsaWMgU3R5bGVkVGV4dERpYWxvZyhFZGl0U3R5bGVkVGV4dCBlc3QpIHsKLSAgICAgICAgICAgIG1FU1QgPSBlc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZGVyKEJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICAgICAgbUJ1aWxkZXIgPSBidWlsZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q29sb3JBbGVydFBhcmFtcyhDaGFyU2VxdWVuY2UgY29sb3J0aXRsZSwKLSAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2VbXSBjb2xvcm5hbWVzLCBDaGFyU2VxdWVuY2VbXSBjb2xvcmludHMpIHsKLSAgICAgICAgICAgIG1Db2xvclRpdGxlID0gY29sb3J0aXRsZTsKLSAgICAgICAgICAgIG1Db2xvck5hbWVzID0gY29sb3JuYW1lczsKLSAgICAgICAgICAgIG1Db2xvckludHMgPSBjb2xvcmludHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTaXplQWxlcnRQYXJhbXMoQ2hhclNlcXVlbmNlIHNpemV0aXRsZSwKLSAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2VbXSBzaXplbmFtZXMsIENoYXJTZXF1ZW5jZVtdIHNpemVkaXNwbGF5aW50cywKLSAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2VbXSBzaXplc2VuZGludHMpIHsKLSAgICAgICAgICAgIG1TaXplVGl0bGUgPSBzaXpldGl0bGU7Ci0gICAgICAgICAgICBtU2l6ZU5hbWVzID0gc2l6ZW5hbWVzOwotICAgICAgICAgICAgbVNpemVEaXNwbGF5SW50cyA9IHNpemVkaXNwbGF5aW50czsKLSAgICAgICAgICAgIG1TaXplU2VuZEludHMgPSBzaXplc2VuZGludHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBbGlnbkFsZXJ0UGFyYW1zKENoYXJTZXF1ZW5jZSBhbGlnbnRpdGxlLAotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIGFsaWdubmFtZXMpIHsKLSAgICAgICAgICAgIG1BbGlnblRpdGxlID0gYWxpZ250aXRsZTsKLSAgICAgICAgICAgIG1BbGlnbk5hbWVzID0gYWxpZ25uYW1lczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0NvbG9yQWxlcnRQYXJhbXMoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBjaGVja1BhcmFtcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1CdWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIGJ1aWxkZXIgaXMgbnVsbC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Db2xvclRpdGxlID09IG51bGwgfHwgbUNvbG9yTmFtZXMgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICB8fCBtQ29sb3JJbnRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIGNvbG9yIGFsZXJ0IHBhcmFtcyBhcmUgbnVsbC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Db2xvck5hbWVzLmxlbmd0aCAhPSBtQ29sb3JJbnRzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gdGhlIGxlbmd0aCBvZiBjb2xvciBhbGVydCBwYXJhbXMgYXJlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImRpZmZlcmVudC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja1NpemVBbGVydFBhcmFtcygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGNoZWNrUGFyYW1zIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gYnVpbGRlciBpcyBudWxsLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVNpemVUaXRsZSA9PSBudWxsIHx8IG1TaXplTmFtZXMgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICB8fCBtU2l6ZURpc3BsYXlJbnRzID09IG51bGwgfHwgbVNpemVTZW5kSW50cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBzaXplIGFsZXJ0IHBhcmFtcyBhcmUgbnVsbC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1TaXplTmFtZXMubGVuZ3RoICE9IG1TaXplRGlzcGxheUludHMubGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICYmIG1TaXplU2VuZEludHMubGVuZ3RoICE9IG1TaXplRGlzcGxheUludHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSB0aGUgbGVuZ3RoIG9mIHNpemUgYWxlcnQgcGFyYW1zIGFyZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJkaWZmZXJlbnQuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tBbGlnbkFsZXJ0UGFyYW1zKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gY2hlY2tBbGlnbkFsZXJ0UGFyYW1zIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gYnVpbGRlciBpcyBudWxsLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUFsaWduVGl0bGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gYWxpZ24gYWxlcnQgcGFyYW1zIGFyZSBudWxsLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG9uU2hvd0ZvcmVncm91bmRDb2xvckFsZXJ0RGlhbG9nKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TaG93Rm9yZWdyb3VuZENvbG9yQWxlcnREaWFsb2ciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghY2hlY2tDb2xvckFsZXJ0UGFyYW1zKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5zZXRUaXRsZShtQ29sb3JUaXRsZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zZXRJY29uKDApOwotICAgICAgICAgICAgbUJ1aWxkZXIuCi0gICAgICAgICAgICBzZXRJdGVtcyhtQ29sb3JOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoIkVFVFZNIiwgIm1CdWlsZGVyLm9uY2xpY2s6IiArIHdoaWNoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yID0gSW50ZWdlci5wYXJzZUludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBtQ29sb3JJbnRzW3doaWNoXSwgMTYpIC0gMHgwMTAwMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgbUVTVC5zZXRJdGVtQ29sb3IoY29sb3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgbUJ1aWxkZXIuc2hvdygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG9uU2hvd0JhY2tncm91bmRDb2xvckFsZXJ0RGlhbG9nKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TaG93QmFja2dyb3VuZENvbG9yQWxlcnREaWFsb2ciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghY2hlY2tDb2xvckFsZXJ0UGFyYW1zKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5zZXRUaXRsZShtQ29sb3JUaXRsZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zZXRJY29uKDApOwotICAgICAgICAgICAgbUJ1aWxkZXIuCi0gICAgICAgICAgICBzZXRJdGVtcyhtQ29sb3JOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoIkVFVFZNIiwgIm1CdWlsZGVyLm9uY2xpY2s6IiArIHdoaWNoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yID0gSW50ZWdlci5wYXJzZUludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBtQ29sb3JJbnRzW3doaWNoXSwgMTYpIC0gMHgwMTAwMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgbUVTVC5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgbUJ1aWxkZXIuc2hvdygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG9uU2hvd1NpemVBbGVydERpYWxvZygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU2hvd1NpemVBbGVydERpYWxvZyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFjaGVja1NpemVBbGVydFBhcmFtcygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuc2V0VGl0bGUobVNpemVUaXRsZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zZXRJY29uKDApOwotICAgICAgICAgICAgbUJ1aWxkZXIuCi0gICAgICAgICAgICBzZXRJdGVtcyhtU2l6ZU5hbWVzLAotICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAibUJ1aWxkZXIub25jbGljazoiICsgd2hpY2gpOwotICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IEludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgLnBhcnNlSW50KChTdHJpbmcpIG1TaXplRGlzcGxheUludHNbd2hpY2hdKTsKLSAgICAgICAgICAgICAgICAgICAgbUVTVC5zZXRJdGVtU2l6ZShzaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNob3coKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBvblNob3dBbGlnbkFsZXJ0RGlhbG9nKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TaG93QWxpZ25BbGVydERpYWxvZyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFjaGVja0FsaWduQWxlcnRQYXJhbXMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLnNldFRpdGxlKG1BbGlnblRpdGxlKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNldEljb24oMCk7Ci0gICAgICAgICAgICBtQnVpbGRlci4KLSAgICAgICAgICAgIHNldEl0ZW1zKG1BbGlnbk5hbWVzLAotICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAibUJ1aWxkZXIub25jbGljazoiICsgd2hpY2gpOwotICAgICAgICAgICAgICAgICAgICBMYXlvdXQuQWxpZ25tZW50IGFsaWduID0gTGF5b3V0LkFsaWdubWVudC5BTElHTl9OT1JNQUw7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAod2hpY2gpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSBMYXlvdXQuQWxpZ25tZW50LkFMSUdOX05PUk1BTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9IExheW91dC5BbGlnbm1lbnQuQUxJR05fQ0VOVEVSOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gTGF5b3V0LkFsaWdubWVudC5BTElHTl9PUFBPU0lURTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUVTVC5zZXRBbGlnbm1lbnQoYWxpZ24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgbUJ1aWxkZXIuc2hvdygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBTdHlsZWRUZXh0QXJyb3dLZXlNZXRob2QgZXh0ZW5kcyBBcnJvd0tleU1vdmVtZW50TWV0aG9kIHsKLSAgICAgICAgRWRpdG9yTWFuYWdlciBtTWFuYWdlcjsKLSAgICAgICAgU3R5bGVkVGV4dEFycm93S2V5TWV0aG9kKEVkaXRvck1hbmFnZXIgbWFuYWdlcikgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIG1NYW5hZ2VyID0gbWFuYWdlcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgYnVmZmVyLAotICAgICAgICAgICAgICAgIGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICAgICAgaWYgKCFtTWFuYWdlci5pc1NvZnRLZXlCbG9ja2VkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKHdpZGdldCwgYnVmZmVyLCBrZXlDb2RlLCBldmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXhlY3V0ZURvd24od2lkZ2V0LCBidWZmZXIsIGtleUNvZGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBnZXRFbmRQb3MoVGV4dFZpZXcgd2lkZ2V0KSB7Ci0gICAgICAgICAgICBpbnQgZW5kOwotICAgICAgICAgICAgaWYgKHdpZGdldC5nZXRTZWxlY3Rpb25TdGFydCgpID09IG1NYW5hZ2VyLmdldFNlbGVjdGlvblN0YXJ0KCkpIHsKLSAgICAgICAgICAgICAgICBlbmQgPSB3aWRnZXQuZ2V0U2VsZWN0aW9uRW5kKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuZCA9IHdpZGdldC5nZXRTZWxlY3Rpb25TdGFydCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVuZDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiB1cChUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHVwOiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGF5b3V0IGxheW91dCA9IHdpZGdldC5nZXRMYXlvdXQoKTsKLSAgICAgICAgICAgIGludCBlbmQgPSBnZXRFbmRQb3Mod2lkZ2V0KTsKLSAgICAgICAgICAgIGludCBsaW5lID0gbGF5b3V0LmdldExpbmVGb3JPZmZzZXQoZW5kKTsKLSAgICAgICAgICAgIGlmIChsaW5lID4gMCkgewotICAgICAgICAgICAgICAgIGludCB0bzsKLSAgICAgICAgICAgICAgICBpZiAobGF5b3V0LmdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKSA9PQotICAgICAgICAgICAgICAgICAgICBsYXlvdXQuZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUgLSAxKSkgewotICAgICAgICAgICAgICAgICAgICBmbG9hdCBoID0gbGF5b3V0LmdldFByaW1hcnlIb3Jpem9udGFsKGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIHRvID0gbGF5b3V0LmdldE9mZnNldEZvckhvcml6b250YWwobGluZSAtIDEsIGgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvID0gbGF5b3V0LmdldExpbmVTdGFydChsaW5lIC0gMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnNldFNlbGVjdGVkRW5kUG9zKHRvKTsKLSAgICAgICAgICAgICAgICBtTWFuYWdlci5vbkN1cnNvck1vdmVkKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZG93bihUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGRvd246Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMYXlvdXQgbGF5b3V0ID0gd2lkZ2V0LmdldExheW91dCgpOwotICAgICAgICAgICAgaW50IGVuZCA9IGdldEVuZFBvcyh3aWRnZXQpOwotICAgICAgICAgICAgaW50IGxpbmUgPSBsYXlvdXQuZ2V0TGluZUZvck9mZnNldChlbmQpOwotICAgICAgICAgICAgaWYgKGxpbmUgPCBsYXlvdXQuZ2V0TGluZUNvdW50KCkgLSAxKSB7Ci0gICAgICAgICAgICAgICAgaW50IHRvOwotICAgICAgICAgICAgICAgIGlmIChsYXlvdXQuZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpID09Ci0gICAgICAgICAgICAgICAgICAgIGxheW91dC5nZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSArIDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IGggPSBsYXlvdXQuZ2V0UHJpbWFyeUhvcml6b250YWwoZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgdG8gPSBsYXlvdXQuZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lICsgMSwgaCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdG8gPSBsYXlvdXQuZ2V0TGluZVN0YXJ0KGxpbmUgKyAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU1hbmFnZXIuc2V0U2VsZWN0ZWRFbmRQb3ModG8pOwotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLm9uQ3Vyc29yTW92ZWQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBsZWZ0KFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gbGVmdDoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExheW91dCBsYXlvdXQgPSB3aWRnZXQuZ2V0TGF5b3V0KCk7Ci0gICAgICAgICAgICBpbnQgdG8gPSBsYXlvdXQuZ2V0T2Zmc2V0VG9MZWZ0T2YoZ2V0RW5kUG9zKHdpZGdldCkpOwotICAgICAgICAgICAgbU1hbmFnZXIuc2V0U2VsZWN0ZWRFbmRQb3ModG8pOwotICAgICAgICAgICAgbU1hbmFnZXIub25DdXJzb3JNb3ZlZCgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcmlnaHQoVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgYnVmZmVyKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSByaWdodDoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExheW91dCBsYXlvdXQgPSB3aWRnZXQuZ2V0TGF5b3V0KCk7Ci0gICAgICAgICAgICBpbnQgdG8gPSBsYXlvdXQuZ2V0T2Zmc2V0VG9SaWdodE9mKGdldEVuZFBvcyh3aWRnZXQpKTsKLSAgICAgICAgICAgIG1NYW5hZ2VyLnNldFNlbGVjdGVkRW5kUG9zKHRvKTsKLSAgICAgICAgICAgIG1NYW5hZ2VyLm9uQ3Vyc29yTW92ZWQoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGV4ZWN1dGVEb3duKFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICBpbnQga2V5Q29kZSkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZXhlY3V0ZURvd246ICIgKyBrZXlDb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBzd2l0Y2ggKGtleUNvZGUpIHsKLSAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQOgotICAgICAgICAgICAgICAgIGhhbmRsZWQgfD0gdXAod2lkZ2V0LCBidWZmZXIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTjoKLSAgICAgICAgICAgICAgICBoYW5kbGVkIHw9IGRvd24od2lkZ2V0LCBidWZmZXIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfTEVGVDoKLSAgICAgICAgICAgICAgICBoYW5kbGVkIHw9IGxlZnQod2lkZ2V0LCBidWZmZXIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQ6Ci0gICAgICAgICAgICAgICAgaGFuZGxlZCB8PSByaWdodCh3aWRnZXQsIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSOgotICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5vbkZpeFNlbGVjdGVkSXRlbSgpOwotICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaGFuZGxlZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBIb3Jpem9udGFsTGluZVNwYW4gZXh0ZW5kcyBJbWFnZVNwYW4gewotICAgICAgICBwdWJsaWMgSG9yaXpvbnRhbExpbmVTcGFuKGludCBjb2xvciwgVmlldyB2aWV3KSB7Ci0gICAgICAgICAgICBzdXBlcihuZXcgSG9yaXpvbnRhbExpbmVEcmF3YWJsZShjb2xvciwgdmlldykpOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyBjbGFzcyBIb3Jpem9udGFsTGluZURyYXdhYmxlIGV4dGVuZHMgU2hhcGVEcmF3YWJsZSB7Ci0gICAgICAgIHByaXZhdGUgVmlldyBtVmlldzsKLSAgICAgICAgcHVibGljIEhvcml6b250YWxMaW5lRHJhd2FibGUoaW50IGNvbG9yLCBWaWV3IHZpZXcpIHsKLSAgICAgICAgICAgIHN1cGVyKG5ldyBSZWN0U2hhcGUoKSk7Ci0gICAgICAgICAgICBtVmlldyA9IHZpZXc7Ci0gICAgICAgICAgICByZW5ld0NvbG9yKGNvbG9yKTsKLSAgICAgICAgICAgIHJlbmV3Qm91bmRzKHZpZXcpOwotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGRyYXc6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZW5ld0NvbG9yKCk7Ci0gICAgICAgICAgICByZW5ld0JvdW5kcyhtVmlldyk7Ci0gICAgICAgICAgICBzdXBlci5kcmF3KGNhbnZhcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcmVuZXdCb3VuZHMoVmlldyB2aWV3KSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgaW50IHdpZHRoID0gbVZpZXcuZ2V0QmFja2dyb3VuZCgpLmdldEJvdW5kcygpLndpZHRoKCk7Ci0gICAgICAgICAgICAgICAgaW50IGhlaWdodCA9IG1WaWV3LmdldEJhY2tncm91bmQoKS5nZXRCb3VuZHMoKS5oZWlnaHQoKTsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHJlbmV3Qm91bmRzOiIgKyB3aWR0aCArICIsIiArIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSByZW5ld0JvdW5kczoiICsgbVZpZXcuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgd2lkdGggPSBtVmlldy5nZXRXaWR0aCgpOwotICAgICAgICAgICAgaWYgKHdpZHRoID4gMjApIHsKLSAgICAgICAgICAgICAgICB3aWR0aCAtPSAyMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldEJvdW5kcygwLCAwLCB3aWR0aCwgMik7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlbmV3Q29sb3IoaW50IGNvbG9yKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSByZW5ld0NvbG9yOiIgKyBjb2xvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRQYWludCgpLnNldENvbG9yKGNvbG9yKTsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgcmVuZXdDb2xvcigpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHJlbmV3Q29sb3I6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVZpZXcgaW5zdGFuY2VvZiBWaWV3KSB7Ci0gICAgICAgICAgICAgICAgSW1hZ2VTcGFuIHBhcmVudCA9IGdldFBhcmVudFNwYW4oKTsKLSAgICAgICAgICAgICAgICBFZGl0YWJsZSB0ZXh0ID0gKChFZGl0U3R5bGVkVGV4dCltVmlldykuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIGludCBzdGFydCA9IHRleHQuZ2V0U3BhblN0YXJ0KHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgRm9yZWdyb3VuZENvbG9yU3BhbltdIHNwYW5zID0gdGV4dC5nZXRTcGFucyhzdGFydCwgc3RhcnQsIEZvcmVncm91bmRDb2xvclNwYW4uY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmIChzcGFucy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmV3Q29sb3Ioc3BhbnNbc3BhbnMubGVuZ3RoIC0gMV0uZ2V0Rm9yZWdyb3VuZENvbG9yKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIEltYWdlU3BhbiBnZXRQYXJlbnRTcGFuKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZ2V0UGFyZW50U3BhbjoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtVmlldyBpbnN0YW5jZW9mIEVkaXRTdHlsZWRUZXh0KSB7Ci0gICAgICAgICAgICAgICAgRWRpdGFibGUgdGV4dCA9ICgoRWRpdFN0eWxlZFRleHQpbVZpZXcpLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBJbWFnZVNwYW5bXSBpbWFnZXMgPSB0ZXh0LmdldFNwYW5zKDAsIHRleHQubGVuZ3RoKCksIEltYWdlU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGltYWdlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSW1hZ2VTcGFuIGltYWdlOiBpbWFnZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZS5nZXREcmF3YWJsZSgpID09IHRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW1hZ2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tcmVuZXdCb3VuZHM6IENvdWxkbid0IGZpbmQiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9JUmVtb3RlVmlld3NGYWN0b3J5LmFpZGwgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0lSZW1vdGVWaWV3c0ZhY3RvcnkuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTk5MDBjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9JUmVtb3RlVmlld3NGYWN0b3J5LmFpZGwKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0OworCitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7CisKKy8qKiB7QGhpZGV9ICovCitpbnRlcmZhY2UgSVJlbW90ZVZpZXdzRmFjdG9yeSB7CisgICAgdm9pZCBvbkRhdGFTZXRDaGFuZ2VkKCk7CisgICAgaW50IGdldENvdW50KCk7CisgICAgUmVtb3RlVmlld3MgZ2V0Vmlld0F0KGludCBwb3NpdGlvbik7CisgICAgUmVtb3RlVmlld3MgZ2V0TG9hZGluZ1ZpZXcoKTsKKyAgICBpbnQgZ2V0Vmlld1R5cGVDb3VudCgpOworICAgIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbik7CisgICAgYm9vbGVhbiBoYXNTdGFibGVJZHMoKTsKK30KKwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Mb2NrUGF0dGVyblV0aWxzLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0xvY2tQYXR0ZXJuVXRpbHMuamF2YQppbmRleCBjNzg4NjA1Li45MDQyM2JlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0xvY2tQYXR0ZXJuVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0xvY2tQYXR0ZXJuVXRpbHMuamF2YQpAQCAtOTYsNiArOTYsOCBAQAogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBU1NXT1JEX1RZUEVfS0VZID0gImxvY2tzY3JlZW4ucGFzc3dvcmRfdHlwZSI7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExPQ0tfUEFTU1dPUkRfU0FMVF9LRVkgPSAibG9ja3NjcmVlbi5wYXNzd29yZF9zYWx0IjsKIAorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQQVNTV09SRF9ISVNUT1JZX0tFWSA9ICJsb2Nrc2NyZWVuLnBhc3N3b3JkaGlzdG9yeSI7CisKICAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKICAgICBwcml2YXRlIERldmljZVBvbGljeU1hbmFnZXIgbURldmljZVBvbGljeU1hbmFnZXI7CkBAIC0xNjMsNiArMTY1LDMzIEBACiAgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuZ2V0UGFzc3dvcmRRdWFsaXR5KG51bGwpOwogICAgIH0KIAorICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkUGFzc3dvcmRIaXN0b3J5TGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlcXVlc3RlZFBhc3N3b3JkTWluaW11bUxldHRlcnMoKSB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuZ2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlcXVlc3RlZFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoKSB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkUGFzc3dvcmRNaW5pbXVtTnVtZXJpYygpIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkUGFzc3dvcmRNaW5pbXVtU3ltYm9scygpIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkUGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihudWxsKTsKKyAgICB9CiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgYWN0dWFsIHBhc3N3b3JkIG1vZGUsIGFzIHNldCBieSBrZXlndWFyZCBhZnRlciB1cGRhdGluZyB0aGUgcGFzc3dvcmQuCiAgICAgICoKQEAgLTIyNyw2ICsyNTYsMzMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDaGVjayB0byBzZWUgaWYgYSBwYXNzd29yZCBtYXRjaGVzIGFueSBvZiB0aGUgcGFzc3dvcmRzIHN0b3JlZCBpbiB0aGUKKyAgICAgKiBwYXNzd29yZCBoaXN0b3J5LgorICAgICAqCisgICAgICogQHBhcmFtIHBhc3N3b3JkIFRoZSBwYXNzd29yZCB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIHBhc3N3b3JkIG1hdGNoZXMgYW55IGluIHRoZSBoaXN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNoZWNrUGFzc3dvcmRIaXN0b3J5KFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICBTdHJpbmcgcGFzc3dvcmRIYXNoU3RyaW5nID0gbmV3IFN0cmluZyhwYXNzd29yZFRvSGFzaChwYXNzd29yZCkpOworICAgICAgICBTdHJpbmcgcGFzc3dvcmRIaXN0b3J5ID0gZ2V0U3RyaW5nKFBBU1NXT1JEX0hJU1RPUllfS0VZKTsKKyAgICAgICAgaWYgKHBhc3N3b3JkSGlzdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gUGFzc3dvcmQgSGlzdG9yeSBtYXkgYmUgdG9vIGxvbmcuLi4KKyAgICAgICAgaW50IHBhc3N3b3JkSGFzaExlbmd0aCA9IHBhc3N3b3JkSGFzaFN0cmluZy5sZW5ndGgoKTsKKyAgICAgICAgaW50IHBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9IGdldFJlcXVlc3RlZFBhc3N3b3JkSGlzdG9yeUxlbmd0aCgpOworICAgICAgICBpZihwYXNzd29yZEhpc3RvcnlMZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGludCBuZWVkZWRQYXNzd29yZEhpc3RvcnlMZW5ndGggPSBwYXNzd29yZEhhc2hMZW5ndGggKiBwYXNzd29yZEhpc3RvcnlMZW5ndGgKKyAgICAgICAgICAgICAgICArIHBhc3N3b3JkSGlzdG9yeUxlbmd0aCAtIDE7CisgICAgICAgIGlmIChwYXNzd29yZEhpc3RvcnkubGVuZ3RoKCkgPiBuZWVkZWRQYXNzd29yZEhpc3RvcnlMZW5ndGgpIHsKKyAgICAgICAgICAgIHBhc3N3b3JkSGlzdG9yeSA9IHBhc3N3b3JkSGlzdG9yeS5zdWJzdHJpbmcoMCwgbmVlZGVkUGFzc3dvcmRIaXN0b3J5TGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFzc3dvcmRIaXN0b3J5LmNvbnRhaW5zKHBhc3N3b3JkSGFzaFN0cmluZyk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSB1c2VyIGhhcyBzdG9yZWQgYSBsb2NrIHBhdHRlcm4uCiAgICAgICogQHJldHVybiBXaGV0aGVyIGEgc2F2ZWQgcGF0dGVybiBleGlzdHMuCiAgICAgICovCkBAIC0yNzksNiArMzM1LDExIEBACiAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWDoKKyAgICAgICAgICAgICAgICBpZiAoaXNMb2NrUGFzc3dvcmRFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlUGFzc3dvcmRRdWFsaXR5ID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBhY3RpdmVQYXNzd29yZFF1YWxpdHk7CiAgICAgfQpAQCAtMjg3LDggKzM0OCw2IEBACiAgICAgICogQ2xlYXIgYW55IGxvY2sgcGF0dGVybiBvciBwYXNzd29yZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhckxvY2soKSB7Ci0gICAgICAgIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKAotICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCwgMCk7CiAgICAgICAgIHNhdmVMb2NrUGFzc3dvcmQobnVsbCwgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORyk7CiAgICAgICAgIHNldExvY2tQYXR0ZXJuRW5hYmxlZChmYWxzZSk7CiAgICAgICAgIHNhdmVMb2NrUGF0dGVybihudWxsKTsKQEAgLTMwMSw3ICszNjAsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNhdmVMb2NrUGF0dGVybihMaXN0PExvY2tQYXR0ZXJuVmlldy5DZWxsPiBwYXR0ZXJuKSB7CiAgICAgICAgIC8vIENvbXB1dGUgdGhlIGhhc2gKLSAgICAgICAgZmluYWwgYnl0ZVtdIGhhc2ggID0gTG9ja1BhdHRlcm5VdGlscy5wYXR0ZXJuVG9IYXNoKHBhdHRlcm4pOworICAgICAgICBmaW5hbCBieXRlW10gaGFzaCA9IExvY2tQYXR0ZXJuVXRpbHMucGF0dGVyblRvSGFzaChwYXR0ZXJuKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBoYXNoIHRvIGZpbGUKICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoc0xvY2tQYXR0ZXJuRmlsZW5hbWUsICJydyIpOwpAQCAtMzE2LDE0ICszNzUsMTUgQEAKICAgICAgICAgICAgIGlmIChwYXR0ZXJuICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBzZXRCb29sZWFuKFBBVFRFUk5fRVZFUl9DSE9TRU5fS0VZLCB0cnVlKTsKICAgICAgICAgICAgICAgICBzZXRMb25nKFBBU1NXT1JEX1RZUEVfS0VZLCBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HKTsKLSAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkcsIHBhdHRlcm4uc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HLCBwYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgICAgICAuc2l6ZSgpLCAwLCAwLCAwLCAwLCAwLCAwKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDApOworICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDApOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewotICAgICAgICAgICAgLy8gQ2FudCBkbyBtdWNoLCB1bmxlc3Mgd2Ugd2FudCB0byBmYWlsIG92ZXIgdG8gdXNpbmcgdGhlIHNldHRpbmdzIHByb3ZpZGVyCisgICAgICAgICAgICAvLyBDYW50IGRvIG11Y2gsIHVubGVzcyB3ZSB3YW50IHRvIGZhaWwgb3ZlciB0byB1c2luZyB0aGUgc2V0dGluZ3MKKyAgICAgICAgICAgIC8vIHByb3ZpZGVyCiAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmFibGUgdG8gc2F2ZSBsb2NrIHBhdHRlcm4gdG8gIiArIHNMb2NrUGF0dGVybkZpbGVuYW1lKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CiAgICAgICAgICAgICAvLyBDYW50IGRvIG11Y2gKQEAgLTM4MSwxNyArNDQxLDU5IEBACiAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyIGRwbSA9IGdldERldmljZVBvbGljeU1hbmFnZXIoKTsKICAgICAgICAgICAgIGlmIChwYXNzd29yZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaW50IGNvbXB1dGVkUXVhbGl0eSA9IGNvbXB1dGVQYXNzd29yZFF1YWxpdHkocGFzc3dvcmQpOwotICAgICAgICAgICAgICAgIHNldExvbmcoUEFTU1dPUkRfVFlQRV9LRVksIGNvbXB1dGVkUXVhbGl0eSk7CisgICAgICAgICAgICAgICAgc2V0TG9uZyhQQVNTV09SRF9UWVBFX0tFWSwgTWF0aC5tYXgocXVhbGl0eSwgY29tcHV0ZWRRdWFsaXR5KSk7CiAgICAgICAgICAgICAgICAgaWYgKGNvbXB1dGVkUXVhbGl0eSAhPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoY29tcHV0ZWRRdWFsaXR5LCBwYXNzd29yZC5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGludCBsZXR0ZXJzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHVwcGVyY2FzZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGludCBsb3dlcmNhc2UgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVycyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGludCBzeW1ib2xzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5vbmxldHRlciA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFzc3dvcmQubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gcGFzc3dvcmQuY2hhckF0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0dGVycysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyY2FzZSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldHRlcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcmNhc2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ubGV0dGVyKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbHMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25sZXR0ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShNYXRoLm1heChxdWFsaXR5LCBjb21wdXRlZFF1YWxpdHkpLCBwYXNzd29yZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGgoKSwgbGV0dGVycywgdXBwZXJjYXNlLCBsb3dlcmNhc2UsIG51bWJlcnMsIHN5bWJvbHMsIG5vbmxldHRlcik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHBhc3N3b3JkIGlzIG5vdCBhbnl0aGluZy4KICAgICAgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDAsIDAsIDAsIDAsIDAsIDAsIDApOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIHBhc3N3b3JkIHRvIHRoZSBwYXNzd29yZCBoaXN0b3J5LiBXZSBhc3N1bWUgYWxsCisgICAgICAgICAgICAgICAgLy8gcGFzc3dvcmQKKyAgICAgICAgICAgICAgICAvLyBoYXNoZXMgaGF2ZSB0aGUgc2FtZSBsZW5ndGggZm9yIHNpbXBsaWNpdHkgb2YgaW1wbGVtZW50YXRpb24uCisgICAgICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkSGlzdG9yeSA9IGdldFN0cmluZyhQQVNTV09SRF9ISVNUT1JZX0tFWSk7CisgICAgICAgICAgICAgICAgaWYgKHBhc3N3b3JkSGlzdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkSGlzdG9yeSA9IG5ldyBTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IHBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9IGdldFJlcXVlc3RlZFBhc3N3b3JkSGlzdG9yeUxlbmd0aCgpOworICAgICAgICAgICAgICAgIGlmIChwYXNzd29yZEhpc3RvcnlMZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBwYXNzd29yZEhpc3RvcnkgPSAiIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwYXNzd29yZEhpc3RvcnkgPSBuZXcgU3RyaW5nKGhhc2gpICsgIiwiICsgcGFzc3dvcmRIaXN0b3J5OworICAgICAgICAgICAgICAgICAgICAvLyBDdXQgaXQgdG8gY29udGFpbiBwYXNzd29yZEhpc3RvcnlMZW5ndGggaGFzaGVzCisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwYXNzd29yZEhpc3RvcnlMZW5ndGggLTEgY29tbWFzLgorICAgICAgICAgICAgICAgICAgICBwYXNzd29yZEhpc3RvcnkgPSBwYXNzd29yZEhpc3Rvcnkuc3Vic3RyaW5nKDAsIE1hdGgubWluKGhhc2gubGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwYXNzd29yZEhpc3RvcnlMZW5ndGggKyBwYXNzd29yZEhpc3RvcnlMZW5ndGggLSAxLCBwYXNzd29yZEhpc3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0U3RyaW5nKFBBU1NXT1JEX0hJU1RPUllfS0VZLCBwYXNzd29yZEhpc3RvcnkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDAsIDAsIDAsIDAsIDAsIDAsIDApOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewogICAgICAgICAgICAgLy8gQ2FudCBkbyBtdWNoLCB1bmxlc3Mgd2Ugd2FudCB0byBmYWlsIG92ZXIgdG8gdXNpbmcgdGhlIHNldHRpbmdzIHByb3ZpZGVyCkBAIC01MzEsNyArNjMzLDggQEAKICAgICAgICAgcmV0dXJuIHNhdmVkUGFzc3dvcmRFeGlzdHMoKSAmJgogICAgICAgICAgICAgICAgIChtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDCiAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMpOworICAgICAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYKTsKICAgICB9CiAKICAgICAvKioKQEAgLTY1NSwxMiArNzU4LDIxIEBACiAgICAgICAgIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLnB1dExvbmcobUNvbnRlbnRSZXNvbHZlciwgc2VjdXJlU2V0dGluZ0tleSwgdmFsdWUpOwogICAgIH0KIAorICAgIHByaXZhdGUgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgc2VjdXJlU2V0dGluZ0tleSkgeworICAgICAgICByZXR1cm4gYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKG1Db250ZW50UmVzb2x2ZXIsIHNlY3VyZVNldHRpbmdLZXkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIHNlY3VyZVNldHRpbmdLZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcobUNvbnRlbnRSZXNvbHZlciwgc2VjdXJlU2V0dGluZ0tleSwgdmFsdWUpOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzU2VjdXJlKCkgewogICAgICAgICBsb25nIG1vZGUgPSBnZXRLZXlndWFyZFN0b3JlZFBhc3N3b3JkUXVhbGl0eSgpOwogICAgICAgICBmaW5hbCBib29sZWFuIGlzUGF0dGVybiA9IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORzsKICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1Bhc3N3b3JkID0gbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQwogICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUMKLSAgICAgICAgICAgICAgICB8fCBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUM7CisgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDCisgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWDsKICAgICAgICAgZmluYWwgYm9vbGVhbiBzZWN1cmUgPSBpc1BhdHRlcm4gJiYgaXNMb2NrUGF0dGVybkVuYWJsZWQoKSAmJiBzYXZlZFBhdHRlcm5FeGlzdHMoKQogICAgICAgICAgICAgICAgIHx8IGlzUGFzc3dvcmQgJiYgc2F2ZWRQYXNzd29yZEV4aXN0cygpOwogICAgICAgICByZXR1cm4gc2VjdXJlOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9QYXNzd29yZEVudHJ5S2V5Ym9hcmQuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvUGFzc3dvcmRFbnRyeUtleWJvYXJkLmphdmEKaW5kZXggZTFhNjczNy4uZmFjZGEzNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9QYXNzd29yZEVudHJ5S2V5Ym9hcmQuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1Bhc3N3b3JkRW50cnlLZXlib2FyZC5qYXZhCkBAIC02Nyw4ICs2NywyMiBAQAogICAgICAgICB0aGlzKGNvbnRleHQsIHhtbExheW91dFJlc0lkLCAwKTsKICAgICB9CiAKKyAgICBwdWJsaWMgUGFzc3dvcmRFbnRyeUtleWJvYXJkKENvbnRleHQgY29udGV4dCwgaW50IHhtbExheW91dFJlc0lkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCB4bWxMYXlvdXRSZXNJZCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgfQorCiAgICAgcHVibGljIFBhc3N3b3JkRW50cnlLZXlib2FyZChDb250ZXh0IGNvbnRleHQsIGludCB4bWxMYXlvdXRSZXNJZCwgaW50IG1vZGUpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgeG1sTGF5b3V0UmVzSWQsIG1vZGUpOworICAgICAgICBpbml0KGNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBQYXNzd29yZEVudHJ5S2V5Ym9hcmQoQ29udGV4dCBjb250ZXh0LCBpbnQgeG1sTGF5b3V0UmVzSWQsIGludCBtb2RlLAorICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIHhtbExheW91dFJlc0lkLCBtb2RlLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgaW5pdChjb250ZXh0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdChDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CiAgICAgICAgIG1SZXMgPSByZXM7CiAgICAgICAgIG1TaGlmdEljb24gPSByZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5zeW1fa2V5Ym9hcmRfc2hpZnQpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9QYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyLmphdmEKaW5kZXggNTM3MjBlNC4uMzg0ZjdiYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9QYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1Bhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5qYXZhCkBAIC01NCwxMCArNTQsMjAgQEAKICAgICBwcml2YXRlIFZpYnJhdG9yIG1WaWJyYXRvcjsKIAogICAgIHB1YmxpYyBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIoQ29udGV4dCBjb250ZXh0LCBLZXlib2FyZFZpZXcga2V5Ym9hcmRWaWV3LCBWaWV3IHRhcmdldFZpZXcpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBrZXlib2FyZFZpZXcsIHRhcmdldFZpZXcsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIoQ29udGV4dCBjb250ZXh0LCBLZXlib2FyZFZpZXcga2V5Ym9hcmRWaWV3LCBWaWV3IHRhcmdldFZpZXcsCisgICAgICAgICAgICBib29sZWFuIHVzZUZ1bGxTY3JlZW5XaWR0aCkgewogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1UYXJnZXRWaWV3ID0gdGFyZ2V0VmlldzsKICAgICAgICAgbUtleWJvYXJkVmlldyA9IGtleWJvYXJkVmlldzsKLSAgICAgICAgY3JlYXRlS2V5Ym9hcmRzKCk7CisgICAgICAgIGlmICh1c2VGdWxsU2NyZWVuV2lkdGggfHwgbUtleWJvYXJkVmlldy5nZXRMYXlvdXRQYXJhbXMoKS53aWR0aCA9PSAtMSkgeworICAgICAgICAgICAgY3JlYXRlS2V5Ym9hcmRzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjcmVhdGVLZXlib2FyZHNXaXRoU3BlY2lmaWNTaXplKG1LZXlib2FyZFZpZXcuZ2V0TGF5b3V0UGFyYW1zKCkud2lkdGgsCisgICAgICAgICAgICAgICAgICAgIG1LZXlib2FyZFZpZXcuZ2V0TGF5b3V0UGFyYW1zKCkuaGVpZ2h0KTsKKyAgICAgICAgfQogICAgICAgICBtS2V5Ym9hcmRWaWV3LnNldE9uS2V5Ym9hcmRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKICAgICAgICAgbVZpYnJhdG9yID0gbmV3IFZpYnJhdG9yKCk7CiAgICAgfQpAQCAtNjYsNiArNzYsMjkgQEAKICAgICAgICAgcmV0dXJuIG1LZXlib2FyZE1vZGUgPT0gS0VZQk9BUkRfTU9ERV9BTFBIQTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlS2V5Ym9hcmRzV2l0aFNwZWNpZmljU2l6ZShpbnQgdmlld1dpZHRoLCBpbnQgdmlld0hlaWdodCkgeworICAgICAgICBtTnVtZXJpY0tleWJvYXJkID0gbmV3IFBhc3N3b3JkRW50cnlLZXlib2FyZChtQ29udGV4dCwgUi54bWwucGFzc3dvcmRfa2JkX251bWVyaWMsCisgICAgICAgICAgICAgICAgdmlld1dpZHRoLCB2aWV3SGVpZ2h0KTsKKyAgICAgICAgbVF3ZXJ0eUtleWJvYXJkID0gbmV3IFBhc3N3b3JkRW50cnlLZXlib2FyZChtQ29udGV4dCwKKyAgICAgICAgICAgICAgICBSLnhtbC5wYXNzd29yZF9rYmRfcXdlcnR5LCBSLmlkLm1vZGVfbm9ybWFsLCB2aWV3V2lkdGgsIHZpZXdIZWlnaHQpOworICAgICAgICBtUXdlcnR5S2V5Ym9hcmQuZW5hYmxlU2hpZnRMb2NrKCk7CisKKyAgICAgICAgbVF3ZXJ0eUtleWJvYXJkU2hpZnRlZCA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmQobUNvbnRleHQsCisgICAgICAgICAgICAgICAgUi54bWwucGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLAorICAgICAgICAgICAgICAgIFIuaWQubW9kZV9ub3JtYWwsIHZpZXdXaWR0aCwgdmlld0hlaWdodCk7CisgICAgICAgIG1Rd2VydHlLZXlib2FyZFNoaWZ0ZWQuZW5hYmxlU2hpZnRMb2NrKCk7CisgICAgICAgIG1Rd2VydHlLZXlib2FyZFNoaWZ0ZWQuc2V0U2hpZnRlZCh0cnVlKTsgLy8gYWx3YXlzIHNoaWZ0ZWQuCisKKyAgICAgICAgbVN5bWJvbHNLZXlib2FyZCA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmQobUNvbnRleHQsIFIueG1sLnBhc3N3b3JkX2tiZF9zeW1ib2xzLAorICAgICAgICAgICAgICAgIHZpZXdXaWR0aCwgdmlld0hlaWdodCk7CisgICAgICAgIG1TeW1ib2xzS2V5Ym9hcmQuZW5hYmxlU2hpZnRMb2NrKCk7CisKKyAgICAgICAgbVN5bWJvbHNLZXlib2FyZFNoaWZ0ZWQgPSBuZXcgUGFzc3dvcmRFbnRyeUtleWJvYXJkKG1Db250ZXh0LAorICAgICAgICAgICAgICAgIFIueG1sLnBhc3N3b3JkX2tiZF9zeW1ib2xzX3NoaWZ0LCB2aWV3V2lkdGgsIHZpZXdIZWlnaHQpOworICAgICAgICBtU3ltYm9sc0tleWJvYXJkU2hpZnRlZC5lbmFibGVTaGlmdExvY2soKTsKKyAgICAgICAgbVN5bWJvbHNLZXlib2FyZFNoaWZ0ZWQuc2V0U2hpZnRlZCh0cnVlKTsgLy8gYWx3YXlzIHNoaWZ0ZWQKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgY3JlYXRlS2V5Ym9hcmRzKCkgewogICAgICAgICBtTnVtZXJpY0tleWJvYXJkID0gbmV3IFBhc3N3b3JkRW50cnlLZXlib2FyZChtQ29udGV4dCwgUi54bWwucGFzc3dvcmRfa2JkX251bWVyaWMpOwogICAgICAgICBtUXdlcnR5S2V5Ym9hcmQgPSBuZXcgUGFzc3dvcmRFbnRyeUtleWJvYXJkKG1Db250ZXh0LApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9TbGlkaW5nVGFiLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1NsaWRpbmdUYWIuamF2YQppbmRleCA5MTUyNzI5Li4zODY1NTEwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1NsaWRpbmdUYWIuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1NsaWRpbmdUYWIuamF2YQpAQCAtMTcsMTAgKzE3LDggQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0OwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlZpYnJhdG9yOwpAQCAtMzgsNiArMzYsNyBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcuU2NhbGVUeXBlOworCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIAogLyoqCkBAIC02OSwyMSArNjgsMjEgQEAKICAgICBwcml2YXRlIGludCBtR3JhYmJlZFN0YXRlID0gT25UcmlnZ2VyTGlzdGVuZXIuTk9fSEFORExFOwogICAgIHByaXZhdGUgYm9vbGVhbiBtVHJpZ2dlcmVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBWaWJyYXRvciBtVmlicmF0b3I7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtRGVuc2l0eTsgLy8gdXNlZCB0byBzY2FsZSBkaW1lbnNpb25zIGZvciBiaXRtYXBzLgorICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbURlbnNpdHk7IC8vIHVzZWQgdG8gc2NhbGUgZGltZW5zaW9ucyBmb3IgYml0bWFwcy4KIAogICAgIC8qKgogICAgICAqIEVpdGhlciB7QGxpbmsgI0hPUklaT05UQUx9IG9yIHtAbGluayAjVkVSVElDQUx9LgogICAgICAqLwotICAgIHByaXZhdGUgaW50IG1PcmllbnRhdGlvbjsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtT3JpZW50YXRpb247CiAKLSAgICBwcml2YXRlIFNsaWRlciBtTGVmdFNsaWRlcjsKLSAgICBwcml2YXRlIFNsaWRlciBtUmlnaHRTbGlkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBTbGlkZXIgbUxlZnRTbGlkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBTbGlkZXIgbVJpZ2h0U2xpZGVyOwogICAgIHByaXZhdGUgU2xpZGVyIG1DdXJyZW50U2xpZGVyOwogICAgIHByaXZhdGUgYm9vbGVhbiBtVHJhY2tpbmc7CiAgICAgcHJpdmF0ZSBmbG9hdCBtVGhyZXNob2xkOwogICAgIHByaXZhdGUgU2xpZGVyIG1PdGhlclNsaWRlcjsKICAgICBwcml2YXRlIGJvb2xlYW4gbUFuaW1hdGluZzsKLSAgICBwcml2YXRlIFJlY3QgbVRtcFJlY3Q7CisgICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1UbXBSZWN0OwogCiAgICAgLyoqCiAgICAgICogTGlzdGVuZXIgdXNlZCB0byByZXNldCB0aGUgdmlldyB3aGVuIHRoZSBjdXJyZW50IGFuaW1hdGlvbiBjb21wbGV0ZXMuCkBAIC00MTcsNyArNDE2LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBTdGFydCBhbmltYXRpbmcgdGhlIHNsaWRlci4gTm90ZSB3ZSBuZWVkIHR3byBhbmltYXRpb25zIHNpbmNlIGFuIEFuaW1hdG9yCisgICAgICAgICAqIFN0YXJ0IGFuaW1hdGluZyB0aGUgc2xpZGVyLiBOb3RlIHdlIG5lZWQgdHdvIGFuaW1hdGlvbnMgc2luY2UgYW4gVmFsdWVBbmltYXRvcgogICAgICAgICAgKiBrZWVwcyBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgaW52YWxpZGF0aW9uIHJlZ2lvbiB3aGljaCBpcyBqdXN0IHRoZSB2aWV3IGJlaW5nIGFuaW1hdGVkLgogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gYW5pbTEKQEAgLTQ3NSwxMCArNDc0LDEzIEBACiAgICAgICAgIGludCBoZWlnaHRTcGVjTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUoaGVpZ2h0TWVhc3VyZVNwZWMpOwogICAgICAgICBpbnQgaGVpZ2h0U3BlY1NpemUgPSAgTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7CiAKLSAgICAgICAgaWYgKHdpZHRoU3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQgfHwgaGVpZ2h0U3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgICAgIExvZy5lKCJTbGlkaW5nVGFiIiwgIlNsaWRpbmdUYWIgY2Fubm90IGhhdmUgVU5TUEVDSUZJRUQgTWVhc3VyZVNwZWMiCi0gICAgICAgICAgICAgICAgICAgICsiKHdzcGVjPSIgKyB3aWR0aFNwZWNNb2RlICsgIiwgaHNwZWM9IiArIGhlaWdodFNwZWNNb2RlICsgIikiLAotICAgICAgICAgICAgICAgICAgICBuZXcgUnVudGltZUV4Y2VwdGlvbihMT0dfVEFHICsgInN0YWNrOiIpKTsKKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgaWYgKHdpZHRoU3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQgCisgICAgICAgICAgICAgICAgICAgIHx8IGhlaWdodFNwZWNNb2RlID09IE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoIlNsaWRpbmdUYWIiLCAiU2xpZGluZ1RhYiBjYW5ub3QgaGF2ZSBVTlNQRUNJRklFRCBNZWFzdXJlU3BlYyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsiKHdzcGVjPSIgKyB3aWR0aFNwZWNNb2RlICsgIiwgaHNwZWM9IiArIGhlaWdodFNwZWNNb2RlICsgIikiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJ1bnRpbWVFeGNlcHRpb24oTE9HX1RBRyArICJzdGFjazoiKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBtTGVmdFNsaWRlci5tZWFzdXJlKCk7CkBAIC02MDgsMTQgKzYxMCw3IEBACiAKICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDoKICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6Ci0gICAgICAgICAgICAgICAgICAgIG1UcmFja2luZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtVHJpZ2dlcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIG1PdGhlclNsaWRlci5zaG93KHRydWUpOwotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNsaWRlci5yZXNldChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2xpZGVyLmhpZGVUYXJnZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTbGlkZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBtT3RoZXJTbGlkZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBzZXRHcmFiYmVkU3RhdGUoT25UcmlnZ2VyTGlzdGVuZXIuTk9fSEFORExFKTsKKyAgICAgICAgICAgICAgICAgICAgY2FuY2VsR3JhYigpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjIzLDYgKzYxOCwxNyBAQAogICAgICAgICByZXR1cm4gbVRyYWNraW5nIHx8IHN1cGVyLm9uVG91Y2hFdmVudChldmVudCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbEdyYWIoKSB7CisgICAgICAgIG1UcmFja2luZyA9IGZhbHNlOworICAgICAgICBtVHJpZ2dlcmVkID0gZmFsc2U7CisgICAgICAgIG1PdGhlclNsaWRlci5zaG93KHRydWUpOworICAgICAgICBtQ3VycmVudFNsaWRlci5yZXNldChmYWxzZSk7CisgICAgICAgIG1DdXJyZW50U2xpZGVyLmhpZGVUYXJnZXQoKTsKKyAgICAgICAgbUN1cnJlbnRTbGlkZXIgPSBudWxsOworICAgICAgICBtT3RoZXJTbGlkZXIgPSBudWxsOworICAgICAgICBzZXRHcmFiYmVkU3RhdGUoT25UcmlnZ2VyTGlzdGVuZXIuTk9fSEFORExFKTsKKyAgICB9CisKICAgICB2b2lkIHN0YXJ0QW5pbWF0aW5nKGZpbmFsIGJvb2xlYW4gaG9sZEFmdGVyKSB7CiAgICAgICAgIG1BbmltYXRpbmcgPSB0cnVlOwogICAgICAgICBmaW5hbCBBbmltYXRpb24gdHJhbnMxOwpAQCAtODMyLDYgKzgzOCwxNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25WaXNpYmlsaXR5Q2hhbmdlZChWaWV3IGNoYW5nZWRWaWV3LCBpbnQgdmlzaWJpbGl0eSkgeworICAgICAgICBzdXBlci5vblZpc2liaWxpdHlDaGFuZ2VkKGNoYW5nZWRWaWV3LCB2aXNpYmlsaXR5KTsKKyAgICAgICAgLy8gV2hlbiB2aXNpYmlsaXR5IGNoYW5nZXMgYW5kIHRoZSB1c2VyIGhhcyBhIHRhYiBzZWxlY3RlZCwgdW5zZWxlY3QgaXQgYW5kCisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGVpciBjYWxsYmFjayBnZXRzIGNhbGxlZC4KKyAgICAgICAgaWYgKGNoYW5nZWRWaWV3ID09IHRoaXMgJiYgdmlzaWJpbGl0eSAhPSBWSVNJQkxFCisgICAgICAgICAgICAgICAgJiYgbUdyYWJiZWRTdGF0ZSAhPSBPblRyaWdnZXJMaXN0ZW5lci5OT19IQU5ETEUpIHsKKyAgICAgICAgICAgIGNhbmNlbEdyYWIoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGN1cnJlbnQgZ3JhYmJlZCBzdGF0ZSwgYW5kIGRpc3BhdGNoZXMgYSBncmFiYmVkIHN0YXRlIGNoYW5nZQogICAgICAqIGV2ZW50IHRvIG91ciBsaXN0ZW5lci4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvV2F2ZVZpZXcuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvV2F2ZVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGVlN2VlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9XYXZlVmlldy5qYXZhCkBAIC0wLDAgKzEsNTczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlZpYnJhdG9yOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworCisvKioKKyAqIEEgc3BlY2lhbCB3aWRnZXQgY29udGFpbmluZyBhIGNlbnRlciBhbmQgb3V0ZXIgcmluZy4gTW92aW5nIHRoZSBjZW50ZXIgcmluZyB0byB0aGUgb3V0ZXIgcmluZworICogY2F1c2VzIGFuIGV2ZW50IHRoYXQgY2FuIGJlIGNhdWdodCBieSBpbXBsZW1lbnRpbmcgT25UcmlnZ2VyTGlzdGVuZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBXYXZlVmlldyBleHRlbmRzIFZpZXcgaW1wbGVtZW50cyBWYWx1ZUFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiV2F2ZVZpZXciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBVkVfQ09VTlQgPSA1OyAvLyBkZWZhdWx0IHdhdmUgY291bnQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFZJQlJBVEVfU0hPUlQgPSAyMDsgIC8vIG1zZWMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFZJQlJBVEVfTE9ORyA9IDIwOyAgLy8gbXNlYworCisgICAgLy8gTG9jayBzdGF0ZSBtYWNoaW5lIHN0YXRlcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9SRVNFVF9MT0NLID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUkVBRFkgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9TVEFSVF9BVFRFTVBUID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQVRURU1QVElORyA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1VOTE9DS19BVFRFTVBUID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVU5MT0NLX1NVQ0NFU1MgPSA1OworCisgICAgLy8gQW5pbWF0aW9uIHByb3BlcnRpZXMuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBEVVJBVElPTiA9IDUwMDsgLy8gZHVyYXRpb24gb2YgdHJhbnNpdGlvbmFsIGFuaW1hdGlvbnMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEZJTkFMX0RFTEFZID0gMTMwMDsgLy8gZGVsYXkgZm9yIGZpbmFsIGFuaW1hdGlvbnMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNIT1JUX0RFTEFZID0gMTAwOyAvLyBmb3Igc3RhcnRpbmcgb25lIGFuaW1hdGlvbiBhZnRlciBhbm90aGVyLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgV0FWRV9EVVJBVElPTiA9IDIwMDA7IC8vIGFtb3VudCBvZiB0aW1lIGZvciB3YXkgdG8gZXhwYW5kL2RlY2F5CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBSRVNFVF9USU1FT1VUID0gMzAwMDsgLy8gZWxhcHNlZCB0aW1lIG9mIGluYWN0aXZpdHkgYmVmb3JlIHdlIHJlc2V0CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUxBWV9JTkNSRU1FTlQgPSAxNTsgLy8gaW5jcmVtZW50IHBlciB3YXZlIHdoaWxlIHRyYWNraW5nIG1vdGlvbgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVMQVlfSU5DUkVNRU5UMiA9IDEyOyAvLyBpbmNyZW1lbnQgcGVyIHdhdmUgd2hpbGUgbm90IHRyYWNraW5nCisKKyAgICBwcml2YXRlIFZpYnJhdG9yIG1WaWJyYXRvcjsKKyAgICBwcml2YXRlIE9uVHJpZ2dlckxpc3RlbmVyIG1PblRyaWdnZXJMaXN0ZW5lcjsKKyAgICBwcml2YXRlIEFycmF5TGlzdDxEcmF3YWJsZUhvbGRlcj4gbURyYXdhYmxlcyA9IG5ldyBBcnJheUxpc3Q8RHJhd2FibGVIb2xkZXI+KDMpOworICAgIHByaXZhdGUgQXJyYXlMaXN0PERyYXdhYmxlSG9sZGVyPiBtTGlnaHRXYXZlcyA9IG5ldyBBcnJheUxpc3Q8RHJhd2FibGVIb2xkZXI+KFdBVkVfQ09VTlQpOworICAgIHByaXZhdGUgYm9vbGVhbiBtRmluZ2VyRG93biA9IGZhbHNlOworICAgIHByaXZhdGUgZmxvYXQgbVJpbmdSYWRpdXMgPSAxODIuMGY7IC8vIFJhZGl1cyBvZiBiaXRtYXAgcmluZy4gVXNlZCB0byBzbmFwIGhhbG8gdG8gaXQKKyAgICBwcml2YXRlIGludCBtU25hcFJhZGl1cyA9IDEzNjsgLy8gbWluaW11bSB0aHJlc2hvbGQgZm9yIGRyYWcgdW5sb2NrCisgICAgcHJpdmF0ZSBpbnQgbVdhdmVEZWxheSA9IDI0MDsgLy8gdGltZSB0byBkZWxheQorICAgIHByaXZhdGUgaW50IG1XYXZlQ291bnQgPSBXQVZFX0NPVU5UOyAgLy8gbnVtYmVyIG9mIHdhdmVzCisgICAgcHJpdmF0ZSBsb25nIG1XYXZlVGltZXJEZWxheSA9IG1XYXZlRGVsYXk7CisgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRXYXZlID0gMDsKKyAgICBwcml2YXRlIGZsb2F0IG1Mb2NrQ2VudGVyWDsgLy8gY2VudGVyIG9mIHdpZGdldCBhcyBkaWN0YXRlZCBieSB3aWRnZXQgc2l6ZQorICAgIHByaXZhdGUgZmxvYXQgbUxvY2tDZW50ZXJZOworICAgIHByaXZhdGUgZmxvYXQgbU1vdXNlWDsgLy8gY3VycmVudCBtb3VzZSBwb3NpdGlvbiBhcyBvZiBsYXN0IHRvdWNoIGV2ZW50CisgICAgcHJpdmF0ZSBmbG9hdCBtTW91c2VZOworICAgIHByaXZhdGUgRHJhd2FibGVIb2xkZXIgbVVubG9ja1Jpbmc7CisgICAgcHJpdmF0ZSBEcmF3YWJsZUhvbGRlciBtVW5sb2NrRGVmYXVsdDsKKyAgICBwcml2YXRlIERyYXdhYmxlSG9sZGVyIG1VbmxvY2tIYWxvOworICAgIHByaXZhdGUgaW50IG1Mb2NrU3RhdGUgPSBTVEFURV9SRVNFVF9MT0NLOworICAgIHByaXZhdGUgaW50IG1HcmFiYmVkU3RhdGUgPSBPblRyaWdnZXJMaXN0ZW5lci5OT19IQU5ETEU7CisKKyAgICBwdWJsaWMgV2F2ZVZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIFdhdmVWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKworICAgICAgICAvLyBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsIFIuc3R5bGVhYmxlLldhdmVWaWV3KTsKKyAgICAgICAgLy8gbU9yaWVudGF0aW9uID0gYS5nZXRJbnQoUi5zdHlsZWFibGUuV2F2ZVZpZXdfb3JpZW50YXRpb24sIEhPUklaT05UQUwpOworICAgICAgICAvLyBhLnJlY3ljbGUoKTsKKworICAgICAgICBpbml0RHJhd2FibGVzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TaXplQ2hhbmdlZChpbnQgdywgaW50IGgsIGludCBvbGR3LCBpbnQgb2xkaCkgeworICAgICAgICBtTG9ja0NlbnRlclggPSAwLjVmICogdzsKKyAgICAgICAgbUxvY2tDZW50ZXJZID0gMC41ZiAqIGg7CisgICAgICAgIHN1cGVyLm9uU2l6ZUNoYW5nZWQodywgaCwgb2xkdywgb2xkaCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCBnZXRTdWdnZXN0ZWRNaW5pbXVtV2lkdGgoKSB7CisgICAgICAgIC8vIFZpZXcgc2hvdWxkIGJlIGxhcmdlIGVub3VnaCB0byBjb250YWluIHRoZSB1bmxvY2sgcmluZyArIGhhbG8KKyAgICAgICAgcmV0dXJuIG1VbmxvY2tSaW5nLmdldFdpZHRoKCkgKyBtVW5sb2NrSGFsby5nZXRXaWR0aCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBpbnQgZ2V0U3VnZ2VzdGVkTWluaW11bUhlaWdodCgpIHsKKyAgICAgICAgLy8gVmlldyBzaG91bGQgYmUgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4gdGhlIHVubG9jayByaW5nICsgaGFsbworICAgICAgICByZXR1cm4gbVVubG9ja1JpbmcuZ2V0SGVpZ2h0KCkgKyBtVW5sb2NrSGFsby5nZXRIZWlnaHQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICBpbnQgd2lkdGhTcGVjTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUod2lkdGhNZWFzdXJlU3BlYyk7CisgICAgICAgIGludCBoZWlnaHRTcGVjTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUoaGVpZ2h0TWVhc3VyZVNwZWMpOworICAgICAgICBpbnQgd2lkdGhTcGVjU2l6ZSA9ICBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOworICAgICAgICBpbnQgaGVpZ2h0U3BlY1NpemUgPSAgTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgIGludCB3aWR0aDsKKyAgICAgICAgaW50IGhlaWdodDsKKworICAgICAgICBpZiAod2lkdGhTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5BVF9NT1NUKSB7CisgICAgICAgICAgICB3aWR0aCA9IE1hdGgubWluKHdpZHRoU3BlY1NpemUsIGdldFN1Z2dlc3RlZE1pbmltdW1XaWR0aCgpKTsKKyAgICAgICAgfSBlbHNlIGlmICh3aWR0aFNwZWNNb2RlID09IE1lYXN1cmVTcGVjLkVYQUNUTFkpIHsKKyAgICAgICAgICAgIHdpZHRoID0gd2lkdGhTcGVjU2l6ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdpZHRoID0gZ2V0U3VnZ2VzdGVkTWluaW11bVdpZHRoKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGVpZ2h0U3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuQVRfTU9TVCkgeworICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5taW4oaGVpZ2h0U3BlY1NpemUsIGdldFN1Z2dlc3RlZE1pbmltdW1XaWR0aCgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChoZWlnaHRTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5FWEFDVExZKSB7CisgICAgICAgICAgICBoZWlnaHQgPSBoZWlnaHRTcGVjU2l6ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhlaWdodCA9IGdldFN1Z2dlc3RlZE1pbmltdW1IZWlnaHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0RHJhd2FibGVzKCkgeworICAgICAgICBtVW5sb2NrUmluZyA9IG5ldyBEcmF3YWJsZUhvbGRlcihjcmVhdGVEcmF3YWJsZShSLmRyYXdhYmxlLnVubG9ja19yaW5nKSkKKyAgICAgICAgICAgIC5zZXRYKG1Mb2NrQ2VudGVyWCkuc2V0WShtTG9ja0NlbnRlclkpLnNldFNjYWxlWCgwLjFmKS5zZXRTY2FsZVkoMC4xZikuc2V0QWxwaGEoMC4wZik7CisgICAgICAgIG1EcmF3YWJsZXMuYWRkKG1VbmxvY2tSaW5nKTsKKworICAgICAgICBtVW5sb2NrRGVmYXVsdCA9IG5ldyBEcmF3YWJsZUhvbGRlcihjcmVhdGVEcmF3YWJsZShSLmRyYXdhYmxlLnVubG9ja19kZWZhdWx0KSkKKyAgICAgICAgICAgIC5zZXRYKG1Mb2NrQ2VudGVyWCkuc2V0WShtTG9ja0NlbnRlclkpLnNldFNjYWxlWCgwLjFmKS5zZXRTY2FsZVkoMC4xZikuc2V0QWxwaGEoMC4wZik7CisgICAgICAgIG1EcmF3YWJsZXMuYWRkKG1VbmxvY2tEZWZhdWx0KTsKKworICAgICAgICBtVW5sb2NrSGFsbyA9IG5ldyBEcmF3YWJsZUhvbGRlcihjcmVhdGVEcmF3YWJsZShSLmRyYXdhYmxlLnVubG9ja19oYWxvKSkKKyAgICAgICAgICAgIC5zZXRYKG1Mb2NrQ2VudGVyWCkuc2V0WShtTG9ja0NlbnRlclkpLnNldFNjYWxlWCgwLjFmKS5zZXRTY2FsZVkoMC4xZikuc2V0QWxwaGEoMC4wZik7CisgICAgICAgIG1EcmF3YWJsZXMuYWRkKG1VbmxvY2tIYWxvKTsKKworICAgICAgICBCaXRtYXBEcmF3YWJsZSB3YXZlID0gY3JlYXRlRHJhd2FibGUoUi5kcmF3YWJsZS51bmxvY2tfd2F2ZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVdhdmVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBEcmF3YWJsZUhvbGRlciBob2xkZXIgPSBuZXcgRHJhd2FibGVIb2xkZXIod2F2ZSk7CisgICAgICAgICAgICBtTGlnaHRXYXZlcy5hZGQoaG9sZGVyKTsKKyAgICAgICAgICAgIGhvbGRlci5zZXRBbHBoYSgwLjBmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3YXZlVXBkYXRlRnJhbWUoZmxvYXQgbW91c2VYLCBmbG9hdCBtb3VzZVksIGJvb2xlYW4gZmluZ2VyRG93bikgeworICAgICAgICBkb3VibGUgZGlzdFggPSBtb3VzZVggLSBtTG9ja0NlbnRlclg7CisgICAgICAgIGRvdWJsZSBkaXN0WSA9IG1vdXNlWSAtIG1Mb2NrQ2VudGVyWTsKKyAgICAgICAgaW50IGRyYWdEaXN0YW5jZSA9IChpbnQpIE1hdGguY2VpbChNYXRoLmh5cG90KGRpc3RYLCBkaXN0WSkpOworICAgICAgICBkb3VibGUgdG91Y2hBID0gTWF0aC5hdGFuMihkaXN0WCwgZGlzdFkpOworICAgICAgICBmbG9hdCByaW5nWCA9IChmbG9hdCkgKG1Mb2NrQ2VudGVyWCArIG1SaW5nUmFkaXVzICogTWF0aC5zaW4odG91Y2hBKSk7CisgICAgICAgIGZsb2F0IHJpbmdZID0gKGZsb2F0KSAobUxvY2tDZW50ZXJZICsgbVJpbmdSYWRpdXMgKiBNYXRoLmNvcyh0b3VjaEEpKTsKKworICAgICAgICBzd2l0Y2ggKG1Mb2NrU3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfUkVTRVRfTE9DSzoKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJTdGF0ZSBSRVNFVF9MT0NLIik7CisgICAgICAgICAgICAgICAgbVdhdmVUaW1lckRlbGF5ID0gbVdhdmVEZWxheTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1MaWdodFdhdmVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIC8vVHdlZW5NYXgudG8obUxpZ2h0V2F2ZS5nZXQoaSksIC4zLCB7YWxwaGE6MCwgZWFzZTpRdWludC5lYXNlT3V0fSk7CisgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlSG9sZGVyIGhvbGRlciA9IG1MaWdodFdhdmVzLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgaG9sZGVyLmFkZEFuaW1UbygzMDAsIDAsICJhbHBoYSIsIDAuMGYsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTGlnaHRXYXZlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBtTGlnaHRXYXZlcy5nZXQoaSkuc3RhcnRBbmltYXRpb25zKHRoaXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vVHdlZW5NYXgudG8odW5sb2NrUmluZywgLjUsIHsgeDogbG9ja1gsIHk6IGxvY2tZLCBzY2FsZVg6IC4xLCBzY2FsZVk6IC4xLAorICAgICAgICAgICAgICAgIC8vIGFscGhhOiAwLCBvdmVyd3JpdGU6IHRydWUsIGVhc2U6UXVpbnQuZWFzZU91dCAgIH0pOworICAgICAgICAgICAgICAgIG1VbmxvY2tSaW5nLmFkZEFuaW1UbyhEVVJBVElPTiwgMCwgIngiLCBtTG9ja0NlbnRlclgsIHRydWUpOworICAgICAgICAgICAgICAgIG1VbmxvY2tSaW5nLmFkZEFuaW1UbyhEVVJBVElPTiwgMCwgInkiLCBtTG9ja0NlbnRlclksIHRydWUpOworICAgICAgICAgICAgICAgIG1VbmxvY2tSaW5nLmFkZEFuaW1UbyhEVVJBVElPTiwgMCwgInNjYWxlWCIsIDAuMWYsIHRydWUpOworICAgICAgICAgICAgICAgIG1VbmxvY2tSaW5nLmFkZEFuaW1UbyhEVVJBVElPTiwgMCwgInNjYWxlWSIsIDAuMWYsIHRydWUpOworICAgICAgICAgICAgICAgIG1VbmxvY2tSaW5nLmFkZEFuaW1UbyhEVVJBVElPTiwgMCwgImFscGhhIiwgMC4wZiwgdHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAvL1R3ZWVuTWF4LnRvKHVubG9ja0RlZmF1bHQsIDAsIHsgeDogbG9ja1gsIHk6IGxvY2tZLCBzY2FsZVg6IC4xLCBzY2FsZVk6IC4xLAorICAgICAgICAgICAgICAgIC8vIGFscGhhOiAwICAsIG92ZXJ3cml0ZTogdHJ1ZSAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgbVVubG9ja0RlZmF1bHQucmVtb3ZlQW5pbWF0aW9uRm9yKCJ4Iik7CisgICAgICAgICAgICAgICAgbVVubG9ja0RlZmF1bHQucmVtb3ZlQW5pbWF0aW9uRm9yKCJ5Iik7CisgICAgICAgICAgICAgICAgbVVubG9ja0RlZmF1bHQucmVtb3ZlQW5pbWF0aW9uRm9yKCJzY2FsZVgiKTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrRGVmYXVsdC5yZW1vdmVBbmltYXRpb25Gb3IoInNjYWxlWSIpOworICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LnJlbW92ZUFuaW1hdGlvbkZvcigiYWxwaGEiKTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrRGVmYXVsdC5zZXRYKG1Mb2NrQ2VudGVyWCkuc2V0WShtTG9ja0NlbnRlclkpLnNldFNjYWxlWCgwLjFmKS5zZXRTY2FsZVkoMC4xZikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBbHBoYSgwLjBmKTsKKworICAgICAgICAgICAgICAgIC8vVHdlZW5NYXgudG8odW5sb2NrRGVmYXVsdCwgLjUsIHsgZGVsYXk6IC4xLCBzY2FsZVg6IDEsIHNjYWxlWTogMSwKKyAgICAgICAgICAgICAgICAvLyBhbHBoYTogMSwgb3ZlcndyaXRlOiB0cnVlLCBlYXNlOlF1aW50LmVhc2VPdXQgICB9KTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrRGVmYXVsdC5hZGRBbmltVG8oRFVSQVRJT04sIFNIT1JUX0RFTEFZLCAic2NhbGVYIiwgMS4wZiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgbVVubG9ja0RlZmF1bHQuYWRkQW5pbVRvKERVUkFUSU9OLCBTSE9SVF9ERUxBWSwgInNjYWxlWSIsIDEuMGYsIHRydWUpOworICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LmFkZEFuaW1UbyhEVVJBVElPTiwgU0hPUlRfREVMQVksICJhbHBoYSIsIDEuMGYsIHRydWUpOworCisgICAgICAgICAgICAgICAgLy9Ud2Vlbk1heC50byh1bmxvY2tIYWxvLCAwLCB7IHg6IGxvY2tYLCB5OiBsb2NrWSwgc2NhbGVYOi4xLCBzY2FsZVk6IC4xLAorICAgICAgICAgICAgICAgIC8vIGFscGhhOiAwICAsIG92ZXJ3cml0ZTogdHJ1ZSAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgbVVubG9ja0hhbG8ucmVtb3ZlQW5pbWF0aW9uRm9yKCJ4Iik7CisgICAgICAgICAgICAgICAgbVVubG9ja0hhbG8ucmVtb3ZlQW5pbWF0aW9uRm9yKCJ5Iik7CisgICAgICAgICAgICAgICAgbVVubG9ja0hhbG8ucmVtb3ZlQW5pbWF0aW9uRm9yKCJzY2FsZVgiKTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrSGFsby5yZW1vdmVBbmltYXRpb25Gb3IoInNjYWxlWSIpOworICAgICAgICAgICAgICAgIG1VbmxvY2tIYWxvLnJlbW92ZUFuaW1hdGlvbkZvcigiYWxwaGEiKTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrSGFsby5zZXRYKG1Mb2NrQ2VudGVyWCkuc2V0WShtTG9ja0NlbnRlclkpLnNldFNjYWxlWCgwLjFmKS5zZXRTY2FsZVkoMC4xZikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBbHBoYSgwLjBmKTsKKworICAgICAgICAgICAgICAgIC8vVHdlZW5NYXgudG8odW5sb2NrSGFsbywgLjUsIHsgeDogbG9ja1gsIHk6IGxvY2tZLCBzY2FsZVg6IDEsIHNjYWxlWTogMSwKKyAgICAgICAgICAgICAgICAvLyBhbHBoYTogMSAgLCBvdmVyd3JpdGU6IHRydWUsIGVhc2U6UXVpbnQuZWFzZU91dCAgIH0pOworICAgICAgICAgICAgICAgIG1VbmxvY2tIYWxvLmFkZEFuaW1UbyhEVVJBVElPTiwgU0hPUlRfREVMQVksICJ4IiwgbUxvY2tDZW50ZXJYLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrSGFsby5hZGRBbmltVG8oRFVSQVRJT04sIFNIT1JUX0RFTEFZLCAieSIsIG1Mb2NrQ2VudGVyWSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgbVVubG9ja0hhbG8uYWRkQW5pbVRvKERVUkFUSU9OLCBTSE9SVF9ERUxBWSwgInNjYWxlWCIsIDEuMGYsIHRydWUpOworICAgICAgICAgICAgICAgIG1VbmxvY2tIYWxvLmFkZEFuaW1UbyhEVVJBVElPTiwgU0hPUlRfREVMQVksICJzY2FsZVkiLCAxLjBmLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrSGFsby5hZGRBbmltVG8oRFVSQVRJT04sIFNIT1JUX0RFTEFZLCAiYWxwaGEiLCAxLjBmLCB0cnVlKTsKKworICAgICAgICAgICAgICAgIC8vbG9ja1RpbWVyLnN0b3AoKTsKKyAgICAgICAgICAgICAgICByZW1vdmVDYWxsYmFja3MobUxvY2tUaW1lckFjdGlvbnMpOworCisgICAgICAgICAgICAgICAgbUxvY2tTdGF0ZSA9IFNUQVRFX1JFQURZOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNUQVRFX1JFQURZOgorICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIlN0YXRlIFJFQURZIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfU1RBUlRfQVRURU1QVDoKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJTdGF0ZSBTVEFSVF9BVFRFTVBUIik7CisgICAgICAgICAgICAgICAgLy9Ud2Vlbk1heC50byh1bmxvY2tEZWZhdWx0LCAwLCB7c2NhbGVYOiAuMSwgc2NhbGVZOi4xLCBhbHBoYTogMCwKKyAgICAgICAgICAgICAgICAvLyB4OmxvY2tYICsxODIsIHk6IGxvY2tZICAsIG92ZXJ3cml0ZTogdHJ1ZSAgIH0pOworICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LnJlbW92ZUFuaW1hdGlvbkZvcigieCIpOworICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LnJlbW92ZUFuaW1hdGlvbkZvcigieSIpOworICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LnJlbW92ZUFuaW1hdGlvbkZvcigic2NhbGVYIik7CisgICAgICAgICAgICAgICAgbVVubG9ja0RlZmF1bHQucmVtb3ZlQW5pbWF0aW9uRm9yKCJzY2FsZVkiKTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrRGVmYXVsdC5yZW1vdmVBbmltYXRpb25Gb3IoImFscGhhIik7CisgICAgICAgICAgICAgICAgbVVubG9ja0RlZmF1bHQuc2V0WChtTG9ja0NlbnRlclggKyAxODIpLnNldFkobUxvY2tDZW50ZXJZKS5zZXRTY2FsZVgoMC4xZikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTY2FsZVkoMC4xZikuc2V0QWxwaGEoMC4wZik7CisKKyAgICAgICAgICAgICAgICAvL1R3ZWVuTWF4LnRvKHVubG9ja0RlZmF1bHQsIDAuNSwgeyBkZWxheTogLjEgICAsIHNjYWxlWDogMSwgc2NhbGVZOiAxLAorICAgICAgICAgICAgICAgIC8vIGFscGhhOiAxLCBlYXNlOlF1aW50LmVhc2VPdXQgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrRGVmYXVsdC5hZGRBbmltVG8oRFVSQVRJT04sIFNIT1JUX0RFTEFZLCAic2NhbGVYIiwgMS4wZiwgZmFsc2UpOworICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LmFkZEFuaW1UbyhEVVJBVElPTiwgU0hPUlRfREVMQVksICJzY2FsZVkiLCAxLjBmLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgbVVubG9ja0RlZmF1bHQuYWRkQW5pbVRvKERVUkFUSU9OLCBTSE9SVF9ERUxBWSwgImFscGhhIiwgMS4wZiwgZmFsc2UpOworCisgICAgICAgICAgICAgICAgLy9Ud2Vlbk1heC50byh1bmxvY2tSaW5nLCAwLjUsIHtzY2FsZVg6IDEsIHNjYWxlWTogMSwKKyAgICAgICAgICAgICAgICAvLyBhbHBoYTogMSwgZWFzZTpRdWludC5lYXNlT3V0LCBvdmVyd3JpdGU6IHRydWUgICB9KTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrUmluZy5hZGRBbmltVG8oRFVSQVRJT04sIDAsICJzY2FsZVgiLCAxLjBmLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrUmluZy5hZGRBbmltVG8oRFVSQVRJT04sIDAsICJzY2FsZVkiLCAxLjBmLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBtVW5sb2NrUmluZy5hZGRBbmltVG8oRFVSQVRJT04sIDAsICJhbHBoYSIsIDEuMGYsIHRydWUpOworCisgICAgICAgICAgICAgICAgcG9zdERlbGF5ZWQobUFkZFdhdmVBY3Rpb24sIG1XYXZlVGltZXJEZWxheSk7CisKKyAgICAgICAgICAgICAgICBtTG9ja1N0YXRlID0gU1RBVEVfQVRURU1QVElORzsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTVEFURV9BVFRFTVBUSU5HOgorICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIlN0YXRlIEFUVEVNUFRJTkciKTsKKyAgICAgICAgICAgICAgICAvL1R3ZWVuTWF4LnRvKHVubG9ja0hhbG8sIDAuNCwgeyB4Om1vdXNlWCwgeTptb3VzZVksIHNjYWxlWDoxLCBzY2FsZVk6MSwKKyAgICAgICAgICAgICAgICAvLyBhbHBoYTogMSwgZWFzZTpRdWludC5lYXNlT3V0IH0pOworICAgICAgICAgICAgICAgIGlmIChkcmFnRGlzdGFuY2UgPiBtU25hcFJhZGl1cykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmluZ2VyRG93bikgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9Ud2Vlbk1heC50byh1bmxvY2tIYWxvLCAwLjQsIHt4OnJpbmdYLCB5OnJpbmdZLCBzY2FsZVg6MSwgc2NhbGVZOjEsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHBoYTogMSAsIGVhc2U6UXVpbnQuZWFzZU91dCAgICAsIG92ZXJ3cml0ZTogdHJ1ZSB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tIYWxvLmFkZEFuaW1UbygwLCAwLCAieCIsIHJpbmdYLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tIYWxvLmFkZEFuaW1UbygwLCAwLCAieSIsIHJpbmdZLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tIYWxvLmFkZEFuaW1UbygwLCAwLCAic2NhbGVYIiwgMS4wZiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVW5sb2NrSGFsby5hZGRBbmltVG8oMCwgMCwgInNjYWxlWSIsIDEuMGYsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVVubG9ja0hhbG8uYWRkQW5pbVRvKDAsIDAsICJhbHBoYSIsIDEuMGYsIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9ICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrU3RhdGUgPSBTVEFURV9VTkxPQ0tfQVRURU1QVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tIYWxvLmFkZEFuaW1UbygwLCAwLCAieCIsIG1vdXNlWCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tIYWxvLmFkZEFuaW1UbygwLCAwLCAieSIsIG1vdXNlWSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tIYWxvLmFkZEFuaW1UbygwLCAwLCAic2NhbGVYIiwgMS4wZiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tIYWxvLmFkZEFuaW1UbygwLCAwLCAic2NhbGVZIiwgMS4wZiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tIYWxvLmFkZEFuaW1UbygwLCAwLCAiYWxwaGEiLCAxLjBmLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfVU5MT0NLX0FUVEVNUFQ6CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiU3RhdGUgVU5MT0NLX0FUVEVNUFQiKTsKKyAgICAgICAgICAgICAgICBpZiAoZHJhZ0Rpc3RhbmNlID4gbVNuYXBSYWRpdXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBtTGlnaHRXYXZlcy5zaXplKCk7IG4rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9Ud2Vlbk1heC50byh0aGlzWyJsaWdodFdhdmUiK25dLCAuNSx7YWxwaGE6MCwgZGVsYXk6ICg2K24tY3VycmVudFdhdmUpKi4xLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8geDpyaW5nWCwgeTpyaW5nWSwgc2NhbGVYOiAuMSwgc2NhbGVZOiAuMSwgZWFzZTpRdWludC5lYXNlT3V0fSk7CisgICAgICAgICAgICAgICAgICAgICAgICBEcmF3YWJsZUhvbGRlciB3YXZlID0gbUxpZ2h0V2F2ZXMuZ2V0KG4pOworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkZWxheSA9IDEwMDBMKig2ICsgbiAtIG1DdXJyZW50V2F2ZSkvMTBMOworICAgICAgICAgICAgICAgICAgICAgICAgd2F2ZS5hZGRBbmltVG8oRFVSQVRJT04sIGRlbGF5LCAieCIsIHJpbmdYLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhdmUuYWRkQW5pbVRvKERVUkFUSU9OLCBkZWxheSwgInkiLCByaW5nWSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3YXZlLmFkZEFuaW1UbyhEVVJBVElPTiwgZGVsYXksICJzY2FsZVgiLCAwLjFmLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhdmUuYWRkQW5pbVRvKERVUkFUSU9OLCBkZWxheSwgInNjYWxlWSIsIDAuMWYsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgd2F2ZS5hZGRBbmltVG8oRFVSQVRJT04sIGRlbGF5LCAiYWxwaGEiLCAwLjBmLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1MaWdodFdhdmVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTGlnaHRXYXZlcy5nZXQoaSkuc3RhcnRBbmltYXRpb25zKHRoaXMpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy9Ud2Vlbk1heC50byh1bmxvY2tSaW5nLCAuNSwge3g6cmluZ1gsIHk6IHJpbmdZLCBzY2FsZVg6IC4xLCBzY2FsZVk6IC4xLAorICAgICAgICAgICAgICAgICAgICAvLyBhbHBoYTogMCwgZWFzZTogUXVpbnQuZWFzZU91dCAgIH0pOworICAgICAgICAgICAgICAgICAgICBtVW5sb2NrUmluZy5hZGRBbmltVG8oRFVSQVRJT04sIDAsICJ4IiwgcmluZ1gsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgbVVubG9ja1JpbmcuYWRkQW5pbVRvKERVUkFUSU9OLCAwLCAieSIsIHJpbmdZLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tSaW5nLmFkZEFuaW1UbyhEVVJBVElPTiwgMCwgInNjYWxlWCIsIDAuMWYsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgbVVubG9ja1JpbmcuYWRkQW5pbVRvKERVUkFUSU9OLCAwLCAic2NhbGVZIiwgMC4xZiwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBtVW5sb2NrUmluZy5hZGRBbmltVG8oRFVSQVRJT04sIDAsICJhbHBoYSIsIDAuMGYsIGZhbHNlKTsKKworICAgICAgICAgICAgICAgICAgICAvL1R3ZWVuTWF4LnRvKHVubG9ja1JpbmcsIC41LCB7IGRlbGF5OiAxLjMsIGFscGhhOiAwICAsIGVhc2U6IFF1aW50LmVhc2VPdXQgfSk7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tSaW5nLmFkZEFuaW1UbyhEVVJBVElPTiwgRklOQUxfREVMQVksICJhbHBoYSIsIDAuMGYsIGZhbHNlKTsKKworICAgICAgICAgICAgICAgICAgICAvL1R3ZWVuTWF4LnRvKHVubG9ja0RlZmF1bHQsIDAsIHsgeDpyaW5nWCwgeTogcmluZ1ksIHNjYWxlWDogLjEsIHNjYWxlWTogLjEsCisgICAgICAgICAgICAgICAgICAgIC8vIGFscGhhOiAwICAsIG92ZXJ3cml0ZTogdHJ1ZSB9KTsKKyAgICAgICAgICAgICAgICAgICAgbVVubG9ja0RlZmF1bHQucmVtb3ZlQW5pbWF0aW9uRm9yKCJ4Iik7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LnJlbW92ZUFuaW1hdGlvbkZvcigieSIpOworICAgICAgICAgICAgICAgICAgICBtVW5sb2NrRGVmYXVsdC5yZW1vdmVBbmltYXRpb25Gb3IoInNjYWxlWCIpOworICAgICAgICAgICAgICAgICAgICBtVW5sb2NrRGVmYXVsdC5yZW1vdmVBbmltYXRpb25Gb3IoInNjYWxlWSIpOworICAgICAgICAgICAgICAgICAgICBtVW5sb2NrRGVmYXVsdC5yZW1vdmVBbmltYXRpb25Gb3IoImFscGhhIik7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LnNldFgocmluZ1gpLnNldFkocmluZ1kpLnNldFNjYWxlWCgwLjFmKS5zZXRTY2FsZVkoMC4xZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QWxwaGEoMC4wZik7CisKKyAgICAgICAgICAgICAgICAgICAgLy9Ud2Vlbk1heC50byh1bmxvY2tEZWZhdWx0LCAuNSwgeyB4OnJpbmdYLCB5OiByaW5nWSwgc2NhbGVYOiAxLCBzY2FsZVk6IDEsCisgICAgICAgICAgICAgICAgICAgIC8vIGFscGhhOiAxICAsIGVhc2U6IFF1aW50LmVhc2VPdXQgICwgb3ZlcndyaXRlOiB0cnVlIH0pOworICAgICAgICAgICAgICAgICAgICBtVW5sb2NrRGVmYXVsdC5hZGRBbmltVG8oRFVSQVRJT04sIDAsICJ4IiwgcmluZ1gsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBtVW5sb2NrRGVmYXVsdC5hZGRBbmltVG8oRFVSQVRJT04sIDAsICJ5IiwgcmluZ1ksIHRydWUpOworICAgICAgICAgICAgICAgICAgICBtVW5sb2NrRGVmYXVsdC5hZGRBbmltVG8oRFVSQVRJT04sIDAsICJzY2FsZVgiLCAxLjBmLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgbVVubG9ja0RlZmF1bHQuYWRkQW5pbVRvKERVUkFUSU9OLCAwLCAic2NhbGVZIiwgMS4wZiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LmFkZEFuaW1UbyhEVVJBVElPTiwgMCwgImFscGhhIiwgMS4wZiwgdHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy9Ud2Vlbk1heC50byh1bmxvY2tEZWZhdWx0LCAuNSwgeyBkZWxheTogMS4zLCBzY2FsZVg6IDMsIHNjYWxlWTogMywKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxwaGE6IDEsIGVhc2U6IFF1aW50LmVhc2VPdXQgfSk7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LmFkZEFuaW1UbyhEVVJBVElPTiwgRklOQUxfREVMQVksICJzY2FsZVgiLCAzLjBmLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LmFkZEFuaW1UbyhEVVJBVElPTiwgRklOQUxfREVMQVksICJzY2FsZVkiLCAzLjBmLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIG1VbmxvY2tEZWZhdWx0LmFkZEFuaW1UbyhEVVJBVElPTiwgRklOQUxfREVMQVksICJhbHBoYSIsIDEuMGYsIGZhbHNlKTsKKworICAgICAgICAgICAgICAgICAgICAvL1R3ZWVuTWF4LnRvKHVubG9ja0hhbG8sIC41LCB7IHg6cmluZ1gsIHk6IHJpbmdZICwgZWFzZTogQmFjay5lYXNlT3V0ICAgIH0pOworICAgICAgICAgICAgICAgICAgICBtVW5sb2NrSGFsby5hZGRBbmltVG8oRFVSQVRJT04sIDAsICJ4IiwgcmluZ1gsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgbVVubG9ja0hhbG8uYWRkQW5pbVRvKERVUkFUSU9OLCAwLCAieSIsIHJpbmdZLCBmYWxzZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy9Ud2Vlbk1heC50byh1bmxvY2tIYWxvLCAuNSwgeyBkZWxheTogMS4zLCBzY2FsZVg6IDMsIHNjYWxlWTogMywKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxwaGE6IDEsIGVhc2U6IFF1aW50LmVhc2VPdXQgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgbVVubG9ja0hhbG8uYWRkQW5pbVRvKERVUkFUSU9OLCBGSU5BTF9ERUxBWSwgInNjYWxlWCIsIDMuMGYsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgbVVubG9ja0hhbG8uYWRkQW5pbVRvKERVUkFUSU9OLCBGSU5BTF9ERUxBWSwgInNjYWxlWSIsIDMuMGYsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgbVVubG9ja0hhbG8uYWRkQW5pbVRvKERVUkFUSU9OLCBGSU5BTF9ERUxBWSwgImFscGhhIiwgMS4wZiwgZmFsc2UpOworCisgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtTG9ja1RpbWVyQWN0aW9ucyk7CisKKyAgICAgICAgICAgICAgICAgICAgcG9zdERlbGF5ZWQobUxvY2tUaW1lckFjdGlvbnMsIFJFU0VUX1RJTUVPVVQpOworCisgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoVHJpZ2dlckV2ZW50KE9uVHJpZ2dlckxpc3RlbmVyLkNFTlRFUl9IQU5ETEUpOworICAgICAgICAgICAgICAgICAgICBtTG9ja1N0YXRlID0gU1RBVEVfVU5MT0NLX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2tTdGF0ZSA9IFNUQVRFX1JFU0VUX0xPQ0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNUQVRFX1VOTE9DS19TVUNDRVNTOgorICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIlN0YXRlIFVOTE9DS19TVUNDRVNTIik7CisgICAgICAgICAgICAgICAgcmVtb3ZlQ2FsbGJhY2tzKG1BZGRXYXZlQWN0aW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJVbmtub3duIHN0YXRlICIgKyBtTG9ja1N0YXRlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtVW5sb2NrRGVmYXVsdC5zdGFydEFuaW1hdGlvbnModGhpcyk7CisgICAgICAgIG1VbmxvY2tIYWxvLnN0YXJ0QW5pbWF0aW9ucyh0aGlzKTsKKyAgICAgICAgbVVubG9ja1Jpbmcuc3RhcnRBbmltYXRpb25zKHRoaXMpOworICAgIH0KKworICAgIEJpdG1hcERyYXdhYmxlIGNyZWF0ZURyYXdhYmxlKGludCByZXNJZCkgeworICAgICAgICBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKHJlcywgcmVzSWQpOworICAgICAgICByZXR1cm4gbmV3IEJpdG1hcERyYXdhYmxlKHJlcywgYml0bWFwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICB3YXZlVXBkYXRlRnJhbWUobU1vdXNlWCwgbU1vdXNlWSwgbUZpbmdlckRvd24pOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1EcmF3YWJsZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIG1EcmF3YWJsZXMuZ2V0KGkpLmRyYXcoY2FudmFzKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1MaWdodFdhdmVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBtTGlnaHRXYXZlcy5nZXQoaSkuZHJhdyhjYW52YXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtTG9ja1RpbWVyQWN0aW9ucyA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiTG9ja1RpbWVyQWN0aW9ucyIpOworICAgICAgICAgICAgLy8gcmVzZXQgbG9jayBhZnRlciBpbmFjdGl2aXR5CisgICAgICAgICAgICBpZiAobUxvY2tTdGF0ZSA9PSBTVEFURV9BVFRFTVBUSU5HKSB7CisgICAgICAgICAgICAgICAgbUxvY2tTdGF0ZSA9IFNUQVRFX1JFU0VUX0xPQ0s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmb3IgcHJvdG90eXBlLCByZXNldCBhZnRlciBzdWNjZXNzZnVsIHVubG9jaworICAgICAgICAgICAgaWYgKG1Mb2NrU3RhdGUgPT0gU1RBVEVfVU5MT0NLX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBtTG9ja1N0YXRlID0gU1RBVEVfUkVTRVRfTE9DSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1BZGRXYXZlQWN0aW9uID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBkb3VibGUgZGlzdFggPSBtTW91c2VYIC0gbUxvY2tDZW50ZXJYOworICAgICAgICAgICAgZG91YmxlIGRpc3RZID0gbU1vdXNlWSAtIG1Mb2NrQ2VudGVyWTsKKyAgICAgICAgICAgIGludCBkcmFnRGlzdGFuY2UgPSAoaW50KSBNYXRoLmNlaWwoTWF0aC5oeXBvdChkaXN0WCwgZGlzdFkpKTsKKyAgICAgICAgICAgIGlmIChtTG9ja1N0YXRlID09IFNUQVRFX0FUVEVNUFRJTkcgJiYgZHJhZ0Rpc3RhbmNlIDwgbVNuYXBSYWRpdXMKKyAgICAgICAgICAgICAgICAgICAgJiYgbVdhdmVUaW1lckRlbGF5ID49IG1XYXZlRGVsYXkpIHsKKyAgICAgICAgICAgICAgICBtV2F2ZVRpbWVyRGVsYXkgPSBNYXRoLm1pbihXQVZFX0RVUkFUSU9OLCBtV2F2ZVRpbWVyRGVsYXkgKyBERUxBWV9JTkNSRU1FTlQpOworCisgICAgICAgICAgICAgICAgRHJhd2FibGVIb2xkZXIgd2F2ZSA9IG1MaWdodFdhdmVzLmdldChtQ3VycmVudFdhdmUpOworICAgICAgICAgICAgICAgIHdhdmUuc2V0QWxwaGEoMC4wZik7CisgICAgICAgICAgICAgICAgd2F2ZS5zZXRTY2FsZVgoMC4yZik7CisgICAgICAgICAgICAgICAgd2F2ZS5zZXRTY2FsZVkoMC4yZik7CisgICAgICAgICAgICAgICAgd2F2ZS5zZXRYKG1Nb3VzZVgpOworICAgICAgICAgICAgICAgIHdhdmUuc2V0WShtTW91c2VZKTsKKworICAgICAgICAgICAgICAgIC8vVHdlZW5NYXgudG8odGhpc1sibGlnaHRXYXZlIitjdXJyZW50V2F2ZV0sIDIsIHsgeDpsb2NrWCAsIHk6bG9ja1ksIGFscGhhOiAxLjUsCisgICAgICAgICAgICAgICAgLy8gc2NhbGVYOiAxLCBzY2FsZVk6MSwgZWFzZTpDdWJpYy5lYXNlT3V0fSk7CisgICAgICAgICAgICAgICAgd2F2ZS5hZGRBbmltVG8oV0FWRV9EVVJBVElPTiwgMCwgIngiLCBtTG9ja0NlbnRlclgsIHRydWUpOworICAgICAgICAgICAgICAgIHdhdmUuYWRkQW5pbVRvKFdBVkVfRFVSQVRJT04sIDAsICJ5IiwgbUxvY2tDZW50ZXJZLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB3YXZlLmFkZEFuaW1UbyhXQVZFX0RVUkFUSU9OKjIvMywgMCwgImFscGhhIiwgMS4wZiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgd2F2ZS5hZGRBbmltVG8oV0FWRV9EVVJBVElPTiwgMCwgInNjYWxlWCIsIDEuMGYsIHRydWUpOworICAgICAgICAgICAgICAgIHdhdmUuYWRkQW5pbVRvKFdBVkVfRFVSQVRJT04sIDAsICJzY2FsZVkiLCAxLjBmLCB0cnVlKTsKKworICAgICAgICAgICAgICAgIC8vVHdlZW5NYXgudG8odGhpc1sibGlnaHRXYXZlIitjdXJyZW50V2F2ZV0sIDEsIHsgZGVsYXk6IDEuMworICAgICAgICAgICAgICAgIC8vICwgYWxwaGE6IDAgICwgZWFzZTpRdWludC5lYXNlT3V0fSk7CisgICAgICAgICAgICAgICAgd2F2ZS5hZGRBbmltVG8oMTAwMCwgRklOQUxfREVMQVksICJhbHBoYSIsIDAuMGYsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB3YXZlLnN0YXJ0QW5pbWF0aW9ucyhXYXZlVmlldy50aGlzKTsKKworICAgICAgICAgICAgICAgIG1DdXJyZW50V2F2ZSA9IChtQ3VycmVudFdhdmUrMSkgJSBtV2F2ZUNvdW50OworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIldhdmVUaW1lckRlbGF5OiBzdGFydCBuZXcgd2F2ZSBpbiAiICsgbVdhdmVUaW1lckRlbGF5KTsKKyAgICAgICAgICAgICAgICBwb3N0RGVsYXllZChtQWRkV2F2ZUFjdGlvbiwgbVdhdmVUaW1lckRlbGF5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVdhdmVUaW1lckRlbGF5ICs9IERFTEFZX0lOQ1JFTUVOVDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIGZpbmFsIGludCBhY3Rpb24gPSBldmVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgbU1vdXNlWCA9IGV2ZW50LmdldFgoKTsKKyAgICAgICAgbU1vdXNlWSA9IGV2ZW50LmdldFkoKTsKKyAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7CisgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOgorICAgICAgICAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtTG9ja1RpbWVyQWN0aW9ucyk7CisgICAgICAgICAgICAgICAgbUZpbmdlckRvd24gPSB0cnVlOworICAgICAgICAgICAgICAgIHNldEdyYWJiZWRTdGF0ZShPblRyaWdnZXJMaXN0ZW5lci5DRU5URVJfSEFORExFKTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHggPSBtTW91c2VYIC0gbVVubG9ja0hhbG8uZ2V0WCgpOworICAgICAgICAgICAgICAgICAgICBmbG9hdCB5ID0gbU1vdXNlWSAtIG1VbmxvY2tIYWxvLmdldFkoKTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGlzdCA9IChmbG9hdCkgTWF0aC5oeXBvdCh4LCB5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3QgPCBtVW5sb2NrSGFsby5nZXRXaWR0aCgpKjAuNWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTG9ja1N0YXRlID09IFNUQVRFX1JFQURZKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2tTdGF0ZSA9IFNUQVRFX1NUQVJUX0FUVEVNUFQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6CisgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOgorICAgICAgICAgICAgICAgIG1GaW5nZXJEb3duID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcG9zdERlbGF5ZWQobUxvY2tUaW1lckFjdGlvbnMsIFJFU0VUX1RJTUVPVVQpOworICAgICAgICAgICAgICAgIHNldEdyYWJiZWRTdGF0ZShPblRyaWdnZXJMaXN0ZW5lci5OT19IQU5ETEUpOworICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6CisgICAgICAgICAgICAgICAgbUZpbmdlckRvd24gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIHJldHVybiBoYW5kbGVkID8gdHJ1ZSA6IHN1cGVyLm9uVG91Y2hFdmVudChldmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJpZ2dlcnMgaGFwdGljIGZlZWRiYWNrLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgdmlicmF0ZShsb25nIGR1cmF0aW9uKSB7CisgICAgICAgIGlmIChtVmlicmF0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgbVZpYnJhdG9yID0gKGFuZHJvaWQub3MuVmlicmF0b3IpCisgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVklCUkFUT1JfU0VSVklDRSk7CisgICAgICAgIH0KKyAgICAgICAgbVZpYnJhdG9yLnZpYnJhdGUoZHVyYXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgdXNlciB0cmlnZ2VycyBhbiBldmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgT25EaWFsVHJpZ2dlckxpc3RlbmVyIHRvIGF0dGFjaCB0byB0aGlzIHZpZXcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPblRyaWdnZXJMaXN0ZW5lcihPblRyaWdnZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtT25UcmlnZ2VyTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNwYXRjaGVzIGEgdHJpZ2dlciBldmVudCB0byBsaXN0ZW5lci4gSWdub3JlZCBpZiBhIGxpc3RlbmVyIGlzIG5vdCBzZXQuCisgICAgICogQHBhcmFtIHdoaWNoSGFuZGxlIHRoZSBoYW5kbGUgdGhhdCB0cmlnZ2VyZWQgdGhlIGV2ZW50LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaFRyaWdnZXJFdmVudChpbnQgd2hpY2hIYW5kbGUpIHsKKyAgICAgICAgdmlicmF0ZShWSUJSQVRFX0xPTkcpOworICAgICAgICBpZiAobU9uVHJpZ2dlckxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1PblRyaWdnZXJMaXN0ZW5lci5vblRyaWdnZXIodGhpcywgd2hpY2hIYW5kbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY3VycmVudCBncmFiYmVkIHN0YXRlLCBhbmQgZGlzcGF0Y2hlcyBhIGdyYWJiZWQgc3RhdGUgY2hhbmdlCisgICAgICogZXZlbnQgdG8gb3VyIGxpc3RlbmVyLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRHcmFiYmVkU3RhdGUoaW50IG5ld1N0YXRlKSB7CisgICAgICAgIGlmIChuZXdTdGF0ZSAhPSBtR3JhYmJlZFN0YXRlKSB7CisgICAgICAgICAgICBtR3JhYmJlZFN0YXRlID0gbmV3U3RhdGU7CisgICAgICAgICAgICBpZiAobU9uVHJpZ2dlckxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtT25UcmlnZ2VyTGlzdGVuZXIub25HcmFiYmVkU3RhdGVDaGFuZ2UodGhpcywgbUdyYWJiZWRTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uVHJpZ2dlckxpc3RlbmVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNlbnQgd2hlbiB0aGUgdXNlciByZWxlYXNlcyB0aGUgaGFuZGxlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fSEFORExFID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2VudCB3aGVuIHRoZSB1c2VyIGdyYWJzIHRoZSBjZW50ZXIgaGFuZGxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRU5URVJfSEFORExFID0gMTA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIGRyYWdzIHRoZSBjZW50ZXIgcmluZyBiZXlvbmQgYSB0aHJlc2hvbGQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uVHJpZ2dlcihWaWV3IHYsIGludCB3aGljaEhhbmRsZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSAiZ3JhYmJlZCBzdGF0ZSIgY2hhbmdlcyAoaS5lLiB3aGVuIHRoZSB1c2VyIGVpdGhlciBncmFicyBvciByZWxlYXNlcworICAgICAgICAgKiBvbmUgb2YgdGhlIGhhbmRsZXMuKQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdiB0aGUgdmlldyB0aGF0IHdhcyB0cmlnZ2VyZWQKKyAgICAgICAgICogQHBhcmFtIGdyYWJiZWRTdGF0ZSB0aGUgbmV3IHN0YXRlOiB7QGxpbmsgI05PX0hBTkRMRX0sIHtAbGluayAjQ0VOVEVSX0hBTkRMRX0sCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uR3JhYmJlZFN0YXRlQ2hhbmdlKFZpZXcgdiwgaW50IGdyYWJiZWRTdGF0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25VcGRhdGUoVmFsdWVBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgaW52YWxpZGF0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICBtTG9ja1N0YXRlID0gU1RBVEVfUkVTRVRfTE9DSzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2puaS9BbmRyb2lkLm1rIGIvY29yZS9qbmkvQW5kcm9pZC5tawppbmRleCBkNTFjMGI3Li42NGEyMzMxIDEwMDY0NAotLS0gYS9jb3JlL2puaS9BbmRyb2lkLm1rCisrKyBiL2NvcmUvam5pL0FuZHJvaWQubWsKQEAgLTE5LDEyICsxOSwxNSBAQAogICBMT0NBTF9DRkxBR1MgKz0gLURDVVNUT01fUlVOVElNRV9IRUFQX01BWD0kKFVTRV9DVVNUT01fUlVOVElNRV9IRUFQX01BWCkKIGVuZGlmCiAKK2lmZXEgKCQoVVNFX09QRU5HTF9SRU5ERVJFUiksdHJ1ZSkKKwlMT0NBTF9DRkxBR1MgKz0gLURVU0VfT1BFTkdMX1JFTkRFUkVSCitlbmRpZgorCiBMT0NBTF9DRkxBR1MgKz0gLURHTF9HTEVYVF9QUk9UT1RZUEVTIC1ERUdMX0VHTEVYVF9QUk9UT1RZUEVTCiAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKIAlBY3Rpdml0eU1hbmFnZXIuY3BwIFwKIAlBbmRyb2lkUnVudGltZS5jcHAgXAotCUN1cnNvcldpbmRvdy5jcHAgXAogCVRpbWUuY3BwIFwKIAljb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfRUdMSW1wbC5jcHAgXAogCWNvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwLmFybSBcCkBAIC00OCw2ICs1MSw3IEBACiAJYW5kcm9pZF92aWV3X0lucHV0Q2hhbm5lbC5jcHAgXAogCWFuZHJvaWRfdmlld19JbnB1dFF1ZXVlLmNwcCBcCiAJYW5kcm9pZF92aWV3X0tleUV2ZW50LmNwcCBcCisJYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcy5jcHAgXAogCWFuZHJvaWRfdmlld19Nb3Rpb25FdmVudC5jcHAgXAogCWFuZHJvaWRfdGV4dF9BbmRyb2lkQ2hhcmFjdGVyLmNwcCBcCiAJYW5kcm9pZF90ZXh0X0FuZHJvaWRCaWRpLmNwcCBcCkBAIC0xMDEsOSArMTA1LDExIEBACiAJYW5kcm9pZF9ncmFwaGljc19QaXhlbEZvcm1hdC5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvUGljdHVyZS5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZi5jcHAgXAorCWFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwUmVnaW9uRGVjb2Rlci5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvUmFzdGVyaXplci5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvUmVnaW9uLmNwcCBcCiAJYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuY3BwIFwKKwlhbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuY3BwIFwKIAlhbmRyb2lkL2dyYXBoaWNzL1R5cGVmYWNlLmNwcCBcCiAJYW5kcm9pZC9ncmFwaGljcy9VdGlscy5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvWGZlcm1vZGUuY3BwIFwKQEAgLTEyMyw3ICsxMjksNiBAQAogCWFuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5jcHAgXAogCWFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aEF1ZGlvR2F0ZXdheS5jcHAgXAogCWFuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aFNvY2tldC5jcHAgXAotCWFuZHJvaWRfYmx1ZXRvb3RoX1Njb1NvY2tldC5jcHAgXAogCWFuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwIFwKIAlhbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhFdmVudExvb3AuY3BwIFwKIAlhbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhBMmRwU2VydmljZS5jcHAgXApAQCAtMTQyLDYgKzE0Nyw3IEBACiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKIAkkKEpOSV9IX0lOQ0xVREUpIFwKIAkkKExPQ0FMX1BBVEgpL2FuZHJvaWQvZ3JhcGhpY3MgXAorCSQoTE9DQUxfUEFUSCkvLi4vLi4vbGlicy9od3VpIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYmx1ZWRyb2lkKSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGxpYmhhcmR3YXJlKS9oYXJkd2FyZSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGxpYmhhcmR3YXJlX2xlZ2FjeSkvaGFyZHdhcmVfbGVnYWN5IFwKQEAgLTE5Miw2ICsxOTgsMTAgQEAKIAlsaWJ3cGFfY2xpZW50IFwKIAlsaWJqcGVnCiAKK2lmZXEgKCQoVVNFX09QRU5HTF9SRU5ERVJFUiksdHJ1ZSkKKwlMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmh3dWkKK2VuZGlmCisKIGlmZXEgKCQoQk9BUkRfSEFWRV9ORkMpLHRydWUpCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKIAlsaWJuZmNfam5pIFwKZGlmZiAtLWdpdCBhL2NvcmUvam5pL0FuZHJvaWRSdW50aW1lLmNwcCBiL2NvcmUvam5pL0FuZHJvaWRSdW50aW1lLmNwcAppbmRleCA1ZjczNDQzLi5hNGExYTcwIDEwMDY0NAotLS0gYS9jb3JlL2puaS9BbmRyb2lkUnVudGltZS5jcHAKKysrIGIvY29yZS9qbmkvQW5kcm9pZFJ1bnRpbWUuY3BwCkBAIC01Myw2ICs1Myw3IEBACiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfb3NfUHJvY2VzcyhKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfQml0bWFwKEpOSUVudiopOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX0JpdG1hcEZhY3RvcnkoSk5JRW52Kik7CitleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfQml0bWFwUmVnaW9uRGVjb2RlcihKTklFbnYqKTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19DYW1lcmEoSk5JRW52KiBlbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX0dyYXBoaWNzKEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19JbnRlcnBvbGF0b3IoSk5JRW52KiBlbnYpOwpAQCAtMTE0LDYgKzExNSw3IEBACiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfUGl4ZWxGb3JtYXQoSk5JRW52KiBlbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9jb21fYW5kcm9pZF9pbnRlcm5hbF9ncmFwaGljc19OYXRpdmVVdGlscyhKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19EaXNwbGF5KEpOSUVudiogZW52KTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcyhKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19TdXJmYWNlKEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X1ZpZXdSb290KEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3coSk5JRW52KiBlbnYpOwpAQCAtMTUwLDcgKzE1Miw2IEBACiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX0hlYWRzZXRCYXNlKEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQXVkaW9HYXRld2F5KEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoU29ja2V0KEpOSUVudiAqZW52KTsKLWV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfU2NvU29ja2V0KEpOSUVudiAqZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoU2VydmljZShKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcChKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEEyZHBTZXJ2aWNlKEpOSUVudiogZW52KTsKQEAgLTEyMDcsNiArMTIwOCw3IEBACiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX25pb191dGlscyksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX1BpeGVsRm9ybWF0KSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfR3JhcGhpY3MpLAorICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcyksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfU3VyZmFjZSksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfVmlld1Jvb3QpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0VHTEltcGwpLApAQCAtMTIxOSw2ICsxMjIxLDcgQEAKIAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19CaXRtYXApLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19CaXRtYXBGYWN0b3J5KSwKKyAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfQml0bWFwUmVnaW9uRGVjb2RlciksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX0NhbWVyYSksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX0NhbnZhcyksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX0NvbG9yRmlsdGVyKSwKQEAgLTEyNzcsNyArMTI4MCw2IEBACiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2JsdWV0b290aF9IZWFkc2V0QmFzZSksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhBdWRpb0dhdGV3YXkpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoU29ja2V0KSwKLSAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX1Njb1NvY2tldCksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlKSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcCksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhBMmRwU2VydmljZSksCmRpZmYgLS1naXQgYS9jb3JlL2puaS9DdXJzb3JXaW5kb3cuY3BwIGIvY29yZS9qbmkvQ3Vyc29yV2luZG93LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg3NzkyMS4uMDAwMDAwMAotLS0gYS9jb3JlL2puaS9DdXJzb3JXaW5kb3cuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3VuZGVmIExPR19UQUcKLSNkZWZpbmUgTE9HX1RBRyAiQ3Vyc29yV2luZG93IgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSA8Sk5JSGVscC5oPgotCi0jaW5jbHVkZSAiQ3Vyc29yV2luZG93LmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1DdXJzb3JXaW5kb3c6OkN1cnNvcldpbmRvdyhzaXplX3QgbWF4U2l6ZSkgOgotICAgIG1NYXhTaXplKG1heFNpemUpCi17Ci19Ci0KLWJvb2wgQ3Vyc29yV2luZG93OjpzZXRNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbW9yeSkKLXsKLSAgICBtTWVtb3J5ID0gbWVtb3J5OwotICAgIG1EYXRhID0gKHVpbnQ4X3QgKikgbWVtb3J5LT5wb2ludGVyKCk7Ci0gICAgaWYgKG1EYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBtSGVhZGVyID0gKHdpbmRvd19oZWFkZXJfdCAqKSBtRGF0YTsKLQotICAgIC8vIE1ha2UgdGhlIHdpbmRvdyByZWFkLW9ubHkKLSAgICBzc2l6ZV90IHNpemUgPSBtZW1vcnktPnNpemUoKTsKLSAgICBtU2l6ZSA9IHNpemU7Ci0gICAgbU1heFNpemUgPSBzaXplOwotICAgIG1GcmVlT2Zmc2V0ID0gc2l6ZTsKLUxPR19XSU5ET1coIkNyZWF0ZWQgQ3Vyc29yV2luZG93IGZyb20gZXhpc3RpbmcgSU1lbW9yeTogbUZyZWVPZmZzZXQgPSAlZCwgbnVtUm93cyA9ICVkLCBudW1Db2x1bW5zID0gJWQsIG1TaXplID0gJWQsIG1NYXhTaXplID0gJWQsIG1EYXRhID0gJXAiLCBtRnJlZU9mZnNldCwgbUhlYWRlci0+bnVtUm93cywgbUhlYWRlci0+bnVtQ29sdW1ucywgbVNpemUsIG1NYXhTaXplLCBtRGF0YSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ3Vyc29yV2luZG93Ojppbml0QnVmZmVyKGJvb2wgbG9jYWxPbmx5KQotewotICAgIC8vVE9ETyBVc2UgYSBub24tbWVtb3J5IGRlYWxlciBtbWFwIHJlZ2lvbiBmb3IgbG9jYWxPbmx5Ci0KLSAgICBzcDxNZW1vcnlIZWFwQmFzZT4gaGVhcDsKLSAgICBoZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKG1NYXhTaXplLCAwLCAiQ3Vyc29yV2luZG93Iik7Ci0gICAgaWYgKGhlYXAgIT0gTlVMTCkgewotICAgICAgICBtTWVtb3J5ID0gbmV3IE1lbW9yeUJhc2UoaGVhcCwgMCwgbU1heFNpemUpOwotICAgICAgICBpZiAobU1lbW9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtRGF0YSA9ICh1aW50OF90ICopIG1NZW1vcnktPnBvaW50ZXIoKTsKLSAgICAgICAgICAgIGlmIChtRGF0YSkgewotICAgICAgICAgICAgICAgIG1IZWFkZXIgPSAod2luZG93X2hlYWRlcl90ICopIG1EYXRhOwotICAgICAgICAgICAgICAgIG1TaXplID0gbU1heFNpemU7Ci0KLSAgICAgICAgICAgICAgICAvLyBQdXQgdGhlIHdpbmRvdyBpbnRvIGEgY2xlYW4gc3RhdGUKLSAgICAgICAgICAgICAgICBjbGVhcigpOwotICAgICAgICAgICAgTE9HX1dJTkRPVygiQ3JlYXRlZCBDdXJzb3JXaW5kb3cgd2l0aCBuZXcgTWVtb3J5RGVhbGVyOiBtRnJlZU9mZnNldCA9ICVkLCBtU2l6ZSA9ICVkLCBtTWF4U2l6ZSA9ICVkLCBtRGF0YSA9ICVwIiwgbUZyZWVPZmZzZXQsIG1TaXplLCBtTWF4U2l6ZSwgbURhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAKLSAgICAgICAgTE9HRSgiQ3Vyc29yV2luZG93IGhlYXAgYWxsb2NhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR0UoImZhaWxlZCB0byBjcmVhdGUgdGhlIEN1cnNvcldpbmRvdyBoZWFwIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLUN1cnNvcldpbmRvdzo6fkN1cnNvcldpbmRvdygpCi17Ci0gICAgLy8gRXZlcnl0aGluZyB0aGF0IG1hdHRlcnMgaXMgYSBzbWFydCBwb2ludGVyCi19Ci0KLXZvaWQgQ3Vyc29yV2luZG93OjpjbGVhcigpCi17Ci0gICAgbUhlYWRlci0+bnVtUm93cyA9IDA7Ci0gICAgbUhlYWRlci0+bnVtQ29sdW1ucyA9IDA7Ci0gICAgbUZyZWVPZmZzZXQgPSBzaXplb2Yod2luZG93X2hlYWRlcl90KSArIFJPV19TTE9UX0NIVU5LX1NJWkU7Ci0gICAgLy8gTWFyayB0aGUgZmlyc3QgY2h1bmsncyBuZXh0ICdwb2ludGVyJyBhcyBudWxsCi0gICAgKigodWludDMyX3QgKikobURhdGEgKyBtRnJlZU9mZnNldCAtIHNpemVvZih1aW50MzJfdCkpKSA9IDA7Ci19Ci0KLWludDMyX3QgQ3Vyc29yV2luZG93OjpmcmVlU3BhY2UoKQotewotICAgIGludDMyX3QgZnJlZVNwYWNlID0gbVNpemUgLSBtRnJlZU9mZnNldDsKLSAgICBpZiAoZnJlZVNwYWNlIDwgMCkgewotICAgICAgICBmcmVlU3BhY2UgPSAwOwotICAgIH0KLSAgICByZXR1cm4gZnJlZVNwYWNlOwotfQotCi1maWVsZF9zbG90X3QgKiBDdXJzb3JXaW5kb3c6OmFsbG9jUm93KCkKLXsKLSAgICAvLyBGaWxsIGluIHRoZSByb3cgc2xvdAotICAgIHJvd19zbG90X3QgKiByb3dTbG90ID0gYWxsb2NSb3dTbG90KCk7Ci0gICAgaWYgKHJvd1Nsb3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBBbGxvY2F0ZSB0aGUgc2xvdHMgZm9yIHRoZSBmaWVsZCBkaXJlY3RvcnkKLSAgICBzaXplX3QgZmllbGREaXJTaXplID0gbUhlYWRlci0+bnVtQ29sdW1ucyAqIHNpemVvZihmaWVsZF9zbG90X3QpOwotICAgIHVpbnQzMl90IGZpZWxkRGlyT2Zmc2V0ID0gYWxsb2MoZmllbGREaXJTaXplKTsKLSAgICBpZiAoIWZpZWxkRGlyT2Zmc2V0KSB7Ci0gICAgICAgIG1IZWFkZXItPm51bVJvd3MtLTsKLSAgICAgICAgTE9HRSgiVGhlIHJvdyBmYWlsZWQsIHNvIGJhY2sgb3V0IHRoZSBuZXcgcm93IGFjY291bnRpbmcgZnJvbSBhbGxvY1Jvd1Nsb3QgJWQiLCBtSGVhZGVyLT5udW1Sb3dzKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkRGlyID0gKGZpZWxkX3Nsb3RfdCAqKW9mZnNldFRvUHRyKGZpZWxkRGlyT2Zmc2V0KTsKLSAgICBtZW1zZXQoZmllbGREaXIsIDB4MCwgZmllbGREaXJTaXplKTsKLQotTE9HX1dJTkRPVygiQWxsb2NhdGVkIHJvdyAldSwgcm93U2xvdCBpcyBhdCBvZmZzZXQgJXUsIGZpZWxkRGlyIGlzICVkIGJ5dGVzIGF0IG9mZnNldCAldVxuIiwgKG1IZWFkZXItPm51bVJvd3MgLSAxKSwgKCh1aW50OF90ICopcm93U2xvdCkgLSBtRGF0YSwgZmllbGREaXJTaXplLCBmaWVsZERpck9mZnNldCk7Ci0gICAgcm93U2xvdC0+b2Zmc2V0ID0gZmllbGREaXJPZmZzZXQ7Ci0KLSAgICByZXR1cm4gZmllbGREaXI7Ci19Ci0KLXVpbnQzMl90IEN1cnNvcldpbmRvdzo6YWxsb2Moc2l6ZV90IHJlcXVlc3RlZFNpemUsIGJvb2wgYWxpZ25lZCkKLXsKLSAgICBpbnQzMl90IHNpemU7Ci0gICAgdWludDMyX3QgcGFkZGluZzsKLSAgICBpZiAoYWxpZ25lZCkgewotICAgICAgICAvLyA0IGJ5dGUgYWxpZ25tZW50Ci0gICAgICAgIHBhZGRpbmcgPSA0IC0gKG1GcmVlT2Zmc2V0ICYgMHgzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwYWRkaW5nID0gMDsKLSAgICB9Ci0KLSAgICBzaXplID0gcmVxdWVzdGVkU2l6ZSArIHBhZGRpbmc7Ci0KLSAgICBpZiAoc2l6ZSA+IGZyZWVTcGFjZSgpKSB7Ci0gICAgICAgIExPR0UoIm5lZWQgdG8gZ3JvdzogbVNpemUgPSAlZCwgc2l6ZSA9ICVkLCBmcmVlU3BhY2UoKSA9ICVkLCBudW1Sb3dzID0gJWQiLCBtU2l6ZSwgc2l6ZSwgZnJlZVNwYWNlKCksIG1IZWFkZXItPm51bVJvd3MpOwotICAgICAgICAvLyBPbmx5IGdyb3cgdGhlIHdpbmRvdyBpZiB0aGUgZmlyc3Qgcm93IGRvZXNuJ3QgZml0Ci0gICAgICAgIGlmIChtSGVhZGVyLT5udW1Sb3dzID4gMSkgewotTE9HRSgibm90IGdyb3dpbmcgc2luY2UgdGhlcmUgYXJlIGFscmVhZHkgJWQgcm93KHMpLCBtYXggc2l6ZSAlZCIsIG1IZWFkZXItPm51bVJvd3MsIG1NYXhTaXplKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmluZCBhIG5ldyBzaXplIHRoYXQgd2lsbCBmaXQgdGhlIGFsbG9jYXRpb24KLSAgICAgICAgaW50IGFsbG9jYXRlZCA9IG1TaXplIC0gZnJlZVNwYWNlKCk7Ci0gICAgICAgIGludCBuZXdTaXplID0gbVNpemUgKyBXSU5ET1dfQUxMT0NBVElPTl9TSVpFOwotICAgICAgICB3aGlsZSAoc2l6ZSA+IChuZXdTaXplIC0gYWxsb2NhdGVkKSkgewotICAgICAgICAgICAgbmV3U2l6ZSArPSBXSU5ET1dfQUxMT0NBVElPTl9TSVpFOwotICAgICAgICAgICAgaWYgKG5ld1NpemUgPiBtTWF4U2l6ZSkgewotICAgICAgICAgICAgICAgIExPR0UoIkF0dGVtcHRpbmcgdG8gZ3JvdyB3aW5kb3cgYmV5b25kIG1heCBzaXplICglZCkiLCBtTWF4U2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLUxPR19XSU5ET1coImZvdW5kIHNpemUgJWQiLCBuZXdTaXplKTsKLSAgICAgICAgbVNpemUgPSBuZXdTaXplOwotICAgIH0KLQotICAgIHVpbnQzMl90IG9mZnNldCA9IG1GcmVlT2Zmc2V0ICsgcGFkZGluZzsKLSAgICBtRnJlZU9mZnNldCArPSBzaXplOwotICAgIHJldHVybiBvZmZzZXQ7Ci19Ci0KLXJvd19zbG90X3QgKiBDdXJzb3JXaW5kb3c6OmdldFJvd1Nsb3QoaW50IHJvdykKLXsKLSAgICBMT0dfV0lORE9XKCJlbnRlciBnZXRSb3dTbG90IGN1cnJlbnQgcm93IG51bSAlZCwgdGhpcyByb3cgJWQiLCBtSGVhZGVyLT5udW1Sb3dzLCByb3cpOwotICAgIGludCBjaHVua051bSA9IHJvdyAvIFJPV19TTE9UX0NIVU5LX05VTV9ST1dTOwotICAgIGludCBjaHVua1BvcyA9IHJvdyAlIFJPV19TTE9UX0NIVU5LX05VTV9ST1dTOwotICAgIGludCBjaHVua1B0ck9mZnNldCA9IHNpemVvZih3aW5kb3dfaGVhZGVyX3QpICsgUk9XX1NMT1RfQ0hVTktfU0laRSAtIHNpemVvZih1aW50MzJfdCk7Ci0gICAgdWludDhfdCAqIHJvd0NodW5rID0gbURhdGEgKyBzaXplb2Yod2luZG93X2hlYWRlcl90KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNodW5rTnVtOyBpKyspIHsKLSAgICAgICAgcm93Q2h1bmsgPSBvZmZzZXRUb1B0cigqKCh1aW50MzJfdCAqKShtRGF0YSArIGNodW5rUHRyT2Zmc2V0KSkpOwotICAgICAgICBjaHVua1B0ck9mZnNldCA9IHJvd0NodW5rIC0gbURhdGEgKyAoUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MgKiBzaXplb2Yocm93X3Nsb3RfdCkpOwotICAgIH0KLSAgICByZXR1cm4gKHJvd19zbG90X3QgKikocm93Q2h1bmsgKyAoY2h1bmtQb3MgKiBzaXplb2Yocm93X3Nsb3RfdCkpKTsKLSAgICBMT0dfV0lORE9XKCJleGl0IGdldFJvd1Nsb3QgY3VycmVudCByb3cgbnVtICVkLCB0aGlzIHJvdyAlZCIsIG1IZWFkZXItPm51bVJvd3MsIHJvdyk7ICAgIAotfQotCi1yb3dfc2xvdF90ICogQ3Vyc29yV2luZG93OjphbGxvY1Jvd1Nsb3QoKQotewotICAgIGludCBjaHVua051bSA9IG1IZWFkZXItPm51bVJvd3MgLyBST1dfU0xPVF9DSFVOS19OVU1fUk9XUzsKLSAgICBpbnQgY2h1bmtQb3MgPSBtSGVhZGVyLT5udW1Sb3dzICUgUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1M7Ci0gICAgaW50IGNodW5rUHRyT2Zmc2V0ID0gc2l6ZW9mKHdpbmRvd19oZWFkZXJfdCkgKyBST1dfU0xPVF9DSFVOS19TSVpFIC0gc2l6ZW9mKHVpbnQzMl90KTsKLSAgICB1aW50OF90ICogcm93Q2h1bmsgPSBtRGF0YSArIHNpemVvZih3aW5kb3dfaGVhZGVyX3QpOwotTE9HX1dJTkRPVygiQWxsb2NhdGluZyByb3cgc2xvdCwgbUhlYWRlci0+bnVtUm93cyBpcyAlZCwgY2h1bmtOdW0gaXMgJWQsIGNodW5rUG9zIGlzICVkIiwgbUhlYWRlci0+bnVtUm93cywgY2h1bmtOdW0sIGNodW5rUG9zKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNodW5rTnVtOyBpKyspIHsKLSAgICAgICAgdWludDMyX3QgbmV4dENodW5rT2Zmc2V0ID0gKigodWludDMyX3QgKikobURhdGEgKyBjaHVua1B0ck9mZnNldCkpOwotTE9HX1dJTkRPVygibmV4dENodW5rT2Zmc2V0IGlzICVkIiwgbmV4dENodW5rT2Zmc2V0KTsKLSAgICAgICAgaWYgKG5leHRDaHVua09mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBBbGxvY2F0ZSBhIG5ldyByb3cgY2h1bmsKLSAgICAgICAgICAgIG5leHRDaHVua09mZnNldCA9IGFsbG9jKFJPV19TTE9UX0NIVU5LX1NJWkUsIHRydWUpOwotICAgICAgICAgICAgaWYgKG5leHRDaHVua09mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByb3dDaHVuayA9IG9mZnNldFRvUHRyKG5leHRDaHVua09mZnNldCk7Ci1MT0dfV0lORE9XKCJhbGxvY2F0ZWQgbmV3IGNodW5rIGF0ICVkLCByb3dDaHVuayA9ICVwIiwgbmV4dENodW5rT2Zmc2V0LCByb3dDaHVuayk7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCAqKShtRGF0YSArIGNodW5rUHRyT2Zmc2V0KSkgPSByb3dDaHVuayAtIG1EYXRhOwotICAgICAgICAgICAgLy8gTWFyayB0aGUgbmV3IGNodW5rJ3MgbmV4dCAncG9pbnRlcicgYXMgbnVsbAotICAgICAgICAgICAgKigodWludDMyX3QgKikocm93Q2h1bmsgKyBST1dfU0xPVF9DSFVOS19TSVpFIC0gc2l6ZW9mKHVpbnQzMl90KSkpID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLUxPR19XSU5ET1coImZvbGx3aW5nICdwb2ludGVyJyB0byBuZXh0IGNodW5rLCBvZmZzZXQgb2YgbmV4dCBwb2ludGVyIGlzICVkIiwgY2h1bmtQdHJPZmZzZXQpOwotICAgICAgICAgICAgcm93Q2h1bmsgPSBvZmZzZXRUb1B0cihuZXh0Q2h1bmtPZmZzZXQpOwotICAgICAgICAgICAgY2h1bmtQdHJPZmZzZXQgPSByb3dDaHVuayAtIG1EYXRhICsgKFJPV19TTE9UX0NIVU5LX05VTV9ST1dTICogc2l6ZW9mKHJvd19zbG90X3QpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtSGVhZGVyLT5udW1Sb3dzKys7Ci0KLSAgICByZXR1cm4gKHJvd19zbG90X3QgKikocm93Q2h1bmsgKyAoY2h1bmtQb3MgKiBzaXplb2Yocm93X3Nsb3RfdCkpKTsKLX0KLQotZmllbGRfc2xvdF90ICogQ3Vyc29yV2luZG93OjpnZXRGaWVsZFNsb3RXaXRoQ2hlY2soaW50IHJvdywgaW50IGNvbHVtbikKLXsKLSAgaWYgKHJvdyA8IDAgfHwgcm93ID49IG1IZWFkZXItPm51bVJvd3MgfHwgY29sdW1uIDwgMCB8fCBjb2x1bW4gPj0gbUhlYWRlci0+bnVtQ29sdW1ucykgewotICAgICAgTE9HRSgiQmFkIHJlcXVlc3QgZm9yIGZpZWxkIHNsb3QgJWQsJWQuIG51bVJvd3MgPSAlZCwgbnVtQ29sdW1ucyA9ICVkIiwgcm93LCBjb2x1bW4sIG1IZWFkZXItPm51bVJvd3MsIG1IZWFkZXItPm51bUNvbHVtbnMpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gIH0gICAgICAgIAotICByb3dfc2xvdF90ICogcm93U2xvdCA9IGdldFJvd1Nsb3Qocm93KTsKLSAgaWYgKCFyb3dTbG90KSB7Ci0gICAgICBMT0dFKCJGYWlsZWQgdG8gZmluZCByb3dTbG90IGZvciByb3cgJWQiLCByb3cpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgaWYgKHJvd1Nsb3QtPm9mZnNldCA9PSAwIHx8IHJvd1Nsb3QtPm9mZnNldCA+PSBtU2l6ZSkgewotICAgICAgTE9HRSgiSW52YWxpZCByb3dTbG90LCBvZmZzZXQgPSAlZCIsIHJvd1Nsb3QtPm9mZnNldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgfSAgCi0gIGludCBmaWVsZERpck9mZnNldCA9IHJvd1Nsb3QtPm9mZnNldDsKLSAgcmV0dXJuICgoZmllbGRfc2xvdF90ICopb2Zmc2V0VG9QdHIoZmllbGREaXJPZmZzZXQpKSArIGNvbHVtbjsgIAotfQotCi11aW50MzJfdCBDdXJzb3JXaW5kb3c6OnJlYWRfZmllbGRfc2xvdChpbnQgcm93LCBpbnQgY29sdW1uLCBmaWVsZF9zbG90X3QgKiBzbG90T3V0KQotewotICAgIGlmIChyb3cgPCAwIHx8IHJvdyA+PSBtSGVhZGVyLT5udW1Sb3dzIHx8IGNvbHVtbiA8IDAgfHwgY29sdW1uID49IG1IZWFkZXItPm51bUNvbHVtbnMpIHsKLSAgICAgICAgTE9HRSgiQmFkIHJlcXVlc3QgZm9yIGZpZWxkIHNsb3QgJWQsJWQuIG51bVJvd3MgPSAlZCwgbnVtQ29sdW1ucyA9ICVkIiwgcm93LCBjb2x1bW4sIG1IZWFkZXItPm51bVJvd3MsIG1IZWFkZXItPm51bUNvbHVtbnMpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfSAgICAgICAgCi0gICAgcm93X3Nsb3RfdCAqIHJvd1Nsb3QgPSBnZXRSb3dTbG90KHJvdyk7Ci0gICAgaWYgKCFyb3dTbG90KSB7Ci0gICAgICAgIExPR0UoIkZhaWxlZCB0byBmaW5kIHJvd1Nsb3QgZm9yIHJvdyAlZCIsIHJvdyk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKHJvd1Nsb3QtPm9mZnNldCA9PSAwIHx8IHJvd1Nsb3QtPm9mZnNldCA+PSBtU2l6ZSkgewotICAgICAgICBMT0dFKCJJbnZhbGlkIHJvd1Nsb3QsIG9mZnNldCA9ICVkIiwgcm93U2xvdC0+b2Zmc2V0KTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLUxPR19XSU5ET1coIkZvdW5kIGZpZWxkIGRpcmVjdG9yeSBmb3IgJWQsJWQgYXQgcm93U2xvdCAlZCwgb2Zmc2V0ICVkIiwgcm93LCBjb2x1bW4sICh1aW50OF90ICopcm93U2xvdCAtIG1EYXRhLCByb3dTbG90LT5vZmZzZXQpOwotICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkRGlyID0gKGZpZWxkX3Nsb3RfdCAqKW9mZnNldFRvUHRyKHJvd1Nsb3QtPm9mZnNldCk7Ci1MT0dfV0lORE9XKCJSZWFkIGZpZWxkX3Nsb3RfdCAlZCwlZDogb2Zmc2V0ID0gJWQsIHNpemUgPSAlZCwgdHlwZSA9ICVkIiwgcm93LCBjb2x1bW4sIGZpZWxkRGlyW2NvbHVtbl0uZGF0YS5idWZmZXIub2Zmc2V0LCBmaWVsZERpcltjb2x1bW5dLmRhdGEuYnVmZmVyLnNpemUsIGZpZWxkRGlyW2NvbHVtbl0udHlwZSk7Ci0KLSAgICAvLyBDb3B5IHRoZSBkYXRhIHRvIHRoZSBvdXQgcGFyYW0KLSAgICBzbG90T3V0LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBmaWVsZERpcltjb2x1bW5dLmRhdGEuYnVmZmVyLm9mZnNldDsKLSAgICBzbG90T3V0LT5kYXRhLmJ1ZmZlci5zaXplID0gZmllbGREaXJbY29sdW1uXS5kYXRhLmJ1ZmZlci5zaXplOwotICAgIHNsb3RPdXQtPnR5cGUgPSBmaWVsZERpcltjb2x1bW5dLnR5cGU7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQ3Vyc29yV2luZG93Ojpjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCB1aW50OF90IGNvbnN0ICogZGF0YSwgc2l6ZV90IHNpemUpCi17Ci0gICAgYXNzZXJ0KG9mZnNldCArIHNpemUgPD0gbVNpemUpOyAgICAKLSAgICBtZW1jcHkobURhdGEgKyBvZmZzZXQsIGRhdGEsIHNpemUpOwotfQotCi12b2lkIEN1cnNvcldpbmRvdzo6Y29weUluKHVpbnQzMl90IG9mZnNldCwgaW50NjRfdCBkYXRhKQotewotICAgIGFzc2VydChvZmZzZXQgKyBzaXplb2YoaW50NjRfdCkgPD0gbVNpemUpOwotICAgIG1lbWNweShtRGF0YSArIG9mZnNldCwgKHVpbnQ4X3QgKikmZGF0YSwgc2l6ZW9mKGludDY0X3QpKTsKLX0KLQotdm9pZCBDdXJzb3JXaW5kb3c6OmNvcHlJbih1aW50MzJfdCBvZmZzZXQsIGRvdWJsZSBkYXRhKQotewotICAgIGFzc2VydChvZmZzZXQgKyBzaXplb2YoZG91YmxlKSA8PSBtU2l6ZSk7Ci0gICAgbWVtY3B5KG1EYXRhICsgb2Zmc2V0LCAodWludDhfdCAqKSZkYXRhLCBzaXplb2YoZG91YmxlKSk7Ci19Ci0KLXZvaWQgQ3Vyc29yV2luZG93Ojpjb3B5T3V0KHVpbnQzMl90IG9mZnNldCwgdWludDhfdCAqIGRhdGEsIHNpemVfdCBzaXplKQotewotICAgIGFzc2VydChvZmZzZXQgKyBzaXplIDw9IG1TaXplKTsKLSAgICBtZW1jcHkoZGF0YSwgbURhdGEgKyBvZmZzZXQsIHNpemUpOwotfQotCi1pbnQ2NF90IEN1cnNvcldpbmRvdzo6Y29weU91dExvbmcodWludDMyX3Qgb2Zmc2V0KQotewotICAgIGludDY0X3QgdmFsdWU7Ci0gICAgYXNzZXJ0KG9mZnNldCArIHNpemVvZihpbnQ2NF90KSA8PSBtU2l6ZSk7Ci0gICAgbWVtY3B5KCZ2YWx1ZSwgbURhdGEgKyBvZmZzZXQsIHNpemVvZihpbnQ2NF90KSk7Ci0gICAgcmV0dXJuIHZhbHVlOwotfQotCi1kb3VibGUgQ3Vyc29yV2luZG93Ojpjb3B5T3V0RG91YmxlKHVpbnQzMl90IG9mZnNldCkKLXsKLSAgICBkb3VibGUgdmFsdWU7Ci0gICAgYXNzZXJ0KG9mZnNldCArIHNpemVvZihkb3VibGUpIDw9IG1TaXplKTsKLSAgICBtZW1jcHkoJnZhbHVlLCBtRGF0YSArIG9mZnNldCwgc2l6ZW9mKGRvdWJsZSkpOwotICAgIHJldHVybiB2YWx1ZTsKLX0KLQotYm9vbCBDdXJzb3JXaW5kb3c6OnB1dExvbmcodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgaW50NjRfdCB2YWx1ZSkKLXsKLSAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSBnZXRGaWVsZFNsb3RXaXRoQ2hlY2socm93LCBjb2wpOwotICAgIGlmICghZmllbGRTbG90KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSNpZiBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MKLSAgICBmaWVsZFNsb3QtPmRhdGEubCA9IHZhbHVlOwotI2Vsc2UKLSAgICBpbnQgb2Zmc2V0ID0gYWxsb2Moc2l6ZW9mKGludDY0X3QpKTsKLSAgICBpZiAoIW9mZnNldCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29weUluKG9mZnNldCwgdmFsdWUpOwotCi0gICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gc2l6ZW9mKGludDY0X3QpOwotI2VuZGlmCi0gICAgZmllbGRTbG90LT50eXBlID0gRklFTERfVFlQRV9JTlRFR0VSOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIEN1cnNvcldpbmRvdzo6cHV0RG91YmxlKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGRvdWJsZSB2YWx1ZSkKLXsKLSAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSBnZXRGaWVsZFNsb3RXaXRoQ2hlY2socm93LCBjb2wpOwotICAgIGlmICghZmllbGRTbG90KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSNpZiBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MKLSAgICBmaWVsZFNsb3QtPmRhdGEuZCA9IHZhbHVlOwotI2Vsc2UKLSAgICBpbnQgb2Zmc2V0ID0gYWxsb2Moc2l6ZW9mKGludDY0X3QpKTsKLSAgICBpZiAoIW9mZnNldCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29weUluKG9mZnNldCwgdmFsdWUpOwotCi0gICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gc2l6ZW9mKGRvdWJsZSk7Ci0jZW5kaWYKLSAgICBmaWVsZFNsb3QtPnR5cGUgPSBGSUVMRF9UWVBFX0ZMT0FUOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIEN1cnNvcldpbmRvdzo6cHV0TnVsbCh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sKQotewotICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7Ci0gICAgaWYgKCFmaWVsZFNsb3QpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZpZWxkU2xvdC0+dHlwZSA9IEZJRUxEX1RZUEVfTlVMTDsKLSAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCA9IDA7Ci0gICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gMDsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDdXJzb3JXaW5kb3c6OmdldExvbmcodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgaW50NjRfdCAqIHZhbHVlT3V0KQotewotICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7Ci0gICAgaWYgKCFmaWVsZFNsb3QgfHwgZmllbGRTbG90LT50eXBlICE9IEZJRUxEX1RZUEVfSU5URUdFUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotI2lmIFdJTkRPV19TVE9SQUdFX0lOTElORV9OVU1FUklDUwotICAgICp2YWx1ZU91dCA9IGZpZWxkU2xvdC0+ZGF0YS5sOwotI2Vsc2UKLSAgICAqdmFsdWVPdXQgPSBjb3B5T3V0TG9uZyhmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCk7Ci0jZW5kaWYKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDdXJzb3JXaW5kb3c6OmdldERvdWJsZSh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBkb3VibGUgKiB2YWx1ZU91dCkKLXsKLSAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSBnZXRGaWVsZFNsb3RXaXRoQ2hlY2socm93LCBjb2wpOwotICAgIGlmICghZmllbGRTbG90IHx8IGZpZWxkU2xvdC0+dHlwZSAhPSBGSUVMRF9UWVBFX0ZMT0FUKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSNpZiBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MKLSAgICAqdmFsdWVPdXQgPSBmaWVsZFNsb3QtPmRhdGEuZDsKLSNlbHNlCi0gICAgKnZhbHVlT3V0ID0gY29weU91dERvdWJsZShmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCk7Ci0jZW5kaWYKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDdXJzb3JXaW5kb3c6OmdldE51bGwodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgYm9vbCAqIHZhbHVlT3V0KQotewotICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7Ci0gICAgaWYgKCFmaWVsZFNsb3QpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBpZiAoZmllbGRTbG90LT50eXBlICE9IEZJRUxEX1RZUEVfTlVMTCkgewotICAgICAgICAqdmFsdWVPdXQgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICAqdmFsdWVPdXQgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NvcmUvam5pL0N1cnNvcldpbmRvdy5oIGIvY29yZS9qbmkvQ3Vyc29yV2luZG93LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmY2I1NjAuLjAwMDAwMDAKLS0tIGEvY29yZS9qbmkvQ3Vyc29yV2luZG93LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfQU5EUk9JRF9fREFUQUJBU0VfV0lORE9XX0gKLSNkZWZpbmUgX0FORFJPSURfX0RBVEFCQVNFX1dJTkRPV19ICi0KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgPGpuaS5oPgotCi0jZGVmaW5lIERFRkFVTFRfV0lORE9XX1NJWkUgNDA5NgotI2RlZmluZSBNQVhfV0lORE9XX1NJWkUgKDEwMjQgKiAxMDI0KQotI2RlZmluZSBXSU5ET1dfQUxMT0NBVElPTl9TSVpFIDQwOTYKLQotI2RlZmluZSBST1dfU0xPVF9DSFVOS19OVU1fUk9XUyAxNgotCi0vLyBSb3cgc2xvdHMgYXJlIGFsbG9jYXRlZCBpbiBjaHVua3Mgb2YgUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MsCi0vLyB3aXRoIGFuIG9mZnNldCBhZnRlciB0aGUgcm93cyB0aGF0IHBvaW50cyB0byB0aGUgbmV4dCBjaHVuawotI2RlZmluZSBST1dfU0xPVF9DSFVOS19TSVpFICgoUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MgKiBzaXplb2Yocm93X3Nsb3RfdCkpICsgc2l6ZW9mKHVpbnQzMl90KSkKLQotCi0jaWYgTE9HX05ERUJVRwotCi0jZGVmaW5lIElGX0xPR19XSU5ET1coKSBpZiAoZmFsc2UpCi0jZGVmaW5lIExPR19XSU5ET1coLi4uKQotCi0jZWxzZQotCi0jZGVmaW5lIElGX0xPR19XSU5ET1coKSBJRl9MT0coTE9HX0RFQlVHLCAiQ3Vyc29yV2luZG93IikKLSNkZWZpbmUgTE9HX1dJTkRPVyguLi4pIExPRyhMT0dfREVCVUcsICJDdXJzb3JXaW5kb3ciLCBfX1ZBX0FSR1NfXykKLQotI2VuZGlmCi0KLQotLy8gV2hlbiBkZWZpbmVkIHRvIHRydWUgc3RyaW5ncyBhcmUgc3RvcmVkIGFzIFVURjgsIG90aGVyd2lzZSB0aGV5J3JlIFVURjE2Ci0jZGVmaW5lIFdJTkRPV19TVE9SQUdFX1VURjggMQotCi0vLyBXaGVuIGRlZmluZWQgdG8gdHJ1ZSBudW1iZXJpYyB2YWx1ZXMgYXJlIHN0b3JlZCBpbmxpbmUgaW4gdGhlIGZpZWxkX3Nsb3RfdCwgb3RoZXJ3aXNlIHRoZXkncmUgYWxsb2NhdGVkIGluIHRoZSB3aW5kb3cKLSNkZWZpbmUgV0lORE9XX1NUT1JBR0VfSU5MSU5FX05VTUVSSUNTIDEKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHVpbnQzMl90IG51bVJvd3M7Ci0gICAgdWludDMyX3QgbnVtQ29sdW1uczsKLX0gd2luZG93X2hlYWRlcl90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHVpbnQzMl90IG9mZnNldDsKLX0gcm93X3Nsb3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1aW50OF90IHR5cGU7Ci0gICAgdW5pb24gewotICAgICAgICBkb3VibGUgZDsKLSAgICAgICAgaW50NjRfdCBsOwotICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0OwotICAgICAgICAgICAgdWludDMyX3Qgc2l6ZTsKLSAgICAgICAgfSBidWZmZXI7Ci0gICAgfSBkYXRhOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBmaWVsZF9zbG90X3Q7Ci0KLSNkZWZpbmUgRklFTERfVFlQRV9JTlRFR0VSIDEKLSNkZWZpbmUgRklFTERfVFlQRV9GTE9BVCAyCi0jZGVmaW5lIEZJRUxEX1RZUEVfU1RSSU5HIDMKLSNkZWZpbmUgRklFTERfVFlQRV9CTE9CIDQKLSNkZWZpbmUgRklFTERfVFlQRV9OVUxMIDUKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHN0b3JlcyBhIHNldCBvZiByb3dzIGZyb20gYSBkYXRhYmFzZSBpbiBhIGJ1ZmZlci4gVGhlIGJlZ2luaW5nIG9mIHRoZQotICogd2luZG93IGhhcyBmaXJzdCBjaHVuayBvZiByb3dfc2xvdF90cywgd2hpY2ggYXJlIG9mZnNldHMgdG8gdGhlIHJvdyBkaXJlY3RvcnksIGZvbGxvd2VkIGJ5Ci0gKiBhbiBvZmZzZXQgdG8gdGhlIG5leHQgY2h1bmsgaW4gYSBsaW5rZWQtbGlzdCBvZiBhZGRpdGlvbmFsIGNodW5rIG9mIHJvd19zbG90X3RzIGluIGNhc2UKLSAqIHRoZSBwcmUtYWxsb2NhdGVkIGNodW5rIGlzbid0IGJpZyBlbm91Z2ggdG8gcmVmZXIgdG8gYWxsIHJvd3MuIEVhY2ggcm93IGRpcmVjdG9yeSBoYXMgYQotICogZmllbGRfc2xvdF90IHBlciBjb2x1bW4sIHdoaWNoIGhhcyB0aGUgc2l6ZSwgb2Zmc2V0LCBhbmQgdHlwZSBvZiB0aGUgZGF0YSBmb3IgdGhhdCBmaWVsZC4KLSAqIE5vdGUgdGhhdCB0aGUgZGF0YSB0eXBlcyBjb21lIGZyb20gc3FsaXRlMy5oLgotICovCi1jbGFzcyBDdXJzb3JXaW5kb3cKLXsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgIEN1cnNvcldpbmRvdyhzaXplX3QgbWF4U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDdXJzb3JXaW5kb3coKXt9Ci0gICAgYm9vbCAgICAgICAgICAgICAgICBzZXRNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH5DdXJzb3JXaW5kb3coKTsKLQotICAgIGJvb2wgICAgICAgICAgICAgICAgaW5pdEJ1ZmZlcihib29sIGxvY2FsT25seSk7Ci0gICAgc3A8SU1lbW9yeT4gICAgICAgICBnZXRNZW1vcnkoKSB7cmV0dXJuIG1NZW1vcnk7fQotCi0gICAgc2l6ZV90ICAgICAgICAgICAgICBzaXplKCkge3JldHVybiBtU2l6ZTt9Ci0gICAgdWludDhfdCAqICAgICAgICAgICBkYXRhKCkge3JldHVybiBtRGF0YTt9Ci0gICAgdWludDMyX3QgICAgICAgICAgICBnZXROdW1Sb3dzKCkge3JldHVybiBtSGVhZGVyLT5udW1Sb3dzO30KLSAgICB1aW50MzJfdCAgICAgICAgICAgIGdldE51bUNvbHVtbnMoKSB7cmV0dXJuIG1IZWFkZXItPm51bUNvbHVtbnM7fQotICAgIHZvaWQgICAgICAgICAgICAgICAgZnJlZUxhc3RSb3coKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1IZWFkZXItPm51bVJvd3MgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPm51bVJvd3MtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgYm9vbCAgICAgICAgICAgICAgICBzZXROdW1Db2x1bW5zKHVpbnQzMl90IG51bUNvbHVtbnMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjdXIgPSBtSGVhZGVyLT5udW1Db2x1bW5zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyID4gMCAmJiBjdXIgIT0gbnVtQ29sdW1ucykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiVHJ5aW5nIHRvIGdvIGZyb20gJWQgY29sdW1ucyB0byAlZCIsIGN1ciwgbnVtQ29sdW1ucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+bnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgIGludDMyX3QgICAgICAgICAgICAgZnJlZVNwYWNlKCk7Ci0KLSAgICB2b2lkICAgICAgICAgICAgICAgIGNsZWFyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogQWxsb2NhdGUgYSByb3cgc2xvdCBhbmQgaXRzIGRpcmVjdG9yeS4gVGhlIHJldHVybmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBwb2ludGVyIHBvaW50cyB0byB0aGUgYmVnaW5pbmcgb2YgdGhlIHJvdydzIGRpcmVjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgICogb3IgTlVMTCBpZiB0aGVyZSB3YXNuJ3Qgcm9vbS4gVGhlIGRpcmVjdG9yeSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICogaW5pdGlhbGllZCB3aXRoIE5VTEwgZW50cmllcyBmb3IgZWFjaCBmaWVsZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGZpZWxkX3Nsb3RfdCAqICAgICAgYWxsb2NSb3coKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBhIHBvcnRpb24gb2YgdGhlIHdpbmRvdy4gUmV0dXJucyB0aGUgb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgYWxsb2NhdGlvbiwgb3IgMCBpZiB0aGVyZSBpc24ndCBlbm91Z2ggc3BhY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiBhbGlnbmVkIGlzIHRydWUsIHRoZSBhbGxvY2F0aW9uIGdldHMgNCBieXRlIGFsaWdubWVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHVpbnQzMl90ICAgICAgICAgICAgYWxsb2Moc2l6ZV90IHNpemUsIGJvb2wgYWxpZ25lZCA9IGZhbHNlKTsKLQotICAgIHVpbnQzMl90ICAgICAgICAgICAgcmVhZF9maWVsZF9zbG90KGludCByb3csIGludCBjb2x1bW4sIGZpZWxkX3Nsb3RfdCAqIHNsb3QpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIENvcHkgZGF0YSBpbnRvIHRoZSB3aW5kb3cgYXQgdGhlIGdpdmVuIG9mZnNldC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHZvaWQgICAgICAgICAgICAgICAgY29weUluKHVpbnQzMl90IG9mZnNldCwgdWludDhfdCBjb25zdCAqIGRhdGEsIHNpemVfdCBzaXplKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIGNvcHlJbih1aW50MzJfdCBvZmZzZXQsIGludDY0X3QgZGF0YSk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCBkb3VibGUgZGF0YSk7Ci0KLSAgICB2b2lkICAgICAgICAgICAgICAgIGNvcHlPdXQodWludDMyX3Qgb2Zmc2V0LCB1aW50OF90ICogZGF0YSwgc2l6ZV90IHNpemUpOwotICAgIGludDY0X3QgICAgICAgICAgICAgY29weU91dExvbmcodWludDMyX3Qgb2Zmc2V0KTsKLSAgICBkb3VibGUgICAgICAgICAgICAgIGNvcHlPdXREb3VibGUodWludDMyX3Qgb2Zmc2V0KTsKLQotICAgIGJvb2wgICAgICAgICAgICAgICAgcHV0TG9uZyh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBpbnQ2NF90IHZhbHVlKTsKLSAgICBib29sICAgICAgICAgICAgICAgIHB1dERvdWJsZSh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBkb3VibGUgdmFsdWUpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgcHV0TnVsbCh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sKTsKLQotICAgIGJvb2wgICAgICAgICAgICAgICAgZ2V0TG9uZyh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBpbnQ2NF90ICogdmFsdWVPdXQpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgZ2V0RG91YmxlKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGRvdWJsZSAqIHZhbHVlT3V0KTsKLSAgICBib29sICAgICAgICAgICAgICAgIGdldE51bGwodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgYm9vbCAqIHZhbHVlT3V0KTsKLQotICAgIHVpbnQ4X3QgKiAgICAgICAgICAgb2Zmc2V0VG9QdHIodWludDMyX3Qgb2Zmc2V0KSB7cmV0dXJuIG1EYXRhICsgb2Zmc2V0O30KLQotICAgIHJvd19zbG90X3QgKiAgICAgICAgYWxsb2NSb3dTbG90KCk7Ci0KLSAgICByb3dfc2xvdF90ICogICAgICAgIGdldFJvd1Nsb3QoaW50IHJvdyk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHJldHVybiBOVUxMIGlmIEZhaWxlZCB0byBmaW5kIHJvd1Nsb3Qgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIEludmFsaWQgcm93U2xvdAotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZmllbGRfc2xvdF90ICogICAgICBnZXRGaWVsZFNsb3RXaXRoQ2hlY2soaW50IHJvdywgaW50IGNvbHVtbik7Ci0gICAgZmllbGRfc2xvdF90ICogICAgICBnZXRGaWVsZFNsb3QoaW50IHJvdywgaW50IGNvbHVtbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZERpck9mZnNldCA9IGdldFJvd1Nsb3Qocm93KS0+b2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChmaWVsZF9zbG90X3QgKilvZmZzZXRUb1B0cihmaWVsZERpck9mZnNldCkpICsgY29sdW1uOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotcHJpdmF0ZToKLSAgICB1aW50OF90ICogbURhdGE7Ci0gICAgc2l6ZV90IG1TaXplOwotICAgIHNpemVfdCBtTWF4U2l6ZTsKLSAgICB3aW5kb3dfaGVhZGVyX3QgKiBtSGVhZGVyOwotICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7Ci0KLSAgICAvKioKLSAgICAgKiBPZmZzZXQgb2YgdGhlIGxvd2VzdCB1bnVzZWQgZGF0YSBieXRlIGluIHRoZSBhcnJheS4KLSAgICAgKi8KLSAgICB1aW50MzJfdCBtRnJlZU9mZnNldDsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuY3BwCmluZGV4IDg4YmJhZmQuLjg4MGZiNmUgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5jcHAKQEAgLTEyLDYgKzEyLDggQEAKIA0KICNpbmNsdWRlIDxqbmkuaD4NCiANCisjaW5jbHVkZSA8Q2FjaGVzLmg+DQorDQogI2lmIDANCiAgICAgI2RlZmluZSBUUkFDRV9CSVRNQVAoY29kZSkgIGNvZGUNCiAjZWxzZQ0KQEAgLTI1MSw2ICsyNTMsMTEgQEAKIH0NCiANCiBzdGF0aWMgdm9pZCBCaXRtYXBfZGVzdHJ1Y3RvcihKTklFbnYqIGVudiwgam9iamVjdCwgU2tCaXRtYXAqIGJpdG1hcCkgew0KKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSDQorICAgIGlmIChhbmRyb2lkOjp1aXJlbmRlcmVyOjpDYWNoZXM6Omhhc0luc3RhbmNlKCkpIHsNCisgICAgICAgIGFuZHJvaWQ6OnVpcmVuZGVyZXI6OkNhY2hlczo6Z2V0SW5zdGFuY2UoKS50ZXh0dXJlQ2FjaGUucmVtb3ZlKGJpdG1hcCk7DQorICAgIH0NCisjZW5kaWYNCiAgICAgZGVsZXRlIGJpdG1hcDsNCiB9DQogDQpAQCAtMzEzLDYgKzMyMCwxMCBAQAogICAgIHJldHVybiBiaXRtYXAtPmNvbmZpZygpOw0KIH0NCiANCitzdGF0aWMgaW50IEJpdG1hcF9nZXRHZW5lcmF0aW9uSWQoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQml0bWFwKiBiaXRtYXApIHsNCisgICAgcmV0dXJuIGJpdG1hcC0+Z2V0R2VuZXJhdGlvbklEKCk7DQorfQ0KKw0KIHN0YXRpYyBqYm9vbGVhbiBCaXRtYXBfaGFzQWxwaGEoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQml0bWFwKiBiaXRtYXApIHsNCiAgICAgcmV0dXJuICFiaXRtYXAtPmlzT3BhcXVlKCk7DQogfQ0KQEAgLTYwNiw2ICs2MTcsNyBAQAogICAgICAgICAodm9pZCopQml0bWFwX3dyaXRlVG9QYXJjZWwgfSwNCiAgICAgeyAgICJuYXRpdmVFeHRyYWN0QWxwaGEiLCAgICAgICAiKElJW0kpTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOyIsDQogICAgICAgICAodm9pZCopQml0bWFwX2V4dHJhY3RBbHBoYSB9LA0KKyAgICB7ICAgIm5hdGl2ZUdlbmVyYXRpb25JZCIsICAgICAgICIoSSlJIiwgKHZvaWQqKUJpdG1hcF9nZXRHZW5lcmF0aW9uSWQgfSwNCiAgICAgeyAgICJuYXRpdmVHZXRQaXhlbCIsICAgICAgICAgICAiKElJSSlJIiwgKHZvaWQqKUJpdG1hcF9nZXRQaXhlbCB9LA0KICAgICB7ICAgIm5hdGl2ZUdldFBpeGVscyIsICAgICAgICAgICIoSVtJSUlJSUlJKVYiLCAodm9pZCopQml0bWFwX2dldFBpeGVscyB9LA0KICAgICB7ICAgIm5hdGl2ZVNldFBpeGVsIiwgICAgICAgICAgICIoSUlJSSlWIiwgKHZvaWQqKUJpdG1hcF9zZXRQaXhlbCB9LA0KZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwUmVnaW9uRGVjb2Rlci5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFJlZ2lvbkRlY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MDA3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFJlZ2lvbkRlY29kZXIuY3BwCkBAIC0wLDAgKzEsMzIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCaXRtYXBSZWdpb25EZWNvZGVyIgorCisjaW5jbHVkZSAiU2tCaXRtYXAuaCIKKyNpbmNsdWRlICJTa0ltYWdlRW5jb2Rlci5oIgorI2luY2x1ZGUgIkdyYXBoaWNzSk5JLmgiCisjaW5jbHVkZSAiU2tVdGlscy5oIgorI2luY2x1ZGUgIlNrVGVtcGxhdGVzLmgiCisjaW5jbHVkZSAiU2tQaXhlbFJlZi5oIgorI2luY2x1ZGUgIlNrU3RyZWFtLmgiCisjaW5jbHVkZSAiQml0bWFwRmFjdG9yeS5oIgorI2luY2x1ZGUgIkF1dG9EZWNvZGVDYW5jZWwuaCIKKyNpbmNsdWRlICJTa0JpdG1hcFJlZ2lvbkRlY29kZXIuaCIKKyNpbmNsdWRlICJDcmVhdGVKYXZhT3V0cHV0U3RyZWFtQWRhcHRvci5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlICJhbmRyb2lkX3V0aWxfQmluZGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9uaW9fdXRpbHMuaCIKKyNpbmNsdWRlICJDcmVhdGVKYXZhT3V0cHV0U3RyZWFtQWRhcHRvci5oIgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgPHV0aWxzL0Fzc2V0Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworc3RhdGljIGpjbGFzcyBnRmlsZURlc2NyaXB0b3JfY2xhc3M7CitzdGF0aWMgamZpZWxkSUQgZ0ZpbGVEZXNjcmlwdG9yX2Rlc2NyaXB0b3I7CisKKyNpZiAwCisgICAgI2RlZmluZSBUUkFDRV9CSVRNQVAoY29kZSkgIGNvZGUKKyNlbHNlCisgICAgI2RlZmluZSBUUkFDRV9CSVRNQVAoY29kZSkKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdGljIFNrTWVtb3J5U3RyZWFtKiBidWlsZFNrTWVtb3J5U3RyZWFtKFNrU3RyZWFtICpzdHJlYW0pIHsKKyAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IDQwOTY7CisgICAgc2l6ZV90IHN0cmVhbUxlbiA9IDA7CisgICAgc2l6ZV90IGxlbjsKKyAgICBjaGFyKiBkYXRhID0gKGNoYXIqKXNrX21hbGxvY190aHJvdyhidWZmZXJTaXplKTsKKworICAgIHdoaWxlICgobGVuID0gc3RyZWFtLT5yZWFkKGRhdGEgKyBzdHJlYW1MZW4sCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUgLSBzdHJlYW1MZW4pKSAhPSAwKSB7CisgICAgICAgIHN0cmVhbUxlbiArPSBsZW47CisgICAgICAgIGlmIChzdHJlYW1MZW4gPT0gYnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgYnVmZmVyU2l6ZSAqPSAyOworICAgICAgICAgICAgZGF0YSA9IChjaGFyKilza19yZWFsbG9jX3Rocm93KGRhdGEsIGJ1ZmZlclNpemUpOworICAgICAgICB9CisgICAgfQorICAgIGRhdGEgPSAoY2hhciopc2tfcmVhbGxvY190aHJvdyhkYXRhLCBzdHJlYW1MZW4pOworICAgIFNrTWVtb3J5U3RyZWFtKiBzdHJlYW1NZW0gPSBuZXcgU2tNZW1vcnlTdHJlYW0oKTsKKyAgICBzdHJlYW1NZW0tPnNldE1lbW9yeU93bmVkKGRhdGEsIHN0cmVhbUxlbik7CisgICAgcmV0dXJuIHN0cmVhbU1lbTsKK30KKworc3RhdGljIGpvYmplY3QgZG9CdWlsZFRpbGVJbmRleChKTklFbnYqIGVudiwgU2tTdHJlYW0qIHN0cmVhbSkgeworICAgIFNrSW1hZ2VEZWNvZGVyKiBkZWNvZGVyID0gU2tJbWFnZURlY29kZXI6OkZhY3Rvcnkoc3RyZWFtKTsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBpZiAoTlVMTCA9PSBkZWNvZGVyKSB7CisgICAgICAgIGRvVGhyb3dJT0UoZW52LCAiSW1hZ2UgZm9ybWF0IG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIG51bGxPYmplY3RSZXR1cm4oIlNrSW1hZ2VEZWNvZGVyOjpGYWN0b3J5IHJldHVybmVkIG51bGwiKTsKKyAgICB9CisKKyAgICBKYXZhUGl4ZWxBbGxvY2F0b3IgKmphdmFBbGxvY2F0b3IgPSBuZXcgSmF2YVBpeGVsQWxsb2NhdG9yKGVudiwgdHJ1ZSk7CisgICAgZGVjb2Rlci0+c2V0QWxsb2NhdG9yKGphdmFBbGxvY2F0b3IpOworICAgIEphdmFNZW1vcnlVc2FnZVJlcG9ydGVyICpqYXZhTWVtb3J5UmVwb3J0ZXIgPSBuZXcgSmF2YU1lbW9yeVVzYWdlUmVwb3J0ZXIoZW52KTsKKyAgICBkZWNvZGVyLT5zZXRSZXBvcnRlcihqYXZhTWVtb3J5UmVwb3J0ZXIpOworICAgIGphdmFBbGxvY2F0b3ItPnVucmVmKCk7CisgICAgamF2YU1lbW9yeVJlcG9ydGVyLT51bnJlZigpOworCisgICAgaWYgKCFkZWNvZGVyLT5idWlsZFRpbGVJbmRleChzdHJlYW0sICZ3aWR0aCwgJmhlaWdodCkpIHsKKyAgICAgICAgY2hhciBtc2dbMTAwXTsKKyAgICAgICAgc25wcmludGYobXNnLCBzaXplb2YobXNnKSwgIkltYWdlIGZhaWxlZCB0byBkZWNvZGUgdXNpbmcgJXMgZGVjb2RlciIsCisgICAgICAgICAgICAgICAgZGVjb2Rlci0+Z2V0Rm9ybWF0TmFtZSgpKTsKKyAgICAgICAgZG9UaHJvd0lPRShlbnYsIG1zZyk7CisgICAgICAgIHJldHVybiBudWxsT2JqZWN0UmV0dXJuKCJkZWNvZGVyLT5idWlsZFRpbGVJbmRleCByZXR1cm5lZCBmYWxzZSIpOworICAgIH0KKworICAgIFNrQml0bWFwUmVnaW9uRGVjb2RlciAqYm0gPSBuZXcgU2tCaXRtYXBSZWdpb25EZWNvZGVyKGRlY29kZXIsIHdpZHRoLCBoZWlnaHQpOworCisgICAgcmV0dXJuIEdyYXBoaWNzSk5JOjpjcmVhdGVCaXRtYXBSZWdpb25EZWNvZGVyKGVudiwgYm0pOworfQorCitzdGF0aWMgam9iamVjdCBuYXRpdmVOZXdJbnN0YW5jZUZyb21CeXRlQXJyYXkoSk5JRW52KiBlbnYsIGpvYmplY3QsIGpieXRlQXJyYXkgYnl0ZUFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGpib29sZWFuIGlzU2hhcmVhYmxlKSB7CisgICAgLyogIElmIGlzU2hhcmVhYmxlIHdlIGNvdWxkIGRlY2lkZSB0byBqdXN0IHdyYXAgdGhlIGphdmEgYXJyYXkgYW5kCisgICAgICAgIHNoYXJlIGl0LCBidXQgdGhhdCBtZWFucyBhZGRpbmcgYSBnbG9iYWxyZWYgdG8gdGhlIGphdmEgYXJyYXkgb2JqZWN0CisgICAgICAgIEZvciBub3cgd2UganVzdCBhbHdheXMgY29weSB0aGUgYXJyYXkncyBkYXRhIGlmIGlzU2hhcmVhYmxlLgorICAgICAqLworICAgIEF1dG9KYXZhQnl0ZUFycmF5IGFyKGVudiwgYnl0ZUFycmF5KTsKKyAgICBTa1N0cmVhbSogc3RyZWFtID0gbmV3IFNrTWVtb3J5U3RyZWFtKGFyLnB0cigpICsgb2Zmc2V0LCBsZW5ndGgsIHRydWUpOworICAgIHJldHVybiBkb0J1aWxkVGlsZUluZGV4KGVudiwgc3RyZWFtKTsKK30KKworc3RhdGljIGpvYmplY3QgbmF0aXZlTmV3SW5zdGFuY2VGcm9tRmlsZURlc2NyaXB0b3IoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IGZpbGVEZXNjcmlwdG9yLCBqYm9vbGVhbiBpc1NoYXJlYWJsZSkgeworICAgIE5QRV9DSEVDS19SRVRVUk5fWkVSTyhlbnYsIGZpbGVEZXNjcmlwdG9yKTsKKworICAgIGppbnQgZGVzY3JpcHRvciA9IGVudi0+R2V0SW50RmllbGQoZmlsZURlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnRmlsZURlc2NyaXB0b3JfZGVzY3JpcHRvcik7CisgICAgU2tTdHJlYW0gKnN0cmVhbSA9IE5VTEw7CisgICAgc3RydWN0IHN0YXQgZmRTdGF0OworICAgIGludCBuZXdGRDsKKyAgICBpZiAoZnN0YXQoZGVzY3JpcHRvciwgJmZkU3RhdCkgPT0gLTEpIHsKKyAgICAgICAgZG9UaHJvd0lPRShlbnYsICJicm9rZW4gZmlsZSBkZXNjcmlwdG9yIik7CisgICAgICAgIHJldHVybiBudWxsT2JqZWN0UmV0dXJuKCJmc3RhdCByZXR1cm4gLTEiKTsKKyAgICB9CisKKyAgICBpZiAoaXNTaGFyZWFibGUgJiYKKyAgICAgICAgICAgIFNfSVNSRUcoZmRTdGF0LnN0X21vZGUpICYmCisgICAgICAgICAgICAobmV3RkQgPSA6OmR1cChkZXNjcmlwdG9yKSkgIT0gLTEpIHsKKyAgICAgICAgU2tGRFN0cmVhbSogZmRTdHJlYW0gPSBuZXcgU2tGRFN0cmVhbShuZXdGRCwgdHJ1ZSk7CisgICAgICAgIGlmICghZmRTdHJlYW0tPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgZmRTdHJlYW0tPnVucmVmKCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW0gPSBmZFN0cmVhbTsKKyAgICB9IGVsc2UgeworICAgICAgICBTa0ZEU3RyZWFtKiBmZFN0cmVhbSA9IG5ldyBTa0ZEU3RyZWFtKGRlc2NyaXB0b3IsIGZhbHNlKTsKKyAgICAgICAgaWYgKCFmZFN0cmVhbS0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBmZFN0cmVhbS0+dW5yZWYoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHN0cmVhbSA9IGJ1aWxkU2tNZW1vcnlTdHJlYW0oZmRTdHJlYW0pOworICAgICAgICBmZFN0cmVhbS0+dW5yZWYoKTsKKyAgICB9CisKKyAgICAvKiBSZXN0b3JlIG91ciBvZmZzZXQgd2hlbiB3ZSBsZWF2ZSwgc28gd2UgY2FuIGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZQorICAgICAgIHdpdGggdGhlIHNhbWUgZGVzY3JpcHRvci4gVGhpcyBpcyBvbmx5IHJlcXVpcmVkIGlmIHdlIGRpZG4ndCBkdXAgdGhlCisgICAgICAgZmlsZSBkZXNjcmlwdG9yLCBidXQgaXQgaXMgT0sgdG8gZG8gaXQgYWxsIHRoZSB0aW1lLgorICAgICovCisgICAgQXV0b0ZEU2VlayBhcyhkZXNjcmlwdG9yKTsKKworICAgIHJldHVybiBkb0J1aWxkVGlsZUluZGV4KGVudiwgc3RyZWFtKTsKK30KKworc3RhdGljIGpvYmplY3QgbmF0aXZlTmV3SW5zdGFuY2VGcm9tU3RyZWFtKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgaXMsICAgICAgIC8vIElucHV0U3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJ5dGVBcnJheSBzdG9yYWdlLCAvLyBieXRlW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYm9vbGVhbiBpc1NoYXJlYWJsZSkgeworICAgIGpvYmplY3QgbGFyZ2VCaXRtYXAgPSBOVUxMOworICAgIFNrU3RyZWFtKiBzdHJlYW0gPSBDcmVhdGVKYXZhSW5wdXRTdHJlYW1BZGFwdG9yKGVudiwgaXMsIHN0b3JhZ2UsIDEwMjQpOworCisgICAgaWYgKHN0cmVhbSkgeworICAgICAgICAvLyBmb3Igbm93IHdlIGRvbid0IGFsbG93IHNoYXJlYWJsZSB3aXRoIGphdmEgaW5wdXRzdHJlYW1zCisgICAgICAgIFNrTWVtb3J5U3RyZWFtICptU3RyZWFtID0gYnVpbGRTa01lbW9yeVN0cmVhbShzdHJlYW0pOworICAgICAgICBsYXJnZUJpdG1hcCA9IGRvQnVpbGRUaWxlSW5kZXgoZW52LCBtU3RyZWFtKTsKKyAgICAgICAgc3RyZWFtLT51bnJlZigpOworICAgIH0KKyAgICByZXR1cm4gbGFyZ2VCaXRtYXA7Cit9CisKK3N0YXRpYyBqb2JqZWN0IG5hdGl2ZU5ld0luc3RhbmNlRnJvbUFzc2V0KEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBuYXRpdmVfYXNzZXQsIC8vIEFzc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYm9vbGVhbiBpc1NoYXJlYWJsZSkgeworICAgIFNrU3RyZWFtKiBzdHJlYW0sICphc3NTdHJlYW07CisgICAgQXNzZXQqIGFzc2V0ID0gcmVpbnRlcnByZXRfY2FzdDxBc3NldCo+KG5hdGl2ZV9hc3NldCk7CisgICAgYXNzU3RyZWFtID0gbmV3IEFzc2V0U3RyZWFtQWRhcHRvcihhc3NldCk7CisgICAgc3RyZWFtID0gYnVpbGRTa01lbW9yeVN0cmVhbShhc3NTdHJlYW0pOworICAgIGFzc1N0cmVhbS0+dW5yZWYoKTsKKyAgICByZXR1cm4gZG9CdWlsZFRpbGVJbmRleChlbnYsIHN0cmVhbSk7Cit9CisKKy8qCisgKiBuaW5lIHBhdGNoIG5vdCBzdXBwb3J0ZWQKKyAqCisgKiBwdXJnZWFibGUgbm90IHN1cHBvcnRlZAorICogcmVwb3J0U2l6ZVRvVk0gbm90IHN1cHBvcnRlZAorICovCitzdGF0aWMgam9iamVjdCBuYXRpdmVEZWNvZGVSZWdpb24oSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQml0bWFwUmVnaW9uRGVjb2RlciAqYnJkLAorICAgICAgICBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCB3aWR0aCwgaW50IGhlaWdodCwgam9iamVjdCBvcHRpb25zKSB7CisgICAgU2tJbWFnZURlY29kZXIgKmRlY29kZXIgPSBicmQtPmdldERlY29kZXIoKTsKKyAgICBpbnQgc2FtcGxlU2l6ZSA9IDE7CisgICAgU2tCaXRtYXA6OkNvbmZpZyBwcmVmQ29uZmlnID0gU2tCaXRtYXA6OmtOb19Db25maWc7CisgICAgYm9vbCBkb0RpdGhlciA9IHRydWU7CisKKyAgICBpZiAoTlVMTCAhPSBvcHRpb25zKSB7CisgICAgICAgIHNhbXBsZVNpemUgPSBlbnYtPkdldEludEZpZWxkKG9wdGlvbnMsIGdPcHRpb25zX3NhbXBsZVNpemVGaWVsZElEKTsKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGVzZSwgaW4gY2FzZSB3ZSBmYWlsIGxhdGVyIG9uCisgICAgICAgIGVudi0+U2V0SW50RmllbGQob3B0aW9ucywgZ09wdGlvbnNfd2lkdGhGaWVsZElELCAtMSk7CisgICAgICAgIGVudi0+U2V0SW50RmllbGQob3B0aW9ucywgZ09wdGlvbnNfaGVpZ2h0RmllbGRJRCwgLTEpOworICAgICAgICBlbnYtPlNldE9iamVjdEZpZWxkKG9wdGlvbnMsIGdPcHRpb25zX21pbWVGaWVsZElELCAwKTsKKworICAgICAgICBqb2JqZWN0IGpjb25maWcgPSBlbnYtPkdldE9iamVjdEZpZWxkKG9wdGlvbnMsIGdPcHRpb25zX2NvbmZpZ0ZpZWxkSUQpOworICAgICAgICBwcmVmQ29uZmlnID0gR3JhcGhpY3NKTkk6OmdldE5hdGl2ZUJpdG1hcENvbmZpZyhlbnYsIGpjb25maWcpOworICAgICAgICBkb0RpdGhlciA9IGVudi0+R2V0Qm9vbGVhbkZpZWxkKG9wdGlvbnMsIGdPcHRpb25zX2RpdGhlckZpZWxkSUQpOworICAgIH0KKworICAgIGRlY29kZXItPnNldERpdGhlckltYWdlKGRvRGl0aGVyKTsKKyAgICBTa0JpdG1hcCogICAgICAgICAgIGJpdG1hcCA9IG5ldyBTa0JpdG1hcDsKKyAgICBTa0F1dG9URGVsZXRlPFNrQml0bWFwPiAgICAgICBhZGIoYml0bWFwKTsKKyAgICBBdXRvRGVjb2RlckNhbmNlbCAgIGFkYyhvcHRpb25zLCBkZWNvZGVyKTsKKworICAgIC8vIFRvIGZpeCB0aGUgcmFjZSBjb25kaXRpb24gaW4gY2FzZSAicmVxdWVzdENhbmNlbERlY29kZSIKKyAgICAvLyBoYXBwZW5zIGVhcmxpZXIgdGhhbiBBdXRvRGVjb2RlckNhbmNlbCBvYmplY3QgaXMgYWRkZWQKKyAgICAvLyB0byB0aGUgZ0F1dG9EZWNvZGVyQ2FuY2VsTXV0ZXggbGlua2VkIGxpc3QuCisgICAgaWYgKE5VTEwgIT0gb3B0aW9ucyAmJiBlbnYtPkdldEJvb2xlYW5GaWVsZChvcHRpb25zLCBnT3B0aW9uc19tQ2FuY2VsSUQpKSB7CisgICAgICAgIHJldHVybiBudWxsT2JqZWN0UmV0dXJuKCJnT3B0aW9uc19tQ2FuY2VsSUQiKTs7CisgICAgfQorCisgICAgU2tJUmVjdCByZWdpb247CisgICAgcmVnaW9uLmZMZWZ0ID0gc3RhcnRfeDsKKyAgICByZWdpb24uZlRvcCA9IHN0YXJ0X3k7CisgICAgcmVnaW9uLmZSaWdodCA9IHN0YXJ0X3ggKyB3aWR0aDsKKyAgICByZWdpb24uZkJvdHRvbSA9IHN0YXJ0X3kgKyBoZWlnaHQ7CisKKyAgICBpZiAoIWJyZC0+ZGVjb2RlUmVnaW9uKGJpdG1hcCwgcmVnaW9uLCBwcmVmQ29uZmlnLCBzYW1wbGVTaXplKSkgeworICAgICAgICByZXR1cm4gbnVsbE9iamVjdFJldHVybigiZGVjb2Rlci0+ZGVjb2RlUmVnaW9uIHJldHVybmVkIGZhbHNlIik7CisgICAgfQorCisgICAgLy8gdXBkYXRlIG9wdGlvbnMgKGlmIGFueSkKKyAgICBpZiAoTlVMTCAhPSBvcHRpb25zKSB7CisgICAgICAgIGVudi0+U2V0SW50RmllbGQob3B0aW9ucywgZ09wdGlvbnNfd2lkdGhGaWVsZElELCBiaXRtYXAtPndpZHRoKCkpOworICAgICAgICBlbnYtPlNldEludEZpZWxkKG9wdGlvbnMsIGdPcHRpb25zX2hlaWdodEZpZWxkSUQsIGJpdG1hcC0+aGVpZ2h0KCkpOworICAgICAgICAvLyBUT0RPOiBzZXQgdGhlIG1pbWVUeXBlIGZpZWxkIHdpdGggdGhlIGRhdGEgZnJvbSB0aGUgY29kZWMuCisgICAgICAgIC8vIGJ1dCBob3cgdG8gcmV1c2UgYSBzZXQgb2Ygc3RyaW5ncywgcmF0aGVyIHRoYW4gYWxsb2NhdGluZyBuZXcgb25lCisgICAgICAgIC8vIGVhY2ggdGltZT8KKyAgICAgICAgZW52LT5TZXRPYmplY3RGaWVsZChvcHRpb25zLCBnT3B0aW9uc19taW1lRmllbGRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNaW1lVHlwZVN0cmluZyhlbnYsIGRlY29kZXItPmdldEZvcm1hdCgpKSk7CisgICAgfQorCisgICAgLy8gZGV0YWNoIGJpdG1hcCBmcm9tIGl0cyBhdXRvdGRlbGV0ZXIsIHNpbmNlIHdlIHdhbnQgdG8gb3duIGl0IG5vdworICAgIGFkYi5kZXRhY2goKTsKKworICAgIFNrUGl4ZWxSZWYqIHByOworICAgIHByID0gYml0bWFwLT5waXhlbFJlZigpOworICAgIC8vIHByb21pc2Ugd2Ugd2lsbCBuZXZlciBjaGFuZ2Ugb3VyIHBpeGVscyAoZ3JlYXQgZm9yIHNoYXJpbmcgYW5kIHBpY3R1cmVzKQorICAgIHByLT5zZXRJbW11dGFibGUoKTsKKyAgICAvLyBub3cgY3JlYXRlIHRoZSBqYXZhIGJpdG1hcAorICAgIHJldHVybiBHcmFwaGljc0pOSTo6Y3JlYXRlQml0bWFwKGVudiwgYml0bWFwLCBmYWxzZSwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgbmF0aXZlR2V0SGVpZ2h0KEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0JpdG1hcFJlZ2lvbkRlY29kZXIgKmJyZCkgeworICAgIHJldHVybiBicmQtPmdldEhlaWdodCgpOworfQorCitzdGF0aWMgaW50IG5hdGl2ZUdldFdpZHRoKEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0JpdG1hcFJlZ2lvbkRlY29kZXIgKmJyZCkgeworICAgIHJldHVybiBicmQtPmdldFdpZHRoKCk7Cit9CisKK3N0YXRpYyB2b2lkIG5hdGl2ZUNsZWFuKEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0JpdG1hcFJlZ2lvbkRlY29kZXIgKmJyZCkgeworICAgIGRlbGV0ZSBicmQ7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdCaXRtYXBSZWdpb25EZWNvZGVyTWV0aG9kc1tdID0geworICAgIHsgICAibmF0aXZlRGVjb2RlUmVnaW9uIiwKKyAgICAgICAgIihJSUlJSUxhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcEZhY3RvcnkkT3B0aW9uczspTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOyIsCisgICAgICAgICh2b2lkKiluYXRpdmVEZWNvZGVSZWdpb259LAorCisgICAgeyAgICJuYXRpdmVHZXRIZWlnaHQiLCAiKEkpSSIsICh2b2lkKiluYXRpdmVHZXRIZWlnaHR9LAorCisgICAgeyAgICJuYXRpdmVHZXRXaWR0aCIsICIoSSlJIiwgKHZvaWQqKW5hdGl2ZUdldFdpZHRofSwKKworICAgIHsgICAibmF0aXZlQ2xlYW4iLCAiKEkpViIsICh2b2lkKiluYXRpdmVDbGVhbn0sCisKKyAgICB7ICAgIm5hdGl2ZU5ld0luc3RhbmNlIiwKKyAgICAgICAgIihbQklJWilMYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBSZWdpb25EZWNvZGVyOyIsCisgICAgICAgICh2b2lkKiluYXRpdmVOZXdJbnN0YW5jZUZyb21CeXRlQXJyYXkKKyAgICB9LAorCisgICAgeyAgICJuYXRpdmVOZXdJbnN0YW5jZSIsCisgICAgICAgICIoTGphdmEvaW8vSW5wdXRTdHJlYW07W0JaKUxhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFJlZ2lvbkRlY29kZXI7IiwKKyAgICAgICAgKHZvaWQqKW5hdGl2ZU5ld0luc3RhbmNlRnJvbVN0cmVhbQorICAgIH0sCisKKyAgICB7ICAgIm5hdGl2ZU5ld0luc3RhbmNlIiwKKyAgICAgICAgIihMamF2YS9pby9GaWxlRGVzY3JpcHRvcjtaKUxhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFJlZ2lvbkRlY29kZXI7IiwKKyAgICAgICAgKHZvaWQqKW5hdGl2ZU5ld0luc3RhbmNlRnJvbUZpbGVEZXNjcmlwdG9yCisgICAgfSwKKworICAgIHsgICAibmF0aXZlTmV3SW5zdGFuY2UiLAorICAgICAgICAiKElaKUxhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFJlZ2lvbkRlY29kZXI7IiwKKyAgICAgICAgKHZvaWQqKW5hdGl2ZU5ld0luc3RhbmNlRnJvbUFzc2V0CisgICAgfSwKK307CisKKyNkZWZpbmUga0NsYXNzUGF0aE5hbWUgICJhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFJlZ2lvbkRlY29kZXIiCisKK3N0YXRpYyBqY2xhc3MgbWFrZV9nbG9iYWxyZWYoSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIgY2xhc3NuYW1lW10pIHsKKyAgICBqY2xhc3MgYyA9IGVudi0+RmluZENsYXNzKGNsYXNzbmFtZSk7CisgICAgU2tBU1NFUlQoYyk7CisgICAgcmV0dXJuIChqY2xhc3MpZW52LT5OZXdHbG9iYWxSZWYoYyk7Cit9CisKK3N0YXRpYyBqZmllbGRJRCBnZXRGaWVsZElEQ2hlY2soSk5JRW52KiBlbnYsIGpjbGFzcyBjbGF6eiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBmaWVsZG5hbWVbXSwgY29uc3QgY2hhciB0eXBlW10pIHsKKyAgICBqZmllbGRJRCBpZCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgZmllbGRuYW1lLCB0eXBlKTsKKyAgICBTa0FTU0VSVChpZCk7CisgICAgcmV0dXJuIGlkOworfQorCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19CaXRtYXBSZWdpb25EZWNvZGVyKEpOSUVudiogZW52KTsKK2ludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX0JpdG1hcFJlZ2lvbkRlY29kZXIoSk5JRW52KiBlbnYpCit7CisKKyAgICBnRmlsZURlc2NyaXB0b3JfY2xhc3MgPSBtYWtlX2dsb2JhbHJlZihlbnYsICJqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yIik7CisgICAgZ0ZpbGVEZXNjcmlwdG9yX2Rlc2NyaXB0b3IgPSBnZXRGaWVsZElEQ2hlY2soZW52LCBnRmlsZURlc2NyaXB0b3JfY2xhc3MsICJkZXNjcmlwdG9yIiwgIkkiKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6QW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsIGtDbGFzc1BhdGhOYW1lLAorICAgICAgICAgICAgZ0JpdG1hcFJlZ2lvbkRlY29kZXJNZXRob2RzLCBTS19BUlJBWV9DT1VOVChnQml0bWFwUmVnaW9uRGVjb2Rlck1ldGhvZHMpKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmNwcCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmNwcAppbmRleCBlMWU5NTM2Li5iZjE1MGE5IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuY3BwCkBAIC0yMCw3ICsyMCw2IEBACiAKICNpbmNsdWRlICJTa0NhbnZhcy5oIgogI2luY2x1ZGUgIlNrRGV2aWNlLmgiCi0jaW5jbHVkZSAiU2tHTENhbnZhcy5oIgogI2luY2x1ZGUgIlNrR3JhcGhpY3MuaCIKICNpbmNsdWRlICJTa0ltYWdlUmVmX0dsb2JhbFBvb2wuaCIKICNpbmNsdWRlICJTa1BvcnRlckR1ZmYuaCIKQEAgLTMwLDYgKzI5LDEzIEBACiAjaW5jbHVkZSAiU2tCb3VuZGFyeVBhdGNoLmgiCiAjaW5jbHVkZSAiU2tNZXNoVXRpbHMuaCIKIAorI2luY2x1ZGUgIlRleHRMYXlvdXQuaCIKKworI2luY2x1ZGUgInVuaWNvZGUvdWJpZGkuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzaGFwZS5oIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKICNkZWZpbmUgVElNRV9EUkFXeAogCiBzdGF0aWMgdWludDMyX3QgZ2V0X3RocmVhZF9tc2VjKCkgewpAQCAtNjAsMTMgKzY2LDggQEAKICAgICAgICAgcmV0dXJuIGJpdG1hcCA/IG5ldyBTa0NhbnZhcygqYml0bWFwKSA6IG5ldyBTa0NhbnZhczsKICAgICB9CiAgICAgCi0gICAgc3RhdGljIFNrQ2FudmFzKiBpbml0R0woSk5JRW52KiBlbnYsIGpvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTa0dMQ2FudmFzOwotICAgIH0KLSAgICAKICAgICBzdGF0aWMgdm9pZCBmcmVlQ2FjaGVzKEpOSUVudiogZW52LCBqb2JqZWN0KSB7CiAgICAgICAgIC8vIHRoZXNlIGFyZSBjYWxsZWQgaW4gbm8gcGFydGljdWxhciBvcmRlcgotICAgICAgICBTa0dMQ2FudmFzOjpEZWxldGVBbGxUZXh0dXJlcygpOwogICAgICAgICBTa0ltYWdlUmVmX0dsb2JhbFBvb2w6OlNldFJBTVVzZWQoMCk7CiAgICAgICAgIFNrR3JhcGhpY3M6OlNldEZvbnRDYWNoZVVzZWQoMCk7CiAgICAgfQpAQCAtMTAzLDExICsxMDQsNiBAQAogICAgICAgICByZXR1cm4gY2FudmFzLT5nZXREZXZpY2UoKS0+YWNjZXNzQml0bWFwKGZhbHNlKS5oZWlnaHQoKTsKICAgICB9CiAKLSAgICBzdGF0aWMgdm9pZCBzZXRWaWV3cG9ydChKTklFbnYqIGVudiwgam9iamVjdCwgU2tDYW52YXMqIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgY2FudmFzLT5zZXRWaWV3cG9ydCh3aWR0aCwgaGVpZ2h0KTsKLSAgICB9Ci0gICAgCiAgICAgc3RhdGljIHZvaWQgc2V0Qml0bWFwKEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTa0JpdG1hcCogYml0bWFwKSB7CiAgICAgICAgIGNhbnZhcy0+c2V0Qml0bWFwRGV2aWNlKCpiaXRtYXApOwpAQCAtNzQzLDQ1ICs3MzksNDkgQEAKICAgICAgICAgY2FudmFzLT5kcmF3VmVydGljZXMobW9kZSwgcHRDb3VudCwgdmVydHMsIHRleHMsIGNvbG9ycywgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlcywgaW5kZXhDb3VudCwgKnBhaW50KTsKICAgICB9Ci0gICAgCi0gICAgc3RhdGljIHZvaWQgZHJhd1RleHRfX19DSUlGRlBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAorCisKKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dF9fX0NJSUZGSVBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgewogICAgICAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKLSAgICAgICAganNpemUgdGV4dENvdW50ID0gZW52LT5HZXRBcnJheUxlbmd0aCh0ZXh0KTsKLSAgICAgICAgU2tTY2FsYXIgeF8gPSBTa0Zsb2F0VG9TY2FsYXIoeCk7Ci0gICAgICAgIFNrU2NhbGFyIHlfID0gU2tGbG9hdFRvU2NhbGFyKHkpOwotICAgICAgICBjYW52YXMtPmRyYXdUZXh0KHRleHRBcnJheSArIGluZGV4LCBjb3VudCA8PCAxLCB4XywgeV8sICpwYWludCk7Ci0gICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIHRleHRBcnJheSwgMCk7CisgICAgICAgIFRleHRMYXlvdXQ6OmRyYXdUZXh0KHBhaW50LCB0ZXh0QXJyYXkgKyBpbmRleCwgY291bnQsIGZsYWdzLCB4LCB5LCBjYW52YXMpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7CiAgICAgfQotIAotICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0X19TdHJpbmdJSUZGUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGFpbnQqIHBhaW50KSB7Ci0gICAgICAgIGNvbnN0IHZvaWQqIHRleHRfID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKLSAgICAgICAgU2tTY2FsYXIgeF8gPSBTa0Zsb2F0VG9TY2FsYXIoeCk7Ci0gICAgICAgIFNrU2NhbGFyIHlfID0gU2tGbG9hdFRvU2NhbGFyKHkpOwotICAgICAgICBjYW52YXMtPmRyYXdUZXh0KChjb25zdCB1aW50MTZfdCopdGV4dF8gKyBzdGFydCwgKGVuZCAtIHN0YXJ0KSA8PCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgIHhfLCB5XywgKnBhaW50KTsKLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgKGNvbnN0IGpjaGFyKikgdGV4dF8pOworCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHRfX1N0cmluZ0lJRkZJUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLCBqc3RyaW5nIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKKyAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7CisgICAgICAgIFRleHRMYXlvdXQ6OmRyYXdUZXh0KHBhaW50LCB0ZXh0QXJyYXkgKyBzdGFydCwgZW5kIC0gc3RhcnQsIGZsYWdzLCB4LCB5LCBjYW52YXMpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOwogICAgIH0KLSAgICAKLSAgICBzdGF0aWMgdm9pZCBkcmF3U3RyaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywganN0cmluZyB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBqb2JqZWN0IHBhaW50KSB7Ci0gICAgICAgIE5QRV9DSEVDS19SRVRVUk5fVk9JRChlbnYsIGNhbnZhcyk7Ci0gICAgICAgIE5QRV9DSEVDS19SRVRVUk5fVk9JRChlbnYsIHBhaW50KTsKLSAgICAgICAgTlBFX0NIRUNLX1JFVFVSTl9WT0lEKGVudiwgdGV4dCk7Ci0gICAgICAgIHNpemVfdCBjb3VudCA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHRleHQpOwotICAgICAgICBpZiAoMCA9PSBjb3VudCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0XyA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7Ci0gICAgICAgIFNrQ2FudmFzKiBjID0gR3JhcGhpY3NKTkk6OmdldE5hdGl2ZUNhbnZhcyhlbnYsIGNhbnZhcyk7Ci0gICAgICAgIGMtPmRyYXdUZXh0KHRleHRfLCBjb3VudCA8PCAxLCBTa0Zsb2F0VG9TY2FsYXIoeCksIFNrRmxvYXRUb1NjYWxhcih5KSwKLSAgICAgICAgICAgICAgICAgICAgKkdyYXBoaWNzSk5JOjpnZXROYXRpdmVQYWludChlbnYsIHBhaW50KSk7Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRfKTsKKworICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0UnVuX19fQ0lJSUlGRklQYWludCgKKyAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQ2FudmFzKiBjYW52YXMsIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LAorICAgICAgICBpbnQgY291bnQsIGludCBjb250ZXh0SW5kZXgsIGludCBjb250ZXh0Q291bnQsCisgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGRpckZsYWdzLCBTa1BhaW50KiBwYWludCkgeworCisgICAgICAgIGpjaGFyKiBjaGFycyA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7CisgICAgICAgIFRleHRMYXlvdXQ6OmRyYXdUZXh0UnVuKHBhaW50LCBjaGFycyArIGNvbnRleHRJbmRleCwgaW5kZXggLSBjb250ZXh0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LCBjb250ZXh0Q291bnQsIGRpckZsYWdzLCB4LCB5LCBjYW52YXMpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBjaGFycywgSk5JX0FCT1JUKTsKICAgICB9Ci0gICAgCisKKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dFJ1bl9fU3RyaW5nSUlJSUZGSVBhaW50KAorICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCBvYmosIFNrQ2FudmFzKiBjYW52YXMsIGpzdHJpbmcgdGV4dCwgamludCBzdGFydCwKKyAgICAgICAgamludCBlbmQsIGppbnQgY29udGV4dFN0YXJ0LCBqaW50IGNvbnRleHRFbmQsCisgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgamludCBkaXJGbGFncywgU2tQYWludCogcGFpbnQpIHsKKworICAgICAgICBqaW50IGNvdW50ID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIGppbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgY29uc3QgamNoYXIqIGNoYXJzID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgVGV4dExheW91dDo6ZHJhd1RleHRSdW4ocGFpbnQsIGNoYXJzICsgY29udGV4dFN0YXJ0LCBzdGFydCAtIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsIGNvbnRleHRDb3VudCwgZGlyRmxhZ3MsIHgsIHksIGNhbnZhcyk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIGNoYXJzKTsKKyAgICB9CisKICAgICBzdGF0aWMgdm9pZCBkcmF3UG9zVGV4dF9fX0NJSV9GUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQ2FudmFzKiBjYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdEFycmF5IHBvcywgU2tQYWludCogcGFpbnQpIHsKQEAgLTgwNCwxMCArODA0LDExIEBACiAgICAgICAgIH0KICAgICAgICAgZGVsZXRlW10gcG9zUHRyOwogICAgIH0KLSAKKwogICAgIHN0YXRpYyB2b2lkIGRyYXdQb3NUZXh0X19TdHJpbmdfRlBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMsIGpzdHJpbmcgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXRBcnJheSBwb3MsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0QXJyYXkgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrUGFpbnQqIHBhaW50KSB7CiAgICAgICAgIGNvbnN0IHZvaWQqIHRleHRfID0gdGV4dCA/IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCkgOiBOVUxMOwogICAgICAgICBpbnQgYnl0ZUxlbmd0aCA9IHRleHQgPyBlbnYtPkdldFN0cmluZ0xlbmd0aCh0ZXh0KSA6IDA7CiAgICAgICAgIGZsb2F0KiBwb3NBcnJheSA9IHBvcyA/IGVudi0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKHBvcywgTlVMTCkgOiBOVUxMOwpAQCAtODI3LDI3ICs4MjgsMjcgQEAKICAgICAgICAgfQogICAgICAgICBkZWxldGVbXSBwb3NQdHI7CiAgICAgfQotIAorCiAgICAgc3RhdGljIHZvaWQgZHJhd1RleHRPblBhdGhfX19DSUlQYXRoRkZQYWludChKTklFbnYqIGVudiwgam9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMsIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgU2tQYXRoKiBwYXRoLCBqZmxvYXQgaE9mZnNldCwgamZsb2F0IHZPZmZzZXQsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLCBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAorICAgICAgICAgICAgU2tQYXRoKiBwYXRoLCBqZmxvYXQgaE9mZnNldCwgamZsb2F0IHZPZmZzZXQsIGppbnQgYmlkaUZsYWdzLCBTa1BhaW50KiBwYWludCkgewogCiAgICAgICAgIGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOwotICAgICAgICBjYW52YXMtPmRyYXdUZXh0T25QYXRoSFYodGV4dEFycmF5ICsgaW5kZXgsIGNvdW50IDw8IDEsICpwYXRoLAotICAgICAgICAgICAgICAgICAgICBTa0Zsb2F0VG9TY2FsYXIoaE9mZnNldCksIFNrRmxvYXRUb1NjYWxhcih2T2Zmc2V0KSwgKnBhaW50KTsKKyAgICAgICAgVGV4dExheW91dDo6ZHJhd1RleHRPblBhdGgocGFpbnQsIHRleHRBcnJheSwgY291bnQsIGJpZGlGbGFncywgaE9mZnNldCwgdk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgY2FudmFzKTsKICAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgdGV4dEFycmF5LCAwKTsKICAgICB9Ci0gCisKICAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dE9uUGF0aF9fU3RyaW5nUGF0aEZGUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LCBTa1BhdGgqIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IGhPZmZzZXQsIGpmbG9hdCB2T2Zmc2V0LCBTa1BhaW50KiBwYWludCkgeworICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LCBTa1BhdGgqIHBhdGgsCisgICAgICAgICAgICBqZmxvYXQgaE9mZnNldCwgamZsb2F0IHZPZmZzZXQsIGppbnQgYmlkaUZsYWdzLCBTa1BhaW50KiBwYWludCkgewogICAgICAgICBjb25zdCBqY2hhciogdGV4dF8gPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOwotICAgICAgICBpbnQgYnl0ZUxlbmd0aCA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHRleHQpIDw8IDE7Ci0gICAgICAgIGNhbnZhcy0+ZHJhd1RleHRPblBhdGhIVih0ZXh0XywgYnl0ZUxlbmd0aCwgKnBhdGgsCi0gICAgICAgICAgICAgICAgICAgIFNrRmxvYXRUb1NjYWxhcihoT2Zmc2V0KSwgU2tGbG9hdFRvU2NhbGFyKHZPZmZzZXQpLCAqcGFpbnQpOworICAgICAgICBpbnQgY291bnQgPSBlbnYtPkdldFN0cmluZ0xlbmd0aCh0ZXh0KTsKKyAgICAgICAgVGV4dExheW91dDo6ZHJhd1RleHRPblBhdGgocGFpbnQsIHRleHRfLCBjb3VudCwgYmlkaUZsYWdzLCBoT2Zmc2V0LCB2T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBjYW52YXMpOwogICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0Xyk7CiAgICAgfQotIAorCiAgICAgc3RhdGljIGJvb2wgZ2V0Q2xpcEJvdW5kcyhKTklFbnYqIGVudiwgam9iamVjdCwgU2tDYW52YXMqIGNhbnZhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgYm91bmRzKSB7CiAgICAgICAgIFNrUmVjdCAgIHI7CkBAIC04NjgsMTIgKzg2OSwxMCBAQAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnQ2FudmFzTWV0aG9kc1tdID0gewogICAgIHsiZmluYWxpemVyIiwgIihJKVYiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZmluYWxpemVyfSwKICAgICB7ImluaXRSYXN0ZXIiLCIoSSlJIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmluaXRSYXN0ZXJ9LAotICAgIHsiaW5pdEdMIiwiKClJIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmluaXRHTH0sCiAgICAgeyJpc09wYXF1ZSIsIigpWiIsICh2b2lkKikgU2tDYW52YXNHbHVlOjppc09wYXF1ZX0sCiAgICAgeyJnZXRXaWR0aCIsIigpSSIsICh2b2lkKikgU2tDYW52YXNHbHVlOjpnZXRXaWR0aH0sCiAgICAgeyJnZXRIZWlnaHQiLCIoKUkiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6Z2V0SGVpZ2h0fSwKICAgICB7Im5hdGl2ZV9zZXRCaXRtYXAiLCIoSUkpViIsICh2b2lkKikgU2tDYW52YXNHbHVlOjpzZXRCaXRtYXB9LAotICAgIHsibmF0aXZlU2V0Vmlld3BvcnQiLCAiKElJSSlWIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OnNldFZpZXdwb3J0fSwKICAgICB7InNhdmUiLCIoKUkiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6c2F2ZUFsbH0sCiAgICAgeyJzYXZlIiwiKEkpSSIsICh2b2lkKikgU2tDYW52YXNHbHVlOjpzYXZlfSwKICAgICB7Im5hdGl2ZV9zYXZlTGF5ZXIiLCIoSUxhbmRyb2lkL2dyYXBoaWNzL1JlY3RGO0lJKUkiLApAQCAtOTQwLDI2ICs5MzksMjcgQEAKICAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdCaXRtYXBSUn0sCiAgICAgeyJuYXRpdmVfZHJhd0JpdG1hcCIsICIoSVtJSUlGRklJWkkpViIsCiAgICAgKHZvaWQqKVNrQ2FudmFzR2x1ZTo6ZHJhd0JpdG1hcEFycmF5fSwKLSAgICAKICAgICB7Im5hdGl2ZURyYXdCaXRtYXBNYXRyaXgiLCAiKElJSUkpViIsCiAgICAgICAgICh2b2lkKilTa0NhbnZhc0dsdWU6OmRyYXdCaXRtYXBNYXRyaXh9LAogICAgIHsibmF0aXZlRHJhd0JpdG1hcE1lc2giLCAiKElJSUlbRklbSUlJKVYiLAogICAgICAgICAodm9pZCopU2tDYW52YXNHbHVlOjpkcmF3Qml0bWFwTWVzaH0sCiAgICAgeyJuYXRpdmVEcmF3VmVydGljZXMiLCAiKElJSVtGSVtGSVtJSVtTSUlJKVYiLAogICAgICAgICAodm9pZCopU2tDYW52YXNHbHVlOjpkcmF3VmVydGljZXN9LAotICAgIHsibmF0aXZlX2RyYXdUZXh0IiwiKElbQ0lJRkZJKVYiLAotICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRfX19DSUlGRlBhaW50fSwKLSAgICB7Im5hdGl2ZV9kcmF3VGV4dCIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUlGRkkpViIsCi0gICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dF9fU3RyaW5nSUlGRlBhaW50fSwKLSAgICB7ImRyYXdUZXh0IiwiKExqYXZhL2xhbmcvU3RyaW5nO0ZGTGFuZHJvaWQvZ3JhcGhpY3MvUGFpbnQ7KVYiLAotICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1N0cmluZ30sCisgICAgeyJuYXRpdmVfZHJhd1RleHQiLCIoSVtDSUlGRklJKVYiLAorICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRfX19DSUlGRklQYWludH0sCisgICAgeyJuYXRpdmVfZHJhd1RleHQiLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJRkZJSSlWIiwKKyAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0X19TdHJpbmdJSUZGSVBhaW50fSwKKyAgICB7Im5hdGl2ZV9kcmF3VGV4dFJ1biIsIihJW0NJSUlJRkZJSSlWIiwKKyAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0UnVuX19fQ0lJSUlGRklQYWludH0sCisgICAgeyJuYXRpdmVfZHJhd1RleHRSdW4iLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJSUlGRklJKVYiLAorICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRSdW5fX1N0cmluZ0lJSUlGRklQYWludH0sCiAgICAgeyJuYXRpdmVfZHJhd1Bvc1RleHQiLCIoSVtDSUlbRkkpViIsCiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3UG9zVGV4dF9fX0NJSV9GUGFpbnR9LAogICAgIHsibmF0aXZlX2RyYXdQb3NUZXh0IiwiKElMamF2YS9sYW5nL1N0cmluZztbRkkpViIsCiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3UG9zVGV4dF9fU3RyaW5nX0ZQYWludH0sCi0gICAgeyJuYXRpdmVfZHJhd1RleHRPblBhdGgiLCIoSVtDSUlJRkZJKVYiLAorICAgIHsibmF0aXZlX2RyYXdUZXh0T25QYXRoIiwiKElbQ0lJSUZGSUkpViIsCiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dE9uUGF0aF9fX0NJSVBhdGhGRlBhaW50fSwKLSAgICB7Im5hdGl2ZV9kcmF3VGV4dE9uUGF0aCIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUZGSSlWIiwKKyAgICB7Im5hdGl2ZV9kcmF3VGV4dE9uUGF0aCIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUZGSUkpViIsCiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dE9uUGF0aF9fU3RyaW5nUGF0aEZGUGFpbnR9LAogICAgIHsibmF0aXZlX2RyYXdQaWN0dXJlIiwgIihJSSlWIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdQaWN0dXJlfSwKIApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9Db2xvckZpbHRlci5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmNwcAppbmRleCBlYmZiMjA5Li5mM2JlOGIwIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmNwcApAQCAtMjMsMjggKzIzLDY5IEBACiAjaW5jbHVkZSAiU2tDb2xvck1hdHJpeEZpbHRlci5oIgogI2luY2x1ZGUgIlNrUG9ydGVyRHVmZi5oIgogCisjaW5jbHVkZSA8U2tpYUNvbG9yRmlsdGVyLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgbmFtZXNwYWNlIHVpcmVuZGVyZXI7CisKIGNsYXNzIFNrQ29sb3JGaWx0ZXJHbHVlIHsKIHB1YmxpYzoKLQotICAgIHN0YXRpYyB2b2lkIGZpbmFsaXplcihKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tDb2xvckZpbHRlciogb2JqKSB7CisgICAgc3RhdGljIHZvaWQgZmluYWxpemVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa0NvbG9yRmlsdGVyKiBvYmosIFNraWFDb2xvckZpbHRlciogZikgeworICAgICAgICBkZWxldGUgZjsKICAgICAgICAgb2JqLT5zYWZlVW5yZWYoKTsKICAgICB9CiAKLSAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihKTklFbnYqIGVudiwgam9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IHNyY0NvbG9yLCBTa1BvcnRlckR1ZmY6Ok1vZGUgbW9kZSkgewotICAgICAgICByZXR1cm4gU2tDb2xvckZpbHRlcjo6Q3JlYXRlTW9kZUZpbHRlcihzcmNDb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1BvcnRlckR1ZmY6OlRvWGZlcm1vZGVNb2RlKG1vZGUpKTsKKyAgICBzdGF0aWMgU2tpYUNvbG9yRmlsdGVyKiBnbENyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsIGppbnQgc3JjQ29sb3IsCisgICAgICAgICAgICBTa1BvcnRlckR1ZmY6Ok1vZGUgbW9kZSkgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICAgICAgcmV0dXJuIG5ldyBTa2lhQmxlbmRGaWx0ZXIoc3JjQ29sb3IsIFNrUG9ydGVyRHVmZjo6VG9YZmVybW9kZU1vZGUobW9kZSkpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKICAgICB9Ci0gCi0gICAgc3RhdGljIFNrQ29sb3JGaWx0ZXIqIENyZWF0ZUxpZ2h0aW5nRmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG11bCwgamludCBhZGQpIHsKKworICAgIHN0YXRpYyBTa2lhQ29sb3JGaWx0ZXIqIGdsQ3JlYXRlTGlnaHRpbmdGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsIGppbnQgbXVsLCBqaW50IGFkZCkgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICAgICAgcmV0dXJuIG5ldyBTa2lhTGlnaHRpbmdGaWx0ZXIobXVsLCBhZGQpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICB9CisKKyAgICBzdGF0aWMgU2tpYUNvbG9yRmlsdGVyKiBnbENyZWF0ZUNvbG9yTWF0cml4RmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0LCBqZmxvYXRBcnJheSBqYXJyYXkpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgICAgIEF1dG9KYXZhRmxvYXRBcnJheSBhdXRvQXJyYXkoZW52LCBqYXJyYXksIDIwKTsKKyAgICAgICAgY29uc3QgZmxvYXQqIHNyYyA9IGF1dG9BcnJheS5wdHIoKTsKKworICAgICAgICBmbG9hdCogY29sb3JNYXRyaXggPSBuZXcgZmxvYXRbMTZdOworICAgICAgICBtZW1jcHkoY29sb3JNYXRyaXgsIHNyYywgNCAqIHNpemVvZihmbG9hdCkpOworICAgICAgICBtZW1jcHkoJmNvbG9yTWF0cml4WzRdLCAmc3JjWzVdLCA0ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIG1lbWNweSgmY29sb3JNYXRyaXhbOF0sICZzcmNbMTBdLCA0ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIG1lbWNweSgmY29sb3JNYXRyaXhbMTJdLCAmc3JjWzE1XSwgNCAqIHNpemVvZihmbG9hdCkpOworCisgICAgICAgIGZsb2F0KiBjb2xvclZlY3RvciA9IG5ldyBmbG9hdFs0XTsKKyAgICAgICAgY29sb3JWZWN0b3JbMF0gPSBzcmNbNF07CisgICAgICAgIGNvbG9yVmVjdG9yWzFdID0gc3JjWzldOworICAgICAgICBjb2xvclZlY3RvclsyXSA9IHNyY1sxNF07CisgICAgICAgIGNvbG9yVmVjdG9yWzNdID0gc3JjWzE5XTsKKworICAgICAgICByZXR1cm4gbmV3IFNraWFDb2xvck1hdHJpeEZpbHRlcihjb2xvck1hdHJpeCwgY29sb3JWZWN0b3IpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICB9CisKKyAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihKTklFbnYqIGVudiwgam9iamVjdCwgamludCBzcmNDb2xvciwKKyAgICAgICAgICAgIFNrUG9ydGVyRHVmZjo6TW9kZSBtb2RlKSB7CisgICAgICAgIHJldHVybiBTa0NvbG9yRmlsdGVyOjpDcmVhdGVNb2RlRmlsdGVyKHNyY0NvbG9yLCBTa1BvcnRlckR1ZmY6OlRvWGZlcm1vZGVNb2RlKG1vZGUpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlTGlnaHRpbmdGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsIGppbnQgbXVsLCBqaW50IGFkZCkgewogICAgICAgICByZXR1cm4gU2tDb2xvckZpbHRlcjo6Q3JlYXRlTGlnaHRpbmdGaWx0ZXIobXVsLCBhZGQpOwogICAgIH0KLSAgICAKLSAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlQ29sb3JNYXRyaXhGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdEFycmF5IGphcnJheSkgeworCisgICAgc3RhdGljIFNrQ29sb3JGaWx0ZXIqIENyZWF0ZUNvbG9yTWF0cml4RmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0LCBqZmxvYXRBcnJheSBqYXJyYXkpIHsKICAgICAgICAgQXV0b0phdmFGbG9hdEFycmF5IGF1dG9BcnJheShlbnYsIGphcnJheSwgMjApOwogICAgICAgICBjb25zdCBmbG9hdCogc3JjID0gYXV0b0FycmF5LnB0cigpOwogCkBAIC01OCwyNiArOTksMjUgQEAKICAgICAgICAgcmV0dXJuIG5ldyBTa0NvbG9yTWF0cml4RmlsdGVyKHNyYyk7CiAjZW5kaWYKICAgICB9Ci0gCiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGNvbG9yZmlsdGVyX21ldGhvZHNbXSA9IHsKLSAgICB7ImZpbmFsaXplciIsICIoSSlWIiwgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6ZmluYWxpemVyfQorICAgIHsiZmluYWxpemVyIiwgIihJSSlWIiwgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6ZmluYWxpemVyfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBwb3J0ZXJkdWZmX21ldGhvZHNbXSA9IHsKLSAgICB7Im5hdGl2ZV9DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyIiwiKElJKUkiLAotICAgICAgICAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpDcmVhdGVQb3J0ZXJEdWZmRmlsdGVyfQorICAgIHsgIm5hdGl2ZV9DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyIiwgIihJSSlJIiwgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6Q3JlYXRlUG9ydGVyRHVmZkZpbHRlciAgIH0sCisgICAgeyAibkNyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIiLCAgICAgICAiKElJKUkiLCAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpnbENyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIgfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBsaWdodGluZ19tZXRob2RzW10gPSB7Ci0gICAgeyJuYXRpdmVfQ3JlYXRlTGlnaHRpbmdGaWx0ZXIiLCIoSUkpSSIsCi0gICAgICAgICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OkNyZWF0ZUxpZ2h0aW5nRmlsdGVyfQorICAgIHsgIm5hdGl2ZV9DcmVhdGVMaWdodGluZ0ZpbHRlciIsICIoSUkpSSIsICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OkNyZWF0ZUxpZ2h0aW5nRmlsdGVyICAgfSwKKyAgICB7ICJuQ3JlYXRlTGlnaHRpbmdGaWx0ZXIiLCAgICAgICAiKElJKUkiLCAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpnbENyZWF0ZUxpZ2h0aW5nRmlsdGVyIH0sCiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGNvbG9ybWF0cml4X21ldGhvZHNbXSA9IHsKLSAgICB7Im5hdGl2ZUNvbG9yTWF0cml4RmlsdGVyIiwiKFtGKUkiLAotICAgICAgICAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpDcmVhdGVDb2xvck1hdHJpeEZpbHRlcn0KKyAgICB7ICJuYXRpdmVDb2xvck1hdHJpeEZpbHRlciIsICIoW0YpSSIsICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OkNyZWF0ZUNvbG9yTWF0cml4RmlsdGVyICAgfSwKKyAgICB7ICJuQ29sb3JNYXRyaXhGaWx0ZXIiLCAgICAgICIoW0YpSSIsICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OmdsQ3JlYXRlQ29sb3JNYXRyaXhGaWx0ZXIgfQogfTsKIAogI2RlZmluZSBSRUcoZW52LCBuYW1lLCBhcnJheSkgXApAQCAtODUsNyArMTI1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS19BUlJBWV9DT1VOVChhcnJheSkpOyAgXAogICAgIGlmIChyZXN1bHQgPCAwKSByZXR1cm4gcmVzdWx0CiAKLQogaW50IHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfQ29sb3JGaWx0ZXIoSk5JRW52KiBlbnYpIHsKICAgICBpbnQgcmVzdWx0OwogICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9HcmFwaGljcy5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0dyYXBoaWNzLmNwcAppbmRleCAxOTVmNGQyLi45NDY3YmU4IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0dyYXBoaWNzLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0dyYXBoaWNzLmNwcApAQCAtNDYsNyArNDYsNyBAQAogfQogCiB2b2lkIGRvVGhyb3dJT0UoSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIG1zZykgewotICAgIGRvVGhyb3coZW52LCAiamF2YS9sYW5nL0lPRXhjZXB0aW9uIiwgbXNnKTsKKyAgICBkb1Rocm93KGVudiwgImphdmEvaW8vSU9FeGNlcHRpb24iLCBtc2cpOwogfQogCiBib29sIEdyYXBoaWNzSk5JOjpoYXNFeGNlcHRpb24oSk5JRW52ICplbnYpIHsKQEAgLTE2OCw2ICsxNjgsOSBAQAogc3RhdGljIGpjbGFzcyAgIGdCaXRtYXBDb25maWdfY2xhc3M7CiBzdGF0aWMgamZpZWxkSUQgZ0JpdG1hcENvbmZpZ19uYXRpdmVJbnN0YW5jZUlEOwogCitzdGF0aWMgamNsYXNzICAgZ0JpdG1hcFJlZ2lvbkRlY29kZXJfY2xhc3M7CitzdGF0aWMgam1ldGhvZElEIGdCaXRtYXBSZWdpb25EZWNvZGVyX2NvbnN0cnVjdG9yTWV0aG9kSUQ7CisKIHN0YXRpYyBqY2xhc3MgICBnQ2FudmFzX2NsYXNzOwogc3RhdGljIGpmaWVsZElEIGdDYW52YXNfbmF0aXZlSW5zdGFuY2VJRDsKIApAQCAtMzc0LDYgKzM3NywyNCBAQAogICAgIHJldHVybiBvYmo7CiB9CiAKK2pvYmplY3QgR3JhcGhpY3NKTkk6OmNyZWF0ZUJpdG1hcFJlZ2lvbkRlY29kZXIoSk5JRW52KiBlbnYsIFNrQml0bWFwUmVnaW9uRGVjb2RlciogYml0bWFwKQoreworICAgIFNrQVNTRVJUKGJpdG1hcCAhPSBOVUxMKTsKKworICAgIGpvYmplY3Qgb2JqID0gZW52LT5BbGxvY09iamVjdChnQml0bWFwUmVnaW9uRGVjb2Rlcl9jbGFzcyk7CisgICAgaWYgKGhhc0V4Y2VwdGlvbihlbnYpKSB7CisgICAgICAgIG9iaiA9IE5VTEw7CisgICAgICAgIHJldHVybiBvYmo7CisgICAgfQorICAgIGlmIChvYmopIHsKKyAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChvYmosIGdCaXRtYXBSZWdpb25EZWNvZGVyX2NvbnN0cnVjdG9yTWV0aG9kSUQsIChqaW50KWJpdG1hcCk7CisgICAgICAgIGlmIChoYXNFeGNlcHRpb24oZW52KSkgeworICAgICAgICAgICAgb2JqID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb2JqOworfQorCiBqb2JqZWN0IEdyYXBoaWNzSk5JOjpjcmVhdGVSZWdpb24oSk5JRW52KiBlbnYsIFNrUmVnaW9uKiByZWdpb24pCiB7CiAgICAgU2tBU1NFUlQocmVnaW9uICE9IE5VTEwpOwpAQCAtNTkyLDYgKzYxMyw5IEBACiAgICAgZ0JpdG1hcF9jb25zdHJ1Y3Rvck1ldGhvZElEID0gZW52LT5HZXRNZXRob2RJRChnQml0bWFwX2NsYXNzLCAiPGluaXQ+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihJWltCSSlWIik7CiAKKyAgICBnQml0bWFwUmVnaW9uRGVjb2Rlcl9jbGFzcyA9IG1ha2VfZ2xvYmFscmVmKGVudiwgImFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwUmVnaW9uRGVjb2RlciIpOworICAgIGdCaXRtYXBSZWdpb25EZWNvZGVyX2NvbnN0cnVjdG9yTWV0aG9kSUQgPSBlbnYtPkdldE1ldGhvZElEKGdCaXRtYXBSZWdpb25EZWNvZGVyX2NsYXNzLCAiPGluaXQ+IiwgIihJKVYiKTsKKwogICAgIGdCaXRtYXBDb25maWdfY2xhc3MgPSBtYWtlX2dsb2JhbHJlZihlbnYsICJhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcCRDb25maWciKTsKICAgICBnQml0bWFwQ29uZmlnX25hdGl2ZUluc3RhbmNlSUQgPSBnZXRGaWVsZElEQ2hlY2soZW52LCBnQml0bWFwQ29uZmlnX2NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmF0aXZlSW50IiwgIkkiKTsgICAgCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0dyYXBoaWNzSk5JLmggYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0dyYXBoaWNzSk5JLmgKaW5kZXggMWY5NDQxOC4uZDBmOTEyNSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9HcmFwaGljc0pOSS5oCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvR3JhcGhpY3NKTkkuaApAQCAtNCw2ICs0LDcgQEAKICNpbmNsdWRlICJTa1BvaW50LmgiCiAjaW5jbHVkZSAiU2tSZWN0LmgiCiAjaW5jbHVkZSAiU2tCaXRtYXAuaCIKKyNpbmNsdWRlICIuLi9pbWFnZXMvU2tCaXRtYXBSZWdpb25EZWNvZGVyLmgiCiAjaW5jbHVkZSAiLi4vaW1hZ2VzL1NrSW1hZ2VEZWNvZGVyLmgiCiAjaW5jbHVkZSA8am5pLmg+CiAKQEAgLTU1LDYgKzU2LDggQEAKICAgICAKICAgICBzdGF0aWMgam9iamVjdCBjcmVhdGVSZWdpb24oSk5JRW52KiBlbnYsIFNrUmVnaW9uKiByZWdpb24pOwogCisgICAgc3RhdGljIGpvYmplY3QgY3JlYXRlQml0bWFwUmVnaW9uRGVjb2RlcihKTklFbnYqIGVudiwgU2tCaXRtYXBSZWdpb25EZWNvZGVyKiBiaXRtYXApOworCiAgICAgLyoqIFNldCBhIHBpeGVscmVmIGZvciB0aGUgYml0bWFwIChuZWVkcyBzZXRDb25maWcgdG8gYWxyZWFkeSBiZSBjYWxsZWQpCiAgICAgICAgIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLiBJZiBpdCByZXR1cm5zIGZhbHNlLCB0aGVuIGl0IGZhaWxlZCwgYW5kIHRoZQogICAgICAgICBhcHByb3ByaWF0ZSBleGNlcHRpb24gd2lsbCBoYXZlIGJlZW4gcmFpc2VkLgpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9NYXRyaXguY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9NYXRyaXguY3BwCmluZGV4IGI3ODI3NjYuLmNhZmNlYWIgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvTWF0cml4LmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL01hdHJpeC5jcHAKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlICJTa01hdHJpeC5oIgogI2luY2x1ZGUgIlNrVGVtcGxhdGVzLmgiCiAKKyNpbmNsdWRlICJNYXRyaXguaCIKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBTa01hdHJpeEdsdWUgewpAQCAtNDAzLDEwICs0MDUsMjAgQEAKICAgICB7Im5hdGl2ZV9lcXVhbHMiLCAiKElJKVoiLCAodm9pZCopIFNrTWF0cml4R2x1ZTo6ZXF1YWxzfQogfTsKIAorc3RhdGljIGpmaWVsZElEIHNOYXRpdmVJbnN0YW5jZUZpZWxkOworCiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19NYXRyaXgoSk5JRW52KiBlbnYpIHsKICAgICBpbnQgcmVzdWx0ID0gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJhbmRyb2lkL2dyYXBoaWNzL01hdHJpeCIsIG1ldGhvZHMsCiAgICAgICAgIHNpemVvZihtZXRob2RzKSAvIHNpemVvZihtZXRob2RzWzBdKSk7CisKKyAgICBqY2xhc3MgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9ncmFwaGljcy9NYXRyaXgiKTsKKyAgICBzTmF0aXZlSW5zdGFuY2VGaWVsZCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgIm5hdGl2ZV9pbnN0YW5jZSIsICJJIik7CisKICAgICByZXR1cm4gcmVzdWx0OwogfQogCitTa01hdHJpeCogYW5kcm9pZF9ncmFwaGljc19NYXRyaXhfZ2V0U2tNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QgbWF0cml4T2JqKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2tNYXRyaXgqPihlbnYtPkdldEludEZpZWxkKG1hdHJpeE9iaiwgc05hdGl2ZUluc3RhbmNlRmllbGQpKTsKK30KKwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9NYXRyaXguaCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvTWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlZGY4OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvTWF0cml4LmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0FORFJPSURfR1JBUEhJQ1NfTUFUUklYX0gKKyNkZWZpbmUgX0FORFJPSURfR1JBUEhJQ1NfTUFUUklYX0gKKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgIlNrTWF0cml4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogR2V0cyB0aGUgdW5kZXJseWluZyBTa01hdHJpeCBmcm9tIGEgTWF0cml4IG9iamVjdC4gKi8KK2V4dGVybiBTa01hdHJpeCogYW5kcm9pZF9ncmFwaGljc19NYXRyaXhfZ2V0U2tNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QgbWF0cml4T2JqKTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX0FORFJPSURfR1JBUEhJQ1NfTUFUUklYX0gKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9QYWludC5jcHAKaW5kZXggNzgwYmFkYy4uY2E5ZjM3MSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9QYWludC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9QYWludC5jcHAKQEAgLTMxLDYgKzMxLDExIEBACiAjaW5jbHVkZSAiU2tTaGFkZXIuaCIKICNpbmNsdWRlICJTa1R5cGVmYWNlLmgiCiAjaW5jbHVkZSAiU2tYZmVybW9kZS5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXNoYXBlLmgiCisjaW5jbHVkZSAiVGV4dExheW91dC5oIgorCisvLyB0ZW1wb3JhcnkgZm9yIGRlYnVnZ2luZworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTU3LDYgKzYyLDkgQEAKIAogY2xhc3MgU2tQYWludEdsdWUgewogcHVibGljOgorICAgIGVudW0gTW92ZU9wdCB7CisgICAgICAgIEFGVEVSLCBBVF9PUl9BRlRFUiwgQkVGT1JFLCBBVF9PUl9CRUZPUkUsIEFUCisgICAgfTsKIAogICAgIHN0YXRpYyB2b2lkIGZpbmFsaXplcihKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogb2JqKSB7CiAgICAgICAgIGRlbGV0ZSBvYmo7CkBAIC0zOTUsMjAgKzQwMywxNjEgQEAKICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dEFycmF5KTsKICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgIH0KLSAgICAKLSAgICBzdGF0aWMgdm9pZCBnZXRUZXh0UGF0aF9fX0NJSUZGUGF0aChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogcGFpbnQsIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tQYXRoKiBwYXRoKSB7Ci0gICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOwotICAgICAgICBwYWludC0+Z2V0VGV4dFBhdGgodGV4dEFycmF5ICsgaW5kZXgsIGNvdW50IDw8IDEsIFNrRmxvYXRUb1NjYWxhcih4KSwgU2tGbG9hdFRvU2NhbGFyKHkpLCBwYXRoKTsKLSAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgY29uc3RfY2FzdDxqY2hhcio+KHRleHRBcnJheSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpOSV9BQk9SVCk7CisKKyAgICBzdGF0aWMgamZsb2F0IGRvVGV4dFJ1bkFkdmFuY2VzKEpOSUVudiAqZW52LCBTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIgKnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IHN0YXJ0LCBqaW50IGNvdW50LCBqaW50IGNvbnRleHRDb3VudCwgamludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdEFycmF5IGFkdmFuY2VzLCBqaW50IGFkdmFuY2VzSW5kZXgpIHsKKyAgICAgICAgamZsb2F0IGFkdmFuY2VzQXJyYXlbY291bnRdOworICAgICAgICBqZmxvYXQgdG90YWxBZHZhbmNlOworCisgICAgICAgIFRleHRMYXlvdXQ6OmdldFRleHRSdW5BZHZhbmNlcyhwYWludCwgdGV4dCwgc3RhcnQsIGNvdW50LCBjb250ZXh0Q291bnQsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZXNBcnJheSwgdG90YWxBZHZhbmNlKTsKKworICAgICAgICBpZiAoYWR2YW5jZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgZW52LT5TZXRGbG9hdEFycmF5UmVnaW9uKGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4LCBjb3VudCwgYWR2YW5jZXNBcnJheSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvdGFsQWR2YW5jZTsKICAgICB9Ci0gCi0gICAgc3RhdGljIHZvaWQgZ2V0VGV4dFBhdGhfX1N0cmluZ0lJRkZQYXRoKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwganN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tQYXRoKiBwYXRoKSB7CisKKyAgICBzdGF0aWMgZmxvYXQgZ2V0VGV4dFJ1bkFkdmFuY2VzX19fQ0lJSUlJX0ZJKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwKKyAgICAgICAgICAgIGpjaGFyQXJyYXkgdGV4dCwgamludCBpbmRleCwgamludCBjb3VudCwgamludCBjb250ZXh0SW5kZXgsIGppbnQgY29udGV4dENvdW50LAorICAgICAgICAgICAgamludCBmbGFncywgamZsb2F0QXJyYXkgYWR2YW5jZXMsIGppbnQgYWR2YW5jZXNJbmRleCkgeworICAgICAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgamZsb2F0IHJlc3VsdCA9IGRvVGV4dFJ1bkFkdmFuY2VzKGVudiwgcGFpbnQsIHRleHRBcnJheSArIGNvbnRleHRJbmRleCwKKyAgICAgICAgICAgIGluZGV4IC0gY29udGV4dEluZGV4LCBjb3VudCwgY29udGV4dENvdW50LCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlc19fU3RyaW5nSUlJSUlfRkkoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LAorICAgICAgICAgICAganN0cmluZyB0ZXh0LCBqaW50IHN0YXJ0LCBqaW50IGVuZCwgamludCBjb250ZXh0U3RhcnQsIGppbnQgY29udGV4dEVuZCwgamludCBmbGFncywKKyAgICAgICAgICAgIGpmbG9hdEFycmF5IGFkdmFuY2VzLCBqaW50IGFkdmFuY2VzSW5kZXgpIHsKICAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7Ci0gICAgICAgIHBhaW50LT5nZXRUZXh0UGF0aCh0ZXh0QXJyYXkgKyBzdGFydCwgKGVuZCAtIHN0YXJ0KSA8PCAxLCBTa0Zsb2F0VG9TY2FsYXIoeCksIFNrRmxvYXRUb1NjYWxhcih5KSwgcGF0aCk7CisgICAgICAgIGpmbG9hdCByZXN1bHQgPSBkb1RleHRSdW5BZHZhbmNlcyhlbnYsIHBhaW50LCB0ZXh0QXJyYXkgKyBjb250ZXh0U3RhcnQsCisgICAgICAgICAgICBzdGFydCAtIGNvbnRleHRTdGFydCwgZW5kIC0gc3RhcnQsIGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQsIGZsYWdzLCBhZHZhbmNlcywKKyAgICAgICAgICAgIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBqaW50IGRvVGV4dFJ1bkN1cnNvcihKTklFbnYgKmVudiwgU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyICp0ZXh0LCBqaW50IHN0YXJ0LAorICAgICAgICAgICAgamludCBjb3VudCwgamludCBmbGFncywgamludCBvZmZzZXQsIGppbnQgb3B0KSB7CisgICAgICAgIFNrU2NhbGFyIHNjYWxhckFycmF5W2NvdW50XTsKKyAgICAgICAgamNoYXIgYnVmZmVyW2NvdW50XTsKKworICAgICAgICAvLyB0aGlzIGlzIHdoZXJlIHdlJ2QgY2FsbCBoYXJmYnV6egorICAgICAgICAvLyBmb3Igbm93IHdlIGp1c3QgdXNlIHVzaGFwZS5jIGFuZCB3aWR0aHMgcmV0dXJuZWQgZnJvbSBza2lhCisKKyAgICAgICAgaW50IHdpZHRoczsKKyAgICAgICAgaWYgKGZsYWdzICYgMHgxKSB7IC8vIHJ0bCwgY2FsbCBhcmFiaWMgc2hhcGluZyBpbiBjYXNlCisgICAgICAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgICAgIC8vIFVzZSBmaXhlZCBsZW5ndGggc2luY2Ugd2UgbmVlZCB0byBrZWVwIHN0YXJ0IGFuZCBjb3VudCB2YWxpZAorICAgICAgICAgICAgdV9zaGFwZUFyYWJpYyh0ZXh0ICsgc3RhcnQsIGNvdW50LCBidWZmZXIsIGNvdW50LAorICAgICAgICAgICAgICAgICAgICBVX1NIQVBFX0xFTkdUSF9GSVhFRF9TUEFDRVNfTkVBUiB8IFVfU0hBUEVfVEVYVF9ESVJFQ1RJT05fTE9HSUNBTCB8CisgICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfTEVUVEVSU19TSEFQRSB8IFVfU0hBUEVfWF9MQU1BTEVGX1NVQl9BTFRFUk5BVEUsICZzdGF0dXMpOworICAgICAgICAgICAgLy8gd2Ugc2hvdWxkbid0IGZhaWwgdW5sZXNzIHRoZXJlJ3MgYW4gb3V0IG9mIG1lbW9yeSBjb25kaXRpb24sCisgICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHdlJ3JlIGhvc2VkIGFueXdheQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICAgIGlmIChidWZmZXJbaV0gPT0gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gMHgyMDBiOyAvLyB6ZXJvLXdpZHRoLXNwYWNlIGZvciBza2lhCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdpZHRocyA9IHBhaW50LT5nZXRUZXh0V2lkdGhzKGJ1ZmZlciwgY291bnQgPDwgMSwgc2NhbGFyQXJyYXkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2lkdGhzID0gcGFpbnQtPmdldFRleHRXaWR0aHModGV4dCArIHN0YXJ0LCBjb3VudCA8PCAxLCBzY2FsYXJBcnJheSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAod2lkdGhzIDwgY291bnQpIHsKKyAgICAgICAgICAgIC8vIFNraWEgb3BlcmF0ZXMgb24gY29kZSBwb2ludHMsIG5vdCBjb2RlIHVuaXRzLCBzbyBzdXJyb2dhdGUgcGFpcnMgcmV0dXJuIG9ubHkgb25lCisgICAgICAgICAgICAvLyB2YWx1ZS4gRXhwYW5kIHRoZSByZXN1bHQgc28gd2UgaGF2ZSBvbmUgdmFsdWUgcGVyIFVURi0xNiBjb2RlIHVuaXQuCisKKyAgICAgICAgICAgIC8vIE5vdGUsIHNraWEncyBnZXRUZXh0V2lkdGggZ2V0cyBjb25mdXNlZCBpZiBpdCBlbmNvdW50ZXJzIGEgc3Vycm9nYXRlIHBhaXIsCisgICAgICAgICAgICAvLyBsZWF2aW5nIHRoZSByZW1haW5pbmcgd2lkdGhzIHplcm8uICBOb3QgbmljZS4KKyAgICAgICAgICAgIGNvbnN0IGpjaGFyICpjaGFycyA9IHRleHQgKyBzdGFydDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBjb3VudCwgcCA9IHdpZHRocyAtIDE7IC0taSA+IHA7KSB7CisgICAgICAgICAgICAgICAgaWYgKGNoYXJzW2ldID49IDB4ZGMwMCAmJiBjaGFyc1tpXSA8IDB4ZTAwMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNbaS0xXSA+PSAweGQ4MDAgJiYgY2hhcnNbaS0xXSA8IDB4ZGMwMCkgeworICAgICAgICAgICAgICAgICAgICBzY2FsYXJBcnJheVtpXSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHNjYWxhckFycmF5W2ldID0gc2NhbGFyQXJyYXlbLS1wXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBqaW50IHBvcyA9IG9mZnNldCAtIHN0YXJ0OworICAgICAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgICBjYXNlIEFGVEVSOgorICAgICAgICAgIGlmIChwb3MgPCBjb3VudCkgeworICAgICAgICAgICAgcG9zICs9IDE7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBjYXNlIEFUX09SX0FGVEVSOgorICAgICAgICAgIHdoaWxlIChwb3MgPCBjb3VudCAmJiBzY2FsYXJBcnJheVtwb3NdID09IDApIHsKKyAgICAgICAgICAgICsrcG9zOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCRUZPUkU6CisgICAgICAgICAgaWYgKHBvcyA+IDApIHsKKyAgICAgICAgICAgIC0tcG9zOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgY2FzZSBBVF9PUl9CRUZPUkU6CisgICAgICAgICAgd2hpbGUgKHBvcyA+IDAgJiYgc2NhbGFyQXJyYXlbcG9zXSA9PSAwKSB7CisgICAgICAgICAgICAtLXBvczsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgaWYgKHNjYWxhckFycmF5W3Bvc10gPT0gMCkgeworICAgICAgICAgICAgcG9zID0gLTE7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvcyAhPSAtMSkgeworICAgICAgICAgIHBvcyArPSBzdGFydDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwb3M7CisgICAgfQorCisgICAgc3RhdGljIGppbnQgZ2V0VGV4dFJ1bkN1cnNvcl9fX0MoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LCBqY2hhckFycmF5IHRleHQsCisgICAgICAgICAgICBqaW50IGNvbnRleHRTdGFydCwgamludCBjb250ZXh0Q291bnQsIGppbnQgZmxhZ3MsIGppbnQgb2Zmc2V0LCBqaW50IGN1cnNvck9wdCkgeworICAgICAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgamludCByZXN1bHQgPSBkb1RleHRSdW5DdXJzb3IoZW52LCBwYWludCwgdGV4dEFycmF5LCBjb250ZXh0U3RhcnQsIGNvbnRleHRDb3VudCwgZmxhZ3MsCisgICAgICAgICAgICAgICAgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIGppbnQgZ2V0VGV4dFJ1bkN1cnNvcl9fU3RyaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwganN0cmluZyB0ZXh0LAorICAgICAgICAgICAgamludCBjb250ZXh0U3RhcnQsIGppbnQgY29udGV4dEVuZCwgamludCBmbGFncywgamludCBvZmZzZXQsIGppbnQgY3Vyc29yT3B0KSB7CisgICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOworICAgICAgICBqaW50IHJlc3VsdCA9IGRvVGV4dFJ1bkN1cnNvcihlbnYsIHBhaW50LCB0ZXh0QXJyYXksIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgICAgICBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0LCBmbGFncywgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGdldFRleHRQYXRoKEpOSUVudiogZW52LCBTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGppbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBiaWRpRmxhZ3MsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tQYXRoICpwYXRoKSB7CisgICAgICAgIFRleHRMYXlvdXQ6OmdldFRleHRQYXRoKHBhaW50LCB0ZXh0LCBjb3VudCwgYmlkaUZsYWdzLCB4LCB5LCBwYXRoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBnZXRUZXh0UGF0aF9fX0MoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LCBqaW50IGJpZGlGbGFncywKKyAgICAgICAgICAgIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tQYXRoKiBwYXRoKSB7CisgICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOworICAgICAgICBnZXRUZXh0UGF0aChlbnYsIHBhaW50LCB0ZXh0QXJyYXkgKyBpbmRleCwgY291bnQsIGJpZGlGbGFncywgeCwgeSwgcGF0aCk7CisgICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIGNvbnN0X2Nhc3Q8amNoYXIqPih0ZXh0QXJyYXkpLCBKTklfQUJPUlQpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGdldFRleHRQYXRoX19TdHJpbmcoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LCBqaW50IGJpZGlGbGFncywKKyAgICAgICAgICAgIGpzdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGF0aCogcGF0aCkgeworICAgICAgICBjb25zdCBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgZ2V0VGV4dFBhdGgoZW52LCBwYWludCwgdGV4dEFycmF5ICsgc3RhcnQsIGVuZCAtIHN0YXJ0LCBiaWRpRmxhZ3MsIHgsIHksIHBhdGgpOwogICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOwogICAgIH0KLSAKKwogICAgIHN0YXRpYyB2b2lkIHNldFNoYWRvd0xheWVyKEpOSUVudiogZW52LCBqb2JqZWN0IGpwYWludCwgamZsb2F0IHJhZGl1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgZHgsIGpmbG9hdCBkeSwgaW50IGNvbG9yKSB7CiAgICAgICAgIE5QRV9DSEVDS19SRVRVUk5fVk9JRChlbnYsIGpwYWludCk7CkBAIC01NzYsMTMgKzcyNSwyMCBAQAogICAgIHsibmF0aXZlX2JyZWFrVGV4dCIsIihMamF2YS9sYW5nL1N0cmluZztaRltGKUkiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpicmVha1RleHRTfSwKICAgICB7Im5hdGl2ZV9nZXRUZXh0V2lkdGhzIiwiKElbQ0lJW0YpSSIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRXaWR0aHNfX19DSUlfRn0sCiAgICAgeyJuYXRpdmVfZ2V0VGV4dFdpZHRocyIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUlbRilJIiwgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFdpZHRoc19fU3RyaW5nSUlfRn0sCi0gICAgeyJuYXRpdmVfZ2V0VGV4dFBhdGgiLCIoSVtDSUlGRkkpViIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRQYXRoX19fQ0lJRkZQYXRofSwKLSAgICB7Im5hdGl2ZV9nZXRUZXh0UGF0aCIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUlGRkkpViIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRQYXRoX19TdHJpbmdJSUZGUGF0aH0sCisgICAgeyJuYXRpdmVfZ2V0VGV4dFJ1bkFkdmFuY2VzIiwiKElbQ0lJSUlJW0ZJKUYiLCAodm9pZCopCisgICAgICAgIFNrUGFpbnRHbHVlOjpnZXRUZXh0UnVuQWR2YW5jZXNfX19DSUlJSUlfRkl9LAorICAgIHsibmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUlJSUlbRkkpRiIsCisgICAgICAgICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRSdW5BZHZhbmNlc19fU3RyaW5nSUlJSUlfRkl9LAorICAgIHsibmF0aXZlX2dldFRleHRSdW5DdXJzb3IiLCAiKElbQ0lJSUlJKUkiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UnVuQ3Vyc29yX19fQ30sCisgICAgeyJuYXRpdmVfZ2V0VGV4dFJ1bkN1cnNvciIsICIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJSUlJKUkiLAorICAgICAgICAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UnVuQ3Vyc29yX19TdHJpbmd9LAorICAgIHsibmF0aXZlX2dldFRleHRQYXRoIiwiKElJW0NJSUZGSSlWIiwgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFBhdGhfX19DfSwKKyAgICB7Im5hdGl2ZV9nZXRUZXh0UGF0aCIsIihJSUxqYXZhL2xhbmcvU3RyaW5nO0lJRkZJKVYiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UGF0aF9fU3RyaW5nfSwKICAgICB7Im5hdGl2ZUdldFN0cmluZ0JvdW5kcyIsICIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJTGFuZHJvaWQvZ3JhcGhpY3MvUmVjdDspViIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0U3RyaW5nQm91bmRzIH0sCiAgICAgeyJuYXRpdmVHZXRDaGFyQXJyYXlCb3VuZHMiLCAiKElbQ0lJTGFuZHJvaWQvZ3JhcGhpY3MvUmVjdDspViIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRDaGFyQXJyYXlCb3VuZHMgfSwKLSAgICB7InNldFNoYWRvd0xheWVyIiwgIihGRkZJKVYiLCAodm9pZCopU2tQYWludEdsdWU6OnNldFNoYWRvd0xheWVyfQorICAgIHsiblNldFNoYWRvd0xheWVyIiwgIihGRkZJKVYiLCAodm9pZCopU2tQYWludEdsdWU6OnNldFNoYWRvd0xheWVyfQogfTsKIAogc3RhdGljIGpmaWVsZElEIHJlcV9maWVsZElEKGpmaWVsZElEIGlkKSB7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhdGguY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9QYXRoLmNwcAppbmRleCBiOGIyYTEwLi5hYmUzM2Y0IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhdGguY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvUGF0aC5jcHAKQEAgLTI2LDEyICsyNiwxOSBAQAogCiAjaW5jbHVkZSAiU2tQYXRoLmgiCiAKKyNpbmNsdWRlIDxDYWNoZXMuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBTa1BhdGhHbHVlIHsKIHB1YmxpYzoKIAogICAgIHN0YXRpYyB2b2lkIGZpbmFsaXplcihKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYXRoKiBvYmopIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgICAgIGlmIChhbmRyb2lkOjp1aXJlbmRlcmVyOjpDYWNoZXM6Omhhc0luc3RhbmNlKCkpIHsKKyAgICAgICAgICAgIGFuZHJvaWQ6OnVpcmVuZGVyZXI6OkNhY2hlczo6Z2V0SW5zdGFuY2UoKS5wYXRoQ2FjaGUucmVtb3ZlKG9iaik7CisgICAgICAgIH0KKyNlbmRpZgogICAgICAgICBkZWxldGUgb2JqOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuY3BwCmluZGV4IGIwOWM2MmIuLmVlNDQ3NDcgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvU2hhZGVyLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1NoYWRlci5jcHAKQEAgLTgsNiArOCwxNiBAQAogI2luY2x1ZGUgIlNrVGVtcGxhdGVzLmgiCiAjaW5jbHVkZSAiU2tYZmVybW9kZS5oIgogCisjaW5jbHVkZSA8U2tpYVNoYWRlci5oPgorI2luY2x1ZGUgPENhY2hlcy5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6dWlyZW5kZXJlcjsKKworc3RhdGljIHN0cnVjdCB7CisgICAgamNsYXNzIGNsYXp6OworICAgIGpmaWVsZElEIHNoYWRlcjsKK30gZ1NoYWRlckNsYXNzSW5mbzsKKwogc3RhdGljIHZvaWQgVGhyb3dJQUVfSWZOdWxsKEpOSUVudiogZW52LCB2b2lkKiBwdHIpIHsKICAgICBpZiAoTlVMTCA9PSBwdHIpIHsKICAgICAgICAgZG9UaHJvd0lBRShlbnYpOwpAQCAtNDEsOCArNTEsMTQgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIHZvaWQgU2hhZGVyX2Rlc3RydWN0b3IoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrU2hhZGVyKiBzaGFkZXIpCitzdGF0aWMgdm9pZCBTaGFkZXJfZGVzdHJ1Y3RvcihKTklFbnYqIGVudiwgam9iamVjdCBvLCBTa1NoYWRlciogc2hhZGVyLCBTa2lhU2hhZGVyKiBza2lhU2hhZGVyKQogeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICBpZiAoYW5kcm9pZDo6dWlyZW5kZXJlcjo6Q2FjaGVzOjpoYXNJbnN0YW5jZSgpKSB7CisgICAgICAgIGFuZHJvaWQ6OnVpcmVuZGVyZXI6OkNhY2hlczo6Z2V0SW5zdGFuY2UoKS5ncmFkaWVudENhY2hlLnJlbW92ZShzaGFkZXIpOworICAgIH0KKyNlbmRpZgorICAgIGRlbGV0ZSBza2lhU2hhZGVyOwogICAgIHNoYWRlci0+c2FmZVVucmVmKCk7CiB9CiAKQEAgLTUxLDcgKzY3LDggQEAKICAgICByZXR1cm4gc2hhZGVyID8gc2hhZGVyLT5nZXRMb2NhbE1hdHJpeChtYXRyaXgpIDogZmFsc2U7CiB9CiAgCi1zdGF0aWMgdm9pZCBTaGFkZXJfc2V0TG9jYWxNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrU2hhZGVyKiBzaGFkZXIsIGNvbnN0IFNrTWF0cml4KiBtYXRyaXgpCitzdGF0aWMgdm9pZCBTaGFkZXJfc2V0TG9jYWxNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgU2tTaGFkZXIqIHNoYWRlciwgU2tpYVNoYWRlciogc2tpYVNoYWRlciwKKyAgICAgICAgY29uc3QgU2tNYXRyaXgqIG1hdHJpeCkKIHsKICAgICBpZiAoc2hhZGVyKSB7CiAgICAgICAgIGlmIChOVUxMID09IG1hdHJpeCkgewpAQCAtNjAsMjQgKzc3LDQwIEBACiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgc2hhZGVyLT5zZXRMb2NhbE1hdHJpeCgqbWF0cml4KTsKICAgICAgICAgfQorI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICAgICAgc2tpYVNoYWRlci0+c2V0TWF0cml4KGNvbnN0X2Nhc3Q8U2tNYXRyaXgqPihtYXRyaXgpKTsKKyNlbmRpZgogICAgIH0KIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIFNrU2hhZGVyKiBCaXRtYXBTaGFkZXJfY29uc3RydWN0b3IoSk5JRW52KiBlbnYsIGpvYmplY3QsIGNvbnN0IFNrQml0bWFwKiBiaXRtYXAsCitzdGF0aWMgU2tTaGFkZXIqIEJpdG1hcFNoYWRlcl9jb25zdHJ1Y3RvcihKTklFbnYqIGVudiwgam9iamVjdCBvLCBjb25zdCBTa0JpdG1hcCogYml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVNb2RlWCwgaW50IHRpbGVNb2RlWSkKIHsKICAgICBTa1NoYWRlciogcyA9IFNrU2hhZGVyOjpDcmVhdGVCaXRtYXBTaGFkZXIoKmJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2tTaGFkZXI6OlRpbGVNb2RlKXRpbGVNb2RlWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2tTaGFkZXI6OlRpbGVNb2RlKXRpbGVNb2RlWSk7CisKICAgICBUaHJvd0lBRV9JZk51bGwoZW52LCBzKTsKICAgICByZXR1cm4gczsKIH0KKworc3RhdGljIFNraWFTaGFkZXIqIEJpdG1hcFNoYWRlcl9wb3N0Q29uc3RydWN0b3IoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgU2tTaGFkZXIqIHNoYWRlciwKKyAgICAgICAgU2tCaXRtYXAqIGJpdG1hcCwgaW50IHRpbGVNb2RlWCwgaW50IHRpbGVNb2RlWSkgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICBTa2lhU2hhZGVyKiBza2lhU2hhZGVyID0gbmV3IFNraWFCaXRtYXBTaGFkZXIoYml0bWFwLCBzaGFkZXIsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxTa1NoYWRlcjo6VGlsZU1vZGU+KHRpbGVNb2RlWCksIHN0YXRpY19jYXN0PFNrU2hhZGVyOjpUaWxlTW9kZT4odGlsZU1vZGVZKSwKKyAgICAgICAgICAgIE5VTEwsIChzaGFkZXItPmdldEZsYWdzKCkgJiBTa1NoYWRlcjo6a09wYXF1ZUFscGhhX0ZsYWcpID09IDApOworICAgIHJldHVybiBza2lhU2hhZGVyOworI2Vsc2UKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorfQogICAgIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIFNrU2hhZGVyKiBMaW5lYXJHcmFkaWVudF9jcmVhdGUxKEpOSUVudiogZW52LCBqb2JqZWN0LAorc3RhdGljIFNrU2hhZGVyKiBMaW5lYXJHcmFkaWVudF9jcmVhdGUxKEpOSUVudiogZW52LCBqb2JqZWN0IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludEFycmF5IGNvbG9yQXJyYXksIGpmbG9hdEFycmF5IHBvc0FycmF5LCBpbnQgdGlsZU1vZGUpCiB7CkBAIC04NSwzMSArMTE4LDk1IEBACiAgICAgcHRzWzBdLnNldChTa0Zsb2F0VG9TY2FsYXIoeDApLCBTa0Zsb2F0VG9TY2FsYXIoeTApKTsKICAgICBwdHNbMV0uc2V0KFNrRmxvYXRUb1NjYWxhcih4MSksIFNrRmxvYXRUb1NjYWxhcih5MSkpOwogCi0gICAgc2l6ZV90ICAgICAgY291bnQgPSBlbnYtPkdldEFycmF5TGVuZ3RoKGNvbG9yQXJyYXkpOworICAgIHNpemVfdCBjb3VudCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoY29sb3JBcnJheSk7CiAgICAgY29uc3QgamludCogY29sb3JWYWx1ZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoY29sb3JBcnJheSwgTlVMTCk7CiAKICAgICBTa0F1dG9TVE1hbGxvYzw4LCBTa1NjYWxhcj4gc3RvcmFnZShwb3NBcnJheSA/IGNvdW50IDogMCk7CiAgICAgU2tTY2FsYXIqICAgICAgICAgICAgICAgICAgIHBvcyA9IE5VTEw7Ci0gICAgCisKICAgICBpZiAocG9zQXJyYXkpIHsKICAgICAgICAgQXV0b0phdmFGbG9hdEFycmF5IGF1dG9Qb3MoZW52LCBwb3NBcnJheSwgY291bnQpOwogICAgICAgICBjb25zdCBmbG9hdCogcG9zVmFsdWVzID0gYXV0b1Bvcy5wdHIoKTsKICAgICAgICAgcG9zID0gKFNrU2NhbGFyKilzdG9yYWdlLmdldCgpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgcG9zW2ldID0gU2tGbG9hdFRvU2NhbGFyKHBvc1ZhbHVlc1tpXSk7CisgICAgICAgIH0KICAgICB9Ci0KKyAgICAKICAgICBTa1NoYWRlciogc2hhZGVyID0gU2tHcmFkaWVudFNoYWRlcjo6Q3JlYXRlTGluZWFyKHB0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTa0NvbG9yKj4oY29sb3JWYWx1ZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MsIGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTa1NoYWRlcjo6VGlsZU1vZGU+KHRpbGVNb2RlKSk7Ci0gICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhjb2xvckFycmF5LCBjb25zdF9jYXN0PGppbnQqPihjb2xvclZhbHVlcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKTklfQUJPUlQpOworCisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhjb2xvckFycmF5LCBjb25zdF9jYXN0PGppbnQqPihjb2xvclZhbHVlcyksIEpOSV9BQk9SVCk7CiAgICAgVGhyb3dJQUVfSWZOdWxsKGVudiwgc2hhZGVyKTsKICAgICByZXR1cm4gc2hhZGVyOwogfQogCi1zdGF0aWMgU2tTaGFkZXIqIExpbmVhckdyYWRpZW50X2NyZWF0ZTIoSk5JRW52KiBlbnYsIGpvYmplY3QsCitzdGF0aWMgU2tpYVNoYWRlciogTGluZWFyR3JhZGllbnRfcG9zdENyZWF0ZTEoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgU2tTaGFkZXIqIHNoYWRlciwKKyAgICAgICAgZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsIGppbnRBcnJheSBjb2xvckFycmF5LAorICAgICAgICBqZmxvYXRBcnJheSBwb3NBcnJheSwgaW50IHRpbGVNb2RlKSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIHNpemVfdCBjb3VudCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoY29sb3JBcnJheSk7CisgICAgY29uc3QgamludCogY29sb3JWYWx1ZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoY29sb3JBcnJheSwgTlVMTCk7CisKKyAgICBqZmxvYXQqIHN0b3JlZEJvdW5kcyA9IG5ldyBqZmxvYXRbNF07CisgICAgc3RvcmVkQm91bmRzWzBdID0geDA7IHN0b3JlZEJvdW5kc1sxXSA9IHkwOworICAgIHN0b3JlZEJvdW5kc1syXSA9IHgxOyBzdG9yZWRCb3VuZHNbM10gPSB5MTsKKyAgICBqZmxvYXQqIHN0b3JlZFBvc2l0aW9ucyA9IG5ldyBqZmxvYXRbY291bnRdOworICAgIHVpbnQzMl90KiBzdG9yZWRDb2xvcnMgPSBuZXcgdWludDMyX3RbY291bnRdOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBzdG9yZWRDb2xvcnNbaV0gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29sb3JWYWx1ZXNbaV0pOworICAgIH0KKworICAgIGlmIChwb3NBcnJheSkgeworICAgICAgICBBdXRvSmF2YUZsb2F0QXJyYXkgYXV0b1BvcyhlbnYsIHBvc0FycmF5LCBjb3VudCk7CisgICAgICAgIGNvbnN0IGZsb2F0KiBwb3NWYWx1ZXMgPSBhdXRvUG9zLnB0cigpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHN0b3JlZFBvc2l0aW9uc1tpXSA9IHBvc1ZhbHVlc1tpXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0b3JlZFBvc2l0aW9uc1swXSA9IDAuMGY7CisgICAgICAgIHN0b3JlZFBvc2l0aW9uc1sxXSA9IDEuMGY7CisgICAgfQorCisgICAgU2tpYVNoYWRlciogc2tpYVNoYWRlciA9IG5ldyBTa2lhTGluZWFyR3JhZGllbnRTaGFkZXIoc3RvcmVkQm91bmRzLCBzdG9yZWRDb2xvcnMsCisgICAgICAgICAgICBzdG9yZWRQb3NpdGlvbnMsIGNvdW50LCBzaGFkZXIsIHN0YXRpY19jYXN0PFNrU2hhZGVyOjpUaWxlTW9kZT4odGlsZU1vZGUpLCBOVUxMLAorICAgICAgICAgICAgKHNoYWRlci0+Z2V0RmxhZ3MoKSAmIFNrU2hhZGVyOjprT3BhcXVlQWxwaGFfRmxhZykgPT0gMCk7CisKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGNvbG9yQXJyYXksIGNvbnN0X2Nhc3Q8amludCo+KGNvbG9yVmFsdWVzKSwgSk5JX0FCT1JUKTsKKyAgICByZXR1cm4gc2tpYVNoYWRlcjsKKyNlbHNlCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKK30KKworc3RhdGljIFNraWFTaGFkZXIqIExpbmVhckdyYWRpZW50X3Bvc3RDcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0IG8sIFNrU2hhZGVyKiBzaGFkZXIsCisgICAgICAgIGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLCBpbnQgY29sb3IwLCBpbnQgY29sb3IxLCBpbnQgdGlsZU1vZGUpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgZmxvYXQqIHN0b3JlZEJvdW5kcyA9IG5ldyBmbG9hdFs0XTsKKyAgICBzdG9yZWRCb3VuZHNbMF0gPSB4MDsgc3RvcmVkQm91bmRzWzFdID0geTA7CisgICAgc3RvcmVkQm91bmRzWzJdID0geDE7IHN0b3JlZEJvdW5kc1szXSA9IHkxOworCisgICAgZmxvYXQqIHN0b3JlZFBvc2l0aW9ucyA9IG5ldyBmbG9hdFsyXTsKKyAgICBzdG9yZWRQb3NpdGlvbnNbMF0gPSAwLjBmOworICAgIHN0b3JlZFBvc2l0aW9uc1sxXSA9IDEuMGY7CisKKyAgICB1aW50MzJfdCogc3RvcmVkQ29sb3JzID0gbmV3IHVpbnQzMl90WzJdOworICAgIHN0b3JlZENvbG9yc1swXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb2xvcjApOworICAgIHN0b3JlZENvbG9yc1sxXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb2xvcjEpOworCisgICAgU2tpYVNoYWRlciogc2tpYVNoYWRlciA9IG5ldyBTa2lhTGluZWFyR3JhZGllbnRTaGFkZXIoc3RvcmVkQm91bmRzLCBzdG9yZWRDb2xvcnMsCisgICAgICAgICAgICBzdG9yZWRQb3NpdGlvbnMsIDIsIHNoYWRlciwgc3RhdGljX2Nhc3Q8U2tTaGFkZXI6OlRpbGVNb2RlPih0aWxlTW9kZSksIE5VTEwsCisgICAgICAgICAgICAoc2hhZGVyLT5nZXRGbGFncygpICYgU2tTaGFkZXI6OmtPcGFxdWVBbHBoYV9GbGFnKSA9PSAwKTsKKworICAgIHJldHVybiBza2lhU2hhZGVyOworI2Vsc2UKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCitzdGF0aWMgU2tTaGFkZXIqIExpbmVhckdyYWRpZW50X2NyZWF0ZTIoSk5JRW52KiBlbnYsIGpvYmplY3QgbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IwLCBpbnQgY29sb3IxLCBpbnQgdGlsZU1vZGUpCiB7CkBAIC0xMjAsMTggKzIxNywxNyBAQAogICAgIFNrQ29sb3IgY29sb3JzWzJdOwogICAgIGNvbG9yc1swXSA9IGNvbG9yMDsKICAgICBjb2xvcnNbMV0gPSBjb2xvcjE7Ci0KKyAgICAKICAgICBTa1NoYWRlciogcyA9IFNrR3JhZGllbnRTaGFkZXI6OkNyZWF0ZUxpbmVhcihwdHMsIGNvbG9ycywgTlVMTCwgMiwgKFNrU2hhZGVyOjpUaWxlTW9kZSl0aWxlTW9kZSk7CisKICAgICBUaHJvd0lBRV9JZk51bGwoZW52LCBzKTsKICAgICByZXR1cm4gczsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIFNrU2hhZGVyKiBSYWRpYWxHcmFkaWVudF9jcmVhdGUxKEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHJhZGl1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50QXJyYXkgY29sb3JBcnJheSwgamZsb2F0QXJyYXkgcG9zQXJyYXksIGludCB0aWxlTW9kZSkKLXsKK3N0YXRpYyBTa1NoYWRlciogUmFkaWFsR3JhZGllbnRfY3JlYXRlMShKTklFbnYqIGVudiwgam9iamVjdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcmFkaXVzLAorICAgICAgICBqaW50QXJyYXkgY29sb3JBcnJheSwgamZsb2F0QXJyYXkgcG9zQXJyYXksIGludCB0aWxlTW9kZSkgewogICAgIFNrUG9pbnQgY2VudGVyOwogICAgIGNlbnRlci5zZXQoU2tGbG9hdFRvU2NhbGFyKHgpLCBTa0Zsb2F0VG9TY2FsYXIoeSkpOwogCkBAIC0xNjEsMTAgKzI1Nyw4IEBACiAgICAgcmV0dXJuIHNoYWRlcjsKIH0KIAotc3RhdGljIFNrU2hhZGVyKiBSYWRpYWxHcmFkaWVudF9jcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHJhZGl1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IwLCBpbnQgY29sb3IxLCBpbnQgdGlsZU1vZGUpCi17CitzdGF0aWMgU2tTaGFkZXIqIFJhZGlhbEdyYWRpZW50X2NyZWF0ZTIoSk5JRW52KiBlbnYsIGpvYmplY3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHJhZGl1cywKKyAgICAgICAgaW50IGNvbG9yMCwgaW50IGNvbG9yMSwgaW50IHRpbGVNb2RlKSB7CiAgICAgU2tQb2ludCBjZW50ZXI7CiAgICAgY2VudGVyLnNldChTa0Zsb2F0VG9TY2FsYXIoeCksIFNrRmxvYXRUb1NjYWxhcih5KSk7CiAKQEAgLTE3OCwxMSArMjcyLDY1IEBACiAgICAgcmV0dXJuIHM7CiB9CiAKK3N0YXRpYyBTa2lhU2hhZGVyKiBSYWRpYWxHcmFkaWVudF9wb3N0Q3JlYXRlMShKTklFbnYqIGVudiwgam9iamVjdCBvLCBTa1NoYWRlciogc2hhZGVyLAorICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCByYWRpdXMsIGppbnRBcnJheSBjb2xvckFycmF5LCBqZmxvYXRBcnJheSBwb3NBcnJheSwgaW50IHRpbGVNb2RlKSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIHNpemVfdCBjb3VudCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoY29sb3JBcnJheSk7CisgICAgY29uc3QgamludCogY29sb3JWYWx1ZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoY29sb3JBcnJheSwgTlVMTCk7CisKKyAgICBqZmxvYXQqIHN0b3JlZFBvc2l0aW9ucyA9IG5ldyBqZmxvYXRbY291bnRdOworICAgIHVpbnQzMl90KiBzdG9yZWRDb2xvcnMgPSBuZXcgdWludDMyX3RbY291bnRdOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBzdG9yZWRDb2xvcnNbaV0gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29sb3JWYWx1ZXNbaV0pOworICAgIH0KKworICAgIGlmIChwb3NBcnJheSkgeworICAgICAgICBBdXRvSmF2YUZsb2F0QXJyYXkgYXV0b1BvcyhlbnYsIHBvc0FycmF5LCBjb3VudCk7CisgICAgICAgIGNvbnN0IGZsb2F0KiBwb3NWYWx1ZXMgPSBhdXRvUG9zLnB0cigpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHN0b3JlZFBvc2l0aW9uc1tpXSA9IHBvc1ZhbHVlc1tpXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0b3JlZFBvc2l0aW9uc1swXSA9IDAuMGY7CisgICAgICAgIHN0b3JlZFBvc2l0aW9uc1sxXSA9IDEuMGY7CisgICAgfQorCisgICAgU2tpYVNoYWRlciogc2tpYVNoYWRlciA9IG5ldyBTa2lhQ2lyY3VsYXJHcmFkaWVudFNoYWRlcih4LCB5LCByYWRpdXMsIHN0b3JlZENvbG9ycywKKyAgICAgICAgICAgIHN0b3JlZFBvc2l0aW9ucywgY291bnQsIHNoYWRlciwgKFNrU2hhZGVyOjpUaWxlTW9kZSkgdGlsZU1vZGUsIE5VTEwsCisgICAgICAgICAgICAoc2hhZGVyLT5nZXRGbGFncygpICYgU2tTaGFkZXI6OmtPcGFxdWVBbHBoYV9GbGFnKSA9PSAwKTsKKworICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoY29sb3JBcnJheSwgY29uc3RfY2FzdDxqaW50Kj4oY29sb3JWYWx1ZXMpLCBKTklfQUJPUlQpOworICAgIHJldHVybiBza2lhU2hhZGVyOworI2Vsc2UKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCitzdGF0aWMgU2tpYVNoYWRlciogUmFkaWFsR3JhZGllbnRfcG9zdENyZWF0ZTIoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgU2tTaGFkZXIqIHNoYWRlciwKKyAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcmFkaXVzLCBpbnQgY29sb3IwLCBpbnQgY29sb3IxLCBpbnQgdGlsZU1vZGUpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgZmxvYXQqIHN0b3JlZFBvc2l0aW9ucyA9IG5ldyBmbG9hdFsyXTsKKyAgICBzdG9yZWRQb3NpdGlvbnNbMF0gPSAwLjBmOworICAgIHN0b3JlZFBvc2l0aW9uc1sxXSA9IDEuMGY7CisKKyAgICB1aW50MzJfdCogc3RvcmVkQ29sb3JzID0gbmV3IHVpbnQzMl90WzJdOworICAgIHN0b3JlZENvbG9yc1swXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb2xvcjApOworICAgIHN0b3JlZENvbG9yc1sxXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb2xvcjEpOworCisgICAgU2tpYVNoYWRlciogc2tpYVNoYWRlciA9IG5ldyBTa2lhQ2lyY3VsYXJHcmFkaWVudFNoYWRlcih4LCB5LCByYWRpdXMsIHN0b3JlZENvbG9ycywKKyAgICAgICAgICAgIHN0b3JlZFBvc2l0aW9ucywgMiwgc2hhZGVyLCAoU2tTaGFkZXI6OlRpbGVNb2RlKSB0aWxlTW9kZSwgTlVMTCwKKyAgICAgICAgICAgIChzaGFkZXItPmdldEZsYWdzKCkgJiBTa1NoYWRlcjo6a09wYXF1ZUFscGhhX0ZsYWcpID09IDApOworCisgICAgcmV0dXJuIHNraWFTaGFkZXI7CisjZWxzZQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCit9CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogc3RhdGljIFNrU2hhZGVyKiBTd2VlcEdyYWRpZW50X2NyZWF0ZTEoSk5JRW52KiBlbnYsIGpvYmplY3QsIGZsb2F0IHgsIGZsb2F0IHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50QXJyYXkgamNvbG9ycywgamZsb2F0QXJyYXkganBvc2l0aW9ucykKLXsKKyAgICAgICAgamludEFycmF5IGpjb2xvcnMsIGpmbG9hdEFycmF5IGpwb3NpdGlvbnMpIHsKICAgICBzaXplX3QgICAgICBjb3VudCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoamNvbG9ycyk7CiAgICAgY29uc3QgamludCogY29sb3JzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGpjb2xvcnMsIE5VTEwpOwogICAgIApAQCAtMjA5LDggKzM1Nyw3IEBACiB9CiAKIHN0YXRpYyBTa1NoYWRlciogU3dlZXBHcmFkaWVudF9jcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0LCBmbG9hdCB4LCBmbG9hdCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvcjAsIGludCBjb2xvcjEpCi17CisgICAgICAgIGludCBjb2xvcjAsIGludCBjb2xvcjEpIHsKICAgICBTa0NvbG9yIGNvbG9yc1syXTsKICAgICBjb2xvcnNbMF0gPSBjb2xvcjA7CiAgICAgY29sb3JzWzFdID0gY29sb3IxOwpAQCAtMjIwLDIwICszNjcsOTcgQEAKICAgICByZXR1cm4gczsKIH0KIAorc3RhdGljIFNraWFTaGFkZXIqIFN3ZWVwR3JhZGllbnRfcG9zdENyZWF0ZTEoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgU2tTaGFkZXIqIHNoYWRlciwKKyAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgamludEFycmF5IGNvbG9yQXJyYXksIGpmbG9hdEFycmF5IHBvc0FycmF5KSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIHNpemVfdCBjb3VudCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoY29sb3JBcnJheSk7CisgICAgY29uc3QgamludCogY29sb3JWYWx1ZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoY29sb3JBcnJheSwgTlVMTCk7CisKKyAgICBqZmxvYXQqIHN0b3JlZFBvc2l0aW9ucyA9IG5ldyBqZmxvYXRbY291bnRdOworICAgIHVpbnQzMl90KiBzdG9yZWRDb2xvcnMgPSBuZXcgdWludDMyX3RbY291bnRdOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBzdG9yZWRDb2xvcnNbaV0gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29sb3JWYWx1ZXNbaV0pOworICAgIH0KKworICAgIGlmIChwb3NBcnJheSkgeworICAgICAgICBBdXRvSmF2YUZsb2F0QXJyYXkgYXV0b1BvcyhlbnYsIHBvc0FycmF5LCBjb3VudCk7CisgICAgICAgIGNvbnN0IGZsb2F0KiBwb3NWYWx1ZXMgPSBhdXRvUG9zLnB0cigpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHN0b3JlZFBvc2l0aW9uc1tpXSA9IHBvc1ZhbHVlc1tpXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0b3JlZFBvc2l0aW9uc1swXSA9IDAuMGY7CisgICAgICAgIHN0b3JlZFBvc2l0aW9uc1sxXSA9IDEuMGY7CisgICAgfQorCisgICAgU2tpYVNoYWRlciogc2tpYVNoYWRlciA9IG5ldyBTa2lhU3dlZXBHcmFkaWVudFNoYWRlcih4LCB5LCBzdG9yZWRDb2xvcnMsIHN0b3JlZFBvc2l0aW9ucywgY291bnQsCisgICAgICAgICAgICBzaGFkZXIsIE5VTEwsIChzaGFkZXItPmdldEZsYWdzKCkgJiBTa1NoYWRlcjo6a09wYXF1ZUFscGhhX0ZsYWcpID09IDApOworCisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhjb2xvckFycmF5LCBjb25zdF9jYXN0PGppbnQqPihjb2xvclZhbHVlcyksIEpOSV9BQk9SVCk7CisgICAgcmV0dXJuIHNraWFTaGFkZXI7CisjZWxzZQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCit9CisKK3N0YXRpYyBTa2lhU2hhZGVyKiBTd2VlcEdyYWRpZW50X3Bvc3RDcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0IG8sIFNrU2hhZGVyKiBzaGFkZXIsCisgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBjb2xvcjAsIGludCBjb2xvcjEpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgZmxvYXQqIHN0b3JlZFBvc2l0aW9ucyA9IG5ldyBmbG9hdFsyXTsKKyAgICBzdG9yZWRQb3NpdGlvbnNbMF0gPSAwLjBmOworICAgIHN0b3JlZFBvc2l0aW9uc1sxXSA9IDEuMGY7CisKKyAgICB1aW50MzJfdCogc3RvcmVkQ29sb3JzID0gbmV3IHVpbnQzMl90WzJdOworICAgIHN0b3JlZENvbG9yc1swXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb2xvcjApOworICAgIHN0b3JlZENvbG9yc1sxXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb2xvcjEpOworCisgICAgU2tpYVNoYWRlciogc2tpYVNoYWRlciA9IG5ldyBTa2lhU3dlZXBHcmFkaWVudFNoYWRlcih4LCB5LCBzdG9yZWRDb2xvcnMsIHN0b3JlZFBvc2l0aW9ucywgMiwKKyAgICAgICAgICAgIHNoYWRlciwgTlVMTCwgKHNoYWRlci0+Z2V0RmxhZ3MoKSAmIFNrU2hhZGVyOjprT3BhcXVlQWxwaGFfRmxhZykgPT0gMCk7CisKKyAgICByZXR1cm4gc2tpYVNoYWRlcjsKKyNlbHNlCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIFNrU2hhZGVyKiBDb21wb3NlU2hhZGVyX2NyZWF0ZTEoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1NoYWRlciogc2hhZGVyQSwgU2tTaGFkZXIqIHNoYWRlckIsIFNrWGZlcm1vZGUqIG1vZGUpCitzdGF0aWMgU2tTaGFkZXIqIENvbXBvc2VTaGFkZXJfY3JlYXRlMShKTklFbnYqIGVudiwgam9iamVjdCBvLAorICAgICAgICBTa1NoYWRlciogc2hhZGVyQSwgU2tTaGFkZXIqIHNoYWRlckIsIFNrWGZlcm1vZGUqIG1vZGUpCiB7CiAgICAgcmV0dXJuIG5ldyBTa0NvbXBvc2VTaGFkZXIoc2hhZGVyQSwgc2hhZGVyQiwgbW9kZSk7CiB9CiAKLXN0YXRpYyBTa1NoYWRlciogQ29tcG9zZVNoYWRlcl9jcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tTaGFkZXIqIHNoYWRlckEsIFNrU2hhZGVyKiBzaGFkZXJCLCBTa1BvcnRlckR1ZmY6Ok1vZGUgbW9kZSkKK3N0YXRpYyBTa1NoYWRlciogQ29tcG9zZVNoYWRlcl9jcmVhdGUyKEpOSUVudiogZW52LCBqb2JqZWN0IG8sCisgICAgICAgIFNrU2hhZGVyKiBzaGFkZXJBLCBTa1NoYWRlciogc2hhZGVyQiwgU2tQb3J0ZXJEdWZmOjpNb2RlIHBvcnRlckR1ZmZNb2RlKQogewotICAgIFNrQXV0b1VucmVmIGF1KFNrUG9ydGVyRHVmZjo6Q3JlYXRlWGZlcm1vZGUobW9kZSkpOworICAgIFNrQXV0b1VucmVmIGF1KFNrUG9ydGVyRHVmZjo6Q3JlYXRlWGZlcm1vZGUocG9ydGVyRHVmZk1vZGUpKTsKKyAgICBTa1hmZXJtb2RlKiBtb2RlID0gKFNrWGZlcm1vZGUqKSBhdS5nZXQoKTsKKyAgICByZXR1cm4gbmV3IFNrQ29tcG9zZVNoYWRlcihzaGFkZXJBLCBzaGFkZXJCLCBtb2RlKTsKK30KIAotICAgIHJldHVybiBuZXcgU2tDb21wb3NlU2hhZGVyKHNoYWRlckEsIHNoYWRlckIsIChTa1hmZXJtb2RlKilhdS5nZXQoKSk7CitzdGF0aWMgU2tpYVNoYWRlciogQ29tcG9zZVNoYWRlcl9wb3N0Q3JlYXRlMihKTklFbnYqIGVudiwgam9iamVjdCBvLCBTa1NoYWRlciogc2hhZGVyLAorICAgICAgICBTa2lhU2hhZGVyKiBzaGFkZXJBLCBTa2lhU2hhZGVyKiBzaGFkZXJCLCBTa1BvcnRlckR1ZmY6Ok1vZGUgcG9ydGVyRHVmZk1vZGUpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlID0gU2tQb3J0ZXJEdWZmOjpUb1hmZXJtb2RlTW9kZShwb3J0ZXJEdWZmTW9kZSk7CisgICAgcmV0dXJuIG5ldyBTa2lhQ29tcG9zZVNoYWRlcihzaGFkZXJBLCBzaGFkZXJCLCBtb2RlLCBzaGFkZXIpOworI2Vsc2UKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCitzdGF0aWMgU2tpYVNoYWRlciogQ29tcG9zZVNoYWRlcl9wb3N0Q3JlYXRlMShKTklFbnYqIGVudiwgam9iamVjdCBvLCBTa1NoYWRlciogc2hhZGVyLAorICAgICAgICBTa2lhU2hhZGVyKiBzaGFkZXJBLCBTa2lhU2hhZGVyKiBzaGFkZXJCLCBTa1hmZXJtb2RlKiBtb2RlKSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIFNrWGZlcm1vZGU6Ok1vZGUgc2tpYU1vZGU7CisgICAgaWYgKCFTa1hmZXJtb2RlOjpJc01vZGUobW9kZSwgJnNraWFNb2RlKSkgeworICAgICAgICAvLyBUT0RPOiBTdXBwb3J0IG90aGVyIG1vZGVzCisgICAgICAgIHNraWFNb2RlID0gU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBTa2lhQ29tcG9zZVNoYWRlcihzaGFkZXJBLCBzaGFkZXJCLCBza2lhTW9kZSwgc2hhZGVyKTsKKyNlbHNlCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTI0NCwzMyArNDY4LDQyIEBACiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdTaGFkZXJNZXRob2RzW10gPSB7Ci0gICAgeyAibmF0aXZlRGVzdHJ1Y3RvciIsICAgICAgICAiKEkpViIsICAgICAodm9pZCopU2hhZGVyX2Rlc3RydWN0b3IgICAgICAgIH0sCisgICAgeyAibmF0aXZlRGVzdHJ1Y3RvciIsICAgICAgICAiKElJKVYiLCAgICAodm9pZCopU2hhZGVyX2Rlc3RydWN0b3IgICAgICAgIH0sCiAgICAgeyAibmF0aXZlR2V0TG9jYWxNYXRyaXgiLCAgICAiKElJKVoiLCAgICAodm9pZCopU2hhZGVyX2dldExvY2FsTWF0cml4ICAgIH0sCi0gICAgeyAibmF0aXZlU2V0TG9jYWxNYXRyaXgiLCAgICAiKElJKVYiLCAgICAodm9pZCopU2hhZGVyX3NldExvY2FsTWF0cml4ICAgIH0KKyAgICB7ICJuYXRpdmVTZXRMb2NhbE1hdHJpeCIsICAgICIoSUlJKVYiLCAgICh2b2lkKilTaGFkZXJfc2V0TG9jYWxNYXRyaXggICAgfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnQml0bWFwU2hhZGVyTWV0aG9kc1tdID0gewotICAgIHsgIm5hdGl2ZUNyZWF0ZSIsICAgIihJSUkpSSIsICAodm9pZCopQml0bWFwU2hhZGVyX2NvbnN0cnVjdG9yIH0KKyAgICB7ICJuYXRpdmVDcmVhdGUiLCAgICAgIihJSUkpSSIsICAodm9pZCopQml0bWFwU2hhZGVyX2NvbnN0cnVjdG9yIH0sCisgICAgeyAibmF0aXZlUG9zdENyZWF0ZSIsICIoSUlJSSlJIiwgKHZvaWQqKUJpdG1hcFNoYWRlcl9wb3N0Q29uc3RydWN0b3IgfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTGluZWFyR3JhZGllbnRNZXRob2RzW10gPSB7Ci0gICAgeyAibmF0aXZlQ3JlYXRlMSIsICAiKEZGRkZbSVtGSSlJIiwgKHZvaWQqKUxpbmVhckdyYWRpZW50X2NyZWF0ZTEgICB9LAotICAgIHsgIm5hdGl2ZUNyZWF0ZTIiLCAgIihGRkZGSUlJKUkiLCAgICh2b2lkKilMaW5lYXJHcmFkaWVudF9jcmVhdGUyICAgfQorICAgIHsgIm5hdGl2ZUNyZWF0ZTEiLCAgICAgIihGRkZGW0lbRkkpSSIsICAodm9pZCopTGluZWFyR3JhZGllbnRfY3JlYXRlMSAgICAgfSwKKyAgICB7ICJuYXRpdmVDcmVhdGUyIiwgICAgICIoRkZGRklJSSlJIiwgICAgKHZvaWQqKUxpbmVhckdyYWRpZW50X2NyZWF0ZTIgICAgIH0sCisgICAgeyAibmF0aXZlUG9zdENyZWF0ZTEiLCAiKElGRkZGW0lbRkkpSSIsICh2b2lkKilMaW5lYXJHcmFkaWVudF9wb3N0Q3JlYXRlMSB9LAorICAgIHsgIm5hdGl2ZVBvc3RDcmVhdGUyIiwgIihJRkZGRklJSSlJIiwgICAodm9pZCopTGluZWFyR3JhZGllbnRfcG9zdENyZWF0ZTIgfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnUmFkaWFsR3JhZGllbnRNZXRob2RzW10gPSB7Ci0gICAgeyJuYXRpdmVDcmVhdGUxIiwgICAiKEZGRltJW0ZJKUkiLCAgKHZvaWQqKVJhZGlhbEdyYWRpZW50X2NyZWF0ZTEgICB9LAotICAgIHsibmF0aXZlQ3JlYXRlMiIsICAgIihGRkZJSUkpSSIsICAgICh2b2lkKilSYWRpYWxHcmFkaWVudF9jcmVhdGUyICAgfQorICAgIHsgIm5hdGl2ZUNyZWF0ZTEiLCAgICAgIihGRkZbSVtGSSlJIiwgICh2b2lkKilSYWRpYWxHcmFkaWVudF9jcmVhdGUxICAgICB9LAorICAgIHsgIm5hdGl2ZUNyZWF0ZTIiLCAgICAgIihGRkZJSUkpSSIsICAgICh2b2lkKilSYWRpYWxHcmFkaWVudF9jcmVhdGUyICAgICB9LAorICAgIHsgIm5hdGl2ZVBvc3RDcmVhdGUxIiwgIihJRkZGW0lbRkkpSSIsICh2b2lkKilSYWRpYWxHcmFkaWVudF9wb3N0Q3JlYXRlMSB9LAorICAgIHsgIm5hdGl2ZVBvc3RDcmVhdGUyIiwgIihJRkZGSUlJKUkiLCAgICh2b2lkKilSYWRpYWxHcmFkaWVudF9wb3N0Q3JlYXRlMiB9CiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdTd2VlcEdyYWRpZW50TWV0aG9kc1tdID0gewotICAgIHsibmF0aXZlQ3JlYXRlMSIsICAgIihGRltJW0YpSSIsICAodm9pZCopU3dlZXBHcmFkaWVudF9jcmVhdGUxICAgfSwKLSAgICB7Im5hdGl2ZUNyZWF0ZTIiLCAgICIoRkZJSSlJIiwgICAgKHZvaWQqKVN3ZWVwR3JhZGllbnRfY3JlYXRlMiAgIH0KKyAgICB7ICJuYXRpdmVDcmVhdGUxIiwgICAgICIoRkZbSVtGKUkiLCAgKHZvaWQqKVN3ZWVwR3JhZGllbnRfY3JlYXRlMSAgICAgfSwKKyAgICB7ICJuYXRpdmVDcmVhdGUyIiwgICAgICIoRkZJSSlJIiwgICAgKHZvaWQqKVN3ZWVwR3JhZGllbnRfY3JlYXRlMiAgICAgfSwKKyAgICB7ICJuYXRpdmVQb3N0Q3JlYXRlMSIsICIoSUZGW0lbRilJIiwgKHZvaWQqKVN3ZWVwR3JhZGllbnRfcG9zdENyZWF0ZTEgfSwKKyAgICB7ICJuYXRpdmVQb3N0Q3JlYXRlMiIsICIoSUZGSUkpSSIsICAgKHZvaWQqKVN3ZWVwR3JhZGllbnRfcG9zdENyZWF0ZTIgfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnQ29tcG9zZVNoYWRlck1ldGhvZHNbXSA9IHsKLSAgICB7Im5hdGl2ZUNyZWF0ZTEiLCAgIihJSUkpSSIsICAgICh2b2lkKilDb21wb3NlU2hhZGVyX2NyZWF0ZTEgfSwKLSAgICB7Im5hdGl2ZUNyZWF0ZTIiLCAgIihJSUkpSSIsICAgICh2b2lkKilDb21wb3NlU2hhZGVyX2NyZWF0ZTIgfQorICAgIHsgIm5hdGl2ZUNyZWF0ZTEiLCAgICAgICIoSUlJKUkiLCAgICh2b2lkKilDb21wb3NlU2hhZGVyX2NyZWF0ZTEgICAgIH0sCisgICAgeyAibmF0aXZlQ3JlYXRlMiIsICAgICAgIihJSUkpSSIsICAgKHZvaWQqKUNvbXBvc2VTaGFkZXJfY3JlYXRlMiAgICAgfSwKKyAgICB7ICJuYXRpdmVQb3N0Q3JlYXRlMSIsICAiKElJSUkpSSIsICAodm9pZCopQ29tcG9zZVNoYWRlcl9wb3N0Q3JlYXRlMSB9LAorICAgIHsgIm5hdGl2ZVBvc3RDcmVhdGUyIiwgICIoSUlJSSlJIiwgICh2b2lkKilDb21wb3NlU2hhZGVyX3Bvc3RDcmVhdGUyIH0KIH07CiAKICNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVGV4dExheW91dC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0N2UxZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuY3BwCkBAIC0wLDAgKzEsMzQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlRleHRMYXlvdXQuaCIKKworI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorCisjaW5jbHVkZSAiU2tUZW1wbGF0ZXMuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3ViaWRpLmgiCisjaW5jbHVkZSAidW5pY29kZS91c2hhcGUuaCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyBSZXR1cm5zIHRydWUgaWYgd2UgbWlnaHQgbmVlZCBsYXlvdXQuICBJZiBiaWRpRmxhZ3MgZm9yY2UgTFRSLCBhc3N1bWUgbm8gbGF5b3V0LCBpZgorLy8gYmlkaUZsYWdzIGluZGljYXRlIHRoZXJlIHByb2JhYmx5IGlzIFJUTCwgYXNzdW1lIHdlIGRvLCBvdGhlcndpc2Ugc2NhbiB0aGUgdGV4dAorLy8gbG9va2luZyBmb3IgYSBjaGFyYWN0ZXIgPj0gdGhlIGZpcnN0IFJUTCBjaGFyYWN0ZXIgaW4gdW5pY29kZSBhbmQgYXNzdW1lIHdlIGRvIGlmCisvLyB3ZSBmaW5kIG9uZS4KK2Jvb2wgVGV4dExheW91dDo6bmVlZHNMYXlvdXQoY29uc3QgamNoYXIqIHRleHQsIGppbnQgbGVuLCBqaW50IGJpZGlGbGFncykgeworICAgIGlmIChiaWRpRmxhZ3MgPT0ga0JpZGlfRm9yY2VfTFRSKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKChiaWRpRmxhZ3MgPT0ga0JpZGlfUlRMKSB8fCAoYmlkaUZsYWdzID09IGtCaWRpX0RlZmF1bHRfUlRMKSB8fAorICAgICAgICAgICAgYmlkaUZsYWdzID09IGtCaWRpX0ZvcmNlX1JUTCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICBpZiAodGV4dFtpXSA+PSAweDA1OTApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBDaGFyYWN0ZXItYmFzZWQgQXJhYmljIHNoYXBpbmcuCisgKgorICogV2UnbGwgdXNlIGhhcmZidXp6IGFuZCBnbHlwaC1iYXNlZCBzaGFwaW5nIGluc3RlYWQgb25jZSB3ZSdyZSBzZXQgdXAgZm9yIGl0LgorICoKKyAqIEBjb250ZXh0IHRoZSB0ZXh0IGNvbnRleHQKKyAqIEBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgdG8gcmVuZGVyCisgKiBAY291bnQgdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCB0byByZW5kZXIsIHN0YXJ0ICsgY291bnQgIG11c3QgYmUgPD0gY29udGV4dENvdW50CisgKiBAY29udGV4dENvdW50IHRoZSBsZW5ndGggb2YgdGhlIGNvbnRleHQKKyAqIEBzaGFwZWQgd2hlcmUgdG8gcHV0IHRoZSBzaGFwZWQgdGV4dCwgbXVzdCBoYXZlIGNhcGFjaXR5IGZvciBjb3VudCB1Y2hhcnMKKyAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgc2hhcGVkIHRleHQsIG9yIC0xIGlmIGVycm9yCisgKi8KK2ludCBUZXh0TGF5b3V0OjpzaGFwZVJ0bFRleHQoY29uc3QgamNoYXIqIGNvbnRleHQsIGpzaXplIHN0YXJ0LCBqc2l6ZSBjb3VudCwganNpemUgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgamNoYXIqIHNoYXBlZCwgVUVycm9yQ29kZSAmc3RhdHVzKSB7CisgICAgamNoYXIgYnVmZmVyW2NvbnRleHRDb3VudF07CisKKyAgICAvLyBVc2UgZml4ZWQgbGVuZ3RoIHNpbmNlIHdlIG5lZWQgdG8ga2VlcCBzdGFydCBhbmQgY291bnQgdmFsaWQKKyAgICB1X3NoYXBlQXJhYmljKGNvbnRleHQsIGNvbnRleHRDb3VudCwgYnVmZmVyLCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9MRU5HVEhfRklYRURfU1BBQ0VTX05FQVIgfAorICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfVEVYVF9ESVJFQ1RJT05fTE9HSUNBTCB8IFVfU0hBUEVfTEVUVEVSU19TSEFQRSB8CisgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9YX0xBTUFMRUZfU1VCX0FMVEVSTkFURSwgJnN0YXR1cyk7CisKKyAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgLy8gdHJpbSBvdXQgMHhmZmZmIGZvbGxvd2luZyBsaWdhdHVyZXMsIGlmIGFueQorICAgICAgICBpbnQgZW5kID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBlID0gc3RhcnQgKyBjb3VudDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlcltpXSAhPSAweGZmZmYpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbZW5kKytdID0gYnVmZmVyW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvdW50ID0gZW5kOworICAgICAgICAvLyBMT0coTE9HX0lORk8sICJDU1JUTCIsICJzdGFydCAlZCBjb3VudCAlZCBjY291bnQgJWRcbiIsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50KTsKKyAgICAgICAgdWJpZGlfd3JpdGVSZXZlcnNlKGJ1ZmZlciwgY291bnQsIHNoYXBlZCwgY291bnQsIFVCSURJX0RPX01JUlJPUklORyB8IFVCSURJX09VVFBVVF9SRVZFUlNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVCSURJX0tFRVBfQkFTRV9DT01CSU5JTkcsICZzdGF0dXMpOworICAgICAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgIHJldHVybiBjb3VudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworLyoqCisgKiBCYXNpYyBjaGFyYWN0ZXItYmFzZWQgbGF5b3V0IHN1cHBvcnRpbmcgcnRsIGFuZCBhcmFiaWMgc2hhcGluZy4KKyAqIFJ1bnMgYmlkaSBvbiB0aGUgdGV4dCBhbmQgZ2VuZXJhdGVzIGEgcmVvcmRlcmVkLCBzaGFwZWQgbGluZSBpbiBidWZmZXIsIHJldHVybmluZworICogdGhlIGxlbmd0aC4KKyAqIEB0ZXh0IHRoZSB0ZXh0CisgKiBAbGVuIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgaW4gdWNoYXJzCisgKiBAZGlyIHJlY2VpdmVzIHRoZSByZXNvbHZlZCBwYXJhZ3JhcGggZGlyZWN0aW9uCisgKiBAYnVmZmVyIHRoZSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgcmVvcmRlcmVkLCBzaGFwZWQgbGluZS4gIE11c3QgaGF2ZSBjYXBhY2l0eSBvZgorICogYXQgbGVhc3QgbGVuIGpjaGFycy4KKyAqIEBmbGFncyBsaW5lIGJpZGkgZmxhZ3MKKyAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgcmVvcmRlcmVkLCBzaGFwZWQgbGluZSwgb3IgLTEgaWYgZXJyb3IKKyAqLworamludCBUZXh0TGF5b3V0OjpsYXlvdXRMaW5lKGNvbnN0IGpjaGFyKiB0ZXh0LCBqaW50IGxlbiwgamludCBmbGFncywgaW50ICZkaXIsIGpjaGFyKiBidWZmZXIsCisgICAgICAgIFVFcnJvckNvZGUgJnN0YXR1cykgeworICAgIHN0YXRpYyBjb25zdCBpbnQgUlRMX09QVFMgPSBVQklESV9ET19NSVJST1JJTkcgfCBVQklESV9LRUVQX0JBU0VfQ09NQklOSU5HIHwKKyAgICAgICAgICAgIFVCSURJX1JFTU9WRV9CSURJX0NPTlRST0xTIHwgVUJJRElfT1VUUFVUX1JFVkVSU0U7CisKKyAgICBVQmlEaUxldmVsIGJpZGlSZXEgPSAwOworICAgIHN3aXRjaCAoZmxhZ3MpIHsKKyAgICBjYXNlIGtCaWRpX0xUUjogYmlkaVJlcSA9IDA7IGJyZWFrOyAvLyBubyBJQ1UgY29uc3RhbnQsIGNhbm9uaWNhbCBMVFIgbGV2ZWwKKyAgICBjYXNlIGtCaWRpX1JUTDogYmlkaVJlcSA9IDE7IGJyZWFrOyAvLyBubyBJQ1UgY29uc3RhbnQsIGNhbm9uaWNhbCBSVEwgbGV2ZWwKKyAgICBjYXNlIGtCaWRpX0RlZmF1bHRfTFRSOiBiaWRpUmVxID0gVUJJRElfREVGQVVMVF9MVFI7IGJyZWFrOworICAgIGNhc2Uga0JpZGlfRGVmYXVsdF9SVEw6IGJpZGlSZXEgPSBVQklESV9ERUZBVUxUX1JUTDsgYnJlYWs7CisgICAgY2FzZSBrQmlkaV9Gb3JjZV9MVFI6IG1lbWNweShidWZmZXIsIHRleHQsIGxlbiAqIHNpemVvZihqY2hhcikpOyByZXR1cm4gbGVuOworICAgIGNhc2Uga0JpZGlfRm9yY2VfUlRMOiByZXR1cm4gc2hhcGVSdGxUZXh0KHRleHQsIDAsIGxlbiwgbGVuLCBidWZmZXIsIHN0YXR1cyk7CisgICAgfQorCisgICAgaW50MzJfdCByZXN1bHQgPSAtMTsKKworICAgIFVCaURpKiBiaWRpID0gdWJpZGlfb3BlbigpOworICAgIGlmIChiaWRpKSB7CisgICAgICAgIHViaWRpX3NldFBhcmEoYmlkaSwgdGV4dCwgbGVuLCBiaWRpUmVxLCBOVUxMLCAmc3RhdHVzKTsKKyAgICAgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgICBkaXIgPSB1YmlkaV9nZXRQYXJhTGV2ZWwoYmlkaSkgJiAweDE7IC8vIDAgaWYgbHRyLCAxIGlmIHJ0bAorCisgICAgICAgICAgICBpbnQgcmMgPSB1YmlkaV9jb3VudFJ1bnMoYmlkaSwgJnN0YXR1cyk7CisgICAgICAgICAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICAvLyBMT0coTE9HX0lORk8sICJMQVlPVVQiLCAicGFyYSBiaWRpUmVxPSVkIGRpcj0lZCByYz0lZFxuIiwgYmlkaVJlcSwgZGlyLCByYyk7CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IHNsZW4gPSAwOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0OworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgVUJpRGlEaXJlY3Rpb24gcnVuRGlyID0gdWJpZGlfZ2V0VmlzdWFsUnVuKGJpZGksIGksICZzdGFydCwgJmxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bkRpciA9PSBVQklESV9SVEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsZW4gKz0gc2hhcGVSdGxUZXh0KHRleHQgKyBzdGFydCwgMCwgbGVuZ3RoLCBsZW5ndGgsIGJ1ZmZlciArIHNsZW4sIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyICsgc2xlbiwgdGV4dCArIHN0YXJ0LCBsZW5ndGggKiBzaXplb2YoamNoYXIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsZW4gKz0gbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzbGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1YmlkaV9jbG9zZShiaWRpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitib29sIFRleHRMYXlvdXQ6OnByZXBhcmVUZXh0KFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciogdGV4dCwganNpemUgbGVuLCBqaW50IGJpZGlGbGFncywKKyAgICAgICAgY29uc3QgamNoYXIqKiBvdXRUZXh0LCBpbnQzMl90KiBvdXRCeXRlcywgamNoYXIqKiBvdXRCdWZmZXIpIHsKKyAgICBjb25zdCBqY2hhciAqd29ya1RleHQgPSB0ZXh0OworICAgIGpjaGFyICpidWZmZXIgPSBOVUxMOworICAgIGludCBkaXIgPSBrRGlyZWN0aW9uX0xUUjsKKyAgICBpZiAobmVlZHNMYXlvdXQodGV4dCwgbGVuLCBiaWRpRmxhZ3MpKSB7CisgICAgICAgIGJ1ZmZlciA9KGpjaGFyICopIG1hbGxvYyhsZW4gKiBzaXplb2YoamNoYXIpKTsKKyAgICAgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgbGVuID0gbGF5b3V0TGluZSh0ZXh0LCBsZW4sIGJpZGlGbGFncywgZGlyLCBidWZmZXIsIHN0YXR1cyk7IC8vIG1pZ2h0IGNoYW5nZSBsZW4sIGRpcgorICAgICAgICBpZiAoIVVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgICBMT0coTE9HX1dBUk4sICJMQVlPVVQiLCAiZHJhd1RleHQgZXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICBmcmVlKGJ1ZmZlcik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGNhbid0IHJlbmRlcgorICAgICAgICB9CisKKyAgICAgICAgd29ya1RleHQgPSBidWZmZXI7IC8vIHVzZSB0aGUgc2hhcGVkIHRleHQKKyAgICB9CisKKyAgICBib29sIHRyaW1MZWZ0ID0gZmFsc2U7CisgICAgYm9vbCB0cmltUmlnaHQgPSBmYWxzZTsKKworICAgIFNrUGFpbnQ6OkFsaWduIGhvcml6ID0gcGFpbnQtPmdldFRleHRBbGlnbigpOworICAgIHN3aXRjaCAoaG9yaXopIHsKKyAgICAgICAgY2FzZSBTa1BhaW50OjprTGVmdF9BbGlnbjogdHJpbUxlZnQgPSBkaXIgJiBrRGlyZWN0aW9uX01hc2s7IGJyZWFrOworICAgICAgICBjYXNlIFNrUGFpbnQ6OmtDZW50ZXJfQWxpZ246IHRyaW1MZWZ0ID0gdHJpbVJpZ2h0ID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgIGNhc2UgU2tQYWludDo6a1JpZ2h0X0FsaWduOiB0cmltUmlnaHQgPSAhKGRpciAmIGtEaXJlY3Rpb25fTWFzayk7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKyAgICBjb25zdCBqY2hhciogd29ya0xpbWl0ID0gd29ya1RleHQgKyBsZW47CisKKyAgICBpZiAodHJpbUxlZnQpIHsKKyAgICAgICAgd2hpbGUgKHdvcmtUZXh0IDwgd29ya0xpbWl0ICYmICp3b3JrVGV4dCA9PSAnICcpIHsKKyAgICAgICAgICAgICsrd29ya1RleHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHRyaW1SaWdodCkgeworICAgICAgICB3aGlsZSAod29ya0xpbWl0ID4gd29ya1RleHQgJiYgKih3b3JrTGltaXQgLSAxKSA9PSAnICcpIHsKKyAgICAgICAgICAgIC0td29ya0xpbWl0OworICAgICAgICB9CisgICAgfQorCisgICAgKm91dEJ5dGVzID0gKHdvcmtMaW1pdCAtIHdvcmtUZXh0KSA8PCAxOworICAgICpvdXRUZXh0ID0gd29ya1RleHQ7CisgICAgKm91dEJ1ZmZlciA9IGJ1ZmZlcjsKKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBEcmF3cyBvciBnZXRzIHRoZSBwYXRoIG9mIGEgcGFyYWdyYXBoIG9mIHRleHQgb24gYSBzaW5nbGUgbGluZSwgcnVubmluZyBiaWRpIGFuZCBzaGFwaW5nLgorLy8gVGhpcyB3aWxsIGRyYXcgaWYgY2FudmFzIGlzIG5vdCBudWxsLCBvdGhlcndpc2UgcGF0aCBtdXN0IGJlIG5vbi1udWxsIGFuZCBpdCB3aWxsIGNyZWF0ZQorLy8gYSBwYXRoIHJlcHJlc2VudGluZyB0aGUgdGV4dCB0aGF0IHdvdWxkIGhhdmUgYmVlbiBkcmF3bi4KK3ZvaWQgVGV4dExheW91dDo6aGFuZGxlVGV4dChTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGpzaXplIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LFNrQ2FudmFzICpjYW52YXMsIFNrUGF0aCAqcGF0aCkgeworICAgIGNvbnN0IGpjaGFyICp3b3JrVGV4dDsKKyAgICBqY2hhciAqYnVmZmVyID0gTlVMTDsKKyAgICBpbnQzMl90IHdvcmtCeXRlczsKKyAgICBpZiAocHJlcGFyZVRleHQocGFpbnQsIHRleHQsIGxlbiwgYmlkaUZsYWdzLCAmd29ya1RleHQsICZ3b3JrQnl0ZXMsICZidWZmZXIpKSB7CisgICAgICAgIFNrU2NhbGFyIHhfID0gU2tGbG9hdFRvU2NhbGFyKHgpOworICAgICAgICBTa1NjYWxhciB5XyA9IFNrRmxvYXRUb1NjYWxhcih5KTsKKyAgICAgICAgaWYgKGNhbnZhcykgeworICAgICAgICAgICAgY2FudmFzLT5kcmF3VGV4dCh3b3JrVGV4dCwgd29ya0J5dGVzLCB4XywgeV8sICpwYWludCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYWludC0+Z2V0VGV4dFBhdGgod29ya1RleHQsIHdvcmtCeXRlcywgeF8sIHlfLCBwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBmcmVlKGJ1ZmZlcik7CisgICAgfQorfQorCitib29sIFRleHRMYXlvdXQ6OnByZXBhcmVSdGxUZXh0UnVuKGNvbnN0IGpjaGFyKiBjb250ZXh0LCBqc2l6ZSBzdGFydCwganNpemUmIGNvdW50LAorICAgICAgICBqc2l6ZSBjb250ZXh0Q291bnQsIGpjaGFyKiBzaGFwZWQpIHsKKyAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBjb3VudCA9IHNoYXBlUnRsVGV4dChjb250ZXh0LCBzdGFydCwgY291bnQsIGNvbnRleHRDb3VudCwgc2hhcGVkLCBzdGF0dXMpOworICAgIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0coTE9HX1dBUk4sICJMQVlPVVQiLCAiZHJhd1RleHRSdW4gZXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBUZXh0TGF5b3V0OjpkcmF3VGV4dFJ1bihTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIGNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IHN0YXJ0LCBqaW50IGNvdW50LCBqaW50IGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpckZsYWdzLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrQ2FudmFzKiBjYW52YXMpIHsKKworICAgICBTa1NjYWxhciB4XyA9IFNrRmxvYXRUb1NjYWxhcih4KTsKKyAgICAgU2tTY2FsYXIgeV8gPSBTa0Zsb2F0VG9TY2FsYXIoeSk7CisKKyAgICAgdWludDhfdCBydGwgPSBkaXJGbGFncyAmIDB4MTsKKyAgICAgaWYgKHJ0bCkgeworICAgICAgICAgU2tBdXRvU1RNYWxsb2M8ODAsIGpjaGFyPiBidWZmZXIoY29udGV4dENvdW50KTsKKyAgICAgICAgIGlmIChwcmVwYXJlUnRsVGV4dFJ1bihjaGFycywgc3RhcnQsIGNvdW50LCBjb250ZXh0Q291bnQsIGJ1ZmZlci5nZXQoKSkpIHsKKyAgICAgICAgICAgICBjYW52YXMtPmRyYXdUZXh0KGJ1ZmZlci5nZXQoKSwgY291bnQgPDwgMSwgeF8sIHlfLCAqcGFpbnQpOworICAgICAgICAgfQorICAgICB9IGVsc2UgeworICAgICAgICAgY2FudmFzLT5kcmF3VGV4dChjaGFycyArIHN0YXJ0LCBjb3VudCA8PCAxLCB4XywgeV8sICpwYWludCk7CisgICAgIH0KKyB9CisKK3ZvaWQgVGV4dExheW91dDo6Z2V0VGV4dFJ1bkFkdmFuY2VzKFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciAqY2hhcnMsIGppbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGNvdW50LCBqaW50IGNvbnRleHRDb3VudCwgamludCBkaXJGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCAqcmVzdWx0QWR2YW5jZXMsIGpmbG9hdCAmcmVzdWx0VG90YWxBZHZhbmNlKSB7CisgICAgamNoYXIgYnVmZmVyW2NvbnRleHRDb3VudF07CisKKyAgICBTa1NjYWxhciogc2NhbGFyQXJyYXkgPSAoU2tTY2FsYXIgKilyZXN1bHRBZHZhbmNlczsKKyAgICByZXN1bHRUb3RhbEFkdmFuY2UgPSAwOworCisgICAgLy8gdGhpcyBpcyB3aGVyZSB3ZSdkIGNhbGwgaGFyZmJ1enoKKyAgICAvLyBmb3Igbm93IHdlIGp1c3QgdXNlIHVzaGFwZS5jCisKKyAgICBpbnQgd2lkdGhzOworICAgIGNvbnN0IGpjaGFyKiB0ZXh0OworICAgIGlmIChkaXJGbGFncyAmIDB4MSkgeyAvLyBydGwsIGNhbGwgYXJhYmljIHNoYXBpbmcgaW4gY2FzZQorICAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgLy8gVXNlIGZpeGVkIGxlbmd0aCBzaW5jZSB3ZSBuZWVkIHRvIGtlZXAgc3RhcnQgYW5kIGNvdW50IHZhbGlkCisgICAgICAgIHVfc2hhcGVBcmFiaWMoY2hhcnMsIGNvbnRleHRDb3VudCwgYnVmZmVyLCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9MRU5HVEhfRklYRURfU1BBQ0VTX05FQVIgfAorICAgICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfVEVYVF9ESVJFQ1RJT05fTE9HSUNBTCB8IFVfU0hBUEVfTEVUVEVSU19TSEFQRSB8CisgICAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9YX0xBTUFMRUZfU1VCX0FMVEVSTkFURSwgJnN0YXR1cyk7CisgICAgICAgIC8vIHdlIHNob3VsZG4ndCBmYWlsIHVubGVzcyB0aGVyZSdzIGFuIG91dCBvZiBtZW1vcnkgY29uZGl0aW9uLAorICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHdlJ3JlIGhvc2VkIGFueXdheQorICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBpICsgY291bnQ7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICBpZiAoYnVmZmVyW2ldID09IDB4ZmZmZikgeworICAgICAgICAgICAgYnVmZmVyW2ldID0gMHgyMDBiOyAvLyB6ZXJvLXdpZHRoLXNwYWNlIGZvciBza2lhCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRleHQgPSBidWZmZXIgKyBzdGFydDsKKyAgICAgICAgd2lkdGhzID0gcGFpbnQtPmdldFRleHRXaWR0aHModGV4dCwgY291bnQgPDwgMSwgc2NhbGFyQXJyYXkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRleHQgPSBjaGFycyArIHN0YXJ0OworICAgICAgICB3aWR0aHMgPSBwYWludC0+Z2V0VGV4dFdpZHRocyh0ZXh0LCBjb3VudCA8PCAxLCBzY2FsYXJBcnJheSk7CisgICAgfQorCisgICAgaWYgKHdpZHRocyA8IGNvdW50KSB7CisgICAgICAgIC8vIFNraWEgb3BlcmF0ZXMgb24gY29kZSBwb2ludHMsIG5vdCBjb2RlIHVuaXRzLCBzbyBzdXJyb2dhdGUgcGFpcnMgcmV0dXJuIG9ubHkKKyAgICAgICAgLy8gb25lIHZhbHVlLiBFeHBhbmQgdGhlIHJlc3VsdCBzbyB3ZSBoYXZlIG9uZSB2YWx1ZSBwZXIgVVRGLTE2IGNvZGUgdW5pdC4KKworICAgICAgICAvLyBOb3RlLCBza2lhJ3MgZ2V0VGV4dFdpZHRoIGdldHMgY29uZnVzZWQgaWYgaXQgZW5jb3VudGVycyBhIHN1cnJvZ2F0ZSBwYWlyLAorICAgICAgICAvLyBsZWF2aW5nIHRoZSByZW1haW5pbmcgd2lkdGhzIHplcm8uICBOb3QgbmljZS4KKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIHAgPSAwOyBpIDwgd2lkdGhzOyArK2kpIHsKKyAgICAgICAgICAgIHJlc3VsdFRvdGFsQWR2YW5jZSArPSByZXN1bHRBZHZhbmNlc1twKytdID0gU2tTY2FsYXJUb0Zsb2F0KHNjYWxhckFycmF5W2ldKTsKKyAgICAgICAgICAgIGlmIChwIDwgY291bnQgJiYgdGV4dFtwXSA+PSAweGRjMDAgJiYgdGV4dFtwXSA8IDB4ZTAwMCAmJgorICAgICAgICAgICAgICAgICAgICB0ZXh0W3AtMV0gPj0gMHhkODAwICYmIHRleHRbcC0xXSA8IDB4ZGMwMCkgeworICAgICAgICAgICAgICAgIHJlc3VsdEFkdmFuY2VzW3ArK10gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHRUb3RhbEFkdmFuY2UgKz0gcmVzdWx0QWR2YW5jZXNbaV0gPSBTa1NjYWxhclRvRmxvYXQoc2NhbGFyQXJyYXlbaV0pOworICAgICAgICB9CisgICAgfQorfQorCisKKy8vIERyYXdzIGEgcGFyYWdyYXBoIG9mIHRleHQgb24gYSBzaW5nbGUgbGluZSwgcnVubmluZyBiaWRpIGFuZCBzaGFwaW5nCit2b2lkIFRleHRMYXlvdXQ6OmRyYXdUZXh0KFNrUGFpbnQqIHBhaW50LCBjb25zdCBqY2hhciogdGV4dCwganNpemUgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmlkaUZsYWdzLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrQ2FudmFzKiBjYW52YXMpIHsKKworICAgIGhhbmRsZVRleHQocGFpbnQsIHRleHQsIGxlbiwgYmlkaUZsYWdzLCB4LCB5LCBjYW52YXMsIE5VTEwpOworfQorCit2b2lkIFRleHRMYXlvdXQ6OmdldFRleHRQYXRoKFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciAqdGV4dCwganNpemUgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGggKnBhdGgpIHsKKyAgICBoYW5kbGVUZXh0KHBhaW50LCB0ZXh0LCBsZW4sIGJpZGlGbGFncywgeCwgeSwgTlVMTCwgcGF0aCk7Cit9CisKKwordm9pZCBUZXh0TGF5b3V0OjpkcmF3VGV4dE9uUGF0aChTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpZGlGbGFncywgamZsb2F0IGhPZmZzZXQsIGpmbG9hdCB2T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1BhdGgqIHBhdGgsIFNrQ2FudmFzKiBjYW52YXMpIHsKKworICAgIFNrU2NhbGFyIGhfID0gU2tGbG9hdFRvU2NhbGFyKGhPZmZzZXQpOworICAgIFNrU2NhbGFyIHZfID0gU2tGbG9hdFRvU2NhbGFyKHZPZmZzZXQpOworCisgICAgaWYgKCFuZWVkc0xheW91dCh0ZXh0LCBjb3VudCwgYmlkaUZsYWdzKSkgeworICAgICAgICBjYW52YXMtPmRyYXdUZXh0T25QYXRoSFYodGV4dCwgY291bnQgPDwgMSwgKnBhdGgsIGhfLCB2XywgKnBhaW50KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNrQXV0b1NUTWFsbG9jPDgwLCBqY2hhcj4gYnVmZmVyKGNvdW50KTsKKyAgICBpbnQgZGlyID0ga0RpcmVjdGlvbl9MVFI7CisgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgY291bnQgPSBsYXlvdXRMaW5lKHRleHQsIGNvdW50LCBiaWRpRmxhZ3MsIGRpciwgYnVmZmVyLmdldCgpLCBzdGF0dXMpOworICAgIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICBjYW52YXMtPmRyYXdUZXh0T25QYXRoSFYoYnVmZmVyLmdldCgpLCBjb3VudCA8PCAxLCAqcGF0aCwgaF8sIHZfLCAqcGFpbnQpOworICAgIH0KK30KKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UZXh0TGF5b3V0LmggYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjY2NmMwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UZXh0TGF5b3V0LmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJqbmkuaCIKKworI2luY2x1ZGUgIlNrQ2FudmFzLmgiCisjaW5jbHVkZSAiU2tQYWludC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgVGV4dExheW91dCB7CitwdWJsaWM6CisKKyAgICBlbnVtIHsKKyAgICAgICAga0RpcmVjdGlvbl9MVFIgPSAwLAorICAgICAgICBrRGlyZWN0aW9uX1JUTCA9IDEsCisKKyAgICAgICAga0RpcmVjdGlvbl9NYXNrID0gMHgxCisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBrQmlkaV9MVFIgPSAwLAorICAgICAgICBrQmlkaV9SVEwgPSAxLAorICAgICAgICBrQmlkaV9EZWZhdWx0X0xUUiA9IDIsCisgICAgICAgIGtCaWRpX0RlZmF1bHRfUlRMID0gMywKKyAgICAgICAga0JpZGlfRm9yY2VfTFRSID0gNCwKKyAgICAgICAga0JpZGlfRm9yY2VfUlRMID0gNSwKKworICAgICAgICBrQmlkaV9NYXNrID0gMHg3CisgICAgfTsKKworICAgIC8qCisgICAgICogRHJhd3MgYSB1bmlkaXJlY3Rpb25hbCBydW4gb2YgdGV4dC4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dFJ1bihTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIGNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgc3RhcnQsIGppbnQgY291bnQsIGppbnQgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa0NhbnZhcyogY2FudmFzKTsKKworICAgIHN0YXRpYyB2b2lkIGdldFRleHRSdW5BZHZhbmNlcyhTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIgKmNoYXJzLCBqaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGNvdW50LCBqaW50IGNvbnRleHRDb3VudCwgamludCBkaXJGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0ICpyZXN1bHRBZHZhbmNlcywgamZsb2F0ICZyZXN1bHRUb3RhbEFkdmFuY2UpOworCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHQoU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBqc2l6ZSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgamludCBiaWRpRmxhZ3MsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tDYW52YXMqIGNhbnZhcyk7CisKKyAgICBzdGF0aWMgdm9pZCBnZXRUZXh0UGF0aChTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIgKnRleHQsIGpzaXplIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGggKnBhdGgpOworCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHRPblBhdGgoU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBqc2l6ZSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpZGlGbGFncywgamZsb2F0IGhPZmZzZXQsIGpmbG9hdCB2T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrUGF0aCogcGF0aCwgU2tDYW52YXMqIGNhbnZhcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBzdGF0aWMgYm9vbCBwcmVwYXJlVGV4dChTa1BhaW50ICpwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGpzaXplIGxlbiwgamludCBiaWRpRmxhZ3MsCisgICAgICAgIGNvbnN0IGpjaGFyKiogb3V0VGV4dCwgaW50MzJfdCogb3V0Qnl0ZXMsIGpjaGFyKiogb3V0QnVmZmVyKTsKKyAgICBzdGF0aWMgYm9vbCBwcmVwYXJlUnRsVGV4dFJ1bihjb25zdCBqY2hhciogY29udGV4dCwganNpemUgc3RhcnQsIGpzaXplJiBjb3VudCwKKyAgICAgICAganNpemUgY29udGV4dENvdW50LCBqY2hhciogc2hhcGVkKTsKKyAgICAgICAgCisKK3ByaXZhdGU6CisgICAgc3RhdGljIGJvb2wgbmVlZHNMYXlvdXQoY29uc3QgamNoYXIqIHRleHQsIGppbnQgbGVuLCBqaW50IGJpZGlGbGFncyk7CisgICAgc3RhdGljIGludCBzaGFwZVJ0bFRleHQoY29uc3QgamNoYXIqIGNvbnRleHQsIGpzaXplIHN0YXJ0LCBqc2l6ZSBjb3VudCwganNpemUgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpjaGFyKiBzaGFwZWQsIFVFcnJvckNvZGUgJnN0YXR1cyk7CisgICAgc3RhdGljIGppbnQgbGF5b3V0TGluZShjb25zdCBqY2hhciogdGV4dCwgamludCBsZW4sIGppbnQgZmxhZ3MsIGludCAmZGlyLCBqY2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAmc3RhdHVzKTsKKyAgICBzdGF0aWMgdm9pZCBoYW5kbGVUZXh0KFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciogdGV4dCwganNpemUgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LFNrQ2FudmFzICpjYW52YXMsIFNrUGF0aCAqcGF0aCk7Cit9OworCit9CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1R5cGVmYWNlLmNwcCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVHlwZWZhY2UuY3BwCmluZGV4IDdjN2JmZWIuLjFmZTcyZTYgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVHlwZWZhY2UuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVHlwZWZhY2UuY3BwCkBAIC0xMzAsNyArMTMwLDEzIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICAKLSAgICByZXR1cm4gU2tUeXBlZmFjZTo6Q3JlYXRlRnJvbVN0cmVhbShuZXcgQXNzZXRTdHJlYW0oYXNzZXQsIHRydWUpKTsKKyAgICBTa1N0cmVhbSogc3RyZWFtID0gbmV3IEFzc2V0U3RyZWFtKGFzc2V0LCB0cnVlKTsKKyAgICBTa1R5cGVmYWNlKiBmYWNlID0gU2tUeXBlZmFjZTo6Q3JlYXRlRnJvbVN0cmVhbShzdHJlYW0pOworICAgIC8vIFNrVHlwZUZhY2U6OkNyZWF0ZUZyb21TdHJlYW0gY2FsbHMgcmVmKCkgb24gdGhlIHN0cmVhbSwgc28gd2UKKyAgICAvLyBuZWVkIHRvIHVucmVmIGl0IGhlcmUgb3IgaXQgd29uJ3QgYmUgZnJlZWQgbGF0ZXIgb24KKyAgICBzdHJlYW0tPnVucmVmKCk7CisKKyAgICByZXR1cm4gZmFjZTsKIH0KIAogc3RhdGljIFNrVHlwZWZhY2UqIFR5cGVmYWNlX2NyZWF0ZUZyb21GaWxlKEpOSUVudiogZW52LCBqb2JqZWN0LCBqc3RyaW5nIGpwYXRoKSB7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9TY29Tb2NrZXQuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfU2NvU29ja2V0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlNDQwOS4uMDAwMDAwMAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9TY29Tb2NrZXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjg5ICswLDAgQEAKLS8qCi0qKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2RlZmluZSBMT0dfVEFHICJibHVldG9vdGhfU2NvU29ja2V0LmNwcCIKLQotI2luY2x1ZGUgImFuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5oIgotI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgotI2luY2x1ZGUgIkpOSUhlbHAuaCIKLSNpbmNsdWRlICJqbmkuaCIKLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLSNpbmNsdWRlICJ1dGlscy9taXNjLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdWlvLmg+Ci0jaW5jbHVkZSA8c3lzL3BvbGwuaD4KLQotI2lmZGVmIEhBVkVfQkxVRVRPT1RICi0jaW5jbHVkZSA8Ymx1ZXRvb3RoL2JsdWV0b290aC5oPgotI2luY2x1ZGUgPGJsdWV0b290aC9zY28uaD4KLSNpbmNsdWRlIDxibHVldG9vdGgvaGNpLmg+Ci0KLSNkZWZpbmUgTUFYX0xJTkUgMjU1Ci0KLS8qCi0gKiBEZWZpbmVzIHRoZSBtb2R1bGUgc3RyaW5ncyB1c2VkIGluIHRoZSBibGFja2xpc3QgZmlsZS4KLSAqIFRoZXNlIGFyZSB1c2VkIGJ5IGNvbnN1bWVycyBvZiB0aGUgYmxhY2tsaXN0IGZpbGUgdG8gc2VlIGlmIHRoZSBsaW5lIGlzCi0gKiB1c2VkIGJ5IHRoYXQgbW9kdWxlLgotICovCi0jZGVmaW5lIFNDT19CTEFDS0xJU1RfTU9EVUxFX05BTUUgInNjb1NvY2tldCIKLQotCi0vKiBEZWZpbmUgdGhlIHR5cGUgc3RyaW5ncyB1c2VkIGluIHRoZSBibGFja2xpc3QgZmlsZS4gKi8KLSNkZWZpbmUgQkxBQ0tMSVNUX0JZX05BTUUgIm5hbWUiCi0jZGVmaW5lIEJMQUNLTElTVF9CWV9QQVJUSUFMX05BTUUgInBhcnRpYWxfbmFtZSIKLSNkZWZpbmUgQkxBQ0tMSVNUX0JZX09VSSAidmVuZG9yX291aSIKLQotI2VuZGlmCi0KLS8qIElkZWFsbHksIGJsb2NraW5nIEkvTyBvbiBhIFNDTyBzb2NrZXQgd291bGQgcmV0dXJuIHdoZW4gYW5vdGhlciB0aHJlYWQKLSAqIGNhbGxzIGNsb3NlKCkuIEhvd2V2ZXIgaXQgZG9lcyBub3QgcmlnaHQgbm93LCBpbiBmYWN0IGNsb3NlKCkgb24gYSBTQ08KLSAqIHNvY2tldCBoYXMgc3RyYW5nZSBiZWhhdmlvciAocmV0dXJucyBhIGJvZ3VzIHZhbHVlKSB3aGVuIG90aGVyIHRocmVhZHMKLSAqIGFyZSBwZXJmb3JtaW5nIGJsb2NraW5nIEkvTyBvbiB0aGF0IHNvY2tldC4gU28sIHRvIHdvcmthcm91bmQsIHdlIGFsd2F5cwotICogY2FsbCBjbG9zZSgpIGZyb20gdGhlIHNhbWUgdGhyZWFkIHRoYXQgZG9lcyBibG9ja2luZyBJL08uIFRoaXMgcmVxdWlyZXMgdGhlCi0gKiB1c2Ugb2YgYSBzb2NrZXRwYWlyIHRvIHNpZ25hbCB0aGUgYmxvY2tpbmcgSS9PIHRvIGFib3J0LgotICoKLSAqIFVuZm9ydHVuYXRlbHkgSSBkb24ndCBrbm93IGEgd2F5IHRvIGFib3J0IGNvbm5lY3QoKSB5ZXQsIGJ1dCBhdCBsZWFzdCB0aGlzCi0gKiB0aW1lcyBvdXQgYWZ0ZXIgdGhlIEJUIHBhZ2UgdGltZW91dCAoMTAgc2Vjb25kcyBjdXJyZW50bHkpLCBzbyB0aGUgdGhyZWFkCi0gKiB3aWxsIGRpZSBldmVudHVhbGx5LiBUaGUgZmFjdCB0aGF0IHRoZSB0aHJlYWQgY2FuIG91dGxpdmUKLSAqIHRoZSBKYXZhIG9iamVjdCBmb3JjZXMgdXMgdG8gdXNlIGEgbXV0ZXggaW4gZGVzdG9yeU5hdGl2ZSgpLgotICoKLSAqIFRoZSBKTkkgQVBJIGlzIGVudGlyZWx5IGFzeW5jLgotICoKLSAqIEFsc28gbm90ZSB0aGlzIGNsYXNzIGRlYWxzIG9ubHkgd2l0aCBTQ08gY29ubmVjdGlvbnMsIG5vdCB3aXRoIGRhdGEKLSAqIHRyYW5zbWlzc2lvbi4KLSAqLwotbmFtZXNwYWNlIGFuZHJvaWQgewotI2lmZGVmIEhBVkVfQkxVRVRPT1RICi0KLXN0YXRpYyBKYXZhVk0gKmp2bTsKLXN0YXRpYyBqZmllbGRJRCBmaWVsZF9tTmF0aXZlRGF0YTsKLXN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uQWNjZXB0ZWQ7Ci1zdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkNvbm5lY3RlZDsKLXN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uQ2xvc2VkOwotCi1zdHJ1Y3QgdGhyZWFkX2RhdGFfdDsKLXN0YXRpYyB2b2lkICp3b3JrX3RocmVhZCh2b2lkICphcmcpOwotc3RhdGljIGludCBjb25uZWN0X3dvcmsoY29uc3QgY2hhciAqYWRkcmVzcywgdWludDE2X3Qgc2NvX3BrdF90eXBlKTsKLXN0YXRpYyBpbnQgYWNjZXB0X3dvcmsoaW50IHNpZ25hbF9zayk7Ci1zdGF0aWMgdm9pZCB3YWl0X2Zvcl9jbG9zZShpbnQgc2ssIGludCBzaWduYWxfc2spOwotc3RhdGljIHZvaWQgY2xvc2VOYXRpdmUoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0KTsKLQotc3RhdGljIHZvaWQgcGFyc2VCbGFja2xpc3Qodm9pZCk7Ci1zdGF0aWMgdWludDE2X3QgZ2V0U2NvVHlwZShjaGFyICphZGRyZXNzLCBjb25zdCBjaGFyICpuYW1lKTsKLQotI2RlZmluZSBDT01QQVJFX1NUUklORyhrZXksIHMpICghc3RybmNtcChrZXksIHMsIHN0cmxlbihzKSkpCi0KLS8qIEJsYWNrbGlzdCBkYXRhICovCi10eXBlZGVmIHN0cnVjdCBzY29CbGFja2xpc3QgewotICAgIGludCBmaWVsZFR5cGU7Ci0gICAgY2hhciAqdmFsdWU7Ci0gICAgdWludDE2X3Qgc2NvVHlwZTsKLSAgICBzdHJ1Y3Qgc2NvQmxhY2tsaXN0ICpuZXh0OwotfSBzY29CbGFja2xpc3RfdDsKLQotI2RlZmluZSBCTF9UWVBFX05BTUUgMSAgIC8vIEZpZWxkIHR5cGUgaXMgbmFtZSBzdHJpbmcKLQotc3RhdGljIHNjb0JsYWNrbGlzdF90ICpibGFja2xpc3QgPSBOVUxMOwotCi0vKiBzaGFyZWQgbmF0aXZlIGRhdGEgLSBwcm90ZWN0ZWQgYnkgbXV0ZXggKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBwdGhyZWFkX211dGV4X3QgbXV0ZXg7Ci0gICAgaW50IHNpZ25hbF9zazsgICAgICAgIC8vIHNvY2tldCB0byBzaWduYWwgYmxvY2tlZCBJL08gdG8gdW5ibG9jawotICAgIGpvYmplY3Qgb2JqZWN0OyAgICAgICAvLyBKTkkgZ2xvYmFsIHJlZiB0byB0aGUgSmF2YSBvYmplY3QKLSAgICB0aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YTsgIC8vIHBvaW50ZXIgdG8gdGhyZWFkIGxvY2FsIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heCAxIHRocmVhZCBwZXIgc2NvIHNvY2tldAotfSBuYXRpdmVfZGF0YV90OwotCi0vKiB0aHJlYWQgbG9jYWwgZGF0YSAqLwotc3RydWN0IHRocmVhZF9kYXRhX3QgewotICAgIG5hdGl2ZV9kYXRhX3QgKm5hdDsKLSAgICBib29sIGlzX2FjY2VwdDsgICAgICAgIC8vIGFjY2VwdCAobGlzdGVuaW5nKSBvciBjb25uZWN0IChvdXRnb2luZykgdGhyZWFkCi0gICAgaW50IHNpZ25hbF9zazsgICAgICAgICAvLyBzb2NrZXQgZm9yIHRocmVhZCB0byBsaXN0ZW4gZm9yIHVuYmxvY2sgc2lnbmFsCi0gICAgY2hhciBhZGRyZXNzW0JUQUREUl9TSVpFXTsgIC8vIEJUIGFkZHJlcyBhcyBzdHJpbmcKLSAgICB1aW50MTZfdCBzY29fcGt0X3R5cGU7ICAgLy8gU0NPIHBhY2tldCB0eXBlcyBzdXBwb3J0ZWQKLX07Ci0KLXN0YXRpYyBpbmxpbmUgbmF0aXZlX2RhdGFfdCAqIGdldF9uYXRpdmVfZGF0YShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QpIHsKLSAgICByZXR1cm4gKG5hdGl2ZV9kYXRhX3QgKikoZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIGZpZWxkX21OYXRpdmVEYXRhKSk7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBzdHIyc2NvVHlwZSAoY2hhciAqa2V5KSB7Ci0gICAgTE9HVigiJXM6IGtleSA9ICVzIiwgX19GVU5DVElPTl9fLCBrZXkpOwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPX0hWMSIpKQotICAgICAgICByZXR1cm4gRVNDT19IVjE7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fSFYyIikpCi0gICAgICAgIHJldHVybiBFU0NPX0hWMjsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT19IVjMiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fSFYzOwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPX0VWMyIpKQotICAgICAgICByZXR1cm4gRVNDT19FVjM7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fRVY0IikpCi0gICAgICAgIHJldHVybiBFU0NPX0VWNDsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT19FVjUiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fRVY1OwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPXzJFVjMiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fMkVWMzsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT18zRVYzIikpCi0gICAgICAgIHJldHVybiBFU0NPXzNFVjM7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fMkVWNSIpKQotICAgICAgICByZXR1cm4gRVNDT18yRVY1OwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPXzNFVjUiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fM0VWNTsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiU0NPX0VTQ09fTUFTSyIpKQotICAgICAgICByZXR1cm4gU0NPX0VTQ09fTUFTSzsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRURSX0VTQ09fTUFTSyIpKQotICAgICAgICByZXR1cm4gRURSX0VTQ09fTUFTSzsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiQUxMX0VTQ09fTUFTSyIpKQotICAgICAgICByZXR1cm4gQUxMX0VTQ09fTUFTSzsKLSAgICBMT0dFKCJVbmtub3duIFNDTyBUeXBlICglcykgc2tpcHBpbmciLGtleSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhcnNlQmxhY2tsaXN0KHZvaWQpIHsKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9ICIvZXRjL2JsdWV0b290aC9ibGFja2xpc3QuY29uZiI7Ci0gICAgY2hhciBsaW5lW01BWF9MSU5FXTsKLSAgICBzY29CbGFja2xpc3RfdCAqbGlzdCA9IE5VTEw7Ci0gICAgc2NvQmxhY2tsaXN0X3QgKm5ld2VsZW07Ci0KLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0KLSAgICAvKiBPcGVuIGZpbGUgKi8KLSAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOwotICAgIGlmKCFmcCkgewotICAgICAgICBMT0dFKCJFcnJvciglcylvcGVuaW5nIGJsYWNrbGlzdCBmaWxlIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHdoaWxlIChmZ2V0cyhsaW5lLCBNQVhfTElORSwgZnApICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKChDT01QQVJFX1NUUklORyhsaW5lLCAiLy8iKSkgfHwgKCFzdHJjbXAobGluZSwgIiIpKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBjaGFyICptb2R1bGUgPSBzdHJ0b2sobGluZSwiOiIpOwotICAgICAgICBpZiAoQ09NUEFSRV9TVFJJTkcobW9kdWxlLCBTQ09fQkxBQ0tMSVNUX01PRFVMRV9OQU1FKSkgewotICAgICAgICAgICAgbmV3ZWxlbSA9IChzY29CbGFja2xpc3RfdCAqKWNhbGxvYygxLCBzaXplb2Yoc2NvQmxhY2tsaXN0X3QpKTsKLSAgICAgICAgICAgIGlmIChuZXdlbGVtID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBMT0dFKCIlczogb3V0IG9mIG1lbW9yeSEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHBhcnNlIGxpbmUKLSAgICAgICAgICAgIGNoYXIgKnR5cGUgPSBzdHJ0b2soTlVMTCwgIiwiKTsKLSAgICAgICAgICAgIGNoYXIgKnZhbHVlTGlzdCA9IHN0cnRvayhOVUxMLCAiLCIpOwotICAgICAgICAgICAgY2hhciAqcGFyYW1MaXN0ID0gc3RydG9rKE5VTEwsICIsIik7Ci0gICAgICAgICAgICBpZiAoQ09NUEFSRV9TVFJJTkcodHlwZSwgQkxBQ0tMSVNUX0JZX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gRXh0cmFjdCBOYW1lIGZyb20gVmFsdWUgbGlzdAotICAgICAgICAgICAgICAgIG5ld2VsZW0tPmZpZWxkVHlwZSA9IEJMX1RZUEVfTkFNRTsKLSAgICAgICAgICAgICAgICBuZXdlbGVtLT52YWx1ZSA9IChjaGFyICopY2FsbG9jKDEsIHN0cmxlbih2YWx1ZUxpc3QpKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3ZWxlbS0+dmFsdWUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBMT0dFKCIlczogb3V0IG9mIG1lbW9yeSEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmFsdWVMaXN0Kys7ICAvLyBTa2lwIG9wZW4gcXVvdGUKLSAgICAgICAgICAgICAgICBzdHJuY3B5KG5ld2VsZW0tPnZhbHVlLCB2YWx1ZUxpc3QsIHN0cmxlbih2YWx1ZUxpc3QpIC0gMSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgU2NvIFNldHRpbmdzIGZyb20gUGFyYW1ldGVycwotICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtID0gc3RydG9rKHBhcmFtTGlzdCwgIjsiKTsKLSAgICAgICAgICAgICAgICB1aW50MTZfdCBzY29UeXBlcyA9IDA7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmFtICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2NvOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1bMF0gPT0gJy0nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NvID0gc3RyMnNjb1R5cGUocGFyYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjbyAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb1R5cGVzICY9IH5zY287Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1bMF0gPT0gJysnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NvID0gc3RyMnNjb1R5cGUocGFyYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjbyAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb1R5cGVzIHw9IHNjbzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbVswXSA9PSAnPScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY28gPSBzdHIyc2NvVHlwZShwYXJhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvVHlwZXMgPSBzY287Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIFNDTyB0eXBlIG11c3QgYmUgPSwgKyBvciAtIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSBzdHJ0b2soTlVMTCwgIjsiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV3ZWxlbS0+c2NvVHlwZSA9IHNjb1R5cGVzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMT0dFKCJVbmtub3duIFNDTyB0eXBlIGVudHJ5IGluIEJsYWNrbGlzdCBmaWxlIik7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGlzdCkgewotICAgICAgICAgICAgICAgIGxpc3QtPm5leHQgPSBuZXdlbGVtOwotICAgICAgICAgICAgICAgIGxpc3QgPSBuZXdlbGVtOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBibGFja2xpc3QgPSBsaXN0ID0gbmV3ZWxlbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExPR0koIkVudHJ5IG5hbWUgPSAlcyBTY29UeXBlcyA9IDB4JXgiLCBuZXdlbGVtLT52YWx1ZSwKLSAgICAgICAgICAgICAgICAgbmV3ZWxlbS0+c2NvVHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZmNsb3NlKGZwKTsKLSAgICByZXR1cm47Ci19Ci1zdGF0aWMgdWludDE2X3QgZ2V0U2NvVHlwZShjaGFyICphZGRyZXNzLCBjb25zdCBjaGFyICpuYW1lKSB7Ci0gICAgdWludDE2X3QgcmV0ID0gMDsKLSAgICBzY29CbGFja2xpc3RfdCAqbGlzdCA9IGJsYWNrbGlzdDsKLQotICAgIHdoaWxlIChsaXN0ICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKGxpc3QtPmZpZWxkVHlwZSA9PSBCTF9UWVBFX05BTUUpIHsKLSAgICAgICAgICAgIGlmIChDT01QQVJFX1NUUklORyhuYW1lLCBsaXN0LT52YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBsaXN0LT5zY29UeXBlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotICAgIH0KLSAgICBMT0dJKCIlcyAlcyAtIDB4JXgiLCAgX19GVU5DVElPTl9fLCBuYW1lLCByZXQpOwotICAgIHJldHVybiByZXQ7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgY2xhc3NJbml0TmF0aXZlKEpOSUVudiogZW52LCBqY2xhc3MgY2xhenopIHsKLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0jaWZkZWYgSEFWRV9CTFVFVE9PVEgKLSAgICBpZiAoZW52LT5HZXRKYXZhVk0oJmp2bSkgPCAwKSB7Ci0gICAgICAgIExPR0UoIkNvdWxkIG5vdCBnZXQgaGFuZGxlIHRvIHRoZSBWTSIpOwotICAgIH0KLSAgICBmaWVsZF9tTmF0aXZlRGF0YSA9IGdldF9maWVsZChlbnYsIGNsYXp6LCAibU5hdGl2ZURhdGEiLCAiSSIpOwotICAgIG1ldGhvZF9vbkFjY2VwdGVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uQWNjZXB0ZWQiLCAiKEkpViIpOwotICAgIG1ldGhvZF9vbkNvbm5lY3RlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbkNvbm5lY3RlZCIsICIoSSlWIik7Ci0gICAgbWV0aG9kX29uQ2xvc2VkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uQ2xvc2VkIiwgIigpViIpOwotCi0gICAgLyogUmVhZCB0aGUgYmxhY2tsaXN0IGZpbGUgaW4gaGVyZSAqLwotICAgIHBhcnNlQmxhY2tsaXN0KCk7Ci0jZW5kaWYKLX0KLQotLyogUmV0dXJucyBmYWxzZSBpZiBhIHNlcmlvdXMgZXJyb3Igb2NjdXJlZCAqLwotc3RhdGljIGpib29sZWFuIGluaXROYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KSB7Ci0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotI2lmZGVmIEhBVkVfQkxVRVRPT1RICi0KLSAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSAobmF0aXZlX2RhdGFfdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKG5hdGl2ZV9kYXRhX3QpKTsKLSAgICBpZiAobmF0ID09IE5VTEwpIHsKLSAgICAgICAgTE9HRSgiJXM6IG91dCBvZiBtZW1vcnkhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0KLSAgICBwdGhyZWFkX211dGV4X2luaXQoJm5hdC0+bXV0ZXgsIE5VTEwpOwotICAgIGVudi0+U2V0SW50RmllbGQob2JqZWN0LCBmaWVsZF9tTmF0aXZlRGF0YSwgKGppbnQpbmF0KTsKLSAgICBuYXQtPnNpZ25hbF9zayA9IC0xOwotICAgIG5hdC0+b2JqZWN0ID0gTlVMTDsKLSAgICBuYXQtPnRocmVhZF9kYXRhID0gTlVMTDsKLQotI2VuZGlmCi0gICAgcmV0dXJuIEpOSV9UUlVFOwotfQotCi1zdGF0aWMgdm9pZCBkZXN0cm95TmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkgewotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSNpZmRlZiBIQVZFX0JMVUVUT09USAotICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7Ci0gICAgCi0gICAgY2xvc2VOYXRpdmUoZW52LCBvYmplY3QpOwotICAgIAotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbmF0LT5tdXRleCk7Ci0gICAgaWYgKG5hdC0+dGhyZWFkX2RhdGEgIT0gTlVMTCkgewotICAgICAgICBuYXQtPnRocmVhZF9kYXRhLT5uYXQgPSBOVUxMOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZuYXQtPm11dGV4KTsKLQotICAgIGZyZWUobmF0KTsKLSNlbmRpZgotfQotCi1zdGF0aWMgamJvb2xlYW4gYWNjZXB0TmF0aXZlKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iamVjdCkgewotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSNpZmRlZiBIQVZFX0JMVUVUT09USAotICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7Ci0gICAgaW50IHNpZ25hbF9za3NbMl07Ci0gICAgcHRocmVhZF90IHRocmVhZDsKLSAgICBzdHJ1Y3QgdGhyZWFkX2RhdGFfdCAqZGF0YSA9IE5VTEw7Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJm5hdC0+bXV0ZXgpOwotICAgIGlmIChuYXQtPnNpZ25hbF9zayAhPSAtMSkgewotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0gICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgfQotCi0gICAgLy8gc2V0dXAgc29ja2V0cGFpciB0byBwYXNzIG1lc3NhZ2VzIGJldHdlZW4gdGhyZWFkcwotICAgIGlmIChzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBzaWduYWxfc2tzKSA8IDApIHsKLSAgICAgICAgTE9HRSgiJXM6IHNvY2tldHBhaXIoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0gICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgfQotICAgIG5hdC0+c2lnbmFsX3NrID0gc2lnbmFsX3Nrc1swXTsKLSAgICBuYXQtPm9iamVjdCA9IGVudi0+TmV3R2xvYmFsUmVmKG9iamVjdCk7Ci0KLSAgICBkYXRhID0gKHRocmVhZF9kYXRhX3QgKiljYWxsb2MoMSwgc2l6ZW9mKHRocmVhZF9kYXRhX3QpKTsKLSAgICBpZiAoZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIExPR0UoIiVzOiBvdXQgb2YgbWVtb3J5IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgIH0KLSAgICBuYXQtPnRocmVhZF9kYXRhID0gZGF0YTsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0KLSAgICBkYXRhLT5zaWduYWxfc2sgPSBzaWduYWxfc2tzWzFdOwotICAgIGRhdGEtPm5hdCA9IG5hdDsKLSAgICBkYXRhLT5pc19hY2NlcHQgPSB0cnVlOwotCi0gICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWQsIE5VTEwsICZ3b3JrX3RocmVhZCwgKHZvaWQgKilkYXRhKSA8IDApIHsKLSAgICAgICAgTE9HRSgiJXM6IHB0aHJlYWRfY3JlYXRlKCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIEpOSV9UUlVFOwotCi0jZW5kaWYKLSAgICByZXR1cm4gSk5JX0ZBTFNFOwotfQotCi1zdGF0aWMgamJvb2xlYW4gY29ubmVjdE5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgYWRkcmVzcywKLSAgICAgICAganN0cmluZyBuYW1lKSB7Ci0KLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0jaWZkZWYgSEFWRV9CTFVFVE9PVEgKLSAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOwotICAgIGludCBzaWduYWxfc2tzWzJdOwotICAgIHB0aHJlYWRfdCB0aHJlYWQ7Ci0gICAgc3RydWN0IHRocmVhZF9kYXRhX3QgKmRhdGE7Ci0gICAgY29uc3QgY2hhciAqY19hZGRyZXNzOwotICAgIGNvbnN0IGNoYXIgKmNfbmFtZTsKLQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbmF0LT5tdXRleCk7Ci0gICAgaWYgKG5hdC0+c2lnbmFsX3NrICE9IC0xKSB7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0KLSAgICAvLyBzZXR1cCBzb2NrZXRwYWlyIHRvIHBhc3MgbWVzc2FnZXMgYmV0d2VlbiB0aHJlYWRzCi0gICAgaWYgKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIHNpZ25hbF9za3MpIDwgMCkgewotICAgICAgICBMT0dFKCIlczogc29ja2V0cGFpcigpIGZhaWxlZDogJXNcbiIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgIH0KLSAgICBuYXQtPnNpZ25hbF9zayA9IHNpZ25hbF9za3NbMF07Ci0gICAgbmF0LT5vYmplY3QgPSBlbnYtPk5ld0dsb2JhbFJlZihvYmplY3QpOwotCi0gICAgZGF0YSA9ICh0aHJlYWRfZGF0YV90ICopY2FsbG9jKDEsIHNpemVvZih0aHJlYWRfZGF0YV90KSk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgICBMT0dFKCIlczogb3V0IG9mIG1lbW9yeSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotCi0gICAgZGF0YS0+c2lnbmFsX3NrID0gc2lnbmFsX3Nrc1sxXTsKLSAgICBkYXRhLT5uYXQgPSBuYXQ7Ci0gICAgY19hZGRyZXNzID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhhZGRyZXNzLCBOVUxMKTsKLSAgICBzdHJsY3B5KGRhdGEtPmFkZHJlc3MsIGNfYWRkcmVzcywgQlRBRERSX1NJWkUpOwotICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGFkZHJlc3MsIGNfYWRkcmVzcyk7Ci0gICAgZGF0YS0+aXNfYWNjZXB0ID0gZmFsc2U7Ci0KLSAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIExPR0UoIiVzOiBOdWxsIHBvaW50ZXIgcGFzc2VkIGluIGZvciBkZXZpY2UgbmFtZSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGRhdGEtPnNjb19wa3RfdHlwZSA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY19uYW1lID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhuYW1lLCBOVUxMKTsKLSAgICAgICAgLyogU2VlIGlmIHRoaXMgZGV2aWNlIGlzIGluIHRoZSBibGFjayBsaXN0ICovCi0gICAgICAgIGRhdGEtPnNjb19wa3RfdHlwZSA9IGdldFNjb1R5cGUoZGF0YS0+YWRkcmVzcywgY19uYW1lKTsKLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMobmFtZSwgY19uYW1lKTsKLSAgICB9Ci0gICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWQsIE5VTEwsICZ3b3JrX3RocmVhZCwgKHZvaWQgKilkYXRhKSA8IDApIHsKLSAgICAgICAgTE9HRSgiJXM6IHB0aHJlYWRfY3JlYXRlKCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIEpOSV9UUlVFOwotCi0jZW5kaWYKLSAgICByZXR1cm4gSk5JX0ZBTFNFOwotfQotCi1zdGF0aWMgdm9pZCBjbG9zZU5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QpIHsKLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0jaWZkZWYgSEFWRV9CTFVFVE9PVEgKLSAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOwotICAgIGludCBzaWduYWxfc2s7Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJm5hdC0+bXV0ZXgpOwotICAgIHNpZ25hbF9zayA9IG5hdC0+c2lnbmFsX3NrOwotICAgIG5hdC0+c2lnbmFsX3NrID0gLTE7Ci0gICAgZW52LT5EZWxldGVHbG9iYWxSZWYobmF0LT5vYmplY3QpOwotICAgIG5hdC0+b2JqZWN0ID0gTlVMTDsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0KLSAgICBpZiAoc2lnbmFsX3NrID49IDApIHsKLSAgICAgICAgTE9HVigiJXM6IHNpZ25hbF9zayA9ICVkIiwgX19GVU5DVElPTl9fLCBzaWduYWxfc2spOwotICAgICAgICB1bnNpZ25lZCBjaGFyIGR1bW15OwotICAgICAgICB3cml0ZShzaWduYWxfc2ssICZkdW1teSwgc2l6ZW9mKGR1bW15KSk7Ci0gICAgICAgIGNsb3NlKHNpZ25hbF9zayk7Ci0gICAgfQotI2VuZGlmCi19Ci0KLSNpZmRlZiBIQVZFX0JMVUVUT09USAotLyogdGhyZWFkIGVudHJ5IHBvaW50ICovCi1zdGF0aWMgdm9pZCAqd29ya190aHJlYWQodm9pZCAqYXJnKSB7Ci0gICAgSk5JRW52KiBlbnY7Ci0gICAgdGhyZWFkX2RhdGFfdCAqZGF0YSA9ICh0aHJlYWRfZGF0YV90ICopYXJnOwotICAgIGludCBzazsKLQotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSAgICBpZiAoanZtLT5BdHRhY2hDdXJyZW50VGhyZWFkKCZlbnYsIE5VTEwpICE9IEpOSV9PSykgewotICAgICAgICBMT0dFKCIlczogQXR0YWNoQ3VycmVudFRocmVhZCgpIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qIGNvbm5lY3QgdGhlIFNDTyBzb2NrZXQgKi8KLSAgICBpZiAoZGF0YS0+aXNfYWNjZXB0KSB7Ci0gICAgICAgIExPR1YoIlNDTyBPQkpFQ1QgJXAgQUNDRVBUICMjIyMjIiwgZGF0YS0+bmF0LT5vYmplY3QpOwotICAgICAgICBzayA9IGFjY2VwdF93b3JrKGRhdGEtPnNpZ25hbF9zayk7Ci0gICAgICAgIExPR1YoIlNDTyBPQkpFQ1QgJXAgRU5EIEFDQ0VQVCAqKioqKiIsIGRhdGEtPm5hdC0+b2JqZWN0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBzayA9IGNvbm5lY3Rfd29yayhkYXRhLT5hZGRyZXNzLCBkYXRhLT5zY29fcGt0X3R5cGUpOwotICAgIH0KLQotICAgIC8qIGNhbGxiYWNrIHdpdGggY29ubmVjdGlvbiByZXN1bHQgKi8KLSAgICBpZiAoZGF0YS0+bmF0ID09IE5VTEwpIHsKLSAgICAgICAgTE9HVigiJXM6IG9iamVjdCBkZXN0cm95ZWQhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgZ290byBkb25lOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJmRhdGEtPm5hdC0+bXV0ZXgpOwotICAgIGlmIChkYXRhLT5uYXQtPm9iamVjdCA9PSBOVUxMKSB7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZkYXRhLT5uYXQtPm11dGV4KTsKLSAgICAgICAgTE9HVigiJXM6IGNhbGxiYWNrIGNhbmNlbGxlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0gICAgaWYgKGRhdGEtPmlzX2FjY2VwdCkgewotICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKGRhdGEtPm5hdC0+b2JqZWN0LCBtZXRob2Rfb25BY2NlcHRlZCwgc2spOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoZGF0YS0+bmF0LT5vYmplY3QsIG1ldGhvZF9vbkNvbm5lY3RlZCwgc2spOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZGF0YS0+bmF0LT5tdXRleCk7Ci0KLSAgICBpZiAoc2sgPCAwKSB7Ci0gICAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0KLSAgICBMT0dWKCJTQ08gT0JKRUNUICVwICVkIENPTk5FQ1RFRCArKysgKCVzKSIsIGRhdGEtPm5hdC0+b2JqZWN0LCBzaywKLSAgICAgICAgIGRhdGEtPmlzX2FjY2VwdCA/ICJpbiIgOiAib3V0Iik7Ci0KLSAgICAvKiB3YWl0IGZvciB0aGUgc29ja2V0IHRvIGNsb3NlICovCi0gICAgTE9HVigid2FpdF9mb3JfY2xvc2UoKS4uLiIpOwotICAgIHdhaXRfZm9yX2Nsb3NlKHNrLCBkYXRhLT5zaWduYWxfc2spOwotICAgIExPR1YoIndhaXRfZm9yX2Nsb3NlKCkgcmV0dXJuZWQiKTsKLQotICAgIC8qIGNhbGxiYWNrIHdpdGggY2xvc2UgcmVzdWx0ICovCi0gICAgaWYgKGRhdGEtPm5hdCA9PSBOVUxMKSB7Ci0gICAgICAgIExPR1YoIiVzOiBvYmplY3QgZGVzdHJveWVkISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZkYXRhLT5uYXQtPm11dGV4KTsKLSAgICBpZiAoZGF0YS0+bmF0LT5vYmplY3QgPT0gTlVMTCkgewotICAgICAgICBMT0dWKCIlczogY2FsbGJhY2sgY2FuY2VsbGVkIiwgX19GVU5DVElPTl9fKTsKLSAgICB9IGVsc2UgewotICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKGRhdGEtPm5hdC0+b2JqZWN0LCBtZXRob2Rfb25DbG9zZWQpOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZGF0YS0+bmF0LT5tdXRleCk7Ci0KLWRvbmU6Ci0gICAgaWYgKHNrID49IDApIHsKLSAgICAgICAgY2xvc2Uoc2spOwotICAgICAgICBMT0dWKCJTQ08gT0JKRUNUICVwICVkIENMT1NFRCAtLS0gKCVzKSIsIGRhdGEtPm5hdC0+b2JqZWN0LCBzaywgZGF0YS0+aXNfYWNjZXB0ID8gImluIiA6ICJvdXQiKTsKLSAgICB9Ci0gICAgaWYgKGRhdGEtPnNpZ25hbF9zayA+PSAwKSB7Ci0gICAgICAgIGNsb3NlKGRhdGEtPnNpZ25hbF9zayk7Ci0gICAgfQotICAgIExPR1YoIlNDTyBzb2NrZXQgY2xvc2VkIik7Ci0KLSAgICBpZiAoZGF0YS0+bmF0ICE9IE5VTEwpIHsKLSAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZkYXRhLT5uYXQtPm11dGV4KTsKLSAgICAgICAgZW52LT5EZWxldGVHbG9iYWxSZWYoZGF0YS0+bmF0LT5vYmplY3QpOwotICAgICAgICBkYXRhLT5uYXQtPm9iamVjdCA9IE5VTEw7Ci0gICAgICAgIGRhdGEtPm5hdC0+dGhyZWFkX2RhdGEgPSBOVUxMOwotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZGF0YS0+bmF0LT5tdXRleCk7Ci0gICAgfQotCi0gICAgZnJlZShkYXRhKTsKLSAgICBpZiAoanZtLT5EZXRhY2hDdXJyZW50VGhyZWFkKCkgIT0gSk5JX09LKSB7Ci0gICAgICAgIExPR0UoIiVzOiBEZXRhY2hDdXJyZW50VGhyZWFkKCkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKLSAgICB9Ci0KLSAgICBMT0dWKCJ3b3JrX3RocmVhZCgpIGRvbmUiKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBhY2NlcHRfd29yayhpbnQgc2lnbmFsX3NrKSB7Ci0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotICAgIGludCBzazsKLSAgICBpbnQgbnNrOwotICAgIGludCBhZGRyX3N6OwotICAgIGludCBtYXhfZmQ7Ci0gICAgZmRfc2V0IGZkczsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfc2NvIGFkZHI7Ci0KLSAgICBzayA9IHNvY2tldChQRl9CTFVFVE9PVEgsIFNPQ0tfU0VRUEFDS0VULCBCVFBST1RPX1NDTyk7Ci0gICAgaWYgKHNrIDwgMCkgewotICAgICAgICBMT0dFKCIlcyBzb2NrZXQoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOwotICAgIGFkZHIuc2NvX2ZhbWlseSA9IEFGX0JMVUVUT09USDsKLSAgICBtZW1jcHkoJmFkZHIuc2NvX2JkYWRkciwgQkRBRERSX0FOWSwgc2l6ZW9mKGJkYWRkcl90KSk7Ci0gICAgaWYgKGJpbmQoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKSB7Ci0gICAgICAgIExPR0UoIiVzIGJpbmQoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGlmIChsaXN0ZW4oc2ssIDEpKSB7Ci0gICAgICAgIExPR0UoIiVzOiBsaXN0ZW4oKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKLSAgICBhZGRyX3N6ID0gc2l6ZW9mKGFkZHIpOwotCi0gICAgRkRfWkVSTygmZmRzKTsKLSAgICBGRF9TRVQoc2ssICZmZHMpOwotICAgIEZEX1NFVChzaWduYWxfc2ssICZmZHMpOwotCi0gICAgbWF4X2ZkID0gKHNrID4gc2lnbmFsX3NrKSA/IHNrIDogc2lnbmFsX3NrOwotICAgIExPR0koIkxpc3RlbmluZyBTQ08gc29ja2V0Li4uIik7Ci0gICAgd2hpbGUgKHNlbGVjdChtYXhfZmQgKyAxLCAmZmRzLCBOVUxMLCBOVUxMLCBOVUxMKSA8IDApIHsKLSAgICAgICAgaWYgKGVycm5vICE9IEVJTlRSKSB7Ci0gICAgICAgICAgICBMT0dFKCIlczogc2VsZWN0KCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HVigiJXM6IHNlbGVjdCgpIEVJTlRSLCByZXRyeWluZyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgfQotICAgIExPR1YoInNlbGVjdCgpIHJldHVybmVkIik7Ci0gICAgaWYgKEZEX0lTU0VUKHNpZ25hbF9zaywgJmZkcykpIHsKLSAgICAgICAgLy8gc2lnbmFsIHRvIGNhbmNlbCBsaXN0ZW5pbmcKLSAgICAgICAgTE9HVigiY2FuY2VsbGVkIGxpc3RlbmluZyBzb2NrZXQsIGNsb3NpbmciKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0gICAgaWYgKCFGRF9JU1NFVChzaywgJmZkcykpIHsKLSAgICAgICAgTE9HRSgiZXJyb3I6IHNlbGVjdCgpIHJldHVybmVkID49IDAgd2l0aCBubyBmZHMgc2V0Iik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgbnNrID0gYWNjZXB0KHNrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZhZGRyX3N6KTsKLSAgICBpZiAobnNrIDwgMCkgewotICAgICAgICBMT0dFKCIlczogYWNjZXB0KCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0gICAgTE9HSSgiQ29ubmVjdGVkIFNDTyBzb2NrZXQgKGluY29taW5nKSIpOwotICAgIGNsb3NlKHNrKTsgIC8vIFRoZSBsaXN0ZW5pbmcgc29ja2V0Ci0KLSAgICByZXR1cm4gbnNrOwotCi1lcnJvcjoKLSAgICBjbG9zZShzayk7Ci0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgY29ubmVjdF93b3JrKGNvbnN0IGNoYXIgKmFkZHJlc3MsIHVpbnQxNl90IHNjb19wa3RfdHlwZSkgewotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfc2NvIGFkZHI7Ci0gICAgaW50IHNrID0gLTE7Ci0KLSAgICBzayA9IHNvY2tldChQRl9CTFVFVE9PVEgsIFNPQ0tfU0VRUEFDS0VULCBCVFBST1RPX1NDTyk7Ci0gICAgaWYgKHNrIDwgMCkgewotICAgICAgICBMT0dFKCIlczogc29ja2V0KCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIEJpbmQgdG8gbG9jYWwgYWRkcmVzcyAqLwotICAgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKLSAgICBhZGRyLnNjb19mYW1pbHkgPSBBRl9CTFVFVE9PVEg7Ci0gICAgbWVtY3B5KCZhZGRyLnNjb19iZGFkZHIsIEJEQUREUl9BTlksIHNpemVvZihiZGFkZHJfdCkpOwotICAgIGlmIChiaW5kKHNrLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpIDwgMCkgewotICAgICAgICBMT0dFKCIlczogYmluZCgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOwotICAgIGFkZHIuc2NvX2ZhbWlseSA9IEFGX0JMVUVUT09USDsKLSAgICBnZXRfYmRhZGRyKGFkZHJlc3MsICZhZGRyLnNjb19iZGFkZHIpOwotICAgIGFkZHIuc2NvX3BrdF90eXBlID0gc2NvX3BrdF90eXBlOwotICAgIExPR0koIkNvbm5lY3RpbmcgdG8gc29ja2V0Iik7Ci0gICAgd2hpbGUgKGNvbm5lY3Qoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKLSAgICAgICAgaWYgKGVycm5vICE9IEVJTlRSKSB7Ci0gICAgICAgICAgICBMT0dFKCIlczogY29ubmVjdCgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0gICAgICAgIExPR1YoIiVzOiBjb25uZWN0KCkgRUlOVFIsIHJldHJ5aW5nIiwgX19GVU5DVElPTl9fKTsKLSAgICB9Ci0gICAgTE9HSSgiU0NPIHNvY2tldCBjb25uZWN0ZWQgKG91dGdvaW5nKSIpOwotCi0gICAgcmV0dXJuIHNrOwotCi1lcnJvcjoKLSAgICBpZiAoc2sgPj0gMCkgY2xvc2Uoc2spOwotICAgIHJldHVybiAtMTsKLX0KLQotc3RhdGljIHZvaWQgd2FpdF9mb3JfY2xvc2UoaW50IHNrLCBpbnQgc2lnbmFsX3NrKSB7Ci0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotICAgIHBvbGxmZCBwWzJdOwotCi0gICAgbWVtc2V0KHAsIDAsIDIgKiBzaXplb2YocG9sbGZkKSk7Ci0gICAgcFswXS5mZCA9IHNrOwotICAgIHBbMV0uZmQgPSBzaWduYWxfc2s7Ci0gICAgcFsxXS5ldmVudHMgPSBQT0xMSU4gfCBQT0xMUFJJOwotCi0gICAgTE9HVigicG9sbC4uLiIpOwotCi0gICAgd2hpbGUgKHBvbGwocCwgMiwgLTEpIDwgMCkgeyAgLy8gYmxvY2tzCi0gICAgICAgIGlmIChlcnJubyAhPSBFSU5UUikgewotICAgICAgICAgICAgTE9HRSgiJXM6IHBvbGwoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HVigiJXM6IHBvbGwoKSBFSU5UUiwgcmV0cnlpbmciLCBfX0ZVTkNUSU9OX18pOwotICAgIH0KLQotICAgIExPR1YoInBvbGwoKSByZXR1cm5lZCIpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9IHsKLSAgICB7ImNsYXNzSW5pdE5hdGl2ZSIsICIoKVYiLCAodm9pZCopY2xhc3NJbml0TmF0aXZlfSwKLSAgICB7ImluaXROYXRpdmUiLCAiKClWIiwgKHZvaWQgKilpbml0TmF0aXZlfSwKLSAgICB7ImRlc3Ryb3lOYXRpdmUiLCAiKClWIiwgKHZvaWQgKilkZXN0cm95TmF0aXZlfSwKLSAgICB7ImNvbm5lY3ROYXRpdmUiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylaIiwgKHZvaWQgKiljb25uZWN0TmF0aXZlfSwKLSAgICB7ImFjY2VwdE5hdGl2ZSIsICIoKVoiLCAodm9pZCAqKWFjY2VwdE5hdGl2ZX0sCi0gICAgeyJjbG9zZU5hdGl2ZSIsICIoKVYiLCAodm9pZCAqKWNsb3NlTmF0aXZlfSwKLX07Ci0KLWludCByZWdpc3Rlcl9hbmRyb2lkX2JsdWV0b290aF9TY29Tb2NrZXQoSk5JRW52ICplbnYpIHsKLSAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsCi0gICAgICAgICAgICAiYW5kcm9pZC9ibHVldG9vdGgvU2NvU29ja2V0Iiwgc01ldGhvZHMsIE5FTEVNKHNNZXRob2RzKSk7Ci19Ci0KLX0gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9jb21tb24uY3BwCmluZGV4IDQzYzNhOTUuLmFhZTBmMjEgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmNwcApAQCAtNjksNiArNjksMTYgQEAKICAgICB7IlVVSURzIiwgREJVU19UWVBFX0FSUkFZfSwKIH07CiAKK3N0YXRpYyBQcm9wZXJ0aWVzIGlucHV0X3Byb3BlcnRpZXNbXSA9IHsKKyAgICB7IkNvbm5lY3RlZCIsIERCVVNfVFlQRV9CT09MRUFOfSwKK307CisKK3N0YXRpYyBQcm9wZXJ0aWVzIHBhbl9wcm9wZXJ0aWVzW10gPSB7CisgICAgeyJDb25uZWN0ZWQiLCBEQlVTX1RZUEVfQk9PTEVBTn0sCisgICAgeyJJbnRlcmZhY2UiLCBEQlVTX1RZUEVfU1RSSU5HfSwKKyAgICB7IlVVSUQiLCBEQlVTX1RZUEVfU1RSSU5HfSwKK307CisKIHR5cGVkZWYgdW5pb24gewogICAgIGNoYXIgKnN0cl92YWw7CiAgICAgaW50IGludF92YWw7CkBAIC0xODcsNiArMTk3LDcgQEAKICAgICBkYnVzX2Jvb2xfdCByZXQ7CiAgICAgdmFfbGlzdCBsc3Q7CiAgICAgdmFfc3RhcnQobHN0LCBmaXJzdF9hcmdfdHlwZSk7CisKICAgICByZXQgPSBkYnVzX2Z1bmNfYXJnc19hc3luY192YWxpc3QoZW52LCBjb25uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseSwgdXNlciwgbmF0LApAQCAtNjk5LDYgKzcxMCwxNiBAQAogICAgICAgICAgICAgICAgICAgICBzaXplb2YocmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzKSAvIHNpemVvZihQcm9wZXJ0aWVzKSk7CiB9CiAKK2pvYmplY3RBcnJheSBwYXJzZV9pbnB1dF9wcm9wZXJ0eV9jaGFuZ2UoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlICptc2cpIHsKKyAgICByZXR1cm4gcGFyc2VfcHJvcGVydHlfY2hhbmdlKGVudiwgbXNnLCAoUHJvcGVydGllcyAqKSAmaW5wdXRfcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGlucHV0X3Byb3BlcnRpZXMpIC8gc2l6ZW9mKFByb3BlcnRpZXMpKTsKK30KKworam9iamVjdEFycmF5IHBhcnNlX3Bhbl9wcm9wZXJ0eV9jaGFuZ2UoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlICptc2cpIHsKKyAgICByZXR1cm4gcGFyc2VfcHJvcGVydHlfY2hhbmdlKGVudiwgbXNnLCAoUHJvcGVydGllcyAqKSAmcGFuX3Byb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihwYW5fcHJvcGVydGllcykgLyBzaXplb2YoUHJvcGVydGllcykpOworfQorCiBqb2JqZWN0QXJyYXkgcGFyc2VfYWRhcHRlcl9wcm9wZXJ0aWVzKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpIHsKICAgICByZXR1cm4gcGFyc2VfcHJvcGVydGllcyhlbnYsIGl0ZXIsIChQcm9wZXJ0aWVzICopICZhZGFwdGVyX3Byb3BlcnRpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFkYXB0ZXJfcHJvcGVydGllcykgLyBzaXplb2YoUHJvcGVydGllcykpOwpAQCAtNzA5LDYgKzczMCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzKSAvIHNpemVvZihQcm9wZXJ0aWVzKSk7CiB9CiAKK2pvYmplY3RBcnJheSBwYXJzZV9pbnB1dF9wcm9wZXJ0aWVzKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpIHsKKyAgICByZXR1cm4gcGFyc2VfcHJvcGVydGllcyhlbnYsIGl0ZXIsIChQcm9wZXJ0aWVzICopICZpbnB1dF9wcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW5wdXRfcHJvcGVydGllcykgLyBzaXplb2YoUHJvcGVydGllcykpOworfQorCiBpbnQgZ2V0X2JkYWRkcihjb25zdCBjaGFyICpzdHIsIGJkYWRkcl90ICpiYSkgewogICAgIGNoYXIgKmQgPSAoKGNoYXIgKiliYSkgKyA1LCAqZW5kcDsKICAgICBpbnQgaTsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5oIGIvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmgKaW5kZXggMzc4YmI2Zi4uOTIyMmUxYSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmgKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmgKQEAgLTE2Miw2ICsxNjIsOSBAQAogam9iamVjdEFycmF5IHBhcnNlX3JlbW90ZV9kZXZpY2VfcHJvcGVydGllcyhKTklFbnYgKmVudiwgREJ1c01lc3NhZ2VJdGVyICppdGVyKTsKIGpvYmplY3RBcnJheSBwYXJzZV9yZW1vdGVfZGV2aWNlX3Byb3BlcnR5X2NoYW5nZShKTklFbnYgKmVudiwgREJ1c01lc3NhZ2UgKm1zZyk7CiBqb2JqZWN0QXJyYXkgcGFyc2VfYWRhcHRlcl9wcm9wZXJ0eV9jaGFuZ2UoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlICptc2cpOworam9iamVjdEFycmF5IHBhcnNlX2lucHV0X3Byb3BlcnRpZXMoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlSXRlciAqaXRlcik7Citqb2JqZWN0QXJyYXkgcGFyc2VfaW5wdXRfcHJvcGVydHlfY2hhbmdlKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZSAqbXNnKTsKK2pvYmplY3RBcnJheSBwYXJzZV9wYW5fcHJvcGVydHlfY2hhbmdlKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZSAqbXNnKTsKIHZvaWQgYXBwZW5kX3ZhcmlhbnQoREJ1c01lc3NhZ2VJdGVyICppdGVyLCBpbnQgdHlwZSwgdm9pZCAqdmFsKTsKIGludCBnZXRfYmRhZGRyKGNvbnN0IGNoYXIgKnN0ciwgYmRhZGRyX3QgKmJhKTsKIHZvaWQgZ2V0X2JkYWRkcl9hc19zdHJpbmcoY29uc3QgYmRhZGRyX3QgKmJhLCBjaGFyICpzdHIpOwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3cuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3cuY3BwCmluZGV4IDkxNDQ5YmMuLjA0MGRhYzMgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfQ3Vyc29yV2luZG93LmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX0N1cnNvcldpbmRvdy5jcHAKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgIkN1cnNvcldpbmRvdy5oIgorI2luY2x1ZGUgImJpbmRlci9DdXJzb3JXaW5kb3cuaCIKICNpbmNsdWRlICJzcWxpdGUzX2V4Y2VwdGlvbi5oIgogI2luY2x1ZGUgImFuZHJvaWRfdXRpbF9CaW5kZXIuaCIKIApAQCAtMjI1LDcwICsyMjUsNiBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgamJvb2xlYW4gaXNCbG9iX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKLXsKLSAgICBpbnQzMl90IGVycjsKLSAgICBDdXJzb3JXaW5kb3cgKiB3aW5kb3cgPSBHRVRfV0lORE9XKGVudiwgb2JqZWN0KTsKLUxPR19XSU5ET1coIkNoZWNraW5nIGlmIGNvbHVtbiBpcyBhIGJsb2Igb3IgbnVsbCBmb3IgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOwotCi0gICAgZmllbGRfc2xvdF90IGZpZWxkOwotICAgIGVyciA9IHdpbmRvdy0+cmVhZF9maWVsZF9zbG90KHJvdywgY29sdW1uLCAmZmllbGQpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICB0aHJvd0V4Y2VwdGlvbldpdGhSb3dDb2woZW52LCByb3csIGNvbHVtbik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBmaWVsZC50eXBlID09IEZJRUxEX1RZUEVfQkxPQiB8fCBmaWVsZC50eXBlID09IEZJRUxEX1RZUEVfTlVMTDsKLX0KLQotc3RhdGljIGpib29sZWFuIGlzU3RyaW5nX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKLXsKLSAgICBpbnQzMl90IGVycjsKLSAgICBDdXJzb3JXaW5kb3cgKiB3aW5kb3cgPSBHRVRfV0lORE9XKGVudiwgb2JqZWN0KTsKLUxPR19XSU5ET1coIkNoZWNraW5nIGlmIGNvbHVtbiBpcyBhIHN0cmluZyBvciBudWxsIGZvciAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7Ci0KLSAgICBmaWVsZF9zbG90X3QgZmllbGQ7Ci0gICAgZXJyID0gd2luZG93LT5yZWFkX2ZpZWxkX3Nsb3Qocm93LCBjb2x1bW4sICZmaWVsZCk7Ci0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIHRocm93RXhjZXB0aW9uV2l0aFJvd0NvbChlbnYsIHJvdywgY29sdW1uKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpZWxkLnR5cGUgPT0gRklFTERfVFlQRV9TVFJJTkcgfHwgZmllbGQudHlwZSA9PSBGSUVMRF9UWVBFX05VTEw7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiBpc0ludGVnZXJfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQotewotICAgIGludDMyX3QgZXJyOwotICAgIEN1cnNvcldpbmRvdyAqIHdpbmRvdyA9IEdFVF9XSU5ET1coZW52LCBvYmplY3QpOwotTE9HX1dJTkRPVygiQ2hlY2tpbmcgaWYgY29sdW1uIGlzIGFuIGludGVnZXIgZm9yICVkLCVkIGZyb20gJXAiLCByb3csIGNvbHVtbiwgd2luZG93KTsKLQotICAgIGZpZWxkX3Nsb3RfdCBmaWVsZDsKLSAgICBlcnIgPSB3aW5kb3ctPnJlYWRfZmllbGRfc2xvdChyb3csIGNvbHVtbiwgJmZpZWxkKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgdGhyb3dFeGNlcHRpb25XaXRoUm93Q29sKGVudiwgcm93LCBjb2x1bW4pOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmllbGQudHlwZSA9PSBGSUVMRF9UWVBFX0lOVEVHRVI7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiBpc0Zsb2F0X25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKLXsKLSAgICBpbnQzMl90IGVycjsKLSAgICBDdXJzb3JXaW5kb3cgKiB3aW5kb3cgPSBHRVRfV0lORE9XKGVudiwgb2JqZWN0KTsKLUxPR19XSU5ET1coIkNoZWNraW5nIGlmIGNvbHVtbiBpcyBhIGZsb2F0IGZvciAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7Ci0KLSAgICBmaWVsZF9zbG90X3QgZmllbGQ7Ci0gICAgZXJyID0gd2luZG93LT5yZWFkX2ZpZWxkX3Nsb3Qocm93LCBjb2x1bW4sICZmaWVsZCk7Ci0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIHRocm93RXhjZXB0aW9uV2l0aFJvd0NvbChlbnYsIHJvdywgY29sdW1uKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpZWxkLnR5cGUgPT0gRklFTERfVFlQRV9GTE9BVDsKLX0KLQogc3RhdGljIGpzdHJpbmcgZ2V0U3RyaW5nX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgcm93LCBqaW50IGNvbHVtbikKIHsKICAgICBpbnQzMl90IGVycjsKQEAgLTQ4NywxMCArNDIzLDkgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBqYm9vbGVhbiBpc051bGxfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQorYm9vbCBpc051bGxfbmF0aXZlKEN1cnNvcldpbmRvdyAqd2luZG93LCBqaW50IHJvdywgamludCBjb2x1bW4pCiB7Ci0gICAgQ3Vyc29yV2luZG93ICogd2luZG93ID0gR0VUX1dJTkRPVyhlbnYsIG9iamVjdCk7Ci1MT0dfV0lORE9XKCJDaGVja2luZyBmb3IgTlVMTCBhdCAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7CisgICAgTE9HX1dJTkRPVygiQ2hlY2tpbmcgZm9yIE5VTEwgYXQgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOwogCiAgICAgYm9vbCBpc051bGw7CiAgICAgaWYgKHdpbmRvdy0+Z2V0TnVsbChyb3csIGNvbHVtbiwgJmlzTnVsbCkpIHsKQEAgLTY1Miw2ICs1ODcsMjYgQEAKICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7CiB9CiAKK3N0YXRpYyBqaW50IGdldFR5cGVfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQoreworICAgIGludDMyX3QgZXJyOworICAgIEN1cnNvcldpbmRvdyAqIHdpbmRvdyA9IEdFVF9XSU5ET1coZW52LCBvYmplY3QpOworICAgIExPR19XSU5ET1coInJldHVybmluZyBjb2x1bW4gdHlwZSBhZmZpbml0eSBmb3IgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOworCisgICAgaWYgKGlzTnVsbF9uYXRpdmUod2luZG93LCByb3csIGNvbHVtbikpIHsKKyAgICAgIHJldHVybiBGSUVMRF9UWVBFX05VTEw7CisgICAgfQorCisgICAgZmllbGRfc2xvdF90IGZpZWxkOworICAgIGVyciA9IHdpbmRvdy0+cmVhZF9maWVsZF9zbG90KHJvdywgY29sdW1uLCAmZmllbGQpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICB0aHJvd0V4Y2VwdGlvbldpdGhSb3dDb2woZW52LCByb3csIGNvbHVtbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBmaWVsZC50eXBlOworfQorCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPQogewogICAgICAvKiBuYW1lLCBzaWduYXR1cmUsIGZ1bmNQdHIgKi8KQEAgLTY2MiwxMSArNjE3LDkgQEAKICAgICB7ImNsb3NlX25hdGl2ZSIsICIoKVYiLCAodm9pZCAqKW5hdGl2ZV9jbG9zZX0sCiAgICAgeyJnZXRMb25nX25hdGl2ZSIsICIoSUkpSiIsICh2b2lkICopZ2V0TG9uZ19uYXRpdmV9LAogICAgIHsiZ2V0QmxvYl9uYXRpdmUiLCAiKElJKVtCIiwgKHZvaWQgKilnZXRCbG9iX25hdGl2ZX0sCi0gICAgeyJpc0Jsb2JfbmF0aXZlIiwgIihJSSlaIiwgKHZvaWQgKilpc0Jsb2JfbmF0aXZlfSwKICAgICB7ImdldFN0cmluZ19uYXRpdmUiLCAiKElJKUxqYXZhL2xhbmcvU3RyaW5nOyIsICh2b2lkICopZ2V0U3RyaW5nX25hdGl2ZX0sCiAgICAgeyJjb3B5U3RyaW5nVG9CdWZmZXJfbmF0aXZlIiwgIihJSUlMYW5kcm9pZC9kYXRhYmFzZS9DaGFyQXJyYXlCdWZmZXI7KVtDIiwgKHZvaWQgKiljb3B5U3RyaW5nVG9CdWZmZXJfbmF0aXZlfSwKICAgICB7ImdldERvdWJsZV9uYXRpdmUiLCAiKElJKUQiLCAodm9pZCAqKWdldERvdWJsZV9uYXRpdmV9LAotICAgIHsiaXNOdWxsX25hdGl2ZSIsICIoSUkpWiIsICh2b2lkICopaXNOdWxsX25hdGl2ZX0sCiAgICAgeyJnZXROdW1Sb3dzX25hdGl2ZSIsICIoKUkiLCAodm9pZCAqKWdldE51bVJvd3N9LAogICAgIHsic2V0TnVtQ29sdW1uc19uYXRpdmUiLCAiKEkpWiIsICh2b2lkICopc2V0TnVtQ29sdW1uc30sCiAgICAgeyJhbGxvY1Jvd19uYXRpdmUiLCAiKClaIiwgKHZvaWQgKilhbGxvY1Jvd30sCkBAIC02NzYsOSArNjI5LDcgQEAKICAgICB7InB1dERvdWJsZV9uYXRpdmUiLCAiKERJSSlaIiwgKHZvaWQgKilwdXREb3VibGVfbmF0aXZlfSwKICAgICB7ImZyZWVMYXN0Um93X25hdGl2ZSIsICIoKVYiLCAodm9pZCAqKWZyZWVMYXN0Um93fSwKICAgICB7InB1dE51bGxfbmF0aXZlIiwgIihJSSlaIiwgKHZvaWQgKilwdXROdWxsX25hdGl2ZX0sCi0gICAgeyJpc1N0cmluZ19uYXRpdmUiLCAiKElJKVoiLCAodm9pZCAqKWlzU3RyaW5nX25hdGl2ZX0sCi0gICAgeyJpc0Zsb2F0X25hdGl2ZSIsICIoSUkpWiIsICh2b2lkICopaXNGbG9hdF9uYXRpdmV9LAotICAgIHsiaXNJbnRlZ2VyX25hdGl2ZSIsICIoSUkpWiIsICh2b2lkICopaXNJbnRlZ2VyX25hdGl2ZX0sCisgICAgeyJnZXRUeXBlX25hdGl2ZSIsICIoSUkpSSIsICh2b2lkICopZ2V0VHlwZV9uYXRpdmV9LAogfTsKIAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGF0YWJhc2VfQ3Vyc29yV2luZG93KEpOSUVudiAqIGVudikKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlQ29tcGlsZWRTcWwuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVDb21waWxlZFNxbC5jcHAKaW5kZXggOGQxYzM5ZS4uZGU0YzVjOCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVDb21waWxlZFNxbC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVDb21waWxlZFNxbC5jcHAKQEAgLTkxLDIyICs5MSwxMSBAQAogICAgIGNvbXBpbGUoZW52LCBvYmplY3QsIEdFVF9IQU5ETEUoZW52LCBvYmplY3QpLCBzcWxTdHJpbmcpOwogfQogCi1zdGF0aWMgdm9pZCBuYXRpdmVfZmluYWxpemUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQotewotICAgIGludCBlcnI7Ci0gICAgc3FsaXRlM19zdG10ICogc3RhdGVtZW50ID0gR0VUX1NUQVRFTUVOVChlbnYsIG9iamVjdCk7Ci0KLSAgICBpZiAoc3RhdGVtZW50ICE9IE5VTEwpIHsKLSAgICAgICAgc3FsaXRlM19maW5hbGl6ZShzdGF0ZW1lbnQpOwotICAgICAgICBlbnYtPlNldEludEZpZWxkKG9iamVjdCwgZ1N0YXRlbWVudEZpZWxkLCAwKTsKLSAgICB9Ci19CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9CiB7CiAgICAgIC8qIG5hbWUsIHNpZ25hdHVyZSwgZnVuY1B0ciAqLwogICAgIHsibmF0aXZlX2NvbXBpbGUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwgKHZvaWQgKiluYXRpdmVfY29tcGlsZX0sCi0gICAgeyJuYXRpdmVfZmluYWxpemUiLCAiKClWIiwgKHZvaWQgKiluYXRpdmVfZmluYWxpemV9LAogfTsKIAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlQ29tcGlsZWRTcWwoSk5JRW52ICogZW52KQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZURhdGFiYXNlLmNwcAppbmRleCAzNjIzNGE5Li4xYjY4YmE5IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZURhdGFiYXNlLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZURhdGFiYXNlLmNwcApAQCAtMTUsNyArMTUsNyBAQAogICovCiAKICN1bmRlZiBMT0dfVEFHCi0jZGVmaW5lIExPR19UQUcgIkRhdGFiYXNlIgorI2RlZmluZSBMT0dfVEFHICJTcWxpdGVEYXRhYmFzZUNwcCIKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KQEAgLTUxLDYgKzUxLDggQEAKIC8qIHVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGZvcmNlLWVuYWJsZSBsb2dnaW5nIG9mIGFsbCBzdGF0ZW1lbnRzICovCiAvLyAjZGVmaW5lIERCX0xPR19TVEFURU1FTlRTCiAKKyNkZWZpbmUgREVCVUdfSk5JIDAKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBlbnVtIHsKQEAgLTYyLDkgKzY0LDExIEBACiB9OwogCiBzdGF0aWMgamZpZWxkSUQgb2Zmc2V0X2RiX2hhbmRsZTsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2N1c3RvbV9mdW5jdGlvbl9jYWxsYmFjazsKK3N0YXRpYyBqY2xhc3Mgc3RyaW5nX2NsYXNzID0gTlVMTDsKIAotc3RhdGljIGNoYXIgKmNyZWF0ZVN0cihjb25zdCBjaGFyICpwYXRoKSB7Ci0gICAgaW50IGxlbiA9IHN0cmxlbihwYXRoKTsKK3N0YXRpYyBjaGFyICpjcmVhdGVTdHIoY29uc3QgY2hhciAqcGF0aCwgc2hvcnQgZXh0cmEpIHsKKyAgICBpbnQgbGVuID0gc3RybGVuKHBhdGgpICsgZXh0cmE7CiAgICAgY2hhciAqc3RyID0gKGNoYXIgKiltYWxsb2MobGVuICsgMSk7CiAgICAgc3RybmNweShzdHIsIHBhdGgsIGxlbik7CiAgICAgc3RyW2xlbl0gPSBOVUxMOwpAQCAtNzMsNyArNzcsNyBAQAogCiBzdGF0aWMgdm9pZCBzcWxMb2dnZXIodm9pZCAqZGF0YWJhc2VOYW1lLCBpbnQgaUVyckNvZGUsIGNvbnN0IGNoYXIgKnpNc2cpIHsKICAgICAvLyBza2lwIHByaW50aW5nIHRoaXMgbWVzc2FnZSBpZiBpdCBpcyBkdWUgdG8gY2VydGFpbiB0eXBlcyBvZiBlcnJvcnMKLSAgICBpZiAoaUVyckNvZGUgPT0gU1FMSVRFX0NPTlNUUkFJTlQpIHJldHVybjsKKyAgICBpZiAoaUVyckNvZGUgPT0gMCB8fCBpRXJyQ29kZSA9PSBTUUxJVEVfQ09OU1RSQUlOVCkgcmV0dXJuOwogICAgIExPR0koInNxbGl0ZSByZXR1cm5lZDogZXJyb3IgY29kZSA9ICVkLCBtc2cgPSAlc1xuIiwgaUVyckNvZGUsIHpNc2cpOwogfQogCkBAIC04NSw5ICs4OSw5IEBACiAgICAgfQogCiAgICAgTE9HVigiUmVnaXN0ZXJpbmcgc3FsaXRlIGxvZ2dpbmcgZnVuYyBcbiIpOwotICAgIGludCBlcnIgPSBzcWxpdGUzX2NvbmZpZyhTUUxJVEVfQ09ORklHX0xPRywgJnNxbExvZ2dlciwgKHZvaWQgKiljcmVhdGVTdHIocGF0aCkpOworICAgIGludCBlcnIgPSBzcWxpdGUzX2NvbmZpZyhTUUxJVEVfQ09ORklHX0xPRywgJnNxbExvZ2dlciwgKHZvaWQgKiljcmVhdGVTdHIocGF0aCwgMCkpOwogICAgIGlmIChlcnIgIT0gU1FMSVRFX09LKSB7Ci0gICAgICAgIExPR0UoInNxbGl0ZV9jb25maWcgZmFpbGVkIGVycm9yX2NvZGUgPSAlZC4gVEhJUyBTSE9VTEQgTkVWRVIgb2NjdXIuXG4iLCBlcnIpOworICAgICAgICBMT0dXKCJzcWxpdGUgcmV0dXJuZWQgZXJyb3IgPSAlZCB3aGVuIHRyeWluZyB0byByZWdpc3RlciBsb2dnaW5nIGZ1bmMuXG4iLCBlcnIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGxvZ2dpbmdGdW5jU2V0ID0gdHJ1ZTsKQEAgLTE3NiwxMyArMTgwLDE3IEBACiAgICAgaWYgKGhhbmRsZSAhPSBOVUxMKSBzcWxpdGUzX2Nsb3NlKGhhbmRsZSk7CiB9CiAKLXN0YXRpYyBjaGFyICpnZXREYXRhYmFzZU5hbWUoSk5JRW52KiBlbnYsIHNxbGl0ZTMgKiBoYW5kbGUsIGpzdHJpbmcgZGF0YWJhc2VOYW1lKSB7CitzdGF0aWMgY2hhciAqZ2V0RGF0YWJhc2VOYW1lKEpOSUVudiogZW52LCBzcWxpdGUzICogaGFuZGxlLCBqc3RyaW5nIGRhdGFiYXNlTmFtZSwgc2hvcnQgY29ubk51bSkgewogICAgIGNoYXIgY29uc3QgKnBhdGggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGRhdGFiYXNlTmFtZSwgTlVMTCk7CiAgICAgaWYgKHBhdGggPT0gTlVMTCkgewogICAgICAgICBMT0dFKCJGYWlsdXJlIGluIGdldERhdGFiYXNlTmFtZSgpLiBWTSByYW4gb3V0IG9mIG1lbW9yeT9cbiIpOwogICAgICAgICByZXR1cm4gTlVMTDsgLy8gVk0gd291bGQgaGF2ZSB0aHJvd24gT3V0T2ZNZW1vcnlFcnJvcgogICAgIH0KLSAgICBjaGFyICpkYk5hbWVTdHIgPSBjcmVhdGVTdHIocGF0aCk7CisgICAgY2hhciAqZGJOYW1lU3RyID0gY3JlYXRlU3RyKHBhdGgsIDQpOworICAgIGlmIChjb25uTnVtID4gOTk5KSB7IC8vIFRPRE86IGlmIG51bWJlciBvZiBwb29sZWQgY29ubmVjdGlvbnMgPiA5OTksIGZpeCB0aGlzIGxpbmUuCisgICAgICBjb25uTnVtID0gLTE7CisgICAgfQorICAgIHNwcmludGYoZGJOYW1lU3RyICsgc3RybGVuKHBhdGgpLCAifCUwM2QiLCBjb25uTnVtKTsKICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhkYXRhYmFzZU5hbWUsIHBhdGgpOwogICAgIHJldHVybiBkYk5hbWVTdHI7CiB9CkBAIC0xOTIsMTAgKzIwMCwxMCBAQAogfQogCiAvKiBwdWJsaWMgbmF0aXZlIHZvaWQgZW5hYmxlU3FsVHJhY2luZygpOyAqLwotc3RhdGljIHZvaWQgZW5hYmxlU3FsVHJhY2luZyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgZGF0YWJhc2VOYW1lKQorc3RhdGljIHZvaWQgZW5hYmxlU3FsVHJhY2luZyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgZGF0YWJhc2VOYW1lLCBqc2hvcnQgY29ublR5cGUpCiB7CiAgICAgc3FsaXRlMyAqIGhhbmRsZSA9IChzcWxpdGUzICopZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIG9mZnNldF9kYl9oYW5kbGUpOwotICAgIHNxbGl0ZTNfdHJhY2UoaGFuZGxlLCAmc3FsVHJhY2UsICh2b2lkICopZ2V0RGF0YWJhc2VOYW1lKGVudiwgaGFuZGxlLCBkYXRhYmFzZU5hbWUpKTsKKyAgICBzcWxpdGUzX3RyYWNlKGhhbmRsZSwgJnNxbFRyYWNlLCAodm9pZCAqKWdldERhdGFiYXNlTmFtZShlbnYsIGhhbmRsZSwgZGF0YWJhc2VOYW1lLCBjb25uVHlwZSkpOwogfQogCiBzdGF0aWMgdm9pZCBzcWxQcm9maWxlKHZvaWQgKmRhdGFiYXNlTmFtZSwgY29uc3QgY2hhciAqc3FsLCBzcWxpdGUzX3VpbnQ2NCB0bSkgewpAQCAtMjA0LDEzICsyMTIsMTMgQEAKIH0KIAogLyogcHVibGljIG5hdGl2ZSB2b2lkIGVuYWJsZVNxbFByb2ZpbGluZygpOyAqLwotc3RhdGljIHZvaWQgZW5hYmxlU3FsUHJvZmlsaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwganN0cmluZyBkYXRhYmFzZU5hbWUpCitzdGF0aWMgdm9pZCBlbmFibGVTcWxQcm9maWxpbmcoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIGRhdGFiYXNlTmFtZSwganNob3J0IGNvbm5UeXBlKQogewogICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKLSAgICBzcWxpdGUzX3Byb2ZpbGUoaGFuZGxlLCAmc3FsUHJvZmlsZSwgKHZvaWQgKilnZXREYXRhYmFzZU5hbWUoZW52LCBoYW5kbGUsIGRhdGFiYXNlTmFtZSkpOworICAgIHNxbGl0ZTNfcHJvZmlsZShoYW5kbGUsICZzcWxQcm9maWxlLCAodm9pZCAqKWdldERhdGFiYXNlTmFtZShlbnYsIGhhbmRsZSwgZGF0YWJhc2VOYW1lLAorICAgICAgICAgICAgY29ublR5cGUpKTsKIH0KIAotCiAvKiBwdWJsaWMgbmF0aXZlIHZvaWQgY2xvc2UoKTsgKi8KIHN0YXRpYyB2b2lkIGRiY2xvc2UoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQogewpAQCAtMjQwLDczICsyNDgsNiBAQAogICAgIH0KIH0KIAotLyogcHVibGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9leGVjU1FMKFN0cmluZyBzcWwpOyAqLwotc3RhdGljIHZvaWQgbmF0aXZlX2V4ZWNTUUwoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIHNxbFN0cmluZykKLXsKLSAgICBpbnQgZXJyOwotICAgIGludCBzdGVwRXJyOwotICAgIHNxbGl0ZTNfc3RtdCAqIHN0YXRlbWVudCA9IE5VTEw7Ci0gICAgc3FsaXRlMyAqIGhhbmRsZSA9IChzcWxpdGUzICopZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIG9mZnNldF9kYl9oYW5kbGUpOwotICAgIGpjaGFyIGNvbnN0ICogc3FsID0gZW52LT5HZXRTdHJpbmdDaGFycyhzcWxTdHJpbmcsIE5VTEwpOwotICAgIGpzaXplIHNxbExlbiA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHNxbFN0cmluZyk7Ci0KLSAgICBpZiAoc3FsID09IE5VTEwgfHwgc3FsTGVuID09IDApIHsKLSAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsICJZb3UgbXVzdCBzdXBwbHkgYW4gU1FMIHN0cmluZyIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZXJyID0gc3FsaXRlM19wcmVwYXJlMTZfdjIoaGFuZGxlLCBzcWwsIHNxbExlbiAqIDIsICZzdGF0ZW1lbnQsIE5VTEwpOwotCi0gICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnMoc3FsU3RyaW5nLCBzcWwpOwotCi0gICAgaWYgKGVyciAhPSBTUUxJVEVfT0spIHsKLSAgICAgICAgY2hhciBjb25zdCAqIHNxbDggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHNxbFN0cmluZywgTlVMTCk7Ci0gICAgICAgIExPR0UoIkZhaWx1cmUgJWQgKCVzKSBvbiAlcCB3aGVuIHByZXBhcmluZyAnJXMnLlxuIiwgZXJyLCBzcWxpdGUzX2Vycm1zZyhoYW5kbGUpLCBoYW5kbGUsIHNxbDgpOwotICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsIGhhbmRsZSwgc3FsOCk7Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNxbFN0cmluZywgc3FsOCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdGVwRXJyID0gc3FsaXRlM19zdGVwKHN0YXRlbWVudCk7Ci0gICAgZXJyID0gc3FsaXRlM19maW5hbGl6ZShzdGF0ZW1lbnQpOwotCi0gICAgaWYgKHN0ZXBFcnIgIT0gU1FMSVRFX0RPTkUpIHsKLSAgICAgICAgaWYgKHN0ZXBFcnIgPT0gU1FMSVRFX1JPVykgewotICAgICAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb24oZW52LCAiUXVlcmllcyBjYW5ub3QgYmUgcGVyZm9ybWVkIHVzaW5nIGV4ZWNTUUwoKSwgdXNlIHF1ZXJ5KCkgaW5zdGVhZC4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNoYXIgY29uc3QgKiBzcWw4ID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzcWxTdHJpbmcsIE5VTEwpOwotICAgICAgICAgICAgTE9HRSgiRmFpbHVyZSAlZCAoJXMpIG9uICVwIHdoZW4gZXhlY3V0aW5nICclcydcbiIsIGVyciwgc3FsaXRlM19lcnJtc2coaGFuZGxlKSwgaGFuZGxlLCBzcWw4KTsKLSAgICAgICAgICAgIHRocm93X3NxbGl0ZTNfZXhjZXB0aW9uKGVudiwgaGFuZGxlLCBzcWw4KTsKLSAgICAgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNxbFN0cmluZywgc3FsOCk7Ci0KLSAgICAgICAgfQotICAgIH0gZWxzZQotI2lmbmRlZiBEQl9MT0dfU1RBVEVNRU5UUwotICAgIElGX0xPR1YoKQotI2VuZGlmCi0gICAgewotICAgICAgICBjaGFyIGNvbnN0ICogc3FsOCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc3FsU3RyaW5nLCBOVUxMKTsKLSAgICAgICAgTE9HVigiU3VjY2VzcyBvbiAlcCB3aGVuIGV4ZWN1dGluZyAnJXMnXG4iLCBoYW5kbGUsIHNxbDgpOwotICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhzcWxTdHJpbmcsIHNxbDgpOwotICAgIH0KLX0KLQotLyogbmF0aXZlIGxvbmcgbGFzdEluc2VydFJvdygpOyAqLwotc3RhdGljIGpsb25nIGxhc3RJbnNlcnRSb3coSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQotewotICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKLQotICAgIHJldHVybiBzcWxpdGUzX2xhc3RfaW5zZXJ0X3Jvd2lkKGhhbmRsZSk7Ci19Ci0KLS8qIG5hdGl2ZSBpbnQgbGFzdENoYW5nZUNvdW50KCk7ICovCi1zdGF0aWMgamludCBsYXN0Q2hhbmdlQ291bnQoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQotewotICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKLQotICAgIHJldHVybiBzcWxpdGUzX2NoYW5nZXMoaGFuZGxlKTsKLX0KLQogLyogbmF0aXZlIGludCBuYXRpdmVfZ2V0RGJMb29rYXNpZGUoKTsgKi8KIHN0YXRpYyBqaW50IG5hdGl2ZV9nZXREYkxvb2thc2lkZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCiB7CkBAIC00NDMsMTkgKzM4NCw5MyBAQAogICAgIHJldHVybiBzcWxpdGUzX3JlbGVhc2VfbWVtb3J5KFNRTElURV9TT0ZUX0hFQVBfTElNSVQpOwogfQogCitzdGF0aWMgdm9pZCBuYXRpdmVfZmluYWxpemUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHN0YXRlbWVudElkKQoreworICAgIGlmIChzdGF0ZW1lbnRJZCA+IDApIHsKKyAgICAgICAgc3FsaXRlM19maW5hbGl6ZSgoc3FsaXRlM19zdG10ICopc3RhdGVtZW50SWQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY3VzdG9tX2Z1bmN0aW9uX2NhbGxiYWNrKHNxbGl0ZTNfY29udGV4dCAqIGNvbnRleHQsIGludCBhcmdjLCBzcWxpdGUzX3ZhbHVlICoqIGFyZ3YpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBpZiAoIWVudikgeworICAgICAgICBMT0dFKCJjdXN0b21fZnVuY3Rpb25fY2FsbGJhY2sgY2Fubm90IGNhbGwgaW50byBKYXZhIG9uIHRoaXMgdGhyZWFkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gZ2V0IGdsb2JhbCByZWYgdG8gQ3VzdG9tRnVuY3Rpb24gb2JqZWN0IGZyb20gb3VyIHVzZXIgZGF0YQorICAgIGpvYmplY3QgZnVuY3Rpb24gPSAoam9iamVjdClzcWxpdGUzX3VzZXJfZGF0YShjb250ZXh0KTsKKworICAgIC8vIHBhY2sgdXAgdGhlIGFyZ3VtZW50cyBpbnRvIGEgc3RyaW5nIGFycmF5CisgICAgaWYgKCFzdHJpbmdfY2xhc3MpCisgICAgICAgIHN0cmluZ19jbGFzcyA9IChqY2xhc3MpZW52LT5OZXdHbG9iYWxSZWYoZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9TdHJpbmciKSk7CisgICAgam9iamVjdEFycmF5IHN0ckFycmF5ID0gZW52LT5OZXdPYmplY3RBcnJheShhcmdjLCBzdHJpbmdfY2xhc3MsIE5VTEwpOworICAgIGlmICghc3RyQXJyYXkpCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICBjaGFyKiBhcmcgPSAoY2hhciAqKXNxbGl0ZTNfdmFsdWVfdGV4dChhcmd2W2ldKTsKKyAgICAgICAgaWYgKCFhcmcpIHsKKyAgICAgICAgICAgIExPR0UoIk5VTEwgYXJndW1lbnQgaW4gY3VzdG9tX2Z1bmN0aW9uX2NhbGxiYWNrLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbi4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBqb2JqZWN0IG9iaiA9IGVudi0+TmV3U3RyaW5nVVRGKGFyZyk7CisgICAgICAgIGlmICghb2JqKQorICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChzdHJBcnJheSwgaSwgb2JqKTsKKyAgICAgICAgZW52LT5EZWxldGVMb2NhbFJlZihvYmopOworICAgIH0KKworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoZnVuY3Rpb24sIG1ldGhvZF9jdXN0b21fZnVuY3Rpb25fY2FsbGJhY2ssIHN0ckFycmF5KTsKKworZG9uZToKKyAgICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CisgICAgICAgIExPR0UoIkFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGJ5IGN1c3RvbSBzcWxpdGUzIGZ1bmN0aW9uLiIpOworICAgICAgICBMT0dFX0VYKGVudik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBqaW50IG5hdGl2ZV9hZGRDdXN0b21GdW5jdGlvbihKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsCisgICAgICAgIGpzdHJpbmcgbmFtZSwgamludCBudW1BcmdzLCBqb2JqZWN0IGZ1bmN0aW9uKQoreworICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBvZmZzZXRfZGJfaGFuZGxlKTsKKyAgICBjaGFyIGNvbnN0ICpuYW1lU3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhuYW1lLCBOVUxMKTsKKyAgICBqb2JqZWN0IHJlZiA9IGVudi0+TmV3R2xvYmFsUmVmKGZ1bmN0aW9uKTsKKyAgICBMT0dEX0lGKERFQlVHX0pOSSwgIm5hdGl2ZV9hZGRDdXN0b21GdW5jdGlvbiAlcyByZWY6ICVwIiwgbmFtZVN0ciwgcmVmKTsKKyAgICBpbnQgZXJyID0gc3FsaXRlM19jcmVhdGVfZnVuY3Rpb24oaGFuZGxlLCBuYW1lU3RyLCBudW1BcmdzLCBTUUxJVEVfVVRGOCwKKyAgICAgICAgICAgICh2b2lkICopcmVmLCBjdXN0b21fZnVuY3Rpb25fY2FsbGJhY2ssIE5VTEwsIE5VTEwpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKG5hbWUsIG5hbWVTdHIpOworCisgICAgaWYgKGVyciA9PSBTUUxJVEVfT0spCisgICAgICAgIHJldHVybiAoaW50KXJlZjsKKyAgICBlbHNlIHsKKyAgICAgICAgTE9HRSgic3FsaXRlM19jcmVhdGVfZnVuY3Rpb24gcmV0dXJuZWQgJWQiLCBlcnIpOworICAgICAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihyZWYpOworICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsIGhhbmRsZSk7CisgICAgICAgIHJldHVybiAwOworICAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG5hdGl2ZV9yZWxlYXNlQ3VzdG9tRnVuY3Rpb24oSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHJlZikKK3sKKyAgICBMT0dEX0lGKERFQlVHX0pOSSwgIm5hdGl2ZV9yZWxlYXNlQ3VzdG9tRnVuY3Rpb24gJWQiLCByZWYpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKChqb2JqZWN0KXJlZik7Cit9CisKIHN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9CiB7CiAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCiAgICAgeyJkYm9wZW4iLCAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIsICh2b2lkICopZGJvcGVufSwKICAgICB7ImRiY2xvc2UiLCAiKClWIiwgKHZvaWQgKilkYmNsb3NlfSwKLSAgICB7ImVuYWJsZVNxbFRyYWNpbmciLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwgKHZvaWQgKillbmFibGVTcWxUcmFjaW5nfSwKLSAgICB7ImVuYWJsZVNxbFByb2ZpbGluZyIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAodm9pZCAqKWVuYWJsZVNxbFByb2ZpbGluZ30sCi0gICAgeyJuYXRpdmVfZXhlY1NRTCIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAodm9pZCAqKW5hdGl2ZV9leGVjU1FMfSwKLSAgICB7Imxhc3RJbnNlcnRSb3ciLCAiKClKIiwgKHZvaWQgKilsYXN0SW5zZXJ0Um93fSwKLSAgICB7Imxhc3RDaGFuZ2VDb3VudCIsICIoKUkiLCAodm9pZCAqKWxhc3RDaGFuZ2VDb3VudH0sCisgICAgeyJlbmFibGVTcWxUcmFjaW5nIiwgIihMamF2YS9sYW5nL1N0cmluZztTKVYiLCAodm9pZCAqKWVuYWJsZVNxbFRyYWNpbmd9LAorICAgIHsiZW5hYmxlU3FsUHJvZmlsaW5nIiwgIihMamF2YS9sYW5nL1N0cmluZztTKVYiLCAodm9pZCAqKWVuYWJsZVNxbFByb2ZpbGluZ30sCiAgICAgeyJuYXRpdmVfc2V0TG9jYWxlIiwgIihMamF2YS9sYW5nL1N0cmluZztJKVYiLCAodm9pZCAqKW5hdGl2ZV9zZXRMb2NhbGV9LAogICAgIHsibmF0aXZlX2dldERiTG9va2FzaWRlIiwgIigpSSIsICh2b2lkICopbmF0aXZlX2dldERiTG9va2FzaWRlfSwKICAgICB7InJlbGVhc2VNZW1vcnkiLCAiKClJIiwgKHZvaWQgKiluYXRpdmVfcmVsZWFzZU1lbW9yeX0sCisgICAgeyJuYXRpdmVfZmluYWxpemUiLCAiKEkpViIsICh2b2lkICopbmF0aXZlX2ZpbmFsaXplfSwKKyAgICB7Im5hdGl2ZV9hZGRDdXN0b21GdW5jdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7SUxhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZSRDdXN0b21GdW5jdGlvbjspSSIsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopbmF0aXZlX2FkZEN1c3RvbUZ1bmN0aW9ufSwKKyAgICB7Im5hdGl2ZV9yZWxlYXNlQ3VzdG9tRnVuY3Rpb24iLCAiKEkpViIsICh2b2lkICopbmF0aXZlX3JlbGVhc2VDdXN0b21GdW5jdGlvbn0sCiB9OwogCiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZShKTklFbnYgKmVudikKQEAgLTQ3NCw3ICs0ODksMTkgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlIiwgc01ldGhvZHMsIE5FTEVNKHNNZXRob2RzKSk7CisgICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2UkQ3VzdG9tRnVuY3Rpb24iKTsKKyAgICBpZiAoY2xhenogPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlJEN1c3RvbUZ1bmN0aW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfY3VzdG9tX2Z1bmN0aW9uX2NhbGxiYWNrID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImNhbGxiYWNrIiwgIihbTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKKyAgICBpZiAobWV0aG9kX2N1c3RvbV9mdW5jdGlvbl9jYWxsYmFjayA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgbWV0aG9kIFNRTGl0ZURhdGFiYXNlLkN1c3RvbUZ1bmN0aW9uLmNhbGxiYWNrXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlIiwKKyAgICAgICAgICAgIHNNZXRob2RzLCBORUxFTShzTWV0aG9kcykpOwogfQogCiAvKiB0aHJvdyBhIFNRTGl0ZUV4Y2VwdGlvbiB3aXRoIGEgbWVzc2FnZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGVycm9yIGluIGhhbmRsZSAqLwpAQCAtNTIzLDYgKzU1MCw3IEBACiAgICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEaXNrSU9FeGNlcHRpb24iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgU1FMSVRFX0NPUlJVUFQ6CisgICAgICAgIGNhc2UgU1FMSVRFX05PVEFEQjogLy8gdHJlYXQgInVuc3VwcG9ydGVkIGZpbGUgZm9ybWF0IiBlcnJvciBhcyBjb3JydXB0aW9uIGFsc28KICAgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBTUUxJVEVfQ09OU1RSQUlOVDoKQEAgLTU0MCw2ICs1NjgsMzYgQEAKICAgICAgICAgY2FzZSBTUUxJVEVfTUlTVVNFOgogICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVNaXN1c2VFeGNlcHRpb24iOwogICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfUEVSTToKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9CVVNZOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9MT0NLRUQ6CisgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX1JFQURPTkxZOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX0NBTlRPUEVOOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX1RPT0JJRzoKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9SQU5HRToKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX05PTUVNOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9NSVNNQVRDSDoKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9VTkNMT1NFRDoKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlVW5maW5hbGl6ZWRPYmplY3RzRXhjZXB0aW9uIjsKKyAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUV4Y2VwdGlvbiI7CiAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVRdWVyeS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVF1ZXJ5LmNwcAppbmRleCA0NDI3MTY4My4uOWU0MjE4OSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVRdWVyeS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVRdWVyeS5jcHAKQEAgLTE1LDcgKzE1LDcgQEAKICAqLwogCiAjdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJDdXJzb3IiCisjZGVmaW5lIExPR19UQUcgIlNxbGl0ZUN1cnNvci5jcHAiCiAKICNpbmNsdWRlIDxqbmkuaD4KICNpbmNsdWRlIDxKTklIZWxwLmg+CkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNpbmNsdWRlICJDdXJzb3JXaW5kb3cuaCIKKyNpbmNsdWRlICJiaW5kZXIvQ3Vyc29yV2luZG93LmgiCiAjaW5jbHVkZSAic3FsaXRlM19leGNlcHRpb24uaCIKIAogCkBAIC03Myw3ICs3Myw3IEBACiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9Ci0gICAgTE9HRCgic2tpcF9yb3dzIHJvdyAlZCIsIG1heFJvd3MpOworICAgIExPR19XSU5ET1coInNraXBfcm93cyByb3cgJWQiLCBtYXhSb3dzKTsKICAgICByZXR1cm4gbWF4Um93czsKIH0KIApAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgc3FsaXRlM19yZXNldChzdGF0ZW1lbnQpOwotICAgIExPR0QoImZpbmlzaF9wcm9ncmFtX2FuZF9nZXRfcm93X2NvdW50IHJvdyAlZCIsIG51bVJvd3MpOworICAgIExPR19XSU5ET1coImZpbmlzaF9wcm9ncmFtX2FuZF9nZXRfcm93X2NvdW50IHJvdyAlZCIsIG51bVJvd3MpOwogICAgIHJldHVybiBudW1Sb3dzOwogfQogCkBAIC0xMTYsNiArMTE2LDggQEAKICAgICBpbnQgcmV0cnlDb3VudDsKICAgICBpbnQgYm91bmRQYXJhbXM7CiAgICAgQ3Vyc29yV2luZG93ICogd2luZG93OworICAgIGJvb2wgZ290QWxsUm93cyA9IHRydWU7CisgICAgYm9vbCBnb3RFeGNlcHRpb24gPSBmYWxzZTsKICAgICAKICAgICBpZiAoc3RhdGVtZW50ID09IE5VTEwpIHsKICAgICAgICAgTE9HRSgiSW52YWxpZCBzdGF0ZW1lbnQgaW4gZmlsbFdpbmRvdygpIik7CkBAIC0xMzEsOCArMTMzLDcgQEAKICAgICAgICAgZXJyID0gc3FsaXRlM19iaW5kX2ludChzdGF0ZW1lbnQsIG9mZnNldFBhcmFtLCBzdGFydFBvcyk7CiAgICAgICAgIGlmIChlcnIgIT0gU1FMSVRFX09LKSB7CiAgICAgICAgICAgICBMT0dFKCJVbmFibGUgdG8gYmluZCBvZmZzZXQgcG9zaXRpb24sIG9mZnNldFBhcmFtID0gJWQiLCBvZmZzZXRQYXJhbSk7Ci0gICAgICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZTNfZXJybXNnKEdFVF9IQU5ETEUoZW52LCBvYmplY3QpKSk7CisgICAgICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsIEdFVF9IQU5ETEUoZW52LCBvYmplY3QpKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgICAgIExPR19XSU5ET1coIkJvdW5kIHRvIHN0YXJ0UG9zICVkIiwgc3RhcnRQb3MpOwpAQCAtMTY3LDcgKzE2OCw3IEBACiAgICAgICAgICAgICBMT0dFKCJzdGFydFBvcyAlZCA+IGFjdHVhbCByb3dzICVkIiwgc3RhcnRQb3MsIG51bSk7CiAgICAgICAgICAgICByZXR1cm4gbnVtOwogICAgICAgICB9Ci0gICAgfSAKKyAgICB9CiAgICAgCiAgICAgd2hpbGUoc3RhcnRQb3MgIT0gMCB8fCBudW1Sb3dzIDwgbWF4UmVhZCkgewogICAgICAgICBlcnIgPSBzcWxpdGUzX3N0ZXAoc3RhdGVtZW50KTsKQEAgLTE4MSw4ICsxODIsOSBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkRGlyID0gd2luZG93LT5hbGxvY1JvdygpOwogICAgICAgICAgICAgICAgIGlmICghZmllbGREaXIpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HRSgiRmFpbGVkIGFsbG9jYXRpbmcgZmllbGREaXIgYXQgc3RhcnRQb3MgJWQgcm93ICVkIiwgc3RhcnRQb3MsIG51bVJvd3MpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRQb3MgKyBudW1Sb3dzICsgZmluaXNoX3Byb2dyYW1fYW5kX2dldF9yb3dfY291bnQoc3RhdGVtZW50KSArIDE7CisgICAgICAgICAgICAgICAgICAgIExPR19XSU5ET1coIkZhaWxlZCBhbGxvY2F0aW5nIGZpZWxkRGlyIGF0IHN0YXJ0UG9zICVkIHJvdyAlZCIsIHN0YXJ0UG9zLCBudW1Sb3dzKTsKKyAgICAgICAgICAgICAgICAgICAgZ290QWxsUm93cyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9jb3VudDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTIwNSw5ICsyMDcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IHdpbmRvdy0+YWxsb2Moc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghb2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJGYWlsZWQgYWxsb2NhdGluZyAldSBieXRlcyBmb3IgdGV4dC9ibG9iIGF0ICVkLCVkIiwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR19XSU5ET1coIkZhaWxlZCBhbGxvY2F0aW5nICV1IGJ5dGVzIGZvciB0ZXh0L2Jsb2IgYXQgJWQsJWQiLCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvcyArIG51bVJvd3MsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0UG9zICsgbnVtUm93cyArIGZpbmlzaF9wcm9ncmFtX2FuZF9nZXRfcm93X2NvdW50KHN0YXRlbWVudCkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgZ290QWxsUm93cyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZXR1cm5fY291bnQ7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICB3aW5kb3ctPmNvcHlJbihvZmZzZXQsIHRleHQsIHNpemUpOwpAQCAtMjI1LDggKzIyOCw5IEBACiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWUgPSBzcWxpdGUzX2NvbHVtbl9pbnQ2NChzdGF0ZW1lbnQsIGkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy0+cHV0TG9uZyhudW1Sb3dzLCBpLCB2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy0+ZnJlZUxhc3RSb3coKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nIHNwYWNlIGZvciBhIGxvbmcgaW4gY29sdW1uICVkIiwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRQb3MgKyBudW1Sb3dzICsgZmluaXNoX3Byb2dyYW1fYW5kX2dldF9yb3dfY291bnQoc3RhdGVtZW50KSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dfV0lORE9XKCJGYWlsZWQgYWxsb2NhdGluZyBzcGFjZSBmb3IgYSBsb25nIGluIGNvbHVtbiAlZCIsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290QWxsUm93cyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZXR1cm5fY291bnQ7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgTE9HX1dJTkRPVygiJWQsJWQgaXMgSU5URUdFUiAweCUwMTZsbHgiLCBzdGFydFBvcyArIG51bVJvd3MsIGksIHZhbHVlKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gU1FMSVRFX0ZMT0FUKSB7CkBAIC0yMzQsOCArMjM4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbHVlID0gc3FsaXRlM19jb2x1bW5fZG91YmxlKHN0YXRlbWVudCwgaSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LT5wdXREb3VibGUobnVtUm93cywgaSwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJGYWlsZWQgYWxsb2NhdGluZyBzcGFjZSBmb3IgYSBkb3VibGUgaW4gY29sdW1uICVkIiwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRQb3MgKyBudW1Sb3dzICsgZmluaXNoX3Byb2dyYW1fYW5kX2dldF9yb3dfY291bnQoc3RhdGVtZW50KSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dfV0lORE9XKCJGYWlsZWQgYWxsb2NhdGluZyBzcGFjZSBmb3IgYSBkb3VibGUgaW4gY29sdW1uICVkIiwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RBbGxSb3dzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9jb3VudDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBMT0dfV0lORE9XKCIlZCwlZCBpcyBGTE9BVCAlbGYiLCBzdGFydFBvcyArIG51bVJvd3MsIGksIHZhbHVlKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gU1FMSVRFX0JMT0IpIHsKQEAgLTI0NSw5ICsyNTAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IHdpbmRvdy0+YWxsb2Moc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghb2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJGYWlsZWQgYWxsb2NhdGluZyAldSBieXRlcyBmb3IgYmxvYiBhdCAlZCwlZCIsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBMT0dfV0lORE9XKCJGYWlsZWQgYWxsb2NhdGluZyAldSBieXRlcyBmb3IgYmxvYiBhdCAlZCwlZCIsIHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zICsgbnVtUm93cywgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRQb3MgKyBudW1Sb3dzICsgZmluaXNoX3Byb2dyYW1fYW5kX2dldF9yb3dfY291bnQoc3RhdGVtZW50KSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RBbGxSb3dzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9jb3VudDsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy0+Y29weUluKG9mZnNldCwgYmxvYiwgc2l6ZSk7CkBAIC0yNjksNiArMjc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gVW5rbm93biBkYXRhCiAgICAgICAgICAgICAgICAgICAgIExPR0UoIlVua25vd24gY29sdW1uIHR5cGUgd2hlbiBmaWxsaW5nIGRhdGFiYXNlIHdpbmRvdyIpOwogICAgICAgICAgICAgICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsICJVbmtub3duIGNvbHVtbiB0eXBlIHdoZW4gZmlsbGluZyB3aW5kb3ciKTsKKyAgICAgICAgICAgICAgICAgICAgZ290RXhjZXB0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjkwLDYgKzI5Nyw4IEBACiAgICAgICAgICAgICBMT0dfV0lORE9XKCJEYXRhYmFzZSBsb2NrZWQsIHJldHJ5aW5nIik7CiAgICAgICAgICAgICBpZiAocmV0cnlDb3VudCA+IDUwKSB7CiAgICAgICAgICAgICAgICAgTE9HRSgiQmFpbGluZyBvbiBkYXRhYmFzZSBidXN5IHJldHkiKTsKKyAgICAgICAgICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsIEdFVF9IQU5ETEUoZW52LCBvYmplY3QpLCAicmV0cnljb3VudCBleGNlZWRlZCIpOworICAgICAgICAgICAgICAgIGdvdEV4Y2VwdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTMwMCwxOCArMzA5LDMzIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRocm93X3NxbGl0ZTNfZXhjZXB0aW9uKGVudiwgR0VUX0hBTkRMRShlbnYsIG9iamVjdCkpOworICAgICAgICAgICAgZ290RXhjZXB0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCiAgICAgTE9HX1dJTkRPVygiUmVzZXR0aW5nIHN0YXRlbWVudCAlcCBhZnRlciBmZXRjaGluZyAlZCByb3dzIGluICVkIGJ5dGVzXG5cblxuXG4iLCBzdGF0ZW1lbnQsCiAgICAgICAgICAgICBudW1Sb3dzLCB3aW5kb3ctPnNpemUoKSAtIHdpbmRvdy0+ZnJlZVNwYWNlKCkpOwotLy8gICAgTE9HSSgiRmlsbGVkIHdpbmRvdyB3aXRoICVkIHJvd3MgaW4gJWQgYnl0ZXMiLCBudW1Sb3dzLCB3aW5kb3ctPnNpemUoKSAtIHdpbmRvdy0+ZnJlZVNwYWNlKCkpOworICAgIExPR19XSU5ET1coIkZpbGxlZCB3aW5kb3cgd2l0aCAlZCByb3dzIGluICVkIGJ5dGVzIiwgbnVtUm93cywKKyAgICAgICAgICAgIHdpbmRvdy0+c2l6ZSgpIC0gd2luZG93LT5mcmVlU3BhY2UoKSk7CiAgICAgaWYgKGVyciA9PSBTUUxJVEVfUk9XKSB7CisgICAgICAgIC8vIHRoZXJlIGlzIG1vcmUgZGF0YSB0byBiZSByZXR1cm5lZC4gbGV0IHRoZSBjYWxsZXIga25vdyBieSByZXR1cm5pbmcgLTEKICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSB7CisgICAgfQorICByZXR1cm5fY291bnQ6CisgICAgaWYgKHN0YXJ0UG9zKSB7CiAgICAgICAgIHNxbGl0ZTNfcmVzZXQoc3RhdGVtZW50KTsKLSAgICAgICAgcmV0dXJuIHN0YXJ0UG9zICsgbnVtUm93czsKKyAgICAgICAgTE9HX1dJTkRPVygiTm90IGRvaW5nIGNvdW50KCopIGJlY2F1c2Ugc3RhcnRQb3MgJWQgaXMgbm9uLXplcm8iLCBzdGFydFBvcyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoZ290QWxsUm93cykgeworICAgICAgICBzcWxpdGUzX3Jlc2V0KHN0YXRlbWVudCk7CisgICAgICAgIExPR19XSU5ET1coIk5vdCBkb2luZyBjb3VudCgqKSBiZWNhdXNlIHdlIGFscmVhZHkga25vdyB0aGUgY291bnQoKikiKTsKKyAgICAgICAgcmV0dXJuIG51bVJvd3M7CisgICAgfSBlbHNlIGlmIChnb3RFeGNlcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gc2luY2Ugc3RhcnRQb3MgPT0gMCwgd2UgbmVlZCB0byBnZXQgdGhlIGNvdW50KCopIG9mIHRoZSByZXN1bHQgc2V0CisgICAgICAgIHJldHVybiBudW1Sb3dzICsgMSArIGZpbmlzaF9wcm9ncmFtX2FuZF9nZXRfcm93X2NvdW50KHN0YXRlbWVudCk7CiAgICAgfQogfQogCkBAIC0zMzYsNyArMzYwLDggQEAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9CiB7CiAgICAgIC8qIG5hbWUsIHNpZ25hdHVyZSwgZnVuY1B0ciAqLwotICAgIHsibmF0aXZlX2ZpbGxfd2luZG93IiwgIihMYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3c7SUlJSSlJIiwgKHZvaWQgKiluYXRpdmVfZmlsbF93aW5kb3d9LAorICAgIHsibmF0aXZlX2ZpbGxfd2luZG93IiwgIihMYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3c7SUlJSSlJIiwKKyAgICAgICAgICAgICh2b2lkICopbmF0aXZlX2ZpbGxfd2luZG93fSwKICAgICB7Im5hdGl2ZV9jb2x1bW5fY291bnQiLCAiKClJIiwgKHZvaWQqKW5hdGl2ZV9jb2x1bW5fY291bnR9LAogICAgIHsibmF0aXZlX2NvbHVtbl9uYW1lIiwgIihJKUxqYXZhL2xhbmcvU3RyaW5nOyIsICh2b2lkICopbmF0aXZlX2NvbHVtbl9uYW1lfSwKIH07CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVN0YXRlbWVudC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVN0YXRlbWVudC5jcHAKaW5kZXggZmYyZWQ1ZC4uOTdlMDQ4MyAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVTdGF0ZW1lbnQuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlU3RhdGVtZW50LmNwcApAQCAtMTYsNyArMTYsOSBAQAogKi8KIAogI3VuZGVmIExPR19UQUcKLSNkZWZpbmUgTE9HX1RBRyAiQ3Vyc29yIgorI2RlZmluZSBMT0dfVEFHICJTUUxpdGVTdGF0ZW1lbnRDcHAiCisKKyNpbmNsdWRlICJhbmRyb2lkX3V0aWxfQmluZGVyLmgiCiAKICNpbmNsdWRlIDxqbmkuaD4KICNpbmNsdWRlIDxKTklIZWxwLmg+CkBAIC0yNCwxMSArMjYsMTYgQEAKIAogI2luY2x1ZGUgPHNxbGl0ZTMuaD4KIAorI2luY2x1ZGUgPGN1dGlscy9hc2htZW0uaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAKICNpbmNsdWRlICJzcWxpdGUzX2V4Y2VwdGlvbi5oIgogCkBAIC00OCwyMiArNTUsNDAgQEAKICAgICAgICAgKHNxbGl0ZTMgKillbnYtPkdldEludEZpZWxkKG9iamVjdCwgZ0hhbmRsZUZpZWxkKQogCiAKLXN0YXRpYyB2b2lkIG5hdGl2ZV9leGVjdXRlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkKK3N0YXRpYyBqaW50IG5hdGl2ZV9leGVjdXRlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkKIHsKICAgICBpbnQgZXJyOwogICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSBHRVRfSEFORExFKGVudiwgb2JqZWN0KTsKICAgICBzcWxpdGUzX3N0bXQgKiBzdGF0ZW1lbnQgPSBHRVRfU1RBVEVNRU5UKGVudiwgb2JqZWN0KTsKKyAgICBpbnQgbnVtQ2hhbmdlcyA9IC0xOwogCiAgICAgLy8gRXhlY3V0ZSB0aGUgc3RhdGVtZW50CiAgICAgZXJyID0gc3FsaXRlM19zdGVwKHN0YXRlbWVudCk7CiAKLSAgICAvLyBUaHJvdyBhbiBleGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJlZAotICAgIGlmIChlcnIgIT0gU1FMSVRFX0RPTkUpIHsKKyAgICAvLyBUaHJvdyBhbiBleGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAgICBpZiAoZXJyID09IFNRTElURV9ST1cpIHsKKyAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb24oZW52LAorICAgICAgICAgICAgICAgICJRdWVyaWVzIGNhbiBiZSBwZXJmb3JtZWQgdXNpbmcgU1FMaXRlRGF0YWJhc2UgcXVlcnkgb3IgcmF3UXVlcnkgbWV0aG9kcyBvbmx5LiIpOworICAgIH0gZWxzZSBpZiAoZXJyICE9IFNRTElURV9ET05FKSB7CiAgICAgICAgIHRocm93X3NxbGl0ZTNfZXhjZXB0aW9uX2VycmNvZGUoZW52LCBlcnIsIHNxbGl0ZTNfZXJybXNnKGhhbmRsZSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG51bUNoYW5nZXMgPSBzcWxpdGUzX2NoYW5nZXMoaGFuZGxlKTsKICAgICB9CiAKLSAgICAvLyBSZXNldCB0aGUgc3RhdG1lbnQgc28gaXQncyByZWFkeSB0byB1c2UgYWdhaW4KKyAgICAvLyBSZXNldCB0aGUgc3RhdGVtZW50IHNvIGl0J3MgcmVhZHkgdG8gdXNlIGFnYWluCiAgICAgc3FsaXRlM19yZXNldChzdGF0ZW1lbnQpOworICAgIHJldHVybiBudW1DaGFuZ2VzOworfQorCitzdGF0aWMgamxvbmcgbmF0aXZlX2V4ZWN1dGVJbnNlcnQoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQoreworICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSBHRVRfSEFORExFKGVudiwgb2JqZWN0KTsKKyAgICBqaW50IG51bUNoYW5nZXMgPSBuYXRpdmVfZXhlY3V0ZShlbnYsIG9iamVjdCk7CisgICAgaWYgKG51bUNoYW5nZXMgPiAwKSB7CisgICAgICAgIHJldHVybiBzcWxpdGUzX2xhc3RfaW5zZXJ0X3Jvd2lkKGhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIH0KIAogc3RhdGljIGpsb25nIG5hdGl2ZV8xeDFfbG9uZyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCkBAIC0xMTUsMTMgKzE0MCwxMjUgQEAKICAgICByZXR1cm4gdmFsdWU7CiB9CiAKK3N0YXRpYyBqb2JqZWN0IGNyZWF0ZVBhcmNlbEZpbGVEZXNjcmlwdG9yKEpOSUVudiAqIGVudiwgaW50IGZkKQoreworICAgIC8vIENyZWF0ZSBGaWxlRGVzY3JpcHRvciBvYmplY3QKKyAgICBqb2JqZWN0IGZpbGVEZXNjID0gbmV3RmlsZURlc2NyaXB0b3IoZW52LCBmZCk7CisgICAgaWYgKGZpbGVEZXNjID09IE5VTEwpIHsKKyAgICAgICAgLy8gRmlsZURlc2NyaXB0b3IgY29uc3RydWN0b3IgaGFzIHRocm93biBhbiBleGNlcHRpb24KKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBXcmFwIGl0IGluIGEgUGFyY2VsRmlsZURlc2NyaXB0b3IKKyAgICBqb2JqZWN0IHBhcmNlbEZpbGVEZXNjID0gbmV3UGFyY2VsRmlsZURlc2NyaXB0b3IoZW52LCBmaWxlRGVzYyk7CisgICAgaWYgKHBhcmNlbEZpbGVEZXNjID09IE5VTEwpIHsKKyAgICAgICAgLy8gUGFyY2VsRmlsZURlc2NyaXB0b3IgY29uc3RydWN0b3IgaGFzIHRocm93biBhbiBleGNlcHRpb24KKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcGFyY2VsRmlsZURlc2M7Cit9CisKKy8vIENyZWF0ZXMgYW4gYXNobWVtIGFyZWEsIGNvcGllcyBzb21lIGRhdGEgaW50byBpdCwgYW5kIHJldHVybnMKKy8vIGEgUGFyY2VsRmlsZURlc2NyaXB0b3IgZm9yIHRoZSBhc2htZW0gYXJlYS4KK3N0YXRpYyBqb2JqZWN0IGNyZWF0ZV9hc2htZW1fcmVnaW9uX3dpdGhfZGF0YShKTklFbnYgKiBlbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIGRhdGEsIGludCBsZW5ndGgpCit7CisgICAgLy8gQ3JlYXRlIGFzaG1lbSBhcmVhCisgICAgaW50IGZkID0gYXNobWVtX2NyZWF0ZV9yZWdpb24oTlVMTCwgbGVuZ3RoKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIExPR0UoImFzaG1lbV9jcmVhdGVfcmVnaW9uIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBqbmlUaHJvd0lPRXhjZXB0aW9uKGVudiwgZXJybm8pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgICAvLyBtbWFwIHRoZSBhc2htZW0gYXJlYQorICAgICAgICB2b2lkICogYXNobWVtX3B0ciA9CisgICAgICAgICAgICAgICAgbW1hcChOVUxMLCBsZW5ndGgsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkLCAwKTsKKyAgICAgICAgaWYgKGFzaG1lbV9wdHIgPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICAgICAgTE9HRSgibW1hcCBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIGpuaVRocm93SU9FeGNlcHRpb24oZW52LCBlcnJubyk7CisgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvcHkgZGF0YSB0byBhc2htZW0gYXJlYQorICAgICAgICBtZW1jcHkoYXNobWVtX3B0ciwgZGF0YSwgbGVuZ3RoKTsKKworICAgICAgICAvLyBtdW5tYXAgYXNobWVtIGFyZWEKKyAgICAgICAgaWYgKG11bm1hcChhc2htZW1fcHRyLCBsZW5ndGgpIDwgMCkgeworICAgICAgICAgICAgTE9HRSgibXVubWFwIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgam5pVGhyb3dJT0V4Y2VwdGlvbihlbnYsIGVycm5vKTsKKyAgICAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTWFrZSBhc2htZW0gYXJlYSByZWFkLW9ubHkKKyAgICBpZiAoYXNobWVtX3NldF9wcm90X3JlZ2lvbihmZCwgUFJPVF9SRUFEKSA8IDApIHsKKyAgICAgICAgTE9HRSgiYXNobWVtX3NldF9wcm90X3JlZ2lvbiBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgam5pVGhyb3dJT0V4Y2VwdGlvbihlbnYsIGVycm5vKTsKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBXcmFwIGl0IGluIGEgUGFyY2VsRmlsZURlc2NyaXB0b3IKKyAgICByZXR1cm4gY3JlYXRlUGFyY2VsRmlsZURlc2NyaXB0b3IoZW52LCBmZCk7Cit9CisKK3N0YXRpYyBqb2JqZWN0IG5hdGl2ZV8xeDFfYmxvYl9hc2htZW0oSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQoreworICAgIGludCBlcnI7CisgICAgc3FsaXRlMyAqIGhhbmRsZSA9IEdFVF9IQU5ETEUoZW52LCBvYmplY3QpOworICAgIHNxbGl0ZTNfc3RtdCAqIHN0YXRlbWVudCA9IEdFVF9TVEFURU1FTlQoZW52LCBvYmplY3QpOworICAgIGpvYmplY3QgdmFsdWUgPSBOVUxMOworCisgICAgLy8gRXhlY3V0ZSB0aGUgc3RhdGVtZW50CisgICAgZXJyID0gc3FsaXRlM19zdGVwKHN0YXRlbWVudCk7CisKKyAgICAvLyBIYW5kbGUgdGhlIHJlc3VsdAorICAgIGlmIChlcnIgPT0gU1FMSVRFX1JPVykgeworICAgICAgICAvLyBObyBlcnJvcnMsIHJlYWQgdGhlIGRhdGEgYW5kIHJldHVybiBpdAorICAgICAgICBjb25zdCB2b2lkICogYmxvYiA9IHNxbGl0ZTNfY29sdW1uX2Jsb2Ioc3RhdGVtZW50LCAwKTsKKyAgICAgICAgaWYgKGJsb2IgIT0gTlVMTCkgeworICAgICAgICAgICAgaW50IGxlbiA9IHNxbGl0ZTNfY29sdW1uX2J5dGVzKHN0YXRlbWVudCwgMCk7CisgICAgICAgICAgICBpZiAobGVuID49IDApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGNyZWF0ZV9hc2htZW1fcmVnaW9uX3dpdGhfZGF0YShlbnYsIGJsb2IsIGxlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbl9lcnJjb2RlKGVudiwgZXJyLCBzcWxpdGUzX2Vycm1zZyhoYW5kbGUpKTsKKyAgICB9CisKKyAgICAvLyBSZXNldCB0aGUgc3RhdG1lbnQgc28gaXQncyByZWFkeSB0byB1c2UgYWdhaW4KKyAgICBzcWxpdGUzX3Jlc2V0KHN0YXRlbWVudCk7CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIG5hdGl2ZV9leGVjdXRlU3FsKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwganN0cmluZyBzcWwpCit7CisgICAgY2hhciBjb25zdCogc3FsU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzcWwsIE5VTEwpOworICAgIHNxbGl0ZTMgKiBoYW5kbGUgPSBHRVRfSEFORExFKGVudiwgb2JqZWN0KTsKKyAgICBpbnQgZXJyID0gc3FsaXRlM19leGVjKGhhbmRsZSwgc3FsU3RyaW5nLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoZXJyICE9IFNRTElURV9PSykgeworICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsIGhhbmRsZSk7CisgICAgfQorICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNxbCwgc3FsU3RyaW5nKTsKK30KIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBzTWV0aG9kc1tdID0KIHsKICAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCi0gICAgeyJuYXRpdmVfZXhlY3V0ZSIsICIoKVYiLCAodm9pZCAqKW5hdGl2ZV9leGVjdXRlfSwKKyAgICB7Im5hdGl2ZV9leGVjdXRlIiwgIigpSSIsICh2b2lkICopbmF0aXZlX2V4ZWN1dGV9LAorICAgIHsibmF0aXZlX2V4ZWN1dGVJbnNlcnQiLCAiKClKIiwgKHZvaWQgKiluYXRpdmVfZXhlY3V0ZUluc2VydH0sCiAgICAgeyJuYXRpdmVfMXgxX2xvbmciLCAiKClKIiwgKHZvaWQgKiluYXRpdmVfMXgxX2xvbmd9LAogICAgIHsibmF0aXZlXzF4MV9zdHJpbmciLCAiKClMamF2YS9sYW5nL1N0cmluZzsiLCAodm9pZCAqKW5hdGl2ZV8xeDFfc3RyaW5nfSwKKyAgICB7Im5hdGl2ZV8xeDFfYmxvYl9hc2htZW0iLCAiKClMYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvcjsiLCAodm9pZCAqKW5hdGl2ZV8xeDFfYmxvYl9hc2htZW19LAorICAgIHsibmF0aXZlX2V4ZWN1dGVTcWwiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwgKHZvaWQgKiluYXRpdmVfZXhlY3V0ZVNxbH0sCiB9OwogCiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVTdGF0ZW1lbnQoSk5JRW52ICogZW52KQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9uZXRfTmV0VXRpbHMuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9uZXRfTmV0VXRpbHMuY3BwCmluZGV4IDY1NzViOWEuLjM1MWYyNjQgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfbmV0X05ldFV0aWxzLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX25ldF9OZXRVdGlscy5jcHAKQEAgLTIyNCw3ICsyMjQsOCBAQAogICAgIHsgImFkZFJvdXRlIiwgIihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztJTGphdmEvbGFuZy9TdHJpbmc7KUkiLAogICAgICAgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfYWRkUm91dGUgfSwKICAgICB7ICJyZW1vdmVIb3N0Um91dGVzIiwgIihMamF2YS9sYW5nL1N0cmluZzspSSIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX3JlbW92ZUhvc3RSb3V0ZXMgfSwKLSAgICB7ICJnZXREZWZhdWx0Um91dGUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfZ2V0RGVmYXVsdFJvdXRlIH0sCisgICAgeyAiZ2V0RGVmYXVsdFJvdXRlTmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZzspSSIsCisgICAgICAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19nZXREZWZhdWx0Um91dGUgfSwKICAgICB7ICJyZW1vdmVEZWZhdWx0Um91dGUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfcmVtb3ZlRGVmYXVsdFJvdXRlIH0sCiAgICAgeyAicmVzZXRDb25uZWN0aW9ucyIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19yZXNldENvbm5lY3Rpb25zIH0sCiAgICAgeyAicnVuRGhjcCIsICIoTGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvbmV0L0RoY3BJbmZvOylaIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfcnVuRGhjcCB9LApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9uZXRfd2lmaV9XaWZpLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfbmV0X3dpZmlfV2lmaS5jcHAKaW5kZXggZmIwMjllNi4uZGVmZDBhMCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9uZXRfd2lmaV9XaWZpLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX25ldF93aWZpX1dpZmkuY3BwCkBAIC0zMCw2ICszMCw4IEBACiAKIHN0YXRpYyBqYm9vbGVhbiBzU2Nhbk1vZGVBY3RpdmUgPSBmYWxzZTsKIAorLy9UT0RPOiBjaGVjayBnZW5lcmFsIGVycm9ycyBpbiBhZGRpdGlvbiB0byBvdmVyZmxvdyBvbiBzbnByaW50ZgorCiAvKgogICogVGhlIGZvbGxvd2luZyByZW1lbWJlcnMgdGhlIGpmaWVsZElEJ3Mgb2YgdGhlIGZpZWxkcwogICogb2YgdGhlIERoY3BJbmZvIEphdmEgb2JqZWN0LCBzbyB0aGF0IHdlIGRvbid0IGhhdmUKQEAgLTk4LDYgKzEwMCwxMSBAQAogICAgIH0KIH0KIAorc3RhdGljIGpib29sZWFuIGFuZHJvaWRfbmV0X3dpZmlfaXNEcml2ZXJMb2FkZWQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopCit7CisgICAgcmV0dXJuIChqYm9vbGVhbikoOjppc193aWZpX2RyaXZlcl9sb2FkZWQoKSA9PSAxKTsKK30KKwogc3RhdGljIGpib29sZWFuIGFuZHJvaWRfbmV0X3dpZmlfbG9hZERyaXZlcihKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eikKIHsKICAgICByZXR1cm4gKGpib29sZWFuKSg6OndpZmlfbG9hZF9kcml2ZXIoKSA9PSAwKTsKQEAgLTE1MCw2ICsxNTcsMzYgQEAKICAgICByZXR1cm4gZG9JbnRDb21tYW5kKCJBRERfTkVUV09SSyIpOwogfQogCitzdGF0aWMgamJvb2xlYW4gYW5kcm9pZF9uZXRfd2lmaV93cHNQYmNDb21tYW5kKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqc3RyaW5nIGJzc2lkKQoreworICAgIGNoYXIgY21kc3RyWzUwXTsKKyAgICBqYm9vbGVhbiBpc0NvcHk7CisKKyAgICBjb25zdCBjaGFyICpic3NpZFN0ciA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoYnNzaWQsICZpc0NvcHkpOworICAgIGludCBudW1Xcml0dGVuID0gc25wcmludGYoY21kc3RyLCBzaXplb2YoY21kc3RyKSwgIldQU19QQkMgJXMiLCBic3NpZFN0cik7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoYnNzaWQsIGJzc2lkU3RyKTsKKworICAgIGlmICgobnVtV3JpdHRlbiA9PSAtMSkgfHwgKG51bVdyaXR0ZW4gPj0gc2l6ZW9mKGNtZHN0cikpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGRvQm9vbGVhbkNvbW1hbmQoY21kc3RyLCAiT0siKTsKK30KKworc3RhdGljIGpib29sZWFuIGFuZHJvaWRfbmV0X3dpZmlfd3BzUGluQ29tbWFuZChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwganN0cmluZyBic3NpZCwgaW50IGFwUGluKQoreworICAgIGNoYXIgY21kc3RyWzUwXTsKKyAgICBqYm9vbGVhbiBpc0NvcHk7CisKKyAgICBjb25zdCBjaGFyICpic3NpZFN0ciA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoYnNzaWQsICZpc0NvcHkpOworICAgIGludCBudW1Xcml0dGVuID0gc25wcmludGYoY21kc3RyLCBzaXplb2YoY21kc3RyKSwgIldQU19SRUcgJXMgJWQiLCBic3NpZFN0ciwgYXBQaW4pOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGJzc2lkLCBic3NpZFN0cik7CisKKyAgICBpZiAoKG51bVdyaXR0ZW4gPT0gLTEpIHx8IChudW1Xcml0dGVuID49IChpbnQpc2l6ZW9mKGNtZHN0cikpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGRvQm9vbGVhbkNvbW1hbmQoY21kc3RyLCAiT0siKTsKK30KKwogc3RhdGljIGpib29sZWFuIGFuZHJvaWRfbmV0X3dpZmlfc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChKTklFbnYqIGVudiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iamVjdCBjbGF6eiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBuZXRJZCwKQEAgLTQwNiw2ICs0NDMsMzAgQEAKICAgICByZXR1cm4gKGppbnQpcG93ZXI7CiB9CiAKK3N0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX25ldF93aWZpX3NldEJhbmRDb21tYW5kKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqaW50IGJhbmQpCit7CisgICAgY2hhciBjbWRzdHJbMjVdOworCisgICAgaW50IG51bVdyaXR0ZW4gPSBzbnByaW50ZihjbWRzdHIsIHNpemVvZihjbWRzdHIpLCAiRFJJVkVSIFNFVEJBTkQgJWQiLCBiYW5kKTsKKyAgICBpbnQgY21kVG9vTG9uZyA9IG51bVdyaXR0ZW4gPj0gKGludClzaXplb2YoY21kc3RyKTsKKworICAgIHJldHVybiAoamJvb2xlYW4pIWNtZFRvb0xvbmcgJiYgZG9Cb29sZWFuQ29tbWFuZChjbWRzdHIsICJPSyIpOworfQorCitzdGF0aWMgamludCBhbmRyb2lkX25ldF93aWZpX2dldEJhbmRDb21tYW5kKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6KQoreworICAgIGNoYXIgcmVwbHlbMjVdOworICAgIGludCBiYW5kOworCisgICAgaWYgKGRvQ29tbWFuZCgiRFJJVkVSIEdFVEJBTkQiLCByZXBseSwgc2l6ZW9mKHJlcGx5KSkgIT0gMCkgeworICAgICAgICByZXR1cm4gKGppbnQpLTE7CisgICAgfQorICAgIC8vIHJlcGx5IGNvbWVzIGJhY2sgaW4gdGhlIGZvcm0gIkJhbmQgWCIgd2hlcmUgWCBpcyB0aGUKKyAgICAvLyBudW1iZXIgd2UncmUgaW50ZXJlc3RlZCBpbi4KKyAgICBzc2NhbmYocmVwbHksICIlKnMgJXUiLCAmYmFuZCk7CisgICAgcmV0dXJuIChqaW50KWJhbmQ7Cit9CisKIHN0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX25ldF93aWZpX3NldE51bUFsbG93ZWRDaGFubmVsc0NvbW1hbmQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGppbnQgbnVtQ2hhbm5lbHMpCiB7CiAgICAgY2hhciBjbWRzdHJbMjU2XTsKQEAgLTQ5MywxNSArNTU0LDYgQEAKICAgICByZXR1cm4gZG9Cb29sZWFuQ29tbWFuZCgiQkxBQ0tMSVNUIGNsZWFyIiwgIk9LIik7CiB9CiAKLXN0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX25ldF93aWZpX3NldFN1c3BlbmRPcHRpbWl6YXRpb25zQ29tbWFuZChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgamJvb2xlYW4gZW5hYmxlZCkKLXsKLSAgICBjaGFyIGNtZHN0clsyNV07Ci0KLSAgICBzbnByaW50ZihjbWRzdHIsIHNpemVvZihjbWRzdHIpLCAiRFJJVkVSIFNFVFNVU1BFTkRPUFQgJWQiLCBlbmFibGVkID8gMCA6IDEpOwotICAgIHJldHVybiBkb0Jvb2xlYW5Db21tYW5kKGNtZHN0ciwgIk9LIik7Ci19Ci0KLQogc3RhdGljIGpib29sZWFuIGFuZHJvaWRfbmV0X3dpZmlfZG9EaGNwUmVxdWVzdChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgam9iamVjdCBpbmZvKQogewogICAgIGppbnQgaXBhZGRyLCBnYXRld2F5LCBtYXNrLCBkbnMxLCBkbnMyLCBzZXJ2ZXIsIGxlYXNlOwpAQCAtNTMzLDYgKzU4NSw3IEBACiAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCiAKICAgICB7ICJsb2FkRHJpdmVyIiwgIigpWiIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3dpZmlfbG9hZERyaXZlciB9LAorICAgIHsgImlzRHJpdmVyTG9hZGVkIiwgIigpWiIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3dpZmlfaXNEcml2ZXJMb2FkZWR9LAogICAgIHsgInVubG9hZERyaXZlciIsICIoKVoiLCAgKHZvaWQgKilhbmRyb2lkX25ldF93aWZpX3VubG9hZERyaXZlciB9LAogICAgIHsgInN0YXJ0U3VwcGxpY2FudCIsICIoKVoiLCAgKHZvaWQgKilhbmRyb2lkX25ldF93aWZpX3N0YXJ0U3VwcGxpY2FudCB9LAogICAgIHsgInN0b3BTdXBwbGljYW50IiwgIigpWiIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3dpZmlfc3RvcFN1cHBsaWNhbnQgfSwKQEAgLTU2NCw2ICs2MTcsOCBAQAogICAgIHsgInN0b3BQYWNrZXRGaWx0ZXJpbmciLCAiKClaIiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX3N0b3BQYWNrZXRGaWx0ZXJpbmcgfSwKICAgICB7ICJzZXRQb3dlck1vZGVDb21tYW5kIiwgIihJKVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfc2V0UG93ZXJNb2RlQ29tbWFuZCB9LAogICAgIHsgImdldFBvd2VyTW9kZUNvbW1hbmQiLCAiKClJIiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX2dldFBvd2VyTW9kZUNvbW1hbmQgfSwKKyAgICB7ICJzZXRCYW5kQ29tbWFuZCIsICIoSSlaIiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX3NldEJhbmRDb21tYW5kfSwKKyAgICB7ICJnZXRCYW5kQ29tbWFuZCIsICIoKUkiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfZ2V0QmFuZENvbW1hbmR9LAogICAgIHsgInNldE51bUFsbG93ZWRDaGFubmVsc0NvbW1hbmQiLCAiKEkpWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9zZXROdW1BbGxvd2VkQ2hhbm5lbHNDb21tYW5kIH0sCiAgICAgeyAiZ2V0TnVtQWxsb3dlZENoYW5uZWxzQ29tbWFuZCIsICIoKUkiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfZ2V0TnVtQWxsb3dlZENoYW5uZWxzQ29tbWFuZCB9LAogICAgIHsgInNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZUNvbW1hbmQiLCAiKEkpWiIsCkBAIC01ODAsOCArNjM1LDggQEAKICAgICB7ICJzZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kIiwgIihJKVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZCB9LAogICAgIHsgImFkZFRvQmxhY2tsaXN0Q29tbWFuZCIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfYWRkVG9CbGFja2xpc3RDb21tYW5kIH0sCiAgICAgeyAiY2xlYXJCbGFja2xpc3RDb21tYW5kIiwgIigpWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9jbGVhckJsYWNrbGlzdENvbW1hbmQgfSwKLSAgICB7ICJzZXRTdXNwZW5kT3B0aW1pemF0aW9uc0NvbW1hbmQiLCAiKFopWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9zZXRTdXNwZW5kT3B0aW1pemF0aW9uc0NvbW1hbmR9LAotCisgICAgeyAic3RhcnRXcHNQYmNDb21tYW5kIiwgIihMamF2YS9sYW5nL1N0cmluZzspWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV93cHNQYmNDb21tYW5kIH0sCisgICAgeyAic3RhcnRXcHNQaW5Db21tYW5kIiwgIihMamF2YS9sYW5nL1N0cmluZztJKVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfd3BzUGluQ29tbWFuZCB9LAogICAgIHsgImRvRGhjcFJlcXVlc3QiLCAiKExhbmRyb2lkL25ldC9EaGNwSW5mbzspWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9kb0RoY3BSZXF1ZXN0IH0sCiAgICAgeyAiZ2V0RGhjcEVycm9yIiwgIigpTGphdmEvbGFuZy9TdHJpbmc7IiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX2dldERoY3BFcnJvciB9LAogfTsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfb3NfRGVidWcuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9vc19EZWJ1Zy5jcHAKaW5kZXggM2VlNDA0YS4uNGE4NzdkMiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9vc19EZWJ1Zy5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9vc19EZWJ1Zy5jcHAKQEAgLTE0LDYgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNkZWZpbmUgTE9HX1RBRyAiYW5kcm9pZC5vcy5EZWJ1ZyIKICNpbmNsdWRlICJKTklIZWxwLmgiCiAjaW5jbHVkZSAiam5pLmgiCiAjaW5jbHVkZSAidXRpbHMvbWlzYy5oIgpAQCAtMjQsNiArMjUsOCBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAKICNpZmRlZiBIQVZFX01BTExPQ19ICiAjaW5jbHVkZSA8bWFsbG9jLmg+CkBAIC0yNzQsNiArMjc3LDE3NiBAQAogamludCBhbmRyb2lkX29zX0RlYnVnX2dldFByb3h5T2JqZWN0Q291bnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopOwogamludCBhbmRyb2lkX29zX0RlYnVnX2dldERlYXRoT2JqZWN0Q291bnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopOwogCisKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKy8qIHB1bGxlZCBvdXQgb2YgYmlvbmljICovCitleHRlcm4gIkMiIHZvaWQgZ2V0X21hbGxvY19sZWFrX2luZm8odWludDhfdCoqIGluZm8sIHNpemVfdCogb3ZlcmFsbFNpemUsCisgICAgc2l6ZV90KiBpbmZvU2l6ZSwgc2l6ZV90KiB0b3RhbE1lbW9yeSwgc2l6ZV90KiBiYWNrdHJhY2VTaXplKTsKK2V4dGVybiAiQyIgdm9pZCBmcmVlX21hbGxvY19sZWFrX2luZm8odWludDhfdCogaW5mbyk7CisjZGVmaW5lIFNJWkVfRkxBR19aWUdPVEVfQ0hJTEQgICgxPDwzMSkKKyNkZWZpbmUgQkFDS1RSQUNFX1NJWkUgICAgICAgICAgMzIKKworLyoKKyAqIFRoaXMgaXMgYSBxc29ydCgpIGNhbGxiYWNrLgorICoKKyAqIFNlZSBkdW1wTmF0aXZlSGVhcCgpIGZvciBjb21tZW50cyBhYm91dCB0aGUgZGF0YSBmb3JtYXQgYW5kIHNvcnQgb3JkZXIuCisgKi8KK3N0YXRpYyBpbnQgY29tcGFyZUhlYXBSZWNvcmRzKGNvbnN0IHZvaWQqIHZyZWMxLCBjb25zdCB2b2lkKiB2cmVjMikKK3sKKyAgICBjb25zdCBzaXplX3QqIHJlYzEgPSAoY29uc3Qgc2l6ZV90KikgdnJlYzE7CisgICAgY29uc3Qgc2l6ZV90KiByZWMyID0gKGNvbnN0IHNpemVfdCopIHZyZWMyOworICAgIHNpemVfdCBzaXplMSA9ICpyZWMxOworICAgIHNpemVfdCBzaXplMiA9ICpyZWMyOworCisgICAgaWYgKHNpemUxIDwgc2l6ZTIpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIGlmIChzaXplMSA+IHNpemUyKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpbnRwdHJfdCogYnQxID0gKGludHB0cl90KikocmVjMSArIDIpOworICAgIGludHB0cl90KiBidDIgPSAoaW50cHRyX3QqKShyZWMyICsgMik7CisgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwgQkFDS1RSQUNFX1NJWkU7IGlkeCsrKSB7CisgICAgICAgIGludHB0cl90IGFkZHIxID0gYnQxW2lkeF07CisgICAgICAgIGludHB0cl90IGFkZHIyID0gYnQyW2lkeF07CisgICAgICAgIGlmIChhZGRyMSA9PSBhZGRyMikgeworICAgICAgICAgICAgaWYgKGFkZHIxID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWRkcjEgPCBhZGRyMikgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgaWYgKGFkZHIxID4gYWRkcjIpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgZ2V0X21hbGxvY19sZWFrX2luZm8oKSBjYWxsIHJldHVybnMgYW4gYXJyYXkgb2Ygc3RydWN0cyB0aGF0CisgKiBsb29rIGxpa2UgdGhpczoKKyAqCisgKiAgIHNpemVfdCBzaXplCisgKiAgIHNpemVfdCBhbGxvY2F0aW9ucworICogICBpbnRwdHJfdCBiYWNrdHJhY2VbMzJdCisgKgorICogInNpemUiIGlzIHRoZSBzaXplIG9mIHRoZSBhbGxvY2F0aW9uLCAiYmFja3RyYWNlIiBpcyBhIGZpeGVkLXNpemUKKyAqIGFycmF5IG9mIGZ1bmN0aW9uIHBvaW50ZXJzLCBhbmQgImFsbG9jYXRpb25zIiBpcyB0aGUgbnVtYmVyIG9mCisgKiBhbGxvY2F0aW9ucyB3aXRoIHRoZSBleGFjdCBzYW1lIHNpemUgYW5kIGJhY2t0cmFjZS4KKyAqCisgKiBUaGUgZW50cmllcyBhcmUgc29ydGVkIGJ5IGRlc2NlbmRpbmcgdG90YWwgc2l6ZSAoaS5lLiBzaXplKmFsbG9jYXRpb25zKQorICogdGhlbiBhbGxvY2F0aW9uIGNvdW50LiAgRm9yIGJlc3QgcmVzdWx0cyB3aXRoICJkaWZmIiB3ZSdkIGxpa2UgdG8gc29ydAorICogcHJpbWFyaWx5IGJ5IGluZGl2aWR1YWwgc2l6ZSB0aGVuIHN0YWNrIHRyYWNlLiAgU2luY2UgdGhlIGVudHJpZXMgYXJlCisgKiBmaXhlZC1zaXplLCBhbmQgd2UncmUgYWxsb3dlZCAoYnkgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24pIHRvIG1hbmdsZQorICogdGhlbSwgd2UgY2FuIGRvIHRoaXMgaW4gcGxhY2UuCisgKi8KK3N0YXRpYyB2b2lkIGR1bXBOYXRpdmVIZWFwKEZJTEUqIGZwKQoreworICAgIHVpbnQ4X3QqIGluZm8gPSBOVUxMOworICAgIHNpemVfdCBvdmVyYWxsU2l6ZSwgaW5mb1NpemUsIHRvdGFsTWVtb3J5LCBiYWNrdHJhY2VTaXplOworCisgICAgZ2V0X21hbGxvY19sZWFrX2luZm8oJmluZm8sICZvdmVyYWxsU2l6ZSwgJmluZm9TaXplLCAmdG90YWxNZW1vcnksCisgICAgICAgICZiYWNrdHJhY2VTaXplKTsKKyAgICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoZnAsICJOYXRpdmUgaGVhcCBkdW1wIG5vdCBhdmFpbGFibGUuIFRvIGVuYWJsZSwgcnVuIHRoZXNlIgorICAgICAgICAgICAgICAgICAgICAiIGNvbW1hbmRzIChyZXF1aXJlcyByb290KTpcbiIpOworICAgICAgICBmcHJpbnRmKGZwLCAiJCBhZGIgc2hlbGwgc2V0cHJvcCBsaWJjLmRlYnVnLm1hbGxvYyAxXG4iKTsKKyAgICAgICAgZnByaW50ZihmcCwgIiQgYWRiIHNoZWxsIHN0b3BcbiIpOworICAgICAgICBmcHJpbnRmKGZwLCAiJCBhZGIgc2hlbGwgc3RhcnRcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGFzc2VydChpbmZvU2l6ZSAhPSAwKTsKKyAgICBhc3NlcnQob3ZlcmFsbFNpemUgJSBpbmZvU2l6ZSA9PSAwKTsKKworICAgIGZwcmludGYoZnAsICJBbmRyb2lkIE5hdGl2ZSBIZWFwIER1bXAgdjEuMFxuXG4iKTsKKworICAgIHNpemVfdCByZWNvcmRDb3VudCA9IG92ZXJhbGxTaXplIC8gaW5mb1NpemU7CisgICAgZnByaW50ZihmcCwgIlRvdGFsIG1lbW9yeTogJXp1XG4iLCB0b3RhbE1lbW9yeSk7CisgICAgZnByaW50ZihmcCwgIkFsbG9jYXRpb24gcmVjb3JkczogJXpkXG4iLCByZWNvcmRDb3VudCk7CisgICAgaWYgKGJhY2t0cmFjZVNpemUgIT0gQkFDS1RSQUNFX1NJWkUpIHsKKyAgICAgICAgZnByaW50ZihmcCwgIldBUk5JTkc6IG1pc21hdGNoZWQgYmFja3RyYWNlIHNpemVzICglZCB2cy4gJWQpXG4iLAorICAgICAgICAgICAgYmFja3RyYWNlU2l6ZSwgQkFDS1RSQUNFX1NJWkUpOworICAgIH0KKyAgICBmcHJpbnRmKGZwLCAiXG4iKTsKKworICAgIC8qIHJlLXNvcnQgdGhlIGVudHJpZXMgKi8KKyAgICBxc29ydChpbmZvLCByZWNvcmRDb3VudCwgaW5mb1NpemUsIGNvbXBhcmVIZWFwUmVjb3Jkcyk7CisKKyAgICAvKiBkdW1wIHRoZSBlbnRyaWVzIHRvIHRoZSBmaWxlICovCisgICAgY29uc3QgdWludDhfdCogcHRyID0gaW5mbzsKKyAgICBmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCByZWNvcmRDb3VudDsgaWR4KyspIHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSAqKHNpemVfdCopIHB0cjsKKyAgICAgICAgc2l6ZV90IGFsbG9jYXRpb25zID0gKihzaXplX3QqKSAocHRyICsgc2l6ZW9mKHNpemVfdCkpOworICAgICAgICBpbnRwdHJfdCogYmFja3RyYWNlID0gKGludHB0cl90KikgKHB0ciArIHNpemVvZihzaXplX3QpICogMik7CisKKyAgICAgICAgZnByaW50ZihmcCwgInogJWQgIHN6ICU4enUgIG51bSAlNHp1ICBidCIsCisgICAgICAgICAgICAgICAgKHNpemUgJiBTSVpFX0ZMQUdfWllHT1RFX0NISUxEKSAhPSAwLAorICAgICAgICAgICAgICAgIHNpemUgJiB+U0laRV9GTEFHX1pZR09URV9DSElMRCwKKyAgICAgICAgICAgICAgICBhbGxvY2F0aW9ucyk7CisgICAgICAgIGZvciAoc2l6ZV90IGJ0ID0gMDsgYnQgPCBiYWNrdHJhY2VTaXplOyBidCsrKSB7CisgICAgICAgICAgICBpZiAoYmFja3RyYWNlW2J0XSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIgJTA4eCIsIGJhY2t0cmFjZVtidF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZwcmludGYoZnAsICJcbiIpOworCisgICAgICAgIHB0ciArPSBpbmZvU2l6ZTsKKyAgICB9CisKKyAgICBmcHJpbnRmKGZwLCAiRU5EXG4iKTsKKyAgICBmcmVlX21hbGxvY19sZWFrX2luZm8oaW5mbyk7Cit9CisjZW5kaWYgLypIQVZFX0FORFJPSURfT1MqLworCisvKgorICogRHVtcCB0aGUgbmF0aXZlIGhlYXAsIHdyaXRpbmcgaHVtYW4tcmVhZGFibGUgb3V0cHV0IHRvIHRoZSBzcGVjaWZpZWQKKyAqIGZpbGUgZGVzY3JpcHRvci4KKyAqLworc3RhdGljIHZvaWQgYW5kcm9pZF9vc19EZWJ1Z19kdW1wTmF0aXZlSGVhcChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwKKyAgICBqb2JqZWN0IGZpbGVEZXNjcmlwdG9yKQoreworICAgIGlmIChmaWxlRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93TnVsbFBvaW50ZXJFeGNlcHRpb24oZW52LCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQgb3JpZ0ZkID0gam5pR2V0RkRGcm9tRmlsZURlc2NyaXB0b3IoZW52LCBmaWxlRGVzY3JpcHRvcik7CisgICAgaWYgKG9yaWdGZCA8IDApIHsKKyAgICAgICAgam5pVGhyb3dSdW50aW1lRXhjZXB0aW9uKGVudiwgIkludmFsaWQgZmlsZSBkZXNjcmlwdG9yIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBkdXAoKSB0aGUgZGVzY3JpcHRvciBzbyB3ZSBkb24ndCBjbG9zZSB0aGUgb3JpZ2luYWwgd2l0aCBmY2xvc2UoKSAqLworICAgIGludCBmZCA9IGR1cChvcmlnRmQpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgTE9HVygiZHVwKCVkKSBmYWlsZWQ6ICVzXG4iLCBvcmlnRmQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGpuaVRocm93UnVudGltZUV4Y2VwdGlvbihlbnYsICJkdXAoKSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEZJTEUqIGZwID0gZmRvcGVuKGZkLCAidyIpOworICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgIExPR1coImZkb3BlbiglZCkgZmFpbGVkOiAlc1xuIiwgZmQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgam5pVGhyb3dSdW50aW1lRXhjZXB0aW9uKGVudiwgImZkb3BlbigpIGZhaWxlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgiTmF0aXZlIGhlYXAgZHVtcCBzdGFydGluZy4uLlxuIik7CisgICAgZHVtcE5hdGl2ZUhlYXAoZnApOworICAgIExPR0QoIk5hdGl2ZSBoZWFwIGR1bXAgY29tcGxldGUuXG4iKTsKKyNlbHNlCisgICAgZnByaW50ZihmcCwgIk5hdGl2ZSBoZWFwIGR1bXAgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtXG4iKTsKKyNlbmRpZgorCisgICAgZmNsb3NlKGZwKTsKK30KKworCiAvKgogICogSk5JIHJlZ2lzdHJhdGlvbi4KICAqLwpAQCAtMjg5LDYgKzQ2Miw4IEBACiAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfb3NfRGVidWdfZ2V0RGlydHlQYWdlcyB9LAogICAgIHsgImdldE1lbW9yeUluZm8iLCAgICAgICAgICAiKElMYW5kcm9pZC9vcy9EZWJ1ZyRNZW1vcnlJbmZvOylWIiwKICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF9vc19EZWJ1Z19nZXREaXJ0eVBhZ2VzUGlkIH0sCisgICAgeyAiZHVtcE5hdGl2ZUhlYXAiLCAgICAgICAgICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7KVYiLAorICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX29zX0RlYnVnX2R1bXBOYXRpdmVIZWFwIH0sCiAgICAgeyAiZ2V0QmluZGVyU2VudFRyYW5zYWN0aW9ucyIsICIoKUkiLAogICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX29zX0RlYnVnX2dldEJpbmRlclNlbnRUcmFuc2FjdGlvbnMgfSwKICAgICB7ICJnZXRCaW5kZXJSZWNlaXZlZFRyYW5zYWN0aW9ucyIsICIoKUkiLApAQCAtMzIwLDQgKzQ5NSw0IEBACiAgICAgcmV0dXJuIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJhbmRyb2lkL29zL0RlYnVnIiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7CiB9CiAKLX07Cit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9vc19GaWxlVXRpbHMuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9vc19GaWxlVXRpbHMuY3BwCmluZGV4IDIxY2I5MTkuLmQzZmFhMmYgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfb3NfRmlsZVV0aWxzLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX29zX0ZpbGVVdGlscy5jcHAKQEAgLTExMyw2ICsxMTMsMTEgQEAKICAgICAjZW5kaWYKIH0KIAoramludCBhbmRyb2lkX29zX0ZpbGVVdGlsc19zZXRVTWFzayhKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgamludCBtYXNrKQoreworICAgIHJldHVybiB1bWFzayhtYXNrKTsKK30KKwogamludCBhbmRyb2lkX29zX0ZpbGVVdGlsc19nZXRGYXRWb2x1bWVJZChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwganN0cmluZyBwYXRoKQogewogICAgICNpZiBIQVZFX0FORFJPSURfT1MKQEAgLTE3MCw2ICsxNzUsNyBAQAogc3RhdGljIGNvbnN0IEpOSU5hdGl2ZU1ldGhvZCBtZXRob2RzW10gPSB7CiAgICAgeyJzZXRQZXJtaXNzaW9ucyIsICAiKExqYXZhL2xhbmcvU3RyaW5nO0lJSSlJIiwgKHZvaWQqKWFuZHJvaWRfb3NfRmlsZVV0aWxzX3NldFBlcm1pc3Npb25zfSwKICAgICB7ImdldFBlcm1pc3Npb25zIiwgICIoTGphdmEvbGFuZy9TdHJpbmc7W0kpSSIsICh2b2lkKilhbmRyb2lkX29zX0ZpbGVVdGlsc19nZXRQZXJtaXNzaW9uc30sCisgICAgeyJzZXRVTWFzayIsICAgICAgICAiKEkpSSIsICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9vc19GaWxlVXRpbHNfc2V0VU1hc2t9LAogICAgIHsiZ2V0RmF0Vm9sdW1lSWQiLCAgIihMamF2YS9sYW5nL1N0cmluZzspSSIsICh2b2lkKilhbmRyb2lkX29zX0ZpbGVVdGlsc19nZXRGYXRWb2x1bWVJZH0sCiAgICAgeyJnZXRGaWxlU3RhdHVzIiwgICIoTGphdmEvbGFuZy9TdHJpbmc7TGFuZHJvaWQvb3MvRmlsZVV0aWxzJEZpbGVTdGF0dXM7KVoiLCAodm9pZCopYW5kcm9pZF9vc19GaWxlVXRpbHNfZ2V0RmlsZVN0YXR1c30sCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9vc19QYXJjZWxGaWxlRGVzY3JpcHRvci5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yLmNwcAppbmRleCA4NDhhNTdhLi5lY2VlZjFjIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yLmNwcApAQCAtNjYsNiArNjYsMjYgQEAKICAgICByZXR1cm4gZmlsZURlc2NyaXB0b3JDbG9uZTsKIH0KIAorc3RhdGljIGludCBhbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yX2NyZWF0ZVBpcGVOYXRpdmUoSk5JRW52KiBlbnYsCisgICAgam9iamVjdCBjbGF6eiwgam9iamVjdEFycmF5IG91dEZkcykKK3sKKyAgICBpbnQgZmRzWzJdOworICAgIGlmIChwaXBlKGZkcykgPCAwKSB7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorCisgICAgZm9yIChpbnQgaT0wOyBpPDI7IGkrKykgeworICAgICAgICBqb2JqZWN0IGZkT2JqID0gZW52LT5OZXdPYmplY3QoZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ2xhc3MsCisgICAgICAgICAgICAgICAgZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ29uc3RydWN0b3IpOworICAgICAgICBpZiAoZmRPYmogIT0gTlVMTCkgeworICAgICAgICAgICAgZW52LT5TZXRJbnRGaWVsZChmZE9iaiwgZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tRGVzY3JpcHRvciwgZmRzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChvdXRGZHMsIGksIGZkT2JqKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGppbnQgZ2V0RmQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopCiB7CiAgICAgam9iamVjdCBkZXNjcmlwdG9yID0gZW52LT5HZXRPYmplY3RGaWVsZChjbGF6eiwgZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tRmlsZURlc2NyaXB0b3IpOwpAQCAtMTA5LDYgKzEyOSw4IEBACiBzdGF0aWMgY29uc3QgSk5JTmF0aXZlTWV0aG9kIGdQYXJjZWxGaWxlRGVzY3JpcHRvck1ldGhvZHNbXSA9IHsKICAgICB7ImdldEZpbGVEZXNjcmlwdG9yRnJvbVNvY2tldCIsICIoTGphdmEvbmV0L1NvY2tldDspTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7IiwKICAgICAgICAgKHZvaWQqKWFuZHJvaWRfb3NfUGFyY2VsRmlsZURlc2NyaXB0b3JfZ2V0RmlsZURlc2NyaXB0b3JGcm9tU29ja2V0fSwKKyAgICB7ImNyZWF0ZVBpcGVOYXRpdmUiLCAiKFtMamF2YS9pby9GaWxlRGVzY3JpcHRvcjspSSIsCisgICAgICAgICh2b2lkKilhbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yX2NyZWF0ZVBpcGVOYXRpdmV9LAogICAgIHsiZ2V0U3RhdFNpemUiLCAiKClKIiwKICAgICAgICAgKHZvaWQqKWFuZHJvaWRfb3NfUGFyY2VsRmlsZURlc2NyaXB0b3JfZ2V0U3RhdFNpemV9LAogICAgIHsic2Vla1RvIiwgIihKKUoiLApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcC5jcHAKaW5kZXggZDhlMDQ5ZC4uYTliOTFiMDQgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wLmNwcApAQCAtNTAsNiArNTAsOCBAQAogc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25EZXZpY2VDcmVhdGVkOwogc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25EZXZpY2VSZW1vdmVkOwogc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25EZXZpY2VEaXNjb25uZWN0UmVxdWVzdGVkOworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25OZXR3b3JrRGV2aWNlRGlzY29ubmVjdGVkOworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25OZXR3b3JrRGV2aWNlQ29ubmVjdGVkOwogCiBzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkNyZWF0ZVBhaXJlZERldmljZVJlc3VsdDsKIHN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uQ3JlYXRlRGV2aWNlUmVzdWx0OwpAQCAtNjYsNiArNjgsMTEgQEAKIHN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uQWdlbnRBdXRob3JpemU7CiBzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkFnZW50Q2FuY2VsOwogCitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbklucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2VkOworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQ7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vblBhbkRldmljZVByb3BlcnR5Q2hhbmdlZDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uUGFuRGV2aWNlQ29ubmVjdGlvblJlc3VsdDsKKwogdHlwZWRlZiBldmVudF9sb29wX25hdGl2ZV9kYXRhX3QgbmF0aXZlX2RhdGFfdDsKIAogI2RlZmluZSBFVkVOVF9MT09QX1JFRlMgMTAKQEAgLTk3LDYgKzEwNCwxMCBAQAogICAgIG1ldGhvZF9vbkRldmljZVJlbW92ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25EZXZpY2VSZW1vdmVkIiwgIihMamF2YS9sYW5nL1N0cmluZzspViIpOwogICAgIG1ldGhvZF9vbkRldmljZURpc2Nvbm5lY3RSZXF1ZXN0ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25EZXZpY2VEaXNjb25uZWN0UmVxdWVzdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZzspViIpOworICAgIG1ldGhvZF9vbk5ldHdvcmtEZXZpY2VDb25uZWN0ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25OZXR3b3JrRGV2aWNlQ29ubmVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztJKVYiKTsKKyAgICBtZXRob2Rfb25OZXR3b3JrRGV2aWNlRGlzY29ubmVjdGVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uTmV0d29ya0RldmljZURpc2Nvbm5lY3RlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKIAogICAgIG1ldGhvZF9vbkNyZWF0ZVBhaXJlZERldmljZVJlc3VsdCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbkNyZWF0ZVBhaXJlZERldmljZVJlc3VsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIpOwpAQCAtMTIwLDYgKzEzMSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIpOwogICAgIG1ldGhvZF9vbkRpc3BsYXlQYXNza2V5ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uRGlzcGxheVBhc3NrZXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0lJKVYiKTsKKyAgICBtZXRob2Rfb25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbklucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKKyAgICBtZXRob2Rfb25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO1opViIpOworICAgIG1ldGhvZF9vblBhbkRldmljZVByb3BlcnR5Q2hhbmdlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvblBhbkRldmljZVByb3BlcnR5Q2hhbmdlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvU3RyaW5nOylWIik7CisgICAgbWV0aG9kX29uUGFuRGV2aWNlQ29ubmVjdGlvblJlc3VsdCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO1opViIpOwogICAgIG1ldGhvZF9vblJlcXVlc3RPb2JEYXRhID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uUmVxdWVzdE9vYkRhdGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIpOwogCkBAIC0yMzIsNiArMjUxLDI3IEBACiAgICAgICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGRidXNfYnVzX2FkZF9tYXRjaChuYXQtPmNvbm4sCisgICAgICAgICAgICAgICAgInR5cGU9J3NpZ25hbCcsaW50ZXJmYWNlPSciQkxVRVpfREJVU19CQVNFX0lGQyIuSW5wdXQnIiwKKyAgICAgICAgICAgICAgICAmZXJyKTsKKyAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CisgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBKTklfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZGJ1c19idXNfYWRkX21hdGNoKG5hdC0+Y29ubiwKKyAgICAgICAgICAgICAgICAidHlwZT0nc2lnbmFsJyxpbnRlcmZhY2U9JyJCTFVFWl9EQlVTX0JBU0VfSUZDIi5OZXR3b3JrJyIsCisgICAgICAgICAgICAgICAgJmVycik7CisgICAgICAgIGlmIChkYnVzX2Vycm9yX2lzX3NldCgmZXJyKSkgeworICAgICAgICAgICAgTE9HX0FORF9GUkVFX0RCVVNfRVJST1IoJmVycik7CisgICAgICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGRidXNfYnVzX2FkZF9tYXRjaChuYXQtPmNvbm4sCisgICAgICAgICAgICAgICAgInR5cGU9J3NpZ25hbCcsaW50ZXJmYWNlPSciQkxVRVpfREJVU19CQVNFX0lGQyIuTmV0d29ya1NlcnZlciciLAorICAgICAgICAgICAgICAgICZlcnIpOworICAgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQoJmVycikpIHsKKyAgICAgICAgICAgIExPR19BTkRfRlJFRV9EQlVTX0VSUk9SKCZlcnIpOworICAgICAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBkYnVzX2J1c19hZGRfbWF0Y2gobmF0LT5jb25uLAogICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nb3JnLmJsdWV6LkF1ZGlvU2luayciLAogICAgICAgICAgICAgICAgICZlcnIpOwogICAgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQoJmVycikpIHsKQEAgLTM5MCwxMyArNDMwLDMxIEBACiAgICAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZ2lzdGVyX29iamVjdF9wYXRoKG5hdC0+Y29ubiwgYWdlbnRfcGF0aCk7CiAKICAgICAgICAgZGJ1c19idXNfcmVtb3ZlX21hdGNoKG5hdC0+Y29ubiwKLSAgICAgICAgICAgICAgICAidHlwZT0nc2lnbmFsJyxpbnRlcmZhY2U9J29yZy5ibHVlei5BdWRpb1NpbmsnIiwKKyAgICAgICAgICAgICAgICAidHlwZT0nc2lnbmFsJyxpbnRlcmZhY2U9JyJCTFVFWl9EQlVTX0JBU0VfSUZDIi5BdWRpb1NpbmsnIiwKICAgICAgICAgICAgICAgICAmZXJyKTsKICAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CiAgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKICAgICAgICAgfQogICAgICAgICBkYnVzX2J1c19yZW1vdmVfbWF0Y2gobmF0LT5jb25uLAotICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nb3JnLmJsdWV6LkRldmljZSciLAorICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nIkJMVUVaX0RCVVNfQkFTRV9JRkMiLkRldmljZSciLAorICAgICAgICAgICAgICAgICZlcnIpOworICAgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQoJmVycikpIHsKKyAgICAgICAgICAgIExPR19BTkRfRlJFRV9EQlVTX0VSUk9SKCZlcnIpOworICAgICAgICB9CisgICAgICAgIGRidXNfYnVzX3JlbW92ZV9tYXRjaChuYXQtPmNvbm4sCisgICAgICAgICAgICAgICAgInR5cGU9J3NpZ25hbCcsaW50ZXJmYWNlPSciQkxVRVpfREJVU19CQVNFX0lGQyIuSW5wdXQnIiwKKyAgICAgICAgICAgICAgICAmZXJyKTsKKyAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CisgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKKyAgICAgICAgfQorICAgICAgICBkYnVzX2J1c19yZW1vdmVfbWF0Y2gobmF0LT5jb25uLAorICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nIkJMVUVaX0RCVVNfQkFTRV9JRkMiLk5ldHdvcmsnIiwKKyAgICAgICAgICAgICAgICAmZXJyKTsKKyAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CisgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKKyAgICAgICAgfQorICAgICAgICBkYnVzX2J1c19yZW1vdmVfbWF0Y2gobmF0LT5jb25uLAorICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nIkJMVUVaX0RCVVNfQkFTRV9JRkMiLk5ldHdvcmtTZXJ2ZXInIiwKICAgICAgICAgICAgICAgICAmZXJyKTsKICAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CiAgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKQEAgLTg2MSw2ICs5MTksNzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfb25EZXZpY2VEaXNjb25uZWN0UmVxdWVzdGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+TmV3U3RyaW5nVVRGKHJlbW90ZV9kZXZpY2VfcGF0aCkpOwogICAgICAgICBnb3RvIHN1Y2Nlc3M7CisgICAgfSBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsKG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5ibHVlei5JbnB1dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9wZXJ0eUNoYW5nZWQiKSkgeworCisgICAgICAgIGpvYmplY3RBcnJheSBzdHJfYXJyYXkgPQorICAgICAgICAgICAgICAgICAgICBwYXJzZV9pbnB1dF9wcm9wZXJ0eV9jaGFuZ2UoZW52LCBtc2cpOworICAgICAgICBpZiAoc3RyX2FycmF5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNfcGF0aCA9IGRidXNfbWVzc2FnZV9nZXRfcGF0aChtc2cpOworICAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfb25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5OZXdTdHJpbmdVVEYoY19wYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2FycmF5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR19BTkRfRlJFRV9EQlVTX0VSUk9SX1dJVEhfTVNHKCZlcnIsIG1zZyk7CisgICAgICAgIH0KKyAgICAgICAgZ290byBzdWNjZXNzOworICAgIH0gZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5ibHVlei5OZXR3b3JrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvcGVydHlDaGFuZ2VkIikpIHsKKworICAgICAgIGpvYmplY3RBcnJheSBzdHJfYXJyYXkgPQorICAgICAgICAgICAgICAgICAgIHBhcnNlX3Bhbl9wcm9wZXJ0eV9jaGFuZ2UoZW52LCBtc2cpOworICAgICAgIGlmIChzdHJfYXJyYXkgIT0gTlVMTCkgeworICAgICAgICAgICBjb25zdCBjaGFyICpjX3BhdGggPSBkYnVzX21lc3NhZ2VfZ2V0X3BhdGgobXNnKTsKKyAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9vblBhbkRldmljZVByb3BlcnR5Q2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPk5ld1N0cmluZ1VURihjX3BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9hcnJheSk7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgTE9HX0FORF9GUkVFX0RCVVNfRVJST1JfV0lUSF9NU0coJmVyciwgbXNnKTsKKyAgICAgICB9CisgICAgICAgZ290byBzdWNjZXNzOworICAgIH0gZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5ibHVlei5OZXR3b3JrU2VydmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGV2aWNlRGlzY29ubmVjdGVkIikpIHsKKyAgICAgICBjaGFyICpjX2FkZHJlc3M7CisgICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfYXJncyhtc2csICZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmNfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpIHsKKyAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9vbk5ldHdvcmtEZXZpY2VEaXNjb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5OZXdTdHJpbmdVVEYoY19hZGRyZXNzKSk7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgTE9HX0FORF9GUkVFX0RCVVNfRVJST1JfV0lUSF9NU0coJmVyciwgbXNnKTsKKyAgICAgICB9CisgICAgICAgZ290byBzdWNjZXNzOworICAgIH0gZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5ibHVlei5OZXR3b3JrU2VydmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGV2aWNlQ29ubmVjdGVkIikpIHsKKyAgICAgICBjaGFyICpjX2FkZHJlc3M7CisgICAgICAgY2hhciAqY19pZmFjZTsKKyAgICAgICB1aW50MTZfdCB1dWlkOworCisgICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfYXJncyhtc2csICZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmNfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmY19pZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfVUlOVDE2LCAmdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpIHsKKyAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9vbk5ldHdvcmtEZXZpY2VDb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5OZXdTdHJpbmdVVEYoY19hZGRyZXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPk5ld1N0cmluZ1VURihjX2lmYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkKTsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUl9XSVRIX01TRygmZXJyLCBtc2cpOworICAgICAgIH0KKyAgICAgICBnb3RvIHN1Y2Nlc3M7CiAgICAgfQogCiAgICAgcmV0ID0gYTJkcF9ldmVudF9maWx0ZXIobXNnLCBlbnYpOwpAQCAtMTI3MCw2ICsxMzk1LDU3IEBACiAgICAgZW52LT5EZWxldGVMb2NhbFJlZihhZGRyKTsKICAgICBmcmVlKHVzZXIpOwogfQorCit2b2lkIG9uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm4pIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CisKKyAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSAobmF0aXZlX2RhdGFfdCAqKW47CisgICAgY29uc3QgY2hhciAqcGF0aCA9IChjb25zdCBjaGFyICopdXNlcjsKKyAgICBEQnVzRXJyb3IgZXJyOworICAgIGRidXNfZXJyb3JfaW5pdCgmZXJyKTsKKyAgICBKTklFbnYgKmVudjsKKyAgICBuYXQtPnZtLT5HZXRFbnYoKHZvaWQqKikmZW52LCBuYXQtPmVudlZlcik7CisKKyAgICBib29sIHJlc3VsdCA9IEpOSV9UUlVFOworICAgIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UoJmVyciwgbXNnKSkgeworICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKKyAgICAgICAgcmVzdWx0ID0gSk5JX0ZBTFNFOworICAgIH0KKyAgICBMT0dWKCIuLi4gRGV2aWNlIFBhdGggPSAlcywgcmVzdWx0ID0gJWQiLCBwYXRoLCByZXN1bHQpOworICAgIGpzdHJpbmcgalBhdGggPSBlbnYtPk5ld1N0cmluZ1VURihwYXRoKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG5hdC0+bWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfb25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICBqUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisgICAgZW52LT5EZWxldGVMb2NhbFJlZihqUGF0aCk7CisgICAgZnJlZSh1c2VyKTsKK30KKwordm9pZCBvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQoREJ1c01lc3NhZ2UgKm1zZywgdm9pZCAqdXNlciwgdm9pZCAqbikgeworICAgIExPR1YoX19GVU5DVElPTl9fKTsKKworICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IChuYXRpdmVfZGF0YV90ICopbjsKKyAgICBjb25zdCBjaGFyICpwYXRoID0gKGNvbnN0IGNoYXIgKil1c2VyOworICAgIERCdXNFcnJvciBlcnI7CisgICAgZGJ1c19lcnJvcl9pbml0KCZlcnIpOworICAgIEpOSUVudiAqZW52OworICAgIG5hdC0+dm0tPkdldEVudigodm9pZCoqKSZlbnYsIG5hdC0+ZW52VmVyKTsKKworICAgIGJvb2wgcmVzdWx0ID0gSk5JX1RSVUU7CisgICAgaWYgKGRidXNfc2V0X2Vycm9yX2Zyb21fbWVzc2FnZSgmZXJyLCBtc2cpKSB7CisgICAgICAgIExPR19BTkRfRlJFRV9EQlVTX0VSUk9SKCZlcnIpOworICAgICAgICByZXN1bHQgPSBKTklfRkFMU0U7CisgICAgfQorICAgIExPR1YoIi4uLiBQYW4gRGV2aWNlIFBhdGggPSAlcywgcmVzdWx0ID0gJWQiLCBwYXRoLCByZXN1bHQpOworICAgIGpzdHJpbmcgalBhdGggPSBlbnYtPk5ld1N0cmluZ1VURihwYXRoKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG5hdC0+bWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfb25QYW5EZXZpY2VDb25uZWN0aW9uUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgalBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoalBhdGgpOworICAgIGZyZWUodXNlcik7Cit9CisKICNlbmRpZgogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPSB7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwCmluZGV4IGRhYTU5YTYuLjMzN2RjY2MgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwCkBAIC0xNiw2ICsxNiwxMSBAQAogCiAjZGVmaW5lIERCVVNfQURBUFRFUl9JRkFDRSBCTFVFWl9EQlVTX0JBU0VfSUZDICIuQWRhcHRlciIKICNkZWZpbmUgREJVU19ERVZJQ0VfSUZBQ0UgQkxVRVpfREJVU19CQVNFX0lGQyAiLkRldmljZSIKKyNkZWZpbmUgREJVU19JTlBVVF9JRkFDRSBCTFVFWl9EQlVTX0JBU0VfSUZDICIuSW5wdXQiCisjZGVmaW5lIERCVVNfTkVUV09SS19JRkFDRSBCTFVFWl9EQlVTX0JBU0VfSUZDICIuTmV0d29yayIKKyNkZWZpbmUgREJVU19ORVRXT1JLU0VSVkVSX0lGQUNFIEJMVUVaX0RCVVNfQkFTRV9JRkMgIi5OZXR3b3JrU2VydmVyIgorCisKICNkZWZpbmUgTE9HX1RBRyAiQmx1ZXRvb3RoU2VydmljZS5jcHAiCiAKICNpbmNsdWRlICJhbmRyb2lkX2JsdWV0b290aF9jb21tb24uaCIKQEAgLTY4LDYgKzczLDkgQEAKIHZvaWQgb25DcmVhdGVQYWlyZWREZXZpY2VSZXN1bHQoREJ1c01lc3NhZ2UgKm1zZywgdm9pZCAqdXNlciwgdm9pZCAqbmF0KTsKIHZvaWQgb25EaXNjb3ZlclNlcnZpY2VzUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm5hdCk7CiB2b2lkIG9uQ3JlYXRlRGV2aWNlUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm5hdCk7Cit2b2lkIG9uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm5hdCk7Cit2b2lkIG9uQ29ubmVjdFBhblJlc3VsdChEQnVzTWVzc2FnZSAqbXNnLCB2b2lkICp1c2VyLCB2b2lkICpuKTsKK3ZvaWQgb25QYW5EZXZpY2VDb25uZWN0aW9uUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm5hdCk7CiAKIAogLyoqIEdldCBuYXRpdmUgZGF0YSBzdG9yZWQgaW4gdGhlIG9wYXF1ZSAoSmF2YSBjb2RlIG1haW50YWluZWQpIHBvaW50ZXIgbU5hdGl2ZURhdGEKQEAgLTk5MCw2ICs5OTgsMTYwIEBACiAgICAgcmV0dXJuIEpOSV9GQUxTRTsKIH0KIAorc3RhdGljIGpib29sZWFuIGNvbm5lY3RJbnB1dERldmljZU5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgcGF0aCkgeworICAgIExPR1YoX19GVU5DVElPTl9fKTsKKyNpZmRlZiBIQVZFX0JMVUVUT09USAorICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7CisgICAgam9iamVjdCBldmVudExvb3AgPSBlbnYtPkdldE9iamVjdEZpZWxkKG9iamVjdCwgZmllbGRfbUV2ZW50TG9vcCk7CisgICAgc3RydWN0IGV2ZW50X2xvb3BfbmF0aXZlX2RhdGFfdCAqZXZlbnRMb29wTmF0ID0KKyAgICAgICAgICAgIGdldF9FdmVudExvb3BfbmF0aXZlX2RhdGEoZW52LCBldmVudExvb3ApOworCisgICAgaWYgKG5hdCAmJiBldmVudExvb3BOYXQpIHsKKyAgICAgICAgY29uc3QgY2hhciAqY19wYXRoID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhwYXRoLCBOVUxMKTsKKworICAgICAgICBpbnQgbGVuID0gZW52LT5HZXRTdHJpbmdMZW5ndGgocGF0aCkgKyAxOworICAgICAgICBjaGFyICpjb250ZXh0X3BhdGggPSAoY2hhciAqKWNhbGxvYyhsZW4sIHNpemVvZihjaGFyKSk7CisgICAgICAgIHN0cmxjcHkoY29udGV4dF9wYXRoLCBjX3BhdGgsIGxlbik7ICAvLyBmb3IgY2FsbGJhY2sKKworICAgICAgICBib29sIHJldCA9IGRidXNfZnVuY19hcmdzX2FzeW5jKGVudiwgbmF0LT5jb25uLCAtMSwgb25JbnB1dERldmljZUNvbm5lY3Rpb25SZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9wYXRoLCBldmVudExvb3BOYXQsIGNfcGF0aCwgREJVU19JTlBVVF9JRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29ubmVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworCisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHBhdGgsIGNfcGF0aCk7CisgICAgICAgIHJldHVybiByZXQgPyBKTklfVFJVRSA6IEpOSV9GQUxTRTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gSk5JX0ZBTFNFOworfQorCitzdGF0aWMgamJvb2xlYW4gZGlzY29ubmVjdElucHV0RGV2aWNlTmF0aXZlKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3RyaW5nIHBhdGgpIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CisjaWZkZWYgSEFWRV9CTFVFVE9PVEgKKyAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOworICAgIGpvYmplY3QgZXZlbnRMb29wID0gZW52LT5HZXRPYmplY3RGaWVsZChvYmplY3QsIGZpZWxkX21FdmVudExvb3ApOworICAgIHN0cnVjdCBldmVudF9sb29wX25hdGl2ZV9kYXRhX3QgKmV2ZW50TG9vcE5hdCA9CisgICAgICAgICAgICBnZXRfRXZlbnRMb29wX25hdGl2ZV9kYXRhKGVudiwgZXZlbnRMb29wKTsKKworICAgIGlmIChuYXQgJiYgZXZlbnRMb29wTmF0KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNfcGF0aCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMocGF0aCwgTlVMTCk7CisKKyAgICAgICAgaW50IGxlbiA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHBhdGgpICsgMTsKKyAgICAgICAgY2hhciAqY29udGV4dF9wYXRoID0gKGNoYXIgKiljYWxsb2MobGVuLCBzaXplb2YoY2hhcikpOworICAgICAgICBzdHJsY3B5KGNvbnRleHRfcGF0aCwgY19wYXRoLCBsZW4pOyAgLy8gZm9yIGNhbGxiYWNrCisKKyAgICAgICAgYm9vbCByZXQgPSBkYnVzX2Z1bmNfYXJnc19hc3luYyhlbnYsIG5hdC0+Y29ubiwgLTEsIG9uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfcGF0aCwgZXZlbnRMb29wTmF0LCBjX3BhdGgsIERCVVNfSU5QVVRfSUZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2Nvbm5lY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhwYXRoLCBjX3BhdGgpOworICAgICAgICByZXR1cm4gcmV0ID8gSk5JX1RSVUUgOiBKTklfRkFMU0U7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIEpOSV9GQUxTRTsKK30KKworc3RhdGljIGpib29sZWFuIHNldEJsdWV0b290aFRldGhlcmluZ05hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QsIGpib29sZWFuIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3RyaW5nIHNyY19yb2xlLCBqc3RyaW5nIGJyaWRnZSkgeworICAgIExPR1YoX19GVU5DVElPTl9fKTsKKyNpZmRlZiBIQVZFX0JMVUVUT09USAorICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7CisgICAgaWYgKG5hdCkgeworICAgICAgICBEQnVzTWVzc2FnZSAqcmVwbHk7CisgICAgICAgIGNvbnN0IGNoYXIgKmNfcm9sZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc3JjX3JvbGUsIE5VTEwpOworICAgICAgICBjb25zdCBjaGFyICpjX2JyaWRnZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoYnJpZGdlLCBOVUxMKTsKKyAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICBMT0dFKCJzZXRCbHVldG9vdGhUZXRoZXJpbmdOYXRpdmUgdHJ1ZSIpOworICAgICAgICAgICAgcmVwbHkgPSBkYnVzX2Z1bmNfYXJncyhlbnYsIG5hdC0+Y29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYWRhcHRlcl9wYXRoKGVudiwgb2JqZWN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX05FVFdPUktTRVJWRVJfSUZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ2lzdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmY19yb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZjX2JyaWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJzZXRCbHVldG9vdGhUZXRoZXJpbmdOYXRpdmUgZmFsc2UiKTsKKyAgICAgICAgICAgIHJlcGx5ID0gZGJ1c19mdW5jX2FyZ3MoZW52LCBuYXQtPmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2FkYXB0ZXJfcGF0aChlbnYsIG9iamVjdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19ORVRXT1JLU0VSVkVSX0lGQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnJlZ2lzdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmY19yb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKyAgICAgICAgfQorICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhzcmNfcm9sZSwgY19yb2xlKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoYnJpZGdlLCBjX2JyaWRnZSk7CisgICAgICAgIHJldHVybiByZXBseSA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBKTklfRkFMU0U7Cit9CisKK3N0YXRpYyBqYm9vbGVhbiBjb25uZWN0UGFuRGV2aWNlTmF0aXZlKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iamVjdCwganN0cmluZyBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBzcmNSb2xlLCBqc3RyaW5nIGRzdFJvbGUpIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CisjaWZkZWYgSEFWRV9CTFVFVE9PVEgKKyAgICBMT0dFKCJjb25uZWN0UGFuRGV2aWNlTmF0aXZlIik7CisgICAgbmF0aXZlX2RhdGFfdCAqbmF0ID0gZ2V0X25hdGl2ZV9kYXRhKGVudiwgb2JqZWN0KTsKKyAgICBqb2JqZWN0IGV2ZW50TG9vcCA9IGVudi0+R2V0T2JqZWN0RmllbGQob2JqZWN0LCBmaWVsZF9tRXZlbnRMb29wKTsKKyAgICBzdHJ1Y3QgZXZlbnRfbG9vcF9uYXRpdmVfZGF0YV90ICpldmVudExvb3BOYXQgPQorICAgICAgICAgICAgZ2V0X0V2ZW50TG9vcF9uYXRpdmVfZGF0YShlbnYsIGV2ZW50TG9vcCk7CisKKyAgICBpZiAobmF0ICYmIGV2ZW50TG9vcE5hdCkgeworICAgICAgICBjb25zdCBjaGFyICpjX3BhdGggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHBhdGgsIE5VTEwpOworICAgICAgICBjb25zdCBjaGFyICpzcmMgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHNyY1JvbGUsIE5VTEwpOworICAgICAgICBjb25zdCBjaGFyICpkc3QgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGRzdFJvbGUsIE5VTEwpOworCisgICAgICAgIGludCBsZW4gPSBlbnYtPkdldFN0cmluZ0xlbmd0aChwYXRoKSArIDE7CisgICAgICAgIGNoYXIgKmNvbnRleHRfcGF0aCA9IChjaGFyICopY2FsbG9jKGxlbiwgc2l6ZW9mKGNoYXIpKTsKKyAgICAgICAgc3RybGNweShjb250ZXh0X3BhdGgsIGNfcGF0aCwgbGVuKTsgIC8vIGZvciBjYWxsYmFjaworCisgICAgICAgIGJvb2wgcmV0ID0gZGJ1c19mdW5jX2FyZ3NfYXN5bmMoZW52LCBuYXQtPmNvbm4sIC0xLG9uUGFuRGV2aWNlQ29ubmVjdGlvblJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfcGF0aCwgZXZlbnRMb29wTmF0LCBjX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX05FVFdPUktfSUZBQ0UsICJDb25uZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworCisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHBhdGgsIGNfcGF0aCk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNyY1JvbGUsIHNyYyk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGRzdFJvbGUsIGRzdCk7CisgICAgICAgIHJldHVybiByZXQgPyBKTklfVFJVRSA6IEpOSV9GQUxTRTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gSk5JX0ZBTFNFOworfQorCitzdGF0aWMgamJvb2xlYW4gZGlzY29ubmVjdFBhbkRldmljZU5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBwYXRoKSB7CisgICAgTE9HVihfX0ZVTkNUSU9OX18pOworI2lmZGVmIEhBVkVfQkxVRVRPT1RICisgICAgTE9HRSgiZGlzY29ubmVjdFBhbkRldmljZU5hdGl2ZSIpOworICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7CisgICAgam9iamVjdCBldmVudExvb3AgPSBlbnYtPkdldE9iamVjdEZpZWxkKG9iamVjdCwgZmllbGRfbUV2ZW50TG9vcCk7CisgICAgc3RydWN0IGV2ZW50X2xvb3BfbmF0aXZlX2RhdGFfdCAqZXZlbnRMb29wTmF0ID0KKyAgICAgICAgICAgIGdldF9FdmVudExvb3BfbmF0aXZlX2RhdGEoZW52LCBldmVudExvb3ApOworCisgICAgaWYgKG5hdCAmJiBldmVudExvb3BOYXQpIHsKKyAgICAgICAgY29uc3QgY2hhciAqY19wYXRoID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhwYXRoLCBOVUxMKTsKKworICAgICAgICBpbnQgbGVuID0gZW52LT5HZXRTdHJpbmdMZW5ndGgocGF0aCkgKyAxOworICAgICAgICBjaGFyICpjb250ZXh0X3BhdGggPSAoY2hhciAqKWNhbGxvYyhsZW4sIHNpemVvZihjaGFyKSk7CisgICAgICAgIHN0cmxjcHkoY29udGV4dF9wYXRoLCBjX3BhdGgsIGxlbik7ICAvLyBmb3IgY2FsbGJhY2sKKworICAgICAgICBib29sIHJldCA9IGRidXNfZnVuY19hcmdzX2FzeW5jKGVudiwgbmF0LT5jb25uLCAtMSxvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9wYXRoLCBldmVudExvb3BOYXQsIGNfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX05FVFdPUktfSUZBQ0UsICJEaXNjb25uZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMocGF0aCwgY19wYXRoKTsKKyAgICAgICAgcmV0dXJuIHJldCA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBKTklfRkFMU0U7Cit9CisKIHN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9IHsKICAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCiAgICAgeyJjbGFzc0luaXROYXRpdmUiLCAiKClWIiwgKHZvaWQqKWNsYXNzSW5pdE5hdGl2ZX0sCkBAIC0xMDM5LDggKzEyMDEsMTggQEAKICAgICB7ImFkZFJmY29tbVNlcnZpY2VSZWNvcmROYXRpdmUiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0pKUylJIiwgKHZvaWQgKilhZGRSZmNvbW1TZXJ2aWNlUmVjb3JkTmF0aXZlfSwKICAgICB7InJlbW92ZVNlcnZpY2VSZWNvcmROYXRpdmUiLCAiKEkpWiIsICh2b2lkICopcmVtb3ZlU2VydmljZVJlY29yZE5hdGl2ZX0sCiAgICAgeyJzZXRMaW5rVGltZW91dE5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7SSlaIiwgKHZvaWQgKilzZXRMaW5rVGltZW91dE5hdGl2ZX0sCisgICAgLy8gSElEIGZ1bmN0aW9ucworICAgIHsiY29ubmVjdElucHV0RGV2aWNlTmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZzspWiIsICh2b2lkICopY29ubmVjdElucHV0RGV2aWNlTmF0aXZlfSwKKyAgICB7ImRpc2Nvbm5lY3RJbnB1dERldmljZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiLCAodm9pZCAqKWRpc2Nvbm5lY3RJbnB1dERldmljZU5hdGl2ZX0sCisKKyAgICB7InNldEJsdWV0b290aFRldGhlcmluZ05hdGl2ZSIsICIoWkxqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylaIiwKKyAgICAgICAgICAgICAgKHZvaWQgKilzZXRCbHVldG9vdGhUZXRoZXJpbmdOYXRpdmV9LAorICAgIHsiY29ubmVjdFBhbkRldmljZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVoiLAorICAgICAgICAgICAgICAodm9pZCAqKWNvbm5lY3RQYW5EZXZpY2VOYXRpdmV9LAorICAgIHsiZGlzY29ubmVjdFBhbkRldmljZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiLCAodm9pZCAqKWRpc2Nvbm5lY3RQYW5EZXZpY2VOYXRpdmV9LAogfTsKIAorCiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoU2VydmljZShKTklFbnYgKmVudikgewogICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwKICAgICAgICAgICAgICAgICAiYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoU2VydmljZSIsIHNNZXRob2RzLCBORUxFTShzTWV0aG9kcykpOwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcy5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTIxYWY0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcy5jcHAKQEAgLTAsMCArMSw1MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL0pOSUhlbHAuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDx1dGlscy9SZXNvdXJjZVR5cGVzLmg+CisKKyNpbmNsdWRlIDxTa0JpdG1hcC5oPgorI2luY2x1ZGUgPFNrQ2FudmFzLmg+CisjaW5jbHVkZSA8U2tNYXRyaXguaD4KKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisjaW5jbHVkZSA8U2tSZWdpb24uaD4KKyNpbmNsdWRlIDxTa1NjYWxlckNvbnRleHQuaD4KKyNpbmNsdWRlIDxTa1RlbXBsYXRlcy5oPgorI2luY2x1ZGUgPFNrWGZlcm1vZGUuaD4KKworI2luY2x1ZGUgPERpc3BsYXlMaXN0UmVuZGVyZXIuaD4KKyNpbmNsdWRlIDxPcGVuR0xEZWJ1Z1JlbmRlcmVyLmg+CisjaW5jbHVkZSA8T3BlbkdMUmVuZGVyZXIuaD4KKyNpbmNsdWRlIDxTa2lhU2hhZGVyLmg+CisjaW5jbHVkZSA8U2tpYUNvbG9yRmlsdGVyLmg+CisjaW5jbHVkZSA8UmVjdC5oPgorCisjaW5jbHVkZSAiVGV4dExheW91dC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIG5hbWVzcGFjZSB1aXJlbmRlcmVyOworCisvKioKKyAqIE5vdGU6IE9wZW5HTFJlbmRlcmVyIEpOSSBsYXllciBpcyBnZW5lcmF0ZWQgYW5kIGNvbXBpbGVkIG9ubHkgb24gc3VwcG9ydGVkCisgKiAgICAgICBkZXZpY2VzLiBUaGlzIG1lYW5zIGFsbCB0aGUgbG9naWMgbXVzdCBiZSBjb21waWxlZCBvbmx5IHdoZW4gdGhlCisgKiAgICAgICBwcmVwcm9jZXNzb3IgdmFyaWFibGUgVVNFX09QRU5HTF9SRU5ERVJFUiBpcyBkZWZpbmVkLgorICovCisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWZpbmVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIERlYnVnCisjZGVmaW5lIERFQlVHX1JFTkRFUkVSIDAKKyNkZWZpbmUgUFJPRklMRV9SRU5ERVJFUiAwCisKKy8vIERlYnVnCisjaWYgREVCVUdfUkVOREVSRVIKKyAgICAjZGVmaW5lIFJFTkRFUkVSX0xPR0QoLi4uKSBMT0dEKF9fVkFfQVJHU19fKQorI2Vsc2UKKyAgICAjZGVmaW5lIFJFTkRFUkVSX0xPR0QoLi4uKQorI2VuZGlmCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEphdmEgQVBJcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgc3RydWN0IHsKKyAgICBqY2xhc3MgY2xheno7CisgICAgam1ldGhvZElEIHNldDsKK30gZ1JlY3RDbGFzc0luZm87CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbnN0cnVjdG9ycworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgT3BlbkdMUmVuZGVyZXIqIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfY3JlYXRlUmVuZGVyZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzKSB7CisgICAgUkVOREVSRVJfTE9HRCgiQ3JlYXRlIE9wZW5HTFJlbmRlcmVyIik7CisjaWYgUFJPRklMRV9SRU5ERVJFUgorICAgIHJldHVybiBuZXcgT3BlbkdMRGVidWdSZW5kZXJlcjsKKyNlbHNlCisgICAgcmV0dXJuIG5ldyBPcGVuR0xSZW5kZXJlcjsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2Rlc3Ryb3lSZW5kZXJlcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIFJFTkRFUkVSX0xPR0QoIkRlc3Ryb3kgT3BlbkdMUmVuZGVyZXIiKTsKKyAgICBkZWxldGUgcmVuZGVyZXI7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNldHVwCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2V0Vmlld3BvcnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KSB7CisgICAgcmVuZGVyZXItPnNldFZpZXdwb3J0KHdpZHRoLCBoZWlnaHQpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3ByZXBhcmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIpIHsKKyAgICByZW5kZXJlci0+cHJlcGFyZSgpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2ZpbmlzaChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIHJlbmRlcmVyLT5maW5pc2goKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19hY3F1aXJlQ29udGV4dChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIHJlbmRlcmVyLT5hY3F1aXJlQ29udGV4dCgpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3JlbGVhc2VDb250ZXh0KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyKSB7CisgICAgcmVuZGVyZXItPnJlbGVhc2VDb250ZXh0KCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN0YXRlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBqaW50IGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2F2ZShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwKKyAgICAgICAgamludCBmbGFncykgeworICAgIHJldHVybiByZW5kZXJlci0+c2F2ZShmbGFncyk7Cit9CisKK3N0YXRpYyBqaW50IGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZ2V0U2F2ZUNvdW50KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5nZXRTYXZlQ291bnQoKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19yZXN0b3JlKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyKSB7CisgICAgcmVuZGVyZXItPnJlc3RvcmUoKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19yZXN0b3JlVG9Db3VudChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamludCBzYXZlQ291bnQpIHsKKyAgICByZW5kZXJlci0+cmVzdG9yZVRvQ291bnQoc2F2ZUNvdW50KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTGF5ZXJzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBqaW50IGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2F2ZUxheWVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXQgbGVmdCwgamZsb2F0IHRvcCwgamZsb2F0IHJpZ2h0LCBqZmxvYXQgYm90dG9tLAorICAgICAgICBTa1BhaW50KiBwYWludCwgamludCBzYXZlRmxhZ3MpIHsKKyAgICByZXR1cm4gcmVuZGVyZXItPnNhdmVMYXllcihsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBhaW50LCBzYXZlRmxhZ3MpOworfQorCitzdGF0aWMgamludCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NhdmVMYXllckFscGhhKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXQgbGVmdCwgamZsb2F0IHRvcCwgamZsb2F0IHJpZ2h0LCBqZmxvYXQgYm90dG9tLAorICAgICAgICBqaW50IGFscGhhLCBqaW50IHNhdmVGbGFncykgeworICAgIHJldHVybiByZW5kZXJlci0+c2F2ZUxheWVyQWxwaGEobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBhbHBoYSwgc2F2ZUZsYWdzKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2xpcHBpbmcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGJvb2wgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19xdWlja1JlamVjdChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSwKKyAgICAgICAgU2tDYW52YXM6OkVkZ2VUeXBlIGVkZ2UpIHsKKyAgICByZXR1cm4gcmVuZGVyZXItPnF1aWNrUmVqZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7Cit9CisKK3N0YXRpYyBib29sIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfY2xpcFJlY3RGKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXQgbGVmdCwgamZsb2F0IHRvcCwgamZsb2F0IHJpZ2h0LCBqZmxvYXQgYm90dG9tLAorICAgICAgICBTa1JlZ2lvbjo6T3Agb3ApIHsKKyAgICByZXR1cm4gcmVuZGVyZXItPmNsaXBSZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgb3ApOworfQorCitzdGF0aWMgYm9vbCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NsaXBSZWN0KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqaW50IGxlZnQsIGppbnQgdG9wLCBqaW50IHJpZ2h0LCBqaW50IGJvdHRvbSwKKyAgICAgICAgU2tSZWdpb246Ok9wIG9wKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5jbGlwUmVjdChmbG9hdChsZWZ0KSwgZmxvYXQodG9wKSwgZmxvYXQocmlnaHQpLCBmbG9hdChib3R0b20pLCBvcCk7Cit9CisKK3N0YXRpYyBib29sIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZ2V0Q2xpcEJvdW5kcyhKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgam9iamVjdCByZWN0KSB7CisgICAgY29uc3QgYW5kcm9pZDo6dWlyZW5kZXJlcjo6UmVjdCYgYm91bmRzKHJlbmRlcmVyLT5nZXRDbGlwQm91bmRzKCkpOworCisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChyZWN0LCBnUmVjdENsYXNzSW5mby5zZXQsCisgICAgICAgICAgICBpbnQoYm91bmRzLmxlZnQpLCBpbnQoYm91bmRzLnRvcCksIGludChib3VuZHMucmlnaHQpLCBpbnQoYm91bmRzLmJvdHRvbSkpOworCisgICAgcmV0dXJuICFib3VuZHMuaXNFbXB0eSgpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUcmFuc2Zvcm1zCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfdHJhbnNsYXRlKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXQgZHgsIGpmbG9hdCBkeSkgeworICAgIHJlbmRlcmVyLT50cmFuc2xhdGUoZHgsIGR5KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19yb3RhdGUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBkZWdyZWVzKSB7CisgICAgcmVuZGVyZXItPnJvdGF0ZShkZWdyZWVzKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zY2FsZShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IHN4LCBqZmxvYXQgc3kpIHsKKyAgICByZW5kZXJlci0+c2NhbGUoc3gsIHN5KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXRNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICByZW5kZXJlci0+c2V0TWF0cml4KG1hdHJpeCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZ2V0TWF0cml4KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa01hdHJpeCogbWF0cml4KSB7CisgICAgcmVuZGVyZXItPmdldE1hdHJpeChtYXRyaXgpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NvbmNhdE1hdHJpeChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tNYXRyaXgqIG1hdHJpeCkgeworICAgIHJlbmRlcmVyLT5jb25jYXRNYXRyaXgobWF0cml4KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRHJhd2luZworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdCaXRtYXAoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgU2tQYWludCogcGFpbnQpIHsKKyAgICByZW5kZXJlci0+ZHJhd0JpdG1hcChiaXRtYXAsIGxlZnQsIHRvcCwgcGFpbnQpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdCaXRtYXBSZWN0KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa0JpdG1hcCogYml0bWFwLAorICAgICAgICBmbG9hdCBzcmNMZWZ0LCBmbG9hdCBzcmNUb3AsIGZsb2F0IHNyY1JpZ2h0LCBmbG9hdCBzcmNCb3R0b20sCisgICAgICAgIGZsb2F0IGRzdExlZnQsIGZsb2F0IGRzdFRvcCwgZmxvYXQgZHN0UmlnaHQsIGZsb2F0IGRzdEJvdHRvbSwgU2tQYWludCogcGFpbnQpIHsKKyAgICByZW5kZXJlci0+ZHJhd0JpdG1hcChiaXRtYXAsIHNyY0xlZnQsIHNyY1RvcCwgc3JjUmlnaHQsIHNyY0JvdHRvbSwKKyAgICAgICAgICAgIGRzdExlZnQsIGRzdFRvcCwgZHN0UmlnaHQsIGRzdEJvdHRvbSwgcGFpbnQpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdCaXRtYXBNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrQml0bWFwKiBiaXRtYXAsIFNrTWF0cml4KiBtYXRyaXgsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgcmVuZGVyZXItPmRyYXdCaXRtYXAoYml0bWFwLCBtYXRyaXgsIHBhaW50KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3UGF0Y2goSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrQml0bWFwKiBiaXRtYXAsIGpieXRlQXJyYXkgY2h1bmtzLAorICAgICAgICBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIFNrUGFpbnQqIHBhaW50KSB7CisgICAgamJ5dGUqIHN0b3JhZ2UgPSBlbnYtPkdldEJ5dGVBcnJheUVsZW1lbnRzKGNodW5rcywgTlVMTCk7CisgICAgUmVzX3BuZ185cGF0Y2gqIHBhdGNoID0gcmVpbnRlcnByZXRfY2FzdDxSZXNfcG5nXzlwYXRjaCo+KHN0b3JhZ2UpOworICAgIFJlc19wbmdfOXBhdGNoOjpkZXNlcmlhbGl6ZShwYXRjaCk7CisKKyAgICByZW5kZXJlci0+ZHJhd1BhdGNoKGJpdG1hcCwgJnBhdGNoLT54RGl2c1swXSwgJnBhdGNoLT55RGl2c1swXSwKKyAgICAgICAgICAgIHBhdGNoLT5udW1YRGl2cywgcGF0Y2gtPm51bVlEaXZzLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBhaW50KTsKKworICAgIGVudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGNodW5rcywgc3RvcmFnZSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0NvbG9yKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpIHsKKyAgICByZW5kZXJlci0+ZHJhd0NvbG9yKGNvbG9yLCBtb2RlKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3UmVjdChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSwKKyAgICAgICAgU2tQYWludCogcGFpbnQpIHsKKyAgICByZW5kZXJlci0+ZHJhd1JlY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBwYWludCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1JlY3RzKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa1JlZ2lvbiogcmVnaW9uLCBTa1BhaW50KiBwYWludCkgeworICAgIFNrUmVnaW9uOjpJdGVyYXRvciBpdCgqcmVnaW9uKTsKKyAgICB3aGlsZSAoIWl0LmRvbmUoKSkgeworICAgICAgICBjb25zdCBTa0lSZWN0JiByID0gaXQucmVjdCgpOworICAgICAgICByZW5kZXJlci0+ZHJhd1JlY3Qoci5mTGVmdCwgci5mVG9wLCByLmZSaWdodCwgci5mQm90dG9tLCBwYWludCk7CisgICAgICAgIGl0Lm5leHQoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1BhdGgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrUGF0aCogcGF0aCwgU2tQYWludCogcGFpbnQpIHsKKyAgICByZW5kZXJlci0+ZHJhd1BhdGgocGF0aCwgcGFpbnQpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdMaW5lcyhKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0QXJyYXkgcG9pbnRzLCBqaW50IG9mZnNldCwgamludCBjb3VudCwgU2tQYWludCogcGFpbnQpIHsKKyAgICBqZmxvYXQqIHN0b3JhZ2UgPSBlbnYtPkdldEZsb2F0QXJyYXlFbGVtZW50cyhwb2ludHMsIE5VTEwpOworCisgICAgcmVuZGVyZXItPmRyYXdMaW5lcyhzdG9yYWdlICsgb2Zmc2V0LCBjb3VudCwgcGFpbnQpOworCisgICAgZW52LT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKHBvaW50cywgc3RvcmFnZSwgMCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNoYWRlcnMgYW5kIGNvbG9yIGZpbHRlcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19yZXNldE1vZGlmaWVycyhKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIHJlbmRlcmVyLT5yZXNldFNoYWRlcigpOworICAgIHJlbmRlcmVyLT5yZXNldENvbG9yRmlsdGVyKCk7CisgICAgcmVuZGVyZXItPnJlc2V0U2hhZG93KCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2V0dXBTaGFkZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNraWFTaGFkZXIqIHNoYWRlcikgeworICAgIHJlbmRlcmVyLT5zZXR1cFNoYWRlcihzaGFkZXIpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldHVwQ29sb3JGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNraWFDb2xvckZpbHRlciogZmlsdGVyKSB7CisgICAgcmVuZGVyZXItPnNldHVwQ29sb3JGaWx0ZXIoZmlsdGVyKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXR1cFNoYWRvdyhKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IHJhZGl1cywgamZsb2F0IGR4LCBqZmxvYXQgZHksIGppbnQgY29sb3IpIHsKKyAgICByZW5kZXJlci0+c2V0dXBTaGFkb3cocmFkaXVzLCBkeCwgZHksIGNvbG9yKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGV4dAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCByZW5kZXJUZXh0KE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgY29uc3QgamNoYXIqIHRleHQsIGludCBjb3VudCwKKyAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBpbnQgZmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgY29uc3QgamNoYXIgKndvcmtUZXh0OworICAgIGpjaGFyKiBidWZmZXIgPSBOVUxMOworICAgIGludDMyX3Qgd29ya0J5dGVzOworICAgIGlmIChUZXh0TGF5b3V0OjpwcmVwYXJlVGV4dChwYWludCwgdGV4dCwgY291bnQsIGZsYWdzLCAmd29ya1RleHQsICZ3b3JrQnl0ZXMsICZidWZmZXIpKSB7CisgICAgICAgIHJlbmRlcmVyLT5kcmF3VGV4dCgoY29uc3QgY2hhciopIHdvcmtUZXh0LCB3b3JrQnl0ZXMsIGNvdW50LCB4LCB5LCBwYWludCk7CisgICAgICAgIGZyZWUoYnVmZmVyKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJlbmRlclRleHRSdW4oT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBjb25zdCBqY2hhciogdGV4dCwKKyAgICAgICAgamludCBzdGFydCwgamludCBjb3VudCwgamludCBjb250ZXh0Q291bnQsIGpmbG9hdCB4LCBqZmxvYXQgeSwKKyAgICAgICAgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgeworICAgIHVpbnQ4X3QgcnRsID0gZmxhZ3MgJiAweDE7CisgICAgaWYgKHJ0bCkgeworICAgICAgICBTa0F1dG9TVE1hbGxvYzw4MCwgamNoYXI+IGJ1ZmZlcihjb250ZXh0Q291bnQpOworICAgICAgICBqY2hhciogc2hhcGVkID0gYnVmZmVyLmdldCgpOworICAgICAgICBpZiAoVGV4dExheW91dDo6cHJlcGFyZVJ0bFRleHRSdW4odGV4dCwgc3RhcnQsIGNvdW50LCBjb250ZXh0Q291bnQsIHNoYXBlZCkpIHsKKyAgICAgICAgICAgIHJlbmRlcmVyLT5kcmF3VGV4dCgoY29uc3QgY2hhciopIHNoYXBlZCwgY291bnQgPDwgMSwgY291bnQsIHgsIHksIHBhaW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR1coImRyYXdUZXh0UnVuIGVycm9yIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZW5kZXJlci0+ZHJhd1RleHQoKGNvbnN0IGNoYXIqKSAodGV4dCArIHN0YXJ0KSwgY291bnQgPDwgMSwgY291bnQsIHgsIHksIHBhaW50KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1RleHRBcnJheShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamNoYXJBcnJheSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwKKyAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBpbnQgZmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7CisgICAgcmVuZGVyVGV4dChyZW5kZXJlciwgdGV4dEFycmF5ICsgaW5kZXgsIGNvdW50LCB4LCB5LCBmbGFncywgcGFpbnQpOworICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIHRleHRBcnJheSwgSk5JX0FCT1JUKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3VGV4dChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwganN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgeworICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOworICAgIHJlbmRlclRleHQocmVuZGVyZXIsIHRleHRBcnJheSArIHN0YXJ0LCBlbmQgLSBzdGFydCwgeCwgeSwgZmxhZ3MsIHBhaW50KTsKKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0UnVuQXJyYXkoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCisgICAgICAgIGludCBjb250ZXh0SW5kZXgsIGludCBjb250ZXh0Q291bnQsIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGRpckZsYWdzLAorICAgICAgICBTa1BhaW50KiBwYWludCkgeworICAgIGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOworICAgIHJlbmRlclRleHRSdW4ocmVuZGVyZXIsIHRleHRBcnJheSArIGNvbnRleHRJbmRleCwgaW5kZXggLSBjb250ZXh0SW5kZXgsCisgICAgICAgICAgICBjb3VudCwgY29udGV4dENvdW50LCB4LCB5LCBkaXJGbGFncywgcGFpbnQpOworICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIHRleHRBcnJheSwgSk5JX0FCT1JUKTsKKyB9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1RleHRSdW4oSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpzdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgamZsb2F0IHgsIGpmbG9hdCB5LCBpbnQgZGlyRmxhZ3MsCisgICAgICAgIFNrUGFpbnQqIHBhaW50KSB7CisgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7CisgICAgamludCBjb3VudCA9IGVuZCAtIHN0YXJ0OworICAgIGppbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICByZW5kZXJUZXh0UnVuKHJlbmRlcmVyLCB0ZXh0QXJyYXkgKyBjb250ZXh0U3RhcnQsIHN0YXJ0IC0gY29udGV4dFN0YXJ0LAorICAgICAgICAgICAgY291bnQsIGNvbnRleHRDb3VudCwgeCwgeSwgZGlyRmxhZ3MsIHBhaW50KTsKKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEaXNwbGF5IGxpc3RzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBPcGVuR0xSZW5kZXJlciogYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jcmVhdGVEaXNwbGF5TGlzdFJlbmRlcmVyKAorICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMpIHsKKyAgICByZXR1cm4gbmV3IERpc3BsYXlMaXN0UmVuZGVyZXI7Cit9CisKK3N0YXRpYyBEaXNwbGF5TGlzdCogYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jcmVhdGVEaXNwbGF5TGlzdChKTklFbnYqIGVudiwKKyAgICAgICAgam9iamVjdCBjYW52YXMsIERpc3BsYXlMaXN0UmVuZGVyZXIqIHJlbmRlcmVyKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5nZXREaXNwbGF5TGlzdCgpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2Rlc3Ryb3lEaXNwbGF5TGlzdChKTklFbnYqIGVudiwKKyAgICAgICAgam9iamVjdCBjYW52YXMsIERpc3BsYXlMaXN0KiBkaXNwbGF5TGlzdCkgeworICAgIGRlbGV0ZSBkaXNwbGF5TGlzdDsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3RGlzcGxheUxpc3QoSk5JRW52KiBlbnYsCisgICAgICAgIGpvYmplY3QgY2FudmFzLCBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIERpc3BsYXlMaXN0KiBkaXNwbGF5TGlzdCkgeworICAgIGRpc3BsYXlMaXN0LT5yZXBsYXkoKnJlbmRlcmVyKTsKK30KKworI2VuZGlmIC8vIFVTRV9PUEVOR0xfUkVOREVSRVIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29tbW9uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2lzQXZhaWxhYmxlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6KSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIHJldHVybiBKTklfVFJVRTsKKyNlbHNlCisgICAgcmV0dXJuIEpOSV9GQUxTRTsKKyNlbmRpZgorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBKTkkgR2x1ZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjb25zdCBjaGFyKiBjb25zdCBrQ2xhc3NQYXRoTmFtZSA9ICJhbmRyb2lkL3ZpZXcvR0xFUzIwQ2FudmFzIjsKKworc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0geworICAgIHsgIm5Jc0F2YWlsYWJsZSIsICAgICAgICIoKVoiLCAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfaXNBdmFpbGFibGUgfSwKKworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICB7ICJuQ3JlYXRlUmVuZGVyZXIiLCAgICAiKClJIiwgICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NyZWF0ZVJlbmRlcmVyIH0sCisgICAgeyAibkRlc3Ryb3lSZW5kZXJlciIsICAgIihJKVYiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kZXN0cm95UmVuZGVyZXIgfSwKKyAgICB7ICJuU2V0Vmlld3BvcnQiLCAgICAgICAiKElJSSlWIiwgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldFZpZXdwb3J0IH0sCisgICAgeyAiblByZXBhcmUiLCAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19wcmVwYXJlIH0sCisgICAgeyAibkZpbmlzaCIsICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19maW5pc2ggfSwKKyAgICB7ICJuQWNxdWlyZUNvbnRleHQiLCAgICAiKEkpViIsICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2FjcXVpcmVDb250ZXh0IH0sCisgICAgeyAiblJlbGVhc2VDb250ZXh0IiwgICAgIihJKVYiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19yZWxlYXNlQ29udGV4dCB9LAorCisgICAgeyAiblNhdmUiLCAgICAgICAgICAgICAgIihJSSlJIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zYXZlIH0sCisgICAgeyAiblJlc3RvcmUiLCAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19yZXN0b3JlIH0sCisgICAgeyAiblJlc3RvcmVUb0NvdW50IiwgICAgIihJSSlWIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19yZXN0b3JlVG9Db3VudCB9LAorICAgIHsgIm5HZXRTYXZlQ291bnQiLCAgICAgICIoSSlJIiwgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZ2V0U2F2ZUNvdW50IH0sCisKKyAgICB7ICJuU2F2ZUxheWVyIiwgICAgICAgICAiKElGRkZGSUkpSSIsICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NhdmVMYXllciB9LAorICAgIHsgIm5TYXZlTGF5ZXJBbHBoYSIsICAgICIoSUZGRkZJSSlJIiwgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2F2ZUxheWVyQWxwaGEgfSwKKworICAgIHsgIm5RdWlja1JlamVjdCIsICAgICAgICIoSUZGRkZJKVoiLCAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcXVpY2tSZWplY3QgfSwKKyAgICB7ICJuQ2xpcFJlY3QiLCAgICAgICAgICAiKElGRkZGSSlaIiwgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NsaXBSZWN0RiB9LAorICAgIHsgIm5DbGlwUmVjdCIsICAgICAgICAgICIoSUlJSUlJKVoiLCAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfY2xpcFJlY3QgfSwKKworICAgIHsgIm5UcmFuc2xhdGUiLCAgICAgICAgICIoSUZGKVYiLCAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfdHJhbnNsYXRlIH0sCisgICAgeyAiblJvdGF0ZSIsICAgICAgICAgICAgIihJRilWIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19yb3RhdGUgfSwKKyAgICB7ICJuU2NhbGUiLCAgICAgICAgICAgICAiKElGRilWIiwgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NjYWxlIH0sCisKKyAgICB7ICJuU2V0TWF0cml4IiwgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldE1hdHJpeCB9LAorICAgIHsgIm5HZXRNYXRyaXgiLCAgICAgICAgICIoSUkpViIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZ2V0TWF0cml4IH0sCisgICAgeyAibkNvbmNhdE1hdHJpeCIsICAgICAgIihJSSlWIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jb25jYXRNYXRyaXggfSwKKworICAgIHsgIm5EcmF3Qml0bWFwIiwgICAgICAgICIoSUlGRkkpViIsICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0JpdG1hcCB9LAorICAgIHsgIm5EcmF3Qml0bWFwIiwgICAgICAgICIoSUlGRkZGRkZGRkkpViIsICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0JpdG1hcFJlY3QgfSwKKyAgICB7ICJuRHJhd0JpdG1hcCIsICAgICAgICAiKElJSUkpViIsICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdCaXRtYXBNYXRyaXggfSwKKyAgICB7ICJuRHJhd1BhdGNoIiwgICAgICAgICAiKElJW0JGRkZGSSlWIiwgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdQYXRjaCB9LAorICAgIHsgIm5EcmF3Q29sb3IiLCAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0NvbG9yIH0sCisgICAgeyAibkRyYXdSZWN0IiwgICAgICAgICAgIihJRkZGRkkpViIsICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3UmVjdCB9LAorICAgIHsgIm5EcmF3UmVjdHMiLCAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1JlY3RzIH0sCisgICAgeyAibkRyYXdQYXRoIiwgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3UGF0aCB9LAorICAgIHsgIm5EcmF3TGluZXMiLCAgICAgICAgICIoSVtGSUlJKVYiLCAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0xpbmVzIH0sCisKKyAgICB7ICJuUmVzZXRNb2RpZmllcnMiLCAgICAiKEkpViIsICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3Jlc2V0TW9kaWZpZXJzIH0sCisgICAgeyAiblNldHVwU2hhZGVyIiwgICAgICAgIihJSSlWIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXR1cFNoYWRlciB9LAorICAgIHsgIm5TZXR1cENvbG9yRmlsdGVyIiwgICIoSUkpViIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2V0dXBDb2xvckZpbHRlciB9LAorICAgIHsgIm5TZXR1cFNoYWRvdyIsICAgICAgICIoSUZGRkkpViIsICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2V0dXBTaGFkb3cgfSwKKworICAgIHsgIm5EcmF3VGV4dCIsICAgICAgICAgICIoSVtDSUlGRklJKVYiLCAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1RleHRBcnJheSB9LAorICAgIHsgIm5EcmF3VGV4dCIsICAgICAgICAgICIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJRkZJSSlWIiwKKyAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3VGV4dCB9LAorCisgICAgeyAibkRyYXdUZXh0UnVuIiwgICAgICAgIihJW0NJSUlJRkZJSSlWIiwgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3VGV4dFJ1bkFycmF5IH0sCisgICAgeyAibkRyYXdUZXh0UnVuIiwgICAgICAgIihJTGphdmEvbGFuZy9TdHJpbmc7SUlJSUZGSUkpViIsCisgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1RleHRSdW4gfSwKKworICAgIHsgIm5HZXRDbGlwQm91bmRzIiwgICAgICIoSUxhbmRyb2lkL2dyYXBoaWNzL1JlY3Q7KVoiLAorICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2dldENsaXBCb3VuZHMgfSwKKworICAgIHsgIm5DcmVhdGVEaXNwbGF5TGlzdFJlbmRlcmVyIiwgIigpSSIsICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfY3JlYXRlRGlzcGxheUxpc3RSZW5kZXJlciB9LAorICAgIHsgIm5DcmVhdGVEaXNwbGF5TGlzdCIsICAiKEkpSSIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfY3JlYXRlRGlzcGxheUxpc3QgfSwKKyAgICB7ICJuRGVzdHJveURpc3BsYXlMaXN0IiwgIihJKVYiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2Rlc3Ryb3lEaXNwbGF5TGlzdCB9LAorICAgIHsgIm5EcmF3RGlzcGxheUxpc3QiLCAgICAiKElJKVYiLCAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0Rpc3BsYXlMaXN0IH0sCisKKyNlbmRpZgorfTsKKworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICAjZGVmaW5lIEZJTkRfQ0xBU1ModmFyLCBjbGFzc05hbWUpIFwKKyAgICAgICAgICAgIHZhciA9IGVudi0+RmluZENsYXNzKGNsYXNzTmFtZSk7IFwKKyAgICAgICAgICAgIExPR19GQVRBTF9JRighIHZhciwgIlVuYWJsZSB0byBmaW5kIGNsYXNzICIgY2xhc3NOYW1lKTsgXAorICAgICAgICAgICAgdmFyID0gamNsYXNzKGVudi0+TmV3R2xvYmFsUmVmKHZhcikpOworICAgIAorICAgICNkZWZpbmUgR0VUX01FVEhPRF9JRCh2YXIsIGNsYXp6LCBtZXRob2ROYW1lLCBtZXRob2REZXNjcmlwdG9yKSBcCisgICAgICAgICAgICB2YXIgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCBtZXRob2ROYW1lLCBtZXRob2REZXNjcmlwdG9yKTsgXAorICAgICAgICAgICAgTE9HX0ZBVEFMX0lGKCEgdmFyLCAiVW5hYmxlIHRvIGZpbmQgbWV0aG9kICIgbWV0aG9kTmFtZSk7CisjZWxzZQorICAgICNkZWZpbmUgRklORF9DTEFTUyh2YXIsIGNsYXNzTmFtZSkKKyAgICAjZGVmaW5lIEdFVF9NRVRIT0RfSUQodmFyLCBjbGF6eiwgbWV0aG9kTmFtZSwgbWV0aG9kRGVzY3JpcHRvcikKKyNlbmRpZgorCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcyhKTklFbnYqIGVudikgeworICAgIEZJTkRfQ0xBU1MoZ1JlY3RDbGFzc0luZm8uY2xhenosICJhbmRyb2lkL2dyYXBoaWNzL1JlY3QiKTsKKyAgICBHRVRfTUVUSE9EX0lEKGdSZWN0Q2xhc3NJbmZvLnNldCwgZ1JlY3RDbGFzc0luZm8uY2xhenosICJzZXQiLCAiKElJSUkpViIpOworCisgICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LCBrQ2xhc3NQYXRoTmFtZSwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7Cit9CisKK307CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfTW90aW9uRXZlbnQuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X01vdGlvbkV2ZW50LmNwcAppbmRleCA5M2ZkNTRmLi41MzdhYzcyIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfTW90aW9uRXZlbnQuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfdmlld19Nb3Rpb25FdmVudC5jcHAKQEAgLTIyLDEwICsyMiwyNiBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHVpL0lucHV0Lmg+CiAjaW5jbHVkZSAiYW5kcm9pZF92aWV3X01vdGlvbkV2ZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9ncmFwaGljcy9NYXRyaXguaCIKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJTa01hdHJpeC5oIgorI2luY2x1ZGUgIlNrU2NhbGFyLmgiCiAKIC8vIE51bWJlciBvZiBmbG9hdCBpdGVtcyBwZXIgZW50cnkgaW4gYSBEVk0gc2FtcGxlIGRhdGEgYXJyYXkKICNkZWZpbmUgTlVNX1NBTVBMRV9EQVRBIDkKIAorI2RlZmluZSBTQU1QTEVfWCAwCisjZGVmaW5lIFNBTVBMRV9ZIDEKKyNkZWZpbmUgU0FNUExFX1BSRVNTVVJFIDIKKyNkZWZpbmUgU0FNUExFX1NJWkUgMworI2RlZmluZSBTQU1QTEVfVE9VQ0hfTUFKT1IgNAorI2RlZmluZSBTQU1QTEVfVE9VQ0hfTUlOT1IgNQorI2RlZmluZSBTQU1QTEVfVE9PTF9NQUpPUiA2CisjZGVmaW5lIFNBTVBMRV9UT09MX01JTk9SIDcKKyNkZWZpbmUgU0FNUExFX09SSUVOVEFUSU9OIDgKKworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTIzOCw4ICsyNTQsODcgQEAKICAgICB9CiB9CiAKK3N0YXRpYyBpbmxpbmUgZmxvYXQgdHJhbnNmb3JtQW5nbGUoY29uc3QgU2tNYXRyaXgqIG1hdHJpeCwgZmxvYXQgYW5nbGVSYWRpYW5zKSB7CisgICAgLy8gQ29uc3RydWN0IGFuZCB0cmFuc2Zvcm0gYSB2ZWN0b3Igb3JpZW50ZWQgYXQgdGhlIHNwZWNpZmllZCBjbG9ja3dpc2UgYW5nbGUgZnJvbSB2ZXJ0aWNhbC4KKyAgICAvLyBDb29yZGluYXRlIHN5c3RlbTogZG93biBpcyBpbmNyZWFzaW5nIFksIHJpZ2h0IGlzIGluY3JlYXNpbmcgWC4KKyAgICBTa1BvaW50IHZlY3RvcjsKKyAgICB2ZWN0b3IuZlggPSBTa0Zsb2F0VG9TY2FsYXIoc2luZihhbmdsZVJhZGlhbnMpKTsKKyAgICB2ZWN0b3IuZlkgPSBTa0Zsb2F0VG9TY2FsYXIoLSBjb3NmKGFuZ2xlUmFkaWFucykpOworICAgIG1hdHJpeC0+bWFwVmVjdG9ycygmIHZlY3RvciwgMSk7CisKKyAgICAvLyBEZXJpdmUgdGhlIHRyYW5zZm9ybWVkIHZlY3RvcidzIGNsb2Nrd2lzZSBhbmdsZSBmcm9tIHZlcnRpY2FsLgorICAgIGZsb2F0IHJlc3VsdCA9IGF0YW4yZihTa1NjYWxhclRvRmxvYXQodmVjdG9yLmZYKSwgU2tTY2FsYXJUb0Zsb2F0KC0gdmVjdG9yLmZZKSk7CisgICAgaWYgKHJlc3VsdCA8IC0gTV9QSV8yKSB7CisgICAgICAgIHJlc3VsdCArPSBNX1BJOworICAgIH0gZWxzZSBpZiAocmVzdWx0ID4gTV9QSV8yKSB7CisgICAgICAgIHJlc3VsdCAtPSBNX1BJOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfTW90aW9uRXZlbnRfbmF0aXZlVHJhbnNmb3JtKEpOSUVudiogZW52LAorICAgICAgICBqb2JqZWN0IGV2ZW50T2JqLCBqb2JqZWN0IG1hdHJpeE9iaikgeworICAgIFNrTWF0cml4KiBtYXRyaXggPSBhbmRyb2lkX2dyYXBoaWNzX01hdHJpeF9nZXRTa01hdHJpeChlbnYsIG1hdHJpeE9iaik7CisKKyAgICBqZmxvYXQgb2xkWE9mZnNldCA9IGVudi0+R2V0RmxvYXRGaWVsZChldmVudE9iaiwgZ01vdGlvbkV2ZW50Q2xhc3NJbmZvLm1YT2Zmc2V0KTsKKyAgICBqZmxvYXQgb2xkWU9mZnNldCA9IGVudi0+R2V0RmxvYXRGaWVsZChldmVudE9iaiwgZ01vdGlvbkV2ZW50Q2xhc3NJbmZvLm1ZT2Zmc2V0KTsKKyAgICBqaW50IG51bVBvaW50ZXJzID0gZW52LT5HZXRJbnRGaWVsZChldmVudE9iaiwgZ01vdGlvbkV2ZW50Q2xhc3NJbmZvLm1OdW1Qb2ludGVycyk7CisgICAgamludCBudW1TYW1wbGVzID0gZW52LT5HZXRJbnRGaWVsZChldmVudE9iaiwgZ01vdGlvbkV2ZW50Q2xhc3NJbmZvLm1OdW1TYW1wbGVzKTsKKyAgICBqZmxvYXRBcnJheSBkYXRhU2FtcGxlQXJyYXkgPSBqZmxvYXRBcnJheShlbnYtPkdldE9iamVjdEZpZWxkKGV2ZW50T2JqLAorICAgICAgICAgICAgZ01vdGlvbkV2ZW50Q2xhc3NJbmZvLm1EYXRhU2FtcGxlcykpOworICAgIGpmbG9hdCogZGF0YVNhbXBsZXMgPSAoamZsb2F0KillbnYtPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZGF0YVNhbXBsZUFycmF5LCBOVUxMKTsKKworICAgIC8vIFRoZSB0cmlja3kgcGFydCBvZiB0aGlzIGltcGxlbWVudGF0aW9uIGlzIHRvIHByZXNlcnZlIHRoZSB2YWx1ZSBvZgorICAgIC8vIHJhd1ggYW5kIHJhd1kuICBTbyB3ZSBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24gdG8gdGhlIGZpcnN0IHBvaW50CisgICAgLy8gdGhlbiBkZXJpdmUgYW4gYXBwcm9wcmlhdGUgbmV3IFgvWSBvZmZzZXQgdGhhdCB3aWxsIHByZXNlcnZlIHJhd1ggYW5kIHJhd1kuCisgICAgU2tQb2ludCBwb2ludDsKKyAgICBqZmxvYXQgcmF3WCA9IGRhdGFTYW1wbGVzW1NBTVBMRV9YXTsKKyAgICBqZmxvYXQgcmF3WSA9IGRhdGFTYW1wbGVzW1NBTVBMRV9ZXTsKKyAgICBtYXRyaXgtPm1hcFhZKFNrRmxvYXRUb1NjYWxhcihyYXdYICsgb2xkWE9mZnNldCksIFNrRmxvYXRUb1NjYWxhcihyYXdZICsgb2xkWU9mZnNldCksCisgICAgICAgICAgICAmIHBvaW50KTsKKyAgICBqZmxvYXQgbmV3WCA9IFNrU2NhbGFyVG9GbG9hdChwb2ludC5mWCk7CisgICAgamZsb2F0IG5ld1kgPSBTa1NjYWxhclRvRmxvYXQocG9pbnQuZlkpOworICAgIGpmbG9hdCBuZXdYT2Zmc2V0ID0gbmV3WCAtIHJhd1g7CisgICAgamZsb2F0IG5ld1lPZmZzZXQgPSBuZXdZIC0gcmF3WTsKKworICAgIGRhdGFTYW1wbGVzW1NBTVBMRV9PUklFTlRBVElPTl0gPSB0cmFuc2Zvcm1BbmdsZShtYXRyaXgsIGRhdGFTYW1wbGVzW1NBTVBMRV9PUklFTlRBVElPTl0pOworCisgICAgLy8gQXBwbHkgdGhlIHRyYW5zZm9ybWF0aW9uIHRvIGFsbCBzYW1wbGVzLgorICAgIGpmbG9hdCogY3VycmVudERhdGFTYW1wbGUgPSBkYXRhU2FtcGxlczsKKyAgICBqZmxvYXQqIGVuZERhdGFTYW1wbGUgPSBkYXRhU2FtcGxlcyArIG51bVBvaW50ZXJzICogbnVtU2FtcGxlcyAqIE5VTV9TQU1QTEVfREFUQTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGN1cnJlbnREYXRhU2FtcGxlICs9IE5VTV9TQU1QTEVfREFUQTsKKyAgICAgICAgaWYgKGN1cnJlbnREYXRhU2FtcGxlID09IGVuZERhdGFTYW1wbGUpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgamZsb2F0IHggPSBjdXJyZW50RGF0YVNhbXBsZVtTQU1QTEVfWF0gKyBvbGRYT2Zmc2V0OworICAgICAgICBqZmxvYXQgeSA9IGN1cnJlbnREYXRhU2FtcGxlW1NBTVBMRV9ZXSArIG9sZFlPZmZzZXQ7CisgICAgICAgIG1hdHJpeC0+bWFwWFkoU2tGbG9hdFRvU2NhbGFyKHgpLCBTa0Zsb2F0VG9TY2FsYXIoeSksICYgcG9pbnQpOworICAgICAgICBjdXJyZW50RGF0YVNhbXBsZVtTQU1QTEVfWF0gPSBTa1NjYWxhclRvRmxvYXQocG9pbnQuZlgpIC0gbmV3WE9mZnNldDsKKyAgICAgICAgY3VycmVudERhdGFTYW1wbGVbU0FNUExFX1ldID0gU2tTY2FsYXJUb0Zsb2F0KHBvaW50LmZZKSAtIG5ld1lPZmZzZXQ7CisKKyAgICAgICAgY3VycmVudERhdGFTYW1wbGVbU0FNUExFX09SSUVOVEFUSU9OXSA9IHRyYW5zZm9ybUFuZ2xlKG1hdHJpeCwKKyAgICAgICAgICAgICAgICBjdXJyZW50RGF0YVNhbXBsZVtTQU1QTEVfT1JJRU5UQVRJT05dKTsKKyAgICB9CisKKyAgICBlbnYtPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGRhdGFTYW1wbGVBcnJheSwgZGF0YVNhbXBsZXMsIDApOworCisgICAgZW52LT5TZXRGbG9hdEZpZWxkKGV2ZW50T2JqLCBnTW90aW9uRXZlbnRDbGFzc0luZm8ubVhPZmZzZXQsIG5ld1hPZmZzZXQpOworICAgIGVudi0+U2V0RmxvYXRGaWVsZChldmVudE9iaiwgZ01vdGlvbkV2ZW50Q2xhc3NJbmZvLm1ZT2Zmc2V0LCBuZXdZT2Zmc2V0KTsKKworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZGF0YVNhbXBsZUFycmF5KTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNb3Rpb25FdmVudE1ldGhvZHNbXSA9IHsKKyAgICAvKiBuYW1lLCBzaWduYXR1cmUsIGZ1bmNQdHIgKi8KKyAgICB7ICJuYXRpdmVUcmFuc2Zvcm0iLAorICAgICAgICAgICAgIihMYW5kcm9pZC9ncmFwaGljcy9NYXRyaXg7KVYiLAorICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfdmlld19Nb3Rpb25FdmVudF9uYXRpdmVUcmFuc2Zvcm0gfSwKK307CisKICNkZWZpbmUgRklORF9DTEFTUyh2YXIsIGNsYXNzTmFtZSkgXAogICAgICAgICB2YXIgPSBlbnYtPkZpbmRDbGFzcyhjbGFzc05hbWUpOyBcCiAgICAgICAgIExPR19GQVRBTF9JRighIHZhciwgIlVuYWJsZSB0byBmaW5kIGNsYXNzICIgY2xhc3NOYW1lKTsgXApAQCAtMjU4LDYgKzM1MywxMCBAQAogICAgICAgICBMT0dfRkFUQUxfSUYoISB2YXIsICJVbmFibGUgdG8gZmluZCBmaWVsZCAiIGZpZWxkTmFtZSk7CiAKIGludCByZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfTW90aW9uRXZlbnQoSk5JRW52KiBlbnYpIHsKKyAgICBpbnQgcmVzID0gam5pUmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgImFuZHJvaWQvdmlldy9Nb3Rpb25FdmVudCIsCisgICAgICAgICAgICBnTW90aW9uRXZlbnRNZXRob2RzLCBORUxFTShnTW90aW9uRXZlbnRNZXRob2RzKSk7CisgICAgTE9HX0ZBVEFMX0lGKHJlcyA8IDAsICJVbmFibGUgdG8gcmVnaXN0ZXIgbmF0aXZlIG1ldGhvZHMuIik7CisKICAgICBGSU5EX0NMQVNTKGdNb3Rpb25FdmVudENsYXNzSW5mby5jbGF6eiwgImFuZHJvaWQvdmlldy9Nb3Rpb25FdmVudCIpOwogCiAgICAgR0VUX1NUQVRJQ19NRVRIT0RfSUQoZ01vdGlvbkV2ZW50Q2xhc3NJbmZvLm9idGFpbiwgZ01vdGlvbkV2ZW50Q2xhc3NJbmZvLmNsYXp6LApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF92aWV3X1ZpZXdSb290LmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfdmlld19WaWV3Um9vdC5jcHAKaW5kZXggNTE3M2JiOC4uMjk4OGFlOCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF92aWV3X1ZpZXdSb290LmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfVmlld1Jvb3QuY3BwCkBAIC03NiwxMCArNzYsNiBAQAogICAgIGNhbnZhcy0+cmVzdG9yZSgpOwogfQogCi1zdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfVmlld1Jvb3RfYWJhbmRvbkdsQ2FjaGVzKEpOSUVudiogZW52LCBqb2JqZWN0KSB7Ci0gICAgU2tHTENhbnZhczo6QWJhbmRvbkFsbFRleHR1cmVzKCk7Ci19Ci0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC04Nyw5ICs4Myw3IEBACiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKICAgICB7ICAgIm5hdGl2ZVNob3dGUFMiLCAiKExhbmRyb2lkL2dyYXBoaWNzL0NhbnZhcztJKVYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX3ZpZXdfVmlld1Jvb3Rfc2hvd0ZQUyB9LAotICAgIHsgICAibmF0aXZlQWJhbmRvbkdsQ2FjaGVzIiwgIigpViIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF92aWV3X1ZpZXdSb290X2FiYW5kb25HbENhY2hlcyB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfdmlld19WaWV3Um9vdF9zaG93RlBTIH0KIH07CiAKIGludCByZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfVmlld1Jvb3QoSk5JRW52KiBlbnYpIHsKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL0FuZHJvaWQubWsgYi9jb3JlL3Jlcy9BbmRyb2lkLm1rCmluZGV4IDdkMTExNDguLjIyZjRmZGMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL0FuZHJvaWQubWsKKysrIGIvY29yZS9yZXMvQW5kcm9pZC5tawpAQCAtMzMsOCArMzMsMTYgQEAKICMgUFJPRFVDVC1hZ25vc3RpYyByZXNvdXJjZSBkYXRhIGxpa2UgSURzIGFuZCB0eXBlIGRlZmluaXRpb25zLgogTE9DQUxfRVhQT1JUX1BBQ0tBR0VfUkVTT1VSQ0VTIDo9IHRydWUKIAorIyBJbmNsdWRlIHJlc291cmNlcyBnZW5lcmF0ZWQgYnkgc3lzdGVtIFJlbmRlclNjcmlwdCBmaWxlcy4KK2ZyYW1ld29ya19HRU5FUkFURURfU09VUkNFX0RJUiA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEpBVkFfTElCUkFSSUVTLGZyYW1ld29yaywsQ09NTU9OKS9zcmMKK2ZyYW1ld29ya19SZW5kZXJTY3JpcHRfU1RBTVBfRklMRSA6PSAkKGZyYW1ld29ya19HRU5FUkFURURfU09VUkNFX0RJUikvUmVuZGVyU2NyaXB0LnN0YW1wCisjTE9DQUxfUkVTT1VSQ0VfRElSIDo9ICQoZnJhbWV3b3JrX0dFTkVSQVRFRF9TT1VSQ0VfRElSKS9yZW5kZXJzY3JpcHQvcmVzICQoTE9DQUxfUEFUSCkvcmVzCisKIGluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQogCisjIE1ha2Ugc3VyZSB0aGUgc3lzdGVtIC5ycyBmaWxlcyBnZXQgY29tcGlsZWQgYmVmb3JlIGJ1aWxkaW5nIHRoZSBwYWNrYWdlLWV4cG9ydC5hcGsuCisjICQocmVzb3VyY2VfZXhwb3J0X3BhY2thZ2UpOiAkKGZyYW1ld29ya19SZW5kZXJTY3JpcHRfU1RBTVBfRklMRSkKKwogIyBkZWZpbmUgYSBnbG9iYWwgaW50ZXJtZWRpYXRlIHRhcmdldCB0aGF0IG90aGVyIG1vZHVsZSBtYXkgZGVwZW5kIG9uLgogLlBIT05ZOiBmcmFtZXdvcmstcmVzLXBhY2thZ2UtdGFyZ2V0CiBmcmFtZXdvcmstcmVzLXBhY2thZ2UtdGFyZ2V0OiAkKExPQ0FMX0JVSUxUX01PRFVMRSkKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGI5ZWI1ZDYuLjNhMWQ3NmYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtODUsNiArODUsOCBAQAogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5hY3Rpb24uVVNCX0NPTk5FQ1RFRCIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuYWN0aW9uLlVTQl9ESVNDT05ORUNURUQiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmFjdGlvbi5VU0JfU1RBVEUiIC8+CisgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmFjdGlvbi5VU0JfQ0FNRVJBX0FUVEFDSEVEIiAvPgorICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5hY3Rpb24uVVNCX0NBTUVSQV9ERVRBQ0hFRCIgLz4KIAogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iY29tLnRydXN0ZWRsb2dpYy50cnVzdGVkbmZjLmFuZHJvaWQuYWN0aW9uLk5ERUZfVEFHX0RJU0NPVkVSRUQiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJjb20udHJ1c3RlZGxvZ2ljLnRydXN0ZWRuZmMuYW5kcm9pZC5hY3Rpb24uVFJBTlNBQ1RJT05fREVURUNURUQiIC8+CkBAIC0zNzIsNiArMzc0LDEzIEBACiAgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2NfYWNjb3VudE1hbmFnZXJTZXJ2aWNlIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfYWNjb3VudE1hbmFnZXJTZXJ2aWNlIiAvPgogCisgICAgPCEtLSBBbGxvd3MgYW4gaW50ZXJuYWwgdXNlciB0byB1c2UgcHJpdmFsZWRnZWQgQ29ubmVjdGl2aXR5TWFuYWdlcgorICAgIEFQSXMuCisgICAgICAgIEBoaWRlIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkNPTk5FQ1RJVklUWV9JTlRFUk5BTCIKKyAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uR3JvdXA9ImFuZHJvaWQucGVybWlzc2lvbi1ncm91cC5ORVRXT1JLIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlT3JTeXN0ZW0iIC8+CisKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSBQZXJtaXNzaW9ucyBmb3IgYWNjZXNzaW5nIGFjY291bnRzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTEzMTAsNyArMTMxOSw3IEBACiAgICAgICAgICAgICAgICAgYW5kcm9pZDpleGNsdWRlRnJvbVJlY2VudHM9InRydWUiPgogICAgICAgICA8L2FjdGl2aXR5PgogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuUGxhdExvZ29BY3Rpdml0eSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAc3R5bGUvVGhlbWUuTm9UaXRsZUJhci5GdWxsc2NyZWVuIj4KKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAc3R5bGUvVGhlbWUuV2FsbHBhcGVyLk5vVGl0bGVCYXIuRnVsbHNjcmVlbiI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5EaXNhYmxlQ2FyTW9kZUFjdGl2aXR5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9UaGVtZS5Ob0Rpc3BsYXkiCkBAIC0xMzQ3LDYgKzEzNTYsMTAgQEAKICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkFDVElPTl9SRVFVRVNUX1NIVVRET1dOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlJFQk9PVCIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5ERUZBVUxUIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuTmV0SW5pdGlhdGVkQWN0aXZpdHkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL1RoZW1lLkRpYWxvZy5BbGVydCIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL2Fzc2V0cy9pbWFnZXMvY29tYm9ib3gtZGlzYWJsZWQucG5nIGIvY29yZS9yZXMvYXNzZXRzL2ltYWdlcy9jb21ib2JveC1kaXNhYmxlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMjIwZTQuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvYXNzZXRzL2ltYWdlcy9jb21ib2JveC1kaXNhYmxlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9hc3NldHMvaW1hZ2VzL2NvbWJvYm94LW5vSGlnaGxpZ2h0LnBuZyBiL2NvcmUvcmVzL2Fzc2V0cy9pbWFnZXMvY29tYm9ib3gtbm9IaWdobGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmNkZjcyLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL2Fzc2V0cy9pbWFnZXMvY29tYm9ib3gtbm9IaWdobGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvYXNzZXRzL3dlYmtpdC9oeXBoX2VuX1VTLmRpYyBiL2NvcmUvcmVzL2Fzc2V0cy93ZWJraXQvaHlwaF9lbl9VUy5kaWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkxMjA0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL2Fzc2V0cy93ZWJraXQvaHlwaF9lbl9VUy5kaWMKQEAgLTAsMCArMSw5Nzg0IEBACitJU084ODU5LTEKK0xFRlRIWVBIRU5NSU4gMgorUklHSFRIWVBIRU5NSU4gMworLmEyY2g0CisuYWQ0ZGVyCisuYTJkCisuYWQxZDQKKy5hMmYxdAorLmEyZgorLmE0bDN0CisuYW01YXQKKy40YTFtYQorLmFuNWMKKy5hMm4KKy4yYW5nNAorLmFuMWk1bQorLmFuMXQ0CisuYW4zdGUKKy5hbnRpNXMKKy5hbnQyaQorLmE0cjVzMgorLjJhMnIKKy5hcjR0MmllNAorLmFyMXRpCisuYXI0dHkKKy5hczNjCisuYXMxcAorLmEyczFzCisuYXN0ZXI1CisuYTJ0b201CisuYTF0bworLmF1MWQKKy5hdjRpCisuYXduNAorLmJhNGcKKy5iYTVuYQorLmJhMm4KKy5iYXM0ZQorLmJlcjQKKy5iZTVyMWEKKy5iZTNzMW0KKy40YmVzNAorLmI0ZTVzMnRvCisuYnJpMgorLmJ1dDR0aQorLmJ1NHQzdDIKKy5jYW00cGUKKy4xY2EKKy5jYTRtMXAKKy5jYW41YworLmNhMm4KKy5jYXBhNWIKKy5jYTFwYQorLmNhcjVvbAorLmMyYTJyCisuY2E0dAorLmNlNGxhCisuMmNoNAorLmNoaWxsNWkKKy5jaDRpbDIKKy5jaGlsMWwKKy4xY2kyCisuY2l0NXIKKy4yYzFpdAorLmNvM2UyCisuMWNvCisuY280cgorLmNvcjVuMWVyCisuY29ybjJlCisuZGU0bW9pMgorLmQ0ZW0KKy5kZTFtbworLmRlM28KKy5kZTNyMWEKKy5kZTNyMWkKKy5kZTFzNGMKKy5kZXMyCisuZGljMXQyaW81CisuM2RpMmMxdAorLmRvNHQKKy4xZG8KKy5kdTRjCisuMWR1CisuZHU0bTFiNQorLmVhcnRoNQorLmVhcjJ0CisuZTJhMnIKKy5lYXMzaQorLjJlMWI0CisuZWVyNAorLmVnMgorLmUybDVkCisuZWwzZW0KKy5lbmFtMworLmUxbmEKKy5lbjNnCisuZTJuM3MyCisuZXE1dWk1dAorLmUxcQorLmVxdTIKKy5lcTJ1aTIKKy5lcjRyaQorLmVyMXI0CisuZXMzCisuNGV1MworLmV5ZTUKKy5mZXMzCisuZm9yNW1lcgorLjFmbworLmZvMnIKKy5mb3IxbQorLmZvcjJtZQorLjFnYTIKKy5nZTIKKy5nZW4zdDQKKy4xZ2VuCisuZ2U1bzJnCisuMWdlbworLjFnMmk1YQorLmdpNGIKKy5nbzRyCisuMWdvCisuaGFuZDVpCisuaGEybgorLmg0YW5kCisuaGE0bjVrMgorLmhlMgorLmhlcm81aTIKKy5oMmVybworLmgxZXMzCisuaGU0dDMKKy5oaTNiCisuaGkzZXIKKy5oMmllNAorLmhvbjVleQorLmhvMm4KKy5ob24zbworLmhvdjUKKy5pZDRsCisuMmlkCisuaWRvbDMKKy5pMWRvCisuaW0zbQorLmltNXAxaTJuCisuaTRtMXAKKy5pbTJwaQorLmluMQorLmluM2NpCisuMmluZTIKKy40aTRuMmsyCisuMmkybjNzMgorLmlyNXI0CisuNGlyCisuaXM0aQorLmp1M3IKKy5sYTRjeQorLmxhNG0KKy5sYXQ1ZXIKKy5sNGF0aDUKKy5sZTIKKy5sZWc1ZQorLmxlbjQKKy5sZXA1CisubGV2MQorLmwyaTRnCisubGkxZzVhCisubGkybgorLmwyaTNvCisubDFpNHQKKy5tYTFnNWE1CisuMW1hCisubWFsNW8KKy5tYTFuNWEKKy5tYTJuCisubWFyNXRpCisubTJhMnIKKy5tZTIKKy5tZXIzYworLm1lNXRlcgorLm1lMXRlCisubTJpczEKKy5taXM0dDVpCisubW9uM2UKKy4xbW8KKy5tbzJuCisubW8zcm8KKy5tbzJyCisubXU1dGEKKy4xbXUKKy5tdTJ0YTViCisubmk0YworLm9kMgorLm9kMWQ1Cisub2Y1dGUKKy5vMmZ0Cisub3I1YTF0bworLm8xcmEKKy5vcjNjCisub3IxZAorLm9yM3QKKy5vczMKKy5vczR0bAorLjRvdGgzCisub3V0MworLm91MgorLnBlZDVhbAorLjJwMmVkCisucDJlMmQyYQorLnBlNXRlCisucGUydAorLnBlNXRpdAorLnAyaTRlNAorLnBpbzVuNAorLjNwMmkxbworLnBpMnQKKy5wcmUzbQorLnByMgorLnJhNGMKKy5yYW40dAorLnJhMm4KKy5yYXRpbzVuMWEKKy5yYXRpbzJuNAorLnJhMXQyaW8KKy5yZWUyCisucmU1bWl0CisucmVzMgorLnJlNXN0YXQKKy5yZXMydAorLnJlczF0YQorLnIyaTRnCisucmkydDV1Cisucm80cQorLnJvczV0Cisucm93NWQKKy5ydTRkCisuM3M0YzJpM2U0CisuczFjaQorLjVzZTJsMmY1Cisuc2VsMWw1Cisuc2UybgorLnNlNXIyaWU0Cisuc2VyMWkKKy5zMmgyCisuc2kyCisuczNpbmc0CisuMnMxaW4KKy5zdDQKKy5zdGE1YjJsMgorLnMxdGEKKy5zMnRhYgorLnM0eTIKKy4xdGE0CisudGU0CisuM3RlbjVhMm4KKy50ZTFuYQorLnRoMgorLnRpMgorLnRpbDQKKy50aTFtNW81CisuMXRpbQorLnRpbmc0CisuMnQxaW4KKy50NGk0bjVrMgorLnRvMW40YQorLjF0bworLnRvMm4KKy50bzRwCisudG9wNWkKKy50bzJ1NXMKKy50b3UyCisudHJpYjV1dAorLnRyNGliCisudTFuMWEKKy51bjNjZQorLnVuZGVyNQorLnVuMWRlCisudTJuMWUKKy51NG41azIKKy51bjVvCisudW4zdTQKKy51cDMKKy51cmUzCisudXM1YTIKKy4ydXMKKy52ZW40ZGUKKy52ZTVyMWEKKy53aWw1aQorLndpMgorLndpbDIKKy55ZTQKKzRhYi4KK2E1YmFsCithNWJhMm4KK2FiZTIKK2FiNWVyZAorYWIyaTVhCithYjVpMnQ1YWIKK2FiaTJ0CithYmkxdGEKK2FiNWxhdAorYWIybDIKK2FiNW81bDFpegorYWJvbDJpCis0YWJyCithYjVyb2cKK2FiM3VsCithNGMyYTJyCithMWNhCithYzVhcmQKK2FjNWFybworYTVjZW91MgorYWMxZXIKK2E1Y2hlNHQKK2EyY2gKK2FjaGUyCis0YTJjaQorYTNjMmllNAorYTJjMWluCithM2MyaW8KK2FjNXJvYgorYWN0NWlmMgorYTJjMXQKK2FjM3VsCithYzR1bQorYTJkCithZDRkMWluCithZDFkNAorYWQ1ZXIuCisyYWRpCithM2Q0aTNhCithZDNpMWNhCithZGk0ZXIKK2FkMmllNAorYTNkMmlvCithM2RpdAorYTVkaTF1CithZDRsZQorYWQzb3cKK2ExZG8KK2FkNXJhMm4KK2ExZHIKK2FkNHN1CithMmQxczIKKzRhMWR1CithM2R1MmMKK2FkNXVtCithZTRyCithZXIyaTRlNAorYWVyMWkKK2EyZgorYTRmMWY0CithNGdhYgorYTFnYQorYWdhNG4KK2FnNWVsMWwKK2ExZ2U0bworNGFnNGV1CithZzFpCis0YWc0bDIKK2FnMW4KK2EyZ28KKzNhM2c0bzRnCithZzNvM25pCithZ28ybjIKK2E1Z3VlcgorYTJndWUKK2FnNXVsCithNGd5CithM2hhCithM2hlCithNGg0bDQKK2EzaG8KK2FpMgorYTVpMWEKK2EzaWMuCithaTVseQorYTRpNG4KK2FpbjVpbgorYTJpbmkKK2EyaTFuNW8KK2FpdDVlbgorYTJpdGUKK2ExagorYWsxZW4KK2FsNWFiCithbDNhMmQKK2E0bDJhMnIKKzRhbGRpNAorYTJsZAorMmFsZQorYWwzZW5kCithNGxlbnQyaQorYTFsZW4xdAorYTVsZTVvCithbDFpCithbDRpYS4KK2FsMmkxYQorYWwyaTRlNAorYWw1bGV2CithbDFsCithbDJsZQorNGFsbGljCithbGwyaQorNGEybG0KK2E1bG9nLgorYTRseS4KK2ExbHkKKzRhMmx5czQKKzVhNWx5czF0Cis1YWx5dAorM2FseXoKKzRhMW1hCithMm01YWIKK2FtM2FnCithbWE1cmEKK2FtMmEycgorYW01YXNjCithNG1hM3RpcworYTRtNWExdG8KK2FtNWVyMWEKK2FtM2ljCithbTVpZgorYW01aTFseQorYW0xaW4KK2FtMmk0bm8KK2EybW8KK2E1bW8ybgorYW1vcjVpCithbW8ycgorYW1wNWVuCithNG0xcAorYTJuCithbjNhZ2UKK2ExbmEKKzNhbmExbHkKK2EzbjJhMnIKK2FuM2FyM2MKK2FuYXI0aQorYTNuYXRpCithbjJhdAorNGFuZAorYW5kZTRzMgorYW4xZGUKK2FuM2RpczEKK2FuMWRsCithbjRkb3cKK2FuMWRvCithNW5lZQorYTNuZW4KK2FuNWUyc3QuCithMW5lcworYTJuZXN0CithM240ZXUKKzJhbmcKK2FuZzVpZTQKK2FuMWdsMgorYTRuMWljCithM25pZXMKK2FuMmllNAorYW4zaTNmCithbjRpbWUKK2FuMWltCithNW5pbTFpCithNW4yaW5lCithbjFpbgorYW4zaTRvCithM24yaXAKK2FuM2lzMmgKK2FuM2l0CithM25pMXUKK2FuNGtsaQorYTRuazIKK2FuMWsxbAorNWFubml6CithNG4xbjIKK2FubzQKK2FuNW90CithbjRvdGg1CithbjJzYTIKK2EybjFzMgorYW40czFjbworYW5zNGMKK2FuNHMxbjQKK2FuMnNwCithbnMzcG8KK2FuNHN0CithbjRzdTJyCithbjFzdQorYW50YTJsNAorYW4xdAorYW4xdGEKK2FuNHQyaWU0CithbnQyaQorNGFuMXRvCithbjJ0cgorYW40dHc0CithbjN1MWEKK2FuM3VsCithNW51cgorNGFvCithcDJhMnI0CithMXBhCithcDVhdAorYXA1ZXIzbworYTNwaDRlcgorNGFwaGkKK2E0cGlsbGEKK2FwaWwxbAorYXA1aWxsMmEycgorYXAzaTJuCithcDNpMXRhCithM3BpMnR1CithMnAybDIKK2FwbzRjNQorYXA1bzFsYQorYXBvcjVpCithMXA0b3IKK2Fwb3MzdAorYTFwb3MKK2FwczVlNHMKK2EycDFzMgorYXAyc2UKK2EzcHUKK2FxdWU1CithcXUyCisyYTJyCithcjNhMmMxdAorYTVyYWRlCithcmEyZAorYXI1YWRpczEKK2FyMmFkaQorYXIzYWwKK2E1cmFtZTF0ZQorYXJhbTNldAorYXIyYW40ZworYXJhMm4KK2FyYTNwCithcjRhdAorYTVyYTF0MmlvCithcjVhMXQyaXYKK2E1cmF1CithcjVhdjQKK2FyYXc0CithcmJhbDQKK2FyMWIKK2FyNGNoYTJuCithcjFjCithcjNjaGEKK2FyMmNoCithcjVkMmluZQorYXJkMmkKK2FyZDFpbjQKK2FyNGRyCithcjVlYXMKK2EzcmVlCithcjNlbjF0CithNXIyZTJzcworYXI0ZmkKK2FyMWYKK2FyNGY0bDIKK2FyMWkKK2FyNWkyYWwKK2FyMmkzYQorYXIzaTJhMm4KK2Ezcmk1ZXQKK2FyMmllNAorYXI0aW0KK2FyNWluMmF0CithcjJpMW5hCithcjNpMW8KK2FyMml6CithcjJtaQorYXIxbQorYXI1bzVkCithNXJvbmkKK2FybzJuCithM3JvbzIKK2FyMnAKK2FyM3EKK2FycmU0CithcjFyNAorYXI0c2EyCithNHJzMgorYXIyczJoCis0YXMuCithMnM0YWIKK2FzYTIKK2FzM2FuMXQKK2FzYTJuCithc2hpNAorYXMyaAorYTVzaWEuCithczJpMWEKK2Ezc2kxYgorYTNzaWMKKzVhNXNpNHQKK2FzazNpCithc2syCithczRsMgorYTRzb2MKK2Exc28KK2FzNXBoCithczRzMmgKK2Eyc3MKK2FzM3RlbgorYXMxdDRyCithc3UxcjVhCithMXN1Cithc3UycgorYTJ0YQorYXQzYWIybDIKK2EydGFiCithdDVhYworYXQzYWxvCithdGEybAorYXQ1YXAKK2F0ZTVjCithdDVlMmNoCithdDNlMWdvCithdGVnNAorYXQzZW4uCithdDNlcjFhCithdGVyNW4KK2E1dGVyMW5hCithdDNlc3QKK2F0NWV2Cis0YXRoCithdGg1ZW0KK2F0aDJlCithNXRoZTJuCithdDRobworYXRoNW9tCis0YXRpLgorYTV0MmkxYQorYTJ0NWk1YgorYXQxaWMKK2F0M2lmMgorYXRpb241YTJyCithMXQyaW8KK2F0aW8ybgorYXRpbzFuMWEKK2F0M2kxdHUKK2E0dG9nCithMXRvCithMnRvbQorYXQ1b20yaXoKK2E0dG9wCithNHRvczIKK2ExdHIKK2F0NXJvcAorYXQ0c2syCithNHQxczIKK2F0NHRhZworYTR0M3QyCithdDF0YQorYXQ1dGUKK2F0NHRoCithMnR1CithdDV1MWEKK2E0dDV1ZQorYXQzdWwKK2F0M3UxcmEKK2EydHkKK2F1NGIKK2F1Z2gzCithdTNndQorYXU0bDIKK2F1bjVkCithdTNyCithdTVzaTFiCithMnVzCithNHV0NWVuCithdTF0aAorYTJ2YQorYXYzYWc0CithNXZhMm4KK2F2NGU0bm8KK2F2M2VyMWEKK2F2NWVybgorYXY1ZXJ5CithdjFpCithdmk0ZXIKK2F2MmllNAorYXYzaWcKK2F2NW9jCithMXZvcgorM2F3YXkKK2F3M2kyCithdzRseQorYXdzNAorYXg0aTVjCitheDNpCitheDRpZAorYXk1YWwKK2F5ZTQKK2F5czQKK2F6aTRlcgorYTJ6MWkKK2F6MmllNAorYXoyejVpCithNHoxejIKKzViYS4KK2JhZDVnZXIKK2JhMmQKK2JhNGdlCitiYWwxYQorYmFuNWRhZworYmEybgorYjRhbmQKK2JhbjFkMmEKK2JhbjRlCitiYW4zaQorYmFyYmk1CitiMmEycgorYmFyMWIKK2JhcjJpNGEKK2JhcjFpCitiYXM0c2kKK2JhMnNzCisxYmF0CitiYTR6CisyYjFiCitiMmJlCitiM2JlcgorYmJpNG5hCis0YjFkCis0YmUuCitiZWFrNAorYmVhMnQzCis0YmUyZAorYjJlM2QyYQorYmUzZGUKK2I0ZTNkaQorYmUzZ2kKK2JlNWd1CisxYmVsCitiZTFsMmkKK2JlM2xvCis0YmU1bQorYmU1bjJpZworYmU1bnUKKzRiZXM0CitiZTNzcAorYjJlNXN0NHIKKzNiZXQKK2JlMXQ1aXoKK2JlNXRyCitiZTN0dzQKK2JlM3cKK2JlNXkxbzQKKzJiZgorNGIzaAorYmkyYgorYjJpNGQKKzNiMmllNAorYmk1ZW4KK2JpNGVyCisyYjNpZgorMWJpbAorYmkzbDJpegorYmlsMWkKK2JpbjJhNXI0CitiaTFuYQorYjRpbjRkCitiaTVuZXQKK2IyaW5lCitiaTNvMmdyCitiMmlvCitiaTVvdTIKK2JpMnQKKzNiMmkzdDJpbworYmkxdGkKK2JpM3RyCiszYml0NXUxYQorYmkxdHUKK2I1aTR0egorYjFqCitiazQKK2IybDIKK2JsNGF0aDUKK2I0bGUuCitibGVuNAorNWJsZTFzcAorYmxlczIKK2IzbGlzCitiNGxvCitibHVuNHQKKzRiMW0KKzRiM24KK2JuZTVnCiszYm9kCitib2QzaQorYm80ZQorYm9sM2ljCitib2wyaQorYm9tNGJpCitibzRtMWIKK2JvMW40YQorYm8ybgorYm9uNWF0CiszYm9vMgorNWJvci4KKzRiMW8xcmEKK2JvcjVkCis1Ym9yZQorNWJvcmkKKzVib3M0CitiNW8xdGEKK2I0b3RoNQorYm80dG8KK2JvdW4yZDMKK2JvdTIKKzRicAorNGJyaXQKK2JyNG90aDMKKzJiNXMyCitic29yNAorYjFzbworMmJ0CitiMnQ0bAorYjR0bworYjN0cgorYnVmNGZlcjEKK2J1NGYxZgorYnU0Z2EKK2J1M2wyaQorYnUxbWk0CitidTRuCitidW50NGkKK2J1bjF0CitidTNyZQorYnVzNWllNAorYjJ1cworYnVzczRlCitidTJzcworNWJ1c3QKKzRidTF0YQorM2J1MXQyaW8KK2I0dTF0MmkKK2I1dTF0bworYjF2Cis0YjV3Cis1YnkuCitieXM0CisxY2EKK2NhYjNpbgorY2ExYjJsMgorY2EyY2g0CitjYTVkZW4KK2NhMmQKKzRjYWc0CisyYzVhaAorY2EzbGF0CitjYWw0bGEKK2NhbDFsCitjYWwybDVpbjQKK2NhbGwyaQorNGNhbG8KK2M0YW41ZAorY2EybgorY2FuNGUKK2NhNG40aWMKK2NhbjVpcworY2FuM2l6CitjYW40dHkKK2NhbjF0CitjYW55NAorY2E1cGVyCitjYXI1b20KK2MyYTJyCitjYXN0NWVyCitjYXM1dDJpZworY2FzdDJpCis0Y2FzNHkKK2M0YTR0aAorNGNhMXQyaXYKK2NhdjVhbAorY2EydmEKK2MzYworY2NoYTUKK2MyY2gKK2MzYzJpNGEKK2MxY2kKK2Njb20xcGE1CitjMWNvCitjY280bTFwCitjY28ybjQKK2Njb3UzdAorY2NvdTIKKzJjZS4KKzRjZWQuCis0Y2UxZGVuCiszY2VpMgorNWNlbC4KKzNjZWwxbAorMWNlbgorM2NlbmMKKzJjZW40ZQorNGNlbmkKKzNjZW4xdAorM2NlcAorY2U1cmFtCitjZXIxYQorNGNlMXM0YTIKKzNjZXMxc2kKK2MyZTJzcworY2VzNXNpNWIKK2NlczV0CitjZXQ0CitjNWU0dGEKK2NldzQKKzJjaAorNGNoLgorNGNoM2FiCis1Y2hhNG4xaWMKK2NoYTJuCitjaDVhNW5pcworY2hlMgorY2hlYXAzCis0Y2g0ZWQKK2NoNWU1bG8KKzNjaGVtaQorY2g1ZW5lCitjaGUybgorY2gzZXIuCitjaDNlNHIxczIKKzRjaDFpbgorNWNoaTJuZS4KK2NoMmluZQorY2g1aTVuMmUyc3MKK2NoaTFuZXMKKzVjaDJpbmkKKzVjaDJpbworM2NoaXQKK2NoaTJ6CiszY2hvMgorY2g0dGkKKzFjaQorM2MyaTFhCitjaTJhNWIKK2NpMmE1cgorY2k1YworNGNpZXIKK2MyaWU0Cis1YzRpMmYzaWMuCitjaTFmaQorNGM0aTVpNAorY2k0bGEKKzNjaWwxaQorMmNpbQorMmNpbgorYzRpMW5hCiszY2luMmF0CitjaW4zZW0KK2MyaW5lCitjMWluZworYzVpbmcuCis1YzJpMW5vCitjaW8ybjQKK2MyaW8KKzRjaXBlNAorYzJpcAorY2kzcGgKKzRjaXA0aWMKK2NpcDNpCis0Y2lzMXRhCis0Y2lzMXQyaQorMmMxaXQKK2NpMXQzaXoKK2NpMXRpCis1Y2l6CitjazEKK2NrM2kKKzFjNGw0Cis0Y2wyYTJyCitjNWxhNXJhMXQyaW8KK2NsYXI0YXQKKzVjbGFyZQorY2xlNG0KKzRjbGljCitjbGltNAorYzFseTQKK2M1bgorMWNvCitjbzVhZworYzRvYQorY29lMgorMmNvZworY280Z3IKK2NvaTQKK2NvM2luYworY29sNWkKKzVjb2xvCitjb2wzbzRyCitjb201ZXIKK2NvMm1lCitjbzFuNGEKK2NvMm4KK2M0b25lCitjb24zZworY29uNXQKK2NvM3BhCitjb3AzaWMKK2NvNHAybDIKKzRjb3IxYgorY29ybzNuCitjb3M0ZQorY292MQorY292ZTQKK2NvdzVhCitjbzJ6NWUKK2NvNXoxaQorYzFxCitjcmFzNXQKK2NyMmFzCis1Y3JhdC4KKzVjcmF0MWljCitjcmUzYTJ0Cis1YzJyMmVkCis0YzNyZTF0YQorY3JlNHYyCitjcmkyCitjcmk1ZgorYzRyaW4KK2NyMmlzNAorNWNyaTF0aQorY3JvNHAybDIKK2Nyb3A1bworY3JvczRlCitjcnU0ZAorNGMzczIKKzJjMXQKK2MydGE0YgorYzF0YQorY3Q1YW5nCitjdGEybgorYzV0YW4xdAorYzJ0ZQorYzN0ZXIKK2M0dDRpYzF1CitjdGltM2kKK2MxdGltCitjdHU0cgorYzF0dQorYzR0dzQKK2N1ZDUKK2M0dWYKK2M0dWkyCitjdTVpMXR5Cis1Y3VsMmkKK2N1bDR0aXM0CitjdWwxdGkKK2N1NGx0CiszYzR1bDF0dTIKK2N1Mm1hCitjM3VtZQorY3U0bWkKKzNjdW4KK2N1M3BpCitjdTVweQorY3UycjVhNGIKK2N1MXJhCitjdTVyMmkzYQorMWMydXMKK2N1czFzNGkKK2N1MnNzCiszYzR1dAorY3U0dDJpZTQKK2M0dTF0MmkKKzRjNXUxdDJpdgorNGN1dHIKKzFjeQorYzJ6ZTQKKzFkMmEKKzVkYS4KKzJkM2E0YgorZGEyY2g0Cis0ZGEyZgorMmRhZworZGEybTIKK2QyYW4zZworZGEybgorZGFyZDUKK2QyYTJyCitkYXJrNQorNGRhcnkKKzNkYXQKKzRkYTF0Mml2Cis0ZGExdG8KKzVkYXY0CitkYXY1ZQorNWRheQorZDFiCitkNWMKK2QxZDQKKzJkZS4KK2RlYTJmNQorZGU0YjVpMnQKK2QyZTFiCitkZTRibzJuCitkZWNhMm40CitkZTFjYQorZGU0Y2lsCitkZTFjMmkKK2RlNWNvbQorZGUxY28KKzJkMWVkCis0ZGVlLgorZGU1aWYKK2RlaTIKK2RlbDJpNGU0CitkZWwyaQorZGU0bDVpNXEKK2RlNWxvCitkNGVtCis1ZGVtLgorM2RlbWljCitkZW01aWMuCitkZTVtaWwKK2RlNG1vMm4zczIKK2RlMW1vCitkZW1vMm4KK2RlbW8ycjUKKzFkZW4KK2RlNG4yYTJyCitkZTFuYQorZDRlM25vCitkZW50aTVmMgorZGVuMXQKK2RlbnQyaQorZGUzbnUKK2RlMXAKK2RlM3BhCitkZXBpNAorZGUycHUKK2QzZTFxCitkNGVyMWg0Cis1ZGVyM200CitkNWVybjVpegorZGU0cjVzMgorZGVzMgorZDJlcy4KK2RlMXMyYworZGUyczVvCitkZXMzdDJpCitkMmUzc3Q0cgorZGU0c3UKK2RlMXQKK2RlMnRvCitkZTF2CitkZTJ2M2k0bAorZGUxdmkKKzRkZXkKKzRkMWYKK2Q0Z2EKK2QzZ2U0dAorZGcxaQorZDJneQorZDFoMgorNWRpLgorMWQ0aTNhCitkaWE1YgorZDRpNGNhbQorZGkxY2EKK2Q0aWNlCiszZGkyYzF0CiszZDJpZAorNWRpM2VuCitkMmllNAorZDFpZgorZGkzZ2UKK2QyaWcKK2RpNGxhMXRvCitkaTFsYQorZDFpbgorMWRpMW5hCiszZGkybmUuCitkMmluZQorNWQyaW5pCitkaTVuaXoKKzFkMmlvCitkaW81ZworZGk0cDJsMgorZDJpcAorZDRpcjIKK2RpMXJlCitkaXIxdDVpCitkaXMxCis1ZGlzaQorZDRpczN0CitkMmkxdGkKKzFkMmkxdgorZDFqCitkNWsyCis0ZDVsYQorM2RsZS4KKzNkbGVkCiszZGxlcy4KK2RsZXMyCis0ZDNsMmUyc3MKKzJkM2xvCis0ZDVsdQorMmQxbHkKK2QxbQorNGQxbjQKKzFkbworM2RvLgorZG81ZGUKKzVkb2UKKzJkNW9mCitkNG9nCitkbzRsYQorZG9sMmk0CitkbzVsbzRyCitkb201aXoKK2RvM24yYXQKK2RvMm4KK2RvMW4xYQorZG9uaTQKK2RvbzNkCitkb28yCitkbzRwNHAKK2Q0b3IKKzNkb3MKKzRkNW91dAorZG91MgorZG80dgorM2RveAorZDFwCisxZHIKK2RyYWc1bzJuMgorZHJhMmdvCis0ZHIyYWkyCitkcmU0CitkcmUyYTVyCis1ZHJlbgorZHI0aTRiCitkcmlsNAorZHJvNHAKKzRkcm93Cis1ZHJ1cGxpCitkcnUzcDJsMgorNGRyeQorMmQxczIKK2RzNHAKK2Q0c3cyCitkNHM0eQorZDJ0aAorMWR1CitkMXUxYQorZHUyYworZDF1M2NhCitkdWM1ZXIKKzRkdWN0LgorZHUyYzF0Cis0ZHVjNHQxczIKK2R1NWVsCitkdTRnCitkM3VsNGUKK2R1bTRiZQorZHU0bTFiCitkdTRuCis0ZHVwCitkdTRwZQorZDF2CitkMXcKK2QyeQorNWR5bgorZHk0czJlCitkeXM1cAorZTFhNGIKK2UzYTJjMXQKK2VhMmQxCitlYWQ1aWU0CitlMmFkaQorZWE0Z2UKK2VhNWdlcgorZWE0bAorZWFsNWVyCitlMmFsZQorZWFsM291MgorZWFtM2VyCitlNWFuZAorZWEybgorZWFyM2EKK2UyYTJyCitlYXI0YworZWFyNWVzCitlYXI0aWMKK2VhcjFpCitlYXI0aWwKK2VhcjVrCitlYXIydAorZWFydDNlCitlYTVzcAorZTNhMnNzCitlYXN0MworZWEydAorZWF0NWVuCitlYXRoM2kKK2U0YXRoCitlNWF0M2lmMgorZTRhM3R1CitlYTJ2CitlYXYzZW4KK2VhdjVpCitlYXY1bworMmUxYgorZTRiZWwuCitlMWJlbAorZTRiZTJsMXMyCitlNGJlbgorZTRiaTJ0CitlM2JyCitlNGNhMmQKK2UxY2EKK2VjYW41YworZWNhMm4KK2VjMWNhNQorZWMzYworZTFjZQorZWM1ZXMxc2EyCitlYzJlMnNzCitlMWMyaQorZTRjaWIKK2VjNWlmaWNhdAorZWNpMWZpCitlY2lmaTFjYQorZWM1aTNmMmllNAorZWM1aTFmeQorZTJjM2ltCitlMmMxaTR0CitlNWMyaXRlCitlNGNsYW0KK2UxYzRsNAorZTRjbDJ1cworZTJjb2wKK2UxY28KK2U0Y29tMW0KK2U0Y29tcGUKK2VjbzRtMXAKK2U0Y29uMWMKK2VjbzJuCitlMmNvcgorZWMzbzFyYQorZWNvNXJvCitlMWNyCitlNGNyZW0KK2VjNHRhMm4KK2UyYzF0CitlYzF0YQorZWM0dGUKK2UxY3UKK2U0Y3VsCitlYzN1MWxhCisyZTJkMmEKKzRlZDNkNAorZTRkMWVyCitlZGU0czIKKzRlZGkKK2UzZDRpM2EKK2VkM2liCitlZDNpMWNhCitlZDNpbQorZWQxaXQKK2VkaTV6Cis0ZTFkbworZTRkb2wKK2VkbzJuMgorZTRkcmkKK2UxZHIKK2U0ZHVsCitlMWR1CitlZDV1MWw0bworZWUyYworZTRlZDNpCitlZTJmCitlZWwzaQorZWU0bHkKK2VlMm0KK2VlNG5hCitlZTRwMQorZWUyczQKK2Vlc3Q0CitlZTR0eQorZTVleAorZTFmCitlNGYzZXJlCitlZmVyMQorMWU0ZjFmCitlNGZpYworZTFmaQorNWVmMmkxYzRpCitlZmlsNAorZTNmMmkybmUKK2UyZmluCitlZjVpNW4yaXRlCitlZjJpbmkKK2VmaW4yaXQKKzNlZml0CitlZm9yNWVzCitlMWZvCitlZm8ycgorZTRmdTRzZS4KK2UzZnUKK2VmMnVzCis0ZWdhbAorZTFnYQorZWdlcjQKK2VnNWliCitlZzRpYworZWc1aW5nCitlNWdpdDUKK2VnNW4KK2U0Z28uCitlMWdvCitlNGdvcworZWcxdWwKK2U1Z3VyCis1ZTFneQorZTFoNAorZWhlcjQKK2VpMgorZTVpYworZTJpNWQKK2UyaWcyCitlaTVnNGwyCitlM2k0bTFiCitlM2luM2YKK2UxaW5nCitlNWluc3QKK2UyaTJuMXMyCitlaXI0ZAorZTRpcgorZTJpdDNlCitlMmkzdGgKK2U1aTF0eQorZTFqCitlNGp1ZAorZWo1dWRpCitla2k0bgorZWsxaQorZWs0bGEKK2VrMWwKK2UxbGEKK2U0bGEuCitlNGxhYworZTNsNGFuNGQKK2VsYTJuCitlNGw1YTF0Mml2CitlNGxhdworZWxheDFhNAorZTNsZTJhCitlbDVlYnJhCitlbDJlMWIKK2VsZTNicgorNWVsZWMKK2U0bGVkCitlbDNlMWdhCitlNWxlbgorZTRsMWVyCitlMWxlczIKK2UybDJmCitlbDJpCitlM2xpYmU0CitlNGw1aWMuCitlbDNpMWNhCitlM2xpZXIKK2VsMmllNAorZWw1aTNnaWIKK2VsMmlnCitlbDRpZ2kKK2U1bGltCitlNGwzaW5nCitlM2wyaW8KK2UybGlzCitlbDVpczJoCitlM2wyaXYzCis0ZWxsYQorZWwxbAorZWw0bGFiCitlbGw0bzQKK2U1bG9jCitlbDVvZworZWwzb3AuCitlbDJzMmgKK2UybDFzMgorZWw0dGEKK2U0bHQKK2U1bHVkCitlbDV1ZworZTRtYWMKK2UxbWEKK2U0bWFnCitlNW1hMm4KK2VtNWExbmEKK2U0bTViCitlMW1lCitlMm1lbAorZTRtZXQKK2VtM2kxY2EKK2VtMmk0ZTQKK2VtNWlncmEKK2VtMmlnNAorZW1pMWdyCitlbTFpbjIKK2VtNWluZQorZW0zaTNuaQorZTRtMmlzCitlbTVpczJoCitlNW00aTJzMXMKK2VtM2l6Cis1ZW1uaXoKK2U0bTFuCitlbW80ZworZTFtbworZW1vM24yaTVvCitlbW8ybgorZW0zcGkKK2U0bTFwCitlNG11bAorZTFtdQorZW01dTFsYQorZW11M24yCitlM215CitlbjVhMm1vCitlMW5hCitlNG5hbjF0CitlbjJhMm4KK2VuY2g0ZXIKK2VuMmNoCitlbmNoZTIKK2VuM2RpYworZTVuZWEKK2U1bmVlCitlbjNlbQorZW41ZXJvCitlbjFlcgorZW41ZTFzaQorZTFuZXMKK2UybjVlc3QKK2VuM2V0cgorZTNuZTR3CitlbjVpNGMzczIKK2U1bjJpZTQKK2U1bmlsCitlM24yaTRvCitlbjNpczJoCitlbjNpdAorZTVuaTF1Cis1ZW5pegorNGU0bjFuMgorNGVubworZTRubzRnCitlNG5vcworZW4zb3YKK2VuNHN3MgorZTJuMXMyCitlbnQ1YWdlCitlbjF0CitlbjF0YQorNGVudGgxZXMKK2VudGgyZQorZW4zdTFhCitlbjV1ZgorZTNueS4KKzRlNG4zegorZTVvZgorZW8yZworZTRvaTQKK2Uzb2wKK2VvcDNhMnIKK2VvMnBhCitlMW9yCitlbzNyZQorZW81cm9sCitlb3M0CitlNG90CitlbzR0bworZTVvdXQKK2VvdTIKK2U1b3cKK2UycGEKK2UzcDRhaTIKK2VwNWFuYworZXBhMm4KK2U1cGVsCitlM3BlbjF0CitlcDVlNXQyaTF0MmlvCitlcGUydAorZXBldGkxdGkKK2VwaGU0CitlNHBsaQorZTFwMmwyCitlMXBvCitlNHByZWMKK2VwcjIKK2VwNXJlMWNhCitlNHAycjJlZAorZXAzcmUxaDQKK2UzcHJvCitlNHByb2IKK2VwNHM0aAorZTJwMXMyCitlcDV0aTViCitlMnAxdAorZTRwdTJ0CitlcDV1MXRhCitlMXEKK2VxdWkzbAorZXF1MgorZXEydWkyCitlNHEzdWkzcworZXIxYQorZTJyYTRiCis0ZXI0YW5kCitlcmEybgorZXIzYTJyCis0ZXI0YXRpLgorMmVyMWIKK2VyNGIybDIKK2VyM2NoCitlcjFjCitlcjRjaGUyCisyZTJyZS4KK2UzcmUxYTRsCitlcmU1Y28KK2VyZTNpbgorZXJlaTIKK2VyNWVsLgorZXIzZTFtbworZXI1ZTFuYQorZXI1ZW5jZQorNGVyZW5lCitlcjNlbjF0CitlcmU0cQorZXI1ZTJzcworZXIzZXMydAorZXJldDQKK2VyMWg0CitlcjFpCitlMXIyaTNhNAorNWVyaWNrMQorZTNyaWVuCitlcjJpZTQKK2VyaTRlcgorZXIzaW40ZQorZTFyMmkxbworNGVyaXQKK2VyNGkxdQorZXIyaTR2CitlNHJpMXZhCitlcjNtNAorZXI0bmlzNAorNGVyM24yaXQKKzVlcm5pegorZXIzbm80CisyZXJvCitlcjVvYgorZTVyMm9jCitlcm80cgorZXIxb3UyCitlNHIxczIKK2VyM3NldAorZXIyc2UKK2VydDNlcgorNGVyMnRsCitlcjN0dzQKKzRlcnUKK2VydTR0Cis1ZXJ3YXUKK2VyMXcKK2UxczRhMgorZTRzYTJnZS4KK2U0c2FnZXMKK2VzMmMKK2UyczFjYQorZXM1Y2EybgorZTNzY3IKK2VzNWN1CitlMXMyZQorZTJzZWMKK2VzNWUxY3IKK2U0czVlbmMKK2U0c2VydC4KK2U0c2VyNHQxczIKK2U0c2VyMXZhCis0ZXMyaAorZTNzaGEKK2VzaDVlMm4KK2Uxc2kKK2Uyc2ljCitlMnMyaWQKK2VzNWkxZGVuCitlNHM1aWcxbjRhCitlczJpZworZTJzNWltCitlMnM0aTRuCitlc2lzNHRlCitlMXNpcworZTVzaTR1CitlNXNraW4KK2VzazIKK2VzazFpCitlczRtaQorZTJzMW0KK2Uyc29sCitlMXNvCitlczNvbHUKK2Uyc28ybgorZXM1bzFuMWE0CitlMXNwCitlMnMzcGVyCitlczVwaTFyYQorZXNwNGlyCitlczRwcmUKK2VzcHIyCisyZTJzcworZXM0c2k0YgorZXMxc2kKK2VzdGEybjQKK2VzMXRhCitlczN0MmlnCitlc3QyaQorZXM1dGltCis0ZXMydG8KK2Uzc3RvMm4KKzJlc3Q0cgorZTVzdHJvCitlc3RydWM1CitlMnN1MnIKK2Uxc3UKK2VzNXVyMXI0CitlczR3MgorZTJ0YTRiCitlMXRhCitlM3RlbjRkCitlM3RlbworZXRob2QzCitldDFpYworZTV0aWRlCitldDJpZAorZTJ0MWluNAorZXQyaTRubworZTV0NGlyCitlNXQyaTF0MmlvCitldGkxdGkKK2V0NWkxdDJpdgorNGUydDFuMgorZXQ1bzFuMWEKK2UxdG8KK2V0bzJuCitlM3RyYQorZTN0cmUKK2V0M3JpYworZXQ1cmlmCitldDNyb2cKK2V0NXJvcworZXQzdTFhCitlMXR1CitldDV5bQorZTF0eQorZTR0NXoKKzRldQorZTV1bgorZTN1cAorZXUzcm8KK2UydXM0CitldXRlNAorZXV0aTVsCitlNHUxdDJpCitldTV0cgorZXZhMnA1CitlMXZhCitlMnZhcworZXY1YXN0CitlNXZlYQorZXYzZWwxbAorZXZlNGwzbworZTV2ZW5nCitldmVuNGkKK2V2MWVyCitlNXYyZXIxYgorZTF2aQorZXYzaWQKK2Uydmk0bAorZTR2MWluCitlM3YyaTR2CitlNXZvYworZTV2dQorZTF3YQorZTR3YWcKK2U1d2VlCitlM3doCitld2lsNQorZXdpMgorZXczaW40ZworZTN3aXQKKzFleDNwCis1ZXkxYworNWV5ZS4KK2V5czQKKzFmYQorZmEzYjJsMgorZjRhYjNyCitmYTRjZQorNGZhZworZmE0aTRuNAorZmFpMgorZmFsMmw1ZQorZmFsMWwKKzRmNGE0bWEKK2ZhbTVpcworNWYyYTJyCitmYXI1dGgKK2ZhM3RhCitmYTN0aDJlCitmNGF0aAorNGZhMXRvCitmYXU0bHQ1CitmYXU0bDIKKzRmNWIKKzRmZAorNGZlLgorZmVhczQKK2ZlNGF0aDMKK2ZlYTJ0CitmMmU0YgorNGZlMWNhCis1ZmUyYzF0CisyZmVkCitmZTNsMmkKK2ZlNG1vCitmZW4yZAorZmVuMWQ1ZQorZmVyMQorNWZlcjFyNAorZmV2NAorNGYxZgorZjRmZXMKK2Y0ZjJpZTQKK2YxZmkKK2Y1ZjJpbi4KK2YyZmluCitmMmY1aXMKK2Y0ZjJseTUKK2ZmNGwyCitmMmZ5Cis0ZmgKKzFmaQorZjJpM2EKKzJmM2ljLgorNGYzaWNhbAorZmkxY2EKK2YzaWNhMm4KKzRmaWNhdGUKK2YzaTFjZW4KK2ZpM2NlcgorZjJpMWM0aQorNWZpM2MyaTFhCis1ZmljMmllNAorNGZpNGMzczIKK2ZpM2N1CitmaTVkZWwKK2YyaWQKK2ZpZ2h0NQorZjJpZworZmlsNWkKK2ZpbDJsNWluNAorZmlsMWwKK2ZpbGwyaQorNGZpMWx5CisyZmluCis1ZmkxbmEKK2Y0aW4yZDUKK2YyaTJuZQorZjFpbjNnCitmMmk0bjRuMgorZmlzNHQyaQorZjRsMgorZjVsMmUyc3MKK2ZsZXMyCitmbGluNAorZmxvM3JlCitmMmx5NQorNGZtCis0Zm4KKzFmbworNWZvMm4KK2ZvbjRkZQorZjJvbmQKK2ZvbjR0CitmbzJyCitmbzVyYXQKK2ZvMXJhCitmb3I1YXkKK2ZvcmU1dAorZm9yNGkKK2ZvcjF0NWEKK2ZvczUKKzRmNXAKK2ZyYTR0CitmNXJlYQorZnJlczVjCitmcmkyCitmcmlsNAorZnJvbDUKKzJmM3MKKzJmdAorZjR0bworZjJ0eQorM2Z1CitmdTVlbAorNGZ1ZworZnU0bWluCitmdTFtaQorZnU1bmUKK2Z1M3JpCitmdXNpNAorZjJ1cworZnUyczRzCis0ZnUxdGEKKzFmeQorMWdhCitnYTJmNAorNWdhbC4KKzNnYWwxaQorZ2EzbG8KKzJnYW0KK2dhNW1ldAorZzVhMm1vCitnYW41aXMKK2dhMm4KK2dhM25pegorZ2FuaTV6YTEKKzRnYW5vNAorZ2FyNW40CitnMmEycgorZ2Eyc3M0CitnNGF0aDMKKzRnYTF0Mml2Cis0Z2F6CitnM2IKK2dkNAorMmdlLgorMmdlZAorZ2VlejQKK2dlbDRpbgorZ2VsMmkKK2dlNWxpcworZ2U1bDFpegorNGdlMWx5CisxZ2VuCitnZTRuMmF0CitnZTFuYQorZzVlNW5pegorNGc0ZW5vCis0Z2VueQorMWdlbworZ2Uzb20KK2c0ZXJ5Cis1Z2Uxc2kKK2dldGg1Cis0Z2UxdG8KK2dlNHR5CitnZTR2Cis0ZzFnMgorZzJnZQorZzNnZXIKK2dnbHU1CitnZ2wyCitnMWdvNAorZ2gzaW4KK2doNW91dAorZ2hvdTIKK2doNHRvCis1Z2kuCisxZzJpNGEKK2dpMmE1cgorZzFpYworNWdpM2MyaTFhCitnMmkxY2kKK2c0aTFjbworZ2llbjUKK2cyaWU0Cis1Z2llcy4KK2dpbDQKK2czaTFtZW4KKzNnNGluLgorZzRpbjVnZQorNWc0aTJuMXMyCis1ZzJpbworM2c0aXIKK2dpcjRsCitnM2lzMWwyCitnaTR1Cis1ZzJpdgorM2dpegorZ2wyCitnbGE0CitnbDJhZDVpCitnbGEyZAorNWdsYXMKKzFnbGUKK2dsaTRiCitnM2wyaWcKKzNnbG8KK2dsbzNyCitnMW0KK2c0bXkKK2cxbjRhCitnNG5hLgorZ25lNHQ0dDIKK2cxbmkKK2cybjFpbgorZzRuMmk0bworZzFubworZzRubzRuCisxZ28KKzNnby4KK2dvYjUKKzVnb2UKKzNnNG80ZworZ28zaXMKK2dvaTIKK2dvMm4yCis0ZzNvM24xYQorZ29uNWRvNQorZzJvbmQKK2dvM25pCis1Z29vMgorZ281cml6Citnb3I1b3UyCis1Z29zLgorZ292MQorZzNwCisxZ3IKKzRncmExZDJhCitncmEyZAorZzRyMmFpMgorZ3JhMm4yCis1Z3JhNHBoLgorZzVyYTNwaDRlcgorNWdyYXBoMWljCitncjRhcGhpCis0ZzNyYTFwaHkKKzRncmF5CitncmU0bgorNGdyZXNzLgorZ3IyZTJzcworNGdyaXQKK2c0cm8KK2dydWY0CitnczIKK2c1c3RlCitndGgzCitndTRhCiszZ3VhcjJkCitndTJhMnIKKzJndWUKKzVndWk1dAorZzJ1aTIKKzNndW4KKzNnMnVzCis0Z3U0dAorZzN3CisxZ3kKKzJnNXkzbgorZ3k1cmEKK2gzYWI0bDIKK2hhMmNoNAoraGFlNG0KK2hhZTR0CitoNWFndQoraGEzbGEKK2hhbGEzbQoraGE0bQoraGFuNGNpCitoYTJuCitoYW40Y3kKKzVoYW5kLgoraDRhbmQKK2gyYW40ZworaGFuZzVlcgoraGFuMWc1bworaDVhNW5pegoraGE0bjRrMgoraGFuNHRlCitoYW4xdAoraGEycDNsMgoraGEycDV0CitoYTNyYTJuCitoMmEycgoraGE1cjJhcworaGFyMmQKK2hhcmQzZQoraGFyNGxlNAoraGFyMWwKK2hhcnA1ZW4KK2hhcjJwCitoYXI1dGVyCitoYTJzNXMKK2hhdW40Cis1aGF6CitoYXozYTEKK2gxYgorMWhlYTJkMQorM2hlMmEycgoraGU0Y2EybgoraGUxY2EKK2g1ZWNhdAoraDRlZAoraDRlNWRvNQoraGUzbDRpCitoZWw0bGlzCitoZWwxbAoraGVsbDJpCitoZWw0bHkKK2g1ZWxvCitoZTRtNHAKK2hlMm4KK2hlMW5hNAoraGVuNWF0CitoZTFvNXIKK2hlcDUKK2g0ZXIxYQoraGVyYTNwCitoZXI0YmEKK2gyZXIxYgoraGVyZTVhCitoM2VybgoraDVlcjFvdTIKK2gyZXJvCitoM2VyeQoraDFlcworaGUyczVwCitoZTR0CitoZTJ0NGVkCitoNGV1NAoraDFmCitoMWgKK2hpNWEybgoraDJpMWEKK2hpNGNvCitoaWdoNQoraDJpZworaDRpbDIKK2hpbWVyNAoraDRpMW5hCitoaW9uNGUKK2gyaW8KK2hpbzJuCitoMmk0cAoraGlyNGwKK2g0aXIKK2hpM3JvCitoaXI0cAoraGlyNHI0CitoaXMzZWwKK2g0aXNlCitoNGkyczRzCitoaXRoNWVyCitoMml0aAoraGl0aDJlCitoMmkydgorNGhrCis0aDFsNAoraGxhMm40CitoMmxvCitobG8zcmkKKzRoMW0KK2htZXQ0CisyaDFuCitoNW9kaXoKK2g1bzJkMXMyCitobzRnCitobzFnZTQKK2hvbDVhMnIKK2hvMWxhCiszaG9sNGUKK2hvNG1hCitobzJtZTMKK2hvMW40YQoraG8ybgoraG81bnkKKzNob29kCitob28yCitob28ybjQKK2hvcjVhdAoraG8xcmEKK2hvNXIyaXMKK2hvcnQzZQoraG81cnUKK2hvczRlCitobzVzZW4KK2hvczFwCisxaG8ydXMKK2hvdTIKK2hvdXNlMworaG92NWVsCis0aDVwCis0aHI0CitocmVlNQoraHJvNW5pegoraHJvMm4KK2hybzNwbworNGgxczIKK2g0czJoCitoNHQyYTJyCitoMXRhCitodDFlbgoraHQ1ZXMKK2g0dHkKK2h1NGcKK2h1NG1pbgoraHUxbWkKK2h1bjVrZQoraHU0bmsyCitodW40dAoraHVzM3Q0CitoMnVzCitodTR0CitoMXcKK2g0d2FyNHQKK2h3MmEycgoraHkzcGUKK2h5M3BoCitoeTJzCisyaTFhCitpMmFsCitpYW00CitpYW01ZTF0ZQoraTJhMm4KKzRpYW5jCitpYW4zaQorNGlhbjR0CitpYTVwZQoraWEyc3M0CitpNGExdDJpdgoraWE0dHJpYworaWExdHIKK2k0YTJ0dQoraWJlNAoraWIzZXIxYQoraWI1ZXJ0CitpYjVpMWEKK2liM2luCitpYjVpdC4KK2liaTJ0CitpYjVpdGUKK2kxYjJsMgoraWIzbGkKK2k1Ym8KK2kxYnIKK2kyYjVyaQoraTVidTRuCis0aWNhbQoraTFjYQorNWljYXAKKzRpYzJhMnIKK2k0Y2FyLgoraTRjYXJhCitpY2FzNQoraTRjYXkKK2ljY3U0CitpYzNjCis0aWNlbworNGkyY2gKKzJpMWNpCitpNWMyaWQKK2ljNWkxbmEKK2kyY2luCitpMmMyaXAKK2ljM2kxcGEKK2k0YzFseTQKK2kxYzRsNAoraTJjNW9jCitpMWNvCis0aTFjcgorNWljcmEKK2k0Y3J5CitpYzR0ZQoraTJjMXQKK2ljMXR1MgoraWM0dDN1MWEKK2ljM3UxbGEKK2ljNHVtCitpYzV1bworaTNjdXIKKzJpZAoraTRkYWkyCitpMWQyYQoraWQ1YW5jCitpZGEybgoraWQ1ZDQKK2lkZTNhNGwKK2lkZTRzMgoraTJkaQoraWQ1aTJhMm4KK2kxZDRpM2EKK2lkaTRhMnIKK2k1ZDJpZTQKK2kxZDNpbworaWRpNW91MgoraWQxaXQKK2lkNWkxdQoraTNkbGUKK2k0ZG9tCitpMWRvCitpZDNvdworaTRkcgoraTJkdQoraWQ1dW8KKzJpZTQKK2llZDRlCis1aWU1Z2EKK2llMmxkMworaWUxbjVhNAoraWVuNGUKK2k1ZTRuMW4yCitpM2VudDJpCitpZW4xdAoraTFlci4KK2kzZXMyYworaTFlc3QKK2kzZXQKKzRpZi4KK2lmNWVybworaWZlcjEKK2lmZjVlbgoraTRmMWYKK2lmNGZyCis0aTJmM2ljLgoraTFmaQoraTNmMmllNAoraTNmNGwyCis0aTJmdAorMmlnCitpZ2E1YgoraTFnYQoraWczZXIxYQoraWdodDNpCis0aWdpCitpM2dpYgoraWczaWw0CitpZzNpbgoraWczaXQKK2k0ZzRsMgoraTJnbworaWczb3IKK2lnNW90CitpNWdyZQoraTFncgoraWcydTVpMgoraWcxdXIKK2kzaAorNGk1aTQKK2kzagorNGlrCitpMWxhCitpbDNhNGIKK2k0bDRhZGUKK2lsYTJkCitpMmw1YW0KK2lsYTVyYQoraWwyYTJyCitpM2xlZworaWwxZXIKK2lsZXY0CitpMmw1ZgoraWwxaQoraWwzaTFhCitpbDJpYgoraWwzaW8KK2lsNGlzdAorMmlsMWl0CitpbDJpegoraWxsNWFiCitpbDFsCis0aTJsMW4yCitpbDNvMXEKK2lsNHR5CitpNGx0CitpbDV1cgoraWwzdgoraTRtYWcKK2kxbWEKK2ltM2FnZQoraW1hNXJ5CitpbTJhMnIKK2ltZW50MmE1cgoraTFtZW4KK2kzbWVuMXQKK2ltZW4xdGEKKzRpbWV0CitpbTFpCitpbTVpMWQ0YQoraW0yaWQKK2ltaTVsZQoraTVtMmluaQorNGltaXQKK2ltNG5pCitpNG0xbgoraTNtbzJuCitpMW1vCitpMm11CitpbTN1MWxhCisyaW4uCitpNG4zYXUKK2kxbmEKKzRpbmF2CitpbmNlbDQKK2luM2NlcgorNGluZAoraW41ZGxpbmcKKzJpbmUKK2kzbmVlCitpbjRlcjRhMnIKK2luMWVyCitpbmVyMWEKK2k1bjJlMnNzCitpMW5lcworNGluMWdhCis0aW5nZQoraW41Z2VuCis0aW5naQoraW41Z2xpbmcKK2luZ2wyCis0aW4xZ28KKzRpbjFndQorMmluaQoraTVuaS4KK2k0bjRpMWEKK2luM2k0bworaW4xaXMKK2k1bmk0dGUuCitpbjJpdAoraW4yaXRlCis1aTNuMmkxdDJpbworaW5pMXRpCitpbjNpMXR5Cis0aTRuazIKKzRpNG4xbAorMmk0bjFuMgorMmkxbm8KK2k0bm80YworaW5vNHMKK2k0bm90CisyaTJuMXMyCitpbjNzZQoraW5zdTFyNWEKK2luMXN1CitpbnN1MnIKKzJpbnQuCitpbjF0CisyaW40dGgKK2luMXUKK2k1bjJ1cworNGlueQorMmlvCis0aW8uCitpbzFnZTQKK2lvMmdyCitpMW9sCitpbzRtCitpb24zYXQKK2lvMm4KK2lvMW4xYQoraW9uNGVyeQoraW9uMWVyCitpb24zaQoraTJvNXBoCitpb3IzaQoraTRvcworaTRvNXRoCitpNW90aQoraW80dG8KK2k0b3VyCitpb3UyCisyaXAKK2lwZTQKK2lwaHIyYXM0CitpcDRocjQKK2lwM2kKK2lwNGljCitpcDRyZTQKK2lwcjIKK2lwM3VsCitpM3F1YQoraXF1MgoraXE1dWUxZgoraXEzdTJpZAoraXEydWkyCitpcTN1aTN0Cis0aXIKK2kxcmEKK2kycmE0YgoraTRyYWMKK2lyZDVlCitpcmU0ZGUKK2kycjJlZAoraTRyZTFmCitpNHJlbDQKK2k0cmVzCitpcjVnaQoraXJnMgoraXIxaQoraXJpNWRlCitpcjJpZAoraXI0aXMKK2lyaTN0dQorNWk1cjJpegoraXI0bWluCitpcjFtCitpcm80ZworNWlyb24uCitpcm8ybgoraXI1dWwKKzJpcy4KK2lzNWFnCitpc2EyCitpczNhMnIKK2lzYXM1CisyaXMxYworaXMzY2gyCis0aXNlCitpczNlcgorM2k0czNmCitpczVoYTJuCitpczJoCitpczNobzJuMworaXNobzQKK2lzaDVvcAoraXMzaTFiCitpczJpNGQKK2k1c2lzCitpczVpMXQyaXYKK2lzaTF0aQorNGlzNGsyCitpc2xhMm40CitpczFsMgorNGlzNG0xczIKK2kyczFtCitpMnNvCitpc281bWVyCitpM3NvbQoraXNvMm1lCitpczFwCitpczJwaQoraXM0cHkKKzRpMnMxcworaXM0c2FsCitpczFzYTIKK2lzc2VuNAoraXM0czFlNHMKK2lzNHRhLgoraXMxdGEKK2lzMXRlCitpczF0MmkKK2lzdDRseQoraXMydGwKKzRpc3RyYWwKK2lzdDRyCitpczF0cmEKK2kyc3UKK2lzNXVzCis0aTN0YS4KK2kxdGEKK2l0YTRiaQoraTJ0YWIKK2k0dGFnCis0aXRhNW0KK2kzdGEybgoraTN0YXQKKzJpdGUKK2l0M2VyMWEKK2k1dGVyMWkKK2l0NGVzCisyaXRoCitpMXRpCis0aTF0MmkxYQorNGkydGljCitpdDNpMWNhCis1aTV0aWNrMQoraTJ0M2lnCitpdDVpbDFsCitpMnRpbQorMmkxdDJpbworNGl0aXMKK2k0dGkyczRtCitpMnQ1bzVtCitpMXRvCis0aXRvMm4KK2k0dHJhbQoraTF0cmEKK2l0NXJ5Cis0aTR0M3QyCitpdDN1MWF0CitpMXR1CitpdHUxYQoraTV0dWQyCitpdDN1bAorNGl0ei4KK2k0dHoKK2kxdQorMml2CitpdjNlbDFsCitpdjNlbi4KK2k0djNlci4KK2k0dmVycy4KK2l2ZTRyMXMyCitpdjVpbC4KK2kydmlsCitpdjVpbworaXYxaXQKK2k1dm9yZQoraXYzbzNybworaTR2M290Cis0aTV3CitpeDRvCis0aXkKKzRpejJhMnIyCitpemExCitpMnoxaTQKKzVpem9uMXQKK2kxem8KK2l6bzJuCis1amEKK2phYzRxCitqYTRwCisxamUKK2plNHI1czIKKzRqZXM0dDJpZTQKK2plc3QyaQorNGplczJ0eQoramV3Mworam80cAorNWp1ZGcKKzNrYS4KK2szYWIKK2s1YWcKK2thaXM0CitrYWkyCitrYWw0CitrMWIKK2syZWQKKzFrZWUKK2tlNGcKK2tlNWwyaQorazNlbjRkCitrMWVyCitrZXM0CitrM2Uyc3QuCitrZTR0eQorazNmCitraDQKK2sxaQorNWtpLgorNWsyaWMKK2s0aWwxbAora2lsbzUKK2s0aW0KK2s0aW4uCitraW40ZGUKK2s0aW5kCitrNWk1bjJlMnNzCitrMmluZQora2kxbmVzCitraW40ZworazJpNHAKK2tpczQKK2s1aXMyaAora2s0CitrMWwKKzRrM2xleQorNGsxbHkKK2sxbQorazVuZXMKKzFrMm5vCitrbzVyCitrb3MyaDQKK2szb3UyCitrcm81bgorNGsxczIKK2s0c2MKK2tzNGwyCitrNHM0eQorazV0CitrMXcKK2xhYjNpYworbDRhYm8KK2w0YTJjaTQKK2w0YWRlCitsYTJkCitsYTNkMnkKK2xhZzRuCitsYTJtM28KKzNsNGFuZAorbGEybgorbGFuNGRsCitsYW41ZXQKK2xhbjR0ZQorbGFuMXQKK2xhcjRnMgorbDJhMnIKK2xhcjNpCitsYXM0ZQorbGE1dGEybgorbGEydGEKKzRsYXRlbDJpNAorNGxhMXQyaXYKKzRsYXYKK2xhNHY0YQorMmwxYgorbGJpbjQKKzRsMWMyCitsY2U0CitsM2NpCisybGQKK2wyZGUKK2xkNGVyZQorbGQ0ZXIxaQorbGRpNAorbGQ1aXMxCitsM2RyCitsNGRyaQorbGUyYQorbGU0YmkKK2wyZTFiCitsZTJmdDUKK2xlMWYKKzVsZWcuCis1bGU0ZzFnMgorbGU0bWF0CitsZTFtYQorbGVtNWF0MWljCis0bGVuLgorM2xlbmMKKzVsZTJuZS4KKzFsZW4xdAorbGUzcGgKK2xlNHByMgorbGUycmE1YgorbGVyMWEKK2xlcjRlCiszbGVyZzIKKzNsNGVyMWkKK2w0ZXJvCitsZXMyCitsZTVzMWNvCitsZXMyYworNWxlc3EKKzNsMmUyc3MKKzVsZXNzLgorbDNlMXZhCitsZXY0ZXIuCitsZXYxZXIKK2xldjRlcjFhCitsZXY0ZTRyMXMyCiszbGV5Cis0bGV5ZQorMmxmCitsNWZyCis0bDFnNAorbDVnYQorbGcyYTJyMworbDRnZXMKK2wxZ28zCisybDNoCitsaTRhZworbDJpMWEKK2xpMmFtNAorbGlhcjVpegorbGkyYTJyCitsaWFyMWkKK2xpNGFzCitsaTRhMXRvCitsaTViaQorNWxpYzJpbworbDJpMWNpCitsaTRjb3IKK2xpMWNvCis0bGk0YzNzMgorNGxpY3QuCitsaTJjMXQKK2w0aWN1CitsM2kxY3kKK2wzaTFkMmEKK2wyaWQKK2xpZDVlcgorM2xpMmRpCitsaWYzZXIxCitsNGk0ZjFmCitsaTRmNGwyCis1bGlnYXRlCitsMmlnCitsaTFnYQorM2xpZ2gKK2xpNGdyYQorbGkxZ3IKKzNsNGlrCis0bDRpNGwKK2xpbTRiMmwyCitsaTRtMWIKK2xpbTNpCitsaTRtbworbDRpNG00cAorbDRpMW5hCisxbDRpbmUKK2xpbjNlYQorbDJpbjNpCitsaW5rNWVyCitsNGk0bmsyCitsaTVvZworbDJpbworNGw0aXEKK2xpczRwCitsMWl0CitsMml0LgorNWxpdDNpMWNhCitsaTF0aQorbDRpMnRpYworbDVpNXRpNGMzczIKK2xpdjNlcgorbDJpdgorbDFpegorNGxqCitsa2EzCitsM2thbDQKK2xrYTR0CitsMWwKK2w0bGF3CitsMmxlCitsNWxlMmEKK2wzbGVjCitsM2xlZworbDNsZWwKK2wzbGU0bgorbDNsZTR0CitsbDJpCitsMmxpbjQKK2w1bDRpMW5hCitsbDRvCitsbG9xMnVpNQorbGxvMXEKK2xsb3F1MgorbDJsNW91dAorbGxvdTIKK2w1bG93CisybG0KK2w1bWV0CitsbTNpbmcKK2w0bW8yZDEKK2wxbW8KK2xtbzJuNAorMmwxbjIKKzNsby4KK2xvYjVhbAorbG80Y2kKKzRsb2YKKzNsb2cxaWMKK2w1bzFnbworM2xvZ3UKK2xvbTNlcgorbG8ybWUKKzVsb25nCitsbzJuCitsb240aQorbDNvM25pegorbG9vZDUKK2xvbzIKKzVsbzRwZS4KK2xvcDNpCitsM280cDFtCitsbzFyYTQKK2xvNHJhMXRvCitsbzVyMmllNAorbG9yNW91MgorNWxvcy4KK2xvczVldAorNWxvczVvM3BoaXoKK2xvMnNvCitsb3M0b3AKK2xvczJvcGgKKzVsb3M1bzFwaHkKK2xvczR0CitsbzR0YQorbG91bjVkCitsb3UyCisybG91dAorNGxvdgorMmxwCitscGE1YgorbDFwYQorbDNwaGEKK2w1cGhpCitscDVpbmcKK2xwaTJuCitsM3BpdAorbDRwMmwyCitsNXByMgorNGwxcgorMmwxczIKK2w0c2MKK2wyc2UKK2w0czJpZTQKKzRsdAorbHQ1YWcKK2wxdGEKK2x0YW5lNQorbHRhMm4KK2wxdGUKK2x0ZW40CitsdGVyMWE0CitsdGgzaQorbDV0aWVzLgorbHQyaWU0CitsdGlzNAorbDF0cgorbDF0dTIKK2x0dTFyM2EKK2x1NWEKK2x1M2JyCitsdTJjaDQKK2x1M2NpCitsdTNlbgorbHVmNAorbHU1aWQKK2wydWkyCitsdTRtYQorNWx1MW1pCitsNXVtbi4KK2x1NG0xbgorNWx1bTNuNGkxYQorbHUzbworbHVvM3IKKzRsdXAKK2x1MnNzNAorbDJ1cworbHVzM3RlCisxbHV0CitsNXZlbgorbDV2ZXQ0CisybDF3CisxbHkKKzRseWEKKzRseTFiCitseTVtZTQKK2x5M25vCisybHlzNAorbDV5M3MyZQorMW1hCisybWFiCittYTJjYQorbWE1Y2gyaW5lCittYTJjaAorbWE0Y2gxaW4KK21hNGM0bDQKK21hZzVpbgorbWFnMWkKKzVtYWcxbgorMm1haAorbWEyaWQ1CittYWkyCis0bWEybGQKK21hM2wyaWcKK21hbDFpCittYTVsaW4KK21hbDRsMmkKK21hbDFsCittYWw0dHkKK21hNGx0Cis1bWEzbjRpMWEKK21hMm4KK21hbjVpcworbWFuM2l6Cis0bWFwCittYTVyaTJuZS4KK20yYTJyCittYXIxaQorbWFyMmluNGUKK21hNXIyaXoKK21hcjRseQorbWFyMWwKK21hcjN2CittYTVzY2UKK21hczRlCittYXMxdAorNW1hdGUKK200YXRoMworbWEzdGlzCis0bWF0aTN6YTEKK21hMXRpegorNG0xYgorbTFiYTR0NQorbTViaWwKK200YjNpbmcKK21iMmk0dgorNG01YworNG1lLgorMm1lZAorNG1lZC4KKzVtZTNkNGkzYQorbTRlZGkKK21lM2QyaWU0CittNWU1ZDJ5CittZTJnCittZWw1bzJuCittZTRsNHQKK21lMm0KK21lMW0xbzMKKzFtZW4KK21lMW40YQorbWVuNWFjCittZW40ZGUKKzRtZW5lCittZW40aQorbWUybjFzNAorbWVuMXN1NQorM21lbjF0CittZW40dGUKK21lNW8ybgorbTVlcjFzYTIKK21lNHIxczIKKzJtZXMKKzNtZXN0MmkKK21lNHRhCittZXQzYTJsCittZTF0ZQorbWU1dGhpCittNGV0cgorNW1ldDNyaWMKK21lNXRyMmllNAorbWUzdHJ5CittZTR2Cis0bTFmCisybWgKKzVtaS4KK20yaTNhCittaTFkNGEKK20yaWQKK21pZDRnCittMmlnNAorM21pbDNpMWEKK21pbDFpCittNWk1bDJpZTQKK200aWwxbAorbWkxbjRhCiszbTRpbmQKK201aTNuZWUKK20yaW5lCittNGluZ2wyCittaW41Z2xpCittNWluZzFseQorbWluNHQKK200aW4xdQorbWlvdDQKK20yaW8KK20yaXMKK21pNHM0ZXIuCittNGlzZQorbWlzM2VyCittaXM1bDIKK21pczR0MmkKK201aTRzdHJ5CittaXN0NHIKKzRtMml0aAorbTJpegorNG1rCis0bTFsCittMW0KK21tYTVyeQorbTFtYQorbW0yYTJyCis0bTFuCittMW40YQorbTRuMWluCittbjRvCisxbW8KKzRtb2NyCis1bW9jNXJhMXRpegorbW8yZDEKK21vNGdvCittb2lzMgorbW9pMgorbW80aTVzZQorNG0yb2sKK21vNWxlc3QKK21vbGVzMgorbW8zbWUKK21vbjVldAorbW8ybgorbW9uNWdlCittbzNuNGkzYQorbW9uNGkyczFtCittb24xaXMKK21vbjRpc3QKK21vM25pegorbW9ub2w0CittbzNueS4KK21vMnIKKzRtbzVyYS4KK21vMXJhCittb3MyCittbzVzZXkKK21vM3NwCittNG90aDMKK201b3VmCittb3UyCiszbW8ydXMKK21vMnYKKzRtMXAKK21wYXJhNQorbTFwYQorbXAyYTJyCittcGE1cmFiCittcDRhNHI1aQorbTNwZTJ0CittcGhhczQKK20ycGkKK21wMmk0YQorbXA1aWVzCittcDJpZTQKK200cDFpMm4KK201cDRpcgorbXA1aXMKK21wbzNyaQorbTFwNG9yCittcG9zNWl0ZQorbTFwb3MKK200cG8ydXMKK21wb3UyCittcG92NQorbXA0dHIKK20ycDF0CittMnB5Cis0bTNyCis0bTFzMgorbTRzMmgKK201c2kKKzRtdAorMW11CittdWwyYTVyNAorbXUxbGEKKzVtdTRsdAorbXVsMXRpMworM211bQorbXVuMgorNG11cAorbXU0dQorNG13CisxbmEKKzJuMWEyYgorbjRhYnUKKzRuYWMuCituYTRjYQorbjVhMmMxdAorbmFnNWVyLgorbmFrNAorbmE0bDFpCituYTVsMmkxYQorNG5hNGx0CituYTVtaXQKK24yYTJuCituYW4xY2k0CituYW40aXQKK25hNG5rNAorbmFyM2MKK24yYTJyCis0bmFyZQorbmFyM2kKK25hcjRsCituNWFyMW0KK240YXMKK25hczRjCituYXM1dDJpCituMmF0CituYTN0YTJsCituYTJ0YQorbmF0NW81bTJpegorbmEydG9tCituYTF0bworbjJhdQorbmF1M3NlCituYTJ1cworM25hdXQKK25hdjRlCis0bjFiNAorbmMyYTJyNQorbjFjYQorbjRjZXMuCituM2NoYQorbjJjaAorbjVjaGVvCituY2hlMgorbjVjaDRpbDIKK24zY2hpcworbjJjMWluCituMWNpCituMmM0aXQKK25jb3UxcjVhCituMWNvCituY291MgorbjFjcgorbjFjdQorbjRkYWkyCituMWQyYQorbjVkYTJuCituMWRlCituZDVlMnN0LgorbmRlczIKK25kaTRiCituNWQyaWYKK24xZGl0CituM2RpegorbjVkdTJjCituMWR1CituZHU0cgorbmQyd2UKK25kMXcKKzJuZS4KK24zZTJhMnIKK24yZTJiCituZWIzdQorbmUyYworNW5lY2sxCisybmVkCituZTRnYXQKK25lMWdhCituZTRnNWExdDJpdgorNW5lZ2UKK25lNGxhCituZWw1aXoKK25lbDJpCituZTVtaQorbmU0bW8KKzFuZW4KKzRuZW5lCiszbmVvCituZTRwbworbmUycQorbjFlcgorbmUycmE1YgorbmVyMWEKK240ZXIzYTJyCituMmVyZQorbjRlcjVpCituZXI0cjQKKzFuZXMKKzJuZXMuCis0bmUxc3AKKzJuZXN0Cis0bmVzNHcyCiszbmV0MWljCituZTR2CituNWV2ZQorbmU0dworbjNmCituNGdhYgorbjFnYQorbjNnZWwKK25nZTRuNGUKK24xZ2VuCituNWdlcmUKK24zZ2VyMWkKK25nNWhhCituM2dpYgorbmcxaW4KK241Z2l0CituNGdsYTQKK25nbDIKK25nb3Y0CituMWdvCituZzVzMmgKK25nczIKK24xZ3UKK240Z3VtCituMmd5Cis0bjFoNAorbmhhNAorbmhhYjMKK25oZTQKKzNuNGkxYQorbmkzYTJuCituaTRhcAorbmkzYmEKK25pNGIybDIKK24yaTRkCituaTVkaQorbmk0ZXIKK24yaWU0CituaTJmaQorbmk1ZmljYXQKK25pZmkxY2EKK241aTFncgorbjJpZworbjRpazQKK24xaW0KK25pM20yaXoKK25pbTFpCituMWluCis1bmkybmUuCituMmluZQorbmluNGcKK24yaTRvCis1bjJpcy4KK25pczR0YQorbjJpdAorbjRpdGgKKzNuMmkxdDJpbworbmkxdGkKK24zaXRvcgorbmkxdG8KK25pM3RyCituMWoKKzRuazIKK241azJlcm8KK25rMWVyCituM2tldAorbmszaW4KK25rMWkKK24xazFsCis0bjFsCituNW0KK25tZTQKK25tZXQ0Cis0bjFuMgorbm5lNAorbm5pM2FsCituM240aTFhCitubjJpNHYKK25vYjRsMgorbm8zYmxlCituNW8xYzRsNAorNG4zbzJkCiszbm9lCis0bm9nCitubzFnZTQKK25vaXM1aQorbm9pMgorbm81bDRpCis1bm9sMW8xZ2lzCiszbm9taWMKK241bzVtMml6CitubzRtbworbm8zbXkKK25vNG4KK25vbjRhZworbm8xbjFhCitub241aQorbjVvbml6Cis0bm9wCis1bm9wNW81bDJpCitubzJyNWFiCitubzFyYQorbm80cmFyeQorbm9yMmEycgorNG5vczJjCitub3M0ZQorbm9zNXQKK25vNXRhCisxbm91MgorM25vdW4KK25vdjNlbDMKK25vd2wzCituMXA0CitucGk0CitucHJlNGMKK25wcjIKK24xcQorbjFyCitucnU0CisybjFzMgorbjJzNWFiCituc2EyCituc2F0aTQKK25zNGMKK24yc2UKK240czNlNHMKK25zMmlkMQorbnMyaWc0CituMnMxbDIKK24yczNtCituNHNvYworbjFzbworbnM0cGUKK241c3BpCituc3RhNWIybDIKK25zMXRhCituczJ0YWIKK24xdAorbjJ0YTRiCituMXRhCitudGU0cjNzMgorbnQyaQorbjV0aTJiCitudGk0ZXIKK250MmllNAorbnRpMmYyCituM3QyaW5lCituMnQxaW4KK240dDNpbmcKK250Mmk0cAorbnRyb2w1bDJpCitudHJvbDFsCituNHQ0czIKK250dTNtZQorbjF0dQorbjN0dW0KK251MWEKK251NGQKK251NWVuCitudWY0ZmUKK251NGYxZgorbjN1aTRuCituMnVpMgorM251M2l0CituNHVtCitudTFtZQorbjV1MW1pCiszbnU0bgorbjN1bworbnUzdHIKK24xdjIKK24xdzQKK255bTQKK255cDQKKzRuegorbjN6YTEKKzRvYQorb2EyZDMKK281YTVsZXMyCitvMmFsZQorb2FyZDMKK28yYTJyCitvYXM0ZQorb2FzdDVlCitvYXQ1aQorb2IzYTNiCitvNWIyYTJyCitvMWJlNGwKK28xYmkKK28yYmluCitvYjVpbmcKK28zYnIKK29iM3VsCitvMWNlCitvMmNoNAorbzNjaGU0dAorb2NoZTIKK29jaWYzCitvMWNpCitvNGNpbAorbzRjbGFtCitvMWM0bDQKK280Y29kCitvMWNvCitvYzNyYWMKK29jNXJhMXRpegorb2NyZTMKKzVvY3JpdAorb2NyaTIKK29jdG8ycjVhCitvMmMxdAorb2MxdG8KK29jM3UxbGEKK281Y3VyZQorb2Q1ZDFlZAorb2QxZDQKK29kM2ljCitvMWQyaTNvCitvMmRvNAorb2Q0b3IzCitvNGQ1dWN0LgorbzFkdQorb2R1MmMKK29kdTJjMXQKK280ZDV1YzR0MXMyCitvNGVsCitvNWVuZworbzNlcgorb2U0dGEKK28zZXYKK28yZmkKK29mNWl0ZQorb2Y0aTR0NHQyCitvMmc1YTVyCitvMWdhCitvNGc1YTF0Mml2CitvNGdhMXRvCitvMWdlCitvNWdlbmUKK28xZ2VuCitvNWdlbworbzRnZXIKK28zZzJpZTQKKzFvMWdpcworb2czaXQKK280Z2wyCitvNWcybHkKKzNvZ25pegorb2cxbmkKK280ZzRybworbzFncgorb2cydTVpMgorMW8xZ3kKKzJvMmc1eTNuCitvMWgyCitvaGFiNQorb2kyCitvaWMzZXMKK29pM2RlcgorbzJpZAorb2k0ZjFmNAorbzJpZzQKK29pNWxldAorbzNpbmcKK29pbnQ1ZXIKK29pbjF0CitvNWkyczFtCitvaTVzbzJuCitvaTJzbworb2lzdDVlbgorb2lzMXRlCitvaTN0ZXIKK28yaXRlCitvNWoKKzJvaworbzNrZW4KK29rNWllNAorb2sxaQorbzFsYQorbzRsYTJuCitvbGEyc3M0CitvMmwyZAorb2wyZDFlCitvbDNlcgorbzNsZXMyYworb2xlczIKK28zbGV0CitvbDRmaQorbzJsZgorb2wyaQorbzNsMmkxYQorbzNsaWNlCitvbDVpZC4KK29sMmlkCitvM2xpNGYKK281bDRpNGwKK29sM2luZworbzVsMmlvCitvNWwyaXMuCitvbDNpczJoCitvNWwyaXRlCitvbDFpdAorbzVsMmkxdDJpbworb2xpMXRpCitvNWwyaXYKK29sbDJpNGU0CitvbDFsCitvbGwyaQorb2w1bzNnaXoKK29sbzRyCitvbDVwMmwyCitvMmxwCitvNGwydAorb2wzdWIKK29sM3VtZQorb2wzdW4KK281bDJ1cworb2wydgorbzJseQorbzJtNWFoCitvMW1hCitvbWE1bAorb201YTF0aXoKK29tMmJlCitvNG0xYgorb200YjJsMgorbzJtZQorb20zZTFuNGEKK28xbWVuCitvbTVlcjJzZQorb21lNHIxczIKK280bWV0CitvbTVlM3RyeQorb200ZXRyCitvM20yaTNhCitvbTNpYy4KK29tM2kxY2EKK281bTJpZAorb20xaW4KK281bTJpbmkKKzVvbW1lbmQKK29tMW0KK29tMW1lbgorb21vNGdlCitvMW1vCitvNG1vMm4KK29tM3BpCitvNG0xcAorb21wcm81CitvbXByMgorbzJuCitvMW4xYQorb240YWMKK28zbjJhMm4KK29uMWMKKzNvbmNpbAorb24xY2kKKzJvbmQKK29uNWRvCitvM25lbgorbzJuNWVzdAorbzFuZXMKK29uNGd1CitvbjFpYworbzNuMmk0bworb24xaXMKK281bmkxdQorb24za2V5CitvNG5rMgorb240b2RpCitvNG4zbzJkCitvbjNvM215CitvMm4zczIKK29uNXNwaTQKK29uc3BpMXI1YQorb25zcDRpcgorb24xc3U0CitvbnRlbjQKK29uMXQKK29uM3Q0aQorb250aTJmNQorb241dW0KK29uMXZhNQorb24xdjIKK29vMgorb29kNWUKK29vZDVpCitvMm80aworb29wM2kKK28zb3JkCitvb3N0NQorbzJwYQorbzJwMmU1ZAorb3AxZXIKKzNvcGVyMWEKKzRvcDRlcmFnCisyb3BoCitvNXBoYTJuCitvNXBoNGVyCitvcDNpbmcKK29waTJuCitvM3BpdAorbzVwbzJuCitvNHBvc2kKK28xcG9zCitvMXByMgorb3AxdQorb3B5NQorbzFxCitvMXJhCitvNXJhLgorbzRyM2FnCitvcjVhbDFpegorb3JhbDFpCitvcjVhbjRnZQorb3JhMm4KK29yMmFuZworb3JlNWEKK281cmUxYTRsCitvcjNlaTIKK29yNGU1czJoCitvcjVlMnN0Lgorb3JlczJ0CitvcmV3NAorb3I0Z3UKK29yZzIKKzRvNXIyaTNhCitvcjNpMWNhCitvNXJpbAorb3IxaW4KK28xcjJpMW8KK29yM2kxdHkKK28zcmkxdQorb3IybWkKK29yMW0KK29ybjJlCitvNXJvZgorb3Izb3VnCitvcm91Mgorb3I1cGUKK29yMXAKKzNvcnJoNAorb3IxcjQKK29yNHNlCitvNHJzMgorb3JzNWVuCitvcnN0NAorb3IzdGhpCitvcjN0aHkKK29yNHR5CitvNXJ1bQorbzFyeQorb3MzYWwKK29zYTIKK29zMmMKK29zNGNlCitvM3Njb3AKK29zMWNvCis0b3Njb3BpCitvNXNjcgorb3M0aTRlNAorb3M1aTF0Mml2Citvc2kxdGkKK29zM2kxdG8KK29zM2kxdHkKK281c2k0dQorb3M0bDIKK28yc28KK28yczRwYQorb3M0cG8KK29zMnRhCitvNXN0YXRpCitvczV0aWwKK29zdDJpCitvczV0aXQKK280dGEybgorbzF0YQorb3RlbGU0Zworb3QzZXIuCitvdDVlNHIxczIKK280dGVzCis0b3RoCitvdGg1ZTFzaQorb3RoMmUKK290aDFlcworb3RoM2k0CitvdDNpYy4KK290NWkxY2EKK28zdGljZQorbzN0aWYyCitvM3Rpcworb3RvNXMyCitvMXRvCitvdTIKK291M2IybDIKK291Y2g1aQorb3UyY2gKK291NWV0CitvdTRsCitvdW5jNWVyCitvdW4yZAorb3U1djIKK292NGVuCitvdmVyNG5lCitvdmU0cjNzMgorb3Y0ZXJ0CitvM3ZpcworbzR2aTF0aTQKK281djRvbAorb3czZGVyCitvdzNlbAorb3c1ZXN0Mworb3cxaTIKK293bjVpCitvNHdvMgorb3kxYQorMXBhCitwYTRjYQorcGE0Y2UKK3BhMmM0dAorcDRhMmQKKzVwYWdhNG4KK3BhMWdhCitwM2FnYXQKK3A0YWkyCitwYTRpNG40CitwNGFsCitwYTFuNGEKK3BhMm4KK3BhbjNlbAorcGFuNHR5CitwYW4xdAorcGEzbnkKK3BhMXAKK3BhNHB1CitwYXJhNWIybDIKK3AyYTJyCitwYTJyYWIKK3BhcjVhZ2UKK3BhcjVkMmkKKzNwYXJlCitwYXI1ZWwKK3A0YTRyMWkKK3BhcjRpcworcGEydGUKK3BhNXRlcgorNXBhdGhpYworcDRhdGgKK3BhNXRoeQorcGE0dHJpYworcGExdHIKK3BhdjQKKzNwYXkKKzRwMWIKK3BkNAorNHBlLgorM3BlNGEKK3BlYXI0bAorcGUyYTJyCitwZTJjCisycDJlZAorM3BlZGUKKzNwNGVkaQorcGUzZDRpM2E0CitwZWQ0aWMKK3A0ZWUKK3BlZTRkCitwZWs0CitwZTRsYQorcGVsMmk0ZTQKK3BlbDJpCitwZTRuMmEybgorcGUxbmEKK3A0ZW5jCitwZW40dGgKK3BlbjF0CitwZTVvMm4KK3A0ZXJhLgorcGVyMWEKK3BlcmE1YjJsMgorcGUycmE0YgorcDRlcmFnCitwNGVyMWkKK3Blcmk1c3QKK3BlcjJpcworcGVyNG1hbAorcGVyM200CitwZXIxbWEKK3BlcjJtZTUKK3A0ZXJuCitwMmVyM28KK3BlcjN0aQorcDRlNXJ1CitwZXIxdgorcGUydAorcGU1dGVuCitwZTV0aXoKKzRwZgorNHBnCis0cGguCitwaGFyNWkKK3BoMmEycgorcGg0ZTNubworcGhlMm4KK3BoNGVyCitwaDRlcy4KK3BoMWVzCitwaDFpYworNXBoMmllNAorcGg1aW5nCis1cGhpczF0MmkKKzNwaGl6CitwNGgybDQKKzNwaG9iCiszcGhvbmUKK3BobzJuCis1cGhvbmkKK3BobzRyCis0cDRoMXMyCitwaDN0Cis1cGh1CisxcGh5CitwMmkzYQorcGkyYTJuNAorcGk0YzJpZTQKK3AyaTFjaQorcGk0Y3kKK3A0aWQKK3A1aTFkMmEKK3BpM2RlCis1cGkyZGkKKzNwaWVjCitwMmllNAorcGkzZW4KK3BpNGdyYXAKK3AyaWcKK3BpMWdyCitwaTNsbworcGkybgorcDRpbi4KK3A0aW5kNAorcDRpMW5vCiszcDJpMW8KK3BpbzJuNAorcDNpdGgKK3BpNXRoYQorcGkydHUKKzJwM2syCisxcDJsMgorM3BsYTJuCitwbGFzNXQKK3BsMmkzYQorcGxpNWVyCitwbDJpZTQKKzRwbDJpZworcGxpNG4KK3Bsb2k0CitwbHU0bQorcGx1NG00YgorNHAxbQorMnAzbgorcG80YworNXBvZC4KK3BvNWVtCitwbzNldDUKKzVwbzRnCitwb2luMgorcG9pMgorNXBvaW4xdAorcG9seTV0CitwbzJseQorcG80bmkKK3BvMm4KK3BvNHAKKzFwNG9yCitwbzRyeQorMXBvcworcG8yczFzCitwNG90CitwbzR0YQorNXBvdW4KK3BvdTIKKzRwMXAKK3BwYTVyYQorcDFwYQorcHAyYTJyCitwMnBlCitwNHAyZWQKK3A1cGVsCitwM3BlbgorcDNwZXIKK3AzcGUydAorcHBvNXMyaXRlCitwMXBvcworcHIyCitwcmF5NGU0Cis1cHJlMWMyaQorcHJlNWNvCitwcmUzZTJtCitwcmU0ZjVhYworcHJlMWYKK3ByZTFmYQorcHJlNGxhCitwcjFlM3I0CitwM3JlMXMyZQorM3ByMmUyc3MKK3ByZTV0ZW4KK3ByZTN2MgorNXByMmk0ZTQKK3ByaW40dDMKK3ByMmk0cworcHJpMnMzbworcDNybzFjYQorcHIyb2MKK3Byb2Y1aXQKK3BybzJmaQorcHJvM2wKK3Byb3MzZQorcHJvMXQKKzJwMXMyCitwMnNlCitwczRoCitwNHNpMWIKKzJwMXQKK3AydDVhNGIKK3AxdGEKK3AydGUKK3AydGgKK3AxdGkzbQorcHR1NHIKK3AxdHUKK3A0dHc0CitwdWIzCitwdWU0CitwdWY0CitwdTRsM2MyCitwdTRtCitwdTJuCitwdXI0cjQKKzVwMnVzCitwdTJ0Cis1cHV0ZQorcHV0M2VyCitwdTN0cgorcHV0NHQxZWQKK3B1NHQzdDIKK3B1dDR0MWluCitwM3cKK3F1MgorcXVhNXY0CisycXVlLgorM3F1ZXIKKzNxdWV0CisycmFiCityYTNiaQorcmFjaDRlMgorcmEyY2gKK3I1YTFjNGw0CityYWY1ZmkKK3JhMmYKK3JhNGYxZjQKK3JhMmY0dAorcjJhaTIKK3JhNGxvCityYW0zZXQKK3IyYW1pCityYTNuZTVvCityYTJuCityYW40Z2UKK3IyYW5nCityNGFuaQorcmE1bm80CityYXAzZXIKKzNyYTFwaHkKK3JhcjVjCityMmEycgorcmFyZTQKK3JhcjVlMWYKKzRyYXJpbAorcmFyMWkKK3IyYXMKK3JhdGlvMm40CityYTF0MmlvCityYXU0dAorcmE1dmFpMgorcmEydmEKK3JhdjNlbAorcmE1ejJpZTQKK3JhMnoxaQorcjFiCityNGJhYgorcjRiYWcKK3JiaTIKK3IyYjNpNGYKK3IyYmluCityNWIyaW5lCityYjVpbmcuCityYjRvCityMWMKK3IyY2UKK3IxY2VuNAorcjNjaGEKK3IyY2gKK3JjaDRlcgorcmNoZTIKK3I0Y2k0YgorcjFjaQorcjJjNGl0CityY3VtMworcjRkYWwKK3IxZDJhCityZDJpCityMWQ0aTRhCityZGk0ZXIKK3JkMmllNAorcmQxaW40CityZDNpbmcKKzJyZS4KK3JlMWE0bAorcmUzYTJuCityZTVhcjFyNAorcmUyYTJyCis1cmVhMnYKK3JlNGF3CityNWVicmF0CityMmUxYgorcmUzYnIKK3JlYzVvbDFsCityZTJjb2wKK3JlMWNvCityZTRjNW9tcGUKK3JlY280bTFwCityZTRjcmUKK3JlMWNyCisycjJlZAorcmUxZGUKK3JlM2RpczEKK3I0ZWRpCityZWQ1aXQKK3JlNGZhYworcmUxZgorcmUxZmEKK3JlMmZlCityZTVmZXIuCityZWZlcjEKK3JlM2ZpCityZTRmeQorcmVnM2lzCityZTVpdAorcmVpMgorcmUxbDJpCityZTVsdQorcjRlbjR0YQorcmVuMXQKK3JlbjR0ZQorcmUxbworcmU1cGkybgorcmU0cG9zaQorcmUxcG8KK3JlMXBvcworcmUxcHUKK3IxZXI0CityNGVyMWkKK3IyZXJvNAorcjRlNXJ1CityNGVzLgorcmU0c3BpCityZTFzcAorcmVzNHM1aTRiCityMmUyc3MKK3JlczFzaQorcmVzMnQKK3JlNXMydGEybAorcmVzMXRhCityMmUzc3Q0cgorcmU0dGVyCityZTR0aTR6CityZTN0cmkKK3I0ZXUyCityZTV1MXQyaQorcmV2MgorcmU0dmFsCityZTF2YQorcmV2M2VsCityNWV2NWVyLgorcmV2MWVyCityZTV2ZTRyMXMyCityZTV2ZXJ0CityZTV2aTRsCityZTF2aQorcmV2NW9sdQorcmU0d2gKK3IxZgorcjNmdTQKK3I0ZnkKK3JnMgorcmczZXIKK3IzZ2V0CityM2cxaWMKK3JnaTRuCityZzNpbmcKK3I1Z2lzCityNWdpdAorcjFnbDIKK3JnbzRuMgorcjFnbworcjNndQorcmg0Cis0cmguCis0cmhhbAorcjJpM2EKK3JpYTRiCityaTRhZworcjRpYgorcmliM2EKK3JpYzVhczUKK3JpMWNhCityNGljZQorNHIyaTFjaQorNXJpNWMyaWQKK3JpNGMyaWU0CityNGkxY28KK3JpZDVlcgorcjJpZAorcmkzZW5jCityMmllNAorcmkzZW4xdAorcmkxZXIKK3JpNWV0CityaWc1YTJuCityMmlnCityaTFnYQorNXI0aWdpCityaWwzaXoKK3JpbDFpCis1cmltYTJuCityaTFtYQorcmltNWkKKzNyaTFtbworcmltNHBlCityaTRtMXAKK3IyaTFuYQorNXJpbmEuCityNGluNGQKK3IyaW40ZQorcmluNGcKK3IyaTFvCis1cmlwaAorcjJpcAorcmlwaDVlCityaTJwMmwyCityaXA1bGljCityNGlxCityMmlzCityNGlzLgorcjJpczRjCityM2lzMmgKK3JpczRwCityaTN0YTNiCityaTF0YQorcjVpdGVkLgorcjJpdGUKK3JpMnQxZWQKK3JpdDVlci4KK3JpdDVlNHIxczIKK3I0aTJ0M2ljCityaTF0aQorcmkydHUKK3JpdDV1cgorcml2NWVsCityMml2CityaXYzZXQKK3JpdjNpCityM2oKK3Iza2V0CityazRsZQorcmsxbAorcms0bGluCityMWwKK3JsZTQKK3IybGVkCityNGwyaWcKK3I0bGlzCitybDVpczJoCityM2xvNAorcjFtCitybWE1YworcjFtYQorcjJtZQorcjNtZW4KK3JtNWU0cjFzMgorcm0zaW5nCityNG1pbmcuCityNG0yaW8KK3IzbWl0CityNG15CityNG4yYTJyCityMW5hCityM25lbAorcjRuMWVyCityNW5ldAorcjNuZXkKK3I1bmljCityMW5pczQKK3IzbjJpdAorcjNuMml2Citybm80CityNG5vdTIKK3IzbnUKK3JvYjNsMgorcjJvYworcm8zY3IKK3JvNGUKK3JvMWZlCitybzVmaWwKK3JvMmZpCityMm9rMgorcm81azFlcgorNXJvbGUuCityb201ZTF0ZQorcm8ybWUKK3JvNG1ldAorcm9tNGkKK3JvNG00cAorcm9uNGFsCitybzJuCitybzFuMWEKK3JvbjRlCitybzVuNGlzCityb240dGEKK3JvbjF0Cisxcm9vbQorcm9vMgorNXJvb3QKK3JvM3BlbAorcm9wM2ljCityb3IzaQorcm81cm8KK3JvMnM1cGVyCitybzJzNHMKK3JvNHRoMmUKK3I0b3RoCitybzR0eQorcm80dmEKK3JvdjVlbAorcm94NQorcjFwCityNHBlNGEKK3I1cGVuMXQKK3JwNWVyLgorcjNwZTJ0CitycDRoNAorcnAzaW5nCitycGkybgorcjNwbworcjFyNAorcnJlNGMKK3JyZTRmCityNHJlMW8KK3JyZTRzMnQKK3JyMmk0bworcnIyaTR2Citycm8ybjQKK3Jyb3M0CitycnlzNAorNHJzMgorcjFzYTIKK3JzYTV0aQorcnM0YworcjJzZQorcjNzZWMKK3JzZTRjcgorcjRzNWVyLgorcnMzZTRzCityNXNlNXYyCityMXMyaAorcjVzaGEKK3Ixc2kKK3I0c2k0YgorcnNvMm4zCityMXNvCityMXNwCityNXN3MgorcnRhMmNoNAorcjF0YQorcjR0YWcKK3IzdDJlMWIKK3IzdGVuNGQKK3IxdGU1bworcjF0aQorcjJ0NWkyYgorcnQyaTRkCityNHRpZXIKK3J0MmllNAorcjN0MmlnCitydGlsM2kKK3J0aWw0bAorcjR0aTFseQorcjR0aXN0CityNHQyaXYKK3IzdHJpCitydHIyb3BoNAorcnQ0czJoNAorcjR0MXMyCitydTNhCitydTNlNGwKK3J1M2VuCitydTRnbDIKK3J1M2k0bgorcjJ1aTIKK3J1bTNwMmwyCitydTRtMnAKK3J1Mm4KK3J1NG5rNQorcnVuNHR5CitydW4xdAorcjV1c2MyCityMnVzCitydTJ0MWk1bgorcjR1MXQyaQorcnY0ZQorcnZlbDRpCityM3ZlbgorcnY1ZXIuCityNXZlc3QKK3J2NGUycworcjN2ZXkKK3IzdmljCityM3YyaTR2CityM3ZvCityMXcKK3J5NGMKKzVyeW5nZQorcnluNWcKK3J5M3QKK3NhMgorMnMxYWIKKzVzYWNrMQorc2FjM3JpMgorczNhMmMxdAorNXNhaTIKK3NhNGwyYTJyNAorczRhMmw0bQorc2E1bG8KK3NhNGw0dAorM3NhbmMKK3NhMm4KK3NhbjRkZQorczRhbmQKK3MxYXAKK3NhNXRhCis1c2EzdDJpbworc2EydDN1CitzYXU0CitzYTV2b3IKKzVzYXcKKzRzNWIKK3NjYW40dDUKK3MxY2EKK3NjYTJuCitzY2E0cAorc2NhdjUKK3M0Y2VkCis0czNjZWkyCitzNGNlcworczJjaDIKK3M0Y2hvMgorM3M0YzJpZTQKK3MxY2kKKzVzYzRpbjRkCitzMmNpbgorc2NsZTUKK3MxYzRsNAorczRjbGkKK3Njb2Y0CitzMWNvCis0c2NvcHk1CitzY291MXI1YQorc2NvdTIKK3MxY3UKKzRzNWQKKzRzZS4KK3NlNGEKK3NlYXM0CitzZWE1dworc2UyYzNvCiszc2UyYzF0Cis0czRlZAorc2U0ZDRlCitzNWVkbAorc2UyZworc2UxZzNyCis1c2VpMgorc2UxbGUKKzVzZTJsMmYKKzVzZWx2Cis0c2UxbWUKK3NlNG1vbAorc2UxbW8KK3NlbjVhdAorc2UxbmEKKzRzZW5jCitzZW40ZAorczVlMm5lZAorc2VuNWcKK3M1ZW4xaW4KKzRzZW40dDFkCitzZW4xdAorNHNlbjJ0bAorc2UycDNhMworNHMxZXIuCitzNGVyMWwKK3MyZXI0bworNHNlcjN2bworczFlNHMKK3M0ZTVzMmgKK3NlczV0Cis1c2U1dW0KK3M0ZXUKKzVzZXYKK3NldjNlbgorc2V3NGkyCis1c2V4Cis0czNmCisyczNnCitzMmgKKzJzaC4KK3NoMWVyCis1c2hldgorc2gxaW4KK3NoM2lvCiszc2gyaTRwCitzaDJpMnY1CitzaG80CitzaDVvMmwyZAorc2hvMm4zCitzaG9yNAorc2hvcnQ1Cis0c2gxdworc2kxYgorczVpYzNjCiszc2kyZGUuCitzMmlkCis1c2lkZTRzMgorNXNpMmRpCitzaTVkaXoKKzRzaWcxbjRhCitzMmlnCitzaWw0ZQorNHNpMWx5CisyczFpbgorczJpMW5hCis1c2kybmUuCitzMmluZQorczNpbmcKKzFzMmlvCis1c2lvMm4KK3NpbzFuNWEKK3M0aTJyCitzaTFyNWEKKzFzaXMKKzNzMmkxdDJpbworc2kxdGkKKzVzaTF1CisxczJpdgorNXNpegorc2syCis0c2tlCitzM2tldAorc2s1aW5lCitzazFpCitzazVpbjRnCitzMWwyCitzM2xhdAorczJsZQorc2wyaXRoNQorc2wxaXQKKzJzMW0KK3MzbWEKK3NtYWwxbDMKK3NtYTJuMworc21lbDQKK3M1bWVuCis1czRtMml0aAorc21vMmw1ZDQKK3MxbW8KK3MxbjQKKzFzbworc280Y2UKK3NvMmZ0Mworc280bGFiCitzbzFsYQorc28ybDNkMgorc28zbGljCitzb2wyaQorNXNvbDJ2Ciszc29tCiszczRvbi4KK3NvMm4KK3NvMW4xYTQKK3NvbjRnCitzNG9wCis1c29waDFpYworczJvcGgKK3M1bzNwaGl6CitzNW8xcGh5Citzb3I1Yworc29yNWQKKzRzb3YKK3NvNXZpCisyczFwYQorNXNwNGFpMgorc3BhNG4KK3NwZW40ZAorMnM1cGVvCisyc3BlcgorczJwaGUKKzNzcGg0ZXIKK3NwaG81CitzcGlsNAorc3A1aW5nCitzcGkybgorNHMzcDJpMW8KK3M0cDFseQorczFwMmwyCitzNHBvMm4KK3MxcDRvcjQKKzRzcDRvdAorc3F1YWw0bAorc3F1MgorczFyCisyc3MKK3Mxc2EyCitzc2FzMworczJzNWMKK3Mzc2VsCitzNXNlbjVnCitzNHNlcy4KK3NzMWU0cworczVzZXQKK3Mxc2kKK3M0czJpZTQKK3NzaTRlcgorczRzNWkxbHkKK3M0czFsMgorc3M0bGkKK3M0czFuNAorc3NwZW40ZDQKK3NzMnQKK3NzdTFyNWEKK3Mxc3UKK3NzdTJyCitzczV3MgorMnN0LgorczJ0YWcKK3MxdGEKK3MydGEybAorc3RhbTRpCis1c3Q0YW5kCitzdGEybgorczR0YTRwCis1c3RhdC4KK3M0dDFlZAorc3Rlcm41aQorczV0MmVybworc3RlMncKK3N0ZTF3NWEKK3MzdGgyZQorc3QyaQorczR0aS4KK3M1dDJpMWEKK3MxdGljCis1czR0aWNrMQorczR0MmllNAorczN0aWYyCitzdDNpbmcKK3MydDFpbgorNXN0NGlyCitzMXRsZQorczJ0bAorNXN0b2NrMQorczF0bworc3RvMm0zYQorNXN0b25lCitzdG8ybgorczR0b3AKKzNzdG9yZQorc3Q0cgorczR0cmEyZAorczF0cmEKKzVzdHJhMnR1CitzNHRyYXkKK3M0dHIyaWQKKzRzdHJ5Cis0c3QzdzQKK3MydHkKKzFzdQorc3UxYWwKK3N1NGIzCitzdTJnMworc3U1aXMKK3MydWkyCitzdWl0MworczR1bAorc3UybQorc3UxbTNpCitzdTJuCitzdTJyCis0c3YKK3N3MgorNHMxd28yCitzNHkKKzRzeTFjCiszc3lsCitzeW41bworc3k1cmluCisxdGEKKzN0YS4KKzJ0YWIKK3RhNWJsZXMyCit0YWIybDIKKzV0YWI1bzVsMWl6Cit0YWJvbDJpCis0dDRhMmNpCit0YTVkbwordGEyZAorNHRhMmY0Cit0YWk1bG8KK3RhaTIKK3RhMmwKK3RhNWxhCit0YWw1ZW4KK3QyYWxlCit0YWwzaQorNHRhbGsKK3RhbDRsaXMKK3RhbDFsCit0YWxsMmkKK3RhNWxvZwordGE1bW8KK3RhbjRkZQordGEybgordDRhbmQKKzF0YW4xdGEzCit0YW4xdAordGE1cGVyCit0YTVwMmwyCit0YXI0YQordDJhMnIKKzR0YXIxYworNHRhcmUKK3RhM3IyaXoKK3RhcjFpCit0YXM0ZQordGE1czR5Cis0dGF0MWljCit0YTR0dXIKK3RhMnR1Cit0YXVuNAordGF2NAorMnRhdwordGF4NGlzCit0YXgzaQorMnQxYgorNHRjCit0NGNoCit0Y2g1ZTR0Cit0Y2hlMgorNHQxZAorNHRlLgordGUyYWQ0aQordGVhMmQxCis0dGVhMnQKK3RlMWNlNAorNXRlMmMxdAorMnQxZWQKK3Q0ZTVkaQorMXRlZQordGVnNAordGU1Z2VyNAordGU1Z2kKKzN0ZWwuCit0ZWwyaTQKKzV0ZTJsMXMyCit0ZTJtYTIKK3RlbTNhdAorM3RlbjJhMm4KK3RlMW5hCiszdGVuYworM3RlbmQKKzR0ZTFuZXMKKzF0ZW4xdAordGVuNHRhZwordGVuMXRhCisxdGVvCit0ZTRwCit0ZTVwZQordGVyM2MKKzV0ZXIzZAorMXRlcjFpCit0ZXI1aWVzCit0ZXIyaWU0Cit0ZXIzaXMKK3Rlcmk1emExCis1dDRlcjNuMml0Cit0ZXI1dgorNHRlcy4KKzR0MmUyc3MKK3QzZXNzLgordGV0aDVlCiszdDRldQorM3RleAorNHRleQorMnQxZgorNHQxZworMnRoLgordGhhMm40Cit0aDJlCis0dGhlYQordGgzZWFzCit0aGU1YTJ0Cit0aGUzaXMKK3RoZWkyCiszdGhlNHQKK3RoNWljLgordGg1aTFjYQorNHRoNGlsMgorNXRoNGk0bmsyCis0dDRoMWw0Cit0aDVvZGUKKzV0aG9kM2ljCis0dGhvbzIKK3Rob3I1aXQKK3RobzVyaXoKKzJ0NGgxczIKKzF0MmkxYQordGk0YWIKK3RpNGExdG8KKzJ0aTJiCis0dGljazEKK3Q0aTFjbwordDRpYzF1Cis1dGkyZGkKK3QyaWQKKzN0aWVuCit0MmllNAordGlmMgordGk1ZnkKKzJ0MmlnCis1dGlndQordGlsMmw1aW40Cit0aWwxbAordGlsbDJpCisxdGltCis0dGk0bTFwCit0aW01dWwKK3RpMm11CisydDFpbgordDJpMW5hCiszdGkybmUuCit0MmluZQorM3QyaW5pCisxdDJpbwordGk1b2MKK3Rpb241ZWUKK3RpbzJuCis1dGlxCit0aTNzYTIKKzN0NGlzZQordGkyczRtCit0aTVzbwordGlzNHAKKzV0aXN0aTFjYQordGlzMXQyaQordGlzMXRpYwordGkzdGwKK3RpNHUKKzF0Mml2Cit0aTF2NGEKKzF0aXoKK3RpM3phMQordGkzemU0bgordGkyemUKKzJ0bAordDVsYQordGxhMm40CiszdGxlLgorM3RsZWQKKzN0bGVzLgordGxlczIKK3Q1bGV0LgordDVsbworNHQxbQordG1lNAorMnQxbjIKKzF0bwordG8zYgordG81Y3JhdAorNHRvMmRvNAorMnRvZgordG8yZ3IKK3RvNWljCit0b2kyCit0bzJtYQordG80bTRiCit0bzNteQordG9uNGE0bDFpCit0bzJuCit0bzFuMWEKK3RvM24yYXQKKzR0b25vCis0dG9ueQordG8ycmEKK3RvM3IyaWU0Cit0b3I1aXoKK3RvczIKKzV0b3VyCit0b3UyCis0dG91dAordG8zdzJhMnIKKzR0MXAKKzF0cmEKK3QycmEzYgordHJhNWNoCit0cjRhMmNpNAordHJhMmM0aXQKK3RyYWM0dGUKK3RyYTJjMXQKK3RyMmFzNAordHJhNXZlbgordHJhdjVlMnM1Cit0cmU1ZgordHJlNG0KK3RyZW01aQorNXRyMmkzYQordHJpNWNlcwordHI0aWNlCis1dHJpM2MyaTFhCit0NHIyaTFjaQorNHRyaTRjM3MyCisydHJpbQordHIyaTR2Cit0cm81bTRpCit0cm9uNWkKK3RybzJuCis0dHJvbnkKK3RybzVwaGUKK3RyMm9waAordHJvM3NwCit0cm8zdgordHIydTVpMgordHIydXM0Cis0dDFzMgordDRzYwordHMyaDQKK3Q0c3cyCis0dDN0MgordDR0ZXMKK3Q1dG8KK3QxdHU0CisxdHUKK3R1MWEKK3R1M2EycgordHU0YjRpCit0dWQyCis0dHVlCis0dHVmNAorNXQydTNpMgorM3R1bQordHU0bmlzCit0dTFuaQorMnQzdXAuCiszdHVyZQorNXR1cmkKK3R1cjNpcwordHVyNW8KK3R1NXJ5CiszdDJ1cworNHR2Cit0dzQKKzR0MXdhCit0d2lzNAordHdpMgorNHQxd28yCisxdHkKKzR0eWEKKzJ0eWwKK3R5cGUzCit0eTVwaAorNHR6Cit0Mno0ZQorNHVhYgordWFjNAordWE1bmEKK3VhMm4KK3VhbjRpCit1YXI1YW4xdAordTJhMnIKK3VhcmEybgordWFyMmQKK3VhcjNpCit1YXIzdAordTFhdAordWF2NAordWI0ZQordTRiZWwKK3UzYmVyCit1NGIyZXJvCit1MWI0aQordTRiNWluZwordTNiNGxlLgordWIybDIKK3UzY2EKK3VjaTRiCit1MWNpCit1MmM0aXQKK3VjbGUzCit1MWM0bDQKK3UzY3IKK3UzY3UKK3U0Y3kKK3VkNWQ0Cit1ZDNlcgordWQ1ZXN0Cit1ZGVzMgordWRlMXY0Cit1MWRpYwordWQzaWVkCit1ZDJpZTQKK3VkM2llcwordWQ1aXMxCit1NWRpdAordTRkbzJuCit1MWRvCit1ZDRzaQordTJkMXMyCit1NGR1Cit1NGVuZQordWUybjFzNAordWVuNHRlCit1ZW4xdAordWVyNGlsCit1ZXIxaQorM3UxZmEKK3UzZjRsMgordWdoM2UybgordWc1aW4KKzJ1aTIKK3VpbDVpegordWlsMWkKK3VpNG4KK3UxaW5nCit1aXI0bQordTRpcgordWkxdGE0Cit1Mml2MwordWk0djRlci4KK3U1agorNHVrCit1MWxhCit1bGE1YgordTVsYXRpCit1bDJjaDQKK3U0bDFjMgorNXVsY2hlMgordWwzZGVyCit1MmxkCit1bDJkZQordWw0ZQordTFsZW4KK3VsNGdpCit1NGwxZzQKK3VsMmkKK3U1bDJpMWEKK3VsM2luZwordWw1aXMyaAordWw0bDJhMnIKK3VsMWwKK3VsNGxpNGIKK3VsbDJpCit1bDRsaXMKKzR1MmwzbQordTFsNG8KKzR1MmwxczIKK3VsczVlNHMKK3VsMnNlCit1bDF0aQordTRsdAordWwxdHJhMwordWwxdHIKKzR1bDF0dTIKK3UzbHUKK3VsNXVsCit1bDV2Cit1Mm01YWIKK3UxbWEKK3VtNGJpCit1NG0xYgordW00YjFseQordW1iMmwyCit1MW1pCit1NG0zaW5nCit1bW9yNW8KK3UxbW8KK3VtbzJyCit1NG0ycAordW4yYXQ0Cit1MW5hCit1Mm5lCit1bjRlcgordTFuaQordW40aW0KK3UybjFpbgordW41aXMyaAordW4yaTN2Cit1Mm4zczQKK3VuNHN3MgordW4ydDNhNGIKK3VuMXQKK3VuMXRhCit1bjR0ZXIuCit1bjR0ZXMKK3VudTQKK3VuNXkKK3U0bjV6Cit1NG80cnMyCit1NW9zCit1MW91MgordTFwZQordXBlNHI1czIKK3U1cDJpM2EKK3VwM2luZwordXBpMm4KK3UzcDJsMgordTRwM3AKK3VwcG9ydDUKK3VwMXA0b3IKK3VwMnQ1aTJiCit1MnAxdAordXAxdHU0Cit1MXJhCis0dXJhLgordTRyYWcKK3U0cjJhcwordXI0YmUKK3VyMWIKK3VyMWM0Cit1cjFkCit1cmU1YTJ0Cit1cjRmZXIxCit1cjFmCit1cjRmcgordTNyaWYKK3VyaTRmaWMKK3VyaTFmaQordXIxaW4KK3UzcjJpMW8KK3Uxcml0Cit1cjNpegordXIybAordXJsNWluZy4KK3VyNG5vNAordXJvczQKK3VyNHBlCit1cjFwCit1cjRwaQordXJzNWVyCit1NHJzMgordXIyc2UKK3VyNXRlcwordXIzdGgyZQordXIxdGk0Cit1cjR0MmllNAordTNydQorMnVzCit1NXNhMmQKK3VzYTIKK3U1c2EybgordXM0YXAKK3VzYzIKK3VzM2NpCit1c2U1YQordTVzMmkxYQordTNzaWMKK3VzNGxpbgordXMxbDIKK3VzMXAKK3VzNXMxbDIKK3Uyc3MKK3VzNXRlcmUKK3VzMXQ0cgordTJzdQordXN1MnI0Cit1MnRhNGIKK3UxdGEKK3UzdGF0Cis0dTR0ZS4KKzR1dGVsCis0dXRlbgordXRlbjRpCis0dTF0MmkKK3V0aTVsMml6Cit1dGlsMWkKK3UzdDJpbmUKK3UydDFpbgordXQzaW5nCit1dGlvMW41YQordTF0MmlvCit1dGlvMm4KK3U0dGlzCis1dTV0aXoKK3U0dDFsCit1MnQ1b2YKK3UxdG8KK3V0bzVnCit1dG81bWF0MWljCit1dG8ybWEKK3U1dG8ybgordTR0b3UyCit1NHQxczQKK3UzdQordXU0bQordTF2MgordXgxdTMKK3UyejRlCisxdmEKKzV2YS4KKzJ2MWE0YgordmFjNWlsCit2NGEyY2kKK3ZhYzN1Cit2YWc0Cit2YTRnZQordmE1bDJpNGU0Cit2YWwxaQordmFsNW8KK3ZhbDF1Cit2YTVtbwordmE1bml6Cit2YTJuCit2YTVwaQordmFyNWllZAordjJhMnIKK3ZhcjFpCit2YXIyaWU0CiszdmF0Cis0dmUuCis0dmVkCit2ZWczCit2M2VsLgordmVsM2wyaQordmVsMWwKK3ZlNGxvCit2NGUxbHkKK3ZlbjNvbQordjRlbm8KK3Y1ZW51ZQordjRlcmQKKzV2MmUycmUuCit2NGVyZWwKK3YzZXJlbgordmVyNWVuYwordjRlcmVzCit2ZXIzaWU0Cit2ZXIxaQordmVybWk0bgordmVyM200CiszdmVyMnNlCit2ZTRyMXMyCit2ZXIzdGgKK3Y0ZTJzCis0dmVzLgordmVzNHRlCit2ZTR0ZQordmV0M2VyCit2ZTR0eQordmk1YWwxaQordjJpMWEKK3ZpMmFsCis1dmkyYTJuCis1dmkyZGUuCit2MmlkCis1dmkyZDFlZAorNHYzaTFkZW4KKzV2aWRlNHMyCis1dmkyZGkKK3YzaWYKK3ZpNWduCit2MmlnCit2NGlrNAorMnZpbAorNXYyaWwxaXQKK3ZpbDFpCit2M2kzbDJpegordjFpbgorNHZpNG5hCit2MmluYwordjRpbjVkCis0dmluZwordmkxbzNsCit2MmlvCit2M2lvNHIKK3ZpMW91MgordjJpNHAKK3ZpNXJvCit2NGlyCit2aXMzaXQKK3ZpM3NvCit2aTNzdQorNHZpMXRpCit2aXQzcgorNHZpMXR5CiszdjJpdgorNXZvLgordm9pNAorM3Yyb2sKK3ZvNGxhCit2NW9sZQorNXZvNGwydAorM3ZvbDJ2Cit2b201aQordm8ycjVhYgordm8xcmEKK3Zvcmk0Cit2bzRyeQordm80dGEKKzR2bzF0ZWUKKzR2djQKK3Y0eQordzVhYjJsMgorMndhYword2E1Z2VyCit3YTJnNW8KK3dhaXQ1Cit3YWkyCit3NWFsLgord2FtNAord2FyNHQKK3cyYTJyCit3YXM0dAord2ExdGUKK3dhNXZlcgordzFiCit3ZWE1cjJpZTQKK3dlMmEycgord2VhcjFpCit3ZTRhdGgzCit3ZWEydAord2U0ZDRuNAord2VldDMKK3dlZTV2Cit3ZWw0bAordzFlcgord2VzdDMKK3czZXYKK3doaTQKK3dpMgord2lsMgord2lsMmw1aW40Cit3aWwxbAord2lsbDJpCit3aW40ZGUKK3c0aW5kCit3aW40ZwordzRpcjQKKzN3NGlzZQordzJpdGgzCit3aXo1Cit3NGsKK3dsNGVzMgord2wzaW4KK3c0bm8KKzF3bzIKK3dvbTEKK3dvNXY0ZW4KK3c1cAord3JhNAord3JpNAord3JpMXRhNAordzNzMmgKK3dzNGwyCit3czRwZQordzVzNHQKKzR3dAord3k0Cit4MWEKK3hhYzVlCit4NGEyZ28KK3hhbTMKK3g0YXAKK3hhczUKK3gzYzIKK3gxZQoreGU0Y3UxdG8KK3hlMWN1Cit4ZTNjNHV0Cit4MmVkCit4ZXI0aQoreDJlNXJvCit4MWgKK3hoaTIKK3hoNGlsNQoreGh1NAoreDNpCit4Mmk1YQoreGk1YworeGk1ZGkKK3gyaWQKK3g0aW1lCit4aTVtMml6Cit4aW0xaQoreDNvCit4NG9iCit4M3AKK3hwNGFuNGQKK3gxcGEKK3hwYTJuCit4cGVjMXRvNQoreHBlMmMKK3hwZTJjMXQKK3gycDJlM2QKK3gxdDIKK3gzdGkKK3gxdQoreHUzYQoreHg0Cit5NWFjCiszeTJhMnI0Cit5NWF0Cit5MWIKK3kxYworeTJjZQoreWM1ZXIKK3kzY2gKK3ljaDRlMgoreWNvbTQKK3kxY28KK3ljb3Q0Cit5MWQKK3k1ZWUKK3kxZXIKK3k0ZXIxZgoreWVzNAoreWU0dAoreTVnaQorNHkzaAoreTFpCit5M2xhCit5bGxhNWIybDIKK3lsMWwKK3kzbG8KK3k1bHUKK3ltYm9sNQoreTRtMWIKK3ltZTQKK3ltMXBhMworeTRtMXAKK3luM2M0aHI0Cit5bjJjaAoreW41ZAoreW41ZworeW41aWMKKzV5bngKK3kxbzQKK3lvNWQKK3k0bzVnCit5b200Cit5bzVuZXQKK3lvMm4KK3k0bzJuM3MyCit5NG9zCit5NHAyZWQKK3lwZXI1Cit5cDNpCit5M3BvCit5NHBvNGMKK3lwMnRhCit5MnAxdAoreTVwdQoreXJhNW0KK3lyNWkzYQoreTNybworeXI0cjQKK3lzNGMKK3kzczJlCit5czNpMWNhCit5MXMzaW8KKzN5MXNpcworeTRzbworeTJzczQKK3lzMXQKK3lzM3RhCit5c3UycjQKK3kxc3UKK3kzdGhpbgoreXQzaWMKK3kxdworemExCit6NWEyYgorejJhMnIyCis0emIKKzJ6ZQoremU0bgoremU0cAorejFlcgorejJlM3JvCit6ZXQ0CisyejFpCit6NGlsCit6NGlzCis1emwKKzR6bQorMXpvCit6bzRtCit6bzVvbAorem9vMgorenRlNAorNHoxejIKK3o0enkKKy5hczlzOG85YzhpOGE4dGUuCisuYXMxc28KKy5hc3NvMWNpCisuYXNzbzNjMmkxYQorLmFzOXM4bzljOGk4YTh0OGVzLgorLmRlOGM5bDhpOW44YTl0OGk4b24uCisuZGUxYzRsNAorLmRlY2w0aTFuYQorLmRlY2xpbjJhdAorLmRlY2xpbmExdDJpbworLmRlY2xpbmF0aW8ybgorLm9iOGw4aThnOWE5dDhvOHJ5LgorLm9iMmwyCisub2JsMmlnCisub2JsaTFnYQorLm9ibGlnYTF0bworLm9ibGlnYXRvMXJ5CisucGg4aThsOWE4bjl0OGg4cjhvOHA4aWMuCisucGg0aWwyCisucGhpMWxhCisucGhpbGEybgorLnBoaWxhbjF0CisucGhpbGFudDRocjQKKy5waGlsYW50aHJvcDNpYworLnByOGU4czhlOG50LgorLnAzcmUxczJlCisucHJlc2VuMXQKKy5wcjhlOHM4ZThuOHRzLgorLnByZXNlbjR0NHMyCisucHI4bzhqOGU4Y3QuCisucHJvNWoKKy5wcm8xamUKKy5wcm9qZTJjMXQKKy5wcjhvOGo4ZThjOHRzLgorLnByb2plYzR0MXMyCisucmU4YzlpOXA4cjhvOGM5aTl0OHkuCisucmUxYzJpCisucmVjMmlwCisucmVjaXByMgorLnJlY2lwcjJvYworLnJlMWNpcHJvMWNpCisucmVjaXBybzJjMWl0CisucmVjaXByb2NpMXR5CisucmU5YzhvOGc5bjhpOXo4YThuOGNlLgorLnJlMWNvCisucmUyY29nCisucmVjM29nbml6CisucmVjb2cxbmkKKy5yZWNvZ25pemExCisucmVjb2duaXphMm4KKy5yZThmOW84cjltOGE5dDhpOG9uLgorLnJlMWYKKy5yZTFmbworLnJlZm8ycgorLnJlZm9yMW0KKy5yZWZvcjFtYQorLnJlZm9ybWExdDJpbworLnJlZm9ybWF0aW8ybgorLnJlOHQ5cjhpOWI4dTl0OGk4b24uCisucmUzdHJpCisucmV0cjRpYgorLnJldHJpM2J1MXQyaW8KKy5yZXRyaWI0dTF0MmkKKy5yZXRyaWJ1dGlvMm4KKy50YTliOGxlLgorLjJ0YWIKKy50YWIybDIKKy5hYzhhOGQ5ZTltOHkuCisuYTFjYQorLmFjYTJkCisuYWNhZDRlbQorLmFjYWRlM215CisuYWM4YThkOWU5bThpOGU4cy4KKy5hY2FkZW0yaTRlNAorLmFjOWM4dTlzOGE5dDhpOHY4ZS4KKy5hYzNjCisuYWMxYzJ1cworLmFjY3VzYTIKKy5hY2N1c2ExdDJpdgorLmFjOHI4bzluOHk4bS4KKy5hY3JvMm4KKy5hY3JvbnltNAorLmFjOHI4eThsOWE4bThpOGQ4ZS4KKy5hY3J5M2xhCisuYWNyeWxhbTJpZAorLmFjOHI4eThsOWE4bThpOGQ4ZThzLgorLmFjcnlsYW1pZGU0czIKKy5hYzhyOHk4bDlhOGw4ZDhlOWg4eThkOGUuCisuYWNyeWxhMmxkCisuYWNyeWxhbDJkZQorLmFjcnlsYWxkZTFoNAorLmFjcnlsYWxkZWh5MWQKKy5hZDhkOWE5YjhsOGUuCisuYWQxZDJhCisuYWQyZDNhNGIKKy5hZGRhYjJsMgorLmFkOGQ5aTliOGw4ZS4KKy5hZGRpMWIybDIKKy5hZDhyOGU4bjlhOWw4aThuOGUuCisuYTFkcgorLmFkcmU0CisuYTVkcmVuCisuYWRyZTFuYQorLmFkcmVuYTRsMWkKKy5hZHJlbmExbDRpbmUKKy5hZThyOG85czhwOGE4YzhlLgorLmFlNHIKKy5hMmVybworLmFlcm8yczRwYQorLmFlcm9zcGE0Y2UKKy5hZjl0OGU4cjl0OGg4bzh1OGc4aDh0LgorLmFmdGVydGhvdTIKKy5hZjl0OGU4cjl0OGg4bzh1OGc4aDh0OHMuCisuYWZ0ZXJ0aG91Z2g0dDFzMgorLmFnOHI4bzhuOW85bThpOHM4dC4KKy5hMWdyCisuYWc0cm8KKy5hZ3JvMm4KKy5hZ3Jvbm9tMmlzCisuYWc4cjhvOG45bzltOGk4czh0OHMuCisuYWdyb25vbWlzNHQxczIKKy5hbDlnOGU5YjhyOGE5aTljOGE4bDlsOHkuCisuYTRsMWc0CisuYWxnMmUxYgorLmFsZ2UzYnIKKy5hbGdlYnIyYWkyCisuYWxnZWJyYWkxY2EKKy5hbGdlYnJhaWNhbDFsCisuYWxnZWJyYWljYWwxbHkKKy5hbTlwOGg4ZTh0OWE5bThpOG44ZS4KKy5hNG0xcAorLmFtcGhlNHQKKy5hbXBoZTF0YQorLmFtcGhldGFtMWluCisuYW1waGV0YW0yaW5lCisuYW05cDhoOGU4dDlhOW04aThuOGU4cy4KKy5hbXBoZXRhbWkxbmVzCisuYW45YTlsOHk4czhlLgorLjNhbmExbHkKKy5hMW5hCisuYW40YTJseXM0CisuYW5hbDV5M3MyZQorLmFuOWE5bDh5OHM4ZThkLgorLmFuYWx5NHM0ZWQKKy5hbjhhOGw4eTlzOGU4cy4KKy5hbmFseXMxZTRzCisuYW45aThzOG85dDhyOG84cDlpOGMuCisuYW5pMnNvCisuYW5pc290cm9wM2ljCisuYW45aThzOG85dDhyOG84cDlpOWM4YThsOWw4eS4KKy5hbmlzb3Ryb3BpMWNhCisuYW5pc290cm9waWNhbDFsCisuYW5pc290cm9waWNhbDFseQorLmFuOWk4czhvOHQ5cjhvOXA4aThzOG0uCisuYW5pc290cm9waTJzMW0KKy5hbjlpOHM4bzh0OXI4bzhwOHkuCisuYW5pc290cm9weTUKKy5hbjhvOG05YThsOHkuCisuYW5vNAorLmFub21hNWwKKy5hbm8xbWEKKy5hbm9tYTFseQorLmFuOG84bTlhOGw4aThlOHMuCisuYW5vbWFsMWkKKy5hbm9tYWwyaTRlNAorLmFuOHQ4aTlkOGU4cjhpOHY5YTl0OGk4djhlLgorLmFudDJpZAorLmFudGlkZXIxaQorLmFudGlkZXIyaTR2CisuYW50aWRlNHJpMXZhCisuYW50aWRlcmkzdmF0CisuYW50aWRlcjJpdmExdDJpdgorLmFuOHQ4aTlkOGU4cjhpOHY5YTl0OGk4djhlOHMuCisuYW50aWRlcml2YXRpdjRlMnMKKy5hbjh0OGk5aDhvOGw4bzltOG84cjlwOGg4aThjLgorLmFudGkzaAorLmFudGlob2xvMW1vCisuYW50aWhvbG9tbzJyCisuYW50aWhvbG9tb3IxcAorLmFudGlob2xvbW9ycDRoNAorLmFudGlob2xvbW9ycGgxaWMKKy5hbjl0OGk4bjlvOW04eS4KKy5hbjJ0MWluCisuYW50Mmkxbm8KKy5hbnRpbm8zbXkKKy5hbjl0OGk4bjlvOW04aThlOHMuCisuYW50aW5vbTJpZTQKKy5hbjl0OGk5bjh1OWM4bDhlOGE4ci4KKy5hbnRpbjF1CisuYW50aW51Y2xlMworLmFudGludTFjNGw0CisuYW50aW51Y2xlMmEKKy5hbnRpbnVjbGUyYTJyCisuYW45dDhpOW44dTljOGw4ZTlvOG4uCisuYW50aW51Y2xlbzJuCisuYW45dDhpOXI4ZTh2OW85bDh1OXQ4aThvOG45YThyOHkuCisuYW50NGlyCisuYW50aXJldjIKKy5hbnRpcmV2NW9sdQorLmFudGlyZXZvMWx1dAorLmFudGlyZXZvbDR1MXQyaQorLmFudGlyZXZvbHV0aW8xbjVhCisuYW50aXJldm9sdTF0MmlvCisuYW50aXJldm9sdXRpbzJuCisuYW50aXJldm9sdXRpb24yYTJyCisuYXA4bzh0OGg5ZTlvOXM4ZThzLgorLmFwNG90CisuYXA0b3RoCisuYXBvdGgyZQorLmFwb3RoZW9zNAorLmFwb3RoZW9zMWU0cworLmFwOG84dDhoOWU5bzlzOGk4cy4KKy5hcG90aGVvMXNpcworLmFwOXA4ZThuOWQ4aTh4LgorLmE0cDFwCisuYXAycGUKKy5hcDNwZW4KKy5hcjljOGg4aTltOGU5ZDhlOGE4bi4KKy5hcjFjCisuYXIyY2gKKy5hcmNoaTJtZWQKKy5hcmNoaW1lZGVhMm4KKy5hcjljOGg4aTlwOGU4bDlhOGc4by4KKy5hcmNoMmk0cAorLmFyY2hpcGU0CisuYXJjaGlwZTRsYQorLmFyY2hpcGVsYTJnbworLmFyOWM4aDhpOXA4ZThsOWE5ZzhvOHMuCisuYXI5YzhoOGk4djhlLgorLmFyY2gyaTJ2CisuYXI5YzhoOGk4djhlOHMuCisuYXJjaGl2NGUycworLmFyOWM4aDhpOHY5aThuOGcuCisuYXJjaGl2MWluCisuYXJjaGk0dmluZworLmFyOWM4aDhpOHY5aThzOHQuCisuYXI5YzhoOGk4djlpOHM4dDhzLgorLmFyY2hpdmlzNHQxczIKKy5hcjljOGg4ZTl0OHk4cDlhOGwuCisuYXJjaGUyCisuYXJjaGU0dAorLmFyY2hlMXR5CisuYXJjaGV0eTFwYQorLmFyY2hldHlwNGFsCisuYXI5YzhoOGU5dDh5OHA5aTljOGE4bC4KKy5hcmNoZXR5cDNpCisuYXJjaGV0eXBpMWNhCisuYXI4Yzl0OGE4bjlnOGU4bjh0LgorLmFyMmMxdAorLmFyY3Q1YW5nCisuYXJjMXRhCisuYXJjdGEybgorLmFyY3RhbjFnZW4KKy5hcmN0YW5nZW4xdAorLmFyOGM5dDhhOG45ZzhlOG44dDhzLgorLmFyY3RhbmdlbjR0NHMyCisuYXM5czhpOGc4bjlhOWI4bDhlLgorLmFzMXNpCisuYXM0c2lnMW40YQorLmFzczJpZworLmFzc2lnMm4xYTJiCisuYXNzaWduYWIybDIKKy5hczlzOGk4ZzhuOW84ci4KKy5hc3NpZzFubworLmFzOXM4aThnOG45bzhyOHMuCisuYXNzaWdubzRyczIKKy5hczlzOGk4czh0OWE4bjh0OXM4aDhpOHAuCisuYXMxc2lzCisuYXNzaXMxdGEKKy5hc3Npc3RhMm4KKy5hc3Npc3RhbjF0CisuYXNzaXN0YW40dDRzMgorLmFzc2lzdGFudHMyaDQKKy5hc3Npc3RhbnQzc2gyaTRwCisuYXM5czhpOHM4dDlhOG44dDlzOGg4aThwOHMuCisuYXNzaXN0YW50c2hpMnAxczIKKy5hczh5OG04cDl0OG85bThhOHQ4aThjLgorLmFzNHkKKy5hc3k0bTFwCisuYXN5bTJwMXQKKy5hc3ltcDF0bworLmFzeW1wdG8ybWEKKy5hc3ltcHRvbWF0MWljCisuYXM5eThtOHA5dDhvOHQ5aThjLgorLmFzOHk4bjljOGg4cjhvOW44bzh1OHMuCisuYXN5bjNjNGhyNAorLmFzeW4yY2gKKy5hc3luY2hybzJuCisuYXN5bmNocm8xbm91MgorLmFzeW5jaHJvbm8ydXMKKy5hdDhoOWU4cjlvOXM4YzhsOGU5cjhvOXM4aThzLgorLjRhdGgKKy5hdGgyZQorLmF0aDJlcm8KKy5hdGhlcm9zMmMKKy5hdGhlcm9zY2xlNQorLmF0aGVyb3MxYzRsNAorLmF0aDJlcm9zY2w0ZXJvCisuYXRoZXJvc2NsZXJvMXNpcworLmF0OW04bzhzOXA4aDhlOHI4ZS4KKy5hNHQxbQorLmF0MW1vCisuYXRtb3MyCisuYXRtbzNzcAorLmF0bW9zMnBoZQorLmF0bW8zc3BoNGVyCisuYXQ5bThvOHM5cDhoOGU4cjhlOHMuCisuYXQ5dDhyOGk4Yjl1OHQ4ZThkLgorLmE0dDN0MgorLmF0dHI0aWIKKy5hdHRyaWJ1MnQxZWQKKy5hdDl0OHI4aThiOXU4dDlhOGI4bDhlLgorLmF0dHJpNGJ1MXRhCisuYXR0cmlidTJ0YTRiCisuYXR0cmlidXRhYjJsMgorLmF1OXQ4bzltOGE5dDhpOG84bi4KKy5hdTF0bworLmF1dG8ybWEKKy5hdXRvbWExdDJpbworLmF1dG9tYXRpbzJuCisuYXU5dDhvOG05YTl0OG84bi4KKy5hdXRvbWExdG8KKy5hdXRvbWF0bzJuCisuYXU5dDhvOG05YTl0OGEuCisuYXV0b21hMnRhCisuYXU5dDhvOW44dThtOWI4ZThyOWk4bjhnLgorLmF1NXRvMm4KKy5hdXRvbjV1bQorLmF1dG9udTRtMWIKKy5hdXRvbnVtYmVyMWkKKy5hdXRvbnVtYmVyaW40ZworLmF1OXQ4bzhuOW85bThvOHU4cy4KKy5hdTR0b25vCisuYXV0b25vNG1vCisuYXV0b25vM21vMnVzCisuYXV0b25vbW91MgorLmF1OHQ4bzlyOG84dThuOGQ5aThuOGcuCisuYXV0b3JvdTIKKy5hdXRvcm91bjJkCisuYXV0b3JvdW5kMWluCisuYXY5bzhpOHI5ZDh1OXA4bzhpOHMuCisuYXZvaTQKKy5hdm80aXIKKy5hdm9pcjFkdQorLmF2b2lyNGR1cAorLmF2b2lyZHVwb2kyCisuYmE4bjhkOWw4ZThhOGQ4ZThyLgorLmI0YW5kCisuYmFuMWRsCisuYmFuZGxlMmEKKy5iYW5kbGVhMmQxCisuYmE4bjhkOWw4ZThhOGQ4ZThyOHMuCisuYmFuZGxlYWRlNHI1czIKKy5iYThuOGs5cjh1OHA4dC4KKy5iYTRuazIKKy5iYW5rcnUycDF0CisuYmE4bjhrOXI4dThwOHQ5Yzh5LgorLmJhbmtydXA0dGMKKy5iYW5rcnVwdDFjeQorLmJhOG44azlyOHU4cDh0OWM4aThlOHMuCisuYmFua3J1cHQxY2kKKy5iYW5rcnVwdGMyaWU0CisuYmE4cjlvOG44aThlOHMuCisuYjJhMnIKKy5iYTVyb25pCisuYmFybzJuCisuYmFyb24yaWU0CisuYmE4czhlOWw4aThuOGU5czhrOGk4cC4KKy5iYXNlbDJpCisuYmFzZTFsNGluZQorLmJhc2VsaTFuZXMKKy5iYXNlbGluZXNrMgorLmJhc2VsaW5lc2sxaQorLmJhc2VsaW5lc2syaTRwCisuYmE5dDhoOHk4bTllOXQ4cjh5LgorLjFiYXQKKy5iNGF0aAorLmJhdGh5bWU0CisuYmF0aHltNGV0cgorLmJhdGh5bWUzdHJ5CisuYmE4dDhoOHk5czhjOGE4cDhoOGUuCisuYmF0aHkycworLmJhdGh5czRjCisuYmF0aHlzY2E0cAorLmJhdGh5czFjYQorLmJlOGE4bjlpOGU4cy4KKy5iZWEybgorLmJlYTNuaWVzCisuYmVhbjJpZTQKKy5iZTloOGE4djlpOG84dThyLgorLmJlMWg0CisuYmVoYXYxaQorLmJlaGF2aTFvdTIKKy5iZWhhdjJpbworLmJlaGF2aTRvdXIKKy5iZTloOGE4djlpOG84dThyOHMuCisuYmVoYXZpb3U0cnMyCisuYmU4djhpOGU4cy4KKy5iZTF2aQorLmJldjJpZTQKKy5iaThiOWw4aTlvOGc5cjhhOXA4aDh5OXM4dDh5OGw4ZS4KKy5iaTJiCisuYmkxYjJsMgorLmJpYjNsaQorLmJpYmxpNW9nCisuYmlibDJpbworLmJpYmxpbzJncgorLmJpYmxpbzRnM3JhMXBoeQorLmJpYmxpb2dyYXBoeTJzCisuYmlibGlvZ3JhcGh5czF0CisuYmlibGlvZ3JhcGh5czJ0eQorLmJpYmxpb2dyYXBoeXMydHlsCisuYmk5ZDhpOGY5ZjhlOHI5ZThuOXQ4aThhOGwuCisuYjJpNGQKKy5iaTJkaQorLmJpZDFpZgorLmJpZGk0ZjFmCisuYmlkaWZmZXIxCisuYmlkaWZmZXIzZW4xdAorLmJpZGlmZmVyZW50MmkKKy5iaWRpZmZlcmVuMXQyaTFhCisuYmlkaWZmZXJlbnRpMmFsCisuYmk4ZzlnOGU4czh0LgorLmIyaWcKKy5iaTRnMWcyCisuYmlnMmdlCisuYmk4bDhsOWE4YjhsOGUuCisuMWJpbAorLmJpbGw1YWIKKy5iaWwxbAorLmJpbGxhYjJsMgorLmJpOG85bThhOHQ4aDllOW04YTh0OWk4YzhzLgorLmIyaW8KKy5iaW80bQorLmJpbzFtYQorLmJpb200YXRoMworLmJpb21hdGg1ZW0KKy5iaW9tYXRoMmUKKy5iaW9tYXRoZTFtYQorLmJpb21hdGhlbWF0MWljCisuYmlvbWF0aGVtYXRpNGMzczIKKy5iaThvOW04ZThkOWk5YzhhOGwuCisuYmlvMm1lCisuYmlvMm1lZAorLmJpb200ZWRpCisuYmlvbWVkM2kxY2EKKy5iaThvOW04ZThkOWk5YzhpOG44ZS4KKy5iaW9tZWQyaTFjaQorLmJpb21lZGkyY2luCisuYmlvbWVkaWMyaW5lCisuYmk4bzlyOGg4eTh0OGg4bThzLgorLmJpb3JoNAorLmJpb3JoeXQ0aDFtCisuYmlvcmh5dGg0bTFzMgorLmJpOHQ5bThhOHAuCisuYmkydAorLmJpNHQxbQorLmJpdDFtYQorLmJpdDRtYXAKKy5iaTh0OW04YThwOHMuCisuYml0bWEycDFzMgorLmJsOGE4bjhkOWU4ci4KKy5iMmwyCisuYjNsNGFuZAorLmJsYTJuCisuYmxhbjFkZQorLmJsOGE4bjhkOWU4czh0LgorLmJsYW5kZTRzMgorLmJsOGk4bjhkOWU4ci4KKy5ibDRpbmQKKy5ibGluMWRlCisuYmw4bzhuOGQ4ZThzLgorLmI0bG8KKy5ibG8ybgorLmJsMm9uZAorLmJsb24xZGUKKy5ibG9uZGVzMgorLmJsOHU4ZTlwOHI4aThuOHQuCisuYmx1ZXByMgorLmJsdWVwcmluNHQzCisuYmw4dThlOXA4cjhpOG44dDhzLgorLmJsdWVwcmluNHQ0czIKKy5ibzlsOG84bTllOXQ4ZThyLgorLmJvbG8ybWUKKy5ib2xvNG1ldAorLmJvbG9tZTF0ZQorLmJvOG84azlzOGU4bDhsOWU4ci4KKy4zYm9vMgorLmJvMm80aworLmJvbzRrMXMyCisuYm9va3NlbDFsCisuYm9va3NlbDJsZQorLmJvOG84azlzOGU4bDhsOWU4cjhzLgorLmJvb2tzZWxsZTRyMXMyCisuYm84bzhsOWU4YThuLgorLmJvb2xlMmEKKy5ib29sZWEybgorLmJvOG84bDllOGE4bjhzLgorLmJvb2xlYTJuMXMyCisuYm84cjluOG85bDhvOGc5aTljOGE4bC4KKy5ib3JubzQKKy5ib3JubzNsb2cxaWMKKy5ib3Jub2xvZ2kxY2EKKy5ibzh0OXU5bDhpOHM4bS4KKy5ibzF0dQorLmJvdHVsMmkKKy5ib3R1bGkyczFtCisuYnI4dThzOHE4dThlOHIuCisuYnIydXMKKy5icnVzcXUyCisuYnJ1czNxdWVyCisuYnU4ZjlmOGU4ci4KKy5idWY0ZmVyMQorLmJ1NGYxZgorLmJ1OGY5ZjhlOHI4cy4KKy5idWZmZTRyMXMyCisuYnU4czhpOGU4ci4KKy5idXM1aWU0CisuYjJ1cworLmJ1OHM4aThlOHM4dC4KKy5idXNpMWVzdAorLmJ1OHM4czhpOG44Zy4KKy5idTJzcworLmJ1czFzaQorLmJ1czJzMWluCisuYnVzczNpbmcKKy5idTh0OHQ4ZThkLgorLmJ1dDJ0MWVkCisuYnU4ejh6OXc4bzhyOGQuCisuYnU0ejF6MgorLmJ1enoxd28yCisuYnU4ejh6OXc4bzhyOGQ4cy4KKy5idXp6d29yMmQxczIKKy5jYTljOG84cDhoOW85bjh5LgorLmNhMWNvCisuY2FjMm9waAorLmNhY29waG81bnkKKy5jYWNvcGhvMm4KKy5jYTljOG84cDhoOW85bjhpOGU4cy4KKy5jYWNvNXBob25pCisuY2Fjb3Bob24yaWU0CisuY2E4bDhsOWU4ci4KKy5jYWwxbAorLmNhbDJsZQorLmNhOGw4bDllOHI4cy4KKy5jYWxsZTRyMXMyCisuY2E4bTllOHI4YTltOGU4bi4KKy5jYW01ZXIxYQorLmNhbWVyYTFtZW4KKy5jYThyOHQ5dzhoOGU4ZThsLgorLmNhcnR3NAorLmNhOHI4dDl3OGg4ZThlOGw4cy4KKy5jYXJ0d2hlZTJsMXMyCisuY2E5dDhhOHI4cjhoOHMuCisuY2EydGEKKy5jYXQyYTJyCisuY2F0YXIxcjQKKy5jYXRhcnJoNAorLmNhdGFycjRoMXMyCisuY2E4dDlhOXM4dDhyOG84cDhoOWk4Yy4KKy5jYXRhczF0NHIKKy5jYXRhc3RyMm9waAorLmNhdGFzdHJvcGgxaWMKKy5jYTh0OWE5czh0OHI4bzhwOGg5aTljOGE4bDhsOHkuCisuY2F0YXN0cm9waGkxY2EKKy5jYXRhc3Ryb3BoaWNhbDFsCisuY2F0YXN0cm9waGljYWwxbHkKKy5jYTh0OWU5bjhvOGk4ZC4KKy5jYXQ0ZW5vCisuY2F0ZW5vaTIKKy5jYXRlbm8yaWQKKy5jYTh0OWU5bjhvOGk4ZDhzLgorLmNhdGVub2kyZDFzMgorLmNhOHU5bDhpOWY4bDhvOHc5ZThyLgorLmNhdTRsMgorLmNhdWwyaQorLmNhdWxpNGY0bDIKKy5jYXVsaWZsb3cxZXIKKy5jaDhhOHA5YThyOXI4YThsLgorLmNoYXAyYTJyNAorLmNoYTFwYQorLmNoYXBhcjFyNAorLmNoOGE4cjl0OHI4ZTh1OHM4ZS4KKy5jaDJhMnIKKy5jaGFydHI0ZXUyCisuY2hhcnRyZTJ1czQKKy5jaDhlOG04bzl0OGg4ZThyOWE4cDh5LgorLmNoZTIKKy5jaGUxbW8KKy5jaGVtNG90aDMKKy5jaGVtb3RoMmUKKy5jaGVtb3RoNGVyMWEKKy5jaGVtb3RoZXJhM3AKKy5jaDhlOG04bzl0OGg4ZThyOWE5cDhpOGU4cy4KKy5jaGVtb3RoZXJhcDJpZTQKKy5jaDhsOG84cjhvOW04ZTh0OGg5YThuOGUuCisuYzRoMWw0CisuY2gybG8KKy5jaGxvcm8ybWUKKy5jaGxvcm80bWV0CisuY2hsb3JvbWV0aGEybjQKKy5jaDhsOG84cjhvOW04ZTh0OGg5YThuOGU4cy4KKy5jaGxvcm9tZXRoYTFuZXMKKy5jaDhvOWw4ZThzOXQ4ZThyOGk4Yy4KKy4zY2hvMgorLmMzaG9sNGUKKy5jaG9sZXMyCisuY2hvbGVzMXRlcjFpCisuY2k4ZzlhOXI4ZTh0OHQ4ZS4KKy5jMmlnCisuY2kxZ2EKKy5jaWcyYTJyCisuY2lnYXJlNHQzdDIKKy5jaThnOWE5cjhlOHQ4dDhlOHMuCisuY2lnYXJldDR0ZXMKKy5jaThuOHE4dThlOWY4bzhpOGwuCisuMmNpbgorLmNpbjFxCisuY2lucXUyCisuY2lucXVlMWYKKy5jaW5xdWUxZm8KKy5jaW5xdWVmb2kyCisuY285YThzOHM4bzljOGk4YTl0OGk4djhlLgorLmM0b2EKKy5jb2Eyc3MKKy5jb2FzMXNvCisuY29hc3NvMWNpCisuY29hc3NvM2MyaTFhCisuY29hc3NvY2k0YTF0Mml2CisuY285ZzhuOGE4Yy4KKy4yY29nCisuY29nMW40YQorLmNvOWc4bjhhOGM4cy4KKy5jb2duYTRjM3MyCisuY285azhlOHI5bjhlOGwuCisuYzJvaworLmNvazFlcgorLmNva2VyM25lbAorLmNvOWs4ZThyOW44ZThsOHMuCisuY29rZXJuZTJsMXMyCisuY284bDlsOGk4bjllOGE5dDhpOG84bi4KKy5jb2wxbAorLmNvbGwyaQorLmNvbDJsaW40CisuY29sMWw0aW5lCisuY29sbGluM2VhCisuY29sbGluZWEydAorLmNvbGxpbmVhMXQyaW8KKy5jb2xsaW5lYXRpbzJuCisuY284bDl1OG04bjhzLgorLmNvbHU0bTFuCisuY29sdW0ybjFzMgorLmNvOG05cDhhOHI5YThuOGQuCisuY280bTFwCisuY29tcGFyYTUKKy5jb20xcGEKKy5jb21wMmEycgorLmNvbXBhcmEybgorLmNvbXBhcjRhbmQKKy5jbzhtOXA4YThyOWE4bjhkOHMuCisuY29tcGFyYW4yZDFzMgorLmNvOG05cDhlOG45ZDhpOHU4bS4KKy5jb21wZW5kaTF1CisuY284bTlwOG85bjhlOG44dDl3OGk4czhlLgorLmNvbXBvMm4KKy5jb21wbzNuZW4KKy5jb21wb25lbjF0CisuY29tcG9uZW50dzQKKy5jb21wb25lbnR3aXM0CisuY29tcG9uZW50d2kyCisuY29tcG9uZW50M3c0aXNlCisuY284bThwOXQ4cjhvOGw5bDhlOHIuCisuY29tcDR0cgorLmNvbTJwMXQKKy5jb21wdHJvbDFsCisuY29tcHRyb2wybGUKKy5jbzhtOHA5dDhyOG84bDlsOGU4cjhzLgorLmNvbXB0cm9sbGU0cjFzMgorLmNvOG45ZjhvOHI4bTlhOGI4bDhlLgorLmNvMm4KKy5jb24zZgorLmNvbjFmbworLmNvbmZvMnIKKy5jb25mb3IxbQorLmNvbmZvcjFtYQorLmNvbmZvcjJtYWIKKy5jb25mb3JtYWIybDIKKy5jbzhuOWY4bzhyOG05aThzOHQuCisuY29uZm9yMm1pCisuY29uZm9ybTJpcworLmNvOG45ZjhvOHI4bTlpOHM4dDhzLgorLmNvbmZvcm1pczR0MXMyCisuY284bjlmOG84cjhtOWk4dDh5LgorLmNvbmZvcjNtaXQKKy5jb25mb3JtaTF0eQorLmNvOG45ZzhyOGU4czhzLgorLmNvbjNnCisuY29uMWdyCisuY29uZ3IyZTJzcworLmNvOG45ZzhyOGU4czhzOGU4cy4KKy5jb25ncmVzczFlNHMKKy5jbzhuOXQ4cjhpOGI5dTh0OGUuCisuY29uNXQKKy5jb250cjRpYgorLmNvOG45dDhyOGk4Yjl1OHQ4ZThzLgorLmNvOG45dDhyOGk4Yjl1OHQ4ZThkLgorLmNvbnRyaWJ1MnQxZWQKKy5jbzlyOGU5bDhhOXQ4aThvOG4uCisuY29yZTFsYQorLmNvcmVsYTF0MmlvCisuY29yZWxhdGlvMm4KKy5jbzlyOGU5bDhhOXQ4aThvOG44cy4KKy5jb3JlbGF0aW8ybjNzMgorLmNvOXI4ZTlsOGk5ZzhpOG84bjlpOHM4dC4KKy5jb3JlMWwyaQorLmNvcmVsMmlnCisuY29yZWw0aWdpCisuY29yZWxpNWcyaW8KKy5jb3JlbGlnaW9uM2kKKy5jb3JlbGlnaW8ybgorLmNvcmVsaWdpb24xaXMKKy5jbzlyOGU5bDhpOWc4aThvOG45aThzOHQ4cy4KKy5jb3JlbGlnaW9uaXM0dDFzMgorLmNvOXI4ZTlvOHA5czhpOHMuCisuY29yZTFvCisuY29yZW8ycDFzMgorLmNvcmVvcDFzaXMKKy5jbzlyOGU5czhwOG84bjlkOGU4bjh0LgorLmNvcmUxc3AKKy5jb3JlczRwbzJuCisuY29yZXNwMm9uZAorLmNvcmVzcG9uMWRlCisuY29yZXNwb24xZGVuCisuY29yZXNwb25kZW4xdAorLmNvOXI4ZTlzOHA4bzhuOWQ4ZThuOHQ4cy4KKy5jb3Jlc3BvbmRlbjR0NHMyCisuY285czhlOWM4YThuOHQuCisuY29zNGUKKy5jb3NlMWNhCisuY29zZWNhMm4KKy5jb3NlY2FuMXQKKy5jbzl0OGE4bjlnOGU4bjh0LgorLmNvNHRhMm4KKy5jbzF0YQorLmNvdDJhbmcKKy5jb3RhbjFnZW4KKy5jb3RhbmdlbjF0CisuY284dThyOXM4ZThzLgorLmNvdTIKKy5jb3U0cnMyCisuY291cjJzZQorLmNvdXJzM2U0cworLmNvOXc4bzhyOGs5ZThyLgorLmNvNHdvMgorLmNvd29yazFlcgorLmNvOXc4bzhyOGs5ZThyOHMuCisuY293b3JrZTRyMXMyCisuY3I4YThuOGs5YzhhOHM4ZS4KKy5jcmEybgorLmNyYTRuazIKKy5jcmFuazFjYQorLmNyOGE4bjhrOXM4aDhhOGY4dC4KKy5jcmFuNGsxczIKKy5jcmFua3MyaAorLmNyYW5rc2hhMmYKKy5jcmFua3NoYTJmdAorLmNyOG84YzlvOWQ4aThsOGUuCisuY3Iyb2MKKy5jcm80Y29kCisuY3JvMWNvCisuY3I4bzhjOW85ZDhpOGw4ZThzLgorLmNyb2NvZGlsZXMyCisuY3I4bzhzOHM5aDhhOHQ4YzhoLgorLmNybzJzNHMKKy5jcm9zczJoCisuY3Jvc3NoYTR0YworLmNyb3NzaGF0NGNoCisuY3I4bzhzOHM5aDhhOHQ4YzhoOGU4ZC4KKy5jcm9zc2hhdGNoZTIKKy5jcm9zc2hhdDRjaDRlZAorLmNyOG84czhzOW84djhlOHIuCisuY3JvczFzbworLmNyb3M0c292CisuY3I4eThwOXQ4bzlnOHI4YThtLgorLmNyeTJwMXQKKy5jcnlwMXRvCisuY3J5cHRvMmdyCisuY3I4eThwOXQ4bzlnOHI4YThtOHMuCisuY3J5cHRvZ3JhNG0xczIKKy5jdThmOGY5bDhpOG44ay4KKy5jNHVmCisuY3U0ZjFmCisuY3VmZjRsMgorLmN1ZmZsaW40CisuY3VmZmw0aTRuazIKKy5jdThmOGY5bDhpOG44azhzLgorLmN1ZmZsaW40azFzMgorLmN1OW44ZThpOWY4bzhyOG0uCisuM2N1bgorLmN1Mm5lCisuY3VuZWkyCisuY3VuZWkxZm8KKy5jdW5laWZvMnIKKy5jdW5laWZvcjFtCisuY3U4czl0OG84bTlpOHo5YTliOGw4ZS4KKy4xYzJ1cworLmN1czF0bworLmN1c3RvbTJpegorLmN1c3RvbWl6YTEKKy5jdXN0b21pejVhMmIKKy5jdXN0b21pemFiMmwyCisuY3U4czl0OG84bTlpOHo4ZS4KKy5jdXN0b21pMnplCisuY3U4czl0OG84bTlpOHo4ZThzLgorLmN1OHM5dDhvOG05aTh6OGU4ZC4KKy5kYThjOGg4czloOHU4bjhkLgorLjFkMmEKKy5kYTJjaDQKKy5kYWM0aDFzMgorLmRhY2g0czJoCisuZGE4bTlzOGU4bDlmOGw4eS4KKy5kYTJtMgorLmRhNG0xczIKKy5kYW01c2UybDJmCisuZGFtc2VsZjRsMgorLmRhbXNlbGYybHk1CisuZGE4bTlzOGU4bDlmOGw4aThlOHMuCisuZGFtc2VsZmwyaWU0CisuZGE4Yzh0OHk4bDlvOWc4cjhhOG0uCisuZGEyYzF0CisuZGFjMXR5CisuZGFjMnR5bAorLmRhY3R5M2xvCisuZGFjdHlsbzFncgorLmRhOGM4dDh5OGw5bzlnOHI4YThwOGguCisuZGE4dDhhOWI4YThzOGUuCisuM2RhdAorLmRhMnRhCisuZGEydGFiCisuZGE4dDhhOWI4YThzOGU4cy4KKy5kYXRhYmFzMWU0cworLmRhOHQ4YTlwOGE4dDhoLgorLmRhdDVhcAorLmRhdGFwNWF0CisuZGF0YTFwYQorLmRhdGFwNGF0aAorLmRhOHQ4YTlwOGE4dDhoOHMuCisuZGF0YXBhMnQ0aDFzMgorLmRhOHQ4ZTlzOHQ4YThtOHAuCisuZGF0M2VzdAorLmRhdGVzMXRhCisuZGF0ZXN0YTRtMXAKKy5kYTh0OGU5czh0OGE4bThwOHMuCisuZGF0ZXN0YW0ycDFzMgorLmRlOWM4bDhhOHI5YThiOGw4ZS4KKy5kZTRjbDJhMnIKKy5kZWNsYTJyYWIKKy5kZWNsYXJhYjJsMgorLmRlOWY4aThuOWk5dDhpOHY4ZS4KKy5kZTFmCisuZGUxZmkKKy5kZTJmaW4KKy5kZWYyaW5pCisuZGVmaW4yaXQKKy5kZWZpbmkxdGkKKy5kZWZpbmkxdDJpdgorLmRlOWw4ZThjOXQ4YTliOGw4ZS4KKy5kNWVsZWMKKy5kZWxlMmMxdAorLmRlbGVjMnRhNGIKKy5kZWxlYzF0YQorLmRlbGVjdGFiMmwyCisuZGU4bThpOXM4ZThtOGk5cTh1OGE5djhlOHIuCisuZGU0bTJpcworLmRlbTRpc2UKKy5kZW1pc2VtaTNxdWEKKy5kZW1pc2VtaXF1MgorLmRlbWlzZW1pcXVhNXY0CisuZGU4bThpOXM4ZThtOGk5cTh1OGE5djhlOHI4cy4KKy5kZW1pc2VtaXF1YXZlNHIxczIKKy5kZTltOG84YzlyOGE5dDhpOHM4bS4KKy5kZTRtb2NyCisuZGVtb2NyYXRpMnM0bQorLmRlOG04bzhzLgorLmRlbW9zMgorLmRlOXI4aTh2OWE5dDhpOHY4ZS4KKy5kZXIyaTR2CisuZGU0cmkxdmEKKy5kZXJpM3ZhdAorLmRlcjJpdmExdDJpdgorLmRlOXI4aTh2OWE5dDhpOHY4ZThzLgorLmRlcml2YXRpdjRlMnMKKy5kaThhOWw4ZThjOXQ4aThjLgorLjFkNGkzYQorLmRpMmFsCisuZGkyYWxlCisuZGlhbGUyYzF0CisuZGk4YTlsOGU4Yzl0OGk4YzhzLgorLmRpYWxlY3RpNGMzczIKKy5kaThhOWw4ZThjOXQ4aTljOGk4YThuLgorLmRpYWxlY3QyaTFjaQorLmQyaTFhbGVjdGkzYzJpMWEKKy5kaWFsZWN0aWNpMmEybgorLmRpOGE5bDhlOGM5dDhpOWM4aThhOG44cy4KKy5kaWFsZWN0aWNpYTJuMXMyCisuZGk5YzhoOGw4bzhyOG85bThlOHQ4aDlhOG44ZS4KKy5kNGkyY2gKKy5kaWM0aDFsNAorLmRpY2gybG8KKy5kaWNobG9ybzJtZQorLmRpY2hsb3JvNG1ldAorLmRpY2hsb3JvbWV0aGEybjQKKy5kaThmOWY4cjhhOGM4dC4KKy5kMWlmCisuZGlmNGZyCisuZGk0ZjFmCisuZGlmZnJhMmMxdAorLmRpOGY5ZjhyOGE4Yzh0OHMuCisuZGlmZnJhYzR0MXMyCisuZGk4ZjlmOHI4YThjOXQ4aThvOG4uCisuZGlmZnJhYzF0MmlvCisuZGlmZnJhY3RpbzJuCisuZGk4ZjlmOHI4YThjOXQ4aThvOG44cy4KKy5kaWZmcmFjdGlvMm4zczIKKy5kaThyOGU4ci4KKy5kNGlyMgorLmRpMXJlCisuZGlyMWVyNAorLmRpOHI4ZTluOGU4czhzLgorLmRpcmUxbmVzCisuZGlyZW4yZTJzcworLmRpOHM5cDhhOHI5YThuOGQuCisuZGlzMQorLmRpczFwCisuZGkyczFwYQorLmRpc3AyYTJyCisuZGlzcGFyYTJuCisuZGlzcGFyNGFuZAorLmRpOHM5cDhhOHI5YThuOGQ4cy4KKy5kaXNwYXJhbjJkMXMyCisuZGk4czl0OHI4YTh1OGc4aDh0OWw4eS4KKy5kNGlzM3QKKy5kaXN0NHIKKy5kaXMxdHJhCisuZGlzdHJhdWdoMworLmRpc3RyYXVnaDJ0bAorLmRpc3RyYXVnaHQxbHkKKy5kaThzOXQ4cjhpOGI5dTh0OGUuCisuZGlzdHI0aWIKKy5kaThzOXQ4cjhpOGI5dTh0OGU4cy4KKy5kaThzOXQ4cjhpOGI5dTh0OGU4ZC4KKy5kaXN0cmlidTJ0MWVkCisuZG84dTliOGw4ZTlzOHA4YThjOGUuCisuZG91MgorLmRvdTNiMmwyCisuZG91NWJsZTFzcAorLmRvdWJsZXMyCisuZG91YmxlMnMxcGEKKy5kb3VibGVzcGE0Y2UKKy5kbzh1OWI4bDhlOXM4cDhhOGM5aThuOGcuCisuZG91Ymxlc3A0YTJjaQorLmRvdWJsZXNwYTJjMWluCisuZG91Ymxlc3BhYzFpbmcKKy5kbzhsOGw5aThzOGguCisuZG9sMWwKKy5kb2xsMmkKKy5kb2xsaXMyaAorLmRyOGk4Zjh0OWE4ZzhlLgorLjFkcgorLmRyNGkyZnQKKy5kcmlmMXRhCisuZHI4aTh2OWU4cjhzLgorLmRyMml2CisuZHJpdmU0cjFzMgorLmRyOG84bTllOWQ4YThyOHkuCisuZHJvMm1lCisuZHJvMm1lZAorLmRyb20yZTJkMmEKKy5kcm9tZTRkYXJ5CisuZHJvbWVkMmEycgorLmRyOG84bTllOWQ4YThyOGk4ZThzLgorLmRyb21lZGFyMWkKKy5kcm9tZWRhcjJpZTQKKy5kdTlvOHA5bzlsOGk4czh0LgorLmR1b3BvbDJpCisuZHU5bzhwOW85bDhpOHM4dDhzLgorLmR1b3BvbGlzNHQxczIKKy5kdTlvOHA5bzhsOHkuCisuZHVvcG8ybHkKKy5keThzOWw4ZTh4OGk4YS4KKy5kMnkKKy5keXMxbDIKKy5keXMybGUKKy5keXNsZXgzaQorLmR5c2xleDJpNWEKKy5keThzOWw4ZThjOXQ4aThjLgorLmR5c2xlMmMxdAorLmVhOHM4dDllOG44ZDllOHI4cy4KKy5lYXN0MworLmVhczN0ZW4KKy5lYXMzdGVuZAorLmVhc3RlbjFkZQorLmVhc3RlbmRlNHI1czIKKy5lYzhvOW44bzhtOWk4YzhzLgorLmUxY28KKy5lY28ybgorLmVjbzNub21pYworLmVjb25vbWk0YzNzMgorLmVjOG84bjlvOW04aThzOHQuCisuZWNvbm9tMmlzCisuZWM4bzhuOW85bThpOHM4dDhzLgorLmVjb25vbWlzNHQxczIKKy5laTlnOGU4bjljOGw4YThzOHMuCisuZWkyCisuZTJpZzIKKy5laTFnZW4KKy5laWdlbjFjNGw0CisuZWlnZW5jbGEyc3MKKy5laTlnOGU4bjljOGw4YThzOHM4ZThzLgorLmVpZ2VuY2xhc3MxZTRzCisuZWk5ZzhlOG45djhhOGw5dThlLgorLmVpZ2VuMXYyCisuZWlnZW4xdmEKKy5laWdlbnZhbDF1CisuZWk5ZzhlOG45djhhOGw5dThlOHMuCisuZWw4ZThjOHQ4cjhvOW04ZThjOGg4YThuOWk5YzhhOGwuCisuNWVsZWMKKy5lbGUyYzF0CisuZWxlY3RybzJtZQorLmVsZWN0cm9tZTJjaAorLmVsZWN0cm9tZTVjaGE0bjFpYworLmVsZWN0cm9tZWNoYTJuCisuZWxlY3Ryb21lY2hhbmkxY2EKKy5lbDhlOGM4dDhyOG85bThlOGM4aDhhOG44bzlhOGM4bzh1OHM4dDhpOGMuCisuZWxlY3Ryb21lY2hhbm80CisuZWxlY3Ryb21lY2hhbjRvYQorLmVsZWN0cm9tZWNoYW5vYTFjbworLmVsZWN0cm9tZWNoYW5vYWNvdTIKKy5lbGVjdHJvbWVjaGFub2FjbzJ1cworLmVsZWN0cm9tZWNoYW5vYWNvdXN0MmkKKy5lbGVjdHJvbWVjaGFub2Fjb3VzMXRpYworLmVsOGk4dDlpOHM4dC4KKy5lbDJpCisuZWwxaXQKKy5lbGkxdGkKKy5lbDRpdGlzCisuZWw4aTh0OWk4czh0OHMuCisuZWxpdGlzNHQxczIKKy5lbjl0OHI4ZTlwOHI4ZTluOGU4dThyLgorLmVuMXQKKy5lbnRyZXByMgorLmVudHJlcHJlbjRldQorLmVuOXQ4cjhlOXA4cjhlOW44ZTh1OHI5aThhOGwuCisuZW50cmVwcmVuZXVyMmkzYQorLmVudHJlcHJlbmV1cmkyYWwKKy5lcDlpOW44ZThwOGg5cjhpOG44ZS4KKy5lcGkybgorLmVwMmluZQorLmVwaW5lcDRocjQKKy5lcDJpbmVwaHIyaW40ZQorLmVxOHU4aTl2OGE4cjhpOWE4bjh0LgorLmVxdTJpdjMKKy5lcXVpMXZhCisuZXF1aXYyYTJyCisuZXF1aXZhcjFpCisuZXF1aXZhcjNpMmEybgorLmVxdWl2YXIyaTNhCisuZXF1aXZhcjRpYW40dAorLmVxOHU4aTl2OGE4cjhpOWE4bjhjOGUuCisuZXF1aXZhcjRpYW5jCisuZXQ4aDlhOG44ZS4KKy5ldGhhMm40CisuZXQ4aDl5OGw5ZThuOGUuCisuZXY4ZThyOXM4aTliOGw4ZS4KKy5ldjFlcgorLmV2ZTRyMXMyCisuZXZlcjFzaQorLmV2ZXI0c2k0YgorLmV2ZXJzaTFiMmwyCisuZXY4ZThyOHQuCisuZXY4ZThyOHQ4cy4KKy5ldmVyNHQxczIKKy5ldjhlOHI4dDllOGQuCisuZXZlcjJ0MWVkCisuZXY4ZThyOHQ5aThuOGcuCisuZXZlcjF0aQorLmV2ZXIydDFpbgorLmV4OXE4dThpOHM5aTh0OGUuCisuZXhxdTIKKy5leHEydWkyCisuZXhxdWlzMml0ZQorLmV4OXQ4cjhhOW84cjlkOGk5bjhhOHI4eS4KKy5leDF0MgorLmV4MXRyYQorLmV4dHI0YW8KKy5leHRyYW9yZDJpCisuZXh0cmFvcmQxaW40CisuZXh0cmFvcjFkaTFuYQorLmV4dHJhb3JkaW4yYTJyCisuZmE4bDhsOWk4bjhnLgorLjFmYQorLmZhbDFsCisuZmFsbDJpCisuZmFsMmxpbjQKKy5mZThyOG04aTlvOG44cy4KKy5mZXIxCisuZmVyM200CisuZmVyNG0yaW8KKy5mZXJtaW8ybgorLmZlcm1pbzJuM3MyCisuZmk5bjhpOHQ4ZTlsOHkuCisuMWZpCisuMmZpbgorLmYyaW5pCisuZmluMml0CisuZmluMml0ZQorLmZpbml0ZTFseQorLmZsOGE5ZzhlOGw5bDh1OG0uCisuZjRsMgorLmZsYWc1ZWwxbAorLmZsOGE5ZzhlOGw5bDhhLgorLmZsYWc0ZWxsYQorLmZsOGE4bTltOGE5YjhsOGU4cy4KKy5mbGFtMW0KKy5mbGFtMW1hCisuZmxhbTJtYWIKKy5mbGFtbWFiMmwyCisuZmxhbW1hYmxlczIKKy5mbDhlOGQ4ZzlsOGk4bjhnLgorLmZsZWRnbDIKKy5mbDhvOHc5YzhoOGE4cjh0LgorLmZsb3cyY2gKKy5mbG93Y2gyYTJyCisuZmw4bzh3OWM4aDhhOHI4dDhzLgorLmZsb3djaGFyNHQxczIKKy5mbDh1OG84cjhvOWM4YThyOWI4bzhuLgorLmZsdTNvCisuZmx1bzNyCisuZmx1b3Iyb2MKKy5mbHVvcm8xY2EKKy5mbHVvcm9jMmEycgorLmZsdW9yb2NhcjFiCisuZmx1b3JvY2FyYjRvCisuZmx1b3JvY2FyYm8ybgorLmZvOHI5bThpOWQ4YTliOGw4ZS4KKy5mb3IybWkKKy5mb3JtaTFkNGEKKy5mb3JtMmlkCisuZm9ybWkyZDNhNGIKKy5mb3JtaWRhYjJsMgorLmZvOHI5bThpOWQ4YTliOGw4eS4KKy5mb3JtaWRhYjFseQorLmZvOHI5czh5OHQ4aDlpOGEuCisuZm80cnMyCisuZm9yczR5CisuZm9yc3l0aDJpMWEKKy5mbzhyOHQ4aDlyOGk4ZzhoOHQuCisuZm9ydDRocjQKKy5mb3J0aHIyaWcKKy5mcjhlOGU5bDhvOGE4ZDhlOHIuCisuZnJlZWw0b2EKKy5mcmVlbG9hMmQzCisuZnI4ZThlOWw4bzhhOGQ4ZThyOHMuCisuZnJlZWxvYWRlNHI1czIKKy5mcjhpOGU4bjhkOWw4aThlOHIuCisuZnJpMgorLmZyMmllNAorLmZyaWVuZGwyaWU0CisuZnI4aTl2OG84bDlpOHQ4eS4KKy5mcjJpdgorLmZyaXZvbDJpCisuZnJpdm9sMWl0CisuZnJpdm9saTF0eQorLmZyOGk5djhvOGw5aTl0OGk4ZThzLgorLmZyaXZvbGkxdGkKKy5mcml2b2xpdDJpZTQKKy5mcjhpOHY5bzlsOG84dThzLgorLmZyaXZvbG91MgorLmZyaXZvbG8ydXMKKy5nYTlsOGE4Yzl0OGk4Yy4KKy5nYWxhMmMxdAorLmdhOGw5YTh4OHkuCisuZ2E4bDlhOHg5aThlOHMuCisuZ2FsYXgzaQorLmdhbGF4MmllNAorLmdhOHM5bzhtOWU5dDhlOHIuCisuZ2Exc28KKy5nYTNzb20KKy5nYXNvMm1lCisuZ2FzbzRtZXQKKy5nYXNvbWUxdGUKKy5nZTlvOWQ4ZThzOWk4Yy4KKy5nZW9kZXMyCisuZ2VvZGUxc2kKKy5nZW9kZTJzaWMKKy5nZTlvOWQ4ZTh0OWk4Yy4KKy5nZW9kZTF0CisuZ2VvZGV0MWljCisuZ2U4bzltOGU4dDlyOGk4Yy4KKy5nZTNvbQorLmdlbzJtZQorLmdlbzRtZXQKKy5nZW9tNGV0cgorLmdlbzVtZXQzcmljCisuZ2U4bzltOGU4dDlyOGk4YzhzLgorLmdlb21lNHRyaTRjM3MyCisuZ2U5bzlzOHQ4cjhvOHA4aDhpOGMuCisuZ2VvczQKKy5nZW9zdDRyCisuZ2Vvc3RyMm9waAorLmdlb3N0cm9waDFpYworLmdlOG85dDhoOGU4cjltOGE4bC4KKy5nZTRvdAorLmdlNG90aAorLmdlb3RoMmUKKy5nZW90aGVyM200CisuZ2VvdGhlcjFtYQorLmdlOW84dDlyOG85cDhpOHM4bS4KKy5nZW90cm9waTJzMW0KKy5nbjhvOW04bzhuLgorLmcxbm8KKy5nbm80bW8KKy5nbm80bW8ybgorLmduOG85bThvOG44cy4KKy5nbm9tbzJuM3MyCisuZ3I4YThuOGQ5dThuOGM4bDhlLgorLjFncgorLmdyYTJuMgorLmdyNGFuZAorLmdyYW4xZHUKKy5ncmFuZHU0bgorLmdyYW5kdW4xYzRsNAorLmdyOGE4bjhkOXU4bjhjOGw4ZThzLgorLmdyYW5kdW5jbGVzMgorLmdyOGk4ZTh2OWE4bjhjOGUuCisuZ3IyaWU0CisuZ3JpZTF2YQorLmdyaWV2YTJuCisuZ3I4aThlOHY5YThuOGM4ZThzLgorLmdyOGk4ZTh2OW84dThzLgorLmdyaWV2b3UyCisuZ3JpZXZvMnVzCisuZ3I4aThlOHY5bzh1OHM5bDh5LgorLmdyaWV2b3VzMWwyCisuZ3JpZXZvdXMxbHkKKy5oYThpOHI5czh0OHk4bDhlLgorLmhhaTIKKy5oYTRpcgorLmhhaTRyczIKKy5oYWlyczJ0eQorLmhhaXJzMnR5bAorLmhhOGk4cjlzOHQ4eThsOGU4cy4KKy5oYWlyc3R5bGVzMgorLmhhOGk4cjlzOHQ4eThsOWk4czh0LgorLmhhOGk4cjlzOHQ4eThsOWk4czh0OHMuCisuaGFpcnN0eWxpczR0MXMyCisuaGE4bDhmOXM4cDhhOGM4ZS4KKy5oYTJsZgorLmhhbDJmM3MKKy5oYWxmMnMxcGEKKy5oYWxmc3BhNGNlCisuaGE4bDhmOXM4cDhhOGM4ZThzLgorLmhhOGw4Zjl3OGE4eS4KKy5oYThyOWI4aThuOWc4ZThyLgorLmgyYTJyCisuaGFyMWIKKy5oYXJiaTIKKy5oYXIyYmluCisuaGFyYjRpbmdlCisuaGE4cjliOGk4bjlnOGU4cjhzLgorLmhhcmJpbmdlNHIxczIKKy5oYThyOWw4ZTlxOHU4aThuLgorLmhhcjRsZTQKKy5oYXIxbAorLmhhcmxlMXEKKy5oYXJsZXF1MgorLmhhcmxlcTJ1aTIKKy5oYXJsZXF1aTRuCisuaGE4cjlsOGU5cTh1OGk4bjhzLgorLmhhcmxlcXUyaTJuMXMyCisuaGE4dDhjOGg5ZThyOGk4ZThzLgorLmhhNHRjCisuaGF0NGNoCisuaGF0Y2hlMgorLmhhdGNoZXIxaQorLmhhdGNoZXIyaWU0CisuaGU4bThpOWQ4ZThtOGk5czhlOG04aTlxOHU4YTl2OGU4ci4KKy5oZW0yaWQKKy5oZW1pZDRlbQorLmhlbWlkZTRtMmlzCisuaGVtaWRlbTRpc2UKKy5oZW1pZGVtaXNlbWkzcXVhCisuaGVtaWRlbWlzZW1pcXUyCisuaGVtaWRlbWlzZW1pcXVhNXY0CisuaGU4bThpOWQ4ZThtOGk5czhlOG04aTlxOHU4YTl2OGU4cjhzLgorLmhlbWlkZW1pc2VtaXF1YXZlNHIxczIKKy5oZTltOG85ZzhsOG85YjhpOG4uCisuaGVtbzRnCisuaGUxbW8KKy5oZW1vNGdsMgorLmhlbW8zZ2xvCisuaGVtb2dsbzFiaQorLmhlbW9nbG8yYmluCisuaGU5bThvOXA4aDhpOGw5aThhLgorLmhlbTJvcGgKKy5oZW1vcGg0aWwyCisuaGVtb3BoaWwxaQorLmhlbW9waGlsM2kxYQorLmhlOW04bzlwOGg4aThsOWk4YThjLgorLmhlOW04bzlwOGg4aThsOWk4YThjOHMuCisuaGVtb3BoaWxpYTRjM3MyCisuaGU4bThvOXI4aDhlOW84bDlvOGc4eS4KKy5oZW1vMnIKKy5oZW1vcmg0CisuaGVtb3JoZTNvbAorLmhlbW9yaGVvbDFvMWd5CisuaGU5cDhhOHQ5aThjLgorLmhlcDUKKy5oZTJwYQorLmhlcGF0MWljCisuaGU4cjltOGE4cDhoOXI4bzlkOGk4dDhlLgorLmhlcjNtNAorLmhlcjFtYQorLmhlcjRtYXAKKy5oZXJtYXA0aHI0CisuaGVybWFwaHJvZDJpdGUKKy5oZThyOW04YThwOGg5cjhvOWQ4aTh0OWk4Yy4KKy5oZXJtYXBocm9kMmkxdGkKKy5oZXJtYXBocm9kNGkydGljCisuaGU5cjhvOGU4cy4KKy5oZXJvNGUKKy5oZTh4OGE5ZDhlOGM5aTltOGE4bC4KKy5oZXgxYQorLmhleGEyZAorLmhleGFkZTFjMmkKKy5oZXhhZGUyYzNpbQorLmhleGFkZWNpMW1hCisuaG85bDhvOW44bzltOHkuCisuaG9sbzJuCisuaG9sb24zbzNteQorLmhvOW04ZThvOW04bzhyOXA4aDhpOGMuCisuaG8ybWUzCisuaG9tZW8xbW8KKy5ob21lb21vMnIKKy5ob21lb21vcjFwCisuaG9tZW9tb3JwNGg0CisuaG9tZW9tb3JwaDFpYworLmhvOW04ZThvOW04bzhyOXA4aDhpOHM4bS4KKy5ob21lb21vcnBoaTJzMW0KKy5obzltOG85dDhoOGU4dDhpOGMuCisuaG8xbW8KKy5ob200b3RoMworLmhvbW90aDJlCisuaG9tbzN0aGU0dAorLmhvbW90aGV0MWljCisuaG84cjhzOGU5cjhhOGQ5aThzOGguCisuaG9yNHNlCisuaG80cnMyCisuaG9yc2VyMWEKKy5ob3JzZXJhMmQKKy5ob3JzZXIyYWRpCisuaG9yc2VyYWRpczEKKy5ob3JzZXJhZGlzMmgKKy5obzh0OWI4ZThkLgorLmhvMnQxYgorLmhvdDRiZTJkCisuaG84dDliOGU4ZDhzLgorLmhvdGJlMmQxczIKKy5oeTlkOHI4bzl0OGg4ZThyOW04YThsLgorLmh5MWQKKy5oeTFkcgorLmh5ZHJvNHRoMmUKKy5oeWRyNG90aAorLmh5ZHJvdGhlcjNtNAorLmh5ZHJvdGhlcjFtYQorLmh5OXA4bzl0OGg4YThsOWE5bTh1OHMuCisuaHkzcG8KKy5oeXA0b3QKKy5oeXA0b3RoCisuaHlwb3RoYTNsYQorLmh5cG90aGFsYTNtCisuaHlwb3RoYWxhMW11CisuaHlwb3RoYWxhbTJ1cworLmlkOGU4YThsOHMuCisuaWRlM2E0bAorLmlkZWEybDFzMgorLmlkOGU4bzlnOHI4YThwOGg4cy4KKy5pZGVvMmcKKy5pZGVvMWdyCisuaWRlb2dyYTRwNGgxczIKKy5pZDhpOG85czh5OG45YzhyOGE4czh5LgorLmkyZGkKKy5pMWQzaW8KKy5pZGk0b3MKKy5pZGlvczR5CisuaWRpb3N5bjFjcgorLmlkaW9zeW5jcjJhcworLmlkaW9zeW5jcmFzNHkKKy5pZDhpOG85czh5OG45YzhyOGE5czhpOGU4cy4KKy5pZGlvc3luY3JhczJpZTQKKy5pZDhpOG85czh5OG45YzhyOGE4dDhpOGMuCisuaWRpb3N5bjVjcmF0MWljCisuaWQ4aThvOXM4eThuOWM4cjhhOHQ5aTljOGE4bDlsOHkuCisuaWRpb3N5bmNyYXRpMWNhCisuaWRpb3N5bmNyYXRpY2FsMWwKKy5pZGlvc3luY3JhdGljYWwxbHkKKy5pZzluOGk4dDllOHIuCisuMmlnCisuaWcxbmkKKy5pZ24yaXQKKy5pZ24yaXRlCisuaWc5bjhpOHQ5ZThyOHMuCisuaWduaXRlNHIxczIKKy5pZzluOGk5dDhvOHIuCisuaWduM2l0b3IKKy5pZ25pMXRvCisuaWc4bjhvOHI4ZTlzOHA4YThjOGU4cy4KKy5pZzFubworLmlnbm9yZTFzcAorLmlnbm9yZTJzMXBhCisuaWdub3Jlc3BhNGNlCisuaW05cDhlOGQ5YThuOGM4ZS4KKy5pbTJwMmVkCisuaW1wMmUyZDJhCisuaW1wZWRhMm4KKy5pbTlwOGU4ZDlhOG44YzhlOHMuCisuaW45ZDh1OWI4aTl0OGE5YjhsOGUuCisuNGluZAorLmluMWR1CisuaW5kdTFiNGkKKy5pbmR1YmkydAorLmluZHViaTF0YQorLmluZHViaTJ0YWIKKy5pbmR1Yml0YWIybDIKKy5pbjlmOGk4bjlpOHQ4ZTlsOHkuCisuaW4zZgorLmluMWZpCisuaW4yZmluCisuaW5mMmluaQorLmluZmluMml0CisuaW5maW4yaXRlCisuaW5maW5pdGUxbHkKKy5pbjlmOGk4bjlpOXQ4ZThzOWk5bThhOGwuCisuaW5maW5pdDRlcworLmluZmluaXRlMXNpCisuaW5maW5pdGUyczVpbQorLmluZmluaXRlc2kxbWEKKy5pbjlmOHI4YTlzOHQ4cjh1OGM5dDh1OHI4ZS4KKy5pbmZyMmFzCisuaW5mcmFzMXQ0cgorLmluZnJhc3RydTJjMXQKKy5pbmZyYXN0cnVjdHU0cgorLmluZnJhc3RydWMxdHUKKy5pbmZyYXN0cnVjM3R1cmUKKy5pbjlmOHI4YTlzOHQ4cjh1OGM5dDh1OHI4ZThzLgorLmluOXM4dDhhOGw4bDllOHIuCisuaW5zMnRhMmwKKy5pbnMxdGEKKy5pbnN0YWwxbAorLmluc3RhbDJsZQorLmluOXM4dDhhOGw4bDllOHI4cy4KKy5pbnN0YWxsZTRyMXMyCisuaW45dDhlOHI5ZDhpOHM5YzhpOXA4bDhpOW44YThyOHkuCisuaW4xdAorLmluNXRlcjNkCisuaW50ZXJkMmkKKy5pbnRlcmRpczEKKy5pbnRlcmQyaXMxYworLmludGVyZGlzMWNpCisuaW50ZXJkaXNjMmlwCisuaW50ZXJkaXNjaTFwMmwyCisuaW50ZXJkaXNjaXBsaTRuCisuaW50ZXJkaXNjaXBsNGkxbmEKKy5pbnRlcmRpc2NpcGxpbjJhMnIKKy5pbjl0OGU4cjlnOGE5bDhhOGM5dDhpOGMuCisuaW50ZXJnMgorLmludGVyMWdhCisuaW50ZXJnYWxhMmMxdAorLmluOXU4dDhpOGw4ZS4KKy5pbjF1CisuaW40dTF0MmkKKy5pbjl1OHQ4aThsOWk5dDh5LgorLmludXRpbDFpCisuaW51dDJpbDFpdAorLmludXRpbGkxdHkKKy5pcjlyOGU5ZDh1OGM5aThiOGw4ZS4KKy5pcjJyMmVkCisuaXJyZTFkdQorLmlycmVkdTJjCisuaXJyZWR1Y2k0YgorLmlycmVkdTFjaQorLmlycmVkdWNpMWIybDIKKy5pcjlyOGU5ZDh1OGM5aThiOGw4eS4KKy5pcnJlZHVjaWIxbHkKKy5pcjlyOGU4djlvOWM4YTliOGw4ZS4KKy5pcnJldjIKKy5pcnJlNXZvYworLmlycmV2bzFjYQorLmlycmV2b2NhMWIybDIKKy5pczhvOHQ5cjhvOHA4eS4KKy5pMnNvCisuaXNvdHJvcHk1CisuaXM4bzl0OHI4bzhwOWk4Yy4KKy5pc290cm9wM2ljCisuaXQ4aThuOWU4cjlhOHI4eS4KKy5pMXRpCisuaTJ0MWluCisuaXQyaW5lCisuaXRpbjRlcjRhMnIKKy5pdGluMWVyCisuaXRpbmVyMWEKKy5pdDhpOG45ZThyOWE4cjlpOGU4cy4KKy5pdGluZXJhcjFpCisuaXRpbmVyYXIyaWU0CisuamU5cjhlOW04aTlhOGQ4cy4KKy4xamUKKy5qZXJlbTJpM2EKKy5qZXJlbWlhMmQKKy5qZXJlbWlhMmQxczIKKy5rZTh5OW44bzh0OGUuCisua2U4eTluOG84dDhlOHMuCisua2V5bm80dGVzCisua2U4eTlzOHQ4cjhvOGs4ZS4KKy5rZXlzNAorLmtleXMxdAorLmtleXN0NHIKKy5rZXlzdHIyb2syCisua2U4eTlzOHQ4cjhvOGs4ZThzLgorLmtleXN0cm9rZXM0Cisua2k4bDhuOWk4bjhnLgorLmsxaQorLms0aTJsMW4yCisua2lsbjFpbgorLmtpbG5pbjRnCisubGE4YzlpOWU4czh0LgorLmw0YTJjaTQKKy5sYTNjMmllNAorLmxhY2kxZXN0CisubGE4bTllOG45dDhhOWI4bDhlLgorLmxhMW1lbgorLmxhM21lbjF0CisubGFtZW4ydGE0YgorLmxhbWVuMXRhCisubGFtZW50YWIybDIKKy5sYThuOGQ5czhjOGE4cDllOHIuCisuM2w0YW5kCisubGEybgorLmxhbjJkMXMyCisubGFuZHNjYTRwCisubGFuZHMxY2EKKy5sYW5kc2NhNXBlcgorLmxhOG44ZDlzOGM4YThwOWU4cjhzLgorLmxhbmRzY2FwZTRyMXMyCisubGE4cjljOGU5bjh5LgorLmwyYTJyCisubGFyMWMKKy5sYXIyY2UKKy5sYXIxY2VuNAorLmxhOHI5YzhlOW45aThzOHQuCisubGFyNGNlbmkKKy5sZThhOGY5aDhvOHA5cDhlOHIuCisubGUyYQorLmxlYTJmCisubGVhNGZoCisubGVhZmhvNHAxcAorLmxlYWZob3AycGUKKy5sZWFmaG9wM3BlcgorLmxlOGE4ZjloOG84cDlwOGU4cjhzLgorLmxlYWZob3BwZTRyMXMyCisubGU4dDl0OGU4cjlzOHA4YThjOWk4bjhnLgorLmxlNHQzdDIKKy5sZXR0ZTRyMXMyCisubGV0dGVyMXNwCisubGV0dGVyMnMxcGEKKy5sZXR0ZXJzcDRhMmNpCisubGV0dGVyc3BhMmMxaW4KKy5sZXR0ZXJzcGFjMWluZworLmxpOGY4ZTlzOHA4YThuLgorLmxpZmUxc3AKKy5saWZlMnMxcGEKKy5saWZlc3BhNG4KKy5saThmOGU5czhwOGE4bjhzLgorLmxpZmVzcGEybjFzMgorLmxpOGY4ZTlzOHQ4eThsOGUuCisubGlmZXMydHkKKy5saWZlczJ0eWwKKy5saThmOGU5czh0OHk4bDhlOHMuCisubGlmZXN0eWxlczIKKy5saThnOGg4dDl3OGU4aThnOGg4dC4KKy4zbGlnaAorLmxpZ2h0dzQKKy5saWdodHdlaTIKKy5sMmlnaHR3ZTJpZzIKKy5saThtOW84dTlzOGk4bjhlOHMuCisubGk0bW8KKy5saTNtbzJ1cworLmxpbW91MgorLmxpbW91MnMxaW4KKy5saW1vdXMyaW5lCisubGltb3VzaTFuZXMKKy5saThuOGU5YjhhOGM4azhlOHIuCisuMWw0aW5lCisubGluMmUyYgorLmxpbmViYWNrMQorLmxpbmViYWNrMWVyCisubGk4bjhlOXM4cDhhOGM4aThuOGcuCisubGkxbmVzCisubGk0bmUxc3AKKy5saW5lMnMxcGEKKy5saW5lc3A0YTJjaQorLmxpbmVzcGEyYzFpbgorLmxpbmVzcGFjMWluZworLmxpOW84bjllOHM4cy4KKy5saW8ybgorLmxpbzFuZXMKKy5saW9uMmUyc3MKKy5saTh0OGg5bzlnOHI4YThwOGg4ZThkLgorLmwyaXRoCisubGl0aG80ZworLmxpdGhvMWdyCisubGl0aG9ncmFwaDRlZAorLmxpOHQ4aDlvOWc4cjhhOHA4aDhzLgorLmxpdGhvZ3JhNHA0aDFzMgorLmxvOWI4bzh0OW84bTh5LgorLmxvYm80dG8KKy5sb2JvdG8zbXkKKy5sbzliOG84dDlvOG05aTh6OGUuCisubG9ib3RvbTJpegorLmxvYm90b21pMnplCisubG84ZzhlOHMuCisubG8xZ2UKKy5sbzhuOGc5ZThzOHQuCisuNWxvbmcKKy5sbzJuCisubG85cTh1OGE4YzlpOHQ4eS4KKy5sbzFxCisubG9xdTIKKy5sb3F1YWM0CisubG9xdTRhMmNpCisubG9xdWEyYzFpdAorLmxvcXVhY2kxdHkKKy5sbzh2OGU5czh0OHI4dThjOGsuCisuNGxvdgorLmxvdjRlMnMKKy5sb3YyZXN0NHIKKy5sb3Zlc3RydWM1CisubG92ZXN0cnVjazEKKy5tYThjOHI4bzllOGM4bzluOG84bThpOGM4cy4KKy5tYWNybzRlCisubWFjcm9lMWNvCisubWFjcm9lY28ybgorLm1hY3JvZWNvM25vbWljCisubWFjcm9lY29ub21pNGMzczIKKy5tYThsOWE5cDhyOG84cDlpOHM4bS4KKy5tYWxhcHIyCisubWFsYXByb3BpMnMxbQorLm1hOGw5YTlwOHI4bzhwOWk4czhtOHMuCisubWFsYXByb3A0aXM0bTFzMgorLm1hOG45czhsOGE4dThnOGg5dDhlOHIuCisubWEybjFzMgorLm1hbjJzMWwyCisubWFuc2xhdWdoMworLm1hOG45dTlzOGM4cjhpOHA4dC4KKy5tYW4ydXMKKy5tYW51c2MyCisubWFudXNjcmkyCisubWFudXNjcjJpcAorLm1hbnVzY3JpMnAxdAorLm1hOHI5ZzhpOG45YThsLgorLm1hcmcyCisubWFyZ2k0bgorLm1hcmdpMW5hCisubWE4dDhoOWU5bThhOXQ4aTljOGk4YThuLgorLm00YXRoMworLm1hdGg1ZW0KKy5tYXRoMmUKKy4xbWF0aGUxbWEKKy5tYXRoZW1hdDFpYworLm1hdGhlbWF0MmkxY2kKKy5tYXRoZW1hdGkzYzJpMWEKKy5tYXRoZW1hdGljaTJhMm4KKy5tYTh0OGg5ZTltOGE5dDhpOWM4aThhOG44cy4KKy5tYXRoZW1hdGljaWEybjFzMgorLm1hOHQ4dDhlOHMuCisubWF0NXRlCisubWE0dDN0MgorLm1hdDR0ZXMKKy5tZThkOWk4YzlhOGk4ZC4KKy4ybWVkCisubTRlZGkKKy5tZWQzaTFjYQorLm1lZGljYWkyCisubWVkaWNhMmlkCisubWU4ZDhpOW84YzhyOGUuCisubWUxZDJpbworLm1lZGlvY3JlMworLm1lOGQ4aTlvOGM5cjhpOXQ4aThlOHMuCisubWVkaTVvY3JpdAorLm1lZGlvY3JpMgorLm1lZGlvNWNyaTF0aQorLm1lZGlvY3JpdDJpZTQKKy5tZThnOGE5bDhpOHQ4aC4KKy5tZTJnCisubTRlZ2FsCisubWUxZ2EKKy5tZTNnYWwxaQorLm1lZ2FsMWl0CisubWVnYWwyaXRoCisubWU4ZzhhOWw4aTh0OGg4cy4KKy5tZWdhbGkydDRoMXMyCisubWU4dDhhOWI4bzhsOWk4Yy4KKy5tZTR0YQorLm1lMnRhNGIKKy5tZXRhYm9sM2ljCisubWV0YWJvbDJpCisubWU5dDhhOGI5bzlsOGk4czhtLgorLm1ldGFib2xpMnMxbQorLm1lOXQ4YThiOW85bDhpOHM4bThzLgorLm1ldGFib2w0aXM0bTFzMgorLm1lOXQ4YThiOW85bDhpOHQ4ZS4KKy5tZXRhYm81bDJpdGUKKy5tZXRhYm9sMWl0CisubWU5dDhhOGI5bzlsOGk4dDhlOHMuCisubWV0YWJvbGl0NGVzCisubWU4dDhhOWw4YThuOWc4dThhOGc4ZS4KKy5tZXQzYTJsCisubWV0YTVsYQorLm1ldGFsYTJuCisubWV0YWwyYW5nCisubWV0YWxhbjFndQorLm1ldGFsYW5ndTRhCisubWU4dDhhOWw4YThuOWc4dThhOGc4ZThzLgorLm1lOHQ4YTlwOGg4bzhyOWk4Yy4KKy5tZXRhcGhvNHIKKy5tZTh0OGg5YThuOGUuCisubWV0aGEybjQKKy5tZTl0OHI4bzhwOW85bDhpOHMuCisubTRldHIKKy5tZXRyb3BvbDJpCisubWU5dDhyOG84cDlvOWw4aThzOGU4cy4KKy5tZXRyb3BvbDRpc2UKKy5tZXRyb3BvbGlzMWU0cworLm1lOHQ5cjhvOXA4bzhsOWk5dDhhOG4uCisubWV0cm9wb2wxaXQKKy5tZXRyb3BvbGkzdGEybgorLm1ldHJvcG9saTF0YQorLm1lOHQ5cjhvOXA4bzhsOWk5dDhhOG44cy4KKy5tZXRyb3BvbGl0YTJuMXMyCisubWk4YzhyOG85ZThjOG85bjhvOG04aThjOHMuCisubTRpMWNyCisubWljcm80ZQorLm1pY3JvZTFjbworLm1pY3JvZWNvMm4KKy5taWNyb2VjbzNub21pYworLm1pY3JvZWNvbm9taTRjM3MyCisubWk5YzhyOG85ZjhpOGM4aDhlLgorLm1pY3JvMmZpCisubWljcm9mNGkyY2gKKy5taWNyb2ZpY2hlMgorLm1pOWM4cjhvOWY4aThjOGg4ZThzLgorLm1pY3JvZmljaDFlcworLm1pOGM4cjhvOW84cjhnOGE4bjlpOHM4bS4KKy5taWNyb28yCisubWljcm9vcmcyCisubWljcm9vcjFnYQorLm1pY3Jvb3JnYW41aXMKKy5taWNyb29yZ2EybgorLm1pY3Jvb3JnYW5pMnMxbQorLm1pOGM4cjhvOW84cjhnOGE4bjlpOHM4bThzLgorLm1pY3Jvb3JnYW40aXM0bTFzMgorLm1pOGw4bDlhOGc4ZS4KKy5tNGlsMWwKKy5taThsOWw4aTlsOGk4dDhlOHIuCisubWlsbDJpCisubWlsNGw0aTRsCisubWlsbGlsMWkKKy5taWxsMmlsMWl0CisubWlsbGlsMml0ZQorLm1pOG04ZThvOWc4cjhhOHA4aDhlOGQuCisubWltZW8yZworLm1pbWVvMWdyCisubWltZW9ncmFwaDRlZAorLm1pOG04ZThvOWc4cjhhOHA4aDhzLgorLm1pbWVvZ3JhNHA0aDFzMgorLm1pOG05aThjOXI4aThlOHMuCisubWltMWkKKy5taW00aTFjcgorLm1pbWljcmkyCisubWltaWNyMmllNAorLm1pOG45aThzLgorLm0yaW5pCisubWluMWlzCisubWk4bjhpOXM4eThtOXA4bzlzOGk4dThtLgorLm1pbmlzNHkKKy5taW5pc3k0bTFwCisubWluaXN5bTFwb3MKKy5taW5pc3ltcG81c2k0dQorLm1pOG44aTlzOHk4bTlwOG85czhpOGEuCisubWluaXN5bXBvczJpMWEKKy5taTluOHU4dDllOHIuCisubTRpbjF1CisubWk5bjh1OHQ5ZThzOHQuCisubWk4czljOGg4aThlOXY4bzh1OHM5bDh5LgorLm0yaXMxYworLm1pczNjaDIKKy5taXNjaDJpZTQKKy5taXNjaGlldm91MgorLm1pc2NoaWV2bzJ1cworLm1pc2NoaWV2b3VzMWwyCisubWlzY2hpZXZvdXMxbHkKKy5taTlzOGU4cjhzLgorLm00aXNlCisubWlzM2VyCisubWlzZTRyMXMyCisubWk5czhvOGc5YTltOHkuCisubWkyc28KKy5taXNvMWdhCisubWlzbzJnYW0KKy5tbzhkOWU4bDlsOGk4bjhnLgorLm1vMmQxCisubW9kZWwxbAorLm1vZGVsbDJpCisubW9kZWwybGluNAorLm1vOGw5ZTljOHU4bDhlLgorLm1vbGUxY3UKKy5tb2xlNGN1bAorLm1vbGVjdWw0ZQorLm1vOGw5ZTljOHU4bDhlOHMuCisubW9sZWN1bGVzMgorLm1vOG45YThyOGM4aDhzLgorLm1vMW4xYQorLm1vbmFyM2MKKy5tb24yYTJyCisubW9uYXIyY2gKKy5tb25hcmM0aDFzMgorLm1vOG44ZTh5OWw4ZThuOWQ4ZThyLgorLm1vbmV5bGVuMWRlCisubW84bjhlOHk5bDhlOG45ZDhlOHI4cy4KKy5tb25leWxlbmRlNHI1czIKKy5tbzhuOG85YzhoOHI4bzhtOGUuCisubW9ubzJjaDQKKy5tb25vYzRocjQKKy5tb25vY2hybzJtZQorLm1vOG44bzllOG45ZThyOWc4ZTh0OGk4Yy4KKy5tbzNub2UKKy5tb25vZW4xZXIKKy5tb25vZW5lcmcyCisubW9ub2VuZXIzZ2V0CisubW9ub2VuZXJnZXQxaWMKKy5tbzhuOW84aThkLgorLm1vbm9pMgorLm1vbm8yaWQKKy5tbzhuOG85cDhvOGw4ZS4KKy5tbzRub3AKKy5tbzhuOG85cDhvOGw4ZThzLgorLm1vbm9wb2xlczIKKy5tbzluOG84cDlvOGw4eS4KKy5tb25vcG8ybHkKKy5tbzhuOG85czhwOGw4aThuOGUuCisubW9ub3MxcDJsMgorLm1vbm9zcGxpNG4KKy5tb25vc3AxbDRpbmUKKy5tbzhuOG85czhwOGw4aThuOGU4cy4KKy5tb25vc3BsaTFuZXMKKy5tbzhuOG85czh0OHI4bzhmOGk4Yy4KKy5tb25vczV0CisubW9ub3N0NHIKKy5tb25vc3RybzJmaQorLm1vOW44bzh0OW85bjhpOGU4cy4KKy5tb25vMXRvCisubW8ybm90bzJuCisubW9ub3RvbjJpZTQKKy5tbzluOG84dDlvOW44bzh1OHMuCisubW9ubzR0b25vCisubW9ub3RvMW5vdTIKKy5tb25vdG9ubzJ1cworLm1vOXI4bzhuOWk4czhtLgorLm1vcm81bjRpcworLm1vcm8ybgorLm1vcm9uaTJzMW0KKy5tbzhzOXE4dThpOXQ4by4KKy5tb3MyCisubW9zcXUyCisubW9zcTJ1aTIKKy5tb3NxdWkxdG8KKy5tbzhzOXE4dThpOXQ4bzhzLgorLm1vc3F1aXRvczIKKy5tbzhzOXE4dThpOXQ4bzhlOHMuCisubXU4ZDlyOG84bzhtLgorLm11MWRyCisubXVkMXJvb20KKy5tdWRyb28yCisubXU4ZDlyOG84bzhtOHMuCisubXVkcm9vNG0xczIKKy5tdThsOXQ4aTlmOGE4YzllOHQ4ZThkLgorLjVtdTRsdAorLm11bDF0aTMKKy5tdWx0aWYyCisubXVsdGkxZmEKKy5tdWx0aWZhNGNlCisubXVsdGlmYWNldDQKKy5tdWx0aWZhY2UydDFlZAorLm11OGw5dDhpOXA4bDhpOGM5YThiOGw4ZS4KKy5tdWx0MmlwCisubXVsdGkxcDJsMgorLm11bHRpcGxpMWNhCisubXVsdGlwbGljYTFiMmwyCisubXU4bDh0OGk5dThzOGU4ci4KKy5tdWx0aTR1CisubXVsdGkydXMKKy5uZThvOWY4aThlOGw4ZDhzLgorLjNuZW8KKy5uZTVvZgorLm5lbzJmaQorLm5lb2YyaWU0CisubmVvZmllMmxkMworLm5lb2ZpZWwyZDFzMgorLm5lOG85bjhhOHo4aS4KKy5uZW8ybgorLm5lbzFuMWEKKy5uZW9uYTJ6MWkKKy5uZThvOW44YTh6OGk4cy4KKy5uZW9uYXo0aXMKKy5uZThwOGg5ZTh3OHMuCisubmVwaGU0CisubmU4cDhoOXI4aTh0OGUuCisubmVwNGhyNAorLm5lcGhyMml0ZQorLm5lOHA4aDlyOGk4dDhpOGMuCisubmVwaHI0aTJ0M2ljCisubmVwaHJpMXRpCisubmU4dzllOHM4dC4KKy5uZTR3CisubmV3ZXN0MworLm5lOHc4czlsOGU4dDl0OGU4ci4KKy5uZXdzNGwyCisubmV3czJsZQorLm5ld3NsZTR0M3QyCisubmU4dzhzOWw4ZTh0OXQ4ZThyOHMuCisubmV3c2xldHRlNHIxczIKKy5uaTh0OHI4bzltOGU4dDhoOWE4bjhlLgorLm4yaXQKKy5uaTN0cgorLm5pdHJvMm1lCisubml0cm80bWV0Cisubml0cm9tZXRoYTJuNAorLm5vOW44YThtOGUuCisubm80bgorLm5vMW4xYQorLm5vOG45YThyOWk4dDhoOW04ZTh0OWk4Yy4KKy5ub25hcjNpCisubm9uMmEycgorLm5vbmFyMml0aAorLm5vbmFyaXQ0aDFtCisubm9uYXJpdGhtZXQ0Cisubm9uYXJpdGhtZXQxaWMKKy5ubzhuOWU4bThlOHI5ZzhlOG44Yzh5LgorLm5vbmUxbWUKKy5ub25lbWVyZzIKKy5ub25lbWVyMWdlbgorLm5vbmVtZXJnZW4xY3kKKy5ubzhuOWU4cTh1OGk5djhhOHI4aTlhOG44YzhlLgorLm5vbmUycQorLm5vbmVxdTIKKy5ub25lcTJ1aTIKKy5ub25lcXUyaXYzCisubm9uZXF1aTF2YQorLm5vbmVxdWl2MmEycgorLm5vbmVxdWl2YXIxaQorLm5vbmVxdWl2YXIzaTJhMm4KKy5ub25lcXVpdmFyMmkzYQorLm5vbmVxdWl2YXI0aWFuYworLm5vOG44ZTl0OGg4ZTlsOGU4czhzLgorLm5vbmV0aDJlCisubm9uZXRoZTFsZXMyCisubm9uZXRoZTNsMmUyc3MKKy5ubzhuOWU4dThjOGw4aThkOWU4YThuLgorLm5vbjRldQorLm5vbmV1MWM0bDQKKy5ub25ldWNsMmlkCisubm9uZXVjbGlkZWEybgorLm5vOG45aThzOG85bThvOHI5cDhoOGk4Yy4KKy5ub241aQorLm5vbjFpcworLm5vbmkyc28KKy5ub25pM3NvbQorLm5vbmlzbzFtbworLm5vbmlzb21vMnIKKy5ub25pc29tb3IxcAorLm5vbmlzb21vcnA0aDQKKy5ub25pc29tb3JwaDFpYworLm5vOG45cDhzOGU4dThkOG85YzhvOG05cDhhOGM4dC4KKy5ub24xcDQKKy5ub24ycDFzMgorLm5vbnAyc2UKKy5ub25wczRldQorLm5vbnBzZXUxZG8KKy5ub25wc2V1ZG8xY28KKy5ub25wc2V1ZG9jbzRtMXAKKy5ub25wc2V1ZG9jb20xcGEKKy5ub25wc2V1ZG9jb21wYTJjNHQKKy5ubzhuOXM4bThvOG84dDhoLgorLm5vMm4zczIKKy5ub24yczNtCisubm9uczFtbworLm5vbnNtb28yCisubm9uc21vNG90aAorLm5vOG45dThuOGk5ZjhvOHI4bS4KKy5ubzNudTRuCisubm9udTFuaQorLm5vbnVuaTFmbworLm5vbnVuaWZvMnIKKy5ub251bmlmb3IxbQorLm5vOG45dThuOGk5ZjhvOHI4bTlsOHkuCisubm9udW5pZm9yNG0xbAorLm5vbnVuaWZvcm0xbHkKKy5ubzhyOWU4cDlpOW44ZThwOGg5cjhpOG44ZS4KKy5ub3JlNXBpMm4KKy5ub3JlcDJpbmUKKy5ub3JlcGluZXA0aHI0Cisubm9yZXAyaW5lcGhyMmluNGUKKy5ubzh0OXc4aTh0OGg5czh0OGE4bjhkOWk4bjhnLgorLm5vdHc0Cisubm90d2kyCisubm90dzJpdGgzCisubm90d2kydDRoMXMyCisubm90d2l0aDVzdDRhbmQKKy5ub3R3aXRoczF0YQorLm5vdHdpdGhzdGEybgorLm5vdHdpdGhzdGFuZDFpbgorLm51OWM4bDhlOG85dDhpOGQ4ZS4KKy5udWNsZTMKKy5udTFjNGw0CisubnVjbGU0b3QKKy5udWNsZW90MmlkCisubnU5YzhsOGU4bzl0OGk4ZDhlOHMuCisubnVjbGVvdGlkZTRzMgorLm51OHQ5YzhyOGE4YzhrOWU4ci4KKy5udTR0YworLm51dGNyYWNrMQorLm51dGNyYWNrMWVyCisubnU4dDljOHI4YThjOGs5ZThyOHMuCisubnV0Y3JhY2tlNHIxczIKKy5vZThyOXM4dDhlOGQ4cy4KKy5vM2VyCisub2U0cjFzMgorLm9lcnM0dDFlZAorLm9lcnN0ZTJkMXMyCisub2Y4ZjlsOGk4bjhlLgorLm80ZjFmCisub2ZmNGwyCisub2ZmbGluNAorLm9mZjFsNGluZQorLm9mOGY5bDhvOGE4ZC4KKy5vZmZsNG9hCisub2ZmbG9hMmQzCisub2Y4ZjlsOG84YThkOHMuCisub2ZmbG9hMmQxczIKKy5vZjhmOWw4bzhhOGQ4ZThkLgorLm9mZmxvYTJkMWVkCisub2w4aTlnOG84cDlvOWw4aThzOHQuCisub2wyaQorLm9sMmlnCisub2xpMmdvCisub2wyaWdvcG9sMmkKKy5vbDhpOWc4bzhwOW85bDhpOHM4dDhzLgorLm9saWdvcG9saXM0dDFzMgorLm9sOGk5ZzhvOHA5bzhsOHkuCisub2xpZ29wbzJseQorLm9sOGk5ZzhvOHA5bzhsOWk4ZThzLgorLm9saWdvcG9sMmllNAorLm9wOWU4cjlhOG44ZC4KKy5vcDFlcgorLjNvcGVyMWEKKy5vcDRlcjRhbmQKKy5vcGVyYTJuCisub3A5ZThyOWE4bjhkOHMuCisub3BlcmFuMmQxczIKKy5vcjhhOG44Zzl1OHQ4YThuLgorLm9yYTJuCisub3IyYW5nCisub3JhbjFndQorLm9yYW40Z3U0dAorLm9yYW5ndTF0YQorLm9yYTJuZ3V0YTJuCisub3I4YThuOGc5dTh0OGE4bjhzLgorLm9yYW5ndXRhMm4xczIKKy5vcjl0OGg4bzlkOG84bjl0OGk4czh0LgorLm9ydGhvMmRvNAorLm9ydGhvZG8ybgorLm9ydGhvZG9uM3Q0aQorLm9ydGhvZG9uMXQKKy5vcjl0OGg4bzlkOG84bjl0OGk4czh0OHMuCisub3J0aG9kb250aXM0dDFzMgorLm9yOXQ4aDhvOWs4ZThyOWE5dDhvOGw5bzhnOHkuCisub3J0aDJvaworLm9ydGhvazFlcgorLm9ydGhva2VyMWEKKy5vcnRob2tlcmExdG8KKy5vcnRob2tlcmF0b2wxbzFneQorLm9yOHQ4aDhvOW44aTh0OHI4bzl0OG84bDh1OGU4bjhlLgorLm9ydGhvMm4KKy5vcnRob24yaXQKKy5vcnRob25pM3RyCisub3J0aG9uaXRybzF0bworLm9ydGhvbml0cm90b2x1M2VuCisub3J0aG9uaXRyb3RvbHU0ZW5lCisub3Y4ZThyOXY4aThlOHcuCisub3ZlcnYyaWU0Cisub3Y4ZThyOXY4aThlOHc4cy4KKy5veDlpOGQ5aThjLgorLm94M2kKKy5veGk1ZGkKKy5veDJpZAorLnBhOGQ5ZDhpOG44Zy4KKy4xcGEKKy5wNGEyZAorLnBhZDRkMWluCisucGFkMWQ0CisucGE4aThuOWw4ZThzOHM5bDh5LgorLnA0YWkyCisucGE0aTRuNAorLnBhNGk0bjFsCisucGFpbmxlczIKKy5wYWluM2wyZTJzcworLnBhaW5sZXM0czFsMgorLnBhaW5sZXNzMWx5CisucGE4bDllOHQ4dDhlLgorLnA0YWwKKy5wMmFsZQorLnBhbGU0dDN0MgorLnBhOGw5ZTh0OHQ4ZThzLgorLnBhbGV0NHRlcworLnBhOHI5YTliOG84bDhhLgorLnAyYTJyCisucGEycmFiCisucGFyYWJvMWxhCisucGE4cjlhOWI4bzhsOWk4Yy4KKy5wYXJhYm9sM2ljCisucGFyYWJvbDJpCisucGE5cjhhOGI5bzlsOG84aThkLgorLnBhcmFib2xvaTIKKy5wYXJhYm9sbzJpZAorLnBhOHI5YTlkOGk4ZzhtLgorLnBhcmEyZAorLnBhcjJhZGkKKy5wYXJhZDJpZworLnBhcmFkaWcxbQorLnBhOHI5YTlkOGk4ZzhtOHMuCisucGFyYWRpZzRtMXMyCisucGE4cjhhOWM4aDh1OHQ4ZS4KKy5wYXJhMmNoCisucGFyYWNodTR0CisucGE4cjhhOWM4aDh1OHQ4ZThzLgorLnBhOHI4YTlkOGk5bThlOHQ4aDh5OGw5YjhlOG44ejhlOG44ZS4KKy5wYXJhZDRpbWV0CisucGFyYWRpbWV0aHkybDFiCisucGFyYWRpbWV0aHlsYjRlNG4zegorLnBhcmFkaW1ldGh5bGJlbjJ6ZQorLnBhcmFkaW1ldGh5bGJlbnplNG4KKy5wYThyOGE5ZjhsOHU4bzhyOG85dDhvOGw4dThlOG44ZS4KKy5wYXJhMmYKKy5wYXJhZjRsMgorLnBhcmFmbHUzbworLnBhcmFmbHVvM3IKKy5wYXJhZmx1b3JvMXRvCisucGFyYWZsdW9yb3RvbHUzZW4KKy5wYXJhZmx1b3JvdG9sdTRlbmUKKy5wYThyOGE5ZzhyOGE4cDhoOWU4ci4KKy5wYXJhMWdyCisucGFyYWc1cmEzcGg0ZXIKKy5wYThyOGE5bDhlOWc4YThsLgorLnBhcjNhbAorLnBhcjJhbGUKKy5wYXJhbDRlZ2FsCisucGFyYWxlMWdhCisucGE4cjlhOGw5bDhlOGw5aThzOG0uCisucGFyYWwxbAorLnBhcmFsMmxlCisucGFyYWwzbGVsCisucGFyYWxsZWwyaQorLnBhcmFsbGUybGlzCisucGFyYWxsZWxpMnMxbQorLnBhOHI4YTltOGE4ZzluOGU4dDlpOHM4bS4KKy5wYXI0YTFtYQorLnBhcmFtM2FnCisucGFyYTVtYWcxbgorLnBhcmFtYWduZXRpMnM0bQorLnBhOHI4YTltOGU4ZDhpOGMuCisucGFyYTJtZWQKKy5wYXJhbTRlZGkKKy5wYThyOGE5bThlOHQ4aDh5OGw5YThuOGk4czhvOGw4ZS4KKy5wYXJhbTNldAorLnBhcmFtZXRoeTNsYQorLnBhcmFtZXRoeWxhMm4KKy5wYXJhbWV0aHlsYW5pMnNvCisucGE5cjhhOG05ZTl0OHI4aTh6OGUuCisucGFyYW00ZXRyCisucGFyYW1ldHJpMnplCisucGE4cjhhOW04aThsOWk5dDhhOHI4eS4KKy5wYXIyYW1pCisucGFyYW1pbDFpCisucGFyYW0yaWwxaXQKKy5wYXJhbWlsaTF0YQorLnBhcmFtaWxpdDJhMnIKKy5wYThyOGE5bThvOHU4bjh0LgorLnBhcmEybW8KKy5wYXJhbW91MgorLnBhcmFtb3VuMXQKKy5wYTh0OGg5bzlnOGU4bjlpOGMuCisucDRhdGgKKy5wYXQ0aG8KKy5wYXRobzRnCisucGF0aG8xZ2U0CisucGF0aG8xZ2VuCisucGU4ZTh2OWk4czhoLgorLnA0ZWUKKy5wZWUxdmkKKy5wZWV2aXMyaAorLnBlOGU4djlpOHM4aDluOGU4czhzLgorLnBlZXZpczJoMW4KKy5wZWV2aXNoMW5lcworLnBlZXZpc2huMmUyc3MKKy5wZThuOXQ4YTlnOG84bi4KKy5wZW4xdAorLnBlbjF0YQorLnBlbnRhMmdvCisucGVudGFnbzJuMgorLnBlOG45dDhhOWc4bzhuOHMuCisucGVudGFnbzJuM3MyCisucGU5dDhyOG85bDhlOXU4bS4KKy5wZXRyb2w0ZXUKKy5waDhlOW44bzhtOWU5bjhvOG4uCisucGg0ZTNubworLnBoZTJuCisucGhlbm8ybWUKKy5waGVubzFtZW4KKy5waGVub200ZW5vCisucGhlbm9tZW5vNG4KKy5waDhlOG44eThsOWE4bDhhOW44aThuOGUuCisucGhlbnkzbGEKKy5waGVueWxhbGEybgorLnBoZW55bGFsYTVuMmluZQorLnBoZW55bGFsYW4xaW4KKy5waDhpOWw4YTh0OWU5bDhpOHM4dC4KKy5waGk0bGF0ZWwyaTQKKy5waGlsYXRlMmxpcworLnBoOGk5bDhhOHQ5ZTlsOGk4czh0OHMuCisucGhpbGF0ZWxpczR0MXMyCisucGg4bzluOGU4bThlLgorLjNwaG9uZQorLnBobzJuCisucGhvbmUxbWUKKy5waDhvOW44ZThtOGU4cy4KKy5waG9uZTJtZXMKKy5waDhvOW44ZTltOGk4Yy4KKy5waG9uZTVtaQorLnBoOG84czlwOGg4bzhyOWk4Yy4KKy5waG9zMXAKKy5waG9zcGhvNQorLnBob3NwaG80cgorLnBoOG85dDhvOWc4cjhhOHA4aDhzLgorLnBobzF0bworLnBob3RvMmdyCisucGhvdG9ncmE0cDRoMXMyCisucGg4bzl0OG85bzhmOGY5czhlOHQuCisucGhvdG9vMgorLnBob3RvbzRmMWYKKy5waG90b29mMmYzcworLnBpOGM5YTlkOG84ci4KKy5waTFjYQorLnBpY2EyZAorLnBpY2ExZG8KKy5waWNhZDRvcgorLnBpOGM5YTlkOG84cjhzLgorLnBpY2FkbzRyczIKKy5waThwOGU5bDhpOG44ZS4KKy5wMmlwCisucGlwZTQKKy5waXBlbDJpCisucGlwZTFsNGluZQorLnBpOHA4ZTlsOGk4bjhlOHMuCisucGlwZWxpMW5lcworLnBpOHA4ZTlsOGk4bjlpOG44Zy4KKy5waXBlbDJpbjNpCisucGlwZWxpbjFpbgorLnBpcGVsaW5pbjRnCisucGk5cjhhOW44aDhhOHMuCisucDRpcgorLnBpMXJhCisucGlyYTJuCisucGlyYTRuMWg0CisucGlyYW5oYTQKKy5wbDhhOGM4YTliOGw4ZS4KKy4xcDJsMgorLnBsYTFjYQorLnBsYWNhMWIybDIKKy5wbDhhOG44dDloOG84cDlwOGU4ci4KKy4zcGxhMm4KKy5wbGFuMXQKKy5wbGFudGhvNHAxcAorLnBsYW50aG9wMnBlCisucGxhbnRob3AzcGVyCisucGw4YThuOHQ5aDhvOHA5cDhlOHI4cy4KKy5wbGFudGhvcHBlNHIxczIKKy5wbDhlOGE4czlhOG44YzhlLgorLnBsZTJhCisucGxlYXNhMgorLnBsZWEzc2FuYworLnBsZWFzYTJuCisucGw4dThnOWk4bi4KKy5wbHVnNWluCisucGw4dThnOWk4bjhzLgorLnBsdTVnNGkybjFzMgorLnBvOGw5dDhlOHI5ZzhlOGk4czh0LgorLnBvNGwydAorLnBvbDF0ZQorLnBvbHRlcmcyCisucG9sdGVyZ2VpMgorLnBvOGw4eTllOG44ZS4KKy5wbzJseQorLnBvOGw4eTllOHQ4aDl5OGw5ZThuOGUuCisucG9seWU0dAorLnBvOWw4eThnOWE5bThpOHM4dC4KKy5wb2x5MWdhCisucG9seTJnYW0KKy5wb2x5Z2FtMmlzCisucG85bDh5OGc5YTltOGk4czh0OHMuCisucG9seWdhbWlzNHQxczIKKy5wbzhsOHk4ZzlvOG45aTl6OGE5dDhpOG84bi4KKy5wb2x5MWdvCisucG9seWdvMm4yCisucG9seWdvM25pCisucG9seWdvbml6YTEKKy5wb2x5Z29uaXphMXQyaW8KKy5wb2x5Z29uaXphdGlvMm4KKy5wbzlsOHk4cDhoOW85bjhvOHU4cy4KKy5wb2x5cGhvMm4KKy5wb2x5cGhvMW5vdTIKKy5wb2x5cGhvbm8ydXMKKy5wbzhsOHk5czh0OHk4cjhlOG44ZS4KKy5wbzJseXM0CisucG9seXMxdAorLnBvbHlzMnR5CisucG84bThlOWc4cjhhOG45YTh0OGUuCisucG8ybWUKKy5wb21lMmcKKy5wb21lMWdyCisucG9tZWdyYTJuMgorLnBvbWVncmExbmEKKy5wb21lZ3JhbjJhdAorLnBvOHI4bzllOGw4YThzOXQ4aThjLgorLjFwNG9yCisucG9ybzRlCisucG9ybzRlbAorLnBvcm9lMWxhCisucG9yb2VsYXN0MmkKKy5wb3JvZWxhczF0aWMKKy5wbzhyOW84dThzLgorLnBvcm91MgorLnBvcm8ydXMKKy5wbzhyOXQ4YTliOGw4ZS4KKy5wb3IxdGEKKy5wb3IydGFiCisucG9ydGFiMmwyCisucG84czh0OWE4bTliOGw4ZS4KKy4xcG9zCisucG9zMnRhCisucG9zdGE0bTFiCisucG9zdGFtYjJsMgorLnBvOHM4dDlhOG05YjhsOGU4cy4KKy5wb3N0YW1ibGVzMgorLnBvOHM4dDloOHU5bThvOHU4cy4KKy5wb3N0aHUxbW8KKy5wb3N0aHUzbW8ydXMKKy5wb3N0aHVtb3UyCisucG84czh0OXM4YzhyOGk4cDh0LgorLnBvczR0MXMyCisucG9zdDRzYworLnBvc3RzY3JpMgorLnBvc3RzY3IyaXAKKy5wb3N0c2NyaTJwMXQKKy5wbzhzOHQ5czhjOHI4aThwOHQ4cy4KKy5wb3N0c2NyaXA0dDFzMgorLnBvOHM5dDh1OHI5YThsLgorLnBvczF0dQorLnBvc3R1MXJhCisucHI4ZTlhOG05YjhsOGUuCisucHJlYTRtMWIKKy5wcmVhbWIybDIKKy5wcjhlOWE4bTliOGw4ZThzLgorLnByZWFtYmxlczIKKy5wcjhlOWw4bzhhOGQ4ZThkLgorLnByZWw0b2EKKy5wcmVsb2EyZDMKKy5wcmVsb2EyZDFlZAorLnByOGU5cDhhOHI5aThuOGcuCisucHJlMnBhCisucHJlcDRhNHIxaQorLnByZXAyYTJyCisucHJlcGFyaW40ZworLnByOGU5cDhyOGk4bjh0LgorLnByMmVwcjIKKy5wcmVwcmluNHQzCisucHI4ZTlwOHI4aThuOHQ4cy4KKy5wcmVwcmluNHQ0czIKKy5wcjhlOXA4cjhvOGM4ZThzOXM4bzhyLgorLnByZTNwcm8KKy5wcmVwcjJvYworLnByZXBybzFjZQorLnByZXByb2MyZTJzcworLnByZXByb2NlczFzbworLnByOGU5cDhyOG84YzhlOHM5czhvOHI4cy4KKy5wcmVwcm9jZXNzbzRyczIKKy5wcjhlOXM4cDhsOGk4dDl0OGk4bjhnLgorLnByZTFzcAorLnByZXMxcDJsMgorLnByZXNwbDFpdAorLnByZXNwbDRpNHQzdDIKKy5wcmVzcGxpdDJ0MWluCisucHI4ZTl3OHI4YThwLgorLnByZXdyYTQKKy5wcjhlOXc4cjhhOHA4cDhlOGQuCisucHJld3JhNHAxcAorLnByZXdyYXAycGUKKy5wcmV3cmFwNHAyZWQKKy5wcjhpOGU4czh0OWU4czhzOGU4cy4KKy41cHIyaTRlNAorLnByaTFlc3QKKy5wcmllczR0MmUyc3MKKy5wcmllc3Rlc3MxZTRzCisucHI4ZTh0OXQ4eTlwOHI4aThuOXQ4ZThyLgorLnByZTR0M3QyCisucHJldDF0eQorLnByMmV0dHlwcjIKKy5wcmV0dHlwcmluNHQzCisucHI4ZTh0OXQ4eTlwOHI4aThuOXQ4aThuOGcuCisucHJldHR5cHJpbnQyaQorLnByZXR0eXByaW40dDNpbmcKKy5wcmV0dHlwcmluMnQxaW4KKy5wcjhvOWM4ZTlkOHU4cjlhOGwuCisucHIyb2MKKy5wcm8xY2UKKy5wcm9jZTFkdQorLnByb2NlZHUxcmEKKy5wcjhvOGM4ZThzOHMuCisucHJvYzJlMnNzCisucHI4bzljOHU4cjlhOG44YzhlLgorLnByb2N1MXJhCisucHJvY3VyYTJuCisucHI4bzhnOWU5bjhpOGU4cy4KKy5wcm8xZ2UKKy5wcm8xZ2VuCisucHJvZ2U1bjJpZTQKKy5wcjhvOGc5ZTluOHkuCisucHJvNGdlbnkKKy5wcjhvOWc4cjhhOG05bThhOGI4bDhlLgorLnBybzFncgorLnByb2dyYW0xbQorLnByb2dyYW0xbWEKKy5wcm9ncmFtMm1hYgorLnByb2dyYW1tYWIybDIKKy5wcjhvOG05aTluOGU4bjh0LgorLnByb200aQorLnByb20xaW4KKy5wcm9tMmluZQorLnByb21pMW5lbgorLnByb21pbmVuMXQKKy5wcjhvOW04aThzOWM4dTlvOHU4cy4KKy5wcm9tMmlzCisucHJvbTJpczFjCisucHJvbWlzMWN1CisucHJvbWlzY3Uxb3UyCisucHJvbWlzY3VvMnVzCisucHI4bzhtOWk4czlzOG84cjh5LgorLnByb200aTJzMXMKKy5wcm9taXMxc28KKy5wcm9taXNzbzFyeQorLnByOG84bTlpOHM4ZS4KKy5wcm9tNGlzZQorLnByOG84bTlpOHM4ZThzLgorLnByb21pczFlNHMKKy5wcjhvOXA4ZThsOWw4ZThyLgorLnBybzNwZWwKKy5wcm9wZWwxbAorLnByb3BlbDJsZQorLnByOG85cDhlOGw5bDhlOHI4cy4KKy5wcm9wZWxsZTRyMXMyCisucHI4bzlwOGU4bDlsOGk4bjhnLgorLnByb3BlbGwyaQorLnByb3BlbDJsaW40CisucHI4bzloOGk4YjlpOXQ4aTh2OGUuCisucHJvMWgyCisucHJvaGliaTJ0CisucHJvaGliaTF0aQorLnByb2hpYmkxdDJpdgorLnByOG85aDhpOGI5aTl0OGk4djhlOWw4eS4KKy5wcm9oaWJpdGl2NGUxbHkKKy5wcjhvOXM4YzhpOHU4dDl0OG8uCisucHJvczJjCisucHJvczFjaQorLnByb3NjaTF1CisucHJvc2NpdTR0M3QyCisucHJvc2NpdXQ1dG8KKy5wcjhvOXQ4ZThzOHQ5ZThyLgorLnBybzF0CisucHJvNHRlcworLnByOG85dDhlOHM4dDllOHI4cy4KKy5wcm90ZXN0ZTRyMXMyCisucHI4bzl0OGU4czl0OG84ci4KKy5wcm90NGVzMnRvCisucHI4bzl0OGU4czl0OG84cjhzLgorLnByb3Rlc3RvNHJzMgorLnByOG85dDhvOWw4YThuOWc4dThhOGc4ZS4KKy5wcm8xdG8KKy5wcm90bzFsYQorLnByb3RvNGxhMm4KKy5wcm90b2wyYW5nCisucHJvdG9sYW4xZ3UKKy5wcm90b2xhbmd1NGEKKy5wcjhvOXQ4bzl0OHk4cDlhOGwuCisucHJvdG8xdHkKKy5wcm90b3R5MXBhCisucHJvdG90eXA0YWwKKy5wcjhvOHY5aThuOGM4ZS4KKy5wcm92MWluCisucHJvdjJpbmMKKy5wcjhvOHY5aThuOGM4ZThzLgorLnByOG85djhpOG45YzhpOGE4bC4KKy5wcm92aW4xY2kKKy5wcm92aW4zYzJpMWEKKy5wcm92aW5jaTJhbAorLnByOG84dzllOHM4cy4KKy5wcm93MmUyc3MKKy5wczhlOHU5ZDhvOWQ4aThmOWY4ZThyOWU4bjl0OGk4YThsLgorLjJwMXMyCisucDJzZQorLnBzNGV1CisucHNldTFkbworLnBzZXVkb2QxaWYKKy5wc2V1ZG9kaTRmMWYKKy5wc2V1ZG9kaWZmZXIxCisucHNldWRvZGlmZmVyM2VuMXQKKy5wc2V1ZG9kaWZmZXJlbnQyaQorLnBzZXVkb2RpZmZlcmVuMXQyaTFhCisucHNldWRvZGlmZmVyZW50aTJhbAorLnBzOGU4dTlkOG85ZjhpOW44aTh0OGUuCisucHNldTJkNW9mCisucHNldWRvMmZpCisucHNldWRvMmZpbgorLnBzZXVkb2YyaW5pCisucHNldWRvZmluMml0CisucHNldWRvZmluMml0ZQorLnBzOGU4dTlkOG85ZjhpOW44aTh0OGU5bDh5LgorLnBzZXVkb2Zpbml0ZTFseQorLnBzOGU4dTlkOG85ZjhvOHI4YzhlOHMuCisucHNldWRvMWZvCisucHNldWRvZm8ycgorLnBzZXVkb2ZvcjFjCisucHNldWRvZm9yMmNlCisucHM4ZTh1OWQ4bzhnOXI4YTlwOGg4ZThyLgorLnBzZXVkNG9nCisucHNldWRvMWdyCisucHNldWRvZzVyYTNwaDRlcgorLnBzOGU4dTlkOG85ZzhyOG84dThwLgorLnBzZXVkbzRnNHJvCisucHNldWRvZ3JvdTIKKy5wczhlOHU5ZDhvOWc4cjhvOHU4cDhzLgorLnBzZXVkb2dyb3UycDFzMgorLnBzOGU4dTlkOG85bjh5OG0uCisucHNldTRkbzJuCisucHNldWRvbnltNAorLnBzOGU4dTlkOG85bjh5OG04cy4KKy5wc2V1ZG9ueTRtMXMyCisucHM4ZTh1OWQ4bzl3OG84cjhkLgorLnBzZXVkbzR3bzIKKy5wczhlOHU5ZDhvOXc4bzhyOGQ4cy4KKy5wc2V1ZG93b3IyZDFzMgorLnBzOHk5YzhoOGU5ZDhlOGw5aThjLgorLnBzNHkKKy5wNHN5MWMKKy5wc3kzY2gKKy5wc3ljaDRlMgorLnBzeTRjaDRlZAorLnBzeWNoZWRlbDJpCisucHM4eThjOGg4cy4KKy5wc3ljNGgxczIKKy5wdTliOGU4czljOGU4bjhjOGUuCisucHViMworLnB1YjRlCisucHU0YmVzNAorLnB1YmVzMmMKKy5wdWJlczFjZW4KKy5wdWJlczNjZW5jCisucXU4YThkOWQ4aThuOGcuCisucXUyCisucXVhMmQKKy5xdWFkNGQxaW4KKy5xdWFkMWQ0CisucXU4YTlkOHI4YTh0OWk4Yy4KKy5xdWExZHIKKy5xdWFkcmF0MWljCisucXU4YTlkOHI4YTh0OWk4YzhzLgorLnF1YWRyYXRpNGMzczIKKy5xdThhOGQ5cjhhOXQ4dThyOGUuCisucXVhZHJhMnR1CisucXVhZHJhM3R1cmUKKy5xdThhOGQ5cjhpOXA4bDhlOGc5aThjLgorLnF1YWRyaTJwMmwyCisucXVhZHIyaXAKKy5xdWFkcmlwbGVnNGljCisucXU4YThpOG44dDllOHIuCisucXVhaTIKKy5xdWE0aTRuCisucXVhaW4xdAorLnF1OGE4aThuOHQ5ZThzOHQuCisucXU4YTlzOGk5ZThxOHU4aTh2OWE5bDhlOG44YzhlLgorLnF1YXMyaWU0CisucXVhc2llMXEKKy5xdTJhc2llcXUyCisucXVhc2llcTJ1aTIKKy5xdWFzaWVxdTJpdjMKKy5xdWFzaWVxdWkxdmEKKy5xdWFzaWVxdWl2MmFsZQorLnF1YXNpZXF1aXZhM2xlbmMKKy5xdThhOXM4aTllOHE4dThpOHY5YTlsOGU4bjhjOGU4cy4KKy5xdThhOXM4aTllOHE4dThpOHY5YTlsOGU4bjh0LgorLnF1YXNpZXF1aXZhMWxlbjF0CisucXU4YTlzOGk5aDh5OXA4bzluOG84cjltOGE4bC4KKy5xdWFzaTNoCisucXVhc2loeTNwbworLnF1YXNpaHlwbzJuCisucXVhc2loeXBvbm9yMW0KKy5xdWFzaWh5cG9ub3IxbWEKKy5xdThhOXM4aTlyOGE4ZDlpOWM4YThsLgorLnF1YXM0aTJyCisucXVhc2kxcjVhCisucXVhc2lyYTJkCisucXVhc2lyMmFkaQorLnF1YXNpcmFkM2kxY2EKKy5xdThhOXM4aTlyOGU4czhpOGQ5dThhOGwuCisucXVhc2k0cmVzCisucXVhc2lyZTFzaQorLnF1YXNpcmUyczJpZAorLnF1YXNpcmVzaTJkdQorLnF1YXNpcmVzaWQxdTFhCisucXU4YTlzOGk5czhtOG84bzh0OGguCisucXVhMXNpcworLnF1YXNpMnMxbQorLnF1YXNpczFtbworLnF1YXNpc21vbzIKKy5xdWFzaXNtbzRvdGgKKy5xdThhOXM4aTlzOHQ4YTl0OGk4bzhuOWE4cjh5LgorLnF1YXNpczF0YQorLnF1YXNpc3RhdGlvbjVhMnIKKy5xdWFzaXN0YTF0MmlvCisucXVhc2lzdGF0aW8ybgorLnF1YXNpc3RhdGlvMW4xYQorLnF1OGE5czhpOXQ4bzhwOG84cy4KKy5xdTVhNXNpNHQKKy5xdWFzaTF0bworLnF1YXNpdG8xcG9zCisucXU4YTlzOGk5dDhyOGk5YThuOWc4dTlsOGE4ci4KKy5xdWFzaTV0cjJpM2EKKy5xdWFzaXRyaTJhMm4KKy5xdWFzaXRyaTJhbmcKKy5xdWFzaXRyaWFuMWd1CisucXVhc2l0cmlhbmd1MWxhCisucXVhc2l0cmlhbmd1bDJhMnIKKy5xdThhOXM4aTl0OHI4aTh2OWk4YThsLgorLnF1YXNpdHIyaTR2CisucXVhc2l0cml2M2kKKy5xdWFzaXRyaXYyaTFhCisucXVhc2l0cml2aTJhbAorLnF1OGk4bjl0OGU4czlzOGU4bjhjOGUuCisucTJ1aTIKKy5xdWk0bgorLnF1aW4xdAorLnF1aW40dDJlMnNzCisucXVpbnRlczRzZW5jCisucXU4aThuOXQ4ZThzOXM4ZThuOGM4ZThzLgorLnF1OGk4bjl0OGU4czlzOGU4bjl0OGk4YThsLgorLnF1aW50ZXNzZW4xdAorLnF1aW50ZXNzZW50MmkKKy5xdWludGVzc2VuMXQyaTFhCisucXVpbnRlc3NlbnRpMmFsCisucmE4YjliOGk4dDlyOHkuCisuMnJhYgorLnJhMmIxYgorLnJhYmJpMnQKKy5yYWJiaTN0cgorLnJhYmJpdDVyeQorLnJhOWQ4aTlvOGc5cjhhOXA4aDh5LgorLnJhMmQKKy5yMmFkaQorLnJhM2QyaW8KKy5yYWRpbzVnCisucmFkaW8yZ3IKKy5yYWRpbzRnM3JhMXBoeQorLnJhOGY4ZjlpOHM4aC4KKy5yYWY1ZmkKKy5yYTJmCisucmE0ZjFmNAorLnJhZjJmNWlzCisucmFmZmlzMmgKKy5yYThmOGY5aThzOGg5bDh5LgorLnJhZmZpczRoMWw0CisucmFmZmlzaDFseQorLnJhOG05czhoOGE4YzhrOGw4ZS4KKy5yYTRtMXMyCisucmFtNHMyaAorLnJhbXNoYWNrMQorLnJhbXNoYWNrMWwKKy5yYTh2OWU4bjlvOHU4cy4KKy5yYXY0ZTRubworLnJhdmUxbm91MgorLnJhdmVubzJ1cworLnJlOWE4cjhyOGE4bjhnOGU5bThlOG44dC4KKy5yZTVhcjFyNAorLnJlMmEycgorLnJlYXJyYW40Z2UKKy5yZWFycmEybgorLnJlYXJyMmFuZworLnJlYXJyYW5nZTFtZQorLnJlYXJyYW5nZTFtZW4KKy5yZWFycmFuZ2UzbWVuMXQKKy5yZTlhOHI4cjhhOG44ZzhlOW04ZThuOHQ4cy4KKy5yZWFycmFuZ2VtZW40dDRzMgorLnJlOGM5aTlwOHI4bzhjOWk5dDhpOGU4cy4KKy5yZWNpcHJvY2kxdGkKKy5yZWNpcHJvY2l0MmllNAorLnJlOGM5dDhhOG45ZzhsOGUuCisucmVjNHRhMm4KKy5yZTJjMXQKKy5yZWN0NWFuZworLnJlYzF0YQorLnJlY3RhbjFnbDIKKy5yZWN0YW4xZ2xlCisucmU4Yzl0OGE4bjlnOGw4ZThzLgorLnJlY3RhbmdsZXMyCisucmU4Yzl0OGE4bjlnOHU5bDhhOHIuCisucmVjdGFuMWd1CisucmVjdGFuZ3UxbGEKKy5yZWN0YW5ndWwyYTJyCisucmU5ZDhpOXI4ZThjOHQuCisuMnIyZWQKKy5yNGVkaQorLnJlZDRpcjIKKy5yZWRpMXJlCisucmVkaXJlMmMxdAorLnJlOWQ4aTlyOGU4Yzh0OWk4bzhuLgorLnJlZGlyZWMxdDJpbworLnJlZGlyZWN0aW8ybgorLnJlOWQ4dThjOWk4YjhsOGUuCisucmUxZHUKKy5yZWR1MmMKKy5yZWR1Y2k0YgorLnJlZHUxY2kKKy5yZWR1Y2kxYjJsMgorLnJlOWU4YzhoOG8uCisucmVlMmMKKy5yZWUyY2gKKy5yZWUzY2hvMgorLnJlOXA4aDhyOGE4czhlLgorLnJlcDRocjQKKy5yZXBocjJhcworLnJlOXA4aDhyOGE4czhlOHMuCisucmVwaHJhczFlNHMKKy5yZTlwOGg4cjhhOHM4ZThkLgorLnJlcGhyYTRzNGVkCisucmU5cDhvOXM4aTl0OGk4bzhuLgorLnJlNHBvc2kKKy5yZTFwbworLnJlMXBvcworLnJlcG8zczJpMXQyaW8KKy5yZXBvc2kxdGkKKy5yZXBvc2l0aW8ybgorLnJlOXA4bzlzOGk5dDhpOG84bjhzLgorLnJlcG9zaXRpbzJuM3MyCisucmU5cDhyOGk4bjh0LgorLnJlcHIyCisucmVwcmluNHQzCisucmU5cDhyOGk4bjh0OHMuCisucmVwcmluNHQ0czIKKy5yZTlzOHQ4bzhyOWE4YjhsOGUuCisucjRlczJ0bworLnJlc3RvMnJhCisucmVzdG8ycmFiCisucmVzdG9yYWIybDIKKy5yZTh0OHI4bzlmOGk4dC4KKy5yZXRybzJmaQorLnJlOHQ4cjhvOWY4aTh0OXQ4ZThkLgorLnJldHJvZjRpNHQ0dDIKKy5yZXRyb2ZpdDJ0MWVkCisucmU5dThzOWE4YjhsOGUuCisucjRldTIKKy5yZTJ1czQKKy5yZXVzYTIKKy5yZXUyczFhYgorLnJldXNhYjJsMgorLnJlOXU4czhlLgorLnJlOXc4aThyOGUuCisucmV3aTIKKy5yZXc0aXI0CisucmU5dzhyOGE4cC4KKy5yZXdyYTQKKy5yZTl3OHI4YThwOHA4ZThkLgorLnJld3JhNHAxcAorLnJld3JhcDJwZQorLnJld3JhcDRwMmVkCisucmU5dzhyOGk4dDhlLgorLnJld3JpNAorLnJld3IyaXRlCisucmg4aTluOG84YzllOHI5bzhzLgorLnJoNAorLnJoMmkxbm8KKy5yaGk0bm80YworLnJoaW5vMWNlCisucmhpbm9jMmVybworLnJpOGc4aDh0OWU4bzh1OHMuCisucmlnaDF0ZW8KKy5yaWdodGVvdTIKKy5yaWdodGVvMnVzCisucmk4ZzhoOHQ5ZThvOHU4czluOGU4czhzLgorLnJpZ2h0ZW91czFuNAorLnJpZ2h0ZW91czFuZXMKKy5yaWdodGVvdXNuMmUyc3MKKy5yaThuOGc5bDhlOGE4ZDhlOHIuCisucmluNGcKKy5yaW5nbDIKKy5yaW4xZ2xlCisucmluZ2xlMmEKKy5yaW5nbGVhMmQxCisucmk4bjhnOWw4ZThhOGQ4ZThyOHMuCisucmluZ2xlYWRlNHI1czIKKy5ybzliOG84dC4KKy5ybzliOG84dDhzLgorLnJvYm80dDFzMgorLnJvOWI4bzh0OGk4Yy4KKy5ybzliOG84dDlpOGM4cy4KKy5yb2JvdGk0YzNzMgorLnJvOHU4bjhkOXQ4YThiOGw4ZS4KKy5yb3UyCisucm91bjJkCisucm91bmQxdGEKKy5yb3VuZDJ0YWIKKy5yb3VuZHRhYjJsMgorLnJvOHU4bjhkOXQ4YThiOGw4ZThzLgorLnJvdW5kdGE1YmxlczIKKy5zYThsOGU4czljOGw4ZThyOGsuCisuc2EyCisuczJhbGUKKy5zYWxlczIKKy5zYWxlczJjCisuc2FsZXNjbGU1Cisuc2FsZXMxYzRsNAorLnNhOGw4ZThzOWM4bDhlOHI4azhzLgorLnNhbGVzY2xlcjRrMXMyCisuc2E4bDhlOHM5dzhvOG04YThuLgorLnNhbGVzNHcyCisuc2FsZTRzMXdvMgorLnNhbGVzd29tMQorLnNhbGVzd28xbWEKKy5zYWxlc3dvbWEybgorLnNhOGw4ZThzOXc4bzhtOGU4bi4KKy5zYWxlc3dvMm1lCisuc2FsZXN3bzFtZW4KKy5zYThsOW04bzluOGU4bDlsOGEuCisuczRhMmw0bQorLnNhbG1vMm40Cisuc2FsMW1vCisuc2FsbW9uNGVsbGEKKy5zYWxtb25lbDFsCisuc2E4bDl0OGE5dDhpOG84bi4KKy5zYTRsNHQKKy5zYWwxdGEKKy5zYWx0YTF0MmlvCisuc2FsdGF0aW8ybgorLnNhOHI5czhhOXA4YThyOWk4bDlsOGEuCisuczJhMnIKKy5zYTJyNHNhMgorLnNhNHJzMgorLnNhcnMxYXAKKy5zMmEycnNhcDJhMnI0Cisuc2Fyc2ExcGEKKy5zYXJzYXA0YTRyMWkKKy5zYXJzYXBhcmlsMWwKKy5zYTh1OGU4cjlrOHI4YTh1OHQuCisuc2F1NAorLnNhdWVya3JhdTR0Cisuc2M4YTh0OW85bDhvOGc5aTljOGE4bC4KKy5zMWNhCisuc2NhMXRvCisuc2NhdG8zbG9nMWljCisuc2NhdG9sb2dpMWNhCisuc2M4aDhlOGQ5dThsOWk4bjhnLgorLnMyY2gyCisuc2NoZTIKKy5zNGNoNGVkCisuc2NoZTRkdWwKKy5zY2hlMWR1Cisuc2NoZWR1bDJpCisuc2NoZWR1bDNpbmcKKy5zYzhoOGk4ejlvOXA4aDhyOGU4bjhpOGMuCisuc2NoaTJ6Cisuc2NoaTF6bworLnNjaGl6Mm9waAorLnNjaGl6b3A0aHI0Cisuc2M4aDhuOGE4dTl6OGU4ci4KKy5zYzJoMW4KKy5zY2gxbmEKKy5zY2huMmF1Cisuc2NobmF1Mno0ZQorLnNjaG5hdXoxZXIKKy5zYzhoOG84bzhsOWM4aDhpOGw4ZC4KKy5zNGNobzIKKy5zY2hvbzIKKy5zY2hvbzRsMWMyCisuczJjaG9vbDJjaAorLnNjaG9vbGNoNGlsMgorLnNjaG9vbGNoaTJsZAorLnNjOGg4bzhvOGw5YzhoOGk4bDhkOXI4ZThuLgorLnNjaG9vbGNoaWwzZHIKKy5zY2hvb2xjaGlsZHJlNAorLnNjaG9vbGNoaWw1ZHJlbgorLnNjOGg4bzhvOGw5dDhlOGE4YzhoOGU4ci4KKy5zY2hvbzRsMnQKKy5zY2hvb2wxdGUKKy5zMmNob29sdGVhMmNoCisuc2Nob29sdGVhY2hlMgorLnNjOGg4bzhvOGw5dDhlOGE4YzhoOWU4cjhzLgorLnNjaG9vbHRlYWNoM2U0cjFzMgorLnNjOHI4dTl0OGk5bjh5LgorLnNjcnUydDFpNW4KKy5zY3I0dTF0MmkKKy5zY3J1dDRpbnkKKy5zYzh5OHQ4aDlpOG44Zy4KKy5zMWN5Cisuc2N5M3RoaW4KKy5zZThsOGw5ZThyLgorLnNlbDJsZQorLnNlOGw4bDllOHI4cy4KKy5zZWxsZTRyMXMyCisuc2U4YzlyOGU5dDhhOHI5aThhOHQuCisuc2UxY3IKKy5zZTRjM3JlMXRhCisuc2VjcmV0MmEycgorLnNlY3JldGFyMWkKKy5zZWNyZXRhcjJpM2EKKy5zZThjOXI4ZTl0OGE4cjlpOGE4dDhzLgorLnNlY3JldGFyaWE0dDFzMgorLnNlOG05YTlwOGg4bzhyOGUuCisuc2UxbWEKKy5zZTRtYXAKKy5zZW1hcGhvNHIKKy5zZThtOWE5cDhoOG84cjhlOHMuCisuc2U5bThlOHM5dDhlOHIuCisuNHNlMW1lCisuc2UybWVzCisuc2U4bThpOWQ4ZThmOWk5bjhpOHQ4ZS4KKy5zZW0yaWQKKy5zZW1pZGUxZgorLnNlbWlkZWY1aTVuMml0ZQorLnNlbWlkZTFmaQorLnNlbWlkZTJmaW4KKy5zZW1pZGVmMmluaQorLnNlbWlkZWZpbjJpdAorLnNlOG04aTlkOGk5cjhlOGM4dC4KKy5zZW1pMmRpCisuc2VtaWQ0aXIyCisuc2VtaWRpMXJlCisuc2VtaWRpcmUyYzF0Cisuc2U4bThpOWg4bzltOG85dDhoOGU4dDlpOGMuCisuc2VtaTNoCisuc2VtaWhvMW1vCisuc2VtaWhvbTRvdGgzCisuc2VtaWhvbW90aDJlCisuc2VtaWhvbW8zdGhlNHQKKy5zZW1paG9tb3RoZXQxaWMKKy5zZThtOGk5cjhpOG44Zy4KKy5zZW00aXIKKy5zZW1pcjFpCisuc2VtaXJpbjRnCisuc2U4bThpOXI4aThuOGc4cy4KKy5zZW1pcmluZ3MyCisuc2U4bThpOXM4aThtOXA4bDhlLgorLnNlNG0yaXMKKy5zZW1pc2k0bTFwCisuc2VtaXNpbTFwMmwyCisuc2U4bThpOXM4azhpOGw4bDhlOGQuCisuc2VtNGlzNGsyCisuc2VtaXNrMWkKKy5zZW1pc2s0aWwxbAorLnNlbWlza2lsMmxlCisuc2U4cjhvOWU4cDhpOWQ4ZTltOGk5bzlsOG84ZzlpOWM4YThsLgorLnMyZXI0bworLnNlcm80ZQorLnNlcm9lcDRpZAorLnNlcm9lcGkzZGUKKy5zZXJvZXBpZDRlbQorLnNlcm9lcGlkZW0yaW8KKy5zZXJvZXBpZGVtaTFvbAorLnNlcm9lcGlkZW1pbzNsb2cxaWMKKy5zZXJvZXBpZGVtaW9sb2dpMWNhCisuc2U4cjl2OG85bThlOGM4aDlhOG44aThzOG0uCisuNHNlcjN2bworLnNlcnZvMm1lCisuc2Vydm9tZTJjaAorLnNlcnZvbWVjaDVhNW5pcworLnNlcnZvbWVjaGEybgorLnNlcnZvbWVjaGFuaTJzMW0KKy5zZThyOXY4bzltOGU4YzhoOWE4bjhpOHM4bThzLgorLnNlcnZvbWVjaGFuNGlzNG0xczIKKy5zZThzOXE4dThpOXA4ZTlkOGE5bDhpOGE4bi4KKy5zMWU0cworLnNlc3F1MgorLnNlc3EydWkyCisuc2VzcXUyaXAKKy5zZXNxdWlwZTQKKy5zZXNxdWkycDJlZAorLnNlc3F1aXAyZTJkMmEKKy5zZXNxdWlwZWRhbDFpCisuc2VzcXVpcGVkYWwyaTFhCisuc2VzcXVpcGVkYWxpMmEybgorLnNlOHQ5dThwLgorLnNlMXR1Cisuc2U4dDl1OHA4cy4KKy5zZXR1MnAxczIKKy5zZTl2OGU4cjhlOWw4eS4KKy41c2V2Cisuc2V2MWVyCisuc2V2NGVyZWwKKy5zZXZlcmUxbHkKKy5zaDhhOHA4ZTlhOGI4bDhlLgorLnNoYTNwZTRhCisuc2hhcGUxYTRiCisuc2hhcGVhYjJsMgorLnNoOG84ZTlzOHQ4cjhpOG44Zy4KKy5zaG80Cisuc2hvMmVzdDRyCisuc2hvZXN0cmluNGcKKy5zaDhvOGU5czh0OHI4aThuOGc4cy4KKy5zaG9lc3RyaW5nczIKKy5zaThkOGU5czh0OGU4cC4KKy41c2lkZTRzMgorLnMyaWQKKy5zaWRlc3RlNHAKKy5zaThkOGU5czh0OGU4cDhzLgorLnNpZGVzdGUycDFzMgorLnNpOGQ4ZTlzOHc4aThwOGUuCisuc2lkZXM0dzIKKy5zaWRlc3dpMgorLnNpZGVzdzJpcAorLnNpZGVzd2lwZTQKKy5zazh5OXM4YzhyOGE4cDhlOHIuCisuc2syCisuc2t5czRjCisuc2t5c2NyYXAzZXIKKy5zazh5OXM4YzhyOGE4cDhlOHI4cy4KKy5za3lzY3JhcGU0cjFzMgorLnNtOG84azhlOXM4dDhhOGM4ay4KKy4yczFtCisuczFtbworLnM0bTJvaworLnNtb2tlczQKKy5zbW9rZXMxdGEKKy5zbW9rZXN0YWNrMQorLnNtOG84azhlOXM4dDhhOGM4azhzLgorLnNtb2tlc3RhYzRrMXMyCisuc244bzhyOWs4ZThsOWk4bjhnLgorLnMxbjQKKy5zbm9ya2U1bDJpCisuc25vcmtlNGwzaW5nCisuc285bDhlOW44bzhpOGQuCisuMXNvCisuc29sNGVubworLnNvbGVub2kyCisuc29sZW5vMmlkCisuc285bDhlOW44bzhpOGQ4cy4KKy5zb2xlbm9pMmQxczIKKy5zbzhsOHU4dDhlLgorLnNvMWx1dAorLnNvOGw4dTh0OGU4cy4KKy5zbzh2OWU4cjllOGk4ZzhuLgorLjRzb3YKKy5zb3ZlcmVpMgorLnNvdmVyZTJpZzIKKy5zbzh2OWU4cjllOGk4ZzhuOHMuCisuc292ZXJlaWcybjFzMgorLnNwOGE5YzhlOHMuCisuMnMxcGEKKy5zcGE0Y2UKKy5zcDhlOWM4aThvOHU4cy4KKy5zcGUyYworLnNwZTFjMmkKKy5zcGVjMmlvCisuc3BlY2lvdTIKKy5zcGVjaW8ydXMKKy5zcDhlOGw4bDllOHIuCisuc3BlbDFsCisuc3BlbDJsZQorLnNwOGU4bDhsOWU4cjhzLgorLnNwZWxsZTRyMXMyCisuc3A4ZThsOGw5aThuOGcuCisuc3BlbGwyaQorLnNwZWwybGluNAorLnNwOGU5bDh1OG44azllOHIuCisuc3BlbHU0bmsyCisuc3BlbHVuazFlcgorLnNwOGU4bjhkOXQ4aDhyOGk4Zjh0LgorLnNwZW40ZAorLnNwZW5kMnRoCisuc3BlbmR0NGhyNAorLnNwZW5kdGhyNGkyZnQKKy5zcDhoOGU4cjlvOGk4ZC4KKy5zMnBoZQorLjNzcGg0ZXIKKy5zcGgyZXJvCisuc3BoZXJvaTIKKy5zcGhlcm8yaWQKKy5zcDhoOGU4cjlvOGk4ZDlhOGwuCisuc3BoZXJvaTFkMmEKKy5zcDhoOGk4bjlnOGU4cy4KKy5zcGg1aW5nCisuc3BoNGluZ2UKKy5zcDhpOGM5aTlsOHkuCisuc3AyaTFjaQorLnNwaWNpMWx5Cisuc3A4aThuOW84cjhzLgorLnNwaTJuCisuc3A0aTFubworLnNwaW5vNHJzMgorLnNwOG84azhlOHM5dzhvOG04YThuLgorLnNwMm9rCisuc3Bva2VzNAorLnNwb2tlczR3MgorLnNwb2tlNHMxd28yCisuc3Bva2Vzd29tMQorLnNwb2tlc3dvMW1hCisuc3Bva2Vzd29tYTJuCisuc3A4bzhrOGU4czl3OG84bThlOG4uCisuc3Bva2Vzd28ybWUKKy5zcG9rZXN3bzFtZW4KKy5zcDhvOHI4dDhzOWM4YThzOHQuCisuczFwNG9yNAorLnNwb3I0dDFzMgorLnNwb3J0NHNjCisuc3BvcnRzMWNhCisuc3A4bzhyOHQ4czljOGE4czh0OWU4ci4KKy5zcG9ydHNjYXN0NWVyCisuc3A4bzhyOXQ4aTh2OGU5bDh5LgorLnNwb3IxdGkKKy5zcG9yNHQyaXYKKy5zcG9ydGl2NGUxbHkKKy5zcDhvOHI4dDhzOXc4ZThhOHIuCisuc3BvcnQ0c3cyCisuc3BvcnRzd2UyYTJyCisuc3A4bzhyOHQ4czl3OHI4aTh0OGU4ci4KKy5zcG9ydHN3cmk0Cisuc3BvcnRzd3IyaXRlCisuc3A4bzhyOHQ4czl3OHI4aTh0OGU4cjhzLgorLnNwb3J0c3dyaXQ1ZTRyMXMyCisuc3A4cjhpOGc4aDh0OWw4aThlOHIuCisuc3ByMgorLnNwcjJpZworLnNwcmlnaDJ0bAorLnNwcmlnaHRsMmllNAorLnNxOHU4ZThhOW04aThzOGguCisuc3F1MgorLnNxdWVhbTJpcworLnNxdWVhbWlzMmgKKy5zdDhhOG44ZDlhOGw4bzhuOGUuCisuNXN0NGFuZAorLnN0YTJuCisuc3RhbjFkMmEKKy5zdGFuZGFsbzJuCisuc3Q4YThyOXQ4bDhpOG44Zy4KKy5zdDJhMnIKKy5zdGFyMnRsCisuc3Q4YThyOXQ4bDhpOG44ZzlsOHkuCisuc3RhcnRsaW5nbDIKKy5zdGFydGxpbmcxbHkKKy5zdDhhOXQ4aThzOXQ4aThjOHMuCisuc3RhdGlzMXQyaQorLnN0YXRpczF0aWMKKy5zdGF0aXN0aTRjM3MyCisuc3Q4ZThhOGw4dDhoOWk4bDh5LgorLnN0ZWE0bAorLnN0ZWE0bHQKKy5zdGVhbHRoM2kKKy5zdGVhbDR0aDRpbDIKKy5zdGVhbHRoaTFseQorLnN0OGU4ZThwOGw4ZTljOGg4YThzOGUuCisuczF0ZWUKKy5zdGVlNHAxCisuc3RlZTFwMmwyCisuc3RlZXBsZTJjaAorLnN0OGU4cjhlOG85ZzhyOGE4cDhoOWk4Yy4KKy5zdGVyZTFvCisuc3RlcmVvMmcKKy5zdGVyZW8xZ3IKKy5zdGVyZW81Z3JhcGgxaWMKKy5zdGVyZW9ncjRhcGhpCisuc3Q4bzljOGg4YThzOXQ4aThjLgorLnMxdG8KKy5zdG8yY2g0Cisuc3RvY2hhc3QyaQorLnN0b2NoYXMxdGljCisuc3Q4cjhhOG44ZzhlOW44ZThzOHMuCisuc3Q0cgorLnMxdHJhCisuc3RyYW40Z2UKKy5zdHJhMm4KKy5zdHIyYW5nCisuc3RyYW5nZTRuNGUKKy5zdHJhbjFnZW4KKy5zdHJhbmdlMW5lcworLnN0cmFuZ2VuMmUyc3MKKy5zdDhyOGE4cDloOGE4bjhnOGU4ci4KKy5zdHJhcGgyYW40ZworLnN0cmFwaGFuZzVlcgorLnN0cmFwaGEybgorLnN0OHI4YTh0OWE5ZzhlOG0uCisuc3RyYTJ0YQorLnN0OHI4YTh0OWE5ZzhlOG04cy4KKy5zdHJhdGFnZTRtMXMyCisuc3Q4cjhlOHQ4YzhoOWk5ZThyLgorLnN0cmU0dGMKKy5zdHJldDRjaAorLnN0cmV0Y2gyaWU0Cisuc3Q4cjhpOHA5dDhlOGE4czhlLgorLnN0cjJpcAorLnN0cmkycDF0Cisuc3RyaXAydGUKKy5zdDhyOG84bjhnOWg4bzhsOGQuCisuc3RybzJuCisuc3Ryb25naG8ybDJkCisuc3Q4cjhvOG44ZzllOHM4dC4KKy5zdDh1OXA4aThkOWU4ci4KKy5zMXR1Cisuc3R1cDRpZAorLnN0dXBpM2RlCisuc3Q4dTlwOGk4ZDllOHM4dC4KKy5zdHVwaWRlNHMyCisuc3U4YjlkOGk4ZjlmOGU4cjllOG45dDhpOGE4bC4KKy4xc3UKKy5zdTRiMworLnN1NGIxZAorLnN1YmQxaWYKKy5zdWJkaTRmMWYKKy5zdWJkaWZmZXIxCisuc3ViZGlmZmVyM2VuMXQKKy5zdWJkaWZmZXJlbnQyaQorLnN1YmRpZmZlcmVuMXQyaTFhCisuc3ViZGlmZmVyZW50aTJhbAorLnN1OGI5ZTh4OXA4cjhlOHM5czhpOG84bi4KKy5zdWI0ZQorLnN1YjFleDNwCisuc3ViZXhwcjIKKy5zdWJleDNwcjJlMnNzCisuc3ViZXhwcmVzMXNpCisuc3ViZXhwcmVzMXMyaW8KKy5zdWJleHByZXM1c2lvMm4KKy5zdThiOWU4eDlwOHI4ZThzOXM4aThvOG44cy4KKy5zdWJleHByZXNzaW8ybjNzMgorLnN1OG05bThhOWI4bDhlLgorLnN1Mm0KKy5zdW0xbQorLnN1bTFtYQorLnN1bTJtYWIKKy5zdW1tYWIybDIKKy5zdThwOGU4cjllOGc4by4KKy5zdTFwZQorLnN1cGVyZTFnbworLnN1OHA4ZThyOWU4ZzhvOHMuCisuc3VwZXJlNGdvcworLnN1OXA4cjhlOG05YTljOGk4czh0LgorLnN1cHIyCisuc3VwcmU0bWFjCisuc3VwcmUxbWEKKy5zdXByZW00YTJjaQorLnN1OXA4cjhlOG05YTljOGk4czh0OHMuCisuc3VwcmVtYWNpczR0MXMyCisuc3U4cjl2OGU4aThsOWw4YThuOGM4ZS4KKy5zdTJyCisuc3VydjRlCisuc3VydmVpMgorLnN1cnZlaWwxbAorLnN1cnZlaWxsYTJuCisuc3c4aThtOW04aThuOGc5bDh5LgorLnN3MgorLnN3aTIKKy5zd2ltMW0KKy5zd2ltbTRpbmdsMgorLnN3aW1tNWluZzFseQorLnN5OG04cDl0OG85bThhOHQ4aThjLgorLnN5NG0xcAorLnN5bTJwMXQKKy5zeW1wMXRvCisuc3ltcHRvMm1hCisuc3ltcHRvbWF0MWljCisuc3k4bjljOGg4cjhvOW04ZThzOGguCisuc3luM2M0aHI0Cisuc3luMmNoCisuc3luY2hybzJtZQorLnN5bmNocm8ybWVzCisuc3luY2hyb200ZXMyaAorLnN5OG45YzhoOHI4bzluOG84dThzLgorLnN5bmNocm8ybgorLnN5bmNocm8xbm91MgorLnN5bmNocm9ubzJ1cworLnN5OG45YzhoOHI4bzl0OHI4bzhuLgorLnN5bmNocm90cm8ybgorLnRhOGY4ZjlyOGE4aThsLgorLjR0YTJmNAorLnRhNGYxZjQKKy50YWZmcjJhaTIKKy50YThsOGs5YTl0OGk4djhlLgorLnRhMmwKKy40dGFsaworLnRhbGthMworLnRhbGthNHQKKy50YWxrYTF0Mml2CisudGE5cDhlOHM5dDhyOHkuCisudGFwMmVzdDRyCisudGFwZTRzdHJ5CisudGE5cDhlOHM5dDhyOGk4ZThzLgorLnRhcGVzdHIyaWU0CisudGE4cjlwOGE4dTlsOGk4bi4KKy50MmEycgorLnRhcjJwCisudGFyMXBhCisudGFycGF1NGwyCisudGFycGF1bDJpCisudGE4cjlwOGE4dTlsOGk4bjhzLgorLnRhcnBhdWwyaTJuMXMyCisudGU5bDhlOGc5cjhhOXA4aDhlOHIuCisudGVsZTFncgorLnRlbGVnNXJhM3BoNGVyCisudGU5bDhlOGc5cjhhOXA4aDhlOHI4cy4KKy50ZWxlZ3JhcGhlNHIxczIKKy50ZThsOGU5azhpOW44ZTh0OWk4Yy4KKy50ZWxla2k0bgorLnRlbGVrMWkKKy50ZWxlazJpbmUKKy50ZWxla2kzbmV0MWljCisudGU4bDhlOWs4aTluOGU4dDlpOGM4cy4KKy50ZWxla2luZXRpNGMzczIKKy50ZThsOGU5cjhvOWI4bzh0OWk4YzhzLgorLnRlNGwxZXIKKy50ZWw0ZXJvCisudGVsZXI1b2IKKy50ZWxlcm9ib3RpNGMzczIKKy50ZThsOGw5ZThyLgorLnRlbDFsCisudGVsMmxlCisudGU4bDhsOWU4cjhzLgorLnRlbGxlNHIxczIKKy50ZThtOXA4bzlyOGE4cjlpOGw4eS4KKy50ZTRtMXAKKy50ZW0xcDRvcgorLnRlbXBvMXJhCisudGVtcG80cmFyaWwKKy50ZW1wb3IyYTJyCisudGVtcG9yYXIxaQorLnRlbXBvcmFyaTFseQorLnRlOG45dThyOGUuCisudGU4czh0OWI4ZThkLgorLnRlczJ0MWIKKy50ZXN0NGJlMmQKKy50ZTh4OHQ5dzhpOGQ4dDhoLgorLjN0ZXgKKy50ZXgxdDIKKy50ZXh0dzQKKy50ZXh0d2kyCisudGV4dHcyaWQKKy50ZXh0d2lkMnRoCisudGg4YThsOWE5bTh1OHMuCisudGhhM2xhCisudGhhbGEzbQorLnRoYWxhMW11CisudGhhbGFtMnVzCisudGg4ZThyOW04bzllOGw4YThzOXQ4aThjLgorLnRoMmUKKy50aGVyM200CisudGhlcjFtbworLnRoZXJtbzRlbAorLnRoZXJtb2UxbGEKKy50aGVybW9lbGFzdDJpCisudGhlcm1vZWxhczF0aWMKKy50aThtOGU5czh0OGE4bThwLgorLnRpMm1lcworLnRpbWVzMXRhCisudGltZXN0YTRtMXAKKy50aThtOGU5czh0OGE4bThwOHMuCisudGltZXN0YW0ycDFzMgorLnRvOG84bDlrOGk4dC4KKy50b28yCisudG9vbGsxaQorLnRvOG84bDlrOGk4dDhzLgorLnRvb2xraTR0MXMyCisudG84cDhvOWc4cjhhOHA4aDlpOWM4YThsLgorLnRvNXBvNGcKKy50b3BvMWdyCisudG9wbzVncmFwaDFpYworLnRvcG9ncjRhcGhpCisudG9wb2dyYXBoaTFjYQorLnRvOHE4dThlOHMuCisudG8xcQorLnRvcXUyCisudHI4YThpOXQ4bzhyOW84dThzLgorLjF0cmEKKy50cjJhaTIKKy50cmFpMXRvCisudHJhaXRvcm91MgorLnRyYWl0b3JvMnVzCisudHI4YThuOHM5YzhlOGk4djhlOHIuCisudHJhMm4KKy50cmEybjFzMgorLnRyYW5zNGMKKy50cmFuNHMzY2VpMgorLnRyYW5zY2UyaXYKKy50cjhhOG44czljOGU4aTh2OGU4cjhzLgorLnRyYW5zY2VpdmU0cjFzMgorLnRyOGE4bjhzOWc4cjhlOHM4cy4KKy50cmFuMnMzZworLnRyYW5zMWdyCisudHJhbnNncjJlMnNzCisudHI4YThuOHM5djhlOHI5czhhOGwuCisudHJhbjRzdgorLnRyYW5zdmU0cjFzMgorLnRyYW5zdmVyMXNhMgorLnRyOGE4bjhzOXY4ZThyOXM4YThsOHMuCisudHJhbnN2ZXJzYTJsMXMyCisudHI4YThuOHM5djhlOHM5dDhpOHQ4ZS4KKy50cmFuc3Y0ZTJzCisudHJhbnN2ZXN0MmkKKy50cmFuc3Zlc3QyaXRlCisudHI4YThuOHM5djhlOHM5dDhpOHQ4ZThzLgorLnRyYW5zdmVzdGl0NGVzCisudHI4YTl2OGU4cjhzOWE5YjhsOGUuCisudHJhdmU0cjFzMgorLnRyYXZlcjFzYTIKKy50cmF2ZXIyczFhYgorLnRyYXZlcnNhYjJsMgorLnRyOGE5djhlOHI5czhhOGwuCisudHI4YTl2OGU4cjlzOGE4bDhzLgorLnRyYXZlcnNhMmwxczIKKy50cjhpOWU4dDhoOHk4bDlhOG04aThuOGUuCisudHJpNWV0CisudHIyaWU0CisudHJpZXRoeTNsYQorLnRyaWV0aHlsYW0xaW4KKy50cmlldGh5bGFtMmluZQorLnRyOGU4YThjOGg5ZThyOGk4ZThzLgorLnRyZWEyY2gKKy50cmVhY2hlMgorLnRyZWFjaGVyMWkKKy50cmVhY2hlcjJpZTQKKy50cjhvOHU5YjhhOWQ4bzh1OHIuCisudHJvdTIKKy50cm91YmEyZAorLnRyb3ViYTFkbworLnRyb3ViYWRvdTIKKy50dThyOWs4ZTh5LgorLjF0dQorLnR1OHI5azhlOHk4cy4KKy50dXJrZXlzNAorLnR1OHI4bjlhOHI4bzh1OG44ZC4KKy50dXI0bjJhMnIKKy50dXIxbmEKKy50dXJuYXJvdTIKKy50dXJuYXJvdW4yZAorLnR1OHI4bjlhOHI4bzh1OG44ZDhzLgorLnR1cm5hcm91bjJkMXMyCisudHk4cDlhOGwuCisuMXR5CisudHkxcGEKKy50eXA0YWwKKy51bjlhOHQ5dDhhOGM4aDhlOGQuCisudW4yYXQ0CisudW5hNHQzdDIKKy51bmF0MXRhCisudW5hdHRhMmNoCisudW5hdHRhY2hlMgorLnVuYXR0YTRjaDRlZAorLnVuOWU4cjhyOWk4bjhnOWw4eS4KKy51bjRlcgorLnVuZXI0cjQKKy51bmVycmluNGcKKy51bmVycmluZ2wyCisudW5lcnJpbmcxbHkKKy51bjlmOHI4aThlOG44ZDlsOHkuCisudW4zZgorLnVuZnJpMgorLnVuZnIyaWU0CisudW5mcmllbjJkMWx5CisudW45ZjhyOGk4ZThuOGQ5bDhpOWU4ci4KKy51bmZyaWVuZGwyaWU0CisudmE4Zzh1OGU4ci4KKy4xdmEKKy52YWc0CisudmE1Z3VlcgorLnZhMmd1ZQorLnZhOHU4ZDhlOXY4aThsOGw4ZS4KKy52YXVkZTF2NAorLnZhdWRlMnYzaTRsCisudmF1ZGUxdmkKKy52YXVkZXZpbDFsCisudmF1ZGV2aWwybGUKKy52aThjOWE4cjhzLgorLnY0aWMyYTJyCisudmkxY2EKKy52aWNhNHJzMgorLnZpOGw5bDhhOGk4bjllOHM4cy4KKy4ydmlsCisudmlsMWwKKy52aWxsYWkyCisudmlsbGE0aTRuCisudmlsbGEyaW5lCisudmlsbGFpNW4yZTJzcworLnZpbGxhaTFuZXMKKy52aThzOXU4YThsLgorLnZpM3N1CisudmlzdTFhbAorLnZpOHM5dThhOGw5bDh5LgorLnZpc3VhbDFsCisudmlzdWFsMWx5Cisudmk5djhpOHA5YTlyOG84dThzLgorLjN2Mml2Cisudml2Mmk0cAorLnZpdmkxcGEKKy52aXZpcDJhMnIKKy52aXZpcGFyb3UyCisudml2aXBhcm8ydXMKKy52bzhpOGM4ZTlwOHI4aThuOHQuCisudm9pNAorLnZvaTNjZXAKKy52b2ljZXByMgorLnZvaWNlcHJpbjR0MworLnZzOHA4YThjOGUuCisudjJzMXBhCisudnNwYTRjZQorLndhOGQ5ZDhpOG44Zy4KKy53YTJkCisud2FkNGQxaW4KKy53YWQxZDQKKy53YThsOGw5ZjhsOG84dzhlOHIuCisud2FsMWwKKy53YWwybGYKKy53YWxsZjRsMgorLndhbGxmbG93MWVyCisud2E4bDhsOWY4bDhvOHc5ZThyOHMuCisud2FsbGZsb3dlNHIxczIKKy53YThyOG05ZThzOHQuCisudzJhMnIKKy53YXIxbQorLndhcjJtZQorLndhcjJtZXMKKy53YThzOHQ4ZTl3OGE4dDhlOHIuCisud2FzNHQKKy53YXN0ZTJ3Cisud2FzdGUxdzVhCisud2FzdGV3YTF0ZQorLndhOHY4ZTlnOHU4aThkOGUuCisud2F2ZWczCisud2F2ZWcydWkyCisud2F2ZWd1MmlkCisud2E4djhlOWc4dThpOGQ4ZThzLgorLndhdmVndWlkZTRzMgorLndhOHY4ZTlsOGU4dC4KKy53YTh2OGU5bDhlOHQ4cy4KKy53YXZlbGU0dDFzMgorLndlOGI5bDhpOGs4ZS4KKy53MmUxYgorLndlYjJsMgorLndlYjNsNGlrCisud2U4ZThrOW44aThnOGg4dC4KKy53ZWVrbjJpZworLndlOGU4azluOGk4ZzhoOHQ4cy4KKy53ZWVrbmlnaDR0MXMyCisud2g4ZThlOGw5YzhoOGE4aThyLgorLndoZWU0bDFjMgorLndoZWVsMmNoCisud2hlZWxjaGFpMgorLndoZWVsY2hhNGlyCisud2g4ZThlOGw5YzhoOGE4aThyOHMuCisud2hlZWxjaGFpNHJzMgorLndoOGk4YzhoOWU4djhlOHIuCisud2hpNAorLndoNGkyY2gKKy53aGljaGUyCisud2hpY2hldjFlcgorLndoOGk4dDhlOXM4aThkOGU4ZC4KKy53aDJpdGUKKy53aGl0NGVzCisud2hpdGUxc2kKKy53aGl0ZTJzMmlkCisud2hpdGVzaTJkMWVkCisud2g4aTh0OGU5czhwOGE4YzhlLgorLndoaXRlMXNwCisud2hpdGUyczFwYQorLndoaXRlc3BhNGNlCisud2g4aTh0OGU5czhwOGE4YzhlOHMuCisud2k4ZDhlOXM4cDhyOGU4YThkLgorLncyaWQKKy53aWRlNHMyCisud2lkZTFzcAorLndpZGVzNHByZQorLndpZGVzcHIyCisud2lkZXNwcmVhMmQxCisud2k4bjhnOXM4cDhhOG4uCisud2luNGcKKy53aW5nczIKKy53aW5nMnMxcGEKKy53aW5nc3BhNG4KKy53aThuOGc5czhwOGE4bjhzLgorLndpbmdzcGEybjFzMgorLndpOG44ZzlzOHA4cjhlOGE4ZC4KKy53aW5nc3ByMgorLndpbmdzcHJlYTJkMQorLndpOHQ4YzhoOWM4cjhhOGY4dC4KKy53aTR0YworLndpdDRjaAorLndpdGNoY3JhMmY0dAorLndpdGNoY3JhMmYKKy53bzhyOGQ5czhwOGE4YzlpOG44Zy4KKy4xd28yCisud29yMmQxczIKKy53b3JkczRwCisud29yZDJzMXBhCisud29yZHNwNGEyY2kKKy53b3Jkc3BhMmMxaW4KKy53b3Jkc3BhYzFpbmcKKy53bzhyOGs5YThyOG84dThuOGQuCisud29yazJhMnIKKy53b3JrYXJvdTIKKy53b3JrYXJvdW4yZAorLndvOHI4azlhOHI4bzh1OG44ZDhzLgorLndvcmthcm91bjJkMXMyCisud284cjhrOWg4bzhyOHM4ZS4KKy53b3JraDQKKy53b3JraG9yNHNlCisud29ya2hvNHJzMgorLndvOHI4azloOG84cjhzOGU4cy4KKy53b3JraG9yczNlNHMKKy53cjhhOHA5YThyOG84dThuOGQuCisud3JhNAorLndyYXAyYTJyNAorLndyYTFwYQorLndyYXBhcm91MgorLndyYXBhcm91bjJkCisud3I4ZTh0OGM4aDllOGQuCisud3JlNHRjCisud3JldDRjaAorLndyZXRjaGUyCisud3JldDRjaDRlZAorLndyOGU4dDhjOGg5ZThkOWw4eS4KKy53cmV0Y2hlMmQxbHkKKy55ZThzOXQ4ZThyOXk4ZThhOHIuCisueWVzNAorLnllc3RlcnllMmEycgorLmFsOWc4ZTliOHI4YThpOXM4YzhoOGUuCisuYWxnZWJyYTJpczFjCisuYWxnZWJyYWlzM2NoMgorLmFsZ2VicmFpc2NoZTIKKy5hbDlsOGU5ZzhoOGU5bjh5LgorLmFsMWwKKy5hbDJsZQorLmFsM2xlZworLmFsbGVnaGUybgorLmFyOWs4YThuOXM4YThzLgorLmFya2EybgorLmFya2FuMnNhMgorLmFya2EybjFzMgorLmF0OHA5YThzOGUuCisuYTR0MXAKKy5hdDFwYQorLmF0OHA5YThzOGU4cy4KKy5hdHBhczFlNHMKKy5hdThzOXQ4cjhhOGw5YThzOGk4YThuLgorLmEydXMKKy5hdXMxdDRyCisuYXVzMXRyYQorLmF1c3RyYWxhczJpMWEKKy5hdXN0cmFsYXNpMmEybgorLmF1OHQ4bzltOGE4dDhpOXM4aThlOHI5dDhlOHIuCisuYXV0b21hM3RpcworLmF1dG9tYXRpczJpZTQKKy5hdXRvbWF0aXNpZXJ0M2VyCisuYmU5ZDhpOGU5bjh1OG44Zy4KKy40YmUyZAorLmI0ZTNkaQorLmJlNWRpM2VuCisuYmVkMmllNAorLmJlZGllM251NG4KKy5iZThtOGI4by4KKy40YmU1bQorLmJlNG01YgorLmJpOGI5bDhpOW85ZzhyOGE5cDhoOGk5czhjOGg4ZS4KKy5iaWJsaW9ncjRhcGhpCisuYmlibGlvZ3JhcGgyaXMxYworLmJpYmxpb2dyYXBoaXMzY2gyCisuYmlibGlvZ3JhcGhpc2NoZTIKKy5ibzhzOXQ4bzhuLgorLjVib3M0CisuYm9zMXRvCisuYm9zdG8ybgorLmJyOG84dzhuOWk4YThuLgorLmJyb3duNWkKKy5icm93M240aTFhCisuYnJvd25pM2EybgorLmJyOHU4bjhzOXc4aThjOGsuCisuYnJ1Mm4KKy5icnUybjNzNAorLmJydW40c3cyCisuYnJ1bnN3aTIKKy5icnVuc3dpY2sxCisuYnU5ZDhhOXA4ZThzOHQuCisuYnUxZDJhCisuY2E4cjlpOGI5YjhlOGE4bi4KKy5jYXIxaQorLmNhcjRpYgorLmNhcmkyYjFiCisuY2FyaWIyYmUKKy5jYXJpYmJlYTJuCisuY2g4YThyOGw4ZThzOXQ4bzhuLgorLmNoYXI0bGU0CisuY2hhcjFsCisuY2hhcmxlczIKKy5jaGFybDRlczJ0bworLmNoYXJsZTNzdG8ybgorLmNoOGE4cjlsOG84dDh0OGU4czl2OGk4bDhsOGUuCisuY2hhcjNsbzQKKy5jaGFybG80dDN0MgorLmNoYXJsb3Q0dGVzCisuY2hhcmxvdHRlNHN2CisuY2hhcmxvdHRlczJ2aWwKKy5jaGFybG90dGVzdmlsMWwKKy5jaGFybG90dGVzdmlsMmxlCisuY285bDh1OG05YjhpOGEuCisuY29sdW00YmkKKy5jb2x1NG0xYgorLmNvbHVtYjJpMWEKKy5jejhlOGM4aDhvOXM4bDhvOXY4YTlrOGk4YS4KKy5jMnplNAorLmN6ZTJjaAorLmN6ZTNjaG8yCisuY3plY2hvczRsMgorLmN6ZWNob3M0bG92CisuY3plY2hvc2xvMXZhCisuY3plY2hvc2xvdmFrMWkKKy5jemVjaG9zbG92YWsyaTFhCisuZGU4bDlhOXc4YThyOGUuCisuZGUxbGEKKy5kZTRsYXcKKy5kZWxhdzJhMnIKKy5kaThqOGs5czh0OHI4YS4KKy5kaTNqCisuZGlqNGsxczIKKy5kaWprc3Q0cgorLmRpamtzMXRyYQorLmR1OGE4bjhlLgorLmQxdTFhCisuZHVhMm4KKy5keTluOGE5bThpOXM4YzhoOGUuCisuNWR5bgorLmR5MW5hCisuZHluYW0yaXMKKy5keW5hbTJpczFjCisuZHluYW1pczNjaDIKKy5keW5hbWlzY2hlMgorLmVuOGc5bDhpOHM4aC4KKy5lbmdsMgorLmVuZ2xpczJoCisuZXU4bDhlOHI5aThhOG4uCisuZXVsNGUKKy5ldTNsNGVyMWkKKy5ldWxlMXIyaTNhNAorLmV1bGVyaTJhMm4KKy5ldjhhOG45czh0OG84bi4KKy5lMXZhCisuZXZhMm4KKy5ldmFuNHN0CisuZXZhMm4xczIKKy5ldmFuczF0bworLmV2YW5zdG8ybgorLmZlOGI5cjh1OWE4cjh5LgorLmYyZTRiCisuZmUzYnIKKy5mZWJydTNhCisuZmVicnUyYTJyCisuZmU4czh0OXM4YzhoOHI4aThmOHQuCisuZmVzNHQxczIKKy5mZXN0NHNjCisuZmVzdHMyY2gyCisuZmVzdHNjNGhyNAorLmZlc3RzY2hyNGkyZnQKKy5mbDhvOHI5aTlkOGEuCisuZmxvcjJpZAorLmZsb3JpMWQyYQorLmZsOG84cjlpOWQ5aThhOG4uCisuZmxvcmkyZGkKKy5mbG9yaWQ1aTJhMm4KKy5mbG9yaTFkNGkzYQorLmZvOHI5czhjOGg4dThuOGc4czlpOG45czh0OGk5dDh1OHQuCisuZm9yczRjCisuZm9yczJjaDIKKy5mb3JzY2h1bmdzMgorLmZvcnNjaHVuZzJzMWluCisuZm9yc2NodW5nczJpMm4xczIKKy5mb3JzY2h1bmdzaW5zdDJpCisuZm9yc2NodW5nc2luc3RpMXR1CisuZnI4ZThlOWI4czhkLgorLmZyZTJlMWIKKy5mcmVlMmI1czIKKy5mcmVlYjRzNWQKKy5mdThuOGs5dDhzOGk4bzhuOGE4bC4KKy4zZnUKKy5mdTRuazIKKy5mdW5rNXQKKy5mdW5rNHQxczIKKy5mdW5rdDFzMmlvCisuZnVua3Q1c2lvMm4KKy5mdW5rdHNpbzFuNWEKKy5nYTh1OHM4czlpOGE4bi4KKy5nYTJ1cworLmdhdTJzcworLmdhdXMxc2kKKy5nYXVzczJpMWEKKy5nYXVzc2kyYTJuCisuZ2g4bzhzOHQ5czhjOHI4aThwOHQuCisuZ2hvczR0MXMyCisuZ2hvc3Q0c2MKKy5naG9zdHNjcmkyCisuZ2hvc3RzY3IyaXAKKy5naG9zdHNjcmkycDF0CisuZ2g4bzhzOHQ5djhpOGU4dy4KKy5naG9zNHR2CisuZ2hvc3R2MmllNAorLmdyOGE4czhzOW04YThuOG45aThhOG4uCisuZ3IyYXMKKy5ncmEyc3MKKy5ncmFzMnMxbQorLmdyYXNzM21hCisuZ3Jhc3NtYTJuMworLmdyYXNzbWE0bjFuMgorLmdyYXNzbWFuM240aTFhCisuZ3Jhc3NtYTJubmkzYTJuCisuZ3I4ZThpOGY4czl3OGE4bDhkLgorLmdyZWkyCisuZ3JlaTJmM3MKKy5ncmVpZnN3MgorLmdyZWlmc3dhMmxkCisuZ3I4bzh0OGg4ZThuOWQ4aThlOGM4ay4KKy5nNHJvCisuZ3JvNHRoMmUKKy5ncjRvdGgKKy5ncm90aGUybgorLmdyb3RoZW5kMmllNAorLmdyb3RoZW5kaWVjazEKKy5ncjh1OG44ZDlsOGU4aDlyOGU4bi4KKy5ncnUybgorLmdydW5kbGUxaDQKKy5ncnVuZGxlNGhyNAorLmhhOWQ4YTltOGE4cjhkLgorLmhhMmQKKy5oYTFkMmEKKy5oYWRhMm0yCisuaGFkNGExbWEKKy5oYWRhbTJhMnIKKy5oYThpOWY4YS4KKy5oYWkxZmEKKy5oYThtOGk4bDl0OG84bjlpOGE4bi4KKy5oYTRtCisuaGFtaTRsdAorLmhhbWlsMXRvCisuaGFtaWx0bzJuCisuaGFtaWx0bzNuNGkxYQorLmhhbWlsdG9uaTNhMm4KKy5oZThsOXM4aThuOGs4aS4KKy5oZTJsMXMyCisuaGVsMnMxaW4KKy5oZWxzNGk0bmsyCisuaGVsc2luazFpCisuaGU4cjltOGk4dDlpOGE4bi4KKy5oZXIzbWl0CisuaGVybWkxdGkKKy5oZXJtNGkxdDJpMWEKKy5oZXJtaXRpMmEybgorLmhpOGI4YjhzLgorLmhpMmIxYgorLmhpYjJiNXMyCisuaG84azlrOGE4aTlkOG8uCisuaDJvaworLmhva2s0CisuaG9ra2FpMgorLmhva2thMmlkCisuaG9ra2FpMWRvCisuamE4YzlrOG84dzlzOGs4aS4KKy41amEKKy5qYWNrMQorLmphY2tvd3NrMgorLmphY2tvd3NrMWkKKy5qYThuOXU5YThyOHkuCisuamEybgorLmphbjN1MWEKKy5qYW51MmEycgorLmphOXA4YTluOGU4czhlLgorLmphNHAKKy5qYTFwYQorLmphcGEybgorLmphcGExbmVzCisuamFwYW5lMXMyZQorLmthOGQ5bzhtOXQ4czhlOHYuCisua2EyZAorLmthMWRvCisua2FkbzRtdAorLmthZG9tNHQxczIKKy5rYWRvbXQ1c2V2Cisua2E4bjlzOGE4cy4KKy5rYTJuCisua2FuMnNhMgorLmthMm4xczIKKy5rYThyOGw4czlyOHU4aDhlLgorLmsyYTJyCisua2FyMWwKKy5rYXIybDFzMgorLmthcmxzMXIKKy5rbzhyOXQ4ZTl3OGU4Zy4KKy5rbzVyCisua3I4aThzOGg4bjhhLgorLmtyMmlzCisua3IzaXMyaAorLmtyaXMyaDFuCisua3Jpc2gxbmEKKy5rcjhpOHM4aDluOGE5aThzOG0uCisua3Jpc2huYWkyCisua3Jpc2huYWkyczFtCisua3I4aThzOGg5bjhhOG4uCisua3Jpc2huMmEybgorLmxhOG45YzhhOHM5dDhlOHIuCisubGFuMWNhCisubGFuY2FzdDVlcgorLmxlOWc4ZThuOGQ4cjhlLgorLmxlMWdlbgorLmxlZ2VuMWRyCisubGVnZW5kcmU0CisubGU4aThjOGU4czl0OGU4ci4KKy5sZWkyCisubGU1aWMKKy5sZWljZXM1dAorLmxpOHA5czhjOGg4aTh0OHouCisubDJpcAorLmxpMnAxczIKKy5saXBzMmNoMgorLmxpcHMzY2hpdAorLmxpcHNjaGk0dHoKKy5saThwOXM4YzhoOGk4dDh6OWk4YThuLgorLmxpcHNjaGl0MnoxaQorLmxpcHNjaGl0ejJpMWEKKy5saXBzY2hpdHppMmEybgorLmxvOGo5YjhhOG4uCisubG81agorLmxvamJhMm4KKy5sbzh1OWk5czhpOWE4bjhhLgorLmxvdTIKKy5sbzJ1aTIKKy5sb3VpczJpMWEKKy5sb3Vpc2kyYTJuCisubG91aXNpYTFuYQorLm1hOGM5bzhzLgorLm1hMWNvCisubWE4bjljOGg4ZThzOXQ4ZThyLgorLm1hbjJjaAorLm1hbmNoZTIKKy5tYW5jaDFlcworLm1hOHI5azhvOHY5aThhOG4uCisubWFya281dmkyYTJuCisubWFya292MmkxYQorLm1hOHI4azh0OW84YjhlOHI5ZDhvOHI4Zi4KKy5tYXJrNXQKKy5tYXJrMXRvCisubWFya3RvM2IKKy5tYXJrdG9iZXIxZG8KKy5tYXJrdG9iZXJkNG9yCisubWFya3RvYmVyZG9yMWYKKy5tYThzOHM5YTljOGg4dTlzOGU4dDh0OHMuCisubWEyc3MKKy5tYXMxc2EyCisubWFzc2EyY2gKKy5tYXNzYWNoMnVzCisubWFzc2FjaHVzZTR0M3QyCisubWFzc2FjaHVzZXQ0dDFzMgorLm1hOHg5dzhlOGw4bC4KKy5tYXh3ZWw0bAorLm1pOWM4cjhvOXM4bzhmOHQuCisubWljcm8yc28KKy5taWNyb3NvMmZ0MworLm1pOG45bjhlOWE4cDlvOWw4aThzLgorLm0yaTRuMW4yCisubWlubmU0CisubWlubmVhcG9sMmkKKy5taThuOW44ZTlzOG84dDhhLgorLm1pbjFuZXMKKy5taW5uZTFzbworLm1pbm5lc28xdGEKKy5tbzhzOWM4bzh3LgorLm1vczJjCisubW9zMWNvCisubmE4YzhoOXI4aThjOGg4dDhlOG4uCisuMW5hCisubmEyY2gKKy5uYWM0aHI0CisubmEyY2hyNGkyY2gKKy5uYWNocmljaHQxZW4KKy5uYThzOGg5djhpOGw4bDhlLgorLm40YXMKKy5uYXMyaAorLm5hc2gydmlsCisubmFzaHZpbDFsCisubmFzaHZpbDJsZQorLm5lOHQ5YjhzOGQuCisubmUydDFiCisubmV0MmI1czIKKy5uZXRiNHM1ZAorLm5lOHQ5czhjOGE4cDhlLgorLm5lNHQxczIKKy5uZXQ0c2MKKy5uZXRzY2E0cAorLm5ldHMxY2EKKy5uaThqOW04ZTlnOGU4bi4KKy5uaTNqCisubmlqbWUyZworLm5pam1lMWdlbgorLm5vOGU5dDhoOGU4cjlpOGE4bi4KKy4zbm9lCisubm9ldGgyZQorLm5vZXRoZXIxaQorLm5vZXRoZTFyMmkzYTQKKy5ub2V0aGVyaTJhMm4KKy5ubzhvOHI4ZDl3OGk4ajhrOGU4cjloOG84dTh0LgorLm5vbzIKKy5ubzNvcmQKKy5ub29yZDF3Cisubm9vcmR3aTIKKy5ub29yZHdpM2oKKy5ub29yZHdpamsxZXIKKy5ub29yZHdpamtlcjFoNAorLm5vb3Jkd2lqa2VyaG91MgorLm5vOXY4ZThtOWI4ZThyLgorLm5vdmU0bTViCisub3A4ZThuOWI4czhkLgorLm9wZTRuMWI0Cisub3BlbjJiNXMyCisub3BlbmI0czVkCisub3A4ZThuOW84ZjhmOGk4YzhlLgorLm9wNGVubworLm9wZW5vNGYxZgorLm9wZW5vZjFmaQorLnBhOGw4YTl0OGk4bjhvLgorLnBhbGEydDFpbgorLnBhbGF0Mmkxbm8KKy5wYTlsOGU4cjltOG8uCisucGFsZXIzbTQKKy5wYWxlcjFtbworLnBlOXQ4cjhvOHY5czhrOGkuCisucGV0cm8zdgorLnBldHJvdnNrMgorLnBldHJvdnNrMWkKKy5wZjhhOGY4ZjlpOGE4bi4KKy40cGYKKy5wMWZhCisucGZhMmYKKy5wZmE0ZjFmNAorLnBmYWYxZmkKKy5wZmFmZjJpM2EKKy5wZmFmZmkyYTJuCisucGg4aThsOWE5ZDhlOGw5cDhoOGk4YS4KKy5waGk0bDRhZGUKKy5waGlsYTJkCisucGhpbGFkZTJscAorLnBoaWxhZGVsNXBoaQorLnBoaWxhZGVscGgyaTFhCisucGg4aThsOW85czhvOHA4aDlpOXM4YzhoOGUuCisucGhpbG8yc28KKy5waGlsb3M0b3AKKy5waGlsb3Myb3BoCisucGhpbG9zb3BoMmlzMWMKKy5waGlsb3NvcGhpczNjaDIKKy5waGlsb3NvcGhpc2NoZTIKKy5wbzhpOG45YzhhOHI4ZS4KKy5wb2luMgorLnBvaTIKKy5wb2luYzJhMnI1CisucG9pbjFjYQorLnBvOXQ4ZThuOXQ4aThhOGw5ZzhsOGU4aTljOGg4dThuOGcuCisucDRvdAorLnBvMXRlbjF0CisucG90ZW50MmkKKy5wb3RlbjF0MmkxYQorLnBvdGVudGkyYWwKKy5wb3RlbnRpYTRsMWc0CisucG90ZW50aWFsZ2wyCisucG90ZW50aWFsMWdsZQorLnBvdGVudGlhbGdsZWkyCisucG90ZW50aWFsZ2xlNWljCisucG90ZW50aWFsZ2xlNGkyY2gKKy5yYTlkOGg4YTlrOHI4aThzOGg5bjhhOG4uCisucmFkMWgyCisucmFkaGFrcjJpcworLnJhZGhha3IzaXMyaAorLnJhZGhha3JpczJoMW4KKy5yYWRoYWtyaXNoMW5hCisucmFkaGFrcmlzaG4yYTJuCisucmE4dDhoOHM5azhlOGw5bDhlOHIuCisucjRhdGgKKy5yYTJ0NGgxczIKKy5yYXRoc2syCisucmF0aDRza2UKKy5yYXRoc2tlbDFsCisucmF0aHNrZWwybGUKKy5yaThlOW04YThuOG45aThhOG4uCisucjJpZTQKKy5yaWU1bWEybgorLnJpZTFtYQorLnJpZW1hNG4xbjIKKy5yaWVtYW4zbjRpMWEKKy5yaWVtYTJubmkzYTJuCisucnk4ZDliOGU4cjhnLgorLnJ5MWQKKy5yeWQxYgorLnJ5ZGJlcmcyCisuc2M4aDhvOHQ5dDhpOHM4YzhoOGUuCisuc2NobzR0M3QyCisuc2Nob3R0MmlzMWMKKy5zMmNoMm90dGlzM2NoMgorLnNjaG90dGlzY2hlMgorLnNjOGg4cjhvOWQ4aThuOGc5ZThyLgorLnNjNGhyNAorLnNjaHJvZDFpbgorLnNjaHJvZDRpbmdlCisuc2M4aDh3OGE5YjhhOWM4aDhlOHIuCisuc2NoMXcKKy5zY2h3YWJhMmNoCisuc2Nod2FiYWNoZTIKKy5zYzhoOHc4YThyOHo5czhjOGg4aThsOGQuCisuc2NodzJhMnIKKy5zMmNod2FyenMyY2gyCisuc2Nod2FyenNjaDRpbDIKKy5zY2h3YXJ6c2NoaTJsZAorLnNlOHA5dDhlOG05YjhlOHIuCisuc2UycDF0Cisuc2VwMnRlCisuc2VwdGU0bTViCisuc3Q4bzhrOGU4czlzOGM4aDhlLgorLnN0Mm9rCisuc3Rva2VzNAorLnN0b2syZTJzcworLnN0b2tlczJzNWMKKy5zdG9rZXNzMmNoMgorLnN0b2tlc3NjaGUyCisuc3Q4dTh0OHQ5ZzhhOHI4dC4KKy5zdHU0dDN0MgorLnN0dXQ0dDFnCisuc3R1dHQxZ2EKKy5zdHV0dGcyYTJyCisuc3U4czlxOHU4ZTloOGE4bjluOGEuCisuczJ1cworLnN1c3F1MgorLnN1c3F1ZTFoNAorLnN1c3F1ZWhhMm4KKy5zdXNxdWVoYTRuMW4yCisuc3VzcXVlaGFuMW5hCisudGE4dTliOGU4cjlpOGE4bi4KKy50YXU0YgorLnRhdWI0ZQorLnRhdTNiZXIKKy50YXViZXIxaQorLnRhdWJlMXIyaTNhNAorLnRhdWJlcmkyYTJuCisudGU4YzhoOW44aTlzOGM4aDhlLgorLnRlMmNoCisudGVjMmgxbgorLnRlY2huMmlzMWMKKy50ZTJjaG5pczNjaDIKKy50ZWNobmlzY2hlMgorLnRlOG45bjhlOHM5czhlOGUuCisudDRlNG4xbjIKKy50ZW5uZTQKKy50ZW4xbmVzCisudGVubjJlMnNzCisudG85bThhOXM4ejhlOHc5czhrOGkuCisudG8ybWEKKy50b21hczJ6ZQorLnRvbWFzemV3c2syCisudG9tYXN6ZXdzazFpCisudHk5cDhvOWc4cjhhOHA4aDhpOHE4dThlLgorLnR5M3BvCisudHk1cG80ZworLnR5cG8xZ3IKKy50eXBvZ3I0YXBoaQorLnR5cG9ncmFwaGlxdTIKKy51azhyOGE4aThuOWk4YThuLgorLjR1aworLnVrcjJhaTIKKy51a3JhNGk0bgorLnVrcmEyaW5pCisudWtyYWk0bjRpMWEKKy51a3JhaW5pM2EybgorLnZlOHI5YThsOGw5ZzhlOW04ZThpOG45ZThyOHQ4ZS4KKy52ZXJhbDFsCisudmVyYWw0bDFnNAorLnZlcmFsbGdlMW1lCisudmVyYWxsZ2VtZWkyCisudmVyYWxsZ2VtZTJpbmUKKy52ZXJhbGxnZW1laW4xZXIKKy52ZThyOWU4aThuOWk5Zzh1OG44Zy4KKy52ZXJlM2luCisudmVyZWkyCisudmVyZTJpbmkKKy52ZXJlaW4yaWcKKy52ZXJlaW5pM2d1bgorLnZlOHI5dDhlOGk5bDh1OG45ZzhlOG4uCisudmVydGVpMgorLnZlcnRlaWx1bjFnZW4KKy52aThpOGk4dDhoLgorLnY0aTVpNAorLnZpNGk1aTQKKy52aWkyaXRoCisudmk4aTh0OGguCisudmkyaXRoCisud2E4aDhyOXM4YzhoOGU4aThuOWw4aThjOGg5azhlOGk4dDhzOXQ4aDhlOG85cjhpOGUuCisud2E0aHI0Cisud2FoNHJzMgorLndhaHJzNGMKKy53YWhyczJjaDIKKy53YWhyc2NoZTIKKy53YWhyc2NoZWkyCisud2FocnNjaGU0aTRuMWwKKy53YWhyczJjaGVpbmw0aTJjaAorLndhaHJzY2hlaW5saWM0aGsKKy53YWhyc2NoZWlubGljaGtlaTIKKy53YWhyc2NoZWlubGljaGtlaTR0MXMyCisud2FocnNjaGVpbmxpY2hrZWl0czN0aDJlCisud2FocnNjaGVpbmxpY2hrZWl0c3RoZTFvNXIKKy53YWhyc2NoZWlubGljaGtlaXRzdGhlb3IyaWU0Cisud2U4cjluOGU4ci4KKy53MWVyCisud2VyNG4xZXIKKy53ZThyOXQ4aDhlOHI5aThhOG4uCisud2VydGgyZQorLndlcnRoZXIxaQorLndlcnRoZTFyMmkzYTQKKy53ZXJ0aGVyaTJhMm4KKy53aThuOWM4aDhlOHM5dDhlOHIuCisud2luMmNoCisud2luY2hlMgorLndpbmNoMWVzCisud2k4cjh0OXM4YzhoOGE4Zjh0LgorLnc0aXI0Cisud2lyNHQxczIKKy53aXJ0NHNjCisud2lydHMyY2gyCisud2lydHNjaGEyZgorLndpcnRzY2hhMmZ0Cisud2k4czlzOGU4bjlzOGM4aDhhOGY4dDlsOGk4YzhoLgorLnc0aTJzMXMKKy53aXNzZW40Cisud2lzc2UybjFzMgorLndpc3NlbnM0YworLndpc3NlbnMyY2gyCisud2lzc2Vuc2NoYTJmCisud2lzc2Vuc2NoYTJmdAorLndpc3NlbnNjaGFmMnRsCisud2lzc2VuczJjaGFmdGw0aTJjaAorLnh2OGk4aThpOHQ4aC4KKy54djRpNWk0CisueHZpNGk1aTQKKy54dmlpMml0aAorLnh2OGk4aTh0OGguCisueHZpMml0aAorLnh4OGk4aThpOHI4ZC4KKy54eDQKKy54eDNpCisueHg0aTVpNAorLnh4aTRpNWk0CisueHhpaTRpcgorLnh4OGk4aThuOGQuCisueHhpNGluZAorLnlpOG44Zzl5OG84bjhnLgorLnkxaQorLnlpbjJneQorLnlpbmd5MW80CisueWluZ3lvMm4KKy5zaDh1OXg4dThlLgorLnNodXgxdTMKKy5qaTlzOHU4YThuLgorLmppMnN1CisuamlzdWEybgorLnplOGE5bDhhOG44ZC4KKy4yemUKKy56ZWE0bAorLnplYTNsNGFuZAorLnplYWxhMm4KKy56ZThpOHQ5czhjOGg4cjhpOGY4dC4KKy56ZWkyCisuemVpNHQxczIKKy56ZWl0NHNjCisuemVpdHMyY2gyCisuemVpdHNjNGhyNAorLnplaXRzY2hyNGkyZnQKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL2Fzc2V0cy93ZWJraXQvaW5jb2duaXRvX21vZGVfc3RhcnRfcGFnZS5odG1sIGIvY29yZS9yZXMvYXNzZXRzL3dlYmtpdC9pbmNvZ25pdG9fbW9kZV9zdGFydF9wYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3MGM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL2Fzc2V0cy93ZWJraXQvaW5jb2duaXRvX21vZGVfc3RhcnRfcGFnZS5odG1sCkBAIC0wLDAgKzEsMjQgQEAKKzxodG1sPgorICA8aGVhZD4KKyAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIvPgorICAgIDx0aXRsZT5OZXcgaW5jb2duaXRvIHdpbmRvdzwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+PHN0cm9uZz5Zb3UndmUgZ29uZSBpbmNvZ25pdG88L3N0cm9uZz4uIFBhZ2VzIHlvdSB2aWV3IGluIHRoaXMgd2luZG93CisgICAgICB3b24ndCBhcHBlYXIgaW4geW91ciBicm93c2VyIGhpc3Rvcnkgb3Igc2VhcmNoIGhpc3RvcnksIGFuZCB0aGV5IHdvbid0CisgICAgICBsZWF2ZSBvdGhlciB0cmFjZXMsIGxpa2UgY29va2llcywgb24geW91ciBjb21wdXRlciBhZnRlciB5b3UgY2xvc2UgdGhlCisgICAgICBpbmNvZ25pdG8gd2luZG93LiBBbnkgZmlsZXMgeW91IGRvd25sb2FkIG9yIGJvb2ttYXJrcyB5b3UgY3JlYXRlIHdpbGwgYmUKKyAgICAgIHByZXNlcnZlZCwgaG93ZXZlci48L3A+CisKKyAgICA8cD48c3Ryb25nPkdvaW5nIGluY29nbml0byBkb2Vzbid0IGFmZmVjdCB0aGUgYmVoYXZpb3Igb2Ygb3RoZXIgcGVvcGxlLAorCXNlcnZlcnMsIG9yIHNvZnR3YXJlLiBCZSB3YXJ5IG9mOjwvc3Ryb25nPjwvcD4KKworICAgIDx1bD4KKyAgICAgIDxsaT5XZWJzaXRlcyB0aGF0IGNvbGxlY3Qgb3Igc2hhcmUgaW5mb3JtYXRpb24gYWJvdXQgeW91PC9saT4KKyAgICAgIDxsaT5JbnRlcm5ldCBzZXJ2aWNlIHByb3ZpZGVycyBvciBlbXBsb3llcnMgdGhhdCB0cmFjayB0aGUgcGFnZXMgeW91IHZpc2l0PC9saT4KKyAgICAgIDxsaT5NYWxpY2lvdXMgc29mdHdhcmUgdGhhdCB0cmFja3MgeW91ciBrZXlzdHJva2VzIGluIGV4Y2hhbmdlIGZvciBmcmVlIHNtaWxleXM8L2xpPgorICAgICAgPGxpPlN1cnZlaWxsYW5jZSBieSBzZWNyZXQgYWdlbnRzPC9saT4KKyAgICAgIDxsaT5QZW9wbGUgc3RhbmRpbmcgYmVoaW5kIHlvdTwvbGk+CisgICAgPC91bD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2FuaW0vYW5pbWF0b3JfZmFkZV9pbi54bWwgYi9jb3JlL3Jlcy9yZXMvYW5pbS9hbmltYXRvcl9mYWRlX2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTI4YjRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vYW5pbWF0b3JfZmFkZV9pbi54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8b2JqZWN0QW5pbWF0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9hY2NlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMCIKKyAgICBhbmRyb2lkOnZhbHVlVG89IjEiCisgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9ImFscGhhIgorICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIgorLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9hbmltL2FuaW1hdG9yX2ZhZGVfb3V0LnhtbCBiL2NvcmUvcmVzL3Jlcy9hbmltL2FuaW1hdG9yX2ZhZGVfb3V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGI2NTkxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vYW5pbWF0b3JfZmFkZV9vdXQueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPG9iamVjdEFuaW1hdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vYWNjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCisgICAgYW5kcm9pZDp2YWx1ZUZyb209IjEuMCIKKyAgICBhbmRyb2lkOnZhbHVlVG89IjAuMCIKKyAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0iYWxwaGEiCisgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiCisvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfY2xvc2VfZW50ZXIueG1sIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfY2xvc2VfZW50ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOWEzYjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9jbG9zZV9lbnRlci54bWwKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxvYmplY3RBbmltYXRvcgorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vZGVjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjEiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJhbHBoYSIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8b2JqZWN0QW5pbWF0b3IKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2RlY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iLTQwMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0idHJhbnNsYXRpb25YIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorPC9zZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfY2xvc2VfZXhpdC54bWwgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9jbG9zZV9leGl0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzQzNTc3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfY2xvc2VfZXhpdC54bWwKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxvYmplY3RBbmltYXRvcgorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vYWNjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIxIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJhbHBoYSIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8b2JqZWN0QW5pbWF0b3IKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2FjY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSI0MDAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJ0cmFuc2xhdGlvblgiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+Cis8L3NldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9uZXh0X2VudGVyLnhtbCBiL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X25leHRfZW50ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZDZlYzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9uZXh0X2VudGVyLnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjEiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJhbHBoYSIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbG9uZ0FuaW1UaW1lIi8+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSI1MCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0idHJhbnNsYXRpb25ZIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiLz4KKzwvc2V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X25leHRfZXhpdC54bWwgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9uZXh0X2V4aXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYjgyZDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9uZXh0X2V4aXQueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxzZXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8b2JqZWN0QW5pbWF0b3IKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjEiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9ImFscGhhIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorICAgIDxvYmplY3RBbmltYXRvcgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSItNTAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJ0cmFuc2xhdGlvblkiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+Cis8L3NldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9vcGVuX2VudGVyLnhtbCBiL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X29wZW5fZW50ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNjA0OTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9vcGVuX2VudGVyLnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjEiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJhbHBoYSIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8b2JqZWN0QW5pbWF0b3IKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjQwMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0idHJhbnNsYXRpb25YIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorPC9zZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfb3Blbl9leGl0LnhtbCBiL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X29wZW5fZXhpdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JmMWFkNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X29wZW5fZXhpdC54bWwKQEAgLTAsMCArMSwzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxvYmplY3RBbmltYXRvcgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0iYWxwaGEiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89Ii00MDAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJ0cmFuc2xhdGlvblgiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+Cis8L3NldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9wcmV2X2VudGVyLnhtbCBiL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X3ByZXZfZW50ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzN2FmZDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9wcmV2X2VudGVyLnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjEiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJhbHBoYSIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbG9uZ0FuaW1UaW1lIi8+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSItNTAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InRyYW5zbGF0aW9uWSIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbG9uZ0FuaW1UaW1lIi8+Cis8L3NldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9wcmV2X2V4aXQueG1sIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfcHJldl9leGl0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDQ1YTRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfcHJldl9leGl0LnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIxIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJhbHBoYSIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8b2JqZWN0QW5pbWF0b3IKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iNTAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJ0cmFuc2xhdGlvblkiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+Cis8L3NldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvYW5pbS9wdXNoX2Rvd25faW5fbm9fYWxwaGEueG1sIGIvY29yZS9yZXMvcmVzL2FuaW0vcHVzaF9kb3duX2luX25vX2FscGhhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDVkNjkxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vcHVzaF9kb3duX2luX25vX2FscGhhLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisJPHRyYW5zbGF0ZSBhbmRyb2lkOmZyb21ZRGVsdGE9Ii0xMDAlcCIgYW5kcm9pZDp0b1lEZWx0YT0iMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX2xvbmdBbmltVGltZSIvPgorPC9zZXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvYW5pbS9wdXNoX2Rvd25fb3V0X25vX2FscGhhLnhtbCBiL2NvcmUvcmVzL3Jlcy9hbmltL3B1c2hfZG93bl9vdXRfbm9fYWxwaGEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMjQ3NGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvYW5pbS9wdXNoX2Rvd25fb3V0X25vX2FscGhhLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisJPHRyYW5zbGF0ZSBhbmRyb2lkOmZyb21ZRGVsdGE9IjAiIGFuZHJvaWQ6dG9ZRGVsdGE9IjEwMCVwIgorICAgICAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbG9uZ0FuaW1UaW1lIi8+Cis8L3NldD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfZGFyay54bWwgYi9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2RhcmsueG1sCmluZGV4IGYwODEyZWQuLjNkZDczZTcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfZGFyay54bWwKKysrIGIvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9kYXJrLnhtbApAQCAtMTksOCArMTksNiBAQAogICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrIi8+CiAgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiLz4KICAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZSIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfYWN0aXZhdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiLz4KICAgICA8aXRlbSBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrIi8+IDwhLS0gbm90IHNlbGVjdGVkIC0tPgotCiA8L3NlbGVjdG9yPgotCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2RhcmtfZm9jdXNlZC54bWwgYi9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2RhcmtfZm9jdXNlZC54bWwKaW5kZXggN2YzOTA2YS4uYzk3YzBiZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9kYXJrX2ZvY3VzZWQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfZGFya19mb2N1c2VkLnhtbApAQCAtMTYsNiArMTYsNyBAQAogCiA8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KICAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9hY3RpdmF0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZSIgLz4KICAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZSIgLz4KICAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZSIgLz4KICAgICA8aXRlbSBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrIiAvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9kYXJrX25vZGlzYWJsZS54bWwgYi9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2Rhcmtfbm9kaXNhYmxlLnhtbAppbmRleCBiZTFiOWY5Li40NDNmN2Y0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2Rhcmtfbm9kaXNhYmxlLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2Rhcmtfbm9kaXNhYmxlLnhtbApAQCAtMTYsNiArMTYsNyBAQAogCiA8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KICAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2FjdGl2YXRlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFya19pbnZlcnNlIi8+CiAgICAgPGl0ZW0gYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFyayIvPiA8IS0tIG5vdCBzZWxlY3RlZCAtLT4KIDwvc2VsZWN0b3I+CiAKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfZGlzYWJsZV9vbmx5X2hvbG9fZGFyay54bWwgYi9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2Rpc2FibGVfb25seV9ob2xvX2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZTQ1ODMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2Rpc2FibGVfb25seV9ob2xvX2RhcmsueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrX2Rpc2FibGVkIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFyayIvPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9kaXNhYmxlX29ubHlfaG9sb19saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2Rpc2FibGVfb25seV9ob2xvX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2E5MmM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9kaXNhYmxlX29ubHlfaG9sb19saWdodC54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0X2Rpc2FibGVkIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHQiLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfZm9jdXNlZF9ob2xvX2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9mb2N1c2VkX2hvbG9fZGFyay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBjNjhhNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfZm9jdXNlZF9ob2xvX2RhcmsueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9hY3RpdmF0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZSIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZSIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZSIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrIiAvPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9ob2xvX2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9ob2xvX2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZWUzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2hvbG9fZGFyay54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmtfZGlzYWJsZWQiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFyayIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFyayIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfc2VsZWN0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmsiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2FjdGl2YXRlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFyayIvPgorICAgIDxpdGVtIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmsiLz4gPCEtLSBub3Qgc2VsZWN0ZWQgLS0+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9ob2xvX2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfaG9sb19saWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThkMzFjZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfaG9sb19saWdodC54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0X2Rpc2FibGVkIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0Ii8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfc2VsZWN0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0Ii8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9hY3RpdmF0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0Ii8+CisgICAgPGl0ZW0gYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHQiLz4gPCEtLSBub3Qgc2VsZWN0ZWQgLS0+CisgICAgCis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfbGlnaHQueG1sCmluZGV4IGUxMTIwMzQuLmExMmM2YjQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfbGlnaHQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfbGlnaHQueG1sCkBAIC0xOSw2ICsxOSw3IEBACiAgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0Ii8+CiAgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodCIvPgogICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfc2VsZWN0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0Ii8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9hY3RpdmF0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0Ii8+CiAgICAgPGl0ZW0gYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHQiLz4gPCEtLSBub3Qgc2VsZWN0ZWQgLS0+CiAgICAgCiA8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9saWdodF9ub2Rpc2FibGUueG1sIGIvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9saWdodF9ub2Rpc2FibGUueG1sCmluZGV4IDJkMzU0NzAuLjA1MWNjY2YgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfbGlnaHRfbm9kaXNhYmxlLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X2xpZ2h0X25vZGlzYWJsZS54bWwKQEAgLTE2LDYgKzE2LDcgQEAKIAogPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CiAgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHQiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2FjdGl2YXRlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHQiLz4KICAgICA8aXRlbSBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodCIvPiA8IS0tIG5vdCBzZWxlY3RlZCAtLT4KIDwvc2VsZWN0b3I+CiAKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfbm9kaXNhYmxlX2hvbG9fZGFyay54bWwgYi9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X25vZGlzYWJsZV9ob2xvX2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NTA4OGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvY29sb3IvcHJpbWFyeV90ZXh0X25vZGlzYWJsZV9ob2xvX2RhcmsueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2FjdGl2YXRlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFya19pbnZlcnNlIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFyayIvPiA8IS0tIG5vdCBzZWxlY3RlZCAtLT4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfbm9kaXNhYmxlX2hvbG9fbGlnaHQueG1sIGIvY29yZS9yZXMvcmVzL2NvbG9yL3ByaW1hcnlfdGV4dF9ub2Rpc2FibGVfaG9sb19saWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxZThjMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9jb2xvci9wcmltYXJ5X3RleHRfbm9kaXNhYmxlX2hvbG9fbGlnaHQueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfYWN0aXZhdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0Ii8+IDwhLS0gbm90IHNlbGVjdGVkIC0tPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2NvbG9yL3NlYXJjaF91cmxfdGV4dF9ob2xvLnhtbCBiL2NvcmUvcmVzL3Jlcy9jb2xvci9zZWFyY2hfdXJsX3RleHRfaG9sby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwOTNiYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9jb2xvci9zZWFyY2hfdXJsX3RleHRfaG9sby54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3Ivc2VhcmNoX3VybF90ZXh0X3ByZXNzZWQiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9zZWFyY2hfdXJsX3RleHRfc2VsZWN0ZWQiLz4KKyAgICA8aXRlbSBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9zZWFyY2hfdXJsX3RleHRfbm9ybWFsIi8+IDwhLS0gbm90IHNlbGVjdGVkIC0tPgorPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9jb2xvci9zZWNvbmRhcnlfdGV4dF9kYXJrLnhtbCBiL2NvcmUvcmVzL3Jlcy9jb2xvci9zZWNvbmRhcnlfdGV4dF9kYXJrLnhtbAppbmRleCBjMTk1ZWYwLi4xYTM4ZmE5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvY29sb3Ivc2Vjb25kYXJ5X3RleHRfZGFyay54bWwKKysrIGIvY29yZS9yZXMvcmVzL2NvbG9yL3NlY29uZGFyeV90ZXh0X2RhcmsueG1sCkBAIC0yMCw2ICsyMCw3IEBACiAgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfZGFya19pbnZlcnNlX2Rpc2FibGVkIi8+CiAgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9kYXJrX2ludmVyc2VfZGlzYWJsZWQiLz4KICAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2FjdGl2YXRlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFya19pbnZlcnNlIi8+CiAgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiLz4KICAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9kYXJrX2Rpc2FibGVkIi8+CiAgICAgPGl0ZW0gYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfZGFyayIvPiA8IS0tIG5vdCBzZWxlY3RlZCAtLT4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9jb2xvci9zZWNvbmRhcnlfdGV4dF9kYXJrX25vZGlzYWJsZS54bWwgYi9jb3JlL3Jlcy9yZXMvY29sb3Ivc2Vjb25kYXJ5X3RleHRfZGFya19ub2Rpc2FibGUueG1sCmluZGV4IDJjODdhMjUuLmNiYzdiMDIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9jb2xvci9zZWNvbmRhcnlfdGV4dF9kYXJrX25vZGlzYWJsZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2NvbG9yL3NlY29uZGFyeV90ZXh0X2Rhcmtfbm9kaXNhYmxlLnhtbApAQCAtMTYsNSArMTYsNiBAQAogCiA8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KICAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2FjdGl2YXRlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFya19pbnZlcnNlIi8+CiAgICAgPGl0ZW0gYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfZGFyayIvPiA8IS0tIG5vdCBzZWxlY3RlZCAtLT4KIDwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvY29sb3Ivc2Vjb25kYXJ5X3RleHRfaG9sb19kYXJrLnhtbCBiL2NvcmUvcmVzL3Jlcy9jb2xvci9zZWNvbmRhcnlfdGV4dF9ob2xvX2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NjE1NmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvY29sb3Ivc2Vjb25kYXJ5X3RleHRfaG9sb19kYXJrLnhtbApAQCAtMCwwICsxLDI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2RpbV9mb3JlZ3JvdW5kX2RhcmtfZGlzYWJsZWQiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfZGFyayIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfc2VsZWN0ZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2RpbV9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZV9kaXNhYmxlZCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfZGFya19pbnZlcnNlX2Rpc2FibGVkIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfZGFya19pbnZlcnNlIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9hY3RpdmF0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZSIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfZGFya19pbnZlcnNlIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfZGFya19kaXNhYmxlZCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2RpbV9mb3JlZ3JvdW5kX2RhcmsiLz4gPCEtLSBub3Qgc2VsZWN0ZWQgLS0+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2NvbG9yL3NlY29uZGFyeV90ZXh0X2hvbG9fbGlnaHQueG1sIGIvY29yZS9yZXMvcmVzL2NvbG9yL3NlY29uZGFyeV90ZXh0X2hvbG9fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OTFhZWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvY29sb3Ivc2Vjb25kYXJ5X3RleHRfaG9sb19saWdodC54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9saWdodF9kaXNhYmxlZCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9saWdodCIvPgorICAgIDwhLS0gU2luY2UgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgKGZvciBib3RoIGxpZ2h0IGFuZCBkYXJrKSwgdGhlIGxpZ2h0J3Mgc2VsZWN0ZWQgc3RhdGUgc2hvdWxkbid0IGJlIGludmVyc2VkIGxpa2UgdGhlIGRhcmsncy4gLS0+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9saWdodF9kaXNhYmxlZCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfc2VsZWN0ZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2RpbV9mb3JlZ3JvdW5kX2xpZ2h0X2Rpc2FibGVkIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9saWdodCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfc2VsZWN0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2RpbV9mb3JlZ3JvdW5kX2xpZ2h0Ii8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9hY3RpdmF0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0Ii8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfbGlnaHRfZGlzYWJsZWQiLz4KKyAgICA8aXRlbSBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9saWdodCIvPiA8IS0tIG5vdCBzZWxlY3RlZCAtLT4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvY29sb3Ivc2Vjb25kYXJ5X3RleHRfbGlnaHQueG1sIGIvY29yZS9yZXMvcmVzL2NvbG9yL3NlY29uZGFyeV90ZXh0X2xpZ2h0LnhtbAppbmRleCA5OTI0OWE1Li4yOTNmNGFhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvY29sb3Ivc2Vjb25kYXJ5X3RleHRfbGlnaHQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9jb2xvci9zZWNvbmRhcnlfdGV4dF9saWdodC54bWwKQEAgLTIyLDYgKzIyLDcgQEAKICAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9saWdodF9kaXNhYmxlZCIvPgogICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfbGlnaHQiLz4KICAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9saWdodCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfYWN0aXZhdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodCIvPgogICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2RpbV9mb3JlZ3JvdW5kX2xpZ2h0X2Rpc2FibGVkIi8+CiAgICAgPGl0ZW0gYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfbGlnaHQiLz4gPCEtLSBub3Qgc2VsZWN0ZWQgLS0+CiA8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2NvbG9yL3NlY29uZGFyeV90ZXh0X2xpZ2h0X25vZGlzYWJsZS54bWwgYi9jb3JlL3Jlcy9yZXMvY29sb3Ivc2Vjb25kYXJ5X3RleHRfbGlnaHRfbm9kaXNhYmxlLnhtbAppbmRleCAyYzg3YTI1Li5jYmM3YjAyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvY29sb3Ivc2Vjb25kYXJ5X3RleHRfbGlnaHRfbm9kaXNhYmxlLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvY29sb3Ivc2Vjb25kYXJ5X3RleHRfbGlnaHRfbm9kaXNhYmxlLnhtbApAQCAtMTYsNSArMTYsNiBAQAogCiA8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KICAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2FjdGl2YXRlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFya19pbnZlcnNlIi8+CiAgICAgPGl0ZW0gYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfZGFyayIvPiA8IS0tIG5vdCBzZWxlY3RlZCAtLT4KIDwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvY29sb3Ivc2Vjb25kYXJ5X3RleHRfbm9kaXNhYmxlX2hvbG9fZGFyay54bWwgYi9jb3JlL3Jlcy9yZXMvY29sb3Ivc2Vjb25kYXJ5X3RleHRfbm9kaXNhYmxlX2hvbG9fZGFyay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyMjI0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9jb2xvci9zZWNvbmRhcnlfdGV4dF9ub2Rpc2FibGVfaG9sb19kYXJrLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvZGltX2ZvcmVncm91bmRfZGFya19pbnZlcnNlIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9hY3RpdmF0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZSIvPgorICAgIDxpdGVtIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2RpbV9mb3JlZ3JvdW5kX2RhcmsiLz4gPCEtLSBub3Qgc2VsZWN0ZWQgLS0+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2NvbG9yL3NlY29uZGFyeV90ZXh0X25vZGlzYWJsZV9ob2xvX2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9jb2xvci9zZWNvbmRhcnlfdGV4dF9ub2Rpc2FibGVfaG9sb19saWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyMjI0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9jb2xvci9zZWNvbmRhcnlfdGV4dF9ub2Rpc2FibGVfaG9sb19saWdodC54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfc2VsZWN0ZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IkBhbmRyb2lkOmNvbG9yL2RpbV9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZSIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfYWN0aXZhdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrX2ludmVyc2UiLz4KKyAgICA8aXRlbSBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9kYXJrIi8+IDwhLS0gbm90IHNlbGVjdGVkIC0tPgorPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9jb2xvci90ZXJ0aWFyeV90ZXh0X2hvbG9fZGFyay54bWwgYi9jb3JlL3Jlcy9yZXMvY29sb3IvdGVydGlhcnlfdGV4dF9ob2xvX2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OWZmNzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvY29sb3IvdGVydGlhcnlfdGV4dF9ob2xvX2RhcmsueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiBhbmRyb2lkOmNvbG9yPSIjODA4MDgwIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6Y29sb3I9IiM4MDgwODAiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6Y29sb3I9IiM4MDgwODAiLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9kaW1fZm9yZWdyb3VuZF9saWdodCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6Y29sb3I9IiM4MDgwODAiLz4gPCEtLSBub3Qgc2VsZWN0ZWQgLS0+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvY29sb3IvdGVydGlhcnlfdGV4dF9ob2xvX2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9jb2xvci90ZXJ0aWFyeV90ZXh0X2hvbG9fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNWMyZDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvY29sb3IvdGVydGlhcnlfdGV4dF9ob2xvX2xpZ2h0LnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpjb2xvcj0iIzgwODA4MCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOmNvbG9yPSIjODA4MDgwIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmNvbG9yPSIjODA4MDgwIi8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIgYW5kcm9pZDpjb2xvcj0iIzgwODA4MCIvPgorICAgIDxpdGVtIGFuZHJvaWQ6Y29sb3I9IiM4MDgwODAiLz4gPCEtLSBub3Qgc2VsZWN0ZWQgLS0+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvY29sb3Ivd2lkZ2V0X2VkaXR0ZXh0X2hvbG9fZGFyay54bWwgYi9jb3JlL3Jlcy9yZXMvY29sb3Ivd2lkZ2V0X2VkaXR0ZXh0X2hvbG9fZGFyay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYzZWI2MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9jb2xvci93aWRnZXRfZWRpdHRleHRfaG9sb19kYXJrLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHQiLz4gPCEtLSB1bmZvY3VzZWQgLS0+CisgICAgPGl0ZW0gYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHQiLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvY29sb3Ivd2lkZ2V0X2VkaXR0ZXh0X2hvbG9fbGlnaHQueG1sIGIvY29yZS9yZXMvcmVzL2NvbG9yL3dpZGdldF9lZGl0dGV4dF9ob2xvX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjk1MGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2NvbG9yL3dpZGdldF9lZGl0dGV4dF9ob2xvX2xpZ2h0LnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpjb2xvcj0iQGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfZGFyayIvPiA8IS0tIHVuZm9jdXNlZCAtLT4KKyAgICA8aXRlbSBhbmRyb2lkOmNvbG9yPSJAYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrIi8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWVuLWhkcGkvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX2RlbGV0ZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtZW4taGRwaS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfZGVsZXRlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2E3NjM3NS4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtZW4taGRwaS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfZGVsZXRlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmYucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZi5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBiYjYyZTZmLi5hYWQ5ZWY3Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmYucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGUucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYjM0NjM4MS4uZWFlZTllMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggODY2MzM2OS4uNmQyYzI5MwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5M2U1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiZTc3NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkzZTU4MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmJlNzc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTQ4YWM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYzk0NmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNjdlNDlkZi4uMWM0NDJlOQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjljYjAxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NDI1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDE3OTFkMWYuLmI4NTJiMmMKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MTk5MjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjYjUxMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbi5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAxNWNkMjVlLi5jZDVjMTgxCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbi5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBlM2ZlMzIzLi5iNGZjNTFhCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGZhNDFiYjcuLmJmMzQ2NDcKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmN2FlZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3NDBhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3YWVlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjc0MGFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25faG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGM0NDE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmODRkNGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25faG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3ByZXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3ByZXNzZWQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggOTA2ZTI4My4uZmE1YzdhMgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fcHJlc3NlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZTVmMTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNmN2VkMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZWI0OTZhOC4uYTZhMjFhZAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzU4YWFiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZGY2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NpcmNsZV9kaXNhYmxlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaXJjbGVfZGlzYWJsZS5wbmcKaW5kZXggMzk2NTJhOC4uZDgyOTcxNiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NpcmNsZV9kaXNhYmxlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2lyY2xlX2Rpc2FibGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaXJjbGVfZGlzYWJsZV9mb2N1c2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaXJjbGVfZGlzYWJsZV9mb2N1c2VkLnBuZwppbmRleCAxYWE3ZmZlLi5jMWI1YjZlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2lyY2xlX2Rpc2FibGVfZm9jdXNlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NpcmNsZV9kaXNhYmxlX2ZvY3VzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaXJjbGVfbm9ybWFsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaXJjbGVfbm9ybWFsLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDYwMTEyMTkuLmJmM2ZiNWEKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NpcmNsZV9ub3JtYWwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaXJjbGVfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2lyY2xlX3ByZXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NpcmNsZV9wcmVzc2VkLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDQ5NDJlNTAuLjUwZTIyZTYKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NpcmNsZV9wcmVzc2VkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2lyY2xlX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaXJjbGVfc2VsZWN0ZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NpcmNsZV9zZWxlY3RlZC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBmZTQ5YTQwLi5jZmM2OGZiCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaXJjbGVfc2VsZWN0ZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaXJjbGVfc2VsZWN0ZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jbG9zZV9ub3JtYWwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Nsb3NlX25vcm1hbC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA0N2YxMWU1Li4zOGI0OWYxCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jbG9zZV9ub3JtYWwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jbG9zZV9ub3JtYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jbG9zZV9wcmVzc2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jbG9zZV9wcmVzc2VkLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDViOTZiNGUuLmFhOWVhNDlmMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2xvc2VfcHJlc3NlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Nsb3NlX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jbG9zZV9zZWxlY3RlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2xvc2Vfc2VsZWN0ZWQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZTI3ZDY4NC4uODcwYzY3MAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2xvc2Vfc2VsZWN0ZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jbG9zZV9zZWxlY3RlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NvZGVfbG9ja19kZWZhdWx0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jb2RlX2xvY2tfZGVmYXVsdC5wbmcKaW5kZXggNDQ2OWNlMC4uZGYzMTM3ZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NvZGVfbG9ja19kZWZhdWx0LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY29kZV9sb2NrX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jb2RlX2xvY2tfdG91Y2hlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY29kZV9sb2NrX3RvdWNoZWQucG5nCmluZGV4IGI5MDUwOGMuLmJmOWU0NmEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jb2RlX2xvY2tfdG91Y2hlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NvZGVfbG9ja190b3VjaGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZWIzODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUzNzhhNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmOGIzZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfZGlzYWJsZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjQ1Mzc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfZGlzYWJsZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9mb2N1c2VkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNThiZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9mb2N1c2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIyNWFhZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfbm9ybWFsLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfbm9ybWFsLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggODAzNjUxYi4uMzI5Y2U2ZQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9ub3JtYWwuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfbm9ybWFsLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X25vcm1hbF9kaXNhYmxlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfbm9ybWFsX2Rpc2FibGUuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBmNGYwMWM3Li5hNTE4YzZiCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X25vcm1hbF9kaXNhYmxlLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X25vcm1hbF9kaXNhYmxlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X25vcm1hbF9kaXNhYmxlX2ZvY3VzZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9ub3JtYWxfZGlzYWJsZV9mb2N1c2VkLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNTM3NmRiMi4uNzFhMDViNwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9ub3JtYWxfZGlzYWJsZV9mb2N1c2VkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X25vcm1hbF9kaXNhYmxlX2ZvY3VzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfbm9ybWFsX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X25vcm1hbF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViMTUzMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X25vcm1hbF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfbm9ybWFsX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9ub3JtYWxfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWI4YTc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfbm9ybWFsX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfcHJlc3NlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X3ByZXNzZWQuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA0MzEyYzI3Li5kOWQwMmJmCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X3ByZXNzZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9wcmVzc2VkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X3ByZXNzZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOGQ4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc3N2ViZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9zZWxlY3RlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X3NlbGVjdGVkLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMDZiNzc5MC4uYWI3YzYxMgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9zZWxlY3RlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9zZWxlY3RlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9zbWFsbF9ub3JtYWwuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9zbWFsbF9ub3JtYWwuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAxMWE5N2QwLi5iYWFmZWQ2Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X3NtYWxsX25vcm1hbC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9zbWFsbF9ub3JtYWwuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfc21hbGxfbm9ybWFsX2Rpc2FibGUuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9zbWFsbF9ub3JtYWxfZGlzYWJsZS45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDhmODZlM2QuLjE3NTE5N2IKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfc21hbGxfbm9ybWFsX2Rpc2FibGUuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfc21hbGxfbm9ybWFsX2Rpc2FibGUuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfc21hbGxfbm9ybWFsX2Rpc2FibGVfZm9jdXNlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X3NtYWxsX25vcm1hbF9kaXNhYmxlX2ZvY3VzZWQuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA3YzgwODJmLi5lYzFmZWZmCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X3NtYWxsX25vcm1hbF9kaXNhYmxlX2ZvY3VzZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfc21hbGxfbm9ybWFsX2Rpc2FibGVfZm9jdXNlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9zbWFsbF9wcmVzc2VkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfc21hbGxfcHJlc3NlZC45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGNmMDNmN2UuLmMxZjlhMGYKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfc21hbGxfcHJlc3NlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGVmYXVsdF9zbWFsbF9wcmVzc2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X3NtYWxsX3NlbGVjdGVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RlZmF1bHRfc21hbGxfc2VsZWN0ZWQuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA0NzdhNjY2Li4wZWEzZjQwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X3NtYWxsX3NlbGVjdGVkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kZWZhdWx0X3NtYWxsX3NlbGVjdGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kaWFsb2dfZGlzYWJsZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGlhbG9nX2Rpc2FibGUucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNGZmNjM0Yi4uMmZjNWQxYQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGlhbG9nX2Rpc2FibGUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kaWFsb2dfZGlzYWJsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RpYWxvZ19ub3JtYWwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RpYWxvZ19ub3JtYWwucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZTBjYzMzOS4uYzRhMTAyNgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGlhbG9nX25vcm1hbC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RpYWxvZ19ub3JtYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kaWFsb2dfcHJlc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGlhbG9nX3ByZXNzZWQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZWQ4ZTAwOC4uODQ2ZjhiZgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGlhbG9nX3ByZXNzZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kaWFsb2dfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RpYWxvZ19zZWxlY3RlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZGlhbG9nX3NlbGVjdGVkLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDliMWExMDAuLjY1OWMyODkKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RpYWxvZ19zZWxlY3RlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2RpYWxvZ19zZWxlY3RlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Ryb3Bkb3duX2Rpc2FibGVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Ryb3Bkb3duX2Rpc2FibGVkLjkucG5nCmluZGV4IDBkMjViNmUuLmM2NTAzYzcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kcm9wZG93bl9kaXNhYmxlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZHJvcGRvd25fZGlzYWJsZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Ryb3Bkb3duX2Rpc2FibGVkX2ZvY3VzZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZHJvcGRvd25fZGlzYWJsZWRfZm9jdXNlZC45LnBuZwppbmRleCBlMjFmZDc1Li4xNTJkZThiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZHJvcGRvd25fZGlzYWJsZWRfZm9jdXNlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZHJvcGRvd25fZGlzYWJsZWRfZm9jdXNlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZHJvcGRvd25fbm9ybWFsLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Ryb3Bkb3duX25vcm1hbC45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGYxMDQwMmYuLjkzOTI0OTUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Ryb3Bkb3duX25vcm1hbC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fZHJvcGRvd25fbm9ybWFsLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kcm9wZG93bl9wcmVzc2VkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Ryb3Bkb3duX3ByZXNzZWQuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAzNjZjNmUwLi5iZWFiYTQ1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kcm9wZG93bl9wcmVzc2VkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kcm9wZG93bl9wcmVzc2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kcm9wZG93bl9zZWxlY3RlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kcm9wZG93bl9zZWxlY3RlZC45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGYwNjNjOGQuLmVjNTFmYzkKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2Ryb3Bkb3duX3NlbGVjdGVkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9kcm9wZG93bl9zZWxlY3RlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fZGlzYWJsZWRfb2ZmX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fZGlzYWJsZWRfb2ZmX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE3NTA1YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19kaXNhYmxlZF9vZmZfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fZGlzYWJsZWRfb2ZmX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX2Rpc2FibGVkX29mZl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmIwMWYwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX2Rpc2FibGVkX29mZl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fZGlzYWJsZWRfb25faG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19kaXNhYmxlZF9vbl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MTdhMmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fZGlzYWJsZWRfb25faG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fZGlzYWJsZWRfb25faG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fZGlzYWJsZWRfb25faG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1OWY0YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19kaXNhYmxlZF9vbl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fZm9jdXNlZF9vZmZfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19mb2N1c2VkX29mZl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMTdjZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fZm9jdXNlZF9vZmZfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fZm9jdXNlZF9vZmZfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fZm9jdXNlZF9vZmZfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiNGJmMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19mb2N1c2VkX29mZl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fZm9jdXNlZF9vbl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX2ZvY3VzZWRfb25faG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWI1MDM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX2ZvY3VzZWRfb25faG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fZm9jdXNlZF9vbl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19mb2N1c2VkX29uX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YjRiZjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fZm9jdXNlZF9vbl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fbm9ybWFsX29mZl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX25vcm1hbF9vZmZfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGYyMjk2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX25vcm1hbF9vZmZfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fbm9ybWFsX29mZl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19ub3JtYWxfb2ZmX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YWZhNGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fbm9ybWFsX29mZl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fbm9ybWFsX29uX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fbm9ybWFsX29uX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZjE2OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19ub3JtYWxfb25faG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fbm9ybWFsX29uX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX25vcm1hbF9vbl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTkwODdiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX25vcm1hbF9vbl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmYucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNDhlZTJiYS4uYzBiMTRhYQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQxOGI3YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmQ1MzhmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDVhNGFkODkuLjMxODk1ODEKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU3NzdmOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDYyMDMzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA3ZDVjNjc2Li5mMzM3NzAzCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODNhODgzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NTI0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb24ucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMjQ3MmMyMC4uYzkwZDJlYgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb24ucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25faG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTExMTFiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNjM5ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25faG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3ByZXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3ByZXNzZWQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggOThkNzRjZS4uZDc5NDUwYjgKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3ByZXNzZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTA3MjE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MWM3YWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGI2YWI0NmMuLmRiNTBjNDMKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkMzljYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmE0MzE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19wcmVzc2VkX29mZl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX3ByZXNzZWRfb2ZmX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAwNDkwZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19wcmVzc2VkX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19wcmVzc2VkX29mZl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19wcmVzc2VkX29mZl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjY5MGM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX3ByZXNzZWRfb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19wcmVzc2VkX29uX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fcHJlc3NlZF9vbl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzM2QyZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fcHJlc3NlZF9vbl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19wcmVzc2VkX29uX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX3ByZXNzZWRfb25faG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3NDQ1YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19wcmVzc2VkX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9zcXVhcmVfb3ZlcmxheV9kaXNhYmxlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3F1YXJlX292ZXJsYXlfZGlzYWJsZWQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZmYwNjY5Ny4uNzFhMDM3ZQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3F1YXJlX292ZXJsYXlfZGlzYWJsZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9zcXVhcmVfb3ZlcmxheV9kaXNhYmxlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3NxdWFyZV9vdmVybGF5X25vcm1hbC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3F1YXJlX292ZXJsYXlfbm9ybWFsLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGMzMTE1NjYuLmJmNWRhMjIKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3NxdWFyZV9vdmVybGF5X25vcm1hbC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3NxdWFyZV9vdmVybGF5X25vcm1hbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3NxdWFyZV9vdmVybGF5X3ByZXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3NxdWFyZV9vdmVybGF5X3ByZXNzZWQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYWM3ZmRlZi4uNTJhMzAyZAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3F1YXJlX292ZXJsYXlfcHJlc3NlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3NxdWFyZV9vdmVybGF5X3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9zcXVhcmVfb3ZlcmxheV9zZWxlY3RlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3F1YXJlX292ZXJsYXlfc2VsZWN0ZWQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZWU1NDE0OS4uZTA2NTY4MgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fc3F1YXJlX292ZXJsYXlfc2VsZWN0ZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9zcXVhcmVfb3ZlcmxheV9zZWxlY3RlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vZmZfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMjhhOGRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vZmZfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vZmZfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vZmZfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRhMDVjMjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vZmZfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vZmZfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRhNjZhOTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vZmZfZGlzYWJsZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb2ZmX2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2FjODQxNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb2ZmX2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vZmZfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9mb2N1c2VkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mYzlkNDkzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vZmZfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vZmZfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vZmZfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMxNWFlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vZmZfaG9sby45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb2ZmX2hvbG8uOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjkwM2JkYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb2ZmX2hvbG8uOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vZmZfbm9ybWFsX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb2ZmX25vcm1hbF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWU5NTkwYzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9ub3JtYWxfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb2ZmX25vcm1hbF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vZmZfbm9ybWFsX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2JjOWRhMmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9ub3JtYWxfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9wcmVzc2VkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb2ZmX3ByZXNzZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE3OTIwNjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDk3MDI1YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb2ZmX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YjkyZDdjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMjQ0ZjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MjE4ZjkxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgxODAyZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9mb2N1c2VkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb25fZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWRlYTk4MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb25fZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mYzIzNzRiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9ob2xvLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9ob2xvLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRjMWQ4OWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX2hvbG8uOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9ub3JtYWxfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9ub3JtYWxfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE4YmI2YmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX25vcm1hbF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9ub3JtYWxfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb25fbm9ybWFsX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGU3OGE5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb25fbm9ybWFsX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9wcmVzc2VkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb25fcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjI2OTMyNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl90b2dnbGVfb25fcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fdG9nZ2xlX29uX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYWQ0Y2NmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3RvZ2dsZV9vbl9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2FiX2RpdmlkZXJfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NhYl9kaXZpZGVyX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTZmNjFmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NhYl9kaXZpZGVyX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2FiX2RpdmlkZXJfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jYWJfZGl2aWRlcl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZjk3YTI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2FiX2RpdmlkZXJfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2FiX2RpdmlkZXJfdmVydGljYWxfZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jYWJfZGl2aWRlcl92ZXJ0aWNhbF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMWYwMzVjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2FiX2RpdmlkZXJfdmVydGljYWxfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2FiX2RpdmlkZXJfdmVydGljYWxfbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2FiX2RpdmlkZXJfdmVydGljYWxfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIxODNiMTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jYWJfZGl2aWRlcl92ZXJ0aWNhbF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2FiX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NhYl9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjYyZDYzYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NhYl9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2FiX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jYWJfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lOGNiZGUxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2FiX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2FiX2ljX2Nsb3NlX2ZvY3VzZWRfaG9sby5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jYWJfaWNfY2xvc2VfZm9jdXNlZF9ob2xvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NjFlMGExCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2FiX2ljX2Nsb3NlX2ZvY3VzZWRfaG9sby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2FiX2ljX2Nsb3NlX25vcm1hbF9ob2xvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NhYl9pY19jbG9zZV9ub3JtYWxfaG9sby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDM2ZjM2MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NhYl9pY19jbG9zZV9ub3JtYWxfaG9sby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2FiX2ljX2Nsb3NlX3ByZXNzZWRfaG9sby5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jYWJfaWNfY2xvc2VfcHJlc3NlZF9ob2xvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZThjMmZmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2FiX2ljX2Nsb3NlX3ByZXNzZWRfaG9sby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfZGlzYWJsZWRfb2ZmX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9kaXNhYmxlZF9vZmZfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGU3NGE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfZGlzYWJsZWRfb2ZmX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfZGlzYWJsZWRfb2ZmX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfZGlzYWJsZWRfb2ZmX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZTIwMWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9kaXNhYmxlZF9vZmZfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfZGlzYWJsZWRfb25faG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X2Rpc2FibGVkX29uX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiNjljNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X2Rpc2FibGVkX29uX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfZGlzYWJsZWRfb25faG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9kaXNhYmxlZF9vbl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmZjNWFhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfZGlzYWJsZWRfb25faG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfZm9jdXNlZF9vZmZfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X2ZvY3VzZWRfb2ZmX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlMDRiNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X2ZvY3VzZWRfb2ZmX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfZm9jdXNlZF9vZmZfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9mb2N1c2VkX29mZl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmYxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfZm9jdXNlZF9vZmZfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfZm9jdXNlZF9vbl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfZm9jdXNlZF9vbl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MDI2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9mb2N1c2VkX29uX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfZm9jdXNlZF9vbl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X2ZvY3VzZWRfb25faG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA5YWEzZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X2ZvY3VzZWRfb25faG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfbm9ybWFsX29mZl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfbm9ybWFsX29mZl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZjFiYzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9ub3JtYWxfb2ZmX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfbm9ybWFsX29mZl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X25vcm1hbF9vZmZfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBhMWVmYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X25vcm1hbF9vZmZfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfbm9ybWFsX29uX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9ub3JtYWxfb25faG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTEwZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfbm9ybWFsX29uX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfbm9ybWFsX29uX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfbm9ybWFsX29uX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YjUzZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9ub3JtYWxfb25faG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfcHJlc3NlZF9vZmZfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X3ByZXNzZWRfb2ZmX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YxNDYyMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X3ByZXNzZWRfb2ZmX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfcHJlc3NlZF9vZmZfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9wcmVzc2VkX29mZl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWJmOTM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfcHJlc3NlZF9vZmZfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfcHJlc3NlZF9vbl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfcHJlc3NlZF9vbl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZGRiMzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jaGVja2JveF9wcmVzc2VkX29uX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY2hlY2tib3hfcHJlc3NlZF9vbl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X3ByZXNzZWRfb25faG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQxNjBlNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NoZWNrYm94X3ByZXNzZWRfb25faG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY29tYm9ib3hfZGlzYWJsZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY29tYm9ib3hfZGlzYWJsZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZWI0NWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jb21ib2JveF9kaXNhYmxlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY29tYm9ib3hfbm9oaWdobGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY29tYm9ib3hfbm9oaWdobGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNjAzMDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9jb21ib2JveF9ub2hpZ2hsaWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2JvdHRvbV9ob2xvLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2JvdHRvbV9ob2xvLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhODRkZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfYm90dG9tX2hvbG8uOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2Z1bGxfaG9sby45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ19mdWxsX2hvbG8uOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyZTRlMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ19mdWxsX2hvbG8uOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX21pZGRsZV9ob2xvLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX21pZGRsZV9ob2xvLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNWU3OWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfbWlkZGxlX2hvbG8uOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX3RvcF9ob2xvLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX3RvcF9ob2xvLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNzVjMTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfdG9wX2hvbG8uOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBiZDFjYzBlLi40MWI3NzZiCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0X29wYXF1ZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHRfb3BhcXVlLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYmQxY2MwZS4uZWI3NWEyMgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0X29wYXF1ZS45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0X29wYXF1ZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrLjkucG5nCmluZGV4IGNiNjI3MjEuLjU1YTVlNTMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGJkMWNjMGUuLjYwZTJjYjIKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGltX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGltX2RhcmsuOS5wbmcKaW5kZXggNjM4NTlmNy4uY2YzNDYxMyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RpbV9kYXJrLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kaW1fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGUxZGViCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNmNiYmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0LjkucG5nCmluZGV4IDk5YTY3YjkuLjQxYjc3NmIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0X29wYXF1ZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0X29wYXF1ZS45LnBuZwppbmRleCA1YzUzN2VlLi5lYjc1YTIyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodF9vcGFxdWUuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHRfb3BhcXVlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfZGFyay45LnBuZwppbmRleCBhNmM5Mjk1Li41NWE1ZTUzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfZGFya19vcGFxdWUuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2Rhcmtfb3BhcXVlLjkucG5nCmluZGV4IDhmMzUzMTUuLjYwZTJjYjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfZGFya19vcGFxdWUuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrX29wYXF1ZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYWNiNzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QyYzgyNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9lZGl0X3F1ZXJ5LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2VkaXRfcXVlcnkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZTY0YjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9lZGl0X3F1ZXJ5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9lZGl0X3F1ZXJ5X2JhY2tncm91bmRfbm9ybWFsLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZWRpdF9xdWVyeV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDgzMTI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZWRpdF9xdWVyeV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9lZGl0X3F1ZXJ5X2JhY2tncm91bmRfcHJlc3NlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2VkaXRfcXVlcnlfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZjM5NzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9lZGl0X3F1ZXJ5X2JhY2tncm91bmRfcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9lZGl0X3F1ZXJ5X2JhY2tncm91bmRfc2VsZWN0ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9lZGl0X3F1ZXJ5X2JhY2tncm91bmRfc2VsZWN0ZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRhOGQxMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2VkaXRfcXVlcnlfYmFja2dyb3VuZF9zZWxlY3RlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9lbW9faW1fZW1iYXJyYXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZW1vX2ltX2VtYmFycmFzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjdkYWY3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZW1vX2ltX2VtYmFycmFzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9leHBhbmRlcl9pY19tYXhpbWl6ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9leHBhbmRlcl9pY19tYXhpbWl6ZWQuOS5wbmcKaW5kZXggMmVjMjdhZi4uMDQ5NDNhYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZXhwYW5kZXJfaWNfbWF4aW1pemVkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2V4cGFuZGVyX2ljX21heGltaXplZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9leHBhbmRlcl9pY19taW5pbWl6ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9leHBhbmRlcl9pY19taW5pbWl6ZWQuOS5wbmcKaW5kZXggMGMxOWJiNy4uN2JkZGJjZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZXhwYW5kZXJfaWNfbWluaW1pemVkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2V4cGFuZGVyX2ljX21pbmltaXplZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19hZ2dyZWdhdGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2FnZ3JlZ2F0ZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2ExNWIxLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2FnZ3JlZ2F0ZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX2JhY2sucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX2JhY2sucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YjMyODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fYmFjay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX2ZpbmRfbmV4dC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fZmluZF9uZXh0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjk2YTZiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX2ZpbmRfbmV4dC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX2ZpbmRfcHJldi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fZmluZF9wcmV2LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTUwYzVhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX2ZpbmRfcHJldi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX25leHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX25leHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYzZlMWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fbmV4dC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX3JvdW5kX21vcmVfZGlzYWJsZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX3JvdW5kX21vcmVfZGlzYWJsZWQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggM2YxMTc2Zi4uMDEyNTk0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fcm91bmRfbW9yZV9kaXNhYmxlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX3JvdW5kX21vcmVfZGlzYWJsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2J0bl9yb3VuZF9tb3JlX25vcm1hbC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fcm91bmRfbW9yZV9ub3JtYWwucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggOGFiZGE0ZC4uMzNkN2Y4OQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19idG5fcm91bmRfbW9yZV9ub3JtYWwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2J0bl9yb3VuZF9tb3JlX25vcm1hbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX25vcm1hbF9ob2xvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2RpYWxvZ19jbG9zZV9ub3JtYWxfaG9sby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVlNWJiOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2RpYWxvZ19jbG9zZV9ub3JtYWxfaG9sby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX3ByZXNzZWRfaG9sby5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfcHJlc3NlZF9ob2xvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTJkYjA2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX3ByZXNzZWRfaG9sby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2ZvY3VzZWRfaG9sby5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfZm9jdXNlZF9ob2xvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjA4NTc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2ZvY3VzZWRfaG9sby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZW1lcmdlbmN5LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2VtZXJnZW5jeS5wbmcKaW5kZXggODljMDVlMy4uYjQ0NjVmZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZW1lcmdlbmN5LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19lbWVyZ2VuY3kucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2lucHV0X2FkZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19pbnB1dF9hZGQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZjljZTU3NC4uZDI2ZWJhYwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19pbnB1dF9hZGQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2lucHV0X2FkZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hY2NvdW50X2xpc3QucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hY2NvdW50X2xpc3QucG5nCmluZGV4IGM2MjI2MWYuLmY4NThkMmMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYWNjb3VudF9saXN0LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2FjY291bnRfbGlzdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hZGQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hZGQucG5nCmluZGV4IDdiMGRmYzUuLjY1Y2MwMWUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYWRkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2FkZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hZ2VuZGEucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hZ2VuZGEucG5nCmluZGV4IDg4NjU5YWUuLjZiYjVjYzggMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYWdlbmRhLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2FnZW5kYS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hbGxmcmllbmRzLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYWxsZnJpZW5kcy5wbmcKaW5kZXggNjFjNWY2Yy4uOGQxMWNhMSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hbGxmcmllbmRzLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2FsbGZyaWVuZHMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYWx3YXlzX2xhbmRzY2FwZV9wb3J0cmFpdC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2Fsd2F5c19sYW5kc2NhcGVfcG9ydHJhaXQucG5nCmluZGV4IDNhY2FlMjcuLjdhZTE3NjAgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYWx3YXlzX2xhbmRzY2FwZV9wb3J0cmFpdC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hbHdheXNfbGFuZHNjYXBlX3BvcnRyYWl0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2FyY2hpdmUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hcmNoaXZlLnBuZwppbmRleCA0OGZiY2M0Li45Y2E1YzYyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2FyY2hpdmUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYXJjaGl2ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hdHRhY2htZW50LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYXR0YWNobWVudC5wbmcKaW5kZXggODc2Mzc3Zi4uOGYxMTE1MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9hdHRhY2htZW50LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2F0dGFjaG1lbnQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYmFjay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2JhY2sucG5nCmluZGV4IDdhYmY4MTkuLmE2Y2Q3MTIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYmFjay5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9iYWNrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2Jsb2NrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYmxvY2sucG5nCmluZGV4IDdlNzE2YzQuLmUxZjljMmMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYmxvY2sucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYmxvY2sucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYmxvY2tlZF91c2VyLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfYmxvY2tlZF91c2VyLnBuZwppbmRleCBiNjc5YmYzLi4zZGQ5YTRhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2Jsb2NrZWRfdXNlci5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9ibG9ja2VkX3VzZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY2FsbC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NhbGwucG5nCmluZGV4IDkzZjk3Y2UuLjJjY2MwODcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY2FsbC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jYWxsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NhbWVyYS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NhbWVyYS5wbmcKaW5kZXggNGUxMGUzZS4uNWEzODUwZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jYW1lcmEucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY2FtZXJhLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NjLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY2MucG5nCmluZGV4IDYyNTEwZDIuLjQ3OTA1YTUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY2MucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY2MucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY2hhdF9kYXNoYm9hcmQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jaGF0X2Rhc2hib2FyZC5wbmcKaW5kZXggZGMyMmU2YS4uZGRlNjc0MSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jaGF0X2Rhc2hib2FyZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jaGF0X2Rhc2hib2FyZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jbGVhcl9wbGF5bGlzdC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NsZWFyX3BsYXlsaXN0LnBuZwppbmRleCA0NWNlN2U4Li5lNmJlNDhiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NsZWFyX3BsYXlsaXN0LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NsZWFyX3BsYXlsaXN0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2Nsb3NlX2NsZWFyX2NhbmNlbC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2Nsb3NlX2NsZWFyX2NhbmNlbC5wbmcKaW5kZXggNDY4M2Y2MS4uYTU0ZWE5ZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jbG9zZV9jbGVhcl9jYW5jZWwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY2xvc2VfY2xlYXJfY2FuY2VsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NvbXBhc3MucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jb21wYXNzLnBuZwppbmRleCA3NTZiZDIyLi4xMDQyNzBmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NvbXBhc3MucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY29tcGFzcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jb21wb3NlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY29tcG9zZS5wbmcKaW5kZXggYmMxNTNmYS4uNmFkMzc5ZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jb21wb3NlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NvbXBvc2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY29weS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NvcHkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMTExNTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2NvcHkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY3JvcC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2Nyb3AucG5nCmluZGV4IDgyOTcwYjguLjBkNGM5ZmUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY3JvcC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9jcm9wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2N1dC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2N1dC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkMzc5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfY3V0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2RheS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2RheS5wbmcKaW5kZXggMzk2MTJlOC4uODQ0MjlhYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9kYXkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2RlbGV0ZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2RlbGV0ZS5wbmcKaW5kZXggY2U1ZWNjNC4uMmFlZDI2YSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9kZWxldGUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZGVsZXRlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2RpcmVjdGlvbnMucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9kaXJlY3Rpb25zLnBuZwppbmRleCA0MjQyM2IzLi4yM2Y2ZWIzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2RpcmVjdGlvbnMucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZGlyZWN0aW9ucy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9lZGl0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZWRpdC5wbmcKaW5kZXggNDc0OGNkYS4uNjAyZGQxMCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9lZGl0LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2VkaXQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZW1vdGljb25zLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZW1vdGljb25zLnBuZwppbmRleCBjYjUyMGFlLi4yZmFiNTE1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2Vtb3RpY29ucy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9lbW90aWNvbnMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZW5kX2NvbnZlcnNhdGlvbi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2VuZF9jb252ZXJzYXRpb24ucG5nCmluZGV4IGU3MWJiMzYuLmMwNWEyMDcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZW5kX2NvbnZlcnNhdGlvbi5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9lbmRfY29udmVyc2F0aW9uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2ZpbmQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9maW5kLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2FjNjk0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9maW5kLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2ZvcndhcmQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9mb3J3YXJkLnBuZwppbmRleCA2YjE4MDRmLi42MDZlNmFhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2ZvcndhcmQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZm9yd2FyZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9mcmllbmRzbGlzdC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2ZyaWVuZHNsaXN0LnBuZwppbmRleCBhYjljNTUyLi5hOTBlNTczIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2ZyaWVuZHNsaXN0LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2ZyaWVuZHNsaXN0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2dhbGxlcnkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9nYWxsZXJ5LnBuZwppbmRleCBiYTA3OTQxLi43YzUyOGZhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2dhbGxlcnkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZ2FsbGVyeS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9nb3RvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZ290by5wbmcKaW5kZXggNDllNjhjZS4uYTFhY2VjYiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9nb3RvLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2dvdG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfaGVscC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2hlbHAucG5nCmluZGV4IGE1YjRhMmYuLjQzMDBlODYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfaGVscC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9oZWxwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2hvbWUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9ob21lLnBuZwppbmRleCA5NDlmZDA0Li4zNWNiNTJhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2hvbWUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfaG9tZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9pbmZvX2RldGFpbHMucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9pbmZvX2RldGFpbHMucG5nCmluZGV4IDZiM2Y3ZmQuLjc2OTZjZWIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfaW5mb19kZXRhaWxzLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2luZm9fZGV0YWlscy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9pbnZpdGUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9pbnZpdGUucG5nCmluZGV4IGY1Nzg1MjMuLjNjYjEyOWYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfaW52aXRlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2ludml0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9sb2dpbi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2xvZ2luLnBuZwppbmRleCAyOWUyZGI2Li5kMjNlYmYwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2xvZ2luLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2xvZ2luLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X21hbmFnZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X21hbmFnZS5wbmcKaW5kZXggYzA4ZTY0Zi4uYzdjNGNiY2UgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbWFuYWdlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X21hbmFnZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9tYXBtb2RlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbWFwbW9kZS5wbmcKaW5kZXggODBjMmFhOS4uYzg5NWNjYiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9tYXBtb2RlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X21hcG1vZGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbWFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X21hcmsucG5nCmluZGV4IGU2MTI2ZmIuLjcyNGQ3ODcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbWFyay5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9tYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X21vbnRoLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbW9udGgucG5nCmluZGV4IDNiZjM3MzguLjNlNTVhZTYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbW9udGgucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbW9udGgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbW9yZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X21vcmUucG5nCmluZGV4IDA1MmY4ZjIuLmNjZWNjMWQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbW9yZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9tb3JlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X215X2NhbGVuZGFyLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbXlfY2FsZW5kYXIucG5nCmluZGV4IGFmZDY5NmQuLjNkNmVhMWYzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X215X2NhbGVuZGFyLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X215X2NhbGVuZGFyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X215bG9jYXRpb24ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9teWxvY2F0aW9uLnBuZwppbmRleCAzNzlmMTVjLi4xYmNiMGNkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X215bG9jYXRpb24ucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbXlsb2NhdGlvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9teXBsYWNlcy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X215cGxhY2VzLnBuZwppbmRleCA2Y2I3YzhiLi41ZjcyNmQ4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X215cGxhY2VzLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X215cGxhY2VzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X25vdGlmaWNhdGlvbnMucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9ub3RpZmljYXRpb25zLnBuZwppbmRleCAxYjFjNWVkLi5mYjYzOTM3IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X25vdGlmaWNhdGlvbnMucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfbm90aWZpY2F0aW9ucy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9wYXN0ZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3Bhc3RlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTM4NTBmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9wYXN0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9wbGF5X2NsaXAucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9wbGF5X2NsaXAucG5nCmluZGV4IDQzOTg5MGMuLmRkZGUwM2EgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcGxheV9jbGlwLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3BsYXlfY2xpcC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9wcmVmZXJlbmNlcy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3ByZWZlcmVuY2VzLnBuZwppbmRleCAwMzljNzIxLi44MWJjYTRhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3ByZWZlcmVuY2VzLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3ByZWZlcmVuY2VzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3JlY2VudF9oaXN0b3J5LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcmVjZW50X2hpc3RvcnkucG5nCmluZGV4IGJiZDVkZTMuLjBkZDE2MjcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcmVjZW50X2hpc3RvcnkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcmVjZW50X2hpc3RvcnkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcmVmcmVzaC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3JlZnJlc2gucG5nCmluZGV4IGJiYjA4ZjEuLjUzY2FjY2EgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcmVmcmVzaC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9yZWZyZXNoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3JlcG9ydF9pbWFnZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3JlcG9ydF9pbWFnZS5wbmcKaW5kZXggNGRiMjE4Ny4uYjZhYTVkNiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9yZXBvcnRfaW1hZ2UucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcmVwb3J0X2ltYWdlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3JldmVydC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3JldmVydC5wbmcKaW5kZXggZmZjNjdkOS4uMTE4NjBhNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9yZXZlcnQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcmV2ZXJ0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3JvdGF0ZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3JvdGF0ZS5wbmcKaW5kZXggODM1ZTM5My4uODUxMTVhZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9yb3RhdGUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfcm90YXRlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NhdmUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zYXZlLnBuZwppbmRleCA2MmQwYjlhLi5mYzI2YzVkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NhdmUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2F2ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zZWFyY2gucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zZWFyY2gucG5nCmluZGV4IDkxNTRkNmUuLmY3ODIzNGUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2VhcmNoLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NlYXJjaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zZWxlY3RfYWxsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2VsZWN0X2FsbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRlNjc0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2VsZWN0X2FsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zZW5kLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2VuZC5wbmcKaW5kZXggOTU5NzczMS4uMjU2N2I1OCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zZW5kLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NlbmQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2V0X2FzLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2V0X2FzLnBuZwppbmRleCA4M2E4N2I5Li43ZTc5YzE1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NldF9hcy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zZXRfYXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2hhcmUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zaGFyZS5wbmcKaW5kZXggYjQ5ZDlhZDcuLmI0MWIzNDggMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2hhcmUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2hhcmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2xpZGVzaG93LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2xpZGVzaG93LnBuZwppbmRleCA2MjA4NTg1Li45MjVmNGViMSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zbGlkZXNob3cucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2xpZGVzaG93LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NvcnRfYWxwaGFiZXRpY2FsbHkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zb3J0X2FscGhhYmV0aWNhbGx5LnBuZwppbmRleCA5NGVlM2JlLi41ZDY4OTk4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NvcnRfYWxwaGFiZXRpY2FsbHkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc29ydF9hbHBoYWJldGljYWxseS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zb3J0X2J5X3NpemUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zb3J0X2J5X3NpemUucG5nCmluZGV4IGI0M2JjNTcuLmM5Mzg4ZmQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc29ydF9ieV9zaXplLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NvcnRfYnlfc2l6ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zdGFyLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc3Rhci5wbmcKaW5kZXggMzBmNjMxNC4uMjFhMmM0YiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zdGFyLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3N0YXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc3RhcnRfY29udmVyc2F0aW9uLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc3RhcnRfY29udmVyc2F0aW9uLnBuZwppbmRleCAwZGZjMDI0Li5kNjNkM2E3IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3N0YXJ0X2NvbnZlcnNhdGlvbi5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zdGFydF9jb252ZXJzYXRpb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc3RvcC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3N0b3AucG5nCmluZGV4IDMxMGI2Y2EuLjdjOTllZDQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc3RvcC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zdG9wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3RvZGF5LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfdG9kYXkucG5nCmluZGV4IDY1M2Y3MGNkLi40YTkzNTJkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3RvZGF5LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3RvZGF5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3VwbG9hZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3VwbG9hZC5wbmcKaW5kZXggNzQ1NGJhMy4uZDg0NTExMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV91cGxvYWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfdXBsb2FkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3VwbG9hZF95b3VfdHViZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3VwbG9hZF95b3VfdHViZS5wbmcKaW5kZXggNDQ4ZjZjNC4uZGY1ZmE3ZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV91cGxvYWRfeW91X3R1YmUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfdXBsb2FkX3lvdV90dWJlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3ZpZXcucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV92aWV3LnBuZwppbmRleCA1YjlmMmI5Li43NTE1NWQ0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3ZpZXcucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfdmlldy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV93ZWVrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfd2Vlay5wbmcKaW5kZXggYzE4NGYyZS4uYzIxNmVjYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV93ZWVrLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3dlZWsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfem9vbS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3pvb20ucG5nCmluZGV4IGMxZDE4ZDUuLjlmYTRkN2UgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfem9vbS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV96b29tLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19zZWFyY2hfY2F0ZWdvcnlfZGVmYXVsdC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19zZWFyY2hfY2F0ZWdvcnlfZGVmYXVsdC5wbmcKaW5kZXggZDM2OGM1NC4uZjc4MjM0ZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfc2VhcmNoX2NhdGVnb3J5X2RlZmF1bHQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3NlYXJjaF9jYXRlZ29yeV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX2RyYWdfZGlyZWN0aW9uX2dyZWVuX3VwLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfZHJhZ19kaXJlY3Rpb25fZ3JlZW5fdXAucG5nCmluZGV4IDZmODVmMzguLjY1NjA2OTYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfZHJhZ19kaXJlY3Rpb25fZ3JlZW5fdXAucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfZHJhZ19kaXJlY3Rpb25fZ3JlZW5fdXAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfZHJhZ19kaXJlY3Rpb25fcmVkX3VwLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfZHJhZ19kaXJlY3Rpb25fcmVkX3VwLnBuZwppbmRleCBiZWMwN2YxLi42OThjM2VjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX2RyYWdfZGlyZWN0aW9uX3JlZF91cC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19kcmFnX2RpcmVjdGlvbl9yZWRfdXAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9kZWZhdWx0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9kZWZhdWx0LnBuZwppbmRleCA0NjdhMDEzLi4wMTAyYTYxIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfZGVmYXVsdC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9ncmVlbi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfZ3JlZW4ucG5nCmluZGV4IGMyMWIyNGUuLjgyYWQ4ZjcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9ncmVlbi5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX2dyZWVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfcmVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9yZWQucG5nCmluZGV4IDg3MDA3YTMuLmY5ZDBkMzMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9yZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9yZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfbGVmdF9jb25maXJtX2dyYXkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1fZ3JheS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA5NTk5ZmI1Li4zNDk5MjA4Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfbGVmdF9jb25maXJtX2dyYXkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfbGVmdF9jb25maXJtX2dyYXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfbGVmdF9jb25maXJtX2dyZWVuLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfbGVmdF9jb25maXJtX2dyZWVuLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZDlhYjMuLjkxZWFlYzgKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1fZ3JlZW4ucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfbGVmdF9jb25maXJtX2dyZWVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX2xlZnRfY29uZmlybV9yZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1fcmVkLnBuZwppbmRleCA2YzBkYzBhLi44ODE4YjllIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX2xlZnRfY29uZmlybV9yZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfbGVmdF9jb25maXJtX3JlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1feWVsbG93LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfbGVmdF9jb25maXJtX3llbGxvdy5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAzZjlmYjhmLi5lNWJjNWY2Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfbGVmdF9jb25maXJtX3llbGxvdy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1feWVsbG93LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX2xlZnRfbm9ybWFsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfbGVmdF9ub3JtYWwucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggOGI4OTUzOC4uNTMyNmM3YwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX2xlZnRfbm9ybWFsLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX2xlZnRfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX2xlZnRfcHJlc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX2xlZnRfcHJlc3NlZC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBlYzk4NzkwLi43YjkwNmRmCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfbGVmdF9wcmVzc2VkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX2xlZnRfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9yaWdodF9jb25maXJtX2dyYXkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9yaWdodF9jb25maXJtX2dyYXkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMjg2MWU4ZC4uZWE4YzMxNQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX3JpZ2h0X2NvbmZpcm1fZ3JheS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9yaWdodF9jb25maXJtX2dyYXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV9ncmVlbi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX3JpZ2h0X2NvbmZpcm1fZ3JlZW4ucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZTk3NGJiYy4uYWEwY2ViOQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX3JpZ2h0X2NvbmZpcm1fZ3JlZW4ucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV9ncmVlbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9yaWdodF9jb25maXJtX3JlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX3JpZ2h0X2NvbmZpcm1fcmVkLnBuZwppbmRleCA5NjQ3ZmE2Li5kNzcyZmI2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX3JpZ2h0X2NvbmZpcm1fcmVkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX3JpZ2h0X2NvbmZpcm1fcmVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX3JpZ2h0X2NvbmZpcm1feWVsbG93LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV95ZWxsb3cucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYWQ4NzhlMS4uM2NmZWI2NwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX3JpZ2h0X2NvbmZpcm1feWVsbG93LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX3JpZ2h0X2NvbmZpcm1feWVsbG93LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX3JpZ2h0X25vcm1hbC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX3JpZ2h0X25vcm1hbC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAwMWJiYTBiLi5kYTc3MjZiCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfcmlnaHRfbm9ybWFsLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9qb2dfdGFiX3JpZ2h0X25vcm1hbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9yaWdodF9wcmVzc2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfcmlnaHRfcHJlc3NlZC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA2NDdlODAyLi40NTBhMzI1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2pvZ190YWJfcmlnaHRfcHJlc3NlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvam9nX3RhYl9yaWdodF9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YzYyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdF9saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0X2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZTY5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdF9saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA5ZTFjNDJhLi5hYjM3N2Q4Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZGM5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NTYzYzgwLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1cy45LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBiYjQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBiYjQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX3NlbGVjdGVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfc2VsZWN0ZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUyN2RhMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX3NlbGVjdGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3MuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNzJkM2EwOC4uYmQ3NDQyNgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3MuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzc19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3NfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyYmEyZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3NfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDc1NjhiMzAuLmQxOGQ2ZjcKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWRfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDc4NmU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZjUwYjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZWE4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbWVudV9iYWNrZ3JvdW5kLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbWVudV9iYWNrZ3JvdW5kLjkucG5nCmluZGV4IDFiNDM0MzUuLjYwZjA3MzEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL21lbnVfYmFja2dyb3VuZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9tZW51X2JhY2tncm91bmQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbWVudV9iYWNrZ3JvdW5kX2ZpbGxfcGFyZW50X3dpZHRoLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbWVudV9iYWNrZ3JvdW5kX2ZpbGxfcGFyZW50X3dpZHRoLjkucG5nCmluZGV4IGVjOTc0ZDYuLjA5ZWFjOWIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL21lbnVfYmFja2dyb3VuZF9maWxsX3BhcmVudF93aWR0aC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9tZW51X2JhY2tncm91bmRfZmlsbF9wYXJlbnRfd2lkdGguOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbWVudV9zdWJtZW51X2JhY2tncm91bmQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9tZW51X3N1Ym1lbnVfYmFja2dyb3VuZC45LnBuZwppbmRleCBjNzA1NmUwLi5jYmQ0NDAwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9tZW51X3N1Ym1lbnVfYmFja2dyb3VuZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9tZW51X3N1Ym1lbnVfYmFja2dyb3VuZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9uYXZfZGl2aWRlci5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9uYXZfZGl2aWRlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhM2U2MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL25hdl9kaXZpZGVyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9vdmVyc2Nyb2xsX2VkZ2UucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvb3ZlcnNjcm9sbF9lZGdlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThjMWFhMy4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9vdmVyc2Nyb2xsX2VkZ2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvb3ZlcnNjcm9sbF9nbG93LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL292ZXJzY3JvbGxfZ2xvdy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MTgzODQuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvb3ZlcnNjcm9sbF9nbG93LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BpY3R1cmVfZW1lcmdlbmN5LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BpY3R1cmVfZW1lcmdlbmN5LnBuZwppbmRleCA2NDk3MmMyLi5iMGYxMGY5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9waWN0dXJlX2VtZXJnZW5jeS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcGljdHVyZV9lbWVyZ2VuY3kucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX2JvdHRvbV9icmlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9ib3R0b21fYnJpZ2h0LjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZjQxMjVhOC4uY2NhNDdkMwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9ib3R0b21fYnJpZ2h0LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX2JvdHRvbV9icmlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfYm90dG9tX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9ib3R0b21fZGFyay45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDczNDk4MWEuLjYyYTBiZDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfYm90dG9tX2RhcmsuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfYm90dG9tX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfYm90dG9tX21lZGl1bS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX2JvdHRvbV9tZWRpdW0uOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAyNmVkZTQ0Li42ZWJiNGY3Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX2JvdHRvbV9tZWRpdW0uOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfYm90dG9tX21lZGl1bS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9jZW50ZXJfYnJpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfY2VudGVyX2JyaWdodC45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDEwMmM4NGIuLjc1NmU5ZWQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfY2VudGVyX2JyaWdodC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9jZW50ZXJfYnJpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX2NlbnRlcl9kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfY2VudGVyX2RhcmsuOS5wbmcKaW5kZXggYWMxZjkyZC4uNzdiNDUyNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfY2VudGVyX2RhcmsuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfY2VudGVyX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfY2VudGVyX21lZGl1bS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX2NlbnRlcl9tZWRpdW0uOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAxY2UyYTZkLi5kZTRiZTJhCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX2NlbnRlcl9tZWRpdW0uOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfY2VudGVyX21lZGl1bS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9mdWxsX2JyaWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX2Z1bGxfYnJpZ2h0LjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZDk4YWIwYy4uNmMzMGJlYwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9mdWxsX2JyaWdodC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9mdWxsX2JyaWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9mdWxsX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9mdWxsX2RhcmsuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA1MDJhZGFmLi5mYzhjMDBlCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX2Z1bGxfZGFyay45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF9mdWxsX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfdG9wX2JyaWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX3RvcF9icmlnaHQuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBlNTJhNjAzLi5kZGQzMGFiCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX3RvcF9icmlnaHQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9wdXBfdG9wX2JyaWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF90b3BfZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvcHVwX3RvcF9kYXJrLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggM2Y3ZDYxZS4uMTQ0ZDBmYwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF90b3BfZGFyay45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb3B1cF90b3BfZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2NvbnRhY3Rfbm9iYWRnZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3F1aWNrY29udGFjdF9ub2JhZGdlLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZDQzYzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9xdWlja2NvbnRhY3Rfbm9iYWRnZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zY3JvbGxiYXJfaGFuZGxlX2FjY2VsZXJhdGVkX2FuaW0yLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc2Nyb2xsYmFyX2hhbmRsZV9hY2NlbGVyYXRlZF9hbmltMi45LnBuZwppbmRleCAwYTI4MjIzLi5jOTE2NzgwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zY3JvbGxiYXJfaGFuZGxlX2FjY2VsZXJhdGVkX2FuaW0yLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3Njcm9sbGJhcl9oYW5kbGVfYWNjZWxlcmF0ZWRfYW5pbTIuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3Bpbm5lcl9ibGFja18xNi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zcGlubmVyX2JsYWNrXzE2LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDQyZWI3MzRmLi5lYjM0ODY3Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfMTYucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfMTYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfMjAucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3Bpbm5lcl9ibGFja18yMC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBjODhmYmM5Li5kYWMwNmQ3Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfMjAucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfMjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfNDgucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3Bpbm5lcl9ibGFja180OC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA3ZjljNGYzLi4zMzdmNzJhCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfNDgucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfNDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfNzYucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3Bpbm5lcl9ibGFja183Ni5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBjMWMxNzdlLi4yZWRjM2U3Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfNzYucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfYmxhY2tfNzYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfd2hpdGVfMTYucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3Bpbm5lcl93aGl0ZV8xNi5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA0ZTAzN2FlLi43OTE0YTY4Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfd2hpdGVfMTYucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfd2hpdGVfMTYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfd2hpdGVfNDgucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3Bpbm5lcl93aGl0ZV80OC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBkODUxOWYyLi5mYWVlOGNhCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfd2hpdGVfNDgucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfd2hpdGVfNDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfd2hpdGVfNzYucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3Bpbm5lcl93aGl0ZV83Ni5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA2ZDZhYTk0Li5jZDI2Mzc5Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfd2hpdGVfNzYucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3NwaW5uZXJfd2hpdGVfNzYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X2NhbGxfbXV0ZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9jYWxsX211dGUucG5nCmluZGV4IDBjZjVlZjUuLmI4NmQyY2EgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X2NhbGxfbXV0ZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfY2FsbF9tdXRlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9jYXJfbW9kZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9jYXJfbW9kZS5wbmcKaW5kZXggZTcwMGQ3OS4uMDM0OTlhNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfY2FyX21vZGUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X2Nhcl9tb2RlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9jaGF0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X2NoYXQucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggNzFlYThkZS4uMDk3YTk3OQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9jaGF0LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9jaGF0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9kaXNrX2Z1bGwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfZGlza19mdWxsLnBuZwppbmRleCA2NmU3MzgwLi42Y2VlZGE4IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9kaXNrX2Z1bGwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X2Rpc2tfZnVsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfZW1haWxfZ2VuZXJpYy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9lbWFpbF9nZW5lcmljLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM1ZmNhYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9lbWFpbF9nZW5lcmljLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X2Vycm9yLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X2Vycm9yLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGIzYTE4YjMuLjM3Yzg4NTMKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfZXJyb3IucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X2Vycm9yLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9nbWFpbC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9nbWFpbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOGJlYWUuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfZ21haWwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfbWlzc2VkX2NhbGwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfbWlzc2VkX2NhbGwucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggM2MxOWM5My4uMTkyNTc0ZAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9taXNzZWRfY2FsbC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfbWlzc2VkX2NhbGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X21vcmUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfbW9yZS5wbmcKaW5kZXggZjU0YjNkNC4uMWM3ZjlkYiAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfbW9yZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfbW9yZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfc2RjYXJkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3NkY2FyZC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBkZDk0N2E1Li5kM2I2MjRiCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3NkY2FyZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfc2RjYXJkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9zZGNhcmRfcHJlcGFyZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9zZGNhcmRfcHJlcGFyZS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA0YjliOWNhLi5hNDgzYmEyCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3NkY2FyZF9wcmVwYXJlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9zZGNhcmRfcHJlcGFyZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfc2RjYXJkX3VzYi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9zZGNhcmRfdXNiLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGZiMmIyNmEuLmE1ZTM2OWUyCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3NkY2FyZF91c2IucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3NkY2FyZF91c2IucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3NpbV90b29sa2l0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3NpbV90b29sa2l0LnBuZwppbmRleCA4ODY1YmRhLi4zYjE0YzI2IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9zaW1fdG9vbGtpdC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfc2ltX3Rvb2xraXQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3N5bmMucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfc3luYy5wbmcKaW5kZXggMDA0Y2ZhYi4uNmY5Y2Y4NCAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfc3luYy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfc3luYy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfc3luY19hbmltMC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9zeW5jX2FuaW0wLnBuZwppbmRleCA2OTczZmM1Li42ZjljZjg0IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9zeW5jX2FuaW0wLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9zeW5jX2FuaW0wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9zeW5jX2Vycm9yLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3N5bmNfZXJyb3IucG5nCmluZGV4IDI2YjI0NDYuLjZlM2I1NDUgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3N5bmNfZXJyb3IucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3N5bmNfZXJyb3IucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3ZvaWNlbWFpbC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV92b2ljZW1haWwucG5nCmluZGV4IDViNzc4NDYuLjcwYjI0MTEgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3ZvaWNlbWFpbC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfdm9pY2VtYWlsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV93aWZpX2luX3JhbmdlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X3dpZmlfaW5fcmFuZ2UucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMDQ1ODEyNC4uZTk0MDVkZAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV93aWZpX2luX3JhbmdlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV93aWZpX2luX3JhbmdlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19hZGIucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYWRiLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGZkZjZjNmMuLmFlZjg2NTAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYWRiLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19hZGIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfMTAucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV8xMC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA0NDg2NTUzLi5jODE2MTZiCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfMTAucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfMTAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfMTAwLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfMTAwLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfMjAucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV8yMC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBjOGY5YzkyLi5lYjVlZjA5Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfMjAucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfMjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfNDAucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV80MC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19iYXR0ZXJ5XzYwLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfNjAucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV84MC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19iYXR0ZXJ5XzgwLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfY2hhcmdlX2FuaW0wLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfY2hhcmdlX2FuaW0wLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGM3NDY0ZjcuLjlhNmM2ODMKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV9jaGFyZ2VfYW5pbTAucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfY2hhcmdlX2FuaW0wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19iYXR0ZXJ5X2NoYXJnZV9hbmltMS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19iYXR0ZXJ5X2NoYXJnZV9hbmltMS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA5OTdmZWIzLi5jNDBjNjIyCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfY2hhcmdlX2FuaW0xLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19iYXR0ZXJ5X2NoYXJnZV9hbmltMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV9jaGFyZ2VfYW5pbTIucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV9jaGFyZ2VfYW5pbTIucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV9jaGFyZ2VfYW5pbTMucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV9jaGFyZ2VfYW5pbTMucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV9jaGFyZ2VfYW5pbTQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV9jaGFyZ2VfYW5pbTQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV9jaGFyZ2VfYW5pbTUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV9jaGFyZ2VfYW5pbTUucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV91bmtub3duLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfdW5rbm93bi5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBkYWRmZThkLi4xYTlhYmFmCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2JhdHRlcnlfdW5rbm93bi5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfYmF0dGVyeV91bmtub3duLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2JsdWV0b290aC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2JsdWV0b290aC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBlOGZiYzllLi43YThiNzhmCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfYmx1ZXRvb3RoLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2JsdWV0b290aC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV91c2IucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV91c2IucG5nCmluZGV4IGU5MTZmYmIuLjRjMTRjMDcgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfdXNiLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX3VzYi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZG93bmxvYWRfYW5pbTAucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZG93bmxvYWRfYW5pbTAucG5nCmluZGV4IGMxMjdlNmUuLmQ5YzllNGMgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2Rvd25sb2FkX2FuaW0wLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kb3dubG9hZF9hbmltMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZ3BzX29uLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2dwc19vbi5wbmcKaW5kZXggZjkwMWFlOC4uOTlhOGM2YyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZ3BzX29uLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19ncHNfb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Bob25lX2NhbGwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcGhvbmVfY2FsbC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA5YjVmMDc1Li45NTA3MTNiCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Bob25lX2NhbGwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Bob25lX2NhbGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Bob25lX2NhbGxfZm9yd2FyZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19waG9uZV9jYWxsX2ZvcndhcmQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMDMyZjhmMS4uMDdhMmU5ZAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19waG9uZV9jYWxsX2ZvcndhcmQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Bob25lX2NhbGxfZm9yd2FyZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcGhvbmVfY2FsbF9vbl9ob2xkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Bob25lX2NhbGxfb25faG9sZC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA1YjBhNjhkLi4wMzNhNTU4Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Bob25lX2NhbGxfb25faG9sZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcGhvbmVfY2FsbF9vbl9ob2xkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8zX2NkbWEucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfM19jZG1hLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDFkMmY5NjYuLjBhMzJkMmUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfM19jZG1hLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8zX2NkbWEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3JhX3NpZ25hbF8wX2NkbWEucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcmFfc2lnbmFsXzBfY2RtYS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA5MDEwNThhLi4zMzMzOTMzCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3JhX3NpZ25hbF8wX2NkbWEucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3JhX3NpZ25hbF8wX2NkbWEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3JhX3NpZ25hbF8xX2NkbWEucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcmFfc2lnbmFsXzFfY2RtYS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBmNWM1Zjk4Li42ZDY5ZWQ2Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3JhX3NpZ25hbF8xX2NkbWEucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3JhX3NpZ25hbF8xX2NkbWEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3JhX3NpZ25hbF8yX2NkbWEucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcmFfc2lnbmFsXzJfY2RtYS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA4MjEwMmIyLi5hNzg5NTdkCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3JhX3NpZ25hbF8yX2NkbWEucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3JhX3NpZ25hbF8yX2NkbWEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3JhX3NpZ25hbF80X2NkbWEucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcmFfc2lnbmFsXzRfY2RtYS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBjMDhjYzg2Li40NGMxZGNhCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3JhX3NpZ25hbF80X2NkbWEucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3JhX3NpZ25hbF80X2NkbWEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NlY3VyZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zZWN1cmUucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMDg4OWU0OS4uNGJhZTI1OAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zZWN1cmUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NlY3VyZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsXzBfY2RtYS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfMF9jZG1hLnBuZwppbmRleCBhZjQzZTAwLi4zYzdkYjA4IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfMF9jZG1hLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfMF9jZG1hLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfMV9jZG1hLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF8xX2NkbWEucG5nCmluZGV4IDRmZmU0MjEuLmY4ZjQwYTggMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF8xX2NkbWEucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF8xX2NkbWEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF8yX2NkbWEucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsXzJfY2RtYS5wbmcKaW5kZXggNmYyN2I5Ni4uYTI0MzE5NSAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsXzJfY2RtYS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsXzJfY2RtYS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsXzNfY2RtYS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfM19jZG1hLnBuZwppbmRleCBkZGM0NmIwLi45YzM2OWU3IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfM19jZG1hLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfM19jZG1hLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfNF9jZG1hLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF80X2NkbWEucG5nCmluZGV4IGZiM2NmZTkuLjIxOWJiYmQgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF80X2NkbWEucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF80X2NkbWEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF9ldmRvXzAucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsX2V2ZG9fMC5wbmcKaW5kZXggYjY5N2NhNC4uYWUxOGVjZCAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsX2V2ZG9fMC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsX2V2ZG9fMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsX2V2ZG9fMS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfZXZkb18xLnBuZwppbmRleCBhNjFkZTRkLi40ZmVkOTJjIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfZXZkb18xLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfZXZkb18xLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfZXZkb18yLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF9ldmRvXzIucG5nCmluZGV4IDYyZTAzOTMuLjk2ZjEyNDggMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF9ldmRvXzIucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF9ldmRvXzIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF9ldmRvXzMucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsX2V2ZG9fMy5wbmcKaW5kZXggMDllYWU5ZC4uYjBlMTMyOCAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsX2V2ZG9fMy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsX2V2ZG9fMy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsX2V2ZG9fNC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfZXZkb180LnBuZwppbmRleCA0MDEyYWM1Li5kYTE1NjQ1IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfZXZkb180LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfZXZkb180LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zcGVha2VycGhvbmUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc3BlYWtlcnBob25lLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDIxZjk2YzQuLjUxZGVhNTgKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc3BlYWtlcnBob25lLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zcGVha2VycGhvbmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3RldGhlcl9ibHVldG9vdGgucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdGV0aGVyX2JsdWV0b290aC5wbmcKaW5kZXggNGViZWU1OC4uZTQzZmJhZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdGV0aGVyX2JsdWV0b290aC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdGV0aGVyX2JsdWV0b290aC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdGV0aGVyX2dlbmVyYWwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdGV0aGVyX2dlbmVyYWwucG5nCmluZGV4IGUyM2Y3ZjkuLmM0MmIwMGMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3RldGhlcl9nZW5lcmFsLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c190ZXRoZXJfZ2VuZXJhbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdGV0aGVyX3VzYi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c190ZXRoZXJfdXNiLnBuZwppbmRleCBkNDMyZjlhLi5jNmM1MzNkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c190ZXRoZXJfdXNiLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c190ZXRoZXJfdXNiLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c190ZXRoZXJfd2lmaS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c190ZXRoZXJfd2lmaS5wbmcKaW5kZXggNzRkZmJiYS4uOWZjYWRlZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdGV0aGVyX3dpZmkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3RldGhlcl93aWZpLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c190aHJvdHRsZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdGhyb3R0bGVkLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDU4ZWFmYzAuLjMzYzA1MjEKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdGhyb3R0bGVkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c190aHJvdHRsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3ZwX3Bob25lX2NhbGwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfdnBfcGhvbmVfY2FsbC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA4M2U4ZWFkLi5kZmIzNDI0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3ZwX3Bob25lX2NhbGwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3ZwX3Bob25lX2NhbGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3ZwX3Bob25lX2NhbGxfb25faG9sZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c192cF9waG9uZV9jYWxsX29uX2hvbGQucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggOTczMWM0Ni4uNDAyMjk1YgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c192cF9waG9uZV9jYWxsX29uX2hvbGQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3ZwX3Bob25lX2NhbGxfb25faG9sZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfd2FybmluZy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c193YXJuaW5nLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGNiOGEzZDQuLjM3Yzg4NTMKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfd2FybmluZy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfd2FybmluZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9oZWFkZXJfYmFja2dyb3VuZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaGVhZGVyX2JhY2tncm91bmQuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA3OWQ3N2FhLi4zN2I1ZmVmCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaGVhZGVyX2JhY2tncm91bmQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9oZWFkZXJfYmFja2dyb3VuZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZF9mb2N1cy45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX2ZvY3VzLjkucG5nCmluZGV4IGIwN2M3YmMuLjA4NzZiYzYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX2ZvY3VzLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX2ZvY3VzLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwppbmRleCBkZTJmM2MzLi44MTBjOTUwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCmluZGV4IGI1ZWFiODMuLjM0M2U0Y2EgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNiYXJfYmFja2dyb3VuZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c2Jhcl9iYWNrZ3JvdW5kLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YmUyOTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNiYXJfYmFja2dyb3VuZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zeW1fYWN0aW9uX2NhbGwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3ltX2FjdGlvbl9jYWxsLnBuZwppbmRleCAxMDVmN2QwLi5kYThhZmVlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zeW1fYWN0aW9uX2NhbGwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N5bV9hY3Rpb25fY2FsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2Fycm93X2xlZnRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9hcnJvd19sZWZ0X2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZkNmY3OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9hcnJvd19sZWZ0X2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2Fycm93X2xlZnRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfYXJyb3dfbGVmdF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzZhYThjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2Fycm93X2xlZnRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2Fycm93X3JpZ2h0X2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfYXJyb3dfcmlnaHRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjI2MDM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2Fycm93X3JpZ2h0X2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2Fycm93X3JpZ2h0X2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2Fycm93X3JpZ2h0X2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNWZiZTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfYXJyb3dfcmlnaHRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2RpdmlkZXJfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9kaXZpZGVyX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEyY2IwNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9kaXZpZGVyX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2RpdmlkZXJfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfZGl2aWRlcl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmY0ZDM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2RpdmlkZXJfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2ZvY3VzLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2ZvY3VzLjkucG5nCmluZGV4IDc1OTFjMDcuLjZlOGE3MWYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9mb2N1cy45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfZm9jdXMuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2ZvY3VzX2Jhcl9sZWZ0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2ZvY3VzX2Jhcl9sZWZ0LjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMGVlODM0Ny4uNTExOTRhNAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfZm9jdXNfYmFyX2xlZnQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX2ZvY3VzX2Jhcl9sZWZ0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9mb2N1c19iYXJfcmlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfZm9jdXNfYmFyX3JpZ2h0LjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMGVlODM0Ny4uNTExOTRhNAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfZm9jdXNfYmFyX3JpZ2h0LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9mb2N1c19iYXJfcmlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3ByZXNzLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3ByZXNzLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMDE3OThhMy4uMTE5YjJjNgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfcHJlc3MuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3ByZXNzLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9wcmVzc19iYXJfbGVmdC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9wcmVzc19iYXJfbGVmdC45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGVlMTI5YmEuLmRjMmZiY2UKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3ByZXNzX2Jhcl9sZWZ0LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9wcmVzc19iYXJfbGVmdC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfcHJlc3NfYmFyX3JpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3ByZXNzX2Jhcl9yaWdodC45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGVlMTI5YmEuLmRjMmZiY2UKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3ByZXNzX2Jhcl9yaWdodC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfcHJlc3NfYmFyX3JpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9zZWxlY3RlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9zZWxlY3RlZC45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDZlZTc3NWYuLmYwMzZiOWEKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3NlbGVjdGVkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9zZWxlY3RlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfc2VsZWN0ZWRfYmFyX2xlZnQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfc2VsZWN0ZWRfYmFyX2xlZnQuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAwM2JjYzEzLi5hYTkzNWZlCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9zZWxlY3RlZF9iYXJfbGVmdC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfc2VsZWN0ZWRfYmFyX2xlZnQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3NlbGVjdGVkX2Jhcl9yaWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9zZWxlY3RlZF9iYXJfcmlnaHQuOS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBmMjI4NDQ1Li5hYTkzNWZlCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9zZWxlY3RlZF9iYXJfcmlnaHQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3NlbGVjdGVkX2Jhcl9yaWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfc2VsZWN0b3JfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3NlbGVjdG9yX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDFiOWJjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGFiX3NlbGVjdG9yX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfc3RyaXBfaG9sby45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl9zdHJpcF9ob2xvLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MzdmNmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfc3RyaXBfaG9sby45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfdW5zZWxlY3RlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RhYl91bnNlbGVjdGVkLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNjc1NjFlMi4uYzNhMWYzMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfdW5zZWxlY3RlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90YWJfdW5zZWxlY3RlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0X3NlbGVjdF9oYW5kbGUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dF9zZWxlY3RfaGFuZGxlLnBuZwppbmRleCA4MGQ0OGFiLi45M2E1YTE1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0X3NlbGVjdF9oYW5kbGUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRfc2VsZWN0X2hhbmRsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2RlZmF1bHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGVmYXVsdC45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGY3YjZlOTkuLjRjMjAxNzkKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2RlZmF1bHQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2RlZmF1bHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzIxOTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAzZTRmNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMzAxMTUwMi4uODE1NjlkMQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NDI3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3Mjc1MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZC45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGUwZjgyZWIuLjI1OTE0OTAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWQyNDhjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YTA3YzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfcHJlc3NlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9wcmVzc2VkLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMjk2ZDNkYS4uYTQyZDg3ZgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfcHJlc3NlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3MWFjOWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxNzIyZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlYXJjaF9kZWZhdWx0X2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9zZWFyY2hfZGVmYXVsdF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2MjU2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9zZWFyY2hfZGVmYXVsdF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlYXJjaF9kZWZhdWx0X2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VhcmNoX2RlZmF1bHRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODFlZGViCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlYXJjaF9kZWZhdWx0X2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlYXJjaF9zZWxlY3RlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VhcmNoX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjNmMzViCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlYXJjaF9zZWxlY3RlZF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlYXJjaF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlYXJjaF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MmIxMzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VhcmNoX3NlbGVjdGVkX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlbGVjdGVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlbGVjdGVkLjkucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggY2YyY2FlMy4uYTM2ZWQ3MgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VsZWN0ZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlbGVjdGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNzFhYzliCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMTcyMmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90aXRsZV9iYXJfc2hhZG93LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGl0bGVfYmFyX3NoYWRvdy45LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGMzYTBhMjMuLmU2ZGFiNjMKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGl0bGVfYmFyX3NoYWRvdy45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90aXRsZV9iYXJfc2hhZG93LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfc291bmRfb2ZmLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfc291bmRfb2ZmLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDczZGI0OC4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbGFuZC1oZHBpL2ljX2pvZ19kaWFsX3NvdW5kX29mZi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbGFuZC1oZHBpL2ljX2pvZ19kaWFsX3NvdW5kX29uLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfc291bmRfb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MGRhNmUzLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfc291bmRfb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWxhbmQtaGRwaS9pY19qb2dfZGlhbF91bmxvY2sucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWxhbmQtaGRwaS9pY19qb2dfZGlhbF91bmxvY2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOWFmMWFmLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfdW5sb2NrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYWM0YWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhOWE0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhYzRhYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGE5YTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDNmMzU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYmJkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjYjlkZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjVmZGM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWVhM2E4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYTQ1ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGNjMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZWJiY2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4Y2MwMTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllYmJjYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E0ZDUwOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNThmM2ExCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MjJjZGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRlMTY2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5M2Y4YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGFiMjUwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJjMWVlOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzY0M2VhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTg2ZDUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZGVmYXVsdF9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNmMxYTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZGVmYXVsdF9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThmMDdjYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X2ZvY3VzZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X2ZvY3VzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjg1ZjFlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X25vcm1hbF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZGVmYXVsdF9ub3JtYWxfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMzNmYTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZGVmYXVsdF9ub3JtYWxfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X25vcm1hbF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfbm9ybWFsX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI3MjhlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X25vcm1hbF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X3ByZXNzZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGExNWQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X3ByZXNzZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X3ByZXNzZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kZWZhdWx0X3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzE4ZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2RlZmF1bHRfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kcm9wZG93bl9ub3JtYWwuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZHJvcGRvd25fbm9ybWFsLjkucG5nCmluZGV4IDg1NDA1MDEuLmY2ZTlhMTkgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kcm9wZG93bl9ub3JtYWwuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2Ryb3Bkb3duX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZHJvcGRvd25fcHJlc3NlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kcm9wZG93bl9wcmVzc2VkLjkucG5nCmluZGV4IDlhNTAzOTYuLjNiZGY1MmQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kcm9wZG93bl9wcmVzc2VkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kcm9wZG93bl9wcmVzc2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kcm9wZG93bl9zZWxlY3RlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9kcm9wZG93bl9zZWxlY3RlZC45LnBuZwppbmRleCBhMGEzZmVmLi4wODc5NTZlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fZHJvcGRvd25fc2VsZWN0ZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2Ryb3Bkb3duX3NlbGVjdGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19kaXNhYmxlZF9vZmZfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19kaXNhYmxlZF9vZmZfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjExNDJlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2Rpc2FibGVkX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19kaXNhYmxlZF9vZmZfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fZGlzYWJsZWRfb2ZmX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMDMxZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fZGlzYWJsZWRfb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19kaXNhYmxlZF9vbl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2Rpc2FibGVkX29uX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEyNDNjNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19kaXNhYmxlZF9vbl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19kaXNhYmxlZF9vbl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19kaXNhYmxlZF9vbl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWE1NWUwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2Rpc2FibGVkX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19mb2N1c2VkX29mZl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2ZvY3VzZWRfb2ZmX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM2NDVkYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19mb2N1c2VkX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19mb2N1c2VkX29mZl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19mb2N1c2VkX29mZl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWZjMzIxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2ZvY3VzZWRfb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19mb2N1c2VkX29uX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fZm9jdXNlZF9vbl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YmNkYzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fZm9jdXNlZF9vbl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19mb2N1c2VkX29uX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX2ZvY3VzZWRfb25faG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVmYzMyMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19mb2N1c2VkX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19ub3JtYWxfb2ZmX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fbm9ybWFsX29mZl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NDEzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fbm9ybWFsX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19ub3JtYWxfb2ZmX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX25vcm1hbF9vZmZfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNiNTQzMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19ub3JtYWxfb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19ub3JtYWxfb25faG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19ub3JtYWxfb25faG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTg0MDRhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX25vcm1hbF9vbl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19ub3JtYWxfb25faG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fbm9ybWFsX29uX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZTE0YjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fbm9ybWFsX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2NlZjA0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZGVmNTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE5MzEwYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzI4YjViCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjBkZGQxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NWNmMTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1NDUwMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTY3YTQzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNWMzMTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEwN2M1YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2YTc0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTFjOTZjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19wcmVzc2VkX29mZl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX3ByZXNzZWRfb2ZmX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY3NGM3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19wcmVzc2VkX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19wcmVzc2VkX29mZl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19wcmVzc2VkX29mZl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDhlNTBlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX3ByZXNzZWRfb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19wcmVzc2VkX29uX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fcHJlc3NlZF9vbl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNjBiYzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fcHJlc3NlZF9vbl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19wcmVzc2VkX29uX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX3ByZXNzZWRfb25faG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyNWMyNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19wcmVzc2VkX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2QxZTE2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MmU4NmNkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xY2Y0NzNiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ2ZjIxMjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzFmN2Y4YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX2ZvY3VzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MjQyNWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX2hvbG8uOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29mZl9ob2xvLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBjYTY1OWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29mZl9ob2xvLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX25vcm1hbF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29mZl9ub3JtYWxfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE2ZjE5ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29mZl9ub3JtYWxfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX25vcm1hbF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfbm9ybWFsX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTJjNzcwMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX25vcm1hbF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX3ByZXNzZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDYxNDcwYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX3ByZXNzZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX3ByZXNzZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb2ZmX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MDE5ZmVlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJhMzU0ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vbl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTM5MWIyZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vbl9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjAxZmYyYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MGMyNTlhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vbl9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fZm9jdXNlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29uX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg1N2M3NTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29uX2ZvY3VzZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vbl9mb2N1c2VkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWYxNmE0OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fZm9jdXNlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25faG9sby45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25faG9sby45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NmNiZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vbl9ob2xvLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fbm9ybWFsX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fbm9ybWFsX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNDdlYzhmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vbl9ub3JtYWxfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fbm9ybWFsX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29uX25vcm1hbF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI5NTFjYWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29uX25vcm1hbF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29uX3ByZXNzZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE0MWI0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fdG9nZ2xlX29uX3ByZXNzZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3RvZ2dsZV9vbl9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTEzYWVkNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl90b2dnbGVfb25fcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9kaXZpZGVyX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jYWJfZGl2aWRlcl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU3Y2M4YTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jYWJfZGl2aWRlcl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9kaXZpZGVyX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2FiX2RpdmlkZXJfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWM4NTcwMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9kaXZpZGVyX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2FiX2RpdmlkZXJfdmVydGljYWxfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjdlZDZkZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9kaXZpZGVyX3ZlcnRpY2FsX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9kaXZpZGVyX3ZlcnRpY2FsX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43M2FjMGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2FiX2RpdmlkZXJfdmVydGljYWxfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jYWJfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZjODUzMDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jYWJfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2FiX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzgyMzUyYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9pY19jbG9zZV9mb2N1c2VkX2hvbG8ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2FiX2ljX2Nsb3NlX2ZvY3VzZWRfaG9sby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGYxNzBjNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9pY19jbG9zZV9mb2N1c2VkX2hvbG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9pY19jbG9zZV9ub3JtYWxfaG9sby5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jYWJfaWNfY2xvc2Vfbm9ybWFsX2hvbG8ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk0ODJjZTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jYWJfaWNfY2xvc2Vfbm9ybWFsX2hvbG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9pY19jbG9zZV9wcmVzc2VkX2hvbG8ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2FiX2ljX2Nsb3NlX3ByZXNzZWRfaG9sby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDExNWQyMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NhYl9pY19jbG9zZV9wcmVzc2VkX2hvbG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2Rpc2FibGVkX29mZl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2hlY2tib3hfZGlzYWJsZWRfb2ZmX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEwOTRiZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2Rpc2FibGVkX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2Rpc2FibGVkX29mZl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2Rpc2FibGVkX29mZl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTczNzdjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2hlY2tib3hfZGlzYWJsZWRfb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2Rpc2FibGVkX29uX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9kaXNhYmxlZF9vbl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYzUyOTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9kaXNhYmxlZF9vbl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2Rpc2FibGVkX29uX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2hlY2tib3hfZGlzYWJsZWRfb25faG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZiZDkwMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2Rpc2FibGVkX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2ZvY3VzZWRfb2ZmX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9mb2N1c2VkX29mZl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNjI0YzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9mb2N1c2VkX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2ZvY3VzZWRfb2ZmX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2hlY2tib3hfZm9jdXNlZF9vZmZfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5M2NlMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2ZvY3VzZWRfb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2ZvY3VzZWRfb25faG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2ZvY3VzZWRfb25faG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2RjMWRmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2hlY2tib3hfZm9jdXNlZF9vbl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X2ZvY3VzZWRfb25faG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9mb2N1c2VkX29uX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NzdlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9mb2N1c2VkX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X25vcm1hbF9vZmZfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X25vcm1hbF9vZmZfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODI0Zjc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2hlY2tib3hfbm9ybWFsX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X25vcm1hbF9vZmZfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9ub3JtYWxfb2ZmX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NmY2OGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9ub3JtYWxfb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X25vcm1hbF9vbl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2hlY2tib3hfbm9ybWFsX29uX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRmZDQxOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X25vcm1hbF9vbl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X25vcm1hbF9vbl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X25vcm1hbF9vbl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTcyZWY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2hlY2tib3hfbm9ybWFsX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X3ByZXNzZWRfb2ZmX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9wcmVzc2VkX29mZl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NjcwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9wcmVzc2VkX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X3ByZXNzZWRfb2ZmX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2hlY2tib3hfcHJlc3NlZF9vZmZfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdkZDFkYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X3ByZXNzZWRfb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X3ByZXNzZWRfb25faG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X3ByZXNzZWRfb25faG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2YyYjFiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY2hlY2tib3hfcHJlc3NlZF9vbl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NoZWNrYm94X3ByZXNzZWRfb25faG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9wcmVzc2VkX29uX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZGY2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jaGVja2JveF9wcmVzc2VkX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbWJvYm94X2Rpc2FibGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbWJvYm94X2Rpc2FibGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzJkYjdlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY29tYm9ib3hfZGlzYWJsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbWJvYm94X25vaGlnaGxpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbWJvYm94X25vaGlnaGxpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTYzMzE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvY29tYm9ib3hfbm9oaWdobGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19ib3R0b21faG9sby45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19ib3R0b21faG9sby45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjNkMGYyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX2JvdHRvbV9ob2xvLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19mdWxsX2hvbG8uOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfZnVsbF9ob2xvLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYzk0MjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfZnVsbF9ob2xvLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19taWRkbGVfaG9sby45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19taWRkbGVfaG9sby45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmRhNWNhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX21pZGRsZV9ob2xvLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ190b3BfaG9sby45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ190b3BfaG9sby45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWQ1MTliCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX3RvcF9ob2xvLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0LjkucG5nCmluZGV4IDM5NTIyN2EuLjQxYjc3NmIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0X29wYXF1ZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHRfb3BhcXVlLjkucG5nCmluZGV4IDVjNTM3ZWUuLmViNzVhMjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHRfb3BhcXVlLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHRfb3BhcXVlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsuOS5wbmcKaW5kZXggYmY0NWUzOC4uNTVhNWU1MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nCmluZGV4IDk0NDRmMGQuLjYwZTJjYjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RpbV9kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RpbV9kYXJrLjkucG5nCmluZGV4IDA4ODM4Y2EuLmNmMzQ2MTMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kaW1fZGFyay45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGltX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1NDhjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQyZGQyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodC45LnBuZwppbmRleCAzOTUyMjdhLi40MWI3NzZiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodF9vcGFxdWUuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodF9vcGFxdWUuOS5wbmcKaW5kZXggNWM1MzdlZS4uZWI3NWEyMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHRfb3BhcXVlLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0X29wYXF1ZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsuOS5wbmcKaW5kZXggNzAyYjg3OC4uNTVhNWU1MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2Rhcmtfb3BhcXVlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrX29wYXF1ZS45LnBuZwppbmRleCA4ZjM1MzE1Li42MGUyY2IyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2Rhcmtfb3BhcXVlLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfZGFya19vcGFxdWUuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzY5NjhjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZGYxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZWRpdF9xdWVyeS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9lZGl0X3F1ZXJ5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjMyMmNiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZWRpdF9xdWVyeS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZWRpdF9xdWVyeV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2VkaXRfcXVlcnlfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY5NTdiOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2VkaXRfcXVlcnlfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZWRpdF9xdWVyeV9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9lZGl0X3F1ZXJ5X2JhY2tncm91bmRfcHJlc3NlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODhkNGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZWRpdF9xdWVyeV9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZWRpdF9xdWVyeV9iYWNrZ3JvdW5kX3NlbGVjdGVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZWRpdF9xdWVyeV9iYWNrZ3JvdW5kX3NlbGVjdGVkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZTU3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9lZGl0X3F1ZXJ5X2JhY2tncm91bmRfc2VsZWN0ZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2Vtb19pbV9lbWJhcnJhc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9lbW9faW1fZW1iYXJyYXNzZWQucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3Jlcy9yZXMvZHJhd2FibGUvZW1vX2ltX2VtYmFycmFzc2VkLnBuZwpyZW5hbWUgdG8gY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZW1vX2ltX2VtYmFycmFzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9leHBhbmRlcl9pY19tYXhpbWl6ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9leHBhbmRlcl9pY19tYXhpbWl6ZWQuOS5wbmcKaW5kZXggZDVjMzI3Ni4uNDY1Y2FiZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZXhwYW5kZXJfaWNfbWF4aW1pemVkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2V4cGFuZGVyX2ljX21heGltaXplZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9leHBhbmRlcl9pY19taW5pbWl6ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9leHBhbmRlcl9pY19taW5pbWl6ZWQuOS5wbmcKaW5kZXggNDUxNWI0Mi4uOTk2N2VjYiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZXhwYW5kZXJfaWNfbWluaW1pemVkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2V4cGFuZGVyX2ljX21pbmltaXplZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19hZ2dyZWdhdGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2FnZ3JlZ2F0ZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzJlMmIwLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2FnZ3JlZ2F0ZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX2JhY2sucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX2JhY2sucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YmZmNGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19idG5fYmFjay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX2ZpbmRfbmV4dC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19idG5fZmluZF9uZXh0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmRjMjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX2ZpbmRfbmV4dC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX2ZpbmRfcHJldi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19idG5fZmluZF9wcmV2LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTNkYTFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX2ZpbmRfcHJldi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX25leHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX25leHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM2Y2Y0MzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19idG5fbmV4dC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2Nsb3NlX25vcm1hbF9ob2xvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9ub3JtYWxfaG9sby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YyYTAyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9ub3JtYWxfaG9sby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2Nsb3NlX3ByZXNzZWRfaG9sby5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfcHJlc3NlZF9ob2xvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWE4ZTE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2Nsb3NlX3ByZXNzZWRfaG9sby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2ZvY3VzZWRfaG9sby5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfZm9jdXNlZF9ob2xvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzlmMmRlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2ZvY3VzZWRfaG9sby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9hY2NvdW50X2xpc3QucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9hY2NvdW50X2xpc3QucG5nCmluZGV4IGQzYWYwMWIuLmYwOTQ1YjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYWNjb3VudF9saXN0LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2FjY291bnRfbGlzdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9hZGQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9hZGQucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggNTdhNDA5OS4uNjc1MmJmZAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2FkZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9hZGQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYWdlbmRhLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYWdlbmRhLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDNmYjAwMzEuLjlmMmMxZGMKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9hZ2VuZGEucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYWdlbmRhLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2FsbGZyaWVuZHMucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9hbGxmcmllbmRzLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGU0ZTI3MjcuLmE1YmQzMzEKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9hbGxmcmllbmRzLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2FsbGZyaWVuZHMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYWx3YXlzX2xhbmRzY2FwZV9wb3J0cmFpdC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2Fsd2F5c19sYW5kc2NhcGVfcG9ydHJhaXQucG5nCmluZGV4IDQ1MWNjYzkuLjY4OTExYzQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYWx3YXlzX2xhbmRzY2FwZV9wb3J0cmFpdC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9hbHdheXNfbGFuZHNjYXBlX3BvcnRyYWl0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2FyY2hpdmUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9hcmNoaXZlLnBuZwppbmRleCA3MjMxZmJiNS4uYTQ1OTllMyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9hcmNoaXZlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2FyY2hpdmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYXR0YWNobWVudC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2F0dGFjaG1lbnQucG5nCmluZGV4IDgzZTA2ODcuLjg5ZDYyNmYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYXR0YWNobWVudC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9hdHRhY2htZW50LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2JhY2sucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9iYWNrLnBuZwppbmRleCA5MWZhM2U3Li41Y2U1MGViIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2JhY2sucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYmFjay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9ibG9jay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2Jsb2NrLnBuZwppbmRleCBmY2U5Mjk3Li40MjJlZWIxIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2Jsb2NrLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2Jsb2NrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2Jsb2NrZWRfdXNlci5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2Jsb2NrZWRfdXNlci5wbmcKaW5kZXggNTUzMjI0NS4uNWE1NjE5YiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9ibG9ja2VkX3VzZXIucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfYmxvY2tlZF91c2VyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NhbGwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jYWxsLnBuZwppbmRleCBlYjA1OTQ5Li5hNjNmODZiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NhbGwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY2FsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jYW1lcmEucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jYW1lcmEucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggN2ZkZGY3Yy4uY2RmN2NhMwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NhbWVyYS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jYW1lcmEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY2MucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jYy5wbmcKaW5kZXggOTdmYjY2My4uNDg3NjAyMSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jYy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jYy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jaGF0X2Rhc2hib2FyZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NoYXRfZGFzaGJvYXJkLnBuZwppbmRleCA1NGU5MDIzLi4zN2ZkM2NiZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jaGF0X2Rhc2hib2FyZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jaGF0X2Rhc2hib2FyZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jbGVhcl9wbGF5bGlzdC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NsZWFyX3BsYXlsaXN0LnBuZwppbmRleCA1Mjc5MWEwLi43NTBkYjYyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NsZWFyX3BsYXlsaXN0LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NsZWFyX3BsYXlsaXN0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2Nsb3NlX2NsZWFyX2NhbmNlbC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2Nsb3NlX2NsZWFyX2NhbmNlbC5wbmcKaW5kZXggMDRhNzZiNS4uNzgyMjJlYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jbG9zZV9jbGVhcl9jYW5jZWwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY2xvc2VfY2xlYXJfY2FuY2VsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NvbXBhc3MucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jb21wYXNzLnBuZwppbmRleCBiNWY4ODVlLi43NzE3ZGRlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NvbXBhc3MucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY29tcGFzcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jb21wb3NlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY29tcG9zZS5wbmcKaW5kZXggMTIxMjI4Yy4uMWI0NzMzZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jb21wb3NlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NvbXBvc2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY29weS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NvcHkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZDYyNmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2NvcHkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY3JvcC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2Nyb3AucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggNDg5MmNhMC4uYzBkZjk5NgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2Nyb3AucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfY3JvcC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jdXQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9jdXQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNDczM2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2N1dC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9kYXkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9kYXkucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggZjM2NmMxYi4uZGI1ZDNhNAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2RheS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9kYXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZGVsZXRlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZGVsZXRlLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGJiNTMzZjcuLjdkOTU0OTQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9kZWxldGUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZGVsZXRlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2RpcmVjdGlvbnMucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9kaXJlY3Rpb25zLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGZiYWM3M2QuLjAwYTI4OGYKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9kaXJlY3Rpb25zLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2RpcmVjdGlvbnMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZWRpdC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2VkaXQucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMWRlODVjYS4uNDFhOWMyZQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2VkaXQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZWRpdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9lbW90aWNvbnMucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9lbW90aWNvbnMucG5nCmluZGV4IDk1ZmQ1NjYuLmU4YzRlNDcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZW1vdGljb25zLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2Vtb3RpY29ucy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9lbmRfY29udmVyc2F0aW9uLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZW5kX2NvbnZlcnNhdGlvbi5wbmcKaW5kZXggOWRkYjAzZS4uMGVhMGZjYiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9lbmRfY29udmVyc2F0aW9uLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2VuZF9jb252ZXJzYXRpb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZmluZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2ZpbmQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOTYzNDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2ZpbmQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZm9yd2FyZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2ZvcndhcmQucG5nCmluZGV4IDYzMmU0ZjYuLjA5MzZmYWMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZm9yd2FyZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9mb3J3YXJkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2ZyaWVuZHNsaXN0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZnJpZW5kc2xpc3QucG5nCmluZGV4IDQ1YmFhNDguLjhlYzZiMWEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZnJpZW5kc2xpc3QucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZnJpZW5kc2xpc3QucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZ2FsbGVyeS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2dhbGxlcnkucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMmQ3NDk5My4uYTNkZWVmMQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2dhbGxlcnkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZ2FsbGVyeS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9nb3RvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZ290by5wbmcKaW5kZXggMzgxMGQ1NC4uNDAxODNlYiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9nb3RvLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2dvdG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfaGVscC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2hlbHAucG5nCmluZGV4IDRmNjVhNjEuLjdjNTVkZmQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfaGVscC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9oZWxwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2hvbWUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9ob21lLnBuZwppbmRleCAyM2RjZWNkLi4zNDk0M2Y2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2hvbWUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfaG9tZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9pbmZvX2RldGFpbHMucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9pbmZvX2RldGFpbHMucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMWY4YTdjZC4uMTc4NmQxZQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2luZm9fZGV0YWlscy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9pbmZvX2RldGFpbHMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfaW52aXRlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfaW52aXRlLnBuZwppbmRleCBjY2JmMzE3Li43NTc3ZTZkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2ludml0ZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9pbnZpdGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbG9naW4ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9sb2dpbi5wbmcKaW5kZXggZDQ4OTc4Ny4uMmI4NTZiYyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9sb2dpbi5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9sb2dpbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9tYW5hZ2UucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9tYW5hZ2UucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggYTk2YmIwYy4uZjE1NWJiYwotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X21hbmFnZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9tYW5hZ2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbWFwbW9kZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X21hcG1vZGUucG5nCmluZGV4IGVmNDUzZTEuLmQ4NWNhYjUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbWFwbW9kZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9tYXBtb2RlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X21hcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9tYXJrLnBuZwppbmRleCBkMmEwMTE2Li41ZTk1ZGE3IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X21hcmsucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbWFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9tb250aC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X21vbnRoLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGQ1Mjg1YWIuLmJmNmNiODkKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9tb250aC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9tb250aC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9tb3JlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbW9yZS5wbmcKaW5kZXggMTY4ZGNkMy4uYjlmYzVmYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9tb3JlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X21vcmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbXlfY2FsZW5kYXIucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9teV9jYWxlbmRhci5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBjMWM5YzIwLi4wYzg4ZmQzCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbXlfY2FsZW5kYXIucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbXlfY2FsZW5kYXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbXlsb2NhdGlvbi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X215bG9jYXRpb24ucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggOWVlNTAyNC4uZmRiZDVjYQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X215bG9jYXRpb24ucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbXlsb2NhdGlvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9teXBsYWNlcy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X215cGxhY2VzLnBuZwppbmRleCAwNDBmOWIxLi4wNmYxMWJhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X215cGxhY2VzLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X215cGxhY2VzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X25vdGlmaWNhdGlvbnMucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9ub3RpZmljYXRpb25zLnBuZwppbmRleCBmMzYxZTgyLi44NjZkNGUwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X25vdGlmaWNhdGlvbnMucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfbm90aWZpY2F0aW9ucy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9wYXN0ZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3Bhc3RlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZGY3Y2EzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9wYXN0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9wbGF5X2NsaXAucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9wbGF5X2NsaXAucG5nCmluZGV4IDhhMDFmNzAuLjQ2Njk5NDcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfcGxheV9jbGlwLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3BsYXlfY2xpcC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9wcmVmZXJlbmNlcy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3ByZWZlcmVuY2VzLnBuZwppbmRleCAyZjM0Yzc2Li42MGRiZmY2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3ByZWZlcmVuY2VzLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3ByZWZlcmVuY2VzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3JlY2VudF9oaXN0b3J5LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfcmVjZW50X2hpc3RvcnkucG5nCmluZGV4IDQ3MjJjYmIuLjRjY2FlNWQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfcmVjZW50X2hpc3RvcnkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfcmVjZW50X2hpc3RvcnkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfcmVmcmVzaC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3JlZnJlc2gucG5nCmluZGV4IGMzNTUxYmVjLi43N2Q3MGRkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3JlZnJlc2gucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfcmVmcmVzaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9yZXBvcnRfaW1hZ2UucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9yZXBvcnRfaW1hZ2UucG5nCmluZGV4IDRmMTI4ZDcuLjM5M2Q3MjcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfcmVwb3J0X2ltYWdlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3JlcG9ydF9pbWFnZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9yZXZlcnQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9yZXZlcnQucG5nCmluZGV4IDJhZmM4ZTguLmU3ZTA0ZjUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfcmV2ZXJ0LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3JldmVydC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9yb3RhdGUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9yb3RhdGUucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggNTQ3ZDRjYS4uMjczNjhiMgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3JvdGF0ZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9yb3RhdGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2F2ZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NhdmUucG5nCmluZGV4IGZmZDdmYjcuLjM2ZDUwYjMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2F2ZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zYXZlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NlYXJjaC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NlYXJjaC5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBlZjk0OWQ1Li45NDQ0NmRiCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2VhcmNoLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NlYXJjaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zZWxlY3RfYWxsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2VsZWN0X2FsbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmZDNjYmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NlbGVjdF9hbGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2VuZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NlbmQucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggNjcyYWI3MS4uNzRjMDk2ZAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NlbmQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2VuZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zZXRfYXMucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zZXRfYXMucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggZTJjOTJlZi4uY2I5ZGM0OQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NldF9hcy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zZXRfYXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2hhcmUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zaGFyZS5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBiN2MxYzI1Li40NGRiOWIxCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2hhcmUucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2hhcmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2xpZGVzaG93LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2xpZGVzaG93LnBuZwppbmRleCAwOGE0MGYyLi4wNGZkYTdmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NsaWRlc2hvdy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zbGlkZXNob3cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc29ydF9hbHBoYWJldGljYWxseS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NvcnRfYWxwaGFiZXRpY2FsbHkucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMDZkNWM3NC4uMjU4M2ViOAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NvcnRfYWxwaGFiZXRpY2FsbHkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc29ydF9hbHBoYWJldGljYWxseS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zb3J0X2J5X3NpemUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zb3J0X2J5X3NpemUucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggM2MzOTk1My4uNjVlMjc4NgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NvcnRfYnlfc2l6ZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zb3J0X2J5X3NpemUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc3Rhci5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3N0YXIucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggY2Y1MGNmOS4uNTI3ZDc0YQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3N0YXIucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc3Rhci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zdGFydF9jb252ZXJzYXRpb24ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zdGFydF9jb252ZXJzYXRpb24ucG5nCmluZGV4IDEwZWY2NDkuLmFhZGNjMmYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc3RhcnRfY29udmVyc2F0aW9uLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3N0YXJ0X2NvbnZlcnNhdGlvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zdG9wLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc3RvcC5wbmcKaW5kZXggNTFlZmE5MS4uNGZjODI1YyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zdG9wLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3N0b3AucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfdG9kYXkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV90b2RheS5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAyYjE1ZjI5Li5jNjNiNmFmCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfdG9kYXkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfdG9kYXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfdXBsb2FkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfdXBsb2FkLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDA0ZjNhMmM4Li4xYzBkZDNmCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfdXBsb2FkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3VwbG9hZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV91cGxvYWRfeW91X3R1YmUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV91cGxvYWRfeW91X3R1YmUucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggYWRkNDUzYi4uMDA5NTU2NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3VwbG9hZF95b3VfdHViZS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV91cGxvYWRfeW91X3R1YmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfdmlldy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3ZpZXcucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggNmFlYWM3Zi4uNjk4MjhhOQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3ZpZXcucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfdmlldy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV93ZWVrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfd2Vlay5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBjYmE0MzdjLi42MmNkNjVlCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfd2Vlay5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV93ZWVrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3pvb20ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV96b29tLnBuZwppbmRleCA5Njk1YzY5Li4wYjhjNGU4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3pvb20ucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfem9vbS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc2VhcmNoX2NhdGVnb3J5X2RlZmF1bHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc2VhcmNoX2NhdGVnb3J5X2RlZmF1bHQucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggOWI1NTM4My4uOTQ0NDZkYgotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19zZWFyY2hfY2F0ZWdvcnlfZGVmYXVsdC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc2VhcmNoX2NhdGVnb3J5X2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9kZWZhdWx0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9kZWZhdWx0LnBuZwppbmRleCA4NTQ2YzVmLi40ZTg4YjM3IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfZGVmYXVsdC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX2xlZnRfZW5kX2NvbmZpcm1fZ3JheS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX2xlZnRfZW5kX2NvbmZpcm1fZ3JheS45LnBuZwppbmRleCA0NDQwYWJjLi5hZGJiMTQ2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9sZWZ0X2VuZF9jb25maXJtX2dyYXkuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfbGVmdF9lbmRfY29uZmlybV9ncmF5LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX2xlZnRfZW5kX2NvbmZpcm1fZ3JlZW4uOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9sZWZ0X2VuZF9jb25maXJtX2dyZWVuLjkucG5nCmluZGV4IDI2YzA3ZTYuLmU4YmU3YmYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX2xlZnRfZW5kX2NvbmZpcm1fZ3JlZW4uOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfbGVmdF9lbmRfY29uZmlybV9ncmVlbi45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9sZWZ0X2VuZF9jb25maXJtX3JlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX2xlZnRfZW5kX2NvbmZpcm1fcmVkLjkucG5nCmluZGV4IDY4NGY4YWMuLjEyMGE5ZDggMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX2xlZnRfZW5kX2NvbmZpcm1fcmVkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX2xlZnRfZW5kX2NvbmZpcm1fcmVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX2xlZnRfZW5kX2NvbmZpcm1feWVsbG93LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfbGVmdF9lbmRfY29uZmlybV95ZWxsb3cuOS5wbmcKaW5kZXggNTZjZmNlMzNhLi42MGVjMTQ2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9sZWZ0X2VuZF9jb25maXJtX3llbGxvdy45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9sZWZ0X2VuZF9jb25maXJtX3llbGxvdy45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9sZWZ0X2VuZF9ub3JtYWwuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9sZWZ0X2VuZF9ub3JtYWwuOS5wbmcKaW5kZXggZDRlMTkyOS4uNzQ3NzQ1MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfbGVmdF9lbmRfbm9ybWFsLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX2xlZnRfZW5kX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9sZWZ0X2VuZF9wcmVzc2VkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfbGVmdF9lbmRfcHJlc3NlZC45LnBuZwppbmRleCAzOWNkMWU1Li5jNzlhMzVjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9sZWZ0X2VuZF9wcmVzc2VkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX2xlZnRfZW5kX3ByZXNzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfcmlnaHRfZW5kX2NvbmZpcm1fZ3JheS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX3JpZ2h0X2VuZF9jb25maXJtX2dyYXkuOS5wbmcKaW5kZXggYTZlZTMyOS4uNGNlMDlmYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfcmlnaHRfZW5kX2NvbmZpcm1fZ3JheS45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9yaWdodF9lbmRfY29uZmlybV9ncmF5LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX3JpZ2h0X2VuZF9jb25maXJtX2dyZWVuLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfcmlnaHRfZW5kX2NvbmZpcm1fZ3JlZW4uOS5wbmcKaW5kZXggMzg2ZWQ5ZC4uOWQ3NTY1ZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfcmlnaHRfZW5kX2NvbmZpcm1fZ3JlZW4uOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfcmlnaHRfZW5kX2NvbmZpcm1fZ3JlZW4uOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfcmlnaHRfZW5kX2NvbmZpcm1fcmVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfcmlnaHRfZW5kX2NvbmZpcm1fcmVkLjkucG5nCmluZGV4IDAyNDJhNDIuLmQ1ZjliZDggMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX3JpZ2h0X2VuZF9jb25maXJtX3JlZC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9yaWdodF9lbmRfY29uZmlybV9yZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfcmlnaHRfZW5kX2NvbmZpcm1feWVsbG93LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfcmlnaHRfZW5kX2NvbmZpcm1feWVsbG93LjkucG5nCmluZGV4IGI4YzJlMTguLjViOWM1YjQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX3JpZ2h0X2VuZF9jb25maXJtX3llbGxvdy45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9yaWdodF9lbmRfY29uZmlybV95ZWxsb3cuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfcmlnaHRfZW5kX25vcm1hbC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX3JpZ2h0X2VuZF9ub3JtYWwuOS5wbmcKaW5kZXggNGM2MDhlZS4uMmU2Y2EyZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfcmlnaHRfZW5kX25vcm1hbC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2Jhcl9yaWdodF9lbmRfbm9ybWFsLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfYmFyX3JpZ2h0X2VuZF9wcmVzc2VkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfcmlnaHRfZW5kX3ByZXNzZWQuOS5wbmcKaW5kZXggOGJkZmQ4NC4uZjQxNzUwZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfcmlnaHRfZW5kX3ByZXNzZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9iYXJfcmlnaHRfZW5kX3ByZXNzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1fZ3JheS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2xlZnRfY29uZmlybV9ncmF5LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDNkY2U0NTEuLmU4NTQ0ZmYKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1fZ3JheS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1fZ3JheS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1fZ3JlZW4ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1fZ3JlZW4ucG5nCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggODI5YjE0Ni4uZDBiYThmOAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2xlZnRfY29uZmlybV9ncmVlbi5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1fZ3JlZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfbGVmdF9jb25maXJtX3JlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2xlZnRfY29uZmlybV9yZWQucG5nCmluZGV4IGYyY2ViMmUuLjUxODhjODYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfbGVmdF9jb25maXJtX3JlZC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1fcmVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2xlZnRfY29uZmlybV95ZWxsb3cucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1feWVsbG93LnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDVhMjkyNjIuLjg2MWUxN2EKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9sZWZ0X2NvbmZpcm1feWVsbG93LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX2xlZnRfY29uZmlybV95ZWxsb3cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfbGVmdF9ub3JtYWwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9sZWZ0X25vcm1hbC5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBlYjkxZTk3Li43YWYxYjg1Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfbGVmdF9ub3JtYWwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfbGVmdF9ub3JtYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfbGVmdF9wcmVzc2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfbGVmdF9wcmVzc2VkLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDk5NTE5OTIuLmI3NmU4M2UKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9sZWZ0X3ByZXNzZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfbGVmdF9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX3JpZ2h0X2NvbmZpcm1fZ3JheS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX3JpZ2h0X2NvbmZpcm1fZ3JheS5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBkNDQ2NDgwLi44MTRhNTBkCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV9ncmF5LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX3JpZ2h0X2NvbmZpcm1fZ3JheS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9yaWdodF9jb25maXJtX2dyZWVuLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV9ncmVlbi5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA5NmQ3YWNiLi5jZjE1N2ZjCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV9ncmVlbi5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9yaWdodF9jb25maXJtX2dyZWVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX3JpZ2h0X2NvbmZpcm1fcmVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV9yZWQucG5nCmluZGV4IDJlMWUxMDUuLjc0ZjI5MzUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV9yZWQucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV9yZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV95ZWxsb3cucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9yaWdodF9jb25maXJtX3llbGxvdy5wbmcKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA4MjI0YzM4Li42NjU1NzMxCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV95ZWxsb3cucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfcmlnaHRfY29uZmlybV95ZWxsb3cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfcmlnaHRfbm9ybWFsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfcmlnaHRfbm9ybWFsLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGYyMTEzZjIuLjQ3OWM5YTUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9yaWdodF9ub3JtYWwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2pvZ190YWJfcmlnaHRfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX3JpZ2h0X3ByZXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9yaWdodF9wcmVzc2VkLnBuZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDY1Y2Q1MWUuLjQ1NGFhZjIKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvam9nX3RhYl9yaWdodF9wcmVzc2VkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9qb2dfdGFiX3JpZ2h0X3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FjNzFiMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0X2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRlZGZmZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0X2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZC45LnBuZwppbmRleCBiZjk3MGIwLi42MGYxOWZlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZF9saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzk5MjYxMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZF9saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXMuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXMuOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZTI0MTU4Li4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1cy45LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxZjE5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxZjE5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX3NlbGVjdGVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfc2VsZWN0ZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTViMGMxZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX3NlbGVjdGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3MuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzLjkucG5nCmluZGV4IDVjYmIyNTEuLjc4MTc2NjcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3MuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzcy45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzc19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDZmYzY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzc19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCmluZGV4IDAyYjRlOWEuLjE1MzFkOWQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmNmY0OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGFjMWUzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZF9saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDg2MTk0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21lbnVfYmFja2dyb3VuZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21lbnVfYmFja2dyb3VuZC45LnBuZwppbmRleCBlZTk5NTgzLi45ZjE2ZGY5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9tZW51X2JhY2tncm91bmQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWVudV9iYWNrZ3JvdW5kLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21lbnVfYmFja2dyb3VuZF9maWxsX3BhcmVudF93aWR0aC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21lbnVfYmFja2dyb3VuZF9maWxsX3BhcmVudF93aWR0aC45LnBuZwppbmRleCBkMzY4OTgzLi5kYTMwMTFiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9tZW51X2JhY2tncm91bmRfZmlsbF9wYXJlbnRfd2lkdGguOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWVudV9iYWNrZ3JvdW5kX2ZpbGxfcGFyZW50X3dpZHRoLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfZm9jdXMuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9taW5pdGFiX2x0X2ZvY3VzLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNWM1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9taW5pdGFiX2x0X2ZvY3VzLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfcHJlc3MuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9taW5pdGFiX2x0X3ByZXNzLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNjY1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9taW5pdGFiX2x0X3ByZXNzLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfc2VsZWN0ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9taW5pdGFiX2x0X3NlbGVjdGVkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZmEyN2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9taW5pdGFiX2x0X3NlbGVjdGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfdW5zZWxlY3RlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfdW5zZWxlY3RlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDUxY2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWluaXRhYl9sdF91bnNlbGVjdGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfdW5zZWxlY3RlZF9wcmVzcy45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfdW5zZWxlY3RlZF9wcmVzcy45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTQ0NGRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWluaXRhYl9sdF91bnNlbGVjdGVkX3ByZXNzLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL25hdl9kaXZpZGVyLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL25hdl9kaXZpZGVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTQxM2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbmF2X2RpdmlkZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrY29udGFjdF9ub2JhZGdlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvcXVpY2tjb250YWN0X25vYmFkZ2UuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlNzQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrY29udGFjdF9ub2JhZGdlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaXRlbV9hcHBfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2l0ZW1fYXBwX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCmluZGV4IGJkY2IzNzguLmMwNzk2MTUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaXRlbV9hcHBfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNiYXJfYmFja2dyb3VuZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c2Jhcl9iYWNrZ3JvdW5kLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViN2MxYTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNiYXJfYmFja2dyb3VuZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90YWJfYXJyb3dfbGVmdF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGFiX2Fycm93X2xlZnRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjhiYWZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGFiX2Fycm93X2xlZnRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90YWJfYXJyb3dfbGVmdF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RhYl9hcnJvd19sZWZ0X2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMjI1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90YWJfYXJyb3dfbGVmdF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90YWJfYXJyb3dfcmlnaHRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RhYl9hcnJvd19yaWdodF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhODAwNmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90YWJfYXJyb3dfcmlnaHRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90YWJfYXJyb3dfcmlnaHRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90YWJfYXJyb3dfcmlnaHRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhYWU0NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RhYl9hcnJvd19yaWdodF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90YWJfZGl2aWRlcl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGFiX2RpdmlkZXJfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWQ3YjhiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGFiX2RpdmlkZXJfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90YWJfZGl2aWRlcl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RhYl9kaXZpZGVyX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OGIyYjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90YWJfZGl2aWRlcl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90YWJfc2VsZWN0b3JfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGFiX3NlbGVjdG9yX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGQzMGRmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGFiX3NlbGVjdG9yX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1ZjM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGNjNzZmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWYwYzcxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZTMxMDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzZkNDA2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNmU5NTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2N2Q5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjlhZmZkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VhcmNoX2RlZmF1bHRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3NlYXJjaF9kZWZhdWx0X2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTQ5OTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3NlYXJjaF9kZWZhdWx0X2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VhcmNoX2RlZmF1bHRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9zZWFyY2hfZGVmYXVsdF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjAzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VhcmNoX2RlZmF1bHRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VhcmNoX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9zZWFyY2hfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MDQzOWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VhcmNoX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VhcmNoX3NlbGVjdGVkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VhcmNoX3NlbGVjdGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBlMjZlMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9zZWFyY2hfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjY3ZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OWFmZmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbm9kcGkvcGxhdGxvZ28uanBnIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW5vZHBpL3BsYXRsb2dvLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU3NzgwYy4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbm9kcGkvcGxhdGxvZ28uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW5vZHBpL3BsYXRsb2dvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1ub2RwaS9wbGF0bG9nby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVhZjM1NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1ub2RwaS9wbGF0bG9nby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9kZWZhdWx0X3dhbGxwYXBlci5qcGcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2RlZmF1bHRfd2FsbHBhcGVyLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWNhZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9kZWZhdWx0X3dhbGxwYXBlci5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfYWxhcm0ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfYWxhcm0ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNmE4MjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9hbGFybS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfY2hhcmdpbmcucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfY2hhcmdpbmcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZWY1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9jaGFyZ2luZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfbG9jay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9sb2NrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDVlMjE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfbG9jay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfbG93X2JhdHRlcnkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfbG93X2JhdHRlcnkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNDliNjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9sb3dfYmF0dGVyeS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS91bmxvY2tfZGVmYXVsdC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL3VubG9ja19kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTQ0MWMwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS91bmxvY2tfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS91bmxvY2tfaGFsby5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL3VubG9ja19oYWxvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWIwNTI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS91bmxvY2tfaGFsby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS91bmxvY2tfcmluZy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL3VubG9ja19yaW5nLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWM2ZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS91bmxvY2tfcmluZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS91bmxvY2tfd2F2ZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL3VubG9ja193YXZlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWJmYTI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS91bmxvY2tfd2F2ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfYmFja2dyb3VuZC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9iYWNrZ3JvdW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTI5ZDdmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfYmFja2dyb3VuZC54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGdyYWRpZW50CisgICAgICAgIGFuZHJvaWQ6c3RhcnRDb2xvcj0iI2ZmZDFkMmQ0IgorICAgICAgICBhbmRyb2lkOmVuZENvbG9yPSIjZmY4NTg3OGEiCisgICAgICAgIGFuZHJvaWQ6YW5nbGU9IjI3MCIgLz4KKzwvc2hhcGU+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9jb250ZXh0X2JhY2tncm91bmQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfY29udGV4dF9iYWNrZ3JvdW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzg5ODk4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfY29udGV4dF9iYWNrZ3JvdW5kLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8Z3JhZGllbnQKKyAgICAgICAgYW5kcm9pZDpzdGFydENvbG9yPSIjZmYwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6Y2VudGVyQ29sb3I9IiNmZmQxZDJkNCIKKyAgICAgICAgYW5kcm9pZDplbmRDb2xvcj0iI2ZmODU4NzhhIgorICAgICAgICBhbmRyb2lkOmFuZ2xlPSIyNzAiIC8+Cis8L3NoYXBlPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfZGl2aWRlci54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9kaXZpZGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTQzMDlmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfZGl2aWRlci54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGdyYWRpZW50CisgICAgICAgIGFuZHJvaWQ6c3RhcnRDb2xvcj0iI2ZmZTFlMmU0IgorICAgICAgICBhbmRyb2lkOmVuZENvbG9yPSIjZmY5NTk3OWEiCisgICAgICAgIGFuZHJvaWQ6YW5nbGU9IjI3MCIgLz4KKzwvc2hhcGU+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aXZhdGVkX2JhY2tncm91bmQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGl2YXRlZF9iYWNrZ3JvdW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTJmYmExCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGl2YXRlZF9iYWNrZ3JvdW5kLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2FjdGl2YXRlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBjb2xvci90cmFuc3BhcmVudCIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aXZhdGVkX2JhY2tncm91bmRfbGlnaHQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGl2YXRlZF9iYWNrZ3JvdW5kX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDU2ODFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGl2YXRlZF9iYWNrZ3JvdW5kX2xpZ2h0LnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2FjdGl2YXRlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZF9saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAY29sb3IvdHJhbnNwYXJlbnQiIC8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9jaGVja19ob2xvX2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9jaGVja19ob2xvX2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkODVkNzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX2NoZWNrX2hvbG9fZGFyay54bWwKQEAgLTAsMCArMSw2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8IS0tIEVuYWJsZWQgc3RhdGVzIC0tPgorICAgICAgICAKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfaG9sb19kYXJrIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fZGFyayIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fZGFyayIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25faG9sb19kYXJrIiAvPgorCisKKyAgICA8IS0tIERpc2FibGVkIHN0YXRlcyAtLT4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fZGFyayIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyayIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fZGFyayIgLz4KKworPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fY2hlY2tfaG9sb19saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX2NoZWNrX2hvbG9fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYjE2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX2NoZWNrX2hvbG9fbGlnaHQueG1sCkBAIC0wLDAgKzEsNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPCEtLSBFbmFibGVkIHN0YXRlcyAtLT4KKyAgICAgICAgCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9ob2xvX2xpZ2h0IiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0IiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9ob2xvX2xpZ2h0IiAvPgorCisKKyAgICA8IS0tIERpc2FibGVkIHN0YXRlcyAtLT4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2xpZ2h0IiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19saWdodCIgLz4KKworPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fZGVmYXVsdF9ob2xvX2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9kZWZhdWx0X2hvbG9fZGFyay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI1MDA3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fZGVmYXVsdF9ob2xvX2RhcmsueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fZGVmYXVsdF9ub3JtYWxfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2RlZmF1bHRfZGlzYWJsZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fZGVmYXVsdF9wcmVzc2VkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9kZWZhdWx0X2ZvY3VzZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9kZWZhdWx0X25vcm1hbF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2RlZmF1bHRfZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0KKyAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fZGVmYXVsdF9kaXNhYmxlZF9ob2xvX2RhcmsiIC8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9yYWRpb19ob2xvX2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9yYWRpb19ob2xvX2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ODRmNmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX3JhZGlvX2hvbG9fZGFyay54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29uX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29mZl9ob2xvX2RhcmsiIC8+CisgICAgICAgICAgCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2RhcmsiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vbl9ob2xvX2RhcmsiIC8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9yYWRpb19ob2xvX2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fcmFkaW9faG9sb19saWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxNTA4YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fcmFkaW9faG9sb19saWdodC54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29uX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfaG9sb19saWdodCIgLz4KKyAgICAgICAgICAKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0IiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0IiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fcmFkaW9fb25faG9sb19saWdodCIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX3RvZ2dsZV9ob2xvX2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl90b2dnbGVfaG9sb19kYXJrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NThjYTllCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl90b2dnbGVfaG9sb19kYXJrLnhtbApAQCAtMCwwICsxLDUwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29uX25vcm1hbF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3RvZ2dsZV9vbl9wcmVzc2VkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3RvZ2dsZV9vbl9mb2N1c2VkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl90b2dnbGVfb25fbm9ybWFsX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiICBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2ZvY3VzZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2hvbG9fZGFyayIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29mZl9ub3JtYWxfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3RvZ2dsZV9vZmZfZGlzYWJsZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl90b2dnbGVfb2ZmX3ByZXNzZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3RvZ2dsZV9vZmZfZm9jdXNlZF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3RvZ2dsZV9vZmZfbm9ybWFsX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbQorICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl90b2dnbGVfb2ZmX2Rpc2FibGVkX2hvbG9fZGFyayIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX3RvZ2dsZV9ob2xvX2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fdG9nZ2xlX2hvbG9fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZjEwMTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX3RvZ2dsZV9ob2xvX2xpZ2h0LnhtbApAQCAtMCwwICsxLDUwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29uX25vcm1hbF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29uX3ByZXNzZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3RvZ2dsZV9vbl9mb2N1c2VkX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29uX25vcm1hbF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl90b2dnbGVfb25fZGlzYWJsZWRfZm9jdXNlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29uX2Rpc2FibGVkX2hvbG9fbGlnaHQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3RvZ2dsZV9vZmZfbm9ybWFsX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl90b2dnbGVfb2ZmX3ByZXNzZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl90b2dnbGVfb2ZmX2ZvY3VzZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29mZl9ub3JtYWxfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9mb2N1c2VkX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0KKyAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fdG9nZ2xlX29mZl9kaXNhYmxlZF9ob2xvX2xpZ2h0IiAvPgorPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9jYWJfaWNfY2xvc2VfaG9sby54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvY2FiX2ljX2Nsb3NlX2hvbG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYWY3Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvY2FiX2ljX2Nsb3NlX2hvbG8ueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvY2FiX2ljX2Nsb3NlX3ByZXNzZWRfaG9sbyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2NhYl9pY19jbG9zZV9mb2N1c2VkX2hvbG8iIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2NhYl9pY19jbG9zZV9ub3JtYWxfaG9sbyIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF9xdWVyeV9iYWNrZ3JvdW5kLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9lZGl0X3F1ZXJ5X2JhY2tncm91bmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NDZmOGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF9xdWVyeV9iYWNrZ3JvdW5kLnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvZWRpdF9xdWVyeV9iYWNrZ3JvdW5kX25vcm1hbCIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvZWRpdF9xdWVyeV9iYWNrZ3JvdW5kX3ByZXNzZWQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2VkaXRfcXVlcnlfYmFja2dyb3VuZF9wcmVzc2VkIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvZWRpdF9xdWVyeV9iYWNrZ3JvdW5kX3NlbGVjdGVkIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2VkaXRfcXVlcnlfYmFja2dyb3VuZF9ub3JtYWwiIC8+CisKKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fZGFyay54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fZGFyay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdkMjRmZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9lZGl0X3RleHRfaG9sb19kYXJrLnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fZGFyayIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9lZGl0X3RleHRfaG9sb19saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZTM5ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fbGlnaHQueG1sCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19saWdodCIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdGVkX2JhY2tncm91bmQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0ZWRfYmFja2dyb3VuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiNjU5NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdGVkX2JhY2tncm91bmQueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgICBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9zZWxlY3RlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIiAgYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkIiAvPgorCis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0ZWRfYmFja2dyb3VuZF9saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3RlZF9iYWNrZ3JvdW5kX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWZjMWNiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0ZWRfYmFja2dyb3VuZF9saWdodC54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiAgIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX3NlbGVjdGVkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0iZmFsc2UiICBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWRfbGlnaHQiIC8+CisKKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmQueG1sCmluZGV4IGJjYTk5NmMuLjBhNTExNTIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmQueG1sCkBAIC0xNiwyMiArMTYsMTQgQEAKIAogPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CiAKLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKLSAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGNvbG9yL3RyYW5zcGFyZW50IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOmRyYXdhYmxlPSJAY29sb3IvdHJhbnNwYXJlbnQiIC8+CiAKICAgICA8IS0tIEV2ZW4gdGhvdWdoIHRoZXNlIHR3byBwb2ludCB0byB0aGUgc2FtZSByZXNvdXJjZSwgaGF2ZSB0d28gc3RhdGVzIHNvIHRoZSBkcmF3YWJsZSB3aWxsIGludmFsaWRhdGUgaXRzZWxmIHdoZW4gY29taW5nIG91dCBvZiBwcmVzc2VkIHN0YXRlLiAtLT4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiCi0gICAgICAgIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiCi0gICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQiIC8+Ci0KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF90cmFuc2l0aW9uIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF90cmFuc2l0aW9uIiAvPgotCi0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgotICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzIiAvPgotCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZCIgLz4KKyAgICA8aXRlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdCIgLz4KKyAgICAKIDwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNzk4MGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xpZ2h0LnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGNvbG9yL3RyYW5zcGFyZW50IiAvPgorCisgICAgPCEtLSBFdmVuIHRob3VnaCB0aGVzZSB0d28gcG9pbnQgdG8gdGhlIHNhbWUgcmVzb3VyY2UsIGhhdmUgdHdvIHN0YXRlcyBzbyB0aGUgZHJhd2FibGUgd2lsbCBpbnZhbGlkYXRlIGl0c2VsZiB3aGVuIGNvbWluZyBvdXQgb2YgcHJlc3NlZCBzdGF0ZS4gLS0+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZF9saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbl9saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbl9saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9saWdodCIgLz4KKyAgICA8aXRlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdF9saWdodCIgLz4KKworPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbl9saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3RyYW5zaXRpb25fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNGY4OTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3RyYW5zaXRpb25fbGlnaHQueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8dHJhbnNpdGlvbiB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkX2xpZ2h0IiAgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAYW5kcm9pZDpkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzX2xpZ2h0IiAgLz4KKzwvdHJhbnNpdGlvbj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9taW5pdGFiX2x0LnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9taW5pdGFiX2x0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWVhOTdjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL21pbml0YWJfbHQueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbWluaXRhYl9sdF9wcmVzcyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9taW5pdGFiX2x0X3NlbGVjdGVkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbWluaXRhYl9sdF91bnNlbGVjdGVkX3ByZXNzIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9taW5pdGFiX2x0X3Vuc2VsZWN0ZWQiIC8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMmZhMGUuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0vKiBidWJibGVfd2l0aF9jaGF0cy54bWwKLSoqCi0qKiBDb3B5cmlnaHQgMjAwOSwgR29vZ2xlIEluYy4KLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0tLT4KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX3ByZXNzZWQiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX2hpZ2hsaWdodCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9oaWdobGlnaHQiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX25vcm1hbCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2Vfbm9ybWFsIiAvPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9oaWdobGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2VfaGlnaGxpZ2h0LjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGY1MGIzLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9oaWdobGlnaHQuOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2Vfbm9ybWFsLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX25vcm1hbC45LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFjYzlkYy4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2Vfbm9ybWFsLjkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX3ByZXNzZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2VfcHJlc3NlZC45LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUyMmM4Ny4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2VfcHJlc3NlZC45LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQtcG9ydC9wcmVmZXJlbmNlX2hlYWRlcl9pdGVtLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQtcG9ydC9wcmVmZXJlbmNlX2hlYWRlcl9pdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzc2YzhlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC1wb3J0L3ByZWZlcmVuY2VfaGVhZGVyX2l0ZW0ueG1sCkBAIC0wLDAgKzEsNjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gTGF5b3V0IG9mIGEgaGVhZGVyIGl0ZW0gaW4gUHJlZmVyZW5jZUFjdGl2aXR5LiAtLT4KKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOm1pbkhlaWdodD0iOTZkcCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvYWN0aXZhdGVkQmFja2dyb3VuZEluZGljYXRvciIKKyAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iP2FuZHJvaWQ6YXR0ci9zY3JvbGxiYXJTaXplIj4KKyAgICAKKyAgICA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI0ZGlwIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iNGRpcCI+CisgICAgCisgICAgICAgIDxJbWFnZVZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMmRpcCIgLz4KKyAgICAKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkArYW5kcm9pZDppZC90aXRsZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgICAgICAgICAgYW5kcm9pZDpmYWRpbmdFZGdlPSJob3Jpem9udGFsIiAvPgorICAgIAorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL3N1bW1hcnkiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCisgICAgICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIyIiAvPgorICAgIAorICAgIDwvTGluZWFyTGF5b3V0PgorPC9GcmFtZUxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTYyOWY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmQueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9yZXMvbGF5b3V0L2tleWd1YXJkLnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIAorICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjIwZGlwIgorICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMjBkaXAiCisgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjIwZGlwIgorICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iMjBkaXAiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiIAorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjZmYwMDAwMDAiPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGFiZWwiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE2c3AiIAorICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIgCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGRkYiIAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9rZXlndWFyZF9sYWJlbF90ZXh0IiAvPgorPC9MaW5lYXJMYXlvdXQ+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9nbG9naW5fdW5sb2NrLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9nbG9naW5fdW5sb2NrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTQ2NTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX2dsb2dpbl91bmxvY2sueG1sCkBAIC0wLDAgKzEsMTI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIikKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpjb2xvci9iYWNrZ3JvdW5kX2RhcmsiCisgICAgICAgID4KKyAgICA8U2Nyb2xsVmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBweCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hYm92ZT0iQCtpZC9lbWVyZ2VuY3lDYWxsIj4KKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0IAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgID4KKyAgICAgICAgCisgICAgICAgICAgICA8VGV4dFZpZXcgCisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90b3BIZWFkZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjY0ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjRkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL2ljX2xvY2tfaWRsZV9sb2NrIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI1ZGlwIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgIAorICAgICAgICAgICAgPCEtLSBzcGFjZXIgYmVsb3cgaGVhZGVyIC0tPgorICAgICAgICAgICAgPFZpZXcKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NwYWNlclRvcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMWRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3RvcEhlYWRlciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfZGFyayIvPgorICAgICAgICAKKyAgICAgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5zdHJ1Y3Rpb25zIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkAraWQvc3BhY2VyVG9wIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI5ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBhbmRyb2lkOnN0cmluZy9sb2Nrc2NyZWVuX2dsb2dpbl9pbnN0cnVjdGlvbnMiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgCisgICAgICAgICAgICA8RWRpdFRleHQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2xvZ2luIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9pbnN0cnVjdGlvbnMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjdkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjdkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAYW5kcm9pZDpzdHJpbmcvbG9ja3NjcmVlbl9nbG9naW5fdXNlcm5hbWVfaGludCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0idGV4dEVtYWlsQWRkcmVzcyIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICAKKyAgICAgICAgICAgIDxFZGl0VGV4dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcGFzc3dvcmQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2xvZ2luIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTVkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iN2RpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iN2RpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0idGV4dFBhc3N3b3JkIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iQGFuZHJvaWQ6c3RyaW5nL2xvY2tzY3JlZW5fZ2xvZ2luX3Bhc3N3b3JkX2hpbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpuZXh0Rm9jdXNSaWdodD0iQCtpZC9vayIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5leHRGb2N1c0Rvd249IkAraWQvb2siCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgCisgICAgICAgICAgICA8IS0tIG9rIGJlbG93IHBhc3N3b3JkLCBhbGlnbmVkIHRvIHJpZ2h0IG9mIHNjcmVlbiAtLT4KKyAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL29rIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI4NWRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3Bhc3N3b3JkIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iN2RpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iN2RpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQGFuZHJvaWQ6c3RyaW5nL2xvY2tzY3JlZW5fZ2xvZ2luX3N1Ym1pdF9idXR0b24iCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgCisgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisgICAgPC9TY3JvbGxWaWV3PgorICAgIAorICAgIDwhLS0gc3BhY2VyIGFib3ZlIGVtZXJnZW5jeSBjYWxsIC0tPgorICAgIDxWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMWRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI0ZGlwIgorCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrIi8+CisKKyAgICA8IS0tIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiBhdCBib3R0b20gY2VudGVyIC0tPgorICAgIDxCdXR0b24KKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL2ljX2VtZXJnZW5jeSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjhkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQGFuZHJvaWQ6c3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCisgICAgICAgIC8+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX2xvY2sueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX2xvY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczM2EzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fbG9jay54bWwKQEAgLTAsMCArMSwyMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorICAgICAgICAKKzwhLS0gVGhpcyBpcyB0aGUgZ2VuZXJhbCBsb2NrIHNjcmVlbiB3aGljaCBzaG93cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgc3RhdGUgb2YgdGhlIGRldmljZSwgYXMgd2VsbCBhcyBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGdldCBwYXN0IGl0CisgIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIGRldmljZS4gIEl0IGlzIHRoZSBzYW1lIGZvciBsYW5kc2NhcGUKKyAgYW5kIHBvcnRyYWl0Li0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b20iCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNmZjgwMDAwMCIKKyAgICAgICAgPgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxNWRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTVkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxNWRpcCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIyMGRpcCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIyMGRpcCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9wb3B1cF9mdWxsX2RhcmsiCisgICAgICAgID4KKworICAgICAgICA8IS0tIHdoZW4gc2ltIGlzIHByZXNlbnQgLS0+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2hlYWRlclNpbU9rMSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzRzcCIvPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9oZWFkZXJTaW1PazIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjM0c3AiLz4KKworICAgICAgICA8IS0tIHdoZW4gc2ltIGlzIG1pc3NpbmcgLyBsb2NrZWQgLS0+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2hlYWRlclNpbUJhZDEiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQGFuZHJvaWQ6c3RyaW5nL2xvY2tzY3JlZW5fbWlzc2luZ19zaW1fbWVzc2FnZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIvPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9oZWFkZXJTaW1CYWQyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI3ZGlwIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI3ZGlwIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBhbmRyb2lkOnN0cmluZy9sb2Nrc2NyZWVuX21pc3Npbmdfc2ltX2luc3RydWN0aW9ucyIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIvPgorCisgICAgICAgIDwhLS0gc3BhY2VyIGFmdGVyIGNhcnJpZXIgaW5mbyAvIHNpbSBtZXNzYWdlcyAtLT4KKyAgICAgICAgPFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjFkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrIi8+CisKKyAgICAgICAgPCEtLSB0aW1lIGFuZCBkYXRlIC0tPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aW1lIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzNHNwIi8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvZGF0ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIvPgorCisgICAgICAgIDwhLS0gc3BhY2VyIGFmdGVyIHRpbWUgYW5kIGRhdGUgLS0+CisgICAgICAgIDxWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfZGFyayIKKyAgICAgICAgICAgICAgICAvPgorCisgICAgICAgIDwhLS0gYmF0dGVyeSBpbmZvIC0tPgorICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvYmF0dGVyeUluZm8iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICA+CisKKyAgICAgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9iYXR0ZXJ5SW5mb0ljb24iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iNmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhc2VsaW5lQWxpZ25lZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2JhdHRlcnlJbmZvVGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDwhLS0gc3BhY2VyIGFmdGVyIGJhdHRlcnkgaW5mbyAtLT4KKyAgICAgICAgPFZpZXcgYW5kcm9pZDppZD0iQCtpZC9iYXR0ZXJ5SW5mb1NwYWNlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjFkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrIgorICAgICAgICAgICAgICAgIC8+CisKKyAgICAgICAgPCEtLSBuZXh0IGFsYXJtIGluZm8gLS0+CisKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL25leHRBbGFybUluZm8iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICA+CisKKyAgICAgICAgICAgIDxJbWFnZVZpZXcKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFzZWxpbmVBbGlnbmVkPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19sb2NrX2lkbGVfYWxhcm0iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAvPgorCisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9uZXh0QWxhcm1UZXh0IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDwhLS0gc3BhY2VyIGFmdGVyIGFsYXJtIGluZm8gLS0+CisgICAgICAgIDxWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbmV4dEFsYXJtU3BhY2VyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsiLz4KKworICAgICAgICA8IS0tIGxvY2sgaWNvbiB3aXRoICdzY3JlZW4gbG9ja2VkJyBtZXNzYWdlCisgICAgICAgICAgICAgKHNob3duIHdoZW4gU0lNIGNhcmQgaXMgcHJlc2VudCkgLS0+CisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9zY3JlZW5Mb2NrZWRJbmZvIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgPgorCisgICAgICAgICAgICA8SW1hZ2VWaWV3CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iNmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhc2VsaW5lQWxpZ25lZD0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfbG9ja19pZGxlX2xvY2siCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAvPgorCisgICAgICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAYW5kcm9pZDpzdHJpbmcvbG9ja3NjcmVlbl9zY3JlZW5fbG9ja2VkIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8IS0tIG1lc3NhZ2UgYWJvdXQgaG93IHRvIHVubG9jaworICAgICAgICAgICAgIChzaG93biB3aGVuIFNJTSBjYXJkIGlzIHByZXNlbnQpIC0tPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9sb2NrSW5zdHJ1Y3Rpb25zIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI1ZGlwIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNHNwIi8+CisKKworICAgICAgICA8IS0tIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiBzaG93biB3aGVuIHNpbSBpcyBtaXNzaW5nIG9yIFBVS2QgLS0+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbEJ1dHRvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQGFuZHJvaWQ6c3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCisgICAgICAgICAgIC8+CisKKyAgICA8L0xpbmVhckxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX2xhbmRzY2FwZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfbGFuZHNjYXBlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmQ4N2EyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX2xhbmRzY2FwZS54bWwKQEAgLTAsMCArMSw5MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgPgorICAgIAorICAgIDwhLS0gbGVmdCBzaWRlOiBzdGF0dXMgYW5kIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiAtLT4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICA+CisgICAgICAgIDxpbmNsdWRlIGxheW91dD0iQGxheW91dC9rZXlndWFyZF9zY3JlZW5fc3RhdHVzX2xhbmQiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgCisgICAgPCEtLSByaWdodCBzaWRlOiBwYXNzd29yZCAtLT4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiPgorCisgICAgICAgIDwhLS0gUGFzc3dvcmQgZW50cnkgZmllbGQgLS0+CisgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkRW50cnkiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMzBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0ibm9ybWFsIgorICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9InRleHRQYXNzd29yZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRzcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3Bhc3N3b3JkX2ZpZWxkX2RlZmF1bHQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI2ZmZmZmZmZmIgorICAgICAgICAgICAgLz4KKworICAgICAgICA8IS0tIE51bWVyaWMga2V5Ym9hcmQgLS0+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuUGFzc3dvcmRFbnRyeUtleWJvYXJkVmlldyBhbmRyb2lkOmlkPSJAK2lkL2tleWJvYXJkIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjMzMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjYwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjMDAwMDAwMDAiCisgICAgICAgICAgICBhbmRyb2lkOmtleUJhY2tncm91bmQ9IkBkcmF3YWJsZS9idG5fa2V5Ym9hcmRfa2V5X2Z1bGx0cmFucyIKKyAgICAgICAgLz4KKyAgICAgICAgPCEtLSBBbHBoYW51bWVyaWMga2V5Ym9hcmQgLS0+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuUGFzc3dvcmRFbnRyeUtleWJvYXJkVmlldyBhbmRyb2lkOmlkPSJAK2lkL2tleWJvYXJkQWxwaGEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNDUwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyMzBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiMwMDAwMDAwMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5QmFja2dyb3VuZD0iQGRyYXdhYmxlL2J0bl9rZXlib2FyZF9rZXlfZnVsbHRyYW5zIgorICAgICAgICAvPgorCisgICAgICAgIDwhLS0gZW1lcmdlbmN5IGNhbGwgYnV0dG9uIC0tPgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2VtZXJnZW5jeUNhbGwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL2ljX2VtZXJnZW5jeSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCisgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1dpZGdldC5CdXR0b24uVHJhbnNwYXJlbnQiCisgICAgICAgIC8+CisKKyAgICA8L0xpbmVhckxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX3BvcnRyYWl0LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9wb3J0cmFpdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyN2U1OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9wb3J0cmFpdC54bWwKQEAgLTAsMCArMSw4OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICA+CisgICAgCisgICAgPCEtLSBsZWZ0IHNpZGU6IHN0YXR1cyBhbmQgZW1lcmdlbmN5IGNhbGwgYnV0dG9uIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgID4KKyAgICAgICAgPGluY2x1ZGUgbGF5b3V0PSJAbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfbGFuZCIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKyAgICAKKyAgICA8IS0tIHJpZ2h0IHNpZGU6IHBhc3N3b3JkIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciI+CisKKyAgICAgICAgPCEtLSBQYXNzd29yZCBlbnRyeSBmaWVsZCAtLT4KKyAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvcGFzc3dvcmRFbnRyeSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjMzMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJub3JtYWwiCisgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0idGV4dFBhc3N3b3JkIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNHNwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxMjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvcGFzc3dvcmRfZmllbGRfZGVmYXVsdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjZmZmZmZmZmYiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDwhLS0gTnVtZXJpYyBrZXlib2FyZCAtLT4KKyAgICAgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5QYXNzd29yZEVudHJ5S2V5Ym9hcmRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQva2V5Ym9hcmQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzMwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiMwMDAwMDAwMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5QmFja2dyb3VuZD0iQGRyYXdhYmxlL2J0bl9rZXlib2FyZF9rZXlfZnVsbHRyYW5zIgorICAgICAgICAvPgorICAgICAgICA8IS0tIEFscGhhbnVtZXJpYyBrZXlib2FyZCAtLT4KKyAgICAgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5QYXNzd29yZEVudHJ5S2V5Ym9hcmRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQva2V5Ym9hcmRBbHBoYSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI0NTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjIzMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzAwMDAwMDAwIgorICAgICAgICAgICAgYW5kcm9pZDprZXlCYWNrZ3JvdW5kPSJAZHJhd2FibGUvYnRuX2tleWJvYXJkX2tleV9mdWxsdHJhbnMiCisgICAgICAgIC8+CisKKyAgICAgICAgPCEtLSBlbWVyZ2VuY3kgY2FsbCBidXR0b24gLS0+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAZHJhd2FibGUvaWNfZW1lcmdlbmN5IgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfY2FsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgLz4KKworICAgIDwvTGluZWFyTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3NpbV9waW5fbGFuZHNjYXBlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9zaW1fcGluX2xhbmRzY2FwZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjYmU1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9zaW1fcGluX2xhbmRzY2FwZS54bWwKQEAgLTAsMCArMSwxMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPFJlbGF0aXZlTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6Y29sb3IvYmFja2dyb3VuZF9kYXJrIgorICAgICAgICA+CisKKyAgCisgICAgPCEtLSByaWdodCBzaWRlIC0tPgorICAgIDwhLS0gaGVhZGVyIHRleHQgKCdFbnRlciBQaW4gQ29kZScpIC0tPgorICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2hlYWRlclRleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2Fib3ZlPSJAK2lkL2NhcnJpZXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlckhvcml6b250YWw9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNHNwIgorICAgICAgICAgICAgLz4KKworICAgIDwhLS0gQ2FycmllciBpbmZvIC0tPgorICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2NhcnJpZXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2Fib3ZlPSJAK2lkL3BpbkRpc3BsYXlHcm91cCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI5ZGlwIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnR8Ym90dG9tIgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgIC8+CisKKyAgICA8IS0tIGRpc3BsYXlzIGRvdHMgYXMgdXNlciBlbnRlcnMgcGluIC0tPgorICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9waW5EaXNwbGF5R3JvdXAiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlckluUGFyZW50PSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDphZGRTdGF0ZXNGcm9tQ2hpbGRyZW49InRydWUiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOmJhc2VsaW5lQWxpZ25lZD0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjMwZGlwIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2VkaXRfdGV4dCIKKyAgICA+CisKKyAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvcGluRGlzcGxheSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIxIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAbnVsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyc3AiCisgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0idGV4dFBhc3N3b3JkIgorICAgICAgICAgICAgLz4KKworICAgICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9iYWNrc3BhY2UiCisgICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBhbmRyb2lkOmRyYXdhYmxlL2ljX2lucHV0X2RlbGV0ZSIKKyAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMmRpcCIKKyAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMmRpcCIKKyAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjJkaXAiCisgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgIAorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjhkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIj4KKworICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvb2siCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBhbmRyb2lkOnN0cmluZy9vayIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICAgICAgLz4KKworICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQGFuZHJvaWQ6c3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlckhvcml6b250YWw9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAZHJhd2FibGUvaWNfZW1lcmdlbmN5IgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjhkaXAiCisgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvUmVsYXRpdmVMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fc2ltX3Bpbl9wb3J0cmFpdC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fc2ltX3Bpbl9wb3J0cmFpdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5MTQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9zaW1fcGluX3BvcnRyYWl0LnhtbApAQCAtMCwwICsxLDExOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6Y29sb3IvYmFja2dyb3VuZF9kYXJrIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiPgorCisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3RvcERpc3BsYXlHcm91cCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKworICAgICAgICA8IS0tIGhlYWRlciB0ZXh0ICgnRW50ZXIgUGluIENvZGUnKSAtLT4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaGVhZGVyVGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIi8+CisKKyAgICAgICAgPCEtLSBDYXJyaWVyIGluZm8gLS0+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2NhcnJpZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIi8+CisKKyAgICAgICAgPCEtLSBwYXNzd29yZCBlbnRyeSAtLT4KKyAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9lZGl0X3RleHQiPgorCisgICAgICAgICAgICA8IS0tIGRpc3BsYXlzIGRvdHMgYXMgdXNlciBlbnRlcnMgcGluIC0tPgorICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvcGluRGlzcGxheSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDptYXhMaW5lcz0iMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTGFyZ2VJbnZlcnNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJ0ZXh0UGFzc3dvcmQiCisgICAgICAgICAgICAvPgorCisgICAgICAgICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9iYWNrc3BhY2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBhbmRyb2lkOmRyYXdhYmxlL2ljX2lucHV0X2RlbGV0ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSItM2RpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209Ii0zZGlwIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxpbmNsdWRlCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQva2V5UGFkIgorICAgICAgICBsYXlvdXQ9IkBhbmRyb2lkOmxheW91dC90d2VsdmVfa2V5X2VudHJ5IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3RvcERpc3BsYXlHcm91cCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxMGRpcCIKKyAgICAvPgorCisgICAgPCEtLSBzcGFjZXIgYmVsb3cga2V5cGFkIC0tPgorICAgIDxWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3BhY2VyQm90dG9tIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjFkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWJvdmU9IkBpZC9lbWVyZ2VuY3lDYWxsIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrIgorICAgIC8+CisKKyAgICA8IS0tIFRoZSBlbWVyZ2VuY3kgYnV0dG9uIHNob3VsZCB0YWtlIHRoZSByZXN0IG9mIHRoZSBzcGFjZSBhbmQgYmUgY2VudGVyZWQgdmVydGljYWxseSAtLT4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorCisgICAgICAgIDwhLS0gZW1lcmdlbmN5IGNhbGwgYnV0dG9uIC0tPgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2VtZXJnZW5jeUNhbGwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfZW1lcmdlbmN5IgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBhbmRyb2lkOnN0cmluZy9sb2Nrc2NyZWVuX2VtZXJnZW5jeV9jYWxsIgorICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfbGFuZC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fc3RhdHVzX2xhbmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ODk4NjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fc3RhdHVzX2xhbmQueG1sCkBAIC0wLDAgKzEsMTI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorKioKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIikKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSBTdGF0dXMgdG8gc2hvdyBvbiB0aGUgbGVmdCBzaWRlIG9mIGxvY2sgc2NyZWVuIC0tPgorPExpbmVhckxheW91dAorICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTQwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjIwZGlwIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCisgICAgICAgID4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NhcnJpZXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxN3NwIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIzMmRpcCIKKyAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKKyAgICAgICAgLz4KKworICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuRGlnaXRhbENsb2NrIGFuZHJvaWQ6aWQ9IkAraWQvdGltZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZGlwIgorICAgICAgICA+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGltZURpc3BsYXkiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjEyMHNwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93Q29sb3I9IiNDMDAwMDAwMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93RHg9IjAiCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd0R5PSIwIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dSYWRpdXM9IjMuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNmRpcCIKKyAgICAgICAgICAgIC8+CisKKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hbV9wbSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL3RpbWVEaXNwbGF5IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25CYXNlbGluZT0iQGlkL3RpbWVEaXNwbGF5IgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMHNwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd0NvbG9yPSIjQzAwMDAwMDAiCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd0R4PSIwIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dEeT0iMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93UmFkaXVzPSIzLjAiCisgICAgICAgICAgICAvPgorCisgICAgPC9jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuRGlnaXRhbENsb2NrPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZGF0ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvdGltZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI1ZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMnNwIgorICAgICAgICAvPgorCisgICAgPCEtLSB1c2VkIGZvciBpbnN0cnVjdGlvbnMgc3VjaCBhcyAiZHJhdyBwYXR0ZXJuIHRvIHVubG9jayIsIHRoZSBuZXh0IGFsYXJtLCBhbmQgY2hhcmdpbmcKKyAgICAgICAgIHN0YXR1cy4gIC0tPgorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1czIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjRkaXAiCisgICAgICAgIC8+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzMSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTVkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyc3AiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIC8+CisgICAgICAgIAorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Byb3BlcnR5T2YiCisgICAgICAgIGFuZHJvaWQ6bGluZVNwYWNpbmdFeHRyYT0iOGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIyc3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iaW52aXNpYmxlIgorICAgICAgICAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fc3RhdHVzX3BvcnQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19wb3J0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTg5ODYyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19wb3J0LnhtbApAQCAtMCwwICsxLDEyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyoqCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gU3RhdHVzIHRvIHNob3cgb24gdGhlIGxlZnQgc2lkZSBvZiBsb2NrIHNjcmVlbiAtLT4KKzxMaW5lYXJMYXlvdXQKKyAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjE0MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIyMGRpcCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICA+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jYXJyaWVyIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTdzcCIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMzJkaXAiCisgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgIC8+CisKKyAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkRpZ2l0YWxDbG9jayBhbmRyb2lkOmlkPSJAK2lkL3RpbWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjhkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKKyAgICAgICAgPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpbWVEaXNwbGF5IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMjBzcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd0NvbG9yPSIjQzAwMDAwMDAiCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd0R4PSIwIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dEeT0iMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93UmFkaXVzPSIzLjAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjZkaXAiCisgICAgICAgICAgICAvPgorCisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYW1fcG0iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC90aW1lRGlzcGxheSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduQmFzZWxpbmU9IkBpZC90aW1lRGlzcGxheSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJub25lIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzBzcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dDb2xvcj0iI0MwMDAwMDAwIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dEeD0iMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93RHk9IjAiCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd1JhZGl1cz0iMy4wIgorICAgICAgICAgICAgLz4KKworICAgIDwvY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkRpZ2l0YWxDbG9jaz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2RhdGUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3RpbWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNWRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJzcCIKKyAgICAgICAgLz4KKworICAgIDwhLS0gdXNlZCBmb3IgaW5zdHJ1Y3Rpb25zIHN1Y2ggYXMgImRyYXcgcGF0dGVybiB0byB1bmxvY2siLCB0aGUgbmV4dCBhbGFybSwgYW5kIGNoYXJnaW5nCisgICAgICAgICBzdGF0dXMuICAtLT4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXMyIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyc3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI0ZGlwIgorICAgICAgICAvPgorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1czEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjE1ZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMnNwIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAvPgorICAgICAgICAKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wcm9wZXJ0eU9mIgorICAgICAgICBhbmRyb2lkOmxpbmVTcGFjaW5nRXh0cmE9IjhkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyMnNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImludmlzaWJsZSIKKyAgICAgICAgLz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3RhYl91bmxvY2sueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3RhYl91bmxvY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNjQ1YWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fdGFiX3VubG9jay54bWwKQEAgLTAsMCArMSw5NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyoqCisqKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gVGhpcyBpcyB0aGUgZ2VuZXJhbCBsb2NrIHNjcmVlbiB3aGljaCBzaG93cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgc3RhdGUgb2YgdGhlIGRldmljZSwgYXMgd2VsbCBhcyBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGdldCBwYXN0IGl0CisgIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIGRldmljZS4gIEl0IGlzIHRoZSBzYW1lIGZvciBsYW5kc2NhcGUKKyAgYW5kIHBvcnRyYWl0Li0tPgorPFJlbGF0aXZlTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp0YWJ1bmxvY2s9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvY29tLmFuZHJvaWQudGFidW5sb2NrIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjNzAwMDAwMDAiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL3Jvb3QiPgorCisgICAgPCEtLSBsZWZ0IHNpZGU6IHN0YXR1cyBhbmQgZW1lcmdlbmN5IGNhbGwgYnV0dG9uIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgID4KKyAgICAgICAgPGluY2x1ZGUgbGF5b3V0PSJAbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfbGFuZCIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICA+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zY3JlZW5Mb2NrZWQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3N0YXR1czIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIyNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjEyZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjRkaXAiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuV2F2ZVZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvd2F2ZV92aWV3IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgLz4KKworICAgICAgICA8IS0tICJlbWVyZ2VuY3kgY2FsbHMgb25seSIgc2hvd24gd2hlbiBzaW0gaXMgbWlzc2luZyBvciBQVUtkIC0tPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbFRleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2NhcnJpZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZW1lcmdlbmN5X2NhbGxzX29ubHkiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlIgorICAgICAgICAgICAvPgorCisgICAgICAgIDwhLS0gZW1lcmdlbmN5IGNhbGwgYnV0dG9uIHNob3duIHdoZW4gc2ltIGlzIFBVS2QgYW5kIHRhYl9zZWxlY3RvciBpcworICAgICAgICAgICAgIGhpZGRlbiAtLT4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsQnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4MGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworPC9SZWxhdGl2ZUxheW91dD4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3RhYl91bmxvY2tfbGFuZC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fdGFiX3VubG9ja19sYW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzk5Y2NhYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl90YWJfdW5sb2NrX2xhbmQueG1sCkBAIC0wLDAgKzEsOTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisqKgorKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoaXMgaXMgdGhlIGdlbmVyYWwgbG9jayBzY3JlZW4gd2hpY2ggc2hvd3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgIHN0YXRlIG9mIHRoZSBkZXZpY2UsIGFzIHdlbGwgYXMgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBnZXQgcGFzdCBpdAorICBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBkZXZpY2UuLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp0YWJ1bmxvY2s9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvY29tLmFuZHJvaWQudGFidW5sb2NrIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiM3MDAwMDAwMCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL3Jvb3QiPgorCisgICAgPCEtLSBsZWZ0IHNpZGU6IHN0YXR1cyBhbmQgZW1lcmdlbmN5IGNhbGwgYnV0dG9uIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgID4KKyAgICAgICAgPGluY2x1ZGUgbGF5b3V0PSJAbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfbGFuZCIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDwhLS0gcmlnaHQgc2lkZSAtLT4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICAgICAgPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NjcmVlbkxvY2tlZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvc3RhdHVzMiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTJkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjRkaXAiCisgICAgICAgICAgICAgICAgLz4KKworICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LldhdmVWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3dhdmVfdmlldyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDwhLS0gImVtZXJnZW5jeSBjYWxscyBvbmx5IiBzaG93biB3aGVuIHNpbSBpcyBtaXNzaW5nIG9yIFBVS2QgLS0+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsVGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIyMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9lbWVyZ2VuY3lfY2FsbHNfb25seSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCisgICAgICAgICAgICAgICAvPgorCisgICAgICAgIDwhLS0gZW1lcmdlbmN5IGNhbGwgYnV0dG9uIHNob3duIHdoZW4gc2ltIGlzIFBVS2QgYW5kIHRhYl9zZWxlY3RvciBpcworICAgICAgICAgICAgIGhpZGRlbiAtLT4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsQnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1dpZGdldC5CdXR0b24uVHJhbnNwYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgIC8+CisKKyAgICA8L0xpbmVhckxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19sYW5kc2NhcGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19sYW5kc2NhcGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNjM2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX2xhbmRzY2FwZS54bWwKQEAgLTAsMCArMSwxMDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoaXMgaXMgdGhlIHNjcmVlbiB0aGF0IHNob3dzIHRoZSA5IGNpcmNsZSB1bmxvY2sgd2lkZ2V0IGFuZCBpbnN0cnVjdHMKKyAgICAgdGhlIHVzZXIgaG93IHRvIHVubG9jayB0aGVpciBkZXZpY2UsIG9yIG1ha2UgYW4gZW1lcmdlbmN5IGNhbGwuICBUaGlzCisgICAgIGlzIHRoZSBwb3J0cmFpdCBsYXlvdXQuICAtLT4KKworPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5MaW5lYXJMYXlvdXRXaXRoRGVmYXVsdFRvdWNoUmVjZXBpZW50CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgPgorCisgICAgPCEtLSBsZWZ0IHNpZGU6IHN0YXR1cyBhbmQgZW1lcmdlbmN5IGNhbGwgYnV0dG9uIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgID4KKyAgICAgICAgCisgICAgICAgIDxpbmNsdWRlIGxheW91dD0iQGxheW91dC9rZXlndWFyZF9zY3JlZW5fc3RhdHVzX2xhbmQiIC8+CisKKyAgICAgICAgPCEtLSBmb290ZXIgLS0+CisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTQwZGlwIgorICAgICAgICAgICAgPgorCisgICAgICAgICAgICA8IS0tIG9wdGlvbiAxOiBhIHNpbmdsZSBlbWVyZ2VuY3kgY2FsbCBidXR0b24gLS0+CisgICAgICAgICAgICA8UmVsYXRpdmVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9mb290ZXJOb3JtYWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCisgICAgICAgICAgICAgICAgPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsQWxvbmUiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfY2FsbCIKKyAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9XaWRnZXQuQnV0dG9uLlRyYW5zcGFyZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL2ljX2VtZXJnZW5jeSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjhkaXAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICAgICAgICAgIDwhLS0gb3B0aW9uIDI6IGFuIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiwgYW5kIGEgJ2ZvcmdvdCBwYXR0ZXJuPycgYnV0dG9uIC0tPgorICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2Zvb3RlckZvcmdvdFBhdHRlcm4iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCisgICAgICAgICAgICAgICAgPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mb3Jnb3RQYXR0ZXJuIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9XaWRnZXQuQnV0dG9uLlRyYW5zcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsVG9nZXRoZXIiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfY2FsbCIKKyAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9XaWRnZXQuQnV0dG9uLlRyYW5zcGFyZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL2ljX2VtZXJnZW5jeSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjhkaXAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPCEtLSByaWdodCBzaWRlOiBsb2NrIHBhdHRlcm4gLS0+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgID4KKyAgICAgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblZpZXcgYW5kcm9pZDppZD0iQCtpZC9sb2NrUGF0dGVybiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzNTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjM1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOTBkaXAiCisgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworPC9jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTGluZWFyTGF5b3V0V2l0aERlZmF1bHRUb3VjaFJlY2VwaWVudD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19wb3J0cmFpdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlZDc5YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sCkBAIC0wLDAgKzEsMTAyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIikKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5MaW5lYXJMYXlvdXRXaXRoRGVmYXVsdFRvdWNoUmVjZXBpZW50CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgID4KKworICAgIDwhLS0gbGVmdCBzaWRlOiBzdGF0dXMgYW5kIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiAtLT4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICA+CisgICAgICAgIAorICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19wb3J0IiAvPgorCisgICAgICAgIDwhLS0gZm9vdGVyIC0tPgorICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjE0MGRpcCIKKyAgICAgICAgICAgID4KKworICAgICAgICAgICAgPCEtLSBvcHRpb24gMTogYSBzaW5nbGUgZW1lcmdlbmN5IGNhbGwgYnV0dG9uIC0tPgorICAgICAgICAgICAgPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvZm9vdGVyTm9ybWFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbEFsb25lIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgICAgICAgICA8IS0tIG9wdGlvbiAyOiBhbiBlbWVyZ2VuY3kgY2FsbCBidXR0b24sIGFuZCBhICdmb3Jnb3QgcGF0dGVybj8nIGJ1dHRvbiAtLT4KKyAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9mb290ZXJGb3Jnb3RQYXR0ZXJuIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZm9yZ290UGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbFRvZ2V0aGVyIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICAgICAgPC9GcmFtZUxheW91dD4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDwhLS0gcmlnaHQgc2lkZTogbG9jayBwYXR0ZXJuIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICA+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbG9ja1BhdHRlcm4iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzUwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIzNTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjUwZGlwIgorICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxpbmVhckxheW91dFdpdGhEZWZhdWx0VG91Y2hSZWNlcGllbnQ+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3NjcmVlbl9hY3Rpb25fYmFyLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3NjcmVlbl9hY3Rpb25fYmFyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDAyNTU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uvc2NyZWVuX2FjdGlvbl9iYXIueG1sCkBAIC0wLDAgKzEsNDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KK1RoaXMgaXMgYW4gb3B0aW1pemVkIGxheW91dCBmb3IgYSBzY3JlZW4gd2l0aCB0aGUgQWN0aW9uIEJhciBlbmFibGVkLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiPgorICAgIDxWaWV3QW5pbWF0b3IgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX2FuaW1hdG9yIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDppbkFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX2luX25vX2FscGhhIgorICAgICAgICBhbmRyb2lkOm91dEFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX291dF9ub19hbHBoYSI+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uQmFyU3R5bGUiIC8+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2NvbnRleHRfYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uTW9kZVN0eWxlIiAvPgorICAgIDwvVmlld0FuaW1hdG9yPgorICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpmb3JlZ3JvdW5kR3Jhdml0eT0iZmlsbF9ob3Jpem9udGFsfHRvcCIKKyAgICAgICAgYW5kcm9pZDpmb3JlZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3dpbmRvd0NvbnRlbnRPdmVybGF5IiAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zY3JlZW5fYWN0aW9uX2Jhcl9vdmVybGF5LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3NjcmVlbl9hY3Rpb25fYmFyX292ZXJsYXkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMDUxYWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zY3JlZW5fYWN0aW9uX2Jhcl9vdmVybGF5LnhtbApAQCAtMCwwICsxLDQ5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tCitUaGlzIGlzIGFuIG9wdGltaXplZCBsYXlvdXQgZm9yIGEgc2NyZWVuIHdpdGgKK3RoZSBBY3Rpb24gQmFyIGVuYWJsZWQgb3ZlcmxheWluZyBhcHBsaWNhdGlvbiBjb250ZW50LgorLS0+CisKKzxSZWxhdGl2ZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpmaXRzU3lzdGVtV2luZG93cz0idHJ1ZSI+CisgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IiAvPgorICAgIDxWaWV3QW5pbWF0b3IgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX2FuaW1hdG9yIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJ0b3AiCisgICAgICAgIGFuZHJvaWQ6aW5BbmltYXRpb249IkBhbmltL3B1c2hfZG93bl9pbl9ub19hbHBoYSIKKyAgICAgICAgYW5kcm9pZDpvdXRBbmltYXRpb249IkBhbmltL3B1c2hfZG93bl9vdXRfbm9fYWxwaGEiPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhclZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2JhciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2FjdGlvbkJhclN0eWxlIiAvPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhckNvbnRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9jb250ZXh0X2JhciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2FjdGlvbk1vZGVTdHlsZSIgLz4KKyAgICA8L1ZpZXdBbmltYXRvcj4KKyAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6c3JjPSI/YW5kcm9pZDphdHRyL3dpbmRvd0NvbnRlbnRPdmVybGF5IgorICAgICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdFhZIgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9hY3Rpb25fYmFyX2FuaW1hdG9yIiAvPgorPC9SZWxhdGl2ZUxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X2NvbnRlbnQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnRfY29udGVudC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY0YjkwZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X2NvbnRlbnQueG1sCkBAIC0wLDAgKzEsNTYgQEAKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iN2RwIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZHAiCisgICAgICAgID4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iM2RwIgorICAgICAgICA+CisgICAgICAgIDwhLS1jb20uYW5kcm9pZC5zZXJ2ZXIuc3RhdHVzLkFuaW1hdGVkSW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIgLS0+CisgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9pY29uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI1ZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI1ZHAiCisgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0Q2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9hcnJvd19kb3duX2Zsb2F0Ii8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQuVGl0bGUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZmFkaW5nRWRnZT0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjRkcCIKKyAgICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZmFkaW5nRWRnZT0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjRkcCIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxhbmRyb2lkLndpZGdldC5EYXRlVGltZVZpZXcgYW5kcm9pZDppZD0iQCtpZC90aW1lIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI0ZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNWRwIgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fYmFyX3RpdGxlX2l0ZW0ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fYmFyX3RpdGxlX2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NjQ5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9iYXJfdGl0bGVfaXRlbS54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiID4KKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX3RpdGxlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIiAvPgorICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9iYXJfc3VidGl0bGUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21lbnVfaXRlbV9sYXlvdXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbWVudV9pdGVtX2xheW91dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzY2NlNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21lbnVfaXRlbV9sYXlvdXQueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8Y29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVJdGVtVmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgPgorICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2ltYWdlQnV0dG9uIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgICAgICBzdHlsZT0iP2F0dHIvYWN0aW9uQnV0dG9uU3R5bGUiIC8+CisgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3RleHRCdXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Cis8L2NvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51SXRlbVZpZXc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tZW51X2xheW91dC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tZW51X2xheW91dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThkNTUzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21lbnVfbGF5b3V0LnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51VmlldworICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbW9kZV9iYXIueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbW9kZV9iYXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDlmZGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tb2RlX2Jhci54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJDb250ZXh0VmlldworICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2FjdGlvbk1vZGVTdHlsZSIgLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWxlcnRfZGlhbG9nLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWxlcnRfZGlhbG9nLnhtbAppbmRleCAyNWE0MWY4Li5iNzQ2ZDI4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FsZXJ0X2RpYWxvZy54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9hbGVydF9kaWFsb2cueG1sCkBAIC04MCw4ICs4MCw3IEBACiAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjJkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjEyZGlwIgogICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTRkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTBkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOm92ZXJzY3JvbGxNb2RlPSJpZkNvbnRlbnRTY3JvbGxzIj4KKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMGRpcCI+CiAgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tZXNzYWdlIgogICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCkBAIC0xMTMsNyArMTEyLDcgQEAKICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iNGRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dXNlTGFyZ2VzdENoaWxkPSJ0cnVlIj4KKyAgICAgICAgICAgIGFuZHJvaWQ6bWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQ9InRydWUiPgogICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2xlZnRTcGFjZXIiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwLjI1IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9jb250YWN0X2hlYWRlci54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2NvbnRhY3RfaGVhZGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY0NjdkMy4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2NvbnRhY3RfaGVhZGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmlkPSJAK2lkL2Jhbm5lciIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvdGl0bGVfYmFyX21lZGl1bSIKLSAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNWRpcCI+Ci0KLSAgICA8YW5kcm9pZC53aWRnZXQuUXVpY2tDb250YWN0QmFkZ2UgYW5kcm9pZDppZD0iQCtpZC9waG90byIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iLTFkaXAiCi0gICAgICAgIHN0eWxlPSJAKmFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlLldpbmRvd1NtYWxsIiAvPgotICAgIC8+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIiA+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FnZ3JlZ2F0ZV9iYWRnZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIzZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iM2RpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2FnZ3JlZ2F0ZWQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgLz4KLQotICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbmFtZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dDb2xvcj0iI0JCMDAwMDAwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93UmFkaXVzPSIyLjc1IgotICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3Bob25ldGljX25hbWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCi0gICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXMiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCi0gICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXNfZGF0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMnNwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxJbWFnZVZpZXcKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wcmVzZW5jZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iM2RpcCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjZkaXAiCi0gICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAvPgotCi0gICAgPENoZWNrQm94Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhciIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9kZXNjcmlwdGlvbl9zdGFyIgotICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9zdGFyU3R5bGUiIC8+Ci0KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9mcmFnbWVudF9icmVhZF9jcnVtYl9pdGVtLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvZnJhZ21lbnRfYnJlYWRfY3J1bWJfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA4ZjZlOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvZnJhZ21lbnRfYnJlYWRfY3J1bWJfaXRlbS54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZAorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxUZXh0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bUludmVyc2UiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAZHJhd2FibGUvbmF2X2RpdmlkZXIiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjEyZHAiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSIxMmRwIgorICAgICAgICAvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9mcmFnbWVudF9icmVhZF9jcnVtYnMueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9mcmFnbWVudF9icmVhZF9jcnVtYnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyODllMTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2JyZWFkX2NydW1icy54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZAorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9sYW5kc2NhcGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfbGFuZHNjYXBlLnhtbAppbmRleCBhYjY3NWM3Li4zZDUyZjcxIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9sYW5kc2NhcGUueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX2xhbmRzY2FwZS54bWwKQEAgLTI4LDcgKzI4LDcgQEAKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgogICAgICAgICA8IS0tICJFbnRlciBQSU4oUGFzc3dvcmQpIHRvIHVubG9jayIgLS0+Ci0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2VudGVyX3Bhc3N3b3JkX2xhYmVsIgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXMxIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX3BvcnRyYWl0LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX3BvcnRyYWl0LnhtbAppbmRleCA5ZWU4NzgxLi5hZjhhM2VmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9wb3J0cmFpdC54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfcG9ydHJhaXQueG1sCkBAIC0yNCw3ICsyNCw3IEBACiAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCI+CiAKICAgICA8IS0tICJFbnRlciBQSU4oUGFzc3dvcmQpIHRvIHVubG9jayIgLS0+Ci0gICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvZW50ZXJfcGFzc3dvcmRfbGFiZWwiCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzMSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19sYW5kc2NhcGUueG1sCmluZGV4IGMxYjQwNmYuLjgzMzgxYTEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19sYW5kc2NhcGUueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19sYW5kc2NhcGUueG1sCkBAIC01OCwxOCArNTgsMTkgQEAKICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgogICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodHxib3R0b20iCiAgICAgICAgICAgICAvPgorCiAgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuRGlnaXRhbENsb2NrIGFuZHJvaWQ6aWQ9IkAraWQvdGltZSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZGlwIgogICAgICAgICAgICAgPgogCiAgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aW1lRGlzcGxheSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iYm90dG9tIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSI3MnNwIgpAQCAtODQsOCArODUsOSBAQAogCiAgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hbV9wbSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iYm90dG9tIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL3RpbWVEaXNwbGF5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduQmFzZWxpbmU9IkBpZC90aW1lRGlzcGxheSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjJzcCIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19wb3J0cmFpdC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sCmluZGV4IDc0YTBlZWUuLjhkYWNmYWYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19wb3J0cmFpdC54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX3BvcnRyYWl0LnhtbApAQCAtNTUsMTIgKzU1LDEyIEBACiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTVkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIyMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKICAgICAgICAgICAgID4KIAogICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGltZURpc3BsYXkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iNTZzcCIKQEAgLTc0LDggKzc0LDkgQEAKIAogICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYW1fcG0iCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC90aW1lRGlzcGxheSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkJhc2VsaW5lPSJAaWQvdGltZURpc3BsYXkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJub25lIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xpc3RfY29udGVudC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xpc3RfY29udGVudC54bWwKaW5kZXggNmY5ZjFlMC4uMTQxNDAzMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50LnhtbApAQCAtMSw4ICsxLDYgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CiA8IS0tCi0vKiAvL2RldmljZS9hcHBzL2NvbW1vbi9hc3NldHMvcmVzL2xheW91dC9saXN0X2NvbnRlbnQueG1sCi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8qIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAqKgogKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAogKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKQEAgLTE3LDggKzE1LDQyIEBACiAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCiAtLT4KLTxMaXN0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiCi0gICAgLz4KKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKyAgICAKKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvcHJvZ3Jlc3NDb250YWluZXIiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciI+CisgICAgICAgIAorICAgICAgICA8UHJvZ3Jlc3NCYXIgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvcHJvZ3Jlc3NCYXJTdHlsZUxhcmdlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbG9hZGluZyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjRkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIiAvPgorICAgICAgICAgICAgCisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgIAorICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2xpc3RDb250YWluZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKyAgICAgICAgICAgIAorICAgICAgICA8TGlzdFZpZXcgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvbGlzdCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJmYWxzZSIgLz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkArYW5kcm9pZDppZC9pbnRlcm5hbEVtcHR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIiAvPgorICAgIDwvRnJhbWVMYXlvdXQ+CisgICAgICAgIAorPC9GcmFtZUxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50X3NpbXBsZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xpc3RfY29udGVudF9zaW1wbGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmOWYxZTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xpc3RfY29udGVudF9zaW1wbGUueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9hc3NldHMvcmVzL2xheW91dC9saXN0X2NvbnRlbnQueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPExpc3RWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvbGlzdCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJmYWxzZSIKKyAgICAvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9sb2NhbGVfcGlja2VyX2l0ZW0ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9sb2NhbGVfcGlja2VyX2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2M2Y1YWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xvY2FsZV9waWNrZXJfaXRlbS54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IgorICAgIGFuZHJvaWQ6cGFkZGluZz0iNWRpcCI+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9sb2NhbGUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTGFyZ2UiCisgICAgLz4KKzwvTGluZWFyTGF5b3V0ID4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcG9wdXBfbWVudV9pdGVtX2xheW91dC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3BvcHVwX21lbnVfaXRlbV9sYXlvdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMGM0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3BvcHVwX21lbnVfaXRlbV9sYXlvdXQueG1sCkBAIC0wLDAgKzEsNTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8Y29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lkxpc3RNZW51SXRlbVZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0Ij4KKyAgICAKKyAgICA8IS0tIEljb24gd2lsbCBiZSBpbnNlcnRlZCBoZXJlLiAtLT4KKyAgICAKKyAgICA8IS0tIFRoZSB0aXRsZSBhbmQgc3VtbWFyeSBoYXZlIHNvbWUgZ2FwIGJldHdlZW4gdGhlbSwgYW5kIHRoaXMgJ2dyb3VwJyBzaG91bGQgYmUgY2VudGVyZWQgdmVydGljYWxseS4gLS0+CisgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmR1cGxpY2F0ZVBhcmVudFN0YXRlPSJ0cnVlIj4KKyAgICAgICAgCisgICAgICAgIDxUZXh0VmlldyAKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZVBvcHVwTWVudSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHVwbGljYXRlUGFyZW50U3RhdGU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZmFkaW5nRWRnZT0iaG9yaXpvbnRhbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2hvcnRjdXQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3RpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsUG9wdXBNZW51IgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpkdXBsaWNhdGVQYXJlbnRTdGF0ZT0idHJ1ZSIgLz4KKworICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICA8IS0tIENoZWNrYm94LCBhbmQvb3IgcmFkaW8gYnV0dG9uIHdpbGwgYmUgaW5zZXJ0ZWQgaGVyZS4gLS0+CisgICAgCis8L2NvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5MaXN0TWVudUl0ZW1WaWV3PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2RpYWxvZ19lZGl0dGV4dC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfZGlhbG9nX2VkaXR0ZXh0LnhtbAppbmRleCBiNDFlNzc0Li41YmU1NzczIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfZGlhbG9nX2VkaXR0ZXh0LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfZGlhbG9nX2VkaXR0ZXh0LnhtbApAQCAtMTcsOCArMTcsNyBAQAogPCEtLSBMYXlvdXQgdXNlZCBhcyB0aGUgZGlhbG9nJ3MgY29udGVudCBWaWV3IGZvciBFZGl0VGV4dFByZWZlcmVuY2UuIC0tPgogPFNjcm9sbFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpvdmVyc2Nyb2xsTW9kZT0iaWZDb250ZW50U2Nyb2xscyI+CisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgogCiAgICAgPExpbmVhckxheW91dAogICAgICAgICBhbmRyb2lkOmlkPSJAK2FuZHJvaWQ6aWQvZWRpdHRleHRfY29udGFpbmVyIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2hlYWRlcl9pdGVtLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9oZWFkZXJfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhN2IyYWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfaGVhZGVyX2l0ZW0ueG1sCkBAIC0wLDAgKzEsNjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gTGF5b3V0IG9mIGEgaGVhZGVyIGl0ZW0gaW4gUHJlZmVyZW5jZUFjdGl2aXR5LiAtLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL2FjdGl2YXRlZEJhY2tncm91bmRJbmRpY2F0b3IiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9Ij9hbmRyb2lkOmF0dHIvc2Nyb2xsYmFyU2l6ZSI+CisKKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiIC8+CisKKyAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjJkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIj4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL3RpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9Imhvcml6b250YWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkArYW5kcm9pZDppZC9zdW1tYXJ5IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBhbmRyb2lkOmlkL3RpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25MZWZ0PSJAYW5kcm9pZDppZC90aXRsZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCisgICAgICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIyIiAvPgorCisgICAgPC9SZWxhdGl2ZUxheW91dD4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9jb250ZW50LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9saXN0X2NvbnRlbnQueG1sCmluZGV4IDhmODY5ODEuLjdjMGI3OTEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9saXN0X2NvbnRlbnQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9saXN0X2NvbnRlbnQueG1sCkBAIC00LDIyICs0LDk3IEBACiAqKgogKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCiAtLT4KLTxMaXN0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6ZHJhd1NlbGVjdG9yT25Ub3A9ImZhbHNlIgotICAgIGFuZHJvaWQ6c2Nyb2xsYmFyQWx3YXlzRHJhd1ZlcnRpY2FsVHJhY2s9InRydWUiCi0gICAgLz4KKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50Ij4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwcHgiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSI+CisKKyAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9oZWFkZXJzIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMHB4IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEwIj4KKworICAgICAgICAgICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBweCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzY3JvbGxiYXJBbHdheXNEcmF3VmVydGljYWxUcmFjaz0idHJ1ZSIgLz4KKworICAgICAgICAgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbGlzdF9mb290ZXIiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiIC8+CisKKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvcHJlZnMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBweCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjMzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvbl9iYXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvYm90dG9tX2JhciIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIj4KKworICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYmFja19idXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTUwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL2ljX2J0bl9iYWNrIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjNkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYmFja19idXR0b25fbGFiZWwiCisgICAgICAgIC8+CisgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIj4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3NraXBfYnV0dG9uIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxNTBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI1ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9za2lwX2J1dHRvbl9sYWJlbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICAvPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbmV4dF9idXR0b24iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE1MGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjVkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVJpZ2h0PSJAZHJhd2FibGUvaWNfYnRuX25leHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjNkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25leHRfYnV0dG9uX2xhYmVsIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPC9SZWxhdGl2ZUxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW4ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW4ueG1sCmluZGV4IGRmYTk3MzEuLjcyZjczOTIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbi54bWwKQEAgLTI1LDYgKzI1LDEzIEBACiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKID4KKyAgICA8IS0tIFBvcG91dCBiYXIgZm9yIGFjdGlvbiBtb2RlcyAtLT4KKyAgICA8Vmlld1N0dWIgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXJfc3R1YiIKKyAgICAgICAgICAgICAgYW5kcm9pZDppbmZsYXRlZElkPSJAK2lkL2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKwogICAgIDwhLS0gVGl0bGUgYmFyIC0tPgogICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90aXRsZV9jb250YWluZXIiCiAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3dpbmRvd1RpdGxlQmFja2dyb3VuZFN0eWxlIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fYWN0aW9uX2Jhci54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9hY3Rpb25fYmFyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTU4NDE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fYWN0aW9uX2Jhci54bWwKQEAgLTAsMCArMSw1MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KK1RoaXMgaXMgYW4gb3B0aW1pemVkIGxheW91dCBmb3IgYSBzY3JlZW4gd2l0aCB0aGUgQWN0aW9uIEJhciBlbmFibGVkLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiPgorICAgIDxWaWV3QW5pbWF0b3IgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX2FuaW1hdG9yIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDppbkFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX2luX25vX2FscGhhIgorICAgICAgICBhbmRyb2lkOm91dEFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX291dF9ub19hbHBoYSI+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uQmFyU3R5bGUiIC8+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2NvbnRleHRfYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uTW9kZVN0eWxlIiAvPgorICAgIDwvVmlld0FuaW1hdG9yPgorICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6Zm9yZWdyb3VuZEdyYXZpdHk9ImZpbGxfaG9yaXpvbnRhbHx0b3AiCisgICAgICAgIGFuZHJvaWQ6Zm9yZWdyb3VuZD0iP2FuZHJvaWQ6YXR0ci93aW5kb3dDb250ZW50T3ZlcmxheSIgLz4KKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbG93ZXJfYWN0aW9uX2NvbnRleHRfYmFyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uQmFyU3R5bGUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2FjdGlvbl9iYXJfb3ZlcmxheS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9hY3Rpb25fYmFyX292ZXJsYXkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYTFlZTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9hY3Rpb25fYmFyX292ZXJsYXkueG1sCkBAIC0wLDAgKzEsNTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KK1RoaXMgaXMgYW4gb3B0aW1pemVkIGxheW91dCBmb3IgYSBzY3JlZW4gd2l0aAordGhlIEFjdGlvbiBCYXIgZW5hYmxlZCBvdmVybGF5aW5nIGFwcGxpY2F0aW9uIGNvbnRlbnQuCistLT4KKworPFJlbGF0aXZlTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmZpdHNTeXN0ZW1XaW5kb3dzPSJ0cnVlIj4KKyAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiIC8+CisgICAgPFZpZXdBbmltYXRvciBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9iYXJfYW5pbWF0b3IiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InRvcCIKKyAgICAgICAgYW5kcm9pZDppbkFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX2luX25vX2FscGhhIgorICAgICAgICBhbmRyb2lkOm91dEFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX291dF9ub19hbHBoYSI+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uQmFyU3R5bGUiIC8+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2NvbnRleHRfYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uTW9kZVN0eWxlIiAvPgorICAgIDwvVmlld0FuaW1hdG9yPgorICAgIDxJbWFnZVZpZXcgYW5kcm9pZDpzcmM9Ij9hbmRyb2lkOmF0dHIvd2luZG93Q29udGVudE92ZXJsYXkiCisgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0WFkiCisgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2FjdGlvbl9iYXJfYW5pbWF0b3IiIC8+CisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2xvd2VyX2FjdGlvbl9jb250ZXh0X2JhciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2FjdGlvbkJhclN0eWxlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorPC9SZWxhdGl2ZUxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2N1c3RvbV90aXRsZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9jdXN0b21fdGl0bGUueG1sCmluZGV4IDM0YzlkZTAuLmM2MmEwNmEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2N1c3RvbV90aXRsZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fY3VzdG9tX3RpdGxlLnhtbApAQCAtMjEsNiArMjEsMTMgQEAKIDxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgogICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiPgorICAgIDwhLS0gUG9wb3V0IGJhciBmb3IgYWN0aW9uIG1vZGVzIC0tPgorICAgIDxWaWV3U3R1YiBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9tb2RlX2Jhcl9zdHViIgorICAgICAgICAgICAgICBhbmRyb2lkOmluZmxhdGVkSWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dD0iQGxheW91dC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorCiAgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RpdGxlX2NvbnRhaW5lciIgCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93VGl0bGVTaXplIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fcHJvZ3Jlc3MueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fcHJvZ3Jlc3MueG1sCmluZGV4IDZlNjk0YzEuLmMzZjQxZmEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3Byb2dyZXNzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9wcm9ncmVzcy54bWwKQEAgLTI2LDYgKzI2LDEzIEBACiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKID4KKyAgICA8IS0tIFBvcG91dCBiYXIgZm9yIGFjdGlvbiBtb2RlcyAtLT4KKyAgICA8Vmlld1N0dWIgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXJfc3R1YiIKKyAgICAgICAgICAgICAgYW5kcm9pZDppbmZsYXRlZElkPSJAK2lkL2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKwogICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90aXRsZV9jb250YWluZXIiIAogICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci93aW5kb3dUaXRsZUJhY2tncm91bmRTdHlsZSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9zaW1wbGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fc2ltcGxlLnhtbAppbmRleCBkZjUxMWM2Li44N2MyOWY2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9zaW1wbGUueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3NpbXBsZS54bWwKQEAgLTIxLDkgKzIxLDE5IEBACiBlbmFibGVkLgogLS0+CiAKLTxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvY29udGVudCIKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiCi0gICAgYW5kcm9pZDpmb3JlZ3JvdW5kSW5zaWRlUGFkZGluZz0iZmFsc2UiCi0gICAgYW5kcm9pZDpmb3JlZ3JvdW5kR3Jhdml0eT0iZmlsbF9ob3Jpem9udGFsfHRvcCIKLSAgICBhbmRyb2lkOmZvcmVncm91bmQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93Q29udGVudE92ZXJsYXkiIC8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKyAgICA8Vmlld1N0dWIgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXJfc3R1YiIKKyAgICAgICAgICAgICAgYW5kcm9pZDppbmZsYXRlZElkPSJAK2lkL2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKyAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2NvbnRlbnQiCisgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICBhbmRyb2lkOmZvcmVncm91bmRJbnNpZGVQYWRkaW5nPSJmYWxzZSIKKyAgICAgICAgIGFuZHJvaWQ6Zm9yZWdyb3VuZEdyYXZpdHk9ImZpbGxfaG9yaXpvbnRhbHx0b3AiCisgICAgICAgICBhbmRyb2lkOmZvcmVncm91bmQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93Q29udGVudE92ZXJsYXkiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3RpdGxlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3RpdGxlLnhtbAppbmRleCAzOWVhMTMxLi5mNTEzNGY5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl90aXRsZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fdGl0bGUueG1sCkBAIC0yMiw2ICsyMiwxMiBAQAogPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCiAgICAgYW5kcm9pZDpmaXRzU3lzdGVtV2luZG93cz0idHJ1ZSI+CisgICAgPCEtLSBQb3BvdXQgYmFyIGZvciBhY3Rpb24gbW9kZXMgLS0+CisgICAgPFZpZXdTdHViIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyX3N0dWIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6aW5mbGF0ZWRJZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0PSJAbGF5b3V0L2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CiAgICAgPEZyYW1lTGF5b3V0CiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93VGl0bGVTaXplIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fdGl0bGVfaWNvbnMueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fdGl0bGVfaWNvbnMueG1sCmluZGV4IDYyYTAyMjguLjUxZDZhMTUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3RpdGxlX2ljb25zLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl90aXRsZV9pY29ucy54bWwKQEAgLTIzLDYgKzIzLDEyIEBACiAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisgICAgPCEtLSBQb3BvdXQgYmFyIGZvciBhY3Rpb24gbW9kZXMgLS0+CisgICAgPFZpZXdTdHViIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyX3N0dWIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6aW5mbGF0ZWRJZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0PSJAbGF5b3V0L2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CiAgICAgPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RpdGxlX2NvbnRhaW5lciIKICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvd2luZG93VGl0bGVCYWNrZ3JvdW5kU3R5bGUiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlYXJjaF9kcm9wZG93bl9pdGVtX2ljb25zXzJsaW5lLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VhcmNoX2Ryb3Bkb3duX2l0ZW1faWNvbnNfMmxpbmUueG1sCmluZGV4IGQ3MWI0ZjcuLmZjZGY5MWIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VhcmNoX2Ryb3Bkb3duX2l0ZW1faWNvbnNfMmxpbmUueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VhcmNoX2Ryb3Bkb3duX2l0ZW1faWNvbnNfMmxpbmUueG1sCkBAIC0xLDMxICsxLDMxIEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgogPCEtLQotLyogCisvKgogKioKICoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAqKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogLS0+CiAKLTxSZWxhdGl2ZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIAorPFJlbGF0aXZlTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI0ZGlwIgogICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIyZGlwIgogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI/YW5kcm9pZDphdHRyL3NlYXJjaFJlc3VsdExpc3RJdGVtSGVpZ2h0IiA+CiAKICAgICA8IS0tIEljb25zIGNvbWUgZmlyc3QgaW4gdGhlIGxheW91dCwgc2luY2UgdGhlaXIgcGxhY2VtZW50IGRvZXNuJ3QgZGVwZW5kIG9uCi0gICAgICAgICB0aGUgcGxhY2VtZW50IG9mIHRoZSB0ZXh0IHZpZXdzLiAtLT4gICAgCisgICAgICAgICB0aGUgcGxhY2VtZW50IG9mIHRoZSB0ZXh0IHZpZXdzLiAtLT4KICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2ljb24xIgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNDhkaXAiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDhkaXAiCkBAIC0zNSwzMSArMzUsNDQgQEAKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCiAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KIAotICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvaWNvbjIiCisgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL2VkaXRfcXVlcnkiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI0OGRpcCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0OGRpcCIKICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImNlbnRlckluc2lkZSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnNyYz0iQGFuZHJvaWQ6ZHJhd2FibGUvZWRpdF9xdWVyeSIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9lZGl0X3F1ZXJ5X2JhY2tncm91bmQiCiAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KIAorICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvaWNvbjIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI0OGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0OGRpcCIKKyAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImNlbnRlckluc2lkZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25XaXRoUGFyZW50SWZNaXNzaW5nPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL2VkaXRfcXVlcnkiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorCisKICAgICA8IS0tIFRoZSBzdWJ0aXRsZSBjb21lcyBiZWZvcmUgdGhlIHRpdGxlLCBzaW5jZSB0aGUgaGVpZ2h0IG9mIHRoZSB0aXRsZSBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlCi0gICAgICAgICBzdWJ0aXRsZSBpcyB2aXNpYmxlIG9yIGdvbmUuIC0tPiAKKyAgICAgICAgIHN1YnRpdGxlIGlzIHZpc2libGUgb3IgZ29uZS4gLS0+CiAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RleHQyIgogICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9kcm9wRG93bkl0ZW1TdHlsZSIKICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNlYXJjaFJlc3VsdFN1YnRpdGxlIgogICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjlkaXAiIAorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI5ZGlwIgogICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjRkaXAiCiAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0idG9wIgogICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBhbmRyb2lkOmlkL2ljb24xIgogICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGFuZHJvaWQ6aWQvaWNvbjIiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduV2l0aFBhcmVudElmTWlzc2luZz0idHJ1ZSIgCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduV2l0aFBhcmVudElmTWlzc2luZz0idHJ1ZSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCiAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLSAgICAKKwogICAgIDwhLS0gVGhlIHRpdGxlIGlzIHBsYWNlZCBhYm92ZSB0aGUgc3VidGl0bGUsIGlmIHRoZXJlIGlzIG9uZS4gSWYgdGhlcmUgaXMgbm8KICAgICAgICAgIHN1YnRpdGxlLCBpdCBmaWxscyB0aGUgcGFyZW50LiAtLT4KICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGV4dDEiCkBAIC03Miw1ICs4NSw1IEBACiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGFuZHJvaWQ6aWQvaWNvbjEiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAYW5kcm9pZDppZC9pY29uMiIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWJvdmU9IkBhbmRyb2lkOmlkL3RleHQyIiAvPgotICAgIAorCiA8L1JlbGF0aXZlTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zZWFyY2hfdmlldy54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlYXJjaF92aWV3LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjI5YjU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWFyY2hfdmlldy54bWwKQEAgLTAsMCArMSwxMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLS0+Cis8TGluZWFyTGF5b3V0CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2VhcmNoX2JhciIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgYW5kcm9pZDpmb2N1c2FibGU9InRydWUiCisgICAgYW5kcm9pZDpkZXNjZW5kYW50Rm9jdXNhYmlsaXR5PSJhZnRlckRlc2NlbmRhbnRzIj4KKworICAgIDwhLS0gVGhpcyBpcyBhY3R1YWxseSB1c2VkIGZvciB0aGUgYmFkZ2UgaWNvbiAqb3IqIHRoZSBiYWRnZSBsYWJlbCAob3IgbmVpdGhlcikgLS0+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2VhcmNoX2JhZGdlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIyZGlwIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iP2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZSIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgIC8+CisKKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2VhcmNoX2J1dHRvbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIzNmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjM2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iN2RpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOnNyYz0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfYnRuX3NlYXJjaCIKKyAgICAvPgorCisgICAgPCEtLSBJbm5lciBsYXlvdXQgY29udGFpbnMgdGhlIGFwcCBpY29uLCBidXR0b24ocykgYW5kIEVkaXRUZXh0IC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZWFyY2hfZWRpdF9mcmFtZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjMwMGRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvZWRpdFRleHRCYWNrZ3JvdW5kIj4KKworICAgICAgICA8SW1hZ2VWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NlYXJjaF9hcHBfaWNvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iN2RpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19idG5fc2VhcmNoIgorICAgICAgICAvPgorCisgICAgICAgIDxBdXRvQ29tcGxldGVUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZWFyY2hfc3JjX3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iMmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBudWxsIgorICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9InRleHR8dGV4dEF1dG9Db21wbGV0ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6aW1lT3B0aW9ucz0iYWN0aW9uU2VhcmNoIgorICAgICAgICAgICAgYW5kcm9pZDpkcm9wRG93bldpZHRoPSIzMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJvcERvd25IZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJvcERvd25BbmNob3I9IkBpZC9zZWFyY2hfZWRpdF9mcmFtZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJvcERvd25WZXJ0aWNhbE9mZnNldD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0PSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwb3B1cEJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL3NlYXJjaF9kcm9wZG93bl9iYWNrZ3JvdW5kIgorICAgICAgICAvPgorCisgICAgICAgIDxJbWFnZVZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2VhcmNoX2Nsb3NlX2J0biIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9jbG9zZSIKKyAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZWFyY2hfZ29fYnRuIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19idG5fZmluZF9uZXh0IgorICAgIC8+CisKKyAgICA8SW1hZ2VCdXR0b24KKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZWFyY2hfdm9pY2VfYnRuIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItNi41ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209Ii03ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iLTVkaXAiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2J0bl9zZWFyY2hfZGlhbG9nX3ZvaWNlIgorICAgICAgICBhbmRyb2lkOnNyYz0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfYnRuX3NwZWFrX25vdyIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZy54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2cueG1sCmluZGV4IDZlNGU1ZTEuLjk0ZGNiNmEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZy54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nLnhtbApAQCAtMzAsNiArMzAsNSBAQAogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgogICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNXB4IgogICAgIGFuZHJvaWQ6Y2FjaGVDb2xvckhpbnQ9IkBudWxsIgotICAgIGFuZHJvaWQ6ZGl2aWRlcj0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodCIKLSAgICBhbmRyb2lkOnNjcm9sbGJhcnM9InZlcnRpY2FsIgotICAgIGFuZHJvaWQ6b3ZlcnNjcm9sbE1vZGU9ImlmQ29udGVudFNjcm9sbHMiIC8+CisgICAgYW5kcm9pZDpkaXZpZGVyPSI/YW5kcm9pZDphdHRyL2xpc3REaXZpZGVyQWxlcnREaWFsb2ciCisgICAgYW5kcm9pZDpzY3JvbGxiYXJzPSJ2ZXJ0aWNhbCIgLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19pdGVtLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19pdGVtLnhtbAppbmRleCAzMGZlMDJlLi45NmZkY2M2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2dfaXRlbS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX2l0ZW0ueG1sCkBAIC0yOSw3ICsyOSw3IEBACiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiCiAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgotICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAYW5kcm9pZDpjb2xvci9wcmltYXJ5X3RleHRfbGlnaHRfZGlzYWJsZV9vbmx5IgorICAgIGFuZHJvaWQ6dGV4dENvbG9yPSI/YW5kcm9pZDphdHRyL3RleHRDb2xvckFsZXJ0RGlhbG9nTGlzdEl0ZW0iCiAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCiAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTRkaXAiCiAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjE1ZGlwIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX211bHRpY2hvaWNlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19tdWx0aWNob2ljZS54bWwKaW5kZXggNTc4NWQzYi4uYTliZTAxNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX211bHRpY2hvaWNlLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2dfbXVsdGljaG9pY2UueG1sCkBAIC0yMCwxMSArMjAsMTEgQEAKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICBhbmRyb2lkOm1pbkhlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodCIKICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTGFyZ2UiCi0gICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9saWdodF9kaXNhYmxlX29ubHkiCisgICAgYW5kcm9pZDp0ZXh0Q29sb3I9Ij9hbmRyb2lkOmF0dHIvdGV4dENvbG9yQWxlcnREaWFsb2dMaXN0SXRlbSIKICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxMmRpcCIKICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iN2RpcCIKLSAgICBhbmRyb2lkOmNoZWNrTWFyaz0iQGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2NoZWNrIgorICAgIGFuZHJvaWQ6Y2hlY2tNYXJrPSI/YW5kcm9pZDphdHRyL2xpc3RDaG9pY2VJbmRpY2F0b3JNdWx0aXBsZSIKICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKIC8+CiAKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19zaW5nbGVjaG9pY2UueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX3NpbmdsZWNob2ljZS54bWwKaW5kZXggMzU2MGZlZS4uMWI5Yzk3MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX3NpbmdsZWNob2ljZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX3NpbmdsZWNob2ljZS54bWwKQEAgLTIwLDEwICsyMCwxMCBAQAogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IgogICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKLSAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X2xpZ2h0X2Rpc2FibGVfb25seSIKKyAgICBhbmRyb2lkOnRleHRDb2xvcj0iP2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JBbGVydERpYWxvZ0xpc3RJdGVtIgogICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgogICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjEyZGlwIgogICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI3ZGlwIgotICAgIGFuZHJvaWQ6Y2hlY2tNYXJrPSJAYW5kcm9pZDpkcmF3YWJsZS9idG5fcmFkaW8iCisgICAgYW5kcm9pZDpjaGVja01hcms9Ij9hbmRyb2lkOmF0dHIvbGlzdENob2ljZUluZGljYXRvclNpbmdsZSIKICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKIC8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NpbXBsZV9saXN0X2l0ZW1fMi54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NpbXBsZV9saXN0X2l0ZW1fMi54bWwKaW5kZXggNWVhYjU0ZS4uYzg3OTIyYyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9zaW1wbGVfbGlzdF9pdGVtXzIueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2ltcGxlX2xpc3RfaXRlbV8yLnhtbApAQCAtMTUsOCArMTUsNiBAQAogLS0+CiAKIDxUd29MaW5lTGlzdEl0ZW0geG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiAKLQlhbmRyb2lkOnBhZGRpbmdUb3A9IjJkaXAiCi0JYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIyZGlwIgogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NpbXBsZV9saXN0X2l0ZW1fYWN0aXZhdGVkXzEueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zaW1wbGVfbGlzdF9pdGVtX2FjdGl2YXRlZF8xLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDE2ZGYyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zaW1wbGVfbGlzdF9pdGVtX2FjdGl2YXRlZF8xLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8VGV4dFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RleHQxIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9hY3RpdmF0ZWRCYWNrZ3JvdW5kSW5kaWNhdG9yIgorICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IgorLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2ltcGxlX2xpc3RfaXRlbV9hY3RpdmF0ZWRfMi54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NpbXBsZV9saXN0X2l0ZW1fYWN0aXZhdGVkXzIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZmJmMDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NpbXBsZV9saXN0X2l0ZW1fYWN0aXZhdGVkXzIueG1sCkBAIC0wLDAgKzEsNDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxUd29MaW5lTGlzdEl0ZW0geG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMmRpcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjJkaXAiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvYWN0aXZhdGVkQmFja2dyb3VuZEluZGljYXRvciIKKyAgICBhbmRyb2lkOm1pbkhlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodCIKKyAgICBhbmRyb2lkOm1vZGU9InR3b0xpbmUiCis+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGV4dDEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKKyAgICAvPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RleHQyIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBhbmRyb2lkOmlkL3RleHQxIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkxlZnQ9IkBhbmRyb2lkOmlkL3RleHQxIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCisgICAgLz4KKworPC9Ud29MaW5lTGlzdEl0ZW0+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NpbXBsZV9zZWxlY3RhYmxlX2xpc3RfaXRlbS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NpbXBsZV9zZWxlY3RhYmxlX2xpc3RfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4YmNkMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2ltcGxlX3NlbGVjdGFibGVfbGlzdF9pdGVtLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPENoZWNrZWRUZXh0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGV4dDEiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiCisgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9saXN0Q2hvaWNlQmFja2dyb3VuZEluZGljYXRvciIKKyAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI2ZGlwIgorICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI5ZGlwIgorLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvd2ViX3J1bnRpbWUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC93ZWJfcnVudGltZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjMDk2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvd2ViX3J1bnRpbWUueG1sCkBAIC0wLDAgKzEsMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgPgorICAgIDxXZWJWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvd2VidmlldyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgIC8+CisKKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3BsYXNoc2NyZWVuIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRTdGFydCIKKyAgICAvPgorCis8L0ZyYW1lTGF5b3V0PgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3dlYnZpZXdfZmluZC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3dlYnZpZXdfZmluZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJlZGIyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvd2Vidmlld19maW5kLnhtbApAQCAtMCwwICsxLDM5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgPgorICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL2VkaXQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNjcm9sbEhvcml6b250YWxseT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9InRleHQiCisgICAgICAgIGFuZHJvaWQ6aGludD0iQHN0cmluZy9maW5kX29uX3BhZ2UiCisgICAgICAgIGFuZHJvaWQ6aW1lT3B0aW9ucz0iYWN0aW9uRG9uZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICAvPgorICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21hdGNoZXMiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9Ij9hbmRyb2lkOmF0dHIvdGV4dENvbG9yU2Vjb25kYXJ5SW52ZXJzZSIKKyAgICAgICAgLz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL21lbnUvd2Vidmlld19jb3B5LnhtbCBiL2NvcmUvcmVzL3Jlcy9tZW51L3dlYnZpZXdfY29weS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiYTU2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9tZW51L3dlYnZpZXdfY29weS54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2NvcHkiCisgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2ljX21lbnVfY29weSIKKyAgICAgICAgYW5kcm9pZDpzaG93QXNBY3Rpb249ImFsd2F5cyIKKyAgICAgICAgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL3NoYXJlIgorICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19tZW51X3NoYXJlIgorICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iYWx3YXlzIgorICAgICAgICAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvc2VsZWN0X2FsbCIKKyAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfbWVudV9zZWxlY3RfYWxsIgorICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iYWx3YXlzIgorICAgICAgICAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvZmluZCIKKyAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfbWVudV9maW5kIgorICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iYWx3YXlzIgorICAgICAgICAvPgorPC9tZW51PgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbWVudS93ZWJ2aWV3X2ZpbmQueG1sIGIvY29yZS9yZXMvcmVzL21lbnUvd2Vidmlld19maW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGE0MGFhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL21lbnUvd2Vidmlld19maW5kLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvZmluZF9wcmV2IgorICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19idG5fZmluZF9wcmV2IgorICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iYWx3YXlzIgorICAgICAgICAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvZmluZF9uZXh0IgorICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19idG5fZmluZF9uZXh0IgorICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iYWx3YXlzIgorICAgICAgICAvPgorPC9tZW51PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3Jhdy1ybS9sb2FkZXJyb3IuaHRtbCBiL2NvcmUvcmVzL3Jlcy9yYXctcm0vbG9hZGVycm9yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0YTNmZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9yYXctcm0vbG9hZGVycm9yLmh0bWwKQEAgLTAsMCArMSwxOCBAQAorPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5QYWdpbmEgZCdpbnRlcm5ldCBiZXRnIGRpc3BvbmlibGE8L3RpdGxlPgorICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgICAgICAgICAgYm9keSB7IG1hcmdpbi10b3A6IDBweDsgcGFkZGluZy10b3A6IDBweDsgfQorICAgICAgICAgICAgaDIgICB7IG1hcmdpbi10b3A6IDVweDsgcGFkZGluZy10b3A6IDBweDsgfQorICAgICAgICA8L3N0eWxlPgorCisgICAgICAgIDxib2R5PgorCisgICAgICAgICAgICA8aW1nIHNyYz0iZmlsZTovLy9hbmRyb2lkX2Fzc2V0L3dlYmtpdC9hbmRyb2lkLXdlYmVycm9yLnBuZyIgYWxpZ249InRvcCIgLz4KKyAgICAgICAgICAgIDxoMj5QYWdpbmEgZCdpbnRlcm5ldCBiZXRnIGRpc3BvbmlibGE8L2gyPgorICAgICAgICAgICAgPHA+SW1wdXNzaWJlbCBkYSBjaGFyZ2lhciBsYSBwYWdpbmEgZCdpbnRlcm5ldCBzdXQgPGEgaHJlZj0iJXMiPiVzPC9hPi4gRXJydXI6PC9wPgorICAgICAgICAgICAgPCEtLSBUaGUgJWUgaXMgcmVwbGFjZWQgYnkgYSBsb2NhbGl6ZWQgZXJyb3Igc3RyaW5nIC0tPgorICAgICAgICAgICAgPHA+JWU8L3A+CisgICAgICAgIDwvYm9keT4KKyAgICA8L2hlYWQ+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvcmF3LXJtL25vZG9tYWluLmh0bWwgYi9jb3JlL3Jlcy9yZXMvcmF3LXJtL25vZG9tYWluLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyODMzYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9yYXctcm0vbm9kb21haW4uaHRtbApAQCAtMCwwICsxLDIzIEBACis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPlBhZ2luYSBkJ2ludGVybmV0IGJldGcgZGlzcG9uaWJsYTwvdGl0bGU+CisgICAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICAgICAgICBib2R5IHsgbWFyZ2luLXRvcDogMHB4OyBwYWRkaW5nLXRvcDogMHB4OyB9CisgICAgICAgICAgICBoMiAgIHsgbWFyZ2luLXRvcDogNXB4OyBwYWRkaW5nLXRvcDogMHB4OyB9CisgICAgICAgIDwvc3R5bGU+CisKKyAgICAgICAgPGJvZHk+CisKKyAgICAgICAgICAgIDxpbWcgc3JjPSJmaWxlOi8vL2FuZHJvaWRfYXNzZXQvd2Via2l0L2FuZHJvaWQtd2ViZXJyb3IucG5nIiBhbGlnbj0idG9wIiAvPgorICAgICAgICAgICAgPGgyPlBhZ2luYSBkJ2ludGVybmV0IGJldGcgZGlzcG9uaWJsYTwvaDI+CisgICAgICAgICAgICA8cD5MYSBwYWdpbmEgZCdpbnRlcm5ldCBzdXQgPGEgaHJlZj0iJXMiPiVzPC9hPiAmZWdyYXZlOyBldmVudHVhbG1haW4gZGVhY3RpdmFkYSB0ZW1wb3Jhcm1haW4gdSBzcHVzdGFkYSBkZWZpbml0aXZhbWFpbiBhZCBpbmEgbm92YSBhZHJlc3NhIGRhIHdlYi48L3A+CisKKyAgICAgICAgICAgIDxwPjxiPlF1YSBpbiBwJmVncmF2ZTtyIHByb3Bvc3Rhczo8L2I+PC9wPgorICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgIDxsaT5Db250cm9sbGFpIGNoZSBWb3NzIGFwcGFyYXQgcmVjZXBlc2NoYSBpbiBzaWduYWwgZSBkaXNwb25hIGQnaW5hIGNvbm5leGl1biBkYSBkYXRhcy48L2xpPgorICAgICAgICAgICAgICAgIDxsaT5DaGFyZ2lhaSBwbGkgdGFyZCBkYW5vdmFtYWluIGxhIHBhZ2luYSBkJ2ludGVybmV0LjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPkNoYXJnaWFpIGluYSBjb3BpYSBkYSBsYSBwYWdpbmEgZGEgd2ViIG1lbW9yaXNhZGEgZW4gaWwgY2FjaGUgZGEgR29vZ2xlLjwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgICAgICA8L2JvZHk+CisgICAgPC9oZWFkPgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwKaW5kZXggOTI1ZTI2Yy4uZTZjMGE0OCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCkBAIC0xNjksOCArMTY5LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGxhYl9kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iMzQ0NjE2NDU4NDcxMDU5NjUxMyI+Ik7DoXN0cm9qZSBwcm8gdsO9dm9qw6HFmWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSI5MDU2NDMxMTkzODkzODA5ODE0Ij4iRnVua2NlIHBvdXplIHBybyB2w712b2rDocWZZSBhcGxpa2Fjw60iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfc3RvcmFnZSIgbXNnaWQ9IjE5NzExMTg3NzA1NDYzMzY5NjYiPiLDmmxvxb5pxaF0xJsiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MjAzMzAyMjE0OTE1MzU1Nzc0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNTQ1NTgwNDM1MzIyMDU4MTMxMiI+IlDFmcOtc3R1cCBrZSBrYXJ0xJsgU0QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IlDFmcOtc3R1cCBrZSBrYXJ0xJsgU0QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IlDFmcOtc3R1cCBrZSBrYXJ0xJsgU0QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXIiIG1zZ2lkPSI3NDE3MTkyNjI5NjAxODkwNzkxIj4iemFrw6F6w6Fuw60gxI1pIHptxJtueSBzdGF2b3bDqWhvIMWZw6Fka3UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zdGF0dXNCYXIiIG1zZ2lkPSIxMzY1NDczNTk1MzMxOTg5NzMyIj4iVW1vxb7FiHVqZSBhcGxpa2FjaSB6YWvDoXphdCBzdGF2b3bDvSDFmcOhZGVrIG5lYm8gcMWZaWRhdCDEjWkgb2RlYnJhdCBzeXN0w6ltb3bDqSBpa29ueS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhclNlcnZpY2UiIG1zZ2lkPSI3MjQ3MjgxOTExMzg3OTMxNDg1Ij4ic3Rhdm92w70gxZnDoWRlayI8L3N0cmluZz4KQEAgLTI2Nyw4ICsyNjYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NsZWFyQXBwQ2FjaGUiIG1zZ2lkPSI3NzQwNDY1Njk0MTkzNjcxNDAyIj4iVW1vxb7FiHVqZSBhcGxpa2FjaSB1dm9sbml0IHBhbcSbxaUgdGVsZWZvbnUgc21hesOhbsOtbSBzb3Vib3LFryB2IGFkcmVzw6HFmWkgbWV6aXBhbcSbdGkgYXBsaWthY2UuIFDFmcOtc3R1cCBqZSB2ZWxtaSBvbWV6ZW7DvSwgdsSbdMWhaW5vdSBwb3V6ZSBwcm8gc3lzdMOpbW92w6kgcHJvY2VzeS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX21vdmVQYWNrYWdlIiBtc2dpZD0iNzI4NDU0OTc5OTQ2NTAzOTI2Ij4iUMWZZXN1biB6ZHJvasWvIGFwbGlrYWNlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW92ZVBhY2thZ2UiIG1zZ2lkPSI2MzIzMDQ5MjkxOTIzOTI1Mjc3Ij4iVW1vxb7FiHVqZSBhcGxpa2FjaSBwxZllc3Vub3V0IHN2w6kgemRyb2plIHogaW50ZXJuw60gcGFtxJt0aSBuYSBleHRlcm7DrSBtw6lkaXVtIGEgb3BhxI1uxJsuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDgxMTkyMTcwMzg4MjUzMjA3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkTG9ncyIgbXNnaWQ9IjY2MTU3Nzg1NDMxOTg5Njc2MTQiPiLEjXRlbsOtIHN5c3TDqW1vdsO9Y2ggc291Ym9yxa8gcHJvdG9rb2x1Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjI1NzkzNzk1NTU4MDQ3NTkwMiAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZExvZ3MiIG1zZ2lkPSI4ODk2NDQ5NDM3NDY0ODY3NzY2Ij4iVW1vxb7FiHVqZSBhcGxpa2FjaSDEjcOtc3QgcsWvem7DqSBzeXN0w6ltb3bDqSBzb3Vib3J5IHByb3Rva29sxa8uIFRvdG8gbmFzdGF2ZW7DrSBhcGxpa2FjaSB1bW/Fvm7DrSB6w61za2F0IG9iZWNuw6kgaW5mb3JtYWNlIG8gxI1pbm5vc3RlY2ggcyB0ZWxlZm9uZW0sIGFsZSBuZW3Em2x5IGJ5IG9ic2Fob3ZhdCDFvsOhZG7DqSBvc29ibsOtIMSNaSBzb3Vrcm9tw6kgaW5mb3JtYWNlLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRMb2dzICg2NjE1Nzc4NTQzMTk4OTY3NjE0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRMb2dzICg4ODk2NDQ5NDM3NDY0ODY3NzY2KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaWFnbm9zdGljIiBtc2dpZD0iODA3Njc0Mzk1MzkwODAwMDM0MiI+IsSNdGVuw60gbmVibyB6w6FwaXMgZG8gcHJvc3TFmWVka8WvIGZ1bmtjZSBkaWFnIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlhZ25vc3RpYyIgbXNnaWQ9IjMxMjEyMzgzNzM5NTE2MzcwNDkiPiJVbW/FvsWIdWplIGFwbGlrYWNpIMSNw61zdCBsaWJvdm9sbsOpIHByb3N0xZllZGt5IHZlIHNrdXBpbsSbIGRpYWcsIG5hcMWZLiBzb3Vib3J5IHZlIHNsb8W+Y2UgL2RldiwgYSB6YXBpc292YXQgZG8gbmljaC4gTcWvxb5lIGRvasOtdCBrIG92bGl2bsSbbsOtIHN0YWJpbGl0eSBhIGJlenBlxI1ub3N0aSBzeXN0w6ltdS4gVG90byBuYXN0YXZlbsOtIGJ5IG3Em2wgcG91xb7DrXZhdCBwb3V6ZSB2w71yb2JjZSDEjWkgb3BlcsOhdG9yIHBybyBkaWFnbm9zdGlrdSBoYXJkd2FydS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NoYW5nZUNvbXBvbmVudFN0YXRlIiBtc2dpZD0iNzk0MjUxOTg4MzQzMjk0MDYiPiJwb3ZvbGVuw60gxI1pIHpha8OhesOhbsOtIGtvbXBvbmVudCBhcGxpa2Fjw60iPC9zdHJpbmc+CkBAIC00MDMsMjIgKzQwNCw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGhBZG1pbiIgbXNnaWQ9IjcyNTYyODk3NzQ2NjcwNTQ1NTUiPiJVbW/FvsWIdWplIGFwbGlrYWNpIGtvbmZpZ3Vyb3ZhdCBtw61zdG7DrSB0ZWxlZm9uIHMgcm96aHJhbsOtbSBCbHVldG9vdGggYSB2eWhsZWTDoXZhdCBhIHDDoXJvdmF0IHZ6ZMOhbGVuw6EgemHFmcOtemVuw60uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ibHVldG9vdGgiIG1zZ2lkPSI4MzYxMDM4NzA3ODU3MDE4NzMyIj4idnl0dm/FmWVuw60gcMWZaXBvamVuw60gQmx1ZXRvb3RoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoIiBtc2dpZD0iNzYyNTE1MzgwNjc5MzkyOTQ1Ij4iVW1vxb7FiHVqZSBhcGxpa2FjaSB6b2JyYXppdCBrb25maWd1cmFjaSBtw61zdG7DrWhvIHRlbGVmb251IHMgcm96aHJhbsOtbSBCbHVldG9vdGgsIHZ5dHbDocWZZXQgcMWZaXBvamVuw60ga2Ugc3DDoXJvdmFuw71tIHphxZnDrXplbsOtbSBhIHDFmWlqw61tYXQgdGF0byBwxZlpcG9qZW7DrS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNBZG1pbiAoMjI1MTMwMjIzMzAxMjI1MDA1NikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNBZG1pbiAoMTkzNTg0MjYxMTQ2NDg5NTc4NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY1JhdyAoNDQyMzQ3MTcxMTExNDMyNTcwOCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNSYXcgKDU1MzMwMjI3MzY1NTkzODU2NjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNOb3RpZnkgKDQ3ODQ3MDM2MDA4Mjc5MjM1OCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNOb3RpZnkgKDI5OTAwNTM1MTc5NjIwNzA2MTcpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNMbGNwICg0OTcyMDUxNDYxMDA3MDMwNDI2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0xsY3AgKDkxNTkyMTI3Nzg2MDA0NjQwKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSI0OTc3NDA2MTY0MzExNTM1MDkyIj4idnlwbnV0w60gesOhbWt1IGtsw6F2ZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSIzMTg5NzYzNDc5MzI2MzAyMDE3Ij4iVW1vxb7FiHVqZSBhcGxpa2FjaSB2eXBub3V0IHrDoW1layBrbMOhdmVzIGEgc291dmlzZWrDrWPDrSB6YWJlenBlxI1lbsOtIGhlc2xlbS4gUMWZw61rbGFkZW0gb3Byw6F2bsSbbsOpaG8gcG91xb5pdMOtIHTDqXRvIGZ1bmtjZSBqZSB2eXBudXTDrSB6w6Fta3Uga2zDoXZlc25pY2UgcMWZaSBwxZnDrWNob3rDrW0gaG92b3J1IGEgamVobyBvcMSbdG92bsOpIHphcG51dMOtIHBvIHNrb27EjWVuw60gaG92b3J1LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFN5bmNTZXR0aW5ncyIgbXNnaWQ9IjYyMDE4MTAwMDgyMzA1MDMwNTIiPiLEjXRlbsOtIG5hc3RhdmVuw60gc3luY2hyb25pemFjZSI8L3N0cmluZz4KQEAgLTQzNSwyMiArNDIwLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9IjEwODI5NzI2MDM1NzYzNjA2OTAiPiJVbW/Fvm7DrSBhcGxpa2FjaSDEjcOtc3Qgc291a3JvbcOhIHNsb3ZhLCBqbcOpbmEgYSBmcsOhemUsIGt0ZXLDoSB1xb5pdmF0ZWwgbW9obCB1bG/Fvml0IGRvIHN2w6lobyBzbG92bsOta3UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI2NzAzMTA5NTExODM2MzQzMzQxIj4iesOhcGlzIGRvIHNsb3Zuw61rdSBkZWZpbm92YW7DqWhvIHXFvml2YXRlbGVtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI0MTI1NjIwNjUyNDA4Mjg4MCI+IlVtb8W+bsOtIGFwbGlrYWNpIHphcGlzb3ZhdCBub3bDoSBzbG92YSBkbyB1xb5pdmF0ZWxza8OpaG8gc2xvdm7DrWt1LiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDgwNzk0MDM3NTkwMDE3NzcyOTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iOTkzNzA3NDM2OTQxMDE2OTEzIj4iem3Em25hL3NtYXrDoW7DrSBvYnNhaHUga2FydHkgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+InptxJtuYS9zbWF6w6Fuw60gb2JzYWh1IGthcnR5IFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjY0Mzk2MzIwNDk3NjQ3MTg3OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDEzMTg3MTU0MTEyNzIxMTUyNiI+IlVtb8W+bsOtIGFwbGlrYWNpIHrDoXBpcyBuYSBrYXJ0dSBTRC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiJVbW/Fvm7DrSBhcGxpa2FjaSB6w6FwaXMgbmEga2FydHUgU0QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJ6bcSbbmEvc21hesOhbsOtIG9ic2FodSBrYXJ0eSBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IlVtb8W+bsOtIGFwbGlrYWNpIHrDoXBpcyBuYSBrYXJ0dSBTRC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSI1NjU2NDg3MjY0ODE5NjY5ODI0Ij4icMWZaXN0dXBvdmF0IGRvIHNvdWJvcm92w6lobyBzeXN0w6ltdSBtZXppcGFtxJt0aSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSIxNjI0NzM0NTI4NDM1NjU5OTA2Ij4iVW1vxb7FiHVqZSBhcGxpa2FjaSDEjcOtc3QgYSB6YXBpc292YXQgZG8gc291Ym9yb3bDqWhvIHN5c3TDqW11IG1lemlwYW3Em3RpLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQzMDc4NjE0OTYzMDI4NTAyMDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDQ5NzQyMDcyODg1NzU4NTc5MSI+Ik9tZXplbsOtIGhlc2xhIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTcxOTg3NzI0NTY5MjMxODI5OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iOTA4MzQwMDA4MDg2MTcyODA1NiI+Ik9tZXp1amUgdHlwIGhlc2VsLCBrdGVyw6EgbHplIHBvdcW+w610LiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDczNzQ3ODA3MTI2NjQyODUzMjEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iOTE0MTMwNjQ2OTQyMTk5NTAzIj4iU2xlZG92w6Fuw60gcG9rdXPFryBvIHDFmWlobMOhxaFlbsOtIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTk2MTI1MTE3OTYyNDg0MzQ4MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iNzIyNzU3ODI2MDE2NTE3MjY3MyI+IlNsZWR1amUgbmV6ZGHFmWVuw6kgcG9rdXN5IG8gcMWZaWhsw6HFoWVuw60gZG8gemHFmcOtemVuw60gYSB1bW/FvsWIdWplIHByb3ZlZGVuw60gdXLEjWl0w6kgYWtjZS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MDg0NzcyMDkwNzk3NDg1NDIwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjI2MjAwNzcxOTEyNDI2ODg5NTUiPiJPYm5vdmVuw60gaGVzbGEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzMzMyMTY3NjAwMzMxNzk5OTkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI1MzkxMjQwNjE2OTgxMjk3MzYxIj4iVnludXTDrSBuYXN0YXZlbsOtIGhlc2xhIG5hIG5vdm91IGhvZG5vdHUsIGt0ZXJvdSB2w6FtIHDFmWVkIHDFmWlobMOhxaFlbsOtbSBtdXPDrSBzZMSbbGl0IHNwcsOhdmNlLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU3NjA0NjYwMjUyNDc2MzQ0ODggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSIyMjc0MDg1Mzg0NzA0MjQ4NDMxIj4iVnludWNlbsOtIHV6YW3EjWVuw60iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyODE5ODY4NjY0OTQ2MDg5NzQwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjU2OTY5NjQxMjYyMjYwMjg0NDIiPiJVcsSNdWplLCBrZHkgZG9qZGUgayB1emFtxI1lbsOtIHphxZnDrXplbsOtIGEgYnVkZSBwb8W+YWRvdsOhbm8gb3DEm3Rvdm7DqSB6YWTDoW7DrSBoZXNsYS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQzMDc4NjE0OTYzMDI4NTAyMDEiPiJPbWV6ZW7DrSBoZXNsYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjE3MTk4NzcyNDU2OTIzMTgyOTkiPiJPbWV6dWplIHR5cCBoZXNlbCwga3RlcsOhIGx6ZSBwb3XFvsOtdC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjczNzQ3ODA3MTI2NjQyODUzMjEiPiJTbGVkb3bDoW7DrSBwb2t1c8WvIG8gcMWZaWhsw6HFoWVuw60iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSIxOTYxMjUxMTc5NjI0ODQzNDgzIj4iU2xlZHVqZSBuZXpkYcWZZW7DqSBwb2t1c3kgbyBwxZlpaGzDocWhZW7DrSBkbyB6YcWZw616ZW7DrSBhIHVtb8W+xYh1amUgcHJvdmVkZW7DrSB1csSNaXTDqSBha2NlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iOTA4NDc3MjA5MDc5NzQ4NTQyMCI+Ik9ibm92ZW7DrSBoZXNsYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjMzMzIxNjc2MDAzMzE3OTk5OTEiPiJWeW51dMOtIG5hc3RhdmVuw60gaGVzbGEgbmEgbm92b3UgaG9kbm90dSwga3Rlcm91IHbDoW0gcMWZZWQgcMWZaWhsw6HFoWVuw61tIG11c8OtIHNkxJtsaXQgc3Byw6F2Y2UuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjU3NjA0NjYwMjUyNDc2MzQ0ODgiPiJWeW51Y2Vuw60gdXphbcSNZW7DrSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IlVyxI11amUsIGtkeSBkb2pkZSBrIHV6YW3EjWVuw60gemHFmcOtemVuw60gYSBidWRlIHBvxb5hZG92w6FubyBvcMSbdG92bsOpIHphZMOhbsOtIGhlc2xhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJWeW1hesOhbsOtIHbFoWVjaCBkYXQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyMzE0MDYwOTMzNzk2Mzk2MjA1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iNzY2OTg5NTMzMzgxNDIyMjU4NiI+IkJleiBkYWzFocOtaG8gcG90dnJ6ZW7DrSBvYm5vdsOtIHbDvWNob3rDrSBuYXN0YXZlbsOtIHogdsO9cm9ieSBhIHNtYcW+ZSB2xaFlY2huYSBkYXRhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iQmV6IGRhbMWhw61obyBwb3R2cnplbsOtIG9ibm92w60gdsO9Y2hvesOtIG5hc3RhdmVuw60geiB2w71yb2J5IGEgc21hxb5lIHbFoWVjaG5hIGRhdGEuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkiIG1zZ2lkPSI2Mzg3NDk3NDY2NjYwMTU0OTMxIj4iTmFzdGF2dGUgZ2xvYsOhbG7DrSBzZXJ2ZXIgcHJveHksIGt0ZXLDvSBqZSBwb3XFvsOtdsOhbiwga2R5xb4ganNvdSB6w6FzYWR5IGFrdGl2bsOtLiBQbGF0bsO9IGdsb2LDoWxuw60gc2VydmVyIHByb3h5IG5hc3RhdnVqZSBwb3V6ZSBwcnZuw60gc3Byw6F2Y2UgemHFmcOtemVuw60uIjwvc3RyaW5nPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iRG9txa8iPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJNb2JpbCI8L2l0ZW0+CkBAIC01NTIsMTAgKzUzOCw5IEBACiAgICAgPHNraXAgLz4KICAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZU90aGVyICg0NDA4NDM2MTYyOTUwMTE5ODQ5KSAtLT4KICAgICA8c2tpcCAvPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+InBvbW9jw60gPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiBwb21vY8OtIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iWmFkZWp0ZSBrw7NkIFBJTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iWmFkZWp0ZSBoZXNsbyBwcm8gb2RibG9rb3bDoW7DrSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iWmFkZWp0ZSBrw7NkIFBJTiBwcm8gb2RibG9rb3bDoW7DrSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+Ik5lc3Byw6F2bsO9IGvDs2QgUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IkNoY2V0ZS1saSB0ZWxlZm9uIG9kZW1rbm91dCwgc3Rpc2tuxJt0ZSBNZW51IGEgcG90w6kgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4ixIzDrXNsbyB0w61zxYhvdsOpIGxpbmt5Ijwvc3RyaW5nPgpAQCAtNTY4LDYgKzU1Myw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+Ilphdm9sYXQgenDEm3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJTcHLDoXZuxJshIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IlprdXN0ZSB0byBwcm9zw61tIHpub3Z1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJaa3VzdGUgdG8gcHJvc8OtbSB6bm92dSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+Ik5hYsOtamVuw60gKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+Ik5hYml0by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01ODIsNiArNTY4LDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IkthcnRhIFNJTSBqZSB6YWJsb2tvdsOhbmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iT2RibG9rb3bDoW7DrSBrYXJ0eSBTSU0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPmtyw6F0IGpzdGUgbmFrcmVzbGlsaSBuZXNwcsOhdm7DqSBiZXpwZcSNbm9zdG7DrSBnZXN0by4gIlxuXG4iT3Bha3VqdGUgcHJvc8OtbSBha2NpIHphIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHMuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iVsOtY2VrcsOhdCAoPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4pIGpzdGUgbmVzcHLDoXZuxJsgemFkYWxpIGhlc2xvLiAiXG5cbiJaa3VzdGUgdG8gem5vdnUgemEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iVsOtY2VrcsOhdCAoPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4pIGpzdGUgbmVzcHLDoXZuxJsgemFkYWxpIGvDs2QgUElOLiAiXG5cbiJaa3VzdGUgdG8gem5vdnUgemEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+Ijx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+a3LDoXQganN0ZSBuZXNwcsOhdm7EmyBuYWtyZXNsaWxpIHN2w6kgYmV6cGXEjW5vc3Ruw60gZ2VzdG8uIFBvIGRhbMWhw61jaCBuZcO6c3DEm8WhbsO9Y2ggcG9rdXNlY2ggKDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+KSBidWRldGUgcG/FvsOhZMOhbmkgbyBvZGVtxI1lbsOtIHRlbGVmb251IHBvbW9jw60gcMWZaWhsw6HFoWVuw60gZG8gw7rEjXR1IEdvb2dsZS4iXG5cbiIgQWtjaSBwcm9zw61tIG9wYWt1anRlIHphIG7Em2tvbGlrIHNla3VuZCAoPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4pLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJTZWt1bmR5IHpiw712YWrDrWPDrSBkbyBkYWzFocOtaG8gcG9rdXN1OiA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJaYXBvbW7Em2xpIGpzdGUgZ2VzdG8/Ijwvc3RyaW5nPgpAQCAtNjEwLDE0ICs1OTgsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ19iZWZvcmVfdW5sb2FkIiBtc2dpZD0iMTkwMTY3NTQ0ODE3OTY1MzA4OSI+IkNoY2V0ZSBvcHVzdGl0IHR1dG8gc3Ryw6Fua3U/IlxuXG4iPHhsaWZmOmcgaWQ9Ik1FU1NBR0UiPiVzPC94bGlmZjpnPiJcblxuIlZ5YmVydGUgT0ssIGNoY2V0ZS1saSBwb2tyYcSNb3ZhdCwgbmVibyBacnXFoWl0LCBjaGNldGUtbGkgbmEgc3Ryw6FuY2UgesWvc3RhdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX2xhYmVsIiBtc2dpZD0iNjg2MDI2MTc1ODY2NTgyNTA2OSI+IlBvdHZyZGl0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZG91YmxlX3RhcF90b2FzdCIgbXNnaWQ9IjEwNjgyMTY5MzcyNDQ1NjcyNDciPiJUaXA6IER2b2ppdMO9bSBrbGVwbnV0w61tIG3Fr8W+ZXRlIHpvYnJhemVuw60gcMWZaWJsw63Fvml0IG5lYm8gb2Rkw6FsaXQuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9maWxsX3RoaXNfZm9ybSAoODk0MDExMDg2Njc3NTA5NzQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSIxMjg0ODQzNzI4MjAzNDEyMTM1Ij4ixI10ZW7DrSBoaXN0b3JpZSBhIHrDoWxvxb5layBQcm9obMOtxb5lxI1lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI0OTgxNDg5ODE1NDY3NjE3MTkxIj4iVW1vxb7FiHVqZSBhcGxpa2FjaSDEjcOtc3QgdsWhZWNobnkgbmF2xaF0w612ZW7DqSBhZHJlc3kgVVJMIGEgesOhbG/Fvmt5IFByb2hsw63FvmXEjWUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5MDA5NDM0MTA5ODM2MjgwMzc0Ij4iesOhcGlzIGRvIGhpc3RvcmllIGEgesOhbG/FvmVrIFByb2hsw63FvmXEjWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5NDU1NzE5OTAzNTcxMTQ5NTAiPiJVbW/Fvm7DrSBhcGxpa2FjaSB6bcSbbml0IGhpc3RvcmlpIMSNaSB6w6Fsb8W+a3kgcHJvaGzDrcW+ZcSNZSB1bG/FvmVuw6kgdiB0ZWxlZm9udS4gxaBrb2RsaXbDqSBhcGxpa2FjZSBtb2hvdSBwb21vY8OtIHRvaG90byBuYXN0YXZlbsOtIHZ5bWF6YXQgxI1pIHBvem3Em25pdCBkYXRhIFByb2hsw63FvmXEjWUuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0QWxhcm0gKDU5MjQ0MDEzMjg4MDM2MTUxNjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0QWxhcm0gKDU5NjY5NjY1OTgxNDk4NzUwODIpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQ3MTUyMTI2NTU1OTgyNzU1MzIiPiJabcSbbml0IG9wcsOhdm7Em27DrSBwcm9obMOtxb5lxI1lIHBvc2t5dG92YXQgaW5mb3JtYWNlIG8gemVtxJtwaXNuw6kgcG9sb3plIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDAxMTkwODI4Mjk4MDg2MTY3OSI+IlVtb8W+xYh1amUgYXBsaWthY2kgem3Em25pdCBvcHLDoXZuxJtuw60gcHJvaGzDrcW+ZcSNZSBwb3NreXRvdmF0IGluZm9ybWFjZSBvIHplbcSbcGlzbsOpIHBvbG96ZS4gxaBrb2RsaXbDqSBhcGxpa2FjZSBtb2hvdSB0b3RvIG5hc3RhdmVuw60gcG91xb7DrXQgayBvZGVzw61sw6Fuw60gaW5mb3JtYWPDrSBvIHVtw61zdMSbbsOtIG5hIGxpYm92b2xuw6kgd2Vib3bDqSBzdHLDoW5reS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiJDaGNldGUsIGFieSBzaSBwcm9obMOtxb5lxI0gemFwYW1hdG92YWwgdG90byBoZXNsbz8iPC9zdHJpbmc+CkBAIC03MzAsMTQgKzcxNiwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlZ5YnJhdCB2xaFlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiJWeWJyYXQgc2xvdm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iVnlqbW91dCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iS29ww61yb3ZhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IlZsb8W+aXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IktvcMOtcm92YXQgYWRyZXN1IFVSTCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHRNb2RlIiBtc2dpZD0iNjczODU1NjM0ODg2MTM0NzI0MCI+IlZ5YnJhdCB0ZXh0Li4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+IlbDvWLEm3IgdGV4dHUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJNZXRvZGEgemFkw6F2w6Fuw60gZGF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IlDFmWlkYXQgc2xvdm8g4oCePHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPuKAnCBkbyBzbG92bsOta3UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiLDmnByYXZ5IHRleHR1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSI0OTA5MTM1NTY0OTQxODE1NDk0Ij4iT3BlcmFjZSBzIHRleHRlbSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iTcOhbG8gcGFtxJt0aSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IlYgdGVsZWZvbnUgemLDvXbDoSBtw6FsbyBtw61zdGEgcHJvIHVrbMOhZMOhbsOtIGRhdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTc0NSw2ICs3MzEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iWnJ1xaFpdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJVcG96b3JuxJtuw60iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+Ik5hxI3DrXTDoW7DrS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iWkFQTlVUTyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IlZZUE5PVVQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkRva29uxI1pdCBha2NpIHBvbW9jw60gYXBsaWthY2UiPC9zdHJpbmc+CkBAIC03NjMsOSArNzUwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiJVa29uxI1pdCBhcGxpa2FjaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlcG9ydCIgbXNnaWQ9IjQwNjAyMTgyNjA5ODQ3OTU3MDYiPiJOYWhsw6FzaXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3YWl0IiBtc2dpZD0iNzE0NzExODIxNzIyNjMxNzczMiI+IlBvxI1rYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJBcGxpa2FjZSBwxZllc23Em3JvdsOhbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+IkplIHNwdcWhdMSbbmEgYXBsaWthY2UgPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+IlDFr3ZvZG7EmyBieWxhIHNwdcWhdMSbbmEgYXBsaWthY2UgPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iQXBsaWthY2UgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgcG9ydcWhaWxhIHN2w6kgdmxhc3Ruw60gdnludWNlbsOpIHrDoXNhZHkgU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJQcm9jZXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IHBvcnXFoWlsIHN2w6kgdmxhc3Ruw60gdnludWNlbsOpIHrDoXNhZHkgU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+IkLEm8W+w60gYXBsaWthY2UgPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC04MTIsMjggKzgwMiwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybXNfc2hvd19hbGwiIG1zZ2lkPSIyNjcxNzkxMTYzOTMzMDkxMTgwIj48Yj4iWm9icmF6aXQgdsWhZSI8L2I+PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9hY3Rpdml0eV90aXRsZSIgbXNnaWQ9IjIzOTkyODk5OTk2MDg5MDA0NDMiPiLDmmxvxb5pxaF0xJsgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfdGl0bGUiIG1zZ2lkPSI1OTAxNDU5MDQxMzk4NzUxNDk1Ij4iVVNCIHDFmWlwb2plbm8iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0Nzk2NzU5NjQ2MTY3MjQ3MTc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjgyMzE0NjI3NTAwMTAwNjY4OTYiPiJQxZlpcG9qaWxpIGpzdGUgc3bFr2ogdGVsZWZvbiBrIHBvxI3DrXRhxI1pIHBvbW9jw60gVVNCLiBDaGNldGUtbGkga29ww61yb3ZhdCBzb3Vib3J5IHogcG/EjcOtdGHEjWUgbmEga2FydHUgU0QgdiB6YcWZw616ZW7DrSBBbmRyb2lkIMSNaSBvYnLDoWNlbsSbLCB2eWJlcnRlIG7DoXNsZWR1asOtY8OtIHRsYcSNw610a28uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJQxZlpcG9qaWxpIGpzdGUgc3bFr2ogdGVsZWZvbiBrIHBvxI3DrXRhxI1pIHBvbW9jw60gVVNCLiBDaGNldGUtbGkga29ww61yb3ZhdCBzb3Vib3J5IHogcG/EjcOtdGHEjWUgbmEga2FydHUgU0QgdiB6YcWZw616ZW7DrSBBbmRyb2lkIMSNaSBvYnLDoWNlbsSbLCB2eWJlcnRlIG7DoXNsZWR1asOtY8OtIHRsYcSNw610a28uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJQxZlpcG9qaWxpIGpzdGUgc3bFr2ogdGVsZWZvbiBrIHBvxI3DrXRhxI1pIHBvbW9jw60gVVNCLiBDaGNldGUtbGkga29ww61yb3ZhdCBzb3Vib3J5IHogcG/EjcOtdGHEjWUgbmEga2FydHUgU0QgdiB6YcWZw616ZW7DrSBBbmRyb2lkIMSNaSBvYnLDoWNlbsSbLCB2eWJlcnRlIG7DoXNsZWR1asOtY8OtIHRsYcSNw610a28uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYnV0dG9uX21vdW50IiBtc2dpZD0iMTA1MjI1OTkzMDM2OTUwODIzNSI+IlphcG5vdXQgw7psb8W+acWhdMSbIFVTQiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI1MzQ3ODQ3NTE2MDMzNDUzNjMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDgxODM0Nzc1NjQwMjc0MDI2MSI+IlDFmWkgcG91xb7DrXbDoW7DrSB2YcWhw60ga2FydHkgU0QgamFrbyDDumxvxb5pxaF0xJsgVVNCIGRvxaFsbyBrIHByb2Jsw6ltdS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IlDFmWkgcG91xb7DrXbDoW7DrSB2YcWhw60ga2FydHkgU0QgamFrbyDDumxvxb5pxaF0xJsgVVNCIGRvxaFsbyBrIHByb2Jsw6ltdS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IlDFmWkgcG91xb7DrXbDoW7DrSB2YcWhw60ga2FydHkgU0QgamFrbyDDumxvxb5pxaF0xJsgVVNCIGRvxaFsbyBrIHByb2Jsw6ltdS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4MTc1ODkyNTU0NzU3MjE2NTI1Ij4iVVNCIHDFmWlwb2plbm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjczODAwODI0MDQyODgyMTkzNDEiPiJWeWJlcnRlLCBjaGNldGUtbGkga29ww61yb3ZhdCBzb3Vib3J5IGRvIG5lYm8geiBwb8SNw610YcSNZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjIzMzYwNTgzOTY2NjM1MTYwMTciPiJWeXBub3V0IMO6bG/FvmnFoXTEmyBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjU5MTgxMzQ5MDI2OTg0MTUzOSI+IlZ5YmVydGUsIGNoY2V0ZS1saSB2eXBub3V0IMO6bG/FvmnFoXTEmyBVU0IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF90aXRsZSIgbXNnaWQ9IjY2MDEyOTg1MTcwODc3NTg1MyI+IsOabG/FvmnFoXTEmyBVU0IgamUgcG91xb7DrXbDoW5vIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYxMzcxMzM5NjQyNjYwNDEwNCAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg3NDUzNDUyNjA3ODAyNjcxODUiPiJQxZllZCB2eXBudXTDrW0gw7psb8W+acWhdMSbIFVTQiB6a29udHJvbHVqdGUsIHpkYSBqc3RlIG9kcG9qaWxpICh2eWptdWxpKSBrYXJ0dSBTRCB6YcWZw616ZW7DrSBBbmRyb2lkIHogcG/EjcOtdGHEjWUuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IlDFmWVkIHZ5cG51dMOtbSDDumxvxb5pxaF0xJsgVVNCIHprb250cm9sdWp0ZSwgemRhIGpzdGUgb2Rwb2ppbGkgKHZ5am11bGkpIGthcnR1IFNEIHphxZnDrXplbsOtIEFuZHJvaWQgeiBwb8SNw610YcSNZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4iUMWZZWQgdnlwbnV0w61tIMO6bG/FvmnFoXTEmyBVU0IgemtvbnRyb2x1anRlLCB6ZGEganN0ZSBvZHBvamlsaSAodnlqbXVsaSkga2FydHUgU0QgemHFmcOtemVuw60gQW5kcm9pZCB6IHBvxI3DrXRhxI1lLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfYnV0dG9uX21vdW50IiBtc2dpZD0iNzA2MDIxODAzNDkwMDY5NjAyOSI+IlZ5cG5vdXQgw7psb8W+acWhdMSbIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjE0Mzg4MTkxNDg0MDQxMjEwOCI+IlDFmWkgdnlww61uw6Fuw60gw7psb8W+acWhdMSbIFVTQiBkb8WhbG8gayBwcm9ibMOpbcWvbS4gWmtvbnRyb2x1anRlLCB6ZGEgYnlsIGhvc3RpdGVsIFVTQiBvZHBvamVuLCBhIHprdXN0ZSB0byB6bm92dS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGl0bGUiIG1zZ2lkPSI5NjMwMzkwMzM0NzA0Nzg2OTciPiJaYXBub3V0IMO6bG/FvmnFoXTEmyBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGV4dCIgbXNnaWQ9IjMyMDI4MzgyMzQ3ODA1MDU4ODYiPiJQb2t1ZCB6YXBuZXRlIMO6bG/FvmnFoXTEmyBVU0IsIGRvamRlIGsgemFzdGF2ZW7DrSBuxJtrdGVyw71jaCBwb3XFvsOtdmFuw71jaCBhcGxpa2Fjw60uIFR5dG8gYXBsaWthY2UgcHJhdmTEm3BvZG9ibsSbIG5lYnVkb3UgayBkaXNwb3ppY2kgYcW+IGRvIHZ5cG51dMOtIMO6bG/FvmnFoXTEmyBVU0IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2Vycm9yX3RpdGxlIiBtc2dpZD0iODA0ODk5OTk3MzgzNzMzOTE3NCI+IkNoeWJhIG9wZXJhY2UgbmEgcm96aHJhbsOtIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19vayIgbXNnaWQ9IjczNzY5NTMxNjcwMzk4NjU3MDEiPiJPSyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg2NjMyNDc5Mjk1NTEwOTU4NTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NTc3OTA4MDA2OTQ5NzQyMjE3Ij4iRm9ybcOhdG92YXQga2FydHUgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4NjYzMjQ3OTI5NTUxMDk1ODU0Ij4iRm9ybcOhdG92YXQga2FydHUgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjIxMzY5OTYyNDMzNTIzNjE5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNDcwODE1MTQwMDY4NTAyODI0Ij4iT3ByYXZkdSBjaGNldGUga2FydHUgU0QgbmFmb3Jtw6F0b3ZhdD8gVsWhZWNobmEgZGF0YSBuYSBrYXJ0xJsgYnVkb3UgenRyYWNlbmEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4iT3ByYXZkdSBjaGNldGUga2FydHUgU0QgbmFmb3Jtw6F0b3ZhdD8gVsWhZWNobmEgZGF0YSBuYSBrYXJ0xJsgYnVkb3UgenRyYWNlbmEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IkZvcm3DoXRvdmF0IGthcnR1IFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4iT3ByYXZkdSBjaGNldGUga2FydHUgU0QgbmFmb3Jtw6F0b3ZhdD8gVsWhZWNobmEgZGF0YSBuYSBrYXJ0xJsgYnVkb3UgenRyYWNlbmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X2J1dHRvbl9mb3JtYXQiIG1zZ2lkPSI0MTMxMDY0NTYwMTI3NDc4Njk1Ij4iRm9ybcOhdG92YXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3MjkwNDQ3Nzg5NDkxODk5MTgiPiJMYWTEm27DrSBwxZllcyByb3pocmFuw60gVVNCIHDFmWlwb2plbm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODQ3MDI5NjgxODI3MDExMDM5NiI+IlZ5YmVydGUsIGNoY2V0ZS1saSB6YWvDoXphdCBsYWTEm27DrSBVU0IuIjwvc3RyaW5nPgpAQCAtODQxLDI5ICs4MjYsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX2FscGhhYmV0IiBtc2dpZD0iNTQzMzI3NTQ4NTQ5OTAzOTE5OSI+IiBBw4FCQ8SMRMSORcOJxJpGR0hDSEnDjUpLTE1OxYdPw5NQUVLFmFPFoFTFpFXDmlZXWFnDnVrFvSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX251bWVyaWNfYWxwaGFiZXQiIG1zZ2lkPSI0MDMwMTcwNTI0NTk1MTIzNjEwIj4iIDAxMjM0NTY3ODlBw4FCQ8SMRMSORcOJxJpGR0hDSEnDjUpLTE1OxYdPw5NQUVLFmFPFoFTFpFXDmlZXWFnDnVrFvSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhbmRpZGF0ZXNfc3R5bGUiIG1zZ2lkPSI0MzMzOTEzMDg5NjM3MDYyMjU3Ij48dT4ia2FuZGlkw6F0aSI8L3U+PC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NDU3NjAzNDE4OTcwOTk0MDUwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQyMzk1MTY2NzUwMjg0Mzg5OTciPiJQxZnDrXByYXZhIGthcnR5IFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiJQxZnDrXByYXZhIGthcnR5IFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiJQxZnDrXByYXZhIGthcnR5IFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODI4NzMxOTg4MjkyNjczNzA1MyI+IktvbnRyb2xhIGNoeWIuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzgwNDc3ODM4MjQxMjEyOTk3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzkzNzM0NTU3Nzk4MzczMDg3MyI+IlByw6F6ZG7DoSBrYXJ0YSBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IlByw6F6ZG7DoSBrYXJ0YSBTRCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDEzMTIyNjY4MjAwOTI5NTgwMTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE2MDY2NjA3NTYxMjQ2Mjk3MDgiPiJLYXJ0YSBTRCBqZSBwcsOhemRuw6EgbmVibyBwb3XFvsOtdsOhIG5lcG9kcG9yb3ZhbsO9IHN5c3TDqW0gc291Ym9yxa8uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iS2FydGEgU0QgamUgcHLDoXpkbsOhIG5lYm8gb2JzYWh1amUgbmVwb2Rwb3JvdmFuw70gc3lzdMOpbSBzb3Vib3LFry4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NDEwNzIzOTA2MDE5MTAwMTg5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE3MjQ2MTk5MDIwNzY1Mjg4ODkiPiJQb8Wha296ZW7DoSBrYXJ0YSBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iUG/FoWtvemVuw6Ega2FydGEgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNjc5NDEyODg0MjkwMDYxNzc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjQ2MDMxMTgzNTEzMDY3MTE5NCI+IkthcnRhIFNEIGplIHBvxaFrb3plbmEuIFByYXZkxJtwb2RvYm7EmyBqaSBidWRlIG51dG7DqSB6bm92dSBmb3Jtw6F0b3ZhdC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iS2FydGEgU0QgamUgcG/FoWtvemVuw6EuIEJ1ZGUgcHJhdmTEm3BvZG9ibsSbIG51dG7DqSBqaSBwxZllZm9ybcOhdG92YXQuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjg3MjE1Mjg4MjYwNDQwNzgzNyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI1ODIxNzUwMTYwNjA0MzIwMzQiPiJLYXJ0YSBTRCBieWxhIG5lb8SNZWvDoXZhbsSbIG9kZWJyw6FuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJLYXJ0YSBTRCBieWxhIG5lb8SNZWvDoXZhbsSbIG9kZWJyw6FuYSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDcyNjAxODMyOTM3NDc0NDgyNDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjIwMDUzOTY0NjQ0OTQ2NDg5MzciPiJDaGNldGUtbGkgemFicsOhbml0IHp0csOhdMSbIGRhdCwga2FydHUgU0QgcMWZZWQgb2RlYnLDoW7DrW0gb2Rwb2p0ZS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiJDaGNldGUtbGkgemFicsOhbml0IHp0csOhdMSbIGRhdCwga2FydHUgU0QgcMWZZWQgb2RlYnLDoW7DrW0gb2Rwb2p0ZS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NzI5ODAxMTMwNzkwNjE2MjAwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNjUyNTg4MTAxODY3OTUxNSI+IkthcnR1IFNEIGplIG1vxb5uw6kgYmV6cGXEjW7EmyBvZGVicmF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iS2FydHUgU0QgamUgbW/Fvm7DqSBiZXpwZcSNbsSbIG9kZWJyYXQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3NjEzOTYwNjg2NzQ3NTkyNzcwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijc1MDM3NjkxMDYyODUxODg3MDMiPiJLYXJ0dSBTRCBsemUgbnluw60gYmV6cGXEjW7EmyB2eWptb3V0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiJLYXJ0dSBTRCBsemUgYmV6cGXEjW7EmyBvZGVicmF0LiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg5MDI1MTgwMzA0MDQzODEzMTggLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxODc0ODg5NzY0MzY3MDg1NTYyIj4iS2FydGEgU0QgYnlsYSBvZHN0cmFuxJtuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiJLYXJ0YSBTRCBieWxhIG9kc3RyYW7Em25hIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDIwNTExNzIyNzM0MjgyMjI3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjczMDg5MDQ0MTMzMTM0NDc3NiI+IkthcnRhIFNEIGJ5bGEgb2RlYnLDoW5hLiBDaGNldGUtbGkgenbEm3TFoWl0IMO6bG/FvmnFoXTEmyBzdsOpaG8gemHFmcOtemVuw60sIHZsb8W+dGUga2FydHUgU0QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iS2FydGEgU0QgYnlsYSBvZGVicsOhbmEuIFZsb8W+dGUgbm92b3Uga2FydHUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iUHLDoXpkbsOhIGthcnRhIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iS2FydGEgU0QgamUgcHLDoXpkbsOhIG5lYm8gb2JzYWh1amUgbmVwb2Rwb3JvdmFuw70gc3lzdMOpbSBzb3Vib3LFry4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjQxMDcyMzkwNjAxOTEwMDE4OSI+IlBvxaFrb3plbsOhIGthcnRhIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IkthcnRhIFNEIGplIHBvxaFrb3plbsOhLiBCdWRlIHByYXZkxJtwb2RvYm7EmyBudXRuw6kgamkgcMWZZWZvcm3DoXRvdmF0LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJLYXJ0YSBTRCBieWxhIG5lb8SNZWvDoXZhbsSbIG9kZWJyw6FuYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+IkNoY2V0ZS1saSB6YWJyw6FuaXQgenRyw6F0xJsgZGF0LCBrYXJ0dSBTRCBwxZllZCBvZGVicsOhbsOtbSBvZHBvanRlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+IkthcnR1IFNEIGplIG1vxb5uw6kgYmV6cGXEjW7EmyBvZGVicmF0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IkthcnR1IFNEIGx6ZSBiZXpwZcSNbsSbIG9kZWJyYXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IkthcnRhIFNEIGJ5bGEgb2RzdHJhbsSbbmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjM4NzAxMjA2NTI5ODM2NTk2NDEiPiJLYXJ0YSBTRCBieWxhIG9kZWJyw6FuYS4gVmxvxb50ZSBub3ZvdSBrYXJ0dS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY3Rpdml0eV9saXN0X2VtcHR5IiBtc2dpZD0iNDE2ODgyMDYwOTQwMzM4NTc4OSI+Ik5lYnlseSBuYWxlemVueSDFvsOhZG7DqSBvZHBvdsOtZGFqw61jw60gYWt0aXZpdHkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODc4NzM1MjA3NDMyNjc0ODg5MiI+ImFrdHVhbGl6b3ZhdCBzdGF0aXN0aWt1IHBvdcW+aXTDrSBzb3XEjcOhc3TDrSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4OTE1NTM2OTU3MTY3NTI4MzUiPiJVbW/FvsWIdWplIHptxJtudSBzaHJvbcOhxb5kxJtuw71jaCBzdGF0aXN0aWNrw71jaCDDumRhasWvIG8gcG91xb5pdMOtIHNvdcSNw6FzdMOtLiBOZW7DrSB1csSNZW5vIHBybyBixJvFvm7DqSBhcGxpa2FjZS4iPC9zdHJpbmc+CkBAIC04OTgsMTUgKzg3MiwyNCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IlPDrcWlIFZQTiBMMlRQL0lQU2VjIHMgcMWZZWRzZMOtbGVuw71tIGtsw63EjWVtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlPDrcWlIFZQTiBMMlRQL0lQU2VjIHMgY2VydGlmaWvDoXRlbSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+Ilp2b2xpdCBzb3Vib3IiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJOZW7DrSB2eWJyw6FuIMW+w6FkbsO9IHNvdWJvciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IlJlc2V0b3ZhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJPZGVzbGF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJvYmzDrWJlbsOpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iQWt0aXZvdsOhbiByZcW+aW0gViBhdXTEmyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJWeWJlcnRlLCBjaGNldGUtbGkgdWtvbsSNaXQgcmXFvmltIE5hIGNlc3TEmy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iSmUgYWt0aXZuw60gdGV0aGVyaW5nIG5lYm8gaG90c3BvdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IkRvdHlrZW0gemFow6Fqw610ZSBrb25maWd1cmFjaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IlpwxJt0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iRGFsxaHDrSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+IlDFmWVza2/EjWl0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iVnlzb2vDqSB2eXXFvml0w60gbW9iaWxuw61jaCBkYXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IkRvdHlrZW0gem9icmF6w610ZSBkYWzFocOtIGluZm9ybWFjZSBvIHZ5dcW+aXTDrSBtb2JpbG7DrWNoIGRhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iQnlsIHDFmWVrcm/EjWVuIGxpbWl0IG1vYmlsbsOtY2ggZGF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNDcxMjM2OTg1NjYwMTI3NTE0NiI+IkRvdHlrZW0gem9icmF6w610ZSBkYWzFocOtIGluZm9ybWFjZSBvIHZ5dcW+aXTDrSBtb2JpbG7DrWNoIGRhdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX21hdGNoZXMiIG1zZ2lkPSI4MTI5NDIxOTA4OTE1ODQwNzM3Ij4ixb3DoWRuw6kgc2hvZHkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmaW5kX29uX3BhZ2UiIG1zZ2lkPSIxOTQ2Nzk5MjMzODIyODIwMzg0Ij4iVnlobGVkYXQgbmEgc3Ryw6FuY2UiPC9zdHJpbmc+CisgIDxwbHVyYWxzIG5hbWU9Im1hdGNoZXNfZm91bmQiPgorICAgIDxpdGVtIHF1YW50aXR5PSJvbmUiIG1zZ2lkPSI4MTY3MTQ3MDgxMTM2NTc5NDM5Ij4iMSBzaG9kYSI8L2l0ZW0+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im90aGVyIiBtc2dpZD0iNDY0MTg3Mjc5NzA2NzYwOTE3NyI+Ijx4bGlmZjpnIGlkPSJJTkRFWCI+JWQ8L3hsaWZmOmc+IHogPHhsaWZmOmcgaWQ9IlRPVEFMIj4lZDwveGxpZmY6Zz4iPC9pdGVtPgorICA8L3BsdXJhbHM+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCmluZGV4IDVmMGMwZWUuLmQ3ZTM2MjUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbApAQCAtMTY5LDggKzE2OSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfZGV2ZWxvcG1lbnRUb29scyIgbXNnaWQ9IjM0NDYxNjQ1ODQ3MTA1OTY1MTMiPiJVZHZpa2xpbmdzdsOmcmt0w7hqZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSI5MDU2NDMxMTkzODkzODA5ODE0Ij4iRnVua3Rpb25lciBrdW4gdGlsIHByb2dyYW11ZHZpa2xlcmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX3N0b3JhZ2UiIG1zZ2lkPSIxOTcxMTE4NzcwNTQ2MzM2OTY2Ij4iTGFncmluZyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkyMDMzMDIyMTQ5MTUzNTU3NzQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI1NDU1ODA0MzUzMjIwNTgxMzEyIj4iRsOlIGFkZ2FuZyB0aWwgU0Qta29ydGV0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiJGw6UgYWRnYW5nIHRpbCBTRC1rb3J0ZXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IkbDpSBhZGdhbmcgdGlsIFNELWtvcnRldC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhciIgbXNnaWQ9Ijc0MTcxOTI2Mjk2MDE4OTA3OTEiPiJkZWFrdGl2ZXIgZWxsZXIgcmVkaWdlciBzdGF0dXNsaW5qZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3N0YXR1c0JhciIgbXNnaWQ9IjEzNjU0NzM1OTUzMzE5ODk3MzIiPiJUaWxsYWRlciwgYXQgZXQgcHJvZ3JhbSBkZWFrdGl2ZXJlciBzdGF0dXNsaW5qZW4gZWxsZXIgdGlsZsO4amVyIGVsbGVyIGZqZXJuZXIgc3lzdGVtaWtvbmVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyU2VydmljZSIgbXNnaWQ9IjcyNDcyODE5MTEzODc5MzE0ODUiPiJzdGF0dXNiasOmbGtlIjwvc3RyaW5nPgpAQCAtMjY3LDggKzI2NiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2xlYXJBcHBDYWNoZSIgbXNnaWQ9Ijc3NDA0NjU2OTQxOTM2NzE0MDIiPiJUaWxsYWRlciwgYXQgZXQgcHJvZ3JhbSBmcmlnw7hyIHBsYWRzIHDDpSB0ZWxlZm9uZW4gdmVkIGF0IHNsZXR0ZSBmaWxlciBpIHByb2dyYW1tZXRzIGNhY2hlbWFwcGUuIEFkZ2FuZyBlciBub3JtYWx0IG1lZ2V0IGJlZ3LDpm5zZXQgdGlsIHN5c3RlbXByb2Nlc3Nlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX21vdmVQYWNrYWdlIiBtc2dpZD0iNzI4NDU0OTc5OTQ2NTAzOTI2Ij4iRmx5dCBwcm9ncmFtcmVzc291cmNlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21vdmVQYWNrYWdlIiBtc2dpZD0iNjMyMzA0OTI5MTkyMzkyNTI3NyI+IlRpbGxhZGVyLCBhdCBldCBwcm9ncmFtIGZseXR0ZXIgcHJvZ3JhbXJlc3NvdXJjZXIgZnJhIGludGVybmUgdGlsIGVrc3Rlcm5lIG1lZGllciBvZyBvbXZlbmR0LiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ4MTE5MjE3MDM4ODI1MzIwNzAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZExvZ3MiIG1zZ2lkPSI2NjE1Nzc4NTQzMTk4OTY3NjE0Ij4ibMOmcyBzeXN0ZW1sb2dmaWxlciI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIyNTc5Mzc5NTU1ODA0NzU5MDIgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+IlRpbGxhZGVyLCBhdCBldCBwcm9ncmFtIGzDpnNlciBmcmEgc3lzdGVtZXRzIGZvcnNrZWxsaWdlIGxvZ2ZpbGVyLiBEZXJtZWQga2FuIGdlbmVyZWxsZSBvcGx5c25pbmdlciBvbSwgaHZhZCBkdSBsYXZlciBtZWQgdGVsZWZvbmVuLCByZWdpc3RyZXJlcywgbWVuIGxvZ2ZpbGVybmUgYsO4ciBpa2tlIGluZGVob2xkZSBwZXJzb25saWdlIGVsbGVyIHByaXZhdGUgb3BseXNuaW5nZXIuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZExvZ3MgKDY2MTU3Nzg1NDMxOTg5Njc2MTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZExvZ3MgKDg4OTY0NDk0Mzc0NjQ4Njc3NjYpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2RpYWdub3N0aWMiIG1zZ2lkPSI4MDc2NzQzOTUzOTA4MDAwMzQyIj4ibMOmcy9za3JpdiB0aWwgcmVzc291cmNlciBlamV0IGFmIGRpYWciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaWFnbm9zdGljIiBtc2dpZD0iMzEyMTIzODM3Mzk1MTYzNzA0OSI+IlRpbGxhZGVyLCBhdCBldCBwcm9ncmFtIGzDpnNlciBvZyBza3JpdmVyIHRpbCBhbGxlIHJlc3NvdXJjZXIsIGRlciBlamVzIGFmIGRpYWctZ3J1cHBlbiwgc29tIGYuZWtzLiBmbGllciBpIC9kZXYuIERldHRlIGthbiBtdWxpZ3ZpcyBww6V2aXJrZSBzeXN0ZW1ldHMgc3RhYmlsaXRldCBvZyBzaWtrZXJoZWQuIERldHRlIGLDuHIgS1VOIGJydWdlcyB0aWwgaGFyZHdhcmVzcGVjaWZpa2tlIGRpYWdub3N0aWNlcmluZ2VyIGZvcmV0YWdldCBhZiBwcm9kdWNlbnQgZWxsZXIgdWRieWRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NoYW5nZUNvbXBvbmVudFN0YXRlIiBtc2dpZD0iNzk0MjUxOTg4MzQzMjk0MDYiPiJha3RpdmVyIGVsbGVyIGRlYWt0aXZlciBwcm9ncmFta29tcG9uZW50ZXIiPC9zdHJpbmc+CkBAIC00MDMsMjIgKzQwNCw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGhBZG1pbiIgbXNnaWQ9IjcyNTYyODk3NzQ2NjcwNTQ1NTUiPiJUaWxsYWRlciwgYXQgZXQgcHJvZ3JhbSBrb25maWd1cmVyZXIgZGVuIGxva2FsZSBCbHVldG9vdGgtdGVsZWZvbiBzYW10IG9wZGFnZXIgb2cgcGFycmVyIG1lZCBmamVybmUgZW5oZWRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2JsdWV0b290aCIgbXNnaWQ9IjgzNjEwMzg3MDc4NTcwMTg3MzIiPiJvcHJldCBCbHVldG9vdGgtZm9yYmluZGVsc2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoIiBtc2dpZD0iNzYyNTE1MzgwNjc5MzkyOTQ1Ij4iVGlsbGFkZXIsIGF0IGV0IHByb2dyYW0gdmlzZXIga29uZmlndXJhdGlvbmVuIGFmIGRlbiBsb2thbGUgQmx1ZXRvb3RoLXRlbGVmb24gc2FtdCBvcHJldHRlciBvZyBhY2NlcHRlcmVyIGZvcmJpbmRlbHNlIG1lZCBwYXJyZWRlIGVuaGVkZXIuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjQWRtaW4gKDIyNTEzMDIyMzMwMTIyNTAwNTYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjQWRtaW4gKDE5MzU4NDI2MTE0NjQ4OTU3ODUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNSYXcgKDQ0MjM0NzE3MTExMTQzMjU3MDgpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjUmF3ICg1NTMzMDIyNzM2NTU5Mzg1NjY1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjTm90aWZ5ICg0Nzg0NzAzNjAwODI3OTIzNTgpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTm90aWZ5ICgyOTkwMDUzNTE3OTYyMDcwNjE3KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjTGxjcCAoNDk3MjA1MTQ2MTAwNzAzMDQyNikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNMbGNwICg5MTU5MjEyNzc4NjAwNDY0MCkgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iNDk3NzQwNjE2NDMxMTUzNTA5MiI+ImRlYWt0aXZlciB0YXN0YXR1cmzDpXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSIzMTg5NzYzNDc5MzI2MzAyMDE3Ij4iVGlsbGFkZXIsIGF0IGV0IHByb2dyYW0gZGVha3RpdmVyZXIgdGFzdGF0dXJsw6VzZW4gb2cgYWwgYXNzb2NpZXJldCBhZGdhbmdza29kZXNpa2tlcmhlZC4gRXQgbGVnaXRpbXQgZWtzZW1wZWwgcMOlIGRldHRlIGVyLCBhdCB0ZWxlZm9uZW4gZGVha3RpdmVyZXIgdGFzdGF0dXJsw6VzZW4sIG7DpXIgZGVyIG1vZHRhZ2VzIGV0IGluZGfDpWVuZGUgdGVsZWZvbm9wa2FsZCwgb2cgZ2VuYWt0aXZlcmVyIHRhc3RhdHVybMOlc2VuLCBuw6VyIG9wa2FsZGV0IGVyIGFmc2x1dHRldC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRTeW5jU2V0dGluZ3MiIG1zZ2lkPSI2MjAxODEwMDA4MjMwNTAzMDUyIj4ibMOmcyBpbmRzdGlsbGluZ2VyIGZvciBzeW5rcm9uaXNlcmluZyI8L3N0cmluZz4KQEAgLTQzNSwyMiArNDIwLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9IjEwODI5NzI2MDM1NzYzNjA2OTAiPiJUaWxsYWRlciwgYXQgZXQgcHJvZ3JhbSBsw6ZzZXIgYWxsZSBwcml2YXRlIG9yZCwgbmF2bmUgb2cgc8OmdG5pbmdlciwgc29tIGJydWdlcmVuIGV2ZW50dWVsdCBoYXIgZ2VtdCBpIGJydWdlcm9yZGJvZ2VuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iNjcwMzEwOTUxMTgzNjM0MzM0MSI+InNrcml2IHRpbCBkZW4gYnJ1Z2VyZGVmaW5lcmVkZSBvcmRib2ciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjQxMjU2MjA2NTI0MDgyODgwIj4iVGlsbGFkZXIsIGF0IGV0IHByb2dyYW0gc2tyaXZlciBueWUgb3JkIGkgYnJ1Z2Vyb3JkYm9nZW4uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODA3OTQwMzc1OTAwMTc3NzI5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI5OTM3MDc0MzY5NDEwMTY5MTMiPiJyZXQvc2xldCBpbmRob2xkZXQgcMOlIFNELWtvcnRldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4icmV0L3NsZXQgaW5kaG9sZGV0IHDDpSBTRC1rb3J0ZXQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NjQzOTYzMjA0OTc2NDcxODc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MTMxODcxNTQxMTI3MjExNTI2Ij4iVGlsbGFkZXIsIGF0IGV0IHByb2dyYW0gc2tyaXZlciB0aWwgU0Qta29ydGV0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IlRpbGxhZGVyLCBhdCBldCBwcm9ncmFtIHNrcml2ZXIgdGlsIFNELWtvcnRldC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+InJldC9zbGV0IGluZGhvbGRldCBww6UgU0Qta29ydGV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4iVGlsbGFkZXIsIGF0IGV0IHByb2dyYW0gc2tyaXZlciB0aWwgU0Qta29ydGV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjU2NTY0ODcyNjQ4MTk2Njk4MjQiPiJmw6UgYWRnYW5nIHRpbCBjYWNoZS1maWxzeXN0ZW1ldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSIxNjI0NzM0NTI4NDM1NjU5OTA2Ij4iVGlsbGFkZXIsIGF0IGV0IHByb2dyYW0gbMOmc2VyIG9nIHNrcml2ZXIgdGlsIGNhY2hlLWZpbHN5c3RlbWV0LiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQzMDc4NjE0OTYzMDI4NTAyMDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDQ5NzQyMDcyODg1NzU4NTc5MSI+IkJlZ3LDpm5zIGFkZ2FuZ3Nrb2RlIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTcxOTg3NzI0NTY5MjMxODI5OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iOTA4MzQwMDA4MDg2MTcyODA1NiI+IkJlZ3LDpm5zIGRlIGFkZ2FuZ3Nrb2RldHlwZXIsIGR1IGhhciB0aWxsYWRlbHNlIHRpbCBhdCBicnVnZS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3Mzc0NzgwNzEyNjY0Mjg1MzIxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjkxNDEzMDY0Njk0MjE5OTUwMyI+IlZpcyBmb3Jzw7hnIHDDpSBhdCBsb2dnZSBpbmQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxOTYxMjUxMTc5NjI0ODQzNDgzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSI3MjI3NTc4MjYwMTY1MTcyNjczIj4iT3ZlcnbDpWcgbWlzbHlra2VkZSBmb3Jzw7hnIHDDpSBhdCBsb2dnZSBpbmQgcMOlIGVuaGVkZW4gZm9yIGF0IGZvcmV0YWdlIGVuIGhhbmRsaW5nLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkwODQ3NzIwOTA3OTc0ODU0MjAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iMjYyMDA3NzE5MTI0MjY4ODk1NSI+Ik51bHN0aWwgYWRnYW5nc2tvZGUiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzMzMyMTY3NjAwMzMxNzk5OTkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI1MzkxMjQwNjE2OTgxMjk3MzYxIj4iVHZpbmcgZGluIGFkZ2FuZ3Nrb2RlIHRpbCBlbiBueSB2w6ZyZGkuIERldHRlIGtyw6Z2ZXIsIGF0IGFkbWluaXN0cmF0b3JlbiBnaXZlciBkZW4gdGlsIGRpZywgZsO4ciBkdSBrYW4ga29nZ2UgaW5kLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU3NjA0NjYwMjUyNDc2MzQ0ODggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSIyMjc0MDg1Mzg0NzA0MjQ4NDMxIj4iVHZhbmdzbMOlcyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI4MTk4Njg2NjQ5NDYwODk3NDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iNTY5Njk2NDEyNjIyNjAyODQ0MiI+IktvbnRyb2wgbsOlciBlbmhlZGVuIGzDpXNlcywgc8OlIGR1IHNrYWwgaW5kdGFzdGUgYWRnYW5nc2tvZGVuIGlnZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0MzA3ODYxNDk2MzAyODUwMjAxIj4iQmVncsOmbnMgYWRnYW5nc2tvZGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSIxNzE5ODc3MjQ1NjkyMzE4Mjk5Ij4iQmVncsOmbnMgZGUgYWRnYW5nc2tvZGV0eXBlciwgZHUgaGFyIHRpbGxhZGVsc2UgdGlsIGF0IGJydWdlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iNzM3NDc4MDcxMjY2NDI4NTMyMSI+IlZpcyBmb3Jzw7hnIHDDpSBhdCBsb2dnZSBpbmQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSIxOTYxMjUxMTc5NjI0ODQzNDgzIj4iT3ZlcnbDpWcgbWlzbHlra2VkZSBmb3Jzw7hnIHDDpSBhdCBsb2dnZSBpbmQgcMOlIGVuaGVkZW4gZm9yIGF0IGZvcmV0YWdlIGVuIGhhbmRsaW5nLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iOTA4NDc3MjA5MDc5NzQ4NTQyMCI+Ik51bHN0aWwgYWRnYW5nc2tvZGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIzMzMyMTY3NjAwMzMxNzk5OTkxIj4iVHZpbmcgZGluIGFkZ2FuZ3Nrb2RlIHRpbCBlbiBueSB2w6ZyZGkuIERldHRlIGtyw6Z2ZXIsIGF0IGFkbWluaXN0cmF0b3JlbiBnaXZlciBkZW4gdGlsIGRpZywgZsO4ciBkdSBrYW4ga29nZ2UgaW5kLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSI1NzYwNDY2MDI1MjQ3NjM0NDg4Ij4iVHZhbmdzbMOlcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IktvbnRyb2wgbsOlciBlbmhlZGVuIGzDpXNlcywgc8OlIGR1IHNrYWwgaW5kdGFzdGUgYWRnYW5nc2tvZGVuIGlnZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IlNsZXQgYWxsZSBkYXRhIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjMxNDA2MDkzMzc5NjM5NjIwNSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9Ijc2Njk4OTUzMzM4MTQyMjI1ODYiPiJGb3JldGFnIGVuIGZhYnJpa3NudWxzdGlsbGluZywgZGVyIHNsZXR0ZXIgYWxsZSBkaW5lIGRhdGEgdWRlbiBiZWtyw6ZmdGVsc2UuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJGb3JldGFnIGVuIGZhYnJpa3NudWxzdGlsbGluZywgZGVyIHNsZXR0ZXIgYWxsZSBkaW5lIGRhdGEgdWRlbiBiZWtyw6ZmdGVsc2UuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkiIG1zZ2lkPSI2Mzg3NDk3NDY2NjYwMTU0OTMxIj4iQW5naXYgZW5oZWRlbnMgZ2xvYmFsZSBwcm94eSwgZGVyIHNrYWwgYnJ1Z2VzLCBtZW5zIHBvbGl0aWtrZW4gZXIgYWt0aXZlcmV0LiBLdW4gZGVuIGbDuHJzdGUgZW5oZWRzYWRtaW5pc3RyYXRvciBhbmdpdmVyIGRlbiBlZmZla3RpdmUgZ2xvYmFsZSBwcm94eS4iPC9zdHJpbmc+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJIamVtIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTW9iaWwiPC9pdGVtPgpAQCAtNTUyLDEwICs1MzgsOSBAQAogICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVPdGhlciAoNDQwODQzNjE2Mjk1MDExOTg0OSkgLS0+CiAgICAgPHNraXAgLz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJ2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJJbmR0YXN0IFBJTi1rb2RlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJJbmR0YXN0IGFkZ2FuZ3Nrb2RlIGZvciBhdCBsw6VzZSBvcCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iSW5kdGFzdCBwaW5rb2RlIGZvciBhdCBsw6VzZSBvcCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkZvcmtlcnQgUElOLWtvZGUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlRyeWsgcMOlIE1lbnUgb2cgZGVybsOmc3QgcMOlIDAgZm9yIGF0IGzDpXNlIG9wLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOw7hkbnVtbWVyIjwvc3RyaW5nPgpAQCAtNTY4LDYgKzU1Myw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IlRpbGJhZ2UgdGlsIG9wa2FsZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IlJpZ3RpZ3QhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IkJla2xhZ2VyISBQcsO4diBpZ2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJCZWtsYWdlciEgUHLDuHYgaWdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+Ik9wbGFkZXIgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+Ik9wbGFkdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01ODIsNiArNTY4LDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IlNJTS1rb3J0ZXQgZXIgbMOlc3QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iTMOlc2VyIFNJTS1rb3J0ZXQgb3AgLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iRHUgaGFyIHRlZ25ldCBkaXQgb3Bsw6VzbmluZ3Ntw7huc3RlciBmb3JrZXJ0IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGdhbmdlLiAiXG5cbiJQcsO4diBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkR1IGhhciBpbmR0YXN0ZXQgZGluIGFkZ2FuZ3Nrb2RlIGZvcmtlcnQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZ2FuZ2UuICJcblxuIlByw7h2IGlnZW4gb20gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IkR1IGhhciBpbmR0YXN0ZXQgZGluIHBpbmtvZGUgZm9ya2VydCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnYW5nZS4gIlxuXG4iUHLDuHYgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IkR1IGhhciB0ZWduZXQgZGl0IG9wbMOlc25pbmdzbcO4bnN0ZXIgZm9ya2VydCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnYW5nZS4gRWZ0ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gZm9yc8O4ZyBtZXJlIHZpbCBkdSBibGl2ZSBiZWR0IG9tIGF0IGzDpXNlIGRpbiB0ZWxlZm9uIG9wIHZlZCBoasOmbHAgYWYgZGl0IEdvb2dsZS1sb2dpbiJcblxuIiBQcsO4diBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJQcsO4diBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkhhciBkdSBnbGVtdCBtw7huc3RyZXQ/Ijwvc3RyaW5nPgpAQCAtNjEwLDE0ICs1OTgsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ19iZWZvcmVfdW5sb2FkIiBtc2dpZD0iMTkwMTY3NTQ0ODE3OTY1MzA4OSI+Ik5hdmlnZXIgdsOmayBmcmEgZGVubmUgc2lkZT8iXG5cbiI8eGxpZmY6ZyBpZD0iTUVTU0FHRSI+JXM8L3hsaWZmOmc+IlxuXG4iIFbDpmxnIE9LIGZvciBhdCBmb3J0c8OmdHRlIGVsbGVyIEFubnVsbGVyIGZvciBhdCBibGl2ZSBww6UgZGVuIGFrdHVlbGxlIHNpZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9sYWJlbCIgbXNnaWQ9IjY4NjAyNjE3NTg2NjU4MjUwNjkiPiJCZWtyw6ZmdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRvdWJsZV90YXBfdG9hc3QiIG1zZ2lkPSIxMDY4MjE2OTM3MjQ0NTY3MjQ3Ij4iVGlwOiBEb2JiZWx0a2xpayBmb3IgYXQgem9vbWUgaW5kIGVsbGVyIHVkLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvZmlsbF90aGlzX2Zvcm0gKDg5NDAxMTA4NjY3NzUwOTc0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iMTI4NDg0MzcyODIwMzQxMjEzNSI+ImzDpnMgYnJvd3NlcmVucyBvdmVyc2lndCBvZyBib2dtw6Zya2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI0OTgxNDg5ODE1NDY3NjE3MTkxIj4iVGlsbGFkZXIsIGF0IHByb2dyYW1tZXQgbMOmc2VyIGFsbGUgZGUgd2ViYWRyZXNzZXIsIGJyb3dzZXJlbiBoYXIgYmVzw7hndCwgb2cgYWxsZSBicm93c2VyZW5zIGJvZ23DpnJrZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5MDA5NDM0MTA5ODM2MjgwMzc0Ij4ic2tyaXYgYnJvd3NlcmVucyBvdmVyc2lndCBvZyBib2dtw6Zya2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTQ1NTcxOTkwMzU3MTE0OTUwIj4iVGlsbGFkZXIsIGF0IGV0IHByb2dyYW0gw6ZuZHJlciBicm93c2Vyb3ZlcnNpZ3RlbiBlbGxlciBib2dtw6Zya2VyLCBkZXIgZXIgZ2VtdCBww6UgZGluIHRlbGVmb24uIE9uZHNpbmRlZGUgcHJvZ3JhbW1lciBrYW4gYnJ1Z2UgZGV0dGUgdGlsIGF0IHNsZXR0ZSBlbGxlciDDpm5kcmUgZGluIGJyb3dzZXJzIGRhdGEuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0QWxhcm0gKDU5MjQ0MDEzMjg4MDM2MTUxNjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0QWxhcm0gKDU5NjY5NjY1OTgxNDk4NzUwODIpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQ3MTUyMTI2NTU1OTgyNzU1MzIiPiJTa2lmdCBicm93c2VydGlsbGFkZWxzZXIgZm9yIGdlb2dyYWZpc2sgcGxhY2VyaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDAxMTkwODI4Mjk4MDg2MTY3OSI+IkdpdmVyIGV0IHByb2dyYW0gdGlsbGFkZWxzZSB0aWwgYXQgw6ZuZHJlIGJyb3dzZXJlbnMgdGlsbGFkZWxzZXIgZm9yIGdlb2dyYWZpc2sgcGxhY2VyaW5nLiBTa2FkZWxpZ2UgcHJvZ3JhbW1lciBrYW4gYnJ1Z2UgZGV0dGUgdGlsIGF0IHRpbGxhZGUsIGF0IHBsYWNlcmluZ3NvcGx5c25pbmdlciBzZW5kZXMgdGlsIHZpbGvDpXJsaWdlIHdlYnN0ZWRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiLDmG5za2VyIGR1LCBhdCBicm93c2VyZW4gc2thbCBodXNrZSBkZW5uZSBhZGdhbmdza29kZT8iPC9zdHJpbmc+CkBAIC03MzAsMTQgKzcxNiwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlbDpmxnIGFsbGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+IlbDpmxnIG9yZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJLbGlwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3BpZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJJbmRzw6Z0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJLb3BpZXIgd2ViYWRyZXNzZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHRNb2RlIiBtc2dpZD0iNjczODU1NjM0ODg2MTM0NzI0MCI+Ik1hcmtlciB0ZWtzdC4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRleHRTZWxlY3Rpb25DQUJUaXRsZSIgbXNnaWQ9IjUyMzY4NTAzOTQzNzA4MjAzNTciPiJUZWtzdG1hcmtlcmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+IklucHV0bWV0b2RlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkbDuGogXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIgdGlsIG9yZGJvZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IlJlZGlnZXIgdGVrc3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiJUZWtzdGhhbmRsaW5nZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IkRlciBlciBpa2tlIHPDpSBtZWdldCBwbGFkcyB0aWxiYWdlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iRGVyIGVyIG7DpnN0ZW4gaWtrZSBtZXJlIHBsYWRzIHDDpSB0ZWxlZm9uZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iT0siPC9zdHJpbmc+CkBAIC03NDUsNiArNzMxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJPSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IkFubnVsbGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IkJlbcOmcmsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkluZGzDpnNlci4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iVElMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iRlJBIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJGdWxkZsO4ciBoYW5kbGluZyB2ZWQgaGrDpmxwIGFmIjwvc3RyaW5nPgpAQCAtNzYzLDkgKzc1MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0iZm9yY2VfY2xvc2UiIG1zZ2lkPSIzNjUzNDE2MzE1NDUwODA2Mzk2Ij4iVHZpbmcgdGlsIGF0IGx1a2tlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+IlJhcHBvcnRlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndhaXQiIG1zZ2lkPSI3MTQ3MTE4MjE3MjI2MzE3NzMyIj4iVmVudCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IlByb2dyYW1tZXQgZXIgb21kaXJpZ2VyZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4ga8O4cmVyIG51LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBibGV2IG9wcmluZGVsaWd0IMOlYm5ldC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iUHJvZ3JhbW1ldCA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBoYXIgb3ZlcnRyw6VkdCBzaW4gZWdlbiBTdHJpY3RNb2RlLXBvbGl0aWsuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iUHJvY2Vzc2VuIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBoYXIgb3ZlcnRyw6VkdCBzaW4gZWdlbiBTdHJpY3RNb2RlLXBvbGl0aWsuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiBlciBpIGdhbmciPC9zdHJpbmc+CkBAIC04MTIsMjggKzgwMiwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybXNfc2hvd19hbGwiIG1zZ2lkPSIyNjcxNzkxMTYzOTMzMDkxMTgwIj48Yj4iVmlzIGFsbGUiPC9iPjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYWN0aXZpdHlfdGl0bGUiIG1zZ2lkPSIyMzk5Mjg5OTk5NjA4OTAwNDQzIj4iVVNCLW1hc3NlbGFncmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3RpdGxlIiBtc2dpZD0iNTkwMTQ1OTA0MTM5ODc1MTQ5NSI+IlVTQiBlciB0aWxzbHV0dGV0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDc5Njc1OTY0NjE2NzI0NzE3OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4MjMxNDYyNzUwMDEwMDY2ODk2Ij4iRHUgaGFyIGZvcmJ1bmRldCBkaW4gdGVsZWZvbiB0aWwgZGluIGNvbXB1dGVyIHZpYSBVU0IuIFbDpmxnIGtuYXBwZW4gbmVkZW5mb3IsIGh2aXMgZHUgw7huc2tlciBhdCBrb3BpZXJlIGZpbGVyIG1lbGxlbSBkaW4gY29tcHV0ZXIgb2cgZGluIEFuZHJvaWRzIFNELWtvcnQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJEdSBoYXIgZm9yYnVuZGV0IGRpbiB0ZWxlZm9uIHRpbCBkaW4gY29tcHV0ZXIgdmlhIFVTQi4gVsOmbGcga25hcHBlbiBuZWRlbmZvciwgaHZpcyBkdSDDuG5za2VyIGF0IGtvcGllcmUgZmlsZXIgbWVsbGVtIGRpbiBjb21wdXRlciBvZyBkaW4gQW5kcm9pZHMgU0Qta29ydC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+IkR1IGhhciBmb3JidW5kZXQgZGluIHRlbGVmb24gdGlsIGRpbiBjb21wdXRlciB2aWEgVVNCLiBWw6ZsZyBrbmFwcGVuIG5lZGVuZm9yLCBodmlzIGR1IMO4bnNrZXIgYXQga29waWVyZSBmaWxlciBtZWxsZW0gZGluIGNvbXB1dGVyIG9nIGRpbiBBbmRyb2lkcyBTRC1rb3J0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjEwNTIyNTk5MzAzNjk1MDgyMzUiPiJTbMOlIFVTQi1sYWdyaW5nZW4gdGlsIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjUzNDc4NDc1MTYwMzM0NTM2MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0ODE4MzQ3NzU2NDAyNzQwMjYxIj4iRGVyIG9wc3RvZCBldCBwcm9ibGVtIG1lZCBhdCBicnVnZSBkaXQgU0Qta29ydCB0aWwgVVNCLWxhZ3JpbmcuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiJEZXIgb3BzdG9kIGV0IHByb2JsZW0gbWVkIGF0IGJydWdlIGRpdCBTRC1rb3J0IHRpbCBVU0ItbGFncmluZy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IkRlciBvcHN0b2QgZXQgcHJvYmxlbSBtZWQgYXQgYnJ1Z2UgZGl0IFNELWtvcnQgdGlsIFVTQi1sYWdyaW5nLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjgxNzU4OTI1NTQ3NTcyMTY1MjUiPiJVU0IgZXIgdGlsc2x1dHRldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzM4MDA4MjQwNDI4ODIxOTM0MSI+IlbDpmxnIGZvciBhdCBrb3BpZXJlIGZpbGVyIHRpbC9mcmEgZGluIGNvbXB1dGVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMjMzNjA1ODM5NjY2MzUxNjAxNyI+IlNsw6UgVVNCLWxhZ3JpbmdlbiBmcmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjU5MTgxMzQ5MDI2OTg0MTUzOSI+IlbDpmxnIGZvciBhdCBzbMOlIFVTQi1sYWdyaW5nIGZyYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX3RpdGxlIiBtc2dpZD0iNjYwMTI5ODUxNzA4Nzc1ODUzIj4iVVNCLWxhZ2VyIGkgYnJ1ZyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MTM3MTMzOTY0MjY2MDQxMDQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NzQ1MzQ1MjYwNzgwMjY3MTg1Ij4iU8O4cmcgZm9yLCBhdCBkdSBoYXIgZGVtb250ZXJldCAoXCJ1ZHNrdWJiZXRcIikgZGluIEFuZHJvaWRzIFNELWtvcnQgZnJhIGNvbXB1dGVyZW4sIGbDuHIgZHUgc2zDpXIgVVNCLWxhZ3JpbmcgZnJhLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJTw7hyZyBmb3IsIGF0IGR1IGhhciBkZW1vbnRlcmV0IChcInVkc2t1YmJldFwiKSBkaW4gQW5kcm9pZHMgU0Qta29ydCBmcmEgY29tcHV0ZXJlbiwgZsO4ciBkdSBzbMOlciBVU0ItbGFncmluZyBmcmEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IlPDuHJnIGZvciwgYXQgZHUgaGFyIGRlbW9udGVyZXQgKFwidWRza3ViYmV0XCIpIGRpbiBBbmRyb2lkcyBTRC1rb3J0IGZyYSBjb21wdXRlcmVuLCBmw7hyIGR1IHNsw6VyIFVTQi1sYWdyaW5nIGZyYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjcwNjAyMTgwMzQ5MDA2OTYwMjkiPiJTbMOlIFVTQi1sYWdyaW5nIGZyYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjE0Mzg4MTkxNDg0MDQxMjEwOCI+IkRlciBvcHN0b2QgZXQgcHJvYmxlbSBtZWQgYXQgc2zDpSBVU0ItbGFncmluZ2VuIGZyYS4gU8O4cmcgZm9yLCBhdCBkdSBoYXIgZGVtb250ZXJldCBVU0ItdsOmcnRlbiwgb2cgcHLDuHYgc8OlIGlnZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RpdGxlIiBtc2dpZD0iOTYzMDM5MDMzNDcwNDc4Njk3Ij4iU2zDpSBVU0ItbGFncmluZyB0aWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGV4dCIgbXNnaWQ9IjMyMDI4MzgyMzQ3ODA1MDU4ODYiPiJIdmlzIGR1IHNsw6VyIFVTQi1sYWdyaW5nIHRpbCwgdmlsIG5vZ2xlIGFmIGRlIHByb2dyYW1tZXIsIHNvbSBkdSBicnVnZXIsIHN0b3BwZSwgb2cgZGUga2FuIHbDpnJlIHV0aWxnw6ZuZ2VsaWdlLCBpbmR0aWwgZHUgc2zDpXIgVVNCLWxhZ3JpbmcgdGlsIGlnZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2Vycm9yX3RpdGxlIiBtc2dpZD0iODA0ODk5OTk3MzgzNzMzOTE3NCI+IlVTQi1oYW5kbGluZ2VuIG1pc2x5a2tlZGVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX29rIiBtc2dpZD0iNzM3Njk1MzE2NzAzOTg2NTcwMSI+Ik9LIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODY2MzI0NzkyOTU1MTA5NTg1NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY1Nzc5MDgwMDY5NDk3NDIyMTciPiJGb3JtYXRlciBTRC1rb3J0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IkZvcm1hdGVyIFNELWtvcnQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjIxMzY5OTYyNDMzNTIzNjE5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNDcwODE1MTQwMDY4NTAyODI0Ij4iRXIgZHUgc2lra2VyIHDDpSwgZHUgw7huc2tlciBhdCBmb3JtYXRlcmUgU0Qta29ydGV0PyBBbGxlIGRhdGEgcMOlIGtvcnRldCBtaXN0ZXMuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4iRXIgZHUgc2lra2VyIHDDpSwgZHUgw7huc2tlciBhdCBmb3JtYXRlcmUgU0Qta29ydGV0PyBBbGxlIGRhdGEgcMOlIGtvcnRldCBtaXN0ZXMuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IkZvcm1hdGVyIFNELWtvcnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiJFciBkdSBzaWtrZXIgcMOlLCBkdSDDuG5za2VyIGF0IGZvcm1hdGVyZSBTRC1rb3J0ZXQ/IEFsbGUgZGF0YSBww6Uga29ydGV0IG1pc3Rlcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfYnV0dG9uX2Zvcm1hdCIgbXNnaWQ9IjQxMzEwNjQ1NjAxMjc0Nzg2OTUiPiJGb3JtYXRlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTA0NDc3ODk0OTE4OTkxOCI+IlVTQi1mZWpscmV0bmluZyBlciB0aWxzbHV0dGV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9Ijg0NzAyOTY4MTgyNzAxMTAzOTYiPiJWw6ZsZyBmb3IgYXQgZGVha3RpdmVyZSBVU0ItZmVqbHJldG5pbmcuIjwvc3RyaW5nPgpAQCAtODQxLDI5ICs4MjYsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX2FscGhhYmV0IiBtc2dpZD0iNTQzMzI3NTQ4NTQ5OTAzOTE5OSI+IiBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX251bWVyaWNfYWxwaGFiZXQiIG1zZ2lkPSI0MDMwMTcwNTI0NTk1MTIzNjEwIj4iIDAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhbmRpZGF0ZXNfc3R5bGUiIG1zZ2lkPSI0MzMzOTEzMDg5NjM3MDYyMjU3Ij48dT4ia2FuZGlkYXRlciI8L3U+PC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NDU3NjAzNDE4OTcwOTk0MDUwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQyMzk1MTY2NzUwMjg0Mzg5OTciPiJGb3JiZXJlZGVyIFNELWtvcnRldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4iRm9yYmVyZWRlciBTRC1rb3J0ZXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IkZvcmJlcmVkZXIgU0Qta29ydGV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODI4NzMxOTg4MjkyNjczNzA1MyI+IktvbnRyb2xsZXJlciBmb3IgZmVqbC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3ODA0Nzc4MzgyNDEyMTI5OTcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzOTM3MzQ1NTc3OTgzNzMwODczIj4iVG9tdCBTRC1rb3J0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iVG9tdCBTRC1rb3J0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTMxMjI2NjgyMDA5Mjk1ODAxNCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTYwNjY2MDc1NjEyNDYyOTcwOCI+IlNELWtvcnRldCBlciB0b210IGVsbGVyIGJydWdlciBldCBpa2tlIHVuZGVyc3TDuHR0ZXQgZmlsc3lzdGVtLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlNELWtvcnRldCBlciB0b210IGVsbGVyIGhhciBldCBpa2tlIHVuZGVyc3TDuHR0ZXQgZmlsc3lzdGVtLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY0MTA3MjM5MDYwMTkxMDAxODkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTcyNDYxOTkwMjA3NjUyODg4OSI+IkJlc2thZGlnZXQgU0Qta29ydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iQmVza2FkaWdldCBTRC1rb3J0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjY3OTQxMjg4NDI5MDA2MTc3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY0NjAzMTE4MzUxMzA2NzExOTQiPiJTRC1rb3J0ZXQgZXIgYmVza2FkaWdldC4gRHUgc2thbCBtdWxpZ3ZpcyBvbWZvcm1hdGVyZSBkaXQga29ydC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iU0Qta29ydGV0IGVyIGJlc2thZGlnZXQuIER1IGJsaXZlciBtdWxpZ3ZpcyBuw7hkdCB0aWwgYXQgZm9ybWF0ZXJlIGRldCBpZ2VuLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY4NzIxNTI4ODI2MDQ0MDc4MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNTgyMTc1MDE2MDYwNDMyMDM0Ij4iU0Qta29ydGV0IGJsZXYgZmplcm5ldCB1dmVudGV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjg3MjE1Mjg4MjYwNDQwNzgzNyI+IlNELWtvcnRldCBibGV2IGZqZXJuZXQgdXZlbnRldCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDcyNjAxODMyOTM3NDc0NDgyNDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjIwMDUzOTY0NjQ0OTQ2NDg5MzciPiJEZW1vbnRlciBTRC1rb3J0ZXQgaW5kZW4gZmplcm5lbHNlIGZvciBhdCB1bmRnw6UgdGFiIGFmIGRhdGEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4iRGVtb250ZXIgU0Qta29ydGV0IGluZGVuIGZqZXJuZWxzZSBmb3IgYXQgdW5kZ8OlIHRhYiBhZiBkYXRhLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY3Mjk4MDExMzA3OTA2MTYyMDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM2NTI1ODgxMDE4Njc5NTE1Ij4iU0Qta29ydGV0IGthbiBmamVybmVzIHNpa2tlcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJTRC1rb3J0ZXQga2FuIGZqZXJuZXMgc2lra2VydCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc2MTM5NjA2ODY3NDc1OTI3NzAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNzUwMzc2OTEwNjI4NTE4ODcwMyI+IlNELWtvcnRldCBrYW4gbnUgZmplcm5lcyBzaWtrZXJ0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiJEdSBrYW4gbnUgZmplcm5lIFNELWtvcnRldC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4OTAyNTE4MDMwNDA0MzgxMzE4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTg3NDg4OTc2NDM2NzA4NTU2MiI+IlNELWtvcnRldCBlciBmamVybmV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IlNELWtvcnRldCBlciBmamVybmV0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDIwNTExNzIyNzM0MjgyMjI3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjczMDg5MDQ0MTMzMTM0NDc3NiI+IlNEIGVyIGZqZXJuZXQuIEluZHPDpnQgZXQgbnl0IFNELWtvcnQgZm9yIGF0IMO4Z2UgZGluIGVuaGVkcyBsYWdlcnBsYWRzLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IlNELWtvcnRldCBlciBmamVybmV0LiBJbmRzw6Z0IGV0IG55dC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI3ODA0Nzc4MzgyNDEyMTI5OTciPiJUb210IFNELWtvcnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJTRC1rb3J0ZXQgZXIgdG9tdCBlbGxlciBoYXIgZXQgaWtrZSB1bmRlcnN0w7h0dGV0IGZpbHN5c3RlbS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjQxMDcyMzkwNjAxOTEwMDE4OSI+IkJlc2thZGlnZXQgU0Qta29ydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY5MDI1MzE3NzU5NDgyMzg5ODkiPiJTRC1rb3J0ZXQgZXIgYmVza2FkaWdldC4gRHUgYmxpdmVyIG11bGlndmlzIG7DuGR0IHRpbCBhdCBmb3JtYXRlcmUgZGV0IGlnZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjg3MjE1Mjg4MjYwNDQwNzgzNyI+IlNELWtvcnRldCBibGV2IGZqZXJuZXQgdXZlbnRldCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+IkRlbW9udGVyIFNELWtvcnRldCBpbmRlbiBmamVybmVsc2UgZm9yIGF0IHVuZGfDpSB0YWIgYWYgZGF0YS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJTRC1rb3J0ZXQga2FuIGZqZXJuZXMgc2lra2VydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiJEdSBrYW4gbnUgZmplcm5lIFNELWtvcnRldC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4OTAyNTE4MDMwNDA0MzgxMzE4Ij4iU0Qta29ydGV0IGVyIGZqZXJuZXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjM4NzAxMjA2NTI5ODM2NTk2NDEiPiJTRC1rb3J0ZXQgZXIgZmplcm5ldC4gSW5kc8OmdCBldCBueXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfbGlzdF9lbXB0eSIgbXNnaWQ9IjQxNjg4MjA2MDk0MDMzODU3ODkiPiJEZXIgYmxldiBpa2tlIGZ1bmRldCBub2dlbiBtYXRjaGVuZGUgYWt0aXZpdGV0ZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4Nzg3MzUyMDc0MzI2NzQ4ODkyIj4ib3BkYXRlciBicnVnZXJzdGF0aXN0aWtrZXIgZm9yIGtvbXBvbmVudGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg5MTU1MzY5NTcxNjc1MjgzNSI+IlRpbGxhZGVyIMOmbmRyaW5nIGFmIGluZHNhbWxlZGUgYnJ1Z2Vyc3RhdGlzdGlra2VyIGZvciBrb21wb25lbnRlci4gSWtrZSB0aWwgYnJ1ZyB0aWwgbm9ybWFsZSBwcm9ncmFtbWVyLiI8L3N0cmluZz4KQEAgLTg5OCwxNSArODcyLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iTDJUUC9JUFNlYyBWUE4gYmFzZXJldCBww6UgZm9yaMOlbmRzZGVsdCBuw7hnbGVrb2RuaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IkNlcnRpZmlrYXRiYXNlcmV0IEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iVsOmbGcgZmlsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iSW5nZW4gZmlsIGVyIHZhbGd0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iTnVsc3RpbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJTZW5kIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJmYXZvcml0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iQmlsdGlsc3RhbmQgZXIgYWt0aXZlcmV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IlbDpmxnIGZvciBhdCBhZnNsdXR0ZSBiaWx0aWxzdGFuZC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iVGV0aGVyaW5nIGVsbGVyIGhvdHNwb3QgZXIgYWt0aXZ0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iVHJ5ayBmb3IgYXQga29uZmlndXJlcmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJUaWxiYWdlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iTsOmc3RlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iU3ByaW5nIG92ZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJIw7hqdCBtb2JpbGRhdGFmb3JicnVnIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJUcnlrIGZvciBvcGx5c25pbmdlciBvbSBicnVnIGFmIG1vYmlsZGF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iR3LDpm5zZW4gZm9yIG1vYmlsZGF0YSBlciBvdmVyc2tyZWRldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiJUcnlrIGZvciBvcGx5c25pbmdlciBvbSBicnVnIGFmIG1vYmlsZGF0YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX21hdGNoZXMiIG1zZ2lkPSI4MTI5NDIxOTA4OTE1ODQwNzM3Ij4iRGVyIGVyIGluZ2VuIG1hdGNoZXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmaW5kX29uX3BhZ2UiIG1zZ2lkPSIxOTQ2Nzk5MjMzODIyODIwMzg0Ij4iRmluZCBww6Ugc2lkZW4iPC9zdHJpbmc+CisgIDxwbHVyYWxzIG5hbWU9Im1hdGNoZXNfZm91bmQiPgorICAgIDxpdGVtIHF1YW50aXR5PSJvbmUiIG1zZ2lkPSI4MTY3MTQ3MDgxMTM2NTc5NDM5Ij4iMSBtYXRjaCI8L2l0ZW0+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im90aGVyIiBtc2dpZD0iNDY0MTg3Mjc5NzA2NzYwOTE3NyI+Ijx4bGlmZjpnIGlkPSJJTkRFWCI+JWQ8L3hsaWZmOmc+IGFmIDx4bGlmZjpnIGlkPSJUT1RBTCI+JWQ8L3hsaWZmOmc+IjwvaXRlbT4KKyAgPC9wbHVyYWxzPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbAppbmRleCA1MzliYmU4Li5iYmU4ZGU5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKQEAgLTE2OSwxMiArMTY5LDExIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfZGV2ZWxvcG1lbnRUb29scyIgbXNnaWQ9IjM0NDYxNjQ1ODQ3MTA1OTY1MTMiPiJFbnR3aWNrbGVyLVRvb2xzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iOTA1NjQzMTE5Mzg5MzgwOTgxNCI+IkZ1bmt0aW9uZW4gbnVyIGbDvHIgQW53ZW5kdW5nc2VudHdpY2tsZXIgdm9yZ2VzZWhlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfc3RvcmFnZSIgbXNnaWQ9IjE5NzExMTg3NzA1NDYzMzY5NjYiPiJTcGVpY2hlciI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkyMDMzMDIyMTQ5MTUzNTU3NzQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI1NDU1ODA0MzUzMjIwNTgxMzEyIj4iR3JlaWZ0IGF1ZiBkaWUgU0QtS2FydGUgenUuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IkdyZWlmdCBhdWYgZGllIFNELUthcnRlIHp1LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiJHcmVpZnQgYXVmIGRpZSBTRC1LYXJ0ZSB6dS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhciIgbXNnaWQ9Ijc0MTcxOTI2Mjk2MDE4OTA3OTEiPiJTdGF0dXNsZWlzdGUgZGVha3RpdmllcmVuIG9kZXIgw6RuZGVybiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3N0YXR1c0JhciIgbXNnaWQ9IjEzNjU0NzM1OTUzMzE5ODk3MzIiPiJFcm3DtmdsaWNodCBkZXIgQW53ZW5kdW5nLCBkaWUgU3RhdHVzYW56ZWlnZSB6dSBkZWFrdGl2aWVyZW4gb2RlciBTeXN0ZW1zeW1ib2xlIGhpbnp1enVmw7xnZW4gb2RlciB6dSBlbnRmZXJuZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXJTZXJ2aWNlIiBtc2dpZD0iNzI0NzI4MTkxMTM4NzkzMTQ4NSI+IlN0YXR1c2xlaXN0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3N0YXR1c0JhclNlcnZpY2UiIG1zZ2lkPSI0MDk3NjA1ODY3NjQzNTIwOTIwIj4iRXJtw7ZnbGljaHQgZGVyIEFud2VuZHVuZywgenVyIFN0YXR1c2xlaXN0ZSB6dSB3ZXJkZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc3RhdHVzQmFyU2VydmljZSIgbXNnaWQ9IjQwOTc2MDU4Njc2NDM1MjA5MjAiPiJEaWUgQW53ZW5kdW5nIHdpcmQgZGFtaXQgaW4gZGVyIFN0YXR1c2xlaXN0ZSBhbmdlemVpZ3QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9leHBhbmRTdGF0dXNCYXIiIG1zZ2lkPSIxMTQ4MTk4Nzg1OTM3NDg5MjY0Ij4iU3RhdHVzbGVpc3RlIGVpbi0vYXVzYmxlbmRlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2V4cGFuZFN0YXR1c0JhciIgbXNnaWQ9IjcwODg2MDQ0MDAxMTA3Njg2NjUiPiJFcm3DtmdsaWNodCBkZXIgQW53ZW5kdW5nLCBkaWUgU3RhdHVzbGVpc3RlIGVpbi0gb2RlciBhdXN6dWJsZW5kZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wcm9jZXNzT3V0Z29pbmdDYWxscyIgbXNnaWQ9IjExMzYyNjI1NTA4NzgzMzU5ODAiPiJBYmdlaGVuZGUgQW5ydWZlIGFiZmFuZ2VuIjwvc3RyaW5nPgpAQCAtMjY3LDggKzI2NiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2xlYXJBcHBDYWNoZSIgbXNnaWQ9Ijc3NDA0NjU2OTQxOTM2NzE0MDIiPiJFcm3DtmdsaWNodCBlaW5lciBBbndlbmR1bmcsIFRlbGVmb25zcGVpY2hlciBkdXJjaCBkYXMgTMO2c2NoZW4gdm9uIERhdGVpZW4gaW0gQ2FjaGUtVmVyemVpY2huaXMgZGVyIEFud2VuZHVuZyBmcmVpenVnZWJlbi4gRGVyIFp1Z3JpZmYgYmVzY2hyw6Rua3Qgc2ljaCBpbiBkZXIgUmVnZWwgYXVmIFN5c3RlbXByb3plc3NlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbW92ZVBhY2thZ2UiIG1zZ2lkPSI3Mjg0NTQ5Nzk5NDY1MDM5MjYiPiJBbndlbmR1bmdzcmVzc291cmNlbiB2ZXJzY2hpZWJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21vdmVQYWNrYWdlIiBtc2dpZD0iNjMyMzA0OTI5MTkyMzkyNTI3NyI+IkVybcO2Z2xpY2h0IGVpbmVyIEFud2VuZHVuZywgQW53ZW5kdW5nc3Jlc3NvdXJjZW4gdm9uIGludGVybmUgYXVmIGV4dGVybmUgTWVkaWVuIHp1IHZlcnNjaGllYmVuIHVuZCB1bWdla2VocnQuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDgxMTkyMTcwMzg4MjUzMjA3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkTG9ncyIgbXNnaWQ9IjY2MTU3Nzg1NDMxOTg5Njc2MTQiPiJTeXN0ZW0tUHJvdG9rb2xsZGF0ZWllbiBsZXNlbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIyNTc5Mzc5NTU1ODA0NzU5MDIgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+IkVybcO2Z2xpY2h0IGVpbmVyIEFud2VuZHVuZywgZGllIHZlcnNjaGllZGVuZW4gUHJvdG9rb2xsZGF0ZWllbiBkZXMgU3lzdGVtcyB6dSBsZXNlbi4gU28ga8O2bm5lbiBhbGxnZW1laW5lIEluZm9ybWF0aW9uZW4genUgZGVuIGF1ZiBJaHJlbSBUZWxlZm9uIGR1cmNoZ2Vmw7xocnRlbiBBa3Rpb25lbiBlaW5nZXNlaGVuIHdlcmRlbiwgZGllc2Ugc29sbHRlbiBqZWRvY2gga2VpbmUgcGVyc8O2bmxpY2hlbiBvZGVyIGdlaGVpbWVuIERhdGVuIGVudGhhbHRlbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkTG9ncyAoNjYxNTc3ODU0MzE5ODk2NzYxNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkTG9ncyAoODg5NjQ0OTQzNzQ2NDg2Nzc2NikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlhZ25vc3RpYyIgbXNnaWQ9IjgwNzY3NDM5NTM5MDgwMDAzNDIiPiJMZXNlLS9TY2hyZWliYmVyZWNodGlndW5nIGbDvHIgenUgRGlhZ25vc2VncnVwcGUgZ2Vow7ZyaWdlIEVsZW1lbnRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlhZ25vc3RpYyIgbXNnaWQ9IjMxMjEyMzgzNzM5NTE2MzcwNDkiPiJFcm3DtmdsaWNodCBlaW5lciBBbndlbmR1bmcsIGFsbGUgRWxlbWVudGUgaW4gZGVyIERpYWdub3NlZ3J1cHBlIHp1IGxlc2VuIHVuZCB6dSBiZWFyYmVpdGVuLCBldHdhIERhdGVpZW4gaW4gXCIvZGV2XCIuIERpZXMga8O2bm50ZSBlaW5lIHBvdGVuemllbGxlIEdlZsOkaHJkdW5nIGbDvHIgZGllIFN0YWJpbGl0w6R0IHVuZCBTaWNoZXJoZWl0IGRlcyBTeXN0ZW1zIGRhcnN0ZWxsZW4gdW5kIHNvbGx0ZSBOVVIgZsO8ciBIYXJkd2FyZS1zcGV6aWZpc2NoZSBEaWFnbm9zZW4gZGVzIEhlcnN0ZWxsZXJzIG9kZXIgTmV0emJldHJlaWJlcnMgdmVyd2VuZGV0IHdlcmRlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NoYW5nZUNvbXBvbmVudFN0YXRlIiBtc2dpZD0iNzk0MjUxOTg4MzQzMjk0MDYiPiJBbndlbmR1bmdza29tcG9uZW50ZW4gYWt0aXZpZXJlbiBvZGVyIGRlYWt0aXZpZXJlbiI8L3N0cmluZz4KQEAgLTMxOCw5ICszMTksOSBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWJvb3QiIG1zZ2lkPSIyODk4NTYwODcyNDYyNjM4MjQyIj4iTmV1c3RhcnQgZGVzIFRlbGVmb25zIGVyendpbmdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYm9vdCIgbXNnaWQ9Ijc5MTQ5MzMyOTI4MTU0OTE3ODIiPiJFcm3DtmdsaWNodCBkZXIgQW53ZW5kdW5nLCBlaW5lbiBOZXVzdGFydCBkZXMgVGVsZWZvbnMgenUgZXJ6d2luZ2VuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbW91bnRfdW5tb3VudF9maWxlc3lzdGVtcyIgbXNnaWQ9IjE3NjEwMjMyNzIxNzA5NTY1NDEiPiJEYXRlaXN5c3RlbWUgYmVyZWl0c3RlbGxlbiBvZGVyIEJlcmVpdHN0ZWxsdW5nIGF1ZmhlYmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW91bnRfdW5tb3VudF9maWxlc3lzdGVtcyIgbXNnaWQ9IjYyNTMyNjM3OTI1MzU4NTk3NjciPiJFcm3DtmdsaWNodCBkZXIgQW53ZW5kdW5nLCBEYXRlaXN5c3RlbWUgZsO8ciBhdXN0YXVzY2hiYXJlIERhdGVudHLDpGdlciBiZXJlaXR6dXN0ZWxsZW4gb2RlciBkaWUgQmVyZWl0c3RlbGx1bmcgYXVmenVoZWJlbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19tb3VudF91bm1vdW50X2ZpbGVzeXN0ZW1zIiBtc2dpZD0iNjI1MzI2Mzc5MjUzNTg1OTc2NyI+IkVybcO2Z2xpY2h0IGRlciBBbndlbmR1bmcsIERhdGVpc3lzdGVtZSBmw7xyIGF1c3RhdXNjaGJhcmUgU3BlaWNoZXJwbMOkdHplIGJlcmVpdHp1c3RlbGxlbiBvZGVyIGRpZSBCZXJlaXRzdGVsbHVuZyBhdWZ6dWhlYmVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbW91bnRfZm9ybWF0X2ZpbGVzeXN0ZW1zIiBtc2dpZD0iNTUyMzI4NTE0MzU3NjcxODk4MSI+IkV4dGVybmVuIFNwZWljaGVyIGZvcm1hdGllcmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW91bnRfZm9ybWF0X2ZpbGVzeXN0ZW1zIiBtc2dpZD0iNTc0MDYwMDQ0OTA2MDQ3Mzg2Ij4iRXJtw7ZnbGljaHQgZGVyIEFud2VuZHVuZywgYXVzdGF1c2NoYmFyZSBEYXRlbnRyw6RnZXIgenUgZm9ybWF0aWVyZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW91bnRfZm9ybWF0X2ZpbGVzeXN0ZW1zIiBtc2dpZD0iNTc0MDYwMDQ0OTA2MDQ3Mzg2Ij4iRXJsYXVidCBkZXIgQW53ZW5kdW5nLCBhdXN0YXVzY2hiYXJlbiBTcGVpY2hlciB6dSBmb3JtYXRpZXJlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2FzZWNfYWNjZXNzIiBtc2dpZD0iMTA3MDM2NDA3OTI0OTgzNDY2NiI+IkluZm9ybWF0aW9uZW4genVtIHNpY2hlcmVuIFNwZWljaGVyIGFicnVmZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19hc2VjX2FjY2VzcyIgbXNnaWQ9Ijc2OTE2MTYyOTIxNzA1OTAyNDQiPiJFcm3DtmdsaWNodCBkZXIgQW53ZW5kdW5nLCBJbmZvcm1hdGlvbmVuIHp1bSBzaWNoZXJlbiBTcGVpY2hlciBhYnp1cnVmZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9hc2VjX2NyZWF0ZSIgbXNnaWQ9IjczMTIwNzgwMzIzMjY5Mjg4OTkiPiJTaWNoZXJlbiBTcGVpY2hlciBlcnN0ZWxsZW4iPC9zdHJpbmc+CkBAIC0zMzYsNyArMzM3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZmxhc2hsaWdodCIgbXNnaWQ9IjIxNTU5MjA4MTAxMjE5ODQyMTUiPiJMaWNodGFuemVpZ2Ugc3RldWVybiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2ZsYXNobGlnaHQiIG1zZ2lkPSI2NDMzMDQ1OTQyMjgzODAyMzA5Ij4iRXJtw7ZnbGljaHQgZGVyIEFud2VuZHVuZywgZGllIExpY2h0YW56ZWlnZSB6dSBzdGV1ZXJuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYWNjZXNzVXNiIiBtc2dpZD0iNzM2MjMyNzgxODY1NTc2MDQ5NiI+ImF1ZiBVU0ItR2Vyw6R0ZSB6dWdyZWlmZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19hY2Nlc3NVc2IiIG1zZ2lkPSIyNDE0MjcxNzYyOTE0MDQ5MjkyIj4iRXJtw7ZnbGljaHQgZGVyIEFud2VuZHVuZyBkZW4gWnVncmlmZiBhdWYgVVNCLUdlcsOkdGUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYWNjZXNzVXNiIiBtc2dpZD0iMjQxNDI3MTc2MjkxNDA0OTI5MiI+IkRpZSBBbndlbmR1bmcgZXJow6RsdCBadWdyaWZmIGF1ZiBVU0ItR2Vyw6R0ZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2hhcmR3YXJlX3Rlc3QiIG1zZ2lkPSI0MTQ4MjkwODYwNDAwNjU5MTQ2Ij4iSGFyZHdhcmUgdGVzdGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfaGFyZHdhcmVfdGVzdCIgbXNnaWQ9IjM2Njg4OTQ2ODY1MDAwODE2OTkiPiJFcm3DtmdsaWNodCBlaW5lciBBbndlbmR1bmcsIHZlcnNjaGllZGVuZSBQZXJpcGhlcmllLUdlcsOkdGUgenUgSGFyZHdhcmUtVGVzdHp3ZWNrZW4genUgc3RldWVybi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NhbGxQaG9uZSIgbXNnaWQ9IjM5MjU4MzYzNDc2ODE4NDc5NTQiPiJUZWxlZm9ubnVtbWVybiBkaXJla3QgYW5ydWZlbiI8L3N0cmluZz4KQEAgLTQwMywyMiArNDA0LDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aEFkbWluIiBtc2dpZD0iNzI1NjI4OTc3NDY2NzA1NDU1NSI+IkVybcO2Z2xpY2h0IGVpbmVyIEFud2VuZHVuZywgZGFzIGxva2FsZSBCbHVldG9vdGgtVGVsZWZvbiB6dSBrb25maWd1cmllcmVuLCBSZW1vdGUtR2Vyw6R0ZSB6dSBlcmtlbm5lbiB1bmQgZWluZSBWZXJiaW5kdW5nIHp1IGRpZXNlbiBoZXJ6dXN0ZWxsZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ibHVldG9vdGgiIG1zZ2lkPSI4MzYxMDM4NzA3ODU3MDE4NzMyIj4iQmx1ZXRvb3RoLVZlcmJpbmR1bmdlbiBoZXJzdGVsbGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoIiBtc2dpZD0iNzYyNTE1MzgwNjc5MzkyOTQ1Ij4iRXJtw7ZnbGljaHQgZWluZXIgQW53ZW5kdW5nLCBkaWUgS29uZmlndXJhdGlvbiBkZXMgbG9rYWxlbiBCbHVldG9vdGgtVGVsZWZvbnMgZWluenVzZWhlbiB1bmQgVmVyYmluZHVuZ2VuIG1pdCBQYXJ0bmVyZ2Vyw6R0ZW4gaGVyenVzdGVsbGVuIHVuZCB6dSBha3plcHRpZXJlbi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNBZG1pbiAoMjI1MTMwMjIzMzAxMjI1MDA1NikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNBZG1pbiAoMTkzNTg0MjYxMTQ2NDg5NTc4NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY1JhdyAoNDQyMzQ3MTcxMTExNDMyNTcwOCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNSYXcgKDU1MzMwMjI3MzY1NTkzODU2NjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNOb3RpZnkgKDQ3ODQ3MDM2MDA4Mjc5MjM1OCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNOb3RpZnkgKDI5OTAwNTM1MTc5NjIwNzA2MTcpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNMbGNwICg0OTcyMDUxNDYxMDA3MDMwNDI2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0xsY3AgKDkxNTkyMTI3Nzg2MDA0NjQwKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSI0OTc3NDA2MTY0MzExNTM1MDkyIj4iVGFzdGVuc3BlcnJlIGRlYWt0aXZpZXJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjMxODk3NjM0NzkzMjYzMDIwMTciPiJFcm3DtmdsaWNodCBlaW5lciBBbndlbmR1bmcsIGRpZSBUYXN0ZW5zcGVycmUgc293aWUgZGVuIGRhbWl0IHZlcmJ1bmRlbmVuIFBhc3N3b3J0c2NodXR6IHp1IGRlYWt0aXZpZXJlbi4gU28gd2lyZCBkaWUgVGFzdGVuc3BlcnJlIHZvbSBUZWxlZm9uIGRlYWt0aXZpZXJ0LCB3ZW5uIGVpbiBBbnJ1ZiBlaW5nZWh0LCB1bmQgbmFjaCBCZWVuZGlndW5nIGRlcyBBbnJ1ZnMgd2llZGVyIGFrdGl2aWVydC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRTeW5jU2V0dGluZ3MiIG1zZ2lkPSI2MjAxODEwMDA4MjMwNTAzMDUyIj4iU3luY2hyb25pc2llcnVuZ3NlaW5zdGVsbHVuZ2VuIGxlc2VuIjwvc3RyaW5nPgpAQCAtNDM0LDIzICs0MTksMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI0MzI1MzU3MTY4MDQ3NDg3ODEiPiJudXR6ZXJkZWZpbmllcnRlcyBXw7ZydGVyYnVjaCBsZXNlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iMTA4Mjk3MjYwMzU3NjM2MDY5MCI+IkVybGF1YnQgZWluZXIgQW53ZW5kdW5nLCBhbGxlIHByaXZhdGVuIFfDtnJ0ZXIsIE5hbWVuIHVuZCBBdXNkcsO8Y2tlIHp1IGxlc2VuLCBkaWUgZWluIE51dHplciBpbiBzZWluZW0gV8O2cnRlcmJ1Y2ggZ2VzcGVpY2hlcnQgaGF0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iNjcwMzEwOTUxMTgzNjM0MzM0MSI+ImluIG51dHplcmRlZmluaWVydGVzIFfDtnJ0ZXJidWNoIHNjaHJlaWJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyNDEyNTYyMDY1MjQwODI4ODAiPiJFcm3DtmdsaWNodCBlaW5lciBBbndlbmR1bmcsIG5ldWUgV8O2cnRlciBpbiBkYXMgV8O2cnRlcmJ1Y2ggZGVzIE51dHplcnMgenUgc2NocmVpYmVuLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDgwNzk0MDM3NTkwMDE3NzcyOTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iOTkzNzA3NDM2OTQxMDE2OTEzIj4iU0QtS2FydGVuLUluaGFsdCDDpG5kZXJuL2zDtnNjaGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJTRC1LYXJ0ZW4tSW5oYWx0IMOkbmRlcm4vbMO2c2NoZW4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NjQzOTYzMjA0OTc2NDcxODc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MTMxODcxNTQxMTI3MjExNTI2Ij4iRXJtw7ZnbGljaHQgZWluZXIgQW53ZW5kdW5nLCBhdWYgZGllIFNELUthcnRlIHp1IHNjaHJlaWJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IkVybcO2Z2xpY2h0IGVpbmVyIEFud2VuZHVuZywgYXVmIGRpZSBTRC1LYXJ0ZSB6dSBzY2hyZWliZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjQxMjU2MjA2NTI0MDgyODgwIj4iRXJsYXVidCBlaW5lciBBbndlbmR1bmcsIG5ldWUgV8O2cnRlciBpbiBkYXMgV8O2cnRlcmJ1Y2ggZGVzIE51dHplcnMgenUgc2NocmVpYmVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iU0QtS2FydGVuLUluaGFsdCDDpG5kZXJuL2zDtnNjaGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4iRXJtw7ZnbGljaHQgZWluZXIgQW53ZW5kdW5nLCBhdWYgZGllIFNELUthcnRlIHp1IHNjaHJlaWJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjU2NTY0ODcyNjQ4MTk2Njk4MjQiPiJadWdyaWZmIGF1ZiBkYXMgQ2FjaGUtRGF0ZWlzeXN0ZW0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iMTYyNDczNDUyODQzNTY1OTkwNiI+Ikdld8OkaHJ0IGVpbmVyIEFud2VuZHVuZyBMZXNlLSB1bmQgU2NocmVpYnp1Z3JpZmYgYXVmIGRhcyBDYWNoZS1EYXRlaXN5c3RlbS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MzA3ODYxNDk2MzAyODUwMjAxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQ0OTc0MjA3Mjg4NTc1ODU3OTEiPiJQYXNzd29ydCBiZXNjaHLDpG5rZW4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxNzE5ODc3MjQ1NjkyMzE4Mjk5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI5MDgzNDAwMDgwODYxNzI4MDU2Ij4iQmVzY2hyw6Rua2VuIGRlciBlcmxhdWJ0ZW4gUGFzc3dvcnR0eXBlbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDczNzQ3ODA3MTI2NjQyODUzMjEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iOTE0MTMwNjQ2OTQyMTk5NTAzIj4iQW5tZWxkZXZlcnN1Y2hlIMO8YmVyd2FjaGVuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTk2MTI1MTE3OTYyNDg0MzQ4MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iNzIyNzU3ODI2MDE2NTE3MjY3MyI+IkZlaGxnZXNjaGxhZ2VuZSBWZXJzdWNoZcK3enVtIEFubWVsZGVuL0R1cmNoZsO8aHJlbiBlaW5lciBBa3Rpb24gw7xiZXJ3YWNoZW4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MDg0NzcyMDkwNzk3NDg1NDIwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjI2MjAwNzcxOTEyNDI2ODg5NTUiPiJQYXNzd29ydCB6dXLDvGNrc2V0emVuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzMzMjE2NzYwMDMzMTc5OTk5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iNTM5MTI0MDYxNjk4MTI5NzM2MSI+IkZlc3RsZWdlbiBlaW5lcyBuZXVlbiBXZXJ0cyBmw7xyIElociBQYXNzd29ydCwgc29kYXNzIGRlciBBZG1pbmlzdHJhdG9yIGVzIElobmVuIHZvciBkZW0gQW5tZWxkZW4gw7xiZXJtaXR0ZWxuIG11c3MuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTc2MDQ2NjAyNTI0NzYzNDQ4OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjIyNzQwODUzODQ3MDQyNDg0MzEiPiJTcGVycmVuIGVyendpbmdlbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI4MTk4Njg2NjQ5NDYwODk3NDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iNTY5Njk2NDEyNjIyNjAyODQ0MiI+IlN0ZXVlcnVuZyBkZXIgR2Vyw6R0ZXNwZXJyZTsgZXJmb3JkZXJ0IGRpZSBlcm5ldXRlIFBhc3N3b3J0ZWluZ2FiZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDMwNzg2MTQ5NjMwMjg1MDIwMSI+IlBhc3N3b3J0IGJlc2NocsOkbmtlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjE3MTk4NzcyNDU2OTIzMTgyOTkiPiJCZXNjaHLDpG5rZW4gZGVyIGVybGF1YnRlbiBQYXNzd29ydHR5cGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI3Mzc0NzgwNzEyNjY0Mjg1MzIxIj4iQW5tZWxkZXZlcnN1Y2hlIMO8YmVyd2FjaGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iMTk2MTI1MTE3OTYyNDg0MzQ4MyI+IkZlaGxnZXNjaGxhZ2VuZSBWZXJzdWNoZcK3enVtIEFubWVsZGVuL0R1cmNoZsO8aHJlbiBlaW5lciBBa3Rpb24gw7xiZXJ3YWNoZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjkwODQ3NzIwOTA3OTc0ODU0MjAiPiJQYXNzd29ydCB6dXLDvGNrc2V0emVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iMzMzMjE2NzYwMDMzMTc5OTk5MSI+IkZlc3RsZWdlbiBlaW5lcyBuZXVlbiBXZXJ0cyBmw7xyIElociBQYXNzd29ydCwgc29kYXNzIGRlciBBZG1pbmlzdHJhdG9yIGVzIElobmVuIHZvciBkZW0gQW5tZWxkZW4gw7xiZXJtaXR0ZWxuIG11c3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjU3NjA0NjYwMjUyNDc2MzQ0ODgiPiJTcGVycmVuIGVyendpbmdlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IlN0ZXVlcnVuZyBkZXIgR2Vyw6R0ZXNwZXJyZTsgZXJmb3JkZXJ0IGRpZSBlcm5ldXRlIFBhc3N3b3J0ZWluZ2FiZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJBbGxlIERhdGVuIGzDtnNjaGVuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjMxNDA2MDkzMzc5NjM5NjIwNSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9Ijc2Njk4OTUzMzM4MTQyMjI1ODYiPiJadXLDvGNrc2V0emVuIGF1ZiBkaWUgV2Vya3NlaW5zdGVsbHVuZ2VuLiBEYWJlaSB3ZXJkZW4gYWxsZSBJaHJlIERhdGVuIG9obmUgTmFjaGZyYWdlIGdlbMO2c2NodC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+Ilp1csO8Y2tzZXR6ZW4gYXVmIGRpZSBXZXJrc2VpbnN0ZWxsdW5nZW4uIERhYmVpIHdlcmRlbiBhbGxlIElocmUgRGF0ZW4gb2huZSBOYWNoZnJhZ2UgZ2Vsw7ZzY2h0LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5IiBtc2dpZD0iNjM4NzQ5NzQ2NjY2MDE1NDkzMSI+IkRlbiBnbG9iYWxlbiBQcm94eSBkZXMgR2Vyw6R0cyB6dXIgVmVyd2VuZHVuZyB3w6RocmVuZCBkZXIgQWt0aXZpZXJ1bmcgZGVyIFJpY2h0bGluaWUgZmVzdGxlZ2VuLiBOdXIgZGVyIGVyc3RlIEdlcsOkdGVhZG1pbmlzdHJhdG9yIGthbm4gZGVuIGfDvGx0aWdlbiBnbG9iYWxlbiBQcm94eSBmZXN0bGVnZW4uIjwvc3RyaW5nPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iUHJpdmF0IjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTW9iaWwiPC9pdGVtPgpAQCAtNDg3LDcgKzQ3Myw3IEBACiAgIDxzdHJpbmctYXJyYXkgbmFtZT0iaW1Qcm90b2NvbHMiPgogICAgIDxpdGVtIG1zZ2lkPSI4NTk1MjYxMzYzNTE4NDU5NTY1Ij4iQUlNIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iNzM5MDQ3MzYyODI3NTQ5MDcwMCI+IldpbmRvd3MgTGl2ZSI8L2l0ZW0+Ci0gICAgPGl0ZW0gbXNnaWQ9Ijc4ODI4NzcxMzQ5MzE0NTgyMTciPiJZYWhvbyEiPC9pdGVtPgorICAgIDxpdGVtIG1zZ2lkPSI3ODgyODc3MTM0OTMxNDU4MjE3Ij4iWWFob28iPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI1MDM1Mzc2MzEzMjAwNTg1MjQyIj4iU2t5cGUiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI3NTMyMzYzMTc4NDU5NDQ0OTQzIj4iUVEiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSIzNzEzNDQxMDM0Mjk5NjYwNzQ5Ij4iR29vZ2xlIFRhbGsiPC9pdGVtPgpAQCAtNTM0LDcgKzUyMCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJpbVByb3RvY29sQ3VzdG9tIiBtc2dpZD0iNjkxOTQ1MzgzNjYxODc0OTk5MiI+IkJlbnV0emVyZGVmaW5pZXJ0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW1Qcm90b2NvbEFpbSIgbXNnaWQ9IjcwNTAzNjA2MTIzNjgzODM0MTciPiJBSU0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbVByb3RvY29sTXNuIiBtc2dpZD0iMTQ0NTU2NTQ1NDIwNzY5NDQyIj4iV2luZG93cyBMaXZlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iaW1Qcm90b2NvbFlhaG9vIiBtc2dpZD0iODI3MTQzOTQwODQ2OTAyMTI3MyI+IllhaG9vISI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImltUHJvdG9jb2xZYWhvbyIgbXNnaWQ9IjgyNzE0Mzk0MDg0NjkwMjEyNzMiPiJZYWhvbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImltUHJvdG9jb2xTa3lwZSIgbXNnaWQ9IjkwMTkyOTY3NDQ2MjI4MzI5NTEiPiJTa3lwZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImltUHJvdG9jb2xRcSIgbXNnaWQ9Ijg4ODc0ODQzNzk0OTQxMTE4ODQiPiJRUSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImltUHJvdG9jb2xHb29nbGVUYWxrIiBtc2dpZD0iMzgwODM5Mzk3OTE1NzY5ODc2NiI+Ikdvb2dsZSBUYWxrIjwvc3RyaW5nPgpAQCAtNTUyLDEwICs1MzgsOSBAQAogICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVPdGhlciAoNDQwODQzNjE2Mjk1MDExOTg0OSkgLS0+CiAgICAgPHNraXAgLz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiLDvGJlciA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IMO8YmVyIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iUElOLUNvZGUgZWluZ2ViZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IlBhc3N3b3J0IHp1bSBFbnRzcGVycmVuIGVpbmdlYmVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJQSU4genVtIEVudHNwZXJyZW4gZWluZ2ViZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJGYWxzY2hlciBQSU4tQ29kZSEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iRHLDvGNrZW4gU2llIHp1bSBFbnRzcGVycmVuIGRpZSBNZW7DvHRhc3RlIHVuZCBkYW5uIGF1ZiBcIjBcIi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTm90cnVmbnVtbWVyIjwvc3RyaW5nPgpAQCAtNTY4LDYgKzU1Myw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+Ilp1csO8Y2sgenVtIEFucnVmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iS29ycmVrdCEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iVHV0IHVucyBsZWlkLiBWZXJzdWNoZW4gU2llIGVzIG5vY2ggZWlubWFsLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iVHV0IHVucyBsZWlkLiBWZXJzdWNoZW4gU2llIGVzIG5vY2ggZWlubWFsLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IldpcmQgZ2VsYWRlbiAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iQXVmZ2VsYWRlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gPHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU4Miw2ICs1NjgsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iQml0dGUgUElOLUNvZGUgZWluZ2ViZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJTSU0tS2FydGUgd2lyZCBlbnRzcGVycnQuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJTaWUgaGFiZW4gSWhyIEVudHNwZXJydW5nc211c3RlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPi1tYWwgZmFsc2NoIGdlemVpY2huZXQuICJcblxuIlZlcnN1Y2hlbiBTaWUgZXMgaW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gU2VrdW5kZW4gZXJuZXV0LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IlNpZSBoYWJlbiBJaHIgUGFzc3dvcnQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gTWFsIGZhbHNjaCBlaW5nZWdlYmVuLiAiXG5cbiJWZXJzdWNoZW4gU2llIGVzIGluIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IFNla3VuZGVuIGVybmV1dC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iU2llIGhhYmVuIElocmUgUElOIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IE1hbCBmYWxzY2ggZWluZ2VnZWJlbi4gIlxuXG4iVmVyc3VjaGVuIFNpZSBlcyBpbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBTZWt1bmRlbiBlcm5ldXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJTaWUgaGFiZW4gSWhyIEVudHNwZXJydW5nc211c3RlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPi1tYWwgZmFsc2NoIGdlemVpY2huZXQuIE5hY2ggPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gd2VpdGVyZW4gZXJmb2xnbG9zZW4gVmVyc3VjaGVuIHdlcmRlbiBTaWUgYXVmZ2Vmb3JkZXJ0LCBJaHIgVGVsZWZvbiBtaXRoaWxmZSBJaHJlciBHb29nbGUtQW5tZWxkZWluZm9ybWF0aW9uZW4genUgZW50c3BlcnJlbi4gIlxuXG4iVmVyc3VjaGVuIFNpZSBlcyBpbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBTZWt1bmRlbiBlcm5ldXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlZlcnN1Y2hlbiBTaWUgZXMgaW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IFNla3VuZGVuIGVybmV1dC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+Ik11c3RlciB2ZXJnZXNzZW4/Ijwvc3RyaW5nPgpAQCAtNjEwLDE0ICs1OTgsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ19iZWZvcmVfdW5sb2FkIiBtc2dpZD0iMTkwMTY3NTQ0ODE3OTY1MzA4OSI+IlZvbiBkaWVzZXIgU2VpdGUgbmF2aWdpZXJlbj8iXG5cbiI8eGxpZmY6ZyBpZD0iTUVTU0FHRSI+JXM8L3hsaWZmOmc+IlxuXG4iV8OkaGxlbiBTaWUgXCJPS1wiLCB1bSBmb3J0enVmYWhyZW4sIG9kZXIgd8OkaGxlbiBTaWUgXCJBYmJyZWNoZW5cIiwgdW0gYXVmIGRlciBha3R1ZWxsZW4gU2VpdGUgenUgYmxlaWJlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX2xhYmVsIiBtc2dpZD0iNjg2MDI2MTc1ODY2NTgyNTA2OSI+IkJlc3TDpHRpZ2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZG91YmxlX3RhcF90b2FzdCIgbXNnaWQ9IjEwNjgyMTY5MzcyNDQ1NjcyNDciPiJUaXBwOiBadW0gSGVyYW56b29tZW4gdW5kIFZlcmdyw7bDn2VybiB6d2VpbWFsIHRpcHBlbiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvZmlsbF90aGlzX2Zvcm0gKDg5NDAxMTA4NjY3NzUwOTc0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iMTI4NDg0MzcyODIwMzQxMjEzNSI+IkJyb3dzZXJ2ZXJsYXVmIHVuZCBMZXNlemVpY2hlbiBsZXNlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iNDk4MTQ4OTgxNTQ2NzYxNzE5MSI+IkVybcO2Z2xpY2h0IGRlciBBbndlbmR1bmcsIGFsbGUgVVJMcywgZGllIG1pdCBkZW0gQnJvd3NlciBiZXN1Y2h0IHd1cmRlbiwgc293aWUgYWxsZSBMZXNlemVpY2hlbiBkZXMgQnJvd3NlcnMgenUgbGVzZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5MDA5NDM0MTA5ODM2MjgwMzc0Ij4iQnJvd3NlcnZlcmxhdWYgdW5kIExlc2V6ZWljaGVuIHNjaHJlaWJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9Ijk0NTU3MTk5MDM1NzExNDk1MCI+IkVybcO2Z2xpY2h0IGVpbmVyIEFud2VuZHVuZywgZGVuIGF1ZiBJaHJlbSBUZWxlZm9uIGdlc3BlaWNoZXJ0ZW4gQnJvd3NlcnZlcmxhdWYgdW5kIGRpZSBMZXNlemVpY2hlbiB6dSDDpG5kZXJuLiBTY2jDpGRsaWNoZSBBbndlbmR1bmdlbiBrw7ZubmVuIHNvIElocmUgQnJvd3NlcmRhdGVuIGzDtnNjaGVuIG9kZXIgw6RuZGVybi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRBbGFybSAoNTkyNDQwMTMyODgwMzYxNTE2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRBbGFybSAoNTk2Njk2NjU5ODE0OTg3NTA4MikgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDcxNTIxMjY1NTU5ODI3NTUzMiI+Ikdlb2xva2FsaXNpZXJ1bmdzYmVyZWNodGlndW5nZW4gZGVzIEJyb3dzZXJzIMOkbmRlcm4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0MDExOTA4MjgyOTgwODYxNjc5Ij4iRXJtw7ZnbGljaHQgZWluZXIgQW53ZW5kdW5nLCBkaWUgR2VvbG9rYWxpc2llcnVuZ3NiZXJlY2h0aWd1bmdlbiBkZXMgQnJvd3NlcnMgenUgw6RuZGVybi4gU2Now6RkbGljaGUgQW53ZW5kdW5nZW4ga8O2bm5lbiBkaWVzIG51dHplbiwgdW0gZGFzIFNlbmRlbiB2b24gU3RhbmRvcnRpbmZvcm1hdGlvbmVuIGFuIHdpbGxrw7xybGljaGUgV2Vic2l0ZXMgenV6dWxhc3Nlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiJNw7ZjaHRlbiBTaWUsIGRhc3MgZGVyIEJyb3dzZXIgZGllc2VzIFBhc3N3b3J0IHNwZWljaGVydD8iPC9zdHJpbmc+CkBAIC03MzAsMTQgKzcxNiwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IkFsbGVzIGF1c3fDpGhsZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+IldvcnQgYXVzd8OkaGxlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJBdXNzY2huZWlkZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IktvcGllcmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iRWluZsO8Z2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJVUkwga29waWVyZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiJUZXh0IGF1c3fDpGhsZW4uLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4iVGV4dGF1c3dhaGwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJFaW5nYWJlbWV0aG9kZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiB6dW0gV8O2cnRlcmJ1Y2ggaGluenVmw7xnZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJUZXh0IGJlYXJiZWl0ZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiJUZXh0YWt0aW9uZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IkdlcmluZ2VyIFNwZWljaGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iS2F1bSBub2NoIGZyZWllciBUZWxlZm9uc3BlaWNoZXIgdmVyZsO8Z2Jhci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTc0NSw2ICs3MzEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQWJicmVjaGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IkFjaHR1bmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IldpcmQgZ2VsYWRlbi4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iRUlOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iQVVTIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJBa3Rpb24gZHVyY2hmw7xocmVuIG1pdCI8L3N0cmluZz4KQEAgLTc2MywxOSArNzUwLDIyIEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiJTY2hsaWXDn2VuIGVyendpbmdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlcG9ydCIgbXNnaWQ9IjQwNjAyMTgyNjA5ODQ3OTU3MDYiPiJCZXJpY2h0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiJXYXJ0ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJBbndlbmR1bmcgdW1nZWxlaXRldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiB3aXJkIGpldHp0IGF1c2dlZsO8aHJ0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiB3dXJkZSB1cnNwcsO8bmdsaWNoIGdlc3RhcnRldC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iRGllIEFud2VuZHVuZyA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChQcm96ZXNzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgaGF0IGdlZ2VuIGlocmUgc2VsYnN0ZXJ6d3VuZ2VuZSBTdHJpY3RNb2RlLVJpY2h0bGluaWUgdmVyc3Rvw59lbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJEZXIgUHJvemVzcyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gaGF0IGdlZ2VuIHNlaW5lIHNlbGJzdGVyend1bmdlbmUgU3RyaWN0TW9kZS1SaWNodGxpbmllIHZlcnN0b8OfZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiBsw6R1ZnQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uX2RldGFpbCIgbXNnaWQ9IjI0MjM5Nzc0OTkzMzk0MDM0MDIiPiJBdXN3w6RobGVuIHp1bSBXZWNoc2VsbiBpbiBkaWUgQW53ZW5kdW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X3N3aXRjaGVyX3RpdGxlIiBtc2dpZD0iMTEzNTQwMzYzMzc2NjY5NDMxNiI+IkFud2VuZHVuZyB3ZWNoc2Vsbj8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfc3dpdGNoZXJfdGV4dCIgbXNnaWQ9IjQ1OTIwNzU2MTAwNzkzMTk2NjciPiJFcyBsw6R1ZnQgZ2VyYWRlIGVpbmUgYW5kZXJlIEFud2VuZHVuZywgZGllIHZvciBkZW0gU3RhcnQgZWluZXIgbmV1ZW4gYmVlbmRldCB3ZXJkZW4gbXVzcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfc3dpdGNoZXJfdGV4dCIgbXNnaWQ9IjQ1OTIwNzU2MTAwNzkzMTk2NjciPiJFaW5lIGFuZGVyZSBBbndlbmR1bmcgd2lyZCBiZXJlaXRzIGF1c2dlZsO8aHJ0IHVuZCBtdXNzIHZvciBkZW0gU3RhcnQgZWluZXIgbmV1ZW4gQW53ZW5kdW5nIGJlZW5kZXQgd2VyZGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9sZF9hcHBfYWN0aW9uIiBtc2dpZD0iNDkzMTI5MTcyMjM4NTY2MjgyIj4iWnUgPHhsaWZmOmcgaWQ9Ik9MRF9BUFAiPiUxJHM8L3hsaWZmOmc+IHp1csO8Y2trZWhyZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJvbGRfYXBwX2Rlc2NyaXB0aW9uIiBtc2dpZD0iOTQyOTY3OTAwMjM3MjA4NDY2Ij4iRGllIG5ldWUgQW53ZW5kdW5nIG5pY2h0IHN0YXJ0ZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ib2xkX2FwcF9kZXNjcmlwdGlvbiIgbXNnaWQ9Ijk0Mjk2NzkwMDIzNzIwODQ2NiI+IlN0YXJ0ZW4gU2llIGRpZSBuZXVlIEFud2VuZHVuZyBuaWNodC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJuZXdfYXBwX2FjdGlvbiIgbXNnaWQ9IjU0NzI3NTY5MjY5NDU0NDA3MDYiPiI8eGxpZmY6ZyBpZD0iT0xEX0FQUCI+JTEkczwveGxpZmY6Zz4gc3RhcnRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im5ld19hcHBfZGVzY3JpcHRpb24iIG1zZ2lkPSI2ODMwMzk4MzM5ODI2Nzg5NDkzIj4iQW53ZW5kdW5nIGJlZW5kZW4sIG9obmUgenUgc3BlaWNoZXJuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5ld19hcHBfZGVzY3JpcHRpb24iIG1zZ2lkPSI2ODMwMzk4MzM5ODI2Nzg5NDkzIj4iQmVlbmRlbiBTaWUgZGllIEFud2VuZHVuZyBvaG5lIHp1IHNwZWljaGVybi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZW5kVGV4dCIgbXNnaWQ9IjUxMzI1MDYxMjE2NDU2MTgzMTAiPiJBa3Rpb24gZsO8ciBUZXh0IGF1c3fDpGhsZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ2b2x1bWVfcmluZ3RvbmUiIG1zZ2lkPSI2ODg1NDIxNDA2ODQ1NzM0NjUwIj4iS2xpbmdlbHRvbmxhdXRzdMOkcmtlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idm9sdW1lX211c2ljIiBtc2dpZD0iNTQyMTY1MTE1NzEzODYyODE3MSI+Ik1lZGllbmxhdXRzdMOkcmtlIjwvc3RyaW5nPgpAQCAtODEyLDU4ICs4MDIsNDIgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1zX3Nob3dfYWxsIiBtc2dpZD0iMjY3MTc5MTE2MzkzMzA5MTE4MCI+PGI+IkFsbGUgYW56ZWlnZW4iPC9iPjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYWN0aXZpdHlfdGl0bGUiIG1zZ2lkPSIyMzk5Mjg5OTk5NjA4OTAwNDQzIj4iVVNCLU1hc3NlbnNwZWljaGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfdGl0bGUiIG1zZ2lkPSI1OTAxNDU5MDQxMzk4NzUxNDk1Ij4iVVNCLVZlcmJpbmR1bmciPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0Nzk2NzU5NjQ2MTY3MjQ3MTc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjgyMzE0NjI3NTAwMTAwNjY4OTYiPiJTaWUgaGFiZW4gSWhyIFRlbGVmb24gw7xiZXIgVVNCIG1pdCBJaHJlbSBDb21wdXRlciB2ZXJidW5kZW4uIFfDpGhsZW4gU2llIGRpZSBTY2hhbHRmbMOkY2hlIHVudGVuIGF1cywgd2VubiBTaWUgRGF0ZWllbiBhdWYgSWhyZW4gQ29tcHV0ZXIgb2RlciBkaWUgU0QtS2FydGUgSWhyZXMgQW5kcm9pZC1HZXLDpHRzIGtvcGllcmVuIG3DtmNodGVuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4iU2llIGhhYmVuIElociBUZWxlZm9uIMO8YmVyIFVTQiBtaXQgSWhyZW0gQ29tcHV0ZXIgdmVyYnVuZGVuLiBXw6RobGVuIFNpZSBkaWUgU2NoYWx0ZmzDpGNoZSB1bnRlbiBhdXMsIHdlbm4gU2llIERhdGVpZW4gYXVmIElocmVuIENvbXB1dGVyIG9kZXIgZGllIFNELUthcnRlIElocmVzIEFuZHJvaWQtR2Vyw6R0cyBrb3BpZXJlbiBtw7ZjaHRlbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+IlNpZSBoYWJlbiBJaHIgVGVsZWZvbiDDvGJlciBVU0IgbWl0IElocmVtIENvbXB1dGVyIHZlcmJ1bmRlbi4gV8OkaGxlbiBTaWUgZGllIFNjaGFsdGZsw6RjaGUgdW50ZW4gYXVzLCB3ZW5uIFNpZSBEYXRlaWVuIGF1ZiBJaHJlbiBDb21wdXRlciBvZGVyIGRpZSBTRC1LYXJ0ZSBJaHJlcyBBbmRyb2lkLUdlcsOkdHMga29waWVyZW4gbcO2Y2h0ZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYnV0dG9uX21vdW50IiBtc2dpZD0iMTA1MjI1OTkzMDM2OTUwODIzNSI+IlVTQi1TcGVpY2hlciBha3RpdmllcmVuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjUzNDc4NDc1MTYwMzM0NTM2MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0ODE4MzQ3NzU2NDAyNzQwMjYxIj4iQmVpIGRlciBWZXJ3ZW5kdW5nIElocmVyIFNELUthcnRlIGFscyBVU0ItU3BlaWNoZXIgaXN0IGVpbiBQcm9ibGVtIGF1ZmdldHJldGVuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iQmVpIGRlciBWZXJ3ZW5kdW5nIElocmVyIFNELUthcnRlIGFscyBVU0ItU3BlaWNoZXIgaXN0IGVpbiBQcm9ibGVtIGF1ZmdldHJldGVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iQmVpIGRlciBWZXJ3ZW5kdW5nIElocmVyIFNELUthcnRlIGFscyBVU0ItU3BlaWNoZXIgaXN0IGVpbiBQcm9ibGVtIGF1ZmdldHJldGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjgxNzU4OTI1NTQ3NTcyMTY1MjUiPiJVU0ItVmVyYmluZHVuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzM4MDA4MjQwNDI4ODIxOTM0MSI+Ilp1bSBLb3BpZXJlbiB2b24gRGF0ZWllbiB6dW0vdm9tIENvbXB1dGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MzgwMDgyNDA0Mjg4MjE5MzQxIj4iWnVtIEtvcGllcmVuIHZvbiBEYXRlaWVuIHp1L3ZvbiBJaHJlbSBDb21wdXRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjIzMzYwNTgzOTY2NjM1MTYwMTciPiJVU0ItU3BlaWNoZXIgZGVha3RpdmllcmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI1OTE4MTM0OTAyNjk4NDE1MzkiPiJBdXN3w6RobGVuLCB1bSBVU0ItU3BlaWNoZXIgenUgZGVha3RpdmllcmVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfdGl0bGUiIG1zZ2lkPSI2NjAxMjk4NTE3MDg3NzU4NTMiPiJVU0ItU3BlaWNoZXIgaW4gVmVyd2VuZHVuZyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MTM3MTMzOTY0MjY2MDQxMDQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NzQ1MzQ1MjYwNzgwMjY3MTg1Ij4iU3RlbGxlbiBTaWUgdm9yIGRlbSBEZWFrdGl2aWVyZW4gZGVzIFVTQi1TcGVpY2hlcnMgc2ljaGVyLCBkYXNzIFNpZSBJaHJlIEFuZHJvaWQtU0QtS2FydGUgdm9uIElocmVtIENvbXB1dGVyIGdldHJlbm50IChcImF1c2dld29yZmVuXCIpIGhhYmVuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJTdGVsbGVuIFNpZSB2b3IgZGVtIERlYWt0aXZpZXJlbiBkZXMgVVNCLVNwZWljaGVycyBzaWNoZXIsIGRhc3MgU2llIElocmUgQW5kcm9pZC1TRC1LYXJ0ZSB2b24gSWhyZW0gQ29tcHV0ZXIgZ2V0cmVubnQgKFwiYXVzZ2V3b3JmZW5cIikgaGFiZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IlN0ZWxsZW4gU2llIHZvciBkZW0gRGVha3RpdmllcmVuIGRlcyBVU0ItU3BlaWNoZXJzIHNpY2hlciwgZGFzcyBTaWUgSWhyZSBBbmRyb2lkLVNELUthcnRlIHZvbiBJaHJlbSBDb21wdXRlciBnZXRyZW5udCAoXCJhdXNnZXdvcmZlblwiKSBoYWJlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjcwNjAyMTgwMzQ5MDA2OTYwMjkiPiJVU0ItU3BlaWNoZXIgZGVha3RpdmllcmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMTQzODgxOTE0ODQwNDEyMTA4Ij4iQmVpbSBEZWFrdGl2aWVyZW4gZGVzIFVTQi1TcGVpY2hlcnMgaXN0IGVpbiBQcm9ibGVtIGF1ZmdldHJldGVuLiDDnGJlcnByw7xmZW4gU2llLCBvYiBTaWUgZGVuIFVTQi1Ib3N0IGdldHJlbm50IGhhYmVuLCB1bmQgdmVyc3VjaGVuIFNpZSBlcyBlcm5ldXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RpdGxlIiBtc2dpZD0iOTYzMDM5MDMzNDcwNDc4Njk3Ij4iVVNCLVNwZWljaGVyIGFrdGl2aWVyZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGV4dCIgbXNnaWQ9IjMyMDI4MzgyMzQ3ODA1MDU4ODYiPiJXZW5uIFNpZSBkZW4gVVNCLVNwZWljaGVyIGFrdGl2aWVyZW4sIHdlcmRlbiBlaW5pZ2Ugdm9uIElobmVuIHZlcndlbmRldGUgQW53ZW5kdW5nZW4gYW5nZWhhbHRlbiB1bmQgc2luZCBtw7ZnbGljaGVyd2Vpc2UgbmljaHQgdmVyZsO8Z2JhciwgYmlzIFNpZSBkZW4gVVNCLVNwZWljaGVyIHdpZWRlciBkZWFrdGl2aWVyZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2Vycm9yX3RpdGxlIiBtc2dpZD0iODA0ODk5OTk3MzgzNzMzOTE3NCI+IlVTQi1Wb3JnYW5nIGZlaGxnZXNjaGxhZ2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX29rIiBtc2dpZD0iNzM3Njk1MzE2NzAzOTg2NTcwMSI+Ik9LIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODY2MzI0NzkyOTU1MTA5NTg1NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY1Nzc5MDgwMDY5NDk3NDIyMTciPiJTRC1LYXJ0ZSBmb3JtYXRpZXJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJTRC1LYXJ0ZSBmb3JtYXRpZXJlbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MjEzNjk5NjI0MzM1MjM2MTkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM0NzA4MTUxNDAwNjg1MDI4MjQiPiJNw7ZjaHRlbiBTaWUgZGllIFNELUthcnRlIHdpcmtsaWNoIGZvcm1hdGllcmVuPyBBbGxlIERhdGVuIGF1ZiBJaHJlciBLYXJ0ZSBnZWhlbiBkYW5uIHZlcmxvcmVuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+Ik3DtmNodGVuIFNpZSBkaWUgU0QtS2FydGUgd2lya2xpY2ggZm9ybWF0aWVyZW4/IEFsbGUgRGF0ZW4gYXVmIElocmVyIEthcnRlIGdlaGVuIGRhbm4gdmVybG9yZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IlNELUthcnRlIGZvcm1hdGllcmVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4iTcO2Y2h0ZW4gU2llIGRpZSBTRC1LYXJ0ZSB3aXJrbGljaCBmb3JtYXRpZXJlbj8gQWxsZSBEYXRlbiBhdWYgSWhyZXIgS2FydGUgZ2VoZW4gZGFubiB2ZXJsb3Jlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfYnV0dG9uX2Zvcm1hdCIgbXNnaWQ9IjQxMzEwNjQ1NjAxMjc0Nzg2OTUiPiJGb3JtYXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3MjkwNDQ3Nzg5NDkxODk5MTgiPiJVU0ItRGVidWdnaW5nIHZlcmJ1bmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4NDcwMjk2ODE4MjcwMTEwMzk2Ij4iQXVzd8OkaGxlbiwgdW0gVVNCLURlYnVnZ2luZyB6dSBkZWFrdGl2aWVyZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9Ijg0NzAyOTY4MTgyNzAxMTAzOTYiPiJadW0gRGVha3RpdmllcmVuIGRlcyBVU0ItRGVidWdnaW5nIGF1c3fDpGhsZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RfaW5wdXRfbWV0aG9kIiBtc2dpZD0iNjg2NTUxMjc0OTQ2MjA3Mjc2NSI+IkVpbmdhYmVtZXRob2RlIGF1c3fDpGhsZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9hbHBoYWJldCIgbXNnaWQ9IjU0MzMyNzU0ODU0OTkwMzkxOTkiPiIgQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9udW1lcmljX2FscGhhYmV0IiBtc2dpZD0iNDAzMDE3MDUyNDU5NTEyMzYxMCI+IiAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYW5kaWRhdGVzX3N0eWxlIiBtc2dpZD0iNDMzMzkxMzA4OTYzNzA2MjI1NyI+PHU+IkthbmRpZGF0ZW4iPC91Pjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTQ1NzYwMzQxODk3MDk5NDA1MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MjM5NTE2Njc1MDI4NDM4OTk3Ij4iU0QtS2FydGUgd2lyZCB2b3JiZXJlaXRldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4iU0QtS2FydGUgd2lyZCB2b3JiZXJlaXRldCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4iU0QtS2FydGUgd2lyZCB2b3JiZXJlaXRldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjgyODczMTk4ODI5MjY3MzcwNTMiPiJTdWNoZSBuYWNoIEZlaGxlcm4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3ODA0Nzc4MzgyNDEyMTI5OTcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzOTM3MzQ1NTc3OTgzNzMwODczIj4iU0QtS2FydGUgbGVlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IlNELUthcnRlIGxlZXIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxMzEyMjY2ODIwMDkyOTU4MDE0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNjA2NjYwNzU2MTI0NjI5NzA4Ij4iRGllIFNELUthcnRlIGlzdCBsZWVyIG9kZXIgdmVyd2VuZGV0IGVpbiBEYXRlaXN5c3RlbSwgZGFzIG5pY2h0IHVudGVyc3TDvHR6dCB3aXJkLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlNELUthcnRlIGlzdCBsZWVyIG9kZXIgdmVyZsO8Z3Qgw7xiZXIgZWluIG5pY2h0IHVudGVyc3TDvHR6dGVzIERhdGVpc3lzdGVtLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY0MTA3MjM5MDYwMTkxMDAxODkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTcyNDYxOTkwMjA3NjUyODg4OSI+IkJlc2Now6RkaWd0ZSBTRC1LYXJ0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iQmVzY2jDpGRpZ3RlIFNELUthcnRlIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjY3OTQxMjg4NDI5MDA2MTc3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY0NjAzMTE4MzUxMzA2NzExOTQiPiJEaWUgU0QtS2FydGUgaXN0IGJlc2Now6RkaWd0LiBTaWUgbcO8c3NlbiBJaHJlIEthcnRlIGV2ZW50dWVsbCBuZXUgZm9ybWF0aWVyZW4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IkRpZSBTRC1LYXJ0ZSBpc3QgYmVzY2jDpGRpZ3QuIFNpZSBtw7xzc2VuIElocmUgS2FydGUgZXZlbnR1ZWxsIG5ldSBmb3JtYXRpZXJlbi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2ODcyMTUyODgyNjA0NDA3ODM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjU4MjE3NTAxNjA2MDQzMjAzNCI+IlNELUthcnRlIHVuZXJ3YXJ0ZXQgZW50ZmVybnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iU0QtS2FydGUgdW5lcndhcnRldCBlbnRmZXJudCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDcyNjAxODMyOTM3NDc0NDgyNDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjIwMDUzOTY0NjQ0OTQ2NDg5MzciPiJTRC1LYXJ0ZSB2b3IgZGVtIEVudG5laG1lbiB0cmVubmVuLCB1bSBEYXRlbnZlcmx1c3QgenUgdmVybWVpZGVuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+IlNELUthcnRlIHZvciBkZW0gRW50bmVobWVuIHRyZW5uZW4sIHVtIERhdGVudmVybHVzdCB6dSB2ZXJtZWlkZW4uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjcyOTgwMTEzMDc5MDYxNjIwMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzY1MjU4ODEwMTg2Nzk1MTUiPiJTRC1LYXJ0ZSBrYW5uIGVudGZlcm50IHdlcmRlbi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJTRC1LYXJ0ZSBrYW5uIGVudGZlcm50IHdlcmRlbi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3NjEzOTYwNjg2NzQ3NTkyNzcwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijc1MDM3NjkxMDYyODUxODg3MDMiPiJEaWUgU0QtS2FydGUga2FubiBqZXR6dCBlbnRmZXJudCB3ZXJkZW4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IkRpZSBTRC1LYXJ0ZSBrYW5uIGVudGZlcm50IHdlcmRlbi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4OTAyNTE4MDMwNDA0MzgxMzE4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTg3NDg4OTc2NDM2NzA4NTU2MiI+IlNELUthcnRlIGVudGZlcm50Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IlNELUthcnRlIGVudGZlcm50Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDIwNTExNzIyNzM0MjgyMjI3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjczMDg5MDQ0MTMzMTM0NDc3NiI+IkRpZSBTRC1LYXJ0ZSB3dXJkZSBlbnRmZXJudC4gTGVnZW4gU2llIGVpbmUgbmV1ZSBTRC1LYXJ0ZSBlaW4sIHVtIGRlbiBTcGVpY2hlcnBsYXR6IElocmVzIEdlcsOkdHMgenUgZXJ3ZWl0ZXJuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IlNELUthcnRlIGVudGZlcm50LiBMZWdlbiBTaWUgZWluZSBuZXVlIGVpbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI3ODA0Nzc4MzgyNDEyMTI5OTciPiJTRC1LYXJ0ZSBsZWVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iU0QtS2FydGUgaXN0IGxlZXIgb2RlciB2ZXJmw7xndCDDvGJlciBlaW4gbmljaHQgdW50ZXJzdMO8dHp0ZXMgRGF0ZWlzeXN0ZW0uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJCZXNjaMOkZGlndGUgU0QtS2FydGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iRGllIFNELUthcnRlIGlzdCBiZXNjaMOkZGlndC4gU2llIG3DvHNzZW4gSWhyZSBLYXJ0ZSBldmVudHVlbGwgbmV1IGZvcm1hdGllcmVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJTRC1LYXJ0ZSB1bmVyd2FydGV0IGVudGZlcm50Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4iU0QtS2FydGUgdm9yIGRlbSBFbnRuZWhtZW4gdHJlbm5lbiwgdW0gRGF0ZW52ZXJsdXN0IHp1IHZlcm1laWRlbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJTRC1LYXJ0ZVxua2FubiBlbnRmZXJudCB3ZXJkZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IkRpZSBTRC1LYXJ0ZSBrYW5uIGVudGZlcm50IHdlcmRlbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4OTAyNTE4MDMwNDA0MzgxMzE4Ij4iU0QtS2FydGUgZW50ZmVybnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjM4NzAxMjA2NTI5ODM2NTk2NDEiPiJTRC1LYXJ0ZSBlbnRmZXJudC4gTGVnZW4gU2llIGVpbmUgbmV1ZSBlaW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfbGlzdF9lbXB0eSIgbXNnaWQ9IjQxNjg4MjA2MDk0MDMzODU3ODkiPiJLZWluZSBwYXNzZW5kZW4gQWt0aXZpdMOkdGVuIGdlZnVuZGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODc4NzM1MjA3NDMyNjc0ODg5MiI+Ik51dHp1bmdzc3RhdGlzdGlrIGRlciBLb21wb25lbnRlIGFrdHVhbGlzaWVyZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODkxNTUzNjk1NzE2NzUyODM1Ij4iRXJtw7ZnbGljaHQgZGllIMOEbmRlcnVuZyB2b24gZ2VzYW1tZWx0ZW4gTnV0enVuZ3NzdGF0aXN0aWtlbiBkZXIgS29tcG9uZW50ZS4gTmljaHQgZsO8ciBub3JtYWxlIEFud2VuZHVuZ2VuIHZvcmdlc2VoZW4uIjwvc3RyaW5nPgpAQCAtODk4LDE1ICs4NzIsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJMMlRQL0lQU2VjLVZQTiBtaXQgdm9yaW5zdGFsbGllcnRlbSBTY2hsw7xzc2VsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlplcnRpZmlrYXQgbWl0IHZvcmluc3RhbGxpZXJ0ZW0gU2NobMO8c3NlbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IkRhdGVpIGF1c3fDpGhsZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJLZWluZSBEYXRlaSBhdXNnZXfDpGhsdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+Ilp1csO8Y2tzZXR6ZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iU2VuZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJGYXZvcml0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iQXV0b21vZHVzIGFrdGl2aWVydCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJadW0gQmVlbmRlbiBkZXMgQXV0b21vZHVzIGF1c3fDpGhsZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iVGV0aGVyaW5nIG9kZXIgSG90c3BvdCBha3RpdiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+Ilp1bSBLb25maWd1cmllcmVuIGJlcsO8aHJlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+Ilp1csO8Y2siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJXZWl0ZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiLDnGJlcnNwcmluZ2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iSG9oZSBNb2JpbGRhdGVubnV0enVuZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iV2VpdGVyZSBJbmZvcm1hdGlvbmVuIMO8YmVyIGRpZSBNb2JpbGRhdGVubnV0enVuZyBkdXJjaCBCZXLDvGhyZW4gYXVmcnVmZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+Ik1vYmlsZGF0ZW5saW1pdCDDvGJlcnNjaHJpdHRlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiJXZWl0ZXJlIEluZm9ybWF0aW9uZW4gw7xiZXIgZGllIE1vYmlsZGF0ZW5udXR6dW5nIGR1cmNoIEJlcsO8aHJlbiBhdWZydWZlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX21hdGNoZXMiIG1zZ2lkPSI4MTI5NDIxOTA4OTE1ODQwNzM3Ij4iS2VpbmUgw5xiZXJlaW5zdGltbXVuZ2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZmluZF9vbl9wYWdlIiBtc2dpZD0iMTk0Njc5OTIzMzgyMjgyMDM4NCI+IkF1ZiBTZWl0ZSBzdWNoZW4iPC9zdHJpbmc+CisgIDxwbHVyYWxzIG5hbWU9Im1hdGNoZXNfZm91bmQiPgorICAgIDxpdGVtIHF1YW50aXR5PSJvbmUiIG1zZ2lkPSI4MTY3MTQ3MDgxMTM2NTc5NDM5Ij4iMSDDnGJlcmVpbnN0aW1tdW5nIjwvaXRlbT4KKyAgICA8aXRlbSBxdWFudGl0eT0ib3RoZXIiIG1zZ2lkPSI0NjQxODcyNzk3MDY3NjA5MTc3Ij4iPHhsaWZmOmcgaWQ9IklOREVYIj4lZDwveGxpZmY6Zz4gdm9uIDx4bGlmZjpnIGlkPSJUT1RBTCI+JWQ8L3hsaWZmOmc+IjwvaXRlbT4KKyAgPC9wbHVyYWxzPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbAppbmRleCBhZTUxYzU1Li5lMmEwMWY0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKQEAgLTE2OSw4ICsxNjksNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSIzNDQ2MTY0NTg0NzEwNTk2NTEzIj4izpXPgc6zzrHOu861zq/OsSDOsc69zqzPgM+Ez4XOvs63z4IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSI5MDU2NDMxMTkzODkzODA5ODE0Ij4izpTPhc69zrHPhM+Mz4TOt8+EzrXPgiDPgM6/z4UgzrXOr869zrHOuSDOsc+AzrHPgc6xzq/PhM63z4TOtc+CIM68z4zOvc6/IM+DzrUgz4DPgc6/zrPPgc6xzrzOvM6xz4TOuc+Dz4TOrc+CIM61z4bOsc+BzrzOv86zz47OvS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfc3RvcmFnZSIgbXNnaWQ9IjE5NzExMTg3NzA1NDYzMzY5NjYiPiLOkc+Azr/OuM63zrrOtc+Fz4TOuc66z4zPgiDPh8+Oz4HOv8+CIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTIwMzMwMjIxNDkxNTM1NTc3NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjU0NTU4MDQzNTMyMjA1ODEzMTIiPiLOoM+Bz4zPg86yzrHPg863IM+Dz4TOt869IM66zqzPgc+EzrEgU0QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+Is6gz4HPjM+DzrLOsc+Dzrcgz4PPhM63zr0gzrrOrM+Bz4TOsSBTRC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4izqDPgc+Mz4POss6xz4POtyDPg8+EzrfOvSDOus6sz4HPhM6xIFNELiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyIiBtc2dpZD0iNzQxNzE5MjYyOTYwMTg5MDc5MSI+Is6xz4DOtc69zrXPgc6zzr/PgM6/zq/Ot8+Dzrcgzq4gz4TPgc6/z4DOv8+Azr/Or863z4POtyDOs8+BzrHOvM68zq7PgiDOus6xz4TOrM+Dz4TOsc+DzrfPgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3N0YXR1c0JhciIgbXNnaWQ9IjEzNjU0NzM1OTUzMzE5ODk3MzIiPiLOlc+AzrnPhM+Bzq3PgM61zrkgz4PPhM63zr0gzrXPhs6xz4HOvM6/zrPOriDOvc6xIM6xz4DOtc69zrXPgc6zzr/PgM6/zrnOtc6vIM+EzrcgzrPPgc6xzrzOvM6uIM66zrHPhM6sz4PPhM6xz4POt8+CIM6uIM69zrEgz4DPgc6/z4POuM6tz4TOtc65IM66zrHOuSDOvc6xIM6xz4bOsc65z4HOtc6vIM61zrnOus6/zr3Or860zrnOsSDPg8+Fz4PPhM6uzrzOsc+Ezr/Pgi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhclNlcnZpY2UiIG1zZ2lkPSI3MjQ3MjgxOTExMzg3OTMxNDg1Ij4izrPPgc6xzrzOvM6uIM66zrHPhM6sz4PPhM6xz4POt8+CIjwvc3RyaW5nPgpAQCAtMjY3LDggKzI2NiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2xlYXJBcHBDYWNoZSIgbXNnaWQ9Ijc3NDA0NjU2OTQxOTM2NzE0MDIiPiLOlc+AzrnPhM+Bzq3PgM61zrkgz4POtSDOvM65zrEgzrXPhs6xz4HOvM6/zrPOriDOvc6xIM6xz4XOvs6uz4POtc65IM+Ezr/OvSDOtc67zrXPjc64zrXPgc6/IM+Hz47Pgc6/IM6xz4DOv864zq7Ous61z4XPg863z4Igz4TOv8+FIM+EzrfOu861z4bPjs69zr/PhSDOtM65zrHOs8+BzqzPhs6/zr3PhM6xz4IgzrHPgc+HzrXOr86xIM6xz4DPjCDPhM6/zr0gzrrOsc+EzqzOu86/zrPOvyDPgM+Bzr/Pg8+Jz4HOuc69zq7PgiDOvM69zq7OvM63z4Igz4TOt8+CIM61z4bOsc+BzrzOv86zzq7Pgi4gzpcgz4DPgc+Mz4POss6xz4POtyDOtc6vzr3Osc65IM+Dz4XOvc6uzrjPic+CIM+Azr/Ou8+NIM+AzrXPgc65zr/Pgc65z4POvM6tzr3OtyDPg8+EzrcgzrTOuc6xzrTOuc66zrHPg86vzrEgz4PPhc+Dz4TOrs68zrHPhM6/z4IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9tb3ZlUGFja2FnZSIgbXNnaWQ9IjcyODQ1NDk3OTk0NjUwMzkyNiI+Is6czrXPhM6xzrrOr869zrfPg863IM+Az4zPgc+Jzr0gzrXPhs6xz4HOvM6/zrPOrs+CIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW92ZVBhY2thZ2UiIG1zZ2lkPSI2MzIzMDQ5MjkxOTIzOTI1Mjc3Ij4izpXPgM65z4TPgc6tz4DOtc65IM+DzrUgzrzOuc6xIM61z4bOsc+BzrzOv86zzq4gz4TOtyDOvM61z4TOsc66zq/Ovc63z4POtyDPgM+Mz4HPic69IM61z4bOsc+BzrzOv86zzq7PgiDOsc+Az4wgzq3Ovc6xIM61z4PPic+EzrXPgc65zrrPjCDPg861IM6tzr3OsSDOtc6+z4nPhM61z4HOuc66z4wgzrzOrc+Dzr8gzrrOsc65IM6xzr3PhM6vz4PPhM+Bzr/Phs6xLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ4MTE5MjE3MDM4ODI1MzIwNzAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZExvZ3MiIG1zZ2lkPSI2NjE1Nzc4NTQzMTk4OTY3NjE0Ij4izrHOvc6szrPOvc+Jz4POtyDOsc+Bz4fOtc6vz4nOvSDOus6xz4TOsc6zz4HOsc+Gzq7PgiDPg8+Fz4PPhM6uzrzOsc+Ezr/PgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIyNTc5Mzc5NTU1ODA0NzU5MDIgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+Is6Vz4DOuc+Ez4HOrc+AzrXOuSDPg861IM68zrnOsSDOtc+GzrHPgc68zr/Os86uIM69zrEgzrHOvc6xzrPOvc+Oz4POtc65IM+EzrEgzrHPgc+HzrXOr86xIM66zrHPhM6xzrPPgc6xz4bOrs+CIM+Ezr/PhSDPg8+Fz4PPhM6uzrzOsc+Ezr/Pgi4gzojPhM+DzrkgzrzPgM6/z4HOtc6vIM69zrEgzrHOvc6xzrrOsc67z43PiM61zrkgzrPOtc69zrnOus6tz4Igz4DOu863z4HOv8+Gzr/Pgc6vzrXPgiDPg8+HzrXPhM65zrrOrCDOvM61IM+EzrnPgiDOtM+BzrHPg8+EzrfPgc65z4zPhM63z4TOrc+CIM+DzrHPgiDPg8+Ezr8gz4TOt867zq3Phs+Jzr3Ovywgz4zOvM+Jz4IgzrTOtc69IM64zrEgz4DPgc6tz4DOtc65IM69zrEgz4DOtc+BzrnOrc+Hzr/Phc69IM+Az4HOv8+Dz4nPgM65zrrOrc+CIM6uIM65zrTOuc+Jz4TOuc66zq3PgiDPgM67zrfPgc6/z4bOv8+Bzq/Otc+CLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRMb2dzICg2NjE1Nzc4NTQzMTk4OTY3NjE0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRMb2dzICg4ODk2NDQ5NDM3NDY0ODY3NzY2KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaWFnbm9zdGljIiBtc2dpZD0iODA3Njc0Mzk1MzkwODAwMDM0MiI+Is6xzr3OrM6zzr3Pic+DzrcvzrXOs86zz4HOsc+Gzq4gz4POtSDPgM+Mz4HOv8+Fz4Igz4DOv8+FIM6xzr3Ors66zr/Phc69IM+Dz4TOvyDOtM65zrHOs869z4nPg8+EzrnOus+MIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlhZ25vc3RpYyIgbXNnaWQ9IjMxMjEyMzgzNzM5NTE2MzcwNDkiPiLOlc+AzrnPhM+Bzq3PgM61zrkgz4POtSDOvM65zrEgzrXPhs6xz4HOvM6/zrPOriDPhM63zr0gzrHOvc6szrPOvc+Jz4POtyDOus6xzrkgz4TOt869IM61zrPOs8+BzrHPhs6uIM+DzrUgz4DPjM+Bzr8gz4DOv8+FIM6xzr3Ors66zrXOuSDPg8+EzrfOvSDOv868zqzOtM6xIM60zrnOsc6zzr3Pic+Dz4TOuc66zr/PjSAoz4Auz4cuIM6xz4HPh861zq/OsSDPg8+Ezr/OvSDOus6xz4TOrM67zr/Os86/IC9kZXYpLiDOkc+Fz4TPjCDOtc69zrTOrc+HzrXPhM6xzrkgzr3OsSDOtc+AzrfPgc61zqzPg861zrkgz4TOt869IM+Dz4TOsc64zrXPgc+Mz4TOt8+EzrEgzrrOsc65IM+EzrfOvSDOsc+Dz4bOrM67zrXOuc6xIM+Ezr/PhSDPg8+Fz4PPhM6uzrzOsc+Ezr/Pgi4gzpjOsSDPgM+Bzq3PgM61zrkgzr3OsSDPh8+BzrfPg865zrzOv8+Azr/Ouc61zq/PhM6xzrkgzpzOn86dzp8gzrPOuc6xIM60zrnOsc6zzr3Pic+Dz4TOuc66zqwgz4XOu865zrrOv8+NIM+Ezr/PhSDOus6xz4TOsc+DzrrOtc+FzrHPg8+Ezq4gzq4gz4TOv8+FIM+HzrXOuc+BzrnPg8+Ezq4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VDb21wb25lbnRTdGF0ZSIgbXNnaWQ9Ijc5NDI1MTk4ODM0MzI5NDA2Ij4izrXOvc61z4HOs86/z4DOv86vzrfPg863IM6uIM6xz4DOtc69zrXPgc6zzr/PgM6/zq/Ot8+Dzrcgz4PPhM6/zrnPh861zq/Pic69IM61z4bOsc+BzrzOv86zzq7PgiI8L3N0cmluZz4KQEAgLTQwMywyMiArNDA0LDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aEFkbWluIiBtc2dpZD0iNzI1NjI4OTc3NDY2NzA1NDU1NSI+Is6Vz4DOuc+Ez4HOrc+AzrXOuSDPg861IM68zrnOsSDOtc+GzrHPgc68zr/Os86uIM+EzrcgzrTOuc6xzrzPjM+Bz4bPic+Dzrcgz4TOv8+FIM+Ezr/PgM65zrrOv8+NIM+EzrfOu861z4bPjs69zr/PhSBCbHVldG9vdGggzrrOsc65IM+EzrfOvSDOsc69zrHOus6szrvPhc+IzrcgzrrOsc65IM+Dz43Ots61z4XOvs63IM68zrUgzrHPgM6/zrzOsc66z4HPhc+DzrzOrc69zrXPgiDPg8+Fz4POus61z4XOrc+CLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYmx1ZXRvb3RoIiBtc2dpZD0iODM2MTAzODcwNzg1NzAxODczMiI+Is60zrfOvM65zr/Phc+BzrPOr86xIM+Dz4XOvc60zq3Pg861z4nOvSBCbHVldG9vdGgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGgiIG1zZ2lkPSI3NjI1MTUzODA2NzkzOTI5NDUiPiLOlc+AzrnPhM+Bzq3PgM61zrkgz4POtSDOvM65zrEgzrXPhs6xz4HOvM6/zrPOriDOvc6xIM+Az4HOv86yzqzOu861zrkgz4TOtyDOtM65zrHOvM+Mz4HPhs+Jz4POtyDPhM6/z4Ugz4TOv8+AzrnOus6/z40gz4TOt867zrXPhs+Ozr3Ov8+FIEJsdWV0b290aCDOus6xzrkgzrXPgM6vz4POt8+CIM69zrEgz4DPgc6xzrPOvM6xz4TOv8+Azr/Ouc61zq8gzrrOsc65IM69zrEgzrHPgM6/zrTOrc+HzrXPhM6xzrkgz4PPhc69zrTOrc+DzrXOuc+CIM68zrUgz4PPhc62zrXPhc6zzrzOrc69zrXPgiDPg8+Fz4POus61z4XOrc+CLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0FkbWluICgyMjUxMzAyMjMzMDEyMjUwMDU2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0FkbWluICgxOTM1ODQyNjExNDY0ODk1Nzg1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjUmF3ICg0NDIzNDcxNzExMTE0MzI1NzA4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY1JhdyAoNTUzMzAyMjczNjU1OTM4NTY2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY05vdGlmeSAoNDc4NDcwMzYwMDgyNzkyMzU4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY05vdGlmeSAoMjk5MDA1MzUxNzk2MjA3MDYxNykgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0xsY3AgKDQ5NzIwNTE0NjEwMDcwMzA0MjYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTGxjcCAoOTE1OTIxMjc3ODYwMDQ2NDApIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjQ5Nzc0MDYxNjQzMTE1MzUwOTIiPiLOsc+AzrXOvc61z4HOs86/z4DOv86vzrfPg863IM66zrvOtc65zrTPjs68zrHPhM6/z4Igz4DOu863zrrPhM+Bzr/Ou86/zrPOr86/z4UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSIzMTg5NzYzNDc5MzI2MzAyMDE3Ij4izpXPgM65z4TPgc6tz4DOtc65IM+DzrUgzrzOuc6xIM61z4bOsc+BzrzOv86zzq4gz4TOt869IM6xz4DOtc69zrXPgc6zzr/PgM6/zq/Ot8+Dzrcgz4TOv8+FIM66zrvOtc65zrTPjs68zrHPhM6/z4Igz4DOu863zrrPhM+Bzr/Ou86/zrPOr86/z4UgzrrOsc65IM6szrvOu863z4Igz4PPh861z4TOuc66zq7PgiDOsc+Dz4bOrM67zrXOuc6xz4IgzrzOtSDOus+JzrTOuc66z4wgz4DPgc+Mz4POss6xz4POt8+CLiDOk865zrEgz4DOsc+BzqzOtM61zrnOs868zrEsIM63IM6xz4DOtc69zrXPgc6zzr/PgM6/zq/Ot8+Dzrcgz4TOv8+FIM66zrvOtc65zrTPjs68zrHPhM6/z4Igz4DOu863zrrPhM+Bzr/Ou86/zrPOr86/z4Ugz4zPhM6xzr0gzrvOsc68zrLOrM69zrXPhM6xzrkgzrXOuc+DzrXPgc+Hz4zOvM61zr3OtyDPhM63zrvOtc+Gz4nOvc65zrrOriDOus67zq7Pg863IM66zrHOuSDOtyDOtc+AzrHOvc61zr3Otc+BzrPOv8+Azr/Or863z4POtyDPhM6/z4UgzrrOu861zrnOtM+OzrzOsc+Ezr/PgiDPgM67zrfOus+Ez4HOv867zr/Os86vzr/PhSDPjM+EzrHOvSDOtyDOus67zq7Pg863IM+EzrXPgc68zrHPhM65z4PPhM61zq8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkU3luY1NldHRpbmdzIiBtc2dpZD0iNjIwMTgxMDAwODIzMDUwMzA1MiI+Is6xzr3OrM6zzr3Pic+Dzrcgz4HPhc64zrzOr8+DzrXPic69IM+Dz4XOs8+Hz4HOv869zrnPg868zr/PjSI8L3N0cmluZz4KQEAgLTQzNSwyMiArNDIwLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9IjEwODI5NzI2MDM1NzYzNjA2OTAiPiLOlc+AzrnPhM+Bzq3PgM61zrkgz4POtSDOvM65zrEgzrXPhs6xz4HOvM6/zrPOriDOvc6xIM6xzr3Osc6zzr3Pjs+DzrXOuSDOuc60zrnPic+EzrnOus6tz4IgzrvOrc6+zrXOuc+CIM66zrHOuSDPhs+BzqzPg861zrnPgiDOus6xzrkgzrnOtM65z4nPhM65zrrOrCDOv869z4zOvM6xz4TOsSwgz4TOsSDOv8+Azr/Or86xIM6/IM+Hz4HOrs+Dz4TOt8+CIM61zr3OtM6tz4fOtc+EzrHOuSDOvc6xIM6tz4fOtc65IM6xz4DOv864zrfOus61z43Pg861zrkgz4PPhM6/IM67zrXOvs65zrrPjCDPh8+Bzq7Pg8+EzrcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI2NzAzMTA5NTExODM2MzQzMzQxIj4izrXOs86zz4HOsc+Gzq4gz4POtSDOus6xzrjOv8+BzrnPg868zq3Ovc6/IM6xz4DPjCDPhM6/zr0gz4fPgc6uz4PPhM63IM67zrXOvs65zrrPjCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyNDEyNTYyMDY1MjQwODI4ODAiPiLOlc+AzrnPhM+Bzq3PgM61zrkgz4POtSDOvM65zrEgzrXPhs6xz4HOvM6/zrPOriDPhM63zr0gzrXOs86zz4HOsc+Gzq4gzr3Orc+Jzr0gzrvOrc6+zrXPic69IM+Dz4TOvyDOu861zr7Ouc66z4wgz4fPgc6uz4PPhM63LiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDgwNzk0MDM3NTkwMDE3NzcyOTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iOTkzNzA3NDM2OTQxMDE2OTEzIj4iz4TPgc6/z4DOv8+Azr/Or863z4POty/OtM65zrHOs8+BzrHPhs6uIM+AzrXPgc65zrXPh86/zrzOrc69z4nOvSDOus6sz4HPhM6xz4IgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Is+Ez4HOv8+Azr/PgM6/zq/Ot8+DzrcvzrTOuc6xzrPPgc6xz4bOriDPgM61z4HOuc61z4fOv868zq3Ovc+Jzr0gzrrOrM+Bz4TOsc+CIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjY0Mzk2MzIwNDk3NjQ3MTg3OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDEzMTg3MTU0MTEyNzIxMTUyNiI+Is6Vz4DOuc+Ez4HOrc+AzrXOuSDPg8+EzrfOvSDOtc+GzrHPgc68zr/Os86uIM+EzrfOvSDOtc6zzrPPgc6xz4bOriDPg8+EzrfOvSDOus6sz4HPhM6xIFNELiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+Is6Vz4DOuc+Ez4HOrc+AzrXOuSDPg8+EzrfOvSDOtc+GzrHPgc68zr/Os86uIM+EzrfOvSDOtc6zzrPPgc6xz4bOriDPg8+EzrfOvSDOus6sz4HPhM6xIFNELiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iz4TPgc6/z4DOv8+Azr/Or863z4POty/OtM65zrHOs8+BzrHPhs6uIM+AzrXPgc65zrXPh86/zrzOrc69z4nOvSDOus6sz4HPhM6xz4IgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiLOlc+AzrnPhM+Bzq3PgM61zrkgz4PPhM63zr0gzrXPhs6xz4HOvM6/zrPOriDPhM63zr0gzrXOs86zz4HOsc+Gzq4gz4PPhM63zr0gzrrOrM+Bz4TOsSBTRC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSI1NjU2NDg3MjY0ODE5NjY5ODI0Ij4iz4DPgc+Mz4POss6xz4POtyDPg8+Ezr8gz4PPjc+Dz4TOt868zrEgzrHPgc+HzrXOr8+Jzr0gz4DPgc6/z4PPic+BzrnOvc6uz4IgzrzOvc6uzrzOt8+CIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjE2MjQ3MzQ1Mjg0MzU2NTk5MDYiPiLOlc+AzrnPhM+Bzq3PgM61zrkgz4POtSDOvM65zrEgzrXPhs6xz4HOvM6/zrPOriDPhM63zr0gzrHOvc6szrPOvc+Jz4POtyDOus6xzrkgz4TOt869IM61zrPOs8+BzrHPhs6uIM+Ezr/PhSDPg8+Fz4PPhM6uzrzOsc+Ezr/PgiDOsc+Bz4fOtc6vz4nOvSDPgM+Bzr/Pg8+Jz4HOuc69zq7PgiDOvM69zq7OvM63z4IuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDMwNzg2MTQ5NjMwMjg1MDIwMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0NDk3NDIwNzI4ODU3NTg1NzkxIj4izqDOtc+BzrnOv8+BzrnPg868z4zPgiDOtc+AzrnOu86/zrPPjs69IM66z4nOtM65zrrOv8+NIM+Az4HPjM+DzrLOsc+DzrfPgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE3MTk4NzcyNDU2OTIzMTgyOTkgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjkwODM0MDAwODA4NjE3MjgwNTYiPiLOoM61z4HOuc6/z4HOuc+DzrzPjM+CIM+Ez4nOvSDPhM+Nz4DPic69IM66z4nOtM65zrrOv8+NIM+Az4HPjM+DzrLOsc+DzrfPgiDPgM6/z4UgzrXPgM65z4TPgc6tz4DOtc+EzrHOuSDOvc6xIM+Hz4HOt8+DzrnOvM6/z4DOv865zrXOr8+EzrUuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzM3NDc4MDcxMjY2NDI4NTMyMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI5MTQxMzA2NDY5NDIxOTk1MDMiPiLOoM6xz4HOsc66zr/Ou86/z43OuM63z4POtyDPgM+Bzr/Pg8+AzrHOuM61zrnPjs69IM+Dz43Ovc60zrXPg863z4IiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxOTYxMjUxMTc5NjI0ODQzNDgzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSI3MjI3NTc4MjYwMTY1MTcyNjczIj4izqDOsc+BzrHOus6/zrvOv8+NzrjOt8+DzrcgzrHPgM6/z4TPhc+HzrfOvM6tzr3Pic69IM+Az4HOv8+Dz4DOsc64zrXOuc+Ozr0gz4PPjc69zrTOtc+DzrfPgiDOvM61IM+Ezrcgz4PPhc+DzrrOtc+Fzq4sIM6zzrnOsSDPhM63zr0gzrXOus+Ezq3Ou861z4POt8+CIM66zqzPgM6/zrnOsc+CIM61zr3Orc+BzrPOtc65zrHPgi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MDg0NzcyMDkwNzk3NDg1NDIwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjI2MjAwNzcxOTEyNDI2ODg5NTUiPiLOlc+AzrHOvc6xz4bOv8+BzqwgzrrPic60zrnOus6/z40gz4DPgc+Mz4POss6xz4POt8+CIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzMzMjE2NzYwMDMzMTc5OTk5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iNTM5MTI0MDYxNjk4MTI5NzM2MSI+Is6Vz4bOsc+BzrzOv86zzq4gz4TOv8+FIM66z4nOtM65zrrOv8+NIM+Az4HPjM+DzrLOsc+Dzq7PgiDPg86xz4Igz4POtSDOvM65zrEgzr3Orc6xIM+EzrnOvM6uLCDOvM61IM+EzrfOvSDPgM+Bzr/Pi8+Az4zOuM61z4POtyDPjM+Ezrkgz4POsc+CIM+AzrHPgc6tz4fOtc+EzrHOuSDOsc+Az4wgz4TOv869IM60zrnOsc+HzrXOuc+BzrnPg8+Ezq4gzrPOuc6xIM69zrEgzrzPgM6/z4HOtc6vz4TOtSDOvc6xIM+Dz4XOvc60zrXOuM61zq/PhM61LiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU3NjA0NjYwMjUyNDc2MzQ0ODggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSIyMjc0MDg1Mzg0NzA0MjQ4NDMxIj4izpXPhs6xz4HOvM6/zrPOriDOus67zrXOuc60z47OvM6xz4TOv8+CIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjgxOTg2ODY2NDk0NjA4OTc0MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSI1Njk2OTY0MTI2MjI2MDI4NDQyIj4izpXOu86tzrPPh861zrkgz4DPjM+EzrUgzrrOu861zrnOtM+Ozr3Otc65IM63IM+Dz4XPg866zrXPhc6uLCDOsc+AzrHOuc+Ez47Ovc+EzrHPgiDOus+JzrTOuc66z4wgz4DPgc+Mz4POss6xz4POt8+CIM6zzrnOsSDOtc+AzrHOvc61zq/Pg86/zrTOvy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQzMDc4NjE0OTYzMDI4NTAyMDEiPiLOoM61z4HOuc6/z4HOuc+DzrzPjM+CIM61z4DOuc67zr/Os8+Ozr0gzrrPic60zrnOus6/z40gz4DPgc+Mz4POss6xz4POt8+CIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iMTcxOTg3NzI0NTY5MjMxODI5OSI+Is6gzrXPgc65zr/Pgc65z4POvM+Mz4Igz4TPic69IM+Ez43PgM+Jzr0gzrrPic60zrnOus6/z40gz4DPgc+Mz4POss6xz4POt8+CIM+Azr/PhSDOtc+AzrnPhM+Bzq3PgM61z4TOsc65IM69zrEgz4fPgc63z4POuc68zr/PgM6/zrnOtc6vz4TOtS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjczNzQ3ODA3MTI2NjQyODUzMjEiPiLOoM6xz4HOsc66zr/Ou86/z43OuM63z4POtyDPgM+Bzr/Pg8+AzrHOuM61zrnPjs69IM+Dz43Ovc60zrXPg863z4IiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSIxOTYxMjUxMTc5NjI0ODQzNDgzIj4izqDOsc+BzrHOus6/zrvOv8+NzrjOt8+DzrcgzrHPgM6/z4TPhc+HzrfOvM6tzr3Pic69IM+Az4HOv8+Dz4DOsc64zrXOuc+Ozr0gz4PPjc69zrTOtc+DzrfPgiDOvM61IM+Ezrcgz4PPhc+DzrrOtc+Fzq4sIM6zzrnOsSDPhM63zr0gzrXOus+Ezq3Ou861z4POt8+CIM66zqzPgM6/zrnOsc+CIM61zr3Orc+BzrPOtc65zrHPgi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjkwODQ3NzIwOTA3OTc0ODU0MjAiPiLOlc+AzrHOvc6xz4bOv8+BzqwgzrrPic60zrnOus6/z40gz4DPgc+Mz4POss6xz4POt8+CIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iMzMzMjE2NzYwMDMzMTc5OTk5MSI+Is6Vz4bOsc+BzrzOv86zzq4gz4TOv8+FIM66z4nOtM65zrrOv8+NIM+Az4HPjM+DzrLOsc+Dzq7PgiDPg86xz4Igz4POtSDOvM65zrEgzr3Orc6xIM+EzrnOvM6uLCDOvM61IM+EzrfOvSDPgM+Bzr/Pi8+Az4zOuM61z4POtyDPjM+Ezrkgz4POsc+CIM+AzrHPgc6tz4fOtc+EzrHOuSDOsc+Az4wgz4TOv869IM60zrnOsc+HzrXOuc+BzrnPg8+Ezq4gzrPOuc6xIM69zrEgzrzPgM6/z4HOtc6vz4TOtSDOvc6xIM+Dz4XOvc60zrXOuM61zq/PhM61LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSI1NzYwNDY2MDI1MjQ3NjM0NDg4Ij4izpXPhs6xz4HOvM6/zrPOriDOus67zrXOuc60z47OvM6xz4TOv8+CIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4izpXOu86tzrPPh861zrkgz4DPjM+EzrUgzrrOu861zrnOtM+Ozr3Otc65IM63IM+Dz4XPg866zrXPhc6uLCDOsc+AzrHOuc+Ez47Ovc+EzrHPgiDOus+JzrTOuc66z4wgz4DPgc+Mz4POss6xz4POt8+CIM6zzrnOsSDOtc+AzrHOvc61zq/Pg86/zrTOvy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4izpTOuc6xzrPPgc6xz4bOriDPjM67z4nOvSDPhM+Jzr0gzrTOtc60zr/OvM6tzr3Pic69Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjMxNDA2MDkzMzc5NjM5NjIwNSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9Ijc2Njk4OTUzMzM4MTQyMjI1ODYiPiLOoM+BzrHOs868zrHPhM6/z4DOv865zrXOr8+EzrHOuSDOtc+AzrHOvc6xz4bOv8+BzqwgzrXPgc6zzr/Pg8+EzrHPg865zrHOus+Ozr0gz4HPhc64zrzOr8+DzrXPic69LCDOvM61IM+EzrcgzrTOuc6xzrPPgc6xz4bOriDPjM67z4nOvSDPhM+Jzr0gzrTOtc60zr/OvM6tzr3Pic69IM+DzrHPgiDPh8+Jz4HOr8+CIM61z4DOuc6yzrXOss6xzq/Pic+DzrcuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiLOoM+BzrHOs868zrHPhM6/z4DOv865zrXOr8+EzrHOuSDOtc+AzrHOvc6xz4bOv8+BzqwgzrXPgc6zzr/Pg8+EzrHPg865zrHOus+Ozr0gz4HPhc64zrzOr8+DzrXPic69LCDOvM61IM+EzrcgzrTOuc6xzrPPgc6xz4bOriDPjM67z4nOvSDPhM+Jzr0gzrTOtc60zr/OvM6tzr3Pic69IM+DzrHPgiDPh8+Jz4HOr8+CIM61z4DOuc6yzrXOss6xzq/Pic+DzrcuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkiIG1zZ2lkPSI2Mzg3NDk3NDY2NjYwMTU0OTMxIj4izp/Pgc6vz4PPhM61IM+Ezrcgz4fPgc6uz4POtyDPhM6/z4UgzrPOtc69zrnOus6/z40gzrTOuc6xzrrOv868zrnPg8+Ezq4gzrzOtc+Dzr/Ou86szrLOt8+DzrfPgiDPhM63z4Igz4PPhc+DzrrOtc+Fzq7PgiDPjM+EzrHOvSDOtc6vzr3Osc65IM61zr3Otc+BzrPOv8+Azr/Ouc63zrzOrc69zrcgzrcgz4DOv867zrnPhM65zrrOri4gzpzPjM69zr8gzr8gzrTOuc6xz4fOtc65z4HOuc+Dz4TOrs+CIM+EzrfPgiDPgM+Bz47PhM63z4Igz4PPhc+DzrrOtc+Fzq7PgiDOv8+Bzq/Ots61zrkgz4TOv869IM65z4PPh8+Nzr/Ovc+EzrEgzrPOtc69zrnOus+MIM60zrnOsc66zr/OvM65z4PPhM6uIM68zrXPg86/zrvOrM6yzrfPg863z4IuIjwvc3RyaW5nPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4izp/Ouc66zq/OsSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Is6azrnOvc63z4TPjCI8L2l0ZW0+CkBAIC01NTIsMTAgKzUzOCw5IEBACiAgICAgPHNraXAgLz4KICAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZU90aGVyICg0NDA4NDM2MTYyOTUwMTE5ODQ5KSAtLT4KICAgICA8c2tpcCAvPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+Is68zq3Pg8+JIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gzrzOrc+Dz4kgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiLOoM67zrfOus+Ez4HOv867zr/Os86uz4PPhM61IM+Ezr/OvSDOus+JzrTOuc66z4wgzrHPgc65zrjOvM+MIFBJTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4izpXOuc+DzrHOs86szrPOtc+EzrUgz4TOv869IM66z4nOtM65zrrPjCDPgM+Bz4zPg86yzrHPg863z4IgzrPOuc6xIM6+zrXOus67zrXOr860z4nOvM6xIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiLOlc65z4POsc6zzqzOs861z4TOtSDPhM6/IFBJTiDOs865zrEgzr7Otc66zrvOtc6vzrTPic68zrEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiLOlc+Dz4bOsc67zrzOrc69zr/PgiDOus+JzrTOuc66z4zPgiDOsc+BzrnOuM68z4zPgiBQSU4hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+Is6TzrnOsSDOvs61zrrOu861zq/OtM+JzrzOsSwgz4DOsc+Ezq7Pg8+EzrUgz4TOvyDPgM67zq7Ous+Ez4HOvyBNZW51IM66zrHOuSwgz4PPhM63IM+Dz4XOvc6tz4fOtc65zrEsIM+Ezr8gz4DOu86uzrrPhM+Bzr8gMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4izpHPgc65zrjOvM+Mz4Igzq3Ous+EzrHOus+EzrfPgiDOsc69zqzOs866zrfPgiI8L3N0cmluZz4KQEAgLTU2OCw2ICs1NTMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiLOlc+AzrnPg8+Ez4HOv8+Gzq4gz4PPhM63zr0gzrrOu86uz4POtyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+Is6jz4nPg8+Ez4whIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+Is6gz4HOv8+Dz4DOsc64zq7Pg8+EzrUgzrHPgc6zz4zPhM61z4HOsSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4izqDPgc6/z4PPgM6xzrjOrs+Dz4TOtSDOsc+BzrPPjM+EzrXPgc6xIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4izqbPjM+Bz4TOuc+DzrcgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+Is6mzr/Pgc+Ezq/Pg8+EzrfOus61LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTgyLDcgKzU2OCw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiLOlyDOus6sz4HPhM6xIFNJTSDOtc6vzr3Osc65IM66zrvOtc65zrTPic68zq3Ovc63LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+Is6ezrXOus67zrXOr860z4nOvM6xIM66zqzPgc+EzrHPgiBTSU0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiLOo8+HzrXOtM65zqzPg86xz4TOtSDOtc+Dz4bOsc67zrzOrc69zrEgz4TOvyDOvM6/z4TOr86yzr8gzr7Otc66zrvOtc65zrTPjs68zrHPhM6/z4I8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiDPhs6/z4HOrc+CLiAiXG5cbiLOoM+Bzr/Pg8+AzrHOuM6uz4PPhM61IM6+zrHOvc6sIM+DzrUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gzrTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4izqPPh861zrTOuc6sz4POsc+EzrUgz4TOvyDOvM6/z4TOr86yzr8gzr7Otc66zrvOtc65zrTPjs68zrHPhM6/z4IgzrXPg8+GzrHOu868zq3Ovc6xIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IM+Gzr/Pgc6tz4IuIM6czrXPhM6sIM6xz4DPjCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDOsc69zrXPgM65z4TPhc+HzrXOr8+CIM+Az4HOv8+Dz4DOrM64zrXOuc61z4IgzrHOus+MzrzOtywgzrjOsSDPg86xz4IgzrbOt8+EzrfOuM61zq8gzr3OsSDOvs61zrrOu861zrnOtM+Oz4POtc+EzrUgz4TOvyDPhM63zrvOrc+Gz4nOvc+MIM+DzrHPgiDOvM61IM+Ezrcgz4fPgc6uz4POtyDPhM63z4Igz4PPjc69zrTOtc+Dzq7PgiDPg86xz4IgR29vZ2xlLiJcblxuIiDOoM+Bzr/Pg8+AzrHOuM6uz4PPhM61IM6+zrHOvc6sIM+DzrUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gzrTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+Is6azrHPhM6xz4fPic+Bzq/Pg86xz4TOtSDOtc+Dz4bOsc67zrzOrc69zrEgz4TOv869IM66z4nOtM65zrrPjCDPgM+Bz4zPg86yzrHPg863z4IgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gz4bOv8+Bzq3Pgi4gIlxuXG4izqDPgc6/z4PPgM6xzrjOrs+Dz4TOtSDOvs6xzr3OrCDPg861IDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IM60zrXPhc+EzrXPgc+MzrvOtc+Az4TOsS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4izprOsc+EzrHPh8+Jz4HOr8+DzrHPhM61IM61z4PPhs6xzrvOvM6tzr3OsSDPhM6/IFBJTiDPg86xz4I8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiDPhs6/z4HOrc+CLiAiXG5cbiLOoM+Bzr/Pg8+AzrHOuM6uz4PPhM61IM6+zrHOvc6sIM+DzrUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gzrTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4izqPPh861zrTOuc6sz4POsc+EzrUgz4TOvyDOvM6/z4TOr86yzr8gzr7Otc66zrvOtc65zrTPjs68zrHPhM6/z4IgzrXPg8+GzrHOu868zq3Ovc6xIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IM+Gzr/Pgc6tz4IuIM6czrXPhM6sIM6xz4DPjCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDOsc69zrXPgM65z4TPhc+HzrXOr8+CIM+Az4HOv8+Dz4DOrM64zrXOuc61z4IgzrHOus+MzrzOtywgzrjOsSDPg86xz4IgzrbOt8+EzrfOuM61zq8gzr3OsSDOvs61zrrOu861zrnOtM+Oz4POtc+EzrUgz4TOvyDPhM63zrvOrc+Gz4nOvc+MIM+DzrHPgiDOvM61IM+Ezrcgz4fPgc6uz4POtyDPhM63z4Igz4PPjc69zrTOtc+Dzq7PgiDPg86xz4IgR29vZ2xlLiJcblxuIiDOoM+Bzr/Pg8+AzrHOuM6uz4PPhM61IM6+zrHOvc6sIM+DzrUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gXG7OtM61z4XPhM61z4HPjM67zrXPgM+EzrEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+Is6gz4HOv8+Dz4DOsc64zq7Pg8+EzrUgzr7Osc69zqwgz4POtSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gzrTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4izp7Otc+HzqzPg86xz4TOtSDPhM6/IM68zr/PhM6vzrLOvzsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2dsb2dpbl9mb3Jnb3RfcGF0dGVybiIgbXNnaWQ9IjI1ODg1MjE1MDExNjYwMzI3NDciPiLOns61zrrOu861zq/OtM+JzrzOsSDOu86/zrPOsc+BzrnOsc+DzrzOv8+NIjwvc3RyaW5nPgpAQCAtNjEwLDE0ICs1OTgsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ19iZWZvcmVfdW5sb2FkIiBtc2dpZD0iMTkwMTY3NTQ0ODE3OTY1MzA4OSI+Is6Rz4DOv868zqzOus+Bz4XOvc+DzrcgzrHPgM+MIM6xz4XPhM6uIM+Ezrcgz4POtc67zq/OtM6xOyJcblxuIjx4bGlmZjpnIGlkPSJNRVNTQUdFIj4lczwveGxpZmY6Zz4iXG5cbiLOlc+AzrnOu86tzr7PhM61IE9LIM6zzrnOsSDPg8+Fzr3Orc+HzrXOuc6xLCDOriDOkc66z43Pgc+Jz4POtyDOs865zrEgz4DOsc+BzrHOvM6/zr3OriDPg8+EzrfOvSDPhM+Bzq3Ph86/z4XPg86xIM+DzrXOu86vzrTOsS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX2xhYmVsIiBtc2dpZD0iNjg2MDI2MTc1ODY2NTgyNTA2OSI+Is6Vz4DOuc6yzrXOss6xzq/Pic+DzrciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkb3VibGVfdGFwX3RvYXN0IiBtc2dpZD0iMTA2ODIxNjkzNzI0NDU2NzI0NyI+Is6jz4XOvM6yzr/Phc67zq46IM60zrnPgM67z4wgzqzOs86zzrnOs868zrEgzrPOuc6xIM68zrXOs86tzrjPhc69z4POtyDOus6xzrkgz4POvM6vzrrPgc+Fzr3Pg863LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvZmlsbF90aGlzX2Zvcm0gKDg5NDAxMTA4NjY3NzUwOTc0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iMTI4NDg0MzcyODIwMzQxMjEzNSI+Is6xzr3OrM6zzr3Pic+DzrcgzrnPg8+Ezr/Pgc65zrrOv8+NIM66zrHOuSDPg861zrvOuc60zr/OtM61zrnOus+Ez47OvSDPgM+Bzr/Os8+BzqzOvM68zrHPhM6/z4Igz4DOtc+BzrnOrs6zzrfPg863z4IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjQ5ODE0ODk4MTU0Njc2MTcxOTEiPiLOlc+AzrnPhM+Bzq3PgM61zrkgz4PPhM63zr0gzrXPhs6xz4HOvM6/zrPOriDPhM63zr0gzrHOvc6szrPOvc+Jz4POtyDPjM67z4nOvSDPhM+Jzr0gzrTOuc61z4XOuM+Nzr3Pg861z4nOvSBVUkwgz4DOv8+FIM+Ezr8gz4DPgc+MzrPPgc6xzrzOvM6xIM+AzrXPgc65zq7Os863z4POt8+CIM6tz4fOtc65IM61z4DOuc+DzrrOtc+GzrjOtc6vIM66zrHOuSDPjM67z4nOvSDPhM+Jzr0gz4POtc67zrnOtM6/zrTOtc65zrrPhM+Ozr0gz4TOv8+FIM+Az4HOv86zz4HOrM68zrzOsc+Ezr/PgiDPgM61z4HOuc6uzrPOt8+DzrfPgi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjkwMDk0MzQxMDk4MzYyODAzNzQiPiLOtc6zzrPPgc6xz4bOriDOuc+Dz4TOv8+BzrnOus6/z40gzrrOsc65IM+DzrXOu865zrTOv860zrXOuc66z4TPjs69IM+Az4HOv86zz4HOrM68zrzOsc+Ezr/PgiDPgM61z4HOuc6uzrPOt8+DzrfPgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9Ijk0NTU3MTk5MDM1NzExNDk1MCI+Is6Vz4DOuc+Ez4HOrc+AzrXOuSDPg861IM68zrnOsSDOtc+GzrHPgc68zr/Os86uIM69zrEgz4TPgc6/z4DOv8+Azr/Ouc6uz4POtc65IM+Ezr8gzrnPg8+Ezr/Pgc65zrrPjCDOriDPhM6/z4XPgiDPg861zrvOuc60zr/OtM61zq/Ous+EzrXPgiDPhM6/z4Ugz4DPgc6/zrPPgc6szrzOvM6xz4TOv8+CIM+AzrXPgc65zq7Os863z4POt8+CIM+Azr/PhSDOss+Bzq/Pg866zr/Ovc+EzrHOuSDOsc+Azr/OuM63zrrOtc+FzrzOrc69zrEgz4PPhM6/IM+EzrfOu86tz4bPic69z4wgz4POsc+CLiDOms6xzrrPjM6yzr/Phc67zrXPgiDOtc+GzrHPgc68zr/Os86tz4IgzrzPgM6/z4HOv8+Nzr0gzr3OsSDPhM6/IM+Hz4HOt8+DzrnOvM6/z4DOv865zq7Pg86/z4XOvSDOs865zrEgzr3OsSDOtM65zrHOs8+BzqzPiM6/z4XOvSDOriDOvc6xIM+Ez4HOv8+Azr/PgM6/zrnOrs+Dzr/Phc69IM+EzrEgzrTOtc60zr/OvM6tzr3OsSDPhM6/z4Ugz4DPgc6/zrPPgc6szrzOvM6xz4TOv8+CIM+AzrXPgc65zq7Os863z4POt8+CLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldEFsYXJtICg1OTI0NDAxMzI4ODAzNjE1MTY1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldEFsYXJtICg1OTY2OTY2NTk4MTQ5ODc1MDgyKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0NzE1MjEyNjU1NTk4Mjc1NTMyIj4izqTPgc6/z4DOv8+Azr/Or863z4POtyDOtM65zrrOsc65z4nOvM6sz4TPic69IM6zzrXPic6zz4HOsc+GzrnOus6uz4IgzrjOrc+DzrfPgiDPgM+Bzr/Os8+BzqzOvM68zrHPhM6/z4Igz4DOtc+BzrnOrs6zzrfPg863z4IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0MDExOTA4MjgyOTgwODYxNjc5Ij4izpXPgM65z4TPgc6tz4DOtc65IM+DzrUgzrzOuc6xIM61z4bOsc+BzrzOv86zzq4gz4TOt869IM+Ez4HOv8+Azr/PgM6/zq/Ot8+Dzrcgz4TPic69IM60zrnOus6xzrnPic68zqzPhM+Jzr0gzrPOtc+JzrPPgc6xz4bOuc66zq7PgiDOuM6tz4POt8+CIM+Ezr/PhSDPgM+Bzr/Os8+BzqzOvM68zrHPhM6/z4Igz4DOtc+BzrnOrs6zzrfPg863z4IuIM6fzrkgzrrOsc66z4zOss6/z4XOu861z4IgzrXPhs6xz4HOvM6/zrPOrc+CIM68z4DOv8+Bzr/Pjc69IM69zrEgz4TOvyDPh8+BzrfPg865zrzOv8+Azr/Ouc6uz4POv8+Fzr0gzrPOuc6xIM69zrEgzrXPgM65z4TPgc6tz4jOv8+Fzr0gz4TOt869IM6xz4DOv8+Dz4TOv867zq4gz4PPhM6/zrnPh861zq/Pic69IM+Ezr/PgM6/zrjOtc+Dzq/Osc+CIM+DzrUgzrHPhc64zrHOr8+BzrXPhM6/z4XPgiDOuc+Dz4TPjM+Ezr/PgM6/z4XPgi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiLOmM6tzrvOtc+EzrUgz4TOvyDPgM+Bz4zOs8+BzrHOvM68zrEgz4DOtc+BzrnOrs6zzrfPg863z4Igzr3OsSDOtM65zrHPhM63z4HOrs+DzrXOuSDOsc+Fz4TPjM69IM+Ezr/OvSDOus+JzrTOuc66z4wgz4DPgc+Mz4POss6xz4POt8+COyI8L3N0cmluZz4KQEAgLTczMCwxNCArNzE2LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4izpXPgM65zrvOv86zzq4gz4zOu8+Jzr0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+Is6Vz4DOuc67zr/Os86uIM67zq3Ovs63z4IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4izpHPgM6/zrrOv8+Azq4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+Is6Rzr3PhM65zrPPgc6xz4bOriI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+Is6Vz4DOuc66z4zOu867zrfPg863Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiLOkc69z4TOuc6zz4HOsc+Gzq4gzrTOuc61z43OuM+Fzr3Pg863z4IgVVJMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIG1zZ2lkPSI2NzM4NTU2MzQ4ODYxMzQ3MjQwIj4izpXPgM65zrvOv86zzq4gzrrOtc65zrzOrc69zr/PhS4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRleHRTZWxlY3Rpb25DQUJUaXRsZSIgbXNnaWQ9IjUyMzY4NTAzOTQzNzA4MjAzNTciPiLOlc+AzrnOu86/zrPOriDOus61zrnOvM6tzr3Ov8+FIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4izpzOrc64zr/OtM6/z4IgzrXOuc+Dz4zOtM6/z4UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4izqDPgc6/z4POuM6uzrrOtyDPhM63z4IgzrvOrc6+zrfPgiBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiDPg8+Ezr8gzrvOtc6+zrnOus+MIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4izpXPgM61zr7Otc+BzrPOsc+Dzq/OsSDOus61zrnOvM6tzr3Ov8+FIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSI0OTA5MTM1NTY0OTQxODE1NDk0Ij4izpXOvc6tz4HOs861zrnOtc+CIM66zrXOuc68zq3Ovc6/z4UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+Is6Rz4DOv868zq3Ovc61zrkgzrvOr86zzr/PgiDOtc67zrXPjc64zrXPgc6/z4Igz4fPjs+Bzr/PgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+Is6Iz4fOtc65IM6xz4DOv868zrXOr869zrXOuSDOu86vzrPOv8+CIM61zrvOtc+NzrjOtc+Bzr/PgiDOsc+Azr/OuM63zrrOtc+Fz4TOuc66z4zPgiDPh8+Oz4HOv8+CIM+Dz4TOvyDPhM63zrvOrc+Gz4nOvc6/LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzQ1LDYgKzczMSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiLOkc66z43Pgc+Jz4POtyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiLOoM+Bzr/Pg86/z4fOriI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4izqbPjM+Bz4TPic+DzrcuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+Is6Vzr3Otc+BzrPOv8+Azr/Ouc63zrzOrc69zr8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiLOkc+AzrXOvc61z4HOs86/z4DOv86vzrfPg863Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiLOn867zr/Ous67zq7Pgc+Jz4POtyDOtc69zq3Pgc6zzrXOuc6xz4IgzrzOtSDPhM63IM+Hz4HOrs+DzrciPC9zdHJpbmc+CkBAIC03NjMsOSArNzUwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiLOkc69zrHOs866zrHPg8+EzrnOus+MIM66zrvOtc6vz4POuc68zr8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBvcnQiIG1zZ2lkPSI0MDYwMjE4MjYwOTg0Nzk1NzA2Ij4izpHOvc6xz4bOv8+BzqwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3YWl0IiBtc2dpZD0iNzE0NzExODIxNzIyNjMxNzczMiI+Is6Rzr3Osc68zr/Ovc6uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4izpHOvc6xzrrOsc+EzrXPjc64z4XOvc+DzrcgzrXPhs6xz4HOvM6/zrPOrs+CIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiLOlyDOtc+GzrHPgc68zr/Os86uIDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gzrXOus+EzrXOu861zq/PhM6xzrkgz4TPjs+BzrEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiLOiM6zzrnOvc61IM61zrrOus6vzr3Ot8+Dzrcgz4DPgc+Oz4TOsSDPhM63z4IgzrXPhs6xz4HOvM6/zrPOrs+CIDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3RpdGxlICg4MzIzNzYxNjE2MDUyMTIxOTM2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3JlcGxhY2UgKDYyMDI0OTg5NDk5NzAyODE0MTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwgKDE4ODEwMjAyMzAyMTY2ODY4MykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+Is6XIM61z4bOsc+BzrzOv86zzq4gPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAozrTOuc61z4HOs86xz4POr86xIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgz4DOsc+BzrHOss6vzrHPg861IM+EzrfOvSDOsc+Fz4TOv861z4DOuc6yzrHOu8+MzrzOtc69zrcgz4DOv867zrnPhM65zrrOriBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+Is6XIM60zrnOtc+BzrPOsc+Dzq/OsSA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gz4DOsc+BzrHOss6vzrHPg861IM+EzrfOvSDOsc+Fz4TOv861z4DOuc6yzrHOu8+MzrzOtc69zrcgz4DOv867zrnPhM65zrrOriBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4izpcgzrXPhs6xz4HOvM6/zrPOriA8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiDOtc66z4TOtc67zrXOr8+EzrHOuSI8L3N0cmluZz4KQEAgLTgxMiwyOCArODAyLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtc19zaG93X2FsbCIgbXNnaWQ9IjI2NzE3OTExNjM5MzMwOTExODAiPjxiPiLOlc68z4bOrM69zrnPg863IM+MzrvPic69IjwvYj48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2FjdGl2aXR5X3RpdGxlIiBtc2dpZD0iMjM5OTI4OTk5OTYwODkwMDQ0MyI+Is6czrHOts65zrrOriDOsc+Azr/OuM6uzrrOtc+Fz4POtyBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV90aXRsZSIgbXNnaWQ9IjU5MDE0NTkwNDEzOTg3NTE0OTUiPiLOpM6/IFVTQiDOtc6vzr3Osc65IM+Dz4XOvc60zrXOtM61zrzOrc69zr8iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0Nzk2NzU5NjQ2MTY3MjQ3MTc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjgyMzE0NjI3NTAwMTAwNjY4OTYiPiLOo8+Fzr3OtM6tz4POsc+EzrUgz4TOvyDPhM63zrvOrc+Gz4nOvc+MIM+DzrHPgiDPg8+Ezr/OvSDPhc+Azr/Ou86/zrPOuc+Dz4TOriDOvM6tz4PPiSBVU0IuIM6Vz4DOuc67zq3Ovs+EzrUgz4TOvyDPgM6xz4HOsc66zqzPhM+JIM66zr/Phc68z4DOryDOsc69IM64zq3Ou861z4TOtSDOvc6xIM6xzr3PhM65zrPPgc6sz4jOtc+EzrUgzrHPgc+HzrXOr86xIM68zrXPhM6xzr7PjSDPhM6/z4Ugz4XPgM6/zrvOv86zzrnPg8+Ezq4gzrrOsc65IM+EzrfPgiDOus6sz4HPhM6xz4IgU0Qgz4TOv8+FIEFuZHJvaWQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiLOo8+Fzr3OtM6tz4POsc+EzrUgz4TOvyDPhM63zrvOrc+Gz4nOvc+MIM+DzrHPgiDPg8+Ezr/OvSDPhc+Azr/Ou86/zrPOuc+Dz4TOriDOvM6tz4PPiSBVU0IuIM6Vz4DOuc67zq3Ovs+EzrUgz4TOvyDPgM6xz4HOsc66zqzPhM+JIM66zr/Phc68z4DOryDOsc69IM64zq3Ou861z4TOtSDOvc6xIM6xzr3PhM65zrPPgc6sz4jOtc+EzrUgzrHPgc+HzrXOr86xIM68zrXPhM6xzr7PjSDPhM6/z4Ugz4XPgM6/zrvOv86zzrnPg8+Ezq4gzrrOsc65IM+EzrfPgiDOus6sz4HPhM6xz4IgU0Qgz4TOv8+FIEFuZHJvaWQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiLOo8+Fzr3OtM6tz4POsc+EzrUgz4TOvyDPhM63zrvOrc+Gz4nOvc+MIM+DzrHPgiDPg8+Ezr/OvSDPhc+Azr/Ou86/zrPOuc+Dz4TOriDOvM6tz4PPiSBVU0IuIM6Vz4DOuc67zq3Ovs+EzrUgz4TOvyDPgM6xz4HOsc66zqzPhM+JIM66zr/Phc68z4DOryDOsc69IM64zq3Ou861z4TOtSDOvc6xIM6xzr3PhM65zrPPgc6sz4jOtc+EzrUgzrHPgc+HzrXOr86xIM68zrXPhM6xzr7PjSDPhM6/z4Ugz4XPgM6/zrvOv86zzrnPg8+Ezq4gzrrOsc65IM+EzrfPgiDOus6sz4HPhM6xz4IgU0Qgz4TOv8+FIEFuZHJvaWQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYnV0dG9uX21vdW50IiBtc2dpZD0iMTA1MjI1OTkzMDM2OTUwODIzNSI+Is6Vzr3Otc+BzrPOv8+Azr/Or863z4POtyDOsc+Azr/OuM63zrrOtc+Fz4TOuc66zr/PjSDPh8+Oz4HOv8+FIFVTQiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI1MzQ3ODQ3NTE2MDMzNDUzNjMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDgxODM0Nzc1NjQwMjc0MDI2MSI+Is6gzrHPgc6/z4XPg865zqzPg8+EzrfOus61IM6tzr3OsSDPgM+Bz4zOss67zrfOvM6xIM+Dz4TOtyDPh8+Bzq7Pg863IM+EzrfPgiDOus6sz4HPhM6xz4IgU0Qgz4nPgiDOsc+Azr/OuM63zrrOtc+Fz4TOuc66z4wgz4fPjs+Bzr8gVVNCLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4izqDOsc+Bzr/Phc+DzrnOrM+Dz4TOt866zrUgzq3Ovc6xIM+Az4HPjM6yzrvOt868zrEgz4PPhM63IM+Hz4HOrs+Dzrcgz4TOt8+CIM66zqzPgc+EzrHPgiBTRCDPic+CIM6xz4DOv864zrfOus61z4XPhM65zrrPjCDPh8+Oz4HOvyBVU0IuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiLOoM6xz4HOv8+Fz4POuc6sz4PPhM63zrrOtSDOrc69zrEgz4DPgc+MzrLOu863zrzOsSDPg8+Ezrcgz4fPgc6uz4POtyDPhM63z4IgzrrOrM+Bz4TOsc+CIFNEIM+Jz4IgzrHPgM6/zrjOt866zrXPhc+EzrnOus+MIM+Hz47Pgc6/IFVTQi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4MTc1ODkyNTU0NzU3MjE2NTI1Ij4izqTOvyBVU0IgzrXOr869zrHOuSDPg8+Fzr3OtM61zrTOtc68zq3Ovc6/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MzgwMDgyNDA0Mjg4MjE5MzQxIj4izpXPgM65zrvOrc6+z4TOtSDOs865zrEgzrHOvc+EzrnOs8+BzrHPhs6uIM+Az4HOv8+CL86xz4DPjCDPhM6/zr0gz4XPgM6/zrvOv86zzrnPg8+Ezq4gz4POsc+CLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMjMzNjA1ODM5NjY2MzUxNjAxNyI+Is6Rz4DOtc69zrXPgc6zzr/PgM6/zq/Ot8+DzrcgzrHPgM6/zrjOt866zrXPhc+EzrnOus6/z40gz4fPjs+Bzr/PhSBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjU5MTgxMzQ5MDI2OTg0MTUzOSI+Is6Vz4DOuc67zr/Os86uIM6zzrnOsSDOsc+AzrXOvc61z4HOs86/z4DOv86vzrfPg863IM6xz4DOv864zrfOus61z4XPhM65zrrOv8+NIM+Hz47Pgc6/z4UgVVNCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfdGl0bGUiIG1zZ2lkPSI2NjAxMjk4NTE3MDg3NzU4NTMiPiLOp8+Oz4HOv8+CIM6xz4DOv864zq7Ous61z4XPg863z4IgVVNCIM+DzrUgz4fPgc6uz4POtyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MTM3MTMzOTY0MjY2MDQxMDQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NzQ1MzQ1MjYwNzgwMjY3MTg1Ij4izqDPgc6/z4TOv8+NIM6xz4DOtc69zrXPgc6zzr/PgM6/zrnOrs+DzrXPhM61IM+Ezr8gz4fPjs+Bzr8gzrHPgM6/zrjOrs66zrXPhc+DzrfPgiBVU0IsIM6yzrXOss6xzrnPic64zrXOr8+EzrUgz4zPhM65IM6tz4fOtc+EzrUgzrHPgM6/z4PPhc69zrTOrc+DzrXOuSAo4oCczrHPhs6xzrnPgc6tz4POtc654oCdKSDPhM63zr0gzrrOrM+Bz4TOsSBTRCDPhM6/z4UgQW5kcm9pZCDOsc+Az4wgz4TOv869IM+Fz4DOv867zr/Os865z4PPhM6uIM+DzrHPgi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4izqDPgc6/z4TOv8+NIM6xz4DOtc69zrXPgc6zzr/PgM6/zrnOrs+DzrXPhM61IM+Ezr8gz4fPjs+Bzr8gzrHPgM6/zrjOrs66zrXPhc+DzrfPgiBVU0IsIM6yzrXOss6xzrnPic64zrXOr8+EzrUgz4zPhM65IM6tz4fOtc+EzrUgzrHPgM6/z4PPhc69zrTOrc+DzrXOuSAo4oCczrHPhs6xzrnPgc6tz4POtc654oCdKSDPhM63zr0gzrrOrM+Bz4TOsSBTRCDPhM6/z4UgQW5kcm9pZCDOsc+Az4wgz4TOv869IM+Fz4DOv867zr/Os865z4PPhM6uIM+DzrHPgi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4izqDPgc6/z4TOv8+NIM6xz4DOtc69zrXPgc6zzr/PgM6/zrnOrs+DzrXPhM61IM+Ezr8gz4fPjs+Bzr8gzrHPgM6/zrjOrs66zrXPhc+DzrfPgiBVU0IsIM6yzrXOss6xzrnPic64zrXOr8+EzrUgz4zPhM65IM6tz4fOtc+EzrUgzrHPgM6/z4PPhc69zrTOrc+DzrXOuSAo4oCczrHPhs6xzrnPgc6tz4POtc654oCdKSDPhM63zr0gzrrOrM+Bz4TOsSBTRCDPhM6/z4UgQW5kcm9pZCDOsc+Az4wgz4TOv869IM+Fz4DOv867zr/Os865z4PPhM6uIM+DzrHPgi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjcwNjAyMTgwMzQ5MDA2OTYwMjkiPiLOkc+AzrXOvc61z4HOs86/z4DOv86vzrfPg863IM+Hz47Pgc6/z4UgzrHPgM6/zrjOrs66zrXPhc+DzrfPgiBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIxNDM4ODE5MTQ4NDA0MTIxMDgiPiLOoM6xz4HOv8+Fz4POuc6sz4PPhM63zrrOtSDPgM+Bz4zOss67zrfOvM6xIM66zrHPhM6sIM+EzrfOvSDOsc+AzrXOvc61z4HOs86/z4DOv86vzrfPg863IM+Ezr/PhSDOsc+Azr/OuM63zrrOtc+Fz4TOuc66zr/PjSDPh8+Oz4HOv8+FIFVTQi4gzpLOtc6yzrHOuc+JzrjOtc6vz4TOtSDPjM+Ezrkgzq3Ph861z4TOtSDOsc+GzrHOuc+Bzq3Pg861zrkgz4TOt869IM+Fz4DOv860zr/Ph86uIFVTQiDOus6xzrkgz4DPgc6/z4PPgM6xzrjOrs+Dz4TOtSDOvs6xzr3OrC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGl0bGUiIG1zZ2lkPSI5NjMwMzkwMzM0NzA0Nzg2OTciPiLOlc69zrXPgc6zzr/PgM6/zq/Ot8+DzrcgzrHPgM6/zrjOt866zrXPhc+EzrnOus6/z40gz4fPjs+Bzr/PhSBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGV4dCIgbXNnaWQ9IjMyMDI4MzgyMzQ3ODA1MDU4ODYiPiLOlc6szr0gzrXOvc61z4HOs86/z4DOv865zq7Pg861z4TOtSDPhM6/zr0gzrHPgM6/zrjOt866zrXPhc+EzrnOus+MIM+Hz47Pgc6/IFVTQiwgzr/Pgc65z4POvM6tzr3Otc+CIM6xz4DPjCDPhM65z4IgzrXPhs6xz4HOvM6/zrPOrc+CIM+Azr/PhSDPh8+BzrfPg865zrzOv8+Azr/Ouc61zq/PhM61IM64zrEgz4PPhM6xzrzOsc+Ezq7Pg86/z4XOvSDOus6xzrkgzrXOvc60zq3Ph861z4TOsc65IM69zrEgzrzOt869IM61zq/Ovc6xzrkgzrTOuc6xzrjOrc+DzrnOvM61z4IgzrzOrc+Hz4HOuSDOvc6xIM6xz4DOtc69zrXPgc6zzr/PgM6/zrnOrs+DzrXPhM61IM+Ezr/OvSDOsc+Azr/OuM63zrrOtc+Fz4TOuc66z4wgz4fPjs+Bzr8gVVNCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19lcnJvcl90aXRsZSIgbXNnaWQ9IjgwNDg5OTk5NzM4MzczMzkxNzQiPiLOkc+Azq3PhM+Fz4fOtSDOtyDOu861zrnPhM6/z4XPgc6zzq/OsSBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfb2siIG1zZ2lkPSI3Mzc2OTUzMTY3MDM5ODY1NzAxIj4izp/OmiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg2NjMyNDc5Mjk1NTEwOTU4NTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NTc3OTA4MDA2OTQ5NzQyMjE3Ij4izpTOuc6xzrzPjM+Bz4bPic+DzrcgzrrOrM+Bz4TOsc+CIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+Is6UzrnOsc68z4zPgc+Gz4nPg863IM66zqzPgc+EzrHPgiBTRCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MjEzNjk5NjI0MzM1MjM2MTkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM0NzA4MTUxNDAwNjg1MDI4MjQiPiLOlc6vz4PPhM61IM6yzq3Oss6xzrnOv865IM+Mz4TOuSDOuM6tzrvOtc+EzrUgzr3OsSDOtM65zrHOvM6/z4HPhs+Oz4POtc+EzrUgz4TOt869IM66zqzPgc+EzrEgU0Q7IM6MzrvOsSDPhM6xIM60zrXOtM6/zrzOrc69zrEgz4PPhM63zr0gzrrOrM+Bz4TOsSDPg86xz4IgzrjOsSDPh86xzrjOv8+Nzr0uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4izpXOr8+Dz4TOtSDOss6tzrLOsc65zr/OuSDPjM+EzrkgzrjOrc67zrXPhM61IM69zrEgzrTOuc6xzrzOv8+Bz4bPjs+DzrXPhM61IM+EzrfOvSDOus6sz4HPhM6xIFNEOyDOjM67zrEgz4TOsSDOtM61zrTOv868zq3Ovc6xIM+Dz4TOt869IM66zqzPgc+EzrEgz4POsc+CIM64zrEgz4fOsc64zr/Pjc69LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiLOlM65zrHOvM+Mz4HPhs+Jz4POtyDOus6sz4HPhM6xz4IgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiLOlc6vz4PPhM61IM6yzq3Oss6xzrnOv865IM+Mz4TOuSDOuM6tzrvOtc+EzrUgzr3OsSDOtM65zrHOvM6/z4HPhs+Oz4POtc+EzrUgz4TOt869IM66zqzPgc+EzrEgU0Q7IM6MzrvOsSDPhM6xIM60zrXOtM6/zrzOrc69zrEgz4PPhM63zr0gzrrOrM+Bz4TOsSDPg86xz4IgzrjOsSDPh86xzrjOv8+Nzr0uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X2J1dHRvbl9mb3JtYXQiIG1zZ2lkPSI0MTMxMDY0NTYwMTI3NDc4Njk1Ij4izpTOuc6xzrzPjM+Bz4bPic+DzrciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3MjkwNDQ3Nzg5NDkxODk5MTgiPiLOo8+Fzr3OtM6tzrjOt866zrUgzr8gzrXOvc+Ezr/PgM65z4POvM+Mz4Igz4PPhs6xzrvOvM6sz4TPic69IFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4NDcwMjk2ODE4MjcwMTEwMzk2Ij4izpXPgM65zrvOv86zzq4gzrPOuc6xIM6xz4DOtc69zrXPgc6zzr/PgM6/zq/Ot8+Dzrcgz4TOv8+FIM61zr3PhM6/z4DOuc+DzrzOv8+NIM+Dz4bOsc67zrzOrM+Ez4nOvSBVU0IuIjwvc3RyaW5nPgpAQCAtODQxLDI5ICs4MjYsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX2FscGhhYmV0IiBtc2dpZD0iNTQzMzI3NTQ4NTQ5OTAzOTE5OSI+IiBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX251bWVyaWNfYWxwaGFiZXQiIG1zZ2lkPSI0MDMwMTcwNTI0NTk1MTIzNjEwIj4iIDAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhbmRpZGF0ZXNfc3R5bGUiIG1zZ2lkPSI0MzMzOTEzMDg5NjM3MDYyMjU3Ij48dT4iz4XPgM6/z4jOrs+GzrnOv865IjwvdT48L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU0NTc2MDM0MTg5NzA5OTQwNTAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDIzOTUxNjY3NTAyODQzODk5NyI+Is6gz4HOv861z4TOv865zrzOsc+Dzq/OsSDOus6sz4HPhM6xz4IgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+Is6gz4HOv861z4TOv865zrzOsc+Dzq/OsSDOus6sz4HPhM6xz4IgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+Is6gz4HOv861z4TOv865zrzOsc+Dzq/OsSDOus6sz4HPhM6xz4IgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4Mjg3MzE5ODgyOTI2NzM3MDUzIj4izojOu861zrPPh86/z4IgzrPOuc6xIM+Dz4bOrM67zrzOsc+EzrEuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzgwNDc3ODM4MjQxMjEyOTk3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzkzNzM0NTU3Nzk4MzczMDg3MyI+Is6azrXOvc6uIM66zqzPgc+EzrEgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI3ODA0Nzc4MzgyNDEyMTI5OTciPiLOms61zr3OriDOus6sz4HPhM6xIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTMxMjI2NjgyMDA5Mjk1ODAxNCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTYwNjY2MDc1NjEyNDYyOTcwOCI+Is6XIM66zqzPgc+EzrEgU0QgzrXOr869zrHOuSDOus61zr3OriDOriDPh8+BzrfPg865zrzOv8+Azr/Ouc61zq8gz4PPjc+Dz4TOt868zrEgzrHPgc+HzrXOr8+Jzr0gz4DOv8+FIM60zrXOvSDPhc+Azr/Pg8+EzrfPgc6vzrbOtc+EzrHOuS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiLOlyDOus6sz4HPhM6xIFNEIM61zq/Ovc6xzrkgzrrOtc69zq4gzq4gzq3Ph861zrkgzrzOtyDPhc+Azr/Pg8+EzrfPgc65zrbPjM68zrXOvc6/IM+Dz43Pg8+EzrfOvM6xIM6xz4HPh861zq/Pic69LiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY0MTA3MjM5MDYwMTkxMDAxODkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTcyNDYxOTkwMjA3NjUyODg4OSI+Is6azrHPhM61z4PPhM+BzrHOvM68zq3Ovc63IM66zqzPgc+EzrEgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjQxMDcyMzkwNjAxOTEwMDE4OSI+Is6azrHPhM61z4PPhM+BzrHOvM68zq3Ovc63IM66zqzPgc+EzrEgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNjc5NDEyODg0MjkwMDYxNzc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjQ2MDMxMTgzNTEzMDY3MTE5NCI+Is6XIM66zqzPgc+EzrEgU0Qgzq3Ph861zrkgz4XPgM6/z4PPhM61zq8gzrLOu86szrLOty4gzpXOvc60zq3Ph861z4TOsc65IM69zrEgz4fPgc61zrnOsc+Dz4TOtc6vIM6xzr3Osc60zrnOsc68z4zPgc+Gz4nPg863IM+EzrfPgiDOus6sz4HPhM6xz4Igz4POsc+CLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY5MDI1MzE3NzU5NDgyMzg5ODkiPiLOlyDOus6sz4HPhM6xIFNEIM+AzrHPgc6/z4XPg865zqzOts61zrkgzrLOu86szrLOty4gzpXOvc60zrXPh86/zrzOrc69z4nPgiDOuM6xIM+Az4HOrc+AzrXOuSDOvc6xIM+Az4HOv86yzrXOr8+EzrUgz4POtSDOtM65zrHOvM+Mz4HPhs+Jz4POriDPhM63z4IuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjg3MjE1Mjg4MjYwNDQwNzgzNyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI1ODIxNzUwMTYwNjA0MzIwMzQiPiLOnM63IM6xzr3Osc68zrXOvc+MzrzOtc69zrcgzrHPhs6xzq/Pgc61z4POtyDOus6sz4HPhM6xz4IgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4izpzOtyDOsc69zrHOvM61zr3PjM68zrXOvc63IM6xz4bOsc6vz4HOtc+DzrcgzrrOrM+Bz4TOsc+CIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzI2MDE4MzI5Mzc0NzQ0ODI0MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjAwNTM5NjQ2NDQ5NDY0ODkzNyI+Is6Rz4DOv8+Az4HOv8+DzrHPgc+Ezq7Pg8+EzrUgz4TOt869IM66zqzPgc+EzrEgU0Qgz4DPgc65zr0gz4TOt869IM6xz4bOsc65z4HOrc+DzrXPhM61IM6zzrnOsSDPhM63zr0gzrHPgM6/z4bPhc6zzq4gzrHPgM+OzrvOtc65zrHPgiDOtM61zrTOv868zq3Ovc+Jzr0uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4izpHPgM6/z4DPgc6/z4POsc+Bz4TOrs+Dz4TOtSDPhM63zr0gzrrOrM+Bz4TOsSBTRCDPgM+BzrnOvSDPhM63zr0gzrHPhs6xzrnPgc6tz4POtc+EzrUgzrPOuc6xIM+EzrfOvSDOsc+Azr/Phs+FzrPOriDOsc+Az47Ou861zrnOsc+CIM60zrXOtM6/zrzOrc69z4nOvS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NzI5ODAxMTMwNzkwNjE2MjAwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNjUyNTg4MTAxODY3OTUxNSI+Is6XIM66zqzPgc+EzrEgU0QgzrzPgM6/z4HOtc6vIM69zrEgzrHPhs6xzrnPgc61zrjOtc6vIM68zrUgzrHPg8+GzqzOu861zrnOsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+Is6XIM66zqzPgc+EzrEgU0QgzrzPgM6/z4HOtc6vIM69zrEgzrHPhs6xzrnPgc61zrjOtc6vIM68zrUgzrHPg8+GzqzOu861zrnOsSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc2MTM5NjA2ODY3NDc1OTI3NzAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNzUwMzc2OTEwNjI4NTE4ODcwMyI+Is6kz47Pgc6xIM68z4DOv8+BzrXOr8+EzrUgzr3OsSDOsc+GzrHOuc+Bzq3Pg861z4TOtSDOvM61IM6xz4PPhs6szrvOtc65zrEgz4TOt869IM66zqzPgc+EzrEgU0QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+Is6cz4DOv8+BzrXOr8+EzrUgzr3OsSDOsc+GzrHOuc+Bzq3Pg861z4TOtSDOvM61IM6xz4PPhs6szrvOtc65zrEgz4TOt8+CIM66zqzPgc+EzrEgU0QuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODkwMjUxODAzMDQwNDM4MTMxOCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE4NzQ4ODk3NjQzNjcwODU1NjIiPiLOlyDOus6sz4HPhM6xIFNEIM6xz4bOsc65z4HOrc64zrfOus61Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+Is6XIM66zqzPgc+EzrEgU0QgzrHPhs6xzrnPgc6tzrjOt866zrUiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MjA1MTE3MjI3MzQyODIyMjc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNzMwODkwNDQxMzMxMzQ0Nzc2Ij4izpcgzrrOrM+Bz4TOsSBTRCDOsc+GzrHOuc+Bzq3OuM63zrrOtS4gzpXOuc+DzrHOs86szrPOtc+EzrUgzrzOuc6xIM69zq3OsSDOus6sz4HPhM6xIFNEIM6zzrnOsSDOvc6xIM6xz4XOvs6uz4POtc+EzrUgz4TOv869IM6xz4DOv864zrfOus61z4XPhM65zrrPjCDPh8+Oz4HOvyDPhM63z4Igz4PPhc+DzrrOtc+Fzq7PgiDPg86xz4IuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4izpHPhs6xzrnPgc6tzrjOt866zrUgzrcgzrrOrM+Bz4TOsSBTRC4gzqTOv8+Azr/OuM61z4TOrs+Dz4TOtSDOvM65zrEgzr3Orc6xIM66zqzPgc+EzrEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4izprOtc69zq4gzrrOrM+Bz4TOsSBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+Is6XIM66zqzPgc+EzrEgU0QgzrXOr869zrHOuSDOus61zr3OriDOriDOrc+HzrXOuSDOvM63IM+Fz4DOv8+Dz4TOt8+BzrnOts+MzrzOtc69zr8gz4PPjc+Dz4TOt868zrEgzrHPgc+HzrXOr8+Jzr0uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiLOms6xz4TOtc+Dz4TPgc6xzrzOvM6tzr3OtyDOus6sz4HPhM6xIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+Is6XIM66zqzPgc+EzrEgU0Qgz4DOsc+Bzr/Phc+DzrnOrM62zrXOuSDOss67zqzOss63LiDOlc69zrTOtc+Hzr/OvM6tzr3Pic+CIM64zrEgz4DPgc6tz4DOtc65IM69zrEgz4DPgc6/zrLOtc6vz4TOtSDPg861IM60zrnOsc68z4zPgc+Gz4nPg86uIM+EzrfPgi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4izpzOtyDOsc69zrHOvM61zr3PjM68zrXOvc63IM6xz4bOsc6vz4HOtc+DzrcgzrrOrM+Bz4TOsc+CIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4izpHPgM6/z4DPgc6/z4POsc+Bz4TOrs+Dz4TOtSDPhM63zr0gzrrOrM+Bz4TOsSBTRCDPgM+BzrnOvSDPhM63zr0gzrHPhs6xzrnPgc6tz4POtc+EzrUgzrPOuc6xIM+EzrfOvSDOsc+Azr/Phs+FzrPOriDOsc+Az47Ou861zrnOsc+CIM60zrXOtM6/zrzOrc69z4nOvS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiLOlyDOus6sz4HPhM6xIFNEIM68z4DOv8+BzrXOryDOvc6xIM6xz4bOsc65z4HOtc64zrXOryDOvM61IM6xz4PPhs6szrvOtc65zrEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4izpzPgM6/z4HOtc6vz4TOtSDOvc6xIM6xz4bOsc65z4HOrc+DzrXPhM61IM68zrUgzrHPg8+GzqzOu861zrnOsSDPhM63z4IgzrrOrM+Bz4TOsSBTRC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4OTAyNTE4MDMwNDA0MzgxMzE4Ij4izpcgzrrOrM+Bz4TOsSBTRCDOsc+GzrHOuc+Bzq3OuM63zrrOtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+Is6Rz4bOsc65z4HOrc64zrfOus61IM63IM66zqzPgc+EzrEgU0QuIM6kzr/PgM6/zrjOtc+Ezq7Pg8+EzrUgzrzOuc6xIM69zq3OsSDOus6sz4HPhM6xLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X2xpc3RfZW1wdHkiIG1zZ2lkPSI0MTY4ODIwNjA5NDAzMzg1Nzg5Ij4izpTOtc69IM6yz4HOrc64zrfOus6xzr0gzrTPgc6xz4PPhM63z4HOuc+Mz4TOt8+EzrXPgiDPgM6/z4Ugzr3OsSDOsc69z4TOuc+Dz4TOv865z4fOv8+Nzr0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4Nzg3MzUyMDc0MzI2NzQ4ODkyIj4izrXOvc63zrzOrc+Bz4nPg863IM+Dz4TOsc+EzrnPg8+EzrnOus+Ozr0gz4fPgc6uz4POt8+CIM+Dz4TOv865z4fOtc6vzr/PhSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4OTE1NTM2OTU3MTY3NTI4MzUiPiLOlc+AzrnPhM+Bzq3PgM61zrkgz4TOt869IM+Ez4HOv8+Azr/PgM6/zq/Ot8+Dzrcgz4PPhM6xz4TOuc+Dz4TOuc66z47OvSDPh8+Bzq7Pg863z4Igz4PPhM6/zrnPh861zq/Pic69IM+Azr/PhSDOrc+Hzr/Phc69IM+Dz4XOu867zrXPh864zrXOry4gzpTOtc69IM+Az4HOrc+AzrXOuSDOvc6xIM+Hz4HOt8+DzrnOvM6/z4DOv865zrXOr8+EzrHOuSDOsc+Az4wgzrrOsc69zr/Ovc65zrrOrc+CIM61z4bOsc+BzrzOv86zzq3Pgi4iPC9zdHJpbmc+CkBAIC04OTgsMTUgKzg3MiwyNCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+Is6azrvOtc65zrTOryBwcmUtc2hhcmVkIM6yzqzPg861zrkgTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4izqDOuc+Dz4TOv8+Azr/Ouc63z4TOuc66z4wgzrLOrM+DzrXOuSBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+Is6Vz4DOuc67zr/Os86uIM6xz4HPh861zq/Ov8+FIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4izpTOtc69IM6tz4fOtc65IM61z4DOuc67zrXOs861zq8gzrHPgc+HzrXOr86/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4izpXPgM6xzr3Osc+Gzr/Pgc6sIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+Is6lz4DOv86yzr/Ou86uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiLOsc6zzrHPgM63zrzOrc69zr8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiLOlyDOu861zrnPhM6/z4XPgc6zzq/OsSDOsc+Fz4TOv866zrnOvc6uz4TOv8+FIM61zq/Ovc6xzrkgzrXOvc61z4HOs86/z4DOv865zrfOvM6tzr3OtyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiLOlc+AzrnOu86tzr7PhM61IM6zzrnOsSDOrc6+zr/OtM6/IM6xz4DPjCDPhM63IM67zrXOuc+Ezr/Phc+BzrPOr86xIM6xz4XPhM6/zrrOuc69zq7PhM6/z4UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+Is6jz43Ovc60zrXPg863IM68zq3Pg8+JIM66zrnOvc63z4TOrs+CIM+Dz4XPg866zrXPhc6uz4Igzq4gz4POt868zrXOr86/z4Ugz4DPgc+Mz4POss6xz4POt8+CIM61zr3Otc+BzrPOriI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+Is6RzrPOs86vzr7PhM61IM6zzrnOsSDOvc6xIM6zzq/Ovc61zrkgzrTOuc6xzrzPjM+Bz4bPic+DzrciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiLOoM6vz4PPiSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+Is6Vz4DPjM68zrXOvc6/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4izqDOsc+BzqzOss67zrXPiM63Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4izqXPiM63zrvOriDPh8+Bzq7Pg863IM60zrXOtM6/zrzOrc69z4nOvSDOus65zr3Ot8+Ezq7PgiDPhM63zrvOtc+Gz4nOvc6vzrHPgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4izpHOs86zzq/Ovs+EzrUgzrPOuc6xIM69zrEgzrzOrM64zrXPhM61IM+AzrXPgc65z4PPg8+Mz4TOtc+BzrEgz4PPh861z4TOuc66zqwgzrzOtSDPhM63IM+Hz4HOrs+DzrcgzrTOtc60zr/OvM6tzr3Pic69IM66zrnOvc63z4TOrs+CIM+EzrfOu861z4bPic69zq/Osc+CIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiLOns61z4DOtc+BzqzPg8+EzrfOus61IM+Ezr8gz4zPgc65zr8gzrTOtc60zr/OvM6tzr3Pic69IM66zrnOvc63z4TOrs+CIM+EzrfOu861z4bPic69zq/Osc+CIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNDcxMjM2OTg1NjYwMTI3NTE0NiI+Is6RzrPOs86vzr7PhM61IM6zzrnOsSDOvc6xIM68zqzOuM61z4TOtSDPgM61z4HOuc+Dz4PPjM+EzrXPgc6xIM+Dz4fOtc+EzrnOus6sIM68zrUgz4TOtyDPh8+Bzq7Pg863IM60zrXOtM6/zrzOrc69z4nOvSDOus65zr3Ot8+Ezq7PgiDPhM63zrvOtc+Gz4nOvc6vzrHPgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX21hdGNoZXMiIG1zZ2lkPSI4MTI5NDIxOTA4OTE1ODQwNzM3Ij4izpTOtc69IM+Fz4DOrM+Bz4fOv8+Fzr0gzrHPgM6/z4TOtc67zq3Pg868zrHPhM6xIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZmluZF9vbl9wYWdlIiBtc2dpZD0iMTk0Njc5OTIzMzgyMjgyMDM4NCI+Is6Vz43Pgc61z4POtyDPg8+Ezrcgz4POtc67zq/OtM6xIjwvc3RyaW5nPgorICA8cGx1cmFscyBuYW1lPSJtYXRjaGVzX2ZvdW5kIj4KKyAgICA8aXRlbSBxdWFudGl0eT0ib25lIiBtc2dpZD0iODE2NzE0NzA4MTEzNjU3OTQzOSI+IjEgzrHPgM6/z4TOrc67zrXPg868zrEiPC9pdGVtPgorICAgIDxpdGVtIHF1YW50aXR5PSJvdGhlciIgbXNnaWQ9IjQ2NDE4NzI3OTcwNjc2MDkxNzciPiI8eGxpZmY6ZyBpZD0iSU5ERVgiPiVkPC94bGlmZjpnPiDOsc+Az4wgPHhsaWZmOmcgaWQ9IlRPVEFMIj4lZDwveGxpZmY6Zz4iPC9pdGVtPgorICA8L3BsdXJhbHM+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKaW5kZXggZDlkMWM5Yi4uZmUyN2I5NSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKQEAgLTE2OSw4ICsxNjksNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSIzNDQ2MTY0NTg0NzEwNTk2NTEzIj4iSGVycmFtaWVudGFzIGRlIGRlc2Fycm9sbG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSI5MDU2NDMxMTkzODkzODA5ODE0Ij4iTGFzIGZ1bmNpb25lcyBzw7NsbyBzb24gbmVjZXNhcmlhcyBwYXJhIGxvcyBkZXNhcnJvbGxhZG9yZXMgZGUgYXBsaWNhY2lvbmVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGxhYl9zdG9yYWdlIiBtc2dpZD0iMTk3MTExODc3MDU0NjMzNjk2NiI+IkVzcGFjaW8gZGUgYWxtYWNlbmFtaWVudG8iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MjAzMzAyMjE0OTE1MzU1Nzc0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNTQ1NTgwNDM1MzIyMDU4MTMxMiI+IkFjY2VkZXIgYSBsYSB0YXJqZXRhIFNELiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiJBY2NlZGVyIGEgbGEgdGFyamV0YSBTRC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4iQWNjZWRlciBhIGxhIHRhcmpldGEgU0QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXIiIG1zZ2lkPSI3NDE3MTkyNjI5NjAxODkwNzkxIj4iZGVzYWN0aXZhciBvIG1vZGlmaWNhciBsYSBiYXJyYSBkZSBlc3RhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zdGF0dXNCYXIiIG1zZ2lkPSIxMzY1NDczNTk1MzMxOTg5NzMyIj4iQWRtaXRlIHF1ZSBsYSBhcGxpY2FjacOzbiBkZXNhY3RpdmUgbGEgYmFycmEgZGUgZXN0YWRvLCBvIGFncmVndWUgeSBlbGltaW5lIMOtY29ub3MgZGVsIHNpc3RlbWEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXJTZXJ2aWNlIiBtc2dpZD0iNzI0NzI4MTkxMTM4NzkzMTQ4NSI+ImJhcnJhIGRlIGVzdGFkbyI8L3N0cmluZz4KQEAgLTI2Nyw4ICsyNjYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NsZWFyQXBwQ2FjaGUiIG1zZ2lkPSI3NzQwNDY1Njk0MTkzNjcxNDAyIj4iQWRtaXRlIHVuYSBhcGxpY2FjacOzbiBxdWUgbGliZXJhIGVzcGFjaW8gZGUgYWxtYWNlbmFtaWVudG8gZW4gZWwgdGVsw6lmb25vIGFsIGVsaW1pbmFyIGFyY2hpdm9zIGRlbCBkaXJlY3RvcmlvIGRlIG1lbW9yaWEgY2FjaMOpIGRlIGxhIGFwbGljYWNpw7NuLiBFbiBnZW5lcmFsLCBlbCBhY2Nlc28gZXMgbXV5IHJlc3RyaW5naWRvIHBhcmEgZWwgcHJvY2VzbyBkZWwgc2lzdGVtYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX21vdmVQYWNrYWdlIiBtc2dpZD0iNzI4NDU0OTc5OTQ2NTAzOTI2Ij4iTW92ZXIgcmVjdXJzb3MgZGUgbGEgYXBsaWNhY2nDs24iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19tb3ZlUGFja2FnZSIgbXNnaWQ9IjYzMjMwNDkyOTE5MjM5MjUyNzciPiJQZXJtaXRlIGEgdW5hIGFwbGljYWNpw7NuIG1vdmVyIHJlY3Vyc29zIGRlIGFwbGljYWNpw7NuIGRlIG1lZGlvcyBpbnRlcm5vcyBhIGV4dGVybm9zIHkgdmljZXZlcnNhLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ4MTE5MjE3MDM4ODI1MzIwNzAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZExvZ3MiIG1zZ2lkPSI2NjE1Nzc4NTQzMTk4OTY3NjE0Ij4ibGVlciBhcmNoaXZvcyBkZSByZWdpc3RybyBkZWwgc2lzdGVtYSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIyNTc5Mzc5NTU1ODA0NzU5MDIgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+IkFkbWl0ZSB1bmEgYXBsaWNhY2nDs24gcXVlIGxlZSBkaXZlcnNvcyBhcmNoaXZvcyBkZSByZWdpc3RybyBkZWwgc2lzdGVtYS4gRXN0byBsZSBwZXJtaXRlIGRlc2N1YnJpciBpbmZvcm1hY2nDs24gZ2VuZXJhbCBzb2JyZSBsbyBxdWUgaGFjZXMgY29uIGVsIHRlbMOpZm9ubywgcGVybyBubyBkZWJlIGNvbnRlbmVyIGluZm9ybWFjacOzbiBwZXJzb25hbCBuaSBwcml2YWRhLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRMb2dzICg2NjE1Nzc4NTQzMTk4OTY3NjE0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRMb2dzICg4ODk2NDQ5NDM3NDY0ODY3NzY2KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaWFnbm9zdGljIiBtc2dpZD0iODA3Njc0Mzk1MzkwODAwMDM0MiI+ImxlZXIgeSBlc2NyaWJpciBhIHJlY3Vyc29zIGRlbnRybyBkZWwgZ3J1cG8gZGUgZGlhZ27Ds3N0aWNvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlhZ25vc3RpYyIgbXNnaWQ9IjMxMjEyMzgzNzM5NTE2MzcwNDkiPiJBZG1pdGUgdW5hIGFwbGljYWNpw7NuIHF1ZSBsZWUgeSBlc2NyaWJlIGEgY3VhbHF1aWVyIHJlY3Vyc28gZGVudHJvIGRlbCBncnVwbyBkZSBkaWFnbsOzc3RpY287IHBvciBlamVtcGxvLCBhcmNoaXZvcyBjb24gL2Rldi4gRXN0byBwdWVkZSBhZmVjdGFyIHBvdGVuY2lhbG1lbnRlIGxhIGVzdGFiaWxpZGFkIHkgbGEgc2VndXJpZGFkIGRlbCBzaXN0ZW1hLiBEZWJlIHV0aWxpemFybG8gU8OTTE8gZWwgZmFicmljYW50ZSBvIGVsIG9wZXJhZG9yIGVuIGxvcyBkaWFnbsOzc3RpY29zIGVzcGVjw61maWNvcyBkZWwgaGFyZHdhcmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VDb21wb25lbnRTdGF0ZSIgbXNnaWQ9Ijc5NDI1MTk4ODM0MzI5NDA2Ij4iYWN0aXZhciBvIGRlc2FjdGl2YXIgY29tcG9uZW50ZXMgZGUgbGEgYXBsaWNhY2nDs24iPC9zdHJpbmc+CkBAIC00MDMsMjIgKzQwNCw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGhBZG1pbiIgbXNnaWQ9IjcyNTYyODk3NzQ2NjcwNTQ1NTUiPiJBZG1pdGUgdW5hIGFwbGljYWNpw7NuIHF1ZSBjb25maWd1cmEgZWwgdGVsw6lmb25vIEJsdWV0b290aCBsb2NhbCB5IGRlc2N1YnJlIHkgc2UgdmluY3VsYSBjb24gZGlzcG9zaXRpdm9zIHJlbW90b3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ibHVldG9vdGgiIG1zZ2lkPSI4MzYxMDM4NzA3ODU3MDE4NzMyIj4iY3JlYXIgY29uZXhpb25lcyBkZSBCbHVldG9vdGgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGgiIG1zZ2lkPSI3NjI1MTUzODA2NzkzOTI5NDUiPiJBZG1pdGUgdW5hIGFwbGljYWNpw7NuIHF1ZSB2ZSBsYSBjb25maWd1cmFjacOzbiBkZWwgdGVsw6lmb25vIEJsdWV0b290aCBsb2NhbCwgeSByZWFsaXphIHkgYWNlcHRhIGNvbmV4aW9uZXMgY29uIGRpc3Bvc2l0aXZvcyB2aW5jdWxhZG9zLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0FkbWluICgyMjUxMzAyMjMzMDEyMjUwMDU2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0FkbWluICgxOTM1ODQyNjExNDY0ODk1Nzg1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjUmF3ICg0NDIzNDcxNzExMTE0MzI1NzA4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY1JhdyAoNTUzMzAyMjczNjU1OTM4NTY2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY05vdGlmeSAoNDc4NDcwMzYwMDgyNzkyMzU4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY05vdGlmeSAoMjk5MDA1MzUxNzk2MjA3MDYxNykgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0xsY3AgKDQ5NzIwNTE0NjEwMDcwMzA0MjYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTGxjcCAoOTE1OTIxMjc3ODYwMDQ2NDApIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjQ5Nzc0MDYxNjQzMTE1MzUwOTIiPiJkZXNhY3RpdmFyIGVsIGJsb3F1ZW8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSIzMTg5NzYzNDc5MzI2MzAyMDE3Ij4iQWRtaXRlIHVuYSBhcGxpY2FjacOzbiBxdWUgZGVzYWN0aXZhIGVsIGJsb3F1ZW8geSBjdWFscXVpZXIgc2VndXJpZGFkIGNvbiBjb250cmFzZcOxYSByZWxhY2lvbmFkYS4gVW4gZWplbXBsbyBsZWfDrXRpbW8gZGUgZXN0byBlcyBlbCBibG9xdWVvIGRlc2FjdGl2YWRvIHBvciBlbCB0ZWzDqWZvbm8gY3VhbmRvIHJlY2liZSB1bmEgbGxhbWFkYSB0ZWxlZsOzbmljYSBlbnRyYW50ZSwgeSBsdWVnbyBsYSByZWFjdGl2YWNpw7NuIGRlbCBibG9xdWVvIGN1YW5kbyBmaW5hbGl6YSBsYSBsbGFtYWRhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFN5bmNTZXR0aW5ncyIgbXNnaWQ9IjYyMDE4MTAwMDgyMzA1MDMwNTIiPiJsZWVyIGxhIGNvbmZpZ3VyYWNpw7NuIGRlIHNpbmNyb25pemFjacOzbiI8L3N0cmluZz4KQEAgLTQzNSwyMiArNDIwLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9IjEwODI5NzI2MDM1NzYzNjA2OTAiPiJBZG1pdGUgdW5hIGFwbGljYWNpw7NuIHBhcmEgbGVlciBwYWxhYnJhcywgbm9tYnJlcyB5IGZyYXNlcyBwcml2YWRhcyBxdWUgcG9zaWJsZW1lbnRlIGVsIHVzdWFyaW8gaGF5YSBhbG1hY2VuYWRvIGVuIGVsIGRpY2Npb25hcmlvIGRlbCB1c3VhcmlvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iNjcwMzEwOTUxMTgzNjM0MzM0MSI+ImVzY3JpYmlyIGFsIGRpY2Npb25hcmlvIGRlZmluaWRvIHBvciBlbCB1c3VhcmlvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI0MTI1NjIwNjUyNDA4Mjg4MCI+IkFkbWl0ZSB1bmEgYXBsaWNhY2nDs24gcXVlIGVzY3JpYmUgcGFsYWJyYXMgbnVldmFzIGVuIGVsIGRpY2Npb25hcmlvIGRlbCB1c3VhcmlvLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDgwNzk0MDM3NTkwMDE3NzcyOTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iOTkzNzA3NDM2OTQxMDE2OTEzIj4ibW9kaWZpY2FyL3N1cHJpbWlyIGVsIGNvbnRlbmlkbyBkZSBsYSB0YXJqZXRhIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJtb2RpZmljYXIvc3VwcmltaXIgZWwgY29udGVuaWRvIGRlIGxhIHRhcmpldGEgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NjQzOTYzMjA0OTc2NDcxODc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MTMxODcxNTQxMTI3MjExNTI2Ij4iQWRtaXRlIHF1ZSB1bmEgYXBsaWNhY2nDs24gZXNjcmliYSBlbiBsYSB0YXJqZXRhIFNELiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IkFkbWl0ZSBxdWUgdW5hIGFwbGljYWNpw7NuIGVzY3JpYmEgZW4gbGEgdGFyamV0YSBTRC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Im1vZGlmaWNhci9zdXByaW1pciBlbCBjb250ZW5pZG8gZGUgbGEgdGFyamV0YSBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IkFkbWl0ZSBxdWUgdW5hIGFwbGljYWNpw7NuIGVzY3JpYmEgZW4gbGEgdGFyamV0YSBTRC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSI1NjU2NDg3MjY0ODE5NjY5ODI0Ij4iQWNjZWRlciBhbCBzaXN0ZW1hIGRlIGFyY2hpdm9zIGNhY2jDqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSIxNjI0NzM0NTI4NDM1NjU5OTA2Ij4iUGVybWl0ZSBxdWUgdW5hIGFwbGljYWNpw7NuIGxlYSB5IGVzY3JpYmEgZWwgc2lzdGVtYSBkZSBhcmNoaXZvcyBjYWNow6kuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDMwNzg2MTQ5NjMwMjg1MDIwMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0NDk3NDIwNzI4ODU3NTg1NzkxIj4iTGltaXRhciBsYSBjb250cmFzZcOxYSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE3MTk4NzcyNDU2OTIzMTgyOTkgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjkwODM0MDAwODA4NjE3MjgwNTYiPiJSZXN0cmluZ2UgbG9zIHRpcG9zIGRlIGNvbnRyYXNlw7FhcyBxdWUgcHVlZGVzIHV0aWxpemFyLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDczNzQ3ODA3MTI2NjQyODUzMjEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iOTE0MTMwNjQ2OTQyMTk5NTAzIj4iT2JzZXJ2YXIgbG9zIGludGVudG9zIGRlIGFjY2VzbyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE5NjEyNTExNzk2MjQ4NDM0ODMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjcyMjc1NzgyNjAxNjUxNzI2NzMiPiJJbnRlbnRvcyBmYWxsaWRvcyBkZWwgY29udHJvbCBwYXJhIGFjY2VkZXIgYWwgZGlzcG9zaXRpdm8gcGFyYSByZWFsaXphciBhbGd1bmEgYWNjacOzbi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MDg0NzcyMDkwNzk3NDg1NDIwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjI2MjAwNzcxOTEyNDI2ODg5NTUiPiJSZXN0YWJsZWNlciBjb250cmFzZcOxYSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDMzMzIxNjc2MDAzMzE3OTk5OTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjUzOTEyNDA2MTY5ODEyOTczNjEiPiJGb3J6YXIgdW4gbnVldm8gdmFsb3IgcGFyYSB0dSBjb250cmFzZcOxYSwgZWwgYWRtaW5pc3RyYWRvciBkZWJlcsOhIGVudmnDoXJ0ZWxvIGFudGVzIGRlIHBvZGVyIGFjY2VkZXIuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTc2MDQ2NjAyNTI0NzYzNDQ4OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjIyNzQwODUzODQ3MDQyNDg0MzEiPiJQcm92b2NhciBlbCBibG9xdWVvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjgxOTg2ODY2NDk0NjA4OTc0MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSI1Njk2OTY0MTI2MjI2MDI4NDQyIj4iQ29udHJvbGFyIGN1YW5kbyBzZSBibG9xdWVlIGVsIGRpc3Bvc2l0aXZvLCByZXF1aWVyZSBxdWUgdnVlbHZhcyBhIGluZ3Jlc2FyIHR1IGNvbnRyYXNlw7FhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDMwNzg2MTQ5NjMwMjg1MDIwMSI+IkxpbWl0YXIgbGEgY29udHJhc2XDsWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSIxNzE5ODc3MjQ1NjkyMzE4Mjk5Ij4iUmVzdHJpbmdlIGxvcyB0aXBvcyBkZSBjb250cmFzZcOxYXMgcXVlIHB1ZWRlcyB1dGlsaXphci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjczNzQ3ODA3MTI2NjQyODUzMjEiPiJPYnNlcnZhciBsb3MgaW50ZW50b3MgZGUgYWNjZXNvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iMTk2MTI1MTE3OTYyNDg0MzQ4MyI+IkludGVudG9zIGZhbGxpZG9zIGRlbCBjb250cm9sIHBhcmEgYWNjZWRlciBhbCBkaXNwb3NpdGl2byBwYXJhIHJlYWxpemFyIGFsZ3VuYSBhY2Npw7NuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iOTA4NDc3MjA5MDc5NzQ4NTQyMCI+IlJlc3RhYmxlY2VyIGNvbnRyYXNlw7FhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iMzMzMjE2NzYwMDMzMTc5OTk5MSI+IkZvcnphciB1biBudWV2byB2YWxvciBwYXJhIHR1IGNvbnRyYXNlw7FhLCBlbCBhZG1pbmlzdHJhZG9yIGRlYmVyw6EgZW52acOhcnRlbG8gYW50ZXMgZGUgcG9kZXIgYWNjZWRlci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iNTc2MDQ2NjAyNTI0NzYzNDQ4OCI+IlByb3ZvY2FyIGVsIGJsb3F1ZW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJDb250cm9sYXIgY3VhbmRvIHNlIGJsb3F1ZWUgZWwgZGlzcG9zaXRpdm8sIHJlcXVpZXJlIHF1ZSB2dWVsdmFzIGEgaW5ncmVzYXIgdHUgY29udHJhc2XDsWEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkJvcnJhciB0b2RvcyBsb3MgZGF0b3MiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyMzE0MDYwOTMzNzk2Mzk2MjA1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iNzY2OTg5NTMzMzgxNDIyMjU4NiI+IlJlYWxpemFyIHVuIHJlZXN0YWJsZWNpbWllbnRvIGRlIGbDoWJyaWNhIHkgYm9ycmFyIHRvZG9zIHR1cyBkYXRvcyBzaW4gbmluZ3VuYSBjb25maXJtYWNpw7NuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iUmVhbGl6YXIgdW4gcmVlc3RhYmxlY2ltaWVudG8gZGUgZsOhYnJpY2EgeSBib3JyYXIgdG9kb3MgdHVzIGRhdG9zIHNpbiBuaW5ndW5hIGNvbmZpcm1hY2nDs24uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkiIG1zZ2lkPSI2Mzg3NDk3NDY2NjYwMTU0OTMxIj4iQ29uZmlndXJhY2nDs24gZGVsIHByb3h5IGdsb2JhbCBkZSBkaXNwb3NpdGl2byBxdWUgc2UgdXRpbGl6YXLDoSBtaWVudHJhcyBzZSBoYWJpbGl0YSBsYSBwb2zDrXRpY2EuIFPDs2xvIGxhIHByaW1lcmEgYWRtaW5pc3RyYWNpw7NuIGRlIGRpc3Bvc2l0aXZvIGNvbmZpZ3VyYSBlbCBwcm94eSBnbG9iYWwgZWZlY3Rpdm8uIjwvc3RyaW5nPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iQ2FzYSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IkNlbHVsYXIiPC9pdGVtPgpAQCAtNTUyLDEwICs1MzgsOSBAQAogICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVPdGhlciAoNDQwODQzNjE2Mjk1MDExOTg0OSkgLS0+CiAgICAgPHNraXAgLz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJhIHRyYXbDqXMgZGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiBhIHRyYXbDqXMgZGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJJbmdyZXNhciBlbCBjw7NkaWdvIGRlIFBJTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iSW5ncmVzYXIgbGEgY29udHJhc2XDsWEgcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iSW5ncmVzYSBlbCBQSU4gcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IsKhQ8OzZGlnbyBkZSBQSU4gaW5jb3JyZWN0byEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iUGFyYSBkZXNibG9xdWVhciwgcHJlc2lvbmEgZWwgbWVuw7ogeSBsdWVnbyAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOw7ptZXJvIGRlIGVtZXJnZW5jaWEiPC9zdHJpbmc+CkBAIC01NjgsNiArNTUzLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iUmVncmVzYXIgYSBsbGFtYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iQ29ycmVjdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iTG8gc2VudGltb3MsIHZ1ZWx2ZSBhIGludGVudGFybG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IkxvIHNlbnRpbW9zLCB2dWVsdmUgYSBpbnRlbnRhcmxvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iQ2FyZ2FuZG8gKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkNhcmdhZGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+IlNlZ21lbnRvIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01ODIsNiArNTY4LDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IkxhIHRhcmpldGEgU0lNIGVzdMOhIGJsb3F1ZWFkYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJEZXNibG9xdWVhbmRvIHRhcmpldGEgU0lN4oCmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iSGFzIGV4dHJhw61kbyBpbmNvcnJlY3RhbWVudGUgdHUgcGF0csOzbiBkZSBkZXNibG9xdWVvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlY2VzLiAiXG5cbiJWdWVsdmUgYSBpbnRlbnRhcmxvIGVuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkhhcyBpbmdyZXNhZG8gdHUgY29udHJhc2XDsWEgZGUgbWFuZXJhIGluY29ycmVjdGEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmVjZXMuICJcblxuIlZ1ZWx2ZSBhIGludGVudGFybG8gZW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IkhhcyBpbmdyZXNhZG8gdHUgUElOIGRlIG1hbmVyYSBpbmNvcnJlY3RhIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlY2VzLiAiXG5cbiJWdWVsdmUgYSBpbnRlbnRhcmxvIGVuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iSGFzIGV4dHJhw61kbyBpbmNvcnJlY3RhbWVudGUgdHUgcGF0csOzbiBkZSBkZXNibG9xdWVvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlY2VzLiBMdWVnbyBkZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBpbnRlbnRvcyBpbmNvcnJlY3Rvcywgc2UgdGUgc29saWNpdGFyw6EgcXVlIGRlc2Jsb3F1ZWVzIHR1IHRlbMOpZm9ubyBhbCBpbmljaWFyIHNlc2nDs24gZW4gR29vZ2xlLiAiXG5cbiIgVnVlbHZlIGEgaW50ZW50YXJsbyBlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iVnVlbHZlIGEgaW50ZW50YXJsbyBlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiLCv09sdmlkYXN0ZSBlbCBwYXRyw7NuPyI8L3N0cmluZz4KQEAgLTYxMCwxNCArNTk4LDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJqc19kaWFsb2dfYmVmb3JlX3VubG9hZCIgbXNnaWQ9IjE5MDE2NzU0NDgxNzk2NTMwODkiPiLCv0Rlc2VhcyBzYWxpciBkZSBlc3RhIHDDoWdpbmE/IlxuXG4iPHhsaWZmOmcgaWQ9Ik1FU1NBR0UiPiVzPC94bGlmZjpnPiJcblxuIlNlbGVjY2lvbmEgQWNlcHRhciBwYXJhIGNvbnRpbnVhciBvIENhbmNlbGFyIHBhcmEgcGVybWFuZWNlciBlbiBsYSBww6FnaW5hIGFjdHVhbC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX2xhYmVsIiBtc2dpZD0iNjg2MDI2MTc1ODY2NTgyNTA2OSI+IkNvbmZpcm1hciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRvdWJsZV90YXBfdG9hc3QiIG1zZ2lkPSIxMDY4MjE2OTM3MjQ0NTY3MjQ3Ij4iU3VnZXJlbmNpYTogcHJlc2lvbmEgZG9zIHZlY2VzIHBhcmEgYWNlcmNhciB5IGFsZWphciI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvZmlsbF90aGlzX2Zvcm0gKDg5NDAxMTA4NjY3NzUwOTc0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iMTI4NDg0MzcyODIwMzQxMjEzNSI+ImxlZXIgaGlzdG9yaWFsIHkgbWFyY2Fkb3JlcyBkZWwgbmF2ZWdhZG9yIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI0OTgxNDg5ODE1NDY3NjE3MTkxIj4iUGVybWl0ZSBhIGxhIGFwbGljYWNpw7NuIGxlZXIgdG9kYXMgbGFzIFVSTCBxdWUgaGEgdmlzaXRhZG8gZWwgbmF2ZWdhZG9yIHkgdG9kb3MgbG9zIG1hcmNhZG9yZXMgZGVsIG5hdmVnYWRvci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjkwMDk0MzQxMDk4MzYyODAzNzQiPiJlc2NyaWJpciBoaXN0b3JpYWwgeSBtYXJjYWRvcmVzIGRlbCBuYXZlZ2Fkb3IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5NDU1NzE5OTAzNTcxMTQ5NTAiPiJQZXJtaXRlIGEgdW5hIGFwbGljYWNpw7NuIG1vZGlmaWNhciBlbCBoaXN0b3JpYWwgeSBsb3MgbWFyY2Fkb3JlcyBkZWwgbmF2ZWdhZG9yIGFsbWFjZW5hZG9zIGVuIHR1IHRlbMOpZm9uby4gTGFzIGFwbGljYWNpb25lcyBtYWxpY2lvc2FzIHB1ZWRlbiB1dGlsaXphcmxvIHBhcmEgYm9ycmFyIG8gbW9kaWZpY2FyIHR1cyBkYXRvcy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRBbGFybSAoNTkyNDQwMTMyODgwMzYxNTE2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRBbGFybSAoNTk2Njk2NjU5ODE0OTg3NTA4MikgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDcxNTIxMjY1NTU5ODI3NTUzMiI+Ik1vZGlmaWNhciBsb3MgcGVybWlzb3MgZGUgdWJpY2FjacOzbiBnZW9ncsOhZmljYSBkZWwgbmF2ZWdhZG9yIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDAxMTkwODI4Mjk4MDg2MTY3OSI+IlBlcm1pdGUgcXVlIHVuYSBhcGxpY2FjacOzbiBtb2RpZmlxdWUgbG9zIHBlcm1pc29zIGRlIHViaWNhY2nDs24gZ2VvZ3LDoWZpY2EgZGVsIG5hdmVnYWRvci4gTGFzIGFwbGljYWNpb25lcyBtYWxpY2lvc2FzIHB1ZWRlbiB1dGlsaXphcmxvcyBwYXJhIHBlcm1pdGlyIGVsIGVudsOtbyBkZSBpbmZvcm1hY2nDs24gc29icmUgbGEgdWJpY2FjacOzbiBhIHNpdG9zIHdlYiBkZSBmb3JtYSBhcmJpdHJhcmlhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbWVzc2FnZSIgbXNnaWQ9Ijc2NzM0NDY4NzEzOTE5NTc5MCI+IsK/UXVpZXJlcyByZWNvcmRhciBlc3RhIGNvbnRyYXNlw7FhIGVuIGVsIG5hdmVnYWRvcj8iPC9zdHJpbmc+CkBAIC03MzAsMTQgKzcxNiwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlNlbGVjY2lvbmFyIHRvZG9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiJTZWxlY2Npb25hciBwYWxhYnJhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IkNvcnRhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iQ29waWFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iUGVnYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IkNvcGlhciBVUkwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiJTZWxlY2Npb25hciB0ZXh0by4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRleHRTZWxlY3Rpb25DQUJUaXRsZSIgbXNnaWQ9IjUyMzY4NTAzOTQzNzA4MjAzNTciPiJTZWxlY2Npw7NuIGRlIHRleHRvICI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik3DqXRvZG8gZGUgZW50cmFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJBZ3JlZ2FyIFwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiIGFsIGRpY2Npb25hcmlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iRWRpdGFyIHRleHRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSI0OTA5MTM1NTY0OTQxODE1NDk0Ij4iQWNjaW9uZXMgZGUgdGV4dG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IlBvY28gZXNwYWNpbyBkZSBhbG1hY2VuYW1pZW50byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IkhheSBwb2NvIGVzcGFjaW8gZGUgYWxtYWNlbmFtaWVudG8gZW4gZWwgdGVsw6lmb25vLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+IkFjZXB0YXIiPC9zdHJpbmc+CkBAIC03NDUsNiArNzMxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJBY2VwdGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQ2FuY2VsYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iQXRlbmNpw7NuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJDYXJnYW5kby4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iRW5jZW5kaWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iQVBBR0FETyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iQ29tcGxldGFyIGxhIGFjY2nDs24gbWVkaWFudGUiPC9zdHJpbmc+CkBAIC03NjMsOSArNzUwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiJQcm92b2NhciBhY2VyY2FtaWVudG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBvcnQiIG1zZ2lkPSI0MDYwMjE4MjYwOTg0Nzk1NzA2Ij4iTm90aWZpY2FyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiJFc3BlcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJTZSByZWRpcmlnacOzIGxhIGFwbGljYWNpw7NuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IHNlIGVzdMOhIGVqZWN1dGFuZG8gYWhvcmEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IHNlIGluaWNpw7Mgb3JpZ2luYWxtZW50ZS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iTGEgYXBsaWNhY2nDs24gPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2VzbyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIGhhIHZpb2xhZG8gc3UgcG9sw610aWNhIFN0cmljdE1vZGUgYXV0b2ltcHVlc3RhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IkVsIHByb2Nlc28gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGhhIHZpb2xhZG8gc3UgcG9sw610aWNhIFN0cmljdE1vZGUgYXV0b2ltcHVlc3RhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gQ29ycmVyIjwvc3RyaW5nPgpAQCAtODEyLDI4ICs4MDIsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1zX3Nob3dfYWxsIiBtc2dpZD0iMjY3MTc5MTE2MzkzMzA5MTE4MCI+PGI+Ik1vc3RyYXIgdG9kb3MiPC9iPjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYWN0aXZpdHlfdGl0bGUiIG1zZ2lkPSIyMzk5Mjg5OTk5NjA4OTAwNDQzIj4iQWxtYWNlbmFtaWVudG8gbWFzaXZvIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3RpdGxlIiBtc2dpZD0iNTkwMTQ1OTA0MTM5ODc1MTQ5NSI+ImNvbmVjdGFkbyBhbCBVU0IiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0Nzk2NzU5NjQ2MTY3MjQ3MTc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjgyMzE0NjI3NTAwMTAwNjY4OTYiPiJIYXMgY29uZWN0YWRvIHR1IHRlbMOpZm9ubyBhIHR1IGNvbXB1dGFkb3JhIG1lZGlhbnRlIFVTQi4gU2VsZWNjaW9uYSBlbCBib3TDs24gYSBjb250aW51YWNpw7NuIHNpIGRlc2VhcyBjb3BpYXIgbG9zIGFyY2hpdm9zIGVudHJlIHR1IGNvbXB1dGFkb3JhIHkgbGEgdGFyamV0YSBTRCBkZSBBbmRyb2lkLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4iSGFzIGNvbmVjdGFkbyB0dSB0ZWzDqWZvbm8gYSB0dSBjb21wdXRhZG9yYSBtZWRpYW50ZSBVU0IuIFNlbGVjY2lvbmEgZWwgYm90w7NuIGEgY29udGludWFjacOzbiBzaSBkZXNlYXMgY29waWFyIGxvcyBhcmNoaXZvcyBlbnRyZSB0dSBjb21wdXRhZG9yYSB5IGxhIHRhcmpldGEgU0QgZGUgQW5kcm9pZC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+IkhhcyBjb25lY3RhZG8gdHUgdGVsw6lmb25vIGEgdHUgY29tcHV0YWRvcmEgbWVkaWFudGUgVVNCLiBTZWxlY2Npb25hIGVsIGJvdMOzbiBhIGNvbnRpbnVhY2nDs24gc2kgZGVzZWFzIGNvcGlhciBsb3MgYXJjaGl2b3MgZW50cmUgdHUgY29tcHV0YWRvcmEgeSBsYSB0YXJqZXRhIFNEIGRlIEFuZHJvaWQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYnV0dG9uX21vdW50IiBtc2dpZD0iMTA1MjI1OTkzMDM2OTUwODIzNSI+IkFjdGl2YXIgZWwgYWxtYWNlbmFtaWVudG8gVVNCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjUzNDc4NDc1MTYwMzM0NTM2MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0ODE4MzQ3NzU2NDAyNzQwMjYxIj4iSGF5IHVuIHByb2JsZW1hIHBhcmEgdXRpbGl6YXIgdHUgdGFyamV0YSBTRCBlbiBlbCBhbG1hY2VuYW1pZW50byBVU0IuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiJIYXkgdW4gcHJvYmxlbWEgcGFyYSB1dGlsaXphciB0dSB0YXJqZXRhIFNEIGVuIGVsIGFsbWFjZW5hbWllbnRvIFVTQi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IkhheSB1biBwcm9ibGVtYSBwYXJhIHV0aWxpemFyIHR1IHRhcmpldGEgU0QgZW4gZWwgYWxtYWNlbmFtaWVudG8gVVNCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjgxNzU4OTI1NTQ3NTcyMTY1MjUiPiJjb25lY3RhZG8gYWwgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MzgwMDgyNDA0Mjg4MjE5MzQxIj4iU2VsZWNjaW9uYXIgcGFyYSBjb3BpYXIgYXJjaGl2b3MgZGVzZGUgbyBoYWNpYSB0dSBjb21wdXRhZG9yYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjIzMzYwNTgzOTY2NjM1MTYwMTciPiJBcGFnYXIgZWwgYWxtYWNlbmFtaWVudG8gVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI1OTE4MTM0OTAyNjk4NDE1MzkiPiJTZWxlY2Npb25hciBwYXJhIGRlc2FjdGl2YXIgZWwgYWxtYWNlbmFtaWVudG8gVVNCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfdGl0bGUiIG1zZ2lkPSI2NjAxMjk4NTE3MDg3NzU4NTMiPiJBbG1hY2VuYW1pZW50byBVU0IgZW4gdXNvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYxMzcxMzM5NjQyNjYwNDEwNCAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg3NDUzNDUyNjA3ODAyNjcxODUiPiJBbnRlcyBkZSBkZXNhY3RpdmFyIGVsIGFsbWFjZW5hbWllbnRvIFVTQiwgYXNlZ8O6cmF0ZSBkZSBoYWJlciBkZXNtb250YWRvIChcImV4cHVsc2Fkb1wiKSBsYSB0YXJqZXRhIFNEIGRlIEFuZHJvaWQgZGUgdHUgY29tcHV0YWRvcmEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IkFudGVzIGRlIGRlc2FjdGl2YXIgZWwgYWxtYWNlbmFtaWVudG8gVVNCLCBhc2Vnw7pyYXRlIGRlIGhhYmVyIGRlc21vbnRhZG8gKFwiZXhwdWxzYWRvXCIpIGxhIHRhcmpldGEgU0QgZGUgQW5kcm9pZCBkZSB0dSBjb21wdXRhZG9yYS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4iQW50ZXMgZGUgZGVzYWN0aXZhciBlbCBhbG1hY2VuYW1pZW50byBVU0IsIGFzZWfDunJhdGUgZGUgaGFiZXIgZGVzbW9udGFkbyAoXCJleHB1bHNhZG9cIikgbGEgdGFyamV0YSBTRCBkZSBBbmRyb2lkIGRlIHR1IGNvbXB1dGFkb3JhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfYnV0dG9uX21vdW50IiBtc2dpZD0iNzA2MDIxODAzNDkwMDY5NjAyOSI+IkRlc2FjdGl2YXIgZWwgYWxtYWNlbmFtaWVudG8gVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMTQzODgxOTE0ODQwNDEyMTA4Ij4iU2UgaGEgcHJvZHVjaWRvIHVuIHByb2JsZW1hIGFsIGRlc2FjdGl2YXIgZWwgYWxtYWNlbmFtaWVudG8gVVNCLiBBc2Vnw7pyYXRlIGRlIGhhYmVyIGRlc21vbnRhZG8gZWwgaG9zdCBVU0IsIGx1ZWdvIHZ1ZWx2ZSBhIGludGVudGFybG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RpdGxlIiBtc2dpZD0iOTYzMDM5MDMzNDcwNDc4Njk3Ij4iQWN0aXZhciBlbCBhbG1hY2VuYW1pZW50byBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGV4dCIgbXNnaWQ9IjMyMDI4MzgyMzQ3ODA1MDU4ODYiPiJTaSBhY3RpdmFzIGVsIGFsbWFjZW5hbWllbnRvIFVTQiwgYWxndW5hcyBhcGxpY2FjaW9uZXMgcXVlIGVzdMOhcyB1c2FuZG8gc2UgZGV0ZW5kcsOhbiB5IGVzIHBvc2libGUgcXVlIG5vIGVzdMOpbiBkaXNwb25pYmxlcyBoYXN0YSBxdWUgZGVzYWN0aXZlcyBlbCBhbG1hY2VuYW1pZW50byBVU0IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2Vycm9yX3RpdGxlIiBtc2dpZD0iODA0ODk5OTk3MzgzNzMzOTE3NCI+IkVycm9yIGVuIGVsIGZ1bmNpb25hbWllbnRvIGRlbCBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfb2siIG1zZ2lkPSI3Mzc2OTUzMTY3MDM5ODY1NzAxIj4iQWNlcHRhciI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg2NjMyNDc5Mjk1NTEwOTU4NTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NTc3OTA4MDA2OTQ5NzQyMjE3Ij4iRm9ybWF0ZWFyIHRhcmpldGEgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4NjYzMjQ3OTI5NTUxMDk1ODU0Ij4iRm9ybWF0ZWFyIHRhcmpldGEgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjIxMzY5OTYyNDMzNTIzNjE5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNDcwODE1MTQwMDY4NTAyODI0Ij4iwr9Fc3TDoXMgc2VndXJvIGRlIHF1ZSBxdWllcmVzIGZvcm1hdGVhciBsYSB0YXJqZXRhIFNEPyBTZSBwZXJkZXLDoW4gdG9kb3MgbG9zIGRhdG9zIGRlIHR1IHRhcmpldGEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4iwr9Fc3TDoXMgc2VndXJvIGRlIHF1ZSBxdWllcmVzIGZvcm1hdGVhciBsYSB0YXJqZXRhIFNEPyBTZSBwZXJkZXLDoW4gdG9kb3MgbG9zIGRhdG9zIGRlIHR1IHRhcmpldGEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IkZvcm1hdGVhciB0YXJqZXRhIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4iwr9Fc3TDoXMgc2VndXJvIGRlIHF1ZSBxdWllcmVzIGZvcm1hdGVhciBsYSB0YXJqZXRhIFNEPyBTZSBwZXJkZXLDoW4gdG9kb3MgbG9zIGRhdG9zIGRlIHR1IHRhcmpldGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X2J1dHRvbl9mb3JtYXQiIG1zZ2lkPSI0MTMxMDY0NTYwMTI3NDc4Njk1Ij4iRm9ybWF0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTA0NDc3ODk0OTE4OTkxOCI+IkRlcHVyYWNpw7NuIGRlIFVTQiBjb25lY3RhZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODQ3MDI5NjgxODI3MDExMDM5NiI+IlNlbGVjY2lvbmFyIHBhcmEgZGVzYWN0aXZhciBsYSBkZXB1cmFjacOzbiBkZSBVU0IuIjwvc3RyaW5nPgpAQCAtODQxLDI5ICs4MjYsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX2FscGhhYmV0IiBtc2dpZD0iNTQzMzI3NTQ4NTQ5OTAzOTE5OSI+IiBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX251bWVyaWNfYWxwaGFiZXQiIG1zZ2lkPSI0MDMwMTcwNTI0NTk1MTIzNjEwIj4iIDAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhbmRpZGF0ZXNfc3R5bGUiIG1zZ2lkPSI0MzMzOTEzMDg5NjM3MDYyMjU3Ij48dT4iY2FuZGlkYXRvcyI8L3U+PC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NDU3NjAzNDE4OTcwOTk0MDUwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQyMzk1MTY2NzUwMjg0Mzg5OTciPiJQcmVwYXJhY2nDs24gZGUgbGEgdGFyamV0YSBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4iUHJlcGFyYWNpw7NuIGRlIGxhIHRhcmpldGEgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IlByZXBhcmFjacOzbiBkZSBsYSB0YXJqZXRhIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODI4NzMxOTg4MjkyNjczNzA1MyI+IlZlcmlmaWNhbmRvIGVycm9yZXMiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3ODA0Nzc4MzgyNDEyMTI5OTcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzOTM3MzQ1NTc3OTgzNzMwODczIj4iVGFyamV0YSBTRCB2YWPDrWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI3ODA0Nzc4MzgyNDEyMTI5OTciPiJUYXJqZXRhIFNEIHZhY8OtYSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDEzMTIyNjY4MjAwOTI5NTgwMTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE2MDY2NjA3NTYxMjQ2Mjk3MDgiPiJMYSB0YXJqZXRhIFNEIGVzdMOhIHZhY8OtYSBvIHV0aWxpemEgdW4gZmlsZXN5c3RlbSBubyBhZG1pdGlkby4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJUYXJqZXRhIFNEIGVuIGJsYW5jbyBvIGVsIHNpc3RlbWEgZGUgYXJjaGl2b3Mgbm8gZXMgY29tcGF0aWJsZS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NDEwNzIzOTA2MDE5MTAwMTg5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE3MjQ2MTk5MDIwNzY1Mjg4ODkiPiJUYXJqZXRhIFNEIGRhw7FhZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjQxMDcyMzkwNjAxOTEwMDE4OSI+IlRhcmpldGEgU0QgZGHDsWFkYSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI2Nzk0MTI4ODQyOTAwNjE3NzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NDYwMzExODM1MTMwNjcxMTk0Ij4iTGEgdGFyamV0YSBTRCBlc3TDoSBkYcOxYWRhLiBFcyBwb3NpYmxlIHF1ZSBkZWJhcyByZWZvcm1hdGVhciB0dSB0YXJqZXRhLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY5MDI1MzE3NzU5NDgyMzg5ODkiPiJUYXJqZXRhIFNEIGRhw7FhZGEuIEVzIHBvc2libGUgcXVlIGRlYmFzIHJlZm9ybWF0ZWFybGEuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjg3MjE1Mjg4MjYwNDQwNzgzNyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI1ODIxNzUwMTYwNjA0MzIwMzQiPiJUYXJqZXRhIFNEIGV4dHJhw61kYSBkZSBmb3JtYSBpbXByZXZpc3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjg3MjE1Mjg4MjYwNDQwNzgzNyI+IlRhcmpldGEgU0QgZXh0cmHDrWRhIGRlIGZvcm1hIGltcHJldmlzdGEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3MjYwMTgzMjkzNzQ3NDQ4MjQxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyMDA1Mzk2NDY0NDk0NjQ4OTM3Ij4iRGVzbW9udGFyIGxhIHRhcmpldGEgU0QgYW50ZXMgZGUgZXh0cmFlcmxhIHBhcmEgZXZpdGFyIGxhIHDDqXJkaWRhIGRlIGRhdG9zLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+IkRlc21vbnRhciBsYSB0YXJqZXRhIFNEIGFudGVzIGRlIGV4dHJhZXJsYSBwYXJhIGV2aXRhciBsYSBww6lyZGlkYSBkZSBkYXRvcy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NzI5ODAxMTMwNzkwNjE2MjAwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNjUyNTg4MTAxODY3OTUxNSI+IlRhcmpldGEgU0QgZsOhY2lsIGRlIGV4dHJhZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJUYXJqZXRhIFNEIGbDoWNpbCBkZSBleHRyYWVyIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzYxMzk2MDY4Njc0NzU5Mjc3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI3NTAzNzY5MTA2Mjg1MTg4NzAzIj4iTGEgdGFyamV0YSBTRCBhaG9yYSBzZSBwdWVkZSBleHRyYWVyIGRlIG1hbmVyYSBzZWd1cmEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IlB1ZWRlcyBlbGltaW5hciBsYSB0YXJqZXRhIFNEIHNpbiByaWVzZ29zLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg5MDI1MTgwMzA0MDQzODEzMTggLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxODc0ODg5NzY0MzY3MDg1NTYyIj4iVGFyamV0YSBTRCBleHRyYcOtZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4OTAyNTE4MDMwNDA0MzgxMzE4Ij4iVGFyamV0YSBTRCBleHRyYcOtZGEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MjA1MTE3MjI3MzQyODIyMjc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNzMwODkwNDQxMzMxMzQ0Nzc2Ij4iU2UgZXh0cmFqbyBsYSBTRC4gSW5zZXJ0YSB1bmEgbnZhLiB0YXJqZXRhIFNEIHBhcmEgYXVtZW50YXIgZWwgZXNwYWNpbyBkZSBhbG1hYy4gZGUgdHUgZGlzcG9zaXQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iVGFyamV0YSBTRCBlbGltaW5hZGEuIEluc2VydGEgdW5hIG51ZXZhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IlRhcmpldGEgU0QgdmFjw61hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iVGFyamV0YSBTRCBlbiBibGFuY28gbyBlbCBzaXN0ZW1hIGRlIGFyY2hpdm9zIG5vIGVzIGNvbXBhdGlibGUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJUYXJqZXRhIFNEIGRhw7FhZGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iVGFyamV0YSBTRCBkYcOxYWRhLiBFcyBwb3NpYmxlIHF1ZSBkZWJhcyByZWZvcm1hdGVhcmxhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJUYXJqZXRhIFNEIGV4dHJhw61kYSBkZSBmb3JtYSBpbXByZXZpc3RhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4iRGVzbW9udGFyIGxhIHRhcmpldGEgU0QgYW50ZXMgZGUgZXh0cmFlcmxhIHBhcmEgZXZpdGFyIGxhIHDDqXJkaWRhIGRlIGRhdG9zLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+IlRhcmpldGEgU0QgZsOhY2lsIGRlIGV4dHJhZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4iUHVlZGVzIGVsaW1pbmFyIGxhIHRhcmpldGEgU0Qgc2luIHJpZXNnb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IlRhcmpldGEgU0QgZXh0cmHDrWRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iVGFyamV0YSBTRCBlbGltaW5hZGEuIEluc2VydGEgdW5hIG51ZXZhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X2xpc3RfZW1wdHkiIG1zZ2lkPSI0MTY4ODIwNjA5NDAzMzg1Nzg5Ij4iTm8gc2UgZW5jb250cmFyb24gYWN0aXZpZGFkZXMgY29pbmNpZGVudGVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODc4NzM1MjA3NDMyNjc0ODg5MiI+ImFjdHVhbGl6YXIgbGEgZXN0YWTDrXN0aWNhIGRlIHVzbyBkZSBsb3MgY29tcG9uZW50ZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODkxNTUzNjk1NzE2NzUyODM1Ij4iUGVybWl0ZSBsYSBtb2RpZmljYWNpw7NuIGRlIGVzdGFkw61zdGljYXMgcmVjb3BpbGFkYXMgc29icmUgZWwgdXNvIGRlIGNvbXBvbmVudGVzLiBMYXMgYXBsaWNhY2lvbmVzIG5vcm1hbGVzIG5vIGRlYmVuIHV0aWxpemFybG8uIjwvc3RyaW5nPgpAQCAtODk4LDE1ICs4NzIsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJDbGF2ZSBwcmV2aWFtZW50ZSBjb21wYXJ0aWRhIHNlZ8O6biBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJDZXJ0aWZpY2FkbyBzZWfDum4gTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJFbGVnaXIgYXJjaGl2byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+Ik5vIHNlIHNlbGVjY2lvbsOzIHVuIGFyY2hpdm8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVzdGFibGVjZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iRW52aWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJmYXZvcml0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+Ik1vZG8gYXV0byBoYWJpbGl0YWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IlNlbGVjY2lvbmFyIHBhcmEgc2FsaXIgZGVsIG1vZG8gYXV0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJBbmNsYWplIGEgcmVkIG8gem9uYSBhY3RpdmEgY29uZWN0YWRvcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRvY2FyIHBhcmEgY29uZmlndXJhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IkF0csOhcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IlNpZ3VpZW50ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+Ik9taXRpciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IkFtcGxpYSB1dGlsaXphY2nDs24gZGUgZGF0b3MgbcOzdmlsZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IlRvY2EgcGFyYSBvYnRlbmVyIG3DoXMgaW5mb3JtYWNpw7NuIGFjZXJjYSBkZSBsYSB1dGlsaXphY2nDs24gZGUgZGF0b3MgbcOzdmlsZXMuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJMw61taXRlIGRlIGRhdG9zIG3Ds3ZpbGVzIGV4Y2VkaWRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJMw61taXRlIGRlIGRhdG9zIG3Ds3ZpbGVzIGV4Y2VkaWRvICI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiJUb2NhIHBhcmEgb2J0ZW5lciBtw6FzIGluZm9ybWFjacOzbiBhY2VyY2EgZGUgbGEgdXRpbGl6YWNpw7NuIGRlIGRhdG9zIG3Ds3ZpbGVzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX21hdGNoZXMiIG1zZ2lkPSI4MTI5NDIxOTA4OTE1ODQwNzM3Ij4iU2luIGNvaW5jaWRlbmNpYXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmaW5kX29uX3BhZ2UiIG1zZ2lkPSIxOTQ2Nzk5MjMzODIyODIwMzg0Ij4iQnVzY2FyIGVuIGxhIHDDoWdpbmEiPC9zdHJpbmc+CisgIDxwbHVyYWxzIG5hbWU9Im1hdGNoZXNfZm91bmQiPgorICAgIDxpdGVtIHF1YW50aXR5PSJvbmUiIG1zZ2lkPSI4MTY3MTQ3MDgxMTM2NTc5NDM5Ij4iMSBjb2luY2lkZW5jaWEiPC9pdGVtPgorICAgIDxpdGVtIHF1YW50aXR5PSJvdGhlciIgbXNnaWQ9IjQ2NDE4NzI3OTcwNjc2MDkxNzciPiI8eGxpZmY6ZyBpZD0iSU5ERVgiPiVkPC94bGlmZjpnPiBkZSA8eGxpZmY6ZyBpZD0iVE9UQUwiPiVkPC94bGlmZjpnPiI8L2l0ZW0+CisgIDwvcGx1cmFscz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKaW5kZXggMGNiNGJhYi4uMTBlY2FjYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCkBAIC0xNjksOCArMTY5LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGxhYl9kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iMzQ0NjE2NDU4NDcxMDU5NjUxMyI+IkhlcnJhbWllbnRhcyBkZSBkZXNhcnJvbGxvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iOTA1NjQzMTE5Mzg5MzgwOTgxNCI+IkZ1bmNpb25lcyBuZWNlc2FyaWFzIHNvbG8gcGFyYSBkZXNhcnJvbGxhZG9yZXMgZGUgYXBsaWNhY2lvbmVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX3N0b3JhZ2UiIG1zZ2lkPSIxOTcxMTE4NzcwNTQ2MzM2OTY2Ij4iQWxtYWNlbmFtaWVudG8iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MjAzMzAyMjE0OTE1MzU1Nzc0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNTQ1NTgwNDM1MzIyMDU4MTMxMiI+IkFjY2VkZXIgYSBsYSB0YXJqZXRhIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IkFjY2VkZXIgYSBsYSB0YXJqZXRhIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IkFjY2VkZXIgYSBsYSB0YXJqZXRhIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXIiIG1zZ2lkPSI3NDE3MTkyNjI5NjAxODkwNzkxIj4iaW5oYWJpbGl0YXIgbyBtb2RpZmljYXIgbGEgYmFycmEgZGUgZXN0YWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc3RhdHVzQmFyIiBtc2dpZD0iMTM2NTQ3MzU5NTMzMTk4OTczMiI+IlBlcm1pdGUgcXVlIGxhcyBhcGxpY2FjaW9uZXMgaW5oYWJpbGl0ZW4gbGEgYmFycmEgZGUgZXN0YWRvLCBvIGHDsWFkYW4geSBlbGltaW5lbiBpY29ub3MgZGVsIHNpc3RlbWEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXJTZXJ2aWNlIiBtc2dpZD0iNzI0NzI4MTkxMTM4NzkzMTQ4NSI+ImJhcnJhIGRlIGVzdGFkbyI8L3N0cmluZz4KQEAgLTI2Nyw4ICsyNjYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NsZWFyQXBwQ2FjaGUiIG1zZ2lkPSI3NzQwNDY1Njk0MTkzNjcxNDAyIj4iUGVybWl0ZSBxdWUgdW5hIGFwbGljYWNpw7NuIGxpYmVyZSBlc3BhY2lvIGRlIGFsbWFjZW5hbWllbnRvIGVuIGVsIHRlbMOpZm9ubyBtZWRpYW50ZSBsYSBlbGltaW5hY2nDs24gZGUgYXJjaGl2b3MgZW4gZWwgZGlyZWN0b3JpbyBkZSBjYWNow6kgZGUgbGEgYXBsaWNhY2nDs24uIEVsIGFjY2VzbyBhbCBwcm9jZXNvIGRlbCBzaXN0ZW1hIHN1ZWxlIGVzdGFyIG11eSByZXN0cmluZ2lkby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX21vdmVQYWNrYWdlIiBtc2dpZD0iNzI4NDU0OTc5OTQ2NTAzOTI2Ij4iTW92ZXIgcmVjdXJzb3MgZGUgYXBsaWNhY2lvbmVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW92ZVBhY2thZ2UiIG1zZ2lkPSI2MzIzMDQ5MjkxOTIzOTI1Mjc3Ij4iUGVybWl0ZSBxdWUgdW5hIGFwbGljYWNpw7NuIG11ZXZhIGxvcyByZWN1cnNvcyBkZSBhcGxpY2FjaW9uZXMgZGUgdW4gbWVkaW8gaW50ZXJubyBhIG90cm8gZXh0ZXJubyB5IHZpY2V2ZXJzYS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0ODExOTIxNzAzODgyNTMyMDcwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRMb2dzIiBtc2dpZD0iNjYxNTc3ODU0MzE5ODk2NzYxNCI+ImxlZXIgYXJjaGl2b3MgZGUgcmVnaXN0cm8gZGVsIHNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyMjU3OTM3OTU1NTgwNDc1OTAyIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkTG9ncyIgbXNnaWQ9Ijg4OTY0NDk0Mzc0NjQ4Njc3NjYiPiJQZXJtaXRlIHF1ZSB1bmEgYXBsaWNhY2nDs24gbGVhIGxvcyBkaXN0aW50b3MgYXJjaGl2b3MgZGUgcmVnaXN0cm8gZGVsIHNpc3RlbWEuIENvbiBlc3RlIHBlcm1pc28sIGxhIGFwbGljYWNpw7NuIHB1ZWRlIHZlciBpbmZvcm1hY2nDs24gZ2VuZXJhbCBzb2JyZSBsYXMgYWNjaW9uZXMgcXVlIHJlYWxpemEgZWwgdXN1YXJpbyBjb24gZWwgdGVsw6lmb25vLCBwZXJvIGxvcyByZWdpc3Ryb3Mgbm8gZGViZXLDrWFuIGNvbnRlbmVyIGluZm9ybWFjacOzbiBwZXJzb25hbCBvIHByaXZhZGEuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZExvZ3MgKDY2MTU3Nzg1NDMxOTg5Njc2MTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZExvZ3MgKDg4OTY0NDk0Mzc0NjQ4Njc3NjYpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2RpYWdub3N0aWMiIG1zZ2lkPSI4MDc2NzQzOTUzOTA4MDAwMzQyIj4ibGVlci9lc2NyaWJpciBlbiBsb3MgcmVjdXJzb3MgcHJvcGllZGFkIGRlbCBncnVwbyBkZSBkaWFnbsOzc3RpY28iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaWFnbm9zdGljIiBtc2dpZD0iMzEyMTIzODM3Mzk1MTYzNzA0OSI+IlBlcm1pdGUgcXVlIHVuYSBhcGxpY2FjacOzbiBsZWEgeSBlc2NyaWJhIGVuIGN1YWxxdWllciByZWN1cnNvIHByb3BpZWRhZCBkZWwgZ3J1cG8gZGUgZGlhZ27Ds3N0aWNvIGNvbW8sIHBvciBlamVtcGxvLCBhcmNoaXZvcyBpbi9kZXYuIEVzdGUgcGVybWlzbyBwb2Ryw61hIGFmZWN0YXIgYSBsYSBzZWd1cmlkYWQgeSBlc3RhYmlsaWRhZCBkZWwgc2lzdGVtYS4gU8OTTE8gc2UgZGViZSB1dGlsaXphciBwYXJhIGRpYWduw7NzdGljb3MgZXNwZWPDrWZpY29zIGRlIGhhcmR3YXJlIHJlYWxpemFkb3MgcG9yIGVsIGZhYnJpY2FudGUgbyBlbCBvcGVyYWRvci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NoYW5nZUNvbXBvbmVudFN0YXRlIiBtc2dpZD0iNzk0MjUxOTg4MzQzMjk0MDYiPiJoYWJpbGl0YXIgbyBpbmhhYmlsaXRhciBjb21wb25lbnRlcyBkZSBsYSBhcGxpY2FjacOzbiI8L3N0cmluZz4KQEAgLTQwMywyMiArNDA0LDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aEFkbWluIiBtc2dpZD0iNzI1NjI4OTc3NDY2NzA1NDU1NSI+IlBlcm1pdGUgcXVlIHVuYSBhcGxpY2FjacOzbiBjb25maWd1cmUgZWwgdGVsw6lmb25vIEJsdWV0b290aCBsb2NhbCwgeSB2ZWEgZGlzcG9zaXRpdm9zIHJlbW90b3MgeSBzaW5jcm9uaWNlIGVsIHRlbMOpZm9ubyBjb24gZWxsb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ibHVldG9vdGgiIG1zZ2lkPSI4MzYxMDM4NzA3ODU3MDE4NzMyIj4iY3JlYXIgY29uZXhpb25lcyBkZSBCbHVldG9vdGgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGgiIG1zZ2lkPSI3NjI1MTUzODA2NzkzOTI5NDUiPiJQZXJtaXRlIHF1ZSB1bmEgYXBsaWNhY2nDs24gdmVhIGxhIGNvbmZpZ3VyYWNpw7NuIGRlbCB0ZWzDqWZvbm8gQmx1ZXRvb3RoIGxvY2FsLCB5IGNyZWUgeSBhY2VwdGUgY29uZXhpb25lcyBjb24gbG9zIGRpc3Bvc2l0aXZvcyBzaW5jcm9uaXphZG9zLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0FkbWluICgyMjUxMzAyMjMzMDEyMjUwMDU2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0FkbWluICgxOTM1ODQyNjExNDY0ODk1Nzg1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjUmF3ICg0NDIzNDcxNzExMTE0MzI1NzA4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY1JhdyAoNTUzMzAyMjczNjU1OTM4NTY2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY05vdGlmeSAoNDc4NDcwMzYwMDgyNzkyMzU4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY05vdGlmeSAoMjk5MDA1MzUxNzk2MjA3MDYxNykgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0xsY3AgKDQ5NzIwNTE0NjEwMDcwMzA0MjYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTGxjcCAoOTE1OTIxMjc3ODYwMDQ2NDApIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjQ5Nzc0MDYxNjQzMTE1MzUwOTIiPiJpbmhhYmlsaXRhciBibG9xdWVvIGRlbCB0ZWNsYWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iMzE4OTc2MzQ3OTMyNjMwMjAxNyI+IlBlcm1pdGUgcXVlIHVuYSBhcGxpY2FjacOzbiBpbmhhYmlsaXRlIGVsIGJsb3F1ZW8gZGVsIHRlY2xhZG8geSBjdWFscXVpZXIgcHJvdGVjY2nDs24gY29uIGNvbnRyYXNlw7FhIGFzb2NpYWRhLiBVbiBlamVtcGxvIGxlZ8OtdGltbyBkZSBlc3RlIHBlcm1pc28gZXMgbGEgaW5oYWJpbGl0YWNpw7NuIHBvciBwYXJ0ZSBkZWwgdGVsw6lmb25vIGRlbCBibG9xdWVvIGRlbCB0ZWNsYWRvIGN1YW5kbyByZWNpYmUgdW5hIGxsYW1hZGEgdGVsZWbDs25pY2EgZW50cmFudGUgeSBzdSBwb3N0ZXJpb3IgaGFiaWxpdGFjacOzbiBjdWFuZG8gZmluYWxpemEgbGEgbGxhbWFkYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRTeW5jU2V0dGluZ3MiIG1zZ2lkPSI2MjAxODEwMDA4MjMwNTAzMDUyIj4ibGVlciBsYSBjb25maWd1cmFjacOzbiBkZSBzaW5jcm9uaXphY2nDs24iPC9zdHJpbmc+CkBAIC00MzUsMjIgKzQyMCwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSIxMDgyOTcyNjAzNTc2MzYwNjkwIj4iUGVybWl0ZSBhIHVuYSBhcGxpY2FjacOzbiBsZWVyIGN1YWxxdWllciBmcmFzZSwgcGFsYWJyYSBvIG5vbWJyZSBwcml2YWRvIHF1ZSBlbCB1c3VhcmlvIGhheWEgYWxtYWNlbmFkbyBlbiBzdSBkaWNjaW9uYXJpby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjY3MDMxMDk1MTE4MzYzNDMzNDEiPiJlc2NyaWJpciBlbiBlbCBkaWNjaW9uYXJpbyBkZWZpbmlkbyBwb3IgZWwgdXN1YXJpbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyNDEyNTYyMDY1MjQwODI4ODAiPiJQZXJtaXRlIGEgdW5hIGFwbGljYWNpw7NuIGVzY3JpYmlyIHBhbGFicmFzIG51ZXZhcyBlbiBlbCBkaWNjaW9uYXJpbyBkZSB1c3VhcmlvLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDgwNzk0MDM3NTkwMDE3NzcyOTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iOTkzNzA3NDM2OTQxMDE2OTEzIj4ibW9kaWZpY2FyL2VsaW1pbmFyIGNvbnRlbmlkbyBkZSBsYSB0YXJqZXRhIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJtb2RpZmljYXIvZWxpbWluYXIgY29udGVuaWRvIGRlIGxhIHRhcmpldGEgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NjQzOTYzMjA0OTc2NDcxODc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MTMxODcxNTQxMTI3MjExNTI2Ij4iUGVybWl0ZSBxdWUgdW5hIGFwbGljYWNpw7NuIGVzY3JpYmEgZW4gbGEgdGFyamV0YSBTRC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiJQZXJtaXRlIHF1ZSB1bmEgYXBsaWNhY2nDs24gZXNjcmliYSBlbiBsYSB0YXJqZXRhIFNELiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4ibW9kaWZpY2FyL2VsaW1pbmFyIGNvbnRlbmlkbyBkZSBsYSB0YXJqZXRhIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4iUGVybWl0ZSBxdWUgdW5hIGFwbGljYWNpw7NuIGVzY3JpYmEgZW4gbGEgdGFyamV0YSBTRC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSI1NjU2NDg3MjY0ODE5NjY5ODI0Ij4iYWNjZWRlciBhbCBzaXN0ZW1hIGRlIGFyY2hpdm9zIGFsbWFjZW5hZG8gZW4gY2FjaMOpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjE2MjQ3MzQ1Mjg0MzU2NTk5MDYiPiJQZXJtaXRlIHF1ZSB1bmEgYXBsaWNhY2nDs24gbGVhIHkgZXNjcmliYSBlbCBzaXN0ZW1hIGRlIGFyY2hpdm9zIGFsbWFjZW5hZG8gZW4gY2FjaMOpLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQzMDc4NjE0OTYzMDI4NTAyMDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDQ5NzQyMDcyODg1NzU4NTc5MSI+IkxpbWl0YXIgb3BjaW9uZXMgZGUgY29udHJhc2XDsWEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxNzE5ODc3MjQ1NjkyMzE4Mjk5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI5MDgzNDAwMDgwODYxNzI4MDU2Ij4iUGVybWl0ZSByZXN0cmluZ2lyIGxvcyB0aXBvcyBkZSBjb250cmFzZcOxYXMgcXVlIHB1ZWRlIHV0aWxpemFyIGVsIHVzdWFyaW8uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzM3NDc4MDcxMjY2NDI4NTMyMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI5MTQxMzA2NDY5NDIxOTk1MDMiPiJDb250cm9sYXIgaW50ZW50b3MgZGUgYWNjZXNvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTk2MTI1MTE3OTYyNDg0MzQ4MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iNzIyNzU3ODI2MDE2NTE3MjY3MyI+IlNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBpbnRlbnRhciBjb250cm9sYXIgZWwgYWNjZXNvIGFsIGRpc3Bvc2l0aXZvIHBhcmEgcmVhbGl6YXIgdW5hIGFjY2nDs24uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTA4NDc3MjA5MDc5NzQ4NTQyMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIyNjIwMDc3MTkxMjQyNjg4OTU1Ij4iUmVzdGFibGVjZXIgY29udHJhc2XDsWEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzMzMyMTY3NjAwMzMxNzk5OTkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI1MzkxMjQwNjE2OTgxMjk3MzYxIj4iUGVybWl0ZSBmb3J6YXIgbGEgY29udHJhc2XDsWEgcGFyYSBlc3RhYmxlY2VyIHVuIHZhbG9yIG51ZXZvIHF1ZSBlbCBhZG1pbmlzdHJhZG9yIGRlYmVyw6EgcHJvcG9yY2lvbmFyIGFsIHVzdWFyaW8gcGFyYSBwb2RlciBhY2NlZGVyLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU3NjA0NjYwMjUyNDc2MzQ0ODggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSIyMjc0MDg1Mzg0NzA0MjQ4NDMxIj4iRm9yemFyIGJsb3F1ZW8iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyODE5ODY4NjY0OTQ2MDg5NzQwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjU2OTY5NjQxMjYyMjYwMjg0NDIiPiJQZXJtaXRlIGNvbnRyb2xhciBlbCBtb21lbnRvIGRlIGJsb3F1ZW8gZGVsIGRpc3Bvc2l0aXZvIHNvbGljaXRhbmRvIGFsIHVzdWFyaW8gcXVlIHZ1ZWx2YSBhIGludHJvZHVjaXIgbGEgY29udHJhc2XDsWEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0MzA3ODYxNDk2MzAyODUwMjAxIj4iTGltaXRhciBvcGNpb25lcyBkZSBjb250cmFzZcOxYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjE3MTk4NzcyNDU2OTIzMTgyOTkiPiJQZXJtaXRlIHJlc3RyaW5naXIgbG9zIHRpcG9zIGRlIGNvbnRyYXNlw7FhcyBxdWUgcHVlZGUgdXRpbGl6YXIgZWwgdXN1YXJpby4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjczNzQ3ODA3MTI2NjQyODUzMjEiPiJDb250cm9sYXIgaW50ZW50b3MgZGUgYWNjZXNvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iMTk2MTI1MTE3OTYyNDg0MzQ4MyI+IlNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBhbCBpbnRlbnRhciBjb250cm9sYXIgZWwgYWNjZXNvIGFsIGRpc3Bvc2l0aXZvIHBhcmEgcmVhbGl6YXIgdW5hIGFjY2nDs24uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI5MDg0NzcyMDkwNzk3NDg1NDIwIj4iUmVzdGFibGVjZXIgY29udHJhc2XDsWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIzMzMyMTY3NjAwMzMxNzk5OTkxIj4iUGVybWl0ZSBmb3J6YXIgbGEgY29udHJhc2XDsWEgcGFyYSBlc3RhYmxlY2VyIHVuIHZhbG9yIG51ZXZvIHF1ZSBlbCBhZG1pbmlzdHJhZG9yIGRlYmVyw6EgcHJvcG9yY2lvbmFyIGFsIHVzdWFyaW8gcGFyYSBwb2RlciBhY2NlZGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSI1NzYwNDY2MDI1MjQ3NjM0NDg4Ij4iRm9yemFyIGJsb3F1ZW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJQZXJtaXRlIGNvbnRyb2xhciBlbCBtb21lbnRvIGRlIGJsb3F1ZW8gZGVsIGRpc3Bvc2l0aXZvIHNvbGljaXRhbmRvIGFsIHVzdWFyaW8gcXVlIHZ1ZWx2YSBhIGludHJvZHVjaXIgbGEgY29udHJhc2XDsWEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkJvcnJhciB0b2RvcyBsb3MgZGF0b3MiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyMzE0MDYwOTMzNzk2Mzk2MjA1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iNzY2OTg5NTMzMzgxNDIyMjU4NiI+IlBlcm1pdGUgcmVhbGl6YXIgdW4gcmVzdGFibGVjaW1pZW50byBkZSBmw6FicmljYSBlbGltaW5hbmRvIHRvZG9zIGxvcyBkYXRvcyBzaW4gY29uZmlybWFjacOzbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IlBlcm1pdGUgcmVhbGl6YXIgdW4gcmVzdGFibGVjaW1pZW50byBkZSBmw6FicmljYSBlbGltaW5hbmRvIHRvZG9zIGxvcyBkYXRvcyBzaW4gY29uZmlybWFjacOzbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSIgbXNnaWQ9IjYzODc0OTc0NjY2NjAxNTQ5MzEiPiJEZWZpbmUgZWwgc2Vydmlkb3IgcHJveHkgZ2xvYmFsIHF1ZSBzZSBkZWJlIHV0aWxpemFyIG1pZW50cmFzIGxhIHBvbMOtdGljYSBlc3TDqSBoYWJpbGl0YWRhLiBTb2xvIGVsIHByaW1lciBhZG1pbmlzdHJhZG9yIGRlIGRpc3Bvc2l0aXZvcyBkZWZpbmUgZWwgc2Vydmlkb3IgcHJveHkgZ2xvYmFsIGVmZWN0aXZvLiI8L3N0cmluZz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkNhc2EiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJNw7N2aWwiPC9pdGVtPgpAQCAtNTUyLDEwICs1MzgsOSBAQAogICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVPdGhlciAoNDQwODQzNjE2Mjk1MDExOTg0OSkgLS0+CiAgICAgPHNraXAgLz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJhIHRyYXbDqXMgZGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiBhIHRyYXbDqXMgZGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJJbnRyb2R1Y2UgZWwgY8OzZGlnbyBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IkludHJvZHVjaXIgY29udHJhc2XDsWEgcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iSW50cm9kdWNpciBQSU4gcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkVsIGPDs2RpZ28gUElOIGVzIGluY29ycmVjdG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlBhcmEgZGVzYmxvcXVlYXIgZWwgdGVsw6lmb25vLCBwdWxzYSBsYSB0ZWNsYSBkZSBtZW7DuiB5LCBhIGNvbnRpbnVhY2nDs24sIHB1bHNhIDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik7Dum1lcm8gZGUgZW1lcmdlbmNpYSI8L3N0cmluZz4KQEAgLTU2OCw2ICs1NTMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJWb2x2ZXIgYSBsbGFtYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iQ29ycmVjdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iSW50w6ludGFsbyBkZSBudWV2byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iSW50w6ludGFsbyBkZSBudWV2byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IkNhcmdhbmRvICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJDYXJnYWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTgyLDYgKzU2OCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJJbnRyb2R1Y2UgZWwgY8OzZGlnbyBQSU4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iRGVzYmxvcXVlYW5kbyB0YXJqZXRhIFNJTS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IkhhcyByZWFsaXphZG8gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gaW50ZW50b3MgZmFsbGlkb3MgZGUgY3JlYWNpw7NuIGRlIHVuIHBhdHLDs24gZGUgZGVzYmxvcXVlby4gIlxuXG4iSW50w6ludGFsbyBkZSBudWV2byBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iSGFzIGludHJvZHVjaWRvIHVuYSBjb250cmFzZcOxYSBpbmNvcnJlY3RhIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlY2VzLiAiXG5cbiJJbnTDqW50YWxvIGRlIG51ZXZvIGRlbnRybyBkZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iSGFzIGludHJvZHVjaWRvIHVuIFBJTiBpbmNvcnJlY3RvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlY2VzLiAiXG5cbiJJbnTDqW50YWxvIGRlIG51ZXZvIGRlbnRybyBkZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IkhhcyByZWFsaXphZG8gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gaW50ZW50b3MgZmFsbGlkb3MgZGUgY3JlYWNpw7NuIGRlbCBwYXRyw7NuIGRlIGRlc2Jsb3F1ZW8uIFNpIHJlYWxpemFzIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IGludGVudG9zIGZhbGxpZG9zIG3DoXMsIHNlIHRlIHBlZGlyw6EgcXVlIGRlc2Jsb3F1ZWVzIGVsIHRlbMOpZm9ubyBjb24gdHVzIGNyZWRlbmNpYWxlcyBkZSBhY2Nlc28gZGUgR29vZ2xlLiJcblxuIiBFc3BlcmEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MgZSBpbnTDqW50YWxvIGRlIG51ZXZvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJFc3BlcmEgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zIHkgdnVlbHZlIGEgaW50ZW50YXJsby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IsK/SGFzIG9sdmlkYWRvIGVsIHBhdHLDs24/Ijwvc3RyaW5nPgpAQCAtNjEwLDE0ICs1OTgsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ19iZWZvcmVfdW5sb2FkIiBtc2dpZD0iMTkwMTY3NTQ0ODE3OTY1MzA4OSI+IsK/UXVpZXJlcyBzYWxpciBkZSBlc3RhIHDDoWdpbmE/IlxuXG4iPHhsaWZmOmcgaWQ9Ik1FU1NBR0UiPiVzPC94bGlmZjpnPiJcblxuIlNlbGVjY2lvbmEgXCJBY2VwdGFyXCIgcGFyYSBjb250aW51YXIgbyBcIkNhbmNlbGFyXCIgcGFyYSBwZXJtYW5lY2VyIGVuIGxhIHDDoWdpbmEgYWN0dWFsLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbGFiZWwiIG1zZ2lkPSI2ODYwMjYxNzU4NjY1ODI1MDY5Ij4iQ29uZmlybWFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZG91YmxlX3RhcF90b2FzdCIgbXNnaWQ9IjEwNjgyMTY5MzcyNDQ1NjcyNDciPiJTdWdlcmVuY2lhOiB0b2NhIGRvcyB2ZWNlcyBwYXJhIGFtcGxpYXIgbyByZWR1Y2lyLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvZmlsbF90aGlzX2Zvcm0gKDg5NDAxMTA4NjY3NzUwOTc0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iMTI4NDg0MzcyODIwMzQxMjEzNSI+ImxlZXIgaW5mb3JtYWNpw7NuIGRlIG1hcmNhZG9yZXMgeSBkZWwgaGlzdG9yaWFsIGRlbCBuYXZlZ2Fkb3IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjQ5ODE0ODk4MTU0Njc2MTcxOTEiPiJQZXJtaXRlIHF1ZSBsYSBhcGxpY2FjacOzbiBsZWEgdG9kYXMgbGFzIFVSTCBxdWUgaGEgdmlzaXRhZG8gZWwgbmF2ZWdhZG9yIHkgdG9kb3Mgc3VzIG1hcmNhZG9yZXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5MDA5NDM0MTA5ODM2MjgwMzc0Ij4iZXNjcmliaXIgZW4gbWFyY2Fkb3JlcyB5IGVuIGVsIGhpc3RvcmlhbCBkZWwgbmF2ZWdhZG9yIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTQ1NTcxOTkwMzU3MTE0OTUwIj4iUGVybWl0ZSBxdWUgdW5hIGFwbGljYWNpw7NuIG1vZGlmaXF1ZSBsYSBpbmZvcm1hY2nDs24gZGUgbG9zIG1hcmNhZG9yZXMgbyBkZWwgaGlzdG9yaWFsIGRlbCBuYXZlZ2Fkb3IgYWxtYWNlbmFkYSBlbiBlbCB0ZWzDqWZvbm8uIExhcyBhcGxpY2FjaW9uZXMgbWFsaW50ZW5jaW9uYWRhcyBwdWVkZW4gdXRpbGl6YXIgZXN0ZSBwZXJtaXNvIHBhcmEgYm9ycmFyIG8gbW9kaWZpY2FyIGxvcyBkYXRvcyBkZWwgbmF2ZWdhZG9yLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldEFsYXJtICg1OTI0NDAxMzI4ODAzNjE1MTY1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldEFsYXJtICg1OTY2OTY2NTk4MTQ5ODc1MDgyKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0NzE1MjEyNjU1NTk4Mjc1NTMyIj4iTW9kaWZpY2FyIGxvcyBwZXJtaXNvcyBkZSB1YmljYWNpw7NuIGdlb2dyw6FmaWNhIGRlbCBuYXZlZ2Fkb3IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0MDExOTA4MjgyOTgwODYxNjc5Ij4iUGVybWl0ZSBxdWUgdW5hIGFwbGljYWNpw7NuIG1vZGlmaXF1ZSBsb3MgcGVybWlzb3MgZGUgdWJpY2FjacOzbiBnZW9ncsOhZmljYSBkZWwgbmF2ZWdhZG9yLiBMYXMgYXBsaWNhY2lvbmVzIG1hbGludGVuY2lvbmFkYXMgcHVlZGVuIHV0aWxpemFyIGVzdGUgcGVybWlzbyBwYXJhIHBlcm1pdGlyIGVsIGVudsOtbyBkZSBpbmZvcm1hY2nDs24gc29icmUgbGEgdWJpY2FjacOzbiBhIHNpdGlvcyB3ZWIgYXJiaXRyYXJpb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9tZXNzYWdlIiBtc2dpZD0iNzY3MzQ0Njg3MTM5MTk1NzkwIj4iwr9EZXNlYXMgcXVlIGVsIG5hdmVnYWRvciByZWN1ZXJkZSBlc3RhIGNvbnRyYXNlw7FhPyI8L3N0cmluZz4KQEAgLTczMCwxNCArNzE2LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iU2VsZWNjaW9uYXIgdG9kbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4iU2VsZWNjaW9uYXIgcGFsYWJyYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJDb3J0YXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IkNvcGlhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IlBlZ2FyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJDb3BpYXIgVVJMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIG1zZ2lkPSI2NzM4NTU2MzQ4ODYxMzQ3MjQwIj4iU2VsZWNjaW9uYXIgdGV4dG8uLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4iU2VsZWNjacOzbiBkZSB0ZXh0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik3DqXRvZG8gZGUgaW50cm9kdWNjacOzbiBkZSB0ZXh0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJBw7FhZGlyIFwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiIGFsIGRpY2Npb25hcmlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iRWRpdGFyIHRleHRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSI0OTA5MTM1NTY0OTQxODE1NDk0Ij4iQWNjaW9uZXMgZGUgdGV4dG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IlBvY28gZXNwYWNpbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IlNlIGVzdMOhIGFnb3RhbmRvIGVsIGVzcGFjaW8gZGUgYWxtYWNlbmFtaWVudG8gZGVsIHRlbMOpZm9uby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJBY2VwdGFyIjwvc3RyaW5nPgpAQCAtNzQ1LDYgKzczMSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iQWNlcHRhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IkNhbmNlbGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IkF0ZW5jacOzbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iQ2FyZ2FuZG/igKYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IkFjdGl2YWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iRGVzY29uZWN0YWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJDb21wbGV0YXIgYWNjacOzbiB1dGlsaXphbmRvIjwvc3RyaW5nPgpAQCAtNzYzLDkgKzc1MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0iZm9yY2VfY2xvc2UiIG1zZ2lkPSIzNjUzNDE2MzE1NDUwODA2Mzk2Ij4iRm9yemFyIGNpZXJyZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlcG9ydCIgbXNnaWQ9IjQwNjAyMTgyNjA5ODQ3OTU3MDYiPiJJbmZvcm1lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiJFc3BlcmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iQXBsaWNhY2nDs24gcmVkaXJlY2Npb25hZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gc2UgZXN0w6EgZWplY3V0YW5kby4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+IkluaWNpYWxtZW50ZSwgc2UgaW5pY2nDsyBsYSBhcGxpY2FjacOzbiA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ190aXRsZSAoODMyMzc2MTYxNjA1MjEyMTkzNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19yZXBsYWNlICg2MjAyNDk4OTQ5OTcwMjgxNDEyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX29yaWdpbmFsICgxODgxMDIwMjMwMjE2Njg2ODMpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJMYSBhcGxpY2FjacOzbiA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXNvIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgaGEgaW5mcmluZ2lkbyBzdSBwb2zDrXRpY2EgU3RyaWN0TW9kZSBhdXRvYXBsaWNhYmxlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IkVsIHByb2Nlc28gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGhhIGluZnJpbmdpZG8gc3UgcG9sw610aWNhIFN0cmljdE1vZGUgYXV0b2FwbGljYWJsZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IGVuIGVqZWN1Y2nDs24iPC9zdHJpbmc+CkBAIC04MTIsMjggKzgwMiwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybXNfc2hvd19hbGwiIG1zZ2lkPSIyNjcxNzkxMTYzOTMzMDkxMTgwIj48Yj4iTW9zdHJhciB0b2RvcyI8L2I+PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9hY3Rpdml0eV90aXRsZSIgbXNnaWQ9IjIzOTkyODk5OTk2MDg5MDA0NDMiPiJBbG1hY2VuYW1pZW50byBVU0IgbWFzaXZvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfdGl0bGUiIG1zZ2lkPSI1OTAxNDU5MDQxMzk4NzUxNDk1Ij4iQ29uZWN0YWRvIHBvciBVU0IiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0Nzk2NzU5NjQ2MTY3MjQ3MTc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjgyMzE0NjI3NTAwMTAwNjY4OTYiPiJIYXMgY29uZWN0YWRvIGVsIHRlbMOpZm9ubyBhbCBlcXVpcG8gbWVkaWFudGUgVVNCLiBTZWxlY2Npb25hIGVsIGJvdMOzbiBzaXR1YWRvIGRlYmFqbyBzaSBkZXNlYXMgY29waWFyIGFyY2hpdm9zIGVudHJlIGVsIGVxdWlwbyB5IGxhIHRhcmpldGEgU0QgZGVsIHRlbMOpZm9ubyBjb24gQW5kcm9pZC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+IkhhcyBjb25lY3RhZG8gZWwgdGVsw6lmb25vIGFsIGVxdWlwbyBtZWRpYW50ZSBVU0IuIFNlbGVjY2lvbmEgZWwgYm90w7NuIHNpdHVhZG8gZGViYWpvIHNpIGRlc2VhcyBjb3BpYXIgYXJjaGl2b3MgZW50cmUgZWwgZXF1aXBvIHkgbGEgdGFyamV0YSBTRCBkZWwgdGVsw6lmb25vIGNvbiBBbmRyb2lkLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4iSGFzIGNvbmVjdGFkbyBlbCB0ZWzDqWZvbm8gYWwgZXF1aXBvIG1lZGlhbnRlIFVTQi4gU2VsZWNjaW9uYSBlbCBib3TDs24gc2l0dWFkbyBkZWJham8gc2kgZGVzZWFzIGNvcGlhciBhcmNoaXZvcyBlbnRyZSBlbCBlcXVpcG8geSBsYSB0YXJqZXRhIFNEIGRlbCB0ZWzDqWZvbm8gY29uIEFuZHJvaWQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYnV0dG9uX21vdW50IiBtc2dpZD0iMTA1MjI1OTkzMDM2OTUwODIzNSI+IkFjdGl2YXIgYWxtYWNlbmFtaWVudG8gVVNCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjUzNDc4NDc1MTYwMzM0NTM2MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0ODE4MzQ3NzU2NDAyNzQwMjYxIj4iU2UgaGEgcHJvZHVjaWRvIHVuIHByb2JsZW1hIGFsIGludGVudGFyIHV0aWxpemFyIGxhIHRhcmpldGEgU0QgcGFyYSBlbCBhbG1hY2VuYW1pZW50byBVU0IuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiJTZSBoYSBwcm9kdWNpZG8gdW4gcHJvYmxlbWEgYWwgaW50ZW50YXIgdXRpbGl6YXIgbGEgdGFyamV0YSBTRCBwYXJhIGVsIGFsbWFjZW5hbWllbnRvIFVTQi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IlNlIGhhIHByb2R1Y2lkbyB1biBwcm9ibGVtYSBhbCBpbnRlbnRhciB1dGlsaXphciBsYSB0YXJqZXRhIFNEIHBhcmEgZWwgYWxtYWNlbmFtaWVudG8gVVNCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjgxNzU4OTI1NTQ3NTcyMTY1MjUiPiJDb25lY3RhZG8gcG9yIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzM4MDA4MjQwNDI4ODIxOTM0MSI+IlBhcmEgY29waWFyIGFyY2hpdm9zIGFsL2Rlc2RlIGVsIGVxdWlwbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMjMzNjA1ODM5NjY2MzUxNjAxNyI+IkRlc2FjdGl2YXIgYWxtYWNlbmFtaWVudG8gVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI1OTE4MTM0OTAyNjk4NDE1MzkiPiJTZWxlY2Npb25hciBwYXJhIGRlc2FjdGl2YXIgVVNCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfdGl0bGUiIG1zZ2lkPSI2NjAxMjk4NTE3MDg3NzU4NTMiPiJFbCBhbG1hY2VuYW1pZW50byBVU0IgZXN0w6EgZW4gdXNvLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MTM3MTMzOTY0MjY2MDQxMDQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NzQ1MzQ1MjYwNzgwMjY3MTg1Ij4iQW50ZXMgZGUgZGVzYWN0aXZhciBlbCBhbG1hY2VuYW1pZW50byBVU0IsIGFzZWfDunJhdGUgZGUgaGFiZXIgZGVzbW9udGFkbyAoXCJyZXRpcmFkb1wiKSBsYSB0YXJqZXRhIFNEIGRlbCB0ZWzDqWZvbm8gY29uIEFuZHJvaWQgZGVsIGVxdWlwby4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4iQW50ZXMgZGUgZGVzYWN0aXZhciBlbCBhbG1hY2VuYW1pZW50byBVU0IsIGFzZWfDunJhdGUgZGUgaGFiZXIgZGVzbW9udGFkbyAoXCJyZXRpcmFkb1wiKSBsYSB0YXJqZXRhIFNEIGRlbCB0ZWzDqWZvbm8gY29uIEFuZHJvaWQgZGVsIGVxdWlwby4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4iQW50ZXMgZGUgZGVzYWN0aXZhciBlbCBhbG1hY2VuYW1pZW50byBVU0IsIGFzZWfDunJhdGUgZGUgaGFiZXIgZGVzbW9udGFkbyAoXCJyZXRpcmFkb1wiKSBsYSB0YXJqZXRhIFNEIGRlbCB0ZWzDqWZvbm8gY29uIEFuZHJvaWQgZGVsIGVxdWlwby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjcwNjAyMTgwMzQ5MDA2OTYwMjkiPiJEZXNhY3RpdmFyIGFsbWFjZW5hbWllbnRvIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjE0Mzg4MTkxNDg0MDQxMjEwOCI+IlNlIGhhIHByb2R1Y2lkbyB1biBwcm9ibGVtYSBhbCBkZXNhY3RpdmFyIGVsIGFsbWFjZW5hbWllbnRvIFVTQi4gQXNlZ8O6cmF0ZSBkZSBoYWJlciBkZXNhY3RpdmFkbyBlbCBob3N0IFVTQiB5LCBhIGNvbnRpbnVhY2nDs24sIHZ1ZWx2ZSBhIGludGVudGFybG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RpdGxlIiBtc2dpZD0iOTYzMDM5MDMzNDcwNDc4Njk3Ij4iQWN0aXZhciBhbG1hY2VuYW1pZW50byBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGV4dCIgbXNnaWQ9IjMyMDI4MzgyMzQ3ODA1MDU4ODYiPiJTaSBhY3RpdmFzIGVsIGFsbWFjZW5hbWllbnRvIFVTQiwgc2UgZGV0ZW5kcsOhbiBhbGd1bmFzIGFwbGljYWNpb25lcyBxdWUgZXN0w6FzIHV0aWxpemFuZG8geSBlc3RhcyBubyBlc3RhcsOhbiBkaXNwb25pYmxlcyBoYXN0YSBxdWUgbG8gZGVzYWN0aXZlcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfZXJyb3JfdGl0bGUiIG1zZ2lkPSI4MDQ4OTk5OTczODM3MzM5MTc0Ij4iTm8gc2UgaGEgcG9kaWRvIHJlYWxpemFyIGxhIG9wZXJhY2nDs24gVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX29rIiBtc2dpZD0iNzM3Njk1MzE2NzAzOTg2NTcwMSI+IkFjZXB0YXIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4NjYzMjQ3OTI5NTUxMDk1ODU0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjU3NzkwODAwNjk0OTc0MjIxNyI+IkZvcm1hdGVhciB0YXJqZXRhIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IkZvcm1hdGVhciB0YXJqZXRhIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYyMTM2OTk2MjQzMzUyMzYxOSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzQ3MDgxNTE0MDA2ODUwMjgyNCI+IsK/RXN0w6FzIHNlZ3VybyBkZSBxdWUgcXVpZXJlcyBmb3JtYXRlYXIgbGEgdGFyamV0YSBTRD8gU2UgcGVyZGVyw6FuIHRvZG9zIGxvcyBkYXRvcyBkZSBsYSB0YXJqZXRhLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IsK/RXN0w6FzIHNlZ3VybyBkZSBxdWUgcXVpZXJlcyBmb3JtYXRlYXIgbGEgdGFyamV0YSBTRD8gU2UgcGVyZGVyw6FuIHRvZG9zIGxvcyBkYXRvcyBkZSBsYSB0YXJqZXRhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJGb3JtYXRlYXIgdGFyamV0YSBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IsK/RXN0w6FzIHNlZ3VybyBkZSBxdWUgcXVpZXJlcyBmb3JtYXRlYXIgbGEgdGFyamV0YSBTRD8gU2UgcGVyZGVyw6FuIHRvZG9zIGxvcyBkYXRvcyBkZSBsYSB0YXJqZXRhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9idXR0b25fZm9ybWF0IiBtc2dpZD0iNDEzMTA2NDU2MDEyNzQ3ODY5NSI+IkZvcm1hdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3MjkwNDQ3Nzg5NDkxODk5MTgiPiJEaXNwb3NpdGl2byBkZSBkZXB1cmFjacOzbiBVU0IgY29uZWN0YWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9Ijg0NzAyOTY4MTgyNzAxMTAzOTYiPiJTZWxlY2Npb25hciBwYXJhIGluaGFiaWxpdGFyIGxhIGRlcHVyYWNpw7NuIFVTQiI8L3N0cmluZz4KQEAgLTg0MSwyOSArODI2LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9hbHBoYWJldCIgbXNnaWQ9IjU0MzMyNzU0ODU0OTkwMzkxOTkiPiIgQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9udW1lcmljX2FscGhhYmV0IiBtc2dpZD0iNDAzMDE3MDUyNDU5NTEyMzYxMCI+IiAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYW5kaWRhdGVzX3N0eWxlIiBtc2dpZD0iNDMzMzkxMzA4OTYzNzA2MjI1NyI+PHU+ImNhbmRpZGF0b3MiPC91Pjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTQ1NzYwMzQxODk3MDk5NDA1MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MjM5NTE2Njc1MDI4NDM4OTk3Ij4iUHJlcGFyYW5kbyB0YXJqZXRhIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiJQcmVwYXJhbmRvIHRhcmpldGEgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IlByZXBhcmFuZG8gdGFyamV0YSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjgyODczMTk4ODI5MjY3MzcwNTMiPiJDb21wcm9iYW5kbyBlcnJvcmVzLi4uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzgwNDc3ODM4MjQxMjEyOTk3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzkzNzM0NTU3Nzk4MzczMDg3MyI+IlRhcmpldGEgU0QgdmFjw61hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iVGFyamV0YSBTRCB2YWPDrWEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxMzEyMjY2ODIwMDkyOTU4MDE0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNjA2NjYwNzU2MTI0NjI5NzA4Ij4iTGEgdGFyamV0YSBTRCBlc3TDoSB2YWPDrWEgbyB1dGlsaXphIHVuIHNpc3RlbWEgZGUgYXJjaGl2b3MgaW5jb21wYXRpYmxlLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IkxhIHRhcmpldGEgU0QgZXN0w6EgdmFjw61hIG8gc3Ugc2lzdGVtYSBkZSBhcmNoaXZvcyBlcyBpbmNvbXBhdGlibGUuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjQxMDcyMzkwNjAxOTEwMDE4OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNzI0NjE5OTAyMDc2NTI4ODg5Ij4iVGFyamV0YSBTRCBkYcOxYWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJUYXJqZXRhIFNEIGRhw7FhZGEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNjc5NDEyODg0MjkwMDYxNzc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjQ2MDMxMTgzNTEzMDY3MTE5NCI+IkxhIHRhcmpldGEgU0QgZXN0w6EgZGHDsWFkYS4gRXMgcG9zaWJsZSBxdWUgc2VhIG5lY2VzYXJpbyB2b2x2ZXIgYSBmb3JtYXRlYXJsYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iTGEgdGFyamV0YSBTRCBlc3TDoSBkYcOxYWRhLiBFcyBwb3NpYmxlIHF1ZSBzZWEgbmVjZXNhcmlvIHZvbHZlciBhIGZvcm1hdGVhcmxhLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY4NzIxNTI4ODI2MDQ0MDc4MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNTgyMTc1MDE2MDYwNDMyMDM0Ij4iTGEgdGFyamV0YSBTRCBzZSBoYSBleHRyYcOtZG8gaW5lc3BlcmFkYW1lbnRlLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJMYSB0YXJqZXRhIFNEIHNlIGhhIGV4dHJhw61kbyBpbmVzcGVyYWRhbWVudGUuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzI2MDE4MzI5Mzc0NzQ0ODI0MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjAwNTM5NjQ2NDQ5NDY0ODkzNyI+IkRlc2FjdGl2YSBsYSB0YXJqZXRhIFNEIGFudGVzIGRlIGV4dHJhZXJsYSBwYXJhIGV2aXRhciBsYSBww6lyZGlkYSBkZSBkYXRvcy4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiJEZXNhY3RpdmEgbGEgdGFyamV0YSBTRCBhbnRlcyBkZSBleHRyYWVybGEgcGFyYSBldml0YXIgbGEgcMOpcmRpZGEgZGUgZGF0b3MuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjcyOTgwMTEzMDc5MDYxNjIwMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzY1MjU4ODEwMTg2Nzk1MTUiPiJFcyBzZWd1cm8gZXh0cmFlciBsYSB0YXJqZXRhIFNELiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+IkVzIHNlZ3VybyBleHRyYWVyIGxhIHRhcmpldGEgU0QuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzYxMzk2MDY4Njc0NzU5Mjc3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI3NTAzNzY5MTA2Mjg1MTg4NzAzIj4iWWEgcHVlZGVzIGV4dHJhZXIgbGEgdGFyamV0YSBTRC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4iUHVlZGVzIGV4dHJhZXIgbGEgdGFyamV0YSBTRCBkZSBmb3JtYSBzZWd1cmEuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODkwMjUxODAzMDQwNDM4MTMxOCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE4NzQ4ODk3NjQzNjcwODU1NjIiPiJUYXJqZXRhIFNEIGV4dHJhw61kYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiJUYXJqZXRhIFNEIGV4dHJhw61kYSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQyMDUxMTcyMjczNDI4MjIyNzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI3MzA4OTA0NDEzMzEzNDQ3NzYiPiJMYSB0YXJqZXRhIFNEIHNlIGhhIGV4dHJhw61kby4gSW5zZXJ0YSB1bmEgbnVldmEgdGFyamV0YSBTRCBwYXJhIGF1bWVudGFyIGxhIGNhcGFjaWRhZCBkZSBhbG1hY2VuYW1pZW50byBkZSB0dSBkaXNwb3NpdGl2by4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4NzAxMjA2NTI5ODM2NTk2NDEiPiJMYSB0YXJqZXRhIFNEIHNlIGhhIGV4dHJhw61kby4gSW5zZXJ0YSB1bmEgbnVldmEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iVGFyamV0YSBTRCB2YWPDrWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJMYSB0YXJqZXRhIFNEIGVzdMOhIHZhY8OtYSBvIHN1IHNpc3RlbWEgZGUgYXJjaGl2b3MgZXMgaW5jb21wYXRpYmxlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iVGFyamV0YSBTRCBkYcOxYWRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IkxhIHRhcmpldGEgU0QgZXN0w6EgZGHDsWFkYS4gRXMgcG9zaWJsZSBxdWUgc2VhIG5lY2VzYXJpbyB2b2x2ZXIgYSBmb3JtYXRlYXJsYS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iTGEgdGFyamV0YSBTRCBzZSBoYSBleHRyYcOtZG8gaW5lc3BlcmFkYW1lbnRlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+IkRlc2FjdGl2YSBsYSB0YXJqZXRhIFNEIGFudGVzIGRlIGV4dHJhZXJsYSBwYXJhIGV2aXRhciBsYSBww6lyZGlkYSBkZSBkYXRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJFcyBzZWd1cm8gZXh0cmFlciBsYSB0YXJqZXRhIFNELiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiJQdWVkZXMgZXh0cmFlciBsYSB0YXJqZXRhIFNEIGRlIGZvcm1hIHNlZ3VyYS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4OTAyNTE4MDMwNDA0MzgxMzE4Ij4iVGFyamV0YSBTRCBleHRyYcOtZGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjM4NzAxMjA2NTI5ODM2NTk2NDEiPiJMYSB0YXJqZXRhIFNEIHNlIGhhIGV4dHJhw61kby4gSW5zZXJ0YSB1bmEgbnVldmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfbGlzdF9lbXB0eSIgbXNnaWQ9IjQxNjg4MjA2MDk0MDMzODU3ODkiPiJObyBzZSBoYSBlbmNvbnRyYWRvIG5pbmd1bmEgYWN0aXZpZGFkIGNvaW5jaWRlbnRlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg3ODczNTIwNzQzMjY3NDg4OTIiPiJhY3R1YWxpemFyIGVzdGFkw61zdGljYXMgZGUgdXNvIGRlIGNvbXBvbmVudGVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg5MTU1MzY5NTcxNjc1MjgzNSI+IlBlcm1pdGUgbGEgbW9kaWZpY2FjacOzbiBkZSBlc3RhZMOtc3RpY2FzIHJlY29waWxhZGFzIHNvYnJlIGVsIHVzbyBkZSBjb21wb25lbnRlcy4gTm8gZXN0w6EgZGVzdGluYWRvIGFsIHVzbyBwb3IgcGFydGUgZGUgYXBsaWNhY2lvbmVzIG5vcm1hbGVzLiI8L3N0cmluZz4KQEAgLTg5OCwxNSArODcyLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iUmVkIHByaXZhZGEgdmlydHVhbCBMMlRQL0lQU2VjIGJhc2FkYSBlbiBjbGF2ZSBjb21wYXJ0aWRhIHByZXZpYW1lbnRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlJlZCBwcml2YWRhIHZpcnR1YWwgTDJUUC9JUFNlYyBiYXNhZGEgZW4gY2VydGlmaWNhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJTZWxlY2Npb25hciBhcmNoaXZvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iQXJjaGl2byBubyBzZWxlY2Npb25hZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJSZXN0YWJsZWNlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJFbnZpYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+ImZhdm9yaXRvcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IlNlIGhhIGhhYmlsaXRhZG8gZWwgbW9kbyBjb2NoZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iU2VsZWNjaW9uYSBlc3RhIG9wY2nDs24gcGFyYSBzYWxpciBkZWwgbW9kbyBjb2NoZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iQW5jbGFqZSBhIHJlZCBhY3Rpdm8gbyB6b25hIFdpLUZpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iVG9jYSBwYXJhIGluaWNpYXIgbGEgY29uZmlndXJhY2nDs24uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iQXRyw6FzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iU2lndWllbnRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iT21pdGlyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iVXNvIGVsZXZhZG8gZGF0b3MgbcOzdmlsZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+Ik3DoXMgaW5mb3JtYWNpw7NuIHNvYnJlIHVzbyBkZSBkYXRvcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iTMOtbWl0ZSBkYXRvcyBzdXBlcmFkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiJNw6FzIGluZm9ybWFjacOzbiBzb2JyZSB1c28gZGUgZGF0b3MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19tYXRjaGVzIiBtc2dpZD0iODEyOTQyMTkwODkxNTg0MDczNyI+Ik5vIGhheSBjb2luY2lkZW5jaWFzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZpbmRfb25fcGFnZSIgbXNnaWQ9IjE5NDY3OTkyMzM4MjI4MjAzODQiPiJCdXNjYXIgZW4gbGEgcMOhZ2luYSI8L3N0cmluZz4KKyAgPHBsdXJhbHMgbmFtZT0ibWF0Y2hlc19mb3VuZCI+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im9uZSIgbXNnaWQ9IjgxNjcxNDcwODExMzY1Nzk0MzkiPiJVbmEgY29pbmNpZGVuY2lhIjwvaXRlbT4KKyAgICA8aXRlbSBxdWFudGl0eT0ib3RoZXIiIG1zZ2lkPSI0NjQxODcyNzk3MDY3NjA5MTc3Ij4iPHhsaWZmOmcgaWQ9IklOREVYIj4lZDwveGxpZmY6Zz4gZGUgPHhsaWZmOmcgaWQ9IlRPVEFMIj4lZDwveGxpZmY6Zz4iPC9pdGVtPgorICA8L3BsdXJhbHM+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCmluZGV4IDVmMzQyN2IuLjI0OTJhODUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbApAQCAtMTY5LDggKzE2OSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfZGV2ZWxvcG1lbnRUb29scyIgbXNnaWQ9IjM0NDYxNjQ1ODQ3MTA1OTY1MTMiPiJPdXRpbHMgZGUgZMOpdmVsb3BwZW1lbnQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSI5MDU2NDMxMTkzODkzODA5ODE0Ij4iQ2VzIGZvbmN0aW9ubmFsaXTDqXMgc29udCByw6lzZXJ2w6llcyBhdXggZMOpdmVsb3BwZXVycyBkXCdhcHBsaWNhdGlvbnMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX3N0b3JhZ2UiIG1zZ2lkPSIxOTcxMTE4NzcwNTQ2MzM2OTY2Ij4iU3RvY2thZ2UiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MjAzMzAyMjE0OTE1MzU1Nzc0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNTQ1NTgwNDM1MzIyMDU4MTMxMiI+IkFjY8OocyDDoCBsYSBjYXJ0ZSBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiJBY2PDqHMgw6AgbGEgY2FydGUgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4iQWNjw6hzIMOgIGxhIGNhcnRlIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXIiIG1zZ2lkPSI3NDE3MTkyNjI5NjAxODkwNzkxIj4iRMOpc2FjdGl2YXRpb24gb3UgbW9kaWZpY2F0aW9uIGRlIGxhIGJhcnJlIGRcJ8OpdGF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc3RhdHVzQmFyIiBtc2dpZD0iMTM2NTQ3MzU5NTMzMTk4OTczMiI+IlBlcm1ldCDDoCB1bmUgYXBwbGljYXRpb24gZGUgZMOpc2FjdGl2ZXIgbGEgYmFycmUgZFwnw6l0YXQgb3UgZFwnYWpvdXRlci9zdXBwcmltZXIgZGVzIGljw7RuZXMgc3lzdMOobWUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXJTZXJ2aWNlIiBtc2dpZD0iNzI0NzI4MTkxMTM4NzkzMTQ4NSI+ImJhcnJlIGRcJ8OpdGF0Ijwvc3RyaW5nPgpAQCAtMjY3LDggKzI2NiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2xlYXJBcHBDYWNoZSIgbXNnaWQ9Ijc3NDA0NjU2OTQxOTM2NzE0MDIiPiJQZXJtZXQgw6AgdW5lIGFwcGxpY2F0aW9uIGRlIGxpYsOpcmVyIGRlIGxcJ2VzcGFjZSBkYW5zIGxhIG3DqW1vaXJlIGR1IHTDqWzDqXBob25lIGVuIHN1cHByaW1hbnQgZGVzIGZpY2hpZXJzIGR1IHLDqXBlcnRvaXJlIGR1IGNhY2hlIGRlcyBhcHBsaWNhdGlvbnMuIENldCBhY2PDqHMgZXN0IGVuIGfDqW7DqXJhbCBsaW1pdMOpIGF1eCBwcm9jZXNzdXMgc3lzdMOobWUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9tb3ZlUGFja2FnZSIgbXNnaWQ9IjcyODQ1NDk3OTk0NjUwMzkyNiI+IkTDqXBsYWNlciBkZXMgcmVzc291cmNlcyBkXCdhcHBsaWNhdGlvbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21vdmVQYWNrYWdlIiBtc2dpZD0iNjMyMzA0OTI5MTkyMzkyNTI3NyI+IkF1dG9yaXNlIGxcJ2FwcGxpY2F0aW9uIMOgIGTDqXBsYWNlciBkZXMgcmVzc291cmNlcyBkXCdhcHBsaWNhdGlvbiBkXCd1biBzdXBwb3J0IGludGVybmUgw6AgdW4gc3VwcG9ydCBleHRlcm5lIGV0IGludmVyc2VtZW50LiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ4MTE5MjE3MDM4ODI1MzIwNzAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZExvZ3MiIG1zZ2lkPSI2NjE1Nzc4NTQzMTk4OTY3NjE0Ij4iTGVjdHVyZSBkZXMgZmljaGllcnMgam91cm5hdXggZHUgc3lzdMOobWUiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyMjU3OTM3OTU1NTgwNDc1OTAyIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkTG9ncyIgbXNnaWQ9Ijg4OTY0NDk0Mzc0NjQ4Njc3NjYiPiJQZXJtZXQgw6AgdW5lIGFwcGxpY2F0aW9uIGRlIGxpcmUgbGVzIGRpZmbDqXJlbnRzIGZpY2hpZXJzIGpvdXJuYXV4IGR1IHN5c3TDqG1lIGFmaW4gZFwnb2J0ZW5pciBkZXMgaW5mb3JtYXRpb25zIGfDqW7DqXJhbGVzIHN1ciBsYSBmYcOnb24gZG9udCB2b3VzIHV0aWxpc2V6IHZvdHJlIHTDqWzDqXBob25lLCAgc2FucyBwb3VyIGF1dGFudCByw6ljdXDDqXJlciBkZXMgaW5mb3JtYXRpb25zIGRcJ29yZHJlIHBlcnNvbm5lbCBvdSBwcml2w6kuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZExvZ3MgKDY2MTU3Nzg1NDMxOTg5Njc2MTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZExvZ3MgKDg4OTY0NDk0Mzc0NjQ4Njc3NjYpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2RpYWdub3N0aWMiIG1zZ2lkPSI4MDc2NzQzOTUzOTA4MDAwMzQyIj4iTGVjdHVyZS/DqWNyaXR1cmUgZGFucyBsZXMgcmVzc291cmNlcyBhcHBhcnRlbmFudCBhdXggZGlhZ25vc3RpY3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaWFnbm9zdGljIiBtc2dpZD0iMzEyMTIzODM3Mzk1MTYzNzA0OSI+IlBlcm1ldCDDoCB1bmUgYXBwbGljYXRpb24gZGUgbGlyZSBldCBkXCfDqWRpdGVyIHRvdXRlIHJlc3NvdXJjZSBhcHBhcnRlbmFudCBhdSBncm91cGUgZGUgZGlhZ25vc3RpY3MgKHBhciBleGVtcGxlLCBsZXMgZmljaGllcnMgaW4vZGV2KS4gQ2VjaSBwZXV0IGFmZmVjdGVyIGxhIHN0YWJpbGl0w6kgZXQgbGEgc8OpY3VyaXTDqSBkdSBzeXN0w6htZS4gQ2V0dGUgZm9uY3Rpb25uYWxpdMOpIGVzdCBVTklRVUVNRU5UIHLDqXNlcnbDqWUgYXV4IGRpYWdub3N0aWNzIG1hdMOpcmllbHMgZWZmZWN0dcOpcyBwYXIgbGUgZmFicmljYW50IG91IGxcJ29ww6lyYXRldXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VDb21wb25lbnRTdGF0ZSIgbXNnaWQ9Ijc5NDI1MTk4ODM0MzI5NDA2Ij4iQWN0aXZlciBvdSBkw6lzYWN0aXZlciBkZXMgw6lsw6ltZW50cyBkZSBsXCdhcHBsaWNhdGlvbiI8L3N0cmluZz4KQEAgLTQwMywyMiArNDA0LDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aEFkbWluIiBtc2dpZD0iNzI1NjI4OTc3NDY2NzA1NDU1NSI+IlBlcm1ldCDDoCB1bmUgYXBwbGljYXRpb24gZGUgY29uZmlndXJlciBsZSB0w6lsw6lwaG9uZSBCbHVldG9vdGggbG9jYWwsIGRcJ2lkZW50aWZpZXIgZGVzIHDDqXJpcGjDqXJpcXVlcyBkaXN0YW50cyBldCBkZSBsZXMgYXNzb2NpZXIgYXUgdMOpbMOpcGhvbmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ibHVldG9vdGgiIG1zZ2lkPSI4MzYxMDM4NzA3ODU3MDE4NzMyIj4iQ3LDqWF0aW9uIGRlIGNvbm5leGlvbnMgQmx1ZXRvb3RoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoIiBtc2dpZD0iNzYyNTE1MzgwNjc5MzkyOTQ1Ij4iUGVybWV0IMOgIHVuZSBhcHBsaWNhdGlvbiBkXCdvYnRlbmlyIGxhIGNvbmZpZ3VyYXRpb24gZHUgdMOpbMOpcGhvbmUgQmx1ZXRvb3RoIGxvY2FsIGV0IGRlIGNyw6llciBldCBhY2NlcHRlciBkZXMgY29ubmV4aW9ucyDDoCBkZXMgYXBwYXJlaWxzIGFzc29jacOpcy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNBZG1pbiAoMjI1MTMwMjIzMzAxMjI1MDA1NikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNBZG1pbiAoMTkzNTg0MjYxMTQ2NDg5NTc4NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY1JhdyAoNDQyMzQ3MTcxMTExNDMyNTcwOCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNSYXcgKDU1MzMwMjI3MzY1NTkzODU2NjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNOb3RpZnkgKDQ3ODQ3MDM2MDA4Mjc5MjM1OCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNOb3RpZnkgKDI5OTAwNTM1MTc5NjIwNzA2MTcpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNMbGNwICg0OTcyMDUxNDYxMDA3MDMwNDI2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0xsY3AgKDkxNTkyMTI3Nzg2MDA0NjQwKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSI0OTc3NDA2MTY0MzExNTM1MDkyIj4iRMOpc2FjdGl2YXRpb24gZHUgdmVycm91aWxsYWdlIGRlcyB0b3VjaGVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iMzE4OTc2MzQ3OTMyNjMwMjAxNyI+IlBlcm1ldCDDoCB1bmUgYXBwbGljYXRpb24gZGUgZMOpc2FjdGl2ZXIgbGUgdmVycm91aWxsYWdlIGRlcyB0b3VjaGVzIGV0IHRvdXRlIHPDqWN1cml0w6kgcGFyIG1vdCBkZSBwYXNzZS4gRXhlbXBsZcKgOiBWb3RyZSB0w6lsw6lwaG9uZSBkw6lzYWN0aXZlIGxlIHZlcnJvdWlsbGFnZSBkdSBjbGF2aWVyIGxvcnNxdWUgdm91cyByZWNldmV6IHVuIGFwcGVsLCBwdWlzIGxlIHLDqWFjdGl2ZSBsb3JzcXVlIHZvdXMgcmFjY3JvY2hlei4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRTeW5jU2V0dGluZ3MiIG1zZ2lkPSI2MjAxODEwMDA4MjMwNTAzMDUyIj4iTGVjdHVyZSBkZXMgcGFyYW3DqHRyZXMgZGUgc3luY2hyb25pc2F0aW9uIjwvc3RyaW5nPgpAQCAtNDM1LDIyICs0MjAsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iMTA4Mjk3MjYwMzU3NjM2MDY5MCI+IlBlcm1ldCDDoCB1bmUgYXBwbGljYXRpb24gZGUgbGlyZSB0b3VzIGxlcyBtb3RzLCBub21zIGV0IGV4cHJlc3Npb25zIHF1ZSBsXCd1dGlsaXNhdGV1ciBhIHB1IGVucmVnaXN0cmVyIGRhbnMgc29uIGRpY3Rpb25uYWlyZSBwZXJzb25uZWwuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI2NzAzMTA5NTExODM2MzQzMzQxIj4iRW5yZWdpc3RyZW1lbnQgZGFucyBsZSBkaWN0aW9ubmFpcmUgZMOpZmluaSBwYXIgbFwndXRpbGlzYXRldXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjQxMjU2MjA2NTI0MDgyODgwIj4iUGVybWV0IMOgIHVuZSBhcHBsaWNhdGlvbiBkXCdlbnJlZ2lzdHJlciBkZSBub3V2ZWF1eCBtb3RzIGRhbnMgbGUgZGljdGlvbm5haXJlIHBlcnNvbm5lbCBkZSBsXCd1dGlsaXNhdGV1ci4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4MDc5NDAzNzU5MDAxNzc3MjkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijk5MzcwNzQzNjk0MTAxNjkxMyI+Ik1vZGlmaWVyL3N1cHByaW1lciBsZSBjb250ZW51IGRlIGxhIGNhcnRlIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJNb2RpZmllci9zdXBwcmltZXIgbGUgY29udGVudSBkZSBsYSBjYXJ0ZSBTRCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY2NDM5NjMyMDQ5NzY0NzE4NzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQxMzE4NzE1NDExMjcyMTE1MjYiPiJBdXRvcmlzZSB1bmUgYXBwbGljYXRpb24gw6Agw6ljcmlyZSBzdXIgbGEgY2FydGUgU0QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4iQXV0b3Jpc2UgdW5lIGFwcGxpY2F0aW9uIMOgIMOpY3JpcmUgc3VyIGxhIGNhcnRlIFNELiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iTW9kaWZpZXIvc3VwcHJpbWVyIGxlIGNvbnRlbnUgZGUgbGEgY2FydGUgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiJBdXRvcmlzZSB1bmUgYXBwbGljYXRpb24gw6Agw6ljcmlyZSBzdXIgbGEgY2FydGUgU0QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iNTY1NjQ4NzI2NDgxOTY2OTgyNCI+ImFjY8OpZGVyIGF1IHN5c3TDqG1lIGRlIGZpY2hpZXJzIGVuIGNhY2hlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjE2MjQ3MzQ1Mjg0MzU2NTk5MDYiPiJQZXJtZXQgw6AgdW5lIGFwcGxpY2F0aW9uIGRlIGxpcmUgZXQgZFwnw6ljcmlyZSBkYW5zIGxlIHN5c3TDqG1lIGRlIGZpY2hpZXJzIGVuIGNhY2hlLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQzMDc4NjE0OTYzMDI4NTAyMDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDQ5NzQyMDcyODg1NzU4NTc5MSI+IkxpbWl0ZXIgbGUgbW90IGRlIHBhc3NlIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTcxOTg3NzI0NTY5MjMxODI5OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iOTA4MzQwMDA4MDg2MTcyODA1NiI+IlJlc3RyZWludCBsZXMgdHlwZXMgZGUgbW90cyBkZSBwYXNzZSBxdWUgdm91cyDDqnRlcyBhdXRvcmlzw6kgw6AgdXRpbGlzZXIuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzM3NDc4MDcxMjY2NDI4NTMyMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI5MTQxMzA2NDY5NDIxOTk1MDMiPiJTdXJ2ZWlsbGVyIGxlcyB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE5NjEyNTExNzk2MjQ4NDM0ODMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjcyMjc1NzgyNjAxNjUxNzI2NzMiPiJTdXJ2ZWlsbGUgbGVzIMOpY2hlY3MgZGUgY29ubmV4aW9uIGF1IHDDqXJpcGjDqXJpcXVlIHBvdXIgZWZmZWN0dWVyIHVuZSBhY3Rpb24uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTA4NDc3MjA5MDc5NzQ4NTQyMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIyNjIwMDc3MTkxMjQyNjg4OTU1Ij4iUsOpaW5pdGlhbGlzZXIgbGUgbW90IGRlIHBhc3NlIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzMzMjE2NzYwMDMzMTc5OTk5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iNTM5MTI0MDYxNjk4MTI5NzM2MSI+IkZvcmNlIGxcJ3V0aWxpc2F0aW9uIGRcJ3VuIG5vdXZlYXUgbW90IGRlIHBhc3NlLCBxdWkgZG9pdCB2b3VzIMOqdHJlIGNvbW11bmlxdcOpIHBhciBsXCdhZG1pbmlzdHJhdGV1ciBwb3VyIHF1ZSB2b3VzIHB1aXNzaWV6IHZvdXMgY29ubmVjdGVyLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU3NjA0NjYwMjUyNDc2MzQ0ODggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSIyMjc0MDg1Mzg0NzA0MjQ4NDMxIj4iRm9yY2VyIGxlIHZlcnJvdWlsbGFnZSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI4MTk4Njg2NjQ5NDYwODk3NDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iNTY5Njk2NDEyNjIyNjAyODQ0MiI+IkNvbnRyw7RsZSBsZSB2ZXJyb3VpbGxhZ2UgZHUgcMOpcmlwaMOpcmlxdWUsIGF2ZWMgb2JsaWdhdGlvbiBkZSBzYWlzaXIgw6Agbm91dmVhdSBsZSBtb3QgZGUgcGFzc2UuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0MzA3ODYxNDk2MzAyODUwMjAxIj4iTGltaXRlciBsZSBtb3QgZGUgcGFzc2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSIxNzE5ODc3MjQ1NjkyMzE4Mjk5Ij4iUmVzdHJlaW50IGxlcyB0eXBlcyBkZSBtb3RzIGRlIHBhc3NlIHF1ZSB2b3VzIMOqdGVzIGF1dG9yaXPDqSDDoCB1dGlsaXNlci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjczNzQ3ODA3MTI2NjQyODUzMjEiPiJTdXJ2ZWlsbGVyIGxlcyB0ZW50YXRpdmVzIGRlIGNvbm5leGlvbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjE5NjEyNTExNzk2MjQ4NDM0ODMiPiJTdXJ2ZWlsbGUgbGVzIMOpY2hlY3MgZGUgY29ubmV4aW9uIGF1IHDDqXJpcGjDqXJpcXVlIHBvdXIgZWZmZWN0dWVyIHVuZSBhY3Rpb24uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI5MDg0NzcyMDkwNzk3NDg1NDIwIj4iUsOpaW5pdGlhbGlzZXIgbGUgbW90IGRlIHBhc3NlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iMzMzMjE2NzYwMDMzMTc5OTk5MSI+IkZvcmNlIGxcJ3V0aWxpc2F0aW9uIGRcJ3VuIG5vdXZlYXUgbW90IGRlIHBhc3NlLCBxdWkgZG9pdCB2b3VzIMOqdHJlIGNvbW11bmlxdcOpIHBhciBsXCdhZG1pbmlzdHJhdGV1ciBwb3VyIHF1ZSB2b3VzIHB1aXNzaWV6IHZvdXMgY29ubmVjdGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSI1NzYwNDY2MDI1MjQ3NjM0NDg4Ij4iRm9yY2VyIGxlIHZlcnJvdWlsbGFnZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkNvbnRyw7RsZSBsZSB2ZXJyb3VpbGxhZ2UgZHUgcMOpcmlwaMOpcmlxdWUsIGF2ZWMgb2JsaWdhdGlvbiBkZSBzYWlzaXIgw6Agbm91dmVhdSBsZSBtb3QgZGUgcGFzc2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkVmZmFjZXIgdG91dGVzIGxlcyBkb25uw6llcyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIzMTQwNjA5MzM3OTYzOTYyMDUgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSI3NjY5ODk1MzMzODE0MjIyNTg2Ij4iUsOpdGFibGl0IGxlcyBwYXJhbcOodHJlcyBkXCd1c2luZSwgc3VwcHJpbWFudCB0b3V0ZXMgdm9zIGRvbm7DqWVzIHNhbnMgZGVtYW5kZSBkZSBjb25maXJtYXRpb24uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJSw6l0YWJsaXQgbGVzIHBhcmFtw6h0cmVzIGRcJ3VzaW5lLCBzdXBwcmltYW50IHRvdXRlcyB2b3MgZG9ubsOpZXMgc2FucyBkZW1hbmRlIGRlIGNvbmZpcm1hdGlvbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSIgbXNnaWQ9IjYzODc0OTc0NjY2NjAxNTQ5MzEiPiJJbmRpcXVleiBsZSBwcm94eSBnbG9iYWwgw6AgdXRpbGlzZXIgcG91ciBjZSBtb2JpbGUgbG9yc3F1ZSBsZXMgcsOoZ2xlcyBzb250IGFjdGl2w6llcy4gU2V1bCBsXCdhZG1pbmlzdHJhdGV1ciBwcmluY2lwYWwgZHUgbW9iaWxlIHBldXQgZMOpZmluaXIgbGUgcHJveHkgZ2xvYmFsIGVmZmVjdGlmLiI8L3N0cmluZz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkRvbWljaWxlIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTW9iaWxlIjwvaXRlbT4KQEAgLTU1MiwxMCArNTM4LDkgQEAKICAgICA8c2tpcCAvPgogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlT3RoZXIgKDQ0MDg0MzYxNjI5NTAxMTk4NDkpIC0tPgogICAgIDxza2lwIC8+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4idmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iU2Fpc2lzc2V6IGxlIGNvZGUgUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJTYWlzaXNzZXogbGUgbW90IGRlIHBhc3NlIHBvdXIgcHJvY8OpZGVyIGF1IGTDqXZlcnJvdWlsbGFnZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IlNhaXNpc3NleiBsZSBjb2RlIFBJTiBwb3VyIHByb2PDqWRlciBhdSBkw6l2ZXJyb3VpbGxhZ2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iTGUgY29kZSBQSU4gZXN0IGluY29ycmVjdMKgISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJQb3VyIGTDqWJsb3F1ZXIgbGUgY2xhdmllciwgYXBwdXlleiBzdXIgXCJNZW51XCIgcHVpcyBzdXIgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTnVtw6lybyBkXCd1cmdlbmNlIjwvc3RyaW5nPgpAQCAtNTY4LDYgKzU1Myw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IlJldG91ciDDoCBsXCdhcHBlbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IkNvbWJpbmFpc29uIGNvcnJlY3RlwqAhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IkluY29ycmVjdC4gTWVyY2kgZGUgcsOpZXNzYXllci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IkluY29ycmVjdC4gTWVyY2kgZGUgcsOpZXNzYXllci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJDaGFyZ2VtZW50ICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz7CoDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkNoYXJnw6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+wqA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTgyLDYgKzU2OCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJMYSBjYXJ0ZSBTSU0gZXN0IHZlcnJvdWlsbMOpZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJEw6libG9jYWdlIGRlIGxhIGNhcnRlIFNJTS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IlZvdXMgYXZleiBtYWwgcmVwcm9kdWl0IGxlIHNjaMOpbWEgZGUgZMOpdmVycm91aWxsYWdlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGZvaXMuICJcblxuIlZldWlsbGV6IHLDqWVzc2F5ZXIgZGFucyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRlcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJWb3VzIGF2ZXogc2Fpc2kgdW4gbW90IGRlIHBhc3NlIGluY29ycmVjdCDDoCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPsKgcmVwcmlzZXMuICJcblxuIlZldWlsbGV6IHLDqWVzc2F5ZXIgZGFucyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPsKgc2Vjb25kZXMuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IlZvdXMgYXZleiBzYWlzaSB1biBjb2RlIFBJTiBpbmNvcnJlY3Qgw6AgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7CoHJlcHJpc2VzLiAiXG5cbiJWZXVpbGxleiByw6llc3NheWVyIGRhbnMgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz7CoHNlY29uZGVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iVm91cyBhdmV6IG1hbCBzYWlzaSBsZSBzY2jDqW1hIGRlIGTDqXZlcnJvdWlsbGFnZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBmb2lzLiBBdSBib3V0IGRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHRlbnRhdGl2ZXMgc3VwcGzDqW1lbnRhaXJlcywgdm91cyBkZXZyZXogZMOpYmxvcXVlciB2b3RyZSB0w6lsw6lwaG9uZSDDoCBsXCdhaWRlIGRlIHZvdHJlIGlkZW50aWZpYW50IEdvb2dsZS4iXG5cbiJNZXJjaSBkZSByw6llc3NheWVyIGRhbnMgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2Vjb25kZXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlLDqWVzc2F5ZXogZGFucyA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz7CoHNlY29uZGVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iU2Now6ltYSBvdWJsacOpID8iPC9zdHJpbmc+CkBAIC02MTAsMTQgKzU5OCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ianNfZGlhbG9nX2JlZm9yZV91bmxvYWQiIG1zZ2lkPSIxOTAxNjc1NDQ4MTc5NjUzMDg5Ij4iVm91cyBzb3VoYWl0ZXogcXVpdHRlciBjZXR0ZSBwYWdlwqA/IlxuXG4iPHhsaWZmOmcgaWQ9Ik1FU1NBR0UiPiVzPC94bGlmZjpnPiJcblxuIlPDqWxlY3Rpb25uZXogT0sgcG91ciBjb250aW51ZXIgb3UgQW5udWxlciBwb3VyIHJlc3RlciBzdXIgbGEgcGFnZSBhY3R1ZWxsZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX2xhYmVsIiBtc2dpZD0iNjg2MDI2MTc1ODY2NTgyNTA2OSI+IkNvbmZpcm1lciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRvdWJsZV90YXBfdG9hc3QiIG1zZ2lkPSIxMDY4MjE2OTM3MjQ0NTY3MjQ3Ij4iQ29uc2VpbMKgOiBBcHB1eWV6IGRldXggZm9pcyBwb3VyIGVmZmVjdHVlciB1biB6b29tIGF2YW50IG91IGFycmnDqHJlLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvZmlsbF90aGlzX2Zvcm0gKDg5NDAxMTA4NjY3NzUwOTc0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iMTI4NDg0MzcyODIwMzQxMjEzNSI+ImxpcmUgbFwnaGlzdG9yaXF1ZSBldCBsZXMgZmF2b3JpcyBkdSBuYXZpZ2F0ZXVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI0OTgxNDg5ODE1NDY3NjE3MTkxIj4iQXV0b3Jpc2UgbFwnYXBwbGljYXRpb24gw6AgbGlyZSB0b3V0ZXMgbGVzIFVSTCBhdXhxdWVsbGVzIGxlIG5hdmlnYXRldXIgYSBhY2PDqWTDqSBldCB0b3VzIHNlcyBmYXZvcmlzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTAwOTQzNDEwOTgzNjI4MDM3NCI+IsOpY3JpcmUgZGFucyBsXCdoaXN0b3JpcXVlIGV0IGxlcyBmYXZvcmlzIGR1IG5hdmlnYXRldXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5NDU1NzE5OTAzNTcxMTQ5NTAiPiJBdXRvcmlzZSB1bmUgYXBwbGljYXRpb24gw6AgbW9kaWZpZXIgbFwnaGlzdG9yaXF1ZSBkdSBuYXZpZ2F0ZXVyIG91IGxlcyBmYXZvcmlzIGVucmVnaXN0csOpcyBzdXIgdm90cmUgdMOpbMOpcGhvbmUuIERlcyBhcHBsaWNhdGlvbnMgbWFsdmVpbGxhbnRlcyBwZXV2ZW50IHV0aWxpc2VyIGNldHRlIGZvbmN0aW9uIHBvdXIgZWZmYWNlciBvdSBtb2RpZmllciBsZXMgZG9ubsOpZXMgZGUgdm90cmUgbmF2aWdhdGV1ci4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRBbGFybSAoNTkyNDQwMTMyODgwMzYxNTE2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRBbGFybSAoNTk2Njk2NjU5ODE0OTg3NTA4MikgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDcxNTIxMjY1NTU5ODI3NTUzMiI+Ik1vZGlmaWVyIGxlcyBhdXRvcmlzYXRpb25zIGRlIGfDqW9sb2NhbGlzYXRpb24gZHUgbmF2aWdhdGV1ciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQwMTE5MDgyODI5ODA4NjE2NzkiPiJQZXJtZXQgw6AgdW5lIGFwcGxpY2F0aW9uIGRlIG1vZGlmaWVyIGxlcyBhdXRvcmlzYXRpb25zIGRlIGfDqW9sb2NhbGlzYXRpb24gZHUgbmF2aWdhdGV1ci4gTGVzIGFwcGxpY2F0aW9ucyBtYWx2ZWlsbGFudGVzIHBldXZlbnQgc2Ugc2VydmlyIGRlIGNldHRlIGZvbmN0aW9ubmFsaXTDqSBwb3VyIGVudm95ZXIgZGVzIGluZm9ybWF0aW9ucyBkZSBsaWV1IMOgIGRlcyBzaXRlcyBXZWIgYXJiaXRyYWlyZXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9tZXNzYWdlIiBtc2dpZD0iNzY3MzQ0Njg3MTM5MTk1NzkwIj4iVm91bGV6LXZvdXMgcXVlIGxlIG5hdmlnYXRldXIgc2Ugc291dmllbm5lIGRlIGNlIG1vdCBkZSBwYXNzZcKgPyI8L3N0cmluZz4KQEAgLTczMCwxNCArNzE2LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iVG91dCBzw6lsZWN0aW9ubmVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiJTw6lsZWN0aW9ubmVyIHRleHRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IkNvdXBlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iQ29waWVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iQ29sbGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJDb3BpZXIgbFwnVVJMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIG1zZ2lkPSI2NzM4NTU2MzQ4ODYxMzQ3MjQwIj4iU8OpbGVjdC4gbGUgdGV4dGUuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4iU8OpbGVjdGlvbiBkZSB0ZXh0ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik1vZGUgZGUgc2Fpc2llIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkFqb3V0ZXIgXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIgYXUgZGljdGlvbm5haXJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iTW9kaWZpZXIgbGUgdGV4dGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiJBY3Rpb25zIHN1ciBsZSB0ZXh0ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iRXNwYWNlIGRpc3BvbmlibGUgZmFpYmxlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iTGEgbcOpbW9pcmUgZHUgdMOpbMOpcGhvbmUgY29tbWVuY2Ugw6Agw6p0cmUgcGxlaW5lLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzQ1LDYgKzczMSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJBbm51bGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IkF0dGVudGlvbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iQ2hhcmdlbWVudCBlbiBjb3Vycy4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iT04iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJPRkYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkNvbnRpbnVlciBhdmVjIjwvc3RyaW5nPgpAQCAtNzYzLDkgKzc1MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0iZm9yY2VfY2xvc2UiIG1zZ2lkPSIzNjUzNDE2MzE1NDUwODA2Mzk2Ij4iRm9yY2VyIGxhIGZlcm1ldHVyZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlcG9ydCIgbXNnaWQ9IjQwNjAyMTgyNjA5ODQ3OTU3MDYiPiJSYXBwb3J0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiJBdHRlbmRyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IkFwcGxpY2F0aW9uIHJlZGlyaWfDqWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gZXN0IG1haW50ZW5hbnQgbGFuY8OpZS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+IkFwcGxpY2F0aW9uIGxhbmPDqWUgaW5pdGlhbGVtZW50wqA6IDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3RpdGxlICg4MzIzNzYxNjE2MDUyMTIxOTM2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3JlcGxhY2UgKDYyMDI0OTg5NDk5NzAyODE0MTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwgKDE4ODEwMjAyMzAyMTY2ODY4MykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IkxcJ2FwcGxpY2F0aW9uIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb2Nlc3N1cyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIGEgZW5mcmVpbnQgc2VzIHByb3ByZXMgcsOoZ2xlcyBkdSBtb2RlIHN0cmljdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJMZSBwcm9jZXNzdXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGEgZW5mcmVpbnQgc2VzIHByb3ByZXMgcsOoZ2xlcyBkdSBtb2RlIHN0cmljdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+wqBlbiBjb3VycyBkXCdleMOpY3V0aW9uIjwvc3RyaW5nPgpAQCAtODEyLDI4ICs4MDIsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1zX3Nob3dfYWxsIiBtc2dpZD0iMjY3MTc5MTE2MzkzMzA5MTE4MCI+PGI+IlRvdXQgYWZmaWNoZXIiPC9iPjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYWN0aXZpdHlfdGl0bGUiIG1zZ2lkPSIyMzk5Mjg5OTk5NjA4OTAwNDQzIj4iU3RvY2thZ2UgZGUgbWFzc2UgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfdGl0bGUiIG1zZ2lkPSI1OTAxNDU5MDQxMzk4NzUxNDk1Ij4iQ29ubmVjdMOpIMOgIGxcJ2FpZGUgZFwndW4gY8OiYmxlIFVTQiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ3OTY3NTk2NDYxNjcyNDcxNzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODIzMTQ2Mjc1MDAxMDA2Njg5NiI+IlZvdXMgYXZleiBjb25uZWN0w6kgdm90cmUgdMOpbMOpcGhvbmUgw6Agdm90cmUgb3JkaW5hdGV1ciDDoCBsXCdhaWRlIGRcJ3VuIGPDomJsZSBVU0IuIFPDqWxlY3Rpb25uZXogbGUgYm91dG9uIGNpLWRlc3NvdXMgcG91ciBjb3BpZXIgZGVzIGZpY2hpZXJzIGRlIHZvdHJlIG9yZGluYXRldXIgdmVycyBsYSBjYXJ0ZSBTRCBkZSB2b3RyZSBBbmRyb2lkLCBvdSBpbnZlcnNlbWVudC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+IlZvdXMgYXZleiBjb25uZWN0w6kgdm90cmUgdMOpbMOpcGhvbmUgw6Agdm90cmUgb3JkaW5hdGV1ciDDoCBsXCdhaWRlIGRcJ3VuIGPDomJsZSBVU0IuIFPDqWxlY3Rpb25uZXogbGUgYm91dG9uIGNpLWRlc3NvdXMgcG91ciBjb3BpZXIgZGVzIGZpY2hpZXJzIGRlIHZvdHJlIG9yZGluYXRldXIgdmVycyBsYSBjYXJ0ZSBTRCBkZSB2b3RyZSBBbmRyb2lkLCBvdSBpbnZlcnNlbWVudC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+IlZvdXMgYXZleiBjb25uZWN0w6kgdm90cmUgdMOpbMOpcGhvbmUgw6Agdm90cmUgb3JkaW5hdGV1ciDDoCBsXCdhaWRlIGRcJ3VuIGPDomJsZSBVU0IuIFPDqWxlY3Rpb25uZXogbGUgYm91dG9uIGNpLWRlc3NvdXMgcG91ciBjb3BpZXIgZGVzIGZpY2hpZXJzIGRlIHZvdHJlIG9yZGluYXRldXIgdmVycyBsYSBjYXJ0ZSBTRCBkZSB2b3RyZSBBbmRyb2lkLCBvdSBpbnZlcnNlbWVudC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9idXR0b25fbW91bnQiIG1zZ2lkPSIxMDUyMjU5OTMwMzY5NTA4MjM1Ij4iQWN0aXZlciBsZSBww6lyaXBow6lyaXF1ZSBkZSBzdG9ja2FnZSBVU0IiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNTM0Nzg0NzUxNjAzMzQ1MzYzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQ4MTgzNDc3NTY0MDI3NDAyNjEiPiJVbiBwcm9ibMOobWUgZXN0IHN1cnZlbnUgbG9ycyBkZSBsXCd1dGlsaXNhdGlvbiBkZSB2b3RyZSBjYXJ0ZSBTRCBlbiB0YW50IHF1ZSBww6lyaXBow6lyaXF1ZSBkZSBzdG9ja2FnZSBVU0IuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiJVbiBwcm9ibMOobWUgZXN0IHN1cnZlbnUgbG9ycyBkZSBsXCd1dGlsaXNhdGlvbiBkZSB2b3RyZSBjYXJ0ZSBTRCBlbiB0YW50IHF1ZSBww6lyaXBow6lyaXF1ZSBkZSBzdG9ja2FnZSBVU0IuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiJVbiBwcm9ibMOobWUgZXN0IHN1cnZlbnUgbG9ycyBkZSBsXCd1dGlsaXNhdGlvbiBkZSB2b3RyZSBjYXJ0ZSBTRCBlbiB0YW50IHF1ZSBww6lyaXBow6lyaXF1ZSBkZSBzdG9ja2FnZSBVU0IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODE3NTg5MjU1NDc1NzIxNjUyNSI+IkNvbm5lY3TDqSBhdmVjIHVuIGPDomJsZSBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjczODAwODI0MDQyODgyMTkzNDEiPiJBY3RpdmV6IHBvdXIgY29waWVyIGRlcyBmaWNoaWVycyB2ZXJzL2RlIHZvdHJlIG9yZGluYXRldXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIyMzM2MDU4Mzk2NjYzNTE2MDE3Ij4iw4l0ZWluZHJlIGxlIHDDqXJpcGjDqXJpcXVlIGRlIHN0b2NrYWdlIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNTkxODEzNDkwMjY5ODQxNTM5Ij4iU8OpbGVjdGlvbm5lciBwb3VyIMOpdGVpbmRyZSBsZSBww6lyaXBow6lyaXF1ZSBkZSBzdG9ja2FnZSBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX3RpdGxlIiBtc2dpZD0iNjYwMTI5ODUxNzA4Nzc1ODUzIj4iU3RvY2thZ2UgVVNCIGVuIGNvdXJzIGRcJ3V0aWxpc2F0aW9uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYxMzcxMzM5NjQyNjYwNDEwNCAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg3NDUzNDUyNjA3ODAyNjcxODUiPiJBdmFudCBkZSBtZXR0cmUgaG9ycyB0ZW5zaW9uIGxlIHN0b2NrYWdlIFVTQiwgYXNzdXJlei12b3VzIGRcJ2F2b2lyIGTDqXNhY3RpdsOpIChcIsOpamVjdMOpXCIpIGxhIGNhcnRlIFNEIGRlIHZvdHJlIHTDqWzDqXBob25lIEFuZHJvaWQgw6AgcGFydGlyIGRlIHZvdHJlIG9yZGluYXRldXIuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IkF2YW50IGRlIG1ldHRyZSBob3JzIHRlbnNpb24gbGUgc3RvY2thZ2UgVVNCLCBhc3N1cmV6LXZvdXMgZFwnYXZvaXIgZMOpc2FjdGl2w6kgKFwiw6lqZWN0w6lcIikgbGEgY2FydGUgU0QgZGUgdm90cmUgdMOpbMOpcGhvbmUgQW5kcm9pZCDDoCBwYXJ0aXIgZGUgdm90cmUgb3JkaW5hdGV1ci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4iQXZhbnQgZGUgbWV0dHJlIGhvcnMgdGVuc2lvbiBsZSBzdG9ja2FnZSBVU0IsIGFzc3VyZXotdm91cyBkXCdhdm9pciBkw6lzYWN0aXbDqSAoXCLDqWplY3TDqVwiKSBsYSBjYXJ0ZSBTRCBkZSB2b3RyZSB0w6lsw6lwaG9uZSBBbmRyb2lkIMOgIHBhcnRpciBkZSB2b3RyZSBvcmRpbmF0ZXVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfYnV0dG9uX21vdW50IiBtc2dpZD0iNzA2MDIxODAzNDkwMDY5NjAyOSI+IkTDqXNhY3RpdmVyIGxlIHDDqXJpcGjDqXJpcXVlIGRlIHN0b2NrYWdlIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjE0Mzg4MTkxNDg0MDQxMjEwOCI+IlVuIHByb2Jsw6htZSBlc3Qgc3VydmVudSBsb3JzIGRlIGxhIG1pc2UgaG9ycyB0ZW5zaW9uIGR1IHDDqXJpcGjDqXJpcXVlIGRlIHN0b2NrYWdlIFVTQi4gQXNzdXJlei12b3VzIHF1ZSBsXCdow7R0ZSBVU0IgYSBiaWVuIMOpdMOpIGTDqXNhY3RpdsOpLCBwdWlzIGVzc2F5ZXogw6Agbm91dmVhdS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGl0bGUiIG1zZ2lkPSI5NjMwMzkwMzM0NzA0Nzg2OTciPiJBY3RpdmVyIGxlIHDDqXJpcGjDqXJpcXVlIGRlIHN0b2NrYWdlIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190ZXh0IiBtc2dpZD0iMzIwMjgzODIzNDc4MDUwNTg4NiI+IlNpIHZvdXMgYWN0aXZleiBsZSBww6lyaXBow6lyaXF1ZSBkZSBzdG9ja2FnZSBVU0IsIGNlcnRhaW5lcyBhcHBsaWNhdGlvbnMgcXVlIHZvdXMgdXRpbGlzZXogc2UgZmVybWVyb250IGV0IHJpc3F1ZW50IGRlIG5cJ8OqdHJlIGRlIG5vdXZlYXUgZGlzcG9uaWJsZXMgcXVcJ2FwcsOocyBsYSBkw6lzYWN0aXZhdGlvbiBkdSBww6lyaXBow6lyaXF1ZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfZXJyb3JfdGl0bGUiIG1zZ2lkPSI4MDQ4OTk5OTczODM3MzM5MTc0Ij4iw4ljaGVjIGR1IGZvbmN0aW9ubmVtZW50IFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19vayIgbXNnaWQ9IjczNzY5NTMxNjcwMzk4NjU3MDEiPiJPSyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg2NjMyNDc5Mjk1NTEwOTU4NTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NTc3OTA4MDA2OTQ5NzQyMjE3Ij4iRm9ybWF0ZXIgbGEgY2FydGUgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4NjYzMjQ3OTI5NTUxMDk1ODU0Ij4iRm9ybWF0ZXIgbGEgY2FydGUgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjIxMzY5OTYyNDMzNTIzNjE5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNDcwODE1MTQwMDY4NTAyODI0Ij4iVm91bGV6LXZvdXMgdnJhaW1lbnQgZm9ybWF0ZXIgbGEgY2FydGUgU0TCoD8gVG91dGVzIGxlcyBkb25uw6llcyBkZSBjZXR0ZSBjYXJ0ZSBzZXJvbnQgcGVyZHVlcy4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiJWb3VsZXotdm91cyB2cmFpbWVudCBmb3JtYXRlciBsYSBjYXJ0ZSBTRMKgPyBUb3V0ZXMgbGVzIGRvbm7DqWVzIGRlIGNldHRlIGNhcnRlIHNlcm9udCBwZXJkdWVzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJGb3JtYXRlciBsYSBjYXJ0ZSBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IlZvdWxlei12b3VzIHZyYWltZW50IGZvcm1hdGVyIGxhIGNhcnRlIFNEwqA/IFRvdXRlcyBsZXMgZG9ubsOpZXMgZGUgY2V0dGUgY2FydGUgc2Vyb250IHBlcmR1ZXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X2J1dHRvbl9mb3JtYXQiIG1zZ2lkPSI0MTMxMDY0NTYwMTI3NDc4Njk1Ij4iRm9ybWF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5MDQ0Nzc4OTQ5MTg5OTE4Ij4iRMOpYm9nYWdlIFVTQiBjb25uZWN0w6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODQ3MDI5NjgxODI3MDExMDM5NiI+IlPDqWxlY3Rpb25uZXogY2V0dGUgb3B0aW9uIHBvdXIgZMOpc2FjdGl2ZXIgbGUgZMOpYm9nYWdlIFVTQi4iPC9zdHJpbmc+CkBAIC04NDEsMjkgKzgyNiwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfYWxwaGFiZXQiIG1zZ2lkPSI1NDMzMjc1NDg1NDk5MDM5MTk5Ij4iIEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfbnVtZXJpY19hbHBoYWJldCIgbXNnaWQ9IjQwMzAxNzA1MjQ1OTUxMjM2MTAiPiIgMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FuZGlkYXRlc19zdHlsZSIgbXNnaWQ9IjQzMzM5MTMwODk2MzcwNjIyNTciPjx1PiJjYW5kaWRhdHMiPC91Pjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTQ1NzYwMzQxODk3MDk5NDA1MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MjM5NTE2Njc1MDI4NDM4OTk3Ij4iUHLDqXBhcmF0aW9uIGRlIGxhIGNhcnRlIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiJQcsOpcGFyYXRpb24gZGUgbGEgY2FydGUgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IlByw6lwYXJhdGlvbiBkZSBsYSBjYXJ0ZSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjgyODczMTk4ODI5MjY3MzcwNTMiPiJSZWNoZXJjaGUgZFwnZXJyZXVycyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc4MDQ3NzgzODI0MTIxMjk5NyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM5MzczNDU1Nzc5ODM3MzA4NzMiPiJDYXJ0ZSBTRCB2aWRlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iQ2FydGUgU0QgdmlkZSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDEzMTIyNjY4MjAwOTI5NTgwMTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE2MDY2NjA3NTYxMjQ2Mjk3MDgiPiJMYSBjYXJ0ZSBTRCBlc3QgdmlkZSBvdSB1dGlsaXNlIHVuIHN5c3TDqG1lIGRlIGZpY2hpZXJzIG5vbiBwcmlzIGVuIGNoYXJnZS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJMYSBjYXJ0ZSBTRCBlc3QgdmlkZSBvdSBzb24gc3lzdMOobWUgZGUgZmljaGllcnMgblwnZXN0IHBhcyBwcmlzIGVuIGNoYXJnZS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NDEwNzIzOTA2MDE5MTAwMTg5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE3MjQ2MTk5MDIwNzY1Mjg4ODkiPiJDYXJ0ZSBTRCBlbmRvbW1hZ8OpZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iQ2FydGUgU0QgZW5kb21tYWfDqWUiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNjc5NDEyODg0MjkwMDYxNzc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjQ2MDMxMTgzNTEzMDY3MTE5NCI+IkxhIGNhcnRlIFNEIGVzdCBlbmRvbW1hZ8OpZS4gVm91cyBkZXZyZXogcGV1dC3DqnRyZSByZWZvcm1hdGVyIHZvdHJlIGNhcnRlLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY5MDI1MzE3NzU5NDgyMzg5ODkiPiJMYSBjYXJ0ZSBTRCBlc3QgZW5kb21tYWfDqWUuIFZvdXMgZGV2cmV6IHBldXQtw6p0cmUgbGEgcmVmb3JtYXRlci4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2ODcyMTUyODgyNjA0NDA3ODM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjU4MjE3NTAxNjA2MDQzMjAzNCI+IkNhcnRlIFNEIHJldGlyw6llIGlub3BpbsOpbWVudCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJDYXJ0ZSBTRCByZXRpcsOpZSBpbm9waW7DqW1lbnQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3MjYwMTgzMjkzNzQ3NDQ4MjQxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyMDA1Mzk2NDY0NDk0NjQ4OTM3Ij4iRMOpc2FjdGl2ZXIgbGEgY2FydGUgU0QgYXZhbnQgZGUgbGEgcmV0aXJlciBwb3VyIMOpdml0ZXIgdG91dGUgcGVydGUgZGUgZG9ubsOpZXMuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4iRMOpc2FjdGl2ZXIgbGEgY2FydGUgU0QgYXZhbnQgZGUgbGEgcmV0aXJlciBwb3VyIMOpdml0ZXIgdG91dGUgcGVydGUgZGUgZG9ubsOpZXMuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjcyOTgwMTEzMDc5MDYxNjIwMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzY1MjU4ODEwMTg2Nzk1MTUiPiJMYSBjYXJ0ZSBTRCBwZXV0IMOqdHJlIHJldGlyw6llIGVuIHRvdXRlIHPDqWN1cml0w6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJMYSBjYXJ0ZSBTRCBwZXV0IMOqdHJlIHJldGlyw6llIGVuIHRvdXRlIHPDqWN1cml0w6kiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3NjEzOTYwNjg2NzQ3NTkyNzcwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijc1MDM3NjkxMDYyODUxODg3MDMiPiJWb3VzIHBvdXZleiBkw6lzb3JtYWlzIHJldGlyZXIgbGEgY2FydGUgU0QgZW4gdG91dGUgc8OpY3VyaXTDqS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4iVm91cyBwb3V2ZXogcmV0aXJlciBsYSBjYXJ0ZSBTRCBlbiB0b3V0ZSBzw6ljdXJpdMOpLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg5MDI1MTgwMzA0MDQzODEzMTggLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxODc0ODg5NzY0MzY3MDg1NTYyIj4iQ2FydGUgU0QgbWFucXVhbnRlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IkNhcnRlIFNEIG1hbnF1YW50ZSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQyMDUxMTcyMjczNDI4MjIyNzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI3MzA4OTA0NDEzMzEzNDQ3NzYiPiJDYXJ0ZSBTRCBtYW5xdWFudGUuIEluc8OpcmV6IHVuZSBhdXRyZSBjYXJ0ZSBwb3VyIGF1Z21lbnRlciBsYSBjYXBhY2l0w6kgZGUgc3RvY2thZ2UuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iTGEgY2FydGUgU0QgYSDDqXTDqSByZXRpcsOpZS4gSW5zw6lyZXotZW4gdW5lIGF1dHJlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IkNhcnRlIFNEIHZpZGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJMYSBjYXJ0ZSBTRCBlc3QgdmlkZSBvdSBzb24gc3lzdMOobWUgZGUgZmljaGllcnMgblwnZXN0IHBhcyBwcmlzIGVuIGNoYXJnZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjQxMDcyMzkwNjAxOTEwMDE4OSI+IkNhcnRlIFNEIGVuZG9tbWFnw6llIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IkxhIGNhcnRlIFNEIGVzdCBlbmRvbW1hZ8OpZS4gVm91cyBkZXZyZXogcGV1dC3DqnRyZSBsYSByZWZvcm1hdGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJDYXJ0ZSBTRCByZXRpcsOpZSBpbm9waW7DqW1lbnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiJEw6lzYWN0aXZlciBsYSBjYXJ0ZSBTRCBhdmFudCBkZSBsYSByZXRpcmVyIHBvdXIgw6l2aXRlciB0b3V0ZSBwZXJ0ZSBkZSBkb25uw6llcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJMYSBjYXJ0ZSBTRCBwZXV0IMOqdHJlIHJldGlyw6llIGVuIHRvdXRlIHPDqWN1cml0w6kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4iVm91cyBwb3V2ZXogcmV0aXJlciBsYSBjYXJ0ZSBTRCBlbiB0b3V0ZSBzw6ljdXJpdMOpLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiJDYXJ0ZSBTRCBtYW5xdWFudGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjM4NzAxMjA2NTI5ODM2NTk2NDEiPiJMYSBjYXJ0ZSBTRCBhIMOpdMOpIHJldGlyw6llLiBJbnPDqXJlei1lbiB1bmUgYXV0cmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfbGlzdF9lbXB0eSIgbXNnaWQ9IjQxNjg4MjA2MDk0MDMzODU3ODkiPiJBdWN1bmUgYWN0aXZpdMOpIGNvcnJlc3BvbmRhbnRlIHRyb3V2w6llIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODc4NzM1MjA3NDMyNjc0ODg5MiI+Im1ldHRyZSDDoCBqb3VyIGxlcyBkb25uw6llcyBzdGF0aXN0aXF1ZXMgZHUgY29tcG9zYW50Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg5MTU1MzY5NTcxNjc1MjgzNSI+IlBlcm1ldCBkZSBtb2RpZmllciBsZXMgZG9ubsOpZXMgc3RhdGlzdGlxdWVzIGNvbGxlY3TDqWVzIGR1IGNvbXBvc2FudC4gQ2V0dGUgb3B0aW9uIG5cJ2VzdCBwYXMgdXRpbGlzw6llIHBhciBsZXMgYXBwbGljYXRpb25zIHN0YW5kYXJkLiI8L3N0cmluZz4KQEAgLTg5OCwxNSArODcyLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iVlBOIEwyVFAvSVBTZWMgYmFzw6kgc3VyIHVuZSBjbMOpIHByw6ktcGFydGFnw6llIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlZQTiBMMlRQL0lQU2VjIGJhc8OpIHN1ciB1biBjZXJ0aWZpY2F0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iU8OpbGVjdGlvbm5lciB1biBmaWNoaWVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iQXVjdW4gZmljaGllciBzw6lsZWN0aW9ubsOpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUsOpaW5pdGlhbGlzZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iRW52b3llciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iTW9kZSBWb2l0dXJlIGFjdGl2w6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iU8OpbGVjdGlvbm5leiBjZXR0ZSBvcHRpb24gcG91ciBxdWl0dGVyIGxlIG1vZGUgVm9pdHVyZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iUGFydGFnZSBkZSBjb25uZXhpb24gb3UgcG9pbnQgZFwnYWNjw6hzIHNhbnMgZmlsIGFjdGl2w6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJUb3VjaGVyIHBvdXIgY29uZmlndXJlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IlJldG91ciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IlN1aXZhbnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiJJZ25vcmVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iVXRpbGlzYXRpb24gw6lsZXbDqWUgZGVzIGRvbm7DqWVzIG1vYmlsZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IlRvdWNoZXogcG91ciBlbiBzYXZvaXIgcGx1cyBzdXIgbFwndXRpbGlzYXRpb24gZGVzIGRvbm7DqWVzIG1vYmlsZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IlF1b3RhIGRcJ3V0aWxpc2F0aW9uIGRlcyBkb25uw6llcyBtb2JpbGVzIGTDqXBhc3PDqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiJUb3VjaGV6IHBvdXIgZW4gc2F2b2lyIHBsdXMgc3VyIGxcJ3V0aWxpc2F0aW9uIGRlcyBkb25uw6llcyBtb2JpbGVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fbWF0Y2hlcyIgbXNnaWQ9IjgxMjk0MjE5MDg5MTU4NDA3MzciPiJBdWN1bmUgY29ycmVzcG9uZGFuY2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmaW5kX29uX3BhZ2UiIG1zZ2lkPSIxOTQ2Nzk5MjMzODIyODIwMzg0Ij4iUmVjaGVyY2hlciBzdXIgbGEgcGFnZSI8L3N0cmluZz4KKyAgPHBsdXJhbHMgbmFtZT0ibWF0Y2hlc19mb3VuZCI+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im9uZSIgbXNnaWQ9IjgxNjcxNDcwODExMzY1Nzk0MzkiPiIxwqBjb3JyZXNwb25kYW5jZSI8L2l0ZW0+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im90aGVyIiBtc2dpZD0iNDY0MTg3Mjc5NzA2NzYwOTE3NyI+Ijx4bGlmZjpnIGlkPSJJTkRFWCI+JWQ8L3hsaWZmOmc+IHN1csKgPHhsaWZmOmcgaWQ9IlRPVEFMIj4lZDwveGxpZmY6Zz4iPC9pdGVtPgorICA8L3BsdXJhbHM+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCmluZGV4IDg2NWIwZTguLmFiMzc4OTMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbApAQCAtMTY5LDggKzE2OSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfZGV2ZWxvcG1lbnRUb29scyIgbXNnaWQ9IjM0NDYxNjQ1ODQ3MTA1OTY1MTMiPiJTdHJ1bWVudGkgZGkgc3ZpbHVwcG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSI5MDU2NDMxMTkzODkzODA5ODE0Ij4iRnVuemlvbmFsaXTDoCBuZWNlc3NhcmllIHNvbHRhbnRvIGFnbGkgc3ZpbHVwcGF0b3JpIGRpIGFwcGxpY2F6aW9uaS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfc3RvcmFnZSIgbXNnaWQ9IjE5NzExMTg3NzA1NDYzMzY5NjYiPiJBcmNoaXZpYXppb25lIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTIwMzMwMjIxNDkxNTM1NTc3NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjU0NTU4MDQzNTMyMjA1ODEzMTIiPiJBY2Nlc3NvIGFsbGEgc2NoZWRhIFNELiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiJBY2Nlc3NvIGFsbGEgc2NoZWRhIFNELiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiJBY2Nlc3NvIGFsbGEgc2NoZWRhIFNELiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyIiBtc2dpZD0iNzQxNzE5MjYyOTYwMTg5MDc5MSI+ImRpc2F0dGl2YXJlIG8gbW9kaWZpY2FyZSBsYSBiYXJyYSBkaSBzdGF0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3N0YXR1c0JhciIgbXNnaWQ9IjEzNjU0NzM1OTUzMzE5ODk3MzIiPiJDb25zZW50ZSBhbGxcJ2FwcGxpY2F6aW9uZSBkaSBkaXNhdHRpdmFyZSBsYSBiYXJyYSBkaSBzdGF0byBvIGRpIGFnZ2l1bmdlcmUgZSByaW11b3ZlcmUgaWNvbmUgZGkgc2lzdGVtYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhclNlcnZpY2UiIG1zZ2lkPSI3MjQ3MjgxOTExMzg3OTMxNDg1Ij4iYmFycmEgZGkgc3RhdG8iPC9zdHJpbmc+CkBAIC0yNjcsOCArMjY2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jbGVhckFwcENhY2hlIiBtc2dpZD0iNzc0MDQ2NTY5NDE5MzY3MTQwMiI+IkNvbnNlbnRlIGEgdW5cJ2FwcGxpY2F6aW9uZSBkaSBsaWJlcmFyZSBzcGF6aW8gc3VsIHRlbGVmb25vIGVsaW1pbmFuZG8gZmlsZSBuZWxsYSBkaXJlY3RvcnkgZGVsbGEgY2FjaGUgZGVsbFwnYXBwbGljYXppb25lLiBMXCdhY2Nlc3NvIMOoIGdlbmVyYWxtZW50ZSBsaW1pdGF0byBhIHByb2Nlc3NpIGRpIHNpc3RlbWEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9tb3ZlUGFja2FnZSIgbXNnaWQ9IjcyODQ1NDk3OTk0NjUwMzkyNiI+IlNwb3N0YXJlIHJpc29yc2UgZGVsbFwnYXBwbGljYXppb25lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW92ZVBhY2thZ2UiIG1zZ2lkPSI2MzIzMDQ5MjkxOTIzOTI1Mjc3Ij4iQ29uc2VudGUgYSB1blwnYXBwbGljYXppb25lIGRpIHNwb3N0YXJlIHJpc29yc2UgYXBwbGljYXRpdmUgZGEgc3VwcG9ydGkgaW50ZXJuaSBhIGVzdGVybmkgZSB2aWNldmVyc2EuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDgxMTkyMTcwMzg4MjUzMjA3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkTG9ncyIgbXNnaWQ9IjY2MTU3Nzg1NDMxOTg5Njc2MTQiPiJsZXR0dXJhIGZpbGUgZGkgcmVnaXN0cm8gc2lzdGVtYSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIyNTc5Mzc5NTU1ODA0NzU5MDIgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+IkNvbnNlbnRlIGEgdW5cJ2FwcGxpY2F6aW9uZSBkaSBsZWdnZXJlIHZhcmkgZmlsZSBkaSByZWdpc3RybyBkZWwgc2lzdGVtYSBwZXIgdHJvdmFyZSBpbmZvcm1hemlvbmkgZ2VuZXJhbGkgc3VsbGUgb3BlcmF6aW9uaSBlZmZldHR1YXRlIGNvbiBpbCB0ZWxlZm9uby4gVGFsaSBmaWxlIG5vbiBkb3ZyZWJiZXJvIGNvbnRlbmVyZSBpbmZvcm1hemlvbmkgcGVyc29uYWxpIG8gcmlzZXJ2YXRlLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRMb2dzICg2NjE1Nzc4NTQzMTk4OTY3NjE0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRMb2dzICg4ODk2NDQ5NDM3NDY0ODY3NzY2KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaWFnbm9zdGljIiBtc2dpZD0iODA3Njc0Mzk1MzkwODAwMDM0MiI+ImxldHR1cmEvc2NyaXR0dXJhIHJpc29yc2UgZGkgcHJvcHJpZXTDoCBkaSBkaWFnIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlhZ25vc3RpYyIgbXNnaWQ9IjMxMjEyMzgzNzM5NTE2MzcwNDkiPiJDb25zZW50ZSBhIHVuXCdhcHBsaWNhemlvbmUgZGkgbGVnZ2VyZSBsZSByaXNvcnNlIGRlbCBncnVwcG8gZGlhZyBlIHNjcml2ZXJlIGEgZXNzZSwgcGVyIGVzZW1waW8gaSBmaWxlIGluIC9kZXYuIFF1ZXN0YSBjYXBhY2l0w6AgcG90cmViYmUgaW5mbHVpcmUgc3VsbGEgc3RhYmlsaXTDoCBlIHNpY3VyZXp6YSBkZWwgc2lzdGVtYS4gRG92cmViYmUgZXNzZXJlIHV0aWxpenphdGEgU09MVEFOVE8gcGVyIGRpYWdub3N0aWNoZSBzcGVjaWZpY2hlIGRlbGxcJ2hhcmR3YXJlIGVmZmV0dHVhdGUgZGFsIHByb2R1dHRvcmUgbyBkYWxsXCdvcGVyYXRvcmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VDb21wb25lbnRTdGF0ZSIgbXNnaWQ9Ijc5NDI1MTk4ODM0MzI5NDA2Ij4iYXR0aXZhemlvbmUvZGlzYXR0aXZhemlvbmUgY29tcG9uZW50aSBhcHBsaWNhemlvbmkiPC9zdHJpbmc+CkBAIC00MDMsMjIgKzQwNCw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGhBZG1pbiIgbXNnaWQ9IjcyNTYyODk3NzQ2NjcwNTQ1NTUiPiJDb25zZW50ZSBhIHVuXCdhcHBsaWNhemlvbmUgZGkgY29uZmlndXJhcmUgaWwgdGVsZWZvbm8gQmx1ZXRvb3RoIGxvY2FsZSBlIGRpIHJpbGV2YXJlIGUgYWJiaW5hcmUgZGlzcG9zaXRpdmkgcmVtb3RpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYmx1ZXRvb3RoIiBtc2dpZD0iODM2MTAzODcwNzg1NzAxODczMiI+ImNyZWF6aW9uZSBjb25uZXNzaW9uaSBCbHVldG9vdGgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGgiIG1zZ2lkPSI3NjI1MTUzODA2NzkzOTI5NDUiPiJDb25zZW50ZSBhIHVuXCdhcHBsaWNhemlvbmUgZGkgdmlzdWFsaXp6YXJlIGxhIGNvbmZpZ3VyYXppb25lIGRlbCB0ZWxlZm9ubyBCbHVldG9vdGggbG9jYWxlIGUgZGkgc3RhYmlsaXJlIGUgYWNjZXR0YXJlIGNvbm5lc3Npb25pIGNvbiBkaXNwb3NpdGl2aSBhc3NvY2lhdGkuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjQWRtaW4gKDIyNTEzMDIyMzMwMTIyNTAwNTYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjQWRtaW4gKDE5MzU4NDI2MTE0NjQ4OTU3ODUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNSYXcgKDQ0MjM0NzE3MTExMTQzMjU3MDgpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjUmF3ICg1NTMzMDIyNzM2NTU5Mzg1NjY1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjTm90aWZ5ICg0Nzg0NzAzNjAwODI3OTIzNTgpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTm90aWZ5ICgyOTkwMDUzNTE3OTYyMDcwNjE3KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjTGxjcCAoNDk3MjA1MTQ2MTAwNzAzMDQyNikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNMbGNwICg5MTU5MjEyNzc4NjAwNDY0MCkgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iNDk3NzQwNjE2NDMxMTUzNTA5MiI+ImRpc2F0dGl2YXppb25lIGJsb2NjbyB0YXN0aWVyYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjMxODk3NjM0NzkzMjYzMDIwMTciPiJDb25zZW50ZSBsYSBkaXNhdHRpdmF6aW9uZSBkYSBwYXJ0ZSBkaSB1blwnYXBwbGljYXppb25lIGRlbCBibG9jY28gdGFzdGllcmEgZSBkaSBldmVudHVhbGkgcHJvdGV6aW9uaSB0cmFtaXRlIHBhc3N3b3JkIGFzc29jaWF0ZS4gVW4gdmFsaWRvIGVzZW1waW8gw6ggbGEgZGlzYXR0aXZhemlvbmUgZGEgcGFydGUgZGVsIHRlbGVmb25vIGRlbCBibG9jY28gdGFzdGllcmEgcXVhbmRvIHJpY2V2ZSB1bmEgdGVsZWZvbmF0YSBpbiBlbnRyYXRhLCBlIGxhIHN1Y2Nlc3NpdmEgcmlhdHRpdmF6aW9uZSBkZWwgYmxvY2NvIGFsIHRlcm1pbmUgZGVsbGEgY2hpYW1hdGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkU3luY1NldHRpbmdzIiBtc2dpZD0iNjIwMTgxMDAwODIzMDUwMzA1MiI+ImxldHR1cmEgaW1wb3N0YXppb25pIGRpIHNpbmNyb25penouIjwvc3RyaW5nPgpAQCAtNDM1LDIyICs0MjAsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iMTA4Mjk3MjYwMzU3NjM2MDY5MCI+IkNvbnNlbnRlIGEgdW5cJ2FwcGxpY2F6aW9uZSBkaSBsZWdnZXJlIHBhcm9sZSwgbm9taSBlIGZyYXNpIHByaXZhdGUgY2hlIGxcJ3V0ZW50ZSBwb3RyZWJiZSBhdmVyIG1lbW9yaXp6YXRvIG5lbCBkaXppb25hcmlvIHV0ZW50ZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjY3MDMxMDk1MTE4MzYzNDMzNDEiPiJzY3JpdHR1cmEgbmVsIGRpemlvbmFyaW8gZGVmaW5pdG8gZGFsbFwndXRlbnRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI0MTI1NjIwNjUyNDA4Mjg4MCI+IkNvbnNlbnRlIGEgdW5cJ2FwcGxpY2F6aW9uZSBkaSBzY3JpdmVyZSBudW92ZSBwYXJvbGUgbmVsIGRpemlvbmFyaW8gdXRlbnRlLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDgwNzk0MDM3NTkwMDE3NzcyOTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iOTkzNzA3NDM2OTQxMDE2OTEzIj4ibW9kaWZpY2FyZS9lbGltaW5hcmUgaSBjb250ZW51dGkgZGVsbGEgc2NoZWRhIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJtb2RpZmljYXJlL2VsaW1pbmFyZSBpIGNvbnRlbnV0aSBkZWxsYSBzY2hlZGEgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NjQzOTYzMjA0OTc2NDcxODc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MTMxODcxNTQxMTI3MjExNTI2Ij4iQ29uc2VudGUgYSB1blwnYXBwbGljYXppb25lIGRpIHNjcml2ZXJlIHN1bGxhIHNjaGVkYSBTRC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiJDb25zZW50ZSBhIHVuXCdhcHBsaWNhemlvbmUgZGkgc2NyaXZlcmUgc3VsbGEgc2NoZWRhIFNELiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4ibW9kaWZpY2FyZS9lbGltaW5hcmUgaSBjb250ZW51dGkgZGVsbGEgc2NoZWRhIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4iQ29uc2VudGUgYSB1blwnYXBwbGljYXppb25lIGRpIHNjcml2ZXJlIHN1bGxhIHNjaGVkYSBTRC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSI1NjU2NDg3MjY0ODE5NjY5ODI0Ij4iYWNjZXNzbyBhbCBmaWxlc3lzdGVtIG5lbGxhIGNhY2hlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjE2MjQ3MzQ1Mjg0MzU2NTk5MDYiPiJDb25zZW50ZSBhIHVuXCdhcHBsaWNhemlvbmUgZGkgbGVnZ2VyZSBlIHNjcml2ZXJlIGlsIGZpbGVzeXN0ZW0gbmVsbGEgY2FjaGUuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDMwNzg2MTQ5NjMwMjg1MDIwMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0NDk3NDIwNzI4ODU3NTg1NzkxIj4iTGltaXRhIHBhc3N3b3JkIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTcxOTg3NzI0NTY5MjMxODI5OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iOTA4MzQwMDA4MDg2MTcyODA1NiI+IkxpbWl0YSBpIHRpcGkgZGkgcGFzc3dvcmQgY2hlIHNlaSBhdXRvcml6emF0byBhIHV0aWxpenphcmUuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzM3NDc4MDcxMjY2NDI4NTMyMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI5MTQxMzA2NDY5NDIxOTk1MDMiPiJDb250cm9sbGEgaSB0ZW50YXRpdmkgZGkgYWNjZXNzbyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE5NjEyNTExNzk2MjQ4NDM0ODMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjcyMjc1NzgyNjAxNjUxNzI2NzMiPiJNb25pdG9yYSBpIHRlbnRhdGl2aSBub24gcml1c2NpdGkgZGkgYWNjZWRlcmUgYWwgZGlzcG9zaXRpdm8gcGVyIGVzZWd1aXJlIHVuXCdhemlvbmUuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTA4NDc3MjA5MDc5NzQ4NTQyMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIyNjIwMDc3MTkxMjQyNjg4OTU1Ij4iUmVpbXBvc3RhIHBhc3N3b3JkIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzMzMjE2NzYwMDMzMTc5OTk5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iNTM5MTI0MDYxNjk4MTI5NzM2MSI+IkZvcnphIHVuIG51b3ZvIHZhbG9yZSBwZXIgbGEgcGFzc3dvcmQsIGNoaWVkZW5kbyBhbGxcJ2FtbWluaXN0cmF0b3JlIGRpIGNvbmNlZGVydGVsbyBwcmltYSBkaSBwb3RlciBlc2VndWlyZSBsXCdhY2Nlc3NvLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU3NjA0NjYwMjUyNDc2MzQ0ODggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSIyMjc0MDg1Mzg0NzA0MjQ4NDMxIj4iRm9yemEgYmxvY2NvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjgxOTg2ODY2NDk0NjA4OTc0MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSI1Njk2OTY0MTI2MjI2MDI4NDQyIj4iQ29udHJvbGxhIHF1YW5kbyBpbCBkaXNwb3NpdGl2byBzaSBibG9jY2EsIGNoaWVkZW5kb3RpIGRpIHJlaW5zZXJpcmUgbGEgcGFzc3dvcmQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0MzA3ODYxNDk2MzAyODUwMjAxIj4iTGltaXRhIHBhc3N3b3JkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iMTcxOTg3NzI0NTY5MjMxODI5OSI+IkxpbWl0YSBpIHRpcGkgZGkgcGFzc3dvcmQgY2hlIHNlaSBhdXRvcml6emF0byBhIHV0aWxpenphcmUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI3Mzc0NzgwNzEyNjY0Mjg1MzIxIj4iQ29udHJvbGxhIGkgdGVudGF0aXZpIGRpIGFjY2Vzc28iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSIxOTYxMjUxMTc5NjI0ODQzNDgzIj4iTW9uaXRvcmEgaSB0ZW50YXRpdmkgbm9uIHJpdXNjaXRpIGRpIGFjY2VkZXJlIGFsIGRpc3Bvc2l0aXZvIHBlciBlc2VndWlyZSB1blwnYXppb25lLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iOTA4NDc3MjA5MDc5NzQ4NTQyMCI+IlJlaW1wb3N0YSBwYXNzd29yZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjMzMzIxNjc2MDAzMzE3OTk5OTEiPiJGb3J6YSB1biBudW92byB2YWxvcmUgcGVyIGxhIHBhc3N3b3JkLCBjaGllZGVuZG8gYWxsXCdhbW1pbmlzdHJhdG9yZSBkaSBjb25jZWRlcnRlbG8gcHJpbWEgZGkgcG90ZXIgZXNlZ3VpcmUgbFwnYWNjZXNzby4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iNTc2MDQ2NjAyNTI0NzYzNDQ4OCI+IkZvcnphIGJsb2NjbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkNvbnRyb2xsYSBxdWFuZG8gaWwgZGlzcG9zaXRpdm8gc2kgYmxvY2NhLCBjaGllZGVuZG90aSBkaSByZWluc2VyaXJlIGxhIHBhc3N3b3JkLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJDYW5jZWxsYSB0dXR0aSBpIGRhdGkiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyMzE0MDYwOTMzNzk2Mzk2MjA1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iNzY2OTg5NTMzMzgxNDIyMjU4NiI+IkVzZWd1aSB1biByaXByaXN0aW5vIGRpIGZhYmJyaWNhLCBlbGltaW5hbmRvIHR1dHRpIGkgdHVvaSBkYXRpIHNlbnphIGNvbmZlcm1hLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iRXNlZ3VpIHVuIHJpcHJpc3Rpbm8gZGkgZmFiYnJpY2EsIGVsaW1pbmFuZG8gdHV0dGkgaSB0dW9pIGRhdGkgc2VuemEgY29uZmVybWEuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkiIG1zZ2lkPSI2Mzg3NDk3NDY2NjYwMTU0OTMxIj4iSW1wb3N0YSBpbCBwcm94eSBnbG9iYWxlIGRlbCBkaXNwb3NpdGl2byBpbiBtb2RvIGRhIHV0aWxpenphcmxvIG1lbnRyZSBsYSBub3JtYSDDqCBhdHRpdmEuIElsIHByb3h5IGdsb2JhbGUgZWZmZXR0aXZvIMOoIGltcG9zdGFiaWxlIHNvbG8gZGFsIHByaW1vIGFtbWluaXN0cmF0b3JlIGRlbCBkaXNwb3NpdGl2by4iPC9zdHJpbmc+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJDYXNhIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iQ2VsbHVsYXJlIjwvaXRlbT4KQEAgLTU1MiwxMCArNTM4LDkgQEAKICAgICA8c2tpcCAvPgogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlT3RoZXIgKDQ0MDg0MzYxNjI5NTAxMTk4NDkpIC0tPgogICAgIDxza2lwIC8+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4idHJhbWl0ZSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IHRyYW1pdGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJJbnNlcmlzY2kgaWwgUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJJbnNlcmlzY2kgcGFzc3dvcmQgcGVyIHNibG9jY2FyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iSW5zZXJpc2NpIFBJTiBwZXIgc2Jsb2NjYXJlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iQ29kaWNlIFBJTiBlcnJhdG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlBlciBzYmxvY2NhcmUsIHByZW1pIE1lbnUsIHBvaSAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOdW1lcm8gZGkgZW1lcmdlbnphIjwvc3RyaW5nPgpAQCAtNTY4LDYgKzU1Myw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IlRvcm5hIGEgY2hpYW1hdGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJDb3JyZXR0YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iUmlwcm92YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iUmlwcm92YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IkluIGNhcmljYSAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iQ2FyaWNvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTgyLDYgKzU2OCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJMYSBTSU0gw6ggYmxvY2NhdGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iU2Jsb2NjbyBTSU0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB0ZW50YXRpdmkgZGkgaW5zZXJpbWVudG8gZGVsbGEgc2VxdWVuemEgZGkgc2Jsb2Njby4gIlxuXG4iUmlwcm92YSBmcmEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2Vjb25kaS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB0ZW50YXRpdmkgZXJyYXRpIGRpIGluc2VyaW1lbnRvIGRlbGxhIHBhc3N3b3JkLiAiXG5cbiJSaXByb3ZhIHRyYSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRpLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB0ZW50YXRpdmkgZXJyYXRpIGRpIGluc2VyaW1lbnRvIGRlbCBQSU4uICJcblxuIlJpcHJvdmEgdHJhIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlY29uZGkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB0ZW50YXRpdmkgZGkgaW5zZXJpbWVudG8gZGVsbGEgc2VxdWVuemEgZGkgc2Jsb2Njby4gRG9wbyBhbHRyaSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiB0ZW50YXRpdmkgZmFsbGl0aSwgdGkgdmVycsOgIGNoaWVzdG8gZGkgc2Jsb2NjYXJlIGlsIHRlbGVmb25vIHRyYW1pdGUgaSBkYXRpIGRpIGFjY2Vzc28gZGkgR29vZ2xlLiJcblxuIlJpcHJvdmEgZnJhIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNlY29uZGkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlJpcHJvdmEgZnJhIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWNvbmRpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iSGFpIGRpbWVudGljYXRvIGxhIHNlcXVlbnphPyI8L3N0cmluZz4KQEAgLTYxMCwxNCArNTk4LDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJqc19kaWFsb2dfYmVmb3JlX3VubG9hZCIgbXNnaWQ9IjE5MDE2NzU0NDgxNzk2NTMwODkiPiJVc2NpcmUgZGEgcXVlc3RhIHBhZ2luYT8iXG5cbiI8eGxpZmY6ZyBpZD0iTUVTU0FHRSI+JXM8L3hsaWZmOmc+IlxuXG4iU2VsZXppb25hIE9LIHBlciBjb250aW51YXJlIG8gQW5udWxsYSBwZXIgcmltYW5lcmUgbmVsbGEgcGFnaW5hIGNvcnJlbnRlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbGFiZWwiIG1zZ2lkPSI2ODYwMjYxNzU4NjY1ODI1MDY5Ij4iQ29uZmVybWEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkb3VibGVfdGFwX3RvYXN0IiBtc2dpZD0iMTA2ODIxNjkzNzI0NDU2NzI0NyI+IlN1Z2dlcmltZW50by4gVG9jY2EgZHVlIHZvbHRlIHBlciBhdW1lbnRhcmUvcmlkdXJyZSBsbyB6b29tLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvZmlsbF90aGlzX2Zvcm0gKDg5NDAxMTA4NjY3NzUwOTc0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iMTI4NDg0MzcyODIwMzQxMjEzNSI+ImxldHR1cmEgY3Jvbm9sb2dpYSBlIHNlZ25hbGlicmkgZGVsIGJyb3dzZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjQ5ODE0ODk4MTU0Njc2MTcxOTEiPiJDb25zZW50ZSBhbGxcJ2FwcGxpY2F6aW9uZSBkaSBsZWdnZXJlIHR1dHRpIGdsaSBVUkwgdmlzaXRhdGkgZSB0dXR0aSBpIHNlZ25hbGlicmkgZGVsIGJyb3dzZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5MDA5NDM0MTA5ODM2MjgwMzc0Ij4iY3JlYXppb25lIGNyb25vbG9naWEgZSBzZWduYWxpYnJpIGRlbCBicm93c2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTQ1NTcxOTkwMzU3MTE0OTUwIj4iQ29uc2VudGUgYSB1blwnYXBwbGljYXppb25lIGRpIG1vZGlmaWNhcmUgbGEgY3Jvbm9sb2dpYSBvIGkgc2VnbmFsaWJyaSBkZWwgYnJvd3NlciBtZW1vcml6emF0aSBzdWwgdGVsZWZvbm8uIExlIGFwcGxpY2F6aW9uaSBkYW5ub3NlIHBvc3Nvbm8gc2ZydXR0YXJlIHF1ZXN0YSBwb3NzaWJpbGl0w6AgcGVyIGNhbmNlbGxhcmUgbyBtb2RpZmljYXJlIGkgZGF0aSBkZWwgYnJvd3Nlci4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRBbGFybSAoNTkyNDQwMTMyODgwMzYxNTE2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRBbGFybSAoNTk2Njk2NjU5ODE0OTg3NTA4MikgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDcxNTIxMjY1NTU5ODI3NTUzMiI+Ik1vZGlmaWNhIGxlIGF1dG9yaXp6YXppb25pIGRpIGxvY2FsaXp6YXppb25lIGdlb2dyYWZpY2EgZGVsIGJyb3dzZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0MDExOTA4MjgyOTgwODYxNjc5Ij4iQ29uc2VudGUgYSB1blwnYXBwbGljYXppb25lIGRpIG1vZGlmaWNhcmUgbGUgYXV0b3JpenphemlvbmkgZGkgbG9jYWxpenphemlvbmUgZ2VvZ3JhZmljYSBkZWwgYnJvd3Nlci4gTGUgYXBwbGljYXppb25pIGRhbm5vc2UgcG9zc29ubyB1dGlsaXp6YXJlIHF1ZXN0YSBhdXRvcml6emF6aW9uZSBwZXIgY29uc2VudGlyZSBsXCdpbnZpbyBkaSBpbmZvcm1hemlvbmkgc3VsbGEgcG9zaXppb25lIGEgc2l0aSB3ZWIgYXJiaXRyYXJpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbWVzc2FnZSIgbXNnaWQ9Ijc2NzM0NDY4NzEzOTE5NTc5MCI+Ik1lbW9yaXp6YXJlIGxhIHBhc3N3b3JkIG5lbCBicm93c2VyPyI8L3N0cmluZz4KQEAgLTczMCwxNCArNzE2LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iU2VsZXppb25hIHR1dHRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiJTZWxlemlvbmEgcGFyb2xhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IlRhZ2xpYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iQ29waWEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJJbmNvbGxhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJDb3BpYSBVUkwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiJTZWxlemlvbmEgdGVzdG8uLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4iU2VsZXppb25lIHRlc3RvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iTWV0b2RvIGluc2VyaW1lbnRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkFnZ2l1bmdpIFwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiIGFsIGRpemlvbmFyaW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJNb2RpZmljYSB0ZXN0byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iNDkwOTEzNTU2NDk0MTgxNTQ5NCI+IkF6aW9uaSB0ZXN0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iU3BhemlvIGluIGVzYXVyaW1lbnRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iU3BhemlvIGRpIGFyY2hpdmlhemlvbmUgZGVsIHRlbGVmb25vIGluIGVzYXVyaW1lbnRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzQ1LDYgKzczMSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJBbm51bGxhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IkF0dGVuemlvbmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkNhcmljYW1lbnRvIGluIGNvcnNvLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJPTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+Ik9GRiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iQ29tcGxldGEgbFwnYXppb25lIGNvbiI8L3N0cmluZz4KQEAgLTc2MywxNiArNzUwLDE5IEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiJUZXJtaW5hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+IlNlZ25hbGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3YWl0IiBtc2dpZD0iNzE0NzExODIxNzIyNjMxNzczMiI+IkF0dGVuZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJBcHBsaWNhemlvbmUgcmVpbmRpcml6emF0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiDDqCBvcmEgaW4gZXNlY3V6aW9uZS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gZ2nDoCBhdnZpYXRhLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ190aXRsZSAoODMyMzc2MTYxNjA1MjEyMTkzNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19yZXBsYWNlICg2MjAyNDk4OTQ5OTcwMjgxNDEyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX29yaWdpbmFsICgxODgxMDIwMjMwMjE2Njg2ODMpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJMXCdhcHBsaWNhemlvbmUgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2Vzc28gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBoYSB2aW9sYXRvIGxhIG5vcm1hIFN0cmljdE1vZGUgYXV0b2ltcG9zdGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iSWwgcHJvY2Vzc28gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGhhIHZpb2xhdG8gbGEgbm9ybWEgU3RyaWN0TW9kZSBhdXRvaW1wb3N0YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IGluIGVzZWN1emlvbmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uX2RldGFpbCIgbXNnaWQ9IjI0MjM5Nzc0OTkzMzk0MDM0MDIiPiJTZWxlemlvbmEgcGVyIHBhc3NhcmUgYWxsXCdhcHBsaWNhemlvbmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfc3dpdGNoZXJfdGl0bGUiIG1zZ2lkPSIxMTM1NDAzNjMzNzY2Njk0MzE2Ij4iU2NhbWJpYXJlIGxlIGFwcGxpY2F6aW9uaT8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfc3dpdGNoZXJfdGV4dCIgbXNnaWQ9IjQ1OTIwNzU2MTAwNzkzMTk2NjciPiJVblwnYWx0cmEgYXBwbGljYXppb25lIGdpw6AgaW4gZXNlY3V6aW9uZSBkZXZlIGVzc2VyZSBjaGl1c2EgcHJpbWEgZGkgcG90ZXJuZSBhdnZpYXJlIHVuXCdhbHRyYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJvbGRfYXBwX2FjdGlvbiIgbXNnaWQ9IjQ5MzEyOTE3MjIzODU2NjI4MiI+IlRvcm5hIGEgPHhsaWZmOmcgaWQ9Ik9MRF9BUFAiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ib2xkX2FwcF9hY3Rpb24iIG1zZ2lkPSI0OTMxMjkxNzIyMzg1NjYyODIiPiJUb3JuYSBhIDx4bGlmZjpnIGlkPSJPTERfQVBQIj4lMSRzPC94bGlmZjpnPiAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvbGRfYXBwX2Rlc2NyaXB0aW9uIiBtc2dpZD0iOTQyOTY3OTAwMjM3MjA4NDY2Ij4iTm9uIGF2dmlhcmUgbGEgbnVvdmEgYXBwbGljYXppb25lLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5ld19hcHBfYWN0aW9uIiBtc2dpZD0iNTQ3Mjc1NjkyNjk0NTQ0MDcwNiI+IkF2dmlhIDx4bGlmZjpnIGlkPSJPTERfQVBQIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5ld19hcHBfZGVzY3JpcHRpb24iIG1zZ2lkPSI2ODMwMzk4MzM5ODI2Nzg5NDkzIj4iSW50ZXJyb21waSBsYSB2ZWNjaGlhIGFwcGxpY2F6aW9uZSBzZW56YSBzYWx2YXJlLiI8L3N0cmluZz4KQEAgLTgxMiwyOCArODAyLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtc19zaG93X2FsbCIgbXNnaWQ9IjI2NzE3OTExNjM5MzMwOTExODAiPjxiPiJNb3N0cmEgdHV0dG8iPC9iPjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYWN0aXZpdHlfdGl0bGUiIG1zZ2lkPSIyMzk5Mjg5OTk5NjA4OTAwNDQzIj4iQXJjaGl2aWF6aW9uZSBkaSBtYXNzYSBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV90aXRsZSIgbXNnaWQ9IjU5MDE0NTkwNDEzOTg3NTE0OTUiPiJVU0IgY29sbGVnYXRhIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDc5Njc1OTY0NjE2NzI0NzE3OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4MjMxNDYyNzUwMDEwMDY2ODk2Ij4iSWwgdGVsZWZvbm8gw6ggc3RhdG8gY29sbGVnYXRvIGFsIGNvbXB1dGVyIHRyYW1pdGUgVVNCLiBTZWxlemlvbmEgaWwgcHVsc2FudGUgc290dG9zdGFudGUgc2UgZGVzaWRlcmkgY29waWFyZSBmaWxlIHRyYSBpbCBjb21wdXRlciBlIGxhIHNjaGVkYSBTRCBkaSBBbmRyb2lkLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4iSWwgdGVsZWZvbm8gw6ggc3RhdG8gY29sbGVnYXRvIGFsIGNvbXB1dGVyIHRyYW1pdGUgVVNCLiBTZWxlemlvbmEgaWwgcHVsc2FudGUgc290dG9zdGFudGUgc2UgZGVzaWRlcmkgY29waWFyZSBmaWxlIHRyYSBpbCBjb21wdXRlciBlIGxhIHNjaGVkYSBTRCBkaSBBbmRyb2lkLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4iSWwgdGVsZWZvbm8gw6ggc3RhdG8gY29sbGVnYXRvIGFsIGNvbXB1dGVyIHRyYW1pdGUgVVNCLiBTZWxlemlvbmEgaWwgcHVsc2FudGUgc290dG9zdGFudGUgc2UgZGVzaWRlcmkgY29waWFyZSBmaWxlIHRyYSBpbCBjb21wdXRlciBlIGxhIHNjaGVkYSBTRCBkaSBBbmRyb2lkLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjEwNTIyNTk5MzAzNjk1MDgyMzUiPiJBdHRpdmEgYXJjaGl2aW8gVVNCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjUzNDc4NDc1MTYwMzM0NTM2MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0ODE4MzQ3NzU2NDAyNzQwMjYxIj4iUHJvYmxlbWEgZGkgdXRpbGl6em8gZGVsbGEgc2NoZWRhIFNEIHBlciBsXCdhcmNoaXZpYXppb25lIFVTQi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IlByb2JsZW1hIGRpIHV0aWxpenpvIGRlbGxhIHNjaGVkYSBTRCBwZXIgbFwnYXJjaGl2aWF6aW9uZSBVU0IuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiJQcm9ibGVtYSBkaSB1dGlsaXp6byBkZWxsYSBzY2hlZGEgU0QgcGVyIGxcJ2FyY2hpdmlhemlvbmUgVVNCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjgxNzU4OTI1NTQ3NTcyMTY1MjUiPiJVU0IgY29sbGVnYXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MzgwMDgyNDA0Mjg4MjE5MzQxIj4iU2VsZXppb25hIHBlciBjb3BpYXJlIGZpbGUgc3VsL2RhbCB0dW8gY29tcHV0ZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIyMzM2MDU4Mzk2NjYzNTE2MDE3Ij4iRGlzYXR0aXZhIGFyY2hpdmlvIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNTkxODEzNDkwMjY5ODQxNTM5Ij4iU2VsZXppb25hIHBlciBkaXNhdHRpdmFyZSBhcmNoaXZpbyBVU0IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF90aXRsZSIgbXNnaWQ9IjY2MDEyOTg1MTcwODc3NTg1MyI+IkFyY2hpdmlhemlvbmUgVVNCIGluIHVzbyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MTM3MTMzOTY0MjY2MDQxMDQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NzQ1MzQ1MjYwNzgwMjY3MTg1Ij4iUHJpbWEgZGkgZGlzYXR0aXZhcmUgbFwnYXJjaGl2aWF6aW9uZSBVU0IsIGFzc2ljdXJhdGkgZGkgYXZlcmUgc21vbnRhdG8gKFwiZXNwdWxzb1wiKSBsYSBzY2hlZGEgU0QgZGkgQW5kcm9pZCBkYWwgY29tcHV0ZXIuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IlByaW1hIGRpIGRpc2F0dGl2YXJlIGxcJ2FyY2hpdmlhemlvbmUgVVNCLCBhc3NpY3VyYXRpIGRpIGF2ZXJlIHNtb250YXRvIChcImVzcHVsc29cIikgbGEgc2NoZWRhIFNEIGRpIEFuZHJvaWQgZGFsIGNvbXB1dGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJQcmltYSBkaSBkaXNhdHRpdmFyZSBsXCdhcmNoaXZpYXppb25lIFVTQiwgYXNzaWN1cmF0aSBkaSBhdmVyZSBzbW9udGF0byAoXCJlc3B1bHNvXCIpIGxhIHNjaGVkYSBTRCBkaSBBbmRyb2lkIGRhbCBjb21wdXRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjcwNjAyMTgwMzQ5MDA2OTYwMjkiPiJEaXNhdHRpdmEgYXJjaGl2aWF6aW9uZSBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIxNDM4ODE5MTQ4NDA0MTIxMDgiPiJTaSDDqCB2ZXJpZmljYXRvIHVuIHByb2JsZW1hIGR1cmFudGUgbGEgZGlzYXR0aXZhemlvbmUgZGVsbFwnYXJjaGl2aWF6aW9uZSBVU0IuIFZlcmlmaWNhIGRpIGF2ZXJlIHNtb250YXRvIGxcJ2hvc3QgVVNCIGUgcmlwcm92YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGl0bGUiIG1zZ2lkPSI5NjMwMzkwMzM0NzA0Nzg2OTciPiJBdHRpdmEgYXJjaGl2aW8gVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RleHQiIG1zZ2lkPSIzMjAyODM4MjM0NzgwNTA1ODg2Ij4iU2UgYXR0aXZpIGxcJ2FyY2hpdmlvIFVTQiwgYWxjdW5lIGFwcGxpY2F6aW9uaSBpbiB1c28gc2kgYmxvY2NoZXJhbm5vIGUgcG90cmViYmVybyByaXN1bHRhcmUgbm9uIGRpc3BvbmliaWxpIGZpbmNow6kgbm9uIGRpc2F0dGl2ZXJhaSBsXCdhcmNoaXZpbyBVU0IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2Vycm9yX3RpdGxlIiBtc2dpZD0iODA0ODk5OTk3MzgzNzMzOTE3NCI+Ik9wZXJhemlvbmUgVVNCIG5vbiByaXVzY2l0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19vayIgbXNnaWQ9IjczNzY5NTMxNjcwMzk4NjU3MDEiPiJPSyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg2NjMyNDc5Mjk1NTEwOTU4NTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NTc3OTA4MDA2OTQ5NzQyMjE3Ij4iRm9ybWF0dGEgc2NoZWRhIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IkZvcm1hdHRhIHNjaGVkYSBTRCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MjEzNjk5NjI0MzM1MjM2MTkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM0NzA4MTUxNDAwNjg1MDI4MjQiPiJGb3JtYXR0YXJlIGxhIHNjaGVkYSBTRD8gVHV0dGkgaSBkYXRpIHN1bGxhIHNjaGVkYSB2ZXJyYW5ubyBwZXJzaS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiJGb3JtYXR0YXJlIGxhIHNjaGVkYSBTRD8gVHV0dGkgaSBkYXRpIHN1bGxhIHNjaGVkYSB2ZXJyYW5ubyBwZXJzaS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIG1zZ2lkPSI4NjYzMjQ3OTI5NTUxMDk1ODU0Ij4iRm9ybWF0dGEgc2NoZWRhIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4iRm9ybWF0dGFyZSBsYSBzY2hlZGEgU0Q/IFR1dHRpIGkgZGF0aSBzdWxsYSBzY2hlZGEgdmVycmFubm8gcGVyc2kuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X2J1dHRvbl9mb3JtYXQiIG1zZ2lkPSI0MTMxMDY0NTYwMTI3NDc4Njk1Ij4iRm9ybWF0dGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3MjkwNDQ3Nzg5NDkxODk5MTgiPiJEZWJ1ZyBVU0IgY29sbGVnYXRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9Ijg0NzAyOTY4MTgyNzAxMTAzOTYiPiJTZWxlemlvbmEgcGVyIGRpc2F0dGl2YXJlIGlsIGRlYnVnIFVTQi4iPC9zdHJpbmc+CkBAIC04NDEsMjkgKzgyNiwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfYWxwaGFiZXQiIG1zZ2lkPSI1NDMzMjc1NDg1NDk5MDM5MTk5Ij4iIEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfbnVtZXJpY19hbHBoYWJldCIgbXNnaWQ9IjQwMzAxNzA1MjQ1OTUxMjM2MTAiPiIgMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FuZGlkYXRlc19zdHlsZSIgbXNnaWQ9IjQzMzM5MTMwODk2MzcwNjIyNTciPjx1PiJjYW5kaWRhdGkiPC91Pjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTQ1NzYwMzQxODk3MDk5NDA1MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MjM5NTE2Njc1MDI4NDM4OTk3Ij4iUHJlcGFyYXppb25lIHNjaGVkYSBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4iUHJlcGFyYXppb25lIHNjaGVkYSBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4iUHJlcGFyYXppb25lIHNjaGVkYSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjgyODczMTk4ODI5MjY3MzcwNTMiPiJSaWNlcmNhIGVycm9yaS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3ODA0Nzc4MzgyNDEyMTI5OTcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzOTM3MzQ1NTc3OTgzNzMwODczIj4iU2NoZWRhIFNEIHZ1b3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iU2NoZWRhIFNEIHZ1b3RhIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTMxMjI2NjgyMDA5Mjk1ODAxNCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTYwNjY2MDc1NjEyNDYyOTcwOCI+IkxhIHNjaGVkYSBTRCDDqCB2dW90YSBvIHV0aWxpenphIHVuIGZpbGUgc3lzdGVtIG5vbiBzdXBwb3J0YXRvLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlNjaGVkYSBTRCB2dW90YSBvIGNvbiBmaWxlc3lzdGVtIG5vbiBzdXBwb3J0YXRvLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY0MTA3MjM5MDYwMTkxMDAxODkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTcyNDYxOTkwMjA3NjUyODg4OSI+IlNjaGVkYSBTRCBkYW5uZWdnaWF0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iU2NoZWRhIFNEIGRhbm5lZ2dpYXRhIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjY3OTQxMjg4NDI5MDA2MTc3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY0NjAzMTE4MzUxMzA2NzExOTQiPiJMYSBzY2hlZGEgU0Qgw6ggZGFubmVnZ2lhdGEuIFBvdHJlYmJlIGVzc2VyZSBuZWNlc3NhcmlvIHJpZm9ybWF0dGFybGEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IlNjaGVkYSBTRCBkYW5uZWdnaWF0YS4gUG90cmViYmUgZXNzZXJlIG5lY2Vzc2FyaW8gcmlmb3JtYXR0YXJsYS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2ODcyMTUyODgyNjA0NDA3ODM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjU4MjE3NTAxNjA2MDQzMjAzNCI+IlJpbW96aW9uZSBpbXByZXZpc3RhIGRlbGxhIHNjaGVkYSBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJSaW1vemlvbmUgaW1wcmV2aXN0YSBkZWxsYSBzY2hlZGEgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3MjYwMTgzMjkzNzQ3NDQ4MjQxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyMDA1Mzk2NDY0NDk0NjQ4OTM3Ij4iU21vbnRhIHNjaGVkYSBTRCBwcmltYSBkZWxsYSByaW1vemlvbmUgcGVyIGV2aXRhcmUgbGEgcGVyZGl0YSBkaSBkYXRpLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+IlNtb250YSBzY2hlZGEgU0QgcHJpbWEgZGVsbGEgcmltb3ppb25lIHBlciBldml0YXJlIGxhIHBlcmRpdGEgZGkgZGF0aS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NzI5ODAxMTMwNzkwNjE2MjAwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNjUyNTg4MTAxODY3OTUxNSI+IsOIIHBvc3NpYmlsZSByaW11b3ZlcmUgbGEgc2NoZWRhIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iw4ggcG9zc2liaWxlIHJpbXVvdmVyZSBsYSBzY2hlZGEgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3NjEzOTYwNjg2NzQ3NTkyNzcwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijc1MDM3NjkxMDYyODUxODg3MDMiPiLDiCBvcmEgcG9zc2liaWxlIHJpbXVvdmVyZSBsYSBzY2hlZGEgU0QgaW4gbW9kbyBzaWN1cm8uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IlB1b2kgcmltdW92ZXJlIGxhIHNjaGVkYSBTRCBpbiB0dXR0YSBzaWN1cmV6emEuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODkwMjUxODAzMDQwNDM4MTMxOCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE4NzQ4ODk3NjQzNjcwODU1NjIiPiJTY2hlZGEgU0Qgcmltb3NzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiJTY2hlZGEgU0Qgcmltb3NzYSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQyMDUxMTcyMjczNDI4MjIyNzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI3MzA4OTA0NDEzMzEzNDQ3NzYiPiJJbnNlcmlzY2kgdW5hIG51b3ZhIHNjaGVkYSBTRCBwZXIgYXVtZW50YXJlIGxhIG1lbW9yaWEgZGVsIGRpc3Bvc2l0aXZvLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IlNjaGVkYSBTRCByaW1vc3NhLiBJbnNlcmlzY2luZSB1blwnYWx0cmEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iU2NoZWRhIFNEIHZ1b3RhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iU2NoZWRhIFNEIHZ1b3RhIG8gY29uIGZpbGVzeXN0ZW0gbm9uIHN1cHBvcnRhdG8uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJTY2hlZGEgU0QgZGFubmVnZ2lhdGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iU2NoZWRhIFNEIGRhbm5lZ2dpYXRhLiBQb3RyZWJiZSBlc3NlcmUgbmVjZXNzYXJpbyByaWZvcm1hdHRhcmxhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJSaW1vemlvbmUgaW1wcmV2aXN0YSBkZWxsYSBzY2hlZGEgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiJTbW9udGEgc2NoZWRhIFNEIHByaW1hIGRlbGxhIHJpbW96aW9uZSBwZXIgZXZpdGFyZSBsYSBwZXJkaXRhIGRpIGRhdGkuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iw4ggcG9zc2liaWxlIHJpbXVvdmVyZSBsYSBzY2hlZGEgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4iUHVvaSByaW11b3ZlcmUgbGEgc2NoZWRhIFNEIGluIHR1dHRhIHNpY3VyZXp6YS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4OTAyNTE4MDMwNDA0MzgxMzE4Ij4iU2NoZWRhIFNEIHJpbW9zc2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjM4NzAxMjA2NTI5ODM2NTk2NDEiPiJTY2hlZGEgU0Qgcmltb3NzYS4gSW5zZXJpc2NpbmUgdW5cJ2FsdHJhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X2xpc3RfZW1wdHkiIG1zZ2lkPSI0MTY4ODIwNjA5NDAzMzg1Nzg5Ij4iTmVzc3VuYSBhdHRpdml0w6AgY29ycmlzcG9uZGVudGUgdHJvdmF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg3ODczNTIwNzQzMjY3NDg4OTIiPiJhZ2dpb3JuYXJlIGxlIHN0YXRpc3RpY2hlIGRpIHV0aWxpenpvIGRlaSBjb21wb25lbnRpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg5MTU1MzY5NTcxNjc1MjgzNSI+IkNvbnNlbnRlIGxhIG1vZGlmaWNhIGRlbGxlIHN0YXRpc3RpY2hlIGRpIHV0aWxpenpvIGRlaSBjb21wb25lbnRpIHJhY2NvbHRlLiBEYSBub24gdXNhcmUgcGVyIG5vcm1hbGkgYXBwbGljYXppb25pLiI8L3N0cmluZz4KQEAgLTg5OCwxNSArODcyLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iVlBOIEwyVFAvSVBTZWMgYmFzYXRhIHN1IGNoaWF2ZSBwcmVjb25kaXZpc2EiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iVlBOIEwyVFAvSVBTZWMgYmFzYXRhIHN1IGNlcnRpZmljYXRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iU2NlZ2xpIGZpbGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJOZXNzdW4gZmlsZSDDqCBzdGF0byBzY2VsdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJSZWltcG9zdGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iSW52aWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+InByZWZlcml0aSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+Ik1vZGFsaXTDoCBhdXRvbW9iaWxlIGF0dGl2YXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IlNlbGV6aW9uYSBwZXIgdXNjaXJlIGRhbGxhIG1vZGFsaXTDoCBhdXRvbW9iaWxlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJUZXRoZXJpbmcgb3BwdXJlIGhvdHNwb3QgYXR0aXZvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iVG9jY2EgcGVyIGNvbmZpZ3VyYXJlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iSW5kaWV0cm8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJBdmFudGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiJTYWx0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IlV0aWxpenpvIGRhdGkgY2VsbC4gZWxldmF0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iVG9jY2EgcGVyIGluZm9ybWF6aW9uaSBzdWxsXCd1dGlsaXp6byBkYXRpIGNlbGwuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJMaW1pdGUgZGF0aSBjZWxsLiBzdXBlcmF0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiJUb2NjYSBwZXIgaW5mb3JtYXppb25pIHN1bGxcJ3V0aWxpenpvIGRhdGkgY2VsbC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19tYXRjaGVzIiBtc2dpZD0iODEyOTQyMTkwODkxNTg0MDczNyI+Ik5lc3N1bmEgY29ycmlzcG9uZGVuemEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmaW5kX29uX3BhZ2UiIG1zZ2lkPSIxOTQ2Nzk5MjMzODIyODIwMzg0Ij4iVHJvdmEgbmVsbGEgcGFnaW5hIjwvc3RyaW5nPgorICA8cGx1cmFscyBuYW1lPSJtYXRjaGVzX2ZvdW5kIj4KKyAgICA8aXRlbSBxdWFudGl0eT0ib25lIiBtc2dpZD0iODE2NzE0NzA4MTEzNjU3OTQzOSI+IjEgY29ycmlzcG9uZGVuemEiPC9pdGVtPgorICAgIDxpdGVtIHF1YW50aXR5PSJvdGhlciIgbXNnaWQ9IjQ2NDE4NzI3OTcwNjc2MDkxNzciPiI8eGxpZmY6ZyBpZD0iSU5ERVgiPiVkPC94bGlmZjpnPiBkaSA8eGxpZmY6ZyBpZD0iVE9UQUwiPiVkPC94bGlmZjpnPiI8L2l0ZW0+CisgIDwvcGx1cmFscz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKaW5kZXggOGIwMzAxZS4uNmFkN2E3NTAgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbApAQCAtMTY5LDggKzE2OSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfZGV2ZWxvcG1lbnRUb29scyIgbXNnaWQ9IjM0NDYxNjQ1ODQ3MTA1OTY1MTMiPiLplovnmbrjg4Tjg7zjg6siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSI5MDU2NDMxMTkzODkzODA5ODE0Ij4i44Ki44OX44Oq44Kx44O844K344On44Oz44Gu44OH44OZ44Ot44OD44OR44O844Gr44Gu44G/5b+F6KaB44Gq5qmf6IO944Gn44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX3N0b3JhZ2UiIG1zZ2lkPSIxOTcxMTE4NzcwNTQ2MzM2OTY2Ij4i44K544OI44Os44O844K4Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTIwMzMwMjIxNDkxNTM1NTc3NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjU0NTU4MDQzNTMyMjA1ODEzMTIiPiJTROOCq+ODvOODieOBq+OCouOCr+OCu+OCueOBl+OBvuOBmeOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiJTROOCq+ODvOODieOBq+OCouOCr+OCu+OCueOBl+OBvuOBmeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiJTROOCq+ODvOODieOBq+OCouOCr+OCu+OCueOBl+OBvuOBmeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyIiBtc2dpZD0iNzQxNzE5MjYyOTYwMTg5MDc5MSI+IuOCueODhuODvOOCv+OCueODkOODvOOBrueEoeWKueWMluOChOWkieabtCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3N0YXR1c0JhciIgbXNnaWQ9IjEzNjU0NzM1OTUzMzE5ODk3MzIiPiLjgrnjg4bjg7zjgr/jgrnjg5Djg7zjga7nhKHlirnljJbjgoTjgrfjgrnjg4bjg6DjgqLjgqTjgrPjg7Pjga7ov73liqDjgoTliYrpmaTjgpLjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgavoqLHlj6/jgZfjgb7jgZnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhclNlcnZpY2UiIG1zZ2lkPSI3MjQ3MjgxOTExMzg3OTMxNDg1Ij4i44K544OG44O844K/44K544OQ44O844G444Gu6KGo56S6Ijwvc3RyaW5nPgpAQCAtMjY3LDggKzI2NiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2xlYXJBcHBDYWNoZSIgbXNnaWQ9Ijc3NDA0NjU2OTQxOTM2NzE0MDIiPiLjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7Pjga7jgq3jg6Pjg4Pjgrfjg6Xjg4fjgqPjg6zjgq/jg4jjg6rjgYvjgonjg5XjgqHjgqTjg6vjgpLliYrpmaTjgZfjgabmkLrluK/pm7voqbHjga7jg6Hjg6Ljg6rjgpLop6PmlL7jgZnjgovjgZPjgajjgpLjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgavoqLHlj6/jgZfjgb7jgZnjgILpgJrluLjjgIHjgqLjgq/jgrvjgrnjga/jgrfjgrnjg4bjg6Djg5fjg63jgrvjgrnjga7jgb/jgavliLbpmZDjgZXjgozjgb7jgZnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX21vdmVQYWNrYWdlIiBtc2dpZD0iNzI4NDU0OTc5OTQ2NTAzOTI2Ij4i44Ki44OX44Oq44Kx44O844K344On44Oz44Oq44K944O844K544Gu56e75YuVIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW92ZVBhY2thZ2UiIG1zZ2lkPSI2MzIzMDQ5MjkxOTIzOTI1Mjc3Ij4i5YaF6YOo44Go5aSW6YOo44Gu44Oh44OH44Kj44Ki6ZaT44Gn44Gu44Ki44OX44Oq44Kx44O844K344On44Oz44Oq44K944O844K544Gu56e75YuV44KS44Ki44OX44Oq44Kx44O844K344On44Oz44Gr6Kix5Y+v44GX44G+44GZ44CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDgxMTkyMTcwMzg4MjUzMjA3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkTG9ncyIgbXNnaWQ9IjY2MTU3Nzg1NDMxOTg5Njc2MTQiPiLjgrfjgrnjg4bjg6Djg63jgrDjg5XjgqHjgqTjg6vjga7oqq3jgb/lj5bjgooiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyMjU3OTM3OTU1NTgwNDc1OTAyIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkTG9ncyIgbXNnaWQ9Ijg4OTY0NDk0Mzc0NjQ4Njc3NjYiPiLjgrfjgrnjg4bjg6Djga7jgZXjgb7jgZbjgb7jgarjg63jgrDjg5XjgqHjgqTjg6vjga7oqq3jgb/lj5bjgorjgpLjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgavoqLHlj6/jgZfjgb7jgZnjgILjgZPjgozjgavjgojjgormkLrluK/pm7voqbHjga7kvb/nlKjnirbms4HjgavplqLjgZnjgovlhajoiKzmg4XloLHjgYzlj5blvpfjgZXjgozjgb7jgZnjgYzjgIHlgIvkurrmg4XloLHjgoTpnZ7lhazplovmg4XloLHjgYzlkKvjgb7jgozjgovjgZPjgajjga/jgYLjgorjgb7jgZvjgpPjgIIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkTG9ncyAoNjYxNTc3ODU0MzE5ODk2NzYxNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkTG9ncyAoODg5NjQ0OTQzNzQ2NDg2Nzc2NikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlhZ25vc3RpYyIgbXNnaWQ9IjgwNzY3NDM5NTM5MDgwMDAzNDIiPiJkaWFn44GM5omA5pyJ44GZ44KL44Oq44K944O844K544Gu6Kqt44G/5pu444GNIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlhZ25vc3RpYyIgbXNnaWQ9IjMxMjEyMzgzNzM5NTE2MzcwNDkiPiJkaWFn44Kw44Or44O844OX44GM5omA5pyJ44GZ44KL44Oq44K944O844K577yI5L6LOi9kZXblhoXjga7jg5XjgqHjgqTjg6vvvInjgbjjga7oqq3jgb/mm7jjgY3jgpLjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgavoqLHlj6/jgZfjgb7jgZnjgILjgrfjgrnjg4bjg6Djga7lronlrprmgKfjgajjgrvjgq3jg6Xjg6rjg4bjgqPjgavlvbHpn7/jgZnjgovmgZDjgozjgYzjgYLjgorjgb7jgZnjgILjg6Hjg7zjgqvjg7wv44Kq44Oa44Os44O844K/44O844Gr44KI44KL44OP44O844OJ44Km44Kn44Ki5Zu65pyJ44Gu6Ki65pat5Lul5aSW44Gr44Gv5L2/55So44GX44Gq44GE44Gn44GP44Gg44GV44GE44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VDb21wb25lbnRTdGF0ZSIgbXNnaWQ9Ijc5NDI1MTk4ODM0MzI5NDA2Ij4i44Ki44OX44Oq44Kx44O844K344On44Oz44Gu44Kz44Oz44Od44O844ON44Oz44OI44KS5pyJ5Yq5L+eEoeWKueOBq+OBmeOCiyI8L3N0cmluZz4KQEAgLTQwMywyMiArNDA0LDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aEFkbWluIiBtc2dpZD0iNzI1NjI4OTc3NDY2NzA1NDU1NSI+IuOBk+OBrkJsdWV0b290aOerr+acq+OBruioreWumuOAgeOBiuOCiOOBs+ODquODouODvOODiOerr+acq+OCkuaknOWHuuOBl+OBpuODmuOCouOBq+ioreWumuOBmeOCi+OBk+OBqOOCkuOCouODl+ODquOCseODvOOCt+ODp+ODs+OBq+ioseWPr+OBl+OBvuOBmeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYmx1ZXRvb3RoIiBtc2dpZD0iODM2MTAzODcwNzg1NzAxODczMiI+IkJsdWV0b290aOaOpee2muOBruS9nOaIkCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aCIgbXNnaWQ9Ijc2MjUxNTM4MDY3OTM5Mjk0NSI+IuOBk+OBrkJsdWV0b290aOerr+acq+OBruioreWumuihqOekuuOAgeOBiuOCiOOBs+WIpeOBruerr+acq+OCkuODmuOCouOBqOOBl+OBpuioreWumuOBl+aOpee2muOCkuaJv+iqjeOBmeOCi+OBk+OBqOOCkuOCouODl+ODquOCseODvOOCt+ODp+ODs+OBq+ioseWPr+OBl+OBvuOBmeOAgiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0FkbWluICgyMjUxMzAyMjMzMDEyMjUwMDU2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0FkbWluICgxOTM1ODQyNjExNDY0ODk1Nzg1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjUmF3ICg0NDIzNDcxNzExMTE0MzI1NzA4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY1JhdyAoNTUzMzAyMjczNjU1OTM4NTY2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY05vdGlmeSAoNDc4NDcwMzYwMDgyNzkyMzU4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY05vdGlmeSAoMjk5MDA1MzUxNzk2MjA3MDYxNykgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0xsY3AgKDQ5NzIwNTE0NjEwMDcwMzA0MjYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTGxjcCAoOTE1OTIxMjc3ODYwMDQ2NDApIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjQ5Nzc0MDYxNjQzMTE1MzUwOTIiPiLjgq3jg7zjg63jg4Pjgq/jgpLnhKHlirnjgavjgZnjgosiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSIzMTg5NzYzNDc5MzI2MzAyMDE3Ij4i44Kt44O844Ot44OD44Kv44KE6Zai6YCj44GZ44KL44OR44K544Ov44O844OJ44K744Kt44Ol44Oq44OG44Kj44KS54Sh5Yq544Gr44GZ44KL44GT44Go44KS44Ki44OX44Oq44Kx44O844K344On44Oz44Gr6Kix5Y+v44GX44G+44GZ44CC5q2j5b2T44Gq5Yip55So44Gu5L6L44Gn44Gv44CB44GL44GL44Gj44Gm44GN44Gf6Zu76Kmx44KS5Y+X5L+h44GZ44KL6Zqb44Gr44Kt44O844Ot44OD44Kv44KS54Sh5Yq544Gr44GX44CB6YCa6Kmx44Gu57WC5LqG5pmC44Gr44Kt44O844Ot44OD44Kv44KS5pyJ5Yq544Gr44GX55u044GX44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkU3luY1NldHRpbmdzIiBtc2dpZD0iNjIwMTgxMDAwODIzMDUwMzA1MiI+IuWQjOacn+ioreWumuOBruiqreOBv+WPluOCiiI8L3N0cmluZz4KQEAgLTQzMSwyNiArNDE2LDI3IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zdWJzY3JpYmVkRmVlZHNSZWFkIiBtc2dpZD0iMzYyMjIwMDYyNTYzNDIwNzY2MCI+IuePvuWcqOWQjOacn+OBl+OBpuOBhOOCi+ODleOCo+ODvOODieOBruips+e0sOOBruWPluW+l+OCkuOCouODl+ODquOCseODvOOCt+ODp+ODs+OBq+ioseWPr+OBl+OBvuOBmeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3Vic2NyaWJlZEZlZWRzV3JpdGUiIG1zZ2lkPSI5MDE1MjQ2MzI1NDA4MjA5Mjk2Ij4i55m76Yyy44GX44Gf44OV44Kj44O844OJ44Gu5pu444GN6L6844G/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc3Vic2NyaWJlZEZlZWRzV3JpdGUiIG1zZ2lkPSI4MTIxNjA3MDk5MzI2NTMzODc4Ij4i54++5Zyo5ZCM5pyf44GX44Gm44GE44KL44OV44Kj44O844OJ44Gu5aSJ5pu044KS44Ki44OX44Oq44Kx44O844K344On44Oz44Gr6Kix5Y+v44GX44G+44GZ44CC5oKq5oSP44Gu44GC44KL44Ki44OX44Oq44Kx44O844K344On44Oz44GM5ZCM5pyf44OV44Kj44O844OJ44KS5aSJ5pu044GZ44KL5oGQ44KM44GM44GC44KK44G+44GZ44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkRGljdGlvbmFyeSIgbXNnaWQ9IjQzMjUzNTcxNjgwNDc0ODc4MSI+IuWNmOiqnuODquOCueODiOOBruiqreOBv+i+vOOBvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iMTA4Mjk3MjYwMzU3NjM2MDY5MCI+IuOCouODl+ODquOCseODvOOCt+ODp+ODs+OBjOWNmOiqnuODquOCueODiOOBq+eZu+mMsuOBleOCjOOBpuOBhOOCi+WAi+S6uueahOOBquiqnuWPpeOChOWQjeWJjeOCkuiqreOBv+i+vOOCgOOBk+OBqOOCkuioseWPr+OBl+OBvuOBmeOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iNjcwMzEwOTUxMTgzNjM0MzM0MSI+IuWNmOiqnuODquOCueODiOOBuOOBruabuOOBjei+vOOBvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyNDEyNTYyMDY1MjQwODI4ODAiPiLjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgYzljZjoqp7jg6rjgrnjg4jjgavmlrDjgZfjgYToqp7lj6XjgpLmm7jjgY3ovrzjgoDjgZPjgajjgpLoqLHlj6/jgZfjgb7jgZnjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4MDc5NDAzNzU5MDAxNzc3MjkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijk5MzcwNzQzNjk0MTAxNjkxMyI+IlNE44Kr44O844OJ44Gu44Kz44Oz44OG44Oz44OE44KS5L+u5q2jL+WJiumZpOOBmeOCiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iU0Tjgqvjg7zjg4njga7jgrPjg7Pjg4bjg7Pjg4TjgpLkv67mraMv5YmK6Zmk44GZ44KLIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjY0Mzk2MzIwNDk3NjQ3MTg3OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDEzMTg3MTU0MTEyNzIxMTUyNiI+IlNE44Kr44O844OJ44G444Gu5pu444GN6L6844G/44KS44Ki44OX44Oq44Kx44O844K344On44Oz44Gr6Kix5Y+v44GX44G+44GZ44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4iU0Tjgqvjg7zjg4njgbjjga7mm7jjgY3ovrzjgb/jgpLjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgavoqLHlj6/jgZfjgb7jgZnjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iNDMyNTM1NzE2ODA0NzQ4NzgxIj4i44Om44O844K244O85a6a576p6L6e5pu444Gu6Kqt44G/6L6844G/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSIxMDgyOTcyNjAzNTc2MzYwNjkwIj4i44Ki44OX44Oq44Kx44O844K344On44Oz44GM44Om44O844K244O86L6e5pu444Gr55m76Yyy44GV44KM44Gm44GE44KL5YCL5Lq655qE44Gq6Kqe5Y+l44KE5ZCN5YmN44KS6Kqt44G/6L6844KA44GT44Go44KS6Kix5Y+v44GX44G+44GZ44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI2NzAzMTA5NTExODM2MzQzMzQxIj4i44Om44O844K244O85a6a576p6L6e5pu444G444Gu5pu444GN6L6844G/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI0MTI1NjIwNjUyNDA4Mjg4MCI+IuOCouODl+ODquOCseODvOOCt+ODp+ODs+OBjOODpuODvOOCtuODvOi+nuabuOOBq+aWsOOBl+OBhOiqnuWPpeOCkuabuOOBjei+vOOCgOOBk+OBqOOCkuioseWPr+OBl+OBvuOBmeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iU0Tjgqvjg7zjg4njga7jgrPjg7Pjg4bjg7Pjg4TjgpLkv67mraMv5YmK6Zmk44GZ44KLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4iU0Tjgqvjg7zjg4njgbjjga7mm7jjgY3ovrzjgb/jgpLjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgavoqLHlj6/jgZfjgb7jgZnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSI1NjU2NDg3MjY0ODE5NjY5ODI0Ij4i44Kt44Oj44OD44K344Ol44OV44Kh44Kk44Or44K344K544OG44Og44Gr44Ki44Kv44K744K5Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjE2MjQ3MzQ1Mjg0MzU2NTk5MDYiPiLjgq3jg6Pjg4Pjgrfjg6Xjg5XjgqHjgqTjg6vjgrfjgrnjg4bjg6Djgbjjga7oqq3jgb/mm7jjgY3jgpLjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgavoqLHlj6/jgZfjgb7jgZnjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MzA3ODYxNDk2MzAyODUwMjAxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQ0OTc0MjA3Mjg4NTc1ODU3OTEiPiLjg5Hjgrnjg6/jg7zjg4njga7liLbpmZAiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxNzE5ODc3MjQ1NjkyMzE4Mjk5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI5MDgzNDAwMDgwODYxNzI4MDU2Ij4i5L2/55So44Gn44GN44KL44OR44K544Ov44O844OJ44Gu56iu6aGe44KS5Yi26ZmQ44GX44G+44GZ44CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzM3NDc4MDcxMjY2NDI4NTMyMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI5MTQxMzA2NDY5NDIxOTk1MDMiPiLjg63jgrDjgqTjg7Pjga7nm6PoppYiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxOTYxMjUxMTc5NjI0ODQzNDgzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSI3MjI3NTc4MjYwMTY1MTcyNjczIj4i5pC65biv6Zu76Kmx44G444Gu44Ot44Kw44Kk44Oz44Gu5aSx5pWX44KS55uj6KaW44GX44CB5L2V44KJ44GL44Gu5Yem572u44KS44Go44KK44G+44GZ44CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTA4NDc3MjA5MDc5NzQ4NTQyMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIyNjIwMDc3MTkxMjQyNjg4OTU1Ij4i44OR44K544Ov44O844OJ44Gu44Oq44K744OD44OIIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzMzMjE2NzYwMDMzMTc5OTk5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iNTM5MTI0MDYxNjk4MTI5NzM2MSI+IuODkeOCueODr+ODvOODieOCkuW8t+WItueahOOBq+aWsOOBl+OBhOWApOOBq+WkieabtOOBl+OBvuOBmeOAguODreOCsOOCpOODs+OBmeOCi+OBq+OBr+euoeeQhuiAheOBi+OCieOBneOBruWApOOCkumAmuefpeOBl+OBpuOCguOCieOBhuW/heimgeOBjOOBguOCiuOBvuOBmeOAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU3NjA0NjYwMjUyNDc2MzQ0ODggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSIyMjc0MDg1Mzg0NzA0MjQ4NDMxIj4i5by35Yi244Ot44OD44KvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjgxOTg2ODY2NDk0NjA4OTc0MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSI1Njk2OTY0MTI2MjI2MDI4NDQyIj4i5pC65biv6Zu76Kmx44Gu44Ot44OD44Kv5pmC44KS566h55CG44GX44G+44GZ44CC44OR44K544Ov44O844OJ44Gu5YaN5YWl5Yqb44GM5b+F6KaB44Go44Gq44KK44G+44GZ44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0MzA3ODYxNDk2MzAyODUwMjAxIj4i44OR44K544Ov44O844OJ44Gu5Yi26ZmQIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iMTcxOTg3NzI0NTY5MjMxODI5OSI+IuS9v+eUqOOBp+OBjeOCi+ODkeOCueODr+ODvOODieOBrueorumhnuOCkuWItumZkOOBl+OBvuOBmeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iNzM3NDc4MDcxMjY2NDI4NTMyMSI+IuODreOCsOOCpOODs+OBruebo+imliI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjE5NjEyNTExNzk2MjQ4NDM0ODMiPiLmkLrluK/pm7voqbHjgbjjga7jg63jgrDjgqTjg7Pjga7lpLHmlZfjgpLnm6PoppbjgZfjgIHkvZXjgonjgYvjga7lh6bnva7jgpLjgajjgorjgb7jgZnjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjkwODQ3NzIwOTA3OTc0ODU0MjAiPiLjg5Hjgrnjg6/jg7zjg4njga7jg6rjgrvjg4Pjg4giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIzMzMyMTY3NjAwMzMxNzk5OTkxIj4i44OR44K544Ov44O844OJ44KS5by35Yi255qE44Gr5paw44GX44GE5YCk44Gr5aSJ5pu044GX44G+44GZ44CC44Ot44Kw44Kk44Oz44GZ44KL44Gr44Gv566h55CG6ICF44GL44KJ44Gd44Gu5YCk44KS6YCa55+l44GX44Gm44KC44KJ44GG5b+F6KaB44GM44GC44KK44G+44GZ44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjU3NjA0NjYwMjUyNDc2MzQ0ODgiPiLlvLfliLbjg63jg4Pjgq8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiLmkLrluK/pm7voqbHjga7jg63jg4Pjgq/mmYLjgpLnrqHnkIbjgZfjgb7jgZnjgILjg5Hjgrnjg6/jg7zjg4njga7lho3lhaXlipvjgYzlv4XopoHjgajjgarjgorjgb7jgZnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4i44GZ44G544Gm44Gu44OH44O844K/44KS5raI5Y67Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjMxNDA2MDkzMzc5NjM5NjIwNSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9Ijc2Njk4OTUzMzM4MTQyMjI1ODYiPiLlh7rojbfmmYLoqK3lrprjgavjg6rjgrvjg4Pjg4jjgZfjgb7jgZnjgILnorroqo3jgarjgZfjgafjg4fjg7zjgr/jgYzjgZnjgbnjgabliYrpmaTjgZXjgozjgb7jgZnjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IuWHuuiNt+aZguioreWumuOBq+ODquOCu+ODg+ODiOOBl+OBvuOBmeOAgueiuuiqjeOBquOBl+OBp+ODh+ODvOOCv+OBjOOBmeOBueOBpuWJiumZpOOBleOCjOOBvuOBmeOAgiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5IiBtc2dpZD0iNjM4NzQ5NzQ2NjY2MDE1NDkzMSI+IuODneODquOCt+ODvOOBjOacieWKueOBq+OBquOBo+OBpuOBhOOCi+WgtOWQiOOBr+err+acq+OBruOCsOODreODvOODkOODq+ODl+ODreOCreOCt+OBjOS9v+eUqOOBleOCjOOCi+OCiOOBhuOBq+ioreWumuOBl+OBvuOBmeOAguacieWKueOBquOCsOODreODvOODkOODq+ODl+ODreOCreOCt+OCkuioreWumuOBp+OBjeOCi+OBruOBr+acgOWIneOBruODh+ODkOOCpOOCueeuoeeQhuiAheOBoOOBkeOBp+OBmeOAgiI8L3N0cmluZz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IuiHquWuhSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IuaQuuW4ryI8L2l0ZW0+CkBAIC01NTIsMTAgKzUzOCw5IEBACiAgICAgPHNraXAgLz4KICAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZU90aGVyICg0NDA4NDM2MTYyOTUwMTE5ODQ5KSAtLT4KICAgICA8c2tpcCAvPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+Ijx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+57WM55SxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz7jgIHmm7TmlrDlhYM6IDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iUElO44Kz44O844OJ44KS5YWl5YqbIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiLjg63jg4Pjgq/jgpLop6PpmaTjgZnjgovjgavjga/jg5Hjgrnjg6/jg7zjg4njgpLlhaXlipsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IuODreODg+OCr+OCkuino+mZpOOBmeOCi+OBq+OBr1BJTuOCkuWFpeWKmyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IlBJTuOCs+ODvOODieOBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJNRU5V44CBMOOCreODvOOBp+ODreODg+OCr+ino+mZpCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLnt4rmgKXpgJrloLHnlarlj7ciPC9zdHJpbmc+CkBAIC01NjgsNiArNTUzLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4i6YCa6Kmx44Gr5oi744KLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4i5LiA6Ie044GX44G+44GX44GfIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IuOChOOCiuebtOOBl+OBpuOBj+OBoOOBleOBhCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4i44KE44KK55u044GX44Gm44GP44Gg44GV44GEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4i5YWF6Zu75Lit77yIPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPu+8iSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiLlhYXpm7vlrozkuobjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU4Miw2ICs1NjgsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lN44Kr44O844OJ44Gv44Ot44OD44Kv44GV44KM44Gm44GE44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iU0lN44Kr44O844OJ44Gu44Ot44OD44Kv6Kej6Zmk5LitLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4i44Ot44OD44Kv6Kej6Zmk44Gu44OR44K/44O844Oz44GvPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7lm57jgajjgoLmraPjgZfjgY/mjIflrprjgZXjgozjgabjgYTjgb7jgZvjgpPjgIIiXG5cbiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPuenkuW+jOOBq+OCguOBhuS4gOW6puaMh+WumuOBl+OBpuOBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IuWFpeWKm+OBl+OBn+ODkeOCueODr+ODvOODieOBrzx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+5Zue44Go44KC5q2j44GX44GP44GC44KK44G+44Gb44KT44Gn44GX44Gf44CCIlxuXG4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz7np5LlvozjgavjgoLjgYbkuIDluqblhaXlipvjgZfjgabjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4i5YWl5Yqb44GX44GfUElO44GvPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7lm57jgajjgoLmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgafjgZfjgZ/jgIIiXG5cbiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPuenkuW+jOOBq+OCguOBhuS4gOW6puWFpeWKm+OBl+OBpuOBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4i5oyH5a6a44GX44Gf44OR44K/44O844Oz44GvPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7lm57jgajjgoLmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgILjgYLjgag8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPuWbnuaMh+WumuOBq+WkseaVl+OBmeOCi+OBqOOAgeaQuuW4r+mbu+ipseOBruODreODg+OCr+OBruino+mZpOOBq0dvb2dsZeOBuOOBruODreOCsOOCpOODs+OBjOW/heimgeOBq+OBquOCiuOBvuOBmeOAgiJcblxuIjx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+56eS5b6M44Gr44KC44GG5LiA5bqm5oyH5a6a44GX44Gm44GP44Gg44GV44GE44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPuenkuW+jOOBq+OChOOCiuebtOOBl+OBpuOBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4i44OR44K/44O844Oz44KS5b+Y44KM44Gf5aC05ZCIIjwvc3RyaW5nPgpAQCAtNjEwLDE0ICs1OTgsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ19iZWZvcmVfdW5sb2FkIiBtc2dpZD0iMTkwMTY3NTQ0ODE3OTY1MzA4OSI+IuOBk+OBruODmuODvOOCuOOBi+OCieenu+WLleOBl+OBvuOBmeOBi++8nyJcblxuIjx4bGlmZjpnIGlkPSJNRVNTQUdFIj4lczwveGxpZmY6Zz4iXG5cbiLnp7vli5XjgZnjgovloLTlkIjjga9bT0td44CB5LuK44Gu44Oa44O844K444Gr5q6L44KL5aC05ZCI44GvW+OCreODo+ODs+OCu+ODq13jgpLpgbjmip7jgZfjgabjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX2xhYmVsIiBtc2dpZD0iNjg2MDI2MTc1ODY2NTgyNTA2OSI+IueiuuiqjSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRvdWJsZV90YXBfdG9hc3QiIG1zZ2lkPSIxMDY4MjE2OTM3MjQ0NTY3MjQ3Ij4i44OS44Oz44OIOiDjg4Djg5bjg6vjgr/jg4Pjg5fjgafmi6HlpKcv57iu5bCP44Gn44GN44G+44GZ44CCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9maWxsX3RoaXNfZm9ybSAoODk0MDExMDg2Njc3NTA5NzQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSIxMjg0ODQzNzI4MjAzNDEyMTM1Ij4i44OW44Op44Km44K244Gu5bGl5q2044Go44OW44OD44Kv44Oe44O844Kv44KS6Kqt44G/5Y+W44KLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI0OTgxNDg5ODE1NDY3NjE3MTkxIj4i44OW44Op44Km44K244Gn44Ki44Kv44K744K544GX44Gf44GZ44G544Gm44GuVVJM44GK44KI44Gz44OW44Op44Km44K244Gu44GZ44G544Gm44Gu44OW44OD44Kv44Oe44O844Kv44Gu6Kqt44G/5Y+W44KK44KS44Ki44OX44Oq44Kx44O844K344On44Oz44Gr6Kix5Y+v44GX44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5MDA5NDM0MTA5ODM2MjgwMzc0Ij4i44OW44Op44Km44K244Gu5bGl5q2044Go44OW44OD44Kv44Oe44O844Kv44KS5pu444GN6L6844KAIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTQ1NTcxOTkwMzU3MTE0OTUwIj4i5pC65biv6Zu76Kmx44Gr5L+d5a2Y44GV44KM44Gm44GE44KL44OW44Op44Km44K244Gu5bGl5q2044KE44OW44OD44Kv44Oe44O844Kv44Gu5L+u5q2j44KS44Ki44OX44Oq44Kx44O844K344On44Gr6Kix5Y+v44GX44G+44GZ44CC44GT44KM44Gr44KI44KK5oKq5oSP44Gu44GC44KL44Ki44OX44Oq44Kx44O844K344On44Oz44GM44CB44OW44Op44Km44K244Gu44OH44O844K/44KS5raI5Y6744G+44Gf44Gv5aSJ5pu044GZ44KL5oGQ44KM44GM44GC44KK44G+44GZ44CCIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0QWxhcm0gKDU5MjQ0MDEzMjg4MDM2MTUxNjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0QWxhcm0gKDU5NjY5NjY1OTgxNDk4NzUwODIpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQ3MTUyMTI2NTU1OTgyNzU1MzIiPiLjg5bjg6njgqbjgrbjga7kvY3nva7mg4XloLHjgbjjga7jgqLjgq/jgrvjgrnmqKnjgpLlpInmm7QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0MDExOTA4MjgyOTgwODYxNjc5Ij4i44OW44Op44Km44K244Gu5L2N572u5oOF5aCx44Gr5a++44GZ44KL44Ki44Kv44K744K55qip44Gu5aSJ5pu044KS44Ki44OX44Oq44Kx44O844K344On44Oz44Gr6Kix5Y+v44GX44G+44GZ44CC44GT44Gu6Kit5a6a44Gn44Gv44CB5oKq5oSP44Gu44GC44KL44Ki44OX44Oq44Kx44O844K344On44Oz44GM5Lu75oSP44Gu44Km44Kn44OW44K144Kk44OI44Gr5L2N572u5oOF5aCx44KS6YCB5L+h44GZ44KL5Y+v6IO95oCn44GM44GC44KK44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9tZXNzYWdlIiBtc2dpZD0iNzY3MzQ0Njg3MTM5MTk1NzkwIj4i44GT44Gu44OR44K544Ov44O844OJ44KS44OW44Op44Km44K244Gn5L+d5a2Y44GX44G+44GZ44GL77yfIjwvc3RyaW5nPgpAQCAtNzMwLDE0ICs3MTYsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiLjgZnjgbnjgabpgbjmip4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+IuiqnuWPpeOCkumBuOaKniI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiLliIfjgorlj5bjgooiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IuOCs+ODlOODvCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IuiyvOOCiuS7mOOBkSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iVVJM44KS44Kz44OU44O8Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIG1zZ2lkPSI2NzM4NTU2MzQ4ODYxMzQ3MjQwIj4i44OG44Kt44K544OI44KS6YG45oqeLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+IuODhuOCreOCueODiOmBuOaKniI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+IuWFpeWKm+aWueazlSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiLovp7mm7jjgavjgIw8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+44CN44KS6L+95YqgIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4i44OG44Kt44K544OI44KS57eo6ZuGIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSI0OTA5MTM1NTY0OTQxODE1NDk0Ij4i44OG44Kt44K544OI5pON5L2cIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiLnqbrjgY3lrrnph4/kvY7kuIsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiLmkLrluK/pm7voqbHjga7nqbrjgY3lrrnph4/jgYzlsJHjgarjgY/jgarjgaPjgabjgYTjgb7jgZnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTc0NSw2ICs3MzEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4i44Kt44Oj44Oz44K744OrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IuazqOaEjyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4i6Kqt44G/6L6844G/5LitLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJPTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+Ik9GRiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4i44Ki44OX44Oq44Kx44O844K344On44Oz44KS6YG45oqeIjwvc3RyaW5nPgpAQCAtNzYzLDkgKzc1MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0iZm9yY2VfY2xvc2UiIG1zZ2lkPSIzNjUzNDE2MzE1NDUwODA2Mzk2Ij4i5by35Yi257WC5LqGIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+IuODrOODneODvOODiCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndhaXQiIG1zZ2lkPSI3MTQ3MTE4MjE3MjI2MzE3NzMyIj4i5b6F5qmfIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4i44Ki44OX44Oq44Gu44Oq44OA44Kk44Os44Kv44OIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+44GM5a6f6KGM5Lit44Gn44GZ44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+44GM5pyA5Yid44Gr6LW35YuV44GX44Gm44GE44G+44GX44Gf44CCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3RpdGxlICg4MzIzNzYxNjE2MDUyMTIxOTM2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3JlcGxhY2UgKDYyMDI0OTg5NDk5NzAyODE0MTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwgKDE4ODEwMjAyMzAyMTY2ODY4MykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IuOCouODl+ODquOCseODvOOCt+ODp+ODszx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz7vvIjjg5fjg63jgrvjgrk8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz7vvInjgadTdHJpY3RNb2Rl44Od44Oq44K344O86YGV5Y+N44GM44GC44KK44G+44GX44Gf44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4i44OX44Ot44K744K5PHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+44GnU3RyaWN0TW9kZeODneODquOCt+ODvOmBleWPjeOBjOOBguOCiuOBvuOBl+OBn+OAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz7jgpLlrp/ooYzkuK0iPC9zdHJpbmc+CkBAIC04MTIsMjggKzgwMiwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybXNfc2hvd19hbGwiIG1zZ2lkPSIyNjcxNzkxMTYzOTMzMDkxMTgwIj48Yj4i44GZ44G544Gm6KGo56S6IjwvYj48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2FjdGl2aXR5X3RpdGxlIiBtc2dpZD0iMjM5OTI4OTk5OTYwODkwMDQ0MyI+IlVTQuODnuOCueOCueODiOODrOODvOOCuCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3RpdGxlIiBtc2dpZD0iNTkwMTQ1OTA0MTM5ODc1MTQ5NSI+IlVTQuaOpee2miI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ3OTY3NTk2NDYxNjcyNDcxNzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODIzMTQ2Mjc1MDAxMDA2Njg5NiI+IuaQuuW4r+mbu+ipseOCklVTQuOBp+ODkeOCveOCs+ODs+OBq+aOpee2muOBl+OBpuOBhOOBvuOBmeOAguODkeOCveOCs+ODs+OBqEFuZHJvaWTjga5TROOCq+ODvOODiemWk+OBp+ODleOCoeOCpOODq+OCkuOCs+ODlOODvOOBmeOCi+OBq+OBr+OAgeS4i+OBruODnOOCv+ODs+OCkumBuOaKnuOBl+OBvuOBmeOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4i5pC65biv6Zu76Kmx44KSVVNC44Gn44OR44K944Kz44Oz44Gr5o6l57aa44GX44Gm44GE44G+44GZ44CC44OR44K944Kz44Oz44GoQW5kcm9pZOOBrlNE44Kr44O844OJ6ZaT44Gn44OV44Kh44Kk44Or44KS44Kz44OU44O844GZ44KL44Gr44Gv44CB5LiL44Gu44Oc44K/44Oz44KS6YG45oqe44GX44G+44GZ44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiLmkLrluK/pm7voqbHjgpJVU0Ljgafjg5Hjgr3jgrPjg7PjgavmjqXntprjgZfjgabjgYTjgb7jgZnjgILjg5Hjgr3jgrPjg7PjgahBbmRyb2lk44GuU0Tjgqvjg7zjg4nplpPjgafjg5XjgqHjgqTjg6vjgpLjgrPjg5Tjg7zjgZnjgovjgavjga/jgIHkuIvjga7jg5zjgr/jg7PjgpLpgbjmip7jgZfjgb7jgZnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9idXR0b25fbW91bnQiIG1zZ2lkPSIxMDUyMjU5OTMwMzY5NTA4MjM1Ij4iVVNC44K544OI44Os44O844K444KST07jgavjgZnjgosiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNTM0Nzg0NzUxNjAzMzQ1MzYzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQ4MTgzNDc3NTY0MDI3NDAyNjEiPiJVU0Ljg6Hjg6Ljg6rjgatTROOCq+ODvOODieOCkuS9v+eUqOOBmeOCi+mam+OBq+WVj+mhjOOBjOeZuueUn+OBl+OBvuOBl+OBn+OAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iVVNC44Oh44Oi44Oq44GrU0Tjgqvjg7zjg4njgpLkvb/nlKjjgZnjgovpmpvjgavllY/poYzjgYznmbrnlJ/jgZfjgb7jgZfjgZ/jgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IlVTQuODoeODouODquOBq1NE44Kr44O844OJ44KS5L2/55So44GZ44KL6Zqb44Gr5ZWP6aGM44GM55m655Sf44GX44G+44GX44Gf44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODE3NTg5MjU1NDc1NzIxNjUyNSI+IlVTQuaOpee2miI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzM4MDA4MjQwNDI4ODIxOTM0MSI+IuODkeOCveOCs+ODs+OBqOOBrumWk+OBp+ODleOCoeOCpOODq+OCkuOCs+ODlOODvOOBl+OBvuOBmeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMjMzNjA1ODM5NjY2MzUxNjAxNyI+IlVTQuOCueODiOODrOODvOOCuOOCkk9GRuOBq+OBmeOCiyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNTkxODEzNDkwMjY5ODQxNTM5Ij4iVVNC44K544OI44Os44O844K444KST0ZG44Gr44GZ44KL5aC05ZCI44Gr6YG45oqe44GX44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF90aXRsZSIgbXNnaWQ9IjY2MDEyOTg1MTcwODc3NTg1MyI+IlVTQuOCueODiOODrOODvOOCuOOCkuS9v+eUqOS4rSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MTM3MTMzOTY0MjY2MDQxMDQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NzQ1MzQ1MjYwNzgwMjY3MTg1Ij4iVVNC44K544OI44Os44O844K444KST0ZG44Gr44GZ44KL5YmN44Gr44CB44OR44K944Kz44Oz44Gn5b+F44GaQW5kcm9pZOOBrlNE44Kr44O844OJ44Gu44Oe44Km44Oz44OI44KS6Kej6Zmk44GX44Gm77yI44Kr44O844OJ44KS5Y+W44KK5Ye644GX44Gm77yJ44GP44Gg44GV44GE44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IlVTQuOCueODiOODrOODvOOCuOOCkk9GRuOBq+OBmeOCi+WJjeOBq+OAgeODkeOCveOCs+ODs+OBp+W/heOBmkFuZHJvaWTjga5TROOCq+ODvOODieOBruODnuOCpuODs+ODiOOCkuino+mZpOOBl+OBpu+8iOOCq+ODvOODieOCkuWPluOCiuWHuuOBl+OBpu+8ieOBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJVU0Ljgrnjg4jjg6zjg7zjgrjjgpJPRkbjgavjgZnjgovliY3jgavjgIHjg5Hjgr3jgrPjg7Pjgaflv4XjgZpBbmRyb2lk44GuU0Tjgqvjg7zjg4njga7jg57jgqbjg7Pjg4jjgpLop6PpmaTjgZfjgabvvIjjgqvjg7zjg4njgpLlj5bjgorlh7rjgZfjgabvvInjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjcwNjAyMTgwMzQ5MDA2OTYwMjkiPiJVU0Ljgrnjg4jjg6zjg7zjgrjjgpJPRkbjgavjgZnjgosiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIxNDM4ODE5MTQ4NDA0MTIxMDgiPiJVU0Ljgrnjg4jjg6zjg7zjgrjjgpJPRkbjgavjgZnjgovpmpvjgavllY/poYzjgYznmbrnlJ/jgZfjgb7jgZfjgZ/jgIJVU0Ljg5vjgrnjg4jjga7jg57jgqbjg7Pjg4jjgYzop6PpmaTjgZXjgozjgabjgYTjgovjgZPjgajjgpLnorroqo3jgZfjgabjgYvjgonjgoLjgYbkuIDluqbjgYroqabjgZfjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGl0bGUiIG1zZ2lkPSI5NjMwMzkwMzM0NzA0Nzg2OTciPiJVU0Ljgrnjg4jjg6zjg7zjgrjjgpJPTuOBq+OBmeOCiyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190ZXh0IiBtc2dpZD0iMzIwMjgzODIzNDc4MDUwNTg4NiI+IlVTQuOCueODiOODrOODvOOCuOOCkk9O44Gr44GZ44KL44Go44CB5L2/55So5Lit44Gu44Ki44OX44Oq44Kx44O844K344On44Oz44Gu5LiA6YOo44GM5YGc5q2i44GX44CBVVNC44K544OI44Os44O844K444KST0ZG44Gr44GZ44KL44G+44Gn5L2/55So44Gn44GN44Gq44GP44Gq44KL5aC05ZCI44GM44GC44KK44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2Vycm9yX3RpdGxlIiBtc2dpZD0iODA0ODk5OTk3MzgzNzMzOTE3NCI+IlVTQuaTjeS9nOOBq+WkseaVl+OBl+OBvuOBl+OBnyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19vayIgbXNnaWQ9IjczNzY5NTMxNjcwMzk4NjU3MDEiPiJPSyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg2NjMyNDc5Mjk1NTEwOTU4NTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NTc3OTA4MDA2OTQ5NzQyMjE3Ij4iU0Tjgqvjg7zjg4njgpLjg5Xjgqnjg7zjg57jg4Pjg4giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4NjYzMjQ3OTI5NTUxMDk1ODU0Ij4iU0Tjgqvjg7zjg4njgpLjg5Xjgqnjg7zjg57jg4Pjg4giPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjIxMzY5OTYyNDMzNTIzNjE5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNDcwODE1MTQwMDY4NTAyODI0Ij4iU0Tjgqvjg7zjg4njgpLjg5Xjgqnjg7zjg57jg4Pjg4jjgZfjgabjgoLjgojjgo3jgZfjgYTjgafjgZnjgYvvvJ/jgqvjg7zjg4nlhoXjga7jgZnjgbnjgabjga7jg4fjg7zjgr/jgYzlpLHjgo/jgozjgb7jgZnjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiJTROOCq+ODvOODieOCkuODleOCqeODvOODnuODg+ODiOOBl+OBpuOCguOCiOOCjeOBl+OBhOOBp+OBmeOBi++8n+OCq+ODvOODieWGheOBruOBmeOBueOBpuOBruODh+ODvOOCv+OBjOWkseOCj+OCjOOBvuOBmeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJTROOCq+ODvOODieOCkuODleOCqeODvOODnuODg+ODiCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IlNE44Kr44O844OJ44KS44OV44Kp44O844Oe44OD44OI44GX44Gm44KC44KI44KN44GX44GE44Gn44GZ44GL77yf44Kr44O844OJ5YaF44Gu44GZ44G544Gm44Gu44OH44O844K/44GM5aSx44KP44KM44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X2J1dHRvbl9mb3JtYXQiIG1zZ2lkPSI0MTMxMDY0NTYwMTI3NDc4Njk1Ij4i44OV44Kp44O844Oe44OD44OIIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5MDQ0Nzc4OTQ5MTg5OTE4Ij4iVVNC44OH44OQ44OD44Kw44GM5o6l57aa44GV44KM44G+44GX44GfIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9Ijg0NzAyOTY4MTgyNzAxMTAzOTYiPiJVU0Ljg4fjg5Djg4PjgrDjgpLnhKHlirnjgavjgZnjgovloLTlkIjjgavpgbjmip7jgZfjgb7jgZnjgIIiPC9zdHJpbmc+CkBAIC04NDEsMjkgKzgyNiwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfYWxwaGFiZXQiIG1zZ2lkPSI1NDMzMjc1NDg1NDk5MDM5MTk5Ij4iIEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfbnVtZXJpY19hbHBoYWJldCIgbXNnaWQ9IjQwMzAxNzA1MjQ1OTUxMjM2MTAiPiIgMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FuZGlkYXRlc19zdHlsZSIgbXNnaWQ9IjQzMzM5MTMwODk2MzcwNjIyNTciPjx1PiLlgJnoo5wiPC91Pjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTQ1NzYwMzQxODk3MDk5NDA1MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MjM5NTE2Njc1MDI4NDM4OTk3Ij4iU0Tjgqvjg7zjg4njga7mupblgpnkuK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IlNE44Kr44O844OJ44Gu5rqW5YKZ5LitIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiJTROOCq+ODvOODieOBrua6luWCmeS4rSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjgyODczMTk4ODI5MjY3MzcwNTMiPiLjgqjjg6njg7zjgpLnorroqo3jgZfjgabjgYTjgb7jgZnjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3ODA0Nzc4MzgyNDEyMTI5OTcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzOTM3MzQ1NTc3OTgzNzMwODczIj4i56m644GuU0Tjgqvjg7zjg4kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI3ODA0Nzc4MzgyNDEyMTI5OTciPiLnqbrjga5TROOCq+ODvOODiSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDEzMTIyNjY4MjAwOTI5NTgwMTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE2MDY2NjA3NTYxMjQ2Mjk3MDgiPiJTROOCq+ODvOODieOBjOepuuOBi+OAgeOCteODneODvOODiOWvvuixoeWkluOBruODleOCoeOCpOODq+OCt+OCueODhuODoOOCkuS9v+eUqOOBl+OBpuOBhOOBvuOBmeOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlNE44Kr44O844OJ44GM56m644GL44CB44K144Od44O844OI5a++6LGh5aSW44Gu44OV44Kh44Kk44Or44K344K544OG44Og44KS5L2/55So44GX44Gm44GE44G+44GZ44CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjQxMDcyMzkwNjAxOTEwMDE4OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNzI0NjE5OTAyMDc2NTI4ODg5Ij4i56C05pCN44GX44GfU0Tjgqvjg7zjg4kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjQxMDcyMzkwNjAxOTEwMDE4OSI+IuegtOaQjeOBl+OBn1NE44Kr44O844OJIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjY3OTQxMjg4NDI5MDA2MTc3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY0NjAzMTE4MzUxMzA2NzExOTQiPiJTROOCq+ODvOODieOBjOegtOaQjeOBl+OBpuOBhOOBvuOBmeOAguOCq+ODvOODieOBruODleOCqeODvOODnuODg+ODiOOBjOW/heimgeOBquWPr+iDveaAp+OBjOOBguOCiuOBvuOBmeOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY5MDI1MzE3NzU5NDgyMzg5ODkiPiJTROOCq+ODvOODieOBjOegtOaQjeOBl+OBpuOBhOOBvuOBmeOAguOCq+ODvOODieOBruODleOCqeODvOODnuODg+ODiOOBjOW/heimgeOBquWPr+iDveaAp+OBjOOBguOCiuOBvuOBmeOAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY4NzIxNTI4ODI2MDQ0MDc4MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNTgyMTc1MDE2MDYwNDMyMDM0Ij4iU0Tjgqvjg7zjg4njgYzkuojmnJ/jgZvjgZrlj5bjgorlpJbjgZXjgozjgb7jgZfjgZ8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iU0Tjgqvjg7zjg4njgYzkuojmnJ/jgZvjgZrlj5bjgorlpJbjgZXjgozjgb7jgZfjgZ8iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3MjYwMTgzMjkzNzQ3NDQ4MjQxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyMDA1Mzk2NDY0NDk0NjQ4OTM3Ij4i44OH44O844K/44Gu5Zaq5aSx44KS6Ziy44GQ44Gf44KBU0Tjgqvjg7zjg4njgpLlj5bjgorlpJbjgZnliY3jgavjg57jgqbjg7Pjg4jjgpLop6PpmaTjgZfjgabjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiLjg4fjg7zjgr/jga7llqrlpLHjgpLpmLLjgZDjgZ/jgoFTROOCq+ODvOODieOCkuWPluOCiuWkluOBmeWJjeOBq+ODnuOCpuODs+ODiOOCkuino+mZpOOBl+OBpuOBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY3Mjk4MDExMzA3OTA2MTYyMDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM2NTI1ODgxMDE4Njc5NTE1Ij4iU0Tjgqvjg7zjg4njgpLlronlhajjgavlj5bjgorlpJbjgZfjgb7jgZfjgZ8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJTROOCq+ODvOODieOCkuWuieWFqOOBq+WPluOCiuWkluOBl+OBvuOBl+OBnyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc2MTM5NjA2ODY3NDc1OTI3NzAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNzUwMzc2OTEwNjI4NTE4ODcwMyI+IlNE44Kr44O844OJ44KS5a6J5YWo44Gr5Y+W44KK5aSW44Gb44G+44GZ44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IlNE44Kr44O844OJ44Gv5a6J5YWo44Gr5Y+W44KK5aSW44Gb44G+44GZ44CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODkwMjUxODAzMDQwNDM4MTMxOCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE4NzQ4ODk3NjQzNjcwODU1NjIiPiJTROOCq+ODvOODieOBjOWPluOCiuWkluOBleOCjOOBpuOBhOOBvuOBmSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiJTROOCq+ODvOODieOBjOWPluOCiuWkluOBleOCjOOBpuOBhOOBvuOBmSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQyMDUxMTcyMjczNDI4MjIyNzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI3MzA4OTA0NDEzMzEzNDQ3NzYiPiJTROOCq+ODvOODieOBjOOBguOCiuOBvuOBm+OCk+OAguODoeODouODquOCkuS9v+eUqOOBmeOCi+mam+OBr+OCq+ODvOODieOCkuaMv+WFpeOBl+OBpuOBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IlNE44Kr44O844OJ44GM5Y+W44KK5aSW44GV44KM44G+44GX44Gf44CC5paw44GX44GE44Kr44O844OJ44KS5oy/5YWl44GX44Gm44GP44Gg44GV44GE44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4i56m644GuU0Tjgqvjg7zjg4kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJTROOCq+ODvOODieOBjOepuuOBi+OAgeOCteODneODvOODiOWvvuixoeWkluOBruODleOCoeOCpOODq+OCt+OCueODhuODoOOCkuS9v+eUqOOBl+OBpuOBhOOBvuOBmeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4i56C05pCN44GX44GfU0Tjgqvjg7zjg4kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iU0Tjgqvjg7zjg4njgYznoLTmkI3jgZfjgabjgYTjgb7jgZnjgILjgqvjg7zjg4njga7jg5Xjgqnjg7zjg57jg4Pjg4jjgYzlv4XopoHjgarlj6/og73mgKfjgYzjgYLjgorjgb7jgZnjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iU0Tjgqvjg7zjg4njgYzkuojmnJ/jgZvjgZrlj5bjgorlpJbjgZXjgozjgb7jgZfjgZ8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiLjg4fjg7zjgr/jga7llqrlpLHjgpLpmLLjgZDjgZ/jgoFTROOCq+ODvOODieOCkuWPluOCiuWkluOBmeWJjeOBq+ODnuOCpuODs+ODiOOCkuino+mZpOOBl+OBpuOBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+IlNE44Kr44O844OJ44KS5a6J5YWo44Gr5Y+W44KK5aSW44GX44G+44GX44GfIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IlNE44Kr44O844OJ44Gv5a6J5YWo44Gr5Y+W44KK5aSW44Gb44G+44GZ44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IlNE44Kr44O844OJ44GM5Y+W44KK5aSW44GV44KM44Gm44GE44G+44GZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iU0Tjgqvjg7zjg4njgYzlj5bjgorlpJbjgZXjgozjgb7jgZfjgZ/jgILmlrDjgZfjgYTjgqvjg7zjg4njgpLmjL/lhaXjgZfjgabjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY3Rpdml0eV9saXN0X2VtcHR5IiBtc2dpZD0iNDE2ODgyMDYwOTQwMzM4NTc4OSI+IuS4gOiHtOOBmeOCi+OCouOCr+ODhuOCo+ODk+ODhuOCo+OBjOimi+OBpOOBi+OCiuOBvuOBm+OCkyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg3ODczNTIwNzQzMjY3NDg4OTIiPiLjgrPjg7Pjg53jg7zjg43jg7Pjg4jkvb/nlKjnirbms4HjgavplqLjgZnjgovntbHoqIjmg4XloLHjga7mm7TmlrAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODkxNTUzNjk1NzE2NzUyODM1Ij4i5Y+O6ZuG44GV44KM44Gf44Kz44Oz44Od44O844ON44Oz44OI5L2/55So54q25rOB44Gr6Zai44GZ44KL57Wx6KiI5oOF5aCx44Gu5aSJ5pu044KS6Kix5Y+v44GX44G+44GZ44CC6YCa5bi444Gu44Ki44OX44Oq44Kx44O844K344On44Oz44Gn44Gv5L2/55So44GX44G+44Gb44KT44CCIjwvc3RyaW5nPgpAQCAtODk4LDE1ICs4NzIsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJMMlRQL0lQU2VjIFZQTuODmeODvOOCueOBruS6i+WJjeWFseaciemNtSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJMMlRQL0lQU2VjIFZQTuODmeODvOOCueOBruiovOaYjuabuCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IuODleOCoeOCpOODq+OCkumBuOaKniI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IuODleOCoeOCpOODq+OBjOmBuOaKnuOBleOCjOOBpuOBhOOBvuOBm+OCkyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IuODquOCu+ODg+ODiCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiLpgIHkv6EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+IuOBiuawl+OBq+WFpeOCiiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IumBi+i7ouODouODvOODieOCkuacieWKueOBq+OBmeOCiyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiLpgYvou6Ljg6Ljg7zjg4njgpLntYLkuobjgZnjgovjgavjga/pgbjmip7jgZfjgabjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4i44OG44K244Oq44Oz44Kw44G+44Gf44Gv44Ki44Kv44K744K544Od44Kk44Oz44OI44GM5pyJ5Yq544Gn44GZIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4i44K/44OD44OX44GX44Gm6Kit5a6a44GZ44KLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4i5oi744KLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4i5qyh44G4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4i44K544Kt44OD44OXIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4i44Oi44OQ44Kk44Or44OH44O844K/44Gu5L2/55So6YeP44GM5aKX44GI44Gm44GE44G+44GZIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiLjgr/jg4Pjg5fjgZfjgabjg6Ljg5DjgqTjg6vjg4fjg7zjgr/liKnnlKjjga7oqbPntLDjgpLooajnpLrjgZfjgb7jgZkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IuODouODkOOCpOODq+ODh+ODvOOCv+OBruWItumZkOOCkui2heOBiOOBvuOBl+OBnyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiLjgr/jg4Pjg5fjgZfjgabjg6Ljg5DjgqTjg6vjg4fjg7zjgr/liKnnlKjjga7oqbPntLDjgpLooajnpLrjgZfjgb7jgZkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19tYXRjaGVzIiBtc2dpZD0iODEyOTQyMTkwODkxNTg0MDczNyI+IuipsuW9k+OBquOBlyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZpbmRfb25fcGFnZSIgbXNnaWQ9IjE5NDY3OTkyMzM4MjI4MjAzODQiPiLjg5rjg7zjgrjlhoXjgpLmpJzntKIiPC9zdHJpbmc+CisgIDxwbHVyYWxzIG5hbWU9Im1hdGNoZXNfZm91bmQiPgorICAgIDxpdGVtIHF1YW50aXR5PSJvbmUiIG1zZ2lkPSI4MTY3MTQ3MDgxMTM2NTc5NDM5Ij4iMeS7tuS4gOiHtCI8L2l0ZW0+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im90aGVyIiBtc2dpZD0iNDY0MTg3Mjc5NzA2NzYwOTE3NyI+Ijx4bGlmZjpnIGlkPSJJTkRFWCI+JWQ8L3hsaWZmOmc+Lzx4bGlmZjpnIGlkPSJUT1RBTCI+JWQ8L3hsaWZmOmc+5Lu2IjwvaXRlbT4KKyAgPC9wbHVyYWxzPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbAppbmRleCA3NWQwZGExLi4zYjliZDNmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKQEAgLTE2OSw4ICsxNjksNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSIzNDQ2MTY0NTg0NzEwNTk2NTEzIj4i6rCc67CcIOuPhOq1rCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2NfZGV2ZWxvcG1lbnRUb29scyIgbXNnaWQ9IjkwNTY0MzExOTM4OTM4MDk4MTQiPiLslaDtlIzrpqzsvIDsnbTshZgg6rCc67Cc7J6Q7JeQ6rKM66eMIO2VhOyalO2VnCDquLDriqXsnoXri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX3N0b3JhZ2UiIG1zZ2lkPSIxOTcxMTE4NzcwNTQ2MzM2OTY2Ij4i7KCA7J6lIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTIwMzMwMjIxNDkxNTM1NTc3NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjU0NTU4MDQzNTMyMjA1ODEzMTIiPiJTRCDsubTrk5zsl5Ag7JWh7IS47Iqk7ZWp64uI64ukLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiJTRCDsubTrk5zsl5Ag7JWh7IS47Iqk7ZWp64uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiJTRCDsubTrk5zsl5Ag7JWh7IS47Iqk7ZWp64uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyIiBtc2dpZD0iNzQxNzE5MjYyOTYwMTg5MDc5MSI+IuyDge2DnCDtkZzsi5zspIQg7IKs7JqpIOykkeyngCDrmJDripQg7IiY7KCVIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc3RhdHVzQmFyIiBtc2dpZD0iMTM2NTQ3MzU5NTMzMTk4OTczMiI+IuyVoO2UjOumrOy8gOydtOyFmOydtCDsg4Htg5wg7ZGc7Iuc7KSE7J2EIOyCrOyaqSDspJHsp4DtlZjqsbDrgpgg7Iuc7Iqk7YWcIOyVhOydtOy9mOydhCDstpTqsIAg67CPIOygnOqxsO2VoCDsiJgg7J6I64+E66GdIO2VqeuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhclNlcnZpY2UiIG1zZ2lkPSI3MjQ3MjgxOTExMzg3OTMxNDg1Ij4i7IOB7YOcIO2RnOyLnOykhCI8L3N0cmluZz4KQEAgLTI2Nyw4ICsyNjYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NsZWFyQXBwQ2FjaGUiIG1zZ2lkPSI3NzQwNDY1Njk0MTkzNjcxNDAyIj4i7JWg7ZSM66as7LyA7J207IWY7J20IOyVoO2UjOumrOy8gOydtOyFmCDsupDsi5wg65SU66CJ7Yag66as7JeQIOyeiOuKlCDtjIzsnbzsnYQg7IKt7KCc7ZWY7JesIO2ctOuMgOyghO2ZlOydmCDsoIDsnqXqs7XqsITsnYQg64qY66a0IOyImCDsnojrj4TroZ0g7ZWp64uI64ukLiDslaHshLjsiqTripQg7J2867CY7KCB7Jy866GcIOyLnOyKpO2FnCDtlITroZzshLjsiqTroZwg7KCc7ZWc65Cp64uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbW92ZVBhY2thZ2UiIG1zZ2lkPSI3Mjg0NTQ5Nzk5NDY1MDM5MjYiPiLslaDtlIzrpqzsvIDsnbTshZgg66as7IaM7IqkIOydtOuPmSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21vdmVQYWNrYWdlIiBtc2dpZD0iNjMyMzA0OTI5MTkyMzkyNTI3NyI+IuyVoO2UjOumrOy8gOydtOyFmOydtCDslaDtlIzrpqzsvIDsnbTshZgg66as7IaM7Iqk66W8IOuCtOu2gOyXkOyEnCDsmbjrtoAg66+465SU7Ja066GcIOuYkOuKlCDqt7gg67CY64yA66GcIOydtOuPme2VoCDsiJgg7J6I64+E66GdIO2VqeuLiOuLpC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0ODExOTIxNzAzODgyNTMyMDcwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRMb2dzIiBtc2dpZD0iNjYxNTc3ODU0MzE5ODk2NzYxNCI+IuyLnOyKpO2FnCDroZzqt7gg7YyM7J28IOydveq4sCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIyNTc5Mzc5NTU1ODA0NzU5MDIgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+IuyVoO2UjOumrOy8gOydtOyFmOydtCDsi5zsiqTthZzsnZgg64uk7JaR7ZWcIOuhnOq3uCDtjIzsnbzsnYQg7J297J2EIOyImCDsnojrj4TroZ0g7ZWp64uI64ukLiDsnbQg6rK97JqwIOyVoO2UjOumrOy8gOydtOyFmOydgCDsgqzsmqnsnpDqsIAg7Zy064yA7KCE7ZmU66GcIOyImO2Wie2VmOuKlCDsnpHsl4Xsl5Ag64yA7ZWcIOydvOuwmOyggeyduCDsoJXrs7Trpbwg6rKA7IOJ7ZWgIOyImCDsnojsirXri4jri6QuIO2VmOyngOunjCDroZzqt7gg7YyM7J287JeQIOyWtOuWoO2VnCDqsJzsnbjsoJXrs7Trj4Qg7Y+s7ZWo65CY7Ja07ISc64qUIOyViCDrkKnri4jri6QuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZExvZ3MgKDY2MTU3Nzg1NDMxOTg5Njc2MTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZExvZ3MgKDg4OTY0NDk0Mzc0NjQ4Njc3NjYpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2RpYWdub3N0aWMiIG1zZ2lkPSI4MDc2NzQzOTUzOTA4MDAwMzQyIj4i7KeE64uoIOq3uOujuSDshozsnKDsnZgg66as7IaM7IqkIOydveq4sC/sk7DquLAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaWFnbm9zdGljIiBtc2dpZD0iMzEyMTIzODM3Mzk1MTYzNzA0OSI+IuyVoO2UjOumrOy8gOydtOyFmOydtCDsp4Tri6gg6re466O5IOyGjOycoOydmCDrpqzshozsiqQo7JiIOiAvZGV27JeQIOyeiOuKlCDtjIzsnbwp66W8IOydveqzoCDsk7gg7IiYIOyeiOuPhOuhnSDtlanri4jri6QuIOydtCDquLDriqXsnYAg7Iuc7Iqk7YWcIOyViOygleyEsSDrsI8g67O07JWI7JeQIOyYge2WpeydhCDrr7jsuaAg7IiYIOyeiOycvOuvgOuhnCDsoJzsobDsl4XssrQg65iQ64qUIOyCrOyXheyekOqwgCDtlZjrk5zsm6jslrQg6rSA66CoIOynhOuLqOydhCDsiJjtlontlZjripQg6rK97Jqw7JeQ66eMIOyCrOyaqe2VtOyVvCDtlanri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VDb21wb25lbnRTdGF0ZSIgbXNnaWQ9Ijc5NDI1MTk4ODM0MzI5NDA2Ij4i7JWg7ZSM66as7LyA7J207IWYIOq1rOyEsSDsmpTshowg7IKs7JqpIOuYkOuKlCDsgqzsmqkg7JWI7ZWoIjwvc3RyaW5nPgpAQCAtNDAzLDIyICs0MDQsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoQWRtaW4iIG1zZ2lkPSI3MjU2Mjg5Nzc0NjY3MDU0NTU1Ij4i7JWg7ZSM66as7LyA7J207IWY7J20IOuhnOy7rCBCbHVldG9vdGgg7Zy064yA7KCE7ZmU66W8IOq1rOyEse2VnCDri6TsnYwg7JuQ6rKpIOyepey5mOulvCDqsoDsg4ntlZjsl6wg7Y6Y7Ja066eB7ZWgIOyImCDsnojrj4TroZ0g7ZWp64uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYmx1ZXRvb3RoIiBtc2dpZD0iODM2MTAzODcwNzg1NzAxODczMiI+IkJsdWV0b290aCDsl7DqsrAg66eM65Ok6riwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoIiBtc2dpZD0iNzYyNTE1MzgwNjc5MzkyOTQ1Ij4i7JWg7ZSM66as7LyA7J207IWY7J20IOuhnOy7rCBCbHVldG9vdGgg7KCE7ZmU7J2YIOq1rOyEseydhCDrs7Tqs6Ag7Y6Y7Ja066eB65CcIOyepey5mOyXkCDsl7DqsrDtlZjrqbAg7Jew6rKw7J2EIOyImOudve2VoCDsiJgg7J6I64+E66GdIO2VqeuLiOuLpC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNBZG1pbiAoMjI1MTMwMjIzMzAxMjI1MDA1NikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNBZG1pbiAoMTkzNTg0MjYxMTQ2NDg5NTc4NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY1JhdyAoNDQyMzQ3MTcxMTExNDMyNTcwOCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNSYXcgKDU1MzMwMjI3MzY1NTkzODU2NjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNOb3RpZnkgKDQ3ODQ3MDM2MDA4Mjc5MjM1OCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNOb3RpZnkgKDI5OTAwNTM1MTc5NjIwNzA2MTcpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNMbGNwICg0OTcyMDUxNDYxMDA3MDMwNDI2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0xsY3AgKDkxNTkyMTI3Nzg2MDA0NjQwKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSI0OTc3NDA2MTY0MzExNTM1MDkyIj4i7YKkIOyeoOq4iCDsgqzsmqkg7KSR7KeAIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iMzE4OTc2MzQ3OTMyNjMwMjAxNyI+IuyVoO2UjOumrOy8gOydtOyFmOydtCDtgqQg7J6g6riIIOuwjyDqtIDroKgg67mE67CA67KI7Zi4IOuztOyViOydhCDsgqzsmqkg7KSR7KeA7ZWgIOyImCDsnojrj4TroZ0g7ZWp64uI64ukLiDsmIjrpbwg65Ok7Ja0LCDtnLTrjIDsoITtmZTqsIAg7IiY7Iug7KCE7ZmU66W8IOuwm+ydhCDrlYwg7YKkIOyeoOq4iOydhCDsgqzsmqkg7KSR7KeA7ZaI64uk6rCAIO2Gte2ZlOqwgCDrgZ3rgpjrqbQg7YKkIOyeoOq4iOydhCDri6Tsi5wg7IKs7Jqp7ZWgIOyImCDsnojsirXri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkU3luY1NldHRpbmdzIiBtc2dpZD0iNjIwMTgxMDAwODIzMDUwMzA1MiI+IuuPmeq4sO2ZlCDshKTsoJUg7J296riwIjwvc3RyaW5nPgpAQCAtNDM1LDIyICs0MjAsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iMTA4Mjk3MjYwMzU3NjM2MDY5MCI+IuyVoO2UjOumrOy8gOydtOyFmOydtCDsgqzsmqnsnpAg7IKs7KCE7JeQIOuztOq0gOuQmOyWtCDsnojripQg67mE6rO16rCcIOuLqOyWtCwg7J2066aEIOuwjyDqtazrrLjsnYQg7J2964+E66GdIO2VqeuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjY3MDMxMDk1MTE4MzYzNDMzNDEiPiLsgqzsmqnsnpDsoJXsnZgg7IKs7KCE7JeQIOyekeyEsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyNDEyNTYyMDY1MjQwODI4ODAiPiLslaDtlIzrpqzsvIDsnbTshZjsnbQg7IKs7Jqp7J6QIOyCrOyghOyXkCDsg4gg64uo7Ja066W8IOyeheugpe2VoCDsiJgg7J6I64+E66GdIO2VqeuLiOuLpC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4MDc5NDAzNzU5MDAxNzc3MjkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijk5MzcwNzQzNjk0MTAxNjkxMyI+IlNEIOy5tOuTnCDsvZjthZDsuKAg7IiY7KCVL+yCreygnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iU0Qg7Lm065OcIOy9mO2FkOy4oCDsiJjsoJUv7IKt7KCcIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjY0Mzk2MzIwNDk3NjQ3MTg3OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDEzMTg3MTU0MTEyNzIxMTUyNiI+IuyVoO2UjOumrOy8gOydtOyFmOydtCBTRCDsubTrk5zsl5Ag7JO4IOyImCDsnojrj4TroZ0g7ZWp64uI64ukLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IuyVoO2UjOumrOy8gOydtOyFmOydtCBTRCDsubTrk5zsl5Ag7JO4IOyImCDsnojrj4TroZ0g7ZWp64uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iU0Qg7Lm065OcIOy9mO2FkOy4oCDsiJjsoJUv7IKt7KCcIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4i7JWg7ZSM66as7LyA7J207IWY7J20IFNEIOy5tOuTnOyXkCDsk7gg7IiYIOyeiOuPhOuhnSDtlanri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iNTY1NjQ4NzI2NDgxOTY2OTgyNCI+Iuy6kOyLnCDtjIzsnbzsi5zsiqTthZwg7JWh7IS47IqkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjE2MjQ3MzQ1Mjg0MzU2NTk5MDYiPiLslaDtlIzrpqzsvIDsnbTshZjsnbQg7LqQ7IucIO2MjOydvOyLnOyKpO2FnOydhCDsnb3qs6Ag7JO4IOyImCDsnojrj4TroZ0g7ZWp64uI64ukLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQzMDc4NjE0OTYzMDI4NTAyMDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDQ5NzQyMDcyODg1NzU4NTc5MSI+Iuu5hOuwgOuyiO2YuCDsoJztlZwiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxNzE5ODc3MjQ1NjkyMzE4Mjk5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI5MDgzNDAwMDgwODYxNzI4MDU2Ij4i7IKs7Jqp7ZWgIOyImCDsnojripQg67mE67CA67KI7Zi4IOycoO2YleydhCDsoJztlZztlanri4jri6QuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzM3NDc4MDcxMjY2NDI4NTMyMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI5MTQxMzA2NDY5NDIxOTk1MDMiPiLroZzqt7jsnbgg7Iuc64+EIOuztOq4sCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE5NjEyNTExNzk2MjQ4NDM0ODMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjcyMjc1NzgyNjAxNjUxNzI2NzMiPiLrqocg6rCA7KeAIOyekeyXheydhCDsiJjtlontlZjquLAg7JyE7ZW0IOq4sOq4sOyXkCDrjIDtlbQg7Iuk7Yyo7ZWcIOuhnOq3uOyduCDsi5zrj4Trpbwg66qo64uI7YSw66eB7ZWp64uI64ukLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkwODQ3NzIwOTA3OTc0ODU0MjAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iMjYyMDA3NzE5MTI0MjY4ODk1NSI+Iuu5hOuwgOuyiO2YuCDsnqzshKTsoJUiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzMzMyMTY3NjAwMzMxNzk5OTkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI1MzkxMjQwNjE2OTgxMjk3MzYxIj4i67mE67CA67KI7Zi466W8IOyDiCDqsJLsnLzroZwg6rCV7KCcIOyEpOygle2VqeuLiOuLpC4g7J2066W8IOyImO2Wie2VmOugpOuptCDroZzqt7jsnbjtlZjquLAg7KCE7JeQIOq0gOumrOyekOyXkOqyjCDsg4jroZwg7KeA7KCV7ZWgIOu5hOuwgOuyiO2YuCDqsJLsnYQg7JqU7LKt7ZW07JW8IO2VqeuLiOuLpC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NzYwNDY2MDI1MjQ3NjM0NDg4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iMjI3NDA4NTM4NDcwNDI0ODQzMSI+IuqwleygnCDsnqDquIgiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyODE5ODY4NjY0OTQ2MDg5NzQwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjU2OTY5NjQxMjYyMjYwMjg0NDIiPiLquLDquLDqsIAg7J6g6rKoIOyeiOydhCDrlYwg7J6R64+Z7ZWY66Ck66m0IOu5hOuwgOuyiO2YuOulvCDri6Tsi5wg7J6F66Cl7ZW07JW8IO2VqeuLiOuLpC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQzMDc4NjE0OTYzMDI4NTAyMDEiPiLruYTrsIDrsojtmLgg7KCc7ZWcIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iMTcxOTg3NzI0NTY5MjMxODI5OSI+IuyCrOyaqe2VoCDsiJgg7J6I64qUIOu5hOuwgOuyiO2YuCDsnKDtmJXsnYQg7KCc7ZWc7ZWp64uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iNzM3NDc4MDcxMjY2NDI4NTMyMSI+IuuhnOq3uOyduCDsi5zrj4Qg67O06riwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iMTk2MTI1MTE3OTYyNDg0MzQ4MyI+IuuqhyDqsIDsp4Ag7J6R7JeF7J2EIOyImO2Wie2VmOq4sCDsnITtlbQg6riw6riw7JeQIOuMgO2VtCDsi6TtjKjtlZwg66Gc6re47J24IOyLnOuPhOulvCDrqqjri4jthLDrp4Htlanri4jri6QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI5MDg0NzcyMDkwNzk3NDg1NDIwIj4i67mE67CA67KI7Zi4IOyerOyEpOyglSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjMzMzIxNjc2MDAzMzE3OTk5OTEiPiLruYTrsIDrsojtmLjrpbwg7IOIIOqwkuycvOuhnCDqsJXsoJwg7ISk7KCV7ZWp64uI64ukLiDsnbTrpbwg7IiY7ZaJ7ZWY66Ck66m0IOuhnOq3uOyduO2VmOq4sCDsoITsl5Ag6rSA66as7J6Q7JeQ6rKMIOyDiOuhnCDsp4DsoJXtlaAg67mE67CA67KI7Zi4IOqwkuydhCDsmpTssq3tlbTslbwg7ZWp64uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSI1NzYwNDY2MDI1MjQ3NjM0NDg4Ij4i6rCV7KCcIOyeoOq4iCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+Iuq4sOq4sOqwgCDsnqDqsqgg7J6I7J2EIOuVjCDsnpHrj5ntlZjroKTrqbQg67mE67CA67KI7Zi466W8IOuLpOyLnCDsnoXroKXtlbTslbwg7ZWp64uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiLrqqjrk6Ag642w7J207YSwIOyCreygnCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIzMTQwNjA5MzM3OTYzOTYyMDUgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSI3NjY5ODk1MzMzODE0MjIyNTg2Ij4i7LSI6riw7ZmU66W8IOyImO2Wie2VmOyXrCDrqqjrk6Ag642w7J207YSw66W8IO2ZleyduO2VmOyngCDslYrqs6Ag7IKt7KCc7ZWp64uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4i7LSI6riw7ZmU66W8IOyImO2Wie2VmOyXrCDrqqjrk6Ag642w7J207YSw66W8IO2ZleyduO2VmOyngCDslYrqs6Ag7IKt7KCc7ZWp64uI64ukLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5IiBtc2dpZD0iNjM4NzQ5NzQ2NjY2MDE1NDkzMSI+IuygleyxheydtCDsgqzsmqkg7ISk7KCV65CY7Ja0IOyeiOuKlCDrj5nslYgg7IKs7Jqp65CgIOq4sOq4sCDquIDroZzrsowg7ZSE66Gd7Iuc66W8IOyEpOygle2VqeuLiOuLpC4g7LKrIOuyiOynuCDquLDquLAg6rSA66as7J6Q6rCAIOyEpOygle2VnCDquIDroZzrsowg7ZSE66Gd7Iuc66eMIOycoO2aqO2VqeuLiOuLpC4iPC9zdHJpbmc+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiLsp5EiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiLrqqjrsJTsnbwiPC9pdGVtPgpAQCAtNTUyLDEwICs1MzgsOSBAQAogICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVPdGhlciAoNDQwODQzNjE2Mjk1MDExOTg0OSkgLS0+CiAgICAgPHNraXAgLz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiI8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPuydhCjrpbwpIO2Gte2VtCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+KDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+IOyCrOyaqSkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJQSU4g7L2U65OcIOyeheugpSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4i7J6g6riI7J2EIO2VtOygnO2VmOugpOuptCDruYTrsIDrsojtmLgg7J6F66ClIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiLsnqDquIjsnYQg7ZW07KCc7ZWY66Ck66m0IFBJTiDsnoXroKUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJQSU4g7L2U65Oc6rCAIOyemOuqu+uQmOyXiOyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4i7J6g6riI7ZW07KCc7ZWY66Ck66m0IOuplOuJtOulvCDriITrpbgg64uk7J2MIDDsnYQg64iE66aF64uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLruYTsg4Eg7KCE7ZmU67KI7Zi4Ijwvc3RyaW5nPgpAQCAtNTY4LDYgKzU1Myw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+Iu2Gte2ZlOuhnCDrj4zslYTqsIDquLAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiLrp57sirXri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IuyjhOyGoe2VqeuLiOuLpC4g64uk7IucIOyLnOuPhO2VmOyEuOyalC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IuyjhOyGoe2VqeuLiOuLpC4g64uk7IucIOyLnOuPhO2VtCDso7zshLjsmpQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4i7Lap7KCEIOykkSg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiLstqnsoITrkJjsl4jsirXri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTgyLDYgKzU2OCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0g7Lm065Oc6rCAIOyeoOqyqCDsnojsirXri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iU0lNIOy5tOuTnCDsnqDquIjtlbTsoJwg7KSRLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4i7J6g6riI7ZW07KCcIO2MqO2EtOydhCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPu2ajCDsnpjrqrsg6re466C47Iq164uI64ukLiAiXG5cbiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPuy0iCDtm4Tsl5Ag64uk7IucIOyLnOuPhO2VmOyEuOyalC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiLruYTrsIDrsojtmLjrpbwgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7tmowg7J6Y66q7IOyeheugpe2WiOyKteuLiOuLpC4gIlxuXG4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz7stIgg7ZuE7JeQIOuLpOyLnCDsi5zrj4TtlbQg7KO87IS47JqULiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJQSU7snYQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7tmowg7J6Y66q7IOyeheugpe2WiOyKteuLiOuLpC4gIlxuXG4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz7stIgg7ZuE7JeQIOuLpOyLnCDsi5zrj4TtlbQg7KO87IS47JqULiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4i7J6g6riI7ZW07KCcIO2MqO2EtOydhCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPu2ajCDsnpjrqrsg6re466C47Iq164uI64ukLiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPu2ajCDrjZQg7Iuk7Yyo7ZWY66m0IEdvb2dsZSDroZzqt7jsnbjsnYQg7Ya17ZW0IO2ctOuMgOyghO2ZlOulvCDsnqDquIjtlbTsoJztlZjrj4TroZ0g7JqU7LKt65Cp64uI64ukLiAiXG5cbiIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz7stIgg7ZuE7JeQIOuLpOyLnCDsi5zrj4TtlZjshLjsmpQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPuy0iCDtm4Tsl5Ag64uk7IucIOyLnOuPhO2VmOyEuOyalC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+Iu2MqO2EtOydhCDsnorsnLzshajrgpjsmpQ/Ijwvc3RyaW5nPgpAQCAtNjEwLDE0ICs1OTgsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ19iZWZvcmVfdW5sb2FkIiBtc2dpZD0iMTkwMTY3NTQ0ODE3OTY1MzA4OSI+IuuLpOuluCDtjpjsnbTsp4Drpbwg7YOQ7IOJ7ZWY7Iuc6rKg7Iq164uI6rmMPyJcblxuIjx4bGlmZjpnIGlkPSJNRVNTQUdFIj4lczwveGxpZmY6Zz4iXG5cbiLqs4Tsho3tlZjroKTrqbQgXCftmZXsnbhcJ+ydhCDshKDtg53tlZjqs6Ag7ZiE7J6sIO2OmOydtOyngOyXkCDqt7jrjIDroZwg7J6I7Jy866Ck66m0IFwn7Leo7IaMXCfrpbwg7ISg7YOd7ZWY7IS47JqULiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbGFiZWwiIG1zZ2lkPSI2ODYwMjYxNzU4NjY1ODI1MDY5Ij4i7ZmV7J24Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZG91YmxlX3RhcF90b2FzdCIgbXNnaWQ9IjEwNjgyMTY5MzcyNDQ1NjcyNDciPiLrj4Tsm4Drp5A6IOy2leyGjC/tmZXrjIDtlZjroKTrqbQg65GQIOuyiCDriITrpoXri4jri6QuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9maWxsX3RoaXNfZm9ybSAoODk0MDExMDg2Njc3NTA5NzQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSIxMjg0ODQzNzI4MjAzNDEyMTM1Ij4i67iM65287Jqw7KCA7J2YIOq4sOuhnSDrsI8g67aB66eI7YGsIOydveq4sCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iNDk4MTQ4OTgxNTQ2NzYxNzE5MSI+IuyVoO2UjOumrOy8gOydtOyFmOydtCDruIzrnbzsmrDsoIDroZwg67Cp66y47ZWcIOuqqOuToCBVUkzqs7wg67iM65287Jqw7KCA7J2YIOuqqOuToCDrtoHrp4jtgazrpbwg7J2964+E66GdIO2XiOyaqe2VqeuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjkwMDk0MzQxMDk4MzYyODAzNzQiPiLruIzrnbzsmrDsoIDsnZgg6riw66GdIOuwjyDrtoHrp4jtgawg7JOw6riwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTQ1NTcxOTkwMzU3MTE0OTUwIj4i7JWg7ZSM66as7LyA7J207IWY7J20IO2ctOuMgOyghO2ZlOyXkCDsoIDsnqXrkJwg67iM65287Jqw7KCAIOq4sOuhnSDrmJDripQg67aB66eI7YGs66W8IOyImOygle2VoCDsiJgg7J6I64+E66GdIO2XiOyaqe2VqeuLiOuLpC4g7J20IOqyveyasCDslYXshLEg7JWg7ZSM66as7LyA7J207IWY7J20IOu4jOudvOyasOyggOydmCDrjbDsnbTthLDrpbwg7KeA7Jqw6rGw64KYIOyImOygle2VoCDsiJgg7J6I7Iq164uI64ukLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldEFsYXJtICg1OTI0NDAxMzI4ODAzNjE1MTY1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldEFsYXJtICg1OTY2OTY2NTk4MTQ5ODc1MDgyKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0NzE1MjEyNjU1NTk4Mjc1NTMyIj4i67iM65287Jqw7KCAIOychOy5mCDsoJXrs7Qg7IiY7KCVIOq2jO2VnCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQwMTE5MDgyODI5ODA4NjE2NzkiPiLslaDtlIzrpqzsvIDsnbTshZjsnbQg67iM65287Jqw7KCA7J2YIOychOy5mCDsoJXrs7Qg6raM7ZWc7J2EIOyImOygle2VoCDsiJgg7J6I64+E66GdIO2VqeuLiOuLpC4g7JWF7ISxIOyVoO2UjOumrOy8gOydtOyFmOydtCDsnbTrpbwg7IKs7Jqp7ZWY7JesIOyehOydmOydmCDsm7nsgqzsnbTtirjsl5Ag7JyE7LmYIOygleuztOulvCDrs7Trgrwg7IiY64+EIOyeiOyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiLruIzrnbzsmrDsoIDsl5Ag7J20IOu5hOuwgOuyiO2YuOulvCDsoIDsnqXtlZjsi5zqsqDsirXri4jquYw/Ijwvc3RyaW5nPgpAQCAtNzMwLDE0ICs3MTYsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiLrqqjrkZAg7ISg7YOdIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiLri6jslrQg7ISg7YOdIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IuyemOudvOuCtOq4sCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4i67O17IKsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4i67aZ7Jes64Sj6riwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJVUkwg67O17IKsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIG1zZ2lkPSI2NzM4NTU2MzQ4ODYxMzQ3MjQwIj4i7YWN7Iqk7Yq4IOyEoO2DnS4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRleHRTZWxlY3Rpb25DQUJUaXRsZSIgbXNnaWQ9IjUyMzY4NTAzOTQzNzA4MjAzNTciPiLthY3siqTtirgg7ISg7YOdIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4i7J6F66ClIOuwqeuylSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiLsgqzsoITsl5AgXCc8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCcg7LaU6rCAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4i7YWN7Iqk7Yq4IOyImOyglSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iNDkwOTEzNTU2NDk0MTgxNTQ5NCI+Iu2FjeyKpO2KuCDsnpHsl4UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IuyggOyepeqzteqwhCDrtoDsobEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiLtnLTrjIDsoITtmZQg7KCA7J6l6rO16rCE7J20IOu2gOyhse2VqeuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiLtmZXsnbgiPC9zdHJpbmc+CkBAIC03NDUsNiArNzMxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiLtmZXsnbgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiLst6jshowiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4i7KO87J2YIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiLroZzrk5wg7KSRLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiLsgqzsmqkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiLsgqzsmqkg7JWI7ZWoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiLsnpHsl4XsnYQg7IiY7ZaJ7ZWgIOuVjCDsgqzsmqntlZjripQg7JWg7ZSM66as7LyA7J207IWYIjwvc3RyaW5nPgpAQCAtNzYzLDkgKzc1MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0iZm9yY2VfY2xvc2UiIG1zZ2lkPSIzNjUzNDE2MzE1NDUwODA2Mzk2Ij4i64ur6riwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+IuyLoOqzoCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndhaXQiIG1zZ2lkPSI3MTQ3MTE4MjE3MjI2MzE3NzMyIj4i64yA6riwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4i7JWg7ZSM66as7LyA7J207IWYIOumrOuUlOugieyFmOuQqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPuydtCjqsIApIOyLpO2WiSDspJHsnoXri4jri6QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiLsm5DrnpggPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPuydhCjrpbwpIOyLpO2Wie2WiOyKteuLiOuLpC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4i7JWg7ZSM66as7LyA7J207IWYIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4o7ZSE66Gc7IS47IqkIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPinsnbQo6rCAKSDsnpDssrQg7Iuc7ZaJIFN0cmljdE1vZGUg7KCV7LGF7J2EIOychOuwmO2WiOyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiLtlITroZzshLjsiqQoPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+KeqwgCDsnpDssrQg7Iuc7ZaJIFN0cmljdE1vZGUg7KCV7LGF7J2EIOychOuwmO2WiOyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IOyLpO2WiSDspJEiPC9zdHJpbmc+CkBAIC04MTIsMjggKzgwMiwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybXNfc2hvd19hbGwiIG1zZ2lkPSIyNjcxNzkxMTYzOTMzMDkxMTgwIj48Yj4i66qo65GQIO2RnOyLnCI8L2I+PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9hY3Rpdml0eV90aXRsZSIgbXNnaWQ9IjIzOTkyODk5OTk2MDg5MDA0NDMiPiJVU0Ig64yA7Jqp65+JIOyggOyepeyGjCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3RpdGxlIiBtc2dpZD0iNTkwMTQ1OTA0MTM5ODc1MTQ5NSI+IlVTQiDsl7DqsrDrkKgiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0Nzk2NzU5NjQ2MTY3MjQ3MTc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjgyMzE0NjI3NTAwMTAwNjY4OTYiPiJVU0Lrpbwg7Ya17ZW0IO2ctOuMgOyghO2ZlOulvCDsu7Ttk6jthLDsl5Ag7Jew6rKw7ZaI7Iq164uI64ukLiDsu7Ttk6jthLDsmYAgQW5kcm9pZOydmCBTRCDsubTrk5wg6rCE7JeQIO2MjOydvOydhCDrs7XsgqztlZjroKTrqbQg7JWE656Y7J2YIOuyhO2KvOydhCDshKDtg53tlZjshLjsmpQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJVU0Lrpbwg7Ya17ZW0IO2ctOuMgOyghO2ZlOulvCDsu7Ttk6jthLDsl5Ag7Jew6rKw7ZaI7Iq164uI64ukLiDsu7Ttk6jthLDsmYAgQW5kcm9pZOydmCBTRCDsubTrk5wg6rCE7JeQIO2MjOydvOydhCDrs7XsgqztlZjroKTrqbQg7JWE656Y7J2YIOuyhO2KvOydhCDshKDtg53tlZjshLjsmpQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJVU0Lrpbwg7Ya17ZW0IO2ctOuMgOyghO2ZlOulvCDsu7Ttk6jthLDsl5Ag7Jew6rKw7ZaI7Iq164uI64ukLiDsu7Ttk6jthLDsmYAgQW5kcm9pZOydmCBTRCDsubTrk5wg6rCE7JeQIO2MjOydvOydhCDrs7XsgqztlZjroKTrqbQg7JWE656Y7J2YIOuyhO2KvOydhCDshKDtg53tlZjshLjsmpQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYnV0dG9uX21vdW50IiBtc2dpZD0iMTA1MjI1OTkzMDM2OTUwODIzNSI+IlVTQiDsoIDsnqXshowg7IKs7JqpIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjUzNDc4NDc1MTYwMzM0NTM2MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0ODE4MzQ3NzU2NDAyNzQwMjYxIj4iVVNCIOyggOyepeyGjOuhnCBTRCDsubTrk5zrpbwg7IKs7Jqp7ZWY64qUIOuPmeyViCDrrLjsoJzqsIAg67Cc7IOd7ZaI7Iq164uI64ukLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iVVNCIOyggOyepeyGjOuhnCBTRCDsubTrk5zrpbwg7IKs7Jqp7ZWY64qUIOuPmeyViCDrrLjsoJzqsIAg67Cc7IOd7ZaI7Iq164uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iVVNCIOyggOyepeyGjOuhnCBTRCDsubTrk5zrpbwg7IKs7Jqp7ZWY64qUIOuPmeyViCDrrLjsoJzqsIAg67Cc7IOd7ZaI7Iq164uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjgxNzU4OTI1NTQ3NTcyMTY1MjUiPiJVU0Ig7Jew6rKw65CoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MzgwMDgyNDA0Mjg4MjE5MzQxIj4i7Lu07ZOo7YSw7JeQIO2MjOydvOydhCDrs7XsgqztlZjqsbDrgpgg7Lu07ZOo7YSw7J2YIO2MjOydvOydhCDrs7XsgqztlZjroKTrqbQg7ISg7YOd7ZWp64uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMjMzNjA1ODM5NjY2MzUxNjAxNyI+IlVTQiDsoIDsnqXshowg64GE6riwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI1OTE4MTM0OTAyNjk4NDE1MzkiPiJVU0Ig7KCA7J6l7IaMIOuBhOq4sOulvCDshKDtg53tlZjshLjsmpQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF90aXRsZSIgbXNnaWQ9IjY2MDEyOTg1MTcwODc3NTg1MyI+IlVTQiDsoIDsnqXshowg7IKs7JqpIOykkSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MTM3MTMzOTY0MjY2MDQxMDQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NzQ1MzQ1MjYwNzgwMjY3MTg1Ij4iVVNCIOyggOyepeyGjOulvCDsgqzsmqntlZjsp4Ag7JWK64+E66GdIOyEpOygle2VmOq4sCDsoITsl5Ag7Lu07ZOo7YSw7JeQ7IScIEFuZHJvaWTsnZggU0Qg7Lm065Oc66W8IOuniOyatO2KuCDtlbTsoJztlojripTsp4Ao6rq864OI64qU7KeAKSDtmZXsnbjtlZjsi5zquLAg67CU656N64uI64ukLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJVU0Ig7KCA7J6l7IaM66W8IOyCrOyaqe2VmOyngCDslYrrj4TroZ0g7ISk7KCV7ZWY6riwIOyghOyXkCDsu7Ttk6jthLDsl5DshJwgQW5kcm9pZOydmCBTRCDsubTrk5zrpbwg66eI7Jq07Yq4IO2VtOygnO2WiOuKlOyngCjqurzrg4jripTsp4ApIO2ZleyduO2VmOyLnOq4sCDrsJTrno3ri4jri6QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IlVTQiDsoIDsnqXshozrpbwg7IKs7Jqp7ZWY7KeAIOyViuuPhOuhnSDshKTsoJXtlZjquLAg7KCE7JeQIOy7tO2TqO2EsOyXkOyEnCBBbmRyb2lk7J2YIFNEIOy5tOuTnOulvCDrp4jsmrTtirgg7ZW07KCc7ZaI64qU7KeAKOq6vOuDiOuKlOyngCkg7ZmV7J247ZWY7Iuc6riwIOuwlOuejeuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjcwNjAyMTgwMzQ5MDA2OTYwMjkiPiJVU0Ig7KCA7J6l7IaMIOyCrOyaqSDslYjtlagiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIxNDM4ODE5MTQ4NDA0MTIxMDgiPiJVU0Ig7KCA7J6l7IaM66W8IOyCrOyaqe2VmOyngCDslYrrj4TroZ0g7ISk7KCV7ZWY64qUIOuPmeyViCDrrLjsoJzqsIAg67Cc7IOd7ZaI7Iq164uI64ukLiBVU0Ig7Zi47Iqk7Yq47JmAIOyXsOqysOydhCDtlbTsoJztlojripTsp4Ag7ZmV7J247ZWcIOuLpOydjCDri6Tsi5wg7Iuc64+E7ZWY7IS47JqULiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190aXRsZSIgbXNnaWQ9Ijk2MzAzOTAzMzQ3MDQ3ODY5NyI+IlVTQiDsoIDsnqXshowg7IKs7JqpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RleHQiIG1zZ2lkPSIzMjAyODM4MjM0NzgwNTA1ODg2Ij4iVVNCIOyggOyepeyGjOulvCDsgqzsmqkg7ISk7KCV7ZWY66m0IOyCrOyaqSDspJHsnbgg7J2867aAIOyVoO2UjOumrOy8gOydtOyFmOydtCDspJHsp4DrkJjqs6AgVVNCIOyggOyepeyGjOulvCDsgqzsmqkg7KSR7KeA7ZWgIOuVjOq5jOyngCDsgqzsmqntlaAg7IiYIOyXhuqyjCDrkKnri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2Vycm9yX3RpdGxlIiBtc2dpZD0iODA0ODk5OTk3MzgzNzMzOTE3NCI+IlVTQiDsnpHsl4Ug7Iuk7YyoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX29rIiBtc2dpZD0iNzM3Njk1MzE2NzAzOTg2NTcwMSI+Iu2ZleyduCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg2NjMyNDc5Mjk1NTEwOTU4NTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NTc3OTA4MDA2OTQ5NzQyMjE3Ij4iU0Qg7Lm065OcIO2PrOuntyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJTRCDsubTrk5wg7Y+s66e3Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYyMTM2OTk2MjQzMzUyMzYxOSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzQ3MDgxNTE0MDA2ODUwMjgyNCI+IlNEIOy5tOuTnOulvCDtj6zrp7ftlZjsi5zqsqDsirXri4jquYw/IO2PrOunt+2VmOuptCDsubTrk5zsnZgg66qo65OgIOuNsOydtO2EsOulvCDsnoPqsowg65Cp64uI64ukLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IlNEIOy5tOuTnOulvCDtj6zrp7ftlZjsi5zqsqDsirXri4jquYw/IO2PrOunt+2VmOuptCDsubTrk5zsnZgg66qo65OgIOuNsOydtO2EsOulvCDsnoPqsowg65Cp64uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJTRCDsubTrk5wg7Y+s66e3Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4iU0Qg7Lm065Oc66W8IO2PrOunt+2VmOyLnOqyoOyKteuLiOq5jD8g7Y+s66e37ZWY66m0IOy5tOuTnOydmCDrqqjrk6Ag642w7J207YSw66W8IOyeg+qyjCDrkKnri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X2J1dHRvbl9mb3JtYXQiIG1zZ2lkPSI0MTMxMDY0NTYwMTI3NDc4Njk1Ij4i7Y+s66e3Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5MDQ0Nzc4OTQ5MTg5OTE4Ij4iVVNCIOuUlOuyhOq5hSDsl7DqsrDrkKgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODQ3MDI5NjgxODI3MDExMDM5NiI+IlVTQiDrlJTrsoTquYXsnYQg7IKs7Jqp7ZWY7KeAIOyViuycvOugpOuptCDshKDtg53tlanri4jri6QuIjwvc3RyaW5nPgpAQCAtODQxLDI5ICs4MjYsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX2FscGhhYmV0IiBtc2dpZD0iNTQzMzI3NTQ4NTQ5OTAzOTE5OSI+IiBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX251bWVyaWNfYWxwaGFiZXQiIG1zZ2lkPSI0MDMwMTcwNTI0NTk1MTIzNjEwIj4iIDAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhbmRpZGF0ZXNfc3R5bGUiIG1zZ2lkPSI0MzMzOTEzMDg5NjM3MDYyMjU3Ij48dT4i6rCA64ql7ZWcIOybkOyduCI8L3U+PC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NDU3NjAzNDE4OTcwOTk0MDUwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQyMzk1MTY2NzUwMjg0Mzg5OTciPiJTRCDsubTrk5wg7KSA67mEIOykkSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4iU0Qg7Lm065OcIOykgOu5hCDspJEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IlNEIOy5tOuTnCDspIDruYQg7KSRIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODI4NzMxOTg4MjkyNjczNzA1MyI+IuyYpOulmCDtmZXsnbgg7KSR7J6F64uI64ukLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc4MDQ3NzgzODI0MTIxMjk5NyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM5MzczNDU1Nzc5ODM3MzA4NzMiPiLruYggU0Qg7Lm065OcIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4i67mIIFNEIOy5tOuTnCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDEzMTIyNjY4MjAwOTI5NTgwMTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE2MDY2NjA3NTYxMjQ2Mjk3MDgiPiJTRCDsubTrk5zqsIAg67mE7Ja0IOyeiOqxsOuCmCDsp4Dsm5DrkJjsp4Ag7JWK64qUIO2MjOydvOyLnOyKpO2FnOydhCDsgqzsmqkg7KSR7J6F64uI64ukLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlNEIOy5tOuTnOqwgCDruYTslrQg7J6I6rGw64KYIOyngOybkOuQmOyngCDslYrripQg7YyM7J28IOyLnOyKpO2FnOydhCDsgqzsmqntlanri4jri6QuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjQxMDcyMzkwNjAxOTEwMDE4OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNzI0NjE5OTAyMDc2NTI4ODg5Ij4i7IaQ7IOB65CcIFNEIOy5tOuTnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4i7IaQ7IOB65CcIFNEIOy5tOuTnCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI2Nzk0MTI4ODQyOTAwNjE3NzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NDYwMzExODM1MTMwNjcxMTk0Ij4iU0Qg7Lm065Oc6rCAIOyGkOyDgeuQmOyXiOyKteuLiOuLpC4g7Lm065Oc66W8IOuLpOyLnCDtj6zrp7ftlZjsi5zquLAg67CU656N64uI64ukLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY5MDI1MzE3NzU5NDgyMzg5ODkiPiJTRCDsubTrk5zqsIAg7IaQ7IOB65CY7JeI7Iq164uI64ukLiDsubTrk5zrpbwg64uk7IucIO2PrOunt+2VtOyVvCDtlaAg7IiYIOyeiOyKteuLiOuLpC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2ODcyMTUyODgyNjA0NDA3ODM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjU4MjE3NTAxNjA2MDQzMjAzNCI+IlNEIOy5tOuTnOqwgCDsmIjsg4HsuZgg7JWK6rKMIOygnOqxsOuQmOyXiOyKteuLiOuLpC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iU0Qg7Lm065Oc6rCAIOyYiOyDgey5mCDslYrqsowg7KCc6rGw65CY7JeI7Iq164uI64ukLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDcyNjAxODMyOTM3NDc0NDgyNDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjIwMDUzOTY0NjQ0OTQ2NDg5MzciPiLrjbDsnbTthLAg7IaQ7Iuk7J2EIO2UvO2VmOugpOuptCBTRCDsubTrk5zrpbwg7KCc6rGw7ZWY6riwIOyghOyXkCDrp4jsmrTtirgg7ZW07KCc7ZWp64uI64ukLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+IuuNsOydtO2EsCDshpDsi6TsnYQg7ZS87ZWY66Ck66m0IFNEIOy5tOuTnOulvCDsoJzqsbDtlZjquLAg7KCE7JeQIOuniOyatO2KuCDtlbTsoJztlanri4jri6QuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjcyOTgwMTEzMDc5MDYxNjIwMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzY1MjU4ODEwMTg2Nzk1MTUiPiJTRCDsubTrk5wg7KCc6rGwIOqwgOuKpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+IlNEIOy5tOuTnCDsoJzqsbAg6rCA64qlIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzYxMzk2MDY4Njc0NzU5Mjc3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI3NTAzNzY5MTA2Mjg1MTg4NzAzIj4i7J207KCcIFNEIOy5tOuTnOulvCDslYjsoITtlZjqsowg7KCc6rGw7ZWgIOyImCDsnojsirXri4jri6QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IuyViOyghO2VmOqyjCBTRCDsubTrk5zrpbwg7KCc6rGw7ZWgIOyImCDsnojsirXri4jri6QuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODkwMjUxODAzMDQwNDM4MTMxOCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE4NzQ4ODk3NjQzNjcwODU1NjIiPiJTRCDsubTrk5wg7JeG7J2MIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IlNEIOy5tOuTnCDsl4bsnYwiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MjA1MTE3MjI3MzQyODIyMjc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNzMwODkwNDQxMzMxMzQ0Nzc2Ij4iU0TqsIAg7KCc6rGw65CY7JeI7Iq164uI64ukLiDquLDquLDsnZgg7KCA7J6lIOyaqeufieydhCDripjrpqzroKTrqbQg7IOIIFNEIOy5tOuTnOulvCDsgr3snoXtlZjshLjsmpQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iU0Qg7Lm065Oc6rCAIOyXhuyKteuLiOuLpC4gIFNEIOy5tOuTnOulvCDrhKPsnLzshLjsmpQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4i67mIIFNEIOy5tOuTnCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlNEIOy5tOuTnOqwgCDruYTslrQg7J6I6rGw64KYIOyngOybkOuQmOyngCDslYrripQg7YyM7J28IOyLnOyKpO2FnOydhCDsgqzsmqntlanri4jri6QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiLshpDsg4HrkJwgU0Qg7Lm065OcIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IlNEIOy5tOuTnOqwgCDshpDsg4HrkJjsl4jsirXri4jri6QuIOy5tOuTnOulvCDri6Tsi5wg7Y+s66e37ZW07JW8IO2VoCDsiJgg7J6I7Iq164uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJTRCDsubTrk5zqsIAg7JiI7IOB7LmYIOyViuqyjCDsoJzqsbDrkJjsl4jsirXri4jri6QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4i642w7J207YSwIOyGkOyLpOydhCDtlLztlZjroKTrqbQgU0Qg7Lm065Oc66W8IOygnOqxsO2VmOq4sCDsoITsl5Ag66eI7Jq07Yq4IO2VtOygnO2VqeuLiOuLpC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJTRCDsubTrk5wg7KCc6rGwIOqwgOuKpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiLslYjsoITtlZjqsowgU0Qg7Lm065Oc66W8IOygnOqxsO2VoCDsiJgg7J6I7Iq164uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiJTRCDsubTrk5wg7JeG7J2MIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iU0Qg7Lm065Oc6rCAIOyXhuyKteuLiOuLpC4gIFNEIOy5tOuTnOulvCDrhKPsnLzshLjsmpQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfbGlzdF9lbXB0eSIgbXNnaWQ9IjQxNjg4MjA2MDk0MDMzODU3ODkiPiLsnbzsuZjtlZjripQg7Zmc64+Z7J20IOyXhuyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4Nzg3MzUyMDc0MzI2NzQ4ODkyIj4i6rWs7ISxIOyalOyGjCDsgqzsmqkg7Ya16rOEIOyXheuNsOydtO2KuCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4OTE1NTM2OTU3MTY3NTI4MzUiPiLsiJjsp5HrkJwg6rWs7ISx7JqU7IaMIOyCrOyaqSDthrXqs4Trpbwg7IiY7KCV7ZWgIOyImCDsnojripQg6raM7ZWc7J2EIOu2gOyXrO2VqeuLiOuLpC4g7J2867CYIOyVoO2UjOumrOy8gOydtOyFmOydgCDsnbQg6raM7ZWc7J2EIOyCrOyaqe2VmOyngCDslYrsirXri4jri6QuIjwvc3RyaW5nPgpAQCAtODk4LDE1ICs4NzIsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiLsgqzsoIQg6rO17JygIO2CpCDquLDrsJggTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4i7J247Kad7IScIOq4sOuwmCBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+Iu2MjOydvCDshKDtg50iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiLtjIzsnbzsnYQg7ISg7YOd7ZWY7KeAIOyViuyVmOyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiLsnqzshKTsoJUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4i7KCc7LacIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiLsppDqsqjssL7quLAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiLsmrTsoITrqqjrk5wg7IKs7JqpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IuyatOyghOuqqOuTnOulvCDsooXro4ztlZjroKTrqbQg7ISg7YOd7ZWY7IS47JqULiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiLthYzrjZTrp4Eg65iQ64qUIO2Vq+yKpO2MnyDsgqzsmqkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiLqtazshLHtlZjroKTrqbQg7YSw7LmY7ZWY7IS47JqULiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IuuSpOuhnCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IuuLpOydjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+IuqxtOuEiOubsOq4sCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IuuGkuydgCDrqqjrsJTsnbwg642w7J207YSwIOyCrOyaqeufiSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4i66qo67CU7J28IOuNsOydtO2EsCDsgqzsmqnsl5Ag64yA7ZW0IOyekOyEuO2eiCDslYzslYTrs7TroKTrqbQg7YSw7LmY7ZWY7IS47JqULiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4i66qo67CU7J28IOuNsOydtO2EsCDsoJztlZzsnYQg7LSI6rO87ZaI7Iq164uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiLrqqjrsJTsnbwg642w7J207YSwIOyCrOyaqeyXkCDrjIDtlbQg7J6Q7IS47Z6IIOyVjOyVhOuztOugpOuptCDthLDsuZjtlZjshLjsmpQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fbWF0Y2hlcyIgbXNnaWQ9IjgxMjk0MjE5MDg5MTU4NDA3MzciPiLqsoDsg4nqsrDqs7wg7JeG7J2MIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZmluZF9vbl9wYWdlIiBtc2dpZD0iMTk0Njc5OTIzMzgyMjgyMDM4NCI+Iu2OmOydtOyngOyXkOyEnCDssL7quLAiPC9zdHJpbmc+CisgIDxwbHVyYWxzIG5hbWU9Im1hdGNoZXNfZm91bmQiPgorICAgIDxpdGVtIHF1YW50aXR5PSJvbmUiIG1zZ2lkPSI4MTY3MTQ3MDgxMTM2NTc5NDM5Ij4i6rKA7IOJ6rKw6rO8IDHqsJwiPC9pdGVtPgorICAgIDxpdGVtIHF1YW50aXR5PSJvdGhlciIgbXNnaWQ9IjQ2NDE4NzI3OTcwNjc2MDkxNzciPiI8eGxpZmY6ZyBpZD0iSU5ERVgiPiVkPC94bGlmZjpnPi88eGxpZmY6ZyBpZD0iVE9UQUwiPiVkPC94bGlmZjpnPiI8L2l0ZW0+CisgIDwvcGx1cmFscz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1tY2M0NTAta28vY29uZmlnLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbWNjNDUwLWtvL2NvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM1Yjk2NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbWNjNDUwLWtvL2NvbmZpZy54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImdzbV9hbHBoYWJldF9kZWZhdWx0X2NoYXJzZXQiPmV1Yy1rcjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbAppbmRleCA3MGVlODc3Li44MzFlMTgzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKQEAgLTE2OSw4ICsxNjksNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSIzNDQ2MTY0NTg0NzEwNTk2NTEzIj4iVXR2aWtsaW5nc3Zlcmt0w7h5Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iOTA1NjQzMTE5Mzg5MzgwOTgxNCI+IkZ1bmtzam9uYWxpdGV0IGt1biB1dHZpa2xlcmUgdHJlbmdlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfc3RvcmFnZSIgbXNnaWQ9IjE5NzExMTg3NzA1NDYzMzY5NjYiPiJMYWdyaW5nIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTIwMzMwMjIxNDkxNTM1NTc3NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjU0NTU4MDQzNTMyMjA1ODEzMTIiPiJUaWxnYW5nIHRpbCBtaW5uZWtvcnRldC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4iVGlsZ2FuZyB0aWwgbWlubmVrb3J0ZXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IlRpbGdhbmcgdGlsIG1pbm5la29ydGV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyIiBtc2dpZD0iNzQxNzE5MjYyOTYwMTg5MDc5MSI+ImRlYWt0aXZlcmUgZWxsZXIgZW5kcmUgc3RhdHVzZmVsdGV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc3RhdHVzQmFyIiBtc2dpZD0iMTM2NTQ3MzU5NTMzMTk4OTczMiI+IkxhciBhcHBsaWthc2pvbmVuIGRlYWt0aXZlcmUgc3RhdHVzZmVsdGV0LCBzYW10IGxlZ2dlIHRpbCBvZyBmamVybmUgc3lzdGVtaWtvbmVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyU2VydmljZSIgbXNnaWQ9IjcyNDcyODE5MTEzODc5MzE0ODUiPiJzdGF0dXNyYWQiPC9zdHJpbmc+CkBAIC0yNjcsOCArMjY2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jbGVhckFwcENhY2hlIiBtc2dpZD0iNzc0MDQ2NTY5NDE5MzY3MTQwMiI+IkxhciBhcHBsaWthc2pvbmVuIGZyaWdqw7hyZSBsYWdyaW5nc3BsYXNzIHZlZCDDpSBzbGV0dGUgZmlsZXIgaSBhcHBsaWthc2pvbmVycyBodXJ0aWdidWZmZXJrYXRhbG9nLiBUaWxnYW5nZW4gZXIgdmFubGlndmlzIHN0ZXJrdCBiZWdyZW5zZXQsIHRpbCBzeXN0ZW1wcm9zZXNzZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9tb3ZlUGFja2FnZSIgbXNnaWQ9IjcyODQ1NDk3OTk0NjUwMzkyNiI+IkZseXR0ZXIgcHJvZ3JhbXJlc3N1cnNlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21vdmVQYWNrYWdlIiBtc2dpZD0iNjMyMzA0OTI5MTkyMzkyNTI3NyI+IkdpciBldCBwcm9ncmFtIHRpbGxhdGVsc2UgdGlsIMOlIGZseXR0ZSBwcm9ncmFtcmVzc3Vyc2VyIGZyYSBpbnRlcm5lIHRpbCBla3N0ZXJuZSBtZWRpZXIgb2cgb212ZW5kdC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0ODExOTIxNzAzODgyNTMyMDcwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRMb2dzIiBtc2dpZD0iNjYxNTc3ODU0MzE5ODk2NzYxNCI+Imxlc2Ugc3lzdGVtZXRzIGxvZ2dmaWxlciI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIyNTc5Mzc5NTU1ODA0NzU5MDIgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+IkxhciBhcHBsaWthc2pvbmVuIGxlc2UgZnJhIGRpdmVyc2UgbG9nZ2ZpbGVyIHDDpSBzeXN0ZW1ldC4gRGlzc2UgaW5uZWhvbGRlciBnZW5lcmVsbCBpbmZvcm1hc2pvbiBvbSBodmEgc29tIGdqw7hyZXMgbWVkIHRlbGVmb25lbiwgbWVuIHNrYWwgaWtrZSBpbm5laG9sZGUgcGVyc29ubGlnIGVsbGVyIHByaXZhdCBpbmZvcm1hc2pvbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkTG9ncyAoNjYxNTc3ODU0MzE5ODk2NzYxNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkTG9ncyAoODg5NjQ0OTQzNzQ2NDg2Nzc2NikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlhZ25vc3RpYyIgbXNnaWQ9IjgwNzY3NDM5NTM5MDgwMDAzNDIiPiJsZXNlL3Nrcml2ZSByZXNzdXJzZXIgZWlkIGF2IGRpYWciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaWFnbm9zdGljIiBtc2dpZD0iMzEyMTIzODM3Mzk1MTYzNzA0OSI+IkxhciBhcHBsaWthc2pvbmVuIGxlc2Ugb2cgc2tyaXZlIGVuaHZlciByZXNzdXJzIGVpZCBhdiBncnVwcGVuIGRpYWc7IGZvciBla3NlbXBlbCwgZmlsZXIgaSAvZGV2LiBEZXR0ZSBrYW4gcG90ZW5zaWVsdCBww6V2aXJrZSBzeXN0ZW1ldHMgc2lra2VyaGV0IG9nIHN0YWJpbGl0ZXQuIERldHRlIGLDuHIgS1VOIGJydWtlcyBmb3IgbWFza2ludmFyZXNwZXNpZmlra2UgZGlhZ25vc2V2ZXJrdMO4eSBsYWdldCBhdiBvcGVyYXTDuHJlbiBlbGxlciBwcm9kdXNlbnRlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NoYW5nZUNvbXBvbmVudFN0YXRlIiBtc2dpZD0iNzk0MjUxOTg4MzQzMjk0MDYiPiJha3RpdmVyZSBlbGxlciBkZWFrdGlnZXJlIGFwcGxpa2Fzam9uc2tvbXBvbmVudGVyIjwvc3RyaW5nPgpAQCAtNDAzLDIyICs0MDQsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoQWRtaW4iIG1zZ2lkPSI3MjU2Mjg5Nzc0NjY3MDU0NTU1Ij4iTGFyIGFwcGxpa2Fzam9uZW4ga29uZmlndXJlcmUgZGVuIGxva2FsZSBCbHVldG9vdGgtdGVsZWZvbmVuLCBvZyDDpSBvcHBkYWdlIG9nIHBhcmUgbWVkIGFuZHJlIGVuaGV0ZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ibHVldG9vdGgiIG1zZ2lkPSI4MzYxMDM4NzA3ODU3MDE4NzMyIj4ib3BwcmV0dGUgQmx1ZXRvb3RoLXRpbGtvYmxpbmdlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aCIgbXNnaWQ9Ijc2MjUxNTM4MDY3OTM5Mjk0NSI+IkxhciBhcHBsaWthc2pvbmVuIHNlIGtvbmZpZ3VyYXNqb25lbiB0aWwgZGVuIGxva2FsZSBCbHVldG9vdGgtdGVsZWZvbmVuLCBvZyDDpSBvcHByZXR0ZSBvZyBnb2R0YSB0aWxrb2JsaW5nZXIgbWVkIHBhcmVkZSBlbmhldGVyLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0FkbWluICgyMjUxMzAyMjMzMDEyMjUwMDU2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0FkbWluICgxOTM1ODQyNjExNDY0ODk1Nzg1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjUmF3ICg0NDIzNDcxNzExMTE0MzI1NzA4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY1JhdyAoNTUzMzAyMjczNjU1OTM4NTY2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY05vdGlmeSAoNDc4NDcwMzYwMDgyNzkyMzU4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY05vdGlmeSAoMjk5MDA1MzUxNzk2MjA3MDYxNykgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0xsY3AgKDQ5NzIwNTE0NjEwMDcwMzA0MjYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTGxjcCAoOTE1OTIxMjc3ODYwMDQ2NDApIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjQ5Nzc0MDYxNjQzMTE1MzUwOTIiPiJzbMOlIGF2IHRhc3RhdHVybMOlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjMxODk3NjM0NzkzMjYzMDIwMTciPiJMYXIgYXBwbGlrYXNqb25lbiBzbMOlIGF2IHRhc3RhdHVybMOlc2VuIG9nIGVuaHZlciB0aWxrbnl0dGV0IHBhc3NvcmRzaWtrZXJoZXQuIEV0IGxlZ2l0aW10IGVrc2VtcGVsIHDDpSBkZXR0ZSBlciBhdCB0ZWxlZm9uZW4gc2zDpXIgYXYgdGFzdGF0dXJsw6VzZW4gbsOlciBkZW4gbW90dGFyIGV0IGlubmtvbW1lbmRlIGFucm9wLCBvZyBzw6Ugc2zDpXIgZGVuIHDDpSBpZ2plbiBuw6VyIHNhbXRhbGVuIGVyIG92ZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkU3luY1NldHRpbmdzIiBtc2dpZD0iNjIwMTgxMDAwODIzMDUwMzA1MiI+Imxlc2Ugc3lua3JvbmlzZXJpbmdzaW5uc3RpbGxpbmdlciI8L3N0cmluZz4KQEAgLTQzNSwyMiArNDIwLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9IjEwODI5NzI2MDM1NzYzNjA2OTAiPiJMYXIgYXBwbGlrYXNqb25lbiBsZXNlIHByaXZhdGUgb3JkLCBuYXZuIG9nIHV0dHJ5a2sgc29tIGJydWtlcmVuIGhhciBsYWdyZXQgaSBkZW4gYnJ1a2VyZGVmaW5lcnRlIG9yZGxpc3Rlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjY3MDMxMDk1MTE4MzYzNDMzNDEiPiJza3JpdmUgdGlsIGJydWtlcmRlZmluZXJ0IG9yZGxpc3RlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI0MTI1NjIwNjUyNDA4Mjg4MCI+IkxhciBhcHBsaWthc2pvbmVuIHNrcml2ZSBueWUgb3JkIHRpbCBkZW4gYnJ1a2VyZGVmaW5lcnRlIG9yZGxpc3Rlbi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4MDc5NDAzNzU5MDAxNzc3MjkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijk5MzcwNzQzNjk0MTAxNjkxMyI+InJlZGlnZXJlL3NsZXR0ZSBpbm5ob2xkIHDDpSBtaW5uZWtvcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+InJlZGlnZXJlL3NsZXR0ZSBpbm5ob2xkIHDDpSBtaW5uZWtvcnQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NjQzOTYzMjA0OTc2NDcxODc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MTMxODcxNTQxMTI3MjExNTI2Ij4iTGFyIGFwcGxpa2Fzam9uZW4gc2tyaXZlIHRpbCBtaW5uZWtvcnRldC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiJMYXIgYXBwbGlrYXNqb25lbiBza3JpdmUgdGlsIG1pbm5la29ydGV0LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4icmVkaWdlcmUvc2xldHRlIGlubmhvbGQgcMOlIG1pbm5la29ydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IkxhciBhcHBsaWthc2pvbmVuIHNrcml2ZSB0aWwgbWlubmVrb3J0ZXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iNTY1NjQ4NzI2NDgxOTY2OTgyNCI+InRpbGdhbmcgdGlsIGJ1ZnJlZGUgZmlsZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iMTYyNDczNDUyODQzNTY1OTkwNiI+IlRpbGxhdGVyIGV0IHByb2dyYW0gw6UgbGVzZSBvZyBza3JpdmUgdGlsIGJ1ZnJlZGUgZmlsZXIuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDMwNzg2MTQ5NjMwMjg1MDIwMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0NDk3NDIwNzI4ODU3NTg1NzkxIj4iQmVncmVucyBwYXNzb3JkIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTcxOTg3NzI0NTY5MjMxODI5OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iOTA4MzQwMDA4MDg2MTcyODA1NiI+IkJlZ3JlbnNlIHR5cGVuZSBwYXNzb3JkIGR1IGthbiBicnVrZS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3Mzc0NzgwNzEyNjY0Mjg1MzIxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjkxNDEzMDY0Njk0MjE5OTUwMyI+Ik92ZXJ2w6VrIHDDpWxvZ2dpbmdzZm9yc8O4ayI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE5NjEyNTExNzk2MjQ4NDM0ODMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjcyMjc1NzgyNjAxNjUxNzI2NzMiPiJPdmVydsOlayBtaXNseWtrZWRlIHDDpWxvZ2dpbmdzZm9yc8O4ayBlbGxlciBmb3Jzw7hrIHDDpSBoYW5kbGluZ2VyIHDDpSBlbmhldGVuLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkwODQ3NzIwOTA3OTc0ODU0MjAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iMjYyMDA3NzE5MTI0MjY4ODk1NSI+IlRpbGJha2VzdGlsbCBwYXNzb3JkZXQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzMzMyMTY3NjAwMzMxNzk5OTkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI1MzkxMjQwNjE2OTgxMjk3MzYxIj4iRnJlbXR2aW5nIHRpbGJha2VzdGlsbGluZyBhdiBwYXNzb3JkLCBzbGlrIGF0IGFkbWluaXN0cmF0b3JlbiBtw6UgZ2kgZGVnIGV0IG55dHQgcGFzc29yZCBuw6VyIGR1IHNrYWwgbG9nZ2UgZGVnIHDDpS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NzYwNDY2MDI1MjQ3NjM0NDg4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iMjI3NDA4NTM4NDcwNDI0ODQzMSI+Ik9ibGlnYXRvcmlzayBsw6VzaW5nIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjgxOTg2ODY2NDk0NjA4OTc0MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSI1Njk2OTY0MTI2MjI2MDI4NDQyIj4iS29udHJvbGxlcmVyIG7DpXIgZW5oZXRlbiBsw6VzZXMuIER1IG3DpSBza3JpdmUgaW5uIHBhc3NvcmRldCBww6Ugbnl0dCBmb3Igw6UgbMOlc2UgZGVuIG9wcC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQzMDc4NjE0OTYzMDI4NTAyMDEiPiJCZWdyZW5zIHBhc3NvcmQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSIxNzE5ODc3MjQ1NjkyMzE4Mjk5Ij4iQmVncmVuc2UgdHlwZW5lIHBhc3NvcmQgZHUga2FuIGJydWtlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iNzM3NDc4MDcxMjY2NDI4NTMyMSI+Ik92ZXJ2w6VrIHDDpWxvZ2dpbmdzZm9yc8O4ayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjE5NjEyNTExNzk2MjQ4NDM0ODMiPiJPdmVydsOlayBtaXNseWtrZWRlIHDDpWxvZ2dpbmdzZm9yc8O4ayBlbGxlciBmb3Jzw7hrIHDDpSBoYW5kbGluZ2VyIHDDpSBlbmhldGVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iOTA4NDc3MjA5MDc5NzQ4NTQyMCI+IlRpbGJha2VzdGlsbCBwYXNzb3JkZXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIzMzMyMTY3NjAwMzMxNzk5OTkxIj4iRnJlbXR2aW5nIHRpbGJha2VzdGlsbGluZyBhdiBwYXNzb3JkLCBzbGlrIGF0IGFkbWluaXN0cmF0b3JlbiBtw6UgZ2kgZGVnIGV0IG55dHQgcGFzc29yZCBuw6VyIGR1IHNrYWwgbG9nZ2UgZGVnIHDDpS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iNTc2MDQ2NjAyNTI0NzYzNDQ4OCI+Ik9ibGlnYXRvcmlzayBsw6VzaW5nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iS29udHJvbGxlcmVyIG7DpXIgZW5oZXRlbiBsw6VzZXMuIER1IG3DpSBza3JpdmUgaW5uIHBhc3NvcmRldCBww6Ugbnl0dCBmb3Igw6UgbMOlc2UgZGVuIG9wcC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iU2xldHQgYWxsZSBkYXRhIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjMxNDA2MDkzMzc5NjM5NjIwNSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9Ijc2Njk4OTUzMzM4MTQyMjI1ODYiPiJVdGbDuHJlciB0aWxiYWtlc3RpbGxpbmcgdGlsIGZhYnJpa2tzdGFuZGFyZC4gQWxsZSBkYXRhIHNsZXR0ZXMgdXRlbiB2YXJzZWwuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJVdGbDuHJlciB0aWxiYWtlc3RpbGxpbmcgdGlsIGZhYnJpa2tzdGFuZGFyZC4gQWxsZSBkYXRhIHNsZXR0ZXMgdXRlbiB2YXJzZWwuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkiIG1zZ2lkPSI2Mzg3NDk3NDY2NjYwMTU0OTMxIj4iQW5naXIgZGVuIGdsb2JhbGUgbWVsbG9tdGplbmVyZW4gcMOlIGVuaGV0ZW4gc29tIHNrYWwgYnJ1a2VzIG7DpXIgcmVnZWxlbiBlciBha3RpdmVydC4gS3VuIGRlbiBvcHByaW5uZWxpZ2UgYWRtaW5pc3RyYXRvcmVuIGF2IGVuaGV0ZW4ga2FuIGFuZ2kgZGVuIGdsb2JhbGUgbWVsbG9tdGplbmVyZW4uIjwvc3RyaW5nPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iSGplbW1lbnVtbWVyIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTW9iaWwiPC9pdGVtPgpAQCAtNTUyLDEwICs1MzgsOSBAQAogICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVPdGhlciAoNDQwODQzNjE2Mjk1MDExOTg0OSkgLS0+CiAgICAgPHNraXAgLz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJ2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJTa3JpdiBpbm4gUElOLWtvZGU6Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJTa3JpdiBpbm4gcGFzc29yZCBmb3Igw6UgbMOlc2Ugb3BwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJTa3JpdiBpbm4gcGVyc29ubGlnIGtvZGUgZm9yIMOlIGzDpXNlIG9wcCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkdhbCBQSU4ta29kZSEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iRm9yIMOlIGzDpXNlIG9wcCwgdHJ5a2sgcMOlIG1lbnlrbmFwcGVuIG9nIGRlcmV0dGVyIDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik7DuGRudW1tZXIiPC9zdHJpbmc+CkBAIC01NjgsNiArNTUzLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iVGlsYmFrZSB0aWwgc2FtdGFsZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IlJpa3RpZyEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iQmVrbGFnZXIsIHByw7h2IGlnamVuOiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iUHLDuHYgaWdqZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJMYWRlciAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iRnVsbHQgbGFkZXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU4Miw2ICs1NjgsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lNLWtvcnRldCBlciBsw6VzdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJMw6VzZXIgb3BwIFNJTS1rb3J04oCmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iWW91IGhhdmUgaW5jb3JyZWN0bHkgZHJhd24geW91ciB1bmxvY2sgcGF0dGVybiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB0aW1lcy4gIlxuXG4iUGxlYXNlIHRyeSBhZ2FpbiBpbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkR1IGhhciBvcHBnaXR0IGZlaWwgcGFzc29yZCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnYW5nZXIuICJcblxuIlByw7h2IGlnamVuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJEdSBoYXIgb3BwZ2l0dCBmZWlsIHBlcnNvbmxpZyBrb2RlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGdhbmdlci4gIlxuXG4iUHLDuHYgaWdqZW4gb20gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJZb3UgaGF2ZSBpbmNvcnJlY3RseSBkcmF3biB5b3VyIHVubG9jayBwYXR0ZXJuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHRpbWVzLiBBZnRlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBtb3JlIHVuc3VjY2Vzc2Z1bCBhdHRlbXB0cywgeW91IHdpbGwgYmUgYXNrZWQgdG8gdW5sb2NrIHlvdXIgcGhvbmUgdXNpbmcgeW91ciBHb29nbGUgc2lnbi1pbi4iXG5cbiIgUGxlYXNlIHRyeSBhZ2FpbiBpbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWNvbmRzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJQcsO4diBpZ2plbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJHbGVtdCBtw7huc3RlcmV0PyI8L3N0cmluZz4KQEAgLTYxMCwxNCArNTk4LDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJqc19kaWFsb2dfYmVmb3JlX3VubG9hZCIgbXNnaWQ9IjE5MDE2NzU0NDgxNzk2NTMwODkiPiJOYXZpZ2VyIGJvcnQgZnJhIGRlbm5lIHNpZGVuPyJcblxuIjx4bGlmZjpnIGlkPSJNRVNTQUdFIj4lczwveGxpZmY6Zz4iXG5cbiJWZWxnIE9LIGZvciDDpSBmb3J0c2V0dGUsIGVsbGVyIEF2YnJ5dCBmb3Igw6UgZm9yYmxpIHDDpSBkZW5uZSBzaWRlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX2xhYmVsIiBtc2dpZD0iNjg2MDI2MTc1ODY2NTgyNTA2OSI+IkJla3JlZnQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkb3VibGVfdGFwX3RvYXN0IiBtc2dpZD0iMTA2ODIxNjkzNzI0NDU2NzI0NyI+IkRvYmJlbHR0cnlrayBmb3Igw6Ugem9vbWUgaW5uIG9nIHV0LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvZmlsbF90aGlzX2Zvcm0gKDg5NDAxMTA4NjY3NzUwOTc0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iMTI4NDg0MzcyODIwMzQxMjEzNSI+Imxlc2UgbmV0dGxlc2VyZW5zIGxvZ2cgb2cgYm9rbWVya2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI0OTgxNDg5ODE1NDY3NjE3MTkxIj4iTGFyIGFwcGxpa2Fzam9uZW4gbGVzZSBhbGxlIGFkcmVzc2VyIG5ldHRsZXNlcmVuIGhhciBiZXPDuGt0LCBvZyBhbGxlIG5ldHRsZXNlcmVucyBib2ttZXJrZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5MDA5NDM0MTA5ODM2MjgwMzc0Ij4ic2tyaXZlIHRpbCBuZXR0bGVzZXJlbnMgbG9nZyBvZyBib2ttZXJrZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5NDU1NzE5OTAzNTcxMTQ5NTAiPiJMYXIgYXBwbGlrYXNqb25lbiBlbmRyZSBuZXR0bGVzZXJlbnMgbG9nZyBvZyBib2ttZXJrZXIgbGFncmV0IHDDpSB0ZWxlZm9uZW4uIE9uZHNpbm5lZGUgYXBwbGlrYXNqb25lciBrYW4gYnJ1a2UgZGV0dGUgdGlsIMOlIGZqZXJuZSBlbGxlciByZWRpZ2VyZSBuZXR0bGVzZXJlbnMgZGF0YS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRBbGFybSAoNTkyNDQwMTMyODgwMzYxNTE2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRBbGFybSAoNTk2Njk2NjU5ODE0OTg3NTA4MikgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDcxNTIxMjY1NTU5ODI3NTUzMiI+IkVuZHJlIG5ldHRsZXNlcmVucyB0aWxsYXRlbHNlciBmb3IgZ2VvZ3JhZmlzayBwb3Npc2pvbmVyaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDAxMTkwODI4Mjk4MDg2MTY3OSI+IlRpbGxhdGVyIHByb2dyYW1tZXQgw6UgZW5kcmUgbmV0dGxlc2VyZW5zIHRpbGxhdGVsc2VyIGZvciBnZW9ncmFmaXNrIHBvc2lzam9uZXJpbmcuIFNrYWRlbGlnZSBwcm9ncmFtbWVyIGthbiBicnVrZSBkZW5uZSBmdW5rc2pvbmVuIHRpbCDDpSBzZW5kZSBwb3Npc2pvbnNvcHBseXNuaW5nZXIgdGlsIHZpbGvDpXJsaWdlIG5ldHRzdGVkZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9tZXNzYWdlIiBtc2dpZD0iNzY3MzQ0Njg3MTM5MTk1NzkwIj4iw5huc2tlciBkdSBhdCBuZXR0bGVzZXJlbiBza2FsIGh1c2tlIGRldHRlIHBhc3NvcmRldD8iPC9zdHJpbmc+CkBAIC03MzAsMTQgKzcxNiwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+Ik1lcmsgYWx0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiJWZWxnIG9yZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJLbGlwcCB1dCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iS29waWVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iTGltIGlubiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iS29waWVyIFVSTCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHRNb2RlIiBtc2dpZD0iNjczODU1NjM0ODg2MTM0NzI0MCI+Ik1hcmtlciB0ZWtzdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRleHRTZWxlY3Rpb25DQUJUaXRsZSIgbXNnaWQ9IjUyMzY4NTAzOTQzNzA4MjAzNTciPiJNZXJrZXQgdGVrc3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJJbm5kYXRhbWV0b2RlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkxlZ2cgwqs8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+wrsgdGlsIG9yZGxpc3RlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IlJlZGlnZXIgdGVrc3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiJUZWtzdGhhbmRsaW5nZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IkxpdGUgcGxhc3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJEZXQgYmVneW5uZXIgw6UgYmxpIGxpdGUgbGFncmluZ3NwbGFzcyBww6UgdGVsZWZvbmVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzQ1LDYgKzczMSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJBdmJyeXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iTWVyayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iTGFzdGVyIGlubiAuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IlDDpSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IkF2Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJGdWxsZsO4ciBtZWQiPC9zdHJpbmc+CkBAIC03NjMsOSArNzUwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiJUdmluZyBhdnNsdXRuaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+IlJhcHBvcnTDqXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3YWl0IiBtc2dpZD0iNzE0NzExODIxNzIyNjMxNzczMiI+IlZlbnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJQcm9ncmFtbWV0IGVyIG9tZGlyaWdlcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4ga2rDuHJlciBuw6UuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGJsZSBvcHByaW5uZWxpZyBzdGFydGV0LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ190aXRsZSAoODMyMzc2MTYxNjA1MjEyMTkzNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19yZXBsYWNlICg2MjAyNDk4OTQ5OTcwMjgxNDEyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX29yaWdpbmFsICgxODgxMDIwMjMwMjE2Njg2ODMpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJQcm9ncmFtbWV0IDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb3Nlc3NlbiA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIGhhciBicnV0dCBkZSBzZWx2cMOlbGFndGUgU3RyaWN0TW9kZS1yZXRuaW5nc2xpbmplbmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iUHJvc2Vzc2VuPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGhhciBicnV0dCBkZSBzZWx2cMOlbGFndGUgU3RyaWN0TW9kZS1yZXRuaW5nc2xpbmplbmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiBrasO4cmVyIjwvc3RyaW5nPgpAQCAtODEyLDI4ICs4MDIsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1zX3Nob3dfYWxsIiBtc2dpZD0iMjY3MTc5MTE2MzkzMzA5MTE4MCI+PGI+IlZpcyBhbGxlIjwvYj48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2FjdGl2aXR5X3RpdGxlIiBtc2dpZD0iMjM5OTI4OTk5OTYwODkwMDQ0MyI+IlVTQi1tYXNzZWxhZ3JpbmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV90aXRsZSIgbXNnaWQ9IjU5MDE0NTkwNDEzOTg3NTE0OTUiPiJVU0Iga29ibGV0IHRpbCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ3OTY3NTk2NDYxNjcyNDcxNzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODIzMTQ2Mjc1MDAxMDA2Njg5NiI+IkR1IGhhciBrb2JsZXQgdGVsZWZvbmVuIHRpbCBkYXRhbWFza2luZW4gdmlhIFVTQi4gVmVsZyBrbmFwcGVuIG5lZGVuZm9yIGh2aXMgZHUgdmlsIGtvcGllcmUgZmlsZXIgbWVsbG9tIGRhdGFtYXNraW5lbiBvZyBtaW5uZWtvcnRldCBpIHRlbGVmb25lbi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+IkR1IGhhciBrb2JsZXQgdGVsZWZvbmVuIHRpbCBkYXRhbWFza2luZW4gdmlhIFVTQi4gVmVsZyBrbmFwcGVuIG5lZGVuZm9yIGh2aXMgZHUgdmlsIGtvcGllcmUgZmlsZXIgbWVsbG9tIGRhdGFtYXNraW5lbiBvZyBtaW5uZWtvcnRldCBpIHRlbGVmb25lbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+IkR1IGhhciBrb2JsZXQgdGVsZWZvbmVuIHRpbCBkYXRhbWFza2luZW4gdmlhIFVTQi4gVmVsZyBrbmFwcGVuIG5lZGVuZm9yIGh2aXMgZHUgdmlsIGtvcGllcmUgZmlsZXIgbWVsbG9tIGRhdGFtYXNraW5lbiBvZyBtaW5uZWtvcnRldCBpIHRlbGVmb25lbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9idXR0b25fbW91bnQiIG1zZ2lkPSIxMDUyMjU5OTMwMzY5NTA4MjM1Ij4iU2zDpSBww6UgVVNCLWxhZ3JpbmciPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNTM0Nzg0NzUxNjAzMzQ1MzYzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQ4MTgzNDc3NTY0MDI3NDAyNjEiPiJEZXQgb3Bwc3RvIGV0IHByb2JsZW0gbWVkIMOlIGJydWtlIG1pbm5la29ydGV0IGRpdHQgZm9yIFVTQi1sYWdyaW5nLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iRGV0IG9wcHN0byBldCBwcm9ibGVtIG1lZCDDpSBicnVrZSBtaW5uZWtvcnRldCBkaXR0IGZvciBVU0ItbGFncmluZy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IkRldCBvcHBzdG8gZXQgcHJvYmxlbSBtZWQgw6UgYnJ1a2UgbWlubmVrb3J0ZXQgZGl0dCBmb3IgVVNCLWxhZ3JpbmcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODE3NTg5MjU1NDc1NzIxNjUyNSI+IlVTQiB0aWxrb2JsZXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjczODAwODI0MDQyODgyMTkzNDEiPiJWZWxnIG9tIGR1IMO4bnNrZXIgw6Uga29waWVyZSBmaWxlciB0aWwvZnJhIGVuIGRhdGFtYXNraW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIyMzM2MDU4Mzk2NjYzNTE2MDE3Ij4iU2zDpSBhdiBVU0ItbGFncmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNTkxODEzNDkwMjY5ODQxNTM5Ij4iVmVsZyBmb3Igw6Ugc2zDpSBhdiBVU0ItbGFncmluZy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX3RpdGxlIiBtc2dpZD0iNjYwMTI5ODUxNzA4Nzc1ODUzIj4iVVNCLWxhZ3JpbmcgZXIgaSBicnVrIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYxMzcxMzM5NjQyNjYwNDEwNCAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg3NDUzNDUyNjA3ODAyNjcxODUiPiJGw7hyIGR1IHNsw6VyIGF2IFVTQi1sYWdyaW5nLCBzamVrayBhdCBkdSBoYXIgYXZtb250ZXJ0IHRlbGVmb25lbiBww6UgZGF0YW1hc2tpbmVuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJGw7hyIGR1IHNsw6VyIGF2IFVTQi1sYWdyaW5nLCBzamVrayBhdCBkdSBoYXIgYXZtb250ZXJ0IHRlbGVmb25lbiBww6UgZGF0YW1hc2tpbmVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJGw7hyIGR1IHNsw6VyIGF2IFVTQi1sYWdyaW5nLCBzamVrayBhdCBkdSBoYXIgYXZtb250ZXJ0IHRlbGVmb25lbiBww6UgZGF0YW1hc2tpbmVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfYnV0dG9uX21vdW50IiBtc2dpZD0iNzA2MDIxODAzNDkwMDY5NjAyOSI+IlNsw6UgYXYgVVNCLWxhZ3JpbmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIxNDM4ODE5MTQ4NDA0MTIxMDgiPiJEZXQgb3Bwc3RvZCBldCBwcm9ibGVtIHZlZCBkZWFrdGl2ZXJpbmcgYXYgVVNCLWxhZ3JpbmcuIEtvbnRyb2xsZXIgYXQgZHUgaGFyIGRlbW9udGVydCBVU0ItdmVydGVuLCBvZyBwcsO4diBww6Ugbnl0dC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGl0bGUiIG1zZ2lkPSI5NjMwMzkwMzM0NzA0Nzg2OTciPiJTbMOlIHDDpSBVU0ItbGFncmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190ZXh0IiBtc2dpZD0iMzIwMjgzODIzNDc4MDUwNTg4NiI+Ikh2aXMgZHUgYWt0aXZlcmVyIFVTQi1sYWdyaW5nLCB2aXJrZXIgaWtrZSBsZW5nZXIgZW5rZWx0ZSBhdiBwcm9ncmFtbWVuZSBkdSBicnVrZXIsIG9nIGRlIGthbiB2w6ZyZSB1dGlsZ2plbmdlbGlnZSBpbm50aWwgZHUgZGVha3RpdmVyZXIgVVNCLWxhZ3Jpbmdlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfZXJyb3JfdGl0bGUiIG1zZ2lkPSI4MDQ4OTk5OTczODM3MzM5MTc0Ij4iVVNCLW9wZXJhc2pvbmVuIG1pc2x5a3RlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19vayIgbXNnaWQ9IjczNzY5NTMxNjcwMzk4NjU3MDEiPiJPSyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg2NjMyNDc5Mjk1NTEwOTU4NTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NTc3OTA4MDA2OTQ5NzQyMjE3Ij4iRm9ybWF0ZXJlIG1pbm5la29ydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJGb3JtYXRlcmUgbWlubmVrb3J0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYyMTM2OTk2MjQzMzUyMzYxOSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzQ3MDgxNTE0MDA2ODUwMjgyNCI+IkVyIGR1IHNpa2tlciBww6UgYXQgZHUgw7huc2tlciDDpSBmb3JtYXRlcmUgbWlubmVrb3J0ZXQ/IEFsbGUgZGF0YSBww6Uga29ydGV0IHZpbCBnw6UgdGFwdC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiJFciBkdSBzaWtrZXIgcMOlIGF0IGR1IMO4bnNrZXIgw6UgZm9ybWF0ZXJlIG1pbm5la29ydGV0PyBBbGxlIGRhdGEgcMOlIGtvcnRldCB2aWwgZ8OlIHRhcHQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IkZvcm1hdGVyZSBtaW5uZWtvcnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiJFciBkdSBzaWtrZXIgcMOlIGF0IGR1IMO4bnNrZXIgw6UgZm9ybWF0ZXJlIG1pbm5la29ydGV0PyBBbGxlIGRhdGEgcMOlIGtvcnRldCB2aWwgZ8OlIHRhcHQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X2J1dHRvbl9mb3JtYXQiIG1zZ2lkPSI0MTMxMDY0NTYwMTI3NDc4Njk1Ij4iRm9ybWF0w6lyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5MDQ0Nzc4OTQ5MTg5OTE4Ij4iVVNCLWRlYnVnZ2luZyB0aWxrb2JsZXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODQ3MDI5NjgxODI3MDExMDM5NiI+IlZlbGcgZm9yIMOlIGRlYWt0aXZlcmUgVVNCLWRlYnVnZ2luZy4iPC9zdHJpbmc+CkBAIC04NDEsMjkgKzgyNiwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfYWxwaGFiZXQiIG1zZ2lkPSI1NDMzMjc1NDg1NDk5MDM5MTk5Ij4iIEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaw4bDmMOFIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfbnVtZXJpY19hbHBoYWJldCIgbXNnaWQ9IjQwMzAxNzA1MjQ1OTUxMjM2MTAiPiIgMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaw4bDmMOFIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FuZGlkYXRlc19zdHlsZSIgbXNnaWQ9IjQzMzM5MTMwODk2MzcwNjIyNTciPiJUQUdfRk9OVCI8dT4ia2FuZGlkYXRlciI8L3U+IkNMT1NFX0ZPTlQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NDU3NjAzNDE4OTcwOTk0MDUwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQyMzk1MTY2NzUwMjg0Mzg5OTciPiJGb3JiZXJlZGVyIG1pbm5la29ydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4iRm9yYmVyZWRlciBtaW5uZWtvcnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IkZvcmJlcmVkZXIgbWlubmVrb3J0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODI4NzMxOTg4MjkyNjczNzA1MyI+IlNqZWtrZXIgZm9yIGZlaWwuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzgwNDc3ODM4MjQxMjEyOTk3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzkzNzM0NTU3Nzk4MzczMDg3MyI+IlRvbXQgbWlubmVrb3J0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iVG9tdCBtaW5uZWtvcnQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxMzEyMjY2ODIwMDkyOTU4MDE0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNjA2NjYwNzU2MTI0NjI5NzA4Ij4iTWlubmVrb3J0ZXQgZXIgdG9tdCBlbGxlciBicnVrZXIgZXQgdXN0w7h0dGV0IGZpbHN5c3RlbS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJNaW5uZWtvcnRldCBlciB0b210IGVsbGVyIGhhciBldCBpa2tlLXN0w7h0dGV0IGZpbHN5c3RlbS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NDEwNzIzOTA2MDE5MTAwMTg5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE3MjQ2MTk5MDIwNzY1Mjg4ODkiPiJTa2FkZXQgbWlubmVrb3J0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJTa2FkZXQgbWlubmVrb3J0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjY3OTQxMjg4NDI5MDA2MTc3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY0NjAzMTE4MzUxMzA2NzExOTQiPiJNaW5uZWtvcnRldCBlciBza2FkZXQuIERldCBrYW4gdsOmcmUgZHUgbcOlIGZvcm1hdGVyZSBrb3J0ZXQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+Ik1pbm5la29ydGV0IGVyIHNrYWRldC4gRHUgbcOlIGthbnNramUgZm9ybWF0ZXJlIGRldC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2ODcyMTUyODgyNjA0NDA3ODM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjU4MjE3NTAxNjA2MDQzMjAzNCI+Ik1pbm5la29ydGV0IGJsZSB0YXR0IHV0IHV2ZW50ZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iTWlubmVrb3J0ZXQgYmxlIHRhdHQgdXQgdXZlbnRldCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDcyNjAxODMyOTM3NDc0NDgyNDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjIwMDUzOTY0NjQ0OTQ2NDg5MzciPiJBdm1vbnRlciBtaW5uZWtvcnRldCBmw7hyIGRldCB0YXMgdXQsIGZvciDDpSB1bm5nw6UgZGF0YXRhcC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiJBdm1vbnRlciBtaW5uZWtvcnRldCBmw7hyIGRldCB0YXMgdXQsIGZvciDDpSB1bm5nw6UgZGF0YXRhcC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NzI5ODAxMTMwNzkwNjE2MjAwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNjUyNTg4MTAxODY3OTUxNSI+IlRyeWd0IMOlIHRhIHV0IG1pbm5la29ydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+IlRyeWd0IMOlIHRhIHV0IG1pbm5la29ydCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc2MTM5NjA2ODY3NDc1OTI3NzAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNzUwMzc2OTEwNjI4NTE4ODcwMyI+Ik1pbm5la29ydGV0IGthbiBuw6UgdHJ5Z3QgdGFzIHV0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiJEZXQgZXIgdHJ5Z3Qgw6UgdGEgdXQgbWlubmVrb3J0ZXQuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODkwMjUxODAzMDQwNDM4MTMxOCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE4NzQ4ODk3NjQzNjcwODU1NjIiPiJNaW5uZWtvcnRldCBibGUgdGF0dCB1dCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiJNaW5uZWtvcnRldCBibGUgdGF0dCB1dCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQyMDUxMTcyMjczNDI4MjIyNzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI3MzA4OTA0NDEzMzEzNDQ3NzYiPiJNaW5uZWtvcnRldCBibGUgdGF0dCB1dC4gU2V0dCBpbm4gZXQgbnl0dCBtaW5uZWtvcnQgZm9yIMOlIMO4a2UgbGFncmluZ3NwbGFzc2VuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+Ik1pbm5la29ydGV0IGJsZSBmamVybmV0LiBTZXR0IGlubiBldCBueXR0LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IlRvbXQgbWlubmVrb3J0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iTWlubmVrb3J0ZXQgZXIgdG9tdCBlbGxlciBoYXIgZXQgaWtrZS1zdMO4dHRldCBmaWxzeXN0ZW0uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJTa2FkZXQgbWlubmVrb3J0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+Ik1pbm5la29ydGV0IGVyIHNrYWRldC4gRHUgbcOlIGthbnNramUgZm9ybWF0ZXJlIGRldC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iTWlubmVrb3J0ZXQgYmxlIHRhdHQgdXQgdXZlbnRldCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+IkF2bW9udGVyIG1pbm5la29ydGV0IGbDuHIgZGV0IHRhcyB1dCwgZm9yIMOlIHVubmfDpSBkYXRhdGFwLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+IlRyeWd0IMOlIHRhIHV0IG1pbm5la29ydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiJEZXQgZXIgdHJ5Z3Qgw6UgdGEgdXQgbWlubmVrb3J0ZXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+Ik1pbm5la29ydGV0IGJsZSB0YXR0IHV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iTWlubmVrb3J0ZXQgYmxlIGZqZXJuZXQuIFNldHQgaW5uIGV0IG55dHQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfbGlzdF9lbXB0eSIgbXNnaWQ9IjQxNjg4MjA2MDk0MDMzODU3ODkiPiJGYW50IGluZ2VuIHRpbHN2YXJlbmRlIGFrdGl2aXRldGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODc4NzM1MjA3NDMyNjc0ODg5MiI+Im9wcGRhdGVyIHN0YXRpc3Rpa2sgb3ZlciBrb21wb25lbnRicnVrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg5MTU1MzY5NTcxNjc1MjgzNSI+IlRpbGxhdGVyIGVuZHJpbmcgYXYgaW5uc2FtbGV0IGRhdGEgb20gYnJ1ayBhdiBrb21wb25lbnRlci4gSWtrZSBtZW50IGZvciB2YW5saWdlIGFwcGxpa2Fzam9uZXIuIjwvc3RyaW5nPgpAQCAtODk4LDE1ICs4NzIsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJQYXNzb3JkYmFzZXJ0IEwyVFAvSVBTZWMtVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlNlcnRpZmlrYXRiYXNlcnQgTDJUUC9JUFNlYy1WUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJWZWxnIGZpbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IkluZ2VuIGZpbCBlciB2YWxndCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IlRpbGJha2VzdGlsbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJTZW5kIGlubiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdHQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJCaWxtb2R1cyBlciBha3RpdmVydCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJWZWxnIGZvciDDpSBhdnNsdXR0ZSBiaWxtb2R1cyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJUaWxrbnl0bmluZyBlbGxlciB0csOlZGzDuHMgc29uZSBlciBha3RpdiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRyeWtrIGZvciDDpSBrb25maWd1cmVyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IlRpbGJha2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJOZXN0ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+IkhvcHAgb3ZlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IkjDuHkgbW9iaWxkYXRhYnJ1ayI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iQmVyw7hyIGZvciDDpSBsZXNlIG1lciBvbSBicnVrIGF2IG1vYmlsZGF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iR3JlbnNlbiBmb3IgbW9iaWxkYXRhYnJ1ayBlciBvdmVyc2tyZWRldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiJCZXLDuHIgZm9yIMOlIGxlc2UgbWVyIG9tIGJydWsgYXYgbW9iaWxkYXRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fbWF0Y2hlcyIgbXNnaWQ9IjgxMjk0MjE5MDg5MTU4NDA3MzciPiJJbmdlbiB0cmVmZiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZpbmRfb25fcGFnZSIgbXNnaWQ9IjE5NDY3OTkyMzM4MjI4MjAzODQiPiJGaW5uIHDDpSBzaWRlIjwvc3RyaW5nPgorICA8cGx1cmFscyBuYW1lPSJtYXRjaGVzX2ZvdW5kIj4KKyAgICA8aXRlbSBxdWFudGl0eT0ib25lIiBtc2dpZD0iODE2NzE0NzA4MTEzNjU3OTQzOSI+IjEgdHJlZmYiPC9pdGVtPgorICAgIDxpdGVtIHF1YW50aXR5PSJvdGhlciIgbXNnaWQ9IjQ2NDE4NzI3OTcwNjc2MDkxNzciPiI8eGxpZmY6ZyBpZD0iSU5ERVgiPiVkPC94bGlmZjpnPiBhdiA8eGxpZmY6ZyBpZD0iVE9UQUwiPiVkPC94bGlmZjpnPiI8L2l0ZW0+CisgIDwvcGx1cmFscz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwKaW5kZXggMmQwNzE2Ni4uMjhmZGNjMSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCkBAIC0xNjksOCArMTY5LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGxhYl9kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iMzQ0NjE2NDU4NDcxMDU5NjUxMyI+Ik9udHdpa2tlbGluZ3NodWxwcHJvZ3JhbW1hXCdzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iOTA1NjQzMTE5Mzg5MzgwOTgxNCI+IkZ1bmN0aWVzIGRpZSBhbGxlZW4gZG9vciB0b2VwYXNzaW5nc29udHdpa2tlbGFhcnMgd29yZGVuIGdlYnJ1aWt0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGxhYl9zdG9yYWdlIiBtc2dpZD0iMTk3MTExODc3MDU0NjMzNjk2NiI+Ik9wc2xhZ3J1aW10ZSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkyMDMzMDIyMTQ5MTUzNTU3NzQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI1NDU1ODA0MzUzMjIwNTgxMzEyIj4iVG9lZ2FuZyB0b3QgZGUgU0Qta2FhcnQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IlRvZWdhbmcgdG90IGRlIFNELWthYXJ0LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiJUb2VnYW5nIHRvdCBkZSBTRC1rYWFydC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhciIgbXNnaWQ9Ijc0MTcxOTI2Mjk2MDE4OTA3OTEiPiJzdGF0dXNiYWxrIHVpdHNjaGFrZWxlbiBvZiB3aWp6aWdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3N0YXR1c0JhciIgbXNnaWQ9IjEzNjU0NzM1OTUzMzE5ODk3MzIiPiJIaWVybWVlIGthbiBlZW4gdG9lcGFzc2luZyBkZSBzdGF0dXNiYWxrIHVpdHNjaGFrZWxlbiBvZiBzeXN0ZWVtcGljdG9ncmFtbWVuIHRvZXZvZWdlbiBlbiB2ZXJ3aWpkZXJlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhclNlcnZpY2UiIG1zZ2lkPSI3MjQ3MjgxOTExMzg3OTMxNDg1Ij4ic3RhdHVzYmFsayI8L3N0cmluZz4KQEAgLTI2Nyw4ICsyNjYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NsZWFyQXBwQ2FjaGUiIG1zZ2lkPSI3NzQwNDY1Njk0MTkzNjcxNDAyIj4iSGllcm1lZSBrYW4gZWVuIHRvZXBhc3Npbmcgb3BzbGFncnVpbXRlIG9wIGRlIHRlbGVmb29uIHZyaWogbWFrZW4gZG9vciBiZXN0YW5kZW4gdGUgdmVyd2lqZGVyZW4gdWl0IGRlIGNhY2hlbWFwIHZhbiBkZSB0b2VwYXNzaW5nLiBEZSB0b2VnYW5nIGlzIGRvb3JnYWFucyBiZXBlcmt0IHRvdCBoZXQgc3lzdGVlbXByb2Nlcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX21vdmVQYWNrYWdlIiBtc2dpZD0iNzI4NDU0OTc5OTQ2NTAzOTI2Ij4iVG9lcGFzc2luZ3Nicm9ubmVuIHZlcnBsYWF0c2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW92ZVBhY2thZ2UiIG1zZ2lkPSI2MzIzMDQ5MjkxOTIzOTI1Mjc3Ij4iRWVuIHRvZXBhc3NpbmcgdG9lc3RhYW4gdG9lcGFzc2luZ3Nicm9ubmVuIHRlIHZlcnBsYWF0c2VuIHZhbiBpbnRlcm5lIG5hYXIgZXh0ZXJuZSBtZWRpYSBlbiBvbWdla2VlcmQuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDgxMTkyMTcwMzg4MjUzMjA3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkTG9ncyIgbXNnaWQ9IjY2MTU3Nzg1NDMxOTg5Njc2MTQiPiJzeXN0ZWVtbG9nYmVzdGFuZGVuIGxlemVuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjI1NzkzNzk1NTU4MDQ3NTkwMiAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZExvZ3MiIG1zZ2lkPSI4ODk2NDQ5NDM3NDY0ODY3NzY2Ij4iSGllcm1lZSBrYW4gZWVuIHRvZXBhc3NpbmcgZGUgdmVyc2NoaWxsZW5kZSBsb2diZXN0YW5kZW4gdmFuIGhldCBzeXN0ZWVtIGxlemVuLiBEZSB0b2VwYXNzaW5nIGthbiBvcCBkZXplIG1hbmllciBhbGdlbWVuZSBpbmZvcm1hdGllIGFjaHRlcmhhbGVuIG92ZXIgdXcgdGVsZWZvb25nZWJydWlrLiBIaWVyaW4gaXMgZ2VlbiBwZXJzb29ubGlqa2Ugb2YgcHJpdsOpLWluZm9ybWF0aWUgb3BnZW5vbWVuLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRMb2dzICg2NjE1Nzc4NTQzMTk4OTY3NjE0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRMb2dzICg4ODk2NDQ5NDM3NDY0ODY3NzY2KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaWFnbm9zdGljIiBtc2dpZD0iODA3Njc0Mzk1MzkwODAwMDM0MiI+ImxlemVuL3NjaHJpanZlbiBuYWFyIGJyb25uZW4gdmFuIGRpYWciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaWFnbm9zdGljIiBtc2dpZD0iMzEyMTIzODM3Mzk1MTYzNzA0OSI+IkhpZXJtZWUga2FuIGVlbiB0b2VwYXNzaW5nIGxlemVuIGVuIHNjaHJpanZlbiBuYWFyIGVsa2UgYnJvbiBkaWUgaG9vcnQgYmlqIGRlIGRpYWdub3N0aXNjaGUgZ3JvZXAsIHpvYWxzIGJlc3RhbmRlbiBpbiAvZGV2LiBIaWVyZG9vciBrYW4gZGUgc3lzdGVlbXN0YWJpbGl0ZWl0IGVuIC12ZWlsaWdoZWlkIHdvcmRlbiBiZcOvbnZsb2VkLiBEaXQgbWFnIEFMTEVFTiB3b3JkZW4gZ2VicnVpa3Qgdm9vciBoYXJkd2FyZXNwZWNpZmlla2UgZGlhZ25vc3RpZWsgZG9vciBkZSBmYWJyaWthbnQgb2Ygb3BlcmF0b3IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VDb21wb25lbnRTdGF0ZSIgbXNnaWQ9Ijc5NDI1MTk4ODM0MzI5NDA2Ij4idG9lcGFzc2luZ3Njb21wb25lbnRlbiBpbi0gb2YgdWl0c2NoYWtlbGVuIjwvc3RyaW5nPgpAQCAtNDAzLDIyICs0MDQsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoQWRtaW4iIG1zZ2lkPSI3MjU2Mjg5Nzc0NjY3MDU0NTU1Ij4iSGllcm1lZSBrYW4gZWVuIHRvZXBhc3NpbmcgZGUgbG9rYWxlIEJsdWV0b290aC10ZWxlZm9vbiBjb25maWd1cmVyZW4gZW4gZXh0ZXJuZSBhcHBhcmF0ZW4gem9la2VuIGVuIGFhbnNsdWl0ZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ibHVldG9vdGgiIG1zZ2lkPSI4MzYxMDM4NzA3ODU3MDE4NzMyIj4iQmx1ZXRvb3RoLXZlcmJpbmRpbmdlbiBtYWtlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aCIgbXNnaWQ9Ijc2MjUxNTM4MDY3OTM5Mjk0NSI+IkhpZXJtZWUga2FuIGVlbiB0b2VwYXNzaW5nIGRlIGNvbmZpZ3VyYXRpZSB2YW4gZWVuIGxva2FsZSBCbHVldG9vdGgtdGVsZWZvb24gYmVraWprZW4gZW4gdmVyYmluZGluZ2VuIG1ldCBnZWtvcHBlbGRlIGFwcGFyYXRlbiBtYWtlbiBlbiBhY2NlcHRlcmVuLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0FkbWluICgyMjUxMzAyMjMzMDEyMjUwMDU2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0FkbWluICgxOTM1ODQyNjExNDY0ODk1Nzg1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjUmF3ICg0NDIzNDcxNzExMTE0MzI1NzA4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY1JhdyAoNTUzMzAyMjczNjU1OTM4NTY2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY05vdGlmeSAoNDc4NDcwMzYwMDgyNzkyMzU4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY05vdGlmeSAoMjk5MDA1MzUxNzk2MjA3MDYxNykgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0xsY3AgKDQ5NzIwNTE0NjEwMDcwMzA0MjYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTGxjcCAoOTE1OTIxMjc3ODYwMDQ2NDApIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjQ5Nzc0MDYxNjQzMTE1MzUwOTIiPiJ0b2V0c3ZlcmdyZW5kZWxpbmcgdWl0c2NoYWtlbGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iMzE4OTc2MzQ3OTMyNjMwMjAxNyI+IkhpZXJtZWUga2FuIGVlbiB0b2VwYXNzaW5nIGRlIHRvZXRzdmVyZ3JlbmRlbGluZyBlbiBiaWpiZWhvcmVuZGUgd2FjaHR3b29yZGJldmVpbGlnaW5nIHVpdHNjaGFrZWxlbi4gRWVuIHZvb3JiZWVsZDogZGUgdGVsZWZvb24gc2NoYWtlbHQgZGUgdG9ldHN2ZXJncmVuZGVsaW5nIHVpdCBhbHMgZXIgZWVuIG9wcm9lcCBiaW5uZW5rb210IGVuIHNjaGFrZWx0IGRlIHRvZXRzdmVyZ3JlbmRlbGluZyB3ZWVyIGluIGFscyBkZSBvcHJvZXAgaXMgYmXDq2luZGlnZC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRTeW5jU2V0dGluZ3MiIG1zZ2lkPSI2MjAxODEwMDA4MjMwNTAzMDUyIj4ic3luY2hyb25pc2F0aWUtaW5zdGVsbGluZ2VuIGxlemVuIjwvc3RyaW5nPgpAQCAtNDM1LDIyICs0MjAsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iMTA4Mjk3MjYwMzU3NjM2MDY5MCI+IkhpZXJtZWUga2FuIGVlbiB0b2VwYXNzaW5nIHByaXbDqXdvb3JkZW4sIG5hbWVuIGVuIHdvb3JkY29tYmluYXRpZXMgbGV6ZW4gZGllIGRlIGdlYnJ1aWtlciBoZWVmdCBvcGdlc2xhZ2VuIGluIGhldCBnZWJydWlrZXJzd29vcmRlbmJvZWsuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI2NzAzMTA5NTExODM2MzQzMzQxIj4ic2NocmlqdmVuIG5hYXIgZG9vciBnZWJydWlrZXIgZ2VkZWZpbmllZXJkIHdvb3JkZW5ib2VrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI0MTI1NjIwNjUyNDA4Mjg4MCI+IkhpZXJtZWUga2FuIGVlbiB0b2VwYXNzaW5nIG5pZXV3ZSB3b29yZGVuIHNjaHJpanZlbiBuYWFyIGhldCBnZWJydWlrZXJzd29vcmRlbmJvZWsuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODA3OTQwMzc1OTAwMTc3NzI5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI5OTM3MDc0MzY5NDEwMTY5MTMiPiJpbmhvdWQgb3AgZGUgU0Qta2FhcnQgYWFucGFzc2VuL3ZlcndpamRlcmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJpbmhvdWQgb3AgZGUgU0Qta2FhcnQgYWFucGFzc2VuL3ZlcndpamRlcmVuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjY0Mzk2MzIwNDk3NjQ3MTg3OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDEzMTg3MTU0MTEyNzIxMTUyNiI+IkhpZXJtZWUga2FuIGVlbiB0b2VwYXNzaW5nIHNjaHJpanZlbiBuYWFyIGRlIFNELWthYXJ0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IkhpZXJtZWUga2FuIGVlbiB0b2VwYXNzaW5nIHNjaHJpanZlbiBuYWFyIGRlIFNELWthYXJ0LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iaW5ob3VkIG9wIGRlIFNELWthYXJ0IGFhbnBhc3Nlbi92ZXJ3aWpkZXJlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IkhpZXJtZWUga2FuIGVlbiB0b2VwYXNzaW5nIHNjaHJpanZlbiBuYWFyIGRlIFNELWthYXJ0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjU2NTY0ODcyNjQ4MTk2Njk4MjQiPiJoZXQgY2FjaGViZXN0YW5kc3N5c3RlZW0gb3BlbmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjE2MjQ3MzQ1Mjg0MzU2NTk5MDYiPiJTdGFhdCBlZW4gdG9lcGFzc2luZyB0b2UgaGV0IGNhY2hlYmVzdGFuZHNzeXN0ZWVtIHRlIGxlemVuIGVuIHRlIHNjaHJpanZlbi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MzA3ODYxNDk2MzAyODUwMjAxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQ0OTc0MjA3Mjg4NTc1ODU3OTEiPiJXYWNodHdvb3JkIGJlcGVya2VuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTcxOTg3NzI0NTY5MjMxODI5OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iOTA4MzQwMDA4MDg2MTcyODA1NiI+IkRlIHR5cGVuIHdhY2h0d29vcmRlbiBiZXBlcmtlbiBkaWUgdSBtYWcgZ2VicnVpa2VuLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDczNzQ3ODA3MTI2NjQyODUzMjEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iOTE0MTMwNjQ2OTQyMTk5NTAzIj4iQWFubWVsZGluZ3Nwb2dpbmdlbiBjb250cm9sZXJlbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE5NjEyNTExNzk2MjQ4NDM0ODMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjcyMjc1NzgyNjAxNjUxNzI2NzMiPiJNaXNsdWt0ZSBwb2dpbmdlbiBjb250cm9sZXJlbiB2b29yIGFhbm1lbGRpbmcgYmlqIGhldCBhcHBhcmFhdCBvbSBlZW4gYmVwYWFsZGUgYWN0aWUgdWl0IHRlIHZvZXJlbi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MDg0NzcyMDkwNzk3NDg1NDIwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjI2MjAwNzcxOTEyNDI2ODg5NTUiPiJXYWNodHdvb3JkIG9wbmlldXcgaW5zdGVsbGVuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzMzMjE2NzYwMDMzMTc5OTk5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iNTM5MTI0MDYxNjk4MTI5NzM2MSI+IlV3IHdhY2h0d29vcmQgZ2Vkd29uZ2VuIHdpanppZ2VuIGluIGVlbiBuaWV1d2Ugd2FhcmRlLCB3YXQgdmVyZWlzdCBkYXQgZGUgYmVoZWVyZGVyIHUgaGV0IHdhY2h0d29vcmQgZ2VlZnQgdm9vcmRhdCB1IHppY2gga3VudCBhYW5tZWxkZW4uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTc2MDQ2NjAyNTI0NzYzNDQ4OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjIyNzQwODUzODQ3MDQyNDg0MzEiPiJHZWR3b25nZW4gdmVyZ3JlbmRlbGVuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjgxOTg2ODY2NDk0NjA4OTc0MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSI1Njk2OTY0MTI2MjI2MDI4NDQyIj4iQmVoZXJlbiB3YW5uZWVyIGhldCBhcHBhcmFhdCB3b3JkdCB2ZXJncmVuZGVsZCwgd2F0IHZlcmVpc3QgZGF0IHUgaGV0IHdhY2h0d29vcmQgb3BuaWV1dyBpbnZvZXJ0LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDMwNzg2MTQ5NjMwMjg1MDIwMSI+IldhY2h0d29vcmQgYmVwZXJrZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSIxNzE5ODc3MjQ1NjkyMzE4Mjk5Ij4iRGUgdHlwZW4gd2FjaHR3b29yZGVuIGJlcGVya2VuIGRpZSB1IG1hZyBnZWJydWlrZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI3Mzc0NzgwNzEyNjY0Mjg1MzIxIj4iQWFubWVsZGluZ3Nwb2dpbmdlbiBjb250cm9sZXJlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjE5NjEyNTExNzk2MjQ4NDM0ODMiPiJNaXNsdWt0ZSBwb2dpbmdlbiBjb250cm9sZXJlbiB2b29yIGFhbm1lbGRpbmcgYmlqIGhldCBhcHBhcmFhdCBvbSBlZW4gYmVwYWFsZGUgYWN0aWUgdWl0IHRlIHZvZXJlbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjkwODQ3NzIwOTA3OTc0ODU0MjAiPiJXYWNodHdvb3JkIG9wbmlldXcgaW5zdGVsbGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iMzMzMjE2NzYwMDMzMTc5OTk5MSI+IlV3IHdhY2h0d29vcmQgZ2Vkd29uZ2VuIHdpanppZ2VuIGluIGVlbiBuaWV1d2Ugd2FhcmRlLCB3YXQgdmVyZWlzdCBkYXQgZGUgYmVoZWVyZGVyIHUgaGV0IHdhY2h0d29vcmQgZ2VlZnQgdm9vcmRhdCB1IHppY2gga3VudCBhYW5tZWxkZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjU3NjA0NjYwMjUyNDc2MzQ0ODgiPiJHZWR3b25nZW4gdmVyZ3JlbmRlbGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iQmVoZXJlbiB3YW5uZWVyIGhldCBhcHBhcmFhdCB3b3JkdCB2ZXJncmVuZGVsZCwgd2F0IHZlcmVpc3QgZGF0IHUgaGV0IHdhY2h0d29vcmQgb3BuaWV1dyBpbnZvZXJ0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJBbGxlIGdlZ2V2ZW5zIHdpc3NlbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIzMTQwNjA5MzM3OTYzOTYyMDUgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSI3NjY5ODk1MzMzODE0MjIyNTg2Ij4iRGUgZmFicmlla3NpbnN0ZWxsaW5nZW4gaGVyc3RlbGxlbiwgd2FhcmJpaiBhbGxlIGdlZ2V2ZW5zIHdvcmRlbiB2ZXJ3aWpkZXJkIHpvbmRlciBiZXZlc3RpZ2luZy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IkRlIGZhYnJpZWtzaW5zdGVsbGluZ2VuIGhlcnN0ZWxsZW4sIHdhYXJiaWogYWxsZSBnZWdldmVucyB3b3JkZW4gdmVyd2lqZGVyZCB6b25kZXIgYmV2ZXN0aWdpbmcuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkiIG1zZ2lkPSI2Mzg3NDk3NDY2NjYwMTU0OTMxIj4iU3RlbCBkZSBhbGdlbWVuZSBwcm94eSB2b29yIGhldCBhcHBhcmFhdCBpbiBkaWUgbW9ldCB3b3JkZW4gZ2VicnVpa3QgdGVyd2lqbCBoZXQgYmVsZWlkIGlzIGdlYWN0aXZlZXJkLiBBbGxlZW4gZGUgZWVyc3RlIGFwcGFyYWF0YmVoZWVyZGVyIHN0ZWx0IGRlIGFsZ2VtZW5lIHByb3h5IGlzLiI8L3N0cmluZz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IlRodWlzIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTW9iaWVsIjwvaXRlbT4KQEAgLTU1MiwxMCArNTM4LDkgQEAKICAgICA8c2tpcCAvPgogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlT3RoZXIgKDQ0MDg0MzYxNjI5NTAxMTk4NDkpIC0tPgogICAgIDxza2lwIC8+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4idmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iUElOLWNvZGUgaW52b2VyZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IlZvZXIgaGV0IHdhY2h0d29vcmQgaW4gb20gdGUgb250Z3JlbmRlbGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJWb2VyIGRlIFBJTi1jb2RlIGluIG9tIHRlIG9udGdyZW5kZWxlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+Ik9uanVpc3RlIFBJTi1jb2RlISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJEcnVrIG9wIFwnTWVudVwnIGVuIHZlcnZvbGdlbnMgb3AgMCBvbSB0ZSBvbnRncmVuZGVsZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+IkFsYXJtbnVtbWVyIjwvc3RyaW5nPgpAQCAtNTY4LDYgKzU1Myw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IlRlcnVnIG5hYXIgZ2VzcHJlayI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+Ikp1aXN0ISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJQcm9iZWVyIGhldCBvcG5pZXV3Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJQcm9iZWVyIGhldCBvcG5pZXV3Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iT3BsYWRlbiAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iT3BnZWxhZGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTgyLDYgKzU2OCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0ta2FhcnQgaXMgdmVyZ3JlbmRlbGQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iU0lNLWthYXJ0IG9udGdyZW5kZWxlbi4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IlUgaGVlZnQgdXcgb250Z3JlbmRlbGluZ3NwYXRyb29uIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGtlZXIgb25qdWlzdCBnZXRla2VuZC4gIlxuXG4iUHJvYmVlciBoZXQgb3ZlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRlbiBvcG5pZXV3LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IlUgaGVlZnQgdXcgd2FjaHR3b29yZCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrZWVyIG9uanVpc3QgaW5nZXZvZXJkLiAiXG5cbiJQcm9iZWVyIGhldCBvdmVyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlY29uZGVuIG9wbmlldXcuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IlUgaGVlZnQgdXcgUElOLWNvZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2VlciBvbmp1aXN0IGluZ2V2b2VyZC4gIlxuXG4iUHJvYmVlciBoZXQgb3ZlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRlbiBvcG5pZXV3LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iVSBoZWVmdCB1dyBvbnRncmVuZGVsaW5nc3BhdHJvb24gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2VlciBvbmp1aXN0IGdldGVrZW5kLiBOYSBub2cgZWVucyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBtaXNsdWt0ZSBwb2dpbmdlbiwgd29yZHQgdSBnZXZyYWFnZCBvbSB1dyB0ZWxlZm9vbiB0ZSBvbnRncmVuZGVsZW4gbWV0IHV3IEdvb2dsZSBhYW5tZWxkaW5nLiJcblxuIiBQcm9iZWVyIGhldCBvdmVyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNlY29uZGVuIG9wbmlldXcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlByb2JlZXIgaGV0IG92ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNlY29uZGVuIG9wbmlldXcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJQYXRyb29uIHZlcmdldGVuPyI8L3N0cmluZz4KQEAgLTYxMCwxNCArNTk4LDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJqc19kaWFsb2dfYmVmb3JlX3VubG9hZCIgbXNnaWQ9IjE5MDE2NzU0NDgxNzk2NTMwODkiPiJXaWx0IHUgZGV6ZSBwYWdpbmEgdmVybGF0ZW4/IlxuXG4iPHhsaWZmOmcgaWQ9Ik1FU1NBR0UiPiVzPC94bGlmZjpnPiJcblxuIktpZXMgT0sgb20gZG9vciB0ZSBnYWFuIG9mIEFubnVsZXJlbiBvbSBvcCBkZSBodWlkaWdlIHBhZ2luYSB0ZSBibGlqdmVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbGFiZWwiIG1zZ2lkPSI2ODYwMjYxNzU4NjY1ODI1MDY5Ij4iQmV2ZXN0aWdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRvdWJsZV90YXBfdG9hc3QiIG1zZ2lkPSIxMDY4MjE2OTM3MjQ0NTY3MjQ3Ij4iVGlwOiB0aWsgdHdlZW1hYWwgb20gaW4gb2YgdWl0IHRlIHpvb21lbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b2ZpbGxfdGhpc19mb3JtICg4OTQwMTEwODY2Nzc1MDk3NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjEyODQ4NDM3MjgyMDM0MTIxMzUiPiJicm93c2VyZ2VzY2hpZWRlbmlzIGVuIGJsYWR3aWp6ZXJzIGxlemVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI0OTgxNDg5ODE1NDY3NjE3MTkxIj4iSGllcm1lZSBrYW4gZWVuIHRvZXBhc3NpbmcgZGUgVVJMXCdzIGxlemVuIGRpZSB1IHZpYSBkZSBicm93c2VyIGhlZWZ0IGJlem9jaHQsIGV2ZW5hbHMgYWxsZSBibGFkd2lqemVycyB2YW4gZGUgYnJvd3Nlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjkwMDk0MzQxMDk4MzYyODAzNzQiPiJicm93c2VyZ2VzY2hpZWRlbmlzIGVuIGJsYWR3aWp6ZXJzIHNjaHJpanZlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9Ijk0NTU3MTk5MDM1NzExNDk1MCI+IkhpZXJtZWUga2FuIGVlbiB0b2VwYXNzaW5nIGRlIG9wIHV3IHRlbGVmb29uIG9wZ2VzbGFnZW4gYnJvd3Nlcmdlc2NoaWVkZW5pcyBvZiBibGFkd2lqemVycyB3aWp6aWdlbi4gU2NoYWRlbGlqa2UgdG9lcGFzc2luZ2VuIGt1bm5lbiBoaWVybWVlIHV3IGJyb3dzZXJnZWdldmVucyB2ZXJ3aWpkZXJlbiBvZiB3aWp6aWdlbi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRBbGFybSAoNTkyNDQwMTMyODgwMzYxNTE2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRBbGFybSAoNTk2Njk2NjU5ODE0OTg3NTA4MikgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDcxNTIxMjY1NTU5ODI3NTUzMiI+Ikdlb2xvY2F0aWVyZWNodGVuIHZvb3IgYnJvd3NlciBhYW5wYXNzZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0MDExOTA4MjgyOTgwODYxNjc5Ij4iU3RhYXQgZWVuIHRvZXBhc3NpbmcgdG9lIGRlIGdlb2xvY2F0aWVyZWNodGVuIHZhbiBkZSBicm93c2VyIGFhbiB0ZSBwYXNzZW4uIFNjaGFkZWxpamtlIHRvZXBhc3NpbmdlbiBrdW5uZW4gZGl0IGdlYnJ1aWtlbiBvbSBsb2NhdGllZ2VnZXZlbnMgdGUgdmVyemVuZGVuIG5hYXIgd2lsbGVrZXVyaWdlIHdlYnNpdGVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbWVzc2FnZSIgbXNnaWQ9Ijc2NzM0NDY4NzEzOTE5NTc5MCI+IldpbHQgdSBkYXQgZGUgYnJvd3NlciBkaXQgd2FjaHR3b29yZCBvbnRob3VkdD8iPC9zdHJpbmc+CkBAIC03MzAsMTQgKzcxNiwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IkFsbGVzIHNlbGVjdGVyZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+Ildvb3JkIHNlbGVjdGVyZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iS25pcHBlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iS29wacOrcmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iUGxha2tlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iVVJMIGtvcGnDq3JlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHRNb2RlIiBtc2dpZD0iNjczODU1NjM0ODg2MTM0NzI0MCI+IlRla3N0IHNlbGVjdGVyZW4uLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4iVGVrc3RzZWxlY3RpZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ikludm9lcm1ldGhvZGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iXCc8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCcgdG9ldm9lZ2VuIGFhbiB3b29yZGVuYm9layI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IlRla3N0IGJld2Vya2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSI0OTA5MTM1NTY0OTQxODE1NDk0Ij4iVGVrc3RhY3RpZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IldlaW5pZyBydWltdGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJPcHNsYWdydWltdGUgdmFuIHRlbGVmb29uIHJhYWt0IG9wLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzQ1LDYgKzczMSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJBbm51bGVyZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iTGV0IG9wIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJMYWRlbi4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iQUFOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iVUlUIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJBY3RpZSB2b2x0b29pZW4gbWV0Ijwvc3RyaW5nPgpAQCAtNzYzLDkgKzc1MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0iZm9yY2VfY2xvc2UiIG1zZ2lkPSIzNjUzNDE2MzE1NDUwODA2Mzk2Ij4iTnUgc2x1aXRlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlcG9ydCIgbXNnaWQ9IjQwNjAyMTgyNjA5ODQ3OTU3MDYiPiJSYXBwb3J0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiJXYWNodGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iVG9lcGFzc2luZyBvbWdlbGVpZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBpcyBudSBhY3RpZWYuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IHdhcyBoZXQgZWVyc3QgZ2VzdGFydC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iRGUgdG9lcGFzc2luZyA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBoZWVmdCBoZXQgemVsZiBhZmdlZHdvbmdlbiBTdHJpY3RNb2RlLWJlbGVpZCBnZXNjaG9uZGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IkhldCBwcm9jZXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGhlZWZ0IGhldCB6ZWxmIGFmZ2Vkd29uZ2VuIFN0cmljdE1vZGUtYmVsZWlkIGdlc2Nob25kZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiB3b3JkdCB1aXRnZXZvZXJkIjwvc3RyaW5nPgpAQCAtODEyLDI4ICs4MDIsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1zX3Nob3dfYWxsIiBtc2dpZD0iMjY3MTc5MTE2MzkzMzA5MTE4MCI+PGI+IkFsbGVzIHdlZXJnZXZlbiI8L2I+PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9hY3Rpdml0eV90aXRsZSIgbXNnaWQ9IjIzOTkyODk5OTk2MDg5MDA0NDMiPiJVU0ItbWFzc2FvcHNsYWciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV90aXRsZSIgbXNnaWQ9IjU5MDE0NTkwNDEzOTg3NTE0OTUiPiJVU0ItdmVyYmluZGluZyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ3OTY3NTk2NDYxNjcyNDcxNzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODIzMTQ2Mjc1MDAxMDA2Njg5NiI+IlUgaGVlZnQgdXcgdGVsZWZvb24gdmlhIFVTQiBvcCB1dyBjb21wdXRlciBhYW5nZXNsb3Rlbi4gU2VsZWN0ZWVyIGRlIG9uZGVyc3RhYW5kZSBrbm9wIGFscyB1IGJlc3RhbmRlbiB0dXNzZW4gdXcgY29tcHV0ZXIgZW4gZGUgU0Qta2FhcnQgdmFuIHV3IEFuZHJvaWQgd2lsdCBrb3Bpw6tyZW4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJVIGhlZWZ0IHV3IHRlbGVmb29uIHZpYSBVU0Igb3AgdXcgY29tcHV0ZXIgYWFuZ2VzbG90ZW4uIFNlbGVjdGVlciBkZSBvbmRlcnN0YWFuZGUga25vcCBhbHMgdSBiZXN0YW5kZW4gdHVzc2VuIHV3IGNvbXB1dGVyIGVuIGRlIFNELWthYXJ0IHZhbiB1dyBBbmRyb2lkIHdpbHQga29wacOrcmVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4iVSBoZWVmdCB1dyB0ZWxlZm9vbiB2aWEgVVNCIG9wIHV3IGNvbXB1dGVyIGFhbmdlc2xvdGVuLiBTZWxlY3RlZXIgZGUgb25kZXJzdGFhbmRlIGtub3AgYWxzIHUgYmVzdGFuZGVuIHR1c3NlbiB1dyBjb21wdXRlciBlbiBkZSBTRC1rYWFydCB2YW4gdXcgQW5kcm9pZCB3aWx0IGtvcGnDq3Jlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9idXR0b25fbW91bnQiIG1zZ2lkPSIxMDUyMjU5OTMwMzY5NTA4MjM1Ij4iVVNCLW9wc2xhZyBpbnNjaGFrZWxlbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI1MzQ3ODQ3NTE2MDMzNDUzNjMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDgxODM0Nzc1NjQwMjc0MDI2MSI+IkVyIGlzIGVlbiBwcm9ibGVlbSBiaWogaGV0IGdlYnJ1aWsgdmFuIHV3IFNELWthYXJ0IHZvb3IgVVNCLW9wc2xhZy4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IkVyIGlzIGVlbiBwcm9ibGVlbSBiaWogaGV0IGdlYnJ1aWsgdmFuIHV3IFNELWthYXJ0IHZvb3IgVVNCLW9wc2xhZy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IkVyIGlzIGVlbiBwcm9ibGVlbSBiaWogaGV0IGdlYnJ1aWsgdmFuIHV3IFNELWthYXJ0IHZvb3IgVVNCLW9wc2xhZy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4MTc1ODkyNTU0NzU3MjE2NTI1Ij4iVVNCLXZlcmJpbmRpbmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjczODAwODI0MDQyODgyMTkzNDEiPiJTZWxlY3RlZXIgZGl0IG9tIGJlc3RhbmRlbiBuYWFyL3ZhbiB1dyBjb21wdXRlciB0ZSBrb3Bpw6tyZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIyMzM2MDU4Mzk2NjYzNTE2MDE3Ij4iVVNCLW9wc2xhZyB1aXRzY2hha2VsZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjU5MTgxMzQ5MDI2OTg0MTUzOSI+IlNlbGVjdGVlciBkaXQgb20gVVNCLW9wc2xhZyB1aXQgdGUgc2NoYWtlbGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfdGl0bGUiIG1zZ2lkPSI2NjAxMjk4NTE3MDg3NzU4NTMiPiJVU0Itb3BzbGFnIGluIGdlYnJ1aWsiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjEzNzEzMzk2NDI2NjA0MTA0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODc0NTM0NTI2MDc4MDI2NzE4NSI+IlZvb3JkYXQgdSBVU0Itb3BzbGFnIHVpdHNjaGFrZWx0LCBtb2V0IHUgZGUgU0Qta2FhcnQgdmFuIHV3IEFuZHJvaWQgaGViYmVuIG9udGtvcHBlbGQgKFwndWl0Z2V3b3JwZW5cJykgdmFuIHV3IGNvbXB1dGVyLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJWb29yZGF0IHUgVVNCLW9wc2xhZyB1aXRzY2hha2VsdCwgbW9ldCB1IGRlIFNELWthYXJ0IHZhbiB1dyBBbmRyb2lkIGhlYmJlbiBvbnRrb3BwZWxkIChcJ3VpdGdld29ycGVuXCcpIHZhbiB1dyBjb21wdXRlci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4iVm9vcmRhdCB1IFVTQi1vcHNsYWcgdWl0c2NoYWtlbHQsIG1vZXQgdSBkZSBTRC1rYWFydCB2YW4gdXcgQW5kcm9pZCBoZWJiZW4gb250a29wcGVsZCAoXCd1aXRnZXdvcnBlblwnKSB2YW4gdXcgY29tcHV0ZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9idXR0b25fbW91bnQiIG1zZ2lkPSI3MDYwMjE4MDM0OTAwNjk2MDI5Ij4iVVNCLW9wc2xhZyB1aXRzY2hha2VsZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIxNDM4ODE5MTQ4NDA0MTIxMDgiPiJFciBpcyBlZW4gcHJvYmxlZW0gb3BnZXRyZWRlbiB0aWpkZW5zIGhldCB1aXRzY2hha2VsZW4gdmFuIGRlIFVTQi1vcHNsYWcuIENvbnRyb2xlZXIgb2YgdSBkZSBVU0ItaG9zdCBoZWVmdCBsb3NnZWtvcHBlbGQgZW4gcHJvYmVlciBoZXQgb3BuaWV1dy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGl0bGUiIG1zZ2lkPSI5NjMwMzkwMzM0NzA0Nzg2OTciPiJVU0Itb3BzbGFnIGluc2NoYWtlbGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RleHQiIG1zZ2lkPSIzMjAyODM4MjM0NzgwNTA1ODg2Ij4iQWxzIHUgVVNCLW9wc2xhZyBpbnNjaGFrZWx0LCB3b3JkZW4gYmVwYWFsZGUgdG9lcGFzc2luZ2VuIGRpZSB1IGdlYnJ1aWt0LCBnZXN0b3B0IGVuIHdvcmRlbiBkZXplIG1vZ2VsaWprIHBhcyB3ZWVyIGJlc2NoaWtiYWFyIHdhbm5lZXIgdSBVU0Itb3BzbGFnIHVpdHNjaGFrZWx0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19lcnJvcl90aXRsZSIgbXNnaWQ9IjgwNDg5OTk5NzM4MzczMzkxNzQiPiJVU0ItYmV3ZXJraW5nIG1pc2x1a3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfb2siIG1zZ2lkPSI3Mzc2OTUzMTY3MDM5ODY1NzAxIj4iT0siPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4NjYzMjQ3OTI5NTUxMDk1ODU0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjU3NzkwODAwNjk0OTc0MjIxNyI+IlNELWthYXJ0IGZvcm1hdHRlcmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IlNELWthYXJ0IGZvcm1hdHRlcmVuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYyMTM2OTk2MjQzMzUyMzYxOSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzQ3MDgxNTE0MDA2ODUwMjgyNCI+IldlZXQgdSB6ZWtlciBkYXQgdSBkZSBTRC1rYWFydCB3aWx0IGZvcm1hdHRlcmVuPyBBbGxlIGdlZ2V2ZW5zIG9wIHV3IGthYXJ0IGdhYW4gZGFuIHZlcmxvcmVuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IldlZXQgdSB6ZWtlciBkYXQgdSBkZSBTRC1rYWFydCB3aWx0IGZvcm1hdHRlcmVuPyBBbGxlIGdlZ2V2ZW5zIG9wIHV3IGthYXJ0IGdhYW4gZGFuIHZlcmxvcmVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJTRC1rYWFydCBmb3JtYXR0ZXJlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IldlZXQgdSB6ZWtlciBkYXQgdSBkZSBTRC1rYWFydCB3aWx0IGZvcm1hdHRlcmVuPyBBbGxlIGdlZ2V2ZW5zIG9wIHV3IGthYXJ0IGdhYW4gZGFuIHZlcmxvcmVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9idXR0b25fZm9ybWF0IiBtc2dpZD0iNDEzMTA2NDU2MDEyNzQ3ODY5NSI+IkZvcm1hdHRlcmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5MDQ0Nzc4OTQ5MTg5OTE4Ij4iVVNCLWZvdXRvcHNwb3JpbmcgdmVyYm9uZGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9Ijg0NzAyOTY4MTgyNzAxMTAzOTYiPiJTZWxlY3RlZXIgZGV6ZSBvcHRpZSBvbSBVU0ItZm91dG9wc3BvcmluZyB1aXQgdGUgc2NoYWtlbGVuLiI8L3N0cmluZz4KQEAgLTg0MSwyOSArODI2LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9hbHBoYWJldCIgbXNnaWQ9IjU0MzMyNzU0ODU0OTkwMzkxOTkiPiIgQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9udW1lcmljX2FscGhhYmV0IiBtc2dpZD0iNDAzMDE3MDUyNDU5NTEyMzYxMCI+IiAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYW5kaWRhdGVzX3N0eWxlIiBtc2dpZD0iNDMzMzkxMzA4OTYzNzA2MjI1NyI+PHU+ImthbmRpZGF0ZW4iPC91Pjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTQ1NzYwMzQxODk3MDk5NDA1MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MjM5NTE2Njc1MDI4NDM4OTk3Ij4iU0Qta2FhcnQgdm9vcmJlcmVpZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiJTRC1rYWFydCB2b29yYmVyZWlkZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IlNELWthYXJ0IHZvb3JiZXJlaWRlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjgyODczMTk4ODI5MjY3MzcwNTMiPiJDb250cm9sZXJlbiBvcCBmb3V0ZW4uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzgwNDc3ODM4MjQxMjEyOTk3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzkzNzM0NTU3Nzk4MzczMDg3MyI+IkxlZ2UgU0Qta2FhcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI3ODA0Nzc4MzgyNDEyMTI5OTciPiJMZWdlIFNELWthYXJ0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTMxMjI2NjgyMDA5Mjk1ODAxNCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTYwNjY2MDc1NjEyNDYyOTcwOCI+IkRlIFNELWthYXJ0IGlzIGxlZWcgb2YgZ2VicnVpa3QgZWVuIG5pZXQtb25kZXJzdGV1bmQgYmVzdGFuZHNzeXN0ZWVtLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlNELWthYXJ0IGlzIGxlZWcgb2YgaGVlZnQgZWVuIG5pZXQtb25kZXJzdGV1bmQgYmVzdGFuZHNzeXN0ZWVtLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY0MTA3MjM5MDYwMTkxMDAxODkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTcyNDYxOTkwMjA3NjUyODg4OSI+IkJlc2NoYWRpZ2RlIFNELWthYXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJCZXNjaGFkaWdkZSBTRC1rYWFydCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI2Nzk0MTI4ODQyOTAwNjE3NzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NDYwMzExODM1MTMwNjcxMTk0Ij4iRGUgU0Qta2FhcnQgaXMgYmVzY2hhZGlnZC4gVSBtb2V0IGRlIGthYXJ0IG1vZ2VsaWprIG9wbmlldXcgZm9ybWF0dGVyZW4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IlNELWthYXJ0IGJlc2NoYWRpZ2QuIFUgbW9ldCBkZSBrYWFydCBtb2dlbGlqayBvcG5pZXV3IGZvcm1hdHRlcmVuLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY4NzIxNTI4ODI2MDQ0MDc4MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNTgyMTc1MDE2MDYwNDMyMDM0Ij4iU0Qta2FhcnQgb252ZXJ3YWNodHMgdmVyd2lqZGVyZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJTRC1rYWFydCBvbnZlcndhY2h0cyB2ZXJ3aWpkZXJkIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzI2MDE4MzI5Mzc0NzQ0ODI0MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjAwNTM5NjQ2NDQ5NDY0ODkzNyI+Ik9udGtvcHBlbCBkZSBTRC1rYWFydCB2b29yZGF0IHUgZGV6ZSB2ZXJ3aWpkZXJ0IG9tIGdlZ2V2ZW5zdmVybGllcyB0ZSB2b29ya29tZW4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4iT250a29wcGVsIGRlIFNELWthYXJ0IHZvb3JkYXQgdSBkZXplIHZlcndpamRlcnQgb20gZ2VnZXZlbnN2ZXJsaWVzIHRlIHZvb3Jrb21lbi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NzI5ODAxMTMwNzkwNjE2MjAwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNjUyNTg4MTAxODY3OTUxNSI+IkRlIFNELWthYXJ0IGthbiB2ZWlsaWcgd29yZGVuIHZlcndpamRlcmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJEZSBTRC1rYWFydCBrYW4gdmVpbGlnIHdvcmRlbiB2ZXJ3aWpkZXJkIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzYxMzk2MDY4Njc0NzU5Mjc3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI3NTAzNzY5MTA2Mjg1MTg4NzAzIj4iRGUgU0Qta2FhcnQga2FuIG51IHZlaWxpZyB3b3JkZW4gdmVyd2lqZGVyZC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4iVSBrdW50IGRlIFNELWthYXJ0IHZlaWxpZyB2ZXJ3aWpkZXJlbi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4OTAyNTE4MDMwNDA0MzgxMzE4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTg3NDg4OTc2NDM2NzA4NTU2MiI+IlNELWthYXJ0IGlzIHZlcndpamRlcmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4OTAyNTE4MDMwNDA0MzgxMzE4Ij4iU0Qta2FhcnQgaXMgdmVyd2lqZGVyZCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQyMDUxMTcyMjczNDI4MjIyNzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI3MzA4OTA0NDEzMzEzNDQ3NzYiPiJEZSBTRC1rYWFydCBpcyB2ZXJ3aWpkZXJkLiBQbGFhdHMgZWVuIG5pZXV3ZSBTRC1rYWFydCBvbSBkZSBvcHNsYWdjYXBhY2l0ZWl0IHZhbiB1dyBhcHBhcmFhdCB0ZSB2ZXJncm90ZW4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iU0Qta2FhcnQgdmVyd2lqZGVyZC4gUGxhYXRzIGVlbiBuaWV1d2UuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iTGVnZSBTRC1rYWFydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlNELWthYXJ0IGlzIGxlZWcgb2YgaGVlZnQgZWVuIG5pZXQtb25kZXJzdGV1bmQgYmVzdGFuZHNzeXN0ZWVtLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iQmVzY2hhZGlnZGUgU0Qta2FhcnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iU0Qta2FhcnQgYmVzY2hhZGlnZC4gVSBtb2V0IGRlIGthYXJ0IG1vZ2VsaWprIG9wbmlldXcgZm9ybWF0dGVyZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjg3MjE1Mjg4MjYwNDQwNzgzNyI+IlNELWthYXJ0IG9udmVyd2FjaHRzIHZlcndpamRlcmQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiJPbnRrb3BwZWwgZGUgU0Qta2FhcnQgdm9vcmRhdCB1IGRlemUgdmVyd2lqZGVydCBvbSBnZWdldmVuc3ZlcmxpZXMgdGUgdm9vcmtvbWVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+IkRlIFNELWthYXJ0IGthbiB2ZWlsaWcgd29yZGVuIHZlcndpamRlcmQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4iVSBrdW50IGRlIFNELWthYXJ0IHZlaWxpZyB2ZXJ3aWpkZXJlbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4OTAyNTE4MDMwNDA0MzgxMzE4Ij4iU0Qta2FhcnQgaXMgdmVyd2lqZGVyZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IlNELWthYXJ0IHZlcndpamRlcmQuIFBsYWF0cyBlZW4gbmlldXdlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X2xpc3RfZW1wdHkiIG1zZ2lkPSI0MTY4ODIwNjA5NDAzMzg1Nzg5Ij4iR2VlbiBvdmVyZWVua29tZW5kZSBhY3Rpdml0ZWl0ZW4gZ2V2b25kZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4Nzg3MzUyMDc0MzI2NzQ4ODkyIj4iZ2VicnVpa3NzdGF0aXN0aWVrZW4gdmFuIGNvbXBvbmVudCBiaWp3ZXJrZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODkxNTUzNjk1NzE2NzUyODM1Ij4iSGllcm1lZSBrdW5uZW4gdmVyemFtZWxkZSBnZWJydWlrc3N0YXRpc3RpZWtlbiB2YW4gZWVuIGNvbXBvbmVudCB3b3JkZW4gZ2V3aWp6aWdkLiBOaWV0IHZvb3IgZ2VicnVpayBkb29yIG5vcm1hbGUgdG9lcGFzc2luZ2VuLiI8L3N0cmluZz4KQEAgLTg5OCwxNSArODcyLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iVm9vcmFmIGdlZGVlbGRlIHNsZXV0ZWwgb3AgYmFzaXMgdmFuIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IkNlcnRpZmljYWF0IG9wIGJhc2lzIHZhbiBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IkJlc3RhbmQga2llemVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iR2VlbiBiZXN0YW5kIGdlc2VsZWN0ZWVyZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+Ik9wbmlldXcgaW5zdGVsbGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IlZlcnplbmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpZXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJBdXRvbW9kdXMgaW5nZXNjaGFrZWxkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IlNlbGVjdGVlciBkaXQgb20gZGUgYXV0b21vZHVzIGFmIHRlIHNsdWl0ZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IlRldGhlcmluZyBvZiBob3RzcG90IGFjdGllZiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IkFhbnJha2VuIG9tIHRlIGNvbmZpZ3VyZXJlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IlZvcmlnZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IlZvbGdlbmRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iT3ZlcnNsYWFuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iSG9vZyBtb2JpZWwgZ2VnZXZlbnNnZWJydWlrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJSYWFrIGFhbiB2b29yIG1lZXIgaW5mb3JtYXRpZSBvdmVyIG1vYmllbCBnZWdldmVuc2dlYnJ1aWsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+Ik1vYmllbGUgZ2VnZXZlbnNsaW1pZXQgb3ZlcnNjaHJlZGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNDcxMjM2OTg1NjYwMTI3NTE0NiI+IlJhYWsgYWFuIHZvb3IgbWVlciBpbmZvcm1hdGllIG92ZXIgbW9iaWVsIGdlZ2V2ZW5zZ2VicnVpayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX21hdGNoZXMiIG1zZ2lkPSI4MTI5NDIxOTA4OTE1ODQwNzM3Ij4iR2VlbiBvdmVyZWVua29tc3RlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZpbmRfb25fcGFnZSIgbXNnaWQ9IjE5NDY3OTkyMzM4MjI4MjAzODQiPiJab2VrZW4gb3AgcGFnaW5hIjwvc3RyaW5nPgorICA8cGx1cmFscyBuYW1lPSJtYXRjaGVzX2ZvdW5kIj4KKyAgICA8aXRlbSBxdWFudGl0eT0ib25lIiBtc2dpZD0iODE2NzE0NzA4MTEzNjU3OTQzOSI+IjEgb3ZlcmVlbmtvbXN0IjwvaXRlbT4KKyAgICA8aXRlbSBxdWFudGl0eT0ib3RoZXIiIG1zZ2lkPSI0NjQxODcyNzk3MDY3NjA5MTc3Ij4iPHhsaWZmOmcgaWQ9IklOREVYIj4lZDwveGxpZmY6Zz4gdmFuIDx4bGlmZjpnIGlkPSJUT1RBTCI+JWQ8L3hsaWZmOmc+IjwvaXRlbT4KKyAgPC9wbHVyYWxzPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbAppbmRleCA3NjA0YzYxLi4zM2IwM2FkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKQEAgLTE2OSw4ICsxNjksNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSIzNDQ2MTY0NTg0NzEwNTk2NTEzIj4iTmFyesSZZHppYSBwcm9ncmFtaXN0eWN6bmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSI5MDU2NDMxMTkzODkzODA5ODE0Ij4iRnVua2NqZSBwb3RyemVibmUgamVkeW5pZSBwcm9ncmFtaXN0b20iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfc3RvcmFnZSIgbXNnaWQ9IjE5NzExMTg3NzA1NDYzMzY5NjYiPiJQYW1pxJnEhyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkyMDMzMDIyMTQ5MTUzNTU3NzQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI1NDU1ODA0MzUzMjIwNTgxMzEyIj4iRG9zdMSZcCBkbyBrYXJ0eSBTRC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4iRG9zdMSZcCBkbyBrYXJ0eSBTRC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4iRG9zdMSZcCBkbyBrYXJ0eSBTRC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhciIgbXNnaWQ9Ijc0MTcxOTI2Mjk2MDE4OTA3OTEiPiJ3ecWCxIVjemFuaWUgbHViIHptaWVuaWFuaWUgcGFza2Egc3RhbnUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zdGF0dXNCYXIiIG1zZ2lkPSIxMzY1NDczNTk1MzMxOTg5NzMyIj4iUG96d2FsYSBhcGxpa2Fjam9tIG5hIHd5xYLEhWN6ZW5pZSBwYXNrYSBzdGFudSBsdWIgZG9kYXdhbmllIGkgdXN1d2FuaWUgaWtvbiBzeXN0ZW1vd3ljaC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhclNlcnZpY2UiIG1zZ2lkPSI3MjQ3MjgxOTExMzg3OTMxNDg1Ij4icGFzZWsgc3RhbnUiPC9zdHJpbmc+CkBAIC0yNjcsOCArMjY2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jbGVhckFwcENhY2hlIiBtc2dpZD0iNzc0MDQ2NTY5NDE5MzY3MTQwMiI+IlBvendhbGEgYXBsaWthY2ppIG5hIHp3YWxuaWFuaWUgcGFtacSZY2kgdGVsZWZvbnUgcHJ6ZXogdXN1d2FuaWUgcGxpa8OzdyB6IGthdGFsb2d1IHBhbWnEmWNpIHBvZHLEmWN6bmVqIGFwbGlrYWNqaS4gRG9zdMSZcCBqZXN0IGJhcmR6byBvZ3Jhbmljem9ueSwgeiByZWd1xYJ5IGRvIHByb2Nlc8OzdyBzeXN0ZW11LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbW92ZVBhY2thZ2UiIG1zZ2lkPSI3Mjg0NTQ5Nzk5NDY1MDM5MjYiPiJQcnplbm9zemVuaWUgemFzb2LDs3cgYXBsaWthY2ppIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW92ZVBhY2thZ2UiIG1zZ2lkPSI2MzIzMDQ5MjkxOTIzOTI1Mjc3Ij4iWmV6d2FsYSBhcGxpa2FjamkgbmEgcHJ6ZW5pZXNpZW5pZSB6YXNvYsOzdyBhcGxpa2FjamkgeiBub8WbbmlrYSB3ZXduxJl0cnpuZWdvIG5hIHpld27EmXRyem55IGkgb2R3cm90bmllLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ4MTE5MjE3MDM4ODI1MzIwNzAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZExvZ3MiIG1zZ2lkPSI2NjE1Nzc4NTQzMTk4OTY3NjE0Ij4iY3p5dGFuaWUgcGxpa8OzdyBkemllbm5pa2Egc3lzdGVtdSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIyNTc5Mzc5NTU1ODA0NzU5MDIgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+IlVtb8W8bGl3aWEgYXBsaWthY2ppIGN6eXRhbmllIHLDs8W8bnljaCBwbGlrw7N3IGR6aWVubmlrYSBzeXN0ZW1vd2Vnby4gUG96d2FsYSB0byBuYSB1enlza2FuaWUgb2fDs2xueWNoIGluZm9ybWFjamkgbyBjenlubm/Fm2NpYWNoIHd5a29ueXdhbnljaCB3IHRlbGVmb25pZSwgYWxlIGJleiB1amF3bmlhbmlhIGRhbnljaCBvc29ib3d5Y2ggbHViIG9zb2Jpc3R5Y2ggaW5mb3JtYWNqaS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkTG9ncyAoNjYxNTc3ODU0MzE5ODk2NzYxNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkTG9ncyAoODg5NjQ0OTQzNzQ2NDg2Nzc2NikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlhZ25vc3RpYyIgbXNnaWQ9IjgwNzY3NDM5NTM5MDgwMDAzNDIiPiJjenl0YW5pZS96YXBpc3l3YW5pZSB3IHphc29iYWNoIG5hbGXFvMSFY3ljaCBkbyBkaWFnbm9zdHlraSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2RpYWdub3N0aWMiIG1zZ2lkPSIzMTIxMjM4MzczOTUxNjM3MDQ5Ij4iUG96d2FsYSBhcGxpa2FjamkgbmEgY3p5dGFuaWUgaSB6YXBpc3l3YW5pZSB3ZSB3c3p5c3RraWNoIHphc29iYWNoIHBvc2lhZGFueWNoIHByemV6IGRpYWdub3pvd2FuxIUgZ3J1cMSZLCBqYWsgbmEgcHJ6eWvFgmFkIHBsaWtpIHcga2F0YWxvZ3UgL2Rldi4gTW/FvGUgdG8gcG90ZW5jamFsbmllIHdwxYJ5bsSFxIcgbmEgc3RhYmlsbm/Fm8SHIGkgYmV6cGllY3plxYRzdHdvIHN5c3RlbXUuIFBvd2lubm8gYnnEhyB3eWtvcnp5c3R5d2FuZSBUWUxLTyB3IGNlbGFjaCBkaWFnbm96b3dhbmlhIHNwcnrEmXR1IHByemV6IHByb2R1Y2VudGEgbHViIG9wZXJhdG9yYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NoYW5nZUNvbXBvbmVudFN0YXRlIiBtc2dpZD0iNzk0MjUxOTg4MzQzMjk0MDYiPiJ3xYLEhWN6YW5pZSBsdWIgd3nFgsSFY3phbmllIHNrxYJhZG5pa8OzdyBhcGxpa2FjamkiPC9zdHJpbmc+CkBAIC00MDMsMjIgKzQwNCw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGhBZG1pbiIgbXNnaWQ9IjcyNTYyODk3NzQ2NjcwNTQ1NTUiPiJQb3p3YWxhIGFwbGlrYWNqaSBuYSBrb25maWd1cm93YW5pZSBsb2thbG5lZ28gdGVsZWZvbnUgQmx1ZXRvb3RoLCB3eXN6dWtpd2FuaWUgdXJ6xIVkemXFhCB6ZGFsbnljaCBpIMWCxIVjemVuaWUgc2nEmSB6IG5pbWkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ibHVldG9vdGgiIG1zZ2lkPSI4MzYxMDM4NzA3ODU3MDE4NzMyIj4idHdvcnplbmllIHBvxYLEhWN6ZcWEIEJsdWV0b290aCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aCIgbXNnaWQ9Ijc2MjUxNTM4MDY3OTM5Mjk0NSI+IlBvendhbGEgYXBsaWthY2ppIG5hIHd5xZt3aWV0bGFuaWUga29uZmlndXJhY2ppIGxva2FsbmVnbyB0ZWxlZm9udSBCbHVldG9vdGggb3JheiBuYSB0d29yemVuaWUgaSBha2NlcHRvd2FuaWUgcG/FgsSFY3plxYQgemUgc3Bhcm93YW55bWkgdXJ6xIVkemVuaWFtaS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNBZG1pbiAoMjI1MTMwMjIzMzAxMjI1MDA1NikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNBZG1pbiAoMTkzNTg0MjYxMTQ2NDg5NTc4NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY1JhdyAoNDQyMzQ3MTcxMTExNDMyNTcwOCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNSYXcgKDU1MzMwMjI3MzY1NTkzODU2NjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNOb3RpZnkgKDQ3ODQ3MDM2MDA4Mjc5MjM1OCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNOb3RpZnkgKDI5OTAwNTM1MTc5NjIwNzA2MTcpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNMbGNwICg0OTcyMDUxNDYxMDA3MDMwNDI2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0xsY3AgKDkxNTkyMTI3Nzg2MDA0NjQwKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSI0OTc3NDA2MTY0MzExNTM1MDkyIj4id3nFgsSFY3phbmllIGJsb2thZHkga2xhd2lhdHVyeSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjMxODk3NjM0NzkzMjYzMDIwMTciPiJQb3p3YWxhIGFwbGlrYWNqaSBuYSB3ecWCxIVjemVuaWUgYmxva2FkeSBrbGF3aWF0dXJ5IGkgd3N6eXN0a2ljaCB6d2nEhXphbnljaCB6IHR5bSBoYXNlxYIgemFiZXpwaWVjemFqxIVjeWNoLiBUeXBvd3ltIHByenlrxYJhZGVtIHRha2llZ28gZHppYcWCYW5pYSBqZXN0IHd5xYLEhWN6YW5pZSBibG9rYWR5IGtsYXdpYXR1cnksIGdkeSBwb2phd2lhIHNpxJkgcG/FgsSFY3plbmllIHByenljaG9kesSFY2UsIGEgbmFzdMSZcG5pZSBwb25vd25lIGplaiB3xYLEhWN6YW5pZSBwbyB6YWtvxYRjemVuaXUgcG/FgsSFY3plbmlhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFN5bmNTZXR0aW5ncyIgbXNnaWQ9IjYyMDE4MTAwMDgyMzA1MDMwNTIiPiJjenl0YW5pZSB1c3Rhd2llxYQgc3luY2hyb25pem93YW5pYSI8L3N0cmluZz4KQEAgLTQzNSwyMiArNDIwLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9IjEwODI5NzI2MDM1NzYzNjA2OTAiPiJaZXp3YWxhIGFwbGlrYWNqaSBuYSBvZGN6eXR5d2FuaWUgd3N6ZWxraWNoIHByeXdhdG55Y2ggc8WCw7N3LCBuYXp3IGkgd3lyYcW8ZcWEIHphcGlzYW55Y2ggcHJ6ZXogdcW8eXRrb3duaWthIHcgc3dvaW0gc8WCb3duaWt1LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iNjcwMzEwOTUxMTgzNjM0MzM0MSI+InphcGlzeXdhbmllIHcgc8WCb3duaWt1IHpkZWZpbmlvd2FueW0gcHJ6ZXogdcW8eXRrb3duaWthIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI0MTI1NjIwNjUyNDA4Mjg4MCI+IlplendhbGEgYXBsaWthY2pvbSBuYSB6YXBpc3l3YW5pZSBub3d5Y2ggc8WCw7N3IHcgc8WCb3duaWt1IHXFvHl0a293bmlrYS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4MDc5NDAzNzU5MDAxNzc3MjkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijk5MzcwNzQzNjk0MTAxNjkxMyI+Im1vZHlmaWtvd2FuaWUvdXN1d2FuaWUgemF3YXJ0b8WbY2kga2FydHkgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Im1vZHlmaWtvd2FuaWUvdXN1d2FuaWUgemF3YXJ0b8WbY2kga2FydHkgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NjQzOTYzMjA0OTc2NDcxODc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MTMxODcxNTQxMTI3MjExNTI2Ij4iVW1vxbxsaXdpYSBhcGxpa2FjamkgemFwaXMgbmEga2FyY2llIFNELiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IlVtb8W8bGl3aWEgYXBsaWthY2ppIHphcGlzIG5hIGthcmNpZSBTRC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Im1vZHlmaWtvd2FuaWUvdXN1d2FuaWUgemF3YXJ0b8WbY2kga2FydHkgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiJVbW/FvGxpd2lhIGFwbGlrYWNqaSB6YXBpcyBuYSBrYXJjaWUgU0QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iNTY1NjQ4NzI2NDgxOTY2OTgyNCI+ImRvc3TEmXAgZG8gc3lzdGVtdSBwbGlrw7N3IHBhbWnEmWNpIHBvZHLEmWN6bmVqIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjE2MjQ3MzQ1Mjg0MzU2NTk5MDYiPiJaZXp3YWxhIGFwbGlrYWNqaSBuYSBvZGN6eXQgaSB6YXBpcyB3IHN5c3RlbWllIHBsaWvDs3cgcGFtacSZY2kgcG9kcsSZY3puZWouIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDMwNzg2MTQ5NjMwMjg1MDIwMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0NDk3NDIwNzI4ODU3NTg1NzkxIj4iT2dyYW5pY3ogbGljemLEmSBwcsOzYiB3cHJvd2FkemVuaWEgaGFzxYJhIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTcxOTg3NzI0NTY5MjMxODI5OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iOTA4MzQwMDA4MDg2MTcyODA1NiI+Ik9ncmFuaWN6YSBkb3p3b2xvbmUgdHlweSBoYXNlxYIgdcW8eXRrb3duaWthLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDczNzQ3ODA3MTI2NjQyODUzMjEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iOTE0MTMwNjQ2OTQyMTk5NTAzIj4iTW9uaXRvcnVqIHByw7NieSBsb2dvd2FuaWEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxOTYxMjUxMTc5NjI0ODQzNDgzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSI3MjI3NTc4MjYwMTY1MTcyNjczIj4iTW9uaXRvcnVqZSBuaWV1ZGFuZSBwcsOzYnkgemFsb2dvd2FuaWEgZG8gdXJ6xIVkemVuaWEgdyBjZWx1IHd5a29uYW5pYSBva3JlxZtsb25lZ28gZHppYcWCYW5pYS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MDg0NzcyMDkwNzk3NDg1NDIwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjI2MjAwNzcxOTEyNDI2ODg5NTUiPiJSZXNldHVqIGhhc8WCbyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDMzMzIxNjc2MDAzMzE3OTk5OTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjUzOTEyNDA2MTY5ODEyOTczNjEiPiJXeW11c3phIHBvZGFuaWUgbm93ZWogd2FydG/Fm2NpIGhhc8WCYSwgd3ltYWdhasSFYyBwcnpla2F6YW5pYSBnbyB1xbx5dGtvd25pa293aSBwcnpleiBhZG1pbmlzdHJhdG9yYSBwcnplZCB6YWxvZ293YW5pZW0uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTc2MDQ2NjAyNTI0NzYzNDQ4OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjIyNzQwODUzODQ3MDQyNDg0MzEiPiJXeW11xZsgemFibG9rb3dhbmllIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjgxOTg2ODY2NDk0NjA4OTc0MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSI1Njk2OTY0MTI2MjI2MDI4NDQyIj4iS29udHJvbHVqZSwga2llZHkgdXJ6xIVkemVuaWUgamVzdCBibG9rb3dhbmUsIHd5bWFnYWrEhWMgcG9ub3duZWdvIHdwcm93YWR6ZW5pYSBoYXPFgmEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0MzA3ODYxNDk2MzAyODUwMjAxIj4iT2dyYW5pY3ogbGljemLEmSBwcsOzYiB3cHJvd2FkemVuaWEgaGFzxYJhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iMTcxOTg3NzI0NTY5MjMxODI5OSI+Ik9ncmFuaWN6YSBkb3p3b2xvbmUgdHlweSBoYXNlxYIgdcW8eXRrb3duaWthLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iNzM3NDc4MDcxMjY2NDI4NTMyMSI+Ik1vbml0b3J1aiBwcsOzYnkgbG9nb3dhbmlhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iMTk2MTI1MTE3OTYyNDg0MzQ4MyI+Ik1vbml0b3J1amUgbmlldWRhbmUgcHLDs2J5IHphbG9nb3dhbmlhIGRvIHVyesSFZHplbmlhIHcgY2VsdSB3eWtvbmFuaWEgb2tyZcWbbG9uZWdvIGR6aWHFgmFuaWEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI5MDg0NzcyMDkwNzk3NDg1NDIwIj4iUmVzZXR1aiBoYXPFgm8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIzMzMyMTY3NjAwMzMxNzk5OTkxIj4iV3ltdXN6YSBwb2RhbmllIG5vd2VqIHdhcnRvxZtjaSBoYXPFgmEsIHd5bWFnYWrEhWMgcHJ6ZWthemFuaWEgZ28gdcW8eXRrb3duaWtvd2kgcHJ6ZXogYWRtaW5pc3RyYXRvcmEgcHJ6ZWQgemFsb2dvd2FuaWVtLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSI1NzYwNDY2MDI1MjQ3NjM0NDg4Ij4iV3ltdcWbIHphYmxva293YW5pZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IktvbnRyb2x1amUsIGtpZWR5IHVyesSFZHplbmllIGplc3QgYmxva293YW5lLCB3eW1hZ2FqxIVjIHBvbm93bmVnbyB3cHJvd2FkemVuaWEgaGFzxYJhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJVc3XFhCB3c3p5c3RraWUgZGFuZSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIzMTQwNjA5MzM3OTYzOTYyMDUgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSI3NjY5ODk1MzMzODE0MjIyNTg2Ij4iV3lrb251amUgcmVzZXQgZmFicnljem55LCB1c3V3YWrEhWMgd3N6eXN0a2llIGRhbmUgdcW8eXRrb3duaWthIGJleiDFvGFkbmVnbyBwb3R3aWVyZHplbmlhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iV3lrb251amUgcmVzZXQgZmFicnljem55LCB1c3V3YWrEhWMgd3N6eXN0a2llIGRhbmUgdcW8eXRrb3duaWthIGJleiDFvGFkbmVnbyBwb3R3aWVyZHplbmlhLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5IiBtc2dpZD0iNjM4NzQ5NzQ2NjY2MDE1NDkzMSI+IlVzdGF3IGdsb2JhbG55IHNlcndlciBwcm94eSB1cnrEhWR6ZW5pYSBkbyB1xbx5d2FuaWEgcHJ6eSB3xYLEhWN6b255Y2ggemFzYWRhY2guIFR5bGtvIHBpZXJ3c3p5IGFkbWluaXN0cmF0b3IgdXJ6xIVkemVuaWEgdXN0YXdpYSBvYm93acSFenVqxIVjeSBnbG9iYWxueSBzZXJ3ZXIgcHJveHkuIjwvc3RyaW5nPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iRG9tIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iS29tw7Nya2EiPC9pdGVtPgpAQCAtNTUyLDEwICs1MzgsOSBAQAogICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVPdGhlciAoNDQwODQzNjE2Mjk1MDExOTg0OSkgLS0+CiAgICAgPHNraXAgLz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJwcnpleiA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IHByemV6IDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iV3Byb3dhZMW6IGtvZCBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+Ildwcm93YWTFuiBoYXPFgm8sIGFieSBvZGJsb2tvd2HEhyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iV3Byb3dhZMW6IGtvZCBQSU4sIGFieSBvZGJsb2tvd2HEhyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkLFgsSZZG55IGtvZCBQSU4hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IkFieSBvZGJsb2tvd2HEhywgbmFjacWbbmlqIE1lbnUsIGEgbmFzdMSZcG5pZSAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOdW1lciBhbGFybW93eSI8L3N0cmluZz4KQEAgLTU2OCw2ICs1NTMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJQb3dyw7N0IGRvIHBvxYLEhWN6ZW5pYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IlBvcHJhd25pZSEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iTmllc3RldHksIHNwcsOzYnVqIHBvbm93bmllIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJTcHLDs2J1aiBwb25vd25pZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IsWBYWRvd2FuaWUgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+Ik5hxYJhZG93YW55LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTgyLDYgKzU2OCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJLYXJ0YSBTSU0gamVzdCB6YWJsb2tvd2FuYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJPZGJsb2tvd3l3YW5pZSBrYXJ0eSBTSU0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJXesOzciBvZGJsb2tvd2FuaWEgem9zdGHFgiBuaWVwcmF3aWTFgm93byBuYXJ5c293YW55IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHJhenkuICJcblxuIlNwcsOzYnVqIHBvbm93bmllIHphIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJIYXPFgm8gem9zdGHFgm8gbmllcHJhd2lkxYJvd28gd3Byb3dhZHpvbmUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gcmF6eS4gIlxuXG4iU3Byw7NidWogcG9ub3duaWUgemEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iTmllcG9wcmF3bmllIHdwcm93YWR6b25vIGtvZCBQSU4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gcmF6eS4gIlxuXG4iU3Byw7NidWogcG9ub3duaWUgemEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+Ild6w7NyIG9kYmxva293YW5pYSB6b3N0YcWCIG5hcnlzb3dhbnkgbmllcHJhd2lkxYJvd28gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gcmF6eS4gUG8ga29sZWpueWNoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IG5pZXVkYW55Y2ggcHLDs2JhY2ggdGVsZWZvbiB0cnplYmEgYsSZZHppZSBvZGJsb2tvd2HEhyBwcnpleiB6YWxvZ293YW5pZSBuYSBrb25jaWUgR29vZ2xlLiJcblxuIiBTcHLDs2J1aiBwb25vd25pZSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWt1bmQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlNwcsOzYnVqIHBvbm93bmllIHphIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWt1bmQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJaYXBvbW5pYcWCZcWbIHd6b3J1PyI8L3N0cmluZz4KQEAgLTYxMCwxNCArNTk4LDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJqc19kaWFsb2dfYmVmb3JlX3VubG9hZCIgbXNnaWQ9IjE5MDE2NzU0NDgxNzk2NTMwODkiPiJDenkgb3B1xZtjacSHIHTEmSBzdHJvbsSZPyJcblxuIjx4bGlmZjpnIGlkPSJNRVNTQUdFIj4lczwveGxpZmY6Zz4iXG5cbiJXeWJpZXJ6IG9wY2rEmSBPSywgYWJ5IGtvbnR5bnVvd2HEhywgbHViIG9wY2rEmSBBbnVsdWosIGFieSBwb3pvc3RhxIcgbmEgdGVqIHN0cm9uaWUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9sYWJlbCIgbXNnaWQ9IjY4NjAyNjE3NTg2NjU4MjUwNjkiPiJQb3R3aWVyZMW6Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZG91YmxlX3RhcF90b2FzdCIgbXNnaWQ9IjEwNjgyMTY5MzcyNDQ1NjcyNDciPiJXc2thesOzd2thOiBkb3RrbmlqIGR3dWtyb3RuaWUsIGFieSBwb3dpxJlrc3p5xIcgbHViIHBvbW5pZWpzennEhy4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b2ZpbGxfdGhpc19mb3JtICg4OTQwMTEwODY2Nzc1MDk3NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjEyODQ4NDM3MjgyMDM0MTIxMzUiPiJvZGN6eXQgaGlzdG9yaWkgaSB6YWvFgmFkZWsgcHJ6ZWdsxIVkYXJraSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iNDk4MTQ4OTgxNTQ2NzYxNzE5MSI+IlVtb8W8bGl3aWEgYXBsaWthY2ppIG9kY3p5dCB3c3p5c3RraWNoIGFkcmVzw7N3IFVSTCBvZHdpZWR6b255Y2ggcHJ6ZXogcHJ6ZWdsxIVkYXJrxJksIGEgdGFrxbxlIHdzenlzdGtpY2ggemFrxYJhZGVrIHByemVnbMSFZGFya2kuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5MDA5NDM0MTA5ODM2MjgwMzc0Ij4iemFwaXMgaGlzdG9yaWkgaSB6YWvFgmFkZWsgcHJ6ZWdsxIVkYXJraSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9Ijk0NTU3MTk5MDM1NzExNDk1MCI+IlVtb8W8bGl3aWEgYXBsaWthY2ppIG1vZHlmaWtvd2FuaWUgaGlzdG9yaWkgbHViIHpha8WCYWRlayBwcnplZ2zEhWRhcmtpIHphcGlzYW55Y2ggdyB0ZWxlZm9uaWUuIFrFgm/Fm2xpd2UgYXBsaWthY2plIG1vZ8SFIHXFvHl3YcSHIHRlaiBvcGNqaSBkbyB1c3V3YW5pYSBsdWIgbW9keWZpa293YW5pYSBkYW55Y2ggcHJ6ZWdsxIVkYXJraS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRBbGFybSAoNTkyNDQwMTMyODgwMzYxNTE2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRBbGFybSAoNTk2Njk2NjU5ODE0OTg3NTA4MikgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDcxNTIxMjY1NTU5ODI3NTUzMiI+Ik1vZHlmaWtvd2FuaWUgdXByYXduaWXFhCBwcnplZ2zEhWRhcmtpIGRvdHljesSFY3ljaCBsb2thbGl6YWNqaSBnZW9ncmFmaWN6bmVqIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDAxMTkwODI4Mjk4MDg2MTY3OSI+IlplendhbGEgYXBsaWthY2ppIG5hIG1vZHlmaWtvd2FuaWUgdXByYXduaWXFhCBwcnplZ2zEhWRhcmtpIGRvdHljesSFY3ljaCBsb2thbGl6YWNqaSBnZW9ncmFmaWN6bmVqLiBaxYJvxZtsaXdlIGFwbGlrYWNqZSBtb2fEhSB1xbx5d2HEhyB0ZWogb3BjamkgZG8gd3lzecWCYW5pYSBpbmZvcm1hY2ppIG8gbG9rYWxpemFjamkgZG8gZG93b2xueWNoIHdpdHJ5biBpbnRlcm5ldG93eWNoLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbWVzc2FnZSIgbXNnaWQ9Ijc2NzM0NDY4NzEzOTE5NTc5MCI+IkN6eSBjaGNlc3osIGFieSB6YXBhbWnEmXRhxIcgdG8gaGFzxYJvIHcgcHJ6ZWdsxIVkYXJjZT8iPC9zdHJpbmc+CkBAIC03MzAsMTQgKzcxNiwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+Ilphem5hY3ogd3N6eXN0a28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+Ilphem5hY3ogd3lyYXoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iV3l0bmlqIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3BpdWoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJXa2xlaiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iS29waXVqIGFkcmVzIFVSTCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHRNb2RlIiBtc2dpZD0iNjczODU1NjM0ODg2MTM0NzI0MCI+Ilphem5hY3ogdGVrc3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4iWmF6bmFjemFuaWUgdGVrc3R1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iTWV0b2RhIHdwcm93YWR6YW5pYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJEb2RhaiB0ZXJtaW4g4oCePHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPuKAnSBkbyBzxYJvd25pa2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJFZHl0dWogdGVrc3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiJEemlhxYJhbmlhIG5hIHRla8WbY2llIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJNYcWCbyBtaWVqc2NhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iTWFsZWplIGlsb8WbxIcgZG9zdMSZcG5laiBwYW1pxJljaSB0ZWxlZm9udS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTc0NSw2ICs3MzEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQW51bHVqIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IlV3YWdhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJXY3p5dHl3YW5pZS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iV8WCxIVjeiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+Ild5xYLEhWN6Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJaYWtvxYRjeiBjenlubm/Fm8SHIGtvcnp5c3RhasSFYyB6Ijwvc3RyaW5nPgpAQCAtNzYzLDkgKzc1MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0iZm9yY2VfY2xvc2UiIG1zZ2lkPSIzNjUzNDE2MzE1NDUwODA2Mzk2Ij4iV3ltdcWbIHphbWtuacSZY2llIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+IlpnxYJvxZsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3YWl0IiBtc2dpZD0iNzE0NzExODIxNzIyNjMxNzczMiI+IkN6ZWthaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IkFwbGlrYWNqYSBwcnpla2llcm93YW5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiJBcGxpa2FjamEgPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBqZXN0IHVydWNob21pb25hLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iQXBsaWthY2phIDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gem9zdGHFgmEgcGllcndvdG5pZSB1cnVjaG9taW9uYS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iQXBsaWthY2phIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb2NlcyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIG5hcnVzennFgmEgd3ltdXN6b25lIHByemV6IHNpZWJpZSB6YXNhZHkgU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJQcm9jZXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IG5hcnVzennFgiB3eW11c3pvbmUgcHJ6ZXogc2llYmllIHphc2FkeSBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iRHppYcWCYSA8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTgxMiwyOCArODAyLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtc19zaG93X2FsbCIgbXNnaWQ9IjI2NzE3OTExNjM5MzMwOTExODAiPjxiPiJQb2thxbwgd3N6eXN0a28iPC9iPjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYWN0aXZpdHlfdGl0bGUiIG1zZ2lkPSIyMzk5Mjg5OTk5NjA4OTAwNDQzIj4iUGFtacSZxIcgbWFzb3dhIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3RpdGxlIiBtc2dpZD0iNTkwMTQ1OTA0MTM5ODc1MTQ5NSI+IlBvxYLEhWN6ZW5pZSBwcnpleiBVU0IiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0Nzk2NzU5NjQ2MTY3MjQ3MTc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjgyMzE0NjI3NTAwMTAwNjY4OTYiPiJUZWxlZm9uIHpvc3RhxYIgcG/FgsSFY3pvbnkgeiBrb21wdXRlcmVtIHphIHBvxZtyZWRuaWN0d2VtIFVTQi4gV3liaWVyeiBwb25pxbxzenkgcHJ6eWNpc2ssIGFieSBza29waW93YcSHIHBsaWtpIG1pxJlkenkga29tcHV0ZXJlbSBhIGthcnTEhSBTRCBzeXN0ZW11IEFuZHJvaWQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJUZWxlZm9uIHpvc3RhxYIgcG/FgsSFY3pvbnkgeiBrb21wdXRlcmVtIHphIHBvxZtyZWRuaWN0d2VtIFVTQi4gV3liaWVyeiBwb25pxbxzenkgcHJ6eWNpc2ssIGFieSBza29waW93YcSHIHBsaWtpIG1pxJlkenkga29tcHV0ZXJlbSBhIGthcnTEhSBTRCBzeXN0ZW11IEFuZHJvaWQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJUZWxlZm9uIHpvc3RhxYIgcG/FgsSFY3pvbnkgeiBrb21wdXRlcmVtIHphIHBvxZtyZWRuaWN0d2VtIFVTQi4gV3liaWVyeiBwb25pxbxzenkgcHJ6eWNpc2ssIGFieSBza29waW93YcSHIHBsaWtpIG1pxJlkenkga29tcHV0ZXJlbSBhIGthcnTEhSBTRCBzeXN0ZW11IEFuZHJvaWQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYnV0dG9uX21vdW50IiBtc2dpZD0iMTA1MjI1OTkzMDM2OTUwODIzNSI+IlfFgsSFY3ogbm/Fm25payBVU0IiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNTM0Nzg0NzUxNjAzMzQ1MzYzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQ4MTgzNDc3NTY0MDI3NDAyNjEiPiJXeXN0xIVwacWCIHByb2JsZW0geiB3eWtvcnp5c3RhbmllbSBrYXJ0eSBTRCBkbGEgcGFtacSZY2kgVVNCLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iV3lzdMSFcGnFgiBwcm9ibGVtIHogd3lrb3J6eXN0YW5pZW0ga2FydHkgU0QgZGxhIHBhbWnEmWNpIFVTQi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+Ild5c3TEhXBpxYIgcHJvYmxlbSB6IHd5a29yenlzdGFuaWVtIGthcnR5IFNEIGRsYSBwYW1pxJljaSBVU0IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODE3NTg5MjU1NDc1NzIxNjUyNSI+IlBvxYLEhWN6ZW5pZSBwcnpleiBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjczODAwODI0MDQyODgyMTkzNDEiPiJXeWJpZXJ6LCBhYnkgc2tvcGlvd2HEhyBwbGlraSBkby96IGtvbXB1dGVyYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMjMzNjA1ODM5NjY2MzUxNjAxNyI+Ild5xYLEhWN6IG5vxZtuaWsgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI1OTE4MTM0OTAyNjk4NDE1MzkiPiJXeWJpZXJ6LCBhYnkgd3nFgsSFY3p5xIcgbm/Fm25payBVU0IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF90aXRsZSIgbXNnaWQ9IjY2MDEyOTg1MTcwODc3NTg1MyI+Ik5vxZtuaWsgVVNCIHcgdcW8eWNpdSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MTM3MTMzOTY0MjY2MDQxMDQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NzQ1MzQ1MjYwNzgwMjY3MTg1Ij4iUHJ6ZWQgd3nFgsSFY3plbmllbSBub8WbbmlrYSBVU0IgdXBld25paiBzacSZLCDFvGUga2FydGEgU0Qgc3lzdGVtdSBBbmRyb2lkIHpvc3RhxYJhIG9kxYLEhWN6b25hICjigJ53eWrEmXRh4oCdKSBvZCBrb21wdXRlcmEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IlByemVkIHd5xYLEhWN6ZW5pZW0gbm/Fm25pa2EgVVNCIHVwZXduaWogc2nEmSwgxbxlIGthcnRhIFNEIHN5c3RlbXUgQW5kcm9pZCB6b3N0YcWCYSBvZMWCxIVjem9uYSAo4oCed3lqxJl0YeKAnSkgb2Qga29tcHV0ZXJhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJQcnplZCB3ecWCxIVjemVuaWVtIG5vxZtuaWthIFVTQiB1cGV3bmlqIHNpxJksIMW8ZSBrYXJ0YSBTRCBzeXN0ZW11IEFuZHJvaWQgem9zdGHFgmEgb2TFgsSFY3pvbmEgKOKAnnd5asSZdGHigJ0pIG9kIGtvbXB1dGVyYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjcwNjAyMTgwMzQ5MDA2OTYwMjkiPiJXecWCxIVjeiBub8WbbmlrIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjE0Mzg4MTkxNDg0MDQxMjEwOCI+Ild5c3TEhXBpxYIgcHJvYmxlbSBwb2RjemFzIHd5xYLEhWN6YW5pYSBub8WbbmlrYSBVU0IuIFVwZXduaWogc2nEmSwgxbxlIGhvc3QgVVNCIHpvc3RhxYIgb2TFgsSFY3pvbnksIGEgbmFzdMSZcG5pZSBzcHLDs2J1aiBwb25vd25pZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGl0bGUiIG1zZ2lkPSI5NjMwMzkwMzM0NzA0Nzg2OTciPiJXxYLEhWN6IG5vxZtuaWsgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RleHQiIG1zZ2lkPSIzMjAyODM4MjM0NzgwNTA1ODg2Ij4iUG8gd8WCxIVjemVuaXUgbm/Fm25pa2EgVVNCIG5pZWt0w7NyZSB1xbx5d2FuZSBhcGxpa2FjamUgem9zdGFuxIUgemF0cnp5bWFuZSBpIG1vZ8SFIGJ5xIcgbmllZG9zdMSZcG5lIGRvIGNod2lsaSB3ecWCxIVjemVuaWEgbm/Fm25pa2EgVVNCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19lcnJvcl90aXRsZSIgbXNnaWQ9IjgwNDg5OTk5NzM4MzczMzkxNzQiPiJPcGVyYWNqYSBVU0IgbmllIHBvd2lvZMWCYSBzacSZIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX29rIiBtc2dpZD0iNzM3Njk1MzE2NzAzOTg2NTcwMSI+Ik9LIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODY2MzI0NzkyOTU1MTA5NTg1NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY1Nzc5MDgwMDY5NDk3NDIyMTciPiJGb3JtYXR1aiBrYXJ0xJkgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4NjYzMjQ3OTI5NTUxMDk1ODU0Ij4iRm9ybWF0dWoga2FydMSZIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYyMTM2OTk2MjQzMzUyMzYxOSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzQ3MDgxNTE0MDA2ODUwMjgyNCI+IkN6eSBuYSBwZXdubyBzZm9ybWF0b3dhxIcga2FydMSZIFNEPyBXc3p5c3RraWUgZGFuZSBuYSBrYXJjaWUgem9zdGFuxIUgdXRyYWNvbmUuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4iQ3p5IG5hIHBld25vIHNmb3JtYXRvd2HEhyBrYXJ0xJkgU0Q/IFdzenlzdGtpZSBkYW5lIG5hIGthcmNpZSB6b3N0YW7EhSB1dHJhY29uZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIG1zZ2lkPSI4NjYzMjQ3OTI5NTUxMDk1ODU0Ij4iRm9ybWF0dWoga2FydMSZIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4iQ3p5IG5hIHBld25vIHNmb3JtYXRvd2HEhyBrYXJ0xJkgU0Q/IFdzenlzdGtpZSBkYW5lIG5hIGthcmNpZSB6b3N0YW7EhSB1dHJhY29uZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfYnV0dG9uX2Zvcm1hdCIgbXNnaWQ9IjQxMzEwNjQ1NjAxMjc0Nzg2OTUiPiJGb3JtYXR1aiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTA0NDc3ODk0OTE4OTkxOCI+IlBvZMWCxIVjem9ubyBtb2R1xYIgZGVidWdvd2FuaWEgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9Ijg0NzAyOTY4MTgyNzAxMTAzOTYiPiJXeWJpZXJ6LCBhYnkgd3nFgsSFY3p5xIcgZGVidWdvd2FuaWUgVVNCLiI8L3N0cmluZz4KQEAgLTg0MSwyOSArODI2LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9hbHBoYWJldCIgbXNnaWQ9IjU0MzMyNzU0ODU0OTkwMzkxOTkiPiIgQcSEQkPEhkRFxJhGR0hJSktMxYFNTsWDT8OTUFFSU8WaVFVWV1hZWsW5xbsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9udW1lcmljX2FscGhhYmV0IiBtc2dpZD0iNDAzMDE3MDUyNDU5NTEyMzYxMCI+IiAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYW5kaWRhdGVzX3N0eWxlIiBtc2dpZD0iNDMzMzkxMzA4OTYzNzA2MjI1NyI+PHU+ImthbmR5ZGFjaSI8L3U+PC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NDU3NjAzNDE4OTcwOTk0MDUwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQyMzk1MTY2NzUwMjg0Mzg5OTciPiJQcnp5Z290b3d5d2FuaWUga2FydHkgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IlByenlnb3Rvd3l3YW5pZSBrYXJ0eSBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4iUHJ6eWdvdG93eXdhbmllIGthcnR5IFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODI4NzMxOTg4MjkyNjczNzA1MyI+IlNwcmF3ZHphbmllIHcgcG9zenVraXdhbml1IGLFgsSZZMOzdy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3ODA0Nzc4MzgyNDEyMTI5OTcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzOTM3MzQ1NTc3OTgzNzMwODczIj4iUHVzdGEga2FydGEgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI3ODA0Nzc4MzgyNDEyMTI5OTciPiJQdXN0YSBrYXJ0YSBTRCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDEzMTIyNjY4MjAwOTI5NTgwMTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE2MDY2NjA3NTYxMjQ2Mjk3MDgiPiJLYXJ0YSBTRCBqZXN0IHB1c3RhIGx1YiB1xbx5d2Egbmllb2JzxYJ1Z2l3YW5lZ28gc3lzdGVtdSBwbGlrw7N3LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IkthcnRhIFNEIGplc3QgcHVzdGEgbHViIHphd2llcmEgbmllb2JzxYJ1Z2l3YW55IHN5c3RlbSBwbGlrw7N3LiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY0MTA3MjM5MDYwMTkxMDAxODkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTcyNDYxOTkwMjA3NjUyODg4OSI+IlVzemtvZHpvbmEga2FydGEgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjQxMDcyMzkwNjAxOTEwMDE4OSI+IlVzemtvZHpvbmEga2FydGEgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNjc5NDEyODg0MjkwMDYxNzc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjQ2MDMxMTgzNTEzMDY3MTE5NCI+IkthcnRhIFNEIGplc3QgdXN6a29kem9uYS4gS29uaWVjem5lIG1vxbxlIGJ5xIcgcHJ6ZWZvcm1hdG93YW5pZSBrYXJ0eS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iS2FydGEgU0QgamVzdCB1c3prb2R6b25hLiBLb25pZWN6bmUgbW/FvGUgYnnEhyBwb25vd25lIHNmb3JtYXRvd2FuaWUuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjg3MjE1Mjg4MjYwNDQwNzgzNyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI1ODIxNzUwMTYwNjA0MzIwMzQiPiJLYXJ0YSBTRCB6b3N0YcWCYSBuaWVvY3pla2l3YW5pZSB3eWrEmXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjg3MjE1Mjg4MjYwNDQwNzgzNyI+IkthcnRhIFNEIHpvc3RhxYJhIG5pZW9jemVraXdhbmllIHd5asSZdGEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3MjYwMTgzMjkzNzQ3NDQ4MjQxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyMDA1Mzk2NDY0NDk0NjQ4OTM3Ij4iT2TFgsSFY3oga2FydMSZIFNEIHByemVkIGplaiB3eWrEmWNpZW0sIGFieSB1bmlrbsSFxIcgdXRyYXR5IGRhbnljaC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiJPZMWCxIVjeiBrYXJ0xJkgU0QgcHJ6ZWQgamVqIHd5asSZY2llbSwgYWJ5IHVuaWtuxIXEhyB1dHJhdHkgZGFueWNoLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY3Mjk4MDExMzA3OTA2MTYyMDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM2NTI1ODgxMDE4Njc5NTE1Ij4iTW/FvG5hIGJlenBpZWN6bmllIHVzdW7EhcSHIGthcnTEmSBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+Ik1vxbxuYSBiZXpwaWVjem5pZSB1c3VuxIXEhyBrYXJ0xJkgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3NjEzOTYwNjg2NzQ3NTkyNzcwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijc1MDM3NjkxMDYyODUxODg3MDMiPiJNb8W8bmEgdGVyYXogYmV6cGllY3puaWUgdXN1bsSFxIcga2FydMSZIFNELiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiJNb8W8ZXN6IGJlenBpZWN6bmllIHd5asSFxIcga2FydMSZIFNELiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg5MDI1MTgwMzA0MDQzODEzMTggLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxODc0ODg5NzY0MzY3MDg1NTYyIj4iVXN1bmnEmXRhIGthcnRhIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IlVzdW5pxJl0YSBrYXJ0YSBTRCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQyMDUxMTcyMjczNDI4MjIyNzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI3MzA4OTA0NDEzMzEzNDQ3NzYiPiJLYXJ0YSBTRCB6b3N0YcWCYSB1c3VuacSZdGEuIFfFgsOzxbwgbm93xIUga2FydMSZIFNELCBhYnkgendpxJlrc3p5xIcgcGFtacSZxIcgdXJ6xIVkemVuaWEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iS2FydGEgU0Qgem9zdGHFgmEgd3lqxJl0YS4gV8WCw7PFvCBub3fEhSBrYXJ0xJkuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iUHVzdGEga2FydGEgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJLYXJ0YSBTRCBqZXN0IHB1c3RhIGx1YiB6YXdpZXJhIG5pZW9ic8WCdWdpd2FueSBzeXN0ZW0gcGxpa8Ozdy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjQxMDcyMzkwNjAxOTEwMDE4OSI+IlVzemtvZHpvbmEga2FydGEgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iS2FydGEgU0QgamVzdCB1c3prb2R6b25hLiBLb25pZWN6bmUgbW/FvGUgYnnEhyBwb25vd25lIHNmb3JtYXRvd2FuaWUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjg3MjE1Mjg4MjYwNDQwNzgzNyI+IkthcnRhIFNEIHpvc3RhxYJhIG5pZW9jemVraXdhbmllIHd5asSZdGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiJPZMWCxIVjeiBrYXJ0xJkgU0QgcHJ6ZWQgamVqIHd5asSZY2llbSwgYWJ5IHVuaWtuxIXEhyB1dHJhdHkgZGFueWNoLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+Ik1vxbxuYSBiZXpwaWVjem5pZSB1c3VuxIXEhyBrYXJ0xJkgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4iTW/FvGVzeiBiZXpwaWVjem5pZSB3eWrEhcSHIGthcnTEmSBTRC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4OTAyNTE4MDMwNDA0MzgxMzE4Ij4iVXN1bmnEmXRhIGthcnRhIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iS2FydGEgU0Qgem9zdGHFgmEgd3lqxJl0YS4gV8WCw7PFvCBub3fEhSBrYXJ0xJkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfbGlzdF9lbXB0eSIgbXNnaWQ9IjQxNjg4MjA2MDk0MDMzODU3ODkiPiJOaWUgem5hbGV6aW9ubyBwYXN1asSFY3ljaCBkemlhxYJhxYQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4Nzg3MzUyMDc0MzI2NzQ4ODkyIj4iYWt0dWFsaXpvd2FuaWUgc3RhdHlzdHlrIHXFvHljaWEga29tcG9uZW50dSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4OTE1NTM2OTU3MTY3NTI4MzUiPiJaZXp3YWxhIG5hIG1vZHlmaWthY2plIHplYnJhbnljaCBzdGF0eXN0eWsgdcW8eWNpYSBrb21wb25lbnR1LiBOaWVwcnplem5hY3pvbmUgZGxhIHp3eWvFgnljaCBhcGxpa2FjamkuIjwvc3RyaW5nPgpAQCAtODk4LDE1ICs4NzIsMjQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJTaWXEhyBWUE4gTDJUUC9JUFNlYyB6IGtsdWN6ZW0gUFNLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlNpZcSHIFZQTiBMMlRQL0lQU2VjIHogY2VydHlmaWthdGVtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iV3liaWVyeiBwbGlrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iTmllIHd5YnJhbm8gcGxpa3UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJSZXNldHVqIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IlByemXFm2xpaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4idWx1YmlvbmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJUcnliIHNhbW9jaG9kb3d5IHfFgsSFY3pvbnkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iV3liaWVyeiwgYWJ5IHpha2/FhGN6ecSHIHRyeWIgc2Ftb2Nob2Rvd3kuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+Ikplc3QgYWt0eXduZSBwb3dpxIV6YW5pZSBsdWIgcHVua3QgZG9zdMSZcHUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJEb3RrbmlqLCBhYnkgc2tvbmZpZ3Vyb3dhxIciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJXcsOzxIciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJEYWxlaiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+IlBvbWnFhCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+Ild5c29raSBwb3ppb20gdcW8eWNpYSBkYW55Y2giPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IkRvdGtuaWosIGFieSB6b2JhY3p5xIcgc3RhdHlzdHlraSBwcnplc3nFgnUgZGFueWNoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJQcnpla3JvY3pvbm8gbGltaXQgZGFueWNoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNDcxMjM2OTg1NjYwMTI3NTE0NiI+IkRvdGtuaWosIGFieSB6b2JhY3p5xIcgc3RhdHlzdHlraSBwcnplc3nFgnUgZGFueWNoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fbWF0Y2hlcyIgbXNnaWQ9IjgxMjk0MjE5MDg5MTU4NDA3MzciPiJCcmFrIHd5bmlrw7N3Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZmluZF9vbl9wYWdlIiBtc2dpZD0iMTk0Njc5OTIzMzgyMjgyMDM4NCI+IlpuYWpkxbogbmEgc3Ryb25pZSI8L3N0cmluZz4KKyAgPHBsdXJhbHMgbmFtZT0ibWF0Y2hlc19mb3VuZCI+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im9uZSIgbXNnaWQ9IjgxNjcxNDcwODExMzY1Nzk0MzkiPiIxIHd5bmlrIjwvaXRlbT4KKyAgICA8aXRlbSBxdWFudGl0eT0ib3RoZXIiIG1zZ2lkPSI0NjQxODcyNzk3MDY3NjA5MTc3Ij4iPHhsaWZmOmcgaWQ9IklOREVYIj4lZDwveGxpZmY6Zz4geiA8eGxpZmY6ZyBpZD0iVE9UQUwiPiVkPC94bGlmZjpnPiI8L2l0ZW0+CisgIDwvcGx1cmFscz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbAppbmRleCA4OTJhZWZkLi5kYzc2MmQxIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbApAQCAtMTY5LDggKzE2OSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfZGV2ZWxvcG1lbnRUb29scyIgbXNnaWQ9IjM0NDYxNjQ1ODQ3MTA1OTY1MTMiPiJGZXJyYW1lbnRhcyBkZSBkZXNlbnZvbHZpbWVudG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSI5MDU2NDMxMTkzODkzODA5ODE0Ij4iRnVuY2lvbmFsaWRhZGVzIGFwZW5hcyBuZWNlc3PDoXJpYXMgcGFyYSBwcm9ncmFtYWRvcmVzIGRlIGFwbGljYcOnw7Vlcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfc3RvcmFnZSIgbXNnaWQ9IjE5NzExMTg3NzA1NDYzMzY5NjYiPiJBcm1hemVuYW1lbnRvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTIwMzMwMjIxNDkxNTM1NTc3NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjU0NTU4MDQzNTMyMjA1ODEzMTIiPiJBY2VkZXIgYW8gY2FydMOjbyBTRC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4iQWNlZGVyIGFvIGNhcnTDo28gU0QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IkFjZWRlciBhbyBjYXJ0w6NvIFNELiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyIiBtc2dpZD0iNzQxNzE5MjYyOTYwMTg5MDc5MSI+ImRlc2FjdGl2YXIgb3UgbW9kaWZpY2FyIGJhcnJhIGRlIGVzdGFkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3N0YXR1c0JhciIgbXNnaWQ9IjEzNjU0NzM1OTUzMzE5ODk3MzIiPiJQZXJtaXRlIMOgIGFwbGljYcOnw6NvIGRlc2FjdGl2YXIgYSBiYXJyYSBkZSBlc3RhZG8gb3UgYWRpY2lvbmFyIGUgcmVtb3ZlciDDrWNvbmVzIGRvIHNpc3RlbWEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXJTZXJ2aWNlIiBtc2dpZD0iNzI0NzI4MTkxMTM4NzkzMTQ4NSI+ImJhcnJhIGRlIGVzdGFkbyI8L3N0cmluZz4KQEAgLTI2Nyw4ICsyNjYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NsZWFyQXBwQ2FjaGUiIG1zZ2lkPSI3NzQwNDY1Njk0MTkzNjcxNDAyIj4iUGVybWl0ZSBhIHVtYSBhcGxpY2HDp8OjbyBsaWJlcnRhciBlc3Bhw6dvIGRlIGFybWF6ZW5hbWVudG8gbm8gdGVsZWZvbmUgZWxpbWluYW5kbyBmaWNoZWlyb3Mgbm8gZGlyZWN0w7NyaW8gZGEgY2FjaGUgZGEgYXBsaWNhw6fDo28uIEdlcmFsbWVudGUsIG8gYWNlc3NvIMOpIG11aXRvIGxpbWl0YWRvIHBhcmEgcHJvY2Vzc2FtZW50byBkbyBzaXN0ZW1hLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbW92ZVBhY2thZ2UiIG1zZ2lkPSI3Mjg0NTQ5Nzk5NDY1MDM5MjYiPiJNb3ZlciByZWN1cnNvcyBkZSBhcGxpY2HDp8O1ZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19tb3ZlUGFja2FnZSIgbXNnaWQ9IjYzMjMwNDkyOTE5MjM5MjUyNzciPiJQZXJtaXRlIHF1ZSB1bWEgYXBsaWNhw6fDo28gbW92YSByZWN1cnNvcyBkZSBhcGxpY2HDp8O1ZXMgZGUgbWVpb3MgaW50ZXJub3MgcGFyYSBtZWlvcyBleHRlcm5vcyBlIHZpY2UtdmVyc2EuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDgxMTkyMTcwMzg4MjUzMjA3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkTG9ncyIgbXNnaWQ9IjY2MTU3Nzg1NDMxOTg5Njc2MTQiPiJsZXIgZmljaGVpcm9zIGRlIHJlZ2lzdG8gZG8gc2lzdGVtYSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIyNTc5Mzc5NTU1ODA0NzU5MDIgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+IlBlcm1pdGUgYSB1bWEgYXBsaWNhw6fDo28gbGVyIGEgcGFydGlyIGRvcyBkaXZlcnNvcyBmaWNoZWlyb3MgZGUgcmVnaXN0byBkbyBzaXN0ZW1hLiBJc3RvIHBlcm1pdGUgZGVzY29icmlyIGluZm9ybWHDp8O1ZXMgZ2VyYWlzIHNvYnJlIGEgZm9ybWEgY29tbyBvIHV0aWxpemFkb3IgdXNhIG8gdGVsZWZvbmUsIG1hcyBlc3RhcyBuw6NvIGRldmVtIGNvbnRlciBxdWFpc3F1ZXIgZGFkb3MgcGVzc29haXMgb3UgcHJpdmFkb3MuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZExvZ3MgKDY2MTU3Nzg1NDMxOTg5Njc2MTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZExvZ3MgKDg4OTY0NDk0Mzc0NjQ4Njc3NjYpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2RpYWdub3N0aWMiIG1zZ2lkPSI4MDc2NzQzOTUzOTA4MDAwMzQyIj4ibGVyL2VzY3JldmVyIGVtIHJlY3Vyc29zIHByb3ByaWVkYWRlIGRlIGRpYWciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaWFnbm9zdGljIiBtc2dpZD0iMzEyMTIzODM3Mzk1MTYzNzA0OSI+IlBlcm1pdGUgYSB1bWEgYXBsaWNhw6fDo28gbGVyIGUgZXNjcmV2ZXIgZW0gcXVhbHF1ZXIgcmVjdXJzbyBxdWUgc2VqYSBwcm9wcmllZGFkZSBkbyBncnVwbyBkaWFnLiBQb3IgZXhlbXBsbywgZmljaGVpcm9zIGVtIC9kZXYuIElzdG8gcG9kZSBhZmVjdGFyIHBvdGVuY2lhbG1lbnRlIGEgZXN0YWJpbGlkYWRlIGUgYSBzZWd1cmFuw6dhIGRvIHNpc3RlbWEgZSBkZXZlIHNlciB1dGlsaXphZG8gQVBFTkFTIHBhcmEgZGlhZ27Ds3N0aWNvcyBlc3BlY8OtZmljb3MgZG8gaGFyZHdhcmUgcGVsbyBmYWJyaWNhbnRlIG91IHBlbG8gb3BlcmFkb3IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VDb21wb25lbnRTdGF0ZSIgbXNnaWQ9Ijc5NDI1MTk4ODM0MzI5NDA2Ij4iYWN0aXZhciBvdSBkZXNhY3RpdmFyIGNvbXBvbmVudGVzIGRhIGFwbGljYcOnw6NvIjwvc3RyaW5nPgpAQCAtNDAzLDIyICs0MDQsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoQWRtaW4iIG1zZ2lkPSI3MjU2Mjg5Nzc0NjY3MDU0NTU1Ij4iUGVybWl0ZSBhIHVtYSBhcGxpY2HDp8OjbyBjb25maWd1cmFyIG8gdGVsZWZvbmUgQmx1ZXRvb3RoIGxvY2FsLCBiZW0gY29tbyBkZXNjb2JyaXIgZSBlbXBhcmVsaGFyIGNvbSBkaXNwb3NpdGl2b3MgcmVtb3Rvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2JsdWV0b290aCIgbXNnaWQ9IjgzNjEwMzg3MDc4NTcwMTg3MzIiPiJjcmlhciBsaWdhw6fDtWVzIEJsdWV0b290aCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aCIgbXNnaWQ9Ijc2MjUxNTM4MDY3OTM5Mjk0NSI+IlBlcm1pdGUgYSB1bWEgYXBsaWNhw6fDo28gdmVyIGEgY29uZmlndXJhw6fDo28gZG8gdGVsZWZvbmUgQmx1ZXRvb3RoIGxvY2FsLCBiZW0gY29tbyBlZmVjdHVhciBlIGFjZWl0YXIgbGlnYcOnw7VlcyBjb20gZGlzcG9zaXRpdm9zIGVtcGFyZWxoYWRvcy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNBZG1pbiAoMjI1MTMwMjIzMzAxMjI1MDA1NikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNBZG1pbiAoMTkzNTg0MjYxMTQ2NDg5NTc4NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY1JhdyAoNDQyMzQ3MTcxMTExNDMyNTcwOCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNSYXcgKDU1MzMwMjI3MzY1NTkzODU2NjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNOb3RpZnkgKDQ3ODQ3MDM2MDA4Mjc5MjM1OCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNOb3RpZnkgKDI5OTAwNTM1MTc5NjIwNzA2MTcpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNMbGNwICg0OTcyMDUxNDYxMDA3MDMwNDI2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0xsY3AgKDkxNTkyMTI3Nzg2MDA0NjQwKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSI0OTc3NDA2MTY0MzExNTM1MDkyIj4iZGVzYWN0aXZhciBibG9xdWVpbyBkZSB0ZWNsYXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSIzMTg5NzYzNDc5MzI2MzAyMDE3Ij4iUGVybWl0ZSBhIHVtYSBhcGxpY2HDp8OjbyBkZXNhY3RpdmFyIG8gYmxvcXVlaW8gZGUgdGVjbGFzIGUgcXVhbHF1ZXIgc2VndXJhbsOnYSBwb3IgcGFsYXZyYS1wYXNzZSBhc3NvY2lhZGEuIFVtIGV4ZW1wbG8gbGVnw610aW1vIMOpIGEgZGVzYWN0aXZhw6fDo28gZG8gYmxvcXVlaW8gZGUgdGVjbGFzIHBlbG8gdGVsZWZvbmUgYW8gcmVjZWJlciB1bWEgY2hhbWFkYSwgcmVhY3RpdmFuZG8sIGVtIHNlZ3VpZGEsIG8gYmxvcXVlaW8gZGUgdGVjbGFzIGFvIHRlcm1pbmFyIGEgY2hhbWFkYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRTeW5jU2V0dGluZ3MiIG1zZ2lkPSI2MjAxODEwMDA4MjMwNTAzMDUyIj4ibGVyIGRlZmluacOnw7VlcyBkZSBzaW5jcm9uaXphw6fDo28iPC9zdHJpbmc+CkBAIC00MzUsMjIgKzQyMCwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSIxMDgyOTcyNjAzNTc2MzYwNjkwIj4iUGVybWl0ZSBhIHVtYSBhcGxpY2HDp8OjbyBsZXIgcXVhaXNxdWVyIHBhbGF2cmFzLCBub21lcyBlIGV4cHJlc3PDtWVzIHByaXZhZGFzIHF1ZSBvIHV0aWxpemFkb3IgcG9zc2EgdGVyIGFybWF6ZW5hZG8gbm8gZGljaW9uw6FyaW8gZG8gdXRpbGl6YWRvci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjY3MDMxMDk1MTE4MzYzNDMzNDEiPiJlc2NyZXZlciBubyBkaWNpb27DoXJpbyBkZWZpbmlkbyBwZWxvIHV0aWxpemFkb3IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjQxMjU2MjA2NTI0MDgyODgwIj4iUGVybWl0ZSBhIHVtYSBhcGxpY2HDp8OjbyBlc2NyZXZlciBub3ZhcyBwYWxhdnJhcyBubyBkaWNpb27DoXJpbyBkbyB1dGlsaXphZG9yLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDgwNzk0MDM3NTkwMDE3NzcyOTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iOTkzNzA3NDM2OTQxMDE2OTEzIj4ibW9kaWZpY2FyL2VsaW1pbmFyIGNvbnRlw7pkbyBkbyBjYXJ0w6NvIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJtb2RpZmljYXIvZWxpbWluYXIgY29udGXDumRvIGRvIGNhcnTDo28gU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NjQzOTYzMjA0OTc2NDcxODc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MTMxODcxNTQxMTI3MjExNTI2Ij4iUGVybWl0ZSBxdWUgdW1hIGFwbGljYcOnw6NvIGVzY3JldmEgbm8gY2FydMOjbyBTRC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiJQZXJtaXRlIHF1ZSB1bWEgYXBsaWNhw6fDo28gZXNjcmV2YSBubyBjYXJ0w6NvIFNELiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4ibW9kaWZpY2FyL2VsaW1pbmFyIGNvbnRlw7pkbyBkbyBjYXJ0w6NvIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4iUGVybWl0ZSBxdWUgdW1hIGFwbGljYcOnw6NvIGVzY3JldmEgbm8gY2FydMOjbyBTRC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSI1NjU2NDg3MjY0ODE5NjY5ODI0Ij4iYWNlZGVyIGFvIHNpc3RlbWEgZGUgZmljaGVpcm9zIGRhIGNhY2hlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjE2MjQ3MzQ1Mjg0MzU2NTk5MDYiPiJQZXJtaXRlIGEgdW1hIGFwbGljYcOnw6NvIGxlciBlIGVzY3JldmVyIG5vIHNpc3RlbWEgZGUgZmljaGVpcm9zIGRhIGNhY2hlLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQzMDc4NjE0OTYzMDI4NTAyMDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDQ5NzQyMDcyODg1NzU4NTc5MSI+IkxpbWl0YXIgcGFsYXZyYS1wYXNzZSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE3MTk4NzcyNDU2OTIzMTgyOTkgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjkwODM0MDAwODA4NjE3MjgwNTYiPiJSZXN0cmluamEgb3MgdGlwb3MgZGUgcGFsYXZyYXMtcGFzc2UgcXVlIGVzdMOhIGF1dG9yaXphZG8gYSB1dGlsaXphci4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3Mzc0NzgwNzEyNjY0Mjg1MzIxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjkxNDEzMDY0Njk0MjE5OTUwMyI+IlZlciB0ZW50YXRpdmFzIGRlIGluw61jaW8gZGUgc2Vzc8OjbyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE5NjEyNTExNzk2MjQ4NDM0ODMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjcyMjc1NzgyNjAxNjUxNzI2NzMiPiJPIG1vbml0b3IgZmFsaG91IGFzIHRlbnRhdGl2YXMgZGUgaW5pY2lhciBzZXNzw6NvIG5vIGRpc3Bvc2l0aXZvIHBhcmEgZWZlY3R1YXIgYWxndW1hcyBhY8Onw7Vlcy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MDg0NzcyMDkwNzk3NDg1NDIwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjI2MjAwNzcxOTEyNDI2ODg5NTUiPiJSZXBvciBwYWxhdnJhLXBhc3NlIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzMzMjE2NzYwMDMzMTc5OTk5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iNTM5MTI0MDYxNjk4MTI5NzM2MSI+IkZvcmNlIGEgcGFsYXZyYS1wYXNzZSBwYXJhIHVtIG5vdm8gdmFsb3IsIHNlbmRvIG5lY2Vzc8OhcmlvIHF1ZSBvIGFkbWluaXN0cmFkb3IgbGhvIGZvcm5lw6dhIGFudGVzIGRlIHBvZGVyIGluaWNpYXIgc2Vzc8Ojby4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NzYwNDY2MDI1MjQ3NjM0NDg4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iMjI3NDA4NTM4NDcwNDI0ODQzMSI+IkZvcsOnYXIgYmxvcXVlaW8iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyODE5ODY4NjY0OTQ2MDg5NzQwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjU2OTY5NjQxMjYyMjYwMjg0NDIiPiJDb250cm9sZSBxdWFuZG8gbyBkaXNwb3NpdGl2byDDqSBibG9xdWVhZG8sIHNlbmRvIG5lY2Vzc8OhcmlvIHJlaW50cm9kdXppciBhIHJlc3BlY3RpdmEgcGFsYXZyYS1wYXNzZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQzMDc4NjE0OTYzMDI4NTAyMDEiPiJMaW1pdGFyIHBhbGF2cmEtcGFzc2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSIxNzE5ODc3MjQ1NjkyMzE4Mjk5Ij4iUmVzdHJpbmphIG9zIHRpcG9zIGRlIHBhbGF2cmFzLXBhc3NlIHF1ZSBlc3TDoSBhdXRvcml6YWRvIGEgdXRpbGl6YXIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI3Mzc0NzgwNzEyNjY0Mjg1MzIxIj4iVmVyIHRlbnRhdGl2YXMgZGUgaW7DrWNpbyBkZSBzZXNzw6NvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iMTk2MTI1MTE3OTYyNDg0MzQ4MyI+Ik8gbW9uaXRvciBmYWxob3UgYXMgdGVudGF0aXZhcyBkZSBpbmljaWFyIHNlc3PDo28gbm8gZGlzcG9zaXRpdm8gcGFyYSBlZmVjdHVhciBhbGd1bWFzIGFjw6fDtWVzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iOTA4NDc3MjA5MDc5NzQ4NTQyMCI+IlJlcG9yIHBhbGF2cmEtcGFzc2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIzMzMyMTY3NjAwMzMxNzk5OTkxIj4iRm9yY2UgYSBwYWxhdnJhLXBhc3NlIHBhcmEgdW0gbm92byB2YWxvciwgc2VuZG8gbmVjZXNzw6FyaW8gcXVlIG8gYWRtaW5pc3RyYWRvciBsaG8gZm9ybmXDp2EgYW50ZXMgZGUgcG9kZXIgaW5pY2lhciBzZXNzw6NvLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSI1NzYwNDY2MDI1MjQ3NjM0NDg4Ij4iRm9yw6dhciBibG9xdWVpbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkNvbnRyb2xlIHF1YW5kbyBvIGRpc3Bvc2l0aXZvIMOpIGJsb3F1ZWFkbywgc2VuZG8gbmVjZXNzw6FyaW8gcmVpbnRyb2R1emlyIGEgcmVzcGVjdGl2YSBwYWxhdnJhLXBhc3NlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJBcGFnYXIgdG9kb3Mgb3MgZGFkb3MiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyMzE0MDYwOTMzNzk2Mzk2MjA1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iNzY2OTg5NTMzMzgxNDIyMjU4NiI+IkVmZWN0dWUgdW1hIHJlcG9zacOnw6NvIGRlIGbDoWJyaWNhLCBlbGltaW5hbmRvIHRvZG9zIG9zIGRhZG9zIHNlbSBxdWFscXVlciBjb25maXJtYcOnw6NvLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iRWZlY3R1ZSB1bWEgcmVwb3Npw6fDo28gZGUgZsOhYnJpY2EsIGVsaW1pbmFuZG8gdG9kb3Mgb3MgZGFkb3Mgc2VtIHF1YWxxdWVyIGNvbmZpcm1hw6fDo28uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkiIG1zZ2lkPSI2Mzg3NDk3NDY2NjYwMTU0OTMxIj4iRGVmaW5pciBvIHByb3h5IGdsb2JhbCBkbyBkaXNwb3NpdGl2byBhIHNlciB1dGlsaXphZG8gcXVhbmRvIGEgcG9sw610aWNhIGVzdGl2ZXIgYWN0aXZhZGEuIFPDsyBvIHByaW1laXJvIGFkbWluaXN0cmFkb3IgZG8gZGlzcG9zaXRpdm8gZGVmaW5lIG8gcHJveHkgZ2xvYmFsIGVmZWN0aXZvLiI8L3N0cmluZz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IlJlc2lkw6puY2lhIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTcOzdmVsIjwvaXRlbT4KQEAgLTU1MiwxMCArNTM4LDkgQEAKICAgICA8c2tpcCAvPgogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlT3RoZXIgKDQ0MDg0MzYxNjI5NTAxMTk4NDkpIC0tPgogICAgIDxza2lwIC8+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4iYXRyYXbDqXMgZG8gPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiBhdHJhdsOpcyBkZSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IkludHJvZHV6aXIgY8OzZGlnbyBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IkludHJvZHV6YSBhIHBhbGF2cmEtcGFzc2UgcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iSW50cm9kdXphIG8gUElOIHBhcmEgZGVzYmxvcXVlYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJDw7NkaWdvIFBJTiBpbmNvcnJlY3RvISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJQYXJhIGRlc2Jsb3F1ZWFyLCBwcmltYSBNZW51IGUsIGVtIHNlZ3VpZGEsIDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik7Dum1lcm8gZGUgZW1lcmfDqm5jaWEiPC9zdHJpbmc+CkBAIC01NjgsNiArNTUzLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iUmVncmVzc2FyIMOgIGNoYW1hZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJDb3JyZWN0byEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iTGFtZW50YW1vcywgdGVudGUgbm92YW1lbnRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJMYW1lbnRhbW9zLCB0ZW50ZSBub3ZhbWVudGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJBIGNhcnJlZ2FyICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJDYXJyZWdhZG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01ODIsNiArNTY4LDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+Ik8gY2FydMOjbyBTSU0gZXN0w6EgYmxvcXVlYWRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IkEgZGVzYmxvcXVlYXIgY2FydMOjbyBTSU0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJFZmVjdHVvdSBpbmNvcnJlY3RhbWVudGUgbyBzZXUgcGFkcsOjbyBkZSBkZXNibG9xdWVpbyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZXplcy4gIlxuXG4iVGVudGUgbm92YW1lbnRlIGRlbnRybyBkZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJJbnRyb2R1eml1IGluY29ycmVjdGFtZW50ZSBhIHBhbGF2cmEtcGFzc2UgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmV6ZXMuICJcblxuIlRlbnRlIG5vdmFtZW50ZSBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IkludHJvZHV6aXUgaW5jb3JyZWN0YW1lbnRlIG8gUElOIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlemVzLiAiXG5cbiJUZW50ZSBub3ZhbWVudGUgZGVudHJvIGRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iRWZlY3R1b3UgaW5jb3JyZWN0YW1lbnRlIG8gc2V1IHBhZHLDo28gZGUgZGVzYmxvcXVlaW8gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmV6ZXMuIEFww7NzIG91dHJhcyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiB0ZW50YXRpdmFzIHNlbSBzdWNlc3NvLCBzZXItbGhlLcOhIHBlZGlkbyBwYXJhIGRlc2Jsb3F1ZWFyIG8gdGVsZWZvbmUgdXRpbGl6YW5kbyBvIHNldSBpbsOtY2lvIGRlIHNlc3PDo28gbm8gR29vZ2xlLiJcblxuIiBUZW50ZSBub3ZhbWVudGUgZGVudHJvIGRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJUZW50ZSBub3ZhbWVudGUgZGVudHJvIGRlIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkVzcXVlY2V1LXNlIGRvIHBhZHLDo28/Ijwvc3RyaW5nPgpAQCAtNjEwLDE0ICs1OTgsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ19iZWZvcmVfdW5sb2FkIiBtc2dpZD0iMTkwMTY3NTQ0ODE3OTY1MzA4OSI+Ik5hdmVnYXIgcGFyYSBvdXRyYSBww6FnaW5hPyJcblxuIjx4bGlmZjpnIGlkPSJNRVNTQUdFIj4lczwveGxpZmY6Zz4iXG5cbiJTZWxlY2Npb25lIE9LIHBhcmEgY29udGludWFyIG91IENhbmNlbGFyIHBhcmEgcGVybWFuZWNlciBuYSBww6FnaW5hIGFjdHVhbC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX2xhYmVsIiBtc2dpZD0iNjg2MDI2MTc1ODY2NTgyNTA2OSI+IkNvbmZpcm1hciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRvdWJsZV90YXBfdG9hc3QiIG1zZ2lkPSIxMDY4MjE2OTM3MjQ0NTY3MjQ3Ij4iU3VnZXN0w6NvOiB0b3F1ZSBkdWFzIHZlemVzIHBhcmEgYXVtZW50YXIgb3UgZGltaW51aXIgbyB6b29tLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvZmlsbF90aGlzX2Zvcm0gKDg5NDAxMTA4NjY3NzUwOTc0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iMTI4NDg0MzcyODIwMzQxMjEzNSI+ImxlciBoaXN0w7NyaWNvIGUgbWFyY2Fkb3JlcyBkbyBicm93c2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI0OTgxNDg5ODE1NDY3NjE3MTkxIj4iUGVybWl0ZSBxdWUgYSBhcGxpY2HDp8OjbyBsZWlhIHRvZG9zIG9zIFVSTHMgdmlzaXRhZG9zIHBlbG8gYnJvd3NlciBlIHRvZG9zIG9zIG1hcmNhZG9yZXMgZG8gYnJvd3Nlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjkwMDk0MzQxMDk4MzYyODAzNzQiPiJncmF2YXIgaGlzdMOzcmljbyBlIG1hcmNhZG9yZXMgZG8gYnJvd3NlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9Ijk0NTU3MTk5MDM1NzExNDk1MCI+IlBlcm1pdGUgcXVlIHVtYSBhcGxpY2HDp8OjbyBtb2RpZmlxdWUgbyBoaXN0w7NyaWNvIGUgb3MgbWFyY2Fkb3JlcyBkbyBicm93c2VyIGFybWF6ZW5hZG9zIG5vIHRlbGVmb25lLiBBcyBhcGxpY2HDp8O1ZXMgbWFsaWNpb3NhcyBwb2RlbSB1dGlsaXphciBlc3RhIHBlcm1pc3PDo28gcGFyYSBhcGFnYXIgb3UgbW9kaWZpY2FyIG9zIGRhZG9zIGRvIGJyb3dzZXIuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0QWxhcm0gKDU5MjQ0MDEzMjg4MDM2MTUxNjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0QWxhcm0gKDU5NjY5NjY1OTgxNDk4NzUwODIpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQ3MTUyMTI2NTU1OTgyNzU1MzIiPiJNb2RpZmljYXIgcGVybWlzc8O1ZXMgZGUgbG9jYWxpemHDp8OjbyBnZW9ncsOhZmljYSBkbyBOYXZlZ2Fkb3IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0MDExOTA4MjgyOTgwODYxNjc5Ij4iUGVybWl0ZSBhIHVtYSBhcGxpY2HDp8OjbyBtb2RpZmljYXIgYXMgcGVybWlzc8O1ZXMgZGUgbG9jYWxpemHDp8OjbyBnZW9ncsOhZmljYSBkbyBOYXZlZ2Fkb3IuIEFzIGFwbGljYcOnw7VlcyBtYWwgaW50ZW5jaW9uYWRhcyBwb2RlbSB1dGlsaXphciBpc3RvIHBhcmEgZW52aWFyIGluZm9ybWHDp8O1ZXMgZGUgbG9jYWxpemHDp8OjbyBwYXJhIFdlYiBzaXRlcyBhcmJpdHLDoXJpb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9tZXNzYWdlIiBtc2dpZD0iNzY3MzQ0Njg3MTM5MTk1NzkwIj4iUXVlciBxdWUgbyBicm93c2VyIG1lbW9yaXplIGVzdGEgcGFsYXZyYS1wYXNzZT8iPC9zdHJpbmc+CkBAIC03MzAsMTQgKzcxNiwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlNlbGVjY2lvbmFyIHR1ZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+IlNlbGVjY2lvbmFyIHBhbGF2cmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iQ29ydGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJDb3BpYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJDb2xhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iQ29waWFyIFVSTCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHRNb2RlIiBtc2dpZD0iNjczODU1NjM0ODg2MTM0NzI0MCI+IlNlbGVjY2lvbmFyIHRleHRvLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+IlNlbGVjw6fDo28gZGUgdGV4dG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJNw6l0b2RvIGRlIGVudHJhZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iQWRpY2lvbmFyIFwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiIGFvIGRpY2lvbsOhcmlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iRWRpdGFyIHRleHRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSI0OTA5MTM1NTY0OTQxODE1NDk0Ij4iQWPDp8O1ZXMgZGUgdGV4dG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IlBvdWNvIGVzcGHDp28gbGl2cmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJPIGVzcGHDp28gZGUgYXJtYXplbmFtZW50byBkbyB0ZWxlZm9uZSBlc3TDoSBhIGZpY2FyIHJlZHV6aWRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzQ1LDYgKzczMSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJDYW5jZWxhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJBdGVuw6fDo28iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkEgY2FycmVnYXIuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IkFjdGl2YWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iRGVzYWN0aXZhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iQ29uY2x1aXIgYWPDp8OjbyB1dGlsaXphbmRvIjwvc3RyaW5nPgpAQCAtNzYzLDkgKzc1MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0iZm9yY2VfY2xvc2UiIG1zZ2lkPSIzNjUzNDE2MzE1NDUwODA2Mzk2Ij4iRm9yw6dhciBmZWNobyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlcG9ydCIgbXNnaWQ9IjQwNjAyMTgyNjA5ODQ3OTU3MDYiPiJSZWxhdMOzcmlvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiJFc3BlcmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iQXBsaWNhw6fDo28gcmVkaXJlY2Npb25hZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gZXN0w6EgYWdvcmEgYSBzZXIgZXhlY3V0YWRvLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBmb2kgb3JpZ2luYWxtZW50ZSBpbmljaWFkby4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iQSBhcGxpY2HDp8OjbyA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXNzbyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIHZpb2xvdSBhIHBvbMOtdGljYSBTdHJpY3RNb2RlIGF1dG8taW1wb3N0YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJPIHByb2Nlc3NvIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiB2aW9sb3UgYSBwb2zDrXRpY2EgU3RyaWN0TW9kZSBhdXRvLWltcG9zdGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiBlbSBleGVjdcOnw6NvIjwvc3RyaW5nPgpAQCAtODEwLDMwICs4MDAsMjUgQEAKICAgICA8c3RyaW5nIG5hbWU9Im5vX3Blcm1pc3Npb25zIiBtc2dpZD0iNzI4MzM1NzcyODIxOTMzODExMiI+Ik7Do28gc8OjbyBuZWNlc3PDoXJpYXMgcGVybWlzc8O1ZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtc19oaWRlIiBtc2dpZD0iNzI4MzkxNTM5MTMyMDY3NjIyNiI+PGI+Ik9jdWx0YXIiPC9iPjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybXNfc2hvd19hbGwiIG1zZ2lkPSIyNjcxNzkxMTYzOTMzMDkxMTgwIj48Yj4iTW9zdHJhciB0dWRvIjwvYj48L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2FjdGl2aXR5X3RpdGxlIiBtc2dpZD0iMjM5OTI4OTk5OTYwODkwMDQ0MyI+IkFybWF6ZW5hbWVudG8gZW0gbWFzc2EgVVNCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYWN0aXZpdHlfdGl0bGUiIG1zZ2lkPSIyMzk5Mjg5OTk5NjA4OTAwNDQzIj4iQXJtYXplbmFtZW50byBlbSBtYXNzYSBVU0IgIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfdGl0bGUiIG1zZ2lkPSI1OTAxNDU5MDQxMzk4NzUxNDk1Ij4iTGlnYWRvIGF0cmF2w6lzIGRlIFVTQiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ3OTY3NTk2NDYxNjcyNDcxNzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODIzMTQ2Mjc1MDAxMDA2Njg5NiI+IkxpZ291IG8gdGVsZWZvbmUgYW8gY29tcHV0YWRvciBhdHJhdsOpcyBkZSBVU0IuIFNlbGVjY2lvbmUgbyBib3TDo28gYWJhaXhvIHNlIHByZXRlbmRlciBjb3BpYXIgZmljaGVpcm9zIGVudHJlIG8gY29tcHV0YWRvciBlIG8gY2FydMOjbyBTRCBkbyBBbmRyb2lkLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4iTGlnb3UgbyB0ZWxlZm9uZSBhbyBjb21wdXRhZG9yIGF0cmF2w6lzIGRlIFVTQi4gU2VsZWNjaW9uZSBvIGJvdMOjbyBhYmFpeG8gc2UgcHJldGVuZGVyIGNvcGlhciBmaWNoZWlyb3MgZW50cmUgbyBjb21wdXRhZG9yIGUgbyBjYXJ0w6NvIFNEIGRvIEFuZHJvaWQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJMaWdvdSBvIHRlbGVmb25lIGFvIGNvbXB1dGFkb3IgYXRyYXbDqXMgZGUgVVNCLiBTZWxlY2Npb25lIG8gYm90w6NvIGFiYWl4byBzZSBwcmV0ZW5kZXIgY29waWFyIGZpY2hlaXJvcyBlbnRyZSBvIGNvbXB1dGFkb3IgZSBvIGNhcnTDo28gU0QgZG8gQW5kcm9pZC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9idXR0b25fbW91bnQiIG1zZ2lkPSIxMDUyMjU5OTMwMzY5NTA4MjM1Ij4iQWN0aXZhciBhcm1hemVuYW1lbnRvIFVTQiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI1MzQ3ODQ3NTE2MDMzNDUzNjMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDgxODM0Nzc1NjQwMjc0MDI2MSI+IkV4aXN0ZSB1bSBwcm9ibGVtYSBhbyB1dGlsaXphciBvIGNhcnTDo28gU0QgcGFyYSBhcm1hemVuYW1lbnRvIFVTQi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IkV4aXN0ZSB1bSBwcm9ibGVtYSBhbyB1dGlsaXphciBvIGNhcnTDo28gU0QgcGFyYSBhcm1hemVuYW1lbnRvIFVTQi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IkV4aXN0ZSB1bSBwcm9ibGVtYSBhbyB1dGlsaXphciBvIGNhcnTDo28gU0QgcGFyYSBhcm1hemVuYW1lbnRvIFVTQi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4MTc1ODkyNTU0NzU3MjE2NTI1Ij4iTGlnYWRvIGF0cmF2w6lzIGRlIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzM4MDA4MjQwNDI4ODIxOTM0MSI+IlNlbGVjY2lvbmUgcGFyYSBjb3BpYXIgZmljaGVpcm8gcGFyYS9kbyBzZXUgY29tcHV0YWRvci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjIzMzYwNTgzOTY2NjM1MTYwMTciPiJEZXNhY3RpdmFyIGFybWF6ZW5hbWVudG8gVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI1OTE4MTM0OTAyNjk4NDE1MzkiPiJPcHRlIHBvciBkZXNhY3RpdmFyIG8gYXJtYXplbmFtZW50byBVU0IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF90aXRsZSIgbXNnaWQ9IjY2MDEyOTg1MTcwODc3NTg1MyI+Ik8gYXJtYXplbmFtZW50byBVU0IgZXN0w6EgYSBzZXIgdXRpbGl6YWRvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYxMzcxMzM5NjQyNjYwNDEwNCAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg3NDUzNDUyNjA3ODAyNjcxODUiPiJBbnRlcyBkZSBkZXNhY3RpdmFyIG8gYXJtYXplbmFtZW50byBVU0IsIGNlcnRpZmlxdWUtc2UgZGUgcXVlIGRlc2luc3RhbG91IChcImVqZWN0b3VcIikgbyBjYXJ0w6NvIFNEIGRvIEFuZHJvaWQgZG8gY29tcHV0YWRvci4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4iQW50ZXMgZGUgZGVzYWN0aXZhciBvIGFybWF6ZW5hbWVudG8gVVNCLCBjZXJ0aWZpcXVlLXNlIGRlIHF1ZSBkZXNpbnN0YWxvdSAoXCJlamVjdG91XCIpIG8gY2FydMOjbyBTRCBkbyBBbmRyb2lkIGRvIGNvbXB1dGFkb3IuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IkFudGVzIGRlIGRlc2FjdGl2YXIgbyBhcm1hemVuYW1lbnRvIFVTQiwgY2VydGlmaXF1ZS1zZSBkZSBxdWUgZGVzaW5zdGFsb3UgKFwiZWplY3RvdVwiKSBvIGNhcnTDo28gU0QgZG8gQW5kcm9pZCBkbyBjb21wdXRhZG9yLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfYnV0dG9uX21vdW50IiBtc2dpZD0iNzA2MDIxODAzNDkwMDY5NjAyOSI+IkRlc2FjdGl2YXIgYXJtYXplbmFtZW50byBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIxNDM4ODE5MTQ4NDA0MTIxMDgiPiJPY29ycmV1IHVtIHByb2JsZW1hIGFvIGRlc2FjdGl2YXIgbyBhcm1hemVuYW1lbnRvIFVTQi4gQ29uZmlybWUgc2UgZGVzaW5zdGFsb3UgbyBhbmZpdHJpw6NvIFVTQiBlLCBlbSBzZWd1aWRhLCB0ZW50ZSBub3ZhbWVudGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RpdGxlIiBtc2dpZD0iOTYzMDM5MDMzNDcwNDc4Njk3Ij4iQWN0aXZhciBhcm1hemVuYW1lbnRvIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190ZXh0IiBtc2dpZD0iMzIwMjgzODIzNDc4MDUwNTg4NiI+IlNlIGFjdGl2YXIgbyBhcm1hemVuYW1lbnRvIFVTQiwgYWxndW1hcyBhcGxpY2HDp8O1ZXMgcXVlIGVzdGl2ZXIgYSB1dGlsaXphciBzZXLDo28gcGFyYWRhcyBlIHBvZGVyw6NvIGZpY2FyIGluZGlzcG9uw612ZWlzIGF0w6kgZGVzYWN0aXZhciBvIGFybWF6ZW5hbWVudG8gVVNCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19lcnJvcl90aXRsZSIgbXNnaWQ9IjgwNDg5OTk5NzM4MzczMzkxNzQiPiJGYWxoYSBuYSBvcGVyYcOnw6NvIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19vayIgbXNnaWQ9IjczNzY5NTMxNjcwMzk4NjU3MDEiPiJPSyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg2NjMyNDc5Mjk1NTEwOTU4NTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NTc3OTA4MDA2OTQ5NzQyMjE3Ij4iRm9ybWF0YXIgY2FydMOjbyBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJGb3JtYXRhciBjYXJ0w6NvIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYyMTM2OTk2MjQzMzUyMzYxOSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzQ3MDgxNTE0MDA2ODUwMjgyNCI+IlRlbSBhIGNlcnRlemEgZGUgcXVlIHByZXRlbmRlIGZvcm1hdGFyIG8gY2FydMOjbyBTRD8gUGVyZGVyLXNlLcOjbyB0b2RvcyBvcyBkYWRvcyBubyBjYXJ0w6NvLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IlRlbSBhIGNlcnRlemEgZGUgcXVlIHByZXRlbmRlIGZvcm1hdGFyIG8gY2FydMOjbyBTRD8gUGVyZGVyLXNlLcOjbyB0b2RvcyBvcyBkYWRvcyBubyBjYXJ0w6NvLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJGb3JtYXRhciBjYXJ0w6NvIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4iVGVtIGEgY2VydGV6YSBkZSBxdWUgcHJldGVuZGUgZm9ybWF0YXIgbyBjYXJ0w6NvIFNEPyBQZXJkZXItc2Utw6NvIHRvZG9zIG9zIGRhZG9zIG5vIGNhcnTDo28uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X2J1dHRvbl9mb3JtYXQiIG1zZ2lkPSI0MTMxMDY0NTYwMTI3NDc4Njk1Ij4iRm9ybWF0YXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3MjkwNDQ3Nzg5NDkxODk5MTgiPiJEZXB1cmHDp8OjbyBVU0IgbGlnYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9Ijg0NzAyOTY4MTgyNzAxMTAzOTYiPiJTZWxlY2Npb25lIHBhcmEgZGVzYWN0aXZhciBkZXB1cmHDp8OjbyBVU0IuIjwvc3RyaW5nPgpAQCAtODQxLDI5ICs4MjYsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX2FscGhhYmV0IiBtc2dpZD0iNTQzMzI3NTQ4NTQ5OTAzOTE5OSI+IiBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX251bWVyaWNfYWxwaGFiZXQiIG1zZ2lkPSI0MDMwMTcwNTI0NTk1MTIzNjEwIj4iIDAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhbmRpZGF0ZXNfc3R5bGUiIG1zZ2lkPSI0MzMzOTEzMDg5NjM3MDYyMjU3Ij48dT4iY2FuZGlkYXRvcyI8L3U+PC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NDU3NjAzNDE4OTcwOTk0MDUwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQyMzk1MTY2NzUwMjg0Mzg5OTciPiJBIHByZXBhcmFyIGNhcnTDo28gU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IkEgcHJlcGFyYXIgY2FydMOjbyBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4iQSBwcmVwYXJhciBjYXJ0w6NvIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODI4NzMxOTg4MjkyNjczNzA1MyI+IkEgdmVyaWZpY2FyIGEgcHJlc2Vuw6dhIGRlIGVycm9zLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc4MDQ3NzgzODI0MTIxMjk5NyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM5MzczNDU1Nzc5ODM3MzA4NzMiPiJDYXJ0w6NvIFNEIHZhemlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iQ2FydMOjbyBTRCB2YXppbyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDEzMTIyNjY4MjAwOTI5NTgwMTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE2MDY2NjA3NTYxMjQ2Mjk3MDgiPiJPIGNhcnTDo28gU0QgZXN0w6EgdmF6aW8gb3UgYSB1dGlsaXphciB1bSBzaXN0ZW1hIGRlIGZpY2hlaXJvcyBuw6NvIHN1cG9ydGFkby4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJDYXJ0w6NvIFNEIHZhemlvIG91IHNpc3RlbWEgZGUgZmljaGVpcm9zIG7Do28gc3Vwb3J0YWRvLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY0MTA3MjM5MDYwMTkxMDAxODkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTcyNDYxOTkwMjA3NjUyODg4OSI+IkNhcnTDo28gU0QgZGFuaWZpY2FkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iQ2FydMOjbyBTRCBkYW5pZmljYWRvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjY3OTQxMjg4NDI5MDA2MTc3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY0NjAzMTE4MzUxMzA2NzExOTQiPiJPIGNhcnTDo28gU0QgZXN0w6EgZGFuaWZpY2Fkby4gUG9kZXLDoSBzZXIgbmVjZXNzw6FyaW8gcmVmb3JtYXRhciBvIGNhcnTDo28uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IkNhcnTDo28gU0QgZGFuaWZpY2Fkby4gUG9kZXLDoSBzZXIgbmVjZXNzw6FyaW8gcmVmb3JtYXTDoS1sby4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2ODcyMTUyODgyNjA0NDA3ODM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjU4MjE3NTAxNjA2MDQzMjAzNCI+IkNhcnTDo28gU0QgcmVtb3ZpZG8gZGUgZm9ybWEgaW5lc3BlcmFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJDYXJ0w6NvIFNEIHJlbW92aWRvIGRlIGZvcm1hIGluZXNwZXJhZGEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3MjYwMTgzMjkzNzQ3NDQ4MjQxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyMDA1Mzk2NDY0NDk0NjQ4OTM3Ij4iRGVzbW9udGUgbyBjYXJ0w6NvIFNEIGFudGVzIGRlIHJldGlyw6EtbG8gcGFyYSBldml0YXIgYSBwZXJkYSBkZSBkYWRvcy4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiJEZXNtb250ZSBvIGNhcnTDo28gU0QgYW50ZXMgZGUgcmV0aXLDoS1sbyBwYXJhIGV2aXRhciBhIHBlcmRhIGRlIGRhZG9zLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY3Mjk4MDExMzA3OTA2MTYyMDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM2NTI1ODgxMDE4Njc5NTE1Ij4iw4kgc2VndXJvIHJldGlyYXIgbyBjYXJ0w6NvIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iw4kgc2VndXJvIHJldGlyYXIgbyBjYXJ0w6NvIFNEIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzYxMzk2MDY4Njc0NzU5Mjc3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI3NTAzNzY5MTA2Mjg1MTg4NzAzIj4iw4kgcG9zc8OtdmVsIHJlbW92ZXIgYWdvcmEgbyBjYXJ0w6NvIFNEIGVtIHNlZ3VyYW7Dp2EuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IlBvZGUgcmVtb3ZlciBvIGNhcnTDo28gU0QgY29tIHNlZ3VyYW7Dp2EuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODkwMjUxODAzMDQwNDM4MTMxOCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE4NzQ4ODk3NjQzNjcwODU1NjIiPiJDYXJ0w6NvIFNEIHJlbW92aWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IkNhcnTDo28gU0QgcmVtb3ZpZG8iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MjA1MTE3MjI3MzQyODIyMjc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNzMwODkwNDQxMzMxMzQ0Nzc2Ij4iTyBjYXJ0w6NvIFNEIGZvaSByZW1vdmlkby4gSW50cm9kdXphIHVtIG5vdm8gY2FydMOjbyBTRCBwYXJhIGF1bWVudGFyIGEgY2FwYWNpZGFkZSBkZSBhcm1hemVuYW1lbnRvIGRvIGRpc3Bvc2l0aXZvLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IkNhcnTDo28gU0QgcmVtb3ZpZG8uIEluc2lyYSB1bSBub3ZvIGNhcnTDo28uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iQ2FydMOjbyBTRCB2YXppbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IkNhcnTDo28gU0QgdmF6aW8gb3Ugc2lzdGVtYSBkZSBmaWNoZWlyb3MgbsOjbyBzdXBvcnRhZG8uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJDYXJ0w6NvIFNEIGRhbmlmaWNhZG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iQ2FydMOjbyBTRCBkYW5pZmljYWRvLiBQb2RlcsOhIHNlciBuZWNlc3PDoXJpbyByZWZvcm1hdMOhLWxvLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJDYXJ0w6NvIFNEIHJlbW92aWRvIGRlIGZvcm1hIGluZXNwZXJhZGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiJEZXNtb250ZSBvIGNhcnTDo28gU0QgYW50ZXMgZGUgcmV0aXLDoS1sbyBwYXJhIGV2aXRhciBhIHBlcmRhIGRlIGRhZG9zLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+IsOJIHNlZ3VybyByZXRpcmFyIG8gY2FydMOjbyBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiJQb2RlIHJlbW92ZXIgbyBjYXJ0w6NvIFNEIGNvbSBzZWd1cmFuw6dhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiJDYXJ0w6NvIFNEIHJlbW92aWRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iQ2FydMOjbyBTRCByZW1vdmlkby4gSW5zaXJhIHVtIG5vdm8gY2FydMOjby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY3Rpdml0eV9saXN0X2VtcHR5IiBtc2dpZD0iNDE2ODgyMDYwOTQwMzM4NTc4OSI+Ik5lbmh1bWEgYWN0aXZpZGFkZSBjb3JyZXNwb25kZW50ZSBlbmNvbnRyYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODc4NzM1MjA3NDMyNjc0ODg5MiI+ImFjdHVhbGl6YXIgZXN0YXTDrXN0aWNhcyBkZSB1dGlsaXphw6fDo28gZGUgY29tcG9uZW50ZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODkxNTUzNjk1NzE2NzUyODM1Ij4iUGVybWl0ZSBhIG1vZGlmaWNhw6fDo28gZGUgZXN0YXTDrXN0aWNhcyBkZSB1dGlsaXphw6fDo28gZGUgY29tcG9uZW50ZXMgcmVjb2xoaWRhcy4gTsOjbyBzZSBkZXN0aW5hIGEgdXRpbGl6YcOnw6NvIHBvciBhcGxpY2HDp8O1ZXMgbm9ybWFpcy4iPC9zdHJpbmc+CkBAIC04OTgsMTUgKzg3MiwyNCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IlZQTiBMMlRQL0lQU2VjIGJhc2VhZGEgZW0gY2hhdmUgcHLDqS0gcGFydGlsaGFkYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJWUE4gTDJUUC9JUFNlYyBiYXNlYWRhIGVtIGNlcnRpZmljYWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iRXNjb2xoZXIgZmljaGVpcm8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJOw6NvIGZvaSBzZWxlY2Npb25hZG8gbmVuaHVtIGZpY2hlaXJvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVwb3IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iRW52aWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJmYXZvcml0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+Ik1vZG8gYXV0b23Ds3ZlbCBhY3RpdmFkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJTZWxlY2Npb25hciBwYXJhIHNhaXIgZG8gbW9kbyBhdXRvbcOzdmVsLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJMaWdhw6fDo28gcG9udG8gYSBwb250byBvdSBob3RzcG90IGFjdGl2b3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJUb2NhciBwYXJhIGNvbmZpZ3VyYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJBbnRlcmlvciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IlNlZ3VpbnRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iSWdub3JhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IlV0aWxpemHDp8OjbyBlbGV2YWRhIGRlIGRhZG9zIG3Ds3ZlaXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IlRvcXVlIHBhcmEgc2FiZXIgbWFpcyBzb2JyZSBhIHV0aWxpemHDp8OjbyBkZSBkYWRvcyBtw7N2ZWlzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJMaW1pdGUgZGUgZGFkb3MgbcOzdmVpcyBleGNlZGlkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiJUb3F1ZSBwYXJhIHNhYmVyIG1haXMgc29icmUgYSB1dGlsaXphw6fDo28gZGUgZGFkb3MgbcOzdmVpcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX21hdGNoZXMiIG1zZ2lkPSI4MTI5NDIxOTA4OTE1ODQwNzM3Ij4iU2VtIGNvcnJlc3BvbmTDqm5jaWFzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZmluZF9vbl9wYWdlIiBtc2dpZD0iMTk0Njc5OTIzMzgyMjgyMDM4NCI+IkxvY2FsaXphciBuYSBww6FnaW5hIjwvc3RyaW5nPgorICA8cGx1cmFscyBuYW1lPSJtYXRjaGVzX2ZvdW5kIj4KKyAgICA8aXRlbSBxdWFudGl0eT0ib25lIiBtc2dpZD0iODE2NzE0NzA4MTEzNjU3OTQzOSI+IjEgY29ycmVzcG9uZMOqbmNpYSI8L2l0ZW0+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im90aGVyIiBtc2dpZD0iNDY0MTg3Mjc5NzA2NzYwOTE3NyI+Ijx4bGlmZjpnIGlkPSJJTkRFWCI+JWQ8L3hsaWZmOmc+IGRlIDx4bGlmZjpnIGlkPSJUT1RBTCI+JWQ8L3hsaWZmOmc+IjwvaXRlbT4KKyAgPC9wbHVyYWxzPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbAppbmRleCA0YzE4Njc3Li5lZTAzOGMzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKQEAgLTE2OSw4ICsxNjksNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSIzNDQ2MTY0NTg0NzEwNTk2NTEzIj4iRmVycmFtZW50YXMgZGUgZGVzZW52b2x2aW1lbnRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iOTA1NjQzMTE5Mzg5MzgwOTgxNCI+IlJlY3Vyc29zIG5lY2Vzc8OhcmlvcyBhcGVuYXMgcGFyYSBkZXNlbnZvbHZlZG9yZXMgZGUgYXBsaWNhdGl2by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfc3RvcmFnZSIgbXNnaWQ9IjE5NzExMTg3NzA1NDYzMzY5NjYiPiJBcm1hemVuYW1lbnRvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTIwMzMwMjIxNDkxNTM1NTc3NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjU0NTU4MDQzNTMyMjA1ODEzMTIiPiJBY2Vzc2FyIG8gY2FydMOjbyBTRC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4iQWNlc3NhciBvIGNhcnTDo28gU0QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IkFjZXNzYXIgbyBjYXJ0w6NvIFNELiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyIiBtc2dpZD0iNzQxNzE5MjYyOTYwMTg5MDc5MSI+ImRlc2F0aXZhciBvdSBtb2RpZmljYXIgYSBiYXJyYSBkZSBzdGF0dXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zdGF0dXNCYXIiIG1zZ2lkPSIxMzY1NDczNTk1MzMxOTg5NzMyIj4iUGVybWl0ZSBxdWUgbyBhcGxpY2F0aXZvIGRlc2F0aXZlIGEgYmFycmEgZGUgc3RhdHVzIG91IGFkaWNpb25lIGUgcmVtb3ZhIMOtY29uZXMgZG8gc2lzdGVtYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhclNlcnZpY2UiIG1zZ2lkPSI3MjQ3MjgxOTExMzg3OTMxNDg1Ij4iYmFycmEgZGUgc3RhdHVzIjwvc3RyaW5nPgpAQCAtMjY3LDggKzI2NiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2xlYXJBcHBDYWNoZSIgbXNnaWQ9Ijc3NDA0NjU2OTQxOTM2NzE0MDIiPiJQZXJtaXRlIHF1ZSB1bSBhcGxpY2F0aXZvIGxpYmVyZSBvIGVzcGHDp28gZGUgYXJtYXplbmFtZW50byBkbyB0ZWxlZm9uZSBleGNsdWluZG8gYXJxdWl2b3Mgbm8gZGlyZXTDs3JpbyBkZSBjYWNoZSBkbyBhcGxpY2F0aXZvLiBPIGFjZXNzbyDDqSBub3JtYWxtZW50ZSBtdWl0byByZXN0cml0byBwYXJhIG8gcHJvY2Vzc28gZG8gc2lzdGVtYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX21vdmVQYWNrYWdlIiBtc2dpZD0iNzI4NDU0OTc5OTQ2NTAzOTI2Ij4iTW92ZXIgcmVjdXJzb3MgZG8gYXBsaWNhdGl2byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21vdmVQYWNrYWdlIiBtc2dpZD0iNjMyMzA0OTI5MTkyMzkyNTI3NyI+IlBlcm1pdGUgcXVlIHVtIGFwbGljYXRpdm8gbW92YSBvcyByZWN1cnNvcyBkbyBhcGxpY2F0aXZvIGRhIG3DrWRpYSBpbnRlcm5hIHBhcmEgYSBleHRlcm5hIGUgdmljZS12ZXJzYS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0ODExOTIxNzAzODgyNTMyMDcwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRMb2dzIiBtc2dpZD0iNjYxNTc3ODU0MzE5ODk2NzYxNCI+ImxlciBhcnF1aXZvcyBkZSByZWdpc3RybyBkbyBzaXN0ZW1hIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjI1NzkzNzk1NTU4MDQ3NTkwMiAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZExvZ3MiIG1zZ2lkPSI4ODk2NDQ5NDM3NDY0ODY3NzY2Ij4iUGVybWl0ZSBxdWUgdW0gYXBsaWNhdGl2byBsZWlhIG9zIGRpdmVyc29zIGFycXVpdm9zIGRlIHJlZ2lzdHJvIGRvIHNpc3RlbWEuIElzc28gcGVybWl0ZSBxdWUgZWxlIGRlc2N1YnJhIGluZm9ybWHDp8O1ZXMgZ2VyYWlzIHNvYnJlIG8gcXVlIHZvY8OqIGVzdMOhIGZhemVuZG8gY29tIG8gdGVsZWZvbmUsIHBvcsOpbSBlc3NlcyBhcnF1aXZvcyBuw6NvIGRldmVtIGNvbnRlciBpbmZvcm1hw6fDtWVzIHBlc3NvYWlzIG91IHByaXZhZGFzLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRMb2dzICg2NjE1Nzc4NTQzMTk4OTY3NjE0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRMb2dzICg4ODk2NDQ5NDM3NDY0ODY3NzY2KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaWFnbm9zdGljIiBtc2dpZD0iODA3Njc0Mzk1MzkwODAwMDM0MiI+Imxlci9ncmF2YXIgZW0gcmVjdXJzb3MgcGVydGVuY2VudGVzIGFvIGRpYWciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaWFnbm9zdGljIiBtc2dpZD0iMzEyMTIzODM3Mzk1MTYzNzA0OSI+IlBlcm1pdGUgcXVlIHVtIGFwbGljYXRpdm8gbGVpYSBlIGdyYXZlIGVtIHF1YWxxdWVyIHJlY3Vyc28gcXVlIHBlcnRlbsOnYSBhbyBncnVwbyBkZSBkaWFnbsOzc3RpY29zOyBwb3IgZXhlbXBsbywgYXJxdWl2b3MgZW0gL2Rldi4gSXNzbyBwb3NzaXZlbG1lbnRlIHBvZGUgYWZldGFyIGEgZXN0YWJpbGlkYWRlIGUgYSBzZWd1cmFuw6dhIGRvIHNpc3RlbWEuIElzc28gZGV2ZSBzZXIgdXNhZG8gQVBFTkFTIHBhcmEgZGlhZ27Ds3N0aWNvcyBlc3BlY8OtZmljb3MgZG8gaGFyZHdhcmUgcmVhbGl6YWRvcyBwZWxvIGZhYnJpY2FudGUgb3UgcGVsbyBvcGVyYWRvci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NoYW5nZUNvbXBvbmVudFN0YXRlIiBtc2dpZD0iNzk0MjUxOTg4MzQzMjk0MDYiPiJhdGl2YXIgb3UgZGVzYXRpdmFyIG9zIGNvbXBvbmVudGVzIGRvIGFwbGljYXRpdm8iPC9zdHJpbmc+CkBAIC00MDMsMjIgKzQwNCw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGhBZG1pbiIgbXNnaWQ9IjcyNTYyODk3NzQ2NjcwNTQ1NTUiPiJQZXJtaXRlIHF1ZSB1bSBhcGxpY2F0aXZvIGNvbmZpZ3VyZSBvIHRlbGVmb25lIEJsdWV0b290aCBsb2NhbCwgZGVzY3VicmEgZSBwYXJlaWUgY29tIGRpc3Bvc2l0aXZvcyByZW1vdG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYmx1ZXRvb3RoIiBtc2dpZD0iODM2MTAzODcwNzg1NzAxODczMiI+ImNyaWFyIGNvbmV4w7VlcyBCbHVldG9vdGgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGgiIG1zZ2lkPSI3NjI1MTUzODA2NzkzOTI5NDUiPiJQZXJtaXRlIHF1ZSB1bSBhcGxpY2F0aXZvIHZlamEgYSBjb25maWd1cmHDp8OjbyBkbyB0ZWxlZm9uZSBCbHVldG9vdGggbG9jYWwgZSBxdWUgcG9zc2EgZmF6ZXIgZSBhY2VpdGFyIGNvbmV4w7VlcyBjb20gZGlzcG9zaXRpdm9zIHBhcmVhZG9zLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0FkbWluICgyMjUxMzAyMjMzMDEyMjUwMDU2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0FkbWluICgxOTM1ODQyNjExNDY0ODk1Nzg1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjUmF3ICg0NDIzNDcxNzExMTE0MzI1NzA4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY1JhdyAoNTUzMzAyMjczNjU1OTM4NTY2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY05vdGlmeSAoNDc4NDcwMzYwMDgyNzkyMzU4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY05vdGlmeSAoMjk5MDA1MzUxNzk2MjA3MDYxNykgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0xsY3AgKDQ5NzIwNTE0NjEwMDcwMzA0MjYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTGxjcCAoOTE1OTIxMjc3ODYwMDQ2NDApIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjQ5Nzc0MDYxNjQzMTE1MzUwOTIiPiJkZXNhdGl2YXIgbyBibG9xdWVpbyBkZSB0ZWNsYXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSIzMTg5NzYzNDc5MzI2MzAyMDE3Ij4iUGVybWl0ZSBxdWUgdW0gYXBsaWNhdGl2byBkZXNhdGl2ZSBvIGJsb3F1ZWlvIGRlIHRlY2xhcyBlIHF1YWxxdWVyIHNlZ3VyYW7Dp2EgcG9yIHNlbmhhIGFzc29jaWFkYS4gVW0gZXhlbXBsbyBsZWfDrXRpbW8gZGlzc28gw6kgYSBkZXNhdGl2YcOnw6NvIGRvIGJsb3F1ZWlvIGRlIHRlY2xhcyBwZWxvIHRlbGVmb25lIGFvIHJlY2ViZXIgdW1hIGNoYW1hZGEgZSBhIHJlYXRpdmHDp8OjbyBkbyBibG9xdWVpbyBxdWFuZG8gYSBjaGFtYWRhIMOpIGZpbmFsaXphZGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkU3luY1NldHRpbmdzIiBtc2dpZD0iNjIwMTgxMDAwODIzMDUwMzA1MiI+ImxlciBhcyBjb25maWd1cmHDp8O1ZXMgZGUgc2luY3Jvbml6YcOnw6NvIjwvc3RyaW5nPgpAQCAtNDM1LDIyICs0MjAsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iMTA4Mjk3MjYwMzU3NjM2MDY5MCI+IlBlcm1pdGUgcXVlIHVtIGFwbGljYXRpdm8gbGVpYSBxdWFpc3F1ZXIgcGFsYXZyYXMsIG5vbWVzIGUgZnJhc2VzIHBhcnRpY3VsYXJlcyBhcm1hemVuYWRvcyBwZWxvIHVzdcOhcmlvIG5vIGRpY2lvbsOhcmlvIGRvIHVzdcOhcmlvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iNjcwMzEwOTUxMTgzNjM0MzM0MSI+ImdyYXZhciBubyBkaWNpb27DoXJpbyBkZWZpbmlkbyBwZWxvIHVzdcOhcmlvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI0MTI1NjIwNjUyNDA4Mjg4MCI+IlBlcm1pdGUgcXVlIHVtIGFwbGljYXRpdm8gZ3JhdmUgbm92YXMgcGFsYXZyYXMgbm8gZGljaW9uw6FyaW8gZG8gdXN1w6FyaW8uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODA3OTQwMzc1OTAwMTc3NzI5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI5OTM3MDc0MzY5NDEwMTY5MTMiPiJtb2RpZmljYXIvZXhjbHVpciBjb250ZcO6ZG8gZG8gY2FydMOjbyBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4ibW9kaWZpY2FyL2V4Y2x1aXIgY29udGXDumRvIGRvIGNhcnTDo28gU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NjQzOTYzMjA0OTc2NDcxODc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MTMxODcxNTQxMTI3MjExNTI2Ij4iUGVybWl0ZSBxdWUgdW0gYXBsaWNhdGl2byBncmF2ZSBubyBjYXJ0w6NvIFNELiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IlBlcm1pdGUgcXVlIHVtIGFwbGljYXRpdm8gZ3JhdmUgbm8gY2FydMOjbyBTRC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Im1vZGlmaWNhci9leGNsdWlyIGNvbnRlw7pkbyBkbyBjYXJ0w6NvIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4iUGVybWl0ZSBxdWUgdW0gYXBsaWNhdGl2byBncmF2ZSBubyBjYXJ0w6NvIFNELiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjU2NTY0ODcyNjQ4MTk2Njk4MjQiPiJhY2Vzc2FyIG8gc2lzdGVtYSBkZSBhcnF1aXZvcyBkZSBjYWNoZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSIxNjI0NzM0NTI4NDM1NjU5OTA2Ij4iUGVybWl0ZSBxdWUgdW0gYXBsaWNhdGl2byBsZWlhIGUgZ3JhdmUgbm8gc2lzdGVtYSBkZSBhcnF1aXZvcyBkZSBjYWNoZS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MzA3ODYxNDk2MzAyODUwMjAxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQ0OTc0MjA3Mjg4NTc1ODU3OTEiPiJMaW1pdGFyIHNlbmhhIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTcxOTg3NzI0NTY5MjMxODI5OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iOTA4MzQwMDA4MDg2MTcyODA1NiI+IlJlc3RyaW5nZSBvcyB0aXBvcyBkZSBzZW5oYSBxdWUgdm9jw6ogdGVtIHBlcm1pc3PDo28gZGUgdXNhci4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3Mzc0NzgwNzEyNjY0Mjg1MzIxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjkxNDEzMDY0Njk0MjE5OTUwMyI+IkV4aWJpciB0ZW50YXRpdmFzIGRlIGxvZ2luIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTk2MTI1MTE3OTYyNDg0MzQ4MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iNzIyNzU3ODI2MDE2NTE3MjY3MyI+Ik1vbml0b3JhIGFzIHRlbnRhdGl2YXMgbWFsc3VjZWRpZGFzIGRlIGxvZ2luIG5vIGFwYXJlbGhvIHBhcmEgZXhlY3V0YXIgYWxndW1hIGHDp8Ojby4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MDg0NzcyMDkwNzk3NDg1NDIwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjI2MjAwNzcxOTEyNDI2ODg5NTUiPiJSZWRlZmluaXIgc2VuaGEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzMzMyMTY3NjAwMzMxNzk5OTkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI1MzkxMjQwNjE2OTgxMjk3MzYxIj4iRm9yw6dhIGEgc3VhIHNlbmhhIHBhcmEgdW0gbm92byB2YWxvciwgZXhpZ2luZG8gcXVlIG8gYWRtaW5pc3RyYWRvciBhIGZvcm5lw6dhIGFudGVzIHF1ZSB2b2PDqiBwb3NzYSBmYXplciBsb2dpbi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NzYwNDY2MDI1MjQ3NjM0NDg4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iMjI3NDA4NTM4NDcwNDI0ODQzMSI+IkZvcsOnYXIgYmxvcXVlaW8iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyODE5ODY4NjY0OTQ2MDg5NzQwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjU2OTY5NjQxMjYyMjYwMjg0NDIiPiJDb250cm9sYSBvIGJsb3F1ZWlvIGRvIGFwYXJlbGhvLCBleGlnaW5kbyBxdWUgYSBzZW5oYSBzZWphIGRpZ2l0YWRhIG5vdmFtZW50ZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQzMDc4NjE0OTYzMDI4NTAyMDEiPiJMaW1pdGFyIHNlbmhhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iMTcxOTg3NzI0NTY5MjMxODI5OSI+IlJlc3RyaW5nZSBvcyB0aXBvcyBkZSBzZW5oYSBxdWUgdm9jw6ogdGVtIHBlcm1pc3PDo28gZGUgdXNhci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjczNzQ3ODA3MTI2NjQyODUzMjEiPiJFeGliaXIgdGVudGF0aXZhcyBkZSBsb2dpbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjE5NjEyNTExNzk2MjQ4NDM0ODMiPiJNb25pdG9yYSBhcyB0ZW50YXRpdmFzIG1hbHN1Y2VkaWRhcyBkZSBsb2dpbiBubyBhcGFyZWxobyBwYXJhIGV4ZWN1dGFyIGFsZ3VtYSBhw6fDo28uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI5MDg0NzcyMDkwNzk3NDg1NDIwIj4iUmVkZWZpbmlyIHNlbmhhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iMzMzMjE2NzYwMDMzMTc5OTk5MSI+IkZvcsOnYSBhIHN1YSBzZW5oYSBwYXJhIHVtIG5vdm8gdmFsb3IsIGV4aWdpbmRvIHF1ZSBvIGFkbWluaXN0cmFkb3IgYSBmb3JuZcOnYSBhbnRlcyBxdWUgdm9jw6ogcG9zc2EgZmF6ZXIgbG9naW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjU3NjA0NjYwMjUyNDc2MzQ0ODgiPiJGb3LDp2FyIGJsb3F1ZWlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iQ29udHJvbGEgbyBibG9xdWVpbyBkbyBhcGFyZWxobywgZXhpZ2luZG8gcXVlIGEgc2VuaGEgc2VqYSBkaWdpdGFkYSBub3ZhbWVudGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkFwYWdhciB0b2RvcyBvcyBkYWRvcyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIzMTQwNjA5MzM3OTYzOTYyMDUgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSI3NjY5ODk1MzMzODE0MjIyNTg2Ij4iRXhlY3V0ZSB1bWEgcmVkZWZpbmnDp8OjbyBkZSBmw6FicmljYSwgZXhjbHVpbmRvIHRvZG9zIG9zIHNldXMgZGFkb3Mgc2VtIHF1YWxxdWVyIGNvbmZpcm1hw6fDo28uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJFeGVjdXRlIHVtYSByZWRlZmluacOnw6NvIGRlIGbDoWJyaWNhLCBleGNsdWluZG8gdG9kb3Mgb3Mgc2V1cyBkYWRvcyBzZW0gcXVhbHF1ZXIgY29uZmlybWHDp8Ojby4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSIgbXNnaWQ9IjYzODc0OTc0NjY2NjAxNTQ5MzEiPiJDb25maWd1cmEgbyBwcm94eSBnbG9iYWwgZG8gZGlzcG9zaXRpdm8gcGFyYSBzZXIgdXNhZG8gZW5xdWFudG8gYSBwb2zDrXRpY2EgZXN0aXZlciBhdGl2YWRhLiBTb21lbnRlIG8gcHJpbWVpcm8gYWRtaW5pc3RyYWRvciBkbyBkaXNwb3NpdGl2byBwb2RlIGNvbmZpZ3VyYXIgdW0gdmVyZGFkZWlybyBwcm94eSBnbG9iYWwuIjwvc3RyaW5nPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iUmVzaWRlbmNpYWwiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJDZWx1bGFyIjwvaXRlbT4KQEAgLTU1MiwxMCArNTM4LDkgQEAKICAgICA8c2tpcCAvPgogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlT3RoZXIgKDQ0MDg0MzYxNjI5NTAxMTk4NDkpIC0tPgogICAgIDxza2lwIC8+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4icG9yIG1laW8gZGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJEaWdpdGUgbyBjw7NkaWdvIFBJTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iRGlnaXRlIGEgc2VuaGEgcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iRGlnaXRlIG8gUElOIHBhcmEgZGVzYmxvcXVlYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJDw7NkaWdvIFBJTiBpbmNvcnJldG8hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlBhcmEgZGVzYmxvcXVlYXIsIHByZXNzaW9uZSBNZW51IGUsIGVtIHNlZ3VpZGEsIDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik7Dum1lcm8gZGUgZW1lcmfDqm5jaWEiPC9zdHJpbmc+CkBAIC01NjgsNiArNTUzLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iUmV0b3JuYXIgw6AgY2hhbWFkYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IkNvcnJldG8hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IlRlbnRlIG5vdmFtZW50ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iVGVudGUgbm92YW1lbnRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iQ2FycmVnYW5kbyAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iQ2FycmVnYWRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTgyLDYgKzU2OCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJPIGNhcnTDo28gU0lNIGVzdMOhIGJsb3F1ZWFkby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJEZXNibG9xdWVhbmRvIG8gY2FydMOjbyBTSU3igKYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJWb2PDqiBkZXNlbmhvdSBpbmNvcnJldGFtZW50ZSBvIHNldSBwYWRyw6NvIGRlIGRlc2Jsb3F1ZWlvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlemVzLiAiXG5cbiJUZW50ZSBub3ZhbWVudGUgZW0gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iVm9jw6ogaW5zZXJpdSBpbmNvcnJldGFtZW50ZSBhIHN1YSBzZW5oYSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZXplcy4gIlxuXG4iVGVudGUgbm92YW1lbnRlIGVtIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJWb2PDqiBkaWdpdG91IGluY29ycmV0YW1lbnRlIG8gc2V1IFBJTiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZXplcy4gIlxuXG4iVGVudGUgbm92YW1lbnRlIGVtIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iVm9jw6ogZGVzZW5ob3UgbyBzZXUgcGFkcsOjbyBkZSBkZXNibG9xdWVpbyBpbmNvcnJldGFtZW50ZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZXplcy4gTWFpcyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiB0ZW50YXRpdmFzIGluY29ycmV0YXMgZSB2b2PDqiByZWNlYmVyw6EgdW1hIHNvbGljaXRhw6fDo28gcGFyYSBkZXNibG9xdWVhciBvIHNldSB0ZWxlZm9uZSB1c2FuZG8gbyBzZXUgbG9naW4gZG8gR29vZ2xlLiJcblxuIiBUZW50ZSBub3ZhbWVudGUgZW0gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlRlbnRlIG5vdmFtZW50ZSBlbSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJFc3F1ZWNldSBvIHBhZHLDo28/Ijwvc3RyaW5nPgpAQCAtNjEwLDE0ICs1OTgsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ19iZWZvcmVfdW5sb2FkIiBtc2dpZD0iMTkwMTY3NTQ0ODE3OTY1MzA4OSI+IkRlc2VqYSBzYWlyIGRlc3RhIHDDoWdpbmE/IlxuXG4iPHhsaWZmOmcgaWQ9Ik1FU1NBR0UiPiVzPC94bGlmZjpnPiJcblxuIlNlbGVjaW9uZSBPSyBwYXJhIGNvbnRpbnVhciBvdSBDYW5jZWxhciBwYXJhIHBlcm1hbmVjZXIgbmEgcMOhZ2luYSBhdHVhbC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX2xhYmVsIiBtc2dpZD0iNjg2MDI2MTc1ODY2NTgyNTA2OSI+IkNvbmZpcm1hciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRvdWJsZV90YXBfdG9hc3QiIG1zZ2lkPSIxMDY4MjE2OTM3MjQ0NTY3MjQ3Ij4iRGljYTogdG9xdWUgZHVhcyB2ZXplcyBwYXJhIGF1bWVudGFyIGUgZGltaW51aXIgbyB6b29tLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvZmlsbF90aGlzX2Zvcm0gKDg5NDAxMTA4NjY3NzUwOTc0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iMTI4NDg0MzcyODIwMzQxMjEzNSI+ImxlciBoaXN0w7NyaWNvIGUgZmF2b3JpdG9zIGRvIE5hdmVnYWRvciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iNDk4MTQ4OTgxNTQ2NzYxNzE5MSI+IlBlcm1pdGUgcXVlIG8gYXBsaWNhdGl2byBsZWlhIHRvZG9zIG9zIFVSTHMgdmlzaXRhZG9zIHBlbG8gTmF2ZWdhZG9yIGUgdG9kb3Mgb3MgZmF2b3JpdG9zIGRvIE5hdmVnYWRvci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjkwMDk0MzQxMDk4MzYyODAzNzQiPiJncmF2YXIgaGlzdMOzcmljbyBlIGZhdm9yaXRvcyBkbyBOYXZlZ2Fkb3IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5NDU1NzE5OTAzNTcxMTQ5NTAiPiJQZXJtaXRlIHF1ZSB1bSBhcGxpY2F0aXZvIG1vZGlmaXF1ZSBvIGhpc3TDs3JpY28gb3Ugb3MgZmF2b3JpdG9zIGRvIE5hdmVnYWRvciBhcm1hemVuYWRvcyBubyBzZXUgdGVsZWZvbmUuIEFwbGljYXRpdm9zIG1hbGljaW9zb3MgcG9kZW0gdXNhciBpc3NvIHBhcmEgYXBhZ2FyIG91IG1vZGlmaWNhciBvcyBkYWRvcyBkbyBzZXUgTmF2ZWdhZG9yLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldEFsYXJtICg1OTI0NDAxMzI4ODAzNjE1MTY1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldEFsYXJtICg1OTY2OTY2NTk4MTQ5ODc1MDgyKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0NzE1MjEyNjU1NTk4Mjc1NTMyIj4iTW9kaWZpcXVlIGFzIHBlcm1pc3PDtWVzIGRlIGdlb2xvY2FsaXphw6fDo28gZG8gc2V1IG5hdmVnYWRvciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQwMTE5MDgyODI5ODA4NjE2NzkiPiJQZXJtaXRlIHF1ZSB1bSBhcGxpY2F0aXZvIG1vZGlmaXF1ZSBhcyBwZXJtaXNzw7VlcyBkZSBnZW9sb2NhbGl6YcOnw6NvIGRvIG5hdmVnYWRvci4gQXBsaWNhdGl2b3MgbWFsaWNpb3NvcyBwb2RlbSB1c2FyIGlzc28gcGFyYSBwZXJtaXRpciBvIGVudmlvIGRlIGluZm9ybWHDp8O1ZXMgZGUgbG9jYWxpemHDp8OjbyBhIHNpdGVzIGFyYml0csOhcmlvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiJEZXNlamEgcXVlIG8gbmF2ZWdhZG9yIGxlbWJyZSBkZXN0YSBzZW5oYT8iPC9zdHJpbmc+CkBAIC02NzMsNyArNjU5LDcgQEAKICAgPC9wbHVyYWxzPgogICA8cGx1cmFscyBuYW1lPSJhYmJyZXZfbnVtX3NlY29uZHNfYWdvIj4KICAgICA8aXRlbSBxdWFudGl0eT0ib25lIiBtc2dpZD0iMTg0OTAzNjg0MDIwMDA2OTExOCI+IjEgc2VnLiBhdHLDoXMiPC9pdGVtPgotICAgIDxpdGVtIHF1YW50aXR5PSJvdGhlciIgbXNnaWQ9IjM2OTkxNjkzNjY2NTA5MzA0MTUiPiI8eGxpZmY6ZyBpZD0iQ09VTlQiPiVkPC94bGlmZjpnPiBzZWd1bmRvcyAgIGF0csOhcyI8L2l0ZW0+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im90aGVyIiBtc2dpZD0iMzY5OTE2OTM2NjY1MDkzMDQxNSI+Ijx4bGlmZjpnIGlkPSJDT1VOVCI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zXG4gIGF0csOhcyI8L2l0ZW0+CiAgIDwvcGx1cmFscz4KICAgPHBsdXJhbHMgbmFtZT0iYWJicmV2X251bV9taW51dGVzX2FnbyI+CiAgICAgPGl0ZW0gcXVhbnRpdHk9Im9uZSIgbXNnaWQ9IjYzNjE0OTAxNDcxMTM4NzE1NDUiPiIxIG1pbnV0byBhdHLDoXMiPC9pdGVtPgpAQCAtNzMwLDE0ICs3MTYsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJTZWxlY2lvbmFyIHR1ZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+IlNlbGVjaW9uYXIgcGFsYXZyYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJSZWNvcnRhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iQ29waWFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iQ29sYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IkNvcGlhciBVUkwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiJTZWxlY2lvbmFyIHRleHRvLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+IlNlbGXDp8OjbyBkZSB0ZXh0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik3DqXRvZG8gZGUgZW50cmFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJBZGljaW9uYXIgXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIgYW8gZGljaW9uw6FyaW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJFZGl0YXIgdGV4dG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiJBw6fDtWVzIGRlIHRleHRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJQb3VjbyBlc3Bhw6dvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iTyBlc3Bhw6dvIGRlIGFybWF6ZW5hbWVudG8gZG8gdGVsZWZvbmUgZXN0w6EgZmljYW5kbyBiYWl4by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTc0NSw2ICs3MzEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQ2FuY2VsYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iQXRlbsOnw6NvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJDYXJyZWdhbmRvLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJBVElWQURPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iREVTQVRJVkFETyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iQ29tcGxldGUgYSBhw6fDo28gdXNhbmRvIjwvc3RyaW5nPgpAQCAtNzYzLDkgKzc1MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0iZm9yY2VfY2xvc2UiIG1zZ2lkPSIzNjUzNDE2MzE1NDUwODA2Mzk2Ij4iRm9yw6dhciBmZWNoYW1lbnRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+IkluZm9ybWFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiJBZ3VhcmRhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IkFwbGljYXRpdm8gcmVkaXJlY2lvbmFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBuw6NvIGVzdMOhIGVtIGV4ZWN1w6fDo28uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGZvaSBpbmljaWFkby4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iTyBhcGxpY2F0aXZvIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb2Nlc3NvIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgdmlvbG91IGEgcG9sw610aWNhIFN0cmljdE1vZGUgaW1wb3N0YSBhdXRvbWF0aWNhbWVudGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iTyBwcm9jZXNzbyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gdmlvbG91IGEgcG9sw610aWNhIFN0cmljdE1vZGUgaW1wb3N0YSBhdXRvbWF0aWNhbWVudGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiBlbSBleGVjdcOnw6NvIjwvc3RyaW5nPgpAQCAtODEyLDI4ICs4MDIsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1zX3Nob3dfYWxsIiBtc2dpZD0iMjY3MTc5MTE2MzkzMzA5MTE4MCI+PGI+Ik1vc3RyYXIgdG9kYXMiPC9iPjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYWN0aXZpdHlfdGl0bGUiIG1zZ2lkPSIyMzk5Mjg5OTk5NjA4OTAwNDQzIj4iQXJtYXplbmFtZW50byBVU0IgZW0gbWFzc2EiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV90aXRsZSIgbXNnaWQ9IjU5MDE0NTkwNDEzOTg3NTE0OTUiPiJDb25lY3RhZG8gcG9yIFVTQiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ3OTY3NTk2NDYxNjcyNDcxNzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODIzMTQ2Mjc1MDAxMDA2Njg5NiI+IlZvY8OqIGNvbmVjdG91IG8gdGVsZWZvbmUgYW8gY29tcHV0YWRvciB2aWEgVVNCLiBTZWxlY2lvbmUgbyBib3TDo28gYWJhaXhvIHNlIHF1aXNlciBjb3BpYXIgYXJxdWl2b3MgZW50cmUgbyBjb21wdXRhZG9yIGUgbyBjYXJ0w6NvIFNEIGRvIHNldSBBbmRyb2lkLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4iVm9jw6ogY29uZWN0b3UgbyB0ZWxlZm9uZSBhbyBjb21wdXRhZG9yIHZpYSBVU0IuIFNlbGVjaW9uZSBvIGJvdMOjbyBhYmFpeG8gc2UgcXVpc2VyIGNvcGlhciBhcnF1aXZvcyBlbnRyZSBvIGNvbXB1dGFkb3IgZSBvIGNhcnTDo28gU0QgZG8gc2V1IEFuZHJvaWQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJWb2PDqiBjb25lY3RvdSBvIHRlbGVmb25lIGFvIGNvbXB1dGFkb3IgdmlhIFVTQi4gU2VsZWNpb25lIG8gYm90w6NvIGFiYWl4byBzZSBxdWlzZXIgY29waWFyIGFycXVpdm9zIGVudHJlIG8gY29tcHV0YWRvciBlIG8gY2FydMOjbyBTRCBkbyBzZXUgQW5kcm9pZC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9idXR0b25fbW91bnQiIG1zZ2lkPSIxMDUyMjU5OTMwMzY5NTA4MjM1Ij4iQXRpdmFyIG8gYXJtYXplbmFtZW50byBVU0IiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNTM0Nzg0NzUxNjAzMzQ1MzYzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQ4MTgzNDc3NTY0MDI3NDAyNjEiPiJIw6EgdW0gcHJvYmxlbWEgY29tIG8gdXNvIGRvIHNldSBjYXJ0w6NvIFNEIHBhcmEgYXJtYXplbmFtZW50byBVU0IuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiJIw6EgdW0gcHJvYmxlbWEgY29tIG8gdXNvIGRvIHNldSBjYXJ0w6NvIFNEIHBhcmEgYXJtYXplbmFtZW50byBVU0IuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiJIw6EgdW0gcHJvYmxlbWEgY29tIG8gdXNvIGRvIHNldSBjYXJ0w6NvIFNEIHBhcmEgYXJtYXplbmFtZW50byBVU0IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODE3NTg5MjU1NDc1NzIxNjUyNSI+IkNvbmVjdGFkbyBwb3IgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MzgwMDgyNDA0Mjg4MjE5MzQxIj4iU2VsZWNpb25lIHBhcmEgY29waWFyIGFycXVpdm9zIHBhcmEvZG8gc2V1IGNvbXB1dGFkb3IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIyMzM2MDU4Mzk2NjYzNTE2MDE3Ij4iRGVzYXRpdmFyIG8gYXJtYXplbmFtZW50byBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjU5MTgxMzQ5MDI2OTg0MTUzOSI+IlNlbGVjaW9uZSBwYXJhIGRlc2F0aXZhciBvIGFybWF6ZW5hbWVudG8gVVNCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfdGl0bGUiIG1zZ2lkPSI2NjAxMjk4NTE3MDg3NzU4NTMiPiJBcm1hemVuYW1lbnRvIFVTQiBlbSB1c28iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjEzNzEzMzk2NDI2NjA0MTA0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODc0NTM0NTI2MDc4MDI2NzE4NSI+IkFudGVzIGRlIGRlc2F0aXZhciBvIGFybWF6ZW5hbWVudG8gVVNCLCB2ZXJpZmlxdWUgc2UgZGVzY29uZWN0b3UgKOKAnGVqZXRvdeKAnSkgbyBjYXJ0w6NvIFNEIGRvIEFuZHJvaWQgZG8gY29tcHV0YWRvci4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4iQW50ZXMgZGUgZGVzYXRpdmFyIG8gYXJtYXplbmFtZW50byBVU0IsIHZlcmlmaXF1ZSBzZSBkZXNjb25lY3RvdSAo4oCcZWpldG914oCdKSBvIGNhcnTDo28gU0QgZG8gQW5kcm9pZCBkbyBjb21wdXRhZG9yLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJBbnRlcyBkZSBkZXNhdGl2YXIgbyBhcm1hemVuYW1lbnRvIFVTQiwgdmVyaWZpcXVlIHNlIGRlc2NvbmVjdG91ICjigJxlamV0b3XigJ0pIG8gY2FydMOjbyBTRCBkbyBBbmRyb2lkIGRvIGNvbXB1dGFkb3IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9idXR0b25fbW91bnQiIG1zZ2lkPSI3MDYwMjE4MDM0OTAwNjk2MDI5Ij4iRGVzYXRpdmFyIG8gYXJtYXplbmFtZW50byBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIxNDM4ODE5MTQ4NDA0MTIxMDgiPiJIb3V2ZSB1bSBwcm9ibGVtYSBhbyBkZXNhdGl2YXIgbyBhcm1hemVuYW1lbnRvIFVTQi4gVmVyaWZpcXVlIHNlIGRlc2NvbmVjdG91IG8gaG9zdCBVU0IgZSB0ZW50ZSBub3ZhbWVudGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RpdGxlIiBtc2dpZD0iOTYzMDM5MDMzNDcwNDc4Njk3Ij4iQXRpdmFyIG8gYXJtYXplbmFtZW50byBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGV4dCIgbXNnaWQ9IjMyMDI4MzgyMzQ3ODA1MDU4ODYiPiJTZSB2b2PDqiBhdGl2YXIgbyBhcm1hemVuYW1lbnRvIFVTQiwgYWxndW5zIGFwbGljYXRpdm9zIHF1ZSBlc3TDo28gZW0gdXNvIHNlcsOjbyBpbnRlcnJvbXBpZG9zIGUgcG9kZXLDo28gbsOjbyBlc3RhciBkaXNwb27DrXZlaXMgYXTDqSB2b2PDqiBkZXNhdGl2YXIgbyBhcm1hemVuYW1lbnRvIFVTQi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfZXJyb3JfdGl0bGUiIG1zZ2lkPSI4MDQ4OTk5OTczODM3MzM5MTc0Ij4iRmFsaGEgZGUgb3BlcmHDp8OjbyBkZSBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfb2siIG1zZ2lkPSI3Mzc2OTUzMTY3MDM5ODY1NzAxIj4iT0siPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4NjYzMjQ3OTI5NTUxMDk1ODU0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjU3NzkwODAwNjk0OTc0MjIxNyI+IkZvcm1hdGFyIGNhcnTDo28gU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4NjYzMjQ3OTI5NTUxMDk1ODU0Ij4iRm9ybWF0YXIgY2FydMOjbyBTRCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MjEzNjk5NjI0MzM1MjM2MTkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM0NzA4MTUxNDAwNjg1MDI4MjQiPiJUZW0gY2VydGV6YSBkZSBxdWUgZGVzZWphIGZvcm1hdGFyIG8gY2FydMOjbyBTRD8gVG9kb3Mgb3MgZGFkb3Mgbm8gc2V1IGNhcnTDo28gc2Vyw6NvIHBlcmRpZG9zLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+IlRlbSBjZXJ0ZXphIGRlIHF1ZSBkZXNlamEgZm9ybWF0YXIgbyBjYXJ0w6NvIFNEPyBUb2RvcyBvcyBkYWRvcyBubyBzZXUgY2FydMOjbyBzZXLDo28gcGVyZGlkb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IkZvcm1hdGFyIGNhcnTDo28gU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiJUZW0gY2VydGV6YSBkZSBxdWUgZGVzZWphIGZvcm1hdGFyIG8gY2FydMOjbyBTRD8gVG9kb3Mgb3MgZGFkb3Mgbm8gc2V1IGNhcnTDo28gc2Vyw6NvIHBlcmRpZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9idXR0b25fZm9ybWF0IiBtc2dpZD0iNDEzMTA2NDU2MDEyNzQ3ODY5NSI+IkZvcm1hdGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5MDQ0Nzc4OTQ5MTg5OTE4Ij4iRGVwdXJhw6fDo28gVVNCIGNvbmVjdGFkYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4NDcwMjk2ODE4MjcwMTEwMzk2Ij4iU2VsZWNpb25lIHBhcmEgZGVzYXRpdmFyIGEgZGVwdXJhw6fDo28gVVNCLiI8L3N0cmluZz4KQEAgLTg0MSwyOSArODI2LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9hbHBoYWJldCIgbXNnaWQ9IjU0MzMyNzU0ODU0OTkwMzkxOTkiPiIgQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9udW1lcmljX2FscGhhYmV0IiBtc2dpZD0iNDAzMDE3MDUyNDU5NTEyMzYxMCI+IiAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYW5kaWRhdGVzX3N0eWxlIiBtc2dpZD0iNDMzMzkxMzA4OTYzNzA2MjI1NyI+PHU+ImNhbmRpZGF0b3MiPC91Pjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTQ1NzYwMzQxODk3MDk5NDA1MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MjM5NTE2Njc1MDI4NDM4OTk3Ij4iUHJlcGFyYW5kbyBvIGNhcnTDo28gU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+IlByZXBhcmFuZG8gbyBjYXJ0w6NvIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiJQcmVwYXJhbmRvIG8gY2FydMOjbyBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjgyODczMTk4ODI5MjY3MzcwNTMiPiJQcm9jdXJhbmRvIGVycm9zLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc4MDQ3NzgzODI0MTIxMjk5NyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM5MzczNDU1Nzc5ODM3MzA4NzMiPiJDYXJ0w6NvIFNEIGVtIGJyYW5jbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IkNhcnTDo28gU0QgZW0gYnJhbmNvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTMxMjI2NjgyMDA5Mjk1ODAxNCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTYwNjY2MDc1NjEyNDYyOTcwOCI+Ik8gY2FydMOjbyBTRCBlc3TDoSBlbSBicmFuY28gb3UgZXN0w6EgdXNhbmRvIHVtIHNpc3RlbWEgZGUgYXJxdWl2b3MgbsOjbyBzdXBvcnRhZG8uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iQ2FydMOjbyBTRCB2YXppbyBvdSBjb20gc2lzdGVtYSBkZSBhcnF1aXZvcyBpbmNvbXBhdMOtdmVsLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY0MTA3MjM5MDYwMTkxMDAxODkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTcyNDYxOTkwMjA3NjUyODg4OSI+IkNhcnTDo28gU0QgZGFuaWZpY2FkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iQ2FydMOjbyBTRCBkYW5pZmljYWRvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjY3OTQxMjg4NDI5MDA2MTc3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY0NjAzMTE4MzUxMzA2NzExOTQiPiJPIGNhcnTDo28gU0QgZXN0w6EgZGFuaWZpY2Fkby4gVGFsdmV6IHNlamEgbmVjZXNzw6FyaW8gcmVmb3JtYXRhciBvIHNldSBjYXJ0w6NvLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY5MDI1MzE3NzU5NDgyMzg5ODkiPiJPIGNhcnTDo28gU0QgZXN0w6EgZGFuaWZpY2Fkby4gVGFsdmV6IHNlamEgbmVjZXNzw6FyaW8gcmVmb3JtYXTDoS1sby4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2ODcyMTUyODgyNjA0NDA3ODM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjU4MjE3NTAxNjA2MDQzMjAzNCI+IkNhcnTDo28gU0QgcmVtb3ZpZG8gaW5lc3BlcmFkYW1lbnRlLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJDYXJ0w6NvIFNEIHJlbW92aWRvIGluZXNwZXJhZGFtZW50ZS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3MjYwMTgzMjkzNzQ3NDQ4MjQxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyMDA1Mzk2NDY0NDk0NjQ4OTM3Ij4iRGVzbW9udGUgbyBjYXJ0w6NvIFNEIGFudGVzIGRhIHJlbW/Dp8OjbyBwYXJhIGV2aXRhciBhIHBlcmRhIGRlIGRhZG9zLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+IkRlc21vbnRlIG8gY2FydMOjbyBTRCBhbnRlcyBkYSByZW1vw6fDo28gcGFyYSBldml0YXIgYSBwZXJkYSBkZSBkYWRvcy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NzI5ODAxMTMwNzkwNjE2MjAwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNjUyNTg4MTAxODY3OTUxNSI+Ik8gY2FydMOjbyBTRCBqw6EgcG9kZSBzZXIgcmVtb3ZpZG8gY29tIHNlZ3VyYW7Dp2EuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iTyBjYXJ0w6NvIFNEIGrDoSBwb2RlIHNlciByZW1vdmlkbyBjb20gc2VndXJhbsOnYS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3NjEzOTYwNjg2NzQ3NTkyNzcwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijc1MDM3NjkxMDYyODUxODg3MDMiPiJPIGNhcnTDo28gU0QgasOhIHBvZGUgc2VyIHJlbW92aWRvIGNvbSBzZWd1cmFuw6dhLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiJWb2PDqiBwb2RlIHJlbW92ZXIgbyBjYXJ0w6NvIFNEIGNvbSBzZWd1cmFuw6dhLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg5MDI1MTgwMzA0MDQzODEzMTggLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxODc0ODg5NzY0MzY3MDg1NTYyIj4iQ2FydMOjbyBTRCByZW1vdmlkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiJDYXJ0w6NvIFNEIHJlbW92aWRvIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDIwNTExNzIyNzM0MjgyMjI3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjczMDg5MDQ0MTMzMTM0NDc3NiI+Ik8gU0QgZm9pIHJlbW92aWRvLiBJbnNpcmEgdW0gbm92byBjYXJ0w6NvIFNEIHBhcmEgYXVtZW50YXIgbyBhcm1hemVuYW1lbnRvIGRvIHNldSBkaXNwb3NpdGl2by4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4NzAxMjA2NTI5ODM2NTk2NDEiPiJDYXJ0w6NvIFNEIHJlbW92aWRvLiBJbnNpcmEgdW0gbm92by4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI3ODA0Nzc4MzgyNDEyMTI5OTciPiJDYXJ0w6NvIFNEIGVtIGJyYW5jbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IkNhcnTDo28gU0QgdmF6aW8gb3UgY29tIHNpc3RlbWEgZGUgYXJxdWl2b3MgaW5jb21wYXTDrXZlbC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjQxMDcyMzkwNjAxOTEwMDE4OSI+IkNhcnTDo28gU0QgZGFuaWZpY2FkbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY5MDI1MzE3NzU5NDgyMzg5ODkiPiJPIGNhcnTDo28gU0QgZXN0w6EgZGFuaWZpY2Fkby4gVGFsdmV6IHNlamEgbmVjZXNzw6FyaW8gcmVmb3JtYXTDoS1sby4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iQ2FydMOjbyBTRCByZW1vdmlkbyBpbmVzcGVyYWRhbWVudGUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4iRGVzbW9udGUgbyBjYXJ0w6NvIFNEIGFudGVzIGRhIHJlbW/Dp8OjbyBwYXJhIGV2aXRhciBhIHBlcmRhIGRlIGRhZG9zLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+Ik8gY2FydMOjbyBTRCBqw6EgcG9kZSBzZXIgcmVtb3ZpZG8gY29tIHNlZ3VyYW7Dp2EuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IlZvY8OqIHBvZGUgcmVtb3ZlciBvIGNhcnTDo28gU0QgY29tIHNlZ3VyYW7Dp2EuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IkNhcnTDo28gU0QgcmVtb3ZpZG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjM4NzAxMjA2NTI5ODM2NTk2NDEiPiJDYXJ0w6NvIFNEIHJlbW92aWRvLiBJbnNpcmEgdW0gbm92by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY3Rpdml0eV9saXN0X2VtcHR5IiBtc2dpZD0iNDE2ODgyMDYwOTQwMzM4NTc4OSI+Ik5lbmh1bSBhdGl2aWRhZGUgY29ycmVzcG9uZGVudGUgZm9pIGVuY29udHJhZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4Nzg3MzUyMDc0MzI2NzQ4ODkyIj4iYXR1YWxpemFyIGVzdGF0w61zdGljYXMgZGUgdXNvIGRvIGNvbXBvbmVudGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODkxNTUzNjk1NzE2NzUyODM1Ij4iUGVybWl0ZSBhIG1vZGlmaWNhw6fDo28gZGFzIGVzdGF0w61zdGljYXMgZGUgdXNvIGRvIGNvbXBvbmVudGUgY29sZXRhZGFzLiBOw6NvIGRldmUgc2VyIHVzYWRvIHBvciBhcGxpY2F0aXZvcyBub3JtYWlzLiI8L3N0cmluZz4KQEAgLTg5OCwxNSArODcyLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iVlBOIEwyVFAvSVBTZWMgY29tIGJhc2UgZW0gY2hhdmUgcHLDqS1jb21wYXJ0aWxoYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlZQTiBMMlRQL0lQU2VjIGNvbSBiYXNlIGVtIGNlcnRpZmljYWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iRXNjb2xoZXIgYXJxdWl2byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+Ik5lbmh1bSBhcnF1aXZvIGVzY29saGlkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IlJlZGVmaW5pciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJFbnZpYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+ImZhdm9yaXRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iTW9kbyBkZSBjYXJybyBhdGl2YWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IlNlbGVjaW9uZSBwYXJhIHNhaXIgZG8gbW9kbyBkZSBjYXJyby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iVsOtbmN1bG8gb3UgcG9udG8gZGUgYWNlc3NvIGF0aXZvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iVG9xdWUgcGFyYSBjb25maWd1cmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iVm9sdGFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iQXZhbsOnYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiJJZ25vcmFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iQWx0byB1c28gZGUgZGFkb3MgZG8gY2VsdWxhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iVG9xdWUgcGFyYSBzYWJlciBtYWlzIHNvYnJlIHVzbyBkZSBkYWRvcyBkbyBjZWx1bGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJMaW1pdGUgZGUgZGFkb3MgZG8gY2VsdWxhciBleGNlZGlkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiJUb3F1ZSBwYXJhIHNhYmVyIG1haXMgc29icmUgbyB1c28gZGUgZGFkb3MgZG8gY2VsdWxhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX21hdGNoZXMiIG1zZ2lkPSI4MTI5NDIxOTA4OTE1ODQwNzM3Ij4iTsOjbyBlbmNvbnRyYWRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZmluZF9vbl9wYWdlIiBtc2dpZD0iMTk0Njc5OTIzMzgyMjgyMDM4NCI+IkxvY2FsaXphciBuYSBww6FnaW5hIjwvc3RyaW5nPgorICA8cGx1cmFscyBuYW1lPSJtYXRjaGVzX2ZvdW5kIj4KKyAgICA8aXRlbSBxdWFudGl0eT0ib25lIiBtc2dpZD0iODE2NzE0NzA4MTEzNjU3OTQzOSI+IlVtYSBjb3JyZXNwb25kw6puY2lhIjwvaXRlbT4KKyAgICA8aXRlbSBxdWFudGl0eT0ib3RoZXIiIG1zZ2lkPSI0NjQxODcyNzk3MDY3NjA5MTc3Ij4iPHhsaWZmOmcgaWQ9IklOREVYIj4lZDwveGxpZmY6Zz4gZGUgPHhsaWZmOmcgaWQ9IlRPVEFMIj4lZDwveGxpZmY6Zz4iPC9pdGVtPgorICA8L3BsdXJhbHM+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm0tckNIL2FycmF5cy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJtLXJDSC9hcnJheXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZTg2MTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJtLXJDSC9hcnJheXMueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9hc3NldHMvcmVzL2FueS9jb2xvcnMueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMTAsIEdvb2dsZSBJbmMuCisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxyZXNvdXJjZXM+CisKKyAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuIC0tPgorICAgIDxpbnRlZ2VyLWFycmF5IG5hbWU9Im1hcHNfc3RhcnRpbmdfbGF0X2xuZyI+CisgICAgICAgIDxpdGVtPjQ2OTQ4MDIwPC9pdGVtPgorICAgICAgICA8aXRlbT43NDQ4MjA2PC9pdGVtPgorICAgIDwvaW50ZWdlci1hcnJheT4KKyAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuIC0tPgorICAgIDxpbnRlZ2VyLWFycmF5IG5hbWU9Im1hcHNfc3RhcnRpbmdfem9vbSI+CisgICAgICAgIDxpdGVtPjQ8L2l0ZW0+CisgICAgPC9pbnRlZ2VyLWFycmF5PgorCis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm0vZG9ub3R0cmFuc2xhdGUtY2xkci54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJtL2Rvbm90dHJhbnNsYXRlLWNsZHIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZGIxN2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJtL2Rvbm90dHJhbnNsYXRlLWNsZHIueG1sCkBAIC0wLDAgKzEsMTQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zdGFuZGFsb25lX2phbnVhcnkiPnNjaGFuZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc3RhbmRhbG9uZV9mZWJydWFyeSI+ZmF2cmVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX3N0YW5kYWxvbmVfbWFyY2giPm1hcnM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc3RhbmRhbG9uZV9hcHJpbCI+YXZyaWdsPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX3N0YW5kYWxvbmVfbWF5Ij5tYXRnPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX3N0YW5kYWxvbmVfanVuZSI+emVyY2xhZHVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX3N0YW5kYWxvbmVfanVseSI+ZmFuYWR1cjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zdGFuZGFsb25lX2F1Z3VzdCI+YXZ1c3Q8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc3RhbmRhbG9uZV9zZXB0ZW1iZXIiPnNldHRlbWJlcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zdGFuZGFsb25lX29jdG9iZXIiPm9jdG9iZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc3RhbmRhbG9uZV9ub3ZlbWJlciI+bm92ZW1iZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc3RhbmRhbG9uZV9kZWNlbWJlciI+ZGVjZW1iZXI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19qYW51YXJ5Ij5zY2hhbmVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX2ZlYnJ1YXJ5Ij5mYXZyZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfbWFyY2giPm1hcnM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfYXByaWwiPmF2cmlnbDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19tYXkiPm1hdGc8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfanVuZSI+emVyY2xhZHVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX2p1bHkiPmZhbmFkdXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfYXVndXN0Ij5hdnVzdDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zZXB0ZW1iZXIiPnNldHRlbWJlcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19vY3RvYmVyIj5vY3RvYmVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX25vdmVtYmVyIj5ub3ZlbWJlcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19kZWNlbWJlciI+ZGVjZW1iZXI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX2phbnVhcnkiPnNjaGFuLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX2ZlYnJ1YXJ5Ij5mYXZyLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX21hcmNoIj5tYXJzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9tZWRpdW1fYXByaWwiPmF2ci48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9tYXkiPm1hdGc8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9qdW5lIj56ZXJjbC48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9qdWx5Ij5mYW4uPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9tZWRpdW1fYXVndXN0Ij5hdnVzdDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX3NlcHRlbWJlciI+c2V0dC48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9vY3RvYmVyIj5vY3QuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9tZWRpdW1fbm92ZW1iZXIiPm5vdi48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9kZWNlbWJlciI+ZGVjLjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJtb250aF9zaG9ydGVzdF9qYW51YXJ5Ij5TPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9zaG9ydGVzdF9mZWJydWFyeSI+Rjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfc2hvcnRlc3RfbWFyY2giPk08L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3Nob3J0ZXN0X2FwcmlsIj5BPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9zaG9ydGVzdF9tYXkiPk08L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3Nob3J0ZXN0X2p1bmUiPlo8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3Nob3J0ZXN0X2p1bHkiPkY8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3Nob3J0ZXN0X2F1Z3VzdCI+QTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfc2hvcnRlc3Rfc2VwdGVtYmVyIj5TPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9zaG9ydGVzdF9vY3RvYmVyIj5PPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9zaG9ydGVzdF9ub3ZlbWJlciI+Tjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfc2hvcnRlc3RfZGVjZW1iZXIiPkQ8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfbG9uZ19zdW5kYXkiPmR1bWVuZ2lhPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19sb25nX21vbmRheSI+Z2xpbmRlc2RpPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19sb25nX3R1ZXNkYXkiPm1hcmRpPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19sb25nX3dlZG5lc2RheSI+bWVzZW1uYTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfbG9uZ190aHVyc2RheSI+Z2lldmdpYTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfbG9uZ19mcmlkYXkiPnZlbmRlcmRpPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19sb25nX3NhdHVyZGF5Ij5zb25kYTwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19tZWRpdW1fc3VuZGF5Ij5kdTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfbWVkaXVtX21vbmRheSI+Z2xpPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19tZWRpdW1fdHVlc2RheSI+bWE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX21lZGl1bV93ZWRuZXNkYXkiPm1lPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19tZWRpdW1fdGh1cnNkYXkiPmdpZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfbWVkaXVtX2ZyaWRheSI+dmU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX21lZGl1bV9zYXR1cmRheSI+c288L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRfc3VuZGF5Ij5kdTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRfbW9uZGF5Ij5nbGk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0X3R1ZXNkYXkiPm1hPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydF93ZWRuZXNkYXkiPm1lPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydF90aHVyc2RheSI+Z2llPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydF9mcmlkYXkiPnZlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydF9zYXR1cmRheSI+c288L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRlc3Rfc3VuZGF5Ij5EPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydGVzdF9tb25kYXkiPkc8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0ZXN0X3R1ZXNkYXkiPk08L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0ZXN0X3dlZG5lc2RheSI+TTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRlc3RfdGh1cnNkYXkiPkc8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0ZXN0X2ZyaWRheSI+Vjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRlc3Rfc2F0dXJkYXkiPlM8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0ieWVzdGVyZGF5Ij5pZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRvZGF5Ij5vejwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idG9tb3Jyb3ciPmRhbWF1bjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJob3VyX21pbnV0ZV8yNCI+JS1rOiVNPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJob3VyX21pbnV0ZV9hbXBtIj4lLWw6JU0gJXA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImhvdXJfbWludXRlX2NhcF9hbXBtIj4lLWw6JU0gJV5wPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0d2VsdmVfaG91cl90aW1lX2Zvcm1hdCI+aDptbSBhPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0d2VudHlfZm91cl9ob3VyX3RpbWVfZm9ybWF0Ij5IOm1tPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJudW1lcmljX2RhdGUiPiVkLiVtLiVZPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJudW1lcmljX2RhdGVfZm9ybWF0Ij5kZC5NTS55eXl5PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJudW1lcmljX2RhdGVfdGVtcGxhdGUiPiIlcy4lcy4lcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2RheV95ZWFyIj4lLWUuICVCICVZPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aW1lX29mX2RheSI+JUg6JU06JVM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRhdGVfYW5kX3RpbWUiPiVIOiVNOiVTICVkLiVtLiVZPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXRlX3RpbWUiPiUxJHMsICUyJHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpbWVfZGF0ZSI+JTMkcywgJTEkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWJicmV2X21vbnRoX2RheV95ZWFyIj4lZC4lbS4lWTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfZGF5Ij4lLWUuICVCPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aCI+JS1CPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF95ZWFyIj4lQiAlWTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWJicmV2X21vbnRoX2RheSI+JS1lLiAlYjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWJicmV2X21vbnRoIj4lLWI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFiYnJldl9tb250aF95ZWFyIj4lYiAlWTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGltZTFfdGltZTIiPiUxJHMgLSAlMiRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXRlMV9kYXRlMiI+JTIkcyAtICU1JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im51bWVyaWNfbWQxX21kMiI+JTMkcy4lMiRzLiAtICU4JHMuJTckcy48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im51bWVyaWNfd2RheTFfbWQxX3dkYXkyX21kMiI+JTEkcywgJTMkcy4lMiRzLiAtICU2JHMsICU4JHMuJTckcy48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im51bWVyaWNfbWR5MV9tZHkyIj4lMyRzLiUyJHMuJTQkcyAtICU4JHMuJTckcy4lOSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJudW1lcmljX3dkYXkxX21keTFfd2RheTJfbWR5MiI+JTEkcywgJTMkcy4lMiRzLiU0JHMgLSAlNiRzLCAlOCRzLiU3JHMuJTkkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibnVtZXJpY193ZGF5MV9tZHkxX3RpbWUxX3dkYXkyX21keTJfdGltZTIiPiU1JHMgJTEkcywgJTQkcy0lMiRzLSUzJHMgLSAlMTAkcyAlNiRzLCAlOSRzLSU3JHMtJTgkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibnVtZXJpY19tZDFfdGltZTFfbWQyX3RpbWUyIj4lNSRzICUzJHMuJTIkcy4gLSAlMTAkcyAlOCRzLiU3JHMuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJudW1lcmljX3dkYXkxX21kMV90aW1lMV93ZGF5Ml9tZDJfdGltZTIiPiU1JHMgJTEkcywgJTMkcy4lMiRzLiAtICUxMCRzICU2JHMsICU4JHMuJTckcy48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im51bWVyaWNfbWR5MV90aW1lMV9tZHkyX3RpbWUyIj4lNSRzICUzJHMuJTIkcy4lNCRzIC0gJTEwJHMgJTgkcy4lNyRzLiU5JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9IndkYXkxX2RhdGUxX3RpbWUxX3dkYXkyX2RhdGUyX3RpbWUyIj4lMyRzICUxJHMgJTIkcyAtICU2JHMgJTQkcyAlNSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ3ZGF5MV9kYXRlMV93ZGF5Ml9kYXRlMiI+JTEkcyAlMiRzIC0gJTQkcyAlNSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXRlMV90aW1lMV9kYXRlMl90aW1lMiI+JTMkcyAlMiRzIC0gJTYkcyAlNSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aW1lX3dkYXlfZGF0ZSI+JTEkcyAlMiRzICUzJHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9IndkYXlfZGF0ZSI+JTIkcyAlMyRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aW1lX3dkYXkiPiUxJHMgJTIkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV95ZWFyX21kMV9tZDIiPiUzJHMuICUyJHMgLSAlOCRzLiAlNyRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX3llYXJfd2RheTFfbWQxX3dkYXkyX21kMiI+JTEkcyAlMyRzLiAlMiRzIC0gJTYkcyAlOCRzLiAlNyRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX3llYXJfbWQxX3RpbWUxX21kMl90aW1lMiI+JTUkcyAlMyRzLiAlMiRzIC0gJTEwJHMgJTgkcy4gJTckczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV9tb250aF9tZDFfdGltZTFfbWQyX3RpbWUyIj4lNSRzICUzJHMuICUyJHMgLSAlMTAkcyAlOCRzLiAlNyRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX3llYXJfd2RheTFfbWQxX3RpbWUxX3dkYXkyX21kMl90aW1lMiI+JTUkcyAlMSRzICUzJHMuICUyJHMgLSAlMTAkcyAlNiRzICU4JHMuICU3JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfbW9udGhfd2RheTFfbWQxX3RpbWUxX3dkYXkyX21kMl90aW1lMiI+JTUkcyAlMSRzICUzJHMuICUyJHMgLSAlMTAkcyAlNiRzICU4JHMuICU3JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfeWVhcl9tZHkxX3RpbWUxX21keTJfdGltZTIiPiU1JHMgJTMkcy4gJTIkcyAlNCRzIC0gJTEwJHMgJTgkcy4gJTckcyAlOSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX21vbnRoX21keTFfdGltZTFfbWR5Ml90aW1lMiI+JTUkcyAlMyRzLiAlMiRzICU0JHMgLSAlMTAkcyAlOCRzLiAlNyRzICU5JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfeWVhcl93ZGF5MV9tZHkxX3RpbWUxX3dkYXkyX21keTJfdGltZTIiPiU1JHMgJTEkcywgJTMkcy4gJTIkcyAlNCRzIC0gJTEwJHMgJTYkcywgJTgkcy4gJTckcyAlOSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX21vbnRoX3dkYXkxX21keTFfdGltZTFfd2RheTJfbWR5Ml90aW1lMiI+JTUkcyAlMSRzLCAlMyRzLiAlMiRzICU0JHMgLSAlMTAkcyAlNiRzLCAlOCRzLiAlNyRzICU5JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfbW9udGhfd2RheTFfbWR5MV93ZGF5Ml9tZHkyIj4lMSRzLCAlMyRzLiAlMiRzICU0JHMgLSAlNiRzLCAlOCRzLiAlNyRzICU5JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfbW9udGhfbWQxX21kMiI+JTMkcy4tJTgkcy4gJTIkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV9tb250aF93ZGF5MV9tZDFfd2RheTJfbWQyIj4lMSRzICUzJHMuICUyJHMgLSAlNiRzICU4JHMuICU3JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfeWVhcl9tZHkxX21keTIiPiUzJHMuICUyJHMgLSAlOCRzLiAlNyRzICU5JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfbW9udGhfbWR5MV9tZHkyIj4lMyRzLi0lOCRzLiAlMiRzICU5JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfeWVhcl93ZGF5MV9tZHkxX3dkYXkyX21keTIiPiUxJHMsICUzJHMuICUyJHMgLSAlNiRzLCAlOCRzLiAlNyRzICU5JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNob3J0X2Zvcm1hdF9tb250aCI+JWI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKaW5kZXggYTM2NmE4NS4uZjA0MGJkMCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sCkBAIC0xNjksOCArMTY5LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGxhYl9kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iMzQ0NjE2NDU4NDcxMDU5NjUxMyI+ItCY0L3RgdGC0YDRg9C80LXQvdGC0Ysg0YDQsNC30YDQsNCx0L7RgtC60LgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSI5MDU2NDMxMTkzODkzODA5ODE0Ij4i0KTRg9C90LrRhtC40LgsINC90LXQvtCx0YXQvtC00LjQvNGL0LUg0YLQvtC70YzQutC+INGA0LDQt9GA0LDQsdC+0YLRh9C40LrQsNC8INC/0YDQuNC70L7QttC10L3QuNC5LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGxhYl9zdG9yYWdlIiBtc2dpZD0iMTk3MTExODc3MDU0NjMzNjk2NiI+ItCf0LDQvNGP0YLRjCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkyMDMzMDIyMTQ5MTUzNTU3NzQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI1NDU1ODA0MzUzMjIwNTgxMzEyIj4i0JTQvtGB0YLRg9C/INC6IFNELdC60LDRgNGC0LUuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+ItCU0L7RgdGC0YPQvyDQuiBTRC3QutCw0YDRgtC1LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiLQlNC+0YHRgtGD0L8g0LogU0Qt0LrQsNGA0YLQtS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhciIgbXNnaWQ9Ijc0MTcxOTI2Mjk2MDE4OTA3OTEiPiLQvtGC0LrQu9GO0YfQsNGC0Ywg0LjQu9C4INC40LfQvNC10L3Rj9GC0Ywg0YHRgtGA0L7QutGDINGB0L7RgdGC0L7Rj9C90LjRjyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3N0YXR1c0JhciIgbXNnaWQ9IjEzNjU0NzM1OTUzMzE5ODk3MzIiPiLQn9C+0LfQstC+0LvRj9C10YIg0L/RgNC40LvQvtC20LXQvdC40Y4g0L7RgtC60LvRjtGH0LDRgtGMINGB0YLRgNC+0LrRgyDRgdC+0YHRgtC+0Y/QvdC40Y8g0LjQu9C4INC00L7QsdCw0LLQu9GP0YLRjC/Rg9C00LDQu9GP0YLRjCDRgdC40YHRgtC10LzQvdGL0LUg0LfQvdCw0YfQutC4LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyU2VydmljZSIgbXNnaWQ9IjcyNDcyODE5MTEzODc5MzE0ODUiPiLRgdGC0YDQvtC60LAg0YHQvtGB0YLQvtGP0L3QuNGPIjwvc3RyaW5nPgpAQCAtMjY3LDggKzI2NiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2xlYXJBcHBDYWNoZSIgbXNnaWQ9Ijc3NDA0NjU2OTQxOTM2NzE0MDIiPiLQn9C+0LfQstC+0LvRj9C10YIg0L/RgNC40LvQvtC20LXQvdC40Y4g0L7RgdCy0L7QsdC+0LbQtNCw0YLRjCDQv9Cw0LzRj9GC0Ywg0YLQtdC70LXRhNC+0L3QsCDRgSDQv9C+0LzQvtGJ0YzRjiDRg9C00LDQu9C10L3QuNGPINGE0LDQudC70L7QsiDQuNC3INC60LDRgtCw0LvQvtCz0LAg0LrRjdGI0LAg0L/RgNC40LvQvtC20LXQvdC40LkuINCe0LHRi9GH0L3QviDRjdGC0L4g0YDQsNC30YDQtdGI0LDQtdGC0YHRjyDRgtC+0LvRjNC60L4g0YHQuNGB0YLQtdC80L3Ri9C8INC/0YDQvtGG0LXRgdGB0LDQvC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX21vdmVQYWNrYWdlIiBtc2dpZD0iNzI4NDU0OTc5OTQ2NTAzOTI2Ij4i0J/QtdGA0LXQvNC10YnQsNGC0Ywg0YDQtdGB0YPRgNGB0Ysg0L/RgNC40LvQvtC20LXQvdC40Y8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19tb3ZlUGFja2FnZSIgbXNnaWQ9IjYzMjMwNDkyOTE5MjM5MjUyNzciPiLQn9C+0LfQstC+0LvRj9C10YIg0L/RgNC40LvQvtC20LXQvdC40Y4g0L/QtdGA0LXQvNC10YnQsNGC0Ywg0YDQtdGB0YPRgNGB0Ysg0L/RgNC40LvQvtC20LXQvdC40Y8g0YEg0LLQvdGD0YLRgNC10L3QvdC40YUg0L3QsCDQstC90LXRiNC90LjQtSDQvdC+0YHQuNGC0LXQu9C4INC4INC90LDQvtCx0L7RgNC+0YIuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDgxMTkyMTcwMzg4MjUzMjA3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkTG9ncyIgbXNnaWQ9IjY2MTU3Nzg1NDMxOTg5Njc2MTQiPiLRgdGH0LjRgtGL0LLQsNGC0Ywg0YHQuNGB0YLQtdC80L3Ri9C1INGE0LDQudC70Ysg0LbRg9GA0L3QsNC70L7QsiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIyNTc5Mzc5NTU1ODA0NzU5MDIgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+ItCf0L7Qt9Cy0L7Qu9GP0LXRgiDQv9GA0LjQu9C+0LbQtdC90LjRjiDRgdGH0LjRgtGL0LLQsNGC0Ywg0LjQvdGE0L7RgNC80LDRhtC40Y4g0LjQtyDRgNCw0LfQu9C40YfQvdGL0YUg0LbRg9GA0L3QsNC70L7QsiDRgdC40YHRgtC10LzRiy4g0J/RgNC40LvQvtC20LXQvdC40LUg0LzQvtC20LXRgiDQv9C+0LvRg9GH0LjRgtGMINGB0LLQtdC00LXQvdC40Y8g0L4g0YDQsNCx0L7RgtC1INC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjyDRgSDRgtC10LvQtdGE0L7QvdC+0LwsINC90L4g0L7QvdC4INC90LUg0LTQvtC70LbQvdGLINGB0L7QtNC10YDQttCw0YLRjCDQutCw0LrQvtC5LdC70LjQsdC+INC70LjRh9C90L7QuSDQuNC70Lgg0LrQvtC90YTQuNC00LXQvdGG0LjQsNC70YzQvdC+0Lkg0LjQvdGE0L7RgNC80LDRhtC40LguIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfcmVhZExvZ3MgKDY2MTU3Nzg1NDMxOTg5Njc2MTQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfcmVhZExvZ3MgKDg4OTY0NDk0Mzc0NjQ4Njc3NjYpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2RpYWdub3N0aWMiIG1zZ2lkPSI4MDc2NzQzOTUzOTA4MDAwMzQyIj4i0YHRh9C40YLRi9Cy0LDRgtGML9C30LDQv9C40YHRi9Cy0LDRgtGMINC00LDQvdC90YvQtSDQsiDRgNC10YHRg9GA0YHRiywg0L/RgNC40L3QsNC00LvQtdC20LDRidC40LUg0LPRgNGD0L/Qv9C1INC00LjQsNCz0L3QvtGB0YLQuNC60LgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaWFnbm9zdGljIiBtc2dpZD0iMzEyMTIzODM3Mzk1MTYzNzA0OSI+ItCf0L7Qt9Cy0L7Qu9GP0LXRgiDQv9GA0LjQu9C+0LbQtdC90LjRjiDRgdGH0LjRgtGL0LLQsNGC0Ywg0Lgg0LfQsNC/0LjRgdGL0LLQsNGC0Ywg0LTQsNC90L3Ri9C1INCyINC70Y7QsdGL0LUg0YDQtdGB0YPRgNGB0YssINC/0YDQuNC90LDQtNC70LXQttCw0YnQuNC1INCz0YDRg9C/0L/QtSDQtNC40LDQs9C90L7RgdGC0LjQutC4ICjQvdCw0L/RgNC40LzQtdGALCDRhNCw0LnQu9GLINCyINC60LDRgtCw0LvQvtCz0LUgL2RldikuINCt0YLQviDQvNC+0LbQtdGCINC/0L7QstC70LjRj9GC0Ywg0L3QsCDRgdGC0LDQsdC40LvRjNC90L7RgdGC0Ywg0Lgg0LHQtdC30L7Qv9Cw0YHQvdC+0YHRgtGMINGB0LjRgdGC0LXQvNGLLiDQrdGC0LAg0LLQvtC30LzQvtC20L3QvtGB0YLRjCDQvNC+0LbQtdGCINCx0YvRgtGMINC40YHQv9C+0LvRjNC30L7QstCw0L3QsCDQotCe0JvQrNCa0J4g0L/RgNC+0LjQt9Cy0L7QtNC40YLQtdC70LXQvCDQuNC70Lgg0L7Qv9C10YDQsNGC0L7RgNC+0Lwg0LTQu9GPINC00LjQsNCz0L3QvtGB0YLQuNC60Lgg0LDQv9C/0LDRgNCw0YLQvdC+0LPQviDQvtCx0LXRgdC/0LXRh9C10L3QuNGPLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2hhbmdlQ29tcG9uZW50U3RhdGUiIG1zZ2lkPSI3OTQyNTE5ODgzNDMyOTQwNiI+ItCy0LrQu9GO0YfQsNGC0Ywg0LjQu9C4INC+0YLQutC70Y7Rh9Cw0YLRjCDQutC+0LzQv9C+0L3QtdC90YLRiyDQv9GA0LjQu9C+0LbQtdC90LjRjyI8L3N0cmluZz4KQEAgLTQwMywyMiArNDA0LDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aEFkbWluIiBtc2dpZD0iNzI1NjI4OTc3NDY2NzA1NDU1NSI+ItCf0L7Qt9Cy0L7Qu9GP0LXRgiDQv9GA0LjQu9C+0LbQtdC90LjRjiDQvdCw0YHRgtGA0LDQuNCy0LDRgtGMINC70L7QutCw0LvRjNC90YvQuSDRgtC10LvQtdGE0L7QvSBCbHVldG9vdGgsINC+0LHQvdCw0YDRg9C20LjQstCw0YLRjCDQuCDQstGL0L/QvtC70L3Rj9GC0Ywg0YHQvtC/0YDRj9C20LXQvdC40LUg0YPQtNCw0LvQtdC90L3Ri9GFINGD0YHRgtGA0L7QudGB0YLQsi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2JsdWV0b290aCIgbXNnaWQ9IjgzNjEwMzg3MDc4NTcwMTg3MzIiPiLRgdC+0LfQtNCw0LLQsNGC0Ywg0L/QvtC00LrQu9GO0YfQtdC90LjRjyBCbHVldG9vdGgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGgiIG1zZ2lkPSI3NjI1MTUzODA2NzkzOTI5NDUiPiLQn9C+0LfQstC+0LvRj9C10YIg0L/RgNC40LvQvtC20LXQvdC40Y4g0L/RgNC+0YHQvNCw0YLRgNC40LLQsNGC0Ywg0LrQvtC90YTQuNCz0YPRgNCw0YbQuNGOINC70L7QutCw0LvRjNC90L7Qs9C+INGC0LXQu9C10YTQvtC90LAgQmx1ZXRvb3RoLCDRgdC+0LfQtNCw0LLQsNGC0Ywg0L/QvtC00LrQu9GO0YfQtdC90LjRjyDRgSDRgdC+0L/RgNGP0LbQtdC90L3Ri9C80Lgg0YPRgdGC0YDQvtC50YHRgtCy0LDQvNC4LiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0FkbWluICgyMjUxMzAyMjMzMDEyMjUwMDU2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0FkbWluICgxOTM1ODQyNjExNDY0ODk1Nzg1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjUmF3ICg0NDIzNDcxNzExMTE0MzI1NzA4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY1JhdyAoNTUzMzAyMjczNjU1OTM4NTY2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY05vdGlmeSAoNDc4NDcwMzYwMDgyNzkyMzU4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY05vdGlmeSAoMjk5MDA1MzUxNzk2MjA3MDYxNykgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0xsY3AgKDQ5NzIwNTE0NjEwMDcwMzA0MjYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTGxjcCAoOTE1OTIxMjc3ODYwMDQ2NDApIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjQ5Nzc0MDYxNjQzMTE1MzUwOTIiPiLQvtGC0LrQu9GO0YfQsNGC0Ywg0LHQu9C+0LrQuNGA0L7QstC60YMg0LrQu9Cw0LLQuNCw0YLRg9GA0YsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSIzMTg5NzYzNDc5MzI2MzAyMDE3Ij4i0J/QvtC30LLQvtC70Y/QtdGCINC/0YDQuNC70L7QttC10L3QuNGOINC+0YLQutC70Y7Rh9C40YLRjCDQsdC70L7QutC40YDQvtCy0LrRgyDQutC70LDQstC40LDRgtGD0YDRiyDQuCDQtNGA0YPQs9C40LUg0YTRg9C90LrRhtC40Lgg0LfQsNGJ0LjRgtGLINC/0LDRgNC+0LvQtdC8LiDQn9GA0LjQvNC10YDQvtC8INC00L7Qv9GD0YHRgtC40LzQvtCz0L4g0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8g0Y3RgtC+0Lkg0YTRg9C90LrRhtC40Lgg0Y/QstC70Y/QtdGC0YHRjyDQvtGC0LrQu9GO0YfQtdC90LjQtSDQsdC70L7QutC40YDQvtCy0LrQuCDQutC70LDQstC40LDRgtGD0YDRiyDQv9GA0Lgg0L/QvtC70YPRh9C10L3QuNC4INCy0YXQvtC00Y/RidC10LPQviDQstGL0LfQvtCy0LAg0Lgg0LLQutC70Y7Rh9C10L3QuNC1INCx0LvQvtC60LjRgNC+0LLQutC4INC/0L7RgdC70LUg0LfQsNCy0LXRgNGI0LXQvdC40Y8g0YDQsNC30LPQvtCy0L7RgNCwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFN5bmNTZXR0aW5ncyIgbXNnaWQ9IjYyMDE4MTAwMDgyMzA1MDMwNTIiPiLRgdGH0LjRgtGL0LLQsNGC0Ywg0L3QsNGB0YLRgNC+0LnQutC4INGB0LjQvdGF0YDQvtC90LjQt9Cw0YbQuNC4Ijwvc3RyaW5nPgpAQCAtNDM1LDIyICs0MjAsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iMTA4Mjk3MjYwMzU3NjM2MDY5MCI+ItCf0L7Qt9Cy0L7Qu9GP0LXRgiDQv9GA0LjQu9C+0LbQtdC90LjRjiDRgdGH0LjRgtGL0LLQsNGC0Ywg0LvRjtCx0YvQtSDRgdC70L7QstCwLCDQuNC80LXQvdCwINC4INGE0YDQsNC30Ysg0LvQuNGH0L3QvtCz0L4g0L/QvtC70YzQt9C+0LLQsNC90LjRjywg0LrQvtGC0L7RgNGL0LUg0LzQvtCz0YPRgiDRhdGA0LDQvdC40YLRjNGB0Y8g0LIg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC+0Lwg0YHQu9C+0LLQsNGA0LUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI2NzAzMTA5NTExODM2MzQzMzQxIj4i0LfQsNC/0LjRgdGL0LLQsNGC0Ywg0LIg0YHQu9C+0LLQsNGA0Ywg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI0MTI1NjIwNjUyNDA4Mjg4MCI+ItCf0L7Qt9Cy0L7Qu9GP0LXRgiDQv9GA0LjQu9C+0LbQtdC90LjRjiDQt9Cw0L/QuNGB0YvQstCw0YLRjCDQvdC+0LLRi9C1INGB0LvQvtCy0LAg0LIg0YHQu9C+0LLQsNGA0Ywg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GPLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDgwNzk0MDM3NTkwMDE3NzcyOTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iOTkzNzA3NDM2OTQxMDE2OTEzIj4i0LjQt9C80LXQvdGP0YLRjC/Rg9C00LDQu9GP0YLRjCDRgdC+0LTQtdGA0LbQuNC80L7QtSBTRC3QutCw0YDRgtGLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiLQuNC30LzQtdC90Y/RgtGML9GD0LTQsNC70Y/RgtGMINGB0L7QtNC10YDQttC40LzQvtC1IFNELdC60LDRgNGC0YsiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NjQzOTYzMjA0OTc2NDcxODc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MTMxODcxNTQxMTI3MjExNTI2Ij4i0KDQsNC30YDQtdGI0LDQtdGCINC/0YDQuNC70L7QttC10L3QuNGOINC30LDQv9C40YHRjCDQvdCwIFNELdC60LDRgNGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiLQoNCw0LfRgNC10YjQsNC10YIg0L/RgNC40LvQvtC20LXQvdC40Y4g0LfQsNC/0LjRgdGMINC90LAgU0Qt0LrQsNGA0YLRgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4i0LjQt9C80LXQvdGP0YLRjC/Rg9C00LDQu9GP0YLRjCDRgdC+0LTQtdGA0LbQuNC80L7QtSBTRC3QutCw0YDRgtGLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4i0KDQsNC30YDQtdGI0LDQtdGCINC/0YDQuNC70L7QttC10L3QuNGOINC30LDQv9C40YHRjCDQvdCwIFNELdC60LDRgNGC0YMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSI1NjU2NDg3MjY0ODE5NjY5ODI0Ij4i0L/QvtC70YPRh9Cw0YLRjCDQtNC+0YHRgtGD0L8g0Log0LrRjdGI0YMg0YTQsNC50LvQvtCy0L7QuSDRgdC40YHRgtC10LzRiyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSIxNjI0NzM0NTI4NDM1NjU5OTA2Ij4i0KDQsNC30YDQtdGI0LDQtdGCINC/0YDQvtCz0YDQsNC80LzQsNC8INC00L7RgdGC0YPQvyDQtNC70Y8g0LfQsNC/0LjRgdC4INC4INGH0YLQtdC90LjRjyDQuiDQutGN0YjRgyDRhNCw0LnQu9C+0LLQvtC5INGB0LjRgdGC0LXQvNGLLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQzMDc4NjE0OTYzMDI4NTAyMDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDQ5NzQyMDcyODg1NzU4NTc5MSI+ItCe0LPRgNCw0L3QuNGH0LjRgtGMINC/0LDRgNC+0LvRjCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE3MTk4NzcyNDU2OTIzMTgyOTkgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjkwODM0MDAwODA4NjE3MjgwNTYiPiLQntCz0YDQsNC90LjRh9C40YLRjCDRgtC40L/RiyDQv9Cw0YDQvtC70LXQuSwg0LTQvtGB0YLRg9C/0L3Ri9GFINC00LvRjyDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3Mzc0NzgwNzEyNjY0Mjg1MzIxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjkxNDEzMDY0Njk0MjE5OTUwMyI+ItCf0YDQvtGB0LzQvtGC0YAg0L/QvtC/0YvRgtC+0Log0LLRhdC+0LTQsCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE5NjEyNTExNzk2MjQ4NDM0ODMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjcyMjc1NzgyNjAxNjUxNzI2NzMiPiLQnNC+0L3QuNGC0L7RgNC40L3QsyDQvdC10YPQtNCw0YfQvdGL0YUg0L/QvtC/0YvRgtC+0Log0L/QvtC00LrQu9GO0YfQtdC90LjRjyDQuiDRg9GB0YLRgNC+0LnRgdGC0LLRgyDQtNC70Y8g0LLRi9C/0L7Qu9C90LXQvdC40Y8g0L7Qv9GA0LXQtNC10LvQtdC90L3Ri9GFINC00LXQudGB0YLQstC40LkuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTA4NDc3MjA5MDc5NzQ4NTQyMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIyNjIwMDc3MTkxMjQyNjg4OTU1Ij4i0KHQsdGA0L7RgdC40YLRjCDQv9Cw0YDQvtC70YwiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzMzMyMTY3NjAwMzMxNzk5OTkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI1MzkxMjQwNjE2OTgxMjk3MzYxIj4i0J/RgNC40L3Rg9C00LjRgtC10LvRjNC90L4g0LjQt9C80LXQvdC40YLRjCDQv9Cw0YDQvtC70YwsINC60L7RgtC+0YDRi9C5INCw0LTQvNC40L3QuNGB0YLRgNCw0YLQvtGAINC00L7Qu9C20LXQvSDQsdGD0LTQtdGCINGB0L7QvtCx0YnQuNGC0Ywg0LLQsNC8LCDRh9GC0L7QsdGLINCy0Ysg0YHQvNC+0LPQu9C4INCy0YvQv9C+0LvQvdC40YLRjCDQstGF0L7QtC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NzYwNDY2MDI1MjQ3NjM0NDg4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iMjI3NDA4NTM4NDcwNDI0ODQzMSI+ItCf0YDQuNC90YPQtNC40YLQtdC70YzQvdCw0Y8g0LHQu9C+0LrQuNGA0L7QstC60LAiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyODE5ODY4NjY0OTQ2MDg5NzQwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjU2OTY5NjQxMjYyMjYwMjg0NDIiPiLQo9C/0YDQsNCy0LvQtdC90LjQtSDQsdC70L7QutC40YDQvtCy0LrQvtC5INGD0YHRgtGA0L7QudGB0YLQstCwLCDRgtGA0LXQsdGD0Y7RidC10Lkg0LLQstC+0LTQsCDQv9Cw0YDQvtC70Y8uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0MzA3ODYxNDk2MzAyODUwMjAxIj4i0J7Qs9GA0LDQvdC40YfQuNGC0Ywg0L/QsNGA0L7Qu9GMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iMTcxOTg3NzI0NTY5MjMxODI5OSI+ItCe0LPRgNCw0L3QuNGH0LjRgtGMINGC0LjQv9GLINC/0LDRgNC+0LvQtdC5LCDQtNC+0YHRgtGD0L/QvdGL0YUg0LTQu9GPINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNGPLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iNzM3NDc4MDcxMjY2NDI4NTMyMSI+ItCf0YDQvtGB0LzQvtGC0YAg0L/QvtC/0YvRgtC+0Log0LLRhdC+0LTQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjE5NjEyNTExNzk2MjQ4NDM0ODMiPiLQnNC+0L3QuNGC0L7RgNC40L3QsyDQvdC10YPQtNCw0YfQvdGL0YUg0L/QvtC/0YvRgtC+0Log0L/QvtC00LrQu9GO0YfQtdC90LjRjyDQuiDRg9GB0YLRgNC+0LnRgdGC0LLRgyDQtNC70Y8g0LLRi9C/0L7Qu9C90LXQvdC40Y8g0L7Qv9GA0LXQtNC10LvQtdC90L3Ri9GFINC00LXQudGB0YLQstC40LkuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI5MDg0NzcyMDkwNzk3NDg1NDIwIj4i0KHQsdGA0L7RgdC40YLRjCDQv9Cw0YDQvtC70YwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIzMzMyMTY3NjAwMzMxNzk5OTkxIj4i0J/RgNC40L3Rg9C00LjRgtC10LvRjNC90L4g0LjQt9C80LXQvdC40YLRjCDQv9Cw0YDQvtC70YwsINC60L7RgtC+0YDRi9C5INCw0LTQvNC40L3QuNGB0YLRgNCw0YLQvtGAINC00L7Qu9C20LXQvSDQsdGD0LTQtdGCINGB0L7QvtCx0YnQuNGC0Ywg0LLQsNC8LCDRh9GC0L7QsdGLINCy0Ysg0YHQvNC+0LPQu9C4INCy0YvQv9C+0LvQvdC40YLRjCDQstGF0L7QtC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iNTc2MDQ2NjAyNTI0NzYzNDQ4OCI+ItCf0YDQuNC90YPQtNC40YLQtdC70YzQvdCw0Y8g0LHQu9C+0LrQuNGA0L7QstC60LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiLQo9C/0YDQsNCy0LvQtdC90LjQtSDQsdC70L7QutC40YDQvtCy0LrQvtC5INGD0YHRgtGA0L7QudGB0YLQstCwLCDRgtGA0LXQsdGD0Y7RidC10Lkg0LLQstC+0LTQsCDQv9Cw0YDQvtC70Y8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+ItCj0LTQsNC70LjRgtGMINCy0YHQtSDQtNCw0L3QvdGL0LUiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyMzE0MDYwOTMzNzk2Mzk2MjA1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iNzY2OTg5NTMzMzgxNDIyMjU4NiI+ItCS0YvQv9C+0LvQvdC40YLRjCDRgdCx0YDQvtGBINC6INC90LDRh9Cw0LvRjNC90YvQvCDQvdCw0YHRgtGA0L7QudC60LDQvCDRgSDRg9C00LDQu9C10L3QuNC10Lwg0LLRgdC10YUg0LTQsNC90L3Ri9GFINCx0LXQtyDQt9Cw0L/RgNC+0YHQsCDQv9C+0LTRgtCy0LXRgNC20LTQtdC90LjRjy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+ItCS0YvQv9C+0LvQvdC40YLRjCDRgdCx0YDQvtGBINC6INC90LDRh9Cw0LvRjNC90YvQvCDQvdCw0YHRgtGA0L7QudC60LDQvCDRgSDRg9C00LDQu9C10L3QuNC10Lwg0LLRgdC10YUg0LTQsNC90L3Ri9GFINCx0LXQtyDQt9Cw0L/RgNC+0YHQsCDQv9C+0LTRgtCy0LXRgNC20LTQtdC90LjRjy4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSIgbXNnaWQ9IjYzODc0OTc0NjY2NjAxNTQ5MzEiPiLQndCw0YHRgtGA0L7QudGC0LUg0LPQu9C+0LHQsNC70YzQvdGL0Lkg0L/RgNC+0LrRgdC4LdGB0LXRgNCy0LXRgCDRg9GB0YLRgNC+0LnRgdGC0LLQsCwg0LrQvtGC0L7RgNGL0Lkg0LHRg9C00LXRgiDQuNGB0L/QvtC70YzQt9C+0LLQsNGC0YzRgdGPINC/0YDQuCDQsNC60YLQuNCy0L3QvtC5INC/0L7Qu9C40YLQuNC60LUuINCT0LvQvtCx0LDQu9GM0L3Ri9C5INC/0YDQvtC60YHQuC3RgdC10YDQstC10YAg0LTQvtC70LbQtdC9INC90LDRgdGC0YDQvtC40YLRjCDQsNC00LzQuNC90LjRgdGC0YDQsNGC0L7RgCDQv9C10YDQstC+0LPQviDRg9GB0YLRgNC+0LnRgdGC0LLQsC4iPC9zdHJpbmc+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiLQlNC+0LzQsNGI0L3QuNC5IjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4i0JzQvtCx0LjQu9GM0L3Ri9C5IjwvaXRlbT4KQEAgLTU1MiwxMCArNTM4LDkgQEAKICAgICA8c2tpcCAvPgogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlT3RoZXIgKDQ0MDg0MzYxNjI5NTAxMTk4NDkpIC0tPgogICAgIDxza2lwIC8+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4i0YEg0L/QvtC80L7RidGM0Y4gPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiDRgSDQv9C+0LzQvtGJ0YzRjiA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+ItCS0LLQtdC00LjRgtC1IFBJTi3QutC+0LQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+ItCS0LLQtdC00LjRgtC1INC/0LDRgNC+0LvRjCDQtNC70Y8g0YDQsNC30LHQu9C+0LrQuNGA0L7QstC60LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+ItCS0LLQtdC00LjRgtC1IFBJTi3QutC+0LQg0LTQu9GPINGA0LDQt9Cx0LvQvtC60LjRgNC+0LLQutC4Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4i0J3QtdCy0LXRgNC90YvQuSBQSU4t0LrQvtC0ISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiLQlNC70Y8g0YDQsNC30LHQu9C+0LrQuNGA0L7QstC60Lgg0L3QsNC20LzQuNGC0LUgXCLQnNC10L3RjlwiLCDQsCDQt9Cw0YLQtdC8IDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+ItCt0LrRgdGC0YDQtdC90L3QsNGPINGB0LvRg9C20LHQsCI8L3N0cmluZz4KQEAgLTU2OCw2ICs1NTMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiLQktC10YDQvdGD0YLRjNGB0Y8g0Log0LLRi9C30L7QstGDIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4i0J/RgNCw0LLQuNC70YzQvdC+ISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiLQn9C+0LLRgtC+0YDQuNGC0LUg0L/QvtC/0YvRgtC60YMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+ItCf0L7QstGC0L7RgNC40YLQtSDQv9C+0L/Ri9GC0LrRgyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+ItCY0LTQtdGCINC30LDRgNGP0LTQutCwICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiLQl9Cw0YDRj9C20LXQvdCwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTgyLDcgKzU2OCw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0t0LrQsNGA0YLQsCDQt9Cw0LHQu9C+0LrQuNGA0L7QstCw0L3QsC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiLQoNCw0LfQsdC70L7QutC40YDQvtCy0LrQsCBTSU0t0LrQsNGA0YLRi+KApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+ItCa0L7Qu9C40YfQtdGB0YLQstC+INC90LXRg9C00LDRh9C90YvRhSDQv9C+0L/Ri9GC0L7QuiDQstCy0L7QtNCwINCz0YDQsNGE0LjRh9C10YHQutC+0LPQviDQutC70Y7Rh9CwINGA0LDQt9Cx0LvQvtC60LjRgNC+0LLQutC4OiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPi4gIlxuXG4i0J/QvtCy0YLQvtGA0LjRgtC1INC/0L7Qv9GL0YLQutGDINGH0LXRgNC10LcgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g0YEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiLQmtC+0LvQuNGH0LXRgdGC0LLQviDQvdC10YPQtNCw0YfQvdGL0YUg0L/QvtC/0YvRgtC+0Log0LLQstC+0LTQsCDQs9GA0LDRhNC40YfQtdGB0LrQvtCz0L4g0LrQu9GO0YfQsCDRgNCw0LfQsdC70L7QutC40YDQvtCy0LrQuDogPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4uINCf0L7RgdC70LUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g0L3QtdGD0LTQsNGH0L3Ri9GFINC/0L7Qv9GL0YLQvtC6INCy0LDQvCDQsdGD0LTQtdGCINC/0YDQtdC00LvQvtC20LXQvdC+INGA0LDQt9Cx0LvQvtC60LjRgNC+0LLQsNGC0Ywg0YLQtdC70LXRhNC+0L0g0YEg0L/QvtC80L7RidGM0Y4g0YPRh9C10YLQvdGL0YUg0LTQsNC90L3Ri9GFIEdvb2dsZS4gICJcblxuIiDQn9C+0LLRgtC+0YDQuNGC0LUg0L/QvtC/0YvRgtC60YMg0YfQtdGA0LXQtyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiDRgS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiLQmtC+0LvQuNGH0LXRgdGC0LLQviDQvdC10YPQtNCw0YfQvdGL0YUg0L/QvtC/0YvRgtC+0Log0LLQstC+0LTQsCDQv9Cw0YDQvtC70Y86IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+LiAiXG5cbiLQn9C+0LLRgtC+0YDQuNGC0LUg0L/QvtC/0YvRgtC60YMg0YfQtdGA0LXQtyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDRgS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4i0JrQvtC70LjRh9C10YHRgtCy0L4g0L3QtdGD0LTQsNGH0L3Ri9GFINC/0L7Qv9GL0YLQvtC6INCy0LLQvtC00LAgUElOLdC60L7QtNCwOiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPi4gIlxuXG4i0J/QvtCy0YLQvtGA0LjRgtC1INC/0L7Qv9GL0YLQutGDINGH0LXRgNC10LcgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g0YEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiLQmtC+0LvQuNGH0LXRgdGC0LLQviDQvdC10YPQtNCw0YfQvdGL0YUg0L/QvtC/0YvRgtC+0Log0LLQstC+0LTQsCDQs9GA0LDRhNC40YfQtdGB0LrQvtCz0L4g0LrQu9GO0YfQsCDRgNCw0LfQsdC70L7QutC40YDQvtCy0LrQuDogPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4uINCf0L7RgdC70LUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g0L3QtdGD0LTQsNGH0L3Ri9GFINC/0L7Qv9GL0YLQvtC6INCy0LDQvCDQsdGD0LTQtdGCINC/0YDQtdC00LvQvtC20LXQvdC+INGA0LDQt9Cx0LvQvtC60LjRgNC+0LLQsNGC0Ywg0YLQtdC70LXRhNC+0L0g0YEg0L/QvtC80L7RidGM0Y4g0YPRh9C10YLQvdGL0YUg0LTQsNC90L3Ri9GFIEdvb2dsZS5cbiAiXG5cbiIg0J/QvtCy0YLQvtGA0LjRgtC1INC/0L7Qv9GL0YLQutGDINGH0LXRgNC10LcgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4g0YEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+ItCf0L7QstGC0L7RgNC40YLQtSDQv9C+0L/Ri9GC0LrRgyDRh9C10YDQtdC3IDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiDRgS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+ItCX0LDQsdGL0LvQuCDQs9GA0LDRhNC40YfQtdGB0LrQuNC5INC60LvRjtGHPyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZ2xvZ2luX2ZvcmdvdF9wYXR0ZXJuIiBtc2dpZD0iMjU4ODUyMTUwMTE2NjAzMjc0NyI+ItCh0L3Rj9GC0LjQtSDQsdC70L7QutC40YDQvtCy0LrQuCDQsNC60LrQsNGD0L3RgtCwIjwvc3RyaW5nPgpAQCAtNjEwLDE0ICs1OTgsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ19iZWZvcmVfdW5sb2FkIiBtc2dpZD0iMTkwMTY3NTQ0ODE3OTY1MzA4OSI+ItCf0LXRgNC10LnRgtC4INGBINGN0YLQvtC5INGB0YLRgNCw0L3QuNGG0Ys/IlxuXG4iPHhsaWZmOmcgaWQ9Ik1FU1NBR0UiPiVzPC94bGlmZjpnPiJcblxuItCd0LDQttC80LjRgtC1IFwi0J7QmlwiLCDRh9GC0L7QsdGLINC/0YDQvtC00L7Qu9C20LjRgtGMLCDQuNC70LggXCLQntGC0LzQtdC90LBcIiwg0YfRgtC+0LHRiyDQvtGB0YLQsNGC0YzRgdGPINC90LAg0YLQtdC60YPRidC10Lkg0YHRgtGA0LDQvdC40YbQtS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX2xhYmVsIiBtc2dpZD0iNjg2MDI2MTc1ODY2NTgyNTA2OSI+ItCf0L7QtNGC0LLQtdGA0LTQuNGC0LUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkb3VibGVfdGFwX3RvYXN0IiBtc2dpZD0iMTA2ODIxNjkzNzI0NDU2NzI0NyI+ItCh0L7QstC10YI6INC90LDQttC80LjRgtC1INC00LLQsNC20LTRiywg0YfRgtC+0LHRiyDRg9Cy0LXQu9C40YfQuNGC0Ywg0Lgg0YPQvNC10L3RjNGI0LjRgtGMINC80LDRgdGI0YLQsNCxLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvZmlsbF90aGlzX2Zvcm0gKDg5NDAxMTA4NjY3NzUwOTc0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iMTI4NDg0MzcyODIwMzQxMjEzNSI+ItGB0YfQuNGC0YvQstCw0YLRjCDQuNGB0YLQvtGA0LjRjiDQuCDQt9Cw0LrQu9Cw0LTQutC4INCx0YDQsNGD0LfQtdGA0LAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjQ5ODE0ODk4MTU0Njc2MTcxOTEiPiLQoNCw0LfRgNC10YjQsNC10YIg0L/RgNC40LvQvtC20LXQvdC40Y4g0YHRh9C40YLRi9Cy0LDRgtGMINCy0YHQtSBVUkwsINC/0L7RgdC10YnQtdC90L3Ri9C1INCx0YDQsNGD0LfQtdGA0L7QvCwg0Lgg0LLRgdC1INC10LPQviDQt9Cw0LrQu9Cw0LTQutC4LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTAwOTQzNDEwOTgzNjI4MDM3NCI+ItC30LDQv9C40YHRi9Cy0LDRgtGMINC40YHRgtC+0YDQuNGOINC4INC30LDQutC70LDQtNC60Lgg0LHRgNCw0YPQt9C10YDQsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9Ijk0NTU3MTk5MDM1NzExNDk1MCI+ItCg0LDQt9GA0LXRiNCw0LXRgiDQv9GA0LjQu9C+0LbQtdC90LjRjiDQuNC30LzQtdC90Y/RgtGMINC40YHRgtC+0YDQuNGOINC4INC30LDQutC70LDQtNC60Lgg0LHRgNCw0YPQt9C10YDQsCwg0YHQvtGF0YDQsNC90LXQvdC90YvQtSDQsiDQstCw0YjQtdC8INGC0LXQu9C10YTQvtC90LUuINCS0YDQtdC00L7QvdC+0YHQvdC+0LUg0J/QniDQvNC+0LbQtdGCINC/0L7Qu9GM0LfQvtCy0LDRgtGM0YHRjyDRjdGC0LjQvCwg0YfRgtC+0LHRiyDRgdGC0LjRgNCw0YLRjCDQuNC70Lgg0LjQt9C80LXQvdGP0YLRjCDQtNCw0L3QvdGL0LUg0LLQsNGI0LXQs9C+INCx0YDQsNGD0LfQtdGA0LAuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0QWxhcm0gKDU5MjQ0MDEzMjg4MDM2MTUxNjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0QWxhcm0gKDU5NjY5NjY1OTgxNDk4NzUwODIpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQ3MTUyMTI2NTU1OTgyNzU1MzIiPiLQmNC30LzQtdC90LjRgtGMINGA0LDQt9GA0LXRiNC10L3QuNGPINCx0YDQsNGD0LfQtdGA0LAg0LTQu9GPINC00L7RgdGC0YPQv9CwINC6INCz0LXQvtCz0YDQsNGE0LjRh9C10YHQutC+0LzRgyDQvNC10YHRgtC+0L/QvtC70L7QttC10L3QuNGOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDAxMTkwODI4Mjk4MDg2MTY3OSI+ItCf0L7Qt9Cy0L7Qu9GP0LXRgiDQv9GA0L7Qs9GA0LDQvNC80LUg0LjQt9C80LXQvdGP0YLRjCDRgNCw0LfRgNC10YjQtdC90LjRjyDQsdGA0LDRg9C30LXRgNCwINC00LvRjyDQtNC+0YHRgtGD0L/QsCDQuiDQs9C10L7Qs9GA0LDRhNC40YfQtdGB0LrQvtC80YMg0L/QvtC70L7QttC10L3QuNGOLiDQktGA0LXQtNC+0L3QvtGB0L3Ri9C1INC/0YDQvtCz0YDQsNC80LzRiyDQvNC+0LPRg9GCINC/0L7Qu9GM0LfQvtCy0LDRgtGM0YHRjyDRjdGC0LjQvCDQtNC70Y8g0L7RgtC/0YDQsNCy0LrQuCDQuNC90YTQvtGA0LzQsNGG0LjQuCDQviDQvNC10YHRgtC+0L/QvtC70L7QttC10L3QuNC4INC90LAg0L3QtdC60L7RgtC+0YDRi9C1INGB0LDQudGC0YsuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9tZXNzYWdlIiBtc2dpZD0iNzY3MzQ0Njg3MTM5MTk1NzkwIj4i0JLRiyDRhdC+0YLQuNGC0LUsINGH0YLQvtCx0Ysg0LHRgNCw0YPQt9C10YAg0LfQsNC/0L7QvNC90LjQuyDRjdGC0L7RgiDQv9Cw0YDQvtC70Yw/Ijwvc3RyaW5nPgpAQCAtNzMwLDE0ICs3MTYsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiLQktGL0LHRgNCw0YLRjCDQstGB0LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+ItCS0YvQsdC10YDQuNGC0LUg0YHQu9C+0LLQviI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiLQktGL0YDQtdC30LDRgtGMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiLQmtC+0L/QuNGA0L7QstCw0YLRjCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+ItCS0YHRgtCw0LLQuNGC0YwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+ItCa0L7Qv9C40YDQvtCy0LDRgtGMIFVSTCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHRNb2RlIiBtc2dpZD0iNjczODU1NjM0ODg2MTM0NzI0MCI+ItCS0YvQsdGA0LDRgtGMINGC0LXQutGB0YIuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4i0JLRi9Cx0L7RgCDRgtC10LrRgdGC0LAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiLQodC/0L7RgdC+0LEg0LLQstC+0LTQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiLQlNC+0LHQsNCy0LjRgtGMIFwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiINCyINGB0LvQvtCy0LDRgNGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4i0JjQt9C80LXQvdC40YLRjCDRgtC10LrRgdGCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSI0OTA5MTM1NTY0OTQxODE1NDk0Ij4i0J7Qv9C10YDQsNGG0LjQuCDRgSDRgtC10LrRgdGC0L7QvCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4i0J3QtdC00L7RgdGC0LDRgtC+0YfQvdC+INC80LXRgdGC0LAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiLQl9Cw0LrQsNC90YfQuNCy0LDQtdGC0YHRjyDQvNC10YHRgtC+INCyINC/0LDQvNGP0YLQuCDRgtC10LvQtdGE0L7QvdCwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+ItCe0JoiPC9zdHJpbmc+CkBAIC03NDUsNiArNzMxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiLQntCaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4i0J7RgtC80LXQvdCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+ItCS0L3QuNC80LDQvdC40LUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+ItCX0LDQs9GA0YPQt9C60LAuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+ItCS0JrQmyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+ItCS0KvQmtCbIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiLQp9GC0L4g0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGMPyI8L3N0cmluZz4KQEAgLTc2Myw5ICs3NTAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZvcmNlX2Nsb3NlIiBtc2dpZD0iMzY1MzQxNjMxNTQ1MDgwNjM5NiI+ItCX0LDQutGA0YvRgtGMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+ItCe0YLRh9C10YIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3YWl0IiBtc2dpZD0iNzE0NzExODIxNzIyNjMxNzczMiI+ItCf0L7QtNC+0LbQtNCw0YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+ItCf0YDQuNC70L7QttC10L3QuNC1INC/0LXRgNC10L3QsNC/0YDQsNCy0LvQtdC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+ItCf0YDQuNC70L7QttC10L3QuNC1IDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4g0LLRi9C/0L7Qu9C90Y/QtdGC0YHRjy4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+ItCY0LfQvdCw0YfQsNC70YzQvdC+INCx0YvQu9C+INC30LDQv9GD0YnQtdC90L4g0L/RgNC40LvQvtC20LXQvdC40LUgPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4i0J/RgNC40LvQvtC20LXQvdC40LUgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAo0L/RgNC+0YbQtdGB0YEgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSDQvdCw0YDRg9GI0LjQu9C+INGB0L7QsdGB0YLQstC10L3QvdGD0Y4g0L/QvtC70LjRgtC40LrRgyBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+ItCf0YDQvtGG0LXRgdGBIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiDQvdCw0YDRg9GI0LjQuyDRgdC+0LHRgdGC0LLQtdC90L3Rg9GOINC/0L7Qu9C40YLQuNC60YMgU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+ItCf0YDQuNC70L7QttC10L3QuNC1IDx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+INC30LDQv9GD0YnQtdC90L4iPC9zdHJpbmc+CkBAIC04MTIsMjggKzgwMiwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybXNfc2hvd19hbGwiIG1zZ2lkPSIyNjcxNzkxMTYzOTMzMDkxMTgwIj48Yj4i0J/QvtC60LDQt9Cw0YLRjCDQstGB0LUiPC9iPjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYWN0aXZpdHlfdGl0bGUiIG1zZ2lkPSIyMzk5Mjg5OTk5NjA4OTAwNDQzIj4i0JfQsNC/0L7QvNC40L3QsNGO0YnQtdC1INGD0YHRgtGA0L7QudGB0YLQstC+IFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3RpdGxlIiBtc2dpZD0iNTkwMTQ1OTA0MTM5ODc1MTQ5NSI+IlVTQi3Qv9C+0LTQutC70Y7Rh9C10L3QuNC1INGD0YHRgtCw0L3QvtCy0LvQtdC90L4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0Nzk2NzU5NjQ2MTY3MjQ3MTc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjgyMzE0NjI3NTAwMTAwNjY4OTYiPiLQotC10LvQtdGE0L7QvSDQv9C+0LTQutC70Y7Rh9C10L0g0Log0LrQvtC80L/RjNGO0YLQtdGA0YMg0YfQtdGA0LXQtyDQv9C+0YDRgiBVU0IuINCd0LDQttC80LjRgtC1INC60L3QvtC/0LrRgyDQvdC40LbQtSwg0LXRgdC70Lgg0L3QtdC+0LHRhdC+0LTQuNC80L4g0LrQvtC/0LjRgNC+0LLQsNGC0Ywg0YTQsNC50LvRiyDRgSDQutC+0LzQv9GM0Y7RgtC10YDQsCDQvdCwIFNELdC60LDRgNGC0YMg0YPRgdGC0YDQvtC50YHRgtCy0LAgQW5kcm9pZCAo0LjQu9C4INC90LDQvtCx0L7RgNC+0YIpLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4i0KLQtdC70LXRhNC+0L0g0L/QvtC00LrQu9GO0YfQtdC9INC6INC60L7QvNC/0YzRjtGC0LXRgNGDINGH0LXRgNC10Lcg0L/QvtGA0YIgVVNCLiDQndCw0LbQvNC40YLQtSDQutC90L7Qv9C60YMg0L3QuNC20LUsINC10YHQu9C4INC90LXQvtCx0YXQvtC00LjQvNC+INC60L7Qv9C40YDQvtCy0LDRgtGMINGE0LDQudC70Ysg0YEg0LrQvtC80L/RjNGO0YLQtdGA0LAg0L3QsCBTRC3QutCw0YDRgtGDINGD0YHRgtGA0L7QudGB0YLQstCwIEFuZHJvaWQgKNC40LvQuCDQvdCw0L7QsdC+0YDQvtGCKS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+ItCi0LXQu9C10YTQvtC9INC/0L7QtNC60LvRjtGH0LXQvSDQuiDQutC+0LzQv9GM0Y7RgtC10YDRgyDRh9C10YDQtdC3INC/0L7RgNGCIFVTQi4g0J3QsNC20LzQuNGC0LUg0LrQvdC+0L/QutGDINC90LjQttC1LCDQtdGB0LvQuCDQvdC10L7QsdGF0L7QtNC40LzQviDQutC+0L/QuNGA0L7QstCw0YLRjCDRhNCw0LnQu9GLINGBINC60L7QvNC/0YzRjtGC0LXRgNCwINC90LAgU0Qt0LrQsNGA0YLRgyDRg9GB0YLRgNC+0LnRgdGC0LLQsCBBbmRyb2lkICjQuNC70Lgg0L3QsNC+0LHQvtGA0L7RgikuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfYnV0dG9uX21vdW50IiBtc2dpZD0iMTA1MjI1OTkzMDM2OTUwODIzNSI+ItCS0LrQu9GO0YfQuNGC0YwgVVNCLdC90LDQutC+0L/QuNGC0LXQu9GMIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjUzNDc4NDc1MTYwMzM0NTM2MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0ODE4MzQ3NzU2NDAyNzQwMjYxIj4i0J/RgNC4INC40YHQv9C+0LvRjNC30L7QstCw0L3QuNC4IFNELdC60LDRgNGC0Ysg0LrQsNC6IFVTQi3QvdCw0LrQvtC/0LjRgtC10LvRjyDQstC+0LfQvdC40LrQu9CwINC90LXQv9C+0LvQsNC00LrQsC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+ItCf0YDQuCDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjQuCBTRC3QutCw0YDRgtGLINC60LDQuiBVU0It0L3QsNC60L7Qv9C40YLQtdC70Y8g0LLQvtC30L3QuNC60LvQsCDQvdC10L/QvtC70LDQtNC60LAuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiLQn9GA0Lgg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40LggU0Qt0LrQsNGA0YLRiyDQutCw0LogVVNCLdC90LDQutC+0L/QuNGC0LXQu9GPINCy0L7Qt9C90LjQutC70LAg0L3QtdC/0L7Qu9Cw0LTQutCwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjgxNzU4OTI1NTQ3NTcyMTY1MjUiPiJVU0It0L/QvtC00LrQu9GO0YfQtdC90LjQtSDRg9GB0YLQsNC90L7QstC70LXQvdC+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MzgwMDgyNDA0Mjg4MjE5MzQxIj4i0JLRi9Cx0LXRgNC40YLQtSDQutC+0L/QuNGA0L7QstCw0L3QuNC1INGE0LDQudC70L7QsiDQvdCwINC60L7QvNC/0YzRjtGC0LXRgCDQuNC70Lgg0YEg0LrQvtC80L/RjNGO0YLQtdGA0LAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIyMzM2MDU4Mzk2NjYzNTE2MDE3Ij4i0JLRi9C60LvRjtGH0LjRgtGMIFVTQi3QvdCw0LrQvtC/0LjRgtC10LvRjCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNTkxODEzNDkwMjY5ODQxNTM5Ij4i0JLRi9Cx0LXRgNC40YLQtSwg0YfRgtC+0LHRiyDQstGL0LrQu9GO0YfQuNGC0YwgVVNCLdC90LDQutC+0L/QuNGC0LXQu9GMLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfdGl0bGUiIG1zZ2lkPSI2NjAxMjk4NTE3MDg3NzU4NTMiPiJVU0It0L3QsNC60L7Qv9C40YLQtdC70Ywg0LjRgdC/0L7Qu9GM0LfRg9C10YLRgdGPIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYxMzcxMzM5NjQyNjYwNDEwNCAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg3NDUzNDUyNjA3ODAyNjcxODUiPiLQn9C10YDQtdC0INC+0YLQutC70Y7Rh9C10L3QuNC10LwgVVNCLdC90LDQutC+0L/QuNGC0LXQu9GPINGD0LHQtdC00LjRgtC10YHRjCwg0YfRgtC+IFNELdC60LDRgNGC0LAg0YPRgdGC0YDQvtC50YHRgtCy0LAgQW5kcm9pZCDQsdGL0LvQsCDQvtGC0LrQu9GO0YfQtdC90LAg0L7RgiDQutC+0LzQv9GM0Y7RgtC10YDQsC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4i0J/QtdGA0LXQtCDQvtGC0LrQu9GO0YfQtdC90LjQtdC8IFVTQi3QvdCw0LrQvtC/0LjRgtC10LvRjyDRg9Cx0LXQtNC40YLQtdGB0YwsINGH0YLQviBTRC3QutCw0YDRgtCwINGD0YHRgtGA0L7QudGB0YLQstCwIEFuZHJvaWQg0LHRi9C70LAg0L7RgtC60LvRjtGH0LXQvdCwINC+0YIg0LrQvtC80L/RjNGO0YLQtdGA0LAuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+ItCf0LXRgNC10LQg0L7RgtC60LvRjtGH0LXQvdC40LXQvCBVU0It0L3QsNC60L7Qv9C40YLQtdC70Y8g0YPQsdC10LTQuNGC0LXRgdGMLCDRh9GC0L4gU0Qt0LrQsNGA0YLQsCDRg9GB0YLRgNC+0LnRgdGC0LLQsCBBbmRyb2lkINCx0YvQu9CwINC+0YLQutC70Y7Rh9C10L3QsCDQvtGCINC60L7QvNC/0YzRjtGC0LXRgNCwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfYnV0dG9uX21vdW50IiBtc2dpZD0iNzA2MDIxODAzNDkwMDY5NjAyOSI+ItCS0YvQutC70Y7Rh9C40YLRjCBVU0It0L3QsNC60L7Qv9C40YLQtdC70YwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIxNDM4ODE5MTQ4NDA0MTIxMDgiPiLQn9GA0Lgg0LLRi9C60LvRjtGH0LXQvdC40LggVVNCLdC90LDQutC+0L/QuNGC0LXQu9GPINC/0YDQvtC40LfQvtGI0LvQsCDQvdC10L/QvtC70LDQtNC60LAuINCj0LHQtdC00LjRgtC10YHRjCwg0YfRgtC+IFVTQi3RhdC+0YHRgiDQvtGC0LrQu9GO0YfQtdC9LCDQuCDQv9C+0LLRgtC+0YDQuNGC0LUg0L/QvtC/0YvRgtC60YMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RpdGxlIiBtc2dpZD0iOTYzMDM5MDMzNDcwNDc4Njk3Ij4i0JLQutC70Y7Rh9C10L3QuNC1IFVTQi3QvdCw0LrQvtC/0LjRgtC10LvRjyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190ZXh0IiBtc2dpZD0iMzIwMjgzODIzNDc4MDUwNTg4NiI+ItCf0YDQuCDQstC60LvRjtGH0LXQvdC40LggVVNCLdC90LDQutC+0L/QuNGC0LXQu9GPINC90LXQutC+0YLQvtGA0YvQtSDQuNGB0L/QvtC70YzQt9GD0LXQvNGL0LUg0L/RgNC40LvQvtC20LXQvdC40Y8g0LzQvtCz0YPRgiDQv9GA0LXQutGA0LDRgtC40YLRjCDRgNCw0LHQvtGC0YMg0Lgg0L7RgdGC0LDQstCw0YLRjNGB0Y8g0L3QtdC00L7RgdGC0YPQv9C90YvQvNC4INC00L4g0L7RgtC60LvRjtGH0LXQvdC40Y8gVVNCLdC90LDQutC+0L/QuNGC0LXQu9GPLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19lcnJvcl90aXRsZSIgbXNnaWQ9IjgwNDg5OTk5NzM4MzczMzkxNzQiPiLQodCx0L7QuSDQvtC/0LXRgNCw0YbQuNC4IFVTQi3Qv9C+0LTQutC70Y7Rh9C10L3QuNGPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX29rIiBtc2dpZD0iNzM3Njk1MzE2NzAzOTg2NTcwMSI+ItCe0JoiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4NjYzMjQ3OTI5NTUxMDk1ODU0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjU3NzkwODAwNjk0OTc0MjIxNyI+ItCe0YfQuNGB0YLQuNGC0YwgU0Qt0LrQsNGA0YLRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiLQntGH0LjRgdGC0LjRgtGMIFNELdC60LDRgNGC0YMiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjIxMzY5OTYyNDMzNTIzNjE5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNDcwODE1MTQwMDY4NTAyODI0Ij4i0J7RgtGE0L7RgNC80LDRgtC40YDQvtCy0LDRgtGMINC60LDRgNGC0YMgU0Q/INCS0YHQtSDQtNCw0L3QvdGL0LUsINC90LDRhdC+0LTRj9GJ0LjQtdGB0Y8g0L3QsCDQutCw0YDRgtC1LCDQsdGD0LTRg9GCINGD0L3QuNGH0YLQvtC20LXQvdGLLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYyMTM2OTk2MjQzMzUyMzYxOSI+ItCe0YLRhNC+0YDQvNCw0YLQuNGA0L7QstCw0YLRjCDQutCw0YDRgtGDIFNEPyDQktGB0LUg0LTQsNC90L3Ri9C1LCDQvdCw0YXQvtC00Y/RidC40LXRgdGPINC90LAg0LrQsNGA0YLQtSwg0LHRg9C00YPRgiDRg9C90LjRh9GC0L7QttC10L3Riy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIG1zZ2lkPSI4NjYzMjQ3OTI5NTUxMDk1ODU0Ij4i0J7Rh9C40YHRgtC40YLRjCBTRC3QutCw0YDRgtGDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4i0J7RgtGE0L7RgNC80LDRgtC40YDQvtCy0LDRgtGMINC60LDRgNGC0YMgU0Q/INCS0YHQtSDQtNCw0L3QvdGL0LUsINC90LDRhdC+0LTRj9GJ0LjQtdGB0Y8g0L3QsCDQutCw0YDRgtC1LCDQsdGD0LTRg9GCINGD0L3QuNGH0YLQvtC20LXQvdGLLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9idXR0b25fZm9ybWF0IiBtc2dpZD0iNDEzMTA2NDU2MDEyNzQ3ODY5NSI+ItCk0L7RgNC80LDRgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTA0NDc3ODk0OTE4OTkxOCI+ItCe0YLQu9Cw0LTQutCwINC/0L4gVVNCINGA0LDQt9GA0LXRiNC10L3QsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4NDcwMjk2ODE4MjcwMTEwMzk2Ij4i0J3QsNC20LzQuNGC0LUsINGH0YLQvtCx0Ysg0L7RgtC60LvRjtGH0LjRgtGMINC+0YLQu9Cw0LTQutGDIFVTQi4iPC9zdHJpbmc+CkBAIC04NDEsMjkgKzgyNiwxOCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfYWxwaGFiZXQiIG1zZ2lkPSI1NDMzMjc1NDg1NDk5MDM5MTk5Ij4iIEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFzdF9zY3JvbGxfbnVtZXJpY19hbHBoYWJldCIgbXNnaWQ9IjQwMzAxNzA1MjQ1OTUxMjM2MTAiPiIgMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FuZGlkYXRlc19zdHlsZSIgbXNnaWQ9IjQzMzM5MTMwODk2MzcwNjIyNTciPjx1PiLQstCw0YDQuNCw0L3RgtGLIjwvdT48L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU0NTc2MDM0MTg5NzA5OTQwNTAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDIzOTUxNjY3NTAyODQzODk5NyI+ItCf0L7QtNCz0L7RgtC+0LLQutCwINC60LDRgNGC0YsgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+ItCf0L7QtNCz0L7RgtC+0LLQutCwINC60LDRgNGC0YsgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNTQ1NzYwMzQxODk3MDk5NDA1MCI+ItCf0L7QtNCz0L7RgtC+0LLQutCwINC60LDRgNGC0YsgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4Mjg3MzE5ODgyOTI2NzM3MDUzIj4i0J/RgNC+0LLQtdGA0LrQsCDQvtGI0LjQsdC+0LouIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzgwNDc3ODM4MjQxMjEyOTk3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzkzNzM0NTU3Nzk4MzczMDg3MyI+ItCf0YPRgdGC0LDRjyDQutCw0YDRgtCwIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4i0J/Rg9GB0YLQsNGPINC60LDRgNGC0LAgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxMzEyMjY2ODIwMDkyOTU4MDE0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNjA2NjYwNzU2MTI0NjI5NzA4Ij4i0JrQsNGA0YLQsCBTRCDQv9GD0YHRgtCwINC40LvQuCDQuNGB0L/QvtC70YzQt9GD0LXRgiDQvdC10L/QvtC00LTQtdGA0LbQuNCy0LDQtdC80YPRjiDRhNCw0LnQu9C+0LLRg9GOINGB0LjRgdGC0LXQvNGDLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlNELdC60LDRgNGC0LAg0L/Rg9GB0YLQsCDQuNC70Lgg0LjRgdC/0L7Qu9GM0LfRg9C10YIg0L3QtdC/0L7QtNC00LXRgNC20LjQstCw0LXQvNGD0Y4g0YTQsNC50LvQvtCy0YPRjiDRgdC40YHRgtC10LzRgyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY0MTA3MjM5MDYwMTkxMDAxODkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTcyNDYxOTkwMjA3NjUyODg4OSI+ItCf0L7QstGA0LXQttC00LXQvdC90LDRjyDQutCw0YDRgtCwIFNEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiLQn9C+0LLRgNC10LbQtNC10L3QvdCw0Y8g0LrQsNGA0YLQsCBTRCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI2Nzk0MTI4ODQyOTAwNjE3NzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NDYwMzExODM1MTMwNjcxMTk0Ij4i0JrQsNGA0YLQsCBTRCDQv9C+0LLRgNC10LbQtNC10L3QsC4g0JLQvtC30LzQvtC20L3Qviwg0L/QvtGC0YDQtdCx0YPQtdGC0YHRjyDQvtGC0YTQvtGA0LzQsNGC0LjRgNC+0LLQsNGC0Ywg0LXQtS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iU0Qt0LrQsNGA0YLQsCDQv9C+0LLRgNC10LbQtNC10L3QsC4g0J/QvtC/0YDQvtCx0YPQudGC0LUg0L7RgtGE0L7RgNC80LDRgtC40YDQvtCy0LDRgtGMINC10LUuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjg3MjE1Mjg4MjYwNDQwNzgzNyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI1ODIxNzUwMTYwNjA0MzIwMzQiPiLQmtCw0YDRgtCwIFNEINC90LXQvtC20LjQtNCw0L3QvdC+INC40LfQstC70LXRh9C10L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiLQmtCw0YDRgtCwIFNEINC90LXQvtC20LjQtNCw0L3QvdC+INC40LfQstC70LXRh9C10L3QsCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDcyNjAxODMyOTM3NDc0NDgyNDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjIwMDUzOTY0NjQ0OTQ2NDg5MzciPiLQn9C10YDQtdC0INC40LfQstC70LXRh9C10L3QuNC10Lwg0LrQsNGA0YLRiyBTRCDQvtGC0LrQu9GO0YfQuNGC0LUg0LXQtSDQstC+INC40LfQsdC10LbQsNC90LjQtSDQv9C+0YLQtdGA0Lgg0LTQsNC90L3Ri9GFLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+ItCf0LXRgNC10LQg0LjQt9Cy0LvQtdGH0LXQvdC40LXQvCDQutCw0YDRgtGLIFNEINC+0YLQutC70Y7Rh9C40YLQtSDQtdC1INCy0L4g0LjQt9Cx0LXQttCw0L3QuNC1INC/0L7RgtC10YDQuCDQtNCw0L3QvdGL0YUuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjcyOTgwMTEzMDc5MDYxNjIwMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzY1MjU4ODEwMTg2Nzk1MTUiPiLQkdC10LfQvtC/0LDRgdC90L7QtSDRg9C00LDQu9C10L3QuNC1INC60LDRgNGC0YsgU0QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiLQkdC10LfQvtC/0LDRgdC90L7QtSDRg9C00LDQu9C10L3QuNC1INC60LDRgNGC0YsgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3NjEzOTYwNjg2NzQ3NTkyNzcwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijc1MDM3NjkxMDYyODUxODg3MDMiPiLQotC10L/QtdGA0Ywg0LrQsNGA0YLRgyBTRCDQvNC+0LbQvdC+INCx0LXQt9C+0L/QsNGB0L3QviDRg9C00LDQu9C40YLRjC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4i0JzQvtC20L3QviDQsdC10LfQvtC/0LDRgdC90L4g0LjQt9Cy0LvQtdGH0YwgU0Qt0LrQsNGA0YLRgy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4OTAyNTE4MDMwNDA0MzgxMzE4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTg3NDg4OTc2NDM2NzA4NTU2MiI+ItCe0YLRgdGD0YLRgdGC0LLRg9C10YIg0LrQsNGA0YLQsCBTRCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiLQntGC0YHRg9GC0YHRgtCy0YPQtdGCINC60LDRgNGC0LAgU0QiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MjA1MTE3MjI3MzQyODIyMjc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNzMwODkwNDQxMzMxMzQ0Nzc2Ij4i0JrQsNGA0YLQsCBTRCDQvtGC0YHRg9GC0YHRgtCy0YPQtdGCLiDQlNC70Y8g0YPQstC10LvQuNGH0LXQvdC40Y8g0LXQvNC60L7RgdGC0Lgg0YPRgdGC0YDQvtC50YHRgtCy0LAg0LLRgdGC0LDQstGM0YLQtSDQvdC+0LLRg9GOINC60LDRgNGC0YMgU0QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iU0Qt0LrQsNGA0YLQsCDQuNC30LLQu9C10YfQtdC90LAuINCS0YHRgtCw0LLRjNGC0LUg0L3QvtCy0YPRjiDQutCw0YDRgtGDLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+ItCf0YPRgdGC0LDRjyDQutCw0YDRgtCwIFNEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iU0Qt0LrQsNGA0YLQsCDQv9GD0YHRgtCwINC40LvQuCDQuNGB0L/QvtC70YzQt9GD0LXRgiDQvdC10L/QvtC00LTQtdGA0LbQuNCy0LDQtdC80YPRjiDRhNCw0LnQu9C+0LLRg9GOINGB0LjRgdGC0LXQvNGDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiLQn9C+0LLRgNC10LbQtNC10L3QvdCw0Y8g0LrQsNGA0YLQsCBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY5MDI1MzE3NzU5NDgyMzg5ODkiPiJTRC3QutCw0YDRgtCwINC/0L7QstGA0LXQttC00LXQvdCwLiDQn9C+0L/RgNC+0LHRg9C50YLQtSDQvtGC0YTQvtGA0LzQsNGC0LjRgNC+0LLQsNGC0Ywg0LXQtS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4i0JrQsNGA0YLQsCBTRCDQvdC10L7QttC40LTQsNC90L3QviDQuNC30LLQu9C10YfQtdC90LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiLQn9C10YDQtdC0INC40LfQstC70LXRh9C10L3QuNC10Lwg0LrQsNGA0YLRiyBTRCDQvtGC0LrQu9GO0YfQuNGC0LUg0LXQtSDQstC+INC40LfQsdC10LbQsNC90LjQtSDQv9C+0YLQtdGA0Lgg0LTQsNC90L3Ri9GFLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+ItCR0LXQt9C+0L/QsNGB0L3QvtC1INGD0LTQsNC70LXQvdC40LUg0LrQsNGA0YLRiyBTRCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiLQnNC+0LbQvdC+INCx0LXQt9C+0L/QsNGB0L3QviDQuNC30LLQu9C10YfRjCBTRC3QutCw0YDRgtGDLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiLQntGC0YHRg9GC0YHRgtCy0YPQtdGCINC60LDRgNGC0LAgU0QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjM4NzAxMjA2NTI5ODM2NTk2NDEiPiJTRC3QutCw0YDRgtCwINC40LfQstC70LXRh9C10L3QsC4g0JLRgdGC0LDQstGM0YLQtSDQvdC+0LLRg9GOINC60LDRgNGC0YMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfbGlzdF9lbXB0eSIgbXNnaWQ9IjQxNjg4MjA2MDk0MDMzODU3ODkiPiLQn9C+0LTRhdC+0LTRj9GJ0LjRhSDQtNC10LnRgdGC0LLQuNC5INC90LUg0L3QsNC50LTQtdC90L4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4Nzg3MzUyMDc0MzI2NzQ4ODkyIj4i0L7QsdC90L7QstC70Y/RgtGMINGB0YLQsNGC0LjRgdGC0LjQutGDINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNGPINC60L7QvNC/0L7QvdC10L3RgtC+0LIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODkxNTUzNjk1NzE2NzUyODM1Ij4i0J/QvtC30LLQvtC70Y/QtdGCINC40LfQvNC10L3Rj9GC0Ywg0YHQvtCx0YDQsNC90L3Rg9GOINGB0YLQsNGC0LjRgdGC0LjQutGDINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNGPINC60L7QvNC/0L7QvdC10L3RgtC+0LIuINCd0LUg0L/RgNC10LTQvdCw0LfQvdCw0YfQtdC90L4g0LTQu9GPINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNGPINC+0LHRi9GH0L3Ri9C80Lgg0L/RgNC40LvQvtC20LXQvdC40Y/QvNC4LiI8L3N0cmluZz4KQEAgLTg5OCwxNSArODcyLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iTDJUUC9JUFNlYyBWUE4gKNC90LAg0L7RgdC90L7QstC1INC/0YDQtdC00LIuINC+0LHRiS4g0LrQu9GO0YfQsCkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iTDJUUC9JUFNlYyBWUE4gKNC90LAg0L7RgdC90L7QstC1INGB0LXRgNGC0LjRhNC40LrQsNGC0LApIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4i0JLRi9Cx0YDQsNGC0Ywg0YTQsNC50LsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiLQndC1INCy0YvQsdGA0LDQvSDRhNCw0LnQuyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+ItCh0LHRgNC+0YHQuNGC0YwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4i0J7RgtC/0YDQsNCy0LjRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiLQuNC30LHRgNCw0L3QvdC+0LUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiLQoNC10LbQuNC8INCz0YDQvtC80LrQvtC5INGB0LLRj9C30Lgg0LLQutC70Y7Rh9C10L0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4i0JLRi9Cx0LXRgNC40YLQtSDQtNC70Y8g0LLRi9GF0L7QtNCwINC40Lcg0YDQtdC20LjQvNCwINCz0YDQvtC80LrQvtC5INGB0LLRj9C30LguIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IlVTQi3QvNC+0LTQtdC8INC40LvQuCDRgtC+0YfQutCwINC00L7RgdGC0YPQv9CwIFdpLUZpINCw0LrRgtC40LLQvdGLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4i0J3QsNC20LzQuNGC0LUg0LTQu9GPINC90LDRgdGC0YDQvtC50LrQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+ItCd0LDQt9Cw0LQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiLQlNCw0LvQtdC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4i0J/RgNC+0L/Rg9GB0YLQuNGC0YwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiLQkNC60YLQuNCy0L3QsNGPINC/0LXRgNC10LTQsNGH0LAg0LTQsNC90L3Ri9GFIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiLQndCw0LbQvNC40YLQtSwg0YfRgtC+0LHRiyDRg9C30L3QsNGC0Ywg0LHQvtC70YzRiNC1INC+INC80L7QsdC40LvRjNC90L7QuSDQv9C10YDQtdC00LDRh9C1INC00LDQvdC90YvRhSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4i0J/RgNC10LLRi9GI0LXQvSDQu9C40LzQuNGCINC90LAg0LzQvtCx0LjQu9GM0L3Ri9C1INC00LDQvdC90YvQtSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiLQndCw0LbQvNC40YLQtSwg0YfRgtC+0LHRiyDRg9C30L3QsNGC0Ywg0LHQvtC70YzRiNC1INC+INC80L7QsdC40LvRjNC90L7QuSDQv9C10YDQtdC00LDRh9C1INC00LDQvdC90YvRhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX21hdGNoZXMiIG1zZ2lkPSI4MTI5NDIxOTA4OTE1ODQwNzM3Ij4i0J3QtdGCINGB0L7QstC/0LDQtNC10L3QuNC5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZmluZF9vbl9wYWdlIiBtc2dpZD0iMTk0Njc5OTIzMzgyMjgyMDM4NCI+ItCd0LDQudGC0Lgg0L3QsCDRgdGC0YDQsNC90LjRhtC1Ijwvc3RyaW5nPgorICA8cGx1cmFscyBuYW1lPSJtYXRjaGVzX2ZvdW5kIj4KKyAgICA8aXRlbSBxdWFudGl0eT0ib25lIiBtc2dpZD0iODE2NzE0NzA4MTEzNjU3OTQzOSI+IjEg0YHQvtCy0L/QsNC00LXQvdC40LUiPC9pdGVtPgorICAgIDxpdGVtIHF1YW50aXR5PSJvdGhlciIgbXNnaWQ9IjQ2NDE4NzI3OTcwNjc2MDkxNzciPiI8eGxpZmY6ZyBpZD0iSU5ERVgiPiVkPC94bGlmZjpnPiDQuNC3IDx4bGlmZjpnIGlkPSJUT1RBTCI+JWQ8L3hsaWZmOmc+IjwvaXRlbT4KKyAgPC9wbHVyYWxzPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbAppbmRleCAxMzdmODUzLi40MThhOGU2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKQEAgLTE2OSw4ICsxNjksNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSIzNDQ2MTY0NTg0NzEwNTk2NTEzIj4iVXR2ZWNrbGluZ3N2ZXJrdHlnIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iOTA1NjQzMTE5Mzg5MzgwOTgxNCI+IkZ1bmt0aW9uZXIgc29tIGVuZGFzdCBiZWjDtnZzIGbDtnIgcHJvZ3JhbXV0dmVja2xhcmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX3N0b3JhZ2UiIG1zZ2lkPSIxOTcxMTE4NzcwNTQ2MzM2OTY2Ij4iTGFncmluZyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkyMDMzMDIyMTQ5MTUzNTU3NzQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI1NDU1ODA0MzUzMjIwNTgxMzEyIj4iRsOlIMOldGtvbXN0IHRpbGwgU0Qta29ydGV0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiJGw6Ugw6V0a29tc3QgdGlsbCBTRC1rb3J0ZXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IkbDpSDDpXRrb21zdCB0aWxsIFNELWtvcnRldC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhciIgbXNnaWQ9Ijc0MTcxOTI2Mjk2MDE4OTA3OTEiPiJpbmFrdGl2ZXJhIGVsbGVyIMOkbmRyYSBzdGF0dXNmw6RsdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3N0YXR1c0JhciIgbXNnaWQ9IjEzNjU0NzM1OTUzMzE5ODk3MzIiPiJUaWxsw6V0ZXIgYXR0IHByb2dyYW1tZXQgaW5ha3RpdmVyYXIgc3RhdHVzZsOkbHRldCBlbGxlciBsw6RnZ2VyIHRpbGwgb2NoIHRhciBib3J0IHN5c3RlbWlrb25lci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N0YXR1c0JhclNlcnZpY2UiIG1zZ2lkPSI3MjQ3MjgxOTExMzg3OTMxNDg1Ij4ic3RhdHVzZsOkbHQiPC9zdHJpbmc+CkBAIC0yNjcsOCArMjY2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jbGVhckFwcENhY2hlIiBtc2dpZD0iNzc0MDQ2NTY5NDE5MzY3MTQwMiI+IlRpbGzDpXRlciBhdHQgZXR0IHByb2dyYW0gZnJpZ8O2ciBsYWdyaW5nc3V0cnltbWUgaSB0ZWxlZm9uZW4gZ2Vub20gYXR0IHRhIGJvcnQgZmlsZXIgaSBwcm9ncmFtbWV0cyBrYXRhbG9nIGbDtnIgY2FjaGVsYWdyaW5nLiDDhXRrb21zdCDDpHIgbXlja2V0IGJlZ3LDpG5zYWQsIHZhbmxpZ3R2aXMgdGlsbCBzeXN0ZW1wcm9jZXNzZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9tb3ZlUGFja2FnZSIgbXNnaWQ9IjcyODQ1NDk3OTk0NjUwMzkyNiI+IkZseXR0YSBwcm9ncmFtcmVzdXJzZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19tb3ZlUGFja2FnZSIgbXNnaWQ9IjYzMjMwNDkyOTE5MjM5MjUyNzciPiJUaWxsw6V0ZXIgYXR0IGV0dCBwcm9ncmFtIGZseXR0YXIgcHJvZ3JhbXJlc3Vyc2VyIGZyw6VuIGludGVybmEgdGlsbCBleHRlcm5hIG1lZGllciBvY2ggdHbDpHJ0IG9tLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ4MTE5MjE3MDM4ODI1MzIwNzAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZExvZ3MiIG1zZ2lkPSI2NjE1Nzc4NTQzMTk4OTY3NjE0Ij4ibMOkc2Egc3lzdGVtZXRzIGxvZ2dmaWxlciI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIyNTc5Mzc5NTU1ODA0NzU5MDIgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+IlRpbGzDpXRlciBhdHQgZXR0IHByb2dyYW0gbMOkc2VyIGZyw6VuIHN5c3RlbWV0cyBvbGlrYSBsb2dnZmlsZXIuIERldCBpbm5lYsOkciBhdHQgcHJvZ3JhbW1ldCBrYW4gdXBwdMOkY2thIGFsbG3DpG4gaW5mb3JtYXRpb24gb20gdmFkIGR1IGfDtnIgbWVkIHRlbGVmb25lbiwgbWVuIGRlbiBiw7ZyIGludGUgaW5uZWjDpWxsYSBwZXJzb25saWcgZWxsZXIgcHJpdmF0IGluZm9ybWF0aW9uLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRMb2dzICg2NjE1Nzc4NTQzMTk4OTY3NjE0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRMb2dzICg4ODk2NDQ5NDM3NDY0ODY3NzY2KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaWFnbm9zdGljIiBtc2dpZD0iODA3Njc0Mzk1MzkwODAwMDM0MiI+ImzDpHNhL3Nrcml2YSB0aWxsIHJlc3Vyc2VyIHNvbSDDpGdzIGF2IGRpYWciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaWFnbm9zdGljIiBtc2dpZD0iMzEyMTIzODM3Mzk1MTYzNzA0OSI+IlRpbGzDpXRlciBhdHQgZXR0IHByb2dyYW0gbMOkc2VyIG9jaCBza3JpdmVyIHRpbGwgZW4gcmVzdXJzIHNvbSDDpGdzIGF2IGRpYWctZ3J1cHBlbjsgdGlsbCBleGVtcGVsIGZpbGVyIGkgL2Rldi4gRGV0dGEga2FuIGV2ZW50dWVsbHQgcMOldmVya2Egc3lzdGVtZXRzIHN0YWJpbGl0ZXQgb2NoIHPDpGtlcmhldC4gRGV0dGEgYsO2ciBFTkRBU1QgYW52w6RuZHMgYXYgdGlsbHZlcmthcmVuIGVsbGVyIG9wZXJhdMO2cmVuIGbDtnIgbWFza2ludmFydXNwZWNpZmlrIGRpYWdub3N0aWsuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VDb21wb25lbnRTdGF0ZSIgbXNnaWQ9Ijc5NDI1MTk4ODM0MzI5NDA2Ij4iYWt0aXZlcmEgZWxsZXIgaW5ha3RpdmVyYSBwcm9ncmFta29tcG9uZW50ZXIiPC9zdHJpbmc+CkBAIC00MDMsMjIgKzQwNCw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGhBZG1pbiIgbXNnaWQ9IjcyNTYyODk3NzQ2NjcwNTQ1NTUiPiJUaWxsw6V0ZXIgYXR0IGV0dCBwcm9ncmFtIGtvbmZpZ3VyZXJhciBkZW4gbG9rYWxhIEJsdWV0b290aC10ZWxlZm9uZW4gc2FtdCB1cHB0w6Rja2VyIG9jaCBwYXJrb3BwbGFyIGRlbiBtZWQgZmrDpHJyYW5zbHV0bmEgZW5oZXRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2JsdWV0b290aCIgbXNnaWQ9IjgzNjEwMzg3MDc4NTcwMTg3MzIiPiJza2FwYSBCbHVldG9vdGgtYW5zbHV0bmluZ2FyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoIiBtc2dpZD0iNzYyNTE1MzgwNjc5MzkyOTQ1Ij4iVGlsbMOldGVyIGF0dCBldHQgcHJvZ3JhbSBzZXIgZGVuIGxva2FsYSBCbHVldG9vdGgtdGVsZWZvbmVucyBrb25maWd1cmF0aW9uLCBvY2ggc2thcGFyIG9jaCBhY2NlcHRlcmFyIGFuc2x1dG5pbmdhciBtZWQgcGFya29wcGxhZGUgZW5oZXRlci4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNBZG1pbiAoMjI1MTMwMjIzMzAxMjI1MDA1NikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNBZG1pbiAoMTkzNTg0MjYxMTQ2NDg5NTc4NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY1JhdyAoNDQyMzQ3MTcxMTExNDMyNTcwOCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNSYXcgKDU1MzMwMjI3MzY1NTkzODU2NjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNOb3RpZnkgKDQ3ODQ3MDM2MDA4Mjc5MjM1OCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNOb3RpZnkgKDI5OTAwNTM1MTc5NjIwNzA2MTcpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNMbGNwICg0OTcyMDUxNDYxMDA3MDMwNDI2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0xsY3AgKDkxNTkyMTI3Nzg2MDA0NjQwKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSI0OTc3NDA2MTY0MzExNTM1MDkyIj4iaW5ha3RpdmVyYSB0YW5nZW50bMOlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjMxODk3NjM0NzkzMjYzMDIwMTciPiJUaWxsw6V0ZXIgYXR0IGV0dCBwcm9ncmFtIGluYWt0aXZlcmFyIHRhbmdlbnRsw6VzZXQgb2NoIHRpbGxow7ZyYW5kZSBsw7ZzZW5vcmRzc2t5ZGQuIEV0dCBleGVtcGVsIHDDpSBkZXR0YSDDpHIgYXR0IHRlbGVmb25lbiBpbmFrdGl2ZXJhciB0YW5nZW50bMOlc2V0IHZpZCBpbmtvbW1hbmRlIHNhbXRhbCBvY2ggc2VkYW4gYWt0aXZlcmFyIGRldCBpZ2VuIG7DpHIgc2FtdGFsZXQgw6RyIGF2c2x1dGF0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFN5bmNTZXR0aW5ncyIgbXNnaWQ9IjYyMDE4MTAwMDgyMzA1MDMwNTIiPiJsw6RzYSBzeW5rcm9uaXNlcmluZ3NpbnN0w6RsbG5pbmdhciI8L3N0cmluZz4KQEAgLTQzNSwyMiArNDIwLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9IjEwODI5NzI2MDM1NzYzNjA2OTAiPiJUaWxsw6V0IGF0dCBldHQgcHJvZ3JhbSBsw6RzZXIgYWxsYSBwcml2YXRhIG9yZCwgbmFtbiBvY2ggZnJhc2VyIHNvbSBhbnbDpG5kYXJlbiBsYWdyYXIgaSBzaW4gb3JkbGlzdGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI2NzAzMTA5NTExODM2MzQzMzQxIj4ic2tyaXZhIHRpbGwgYW52w6RuZGFyZGVmaW5pZXJhZCBvcmRsaXN0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyNDEyNTYyMDY1MjQwODI4ODAiPiJUaWxsw6V0ZXIgYXR0IGV0dCBwcm9ncmFtIHNrcml2ZXIgaW4gbnlhIG9yZCBpIGFudsOkbmRhcm9yZGxpc3Rhbi4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4MDc5NDAzNzU5MDAxNzc3MjkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijk5MzcwNzQzNjk0MTAxNjkxMyI+IsOkbmRyYS90YSBib3J0IGlubmVow6VsbCBww6UgU0Qta29ydGV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiLDpG5kcmEvdGEgYm9ydCBpbm5laMOlbGwgcMOlIFNELWtvcnRldCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY2NDM5NjMyMDQ5NzY0NzE4NzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQxMzE4NzE1NDExMjcyMTE1MjYiPiJUaWxsw6V0ZXIgYXR0IGV0dCBwcm9ncmFtIHNrcml2ZXIgdGlsbCBTRC1rb3J0ZXQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4iVGlsbMOldGVyIGF0dCBldHQgcHJvZ3JhbSBza3JpdmVyIHRpbGwgU0Qta29ydGV0LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iw6RuZHJhL3RhIGJvcnQgaW5uZWjDpWxsIHDDpSBTRC1rb3J0ZXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiJUaWxsw6V0ZXIgYXR0IGV0dCBwcm9ncmFtIHNrcml2ZXIgdGlsbCBTRC1rb3J0ZXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iNTY1NjQ4NzI2NDgxOTY2OTgyNCI+IsOldGtvbXN0IHRpbGwgY2FjaGVmaWxzeXN0ZW1ldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSIxNjI0NzM0NTI4NDM1NjU5OTA2Ij4iVGlsbMOldGVyIGF0dCBldHQgcHJvZ3JhbSBsw6RzZXIgb2NoIHNrcml2ZXIgdGlsbCBjYWNoZWZpbHN5c3RlbWV0LiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQzMDc4NjE0OTYzMDI4NTAyMDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDQ5NzQyMDcyODg1NzU4NTc5MSI+IkJlZ3LDpG5zYSBsw7ZzZW5vcmQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxNzE5ODc3MjQ1NjkyMzE4Mjk5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI5MDgzNDAwMDgwODYxNzI4MDU2Ij4iQmVncsOkbnNhciB2aWxrYSB0eXBlciBhdiBsw7ZzZW5vcmQgc29tIGbDpXIgYW52w6RuZGFzLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDczNzQ3ODA3MTI2NjQyODUzMjEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iOTE0MTMwNjQ2OTQyMTk5NTAzIj4iVmlzYSBpbmxvZ2duaW5nc2bDtnJzw7ZrIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTk2MTI1MTE3OTYyNDg0MzQ4MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iNzIyNzU3ODI2MDE2NTE3MjY3MyI+IsOWdmVydmFrYSBtaXNzbHlja2FkZSBpbmxvZ2duaW5nc2bDtnJzw7ZrIHDDpSBlbmhldGVuIGbDtnIgYXR0IHV0ZsO2cmEgw6V0Z8OkcmRlci4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MDg0NzcyMDkwNzk3NDg1NDIwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjI2MjAwNzcxOTEyNDI2ODg5NTUiPiLDhXRlcnN0w6RsbCBsw7ZzZW5vcmQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzMzMyMTY3NjAwMzMxNzk5OTkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI1MzkxMjQwNjE2OTgxMjk3MzYxIj4iRnJhbXR2aW5nYSBldHQgbnl0dCB2w6RyZGUgZsO2ciBkaXR0IGzDtnNlbm9yZC4gS3LDpHZlciBhdHQgYWRtaW5pc3RyYXTDtnJlbiB0aWxsaGFuZGFow6VsbGVyIGRldCBpbm5hbiBkdSBrYW4gbG9nZ2EgaW4uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTc2MDQ2NjAyNTI0NzYzNDQ4OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjIyNzQwODUzODQ3MDQyNDg0MzEiPiJGcmFtdHZpbmdhIGzDpXNuaW5nIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjgxOTg2ODY2NDk0NjA4OTc0MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSI1Njk2OTY0MTI2MjI2MDI4NDQyIj4iS29udHJvbGxlcmEgbsOkciBlbmhldGVuIGzDpXNlcywgdmlsa2V0IGtyw6R2ZXIgYXR0IGR1IGFuZ2VyIGzDtnNlbm9yZGV0IGlnZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0MzA3ODYxNDk2MzAyODUwMjAxIj4iQmVncsOkbnNhIGzDtnNlbm9yZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjE3MTk4NzcyNDU2OTIzMTgyOTkiPiJCZWdyw6Ruc2FyIHZpbGthIHR5cGVyIGF2IGzDtnNlbm9yZCBzb20gZsOlciBhbnbDpG5kYXMuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI3Mzc0NzgwNzEyNjY0Mjg1MzIxIj4iVmlzYSBpbmxvZ2duaW5nc2bDtnJzw7ZrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iMTk2MTI1MTE3OTYyNDg0MzQ4MyI+IsOWdmVydmFrYSBtaXNzbHlja2FkZSBpbmxvZ2duaW5nc2bDtnJzw7ZrIHDDpSBlbmhldGVuIGbDtnIgYXR0IHV0ZsO2cmEgw6V0Z8OkcmRlci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjkwODQ3NzIwOTA3OTc0ODU0MjAiPiLDhXRlcnN0w6RsbCBsw7ZzZW5vcmQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIzMzMyMTY3NjAwMzMxNzk5OTkxIj4iRnJhbXR2aW5nYSBldHQgbnl0dCB2w6RyZGUgZsO2ciBkaXR0IGzDtnNlbm9yZC4gS3LDpHZlciBhdHQgYWRtaW5pc3RyYXTDtnJlbiB0aWxsaGFuZGFow6VsbGVyIGRldCBpbm5hbiBkdSBrYW4gbG9nZ2EgaW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjU3NjA0NjYwMjUyNDc2MzQ0ODgiPiJGcmFtdHZpbmdhIGzDpXNuaW5nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iS29udHJvbGxlcmEgbsOkciBlbmhldGVuIGzDpXNlcywgdmlsa2V0IGtyw6R2ZXIgYXR0IGR1IGFuZ2VyIGzDtnNlbm9yZGV0IGlnZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IlJhZGVyYSBhbGxhIGRhdGEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyMzE0MDYwOTMzNzk2Mzk2MjA1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iNzY2OTg5NTMzMzgxNDIyMjU4NiI+IsOFdGVyc3TDpGxsIGZhYnJpa3NpbnN0w6RsbG5pbmdhcm5hIG9jaCB0YSBib3J0IGFsbGEgZGF0YSB1dGFuIG7DpWdvbiBiZWtyw6RmdGVsc2UuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiLDhXRlcnN0w6RsbCBmYWJyaWtzaW5zdMOkbGxuaW5nYXJuYSBvY2ggdGEgYm9ydCBhbGxhIGRhdGEgdXRhbiBuw6Vnb24gYmVrcsOkZnRlbHNlLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5IiBtc2dpZD0iNjM4NzQ5NzQ2NjY2MDE1NDkzMSI+IkFuZ2Ugdmlsa2VuIGdsb2JhbCBwcm94eXNlcnZlciBzb20gc2thIGFudsOkbmRhcyBuw6RyIHBvbGljeW4gw6RyIGFrdGl2ZXJhZC4gRW5kYXN0IGRlbiBmw7Zyc3RhIGVuaGV0c2FkbWluaXN0cmF0w7ZyZW4gYW5nZXIgZGVuIGZha3Rpc2thIGdsb2JhbGEgcHJveHlzZXJ2ZXJuLiI8L3N0cmluZz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkhlbSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Ik1vYmlsIjwvaXRlbT4KQEAgLTU1MiwxMCArNTM4LDkgQEAKICAgICA8c2tpcCAvPgogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlT3RoZXIgKDQ0MDg0MzYxNjI5NTAxMTk4NDkpIC0tPgogICAgIDxza2lwIC8+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4idmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iQW5nZSBQSU4ta29kIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJBbmdlIGzDtnNlbm9yZCBmw7ZyIGF0dCBsw6VzYSB1cHAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IkFuZ2UgUElOLWtvZCBmw7ZyIGF0dCBsw6VzYSB1cHAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJGZWwgUElOLWtvZCEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iVHJ5Y2sgcMOlIE1lbnUgb2NoIHNlZGFuIHDDpSAwIG9tIGR1IHZpbGwgbMOlc2EgdXBwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOw7Zkc2FtdGFsc251bW1lciI8L3N0cmluZz4KQEAgLTU2OCw2ICs1NTMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiLDhXRlcmfDpSB0aWxsIHNhbXRhbGV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iS29ycmVrdCEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iRsO2cnPDtmsgaWdlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iRsO2cnPDtmsgaWdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IkxhZGRhciAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iTGFkZGFkLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTgyLDYgKzU2OCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0ta29ydGV0IMOkciBsw6VzdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJMw6VzZXIgdXBwIFNJTS1rb3J04oCmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iRHUgaGFyIHJpdGF0IGRpdHQgZ3JhZmlza2EgbMO2c2Vub3JkIGZlbCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnw6VuZ2VyLiAiXG5cbiJGw7Zyc8O2ayBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkR1IGhhciBhbmdldHQgZmVsIGzDtnNlbm9yZCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnw6VuZ2VyLiAiXG5cbiJGw7Zyc8O2ayBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJEdSBoYXIgYW5nZXR0IGRpbiBQSU4ta29kIGZlbCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnw6VuZ2VyLiAiXG5cbiJGw7Zyc8O2ayBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iRHUgaGFyIHJpdGF0IGRpdHQgZ3JhZmlza2EgbMO2c2Vub3JkIGZlbCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnw6VuZ2VyLiBFZnRlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBmw7Zyc8O2ayB0aWxsIGtvbW1lciBkdSBhdHQgdXBwbWFuYXMgYXR0IGzDpXNhIHVwcCB0ZWxlZm9uZW4gbWVkIGRpbiBHb29nbGUtaW5sb2dnbmluZy4iXG5cbiIgRsO2cnPDtmsgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iRsO2cnPDtmsgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJHbMO2bXQgZGl0dCBncmFmaXNrYSBsw7ZzZW5vcmQ/Ijwvc3RyaW5nPgpAQCAtNjEwLDE0ICs1OTgsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ19iZWZvcmVfdW5sb2FkIiBtc2dpZD0iMTkwMTY3NTQ0ODE3OTY1MzA4OSI+IlZpbGwgZHUgbMOkbW5hIGRlbiBow6RyIGRlbiBow6RyIHNpZGFuPyJcblxuIjx4bGlmZjpnIGlkPSJNRVNTQUdFIj4lczwveGxpZmY6Zz4iXG5cbiJUcnljayBww6UgT0sgb20gZHUgdmlsbCBmb3J0c8OkdHRhIGVsbGVyIHDDpSBBdmJyeXQgb20gZHUgdmlsbCB2YXJhIGt2YXIgcMOlIGRlbiBha3R1ZWxsYSBzaWRhbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX2xhYmVsIiBtc2dpZD0iNjg2MDI2MTc1ODY2NTgyNTA2OSI+IkJla3LDpGZ0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRvdWJsZV90YXBfdG9hc3QiIG1zZ2lkPSIxMDY4MjE2OTM3MjQ0NTY3MjQ3Ij4iVGlwcyEgRHViYmVsa2xpY2thIG9tIGR1IHZpbGwgem9vbWEgaW4gZWxsZXIgdXQuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9maWxsX3RoaXNfZm9ybSAoODk0MDExMDg2Njc3NTA5NzQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSIxMjg0ODQzNzI4MjAzNDEyMTM1Ij4ibMOkc2Egd2ViYmzDpHNhcmhpc3RvcmlrIG9jaCBib2ttw6Rya2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI0OTgxNDg5ODE1NDY3NjE3MTkxIj4iVGlsbMOldGVyIGF0dCBwcm9ncmFtIGzDpHNlciBhbGxhIHdlYmJhZHJlc3NlciBzb20gd2ViYmzDpHNhcmVuIGhhciDDtnBwbmF0IG9jaCBhbGxhIHdlYmJsw6RzYXJlbnMgYm9rbcOkcmtlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjkwMDk0MzQxMDk4MzYyODAzNzQiPiJza3JpdmEgd2ViYmzDpHNhcmhpc3RvcmlrIG9jaCBib2ttw6Rya2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTQ1NTcxOTkwMzU3MTE0OTUwIj4iVGlsbMOldGVyIGF0dCBldHQgcHJvZ3JhbSDDpG5kcmFyIHdlYmJsw6RzYXJoaXN0b3Jpa2VuIG9jaCBib2ttw6Rya2VuYSBpIGRpbiB0ZWxlZm9uLiBTa2FkbGlnYSBwcm9ncmFtIGthbiBhbnbDpG5kYSBkZXR0YSBmw7ZyIGF0dCB0YSBib3J0IGVsbGVyIMOkbmRyYSBkYXRhIGkgd2ViYmzDpHNhcmVuLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldEFsYXJtICg1OTI0NDAxMzI4ODAzNjE1MTY1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldEFsYXJtICg1OTY2OTY2NTk4MTQ5ODc1MDgyKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0NzE1MjEyNjU1NTk4Mjc1NTMyIj4iw4RuZHJhIGdlb2dyYWZpc2sgcGxhdHMgZsO2ciB3ZWJibMOkc2FyZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0MDExOTA4MjgyOTgwODYxNjc5Ij4iVGlsbMOldGVyIGF0dCBldHQgcHJvZ3JhbSDDpG5kcmFyIHdlYmJsw6RzYXJlbnMgYmVow7ZyaWdoZXRlciBmw7ZyIGdlb2dyYWZpc2sgcGxhdHMuIFNrYWRsaWdhIHByb2dyYW0ga2FuIGFudsOkbmRhIGRldHRhIGbDtnIgYXR0IHRpbGzDpXRhIGF0dCBwbGF0c2luZm9ybWF0aW9uIHNraWNrYXMgdGlsbCBnb2R0eWNrbGlnYSB3ZWJicGxhdHNlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiJWaWxsIGR1IGF0dCB3ZWJibMOkc2FyZW4gc2thIGtvbW1hIGlow6VnIGzDtnNlbm9yZGV0PyI8L3N0cmluZz4KQEAgLTczMCwxNCArNzE2LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iVsOkbGogYWxsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4iVsOkbGogb3JkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IktsaXBwIHV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3BpZXJhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iS2xpc3RyYSBpbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iS29waWVyYSB3ZWJiYWRyZXNzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIG1zZ2lkPSI2NzM4NTU2MzQ4ODYxMzQ3MjQwIj4iTWFya2VyYSB0ZXh0Li4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+IlRleHRtYXJrZXJpbmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJJbmRhdGFtZXRvZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJMw6RnZyB0aWxsIFwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiIGkgb3JkbGlzdGFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iUmVkaWdlcmEgdGV4dCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iNDkwOTEzNTU2NDk0MTgxNTQ5NCI+IlRleHTDpXRnw6RyZGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJEw6VsaWd0IG1lZCB1dHJ5bW1lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iVGVsZWZvbmVucyBsYWdyaW5nc3V0cnltbWUgaMOlbGxlciBww6UgYXR0IHRhIHNsdXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iT0siPC9zdHJpbmc+CkBAIC03NDUsNiArNzMxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJPSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IkF2YnJ5dCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJPYnMhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJMw6RzZXIgaW4uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IlDDhSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IkFWIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJTbHV0ZsO2ciDDpXRnw6RyZCBnZW5vbSBhdHQgYW52w6RuZGEiPC9zdHJpbmc+CkBAIC03NjMsOSArNzUwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiJUdmluZ2EgZnJhbSBlbiBzdMOkbmduaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+IlJhcHBvcnRlcmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3YWl0IiBtc2dpZD0iNzE0NzExODIxNzIyNjMxNzczMiI+IlbDpG50YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IlByb2dyYW1tZXQgb21kaXJpZ2VyYWRlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBrw7Zycy4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gc3RhcnRhZGVzIGbDtnJzdC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iUHJvZ3JhbW1ldCA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXNzZW4gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBoYXIgYnJ1dGl0IG1vdCBzaW4gZWdlbiBTdHJpY3RNb2RlLXBvbGljeS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJQcm9jZXNzZW4gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGhhciBicnV0aXQgbW90IHNpbiBlZ2VuIFN0cmljdE1vZGUtcG9saWN5LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4ga8O2cnMiPC9zdHJpbmc+CkBAIC04MTIsMjggKzgwMiwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybXNfc2hvd19hbGwiIG1zZ2lkPSIyNjcxNzkxMTYzOTMzMDkxMTgwIj48Yj4iVmlzYSBhbGxhIjwvYj48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2FjdGl2aXR5X3RpdGxlIiBtc2dpZD0iMjM5OTI4OTk5OTYwODkwMDQ0MyI+IlVTQi1tYXNzbGFncmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3RpdGxlIiBtc2dpZD0iNTkwMTQ1OTA0MTM5ODc1MTQ5NSI+IlVTQi1hbnNsdXRlbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ3OTY3NTk2NDYxNjcyNDcxNzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODIzMTQ2Mjc1MDAxMDA2Njg5NiI+IkR1IGhhciBhbnNsdXRpdCB0ZWxlZm9uZW4gdGlsbCBkYXRvcm4gdmlhIFVTQi4gVsOkbGoga25hcHBlbiBuZWRhbiBvbSBkdSB2aWxsIGtvcGllcmEgZmlsZXIgbWVsbGFuIGRhdG9ybiBvY2ggU0Qta29ydGV0IGkgZGluIEFuZHJvaWQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiJEdSBoYXIgYW5zbHV0aXQgdGVsZWZvbmVuIHRpbGwgZGF0b3JuIHZpYSBVU0IuIFbDpGxqIGtuYXBwZW4gbmVkYW4gb20gZHUgdmlsbCBrb3BpZXJhIGZpbGVyIG1lbGxhbiBkYXRvcm4gb2NoIFNELWtvcnRldCBpIGRpbiBBbmRyb2lkLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4iRHUgaGFyIGFuc2x1dGl0IHRlbGVmb25lbiB0aWxsIGRhdG9ybiB2aWEgVVNCLiBWw6RsaiBrbmFwcGVuIG5lZGFuIG9tIGR1IHZpbGwga29waWVyYSBmaWxlciBtZWxsYW4gZGF0b3JuIG9jaCBTRC1rb3J0ZXQgaSBkaW4gQW5kcm9pZC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9idXR0b25fbW91bnQiIG1zZ2lkPSIxMDUyMjU5OTMwMzY5NTA4MjM1Ij4iQWt0aXZlcmEgVVNCLWxhZ3JpbmciPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNTM0Nzg0NzUxNjAzMzQ1MzYzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQ4MTgzNDc3NTY0MDI3NDAyNjEiPiJEZXQgZ2ljayBpbnRlIGF0dCBhbnbDpG5kYSBkaXR0IFNELWtvcnQgZsO2ciBVU0ItbGFncmluZy4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IkRldCBnaWNrIGludGUgYXR0IGFudsOkbmRhIGRpdHQgU0Qta29ydCBmw7ZyIFVTQi1sYWdyaW5nLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iRGV0IGdpY2sgaW50ZSBhdHQgYW52w6RuZGEgZGl0dCBTRC1rb3J0IGbDtnIgVVNCLWxhZ3JpbmcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODE3NTg5MjU1NDc1NzIxNjUyNSI+IlVTQi1hbnNsdXRlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzM4MDA4MjQwNDI4ODIxOTM0MSI+IlbDpGxqIG9tIGR1IHZpbGwga29waWVyYSBmaWxlciB0aWxsL2Zyw6VuIGRpbiBkYXRvci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjIzMzYwNTgzOTY2NjM1MTYwMTciPiJJbmFrdGl2ZXJhIFVTQi1sYWdyaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI1OTE4MTM0OTAyNjk4NDE1MzkiPiJWw6RsaiBvbSBVU0ItbGFncmluZyBza2EgaW5ha3RpdmVyYXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF90aXRsZSIgbXNnaWQ9IjY2MDEyOTg1MTcwODc3NTg1MyI+IlVTQi1sYWdyZXQgYW52w6RuZHMiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjEzNzEzMzk2NDI2NjA0MTA0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODc0NTM0NTI2MDc4MDI2NzE4NSI+IktvbnRyb2xsZXJhIGF0dCBkdSBoYXIgZGVtb250ZXJhdCAoXCJtYXRhdCB1dFwiKSBBbmRyb2lkLXRlbGVmb25lbnMgU0Qta29ydCBmcsOlbiBkYXRvcm4sIGlubmFuIGR1IGluYWt0aXZlcmFyIFVTQi1sYWdyaW5nLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJLb250cm9sbGVyYSBhdHQgZHUgaGFyIGRlbW9udGVyYXQgKFwibWF0YXQgdXRcIikgQW5kcm9pZC10ZWxlZm9uZW5zIFNELWtvcnQgZnLDpW4gZGF0b3JuLCBpbm5hbiBkdSBpbmFrdGl2ZXJhciBVU0ItbGFncmluZy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4iS29udHJvbGxlcmEgYXR0IGR1IGhhciBkZW1vbnRlcmF0IChcIm1hdGF0IHV0XCIpIEFuZHJvaWQtdGVsZWZvbmVucyBTRC1rb3J0IGZyw6VuIGRhdG9ybiwgaW5uYW4gZHUgaW5ha3RpdmVyYXIgVVNCLWxhZ3JpbmcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9idXR0b25fbW91bnQiIG1zZ2lkPSI3MDYwMjE4MDM0OTAwNjk2MDI5Ij4iSW5ha3RpdmVyYSBVU0ItbGFncmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjE0Mzg4MTkxNDg0MDQxMjEwOCI+IkV0dCBwcm9ibGVtIHVwcHN0b2QgbsOkciBVU0ItbGFncmluZ3NwbGF0c2VuIHNrdWxsZSBpbmFrdGl2ZXJhcy4gS29udHJvbGxlcmEgYXR0IFVTQi12w6RyZGVuIGhhciBkZW1vbnRlcmF0cyBvY2ggZsO2cnPDtmsgaWdlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGl0bGUiIG1zZ2lkPSI5NjMwMzkwMzM0NzA0Nzg2OTciPiJBa3RpdmVyYSBVU0ItbGFncmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190ZXh0IiBtc2dpZD0iMzIwMjgzODIzNDc4MDUwNTg4NiI+Ik9tIGR1IGFrdGl2ZXJhciBVU0ItbGFncmluZyBhdmJyeXRzIG7DpWdyYSBhdiBkZSBwcm9ncmFtIHNvbSBrw7ZycyBvY2ggZGUga2Fuc2tlIGludGUgYmxpciB0aWxsZ8OkbmdsaWdhIGlnZW4gZsO2cnLDpG4gZHUgaW5ha3RpdmVyYXIgVVNCLWxhZ3JpbmcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2Vycm9yX3RpdGxlIiBtc2dpZD0iODA0ODk5OTk3MzgzNzMzOTE3NCI+IlVTQi3DpXRnw6RyZCBtaXNzbHlja2FkZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfb2siIG1zZ2lkPSI3Mzc2OTUzMTY3MDM5ODY1NzAxIj4iT0siPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4NjYzMjQ3OTI5NTUxMDk1ODU0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjU3NzkwODAwNjk0OTc0MjIxNyI+IkZvcm1hdGVyYSBTRC1rb3J0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IkZvcm1hdGVyYSBTRC1rb3J0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYyMTM2OTk2MjQzMzUyMzYxOSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzQ3MDgxNTE0MDA2ODUwMjgyNCI+IlZpbGwgZHUgZm9ybWF0ZXJhIFNELWtvcnRldD8gQWxsYSBkYXRhIHDDpSBkaXR0IGtvcnQga29tbWVyIGF0dCBnw6UgZsO2cmxvcmFkZS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiJWaWxsIGR1IGZvcm1hdGVyYSBTRC1rb3J0ZXQ/IEFsbGEgZGF0YSBww6UgZGl0dCBrb3J0IGtvbW1lciBhdHQgZ8OlIGbDtnJsb3JhZGUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IkZvcm1hdGVyYSBTRC1rb3J0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4iVmlsbCBkdSBmb3JtYXRlcmEgU0Qta29ydGV0PyBBbGxhIGRhdGEgcMOlIGRpdHQga29ydCBrb21tZXIgYXR0IGfDpSBmw7ZybG9yYWRlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9idXR0b25fZm9ybWF0IiBtc2dpZD0iNDEzMTA2NDU2MDEyNzQ3ODY5NSI+IkZvcm1hdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTA0NDc3ODk0OTE4OTkxOCI+IlVTQi1mZWxzw7ZrbmluZyBhbnNsdXRlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4NDcwMjk2ODE4MjcwMTEwMzk2Ij4iVsOkbGogYXR0IGluYWt0aXZlcmEgVVNCLWZlbHPDtmtuaW5nLiI8L3N0cmluZz4KQEAgLTg0MSwyOSArODI2LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9hbHBoYWJldCIgbXNnaWQ9IjU0MzMyNzU0ODU0OTkwMzkxOTkiPiIgQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9udW1lcmljX2FscGhhYmV0IiBtc2dpZD0iNDAzMDE3MDUyNDU5NTEyMzYxMCI+IiAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYW5kaWRhdGVzX3N0eWxlIiBtc2dpZD0iNDMzMzkxMzA4OTYzNzA2MjI1NyI+PHU+ImthbmRpZGF0ZXIiPC91Pjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTQ1NzYwMzQxODk3MDk5NDA1MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MjM5NTE2Njc1MDI4NDM4OTk3Ij4iRsO2cmJlcmVkZXIgU0Qta29ydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4iRsO2cmJlcmVkZXIgU0Qta29ydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI1NDU3NjAzNDE4OTcwOTk0MDUwIj4iRsO2cmJlcmVkZXIgU0Qta29ydCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9jaGVja2luZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjgyODczMTk4ODI5MjY3MzcwNTMiPiJTw7ZrZXIgZWZ0ZXIgZmVsLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc4MDQ3NzgzODI0MTIxMjk5NyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM5MzczNDU1Nzc5ODM3MzA4NzMiPiJUb210IFNELWtvcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI3ODA0Nzc4MzgyNDEyMTI5OTciPiJUb210IFNELWtvcnQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxMzEyMjY2ODIwMDkyOTU4MDE0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNjA2NjYwNzU2MTI0NjI5NzA4Ij4iU0Qta29ydGV0IMOkciB0b210IGVsbGVyIHPDpSBhbnbDpG5kZXIgZGV0IGV0dCBmaWxzeXN0ZW0gc29tIGludGUgc3TDtmRzLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlNELWtvcnRldCDDpHIgdG9tdCBlbGxlciBzw6UgaGFyIGRldCBldHQgZmlsc3lzdGVtIHNvbSBpbnRlIHN0w7Zkcy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NDEwNzIzOTA2MDE5MTAwMTg5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE3MjQ2MTk5MDIwNzY1Mjg4ODkiPiJTa2FkYXQgU0Qta29ydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iU2thZGF0IFNELWtvcnQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNjc5NDEyODg0MjkwMDYxNzc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjQ2MDMxMTgzNTEzMDY3MTE5NCI+IlNELWtvcnRldCDDpHIgc2thZGF0LiBEdSBtw6VzdGUgZXZlbnR1ZWxsdCBmb3JtYXRlcmEgb20gZGl0dCBrb3J0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY5MDI1MzE3NzU5NDgyMzg5ODkiPiJTRC1rb3J0ZXQgw6RyIHNrYWRhdC4gRHUgbcOlc3RlIGV2ZW50dWVsbHQgZm9ybWF0ZXJhIG9tIGRldC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2ODcyMTUyODgyNjA0NDA3ODM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjU4MjE3NTAxNjA2MDQzMjAzNCI+IlNELWtvcnQgdG9ncyBvdsOkbnRhdCBib3J0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjg3MjE1Mjg4MjYwNDQwNzgzNyI+IlNELWtvcnQgdG9ncyBvdsOkbnRhdCBib3J0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzI2MDE4MzI5Mzc0NzQ0ODI0MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjAwNTM5NjQ2NDQ5NDY0ODkzNyI+IkRlbW9udGVyYSBTRC1rb3J0IGlubmFuIGJvcnR0YWduaW5nIGbDtnIgYXR0IHVuZHZpa2EgZGF0YWbDtnJsdXN0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+IkRlbW9udGVyYSBTRC1rb3J0IGlubmFuIGJvcnR0YWduaW5nIGbDtnIgYXR0IHVuZHZpa2EgZGF0YWbDtnJsdXN0LiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY3Mjk4MDExMzA3OTA2MTYyMDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM2NTI1ODgxMDE4Njc5NTE1Ij4iU8Oka2VydCBhdHQgdGEgYm9ydCBTRC1rb3J0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iU8Oka2VydCBhdHQgdGEgYm9ydCBTRC1rb3J0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzYxMzk2MDY4Njc0NzU5Mjc3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI3NTAzNzY5MTA2Mjg1MTg4NzAzIj4iU0Qta29ydGV0IGthbiBudSB0YXMgYm9ydC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4iRGV0IMOkciBudSBzw6RrZXJ0IGF0dCB0YSBib3J0IFNELWtvcnRldC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4OTAyNTE4MDMwNDA0MzgxMzE4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMTg3NDg4OTc2NDM2NzA4NTU2MiI+IkJvcnR0YWdldCBTRC1rb3J0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IkJvcnR0YWdldCBTRC1rb3J0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDIwNTExNzIyNzM0MjgyMjI3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjczMDg5MDQ0MTMzMTM0NDc3NiI+IlNEIGhhciB0YWdpdHMgYm9ydC4gU8OkdHQgaSBldHQgbnl0dCBTRC1rb3J0IGbDtnIgYXR0IMO2a2EgZW5oZXRlbnMgbGFncmluZ3N1dHJ5bW1lLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IlNELWtvcnRldCBoYXIgdGFnaXRzIGJvcnQuIFPDpHR0IGkgZXR0IG55dHQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4iVG9tdCBTRC1rb3J0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iU0Qta29ydGV0IMOkciB0b210IGVsbGVyIHPDpSBoYXIgZGV0IGV0dCBmaWxzeXN0ZW0gc29tIGludGUgc3TDtmRzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iU2thZGF0IFNELWtvcnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iU0Qta29ydGV0IMOkciBza2FkYXQuIER1IG3DpXN0ZSBldmVudHVlbGx0IGZvcm1hdGVyYSBvbSBkZXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjg3MjE1Mjg4MjYwNDQwNzgzNyI+IlNELWtvcnQgdG9ncyBvdsOkbnRhdCBib3J0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4iRGVtb250ZXJhIFNELWtvcnQgaW5uYW4gYm9ydHRhZ25pbmcgZsO2ciBhdHQgdW5kdmlrYSBkYXRhZsO2cmx1c3QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iU8Oka2VydCBhdHQgdGEgYm9ydCBTRC1rb3J0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IkRldCDDpHIgbnUgc8Oka2VydCBhdHQgdGEgYm9ydCBTRC1rb3J0ZXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IkJvcnR0YWdldCBTRC1rb3J0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iU0Qta29ydGV0IGhhciB0YWdpdHMgYm9ydC4gU8OkdHQgaSBldHQgbnl0dC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY3Rpdml0eV9saXN0X2VtcHR5IiBtc2dpZD0iNDE2ODgyMDYwOTQwMzM4NTc4OSI+IkluZ2EgbWF0Y2hhbmRlIGFrdGl2aXRldGVyIGhpdHRhZGVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODc4NzM1MjA3NDMyNjc0ODg5MiI+InVwcGRhdGVyYSBzdGF0aXN0aWsgw7Z2ZXIgYW52w6RuZG5pbmcgYXYga29tcG9uZW50ZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODkxNTUzNjk1NzE2NzUyODM1Ij4iVGlsbMOldGVyIGF0dCBzYW1sYWQga29tcG9uZW50c3RhdGlzdGlrIMOkbmRyYXMuIEFudsOkbmRzIGludGUgYXYgdmFubGlnYSBwcm9ncmFtLiI8L3N0cmluZz4KQEAgLTg5OCwxNSArODcyLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iSSBmw7ZydsOkZyBkZWxhZCBMMlRQL0lQU2VjIFZQTi1ueWNrZWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iQ2VydGlmaWthdHNiYXNlcmFkIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iVsOkbGogZmlsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iSW5nZW4gZmlsIGhhciB2YWx0cyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IsOFdGVyc3TDpGxsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IlNraWNrYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IkJpbGzDpGdlIGFrdGl2ZXJhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJWw6RsaiBvbSBkdSB2aWxsIGF2c2x1dGEgYmlsbMOkZ2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IkludGVybmV0ZGVsbmluZyBlbGxlciBzdXJmcHVua3QgYWt0aXZlcmFkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iVHJ5Y2sgb20gZHUgdmlsbCBrb25maWd1cmVyYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IlRpbGxiYWthIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iTsOkc3RhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iSG9wcGEgw7Z2ZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJIw7ZnIG1vYmlsZGF0YWFudsOkbmRuaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJUcnljayBvbSBkdSB2aWxsIHZldGEgbWVyIG9tIG1vYmlsZGF0YWFudsOkbmRuaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJHcsOkbnNlbiBmw7ZyIG1vYmlsZGF0YSBoYXIgw7Z2ZXJza3JpZGl0cyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiJUcnljayBvbSBkdSB2aWxsIHZldGEgbWVyIG9tIG1vYmlsZGF0YWFudsOkbmRuaW5nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fbWF0Y2hlcyIgbXNnaWQ9IjgxMjk0MjE5MDg5MTU4NDA3MzciPiJJbmdhIHRyw6RmZmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZmluZF9vbl9wYWdlIiBtc2dpZD0iMTk0Njc5OTIzMzgyMjgyMDM4NCI+IlPDtmsgcMOlIHNpZGFuIjwvc3RyaW5nPgorICA8cGx1cmFscyBuYW1lPSJtYXRjaGVzX2ZvdW5kIj4KKyAgICA8aXRlbSBxdWFudGl0eT0ib25lIiBtc2dpZD0iODE2NzE0NzA4MTEzNjU3OTQzOSI+IjEgdHLDpGZmIjwvaXRlbT4KKyAgICA8aXRlbSBxdWFudGl0eT0ib3RoZXIiIG1zZ2lkPSI0NjQxODcyNzk3MDY3NjA5MTc3Ij4iPHhsaWZmOmcgaWQ9IklOREVYIj4lZDwveGxpZmY6Zz4gYXYgPHhsaWZmOmcgaWQ9IlRPVEFMIj4lZDwveGxpZmY6Zz4iPC9pdGVtPgorICA8L3BsdXJhbHM+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sCmluZGV4IGFkM2I1ZTIuLjZhYzViODZkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKQEAgLTE2OSw4ICsxNjksNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX2RldmVsb3BtZW50VG9vbHMiIG1zZ2lkPSIzNDQ2MTY0NTg0NzEwNTk2NTEzIj4iR2VsacWfdGlybWUgYXJhw6dsYXLEsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2NfZGV2ZWxvcG1lbnRUb29scyIgbXNnaWQ9IjkwNTY0MzExOTM4OTM4MDk4MTQiPiJZYWxuxLF6Y2EgdXlndWxhbWEgZ2VsacWfdGlyaWNpbGVyIGnDp2luIGdlcmVrbGkgw7Z6ZWxsaWtsZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwbGFiX3N0b3JhZ2UiIG1zZ2lkPSIxOTcxMTE4NzcwNTQ2MzM2OTY2Ij4iRGVwb2xhbWEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MjAzMzAyMjE0OTE1MzU1Nzc0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNTQ1NTgwNDM1MzIyMDU4MTMxMiI+IlNEIGthcnRhIGVyacWfaW4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IlNEIGthcnRhIGVyacWfaW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWdyb3VwZGVzY19zdG9yYWdlIiBtc2dpZD0iOTIwMzMwMjIxNDkxNTM1NTc3NCI+IlNEIGthcnRhIGVyacWfaW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXIiIG1zZ2lkPSI3NDE3MTkyNjI5NjAxODkwNzkxIj4iZHVydW0gw6d1YnXEn3VudSBkZXZyZSBkxLHFn8SxIGLEsXJhayB2ZXlhIGRlxJ9pxZ90aXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zdGF0dXNCYXIiIG1zZ2lkPSIxMzY1NDczNTk1MzMxOTg5NzMyIj4iVXlndWxhbWFuxLFuIGR1cnVtIMOndWJ1xJ91bnUgZGV2cmUgZMSxxZ/EsSBixLFyYWttYXPEsW5hIHZleWEgc2lzdGVtIHNpbWdlbGVyaSBla2xleWlwIGthbGTEsXJtYXPEsW5hIGl6aW4gdmVyaXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXJTZXJ2aWNlIiBtc2dpZD0iNzI0NzI4MTkxMTM4NzkzMTQ4NSI+ImR1cnVtIMOndWJ1xJ91Ijwvc3RyaW5nPgpAQCAtMjY3LDggKzI2NiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2xlYXJBcHBDYWNoZSIgbXNnaWQ9Ijc3NDA0NjU2OTQxOTM2NzE0MDIiPiJVeWd1bGFtYWxhcsSxbiB1eWd1bGFtYSDDtm5iZWxsZcSfaSBkaXppbmluZGVraSBkb3N5YWxhcsSxIHNpbGVyZWsgdGVsZWZvbmRhIHllciBhw6dtYXPEsW5hIGl6aW4gdmVyaXIuIEVyacWfaW0gZ2VuZWxsaWtsZSBzaXN0ZW0gacWfbGVtbGVyaW5lIHZlIHnDvGtzZWsgZMO8emV5ZGUga8Sxc8SxdGzEsSBvbGFyYWsgdmVyaWxpci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX21vdmVQYWNrYWdlIiBtc2dpZD0iNzI4NDU0OTc5OTQ2NTAzOTI2Ij4iVXlndWxhbWEga2F5bmFrbGFyxLFuxLEgdGHFn8SxIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW92ZVBhY2thZ2UiIG1zZ2lkPSI2MzIzMDQ5MjkxOTIzOTI1Mjc3Ij4iQmlyIHV5Z3VsYW1hbsSxbiwgdXlndWxhbWEga2F5bmFrbGFyxLFuxLEgZGFoaWxpIHZlIGhhcmljaSBvcnRhbWxhciBhcmFzxLFuZGEgdGHFn8SxbWFzxLFuYSBvbGFuYWsgdGFuxLFyLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ4MTE5MjE3MDM4ODI1MzIwNzAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZExvZ3MiIG1zZ2lkPSI2NjE1Nzc4NTQzMTk4OTY3NjE0Ij4ic2lzdGVtIGfDvG5sw7xrIGRvc3lhbGFyxLFuxLEgb2t1Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjI1NzkzNzk1NTU4MDQ3NTkwMiAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZExvZ3MiIG1zZ2lkPSI4ODk2NDQ5NDM3NDY0ODY3NzY2Ij4iVXlndWxhbWFsYXLEsW4gc2lzdGVtaW4gw6dlxZ9pdGxpIGfDvG5sw7xrIGRvc3lhbGFyxLFuZGFuIG9rdW1hbGFyxLFuYSBpemluIHZlcmlyLiBCdSwgdXlndWxhbWFsYXLEsW4gdGVsZWZvbiBpbGUgbmVsZXIgeWFwdMSxxJ/EsW7EsXogaWxlIGlsZ2lsaSBnZW5lbCBiaWxnaSBidWxtYXPEsW5hIGl6aW4gdmVyaXIsIGFuY2FrIGJ1bmxhciBracWfaXNlbCB2ZXlhIMO2emVsIGJpciBiaWxnaSBpw6dlcm1lbWVsaWRpci4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9yZWFkTG9ncyAoNjYxNTc3ODU0MzE5ODk2NzYxNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19yZWFkTG9ncyAoODg5NjQ0OTQzNzQ2NDg2Nzc2NikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlhZ25vc3RpYyIgbXNnaWQ9IjgwNzY3NDM5NTM5MDgwMDAzNDIiPiJzYWhpYmkgdGFuxLFsYW1hIG9sYW4ga2F5bmFrbGFyxLEgb2t1L2J1bmxhcmEgeWF6Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlhZ25vc3RpYyIgbXNnaWQ9IjMxMjEyMzgzNzM5NTE2MzcwNDkiPiJVeWd1bGFtYW7EsW4gdGFuxLFsYW1hIGdydWJ1bmRha2kgYmlyIGtheW5hxJ9hIGFpdCBoZXJoYW5naSBiaXIga2F5bmHEn8SxOyDDtnJuZcSfaW4gL2RldiBpw6dpbmRla2kgZG9zeWFsYXLEsSBva3VtYXPEsW5hIHZlIGJ1bmxhcmEgeWF6bWFzxLFuYSBpemluIHZlcmlyLiBCdSBpxZ9sZXZpbiBzaXN0ZW0ga2FyYXJsxLFsxLHEn8SxbsSxIHZlIGfDvHZlbmxpxJ9pbmkgb2x1bXN1eiBldGtpbGVtZSBvbGFzxLFsxLHEn8SxIHZhcmTEsXIuIMOccmV0aWNpIHZleWEgb3BlcmF0w7ZyIHRhcmFmxLFuZGFuIFlBTE5JWkNBIGRvbmFuxLFtYSDDtnpnw7wgdGFuxLFsYW1hIGnDp2luIGt1bGxhbsSxbG1hbMSxZMSxci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NoYW5nZUNvbXBvbmVudFN0YXRlIiBtc2dpZD0iNzk0MjUxOTg4MzQzMjk0MDYiPiJ1eWd1bGFtYSBiaWxlxZ9lbmxlcmluaSBldGtpbmxlxZ90aXIgdmV5YSBkZXZyZSBkxLHFn8SxIGLEsXJhayI8L3N0cmluZz4KQEAgLTQwMywyMiArNDA0LDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aEFkbWluIiBtc2dpZD0iNzI1NjI4OTc3NDY2NzA1NDU1NSI+IlV5Z3VsYW1hbGFyxLFuIHllcmVsIEJsdWV0b290aCB0ZWxlZm9udW51IHlhcMSxbGFuZMSxcm1hc8SxbmEgdmUgdXphayBjaWhhemxhcsSxIGtlxZ9mZWRpcCBidW5sYXIgaWxlIGXFn2xlxZ9tZXNpbmUgaXppbiB2ZXJpci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2JsdWV0b290aCIgbXNnaWQ9IjgzNjEwMzg3MDc4NTcwMTg3MzIiPiJCbHVldG9vdGggYmHEn2xhbnTEsWxhcsSxIG9sdcWfdHVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmx1ZXRvb3RoIiBtc2dpZD0iNzYyNTE1MzgwNjc5MzkyOTQ1Ij4iVXlndWxhbWFsYXLEsW4geWVyZWwgQmx1ZXRvb3RoIHRlbGVmb251bnVuIHlhcMSxbGFuZMSxcm1hc8SxbsSxIGfDtnLDvG50w7xsZW1lc2luZSB2ZSBlxZ9sZcWfaWxtacWfIGNpaGF6bGFyIGlsZSBiYcSfbGFudMSxIGt1cnVwIGthYnVsIGV0bWVzaW5lIGl6aW4gdmVyaXIuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjQWRtaW4gKDIyNTEzMDIyMzMwMTIyNTAwNTYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjQWRtaW4gKDE5MzU4NDI2MTE0NjQ4OTU3ODUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNSYXcgKDQ0MjM0NzE3MTExMTQzMjU3MDgpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjUmF3ICg1NTMzMDIyNzM2NTU5Mzg1NjY1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjTm90aWZ5ICg0Nzg0NzAzNjAwODI3OTIzNTgpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTm90aWZ5ICgyOTkwMDUzNTE3OTYyMDcwNjE3KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjTGxjcCAoNDk3MjA1MTQ2MTAwNzAzMDQyNikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNMbGNwICg5MTU5MjEyNzc4NjAwNDY0MCkgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iNDk3NzQwNjE2NDMxMTUzNTA5MiI+InR1xZ8ga2lsaWRpbmkgZGV2cmUgZMSxxZ/EsSBixLFyYWsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSIzMTg5NzYzNDc5MzI2MzAyMDE3Ij4iVXlndWxhbWFsYXLEsW4gdHXFnyBraWxpZGluaSB2ZSBpbGdpbGkgxZ9pZnJlbGkgZ8O8dmVubGlrIMO2bmxlbWluaSBkZXZyZSBkxLHFn8SxIGLEsXJha21hc8SxbmEgaXppbiB2ZXJpci4gQnVudW4gZ2XDp2VybGkgYmlyIMO2cm5lxJ9pIGdlbGVuIGJpciDDp2HEn3LEsSBhbMSxbmTEscSfxLFuZGEgdHXFnyBraWxpZGluaW4gZGV2cmUgZMSxxZ/EsSBixLFyYWvEsWxtYXPEsSwgc29ucmEgw6dhxJ9yxLEgYml0dGnEn2luZGUga2lsaWRpbiB5ZW5pZGVuIGRldnJleWUgc29rdWxtYXPEsWTEsXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkU3luY1NldHRpbmdzIiBtc2dpZD0iNjIwMTgxMDAwODIzMDUwMzA1MiI+InNlbmsuIGF5YXJsYXLEsW7EsSBva3UiPC9zdHJpbmc+CkBAIC00MzUsMjIgKzQyMCwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSIxMDgyOTcyNjAzNTc2MzYwNjkwIj4iS3VsbGFuxLFjxLFuxLFuIGt1bGxhbsSxY8SxIHPDtnpsw7zEn8O8bmRlIGRlcG9sYW3EscWfIG9sYWJpbGVjZcSfaSBracWfaXNlbCBrZWxpbWVsZXJpLCBhZGxhcsSxIHZlIGtlbGltZSDDtmJla2xlcmluaSB1eWd1bGFtYWxhcsSxbiBva3VtYXPEsW5hIGl6aW4gdmVyaXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI2NzAzMTA5NTExODM2MzQzMzQxIj4ia3VsbGFuxLFjxLEgdGFuxLFtbMSxIHPDtnpsw7zEn2UgeWF6Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI0MTI1NjIwNjUyNDA4Mjg4MCI+IlV5Z3VsYW1hbGFyxLFuIGt1bGxhbsSxY8SxIHPDtnpsw7zEn8O8bmUgeWVuaSBrZWxpbWVsZXIgeWF6bWFzxLFuYSBpemluIHZlcmlyLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDgwNzk0MDM3NTkwMDE3NzcyOTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iOTkzNzA3NDM2OTQxMDE2OTEzIj4iU0Qga2FydCBpw6dlcmlrbGVyaW5pIGRlxJ9pxZ90aXIvc2lsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJTRCBrYXJ0IGnDp2VyaWtsZXJpbmkgZGXEn2nFn3Rpci9zaWwiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NjQzOTYzMjA0OTc2NDcxODc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MTMxODcxNTQxMTI3MjExNTI2Ij4iQmlyIHV5Z3VsYW1heWEgU0Qga2FydGEgeWF6bWEgaXpuaSB2ZXJpci4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiJCaXIgdXlndWxhbWF5YSBTRCBrYXJ0YSB5YXptYSBpem5pIHZlcmlyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iU0Qga2FydCBpw6dlcmlrbGVyaW5pIGRlxJ9pxZ90aXIvc2lsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4iQmlyIHV5Z3VsYW1heWEgU0Qga2FydGEgeWF6bWEgaXpuaSB2ZXJpci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSI1NjU2NDg3MjY0ODE5NjY5ODI0Ij4iw7ZuYmVsbGVrIGRvc3lhIHNpc3RlbWluZSBlcmnFnyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSIxNjI0NzM0NTI4NDM1NjU5OTA2Ij4iQmlyIHV5Z3VsYW1hbsSxbiDDtm5iZWxsZWsgZG9zeWEgc2lzdGVtaW5kZSBva3VtYSB5YXptYSB5YXBtYXPEsW5hIGl6aW4gdmVyaXIuIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDMwNzg2MTQ5NjMwMjg1MDIwMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0NDk3NDIwNzI4ODU3NTg1NzkxIj4ixZ5pZnJleWkgc8SxbsSxcmxhIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMTcxOTg3NzI0NTY5MjMxODI5OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iOTA4MzQwMDA4MDg2MTcyODA1NiI+Ikt1bGxhbm1hbsSxemEgaXppbiB2ZXJpbGVuIMWfaWZyZSB0w7xybGVyaW5pIHPEsW7EsXJsYXnEsW4uIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzM3NDc4MDcxMjY2NDI4NTMyMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI5MTQxMzA2NDY5NDIxOTk1MDMiPiJPdHVydW0gYcOnbWEgZGVuZW1lbGVyaW5pIGl6bGUiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxOTYxMjUxMTc5NjI0ODQzNDgzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSI3MjI3NTc4MjYwMTY1MTcyNjczIj4iQmlyIGnFn2xlbSBnZXLDp2VrbGXFn3Rpcm1layBpw6dpbiBjaWhhemRha2kgYmHFn2FyxLFzxLF6IG90dXJ1bSBhw6dtYSBnaXJpxZ9pbWxlcmluaSBpemxleWluLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDkwODQ3NzIwOTA3OTc0ODU0MjAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iMjYyMDA3NzE5MTI0MjY4ODk1NSI+IsWeaWZyZSBzxLFmxLFybGFtYSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDMzMzIxNjc2MDAzMzE3OTk5OTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjUzOTEyNDA2MTY5ODEyOTczNjEiPiLFnmlmcmVuaXppIHllbmkgYmlyIGRlxJ9lciBhbG1hc8SxIGnDp2luIHpvcmxhecSxbi4gR2lyacWfIHlhcGFiaWxtZW5peiBpw6dpbiB5w7ZuZXRpY2luaW4gc2l6ZSB5ZW5pIGJpciBkZcSfZXIgc2HEn2xhbWFzxLFuxLEgZ2VyZWtlY2VrdGlyLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU3NjA0NjYwMjUyNDc2MzQ0ODggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSIyMjc0MDg1Mzg0NzA0MjQ4NDMxIj4iS2lsaXRsZW1leWUgem9ybGFtYSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI4MTk4Njg2NjQ5NDYwODk3NDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iNTY5Njk2NDEyNjIyNjAyODQ0MiI+IkNpaGF6IGtpbGl0bGVuZGnEn2luZGUsIMWfaWZyZXNpbmkgeWVuaWRlbiBnaXJtZW5pemkgZ2VyZWt0aXJlbiBkZW5ldGltLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDMwNzg2MTQ5NjMwMjg1MDIwMSI+IsWeaWZyZXlpIHPEsW7EsXJsYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjE3MTk4NzcyNDU2OTIzMTgyOTkiPiJLdWxsYW5tYW7EsXphIGl6aW4gdmVyaWxlbiDFn2lmcmUgdMO8cmxlcmluaSBzxLFuxLFybGF5xLFuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iNzM3NDc4MDcxMjY2NDI4NTMyMSI+Ik90dXJ1bSBhw6dtYSBkZW5lbWVsZXJpbmkgaXpsZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjE5NjEyNTExNzk2MjQ4NDM0ODMiPiJCaXIgacWfbGVtIGdlcsOnZWtsZcWfdGlybWVrIGnDp2luIGNpaGF6ZGFraSBiYcWfYXLEsXPEsXogb3R1cnVtIGHDp21hIGdpcmnFn2ltbGVyaW5pIGl6bGV5aW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI5MDg0NzcyMDkwNzk3NDg1NDIwIj4ixZ5pZnJlIHPEsWbEsXJsYW1hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iMzMzMjE2NzYwMDMzMTc5OTk5MSI+IsWeaWZyZW5pemkgeWVuaSBiaXIgZGXEn2VyIGFsbWFzxLEgacOnaW4gem9ybGF5xLFuLiBHaXJpxZ8geWFwYWJpbG1lbml6IGnDp2luIHnDtm5ldGljaW5pbiBzaXplIHllbmkgYmlyIGRlxJ9lciBzYcSfbGFtYXPEsW7EsSBnZXJla2VjZWt0aXIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjU3NjA0NjYwMjUyNDc2MzQ0ODgiPiJLaWxpdGxlbWV5ZSB6b3JsYW1hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iQ2loYXoga2lsaXRsZW5kacSfaW5kZSwgxZ9pZnJlc2luaSB5ZW5pZGVuIGdpcm1lbml6aSBnZXJla3RpcmVuIGRlbmV0aW0uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IlTDvG0gdmVyaWxlcmkgc2lsIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjMxNDA2MDkzMzc5NjM5NjIwNSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9Ijc2Njk4OTUzMzM4MTQyMjI1ODYiPiJUw7xtIHZlcmlsZXJpbml6aSBvbmF5IG9sbWFkYW4gc2lsbWVrIGnDp2luIGZhYnJpa2EgYXlhcmxhcsSxbmEgc8SxZsSxcmxhecSxbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IlTDvG0gdmVyaWxlcmluaXppIG9uYXkgb2xtYWRhbiBzaWxtZWsgacOnaW4gZmFicmlrYSBheWFybGFyxLFuYSBzxLFmxLFybGF5xLFuLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5IiBtc2dpZD0iNjM4NzQ5NzQ2NjY2MDE1NDkzMSI+IlBvbGl0aWthIGV0a2luIG9sZHXEn3VuZGEga3VsbGFuxLFsYWNhayBjaWhheiBnZW5lbGluZGUgZ2XDp2VybGkgcHJveHlcJ3lpIGF5YXJsYXnEsW4uIEV0a2luIGdlbmVsIHByb3h5XCd5aSB5YWxuxLF6Y2EgaWxrIGNpaGF6IHnDtm5ldGljaXNpIGF5YXJsYXIuIjwvc3RyaW5nPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iRXYiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJNb2JpbCI8L2l0ZW0+CkBAIC01NTIsMTAgKzUzOCw5IEBACiAgICAgPHNraXAgLz4KICAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzaXBBZGRyZXNzVHlwZU90aGVyICg0NDA4NDM2MTYyOTUwMTE5ODQ5KSAtLT4KICAgICA8c2tpcCAvPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+Ijx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+IGFyYWPEsWzEscSfxLF5bGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+IGlsZSA8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gdGFyaWhpbmRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iUElOIGtvZHVudSBnaXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IktpbGlkaSBhw6dtYWsgacOnaW4gxZ9pZnJleWkgZ2lyaW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IktpbGlkaSBhw6dtYWsgacOnaW4gUElOXCdpIGdpcmluIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iWWFubMSxxZ8gUElOIGtvZHUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IktpbGlkaSBhw6dtYWsgacOnaW4gw7ZuY2UgTWVuw7xcJ3llLCBzb25yYSAwXCdhIGJhc8Sxbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iQWNpbCBkdXJ1bSBudW1hcmFzxLEiPC9zdHJpbmc+CkBAIC01NjgsNiArNTUzLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iw4dhxJ9yxLF5YSBkw7ZuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iRG/En3J1ISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiLDnHpnw7xuw7x6LCBsw7x0ZmVuIHllbmlkZW4gZGVuZXlpbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iTWFhbGVzZWYsIHRla3JhciBkZW5leWluIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4ixZ5hcmogb2x1eW9yICg8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiLFnmFyaiBvbGR1LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gPHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU4Miw2ICs1NjgsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lNIGthcnQga2lsaXRsaS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJTSU0ga2FydCBraWxpZGkgYcOnxLFsxLF5b3LigKYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJLaWxpdCBhw6dtYSBkZXNlbmluaXppIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGtleiB5YW5sxLHFnyDDp2l6ZGluaXouICJcblxuIkzDvHRmZW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2FuaXllIGnDp2luZGUgeWVuaWRlbiBkZW5leWluLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IsWeaWZyZW5pemkgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2V6IHlhbmzEscWfIGdpcmRpbml6LiAiXG5cbiJMw7x0ZmVuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNhbml5ZSBpw6dpbmRlIHllbmlkZW4gZGVuZXlpbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iUElOXCdpbml6aSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrZXogeWFubMSxxZ8gZ2lyZGluaXouICJcblxuIkzDvHRmZW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2FuaXllIGnDp2luZGUgeWVuaWRlbiBkZW5leWluLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iS2lsaXQgYcOnbWEgZGVzZW5pbml6aSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrZXogeWFubMSxxZ8gw6dpemRpbml6LiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBiYcWfYXLEsXPEsXogZGVuZW1lZGVuIHNvbnJhIHRlbGVmb251bnV6dSBHb29nbGUgb3R1cnVtIGHDp21hIGJpbGdpbGVyaW5pemkga3VsbGFuYXJhayBhw6dtYW7EsXogaXN0ZW5pci4iXG5cbiIgTMO8dGZlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzYW5peWUgacOnaW5kZSB5ZW5pZGVuIGRlbmV5aW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzYW5peWUgacOnaW5kZSB5ZW5pZGVuIGRlbmV5aW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJEZXNlbmkgdW51dHR1bnV6IG11PyI8L3N0cmluZz4KQEAgLTYxMCwxNCArNTk4LDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJqc19kaWFsb2dfYmVmb3JlX3VubG9hZCIgbXNnaWQ9IjE5MDE2NzU0NDgxNzk2NTMwODkiPiJCdSBzYXlmYWRhbiBheXLEsWzEsXlvciBtdXN1bnV6PyJcblxuIjx4bGlmZjpnIGlkPSJNRVNTQUdFIj4lczwveGxpZmY6Zz4iXG5cbiJEZXZhbSBldG1layBpw6dpbiBUYW1hbVwnxLEsIHNheWZhZGEga2FsbWFrIGnDp2luIMSwcHRhbFwnaSB0xLFrbGF0xLFuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbGFiZWwiIG1zZ2lkPSI2ODYwMjYxNzU4NjY1ODI1MDY5Ij4iT25heWxhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZG91YmxlX3RhcF90b2FzdCIgbXNnaWQ9IjEwNjgyMTY5MzcyNDQ1NjcyNDciPiLEsHB1Y3U6IFlha8SxbmxhxZ90xLFybWFrIHZlIHV6YWtsYcWfdMSxcm1hayBpw6dpbiBpa2kga2V6IGhhZmlmw6dlIHZ1cnVuLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvZmlsbF90aGlzX2Zvcm0gKDg5NDAxMTA4NjY3NzUwOTc0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iMTI4NDg0MzcyODIwMzQxMjEzNSI+IlRhcmF5xLFjxLEgZ2XDp21pxZ9pbmkgdmUgZmF2b3JpbGVyaSBva3UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjQ5ODE0ODk4MTU0Njc2MTcxOTEiPiJVeWd1bGFtYXlhIFRhcmF5xLFjxLFuxLFuIHppeWFyZXQgZXRtacWfIG9sZHXEn3UgdMO8bSBVUkxcJ2xlcmkgdmUgVGFyYXnEsWPEsW7EsW4gdMO8bSBmYXZvcmlsZXJpbmkgb2t1bWEgaXpuaSB2ZXJpci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjkwMDk0MzQxMDk4MzYyODAzNzQiPiJUYXJhecSxY8SxIGdlw6dtacWfaW5pIHZlIGZhdm9yaWxlcmkgeWF6Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTQ1NTcxOTkwMzU3MTE0OTUwIj4iVXlndWxhbWF5YSB0ZWxlZm9udW51emRhIGRlcG9sYW5hbiBUYXJhecSxY8SxIGdlw6dtacWfaW5pIHZleWEgZmF2b3JpbGVyaSBkZcSfacWfdGlybWUgaXpuaSB2ZXJpci4gS8O2dMO8IGFtYcOnbMSxIHV5Z3VsYW1hbGFyIGJ1bnUgVGFyYXnEsWPEsSB2ZXJpbGVyaW5pemkgc2lsbWVrIHZleWEgZGXEn2nFn3Rpcm1layBpw6dpbiBrdWxsYW5hYmlsaXIuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0QWxhcm0gKDU5MjQ0MDEzMjg4MDM2MTUxNjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0QWxhcm0gKDU5NjY5NjY1OTgxNDk4NzUwODIpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQ3MTUyMTI2NTU1OTgyNzU1MzIiPiJUYXJhecSxY8SxXCduxLFuIGNvxJ9yYWZpIGtvbnVtIGl6aW5sZXJpbmkgZGXEn2nFn3RpciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQwMTE5MDgyODI5ODA4NjE2NzkiPiJCaXIgdXlndWxhbWFuxLFuLCBUYXJhecSxY8SxXCduxLFuIGNvxJ9yYWZpIGtvbnVtIGl6aW5sZXJpbmkgZGXEn2nFn3Rpcm1lc2luZSBpemluIHZlcmlyLiBLw7Z0w7wgYW1hw6dsxLEgdXlndWxhbWFsYXIsIGJ1IMO2emVsbGnEn2kga29udW0gYmlsZ2lsZXJpbmkgcmFzdGdlbGUgd2ViIHNpdGVsZXJpbmUgZ8O2bmRlcm1layBpw6dpbiBrdWxsYW5hYmlsaXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9tZXNzYWdlIiBtc2dpZD0iNzY3MzQ0Njg3MTM5MTk1NzkwIj4iVGFyYXnEsWPEsW7EsW4gYnUgxZ9pZnJleWkgYW7EsW1zYW1hc8SxbsSxIGlzdGl5b3IgbXVzdW51ej8iPC9zdHJpbmc+CkBAIC03MzAsMTQgKzcxNiwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlTDvG3DvG7DvCBzZcOnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiJLZWxpbWUgc2XDp2luIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IktlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iS29weWFsYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IllhcMSxxZ90xLFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJVUkxcJ3lpIGtvcHlhbGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiJNZXRpbiBzZcOnLi4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGV4dFNlbGVjdGlvbkNBQlRpdGxlIiBtc2dpZD0iNTIzNjg1MDM5NDM3MDgyMDM1NyI+Ik1ldGluIHNlw6dpbWkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJHaXJpxZ8gecO2bnRlbWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIga2VsaW1lc2luaSBzw7Z6bMO8xJ9lIGVrbGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJNZXRpbiBkw7x6ZW5sZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iNDkwOTEzNTU2NDk0MTgxNTQ5NCI+Ik1ldGluIGV5bGVtbGVyaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iWWVyIGF6Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iVGVsZWZvbnVuIGRlcG9sYW1hIGFsYW7EsSBhemFsxLF5b3IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iVGFtYW0iPC9zdHJpbmc+CkBAIC03NDUsNiArNzMxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJUYW1hbSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IsSwcHRhbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJEaWtrYXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IlnDvGtsZW5peW9yLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJBw4dJSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IktBUEFMSSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4ixLDFn2xlbWkgxZ91bnUga3VsbGFuYXJhayB0YW1hbWxhIjwvc3RyaW5nPgpAQCAtNzYzLDkgKzc1MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0iZm9yY2VfY2xvc2UiIG1zZ2lkPSIzNjUzNDE2MzE1NDUwODA2Mzk2Ij4iS2FwYW5tYXlhIHpvcmxhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+IlJhcG9yIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiJCZWtsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IlV5Z3VsYW1hIHnDtm5sZW5kaXJpbGRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IMWfaW1kaSDDp2FsxLHFn8SxeW9yLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4ixLBsayBvbGFyYWsgPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBiYcWfbGF0xLFsZMSxLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ190aXRsZSAoODMyMzc2MTYxNjA1MjEyMTkzNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19yZXBsYWNlICg2MjAyNDk4OTQ5OTcwMjgxNDEyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX29yaWdpbmFsICgxODgxMDIwMjMwMjE2Njg2ODMpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiI8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IHV5Z3VsYW1hc8SxICg8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4gacWfbGVtaSkga2VuZGlsacSfaW5kZW4gdXlndWxhZMSxxJ/EsSBTdHJpY3RNb2RlIHBvbGl0aWthc8SxbsSxIGlobGFsIGV0dGkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGnFn2xlbWkga2VuZGlsacSfaW5kZW4gdXlndWxhZMSxxJ/EsSBTdHJpY3RNb2RlIHBvbGl0aWthc8SxbsSxIGlobGFsIGV0dGkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiDDp2FsxLHFn8SxeW9yIjwvc3RyaW5nPgpAQCAtODEyLDI4ICs4MDIsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1zX3Nob3dfYWxsIiBtc2dpZD0iMjY3MTc5MTE2MzkzMzA5MTE4MCI+PGI+IlTDvG3DvG7DvCBnw7ZzdGVyIjwvYj48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2FjdGl2aXR5X3RpdGxlIiBtc2dpZD0iMjM5OTI4OTk5OTYwODkwMDQ0MyI+IlVTQiBZxLHEn8SxbiBEZXBvbGFtYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3RpdGxlIiBtc2dpZD0iNTkwMTQ1OTA0MTM5ODc1MTQ5NSI+IlVTQiBiYcSfbGFuZMSxIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDc5Njc1OTY0NjE2NzI0NzE3OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4MjMxNDYyNzUwMDEwMDY2ODk2Ij4iVGVsZWZvbnVudXp1IFVTQiBpbGUgYmlsZ2lzYXlhcsSxbsSxemEgYmHEn2xhZMSxbsSxei4gQmlsZ2lzYXlhcsSxbsSxeiBpbGUgQW5kcm9pZFwnaW5pemluIFNEIGthcnTEsSBhcmFzxLFuZGEgZG9zeWEga29weWFsYW1hayBpc3RpeW9yc2FuxLF6IGHFn2HEn8SxZGFraSBkw7zEn21leWkgc2XDp2luLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4iVGVsZWZvbnVudXp1IFVTQiBpbGUgYmlsZ2lzYXlhcsSxbsSxemEgYmHEn2xhZMSxbsSxei4gQmlsZ2lzYXlhcsSxbsSxeiBpbGUgQW5kcm9pZFwnaW5pemluIFNEIGthcnTEsSBhcmFzxLFuZGEgZG9zeWEga29weWFsYW1hayBpc3RpeW9yc2FuxLF6IGHFn2HEn8SxZGFraSBkw7zEn21leWkgc2XDp2luLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4iVGVsZWZvbnVudXp1IFVTQiBpbGUgYmlsZ2lzYXlhcsSxbsSxemEgYmHEn2xhZMSxbsSxei4gQmlsZ2lzYXlhcsSxbsSxeiBpbGUgQW5kcm9pZFwnaW5pemluIFNEIGthcnTEsSBhcmFzxLFuZGEgZG9zeWEga29weWFsYW1hayBpc3RpeW9yc2FuxLF6IGHFn2HEn8SxZGFraSBkw7zEn21leWkgc2XDp2luLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjEwNTIyNTk5MzAzNjk1MDgyMzUiPiJVU0IgZGVwb2xhbWEgYmlyaW1pbmkgYcOnIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjUzNDc4NDc1MTYwMzM0NTM2MyAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0ODE4MzQ3NzU2NDAyNzQwMjYxIj4iU0Qga2FydMSxbsSxesSxIFVTQiBkZXBvbGFtYSBiaXJpbWkgacOnaW4ga3VsbGFubWFkYSBiaXIgc29ydW4gdmFyLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iU0Qga2FydMSxbsSxesSxIFVTQiBkZXBvbGFtYSBiaXJpbWkgacOnaW4ga3VsbGFubWFkYSBiaXIgc29ydW4gdmFyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4iU0Qga2FydMSxbsSxesSxIFVTQiBkZXBvbGFtYSBiaXJpbWkgacOnaW4ga3VsbGFubWFkYSBiaXIgc29ydW4gdmFyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjgxNzU4OTI1NTQ3NTcyMTY1MjUiPiJVU0IgYmHEn2xhbmTEsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzM4MDA4MjQwNDI4ODIxOTM0MSI+IkJpbGdpc2F5YXLEsW7EsXphL2JpbGdpc2F5YXLEsW7EsXpkYW4gZG9zeWEga29weWFsYW1hayBpw6dpbiBzZcOnaW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIyMzM2MDU4Mzk2NjYzNTE2MDE3Ij4iVVNCIGRlcG9sYW1hIGJpcmltaW5pIGthcGF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI1OTE4MTM0OTAyNjk4NDE1MzkiPiJVU0IgZGVwb2xhbWEgYmlyaW1pbmkga2FwYXRtYWsgacOnaW4gc2XDp2luLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfdGl0bGUiIG1zZ2lkPSI2NjAxMjk4NTE3MDg3NzU4NTMiPiJVU0IgZGVwb2xhbWEgYmlyaW1pIGt1bGxhbsSxbMSxeW9yIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzYxMzcxMzM5NjQyNjYwNDEwNCAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg3NDUzNDUyNjA3ODAyNjcxODUiPiJVU0IgZGVwb2xhbWEgYmlyaW1pbmkga2FwYXRtYWRhbiDDtm5jZSBBbmRyb2lkIFNEIGthcnTEsW7EsSBiaWxnaXNheWFyxLFuxLF6ZGFuIGthbGTEsXJkxLHEn8SxbsSxemRhbiAoXCLDp8Sxa2FyZMSxxJ/EsW7EsXpkYW5cIikgZW1pbiBvbHVuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJVU0IgZGVwb2xhbWEgYmlyaW1pbmkga2FwYXRtYWRhbiDDtm5jZSBBbmRyb2lkIFNEIGthcnTEsW7EsSBiaWxnaXNheWFyxLFuxLF6ZGFuIGthbGTEsXJkxLHEn8SxbsSxemRhbiAoXCLDp8Sxa2FyZMSxxJ/EsW7EsXpkYW5cIikgZW1pbiBvbHVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiJVU0IgZGVwb2xhbWEgYmlyaW1pbmkga2FwYXRtYWRhbiDDtm5jZSBBbmRyb2lkIFNEIGthcnTEsW7EsSBiaWxnaXNheWFyxLFuxLF6ZGFuIGthbGTEsXJkxLHEn8SxbsSxemRhbiAoXCLDp8Sxa2FyZMSxxJ/EsW7EsXpkYW5cIikgZW1pbiBvbHVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfYnV0dG9uX21vdW50IiBtc2dpZD0iNzA2MDIxODAzNDkwMDY5NjAyOSI+IlVTQiBkZXBvbGFtYSBiaXJpbWluaSBrYXBhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjE0Mzg4MTkxNDg0MDQxMjEwOCI+IlVTQiBkZXBvbGFtYSBiaXJpbWluaSBrYXBhdMSxcmtlbiBiaXIgc29ydW4gb2x1xZ90dS4gVVNCIGFuYSBtYWtpbmVzaW5pIGthbGTEsXJkxLHEn8SxbsSxemRhbiBlbWluIG9sdW4gdmUgZGFoYSBzb25yYSB0ZWtyYXIgZGVuZXlpbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGl0bGUiIG1zZ2lkPSI5NjMwMzkwMzM0NzA0Nzg2OTciPiJVU0IgZGVwb2xhbWEgYmlyaW1pbmkgYcOnIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RleHQiIG1zZ2lkPSIzMjAyODM4MjM0NzgwNTA1ODg2Ij4iVVNCIGRlcG9sYW1hIGJpcmltaW5pIGHDp2Fyc2FuxLF6LCBrdWxsYW5tYWt0YSBvbGR1xJ91bnV6IGJhesSxIHV5Z3VsYW1hbGFyIGR1cnVyIHZlIFVTQiBkZXBvbGFtYSBiaXJpbWkga2FwYXTEsWzEsW5jYXlhIGthZGFyIGt1bGxhbsSxbGFtYXlhYmlsaXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2Vycm9yX3RpdGxlIiBtc2dpZD0iODA0ODk5OTk3MzgzNzMzOTE3NCI+IlVTQiBpxZ9sZW1pIGJhxZ9hcsSxc8SxeiBvbGR1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX29rIiBtc2dpZD0iNzM3Njk1MzE2NzAzOTg2NTcwMSI+IlRhbWFtIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODY2MzI0NzkyOTU1MTA5NTg1NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY1Nzc5MDgwMDY5NDk3NDIyMTciPiJTRCBrYXJ0xLEgYmnDp2ltbGVuZGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IlNEIGthcnTEsSBiacOnaW1sZW5kaXIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjIxMzY5OTYyNDMzNTIzNjE5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNDcwODE1MTQwMDY4NTAyODI0Ij4iU0Qga2FydMSxIGJpw6dpbWxlbmRpcm1layBpc3RlZGnEn2luaXpkZW4gZW1pbiBtaXNpbml6PyBLYXJ0xLFuxLF6ZGFraSB0w7xtIHZlcmlsZXIgeW9rIG9sYWNhay4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiJTRCBrYXJ0xLEgYmnDp2ltbGVuZGlybWVrIGlzdGVkacSfaW5pemRlbiBlbWluIG1pc2luaXo/IEthcnTEsW7EsXpkYWtpIHTDvG0gdmVyaWxlciB5b2sgb2xhY2FrLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiJTRCBrYXJ0xLEgYmnDp2ltbGVuZGlyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4iU0Qga2FydMSxIGJpw6dpbWxlbmRpcm1layBpc3RlZGnEn2luaXpkZW4gZW1pbiBtaXNpbml6PyBLYXJ0xLFuxLF6ZGFraSB0w7xtIHZlcmlsZXIgeW9rIG9sYWNhay4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfYnV0dG9uX2Zvcm1hdCIgbXNnaWQ9IjQxMzEwNjQ1NjAxMjc0Nzg2OTUiPiJCacOnaW1sZW5kaXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3MjkwNDQ3Nzg5NDkxODk5MTgiPiJVU0IgaGF0YSBhecSxa2xhbWFzxLEgYmHEn2xhbmTEsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI4NDcwMjk2ODE4MjcwMTEwMzk2Ij4iVVNCIGhhdGEgYXnEsWtsYW1hc8SxbsSxIGRldnJlIGTEscWfxLEgYsSxcmFrbWFrIGnDp2luIHTEsWtsYXnEsW4uIjwvc3RyaW5nPgpAQCAtODQxLDI5ICs4MjYsMTggQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX2FscGhhYmV0IiBtc2dpZD0iNTQzMzI3NTQ4NTQ5OTAzOTE5OSI+IiBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhc3Rfc2Nyb2xsX251bWVyaWNfYWxwaGFiZXQiIG1zZ2lkPSI0MDMwMTcwNTI0NTk1MTIzNjEwIj4iIDAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhbmRpZGF0ZXNfc3R5bGUiIG1zZ2lkPSI0MzMzOTEzMDg5NjM3MDYyMjU3Ij48dT4iYWRheWxhciI8L3U+PC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NDU3NjAzNDE4OTcwOTk0MDUwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQyMzk1MTY2NzUwMjg0Mzg5OTciPiJTRCBrYXJ0IGhhesSxcmxhbsSxeW9yIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiJTRCBrYXJ0IGhhesSxcmxhbsSxeW9yIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiJTRCBrYXJ0IGhhesSxcmxhbsSxeW9yIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODI4NzMxOTg4MjkyNjczNzA1MyI+IkhhdGFsYXIgZGVuZXRsZW5peW9yLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc4MDQ3NzgzODI0MTIxMjk5NyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM5MzczNDU1Nzc5ODM3MzA4NzMiPiJCb8WfIFNEIGthcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI3ODA0Nzc4MzgyNDEyMTI5OTciPiJCb8WfIFNEIGthcnQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxMzEyMjY2ODIwMDkyOTU4MDE0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNjA2NjYwNzU2MTI0NjI5NzA4Ij4iU0Qga2FydCBib8WfIHZleWEgZGVzdGVrbGVubWV5ZW4gYmlyIGRvc3lhIHNpc3RlbWkga3VsbGFuxLF5b3IuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iU0Qga2FydCBib8WfIHZleWEgZGVzdGVrbGVubWV5ZW4gZG9zeWEgc2lzdGVtaSBpw6dlcml5b3IiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NDEwNzIzOTA2MDE5MTAwMTg5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE3MjQ2MTk5MDIwNzY1Mjg4ODkiPiJIYXNhcmzEsSBTRCBrYXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJIYXNhcmzEsSBTRCBrYXJ0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjY3OTQxMjg4NDI5MDA2MTc3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY0NjAzMTE4MzUxMzA2NzExOTQiPiJTRCBrYXJ0IGhhc2FybMSxLiBLYXJ0xLFuxLF6xLEgeWVuaWRlbiBiacOnaW1sZW5kaXJtZW5peiBnZXJla2ViaWxpci4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iU0Qga2FydCB6YXJhciBnw7ZyZMO8LiBZZW5pZGVuIGJpw6dpbWxlbmRpcm1lbml6IGdlcmVrZWJpbGlyLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY4NzIxNTI4ODI2MDQ0MDc4MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNTgyMTc1MDE2MDYwNDMyMDM0Ij4iU0Qga2FydCBiZWtsZW5tZWRpayBiacOnaW1kZSDDp8Sxa2FyxLFsZMSxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjg3MjE1Mjg4MjYwNDQwNzgzNyI+IlNEIGthcnQgYmVrbGVubWVkaWsgYmnDp2ltZGUgw6fEsWthcsSxbGTEsSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDcyNjAxODMyOTM3NDc0NDgyNDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjIwMDUzOTY0NjQ0OTQ2NDg5MzciPiJWZXJpIGtheWLEsW5kYW4ga2HDp8Sxbm1hayBpw6dpbiBTRCBrYXJ0xLEgw6fEsWthcm1hZGFuIMO2bmNlIGJhxJ9sYW50xLFzxLFuxLEga2VzaW4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4iVmVyaSBrYXlixLFuZGFuIGthw6fEsW5tYWsgacOnaW4gU0Qga2FydMSxIMOnxLFrYXJtYWRhbiDDtm5jZSBiYcSfbGFudMSxc8SxbsSxIGtlc2luLiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY3Mjk4MDExMzA3OTA2MTYyMDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM2NTI1ODgxMDE4Njc5NTE1Ij4iU0Qga2FydCBnw7x2ZW5sZSDDp8Sxa2FyxLFsYWJpbGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iU0Qga2FydCBnw7x2ZW5sZSDDp8Sxa2FyxLFsYWJpbGlyIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzYxMzk2MDY4Njc0NzU5Mjc3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI3NTAzNzY5MTA2Mjg1MTg4NzAzIj4iU0Qga2FydCDFn2ltZGkgZ8O8dmVubGkgYmlyIMWfZWtpbGRlIMOnxLFrYXLEsWxhYmlsaXIuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU2ODg0MTI3ODEzODM3NzYwNCI+IlNEIGthcnTEsSBnw7x2ZW5sZSBrYWxkxLFyYWJpbGlyc2luaXouIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODkwMjUxODAzMDQwNDM4MTMxOCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE4NzQ4ODk3NjQzNjcwODU1NjIiPiJTRCBrYXJ0IMOnxLFrYXLEsWxtxLHFnyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiJTRCBrYXJ0IMOnxLFrYXLEsWxtxLHFnyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQyMDUxMTcyMjczNDI4MjIyNzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI3MzA4OTA0NDEzMzEzNDQ3NzYiPiJTRCBrYXJ0IMOnxLFrYXLEsWxtxLHFny4gQ2loYXrEsW7EsXrEsW4gZGVwb2xhbWEgYWxhbsSxbsSxIGFydMSxcm1hayBpw6dpbiB5ZW5pIGJpciBTRCBrYXJ0IHRha8Sxbi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4NzAxMjA2NTI5ODM2NTk2NDEiPiJTRCBrYXJ0IMOnxLFrYXLEsWxkxLEuIFllbmkgYmlyIFNEIGthcnQgdGFrxLFuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IkJvxZ8gU0Qga2FydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlNEIGthcnQgYm/FnyB2ZXlhIGRlc3Rla2xlbm1leWVuIGRvc3lhIHNpc3RlbWkgacOnZXJpeW9yIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJIYXNhcmzEsSBTRCBrYXJ0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IlNEIGthcnQgemFyYXIgZ8O2cmTDvC4gWWVuaWRlbiBiacOnaW1sZW5kaXJtZW5peiBnZXJla2ViaWxpci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iU0Qga2FydCBiZWtsZW5tZWRpayBiacOnaW1kZSDDp8Sxa2FyxLFsZMSxIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4iVmVyaSBrYXlixLFuZGFuIGthw6fEsW5tYWsgacOnaW4gU0Qga2FydMSxIMOnxLFrYXJtYWRhbiDDtm5jZSBiYcSfbGFudMSxc8SxbsSxIGtlc2luLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTgwMTEzMDc5MDYxNjIwMCI+IlNEIGthcnQgZ8O8dmVubGUgw6fEsWthcsSxbGFiaWxpciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiJTRCBrYXJ0xLEgZ8O8dmVubGUga2FsZMSxcmFiaWxpcnNpbml6LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiJTRCBrYXJ0IMOnxLFrYXLEsWxtxLHFnyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IlNEIGthcnQgw6fEsWthcsSxbGTEsS4gWWVuaSBiaXIgU0Qga2FydCB0YWvEsW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfbGlzdF9lbXB0eSIgbXNnaWQ9IjQxNjg4MjA2MDk0MDMzODU3ODkiPiJFxZ9sZcWfZW4gaGnDp2JpciBldGtpbmxpayBidWx1bmFtYWTEsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg3ODczNTIwNzQzMjY3NDg4OTIiPiJiaWxlxZ9lbiBrdWxsYW7EsW0gaXN0YXRpc3Rpa2xlcmluaSBnw7xuY2VsbGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODkxNTUzNjk1NzE2NzUyODM1Ij4iVG9wbGFubcSxxZ8gYmlsZcWfZW4gaXN0YXRpc3Rpa2xlcmluaW4gZGXEn2nFn3RpcmlsbWVzaW5lIGl6aW4gdmVyaXIuIE5vcm1hbCB1eWd1bGFtYWxhcmRhIGt1bGxhbsSxbG1hbWFsxLFkxLFyLiI8L3N0cmluZz4KQEAgLTg5OCwxNSArODcyLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iTDJUUC9JUFNlYyBWUE4gdGVtZWxsaSDDtm5jZWRlbiBwYXlsYcWfxLFsbcSxxZ8gYW5haHRhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJMMlRQL0lQU2VjIFZQTiB0ZW1lbGxpIHNlcnRpZmlrYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IkRvc3lhIHNlw6ciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJTZcOnaWxpIGRvc3lhIHlvayI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IlPEsWbEsXJsYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJHw7ZuZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJmYXZvcmkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJBcmFiYSBtb2R1IGV0a2luIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IkFyYWJhIG1vZHVuZGFuIMOnxLFrbWFrIGnDp2luIHNlw6dpbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iRG/En3J1ZGFuIGJhxJ9sYW50xLEgdmV5YSBvcnRhayBlcmnFn2ltIG5va3Rhc8SxIGV0a2luIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iWWFwxLFsYW5kxLFybWFrIGnDp2luIGRva3VudW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJHZXJpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4ixLBsZXJpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iQXRsYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IlnDvGtzZWsgZMO8emV5ZGUgbW9iaWwgdmVyaSBrdWxsYW7EsW3EsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iTW9iaWwgdmVyaSBrdWxsYW7EsW3EsSBoYWtrxLFuZGEgZGFoYSBmYXpsYSBiaWxnaSBlZGlubWVrIGnDp2luIGRva3VudW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+Ik1vYmlsIHZlcmkgbGltaXRpIGHFn8SxbGTEsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiJNb2JpbCB2ZXJpIGt1bGxhbsSxbcSxIGhha2vEsW5kYSBkYWhhIGZhemxhIGJpbGdpIGVkaW5tZWsgacOnaW4gZG9rdW51biI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX21hdGNoZXMiIG1zZ2lkPSI4MTI5NDIxOTA4OTE1ODQwNzM3Ij4iRcWfbGXFn21lIHlvayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZpbmRfb25fcGFnZSIgbXNnaWQ9IjE5NDY3OTkyMzM4MjI4MjAzODQiPiJTYXlmYWRhIGJ1bCI8L3N0cmluZz4KKyAgPHBsdXJhbHMgbmFtZT0ibWF0Y2hlc19mb3VuZCI+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im9uZSIgbXNnaWQ9IjgxNjcxNDcwODExMzY1Nzk0MzkiPiIxIGXFn2xlxZ9tZSI8L2l0ZW0+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im90aGVyIiBtc2dpZD0iNDY0MTg3Mjc5NzA2NzYwOTE3NyI+Ijx4bGlmZjpnIGlkPSJJTkRFWCI+JWQ8L3hsaWZmOmc+IC8gPHhsaWZmOmcgaWQ9IlRPVEFMIj4lZDwveGxpZmY6Zz4iPC9pdGVtPgorICA8L3BsdXJhbHM+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL2NvbmZpZy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNWEyN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9jb25maWcueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoZXNlIHJlc291cmNlcyBhcmUgYXJvdW5kIGp1c3QgdG8gYWxsb3cgdGhlaXIgdmFsdWVzIHRvIGJlIGN1c3RvbWl6ZWQKKyAgICAgZm9yIGRpZmZlcmVudCBoYXJkd2FyZSBhbmQgcHJvZHVjdCBidWlsZHMuIC0tPgorPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBDb21wb25lbnQgdG8gYmUgdXNlZCBhcyB0aGUgc3RhdHVzIGJhciBzZXJ2aWNlLiAgTXVzdCBpbXBsZW1lbnQgdGhlIElTdGF0dXNCYXIKKyAgICAgICAgIGludGVyZmFjZS4gIFRoaXMgbmFtZSBpcyBpbiB0aGUgQ29tcG9uZW50TmFtZSBmbGF0dGVuZWQgZm9ybWF0IChwYWNrYWdlL2NsYXNzKSAgLS0+CisgICAgPHN0cmluZyBuYW1lPSJjb25maWdfc3RhdHVzQmFyQ29tcG9uZW50Ij5jb20uYW5kcm9pZC5zeXN0ZW11aS9jb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0LlRhYmxldFN0YXR1c0JhclNlcnZpY2U8L3N0cmluZz4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfc3RhdHVzQmFyQ2FuSGlkZSI+ZmFsc2U8L2Jvb2w+CisKKyAgICA8IS0tIFNob3cgc2xpZGluZyB0YWIgYmVmb3JlIGxvY2tzY3JlZW4gLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX2VuYWJsZVNsaWRpbmdUYWJGaXJzdCI+ZmFsc2U8L2Jvb2w+CisgICAgPCEtLSBFbmFibGUgbG9ja3NjcmVlbiByb3RhdGlvbiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfZW5hYmxlTG9ja1NjcmVlblJvdGF0aW9uIj50cnVlPC9ib29sPgorCisgICAgPCEtLSBFbmFibGVzIDNkIHRhc2sgc3dpdGNoZXIgb24geGxhcmdlIGRldmljZSAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfZW5hYmxlUmVjZW50QXBwczNEIj50cnVlPC9ib29sPgorCis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2UvZGltZW5zLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL2RpbWVucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE1Y2IzMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL2RpbWVucy54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL2Fzc2V0cy9yZXMvYW55L2RpbWVucy54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHJlc291cmNlcz4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9oZWlnaHQiPjQ4ZGlwPC9kaW1lbj4KKyAgICA8IS0tIEhlaWdodCBvZiB0aGUgc3RhdHVzIGJhciAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9pY29uX3NpemUiPjQ4ZGlwPC9kaW1lbj4KKyAgICA8IS0tIE1hcmdpbiBhdCB0aGUgZWRnZSBvZiB0aGUgc2NyZWVuIHRvIGlnbm9yZSB0b3VjaCBldmVudHMgZm9yIGluIHRoZSB3aW5kb3dzaGFkZS4gLS0+CisgICAgPCEtLSBNYXJnaW4gZm9yIHBlcm1hbmVudCBzY3JlZW4gZGVjb3JhdGlvbnMgYXQgdGhlIGJvdHRvbS4gLS0+CisgICAgPGRpbWVuIG5hbWU9InNjcmVlbl9tYXJnaW5fYm90dG9tIj40OGRpcDwvZGltZW4+CisgICAgCisgICAgPCEtLSBEZWZhdWx0IGhlaWdodCBvZiBhIGtleSBpbiB0aGUgcGFzc3dvcmQga2V5Ym9hcmQgZm9yIGFscGhhIC0tPgorICAgIDxkaW1lbiBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIj4wLjM1aW48L2RpbWVuPgorICAgIDwhLS0gRGVmYXVsdCBoZWlnaHQgb2YgYSBrZXkgaW4gdGhlIHBhc3N3b3JkIGtleWJvYXJkIGZvciBudW1lcmljIC0tPgorICAgIDxkaW1lbiBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X251bWVyaWMiPjAuNDdpbjwvZGltZW4+CisKKyAgICA8IS0tIFRoZSB3aWR0aCB0aGF0IGlzIHVzZWQgd2hlbiBjcmVhdGluZyB0aHVtYm5haWxzIG9mIGFwcGxpY2F0aW9ucy4gLS0+CisgICAgPGRpbWVuIG5hbWU9InRodW1ibmFpbF93aWR0aCI+MjU2ZHA8L2RpbWVuPgorICAgIDwhLS0gVGhlIGhlaWdodCB0aGF0IGlzIHVzZWQgd2hlbiBjcmVhdGluZyB0aHVtYm5haWxzIG9mIGFwcGxpY2F0aW9ucy4gLS0+CisgICAgPGRpbWVuIG5hbWU9InRodW1ibmFpbF9oZWlnaHQiPjI1NWRwPC9kaW1lbj4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2Uvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzIwYmU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2Uvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL2Fzc2V0cy9yZXMvYW55L3N0cmluZ3MueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxyZXNvdXJjZXMgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorCisgICAgPCEtLSBEbyBub3QgdHJhbnNsYXRlLiAgV2ViVmlldyBVc2VyIEFnZW50IHRhcmdldGVkIGNvbnRlbnQgLS0+CisgICAgPHN0cmluZyBuYW1lPSJ3ZWJfdXNlcl9hZ2VudF90YXJnZXRfY29udGVudCIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+PC9zdHJpbmc+CisKKzwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL3N0eWxlcy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9zdHlsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OTI2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9zdHlsZXMueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDwhLS0gU3RhdHVzIEJhciBTdHlsZXMgLS0+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+P2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsPC9pdGVtPgorICAgIDwvc3R5bGU+CisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaWNrZXIiPgorICAgIDwvc3R5bGU+CisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaXRsZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkljb24iPgorICAgIDwvc3R5bGU+CisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgorICAgIDwvc3R5bGU+CisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQuVGl0bGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xOHNwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+Ym9sZDwvaXRlbT4KKyAgICA8L3N0eWxlPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCmluZGV4IDRjN2Q3MmEuLjY5N2ViOTggMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCkBAIC0xNjksOCArMTY5LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGxhYl9kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iMzQ0NjE2NDU4NDcxMDU5NjUxMyI+IuW8gOWPkeW3peWFtyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2NfZGV2ZWxvcG1lbnRUb29scyIgbXNnaWQ9IjkwNTY0MzExOTM4OTM4MDk4MTQiPiLlj6rmnInlupTnlKjnqIvluo/lvIDlj5HkurrlkZjmiY3kvJrnlKjliLDnmoTlip/og73jgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfc3RvcmFnZSIgbXNnaWQ9IjE5NzExMTg3NzA1NDYzMzY5NjYiPiLlrZjlgqgiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MjAzMzAyMjE0OTE1MzU1Nzc0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNTQ1NTgwNDM1MzIyMDU4MTMxMiI+Iuiuv+mXriBTRCDljaHjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4i6K6/6ZeuIFNEIOWNoeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiLorr/pl64gU0Qg5Y2h44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXIiIG1zZ2lkPSI3NDE3MTkyNjI5NjAxODkwNzkxIj4i5YGc55So5oiW5L+u5pS554q25oCB5qCPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc3RhdHVzQmFyIiBtc2dpZD0iMTM2NTQ3MzU5NTMzMTk4OTczMiI+IuWFgeiuuOW6lOeUqOeoi+W6j+WBnOeUqOeKtuaAgeagj+aIluiAheWinuWIoOezu+e7n+Wbvuagh+OAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyU2VydmljZSIgbXNnaWQ9IjcyNDcyODE5MTEzODc5MzE0ODUiPiLnirbmgIHmoI8iPC9zdHJpbmc+CkBAIC0yNjcsOCArMjY2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jbGVhckFwcENhY2hlIiBtc2dpZD0iNzc0MDQ2NTY5NDE5MzY3MTQwMiI+IuWFgeiuuOW6lOeUqOeoi+W6j+mAmui/h+WIoOmZpOW6lOeUqOeoi+W6j+e8k+WtmOebruW9leS4reeahOaWh+S7tumHiuaUvuaJi+acuuWtmOWCqOepuumXtOOAgumAmuW4uOatpOadg+mZkOWPqumAgueUqOS6juezu+e7n+i/m+eoi+OAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbW92ZVBhY2thZ2UiIG1zZ2lkPSI3Mjg0NTQ5Nzk5NDY1MDM5MjYiPiLnp7vliqjlupTnlKjnqIvluo/otYTmupAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19tb3ZlUGFja2FnZSIgbXNnaWQ9IjYzMjMwNDkyOTE5MjM5MjUyNzciPiLlhYHorrjlupTnlKjnqIvluo/lnKjlhoXpg6jku4votKjlkozlpJbpg6jku4votKjkuYvpl7Tnp7vliqjlupTnlKjnqIvluo/otYTmupDjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0ODExOTIxNzAzODgyNTMyMDcwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRMb2dzIiBtc2dpZD0iNjYxNTc3ODU0MzE5ODk2NzYxNCI+Iuivu+WPluezu+e7n+aXpeW/l+aWh+S7tiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIyNTc5Mzc5NTU1ODA0NzU5MDIgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+IuWFgeiuuOW6lOeUqOeoi+W6j+S7juezu+e7n+eahOWQhOaXpeW/l+aWh+S7tuS4reivu+WPluS/oeaBr+OAgui/meagt+W6lOeUqOeoi+W6j+WPr+S7peWPkeeOsOaCqOeahOaJi+acuuS9v+eUqOaDheWGte+8jOS9hui/meS6m+S/oeaBr+S4jeW6lOWMheWQq+S7u+S9leS4quS6uuS/oeaBr+aIluS/neWvhuS/oeaBr+OAgiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRMb2dzICg2NjE1Nzc4NTQzMTk4OTY3NjE0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRMb2dzICg4ODk2NDQ5NDM3NDY0ODY3NzY2KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaWFnbm9zdGljIiBtc2dpZD0iODA3Njc0Mzk1MzkwODAwMDM0MiI+Iuivu+WPli/lhpnlhaXor4rmlq3miYDmi6XmnInnmoTotYTmupAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaWFnbm9zdGljIiBtc2dpZD0iMzEyMTIzODM3Mzk1MTYzNzA0OSI+IuWFgeiuuOW6lOeUqOeoi+W6j+ivu+WPli/lhpnlhaXor4rmlq3nu4TmiYDmi6XmnInnmoTku7vkvZXotYTmupDvvIjkvovlpoLvvIwvZGV2IOS4reeahOaWh+S7tu+8ieOAgui/meWPr+iDveS8muW9seWTjeezu+e7n+eos+WumuaAp+WSjOWuieWFqOaAp+OAguatpOadg+mZkOS7heS+m+WItumAoOWVhuaIlui/kOiQpeWVhuiviuaWreehrOS7tumXrumimOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2hhbmdlQ29tcG9uZW50U3RhdGUiIG1zZ2lkPSI3OTQyNTE5ODgzNDMyOTQwNiI+IuWQr+eUqOaIluWBnOeUqOW6lOeUqOeoi+W6j+e7hOS7tiI8L3N0cmluZz4KQEAgLTQwMywyMiArNDA0LDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aEFkbWluIiBtc2dpZD0iNzI1NjI4OTc3NDY2NzA1NDU1NSI+IuWFgeiuuOW6lOeUqOeoi+W6j+mFjee9ruacrOWcsOiTneeJmeaJi+acuu+8jOS7peWPiuWPkeeOsOi/nOeoi+iuvuWkh+W5tuS4juWFtumFjeWvueOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYmx1ZXRvb3RoIiBtc2dpZD0iODM2MTAzODcwNzg1NzAxODczMiI+IuWIm+W7uuiTneeJmei/nuaOpSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JsdWV0b290aCIgbXNnaWQ9Ijc2MjUxNTM4MDY3OTM5Mjk0NSI+IuWFgeiuuOW6lOeUqOeoi+W6j+afpeeci+acrOWcsOiTneeJmeaJi+acuueahOmFjee9ru+8jOS7peWPiuW7uueri+aIluaOpeWPl+S4jumFjeWvueiuvuWkh+eahOi/nuaOpeOAgiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0FkbWluICgyMjUxMzAyMjMzMDEyMjUwMDU2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0FkbWluICgxOTM1ODQyNjExNDY0ODk1Nzg1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfbmZjUmF3ICg0NDIzNDcxNzExMTE0MzI1NzA4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY1JhdyAoNTUzMzAyMjczNjU1OTM4NTY2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY05vdGlmeSAoNDc4NDcwMzYwMDgyNzkyMzU4KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY05vdGlmeSAoMjk5MDA1MzUxNzk2MjA3MDYxNykgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY0xsY3AgKDQ5NzIwNTE0NjEwMDcwMzA0MjYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfbmZjTGxjcCAoOTE1OTIxMjc3ODYwMDQ2NDApIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjQ5Nzc0MDYxNjQzMTE1MzUwOTIiPiLlgZznlKjplK7plIEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSIzMTg5NzYzNDc5MzI2MzAyMDE3Ij4i5YWB6K645bqU55So56iL5bqP5YGc55So6ZSu6ZSB5ZKM5Lu75L2V5YWz6IGU55qE5a+G56CB5a6J5YWo6K6+572u44CC5L6L5aaC77yM5Zyo5omL5py65LiK5o6l5ZCs55S16K+d5pe25YGc55So6ZSu6ZSB77yM5Zyo6YCa6K+d57uT5p2f5ZCO6YeN5paw5ZCv55So6ZSu6ZSB44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkU3luY1NldHRpbmdzIiBtc2dpZD0iNjIwMTgxMDAwODIzMDUwMzA1MiI+Iuivu+WPluWQjOatpeiuvue9riI8L3N0cmluZz4KQEAgLTQzNSwyMiArNDIwLDIzIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9IjEwODI5NzI2MDM1NzYzNjA2OTAiPiLlhYHorrjlupTnlKjnqIvluo/or7vlj5bnlKjmiLflnKjnlKjmiLfor43lhbjkuK3lrZjlgqjnmoTku7vmhI/np4HmnInlrZfor43jgIHlkI3np7Dlkoznn63or63jgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjY3MDMxMDk1MTE4MzYzNDMzNDEiPiLlhpnlhaXnlKjmiLflrprkuYnnmoTor43lhbgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjQxMjU2MjA2NTI0MDgyODgwIj4i5YWB6K645bqU55So56iL5bqP5ZCR55So5oi36K+N5YW45Lit5YaZ5YWl5paw6K+N44CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODA3OTQwMzc1OTAwMTc3NzI5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI5OTM3MDc0MzY5NDEwMTY5MTMiPiLkv67mlLkv5Yig6ZmkIFNEIOWNoeS4reeahOWGheWuuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4i5L+u5pS5L+WIoOmZpCBTRCDljaHkuK3nmoTlhoXlrrkiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NjQzOTYzMjA0OTc2NDcxODc4IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI0MTMxODcxNTQxMTI3MjExNTI2Ij4i5YWB6K645bqU55So56iL5bqP5YaZ5YWlIFNEIOWNoeOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IuWFgeiuuOW6lOeUqOeoi+W6j+WGmeWFpSBTRCDljaHjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+IuS/ruaUuS/liKDpmaQgU0Qg5Y2h5Lit55qE5YaF5a65Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIG1zZ2lkPSI2NjQzOTYzMjA0OTc2NDcxODc4Ij4i5YWB6K645bqU55So56iL5bqP5YaZ5YWlIFNEIOWNoeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjU2NTY0ODcyNjQ4MTk2Njk4MjQiPiLorr/pl67nvJPlrZjmlofku7bns7vnu58iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iMTYyNDczNDUyODQzNTY1OTkwNiI+IuWFgeiuuOW6lOeUqOeoi+W6j+ivu+WPluWSjOWGmeWFpee8k+WtmOaWh+S7tuezu+e7n+OAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQzMDc4NjE0OTYzMDI4NTAyMDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9saW1pdFBhc3N3b3JkIiBtc2dpZD0iNDQ5NzQyMDcyODg1NzU4NTc5MSI+IumZkOWItuWvhueggemAieaLqSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE3MTk4NzcyNDU2OTIzMTgyOTkgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjkwODM0MDAwODA4NjE3MjgwNTYiPiLpmZDliLbmgqjog73lpJ/kvb/nlKjnmoTlr4bnoIHnsbvlnovjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA3Mzc0NzgwNzEyNjY0Mjg1MzIxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiIgbXNnaWQ9IjkxNDEzMDY0Njk0MjE5OTUwMyI+IuebkeaOp+eZu+W9leWwneivlSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDE5NjEyNTExNzk2MjQ4NDM0ODMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjcyMjc1NzgyNjAxNjUxNzI2NzMiPiLnm5Hmjqflr7nkuo7nmbvlvZXorr7lpIflkozmiafooYzmn5Dpobnmk43kvZznmoTlpLHotKXlsJ3or5XjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MDg0NzcyMDkwNzk3NDg1NDIwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjI2MjAwNzcxOTEyNDI2ODg5NTUiPiLph43nva7lr4bnoIEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzMzMyMTY3NjAwMzMxNzk5OTkxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSI1MzkxMjQwNjE2OTgxMjk3MzYxIj4i5by66KGM5pu05paw5a+G56CB77yM5oKo6ZyA6KaB6I635b6X566h55CG5ZGY5o+Q5L6b55qE5paw5a+G56CB5omN6IO955m75b2V44CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNTc2MDQ2NjAyNTI0NzYzNDQ4OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjIyNzQwODUzODQ3MDQyNDg0MzEiPiLlvLrooYzplIHlrpoiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyODE5ODY4NjY0OTQ2MDg5NzQwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjU2OTY5NjQxMjYyMjYwMjg0NDIiPiLmjqfliLbkvZXml7bplIHlrprorr7lpIfvvIzov5npnIDopoHmgqjph43mlrDovpPlhaXlr4bnoIHjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQzMDc4NjE0OTYzMDI4NTAyMDEiPiLpmZDliLblr4bnoIHpgInmi6kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSIxNzE5ODc3MjQ1NjkyMzE4Mjk5Ij4i6ZmQ5Yi25oKo6IO95aSf5L2/55So55qE5a+G56CB57G75Z6L44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI3Mzc0NzgwNzEyNjY0Mjg1MzIxIj4i55uR5o6n55m75b2V5bCd6K+VIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193YXRjaExvZ2luIiBtc2dpZD0iMTk2MTI1MTE3OTYyNDg0MzQ4MyI+IuebkeaOp+WvueS6jueZu+W9leiuvuWkh+WSjOaJp+ihjOafkOmhueaTjeS9nOeahOWksei0peWwneivleOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIiBtc2dpZD0iOTA4NDc3MjA5MDc5NzQ4NTQyMCI+IumHjee9ruWvhueggSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjMzMzIxNjc2MDAzMzE3OTk5OTEiPiLlvLrooYzmm7TmlrDlr4bnoIHvvIzmgqjpnIDopoHojrflvpfnrqHnkIblkZjmj5DkvpvnmoTmlrDlr4bnoIHmiY3og73nmbvlvZXjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZm9yY2VMb2NrIiBtc2dpZD0iNTc2MDQ2NjAyNTI0NzYzNDQ4OCI+IuW8uuihjOmUgeWumiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IuaOp+WItuS9leaXtumUgeWumuiuvuWkh++8jOi/memcgOimgeaCqOmHjeaWsOi+k+WFpeWvhueggeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiLmuIXpmaTmiYDmnInmlbDmja4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyMzE0MDYwOTMzNzk2Mzk2MjA1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iNzY2OTg5NTMzMzgxNDIyMjU4NiI+IuaBouWkjeWHuuWOguiuvue9ru+8jOi/meS8muWcqOS4jeaPkOekuuehruiupOeahOaDheWGteS4i+WIoOmZpOaCqOeahOaJgOacieaVsOaNruOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4i5oGi5aSN5Ye65Y6C6K6+572u77yM6L+Z5Lya5Zyo5LiN5o+Q56S656Gu6K6k55qE5oOF5Ya15LiL5Yig6Zmk5oKo55qE5omA5pyJ5pWw5o2u44CCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkiIG1zZ2lkPSI2Mzg3NDk3NDY2NjYwMTU0OTMxIj4i6K+36K6+572u5Zyo5ZCv55So5pS/562W55qE5oOF5Ya15LiL6KaB5L2/55So55qE6K6+5aSH5YWo5bGA5Luj55CG44CC5Y+q5pyJ56ys5LiA6K6+5aSH566h55CG5ZGY5omN5Y+v6K6+572u5pyJ5pWI55qE5YWo5bGA5Luj55CG44CCIjwvc3RyaW5nPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4i5L2P5a6FIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4i5omL5py6IjwvaXRlbT4KQEAgLTU1MiwxMCArNTM4LDkgQEAKICAgICA8c2tpcCAvPgogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNpcEFkZHJlc3NUeXBlT3RoZXIgKDQ0MDg0MzYxNjI5NTAxMTk4NDkpIC0tPgogICAgIDxza2lwIC8+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4i6YCa6L+HIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiLml7bpl7TvvJo8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz7vvIzmlrnlvI/vvJo8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+Iui+k+WFpSBQSU4g56CBIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiLovpPlhaXlr4bnoIHov5vooYzop6PplIEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+Iui+k+WFpSBQSU4g6L+b6KGM6Kej6ZSBIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iUElOIOeggeS4jeato+ehru+8gSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiLopoHop6PplIHvvIzor7flhYjmjIkgTUVOVSDlho3mjIkgMOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLmgKXmlZHmiJbmiqXorabnlLXor50iPC9zdHJpbmc+CkBAIC01NjgsNiArNTUzLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4i6L+U5Zue6YCa6K+dIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4i5q2j56Gu77yBIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IuW+iOaKseatie+8jOivt+mHjeivlSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4i5b6I5oqx5q2J77yM6K+36YeN6K+VIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4i5q2j5Zyo5YWF55S1ICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiLlt7LlhYXmu6HjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU4Miw2ICs1NjgsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lNIOWNoeiiq+mUgeWumiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+Iuato+WcqOino+mUgSBTSU0g5Y2hLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4i5oKo5bey57uPIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IOasoee7mOmUmeS6huiHquW3seeahOino+mUgeWbvuahiOOAgiJcblxuIuivt+WcqCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDnp5LlkI7ph43or5XjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiLmgqjlt7Lnu48gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4g5qyh6ZSZ6K+v5Zyw6L6T5YWl5LqG5a+G56CB44CCIlxuXG4i6K+35ZyoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IOenkuWQjumHjeivleOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiLmgqjlt7Lnu48gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4g5qyh6ZSZ6K+v5Zyw6L6T5YWl5LqGIFBJTuOAgiJcblxuIuivt+WcqCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDnp5LlkI7ph43or5XjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IuaCqOW3sue7jyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiDmrKHnu5jplJnkuoboh6rlt7HnmoTop6PplIHlm77moYjjgILlpoLmnpzlho3lsJ3or5UgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g5qyh5ZCO5LuN5LiN5oiQ5Yqf77yM57O757uf5Lya6KaB5rGC5oKo5L2/55So6Ieq5bex55qEIEdvb2dsZSDnmbvlvZXkv6Hmga/op6PplIHmiYvmnLrjgIIiXG5cbiLor7flnKggPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4g56eS5ZCO6YeN6K+V44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiDnp5LlkI7ph43or5XjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IuW/mOiusOS6huWbvuahiO+8nyI8L3N0cmluZz4KQEAgLTYxMCwxNCArNTk4LDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJqc19kaWFsb2dfYmVmb3JlX3VubG9hZCIgbXNnaWQ9IjE5MDE2NzU0NDgxNzk2NTMwODkiPiLmmK/lkKbku47or6XpobXpnaLlr7zoiKroh7PlroPlpITvvJ8iXG5cbiI8eGxpZmY6ZyBpZD0iTUVTU0FHRSI+JXM8L3hsaWZmOmc+IlxuXG4i6YCJ5oup4oCc56Gu5a6a4oCd57un57ut77yM5oiW6YCJ5oup4oCc5Y+W5raI4oCd55WZ5Zyo5b2T5YmN6aG16Z2i44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9sYWJlbCIgbXNnaWQ9IjY4NjAyNjE3NTg2NjU4MjUwNjkiPiLnoa7orqQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkb3VibGVfdGFwX3RvYXN0IiBtc2dpZD0iMTA2ODIxNjkzNzI0NDU2NzI0NyI+IuaPkOekuu+8mueCueaMieS4pOasoeWPr+aUvuWkp+WSjOe8qeWwj+OAgiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvZmlsbF90aGlzX2Zvcm0gKDg5NDAxMTA4NjY3NzUwOTc0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iMTI4NDg0MzcyODIwMzQxMjEzNSI+Iuivu+WPlua1j+iniOWZqOeahOWOhuWPsuiusOW9leWSjOS5puetviI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iNDk4MTQ4OTgxNTQ2NzYxNzE5MSI+IuWFgeiuuOW6lOeUqOeoi+W6j+ivu+WPlueUqOa1j+iniOWZqOiuv+mXrui/h+eahOaJgOaciee9keWdgO+8jOS7peWPiua1j+iniOWZqOeahOaJgOacieS5puetvuOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTAwOTQzNDEwOTgzNjI4MDM3NCI+IuWGmeWFpea1j+iniOWZqOeahOWOhuWPsuiusOW9leWSjOS5puetviI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9Ijk0NTU3MTk5MDM1NzExNDk1MCI+IuWFgeiuuOW6lOeUqOeoi+W6j+S/ruaUueWtmOWCqOWcqOaJi+acuuS4reeahOa1j+iniOWZqOWOhuWPsuiusOW9leaIluS5puetvuOAguaBtuaEj+W6lOeUqOeoi+W6j+WPr+WAn+atpOa4hemZpOaIluS/ruaUuea1j+iniOWZqOaVsOaNruOAgiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldEFsYXJtICg1OTI0NDAxMzI4ODAzNjE1MTY1KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldEFsYXJtICg1OTY2OTY2NTk4MTQ5ODc1MDgyKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI0NzE1MjEyNjU1NTk4Mjc1NTMyIj4i5L+u5pS55rWP6KeI5Zmo55qE5Zyw55CG5L2N572u5p2D6ZmQIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDAxMTkwODI4Mjk4MDg2MTY3OSI+IuWFgeiuuOW6lOeUqOeoi+W6j+S/ruaUuea1j+iniOWZqOeahOWcsOeQhuS9jee9ruadg+mZkOOAguaBtuaEj+W6lOeUqOeoi+W6j+S8muWIqeeUqOi/meS4gOeCueWwhuS9jee9ruS/oeaBr+WPkemAgeWIsOS7u+aEj+e9keermeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbWVzc2FnZSIgbXNnaWQ9Ijc2NzM0NDY4NzEzOTE5NTc5MCI+IuaYr+WQpuW4jOacm+a1j+iniOWZqOiusOS9j+atpOWvhuegge+8nyI8L3N0cmluZz4KQEAgLTczMCwxNCArNzE2LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4i5YWo6YCJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiLpgInmi6nmloflrZciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4i5Ymq5YiHIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiLlpI3liLYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiLnspjotLQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IuWkjeWItue9keWdgCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHRNb2RlIiBtc2dpZD0iNjczODU1NjM0ODg2MTM0NzI0MCI+IumAieaLqeaWh+Wtly4uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRleHRTZWxlY3Rpb25DQUJUaXRsZSIgbXNnaWQ9IjUyMzY4NTAzOTQzNzA4MjAzNTciPiLmloflrZfpgInmi6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiLovpPlhaXms5UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4i5bCG4oCcPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPuKAnea3u+WKoOWIsOivjeWFuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+Iue8lui+keaWh+WtlyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iNDkwOTEzNTU2NDk0MTgxNTQ5NCI+IuaWh+Wtl+aTjeS9nCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4i5a2Y5YKo56m66Ze05LiN6LazIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4i5omL5py65YaF5a2Y56m66Ze05omA5Ymp5LiN5aSa5LqG44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4i56Gu5a6aIjwvc3RyaW5nPgpAQCAtNzQ1LDYgKzczMSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4i56Gu5a6aIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4i5Y+W5raIIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IuazqOaEjyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4i5q2j5Zyo6L295YWlLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiLmiZPlvIAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiLlhbPpl60iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IuS9v+eUqOS7peS4i+aWueW8j+WPkemAgSI8L3N0cmluZz4KQEAgLTc2Myw5ICs3NTAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZvcmNlX2Nsb3NlIiBtc2dpZD0iMzY1MzQxNjMxNTQ1MDgwNjM5NiI+IuW8uuihjOWFs+mXrSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlcG9ydCIgbXNnaWQ9IjQwNjAyMTgyNjA5ODQ3OTU3MDYiPiLmiqXlkYoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3YWl0IiBtc2dpZD0iNzE0NzExODIxNzIyNjMxNzczMiI+IuetieW+hSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IuW6lOeUqOeoi+W6j+W3sumHjeWumuWQkSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPuebruWJjeato+WcqOi/kOihjOOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPuW3suWQr+WKqOOAgiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ190aXRsZSAoODMyMzc2MTYxNjA1MjEyMTkzNikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19yZXBsYWNlICg2MjAyNDk4OTQ5OTcwMjgxNDEyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX29yaWdpbmFsICgxODgxMDIwMjMwMjE2Njg2ODMpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiLlupTnlKjnqIvluo88eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+77yIPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+IOi/m+eoi++8iei/neWPjeS6huiHquaIkeW8uuWItuaJp+ihjOeahOS4peagvOaooeW8jyAoU3RyaWN0TW9kZSkg5pS/562W44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4i6L+b56iLIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiDov53lj43kuoboh6rmiJHlvLrliLbmiafooYznmoTkuKXmoLzmqKHlvI8gKFN0cmljdE1vZGUpIOaUv+etluOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz7mraPlnKjov5DooYwiPC9zdHJpbmc+CkBAIC04MTIsMjggKzgwMiwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybXNfc2hvd19hbGwiIG1zZ2lkPSIyNjcxNzkxMTYzOTMzMDkxMTgwIj48Yj4i5YWo6YOo5pi+56S6IjwvYj48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2FjdGl2aXR5X3RpdGxlIiBtc2dpZD0iMjM5OTI4OTk5OTYwODkwMDQ0MyI+IlVTQiDlpKflrrnph4/lrZjlgqgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV90aXRsZSIgbXNnaWQ9IjU5MDE0NTkwNDEzOTg3NTE0OTUiPiJVU0Ig5bey6L+e5o6lIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDc5Njc1OTY0NjE2NzI0NzE3OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4MjMxNDYyNzUwMDEwMDY2ODk2Ij4i5oKo5bey6YCa6L+HIFVTQiDlsIbmiYvmnLrov57mjqXoh7PorqHnrpfmnLrjgILlpoLmnpzmgqjopoHlnKjorqHnrpfmnLrlkowgQW5kcm9pZCDmiYvmnLrnmoQgU0Qg5Y2h5LmL6Ze05aSN5Yi25paH5Lu277yM6K+354K55Ye75LiL6Z2i55qE5oyJ6ZKu44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiLmgqjlt7LpgJrov4cgVVNCIOWwhuaJi+acuui/nuaOpeiHs+iuoeeul+acuuOAguWmguaenOaCqOimgeWcqOiuoeeul+acuuWSjCBBbmRyb2lkIOaJi+acuueahCBTRCDljaHkuYvpl7TlpI3liLbmlofku7bvvIzor7fngrnlh7vkuIvpnaLnmoTmjInpkq7jgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBtc2dpZD0iNDc5Njc1OTY0NjE2NzI0NzE3OCI+IuaCqOW3sumAmui/hyBVU0Ig5bCG5omL5py66L+e5o6l6Iez6K6h566X5py644CC5aaC5p6c5oKo6KaB5Zyo6K6h566X5py65ZKMIEFuZHJvaWQg5omL5py655qEIFNEIOWNoeS5i+mXtOWkjeWItuaWh+S7tu+8jOivt+eCueWHu+S4i+mdoueahOaMiemSruOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjEwNTIyNTk5MzAzNjk1MDgyMzUiPiLmiZPlvIAgVVNCIOWtmOWCqOiuvuWkhyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI1MzQ3ODQ3NTE2MDMzNDUzNjMgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDgxODM0Nzc1NjQwMjc0MDI2MSI+IuS9v+eUqCBTRCDljaHov5vooYwgVVNCIOWtmOWCqOaXtuWHuueOsOmXrumimOOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4i5L2/55SoIFNEIOWNoei/m+ihjCBVU0Ig5a2Y5YKo5pe25Ye6546w6Zeu6aKY44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjI1MzQ3ODQ3NTE2MDMzNDUzNjMiPiLkvb/nlKggU0Qg5Y2h6L+b6KGMIFVTQiDlrZjlgqjml7blh7rnjrDpl67popjjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI4MTc1ODkyNTU0NzU3MjE2NTI1Ij4iVVNCIOW3sui/nuaOpSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzM4MDA4MjQwNDI4ODIxOTM0MSI+IumAieaLqeWwhuaWh+S7tuWkjeWItuWIsOiuoeeul+acuuaIluS7juiuoeeul+acuuWkjeWItuWIsOWtmOWCqOiuvuWkh+OAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMjMzNjA1ODM5NjY2MzUxNjAxNyI+IuWFs+mXrSBVU0Ig5a2Y5YKo6K6+5aSHIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI1OTE4MTM0OTAyNjk4NDE1MzkiPiLpgInkuK3ku6XlhbPpl60gVVNCIOWtmOWCqOiuvuWkh+OAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfdGl0bGUiIG1zZ2lkPSI2NjAxMjk4NTE3MDg3NzU4NTMiPiLkvb/nlKjkuK3nmoQgVVNCIOWtmOWCqOiuvuWkhyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MTM3MTMzOTY0MjY2MDQxMDQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NzQ1MzQ1MjYwNzgwMjY3MTg1Ij4i5Zyo5YWz6ZetIFVTQiDlrZjlgqjorr7lpIfliY3vvIzor7fnoa7kv53mgqjlt7Lku47orqHnrpfmnLrkuK3ljbjovb3vvIjigJzlvLnlh7rigJ3vvIlBbmRyb2lkIOaJi+acuueahCBTRCDljaHjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4i5Zyo5YWz6ZetIFVTQiDlrZjlgqjorr7lpIfliY3vvIzor7fnoa7kv53mgqjlt7Lku47orqHnrpfmnLrkuK3ljbjovb3vvIjigJzlvLnlh7rigJ3vvIlBbmRyb2lkIOaJi+acuueahCBTRCDljaHjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX21lc3NhZ2UiIG1zZ2lkPSIzNjEzNzEzMzk2NDI2NjA0MTA0Ij4i5Zyo5YWz6ZetIFVTQiDlrZjlgqjorr7lpIfliY3vvIzor7fnoa7kv53mgqjlt7Lku47orqHnrpfmnLrkuK3ljbjovb3vvIjigJzlvLnlh7rigJ3vvIlBbmRyb2lkIOaJi+acuueahCBTRCDljaHjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjcwNjAyMTgwMzQ5MDA2OTYwMjkiPiLlhbPpl60gVVNCIOWtmOWCqOiuvuWkhyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjE0Mzg4MTkxNDg0MDQxMjEwOCI+IuWFs+mXrSBVU0Ig5a2Y5YKo6K6+5aSH5pe26YGH5Yiw6Zeu6aKY44CC6K+35qOA5p+l5bm256Gu5L+d5bey5Y246L295LqGIFVTQiDkuLvorr7lpIfvvIznhLblkI7ph43or5XjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGl0bGUiIG1zZ2lkPSI5NjMwMzkwMzM0NzA0Nzg2OTciPiLmiZPlvIAgVVNCIOWtmOWCqOiuvuWkhyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19jb25maXJtX2tpbGxfc3RvcmFnZV91c2Vyc190ZXh0IiBtc2dpZD0iMzIwMjgzODIzNDc4MDUwNTg4NiI+IuWmguaenOaCqOaJk+W8gOS6hiBVU0Ig5a2Y5YKo6K6+5aSH77yM5YiZ5oKo5b2T5YmN5L2/55So55qE5p+Q5Lqb5bqU55So56iL5bqP5Lya5YGc5q2i77yM6ICM5LiU5Zyo5oKo5YWz6ZetIFVTQiDlrZjlgqjorr7lpIfliY3lj6/og73pg73ml6Dms5Xkvb/nlKjjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfZXJyb3JfdGl0bGUiIG1zZ2lkPSI4MDQ4OTk5OTczODM3MzM5MTc0Ij4iVVNCIOaTjeS9nOWksei0pSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19vayIgbXNnaWQ9IjczNzY5NTMxNjcwMzk4NjU3MDEiPiLnoa7lrpoiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA4NjYzMjQ3OTI5NTUxMDk1ODU0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjU3NzkwODAwNjk0OTc0MjIxNyI+IuagvOW8j+WMliBTRCDljaEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4NjYzMjQ3OTI5NTUxMDk1ODU0Ij4i5qC85byP5YyWIFNEIOWNoSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MjEzNjk5NjI0MzM1MjM2MTkgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM0NzA4MTUxNDAwNjg1MDI4MjQiPiLnoa7lrpropoHlsIYgU0Qg5Y2h5qC85byP5YyW5ZCX77yf6K+l5Y2h5LiK55qE5omA5pyJ5pWw5o2u6YO95bCG5Lii5aSx44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4i56Gu5a6a6KaB5bCGIFNEIOWNoeagvOW8j+WMluWQl++8n+ivpeWNoeS4iueahOaJgOacieaVsOaNrumDveWwhuS4ouWkseOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiLmoLzlvI/ljJYgU0Qg5Y2hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4i56Gu5a6a6KaB5bCGIFNEIOWNoeagvOW8j+WMluWQl++8n+ivpeWNoeS4iueahOaJgOacieaVsOaNrumDveWwhuS4ouWkseOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9idXR0b25fZm9ybWF0IiBtc2dpZD0iNDEzMTA2NDU2MDEyNzQ3ODY5NSI+IuagvOW8j+WMliI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTA0NDc3ODk0OTE4OTkxOCI+IuW3sui/nuaOpSBVU0Ig6LCD6K+VIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9Ijg0NzAyOTY4MTgyNzAxMTAzOTYiPiLpgInmi6nlgZznlKggVVNCIOiwg+ivleOAgiI8L3N0cmluZz4KQEAgLTg0MSwyOSArODI2LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9hbHBoYWJldCIgbXNnaWQ9IjU0MzMyNzU0ODU0OTkwMzkxOTkiPiIgQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9udW1lcmljX2FscGhhYmV0IiBtc2dpZD0iNDAzMDE3MDUyNDU5NTEyMzYxMCI+IiAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYW5kaWRhdGVzX3N0eWxlIiBtc2dpZD0iNDMzMzkxMzA4OTYzNzA2MjI1NyI+PHU+IuWAmemAiSI8L3U+PC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NDU3NjAzNDE4OTcwOTk0MDUwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQyMzk1MTY2NzUwMjg0Mzg5OTciPiLmraPlnKjlh4blpIcgU0Qg5Y2hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiLmraPlnKjlh4blpIcgU0Qg5Y2hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiLmraPlnKjlh4blpIcgU0Qg5Y2hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODI4NzMxOTg4MjkyNjczNzA1MyI+Iuato+WcqOajgOafpeaYr+WQpuaciemUmeivr+OAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc4MDQ3NzgzODI0MTIxMjk5NyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM5MzczNDU1Nzc5ODM3MzA4NzMiPiLnqbogU0Qg5Y2hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNzgwNDc3ODM4MjQxMjEyOTk3Ij4i56m6IFNEIOWNoSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDEzMTIyNjY4MjAwOTI5NTgwMTQgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE2MDY2NjA3NTYxMjQ2Mjk3MDgiPiJTRCDljaHkuLrnqbrmiJbkvb/nlKjkuI3mlK/mjIHnmoTmlofku7bns7vnu5/jgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM4MTc3MDQwODgwMjc4MjkzODAiPiJTRCDljaHml6Dmlofku7bns7vnu5/vvIzmiJbmlofku7bns7vnu5/kuI3lj5fmlK/mjIHjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA2NDEwNzIzOTA2MDE5MTAwMTg5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE3MjQ2MTk5MDIwNzY1Mjg4ODkiPiJTRCDljaHlj5fmjZ8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjQxMDcyMzkwNjAxOTEwMDE4OSI+IlNEIOWNoeWPl+aNnyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDI2Nzk0MTI4ODQyOTAwNjE3NzUgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2NDYwMzExODM1MTMwNjcxMTk0Ij4iU0Qg5Y2h5Y+X5o2f44CC5oKo5Y+v6IO96ZyA6KaB6YeN5paw5qC85byP5YyW5oKo55qE5Y2h44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IlNEIOWNoeW3suaNn+Wdj+OAguaCqOWPr+iDveW/hemhu+WwhuWFtumHjeaWsOagvOW8j+WMluOAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY4NzIxNTI4ODI2MDQ0MDc4MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNTgyMTc1MDE2MDYwNDMyMDM0Ij4iU0Qg5Y2h5pyq5q2j5bi456e76ZmkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjg3MjE1Mjg4MjYwNDQwNzgzNyI+IlNEIOWNoeacquato+W4uOenu+mZpCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDcyNjAxODMyOTM3NDc0NDgyNDEgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjIwMDUzOTY0NjQ0OTQ2NDg5MzciPiLor7flhYjljbjovb0gU0Qg5Y2h77yM5YaN5bCG5YW256e76Zmk77yM5Lul6Ziy5pWw5o2u5Lii5aSx44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI3MjYwMTgzMjkzNzQ3NDQ4MjQxIj4i6K+35YWI5Y246L29IFNEIOWNoe+8jOWGjeWwhuWFtuenu+mZpO+8jOS7pemYsuaVsOaNruS4ouWkseOAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDY3Mjk4MDExMzA3OTA2MTYyMDAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM2NTI1ODgxMDE4Njc5NTE1Ij4iU0Qg5Y2h5bey5a6J5YWo56e76ZmkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4iU0Qg5Y2h5bey5a6J5YWo56e76ZmkIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzYxMzk2MDY4Njc0NzU5Mjc3MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI3NTAzNzY5MTA2Mjg1MTg4NzAzIj4i546w5Zyo5Y+v5Lul5a6J5YWo56e76ZmkIFNEIOWNoeOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiLmgqjnjrDlnKjlj6/ku6Xlronlhajnp7vpmaQgU0Qg5Y2h44CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODkwMjUxODAzMDQwNDM4MTMxOCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE4NzQ4ODk3NjQzNjcwODU1NjIiPiLlt7Lnp7vpmaQgU0Qg5Y2hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IuW3suenu+mZpCBTRCDljaEiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MjA1MTE3MjI3MzQyODIyMjc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIyNzMwODkwNDQxMzMxMzQ0Nzc2Ij4iU0Qg5Y2h5bey56e76Zmk44CC6K+35o+S5YWl5pawIFNEIOWNoeadpeWinuWKoOaCqOeahOiuvuWkh+WtmOWCqOepuumXtOOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzg3MDEyMDY1Mjk4MzY1OTY0MSI+IlNEIOWNoeW3suenu+mZpOOAguivt+aPkuWFpeaWsOeahCBTRCDljaHjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI3ODA0Nzc4MzgyNDEyMTI5OTciPiLnqbogU0Qg5Y2hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iU0Qg5Y2h5peg5paH5Lu257O757uf77yM5oiW5paH5Lu257O757uf5LiN5Y+X5pSv5oyB44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJTRCDljaHlj5fmjZ8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iU0Qg5Y2h5bey5o2f5Z2P44CC5oKo5Y+v6IO95b+F6aG75bCG5YW26YeN5paw5qC85byP5YyW44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjg3MjE1Mjg4MjYwNDQwNzgzNyI+IlNEIOWNoeacquato+W4uOenu+mZpCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNzI2MDE4MzI5Mzc0NzQ0ODI0MSI+Iuivt+WFiOWNuOi9vSBTRCDljaHvvIzlho3lsIblhbbnp7vpmaTvvIzku6XpmLLmlbDmja7kuKLlpLHjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3Mjk4MDExMzA3OTA2MTYyMDAiPiJTRCDljaHlt7Llronlhajnp7vpmaQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4i5oKo546w5Zyo5Y+v5Lul5a6J5YWo56e76ZmkIFNEIOWNoeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiLlt7Lnp7vpmaQgU0Qg5Y2hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iU0Qg5Y2h5bey56e76Zmk44CC6K+35o+S5YWl5paw55qEIFNEIOWNoeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X2xpc3RfZW1wdHkiIG1zZ2lkPSI0MTY4ODIwNjA5NDAzMzg1Nzg5Ij4i5om+5LiN5Yiw5Yy56YWN55qE5rS75YqoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODc4NzM1MjA3NDMyNjc0ODg5MiI+IuabtOaWsOe7hOS7tuS9v+eUqOaDheWGtee7n+iuoSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4OTE1NTM2OTU3MTY3NTI4MzUiPiLlhYHorrjkv67mlLnmlLbpm4bnmoTnu4Tku7bkvb/nlKjmg4XlhrXnu5/orqHjgILmma7pgJrlupTnlKjnqIvluo/kuI3og73kvb/nlKjmraTmnYPpmZDjgIIiPC9zdHJpbmc+CkBAIC04OTgsMTUgKzg3MiwyNCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IuWfuuS6jumihOWFseS6q+WvhumSpeeahCBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiLln7rkuo7or4HkuabnmoQgTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiLpgInmi6nmlofku7YiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiLmnKrpgInlrprku7vkvZXmlofku7YiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiLph43nva4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4i5o+Q5LqkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiLmlLbol48iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiLlt7LlkK/nlKjovabovb3mqKHlvI8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4i6YCJ5oup6YCA5Ye66L2m6L295qih5byPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IlVTQiDnu5HlrprmiJbng63ngrnlt7LlkK/nlKgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiLop6bmkbjlj6/ov5vooYzphY3nva4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiLkuIrkuIDmraUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiLkuIvkuIDmraUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiLot7Pov4ciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiLmiYvmnLrmtYHph4/ov4flpJoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+Iui9u+inpuS7peS6huino+acieWFs+aJi+acuua1gemHj+ivpuaDhSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4i5bey6LaF5Ye65omL5py65pWw5o2u5LiK6ZmQIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNDcxMjM2OTg1NjYwMTI3NTE0NiI+Iui9u+inpuS7peS6huino+acieWFs+aJi+acuua1gemHj+ivpuaDhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX21hdGNoZXMiIG1zZ2lkPSI4MTI5NDIxOTA4OTE1ODQwNzM3Ij4i5peg5Yy56YWN6aG5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZmluZF9vbl9wYWdlIiBtc2dpZD0iMTk0Njc5OTIzMzgyMjgyMDM4NCI+IuWcqOe9kemhteS4iuafpeaJviI8L3N0cmluZz4KKyAgPHBsdXJhbHMgbmFtZT0ibWF0Y2hlc19mb3VuZCI+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im9uZSIgbXNnaWQ9IjgxNjcxNDcwODExMzY1Nzk0MzkiPiIxIOS4quWMuemFjemhuSI8L2l0ZW0+CisgICAgPGl0ZW0gcXVhbnRpdHk9Im90aGVyIiBtc2dpZD0iNDY0MTg3Mjc5NzA2NzYwOTE3NyI+IuesrCA8eGxpZmY6ZyBpZD0iSU5ERVgiPiVkPC94bGlmZjpnPiDpobnvvIzlhbEgPHhsaWZmOmcgaWQ9IlRPVEFMIj4lZDwveGxpZmY6Zz4g6aG5IjwvaXRlbT4KKyAgPC9wbHVyYWxzPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sCmluZGV4IDI0MzkwNDIuLjVkYmQ4YTMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sCkBAIC0xNjksOCArMTY5LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGxhYl9kZXZlbG9wbWVudFRvb2xzIiBtc2dpZD0iMzQ0NjE2NDU4NDcxMDU5NjUxMyI+IumWi+eZvOW3peWFtyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2NfZGV2ZWxvcG1lbnRUb29scyIgbXNnaWQ9IjkwNTY0MzExOTM4OTM4MDk4MTQiPiLlj6rmnInplovnmbzogIXpnIDopoHmraTlip/og73jgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBsYWJfc3RvcmFnZSIgbXNnaWQ9IjE5NzExMTg3NzA1NDYzMzY5NjYiPiLlhLLlrZgiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA5MjAzMzAyMjE0OTE1MzU1Nzc0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNTQ1NTgwNDM1MzIyMDU4MTMxMiI+IuWtmOWPliBTRCDljaHjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZ3JvdXBkZXNjX3N0b3JhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI5MjAzMzAyMjE0OTE1MzU1Nzc0Ij4i5a2Y5Y+WIFNEIOWNoeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1ncm91cGRlc2Nfc3RvcmFnZSIgbXNnaWQ9IjkyMDMzMDIyMTQ5MTUzNTU3NzQiPiLlrZjlj5YgU0Qg5Y2h44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdGF0dXNCYXIiIG1zZ2lkPSI3NDE3MTkyNjI5NjAxODkwNzkxIj4i5YGc55So5oiW6K6K5pu054uA5oWL5YiXIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc3RhdHVzQmFyIiBtc2dpZD0iMTM2NTQ3MzU5NTMzMTk4OTczMiI+IuWFgeioseaHieeUqOeoi+W8j+WBnOeUqOeLgOaFi+WIl+aIluaWsOWinuOAgeenu+mZpOezu+e1seWcluekuuOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc3RhdHVzQmFyU2VydmljZSIgbXNnaWQ9IjcyNDcyODE5MTEzODc5MzE0ODUiPiLni4DmhYvliJciPC9zdHJpbmc+CkBAIC0yNjcsOCArMjY2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jbGVhckFwcENhY2hlIiBtc2dpZD0iNzc0MDQ2NTY5NDE5MzY3MTQwMiI+IuWFgeioseaHieeUqOeoi+W8j+WIqumZpOW/q+WPluebrumMhOijoeeahOaqlOahiO+8jOmHi+aUvuWEsuWtmOepuumWk+OAguatpOaTjeS9nOmAmuW4uOWPl+WIsOezu+e1seeoi+W6j+WatOagvOmZkOWItuOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbW92ZVBhY2thZ2UiIG1zZ2lkPSI3Mjg0NTQ5Nzk5NDY1MDM5MjYiPiLnp7vli5Xmh4nnlKjnqIvlvI/os4fmupAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19tb3ZlUGFja2FnZSIgbXNnaWQ9IjYzMjMwNDkyOTE5MjM5MjUyNzciPiLlhYHoqLHmh4nnlKjnqIvlvI/lsIfmh4nnlKjnqIvlvI/os4fmupDlvp7lhafpg6jlqpLpq5Tnp7vliLDlpJbpg6jlqpLpq5TvvIzlj43kuYvkuqblj6/jgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0ODExOTIxNzAzODgyNTMyMDcwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRMb2dzIiBtc2dpZD0iNjYxNTc3ODU0MzE5ODk2NzYxNCI+IuiugOWPluezu+e1seiomOmMhOaqlCI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDIyNTc5Mzc5NTU1ODA0NzU5MDIgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRMb2dzIiBtc2dpZD0iODg5NjQ0OTQzNzQ2NDg2Nzc2NiI+IuWFgeioseaHieeUqOeoi+W8j+iugOWPluezu+e1seiomOmMhOaqlOOAguatpOmgheaTjeS9nOWPr+iuk+aHieeUqOeoi+W8j+S6huino+ebruWJjeaJi+apn+aTjeS9nOeLgOaFi++8jOS9huWFp+WuueaHieS4jeWQq+S7u+S9leWAi+S6uuaIlumaseengeizh+ioiuOAgiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3JlYWRMb2dzICg2NjE1Nzc4NTQzMTk4OTY3NjE0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3JlYWRMb2dzICg4ODk2NDQ5NDM3NDY0ODY3NzY2KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaWFnbm9zdGljIiBtc2dpZD0iODA3Njc0Mzk1MzkwODAwMDM0MiI+IuiugOWvqyBkaWFnIOaTgeacieeahOizh+a6kCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2RpYWdub3N0aWMiIG1zZ2lkPSIzMTIxMjM4MzczOTUxNjM3MDQ5Ij4i5YWB6Kix5oeJ55So56iL5byP6K6A5a+rIGRpYWcg576k57WE55qE6LOH5rqQ77yb5L6L5aaC77yaL2RldiDoo6HnmoTmqpTmoYjjgILpgJnlj6/og73mnIPlvbHpn7/ns7vntbHnqanlrprmgKfoiIflronlhajmgKfjgILmraTlip/og73lg4Xkvpvoo73pgKDllYbmiJbmioDooZPkurrlk6HnlKjmlrznoazpq5Topo/moLzlgbXmuKzjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NoYW5nZUNvbXBvbmVudFN0YXRlIiBtc2dpZD0iNzk0MjUxOTg4MzQzMjk0MDYiPiLllZ/nlKjmiJblgZznlKjmh4nnlKjnqIvlvI/lhYPku7YiPC9zdHJpbmc+CkBAIC00MDMsMjIgKzQwNCw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGhBZG1pbiIgbXNnaWQ9IjcyNTYyODk3NzQ2NjcwNTQ1NTUiPiLlhYHoqLHmh4nnlKjnqIvlvI/oqK3lrprmnKzmqZ/ol43niZnpm7voqbHvvIzku6Xlj4rlgbXmuKzoiIfphY3lsI3lhbbku5bpgaDnq6/oo53nva7jgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2JsdWV0b290aCIgbXNnaWQ9IjgzNjEwMzg3MDc4NTcwMTg3MzIiPiLlu7rnq4vol43niZnpgKPnt5oiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ibHVldG9vdGgiIG1zZ2lkPSI3NjI1MTUzODA2NzkzOTI5NDUiPiLlhYHoqLHmh4nnlKjnqIvlvI/mqqLoppbmnKzmqZ/ol43niZnpm7voqbHoqK3lrprvvIzkuKboiIflhbbku5bphY3lsI3oo53nva7pgKPnt5rjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNBZG1pbiAoMjI1MTMwMjIzMzAxMjI1MDA1NikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNBZG1pbiAoMTkzNTg0MjYxMTQ2NDg5NTc4NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX25mY1JhdyAoNDQyMzQ3MTcxMTExNDMyNTcwOCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNSYXcgKDU1MzMwMjI3MzY1NTkzODU2NjUpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNOb3RpZnkgKDQ3ODQ3MDM2MDA4Mjc5MjM1OCkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19uZmNOb3RpZnkgKDI5OTAwNTM1MTc5NjIwNzA2MTcpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9uZmNMbGNwICg0OTcyMDUxNDYxMDA3MDMwNDI2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX25mY0xsY3AgKDkxNTkyMTI3Nzg2MDA0NjQwKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSI0OTc3NDA2MTY0MzExNTM1MDkyIj4i5YGc55So5oyJ6Y216Y6W5a6aIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iMzE4OTc2MzQ3OTMyNjMwMjAxNyI+IuWFgeioseaHieeUqOeoi+W8j+WBnOeUqOaMiemNtemOluWumuS7peWPiuWFtuS7luebuOmXnOeahOWvhueivOWuieWFqOaAp+OAguS+i+Wmgu+8muaUtuWIsOS+humbu+aZguino+mZpOaMiemNtemOluWumu+8jOmAmuipsee1kOadn+W+jOmHjeaWsOWVn+WLleaMiemNtemOluWumuOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFN5bmNTZXR0aW5ncyIgbXNnaWQ9IjYyMDE4MTAwMDgyMzA1MDMwNTIiPiLoroDlj5blkIzmraXomZXnkIboqK3lrpoiPC9zdHJpbmc+CkBAIC00MzUsMjIgKzQyMCwyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSIxMDgyOTcyNjAzNTc2MzYwNjkwIj4i5YWB6Kix5oeJ55So56iL5byP6K6A5Y+W5L2/55So6ICF5YSy5a2Y5Zyo5L2/55So6ICF5a2X5YW45YWn55qE5Lu75L2V56eB5Lq65a2X6Kme44CB5ZCN56ix5ZKM6Kme57WE44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI2NzAzMTA5NTExODM2MzQzMzQxIj4i5a+r5YWl5L2/55So6ICF5a6a576p55qE5a2X5YW4Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI0MTI1NjIwNjUyNDA4Mjg4MCI+IuWFgeioseaHieeUqOeoi+W8j+Wwh+aWsOWtl+ipnuWvq+WFpeS9v+eUqOiAheeahOWtl+WFuOOAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDgwNzk0MDM3NTkwMDE3NzcyOTEgLS0+ICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iOTkzNzA3NDM2OTQxMDE2OTEzIj4i5L+u5pS5L+WIqumZpCBTRCDljaHnmoTlhaflrrkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+IuS/ruaUuS/liKrpmaQgU0Qg5Y2h55qE5YWn5a65Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjY0Mzk2MzIwNDk3NjQ3MTg3OCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNDEzMTg3MTU0MTEyNzIxMTUyNiI+IuWFgeioseaHieeUqOeoi+W8j+Wvq+WFpSBTRCDljaHjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY2NDM5NjMyMDQ5NzY0NzE4NzgiPiLlhYHoqLHmh4nnlKjnqIvlvI/lr6vlhaUgU0Qg5Y2h44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiLkv67mlLkv5Yiq6ZmkIFNEIOWNoeeahOWFp+WuuSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBtc2dpZD0iNjY0Mzk2MzIwNDk3NjQ3MTg3OCI+IuWFgeioseaHieeUqOeoi+W8j+Wvq+WFpSBTRCDljaHjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSI1NjU2NDg3MjY0ODE5NjY5ODI0Ij4i5a2Y5Y+W5b+r5Y+W5qqU5qGI57O757WxIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjE2MjQ3MzQ1Mjg0MzU2NTk5MDYiPiLlhYHoqLHmh4nnlKjnqIvlvI/oroDlj5blj4rlr6vlhaXlv6vlj5bmqpTmoYjns7vntbHjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA0MzA3ODYxNDk2MzAyODUwMjAxIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCIgbXNnaWQ9IjQ0OTc0MjA3Mjg4NTc1ODU3OTEiPiLpmZDliLblr4bnorzoqK3lrpropo/liYciPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxNzE5ODc3MjQ1NjkyMzE4Mjk5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI5MDgzNDAwMDgwODYxNzI4MDU2Ij4i6ZmQ5Yi25YWB6Kix5L2/55So55qE5a+G56K86aGe5Z6L44CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzM3NDc4MDcxMjY2NDI4NTMyMSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dhdGNoTG9naW4iIG1zZ2lkPSI5MTQxMzA2NDY5NDIxOTk1MDMiPiLmn6XnnIvnmbvlhaXlmJfoqaboqJjpjIQiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxOTYxMjUxMTc5NjI0ODQzNDgzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iIG1zZ2lkPSI3MjI3NTc4MjYwMTY1MTcyNjczIj4i55uj6KaW6ICF54Sh5rOV55m75YWl6KOd572u5Z+36KGM6YOo5YiG5YuV5L2c44CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gOTA4NDc3MjA5MDc5NzQ4NTQyMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIyNjIwMDc3MTkxMjQyNjg4OTU1Ij4i6YeN6Kit5a+G56K8Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzMzMjE2NzYwMDMzMTc5OTk5MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19yZXNldFBhc3N3b3JkIiBtc2dpZD0iNTM5MTI0MDYxNjk4MTI5NzM2MSI+IuW8t+WItumHjeaWsOioreWumuWvhueivOOAguaCqOW/hemgiOWPluW+l+S7peeuoeeQhuWToeaPkOS+m+eahOaWsOWvhueivO+8jOaJjeiDveeZu+WFpeOAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDU3NjA0NjYwMjUyNDc2MzQ0ODggLS0+ICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9mb3JjZUxvY2siIG1zZ2lkPSIyMjc0MDg1Mzg0NzA0MjQ4NDMxIj4i5by35Yi26Y6W5a6aIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjgxOTg2ODY2NDk0NjA4OTc0MCAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSI1Njk2OTY0MTI2MjI2MDI4NDQyIj4i6KOd572u6Y6W5a6a5pmC5Y+v5Y+W5b6X5o6n5Yi277yM5L2G5b+F6aCI6YeN5paw6Ly45YWl5a+G56K844CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2xpbWl0UGFzc3dvcmQiIG1zZ2lkPSI0MzA3ODYxNDk2MzAyODUwMjAxIj4i6ZmQ5Yi25a+G56K86Kit5a6a6KaP5YmHIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19saW1pdFBhc3N3b3JkIiBtc2dpZD0iMTcxOTg3NzI0NTY5MjMxODI5OSI+IumZkOWItuWFgeioseS9v+eUqOeahOWvhueivOmhnuWei+OAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93YXRjaExvZ2luIiBtc2dpZD0iNzM3NDc4MDcxMjY2NDI4NTMyMSI+Iuafpeeci+eZu+WFpeWYl+ippuiomOmMhCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2F0Y2hMb2dpbiIgbXNnaWQ9IjE5NjEyNTExNzk2MjQ4NDM0ODMiPiLnm6PoppbogIXnhKHms5XnmbvlhaXoo53nva7ln7fooYzpg6jliIbli5XkvZzjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfcmVzZXRQYXNzd29yZCIgbXNnaWQ9IjkwODQ3NzIwOTA3OTc0ODU0MjAiPiLph43oqK3lr4bnorwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3Jlc2V0UGFzc3dvcmQiIG1zZ2lkPSIzMzMyMTY3NjAwMzMxNzk5OTkxIj4i5by35Yi26YeN5paw6Kit5a6a5a+G56K844CC5oKo5b+F6aCI5Y+W5b6X5Lul566h55CG5ZOh5o+Q5L6b55qE5paw5a+G56K877yM5omN6IO955m75YWl44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2ZvcmNlTG9jayIgbXNnaWQ9IjU3NjA0NjYwMjUyNDc2MzQ0ODgiPiLlvLfliLbpjpblrpoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiLoo53nva7pjpblrprmmYLlj6/lj5blvpfmjqfliLbvvIzkvYblv4XpoIjph43mlrDovLjlhaXlr4bnorzjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4i5riF6Zmk5omA5pyJ6LOH5paZIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMjMxNDA2MDkzMzc5NjM5NjIwNSAtLT4gICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9Ijc2Njk4OTUzMzM4MTQyMjI1ODYiPiLph43oqK3ngrrljp/lu6DoqK3lrpogKOezu+e1seacg+WIqumZpOaJgOacieizh+aWme+8jOS4lOS4jeacg+WQkeaCqOmAsuihjOeiuuiqjSnjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IumHjeioreeCuuWOn+W7oOioreWumiAo57O757Wx5pyD5Yiq6Zmk5omA5pyJ6LOH5paZ77yM5LiU5LiN5pyD5ZCR5oKo6YCy6KGM56K66KqNKeOAgiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5IiBtc2dpZD0iNjM4NzQ5NzQ2NjY2MDE1NDkzMSI+IuioreWumuaUv+etluWVn+eUqOaZguaJgOimgeS9v+eUqOeahOijnee9ruWFqOWfnyBQcm94ee+8jOWPquacieesrOS4gOWAi+ijnee9rueuoeeQhuWToeaJgOioreWumueahOWFqOWfnyBQcm94eSDlhbfmnInmlYjlipvjgIIiPC9zdHJpbmc+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiLkvY/lrrbpm7voqbEiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiLooYzli5Xpm7voqbEiPC9pdGVtPgpAQCAtNTUyLDEwICs1MzgsOSBAQAogICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2lwQWRkcmVzc1R5cGVPdGhlciAoNDQwODQzNjE2Mjk1MDExOTg0OSkgLS0+CiAgICAgPHNraXAgLz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiLpgI/pgY4gPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPumAj+mBjuOAjDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+44CNIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4i6Ly45YWlIFBJTiDnorwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+Iui8uOWFpeWvhueivOWNs+WPr+ino+mOliI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4i6Ly45YWlIFBJTiDpgLLooYzop6PpjpYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJQSU4g56K86Yyv6Kqk77yBIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IuWmguimgeino+mOlu+8jOiri+aMiSBNZW51IOmNte+8jOeEtuW+jOaMiSAw44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Iue3iuaApembu+ipseiZn+eivCI8L3N0cmluZz4KQEAgLTU2OCw2ICs1NTMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiLov5Tlm57pgJroqbEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiLmraPnorrvvIEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4i5b6I5oqx5q2J77yM6KuL5YaN6Kmm5LiA5qyhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiLlvojmirHmrYnvvIzoq4vlho3oqabkuIDmrKEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLmraPlnKjlhYXpm7sgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IuWFhembu+WujOaIkOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTgyLDYgKzU2OCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0g5Y2h5bey6Y6W5a6a44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4i6Kej6Y6WIFNJTSDljaHkuK0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiLnlavlh7rop6PpjpblnJblvaLlt7LpjK/oqqQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4g5qyh44CCIlxuXG4iIOiri+WcqCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDnp5Llvozlho3lmJfoqabjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiLmgqjlt7IgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4g5qyh6Ly45YWl5LiN5q2j56K655qE5a+G56K844CCIlxuXG4i6KuL5pa8IDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IOenkuW+jOWGjeippuS4gOasoeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiLmgqjlt7IgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4g5qyh6Ly45YWl5LiN5q2j56K655qEIFBJTuOAgiJcblxuIuiri+aWvCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDnp5Llvozlho3oqabkuIDmrKHjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IueVq+WHuuino+mOluWcluW9ouW3sumMr+iqpCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiDmrKHjgILlho3pjK/oqqQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g5qyh5b6M77yM57O757Wx5pyD6KaB5rGC5L2/55SoIEdvb2dsZSDnmbvlhaXkvobop6PpjpbjgIIiXG5cbiIg6KuL5ZyoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IOenkuW+jOWGjeippuS4gOasoeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4g56eS5b6M5YaN6Kmm5LiA5qyh44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiLlv5joqJjop6PpjpblnJblvaLvvJ8iPC9zdHJpbmc+CkBAIC02MTAsMTQgKzU5OCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ianNfZGlhbG9nX2JlZm9yZV91bmxvYWQiIG1zZ2lkPSIxOTAxNjc1NDQ4MTc5NjUzMDg5Ij4i6Zui6ZaL5q2k6aCB77yfIlxuXG4iPHhsaWZmOmcgaWQ9Ik1FU1NBR0UiPiVzPC94bGlmZjpnPiJcblxuIiDpgbjlj5YgW+eiuuWuml0g6Zui6ZaL5q2k6aCB77yb5oiWIFvlj5bmtohdIOeVmeWcqOatpOmggeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbGFiZWwiIG1zZ2lkPSI2ODYwMjYxNzU4NjY1ODI1MDY5Ij4i56K66KqNIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZG91YmxlX3RhcF90b2FzdCIgbXNnaWQ9IjEwNjgyMTY5MzcyNDQ1NjcyNDciPiLmj5DnpLrvvJrovJXmjInlhankuIvlj6/mlL7lpKfnuK7lsI/jgIIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b2ZpbGxfdGhpc19mb3JtICg4OTQwMTEwODY2Nzc1MDk3NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjEyODQ4NDM3MjgyMDM0MTIxMzUiPiLoroDlj5bngI/opr3lmajnmoToqJjpjIToiIfmm7jnsaQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjQ5ODE0ODk4MTU0Njc2MTcxOTEiPiLlhYHoqLHmh4nnlKjnqIvlvI/oroDlj5bngI/opr3lmajmm77ntpPpgKDoqKrpgY7nmoTmiYDmnInntrLlnYDvvIzku6Xlj4rngI/opr3lmajnmoTmiYDmnInmm7jnsaTjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjkwMDk0MzQxMDk4MzYyODAzNzQiPiLlr6vlhaXngI/opr3lmajnmoToqJjpjIToiIfmm7jnsaQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI5NDU1NzE5OTAzNTcxMTQ5NTAiPiLlhYHoqLHmh4nnlKjnqIvlvI/kv67mlLnlhLLlrZjlnKjpm7voqbHkuIrnmoTngI/opr3oqJjpjITmiJbmm7jnsaTjgILoq4vms6jmhI/vvJrmg6HmhI/mh4nnlKjnqIvlvI/lj6/og73mnIPkvb/nlKjmraTpgbjpoIXkvobmuIXpmaTmiJbkv67mlLnmgqjngI/opr3lmajnmoTos4fmlpnjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRBbGFybSAoNTkyNDQwMTMyODgwMzYxNTE2NSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRBbGFybSAoNTk2Njk2NjU5ODE0OTg3NTA4MikgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVHZW9sb2NhdGlvblBlcm1pc3Npb25zIiBtc2dpZD0iNDcxNTIxMjY1NTU5ODI3NTUzMiI+IuS/ruaUueeAj+imveWZqOWcsOeQhuizh+ioiueahOasiumZkCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjQwMTE5MDgyODI5ODA4NjE2NzkiPiLlhYHoqLHmh4nnlKjnqIvlvI/kv67mlLnngI/opr3lmajnmoTlnLDnkIbkvY3nva7mrIrpmZDvvIzmg6HmhI/mh4nnlKjnqIvlvI/lj6/og73mnIPpgI/pgY7mraTmlrnlvI/lhYHoqLHlsIfmgqjnmoTkvY3nva7os4foqIrku7vmhI/lgrPpgIHntabmn5DkupvntrLnq5njgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiLmmK/lkKboqJjkvY/mraTlr4bnorzvvJ8iPC9zdHJpbmc+CkBAIC03MzAsMTQgKzcxNiwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IuWFqOmDqOmBuOWPliI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4i6YG45Y+W5a2X6KmeIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IuWJquS4iyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4i6KSH6KO9Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4i6LK85LiKIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiLopIfoo73ntrLlnYAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgbXNnaWQ9IjY3Mzg1NTYzNDg4NjEzNDcyNDAiPiLpgbjlj5bmloflrZcuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiIG1zZ2lkPSI1MjM2ODUwMzk0MzcwODIwMzU3Ij4i6YG45Y+W5paH5a2XIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4i6Ly45YWl5pa55byPIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IuWwh+OAjDx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz7jgI3mlrDlop7oh7PlrZflhbgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiLnt6jovK/mloflrZciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjQ5MDkxMzU1NjQ5NDE4MTU0OTQiPiLmloflrZfli5XkvZwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IuWEsuWtmOepuumWk+WNs+Wwh+S4jei2syI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IuaJi+apn+WEsuWtmOepuumWk+WNs+Wwh+S4jei2s+OAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+IueiuuWumiI8L3N0cmluZz4KQEAgLTc0NSw2ICs3MzEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+IueiuuWumiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IuWPlua2iCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiLms6jmhI8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+Iui8ieWFpeS4rS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4i6ZaL5ZWfIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4i6Zec6ZaJIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiLlrozmiJDmk43kvZzpnIDkvb/nlKgiPC9zdHJpbmc+CkBAIC03NjMsOSArNzUwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiLlvLfliLbpl5zplokiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBvcnQiIG1zZ2lkPSI0MDYwMjE4MjYwOTg0Nzk1NzA2Ij4i5Zue5aCxIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiLnrYnlvoUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiLmh4nnlKjnqIvlvI/lt7Lph43mlrDlsI7lkJEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+IuOAjDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz7jgI3nj77lnKjmraPlnKjln7fooYzjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+IuOAjDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz7jgI3ljp/lhYjlt7LllZ/li5XjgIIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4i5oeJ55So56iL5byPIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKOiZleeQhueoi+W6jyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIOW3sumBleWPjeWFtuiHquihjOW8t+WItuWvpuaWveeahOWatOagvOaooeW8jyAoU3RyaWN0TW9kZSkg5pS/562W44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4i6JmV55CG56iL5bqPIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiDlt7LpgZXlj43lhbboh6rooYzlvLfliLblr6bmlr3nmoTlmrTmoLzmqKHlvI8gKFN0cmljdE1vZGUpIOaUv+etluOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4g5Z+36KGM5LitIjwvc3RyaW5nPgpAQCAtODEyLDI4ICs4MDIsMjMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1zX3Nob3dfYWxsIiBtc2dpZD0iMjY3MTc5MTE2MzkzMzA5MTE4MCI+PGI+Iumhr+ekuuWFqOmDqCI8L2I+PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9hY3Rpdml0eV90aXRsZSIgbXNnaWQ9IjIzOTkyODk5OTk2MDg5MDA0NDMiPiJVU0Ig5aSn6YeP5YSy5a2Y6KOd572uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfdGl0bGUiIG1zZ2lkPSI1OTAxNDU5MDQxMzk4NzUxNDk1Ij4iVVNCIOW3sumAo+aOpSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDQ3OTY3NTk2NDYxNjcyNDcxNzggLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODIzMTQ2Mjc1MDAxMDA2Njg5NiI+IuW3sumAj+mBjiBVU0Ig6YCj5o6l5omL5qmf6IiH6Zu76IWm44CC5aaC6KaB5b6e6Zu76IWm5oiWIEFuZHJvaWQg57O757Wx55qEIFNEIOWNoeikh+ijveaqlOahiO+8jOiri+mBuOWPluS4i+aWueaMiemIleOAgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI0Nzk2NzU5NjQ2MTY3MjQ3MTc4Ij4i5bey6YCP6YGOIFVTQiDpgKPmjqXmiYvmqZ/oiIfpm7vohabjgILlpoLopoHlvp7pm7vohabmiJYgQW5kcm9pZCDns7vntbHnmoQgU0Qg5Y2h6KSH6KO95qqU5qGI77yM6KuL6YG45Y+W5LiL5pa55oyJ6YiV44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgbXNnaWQ9IjQ3OTY3NTk2NDYxNjcyNDcxNzgiPiLlt7LpgI/pgY4gVVNCIOmAo+aOpeaJi+apn+iIh+mbu+iFpuOAguWmguimgeW+numbu+iFpuaIliBBbmRyb2lkIOezu+e1seeahCBTRCDljaHopIfoo73mqpTmoYjvvIzoq4vpgbjlj5bkuIvmlrnmjInpiJXjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9idXR0b25fbW91bnQiIG1zZ2lkPSIxMDUyMjU5OTMwMzY5NTA4MjM1Ij4i6ZaL5ZWfIFVTQiDlhLLlrZjoo53nva4iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNTM0Nzg0NzUxNjAzMzQ1MzYzIC0tPiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQ4MTgzNDc3NTY0MDI3NDAyNjEiPiLmioogU0Qg5Y2h55W25oiQIFVTQiDlhLLlrZjoo53nva7mmYLnmbznlJ/llY/poYzjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMjUzNDc4NDc1MTYwMzM0NTM2MyI+IuaKiiBTRCDljaHnlbbmiJAgVVNCIOWEsuWtmOijnee9ruaZgueZvOeUn+WVj+mhjOOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIG1zZ2lkPSIyNTM0Nzg0NzUxNjAzMzQ1MzYzIj4i5oqKIFNEIOWNoeeVtuaIkCBVU0Ig5YSy5a2Y6KOd572u5pmC55m855Sf5ZWP6aGM44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODE3NTg5MjU1NDc1NzIxNjUyNSI+IlVTQiDlt7LpgKPmjqUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjczODAwODI0MDQyODgyMTkzNDEiPiLpgbjlj5bmraTpoIXlsIfmqpTmoYjopIfoo73liLDpm7vohabvvIzmiJblvp7pm7vohabopIfoo73jgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjIzMzYwNTgzOTY2NjM1MTYwMTciPiLpl5zplokgVVNCIOWEsuWtmOijnee9riI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNTkxODEzNDkwMjY5ODQxNTM5Ij4i6YG45Y+W5q2k6JmV6Zec6ZaJIFVTQiDlhLLlrZjoo53nva7jgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX3RpdGxlIiBtc2dpZD0iNjYwMTI5ODUxNzA4Nzc1ODUzIj4iVVNCIOWEsuWtmOepuumWk+S9v+eUqOS4rSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM2MTM3MTMzOTY0MjY2MDQxMDQgLS0+ICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NzQ1MzQ1MjYwNzgwMjY3MTg1Ij4i6Zec6ZaJIFVTQiDlhLLlrZjoo53nva7liY3vvIzoq4vli5nlv4XlhYjlsIcgQW5kcm9pZCDns7vntbHnmoQgU0Qg5Y2h5b6e6Zu76IWm5LiK5Y245LiLICjpgIDlh7op44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzYxMzcxMzM5NjQyNjYwNDEwNCI+IumXnOmWiSBVU0Ig5YSy5a2Y6KOd572u5YmN77yM6KuL5YuZ5b+F5YWI5bCHIEFuZHJvaWQg57O757Wx55qEIFNEIOWNoeW+numbu+iFpuS4iuWNuOS4iyAo6YCA5Ye6KeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfbWVzc2FnZSIgbXNnaWQ9IjM2MTM3MTMzOTY0MjY2MDQxMDQiPiLpl5zplokgVVNCIOWEsuWtmOijnee9ruWJje+8jOiri+WLmeW/heWFiOWwhyBBbmRyb2lkIOezu+e1seeahCBTRCDljaHlvp7pm7vohabkuIrljbjkuIsgKOmAgOWHuinjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjcwNjAyMTgwMzQ5MDA2OTYwMjkiPiLpl5zplokgVVNCIOWEsuWtmOijnee9riI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3BfZXJyb3JfbWVzc2FnZSIgbXNnaWQ9IjE0Mzg4MTkxNDg0MDQxMjEwOCI+IumXnOmWiSBVU0Ig5YSy5a2Y6KOd572u5pmC55m855Sf5ZWP6aGM44CC6KuL5qqi5p+l5oKo5piv5ZCm5bey5Y246LyJIFVTQiBIb3N077yM54S25b6M5YaN6Kmm5LiA5qyh44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2NvbmZpcm1fa2lsbF9zdG9yYWdlX3VzZXJzX3RpdGxlIiBtc2dpZD0iOTYzMDM5MDMzNDcwNDc4Njk3Ij4i6ZaL5ZWfIFVTQiDlhLLlrZjoo53nva4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfY29uZmlybV9raWxsX3N0b3JhZ2VfdXNlcnNfdGV4dCIgbXNnaWQ9IjMyMDI4MzgyMzQ3ODA1MDU4ODYiPiLlpoLmnpzmgqjplovllZ8gVVNCIOWEsuWtmOijnee9ru+8jOWJh+aCqOato+WcqOS9v+eUqOeahOafkOS6m+aHieeUqOeoi+W8j+acg+WBnOatoumBi+S9nO+8jOiAjOS4lOWPr+iDveeEoeazleS9v+eUqO+8jOW+heaCqOWwhyBVU0Ig5YSy5a2Y6KOd572u6Zec6ZaJ5omN5pyD5oGi5b6p5q2j5bi444CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGxnX2Vycm9yX3RpdGxlIiBtc2dpZD0iODA0ODk5OTk3MzgzNzMzOTE3NCI+IlVTQiDmk43kvZzlpLHmlZciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkbGdfb2siIG1zZ2lkPSI3Mzc2OTUzMTY3MDM5ODY1NzAxIj4i56K65a6aIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gODY2MzI0NzkyOTU1MTA5NTg1NCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjY1Nzc5MDgwMDY5NDk3NDIyMTciPiLlsIcgU0Qg5Y2h5qC85byP5YyWIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODY2MzI0NzkyOTU1MTA5NTg1NCI+IuWwhyBTRCDljaHmoLzlvI/ljJYiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzNjIxMzY5OTYyNDMzNTIzNjE5IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzNDcwODE1MTQwMDY4NTAyODI0Ij4i56K65a6a6KaB5bCHIFNEIOWNoeagvOW8j+WMluWXju+8n+ipsiBTRCDljaHkuK3nmoTmiYDmnInos4fmlpnlsIfmnIPpgbrlpLHjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM2MjEzNjk5NjI0MzM1MjM2MTkiPiLnorrlrpropoHlsIcgU0Qg5Y2h5qC85byP5YyW5ZeO77yf6KmyIFNEIOWNoeS4reeahOaJgOacieizh+aWmeWwh+acg+mBuuWkseOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF90aXRsZSIgbXNnaWQ9Ijg2NjMyNDc5Mjk1NTEwOTU4NTQiPiLlsIcgU0Qg5Y2h5qC85byP5YyWIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIG1zZ2lkPSIzNjIxMzY5OTYyNDMzNTIzNjE5Ij4i56K65a6a6KaB5bCHIFNEIOWNoeagvOW8j+WMluWXju+8n+ipsiBTRCDljaHkuK3nmoTmiYDmnInos4fmlpnlsIfmnIPpgbrlpLHjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfYnV0dG9uX2Zvcm1hdCIgbXNnaWQ9IjQxMzEwNjQ1NjAxMjc0Nzg2OTUiPiLmoLzlvI/ljJYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhZGJfYWN0aXZlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY3MjkwNDQ3Nzg5NDkxODk5MTgiPiJVU0Ig5YG16Yyv5qih5byP5bey5ZWf55SoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9Ijg0NzAyOTY4MTgyNzAxMTAzOTYiPiLpgbjlj5bku6XlgZznlKggVVNCIOWBtemMr+OAgiI8L3N0cmluZz4KQEAgLTg0MSwyOSArODI2LDE4IEBACiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9hbHBoYWJldCIgbXNnaWQ9IjU0MzMyNzU0ODU0OTkwMzkxOTkiPiIgQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYXN0X3Njcm9sbF9udW1lcmljX2FscGhhYmV0IiBtc2dpZD0iNDAzMDE3MDUyNDU5NTEyMzYxMCI+IiAwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYW5kaWRhdGVzX3N0eWxlIiBtc2dpZD0iNDMzMzkxMzA4OTYzNzA2MjI1NyI+PHU+IuW+hemBuOmgheebriI8L3U+PC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiA1NDU3NjAzNDE4OTcwOTk0MDUwIC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfY2hlY2tpbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjQyMzk1MTY2NzUwMjg0Mzg5OTciPiLmraPlnKjmupblgpkgU0Qg5Y2hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiLmraPlnKjmupblgpkgU0Qg5Y2hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjU0NTc2MDM0MTg5NzA5OTQwNTAiPiLmraPlnKjmupblgpkgU0Qg5Y2hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2NoZWNraW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iODI4NzMxOTg4MjkyNjczNzA1MyI+Iuato+WcqOaqouafpemMr+iqpOOAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc4MDQ3NzgzODI0MTIxMjk5NyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjM5MzczNDU1Nzc5ODM3MzA4NzMiPiJTRCDljaHngrrnqbrnmb0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI3ODA0Nzc4MzgyNDEyMTI5OTciPiJTRCDljaHngrrnqbrnmb0iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAxMzEyMjY2ODIwMDkyOTU4MDE0IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNjA2NjYwNzU2MTI0NjI5NzA4Ij4iU0Qg5Y2h54K656m655m95oiW5L2/55So5LiN5pSv5o+055qE5qqU5qGI57O757Wx44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzODE3NzA0MDg4MDI3ODI5MzgwIj4iU0Qg5Y2h5YWn54Sh5qqU5qGI57O757Wx77yM5oiW5qqU5qGI57O757Wx5LiN5Y+X5pSv5o+044CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjQxMDcyMzkwNjAxOTEwMDE4OSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxNzI0NjE5OTAyMDc2NTI4ODg5Ij4iU0Qg5Y2h5bey5pCN5aOeIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY0MTA3MjM5MDYwMTkxMDAxODkiPiJTRCDljaHlt7LmkI3lo54iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAyNjc5NDEyODg0MjkwMDYxNzc1IC0tPiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjQ2MDMxMTgzNTEzMDY3MTE5NCI+IlNEIOWNoeW3suaQjeWjnuOAguaCqOWPr+iDvemcgOimgeWwhyBTRCDljaHph43mlrDmoLzlvI/ljJbjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2OTAyNTMxNzc1OTQ4MjM4OTg5Ij4iU0Qg5Y2h5bey5q+A5pCN77yM5oKo5Y+v6IO95b+F6aCI5LqI5Lul6YeN5paw5qC85byP5YyW44CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjg3MjE1Mjg4MjYwNDQwNzgzNyAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjI1ODIxNzUwMTYwNjA0MzIwMzQiPiJTRCDljaHmnKrmraPluLjnp7vpmaQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2ODcyMTUyODgyNjA0NDA3ODM3Ij4iU0Qg5Y2h5pyq5q2j5bi456e76ZmkIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNzI2MDE4MzI5Mzc0NzQ0ODI0MSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX2JhZHJlbW92YWxfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjAwNTM5NjQ2NDQ5NDY0ODkzNyI+Iuiri+WFiOWNuOi8iSBTRCDljaHvvIzlho3lsIflhbbnp7vpmaTvvIzku6XlhY3os4fmlpnpgbrlpLHjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiLoq4vlhYjljbjovIkgU0Qg5Y2h77yM5YaN5bCH5YW256e76Zmk77yM5Lul5YWN6LOH5paZ6YG65aSx44CCIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNjcyOTgwMTEzMDc5MDYxNjIwMCAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzY1MjU4ODEwMTg2Nzk1MTUiPiLlj6/lronlhajnp7vpmaQgU0Qg5Y2hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4i5Y+v5a6J5YWo56e76ZmkIFNEIOWNoSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDc2MTM5NjA2ODY3NDc1OTI3NzAgLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNzUwMzc2OTEwNjI4NTE4ODcwMyI+IuePvuWcqOWPr+S7peWuieWFqOenu+mZpCBTRCDljaHjgIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfc2FmZV91bm1vdW50X25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTY4ODQxMjc4MTM4Mzc3NjA0Ij4i5oKo54++5Zyo5Y+v5Lul5a6J5YWo5Zyw56e76ZmkIFNEIOWNoeOAgiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDg5MDI1MTgwMzA0MDQzODEzMTggLS0+ICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIxODc0ODg5NzY0MzY3MDg1NTYyIj4i5bey56e76ZmkIFNEIOWNoSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub21lZGlhX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg5MDI1MTgwMzA0MDQzODEzMTgiPiLlt7Lnp7vpmaQgU0Qg5Y2hIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gNDIwNTExNzIyNzM0MjgyMjI3NSAtLT4gICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMjczMDg5MDQ0MTMzMTM0NDc3NiI+IuW3suenu+mZpCBTRCDljaHjgILoq4vmj5LlhaXmlrDnmoQgU0Qg5Y2h5L6G5aKe5Yqg6KOd572u55qE5YSy5a2Y5a656YeP44CCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzODcwMTIwNjUyOTgzNjU5NjQxIj4iU0Qg5Y2h5bey56e76Zmk77yM6KuL5o+S5YWl5paw55qEIFNEIOWNoeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IlNEIOWNoeeCuuepuueZvSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzgxNzcwNDA4ODAyNzgyOTM4MCI+IlNEIOWNoeWFp+eEoeaqlOahiOezu+e1se+8jOaIluaqlOahiOezu+e1seS4jeWPl+aUr+aPtOOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV91bm1vdW50YWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NDEwNzIzOTA2MDE5MTAwMTg5Ij4iU0Qg5Y2h5bey5pCN5aOeIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjkwMjUzMTc3NTk0ODIzODk4OSI+IlNEIOWNoeW3suavgOaQje+8jOaCqOWPr+iDveW/hemgiOS6iOS7pemHjeaWsOagvOW8j+WMluOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9iYWRyZW1vdmFsX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjY4NzIxNTI4ODI2MDQ0MDc4MzciPiJTRCDljaHmnKrmraPluLjnp7vpmaQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfYmFkcmVtb3ZhbF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjcyNjAxODMyOTM3NDc0NDgyNDEiPiLoq4vlhYjljbjovIkgU0Qg5Y2h77yM5YaN5bCH5YW256e76Zmk77yM5Lul5YWN6LOH5paZ6YG65aSx44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3NhZmVfdW5tb3VudF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2NzI5ODAxMTMwNzkwNjE2MjAwIj4i5Y+v5a6J5YWo56e76ZmkIFNEIOWNoSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9zYWZlX3VubW91bnRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI1Njg4NDEyNzgxMzgzNzc2MDQiPiLmgqjnj77lnKjlj6/ku6XlronlhajlnLDnp7vpmaQgU0Qg5Y2h44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vbWVkaWFfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iODkwMjUxODAzMDQwNDM4MTMxOCI+IuW3suenu+mZpCBTRCDljaEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9tZWRpYV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjM4NzAxMjA2NTI5ODM2NTk2NDEiPiJTRCDljaHlt7Lnp7vpmaTvvIzoq4vmj5LlhaXmlrDnmoQgU0Qg5Y2h44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfbGlzdF9lbXB0eSIgbXNnaWQ9IjQxNjg4MjA2MDk0MDMzODU3ODkiPiLmib7kuI3liLDnrKblkIjnmoTmtLvli5UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BrZ1VzYWdlU3RhdHMiIG1zZ2lkPSI4Nzg3MzUyMDc0MzI2NzQ4ODkyIj4i5pu05paw5YWD5Lu25L2/55So57Wx6KiI6LOH5paZIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9Ijg5MTU1MzY5NTcxNjc1MjgzNSI+IuWFgeioseS/ruaUueaUtumbhuWIsOeahOWFg+S7tuS9v+eUqOe1seioiOizh+aWmeOAguS4gOiIrOaHieeUqOeoi+W8j+S4jeacg+S9v+eUqOatpOWKn+iDveOAgiI8L3N0cmluZz4KQEAgLTg5OCwxNSArODcyLDI0IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4i5o6h55So6aCQ5YWI5YWx55So6YeR6ZGw55qEIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IuaOoeeUqOaGkeitieeahCBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IumBuOaTh+aqlOahiCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IuacqumBuOaTh+S7u+S9leaqlOahiCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IumHjeiorSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiLmj5DkuqQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+IuaIkeeahOacgOaEmyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IuW3suWVn+eUqOi7iueUqOaooeW8jyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiLpgbjlj5bntZDmnZ/ou4rnlKjmqKHlvI/jgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4i5pW45pOa6YCj57ea5oiW54Sh57ea5Z+65Zyw5Y+w5bey5ZWf55SoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4i6LyV6Ke45Lul6Kit5a6aIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4i6L+U5ZueIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4i57m857qMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4i55Wl6YGOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4i6auY6KGM5YuV6LOH5paZ55So6YePIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiLovJXop7jljbPlj6/nnq3op6Pmm7TlpJrmnInpl5zooYzli5Xos4fmlpnnlKjph4/nmoToqbPntLDos4foqIoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IuW3sumBlOihjOWLleizh+aWmeS4iumZkCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjQ3MTIzNjk4NTY2MDEyNzUxNDYiPiLovJXop7jljbPlj6/nnq3op6Pmm7TlpJrmnInpl5zooYzli5Xos4fmlpnnlKjph4/nmoToqbPntLDos4foqIoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19tYXRjaGVzIiBtc2dpZD0iODEyOTQyMTkwODkxNTg0MDczNyI+IuaykuacieebuOespumgheebriI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZpbmRfb25fcGFnZSIgbXNnaWQ9IjE5NDY3OTkyMzM4MjI4MjAzODQiPiLlnKjpoIHpnaLkuK3lsIvmib4iPC9zdHJpbmc+CisgIDxwbHVyYWxzIG5hbWU9Im1hdGNoZXNfZm91bmQiPgorICAgIDxpdGVtIHF1YW50aXR5PSJvbmUiIG1zZ2lkPSI4MTY3MTQ3MDgxMTM2NTc5NDM5Ij4iMSDlgIvnm7jnrKbpoIXnm64iPC9pdGVtPgorICAgIDxpdGVtIHF1YW50aXR5PSJvdGhlciIgbXNnaWQ9IjQ2NDE4NzI3OTcwNjc2MDkxNzciPiLnrKwgPHhsaWZmOmcgaWQ9IklOREVYIj4lZDwveGxpZmY6Zz4g5YCL55u456ym6aCF55uuICjlhbEgPHhsaWZmOmcgaWQ9IlRPVEFMIj4lZDwveGxpZmY6Zz4g5YCL55u456ym6aCF55uuKSI8L2l0ZW0+CisgIDwvcGx1cmFscz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9hcnJheXMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9hcnJheXMueG1sCmluZGV4IGEzMzg1MWMuLjgzMGZiMDEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXJyYXlzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2FycmF5cy54bWwKQEAgLTEwMyw0ICsxMDMsMTYgQEAKICAgICAgICAgPGl0ZW0+MzwvaXRlbT4KICAgICA8L2ludGVnZXItYXJyYXk+CiAKKyAgICA8IS0tIFVzZWQgaW4gTG9jYWxlUGlja2VyIC0tPgorICAgIDxzdHJpbmctYXJyYXkgdHJhbnNsYXRhYmxlPSJmYWxzZSIgbmFtZT0ic3BlY2lhbF9sb2NhbGVfY29kZXMiPgorICAgICAgICA8aXRlbT56aF9DTjwvaXRlbT4KKyAgICAgICAgPGl0ZW0+emhfVFc8L2l0ZW0+CisgICAgPC9zdHJpbmctYXJyYXk+CisKKyAgICA8IS0tIFVzZWQgaW4gTG9jYWxlUGlja2VyIC0tPgorICAgIDxzdHJpbmctYXJyYXkgdHJhbnNsYXRhYmxlPSJmYWxzZSIgbmFtZT0ic3BlY2lhbF9sb2NhbGVfbmFtZXMiPgorICAgICAgICA8aXRlbT7kuK3mlocgKOeugOS9kyk8L2l0ZW0+CisgICAgICAgIDxpdGVtPuS4reaWhyAo57mB6auUKTwvaXRlbT4KKyAgICA8L3N0cmluZy1hcnJheT4KKwogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCmluZGV4IDZmMGNlNzEuLjMzZDNlZWIgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCkBAIC0xNCw4ICsxNCw4IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiAKLTwhLS0gRm9ybWF0dGluZyBub3RlOiB0ZXJtaW5hdGUgYWxsIGNvbW1lbnRzIHdpdGggYSBwZXJpb2QsIHRvIGF2b2lkIGJyZWFraW5nIAotICAgICB0aGUgZG9jdW1lbnRhdGlvbiBvdXRwdXQuIFRvIHN1cHByZXNzIGNvbW1lbnQgbGluZXMgZnJvbSB0aGUgZG9jdW1lbnRhdGlvbiAKKzwhLS0gRm9ybWF0dGluZyBub3RlOiB0ZXJtaW5hdGUgYWxsIGNvbW1lbnRzIHdpdGggYSBwZXJpb2QsIHRvIGF2b2lkIGJyZWFraW5nCisgICAgIHRoZSBkb2N1bWVudGF0aW9uIG91dHB1dC4gVG8gc3VwcHJlc3MgY29tbWVudCBsaW5lcyBmcm9tIHRoZSBkb2N1bWVudGF0aW9uCiAgICAgIG91dHB1dCwgaW5zZXJ0IGFuIGVhdC1jb21tZW50IGVsZW1lbnQgYWZ0ZXIgdGhlIGNvbW1lbnQgbGluZXMuCiAtLT4KIApAQCAtNDYsNiArNDYsNyBAQAogICAgICAgICAgICAgIHRoZW1lIGRvZXMgbm90IHNldCB0aGlzIHZhbHVlLCBtZWFuaW5nIGl0IGlzIGJhc2VkIG9uIHdoZXRoZXIgdGhlCiAgICAgICAgICAgICAgd2luZG93IGlzIGZsb2F0aW5nLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iYmFja2dyb3VuZERpbUVuYWJsZWQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKyAgICAgICAgCiAKICAgICAgICAgPCEtLSA9PT09PT09PT09PSAtLT4KICAgICAgICAgPCEtLSBUZXh0IHN0eWxlcyAtLT4KQEAgLTk1LDYgKzk2LDE1IEBACiAKICAgICAgICAgPCEtLSBUZXh0IGNvbG9yIGZvciB1cmxzIGluIHNlYXJjaCBzdWdnZXN0aW9ucywgdXNlZCBieSB0aGluZ3MgbGlrZSBnbG9iYWwgc2VhcmNoIGFuZCB0aGUgYnJvd3Nlci4gQGhpZGUgLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InRleHRDb2xvclNlYXJjaFVybCIgZm9ybWF0PSJyZWZlcmVuY2V8Y29sb3IiIC8+CisKKyAgICAgICAgPCEtLSBDb2xvciBvZiBoaWdobGlnaHRlZCB0ZXh0LCB3aGVuIHVzZWQgaW4gYSBsaWdodCB0aGVtZS4gQGhpZGUgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRleHRDb2xvckhpZ2hsaWdodEludmVyc2UiIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgorICAgICAgICA8IS0tIENvbG9yIG9mIGxpbmsgdGV4dCAoVVJMcyksIHdoZW4gdXNlZCBpbiBhIGxpZ2h0IHRoZW1lLiBAaGlkZSAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idGV4dENvbG9yTGlua0ludmVyc2UiIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgorCisgICAgICAgIDwhLS0gQ29sb3Igb2YgbGlzdCBpdGVtIHRleHQgaW4gYWxlcnQgZGlhbG9ncy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRleHRDb2xvckFsZXJ0RGlhbG9nTGlzdEl0ZW0iIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgorICAgICAgICAKICAgICAgICAgPCEtLSBTZWFyY2ggd2lkZ2V0IG1vcmUgY29ycHVzIHJlc3VsdCBpdGVtIGJhY2tncm91bmQuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzZWFyY2hXaWRnZXRDb3JwdXNJdGVtQmFja2dyb3VuZCIgZm9ybWF0PSJyZWZlcmVuY2V8Y29sb3IiIC8+CiAKQEAgLTExNywxMCArMTI3LDIwIEBACiAgICAgICAgIDwhLS0gVGV4dCBjb2xvciwgdHlwZWZhY2UsIHNpemUsIGFuZCBzdHlsZSBmb3Igc3lzdGVtIHNlYXJjaCByZXN1bHQgc3VidGl0bGUuIERlZmF1bHRzIHRvIHByaW1hcnkgaW52ZXJzZSB0ZXh0IGNvbG9yLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0idGV4dEFwcGVhcmFuY2VTZWFyY2hSZXN1bHRTdWJ0aXRsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAKLQogICAgICAgICA8IS0tIFRleHQgY29sb3IsIHR5cGVmYWNlLCBzaXplLCBhbmQgc3R5bGUgZm9yIHRoZSB0ZXh0IGluc2lkZSBvZiBhIGJ1dHRvbi4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InRleHRBcHBlYXJhbmNlQnV0dG9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KIAorICAgICAgICA8IS0tIFRleHQgY29sb3IsIHR5cGVmYWNlLCBzaXplLCBhbmQgc3R5bGUgZm9yIHRoZSB0ZXh0IGluc2lkZSBvZiBhIHBvcHVwIG1lbnUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0ZXh0QXBwZWFyYW5jZUxhcmdlUG9wdXBNZW51IiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKworICAgICAgICA8IS0tIFRleHQgY29sb3IsIHR5cGVmYWNlLCBzaXplLCBhbmQgc3R5bGUgZm9yIHNtYWxsIHRleHQgaW5zaWRlIG9mIGEgcG9wdXAgbWVudS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRleHRBcHBlYXJhbmNlU21hbGxQb3B1cE1lbnUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorCisgICAgICAgIDwhLS0gRWRpdFRleHQgdGV4dCBmb3JlZ3JvdW5kIGNvbG9yLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZWRpdFRleHRDb2xvciIgZm9ybWF0PSJyZWZlcmVuY2V8Y29sb3IiIC8+CisgICAgICAgIDwhLS0gRWRpdFRleHQgYmFja2dyb3VuZCBkcmF3YWJsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImVkaXRUZXh0QmFja2dyb3VuZCIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisKICAgICAgICAgPCEtLSBBIHN0eWxlZCBzdHJpbmcsIHNwZWNpZnlpbmcgdGhlIHN0eWxlIHRvIGJlIHVzZWQgZm9yIHNob3dpbmcKICAgICAgICAgICAgICBpbmxpbmUgY2FuZGlkYXRlIHRleHQgd2hlbiBjb21wb3Npbmcgd2l0aCBhbiBpbnB1dCBtZXRob2QuICBUaGUKICAgICAgICAgICAgICB0ZXh0IGl0c2VsZiB3aWxsIGJlIGlnbm9yZWQsIGJ1dCB0aGUgc3R5bGUgc3BhbnMgd2lsbCBiZSBhcHBsaWVkCkBAIC0xMzcsNiArMTU3LDEyIEBACiAgICAgICAgIDwhLS0gRHJhd2FibGUgdG8gdXNlIGZvciBzaW5nbGUgY2hvaWNlIGluZGljYXRvcnMuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJsaXN0Q2hvaWNlSW5kaWNhdG9yU2luZ2xlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KIAorICAgICAgICA8IS0tIERyYXdhYmxlIHVzZWQgYXMgYSBiYWNrZ3JvdW5kIGZvciBzZWxlY3RlZCBsaXN0IGl0ZW1zLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ibGlzdENob2ljZUJhY2tncm91bmRJbmRpY2F0b3IiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorCisgICAgICAgIDwhLS0gRHJhd2FibGUgdXNlZCBhcyBhIGJhY2tncm91bmQgZm9yIGFjdGl2YXRlZCBpdGVtcy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGl2YXRlZEJhY2tncm91bmRJbmRpY2F0b3IiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorCiAgICAgICAgIDwhLS0gPT09PT09PT09PT09PSAtLT4KICAgICAgICAgPCEtLSBCdXR0b24gc3R5bGVzIC0tPgogICAgICAgICA8IS0tID09PT09PT09PT09PT0gLS0+CkBAIC0xNzQsNiArMjAwLDggQEAKICAgICAgICAgPCEtLSBUaGUgbGlzdCBpdGVtIGhlaWdodCBmb3Igc2VhcmNoIHJlc3VsdHMuIEBoaWRlIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzZWFyY2hSZXN1bHRMaXN0SXRlbUhlaWdodCIgZm9ybWF0PSJkaW1lbnNpb24iIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9Imxpc3REaXZpZGVyIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBUaGUgbGlzdCBkaXZpZGVyIHVzZWQgaW4gYWxlcnQgZGlhbG9ncy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Imxpc3REaXZpZGVyQWxlcnREaWFsb2ciIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgICAgICA8IS0tIFRleHRWaWV3IHN0eWxlIGZvciBsaXN0IHNlcGFyYXRvcnMuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJsaXN0U2VwYXJhdG9yVGV4dFZpZXdTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgICAgIDwhLS0gVGhlIHByZWZlcnJlZCBsZWZ0IHBhZGRpbmcgZm9yIGFuIGV4cGFuZGFibGUgbGlzdCBpdGVtIChmb3IgY2hpbGQtc3BlY2lmaWMgbGF5b3V0cywKQEAgLTI0NCw2ICsyNzIsMTkgQEAKICAgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC5SLnN0eWxlYWJsZSNXaW5kb3dBbmltYXRpb259LiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QW5pbWF0aW9uU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogCisgICAgICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyB3aW5kb3cgc2hvdWxkIGhhdmUgYW4gQWN0aW9uIEJhcgorICAgICAgICAgICAgIGluIHBsYWNlIG9mIHRoZSB1c3VhbCB0aXRsZSBiYXIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBY3Rpb25CYXIiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKworICAgICAgICA8IS0tIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgd2luZG93J3MgQWN0aW9uIEJhciBzaG91bGQgb3ZlcmxheQorICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGNvbnRlbnQuIERvZXMgbm90aGluZyBpZiB0aGUgd2luZG93IHdvdWxkIG5vdAorICAgICAgICAgICAgIGhhdmUgYW4gQWN0aW9uIEJhci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd0FjdGlvbkJhck92ZXJsYXkiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKworICAgICAgICA8IS0tIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGFjdGlvbiBtb2RlcyBzaG91bGQgb3ZlcmxheSB3aW5kb3cgY29udGVudAorICAgICAgICAgICAgIHdoZW4gdGhlcmUgaXMgbm90IHJlc2VydmVkIHNwYWNlIGZvciB0aGVpciBVSSAoc3VjaCBhcyBhbiBBY3Rpb24gQmFyKS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd0FjdGlvbk1vZGVPdmVybGF5IiBmb3JtYXQ9ImJvb2xlYW4iIC8+CisKICAgICAgICAgPCEtLSBEZWZpbmVzIHRoZSBkZWZhdWx0IHNvZnQgaW5wdXQgc3RhdGUgdGhhdCB0aGlzIHdpbmRvdyB3b3VsZAogICAgICAgICAgICAgIGxpa2Ugd2hlbiBpdCBpcyBkaXNwbGF5ZWQuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dTb2Z0SW5wdXRNb2RlIj4KQEAgLTM5MCw2ICs0MzEsMTIgQEAKICAgICAgICAgPGF0dHIgbmFtZT0iaG9yaXpvbnRhbFNjcm9sbFZpZXdTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgICAgIDwhLS0gRGVmYXVsdCBTcGlubmVyIHN0eWxlLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic3Bpbm5lclN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IGRyb3Bkb3duIFNwaW5uZXIgc3R5bGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93blNwaW5uZXJTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gRGVmYXVsdCBBY3Rpb25CYXIgZHJvcGRvd24gc3R5bGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25Ecm9wRG93blN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IGFjdGlvbiBidXR0b24gc3R5bGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25CdXR0b25TdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgICAgIDwhLS0gRGVmYXVsdCBTdGFyIHN0eWxlLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic3RhclN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICAgICAgPCEtLSBEZWZhdWx0IFRhYldpZGdldCBzdHlsZS4gLS0+CkBAIC00MjcsNiArNDc0LDQxIEBACiAgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGEgc3R5bGUgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSB3aW5kb3cgY29udGFpbmluZyBhIHRleHQKICAgICAgICAgICAgICBzZWxlY3Rpb24gYW5jaG9yLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0idGV4dFNlbGVjdEhhbmRsZVdpbmRvd1N0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IExpc3RQb3B1cFdpbmRvdyBzdHlsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Imxpc3RQb3B1cFdpbmRvd1N0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IFBvcHVwTWVudSBzdHlsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InBvcHVwTWVudVN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKworICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgICAgIDwhLS0gQWN0aW9uIGJhciBzdHlsZXMgICAtLT4KKyAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09IC0tPgorICAgICAgICA8ZWF0LWNvbW1lbnQgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IGFtb3VudCBvZiBwYWRkaW5nIHRvIHVzZSBiZXR3ZWVuIGFjdGlvbiBidXR0b25zLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uQnV0dG9uUGFkZGluZyIgZm9ybWF0PSJkaW1lbnNpb24iIC8+CisgICAgICAgIDwhLS0gRGVmYXVsdCBzdHlsZSBmb3IgdGFicyB3aXRoaW4gYW4gYWN0aW9uIGJhciAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uQmFyVGFiU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25CYXJUYWJCYXJTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbkJhclRhYlRleHRTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbk92ZXJmbG93QnV0dG9uU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIFJlZmVyZW5jZSB0byBhIHN0eWxlIGZvciB0aGUgQWN0aW9uIEJhciAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uQmFyU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIFNpemUgb2YgdGhlIEFjdGlvbiBCYXIsIGluY2x1ZGluZyB0aGUgY29udGV4dHVhbAorICAgICAgICAgICAgIGJhciB1c2VkIHRvIHByZXNlbnQgQWN0aW9uIE1vZGVzLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uQmFyU2l6ZSIgZm9ybWF0PSJkaW1lbnNpb24iID4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9IndyYXBfY29udGVudCIgdmFsdWU9IjAiIC8+CisgICAgICAgIDwvYXR0cj4KKworCisgICAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICAgICAgPCEtLSBBY3Rpb24gbW9kZSBzdHlsZXMgIC0tPgorICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgICAgIDxlYXQtY29tbWVudCAvPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25Nb2RlU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25Nb2RlQ2xvc2VCdXR0b25TdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gQmFja2dyb3VuZCBkcmF3YWJsZSB0byB1c2UgZm9yIGFjdGlvbiBtb2RlIFVJIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25Nb2RlQmFja2dyb3VuZCIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gRHJhd2FibGUgdG8gdXNlIGZvciB0aGUgY2xvc2UgYWN0aW9uIG1vZGUgYnV0dG9uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25Nb2RlQ2xvc2VEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAKICAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09IC0tPgogICAgICAgICA8IS0tIFByZWZlcmVuY2Ugc3R5bGVzICAgLS0+CkBAIC05ODEsNiArMTA2Myw5IEBACiAgICAgICAgIDxhdHRyIG5hbWU9InRleHRDb2xvciIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iYmFja2dyb3VuZERpbUVuYWJsZWQiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImJhY2tncm91bmREaW1BbW91bnQiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd0FjdGlvbkJhciIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QWN0aW9uTW9kZU92ZXJsYXkiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd0FjdGlvbkJhck92ZXJsYXkiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAogICAgIDwhLS0gVGhlIHNldCBvZiBhdHRyaWJ1dGVzIHRoYXQgZGVzY3JpYmUgYSBBbGVydERpYWxvZydzIHRoZW1lLiAtLT4KQEAgLTk5Nyw2ICsxMDgyLDE4IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImNlbnRlck1lZGl1bSIgZm9ybWF0PSJyZWZlcmVuY2V8Y29sb3IiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAorICAgIDwhLS0gRnJhZ21lbnQgYW5pbWF0aW9uIGNsYXNzIGF0dHJpYnV0ZXMuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJGcmFnbWVudEFuaW1hdGlvbiI+CisgICAgICAgIDxhdHRyIG5hbWU9ImZyYWdtZW50T3BlbkVudGVyQW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0iZnJhZ21lbnRPcGVuRXhpdEFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImZyYWdtZW50Q2xvc2VFbnRlckFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImZyYWdtZW50Q2xvc2VFeGl0QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0iZnJhZ21lbnROZXh0RW50ZXJBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJmcmFnbWVudE5leHRFeGl0QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0iZnJhZ21lbnRQcmV2RW50ZXJBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJmcmFnbWVudFByZXZFeGl0QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiAgICAgPCEtLSBXaW5kb3cgYW5pbWF0aW9uIGNsYXNzIGF0dHJpYnV0ZXMuIC0tPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJXaW5kb3dBbmltYXRpb24iPgogICAgICAgICA8IS0tIFRoZSBhbmltYXRpb24gdXNlZCB3aGVuIGEgd2luZG93IGlzIGJlaW5nIGFkZGVkLiAtLT4KQEAgLTEwMDcsNyArMTEwNCw3IEBACiAgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd1Nob3dBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgICAgICA8IS0tIFRoZSBhbmltYXRpb24gdXNlZCB3aGVuIGEgd2luZG93IGlzIGdvaW5nIGZyb20gVklTSUJMRSB0byBJTlZJU0lCTEUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dIaWRlQW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgCisKICAgICAgICAgPCEtLSAgV2hlbiBvcGVuaW5nIGEgbmV3IGFjdGl2aXR5LCB0aGlzIGlzIHRoZSBhbmltYXRpb24gdGhhdCBpcwogICAgICAgICAgICAgICBydW4gb24gdGhlIG5leHQgYWN0aXZpdHkgKHdoaWNoIGlzIGVudGVyaW5nIHRoZSBzY3JlZW4pLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iYWN0aXZpdHlPcGVuRW50ZXJBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgpAQCAtMTA0OCw3ICsxMTQ1LDcgQEAKICAgICAgICAgICAgICAgYW5pbWF0aW9uIHRoYXQgaXMgcnVuIG9uIHRoZSB0b3AgYWN0aXZpdHkgb2YgdGhlIGN1cnJlbnQgdGFzawogICAgICAgICAgICAgICAod2hpY2ggaXMgZXhpdGluZyB0aGUgc2NyZWVuKS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InRhc2tUb0JhY2tFeGl0QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgCisKICAgICAgICAgPCEtLSAgV2hlbiBvcGVuaW5nIGEgbmV3IGFjdGl2aXR5IHRoYXQgc2hvd3MgdGhlIHdhbGxwYXBlciwgd2hpbGUKICAgICAgICAgICAgICAgY3VycmVudGx5IG5vdCBzaG93aW5nIHRoZSB3YWxscGFwZXIsIHRoaXMgaXMgdGhlIGFuaW1hdGlvbiB0aGF0CiAgICAgICAgICAgICAgIGlzIHJ1biBvbiB0aGUgbmV3IHdhbGxwYXBlciBhY3Rpdml0eSAod2hpY2ggaXMgZW50ZXJpbmcgdGhlIHNjcmVlbikuIC0tPgpAQCAtMTA2NSw3ICsxMTYyLDcgQEAKICAgICAgICAgICAgICAgY3VycmVudGx5IHNob3dpbmcgdGhlIHdhbGxwYXBlciwgdGhpcyBpcyB0aGUgYW5pbWF0aW9uIHRoYXQKICAgICAgICAgICAgICAgaXMgcnVuIG9uIHRoZSBvbGQgd2FsbHBhcGVyIGFjdGl2aXR5ICh3aGljaCBpcyBleGl0aW5nIHRoZSBzY3JlZW4pLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0id2FsbHBhcGVyQ2xvc2VFeGl0QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgCisKICAgICAgICAgPCEtLSAgV2hlbiBvcGVuaW5nIGEgbmV3IGFjdGl2aXR5IHRoYXQgaXMgb24gdG9wIG9mIHRoZSB3YWxscGFwZXIKICAgICAgICAgICAgICAgd2hlbiB0aGUgY3VycmVudCBhY3Rpdml0eSBpcyBhbHNvIG9uIHRvcCBvZiB0aGUgd2FsbHBhcGVyLAogICAgICAgICAgICAgICB0aGlzIGlzIHRoZSBhbmltYXRpb24gdGhhdCBpcyBydW4gb24gdGhlIG5ldyBhY3Rpdml0eQpAQCAtMTM1MCwyNSArMTQ0NywxNyBAQAogICAgICAgICAgICAgIDxjb2RlPnB1YmxpYyB2b2lkIHNheUhlbGxvKFZpZXcgdik8L2NvZGU+IG1ldGhvZCBvZiB5b3VyIGNvbnRleHQKICAgICAgICAgICAgICAodHlwaWNhbGx5LCB5b3VyIEFjdGl2aXR5KS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9Im9uQ2xpY2siIGZvcm1hdD0ic3RyaW5nIiAvPgotCi0gICAgICAgIDwhLS0gRGVmaW5lcyBvdmVyc2Nyb2xsaW5nIGJlaGF2aW9yLiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgb25seSBpZiB0aGUKLSAgICAgICAgICAgICBWaWV3IGlzIHNjcm9sbGFibGUuIE92ZXJzY3JvbGxpbmcgaXMgdGhlIGFiaWxpdHkgZm9yIHRoZSB1c2VyIHRvCi0gICAgICAgICAgICAgc2Nyb2xsIGEgVmlldyBiZXlvbmQgaXRzIGNvbnRlbnQgYm91bmRhcmllcyBpbnRvIGVtcHR5IHNwYWNlLiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ib3ZlcnNjcm9sbE1vZGUiPgotICAgICAgICAgICAgPCEtLSBBbHdheXMgYWxsb3cgdGhlIHVzZXIgdG8gb3ZlcnNjcm9sbCB0aGUgY29udGVudC4gLS0+Ci0gICAgICAgICAgICA8ZW51bSBuYW1lPSJhbHdheXMiIHZhbHVlPSIwIiAvPgotICAgICAgICAgICAgPCEtLSBPbmx5IGFsbG93IHRoZSB1c2VyIHRvIG92ZXJzY3JvbGwgY29udGVudCBpZiB0aGUgY29udGVudCBpcyBsYXJnZQotICAgICAgICAgICAgICAgICBlbm91Z2ggdG8gbWVhbmluZ2Z1bGx5IHNjcm9sbC4gLS0+Ci0gICAgICAgICAgICA8ZW51bSBuYW1lPSJpZkNvbnRlbnRTY3JvbGxzIiB2YWx1ZT0iMSIgLz4KLSAgICAgICAgICAgIDwhLS0gTmV2ZXIgb3ZlcnNjcm9sbC4gLS0+Ci0gICAgICAgICAgICA8ZW51bSBuYW1lPSJuZXZlciIgdmFsdWU9IjIiIC8+Ci0gICAgICAgIDwvYXR0cj4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiAgICAgPCEtLSBBdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBhIHtAbGluayBhbmRyb2lkLnZpZXcuVmlld0dyb3VwfSBvciBhbnkKICAgICAgICAgIG9mIGl0cyBzdWJjbGFzc2VzLiAgQWxzbyBzZWUge0BsaW5rICNWaWV3R3JvdXBfTGF5b3V0fSBmb3IKICAgICAgICAgIGF0dHJpYnV0ZXMgdGhhdCB0aGlzIGNsYXNzIHByb2Nlc3NlcyBpbiBpdHMgY2hpbGRyZW4uIC0tPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJWaWV3R3JvdXAiPgorICAgICAgICA8IS0tIERlZmluZXMgd2hldGhlciBjaGFuZ2VzIGluIGxheW91dCAoY2F1c2VkIGJ5IGFkZGluZyBhbmQgcmVtb3ZpbmcgaXRlbXMpIHNob3VsZAorICAgICAgICAgICAgIGNhdXNlIGEgTGF5b3V0VHJhbnNpdGlvbiB0byBydW4uIFdoZW4gdGhpcyBmbGFnIGlzIHNldCB0byB0cnVlLCBhIGRlZmF1bHQKKyAgICAgICAgICAgICBMYXlvdXRUcmFuc2l0aW9uIG9iamVjdCB3aWxsIGJlIHNldCBvbiB0aGUgVmlld0dyb3VwIGNvbnRhaW5lciBhbmQgZGVmYXVsdAorICAgICAgICAgICAgIGFuaW1hdGlvbnMgd2lsbCBydW4gd2hlbiB0aGVzZSBsYXlvdXQgY2hhbmdlcyBvY2N1ci4tLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYW5pbWF0ZUxheW91dENoYW5nZXMiIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICAgICAgPCEtLSBEZWZpbmVzIHdoZXRoZXIgYSBjaGlsZCBpcyBsaW1pdGVkIHRvIGRyYXcgaW5zaWRlIG9mIGl0cyBib3VuZHMgb3Igbm90LgogICAgICAgICAgICAgIFRoaXMgaXMgdXNlZnVsIHdpdGggYW5pbWF0aW9ucyB0aGF0IHNjYWxlIHRoZSBzaXplIG9mIHRoZSBjaGlsZHJlbiB0byBtb3JlCiAgICAgICAgICAgICAgdGhhbiAxMDAlIGZvciBpbnN0YW5jZS4gSW4gc3VjaCBhIGNhc2UsIHRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHNldCB0byBmYWxzZQpAQCAtMTQyMiw2ICsxNTExLDE3IEBACiAgICAgICAgICAgICA8ZW51bSBuYW1lPSJibG9ja3NEZXNjZW5kYW50cyIgdmFsdWU9IjIiIC8+CiAgICAgICAgIDwvYXR0cj4KIAorICAgICAgICA8IS0tIFNldHMgd2hldGhlciB0aGlzIFZpZXdHcm91cCBzaG91bGQgc3BsaXQgTW90aW9uRXZlbnRzCisgICAgICAgICAgICAgdG8gc2VwYXJhdGUgY2hpbGQgdmlld3MgZHVyaW5nIHRvdWNoIGV2ZW50IGRpc3BhdGNoLgorICAgICAgICAgICAgIElmIGZhbHNlIChkZWZhdWx0KSwgdG91Y2ggZXZlbnRzIHdpbGwgYmUgZGlzcGF0Y2hlZCB0bworICAgICAgICAgICAgIHRoZSBjaGlsZCB2aWV3IHdoZXJlIHRoZSBmaXJzdCBwb2ludGVyIHdlbnQgZG93biB1bnRpbAorICAgICAgICAgICAgIHRoZSBsYXN0IHBvaW50ZXIgZ29lcyB1cC4KKyAgICAgICAgICAgICBJZiB0cnVlLCB0b3VjaCBldmVudHMgbWF5IGJlIGRpc3BhdGNoZWQgdG8gbXVsdGlwbGUgY2hpbGRyZW4uCisgICAgICAgICAgICAgTW90aW9uRXZlbnRzIGZvciBlYWNoIHBvaW50ZXIgd2lsbCBiZSBkaXNwYXRjaGVkIHRvIHRoZSBjaGlsZAorICAgICAgICAgICAgIHZpZXcgd2hlcmUgdGhlIGluaXRpYWwgQUNUSU9OX0RPV04gZXZlbnQgaGFwcGVuZWQuCisgICAgICAgICAgICAgU2VlIHtAbGluayBhbmRyb2lkLnZpZXcuVmlld0dyb3VwI3NldE1vdGlvbkV2ZW50U3BsaXR0aW5nRW5hYmxlZChib29sZWFuKX0KKyAgICAgICAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InNwbGl0TW90aW9uRXZlbnRzIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAogICAgIDwhLS0gQSB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXdTdHVifSBsZXRzIHlvdSBsYXppbHkgaW5jbHVkZSBvdGhlciBYTUwgbGF5b3V0cwpAQCAtMTUyMyw2ICsxNjIzLDI4IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImlzRGVmYXVsdCIgZm9ybWF0PSJib29sZWFuIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8IS0tIFRoaXMgaXMgdGhlIHN1YnR5cGUgb2YgSW5wdXRNZXRob2QuIFN1YnR5cGUgY2FuIGRlc2NyaWJlIGxvY2FsZXMgKGUuZy4gZW5fVVMsIGZyX0ZSLi4uKQorICAgICAgICAgYW5kIG1vZGVzIChlLmcuIHZvaWNlLCBrZXlib2FyZC4uLiksIGFuZCBpcyB1c2VkIGZvciBJTUUgc3dpdGNoLiBUaGlzIHN1YnR5cGUgYWxsb3dzCisgICAgICAgICB0aGUgc3lzdGVtIHRvIGNhbGwgdGhlIHNwZWNpZmllZCBzdWJ0eXBlIG9mIHRoZSBJTUUgZGlyZWN0bHkuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJJbnB1dE1ldGhvZF9TdWJ0eXBlIj4KKyAgICAgICAgPCEtLSBUaGUgbmFtZSBvZiB0aGUgc3VidHlwZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImxhYmVsIiAvPgorICAgICAgICA8IS0tIFRoZSBpY29uIG9mIHRoZSBzdWJ0eXBlLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaWNvbiIgLz4KKyAgICAgICAgPCEtLSBUaGUgbG9jYWxlIG9mIHRoZSBzdWJ0eXBlLiBUaGlzIHN0cmluZyBzaG91bGQgYmUgYSBsb2NhbGUgKGUuZy4gZW5fVVMsIGZyX0ZSLi4uKQorICAgICAgICAgICAgIGFuZCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgSU1FIHdoZW4gdGhlIGZyYW1ld29yayBjYWxscyB0aGUgSU1FCisgICAgICAgICAgICAgd2l0aCB0aGUgc3VidHlwZS4gVGhpcyBpcyBhbHNvIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBrbm93IHRoZSBzdXBwb3J0ZWQgbG9jYWxlcworICAgICAgICAgICAgIG9mIHRoZSBJTUUuICAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaW1lU3VidHlwZUxvY2FsZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIG1vZGUgb2YgdGhlIHN1YnR5cGUuIFRoaXMgc3RyaW5nIGNhbiBiZSBhIG1vZGUgKGUuZy4gdm9pY2UsIGtleWJvYXJkLi4uKSBhbmQgdGhpcworICAgICAgICAgICAgIHN0cmluZyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgSU1FIHdoZW4gdGhlIGZyYW1ld29yayBjYWxscyB0aGUgSU1FIHdpdGggdGhlCisgICAgICAgICAgICAgc3VidHlwZS4gIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJpbWVTdWJ0eXBlTW9kZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIGV4dHJhIHZhbHVlIG9mIHRoZSBzdWJ0eXBlLiBUaGlzIHN0cmluZyBjYW4gYmUgYW55IHN0cmluZyBhbmQgd2lsbCBiZSBwYXNzZWQgdG8KKyAgICAgICAgICAgICB0aGUgSU1FIHdoZW4gdGhlIGZyYW1ld29yayBjYWxscyB0aGUgSU1FIHdpdGggdGhlIHN1YnR5cGUuICAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaW1lU3VidHlwZUV4dHJhVmFsdWUiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSBXaWRnZXQgcGFja2FnZSBjbGFzcyBhdHRyaWJ1dGVzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTE1NzIsNiArMTY5NCwyOCBAQAogICAgICAgICAgICAgIHdpbGwgdXNlIG9ubHkgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgYWRhcHRlciBhbmQgdGhlIG51bWJlciBvZiBpdGVtcyB2aXNpYmxlCiAgICAgICAgICAgICAgb24gc2NyZWVuIHRvIGRldGVybWluZSB0aGUgc2Nyb2xsYmFyJ3MgcHJvcGVydGllcy4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InNtb290aFNjcm9sbGJhciIgZm9ybWF0PSJib29sZWFuIiAvPgorICAgICAgICA8IS0tIEEgcmVmZXJlbmNlIHRvIGFuIFhNTCBkZXNjcmlwdGlvbiBvZiB0aGUgYWRhcHRlciB0byBhdHRhY2ggdG8gdGhlIGxpc3QuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhZGFwdGVyIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZpbmVzIHRoZSBjaG9pY2UgYmVoYXZpb3IgZm9yIHRoZSB2aWV3LiBCeSBkZWZhdWx0LCBsaXN0cyBkbyBub3QgaGF2ZQorICAgICAgICAgICAgIGFueSBjaG9pY2UgYmVoYXZpb3IuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8gc2luZ2xlQ2hvaWNlLCB0aGUgbGlzdAorICAgICAgICAgICAgIGFsbG93cyB1cCB0byBvbmUgaXRlbSB0byBiZSBpbiBhIGNob3NlbiBzdGF0ZS4gQnkgc2V0dGluZyB0aGUgY2hvaWNlTW9kZSB0bworICAgICAgICAgICAgIG11bHRpcGxlQ2hvaWNlLCB0aGUgbGlzdCBhbGxvd3MgYW55IG51bWJlciBvZiBpdGVtcyB0byBiZSBjaG9zZW4uCisgICAgICAgICAgICAgRmluYWxseSwgYnkgc2V0dGluZyB0aGUgY2hvaWNlTW9kZSB0byBtdWx0aXBsZUNob2ljZU1vZGFsIHRoZSBsaXN0IGFsbG93cworICAgICAgICAgICAgIGFueSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgY2hvc2VuIGluIGEgc3BlY2lhbCBzZWxlY3Rpb24gbW9kZS4KKyAgICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gd2lsbCBzdXBwbHkgYQorICAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLndpZGdldC5BYnNMaXN0Vmlldy5NdWx0aUNob2ljZU1vZGVMaXN0ZW5lcn0gdXNpbmcKKyAgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcjc2V0TXVsdGlDaG9pY2VNb2RlTGlzdGVuZXJ9IHRvIGNvbnRyb2wgdGhlCisgICAgICAgICAgICAgc2VsZWN0aW9uIG1vZGUuIFRoaXMgdXNlcyB0aGUge0BsaW5rIGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlfSBBUEkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJjaG9pY2VNb2RlIj4KKyAgICAgICAgICAgIDwhLS0gTm9ybWFsIGxpc3QgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjaG9pY2VzLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9Im5vbmUiIHZhbHVlPSIwIiAvPgorICAgICAgICAgICAgPCEtLSBUaGUgbGlzdCBhbGxvd3MgdXAgdG8gb25lIGNob2ljZS4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJzaW5nbGVDaG9pY2UiIHZhbHVlPSIxIiAvPgorICAgICAgICAgICAgPCEtLSBUaGUgbGlzdCBhbGxvd3MgbXVsdGlwbGUgY2hvaWNlcy4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJtdWx0aXBsZUNob2ljZSIgdmFsdWU9IjIiIC8+CisgICAgICAgICAgICA8IS0tIFRoZSBsaXN0IGFsbG93cyBtdWx0aXBsZSBjaG9pY2VzIGluIGEgY3VzdG9tIHNlbGVjdGlvbiBtb2RlLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9Im11bHRpcGxlQ2hvaWNlTW9kYWwiIHZhbHVlPSIzIiAvPgorICAgICAgICA8L2F0dHI+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQWJzU3Bpbm5lciI+CiAgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGFuIGFycmF5IHJlc291cmNlIHRoYXQgd2lsbCBwb3B1bGF0ZSB0aGUgU3Bpbm5lci4gIEZvciBzdGF0aWMgY29udGVudCwKQEAgLTE3NjcsNyArMTkxMSw3IEBACiAgICAgICAgIDwhLS0gV2hlbiBzZXQgdG8gdHJ1ZSwgYWxsIGNoaWxkcmVuIHdpdGggYSB3ZWlnaHQgd2lsbCBiZSBjb25zaWRlcmVkIGhhdmluZwogICAgICAgICAgICAgIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQuIElmIGZhbHNlLCBhbGwgY2hpbGRyZW4gYXJlCiAgICAgICAgICAgICAgbWVhc3VyZWQgbm9ybWFsbHkuIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJ1c2VMYXJnZXN0Q2hpbGQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0ibWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJMaXN0VmlldyI+CiAgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGFuIGFycmF5IHJlc291cmNlIHRoYXQgd2lsbCBwb3B1bGF0ZSB0aGUgTGlzdFZpZXcuICBGb3Igc3RhdGljIGNvbnRlbnQsCkBAIC0xNzc4LDI4ICsxOTIyLDEyIEBACiAgICAgICAgIDwhLS0gSGVpZ2h0IG9mIHRoZSBkaXZpZGVyLiBXaWxsIHVzZSB0aGUgaW50cmluc2ljIGhlaWdodCBvZiB0aGUgZGl2aWRlciBpZiB0aGlzCiAgICAgICAgICAgICAgaXMgbm90IHNwZWNpZmllZC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImRpdmlkZXJIZWlnaHQiIGZvcm1hdD0iZGltZW5zaW9uIiAvPgotICAgICAgICA8IS0tIERlZmluZXMgdGhlIGNob2ljZSBiZWhhdmlvciBmb3IgdGhlIExpc3RWaWV3LiBCeSBkZWZhdWx0LCBsaXN0cyBkbyBub3QgaGF2ZQotICAgICAgICAgICAgIGFueSBjaG9pY2UgYmVoYXZpb3IuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8gc2luZ2xlQ2hvaWNlLCB0aGUgTGlzdAotICAgICAgICAgICAgIGFsbG93cyB1cCB0byBvbmUgaXRlbSB0byBiZSBpbiBhIGNob3NlbiBzdGF0ZS4gQnkgc2V0dGluZyB0aGUgY2hvaWNlTW9kZSB0bwotICAgICAgICAgICAgIG11bHRpcGxlQ2hvaWNlLCB0aGUgbGlzdCBhbGxvd3MgYW55IG51bWJlciBvZiBpdGVtcyB0byBiZSBjaG9zZW4uIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJjaG9pY2VNb2RlIj4KLSAgICAgICAgICAgIDwhLS0gTm9ybWFsIGxpc3QgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjaG9pY2VzLiAtLT4KLSAgICAgICAgICAgIDxlbnVtIG5hbWU9Im5vbmUiIHZhbHVlPSIwIiAvPgotICAgICAgICAgICAgPCEtLSBUaGUgbGlzdCBhbGxvd3MgdXAgdG8gb25lIGNob2ljZS4gLS0+Ci0gICAgICAgICAgICA8ZW51bSBuYW1lPSJzaW5nbGVDaG9pY2UiIHZhbHVlPSIxIiAvPgotICAgICAgICAgICAgPCEtLSBUaGUgbGlzdCBhbGxvd3MgbXVsdGlwbGUgY2hvaWNlcy4gLS0+Ci0gICAgICAgICAgICA8ZW51bSBuYW1lPSJtdWx0aXBsZUNob2ljZSIgdmFsdWU9IjIiIC8+Ci0gICAgICAgIDwvYXR0cj4KICAgICAgICAgPCEtLSBXaGVuIHNldCB0byBmYWxzZSwgdGhlIExpc3RWaWV3IHdpbGwgbm90IGRyYXcgdGhlIGRpdmlkZXIgYWZ0ZXIgZWFjaCBoZWFkZXIgdmlldy4KICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iaGVhZGVyRGl2aWRlcnNFbmFibGVkIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgICAgIDwhLS0gV2hlbiBzZXQgdG8gZmFsc2UsIHRoZSBMaXN0VmlldyB3aWxsIG5vdCBkcmF3IHRoZSBkaXZpZGVyIGJlZm9yZSBlYWNoIGZvb3RlciB2aWV3LgogICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJmb290ZXJEaXZpZGVyc0VuYWJsZWQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KLSAgICAgICAgPCEtLSBEcmF3YWJsZSB0byBkcmF3IGFib3ZlIGxpc3QgY29udGVudC4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9Im92ZXJzY3JvbGxIZWFkZXIiIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgotICAgICAgICA8IS0tIERyYXdhYmxlIHRvIGRyYXcgYmVsb3cgbGlzdCBjb250ZW50LiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ib3ZlcnNjcm9sbEZvb3RlciIgZm9ybWF0PSJyZWZlcmVuY2V8Y29sb3IiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTWVudVZpZXciPgogICAgICAgICA8IS0tIERlZmF1bHQgYXBwZWFyYW5jZSBvZiBtZW51IGl0ZW0gdGV4dC4gLS0+CkBAIC0yMjA1LDcgKzIzMzMsNyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93bkFuY2hvciIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRoZSBiYXNpYyB3aWR0aCBvZiB0aGUgZHJvcGRvd24uIEl0cyB2YWx1ZSBtYXkKICAgICAgICAgICAgICBiZSBhIGRpbWVuc2lvbiAoc3VjaCBhcyAiMTJkaXAiKSBmb3IgYSBjb25zdGFudCB3aWR0aCwKLSAgICAgICAgICAgICBmaWxsX3BhcmVudCBvciBtYXRjaF9wYXJlbnQgdG8gbWF0Y2ggdGhlIHdpZHRoIG9mIHRoZSAKKyAgICAgICAgICAgICBmaWxsX3BhcmVudCBvciBtYXRjaF9wYXJlbnQgdG8gbWF0Y2ggdGhlIHdpZHRoIG9mIHRoZQogICAgICAgICAgICAgIHNjcmVlbiwgb3Igd3JhcF9jb250ZW50IHRvIG1hdGNoIHRoZSB3aWR0aCBvZgogICAgICAgICAgICAgIHRoZSBhbmNob3JlZCB2aWV3LiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25XaWR0aCIgZm9ybWF0PSJkaW1lbnNpb24iPgpAQCAtMjI0MiwxNCArMjM3MCwzNiBAQAogICAgICAgICA8YXR0ciBuYW1lPSJwb3B1cEFuaW1hdGlvblN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJWaWV3QW5pbWF0b3IiPgorICAgICAgICA8IS0tIElkZW50aWZpZXIgZm9yIHRoZSBhbmltYXRpb24gdG8gdXNlIHdoZW4gYSB2aWV3IGlzIHNob3duLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iaW5BbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIElkZW50aWZpZXIgZm9yIHRoZSBhbmltYXRpb24gdG8gdXNlIHdoZW4gYSB2aWV3IGlzIGhpZGRlbi4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9Im91dEFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gRGVmaW5lcyB3aGV0aGVyIHRvIGFuaW1hdGUgdGhlIGN1cnJlbnQgVmlldyB3aGVuIHRoZSBWaWV3QW5pbWF0aW9uCisgICAgICAgICAgICAgaXMgZmlyc3QgZGlzcGxheWVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYW5pbWF0ZUZpcnN0VmlldyIgZm9ybWF0PSJib29sZWFuIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlZpZXdGbGlwcGVyIj4KICAgICAgICAgPGF0dHIgbmFtZT0iZmxpcEludGVydmFsIiBmb3JtYXQ9ImludGVnZXIiIG1pbj0iMCIgLz4KICAgICAgICAgPCEtLSBXaGVuIHRydWUsIGF1dG9tYXRpY2FsbHkgc3RhcnQgYW5pbWF0aW5nIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJhdXRvU3RhcnQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJBZGFwdGVyVmlld0FuaW1hdG9yIj4KKyAgICAgICAgPCEtLSBJZGVudGlmaWVyIGZvciB0aGUgYW5pbWF0aW9uIHRvIHVzZSB3aGVuIGEgdmlldyBpcyBzaG93bi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImluQW5pbWF0aW9uIiAvPgorICAgICAgICA8IS0tIElkZW50aWZpZXIgZm9yIHRoZSBhbmltYXRpb24gdG8gdXNlIHdoZW4gYSB2aWV3IGlzIGhpZGRlbi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Im91dEFuaW1hdGlvbiIgLz4KKyAgICAgICAgPCEtLURlZmluZXMgd2hldGhlciB0aGUgYW5pbWF0b3IgbG9vcHMgdG8gdGhlIGZpcnN0IHZpZXcgb25jZSBpdAorICAgICAgICBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBsaXN0LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ibG9vcFZpZXdzIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CisgICAgICAgIDwhLS0gRGVmaW5lcyB3aGV0aGVyIHRvIGFuaW1hdGUgdGhlIGN1cnJlbnQgVmlldyB3aGVuIHRoZSBWaWV3QW5pbWF0aW9uCisgICAgICAgIGlzIGZpcnN0IGRpc3BsYXllZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFuaW1hdGVGaXJzdFZpZXciIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQWRhcHRlclZpZXdGbGlwcGVyIj4KKyAgICAgICAgPGF0dHIgbmFtZT0iZmxpcEludGVydmFsIiAvPgorICAgICAgICA8IS0tIFdoZW4gdHJ1ZSwgYXV0b21hdGljYWxseSBzdGFydCBhbmltYXRpbmcgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImF1dG9TdGFydCIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJWaWV3U3dpdGNoZXIiPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlNjcm9sbFZpZXciPgpAQCAtMjI2Myw2ICsyNDEzLDMwIEBACiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlNwaW5uZXIiPgogICAgICAgICA8IS0tIFRoZSBwcm9tcHQgdG8gZGlzcGxheSB3aGVuIHRoZSBzcGlubmVyJ3MgZGlhbG9nIGlzIHNob3duLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0icHJvbXB0IiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEaXNwbGF5IG1vZGUgZm9yIHNwaW5uZXIgb3B0aW9ucy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InNwaW5uZXJNb2RlIiBmb3JtYXQ9ImVudW0iPgorICAgICAgICAgICAgPCEtLSBTcGlubmVyIG9wdGlvbnMgd2lsbCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgYXMgYSBkaWFsb2cgd2luZG93LiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImRpYWxvZyIgdmFsdWU9IjAiIC8+CisgICAgICAgICAgICA8IS0tIFNwaW5uZXIgb3B0aW9ucyB3aWxsIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlciBhcyBhbiBpbmxpbmUgZHJvcGRvd24KKyAgICAgICAgICAgICAgICAgYW5jaG9yZWQgdG8gdGhlIHNwaW5uZXIgd2lkZ2V0IGl0c2VsZi4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJkcm9wZG93biIgdmFsdWU9IjEiIC8+CisgICAgICAgIDwvYXR0cj4KKyAgICAgICAgPCEtLSBMaXN0IHNlbGVjdG9yIHRvIHVzZSBmb3Igc3Bpbm5lck1vZGU9ImRyb3Bkb3duIiBkaXNwbGF5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25TZWxlY3RvciIgLz4KKyAgICAgICAgPCEtLSBCYWNrZ3JvdW5kIGRyYXdhYmxlIHRvIHVzZSBmb3IgdGhlIGRyb3Bkb3duIGluIHNwaW5uZXJNb2RlPSJkcm9wZG93biIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJwb3B1cEJhY2tncm91bmQiIC8+CisgICAgICAgIDwhLS0gVmVydGljYWwgb2Zmc2V0IGZyb20gdGhlIHNwaW5uZXIgd2lkZ2V0IGZvciBwb3NpdGlvbmluZyB0aGUgZHJvcGRvd24gaW4KKyAgICAgICAgICAgICBzcGlubmVyTW9kZT0iZHJvcGRvd24iLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25WZXJ0aWNhbE9mZnNldCIgLz4KKyAgICAgICAgPCEtLSBIb3Jpem9udGFsIG9mZnNldCBmcm9tIHRoZSBzcGlubmVyIHdpZGdldCBmb3IgcG9zaXRpb25pbmcgdGhlIGRyb3Bkb3duCisgICAgICAgICAgICAgaW4gc3Bpbm5lck1vZGU9ImRyb3Bkb3duIi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImRyb3BEb3duSG9yaXpvbnRhbE9mZnNldCIgLz4KKyAgICAgICAgPCEtLSBXaWR0aCBvZiB0aGUgZHJvcGRvd24gaW4gc3Bpbm5lck1vZGU9ImRyb3Bkb3duIi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImRyb3BEb3duV2lkdGgiIC8+CisgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGEgbGF5b3V0IHRvIHVzZSBmb3IgZGlzcGxheWluZyBhIHByb21wdCBpbiB0aGUgZHJvcGRvd24gZm9yCisgICAgICAgICAgICAgc3Bpbm5lck1vZGU9ImRyb3Bkb3duIi4gVGhpcyBsYXlvdXQgbXVzdCBjb250YWluIGEgVGV4dFZpZXcgd2l0aCB0aGUgaWQKKyAgICAgICAgICAgICBAYW5kcm9pZDppZC90ZXh0MSB0byBiZSBwb3B1bGF0ZWQgd2l0aCB0aGUgcHJvbXB0IHRleHQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJwb3B1cFByb21wdFZpZXciIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkRhdGVQaWNrZXIiPgogICAgICAgICA8IS0tIFRoZSBmaXJzdCB5ZWFyIChpbmNsdXNpdmUpLCBmb3IgZXhhbXBsZSAiMTk0MCIuIC0tPgpAQCAtMjU3Myw2ICsyNzQ3LDEwIEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImRyYXdhYmxlIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTWlwbWFwRHJhd2FibGVJdGVtIj4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHJhd2FibGUiIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKwogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJSb3RhdGVEcmF3YWJsZSI+CiAgICAgICAgIDxhdHRyIG5hbWU9InZpc2libGUiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImZyb21EZWdyZWVzIiBmb3JtYXQ9ImZsb2F0IiAvPgpAQCAtMjg5Niw2ICszMDc0LDY5IEBACiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSBWYWx1ZUFuaW1hdG9yIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8ZWF0LWNvbW1lbnQgLz4KKworICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJBbmltYXRvciI+CisgICAgICAgIDwhLS0gRGVmaW5lcyB0aGUgaW50ZXJwb2xhdG9yIHVzZWQgdG8gc21vb3RoIHRoZSBhbmltYXRpb24gbW92ZW1lbnQgaW4gdGltZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImludGVycG9sYXRvciIgLz4KKyAgICAgICAgPCEtLSBXaGVuIHNldCB0byB0cnVlLCBmaWxsQWZ0ZXIgaXMgdGFrZW4gaW50byBhY2NvdW50LiAtLT4KKyAgICAgICAgPCEtLSBBbW91bnQgb2YgdGltZSAoaW4gbWlsbGlzZWNvbmRzKSBmb3IgdGhlIGFuaW1hdGlvbiB0byBydW4uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkdXJhdGlvbiIgLz4KKyAgICAgICAgPCEtLSBEZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBhbmltYXRpb24gcnVucywgb25jZSBzdGFydCB0aW1lIGlzIHJlYWNoZWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzdGFydE9mZnNldCIvPgorICAgICAgICA8IS0tIERlZmluZXMgaG93IG1hbnkgdGltZXMgdGhlIGFuaW1hdGlvbiBzaG91bGQgcmVwZWF0LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0icmVwZWF0Q291bnQiLz4KKyAgICAgICAgPCEtLSBEZWZpbmVzIHRoZSBhbmltYXRpb24gYmVoYXZpb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgYW5kIHRoZSByZXBlYXQgY291bnQgaXMKKyAgICAgICAgICAgICBncmVhdGVyIHRoYW4gMCBvciBpbmZpbml0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgcmVzdGFydC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InJlcGVhdE1vZGUiLz4KKyAgICAgICAgPCEtLSBWYWx1ZSB0aGUgYW5pbWF0aW9uIHN0YXJ0cyBmcm9tLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idmFsdWVGcm9tIiBmb3JtYXQ9ImZsb2F0fGludGVnZXIiLz4KKyAgICAgICAgPCEtLSBWYWx1ZSB0aGUgYW5pbWF0aW9uIGFuaW1hdGVzIHRvLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idmFsdWVUbyIgZm9ybWF0PSJmbG9hdHxpbnRlZ2VyIi8+CisgICAgICAgIDwhLS0gVGhlIHR5cGUgb2YgdmFsdWVGcm9tIGFuZCB2YWx1ZVRvLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idmFsdWVUeXBlIj4KKyAgICAgICAgICAgIDwhLS0gdmFsdWVGcm9tIGFuZCB2YWx1ZVRvIGFyZSBmbG9hdHMuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iZmxvYXRUeXBlIiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgICAgIDwhLS0gdmFsdWVGcm9tIGFuZCB2YWx1ZVRvIGFyZSBpbnRlZ2Vycy4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJpbnRUeXBlIiAgIHZhbHVlPSIxIiAvPgorICAgICAgICAgICAgPCEtLSB2YWx1ZUZyb20gYW5kIHZhbHVlVG8gYXJlIGRvdWJsZXMuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iZG91YmxlVHlwZSIgdmFsdWU9IjIiIC8+CisgICAgICAgICAgICA8IS0tIHZhbHVlRnJvbSBhbmQgdmFsdWVUbyBhcmUgY29sb3JzLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImNvbG9yVHlwZSIgdmFsdWU9IjMiIC8+CisgICAgICAgICAgICA8IS0tIHZhbHVlRnJvbSBhbmQgdmFsdWVUbyBhcmUgYSBjdXN0b20gdHlwZS4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJjdXN0b21UeXBlIiB2YWx1ZT0iNCIgLz4KKyAgICAgICAgPC9hdHRyPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gT2JqZWN0QW5pbWF0b3IgY2xhc3MgYXR0cmlidXRlcyAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDxlYXQtY29tbWVudCAvPgorCisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlByb3BlcnR5QW5pbWF0b3IiPgorICAgICAgICA8IS0tIE5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0icHJvcGVydHlOYW1lIiBmb3JtYXQ9InN0cmluZyIvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKworICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSBBbmltYXRvclNldCBjbGFzcyBhdHRyaWJ1dGVzIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPGVhdC1jb21tZW50IC8+CisKKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQW5pbWF0b3JTZXQiPgorICAgICAgICA8IS0tIE5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ib3JkZXJpbmciPgorICAgICAgICAgICAgPCEtLSBjaGlsZCBhbmltYXRpb25zIHNob3VsZCBiZSBwbGF5ZWQgdG9nZXRoZXIuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0idG9nZXRoZXIiIHZhbHVlPSIwIiAvPgorICAgICAgICAgICAgPCEtLSBjaGlsZCBhbmltYXRpb25zIHNob3VsZCBiZSBwbGF5ZWQgc2VxdWVudGlhbGx5LCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgeG1sLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9InNlcXVlbnRpYWxseSIgdmFsdWU9IjEiIC8+CisgICAgICAgIDwvYXR0cj4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tIFN0YXRlIGF0dHJpYnV0ZXMgICAgICAgICAgIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPGVhdC1jb21tZW50IC8+CkBAIC0yOTE3LDYgKzMxNTgsNyBAQAogICAgICAgICAgPGxpPiJzdGF0ZV9sYXN0IgogICAgICAgICAgPGxpPiJzdGF0ZV9vbmx5IgogICAgICAgICAgPGxpPiJzdGF0ZV9wcmVzc2VkIgorICAgICAgICAgPGxpPiJzdGF0ZV9hY3RpdmF0ZWQiCiAgICAgICAgICA8bGk+InN0YXRlX2Vycm9yIgogICAgICAgICAgPGxpPiJzdGF0ZV9jaXJjbGUiCiAgICAgICAgICA8bGk+InN0YXRlX3JlY3QiCkBAIC0yOTI0LDIzICszMTY2LDM1IEBACiAgICAgICAgICA8bGk+InN0YXRlX21vdmUiCiAgICAgICAgICA8L3VsPiAgLS0+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkRyYXdhYmxlU3RhdGVzIj4KLSAgICAgICAgPCEtLSAgU3RhdGUgdmFsdWUgZm9yIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlIFN0YXRlTGlzdERyYXdhYmxlfS4tLT4KKyAgICAgICAgPCEtLSBTdGF0ZSB2YWx1ZSBmb3Ige0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGUgU3RhdGVMaXN0RHJhd2FibGV9LAorICAgICAgICAgICAgIHNldCB3aGVuIGEgdmlldyBoYXMgaW5wdXQgZm9jdXMuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzdGF0ZV9mb2N1c2VkIiBmb3JtYXQ9ImJvb2xlYW4iIC8+Ci0gICAgICAgIDwhLS0gIFN0YXRlIHZhbHVlIGZvciB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TdGF0ZUxpc3REcmF3YWJsZSBTdGF0ZUxpc3REcmF3YWJsZX0uLS0+CisgICAgICAgIDwhLS0gU3RhdGUgdmFsdWUgZm9yIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlIFN0YXRlTGlzdERyYXdhYmxlfSwKKyAgICAgICAgICAgICBzZXQgd2hlbiBhIHZpZXcncyB3aW5kb3cgaGFzIGlucHV0IGZvY3VzLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfd2luZG93X2ZvY3VzZWQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KLSAgICAgICAgPCEtLSAgU3RhdGUgdmFsdWUgZm9yIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlIFN0YXRlTGlzdERyYXdhYmxlfS4tLT4KKyAgICAgICAgPCEtLSBTdGF0ZSB2YWx1ZSBmb3Ige0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGUgU3RhdGVMaXN0RHJhd2FibGV9LAorICAgICAgICAgICAgIHNldCB3aGVuIGEgdmlldyBpcyBlbmFibGVkLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfZW5hYmxlZCIgZm9ybWF0PSJib29sZWFuIiAvPgotICAgICAgICA8IS0tICBTdGF0ZSBpZGVudGlmaWVyIGluZGljYXRpbmcgdGhhdCB0aGUgb2JqZWN0IDx2YXI+bWF5PC92YXI+IGRpc3BsYXkgYSBjaGVjayBtYXJrLgotICAgICAgICAgICAgICBTZWUge0BsaW5rIFIuYXR0ciNzdGF0ZV9jaGVja2VkfSBmb3IgdGhlIGlkZW50aWZpZXIgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBpdCBpcwotICAgICAgICAgICAgICBhY3R1YWxseSBjaGVja2VkLiAtLT4KKyAgICAgICAgPCEtLSBTdGF0ZSBpZGVudGlmaWVyIGluZGljYXRpbmcgdGhhdCB0aGUgb2JqZWN0IDx2YXI+bWF5PC92YXI+IGRpc3BsYXkgYSBjaGVjayBtYXJrLgorICAgICAgICAgICAgIFNlZSB7QGxpbmsgUi5hdHRyI3N0YXRlX2NoZWNrZWR9IGZvciB0aGUgaWRlbnRpZmllciB0aGF0IGluZGljYXRlcyB3aGV0aGVyIGl0IGlzCisgICAgICAgICAgICAgYWN0dWFsbHkgY2hlY2tlZC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InN0YXRlX2NoZWNrYWJsZSIgZm9ybWF0PSJib29sZWFuIi8+Ci0gICAgICAgIDwhLS0gIFN0YXRlIGlkZW50aWZpZXIgaW5kaWNhdGluZyB0aGF0IHRoZSBvYmplY3QgaXMgY3VycmVudGx5IGNoZWNrZWQuICBTZWUKLSAgICAgICAgICAgICAge0BsaW5rIFIuYXR0ciNzdGF0ZV9jaGVja2FibGV9IGZvciBhbiBhZGRpdGlvbmFsIGlkZW50aWZpZXIgdGhhdCBjYW4gaW5kaWNhdGUgaWYKLSAgICAgICAgICAgICAgYW55IG9iamVjdCBtYXkgZXZlciBkaXNwbGF5IGEgY2hlY2ssIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBzdGF0ZV9jaGVja2VkIGlzCi0gICAgICAgICAgICAgIGN1cnJlbnRseSBzZXQuIC0tPgorICAgICAgICA8IS0tIFN0YXRlIGlkZW50aWZpZXIgaW5kaWNhdGluZyB0aGF0IHRoZSBvYmplY3QgaXMgY3VycmVudGx5IGNoZWNrZWQuICBTZWUKKyAgICAgICAgICAgICB7QGxpbmsgUi5hdHRyI3N0YXRlX2NoZWNrYWJsZX0gZm9yIGFuIGFkZGl0aW9uYWwgaWRlbnRpZmllciB0aGF0IGNhbiBpbmRpY2F0ZSBpZgorICAgICAgICAgICAgIGFueSBvYmplY3QgbWF5IGV2ZXIgZGlzcGxheSBhIGNoZWNrLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgc3RhdGVfY2hlY2tlZCBpcworICAgICAgICAgICAgIGN1cnJlbnRseSBzZXQuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzdGF0ZV9jaGVja2VkIiBmb3JtYXQ9ImJvb2xlYW4iLz4KLSAgICAgICAgPCEtLSAgU3RhdGUgdmFsdWUgZm9yIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlIFN0YXRlTGlzdERyYXdhYmxlfS4tLT4KKyAgICAgICAgPCEtLSBTdGF0ZSB2YWx1ZSBmb3Ige0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGUgU3RhdGVMaXN0RHJhd2FibGV9LAorICAgICAgICAgICAgIHNldCB3aGVuIGEgdmlldyAob3Igb25lIG9mIGl0cyBwYXJlbnRzKSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzdGF0ZV9zZWxlY3RlZCIgZm9ybWF0PSJib29sZWFuIiAvPgorICAgICAgICA8IS0tIFN0YXRlIHZhbHVlIGZvciB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TdGF0ZUxpc3REcmF3YWJsZSBTdGF0ZUxpc3REcmF3YWJsZX0sCisgICAgICAgICAgICAgc2V0IHdoZW4gdGhlIHVzZXIgaXMgcHJlc3NpbmcgZG93biBpbiBhIHZpZXcuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzdGF0ZV9wcmVzc2VkIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CisgICAgICAgIDwhLS0gU3RhdGUgdmFsdWUgZm9yIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlIFN0YXRlTGlzdERyYXdhYmxlfSwKKyAgICAgICAgICAgICBzZXQgd2hlbiBhIHZpZXcgb3IgaXRzIHBhcmVudCBoYXMgYmVlbiAiYWN0aXZhdGVkIiBtZWFuaW5nIHRoZSB1c2VyIGhhcyBjdXJyZW50bHkKKyAgICAgICAgICAgICBtYXJrZWQgaXQgYXMgYmVpbmcgb2YgaW50ZXJlc3QuICBUaGlzIGlzIGFuIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9uIG9mCisgICAgICAgICAgICAgc3RhdGVfY2hlY2tlZCBmb3Igd2hlbiB0aGUgc3RhdGUgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZG93biB0aGUgdmlldyBoaWVyYXJjaHkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzdGF0ZV9hY3RpdmF0ZWQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICAgICAgPCEtLSAgU3RhdGUgdmFsdWUgZm9yIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlIFN0YXRlTGlzdERyYXdhYmxlfS4tLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfYWN0aXZlIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgICAgIDwhLS0gIFN0YXRlIHZhbHVlIGZvciB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TdGF0ZUxpc3REcmF3YWJsZSBTdGF0ZUxpc3REcmF3YWJsZX0uLS0+CkBAIC0yOTUxLDggKzMyMDUsNiBAQAogICAgICAgICA8YXR0ciBuYW1lPSJzdGF0ZV9taWRkbGUiIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICAgICAgPCEtLSAgU3RhdGUgdmFsdWUgZm9yIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlN0YXRlTGlzdERyYXdhYmxlIFN0YXRlTGlzdERyYXdhYmxlfS4tLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfbGFzdCIgZm9ybWF0PSJib29sZWFuIiAvPgotICAgICAgICA8IS0tICBTdGF0ZSB2YWx1ZSBmb3Ige0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGUgU3RhdGVMaXN0RHJhd2FibGV9Li0tPgotICAgICAgICA8YXR0ciBuYW1lPSJzdGF0ZV9wcmVzc2VkIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iVmlld0RyYXdhYmxlU3RhdGVzIj4KICAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfcHJlc3NlZCIgLz4KQEAgLTI5NjAsNiArMzIxMiw3IEBACiAgICAgICAgIDxhdHRyIG5hbWU9InN0YXRlX3NlbGVjdGVkIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJzdGF0ZV93aW5kb3dfZm9jdXNlZCIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfZW5hYmxlZCIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3RhdGVfYWN0aXZhdGVkIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgPCEtLSBTdGF0ZSBhcnJheSByZXByZXNlbnRpbmcgYSBtZW51IGl0ZW0gdGhhdCBpcyBjdXJyZW50bHkgY2hlY2tlZC4gLS0+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9Ik1lbnVJdGVtQ2hlY2tlZFN0YXRlIj4KQEAgLTMzMDQsNiArMzU1NywyNyBAQAogICAgICAgICA8IS0tIFdoZXRoZXIgdGhlIGl0ZW0gaXMgZW5hYmxlZC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImVuYWJsZWQiIC8+CiAKKyAgICAgICAgPCEtLSBOYW1lIG9mIGEgbWV0aG9kIG9uIHRoZSBDb250ZXh0IHVzZWQgdG8gaW5mbGF0ZSB0aGUgbWVudSB0aGF0IHdpbGwgYmUKKyAgICAgICAgICAgICBjYWxsZWQgd2hlbiB0aGUgaXRlbSBpcyBjbGlja2VkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ib25DbGljayIgLz4KKworICAgICAgICA8IS0tIEhvdyB0aGlzIGl0ZW0gc2hvdWxkIGRpc3BsYXkgaW4gdGhlIEFjdGlvbiBCYXIsIGlmIHByZXNlbnQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzaG93QXNBY3Rpb24iIGZvcm1hdD0iZW51bSI+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJuZXZlciIgdmFsdWU9IjAiIC8+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJpZlJvb20iIHZhbHVlPSIxIiAvPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iYWx3YXlzIiB2YWx1ZT0iMiIgLz4KKyAgICAgICAgPC9hdHRyPgorCisgICAgICAgIDwhLS0gQW4gb3B0aW9uYWwgbGF5b3V0IHRvIGJlIHVzZWQgYXMgYW4gYWN0aW9uIHZpZXcuCisgICAgICAgICAgICAgU2VlIHtAbGluayBhbmRyb2lkLnZpZXcuTWVudUl0ZW0jc2V0QWN0aW9uVmlldyhhbmRyb2lkLnZpZXcuVmlldyl9CisgICAgICAgICAgICAgZm9yIG1vcmUgaW5mby4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbkxheW91dCIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisKKyAgICAgICAgPCEtLSBUaGUgbmFtZSBvZiBhbiBvcHRpb25hbCBWaWV3IGNsYXNzIHRvIGluc3RhbnRpYXRlIGFuZCB1c2UgYXMgYW4KKyAgICAgICAgICAgICBhY3Rpb24gdmlldy4gU2VlIHtAbGluayBhbmRyb2lkLnZpZXcuTWVudUl0ZW0jc2V0QWN0aW9uVmlldyhhbmRyb2lkLnZpZXcuVmlldyl9CisgICAgICAgICAgICAgZm9yIG1vcmUgaW5mby4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvblZpZXdDbGFzcyIgZm9ybWF0PSJzdHJpbmciIC8+CisKICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgpAQCAtMzMxOSw2ICszNTkzLDI1IEBACiAgICAgICAgIDxhdHRyIG5hbWU9Im9yZGVyaW5nRnJvbVhtbCIgZm9ybWF0PSJib29sZWFuIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8IS0tIEF0dHJpYnV0ZSBmb3IgYSBoZWFkZXIgZGVzY3JpYmluZyB0aGUgaXRlbSBzaG93biBpbiB0aGUgdG9wLWxldmVsIGxpc3QKKyAgICAgICAgIGZyb20gd2hpY2ggdGhlIHNlbGVjdHMgdGhlIHNldCBvZiBwcmVmZXJlbmNlIHRvIGRpZyBpbiB0by4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlByZWZlcmVuY2VIZWFkZXIiPgorICAgICAgICA8IS0tIElkZW50aWZpZXIgdmFsdWUgZm9yIHRoZSBoZWFkZXIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJpZCIgLz4KKyAgICAgICAgPCEtLSBUaGUgdGl0bGUgb2YgdGhlIGl0ZW0gdGhhdCBpcyBzaG93biB0byB0aGUgdXNlci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRpdGxlIiAvPgorICAgICAgICA8IS0tIFRoZSBzdW1tYXJ5IGZvciB0aGUgaXRlbS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InN1bW1hcnkiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFRoZSB0aXRsZSBmb3IgdGhlIGJyZWFkIGNydW1iIG9mIHRoaXMgaXRlbS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImJyZWFkQ3J1bWJUaXRsZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIHNob3J0IHRpdGxlIGZvciB0aGUgYnJlYWQgY3J1bWIgb2YgdGhpcyBpdGVtLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYnJlYWRDcnVtYlNob3J0VGl0bGUiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIEFuIGljb24gZm9yIHRoZSBpdGVtLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaWNvbiIgLz4KKyAgICAgICAgPCEtLSBUaGUgZnJhZ21lbnQgdGhhdCBpcyBkaXNwbGF5ZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIHRoaXMgaXRlbS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImZyYWdtZW50IiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiAgICAgPCEtLSBXQVJOSU5HOiAgSWYgYWRkaW5nIGF0dHJpYnV0ZXMgdG8gUHJlZmVyZW5jZSwgbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNvbmZsaWN0CiAgICAgICAgICAgICAgICAgICAgd2l0aCBhIFZpZXcncyBhdHRyaWJ1dGVzLiAgU29tZSBzdWJjbGFzc2VzIChlLmcuLCBFZGl0VGV4dFByZWZlcmVuY2UpCiAgICAgICAgICAgICAgICAgICAgcHJveHkgYWxsIGF0dHJpYnV0ZXMgdG8gaXRzIEVkaXRUZXh0IHdpZGdldC4gLS0+CkBAIC0zMzMxLDEwICszNjI0LDEzIEBACiAgICAgICAgIDwhLS0gVGhlIHRpdGxlIGZvciB0aGUgUHJlZmVyZW5jZSBpbiBhIFByZWZlcmVuY2VBY3Rpdml0eSBzY3JlZW4uIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ0aXRsZSIgLz4KICAgICAgICAgPCEtLSBUaGUgc3VtbWFyeSBmb3IgdGhlIFByZWZlcmVuY2UgaW4gYSBQcmVmZXJlbmNlQWN0aXZpdHkgc2NyZWVuLiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ic3VtbWFyeSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDxhdHRyIG5hbWU9InN1bW1hcnkiIC8+CiAgICAgICAgIDwhLS0gVGhlIG9yZGVyIGZvciB0aGUgUHJlZmVyZW5jZSAobG93ZXIgdmFsdWVzIGFyZSB0byBiZSBvcmRlcmVkIGZpcnN0KS4gSWYgdGhpcyBpcyBub3QKICAgICAgICAgICAgICBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IG9yZGVyaW4gd2lsbCBiZSBhbHBoYWJldGljLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ib3JkZXIiIGZvcm1hdD0iaW50ZWdlciIgLz4KKyAgICAgICAgPCEtLSBXaGVuIHVzZWQgaW5zaWRlIG9mIGEgbW9kZXJuIFByZWZlcmVuY2VBY3Rpdml0eSwgdGhpcyBkZWNsYXJlcworICAgICAgICAgICAgIGEgbmV3IFByZWZlcmVuY2VGcmFnbWVudCB0byBiZSBzaG93biB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgdGhpcyBpdGVtLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZnJhZ21lbnQiIC8+CiAgICAgICAgIDwhLS0gVGhlIGxheW91dCBmb3IgdGhlIFByZWZlcmVuY2UgaW4gYSBQcmVmZXJlbmNlQWN0aXZpdHkgc2NyZWVuLiBUaGlzIHNob3VsZAogICAgICAgICAgICAgIHJhcmVseSBuZWVkIHRvIGJlIGNoYW5nZWQsIGxvb2sgYXQgd2lkZ2V0TGF5b3V0IGluc3RlYWQuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJsYXlvdXQiIC8+CkBAIC0zNDA2LDYgKzM3MDIsMTYgQEAKICAgICAgICAgPGF0dHIgbmFtZT0iZW50cnlWYWx1ZXMiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSI+CisgICAgICAgIDwhLS0gVGhlIGh1bWFuLXJlYWRhYmxlIGFycmF5IHRvIHByZXNlbnQgYXMgYSBsaXN0LiBFYWNoIGVudHJ5IG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgICBpbmRleCBpbiBlbnRyeVZhbHVlcy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImVudHJpZXMiIC8+CisgICAgICAgIDwhLS0gVGhlIGFycmF5IHRvIGZpbmQgdGhlIHZhbHVlIHRvIHNhdmUgZm9yIGEgcHJlZmVyZW5jZSB3aGVuIGFuIGVudHJ5IGZyb20KKyAgICAgICAgICAgICBlbnRyaWVzIGlzIHNlbGVjdGVkLiBJZiBhIHVzZXIgY2xpY2tzIHRoZSBzZWNvbmQgaXRlbSBpbiBlbnRyaWVzLCB0aGUKKyAgICAgICAgICAgICBzZWNvbmQgaXRlbSBpbiB0aGlzIGFycmF5IHdpbGwgYmUgc2F2ZWQgdG8gdGhlIHByZWZlcmVuY2UuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJlbnRyeVZhbHVlcyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiAgICAgPCEtLSBCYXNlIGF0dHJpYnV0ZXMgYXZhaWxhYmxlIHRvIFJpbmd0b25lUHJlZmVyZW5jZS4gLS0+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlJpbmd0b25lUHJlZmVyZW5jZSI+CiAgICAgICAgIDwhLS0gV2hpY2ggcmluZ3RvbmUgdHlwZShzKSB0byBzaG93IGluIHRoZSBwaWNrZXIuIC0tPgpAQCAtMzU1Nyw3ICszODYzLDcgQEAKICAgICA8IS0tIEFwcFdpZGdldCBwYWNrYWdlIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDxlYXQtY29tbWVudCAvPgotICAgIAorCiAgICAgPCEtLSBVc2UgPGNvZGU+YXBwd2lkZ2V0LXByb3ZpZGVyPC9jb2RlPiBhcyB0aGUgcm9vdCB0YWcgb2YgdGhlIFhNTCByZXNvdXJjZSB0aGF0CiAgICAgICAgICBkZXNjcmliZXMgYW4gQXBwV2lkZ2V0IHByb3ZpZGVyLiAgU2VlIHtAbGluayBhbmRyb2lkLmFwcHdpZGdldCBhbmRyb2lkLmFwcHdpZGdldH0KICAgICAgICAgIHBhY2thZ2UgZm9yIG1vcmUgaW5mby4KQEAgLTM1NzQsMTMgKzM4ODAsNDkgQEAKICAgICAgICAgPCEtLSBBIGNsYXNzIG5hbWUgaW4gdGhlIEFwcFdpZGdldCdzIHBhY2thZ2UgdG8gYmUgbGF1bmNoZWQgdG8gY29uZmlndXJlLgogICAgICAgICAgICAgIElmIG5vdCBzdXBwbGllZCwgdGhlbiBubyBhY3Rpdml0eSB3aWxsIGJlIGxhdW5jaGVkLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iY29uZmlndXJlIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBBIHByZXZpZXcgb2Ygd2hhdCB0aGUgQXBwV2lkZ2V0IHdpbGwgbG9vayBsaWtlIGFmdGVyIGl0J3MgY29uZmlndXJlZC4KKyAgICAgICAJICAgICBJZiBub3Qgc3VwcGxpZWQsIHRoZSBBcHBXaWRnZXQncyBpY29uIHdpbGwgYmUgdXNlZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InByZXZpZXdJbWFnZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tIEFwcCBwYWNrYWdlIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDxlYXQtY29tbWVudCAvPgotICAgIAorCisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tIFZpZXcgcGFja2FnZSBjbGFzcyBhdHRyaWJ1dGVzIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPGVhdC1jb21tZW50IC8+CisKKyAgICA8IS0tIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIDxjb2RlPiZsdDtmcmFnbWVudCZndDs8L2NvZGU+CisgICAgICAgICB0YWdzIGluc2lkZSBvZiB0aGUgbGF5b3V0IG9mIGFuIEFjdGl2aXR5LiAgVGhpcyBpbnN0YW50aWF0ZXMKKyAgICAgICAgIHRoZSBnaXZlbiB7QGxpbmsgYW5kcm9pZC5hcHAuRnJhZ21lbnR9IGFuZCBpbnNlcnRzIGl0cyBjb250ZW50CisgICAgICAgICB2aWV3IGludG8gdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIGxheW91dC4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkZyYWdtZW50Ij4KKyAgICAgICAgPCEtLSBTdXBwbHkgdGhlIG5hbWUgb2YgdGhlIGZyYWdtZW50IGNsYXNzIHRvIGluc3RhbnRpYXRlLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ibmFtZSIgLz4KKworICAgICAgICA8IS0tIFN1cHBseSBhbiBpZGVudGlmaWVyIG5hbWUgZm9yIHRoZSB0b3AtbGV2ZWwgdmlldywgdG8gbGF0ZXIgcmV0cmlldmUgaXQKKyAgICAgICAgICAgICB3aXRoIHtAbGluayBhbmRyb2lkLnZpZXcuVmlldyNmaW5kVmlld0J5SWQgVmlldy5maW5kVmlld0J5SWQoKX0gb3IKKyAgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjZmluZFZpZXdCeUlkIEFjdGl2aXR5LmZpbmRWaWV3QnlJZCgpfS4KKyAgICAgICAgICAgICBUaGlzIG11c3QgYmUgYQorICAgICAgICAgICAgIHJlc291cmNlIHJlZmVyZW5jZTsgdHlwaWNhbGx5IHlvdSBzZXQgdGhpcyB1c2luZyB0aGUKKyAgICAgICAgICAgICA8Y29kZT5AKzwvY29kZT4gc3ludGF4IHRvIGNyZWF0ZSBhIG5ldyBJRCByZXNvdXJjZXMuCisgICAgICAgICAgICAgRm9yIGV4YW1wbGU6IDxjb2RlPmFuZHJvaWQ6aWQ9IkAraWQvbXlfaWQiPC9jb2RlPiB3aGljaAorICAgICAgICAgICAgIGFsbG93cyB5b3UgdG8gbGF0ZXIgcmV0cmlldmUgdGhlIHZpZXcKKyAgICAgICAgICAgICB3aXRoIDxjb2RlPmZpbmRWaWV3QnlJZChSLmlkLm15X2lkKTwvY29kZT4uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJpZCIgLz4KKworICAgICAgICA8IS0tIFN1cHBseSBhIHRhZyBmb3IgdGhlIHRvcC1sZXZlbCB2aWV3IGNvbnRhaW5pbmcgYSBTdHJpbmcsIHRvIGJlIHJldHJpZXZlZAorICAgICAgICAgICAgIGxhdGVyIHdpdGgge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I2dldFRhZyBWaWV3LmdldFRhZygpfSBvcgorICAgICAgICAgICAgIHNlYXJjaGVkIGZvciB3aXRoIHtAbGluayBhbmRyb2lkLnZpZXcuVmlldyNmaW5kVmlld1dpdGhUYWcKKyAgICAgICAgICAgICBWaWV3LmZpbmRWaWV3V2l0aFRhZygpfS4gIEl0IGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHVzZQorICAgICAgICAgICAgIElEcyAodGhyb3VnaCB0aGUgYW5kcm9pZDppZCBhdHRyaWJ1dGUpIGluc3RlYWQgb2YgdGFncyBiZWNhdXNlCisgICAgICAgICAgICAgdGhleSBhcmUgZmFzdGVyIGFuZCBhbGxvdyBmb3IgY29tcGlsZS10aW1lIHR5cGUgY2hlY2tpbmcuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0YWciIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKwogICAgIDwhLS0gVXNlIDxjb2RlPmRldmljZS1hZG1pbjwvY29kZT4gYXMgdGhlIHJvb3QgdGFnIG9mIHRoZSBYTUwgcmVzb3VyY2UgdGhhdAogICAgICAgICAgZGVzY3JpYmVzIGEKICAgICAgICAgIHtAbGluayBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VBZG1pblJlY2VpdmVyfSwgd2hpY2ggaXMKQEAgLTM2MjAsNyArMzk2Miw3IEBACiAgICAgPCEtLSBBY2NvdW50cyBwYWNrYWdlIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDxlYXQtY29tbWVudCAvPgotICAgIAorCiAgICAgPCEtLSBVc2UgPGNvZGU+YWNjb3VudC1hdXRoZW50aWNhdG9yPC9jb2RlPiBhcyB0aGUgcm9vdCB0YWcgb2YgdGhlIFhNTCByZXNvdXJjZSB0aGF0CiAgICAgICAgICBkZXNjcmliZXMgYW4gYWNjb3VudCBhdXRoZW50aWNhdG9yLgogICAgICAtLT4KQEAgLTM2NDEsNyArMzk4Myw3IEBACiAgICAgPCEtLSBBY2NvdW50cyBwYWNrYWdlIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDxlYXQtY29tbWVudCAvPgotICAgIAorCiAgICAgPCEtLSBVc2UgPGNvZGU+YWNjb3VudC1hdXRoZW50aWNhdG9yPC9jb2RlPiBhcyB0aGUgcm9vdCB0YWcgb2YgdGhlIFhNTCByZXNvdXJjZSB0aGF0CiAgICAgICAgICBkZXNjcmliZXMgYW4gYWNjb3VudCBhdXRoZW50aWNhdG9yLgogICAgICAtLT4KQEAgLTM2NTcsNyArMzk5OSw3IEBACiAgICAgPCEtLSBDb250YWN0cyBtZXRhLWRhdGEgYXR0cmlidXRlcyAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPGVhdC1jb21tZW50IC8+Ci0gICAgCisKICAgICA8IS0tIFRPRE86IHJlbW92ZSB0aGlzIGRlcHJlY2F0ZWQgc3R5bGVhYmxlLiAtLT4KICAgICA8ZWF0LWNvbW1lbnQgLz4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iSWNvbiI+CkBAIC0zNjgzLDYgKzQwMjUsOSBAQAogICAgICAgICA8YXR0ciBuYW1lPSJkZXRhaWxDb2x1bW4iIGZvcm1hdD0ic3RyaW5nIiAvPgogICAgICAgICA8IS0tIEZsYWcgaW5kaWNhdGluZyB0aGF0IGRldGFpbCBzaG91bGQgYmUgYnVpbHQgZnJvbSBTb2NpYWxQcm92aWRlci4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImRldGFpbFNvY2lhbFN1bW1hcnkiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKyAgICAgICAgPCEtLSBSZXNvdXJjZSByZXByZXNlbnRpbmcgdGhlIHRlcm0gIkFsbCBDb250YWN0cyIgKGUuZy4gIkFsbCBGcmllbmRzIiBvcgorICAgICAgICAiQWxsIGNvbm5lY3Rpb25zIikuIE9wdGlvbmFsIChEZWZhdWx0IGlzICJBbGwgQ29udGFjdHMiKS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFsbENvbnRhY3RzTmFtZSIgZm9ybWF0PSJzdHJpbmciIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTM3MTQsNCArNDA1OSwxMjUgQEAKICAgICAgICAgPGF0dHIgbmFtZT0ic2V0dGluZ3NBY3Rpdml0eSIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gQWRhcHRlcnMgYXR0cmlidXRlcyAgICAgICAgICAgICAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPGVhdC1jb21tZW50IC8+CisKKyAgICA8IS0tIEFkYXB0ZXIgdXNlZCB0byBiaW5kIGN1cnNvcnMuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJDdXJzb3JBZGFwdGVyIj4KKyAgICAgICAgPCEtLSBVUkkgdG8gZ2V0IHRoZSBjdXJzb3IgZnJvbS4gT3B0aW9uYWwuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ1cmkiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFNlbGVjdGlvbiBzdGF0ZW1lbnQgZm9yIHRoZSBxdWVyeS4gT3B0aW9uYWwuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzZWxlY3Rpb24iIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFNvcnQgb3JkZXIgc3RhdGVtZW50IGZvciB0aGUgcXVlcnkuIE9wdGlvbmFsLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic29ydE9yZGVyIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBMYXlvdXQgcmVzb3VyY2UgdXNlZCB0byBkaXNwbGF5IGVhY2ggcm93IGZyb20gdGhlIGN1cnNvci4gTWFuZGF0b3J5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ibGF5b3V0IiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8IS0tIEF0dHJpYnV0ZXMgdXNlZCBpbiBiaW5kIGl0ZW1zIGZvciBYTUwgY3Vyc29yIGFkYXB0ZXJzLiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbSI+CisgICAgICAgIDwhLS0gVGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byBiaW5kIGZyb20uIE1hbmRhdG9yeS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImZyb20iIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFRoZSByZXNvdXJjZSBpZCBvZiB0aGUgdmlldyB0byBiaW5kIHRvLiBNYW5kYXRvcnkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0byIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gVGhlIHR5cGUgb2YgYmluZGluZy4gSWYgdGhpcyB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgdHlwZSB3aWxsIGJlCisgICAgICAgICAgICAgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgInRvIiB0YXJnZXQgdmlldy4gTWFuZGF0b3J5LgorCisgICAgICAgICAgICAgVGhlIHR5cGUgY2FuIGJlIG9uZSBvZjoKKyAgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgPGxpPnN0cmluZywgVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIHN0cmluZy48L2xpPgorICAgICAgICAgICAgIDxsaT5pbWFnZSwgVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIGJsb2IgZGVzY3JpYmluZyBhbiBpbWFnZS48L2xpPgorICAgICAgICAgICAgIDxsaT5pbWFnZS11cmksIFRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gaXMgaW50ZXJwcmV0ZWQgYXMgYSBVUkkgdG8gYW4gaW1hZ2UuPC9saT4KKyAgICAgICAgICAgICA8bGk+ZHJhd2FibGUsIFRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gaXMgaW50ZXJwcmV0ZWQgYXMgYSByZXNvdXJjZSBpZCB0byBhIGRyYXdhYmxlLjwvbGk+CisgICAgICAgICAgICAgPGxpPkEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUsIGNvcnJlc3BvbmRpbmcgdG8gYW4gaW1wbGVtZW50YXRpb24gb2YKKyAgICAgICAgICAgICAgICAgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yQmluZGVyLjwvbGk+CisgICAgICAgICAgICAgPC91bD4KKyAgICAgICAgIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhcyIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDwhLS0gQXR0cmlidXRlcyB1c2VkIGluIHNlbGVjdCBpdGVtcyBmb3IgWE1MIGN1cnNvciBhZGFwdGVycy4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkN1cnNvckFkYXB0ZXJfU2VsZWN0SXRlbSI+CisgICAgICAgIDwhLS0gVGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byBzZWxlY3QuIE1hbmRhdG9yeS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImNvbHVtbiIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDwhLS0gQXR0cmlidXRlcyB1c2VkIHRvIG1hcCB2YWx1ZXMgdG8gbmV3IHZhbHVlcyBpbiBYTUwgY3Vyc29yIGFkYXB0ZXJzJyBiaW5kIGl0ZW1zLiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQ3Vyc29yQWRhcHRlcl9NYXBJdGVtIj4KKyAgICAgICAgPCEtLSBUaGUgb3JpZ2luYWwgdmFsdWUgZnJvbSB0aGUgY29sdW1uLiBNYW5kYXRvcnkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJmcm9tVmFsdWUiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFRoZSBuZXcgdmFsdWUgZnJvbSB0aGUgY29sdW1uLiBNYW5kYXRvcnkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0b1ZhbHVlIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSBBdHRyaWJ1dGVzIHVzZWQgdG8gbWFwIHZhbHVlcyB0byBuZXcgdmFsdWVzIGluIFhNTCBjdXJzb3IgYWRhcHRlcnMnIGJpbmQgaXRlbXMuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJDdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW0iPgorICAgICAgICA8IS0tIFRoZSB0cmFuc2Zvcm1hdGlvbiBleHByZXNzaW9uLiBNYW5kYXRvcnkgaWYgIndpdGhDbGFzcyIgaXMgbm90IHNwZWNpZmllZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9IndpdGhFeHByZXNzaW9uIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBUaGUgdHJhbnNmb3JtYXRpb24gY2xhc3MsIGFuIGltcGxlbWVudGF0aW9uIG9mCisgICAgICAgICAgICAgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb24uIE1hbmRhdG9yeSBpZiAid2l0aEV4cHJlc3Npb24iCisgICAgICAgICAgICAgaXMgbm90IHNwZWNpZmllZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9IndpdGhDbGFzcyIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDwhLS0gQXR0cmlidXRlcyB1c2VkIHRvIHN0eWxlIHRoZSBBY3Rpb24gQmFyLiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQWN0aW9uQmFyIj4KKyAgICAgICAgPCEtLSBUaGUgdHlwZSBvZiBuYXZpZ2F0aW9uIHRvIHVzZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Im5hdmlnYXRpb25Nb2RlIj4KKyAgICAgICAgICAgIDwhLS0gTm9ybWFsIHN0YXRpYyB0aXRsZSB0ZXh0IC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0ibm9ybWFsIiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgICAgIDwhLS0gVGhlIGFjdGlvbiBiYXIgd2lsbCB1c2UgYSBkcm9wLWRvd24gc2VsZWN0aW9uIGluIHBsYWNlIG9mIHRpdGxlIHRleHQuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iZHJvcGRvd25MaXN0IiB2YWx1ZT0iMSIgLz4KKyAgICAgICAgICAgIDwhLS0gVGhlIGFjdGlvbiBiYXIgd2lsbCB1c2UgYSBzZXJpZXMgb2YgaG9yaXpvbnRhbCB0YWJzIGluIHBsYWNlIG9mIHRpdGxlIHRleHQuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0idGFiQmFyIiB2YWx1ZT0iMiIgLz4KKyAgICAgICAgPC9hdHRyPgorICAgICAgICA8IS0tIE9wdGlvbnMgYWZmZWN0aW5nIGhvdyB0aGUgYWN0aW9uIGJhciBpcyBkaXNwbGF5ZWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkaXNwbGF5T3B0aW9ucyI+CisgICAgICAgICAgICA8ZmxhZyBuYW1lPSJ1c2VMb2dvIiB2YWx1ZT0iMSIgLz4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9ImhpZGVIb21lIiB2YWx1ZT0iMiIgLz4KKyAgICAgICAgPC9hdHRyPgorICAgICAgICA8IS0tIFNwZWNpZmllcyB0aGUgY29sb3IgdXNlZCB0byBzdHlsZSB0aGUgYWN0aW9uIGJhci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImNvbG9yRmlsdGVyIiBmb3JtYXQ9ImNvbG9yIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyB0aXRsZSB0ZXh0IHVzZWQgZm9yIG5hdmlnYXRpb25Nb2RlPSJub3JtYWwiIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0aXRsZSIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgc3VidGl0bGUgdGV4dCB1c2VkIGZvciBuYXZpZ2F0aW9uTW9kZT0ibm9ybWFsIiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3VidGl0bGUiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIHN0eWxlIHRvIHVzZSBmb3IgdGl0bGUgdGV4dC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRpdGxlVGV4dFN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgYSBzdHlsZSB0byB1c2UgZm9yIHN1YnRpdGxlIHRleHQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzdWJ0aXRsZVRleHRTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRoZSBkcmF3YWJsZSB1c2VkIGZvciB0aGUgYXBwbGljYXRpb24gaWNvbi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Imljb24iIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRoZSBkcmF3YWJsZSB1c2VkIGZvciB0aGUgYXBwbGljYXRpb24gbG9nby4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImxvZ28iIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRoZSBkcmF3YWJsZSB1c2VkIGZvciBpdGVtIGRpdmlkZXJzLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZGl2aWRlciIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgYSBiYWNrZ3JvdW5kIGRyYXdhYmxlIGZvciB0aGUgYWN0aW9uIGJhci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImJhY2tncm91bmQiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIGEgbGF5b3V0IGZvciBjdXN0b20gbmF2aWdhdGlvbi4gT3ZlcnJpZGVzIG5hdmlnYXRpb25Nb2RlLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iY3VzdG9tTmF2aWdhdGlvbkxheW91dCIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIGEgZml4ZWQgaGVpZ2h0LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaGVpZ2h0IiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQWN0aW9uTW9kZSI+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIGEgc3R5bGUgdG8gdXNlIGZvciB0aXRsZSB0ZXh0LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idGl0bGVUZXh0U3R5bGUiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIGEgc3R5bGUgdG8gdXNlIGZvciBzdWJ0aXRsZSB0ZXh0LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3VidGl0bGVUZXh0U3R5bGUiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIGEgYmFja2dyb3VuZCBmb3IgdGhlIGFjdGlvbiBtb2RlIGJhci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImJhY2tncm91bmQiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIGEgZml4ZWQgaGVpZ2h0IGZvciB0aGUgYWN0aW9uIG1vZGUgYmFyLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaGVpZ2h0IiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIHBhZGRpbmcgdG8gdXNlIGJldHdlZW4gZWxlbWVudHMgb24gdGhlIGJhci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Iml0ZW1QYWRkaW5nIiBmb3JtYXQ9ImRpbWVuc2lvbiIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlNlYXJjaFZpZXciPgorICAgICAgICA8IS0tIFRoZSBkZWZhdWx0IHN0YXRlIG9mIHRoZSBTZWFyY2hWaWV3LiBJZiB0cnVlLCBpdCB3aWxsIGJlIGljb25pZmllZCB3aGVuIG5vdCBpbgorICAgICAgICAgICAgIHVzZSBhbmQgZXhwYW5kZWQgd2hlbiBjbGlja2VkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaWNvbmlmaWVkQnlEZWZhdWx0IiBmb3JtYXQ9ImJvb2xlYW4iLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzX21hbmlmZXN0LnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnNfbWFuaWZlc3QueG1sCmluZGV4IDI5ODQ2M2EuLjk0OWQ5NjAgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnNfbWFuaWZlc3QueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnNfbWFuaWZlc3QueG1sCkBAIC03NSw4ICs3NSw3IEBACiAgICAgICAgICBoZWFkZXIgaW4gdGhlIEFjdGlvbiBCYXIuIFRoZSBwcmltYXJ5IGRpZmZlcmVuY2VzIGJldHdlZW4gYW4gaWNvbgogICAgICAgICAgYW5kIGEgbG9nbyBhcmUgdGhhdCBsb2dvcyBhcmUgb2Z0ZW4gd2lkZXIgYW5kIG1vcmUgZGV0YWlsZWQsIGFuZCBhcmUKICAgICAgICAgIHVzZWQgd2l0aG91dCBhbiBhY2NvbXBhbnlpbmcgdGV4dCBjYXB0aW9uLiBUaGlzIG11c3QgYmUgYSByZWZlcmVuY2UKLSAgICAgICAgIHRvIGEgRHJhd2FibGUgcmVzb3VyY2UgY29udGFpbmluZyB0aGUgaW1hZ2UgZGVmaW5pdGlvbi4KLSAgICAgICAgIEBoaWRlIC0tPgorICAgICAgICAgdG8gYSBEcmF3YWJsZSByZXNvdXJjZSBjb250YWluaW5nIHRoZSBpbWFnZSBkZWZpbml0aW9uLiAtLT4KICAgICA8YXR0ciBuYW1lPSJsb2dvIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KIAogICAgIDwhLS0gTmFtZSBvZiB0aGUgYWN0aXZpdHkgdG8gYmUgbGF1bmNoZWQgdG8gbWFuYWdlIGFwcGxpY2F0aW9uJ3Mgc3BhY2Ugb24KQEAgLTIzNiw2ICsyMzUsMTAgQEAKICAgICAgICAgIHRoZSBzYWZlIG1vZGUuICAtLT4KICAgICA8YXR0ciBuYW1lPSJ2bVNhZmVNb2RlIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAKKyAgICA8IS0tIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbidzIHJlbmRlcmluZyBzaG91bGQgYmUgaGFyZHdhcmUKKyAgICAgICAgIGFjY2VsZXJhdGVkIGlmIHBvc3NpYmxlLiAgLS0+CisgICAgPGF0dHIgbmFtZT0iaGFyZHdhcmVBY2NlbGVyYXRlZCIgZm9ybWF0PSJib29sZWFuIiAvPgorCiAgICAgPCEtLSBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gY29tcG9uZW50IGlzIGF2YWlsYWJsZQogICAgICAgICAgdG8gb3RoZXIgYXBwbGljYXRpb25zLiAgSWYgZmFsc2UsIGl0IGNhbiBvbmx5IGJlIGFjY2Vzc2VkIGJ5CiAgICAgICAgICBhcHBsaWNhdGlvbnMgd2l0aCBpdHMgc2FtZSB1c2VyIGlkICh3aGljaCB1c3VhbGx5IG1lYW5zIG9ubHkgYnkKQEAgLTQwMCw4ICs0MDMsNyBAQAogICAgIDxhdHRyIG5hbWU9InN5bmNhYmxlIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgCiAgICAgPCEtLSBGbGFnIGRlY2xhcmluZyB0aGlzIGFjdGl2aXR5IHRvIGJlICdpbW1lcnNpdmUnOyBpbW1lcnNpdmUgYWN0aXZpdGllcwotICAgICAgICAgc2hvdWxkIG5vdCBiZSBpbnRlcnJ1cHRlZCB3aXRoIG90aGVyIGFjdGl2aXRpZXMgb3Igbm90aWZpY2F0aW9ucy4KLSAgICAgICAgIEBoaWRlIC0tPgorICAgICAgICAgc2hvdWxkIG5vdCBiZSBpbnRlcnJ1cHRlZCB3aXRoIG90aGVyIGFjdGl2aXRpZXMgb3Igbm90aWZpY2F0aW9ucy4gLS0+CiAgICAgPGF0dHIgbmFtZT0iaW1tZXJzaXZlIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAKICAgICA8IS0tIFNwZWNpZnkgdGhlIG9yZGVyIGluIHdoaWNoIGNvbnRlbnQgcHJvdmlkZXJzIGhvc3RlZCBieSBhIHByb2Nlc3MKQEAgLTczNSw2ICs3MzcsNyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJ0aGVtZSIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0ibGFiZWwiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9Imljb24iIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImxvZ28iIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImRlc2NyaXB0aW9uIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJwZXJtaXNzaW9uIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJwcm9jZXNzIiAvPgpAQCAtNzUzLDYgKzc1Niw3IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImVuYWJsZWQiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImRlYnVnZ2FibGUiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9InZtU2FmZU1vZGUiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImhhcmR3YXJlQWNjZWxlcmF0ZWQiIC8+CiAgICAgICAgIDwhLS0gTmFtZSBvZiBhY3Rpdml0eSB0byBiZSBsYXVuY2hlZCBmb3IgbWFuYWdpbmcgdGhlIGFwcGxpY2F0aW9uJ3Mgc3BhY2Ugb24gdGhlIGRldmljZS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9Im1hbmFnZVNwYWNlQWN0aXZpdHkiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImFsbG93Q2xlYXJVc2VyRGF0YSIgLz4KQEAgLTc5Myw2ICs3OTcsNyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJuYW1lIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJsYWJlbCIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iaWNvbiIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0ibG9nbyIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0icGVybWlzc2lvbkdyb3VwIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJkZXNjcmlwdGlvbiIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0icHJvdGVjdGlvbkxldmVsIiAvPgpAQCAtODE3LDYgKzgyMiw3IEBACiAgICAgICAgIDxhdHRyIG5hbWU9Im5hbWUiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImxhYmVsIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJpY29uIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJsb2dvIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJkZXNjcmlwdGlvbiIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIApAQCAtODQ2LDYgKzg1Miw3IEBACiAgICAgICAgIDxhdHRyIG5hbWU9Im5hbWUiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImxhYmVsIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJpY29uIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJsb2dvIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgCiAgICAgPCEtLSBUaGUgPGNvZGU+dXNlcy1wZXJtaXNzaW9uPC9jb2RlPiB0YWcgcmVxdWVzdHMgYQpAQCAtMTA1MCw2ICsxMDU3LDcgQEAKICAgICAgICAgPGF0dHIgbmFtZT0ibGFiZWwiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImRlc2NyaXB0aW9uIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJpY29uIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJsb2dvIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJwcm9jZXNzIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJhdXRob3JpdGllcyIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0ic3luY2FibGUiIC8+CkBAIC0xMTI5LDYgKzExMzcsNyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJsYWJlbCIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iZGVzY3JpcHRpb24iIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9Imljb24iIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImxvZ28iIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9InBlcm1pc3Npb24iIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9InByb2Nlc3MiIC8+CiAgICAgICAgIDwhLS0gU3BlY2lmeSB3aGV0aGVyIHRoZSBzZXJ2aWNlIGlzIGVuYWJsZWQgb3Igbm90ICh0aGF0IGlzLCBjYW4gYmUgaW5zdGFudGlhdGVkIGJ5IHRoZSBzeXN0ZW0pLgpAQCAtMTE2MSw2ICsxMTcwLDcgQEAKICAgICAgICAgPGF0dHIgbmFtZT0ibGFiZWwiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImRlc2NyaXB0aW9uIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJpY29uIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJsb2dvIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJwZXJtaXNzaW9uIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJwcm9jZXNzIiAvPgogICAgICAgICA8IS0tIFNwZWNpZnkgd2hldGhlciB0aGUgcmVjZWl2ZXIgaXMgZW5hYmxlZCBvciBub3QgKHRoYXQgaXMsIGNhbiBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlIHN5c3RlbSkuCkBAIC0xMTkzLDYgKzEyMDMsNyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJsYWJlbCIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iZGVzY3JpcHRpb24iIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9Imljb24iIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImxvZ28iIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImxhdW5jaE1vZGUiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9InNjcmVlbk9yaWVudGF0aW9uIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJjb25maWdDaGFuZ2VzIiAvPgpAQCAtMTIxOCw2ICsxMjI5LDggQEAKICAgICAgICAgICAgICB0aGlzIGFjdGl2aXR5LiAgQSB2YWx1ZSBiZXNpZGVzICJ1bnNwZWNpZmllZCIgaGVyZSBvdmVycmlkZXMKICAgICAgICAgICAgICBhbnkgdmFsdWUgaW4gdGhlIHRoZW1lLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0id2luZG93U29mdElucHV0TW9kZSIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0iaW1tZXJzaXZlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJoYXJkd2FyZUFjY2VsZXJhdGVkIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgCiAgICAgPCEtLSBUaGUgPGNvZGU+YWN0aXZpdHktYWxpYXM8L2NvZGU+IHRhZyBkZWNsYXJlcyBhIG5ldwpAQCAtMTI0Niw2ICsxMjU5LDcgQEAKICAgICAgICAgPGF0dHIgbmFtZT0ibGFiZWwiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImRlc2NyaXB0aW9uIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJpY29uIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJsb2dvIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJwZXJtaXNzaW9uIiAvPgogICAgICAgICA8IS0tIFNwZWNpZnkgd2hldGhlciB0aGUgYWN0aXZpdHktYWxpYXMgaXMgZW5hYmxlZCBvciBub3QgKHRoYXQgaXMsIGNhbiBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlIHN5c3RlbSkuCiAgICAgICAgICAgICAgSXQgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGZvciBhbiBhcHBsaWNhdGlvbiBhcyBhIHdob2xlLCBpbiB3aGljaCBjYXNlIGEgdmFsdWUgb2YgImZhbHNlIgpAQCAtMTMxNSw2ICsxMzI5LDcgQEAKICAgICAgICAgIHBhcmVudD0iQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHkgQW5kcm9pZE1hbmlmZXN0UmVjZWl2ZXIgQW5kcm9pZE1hbmlmZXN0U2VydmljZSI+CiAgICAgICAgIDxhdHRyIG5hbWU9ImxhYmVsIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJpY29uIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJsb2dvIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJwcmlvcml0eSIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIApAQCAtMTQyMSw2ICsxNDM2LDcgQEAKICAgICAgICAgPGF0dHIgbmFtZT0idGFyZ2V0UGFja2FnZSIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0ibGFiZWwiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9Imljb24iIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImxvZ28iIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImhhbmRsZVByb2ZpbGluZyIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iZnVuY3Rpb25hbFRlc3QiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbAppbmRleCBiNmFmNmIyLi42MjMzNjhkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbG9ycy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb2xvcnMueG1sCkBAIC0xOCw4ICsxOCw4IEBACiAqLwogLS0+CiA8cmVzb3VyY2VzPgotCTxkcmF3YWJsZSBuYW1lPSJzY3JlZW5fYmFja2dyb3VuZF9saWdodCI+I2ZmZmZmZmZmPC9kcmF3YWJsZT4KLQk8ZHJhd2FibGUgbmFtZT0ic2NyZWVuX2JhY2tncm91bmRfZGFyayI+I2ZmMDAwMDAwPC9kcmF3YWJsZT4KKwkgIDxkcmF3YWJsZSBuYW1lPSJzY3JlZW5fYmFja2dyb3VuZF9saWdodCI+I2ZmZjNmM2YzPC9kcmF3YWJsZT4KKwkgIDxkcmF3YWJsZSBuYW1lPSJzY3JlZW5fYmFja2dyb3VuZF9kYXJrIj4jZmYwMDAwMDA8L2RyYXdhYmxlPgogICAgIDxkcmF3YWJsZSBuYW1lPSJzdGF0dXNfYmFyX2Nsb3NlZF9kZWZhdWx0X2JhY2tncm91bmQiPiNmZjAwMDAwMDwvZHJhd2FibGU+CiAgICAgPGRyYXdhYmxlIG5hbWU9InN0YXR1c19iYXJfb3BlbmVkX2RlZmF1bHRfYmFja2dyb3VuZCI+I2ZmMDAwMDAwPC9kcmF3YWJsZT4KICAgICA8ZHJhd2FibGUgbmFtZT0ic2VhcmNoX2Jhcl9kZWZhdWx0X2NvbG9yIj4jZmYwMDAwMDA8L2RyYXdhYmxlPgpAQCAtMzcsMjMgKzM3LDI5IEBACiAgICAgPGNvbG9yIG5hbWU9ImJsYWNrIj4jZmYwMDAwMDA8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJ0cmFuc3BhcmVudCI+IzAwMDAwMDAwPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iYmFja2dyb3VuZF9kYXJrIj4jZmYwMDAwMDA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9kYXJrIj4jZmZmZmZmZmY8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJiYWNrZ3JvdW5kX2xpZ2h0Ij4jZmZmM2YzZjM8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9kYXJrIj5AYW5kcm9pZDpjb2xvci9iYWNrZ3JvdW5kX2xpZ2h0PC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHQiPkBhbmRyb2lkOmNvbG9yL2JhY2tncm91bmRfZGFyazwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2RhcmtfZGlzYWJsZWQiPiM4MGZmZmZmZjwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZSI+I2ZmMDAwMDAwPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHRfZGlzYWJsZWQiPiM4MDAwMDAwMDwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHQ8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9saWdodF9pbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9kYXJrPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iZGltX2ZvcmVncm91bmRfZGFyayI+I2JlYmViZTwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImRpbV9mb3JlZ3JvdW5kX2RhcmtfZGlzYWJsZWQiPiM4MGJlYmViZTwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImRpbV9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZSI+IzMyMzIzMjwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImRpbV9mb3JlZ3JvdW5kX2RhcmtfaW52ZXJzZV9kaXNhYmxlZCI+IzgwMzIzMjMyPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iaGludF9mb3JlZ3JvdW5kX2RhcmsiPiM4MDgwODA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJiYWNrZ3JvdW5kX2xpZ2h0Ij4jZmZmZmZmZmY8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9saWdodCI+I2ZmMDAwMDAwPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHRfaW52ZXJzZSI+I2ZmZmZmZmZmPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHRfZGlzYWJsZWQiPiM4MDAwMDAwMDwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImRpbV9mb3JlZ3JvdW5kX2xpZ2h0Ij4jMzIzMjMyPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iZGltX2ZvcmVncm91bmRfbGlnaHRfZGlzYWJsZWQiPiM4MDMyMzIzMjwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImRpbV9mb3JlZ3JvdW5kX2xpZ2h0X2ludmVyc2UiPiNiZWJlYmU8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9saWdodF9pbnZlcnNlX2Rpc2FibGVkIj4jODBiZWJlYmU8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJoaW50X2ZvcmVncm91bmRfbGlnaHQiPiM4MDgwODA8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJoaWdobGlnaHRfYmFja2dyb3VuZCI+I2NjNDc1OTI1PC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iaGlnaGxpZ2h0X2JhY2tncm91bmRfaW52ZXJzZSI+I2NjZDJlNDYxPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iaGlnaGxpZ2h0ZWRfdGV4dF9kYXJrIj4jY2M0NzU5MjU8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJoaWdobGlnaHRlZF90ZXh0X2xpZ2h0Ij4jY2NkMmU0NjE8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJsaW5rX3RleHRfZGFyayI+IzVjNWNmZjwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImxpbmtfdGV4dF9saWdodCI+IzAwMDBlZTwvY29sb3I+CiAKICAgICA8ZHJhd2FibGUgbmFtZT0ic3RhdF9ub3RpZnlfc3luY19ub2FuaW0iPkBkcmF3YWJsZS9zdGF0X25vdGlmeV9zeW5jX2FuaW0wPC9kcmF3YWJsZT4KICAgICA8ZHJhd2FibGUgbmFtZT0ic3RhdF9zeXNfZG93bmxvYWRfZG9uZSI+QGRyYXdhYmxlL3N0YXRfc3lzX2Rvd25sb2FkX2FuaW0wPC9kcmF3YWJsZT4KQEAgLTk3LDUgKzEwMywzMiBAQAogICAgIDxjb2xvciBuYW1lPSJrZXlndWFyZF90ZXh0X2NvbG9yX3NvdW5kb24iPiNlNjkzMTA8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJrZXlndWFyZF90ZXh0X2NvbG9yX2RlY2xpbmUiPiNmZTBhNWE8L2NvbG9yPgogCisgICAgPCEtLSBGb3IgaG9sbyB0aGVtZSAtLT4KKwkgIDxkcmF3YWJsZSBuYW1lPSJzY3JlZW5fYmFja2dyb3VuZF9ob2xvX2xpZ2h0Ij4jZmZmM2YzZjM8L2RyYXdhYmxlPgorCSAgPGRyYXdhYmxlIG5hbWU9InNjcmVlbl9iYWNrZ3JvdW5kX2hvbG9fZGFyayI+I2ZmMDAwMDAwPC9kcmF3YWJsZT4KKyAgICA8Y29sb3IgbmFtZT0iYmFja2dyb3VuZF9ob2xvX2RhcmsiPiNmZjAwMDAwMDwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJhY2tncm91bmRfaG9sb19saWdodCI+I2ZmZjNmM2YzPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfaG9sb19kYXJrIj5AYW5kcm9pZDpjb2xvci9iYWNrZ3JvdW5kX2hvbG9fbGlnaHQ8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9ob2xvX2xpZ2h0Ij5AYW5kcm9pZDpjb2xvci9iYWNrZ3JvdW5kX2hvbG9fZGFyazwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2Rpc2FibGVkX2hvbG9fZGFyayI+IzgwZmZmZmZmPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfZGlzYWJsZWRfaG9sb19saWdodCI+IzgwMDAwMDAwPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfaW52ZXJzZV9ob2xvX2RhcmsiPkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2hvbG9fbGlnaHQ8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9pbnZlcnNlX2hvbG9fbGlnaHQiPkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2hvbG9fZGFyazwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImRpbV9mb3JlZ3JvdW5kX2hvbG9fZGFyayI+I2JlYmViZTwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImRpbV9mb3JlZ3JvdW5kX2Rpc2FibGVkX2hvbG9fZGFyayI+IzgwYmViZWJlPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iZGltX2ZvcmVncm91bmRfaW52ZXJzZV9ob2xvX2RhcmsiPiMzMjMyMzI8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9pbnZlcnNlX2Rpc2FibGVkX2hvbG9fZGFyayI+IzgwMzIzMjMyPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iaGludF9mb3JlZ3JvdW5kX2hvbG9fZGFyayI+IzgwODA4MDwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImRpbV9mb3JlZ3JvdW5kX2hvbG9fbGlnaHQiPiMzMjMyMzI8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9kaXNhYmxlZF9ob2xvX2xpZ2h0Ij4jODAzMjMyMzI8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9pbnZlcnNlX2hvbG9fbGlnaHQiPiNiZWJlYmU8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9pbnZlcnNlX2Rpc2FibGVkX2hvbG9fbGlnaHQiPiM4MGJlYmViZTwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImhpbnRfZm9yZWdyb3VuZF9ob2xvX2xpZ2h0Ij4jODA4MDgwPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iaGlnaGxpZ2h0X2JhY2tncm91bmRfaG9sbyI+I2NjNDc1OTI1PC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iaGlnaGxpZ2h0X2JhY2tncm91bmRfaW52ZXJzZV9ob2xvIj4jY2NkMmU0NjE8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJoaWdobGlnaHRlZF90ZXh0X2hvbG9fZGFyayI+I2NjNDc1OTI1PC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iaGlnaGxpZ2h0ZWRfdGV4dF9ob2xvX2xpZ2h0Ij4jY2NkMmU0NjE8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJsaW5rX3RleHRfaG9sb19kYXJrIj4jNWM1Y2ZmPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0ibGlua190ZXh0X2hvbG9fbGlnaHQiPiMwMDAwZWU8L2NvbG9yPgogPC9yZXNvdXJjZXM+CiAKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29uZmlnLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29uZmlnLnhtbAppbmRleCA3MDIzNjQ3Li43MTk2N2Q0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb25maWcueG1sCkBAIC0yMiw3ICsyMiw4IEBACiA8cmVzb3VyY2VzIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KICAgICA8IS0tIENvbXBvbmVudCB0byBiZSB1c2VkIGFzIHRoZSBzdGF0dXMgYmFyIHNlcnZpY2UuICBNdXN0IGltcGxlbWVudCB0aGUgSVN0YXR1c0JhcgogICAgICAgICAgaW50ZXJmYWNlLiAgVGhpcyBuYW1lIGlzIGluIHRoZSBDb21wb25lbnROYW1lIGZsYXR0ZW5lZCBmb3JtYXQgKHBhY2thZ2UvY2xhc3MpICAtLT4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbmZpZ19zdGF0dXNCYXJDb21wb25lbnQiPmNvbS5hbmRyb2lkLnN5c3RlbXVpL2NvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5TdGF0dXNCYXJTZXJ2aWNlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjb25maWdfc3RhdHVzQmFyQ29tcG9uZW50Ij5jb20uYW5kcm9pZC5zeXN0ZW11aS9jb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuUGhvbmVTdGF0dXNCYXJTZXJ2aWNlPC9zdHJpbmc+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX3N0YXR1c0JhckNhbkhpZGUiPnRydWU8L2Jvb2w+CiAKICAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuIERlZmluZXMgdGhlIHNsb3RzIGZvciB0aGUgcmlnaHQtaGFuZCBzaWRlIGljb25zLiAgVGhhdCBpcyB0byBzYXksIHRoZQogICAgICAgICAgaWNvbnMgaW4gdGhlIHN0YXR1cyBiYXIgdGhhdCBhcmUgbm90IG5vdGlmaWNhdGlvbnMuIC0tPgpAQCAtNzEsNiArNzIsMTcgQEAKICAgICAgICAgIHdoZW4gdGhlcmUncyBubyBuZXR3b3JrIGNvbm5lY3Rpb24uIElmIHRoZSBzY2FuIGRvZXNuJ3QgdGltZW91dCwgdXNlIHplcm8gLS0+CiAgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX3JhZGlvU2Nhbm5pbmdUaW1lb3V0Ij4wPC9pbnRlZ2VyPgogCisgICAgPCEtLSBTZXQgdG8gdHJ1ZSBpZiB0aGUgbG9jYXRpb24gcmV0dXJuZWQgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkKKyAgICAgICAgIGlzIGFjdHVhbGx5IGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBpbnRlcm5hbCBzdG9yYWdlLgorICAgICAgICAgSWYgdGhpcyBpcyBzZXQgdGhlbiBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VTdGF0ZSgpIHdpbGwgYWx3YXlzIHJldHVybgorICAgICAgICAgTUVESUFfTU9VTlRFRCBhbmQgSW50ZW50LkFDVElPTl9NRURJQV9NT1VOVEVEIHdpbGwgYmUgYnJvYWRjYXN0IGF0IGJvb3QgdGltZQorICAgICAgICAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBhcHBzIHRoYXQgcmVxdWlyZSBleHRlcm5hbCBzdG9yYWdlLiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfZW11bGF0ZUV4dGVybmFsU3RvcmFnZSI+ZmFsc2U8L2Jvb2w+CisKKyAgICA8IS0tIFNldCB0byB0cnVlIGlmIGV4dGVybmFsIHN0b3JhZ2UgaXMgY2FzZSBzZW5zaXRpdmUuCisgICAgICAgICBUeXBpY2FsbHkgZXh0ZXJuYWwgc3RvcmFnZSBpcyBGQVQsIHdoaWNoIGlzIGNhc2UgaW5zZW5zaXRpdmUuIC0tPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19jYXNlU2Vuc2l0aXZlRXh0ZXJuYWxTdG9yYWdlIj5mYWxzZTwvYm9vbD4KKyAgICAKICAgICA8IS0tIEEgcHJvZHVjdCB3aXRoIG5vIFNEIGNhcmQgPT0gbm90IHJlbW92YWJsZS4gLS0+CiAgICAgPGJvb2wgbmFtZT0iY29uZmlnX2V4dGVybmFsU3RvcmFnZVJlbW92YWJsZSIgcHJvZHVjdD0ibm9zZGNhcmQiPmZhbHNlPC9ib29sPgogICAgIDwhLS0gQ29uZmlndXJlcyB3aGV0aGVyIHRoZSBwcmltYXJ5IGV4dGVybmFsIHN0b3JhZ2UgZGV2aWNlIGlzCkBAIC0xMDYsNiArMTE4LDkgQEAKICAgICAgICAgPGl0ZW0+IjAsMSI8L2l0ZW0+CiAgICAgPC9zdHJpbmctYXJyYXk+CiAKKyAgICA8IS0tIFRoZSBtYXhpbXVtIGR1cmF0aW9uIChpbiBtaWxsaXNlY29uZHMpIHdlIGV4cGVjdCBhIG5ldHdvcmsgdHJhbnNpdGlvbiB0byB0YWtlIC0tPgorICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19uZXR3b3JrVHJhbnNpdGlvblRpbWVvdXQiPjYwMDAwPC9pbnRlZ2VyPgorCiAgICAgPCEtLSBMaXN0IG9mIHJlZ2V4cHJlc3Npb25zIGRlc2NyaWJpbmcgdGhlIGludGVyZmFjZSAoaWYgYW55KSB0aGF0IHJlcHJlc2VudCB0ZXRoZXJhYmxlCiAgICAgICAgICBVU0IgaW50ZXJmYWNlcy4gIElmIHRoZSBkZXZpY2UgZG9lc24ndCB3YW50IHRvIHN1cHBvcnQgdGV0aGluZyBvdmVyIFVTQiB0aGlzIHNob3VsZAogICAgICAgICAgYmUgZW1wdHkuICBBbiBleGFtcGxlIHdvdWxkIGJlICJ1c2IuKiIgLS0+CkBAIC0xMTgsNiArMTMzLDE2IEBACiAgICAgPHN0cmluZy1hcnJheSB0cmFuc2xhdGFibGU9ImZhbHNlIiBuYW1lPSJjb25maWdfdGV0aGVyX3dpZmlfcmVnZXhzIj4KICAgICA8L3N0cmluZy1hcnJheT4KIAorICAgIDwhLS0gTGlzdCBvZiByZWdleHByZXNzaW9ucyBkZXNjcmliaW5nIHRoZSBpbnRlcmZhY2UgKGlmIGFueSkgdGhhdCByZXByZXNlbnQgdGV0aGVyYWJsZQorICAgICAgICAgYmx1ZXRvb3RoIGludGVyZmFjZXMuICBJZiB0aGUgZGV2aWNlIGRvZXNuJ3Qgd2FudCB0byBzdXBwb3J0IHRldGhlcmluZyBvdmVyIGJsdWV0b290aCB0aGlzCisgICAgICAgICBzaG91bGQgYmUgZW1wdHkuIC0tPgorICAgIDxzdHJpbmctYXJyYXkgdHJhbnNsYXRhYmxlPSJmYWxzZSIgbmFtZT0iY29uZmlnX3RldGhlcl9ibHVldG9vdGhfcmVnZXhzIj4KKyAgICA8L3N0cmluZy1hcnJheT4KKworICAgIDwhLS0gTWF4IG51bWJlciBvZiBCbHVldG9vdGggdGV0aGVyaW5nIGNvbm5lY3Rpb25zIGFsbG93ZWQuIElmIHRoaXMgaXMKKyAgICAgICAgIHVwZGF0ZWQgY29uZmlnX3RldGhlcl9kaGNwX3JhbmdlIGhhcyB0byBiZSB1cGRhdGVkIGFwcHJvcHJpYXRlbHkuIC0tPgorICAgIDxpbnRlZ2VyIHRyYW5zbGF0ZWFibGU9ImZhbHNlIiBuYW1lPSJjb25maWdfbWF4X3Bhbl9kZXZpY2VzIj41PC9pbnRlZ2VyPgorCiAgICAgPCEtLSBEaGNwIHJhbmdlIChtaW4sIG1heCkgdG8gdXNlIGZvciB0ZXRoZXJpbmcgcHVycG9zZXMgLS0+CiAgICAgPHN0cmluZy1hcnJheSB0cmFuc2xhdGFibGU9ImZhbHNlIiBuYW1lPSJjb25maWdfdGV0aGVyX2RoY3BfcmFuZ2UiPgogICAgIDwvc3RyaW5nLWFycmF5PgpAQCAtMTk5LDYgKzIyNCw5IEBACiAgICAgPCEtLSBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBTRCBjYXJkIGlzIGFjY2Vzc2libGUgd2l0aG91dCByZW1vdmluZyB0aGUgYmF0dGVyeS4gLS0+CiAgICAgPGJvb2wgbmFtZT0iY29uZmlnX2JhdHRlcnlTZENhcmRBY2Nlc3NpYmlsaXR5Ij5mYWxzZTwvYm9vbD4KIAorICAgIDwhLS0gSW5kaWNhdGUgd2hldGhlciB0aGUgZGV2aWNlIGhhcyBVU0IgaG9zdCBzdXBwb3J0LiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfaGFzVXNiSG9zdFN1cHBvcnQiPmZhbHNlPC9ib29sPgorCiAgICAgPCEtLSBWaWJyYXRvciBwYXR0ZXJuIGZvciBmZWVkYmFjayBhYm91dCBhIGxvbmcgc2NyZWVuL2tleSBwcmVzcyAtLT4KICAgICA8aW50ZWdlci1hcnJheSBuYW1lPSJjb25maWdfbG9uZ1ByZXNzVmliZVBhdHRlcm4iPgogICAgICAgICA8aXRlbT4wPC9pdGVtPgpAQCAtMjgxLDYgKzMwOSwxNSBAQAogICAgIDwhLS0gQWxsb3cgdGhlIG1lbnUgaGFyZCBrZXkgdG8gYmUgZGlzYWJsZWQgaW4gTG9ja1NjcmVlbiBvbiBzb21lIGRldmljZXMgLS0+CiAgICAgPGJvb2wgbmFtZT0iY29uZmlnX2Rpc2FibGVNZW51S2V5SW5Mb2NrU2NyZWVuIj5mYWxzZTwvYm9vbD4KIAorICAgIDwhLS0gU2hvdyBzbGlkaW5nIHRhYiBiZWZvcmUgbG9ja3NjcmVlbiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfZW5hYmxlU2xpZGluZ1RhYkZpcnN0Ij50cnVlPC9ib29sPgorCisgICAgPCEtLSBEaWFibGUgbG9ja3NjcmVlbiByb3RhdGlvbiBieSBkZWZhdWx0IC0tPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19lbmFibGVMb2NrU2NyZWVuUm90YXRpb24iPmZhbHNlPC9ib29sPgorCisgICAgPCEtLSBFbmFibGUgM0QgUmVjZW50QXBwbGljYXRpb25zIHZpZXcgLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX2VuYWJsZVJlY2VudEFwcHMzRCI+ZmFsc2U8L2Jvb2w+CisKICAgICA8IS0tIEFycmF5IG9mIGxpZ2h0IHNlbnNvciBMVVggdmFsdWVzIHRvIGRlZmluZSBvdXIgbGV2ZWxzIGZvciBhdXRvIGJhY2tsaWdodCBicmlnaHRuZXNzIHN1cHBvcnQuCiAgICAgICAgICBUaGUgTiBlbnRyaWVzIG9mIHRoaXMgYXJyYXkgZGVmaW5lIE4gKyAxIHpvbmVzIGFzIGZvbGxvd3M6CiAKQEAgLTM2NSw2ICs0MDIsMzAgQEAKICAgICA8IS0tIDIgbWVhbnMgZ2l2ZSB3YXJuaW5nIC0tPgogICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19kYXRhdXNlX25vdGlmaWNhdGlvbl90eXBlIj4yPC9pbnRlZ2VyPgogCisgICAgPCEtLSBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgY3VycmVudCBkZXZpY2UgaXMgInZvaWNlIGNhcGFibGUiLgorICAgICAgICAgSWYgdHJ1ZSwgdGhpcyBtZWFucyB0aGF0IHRoZSBkZXZpY2Ugc3VwcG9ydHMgY2lyY3VpdC1zd2l0Y2hlZAorICAgICAgICAgKGkuZS4gdm9pY2UpIHBob25lIGNhbGxzIG92ZXIgdGhlIHRlbGVwaG9ueSBuZXR3b3JrLCBhbmQgaXMKKyAgICAgICAgIGFsbG93ZWQgdG8gZGlzcGxheSB0aGUgaW4tY2FsbCBVSSB3aGlsZSBhIGNlbGx1bGFyIHZvaWNlIGNhbGwgaXMKKyAgICAgICAgIGFjdGl2ZS4gIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gdG8gZmFsc2UgZm9yICJkYXRhIG9ubHkiIGRldmljZXMKKyAgICAgICAgIHdoaWNoIGNhbid0IG1ha2Ugdm9pY2UgY2FsbHMgYW5kIGRvbid0IHN1cHBvcnQgYW55IGluLWNhbGwgVUkuCisKKyAgICAgICAgIE5vdGU6IHRoaXMgZmxhZyBpcyBzdWJ0bHkgZGlmZmVyZW50IGZyb20gdGhlCisgICAgICAgICBQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1RFTEVQSE9OWSBzeXN0ZW0gZmVhdHVyZSwgd2hpY2ggaXMKKyAgICAgICAgIGF2YWlsYWJsZSBvbiAqYW55KiBkZXZpY2Ugd2l0aCBhIHRlbGVwaG9ueSByYWRpbywgZXZlbiBpZiB0aGUKKyAgICAgICAgIGRldmljZSBpcyBkYXRhLW9ubHkuIC0tPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ192b2ljZV9jYXBhYmxlIj50cnVlPC9ib29sPgorCisgICAgPCEtLSBJUCBhZGRyZXNzIG9mIHRoZSBkbnMgc2VydmVyIHRvIHVzZSBpZiBub2JvZHkgZWxzZSBzdWdnZXN0cyBvbmUgLS0+CisgICAgPHN0cmluZyBuYW1lPSJjb25maWdfZGVmYXVsdF9kbnNfc2VydmVyIj44LjguOC44PC9zdHJpbmc+CisKKyAgICA8IS0tIFRoZSBkZWZhdWx0IGNoYXJhY3RlciBzZXQgZm9yIEdzbUFscGhhYmV0IC0tPgorICAgIDwhLS0gRW1wdHkgc3RyaW5nIG1lYW5zIE1CQ1MgaXMgbm90IGNvbnNpZGVyZWQgLS0+CisgICAgPHN0cmluZyBuYW1lPSJnc21fYWxwaGFiZXRfZGVmYXVsdF9jaGFyc2V0Ij48L3N0cmluZz4KKwogICAgIDwhLS0gRW5hYmxlcyBTSVAgb24gV0lGSSBvbmx5IC0tPgogICAgIDxib29sIG5hbWU9ImNvbmZpZ19zaXBfd2lmaV9vbmx5Ij5mYWxzZTwvYm9vbD4KKworICAgIDwhLS0gTnVtYmVyIG9mIGRhdGFiYXNlIGNvbm5lY3Rpb25zIG9wZW5lZCBhbmQgbWFuYWdlZCBieSBmcmFtZXdvcmsgbGF5ZXIKKyAgICAgICAgIHRvIGhhbmRsZSBxdWVyaWVzIG9uIGVhY2ggZGF0YWJhc2UuIC0tPgorICAgIDxpbnRlZ2VyIG5hbWU9ImRiX2Nvbm5lY3Rpb25fcG9vbF9zaXplIj4xPC9pbnRlZ2VyPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2RpbWVucy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2RpbWVucy54bWwKaW5kZXggMTFmM2U1MC4uMTcxYmI0NSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbApAQCAtMjUsNiArMjUsOSBAQAogICAgIDwhLS0gVGhlIHN0YW5kYXJkIHNpemUgKGJvdGggd2lkdGggYW5kIGhlaWdodCkgb2YgYW4gYXBwbGljYXRpb24gaWNvbiB0aGF0CiAgICAgICAgICB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgYXBwIGxhdW5jaGVyIGFuZCBlbHNld2hlcmUuIC0tPgogICAgIDxkaW1lbiBuYW1lPSJhcHBfaWNvbl9zaXplIj40OGRpcDwvZGltZW4+CisgICAgPCEtLSBUaGUgc3RhbmRhcmQgc2l6ZSAoYm90aCB3aWR0aCBhbmQgaGVpZ2h0KSBvZiBhbiBhY3Rpb24gaWNvbiB0aGF0IHdpbGwKKyAgICAgICAgIGJlIGRpc3BsYXllZCBpbiBhcHBsaWNhdGlvbiBhY3Rpb24gYmFycy4gLS0+CisgICAgPGRpbWVuIG5hbWU9ImFjdGlvbl9pY29uX3NpemUiPjQ4ZGlwPC9kaW1lbj4KICAgICA8ZGltZW4gbmFtZT0idG9hc3RfeV9vZmZzZXQiPjY0ZGlwPC9kaW1lbj4KICAgICA8IS0tIEhlaWdodCBvZiB0aGUgc3RhdHVzIGJhciAtLT4KICAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9oZWlnaHQiPjI1ZGlwPC9kaW1lbj4KQEAgLTMyLDE0ICszNSwyMiBAQAogICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2ljb25fc2l6ZSI+MjVkaXA8L2RpbWVuPgogICAgIDwhLS0gTWFyZ2luIGF0IHRoZSBlZGdlIG9mIHRoZSBzY3JlZW4gdG8gaWdub3JlIHRvdWNoIGV2ZW50cyBmb3IgaW4gdGhlIHdpbmRvd3NoYWRlLiAtLT4KICAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9lZGdlX2lnbm9yZSI+NWRwPC9kaW1lbj4KKyAgICA8IS0tIE1hcmdpbiBmb3IgcGVybWFuZW50IHNjcmVlbiBkZWNvcmF0aW9ucyBhdCB0aGUgYm90dG9tLiAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic2NyZWVuX21hcmdpbl9ib3R0b20iPjBkaXA8L2RpbWVuPgogICAgIDwhLS0gU2l6ZSBvZiB0aGUgZmFzdHNjcm9sbCBoaW50IGxldHRlciAtLT4KICAgICA8ZGltZW4gbmFtZT0iZmFzdHNjcm9sbF9vdmVybGF5X3NpemUiPjEwNGRwPC9kaW1lbj4KICAgICA8IS0tIFdpZHRoIG9mIHRoZSBmYXN0c2Nyb2xsIHRodW1iIC0tPgogICAgIDxkaW1lbiBuYW1lPSJmYXN0c2Nyb2xsX3RodW1iX3dpZHRoIj42NGRwPC9kaW1lbj4KICAgICA8IS0tIEhlaWdodCBvZiB0aGUgZmFzdHNjcm9sbCB0aHVtYiAtLT4KICAgICA8ZGltZW4gbmFtZT0iZmFzdHNjcm9sbF90aHVtYl9oZWlnaHQiPjUyZHA8L2RpbWVuPgotICAgIDwhLS0gRGVmYXVsdCBoZWlnaHQgb2YgYSBrZXkgaW4gdGhlIHBhc3N3b3JkIGtleWJvYXJkIC0tPgotICAgIDxkaW1lbiBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0Ij41NmRpcDwvZGltZW4+CisgICAgPCEtLSBNaW4gd2lkdGggZm9yIGEgdGFibGV0IGRldmljZSAtLT4KKyAgICA8ZGltZW4gbmFtZT0ibWluX3hsYXJnZV9zY3JlZW5fd2lkdGgiPjgwMGRwPC9kaW1lbj4KKyAgICA8IS0tIEZpeGVkIHZpZXdwb3J0IG1hcmdpbiBmb3Igd2Vic2l0ZSBjb250ZW50IHdpZHRoIGNoYW5nZSAtLT4KKyAgICA8ZGltZW4gbmFtZT0iZml4ZWRfdmlld3BvcnRfbWFyZ2luIj43ZHA8L2RpbWVuPgorICAgIDwhLS0gRGVmYXVsdCBoZWlnaHQgb2YgYSBrZXkgaW4gdGhlIHBhc3N3b3JkIGtleWJvYXJkIGZvciBhbHBoYSAtLT4KKyAgICA8ZGltZW4gbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSI+NTZkaXA8L2RpbWVuPgorICAgIDwhLS0gRGVmYXVsdCBoZWlnaHQgb2YgYSBrZXkgaW4gdGhlIHBhc3N3b3JkIGtleWJvYXJkIGZvciBudW1lcmljIC0tPgorICAgIDxkaW1lbiBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X251bWVyaWMiPjU2ZGlwPC9kaW1lbj4KICAgICA8IS0tIERlZmF1bHQgY29ycmVjdGlvbiBmb3IgdGhlIHNwYWNlIGtleSBpbiB0aGUgcGFzc3dvcmQga2V5Ym9hcmQgLS0+CiAgICAgPGRpbWVuIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX3NwYWNlYmFyX3ZlcnRpY2FsX2NvcnJlY3Rpb24iPjRkaXA8L2RpbWVuPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2lkcy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2lkcy54bWwKaW5kZXggOGI2YWY3MS4uMzNjZDEwMCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9pZHMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvaWRzLnhtbApAQCAtNTksNiArNTksNyBAQAogICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0iY29weSIgLz4KICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9InBhc3RlIiAvPgogICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0iY29weVVybCIgLz4KKyAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9InNlbGVjdFRleHRNb2RlIiAvPgogICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0ic3dpdGNoSW5wdXRNZXRob2QiIC8+CiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJrZXlib2FyZFZpZXciIC8+CiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJjbG9zZUJ1dHRvbiIgLz4KQEAgLTY4LDQgKzY5LDUgQEAKICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9ImFjY291bnRQcmVmZXJlbmNlcyIgLz4KICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9InNtYWxsSWNvbiIgLz4KICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9ImN1c3RvbSIgLz4KKyAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9ImhvbWUiIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvcHVibGljLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvcHVibGljLnhtbAppbmRleCAxMGNiNDQ2Li4yYzNjNGZjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3B1YmxpYy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9wdWJsaWMueG1sCkBAIC0xMTgzLDcgKzExODMsNyBAQAogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImNvbG9yQmFja2dyb3VuZENhY2hlSGludCIgaWQ9IjB4MDEwMTAyYWIiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0IiBpZD0iMHgwMTAxMDJhYyIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJkcm9wRG93blZlcnRpY2FsT2Zmc2V0IiBpZD0iMHgwMTAxMDJhZCIgLz4KLSAgCisKICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuV2FsbHBhcGVyIiBpZD0iMHgwMTAzMDA1ZSIgLz4KICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuV2FsbHBhcGVyLk5vVGl0bGVCYXIiIGlkPSIweDAxMDMwMDVmIiAvPgogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5XYWxscGFwZXIuTm9UaXRsZUJhci5GdWxsc2NyZWVuIiBpZD0iMHgwMTAzMDA2MCIgLz4KQEAgLTExOTEsNyArMTE5MSw3IEBACiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLkxpZ2h0LldhbGxwYXBlclNldHRpbmdzIiBpZD0iMHgwMTAzMDA2MiIgLz4KICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU2VhcmNoUmVzdWx0LlRpdGxlIiBpZD0iMHgwMTAzMDA2MyIgLz4KICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU2VhcmNoUmVzdWx0LlN1YnRpdGxlIiBpZD0iMHgwMTAzMDA2NCIgLz4KLSAgCisKICAgPCEtLSBTZW1pLXRyYW5zcGFyZW50IGJhY2tncm91bmQgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIHBsYWNpbmcgYSBkYXJrCiAgICAgICAgdGhlbWVkIFVJIG9uIHRvcCBvZiBzb21lIGFyYml0cmFyeSBiYWNrZ3JvdW5kIChzdWNoIGFzIHRoZQogICAgICAgIHdhbGxwYXBlcikuICBUaGlzIGRhcmtlbnMgdGhlIGJhY2tncm91bmQgc3VmZmljaWVudGx5IHRoYXQgdGhlIFVJCkBAIC0xMTk5LDcgKzExOTksNyBAQAogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJzY3JlZW5fYmFja2dyb3VuZF9kYXJrX3RyYW5zcGFyZW50IiBpZD0iMHgwMTA4MDBhOSIgLz4KICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0ic2NyZWVuX2JhY2tncm91bmRfbGlnaHRfdHJhbnNwYXJlbnQiIGlkPSIweDAxMDgwMGFhIiAvPgogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJzdGF0X25vdGlmeV9zZGNhcmRfcHJlcGFyZSIgaWQ9IjB4MDEwODAwYWIiIC8+Ci0gIAorCiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBSZXNvdXJjZXMgYWRkZWQgaW4gdmVyc2lvbiA2IG9mIHRoZSBwbGF0Zm9ybSAoRWNsYWlyIDIuMC4xKS4KICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtMTIxMSw3ICsxMjExLDcgQEAKICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJxdWlja0NvbnRhY3RCYWRnZVN0eWxlU21hbGxXaW5kb3dTbWFsbCIgaWQ9IjB4MDEwMTAyYjEiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0icXVpY2tDb250YWN0QmFkZ2VTdHlsZVNtYWxsV2luZG93TWVkaXVtIiBpZD0iMHgwMTAxMDJiMiIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJxdWlja0NvbnRhY3RCYWRnZVN0eWxlU21hbGxXaW5kb3dMYXJnZSIgaWQ9IjB4MDEwMTAyYjMiIC8+Ci0gIAorCiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBSZXNvdXJjZXMgYWRkZWQgaW4gdmVyc2lvbiA3IG9mIHRoZSBwbGF0Zm9ybSAoRWNsYWlyIE1SMSkuCiAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTEyMjAsNyArMTIyMCw3IEBACiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYXV0aG9yIiBpZD0iMHgwMTAxMDJiNCIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhdXRvU3RhcnQiIGlkPSIweDAxMDEwMmI1IiAvPgogCi0gICAgCisKIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIFJlc291cmNlcyBhZGRlZCBpbiB2ZXJzaW9uIDggb2YgdGhlIHBsYXRmb3JtIChFY2xhaXIgTVIyKS4KICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtMTI0MSwxOSArMTI0MSwxNiBAQAogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InRhYlN0cmlwRW5hYmxlZCIgaWQ9IjB4MDEwMTAyYmQiIC8+CiAKICAgPHB1YmxpYyB0eXBlPSJpZCIgbmFtZT0iY3VzdG9tIiBpZD0iMHgwMTAyMDAyYiIgLz4KLSAgICAKKwogICA8cHVibGljIHR5cGU9ImFuaW0iIG5hbWU9ImN5Y2xlX2ludGVycG9sYXRvciIgaWQ9IjB4MDEwYTAwMGMiIC8+CiAKIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIFJlc291cmNlcyBpbnRyb2R1Y2VkIGluIEdpbmdlcmJyZWFkLgogICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgIAorICA8ZWF0LWNvbW1lbnQgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJsb2dvIiBpZD0iMHgwMTAxMDJiZSIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ4bGFyZ2VTY3JlZW5zIiBpZD0iMHgwMTAxMDJiZiIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJpbW1lcnNpdmUiIGlkPSIweDAxMDEwMmMwIiAvPgotICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Im92ZXJzY3JvbGxNb2RlIiBpZD0iMHgwMTAxMDJjMSIgLz4KLSAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJvdmVyc2Nyb2xsSGVhZGVyIiBpZD0iMHgwMTAxMDJjMiIgLz4KLSAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJvdmVyc2Nyb2xsRm9vdGVyIiBpZD0iMHgwMTAxMDJjMyIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJmaWx0ZXJUb3VjaGVzV2hlbk9ic2N1cmVkIiBpZD0iMHgwMTAxMDJjNCIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ0ZXh0U2VsZWN0SGFuZGxlTGVmdCIgaWQ9IjB4MDEwMTAyYzUiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idGV4dFNlbGVjdEhhbmRsZVJpZ2h0IiBpZD0iMHgwMTAxMDJjNiIgLz4KQEAgLTEyNjIsNyArMTI1OSw3IEBACiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0icG9wdXBBbmltYXRpb25TdHlsZSIgaWQ9IjB4MDEwMTAyYzkiIC8+CiAKICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImF0dHIiIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQiIGVuZD0iMHgwMTAxMDMwMCIgLz4KLSAgCisKICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImlkIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwMjAwNDAiIC8+CiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJhbmltIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwYTAwMjAiIC8+CiAKQEAgLTEyNzMsOSArMTI3MCw4IEBACiAgIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InByZXNlbmNlX2F1ZGlvX2F3YXkiIGlkPSIweDAxMDgwMGFmIiAvPgogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJwcmVzZW5jZV9hdWRpb19idXN5IiBpZD0iMHgwMTA4MDBiMCIgLz4KICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0icHJlc2VuY2VfYXVkaW9fb25saW5lIiBpZD0iMHgwMTA4MDBiMSIgLz4KLQogICA8cHVibGljLXBhZGRpbmcgdHlwZT0iZHJhd2FibGUiIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQiIGVuZD0iMHgwMTA4MDEwMCIgLz4KLSAgCisKICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRpdGxlIiBpZD0iMHgwMTAzMDA2NSIgLz4KICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkljb24iIGlkPSIweDAxMDMwMDY2IiAvPgogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuRXZlbnRDb250ZW50IiBpZD0iMHgwMTAzMDA2NyIgLz4KQEAgLTEyODksNCArMTI4NSwxMzcgQEAKICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImRpbWVuIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwNTAwMTAiIC8+CiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJjb2xvciIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMDYwMDIwIiAvPgogICA8cHVibGljLXBhZGRpbmcgdHlwZT0iYXJyYXkiIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQiIGVuZD0iMHgwMTA3MDAxMCIgLz4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgUmVzb3VyY2VzIHByb3Bvc2VkIGZvciBIb25leWNvbWIuCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPGVhdC1jb21tZW50IC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWRhcHRlciIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzZWxlY3Rpb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ic29ydE9yZGVyIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InVyaSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJmcm9tIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InRvIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFzIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImZyb21WYWx1ZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ0b1ZhbHVlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImNvbHVtbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ3aXRoRXhwcmVzc2lvbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ3aXRoQ2xhc3MiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWxsQ29udGFjdHNOYW1lIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9IndpbmRvd0FjdGlvbkJhciIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25CYXJTdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJuYXZpZ2F0aW9uTW9kZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJkaXNwbGF5T3B0aW9ucyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzdWJ0aXRsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJjdXN0b21OYXZpZ2F0aW9uTGF5b3V0IiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImhhcmR3YXJlQWNjZWxlcmF0ZWQiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ibWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYW5pbWF0ZUZpcnN0VmlldyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJkcm9wRG93blNwaW5uZXJTdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25Ecm9wRG93blN0eWxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjdGlvbkJ1dHRvblN0eWxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InNob3dBc0FjdGlvbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25CdXR0b25QYWRkaW5nIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InByZXZpZXdJbWFnZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25Nb2RlQmFja2dyb3VuZCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25Nb2RlQ2xvc2VEcmF3YWJsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ3aW5kb3dBY3Rpb25Nb2RlT3ZlcmxheSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ2YWx1ZUZyb20iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idmFsdWVUbyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ2YWx1ZVR5cGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0icHJvcGVydHlOYW1lIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Im9yZGVyaW5nIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImZyYWdtZW50IiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9IndpbmRvd0FjdGlvbkJhck92ZXJsYXkiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZnJhZ21lbnRPcGVuRW50ZXJBbmltYXRpb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZnJhZ21lbnRPcGVuRXhpdEFuaW1hdGlvbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJmcmFnbWVudENsb3NlRW50ZXJBbmltYXRpb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZnJhZ21lbnRDbG9zZUV4aXRBbmltYXRpb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZnJhZ21lbnROZXh0RW50ZXJBbmltYXRpb24iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZnJhZ21lbnROZXh0RXhpdEFuaW1hdGlvbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJmcmFnbWVudFByZXZFbnRlckFuaW1hdGlvbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJmcmFnbWVudFByZXZFeGl0QW5pbWF0aW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjdGlvbkJhclNpemUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iaW1lU3VidHlwZUxvY2FsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJpbWVTdWJ0eXBlTW9kZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJpbWVTdWJ0eXBlRXh0cmFWYWx1ZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzcGxpdE1vdGlvbkV2ZW50cyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJsaXN0Q2hvaWNlQmFja2dyb3VuZEluZGljYXRvciIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzcGlubmVyTW9kZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhbmltYXRlTGF5b3V0Q2hhbmdlcyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25CYXJUYWJTdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25CYXJUYWJCYXJTdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25CYXJUYWJUZXh0U3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uT3ZlcmZsb3dCdXR0b25TdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJpdGVtUGFkZGluZyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25Nb2RlQ2xvc2VCdXR0b25TdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ0aXRsZVRleHRTdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzdWJ0aXRsZVRleHRTdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJpY29uaWZpZWRCeURlZmF1bHQiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uTGF5b3V0IiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjdGlvblZpZXdDbGFzcyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3RpdmF0ZWRCYWNrZ3JvdW5kSW5kaWNhdG9yIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InN0YXRlX2FjdGl2YXRlZCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJsaXN0UG9wdXBXaW5kb3dTdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJwb3B1cE1lbnVTdHlsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ0ZXh0QXBwZWFyYW5jZUxhcmdlUG9wdXBNZW51IiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InRleHRBcHBlYXJhbmNlU21hbGxQb3B1cE1lbnUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYnJlYWRDcnVtYlRpdGxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImJyZWFkQ3J1bWJTaG9ydFRpdGxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Imxpc3REaXZpZGVyQWxlcnREaWFsb2ciIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idGV4dENvbG9yQWxlcnREaWFsb2dMaXN0SXRlbSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJsb29wVmlld3MiIC8+CisKKyAgPHB1YmxpYyB0eXBlPSJhbmltIiBuYW1lPSJhbmltYXRvcl9mYWRlX2luIiAvPgorICA8cHVibGljIHR5cGU9ImFuaW0iIG5hbWU9ImFuaW1hdG9yX2ZhZGVfb3V0IiAvPgorCisgIDxwdWJsaWMgdHlwZT0iaWQiIG5hbWU9ImhvbWUiIC8+CisgIDwhLS0gQ29udGV4dCBtZW51IElEIGZvciB0aGUgIlNlbGVjdCB0ZXh0Li4uIiBtZW51IGl0ZW0gdG8gc3dpdGNoIHRvIHRleHQKKyAgICAgICBzZWxlY3Rpb24gY29udGV4dCBtb2RlIGluIHRleHQgdmlld3MuIC0tPgorICA8cHVibGljIHR5cGU9ImlkIiBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgLz4KKworICA8IS0tIFN0YW5kYXJkIGNvbnRlbnQgdmlldyBmb3IgYSB7QGxpbmsgYW5kcm9pZC5hcHAuTGlzdEZyYWdtZW50fS4KKyAgICAgICBJZiB5b3UgYXJlIGltcGxlbWVudGluZyBhIHN1YmNsYXNzIG9mIExpc3RGcmFnbWVudCB3aXRoIHlvdXIKKyAgICAgICBvd24gY3VzdG9taXplZCBjb250ZW50LCB5b3UgY2FuIGluY2x1ZGUgdGhpcyBsYXlvdXQgaW4gdGhhdAorICAgICAgIGNvbnRlbnQgdG8gc3RpbGwgcmV0YWluIGFsbCBvZiB0aGUgc3RhbmRhcmQgZnVuY3Rpb25hbGl0eSBvZgorICAgICAgIHRoZSBiYXNlIGNsYXNzLiAtLT4KKyAgPHB1YmxpYyB0eXBlPSJsYXlvdXQiIG5hbWU9Imxpc3RfY29udGVudCIgLz4KKworICA8IS0tIEEgc2ltcGxlIExpc3RWaWV3IGl0ZW0gbGF5b3V0IHdoaWNoIGNhbiBjb250YWluIHRleHQgYW5kIHN1cHBvcnQgKHNpbmdsZSBvciBtdWx0aXBsZSkgaXRlbSBzZWxlY3Rpb24uIC0tPgorICA8cHVibGljIHR5cGU9ImxheW91dCIgbmFtZT0ic2ltcGxlX3NlbGVjdGFibGVfbGlzdF9pdGVtIiAvPgorCisgIDwhLS0gQSB2ZXJzaW9uIG9mIHtAbGluayAjc2ltcGxlX2xpc3RfaXRlbV8xfSB0aGF0IGlzIGFibGUgdG8gY2hhbmdlIGl0cworICAgICAgIGJhY2tncm91bmQgc3RhdGUgdG8gaW5kaWNhdGUgd2hlbiBpdCBpcyBhY3RpdmF0ZWQgKHRoYXQgaXMgY2hlY2tlZCBieQorICAgICAgIGEgTGlzdFZpZXcpLiAtLT4KKyAgPHB1YmxpYyB0eXBlPSJsYXlvdXQiIG5hbWU9InNpbXBsZV9saXN0X2l0ZW1fYWN0aXZhdGVkXzEiIC8+CisKKyAgPCEtLSBBIHZlcnNpb24gb2Yge0BsaW5rICNzaW1wbGVfbGlzdF9pdGVtXzJ9IHRoYXQgaXMgYWJsZSB0byBjaGFuZ2UgaXRzCisgICAgICAgYmFja2dyb3VuZCBzdGF0ZSB0byBpbmRpY2F0ZSB3aGVuIGl0IGlzIGFjdGl2YXRlZCAodGhhdCBpcyBjaGVja2VkIGJ5CisgICAgICAgYSBMaXN0VmlldykuIC0tPgorICA8cHVibGljIHR5cGU9ImxheW91dCIgbmFtZT0ic2ltcGxlX2xpc3RfaXRlbV9hY3RpdmF0ZWRfMiIgLz4KKworICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5XaXRoQWN0aW9uQmFyIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJXaWRnZXQuU3Bpbm5lci5Ecm9wRG93biIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iV2lkZ2V0LkFjdGlvbkJ1dHRvbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuRGlhbG9nLk5vRnJhbWUiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLk5vVGl0bGVCYXIuT3ZlcmxheUFjdGlvbk1vZGVzIiAvPgorCisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLkhvbG8iIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLkxpZ2h0LkhvbG8iIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLkhvbG8uTm9BY3Rpb25CYXIiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLkhvbG8uTm9BY3Rpb25CYXIuRnVsbHNjcmVlbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuTGlnaHQuSG9sby5Ob0FjdGlvbkJhciIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuTGlnaHQuSG9sby5Ob0FjdGlvbkJhci5GdWxsc2NyZWVuIiAvPgorCisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IldpZGdldC5MaXN0UG9wdXBXaW5kb3ciIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IldpZGdldC5Qb3B1cE1lbnUiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IldpZGdldC5BY3Rpb25CdXR0b24uT3ZlcmZsb3ciIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IldpZGdldC5BY3Rpb25CdXR0b24uQ2xvc2VNb2RlIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XaWRnZXQuUG9wdXBNZW51LkxhcmdlIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XaWRnZXQuUG9wdXBNZW51LlNtYWxsIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJXaWRnZXQuRnJhZ21lbnRCcmVhZENydW1icyIgLz4KKworICA8cHVibGljIHR5cGU9InN0cmluZyIgbmFtZT0ic2VsZWN0VGV4dE1vZGUiIC8+CisKIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKaW5kZXggZDkxNzdlNy4uOGI0ZjkxZiAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0yODMsOSArMjgzLDE1IEBACiAgICAgPCEtLSBTaHV0ZG93biBDb25maXJtYXRpb24gRGlhbG9nLiAgV2hlbiB0aGUgdXNlciBjaG9vc2VzIHRvIHBvd2VyIG9mZiB0aGUgcGhvbmUsIHRoZXJlIHdpbGwgYmUgYSBjb25maXJtYXRpb24gZGlhbG9nLiAgVGhpcyBpcyB0aGUgbWVzc2FnZS4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJzaHV0ZG93bl9jb25maXJtIj5Zb3VyIHBob25lIHdpbGwgc2h1dCBkb3duLjwvc3RyaW5nPgogCi0gICAgPCEtLSBSZWNlbnQgVGFza3MgZGlhbG9nOiB0aXRsZSAtLT4KKyAgICA8IS0tIFJlY2VudCBUYXNrcyBkaWFsb2c6IHRpdGxlCisgICAgIFRPRE86IHRoaXMgc2hvdWxkIG1vdmUgdG8gU3lzdGVtVUkuYXBrLCBidXQgdGhlIGNvZGUgZm9yIHRoZSBvbGQgCisgICAgICAgICAgICByZWNlbnQgZGlhbG9nIGlzIHN0aWxsIGluIHRoZSBmcmFtZXdvcmsKKyAgICAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJyZWNlbnRfdGFza3NfdGl0bGUiPlJlY2VudDwvc3RyaW5nPgotICAgIDwhLS0gUmVjZW50IFRhc2tzIGRpYWxvZzogbWVzc2FnZSB3aGVuIHRoZXJlIGFyZSBubyByZWNlbnQgYXBwbGljYXRpb25zIC0tPgorICAgIDwhLS0gUmVjZW50IFRhc2tzIGRpYWxvZzogbWVzc2FnZSB3aGVuIHRoZXJlIGFyZSBubyByZWNlbnQgYXBwbGljYXRpb25zCisgICAgIFRPRE86IHRoaXMgc2hvdWxkIG1vdmUgdG8gU3lzdGVtVUkuYXBrLCBidXQgdGhlIGNvZGUgZm9yIHRoZSBvbGQgCisgICAgICAgICAgICByZWNlbnQgZGlhbG9nIGlzIHN0aWxsIGluIHRoZSBmcmFtZXdvcmsKKyAgICAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJub19yZWNlbnRfdGFza3MiPk5vIHJlY2VudCBhcHBsaWNhdGlvbnMuPC9zdHJpbmc+CiAKICAgICA8IS0tIFRpdGxlIG9mIHRoZSBHbG9iYWwgQWN0aW9ucyBEaWFsb2cgLS0+CkBAIC03OTUsOCArODAxLDggQEAKICAgICA8IS0tIFRpdGxlIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDYWxlbmRhciI+YWRkIG9yIG1vZGlmeSBjYWxlbmRhciBldmVudHMgYW5kIHNlbmQgZW1haWwgdG8gZ3Vlc3RzPC9zdHJpbmc+CiAgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNhbGVuZGFyIj5BbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gYWRkIG9yIGNoYW5nZSB0aGUgCi0gICAgICAgIGV2ZW50cyBvbiB5b3VyIGNhbGVuZGFyLCB3aGljaCBtYXkgc2VuZCBlbWFpbCB0byBndWVzdHMuIE1hbGljaW91cyBhcHBsaWNhdGlvbnMgY2FuIHVzZSB0aGlzIAorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDYWxlbmRhciI+QWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGFkZCBvciBjaGFuZ2UgdGhlCisgICAgICAgIGV2ZW50cyBvbiB5b3VyIGNhbGVuZGFyLCB3aGljaCBtYXkgc2VuZCBlbWFpbCB0byBndWVzdHMuIE1hbGljaW91cyBhcHBsaWNhdGlvbnMgY2FuIHVzZSB0aGlzCiAgICAgICAgIHRvIGVyYXNlIG9yIG1vZGlmeSB5b3VyIGNhbGVuZGFyIGV2ZW50cyBvciB0byBzZW5kIGVtYWlsIHRvIGd1ZXN0cy48L3N0cmluZz4KIAogICAgIDwhLS0gVGl0bGUgb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgpAQCAtMTI0NSwxNCArMTI1MSwxNCBAQAogICAgIDwhLS0gVGl0bGUgb2YgcG9saWN5IGFjY2VzcyB0byBsaW1pdGluZyB0aGUgdXNlcidzIHBhc3N3b3JkIGNob2ljZXMgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfbGltaXRQYXNzd29yZCI+U2V0IHBhc3N3b3JkIHJ1bGVzPC9zdHJpbmc+CiAgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiBwb2xpY3kgYWNjZXNzIHRvIGxpbWl0aW5nIHRoZSB1c2VyJ3MgcGFzc3dvcmQgY2hvaWNlcyAtLT4KLSAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCI+Q29udHJvbCB0aGUgbGVuZ3RoIGFuZCB0aGUgY2hhcmFjdGVycyBhbGxvd2VkIGluCi0gICAgc2NyZWVuLXVubG9jayBwYXNzd29yZHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfbGltaXRQYXNzd29yZCI+Q29udHJvbCB0aGUgbGVuZ3RoIGFuZCB0aGUgY2hhcmFjdGVycyAKKyAgICBhbGxvd2VkIGluIHNjcmVlbi11bmxvY2sgcGFzc3dvcmRzPC9zdHJpbmc+CiAgICAgPCEtLSBUaXRsZSBvZiBwb2xpY3kgYWNjZXNzIHRvIHdhdGNoIHVzZXIgbG9naW4gYXR0ZW1wdHMgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2F0Y2hMb2dpbiI+TW9uaXRvciBzY3JlZW4tdW5sb2NrIGF0dGVtcHRzPC9zdHJpbmc+CiAgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiBwb2xpY3kgYWNjZXNzIHRvIHdhdGNoIHVzZXIgbG9naW4gYXR0ZW1wdHMgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iPk1vbml0b3IgdGhlIG51bWJlciBvZiBpbmNvcnJlY3QgcGFzc3dvcmRzIGVudGVyZWQgd2hlbiB1bmxvY2tpbmcgCi0gICAgdGhlIHNjcmVlbiwgYW5kIGxvY2sgdGhlIHBob25lIG9yIGVyYXNlIGFsbCB0aGUgcGhvbmVcJ3MgZGF0YSBpZiB0b28gbWFueSBpbmNvcnJlY3QgcGFzc3dvcmRzIGFyZSBlbnRlcmVkCi0gICAgPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dhdGNoTG9naW4iPk1vbml0b3IgdGhlIG51bWJlciBvZiBpbmNvcnJlY3QgcGFzc3dvcmRzIAorICAgIGVudGVyZWQgd2hlbiB1bmxvY2tpbmcgdGhlIHNjcmVlbiwgYW5kIGxvY2sgdGhlIHBob25lIG9yIGVyYXNlIGFsbCB0aGUgcGhvbmVcJ3MgCisgICAgZGF0YSBpZiB0b28gbWFueSBpbmNvcnJlY3QgcGFzc3dvcmRzIGFyZSBlbnRlcmVkPC9zdHJpbmc+CiAgICAgPCEtLSBUaXRsZSBvZiBwb2xpY3kgYWNjZXNzIHRvIHJlc2V0IHVzZXIncyBwYXNzd29yZCAtLT4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9yZXNldFBhc3N3b3JkIj5DaGFuZ2UgdGhlIHNjcmVlbi11bmxvY2sgcGFzc3dvcmQ8L3N0cmluZz4KICAgICA8IS0tIERlc2NyaXB0aW9uIG9mIHBvbGljeSBhY2Nlc3MgdG8gcmVzZXQgdXNlcidzIHBhc3N3b3JkIC0tPgpAQCAtMTI2NCw3ICsxMjcwLDEzIEBACiAgICAgPCEtLSBUaXRsZSBvZiBwb2xpY3kgYWNjZXNzIHRvIHdpcGUgdGhlIHVzZXIncyBkYXRhIC0tPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIj5FcmFzZSBhbGwgZGF0YTwvc3RyaW5nPgogICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgcG9saWN5IGFjY2VzcyB0byB3aXBlIHRoZSB1c2VyJ3MgZGF0YSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiPkVyYXNlIHRoZSBwaG9uZVwncyBkYXRhIHdpdGhvdXQgd2FybmluZywgYnkgcGVyZm9ybWluZyBhIGZhY3RvcnkgZGF0YSByZXNldDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSI+RXJhc2UgdGhlIHBob25lXCdzIGRhdGEgd2l0aG91dCB3YXJuaW5nLCAKKyAgICBieSBwZXJmb3JtaW5nIGEgZmFjdG9yeSBkYXRhIHJlc2V0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkiPlNldCB0aGUgZGV2aWNlIGdsb2JhbCBwcm94eTwvc3RyaW5nPgorICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgcG9saWN5IGFjY2VzcyB0byB3aXBlIHRoZSB1c2VyJ3MgZGF0YSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkiPlNldCB0aGUgZGV2aWNlIGdsb2JhbCBwcm94eQorICAgICAgICB0byBiZSB1c2VkIHdoaWxlIHBvbGljeSBpcyBlbmFibGVkLiBPbmx5IHRoZSBmaXJzdCBkZXZpY2UgYWRtaW4KKyAgICAgICAgc2V0cyB0aGUgZWZmZWN0aXZlIGdsb2JhbCBwcm94eS48L3N0cmluZz4KIAogICAgIDwhLS0gVGhlIG9yZGVyIG9mIHRoZXNlIGlzIGltcG9ydGFudCwgZG9uJ3QgcmVvcmRlciB3aXRob3V0IGNoYW5naW5nIENvbnRhY3RzLmphdmEgLS0+IDxza2lwIC8+CiAgICAgPCEtLSBQaG9uZSBudW1iZXIgdHlwZXMgZnJvbSBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzLiBUaGlzIGNvdWxkIGJlIHVzZWQgd2hlbiBhZGRpbmcgYSBuZXcgcGhvbmUgbnVtYmVyIGZvciBhIGNvbnRhY3QsIGZvciBleGFtcGxlLiAtLT4KQEAgLTE0NDMsMjAgKzE0NTUsMTggQEAKICAgICA8IS0tIE90aGVyIFNJUCBhZGRyZXNzIHR5cGUgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJzaXBBZGRyZXNzVHlwZU90aGVyIj5PdGhlcjwvc3RyaW5nPgogCi0gICAgPCEtLSBBdHRidXRpb24gb2YgYSBjb250YWN0IHN0YXR1cyB1cGRhdGUsIHdoZW4gdGhlIHRpbWUgb2YgdXBkYXRlIGlzIHVua25vd24gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iPnZpYSA8eGxpZmY6ZyBpZD0ic291cmNlIiBleGFtcGxlPSJHb29nbGUgVGFsayI+JTEkczwveGxpZmY6Zz48L3N0cmluZz4KLQotICAgIDwhLS0gQXR0YnV0aW9uIG9mIGEgY29udGFjdCBzdGF0dXMgdXBkYXRlLCB3aGVuIHRoZSB0aW1lIG9mIHVwZGF0ZSBpcyBrbm93biAtLT4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiPjx4bGlmZjpnIGlkPSJkYXRlIiBleGFtcGxlPSIzIGhvdXJzIGFnbyI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJzb3VyY2UiIGV4YW1wbGU9Ikdvb2dsZSBUYWxrIj4lMiRzPC94bGlmZjpnPjwvc3RyaW5nPgotCiAgICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVpciBTSU0gUElOIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCiAgICAgICAgICBEaXNwbGF5ZWQgaW4gb25lIGxpbmUgaW4gYSBsYXJnZSBmb250LiAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSI+RW50ZXIgUElOIGNvZGU8L3N0cmluZz4KIAotICAgIDwhLS0gSW5zdHJ1Y3Rpb25zIHRlbGxpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlaXIgUElOIHBhc3N3b3JkIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCisgICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVpciB0ZXh0IHBhc3N3b3JkIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCiAgICAgICAgICBEaXNwbGF5ZWQgaW4gb25lIGxpbmUgaW4gYSBsYXJnZSBmb250LiAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIj5FbnRlciBwYXNzd29yZCB0byB1bmxvY2s8L3N0cmluZz4KIAorICAgIDwhLS0gSW5zdHJ1Y3Rpb25zIHRlbGxpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlaXIgUElOIHBhc3N3b3JkIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCisgICAgICAgICBEaXNwbGF5ZWQgaW4gb25lIGxpbmUgaW4gYSBsYXJnZSBmb250LiAgLS0+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSI+RW50ZXIgUElOIHRvIHVubG9jazwvc3RyaW5nPgorCiAgICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0aGF0IHRoZXkgZW50ZXJlZCB0aGUgd3JvbmcgcGluIHdoaWxlIHRyeWluZwogICAgICAgICAgdG8gdW5sb2NrIHRoZSBrZXlndWFyZC4gIERpc3BsYXllZCBpbiBvbmUgbGluZSBpbiBhIGxhcmdlIGZvbnQuICAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIj5JbmNvcnJlY3QgUElOIGNvZGUhPC9zdHJpbmc+CkBAIC0xNDkzLDYgKzE1MDMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiPkNvcnJlY3QhPC9zdHJpbmc+CiAgICAgPCEtLSBPbiB0aGUgdW5sb2NrIHBhdHRlcm4gc2NyZWVuLCBzaG93biB3aGVuIHRoZSB1c2VyIGVudGVycyB0aGUgd3JvbmcgbG9jayBwYXR0ZXJuIGFuZCBtdXN0IHRyeSBhZ2Fpbi4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciPlNvcnJ5LCB0cnkgYWdhaW48L3N0cmluZz4KKyAgICA8IS0tIE9uIHRoZSB1bmxvY2sgcGFzc3dvcmQgc2NyZWVuLCBzaG93biB3aGVuIHRoZSB1c2VyIGVudGVycyB0aGUgd3JvbmcgbG9jayBwYXNzd29yZCBhbmQgbXVzdCB0cnkgYWdhaW4uIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyI+U29ycnksIHRyeSBhZ2Fpbjwvc3RyaW5nPgogCiAgICAgPCEtLSBXaGVuIHRoZSBsb2NrIHNjcmVlbiBpcyBzaG93aW5nIGFuZCB0aGUgcGhvbmUgcGx1Z2dlZCBpbiwgYW5kIHRoZSBiYXR0ZXJ5CiAgICAgICAgICBpcyBub3QgZnVsbHkgY2hhcmdlZCwgc2hvdyB0aGUgY3VycmVudCBjaGFyZ2UgJS4gIC0tPgpAQCAtMTUzNiwxMiArMTU0OCwyNyBAQAogICAgICAgICAgcHJvZ3Jlc3MgZGlhbG9nIGluIHRoZSBtZWFudGltZS4gIHRoaXMgaXMgdGhlIGVtc3NhZ2UuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIj5VbmxvY2tpbmcgU0lNIGNhcmRcdTIwMjY8L3N0cmluZz4KIAotICAgIDwhLS0gRm9yIHRoZSB1bmxvY2sgc2NyZWVuLCBJbmZvcm1hdGlvbiBtZXNzYWdlIHNob3duIGluIGRpYWxvZyB3aGVuIHVzZXIgaGFzIHRvbyBtYW55IGZhaWxlZCBhdHRlbXB0cyAtLT4KKyAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGhhcyB0b28gbWFueSBmYWlsZWQgYXR0ZW1wdHMgYXQKKyAgICAgICAgIGRyYXdpbmcgdGhlIHVubG9jayBwYXR0ZXJuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiPgogICAgICAgICBZb3UgaGF2ZSBpbmNvcnJlY3RseSBkcmF3biB5b3VyIHVubG9jayBwYXR0ZXJuIDx4bGlmZjpnIGlkPSJudW1iZXIiPiVkPC94bGlmZjpnPiB0aW1lcy4KICAgICAgICAgXG5cblBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuCiAgICAgPC9zdHJpbmc+CiAKKyAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGhhcyB0b28gbWFueSBmYWlsZWQgYXR0ZW1wdHMgYXQKKyAgICAgICAgIGVudGVyaW5nIHRoZSBwYXNzd29yZCAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIj4KKyAgICAgICAgWW91IGhhdmUgaW5jb3JyZWN0bHkgZW50ZXJlZCB5b3VyIHBhc3N3b3JkIDx4bGlmZjpnIGlkPSJudW1iZXIiPiVkPC94bGlmZjpnPiB0aW1lcy4KKyAgICAgICAgXG5cblBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuCisgICAgPC9zdHJpbmc+CisKKyAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGhhcyB0b28gbWFueSBmYWlsZWQgYXR0ZW1wdHMgYXQKKyAgICAgICAgIGVudGVyaW5nIHRoZSBQSU4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiPgorICAgICAgICBZb3UgaGF2ZSBpbmNvcnJlY3RseSBlbnRlcmVkIHlvdXIgUElOIDx4bGlmZjpnIGlkPSJudW1iZXIiPiVkPC94bGlmZjpnPiB0aW1lcy4KKyAgICAgICAgXG5cblBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuCisgICAgPC9zdHJpbmc+CisKICAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGlzIGFsbW9zdCBhdCB0aGUgbGltaXQKICAgICAgICAgIHdoZXJlIHRoZXkgd2lsbCBiZSBsb2NrZWQgb3V0IGFuZCBtYXkgaGF2ZSB0byBlbnRlciBhbiBhbHRlcm5hdGUgdXNlcm5hbWUvcGFzc3dvcmQgdG8gdW5sb2NrIHRoZSBwaG9uZSAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iPgpAQCAtMTYxMSw4ICsxNjM4LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJmYWN0b3J5dGVzdF9yZWJvb3QiPlJlYm9vdDwvc3RyaW5nPgogCiAgICAgPCEtLSBEbyBub3QgdHJhbnNsYXRlLiAgV2ViVmlldyBVc2VyIEFnZW50IHN0cmluZyAtLT4KLSAgICA8c3RyaW5nIG5hbWU9IndlYl91c2VyX2FnZW50IiB0cmFuc2xhdGFibGU9ImZhbHNlIj48eGxpZmY6ZyBpZD0ieCI+TW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkICVzKQotICAgICAgICBBcHBsZVdlYktpdC81MzMuMSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIE1vYmlsZSBTYWZhcmkvNTMzLjE8L3hsaWZmOmc+PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ3ZWJfdXNlcl9hZ2VudCIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+TW96aWxsYS81LjAgKExpbnV4OyBVOyA8eGxpZmY6ZyBpZD0ieCI+QW5kcm9pZCAlczwveGxpZmY6Zz4pCisgICAgICAgIEFwcGxlV2ViS2l0LzUzNC45IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgPHhsaWZmOmcgaWQ9Im1vYmlsZSI+JXM8L3hsaWZmOmc+U2FmYXJpLzUzNC45PC9zdHJpbmc+CisgICAgPCEtLSBEbyBub3QgdHJhbnNsYXRlLiAgV2ViVmlldyBVc2VyIEFnZW50IHRhcmdldGVkIGNvbnRlbnQgLS0+CisgICAgPHN0cmluZyBuYW1lPSJ3ZWJfdXNlcl9hZ2VudF90YXJnZXRfY29udGVudCIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+Ik1vYmlsZSAiPC9zdHJpbmc+CiAKICAgICA8IS0tIFRpdGxlIGZvciBhIEphdmFTY3JpcHQgZGlhbG9nLiAiVGhlIHBhZ2UgYXQgPHVybCBvZiBjdXJyZW50IHBhZ2U+IHNheXM6IiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ190aXRsZSI+VGhlIHBhZ2UgYXQgXCc8eGxpZmY6ZyBpZD0idGl0bGUiPiVzPC94bGlmZjpnPlwnIHNheXM6PC9zdHJpbmc+CkBAIC0xNjI4LDYgKzE2NTcsOSBAQAogICAgIDwhLS0gVG9hc3QgZm9yIGRvdWJsZS10YXAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJkb3VibGVfdGFwX3RvYXN0Ij5UaXA6IGRvdWJsZS10YXAgdG8gem9vbSBpbiBhbmQgb3V0Ljwvc3RyaW5nPgogCisgICAgPCEtLSBUZXh0IHRvIHNob3cgaW4gdGhlIGF1dG8gY29tcGxldGUgZHJvcCBkb3duIGxpc3Qgb24gYSB0ZXh0IHZpZXcgd2hlbiB0aGUgYnJvd3NlciBjYW4gYXV0byBmaWxsIHRoZSBlbnRpcmUgZm9ybSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX3RoaXNfZm9ybSI+QXV0b0ZpbGwgdGhpcyBmb3JtPC9zdHJpbmc+CisKICAgICA8IS0tIFRpdGxlIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIKICAgICAgICAgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZEhpc3RvcnlCb29rbWFya3MiPnJlYWQgQnJvd3NlclwncyBoaXN0b3J5IGFuZCBib29rbWFya3M8L3N0cmluZz4KQEAgLTE4ODQsOSArMTkxNiw2IEBACiAgICAgPCEtLSBJdGVtIG9uIEVkaXRUZXh0IGNvbnRleHQgbWVudS4gVGhpcyBhY3Rpb24gaXMgdXNlZCB0byBzZWxlY3QgYWxsIHRleHQgaW4gdGhlIGVkaXQgZmllbGQuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIj5TZWxlY3QgYWxsPC9zdHJpbmc+CiAKLSAgICA8IS0tIEl0ZW0gb24gRWRpdFRleHQgY29udGV4dCBtZW51LiBUaGlzIGFjdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IHNlbGVjdGluZyB0ZXh0IGluIHRoZSBlZGl0IGZpZWxkLiBbQ0hBUiBMSU1JVD0yMF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0Ij5TZWxlY3Qgd29yZDwvc3RyaW5nPgotCiAgICAgPCEtLSBJdGVtIG9uIEVkaXRUZXh0IGNvbnRleHQgbWVudS4gIFRoaXMgYWN0aW9uIGlzIHVzZWQgdG8gY3V0IHNlbGVjdGVkIHRoZSB0ZXh0IGludG8gdGhlIGNsaXBib2FyZC4gIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0Ij5DdXQ8L3N0cmluZz4KIApAQCAtMTg5OSwxNSArMTkyOCwxNyBAQAogICAgIDwhLS0gSXRlbSBvbiBFZGl0VGV4dCBjb250ZXh0IG1lbnUuIFRoaXMgYWN0aW9uIGlzIHVzZWQgdG8gY29weSBhIFVSTCBmcm9tIHRoZSBlZGl0IGZpZWxkIGludG8gdGhlIGNsaXBib2FyZC4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIj5Db3B5IFVSTDwvc3RyaW5nPgogCisgICAgPCEtLSBJdGVtIG9uIEVkaXRUZXh0IGNvbnRleHQgbWVudS4gQWRkZWQgb25seSB3aGVuIHRoZSBjb250ZXh0IG1lbnUgaXMgbm90IGVtcHR5LCBpdCBlbmFibGUgc2VsZWN0aW9uIGNvbnRleHQgbW9kZS4gW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dE1vZGUiPlNlbGVjdCB0ZXh0Li4uPC9zdHJpbmc+CisKKyAgICA8IS0tIFRleHQgc2VsZWN0aW9uIGNvbnRleHR1YWwgbW9kZSB0aXRsZSwgZGlzcGxheWVkIGluIHRoZSBDQUIuIFtDSEFSIExJTUlUPTIwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InRleHRTZWxlY3Rpb25DQUJUaXRsZSI+VGV4dCBzZWxlY3Rpb248L3N0cmluZz4KKwogICAgIDwhLS0gRWRpdFRleHQgY29udGV4dCBtZW51IC0tPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiPklucHV0IG1ldGhvZDwvc3RyaW5nPgogCi0gICAgPCEtLSBJdGVtIG9uIEVkaXRUZXh0IGNvbnRleHQgbWVudSwgdXNlZCB0byBhZGQgYSB3b3JkIHRvIHRoZQotICAgICAgICAgaW5wdXQgbWV0aG9kIGRpY3Rpb25hcnkuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5Ij4iQWRkIFwiPHhsaWZmOmcgaWQ9IndvcmQiIGV4YW1wbGU9InJpY2tyb2xsIj4lczwveGxpZmY6Zz5cIiB0byBkaWN0aW9uYXJ5PC9zdHJpbmc+Ci0KLSAgICA8IS0tIFRpdGxlIGZvciBFZGl0VGV4dCBjb250ZXh0IG1lbnUgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSI+RWRpdCB0ZXh0PC9zdHJpbmc+CisgICAgPCEtLSBUaXRsZSBmb3IgRWRpdFRleHQgY29udGV4dCBtZW51IFtDSEFSIExJTUlUPTIwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIj5UZXh0IGFjdGlvbnM8L3N0cmluZz4KIAogICAgIDwhLS0gSWYgdGhlIGRldmljZSBpcyBnZXR0aW5nIGxvdyBvbiBpbnRlcm5hbCBzdG9yYWdlLCBhIG5vdGlmaWNhdGlvbiBpcyBzaG93biB0byB0aGUgdXNlci4gIFRoaXMgaXMgdGhlIHRpdGxlIG9mIHRoYXQgbm90aWZpY2F0aW9uLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiPkxvdyBvbiBzcGFjZTwvc3RyaW5nPgpAQCAtMTkyNiw2ICsxOTU3LDkgQEAKICAgICAgICAgIGNvbWJpbmVkIHdpdGggc2V0SWNvbihhbmRyb2lkLlIuZHJhd2FibGUuaWNfZGlhbG9nX2FsZXJ0KSAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSI+QXR0ZW50aW9uPC9zdHJpbmc+CiAKKyAgICA8IS0tIFRleHQgc2hvd24gYnkgbGlzdCBmcmFnbWVudCB3aGVuIHdhaXRpbmcgZm9yIGRhdGEgdG8gZGlzcGxheS4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIj5Mb2FkaW5nLi4uPC9zdHJpbmc+CisKICAgICA8IS0tIERlZmF1bHQgdGV4dCBmb3IgYSBidXR0b24gdGhhdCBjYW4gYmUgdG9nZ2xlZCBvbiBhbmQgb2ZmLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iPk9OPC9zdHJpbmc+CiAgICAgPCEtLSBEZWZhdWx0IHRleHQgZm9yIGEgYnV0dG9uIHRoYXQgY2FuIGJlIHRvZ2dsZWQgb24gYW5kIG9mZi4gLS0+CkBAIC0xOTgyLDIzICsyMDE2LDIzIEBACiAKICAgICA8IS0tIE5vdGlmaWNhdGlvbiB0ZXh0IHRvIHRlbGwgdGhlIHVzZXIgdGhhdCBhIGhlYXZ5LXdlaWdodCBhcHBsaWNhdGlvbiBpcyBydW5uaW5nLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iPjx4bGlmZjpnIGlkPSJhcHAiPiUxJHM8L3hsaWZmOmc+IHJ1bm5pbmc8L3N0cmluZz4KLSAgICAKKwogICAgIDwhLS0gTm90aWZpY2F0aW9uIGRldGFpbHMgdG8gdGVsbCB0aGUgdXNlciB0aGF0IGEgaGVhdnktd2VpZ2h0IGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbl9kZXRhaWwiPlNlbGVjdCB0byBzd2l0Y2ggdG8gYXBwbGljYXRpb248L3N0cmluZz4KLSAgICAKKwogICAgIDwhLS0gVGl0bGUgb2YgZGlhbG9nIHByb21wdGluZyB3aGV0aGVyIHVzZXIgd2FudHMgdG8gc3dpdGNoIGJldHdlZW4gaGVhdnktd2VpZ2h0IGFwcHMuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X3N3aXRjaGVyX3RpdGxlIj5Td2l0Y2ggYXBwbGljYXRpb25zPzwvc3RyaW5nPgotICAgIAorCiAgICAgPCEtLSBEZXNjcmlwdGl2ZSB0ZXh0IGZvciBzd2l0Y2hpbmcgdG8gYSBuZXcgaGVhdnktd2VpZ2h0IGFwcGxpY2F0aW9uLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9zd2l0Y2hlcl90ZXh0Ij5Bbm90aGVyIGFwcGxpY2F0aW9uIGlzIGFscmVhZHkgcnVubmluZwogICAgIHRoYXQgbXVzdCBiZSBzdG9wcGVkIGJlZm9yZSB5b3UgY2FuIHN0YXJ0IGEgbmV3IG9uZS48L3N0cmluZz4KLSAgICAKKwogICAgIDxzdHJpbmcgbmFtZT0ib2xkX2FwcF9hY3Rpb24iPlJldHVybiB0byA8eGxpZmY6ZyBpZD0ib2xkX2FwcCI+JTEkczwveGxpZmY6Zz48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9sZF9hcHBfZGVzY3JpcHRpb24iPkRvblwndCBzdGFydCB0aGUgbmV3IGFwcGxpY2F0aW9uLjwvc3RyaW5nPgotICAgIAorCiAgICAgPHN0cmluZyBuYW1lPSJuZXdfYXBwX2FjdGlvbiI+U3RhcnQgPHhsaWZmOmcgaWQ9Im9sZF9hcHAiPiUxJHM8L3hsaWZmOmc+PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJuZXdfYXBwX2Rlc2NyaXB0aW9uIj5TdG9wIHRoZSBvbGQgYXBwbGljYXRpb24gd2l0aG91dCBzYXZpbmcuPC9zdHJpbmc+Ci0gICAgCisKICAgICA8IS0tIERpc3BsYXllZCBpbiB0aGUgdGl0bGUgb2YgdGhlIGNob29zZXIgZm9yIHRoaW5ncyB0byBkbyB3aXRoIHRleHQgdGhhdAogICAgICAgICAgaXMgdG8gYmUgc2VudCB0byBhbm90aGVyIGFwcGxpY2F0aW9uLiBGb3IgZXhhbXBsZSwgSSBjYW4gc2VuZAogICAgICAgICAgdGV4dCB0aHJvdWdoIFNNUyBvciBJTS4gIEEgZGlhbG9nIHdpdGggdGhvc2UgY2hvaWNlcyB3b3VsZCBiZSBzaG93biwKQEAgLTIzMDIsMTcgKzIzMzYsMTMgQEAKICAgICA8IS0tIExvY2FsaXplZCBzdHJpbmdzIGZvciBXZWJWaWV3IC0tPgogICAgIDwhLS0gTGFiZWwgZm9yIGJ1dHRvbiBpbiBhIFdlYlZpZXcgdGhhdCB3aWxsIG9wZW4gYSBjaG9vc2VyIHRvIGNob29zZSBhIGZpbGUgdG8gdXBsb2FkIC0tPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiPkNob29zZSBmaWxlPC9zdHJpbmc+CisgICAgPCEtLSBMYWJlbCBmb3IgdGhlIGZpbGUgdXBsb2FkIGNvbnRyb2wgd2hlbiBubyBmaWxlIGhhcyBiZWVuIGNob3NlbiB5ZXQgLS0+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiI+Tm8gZmlsZSBjaG9zZW48L3N0cmluZz4KICAgICA8IS0tIExhYmVsIGZvciA8aW5wdXQgdHlwZT0icmVzZXQiPiBidXR0b24gaW4gaHRtbCAtLT4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0Ij5SZXNldDwvc3RyaW5nPgogICAgIDwhLS0gTGFiZWwgZm9yIDxpbnB1dCB0eXBlPSJzdWJtaXQiPiBidXR0b24gaW4gaHRtbCAtLT4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCI+U3VibWl0PC9zdHJpbmc+CiAKLSAgICA8IS0tIFN0cmluZyBkZXNjcmliaW5nIHRoZSBTdGFyL0Zhdm9yaXRlIGNoZWNrYm94Ci0KLSAgICAgICAgIFVzZWQgYnkgQWNjZXNzaWJpbGl0eVNlcnZpY2UgdG8gYW5ub3VuY2UgdGhlIHB1cnBvc2Ugb2YgdGhlIHZpZXcuCi0gICAgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIj5mYXZvcml0ZTwvc3RyaW5nPgotCiAgICAgPCEtLSBTdHJpbmdzIGZvciBjYXIgbW9kZSBub3RpZmljYXRpb24gLS0+CiAgICAgPCEtLSBTaG93biB3aGVuIGNhciBtb2RlIGlzIGVuYWJsZWQgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSI+Q2FyIG1vZGUgZW5hYmxlZDwvc3RyaW5nPgpAQCAtMjMyMyw2ICsyMzUzLDEzIEBACiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiPlRldGhlcmluZyBvciBob3RzcG90IGFjdGl2ZTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiPlRvdWNoIHRvIGNvbmZpZ3VyZTwvc3RyaW5nPgogCisgICAgPCEtLSAgU3RyaW5ncyBmb3IgcG9zc2libGUgUHJlZmVyZW5jZUFjdGl2aXR5IEJhY2svTmV4dCBidXR0b25zIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiPkJhY2s8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIj5OZXh0PC9zdHJpbmc+CisKKyAgICA8IS0tIE9wdGlvbmFsIGJ1dHRvbiB0byBTa2lwIGEgUHJlZmVyZW5jZUFjdGl2aXR5IFtDSEFSIExJTUlUPTIwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIj5Ta2lwPC9zdHJpbmc+CisKICAgICA8IS0tIFN0cmluZ3MgZm9yIHRocm90dGxpbmcgbm90aWZpY2F0aW9uIC0tPgogICAgIDwhLS0gU2hvd24gd2hlbiB0aGUgdXNlciBpcyBpbiBkYW5nZXIgb2YgYmVpbmcgdGhyb3R0bGVkIC0tPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiPkhpZ2ggbW9iaWxlIGRhdGEgdXNlPC9zdHJpbmc+CkBAIC0yMzMyLDQgKzIzNjksMjEgQEAKICAgICA8IS0tIFNob3duIHdoZW4gdGhlIHVzZXJzIGJhbmR3aWR0aCBpcyByZWR1Y2VkIGJlY2F1c2Ugb2YgZXhjZXNzaXZlIGRhdGEgdXNlIC0tPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSI+TW9iaWxlIGRhdGEgbGltaXQgZXhjZWVkZWQ8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSI+VG91Y2ggdG8gbGVhcm4gbW9yZSBhYm91dCBtb2JpbGUgZGF0YSB1c2U8L3N0cmluZz4KKworICAgIDwhLS0gRGlzcGxheWVkIG9uIHRoZSBGaW5kIGRpYWxvZyB3aGVuIHRoZXJlIGFyZSBubyBtYXRjaGVzIFtDSEFSIExJTUlUPU5PTkVdLS0+CisgICAgPHN0cmluZyBuYW1lPSJub19tYXRjaGVzIj5ObyBtYXRjaGVzPC9zdHJpbmc+CisKKyAgICA8IS0tIEZpbmQgZGlhbG9nIGhpbnQgdGV4dC4gIEFsc28gdXNlZCBpbiB0aGUgbWVudSBpdGVtIHRvIG9wZW4gZmluZCBvbiBwYWdlIFtDSEFSIExJTUlUPU5PTkVdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZmluZF9vbl9wYWdlIj5GaW5kIG9uIHBhZ2U8L3N0cmluZz4KKworICAgIDwhLS0gRGlzcGxheWVkIG9uIHRoZSBGaW5kIGRpYWxvZyB0byBkaXNwbGF5IHRoZSBpbmRleCBvZiB0aGUgaGlnaGxpZ2h0ZWQKKyAgICAgICAgIG1hdGNoIGFuZCB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBmb3VuZCBpbiB0aGUgY3VycmVudCBwYWdlLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KKyAgICA8cGx1cmFscyBuYW1lPSJtYXRjaGVzX2ZvdW5kIj4KKyAgICAgICAgPCEtLSBDYXNlIG9mIG9uZSBtYXRjaCAtLT4KKyAgICAgICAgPGl0ZW0gcXVhbnRpdHk9Im9uZSI+MSBtYXRjaDwvaXRlbT4KKyAgICAgICAgPCEtLSBDYXNlIG9mIG11bHRpcGxlIHRvdGFsIG1hdGNoZXMgLS0+CisgICAgICAgIDxpdGVtIHF1YW50aXR5PSJvdGhlciI+PHhsaWZmOmcgaWQ9ImluZGV4IiBleGFtcGxlPSIyIj4lZDwveGxpZmY6Zz4gb2YgPHhsaWZmOmcgaWQ9InRvdGFsIiBleGFtcGxlPSIxMzciPiVkPC94bGlmZjpnPjwvaXRlbT4KKyAgICA8L3BsdXJhbHM+CisKKwogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKaW5kZXggYThjZDdjZS4uNGI1MDQ3ZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApAQCAtNzQsNiArNzQsMTQgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0id2FsbHBhcGVySW50cmFPcGVuRXhpdEFuaW1hdGlvbiI+QGFuaW0vd2FsbHBhcGVyX2ludHJhX29wZW5fZXhpdDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0id2FsbHBhcGVySW50cmFDbG9zZUVudGVyQW5pbWF0aW9uIj5AYW5pbS93YWxscGFwZXJfaW50cmFfY2xvc2VfZW50ZXI8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9IndhbGxwYXBlckludHJhQ2xvc2VFeGl0QW5pbWF0aW9uIj5AYW5pbS93YWxscGFwZXJfaW50cmFfY2xvc2VfZXhpdDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZnJhZ21lbnRPcGVuRW50ZXJBbmltYXRpb24iPkBhbmltL2ZyYWdtZW50X29wZW5fZW50ZXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImZyYWdtZW50T3BlbkV4aXRBbmltYXRpb24iPkBhbmltL2ZyYWdtZW50X29wZW5fZXhpdDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZnJhZ21lbnRDbG9zZUVudGVyQW5pbWF0aW9uIj5AYW5pbS9mcmFnbWVudF9jbG9zZV9lbnRlcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZnJhZ21lbnRDbG9zZUV4aXRBbmltYXRpb24iPkBhbmltL2ZyYWdtZW50X2Nsb3NlX2V4aXQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImZyYWdtZW50TmV4dEVudGVyQW5pbWF0aW9uIj5AYW5pbS9mcmFnbWVudF9uZXh0X2VudGVyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJmcmFnbWVudE5leHRFeGl0QW5pbWF0aW9uIj5AYW5pbS9mcmFnbWVudF9uZXh0X2V4aXQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImZyYWdtZW50UHJldkVudGVyQW5pbWF0aW9uIj5AYW5pbS9mcmFnbWVudF9wcmV2X2VudGVyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJmcmFnbWVudFByZXZFeGl0QW5pbWF0aW9uIj5AYW5pbS9mcmFnbWVudF9wcmV2X2V4aXQ8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDwhLS0gU3RhbmRhcmQgYW5pbWF0aW9ucyBmb3IgYSBub24tZnVsbC1zY3JlZW4gd2luZG93IG9yIGFjdGl2aXR5LiAtLT4KQEAgLTg4LDYgKzk2LDEzIEBACiAgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0V4aXRBbmltYXRpb24iPkBhbmltL3N0YXR1c19iYXJfZXhpdDwvaXRlbT4KICAgICA8L3N0eWxlPgogCisgICAgPCEtLSB7QGhpZGV9IC0tPgorICAgIDxzdHlsZSBuYW1lPSJBbmltYXRpb24uU3RhdHVzQmFyLkludHJ1ZGVyQWxlcnQiCisgICAgICAgIHBhcmVudD0iQGFuZHJvaWQ6c3R5bGUvQW5pbWF0aW9uLlN0YXR1c0JhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93RW50ZXJBbmltYXRpb24iPkBhbmltL3ByaW9yaXR5X2FsZXJ0X2VudGVyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0V4aXRBbmltYXRpb24iPkBhbmltL3ByaW9yaXR5X2FsZXJ0X2V4aXQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKwogICAgIDwhLS0gU3RhbmRhcmQgYW5pbWF0aW9ucyBmb3IgYSB0cmFuc2x1Y2VudCB3aW5kb3cgb3IgYWN0aXZpdHkuICBUaGlzCiAgICAgICAgICBzdHlsZSBpcyA8ZW0+bm90PGVtPiB1c2VkIGJ5IGRlZmF1bHQgZm9yIHRoZSB0cmFuc2x1Y2VudCB0aGVtZQogICAgICAgICAgKHNpbmNlIHRyYW5zbHVjZW50IGFjdGl2aXRpZXMgYXJlIGEgc3BlY2lhbCBjYXNlIHRoYXQgaGF2ZSBubwpAQCAtMTkxLDggKzIwNiw3IEBACiAgICAgPCEtLSBTdGF0dXMgQmFyIFN0eWxlcyAtLT4KIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNHNwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj4/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGw8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRpY2tlciI+CkBAIC0yMDUsMTIgKzIxOSwxMSBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+Ym9sZDwvaXRlbT4KICAgICA8L3N0eWxlPgogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuRXZlbnRDb250ZW50Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPiNmZjZiNmI2YjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeUludmVyc2U8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkV2ZW50Q29udGVudC5UaXRsZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE2c3A8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE4c3A8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPCEtLSBXaWRnZXQgU3R5bGVzIC0tPgpAQCAtMjIxLDcgKzIzNCw3IEBACiAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkFic0xpc3RWaWV3Ij4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY3JvbGxiYXJzIj52ZXJ0aWNhbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpmYWRpbmdFZGdlIj52ZXJ0aWNhbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpmYWRpbmdFZGdlIj5ub25lPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0Lkdlc3R1cmVPdmVybGF5VmlldyI+CkBAIC0yNDcsNyArMjYwLDYgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjbGlja2FibGUiPnRydWU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbEludmVyc2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AYW5kcm9pZDpjb2xvci9wcmltYXJ5X3RleHRfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcl92ZXJ0aWNhbHxjZW50ZXJfaG9yaXpvbnRhbDwvaXRlbT4KICAgICA8L3N0eWxlPgogCkBAIC0yNzUsMTIgKzI4NywxMiBAQAogCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Db21wb3VuZEJ1dHRvbi5DaGVja0JveCI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2NoZWNrX2xhYmVsX2JhY2tncm91bmQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YnV0dG9uIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fY2hlY2s8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YnV0dG9uIj4/YW5kcm9pZDphdHRyL2xpc3RDaG9pY2VJbmRpY2F0b3JNdWx0aXBsZTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Db21wb3VuZEJ1dHRvbi5SYWRpb0J1dHRvbiI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX3JhZGlvX2xhYmVsX2JhY2tncm91bmQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YnV0dG9uIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fcmFkaW88L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YnV0dG9uIj4/YW5kcm9pZDphdHRyL2xpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGU8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQ29tcG91bmRCdXR0b24uU3RhciI+CkBAIC00MTMsOSArNDI1LDkgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpmb2N1c2FibGUiPnRydWU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Zm9jdXNhYmxlSW5Ub3VjaE1vZGUiPnRydWU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y2xpY2thYmxlIj50cnVlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2VkaXRfdGV4dDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj4/YW5kcm9pZDphdHRyL2VkaXRUZXh0QmFja2dyb3VuZDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+P2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bUludmVyc2U8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AYW5kcm9pZDpjb2xvci9wcmltYXJ5X3RleHRfbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/YW5kcm9pZDphdHRyL2VkaXRUZXh0Q29sb3I8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyX3ZlcnRpY2FsPC9pdGVtPgogICAgIDwvc3R5bGU+CiAgICAgCkBAIC00NDEsMTQgKzQ1Myw4IEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2RlZmF1bHQ8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAotICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQXV0b0NvbXBsZXRlVGV4dFZpZXciPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmZvY3VzYWJsZSI+dHJ1ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpmb2N1c2FibGVJblRvdWNoTW9kZSI+dHJ1ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjbGlja2FibGUiPnRydWU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvZWRpdF90ZXh0PC9pdGVtPgorICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQXV0b0NvbXBsZXRlVGV4dFZpZXciIHBhcmVudD0iV2lkZ2V0LkVkaXRUZXh0Ij4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb21wbGV0aW9uSGludFZpZXciPkBhbmRyb2lkOmxheW91dC9zaW1wbGVfZHJvcGRvd25faGludDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+P2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bUludmVyc2U8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyX3ZlcnRpY2FsPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbXBsZXRpb25UaHJlc2hvbGQiPjI8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZHJvcERvd25TZWxlY3RvciI+QGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBvcHVwQmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvc3Bpbm5lcl9kcm9wZG93bl9iYWNrZ3JvdW5kPC9pdGVtPgpAQCAtNDYwLDYgKzQ2NiwxOCBAQAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuU3Bpbm5lciI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2Ryb3Bkb3duPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNsaWNrYWJsZSI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcGlubmVyTW9kZSI+ZGlhbG9nPC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZHJvcERvd25TZWxlY3RvciI+QGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBvcHVwQmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvc3Bpbm5lcl9kcm9wZG93bl9iYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duVmVydGljYWxPZmZzZXQiPi0xMGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkcm9wRG93bkhvcml6b250YWxPZmZzZXQiPjBkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZHJvcERvd25XaWR0aCI+d3JhcF9jb250ZW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBvcHVwUHJvbXB0VmlldyI+QGFuZHJvaWQ6bGF5b3V0L3NpbXBsZV9kcm9wZG93bl9oaW50PC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LlNwaW5uZXIuRHJvcERvd24iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNwaW5uZXJNb2RlIj5kcm9wZG93bjwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5UZXh0Vmlldy5Qb3B1cE1lbnUiPgpAQCAtNDc5LDE3ICs0OTcsMTcgQEAKICAgICA8L3N0eWxlPgogICAgIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuRHJvcERvd25JdGVtLlNwaW5uZXIiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNoZWNrTWFyayI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX3JhZGlvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNoZWNrTWFyayI+P2FuZHJvaWQ6YXR0ci9saXN0Q2hvaWNlSW5kaWNhdG9yU2luZ2xlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LlNjcm9sbFZpZXciPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjcm9sbGJhcnMiPnZlcnRpY2FsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmZhZGluZ0VkZ2UiPnZlcnRpY2FsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmZhZGluZ0VkZ2UiPm5vbmU8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9yaXpvbnRhbFNjcm9sbFZpZXciPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjcm9sbGJhcnMiPmhvcml6b250YWw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZmFkaW5nRWRnZSI+aG9yaXpvbnRhbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpmYWRpbmdFZGdlIj5ub25lPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0Lkxpc3RWaWV3IiBwYXJlbnQ9IldpZGdldC5BYnNMaXN0VmlldyI+CkBAIC00OTksNyArNTE3LDcgQEAKICAgICA8L3N0eWxlPgogICAgIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuTGlzdFZpZXcuV2hpdGUiIHBhcmVudD0iV2lkZ2V0LkFic0xpc3RWaWV3Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsaXN0U2VsZWN0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsaXN0U2VsZWN0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjYWNoZUNvbG9ySGludCI+P2FuZHJvaWQ6YXR0ci9jb2xvckJhY2tncm91bmRDYWNoZUhpbnQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZGl2aWRlciI+QGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodF9vcGFxdWU8L2l0ZW0+CiAgICAgPC9zdHlsZT4gICAgCkBAIC01MTIsNyArNTMwLDcgQEAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0Lkxpc3RWaWV3Lk1lbnUiPgogCQk8aXRlbSBuYW1lPSJhbmRyb2lkOmNhY2hlQ29sb3JIaW50Ij5AbnVsbDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY3JvbGxiYXJzIj52ZXJ0aWNhbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpmYWRpbmdFZGdlIj52ZXJ0aWNhbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpmYWRpbmdFZGdlIj5ub25lPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJsaXN0U2VsZWN0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL21lbnVfc2VsZWN0b3I8L2l0ZW0+CiAgICAgICAgIDwhLS0gTGlnaHQgYmFja2dyb3VuZCBmb3IgdGhlIGxpc3QgaW4gbWVudXMsIHNvIHRoZSBkaXZpZGVyIGZvciBicmlnaHQgdGhlbWVzIC0tPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRpdmlkZXIiPkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrPC9pdGVtPgpAQCAtNTQ1LDcgKzU2Myw3IEBACiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuR2FsbGVyeSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZmFkaW5nRWRnZSI+aG9yaXpvbnRhbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpmYWRpbmdFZGdlIj5ub25lPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcl92ZXJ0aWNhbDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcGFjaW5nIj4tMjBkaXA8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dW5zZWxlY3RlZEFscGhhIj4wLjg1PC9pdGVtPgpAQCAtNTU2LDYgKzU3NCwxMSBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBvcHVwQW5pbWF0aW9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL0FuaW1hdGlvbi5Qb3B1cFdpbmRvdzwvaXRlbT4KICAgICA8L3N0eWxlPgogCisgICAgPCEtLSBEZWZhdWx0IHN0eWxlIGZvciB7QGxpbmsgYW5kcm9pZC5hcHAuRnJhZ21lbnRCcmVhZENydW1ic30gdmlldy4gLS0+CisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5GcmFnbWVudEJyZWFkQ3J1bWJzIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nIj40ZHA8L2l0ZW0+CisgICAgPC9zdHlsZT4KKwogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuS2V5Ym9hcmRWaWV3IiBwYXJlbnQ9ImFuZHJvaWQ6V2lkZ2V0Ij4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9rZXlib2FyZF9iYWNrZ3JvdW5kPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmtleUJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9rZXlib2FyZF9rZXk8L2l0ZW0+CkBAIC01NzcsNiArNjAwLDcgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9xdWlja2NvbnRhY3RfYmFkZ2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y2xpY2thYmxlIj50cnVlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjYWxlVHlwZSI+Zml0Q2VudGVyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfY29udGFjdF9waWN0dXJlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAgICAgCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5RdWlja0NvbnRhY3RCYWRnZVNtYWxsIj4KQEAgLTYxNiw5ICs2NDAsOSBAQAogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+I0ZGRkY5MjAwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+P3RleHRDb2xvckhpZ2hsaWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaW50Ij4/dGV4dENvbG9ySGludDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JMaW5rIj4jNUM1Q0ZGPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPj90ZXh0Q29sb3JMaW5rPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNnNwPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgogICAgIDwvc3R5bGU+CkBAIC02MjYsNyArNjUwLDggQEAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSW52ZXJzZSI+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnlJbnZlcnNlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpbnQiPj90ZXh0Q29sb3JIaW50SW52ZXJzZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JMaW5rIj4jMDAwMEVFPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+P3RleHRDb2xvckhpZ2hsaWdodEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yTGluayI+P3RleHRDb2xvckxpbmtJbnZlcnNlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuVGhlbWUiPgpAQCAtNjM0LDQxICs2NTksNDAgQEAKIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5EaWFsb2dXaW5kb3dUaXRsZSI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE4c3A8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ub3JtYWw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/dGV4dENvbG9yUHJpbWFyeTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkxhcmdlIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MjJzcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTGFyZ2UuSW52ZXJzZSI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/dGV4dENvbG9yUHJpbWFyeUludmVyc2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+P3RleHRDb2xvckhpbnRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+P3RleHRDb2xvckhpZ2hsaWdodEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yTGluayI+P3RleHRDb2xvckxpbmtJbnZlcnNlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTWVkaXVtIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MThzcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTWVkaXVtLkludmVyc2UiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnlJbnZlcnNlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpbnQiPj90ZXh0Q29sb3JIaW50SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaWdobGlnaHQiPj90ZXh0Q29sb3JIaWdobGlnaHRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPj90ZXh0Q29sb3JMaW5rSW52ZXJzZTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlNtYWxsIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTRzcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JTZWNvbmRhcnk8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TbWFsbC5JbnZlcnNlIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JTZWNvbmRhcnlJbnZlcnNlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpbnQiPj90ZXh0Q29sb3JIaW50SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaWdobGlnaHQiPj90ZXh0Q29sb3JIaWdobGlnaHRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPj90ZXh0Q29sb3JMaW5rSW52ZXJzZTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlRoZW1lLkRpYWxvZyIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5UaGVtZSI+CkBAIC04NzUsNCArODk5LDc5OSBAQAogICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dFbnRlckFuaW1hdGlvbiI+QGFuZHJvaWQ6YW5pbS9mYWRlX2luPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dFeGl0QW5pbWF0aW9uIj5AYW5kcm9pZDphbmltL2ZhZGVfb3V0PC9pdGVtPgogICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkFjdGlvbkJhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYWN0aW9uX2Jhcl9iYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRpc3BsYXlPcHRpb25zIj51c2VMb2dvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRpdmlkZXIiPkBhbmRyb2lkOmRyYXdhYmxlL2FjdGlvbl9iYXJfZGl2aWRlcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpoZWlnaHQiPj9hbmRyb2lkOmF0dHIvYWN0aW9uQmFyU2l6ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nTGVmdCI+M2RpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nVG9wIj4wZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdSaWdodCI+M2RpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nQm90dG9tIj4wZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRpdGxlVGV4dFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5XaWRnZXQuQWN0aW9uQmFyLlRpdGxlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnN1YnRpdGxlVGV4dFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5XaWRnZXQuQWN0aW9uQmFyLlN1YnRpdGxlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkFjdGlvbk1vZGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPj9hbmRyb2lkOmF0dHIvYWN0aW9uTW9kZUJhY2tncm91bmQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6aGVpZ2h0Ij4/YW5kcm9pZDphdHRyL2FjdGlvbkJhclNpemU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6aXRlbVBhZGRpbmciPj9hbmRyb2lkOmF0dHIvYWN0aW9uQnV0dG9uUGFkZGluZzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0aXRsZVRleHRTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LkFjdGlvbk1vZGUuVGl0bGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3VidGl0bGVUZXh0U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLldpZGdldC5BY3Rpb25Nb2RlLlN1YnRpdGxlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LkFjdGlvbkJhci5UaXRsZSIKKyAgICAgICAgICAgcGFyZW50PSJAYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpdW0uSW52ZXJzZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XaWRnZXQuQWN0aW9uQmFyLlN1YnRpdGxlIgorICAgICAgICAgICBwYXJlbnQ9IkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlNtYWxsLkludmVyc2UiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LkFjdGlvbk1vZGUuVGl0bGUiCisgICAgICAgICAgIHBhcmVudD0iQGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaXVtLkludmVyc2UiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LkFjdGlvbk1vZGUuU3VidGl0bGUiCisgICAgICAgICAgIHBhcmVudD0iQGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU21hbGwuSW52ZXJzZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQWN0aW9uQnV0dG9uIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5BY3Rpb25CdXR0b24uT3ZlcmZsb3ciPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX21lbnVfbW9yZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbW9yZV9pdGVtX2xhYmVsPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkFjdGlvbkJ1dHRvbi5DbG9zZU1vZGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+P2FuZHJvaWQ6YXR0ci9hY3Rpb25Nb2RlQ2xvc2VEcmF3YWJsZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5BY3Rpb25CYXJWaWV3X1RhYlZpZXciPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBkcmF3YWJsZS9taW5pdGFiX2x0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdMZWZ0Ij40ZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdSaWdodCI+NGRpcDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5BY3Rpb25CYXJWaWV3X1RhYkJhciI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQWN0aW9uQmFyVmlld19UYWJUZXh0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+QHN0eWxlL1RleHRBcHBlYXJhbmNlLldpZGdldC5UZXh0Vmlldy5Qb3B1cE1lbnU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnlJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xOHNwPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdyI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZHJvcERvd25TZWxlY3RvciI+QGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBvcHVwQmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvc3Bpbm5lcl9kcm9wZG93bl9iYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duVmVydGljYWxPZmZzZXQiPi0xMGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkcm9wRG93bkhvcml6b250YWxPZmZzZXQiPjBkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZHJvcERvd25XaWR0aCI+d3JhcF9jb250ZW50PC9pdGVtPiAgICAgICAgCisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuUG9wdXBNZW51IiBwYXJlbnQ9IldpZGdldC5MaXN0UG9wdXBXaW5kb3ciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LlBvcHVwTWVudSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AYW5kcm9pZDpjb2xvci9wcmltYXJ5X3RleHRfbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+QGFuZHJvaWQ6Y29sb3IvaGludF9mb3JlZ3JvdW5kX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+QGFuZHJvaWQ6Y29sb3IvaGlnaGxpZ2h0ZWRfdGV4dF9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JMaW5rIj5AYW5kcm9pZDpjb2xvci9saW5rX3RleHRfbGlnaHQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5XaWRnZXQuUG9wdXBNZW51LkxhcmdlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MjJzcDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLldpZGdldC5Qb3B1cE1lbnUuU21hbGwiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNHNwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGFuZHJvaWQ6Y29sb3Ivc2Vjb25kYXJ5X3RleHRfbGlnaHQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gQmVnaW4gSG9sbyB0aGVtZSBzdHlsZXMgLS0+CisKKyAgICA8IS0tIFRleHQgU3R5bGVzIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvIiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uSW52ZXJzZSIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5JbnZlcnNlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaW50Ij4/dGV4dENvbG9ySGludEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGlnaGxpZ2h0Ij4/dGV4dENvbG9ySGlnaGxpZ2h0SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JMaW5rIj4/dGV4dENvbG9yTGlua0ludmVyc2U8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLkxhcmdlIiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLkxhcmdlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uTWVkaXVtIiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLk1lZGl1bSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLlNtYWxsIiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLlNtYWxsIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uTGFyZ2UuSW52ZXJzZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/dGV4dENvbG9yUHJpbWFyeUludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+P3RleHRDb2xvckhpbnRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+P3RleHRDb2xvckhpZ2hsaWdodEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yTGluayI+P3RleHRDb2xvckxpbmtJbnZlcnNlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5NZWRpdW0uSW52ZXJzZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/dGV4dENvbG9yUHJpbWFyeUludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+P3RleHRDb2xvckhpbnRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+P3RleHRDb2xvckhpZ2hsaWdodEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yTGluayI+P3RleHRDb2xvckxpbmtJbnZlcnNlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5TbWFsbC5JbnZlcnNlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaW50Ij4/dGV4dENvbG9ySGludEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGlnaGxpZ2h0Ij4/dGV4dENvbG9ySGlnaGxpZ2h0SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JMaW5rIj4/dGV4dENvbG9yTGlua0ludmVyc2U8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLlNlYXJjaFJlc3VsdCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLlNlYXJjaFJlc3VsdC5UaXRsZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLlNlYXJjaFJlc3VsdC5TdWJ0aXRsZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldCIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5XaWRnZXQiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuQnV0dG9uIiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLkhvbG8uU21hbGwuSW52ZXJzZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AYW5kcm9pZDpjb2xvci9wcmltYXJ5X3RleHRfbGlnaHRfbm9kaXNhYmxlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuSWNvbk1lbnUuSXRlbSIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5Ib2xvLlNtYWxsIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuVGFiV2lkZ2V0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTRzcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPkBhbmRyb2lkOmNvbG9yL3RhYl9pbmRpY2F0b3JfdGV4dDwvaXRlbT4KKyAgICA8L3N0eWxlPgorICAgIAorICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5UZXh0VmlldyI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/dGV4dENvbG9yUHJpbWFyeURpc2FibGVPbmx5PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpbnQiPj90ZXh0Q29sb3JIaW50PC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuVGV4dFZpZXcuUG9wdXBNZW51Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MThzcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5RGlzYWJsZU9ubHk8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+P3RleHRDb2xvckhpbnQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5Ecm9wRG93bkhpbnQiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnlJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNHNwPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuRHJvcERvd25JdGVtIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9saWdodF9kaXNhYmxlX29ubHk8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5UZXh0Vmlldy5TcGlubmVySXRlbSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AYW5kcm9pZDpjb2xvci9wcmltYXJ5X3RleHRfbGlnaHRfZGlzYWJsZV9vbmx5PC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuRWRpdFRleHQiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGNvbG9yL3dpZGdldF9lZGl0dGV4dF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+QGFuZHJvaWQ6Y29sb3IvaGludF9mb3JlZ3JvdW5kX2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5Qb3B1cE1lbnUiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LlBvcHVwTWVudSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5Qb3B1cE1lbnUuTGFyZ2UiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LlBvcHVwTWVudS5MYXJnZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5Qb3B1cE1lbnUuU21hbGwiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LlBvcHVwTWVudS5TbWFsbCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5BY3Rpb25CYXIuVGl0bGUiCisgICAgICAgICAgIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuSG9sby5NZWRpdW0iPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuQWN0aW9uQmFyLlN1YnRpdGxlIgorICAgICAgICAgICBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLkhvbG8uU21hbGwiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuQWN0aW9uTW9kZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5BY3Rpb25Nb2RlLlRpdGxlIiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLldpZGdldC5BY3Rpb25Nb2RlLlRpdGxlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LkFjdGlvbk1vZGUuU3VidGl0bGUiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LkFjdGlvbk1vZGUuU3VidGl0bGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JTZWNvbmRhcnk8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpbmRvd1RpdGxlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPiNmZmY8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE0c3A8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5EaWFsb2dXaW5kb3dUaXRsZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE4c3A8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gTGlnaHQgdGV4dCBzdHlsZXMgLS0+CisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuSG9sbyI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LkludmVyc2UiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnlJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpbnQiPj90ZXh0Q29sb3JIaW50SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaWdobGlnaHQiPj90ZXh0Q29sb3JIaWdobGlnaHRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPj90ZXh0Q29sb3JMaW5rSW52ZXJzZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuTGFyZ2UiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5NZWRpdW0iPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5TbWFsbCI+CisgICAgPC9zdHlsZT4KKyAKKyAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LkxhcmdlLkludmVyc2UiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnlJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpbnQiPj90ZXh0Q29sb3JIaW50SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaWdobGlnaHQiPj90ZXh0Q29sb3JIaWdobGlnaHRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPj90ZXh0Q29sb3JMaW5rSW52ZXJzZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuTWVkaXVtLkludmVyc2UiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnlJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpbnQiPj90ZXh0Q29sb3JIaW50SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaWdobGlnaHQiPj90ZXh0Q29sb3JIaWdobGlnaHRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPj90ZXh0Q29sb3JMaW5rSW52ZXJzZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuU21hbGwuSW52ZXJzZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/dGV4dENvbG9yUHJpbWFyeUludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+P3RleHRDb2xvckhpbnRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpZ2hsaWdodCI+P3RleHRDb2xvckhpZ2hsaWdodEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yTGluayI+P3RleHRDb2xvckxpbmtJbnZlcnNlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5TZWFyY2hSZXN1bHQiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuSG9sby5TZWFyY2hSZXN1bHQiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5TZWFyY2hSZXN1bHQuVGl0bGUiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5TZWFyY2hSZXN1bHQuU3VidGl0bGUiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5XaWRnZXQiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuV2lkZ2V0Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuV2lkZ2V0LkJ1dHRvbiI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LldpZGdldC5FZGl0VGV4dCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivd2lkZ2V0X2VkaXR0ZXh0X2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+QGFuZHJvaWQ6Y29sb3IvaGludF9mb3JlZ3JvdW5kX2hvbG9fZGFyazwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuV2lkZ2V0LlBvcHVwTWVudSIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5Qb3B1cE1lbnUiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5XaWRnZXQuUG9wdXBNZW51LkxhcmdlIiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LlBvcHVwTWVudS5MYXJnZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LldpZGdldC5Qb3B1cE1lbnUuU21hbGwiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuUG9wdXBNZW51LlNtYWxsIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuV2lkZ2V0LkRyb3BEb3duSGludCIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5Ecm9wRG93bkhpbnQiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5XaWRnZXQuQWN0aW9uTW9kZS5UaXRsZSIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5XaWRnZXQuQWN0aW9uTW9kZS5UaXRsZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LldpZGdldC5BY3Rpb25Nb2RlLlN1YnRpdGxlIiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLldpZGdldC5BY3Rpb25Nb2RlLlN1YnRpdGxlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuV2luZG93VGl0bGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+I2ZmZjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTRzcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LkRpYWxvZ1dpbmRvd1RpdGxlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MThzcDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPCEtLSBXaWRnZXQgU3R5bGVzIC0tPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvIiBwYXJlbnQ9IldpZGdldCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5CdXR0b24iIHBhcmVudD0iV2lkZ2V0LkJ1dHRvbiI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2RlZmF1bHRfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj4/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDptaW5IZWlnaHQiPjQ4ZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdMZWZ0Ij4zMmRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nUmlnaHQiPjMyZGlwPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQnV0dG9uLlNtYWxsIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fZGVmYXVsdF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bWluSGVpZ2h0Ij40MGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nTGVmdCI+MjRkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ1JpZ2h0Ij4yNGRpcDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkJ1dHRvbi5JbnNldCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYnV0dG9uX2luc2V0PC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQnV0dG9uLlRvZ2dsZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX3RvZ2dsZV9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dE9uIj5AYW5kcm9pZDpzdHJpbmcvY2FwaXRhbF9vbjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0T2ZmIj5AYW5kcm9pZDpzdHJpbmcvY2FwaXRhbF9vZmY8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZGlzYWJsZWRBbHBoYSI+P2FuZHJvaWQ6YXR0ci9kaXNhYmxlZEFscGhhPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj4/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bWluSGVpZ2h0Ij40OGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nTGVmdCI+MjRkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ1JpZ2h0Ij4yNGRpcDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlRleHRWaWV3IiBwYXJlbnQ9IldpZGdldC5UZXh0VmlldyI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5UZXh0Vmlldy5MaXN0U2VwYXJhdG9yIiBwYXJlbnQ9IldpZGdldC5UZXh0Vmlldy5MaXN0U2VwYXJhdG9yIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlRleHRTZWxlY3RIYW5kbGUiIHBhcmVudD0iV2lkZ2V0LlRleHRTZWxlY3RIYW5kbGUiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQWJzTGlzdFZpZXciIHBhcmVudD0iV2lkZ2V0LkFic0xpc3RWaWV3Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkF1dG9Db21wbGV0ZVRleHRWaWV3IiBwYXJlbnQ9IldpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldyI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5Db21wb3VuZEJ1dHRvbi5DaGVja0JveCIgcGFyZW50PSJXaWRnZXQuQ29tcG91bmRCdXR0b24uQ2hlY2tCb3giPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlzdFZpZXcuRHJvcERvd24iPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uRWRpdFRleHQiIHBhcmVudD0iV2lkZ2V0LkVkaXRUZXh0Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkV4cGFuZGFibGVMaXN0VmlldyIgcGFyZW50PSJXaWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkV4cGFuZGFibGVMaXN0Vmlldy5XaGl0ZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5HYWxsZXJ5IiBwYXJlbnQ9IldpZGdldC5HYWxsZXJ5Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkdlc3R1cmVPdmVybGF5VmlldyIgcGFyZW50PSJXaWRnZXQuR2VzdHVyZU92ZXJsYXlWaWV3Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkdyaWRWaWV3IiBwYXJlbnQ9IldpZGdldC5HcmlkVmlldyI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5JbWFnZUJ1dHRvbiIgcGFyZW50PSJXaWRnZXQuSW1hZ2VCdXR0b24iPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uSW1hZ2VXZWxsIiBwYXJlbnQ9IldpZGdldC5JbWFnZVdlbGwiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlzdFZpZXciIHBhcmVudD0iV2lkZ2V0Lkxpc3RWaWV3Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpc3RWaWV3LldoaXRlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlBvcHVwV2luZG93IiBwYXJlbnQ9IldpZGdldC5Qb3B1cFdpbmRvdyI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5Qcm9ncmVzc0JhciIgcGFyZW50PSJXaWRnZXQuUHJvZ3Jlc3NCYXIiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uUHJvZ3Jlc3NCYXIuSG9yaXpvbnRhbCIgcGFyZW50PSJXaWRnZXQuUHJvZ3Jlc3NCYXIuSG9yaXpvbnRhbCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5Qcm9ncmVzc0Jhci5TbWFsbCIgcGFyZW50PSJXaWRnZXQuUHJvZ3Jlc3NCYXIuSG9yaXpvbnRhbCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5Qcm9ncmVzc0Jhci5TbWFsbC5UaXRsZSIgcGFyZW50PSJXaWRnZXQuUHJvZ3Jlc3NCYXIuU21hbGwuVGl0bGUiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uUHJvZ3Jlc3NCYXIuTGFyZ2UiIHBhcmVudD0iV2lkZ2V0LlByb2dyZXNzQmFyLkxhcmdlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlByb2dyZXNzQmFyLkludmVyc2UiIHBhcmVudD0iV2lkZ2V0LlByb2dyZXNzQmFyLkludmVyc2UiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uUHJvZ3Jlc3NCYXIuU21hbGwuSW52ZXJzZSIgcGFyZW50PSJXaWRnZXQuUHJvZ3Jlc3NCYXIuU21hbGwuSW52ZXJzZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5Qcm9ncmVzc0Jhci5MYXJnZS5JbnZlcnNlIiBwYXJlbnQ9IldpZGdldC5Qcm9ncmVzc0Jhci5MYXJnZS5JbnZlcnNlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlNlZWtCYXIiIHBhcmVudD0iV2lkZ2V0LlNlZWtCYXIiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uUmF0aW5nQmFyIiBwYXJlbnQ9IldpZGdldC5SYXRpbmdCYXIiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uUmF0aW5nQmFyLkluZGljYXRvciIgcGFyZW50PSJXaWRnZXQuUmF0aW5nQmFyLkluZGljYXRvciI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5SYXRpbmdCYXIuU21hbGwiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQ29tcG91bmRCdXR0b24uUmFkaW9CdXR0b24iIHBhcmVudD0iV2lkZ2V0LkNvbXBvdW5kQnV0dG9uLlJhZGlvQnV0dG9uIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlNjcm9sbFZpZXciIHBhcmVudD0iV2lkZ2V0LlNjcm9sbFZpZXciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uSG9yaXpvbnRhbFNjcm9sbFZpZXciIHBhcmVudD0iV2lkZ2V0Lkhvcml6b250YWxTY3JvbGxWaWV3Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlNwaW5uZXIiIHBhcmVudD0iV2lkZ2V0LlNwaW5uZXIuRHJvcERvd24iPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uU3Bpbm5lci5Ecm9wRG93biI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5Db21wb3VuZEJ1dHRvbi5TdGFyIiBwYXJlbnQ9IldpZGdldC5Db21wb3VuZEJ1dHRvbi5TdGFyIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlRhYldpZGdldCIgcGFyZW50PSJXaWRnZXQuVGFiV2lkZ2V0Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLldlYlRleHRWaWV3IiBwYXJlbnQ9IldpZGdldC5XZWJUZXh0VmlldyI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5XZWJWaWV3IiBwYXJlbnQ9IldpZGdldC5XZWJWaWV3Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkRyb3BEb3duSXRlbSIgcGFyZW50PSJXaWRnZXQuRHJvcERvd25JdGVtIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkRyb3BEb3duSXRlbS5TcGlubmVyIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlRleHRWaWV3LlNwaW5uZXJJdGVtIiBwYXJlbnQ9IldpZGdldC5UZXh0Vmlldy5TcGlubmVySXRlbSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5LZXlib2FyZFZpZXciIHBhcmVudD0iV2lkZ2V0LktleWJvYXJkVmlldyI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5RdWlja0NvbnRhY3RCYWRnZS5XaW5kb3dTbWFsbCIgcGFyZW50PSJXaWRnZXQuUXVpY2tDb250YWN0QmFkZ2UuV2luZG93U21hbGwiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uUXVpY2tDb250YWN0QmFkZ2UuV2luZG93TWVkaXVtIiBwYXJlbnQ9IldpZGdldC5RdWlja0NvbnRhY3RCYWRnZS5XaW5kb3dNZWRpdW0iPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uUXVpY2tDb250YWN0QmFkZ2UuV2luZG93TGFyZ2UiIHBhcmVudD0iV2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlLldpbmRvd0xhcmdlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlF1aWNrQ29udGFjdEJhZGdlU21hbGwuV2luZG93U21hbGwiIHBhcmVudD0iV2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlU21hbGwuV2luZG93U21hbGwiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uUXVpY2tDb250YWN0QmFkZ2VTbWFsbC5XaW5kb3dNZWRpdW0iIHBhcmVudD0iV2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlU21hbGwuV2luZG93TWVkaXVtIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlF1aWNrQ29udGFjdEJhZGdlU21hbGwuV2luZG93TGFyZ2UiIHBhcmVudD0iV2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlU21hbGwuV2luZG93TGFyZ2UiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlzdFBvcHVwV2luZG93IiBwYXJlbnQ9IldpZGdldC5MaXN0UG9wdXBXaW5kb3ciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uUG9wdXBNZW51IiBwYXJlbnQ9IldpZGdldC5Qb3B1cE1lbnUiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQWN0aW9uQnV0dG9uIiBwYXJlbnQ9IldpZGdldC5BY3Rpb25CdXR0b24iPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQWN0aW9uQnV0dG9uLk92ZXJmbG93IiBwYXJlbnQ9IldpZGdldC5BY3Rpb25CdXR0b24uT3ZlcmZsb3ciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQWN0aW9uQmFyVmlld19UYWJWaWV3IiBwYXJlbnQ9IldpZGdldC5BY3Rpb25CYXJWaWV3X1RhYlZpZXciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQWN0aW9uQmFyVmlld19UYWJCYXIiIHBhcmVudD0iV2lkZ2V0LkFjdGlvbkJhclZpZXdfVGFiQmFyIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkFjdGlvbkJhclZpZXdfVGFiVGV4dCIgcGFyZW50PSJXaWRnZXQuQWN0aW9uQmFyVmlld19UYWJUZXh0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+QHN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uTWVkaXVtPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xOHNwPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQWN0aW9uTW9kZSIgcGFyZW50PSJXaWRnZXQuQWN0aW9uTW9kZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvY2FiX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0aXRsZVRleHRTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuQWN0aW9uTW9kZS5UaXRsZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzdWJ0aXRsZVRleHRTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuQWN0aW9uTW9kZS5TdWJ0aXRsZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkFjdGlvbkJ1dHRvbi5DbG9zZU1vZGUiIHBhcmVudD0iV2lkZ2V0LkFjdGlvbkJ1dHRvbi5DbG9zZU1vZGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2NhYl9pY19jbG9zZV9ob2xvPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQWN0aW9uQmFyIiBwYXJlbnQ9IldpZGdldC5BY3Rpb25CYXIiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRpdGxlVGV4dFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5BY3Rpb25CYXIuVGl0bGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3VidGl0bGVUZXh0U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LkFjdGlvbkJhci5TdWJ0aXRsZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPCEtLSBMaWdodCB3aWRnZXQgc3R5bGVzIC0tPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LkJ1dHRvbiIgcGFyZW50PSJXaWRnZXQuQnV0dG9uIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LkJ1dHRvbi5TbWFsbCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5CdXR0b24uSW5zZXQiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuQnV0dG9uLlRvZ2dsZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX3RvZ2dsZV9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRPbiI+QGFuZHJvaWQ6c3RyaW5nL2NhcGl0YWxfb248L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dE9mZiI+QGFuZHJvaWQ6c3RyaW5nL2NhcGl0YWxfb2ZmPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRpc2FibGVkQWxwaGEiPj9hbmRyb2lkOmF0dHIvZGlzYWJsZWRBbHBoYTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+P2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOm1pbkhlaWdodCI+NDhkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ0xlZnQiPjI0ZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdSaWdodCI+MjRkaXA8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5UZXh0VmlldyIgcGFyZW50PSJXaWRnZXQuVGV4dFZpZXciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuVGV4dFZpZXcuTGlzdFNlcGFyYXRvciIgcGFyZW50PSJXaWRnZXQuVGV4dFZpZXcuTGlzdFNlcGFyYXRvciI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5UZXh0U2VsZWN0SGFuZGxlIiBwYXJlbnQ9IldpZGdldC5UZXh0U2VsZWN0SGFuZGxlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LkFic0xpc3RWaWV3IiBwYXJlbnQ9IldpZGdldC5BYnNMaXN0VmlldyI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5BdXRvQ29tcGxldGVUZXh0VmlldyIgcGFyZW50PSJXaWRnZXQuQXV0b0NvbXBsZXRlVGV4dFZpZXciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuQ29tcG91bmRCdXR0b24uQ2hlY2tCb3giIHBhcmVudD0iV2lkZ2V0LkNvbXBvdW5kQnV0dG9uLkNoZWNrQm94Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0Lkxpc3RWaWV3LkRyb3BEb3duIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LkVkaXRUZXh0IiBwYXJlbnQ9IldpZGdldC5FZGl0VGV4dCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5FeHBhbmRhYmxlTGlzdFZpZXciIHBhcmVudD0iV2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldyI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5FeHBhbmRhYmxlTGlzdFZpZXcuV2hpdGUiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuR2FsbGVyeSIgcGFyZW50PSJXaWRnZXQuR2FsbGVyeSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5HZXN0dXJlT3ZlcmxheVZpZXciIHBhcmVudD0iV2lkZ2V0Lkdlc3R1cmVPdmVybGF5VmlldyI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5HcmlkVmlldyIgcGFyZW50PSJXaWRnZXQuR3JpZFZpZXciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuSW1hZ2VCdXR0b24iIHBhcmVudD0iV2lkZ2V0LkltYWdlQnV0dG9uIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LkltYWdlV2VsbCIgcGFyZW50PSJXaWRnZXQuSW1hZ2VXZWxsIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0Lkxpc3RWaWV3IiBwYXJlbnQ9IldpZGdldC5MaXN0VmlldyI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5MaXN0Vmlldy5XaGl0ZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5Qb3B1cFdpbmRvdyIgcGFyZW50PSJXaWRnZXQuUG9wdXBXaW5kb3ciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuUHJvZ3Jlc3NCYXIiIHBhcmVudD0iV2lkZ2V0LlByb2dyZXNzQmFyIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LlByb2dyZXNzQmFyLkhvcml6b250YWwiIHBhcmVudD0iV2lkZ2V0LlByb2dyZXNzQmFyLkhvcml6b250YWwiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuUHJvZ3Jlc3NCYXIuU21hbGwiIHBhcmVudD0iV2lkZ2V0LlByb2dyZXNzQmFyLlNtYWxsIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LlByb2dyZXNzQmFyLlNtYWxsLlRpdGxlIiBwYXJlbnQ9IldpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbC5UaXRsZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5Qcm9ncmVzc0Jhci5MYXJnZSIgcGFyZW50PSJXaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2UiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuUHJvZ3Jlc3NCYXIuSW52ZXJzZSIgcGFyZW50PSJXaWRnZXQuUHJvZ3Jlc3NCYXIuSW52ZXJzZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5Qcm9ncmVzc0Jhci5TbWFsbC5JbnZlcnNlIiBwYXJlbnQ9IldpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbC5JbnZlcnNlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LlByb2dyZXNzQmFyLkxhcmdlLkludmVyc2UiIHBhcmVudD0iV2lkZ2V0LlByb2dyZXNzQmFyLkxhcmdlLkludmVyc2UiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuU2Vla0JhciIgcGFyZW50PSJXaWRnZXQuU2Vla0JhciI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5SYXRpbmdCYXIiIHBhcmVudD0iV2lkZ2V0LlJhdGluZ0JhciI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5SYXRpbmdCYXIuSW5kaWNhdG9yIiBwYXJlbnQ9IldpZGdldC5SYXRpbmdCYXIuSW5kaWNhdG9yIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LlJhdGluZ0Jhci5TbWFsbCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5Db21wb3VuZEJ1dHRvbi5SYWRpb0J1dHRvbiIgcGFyZW50PSJXaWRnZXQuQ29tcG91bmRCdXR0b24uUmFkaW9CdXR0b24iPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuU2Nyb2xsVmlldyIgcGFyZW50PSJXaWRnZXQuU2Nyb2xsVmlldyI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5Ib3Jpem9udGFsU2Nyb2xsVmlldyIgcGFyZW50PSJXaWRnZXQuSG9yaXpvbnRhbFNjcm9sbFZpZXciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuU3Bpbm5lciIgcGFyZW50PSJXaWRnZXQuU3Bpbm5lci5Ecm9wRG93biI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5TcGlubmVyLkRyb3BEb3duIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LkNvbXBvdW5kQnV0dG9uLlN0YXIiIHBhcmVudD0iV2lkZ2V0LkNvbXBvdW5kQnV0dG9uLlN0YXIiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuVGFiV2lkZ2V0IiBwYXJlbnQ9IldpZGdldC5UYWJXaWRnZXQiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuV2ViVGV4dFZpZXciIHBhcmVudD0iV2lkZ2V0LldlYlRleHRWaWV3Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LldlYlZpZXciIHBhcmVudD0iV2lkZ2V0LldlYlZpZXciPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuRHJvcERvd25JdGVtIiBwYXJlbnQ9IldpZGdldC5Ecm9wRG93bkl0ZW0iPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuRHJvcERvd25JdGVtLlNwaW5uZXIiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuVGV4dFZpZXcuU3Bpbm5lckl0ZW0iIHBhcmVudD0iV2lkZ2V0LlRleHRWaWV3LlNwaW5uZXJJdGVtIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LktleWJvYXJkVmlldyIgcGFyZW50PSJXaWRnZXQuS2V5Ym9hcmRWaWV3Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LlF1aWNrQ29udGFjdEJhZGdlLldpbmRvd1NtYWxsIiBwYXJlbnQ9IldpZGdldC5RdWlja0NvbnRhY3RCYWRnZS5XaW5kb3dTbWFsbCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5RdWlja0NvbnRhY3RCYWRnZS5XaW5kb3dNZWRpdW0iIHBhcmVudD0iV2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlLldpbmRvd01lZGl1bSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5RdWlja0NvbnRhY3RCYWRnZS5XaW5kb3dMYXJnZSIgcGFyZW50PSJXaWRnZXQuUXVpY2tDb250YWN0QmFkZ2UuV2luZG93TGFyZ2UiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuUXVpY2tDb250YWN0QmFkZ2VTbWFsbC5XaW5kb3dTbWFsbCIgcGFyZW50PSJXaWRnZXQuUXVpY2tDb250YWN0QmFkZ2VTbWFsbC5XaW5kb3dTbWFsbCI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5RdWlja0NvbnRhY3RCYWRnZVNtYWxsLldpbmRvd01lZGl1bSIgcGFyZW50PSJXaWRnZXQuUXVpY2tDb250YWN0QmFkZ2VTbWFsbC5XaW5kb3dNZWRpdW0iPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuUXVpY2tDb250YWN0QmFkZ2VTbWFsbC5XaW5kb3dMYXJnZSIgcGFyZW50PSJXaWRnZXQuUXVpY2tDb250YWN0QmFkZ2VTbWFsbC5XaW5kb3dMYXJnZSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5MaXN0UG9wdXBXaW5kb3ciIHBhcmVudD0iV2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdyI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5Qb3B1cE1lbnUiIHBhcmVudD0iV2lkZ2V0LlBvcHVwTWVudSI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5BY3Rpb25CdXR0b24iIHBhcmVudD0iV2lkZ2V0LkFjdGlvbkJ1dHRvbiI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5BY3Rpb25CdXR0b24uT3ZlcmZsb3ciIHBhcmVudD0iV2lkZ2V0LkFjdGlvbkJ1dHRvbi5PdmVyZmxvdyI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5BY3Rpb25CYXJWaWV3X1RhYlZpZXciIHBhcmVudD0iV2lkZ2V0LkFjdGlvbkJhclZpZXdfVGFiVmlldyI+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5BY3Rpb25CYXJWaWV3X1RhYkJhciIgcGFyZW50PSJXaWRnZXQuQWN0aW9uQmFyVmlld19UYWJCYXIiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuQWN0aW9uQmFyVmlld19UYWJUZXh0IiBwYXJlbnQ9IldpZGdldC5BY3Rpb25CYXJWaWV3X1RhYlRleHQiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuQWN0aW9uTW9kZSIgcGFyZW50PSJXaWRnZXQuQWN0aW9uTW9kZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvY2FiX2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGl0bGVUZXh0U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LkFjdGlvbk1vZGUuVGl0bGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3VidGl0bGVUZXh0U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LkFjdGlvbk1vZGUuU3VidGl0bGU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5BY3Rpb25CdXR0b24uQ2xvc2VNb2RlIiBwYXJlbnQ9IldpZGdldC5BY3Rpb25CdXR0b24uQ2xvc2VNb2RlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LkFjdGlvbkJhciIgcGFyZW50PSJXaWRnZXQuQWN0aW9uQmFyIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0aXRsZVRleHRTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuQWN0aW9uQmFyLlRpdGxlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnN1YnRpdGxlVGV4dFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5BY3Rpb25CYXIuU3VidGl0bGU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gQW5pbWF0aW9uIFN0eWxlcyAtLT4KKworICAgIDxzdHlsZSBuYW1lPSJBbmltYXRpb24uSG9sbyIgcGFyZW50PSJBbmltYXRpb24iPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iQW5pbWF0aW9uLkhvbG8uQWN0aXZpdHkiIHBhcmVudD0iQW5pbWF0aW9uLkFjdGl2aXR5Ij4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkFuaW1hdGlvbi5Ib2xvLkRpYWxvZyIgcGFyZW50PSJBbmltYXRpb24uRGlhbG9nIj4KKyAgICA8L3N0eWxlPgorCisgICAgPCEtLSBEaWFsb2cgc3R5bGVzIC0tPgorCisgICAgPHN0eWxlIG5hbWU9IkFsZXJ0RGlhbG9nLkhvbG8iIHBhcmVudD0iQWxlcnREaWFsb2ciPgorICAgICAgICA8aXRlbSBuYW1lPSJmdWxsRGFyayI+QGFuZHJvaWQ6ZHJhd2FibGUvZGlhbG9nX2Z1bGxfaG9sbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idG9wRGFyayI+QGFuZHJvaWQ6ZHJhd2FibGUvZGlhbG9nX3RvcF9ob2xvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJjZW50ZXJEYXJrIj5AYW5kcm9pZDpkcmF3YWJsZS9kaWFsb2dfbWlkZGxlX2hvbG88L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImJvdHRvbURhcmsiPkBhbmRyb2lkOmRyYXdhYmxlL2RpYWxvZ19ib3R0b21faG9sbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZnVsbEJyaWdodCI+QGFuZHJvaWQ6ZHJhd2FibGUvZGlhbG9nX2Z1bGxfaG9sbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idG9wQnJpZ2h0Ij5AYW5kcm9pZDpkcmF3YWJsZS9kaWFsb2dfdG9wX2hvbG88L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImNlbnRlckJyaWdodCI+QGFuZHJvaWQ6ZHJhd2FibGUvZGlhbG9nX21pZGRsZV9ob2xvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJib3R0b21CcmlnaHQiPkBhbmRyb2lkOmRyYXdhYmxlL2RpYWxvZ19ib3R0b21faG9sbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYm90dG9tTWVkaXVtIj5AYW5kcm9pZDpkcmF3YWJsZS9kaWFsb2dfYm90dG9tX2hvbG88L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImNlbnRlck1lZGl1bSI+QGFuZHJvaWQ6ZHJhd2FibGUvZGlhbG9nX21pZGRsZV9ob2xvPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIFdpbmRvdyB0aXRsZSAtLT4KKyAgICA8c3R5bGUgbmFtZT0iV2luZG93VGl0bGVCYWNrZ3JvdW5kLkhvbG8iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL3RpdGxlX2JhcjwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpbmRvd1RpdGxlLkhvbG8iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNpbmdsZUxpbmUiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLldpbmRvd1RpdGxlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNoYWRvd0NvbG9yIj4jQkIwMDAwMDA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2hhZG93UmFkaXVzIj4yLjc1PC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iRGlhbG9nV2luZG93VGl0bGUuSG9sbyI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bWF4TGluZXMiPjE8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2Nyb2xsSG9yaXpvbnRhbGx5Ij50cnVlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj5Ac3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5EaWFsb2dXaW5kb3dUaXRsZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbAppbmRleCBlN2NiNTkzLi4yMWQ5MWJhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy90aGVtZXMueG1sCkBAIC01Myw2ICs1MywxMSBAQAogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaW50Ij5AYW5kcm9pZDpjb2xvci9oaW50X2ZvcmVncm91bmRfZGFyazwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGludEludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2hpbnRfZm9yZWdyb3VuZF9saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yU2VhcmNoVXJsIj5AYW5kcm9pZDpjb2xvci9zZWFyY2hfdXJsX3RleHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckhpZ2hsaWdodCI+QGFuZHJvaWQ6Y29sb3IvaGlnaGxpZ2h0ZWRfdGV4dF9kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaWdobGlnaHRJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9oaWdobGlnaHRlZF90ZXh0X2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JMaW5rIj5AYW5kcm9pZDpjb2xvci9saW5rX3RleHRfZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yTGlua0ludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2xpbmtfdGV4dF9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yQWxlcnREaWFsb2dMaXN0SXRlbSI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X2xpZ2h0X2Rpc2FibGVfb25seTwvaXRlbT4KIAogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZUxhcmdlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5MYXJnZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VNZWRpdW0iPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGl1bTwvaXRlbT4KQEAgLTY1LDExICs3MCwxNyBAQAogICAgICAgICAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VCdXR0b24iPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLldpZGdldC5CdXR0b248L2l0ZW0+CiAgICAgICAgIAorICAgICAgICA8aXRlbSBuYW1lPSJlZGl0VGV4dENvbG9yIj4/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnlJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJlZGl0VGV4dEJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2VkaXRfdGV4dDwvaXRlbT4KKyAgICAgICAgCiAgICAgICAgIDxpdGVtIG5hbWU9ImNhbmRpZGF0ZXNUZXh0U3R5bGVTcGFucyI+QGFuZHJvaWQ6c3RyaW5nL2NhbmRpZGF0ZXNfc3R5bGU8L2l0ZW0+CiAgICAgICAgIAogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q2hlY2tNYXJrIj5AYW5kcm9pZDpkcmF3YWJsZS9pbmRpY2F0b3JfY2hlY2tfbWFya19kYXJrPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q2hlY2tNYXJrSW52ZXJzZSI+QGFuZHJvaWQ6ZHJhd2FibGUvaW5kaWNhdG9yX2NoZWNrX21hcmtfbGlnaHQ8L2l0ZW0+CiAKKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VMYXJnZVBvcHVwTWVudSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LlBvcHVwTWVudS5MYXJnZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VTbWFsbFBvcHVwTWVudSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LlBvcHVwTWVudS5TbWFsbDwvaXRlbT4KKwogICAgICAgICA8IS0tIEJ1dHRvbiBzdHlsZXMgLS0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImJ1dHRvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuQnV0dG9uPC9pdGVtPgogCkBAIC04NCw5ICs5NSwxNSBAQAogICAgICAgICA8aXRlbSBuYW1lPSJzZWFyY2hSZXN1bHRMaXN0SXRlbUhlaWdodCI+NThkaXA8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Imxpc3REaXZpZGVyIj5AZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcms8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RTZXBhcmF0b3JUZXh0Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuVGV4dFZpZXcuTGlzdFNlcGFyYXRvcjwvaXRlbT4gICAKLSAgICAgICAgCi0JCTxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpbzwvaXRlbT4KLSAgICAJPGl0ZW0gbmFtZT0ibGlzdENob2ljZUluZGljYXRvck11bHRpcGxlIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fY2hlY2s8L2l0ZW0+ICAgIAorCisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdENob2ljZUluZGljYXRvck11bHRpcGxlIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fY2hlY2s8L2l0ZW0+CisKKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdENob2ljZUJhY2tncm91bmRJbmRpY2F0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0ZWRfYmFja2dyb3VuZDwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJhY3RpdmF0ZWRCYWNrZ3JvdW5kSW5kaWNhdG9yIj5AYW5kcm9pZDpkcmF3YWJsZS9hY3RpdmF0ZWRfYmFja2dyb3VuZDwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJsaXN0RGl2aWRlckFsZXJ0RGlhbG9nIj5AYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0PC9pdGVtPgogCiAgICAgICAgIDxpdGVtIG5hbWU9ImV4cGFuZGFibGVMaXN0UHJlZmVycmVkSXRlbVBhZGRpbmdMZWZ0Ij40MGRpcDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRDaGlsZFBhZGRpbmdMZWZ0Ij4KQEAgLTExNSw2ICsxMzIsOCBAQAogICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dUaXRsZUJhY2tncm91bmRTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2luZG93VGl0bGVCYWNrZ3JvdW5kPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FuaW1hdGlvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9BbmltYXRpb24uQWN0aXZpdHk8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93U29mdElucHV0TW9kZSI+c3RhdGVVbnNwZWNpZmllZHxhZGp1c3RVbnNwZWNpZmllZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93QWN0aW9uQmFyIj5mYWxzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93QWN0aW9uTW9kZU92ZXJsYXkiPmZhbHNlPC9pdGVtPgogCiAgICAgICAgIDwhLS0gRGlhbG9nIGF0dHJpYnV0ZXMgLS0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFsZXJ0RGlhbG9nU3R5bGUiPkBhbmRyb2lkOnN0eWxlL0FsZXJ0RGlhbG9nPC9pdGVtPgpAQCAtMTY0LDggKzE4Myw4IEBACiAgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbFRpdGxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuU21hbGwuVGl0bGU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLkxhcmdlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLkludmVyc2U8L2l0ZW0+Ci0JCTxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbEludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbC5JbnZlcnNlPC9pdGVtPgotCSAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlTGFyZ2VJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2UuSW52ZXJzZTwvaXRlbT4gCisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbEludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbC5JbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlTGFyZ2VJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2UuSW52ZXJzZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0ic2Vla0JhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuU2Vla0JhcjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0icmF0aW5nQmFyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5SYXRpbmdCYXI8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InJhdGluZ0JhclN0eWxlSW5kaWNhdG9yIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUmF0aW5nQmFyLkluZGljYXRvcjwvaXRlbT4KQEAgLTE3NCw2ICsxOTMsNyBAQAogICAgICAgICA8aXRlbSBuYW1lPSJzY3JvbGxWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5TY3JvbGxWaWV3PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJob3Jpem9udGFsU2Nyb2xsVmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9yaXpvbnRhbFNjcm9sbFZpZXc8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InNwaW5uZXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlNwaW5uZXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImRyb3BEb3duU3Bpbm5lclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuU3Bpbm5lci5Ecm9wRG93bjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0ic3RhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuQ29tcG91bmRCdXR0b24uU3RhcjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGFiV2lkZ2V0U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5UYWJXaWRnZXQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5UZXh0VmlldzwvaXRlbT4KQEAgLTE5MCw2ICsyMTAsOCBAQAogICAgICAgICA8aXRlbSBuYW1lPSJxdWlja0NvbnRhY3RCYWRnZVN0eWxlU21hbGxXaW5kb3dTbWFsbCI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlU21hbGwuV2luZG93U21hbGw8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd01lZGl1bSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlU21hbGwuV2luZG93TWVkaXVtPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJxdWlja0NvbnRhY3RCYWRnZVN0eWxlU21hbGxXaW5kb3dMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlU21hbGwuV2luZG93TGFyZ2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RQb3B1cFdpbmRvd1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuTGlzdFBvcHVwV2luZG93PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwb3B1cE1lbnVTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlBvcHVwTWVudTwvaXRlbT4KICAgICAgICAgCiAgICAgICAgIDwhLS0gUHJlZmVyZW5jZSBzdHlsZXMgLS0+CiAgICAgICAgIDxpdGVtIG5hbWU9InByZWZlcmVuY2VTY3JlZW5TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvUHJlZmVyZW5jZS5QcmVmZXJlbmNlU2NyZWVuPC9pdGVtPgpAQCAtMjA1LDYgKzIyNywyMSBAQAogCiAgICAgICAgIDwhLS0gU2VhcmNoIHdpZGdldCBzdHlsZXMgLS0+CiAgICAgICAgIDxpdGVtIG5hbWU9InNlYXJjaFdpZGdldENvcnB1c0l0ZW1CYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci9zZWFyY2hfd2lkZ2V0X2NvcnB1c19pdGVtX2JhY2tncm91bmQ8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBBY3Rpb24gYmFyIHN0eWxlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uRHJvcERvd25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlNwaW5uZXIuRHJvcERvd248L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJ1dHRvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuQWN0aW9uQnV0dG9uPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25PdmVyZmxvd0J1dHRvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuQWN0aW9uQnV0dG9uLk92ZXJmbG93PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CdXR0b25QYWRkaW5nIj4xMmRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZUJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2FjdGlvbl9iYXJfY29udGV4dF9iYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlQ2xvc2VEcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9jbG9zZV9jbGVhcl9jYW5jZWw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJhclRhYlN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkFjdGlvbkJhclZpZXdfVGFiVmlldzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyVGFiQmFyU3R5bGUiPkBzdHlsZS9XaWRnZXQuQWN0aW9uQmFyVmlld19UYWJCYXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJhclRhYlRleHRTdHlsZSI+QHN0eWxlL1dpZGdldC5BY3Rpb25CYXJWaWV3X1RhYlRleHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVTdHlsZSI+QHN0eWxlL1dpZGdldC5BY3Rpb25Nb2RlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlQ2xvc2VCdXR0b25TdHlsZSI+QHN0eWxlL1dpZGdldC5BY3Rpb25CdXR0b24uQ2xvc2VNb2RlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CYXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkFjdGlvbkJhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyU2l6ZSI+NTBkaXA8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICAKICAgICA8IS0tIFZhcmlhbnQgb2YgdGhlIGRlZmF1bHQgKGRhcmspIHRoZW1lIHdpdGggbm8gdGl0bGUgYmFyIC0tPgpAQCAtMjI4LDcgKzI2NSw3IEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImNvbG9yQmFja2dyb3VuZCI+QGFuZHJvaWQ6Y29sb3IvYmFja2dyb3VuZF9saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iY29sb3JGb3JlZ3JvdW5kIj5AY29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImNvbG9yRm9yZWdyb3VuZEludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0X2ludmVyc2U8L2l0ZW0+Ci0KKyAgICAgICAgCiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclByaW1hcnkiPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yU2Vjb25kYXJ5Ij5AYW5kcm9pZDpjb2xvci9zZWNvbmRhcnlfdGV4dF9saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yVGVydGlhcnkiPkBhbmRyb2lkOmNvbG9yL3RlcnRpYXJ5X3RleHRfbGlnaHQ8L2l0ZW0+CkBAIC0yNDIsOCArMjc5LDE3IEBACiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclByaW1hcnlJbnZlcnNlTm9EaXNhYmxlIj5AYW5kcm9pZDpjb2xvci9wcmltYXJ5X3RleHRfZGFya19ub2Rpc2FibGU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclNlY29uZGFyeUludmVyc2VOb0Rpc2FibGUiPkBhbmRyb2lkOmNvbG9yL3NlY29uZGFyeV90ZXh0X2Rhcmtfbm9kaXNhYmxlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaW50Ij5AYW5kcm9pZDpjb2xvci9oaW50X2ZvcmVncm91bmRfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckhpbnRJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9oaW50X2ZvcmVncm91bmRfZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGludEludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2hpbnRfZm9yZWdyb3VuZF9kYXJrPC9pdGVtPiAgICAgICAgCisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckhpZ2hsaWdodCI+QGFuZHJvaWQ6Y29sb3IvaGlnaGxpZ2h0ZWRfdGV4dF9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGlnaGxpZ2h0SW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvaGlnaGxpZ2h0ZWRfdGV4dF9kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JMaW5rIj5AYW5kcm9pZDpjb2xvci9saW5rX3RleHRfbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckxpbmtJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9saW5rX3RleHRfZGFyazwvaXRlbT4KICAgICAgICAgCisgICAgICAgIDxpdGVtIG5hbWU9ImVkaXRUZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdENob2ljZUJhY2tncm91bmRJbmRpY2F0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0ZWRfYmFja2dyb3VuZF9saWdodDwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJhY3RpdmF0ZWRCYWNrZ3JvdW5kSW5kaWNhdG9yIj5AYW5kcm9pZDpkcmF3YWJsZS9hY3RpdmF0ZWRfYmFja2dyb3VuZF9saWdodDwvaXRlbT4KKwogICAgICAgICA8aXRlbSBuYW1lPSJwb3B1cFdpbmRvd1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUG9wdXBXaW5kb3c8L2l0ZW0+CiAgICAgICAgIAogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q2hlY2tNYXJrIj5AYW5kcm9pZDpkcmF3YWJsZS9pbmRpY2F0b3JfY2hlY2tfbWFya19saWdodDwvaXRlbT4KQEAgLTI1NCwxMyArMzAwLDEzIEBACiAgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5MaXN0Vmlldy5XaGl0ZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdERpdmlkZXIiPkBkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJsaXN0U2VwYXJhdG9yVGV4dFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlRleHRWaWV3Lkxpc3RTZXBhcmF0b3IuV2hpdGU8L2l0ZW0+Ci0gICAgICAgIAorCiAgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5JbnZlcnNlPC9pdGVtPgotCQk8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlU21hbGwiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbC5JbnZlcnNlPC9pdGVtPgotCQk8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlTGFyZ2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5MYXJnZS5JbnZlcnNlPC9pdGVtPgotCQk8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyPC9pdGVtPgotCQk8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlU21hbGxJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuU21hbGw8L2l0ZW0+Ci0JCTxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVMYXJnZUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5MYXJnZTwvaXRlbT4gCisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbCI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLlNtYWxsLkludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLkxhcmdlLkludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbEludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUxhcmdlSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLkxhcmdlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAgICAgCiAgICAgPCEtLSBWYXJpYW50IG9mIHRoZSBsaWdodCB0aGVtZSB3aXRoIG5vIHRpdGxlIGJhciAtLT4KQEAgLTQyMywxMyArNDY5LDI1IEBACiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlU21hbGxJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5TbWFsbC5JbnZlcnNlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKKyAgICA8IS0tIFZhcmlhdGlvbiBvZiBUaGVtZS5EaWFsb2cgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIGEgZnJhbWUgKG9yIGJhY2tncm91bmQpLgorICAgICAgICAgVGhlIHZpZXcgaGllcmFyY2h5IG9mIHRoZSBkaWFsb2cgaXMgcmVzcG9uc2libGUgZm9yIGRyYXdpbmcgYWxsIG9mCisgICAgICAgICBpdHMgcGl4ZWxzLiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuRGlhbG9nLk5vRnJhbWUiPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dCYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci90cmFuc3BhcmVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dGcmFtZSI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0NvbnRlbnRPdmVybGF5Ij5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBbmltYXRpb25TdHlsZSI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZERpbUVuYWJsZWQiPmZhbHNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0lzVHJhbnNsdWNlbnQiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93Tm9UaXRsZSI+dHJ1ZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCiAgICAgPCEtLSBEZWZhdWx0IHRoZW1lIGZvciBhbGVydCBkaWFsb2cgd2luZG93cywgd2hpY2ggaXMgdXNlZCBieSB0aGUKICAgICAgICAgIHtAbGluayBhbmRyb2lkLmFwcC5BbGVydERpYWxvZ30gY2xhc3MuICBUaGlzIGlzIGJhc2ljYWxseSBhIGRpYWxvZwogICAgICAgICAgYnV0IHNldHMgdGhlIGJhY2tncm91bmQgdG8gZW1wdHkgc28gaXQgY2FuIGRvIHR3by10b25lIGJhY2tncm91bmRzLiAtLT4KICAgICA8c3R5bGUgbmFtZT0iVGhlbWUuRGlhbG9nLkFsZXJ0Ij4KICAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93QmFja2dyb3VuZCI+QGFuZHJvaWQ6Y29sb3IvdHJhbnNwYXJlbnQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd1RpdGxlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL0RpYWxvZ1dpbmRvd1RpdGxlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dJc0Zsb2F0aW5nIj50cnVlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dDb250ZW50T3ZlcmxheSI+QG51bGw8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICAKQEAgLTUzNSw1ICs1OTMsNTQ5IEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QW5pbWF0aW9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL0FuaW1hdGlvbi5Ub2FzdDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kRGltRW5hYmxlZCI+ZmFsc2U8L2l0ZW0+CiAgICAgPC9zdHlsZT4KKworICAgIDwhLS0gRGVmYXVsdCB0aGVtZSB3aXRoIGFuIEFjdGlvbiBCYXIuIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5XaXRoQWN0aW9uQmFyIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBY3Rpb25CYXIiPnRydWU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gTm8gdGl0bGUgYmFyLCBidXQgQWN0aW9uIE1vZGUgYmFycyB3aWxsIG92ZXJsYXkgYXBwbGljYXRpb24gY29udGVudAorICAgICAgICAgaW5zdGVhZCBvZiBwdXNoaW5nIGl0IGRvd24gdG8gbWFrZSByb29tLiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuTm9UaXRsZUJhci5PdmVybGF5QWN0aW9uTW9kZXMiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FjdGlvbk1vZGVPdmVybGF5Ij50cnVlPC9pdGVtPgorICAgIDwvc3R5bGU+CiAgICAgCisgICAgPCEtLSBOZXcgSG9uZXljb21iIGhvbG9ncmFwaGljIHRoZW1lLiBEYXJrIHZlcnNpb24uICBUaGUgd2lkZ2V0cyBpbiB0aGUKKyAgICAgICAgIGhvbG9ncmFwaGljIHRoZW1lIGFyZSB0cmFuc2x1Y2VudCBvbiB0aGVpciBicmFja2dyb3VuZCwgc28gYXBwbGljYXRpb25zCisgICAgICAgICBtdXN0IGVuc3VyZSB0aGF0IGFueSBiYWNrZ3JvdW5kIHRoZXkgdXNlIHdpdGggdGhpcyB0aGVtZSBpcyBpdHNlbGYKKyAgICAgICAgIGRhcms7IG90aGVyd2lzZSwgaXQgd2lsbCBiZSBkaWZmaWN1bHQgdG8gc2VlIHRoZSB3aWRnZXRzLiAgVGhlIG5ldworICAgICAgICAgVUkgc3R5bGUgYWxzbyBpbmNsdWRlcyBhIGZ1bGwgYWN0aW9uIGJhciBieSBkZWZhdWx0LgorCisgICAgICAgICBTdHlsZXMgdXNlZCBieSB0aGUgSG9sbyB0aGVtZSBhcmUgbmFtZWQgdXNpbmcgdGhlIGNvbnZlbnRpb24gVHlwZS5Ib2xvLkV0Yy4KKyAgICAgICAgIChGb3IgZXhhbXBsZSwgV2lkZ2V0LkhvbG8uQnV0dG9uLCBUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5Qb3B1cE1lbnUuTGFyZ2UuKQorICAgICAgICAgU3BlY2lmaWMgcmVzb3VyY2VzIHVzZWQgYnkgSG9sbyBhcmUgbmFtZWQgdXNpbmcgdGhlIGNvbnZlbnRpb24gQHR5cGUvZm9vX2Jhcl9iYXpfaG9sbworICAgICAgICAgd2l0aCB0cmFpbGluZyBfZGFyayBvciBfbGlnaHQgc3BlY2lmaWVycyBpZiB0aGV5IGFyZSBub3Qgc2hhcmVkIGJldHdlZW4gYm90aCBsaWdodCBhbmQKKyAgICAgICAgIGRhcmsgdmVyc2lvbnMgb2YgdGhlIHRoZW1lLiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuSG9sbyI+CisgICAgICAgIDxpdGVtIG5hbWU9ImNvbG9yRm9yZWdyb3VuZCI+QGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJjb2xvckZvcmVncm91bmRJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9pbnZlcnNlX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iY29sb3JCYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci9iYWNrZ3JvdW5kX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iY29sb3JCYWNrZ3JvdW5kQ2FjaGVIaW50Ij4/YW5kcm9pZDphdHRyL2NvbG9yQmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZGlzYWJsZWRBbHBoYSI+MC41PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJiYWNrZ3JvdW5kRGltQW1vdW50Ij4wLjY8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBUZXh0IHN0eWxlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2UiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG88L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5JbnZlcnNlPC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclByaW1hcnkiPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclNlY29uZGFyeSI+QGFuZHJvaWQ6Y29sb3Ivc2Vjb25kYXJ5X3RleHRfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JUZXJ0aWFyeSI+QGFuZHJvaWQ6Y29sb3IvdGVydGlhcnlfdGV4dF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclByaW1hcnlJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9wcmltYXJ5X3RleHRfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yU2Vjb25kYXJ5SW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3Ivc2Vjb25kYXJ5X3RleHRfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yVGVydGlhcnlJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci90ZXJ0aWFyeV90ZXh0X2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclByaW1hcnlEaXNhYmxlT25seSI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X2Rpc2FibGVfb25seV9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclByaW1hcnlJbnZlcnNlRGlzYWJsZU9ubHkiPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9kaXNhYmxlX29ubHlfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yUHJpbWFyeU5vRGlzYWJsZSI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X25vZGlzYWJsZV9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclNlY29uZGFyeU5vRGlzYWJsZSI+QGFuZHJvaWQ6Y29sb3Ivc2Vjb25kYXJ5X3RleHRfbm9kaXNhYmxlX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yUHJpbWFyeUludmVyc2VOb0Rpc2FibGUiPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9ub2Rpc2FibGVfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yU2Vjb25kYXJ5SW52ZXJzZU5vRGlzYWJsZSI+QGFuZHJvaWQ6Y29sb3Ivc2Vjb25kYXJ5X3RleHRfbm9kaXNhYmxlX2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckhpbnQiPkBhbmRyb2lkOmNvbG9yL2hpbnRfZm9yZWdyb3VuZF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckhpbnRJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9oaW50X2ZvcmVncm91bmRfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yU2VhcmNoVXJsIj5AYW5kcm9pZDpjb2xvci9zZWFyY2hfdXJsX3RleHRfaG9sbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGlnaGxpZ2h0Ij5AYW5kcm9pZDpjb2xvci9oaWdobGlnaHRlZF90ZXh0X2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGlnaGxpZ2h0SW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvaGlnaGxpZ2h0ZWRfdGV4dF9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JMaW5rIj5AYW5kcm9pZDpjb2xvci9saW5rX3RleHRfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JMaW5rSW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvbGlua190ZXh0X2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckFsZXJ0RGlhbG9nTGlzdEl0ZW0iPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9ob2xvX2Rhcms8L2l0ZW0+CisKKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5MYXJnZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VNZWRpdW0iPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uTWVkaXVtPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZVNtYWxsIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLlNtYWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZUxhcmdlSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5MYXJnZS5JbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZU1lZGl1bUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uTWVkaXVtLkludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlU21hbGxJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLlNtYWxsLkludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlU2VhcmNoUmVzdWx0VGl0bGUiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uU2VhcmNoUmVzdWx0LlRpdGxlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZVNlYXJjaFJlc3VsdFN1YnRpdGxlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLlNlYXJjaFJlc3VsdC5TdWJ0aXRsZTwvaXRlbT4KKyAgICAgICAgCisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlQnV0dG9uIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5CdXR0b248L2l0ZW0+CisgICAgICAgIAorICAgICAgICA8aXRlbSBuYW1lPSJlZGl0VGV4dENvbG9yIj4/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImVkaXRUZXh0QmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgCisgICAgICAgIDxpdGVtIG5hbWU9ImNhbmRpZGF0ZXNUZXh0U3R5bGVTcGFucyI+QGFuZHJvaWQ6c3RyaW5nL2NhbmRpZGF0ZXNfc3R5bGU8L2l0ZW0+CisgICAgICAgIAorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q2hlY2tNYXJrIj5AYW5kcm9pZDpkcmF3YWJsZS9pbmRpY2F0b3JfY2hlY2tfbWFya19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q2hlY2tNYXJrSW52ZXJzZSI+QGFuZHJvaWQ6ZHJhd2FibGUvaW5kaWNhdG9yX2NoZWNrX21hcmtfbGlnaHQ8L2l0ZW0+CisKKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VMYXJnZVBvcHVwTWVudSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuUG9wdXBNZW51LkxhcmdlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZVNtYWxsUG9wdXBNZW51Ij5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5Qb3B1cE1lbnUuU21hbGw8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBCdXR0b24gc3R5bGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJidXR0b25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uQnV0dG9uPC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9ImJ1dHRvblN0eWxlU21hbGwiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkJ1dHRvbi5TbWFsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYnV0dG9uU3R5bGVJbnNldCI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uQnV0dG9uLkluc2V0PC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9ImJ1dHRvblN0eWxlVG9nZ2xlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5CdXR0b24uVG9nZ2xlPC9pdGVtPgorCisgICAgICAgIDwhLS0gTGlzdCBhdHRyaWJ1dGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0UHJlZmVycmVkSXRlbUhlaWdodCI+NjRkaXA8L2l0ZW0+CisgICAgICAgIDwhLS0gQGhpZGUgLS0+CisgICAgICAgIDxpdGVtIG5hbWU9InNlYXJjaFJlc3VsdExpc3RJdGVtSGVpZ2h0Ij41OGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdERpdmlkZXIiPkBkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0U2VwYXJhdG9yVGV4dFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uVGV4dFZpZXcuTGlzdFNlcGFyYXRvcjwvaXRlbT4gICAKKworICAgICAgICA8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlSW5kaWNhdG9yU2luZ2xlIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fcmFkaW9faG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlSW5kaWNhdG9yTXVsdGlwbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9jaGVja19ob2xvX2Rhcms8L2l0ZW0+CisKKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdENob2ljZUJhY2tncm91bmRJbmRpY2F0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0ZWRfYmFja2dyb3VuZDwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJhY3RpdmF0ZWRCYWNrZ3JvdW5kSW5kaWNhdG9yIj5AYW5kcm9pZDpkcmF3YWJsZS9hY3RpdmF0ZWRfYmFja2dyb3VuZDwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJsaXN0RGl2aWRlckFsZXJ0RGlhbG9nIj5AYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfaG9sb19kYXJrPC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9ImV4cGFuZGFibGVMaXN0UHJlZmVycmVkSXRlbVBhZGRpbmdMZWZ0Ij40MGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRDaGlsZFBhZGRpbmdMZWZ0Ij4KKyAgICAgICAgICAgICAgICA/YW5kcm9pZDphdHRyL2V4cGFuZGFibGVMaXN0UHJlZmVycmVkSXRlbVBhZGRpbmdMZWZ0PC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9ImV4cGFuZGFibGVMaXN0UHJlZmVycmVkSXRlbUluZGljYXRvckxlZnQiPjNkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImV4cGFuZGFibGVMaXN0UHJlZmVycmVkSXRlbUluZGljYXRvclJpZ2h0Ij4zM2RpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRDaGlsZEluZGljYXRvckxlZnQiPgorICAgICAgICAgICAgICAgID9hbmRyb2lkOmF0dHIvZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRJdGVtSW5kaWNhdG9yTGVmdDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRDaGlsZEluZGljYXRvclJpZ2h0Ij4KKyAgICAgICAgICAgICAgICA/YW5kcm9pZDphdHRyL2V4cGFuZGFibGVMaXN0UHJlZmVycmVkSXRlbUluZGljYXRvclJpZ2h0PC9pdGVtPgorCisgICAgICAgIDwhLS0gR2FsbGVyeSBhdHRyaWJ1dGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJnYWxsZXJ5SXRlbUJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2dhbGxlcnlfaXRlbV9iYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICAKKyAgICAgICAgPCEtLSBXaW5kb3cgYXR0cmlidXRlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93QmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvc2NyZWVuX2JhY2tncm91bmRfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dGcmFtZSI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd05vVGl0bGUiPmZhbHNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dGdWxsc2NyZWVuIj5mYWxzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93SXNGbG9hdGluZyI+ZmFsc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0NvbnRlbnRPdmVybGF5Ij5AYW5kcm9pZDpkcmF3YWJsZS90aXRsZV9iYXJfc2hhZG93PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dTaG93V2FsbHBhcGVyIj5mYWxzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93VGl0bGVTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2luZG93VGl0bGUuSG9sbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93VGl0bGVTaXplIj4yNWRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93VGl0bGVCYWNrZ3JvdW5kU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpbmRvd1RpdGxlQmFja2dyb3VuZC5Ib2xvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FuaW1hdGlvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9BbmltYXRpb24uSG9sby5BY3Rpdml0eTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dTb2Z0SW5wdXRNb2RlIj5zdGF0ZVVuc3BlY2lmaWVkfGFkanVzdFVuc3BlY2lmaWVkPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dBY3Rpb25CYXIiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0FjdGlvbk1vZGVPdmVybGF5Ij5mYWxzZTwvaXRlbT4KKworICAgICAgICA8IS0tIERpYWxvZyBhdHRyaWJ1dGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJhbGVydERpYWxvZ1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9BbGVydERpYWxvZy5Ib2xvPC9pdGVtPgorICAgICAgICAKKyAgICAgICAgPCEtLSBQYW5lbCBhdHRyaWJ1dGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJwYW5lbEJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL21lbnVfYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icGFuZWxGdWxsQmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvbWVudV9iYWNrZ3JvdW5kX2ZpbGxfcGFyZW50X3dpZHRoPC9pdGVtPgorICAgICAgICA8IS0tIFRoZXNlIHRocmVlIGF0dHJpYnV0ZXMgZG8gbm90IHNlZW1zIHRvIGJlIHVzZWQgYnkgdGhlIGZyYW1ld29yay4gRGVjbGFyZWQgcHVibGljIHRob3VnaCAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icGFuZWxDb2xvckJhY2tncm91bmQiPiMwMDA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InBhbmVsQ29sb3JGb3JlZ3JvdW5kIj4/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InBhbmVsVGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2U8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBTY3JvbGxiYXIgYXR0cmlidXRlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ic2Nyb2xsYmFyRmFkZUR1cmF0aW9uIj4yNTA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InNjcm9sbGJhckRlZmF1bHREZWxheUJlZm9yZUZhZGUiPjMwMDwvaXRlbT4gCisgICAgICAgIDxpdGVtIG5hbWU9InNjcm9sbGJhclNpemUiPjEwZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJzY3JvbGxiYXJUaHVtYkhvcml6b250YWwiPkBhbmRyb2lkOmRyYXdhYmxlL3Njcm9sbGJhcl9oYW5kbGVfaG9yaXpvbnRhbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ic2Nyb2xsYmFyVGh1bWJWZXJ0aWNhbCI+QGFuZHJvaWQ6ZHJhd2FibGUvc2Nyb2xsYmFyX2hhbmRsZV92ZXJ0aWNhbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ic2Nyb2xsYmFyVHJhY2tIb3Jpem9udGFsIj5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ic2Nyb2xsYmFyVHJhY2tWZXJ0aWNhbCI+QG51bGw8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBUZXh0IHNlbGVjdGlvbiBoYW5kbGUgYXR0cmlidXRlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dFNlbGVjdEhhbmRsZUxlZnQiPkBhbmRyb2lkOmRyYXdhYmxlL3RleHRfc2VsZWN0X2hhbmRsZV9taWRkbGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRTZWxlY3RIYW5kbGVSaWdodCI+QGFuZHJvaWQ6ZHJhd2FibGUvdGV4dF9zZWxlY3RfaGFuZGxlX21pZGRsZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dFNlbGVjdEhhbmRsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvdGV4dF9zZWxlY3RfaGFuZGxlX21pZGRsZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dFNlbGVjdEhhbmRsZVdpbmRvd1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5UZXh0U2VsZWN0SGFuZGxlPC9pdGVtPgorCisgICAgICAgIDwhLS0gV2lkZ2V0IHN0eWxlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWJzTGlzdFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uQWJzTGlzdFZpZXc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImF1dG9Db21wbGV0ZVRleHRWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkF1dG9Db21wbGV0ZVRleHRWaWV3PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJjaGVja2JveFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Db21wb3VuZEJ1dHRvbi5DaGVja0JveDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZHJvcERvd25MaXN0Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5MaXN0Vmlldy5Ecm9wRG93bjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZWRpdFRleHRTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uRWRpdFRleHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImV4cGFuZGFibGVMaXN0Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5FeHBhbmRhYmxlTGlzdFZpZXc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImV4cGFuZGFibGVMaXN0Vmlld1doaXRlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkV4cGFuZGFibGVMaXN0Vmlldy5XaGl0ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZ2FsbGVyeVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5HYWxsZXJ5PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJnZXN0dXJlT3ZlcmxheVZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uR2VzdHVyZU92ZXJsYXlWaWV3PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJncmlkVmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5HcmlkVmlldzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iaW1hZ2VCdXR0b25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uSW1hZ2VCdXR0b248L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImltYWdlV2VsbFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5JbWFnZVdlbGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkxpc3RWaWV3PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0Vmlld1doaXRlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkxpc3RWaWV3LldoaXRlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwb3B1cFdpbmRvd1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Qb3B1cFdpbmRvdzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uUHJvZ3Jlc3NCYXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVIb3Jpem9udGFsIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Qcm9ncmVzc0Jhci5Ib3Jpem9udGFsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlU21hbGwiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlByb2dyZXNzQmFyLlNtYWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlU21hbGxUaXRsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uUHJvZ3Jlc3NCYXIuU21hbGwuVGl0bGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uUHJvZ3Jlc3NCYXIuTGFyZ2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Qcm9ncmVzc0Jhci5JbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlU21hbGxJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Qcm9ncmVzc0Jhci5TbWFsbC5JbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlTGFyZ2VJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Qcm9ncmVzc0Jhci5MYXJnZS5JbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJzZWVrQmFyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlNlZWtCYXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InJhdGluZ0JhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5SYXRpbmdCYXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InJhdGluZ0JhclN0eWxlSW5kaWNhdG9yIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5SYXRpbmdCYXIuSW5kaWNhdG9yPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJyYXRpbmdCYXJTdHlsZVNtYWxsIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5SYXRpbmdCYXIuU21hbGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InJhZGlvQnV0dG9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkNvbXBvdW5kQnV0dG9uLlJhZGlvQnV0dG9uPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJzY3JvbGxWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlNjcm9sbFZpZXc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imhvcml6b250YWxTY3JvbGxWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkhvcml6b250YWxTY3JvbGxWaWV3PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJzcGlubmVyU3R5bGUiPj9hbmRyb2lkOmF0dHIvZHJvcERvd25TcGlubmVyU3R5bGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImRyb3BEb3duU3Bpbm5lclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5TcGlubmVyLkRyb3BEb3duPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJzdGFyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkNvbXBvdW5kQnV0dG9uLlN0YXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRhYldpZGdldFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5UYWJXaWRnZXQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlRleHRWaWV3PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3ZWJUZXh0Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5XZWJUZXh0VmlldzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2ViVmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5XZWJWaWV3PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJkcm9wRG93bkl0ZW1TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uRHJvcERvd25JdGVtPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJzcGlubmVyRHJvcERvd25JdGVtU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkRyb3BEb3duSXRlbS5TcGlubmVyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJzcGlubmVySXRlbVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5UZXh0Vmlldy5TcGlubmVySXRlbTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZHJvcERvd25IaW50QXBwZWFyYW5jZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuRHJvcERvd25IaW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJrZXlib2FyZFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uS2V5Ym9hcmRWaWV3PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJxdWlja0NvbnRhY3RCYWRnZVN0eWxlV2luZG93U21hbGwiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlF1aWNrQ29udGFjdEJhZGdlLldpbmRvd1NtYWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJxdWlja0NvbnRhY3RCYWRnZVN0eWxlV2luZG93TWVkaXVtIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5RdWlja0NvbnRhY3RCYWRnZS5XaW5kb3dNZWRpdW08L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVXaW5kb3dMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uUXVpY2tDb250YWN0QmFkZ2UuV2luZG93TGFyZ2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd1NtYWxsIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5RdWlja0NvbnRhY3RCYWRnZVNtYWxsLldpbmRvd1NtYWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJxdWlja0NvbnRhY3RCYWRnZVN0eWxlU21hbGxXaW5kb3dNZWRpdW0iPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlF1aWNrQ29udGFjdEJhZGdlU21hbGwuV2luZG93TWVkaXVtPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJxdWlja0NvbnRhY3RCYWRnZVN0eWxlU21hbGxXaW5kb3dMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uUXVpY2tDb250YWN0QmFkZ2VTbWFsbC5XaW5kb3dMYXJnZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdFBvcHVwV2luZG93U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkxpc3RQb3B1cFdpbmRvdzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icG9wdXBNZW51U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlBvcHVwTWVudTwvaXRlbT4KKyAgICAgICAgCisgICAgICAgIDwhLS0gUHJlZmVyZW5jZSBzdHlsZXMgLS0+CisgICAgICAgIDxpdGVtIG5hbWU9InByZWZlcmVuY2VTY3JlZW5TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvUHJlZmVyZW5jZS5QcmVmZXJlbmNlU2NyZWVuPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcmVmZXJlbmNlQ2F0ZWdvcnlTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvUHJlZmVyZW5jZS5DYXRlZ29yeTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJlZmVyZW5jZVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcmVmZXJlbmNlSW5mb3JtYXRpb25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvUHJlZmVyZW5jZS5JbmZvcm1hdGlvbjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iY2hlY2tCb3hQcmVmZXJlbmNlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1ByZWZlcmVuY2UuQ2hlY2tCb3hQcmVmZXJlbmNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ5ZXNOb1ByZWZlcmVuY2VTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvUHJlZmVyZW5jZS5EaWFsb2dQcmVmZXJlbmNlLlllc05vUHJlZmVyZW5jZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZGlhbG9nUHJlZmVyZW5jZVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLkRpYWxvZ1ByZWZlcmVuY2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImVkaXRUZXh0UHJlZmVyZW5jZVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLkRpYWxvZ1ByZWZlcmVuY2UuRWRpdFRleHRQcmVmZXJlbmNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJyaW5ndG9uZVByZWZlcmVuY2VTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvUHJlZmVyZW5jZS5SaW5ndG9uZVByZWZlcmVuY2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByZWZlcmVuY2VMYXlvdXRDaGlsZCI+QGFuZHJvaWQ6bGF5b3V0L3ByZWZlcmVuY2VfY2hpbGQ8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBTZWFyY2ggd2lkZ2V0IHN0eWxlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ic2VhcmNoV2lkZ2V0Q29ycHVzSXRlbUJhY2tncm91bmQiPkBhbmRyb2lkOmNvbG9yL3NlYXJjaF93aWRnZXRfY29ycHVzX2l0ZW1fYmFja2dyb3VuZDwvaXRlbT4KKworICAgICAgICA8IS0tIEFjdGlvbiBiYXIgc3R5bGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Ecm9wRG93blN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5TcGlubmVyLkRyb3BEb3duPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CdXR0b25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uQWN0aW9uQnV0dG9uPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25PdmVyZmxvd0J1dHRvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5BY3Rpb25CdXR0b24uT3ZlcmZsb3c8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJ1dHRvblBhZGRpbmciPjEyZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlQmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvY2FiX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZUNsb3NlRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2NhYl9pY19jbG9zZV9ob2xvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CYXJUYWJTdHlsZSI+QHN0eWxlL1dpZGdldC5Ib2xvLkFjdGlvbkJhclZpZXdfVGFiVmlldzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyVGFiQmFyU3R5bGUiPkBzdHlsZS9XaWRnZXQuSG9sby5BY3Rpb25CYXJWaWV3X1RhYkJhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyVGFiVGV4dFN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkhvbG8uQWN0aW9uQmFyVmlld19UYWJUZXh0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlU3R5bGUiPkBzdHlsZS9XaWRnZXQuSG9sby5BY3Rpb25Nb2RlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlQ2xvc2VCdXR0b25TdHlsZSI+QHN0eWxlL1dpZGdldC5Ib2xvLkFjdGlvbkJ1dHRvbi5DbG9zZU1vZGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5BY3Rpb25CYXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJhclNpemUiPjUwZGlwPC9pdGVtPgorCisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gTmV3IEhvbmV5Y29tYiBob2xvZ3JhcGhpYyB0aGVtZS4gTGlnaHQgdmVyc2lvbi4gIFRoZSB3aWRnZXRzIGluIHRoZQorICAgICAgICAgaG9sb2dyYXBoaWMgdGhlbWUgYXJlIHRyYW5zbHVjZW50IG9uIHRoZWlyIGJyYWNrZ3JvdW5kLCBzbyBhcHBsaWNhdGlvbnMKKyAgICAgICAgIG11c3QgZW5zdXJlIHRoYXQgYW55IGJhY2tncm91bmQgdGhleSB1c2Ugd2l0aCB0aGlzIHRoZW1lIGlzIGl0c2VsZgorICAgICAgICAgbGlnaHQ7IG90aGVyd2lzZSwgaXQgd2lsbCBiZSBkaWZmaWN1bHQgdG8gc2VlIHRoZSB3aWRnZXRzLiAgVGhlIG5ldworICAgICAgICAgVUkgc3R5bGUgYWxzbyBpbmNsdWRlcyBhIGZ1bGwgYWN0aW9uIGJhciBieSBkZWZhdWx0LiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuSG9sby5MaWdodCIgcGFyZW50PSJUaGVtZS5MaWdodCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImNvbG9yRm9yZWdyb3VuZCI+QGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iY29sb3JGb3JlZ3JvdW5kSW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfaW52ZXJzZV9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJjb2xvckJhY2tncm91bmQiPkBhbmRyb2lkOmNvbG9yL2JhY2tncm91bmRfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iY29sb3JCYWNrZ3JvdW5kQ2FjaGVIaW50Ij4/YW5kcm9pZDphdHRyL2NvbG9yQmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZGlzYWJsZWRBbHBoYSI+MC41PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJiYWNrZ3JvdW5kRGltQW1vdW50Ij4wLjY8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBUZXh0IHN0eWxlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2UiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5JbnZlcnNlPC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclByaW1hcnkiPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JTZWNvbmRhcnkiPkBhbmRyb2lkOmNvbG9yL3NlY29uZGFyeV90ZXh0X2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclRlcnRpYXJ5Ij5AYW5kcm9pZDpjb2xvci90ZXJ0aWFyeV90ZXh0X2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclByaW1hcnlJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9wcmltYXJ5X3RleHRfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JTZWNvbmRhcnlJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9zZWNvbmRhcnlfdGV4dF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclRlcnRpYXJ5SW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvdGVydGlhcnlfdGV4dF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclByaW1hcnlEaXNhYmxlT25seSI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X2Rpc2FibGVfb25seV9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZURpc2FibGVPbmx5Ij5AYW5kcm9pZDpjb2xvci9wcmltYXJ5X3RleHRfZGlzYWJsZV9vbmx5X2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yUHJpbWFyeU5vRGlzYWJsZSI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X25vZGlzYWJsZV9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JTZWNvbmRhcnlOb0Rpc2FibGUiPkBhbmRyb2lkOmNvbG9yL3NlY29uZGFyeV90ZXh0X25vZGlzYWJsZV9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZU5vRGlzYWJsZSI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X25vZGlzYWJsZV9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclNlY29uZGFyeUludmVyc2VOb0Rpc2FibGUiPkBhbmRyb2lkOmNvbG9yL3NlY29uZGFyeV90ZXh0X25vZGlzYWJsZV9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckhpbnQiPkBhbmRyb2lkOmNvbG9yL2hpbnRfZm9yZWdyb3VuZF9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaW50SW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvaGludF9mb3JlZ3JvdW5kX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yU2VhcmNoVXJsIj5AYW5kcm9pZDpjb2xvci9zZWFyY2hfdXJsX3RleHRfaG9sbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGlnaGxpZ2h0Ij5AYW5kcm9pZDpjb2xvci9oaWdobGlnaHRlZF90ZXh0X2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckhpZ2hsaWdodEludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2hpZ2hsaWdodGVkX3RleHRfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JMaW5rIj5AYW5kcm9pZDpjb2xvci9saW5rX3RleHRfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yTGlua0ludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2xpbmtfdGV4dF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckFsZXJ0RGlhbG9nTGlzdEl0ZW0iPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9ob2xvX2Rhcms8L2l0ZW0+CisKKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5MYXJnZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VNZWRpdW0iPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuTWVkaXVtPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZVNtYWxsIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LlNtYWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZUxhcmdlSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5MYXJnZS5JbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZU1lZGl1bUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuTWVkaXVtLkludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlU21hbGxJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LlNtYWxsLkludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlU2VhcmNoUmVzdWx0VGl0bGUiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuU2VhcmNoUmVzdWx0LlRpdGxlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZVNlYXJjaFJlc3VsdFN1YnRpdGxlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LlNlYXJjaFJlc3VsdC5TdWJ0aXRsZTwvaXRlbT4KKyAgICAgICAgCisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlQnV0dG9uIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LldpZGdldC5CdXR0b248L2l0ZW0+CisgICAgICAgIAorICAgICAgICA8aXRlbSBuYW1lPSJlZGl0VGV4dENvbG9yIj4/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImVkaXRUZXh0QmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIAorICAgICAgICA8aXRlbSBuYW1lPSJjYW5kaWRhdGVzVGV4dFN0eWxlU3BhbnMiPkBhbmRyb2lkOnN0cmluZy9jYW5kaWRhdGVzX3N0eWxlPC9pdGVtPgorICAgICAgICAKKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENoZWNrTWFyayI+QGFuZHJvaWQ6ZHJhd2FibGUvaW5kaWNhdG9yX2NoZWNrX21hcmtfbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDaGVja01hcmtJbnZlcnNlIj5AYW5kcm9pZDpkcmF3YWJsZS9pbmRpY2F0b3JfY2hlY2tfbWFya19kYXJrPC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlTGFyZ2VQb3B1cE1lbnUiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuV2lkZ2V0LlBvcHVwTWVudS5MYXJnZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VTbWFsbFBvcHVwTWVudSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodC5XaWRnZXQuUG9wdXBNZW51LlNtYWxsPC9pdGVtPgorCisgICAgICAgIDwhLS0gQnV0dG9uIHN0eWxlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYnV0dG9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkxpZ2h0LkJ1dHRvbjwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJidXR0b25TdHlsZVNtYWxsIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5MaWdodC5CdXR0b24uU21hbGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImJ1dHRvblN0eWxlSW5zZXQiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkxpZ2h0LkJ1dHRvbi5JbnNldDwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJidXR0b25TdHlsZVRvZ2dsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uTGlnaHQuQnV0dG9uLlRvZ2dsZTwvaXRlbT4KKworICAgICAgICA8IS0tIExpc3QgYXR0cmlidXRlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiPjY0ZGlwPC9pdGVtPgorICAgICAgICA8IS0tIEBoaWRlIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJzZWFyY2hSZXN1bHRMaXN0SXRlbUhlaWdodCI+NThkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3REaXZpZGVyIj5AZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdFNlcGFyYXRvclRleHRWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkxpZ2h0LlRleHRWaWV3Lkxpc3RTZXBhcmF0b3I8L2l0ZW0+ICAgCisKKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdENob2ljZUluZGljYXRvclNpbmdsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX3JhZGlvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlSW5kaWNhdG9yTXVsdGlwbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9jaGVjazwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlQmFja2dyb3VuZEluZGljYXRvciI+QGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3RlZF9iYWNrZ3JvdW5kPC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGl2YXRlZEJhY2tncm91bmRJbmRpY2F0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2FjdGl2YXRlZF9iYWNrZ3JvdW5kPC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9ImV4cGFuZGFibGVMaXN0UHJlZmVycmVkSXRlbVBhZGRpbmdMZWZ0Ij40MGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRDaGlsZFBhZGRpbmdMZWZ0Ij4KKyAgICAgICAgICAgICAgICA/YW5kcm9pZDphdHRyL2V4cGFuZGFibGVMaXN0UHJlZmVycmVkSXRlbVBhZGRpbmdMZWZ0PC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9ImV4cGFuZGFibGVMaXN0UHJlZmVycmVkSXRlbUluZGljYXRvckxlZnQiPjNkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImV4cGFuZGFibGVMaXN0UHJlZmVycmVkSXRlbUluZGljYXRvclJpZ2h0Ij4zM2RpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRDaGlsZEluZGljYXRvckxlZnQiPgorICAgICAgICAgICAgICAgID9hbmRyb2lkOmF0dHIvZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRJdGVtSW5kaWNhdG9yTGVmdDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZXhwYW5kYWJsZUxpc3RQcmVmZXJyZWRDaGlsZEluZGljYXRvclJpZ2h0Ij4KKyAgICAgICAgICAgICAgICA/YW5kcm9pZDphdHRyL2V4cGFuZGFibGVMaXN0UHJlZmVycmVkSXRlbUluZGljYXRvclJpZ2h0PC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3REaXZpZGVyQWxlcnREaWFsb2ciPkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9ob2xvX2Rhcms8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBHYWxsZXJ5IGF0dHJpYnV0ZXMgLS0+CisgICAgICAgIDxpdGVtIG5hbWU9ImdhbGxlcnlJdGVtQmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvZ2FsbGVyeV9pdGVtX2JhY2tncm91bmQ8L2l0ZW0+CisgICAgICAgIAorICAgICAgICA8IS0tIFdpbmRvdyBhdHRyaWJ1dGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9zY3JlZW5fYmFja2dyb3VuZF9ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dGcmFtZSI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd05vVGl0bGUiPmZhbHNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dGdWxsc2NyZWVuIj5mYWxzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93SXNGbG9hdGluZyI+ZmFsc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0NvbnRlbnRPdmVybGF5Ij5AYW5kcm9pZDpkcmF3YWJsZS90aXRsZV9iYXJfc2hhZG93PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dTaG93V2FsbHBhcGVyIj5mYWxzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93VGl0bGVTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2luZG93VGl0bGUuSG9sbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93VGl0bGVTaXplIj4yNWRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93VGl0bGVCYWNrZ3JvdW5kU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpbmRvd1RpdGxlQmFja2dyb3VuZC5Ib2xvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FuaW1hdGlvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9BbmltYXRpb24uSG9sby5BY3Rpdml0eTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dTb2Z0SW5wdXRNb2RlIj5zdGF0ZVVuc3BlY2lmaWVkfGFkanVzdFVuc3BlY2lmaWVkPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dBY3Rpb25CYXIiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0FjdGlvbk1vZGVPdmVybGF5Ij5mYWxzZTwvaXRlbT4KKworICAgICAgICA8IS0tIERpYWxvZyBhdHRyaWJ1dGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJhbGVydERpYWxvZ1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9BbGVydERpYWxvZy5Ib2xvPC9pdGVtPgorICAgICAgICAKKyAgICAgICAgPCEtLSBQYW5lbCBhdHRyaWJ1dGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJwYW5lbEJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL21lbnVfYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icGFuZWxGdWxsQmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvbWVudV9iYWNrZ3JvdW5kX2ZpbGxfcGFyZW50X3dpZHRoPC9pdGVtPgorICAgICAgICA8IS0tIFRoZXNlIHRocmVlIGF0dHJpYnV0ZXMgZG8gbm90IHNlZW1zIHRvIGJlIHVzZWQgYnkgdGhlIGZyYW1ld29yay4gRGVjbGFyZWQgcHVibGljIHRob3VnaCAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icGFuZWxDb2xvckJhY2tncm91bmQiPiMwMDA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InBhbmVsQ29sb3JGb3JlZ3JvdW5kIj4/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InBhbmVsVGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2U8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBTY3JvbGxiYXIgYXR0cmlidXRlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ic2Nyb2xsYmFyRmFkZUR1cmF0aW9uIj4yNTA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InNjcm9sbGJhckRlZmF1bHREZWxheUJlZm9yZUZhZGUiPjMwMDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ic2Nyb2xsYmFyU2l6ZSI+MTBkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InNjcm9sbGJhclRodW1iSG9yaXpvbnRhbCI+QGFuZHJvaWQ6ZHJhd2FibGUvc2Nyb2xsYmFyX2hhbmRsZV9ob3Jpem9udGFsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJzY3JvbGxiYXJUaHVtYlZlcnRpY2FsIj5AYW5kcm9pZDpkcmF3YWJsZS9zY3JvbGxiYXJfaGFuZGxlX3ZlcnRpY2FsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJzY3JvbGxiYXJUcmFja0hvcml6b250YWwiPkBudWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJzY3JvbGxiYXJUcmFja1ZlcnRpY2FsIj5AbnVsbDwvaXRlbT4KKworICAgICAgICA8IS0tIFRleHQgc2VsZWN0aW9uIGhhbmRsZSBhdHRyaWJ1dGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0U2VsZWN0SGFuZGxlTGVmdCI+QGFuZHJvaWQ6ZHJhd2FibGUvdGV4dF9zZWxlY3RfaGFuZGxlX21pZGRsZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dFNlbGVjdEhhbmRsZVJpZ2h0Ij5AYW5kcm9pZDpkcmF3YWJsZS90ZXh0X3NlbGVjdF9oYW5kbGVfbWlkZGxlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0U2VsZWN0SGFuZGxlIj5AYW5kcm9pZDpkcmF3YWJsZS90ZXh0X3NlbGVjdF9oYW5kbGVfbWlkZGxlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0U2VsZWN0SGFuZGxlV2luZG93U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlRleHRTZWxlY3RIYW5kbGU8L2l0ZW0+CisKKyAgICAgICAgPCEtLSBXaWRnZXQgc3R5bGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJhYnNMaXN0Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5BYnNMaXN0VmlldzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYXV0b0NvbXBsZXRlVGV4dFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uQXV0b0NvbXBsZXRlVGV4dFZpZXc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImNoZWNrYm94U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkNvbXBvdW5kQnV0dG9uLkNoZWNrQm94PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJkcm9wRG93bkxpc3RWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkxpc3RWaWV3LkRyb3BEb3duPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJlZGl0VGV4dFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5FZGl0VGV4dDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZXhwYW5kYWJsZUxpc3RWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkV4cGFuZGFibGVMaXN0VmlldzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZXhwYW5kYWJsZUxpc3RWaWV3V2hpdGVTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uRXhwYW5kYWJsZUxpc3RWaWV3LldoaXRlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJnYWxsZXJ5U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkdhbGxlcnk8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imdlc3R1cmVPdmVybGF5Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5HZXN0dXJlT3ZlcmxheVZpZXc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImdyaWRWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkdyaWRWaWV3PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJpbWFnZUJ1dHRvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5JbWFnZUJ1dHRvbjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iaW1hZ2VXZWxsU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkltYWdlV2VsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uTGlzdFZpZXc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RWaWV3V2hpdGVTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uTGlzdFZpZXcuV2hpdGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InBvcHVwV2luZG93U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlBvcHVwV2luZG93PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Qcm9ncmVzc0JhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUhvcml6b250YWwiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlByb2dyZXNzQmFyLkhvcml6b250YWw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbCI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uUHJvZ3Jlc3NCYXIuU21hbGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbFRpdGxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Qcm9ncmVzc0Jhci5TbWFsbC5UaXRsZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUxhcmdlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Qcm9ncmVzc0Jhci5MYXJnZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlByb2dyZXNzQmFyLkludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbEludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlByb2dyZXNzQmFyLlNtYWxsLkludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVMYXJnZUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlByb2dyZXNzQmFyLkxhcmdlLkludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InNlZWtCYXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uU2Vla0JhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icmF0aW5nQmFyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlJhdGluZ0JhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icmF0aW5nQmFyU3R5bGVJbmRpY2F0b3IiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlJhdGluZ0Jhci5JbmRpY2F0b3I8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InJhdGluZ0JhclN0eWxlU21hbGwiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlJhdGluZ0Jhci5TbWFsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icmFkaW9CdXR0b25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uQ29tcG91bmRCdXR0b24uUmFkaW9CdXR0b248L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InNjcm9sbFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uU2Nyb2xsVmlldzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iaG9yaXpvbnRhbFNjcm9sbFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uSG9yaXpvbnRhbFNjcm9sbFZpZXc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InNwaW5uZXJTdHlsZSI+P2FuZHJvaWQ6YXR0ci9kcm9wRG93blNwaW5uZXJTdHlsZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZHJvcERvd25TcGlubmVyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlNwaW5uZXIuRHJvcERvd248L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InN0YXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uQ29tcG91bmRCdXR0b24uU3RhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGFiV2lkZ2V0U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlRhYldpZGdldDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uVGV4dFZpZXc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndlYlRleHRWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLldlYlRleHRWaWV3PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ3ZWJWaWV3U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLldlYlZpZXc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImRyb3BEb3duSXRlbVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5Ecm9wRG93bkl0ZW08L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InNwaW5uZXJEcm9wRG93bkl0ZW1TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uRHJvcERvd25JdGVtLlNwaW5uZXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InNwaW5uZXJJdGVtU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlRleHRWaWV3LlNwaW5uZXJJdGVtPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJkcm9wRG93bkhpbnRBcHBlYXJhbmNlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5Ecm9wRG93bkhpbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImtleWJvYXJkVmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5LZXlib2FyZFZpZXc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVXaW5kb3dTbWFsbCI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uUXVpY2tDb250YWN0QmFkZ2UuV2luZG93U21hbGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVXaW5kb3dNZWRpdW0iPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlF1aWNrQ29udGFjdEJhZGdlLldpbmRvd01lZGl1bTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icXVpY2tDb250YWN0QmFkZ2VTdHlsZVdpbmRvd0xhcmdlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5RdWlja0NvbnRhY3RCYWRnZS5XaW5kb3dMYXJnZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icXVpY2tDb250YWN0QmFkZ2VTdHlsZVNtYWxsV2luZG93U21hbGwiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlF1aWNrQ29udGFjdEJhZGdlU21hbGwuV2luZG93U21hbGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd01lZGl1bSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uUXVpY2tDb250YWN0QmFkZ2VTbWFsbC5XaW5kb3dNZWRpdW08L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InF1aWNrQ29udGFjdEJhZGdlU3R5bGVTbWFsbFdpbmRvd0xhcmdlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5RdWlja0NvbnRhY3RCYWRnZVNtYWxsLldpbmRvd0xhcmdlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0UG9wdXBXaW5kb3dTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uTGlzdFBvcHVwV2luZG93PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwb3B1cE1lbnVTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uUG9wdXBNZW51PC9pdGVtPgorICAgICAgICAKKyAgICAgICAgPCEtLSBQcmVmZXJlbmNlIHN0eWxlcyAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJlZmVyZW5jZVNjcmVlblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLlByZWZlcmVuY2VTY3JlZW48L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByZWZlcmVuY2VDYXRlZ29yeVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLkNhdGVnb3J5PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcmVmZXJlbmNlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1ByZWZlcmVuY2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InByZWZlcmVuY2VJbmZvcm1hdGlvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLkluZm9ybWF0aW9uPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJjaGVja0JveFByZWZlcmVuY2VTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvUHJlZmVyZW5jZS5DaGVja0JveFByZWZlcmVuY2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Inllc05vUHJlZmVyZW5jZVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLkRpYWxvZ1ByZWZlcmVuY2UuWWVzTm9QcmVmZXJlbmNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJkaWFsb2dQcmVmZXJlbmNlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1ByZWZlcmVuY2UuRGlhbG9nUHJlZmVyZW5jZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZWRpdFRleHRQcmVmZXJlbmNlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1ByZWZlcmVuY2UuRGlhbG9nUHJlZmVyZW5jZS5FZGl0VGV4dFByZWZlcmVuY2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InJpbmd0b25lUHJlZmVyZW5jZVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLlJpbmd0b25lUHJlZmVyZW5jZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJlZmVyZW5jZUxheW91dENoaWxkIj5AYW5kcm9pZDpsYXlvdXQvcHJlZmVyZW5jZV9jaGlsZDwvaXRlbT4KKworICAgICAgICA8IS0tIFNlYXJjaCB3aWRnZXQgc3R5bGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJzZWFyY2hXaWRnZXRDb3JwdXNJdGVtQmFja2dyb3VuZCI+QGFuZHJvaWQ6Y29sb3Ivc2VhcmNoX3dpZGdldF9jb3JwdXNfaXRlbV9iYWNrZ3JvdW5kPC9pdGVtPgorCisgICAgICAgIDwhLS0gQWN0aW9uIGJhciBzdHlsZXMgLS0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkRyb3BEb3duU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLlNwaW5uZXIuRHJvcERvd248L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJ1dHRvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5BY3Rpb25CdXR0b248L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk92ZXJmbG93QnV0dG9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkFjdGlvbkJ1dHRvbi5PdmVyZmxvdzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQnV0dG9uUGFkZGluZyI+MTJkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9jYWJfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZUNsb3NlRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2NhYl9pY19jbG9zZV9ob2xvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CYXJUYWJTdHlsZSI+QHN0eWxlL1dpZGdldC5Ib2xvLkFjdGlvbkJhclZpZXdfVGFiVmlldzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyVGFiQmFyU3R5bGUiPkBzdHlsZS9XaWRnZXQuSG9sby5BY3Rpb25CYXJWaWV3X1RhYkJhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyVGFiVGV4dFN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkhvbG8uQWN0aW9uQmFyVmlld19UYWJUZXh0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlU3R5bGUiPkBzdHlsZS9XaWRnZXQuSG9sby5MaWdodC5BY3Rpb25Nb2RlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlQ2xvc2VCdXR0b25TdHlsZSI+QHN0eWxlL1dpZGdldC5Ib2xvLkFjdGlvbkJ1dHRvbi5DbG9zZU1vZGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5BY3Rpb25CYXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJhclNpemUiPjUwZGlwPC9pdGVtPgorCisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gRGV2ZWxvcG1lbnQgbGVnYWN5IG5hbWU7IGlmIHlvdSdyZSB1c2luZyB0aGlzLCBzd2l0Y2guIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5MaWdodC5Ib2xvIiBwYXJlbnQ9IlRoZW1lLkhvbG8uTGlnaHQiPgorICAgIDwvc3R5bGU+CisgICAgCisgICAgPCEtLSBWYXJpYW50IG9mIHRoZSBob2xvZ3JhcGhpYyAoZGFyaykgdGhlbWUgd2l0aCBubyBhY3Rpb24gYmFyLiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuSG9sby5Ob0FjdGlvbkJhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QWN0aW9uQmFyIj5mYWxzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dOb1RpdGxlIj50cnVlPC9pdGVtPgorICAgIDwvc3R5bGU+CisgICAgCisgICAgPCEtLSBWYXJpYW50IG9mIHRoZSBob2xvZ3JhcGhpYyAoZGFyaykgdGhlbWUgdGhhdCBoYXMgbm8gdGl0bGUgYmFyIGFuZCBmaWxscworICAgICAgICAgdGhlIGVudGlyZSBzY3JlZW4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLkhvbG8uTm9BY3Rpb25CYXIuRnVsbHNjcmVlbiI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93RnVsbHNjcmVlbiI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dDb250ZW50T3ZlcmxheSI+QG51bGw8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gVmFyaWFudCBvZiB0aGUgaG9sb2dyYXBoaWMgbGlnaHQgdGhlbWUgd2l0aCBubyBhY3Rpb24gYmFyIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5MaWdodC5Ib2xvLk5vQWN0aW9uQmFyIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBY3Rpb25CYXIiPmZhbHNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd05vVGl0bGUiPnRydWU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gVmFyaWFudCBvZiB0aGUgaG9sb2dyYXBoaWMgbGlnaHQgdGhlbWUgdGhhdCBoYXMgbm8gdGl0bGUgYmFyIGFuZCBmaWxscworICAgICAgICAgdGhlIGVudGlyZSBzY3JlZW4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLkxpZ2h0LkhvbG8uTm9BY3Rpb25CYXIuRnVsbHNjcmVlbiI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93RnVsbHNjcmVlbiI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dDb250ZW50T3ZlcmxheSI+QG51bGw8L2l0ZW0+CisgICAgPC9zdHlsZT4KKyAKKyAgICA8IS0tIERpYWxvZyB0aGVtZXMgZm9yIEhvbG8gLS0+CisKKyAgICA8IS0tIEhvbG8gdGhlbWUgZm9yIGRpYWxvZyB3aW5kb3dzIGFuZCBhY3Rpdml0aWVzLCB3aGljaCBpcyB1c2VkIGJ5IHRoZQorICAgICAgICAge0BsaW5rIGFuZHJvaWQuYXBwLkRpYWxvZ30gY2xhc3MuICBUaGlzIGNoYW5nZXMgdGhlIHdpbmRvdyB0byBiZQorICAgICAgICAgZmxvYXRpbmcgKG5vdCBmaWxsIHRoZSBlbnRpcmUgc2NyZWVuKSwgYW5kIHB1dHMgYSBmcmFtZSBhcm91bmQgaXRzCisgICAgICAgICBjb250ZW50cy4gIFlvdSBjYW4gc2V0IHRoaXMgdGhlbWUgb24gYW4gYWN0aXZpdHkgaWYgeW91IHdvdWxkIGxpa2UgdG8KKyAgICAgICAgIG1ha2UgYW4gYWN0aXZpdHkgdGhhdCBsb29rcyBsaWtlIGEgRGlhbG9nLgorICAgICAgICAgVGhpcyBpcyB0aGUgZGVmYXVsdCBEaWFsb2cgdGhlbWUgZm9yIGFwcGxpY2F0aW9ucyB0YXJnZXRpbmcgSG9uZXljb21iCisgICAgICAgICBvciBuZXdlci4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLkhvbG8uRGlhbG9nIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dGcmFtZSI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93VGl0bGVTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvRGlhbG9nV2luZG93VGl0bGUuSG9sbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9kaWFsb2dfZnVsbF9ob2xvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0lzRmxvYXRpbmciPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93Q29udGVudE92ZXJsYXkiPkBudWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FuaW1hdGlvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9BbmltYXRpb24uSG9sby5EaWFsb2c8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93U29mdElucHV0TW9kZSI+c3RhdGVVbnNwZWNpZmllZHxhZGp1c3RQYW48L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QWN0aW9uQmFyIj5mYWxzZTwvaXRlbT4KKworICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbG9yQmFja2dyb3VuZENhY2hlSGludCI+QG51bGw8L2l0ZW0+CisgICAgICAgIAorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLkludmVyc2U8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gVmFyaWF0aW9uIG9mIFRoZW1lLkhvbG8uRGlhbG9nIHRoYXQgZG9lcyBub3QgaW5jbHVkZSBhIGZyYW1lIChvciBiYWNrZ3JvdW5kKS4KKyAgICAgICAgIFRoZSB2aWV3IGhpZXJhcmNoeSBvZiB0aGUgZGlhbG9nIGlzIHJlc3BvbnNpYmxlIGZvciBkcmF3aW5nIGFsbCBvZgorICAgICAgICAgaXRzIHBpeGVscy4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLkhvbG8uRGlhbG9nLk5vRnJhbWUiPgorICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dCYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci90cmFuc3BhcmVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dGcmFtZSI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0NvbnRlbnRPdmVybGF5Ij5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBbmltYXRpb25TdHlsZSI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZERpbUVuYWJsZWQiPmZhbHNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0lzVHJhbnNsdWNlbnQiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93Tm9UaXRsZSI+dHJ1ZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPCEtLSBIb2xvIHRoZW1lIGZvciBhbGVydCBkaWFsb2cgd2luZG93cywgd2hpY2ggaXMgdXNlZCBieSB0aGUKKyAgICAgICAgIHtAbGluayBhbmRyb2lkLmFwcC5BbGVydERpYWxvZ30gY2xhc3MuICBUaGlzIGlzIGJhc2ljYWxseSBhIGRpYWxvZworICAgICAgICAgYnV0IHNldHMgdGhlIGJhY2tncm91bmQgdG8gZW1wdHkgc28gaXQgY2FuIGRvIHR3by10b25lIGJhY2tncm91bmRzLgorICAgICAgICAgRm9yIGFwcGxpY2F0aW9ucyB0YXJnZXRpbmcgSG9uZXljb21iIG9yIG5ld2VyLCB0aGlzIGlzIHRoZSBkZWZhdWx0CisgICAgICAgICBBbGVydERpYWxvZyB0aGVtZS4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLkhvbG8uRGlhbG9nLkFsZXJ0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93QmFja2dyb3VuZCI+QGFuZHJvaWQ6Y29sb3IvdHJhbnNwYXJlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd1RpdGxlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL0RpYWxvZ1dpbmRvd1RpdGxlLkhvbG88L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0NvbnRlbnRPdmVybGF5Ij5AbnVsbDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwtbGFuZC9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwtbGFuZC9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbAppbmRleCA3MDBjNTI3Li5mZDhiZDQ5IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sLWxhbmQvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC1sYW5kL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiAKICAgICA8Um93PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC1sYW5kL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwgYi9jb3JlL3Jlcy9yZXMveG1sLWxhbmQvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbAppbmRleCAxZTM3YjZjLi45ZmY2ZmQ3IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sLWxhbmQvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sLWxhbmQvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbApAQCAtMjIsNyArMjIsNyBAQAogICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCiAgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCiAgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgotICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCiAgICAgPgogCiAgICAgPFJvdz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwtbWRwaS9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwtbWRwaS9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbAppbmRleCBiYWUxYjQyLi44MmE3Yzc1IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sLW1kcGkvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC1tZHBpL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiAKICAgICA8Um93PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC1tZHBpL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwgYi9jb3JlL3Jlcy9yZXMveG1sLW1kcGkvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbAppbmRleCA2MTJkZjljLi45ZmZmM2NjIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sLW1kcGkvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sLW1kcGkvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbApAQCAtMjIsNyArMjIsNyBAQAogICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCiAgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCiAgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgotICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCiAgICAgPgogCiAgICAgPFJvdz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwteGxhcmdlL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sIGIvY29yZS9yZXMvcmVzL3htbC14bGFyZ2UvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGEzNTA0MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwteGxhcmdlL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCkBAIC0wLDAgKzEsMTAyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8S2V5Ym9hcmQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCisgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCisgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKKyAgICA+CisKKyAgICA8Um93IGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJ0b3AiPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjEiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iMiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjMiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSI0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iNSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjYiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSI3Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iOCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjkiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIwIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KKyAgICA8L1Jvdz4KKworICAgIDxSb3c+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0icSIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ3Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iZSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InIiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ieSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InUiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJpIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ibyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgorICAgIDwvUm93PgorCisgICAgPFJvdz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJhIiBhbmRyb2lkOmhvcml6b250YWxHYXA9IjUlcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0icyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJmIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iZyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImgiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJqIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iayIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImwiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgorICAgIDwvUm93PgorCisgICAgPFJvdz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSItMSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX3NoaWZ0IgorICAgICAgICAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTUlcCIgYW5kcm9pZDppc01vZGlmaWVyPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19zaGlmdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aXNTdGlja3k9InRydWUiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ieiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IngiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJjIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0idiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImIiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJuIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ibSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9Ii01IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZGVsZXRlIgorICAgICAgICAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTUlcCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19kZWxldGUiCisgICAgICAgICAgICBhbmRyb2lkOmlzUmVwZWF0YWJsZT0idHJ1ZSIvPgorICAgIDwvUm93PgorCisgICAgPFJvdyBhbmRyb2lkOmtleWJvYXJkTW9kZT0iQCtpZC9tb2RlX25vcm1hbCIgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9ImJvdHRvbSI+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iLTIiIGFuZHJvaWQ6a2V5TGFiZWw9IkBzdHJpbmcvcGFzc3dvcmRfa2V5Ym9hcmRfbGFiZWxfc3ltYm9sX2tleSIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjIwJXAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iLCIgLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSItIiAvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjMyIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfc3BhY2UiCisgICAgICAgICAgICBhbmRyb2lkOmljb25QcmV2aWV3PSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX3NwYWNlIgorICAgICAgICAgICAgYW5kcm9pZDprZXlXaWR0aD0iMjAlcCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Ij0iIC8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iLiIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSIxMCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX29rIgorICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19vayIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjIwJXAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgorICAgIDwvUm93PgorCis8L0tleWJvYXJkPgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sLXhsYXJnZS9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sIGIvY29yZS9yZXMvcmVzL3htbC14bGFyZ2UvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZTlkYjgxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL3htbC14bGFyZ2UvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbApAQCAtMCwwICsxLDEwMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPEtleWJvYXJkIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgorICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgorICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCisgICAgPgorCisgICAgPFJvdyBhbmRyb2lkOnJvd0VkZ2VGbGFncz0idG9wIj4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJcQCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJcIyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IiQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIlIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iJmFtcDsiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIqIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iLSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IisiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIoIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iKSIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CisgICAgPC9Sb3c+CisKKyAgICA8Um93PgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InEiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0idyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImUiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJyIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0idCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InkiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ1Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iaSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Im8iLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJwIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KKyAgICA8L1Jvdz4KKworICAgIDxSb3c+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iYSIgYW5kcm9pZDpob3Jpem9udGFsR2FwPSI1JXAiCisgICAgICAgICAgICBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InMiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJkIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iZiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImciLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJoIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iaiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImsiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJsIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KKyAgICA8L1Jvdz4KKworICAgIDxSb3c+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iLTEiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9zaGlmdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjE1JXAiIGFuZHJvaWQ6aXNNb2RpZmllcj0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfc2hpZnQiCisgICAgICAgICAgICBhbmRyb2lkOmlzU3RpY2t5PSJ0cnVlIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InoiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ4Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iYyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InYiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJiIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ibiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Im0iLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSItNSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2RlbGV0ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjE1JXAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfZGVsZXRlIgorICAgICAgICAgICAgYW5kcm9pZDppc1JlcGVhdGFibGU9InRydWUiLz4KKyAgICA8L1Jvdz4KKworICAgIDxSb3cgYW5kcm9pZDprZXlib2FyZE1vZGU9IkAraWQvbW9kZV9ub3JtYWwiIGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJib3R0b20iPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9Ii0yIiBhbmRyb2lkOmtleUxhYmVsPSJAc3RyaW5nL3Bhc3N3b3JkX2tleWJvYXJkX2xhYmVsX3N5bWJvbF9rZXkiCisgICAgICAgICAgICBhbmRyb2lkOmtleVdpZHRoPSIyMCVwIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IiwiIC8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iXyIgLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSIzMiIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX3NwYWNlIgorICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19zcGFjZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjIwJXAiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIrIiAvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Ii4iLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSIxMCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX29rIgorICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19vayIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjIwJXAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgorICAgIDwvUm93PgorCis8L0tleWJvYXJkPgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9leHRlbnNpb24ueG1sIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfZXh0ZW5zaW9uLnhtbAppbmRleCAyOGI3ZWZlLi5mM2ZhNTdiIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9leHRlbnNpb24ueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX2V4dGVuc2lvbi54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgogICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgogICAgID4KIAogICAgIDxSb3cgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9InRvcCI+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9udW1lcmljLnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX251bWVyaWMueG1sCmluZGV4IGUzZjE2MTIuLjIyNzBiOGEgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX251bWVyaWMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX251bWVyaWMueG1sCkBAIC0xOSwzNSArMTksNDEgQEAKIC0tPgogPEtleWJvYXJkIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICBhbmRyb2lkOmtleVdpZHRoPSIzMy4zMyVwIgotICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMnB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X251bWVyaWMiCiAgICAgPgogCi0gICAgPFJvdz4KLSAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI0OSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTEiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgPFJvdyBhbmRyb2lkOnJvd0VkZ2VGbGFncz0idG9wIj4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI0OSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTEiCisgICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1MCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTIiLz4KLSAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1MSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTMiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1MSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTMiCisgICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CiAgICAgPC9Sb3c+CiAKICAgICA8Um93PgotICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjUyIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtNCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1MiIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTQiCisgICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1MyIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTUiLz4KLSAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1NCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTYiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1NCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTYiCisgICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CiAgICAgPC9Sb3c+CiAKICAgICA8Um93PgotICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjU1IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtNyIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1NSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTciCisgICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1NiIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTgiLz4KLSAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1NyIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTkiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1NyIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTkiCisgICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CiAgICAgPC9Sb3c+CiAKICAgICA8Um93IGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJib3R0b20iPgotICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjEwIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfb2siLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSIxMCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX29rIgorICAgICAgICAgICAgIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CiAgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNDgiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW0wX25vX3BsdXMiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSItNSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2RlbGV0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfZGVsZXRlIgotICAgICAgICAgICAgYW5kcm9pZDppc1JlcGVhdGFibGU9InRydWUiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgorICAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfZGVsZXRlIgorICAgICAgICAgICAgIGFuZHJvaWQ6aXNSZXBlYXRhYmxlPSJ0cnVlIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KICAgICA8L1Jvdz4KIAogPC9LZXlib2FyZD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3BvcHVwX3RlbXBsYXRlLnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3BvcHVwX3RlbXBsYXRlLnhtbAppbmRleCA1ZGRmZDNlLi45Yjg1M2UyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9wb3B1cF90ZW1wbGF0ZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcG9wdXBfdGVtcGxhdGUueG1sCkBAIC0yMiw2ICsyMiw2IEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiA8L0tleWJvYXJkPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKaW5kZXggNWZhOWI4YS4uMGEzNTA0MCAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiAKICAgICA8Um93IGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJ0b3AiPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sCmluZGV4IGU0OTFhZmYuLjllOWRiODEgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgogICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgogICAgID4KIAogICAgIDxSb3cgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9InRvcCI+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzLnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3N5bWJvbHMueG1sCmluZGV4IDE0YTdlYzguLjlhOTQ5MzAgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3N5bWJvbHMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3N5bWJvbHMueG1sCkBAIC0yMiwxMCArMjIsMTAgQEAKICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgogICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgogICAgID4KIAotICAgIDxSb3c+CisgICAgPFJvdyBhbmRyb2lkOnJvd0VkZ2VGbGFncz0idG9wIj4KICAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIxIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgogICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjIiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIzIi8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzX3NoaWZ0LnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3N5bWJvbHNfc2hpZnQueG1sCmluZGV4IDRiODRmNGIuLmE5NzJlYjIgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3N5bWJvbHNfc2hpZnQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3N5bWJvbHNfc2hpZnQueG1sCkBAIC0yMiwxMCArMjIsMTAgQEAKICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgogICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgogICAgID4KIAotICAgIDxSb3c+CisgICAgPFJvdyBhbmRyb2lkOnJvd0VkZ2VGbGFncz0idG9wIj4KICAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ+IiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgogICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImAiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ8Ii8+CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA0ODdhMDBkLi5iMWUzOGVlIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTEwMjMsNyArMTAyMywxMyBAQAogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlIiAvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L3NlcnZpY2U+Ci0gICAgICAgIAorCisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC53ZWJraXQuQWNjZXNzaWJpbGl0eUluamVjdG9yVGVzdCRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2UiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvc2VydmljZT4KKwogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLndpZGdldC5SYWRpb0dyb3VwQWN0aXZpdHkiIGFuZHJvaWQ6bGFiZWw9IlJhZGlvR3JvdXBBY3Rpdml0eSI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9iYWNrc2xhc2gudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfYmFja3NsYXNoLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQzMDAyYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9iYWNrc2xhc2gudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjo7QVw7QlxcO0NcXFw7O0Q7XDpFO1xcXFw7DQotRk46QTtCXENcO0Q6RVxcDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfY29tcGxpY2F0ZWQudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfY29tcGxpY2F0ZWQudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTM0ZTE2Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2NvbXBsaWNhdGVkLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjpHdW1wO0ZvcnJlc3Q7SG9nZTtQb3M7VGFvDQotRk46Sm9lIER1ZQ0KLU9SRzpHdW1wIFNocmltcCBDby47U2FsZXMgRGVwdC5cO01hbmFnZXI7RmlzaCBrZWVwZXINCi1ST0xFOkZpc2ggQ2FrZSBLZWVwZXIhDQotWC1DTEFTUzpQVUJMSUMNCi1USVRMRTpTaHJpbXAgTWFuDQotVEVMO1dPUks7Vk9JQ0U6KDExMSkgNTU1LTEyMTINCi1URUw7SE9NRTtWT0lDRTooNDA0KSA1NTUtMTIxMg0KLVRFTDtDRUxMOjAzMTExMTExMTENCi1URUw7VklERU86MDMyMjIyMjIyMg0KLVRFTDtWT0lDRTowMzMzMzMzMzMzDQotQURSO1dPUks6OzsxMDAgV2F0ZXJzIEVkZ2U7QmF5dG93bjtMQTszMDMxNDtVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2ENCi1MQUJFTDtXT1JLO0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6MTAwIFdhdGVycyBFZGdlPTBEPTBBQmF5dG93biwgTEEgMzAzMTQ9MEQ9MEFVbml0ZWQgIFN0YXRlcyBvZiBBbWVyaWNhDQotQURSO0hPTUU6Ozs0MiBQbGFudGF0aW9uIFN0LjtCYXl0b3duO0xBOzMwMzE0O1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQ0KLUxBQkVMO0hPTUU7RU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRTo0MiBQbGFudGF0aW9uIFN0Lj0wRD0wQT0NCi1CYXl0b3duLCBMQSAzMDMxND0wRD0wQT0NCi1Vbml0ZWQgIFN0YXRlcyBvZiBBbWVyaWNhDQotRU1BSUw7UFJFRjtJTlRFUk5FVDpmb3JyZXN0Z3VtcEB3YWxsYWRhbGxhLmNvbQ0KLUVNQUlMO0NFTEw6Y2VsbEBleGFtcGxlLmNvbQ0KLU5PVEU6VGhlIGZvbGxvd2luZyBub3RlIGlzIHRoZSBleGFtcGxlIGZyb20gUkZDIDIwNDUuDQotTk9URTtFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOk5vdydzIHRoZSB0aW1lID0NCi1mb3IgYWxsIGZvbGsgdG8gY29tZT0NCi0gdG8gdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5Lg0KLQ0KLVBIT1RPO0VOQ09ESU5HPUJBU0U2NDtUWVBFPUpQRUc6DQotIC85ai80UW9QUlhocFpnQUFUVTBBS2dBQUFBZ0FEUUVPQUFJQUFBQVBBQUFBcWdFUEFBSUFBQUFIQUFBQXVnRVFBQUlBQUFBRw0KLSBBQUFBd2dFU0FBTUFBQUFCQUFFQUFBRWFBQVVBQUFBQkFBQUF5QUViQUFVQUFBQUJBQUFBMEFFb0FBTUFBQUFCQUFJQUFBRXgNCi0gQUFJQUFBQU9BQUFBMkFFeUFBSUFBQUFVQUFBQTVnSVRBQU1BQUFBQkFBRUFBSUtZQUFJQUFBQU9BQUFBK29kcEFBUUFBQUFCDQotIEFBQUJoTVNsQUFjQUFBQjhBQUFCQ0FBQUJCNHlNREE0TVRBeU9URXpOVFV6TVFBQVJHOURiMDF2QUFCRU9UQTFhUUFBQUFCSQ0KLSBBQUFBQVFBQUFFZ0FBQUFCUkRrd05Xa2dWbVZ5TVM0d01BQXlNREE0T2pFd09qSTVJREV6T2pVMU9qUTNBQ0FnSUNBZ0lDQWcNCi0gSUNBZ0lDQUFVSEpwYm5SSlRRQXdNekF3QUFBQUJnQUJBQlFBRkFBQ0FRQUFBQUFEQUFBQU5BRUFCUUFBQUFFQkFRQUFBQUVRDQotIGdBQUFBQUFBRVFrQUFDY1FBQUFQQ3dBQUp4QUFBQVdYQUFBbkVBQUFDTEFBQUNjUUFBQWNBUUFBSnhBQUFBSmVBQUFuRUFBQQ0KLSBBSXNBQUNjUUFBQUR5d0FBSnhBQUFCdmxBQUFuRUFBb2dwb0FCUUFBQUFFQUFBTnFncDBBQlFBQUFBRUFBQU55aUNJQUF3QUENCi0gQUFFQUFnQUFrQUFBQndBQUFBUXdNakl3a0FNQUFnQUFBQlFBQUFONmtBUUFBZ0FBQUJRQUFBT09rUUVBQndBQUFBUUJBZ01BDQotIGtRSUFCUUFBQUFFQUFBT2lrZ0VBQ2dBQUFBRUFBQU9xa2dJQUJRQUFBQUVBQUFPeWtnUUFDZ0FBQUFFQUFBTzZrZ1VBQlFBQQ0KLSBBQUVBQUFQQ2tnY0FBd0FBQUFFQUFnQUFrZ2dBQXdBQUFBRUFBQUFBa2drQUF3QUFBQUVBQUFBQWtnb0FCUUFBQUFFQUFBUEsNCi0ga253QUJ3QUFBQUVBQUFBQWtvWUFCd0FBQUJZQUFBUFNvQUFBQndBQUFBUXdNVEF3b0FFQUF3QUFBQUVBQVFBQW9BSUFBd0FBDQotIEFBRUFZQUFBb0FNQUF3QUFBQUVBU0FBQW9BVUFCQUFBQUFFQUFBUUFvZzRBQlFBQUFBRUFBQVBvb2c4QUJRQUFBQUVBQUFQdw0KLSBvaEFBQXdBQUFBRUFBZ0FBb2hjQUF3QUFBQUVBQWdBQW93QUFCd0FBQUFFREFBQUFvd0VBQndBQUFBRUJBQUFBcEFFQUF3QUENCi0gQUFFQUFBQUFwQUlBQXdBQUFBRUFBQUFBcEFNQUF3QUFBQUVBQUFBQXBBUUFCUUFBQUFFQUFBUDRwQVVBQXdBQUFBRUFIUUFBDQotIHBBWUFBd0FBQUFFQUFBQUFwQWNBQXdBQUFBRUFBQUFBcEFnQUF3QUFBQUVBQUFBQXBBa0FBd0FBQUFFQUFBQUFwQW9BQXdBQQ0KLSBBQUVBQUFBQXBBd0FBd0FBQUFFQUFnQUFBQUFBQUFBQUFGTUFBQ2NRQUFBQlhnQUFBR1F5TURBNE9qRXdPakk1SURFek9qVTENCi0gT2pNeEFESXdNRGc2TVRBNk1qa2dNVE02TlRVNk5EY0FBQUFwaUFBQUd3QUFBQUt5QUFBQVpBQUFBVjRBQUFCa0FBQUFBQUFBDQotIEFHUUFBQUFsQUFBQUNnQUFEcElBQUFQb0FBQUFBQUFBQUFBeU1EQTRNVEF5T1RFek5UVXpNUUFBSUNvQUFBQUtBQUFxNGdBQQ0KLSBBQW9BQUFBQUFBQUFBUUFDQUFFQUFnQUFBQVJTT1RnQUFBSUFCd0FBQUFRd01UQXdBQUFBQUFBR0FRTUFBd0FBQUFFQUJnQUENCi0gQVJvQUJRQUFBQUVBQUFSc0FSc0FCUUFBQUFFQUFBUjBBU2dBQXdBQUFBRUFBZ0FBQWdFQUJBQUFBQUVBQUFSOEFnSUFCQUFBDQotIEFBRUFBQVdMQUFBQUFBQUFBRWdBQUFBQkFBQUFTQUFBQUFILzJQL2JBSVFBSUJZWUhCZ1VJQndhSENRaUlDWXdVRFF3TEN3dw0KLSBZa1pLT2xCMFpucDRjbVp3Ym9DUXVKeUFpSzZLYm5DZzJxS3V2c1RPME01OG11THk0TWp3dU1yT3hnRWlKQ1F3S2pCZU5EUmUNCi0geG9Sd2hNYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHDQotIC84QUFFUWdBZUFDZ0F3RWhBQUlSQVFNUkFmL0VBYUlBQUFFRkFRRUJBUUVCQUFBQUFBQUFBQUFCQWdNRUJRWUhDQWtLQ3hBQQ0KLSBBZ0VEQXdJRUF3VUZCQVFBQUFGOUFRSURBQVFSQlJJaE1VRUdFMUZoQnlKeEZES0JrYUVJSTBLeHdSVlMwZkFrTTJKeWdna0sNCi0gRmhjWUdSb2xKaWNvS1NvME5UWTNPRGs2UTBSRlJrZElTVXBUVkZWV1YxaFpXbU5rWldabmFHbHFjM1IxZG5kNGVYcURoSVdHDQotIGg0aUppcEtUbEpXV2w1aVptcUtqcEtXbXA2aXBxckt6dExXMnQ3aTV1c0xEeE1YR3g4akp5dExUMU5YVzE5aloydUhpNCtUbA0KLSA1dWZvNmVyeDh2UDA5ZmIzK1BuNkFRQURBUUVCQVFFQkFRRUJBQUFBQUFBQUFRSURCQVVHQndnSkNnc1JBQUlCQWdRRUF3UUgNCi0gQlFRRUFBRUNkd0FCQWdNUkJBVWhNUVlTUVZFSFlYRVRJaktCQ0JSQ2thR3h3UWtqTTFMd0ZXSnkwUW9XSkRUaEpmRVhHQmthDQotIEppY29LU28xTmpjNE9UcERSRVZHUjBoSlNsTlVWVlpYV0ZsYVkyUmxabWRvYVdwemRIVjJkM2g1ZW9LRGhJV0doNGlKaXBLVA0KLSBsSldXbDVpWm1xS2pwS1dtcDZpcHFyS3p0TFcydDdpNXVzTER4TVhHeDhqSnl0TFQxTlhXMTlqWjJ1TGo1T1htNStqcDZ2THoNCi0gOVBYMjkvajUrdi9hQUF3REFRQUNFUU1SQUQ4QUZGU3FLa1pJb3FSVnBnU0tLZUJURU9BcHdGQURzVVlwZ0lSU0VVQU5JcHBGDQotIElDTmhVVENnQ01pbzJGSUNKaFVMQ2dDMG9xVmFBSkZGU3FLQmtnRk9BcGlIQ25DZ0IyS01VQ0VOSlFBMGltRVVER01LaVlVQQ0KLSBSdFViVWdJV3FKaFFCWlNwRm9BbFdwVm9HUEZQRk1RN3RTSzJPRFFBNHlLTzlIbUtlOUZ4QXpESEZJT2xBQWFZYUFHTlVUVUQNCi0gSW1xTnFRRVRWRTFBRTZWS0tBSkZOU3FhQUhnMDhHbUFOSUZGUU01WTVxSk1CdVQ2MFpOUUljcmtWWVNRTUt1TEdLYWFhc1F4DQotIHFpYWdaRTFSdFNBamFvbW9Ba1ExS3BvQWxVMUlwb0FrVTA3T0JUQXJPKzVxa1YxMlk3MWxmVUJtYUtrQ1JTdXpuclRGYmEyYQ0KLSBvQ3dHeU0wRTFxSWpZMUd4b0dSTlVaTklDTnFpYWdCeUdwbE5BRWltcEZOTUI0WUR2U3VjcHhTWUVJVTA0S2F6c0F1MXFBclUNCi0gV0VMdFBwVFNwb3NCTkVUdDVweE5hb0NOalViR2dDTmpVWm9HUnRVVFVnRlUxS3BvQWtCcVFIaWdDRm5PN3JVcU9kbFpwNmdBDQotIGMrdE9EbjFwWEFYekQ2MGVZZlduY1F2bU5TR1EwN2dPTWhDVkVKR3oxcHRnUzV5S1l4cXdHRTFHeG9BaWFtR2tNYXBxVlRRQg0KLSBLcHArZUtBSUNmbXFXTS9LYXo2Z0FOT0JxUUZ6Um1tQXVhVE5BQ3Nma3FNSG1tOXdKczhVMG10UkRHTlJzYUFJMnBocERJMU4NCi0gU3FhQUpGTlNBOFVDSVNmbXFTTS9LYXo2akFIbW5BMUlDZzB1YUFGelNacGdLeCtTbURyVGU0RTJlS2FUV29pTW1tTWFBSXpUDQotIERTR1JLYWtVMEFTS2FlRFRFUnNlYWtqUHltcytveEFhY0RVZ09CcGMwZ0Z6U1pwZ09ZL0tLWXYzcXJxSWxwcHJRQmpHb3lhQQ0KLSBHR21ta01nVTFJcHBnUEJxUUdnUXUwR240d3ZGS3dFUXB3TlpESFpwYzBBTG1pZ1JLQmxlYVFLQld0Z0EwMDFRREdxTTBnR20NCi0gbUdrTXJxYWtCb0FlcHA0Tk1SSURUd2FBRTJBMDA4R29rZ0h4amQxcHpLRnBXMHVBZzVOU0JCVGlyZ09wRFdnRFRUVFFBdzB3DQotIDBnR0dtbWdaV0JwNHBBU0thZURURU9CcDROQUR3YWpiclV5QkVrWFduU1VkQUdyMXFlaUFNU2tOV0FocGhvQWFhWWFRRERUVA0KLSBTR1ZSVHdhWUR4VHdhQkR3YWVEUUE0R2xLNW9hdUllbzIwcEdhTGFBS3FnVTZoS3dCU0dtQWhwaG9BYWFZYVF4aHBwcERLZ04NCi0gUEZNQjRwNG9FUEZPQnBnUEJwNE5BaHdwd29BV2xvQUtTZ0JEVFRRTVlhWWFRRFRUVFNHQS85bi8yd0NFQUFvSEJ3Z0hCZ29JDQotIENBZ0xDZ29MRGhnUURnME5EaDBWRmhFWUl4OGxKQ0lmSWlFbUt6Y3ZKaWswS1NFaU1FRXhORGs3UGo0K0pTNUVTVU04U0RjOQ0KLSBQanNCQ2dzTERnME9IQkFRSERzb0lpZzdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czcNCi0gT3pzN096czdPenM3T3pzN08vL0FBQkVJQUVnQVlBTUJJUUFDRVFFREVRSC94QUdpQUFBQkJRRUJBUUVCQVFBQUFBQUFBQUFBDQotIEFRSURCQVVHQndnSkNnc1FBQUlCQXdNQ0JBTUZCUVFFQUFBQmZRRUNBd0FFRVFVU0lURkJCaE5SWVFjaWNSUXlnWkdoQ0NOQw0KLSBzY0VWVXRId0pETmljb0lKQ2hZWEdCa2FKU1luS0NrcU5EVTJOemc1T2tORVJVWkhTRWxLVTFSVlZsZFlXVnBqWkdWbVoyaHANCi0gYW5OMGRYWjNlSGw2ZzRTRmhvZUlpWXFTazVTVmxwZVltWnFpbzZTbHBxZW9xYXF5czdTMXRyZTR1YnJDdzhURnhzZkl5Y3JTDQotIDA5VFYxdGZZMmRyaDR1UGs1ZWJuNk9ucThmTHo5UFgyOS9qNStnRUFBd0VCQVFFQkFRRUJBUUFBQUFBQUFBRUNBd1FGQmdjSQ0KLSBDUW9MRVFBQ0FRSUVCQU1FQndVRUJBQUJBbmNBQVFJREVRUUZJVEVHRWtGUkIyRnhFeUl5Z1FnVVFwR2hzY0VKSXpOUzhCVmkNCi0gY3RFS0ZpUTA0U1h4RnhnWkdpWW5LQ2txTlRZM09EazZRMFJGUmtkSVNVcFRWRlZXVjFoWldtTmtaV1puYUdscWMzUjFkbmQ0DQotIGVYcUNnNFNGaG9lSWlZcVNrNVNWbHBlWW1acWlvNlNscHFlb3FhcXlzN1MxdHJlNHVickN3OFRGeHNmSXljclMwOVRWMXRmWQ0KLSAyZHJpNCtUbDV1Zm82ZXJ5OC9UMTl2ZjQrZnIvMmdBTUF3RUFBaEVERVFBL0FKN1NMZ2NWcjIwSTRyTkZHdmJRQUFIRmFFVVgNCi0gU3JRaTVIQ01kS2s4b1k2VlNKWXg0aGpwVmFXTWVsQUZDNGlHRHhXUGRSOG1reG1SZHhqQnJFdkkrdFpqTjIweHRITmJOcUFjDQotIFVJRFhnNkNyMFdLdENZOFhLUU95ek9CM0ZLTldzeWNlWitsUzZzWTZOa2p2UFNkd0ltQkhVbW15NHEwNzZvQ2pPT0RXUGRnYw0KLSAwTXBHUGRBWU5ZbDRvNXJOak5Lemt5b3JadFh4aWhBYTF2SURpcDdtOUZyYjcvNGp3S2NueXhiRXpOM2llSnBwWnN5WjRVMUgNCi0gdXJ6WmF1NG1XVmxOckdrMFV1V1BWYTFZcm9YRUlrSGZyWFpoNVc5MFJXbmNBSG1zaTZiSk5kUTBaTnczQnJHdWlNR3MyTWtzDQotIHB1QnpXemJ6ZE9hRUJlT3BSMm9VdGtrOWhUcnU3aXVvNG04d2dlbUt5cVRpMDRzQnNma0VmNjhqOEtsVVFaejlvL1N1WlJqMw0KLSBKWXJpQWppNC9TcDdXNmh0YlYyYVhjdTcwcmFtb3hsZTRnTjdIY0lYamJpcys0azVOZGFhYXVobVZjdjFySHVXNjFER2lHMW0NCi0gNmMxczIwL1RtZ0F2NXZtajU3VktrMytpeG5QYzF4VlY3MGg5Q1ZKdU90U3JMNzFoRmd4elNjVWtrbitpWS8ycTFpOXhEckdUDQotIDl5MzFwSjVPdGQxTCtHaE15N21UcldYTzJTYXBqUm4yOHZUbXRhM254am1nR092SmQydzFLa3YraXB6L0FCR3VPb3ZlWWRDZQ0KLSBPYmpyVTZ5NXJsc0E4eWNVa3NuK2lqL2VOYXc2aUpMTnNXNTl6VEpuNjgxNkZQNEVKbWJPK1NhejVtNjAyVWpJZ2s0SE5hZHYNCi0gTHdLYUJsK01wSU1PTWlwcDQ5MFNDSmVGN0NvcVF2RjJKdVJxV1E0WUVHclNpUUp1S25IclhCeU1wa2k3M0dGQk5YSW9oOW4yDQotIFNybm5PSzZNUFRiZDNzU3dJVkYycU1DcWt6SG11eTFsWVJuVEhyVkdXcFphTUtCK0JXbGJ5Y1lvUU0wSVpEeHpWK0dVOGMxYQ0KLSBJWXk1WStkbkhhdEFzZnNBSGZBcm1TMW1Qb2gxZ1Q4eDlxdGsxclFYN3RDZTVESWFwekd0R0JRbTcxU2xxR1dqbklINlZvd3QNCi0gem1oQXkvRTN2VjZGNnRFTXV4bFdJeUFmclZ4Q0NBTzFWWkVFeVlBNEFBcHhOR3d5SitsVkpSVXNhS013NjFTbEZRelJBUC9aDQotDQotWC1BVFRSSUJVVEU6U29tZSBTdHJpbmcNCi1CREFZOjE5ODAwMTAxDQotR0VPOjM1LjY1NjM4NTQsMTM5LjY5OTQyMzMNCi1VUkw6aHR0cDovL3d3dy5leGFtcGxlLmNvbS8NCi1SRVY6MjAwODA0MjRUMTk1MjQzWg0KLUVORDpWQ0FSRApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2ltLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2ltLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MxYWFiYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9pbS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUJFR0lOOlZDQVJECi1WRVJTSU9OOjIuMQotWC1BTkRST0lELUNVU1RPTTp2bmQuYW5kcm9pZC5jdXJzb3IuaXRlbS9uaWNrbmFtZTtOaWNrOzE7Ozs7Ozs7Ozs7Ozs7Ci1YLUdPT0dMRS1UQUxLOmhoaEBnbWFpbC5jb20KLUVORDpWQ0FSRApkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfaW52YWxpZF9jb21tZW50X2xpbmUudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfaW52YWxpZF9jb21tZW50X2xpbmUudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTEwNzEwLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2ludmFsaWRfY29tbWVudF9saW5lLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLUJFR0lOOnZDYXJkDQotVkVSU0lPTjoyLjENCi1VSUQ6MzU3DQotTjo7Q29uZmVyZW5jZSBDYWxsDQotRk46Q29uZmVyZW5jZSBDYWxsDQotIyBUaGlzIGxpbmUgbXVzdCBiZSBpZ25vcmVkLg0KLU5PVEU7RU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRTpUaGlzIGlzIGFuIChzaGFycCAtPj0NCi0jPC0gc2hhcnApIGV4YW1wbGUuIFRoaXMgbWVzc2FnZSBtdXN0IE5PVCBiZSBpZ25vcmVkLg0KLSMgVGhpcyBsaW5lIG11c3QgYmUgaWdub3JlZCB0b28uDQotRU5EOnZDYXJkDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfaW52YWxpZF9tdWx0aXBsZV9saW5lLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2ludmFsaWRfbXVsdGlwbGVfbGluZS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljODFmZDUuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfaW52YWxpZF9tdWx0aXBsZV9saW5lLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotQkVHSU46VkNBUkQKLVZFUlNJT046Mi4xCi1OOjtPbWVnYTs7OwotRU1BSUw7SU5URVJORVQ6Ik9tZWdhIgotICA8b21lZ2FAZXhhbXBsZS5jb20+Ci1GTjpPbWVnYQotRU5EOlZDQVJECmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9qYXBhbmVzZV8xLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2phcGFuZXNlXzEudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDVlMmZmLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2phcGFuZXNlXzEudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhg42DQ4NoOzs7Ow0KLVNPVU5EO1gtSVJNQy1OO0NIQVJTRVQ9U0hJRlRfSklTOrHdxN6z27LE3js7OzsNCi1URUw7UFJFRjtWT0lDRTowMzAwMDAwMDAwDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfamFwYW5lc2VfMi52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9qYXBhbmVzZV8yLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE1NGFjYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9qYXBhbmVzZV8yLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1GTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhIIONg0ODaCAxDQotTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhO4ONg0ODaDE7OzsNCi1TT1VORDtYLUlSTUMtTjtDSEFSU0VUPVNISUZUX0pJUzqx3cTeszvbssTeMTs7Ow0KLUFEUjtIT01FO0NIQVJTRVQ9U0hJRlRfSklTO0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6Oz05Mz04Qz04Qj05RT05Mz03Mz0NCi09OEY9NjE9OTI9NEE9OEI9RTY9OEQ9Rjc9OEI9NzU9OTI9QUMyNi0xPTgzPTVBPTgzPThCPTgzPThBPTgzPTQxPTgzPTkzPQ0KLT04Mz01RT04Mz04Rj04MT01QjY9OEE9NEI7Ozs7MTUwLTg1MTI7DQotTk9URTtDSEFSU0VUPVNISUZUX0pJUztFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOj04Mz04MT04Mz04Mg0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX211bHRpcGxlX2VudHJ5LnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX211bHRpcGxlX2VudHJ5LnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiYjE5YS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9tdWx0aXBsZV9lbnRyeS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhg42DQ4NoMzs7OzsNCi1TT1VORDtYLUlSTUMtTjtDSEFSU0VUPVNISUZUX0pJUzqx3cTes9uyxN4zOzs7Ow0KLVRFTDtYLU5FQy1TRUNSRVQ6OQ0KLVRFTDtYLU5FQy1IT1RFTDoxMA0KLVRFTDtYLU5FQy1TQ0hPT0w6MTENCi1URUw7SE9NRTtGQVg6MTINCi1FTkQ6VkNBUkQNCi0NCi0NCi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhg42DQ4NoNDs7OzsNCi1TT1VORDtYLUlSTUMtTjtDSEFSU0VUPVNISUZUX0pJUzqx3cTes9uyxN40Ozs7Ow0KLVRFTDtNT0RFTToxMw0KLVRFTDtQQUdFUjoxNA0KLVRFTDtYLU5FQy1GQU1JTFk6MTUNCi1URUw7WC1ORUMtR0lSTDoxNg0KLUVORDpWQ0FSRA0KLQ0KLQ0KLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1OO0NIQVJTRVQ9U0hJRlRfSklTOojAk6GDjYNDg2g1Ozs7Ow0KLVNPVU5EO1gtSVJNQy1OO0NIQVJTRVQ9U0hJRlRfSklTOrHdxN6z27LE3jU7Ozs7DQotVEVMO1gtTkVDLUJPWToxNw0KLVRFTDtYLU5FQy1GUklFTkQ6MTgNCi1URUw7WC1ORUMtUEhTOjE5DQotVEVMO1gtTkVDLVJFU1RBVVJBTlQ6MjANCi1FTkQ6VkNBUkQNCi0NCi0NCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9vcmdfYmVmb3JlX3RpdGxlLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX29yZ19iZWZvcmVfdGl0bGUudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmYxMTkwLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX29yZ19iZWZvcmVfdGl0bGUudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotRk46Tm9ybWFsIEd1eQ0KLU9SRzpDb21wYW55O09yZ2FuaXphdGlvbjtEZXZpc2lvbjtSb29tO1NoZWV0IE5vLg0KLVRJVExFOkV4Y2VsbGVudCBKYW5pdG9yDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfcHJlZl9oYW5kbGluZy52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9wcmVmX2hhbmRsaW5nLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEwNTMxMC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9wcmVmX2hhbmRsaW5nLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLUJFR0lOOlZDQVJECi1WRVJTSU9OOjIuMQotRk46U21pdGgKLVRFTDtIT01FOjEKLVRFTDtXT1JLO1BSRUY6MgotVEVMO0lTRE46MwotRU1BSUw7UFJFRjtIT01FOnRlc3RAZXhhbXBsZS5jb20KLUVNQUlMO0NFTEw7UFJFRjp0ZXN0MkBleGFtaW5hdGlvbi5jb20KLU9SRzpDb21wYW55Ci1USVRMRTpFbmdpbmVlcgotT1JHOk15c3RlcnkKLVRJVExFOkJsb2dnZXIKLU9SRzpQb2V0cnkKLVRJVExFOlBvZXQKLUVORDpWQ0FSRApkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzEudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzEudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWFiYjRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8xLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1OOkFuZG87Um9pZDsNCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMi52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMi52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZDVhYjUuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzIudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLUZOOkFuZG8gUm9pZA0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8zLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8zLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkZGFiYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMy52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotTjpBbmRvO1JvaWQ7DQotRk46QW5kbyBSb2lkDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfdGl0bGVfYmVmb3JlX29yZy52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV90aXRsZV9iZWZvcmVfb3JnLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZkYzczOC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV90aXRsZV9iZWZvcmVfb3JnLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLUZOOk5pY2UgR3V5DQotVElUTEU6Q29vbCBUaXRsZQ0KLU9SRzpNYXJ2ZXJvdXM7UGVyZmVjdDtHcmVhdDtHb29kO0JhZDtQb29yDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfd2lubW9fNjUudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfd2lubW9fNjUudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzgwZDBkLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3dpbm1vXzY1LnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1OOkV4YW1wbGU7Ozs7DQotRk46RXhhbXBsZQ0KLUFOTklWRVJTQVJZO1ZBTFVFPURBVEU6MjAwOTEwMTANCi1BR0VOVDpJbnZhbGlkIGxpbmUgd2hpY2ggbXVzdCBiZSBoYW5kbGVkIGNvcnJlY3RseS4NCi1YLUNMQVNTOlBVQkxJQw0KLVgtUkVEVUNUSU9OOg0KLVgtTk86DQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfY29tbWFfc2VwYXJhdGVkLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX2NvbW1hX3NlcGFyYXRlZC52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYmFmODguLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfY29tbWFfc2VwYXJhdGVkLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjMuMA0KLU47VFlQRT1QUkVGLEhPTUU6RjtHO007Ow0KLVRFTDtUWVBFPSJDT01NQSxTRVBBUkFURUQ6SU5TSURFLkRRVU9URSIsUFJFRjoxDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfbXVsdGlieXRlX3BhcmFtLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX211bHRpYnl0ZV9wYXJhbS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMjAwZTUuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfbXVsdGlieXRlX3BhcmFtLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjMuMA0KLU46RjtHO007Ow0KLVRFTDtUWVBFPSLotLkiOjENCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9wYWdlci52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9wYWdlci52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YTdmMjAuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfcGFnZXIudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046My4wDQotTjpGO0c7TTs7DQotVEVMO1RZUEU9UEFHRVIsV09SSyxNU0c6NjEwMTIzMTIzNEBwYWdlcnNhbXBsZS5jb20NCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9zaW1wbGUudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfc2ltcGxlLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE4NjYxZi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9zaW1wbGUudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjMuMA0KLUZOOkFuZCBSb2lkDQotTjpBbmQ7Um9pZDs7Ow0KLU9SRzpPcGVuO0hhbmRzZXQ7IEFsbGlhbmNlDQotU09SVC1TVFJJTkc6YW5kcm9pZA0KLVRFTDtUWVBFPVBSRUY7VFlQRT1WT0lDRTowMzAwMDAwMDAwDQotQ0xBU1M6UFVCTElDDQotWC1HTk86MA0KLVgtR046Z3JvdXAwDQotWC1SRURVQ1RJT046MA0KLVJFVjoyMDA4MTAzMVQwNjU4NTRaDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92NDBfc29ydF9hcy52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3Y0MF9zb3J0X2FzLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2YmMzYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3Y0MF9zb3J0X2FzLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjQuMA0KLUZOOuWuieiXpCDjg63jgqTjg4kNCi1OO1NPUlQtQVM9IuOBguOCk+OBqeOBhjvjgo3jgYTjgakiOuWuieiXpDvjg63jgqTjg4k7OzsNCi1PUkc7VFlQRT1XT1JLO1NPUlQtQVM9IuOBkOODvOOBkOOCizvjgZHjgpPjgZXjgY/jgbbjgoLjgpMiOuOCsOODvOOCsOODqzvmpJzntKLpg6jploANCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9BY2Nlc3NpYmlsaXR5VGVzdFNlcnZpY2UuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0FjY2Vzc2liaWxpdHlUZXN0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTUxZWVhLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0FjY2Vzc2liaWxpdHlUZXN0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2U7Ci0KLWltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvOwotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKLQotaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKLWltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgdGV4dCB0aGUgYWNjZXNzaWJpbGl0eSBmcmFtZXdvcmsgZW5kIHRvIGVuZC4KLSAqIDxwPgotICogTm90ZTogU2luY2UgYWNjZXNzaWJpbGl0eSBpcyBwcm92aWRlZCBieSB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2V9cyB3ZSBjcmVhdGUgb25lLAotICogYW5kIGl0IGdlbmVyYXRlcyBhbiBldmVudCBhbmQgYW4gaW50ZXJydXB0aW9uIGRpc3BhdGNoaW5nIHRoZW0gdGhyb3VnaCB0aGUKLSAqIHtAbGluayBBY2Nlc3NpYmlsaXR5TWFuYWdlcn0uIFdlIHZlcmlmeSB0aGUgcmVjZWl2ZWQgcmVzdWx0LiBUbyB0cmlnZ2VyIHRoZSB0ZXN0Ci0gKiBnbyB0byBTZXR0aW5ncy0+QWNjZXNzaWJpbGl0eSBhbmQgc2VsZWN0IHRoZSBlbmFibGUgYWNjZXNzaWJpbGl0eSBjaGVjayBhbmQgdGhlbgotICogc2VsZWN0IHRoZSBjaGVjayBmb3IgdGhpcyBzZXJ2aWNlIChzYW1lIG5hbWUgYXMgdGhlIGNsYXNzKS4KLSAqLwotcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlUZXN0U2VydmljZSBleHRlbmRzIEFjY2Vzc2liaWxpdHlTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkFjY2Vzc2liaWxpdHlUZXN0U2VydmljZSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRSA9ICJmb28uYmFyLmJhei5UZXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gImZvby5iYXIuYmF6IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVCA9ICJTb21lIHN0dWZmIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVGT1JFX1RFWFQgPSAiU29tZSBvdGhlciBzdHVmZiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ERVNDUklQVElPTiA9ICJDb250ZW50IGRlc2NyaXB0aW9uIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJVEVNX0NPVU5UID0gMTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENVUlJFTlRfSVRFTV9JTkRFWCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVEVSUlVQVF9JTlZPQ0FUSU9OX1RZUEUgPSAweDAwMDAwMjAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZST01fSU5ERVggPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERFRF9DT1VOVCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFTU9WRURfQ09VTlQgPSAxOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVElGSUNBVElPTl9USU1FT1VUX01JTExJUyA9IDgwOwotCi0gICAgcHJpdmF0ZSBpbnQgbVJlY2VpdmVkUmVzdWx0OwotCi0gICAgcHJpdmF0ZSBUaW1lciBtVGltZXIgPSBuZXcgVGltZXIoKTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZCgpIHsKLSAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGluZm8gPSBuZXcgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvKCk7Ci0gICAgICAgIGluZm8uZXZlbnRUeXBlcyA9IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFU19BTExfTUFTSzsKLSAgICAgICAgaW5mby5mZWVkYmFja1R5cGUgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uRkVFREJBQ0tfQVVESUJMRTsKLSAgICAgICAgaW5mby5ub3RpZmljYXRpb25UaW1lb3V0ID0gTk9USUZJQ0FUSU9OX1RJTUVPVVRfTUlMTElTOwotICAgICAgICBpbmZvLmZsYWdzICY9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5ERUZBVUxUOwotICAgICAgICBzZXRTZXJ2aWNlSW5mbyhpbmZvKTsKLQotICAgICAgICAvLyB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgdGhlIHN5c3RlbSBwaWNrcyBvdXIgY29uZmlndXJhdGlvbgotICAgICAgICAvLyBvdGhlcndpc2UgaXQgd2lsbCBub3Qgbm90aWZ5IHVzCi0gICAgICAgIG1UaW1lci5zY2hlZHVsZShuZXcgVGltZXJUYXNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdGVzdEFjY2Vzc2liaWxpdHlFdmVudERpc3BhdGNoaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RJbnRlcnJ1cHQoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRXJyb3IgaW4gdGVzdGluZyBBY2Nlc3NpYmlsaXR5IGZlYXR1cmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIDEwMDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGhlcmUgaWYgdGhlIGV2ZW50IHdlIHJlY2VpdmVkIGlzIGFjdHVhbGx5IHRoZSBvbmUgd2Ugc2VudC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgYXNzZXJ0KEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX05PVElGSUNBVElPTl9TVEFURV9DSEFOR0VEID09IGV2ZW50LmdldEV2ZW50VHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50ICE9IG51bGwpOwotICAgICAgICBhc3NlcnQoZXZlbnQuZ2V0RXZlbnRUaW1lKCkgPiAwKTsKLSAgICAgICAgYXNzZXJ0KENMQVNTX05BTUUuZXF1YWxzKGV2ZW50LmdldENsYXNzTmFtZSgpKSk7Ci0gICAgICAgIGFzc2VydChQQUNLQUdFX05BTUUuZXF1YWxzKGV2ZW50LmdldFBhY2thZ2VOYW1lKCkpKTsKLSAgICAgICAgYXNzZXJ0KDEgPT0gZXZlbnQuZ2V0VGV4dCgpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydChURVhULmVxdWFscyhldmVudC5nZXRUZXh0KCkuZ2V0KDApKSk7Ci0gICAgICAgIGFzc2VydChCRUZPUkVfVEVYVC5lcXVhbHMoZXZlbnQuZ2V0QmVmb3JlVGV4dCgpKSk7Ci0gICAgICAgIGFzc2VydChldmVudC5pc0NoZWNrZWQoKSk7Ci0gICAgICAgIGFzc2VydChDT05URU5UX0RFU0NSSVBUSU9OLmVxdWFscyhldmVudC5nZXRDb250ZW50RGVzY3JpcHRpb24oKSkpOwotICAgICAgICBhc3NlcnQoSVRFTV9DT1VOVCA9PSBldmVudC5nZXRJdGVtQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydChDVVJSRU5UX0lURU1fSU5ERVggPT0gZXZlbnQuZ2V0Q3VycmVudEl0ZW1JbmRleCgpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50LmlzRW5hYmxlZCgpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50LmlzUGFzc3dvcmQoKSk7Ci0gICAgICAgIGFzc2VydChGUk9NX0lOREVYID09IGV2ZW50LmdldEZyb21JbmRleCgpKTsKLSAgICAgICAgYXNzZXJ0KEFEREVEX0NPVU5UID09IGV2ZW50LmdldEFkZGVkQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydChSRU1PVkVEX0NPVU5UID09IGV2ZW50LmdldFJlbW92ZWRDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50LmdldFBhcmNlbGFibGVEYXRhKCkgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydCgxID09ICgoTm90aWZpY2F0aW9uKSBldmVudC5nZXRQYXJjZWxhYmxlRGF0YSgpKS5pY29uKTsKLQotICAgICAgICAvLyBzZXQgdGhlIHR5cGUgb2YgdGhlIHJlY2V2ZWQgcmVxdWVzdAotICAgICAgICBtUmVjZWl2ZWRSZXN1bHQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9OT1RJRklDQVRJT05fU1RBVEVfQ0hBTkdFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgYSBmbGFnIHRoYXQgd2UgcmVjZWl2ZWQgdGhlIGludGVycnVwdCByZXF1ZXN0LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uSW50ZXJydXB0KCkgewotCi0gICAgICAgIC8vIHNldCB0aGUgdHlwZSBvZiB0aGUgcmVjZXZlZCByZXF1ZXN0Ci0gICAgICAgIG1SZWNlaXZlZFJlc3VsdCA9IElOVEVSUlVQVF9JTlZPQ0FUSU9OX1RZUEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH0gaXMgc2VudCBhbmQgcmVjZWl2ZWQgY29ycmVjdGx5LgotICAgICAqLwotICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc2liaWxpdHlFdmVudERpc3BhdGNoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0KLSAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbihBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9OT1RJRklDQVRJT05fU1RBVEVfQ0hBTkdFRCk7Ci0KLSAgICAgICBhc3NlcnQoZXZlbnQgIT0gbnVsbCk7Ci0gICAgICAgZXZlbnQuc2V0Q2xhc3NOYW1lKENMQVNTX05BTUUpOwotICAgICAgIGV2ZW50LnNldFBhY2thZ2VOYW1lKFBBQ0tBR0VfTkFNRSk7Ci0gICAgICAgZXZlbnQuZ2V0VGV4dCgpLmFkZChURVhUKTsKLSAgICAgICBldmVudC5zZXRCZWZvcmVUZXh0KEJFRk9SRV9URVhUKTsKLSAgICAgICBldmVudC5zZXRDaGVja2VkKHRydWUpOwotICAgICAgIGV2ZW50LnNldENvbnRlbnREZXNjcmlwdGlvbihDT05URU5UX0RFU0NSSVBUSU9OKTsKLSAgICAgICBldmVudC5zZXRJdGVtQ291bnQoSVRFTV9DT1VOVCk7Ci0gICAgICAgZXZlbnQuc2V0Q3VycmVudEl0ZW1JbmRleChDVVJSRU5UX0lURU1fSU5ERVgpOwotICAgICAgIGV2ZW50LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgZXZlbnQuc2V0UGFzc3dvcmQodHJ1ZSk7Ci0gICAgICAgZXZlbnQuc2V0RnJvbUluZGV4KEZST01fSU5ERVgpOwotICAgICAgIGV2ZW50LnNldEFkZGVkQ291bnQoQURERURfQ09VTlQpOwotICAgICAgIGV2ZW50LnNldFJlbW92ZWRDb3VudChSRU1PVkVEX0NPVU5UKTsKLSAgICAgICBldmVudC5zZXRQYXJjZWxhYmxlRGF0YShuZXcgTm90aWZpY2F0aW9uKDEsICJGb28iLCAxMjM0KSk7Ci0KLSAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZSh0aGlzKS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGV2ZW50KTsKLQotICAgICAgIGFzc2VydChtUmVjZWl2ZWRSZXN1bHQgPT0gZXZlbnQuZ2V0RXZlbnRUeXBlKCkpOwotCi0gICAgICAgTG9nLmkoTE9HX1RBRywgIkFjY2Vzc2liaWxpdHlUZXN0U2VydmljZSN0ZXN0QWNjZXNzaWJpbGl0eUV2ZW50RGlzcGF0Y2hpbmc6IFN1Y2Nlc3MiKTsKLSAgIH0KLQotICAgLyoqCi0gICAgKiBJZiBhY2Nlc3NpYmlsaXR5IGZlZWRiYWNrIGludGVycnVwdGlvbiBpcyB0cmlnZ2VyZWQgYW5kIHJlY2VpdmVkIGNvcnJlY3RseS4KLSAgICAqLwotICAgcHVibGljIHZvaWQgdGVzdEludGVycnVwdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKHRoaXMpLmludGVycnVwdCgpOwotCi0gICAgICAgYXNzZXJ0KElOVEVSUlVQVF9JTlZPQ0FUSU9OX1RZUEUgPT0gbVJlY2VpdmVkUmVzdWx0KTsKLQotICAgICAgIExvZy5pKExPR19UQUcsICJBY2Nlc3NpYmlsaXR5VGVzdFNlcnZpY2UjdGVzdEludGVycnVwdDogU3VjY2VzcyIpOwotICAgfQotfQotCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoU3RyZXNzVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFN0cmVzc1Rlc3QuamF2YQppbmRleCAxNDk2ODVjLi5kOGQ5ZWJhIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoU3RyZXNzVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhTdHJlc3NUZXN0LmphdmEKQEAgLTc4LDUwICs3OCw0IEBACiAKICAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOwogICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYWlyKCkgewotICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBhZGFwdGVyLmdldFJlbW90ZURldmljZShCbHVldG9vdGhUZXN0UnVubmVyLnNIZWFkc2V0QWRkcmVzcyk7Ci0KLSAgICAgICAgbVRlc3RVdGlscy5lbmFibGUoYWRhcHRlcik7Ci0gICAgICAgIG1UZXN0VXRpbHMucGFpcihhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3RBMmRwKCkgewotICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEJsdWV0b290aFRlc3RSdW5uZXIuc0Nvbm5lY3RBMmRwSXRlcmF0aW9uczsKLSAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOwotICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gYWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoQmx1ZXRvb3RoVGVzdFJ1bm5lci5zQTJkcEFkZHJlc3MpOwotCi0gICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgewotICAgICAgICAgICAgbVRlc3RVdGlscy53cml0ZU91dHB1dCgiY29ubmVjdEEyZHAgaXRlcmF0aW9uICIgKyAoaSArIDEpICsgIiBvZiAiICsgaXRlcmF0aW9ucyk7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLmNvbm5lY3RBMmRwKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLmRpc2Nvbm5lY3RBMmRwKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiBVbnBhaXIgZnJvbSBkZXZpY2UgaWYgZGV2aWNlIGNhbiBhY2NlcHQgcGFpcmluZyBhZnRlciB1bnBhaXJpbmcKLSAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uZWN0SGVhZHNldCgpIHsKLSAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBCbHVldG9vdGhUZXN0UnVubmVyLnNDb25uZWN0SGVhZHNldEl0ZXJhdGlvbnM7Ci0gICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKEJsdWV0b290aFRlc3RSdW5uZXIuc0hlYWRzZXRBZGRyZXNzKTsKLQotICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZShhZGFwdGVyKTsKLSAgICAgICAgbVRlc3RVdGlscy5wYWlyKGFkYXB0ZXIsIGRldmljZSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMud3JpdGVPdXRwdXQoImNvbm5lY3RIZWFkc2V0IGl0ZXJhdGlvbiAiICsgKGkgKyAxKSArICIgb2YgIiArIGl0ZXJhdGlvbnMpOwotICAgICAgICAgICAgbVRlc3RVdGlscy5jb25uZWN0SGVhZHNldChhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICAgICAgbVRlc3RVdGlscy5kaXNjb25uZWN0SGVhZHNldChhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETzogVW5wYWlyIGZyb20gZGV2aWNlIGlmIGRldmljZSBjYW4gYWNjZXB0IHBhaXJpbmcgYWZ0ZXIgdW5wYWlyaW5nCi0gICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFJ1bm5lci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFRlc3RSdW5uZXIuamF2YQppbmRleCAyZTZkYWEzLi5jZjBmZjk5IDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFJ1bm5lci5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhUZXN0UnVubmVyLmphdmEKQEAgLTI2LDExICsyNiw2IEBACiAgICAgcHVibGljIHN0YXRpYyBpbnQgc0VuYWJsZUl0ZXJhdGlvbnMgPSAxMDA7CiAgICAgcHVibGljIHN0YXRpYyBpbnQgc0Rpc2NvdmVyYWJsZUl0ZXJhdGlvbnMgPSAxMDAwOwogICAgIHB1YmxpYyBzdGF0aWMgaW50IHNTY2FuSXRlcmF0aW9ucyA9IDEwMDA7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgc0Nvbm5lY3RIZWFkc2V0SXRlcmF0aW9ucyA9IDEwMDsKLSAgICBwdWJsaWMgc3RhdGljIGludCBzQ29ubmVjdEEyZHBJdGVyYXRpb25zID0gMTAwOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc0hlYWRzZXRBZGRyZXNzID0gIiI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc0EyZHBBZGRyZXNzID0gIiI7CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgVGVzdFN1aXRlIGdldEFsbFRlc3RzKCkgewpAQCAtNzQsMzMgKzY5LDUgQEAKICAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGFyZ3VtZW50LCBmYWxsIGJhY2sgdG8gZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgdmFsID0gYXJndW1lbnRzLmdldFN0cmluZygiY29ubmVjdF9hMmRwX2l0ZXJhdGlvbnMiKTsKLSAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNDb25uZWN0QTJkcEl0ZXJhdGlvbnMgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIEludmFsaWQgYXJndW1lbnQsIGZhbGwgYmFjayB0byBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWwgPSBhcmd1bWVudHMuZ2V0U3RyaW5nKCJjb25uZWN0X2hlYWRzZXRfaXRlcmF0aW9ucyIpOwotICAgICAgICBpZiAodmFsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc0Nvbm5lY3RIZWFkc2V0SXRlcmF0aW9ucyA9IEludGVnZXIucGFyc2VJbnQodmFsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gSW52YWxpZCBhcmd1bWVudCwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZhbCA9IGFyZ3VtZW50cy5nZXRTdHJpbmcoImhlYWRzZXRfYWRkcmVzcyIpOwotICAgICAgICBpZiAodmFsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNIZWFkc2V0QWRkcmVzcyA9IHZhbDsKLSAgICAgICAgfQotCi0gICAgICAgIHZhbCA9IGFyZ3VtZW50cy5nZXRTdHJpbmcoImEyZHBfYWRkcmVzcyIpOwotICAgICAgICBpZiAodmFsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNBMmRwQWRkcmVzcyA9IHZhbDsKLSAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhUZXN0VXRpbHMuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhUZXN0VXRpbHMuamF2YQppbmRleCBlOTMxMWUwLi44MmRlNTA5IDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFV0aWxzLmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFRlc3RVdGlscy5qYXZhCkBAIC0xNiw3ICsxNiw2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7CiAKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIZWFkc2V0LlNlcnZpY2VMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKQEAgLTU4LDM2ICs1Nyw2IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBTkNFTF9ESVNDT1ZFUllfVElNRU9VVCA9IDUwMDA7CiAKLSAgICAvKioKLSAgICAgKiBUaW1lb3V0IGZvciB7QGxpbmsgQmx1ZXRvb3RoRGV2aWNlI2NyZWF0ZUJvbmQoKX0gaW4gbXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBSVJfVElNRU9VVCA9IDIwMDAwOwotCi0gICAgLyoqCi0gICAgICogVGltZW91dCBmb3Ige0BsaW5rIEJsdWV0b290aERldmljZSNyZW1vdmVCb25kKCl9IGluIG1zLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTlBBSVJfVElNRU9VVCA9IDIwMDAwOwotCi0gICAgLyoqCi0gICAgICogVGltZW91dCBmb3Ige0BsaW5rIEJsdWV0b290aEEyZHAjY29ubmVjdFNpbmsoQmx1ZXRvb3RoRGV2aWNlKX0gaW4gbXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfQTJEUF9USU1FT1VUID0gMjAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaW1lb3V0IGZvciB7QGxpbmsgQmx1ZXRvb3RoQTJkcCNkaXNjb25uZWN0U2luayhCbHVldG9vdGhEZXZpY2UpfSBpbiBtcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9BMkRQX1RJTUVPVVQgPSAyMDAwMDsKLQotICAgIC8qKgotICAgICAqIFRpbWVvdXQgZm9yIHtAbGluayBCbHVldG9vdGhIZWFkc2V0I2Nvbm5lY3RIZWFkc2V0KEJsdWV0b290aERldmljZSl9IGluIG1zLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0hFQURTRVRfVElNRU9VVCA9IDIwMDAwOwotCi0gICAgLyoqCi0gICAgICogVGltZW91dCBmb3Ige0BsaW5rIEJsdWV0b290aEhlYWRzZXQjZGlzY29ubmVjdEhlYWRzZXQoQmx1ZXRvb3RoRGV2aWNlKX0gaW4gbXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfSEVBRFNFVF9USU1FT1VUID0gMjAwMDA7Ci0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09WRVJZX1NUQVJURURfRkxBRyA9IDE7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPVkVSWV9GSU5JU0hFRF9GTEFHID0gMSA8PCAxOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ0FOX01PREVfTk9ORV9GTEFHID0gMSA8PCAyOwpAQCAtOTcsMjMgKzY2LDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVFVSTklOR19PTl9GTEFHID0gMSA8PCA2OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9PTl9GTEFHID0gMSA8PCA3OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9UVVJOSU5HX09GRl9GTEFHID0gMSA8PCA4OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUlSX1NUQVRFX0ZMQUcgPSAxIDw8IDk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST0ZJTEVfQTJEUF9GTEFHID0gMSA8PCAxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9IRUFEU0VUX0ZMQUcgPSAxIDw8IDExOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBSVJfU1RBVEVfQk9OREVEID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFJUl9TVEFURV9CT05ESU5HID0gMSA8PCAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUlSX1NUQVRFX05PTkUgPSAxIDw8IDI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQTJEUF9TVEFURV9ESVNDT05ORUNURUQgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBMkRQX1NUQVRFX0NPTk5FQ1RJTkcgPSAxIDw8IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEEyRFBfU1RBVEVfQ09OTkVDVEVEID0gMSA8PCAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBMkRQX1NUQVRFX0RJU0NPTk5FQ1RJTkcgPSAxIDw8IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEEyRFBfU1RBVEVfUExBWUlORyA9IDEgPDwgNDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIRUFEU0VUX1NUQVRFX0RJU0NPTk5FQ1RFRCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhFQURTRVRfU1RBVEVfQ09OTkVDVElORyA9IDEgPDwgMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSEVBRFNFVF9TVEFURV9DT05ORUNURUQgPSAxIDw8IDI7CiAKICAgICAvKioKICAgICAgKiBUaW1lIGJldHdlZW4gcG9sbHMgaW4gbXMuCkBAIC0xMjQsNDMgKzc2LDExIEBACiAKICAgICBwcml2YXRlIEJ1ZmZlcmVkV3JpdGVyIG1PdXRwdXRXcml0ZXI7CiAKLSAgICBwcml2YXRlIEJsdWV0b290aEEyZHAgbUEyZHA7Ci0KLSAgICBwcml2YXRlIEJsdWV0b290aEhlYWRzZXQgbUhlYWRzZXQ7Ci0KICAgICBwcml2YXRlIFN0cmluZyBtT3V0cHV0RmlsZTsKICAgICBwcml2YXRlIFN0cmluZyBtVGFnOwotICAgIHByaXZhdGUgY2xhc3MgSGVhZHNldFNlcnZpY2VMaXN0ZW5lciBpbXBsZW1lbnRzIFNlcnZpY2VMaXN0ZW5lciB7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ29ubmVjdGVkID0gZmFsc2U7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZCgpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIG1Db25uZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZCgpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIG1Db25uZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1Db25uZWN0ZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEhlYWRzZXRTZXJ2aWNlTGlzdGVuZXIgbUhlYWRzZXRTZXJ2aWNlTGlzdGVuZXIgPSBuZXcgSGVhZHNldFNlcnZpY2VMaXN0ZW5lcigpOwogCiAgICAgcHJpdmF0ZSBjbGFzcyBCbHVldG9vdGhSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKICAgICAgICAgcHJpdmF0ZSBpbnQgbUZpcmVkRmxhZ3MgPSAwOwotICAgICAgICBwcml2YXRlIGludCBtUGFpckZpcmVkRmxhZ3MgPSAwOwotICAgICAgICBwcml2YXRlIGludCBtQTJkcEZpcmVkRmxhZ3MgPSAwOwotICAgICAgICBwcml2YXRlIGludCBtSGVhZHNldEZpcmVkRmxhZ3MgPSAwOwogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CkBAIC0yMDIsNTggKzEyMiw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpcmVkRmxhZ3MgfD0gU1RBVEVfVFVSTklOR19PRkZfRkxBRzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQmx1ZXRvb3RoRGV2aWNlLkFDVElPTl9CT05EX1NUQVRFX0NIQU5HRUQuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZpcmVkRmxhZ3MgfD0gUEFJUl9TVEFURV9GTEFHOwotICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0JPTkRfU1RBVEUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShzdGF0ZSwgLTEpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFpckZpcmVkRmxhZ3MgfD0gUEFJUl9TVEFURV9CT05ERUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhaXJGaXJlZEZsYWdzIHw9IFBBSVJfU1RBVEVfQk9ORElORzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFpckZpcmVkRmxhZ3MgfD0gUEFJUl9TVEFURV9OT05FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCbHVldG9vdGhBMmRwLkFDVElPTl9TSU5LX1NUQVRFX0NIQU5HRUQuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZpcmVkRmxhZ3MgfD0gUFJPRklMRV9BMkRQX0ZMQUc7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhBMmRwLkVYVFJBX1NJTktfU1RBVEUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShzdGF0ZSwgLTEpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwRmlyZWRGbGFncyB8PSBBMkRQX1NUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwRmlyZWRGbGFncyB8PSBBMkRQX1NUQVRFX0NPTk5FQ1RJTkc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwRmlyZWRGbGFncyB8PSBBMkRQX1NUQVRFX0NPTk5FQ1RFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNUSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwRmlyZWRGbGFncyB8PSBBMkRQX1NUQVRFX0RJU0NPTk5FQ1RJTkc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQTJkcEZpcmVkRmxhZ3MgfD0gQTJEUF9TVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCbHVldG9vdGhIZWFkc2V0LkFDVElPTl9TVEFURV9DSEFOR0VELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GaXJlZEZsYWdzIHw9IFBST0ZJTEVfSEVBRFNFVF9GTEFHOwotICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoSGVhZHNldC5FWFRSQV9TVEFURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShzdGF0ZSwgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRzZXRGaXJlZEZsYWdzIHw9IEhFQURTRVRfU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRzZXRGaXJlZEZsYWdzIHw9IEhFQURTRVRfU1RBVEVfQ09OTkVDVElORzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRzZXRGaXJlZEZsYWdzIHw9IEhFQURTRVRfU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yNjQsMzAgKzEzMiw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgaW50IGdldFBhaXJGaXJlZEZsYWdzKCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1QYWlyRmlyZWRGbGFnczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0QTJkcEZpcmVkRmxhZ3MoKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUEyZHBGaXJlZEZsYWdzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRIZWFkc2V0RmlyZWRGbGFncygpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIHJldHVybiBtSGVhZHNldEZpcmVkRmxhZ3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICBwdWJsaWMgdm9pZCByZXNldEZpcmVkRmxhZ3MoKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgICAgICBtRmlyZWRGbGFncyA9IDA7Ci0gICAgICAgICAgICAgICAgbVBhaXJGaXJlZEZsYWdzID0gMDsKLSAgICAgICAgICAgICAgICBtQTJkcEZpcmVkRmxhZ3MgPSAwOwotICAgICAgICAgICAgICAgIG1IZWFkc2V0RmlyZWRGbGFncyA9IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC01NzIsMzUxICs0MTksNiBAQAogCiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgcGFpcihCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaW50IG1hc2sgPSBQQUlSX1NUQVRFX0ZMQUc7Ci0gICAgICAgIGludCBwYWlyTWFzayA9IFBBSVJfU1RBVEVfQk9ORElORyB8IFBBSVJfU1RBVEVfQk9OREVEOwotICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBmYWlsKCJwYWlyKCkgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc3RhdGUgPSBkZXZpY2UuZ2V0Qm9uZFN0YXRlKCk7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVEOgotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ESU5HOgotICAgICAgICAgICAgICAgIC8vIERvbid0IGNoZWNrIGZvciByZWNlaXZlZCBpbnRlbnRzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIHRoZW0uCi0gICAgICAgICAgICAgICAgbWFzayA9IHBhaXJNYXNrID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORToKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRldmljZS5jcmVhdGVCb25kKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBmYWlsKCJwYWlyKCkgaW52YWxpZGUgc3RhdGU6IHN0YXRlPSIgKyBzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IFBBSVJfVElNRU9VVCkgewotICAgICAgICAgICAgc3RhdGUgPSBkZXZpY2UuZ2V0Qm9uZFN0YXRlKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVEKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBpZiAoKG1SZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAobVJlY2VpdmVyLmdldFBhaXJGaXJlZEZsYWdzKCkgJiBwYWlyTWFzaykgPT0gcGFpck1hc2spIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgicGFpcigpIGNvbXBsZXRlZCBpbiAlZCBtczogZGV2aWNlPSVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzKSwgZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICBpbnQgcGFpckZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0UGFpckZpcmVkRmxhZ3MoKTsKLSAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoInBhaXIoKSB0aW1lb3V0OiBzdGF0ZT0lZCAoZXhwZWN0ZWQgJWQpLCBmbGFncz0weCV4IChleHBlY3RlZCAweCV4KSwgIgotICAgICAgICAgICAgICAgICsgInBhaXJGbGFncz0weCV4IChleHBlY3RlZCAweCV4KSIsIHN0YXRlLCBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQsIGZpcmVkRmxhZ3MsCi0gICAgICAgICAgICAgICAgbWFzaywgcGFpckZpcmVkRmxhZ3MsIHBhaXJNYXNrKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdW5wYWlyKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpbnQgbWFzayA9IFBBSVJfU1RBVEVfRkxBRzsKLSAgICAgICAgaW50IHBhaXJNYXNrID0gUEFJUl9TVEFURV9OT05FOwotICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBmYWlsKCJ1bnBhaXIoKSBibHVldG9vdGggbm90IGVuYWJsZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzdGF0ZSA9IGRldmljZS5nZXRCb25kU3RhdGUoKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRldmljZS5yZW1vdmVCb25kKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ESU5HOgotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGV2aWNlLnJlbW92ZUJvbmQoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX05PTkU6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBmYWlsKCJ1bnBhaXIoKSBpbnZhbGlkIHN0YXRlOiBzdGF0ZT0iICsgc3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkZXZpY2UucmVtb3ZlQm9uZCgpKTsKLQotICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IFVOUEFJUl9USU1FT1VUKSB7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlLmdldEJvbmRTdGF0ZSgpID09IEJsdWV0b290aERldmljZS5CT05EX05PTkUpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBpZiAoKG1SZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAobVJlY2VpdmVyLmdldFBhaXJGaXJlZEZsYWdzKCkgJiBwYWlyTWFzaykgPT0gcGFpck1hc2spIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgidW5wYWlyKCkgY29tcGxldGVkIGluICVkIG1zOiBkZXZpY2U9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMpLCBkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgaW50IHBhaXJGaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldFBhaXJGaXJlZEZsYWdzKCk7Ci0gICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJ1bnBhaXIoKSB0aW1lb3V0OiBzdGF0ZT0lZCAoZXhwZWN0ZWQgJWQpLCBmbGFncz0weCV4IChleHBlY3RlZCAweCV4KSwgIgotICAgICAgICAgICAgICAgICsgInBhaXJGbGFncz0weCV4IChleHBlY3RlZCAweCV4KSIsIHN0YXRlLCBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQsIGZpcmVkRmxhZ3MsCi0gICAgICAgICAgICAgICAgbWFzaywgcGFpckZpcmVkRmxhZ3MsIHBhaXJNYXNrKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29ubmVjdEEyZHAoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGludCBtYXNrID0gUFJPRklMRV9BMkRQX0ZMQUc7Ci0gICAgICAgIGludCBhMmRwTWFzazEgPSBBMkRQX1NUQVRFX0NPTk5FQ1RJTkcgfCBBMkRQX1NUQVRFX0NPTk5FQ1RFRCB8IEEyRFBfU1RBVEVfUExBWUlORzsKLSAgICAgICAgaW50IGEyZHBNYXNrMiA9IGEyZHBNYXNrMSBeIEEyRFBfU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICBpbnQgYTJkcE1hc2szID0gYTJkcE1hc2sxIF4gQTJEUF9TVEFURV9QTEFZSU5HOwotICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBmYWlsKCJjb25uZWN0QTJkcCgpIGJsdWV0b290aCBub3QgZW5hYmxlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICBmYWlsKCJjb25uZWN0QTJkcCgpIGRldmljZSBub3QgcGFpcmVkOiBkZXZpY2U9IiArIGRldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc3RhdGUgPSBtQTJkcC5nZXRTaW5rU3RhdGUoZGV2aWNlKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUEyZHAuaXNTaW5rQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNUSU5HOgotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShtQTJkcC5pc1NpbmtDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQTJkcC5jb25uZWN0U2luayhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG1BMmRwLmlzU2lua0Nvbm5lY3RlZChkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICAvLyBEb24ndCBjaGVjayBmb3IgcmVjZWl2ZWQgaW50ZW50cyBzaW5jZSB3ZSBtaWdodCBoYXZlIG1pc3NlZCB0aGVtLgotICAgICAgICAgICAgICAgIG1hc2sgPSBhMmRwTWFzazEgPSBhMmRwTWFzazIgPSBhMmRwTWFzazMgPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBmYWlsKCJjb25uZWN0QTJkcCgpIGludmFsaWQgc3RhdGU6IHN0YXRlPSIgKyBzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IENPTk5FQ1RfQTJEUF9USU1FT1VUKSB7Ci0gICAgICAgICAgICBzdGF0ZSA9IG1BMmRwLmdldFNpbmtTdGF0ZShkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVEVEIHx8IHN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORykgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUEyZHAuaXNTaW5rQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgU1RBVEVfQ09OTkVDVElORyBhbmQgKFNUQVRFX0NPTk5FQ1RFRCBvciBTVEFURV9QTEFZSU5HKSBpbnRlbnRzCi0gICAgICAgICAgICAgICAgLy8gaGF2ZSBmaXJlZCBpZiB3ZSBhcmUgY2hlY2tpbmcgaWYgaW50ZW50cyBzaG91bGQgYmUgZmlyZWQuCi0gICAgICAgICAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICAgICAgICAgIGludCBhMmRwRmlyZWRGbGFncyA9IG1SZWNlaXZlci5nZXRBMmRwRmlyZWRGbGFncygpOwotICAgICAgICAgICAgICAgIGlmICgobVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2sKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICgoYTJkcEZpcmVkRmxhZ3MgJiBhMmRwTWFzazEpID09IGEyZHBNYXNrMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoYTJkcEZpcmVkRmxhZ3MgJiBhMmRwTWFzazIpID09IGEyZHBNYXNrMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoYTJkcEZpcmVkRmxhZ3MgJiBhMmRwTWFzazMpID09IGEyZHBNYXNrMykpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCJjb25uZWN0QTJkcCgpIGNvbXBsZXRlZCBpbiAlZCBtczogZGV2aWNlPSVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzKSwgZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICBpbnQgYTJkcEZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0QTJkcEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoImNvbm5lY3RBMmRwKCkgdGltZW91dDogc3RhdGU9JWQgKGV4cGVjdGVkICVkIG9yICVkKSwgIgotICAgICAgICAgICAgICAgICsgImZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpLCBhMmRwRmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCBvciAweCV4IG9yIDB4JXgpIiwKLSAgICAgICAgICAgICAgICBzdGF0ZSwgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNURUQsIEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORywgZmlyZWRGbGFncywKLSAgICAgICAgICAgICAgICBtYXNrLCBhMmRwRmlyZWRGbGFncywgYTJkcE1hc2sxLCBhMmRwTWFzazIsIGEyZHBNYXNrMykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3RBMmRwKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpbnQgbWFzayA9IFBST0ZJTEVfQTJEUF9GTEFHOwotICAgICAgICBpbnQgYTJkcE1hc2sgPSBBMkRQX1NUQVRFX0RJU0NPTk5FQ1RJTkcgfCBBMkRQX1NUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotCi0gICAgICAgIGlmICghYWRhcHRlci5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZmFpbCgiZGlzY29ubmVjdEEyZHAoKSBibHVldG9vdGggbm90IGVuYWJsZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgewotICAgICAgICAgICAgZmFpbCgiZGlzY29ubmVjdEEyZHAoKSBkZXZpY2Ugbm90IHBhaXJlZDogZGV2aWNlPSIgKyBkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHN0YXRlID0gbUEyZHAuZ2V0U2lua1N0YXRlKGRldmljZSk7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUEyZHAuaXNTaW5rQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORzoKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1BMmRwLmlzU2lua0Nvbm5lY3RlZChkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1BMmRwLmRpc2Nvbm5lY3RTaW5rKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUEyZHAuaXNTaW5rQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUEyZHAuZGlzY29ubmVjdFNpbmsoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShtQTJkcC5pc1NpbmtDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgY2hlY2sgZm9yIHJlY2VpdmVkIGludGVudHMgc2luY2Ugd2UgbWlnaHQgaGF2ZSBtaXNzZWQgdGhlbS4KLSAgICAgICAgICAgICAgICBtYXNrID0gYTJkcE1hc2sgPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBmYWlsKCJkaXNjb25uZWN0QTJkcCgpIGludmFsaWQgc3RhdGU6IHN0YXRlPSIgKyBzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IERJU0NPTk5FQ1RfQTJEUF9USU1FT1VUKSB7Ci0gICAgICAgICAgICBzdGF0ZSA9IG1BMmRwLmdldFNpbmtTdGF0ZShkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUEyZHAuaXNTaW5rQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGlmICgobVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2sKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChtUmVjZWl2ZXIuZ2V0QTJkcEZpcmVkRmxhZ3MoKSAmIGEyZHBNYXNrKSA9PSBhMmRwTWFzaykgewotICAgICAgICAgICAgICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoImRpc2Nvbm5lY3RBMmRwKCkgY29tcGxldGVkIGluICVkIG1zOiBkZXZpY2U9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMpLCBkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmlyZWRGbGFncyA9IG1SZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIGludCBhMmRwRmlyZWRGbGFncyA9IG1SZWNlaXZlci5nZXRBMmRwRmlyZWRGbGFncygpOwotICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiZGlzY29ubmVjdEEyZHAoKSB0aW1lb3V0OiBzdGF0ZT0lZCAoZXhwZWN0ZWQgJWQpLCAiCi0gICAgICAgICAgICAgICAgKyAiZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCksIGEyZHBGbGFncz0weCV4IChleHBlY3RlZCAweCV4KSIsIHN0YXRlLAotICAgICAgICAgICAgICAgIEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVEVELCBmaXJlZEZsYWdzLCBtYXNrLCBhMmRwRmlyZWRGbGFncywgYTJkcE1hc2spKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb25uZWN0SGVhZHNldChCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaW50IG1hc2sgPSBQUk9GSUxFX0hFQURTRVRfRkxBRzsKLSAgICAgICAgaW50IGhlYWRzZXRNYXNrID0gSEVBRFNFVF9TVEFURV9DT05ORUNUSU5HIHwgSEVBRFNFVF9TVEFURV9DT05ORUNURUQ7Ci0gICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLQotICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGZhaWwoImNvbm5lY3RIZWFkc2V0KCkgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpIHsKLSAgICAgICAgICAgIGZhaWwoImNvbm5lY3RIZWFkc2V0KCkgZGV2aWNlIG5vdCBwYWlyZWQ6IGRldmljZT0iICsgZGV2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICghbUhlYWRzZXRTZXJ2aWNlTGlzdGVuZXIuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzdGF0ZSA9IG1IZWFkc2V0LmdldFN0YXRlKGRldmljZSk7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtSGVhZHNldC5pc0Nvbm5lY3RlZChkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG1IZWFkc2V0LmlzQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIG1IZWFkc2V0LmNvbm5lY3RIZWFkc2V0KGRldmljZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShtSGVhZHNldC5pc0Nvbm5lY3RlZChkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICAvLyBEb24ndCBjaGVjayBmb3IgcmVjZWl2ZWQgaW50ZW50cyBzaW5jZSB3ZSBtaWdodCBoYXZlIG1pc3NlZCB0aGVtLgotICAgICAgICAgICAgICAgIG1hc2sgPSBoZWFkc2V0TWFzayA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRVJST1I6Ci0gICAgICAgICAgICAgICAgZmFpbCgiY29ubmVjdEhlYWRzZXQoKSBlcnJvciBzdGF0ZSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBmYWlsKCJjb25uZWN0SGVhZHNldCgpIGludmFsaWQgc3RhdGU6IHN0YXRlPSIgKyBzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IENPTk5FQ1RfSEVBRFNFVF9USU1FT1VUKSB7Ci0gICAgICAgICAgICBzdGF0ZSA9IG1IZWFkc2V0LmdldFN0YXRlKGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1IZWFkc2V0LmlzQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGlmICgobVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2sKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChtUmVjZWl2ZXIuZ2V0SGVhZHNldEZpcmVkRmxhZ3MoKSAmIGhlYWRzZXRNYXNrKSA9PSBoZWFkc2V0TWFzaykgewotICAgICAgICAgICAgICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoImNvbm5lY3RIZWFkc2V0KCkgY29tcGxldGVkIGluICVkIG1zOiBkZXZpY2U9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMpLCBkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmlyZWRGbGFncyA9IG1SZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIGludCBoZWFkc2V0RmlyZWRGbGFncyA9IG1SZWNlaXZlci5nZXRIZWFkc2V0RmlyZWRGbGFncygpOwotICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiY29ubmVjdEhlYWRzZXQoKSB0aW1lb3V0OiBzdGF0ZT0lZCAoZXhwZWN0ZWQgJWQpLCAiCi0gICAgICAgICAgICAgICAgKyAiZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCksIGhlYWRzZXRGbGFncz0weCVzIChleHBlY3RlZCAweCV4KSIsIHN0YXRlLAotICAgICAgICAgICAgICAgIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQ09OTkVDVEVELCBmaXJlZEZsYWdzLCBtYXNrLCBoZWFkc2V0RmlyZWRGbGFncywKLSAgICAgICAgICAgICAgICBoZWFkc2V0TWFzaykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3RIZWFkc2V0KEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpbnQgbWFzayA9IFBST0ZJTEVfSEVBRFNFVF9GTEFHOwotICAgICAgICBpbnQgaGVhZHNldE1hc2sgPSBIRUFEU0VUX1NUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotCi0gICAgICAgIGlmICghYWRhcHRlci5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZmFpbCgiZGlzY29ubmVjdEhlYWRzZXQoKSBibHVldG9vdGggbm90IGVuYWJsZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgewotICAgICAgICAgICAgZmFpbCgiZGlzY29ubmVjdEhlYWRzZXQoKSBkZXZpY2Ugbm90IHBhaXJlZDogZGV2aWNlPSIgKyBkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKCFtSGVhZHNldFNlcnZpY2VMaXN0ZW5lci5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHN0YXRlID0gbUhlYWRzZXQuZ2V0U3RhdGUoZGV2aWNlKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICBtSGVhZHNldC5kaXNjb25uZWN0SGVhZHNldChkZXZpY2UpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgbUhlYWRzZXQuZGlzY29ubmVjdEhlYWRzZXQoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0VSUk9SOgotICAgICAgICAgICAgICAgIGZhaWwoImRpc2Nvbm5lY3RIZWFkc2V0KCkgZXJyb3Igc3RhdGUiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgZmFpbCgiZGlzY29ubmVjdEhlYWRzZXQoKSBpbnZhbGlkIHN0YXRlOiBzdGF0ZT0iICsgc3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9uZyBzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMgPCBESVNDT05ORUNUX0hFQURTRVRfVElNRU9VVCkgewotICAgICAgICAgICAgc3RhdGUgPSBtSGVhZHNldC5nZXRTdGF0ZShkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUhlYWRzZXQuaXNDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgaWYgKChtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzawotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1SZWNlaXZlci5nZXRIZWFkc2V0RmlyZWRGbGFncygpICYgaGVhZHNldE1hc2spID09IGhlYWRzZXRNYXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiZGlzY29ubmVjdEhlYWRzZXQoKSBjb21wbGV0ZWQgaW4gJWQgbXM6IGRldmljZT0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyksIGRldmljZSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgaW50IGhlYWRzZXRGaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldEhlYWRzZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJkaXNjb25uZWN0SGVhZHNldCgpIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksICIKLSAgICAgICAgICAgICAgICArICJmbGFncz0weCV4IChleHBlY3RlZCAweCV4KSwgaGVhZHNldEZsYWdzPTB4JXMgKGV4cGVjdGVkIDB4JXgpIiwgc3RhdGUsCi0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQsIGZpcmVkRmxhZ3MsIG1hc2ssIGhlYWRzZXRGaXJlZEZsYWdzLAotICAgICAgICAgICAgICAgIGhlYWRzZXRNYXNrKSk7Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgd3JpdGVPdXRwdXQoU3RyaW5nIHMpIHsKICAgICAgICAgTG9nLmkobVRhZywgcyk7CiAgICAgICAgIGlmIChtT3V0cHV0V3JpdGVyID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvTWVtb3J5RmlsZVByb3ZpZGVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L01lbW9yeUZpbGVQcm92aWRlci5qYXZhCmluZGV4IGM0YmM3NjcuLjczNTMwZDcgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvTWVtb3J5RmlsZVByb3ZpZGVyLmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9NZW1vcnlGaWxlUHJvdmlkZXIuamF2YQpAQCAtMTYsMTYgKzE2LDExIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5jb250ZW50OwogCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuVXJpTWF0Y2hlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU9wZW5IZWxwZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuTWVtb3J5RmlsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKQEAgLTEzNCw2NCArMTI5LDM0IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFzc2V0RmlsZURlc2NyaXB0b3Igb3BlbkFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbW9kZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9wZW5GaWxlKFVyaSB1cmwsIFN0cmluZyBtb2RlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgaW50IG1hdGNoID0gc1VSTE1hdGNoZXIubWF0Y2godXJsKTsKICAgICAgICAgc3dpdGNoIChtYXRjaCkgewogICAgICAgICAgICAgY2FzZSBEQVRBX0lEX0JMT0I6CiAgICAgICAgICAgICAgICAgU3RyaW5nIHNxbCA9ICJTRUxFQ1QgX2Jsb2IgRlJPTSBkYXRhIFdIRVJFIF9pZD0iICsgdXJsLmdldFBhdGhTZWdtZW50cygpLmdldCgxKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmxvYkNvbHVtbkFzQXNzZXRGaWxlKHVybCwgbW9kZSwgc3FsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmxvYkNvbHVtbkFzRmlsZSh1cmwsIG1vZGUsIHNxbCk7CiAgICAgICAgICAgICBjYXNlIEhVR0U6CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgTWVtb3J5RmlsZSBtZW1vcnlGaWxlID0gbmV3IE1lbW9yeUZpbGUobnVsbCwgNTAwMDAwMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbW9yeUZpbGUud3JpdGVCeXRlcyhURVNUX0JMT0IsIDAsIDEwMDAwMDAsIFRFU1RfQkxPQi5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBtZW1vcnlGaWxlLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFzc2V0RmlsZURlc2NyaXB0b3IuZnJvbU1lbW9yeUZpbGUobWVtb3J5RmlsZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQYXJjZWxGaWxlRGVzY3JpcHRvci5mcm9tRGF0YShURVNUX0JMT0IsIG51bGwpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkVycm9yIHJlYWRpbmcgIiArIHVybCArICI6IiArIGV4LnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgRklMRToKICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBnZXRDb250ZXh0KCkuZ2V0RmlsZVN0cmVhbVBhdGgoREFUQV9GSUxFKTsKLSAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvci5vcGVuKGZpbGUsIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfUkVBRF9PTkxZKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFzc2V0RmlsZURlc2NyaXB0b3IoZmQsIDAsIEFzc2V0RmlsZURlc2NyaXB0b3IuVU5LTk9XTl9MRU5HVEgpOworICAgICAgICAgICAgICAgIHJldHVybiBQYXJjZWxGaWxlRGVzY3JpcHRvci5vcGVuKGZpbGUsIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfUkVBRF9PTkxZKTsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiTm8gZmlsZXMgc3VwcG9ydGVkIGJ5IHByb3ZpZGVyIGF0ICIgKyB1cmwpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBBc3NldEZpbGVEZXNjcmlwdG9yIGdldEJsb2JDb2x1bW5Bc0Fzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbW9kZSwgU3RyaW5nIHNxbCkKKyAgICBwcml2YXRlIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGdldEJsb2JDb2x1bW5Bc0ZpbGUoVXJpIHVybCwgU3RyaW5nIG1vZGUsIFN0cmluZyBzcWwpCiAgICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCEiciIuZXF1YWxzKG1vZGUpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJNb2RlICIgKyBtb2RlICsgIiBub3Qgc3VwcG9ydGVkIGZvciAiICsgdXJsKTsKICAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtT3BlbkhlbHBlci5nZXRSZWFkYWJsZURhdGFiYXNlKCk7Ci0gICAgICAgICAgICBNZW1vcnlGaWxlIGZpbGUgPSBzaW1wbGVRdWVyeUZvckJsb2JNZW1vcnlGaWxlKGRiLCBzcWwpOwotICAgICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiTm8gc3VjaCBlbnRyeTogIiArIHVybCk7Ci0gICAgICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yIGFmZCA9IEFzc2V0RmlsZURlc2NyaXB0b3IuZnJvbU1lbW9yeUZpbGUoZmlsZSk7Ci0gICAgICAgICAgICBmaWxlLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgICAgIC8vIG5lZWQgdG8gZHVwIGFuZCB0aGVuIGNsb3NlPyBvcGVuRmlsZUhlbHBlcigpIGRvZXNuJ3QgZG8gdGhhdCB0aG91Z2gKLSAgICAgICAgICAgIHJldHVybiBhZmQ7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJFcnJvciByZWFkaW5nICIgKyB1cmwgKyAiOiIgKyBleC50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KIAotICAgIHByaXZhdGUgTWVtb3J5RmlsZSBzaW1wbGVRdWVyeUZvckJsb2JNZW1vcnlGaWxlKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBDdXJzb3IgY3Vyc29yID0gZGIucmF3UXVlcnkoc3FsLCBudWxsKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IGN1cnNvci5nZXRCbG9iKDApOwotICAgICAgICAgICAgTWVtb3J5RmlsZSBmaWxlID0gbmV3IE1lbW9yeUZpbGUobnVsbCwgYnl0ZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIGZpbGUud3JpdGVCeXRlcyhieXRlcywgMCwgMCwgYnl0ZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIHJldHVybiBmaWxlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtT3BlbkhlbHBlci5nZXRSZWFkYWJsZURhdGFiYXNlKCk7CisgICAgICAgIHJldHVybiBEYXRhYmFzZVV0aWxzLmJsb2JGaWxlRGVzY3JpcHRvckZvclF1ZXJ5KGRiLCBzcWwsIG51bGwpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9NZW1vcnlGaWxlUHJvdmlkZXJUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L01lbW9yeUZpbGVQcm92aWRlclRlc3QuamF2YQppbmRleCA2MmI0ZTdlLi5iYmU3YzEwIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L01lbW9yeUZpbGVQcm92aWRlclRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L01lbW9yeUZpbGVQcm92aWRlclRlc3QuamF2YQpAQCAtNTYsNyArNTYsNiBAQAogICAgICAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiY29udGVudDovL2FuZHJvaWQuY29udGVudC5NZW1vcnlGaWxlUHJvdmlkZXIvaHVnZSIpOwogICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSByZXNvbHZlci5vcGVuSW5wdXRTdHJlYW0odXJpKTsKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkZhaWxlZCB0byBvcGVuIHN0cmVhbSBudW1iZXIgIiArIGksIGluKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxMDAwMDAwLCBpbi5za2lwKDEwMDAwMDApKTsKICAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtNZW1vcnlGaWxlUHJvdmlkZXIuVEVTVF9CTE9CLmxlbmd0aF07CiAgICAgICAgICAgICBpbnQgY291bnQgPSBpbi5yZWFkKGJ1Zik7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYnVmLmxlbmd0aCwgY291bnQpOwpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9TeW5jUXVldWVUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L1N5bmNRdWV1ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRhNTlkMS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L1N5bmNRdWV1ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7Ci0KLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudGVzdC5SZW5hbWluZ0RlbGVnYXRpbmdDb250ZXh0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZXh0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci0KLXB1YmxpYyBjbGFzcyBTeW5jUXVldWVUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBY2NvdW50IEFDQ09VTlQxID0gbmV3IEFjY291bnQoInRlc3QuYWNjb3VudDEiLCAidGVzdC50eXBlMSIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFjY291bnQgQUNDT1VOVDIgPSBuZXcgQWNjb3VudCgidGVzdC5hY2NvdW50MiIsICJ0ZXN0LnR5cGUyIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUklUWTEgPSAidGVzdC5hdXRob3JpdHkxIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SSVRZMiA9ICJ0ZXN0LmF1dGhvcml0eTIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JJVFkzID0gInRlc3QuYXV0aG9yaXR5MyI7Ci0KLSAgICBwcml2YXRlIFN5bmNTdG9yYWdlRW5naW5lIG1TZXR0aW5nczsKLSAgICBwcml2YXRlIFN5bmNRdWV1ZSBtU3luY1F1ZXVlOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgTW9ja0NvbnRlbnRSZXNvbHZlciBtb2NrUmVzb2x2ZXIgPSBuZXcgTW9ja0NvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICBtU2V0dGluZ3MgPSBTeW5jU3RvcmFnZUVuZ2luZS5uZXdUZXN0SW5zdGFuY2UobmV3IFRlc3RDb250ZXh0KG1vY2tSZXNvbHZlciwgZ2V0Q29udGV4dCgpKSk7Ci0gICAgICAgIG1TeW5jUXVldWUgPSBuZXcgU3luY1F1ZXVlKG1TZXR0aW5ncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN5bmNRdWV1ZU9yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN5bmNPcGVyYXRpb24gb3AxID0gbmV3IFN5bmNPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgQUNDT1VOVDEsIFN5bmNTdG9yYWdlRW5naW5lLlNPVVJDRV9VU0VSLCBBVVRIT1JJVFkxLCBuZXdUZXN0QnVuZGxlKCIxIiksIDApOwotICAgICAgICBmaW5hbCBTeW5jT3BlcmF0aW9uIG9wMiA9IG5ldyBTeW5jT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgIEFDQ09VTlQyLCBTeW5jU3RvcmFnZUVuZ2luZS5TT1VSQ0VfVVNFUiwgQVVUSE9SSVRZMiwgbmV3VGVzdEJ1bmRsZSgiMiIpLCAxMDApOwotICAgICAgICBmaW5hbCBTeW5jT3BlcmF0aW9uIG9wMyA9IG5ldyBTeW5jT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgIEFDQ09VTlQxLCBTeW5jU3RvcmFnZUVuZ2luZS5TT1VSQ0VfVVNFUiwgQVVUSE9SSVRZMSwgbmV3VGVzdEJ1bmRsZSgiMyIpLCAxNTApOwotICAgICAgICBmaW5hbCBTeW5jT3BlcmF0aW9uIG9wNCA9IG5ldyBTeW5jT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgIEFDQ09VTlQyLCBTeW5jU3RvcmFnZUVuZ2luZS5TT1VSQ0VfVVNFUiwgQVVUSE9SSVRZMiwgbmV3VGVzdEJ1bmRsZSgiNCIpLCA2MCk7Ci0gICAgICAgIGZpbmFsIFN5bmNPcGVyYXRpb24gb3A1ID0gbmV3IFN5bmNPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgQUNDT1VOVDEsIFN5bmNTdG9yYWdlRW5naW5lLlNPVVJDRV9VU0VSLCBBVVRIT1JJVFkxLCBuZXdUZXN0QnVuZGxlKCI1IiksIDgwKTsKLSAgICAgICAgZmluYWwgU3luY09wZXJhdGlvbiBvcDYgPSBuZXcgU3luY09wZXJhdGlvbigKLSAgICAgICAgICAgICAgICBBQ0NPVU5UMiwgU3luY1N0b3JhZ2VFbmdpbmUuU09VUkNFX1VTRVIsIEFVVEhPUklUWTIsIG5ld1Rlc3RCdW5kbGUoIjYiKSwgMCk7Ci0gICAgICAgIG9wNi5leHBlZGl0ZWQgPSB0cnVlOwotCi0gICAgICAgIG1TeW5jUXVldWUuYWRkKG9wMSk7Ci0gICAgICAgIG1TeW5jUXVldWUuYWRkKG9wMik7Ci0gICAgICAgIG1TeW5jUXVldWUuYWRkKG9wMyk7Ci0gICAgICAgIG1TeW5jUXVldWUuYWRkKG9wNCk7Ci0gICAgICAgIG1TeW5jUXVldWUuYWRkKG9wNSk7Ci0gICAgICAgIG1TeW5jUXVldWUuYWRkKG9wNik7Ci0KLSAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSArIDIwMDsKLQotICAgICAgICBhc3NlcnRFcXVhbHMob3A2LCBtU3luY1F1ZXVlLm5leHRSZWFkeVRvUnVuKG5vdykuZmlyc3QpOwotICAgICAgICBtU3luY1F1ZXVlLnJlbW92ZShvcDYpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhvcDEsIG1TeW5jUXVldWUubmV4dFJlYWR5VG9SdW4obm93KS5maXJzdCk7Ci0gICAgICAgIG1TeW5jUXVldWUucmVtb3ZlKG9wMSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wNCwgbVN5bmNRdWV1ZS5uZXh0UmVhZHlUb1J1bihub3cpLmZpcnN0KTsKLSAgICAgICAgbVN5bmNRdWV1ZS5yZW1vdmUob3A0KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMob3A1LCBtU3luY1F1ZXVlLm5leHRSZWFkeVRvUnVuKG5vdykuZmlyc3QpOwotICAgICAgICBtU3luY1F1ZXVlLnJlbW92ZShvcDUpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhvcDIsIG1TeW5jUXVldWUubmV4dFJlYWR5VG9SdW4obm93KS5maXJzdCk7Ci0gICAgICAgIG1TeW5jUXVldWUucmVtb3ZlKG9wMik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wMywgbVN5bmNRdWV1ZS5uZXh0UmVhZHlUb1J1bihub3cpLmZpcnN0KTsKLSAgICAgICAgbVN5bmNRdWV1ZS5yZW1vdmUob3AzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3JkZXJXaXRoQmFja29mZigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTeW5jT3BlcmF0aW9uIG9wMSA9IG5ldyBTeW5jT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgIEFDQ09VTlQxLCBTeW5jU3RvcmFnZUVuZ2luZS5TT1VSQ0VfVVNFUiwgQVVUSE9SSVRZMSwgbmV3VGVzdEJ1bmRsZSgiMSIpLCAwKTsKLSAgICAgICAgZmluYWwgU3luY09wZXJhdGlvbiBvcDIgPSBuZXcgU3luY09wZXJhdGlvbigKLSAgICAgICAgICAgICAgICBBQ0NPVU5UMiwgU3luY1N0b3JhZ2VFbmdpbmUuU09VUkNFX1VTRVIsIEFVVEhPUklUWTIsIG5ld1Rlc3RCdW5kbGUoIjIiKSwgMTAwKTsKLSAgICAgICAgZmluYWwgU3luY09wZXJhdGlvbiBvcDMgPSBuZXcgU3luY09wZXJhdGlvbigKLSAgICAgICAgICAgICAgICBBQ0NPVU5UMSwgU3luY1N0b3JhZ2VFbmdpbmUuU09VUkNFX1VTRVIsIEFVVEhPUklUWTEsIG5ld1Rlc3RCdW5kbGUoIjMiKSwgMTUwKTsKLSAgICAgICAgZmluYWwgU3luY09wZXJhdGlvbiBvcDQgPSBuZXcgU3luY09wZXJhdGlvbigKLSAgICAgICAgICAgICAgICBBQ0NPVU5UMiwgU3luY1N0b3JhZ2VFbmdpbmUuU09VUkNFX1VTRVIsIEFVVEhPUklUWTMsIG5ld1Rlc3RCdW5kbGUoIjQiKSwgNjApOwotICAgICAgICBmaW5hbCBTeW5jT3BlcmF0aW9uIG9wNSA9IG5ldyBTeW5jT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgIEFDQ09VTlQxLCBTeW5jU3RvcmFnZUVuZ2luZS5TT1VSQ0VfVVNFUiwgQVVUSE9SSVRZMSwgbmV3VGVzdEJ1bmRsZSgiNSIpLCA4MCk7Ci0gICAgICAgIGZpbmFsIFN5bmNPcGVyYXRpb24gb3A2ID0gbmV3IFN5bmNPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgQUNDT1VOVDIsIFN5bmNTdG9yYWdlRW5naW5lLlNPVVJDRV9VU0VSLCBBVVRIT1JJVFkyLCBuZXdUZXN0QnVuZGxlKCI2IiksIDApOwotICAgICAgICBvcDYuZXhwZWRpdGVkID0gdHJ1ZTsKLQotICAgICAgICBtU3luY1F1ZXVlLmFkZChvcDEpOwotICAgICAgICBtU3luY1F1ZXVlLmFkZChvcDIpOwotICAgICAgICBtU3luY1F1ZXVlLmFkZChvcDMpOwotICAgICAgICBtU3luY1F1ZXVlLmFkZChvcDQpOwotICAgICAgICBtU3luY1F1ZXVlLmFkZChvcDUpOwotICAgICAgICBtU3luY1F1ZXVlLmFkZChvcDYpOwotCi0gICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgKyAyMDA7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wNiwgbVN5bmNRdWV1ZS5uZXh0UmVhZHlUb1J1bihub3cpLmZpcnN0KTsKLSAgICAgICAgbVN5bmNRdWV1ZS5yZW1vdmUob3A2KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMob3AxLCBtU3luY1F1ZXVlLm5leHRSZWFkeVRvUnVuKG5vdykuZmlyc3QpOwotICAgICAgICBtU3luY1F1ZXVlLnJlbW92ZShvcDEpOwotCi0gICAgICAgIG1TZXR0aW5ncy5zZXRCYWNrb2ZmKEFDQ09VTlQyLCAgQVVUSE9SSVRZMywgbm93ICsgMjAwLCA1KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wNSwgbVN5bmNRdWV1ZS5uZXh0UmVhZHlUb1J1bihub3cpLmZpcnN0KTsKLQotICAgICAgICBtU2V0dGluZ3Muc2V0QmFja29mZihBQ0NPVU5UMiwgIEFVVEhPUklUWTMsIFN5bmNTdG9yYWdlRW5naW5lLk5PVF9JTl9CQUNLT0ZGX01PREUsIDApOwotICAgICAgICBhc3NlcnRFcXVhbHMob3A0LCBtU3luY1F1ZXVlLm5leHRSZWFkeVRvUnVuKG5vdykuZmlyc3QpOwotCi0gICAgICAgIG1TZXR0aW5ncy5zZXREZWxheVVudGlsVGltZShBQ0NPVU5UMiwgIEFVVEhPUklUWTMsIG5vdyArIDIwMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcDUsIG1TeW5jUXVldWUubmV4dFJlYWR5VG9SdW4obm93KS5maXJzdCk7Ci0KLSAgICAgICAgbVNldHRpbmdzLnNldERlbGF5VW50aWxUaW1lKEFDQ09VTlQyLCAgQVVUSE9SSVRZMywgMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcDQsIG1TeW5jUXVldWUubmV4dFJlYWR5VG9SdW4obm93KS5maXJzdCk7Ci0gICAgICAgIG1TeW5jUXVldWUucmVtb3ZlKG9wNCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wNSwgbVN5bmNRdWV1ZS5uZXh0UmVhZHlUb1J1bihub3cpLmZpcnN0KTsKLSAgICAgICAgbVN5bmNRdWV1ZS5yZW1vdmUob3A1KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMob3AyLCBtU3luY1F1ZXVlLm5leHRSZWFkeVRvUnVuKG5vdykuZmlyc3QpOwotICAgICAgICBtU3luY1F1ZXVlLnJlbW92ZShvcDIpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhvcDMsIG1TeW5jUXVldWUubmV4dFJlYWR5VG9SdW4obm93KS5maXJzdCk7Ci0gICAgICAgIG1TeW5jUXVldWUucmVtb3ZlKG9wMyk7Ci0gICAgfQotCi0gICAgQnVuZGxlIG5ld1Rlc3RCdW5kbGUoU3RyaW5nIHZhbCkgewotICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBidW5kbGUucHV0U3RyaW5nKCJ0ZXN0IiwgdmFsKTsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgVGVzdENvbnRleHQgZXh0ZW5kcyBDb250ZXh0V3JhcHBlciB7Ci0gICAgICAgIENvbnRlbnRSZXNvbHZlciBtUmVzb2x2ZXI7Ci0KLSAgICAgICAgcHVibGljIFRlc3RDb250ZXh0KENvbnRlbnRSZXNvbHZlciByZXNvbHZlciwgQ29udGV4dCByZWFsQ29udGV4dCkgewotICAgICAgICAgICAgc3VwZXIobmV3IFJlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHQobmV3IE1vY2tDb250ZXh0KCksIHJlYWxDb250ZXh0LCAidGVzdC4iKSk7Ci0gICAgICAgICAgICBtUmVzb2x2ZXIgPSByZXNvbHZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBlbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oU3RyaW5nIHBlcm1pc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIENvbnRlbnRSZXNvbHZlciBnZXRDb250ZW50UmVzb2x2ZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJlc29sdmVyOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VDdXJzb3JUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUN1cnNvclRlc3QuamF2YQppbmRleCBmYjVhMzZmLi4wNzMzMjI5IDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUN1cnNvclRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUN1cnNvclRlc3QuamF2YQpAQCAtMzMsNyArMzMsNiBAQAogaW1wb3J0IGFuZHJvaWQudGVzdC5QZXJmb3JtYW5jZVRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU3VwcHJlc3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIApAQCAtNDEsOCArNDAsNiBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQogcHVibGljIGNsYXNzIERhdGFiYXNlQ3Vyc29yVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSBpbXBsZW1lbnRzIFBlcmZvcm1hbmNlVGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNTdHJpbmcxID0gInRoaXMgaXMgYSB0ZXN0IjsKQEAgLTkyLDQzICs4OSw2IEBACiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Vyc29yVXBkYXRlKCkgewotICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgKLSAgICAgICAgICAgICJDUkVBVEUgVEFCTEUgdGVzdCAoX2lkIElOVEVHRVIgUFJJTUFSWSBLRVksIGQgSU5URUdFUiwgcyBJTlRFR0VSKTsiKTsKLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKLSAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgSU5UTyB0ZXN0IChkLCBzKSBWQUxVRVMgKCIgKyBpICsgCi0gICAgICAgICAgICAgICAgIiwiICsgaSUyICsgIik7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnF1ZXJ5KCJ0ZXN0IiwgbnVsbCwgInMgPSAwIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGludCBkQ29sID0gYy5nZXRDb2x1bW5JbmRleE9yVGhyb3coImQiKTsKLSAgICAgICAgaW50IHNDb2wgPSBjLmdldENvbHVtbkluZGV4T3JUaHJvdygicyIpOwotICAgICAgICAKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGMudXBkYXRlSW50KGRDb2wsIDMpKTsKLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBjb3VudCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKGMuY29tbWl0VXBkYXRlcygpKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoYy5yZXF1ZXJ5KCkpOwotICAgICAgICAKLSAgICAgICAgY291bnQgPSAwOwotICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCBjLmdldEludChkQ29sKSk7Ci0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIGNvdW50KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLm1vdmVUb0ZpcnN0KCkpOwotICAgICAgICBhc3NlcnRUcnVlKGMuZGVsZXRlUm93KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoOSwgYy5nZXRDb3VudCgpKTsKLSAgICAgICAgYy5jbG9zZSgpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RCbG9iKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGNyZWF0ZSB0YWJsZQogICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgKQEAgLTE2NCwyNCArMTI0LDcgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGJsb2IsIGNCbG9iKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhzLCBjLmdldFN0cmluZyhzQ29sKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygoZG91YmxlKWQsIGMuZ2V0RG91YmxlKGRDb2wpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKChsb25nKWwsIGMuZ2V0TG9uZyhsQ29sKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBuZXcgYnl0ZVtdCi0gICAgICAgIGJ5dGVbXSBuZXdibG9iID0gbmV3IGJ5dGVbMTAwMF07Ci0gICAgICAgIHZhbHVlID0gOTg7Ci0gICAgICAgIEFycmF5cy5maWxsKGJsb2IsIHZhbHVlKTsgICAgICAgIAotICAgICAgICAKLSAgICAgICAgYy51cGRhdGVCbG9iKGJDb2wsIG5ld2Jsb2IpOwotICAgICAgICBjQmxvYiA9ICBjLmdldEJsb2IoYkNvbCk7Ci0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXdibG9iLCBjQmxvYikpOwotICAgICAgICAKLSAgICAgICAgLy8gY29tbWl0Ci0gICAgICAgIGFzc2VydFRydWUoYy5jb21taXRVcGRhdGVzKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGMucmVxdWVyeSgpKTsKLSAgICAgICAgYy5tb3ZlVG9OZXh0KCk7Ci0gICAgICAgIGNCbG9iID0gIGMuZ2V0QmxvYihiQ29sKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ld2Jsb2IsIGNCbG9iKSk7ICAgICAgICAKLSAgICAgICAgYy5jbG9zZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoKGxvbmcpbCwgYy5nZXRMb25nKGxDb2wpKTsgICAgICAgIAogICAgIH0KICAgICAKICAgICBATWVkaXVtVGVzdApkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VFcnJvckhhbmRsZXJUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUVycm9ySGFuZGxlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGQyNWI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VFcnJvckhhbmRsZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBEYXRhYmFzZUVycm9ySGFuZGxlclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7CisgICAgcHJpdmF0ZSBGaWxlIG1EYXRhYmFzZUZpbGU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX05BTUUgPSAiZGF0YWJhc2VfdGVzdC5kYiI7CisgICAgcHJpdmF0ZSBGaWxlIGRiRGlyOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgZGJEaXIgPSBnZXRDb250ZXh0KCkuZ2V0RGlyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIENvbnRleHQuTU9ERV9QUklWQVRFKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZSA9IG5ldyBGaWxlKGRiRGlyLCBEQl9OQU1FKTsKKyAgICAgICAgaWYgKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZS5nZXRQYXRoKCksIG51bGwsCisgICAgICAgICAgICAgICAgbmV3IE15RGF0YWJhc2VDb3JydXB0aW9uSGFuZGxlcigpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGF0YWJhc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb0NvcnJ1cHRpb25DYXNlKCkgeworICAgICAgICBuZXcgTXlEYXRhYmFzZUNvcnJ1cHRpb25IYW5kbGVyKCkub25Db3JydXB0aW9uKG1EYXRhYmFzZSk7CisgICAgICAgIC8vIGRhdGFiYXNlIGZpbGUgc2hvdWxkIHN0aWxsIGV4aXN0CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlRmlsZS5leGlzdHMoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERhdGFiYXNlSXNDb3JydXB0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImNyZWF0ZSB0YWJsZSB0IChpIGludCk7Iik7CisgICAgICAgIC8vIHdyaXRlIGp1bmsgaW50byB0aGUgZGF0YWJhc2UgZmlsZQorICAgICAgICBCdWZmZXJlZFdyaXRlciB3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIobURhdGFiYXNlRmlsZS5nZXRQYXRoKCkpKTsKKyAgICAgICAgd3JpdGVyLndyaXRlKCJibGFoIik7CisgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpOworICAgICAgICAvLyBzaW5jZSB0aGUgZGF0YWJhc2UgZmlsZSBpcyBub3cgY29ycnVwdCwgZG9pbmcgYW55IHNxbCBvbiB0aGlzIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgLy8gc2hvdWxkIHRyaWdnZXIgY2FsbCB0byBNeURhdGFiYXNlQ29ycnVwdGlvbkhhbmRsZXIub25Db3JydXB0aW9uCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgic2VsZWN0ICogZnJvbSB0OyIpOworICAgICAgICAgICAgZmFpbCgiZXhwZWN0ZWQgZXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgICAgIC8vIGFmdGVyIGNvcnJ1cHRpb24gaGFuZGxlciBpcyBjYWxsZWQsIHRoZSBkYXRhYmFzZSBmaWxlIHNob3VsZCBiZSBmcmVlIG9mCisgICAgICAgIC8vIGRhdGFiYXNlIGNvcnJ1cHRpb24KKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2VGaWxlLmdldFBhdGgoKSwgbnVsbCwKKyAgICAgICAgICAgICAgICBuZXcgTXlEYXRhYmFzZUNvcnJ1cHRpb25IYW5kbGVyKCkpOworICAgICAgICBhc3NlcnRUcnVlKGRiLmlzRGF0YWJhc2VJbnRlZ3JpdHlPaygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBleGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gZGVtb25zdHJhdGUKKyAgICAgKiBkYXRhYmFzZSBjb3JydXB0aW9uIGhhbmRsZXIgd2hpY2ggY2hlY2tzIHRvIG1ha2Ugc3VyZSBkYXRhYmFzZSBpcyBpbmRlZWQKKyAgICAgKiBjb3JydXB0IGJlZm9yZSBkZWxldGluZyB0aGUgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgTXlEYXRhYmFzZUNvcnJ1cHRpb25IYW5kbGVyIGltcGxlbWVudHMgRGF0YWJhc2VFcnJvckhhbmRsZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNvcnJ1cHRpb24oU1FMaXRlRGF0YWJhc2UgZGJPYmopIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZGF0YWJhc2VPayA9IGRiT2JqLmlzRGF0YWJhc2VJbnRlZ3JpdHlPaygpOworICAgICAgICAgICAgLy8gY2xvc2UgdGhlIGRhdGFiYXNlCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRiT2JqLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRhdGFiYXNlT2spIHsKKyAgICAgICAgICAgICAgICAvLyBkYXRhYmFzZSBpcyBqdXN0IGZpbmUuIG5vIG5lZWQgdG8gZGVsZXRlIHRoZSBkYXRhYmFzZSBmaWxlCisgICAgICAgICAgICAgICAgTG9nLmUoIk15RGF0YWJhc2VDb3JydXB0aW9uSGFuZGxlciIsICJubyBjb3JydXB0aW9uIGluIHRoZSBkYXRhYmFzZTogIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2VGaWxlLmdldFBhdGgoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGRhdGFiYXNlIGlzIGNvcnJ1cHQuIGRlbGV0ZSB0aGUgZGF0YWJhc2UgZmlsZQorICAgICAgICAgICAgICAgIExvZy5lKCJNeURhdGFiYXNlQ29ycnVwdGlvbkhhbmRsZXIiLCAiZGVsZXRpbmcgdGhlIGRhdGFiYXNlIGZpbGU6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlRmlsZS5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgIG5ldyBGaWxlKGRiRGlyLCBEQl9OQU1FKS5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUdlbmVyYWxUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUdlbmVyYWxUZXN0LmphdmEKaW5kZXggNjU2MDI5ZC4uY2QzOGJmMDcgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUdlbmVyYWxUZXN0LmphdmEKQEAgLTIxLDE4ICsyMSwyMSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVN0YXRlbWVudDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LlBlcmZvcm1hbmNlVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCkBAIC0zODIsNTQgKzM4NSwyOCBAQAogCiAgICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hQ2hhbmdlMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjEgPSBtRGF0YWJhc2U7Ci0gICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUsIG51bGwpOwotICAgICAgICBDdXJzb3IgY3Vyc29yOwotCi0gICAgICAgIGRiMS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgZGIxIChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsiKTsKLQotICAgICAgICBjdXJzb3IgPSBkYjEucXVlcnkoImRiMSIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJDdXJzb3IgaXMgbnVsbCIsIGN1cnNvcik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgZGIxIChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsiKTsKKyAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG1EYXRhYmFzZS5xdWVyeSgiZGIxIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY3Vyc29yKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGN1cnNvci5nZXRDb3VudCgpKTsKLSAgICAgICAgY3Vyc29yLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgLy8gdGhpcyBjYXVzZSBleGNlcHRpb24gYmVjYXVzZSB3ZSdyZSBzdGlsbCB1c2luZyBzcWxpdGVfcHJlcGF0ZTE2IGFuZCBub3QKLSAgICAgICAgLy8gc3FsaXRlX3ByZXBhcmUxNl92Mi4gVGhlIHYyIHZhcmlhbnQgYWRkZWQgdGhlIGFiaWxpdHkgdG8gY2hlY2sgdGhlCi0gICAgICAgIC8vIHNjaGVtYSB2ZXJzaW9uIGFuZCBoYW5kbGUgdGhlIGNhc2Ugd2hlbiB0aGUgc2NoZW1hIGhhcyBjaGFuZ2VkCi0gICAgICAgIC8vIE1hcmNvIE5lbGlzc2VuIGNsYWltIGl0IHdhcyAyeCBzbG93ZXIgdG8gY29tcGlsZSBTUUwgc3RhdGVtZW50cyBzbwotICAgICAgICAvLyBJIHJldmVydGVkIGJhY2sgdG8gdGhlIHYxIHZhcmlhbnQuCi0gICAgICAgIC8qIGRiMi5leGVjU1FMKCJDUkVBVEUgVEFCTEUgZGIyIChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsiKTsKLQotICAgICAgICBjdXJzb3IgPSBkYjEucXVlcnkoImRiMSIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJDdXJzb3IgaXMgbnVsbCIsIGN1cnNvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBjdXJzb3IuY291bnQoKSk7Ci0gICAgICAgIGN1cnNvci5kZWFjdGl2YXRlKCk7Ci0gICAgICAgICovCisgICAgICAgIGN1cnNvci5jbG9zZSgpOwogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNjaGVtYUNoYW5nZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIxID0gbURhdGFiYXNlOwotICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2VGaWxlLCBudWxsKTsKLSAgICAgICAgQ3Vyc29yIGN1cnNvcjsKLQotCi0gICAgICAgIGRiMS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgZGIxIChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsiKTsKLSAgICAgICAgZGIxLmV4ZWNTUUwoIklOU0VSVCBJTlRPIGRiMSAoZGF0YSkgVkFMVUVTICgndGVzdCcpOyIpOwotCi0gICAgICAgIGN1cnNvciA9IGRiMS5xdWVyeSgiZGIxIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIC8vIHRoaXMgY2F1c2UgZXhjZXB0aW9uIGJlY2F1c2Ugd2UncmUgc3RpbGwgdXNpbmcgc3FsaXRlX3ByZXBhdGUxNiBhbmQgbm90Ci0gICAgICAgIC8vIHNxbGl0ZV9wcmVwYXJlMTZfdjIuIFRoZSB2MiB2YXJpYW50IGFkZGVkIHRoZSBhYmlsaXR5IHRvIGNoZWNrIHRoZQotICAgICAgICAvLyBzY2hlbWEgdmVyc2lvbiBhbmQgaGFuZGxlIHRoZSBjYXNlIHdoZW4gdGhlIHNjaGVtYSBoYXMgY2hhbmdlZAotICAgICAgICAvLyBNYXJjbyBOZWxpc3NlbiBjbGFpbSBpdCB3YXMgMnggc2xvd2VyIHRvIGNvbXBpbGUgU1FMIHN0YXRlbWVudHMgc28KLSAgICAgICAgLy8gSSByZXZlcnRlZCBiYWNrIHRvIHRoZSB2MSB2YXJpYW50LgotICAgICAgICAvKiBkYjIuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIGRiMiAoX2lkIElOVEVHRVIgUFJJTUFSWSBLRVksIGRhdGEgVEVYVCk7Iik7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ3Vyc29yIGlzIG51bGwiLCBjdXJzb3IpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY3Vyc29yLmNvdW50KCkpOwotICAgICAgICBhc3NlcnRUcnVlKGN1cnNvci5maXJzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgY3Vyc29yLmdldFN0cmluZyhjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KCJkYXRhIikpKTsKLSAgICAgICAgY3Vyc29yLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgKi8KKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBkYjEgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIElOVE8gZGIxIChkYXRhKSBWQUxVRVMgKCd0ZXN0Jyk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJBTFRFUiBUQUJMRSBkYjEgQUREIENPTFVNTiBibGFoIGludDsiKTsKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYyA9IG1EYXRhYmFzZS5yYXdRdWVyeSgic2VsZWN0IGJsYWggZnJvbSBkYjEiLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgQ2hhbmdlT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgewpAQCAtNDY3LDQ1ICs0NDQsNiBAQAogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5vdGlmaWNhdGlvblRlc3QxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8qCi0gICAgICAgIEN1cnNvciBjID0gbUNvbnRlbnRSZXNvbHZlci5xdWVyeShOb3Rlcy5DT05URU5UX1VSSSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge05vdGVzLl9JRCwgTm90ZXMuTk9URX0sCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGMucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobmV3IE15Q29udGVudE9ic2VydmVyKHRydWUpKTsKLSAgICAgICAgaW50IGNvdW50ID0gYy5jb3VudCgpOwotCi0gICAgICAgIE15Q29udGVudE9ic2VydmVyIG9ic2VydmVyID0gbmV3IE15Q29udGVudE9ic2VydmVyKGZhbHNlKTsKLSAgICAgICAgbUNvbnRlbnRSZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihOb3Rlcy5DT05URU5UX1VSSSwgdHJ1ZSwgb2JzZXJ2ZXIpOwotCi0gICAgICAgIFVyaSB1cmk7Ci0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIHZhbHVlcy5wdXQoTm90ZXMuTk9URSwgInRlc3Qgbm90ZTEiKTsKLSAgICAgICAgdXJpID0gbUNvbnRlbnRSZXNvbHZlci5pbnNlcnQoTm90ZXMuQ09OVEVOVF9VUkksIHZhbHVlcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQ3Vyc29yTm90aWZpY2F0aW9uQ291bnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbU5vdGlmaWNhdGlvbkNvdW50KTsKLQotICAgICAgICBjLnJlcXVlcnkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50ICsgMSwgYy5jb3VudCgpKTsKLSAgICAgICAgYy5maXJzdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3Qgbm90ZTEiLCBjLmdldFN0cmluZyhjLmdldENvbHVtbkluZGV4KE5vdGVzLk5PVEUpKSk7Ci0gICAgICAgIGMudXBkYXRlU3RyaW5nKGMuZ2V0Q29sdW1uSW5kZXgoTm90ZXMuTk9URSksICJ0ZXN0IG5vdGUyIik7Ci0gICAgICAgIGMuY29tbWl0VXBkYXRlcygpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBtQ3Vyc29yTm90aWZpY2F0aW9uQ291bnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbU5vdGlmaWNhdGlvbkNvdW50KTsKLQotICAgICAgICBtQ29udGVudFJlc29sdmVyLmRlbGV0ZSh1cmksIG51bGwpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygzLCBtQ3Vyc29yTm90aWZpY2F0aW9uQ291bnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgbU5vdGlmaWNhdGlvbkNvdW50KTsKLQotICAgICAgICBtQ29udGVudFJlc29sdmVyLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIob2JzZXJ2ZXIpOwotICAgICAgICAqLwotICAgIH0KLQotICAgIEBNZWRpdW1UZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkFyZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0IChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsiKTsKICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygxKTsKQEAgLTk4OSwyMSArOTI3LDYgQEAKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REYkNsb3NlUmVsZWFzaW5nQWxsQ2FjaGVkU3FsKCkgewotICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3QgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCB0ZXh0MSBURVhULCB0ZXh0MiBURVhULCAiICsKLSAgICAgICAgICAgICAgICAibnVtMSBJTlRFR0VSLCBudW0yIElOVEVHRVIsIGltYWdlIEJMT0IpOyIpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc3RhdGVtZW50ID0gIkRFTEVURSBGUk9NIHRlc3QgV0hFUkUgX2lkPT87IjsKLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudERvTm90Q2xvc2UgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudChzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudERvTm90Q2xvc2UuZ2V0VW5pcXVlSWQoKSA+IDApOwotICAgICAgICBpbnQgblN0YXRlbWVudCA9IHN0YXRlbWVudERvTm90Q2xvc2UuZ2V0VW5pcXVlSWQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzdGF0ZW1lbnREb05vdENsb3NlLmdldFVuaXF1ZUlkKCkgPT0gblN0YXRlbWVudCk7Ci0gICAgICAgIC8qIGRvIG5vdCBjbG9zZSBzdGF0ZW1lbnREb05vdENsb3NlIG9iamVjdC4gCi0gICAgICAgICAqIFRoYXQgc2hvdWxkIGxlYXZlIGl0IGluIFNRTGl0ZURhdGFiYXNlLm1Qcm9ncmFtcy4KLSAgICAgICAgICogbURhdGFiYXNlLmNsb3NlKCkgaW4gdGVhckRvd24oKSBzaG91bGQgcmVsZWFzZSBpdC4KLSAgICAgICAgICovCi0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VtaWNvbG9uc0luU3RhdGVtZW50cygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHByYWdtYV90ZXN0ICgiICsKICAgICAgICAgICAgICAgICAiaSBJTlRFR0VSIERFRkFVTFQgMTIzNCwgIiArCkBAIC0xMDIzLDYgKzk0NiwzNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pb25zV2l0aEJpbmRBcmdzKCkgeworICAgICAgICAvKiBtYWtlIHN1cmUgdW5pb25zIHdpdGggYmluZGFyZ3Mgd29yayBodHRwOi8vYi9pc3N1ZT9pZD0xMDYxMjkxICovCisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgQSAoaSBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIEIgKGsgaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImNyZWF0ZSB0YWJsZSBDIChuIGludCk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBBIHZhbHVlcygxKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEEgdmFsdWVzKDIpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gQSB2YWx1ZXMoMyk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBCIHZhbHVlcygyMDEpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gQiB2YWx1ZXMoMjAyKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEIgdmFsdWVzKDIwMyk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBDIHZhbHVlcyg5MDEpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gQyB2YWx1ZXMoOTAyKTsiKTsKKyAgICAgICAgU3RyaW5nIHMgPSAic2VsZWN0IGkgZnJvbSBBIHdoZXJlIGkgPiAyICIgKworICAgICAgICAgICAgICAgICJVTklPTiBzZWxlY3QgayBmcm9tIEIgd2hlcmUgayA+IDIwMSAiICsKKyAgICAgICAgICAgICAgICAiVU5JT04gc2VsZWN0IG4gZnJvbSBDIHdoZXJlIG4gIT05MDA7IjsKKyAgICAgICAgQ3Vyc29yIGMgPSBtRGF0YWJhc2UucmF3UXVlcnkocywgbnVsbCk7CisgICAgICAgIGludCBuID0gYy5nZXRDb3VudCgpOworICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgIFN0cmluZyBzMSA9ICJzZWxlY3QgaSBmcm9tIEEgd2hlcmUgaSA+ID8gIiArCisgICAgICAgICAgICAgICAgIlVOSU9OIHNlbGVjdCBrIGZyb20gQiB3aGVyZSBrID4gPyAiICsKKyAgICAgICAgICAgICAgICAiVU5JT04gc2VsZWN0IG4gZnJvbSBDIHdoZXJlIG4gIT0gPzsiOworICAgICAgICBDdXJzb3IgYzEgPSBtRGF0YWJhc2UucmF3UXVlcnkoczEsIG5ldyBTdHJpbmdbXXsiMiIsICIyMDEiLCAiOTAwIn0pOworICAgICAgICBhc3NlcnRFcXVhbHMobiwgYzEuZ2V0Q291bnQoKSk7CisgICAgICAgIGMxLmNsb3NlKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVGhpcyB0ZXN0IGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gdGhlIHBsYXRmb3JtIGhhcyBhIGxvY2FsZSB3aXRoIHRoZSBsYW5ndWFnZSAiamEiLgogICAgICAqIEl0IGZpbmlzaGVzIHdpdGhvdXQgZmFpbHVyZSB3aGVuIGl0IGlzIG5vdCBhdmFpbGFibGUuICAKQEAgLTExMDgsNSArMTA1OSwxMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9ICAgIAorICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TWF4Q2FoZXNpemUoKSB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdCAoaSBpbnQsIGogaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKDEsMSk7Iik7CisgICAgICAgIC8vIHNldCBjYWNoZSBzaXplCisgICAgICAgIGludCBOID0gU1FMaXRlRGF0YWJhc2UuTUFYX1NRTF9DQUNIRV9TSVpFOworICAgICAgICBtRGF0YWJhc2Uuc2V0TWF4U3FsQ2FjaGVTaXplKE4pOworCisgICAgICAgIC8vIHRyeSByZWR1Y2UgY2FjaGVzaXplCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0TWF4U3FsQ2FjaGVTaXplKDEpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5jb250YWlucygiY2Fubm90IHNldCBjYWNoZVNpemUgdG8gYSB2YWx1ZSBsZXNzIHRoYW4iKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpIHsKKyAgICAgICAgRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciA9IG5ldyBEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIoKTsKKworICAgICAgICAvLyBjbG9zZSB0aGUgZGF0YWJhc2UuIGFuZCBjYWxsIGNvcnJ1cHRpb24gaGFuZGxlci4KKyAgICAgICAgLy8gaXQgc2hvdWxkIGRlbGV0ZSB0aGUgZGF0YWJhc2UgZmlsZS4KKyAgICAgICAgRmlsZSBkYmZpbGUgPSBuZXcgRmlsZShtRGF0YWJhc2UuZ2V0UGF0aCgpKTsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc09wZW4oKSk7CisgICAgICAgIGFzc2VydFRydWUoZGJmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVycm9ySGFuZGxlci5vbkNvcnJ1cHRpb24obURhdGFiYXNlKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgYW4gaW4tbWVtb3J5IGRhdGFiYXNlLiBhbmQgY29ycnVwdGlvbiBoYW5kbGVyIHNob3VsZG4ndCB0cnkgdG8gZGVsZXRlIGl0CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIG1lbW9yeURiID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UoIjptZW1vcnk6IiwgbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobWVtb3J5RGIpOworICAgICAgICBtZW1vcnlEYi5jbG9zZSgpOworICAgICAgICBhc3NlcnRGYWxzZShtZW1vcnlEYi5pc09wZW4oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvckhhbmRsZXIub25Db3JydXB0aW9uKG1lbW9yeURiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSBhIGRhdGFiYXNlLCBrZWVwIGl0IG9wZW4sIGNhbGwgY29ycnVwdGlvbiBoYW5kbGVyLiBkYXRhYmFzZSBmaWxlIHNob3VsZCBiZSBkZWxldGVkCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiT2JqID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlLmdldFBhdGgoKSwgbnVsbCk7CisgICAgICAgIGFzc2VydFRydWUoZGJmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkYk9iaik7CisgICAgICAgIGFzc2VydFRydWUoZGJPYmouaXNPcGVuKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbihkYk9iaik7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgidW5leHBlY3RlZCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIGEgZGF0YWJhc2UsIGF0dGFjaCAyIG1vcmUgZGF0YWJhc2VzIHRvIGl0CisgICAgICAgIC8vICAgIGF0dGFjaGVkIGRhdGFiYXNlICMgMTogIjptZW1vcnk6IgorICAgICAgICAvLyAgICBhdHRhY2hlZCBkYXRhYmFzZSAjIDI6IG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiMSI7CisgICAgICAgIC8vIGNhbGwgY29ycnVwdGlvbiBoYW5kbGVyLiBkYXRhYmFzZSBmaWxlcyBpbmNsdWRpbmcgdGhlIG9uZSBmb3IgYXR0YWNoZWQgZGF0YWJhc2UgIyAyCisgICAgICAgIC8vIHNob3VsZCBiZSBkZWxldGVkCisgICAgICAgIFN0cmluZyBhdHRhY2hlZERiMUZpbGUgPSBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIjEiOworICAgICAgICBkYk9iaiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZS5nZXRQYXRoKCksIG51bGwpOworICAgICAgICBkYk9iai5leGVjU1FMKCJBVFRBQ0ggREFUQUJBU0UgJzptZW1vcnk6JyBhcyBtZW1vcnlEYiIpOworICAgICAgICBkYk9iai5leGVjU1FMKCJBVFRBQ0ggREFUQUJBU0UgJyIgKyAgYXR0YWNoZWREYjFGaWxlICsgIicgYXMgYXR0YWNoZWREYjEiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKG5ldyBGaWxlKGF0dGFjaGVkRGIxRmlsZSkuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRiT2JqKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYk9iai5pc09wZW4oKSk7CisgICAgICAgIEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gYXR0YWNoZWREYnMgPSBkYk9iai5nZXRBdHRhY2hlZERicygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbihkYk9iaik7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobmV3IEZpbGUoYXR0YWNoZWREYjFGaWxlKS5leGlzdHMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBzYW1lIGFzIGFib3ZlLCBleGNlcHQgdGhpcyBpcyBhIGJpdCBvZiBzdHJlc3MgdGVzdGluZy4gYXR0YWNoIDUgZGF0YWJhc2UgZmlsZXMKKyAgICAgICAgLy8gYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZSBhbGwgcmVtb3ZlZC4KKyAgICAgICAgaW50IE4gPSA1OworICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhdHRhY2hlZERiRmlsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oTik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICBhdHRhY2hlZERiRmlsZXMuYWRkKG1EYXRhYmFzZS5nZXRQYXRoKCkgKyBpKTsKKyAgICAgICAgfQorICAgICAgICBkYk9iaiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZS5nZXRQYXRoKCksIG51bGwpOworICAgICAgICBkYk9iai5leGVjU1FMKCJBVFRBQ0ggREFUQUJBU0UgJzptZW1vcnk6JyBhcyBtZW1vcnlEYiIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgZGJPYmouZXhlY1NRTCgiQVRUQUNIIERBVEFCQVNFICciICsgIGF0dGFjaGVkRGJGaWxlcy5nZXQoaSkgKyAiJyBhcyBhdHRhY2hlZERiIiArIGkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoZGJmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUoYXR0YWNoZWREYkZpbGVzLmdldChpKSkuZXhpc3RzKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydE5vdE51bGwoZGJPYmopOworICAgICAgICBhc3NlcnRUcnVlKGRiT2JqLmlzT3BlbigpKTsKKyAgICAgICAgYXR0YWNoZWREYnMgPSBkYk9iai5nZXRBdHRhY2hlZERicygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbihkYk9iaik7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShuZXcgRmlsZShhdHRhY2hlZERiRmlsZXMuZ2V0KGkpKS5leGlzdHMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIik7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VDb25uZWN0aW9uUG9vbFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNWRkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VDb25uZWN0aW9uUG9vbFRlc3QuamF2YQpAQCAtMCwwICsxLDM2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZVRlc3QuQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmc7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworcHVibGljIGNsYXNzIERhdGFiYXNlQ29ubmVjdGlvblBvb2xUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRhdGFiYXNlQ29ubmVjdGlvblBvb2xUZXN0IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQ09OTiA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU1FMID0gInNlbGVjdCAqIGZyb20gdGVzdCB3aGVyZSBpID0gPyBBTkQgaiA9IDEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRFU1RfU1FMUyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgIFRFU1RfU1FMLCBURVNUX1NRTCArIDEsIFRFU1RfU1FMICsgMiwgVEVTVF9TUUwgKyAzLCBURVNUX1NRTCArIDQKKyAgICB9OworCisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7CisgICAgcHJpdmF0ZSBGaWxlIG1EYXRhYmFzZUZpbGU7CisgICAgcHJpdmF0ZSBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sIG1UZXN0UG9vbDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgRmlsZSBkYkRpciA9IGdldENvbnRleHQoKS5nZXREaXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSwgQ29udGV4dC5NT0RFX1BSSVZBVEUpOworICAgICAgICBtRGF0YWJhc2VGaWxlID0gbmV3IEZpbGUoZGJEaXIsICJkYXRhYmFzZV90ZXN0LmRiIik7CisgICAgICAgIGlmIChtRGF0YWJhc2VGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZSA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUuZ2V0UGF0aCgpLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGF0YWJhc2UpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIHRlc3QgKGkgaW50LCBqIGludCk7Iik7CisgICAgICAgIG1UZXN0UG9vbCA9IG5ldyBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sKG1EYXRhYmFzZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwobVRlc3RQb29sKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtVGVzdFBvb2wuY2xvc2UoKTsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmRSZWxlYXNlKCkgeworICAgICAgICBtVGVzdFBvb2wuc2V0TWF4UG9vbFNpemUoTUFYX0NPTk4pOworICAgICAgICAvLyBjb25uZWN0aW9ucyBzaG91bGQgYmUgbGF6aWx5IGNyZWF0ZWQuCisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgLy8gTUFYIHBvb2wgc2l6ZSBzaG91bGQgYmUgc2V0IHRvIE1BWF9DT05OCisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBnZXQgYSBjb25uZWN0aW9uCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbVRlc3RQb29sLmdldChURVNUX1NRTCk7CisgICAgICAgIC8vIHBvb2wgc2l6ZSBzaG91bGQgYmUgb25lIC0gc2luY2Ugb25seSBvbmUgc2hvdWxkIGJlIGFsbG9jYXRlZCBmb3IgdGhlIGFib3ZlIGdldCgpCisgICAgICAgIGFzc2VydEVxdWFscygxLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgZGIubVBhcmVudENvbm5PYmopOworICAgICAgICAvLyBubyBmcmVlIGNvbm5lY3Rpb25zIHNob3VsZCBiZSBhdmFpbGFibGUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYikpOworICAgICAgICAvLyByZWxlYXNlIHRoZSBjb25uZWN0aW9uCisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiKSk7CisgICAgICAgIC8vIHJlbGVhc2UgdGhlIHNhbWUgb2JqZWN0IGFnYWluIGFuZCBleHBlY3QgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYik7CisgICAgICAgICAgICBmYWlsKCJpbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZC4KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBhbGwgY29ubmVjdGlvbnMgZnJvbSB0aGUgcG9vbCBhbmQgYXNrIGZvciBvbmUgbW9yZS4KKyAgICAgKiBzaG91bGQgZ2V0IG9uZSBvZiB0aGUgY29ubmVjdGlvbnMgYWxyZWFkeSBnb3Qgc28gZmFyLiAKKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbENvbm5BbmRPbmVNb3JlKCkgeworICAgICAgICBtVGVzdFBvb2wuc2V0TWF4UG9vbFNpemUoTUFYX0NPTk4pOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgQXJyYXlMaXN0PFNRTGl0ZURhdGFiYXNlPiBkYk9ianMgPSBuZXcgQXJyYXlMaXN0PFNRTGl0ZURhdGFiYXNlPigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9DT05OOyBpKyspIHsKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbVRlc3RQb29sLmdldChURVNUX1NRTCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYk9ianMuY29udGFpbnMoZGIpKTsKKyAgICAgICAgICAgIGRiT2Jqcy5hZGQoZGIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgZGIubVBhcmVudENvbm5PYmopOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gcG9vbCBpcyBtYXhlZCBvdXQgYW5kIG5vIGZyZWUgY29ubmVjdGlvbnMuIGFzayBmb3Igb25lIG1vcmUgY29ubmVjdGlvbgorICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjEgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMKTsKKyAgICAgICAgLy8gbWFrZSBzdXJlIGRiMSBpcyBvbmUgb2YgdGhlIGV4aXN0aW5nIG9uZXMKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYk9ianMuY29udGFpbnMoZGIxKSk7CisgICAgICAgIC8vIHBvb2wgc2l6ZSBzaG91bGQgcmVtYWluIGF0IE1BWF9DT05OCisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gcmVsZWFzZSBkYjEgYnV0IHNpbmNlIGl0IGlzIGFsbG9jYXRlZCAyIHRpbWVzLCBpdCBzaG91bGQgc3RpbGwgcmVtYWluICdidXN5JworICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYjEpOworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gcmVsZWFzZSBhbGwgY29ubmVjdGlvbnMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYk9ianMuZ2V0KGkpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBhbGwgb2JqZWN0cyBpbiB0aGUgcG9vbCBzaG91bGQgYmUgZnJlZWQgbm93CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIHNhbWUgYXMgYWJvdmUgZXhjZXB0IHRoYXQgZWFjaCBjb25uZWN0aW9uIGhhcyBkaWZmZXJlbnQgU1FMIHN0YXRlbWVudCBhc3NvY2lhdGVkIHdpdGggaXQuIAorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ublJldHJpZXZhbEZvclByZXZpb3VzbHlTZWVuU3FsKCkgeworICAgICAgICBtVGVzdFBvb2wuc2V0TWF4UG9vbFNpemUoTUFYX0NPTk4pOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICBIYXNoTWFwPFN0cmluZywgU1FMaXRlRGF0YWJhc2U+IGRiT2JqcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU1FMaXRlRGF0YWJhc2U+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkrKykgeworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMU1tpXSk7CisgICAgICAgICAgICBleGVjdXRlU3FsT25EYXRhYmFzZUNvbm4oZGIsIFRFU1RfU1FMU1tpXSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYk9ianMudmFsdWVzKCkuY29udGFpbnMoZGIpKTsKKyAgICAgICAgICAgIGRiT2Jqcy5wdXQoVEVTVF9TUUxTW2ldLCBkYik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBwb29sIGlzIG1heGVkIG91dCBhbmQgbm8gZnJlZSBjb25uZWN0aW9ucy4gYXNrIGZvciBvbmUgbW9yZSBjb25uZWN0aW9uCisgICAgICAgIC8vIHVzZSBhIHByZXZpb3VzbHkgc2VlbiBTUUwgc3RhdGVtZW50CisgICAgICAgIFN0cmluZyB0ZXN0U3FsID0gVEVTVF9TUUxTW01BWF9DT05OIC0gMV07CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMSA9IG1UZXN0UG9vbC5nZXQodGVzdFNxbCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gbWFrZSBzdXJlIGRiMSBpcyBvbmUgb2YgdGhlIGV4aXN0aW5nIG9uZXMKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYk9ianMudmFsdWVzKCkuY29udGFpbnMoZGIxKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhkYjEsIGRiT2Jqcy5nZXQodGVzdFNxbCkpOworICAgICAgICAvLyBkbyB0aGUgc2FtZSBhZ2FpbgorICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjIgPSBtVGVzdFBvb2wuZ2V0KHRlc3RTcWwpOworICAgICAgICAvLyBtYWtlIHN1cmUgZGIxIGlzIG9uZSBvZiB0aGUgZXhpc3Rpbmcgb25lcworICAgICAgICBhc3NlcnRFcXVhbHMoZGIyLCBkYk9ianMuZ2V0KHRlc3RTcWwpKTsKKworICAgICAgICAvLyBwb29sIHNpemUgc2hvdWxkIHJlbWFpbiBhdCBNQVhfQ09OTgorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisKKyAgICAgICAgLy8gcmVsZWFzZSBkYjEgYnV0IHNpbmNlIHRoZSBzYW1lIGNvbm5lY3Rpb24gaXMgYWxsb2NhdGVkIDMgdGltZXMsCisgICAgICAgIC8vIGl0IHNob3VsZCBzdGlsbCByZW1haW4gJ2J1c3knCisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiMSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYk9ianMuZ2V0KHRlc3RTcWwpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICAvLyByZWxlYXNlIGRiMiBidXQgc2luY2UgdGhlIHNhbWUgY29ubmVjdGlvbiBpcyBhbGxvY2F0ZWQgMiB0aW1lcywKKyAgICAgICAgLy8gaXQgc2hvdWxkIHN0aWxsIHJlbWFpbiAnYnVzeScKKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIyKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiT2Jqcy5nZXQodGVzdFNxbCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIC8vIHJlbGVhc2UgYWxsIGNvbm5lY3Rpb25zCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkrKykgeworICAgICAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGJPYmpzLmdldChURVNUX1NRTFNbaV0pKTsKKyAgICAgICAgfQorICAgICAgICAvLyBhbGwgb2JqZWN0cyBpbiB0aGUgcG9vbCBzaG91bGQgYmUgZnJlZWQgbm93CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVTcWxPbkRhdGFiYXNlQ29ubihTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCkgeworICAgICAgICAvLyBnZXQgdGhlIGdpdmVuIHNxbCBiZSBjb21waWxlZCBvbiB0aGUgZ2l2ZW4gZGF0YWJhc2UgY29ubmVjdGlvbi4KKyAgICAgICAgLy8gdGhpcyB3aWxsIGhlbHAgRGF0YWJhc2VDb25lbmN0aW9uUG9vbCBmaWd1cmUgb3V0IGlmIGEgZ2l2ZW4gU1FMIHN0YXRlbWVudAorICAgICAgICAvLyBpcyBhbHJlYWR5IGNhY2hlZCBieSBhIGRhdGFiYXNlIGNvbm5lY3Rpb24uCisgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIGMgPQorICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShkYiwgc3FsKTsKKyAgICAgICAgYy5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBhIGNvbm5lY3Rpb24gZm9yIGEgU1FMIHN0YXRlbWVudCAnYmxhaCcuIChjb25uZWN0aW9uX3MpCisgICAgICogbWFrZSBzdXJlIHRoZSBwb29sIGhhcyBhdCBsZWFzdCBvbmUgZnJlZSBjb25uZWN0aW9uIGV2ZW4gYWZ0ZXIgdGhpcyBnZXQoKS4KKyAgICAgKiBhbmQgZ2V0IGEgY29ubmVjdGlvbiBmb3IgdGhlIHNhbWUgU1FMIGFnYWluLgorICAgICAqICAgIHRoaXMgY29ubmVjdGlvbiBzaG91bGQgYmUgZGlmZmVyZW50IGZyb20gY29ubmVjdGlvbl9zLgorICAgICAqICAgIGV2ZW4gdGhvdWdoIHRoZXJlIGlzIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBnaXZlbiBTUUwgcHJlLWNvbXBpbGVkLCBzaW5jZSBpcyBpdCBub3QgZnJlZQorICAgICAqICAgIEFORCBzaW5jZSB0aGUgcG9vbCBoYXMgZnJlZSBjb25uZWN0aW9ucyBhdmFpbGFibGUsIHNob3VsZCBnZXQgYSBuZXcgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbm5Gb3JUaGVTYW1lU3FsKCkgeworICAgICAgICBtVGVzdFBvb2wuc2V0TWF4UG9vbFNpemUoTUFYX0NPTk4pOworCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbVRlc3RQb29sLmdldChURVNUX1NRTCk7CisgICAgICAgIGV4ZWN1dGVTcWxPbkRhdGFiYXNlQ29ubihkYiwgVEVTVF9TUUwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIpKTsKKworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjEgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiMSkpOworICAgICAgICBhc3NlcnRGYWxzZShkYjEuZXF1YWxzKGRiKSk7CisKKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYjEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIHNhbWUgY29ubmVjdGlvbiBOIHRpbWVzIGFuZCByZWxlYXNlIGl0IE4gdGltZXMuCisgICAgICogdGhpcyB0ZXN0cyBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sLlBvb2xPYmoubU51bUhvbGRlcnMKKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNhbWVDb25uTnRpbWVzQW5kUmVsZWFzZUl0TnRpbWVzKCkgeworICAgICAgICBtVGVzdFBvb2wuc2V0TWF4UG9vbFNpemUoTUFYX0NPTk4pOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICBIYXNoTWFwPFN0cmluZywgU1FMaXRlRGF0YWJhc2U+IGRiT2JqcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU1FMaXRlRGF0YWJhc2U+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkrKykgeworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMU1tpXSk7CisgICAgICAgICAgICBleGVjdXRlU3FsT25EYXRhYmFzZUNvbm4oZGIsIFRFU1RfU1FMU1tpXSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYk9ianMudmFsdWVzKCkuY29udGFpbnMoZGIpKTsKKyAgICAgICAgICAgIGRiT2Jqcy5wdXQoVEVTVF9TUUxTW2ldLCBkYik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBldmVyeSBjb25uZWN0aW9uIGluIHRoZSBwb29sIHNob3VsZCBoYXZlIG51bUhvbGRlcnMgPSAxCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkgKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBtVGVzdFBvb2wuZ2V0UG9vbCgpLmdldChpKS5nZXROdW1Ib2xkZXJzKCkpOworICAgICAgICB9CisgICAgICAgIC8vIHBvb2wgaXMgbWF4ZWQgb3V0IGFuZCBubyBmcmVlIGNvbm5lY3Rpb25zLiBhc2sgZm9yIG9uZSBtb3JlIGNvbm5lY3Rpb24KKyAgICAgICAgLy8gdXNlIGEgcHJldmlvdXNseSBzZWVuIFNRTCBzdGF0ZW1lbnQKKyAgICAgICAgU3RyaW5nIHRlc3RTcWwgPSBURVNUX1NRTFNbTUFYX0NPTk4gLSAxXTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIxID0gbVRlc3RQb29sLmdldCh0ZXN0U3FsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBtYWtlIHN1cmUgZGIxIGlzIG9uZSBvZiB0aGUgZXhpc3Rpbmcgb25lcworICAgICAgICBhc3NlcnRUcnVlKGRiT2Jqcy52YWx1ZXMoKS5jb250YWlucyhkYjEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRiMSwgZGJPYmpzLmdldCh0ZXN0U3FsKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYjEpKTsKKyAgICAgICAgRGF0YWJhc2VDb25uZWN0aW9uUG9vbC5Qb29sT2JqIHBvb2xPYmogPSBtVGVzdFBvb2wuZ2V0UG9vbCgpLmdldChkYjEubUNvbm5lY3Rpb25OdW0gLSAxKTsKKyAgICAgICAgaW50IG51bUhvbGRlcnMgPSBwb29sT2JqLmdldE51bUhvbGRlcnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG51bUhvbGRlcnMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIGdldCB0aGUgc2FtZSBjb25uZWN0aW9uIE4gdGltZXMgbW9yZQorICAgICAgICBpbnQgTiA9IDEwMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMiA9IG1UZXN0UG9vbC5nZXQodGVzdFNxbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZGIxLCBkYjIpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiMikpOworICAgICAgICAgICAgLy8gbnVtSG9sZGVycyBmb3IgdGhpcyBvYmplY3Qgc2hvdWxkIGJlIG5vdyB1cCBieSAxCisgICAgICAgICAgICBpbnQgcHJldiA9IG51bUhvbGRlcnM7CisgICAgICAgICAgICBudW1Ib2xkZXJzID0gcG9vbE9iai5nZXROdW1Ib2xkZXJzKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJldiArIDEsIG51bUhvbGRlcnMpOworICAgICAgICB9CisgICAgICAgIC8vIHJlbGVhc2UgaXQgTiB0aW1lcworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIxKTsKKyAgICAgICAgICAgIGludCBwcmV2ID0gbnVtSG9sZGVyczsKKyAgICAgICAgICAgIG51bUhvbGRlcnMgPSBwb29sT2JqLmdldE51bUhvbGRlcnMoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcmV2IC0gMSwgbnVtSG9sZGVycyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIxKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gdGhlIGNvbm5lY3Rpb24gc2hvdWxkIHN0aWxsIGhhdmUgMiBtb3JlIGhvbGRlcnMKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcG9vbE9iai5nZXROdW1Ib2xkZXJzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIHJlbGVhc2UgMiBtb3JlIHRpbWVzCisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiMSk7CisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiMSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBwb29sT2JqLmdldE51bUhvbGRlcnMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIxKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJlc3NUZXN0KCkgeworICAgICAgICBtVGVzdFBvb2wuc2V0TWF4UG9vbFNpemUoTUFYX0NPTk4pOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICBIYXNoTWFwPFNRTGl0ZURhdGFiYXNlLCBJbnRlZ2VyPiBkYk1hcCA9IG5ldyBIYXNoTWFwPFNRTGl0ZURhdGFiYXNlLCBJbnRlZ2VyPigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9DT05OOyBpKyspIHsKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbVRlc3RQb29sLmdldChURVNUX1NRTFNbaV0pOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZGJNYXAuY29udGFpbnNLZXkoZGIpKTsKKyAgICAgICAgICAgIGRiTWFwLnB1dChkYiwgMSk7CisgICAgICAgICAgICBleGVjdXRlU3FsT25EYXRhYmFzZUNvbm4oZGIsIFRFU1RfU1FMU1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBhc2sgZm9yIGxvdCBtb3JlIGNvbm5lY3Rpb25zIGJ1dCBzaW5jZSB0aGUgcG9vbCBpcyBtYXhlZCBvdXQsIHdlIHNob3VsZCBzdGFydCByZWNlaXZpbmcKKyAgICAgICAgLy8gY29ubmVjdGlvbnMgdGhhdCB3ZSBhbHJlYWR5IGdvdCBzbyBmYXIKKyAgICAgICAgZm9yIChpbnQgaSA9IE1BWF9DT05OOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUwgKyBpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZGJNYXAuY29udGFpbnNLZXkoZGIpKTsKKyAgICAgICAgICAgIGludCBrID0gZGJNYXAuZ2V0KGRiKTsKKyAgICAgICAgICAgIGRiTWFwLnB1dChkYiwgKytrKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIHByaW50IHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlcyByZWNlaXZlZCwgc2hvdWxkIGJlIHVuaWZvcm0uCisgICAgICAgIGZvciAoU1FMaXRlRGF0YWJhc2UgZCA6IGRiTWFwLmtleVNldCgpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJjb25uZWN0aW9uICMgIiArIGQubUNvbm5lY3Rpb25OdW0gKyAiLCBudW1Ib2xkZXJzOiAiICsgZGJNYXAuZ2V0KGQpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBwcmludCB0aGUgcG9vbCBpbmZvCisgICAgICAgIExvZy5pKFRBRywgbVRlc3RQb29sLnRvU3RyaW5nKCkpOworICAgICAgICAvLyByZWxlYXNlIGFsbAorICAgICAgICBmb3IgKFNRTGl0ZURhdGFiYXNlIGQgOiBkYk1hcC5rZXlTZXQoKSkgeworICAgICAgICAgICAgaW50IG51bSA9IGRiTWFwLmdldChkKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3JUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YjFkMDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIFNRTGl0ZUN1cnNvclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgbURhdGFiYXNlOworICAgIHByaXZhdGUgRmlsZSBtRGF0YWJhc2VGaWxlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FID0gInRlc3RDdXJzb3IiOworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgRmlsZSBkYkRpciA9IGdldENvbnRleHQoKS5nZXREaXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSwgQ29udGV4dC5NT0RFX1BSSVZBVEUpOworICAgICAgICBtRGF0YWJhc2VGaWxlID0gbmV3IEZpbGUoZGJEaXIsICJzcWxpdGVjdXJzb3JfdGVzdC5kYiIpOworICAgICAgICBpZiAobURhdGFiYXNlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2UgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2VGaWxlLmdldFBhdGgoKSwgbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobURhdGFiYXNlKTsKKyAgICAgICAgLy8gY3JlYXRlIGEgdGVzdCB0YWJsZQorICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFICIgKyBUQUJMRV9OQU1FICsgIiAoaSBpbnQsIGogaW50KTsiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5T2JqUmVhc3NpZ25tZW50KCkgeworICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgLy8gaGF2ZSBhIGZldyBjb25uZWN0aW9ucyBpbiB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBwb29sCisgICAgICAgIERhdGFiYXNlQ29ubmVjdGlvblBvb2wgcG9vbCA9IG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2w7CisgICAgICAgIHBvb2wuc2V0TWF4UG9vbFNpemUoNSk7CisgICAgICAgIFNRTGl0ZUN1cnNvciBjdXJzb3IgPQorICAgICAgICAgICAgICAgIChTUUxpdGVDdXJzb3IpIG1EYXRhYmFzZS5yYXdRdWVyeSgic2VsZWN0ICogZnJvbSAiICsgVEFCTEVfTkFNRSwgbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY3Vyc29yKTsKKyAgICAgICAgLy8gaXQgc2hvdWxkIHVzZSBhIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gY3Vyc29yLmdldERhdGFiYXNlKCk7CisgICAgICAgIGFzc2VydFRydWUoZGIubUNvbm5lY3Rpb25OdW0gPiAwKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmVxdWFscyhkYikpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBkYi5tUGFyZW50Q29ubk9iaik7CisgICAgICAgIGFzc2VydFRydWUocG9vbC5nZXRDb25uZWN0aW9uTGlzdCgpLmNvbnRhaW5zKGRiKSk7CisgICAgICAgIGFzc2VydFRydWUoZGIuaXNPcGVuKCkpOworICAgICAgICAvLyBkbyBhIHJlcXVlcnkuIGN1cnNvciBzaG91bGQgY29udGludWUgdG8gdXNlIHRoZSBhYm92ZSBwb29sZWQgY29ubmVjdGlvbgorICAgICAgICBjdXJzb3IucmVxdWVyeSgpOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYkFnYWluID0gY3Vyc29yLmdldERhdGFiYXNlKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhkYiwgZGJBZ2Fpbik7CisgICAgICAgIC8vIGRpc2FibGUgV0FMIHNvIHRoYXQgdGhlIHBvb2xlZCBjb25uZWN0aW9uIGhlbGQgYnkgdGhlIGFib3ZlIGN1cnNvciBpcyBjbG9zZWQKKyAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBhc3NlcnRGYWxzZShkYi5pc09wZW4oKSk7CisgICAgICAgIGFzc2VydE51bGwobURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbCk7CisgICAgICAgIC8vIHJlcXVlcnkgLSB3aGljaCBzaG91bGQgbWFrZSB0aGUgY3Vyc29yIHVzZSBtRGF0YWJhc2UgY29ubmVjdGlvbiBzaW5jZSB0aGUgcG9vbGVkCisgICAgICAgIC8vIGNvbm5lY3Rpb24gaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZQorICAgICAgICBjdXJzb3IucmVxdWVyeSgpOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjEgPSBjdXJzb3IuZ2V0RGF0YWJhc2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYjEubUNvbm5lY3Rpb25OdW0gPT0gMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIGRiMSk7CisgICAgICAgIGFzc2VydE51bGwobURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbCk7CisgICAgICAgIGFzc2VydFRydWUoZGIxLmlzT3BlbigpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmVxdWFscyhkYikpOworICAgICAgICAvLyBlbmFibGUgV0FMIGFuZCByZXF1ZXJ5IC0gdGhpcyB0aW1lIGEgcG9vbGVkIGNvbm5lY3Rpb24gc2hvdWxkIGJlIHVzZWQKKyAgICAgICAgbURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIGN1cnNvci5yZXF1ZXJ5KCk7CisgICAgICAgIGRiID0gY3Vyc29yLmdldERhdGFiYXNlKCk7CisgICAgICAgIGFzc2VydFRydWUoZGIubUNvbm5lY3Rpb25OdW0gPiAwKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmVxdWFscyhkYikpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBkYi5tUGFyZW50Q29ubk9iaik7CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbC5nZXRDb25uZWN0aW9uTGlzdCgpLmNvbnRhaW5zKGRiKSk7CisgICAgICAgIGFzc2VydFRydWUoZGIuaXNPcGVuKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRoaXMgdGVzdCBjb3VsZCB0YWtlIGEgd2hpbGUgdG8gZXhlY3V0ZS4gc28sIGRlc2lnbmF0ZSBpdCBhcyBMYXJnZXRUZXN0CisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxsV2luZG93KCkgeworICAgICAgICAvLyBjcmVhdGUgc2NoZW1hCisgICAgICAgIGZpbmFsIFN0cmluZyB0ZXN0VGFibGUgPSAidGVzdFYiOworICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFICIgKyB0ZXN0VGFibGUgKyAiIChjb2wxIGludCwgZGVzYyB0ZXh0IG5vdCBudWxsKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKworICAgICAgICAvLyBwb3B1bGF0ZSB0aGUgdGFibGUgd2l0aCBkYXRhCisgICAgICAgIC8vIGNyZWF0ZSBhIGJpZyBzdHJpbmcgdGhhdCB3aWxsIGFsbW9zdCBmaXQgYSBwYWdlIGJ1dCBub3QgcXVpdGUuCisgICAgICAgIC8vIHNpbmNlIHNxbGl0ZSB3YW50cyB0byBtYWtlIHN1cmUgZWFjaCByb3cgaXMgaW4gYSBwYWdlLCB0aGlzIHN0cmluZyB3aWxsIGFsbG9jYXRlCisgICAgICAgIC8vIGEgbmV3IGRhdGFiYXNlIHBhZ2UgZm9yIGVhY2ggcm93LgorICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwMDsgaSsrKSB7CisgICAgICAgICAgICBidWZmLmFwcGVuZChpICUgMTAgKyAiIik7CisgICAgICAgIH0KKyAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICB2YWx1ZXMucHV0KCJkZXNjIiwgYnVmZi50b1N0cmluZygpKTsKKworICAgICAgICAvLyBpbnNlcnQgbW9yZSB0aGFuIDFNQiBvZiBkYXRhIGluIHRoZSB0YWJsZS4gdGhpcyBzaG91bGQgZW5zdXJlIHRoYXQgdGhlIGVudGlyZSB0YWJsZWRhdGEKKyAgICAgICAgLy8gd2lsbCBuZWVkIG1vcmUgdGhhbiBvbmUgQ3Vyc29yV2luZG93CisgICAgICAgIGludCBOID0gNTAwMDsKKyAgICAgICAgU2V0PEludGVnZXI+IHJvd3MgPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOworICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgeworICAgICAgICAgICAgdmFsdWVzLnB1dCgiY29sMSIsIGopOworICAgICAgICAgICAgbURhdGFiYXNlLmluc2VydCh0ZXN0VGFibGUsIG51bGwsIHZhbHVlcyk7CisgICAgICAgICAgICByb3dzLmFkZChqKTsgLy8gc3RvcmUgaW4gYSBoYXNodGFibGUgc28gd2UgY2FuIHZlcmlmeSB0aGUgcmVzdWx0cyBmcm9tIGN1cnNvciBsYXRlciBvbgorICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhOLCByb3dzLnNpemUoKSk7CisgICAgICAgIEN1cnNvciBjMSA9IG1EYXRhYmFzZS5yYXdRdWVyeSgic2VsZWN0ICogZnJvbSAiICsgdGVzdFRhYmxlLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE4sIGMxLmdldENvdW50KCkpOworICAgICAgICBjMS5jbG9zZSgpOworCisgICAgICAgIC8vIHNjcm9sbCB0aHJvdWdoIEFMTCBkYXRhIGluIHRoZSB0YWJsZSB1c2luZyBhIGN1cnNvci4gc2hvdWxkIGNhdXNlIG11bHRpcGxlIGNhbGxzIHRvCisgICAgICAgIC8vIG5hdGl2ZV9maWxsX3dpbmRvdyAoYW5kIHJlLWZpbGxzIG9mIHRoZSBDdXJzb3JXaW5kb3cgb2JqZWN0KQorICAgICAgICBDdXJzb3IgYyA9IG1EYXRhYmFzZS5xdWVyeSh0ZXN0VGFibGUsIG5ldyBTdHJpbmdbXXsiY29sMSIsICJkZXNjIn0sCisgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICBpbnQgdmFsID0gYy5nZXRJbnQoMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHJvd3MuY29udGFpbnModmFsKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHJvd3MucmVtb3ZlKHZhbCkpOworICAgICAgICB9CisgICAgICAgIC8vIGRpZCBJIHNlZSBhbGwgdGhlIHJvd3MgaW4gdGhlIHRhYmxlPworICAgICAgICBhc3NlcnRUcnVlKHJvd3MuaXNFbXB0eSgpKTsKKworICAgICAgICAvLyBjaGFuZ2UgZGF0YSBhbmQgbWFrZSBzdXJlIHRoZSBjdXJzb3IgcGlja3MgdXAgbmV3IGRhdGEgJiBjb3VudAorICAgICAgICByb3dzID0gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKTsKKyAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgaW50IE0gPSBOICsgMTAwMDsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBNOyBqKyspIHsKKyAgICAgICAgICAgIHJvd3MuYWRkKGopOworICAgICAgICAgICAgaWYgKGogPCBOKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWx1ZXMucHV0KCJjb2wxIiwgaik7CisgICAgICAgICAgICBtRGF0YWJhc2UuaW5zZXJ0KHRlc3RUYWJsZSwgbnVsbCwgdmFsdWVzKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICBhc3NlcnRFcXVhbHMoTSwgcm93cy5zaXplKCkpOworICAgICAgICBjLnJlcXVlcnkoKTsKKyAgICAgICAgaSA9IDA7CisgICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgaW50IHZhbCA9IGMuZ2V0SW50KDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyb3dzLmNvbnRhaW5zKHZhbCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyb3dzLnJlbW92ZSh2YWwpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBkaWQgSSBzZWUgYWxsIGRhdGEgZnJvbSB0aGUgbW9kaWZpZWQgdGFibGUKKyAgICAgICAgYXNzZXJ0VHJ1ZShyb3dzLmlzRW1wdHkoKSk7CisKKyAgICAgICAgLy8gbW92ZSBjdXJzb3IgYmFjayB0byAxc3Qgcm93IGFuZCBzY3JvbGwgdG8gYWJvdXQgaGFsZndheSBpbiB0aGUgcmVzdWx0IHNldAorICAgICAgICAvLyBhbmQgdGhlbiBkZWxldGUgNzUlIG9mIGRhdGEgLSBhbmQgdGhlbiBkbyByZXF1ZXJ5CisgICAgICAgIGMubW92ZVRvRmlyc3QoKTsKKyAgICAgICAgaW50IEsgPSBOIC8gMjsKKyAgICAgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBLICYmIGMubW92ZVRvTmV4dCgpOyBwKyspIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gLSBqdXN0IHNjcm9sbGluZyB0byBhYm91dCBoYWxmLXBvaW50IGluIHRoZSByZXN1bHRzZXQKKyAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICBtRGF0YWJhc2UuZGVsZXRlKHRlc3RUYWJsZSwgImNvbDEgPCA/IiwgbmV3IFN0cmluZ1tdeyAoMyAqIE0gLyA0KSArICIifSk7CisgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgIGMucmVxdWVyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoTSAvIDQsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgLy8ganVzdCBtb3ZlIHRoZSBjdXJzb3IgdG8gbmV4dCByb3cgLSB0byBtYWtlIHN1cmUgaXQgY2FuIGdvIHRocm91Z2ggdGhlIGVudGlyZQorICAgICAgICAgICAgLy8gcmVzdWx0c2V0IHdpdGhvdXQgYW55IHByb2JsZW1zCisgICAgICAgIH0KKyAgICAgICAgYy5jbG9zZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZVRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTI1OGFlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlU3RhdGVtZW50OworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TdXBwcmVzczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVEYXRhYmFzZVRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGF0YWJhc2VHZW5lcmFsVGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVEFCTEUgPSAidGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENVUlJFTlRfREFUQUJBU0VfVkVSU0lPTiA9IDQyOworICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgbURhdGFiYXNlOworICAgIHByaXZhdGUgRmlsZSBtRGF0YWJhc2VGaWxlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlNFUlQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVUERBVEUgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUxFVEUgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9OQU1FID0gImRhdGFiYXNlX3Rlc3QuZGIiOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgZGJTZXRVcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRiVGVhcmRvd24oKTsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGJUZWFyZG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGJTZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWxlIGRiRGlyID0gZ2V0Q29udGV4dCgpLmdldERpcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUgPSBuZXcgRmlsZShkYkRpciwgREJfTkFNRSk7CisgICAgICAgIGlmIChtRGF0YWJhc2VGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZSA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUuZ2V0UGF0aCgpLCBudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGF0YWJhc2UpOworICAgICAgICBtRGF0YWJhc2Uuc2V0VmVyc2lvbihDVVJSRU5UX0RBVEFCQVNFX1ZFUlNJT04pOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKSB7CisgICAgICAgIG1EYXRhYmFzZS5kaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sKTsKKyAgICAgICAgbURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIERhdGFiYXNlQ29ubmVjdGlvblBvb2wgcG9vbCA9IG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2w7CisgICAgICAgIGFzc2VydE5vdE51bGwocG9vbCk7CisgICAgICAgIC8vIG1ha2UgdGhlIHNhbWUgY2FsbCBhZ2FpbiBhbmQgbWFrZSBzdXJlIHRoZSBwb29sIGFscmVhZHkgc2V0dXAgaXMgbm90IHJlLWNyZWF0ZWQKKyAgICAgICAgbURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhwb29sLCBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpIHsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImNyZWF0ZSB0YWJsZSB0ZXN0IChpIGludCk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICAvLyBnZXQgYSBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1EYXRhYmFzZS5nZXREYkNvbm5lY3Rpb24oInNlbGVjdCAqIGZyb20gdGVzdCIpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRiKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmVxdWFscyhkYikpOworICAgICAgICBhc3NlcnRUcnVlKGRiLmlzT3BlbigpKTsKKyAgICAgICAgLy8gZGlzYWJsZSBXQUwgLSB3aGljaCBzaG91bGQgY2xvc2UgY29ubmVjdGlvbiBwb29sIGFuZCBhbGwgcG9vbGVkIGNvbm5lY3Rpb25zCisgICAgICAgIG1EYXRhYmFzZS5kaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZGIuaXNPcGVuKCkpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Vyc29yc1dpdGhDbG9zZWREYkNvbm5BZnRlckRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpIHsKKyAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIHRlc3QgKGkgaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKDEpOyIpOworICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICAvLyBnZXQgYSBjdXJzb3Igd2hpY2ggc2hvdWxkIHVzZSBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAgICBDdXJzb3IgYyA9IG1EYXRhYmFzZS5yYXdRdWVyeSgic2VsZWN0ICogZnJvbSB0ZXN0IiwgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbC5nZXRDb25uZWN0aW9uTGlzdCgpLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiKSk7CisgICAgICAgIC8vIGRpc2FibGUgV0FMIC0gd2hpY2ggc2hvdWxkIGNsb3NlIGNvbm5lY3Rpb24gcG9vbCBhbmQgYWxsIHBvb2xlZCBjb25uZWN0aW9ucworICAgICAgICBtRGF0YWJhc2UuZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIGFzc2VydE51bGwobURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbCk7CisgICAgICAgIGFzc2VydEZhbHNlKGRiLmlzT3BlbigpKTsKKyAgICAgICAgLy8gY3Vyc29yIGRhdGEgc2hvdWxkIHN0aWxsIGJlIGFjY2Vzc2libGUgYmVjYXVzZSBpdCBpcyBmZXRjaGluZyBkYXRhIGZyb20gQ3Vyc29yV2luZG93CisgICAgICAgIGMubW92ZVRvTmV4dCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRJbnQoMCkpOworICAgICAgICBjLnJlcXVlcnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIGMubW92ZVRvTmV4dCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRJbnQoMCkpOworICAgICAgICBjLmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogYSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgc3RhcnRlZCBiZWZvcmUgYSBzdGFuZGFsb25lLXVwZGF0ZS9pbnNlcnQvZGVsZXRlIHN0YXRlbWVudAorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRYYWN0QmVmb3JlVXBkYXRlU3FsKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgcnVuVGVzdEZvclN0YXJ0WGFjdEJlZm9yZVVwZGF0ZVNxbChJTlNFUlQpOworICAgICAgICBydW5UZXN0Rm9yU3RhcnRYYWN0QmVmb3JlVXBkYXRlU3FsKFVQREFURSk7CisgICAgICAgIHJ1blRlc3RGb3JTdGFydFhhY3RCZWZvcmVVcGRhdGVTcWwoREVMRVRFKTsKKyAgICB9CisgICAgcHJpdmF0ZSB2b2lkIHJ1blRlc3RGb3JTdGFydFhhY3RCZWZvcmVVcGRhdGVTcWwoaW50IHN0bXRUeXBlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKworICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgIC8vIG1ha2Ugc29tZSBjaGFuZ2VzIHRvIGRhdGEgaW4gVEVTVF9UQUJMRQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgdmFsdWVzLnB1dCgiaSIsIGkpOworICAgICAgICAgICAgdmFsdWVzLnB1dCgiaiIsICJpIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5pbnNlcnQoVEVTVF9UQUJMRSwgbnVsbCwgdmFsdWVzKTsKKyAgICAgICAgICAgIHN3aXRjaCAoc3RtdFR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFVQREFURToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dCgiaiIsICJ1IiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLnVwZGF0ZShURVNUX1RBQkxFLCB2YWx1ZXMsICJpID0gIiArIGksIG51bGwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERFTEVURToKKyAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLmRlbGV0ZShURVNUX1RBQkxFLCAiaSA9IDEiLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gZG8gYSBxdWVyeS4gZXZlbiB0aG91Z2ggcXVlcnkgdXNlcyBhIGRpZmZlcmVudCBkYXRhYmFzZSBjb25uZWN0aW9uLAorICAgICAgICAvLyBpdCBzaG91bGQgc3RpbGwgc2VlIHRoZSBhYm92ZSBjaGFuZ2VzIHRvIGRhdGEgYmVjYXVzZSB0aGUgYWJvdmUgc3RhbmRhbG9uZQorICAgICAgICAvLyBpbnNlcnQvdXBkYXRlL2RlbGV0ZXMgYXJlIGRvbmUgaW4gdHJhbnNhY3Rpb25zIGF1dG9tYXRpY2FsbHkuCisgICAgICAgIFN0cmluZyBzcWwgPSAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEU7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10ID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3FsKTsKKyAgICAgICAgZmluYWwgaW50IGV4cGVjdGVkVmFsdWUgPSAoc3RtdFR5cGUgPT0gREVMRVRFKSA/IDQgOiA1OworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgc3RtdC5zaW1wbGVRdWVyeUZvckxvbmcoKSk7CisgICAgICAgIHN0bXQuY2xvc2UoKTsKKyAgICAgICAgQ3Vyc29yIGMgPSBtRGF0YWJhc2UucmF3UXVlcnkoc3FsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIGMubW92ZVRvRmlyc3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIGMuZ2V0TG9uZygwKSk7CisgICAgICAgIGMuY2xvc2UoKTsKKworICAgICAgICAvLyBkbyA1IG1vcmUgY2hhbmdlcyBpbiBhIHRyYW5zYWN0aW9uIGJ1dCBkbyBhIHF1ZXJ5IGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGNvbW1pdAorICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICBmb3IgKGludCBpID0gMTA7IGkgPCAxNTsgaSsrKSB7CisgICAgICAgICAgICB2YWx1ZXMucHV0KCJpIiwgaSk7CisgICAgICAgICAgICB2YWx1ZXMucHV0KCJqIiwgImkiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgbURhdGFiYXNlLmluc2VydChURVNUX1RBQkxFLCBudWxsLCB2YWx1ZXMpOworICAgICAgICAgICAgc3dpdGNoIChzdG10VHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KCJqIiwgInUiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2UudXBkYXRlKFRFU1RfVEFCTEUsIHZhbHVlcywgImkgPSAiICsgaSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgREVMRVRFOgorICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZGVsZXRlKFRFU1RfVEFCTEUsICJpID0gMSIsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgIC8vIGRvIGEgcXVlcnkgYmVmb3JlIGNvbW1pdCAtIHNob3VsZCBzdGlsbCBoYXZlIDUgcm93cworICAgICAgICAvLyB0aGlzIHF1ZXJ5IHNob3VsZCBydW4gaW4gYSBkaWZmZXJlbnQgdGhyZWFkIHRvIGZvcmNlIGl0IHRvIHVzZSBhIGRpZmZlcmVudCBkYXRhYmFzZQorICAgICAgICAvLyBjb25uZWN0aW9uCisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHNxbCA9ICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRTsKKyAgICAgICAgICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RtdCA9IGdldERiKCkuY29tcGlsZVN0YXRlbWVudChzcWwpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBzdG10LnNpbXBsZVF1ZXJ5Rm9yTG9uZygpKTsKKyAgICAgICAgICAgICAgICBzdG10LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgQ3Vyc29yIGMgPSBnZXREYigpLnJhd1F1ZXJ5KHNxbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgICAgICAgICAgYy5tb3ZlVG9GaXJzdCgpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBjLmdldExvbmcoMCkpOworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdC5zdGFydCgpOworICAgICAgICAvLyB3YWl0IHVudGlsIHRoZSBhYm92ZSB0aHJlYWQgaXMgZG9uZQorICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgLy8gY29tbWl0IGFuZCB0aGVuIHF1ZXJ5LiBzaG91bGQgc2VlIGNoYW5nZXMgZnJvbSB0aGUgdHJhbnNhY3Rpb24KKyAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgIHN0bXQgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudChzcWwpOworICAgICAgICBmaW5hbCBpbnQgZXhwZWN0ZWRWYWx1ZTIgPSAoc3RtdFR5cGUgPT0gREVMRVRFKSA/IDkgOiAxMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUyLCBzdG10LnNpbXBsZVF1ZXJ5Rm9yTG9uZygpKTsKKyAgICAgICAgc3RtdC5jbG9zZSgpOworICAgICAgICBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KHNxbCwgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICBjLm1vdmVUb0ZpcnN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlMiwgYy5nZXRMb25nKDApKTsKKyAgICAgICAgYy5jbG9zZSgpOworICAgIH0KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBTUUxpdGVEYXRhYmFzZSBnZXREYigpIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhYmFzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRvIGVuc3VyZSB0aGF0IHJlYWRlcnMgYXJlIGFibGUgdG8gcmVhZCB0aGUgZGF0YWJhc2UgZGF0YSAob2xkIHZlcnNpb25zKQorICAgICAqIEVWRU4gV0hFTiB0aGUgd3JpdGVyIGlzIGluIGEgdHJhbnNhY3Rpb24gb24gdGhlIHNhbWUgZGF0YWJhc2UuCisgICAgICo8cD4KKyAgICAgKiBUaGlzIHRlc3Qgc3RhcnRzIDEgV3JpdGVyIGFuZCAyIFJlYWRlcnMgYW5kIHNldHMgdXAgY29ubmVjdGlvbiBwb29sIGZvciByZWFkZXJzCisgICAgICogYnkgY2FsbGluZyB0aGUgbWV0aG9kIHtAbGluayBTUUxpdGVEYXRhYmFzZSNlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpfS4KKyAgICAgKiA8cD4KKyAgICAgKiBXcml0ZXIgZG9lcyB0aGUgZm9sbG93aW5nIGluIGEgdGlnaHQgbG9vcAorICAgICAqIDxwcmU+CisgICAgICogICAgIGJlZ2luIHRyYW5zYWN0aW9uCisgICAgICogICAgIGluc2VydCBpbnRvIHRhYmxlXzEKKyAgICAgKiAgICAgaW5zZXJ0IGludG8gdGFibGVfMgorICAgICAqICAgICBjb21taXQKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8cD4KKyAgICAgKiBBcyBsb25nIGEgdGhlIHdyaXRlciBpcyBhbGl2ZSwgUmVhZGVycyBkbyB0aGUgZm9sbG93aW5nIGluIGEgdGlnaHQgbG9vcCBhdCB0aGUgc2FtZSB0aW1lCisgICAgICogPHByZT4KKyAgICAgKiAgICAgUmVhZGVyX0sgZG9lcyAic2VsZWN0IGNvdW50KCopIGZyb20gdGFibGVfSyIgIHdoZXJlIEsgPSAxIG9yIDIKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdGVzdCBpcyBydW4gZm9yIFRJTUVfVE9fUlVOX1dBTF9URVNUX0ZPUiBzZWMuCisgICAgICogPHA+CisgICAgICogVGhlIHRlc3QgaXMgcmVwZWF0ZWQgZm9yIGRpZmZlcmVudCBjb25uZWN0aW9uLXBvb2wtc2l6ZXMgKDEuLjMpCisgICAgICogPHA+CisgICAgICogQW5kIGF0IHRoZSBlbmQgb2Ygb2YgZWFjaCB0ZXN0LCB0aGUgZm9sbG93aW5nIHN0YXRpc3RpY3MgYXJlIHByaW50ZWQKKyAgICAgKiA8dWw+CisgICAgICogICAgPGxpPmNvbm5lY3Rpb24tcG9vbC1zaXplPC9saT4KKyAgICAgKiAgICA8bGk+bnVtYmVyLW9mLXRyYW5zYWN0aW9ucyBieSB3cml0ZXI8L2xpPgorICAgICAqICAgIDxsaT5udW1iZXIgb2YgcmVhZHMgYnkgcmVhZGVyX0sgd2hpbGUgdGhlIHdyaXRlciBpcyBJTiBvciBOT1QtSU4geGFjdGlvbjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBATGFyZ2VUZXN0CisgICAgQFN1cHByZXNzIC8vIHJ1biB0aGlzIHRlc3Qgb25seSBpZiB5b3UgbmVlZCB0byBjb2xsZWN0IHRoZSBudW1iZXJzIGZyb20gdGhpcyB0ZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbmN1cnJlbmN5RWZmZWN0c09mQ29ublBvb2woKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcnVuIHRoZSB0ZXN0IHdpdGggc3FsaXRlIFdBTCBlbmFibGUKKyAgICAgICAgcnVuQ29ubmVjdGlvblBvb2xUZXN0KHRydWUpOworCisgICAgICAgIC8vIHJ1biB0aGUgc2FtZSB0ZXN0IFdJVEhPVVQgc3FsaXRlIFdBTCBlbmFibGVkCisgICAgICAgIHJ1bkNvbm5lY3Rpb25Qb29sVGVzdChmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1bkNvbm5lY3Rpb25Qb29sVGVzdChib29sZWFuIHVzZVdhbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBNID0gMzsKKyAgICAgICAgU3RyaW5nQnVpbGRlcltdIGJ1ZmYgPSBuZXcgU3RyaW5nQnVpbGRlcltNXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh1c2VXYWwpIHsKKyAgICAgICAgICAgICAgICAvLyBzZXQgdXAgY29ubmVjdGlvbiBwb29sCisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbC5zZXRNYXhQb29sU2l6ZShpICsgMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5kaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdDEgKGkgaW50LCBqIGludCk7Iik7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHQyIChpIGludCwgaiBpbnQpOyIpOworICAgICAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNTsgaysrKSB7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIHQxIHZhbHVlcyg/LD8pOyIsIG5ldyBTdHJpbmdbXSB7aysiIiwgaysiIn0pOworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byB0MiB2YWx1ZXMoPyw/KTsiLCBuZXcgU3RyaW5nW10ge2srIiIsIGsrIiJ9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworCisgICAgICAgICAgICAvLyBzdGFydCBhIHdyaXRlcgorICAgICAgICAgICAgV3JpdGVyIHcgPSBuZXcgV3JpdGVyKG1EYXRhYmFzZSk7CisKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgYW4gYXJyYXkgb2YgY291bnRlcnMgdG8gYmUgcGFzc2VkIHRvIHRoZSByZWFkZXJzCisgICAgICAgICAgICBSZWFkZXIgcjEgPSBuZXcgUmVhZGVyKG1EYXRhYmFzZSwgInQxIiwgdywgMCk7CisgICAgICAgICAgICBSZWFkZXIgcjIgPSBuZXcgUmVhZGVyKG1EYXRhYmFzZSwgInQyIiwgdywgMSk7CisgICAgICAgICAgICB3LnN0YXJ0KCk7CisgICAgICAgICAgICByMS5zdGFydCgpOworICAgICAgICAgICAgcjIuc3RhcnQoKTsKKworICAgICAgICAgICAgLy8gd2FpdCBmb3IgYWxsIHRocmVhZHMgdG8gZGllCisgICAgICAgICAgICB3LmpvaW4oKTsKKyAgICAgICAgICAgIHIxLmpvaW4oKTsKKyAgICAgICAgICAgIHIyLmpvaW4oKTsKKworICAgICAgICAgICAgLy8gcHJpbnQgdGhlIHN0YXRzCisgICAgICAgICAgICBpbnRbXVtdIGNvdW50cyA9IGdldENvdW50cygpOworICAgICAgICAgICAgYnVmZltpXSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZCgiY29ubnBvb2wtc2l6ZSA9ICIpOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoaSArIDEpOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoIiwgbnVtIHhhY3RzIGJ5IHdyaXRlciA9ICIpOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoZ2V0TnVtWGFjdHMoKSk7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZCgiLCBudW0tcmVhZHMtaW4teGFjdC9OT1QtaW4teGFjdCBieSByZWFkZXIxID0gIik7CisgICAgICAgICAgICBidWZmW2ldLmFwcGVuZChjb3VudHNbMF1bMV0gKyAiLyIgKyBjb3VudHNbMF1bMF0pOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoIiwgYnkgcmVhZGVyMiA9ICIpOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoY291bnRzWzFdWzFdICsgIi8iICsgY291bnRzWzFdWzBdKTsKKworICAgICAgICAgICAgTG9nLmkoVEFHLCAiZG9uZSB0ZXN0aW5nIGZvciBjb25uLXBvb2wtc2l6ZSBvZiAiICsgKGkrMSkpOworCisgICAgICAgICAgICBkYlRlYXJkb3duKCk7CisgICAgICAgICAgICBkYlNldFVwKCk7CisgICAgICAgIH0KKyAgICAgICAgTG9nLmkoVEFHLCAiZHVyYXRpb24gb2YgdGVzdCAiICsgVElNRV9UT19SVU5fV0FMX1RFU1RfRk9SICsgIiBzZWMiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNOyBpKyspIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgYnVmZltpXS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpblhhY3QgPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCBudW1YYWN0czsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRV9UT19SVU5fV0FMX1RFU1RfRk9SID0gMTU7IC8vIG51bSBzZWMgdGhpcyB0ZXN0IHNob3VsZCBydW4KKyAgICBwcml2YXRlIGludFtdW10gY291bnRzID0gbmV3IGludFsyXVsyXTsKKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gaW5YYWN0KCkgeworICAgICAgICByZXR1cm4gaW5YYWN0OworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0SW5YYWN0RmxhZyhib29sZWFuIGZsYWcpIHsKKyAgICAgICAgaW5YYWN0ID0gZmxhZzsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldENvdW50cyhpbnQgcmVhZGVyTnVtLCBpbnRbXSBudW1SZWFkcykgeworICAgICAgICBjb3VudHNbcmVhZGVyTnVtXVswXSA9IG51bVJlYWRzWzBdOworICAgICAgICBjb3VudHNbcmVhZGVyTnVtXVsxXSA9IG51bVJlYWRzWzFdOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIGludFtdW10gZ2V0Q291bnRzKCkgeworICAgICAgICByZXR1cm4gY291bnRzOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0TnVtWGFjdHMoaW50IG51bSkgeworICAgICAgICBudW1YYWN0cyA9IG51bTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBpbnQgZ2V0TnVtWGFjdHMoKSB7CisgICAgICAgIHJldHVybiBudW1YYWN0czsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFdyaXRlciBleHRlbmRzIFRocmVhZCB7CisgICAgICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgZGIgPSBudWxsOworICAgICAgICBwdWJsaWMgV3JpdGVyKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgICAgICB0aGlzLmRiID0gZGI7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIC8vIGluIGEgbG9vcCwgZm9yIE4gc2VjLCBkbyB0aGUgZm9sbG93aW5nCisgICAgICAgICAgICAvLyAgICBCRUdJTiB0cmFuc2FjdGlvbgorICAgICAgICAgICAgLy8gICAgaW5zZXJ0IGludG8gdGFibGUgdDEsIHQyCisgICAgICAgICAgICAvLyAgICBDb21taXQKKyAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBpbnQgazsKKyAgICAgICAgICAgIGZvciAoayA9IDA7KFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gbm93KSAvIDEwMDAgPCBUSU1FX1RPX1JVTl9XQUxfVEVTVF9GT1I7IGsrKykgeworICAgICAgICAgICAgICAgIGRiLmJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKTsKKyAgICAgICAgICAgICAgICBzZXRJblhhY3RGbGFnKHRydWUpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBkYi5leGVjU1FMKCJpbnNlcnQgaW50byB0MSB2YWx1ZXMoPyw/KTsiLCBuZXcgU3RyaW5nW10ge2krIiIsIGkrIiJ9KTsKKyAgICAgICAgICAgICAgICAgICAgZGIuZXhlY1NRTCgiaW5zZXJ0IGludG8gdDIgdmFsdWVzKD8sPyk7IiwgbmV3IFN0cmluZ1tdIHtpKyIiLCBpKyIifSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRiLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICAgICAgICAgIHNldEluWGFjdEZsYWcoZmFsc2UpOworICAgICAgICAgICAgICAgIGRiLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXROdW1YYWN0cyhrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUmVhZGVyIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBkYiA9IG51bGw7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHRhYmxlID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBXcml0ZXIgdyA9IG51bGw7CisgICAgICAgIHByaXZhdGUgaW50IHJlYWRlck51bTsKKyAgICAgICAgcHJpdmF0ZSBpbnRbXSBudW1SZWFkcyA9IG5ldyBpbnRbMl07CisgICAgICAgIHB1YmxpYyBSZWFkZXIoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyB0YWJsZSwgV3JpdGVyIHcsIGludCByZWFkZXJOdW0pIHsKKyAgICAgICAgICAgIHRoaXMuZGIgPSBkYjsKKyAgICAgICAgICAgIHRoaXMudGFibGUgPSB0YWJsZTsKKyAgICAgICAgICAgIHRoaXMudyA9IHc7CisgICAgICAgICAgICB0aGlzLnJlYWRlck51bSA9IHJlYWRlck51bTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgLy8gd2hpbGUgdGhlIHdyaXRlIGlzIGFsaXZlLCBpbiBhIGxvb3AgZG8gdGhlIHF1ZXJ5IG9uIGEgdGFibGUKKyAgICAgICAgICAgIHdoaWxlICh3LmlzQWxpdmUoKSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShkYiwgInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyB0aGlzLnRhYmxlLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNvdW50IG9mIHJlYWRzCisgICAgICAgICAgICAgICAgICAgIG51bVJlYWRzW2luWGFjdCgpID8gMSA6IDBdICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0Q291bnRzKHJlYWRlck51bSwgbnVtUmVhZHMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBleHRlbmRzIFNRTGl0ZVByb2dyYW0geworICAgICAgICBwcml2YXRlIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsKSB7CisgICAgICAgICAgICBzdXBlcihkYiwgc3FsKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgc3RhdGljIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIGNyZWF0ZShTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCkgeworICAgICAgICAgICAgZGIubG9jaygpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nKGRiLCBzcWwpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBkYi51bmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0THJ1Q2FjaGluZ09mU3FsaXRlQ29tcGlsZWRTcWxPYmpzKCkgeworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgLy8gc2V0IGNhY2hlIHNpemUKKyAgICAgICAgaW50IE4gPSBTUUxpdGVEYXRhYmFzZS5NQVhfU1FMX0NBQ0hFX1NJWkU7CisgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisKKyAgICAgICAgLy8gZG8gTisxIHF1ZXJpZXMgLSBhbmQgd2hlbiB0aGUgMHRoIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSBMUlUgY2FjaGUgZHVlIHRvIHRoZQorICAgICAgICAvLyBpbnNlcnRpb24gb2YgKE4rMSl0aCBlbnRyeSwgbWFrZSBzdXJlIDB0aCBlbnRyeSBpcyBjbG9zZWQKKyAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IHN0bXRPYmpzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBzcWxTdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGludCBzdG10MCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTisxOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKCIgKyBpICsgIiw/KTsiOworICAgICAgICAgICAgc3FsU3RyaW5ncy5hZGQocyk7CisgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBjID0KKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcuY3JlYXRlKG1EYXRhYmFzZSwgcyk7CisgICAgICAgICAgICBpbnQgbiA9IGMuZ2V0U3FsU3RhdGVtZW50SWQoKTsKKyAgICAgICAgICAgIHN0bXRPYmpzLmFkZChpLCBuKTsKKyAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBzYXZlIHRoZSBzdGF0ZW1lbnRJZCBvZiB0aGlzIG9iai4gd2Ugd2FudCB0byBtYWtlIHN1cmUgaXQgaXMgdGhyb3duIG91dCBvZgorICAgICAgICAgICAgICAgIC8vIHRoZSBjYWNoZSBhdCB0aGUgZW5kIG9mIHRoaXMgdGVzdC4KKyAgICAgICAgICAgICAgICBzdG10MCA9IG47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gaXMgMCd0aCBlbnRyeSBvdXQgb2YgdGhlIGNhY2hlPyBpdCBzaG91bGQgYmUgaW4gdGhlIGxpc3Qgb2Ygc3RhdGVtZW50SWRzCisgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByZS1jb21waWxlZCBzcWwgc3RhdGVtZW50cyB0byBiZSBmaW5hbGl6ZWQuCisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmdldFF1ZXVlZFVwU3RtdExpc3QoKS5jb250YWlucyhzdG10MCkpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IE4rMTsgaSsrKSB7CisgICAgICAgICAgICBTUUxpdGVDb21waWxlZFNxbCBjb21wU3FsID0gbURhdGFiYXNlLmdldENvbXBpbGVkU3RhdGVtZW50Rm9yU3FsKHNxbFN0cmluZ3MuZ2V0KGkpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoY29tcFNxbCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN0bXRPYmpzLmNvbnRhaW5zKGNvbXBTcWwublN0YXRlbWVudCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGJDbG9zZVJlbGVhc2luZ0FsbENhY2hlZFNxbCgpIHsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0IChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgdGV4dDEgVEVYVCwgdGV4dDIgVEVYVCwgIiArCisgICAgICAgICAgICAgICAgIm51bTEgSU5URUdFUiwgbnVtMiBJTlRFR0VSLCBpbWFnZSBCTE9CKTsiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0YXRlbWVudCA9ICJERUxFVEUgRlJPTSB0ZXN0IFdIRVJFIF9pZD0/OyI7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnREb05vdENsb3NlID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3RhdGVtZW50KTsKKyAgICAgICAgc3RhdGVtZW50RG9Ob3RDbG9zZS5iaW5kTG9uZygxLCAxKTsKKyAgICAgICAgLyogZG8gbm90IGNsb3NlIHN0YXRlbWVudERvTm90Q2xvc2Ugb2JqZWN0LgorICAgICAgICAgKiBUaGF0IHNob3VsZCBsZWF2ZSBpdCBpbiBTUUxpdGVEYXRhYmFzZS5tUHJvZ3JhbXMuCisgICAgICAgICAqIG1EYXRhYmFzZS5jbG9zZSgpIGluIHRlYXJEb3duKCkgc2hvdWxkIHJlbGVhc2UgaXQuCisgICAgICAgICAqLworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKSB7CisgICAgICAgIG1EYXRhYmFzZS5kaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkRST1AgVEFCTEUgSUYgRVhJU1RTICIgKyBURVNUX1RBQkxFKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSAiICsgVEVTVF9UQUJMRSArICIgKGkgaW50LCBqIGludCk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBtRGF0YWJhc2UubG9jaygpOworICAgICAgICAvLyBmbHVzaCB0aGUgYWJvdmUgc3RhdGVtZW50IGZyb20gY2FjaGUgYW5kIGNsb3NlIGFsbCB0aGUgcGVuZGluZyBzdGF0ZW1lbnRzIHRvIGJlIHJlbGVhc2VkCisgICAgICAgIG1EYXRhYmFzZS5kZWFsbG9jQ2FjaGVkU3FsU3RhdGVtZW50cygpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOworICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpLnNpemUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdCB0byBtYWtlIHN1cmUgdGhlIHN0YXRlbWVudCBmaW5hbGl6YXRpb25zIGFyZSBub3QgZG9uZSByaWdodCBhd2F5IGJ1dAorICAgICAqIHBpZ2d5LWJhY2tlZCBvbnRvIHRoZSBuZXh0IHNxbCBzdGF0ZW1lbnQgZXhlY3V0aW9uIG9uIHRoZSBzYW1lIGRhdGFiYXNlLgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVtZW50Q2xvc2UoKSB7CisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICAvLyBmaWxsIHVwIHN0YXRlbWVudCBjYWNoZSBpbiBtRGF0YWJhc2UKKyAgICAgICAgaW50IE4gPSBTUUxpdGVEYXRhYmFzZS5NQVhfU1FMX0NBQ0hFX1NJWkU7CisgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10OworICAgICAgICBpbnQgc3RtdDBJZCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSArKykgeworICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgYyA9CisgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKCIgKyBpICsgIiwgPyk7Iik7CisgICAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIDB0aCBlbnRyeQorICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgIHN0bXQwSWQgPSBjLmdldFNxbFN0YXRlbWVudElkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgb25lIG1vcmUgdG8gdGhlIGNhY2hlIC0gYW5kIHRoZSBhYm92ZSAnc3RtdDBJZCcgc2hvdWxkIGZhbGwgb3V0IG9mIGNhY2hlCisgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIHN0bXQxID0KKyAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUobURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKDEwMCwgPyk7Iik7CisgICAgICAgIHN0bXQxLmNsb3NlKCk7CisKKyAgICAgICAgLy8gdGhlIGFib3ZlIGNsb3NlKCkgc2hvdWxkIGhhdmUgcXVldWVkVXAgdGhlIHN0YXRlbWVudCBmb3IgZmluYWxpemF0aW9uCisgICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBzdGF0ZW1lbnRJZHMgPSBtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudElkcy5jb250YWlucyhzdG10MElkKSk7CisKKyAgICAgICAgLy8gZXhlY3V0ZSBzb21ldGhpbmcgdG8gc2VlIGlmIHRoaXMgc3RhdGVtZW50IGdldHMgZmluYWxpemVkCisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJkZWxldGUgZnJvbSB0ZXN0IHdoZXJlIGkgPSAxMDsiKTsKKyAgICAgICAgc3RhdGVtZW50SWRzID0gbURhdGFiYXNlLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc3RhdGVtZW50SWRzLmNvbnRhaW5zKHN0bXQwSWQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzYW1lIGFzIGFib3ZlIC0gZXhjZXB0IHRoYXQgdGhlIHN0YXRlbWVudCB0byBiZSBmaW5hbGl6ZWQgaXMgZnJvbSBUaHJlYWQgIyAxLgorICAgICAqIGFuZCBpdCBpcyBldmVudHVhbGx5IGZpbmFsaXplZCBpbiBUaHJlYWQgIyAyIHdoZW4gaXQgZXhlY3V0ZXMgYSBTUUwgc3RhdGVtZW50LgorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YXRlbWVudENsb3NlRGlmZlRocmVhZCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICBmaW5hbCBpbnQgTiA9IFNRTGl0ZURhdGFiYXNlLk1BWF9TUUxfQ0FDSEVfU0laRTsKKyAgICAgICAgbURhdGFiYXNlLnNldE1heFNxbENhY2hlU2l6ZShOKTsKKyAgICAgICAgLy8gZmlsbCB1cCBzdGF0ZW1lbnQgY2FjaGUgaW4gbURhdGFiYXNlIGluIGEgdGhyZWFkCisgICAgICAgIFRocmVhZCB0MSA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10OworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIGMgPQorICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcuY3JlYXRlKGdldERiKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygiICsgaSArICIsID8pOyIpOworICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIDB0aCBlbnRyeQorICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdG10MElkID0gYy5nZXRTcWxTdGF0ZW1lbnRJZCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZmluaXNoCisgICAgICAgIHQxLmpvaW4oKTsKKyAgICAgICAgLy8gbURhdGFiYXNlIHNob3VsZG4ndCBoYXZlIGFueSBzdGF0ZW1lbnRzIHRvIGJlIHJlbGVhc2VkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBtRGF0YWJhc2UuZ2V0UXVldWVkVXBTdG10TGlzdCgpLnNpemUoKSk7CisKKyAgICAgICAgLy8gYWRkIG9uZSBtb3JlIHRvIHRoZSBjYWNoZSAtIGFuZCB0aGUgYWJvdmUgJ3N0bXQwSWQnIHNob3VsZCBmYWxsIG91dCBvZiBjYWNoZQorICAgICAgICAvLyBqdXN0IGZvciB0aGUgaGVjayBvZiBpdCwgZG8gaXQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKKyAgICAgICAgVGhyZWFkIHQyID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgc3RtdDEgPQorICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUoZ2V0RGIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoMTAwLCA/KTsiKTsKKyAgICAgICAgICAgICAgICBzdG10MS5iaW5kTG9uZygxLCAxKTsKKyAgICAgICAgICAgICAgICBzdG10MS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICB0Mi5qb2luKCk7CisKKyAgICAgICAgLy8gY2xvc2UoKSBpbiB0aGUgYWJvdmUgdGhyZWFkIHNob3VsZCBoYXZlIHF1ZXVlZFVwIHRoZSBzdG10MElkIGZvciBmaW5hbGl6YXRpb24KKyAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IHN0YXRlbWVudElkcyA9IGdldERiKCkuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudElkcy5jb250YWlucyhnZXRTdG10MElkKCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN0YXRlbWVudElkcy5zaXplKCkpOworCisgICAgICAgIC8vIGV4ZWN1dGUgc29tZXRoaW5nIHRvIHNlZSBpZiB0aGlzIHN0YXRlbWVudCBnZXRzIGZpbmFsaXplZAorICAgICAgICAvLyBhZ2FpbiBkbyBpdCBpbiBhIHNlcGFyYXRlIHRocmVhZAorICAgICAgICBUaHJlYWQgdDMgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBnZXREYigpLmV4ZWNTUUwoImRlbGV0ZSBmcm9tIHRlc3Qgd2hlcmUgaSA9IDEwOyIpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0My5zdGFydCgpOworICAgICAgICB0My5qb2luKCk7CisKKyAgICAgICAgLy8gaXMgdGhlIHN0YXRlbWVudCBmaW5hbGl6ZWQ/CisgICAgICAgIHN0YXRlbWVudElkcyA9IGdldERiKCkuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRGYWxzZShzdGF0ZW1lbnRJZHMuY29udGFpbnMoZ2V0U3RtdDBJZCgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgc3RtdDBJZCA9IDA7CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgaW50IGdldFN0bXQwSWQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN0bXQwSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2FtZSBhcyBhYm92ZSAtIGV4Y2VwdCB0aGF0IHRoZSBxdWV1ZSBvZiBzdGF0ZW1lbnRzIHRvIGJlIGZpbmFsaXplZCBhcmUgZmluYWxpemVkCisgICAgICogYnkgZGF0YWJhc2UgY2xvc2UoKSBvcGVyYXRpb24uCisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZW1lbnRDbG9zZUJ5RGJDbG9zZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICAvLyBmaWxsIHVwIHN0YXRlbWVudCBjYWNoZSBpbiBtRGF0YWJhc2UgaW4gYSB0aHJlYWQKKyAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgaW50IE4gPSBTUUxpdGVEYXRhYmFzZS5NQVhfU1FMX0NBQ0hFX1NJWkU7CisgICAgICAgICAgICAgICAgZ2V0RGIoKS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisgICAgICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpICsrKSB7CisgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIGMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShnZXREYigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKCIgKyBpICsgIiwgPyk7Iik7CisgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgMHRoIGVudHJ5CisgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0bXQwSWQgPSBjLmdldFNxbFN0YXRlbWVudElkKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIHRocmVhZCB0byBmaW5pc2gKKyAgICAgICAgdDEuam9pbigpOworCisgICAgICAgIC8vIGFkZCBvbmUgbW9yZSB0byB0aGUgY2FjaGUgLSBhbmQgdGhlIGFib3ZlICdzdG10MElkJyBzaG91bGQgZmFsbCBvdXQgb2YgY2FjaGUKKyAgICAgICAgLy8ganVzdCBmb3IgdGhlIGhlY2sgb2YgaXQsIGRvIGl0IGluIGEgc2VwYXJhdGUgdGhyZWFkCisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIHN0bXQxID0KKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShnZXREYigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoMTAwLCA/KTsiKTsKKyAgICAgICAgICAgICAgICBzdG10MS5iaW5kTG9uZygxLCAxKTsKKyAgICAgICAgICAgICAgICBzdG10MS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICB0Mi5qb2luKCk7CisKKyAgICAgICAgLy8gY2xvc2UoKSBpbiB0aGUgYWJvdmUgdGhyZWFkIHNob3VsZCBoYXZlIHF1ZXVlZFVwIHRoZSBzdGF0ZW1lbnQgZm9yIGZpbmFsaXphdGlvbgorICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gc3RhdGVtZW50SWRzID0gZ2V0RGIoKS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCk7CisgICAgICAgIGFzc2VydFRydWUoZ2V0U3RtdDBJZCgpID4gMCk7CisgICAgICAgIGFzc2VydFRydWUoc3RhdGVtZW50SWRzLmNvbnRhaW5zKHN0bXQwSWQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN0YXRlbWVudElkcy5zaXplKCkpOworCisgICAgICAgIC8vIGNsb3NlIHRoZSBkYXRhYmFzZS4gZXZlcnl0aGluZyBmcm9tIG1DbG9zZWRTdGF0ZW1lbnRJZHMgaW4gbURhdGFiYXNlCisgICAgICAgIC8vIHNob3VsZCBiZSBmaW5hbGl6ZWQgYW5kIGNsZWFyZWQgZnJvbSB0aGUgbGlzdAorICAgICAgICAvLyBhZ2FpbiBkbyBpdCBpbiBhIHNlcGFyYXRlIHRocmVhZAorICAgICAgICBUaHJlYWQgdDMgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBnZXREYigpLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQzLnN0YXJ0KCk7CisgICAgICAgIHQzLmpvaW4oKTsKKworICAgICAgICAvLyBjaGVjayBtQ2xvc2VkU3RhdGVtZW50SWRzIGluIG1EYXRhYmFzZS4gaXQgc2hvdWxkIGJlIGVtcHR5CisgICAgICAgIHN0YXRlbWVudElkcyA9IGdldERiKCkuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RhdGVtZW50SWRzLnNpemUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IHRlc3RzIHVzYWdlIGV4ZWNTUUwoKSB0byBiZWdpbiB0cmFuc2FjdGlvbiB3b3JrcyBpbiB0aGUgZm9sbG93aW5nIHdheQorICAgICAqICAgVGhyZWFkICMxIGRvZXMKKyAgICAgKiAgICAgICBleGVjU1FMKCJiZWdpbiB0cmFuc2FjdGlvbiIpOworICAgICAqICAgICAgIGluc2VydCgpCisgICAgICogICBUaHJlYWQgIyAyCisgICAgICogICAgICAgcXVlcnkoKQorICAgICAqICAgVGhyZWFkIzEgKCJlbmQgdHJhbnNhY3Rpb24iKQorICAgICAqIFRocmVhZCAjIDIgcXVlcnkgd2lsbCBleGVjdXRlIC0gYmVjYXVzZSBqYXZhIGxheWVyIHdpbGwgbm90IGhhdmUgbG9ja2VkIHRoZSBTUUxpdGVEYXRhYmFzZQorICAgICAqIG9iamVjdCBhbmQgc3FsaXRlIHdpbGwgY29uc2lkZXIgdGhpcyBxdWVyeSB0byBiZSBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIGJ1dCBpZiB0aHJlYWQgIyAxIHVzZXMgYmVnaW5UcmFuc2FjdGlvbigpIGluc3RlYWQgb2YgZXhlY1NRTCgpIHRvIHN0YXJ0IHRyYW5zYWN0aW9uLAorICAgICAqIHRoZW4gVGhyZWFkICMgMidzIHF1ZXJ5IHdpbGwgaGF2ZSBiZWVuIGJsb2NrZWQgYnkgamF2YSBsYXllcgorICAgICAqIHVudGlsIFRocmVhZCMxIGVuZHMgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjU3FsVG9TdGFydEFuZEVuZFRyYW5zYWN0aW9uKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgcnVuRXhlY1NxbFRvU3RhcnRBbmRFbmRUcmFuc2FjdGlvbigiRU5EIik7CisgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUsIGluc3RlYWQgbm93IGRvICJDT01NSVQiIG9yICJST0xMQkFDSyIgaW5zdGVhZCBvZiAiRU5EIiB0cmFuc2FjdGlvbgorICAgICAgICBydW5FeGVjU3FsVG9TdGFydEFuZEVuZFRyYW5zYWN0aW9uKCJDT01NSVQiKTsKKyAgICAgICAgcnVuRXhlY1NxbFRvU3RhcnRBbmRFbmRUcmFuc2FjdGlvbigiUk9MTEJBQ0siKTsKKyAgICB9CisgICAgcHJpdmF0ZSB2b2lkIHJ1bkV4ZWNTcWxUb1N0YXJ0QW5kRW5kVHJhbnNhY3Rpb24oU3RyaW5nIHN0cikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIC8vIGRpc2FibGUgV0FMIGp1c3Qgc28gcXVlcmllcyBhbmQgdXBkYXRlcyB1c2UgdGhlIHNhbWUgZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAgICBtRGF0YWJhc2UuZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpOworICAgICAgICAvLyBldmVuIHRob3VnaCBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpIGlzIG5vdCBjYWxsZWQgdG8gc3RhcnQgdHJhbnNhY3Rpb24sCisgICAgICAgIC8vIG1EYXRhYmFzZSBjb25uZWN0aW9uIHNob3VsZCBub3cgYmUgaW4gdHJhbnNhY3Rpb24gYXMgYSByZXN1bHQgb2YKKyAgICAgICAgLy8gbURhdGFiYXNlLmV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIikKKyAgICAgICAgLy8gYnV0IG1EYXRhYmFzZS5tTG9jayBzaG91bGQgbm90IGJlIGhlbGQgYnkgYW55IHRocmVhZAorICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5pblRyYW5zYWN0aW9uKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzRGJMb2NrZWRCeU90aGVyVGhyZWFkcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UuYW1JSW5UcmFuc2FjdGlvbigpKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAsIDk5OSk7Iik7CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5T3RoZXJUaHJlYWRzKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5hbUlJblRyYW5zYWN0aW9uKCkpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmFtSUluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDk5OSwgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkoZ2V0RGIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgaiBmcm9tICIgKyBURVNUX1RBQkxFICsgIiBXSEVSRSBpID0gMTAiLCBudWxsKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShnZXREYigpLmluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZ2V0RGIoKS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGdldERiKCkuaXNEYkxvY2tlZEJ5T3RoZXJUaHJlYWRzKCkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmFtSUluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgdC5qb2luKCk7CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmFtSUluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5T3RoZXJUaHJlYWRzKCkpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTChzdHIpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuYW1JSW5UcmFuc2FjdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5T3RoZXJUaHJlYWRzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdGhlIGZvbGxvd2luZworICAgICAqIGh0dHA6Ly9iL2lzc3VlP2lkPTI4NzEwMzcKKyAgICAgKiAgICAgICAgICBDdXJzb3IgY3Vyc29yID0gZGIucXVlcnkoLi4uKTsKKyAgICAgKiAgICAgICAgICAvLyB3aXRoIFdBTCBlbmFibGVkLCB0aGUgYWJvdmUgdXNlcyBhIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICogICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbigpCisgICAgICogICAgICAgICAgdHJ5IHsKKyAgICAgKiAgICAgICAgICAgIGRiLmluc2VydCguLi4uLi4pOworICAgICAqICAgICAgICAgICAgY3Vyc29yLnJlcXVlcnkoKTsKKyAgICAgKiAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBjdXJzb3IgdXNlcyBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbiwgdGhlIGFib3ZlIHJlcXVlcnkKKyAgICAgKiAgICAgICAgICAgIC8vIHdpbGwgbm90IHJldHVybiB0aGUgcmVzdWx0cyB0aGF0IHdlcmUgaW5zZXJ0ZWQgYWJvdmUgc2luY2UgdGhlIGluc2VydCBpcworICAgICAqICAgICAgICAgICAgLy8gZG9uZSB1c2luZyBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gQU5EIHRoZSB0cmFuc2FjdGlvbiBpcyBub3QgY29tbWl0dGVkIHlldC4KKyAgICAgKiAgICAgICAgICAgIC8vIGZpeCBpcyB0byBtYWtlIHRoZSBhYm92ZSBjdXJzb3IgdXNlIHRoZSBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gLSBhbmQgTk9UCisgICAgICogICAgICAgICAgICAvLyB0aGUgcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgKiAgICAgICAgICAgIGRiLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpCisgICAgICogICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgKiAgICAgICAgICAgIGRiLmVuZFRyYW5zYWN0aW9uKCkKKyAgICAgKiAgICAgICAgICB9CisgICAgICoKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2FjdGlvbkFuZFdhbEludGVycGxheTEoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAsIDk5OSk7Iik7CisgICAgICAgIFN0cmluZyBzcWwgPSAic2VsZWN0ICogZnJvbSAiICsgVEVTVF9UQUJMRTsKKyAgICAgICAgQ3Vyc29yIGMgPSBtRGF0YWJhc2UucmF3UXVlcnkoc3FsLCBudWxsKTsKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgMSByb3cgaW4gdGhlIHRhYmxlCisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAwLCA5OTA5KTsiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRSwgbnVsbCkpOworICAgICAgICAgICAgLy8gcmVxdWVyeSBvbiB0aGUgcHJldmlvdXNseSBvcGVuZWQgY3Vyc29yCisgICAgICAgICAgICAvLyBjdXJzb3Igc2hvdWxkIG5vdyB1c2UgdGhlIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgc2VlIDIgcm93cworICAgICAgICAgICAgYy5yZXF1ZXJ5KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICB9CisgICAgICAgIGMuY2xvc2UoKTsKKworICAgICAgICAvLyBkbyB0aGUgc2FtZSB0ZXN0IGJ1dCBub3cgZG8gdGhlIHJlcXVlcnkgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuCisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMCwgOTk5KTsiKTsKKyAgICAgICAgZmluYWwgQ3Vyc29yIGMxID0gbURhdGFiYXNlLnJhd1F1ZXJ5KCJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRSwgbnVsbCk7CisgICAgICAgIC8vIHNob3VsZCBoYXZlIDEgcm93IGluIHRoZSB0YWJsZQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYzEuZ2V0Q291bnQoKSk7CisgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMDAsIDk5MDkpOyIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KG1EYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFLCBudWxsKSk7CisgICAgICAgICAgICAvLyBxdWVyeSBpbiBhIGRpZmZlcmVudCB0aHJlYWQuIHRoYXQgY2F1c2VzIHRoZSBjdXJzb3IgdG8gdXNlIGEgcG9vbGVkIGNvbm5lY3Rpb24KKyAgICAgICAgICAgIC8vIGFuZCBzaW5jZSB0aGlzIHRocmVhZCBoYXNuJ3QgY29tbWl0dGVkIGl0cyBjaGFuZ2VzLCB0aGUgY3Vyc29yIHNob3VsZCBzdGlsbCBzZWUgb25seQorICAgICAgICAgICAgLy8gMSByb3cKKyAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBjMS5yZXF1ZXJ5KCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBjMS5nZXRDb3VudCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgICAgICAvLyBzaG91bGQgYmUgMiByb3dzIG5vdyAtIGluY2x1ZGluZyB0aGUgdGhlIHJvdyBpbnNlcnRlZCBhYm92ZQorICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgYzEuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QgaXMgc2FtZSBhcyB7QGxpbmsgI3Rlc3RUcmFuc2FjdGlvbkFuZFdhbEludGVycGxheTEoKX0gZXhjZXB0IHRoZSBmb2xsb3dpbmc6CisgICAgICogaW5zdGVhZCBvZiBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpLCB1c2UgZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKQorICAgICAqIGFuZCBpbnN0ZWFkIG9mIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpLCB1c2UgZXhlY1NRTCgiRU5EIik7CisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2FjdGlvbkFuZFdhbEludGVycGxheTIoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAsIDk5OSk7Iik7CisgICAgICAgIFN0cmluZyBzcWwgPSAic2VsZWN0ICogZnJvbSAiICsgVEVTVF9UQUJMRTsKKyAgICAgICAgQ3Vyc29yIGMgPSBtRGF0YWJhc2UucmF3UXVlcnkoc3FsLCBudWxsKTsKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgMSByb3cgaW4gdGhlIHRhYmxlCisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwMCwgOTkwOSk7Iik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkobURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEUsIG51bGwpKTsKKyAgICAgICAgICAgIC8vIHJlcXVlcnkgb24gdGhlIHByZXZpb3VzbHkgb3BlbmVkIGN1cnNvcgorICAgICAgICAgICAgLy8gY3Vyc29yIHNob3VsZCBub3cgdXNlIHRoZSBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIHNlZSAyIHJvd3MKKyAgICAgICAgICAgIGMucmVxdWVyeSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY29tbWl0OyIpOworICAgICAgICB9CisgICAgICAgIGMuY2xvc2UoKTsKKworICAgICAgICAvLyBkbyB0aGUgc2FtZSB0ZXN0IGJ1dCBub3cgZG8gdGhlIHJlcXVlcnkgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuCisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMCwgOTk5KTsiKTsKKyAgICAgICAgZmluYWwgQ3Vyc29yIGMxID0gbURhdGFiYXNlLnJhd1F1ZXJ5KCJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRSwgbnVsbCk7CisgICAgICAgIC8vIHNob3VsZCBoYXZlIDEgcm93IGluIHRoZSB0YWJsZQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYzEuZ2V0Q291bnQoKSk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAwLCA5OTA5KTsiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRSwgbnVsbCkpOworICAgICAgICAgICAgLy8gcXVlcnkgaW4gYSBkaWZmZXJlbnQgdGhyZWFkLiBidXQgc2luY2UgdGhlIHRyYW5zYWN0aW9uIGlzIHN0YXJ0ZWQgdXNpbmcKKyAgICAgICAgICAgIC8vIGV4ZWNTUSgpIGluc3RlYWQgb2YgYmVnaW5UcmFuc2FjdGlvbigpLCBjdXJzb3IncyBxdWVyeSBpcyBjb25zaWRlcmVkIHBhcnQgb2YKKyAgICAgICAgICAgIC8vIHRoZSBzYW1lIHRyYW5zYWN0aW9uIC0gYW5kIGhlbmNlIGl0IHNob3VsZCBzZWUgdGhlIGFib3ZlIGluc2VydGVkIHJvdworICAgICAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGMxLnJlcXVlcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMxLmdldENvdW50KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgICAgIC8vIHNob3VsZCBiZSAyIHJvd3Mgbm93IC0gaW5jbHVkaW5nIHRoZSB0aGUgcm93IGluc2VydGVkIGFib3ZlCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY29tbWl0Iik7CisgICAgICAgIH0KKyAgICAgICAgYzEuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QgaXMgc2FtZSBhcyB7QGxpbmsgI3Rlc3RUcmFuc2FjdGlvbkFuZFdhbEludGVycGxheTIoKX0gZXhjZXB0IHRoZSBmb2xsb3dpbmc6CisgICAgICogaW5zdGVhZCBvZiBjb21taXR0aW5nIHRoZSBkYXRhLCBkbyByb2xsYmFjayBhbmQgbWFrZSBzdXJlIHRoZSBkYXRhIHNlZW4gYnkgdGhlIHF1ZXJ5CisgICAgICogd2l0aGluIHRoZSB0cmFuc2FjdGlvbiBpcyBub3cgZ29uZS4KKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zYWN0aW9uQW5kV2FsSW50ZXJwbGF5MygpIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwLCA5OTkpOyIpOworICAgICAgICBTdHJpbmcgc3FsID0gInNlbGVjdCAqIGZyb20gIiArIFRFU1RfVEFCTEU7CisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KHNxbCwgbnVsbCk7CisgICAgICAgIC8vIHNob3VsZCBoYXZlIDEgcm93IGluIHRoZSB0YWJsZQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMDAsIDk5MDkpOyIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KG1EYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFLCBudWxsKSk7CisgICAgICAgICAgICAvLyByZXF1ZXJ5IG9uIHRoZSBwcmV2aW91c2x5IG9wZW5lZCBjdXJzb3IKKyAgICAgICAgICAgIC8vIGN1cnNvciBzaG91bGQgbm93IHVzZSB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBzZWUgMiByb3dzCisgICAgICAgICAgICBjLnJlcXVlcnkoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBjLmdldENvdW50KCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gcm9sbGJhY2sgdGhlIGNoYW5nZQorICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoInJvbGxiYWNrOyIpOworICAgICAgICB9CisgICAgICAgIC8vIHNpbmNlIHRoZSBjaGFuZ2UgaXMgcm9sbGVkIGJhY2ssIGRvIHRoZSBzYW1lIHF1ZXJ5IGFnYWluIGFuZCBzaG91bGQgbm93IGZpbmQgb25seSAxIHJvdworICAgICAgICBjLnJlcXVlcnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFLCBudWxsKSk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBodHRwOi8vYi9pc3N1ZT9pZD0yOTQzMDI4CisgICAgICogU1FMaXRlT3BlbkhlbHBlciBtYWludGFpbnMgYSBTaW5nbGV0b24gZXZlbiBpZiBpdCBpcyBpbiBiYWQgc3RhdGUuCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZUFuZFJlb3BlbigpIHsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIFRlc3RPcGVuSGVscGVyIGhlbHBlciA9IG5ldyBUZXN0T3BlbkhlbHBlcihnZXRDb250ZXh0KCksIERCX05BTUUsIG51bGwsCisgICAgICAgICAgICAgICAgQ1VSUkVOVF9EQVRBQkFTRV9WRVJTSU9OLCBuZXcgRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyKCkpOworICAgICAgICBtRGF0YWJhc2UgPSBoZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAsIDk5OSk7Iik7CisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnF1ZXJ5KFRFU1RfVEFCTEUsIG5ldyBTdHJpbmdbXXsiaSIsICJqIn0sIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgYy5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzT3BlbigpKTsKKyAgICAgICAgbURhdGFiYXNlID0gaGVscGVyLmdldFJlYWRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UuaXNPcGVuKCkpOworICAgICAgICBjID0gbURhdGFiYXNlLnF1ZXJ5KFRFU1RfVEFCTEUsIG5ldyBTdHJpbmdbXXsiaSIsICJqIn0sIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgYy5jbG9zZSgpOworICAgIH0KKyAgICBwcml2YXRlIGNsYXNzIFRlc3RPcGVuSGVscGVyIGV4dGVuZHMgU1FMaXRlT3BlbkhlbHBlciB7CisgICAgICAgIHB1YmxpYyBUZXN0T3BlbkhlbHBlcihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbmFtZSwgZmFjdG9yeSwgdmVyc2lvbiwgZXJyb3JIYW5kbGVyKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25DcmVhdGUoU1FMaXRlRGF0YWJhc2UgZGIpIHt9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBvblVwZ3JhZGUoU1FMaXRlRGF0YWJhc2UgZGIsIGludCBvbGRWZXJzaW9uLCBpbnQgbmV3VmVyc2lvbikge30KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlR2VuZXJhbFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVHZW5lcmFsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjdjY2NlLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVHZW5lcmFsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QuRmxha3lUZXN0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBTUUxpdGVHZW5lcmFsVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKLSAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKLSAgICBCb29sZWFuIGV4Y2VwdGlvblJlY3ZkID0gZmFsc2U7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBleGNlcHRpb25SZWN2ZCA9IGZhbHNlOwotICAgICAgICBGaWxlIGRiRGlyID0gZ2V0Q29udGV4dCgpLmdldERpcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7Ci0gICAgICAgIG1EYXRhYmFzZUZpbGUgPSBuZXcgRmlsZShkYkRpciwgImRhdGFiYXNlX3Rlc3QuZGIiKTsKLSAgICAgICAgaWYgKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbURhdGFiYXNlID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZS5nZXRQYXRoKCksIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7Ci0gICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VPZlNhbWVTcWxTdGF0ZW1lbnRCeTJUaHJlYWRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdF9wc3RtdCAoaSBJTlRFR0VSIFBSSU1BUlkgS0VZLCBqIHRleHQpOyIpOwotCi0gICAgICAgIC8vIHRocmVhZCAxIGNyZWF0ZXMgYSBwcmVwYXJlZCBzdGF0ZW1lbnQKLSAgICAgICAgZmluYWwgU3RyaW5nIHN0bXQgPSAiU0VMRUNUICogRlJPTSB0ZXN0X3BzdG10IFdIRVJFIGkgPSA/IjsKLQotICAgICAgICAvLyBzdGFydCAyIHRocmVhZHMgdG8gZG8gcmVwZWF0ZWRseSBleGVjdXRlICJzdG10IgotICAgICAgICAvLyBzaW5jZSB0aGVzZSAyIHRocmVhZHMgYXJlIGV4ZWN1dGluZyB0aGUgc2FtZSBzcWwsIHRoZXkgZWFjaCBzaG91bGQgZ2V0Ci0gICAgICAgIC8vIHRoZWlyIG93biBjb3B5IGFuZAotICAgICAgICAvLyB0aGVyZSBTSE9VTEQgTk9UIGJlIGFuIGVycm9yIGZyb20gc3FsaXRlOiAicHJlcGFyZWQgc3RhdGVtZW50IGlzIGJ1c3kiCi0gICAgICAgIGNsYXNzIFJ1blN0bXRUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE4gPSAxMDAwOwotICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBtYW55IHRpbWVzCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzMSA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KHN0bXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgczEuYmluZExvbmcoMSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzMS5leGVjdXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzMS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiU1FMaXRlRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgicmFuZG9tIHVuZXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFJ1blN0bXRUaHJlYWQgdDEgPSBuZXcgUnVuU3RtdFRocmVhZCgpOwotICAgICAgICB0MS5zdGFydCgpOwotICAgICAgICBSdW5TdG10VGhyZWFkIHQyID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKLSAgICAgICAgdDIuc3RhcnQoKTsKLSAgICAgICAgd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBGbGFreVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlT2ZTYW1lUHJlcGFyZWRTdGF0ZW1lbnRCeTJUaHJlYWRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdF9wc3RtdCAoaSBJTlRFR0VSIFBSSU1BUlkgS0VZLCBqIHRleHQpOyIpOwotCi0gICAgICAgIC8vIHRocmVhZCAxIGNyZWF0ZXMgYSBwcmVwYXJlZCBzdGF0ZW1lbnQKLSAgICAgICAgZmluYWwgU3RyaW5nIHN0bXQgPSAiU0VMRUNUICogRlJPTSB0ZXN0X3BzdG10IFdIRVJFIGkgPSA/IjsKLSAgICAgICAgZmluYWwgU1FMaXRlU3RhdGVtZW50IHMxID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3RtdCk7Ci0KLSAgICAgICAgLy8gc3RhcnQgMiB0aHJlYWRzIHRvIGRvIHJlcGVhdGVkbHkgZXhlY3V0ZSAic3RtdCIKLSAgICAgICAgLy8gc2luY2UgdGhlc2UgMiB0aHJlYWRzIGFyZSBleGVjdXRpbmcgdGhlIHNhbWUgcHJlcGFyZWQgc3RhdGVtZW50LAotICAgICAgICAvLyBzaG91bGQgc2VlIGFuIGVycm9yIGZyb20gc3FsaXRlOiAicHJlcGFyZWQgc3RhdGVtZW50IGlzIGJ1c3kiCi0gICAgICAgIGNsYXNzIFJ1blN0bXRUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE4gPSAxMDAwOwotICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBtYW55IHRpbWVzCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMxLmJpbmRMb25nKDEsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgczEuZXhlY3V0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0IGl0Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoImxpYnJhcnkgcm91dGluZSBjYWxsZWQgb3V0IG9mIHNlcXVlbmNlOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uUmVjdmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgicmFuZG9tIHVuZXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFJ1blN0bXRUaHJlYWQgdDEgPSBuZXcgUnVuU3RtdFRocmVhZCgpOwotICAgICAgICB0MS5zdGFydCgpOwotICAgICAgICBSdW5TdG10VGhyZWFkIHQyID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKLSAgICAgICAgdDIuc3RhcnQoKTsKLSAgICAgICAgd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGV4Y2VwdGlvblJlY3ZkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlU3RhdGVtZW50VGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTUzMzZhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVTdGF0ZW1lbnRUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKKyAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgRmlsZSBkYkRpciA9IGdldENvbnRleHQoKS5nZXREaXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSwgQ29udGV4dC5NT0RFX1BSSVZBVEUpOworICAgICAgICBtRGF0YWJhc2VGaWxlID0gbmV3IEZpbGUoZGJEaXIsICJkYXRhYmFzZV90ZXN0LmRiIik7CisgICAgICAgIGlmIChtRGF0YWJhc2VGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZSA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUuZ2V0UGF0aCgpLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGF0YWJhc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IDIgdGhyZWFkcyB0byByZXBlYXRlZGx5IGV4ZWN1dGUgdGhlIGFib3ZlIFNRTCBzdGF0ZW1lbnQuCisgICAgICogRXZlbiB0aG91Z2ggMiB0aHJlYWRzIGFyZSBleGVjdXRpbmcgdGhlIHNhbWUgU1FMLCB0aGV5IGVhY2ggc2hvdWxkIGdldCB0aGVpciBvd24gY29weSBvZgorICAgICAqIHByZXBhcmVkIFNRTCBzdGF0ZW1lbnQgaWQgYW5kIHRoZXJlIFNIT1VMRCBOT1QgYmUgYW4gZXJyb3IgZnJvbSBzcWxpdGUgb3IgYW5kcm9pZC4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHRocm93biBpZiB0aGUgdGVzdCB0aHJlYWRzIHN0YXJ0ZWQgYnkgdGhpcyB0ZXN0IGFyZSBpbnRlcnJ1cHRlZAorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlT2ZTYW1lU3FsU3RhdGVtZW50QnkyVGhyZWFkcygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdF9wc3RtdCAoaSBJTlRFR0VSIFBSSU1BUlkgS0VZLCBqIHRleHQpOyIpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3RtdCA9ICJTRUxFQ1QgKiBGUk9NIHRlc3RfcHN0bXQgV0hFUkUgaSA9ID8iOworICAgICAgICBjbGFzcyBSdW5TdG10VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgLy8gZG8gaXQgZW5vdWdoIHRpbWVzIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gY29ybmVyIGNhc2VzIGdvaW5nIHVudGVzdGVkCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHMxID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3RtdCk7CisgICAgICAgICAgICAgICAgICAgIHMxLmJpbmRMb25nKDEsIGkpOworICAgICAgICAgICAgICAgICAgICBzMS5leGVjdXRlKCk7CisgICAgICAgICAgICAgICAgICAgIHMxLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBSdW5TdG10VGhyZWFkIHQxID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKKyAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgUnVuU3RtdFRocmVhZCB0MiA9IG5ldyBSdW5TdG10VGhyZWFkKCk7CisgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgICB3aGlsZSAodDEuaXNBbGl2ZSgpIHx8IHQyLmlzQWxpdmUoKSkgeworICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMCk7CisgICAgICAgICB9CisgICAgIH0KKworICAgIC8qKgorICAgICAqIEEgc2ltcGxlIHRlc3Q6IHN0YXJ0IDIgdGhyZWFkcyB0byByZXBlYXRlZGx5IGV4ZWN1dGUgdGhlIHNhbWUge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH0uCisgICAgICogVGhlIDIgdGhyZWFkcyB0YWtlIHR1cm5zIHRvIHVzZSB0aGUge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH07IGkuZS4sIGl0IGlzIE5PVCBpbiB1c2UKKyAgICAgKiBieSBib3RoIHRoZSB0aHJlYWRzIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHRocm93biBpZiB0aGUgdGVzdCB0aHJlYWRzIHN0YXJ0ZWQgYnkgdGhpcyB0ZXN0IGFyZSBpbnRlcnJ1cHRlZAorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlT2ZTYW1lU3FsaXRlU3RhdGVtZW50QnkyVGhyZWFkcygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdF9wc3RtdCAoaSBJTlRFR0VSIFBSSU1BUlkgS0VZLCBqIHRleHQpOyIpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3RtdCA9ICJTRUxFQ1QgKiBGUk9NIHRlc3RfcHN0bXQgV0hFUkUgaSA9ID8iOworICAgICAgICBmaW5hbCBTUUxpdGVTdGF0ZW1lbnQgczEgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudChzdG10KTsKKyAgICAgICAgY2xhc3MgUnVuU3RtdFRocmVhZCBleHRlbmRzIFRocmVhZCB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIC8vIGRvIGl0IGVub3VnaCB0aW1lcyB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGNvcm5lciBjYXNlcyBnb2luZyB1bnRlc3RlZAorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMxLmJpbmRMb25nKDEsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgczEuZXhlY3V0ZSgpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnlpZWxkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFJ1blN0bXRUaHJlYWQgdDEgPSBuZXcgUnVuU3RtdFRocmVhZCgpOworICAgICAgICB0MS5zdGFydCgpOworICAgICAgICBSdW5TdG10VGhyZWFkIHQyID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKKyAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqIFN5bmNocm9uaXplIG9uIHRoaXMgd2hlbiBhY2Nlc3NpbmcgdGhlIFNxbGl0ZVN0YXRlbWV0IGluIHRoZSBhYm92ZSAqLworICAgIHByaXZhdGUgZmluYWwgUmVlbnRyYW50TG9jayBtTG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKHRydWUpOworICAgIHByaXZhdGUgdm9pZCBsb2NrKCkgeworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgfQorICAgIHByaXZhdGUgdm9pZCB1bmxvY2soKSB7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoZSBmb2xsb3dpbmc6IGEge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH0gb2JqZWN0IHNob3VsZCBub3QgcmVmZXIgdG8gYQorICAgICAqIHByZS1jb21waWxlZCBTUUwgc3RhdGVtZW50IGlkIGV4Y2VwdCBpbiBkdXJpbmcgdGhlIHBlcmlvZCBvZiBiaW5kaW5nIHRoZSBhcmd1bWVudHMKKyAgICAgKiBhbmQgZXhlY3V0aW5nIHRoZSBTUUwgc3RhdGVtZW50LgorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVmZXJlbmNlVG9QcmVjb21waWxlZFN0YXRlbWVudElkKCkgeworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIHQgKGkgaW50LCBqIHRleHQpOyIpOworICAgICAgICB2ZXJpZnlSZWZlcmVuY2VUb1ByZWNvbXBpbGVkU3RhdGVtZW50SWQoZmFsc2UpOworICAgICAgICB2ZXJpZnlSZWZlcmVuY2VUb1ByZWNvbXBpbGVkU3RhdGVtZW50SWQodHJ1ZSk7CisKKyAgICAgICAgLy8gYSBzbWFsbCBzdHJlc3MgdGVzdCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHNpZGUgZWZmZWN0cyBvZgorICAgICAgICAvLyB0aGUgYWNxdWlyZSAmIHJlbGVhc2Ugb2YgcHJlLWNvbXBpbGVkIHN0YXRlbWVudCBpZCBieSBTUUxpdGVTdGF0ZW1lbnQgb2JqZWN0LgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisgICAgICAgICAgICB2ZXJpZnlSZWZlcmVuY2VUb1ByZWNvbXBpbGVkU3RhdGVtZW50SWQoZmFsc2UpOworICAgICAgICAgICAgdmVyaWZ5UmVmZXJlbmNlVG9QcmVjb21waWxlZFN0YXRlbWVudElkKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5UmVmZXJlbmNlVG9QcmVjb21waWxlZFN0YXRlbWVudElkKGJvb2xlYW4gd2FsKSB7CisgICAgICAgIGlmICh3YWwpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICB9CisgICAgICAgIC8vIHRlc3Qgd2l0aCBJTlNFUlQgc3RhdGVtZW50IC0gZG9lc24ndCB1c2UgY29ubmVjdGlvbiBwb29sLCBpZiBXQUwgaXMgc2V0CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10ID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoImluc2VydCBpbnRvIHQgdmFsdWVzKD8sPyk7Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSwgc3RtdC5uSGFuZGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgc3RtdC5tRGF0YWJhc2UpOworICAgICAgICAvLyBzcWwgc3RhdGVtZW50IHNob3VsZCBub3QgYmUgY29tcGlsZWQgeWV0CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgaW50IGNvbFZhbHVlID0gbmV3IFJhbmRvbSgpLm5leHRJbnQoKTsKKyAgICAgICAgc3RtdC5iaW5kTG9uZygxLCBjb2xWYWx1ZSk7CisgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBzcWwgc3RhdGVtZW50IGlzIHN0aWxsIG5vdCBjb21waWxlZAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgLy8gc2hvdWxkIHN0aWxsIGJlIHVzaW5nIHRoZSBtRGF0YWJhc2UgY29ubmVjdGlvbiAtIHZlcmlmeQorICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICAgICAgc3RtdC5iaW5kU3RyaW5nKDIsICJibGFoIiArIGNvbFZhbHVlKTsKKyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIHNxbCBzdGF0ZW1lbnQgaXMgc3RpbGwgbm90IGNvbXBpbGVkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10LmdldFNxbFN0YXRlbWVudElkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICAgICAgc3RtdC5leGVjdXRlSW5zZXJ0KCk7CisgICAgICAgIC8vIG5vdyB0aGF0IHRoZSBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQsIHByZS1jb21waWxlZCBzdGF0ZW1lbnQgc2hvdWxkIGJlIHJlbGVhc2VkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIHN0bXQuY2xvc2UoKTsKKyAgICAgICAgLy8gcHJlLWNvbXBpbGVkIFNRTCBzdGF0ZW1lbnQgc2hvdWxkIHN0aWxsIHJlbWFpbiByZWxlYXNlZCBmcm9tIHRoaXMgb2JqZWN0CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgLy8gYnV0IHRoZSBkYXRhYmFzZSBoYW5kbGUgc2hvdWxkIHN0aWxsIGJlIHRoZSBzYW1lCisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKworICAgICAgICAvLyB0ZXN0IHdpdGggYSBTRUxFQ1Qgc3RhdGVtZW50IC0gdXNlcyBjb25uZWN0aW9uIHBvb2wgaWYgV0FMIGlzIHNldAorICAgICAgICBzdG10ID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoInNlbGVjdCBpIGZyb20gdCB3aGVyZSBqPT87Iik7CisgICAgICAgIC8vIHNxbCBzdGF0ZW1lbnQgc2hvdWxkIG5vdCBiZSBjb21waWxlZCB5ZXQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQublN0YXRlbWVudCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10LmdldFNxbFN0YXRlbWVudElkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICAgICAgc3RtdC5iaW5kU3RyaW5nKDEsICJibGFoIiArIGNvbFZhbHVlKTsKKyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIHNxbCBzdGF0ZW1lbnQgaXMgc3RpbGwgbm90IGNvbXBpbGVkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHN0YXRlbWVudAorICAgICAgICBMb25nIGwgPSBzdG10LnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29sVmFsdWUsIGwuaW50VmFsdWUoKSk7CisgICAgICAgIC8vIG5vdyB0aGF0IHRoZSBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQsIHByZS1jb21waWxlZCBzdGF0ZW1lbnQgc2hvdWxkIGJlIHJlbGVhc2VkCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIHN0bXQuY2xvc2UoKTsKKyAgICAgICAgLy8gcHJlLWNvbXBpbGVkIFNRTCBzdGF0ZW1lbnQgc2hvdWxkIHN0aWxsIHJlbWFpbiByZWxlYXNlZCBmcm9tIHRoaXMgb2JqZWN0CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgLy8gYnV0IHRoZSBkYXRhYmFzZSBoYW5kbGUgc2hvdWxkIHN0aWxsIHJlbWFpbiBhdHRhY2hlZCB0byB0aGUgc3RhdGVtZW50CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSwgc3RtdC5uSGFuZGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgc3RtdC5tRGF0YWJhc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVVbmZpbmFsaXplZEV4Y2VwdGlvblRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVVbmZpbmFsaXplZEV4Y2VwdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDIwMDVkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVVuZmluYWxpemVkRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2VUZXN0LkNsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworcHVibGljIGNsYXNzIFNRTGl0ZVVuZmluYWxpemVkRXhjZXB0aW9uVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7CisgICAgcHJpdmF0ZSBGaWxlIG1EYXRhYmFzZUZpbGU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAidGVzdEN1cnNvciI7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBGaWxlIGRiRGlyID0gZ2V0Q29udGV4dCgpLmdldERpcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBDb250ZXh0Lk1PREVfUFJJVkFURSk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUgPSBuZXcgRmlsZShkYkRpciwgIlVuZmluYWxpemVkRXhjZXB0aW9uVGVzdC5kYiIpOworICAgICAgICBpZiAobURhdGFiYXNlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2UgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2VGaWxlLmdldFBhdGgoKSwgbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobURhdGFiYXNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVuZmluYWxpemVkRXhjZXB0aW9uTm90RXhjcGVjdGVkKCkgeworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFICIgKyBUQUJMRV9OQU1FICsgIiAoaSBpbnQsIGogaW50KTsiKTsKKyAgICAgICAgLy8gdGhlIGFib3ZlIHN0YXRlbWVudCBzaG91bGQgYmUgaW4gU1FMaXRlRGF0YWJhc2UubVByb2dyYW1zCisgICAgICAgIC8vIGFuZCBzaG91bGQgYXV0b21hdGljYWxseSBiZSBmaW5hbGl6ZWQgd2hlbiBkYXRhYmFzZSBpcyBjbG9zZWQKKyAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5jbG9zZURhdGFiYXNlKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVuZmluYWxpemVkRXhjZXB0aW9uKCkgeworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFICIgKyBUQUJMRV9OQU1FICsgIiAoaSBpbnQsIGogaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlUGVuZGluZ1N0YXRlbWVudHMoKTsgLy8gY2xlYXJzIHRoZSBhYm92ZSBmcm9tIGZpbmFsaXplciBxdWV1ZSBpbiBtZGF0YWJhc2UKKyAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOworICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUobURhdGFiYXNlLCAic2VsZWN0ICogZnJvbSAiICArIFRBQkxFX05BTUUpOworICAgICAgICAvLyBzaW5jZSB0aGUgYWJvdmUgaXMgTk9UIGNsb3NlZCwgY2xvc2luZyBkYXRhYmFzZSBzaG91bGQgZmFpbAorICAgICAgICBtRGF0YWJhc2UubG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLmNsb3NlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgIGZhaWwoImV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChTUUxpdGVVbmZpbmFsaXplZE9iamVjdHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9MaW5rU29ja2V0VGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L0xpbmtTb2NrZXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3N2Q2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9MaW5rU29ja2V0VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1NvY2tldDsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0IExpbmtTb2NrZXQKKyAqLworcHVibGljIGNsYXNzIExpbmtTb2NrZXRUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMaW5rU29ja2V0IGxzOworCisgICAgICAgIGxzID0gbmV3IExpbmtTb2NrZXQoKTsKKyAgICAgICAgbHMuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExpbmtDYXBhYmlsaXRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTGlua0NhcGFiaWxpdGllcyBsYzsKKworICAgICAgICBsYyA9IG5ldyBMaW5rQ2FwYWJpbGl0aWVzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBsYy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgbGMuaXNFbXB0eSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvVXJpVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L1VyaVRlc3QuamF2YQppbmRleCBhNWZkYTIwLi5jOGFkNjBkIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvVXJpVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9VcmlUZXN0LmphdmEKQEAgLTI0LDYgKzI0LDkgQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBwdWJsaWMgY2xhc3MgVXJpVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIApAQCAtNTIsMjAgKzU1LDIwIEBACiAKICAgICBwcml2YXRlIHZvaWQgcGFyY2VsQW5kVW5wYXJjZWwoVXJpIHUpIHsKICAgICAgICAgUGFyY2VsIHAgPSBQYXJjZWwub2J0YWluKCk7Ci0JdHJ5IHsKLQkJVXJpLndyaXRlVG9QYXJjZWwocCwgdSk7Ci0JCXAuc2V0RGF0YVBvc2l0aW9uKDApOwotCQlhc3NlcnRFcXVhbHModSwgVXJpLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVcmkud3JpdGVUb1BhcmNlbChwLCB1KTsKKyAgICAgICAgICAgIHAuc2V0RGF0YVBvc2l0aW9uKDApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHUsIFVyaS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocCkpOwogCi0JCXAuc2V0RGF0YVBvc2l0aW9uKDApOwotCQl1ID0gdS5idWlsZFVwb24oKS5idWlsZCgpOyAgICAgICAgCi0JCVVyaS53cml0ZVRvUGFyY2VsKHAsIHUpOwotCQlwLnNldERhdGFQb3NpdGlvbigwKTsKLQkJYXNzZXJ0RXF1YWxzKHUsIFVyaS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocCkpOwotCX0KLQlmaW5hbGx5IHsKLQkJcC5yZWN5Y2xlKCk7Ci0JfQorICAgICAgICAgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgICAgICAgICB1ID0gdS5idWlsZFVwb24oKS5idWlsZCgpOworICAgICAgICAgICAgVXJpLndyaXRlVG9QYXJjZWwocCwgdSk7CisgICAgICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh1LCBVcmkuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHApKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIHAucmVjeWNsZSgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQFNtYWxsVGVzdApAQCAtMjgyLDYgKzI4NSwxNCBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoImQiLCB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXIoImMiKSk7CiAgICAgfQogCisgICAgLy8gaHR0cDovL2IvMjMzNzA0MgorICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SG9zdFdpdGhUcmFpbGluZ0RvdCgpIHsKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL2dvb2dsZS5jb20uL2IvYy9nIik7CisgICAgICAgIGFzc2VydEVxdWFscygiZ29vZ2xlLmNvbS4iLCB1cmkuZ2V0SG9zdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYi9jL2ciLCB1cmkuZ2V0UGF0aCgpKTsKKyAgICB9CisKICAgICBAU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNjaGVtZU9ubHkoKSB7CiAgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImVtcHR5OiIpOwpAQCAtNjAzLDQgKzYxNCwxMjIgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXIoImIiKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiIiwgdXJpLmdldFF1ZXJ5UGFyYW1ldGVyKCJjIikpOwogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlckVtcHR5S2V5KCkgeworICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20vPz1iIik7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIHVyaS5nZXRRdWVyeVBhcmFtZXRlcigiIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlckVtcHR5S2V5MigpIHsKKyAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8/YT1iJiZjPWQiKTsKKyAgICAgIGFzc2VydEVxdWFscygiIiwgdXJpLmdldFF1ZXJ5UGFyYW1ldGVyKCIiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyRW1wdHlLZXkzKCkgeworICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tPyIpOworICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXIoIiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnlQYXJhbWV0ZXJFbXB0eUtleTQoKSB7CisgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20/YT1iJiIpOworICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXIoIiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnlQYXJhbWV0ZXJzRW1wdHlLZXkoKSB7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8/PWImIik7CisgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXJzKCIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHZhbHVlcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCB2YWx1ZXMuZ2V0KDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB2YWx1ZXMuZ2V0KDEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnlQYXJhbWV0ZXJzRW1wdHlLZXkyKCkgeworICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20/Iik7CisgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXJzKCIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHZhbHVlcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHZhbHVlcy5nZXQoMCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlcnNFbXB0eUtleTMoKSB7CisgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20vP2E9YiYmYz1kIik7CisgICAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gdXJpLmdldFF1ZXJ5UGFyYW1ldGVycygiIik7CisgICAgICBhc3NlcnRFcXVhbHMoMSwgdmFsdWVzLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIiIsIHZhbHVlcy5nZXQoMCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlck5hbWVzKCkgeworICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vdGVzdD9hPTEiKTsKKyAgICAgICAgU2V0PFN0cmluZz4gbmFtZXMgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbmFtZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgbmFtZXMuaXRlcmF0b3IoKS5uZXh0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlck5hbWVzRW1wdHlLZXkoKSB7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8/YT14JiZjPXoiKTsKKyAgICAgICAgU2V0PFN0cmluZz4gbmFtZXMgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBuYW1lcy5pdGVyYXRvcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbmFtZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIiwgaXRlci5uZXh0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlck5hbWVzRW1wdHlLZXkyKCkgeworICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20vP2E9eCY9ZCZjPXoiKTsKKyAgICAgICAgU2V0PFN0cmluZz4gbmFtZXMgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBuYW1lcy5pdGVyYXRvcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbmFtZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIiwgaXRlci5uZXh0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlck5hbWVzRW1wdHlWYWx1ZXMoKSB7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8/YT1mb28mYj0mYz0iKTsKKyAgICAgICAgU2V0PFN0cmluZz4gbmFtZXMgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBuYW1lcy5pdGVyYXRvcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbmFtZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYyIsIGl0ZXIubmV4dCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnlQYXJhbWV0ZXJOYW1lc0VkZ2VDYXNlcygpIHsKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL2Zvbz9hPWJhciZiPWJhciZjPSYmZD1iYXomZSZmJmc9YnV6eiYmJmEmYj1iYXImaCIpOworICAgICAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IG5hbWVzLml0ZXJhdG9yKCk7CisgICAgICAgIGFzc2VydEVxdWFscyg5LCBuYW1lcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImUiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZiIsIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImgiLCBpdGVyLm5leHQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyTmFtZXNFc2NhcGVkS2V5cygpIHsKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tLz9hJTIwYj1mb28mYyUyMGQ9Iik7CisgICAgICAgIFNldDxTdHJpbmc+IG5hbWVzID0gdXJpLmdldFF1ZXJ5UGFyYW1ldGVyTmFtZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5hbWVzLnNpemUoKSk7CisgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IG5hbWVzLml0ZXJhdG9yKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSBiIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImMgZCIsIGl0ZXIubmV4dCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnlQYXJhbWV0ZXJFc2NhcGVkS2V5cygpIHsKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tLz9hJTIwYj1mb28mYyUyMGQ9Iik7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlcigiYSBiIik7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgdmFsdWUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJRdWVyeVBhcmFtZXRlcnMoKSB7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8/YT14JmI9eSZjPXoiKS5idWlsZFVwb24oKQorICAgICAgICAgICAgLmNsZWFyUXVlcnkoKS5hcHBlbmRRdWVyeVBhcmFtZXRlcigiZm9vIiwgImJhciIpLmJ1aWxkKCk7CisgICAgICAgIFNldDxTdHJpbmc+IG5hbWVzID0gdXJpLmdldFF1ZXJ5UGFyYW1ldGVyTmFtZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5hbWVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgbmFtZXMuaXRlcmF0b3IoKS5uZXh0KCkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9XZWJBZGRyZXNzVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L1dlYkFkZHJlc3NUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhZjM1ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9XZWJBZGRyZXNzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCitpbXBvcnQgYW5kcm9pZC5uZXQuV2ViQWRkcmVzczsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFdlYkFkZHJlc3NUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLy8gaHR0cDovL2IvMjMzNzA0MgorICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SG9zdFdpdGhUcmFpbGluZ0RvdCgpIHsKKyAgICAgICAgV2ViQWRkcmVzcyB3ZWJBZGRyZXNzID0gbmV3IFdlYkFkZHJlc3MoImh0dHA6Ly9nb29nbGUuY29tLi9iL2MvZyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdvb2dsZS5jb20uIiwgd2ViQWRkcmVzcy5tSG9zdCk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2IvYy9nIiwgd2ViQWRkcmVzcy5tUGF0aCk7CisgICAgfQorCisgICAgLy8gaHR0cDovL2IvMTAxMTYwMgorICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aFdpdGhvdXRMZWFkaW5nU2xhc2goKSB7CisgICAgICAgIFdlYkFkZHJlc3Mgd2ViQWRkcmVzcyA9IG5ldyBXZWJBZGRyZXNzKCJodHRwOi8vd3d3Lm15c3BhY2UuY29tP3NpPTEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3d3cubXlzcGFjZS5jb20iLCB3ZWJBZGRyZXNzLm1Ib3N0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvP3NpPTEiLCB3ZWJBZGRyZXNzLm1QYXRoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9vcy9NZW1vcnlGaWxlVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvb3MvTWVtb3J5RmlsZVRlc3QuamF2YQppbmRleCAwMDlhMGUyLi5lNjI3YmI0IDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9vcy9NZW1vcnlGaWxlVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL29zL01lbW9yeUZpbGVUZXN0LmphdmEKQEAgLTIzNyw1MSArMjM3LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNNZW1vcnlGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lbW9yeUZpbGUgZmlsZSA9IG5ldyBNZW1vcnlGaWxlKCJNZW1vcnlGaWxlVGVzdCIsIDEwMDAwMDApOwotICAgICAgICBGaWxlRGVzY3JpcHRvciBmZCA9IGZpbGUuZ2V0RmlsZURlc2NyaXB0b3IoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmZCk7Ci0gICAgICAgIGFzc2VydFRydWUoZmQudmFsaWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoTWVtb3J5RmlsZS5pc01lbW9yeUZpbGUoZmQpKTsKLSAgICAgICAgZmlsZS5jbG9zZSgpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKE1lbW9yeUZpbGUuaXNNZW1vcnlGaWxlKEZpbGVEZXNjcmlwdG9yLmluKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKE1lbW9yeUZpbGUuaXNNZW1vcnlGaWxlKEZpbGVEZXNjcmlwdG9yLm91dCkpOwotICAgICAgICBhc3NlcnRGYWxzZShNZW1vcnlGaWxlLmlzTWVtb3J5RmlsZShGaWxlRGVzY3JpcHRvci5lcnIpKTsKLQotICAgICAgICBGaWxlIHRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiTWVtb3J5RmlsZVRlc3QiLCIudG1wIiwgZ2V0Q29udGV4dCgpLmdldEZpbGVzRGlyKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGZpbGUpOwotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wRmlsZSk7Ci0gICAgICAgICAgICBGaWxlRGVzY3JpcHRvciBmaWxlRmQgPSBvdXQuZ2V0RkQoKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZmlsZUZkKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKE1lbW9yeUZpbGUuaXNNZW1vcnlGaWxlKGZpbGVGZCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0ZW1wRmlsZS5kZWxldGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZURlc2NyaXB0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVtb3J5RmlsZSBmaWxlID0gbmV3IE1lbW9yeUZpbGUoIk1lbW9yeUZpbGVUZXN0IiwgMTAwMDAwMCk7Ci0gICAgICAgIE1lbW9yeUZpbGUgcmVmID0gbmV3IE1lbW9yeUZpbGUoZmlsZS5nZXRGaWxlRGVzY3JpcHRvcigpLCBmaWxlLmxlbmd0aCgpLCAiciIpOwotICAgICAgICBieXRlW10gYnVmZmVyOwotCi0gICAgICAgIC8vIHdyaXRlIHRvIG9yaWdpbmFsLCByZWFkIGZyb20gcmVmZXJlbmNlCi0gICAgICAgIGZpbGUud3JpdGVCeXRlcyh0ZXN0U3RyaW5nLCAwLCAyMDAwLCB0ZXN0U3RyaW5nLmxlbmd0aCk7Ci0gICAgICAgIGJ1ZmZlciA9IG5ldyBieXRlW3Rlc3RTdHJpbmcubGVuZ3RoXTsKLSAgICAgICAgcmVmLnJlYWRCeXRlcyhidWZmZXIsIDIwMDAsIDAsIHRlc3RTdHJpbmcubGVuZ3RoKTsKLSAgICAgICAgY29tcGFyZUJ1ZmZlcnModGVzdFN0cmluZywgYnVmZmVyLCB0ZXN0U3RyaW5nLmxlbmd0aCk7Ci0KLSAgICAgICAgZmlsZS5jbG9zZSgpOwotICAgICAgICByZWYuY2xvc2UoKTsgIC8vIERvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcsIHNpbmNlIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgbm90IGR1cCgyKTplZAotICAgIH0KLQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSB0ZXN0U3RyaW5nID0gbmV3IGJ5dGVbXSB7CiAgICAgICAgIDMsIDEsIDQsIDEsIDUsIDksIDIsIDYsIDUsIDMsIDUsIDgsIDksIDcsIDksIDMsIDIsIDMsIDgsIDQsIDYsIDIsIDYsIDQsIDMsIDMsIDgsIDMsIDIsIDcsIDksIDUsIDAsIDIsIDgsIDgsIDQsIDEsIDksIDcsIDEsIDYsIDksIDMsIDksIDksIDMsIDcsIDUsIDEsIDAsIDUsIDgsIDIsIDAsIDksIDcsIDQsIDksIDQsIDQsIDUsIDksIDIsIDMsIDAsIDcsIDgsIDEsIDYsIDQsCiAgICAgICAgIDAsIDYsIDIsIDgsIDYsIDIsIDAsIDgsIDksIDksIDgsIDYsIDIsIDgsIDAsIDMsIDQsIDgsIDIsIDUsIDMsIDQsIDIsIDEsIDEsIDcsIDAsIDYsIDcsIDksIDgsIDIsIDEsIDQsIDgsIDAsIDgsIDYsIDUsIDEsIDMsIDIsIDgsIDIsIDMsIDAsIDYsIDYsIDQsIDcsIDAsIDksIDMsIDgsIDQsIDQsIDYsIDAsIDksIDUsIDUsIDAsIDUsIDgsIDIsIDIsIDMsIDEsIDcsIDIsCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9vcy9NZXNzYWdlUXVldWVUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9vcy9NZXNzYWdlUXVldWVUZXN0LmphdmEKaW5kZXggYjdjMmQxZi4uZjgyYmZjZSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvb3MvTWVzc2FnZVF1ZXVlVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL29zL01lc3NhZ2VRdWV1ZVRlc3QuamF2YQpAQCAtNDEsNiArNDEsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIGlmICghbXNnLmlzSW5Vc2UoKSkgeworICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAibXNnLmlzSW51c2UgaXMgZmFsc2UsIHNob3VsZCBhbHdheXMgYmUgdHJ1ZSwgIyIgKyBtc2cud2hhdCkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1Db3VudCA8PSBtTGFzdE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICBpZiAobXNnLndoYXQgIT0gbUNvdW50KSB7CiAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCkBAIC05OSw1ICsxMDMsMTc0IEBACiAKICAgICAgICAgdGVzdGVyLmRvVGVzdCgxMDAwKTsKICAgICB9Ci19CiAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0RmllbGRJbnRlZ3JpdHlIYW5kbGVyIGV4dGVuZHMgVGVzdEhhbmRsZXJUaHJlYWQgeworICAgICAgICBIYW5kbGVyIG1IYW5kbGVyOworICAgICAgICBpbnQgbUxhc3RNZXNzYWdlOworICAgICAgICBpbnQgbUNvdW50OworCisgICAgICAgIHB1YmxpYyBUZXN0RmllbGRJbnRlZ3JpdHlIYW5kbGVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZ28oKSB7CisgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgICAgICAgICAgVGVzdEZpZWxkSW50ZWdyaXR5SGFuZGxlci50aGlzLmhhbmRsZU1lc3NhZ2UobXNnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKCFtc2cuaXNJblVzZSgpKSB7CisgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJtc2cuaXNJbnVzZSBpcyBmYWxzZSwgc2hvdWxkIGFsd2F5cyBiZSB0cnVlLCAjIiArIG1zZy53aGF0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUNvdW50IDw9IG1MYXN0TWVzc2FnZSkgeworICAgICAgICAgICAgICAgIGlmIChtc2cud2hhdCAhPSBtQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbWVzc2FnZSAjIiArIG1Db3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCByZWNlaXZlZCAjIiArIG1zZy53aGF0KSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQ291bnQgPT0gbUxhc3RNZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNvdW50Kys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSByZWNlaXZlZCBhZnRlciBkb25lLCAjIiArIG1zZy53aGF0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWVsZEludGVncml0eSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFRlc3RIYW5kbGVyVGhyZWFkIHRlc3RlciA9IG5ldyBUZXN0RmllbGRJbnRlZ3JpdHlIYW5kbGVyKCkgeworICAgICAgICAgICAgQnVuZGxlIG1CdW5kbGU7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGdvKCkgeworICAgICAgICAgICAgICAgIHN1cGVyLmdvKCk7CisgICAgICAgICAgICAgICAgbUxhc3RNZXNzYWdlID0gMTsKKyAgICAgICAgICAgICAgICBtQ291bnQgPSAwOworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoMCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICAgICAgc3VwZXIuaGFuZGxlTWVzc2FnZShtc2cpOworICAgICAgICAgICAgICAgIGlmIChtc2cud2hhdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy5mbGFncyA9IC0xOworICAgICAgICAgICAgICAgICAgICBtc2cud2hhdCA9IDE7CisgICAgICAgICAgICAgICAgICAgIG1zZy5hcmcxID0gNDU2OworICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMiA9IDc4OTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLm9iaiA9IHRoaXM7CisgICAgICAgICAgICAgICAgICAgIG1zZy5yZXBseVRvID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLmRhdGEgPSBtQnVuZGxlOworICAgICAgICAgICAgICAgICAgICBtc2cuZGF0YS5wdXRTdHJpbmcoImtleSIsICJ2YWx1ZSIpOworCisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbmV3TXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICBuZXdNc2cuY29weUZyb20obXNnKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy5pc0luVXNlKCkgIT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cuaXNJblVzZSBpcyB0cnVlIHNob3VsZCBiZSBmYWxzZSBhZnRlciBjb3B5RnJvbSIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobmV3TXNnLmZsYWdzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cuZmxhZ3MgaXMgJWQgc2hvdWxkIGJlIDAgYWZ0ZXIgY29weUZyb20iLCBuZXdNc2cuZmxhZ3MpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy53aGF0ICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld01zZy53aGF0IGlzICVkIHNob3VsZCBiZSAlZCBhZnRlciBjb3B5RnJvbSIsIG5ld01zZy53aGF0LCAxKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNc2cuYXJnMSAhPSA0NTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld01zZy5hcmcxIGlzICVkIHNob3VsZCBiZSAlZCBhZnRlciBjb3B5RnJvbSIsIG1zZy5hcmcxLCA0NTYpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy5hcmcyICE9IDc4OSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLmFyZzIgaXMgJWQgc2hvdWxkIGJlICVkIGFmdGVyIGNvcHlGcm9tIiwgbXNnLmFyZzIsIDc4OSkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobmV3TXNnLm9iaiAhPSB0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLm9iaiBzaG91bGQgYmUgJ3RoaXMnIGFmdGVyIGNvcHlGcm9tIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNc2cucmVwbHlUbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLnJlcGx5VG8gc2hvdWxkIGJlIG51bGwgYWZ0ZXIgY29weUZyb20iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy5kYXRhID09IG1CdW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cuZGF0YSBzaG91bGQgTk9UIGJlIG1CdW5kbGUgYWZ0ZXIgY29weUZyb20iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdNc2cuZGF0YS5nZXRTdHJpbmcoImtleSIpLmVxdWFscyhtQnVuZGxlLmdldFN0cmluZygia2V5IikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cuZGF0YS5nZXRTdHJpbmcoXCJrZXlcIikgaXMgJXMgYW5kIGRvZXMgbm90IGVxdWFsIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbUJ1bmRsZS5nZXRTdHJpbmcoXCJrZXlcIikgd2hpY2ggaXMgJXMgYWZ0ZXIgY29weUZyb20iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNc2cuZGF0YS5nZXRTdHJpbmcoImtleSIpLCAgbUJ1bmRsZS5nZXRTdHJpbmcoImtleSIpKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNc2cud2hlbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cud2hlbiBpcyAlZCBzaG91bGQgYmUgMCBhZnRlciBjb3B5RnJvbSIsIG5ld01zZy53aGVuKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNc2cudGFyZ2V0ICE9IG1IYW5kbGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLnRhcmdldCBpcyBOT1QgbUhhbmRsZXIgYWZ0ZXIgY29weUZyb20iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy5jYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLmNhbGxiYWNrIGlzIE5PVCBudWxsIGFmdGVyIGNvcHlGcm9tIikpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobmV3TXNnKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1zZy53aGF0ID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5pc0luVXNlKCkgIT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLmlzSW5Vc2UgaXMgZmFsc2Ugc2hvdWxkIGJlIHRydWUgYWZ0ZXIgd2hlbiBwcm9jZXNzaW5nICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5hcmcxICE9IDQ1NikgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLmFyZzEgaXMgJWQgc2hvdWxkIGJlICVkIHdoZW4gcHJvY2Vzc2luZyAjICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmFyZzEsIDQ1NiwgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5hcmcyICE9IDc4OSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLmFyZzIgaXMgJWQgc2hvdWxkIGJlICVkIHdoZW4gcHJvY2Vzc2luZyAjICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmFyZzIsIDc4OSwgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5vYmogIT0gdGhpcykgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLm9iaiBzaG91bGQgYmUgJ3RoaXMnIHdoZW4gcHJvY2Vzc2luZyAjICVkIiwgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5yZXBseVRvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZy5yZXBseVRvIHNob3VsZCBiZSBudWxsIHdoZW4gcHJvY2Vzc2luZyAjICVkIiwgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2cuZGF0YS5nZXRTdHJpbmcoImtleSIpLmVxdWFscyhtQnVuZGxlLmdldFN0cmluZygia2V5IikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2cuZGF0YS5nZXRTdHJpbmcoXCJrZXlcIikgaXMgJXMgYW5kIGRvZXMgbm90IGVxdWFsIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbUJ1bmRsZS5nZXRTdHJpbmcoXCJrZXlcIikgd2hpY2ggaXMgJXMgd2hlbiBwcm9jZXNzaW5nICMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuZGF0YS5nZXRTdHJpbmcoImtleSIpLCAgbUJ1bmRsZS5nZXRTdHJpbmcoImtleSIpLCBtc2cud2hhdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobXNnLndoZW4gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLndoZW4gaXMgJWQgc2hvdWxkIGJlIDAgd2hlbiBwcm9jZXNzaW5nICMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cud2hlbiwgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy50YXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLnRhcmdldCBpcyBOT1QgbnVsbCB3aGVuIHByb2Nlc3NpbmcgIyAlZCIsIG1zZy53aGF0KSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLmNhbGxiYWNrIGlzIE5PVCBudWxsIHdoZW4gcHJvY2Vzc2luZyAjICVkIiwgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgbXNnLndoYXQgaXMgJWQiICsgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHRlc3Rlci5kb1Rlc3QoMTAwMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRXhwb3J0ZXJUZXN0cy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRXhwb3J0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmVjNDYyLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEV4cG9ydGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzLkNvbnRhY3RFbnRyeTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzLlByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW07Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlscy5Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtLlR5cGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlscy5WQ2FyZFRlc3RzQmFzZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5JbTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5pY2tuYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTm90ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk9yZ2FuaXphdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvdG87Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5SZWxhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLldlYnNpdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFRlc3RzIGZvciB0aGUgY29kZSByZWxhdGVkIHRvIHZDYXJkIGV4cG9ydGVyLCBpbmN1bGRpbmcgdkNhcmQgY29tcG9zZXIuCi0gKiBUaGlzIHRlc3QgY2xhc3MgZGVwZW5kcyBvbiB2Q2FyZCBpbXBvcnRlciBjb2RlLCBzbyBpZiB0ZXN0cyBmb3IgdkNhcmQgaW1wb3J0ZXIgZmFpbCwKLSAqIHRoZSByZXN1bHQgb2YgdGhpcyBjbGFzcyB3aWxsIG5vdCBiZSByZWxpYWJsZS4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkRXhwb3J0ZXJUZXN0cyBleHRlbmRzIFZDYXJkVGVzdHNCYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gc1Bob3RvQnl0ZUFycmF5ID0KLSAgICAgICAgVkNhcmRJbXBvcnRlclRlc3RzLnNQaG90b0J5dGVBcnJheUZvckNvbXBsaWNhdGVkQ2FzZTsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVWMjEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWMjEpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFuZG8iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlJvaWQiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgIlJvaWQgQW5kbyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsICJBbmRvO1JvaWQ7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiQW5kbyIsICJSb2lkIiwgIiIsICIiLCAiIikpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVCYXNpYyhpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiQXBwcm9wcmlhdGVQcmVmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiRElTUExBWSBOQU1FIik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZTtBcHByb3ByaWF0ZUdpdmVuTmFtZTtBcHByb3ByaWF0ZU1pZGRsZU5hbWU7IgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVQcmVmaXg7QXBwcm9wcmlhdGVTdWZmaXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiQXBwcm9wcmlhdGVGYW1pbHlOYW1lIiwgIkFwcHJvcHJpYXRlR2l2ZW5OYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIsICJBcHByb3ByaWF0ZVByZWZpeCIsICJBcHByb3ByaWF0ZVN1ZmZpeCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwgIkRJU1BMQVkgTkFNRSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZUJhc2ljVjIxKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVCYXNpYyhWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZUJhc2ljVjMwKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVCYXNpYyhWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZUJhc2ljVjQwKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVCYXNpYyhWNDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhhdCBvbmx5ICJwcmltYXJ5IiBTdHJ1Y3R1cmVkTmFtZSBpcyBlbWl0dGVkLCBzbyB0aGF0IG91ciB2Q2FyZCBmaWxlCi0gICAgICogd2lsbCBub3QgY29uZnVzZSB0aGUgZXh0ZXJuYWwgaW1wb3J0ZXIsIGFzc3VtaW5nIHRoZXJlIG1heSBiZSBzb21lIGltcG9ydGVyCi0gICAgICogd2hpY2ggcHJlc3VtZSB0aGF0IHRoZXJlJ3Mgb25seSBvbmUgcHJvcGVydHkgdG93YXJkIGVhY2ggb2YgICJOIiwgIkZOIiwgZXRjLgotICAgICAqIE5vdGUgdGhhdCBtb3JlIHRoYW4gb25lICJOIiwgIkZOIiwgZXRjLiBwcm9wZXJ0aWVzIGFyZSBhY2NlcHRhYmxlIGluIHZDYXJkIHNwZWMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgZmluYWwgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0RmFtaWx5TmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkRvTm90RW1pdEdpdmVuTmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJEb05vdEVtaXRNaWRkbGVOYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEb05vdEVtaXRQcmVmaXgxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkRvTm90RW1pdFN1ZmZpeDEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiRG9Ob3RFbWl0RGlzcGxheU5hbWUxIik7Ci0KLSAgICAgICAgLy8gV2l0aCAiSVNfUFJJTUFSWT0xIi4gVGhpcyBpcyB3aGF0IHdlIHNob3VsZCB1c2UuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiQXBwcm9wcmlhdGVQcmVmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiQXBwcm9wcmlhdGVEaXNwbGF5TmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICAvLyBXaXRoICJJU19QUklNQVJZPTEiLCBidXQgd2Ugc2hvdWxkIGlnbm9yZSB0aGlzIHRpbWUsIHNpbmNlIHRoaXMgaXMgc2Vjb25kLCBub3QgZmlyc3QuCi0gICAgICAgIC8vIHZDYXJkIDIuMSBkb2VzIG5vdCBzcGVjaWZ5IGFueXRoaW5nIGFib3V0IHRoZSBudW1iZXIgb2YgTiBwcm9wZXJ0aWVzLiBXZSBjaG9vc2Ugbm90Ci0gICAgICAgIC8vIGVtaXR0aW5nIHRoaXMgcHJvcGVydHkuCi0gICAgICAgIC8vIHZDYXJkIDMuMCBkb2VzIChUaGVyZSBtdXN0IGJlIG9uZSBOIHByb3BlcnR5KQotICAgICAgICAvLyB2Q2FyZCA0LjAgKHJldjEzKSBkb2VzIChjYXJkaW5hbGl0eSAoMCwgMSkpLgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJEb05vdEVtaXRGYW1pbHlOYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0R2l2ZW5OYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkRvTm90RW1pdE1pZGRsZU5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRvTm90RW1pdFByZWZpeDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiRG9Ob3RFbWl0U3VmZml4MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJEb05vdEVtaXREaXNwbGF5TmFtZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSk7Ci0KLSAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lO0FwcHJvcHJpYXRlR2l2ZW5OYW1lO0FwcHJvcHJpYXRlTWlkZGxlTmFtZTsiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVByZWZpeDtBcHByb3ByaWF0ZVN1ZmZpeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBcHByb3ByaWF0ZUZhbWlseU5hbWUiLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIiwgIkFwcHJvcHJpYXRlUHJlZml4IiwgIkFwcHJvcHJpYXRlU3VmZml4IikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiQXBwcm9wcmlhdGVEaXNwbGF5TmFtZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlWMjEoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVVc2VQcmltYXJ5VjMwKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVVc2VQcmltYXJ5Q29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeVY0MCgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeUNvbW1vbihWNDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgb25seSAic3VwZXIgcHJpbWFyeSIgU3RydWN0dXJlZE5hbWUgaXMgZW1pdHRlZC4KLSAgICAgKiBTZWUgYWxzbyB0aGUgY29tbWVudCBpbiB7QGxpbmsgI3Rlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlDb21tb24oaW50KX0uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVN1cGVyUHJpbWFyeUNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBmaW5hbCBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJEb05vdEVtaXRGYW1pbHlOYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0R2l2ZW5OYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkRvTm90RW1pdE1pZGRsZU5hbWUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRvTm90RW1pdFByZWZpeDEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiRG9Ob3RFbWl0U3VmZml4MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJEb05vdEVtaXREaXNwbGF5MSIpOwotCi0gICAgICAgIC8vIFdpdGggIklTX1BSSU1BUlk9MSIsIGJ1dCB3ZSBzaG91bGQgaWdub3JlIHRoaXMgdGltZS4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0RmFtaWx5TmFtZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkRvTm90RW1pdEdpdmVuTmFtZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJEb05vdEVtaXRNaWRkbGVOYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEb05vdEVtaXRQcmVmaXgyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkRvTm90RW1pdFN1ZmZpeDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiRG9Ob3RFbWl0RGlzcGxheTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSk7Ci0KLSAgICAgICAgLy8gV2l0aCAiSVNfU1VQRVJfUFJJTUFSWT0xIi4gVGhpcyBpcyB3aGF0IHdlIHNob3VsZCB1c2UuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiQXBwcm9wcmlhdGVQcmVmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiQXBwcm9wcmlhdGVEaXNwbGF5TmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19TVVBFUl9QUklNQVJZLCAxKTsKLQotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJEb05vdEVtaXRGYW1pbHlOYW1lMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0R2l2ZW5OYW1lMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkRvTm90RW1pdE1pZGRsZU5hbWUzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRvTm90RW1pdFByZWZpeDMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiRG9Ob3RFbWl0U3VmZml4MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJEb05vdEVtaXREaXNwbGF5MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICBmaW5hbCBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZTtBcHByb3ByaWF0ZUdpdmVuTmFtZTtBcHByb3ByaWF0ZU1pZGRsZU5hbWU7IgotICAgICAgICAgICAgICAgICsgIkFwcHJvcHJpYXRlUHJlZml4O0FwcHJvcHJpYXRlU3VmZml4IiwKLSAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBcHByb3ByaWF0ZUZhbWlseU5hbWUiLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIsICJBcHByb3ByaWF0ZVByZWZpeCIsICJBcHByb3ByaWF0ZVN1ZmZpeCIpKTsKLQotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiQXBwcm9wcmlhdGVEaXNwbGF5TmFtZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVN1cGVyUHJpbWFyeVYyMSgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lVXNlU3VwZXJQcmltYXJ5Q29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlU3VwZXJQcmltYXJ5VjMwKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVVc2VTdXBlclByaW1hcnlDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVVc2VTdXBlclByaW1hcnlWNDAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVN1cGVyUHJpbWFyeUNvbW1vbihWNDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHBob25ldGljIG5hbWVzIGZpZWxkIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4KLSAgICAgKgotICAgICAqIHZDYXJkIDIuMSBkb2VzIG5vdCBoYXZlIGFueSBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIHRoZW0uCi0gICAgICogdkNhcmQgMy4wIGhhcyBTT1JULVNUUklORyBwcm9wZXJ0eSwgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSB2YWx1ZXMgaW5zaWRlIGl0LgotICAgICAqIHZDYXJkIDQuMCAocmV2MTMpIGhhcyBTT1JULUFTIHBhcmFtZXRlciwgd2hpY2ggaGFzIHRocmVlIHZhbHVlcyAoZmFtaWx5LCBnaXZlbiwgbWlkZGxlKQotICAgICAqIGluc2lkZSBpdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lUGhvbmV0aWNOYW1lQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIGZpbmFsIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiQXBwcm9wcmlhdGVQcmVmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiQXBwcm9wcmlhdGVEaXNwbGF5TmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlUGhvbmV0aWNGYW1pbHkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUiKTsKLQotICAgICAgICBmaW5hbCBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uNDAodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMucHV0KCJTT1JULUFTIiwKLSAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZTtBcHByb3ByaWF0ZUdpdmVuTmFtZTtBcHByb3ByaWF0ZU1pZGRsZU5hbWUiKTsKLSAgICAgICAgICAgIC8vIHZDYXJkIDQuMCAocmV2MTMpIG5vdyB1c2VzIFNPUlQtQVMgcGFyYW1ldGVyLCB3aGljaCBpcyBub3QgY29tcGF0aWJsZSB3aXRoCi0gICAgICAgICAgICAvLyBlaXRoZXIgMi4xIG5vciAzLjAuCi0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZUZhbWlseU5hbWU7QXBwcm9wcmlhdGVHaXZlbk5hbWU7QXBwcm9wcmlhdGVNaWRkbGVOYW1lOyIKLSAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVQcmVmaXg7QXBwcm9wcmlhdGVTdWZmaXgiLAotICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBcHByb3ByaWF0ZUZhbWlseU5hbWUiLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiLCAiQXBwcm9wcmlhdGVQcmVmaXgiLCAiQXBwcm9wcmlhdGVTdWZmaXgiKSwKLSAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZUZhbWlseU5hbWU7QXBwcm9wcmlhdGVHaXZlbk5hbWU7QXBwcm9wcmlhdGVNaWRkbGVOYW1lOyIKLSAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVQcmVmaXg7QXBwcm9wcmlhdGVTdWZmaXgiLAotICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBcHByb3ByaWF0ZUZhbWlseU5hbWUiLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiLCAiQXBwcm9wcmlhdGVQcmVmaXgiLCAiQXBwcm9wcmlhdGVTdWZmaXgiKSk7Ci0gICAgICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJTT1JULVNUUklORyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIEFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUiCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwgIkFwcHJvcHJpYXRlRGlzcGxheU5hbWUiKQotICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIiwgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiIpCi0gICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLU1JRERMRS1OQU1FIiwgIkFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUiKQotICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1MQVNULU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVBob25ldGljTmFtZVYyMSgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lUGhvbmV0aWNOYW1lQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lUGhvbmV0aWNOYW1lVjMwKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVQaG9uZXRpY05hbWVDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVQaG9uZXRpY05hbWVWNDAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZVBob25ldGljTmFtZUNvbW1vbihWNDApOwotICAgIH0KLQotICAgIC8vIFRPRE86IG5lZWQgdG8gYWRkIHRlc3QgY2FzZXMgY29uZmlybWluZyBlc2NhcGluZywgZW1wdHkgdmFsdWVzLCBldGMuCi0KLSAgICAvKioKLSAgICAgKiBDb25maXJtcyBhbGwgdGhlIG90aGVyIHNpZGVzIG9mIHRoZSBoYW5kbGluZyBpcyBjb3JyZWN0bHkgaW50ZXJwcmV0ZWQgYXQgb25lIHRpbWUuCi0gICAgICoKLSAgICAgKiBBIGtpbmQgb2YgcmVncmVzc2lvbiB0ZXN0IGZvciBTdHJ1Y3R1cmVkTmFtZSBoYW5kbGluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lQ29tcGxpY2F0ZWRDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgZmluYWwgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0RmFtaWx5TmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkRvTm90RW1pdEdpdmVuTmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJEb05vdEVtaXRNaWRkbGVOYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEb05vdEVtaXRQcmVmaXgxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkRvTm90RW1pdFN1ZmZpeDEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0ZhbWlseTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIkRvTm90RW1pdFBob25ldGljR2l2ZW4xIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNNaWRkbGUxIik7Ci0KLSAgICAgICAgLy8gV2l0aCAiSVNfUFJJTUFSWT0xIiwgYnV0IHdlIHNob3VsZCBpZ25vcmUgdGhpcyB0aW1lLgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJEb05vdEVtaXRGYW1pbHlOYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0R2l2ZW5OYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkRvTm90RW1pdE1pZGRsZU5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRvTm90RW1pdFByZWZpeDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiRG9Ob3RFbWl0U3VmZml4MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIkRvTm90RW1pdFBob25ldGljRmFtaWx5MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNHaXZlbjIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY01pZGRsZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSk7Ci0KLSAgICAgICAgLy8gV2l0aCAiSVNfU1VQRVJfUFJJTUFSWT0xIi4gVGhpcyBpcyB3aGF0IHdlIHNob3VsZCB1c2UuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiQXBwcm9wcmlhdGVQcmVmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJBcHByb3ByaWF0ZVBob25ldGljR2l2ZW4iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJBcHByb3ByaWF0ZVBob25ldGljTWlkZGxlIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1NVUEVSX1BSSU1BUlksIDEpOwotCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkRvTm90RW1pdEZhbWlseU5hbWUzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJEb05vdEVtaXRHaXZlbk5hbWUzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiRG9Ob3RFbWl0TWlkZGxlTmFtZTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRG9Ob3RFbWl0UHJlZml4MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJEb05vdEVtaXRTdWZmaXgzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNGYW1pbHkzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0dpdmVuMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkRvTm90RW1pdFBob25ldGljTWlkZGxlMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICBmaW5hbCBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uNDAodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMucHV0KCJTT1JULUFTIiwKLSAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZTtBcHByb3ByaWF0ZUdpdmVuTmFtZTtBcHByb3ByaWF0ZU1pZGRsZU5hbWUiKTsKLSAgICAgICAgICAgIC8vIHZDYXJkIDQuMCAocmV2MTMpIG5vdyB1c2VzIFNPUlQtQVMgcGFyYW1ldGVyLCB3aGljaCBpcyBub3QgY29tcGF0aWJsZSB3aXRoCi0gICAgICAgICAgICAvLyBlaXRoZXIgMi4xIG5vciAzLjAuCi0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZUZhbWlseU5hbWU7QXBwcm9wcmlhdGVHaXZlbk5hbWU7QXBwcm9wcmlhdGVNaWRkbGVOYW1lOyIKLSAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVQcmVmaXg7QXBwcm9wcmlhdGVTdWZmaXgiLAotICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBcHByb3ByaWF0ZUZhbWlseU5hbWUiLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiLCAiQXBwcm9wcmlhdGVQcmVmaXgiLCAiQXBwcm9wcmlhdGVTdWZmaXgiKSwKLSAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZUZhbWlseU5hbWU7QXBwcm9wcmlhdGVHaXZlbk5hbWU7QXBwcm9wcmlhdGVNaWRkbGVOYW1lOyIKLSAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVQcmVmaXg7QXBwcm9wcmlhdGVTdWZmaXgiLAotICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBcHByb3ByaWF0ZUZhbWlseU5hbWUiLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiLCAiQXBwcm9wcmlhdGVQcmVmaXgiLCAiQXBwcm9wcmlhdGVTdWZmaXgiKSk7Ci0gICAgICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJTT1JULVNUUklORyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIEFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUiCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwKLSAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVQcmVmaXggQXBwcm9wcmlhdGVHaXZlbk5hbWUgIgotICAgICAgICAgICAgICAgICsgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSBBcHByb3ByaWF0ZUZhbWlseU5hbWUgQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIiwgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiIpCi0gICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLU1JRERMRS1OQU1FIiwgIkFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUiKQotICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1MQVNULU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZUNvbXBsaWNhdGVkVjIxKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVDb21wbGljYXRlZENvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZUNvbXBsaWNhdGVkVjMwKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVDb21wbGljYXRlZENvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZUNvbXBsaWNhdGVkVjQwKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVDb21wbGljYXRlZENvbW1vbihWNDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROaWNrTmFtZVYzMCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYzMCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJOaWNreSIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOSUNLTkFNRSIsICJOaWNreSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROaWNrTmFtZVY0MCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFY0MCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJOaWNreSIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOSUNLTkFNRSIsICJOaWNreSIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UGhvbmVCYXNpY0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSE9NRSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEiLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVCYXNpY1YyMSgpIHsKLSAgICAgICAgdGVzdFBob25lQmFzaWNDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVCYXNpY1YzMCgpIHsKLSAgICAgICAgdGVzdFBob25lQmFzaWNDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVCYXNpY1Y0MCgpIHsKLSAgICAgICAgdGVzdFBob25lQmFzaWNDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVSZWZyYWluRm9ybWF0dGluZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYyMSB8IFZDYXJkQ29uZmlnLkZMQUdfUkVGUkFJTl9QSE9ORV9OVU1CRVJfRk9STUFUVElORyk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEyMzQ1Njc4OTAoYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXopIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSE9NRSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEyMzQ1Njc4OTAoYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXopIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgdkNhcmQgY29tcG9zZXIgZW1pdHMgY29ycmVzcG9uZGluZyB0eXBlIHBhcmFtIHdoaWNoIHdlIGV4cGVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBob25lVmFyaW91c1R5cGVTdXBwb3J0KGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMjAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjMwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfRkFYX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNDAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9GQVhfV09SSyk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI1MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX01PQklMRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI2MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1BBR0VSKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjcwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfT1RIRVIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiODAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DQVIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiOTAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DT01QQU5ZX01BSU4pOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTAwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSVNETik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMTAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9NQUlOKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEyMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX09USEVSX0ZBWCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMzAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9URUxFWCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNDAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLX01PQklMRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNTAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLX1BBR0VSKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE2MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX01NUyk7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTAiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIyMCIsIG5ldyBUeXBlU2V0KCJXT1JLIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjMwIiwgbmV3IFR5cGVTZXQoIkhPTUUiLCAiRkFYIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjQwIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiRkFYIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjUwIiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNjAiLCBuZXcgVHlwZVNldCgiUEFHRVIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNzAiLCBuZXcgVHlwZVNldCgiVk9JQ0UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiODAiLCBuZXcgVHlwZVNldCgiQ0FSIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjkwIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiUFJFRiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMDAiLCBuZXcgVHlwZVNldCgiSVNETiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMTAiLCBuZXcgVHlwZVNldCgiUFJFRiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMjAiLCBuZXcgVHlwZVNldCgiRkFYIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEzMCIsIG5ldyBUeXBlU2V0KCJUTFgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTQwIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiQ0VMTCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxNTAiLCBuZXcgVHlwZVNldCgiV09SSyIsICJQQUdFUiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxNjAiLCBuZXcgVHlwZVNldCgiTVNHIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVZhcmlvdXNUeXBlU3VwcG9ydFYyMSgpIHsKLSAgICAgICAgdGVzdFBob25lVmFyaW91c1R5cGVTdXBwb3J0KFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lVmFyaW91c1R5cGVTdXBwb3J0VjMwKCkgewotICAgICAgICB0ZXN0UGhvbmVWYXJpb3VzVHlwZVN1cHBvcnQoVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVWYXJpb3VzVHlwZVN1cHBvcnRWNDAoKSB7Ci0gICAgICAgIHRlc3RQaG9uZVZhcmlvdXNUeXBlU3VwcG9ydChWNDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgIlBSRUYicyBhcmUgZW1pdHRlZCBhcHByb3ByaWF0ZWx5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0UGhvbmVQcmVmSGFuZGxpbmdDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjIiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIzIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfRkFYX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9GQVhfV09SSyk7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNCIsIG5ldyBUeXBlU2V0KCJXT1JLIiwgIkZBWCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIzIiwgbmV3IFR5cGVTZXQoIkhPTUUiLCAiRkFYIiwgIlBSRUYiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMiIsIG5ldyBUeXBlU2V0KCJXT1JLIiwgIlBSRUYiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMSIsIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVByZWZIYW5kbGluZ1YyMSgpIHsKLSAgICAgICAgdGVzdFBob25lUHJlZkhhbmRsaW5nQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lUHJlZkhhbmRsaW5nVjMwKCkgewotICAgICAgICB0ZXN0UGhvbmVQcmVmSGFuZGxpbmdDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVQcmVmSGFuZGxpbmdWNDAoKSB7Ci0gICAgICAgIHRlc3RQaG9uZVByZWZIYW5kbGluZ0NvbW1vbihWNDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0TWlzY1Bob25lVHlwZUhhbmRsaW5nKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJNb2RlbSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMiIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTVNHIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIzIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJCQlMiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlZJREVPIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI1IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjYiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIl9BVVRPX0NFTEwiKTsgIC8vIFRoZSBvbGQgaW5kaWNhdG9yIGZvciB0aGUgdHlwZSBtb2JpbGUuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI3IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJcdTY0M0FcdTVFMkYiKTsgIC8vIE1vYmlsZSBwaG9uZSBpbiBKYXBhbmVzZSBLYW5qaQotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiOCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiaW52YWxpZCIpOwotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKTsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjMwKHZjYXJkVHlwZSkgfHwgVkNhcmRDb25maWcuaXNWZXJzaW9uNDAodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgLy8gdkNhcmQgMy4wIGFjY2VwdHMgImludmFsaWQiLiBBbHNvIHN0b3AgdXNpbmcgdG9VcHBlcigpCi0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEiLCBuZXcgVHlwZVNldCgiTW9kZW0iKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjIiLCBuZXcgVHlwZVNldCgiTVNHIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIzIiwgbmV3IFR5cGVTZXQoIkJCUyIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNCIsIG5ldyBUeXBlU2V0KCJWSURFTyIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNSIsIG5ldyBUeXBlU2V0KCJWT0lDRSIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNiIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI3IiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjgiLCBuZXcgVHlwZVNldCgiaW52YWxpZCIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMSIsIG5ldyBUeXBlU2V0KCJNT0RFTSIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMiIsIG5ldyBUeXBlU2V0KCJNU0ciKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjMiLCBuZXcgVHlwZVNldCgiQkJTIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI0IiwgbmV3IFR5cGVTZXQoIlZJREVPIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI1IiwgbmV3IFR5cGVTZXQoIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI2IiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjciLCBuZXcgVHlwZVNldCgiQ0VMTCIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiOCIsIG5ldyBUeXBlU2V0KCJYLWludmFsaWQiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVUeXBlSGFuZGxpbmdWMjEoKSB7Ci0gICAgICAgIHRlc3RNaXNjUGhvbmVUeXBlSGFuZGxpbmcoVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVUeXBlSGFuZGxpbmdWMzAoKSB7Ci0gICAgICAgIHRlc3RNaXNjUGhvbmVUeXBlSGFuZGxpbmcoVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVUeXBlSGFuZGxpbmdWNDAoKSB7Ci0gICAgICAgIHRlc3RNaXNjUGhvbmVUeXBlSGFuZGxpbmcoVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEVtYWlsQmFzaWNDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInNhbXBsZUBleGFtcGxlLmNvbSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAic2FtcGxlQGV4YW1wbGUuY29tIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsQmFzaWNWMjEoKSB7Ci0gICAgICAgIHRlc3RFbWFpbEJhc2ljQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsQmFzaWNWMzAoKSB7Ci0gICAgICAgIHRlc3RFbWFpbEJhc2ljQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsQmFzaWNWNDAoKSB7Ci0gICAgICAgIHRlc3RFbWFpbEJhc2ljQ29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RFbWFpbFZhcmlvdXNUeXBlU3VwcG9ydENvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInR5cGVfaG9tZUBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInR5cGVfd29ya0BleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX1dPUkspOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInR5cGVfbW9iaWxlQGV4YW1wbGUuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfTU9CSUxFKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0eXBlX290aGVyQGV4YW1wbGUuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfT1RIRVIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInR5cGVfaG9tZUBleGFtcGxlLmNvbSIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAidHlwZV93b3JrQGV4YW1wbGUuY29tIiwgbmV3IFR5cGVTZXQoIldPUksiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICJ0eXBlX21vYmlsZUBleGFtcGxlLmNvbSIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAidHlwZV9vdGhlckBleGFtcGxlLmNvbSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbFZhcmlvdXNUeXBlU3VwcG9ydFYyMSgpIHsKLSAgICAgICAgdGVzdEVtYWlsVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsVmFyaW91c1R5cGVTdXBwb3J0VjMwKCkgewotICAgICAgICB0ZXN0RW1haWxWYXJpb3VzVHlwZVN1cHBvcnRDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1haWxWYXJpb3VzVHlwZVN1cHBvcnRWNDAoKSB7Ci0gICAgICAgIHRlc3RFbWFpbFZhcmlvdXNUeXBlU3VwcG9ydENvbW1vbihWNDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0RW1haWxQcmVmSGFuZGxpbmdDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0eXBlX2hvbWVAZXhhbXBsZS5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAidHlwZV9ub3R5cGVAZXhhbXBsZS5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuSVNfUFJJTUFSWSwgMSk7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICJ0eXBlX25vdHlwZUBleGFtcGxlLmNvbSIsIG5ldyBUeXBlU2V0KCJQUkVGIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAidHlwZV9ob21lQGV4YW1wbGUuY29tIiwgbmV3IFR5cGVTZXQoIkhPTUUiLCAiUFJFRiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1haWxQcmVmSGFuZGxpbmdWMjEoKSB7Ci0gICAgICAgIHRlc3RFbWFpbFByZWZIYW5kbGluZ0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbFByZWZIYW5kbGluZ1YzMCgpIHsKLSAgICAgICAgdGVzdEVtYWlsUHJlZkhhbmRsaW5nQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsUHJlZkhhbmRsaW5nVjQwKCkgewotICAgICAgICB0ZXN0RW1haWxQcmVmSGFuZGxpbmdDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiUG9ib3giKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5ORUlHSEJPUkhPT0QsICJOZWlnaGJvcmhvb2QiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsICJTdHJlZXQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCAiQ2l0eSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIlJlZ2lvbiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCAiMTAwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgIkNvdW50cnkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywgIkZvcm1hdHRlZCBBZGRyZXNzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspOwotICAgICAgICAvLyBhZHItdmFsdWUgICAgPSAwKjYodGV4dC12YWx1ZSAiOyIpIHRleHQtdmFsdWUKLSAgICAgICAgLy8gICAgICAgICAgICAgIDsgUE8gQm94LCBFeHRlbmRlZCBBZGRyZXNzLCBTdHJlZXQsIExvY2FsaXR5LCBSZWdpb24sIFBvc3RhbCBDb2RlLAotICAgICAgICAvLyAgICAgICAgICAgICAgOyBDb3VudHJ5IE5hbWUKLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhlIE5FSUdIQk9SSE9PRCBmaWVsZCBpcyBhcHBlbmRlZCBhZnRlciB0aGUgQ0lUWSBmaWVsZC4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiUG9ib3giLCAiIiwgIlN0cmVldCIsICJDaXR5IE5laWdoYm9yaG9vZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpb24iLCAiMTAwIiwgIkNvdW50cnkiKSwgbmV3IFR5cGVTZXQoIldPUksiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NWMjEoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NWMzAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NWNDAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzQ29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCAiQ2l0eSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIiLCAiIiwgIiIsICJDaXR5IiwgIiIsICIiLCAiIiksIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kVjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc05vbk5laWdoYm9yaG9vZChWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kVjMwKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc05vbk5laWdoYm9yaG9vZChWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kVjQwKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc05vbk5laWdoYm9yaG9vZChWNDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc05vbkNpdHkoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLk5FSUdIQk9SSE9PRCwgIk5laWdoYm9yaG9vZCIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIiLCAiIiwgIiIsICJOZWlnaGJvcmhvb2QiLCAiIiwgIiIsICIiKSwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NOb25DaXR5VjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc05vbkNpdHkoVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc05vbkNpdHlWMzAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzTm9uQ2l0eShWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uQ2l0eVY0MCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbEFkZHJlc3NOb25DaXR5KFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQb3N0YWxPbmx5V2l0aEZvcm1hdHRlZEFkZHJlc3NDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIiIpICAvLyBNdXN0IGJlIGlnbm9yZWQuCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICJGb3JtYXR0ZWQgYWRkcmVzcyBDQSAxMjMtMzM0IFVuaXRlZCBTdGF0dWUiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBRFIiLCAiO0Zvcm1hdHRlZCBhZGRyZXNzIENBIDEyMy0zMzQgVW5pdGVkIFN0YXR1ZTs7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsICJGb3JtYXR0ZWQgYWRkcmVzcyBDQSAxMjMtMzM0IFVuaXRlZCBTdGF0dWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgIiIsICIiLCAiIiwgIiIpLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsT25seVdpdGhGb3JtYXR0ZWRBZGRyZXNzVjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsT25seVdpdGhGb3JtYXR0ZWRBZGRyZXNzQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbE9ubHlXaXRoRm9ybWF0dGVkQWRkcmVzc1YzMCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbE9ubHlXaXRoRm9ybWF0dGVkQWRkcmVzc0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxPbmx5V2l0aEZvcm1hdHRlZEFkZHJlc3NWNDAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxPbmx5V2l0aEZvcm1hdHRlZEFkZHJlc3NDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IHRoZSB2Q2FyZCBjb21wb3NlciBob25vcnMgZm9ybWF0dGVkIGRhdGEgd2hlbiBpdCBpcyBhdmFpbGFibGUKLSAgICAgKiBldmVuIHdoZW4gaXQgaXMgcGFydGlhbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBvc3RhbFdpdGhCb3RoU3RydWN0dXJlZEFuZEZvcm1hdHRlZENvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICJQb2JveCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksICJDb3VudHJ5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAiRm9ybWF0dGVkIGFkZHJlc3MgQ0EgMTIzLTMzNCBVbml0ZWQgU3RhdHVlIik7ICAvLyBTaG91bGQgYmUgaWdub3JlZAotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsICJQb2JveDs7Ozs7O0NvdW50cnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiUG9ib3giLCAiIiwgIiIsICIiLCAiIiwgIiIsICJDb3VudHJ5IiksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkVjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbFdpdGhCb3RoU3RydWN0dXJlZEFuZEZvcm1hdHRlZFYzMCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbFdpdGhCb3RoU3RydWN0dXJlZEFuZEZvcm1hdHRlZENvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxXaXRoQm90aFN0cnVjdHVyZWRBbmRGb3JtYXR0ZWRWNDAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxXaXRoQm90aFN0cnVjdHVyZWRBbmRGb3JtYXR0ZWRDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdE9yZ2FuaXphdGlvbkNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiQ29tcGFueVgiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQsICJEZXBhcnRtZW50WSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJUaXRsZVoiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkpPQl9ERVNDUklQVElPTiwgIkRlc2NyaXB0aW9uIFJhbWJkYSIpICAvLyBJZ25vcmVkLgotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLk9GRklDRV9MT0NBVElPTiwgIk1vdW50YWluIFZpZXciKSAgLy8gSWdub3JlZC4KLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5QSE9ORVRJQ19OQU1FLCAiUGhvbmV0aWNOYW1lISIpICAvLyBJZ25vcmVkCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uU1lNQk9MLCAiKF5vXikvfn4iKTsgIC8vIElnbm9yZSBoaW0gKGhlcikuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXROdWxsKE9yZ2FuaXphdGlvbi5DT01QQU5ZKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQsICJEZXBhcnRtZW50WFgiKQotICAgICAgICAgICAgICAgIC5wdXROdWxsKE9yZ2FuaXphdGlvbi5USVRMRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJDb21wYW55WFlaIikKLSAgICAgICAgICAgICAgICAucHV0TnVsbChPcmdhbml6YXRpb24uREVQQVJUTUVOVCkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIlRpdGxlWFlaWVgiKTsKLSAgICAgICAgLy8gQ3VycmVudGx5IHdlIGRvIG5vdCB1c2UgZ3JvdXAgYnV0IGRlcGVuZCBvbiB0aGUgb3JkZXIuCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiT1JHIiwgIkNvbXBhbnlYO0RlcGFydG1lbnRZIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkNvbXBhbnlYIiwgIkRlcGFydG1lbnRZIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVElUTEUiLCAiVGl0bGVaIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJPUkciLCAiRGVwYXJ0bWVudFhYIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJPUkciLCAiQ29tcGFueVhZWiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVElUTEUiLCAiVGl0bGVYWVpZWCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcmdhbml6YXRpb25WMjEoKSB7Ci0gICAgICAgIHRlc3RPcmdhbml6YXRpb25Db21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3JnYW5pemF0aW9uVjMwKCkgewotICAgICAgICB0ZXN0T3JnYW5pemF0aW9uQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9yZ2FuaXphdGlvblY0MCgpIHsKLSAgICAgICAgdGVzdE9yZ2FuaXphdGlvbkNvbW1vbihWNDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0SW1WYXJpb3VzVHlwZVN1cHBvcnRDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9BSU0pCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAiYWltIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfTVNOKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgIm1zbiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX1lBSE9PKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgInlhaG9vIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfU0tZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAic2t5cGUiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9RUSkKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJxcSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0dPT0dMRV9UQUxLKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgImdvb2dsZSB0YWxrIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfSUNRKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgImljcSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0pBQkJFUikKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJqYWJiZXIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9ORVRNRUVUSU5HKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgIm5ldG1lZXRpbmciKTsKLQotICAgICAgICAvLyBObyBkZXRlcm1pbmVkIHdheSB0byBleHByZXNzIHVua25vd24gdHlwZS4uLgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtSkFCQkVSIiwgImphYmJlciIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1JQ1EiLCAiaWNxIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUdPT0dMRS1UQUxLIiwgImdvb2dsZSB0YWxrIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVFRIiwgInFxIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVNLWVBFLVVTRVJOQU1FIiwgInNreXBlIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVlBSE9PIiwgInlhaG9vIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU1TTiIsICJtc24iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTkVUTUVFVElORyIsICJuZXRtZWV0aW5nIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFJTSIsICJhaW0iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1CYXNpVjIxKCkgewotICAgICAgICB0ZXN0SW1WYXJpb3VzVHlwZVN1cHBvcnRDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1CYXNpY1YzMCgpIHsKLSAgICAgICAgdGVzdEltVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEltQmFzaWNWNDAoKSB7Ci0gICAgICAgIHRlc3RJbVZhcmlvdXNUeXBlU3VwcG9ydENvbW1vbihWNDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0SW1QcmVmSGFuZGxpbmdDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9BSU0pCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAiYWltMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0FJTSkKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJhaW0yIikKLSAgICAgICAgICAgICAgICAucHV0KEltLlRZUEUsIEltLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLklTX1BSSU1BUlksIDEpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BSU0iLCAiYWltMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BSU0iLCAiYWltMiIsIG5ldyBUeXBlU2V0KCJIT01FIiwgIlBSRUYiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEltUHJlZkhhbmRsaW5nVjIxKCkgewotICAgICAgICB0ZXN0SW1QcmVmSGFuZGxpbmdDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1QcmVmSGFuZGxpbmdWMzAoKSB7Ci0gICAgICAgIHRlc3RJbVByZWZIYW5kbGluZ0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbVByZWZIYW5kbGluZ1Y0MCgpIHsKLSAgICAgICAgdGVzdEltUHJlZkhhbmRsaW5nQ29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RXZWJzaXRlQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoV2Vic2l0ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFdlYnNpdGUuVVJMLCAiaHR0cDovL3dlYnNpdGUuZXhhbXBsZS5hbmRyb2lkLmNvbS9pbmRleC5odG1sIikKLSAgICAgICAgICAgICAgICAucHV0KFdlYnNpdGUuVFlQRSwgV2Vic2l0ZS5UWVBFX0JMT0cpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFdlYnNpdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChXZWJzaXRlLlVSTCwgImZ0cDovL2Z0cC5leGFtcGxlLmFuZHJvaWQuY29tL2luZGV4Lmh0bWwiKQotICAgICAgICAgICAgICAgIC5wdXQoV2Vic2l0ZS5UWVBFLCBXZWJzaXRlLlRZUEVfRlRQKTsKLQotICAgICAgICAvLyBXZSBkcm9wIFRZUEUgaW5mb3JtYXRpb24gc2luY2UgdkNhcmQgKGVzcGVjaWFsbHkgMy4wKSBkb2VzIG5vdCBhbGxvdyB1cyB0byBlbWl0IGl0LgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlVSTCIsICJmdHA6Ly9mdHAuZXhhbXBsZS5hbmRyb2lkLmNvbS9pbmRleC5odG1sIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJVUkwiLCAiaHR0cDovL3dlYnNpdGUuZXhhbXBsZS5hbmRyb2lkLmNvbS9pbmRleC5odG1sIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYnNpdGVWMjEoKSB7Ci0gICAgICAgIHRlc3RXZWJzaXRlQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYnNpdGVWMzAoKSB7Ci0gICAgICAgIHRlc3RXZWJzaXRlQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYnNpdGVWNDAoKSB7Ci0gICAgICAgIHRlc3RXZWJzaXRlQ29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QW5kcm9pZFByb3BWYWx1ZShmaW5hbCBTdHJpbmcgbWltZVR5cGUsIFN0cmluZyB2YWx1ZSwgSW50ZWdlciB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbmRyb2lkUHJvcFZhbHVlKG1pbWVUeXBlLCB2YWx1ZSwgdHlwZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QW5kcm9pZFByb3BWYWx1ZShmaW5hbCBTdHJpbmcgbWltZVR5cGUsIFN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgIEludGVnZXIgdHlwZSwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIHJldHVybiAobWltZVR5cGUgKyAiOyIgKyB2YWx1ZSArICI7IgotICAgICAgICAgICAgICAgICsgKHR5cGUgIT0gbnVsbCA/IHR5cGUgOiAiIikgKyAiOyIKLSAgICAgICAgICAgICAgICArIChsYWJlbCAhPSBudWxsID8gbGFiZWwgOiAiIikgKyAiOzs7Ozs7Ozs7Ozs7Iik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RFdmVudENvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9BTk5JVkVSU0FSWSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlNUQVJUX0RBVEUsICIxOTgyLTA2LTE2Iik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5UWVBFLCBFdmVudC5UWVBFX0JJUlRIREFZKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuU1RBUlRfREFURSwgIjIwMDgtMTAtMjIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFdmVudC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfT1RIRVIpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiMjAxOC0wMy0xMiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5MQUJFTCwgIlRoZSBsYXN0IGRheSIpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiV2hlbiB0aGUgVG93ZXIgb2YgSGFub2kgd2l0aCA2NCByaW5ncyBpcyBjb21wbGV0ZWQuIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5UWVBFLCBFdmVudC5UWVBFX0JJUlRIREFZKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuU1RBUlRfREFURSwgIjIwMDktMDUtMTkiKTsgIC8vIFNob3VsZCBiZSBpZ25vcmVkLgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkJEQVkiLCAiMjAwOC0xMC0yMiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BTkRST0lELUNVU1RPTSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRBbmRyb2lkUHJvcFZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudC5DT05URU5UX0lURU1fVFlQRSwgIjE5ODItMDYtMTYiLCBFdmVudC5UWVBFX0FOTklWRVJTQVJZKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFORFJPSUQtQ1VTVE9NIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEFuZHJvaWRQcm9wVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFLCAiMjAxOC0wMy0xMiIsIEV2ZW50LlRZUEVfT1RIRVIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQU5EUk9JRC1DVVNUT00iLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QW5kcm9pZFByb3BWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXaGVuIHRoZSBUb3dlciBvZiBIYW5vaSB3aXRoIDY0IHJpbmdzIGlzIGNvbXBsZXRlZC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudC5UWVBFX0NVU1RPTSwgIlRoZSBsYXN0IGRheSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXZlbnRWMjEoKSB7Ci0gICAgICAgIHRlc3RFdmVudENvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmVudFYzMCgpIHsKLSAgICAgICAgdGVzdEV2ZW50Q29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV2ZW50VjQwKCkgewotICAgICAgICB0ZXN0RXZlbnRDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdE5vdGVDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTm90ZS5OT1RFLCAibm90ZTEiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTm90ZS5OT1RFLCAibm90ZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoTm90ZS5JU19QUklNQVJZLCAxKTsgIC8vIEp1c3QgaWdub3JlZC4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOT1RFIiwgIm5vdGUxIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOT1RFIiwgIm5vdGUyIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vdGVWMjEoKSB7Ci0gICAgICAgIHRlc3ROb3RlQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vdGVWMzAoKSB7Ci0gICAgICAgIHRlc3ROb3RlQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vdGVWNDAoKSB7Ci0gICAgICAgIHRlc3ROb3RlQ29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQaG90b0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gdXNlQiA9Ci0gICAgICAgICAgICAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAodmNhcmRUeXBlKSB8fCBWQ2FyZENvbmZpZy5pc1ZlcnNpb240MCh2Y2FyZFR5cGUpKTsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlBob3RvVGVzdCIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob3RvLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvdG8uUEhPVE8sIHNQaG90b0J5dGVBcnJheSk7Ci0KLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzRm9yUGhvdG8gPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBjb250ZW50VmFsdWVzRm9yUGhvdG8ucHV0KCJFTkNPRElORyIsICh1c2VCID8gImIiIDogIkJBU0U2NCIpKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgIlBob3RvVGVzdCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsICJQaG90b1Rlc3Q7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlBob3RvVGVzdCIsICIiLCAiIiwgIiIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJQSE9UTyIsIG51bGwsIG51bGwsIHNQaG90b0J5dGVBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXNGb3JQaG90bywgbmV3IFR5cGVTZXQoIkpQRUciKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob3RvVjIxKCkgewotICAgICAgICB0ZXN0UGhvdG9Db21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvdG9WMzAoKSB7Ci0gICAgICAgIHRlc3RQaG90b0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG90b1Y0MCgpIHsKLSAgICAgICAgdGVzdFBob3RvQ29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RSZWxhdGlvbkNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoUmVsYXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChSZWxhdGlvbi5UWVBFLCBSZWxhdGlvbi5UWVBFX01PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFJlbGF0aW9uLk5BTUUsICJNcy4gTW90aGVyIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkuYWRkRXhwZWN0ZWQoUmVsYXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChSZWxhdGlvbi5UWVBFLCBSZWxhdGlvbi5UWVBFX01PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFJlbGF0aW9uLk5BTUUsICJNcy4gTW90aGVyIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbGF0aW9uVjIxKCkgewotICAgICAgICB0ZXN0UmVsYXRpb25Db21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpb25WMzAoKSB7Ci0gICAgICAgIHRlc3RSZWxhdGlvbkNvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMzBIYW5kbGVFc2NhcGUoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWMzApOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlxcIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICI7IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiLCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJcbiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJbPHtVbmVzY2FwZWQ6QXNjaWlzfT5dIik7Ci0gICAgICAgIC8vIFZlcmlmaWVzIHRoZSB2Q2FyZCBTdHJpbmcgY29ycmVjdGx5IGVzY2FwZXMgZWFjaCBjaGFyYWN0ZXIgd2hpY2ggbXVzdCBiZSBlc2NhcGVkLgotICAgICAgICBtVmVyaWZpZXIuYWRkTGluZVZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKCJOOlxcXFw7XFw7O1xcLDtcXG47IikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoIkZOOls8e1VuZXNjYXBlZDpBc2NpaXN9Pl0iKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgIls8e1VuZXNjYXBlZDpBc2NpaXN9Pl0iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk4iLCBBcnJheXMuYXNMaXN0KCJcXCIsICI7IiwgIiwiLCAiXG4iLCAiIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZXJlJ3Mgbm8gIk5JQ0tOQU1FIiBwcm9wZXJ0eSBpbiB2Q2FyZCAyLjEsIHdoaWxlIHRoZXJlIGlzIGluIHZDYXJkIDMuMC4KLSAgICAgKiBXZSB1c2UgQW5kcm9pZC1zcGVjaWZpYyAiWC1BTkRST0lELUNVU1RPTSIgcHJvcGVydHkuCi0gICAgICogVGhpcyB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROaWNrTmFtZVYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYyMSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJOaWNreSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQU5EUk9JRC1DVVNUT00iLAotICAgICAgICAgICAgICAgICAgICAgICAgTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUgKyAiO05pY2t5Ozs7Ozs7Ozs7Ozs7OzsiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKS5hZGRFeHBlY3RlZChOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJOaWNreSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb2xlcmF0ZUJyb2tlblBob25lTnVtYmVyRW50cnlWMjEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWMjEpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTExLTIyMi0zMzMzIChNaWFtaSlcbjQ0NC01NTU1LTY2NiAoVG9reW8pOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIjc3Ny04ODgtOTk5OSAoQ2hpY2Fnbyk7MTExLTIyMi0zMzMzIChNaWFtaSkiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTExLTIyMi0zMzMzIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNDQ0LTU1NS01NjY2IiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNzc3LTg4OC05OTk5IiwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQaWNrVXBOb25FbXB0eUNvbnRlbnRWYWx1ZXNDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlksIDEpOyAgLy8gRW1wdHkgbmFtZS4gU2hvdWxkIGJlIGlnbm9yZWQuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgImZhbWlseTEiKSAgLy8gTm90IHByaW1hcnkuIFNob3VsZCBiZSBpZ25vcmVkLgotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiZGlzcGxheSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiZmFtaWx5MiIpICAvLyBUaGlzIGVudHJ5IGlzIHdoYXQgd2Ugd2FudC4KLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgImRpc3BsYXkiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlksIDEpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgImZhbWlseTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiZGlzcGxheSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJmYW1pbHk0IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgImRpc3BsYXkiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk4iLCBBcnJheXMuYXNMaXN0KCJmYW1pbHkyIiwgIiIsICIiLCAiIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgImRpc3BsYXkiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGlja1VwTm9uRW1wdHlDb250ZW50VmFsdWVzVjIxKCkgewotICAgICAgICB0ZXN0UGlja1VwTm9uRW1wdHlDb250ZW50VmFsdWVzQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc1YzMCgpIHsKLSAgICAgICAgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaWNrVXBOb25FbXB0eUNvbnRlbnRWYWx1ZXNWNDAoKSB7Ci0gICAgICAgIHRlc3RQaWNrVXBOb25FbXB0eUNvbnRlbnRWYWx1ZXNDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlTXVsdGlCeXRlVHlwZVYzMCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYzMCk7Ci0gICAgICAgIGZpbmFsIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiXHU5NkZCXHU4QTcxIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZExpbmVWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZCgiTjoiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZCgiRk46IikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoIlRFTDtUWVBFPVx1OTZGQlx1OEE3MToxIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEiLCBuZXcgVHlwZVNldCgiXHU5NkZCXHU4QTcxIikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEltcG9ydGVyVGVzdHMuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEltcG9ydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDllMjkxNC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbXBvcnRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmZyYW1ld29ya3MuY29yZXRlc3RzLlI7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzLlByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0uVHlwZVNldDsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzLlZDYXJkVGVzdHNCYXNlOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuQ29udGVudFZhbHVlc1ZlcmlmaWVyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5JbTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5pY2tuYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTm90ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk9yZ2FuaXphdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvdG87Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkTmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWRQb3N0YWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5XZWJzaXRlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotcHVibGljIGNsYXNzIFZDYXJkSW1wb3J0ZXJUZXN0cyBleHRlbmRzIFZDYXJkVGVzdHNCYXNlIHsKLSAgICAvLyBQdXNoIGRhdGEgaW50byBpbnQgYXJyYXkgYXQgZmlyc3Qgc2luY2UgdmFsdWVzIGxpa2UgMHg4MCBhcmUKLSAgICAvLyBpbnRlcnByZXRlZCBhcyBpbnQgYnkgdGhlIGNvbXBpbGVyIGFuZCBjYXN0aW5nIGFsbCBvZiB0aGVtIGlzCi0gICAgLy8gY3VtYmVyc29tZS4uLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHNQaG90b0ludEFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlID0gewotICAgICAgICAweGZmLCAweGQ4LCAweGZmLCAweGUxLCAweDBhLCAweDBmLCAweDQ1LCAweDc4LCAweDY5LCAweDY2LCAweDAwLAotICAgICAgICAweDAwLCAweDRkLCAweDRkLCAweDAwLCAweDJhLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDBkLAotICAgICAgICAweDAxLCAweDBlLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDBmLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweGFhLCAweDAxLCAweDBmLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweGJhLCAweDAxLCAweDEwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweGMyLCAweDAxLCAweDEyLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAxLCAweDFhLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweGM4LCAweDAxLCAweDFiLCAweDAwLCAweDA1LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweGQwLCAweDAxLCAweDI4LCAweDAwLCAweDAzLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAxLCAweDMxLCAweDAwLCAweDAyLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDBlLCAweDAwLCAweDAwLCAweDAwLCAweGQ4LCAweDAxLCAweDMyLCAweDAwLAotICAgICAgICAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweGU2LCAweDAyLCAweDEzLAotICAgICAgICAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDgyLAotICAgICAgICAweDk4LCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDBlLCAweDAwLCAweDAwLCAweDAwLCAweGZhLAotICAgICAgICAweDg3LCAweDY5LCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDg0LCAweGM0LCAweGE1LCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDdjLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDA4LCAweDAwLCAweDAwLCAweDA0LCAweDFlLCAweDMyLCAweDMwLCAweDMwLCAweDM4LCAweDMxLAotICAgICAgICAweDMwLCAweDMyLCAweDM5LCAweDMxLCAweDMzLCAweDM1LCAweDM1LCAweDMzLCAweDMxLCAweDAwLCAweDAwLAotICAgICAgICAweDQ0LCAweDZmLCAweDQzLCAweDZmLCAweDRkLCAweDZmLCAweDAwLCAweDAwLCAweDQ0LCAweDM5LCAweDMwLAotICAgICAgICAweDM1LCAweDY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDQ0LCAweDM5LCAweDMwLAotICAgICAgICAweDM1LCAweDY5LCAweDIwLCAweDU2LCAweDY1LCAweDcyLCAweDMxLCAweDJlLCAweDMwLCAweDMwLCAweDAwLAotICAgICAgICAweDMyLCAweDMwLCAweDMwLCAweDM4LCAweDNhLCAweDMxLCAweDMwLCAweDNhLCAweDMyLCAweDM5LCAweDIwLAotICAgICAgICAweDMxLCAweDMzLCAweDNhLCAweDM1LCAweDM1LCAweDNhLCAweDM0LCAweDM3LCAweDAwLCAweDIwLCAweDIwLAotICAgICAgICAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAotICAgICAgICAweDAwLCAweDUwLCAweDcyLCAweDY5LCAweDZlLCAweDc0LCAweDQ5LCAweDRkLCAweDAwLCAweDMwLCAweDMzLAotICAgICAgICAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDAxLCAweDAwLCAweDE0LCAweDAwLAotICAgICAgICAweDE0LCAweDAwLCAweDAyLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDM0LCAweDAxLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAxLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDEwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDExLCAweDA5LCAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDBmLCAweDBiLCAweDAwLAotICAgICAgICAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDA1LCAweDk3LCAweDAwLCAweDAwLCAweDI3LCAweDEwLAotICAgICAgICAweDAwLCAweDAwLCAweDA4LCAweGIwLCAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDFjLAotICAgICAgICAweDAxLCAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDAyLCAweDVlLCAweDAwLCAweDAwLAotICAgICAgICAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDhiLCAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLAotICAgICAgICAweDAwLCAweDAzLCAweGNiLCAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDFiLCAweGU1LAotICAgICAgICAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDI4LCAweDgyLCAweDlhLCAweDAwLCAweDA1LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweDZhLCAweDgyLCAweDlkLCAweDAwLCAweDA1LAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweDcyLCAweDg4LCAweDIyLCAweDAwLAotICAgICAgICAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDkwLCAweDAwLAotICAgICAgICAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDMwLCAweDMyLCAweDMyLCAweDMwLCAweDkwLAotICAgICAgICAweDAzLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAzLCAweDdhLAotICAgICAgICAweDkwLCAweDA0LCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAzLAotICAgICAgICAweDhlLCAweDkxLCAweDAxLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAxLCAweDAyLAotICAgICAgICAweDAzLCAweDAwLCAweDkxLCAweDAyLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAotICAgICAgICAweDAwLCAweDAzLCAweGEyLCAweDkyLCAweDAxLCAweDAwLCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAwLCAweDAzLCAweGFhLCAweDkyLCAweDAyLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGIyLCAweDkyLCAweDA0LCAweDAwLCAweDBhLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGJhLCAweDkyLCAweDA1LCAweDAwLCAweDA1LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGMyLCAweDkyLCAweDA3LCAweDAwLCAweDAzLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDkyLCAweDA4LCAweDAwLAotICAgICAgICAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDA5LAotICAgICAgICAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLAotICAgICAgICAweDBhLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGNhLAotICAgICAgICAweDkyLCAweDdjLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDkyLCAweDg2LCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDE2LCAweDAwLCAweDAwLAotICAgICAgICAweDAzLCAweGQyLCAweGEwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDMwLAotICAgICAgICAweDMxLCAweDMwLCAweDMwLCAweGEwLCAweDAxLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweGEwLCAweDAyLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDAwLCAweDYwLCAweDAwLCAweDAwLCAweGEwLCAweDAzLCAweDAwLCAweDAzLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweGEwLCAweDA1LCAweDAwLCAweDA0LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweGEyLCAweDBlLCAweDAwLCAweDA1LAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGU4LCAweGEyLCAweDBmLCAweDAwLAotICAgICAgICAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGYwLCAweGEyLCAweDEwLAotICAgICAgICAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweGEyLAotICAgICAgICAweDE3LCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLAotICAgICAgICAweGEzLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAzLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweGEzLCAweDAxLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweGE0LCAweDAxLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDAyLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDAzLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDA0LCAweDAwLCAweDA1LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGY4LCAweGE0LCAweDA1LCAweDAwLCAweDAzLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDFkLCAweDAwLCAweDAwLCAweGE0LCAweDA2LCAweDAwLCAweDAzLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDA3LCAweDAwLAotICAgICAgICAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDA4LAotICAgICAgICAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LAotICAgICAgICAweDA5LCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweGE0LCAweDBhLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweGE0LCAweDBjLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDUzLCAweDAwLAotICAgICAgICAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDAxLCAweDVlLCAweDAwLCAweDAwLCAweDAwLCAweDY0LAotICAgICAgICAweDMyLCAweDMwLCAweDMwLCAweDM4LCAweDNhLCAweDMxLCAweDMwLCAweDNhLCAweDMyLCAweDM5LCAweDIwLAotICAgICAgICAweDMxLCAweDMzLCAweDNhLCAweDM1LCAweDM1LCAweDNhLCAweDMzLCAweDMxLCAweDAwLCAweDMyLCAweDMwLAotICAgICAgICAweDMwLCAweDM4LCAweDNhLCAweDMxLCAweDMwLCAweDNhLCAweDMyLCAweDM5LCAweDIwLCAweDMxLCAweDMzLAotICAgICAgICAweDNhLCAweDM1LCAweDM1LCAweDNhLCAweDM0LCAweDM3LCAweDAwLCAweDAwLCAweDAwLCAweDI5LCAweDg4LAotICAgICAgICAweDAwLCAweDAwLCAweDFiLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweGIyLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDY0LCAweDAwLCAweDAwLCAweDAxLCAweDVlLCAweDAwLCAweDAwLCAweDAwLCAweDY0LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDY0LCAweDAwLCAweDAwLCAweDAwLCAweDI1LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDBhLCAweDAwLCAweDAwLCAweDBlLCAweDkyLCAweDAwLCAweDAwLCAweDAzLCAweGU4LAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDMyLCAweDMwLCAweDMwLAotICAgICAgICAweDM4LCAweDMxLCAweDMwLCAweDMyLCAweDM5LCAweDMxLCAweDMzLCAweDM1LCAweDM1LCAweDMzLCAweDMxLAotICAgICAgICAweDAwLCAweDAwLCAweDIwLCAweDJhLCAweDAwLCAweDAwLCAweDAwLCAweDBhLCAweDAwLCAweDAwLCAweDJhLAotICAgICAgICAweGUyLCAweDAwLCAweDAwLCAweDAwLCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDA0LCAweDUyLCAweDM5LCAweDM4LCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDA3LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDA0LCAweDMwLCAweDMxLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDA2LCAweDAxLCAweDAzLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDA2LAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDFhLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAotICAgICAgICAweDAwLCAweDA0LCAweDZjLCAweDAxLCAweDFiLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAwLCAweDA0LCAweDc0LCAweDAxLCAweDI4LCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAyLCAweDAxLCAweDAwLCAweDA0LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDA0LCAweDdjLCAweDAyLCAweDAyLCAweDAwLCAweDA0LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDA1LCAweDhiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweGZmLCAweGQ4LCAweGZmLCAweGRiLCAweDAwLCAweDg0LAotICAgICAgICAweDAwLCAweDIwLCAweDE2LCAweDE4LCAweDFjLCAweDE4LCAweDE0LCAweDIwLCAweDFjLCAweDFhLCAweDFjLAotICAgICAgICAweDI0LCAweDIyLCAweDIwLCAweDI2LCAweDMwLCAweDUwLCAweDM0LCAweDMwLCAweDJjLCAweDJjLCAweDMwLAotICAgICAgICAweDYyLCAweDQ2LCAweDRhLCAweDNhLCAweDUwLCAweDc0LCAweDY2LCAweDdhLCAweDc4LCAweDcyLCAweDY2LAotICAgICAgICAweDcwLCAweDZlLCAweDgwLCAweDkwLCAweGI4LCAweDljLCAweDgwLCAweDg4LCAweGFlLCAweDhhLCAweDZlLAotICAgICAgICAweDcwLCAweGEwLCAweGRhLCAweGEyLCAweGFlLCAweGJlLCAweGM0LCAweGNlLCAweGQwLCAweGNlLCAweDdjLAotICAgICAgICAweDlhLCAweGUyLCAweGYyLCAweGUwLCAweGM4LCAweGYwLCAweGI4LCAweGNhLCAweGNlLCAweGM2LCAweDAxLAotICAgICAgICAweDIyLCAweDI0LCAweDI0LCAweDMwLCAweDJhLCAweDMwLCAweDVlLCAweDM0LCAweDM0LCAweDVlLCAweGM2LAotICAgICAgICAweDg0LCAweDcwLCAweDg0LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAotICAgICAgICAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAotICAgICAgICAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAotICAgICAgICAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAotICAgICAgICAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGZmLCAweGMwLAotICAgICAgICAweDAwLCAweDExLCAweDA4LCAweDAwLCAweDc4LCAweDAwLCAweGEwLCAweDAzLCAweDAxLCAweDIxLCAweDAwLAotICAgICAgICAweDAyLCAweDExLCAweDAxLCAweDAzLCAweDExLCAweDAxLCAweGZmLCAweGM0LCAweDAxLCAweGEyLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDA1LCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LAotICAgICAgICAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDEwLCAweDAwLCAweDAyLCAweDAxLCAweDAzLAotICAgICAgICAweDAzLCAweDAyLCAweDA0LCAweDAzLCAweDA1LCAweDA1LCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDdkLCAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLCAweDIxLCAweDMxLAotICAgICAgICAweDQxLCAweDA2LCAweDEzLCAweDUxLCAweDYxLCAweDA3LCAweDIyLCAweDcxLCAweDE0LCAweDMyLCAweDgxLAotICAgICAgICAweDkxLCAweGExLCAweDA4LCAweDIzLCAweDQyLCAweGIxLCAweGMxLCAweDE1LCAweDUyLCAweGQxLCAweGYwLAotICAgICAgICAweDI0LCAweDMzLCAweDYyLCAweDcyLCAweDgyLCAweDA5LCAweDBhLCAweDE2LCAweDE3LCAweDE4LCAweDE5LAotICAgICAgICAweDFhLCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDM0LCAweDM1LCAweDM2LCAweDM3LAotICAgICAgICAweDM4LCAweDM5LCAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLAotICAgICAgICAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDYzLCAweDY0LCAweDY1LAotICAgICAgICAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LAotICAgICAgICAweDc5LCAweDdhLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDkyLAotICAgICAgICAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LAotICAgICAgICAweGE1LCAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LAotICAgICAgICAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LAotICAgICAgICAweGM5LCAweGNhLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLAotICAgICAgICAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGYxLAotICAgICAgICAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweDAxLCAweDAwLAotICAgICAgICAweDAzLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LAotICAgICAgICAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDExLCAweDAwLCAweDAyLCAweDAxLCAweDAyLCAweDA0LAotICAgICAgICAweDA0LCAweDAzLCAweDA0LCAweDA3LCAweDA1LCAweDA0LCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDc3LAotICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDExLCAweDA0LCAweDA1LCAweDIxLCAweDMxLCAweDA2LCAweDEyLAotICAgICAgICAweDQxLCAweDUxLCAweDA3LCAweDYxLCAweDcxLCAweDEzLCAweDIyLCAweDMyLCAweDgxLCAweDA4LCAweDE0LAotICAgICAgICAweDQyLCAweDkxLCAweGExLCAweGIxLCAweGMxLCAweDA5LCAweDIzLCAweDMzLCAweDUyLCAweGYwLCAweDE1LAotICAgICAgICAweDYyLCAweDcyLCAweGQxLCAweDBhLCAweDE2LCAweDI0LCAweDM0LCAweGUxLCAweDI1LCAweGYxLCAweDE3LAotICAgICAgICAweDE4LCAweDE5LCAweDFhLCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDM1LCAweDM2LCAweDM3LAotICAgICAgICAweDM4LCAweDM5LCAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLAotICAgICAgICAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDYzLCAweDY0LCAweDY1LAotICAgICAgICAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LAotICAgICAgICAweDc5LCAweDdhLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLAotICAgICAgICAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLAotICAgICAgICAweGE0LCAweGE1LCAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LCAweGI1LAotICAgICAgICAweGI2LCAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LAotICAgICAgICAweGM4LCAweGM5LCAweGNhLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LAotICAgICAgICAweGRhLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGYyLAotICAgICAgICAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweGZmLCAweGRhLCAweDAwLAotICAgICAgICAweDBjLCAweDAzLCAweDAxLCAweDAwLCAweDAyLCAweDExLCAweDAzLCAweDExLCAweDAwLCAweDNmLCAweDAwLAotICAgICAgICAweDE0LCAweDU0LCAweGFhLCAweDJhLCAweDQ2LCAweDQ4LCAweGEyLCAweGE0LCAweDU1LCAweGE2LCAweDA0LAotICAgICAgICAweDhhLCAweDI5LCAweGUwLCAweDUzLCAweDEwLCAweGUwLCAweDI5LCAweGMwLCAweDUwLCAweDAzLCAweGIxLAotICAgICAgICAweDQ2LCAweDI5LCAweDgwLCAweDg0LCAweDUyLCAweDExLCAweDQwLCAweDBkLCAweDIyLCAweDlhLCAweDQ1LAotICAgICAgICAweDIwLCAweDIzLCAweDYxLCAweDUxLCAweDMwLCAweGEwLCAweDA4LCAweGM4LCAweGE4LCAweGQ4LCAweDUyLAotICAgICAgICAweDAyLCAweDI2LCAweDE1LCAweDBiLCAweDBhLCAweDAwLCAweGI0LCAweGEyLCAweGE1LCAweDVhLCAweDAwLAotICAgICAgICAweDkxLCAweDQ1LCAweDRhLCAweGEyLCAweDgxLCAweDkyLCAweDAxLCAweDRlLCAweDAyLCAweDk4LCAweDg3LAotICAgICAgICAweDBhLCAweDcwLCAweGEwLCAweDA3LCAweDYyLCAweDhjLCAweDUwLCAweDIxLCAweDBkLCAweDI1LCAweDAwLAotICAgICAgICAweDM0LCAweDhhLCAweDYxLCAweDE0LCAweDBjLCAweDYzLCAweDBhLCAweDg5LCAweDg1LCAweDAwLCAweDQ2LAotICAgICAgICAweGQ1LCAweDFiLCAweDUyLCAweDAyLCAweDE2LCAweGE4LCAweDk4LCAweDUwLCAweDA1LCAweDk0LCAweGE5LAotICAgICAgICAweDE2LCAweDgwLCAweDI1LCAweDVhLCAweDk1LCAweDY4LCAweDE4LCAweGYxLCAweDRmLCAweDE0LCAweGM0LAotICAgICAgICAweDNiLCAweGI1LCAweDIyLCAweGI2LCAweDM4LCAweDM0LCAweDAwLCAweGUzLCAweDIyLCAweDhlLCAweGY0LAotICAgICAgICAweDc5LCAweDhhLCAweDdiLCAweGQxLCAweDcxLCAweDAzLCAweDMwLCAweGM3LCAweDE0LCAweDgzLCAweGE1LAotICAgICAgICAweDAwLCAweDA2LCAweDk4LCAweDY4LCAweDAxLCAweDhkLCAweDUxLCAweDM1LCAweDAzLCAweDIyLCAweDZhLAotICAgICAgICAweDhkLCAweGE5LCAweDAxLCAweDEzLCAweDU0LCAweDRkLCAweDQwLCAweDEzLCAweGE1LCAweDRhLCAweDI4LAotICAgICAgICAweDAyLCAweDQ1LCAweDM1LCAweDJhLCAweDlhLCAweDAwLCAweDc4LCAweDM0LCAweGYwLCAweDY5LCAweDgwLAotICAgICAgICAweDM0LCAweDgxLCAweDQ1LCAweDQwLCAweGNlLCAweDU4LCAweGU2LCAweGEyLCAweDRjLCAweDA2LCAweGU0LAotICAgICAgICAweGZhLCAweGQxLCAweDkzLCAweDUwLCAweDIxLCAweGNhLCAweGU0LCAweDU1LCAweDg0LCAweDkwLCAweDMwLAotICAgICAgICAweGFiLCAweDhiLCAweDE4LCAweGE2LCAweDlhLCAweDZhLCAweGM0LCAweDMxLCAweGFhLCAweDI2LCAweGEwLAotICAgICAgICAweDY0LCAweDRkLCAweDUxLCAweGI1LCAweDIwLCAweDIzLCAweDZhLCAweDg5LCAweGE4LCAweDAyLCAweDQ0LAotICAgICAgICAweDM1LCAweDJhLCAweDlhLCAweDAwLCAweDk1LCAweDRkLCAweDQ4LCAweGE2LCAweDgwLCAweDI0LCAweDUzLAotICAgICAgICAweDRlLCAweGNlLCAweDA1LCAweDMwLCAweDJiLCAweDNiLCAweGVlLCAweDZhLCAweDkxLCAweDVkLCAweDc2LAotICAgICAgICAweDYzLCAweGJkLCAweDY1LCAweDdkLCAweDQwLCAweDY2LCAweDY4LCAweGE5LCAweDAyLCAweDQ1LCAweDJiLAotICAgICAgICAweGIzLCAweDllLCAweGI0LCAweGM1LCAweDZkLCAweGFkLCAweDlhLCAweGEwLCAweDJjLCAweDA2LCAweGM4LAotICAgICAgICAweGNkLCAweDA0LCAweGQ2LCAweGEyLCAweDIzLCAweDYzLCAweDUxLCAweGIxLCAweGEwLCAweDY0LCAweDRkLAotICAgICAgICAweDUxLCAweDkzLCAweDQ4LCAweDA4LCAweGRhLCAweGEyLCAweDZhLCAweDAwLCAweDcyLCAweDFhLCAweDk5LAotICAgICAgICAweDRkLCAweDAwLCAweDQ4LCAweGE2LCAweGE0LCAweDUzLCAweDRjLCAweDA3LCAweDg2LCAweDAzLCAweGJkLAotICAgICAgICAweDJiLCAweDljLCAweGE3LCAweDE0LCAweDk4LCAweDEwLCAweDg1LCAweDM0LCAweGUwLCAweGE2LCAweGIzLAotICAgICAgICAweGIwLCAweDBiLCAweGI1LCAweGE4LCAweDBhLCAweGQ0LCAweDU4LCAweDQyLCAweGVkLCAweDNlLCAweDk0LAotICAgICAgICAweGQyLCAweGE2LCAweDhiLCAweDAxLCAweDM0LCAweDQ0LCAweGVkLCAweGU2LCAweDljLCAweDRkLCAweDZhLAotICAgICAgICAweDgwLCAweDhkLCAweDhkLCAweDQ2LCAweGM2LCAweDgwLCAweDIzLCAweDYzLCAweDUxLCAweDlhLCAweDA2LAotICAgICAgICAweDQ2LCAweGQ1LCAweDEzLCAweDUyLCAweDAxLCAweDU0LCAweGQ0LCAweGFhLCAweDY4LCAweDAyLCAweDQwLAotICAgICAgICAweDZhLCAweDQwLCAweDc4LCAweGEwLCAweDA4LCAweDU5LCAweGNlLCAweGVlLCAweGI1LCAweDJhLCAweDM5LAotICAgICAgICAweGQ5LCAweDU5LCAweGE3LCAweGE4LCAweDAwLCAweDczLCAweGViLCAweDRlLCAweDBlLCAweDdkLCAweDY5LAotICAgICAgICAweDVjLCAweDA1LCAweGYzLCAweDBmLCAweGFkLCAweDFlLCAweDYxLCAweGY1LCAweGE3LCAweDcxLCAweDBiLAotICAgICAgICAweGU2LCAweDM1LCAweDIxLCAweDkwLCAweGQzLCAweGI4LCAweDBlLCAweDMyLCAweDEwLCAweDk1LCAweDEwLAotICAgICAgICAweDkxLCAweGIzLCAweGQ2LCAweDliLCAweDYwLCAweDRiLCAweDljLCAweDhhLCAweDYzLCAweDFhLCAweGIwLAotICAgICAgICAweDE4LCAweDRkLCAweDQ2LCAweGM2LCAweDgwLCAweDIyLCAweDZhLCAweDYxLCAweGE0LCAweDMxLCAweGFhLAotICAgICAgICAweDZhLCAweDU1LCAweDM0LCAweDAxLCAweDJhLCAweDlhLCAweDdlLCAweDc4LCAweGEwLCAweDA4LCAweDA5LAotICAgICAgICAweGY5LCAweGFhLCAweDU4LCAweGNmLCAweGNhLCAweDZiLCAweDNlLCAweGEwLCAweDAwLCAweGQzLCAweDgxLAotICAgICAgICAweGE5LCAweDAxLCAweDczLCAweDQ2LCAweDY5LCAweDgwLCAweGI5LCAweGE0LCAweGNkLCAweDAwLCAweDJiLAotICAgICAgICAweDFmLCAweDkyLCAweGEzLCAweDA3LCAweDlhLCAweDZmLCAweDcwLCAweDI2LCAweGNmLCAweDE0LCAweGQyLAotICAgICAgICAweDZiLCAweDUxLCAweDBjLCAweDYzLCAweDUxLCAweGIxLCAweGEwLCAweDA4LCAweGRhLCAweDk4LCAweDY5LAotICAgICAgICAweDBjLCAweDhkLCAweDRkLCAweDRhLCAweGE2LCAweDgwLCAweDI0LCAweDUzLCAweDUyLCAweDAzLCAweGM1LAotICAgICAgICAweDAyLCAweDIxLCAweDI3LCAweGU2LCAweGE5LCAweDIzLCAweDNmLCAweDI5LCAweGFjLCAweGZhLCAweDhjLAotICAgICAgICAweDAxLCAweGU2LCAweDljLCAweDBkLCAweDQ4LCAweDBhLCAweDBkLCAweDJlLCAweDY4LCAweDAxLCAweDczLAotICAgICAgICAweDQ5LCAweDlhLCAweDYwLCAweDJiLCAweDFmLCAweDkyLCAweDk4LCAweDNhLCAweGQzLCAweDdiLCAweDgxLAotICAgICAgICAweDM2LCAweDc4LCAweGE2LCAweDkzLCAweDVhLCAweDg4LCAweDhjLCAweDlhLCAweDYzLCAweDFhLCAweDAwLAotICAgICAgICAweDhjLCAweGQzLCAweDBkLCAweDIxLCAweDkxLCAweDI5LCAweGE5LCAweDE0LCAweGQwLCAweDA0LCAweDhhLAotICAgICAgICAweDY5LCAweGUwLCAweGQzLCAweDExLCAweDFiLCAweDFlLCAweDZhLCAweDQ4LCAweGNmLCAweGNhLCAweDZiLAotICAgICAgICAweDNlLCAweGEzLCAweDEwLCAweDFhLCAweDcwLCAweDM1LCAweDIwLCAweDM4LCAweDFhLCAweDVjLCAweGQyLAotICAgICAgICAweDAxLCAweDczLCAweDQ5LCAweDlhLCAweDYwLCAweDM5LCAweDhmLCAweGNhLCAweDI5LCAweDhiLCAweGY3LAotICAgICAgICAweGFhLCAweGJhLCAweDg4LCAweDk2LCAweDlhLCAweDZiLCAweDQwLCAweDE4LCAweGM2LCAweGEzLCAweDI2LAotICAgICAgICAweDgwLCAweDE4LCAweDY5LCAweGE2LCAweDkwLCAweGM4LCAweDE0LCAweGQ0LCAweDhhLCAweDY5LCAweDgwLAotICAgICAgICAweGYwLCAweDZhLCAweDQwLCAweDY4LCAweDEwLCAweGJiLCAweDQxLCAweGE3LCAweGUzLCAweDBiLCAweGM1LAotICAgICAgICAweDJiLCAweDAxLCAweDEwLCAweGE3LCAweDAzLCAweDU5LCAweDBjLCAweDc2LCAweDY5LCAweDczLCAweDQwLAotICAgICAgICAweDBiLCAweDlhLCAweDI4LCAweDExLCAweDI4LCAweDE5LCAweDVlLCAweDY5LCAweDAyLCAweDgxLCAweDVhLAotICAgICAgICAweGQ4LCAweDAwLCAweGQzLCAweDRkLCAweDUwLCAweDBjLCAweDZhLCAweDhjLCAweGQyLCAweDAxLCAweGE2LAotICAgICAgICAweDk4LCAweDY5LCAweDBjLCAweGFlLCAweGE2LCAweGE0LCAweDA2LCAweDgwLCAweDFlLCAweGE2LCAweDllLAotICAgICAgICAweDBkLCAweDMxLCAweDEyLCAweDAzLCAweDRmLCAweDA2LCAweDgwLCAweDEzLCAweDYwLCAweDM0LCAweGQzLAotICAgICAgICAweGMxLCAweGE4LCAweDkyLCAweDAxLCAweGYxLCAweDhkLCAweGRkLCAweDY5LCAweGNjLCAweGExLCAweDY5LAotICAgICAgICAweDViLCAweDRiLCAweDgwLCAweDgzLCAweDkzLCAweDUyLCAweDA0LCAweDE0LCAweGUyLCAweGFlLCAweDAzLAotICAgICAgICAweGE5LCAweDBkLCAweDY4LCAweDAzLCAweDRkLCAweDM0LCAweGQwLCAweDAzLCAweDBkLCAweDMwLCAweGQyLAotICAgICAgICAweDAxLCAweDg2LCAweDlhLCAweDY4LCAweDE5LCAweDU4LCAweDFhLCAweDc4LCAweGE0LCAweDA0LCAweDhhLAotICAgICAgICAweDY5LCAweGUwLCAweGQzLCAweDEwLCAweGUwLCAweDY5LCAweGUwLCAweGQwLCAweDAzLCAweGMxLCAweGE4LAotICAgICAgICAweGRiLCAweGFkLCAweDRjLCAweDgxLCAweDEyLCAweDQ1LCAweGQ2LCAweDlkLCAweDI1LCAweDFkLCAweDAwLAotICAgICAgICAweDZhLCAweGY1LCAweGE5LCAweGU4LCAweDgwLCAweDMxLCAweDI5LCAweDBkLCAweDU4LCAweDA4LCAweDY5LAotICAgICAgICAweDg2LCAweDgwLCAweDFhLCAweDY5LCAweDg2LCAweDkwLCAweDBjLCAweDM0LCAweGQzLCAweDQ4LCAweDY1LAotICAgICAgICAweDUxLCAweDRmLCAweDA2LCAweDk4LCAweDBmLCAweDE0LCAweGYwLCAweDY4LCAweDEwLCAweGYwLCAweDY5LAotICAgICAgICAweGUwLCAweGQwLCAweDAzLCAweDgxLCAweGE1LCAweDJiLCAweDlhLCAweDFhLCAweGI4LCAweDg3LCAweGE4LAotICAgICAgICAweGRiLCAweDRhLCAweDQ2LCAweDY4LCAweGI2LCAweDgwLCAweDJhLCAweGE4LCAweDE0LCAweGVhLCAweDEyLAotICAgICAgICAweGIwLCAweDA1LCAweDIxLCAweGE2LCAweDAyLCAweDFhLCAweDYxLCAweGEwLCAweDA2LCAweDlhLCAweDYxLAotICAgICAgICAweGE0LCAweDMxLCAweDg2LCAweDlhLCAweDY5LCAweDBjLCAweGE4LCAweDBkLCAweDNjLCAweDUzLCAweDAxLAotICAgICAgICAweGUyLCAweDllLCAweDI4LCAweDEwLCAweGYxLCAweDRlLCAweDA2LCAweDk4LCAweDBmLCAweDA2LCAweDllLAotICAgICAgICAweDBkLCAweDAyLCAweDFjLCAweDI5LCAweGMyLCAweDgwLCAweDE2LCAweDk2LCAweDgwLCAweDBhLCAweDRhLAotICAgICAgICAweDAwLCAweDQzLCAweDRkLCAweDM0LCAweDBjLCAweDYxLCAweGE2LCAweDFhLCAweDQwLCAweDM0LCAweGQzLAotICAgICAgICAweDRkLCAweDIxLCAweDgwLCAweGZmLCAweGQ5LCAweGZmLCAweGRiLCAweDAwLCAweDg0LCAweDAwLCAweDBhLAotICAgICAgICAweDA3LCAweDA3LCAweDA4LCAweDA3LCAweDA2LCAweDBhLCAweDA4LCAweDA4LCAweDA4LCAweDBiLCAweDBhLAotICAgICAgICAweDBhLCAweDBiLCAweDBlLCAweDE4LCAweDEwLCAweDBlLCAweDBkLCAweDBkLCAweDBlLCAweDFkLCAweDE1LAotICAgICAgICAweDE2LCAweDExLCAweDE4LCAweDIzLCAweDFmLCAweDI1LCAweDI0LCAweDIyLCAweDFmLCAweDIyLCAweDIxLAotICAgICAgICAweDI2LCAweDJiLCAweDM3LCAweDJmLCAweDI2LCAweDI5LCAweDM0LCAweDI5LCAweDIxLCAweDIyLCAweDMwLAotICAgICAgICAweDQxLCAweDMxLCAweDM0LCAweDM5LCAweDNiLCAweDNlLCAweDNlLCAweDNlLCAweDI1LCAweDJlLCAweDQ0LAotICAgICAgICAweDQ5LCAweDQzLCAweDNjLCAweDQ4LCAweDM3LCAweDNkLCAweDNlLCAweDNiLCAweDAxLCAweDBhLCAweDBiLAotICAgICAgICAweDBiLCAweDBlLCAweDBkLCAweDBlLCAweDFjLCAweDEwLCAweDEwLCAweDFjLCAweDNiLCAweDI4LCAweDIyLAotICAgICAgICAweDI4LCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLAotICAgICAgICAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLAotICAgICAgICAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLAotICAgICAgICAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLAotICAgICAgICAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweGZmLCAweGMwLCAweDAwLCAweDExLAotICAgICAgICAweDA4LCAweDAwLCAweDQ4LCAweDAwLCAweDYwLCAweDAzLCAweDAxLCAweDIxLCAweDAwLCAweDAyLCAweDExLAotICAgICAgICAweDAxLCAweDAzLCAweDExLCAweDAxLCAweGZmLCAweGM0LCAweDAxLCAweGEyLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDA1LCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAotICAgICAgICAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDEwLCAweDAwLCAweDAyLCAweDAxLCAweDAzLCAweDAzLCAweDAyLAotICAgICAgICAweDA0LCAweDAzLCAweDA1LCAweDA1LCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDAxLCAweDdkLCAweDAxLAotICAgICAgICAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLCAweDIxLCAweDMxLCAweDQxLCAweDA2LAotICAgICAgICAweDEzLCAweDUxLCAweDYxLCAweDA3LCAweDIyLCAweDcxLCAweDE0LCAweDMyLCAweDgxLCAweDkxLCAweGExLAotICAgICAgICAweDA4LCAweDIzLCAweDQyLCAweGIxLCAweGMxLCAweDE1LCAweDUyLCAweGQxLCAweGYwLCAweDI0LCAweDMzLAotICAgICAgICAweDYyLCAweDcyLCAweDgyLCAweDA5LCAweDBhLCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDI1LAotICAgICAgICAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LAotICAgICAgICAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLCAweDUzLCAweDU0LAotICAgICAgICAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LAotICAgICAgICAweDY4LCAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LCAweDdhLAotICAgICAgICAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDkyLCAweDkzLCAweDk0LAotICAgICAgICAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LAotICAgICAgICAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAweGI4LAotICAgICAgICAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLAotICAgICAgICAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLCAweGUxLCAweGUyLAotICAgICAgICAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGYxLCAweGYyLCAweGYzLAotICAgICAgICAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweDAxLCAweDAwLCAweDAzLCAweDAxLAotICAgICAgICAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LAotICAgICAgICAweDA5LCAweDBhLCAweDBiLCAweDExLCAweDAwLCAweDAyLCAweDAxLCAweDAyLCAweDA0LCAweDA0LCAweDAzLAotICAgICAgICAweDA0LCAweDA3LCAweDA1LCAweDA0LCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDc3LCAweDAwLCAweDAxLAotICAgICAgICAweDAyLCAweDAzLCAweDExLCAweDA0LCAweDA1LCAweDIxLCAweDMxLCAweDA2LCAweDEyLCAweDQxLCAweDUxLAotICAgICAgICAweDA3LCAweDYxLCAweDcxLCAweDEzLCAweDIyLCAweDMyLCAweDgxLCAweDA4LCAweDE0LCAweDQyLCAweDkxLAotICAgICAgICAweGExLCAweGIxLCAweGMxLCAweDA5LCAweDIzLCAweDMzLCAweDUyLCAweGYwLCAweDE1LCAweDYyLCAweDcyLAotICAgICAgICAweGQxLCAweDBhLCAweDE2LCAweDI0LCAweDM0LCAweGUxLCAweDI1LCAweGYxLCAweDE3LCAweDE4LCAweDE5LAotICAgICAgICAweDFhLCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LAotICAgICAgICAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLCAweDUzLCAweDU0LAotICAgICAgICAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LAotICAgICAgICAweDY4LCAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LCAweDdhLAotICAgICAgICAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDkyLCAweDkzLAotICAgICAgICAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LCAweGE1LAotICAgICAgICAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LAotICAgICAgICAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LAotICAgICAgICAweGNhLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLCAweGUyLAotICAgICAgICAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGYyLCAweGYzLCAweGY0LAotICAgICAgICAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweGZmLCAweGRhLCAweDAwLCAweDBjLCAweDAzLAotICAgICAgICAweDAxLCAweDAwLCAweDAyLCAweDExLCAweDAzLCAweDExLCAweDAwLCAweDNmLCAweDAwLCAweDllLCAweGQyLAotICAgICAgICAweDJlLCAweDA3LCAweDE1LCAweGFmLCAweDZkLCAweDA4LCAweGUyLCAweGIzLCAweDQ1LCAweDFhLCAweGY2LAotICAgICAgICAweGQwLCAweDAwLCAweDAxLCAweGM1LCAweDY4LCAweDQ1LCAweDE3LCAweDRhLCAweGI0LCAweDIyLCAweGU0LAotICAgICAgICAweDcwLCAweDhjLCAweDc0LCAweGE5LCAweDNjLCAweGExLCAweDhlLCAweDk1LCAweDQ4LCAweDk2LCAweDMxLAotICAgICAgICAweGUyLCAweDE4LCAweGU5LCAweDU1LCAweGE1LCAweDhjLCAweDdhLCAweDUwLCAweDA1LCAweDBiLCAweDg4LAotICAgICAgICAweDg2LCAweDBmLCAweDE1LCAweDhmLCAweDc1LCAweDFmLCAweDI2LCAweDkzLCAweDE5LCAweDkxLCAweDc3LAotICAgICAgICAweDE4LCAweGMxLCAweGFjLCAweDRiLCAweGM4LCAweGZhLCAweGQ2LCAweDYzLCAweDM3LCAweDZkLCAweDMxLAotICAgICAgICAweGI0LCAweDczLCAweDViLCAweDM2LCAweGEwLCAweDFjLCAweDUwLCAweDgwLCAweGQ3LCAweDgzLCAweGEwLAotICAgICAgICAweGFiLCAweGQxLCAweDYyLCAweGFkLCAweDA5LCAweDhmLCAweDE3LCAweDI5LCAweDAzLCAweGIyLCAweGNjLAotICAgICAgICAweGUwLCAweDc3LCAweDE0LCAweGEzLCAweDU2LCAweGIzLCAweDI3LCAweDFlLCAweDY3LCAweGU5LCAweDUyLAotICAgICAgICAweGVhLCAweGM2LCAweDNhLCAweDM2LCAweDQ4LCAweGVmLCAweDNkLCAweDI3LCAweDcwLCAweDIyLCAweDYwLAotICAgICAgICAweDQ3LCAweDUyLCAweDY5LCAweGIyLCAweGUyLCAweGFkLCAweDNiLCAweGVhLCAweDgwLCAweGEzLCAweDM4LAotICAgICAgICAweGUwLCAweGQ2LCAweDNkLCAweGQ4LCAweDFjLCAweGQwLCAweGNhLCAweDQ2LCAweDNkLCAweGQwLCAweDE4LAotICAgICAgICAweDM1LCAweDg5LCAweDc4LCAweGEzLCAweDlhLCAweGNkLCAweDhjLCAweGQyLCAweGIzLCAweDkzLCAweDJhLAotICAgICAgICAweDJiLCAweDY2LCAweGQ1LCAweGYxLCAweDhhLCAweDEwLCAweDFhLCAweGQ2LCAweGYyLCAweDAzLCAweDhhLAotICAgICAgICAweDllLCAweGU2LCAweGY0LCAweDVhLCAweGRiLCAweGVmLCAweGZlLCAweDIzLCAweGMwLCAweGE3LCAweDI3LAotICAgICAgICAweGNiLCAweDE2LCAweGM0LCAweGNjLCAweGRkLCAweGUyLCAweDc4LCAweDlhLCAweDY5LCAweDY2LCAweGNjLAotICAgICAgICAweDk5LCAweGUxLCAweDRkLCAweDQ3LCAweGJhLCAweGJjLCAweGQ5LCAweDZhLCAweGVlLCAweDI2LCAweDU5LAotICAgICAgICAweDU5LCAweDRkLCAweGFjLCAweDY5LCAweDM0LCAweDUyLCAweGU1LCAweDhmLCAweDU1LCAweGFkLCAweDU4LAotICAgICAgICAweGFlLCAweDg1LCAweGM0LCAweDIyLCAweDQxLCAweGRmLCAweGFkLCAweDc2LCAweDYxLCAweGU1LCAweDZmLAotICAgICAgICAweDc0LCAweDQ1LCAweDY5LCAweGRjLCAweDAwLCAweDc5LCAweGFjLCAweDhiLCAweGE2LCAweGM5LCAweDM1LAotICAgICAgICAweGQ0LCAweDM0LCAweDY0LCAweGRjLCAweDM3LCAweDA2LCAweGIxLCAweGFlLCAweDg4LCAweGMxLCAweGFjLAotICAgICAgICAweGQ4LCAweGM5LCAweDJjLCAweGE2LCAweGUwLCAweDczLCAweDViLCAweDM2LCAweGYzLCAweDc0LCAweGU2LAotICAgICAgICAweDg0LCAweDA1LCAweGUzLCAweGE5LCAweDQ3LCAweDZhLCAweDE0LCAweGI2LCAweDQ5LCAweDNkLCAweDg1LAotICAgICAgICAweDNhLCAweGVlLCAweGVlLCAweDJiLCAweGE4LCAweGUyLCAweDZmLCAweDMwLCAweDgxLCAweGU5LCAweDhhLAotICAgICAgICAweGNhLCAweGE0LCAweGUyLCAweGQzLCAweDhiLCAweDAxLCAweGIxLCAweGY5LCAweDA0LCAweDdmLCAweGFmLAotICAgICAgICAweDIzLCAweGYwLCAweGE5LCAweDU0LCAweDQxLCAweDljLCAweGZkLCAweGEzLCAweGY0LCAweGFlLCAweDY1LAotICAgICAgICAweDE4LCAweGY3LCAweDI1LCAweDhhLCAweGUyLCAweDAyLCAweDM4LCAweGI4LCAweGZkLCAweDJhLCAweDdiLAotICAgICAgICAweDViLCAweGE4LCAweDZkLCAweDZkLCAweDVkLCAweDlhLCAweDVkLCAweGNiLCAweGJiLCAweGQyLCAweGI2LAotICAgICAgICAweGE2LCAweGEzLCAweDE5LCAweDVlLCAweGUyLCAweDAzLCAweDdiLCAweDFkLCAweGMyLCAweDE3LCAweDhkLAotICAgICAgICAweGI4LCAweGFjLCAweGZiLCAweDg5LCAweDM5LCAweDM1LCAweGQ2LCAweDlhLCAweDZhLCAweGU4LCAweDY2LAotICAgICAgICAweDU1LCAweGNiLCAweGY1LCAweGFjLCAweDdiLCAweDk2LCAweGViLCAweDUwLCAweGM2LCAweDg4LCAweDZkLAotICAgICAgICAweDY2LCAweGU5LCAweGNkLCAweDZjLCAweGRiLCAweDRmLCAweGQzLCAweDlhLCAweDAwLCAweDJmLCAweGU2LAotICAgICAgICAweGY5LCAweGEzLCAweGU3LCAweGI1LCAweDRhLCAweDkzLCAweDdmLCAweGEyLCAweGM2LCAweDczLCAweGRjLAotICAgICAgICAweGQ3LCAweDE1LCAweDU1LCAweGVmLCAweDQ4LCAweDdkLCAweDA5LCAweDUyLCAweDZlLCAweDNhLCAweGQ0LAotICAgICAgICAweGFiLCAweDJmLCAweGJkLCAweDYxLCAweDE2LCAweDBjLCAweDczLCAweDQ5LCAweGM1LCAweDI0LCAweDkyLAotICAgICAgICAweDdmLCAweGEyLCAweDYzLCAweGZkLCAweGFhLCAweGQ2LCAweDJmLCAweDcxLCAweDBlLCAweGIxLCAweDkzLAotICAgICAgICAweGY3LCAweDJkLCAweGY1LCAweGE0LCAweDllLCAweDRlLCAweGI1LCAweGRkLCAweDRiLCAweGY4LCAweDY4LAotICAgICAgICAweDRjLCAweGNiLCAweGI5LCAweDkzLCAweGFkLCAweDY1LCAweGNlLCAweGQ5LCAweDI2LCAweGE5LCAweDhkLAotICAgICAgICAweDE5LCAweGY2LCAweGYyLCAweGY0LCAweGU2LCAweGI1LCAweGFkLCAweGU3LCAweGM2LCAweDM5LCAweGEwLAotICAgICAgICAweDE4LCAweGViLCAweGM5LCAweDc3LCAweDZjLCAweDM1LCAweDJhLCAweDRiLCAweGZlLCAweDhhLCAweDljLAotICAgICAgICAweGZmLCAweDAwLCAweDExLCAweGFlLCAweDNhLCAweDhiLCAweGRlLCAweDYxLCAweGQwLCAweDllLCAweDM5LAotICAgICAgICAweGI4LCAweGViLCAweDUzLCAweGFjLCAweGI5LCAweGFlLCAweDViLCAweDAwLCAweGYzLCAweDI3LCAweDE0LAotICAgICAgICAweDkyLCAweGM5LCAweGZlLCAweDhhLCAweDNmLCAweGRlLCAweDM1LCAweGFjLCAweDNhLCAweDg4LCAweDkyLAotICAgICAgICAweGNkLCAweGIxLCAweDZlLCAweDdkLCAweGNkLCAweDMyLCAweDY3LCAweGViLCAweGNkLCAweDdhLCAweDE0LAotICAgICAgICAweGZlLCAweDA0LCAweDI2LCAweDY2LCAweGNlLCAweGY5LCAweDI2LCAweGIzLCAweGU2LCAweDZlLCAweGI0LAotICAgICAgICAweGQ5LCAweDQ4LCAweGM4LCAweDgyLCAweDRlLCAweDA3LCAweDM1LCAweGE3LCAweDZmLCAweDJmLCAweDAyLAotICAgICAgICAweDlhLCAweDA2LCAweDVmLCAweDhjLCAweGE0LCAweDgzLCAweDBlLCAweDMyLCAweDJhLCAweDY5LCAweGUzLAotICAgICAgICAweGRkLCAweDEyLCAweDA4LCAweDk3LCAweDg1LCAweGVjLCAweDJhLCAweDJhLCAweDQyLCAweGYxLCAweDc2LAotICAgICAgICAweDI2LCAweGU0LCAweDZhLCAweDU5LCAweDBlLCAweDE4LCAweDEwLCAweDZhLCAweGQyLCAweDg5LCAweDAyLAotICAgICAgICAweDZlLCAweDJhLCAweDcxLCAweGViLCAweDVjLCAweDFjLCAweDhjLCAweGE2LCAweDQ4LCAweGJiLCAweGRjLAotICAgICAgICAweDYxLCAweDQxLCAweDM1LCAweDcyLCAweDI4LCAweDg3LCAweGQ5LCAweGY2LCAweDRhLCAweGI5LCAweGU3LAotICAgICAgICAweDM4LCAweGFlLCAweDhjLCAweDNkLCAweDM2LCAweGRkLCAweGRlLCAweGM0LCAweGIwLCAweDIxLCAweDUxLAotICAgICAgICAweDc2LCAweGE4LCAweGMwLCAweGFhLCAweDkzLCAweDMxLCAweGU2LCAweGJiLCAweDJkLCAweDY1LCAweDYxLAotICAgICAgICAweDE5LCAweGQzLCAweDFlLCAweGI1LCAweDQ2LCAweDVhLCAweDk2LCAweDVhLCAweDMwLCAweGEwLCAweDdlLAotICAgICAgICAweDA1LCAweDY5LCAweDViLCAweGM5LCAweGM2LCAweDI4LCAweDQwLCAweGNkLCAweDA4LCAweDY0LCAweDNjLAotICAgICAgICAweDczLCAweDU3LCAweGUxLCAweDk0LCAweGYxLCAweGNkLCAweDVhLCAweDIxLCAweDhjLCAweGI5LCAweDYzLAotICAgICAgICAweGU3LCAweDY3LCAweDFkLCAweGFiLCAweDQwLCAweGIxLCAweGZiLCAweDAwLCAweDFkLCAweGYwLCAweDJiLAotICAgICAgICAweDk5LCAweDJkLCAweDY2LCAweDNlLCAweDg4LCAweDc1LCAweDgxLCAweDNmLCAweDMxLCAweGY2LCAweGFiLAotICAgICAgICAweDY0LCAweGQ2LCAweGI0LCAweDE3LCAweGVlLCAweGQwLCAweDllLCAweGU0LCAweDMyLCAweDFhLCAweGE3LAotICAgICAgICAweDMxLCAweGFkLCAweDE4LCAweDE0LCAweDI2LCAweGVmLCAweDU0LCAweGE1LCAweGE4LCAweDY1LCAweGEzLAotICAgICAgICAweDljLCAweDgxLCAweGZhLCAweDU2LCAweDhjLCAweDJkLCAweGNlLCAweDY4LCAweDQwLCAweGNiLCAweGYxLAotICAgICAgICAweDM3LCAweGJkLCAweDVlLCAweDg1LCAweGVhLCAweGQxLCAweDBjLCAweGJiLCAweDE5LCAweDU2LCAweDIzLAotICAgICAgICAweDIwLCAweDFmLCAweGFkLCAweDVjLCAweDQyLCAweDA4LCAweDAzLCAweGI1LCAweDU1LCAweDkxLCAweDA0LAotICAgICAgICAweGM5LCAweDgwLCAweDM4LCAweDAwLCAweDBhLCAweDcxLCAweDM0LCAweDZjLCAweDMyLCAweDI3LCAweGU5LAotICAgICAgICAweDU1LCAweDI1LCAweDE1LCAweDJjLCAweDY4LCAweGEzLCAweDMwLCAweGViLCAweDU0LCAweGE1LCAweDE1LAotICAgICAgICAweDBjLCAweGQxLCAweDAwLCAweGZmLCAweGQ5fTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGJ5dGVbXSBzUGhvdG9CeXRlQXJyYXlGb3JDb21wbGljYXRlZENhc2U7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gc1Bob3RvSW50QXJyYXlGb3JDb21wbGljYXRlZENhc2UubGVuZ3RoOwotICAgICAgICBzUGhvdG9CeXRlQXJyYXlGb3JDb21wbGljYXRlZENhc2UgPSBuZXcgYnl0ZVtsZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBzUGhvdG9CeXRlQXJyYXlGb3JDb21wbGljYXRlZENhc2VbaV0gPSAoYnl0ZSlzUGhvdG9JbnRBcnJheUZvckNvbXBsaWNhdGVkQ2FzZVtpXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFTaW1wbGVDYXNlMV9QYXJzaW5nKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfc2ltcGxlXzEpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhvdXRWZXJzaW9uKCkgIC8vIG5vICJWRVJTSU9OOjIuMSIgbGluZS4KLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgIkFuZG87Um9pZDsiLCBBcnJheXMuYXNMaXN0KCJBbmRvIiwgIlJvaWQiLCAiIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFTaW1wbGVDYXNlMV9UeXBlX0dlbmVyaWMoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDLCBSLnJhdy52MjFfc2ltcGxlXzEpOwotICAgICAgICBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFuZG8iKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiUm9pZCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlJvaWQgQW5kbyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFTaW1wbGVDYXNlMV9UeXBlX0phcGFuZXNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0UsIFIucmF3LnYyMV9zaW1wbGVfMSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQW5kbyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJSb2lkIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5hbWUtcmVsYXRlZCBzdHJpbmdzIG9ubHkgY29udGFpbnMgcHJpbnRhYmxlIEFzY2lpLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG9yZGVyIGlzIHJlbWFpbmVkIHRvIGJlIFVTJ3M6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAiUHJlZml4IEdpdmVuIE1pZGRsZSBGYW1pbHkgU3VmZml4IgotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJSb2lkIEFuZG8iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxU2ltcGxlQ2FzZTIoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgUi5yYXcudjIxX3NpbXBsZV8yKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiQW5kbyBSb2lkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMVNpbXBsZUNhc2UzKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfc2ltcGxlXzMpOwotICAgICAgICBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFuZG8iKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiUm9pZCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAiRk4iIGZpZWxkIHNob3VsZCBiZSBwcmVmZXJlZCBzaW5jZSBpdCBzaG91bGQgY29udGFpbiB0aGUgb3JpZ2luYWwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yZGVyIGludGVuZGVkIGJ5IHRoZSBhdXRob3Igb2YgdGhlIGZpbGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkFuZG8gUm9pZCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzICc7JyBpcyBwcm9wZXJseSBoYW5kbGVkIGJ5IFZDYXJkUGFyc2VyIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFCYWNrc2xhc2hDYXNlX1BhcnNpbmcoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9iYWNrc2xhc2gpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICI7QTtCXFw7Q1xcOztEOzpFO1xcXFw7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsICJBO0JcXCIsICJDXFw7IiwgIkQiLCAiOkUiLCAiXFxcXCIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJBO0JcXENcXDtEOkVcXFxcIik7Ci0gICAgICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIENvbnRhY3RTdHJ1Y3QgY29ycmVjdGx5IGlnbm9yZXMgcmVkdW5kYW50IGZpZWxkcyBpbiAiTiIgcHJvcGVydHkgdmFsdWVzIGFuZAotICAgICAqIGluc2VydHMgbmFtZSByZWxhdGVkIGRhdGEuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUJhY2tzbGFzaENhc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9iYWNrc2xhc2gpOwotICAgICAgICBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRkFNSUxZX05BTUUgaXMgZW1wdHkgYW5kIHJlbW92ZWQgaW4gdGhpcyB0ZXN0Li4uCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJBO0JcXCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiQ1xcOyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkQiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICI6RSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkE7QlxcQ1xcO0Q6RVxcXFwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3JnQmVmb3JUaXRsZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX29yZ19iZWZvcmVfdGl0bGUpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiTm9ybWFsIEd1eSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiQ29tcGFueSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIk9yZ2FuaXphdGlvbiBEZXZpc2lvbiBSb29tIFNoZWV0IE5vLiIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJFeGNlbGxlbnQgSmFuaXRvciIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVFlQRSwgT3JnYW5pemF0aW9uLlRZUEVfV09SSyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRpdGxlQmVmb3JPcmcoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV90aXRsZV9iZWZvcmVfb3JnKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIk5pY2UgR3V5Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJNYXJ2ZXJvdXMiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQsICJQZXJmZWN0IEdyZWF0IEdvb2QgQmFkIFBvb3IiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRJVExFLCAiQ29vbCBUaXRsZSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVFlQRSwgT3JnYW5pemF0aW9uLlRZUEVfV09SSyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdGhhdCB2Q2FyZCBpbXBvcnRlciBjb3JyZWN0bHkgaW50ZXJwcmV0ICJQUkVGIiBhdHRyaWJ1dGUgdG8gSVNfUFJJTUFSWS4KLSAgICAgKiBUaGUgZGF0YSBjb250YWluIHRocmVlIGNhc2VzOiBvbmUgIlBSRUYiLCBubyAiUFJFRiIgYW5kIG11bHRpcGxlICJQUkVGIiwgaW4gZWFjaCB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFQcmVmVG9Jc1ByaW1hcnkoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9wcmVmX2hhbmRsaW5nKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KERhdGEuTUlNRVRZUEUsIFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiU21pdGgiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjIiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIzIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSVNETik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAidGVzdEBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0ZXN0MkBleGFtaW5hdGlvbi5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9NT0JJTEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIkNvbXBhbnkiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRJVExFLCAiRW5naW5lZXIiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRZUEUsIE9yZ2FuaXphdGlvbi5UWVBFX1dPUkspOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiTXlzdGVyeSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJCbG9nZ2VyIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIlBvZXRyeSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJQb2V0IikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBhbGwgdGhlIHByb3BlcnRpZXMgaW4gYSBjb21wbGljYXRlZCB2Q2FyZCBhcmUgY29ycmVjdGx5IHBhcnNlZCBieSB0aGUgVkNhcmRQYXJzZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUNvbXBsaWNhdGVkQ2FzZV9QYXJzaW5nKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfY29tcGxpY2F0ZWQpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJHdW1wO0ZvcnJlc3Q7SG9nZTtQb3M7VGFvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkd1bXAiLCAiRm9ycmVzdCIsICJIb2dlIiwgIlBvcyIsICJUYW8iKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJKb2UgRHVlIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJPUkciLAotICAgICAgICAgICAgICAgICAgICAgICAgIkd1bXAgU2hyaW1wIENvLjtTYWxlcyBEZXB0LjtNYW5hZ2VyO0Zpc2gga2VlcGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkd1bXAgU2hyaW1wIENvLiIsICJTYWxlcyBEZXB0LjtNYW5hZ2VyIiwgIkZpc2gga2VlcGVyIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiUk9MRSIsICJGaXNoIENha2UgS2VlcGVyISIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVElUTEUiLCAiU2hyaW1wIE1hbiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIoMTExKSA1NTUtMTIxMiIsIG5ldyBUeXBlU2V0KCJXT1JLIiwgIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIig0MDQpIDU1NS0xMjEyIiwgbmV3IFR5cGVTZXQoIkhPTUUiLCAiVk9JQ0UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMxMTExMTExMSIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjAzMjIyMjIyMjIiLCBuZXcgVHlwZVNldCgiVklERU8iKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMzMzMzMzMzMyIsIG5ldyBUeXBlU2V0KCJWT0lDRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiOzsxMDAgV2F0ZXJzIEVkZ2U7QmF5dG93bjtMQTszMDMxNDtVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwgIiIsICIxMDAgV2F0ZXJzIEVkZ2UiLCAiQmF5dG93biIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQSIsICIzMDMxNCIsICJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbmV3IFR5cGVTZXQoIldPUksiKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJMQUJFTCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiMTAwIFdhdGVycyBFZGdlXHJcbkJheXRvd24sIExBIDMwMzE0XHJcblVuaXRlZCAgU3RhdGVzIG9mIEFtZXJpY2EiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JRUCwgbmV3IFR5cGVTZXQoIldPUksiKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgIjs7NDIgUGxhbnRhdGlvbiBTdC47QmF5dG93bjtMQTszMDMxNDtVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwgIiIsICI0MiBQbGFudGF0aW9uIFN0LiIsICJCYXl0b3duIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBIiwgIjMwMzE0IiwgIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiSE9NRSIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkxBQkVMIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICI0MiBQbGFudGF0aW9uIFN0LlxyXG5CYXl0b3duLCBMQSAzMDMxNFxyXG5Vbml0ZWQgIFN0YXRlcyBvZiBBbWVyaWNhIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yUVAsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiSE9NRSIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkVNQUlMIiwgImZvcnJlc3RndW1wQHdhbGxhZGFsbGEuY29tIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJQUkVGIiwgIklOVEVSTkVUIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRU1BSUwiLCAiY2VsbEBleGFtcGxlLmNvbSIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTk9URSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGZvbGxvd2luZyBub3RlIGlzIHRoZSBleGFtcGxlIGZyb20gUkZDIDIwNDUuIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOT1RFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJOb3cncyB0aGUgdGltZSBmb3IgYWxsIGZvbGsgdG8gY29tZSB0byB0aGUgYWlkIG9mIHRoZWlyIGNvdW50cnkuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yUVAsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiUEhPVE8iLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgc1Bob3RvQnl0ZUFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlLCBtQ29udGVudFZhbHVlc0ZvckJhc2U2NFYyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJKUEVHIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1BVFRSSUJVVEUiLCAiU29tZSBTdHJpbmciKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkJEQVkiLCAiMTk4MDAxMDEiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkdFTyIsICIzNS42NTYzODU0LDEzOS42OTk0MjMzIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJVUkwiLCAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlJFViIsICIyMDA4MDQyNFQxOTUyNDNaIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIENvbnRhY3RTdHJ1Y3QgY29ycmVjdGx5IGluc2VydHMgdmFsdWVzIGluIGEgY29tcGxpY2F0ZWQgdkNhcmQKLSAgICAgKiBpbnRvIENvbnRlbnRSZXNvbHZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxQ29tcGxpY2F0ZWRDYXNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfY29tcGxpY2F0ZWQpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJHdW1wIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJGb3JyZXN0IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiSG9nZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJQb3MiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiVGFvIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkpvZSBEdWUiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVFlQRSwgT3JnYW5pemF0aW9uLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiR3VtcCBTaHJpbXAgQ28uIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5ULCAiU2FsZXMgRGVwdC47TWFuYWdlciBGaXNoIGtlZXBlciIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJTaHJpbXAgTWFuIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLy8gUGhvbmUgbnVtYmVyIGlzIGV4cGVjdGVkIHRvIGJlIGZvcm1hdGVkIHdpdGggTkFNUCBmb3JtYXQgaW4gZGVmYXVsdC4KLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjExMS01NTUtMTIxMiIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNDA0LTU1NS0xMjEyIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX01PQklMRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjAzMS0xMTEtMTExMSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlZJREVPIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjAzMi0yMjItMjIyMiIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlZPSUNFIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjAzMy0zMzMtMzMzMyIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZLCAiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUsICIzMDMxNCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIkxBIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ0lUWSwgIkJheXRvd24iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsICIxMDAgV2F0ZXJzIEVkZ2UiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICIxMDAgV2F0ZXJzIEVkZ2UgQmF5dG93biBMQSAzMDMxNCBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCAiMzAzMTQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5SRUdJT04sICJMQSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNJVFksICJCYXl0b3duIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuU1RSRUVULCAiNDIgUGxhbnRhdGlvbiBTdC4iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICI0MiBQbGFudGF0aW9uIFN0LiBCYXl0b3duIExBIDMwMzE0IFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC8vICJUWVBFPUlOVEVSTkVUIiAtPiBUWVBFX0NVU1RPTSArIHRoZSBsYWJlbCAiSU5URVJORVQiCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkxBQkVMLCAiSU5URVJORVQiKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgImZvcnJlc3RndW1wQHdhbGxhZGFsbGEuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLklTX1BSSU1BUlksIDEpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9NT0JJTEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAiY2VsbEBleGFtcGxlLmNvbSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJUaGUgZm9sbG93aW5nIG5vdGUgaXMgdGhlIGV4YW1wbGUgZnJvbSBSRkMgMjA0NS4iKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTm90ZS5OT1RFLAotICAgICAgICAgICAgICAgICAgICAgICAgIk5vdydzIHRoZSB0aW1lIGZvciBhbGwgZm9sayB0byBjb21lIHRvIHRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS4iKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG90by5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAvLyBObyBpbmZvcm1hdGlvbiBhYm91dCBpdHMgaW1hZ2UgZm9ybWF0IGNhbiBiZSBpbnNlcnRlZC4KLSAgICAgICAgICAgICAgICAucHV0KFBob3RvLlBIT1RPLCBzUGhvdG9CeXRlQXJyYXlGb3JDb21wbGljYXRlZENhc2UpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuU1RBUlRfREFURSwgIjE5ODAwMTAxIikKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQklSVEhEQVkpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFdlYnNpdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChXZWJzaXRlLlVSTCwgImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vIikKLSAgICAgICAgICAgICAgICAucHV0KFdlYnNpdGUuVFlQRSwgV2Vic2l0ZS5UWVBFX0hPTUVQQUdFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZE11bHRpcGxlTGluZVYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2ludmFsaWRfbXVsdGlwbGVfbGluZSk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiT21lZ2EiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiT21lZ2EiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuTEFCRUwsICJJTlRFUk5FVCIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5BRERSRVNTLCAiXCJPbWVnYVwiIDxvbWVnYUBleGFtcGxlLmNvbT4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjMwU2ltcGxlX1BhcnNpbmcoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMzAsIFIucmF3LnYzMF9zaW1wbGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiQW5kIFJvaWQiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiQW5kO1JvaWQ7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiQW5kIiwgIlJvaWQiLCAiIiwgIiIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJPUkciLCAiT3BlbjtIYW5kc2V0OyBBbGxpYW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJPcGVuIiwgIkhhbmRzZXQiLCAiIEFsbGlhbmNlIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiU09SVC1TVFJJTkciLCAiYW5kcm9pZCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjAzMDAwMDAwMDAiLCBuZXcgVHlwZVNldCgiUFJFRiIsICJWT0lDRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1HTk8iLCAiMCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1HTiIsICJncm91cDAiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlgtUkVEVUNUSU9OIiwgIjAiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlJFViIsICIyMDA4MTAzMVQwNjU4NTRaIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYzMFNpbXBsZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX3NpbXBsZSk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFuZCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiUm9pZCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJBbmQgUm9pZCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiYW5kcm9pZCIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiT3BlbiIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIkhhbmRzZXQgIEFsbGlhbmNlIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJWT0lDRSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIwMzAtMDAwLTAwMDAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuSVNfUFJJTUFSWSwgMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUphcGFuZXNlMV9QYXJzaW5nKCkgewotICAgICAgICAvLyBUaG91Z2ggSmFwYW5lc2UgY2FyZWVycyBhcHBlbmQgIjs7OzsiIGF0IHRoZSBlbmQgb2YgdGhlIHZhbHVlIG9mICJTT1VORCIsCi0gICAgICAgIC8vIHZDYXJkIDIuMS8zLjAgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBhbGxvdyBtdWx0aXBsZSB2YWx1ZXMuCi0gICAgICAgIC8vIERvIG5vdCBuZWVkIHRvIGhhbmRsZSBpdCBhcyBtdWx0aXBsZSB2YWx1ZXMuCi0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgUi5yYXcudjIxX2phcGFuZXNlXzEpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzk7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOSIsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMwMDAwMDAwMCIsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiVk9JQ0UiLCAiUFJFRiIpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFYyMUphcGFuZXNlMUNvbW1vbihpbnQgcmVzSWQsIGludCB2Y2FyZFR5cGUsIGJvb2xlYW4gamFwYW5lc2UpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KHZjYXJkVHlwZSwgcmVzSWQpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5IikKLSAgICAgICAgICAgICAgICAvLyBXaGlsZSB2Q2FyZCBwYXJzZXIgZG9lcyBub3Qgc3BsaXQgIlNPVU5EIiBwcm9wZXJ0eSB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgLy8gQ29udGFjdFN0cnVjdCBjYXJlIGl0LgotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUUiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAvLyBQaG9uZSBudW1iZXIgZm9ybWF0dGluZyBpcyBkaWZmZXJlbnQuCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsIChqYXBhbmVzZSA/ICIwMy0wMDAwLTAwMDAiIDogIjAzMC0wMDAtMDAwMCIpKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlZPSUNFIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLklTX1BSSU1BUlksIDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIHZDYXJkIHdpdGggSmFwYW5lc2UgY2FuIGJlIHBhcnNlZCBjb3JyZWN0bHkgd2l0aAotICAgICAqIHtAbGluayBjb20uYW5kcm9pZC52Y2FyZC5WQ2FyZENvbmZpZyNWQ0FSRF9UWVBFX1YyMV9HRU5FUklDfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UxX1R5cGVfR2VuZXJpY19VdGY4KCkgewotICAgICAgICB0ZXN0VjIxSmFwYW5lc2UxQ29tbW9uKAotICAgICAgICAgICAgICAgIFIucmF3LnYyMV9qYXBhbmVzZV8xLCBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdkNhcmQgd2l0aCBKYXBhbmVzZSBjYW4gYmUgcGFyc2VkIGNvcnJlY3RseSB3aXRoCi0gICAgICoge0BsaW5rIGNvbS5hbmRyb2lkLnZjYXJkLlZDYXJkQ29uZmlnI1ZDQVJEX1RZUEVfVjIxX0pBUEFORVNFfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UxX1R5cGVfSmFwYW5lc2VfU2ppcygpIHsKLSAgICAgICAgdGVzdFYyMUphcGFuZXNlMUNvbW1vbigKLSAgICAgICAgICAgICAgICBSLnJhdy52MjFfamFwYW5lc2VfMSwgVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0UsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIHZDYXJkIHdpdGggSmFwYW5lc2UgY2FuIGJlIHBhcnNlZCBjb3JyZWN0bHkgd2l0aAotICAgICAqIHtAbGluayBjb20uYW5kcm9pZC52Y2FyZC5WQ2FyZENvbmZpZyNWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRX0uCi0gICAgICogc2luY2UgdkNhcmQgMi4xIHNwZWNpZmllcyB0aGUgY2hhcnNldCBvZiBlYWNoIGxpbmUgaWYgaXQgY29udGFpbnMgbm9uLUFzY2lpLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFKYXBhbmVzZTFfVHlwZV9KYXBhbmVzZV9VdGY4KCkgewotICAgICAgICB0ZXN0VjIxSmFwYW5lc2UxQ29tbW9uKAotICAgICAgICAgICAgICAgIFIucmF3LnYyMV9qYXBhbmVzZV8xLCBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUphcGFuZXNlMl9QYXJzaW5nKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0UsIFIucmF3LnYyMV9qYXBhbmVzZV8yKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiXHU1Qjg5XHU4NUU0O1x1MzBFRFx1MzBBNFx1MzBDOVx1MDAzMTs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTVCODlcdTg1RTQiLCAiXHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiXHU1Qjg5XHU4NUU0XHUwMDIwXHUzMEVEXHUzMEE0XHUzMEM5XHUwMDIwXHUwMDMxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczO1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzMTs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgIjtcdTY3NzFcdTRFQUNcdTkwRkRcdTZFMEJcdThDMzdcdTUzM0FcdTY4NUMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMThcdTc1M0FcdTAwMzJcdTAwMzZcdTAwMkRcdTAwMzFcdTMwQkIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwRUJcdTMwRUFcdTMwQTJcdTMwRjNcdTMwQkZcdTMwRUZcdTMwRkNcdTAwMzYiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTk2OEU7Ozs7MTUwLTg1MTI7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTRFQUNcdTkwRkRcdTZFMEJcdThDMzdcdTUzM0FcdTY4NUMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUxOFx1NzUzQVx1MDAzMlx1MDAzNlx1MDAyRFx1MDAzMVx1MzBCQiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEVCXHUzMEVBXHUzMEEyXHUzMEYzXHUzMEJGXHUzMEVGXHUzMEZDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwMzZcdTk2OEUiLCAiIiwgIiIsICIiLCAiMTUwLTg1MTIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcywgbmV3IFR5cGVTZXQoIkhPTUUiKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOT1RFIiwgIlx1MzBFMVx1MzBFMiIsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcywgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUphcGFuZXNlMl9UeXBlX0dlbmVyaWNfVXRmOCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2phcGFuZXNlXzIpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTVCODlcdTg1RTQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU1Qjg5XHU4NUU0XHUwMDIwXHUzMEVEXHUzMEE0XHUzMEM5XHUwMDIwXHUwMDMxIikKLSAgICAgICAgICAgICAgICAvLyBDb250YWN0U3RydWN0IHNob3VsZCBjb3JyZWN0bHkgc3BsaXQgIlNPVU5EIiBwcm9wZXJ0eSBpbnRvIHNldmVyYWwgZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgLy8gZXZlbiB0aG91Z2ggVkNhcmRQYXJzZXIgc2lkZSBkb2VzIG5vdCBjYXJlIGl0LgotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzMSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCAiMTUwLTg1MTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU0RUFDXHU5MEZEXHU2RTBCXHU4QzM3XHU1MzNBXHU2ODVDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTE4XHU3NTNBXHUwMDMyXHUwMDM2XHUwMDJEXHUwMDMxXHUzMEJCIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEVCXHUzMEVBXHUzMEEyXHUzMEYzXHUzMEJGXHUzMEVGXHUzMEZDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUwMDM2XHU5NjhFIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU0RUFDXHU5MEZEXHU2RTBCXHU4QzM3XHU1MzNBXHU2ODVDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTE4XHU3NTNBXHUwMDMyXHUwMDM2XHUwMDJEXHUwMDMxXHUzMEJCIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEVCXHUzMEVBXHUzMEEyXHUzMEYzXHUzMEJGXHUzMEVGXHUzMEZDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUwMDM2XHU5NjhFIDE1MC04NTEyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUUpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJcdTMwRTFcdTMwRTIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxTXVsdGlwbGVFbnRyeUNhc2VfUGFyc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgUi5yYXcudjIxX211bHRpcGxlX2VudHJ5KTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMzOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzMiLCAiIiwgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiU09VTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3M1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzMzs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjkiLCBuZXcgVHlwZVNldCgiWC1ORUMtU0VDUkVUIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjEwIiwgbmV3IFR5cGVTZXQoIlgtTkVDLUhPVEVMIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjExIiwgbmV3IFR5cGVTZXQoIlgtTkVDLVNDSE9PTCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxMiIsIG5ldyBUeXBlU2V0KCJGQVgiLCAiSE9NRSIpKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDM0Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzQiLCAiIiwgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiU09VTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3M1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzNDs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjEzIiwgbmV3IFR5cGVTZXQoIk1PREVNIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE0IiwgbmV3IFR5cGVTZXQoIlBBR0VSIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE1IiwgbmV3IFR5cGVTZXQoIlgtTkVDLUZBTUlMWSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxNiIsIG5ldyBUeXBlU2V0KCJYLU5FQy1HSVJMIikpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzU7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNSIsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDM1Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTciLCBuZXcgVHlwZVNldCgiWC1ORUMtQk9ZIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE4IiwgbmV3IFR5cGVTZXQoIlgtTkVDLUZSSUVORCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxOSIsIG5ldyBUeXBlU2V0KCJYLU5FQy1QSFMiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMjAiLCBuZXcgVHlwZVNldCgiWC1ORUMtUkVTVEFVUkFOVCIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxTXVsdGlwbGVFbnRyeUNhc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgUi5yYXcudjIxX211bHRpcGxlX2VudHJ5KTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3M1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzMyIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1TRUNSRVQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiOSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1IT1RFTCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMCIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1TQ0hPT0wiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTEiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfRkFYX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMiIpOwotCi0gICAgICAgIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDM0IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDM0Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTU9ERU0iKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTMiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfUEFHRVIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNCIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1GQU1JTFkiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTUiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtR0lSTCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNiIpOwotCi0gICAgICAgIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDM1IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDM1Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLUJPWSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNyIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1GUklFTkQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTgiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtUEhTIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE5Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLVJFU1RBVVJBTlQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMjAiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWdub3JlQWdlbnRWMjFfUGFyc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV93aW5tb182NSk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlc0ZvclZhbHVlID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgY29udGVudFZhbHVlc0ZvclZhbHVlLnB1dCgiVkFMVUUiLCAiREFURSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsIEFycmF5cy5hc0xpc3QoIkV4YW1wbGUiLCAiIiwgIiIsICIiLCAiIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiRXhhbXBsZSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQU5OSVZFUlNBUlkiLCAiMjAwOTEwMTAiLCBjb250ZW50VmFsdWVzRm9yVmFsdWUpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQUdFTlQiLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLU5PIiwgIiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJZ25vcmVBZ2VudFYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3dpbm1vXzY1KTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IENvbnRlbnRWYWx1ZXNWZXJpZmllcigpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJFeGFtcGxlIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkV4YW1wbGUiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChFdmVudC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQU5OSVZFUlNBUlkpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiMjAwOTEwMTAiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9sZXJhdGVJbnZhbGlkQ29tbWVudExpa2VMaW5lVjIxKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfaW52YWxpZF9jb21tZW50X2xpbmUpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkNvbmZlcmVuY2UgQ2FsbCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJDb25mZXJlbmNlIENhbGwiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTm90ZS5OT1RFLCAiVGhpcyBpcyBhbiAoc2hhcnAgLT4jPC0gc2hhcnApIGV4YW1wbGUuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlRoaXMgbWVzc2FnZSBtdXN0IE5PVCBiZSBpZ25vcmVkLiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYWdlclYzMF9QYXJzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX3BhZ2VyKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCBBcnJheXMuYXNMaXN0KCJGIiwgIkciLCAiTSIsICIiLCAiIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjYxMDEyMzEyMzRAcGFnZXJzYW1wbGUuY29tIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJXT1JLIiwgIk1TRyIsICJQQUdFUiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFnZXJWMzAoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMzAsIFIucmF3LnYzMF9wYWdlcik7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkYiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJNIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJHIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkcgTSBGIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1BBR0VSKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNjEwMTIzMTIzNEBwYWdlcnNhbXBsZS5jb20iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlCeXRlUHJvcFYzMF9QYXJzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX211bHRpYnl0ZV9wYXJhbSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgQXJyYXlzLmFzTGlzdCgiRiIsICJHIiwgIk0iLCAiIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxIiwgbmV3IFR5cGVTZXQoIlx1OEQzOSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlCeXRlUHJvcFYzMCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX211bHRpYnl0ZV9wYXJhbSk7Ci0gICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkYiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJNIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJHIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkcgTSBGIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiXHU4RDM5IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tbWFTZXBhcmF0ZWRQYXJhbXNWMzBfUGFyc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMzAsIFIucmF3LnYzMF9jb21tYV9zZXBhcmF0ZWQpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsIEFycmF5cy5hc0xpc3QoIkYiLCAiRyIsICJNIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJQUkVGIiwgIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiQ09NTUEsU0VQQVJBVEVEOklOU0lERS5EUVVPVEUiLCAiUFJFRiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U29ydEFzVjQwX1BhcnNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjQwLCBSLnJhdy52NDBfc29ydF9hcyk7Ci0KLSAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzRm9yU29ydEFzTiA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIGNvbnRlbnRWYWx1ZXNGb3JTb3J0QXNOLnB1dCgiU09SVC1BUyIsCi0gICAgICAgICAgICAgICAgIlx1MzA0Mlx1MzA5M1x1MzA2OVx1MzA0NjtcdTMwOERcdTMwNDRcdTMwNjkiKTsKLSAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzRm9yU29ydEFzT3JnID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgY29udGVudFZhbHVlc0ZvclNvcnRBc09yZy5wdXQoIlNPUlQtQVMiLAotICAgICAgICAgICAgICAgICJcdTMwNTBcdTMwRkNcdTMwNTBcdTMwOEI7XHUzMDUxXHUzMDkzXHUzMDU1XHUzMDRGXHUzMDc2XHUzMDgyXHUzMDkzIik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwgIlx1NUI4OVx1ODVFNFx1MDAyMFx1MzBFRFx1MzBBNFx1MzBDOSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTVCODlcdTg1RTQiLCAiXHUzMEVEXHUzMEE0XHUzMEM5IiwgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzRm9yU29ydEFzTikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJPUkciLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiXHUzMEIwXHUzMEZDXHUzMEIwXHUzMEVCIiwgIlx1NjkxQ1x1N0QyMlx1OTBFOFx1OTU4MCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlc0ZvclNvcnRBc09yZywgbmV3IFR5cGVTZXQoIldPUksiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNvcnRBc1Y0MCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFY0MCwgUi5yYXcudjQwX3NvcnRfYXMpOwotICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTVCODlcdTg1RTQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlx1MzBFRFx1MzBBNFx1MzBDOSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJcdTVCODlcdTg1RTRcdTAwMjBcdTMwRURcdTMwQTRcdTMwQzkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdTMwNDJcdTMwOTNcdTMwNjlcdTMwNDYiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwOERcdTMwNDRcdTMwNjkiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVFlQRSwgT3JnYW5pemF0aW9uLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiXHUzMEIwXHUzMEZDXHUzMEIwXHUzMEVCIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5ULCAiXHU2OTFDXHU3RDIyXHU5MEU4XHU5NTgwIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5QSE9ORVRJQ19OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA1MFx1MzBGQ1x1MzA1MFx1MzA4Qlx1MzA1MVx1MzA5M1x1MzA1NVx1MzA0Rlx1MzA3Nlx1MzA4Mlx1MzA5MyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJTVYyMV9QYXJzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2ltKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlgtQU5EUk9JRC1DVVNUT00iLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgidm5kLmFuZHJvaWQuY3Vyc29yLml0ZW0vbmlja25hbWUiLCAiTmljayIsICIxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIpKSAgLy8gMTMKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUdPT0dMRS1UQUxLIiwgImhoaEBnbWFpbC5jb20iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SU1WMjEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9pbSk7Ci0gICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOaWNrbmFtZS5OQU1FLCAiTmljayIpCi0gICAgICAgICAgICAgICAgLnB1dChOaWNrbmFtZS5UWVBFLCAiMSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0dPT0dMRV9UQUxLKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uVFlQRSwgSW0uVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgImhoaEBnbWFpbC5jb20iKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRKYXBhbml6YXRpb25UZXN0cy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSmFwYW5pemF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5OTQxOS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRKYXBhbml6YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuQ29udGFjdEVudHJ5OwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuQ29udGVudFZhbHVlc0J1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlscy5Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbS5UeXBlU2V0OwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuVkNhcmRUZXN0c0Jhc2U7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5OaWNrbmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5vdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLXB1YmxpYyBjbGFzcyBWQ2FyZEphcGFuaXphdGlvblRlc3RzIGV4dGVuZHMgVkNhcmRUZXN0c0Jhc2UgewotICAgIHByaXZhdGUgdm9pZCB0ZXN0TmFtZVV0ZjhDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHUzMDc1XHUzMDhCXHUzMDY5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJcdTMwOTFcdTMwOEFcdTMwNEIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJCIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRyLiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJQaC5EIik7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9Ci0gICAgICAgICAgICAoVkNhcmRDb25maWcuaXNWZXJzaW9uMjEodmNhcmRUeXBlKSA/IG1Db250ZW50VmFsdWVzRm9yUVBBbmRVdGY4IDogbnVsbCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJGTiIsICJEci4gXHUzMDc1XHUzMDhCXHUzMDY5IEIgXHUzMDkxXHUzMDhBXHUzMDRCIFBoLkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcykKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOIiwgIlx1MzA3NVx1MzA4Qlx1MzA2OTtcdTMwOTFcdTMwOEFcdTMwNEI7QjtEci47UGguRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDc1XHUzMDhCXHUzMDY5IiwgIlx1MzA5MVx1MzA4QVx1MzA0QiIsICJCIiwgIkRyLiIsICJQaC5EIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lVXRmOFYyMSgpIHsKLSAgICAgICAgdGVzdE5hbWVVdGY4Q29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZVV0ZjhWMzAoKSB7Ci0gICAgICAgIHRlc3ROYW1lVXRmOENvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWVTaGlmdEppcygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjMwX0pBUEFORVNFLCAiU2hpZnRfSklTIik7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1MzA3NVx1MzA4Qlx1MzA2OSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiXHUzMDkxXHUzMDhBXHUzMDRCIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiQiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEci4iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiUGguRCIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJGTiIsICJEci4gXHUzMDc1XHUzMDhCXHUzMDY5IEIgXHUzMDkxXHUzMDhBXHUzMDRCIFBoLkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk4iLCAiXHUzMDc1XHUzMDhCXHUzMDY5O1x1MzA5MVx1MzA4QVx1MzA0QjtCO0RyLjtQaC5EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwNzVcdTMwOEJcdTMwNjkiLCAiXHUzMDkxXHUzMDhBXHUzMDRCIiwgIkIiLCAiRHIuIiwgIlBoLkQiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEb0NvTW8gcGhvbmVzIHJlcXVpcmUgYWxsIG5hbWUgZWxlbWVudHMgc2hvdWxkIGJlIGluICJmYW1pbHkgbmFtZSIgZmllbGQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWVEb0NvTW8oKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTywgIlNoaWZ0X0pJUyIpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTMwNzVcdTMwOEJcdTMwNjkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlx1MzA5MVx1MzA4QVx1MzA0QiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRHIuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIlBoLkQiKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgZnVsbE5hbWUgPSAiRHIuIFx1MzA3NVx1MzA4Qlx1MzA2OSBCIFx1MzA5MVx1MzA4QVx1MzA0QiBQaC5EIjsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk4iLCBmdWxsTmFtZSArICI7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoZnVsbE5hbWUsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJGTiIsIGZ1bGxOYW1lLCBtQ29udGVudFZhbHVlc0ZvclNKaXMpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiU09VTkQiLCAiOzs7OyIsIG5ldyBUeXBlU2V0KCJYLUlSTUMtTiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUkVEVUNUSU9OIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1OTyIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtRENNLUhNTi1NT0RFIiwgIiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UGhvbmV0aWNOYW1lQ29tbW9uKGludCB2Y2FyZFR5cGUsIFN0cmluZyBjaGFyc2V0KSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUsIGNoYXJzZXQpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdTMwODRcdTMwN0VcdTMwNjAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1MzA1Rlx1MzA4RFx1MzA0NiIpOwotCi0gICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9Ci0gICAgICAgICAgICAoIlNISUZUX0pJUyIuZXF1YWxzSWdub3JlQ2FzZShjaGFyc2V0KSA/Ci0gICAgICAgICAgICAgICAgICAgIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24yMSh2Y2FyZFR5cGUpID8gbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFNKaXMgOgotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzKSA6Ci0gICAgICAgICAgICAgICAgICAgIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24yMSh2Y2FyZFR5cGUpID8gbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjggOiBudWxsKSk7Ci0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1MQVNULU5BTUUiLCAiXHUzMDg0XHUzMDdFXHUzMDYwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1NSURETEUtTkFNRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMERGXHUzMEM5XHUzMEVCXHUzMENEXHUzMEZDXHUzMEUwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIiwgIlx1MzA1Rlx1MzA4RFx1MzA0NiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgaWYgKCFWQ2FyZENvbmZpZy5pc1ZlcnNpb24yMSh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZSgiU09SVC1TVFJJTkciLAotICAgICAgICAgICAgICAgICAgICAiXHUzMDg0XHUzMDdFXHUzMDYwIFx1MzBERlx1MzBDOVx1MzBFQlx1MzBDRFx1MzBGQ1x1MzBFMCBcdTMwNUZcdTMwOERcdTMwNDYiLAotICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgfQotICAgICAgICBDb250ZW50VmFsdWVzQnVpbGRlciBidWlsZGVyID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgIGJ1aWxkZXIucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiXHUzMDg0XHUzMDdFXHUzMDYwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiXHUzMERGXHUzMEM5XHUzMEVCXHUzMENEXHUzMEZDXHUzMEUwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJcdTMwNUZcdTMwOERcdTMwNDYiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA4NFx1MzA3RVx1MzA2MCBcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDVGXHUzMDhEXHUzMDQ2Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25ldGljTmFtZUZvckphcGFuZXNlVjIxVXRmOCgpIHsKLSAgICAgICAgdGVzdFBob25ldGljTmFtZUNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25ldGljTmFtZUZvckphcGFuZXNlVjIxU2ppcygpIHsKLSAgICAgICAgdGVzdFBob25ldGljTmFtZUNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgIlNoaWZ0X0pJUyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZXRpY05hbWVGb3JKYXBhbmVzZVYzMFV0ZjgoKSB7Ci0gICAgICAgIHRlc3RQaG9uZXRpY05hbWVDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0UsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZXRpY05hbWVGb3JKYXBhbmVzZVYzMFNKaXMoKSB7Ci0gICAgICAgIHRlc3RQaG9uZXRpY05hbWVDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0UsICJTaGlmdF9KSVMiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmV0aWNOYW1lRm9yTW9iaWxlVjIxXzEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEUsICJTaGlmdF9KSVMiKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiXHUzMDg0XHUzMDdFXHUzMDYwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiXHUzMERGXHUzMEM5XHUzMEVCXHUzMENEXHUzMEZDXHUzMEUwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJcdTMwNUZcdTMwOERcdTMwNDYiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiU09VTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY5NFx1RkY4Rlx1RkY4MFx1RkY5RSBcdUZGOTBcdUZGODRcdUZGOUVcdUZGOTlcdUZGODhcdUZGNzBcdUZGOTEgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjgwXHVGRjlCXHVGRjczOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG5ldyBUeXBlU2V0KCJYLUlSTUMtTiIpKTsKLSAgICAgICAgQ29udGVudFZhbHVlc0J1aWxkZXIgYnVpbGRlciA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICBidWlsZGVyLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1RkY5NFx1RkY4Rlx1RkY4MFx1RkY5RSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGOTBcdUZGODRcdUZGOUVcdUZGOTlcdUZGODhcdUZGNzBcdUZGOTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1RkY4MFx1RkY5Qlx1RkY3MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIFx1RkY5MFx1RkY4NFx1RkY5RVx1RkY5OVx1RkY4OFx1RkY3MFx1RkY5MSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGODBcdUZGOUJcdUZGNzMiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmV0aWNOYW1lRm9yTW9iaWxlVjIxXzIoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEUsICJTaGlmdF9KSVMiKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiXHUzMDg0XHUzMDdFXHUzMDYwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJcdTMwNUZcdTMwOERcdTMwNDYiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiU09VTkQiLCAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIFx1RkY4MFx1RkY5Qlx1RkY3Mzs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG5ldyBUeXBlU2V0KCJYLUlSTUMtTiIpKTsKLSAgICAgICAgQ29udGVudFZhbHVlc0J1aWxkZXIgYnVpbGRlciA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICBidWlsZGVyLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1RkY5NFx1RkY4Rlx1RkY4MFx1RkY5RSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiXHVGRjgwXHVGRjlCXHVGRjczIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlx1RkY5NFx1RkY4Rlx1RkY4MFx1RkY5RSBcdUZGODBcdUZGOUJcdUZGNzMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NXaXRoSmFwYW5lc2VDb21tb24oaW50IHZjYXJkVHlwZSwgU3RyaW5nIGNoYXJzZXQpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSwgY2hhcnNldCk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICJcdTc5QzFcdTY2RjhcdTdCQjEwNyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgIlx1OTZEQlx1ODk4Qlx1NkNBMlx1Njc1MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNJVFksICJcdTlFN0ZcdTlBQThcdTVFMDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5SRUdJT04sICJcdTAwRDdcdTAwRDdcdTc3MEMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT1NUQ09ERSwgIjQ5NC0xMzEzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgIlx1NjVFNVx1NjcyQyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA1M1x1MzA5M1x1MzA2QVx1MzA2OFx1MzA1M1x1MzA4RFx1MzA5Mlx1ODk4QiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlx1MzA4Qlx1MzA2QVx1MzA5M1x1MzA2Nlx1NjY4N1x1NEVCQVx1MzA2N1x1MzA1OVx1MzA0Qlx1RkYxRiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMLCAiXHUzMDRBXHUzMDgyXHUzMDYxXHUzMDRCXHUzMDQ4XHUzMDhBIik7Ci0KLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gKCJVVEYtOCIuZXF1YWxzSWdub3JlQ2FzZShjaGFyc2V0KSA/Ci0gICAgICAgICAgICAgICAgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjIxKHZjYXJkVHlwZSkgPyBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcyA6Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yU0ppcykgOgotICAgICAgICAgICAgICAgIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24yMSh2Y2FyZFR5cGUpID8gbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjggOgotICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclV0ZjgpKTsKLQotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKTsKLSAgICAgICAgLy8gTEFCRUwgbXVzdCBiZSBpZ25vcmVkIGluIHZDYXJkIDIuMS4gQXMgZm9yIHZDYXJkIDMuMCwgdGhlIGN1cnJlbnQgYmVoYXZpb3IgaXMKLSAgICAgICAgLy8gc2FtZSBhcyB0aGF0IGluIHZDYXJkIDMuMCwgd2hpY2ggY2FuIGJlIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZS4KLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsIEFycmF5cy5hc0xpc3QoIlx1NzlDMVx1NjZGOFx1N0JCMTA3IiwKLSAgICAgICAgICAgICAgICAiIiwgIlx1OTZEQlx1ODk4Qlx1NkNBMlx1Njc1MSIsICJcdTlFN0ZcdTlBQThcdTVFMDIiLCAiXHUwMEQ3XHUwMEQ3XHU3NzBDIiwKLSAgICAgICAgICAgICAgICAiNDk0LTEzMTMiLCAiXHU2NUU1XHU2NzJDIiksCi0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcyk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICJcdTc5QzFcdTY2RjhcdTdCQjEwNyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgIlx1OTZEQlx1ODk4Qlx1NkNBMlx1Njc1MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNJVFksICJcdTlFN0ZcdTlBQThcdTVFMDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5SRUdJT04sICJcdTAwRDdcdTAwRDdcdTc3MEMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT1NUQ09ERSwgIjQ5NC0xMzEzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgIlx1NjVFNVx1NjcyQyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1NjVFNVx1NjcyQyA0OTQtMTMxMyBcdTAwRDdcdTAwRDdcdTc3MEMgXHU5RTdGXHU5QUE4XHU1RTAyICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1OTZEQlx1ODk4Qlx1NkNBMlx1Njc1MSAiICsgIlx1NzlDMVx1NjZGOFx1N0JCMTA3IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUUpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc3dpdGhKYXBhbmVzZVYyMSgpIHsKLSAgICAgICAgdGVzdFBvc3RhbEFkZHJlc3NXaXRoSmFwYW5lc2VDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0UsICJTaGlmdF9KSVMiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB0aGF0IG9ubHkgb25lIGFkZHJlc3MgZmllbGQgaXMgZW1pdHRlZCB0b3dhcmQgRG9Db01vIHBob25lcy4KLSAgICAgKiBQcmVmZXJlZCB0eXBlIG11c3QgKHNob3VsZD8pIGJlOiBIT01FID4gV09SSyA+IE9USEVSID4gQ1VTVE9NCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkcnJlc3NGb3JEb0NvTW9fMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PLCAiU2hpZnRfSklTIik7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMyIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMLCAiY3VzdG9tIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICI0Iik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIzIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiksIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZHJyZXNzRm9yRG9Db01vXzIoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTywgIlNoaWZ0X0pJUyIpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMLCAiY3VzdG9tIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIzIik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIyIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiksIG5ldyBUeXBlU2V0KCJXT1JLIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZHJyZXNzRm9yRG9Db01vXzMoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTywgIlNoaWZ0X0pJUyIpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMLCAiY3VzdG9tMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsICJjdXN0b20yIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIzIik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsIEFycmF5cy5hc0xpc3QoIjIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdGhlIHZDYXJkIGV4cG9ydGVyIHRvbGVyYXRlcyBudWxsIFRZUEUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkcnJlc3NGb3JEb0NvTW9fNCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PLCAiU2hpZnRfSklTIik7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIzIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiNCIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiNSIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU5PIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1EQ00tSE1OLU1PREUiLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiMyIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIpLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEphcGFuZXNlUGhvbmVOdW1iZXJDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjAzMTIzNDEyMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjA5MDEyMzQxMjM0IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTU9CSUxFKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMDMtMTIzNC0xMjM0IiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMDkwLTEyMzQtMTIzNCIsIG5ldyBUeXBlU2V0KCJDRUxMIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXBhbmVzZVBob25lTnVtYmVyVjIxXzEoKSB7Ci0gICAgICAgIHRlc3RKYXBhbmVzZVBob25lTnVtYmVyQ29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmFwYW5lc2VQaG9uZU51bWJlclYzMCgpIHsKLSAgICAgICAgdGVzdEphcGFuZXNlUGhvbmVOdW1iZXJDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXBhbmVzZVBob25lTnVtYmVyRG9Db01vKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9ET0NPTU8sICJTaGlmdF9KSVMiKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjAzMTIzNDEyMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjA5MDEyMzQxMjM0IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTU9CSUxFKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIwMy0xMjM0LTEyMzQiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIwOTAtMTIzNC0xMjM0IiwgbmV3IFR5cGVTZXQoIkNFTEwiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vdGVEb0NvTW8oKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTywgIlNoaWZ0X0pJUyIpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJub3RlMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJub3RlMiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJub3RlMyIpOwotCi0gICAgICAgIC8vIE1vcmUgdGhhbiBvbmUgbm90ZSBmaWVsZHMgbXVzdCBiZSBhZ2dyZWdhdGVkIGludG8gb25lIG5vdGUuCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU5PIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1EQ00tSE1OLU1PREUiLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOT1RFIiwgIm5vdGUxXG5ub3RlMlxubm90ZTMiLCBtQ29udGVudFZhbHVlc0ZvclFQKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW5kcm9pZEN1c3RvbVYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUMpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOaWNrbmFtZS5OQU1FLCAiXHUzMDREXHUzMDgzXHUzMEZDXHUzMEE4XHUzMEMzXHUzMEMxXHUzMEZDIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BTkRST0lELUNVU1RPTSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDREXHUzMDgzXHUzMEZDXHUzMEE4XHUzMEMzXHUzMEMxXHUzMEZDIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRVdGY4KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRUZXN0UnVubmVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRUZXN0UnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYTQzOTMuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVGVzdFJ1bm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RTdWl0ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVXNhZ2U6IGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IGNvbS5hbmRyb2lkLnZjYXJkLnRlc3RzLy5WQ2FyZFRlc3RSdW5uZXJUZXN0UnVubmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZFRlc3RSdW5uZXIgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVGVzdFN1aXRlIGdldEFsbFRlc3RzKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgSW5zdHJ1bWVudGF0aW9uVGVzdFN1aXRlKHRoaXMpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVkNhcmRVdGlsc1Rlc3RzLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFZDYXJkVGVzdFV0aWxzVGVzdHMuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVkNhcmRJbXBvcnRlclRlc3RzLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFZDYXJkRXhwb3J0ZXJUZXN0cy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShWQ2FyZEphcGFuaXphdGlvblRlc3RzLmNsYXNzKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRMb2FkZXIoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZFRlc3RSdW5uZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVGVzdFV0aWxzVGVzdHMuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFRlc3RVdGlsc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjVjZjcuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVGVzdFV0aWxzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmZyYW1ld29ya3MuY29yZXRlc3RzLlI7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzLlZDYXJkVmVyaWZpZXI7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkTmFtZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogVGVzdHMgY29uZmlybWluZyB1dGlsaXRpZXMgZm9yIHZDYXJkIHRlc3RzIHdvcmsgZmluZS4KLSAqCi0gKiBOb3cgdGhhdCB0aGUgZm91bmRhdGlvbiBjbGFzc2VzIGZvciB2Q2FyZCB0ZXN0IGNhc2VzIGJlY2FtZSB0b28gY29tcGxpY2F0ZWQgdG8KLSAqIHJlbHkgb24gd2l0aG91dCB0ZXN0aW5nIGl0c2VsZi4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkVGVzdFV0aWxzVGVzdHMgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRGYWlsQXRQcm9wZXJ0eU5vZGVWZXJpZmljYXRpb24oKSB7Ci0gICAgICAgIGJvb2xlYW4gZmFpbHVyZURldGVjdGVkID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBWQ2FyZFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZDYXJkVmVyaWZpZXIodGhpcyk7Ci0gICAgICAgICAgICB2ZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDLCBSLnJhdy52MjFfYmFja3NsYXNoKTsKLSAgICAgICAgICAgIHZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgIjtBO0JcXDtDXFw7O0Q7OkU7XFxcXDstLSIsICAvLyB3cm9uZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsICJBO0JcXCIsICJDXFw7IiwgIkQiLCAiOkUiLCAiXFxcXCIsICIiKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiQTtCXFxDXFw7RDpFXFxcXCIpOwotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKLSAgICAgICAgICAgIGZhaWx1cmVEZXRlY3RlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFmYWlsdXJlRGV0ZWN0ZWQpIHsKLSAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlRlc3QgY2FzZSB0aGF0IHNob3VsZCBmYWlsIGFjdHVhbGx5IHN1Y2NlZWRlZC4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRGYWlsQXRDb250ZW50VmFsdWVWZXJpZmljYXRpb24oKSB7Ci0gICAgICAgIGJvb2xlYW4gZmFpbHVyZURldGVjdGVkID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBWQ2FyZFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZDYXJkVmVyaWZpZXIodGhpcyk7Ci0gICAgICAgICAgICB2ZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDLCBSLnJhdy52MjFfYmFja3NsYXNoKTsKLSAgICAgICAgICAgIHZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiQTtCXFwiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJDXFw7IikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkQiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiOkUiKTsKLSAgICAgICAgICAgIC8vIERJU1BMQVlfTkFNRSBpcyBtaXNzaW5nLgotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKLSAgICAgICAgICAgIGZhaWx1cmVEZXRlY3RlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFmYWlsdXJlRGV0ZWN0ZWQpIHsKLSAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlRlc3QgY2FzZSB0aGF0IHNob3VsZCBmYWlsIGFjdHVhbGx5IHN1Y2NlZWRlZC4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRGYWlsQXRMaW5lVmVyaWZpY2F0aW9uKCkgewotICAgICAgICBib29sZWFuIGZhaWx1cmVEZXRlY3RlZCA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgVkNhcmRWZXJpZmllciB2ZXJpZmllciA9IG5ldyBWQ2FyZFZlcmlmaWVyKHRoaXMpOwotICAgICAgICAgICAgdmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMzBfR0VORVJJQyk7Ci0gICAgICAgICAgICB2ZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlxcIikKLSAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiOyIpCi0gICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICIsIikKLSAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJcbiIpCi0gICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiWzx7VW5lc2NhcGVkOkFzY2lpc30+XSIpOwotICAgICAgICAgICAgdmVyaWZpZXIuYWRkTGluZVZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZCgiVEVMOjEiKSAgLy8gd3JvbmcKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKCJGTjpbPHtVbmVzY2FwZWQ6QXNjaWlzfT5dIik7Ci0gICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotICAgICAgICAgICAgZmFpbHVyZURldGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWZhaWx1cmVEZXRlY3RlZCkgewotICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVGVzdCBjYXNlIHRoYXQgc2hvdWxkIGZhaWwgYWN0dWFsbHkgc3VjY2VlZGVkLiIpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRVdGlsc1Rlc3RzLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRVdGlsc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MWZhYjIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVXRpbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFZDYXJkVXRpbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoKSB7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgoU3RyaW5nKW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKChTdHJpbmdbXSludWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgoTGlzdDxTdHJpbmc+KW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiKSk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAweDIwOyBpIDwgMHg3RjsgaSsrKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgoY2hhcilpKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoYnVpbGRlci50b1N0cmluZygpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgiXHJcbiIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgiXHUwMDE5IikpOwotICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCJcdTAwN0YiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgoU3RyaW5nKW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgoU3RyaW5nW10pbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKChMaXN0PFN0cmluZz4pbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IikpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIpKTsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDB4MjA7IGkgPCAweDdGOyBpKyspIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKChjaGFyKWkpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoYnVpbGRlci50b1N0cmluZygpKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJcdTAwMTkiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJcdTAwN0YiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJcciIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIlxuIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKCkgewotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbigoU3RyaW5nKW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oKFN0cmluZ1tdKW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oKExpc3Q8U3RyaW5nPiludWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKCIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IikpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiMDEyMzQ1Njc4OS0iKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMHgzMDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaSA9PSAweDJEKSB7ICAvLyAtCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oU3RyaW5nLnZhbHVlT2YoKGNoYXIpaSkpKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMHgzQTsgaSA8IDB4NDE7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKFN0cmluZy52YWx1ZU9mKChjaGFyKWkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDB4NUI7IGkgPCAweDYxOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihTdHJpbmcudmFsdWVPZigoY2hhcilpKSkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAweDdCOyBpIDwgMHgxMDA7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKFN0cmluZy52YWx1ZU9mKChjaGFyKWkpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmdBdmFpbGFibGVBc1YzMFBhcmFtVmFsdWUoKSB7Ci0gICAgICAgIC8vIFNtb2tlIHRlc3RzLgotICAgICAgICBhc3NlcnRFcXVhbHMoIkhPTUUiLCBWQ2FyZFV0aWxzLnRvU3RyaW5nQXNWMzBQYXJhbVZhbHVlKCJIT01FIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRFTCIsIFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUoIlRFTCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQQUdFUiIsIFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUoIlBBR0VSIikpOwotCi0gICAgICAgIGFzc2VydFRydWUoVGV4dFV0aWxzLmlzRW1wdHkoVkNhcmRVdGlscy50b1N0cmluZ0FzVjMwUGFyYW1WYWx1ZSgiIikpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShUZXh0VXRpbHMuaXNFbXB0eShWQ2FyZFV0aWxzLnRvU3RyaW5nQXNWMzBQYXJhbVZhbHVlKG51bGwpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVGV4dFV0aWxzLmlzRW1wdHkoVkNhcmRVdGlscy50b1N0cmluZ0FzVjMwUGFyYW1WYWx1ZSgiIFx0IikpKTsKLQotICAgICAgICAvLyBub24tQXNjaWkgbXVzdCBiZSBhbGxvd2VkCi0gICAgICAgIGFzc2VydEVxdWFscygiXHU0RThCXHU1MkQ5XHU2MjQwIiwKLSAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLnRvU3RyaW5nQXNWMzBQYXJhbVZhbHVlKCJcdTRFOEJcdTUyRDlcdTYyNDAiKSk7Ci0gICAgICAgIC8vIFJlcG9ydGVkIGFzIGJ1ZyByZXBvcnQuCi0gICAgICAgIGFzc2VydEVxdWFscygiXHU4RDM5IiwgVkNhcmRVdGlscy50b1N0cmluZ0FzVjMwUGFyYW1WYWx1ZSgiXHU4RDM5IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlwiY29tbWEsc2VwYXJhdGVkXCIiLAotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUoImNvbW1hLHNlcGFyYXRlZCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJcImNvbG9uOmF3YXJlXCIiLAotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUoImNvbG9uOmF3YXJlIikpOwotICAgICAgICAvLyBDVEwgY2hhcmFjdGVycy4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDVExFeGFtcGxlIiwKLSAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLnRvU3RyaW5nQXNWMzBQYXJhbVZhbHVlKCJDVExcdTAwMDFFeGFtcGxlIikpOwotICAgICAgICBhc3NlcnRUcnVlKFRleHRVdGlscy5pc0VtcHR5KAotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUoIlx1MDAwMVx1MDAwMlx1MDAwMyIpKSk7Ci0gICAgICAgIC8vIERRVU9URSBtdXN0IGJlIHJlbW92ZWQuCi0gICAgICAgIGFzc2VydEVxdWFscygicXVvdGVkIiwKLSAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLnRvU3RyaW5nQXNWMzBQYXJhbVZhbHVlKCJcInF1b3RlZFwiIikpOwotICAgICAgICAvLyBEUVVPVEUgbXVzdCBiZSByZW1vdmVkIGJhc2ljYWxseSwgYnV0IHdlIHNob3VsZCBkZXRlY3QgYSBzcGFjZSwgd2hpY2gKLSAgICAgICAgLy8gcmVxdWlyZSB1cyB0byB1c2UgRFFVT1RFIGFnYWluLgotICAgICAgICAvLyBSaWdodC1zaWRlIGhhcyBvbmUgbW9yZSBpbGxlZ2FsIGRxdW90ZSB0byB0ZXN0IHF1b3RlLWhhbmRsZSBjb2RlIHRob3JvdWdobHkuCi0gICAgICAgIGFzc2VydEVxdWFscygiXCJBbHJlYWR5IHF1b3RlZFwiIiwKLSAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLnRvU3RyaW5nQXNWMzBQYXJhbVZhbHVlKCJcIkFscmVhZHkgcXVvdGVkXCJcIiIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Db250YWN0RW50cnkuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0NvbnRhY3RFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDM3NTBlLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0NvbnRhY3RFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Ci0gKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotICogdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDxwPgotICogVGhlIGNsYXNzIHJlcHJlc2VudGluZyBvbmUgY29udGFjdCwgd2hpY2ggc2hvdWxkIGNvbnRhaW4gbXVsdGlwbGUgQ29udGVudFZhbHVlcyBsaWtlCi0gKiBTdHJ1Y3R1cmVkTmFtZSwgRW1haWwsIGV0Yy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbnRhY3RFbnRyeSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IG1Db250ZW50VmFsdWVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29udGVudFZhbHVlcz4oKTsKLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBhZGRDb250ZW50VmFsdWVzKFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBjb250ZW50VmFsdWVzLnB1dChEYXRhLk1JTUVUWVBFLCBtaW1lVHlwZSk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzTGlzdC5hZGQoY29udGVudFZhbHVlcyk7Ci0gICAgICAgIHJldHVybiBuZXcgQ29udGVudFZhbHVlc0J1aWxkZXIoY29udGVudFZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8Q29udGVudFZhbHVlcz4gZ2V0TGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db250ZW50VmFsdWVzTGlzdDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvQ29udGVudFZhbHVlc0J1aWxkZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0NvbnRlbnRWYWx1ZXNCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkY2NjZjkuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvQ29udGVudFZhbHVlc0J1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci0KLS8qKgotICogQ29udGVudFZhbHVlcy1saWtlIGNsYXNzIHdoaWNoIGVuYWJsZXMgdXNlcnMgdG8gY2hhaW4gcHV0KCkgbWV0aG9kcyBhbmQgcmVzdHJpY3RzCi0gKiB0aGUgb3RoZXIgbWV0aG9kcy4KLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXM7Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzID0gY29udGVudFZhbHVlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBCeXRlIHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBTaG9ydCB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0qLwotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBJbnRlZ2VyIHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIExvbmcgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIEZsb2F0IHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBEb3VibGUgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIEJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ki8KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgYnl0ZVtdIHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dE51bGwoU3RyaW5nIGtleSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXROdWxsKGtleSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0NvbnRlbnRWYWx1ZXNWZXJpZmllci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvQ29udGVudFZhbHVlc1ZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNjEzYzYuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvQ29udGVudFZhbHVlc1ZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnk7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeUhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZW50VmFsdWVzVmVyaWZpZXIgaW1wbGVtZW50cyBWQ2FyZEVudHJ5SGFuZGxlciB7Ci0gICAgcHJpdmF0ZSBMaXN0PENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0+IG1Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtTGlzdCA9Ci0gICAgICAgIG5ldyBBcnJheUxpc3Q8Q29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbT4oKTsKLSAgICBwcml2YXRlIGludCBtSW5kZXg7Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBhZGRFbGVtKEFuZHJvaWRUZXN0Q2FzZSBhbmRyb2lkVGVzdENhc2UpIHsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbmV3IENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oYW5kcm9pZFRlc3RDYXNlKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW1MaXN0LmFkZChlbGVtKTsKLSAgICAgICAgcmV0dXJuIGVsZW07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKLSAgICAgICAgZm9yIChDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gOiBtQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbUxpc3QpIHsKLSAgICAgICAgICAgIGVsZW0ub25QYXJzaW5nU3RhcnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRW50cnlDcmVhdGVkKFZDYXJkRW50cnkgZW50cnkpIHsKLSAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmFzc2VydFRydWUobUluZGV4IDwgbUNvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW1MaXN0LnNpemUoKSk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtTGlzdC5nZXQobUluZGV4KS5vbkVudHJ5Q3JlYXRlZChlbnRyeSk7Ci0gICAgICAgIG1JbmRleCsrOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRW5kKCkgewotICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA6IG1Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtTGlzdCkgewotICAgICAgICAgICAgZWxlbS5vblBhcnNpbmdFbmQoKTsKLSAgICAgICAgICAgIGVsZW0udmVyaWZ5UmVzb2x2ZXIoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0NvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0uamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0NvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNjMThlMS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnk7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeUNvbW1pdHRlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5Q29uc3RydWN0b3I7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeUhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGE7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gewotICAgIHByaXZhdGUgZmluYWwgQW5kcm9pZFRlc3RDYXNlIG1UZXN0Q2FzZTsKLSAgICBwcml2YXRlIGZpbmFsIEltcG9ydFRlc3RSZXNvbHZlciBtUmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWQ2FyZEVudHJ5SGFuZGxlciBtSGFuZGxlcjsKLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKEFuZHJvaWRUZXN0Q2FzZSBhbmRyb2lkVGVzdENhc2UpIHsKLSAgICAgICAgbVRlc3RDYXNlID0gYW5kcm9pZFRlc3RDYXNlOwotICAgICAgICBtUmVzb2x2ZXIgPSBuZXcgSW1wb3J0VGVzdFJlc29sdmVyKGFuZHJvaWRUZXN0Q2FzZSk7Ci0gICAgICAgIG1IYW5kbGVyID0gbmV3IFZDYXJkRW50cnlDb21taXR0ZXIobVJlc29sdmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgYWRkRXhwZWN0ZWQoU3RyaW5nIG1pbWVUeXBlKSB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIGNvbnRlbnRWYWx1ZXMucHV0KERhdGEuTUlNRVRZUEUsIG1pbWVUeXBlKTsKLSAgICAgICAgbVJlc29sdmVyLmFkZEV4cGVjdGVkQ29udGVudFZhbHVlcyhjb250ZW50VmFsdWVzKTsKLSAgICAgICAgcmV0dXJuIG5ldyBDb250ZW50VmFsdWVzQnVpbGRlcihjb250ZW50VmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoaW50IHJlc0lkLCBpbnQgdmNhcmRUeXBlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZlcmlmeShtVGVzdENhc2UuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZShyZXNJZCksIHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KElucHV0U3RyZWFtIGlzLCBpbnQgdmNhcmRUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgVkNhcmRQYXJzZXIgdkNhcmRQYXJzZXIgPSBWQ2FyZFV0aWxzLmdldEFwcHJvcHJpYXRlUGFyc2VyKHZjYXJkVHlwZSk7Ci0gICAgICAgIGZpbmFsIFZDYXJkRW50cnlDb25zdHJ1Y3RvciBidWlsZGVyID0gbmV3IFZDYXJkRW50cnlDb25zdHJ1Y3Rvcih2Y2FyZFR5cGUsIG51bGwpOwotICAgICAgICBidWlsZGVyLmFkZEVudHJ5SGFuZGxlcihtSGFuZGxlcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2Q2FyZFBhcnNlci5wYXJzZShpcywgYnVpbGRlcik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB2ZXJpZnlSZXNvbHZlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeVJlc29sdmVyKCkgewotICAgICAgICBtUmVzb2x2ZXIudmVyaWZ5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25QYXJzaW5nU3RhcnQoKSB7Ci0gICAgICAgIG1IYW5kbGVyLm9uU3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkVudHJ5Q3JlYXRlZChWQ2FyZEVudHJ5IGVudHJ5KSB7Ci0gICAgICAgIG1IYW5kbGVyLm9uRW50cnlDcmVhdGVkKGVudHJ5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblBhcnNpbmdFbmQoKSB7Ci0gICAgICAgIG1IYW5kbGVyLm9uRW5kKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvRXhwb3J0VGVzdFByb3ZpZGVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9FeHBvcnRUZXN0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA5NTI1OC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9FeHBvcnRUZXN0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0gKiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5FbnRpdHk7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eUl0ZXJhdG9yOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbXBvc2VyOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDdXJzb3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEV4cG9ydFRlc3RQcm92aWRlciBleHRlbmRzIE1vY2tDb250ZW50UHJvdmlkZXIgewotICAgIGZpbmFsIHByaXZhdGUgQXJyYXlMaXN0PENvbnRhY3RFbnRyeT4gbUNvbnRhY3RFbnRyeUxpc3QgPSBuZXcgQXJyYXlMaXN0PENvbnRhY3RFbnRyeT4oKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1vY2tFbnRpdHlJdGVyYXRvciBpbXBsZW1lbnRzIEVudGl0eUl0ZXJhdG9yIHsKLSAgICAgICAgTGlzdDxFbnRpdHk+IG1FbnRpdHlMaXN0OwotICAgICAgICBJdGVyYXRvcjxFbnRpdHk+IG1JdGVyYXRvcjsKLQotICAgICAgICBwdWJsaWMgTW9ja0VudGl0eUl0ZXJhdG9yKExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgIG1FbnRpdHlMaXN0ID0gbmV3IEFycmF5TGlzdDxFbnRpdHk+KCk7Ci0gICAgICAgICAgICBFbnRpdHkgZW50aXR5ID0gbmV3IEVudGl0eShuZXcgQ29udGVudFZhbHVlcygpKTsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZW50aXR5LmFkZFN1YlZhbHVlKERhdGEuQ09OVEVOVF9VUkksIGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVudGl0eUxpc3QuYWRkKGVudGl0eSk7Ci0gICAgICAgICAgICBtSXRlcmF0b3IgPSBtRW50aXR5TGlzdC5pdGVyYXRvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSXRlcmF0b3IuaGFzTmV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEVudGl0eSBuZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1JdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInJlbW92ZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgICAgIG1JdGVyYXRvciA9IG1FbnRpdHlMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBFeHBvcnRUZXN0UHJvdmlkZXIoQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSkgewotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0RW50cnkgYnVpbGRJbnB1dEVudHJ5KCkgewotICAgICAgICBDb250YWN0RW50cnkgY29udGFjdEVudHJ5ID0gbmV3IENvbnRhY3RFbnRyeSgpOwotICAgICAgICBtQ29udGFjdEVudHJ5TGlzdC5hZGQoY29udGFjdEVudHJ5KTsKLSAgICAgICAgcmV0dXJuIGNvbnRhY3RFbnRyeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBBbiBvbGQgbWV0aG9kIHdoaWNoIGhhZCBleGlzdGVkIGJ1dCB3YXMgcmVtb3ZlZCBmcm9tIENvbnRlbnRSZXNvbHZlci4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogV2Ugc3RpbGwga2VlcCB1c2luZyB0aGlzIG1ldGhvZCBzaW5jZSB3ZSBkb24ndCBoYXZlIGEgcHJvcGVlciB3YXkgdG8ga25vdwotICAgICAqIHdoaWNoIHZhbHVlIGluIHRoZSBDb250ZW50VmFsdWUgY29ycmVzcG9uZHMgdG8gdGhlIGVudHJ5IGluIENvbnRhY3RzIGRhdGFiYXNlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgRW50aXR5SXRlcmF0b3IgcXVlcnlFbnRpdGllcyhVcmkgdXJpLAotICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlcikgewotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKHVyaSAhPSBudWxsKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZShDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0NPTlRFTlQuZXF1YWxzKHVyaS5nZXRTY2hlbWUoKSkpOwotICAgICAgICBmaW5hbCBTdHJpbmcgYXV0aG9yaXR5ID0gdXJpLmdldEF1dGhvcml0eSgpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJLmdldEF1dGhvcml0eSgpLmVxdWFscyhhdXRob3JpdHkpKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZSgoRGF0YS5DT05UQUNUX0lEICsgIj0/IikuZXF1YWxzKHNlbGVjdGlvbikpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoMSwgc2VsZWN0aW9uQXJncy5sZW5ndGgpOwotICAgICAgICBmaW5hbCBpbnQgaWQgPSBJbnRlZ2VyLnBhcnNlSW50KHNlbGVjdGlvbkFyZ3NbMF0pOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKGlkID49IDAgJiYgaWQgPCBtQ29udGFjdEVudHJ5TGlzdC5zaXplKCkpOwotCi0gICAgICAgIHJldHVybiBuZXcgTW9ja0VudGl0eUl0ZXJhdG9yKG1Db250YWN0RW50cnlMaXN0LmdldChpZCkuZ2V0TGlzdCgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KFVyaSB1cmksU3RyaW5nW10gcHJvamVjdGlvbiwKLSAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIpIHsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZShWQ2FyZENvbXBvc2VyLkNPTlRBQ1RTX1RFU1RfQ09OVEVOVF9VUkkuZXF1YWxzKHVyaSkpOwotICAgICAgICAvLyBJbiB0aGlzIHRlc3QsIGZvbGxvd2luZyBhcmd1bWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAgIFRlc3RDYXNlLmFzc2VydE51bGwoc2VsZWN0aW9uKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0TnVsbChzZWxlY3Rpb25BcmdzKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0TnVsbChzb3J0T3JkZXIpOwotCi0gICAgICAgIHJldHVybiBuZXcgTW9ja0N1cnNvcigpIHsKLSAgICAgICAgICAgIGludCBtQ3VycmVudFBvc2l0aW9uID0gLTE7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRhY3RFbnRyeUxpc3Quc2l6ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG1vdmVUb0ZpcnN0KCkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50UG9zaXRpb24gPSAwOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG1vdmVUb05leHQoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50UG9zaXRpb24gPCBtQ29udGFjdEVudHJ5TGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRQb3NpdGlvbisrOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQmVmb3JlRmlyc3QoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50UG9zaXRpb24gPCAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWZ0ZXJMYXN0KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQ3VycmVudFBvc2l0aW9uID49IG1Db250YWN0RW50cnlMaXN0LnNpemUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgaW50IGdldENvbHVtbkluZGV4KFN0cmluZyBjb2x1bW5OYW1lKSB7Ci0gICAgICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKENvbnRhY3RzLl9JRCwgY29sdW1uTmFtZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGludCBnZXRJbnQoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKDAsIGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKG1DdXJyZW50UG9zaXRpb24gPj0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRQb3NpdGlvbiA8IG1Db250YWN0RW50cnlMaXN0LnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50UG9zaXRpb247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldEludChjb2x1bW5JbmRleCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9FeHBvcnRUZXN0UmVzb2x2ZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0V4cG9ydFRlc3RSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDZkOTFhLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0V4cG9ydFRlc3RSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Ci0gKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotICogdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb21wb3NlcjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgRXhwb3J0VGVzdFJlc29sdmVyIGV4dGVuZHMgTW9ja0NvbnRlbnRSZXNvbHZlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBFeHBvcnRUZXN0UHJvdmlkZXIgbVByb3ZpZGVyOwotICAgIHB1YmxpYyBFeHBvcnRUZXN0UmVzb2x2ZXIoQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSkgewotICAgICAgICBtUHJvdmlkZXIgPSBuZXcgRXhwb3J0VGVzdFByb3ZpZGVyKGFuZHJvaWRUZXN0Q2FzZSk7Ci0gICAgICAgIGFkZFByb3ZpZGVyKFZDYXJkQ29tcG9zZXIuVkNBUkRfVEVTVF9BVVRIT1JJVFksIG1Qcm92aWRlcik7Ci0gICAgICAgIGFkZFByb3ZpZGVyKFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJLmdldEF1dGhvcml0eSgpLCBtUHJvdmlkZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0RW50cnkgYWRkSW5wdXRDb250YWN0RW50cnkoKSB7Ci0gICAgICAgIHJldHVybiBtUHJvdmlkZXIuYnVpbGRJbnB1dEVudHJ5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEV4cG9ydFRlc3RQcm92aWRlciBnZXRQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1Qcm92aWRlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9JbXBvcnRUZXN0UHJvdmlkZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0ltcG9ydFRlc3RQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjg5NDkxLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0ltcG9ydFRlc3RQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck9wZXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyUmVzdWx0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Hcm91cE1lbWJlcnNoaXA7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5JbTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5pY2tuYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTm90ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk9yZ2FuaXphdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvdG87Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5SZWxhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLldlYnNpdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLXB1YmxpYyBjbGFzcyBJbXBvcnRUZXN0UHJvdmlkZXIgZXh0ZW5kcyBNb2NrQ29udGVudFByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzS25vd25NaW1lVHlwZVNldCA9Ci0gICAgICAgIG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSwgUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUsIFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgSW0uQ09OVEVOVF9JVEVNX1RZUEUsIE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBFdmVudC5DT05URU5UX0lURU1fVFlQRSwgUGhvdG8uQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgTm90ZS5DT05URU5UX0lURU1fVFlQRSwgV2Vic2l0ZS5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSwgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgR3JvdXBNZW1iZXJzaGlwLkNPTlRFTlRfSVRFTV9UWVBFKSk7Ci0KLSAgICBmaW5hbCBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPENvbnRlbnRWYWx1ZXM+PiBtTWltZVR5cGVUb0V4cGVjdGVkQ29udGVudFZhbHVlczsKLQotICAgIHB1YmxpYyBJbXBvcnRUZXN0UHJvdmlkZXIoQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSkgewotICAgICAgICBtTWltZVR5cGVUb0V4cGVjdGVkQ29udGVudFZhbHVlcyA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbGxlY3Rpb248Q29udGVudFZhbHVlcz4+KCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGFjY2VwdGFuYmxlTWltZVR5cGUgOiBzS25vd25NaW1lVHlwZVNldCkgewotICAgICAgICAgICAgLy8gRG8gbm90IHVzZSBIYXNoU2V0IHNpbmNlIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGNoYW5nZXMgdGhlIGNvbnRlbnQgb2YKLSAgICAgICAgICAgIC8vIENvbnRlbnRWYWx1ZXMgYWZ0ZXIgdGhlIGluc2VydGlvbiwgd2hpY2ggbWFrZSB0aGUgcmVzdWx0IG9mIGhhc2hDb2RlKCkKLSAgICAgICAgICAgIC8vIGNoYW5nZXMuLi4KLSAgICAgICAgICAgIG1NaW1lVHlwZVRvRXhwZWN0ZWRDb250ZW50VmFsdWVzLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgYWNjZXB0YW5ibGVNaW1lVHlwZSwgbmV3IEFycmF5TGlzdDxDb250ZW50VmFsdWVzPigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEV4cGVjdGVkQ29udGVudFZhbHVlcyhDb250ZW50VmFsdWVzIGV4cGVjdGVkQ29udGVudFZhbHVlcykgewotICAgICAgICBmaW5hbCBTdHJpbmcgbWltZVR5cGUgPSBleHBlY3RlZENvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoRGF0YS5NSU1FVFlQRSk7Ci0gICAgICAgIGlmICghc0tub3duTWltZVR5cGVTZXQuY29udGFpbnMobWltZVR5cGUpKSB7Ci0gICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJVbmtub3cgTWltZVR5cGUgJXMgaW4gdGhlIHRlc3QgY29kZS4gVGVzdCBjb2RlIHNob3VsZCBiZSBicm9rZW4uIiwKLSAgICAgICAgICAgICAgICAgICAgbWltZVR5cGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIENvbGxlY3Rpb248Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0NvbGxlY3Rpb24gPQotICAgICAgICAgICAgICAgIG1NaW1lVHlwZVRvRXhwZWN0ZWRDb250ZW50VmFsdWVzLmdldChtaW1lVHlwZSk7Ci0gICAgICAgIGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uLmFkZChleHBlY3RlZENvbnRlbnRWYWx1ZXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb250ZW50UHJvdmlkZXJSZXN1bHRbXSBhcHBseUJhdGNoKAotICAgICAgICAgICAgQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4gb3BlcmF0aW9ucykgewotICAgICAgICBpZiAob3BlcmF0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJUaGVyZSBpcyBubyBvcGVyYXRpb24uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IG9wZXJhdGlvbnMuc2l6ZSgpOwotICAgICAgICBDb250ZW50UHJvdmlkZXJSZXN1bHRbXSBmYWtlUmVzdWx0QXJyYXkgPSBuZXcgQ29udGVudFByb3ZpZGVyUmVzdWx0W3NpemVdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgVXJpIHVyaSA9IFVyaS53aXRoQXBwZW5kZWRQYXRoKFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJLCBTdHJpbmcudmFsdWVPZihpKSk7Ci0gICAgICAgICAgICBmYWtlUmVzdWx0QXJyYXlbaV0gPSBuZXcgQ29udGVudFByb3ZpZGVyUmVzdWx0KHVyaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG9wZXJhdGlvbnMuZ2V0KGkpOwotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gb3BlcmF0aW9uLnJlc29sdmVWYWx1ZUJhY2tSZWZlcmVuY2VzKAotICAgICAgICAgICAgICAgICAgICBmYWtlUmVzdWx0QXJyYXksIGkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24gb3BlcmF0aW9uID0gb3BlcmF0aW9ucy5nZXQoaSk7Ci0gICAgICAgICAgICBDb250ZW50VmFsdWVzIGFjdHVhbENvbnRlbnRWYWx1ZXMgPSBvcGVyYXRpb24ucmVzb2x2ZVZhbHVlQmFja1JlZmVyZW5jZXMoCi0gICAgICAgICAgICAgICAgICAgIGZha2VSZXN1bHRBcnJheSwgaSk7Ci0gICAgICAgICAgICBmaW5hbCBVcmkgdXJpID0gb3BlcmF0aW9uLmdldFVyaSgpOwotICAgICAgICAgICAgaWYgKHVyaS5lcXVhbHMoUmF3Q29udGFjdHMuQ09OVEVOVF9VUkkpKSB7Ci0gICAgICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0TnVsbChhY3R1YWxDb250ZW50VmFsdWVzLmdldChSYXdDb250YWN0cy5BQ0NPVU5UX05BTUUpKTsKLSAgICAgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnROdWxsKGFjdHVhbENvbnRlbnRWYWx1ZXMuZ2V0KFJhd0NvbnRhY3RzLkFDQ09VTlRfVFlQRSkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh1cmkuZXF1YWxzKERhdGEuQ09OVEVOVF9VUkkpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1pbWVUeXBlID0gYWN0dWFsQ29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhEYXRhLk1JTUVUWVBFKTsKLSAgICAgICAgICAgICAgICBpZiAoIXNLbm93bk1pbWVUeXBlU2V0LmNvbnRhaW5zKG1pbWVUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gTWltZVR5cGUgJXMuIFByb2JhYmx5IGFkZGVkIGFmdGVyIGRldmVsb3BpbmcgdGhpcyB0ZXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgZGF0YSBtZWFuaW5nbGVzcyBpbiB0aGlzIHVuaXQgdGVzdHMuCi0gICAgICAgICAgICAgICAgLy8gU3BlY2lmaWNhbGx5LCBEYXRhLkRBVEExIC0gREFUQTcgYXJlIHNldCB0byBudWxsIG9yIGVtcHR5IFN0cmluZwotICAgICAgICAgICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2YgdGhlIGlucHV0LCBidXQgaXQgbWF5IGNoYW5nZSBkZXBlbmRpbmcgb24gaG93Ci0gICAgICAgICAgICAgICAgLy8gcmVzb2x2ZXItcmVsYXRlZCBjb2RlIGhhbmRsZXMgaXQuCi0gICAgICAgICAgICAgICAgLy8gSGVyZSwgd2UgaWdub3JlIHRoZXNlIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudCBzcGVjcyBhbmQKLSAgICAgICAgICAgICAgICAvLyBqdXN0IGNoZWNrIHdoZXRoZXIgdkNhcmQgaW1wb3J0ZXIgY29ycmVjdGx5IGluc2VydHMgcmVsbGV2ZW50IGRhdGEuCi0gICAgICAgICAgICAgICAgU2V0PFN0cmluZz4ga2V5VG9CZVJlbW92ZWQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBhY3R1YWxDb250ZW50VmFsdWVzLnZhbHVlU2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleVRvQmVSZW1vdmVkLmFkZChlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5OiBrZXlUb0JlUmVtb3ZlZCkgewotICAgICAgICAgICAgICAgICAgICBhY3R1YWxDb250ZW50VmFsdWVzLnJlbW92ZShrZXkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBmb3IgdGVzdGluZwotICAgICAgICAgICAgICAgIExvZy5kKCJAQEAiLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiTWltZVR5cGU6ICVzLCBkYXRhOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlLCBhY3R1YWxDb250ZW50VmFsdWVzLnRvU3RyaW5nKCkpKTsgKi8KLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgUkFXX0NPTlRBQ1RfSUQgZW50cnkganVzdCBmb3Igc2FmZXR5LCBzaW5jZSB3ZSBkbyBub3QgY2FyZQotICAgICAgICAgICAgICAgIC8vIGhvdyByZXNvbHZlci1yZWxhdGVkIGNvZGUgaGFuZGxlcyB0aGUgZW50cnkgaW4gdGhpcyB1bml0IHRlc3QsCi0gICAgICAgICAgICAgICAgaWYgKGFjdHVhbENvbnRlbnRWYWx1ZXMuY29udGFpbnNLZXkoRGF0YS5SQVdfQ09OVEFDVF9JRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYWN0dWFsQ29udGVudFZhbHVlcy5yZW1vdmUoRGF0YS5SQVdfQ09OVEFDVF9JRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0NvbGxlY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICBtTWltZVR5cGVUb0V4cGVjdGVkQ29udGVudFZhbHVlcy5nZXQobWltZVR5cGUpOwotICAgICAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWVzQ29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiQ29udGVudFZhbHVlcyBmb3IgTWltZVR5cGUgIiArIG1pbWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vdCBleHBlY3RlZCBhdCBhbGwgKCIgKyBhY3R1YWxDb250ZW50VmFsdWVzICsgIikiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBjaGVja2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGV4cGVjdGVkQ29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qZm9yIHRlc3RpbmcKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoIkBAQCIsICJleHBlY3RlZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoZXhwZWN0ZWRDb250ZW50VmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKCJAQEAiLCAiYWN0dWFsICA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnZlcnRUb0Vhc2lseVJlYWRhYmxlU3RyaW5nKGFjdHVhbENvbnRlbnRWYWx1ZXMpKTsqLwotICAgICAgICAgICAgICAgICAgICBpZiAoZXF1YWxzRm9yQ29udGVudFZhbHVlcyhleHBlY3RlZENvbnRlbnRWYWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsQ29udGVudFZhbHVlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUoY29udGVudFZhbHVlc0NvbGxlY3Rpb24ucmVtb3ZlKGV4cGVjdGVkQ29udGVudFZhbHVlcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWNoZWNrZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJVbmV4cGVjdGVkOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoYWN0dWFsQ29udGVudFZhbHVlcykpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIkV4cGVjdGVkICA6ICIpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgZXhwZWN0ZWRDb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0NvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNvbnZlcnRUb0Vhc2lseVJlYWRhYmxlU3RyaW5nKGV4cGVjdGVkQ29udGVudFZhbHVlcykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgVXJpIGhhcyBjb21lOiAiICsgdXJpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgcmV0dXJuIGZha2VSZXN1bHRBcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoQ29sbGVjdGlvbjxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzQ29sbGVjdGlvbiA6Ci0gICAgICAgICAgICAgICAgbU1pbWVUeXBlVG9FeHBlY3RlZENvbnRlbnRWYWx1ZXMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBleHBlY3RlZENvbnRlbnRWYWx1ZXM6IGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoZXhwZWN0ZWRDb250ZW50VmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ1aWxkZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmFpbE1zZyA9Ci0gICAgICAgICAgICAgICAgIlRoZXJlIGlzKGFyZSkgcmVtYWluaW5nIGV4cGVjdGVkIENvbnRlbnRWYWx1ZXMgaW5zdGFuY2Uocyk6IFxuIgotICAgICAgICAgICAgICAgICAgICArIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoZmFpbE1zZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBwcmludCBDb250ZW50VmFsdWVzIHdob3NlIGNvbnRlbnQgaXMgcHJpbnRlZCB3aXRoIHNvcnRlZCBrZXlzLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRUb0Vhc2lseVJlYWRhYmxlU3RyaW5nKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gIm51bGwiOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBtaW1lVHlwZVZhbHVlID0gIiI7Ci0gICAgICAgIFNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gc29ydGVkTWFwID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogY29udGVudFZhbHVlcy52YWx1ZVNldCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlU3RyaW5nID0gKHZhbHVlICE9IG51bGwgPyB2YWx1ZS50b1N0cmluZygpIDogbnVsbCk7Ci0gICAgICAgICAgICBpZiAoRGF0YS5NSU1FVFlQRS5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIG1pbWVUeXBlVmFsdWUgPSB2YWx1ZVN0cmluZzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0Tm90TnVsbChrZXkpOwotICAgICAgICAgICAgICAgIHNvcnRlZE1hcC5wdXQoa2V5LCB2YWx1ZVN0cmluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoRGF0YS5NSU1FVFlQRSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCc9Jyk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKG1pbWVUeXBlVmFsdWUpOwotICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IHNvcnRlZE1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGtleSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiPVwiIik7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCh2YWx1ZSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnIicpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcXVhbHNGb3JDb250ZW50VmFsdWVzKAotICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBleHBlY3RlZCwgZmluYWwgQ29udGVudFZhbHVlcyBhY3R1YWwpIHsKLSAgICAgICAgaWYgKGV4cGVjdGVkID09IGFjdHVhbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWQgPT0gbnVsbCB8fCBhY3R1YWwgPT0gbnVsbCB8fCBleHBlY3RlZC5zaXplKCkgIT0gYWN0dWFsLnNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBleHBlY3RlZC52YWx1ZVNldCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKCFhY3R1YWwuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFR5cGUgbWlzbWF0Y2ggdXN1YWxsIGhhcHBlbnMgYXMgaW1wb3J0ZXIgZG9lc24ndCBjYXJlIHRoZSB0eXBlIG9mIGVhY2ggdmFsdWUuCi0gICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwgdmFyaWFibGUgdHlwZSBtaWdodCBiZSBJbnRlZ2VyIHdoZW4gaW1wb3J0aW5nIHRoZSB0eXBlIG9mIFRFTCwKLSAgICAgICAgICAgIC8vIHdoaWxlIHZhcmlhYmxlIHR5cGUgd291bGQgYmUgU3RyaW5nIHdoZW4gaW1wb3J0aW5nIHRoZSB0eXBlIG9mIFJFTEFUSU9OLgotICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFjdHVhbFZhbHVlID0gYWN0dWFsLmdldChrZXkpOwotICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgYnl0ZVtdKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKChieXRlW10pdmFsdWUsIChieXRlW10pYWN0dWFsVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBlID0gKGJ5dGVbXSl2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGEgPSAoYnl0ZVtdKWFjdHVhbFZhbHVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICghdmFsdWUuZXF1YWxzKGFjdHVhbFZhbHVlKSAmJgotICAgICAgICAgICAgICAgICAgICAhdmFsdWUudG9TdHJpbmcoKS5lcXVhbHMoYWN0dWFsVmFsdWUudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0ltcG9ydFRlc3RSZXNvbHZlci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvSW1wb3J0VGVzdFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MjJhZmUuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvSW1wb3J0VGVzdFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJPcGVyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlclJlc3VsdDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIEltcG9ydFRlc3RSZXNvbHZlciBleHRlbmRzIE1vY2tDb250ZW50UmVzb2x2ZXIgewotICAgIHByaXZhdGUgZmluYWwgSW1wb3J0VGVzdFByb3ZpZGVyIG1Qcm92aWRlcjsKLQotICAgIHB1YmxpYyBJbXBvcnRUZXN0UmVzb2x2ZXIoQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSkgewotICAgICAgICBtUHJvdmlkZXIgPSBuZXcgSW1wb3J0VGVzdFByb3ZpZGVyKGFuZHJvaWRUZXN0Q2FzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbnRlbnRQcm92aWRlclJlc3VsdFtdIGFwcGx5QmF0Y2goU3RyaW5nIGF1dGhvcml0eSwKLSAgICAgICAgICAgIEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+IG9wZXJhdGlvbnMpIHsKLSAgICAgICAgZXF1YWxzU3RyaW5nKGF1dGhvcml0eSwgUmF3Q29udGFjdHMuQ09OVEVOVF9VUkkudG9TdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBtUHJvdmlkZXIuYXBwbHlCYXRjaChvcGVyYXRpb25zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRFeHBlY3RlZENvbnRlbnRWYWx1ZXMoQ29udGVudFZhbHVlcyBleHBlY3RlZENvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgbVByb3ZpZGVyLmFkZEV4cGVjdGVkQ29udGVudFZhbHVlcyhleHBlY3RlZENvbnRlbnRWYWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKLSAgICAgICAgbVByb3ZpZGVyLnZlcmlmeSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXF1YWxzU3RyaW5nKFN0cmluZyBhLCBTdHJpbmcgYikgewotICAgICAgICBpZiAoYSA9PSBudWxsIHx8IGEubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGIgPT0gbnVsbCB8fCBiLmxlbmd0aCgpID09IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gYS5lcXVhbHMoYik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9MaW5lVmVyaWZpZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0xpbmVWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzE0YWM1Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0xpbmVWZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbXBvc2VyOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgTGluZVZlcmlmaWVyIGltcGxlbWVudHMgVkNhcmRDb21wb3Nlci5PbmVFbnRyeUhhbmRsZXIgewotICAgIHByaXZhdGUgZmluYWwgQW5kcm9pZFRlc3RDYXNlIG1BbmRyb2lkVGVzdENhc2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8TGluZVZlcmlmaWVyRWxlbT4gbUxpbmVWZXJpZmllckVsZW1MaXN0OwotICAgIHByaXZhdGUgaW50IG1WQ2FyZFR5cGU7Ci0gICAgcHJpdmF0ZSBpbnQgaW5kZXg7Ci0KLSAgICBwdWJsaWMgTGluZVZlcmlmaWVyKEFuZHJvaWRUZXN0Q2FzZSBhbmRyb2lkVGVzdENhc2UsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbUFuZHJvaWRUZXN0Q2FzZSA9IGFuZHJvaWRUZXN0Q2FzZTsKLSAgICAgICAgbUxpbmVWZXJpZmllckVsZW1MaXN0ID0gbmV3IEFycmF5TGlzdDxMaW5lVmVyaWZpZXJFbGVtPigpOwotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaW5lVmVyaWZpZXJFbGVtIGFkZExpbmVWZXJpZmllckVsZW0oKSB7Ci0gICAgICAgIExpbmVWZXJpZmllckVsZW0gbGluZVZlcmlmaWVyID0gbmV3IExpbmVWZXJpZmllckVsZW0obUFuZHJvaWRUZXN0Q2FzZSwgbVZDYXJkVHlwZSk7Ci0gICAgICAgIG1MaW5lVmVyaWZpZXJFbGVtTGlzdC5hZGQobGluZVZlcmlmaWVyKTsKLSAgICAgICAgcmV0dXJuIGxpbmVWZXJpZmllcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgIGlmIChpbmRleCA+PSBtTGluZVZlcmlmaWVyRWxlbUxpc3Quc2l6ZSgpKSB7Ci0gICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJJbnN1ZmZpY2llbnQgbnVtYmVyIG9mIExpbmVWZXJpZmllciAoIiArIGluZGV4ICsgIikiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIExpbmVWZXJpZmllckVsZW0gbGluZVZlcmlmaWVyID0gbUxpbmVWZXJpZmllckVsZW1MaXN0LmdldChpbmRleCk7Ci0gICAgICAgIGxpbmVWZXJpZmllci52ZXJpZnkodmNhcmQpOwotCi0gICAgICAgIGluZGV4Kys7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gb25FbnRyeUNyZWF0ZWQoU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgIHZlcmlmeSh2Y2FyZCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG9uSW5pdChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25UZXJtaW5hdGUoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvTGluZVZlcmlmaWVyRWxlbS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvTGluZVZlcmlmaWVyRWxlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjNhOWNkLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0xpbmVWZXJpZmllckVsZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0gKiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgTGluZVZlcmlmaWVyRWxlbSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gbUV4cGVjdGVkTGluZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtVkNhcmRUeXBlOwotCi0gICAgcHVibGljIExpbmVWZXJpZmllckVsZW0oQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaW5lVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkKGZpbmFsIFN0cmluZyBsaW5lKSB7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobGluZSkpIHsKLSAgICAgICAgICAgIG1FeHBlY3RlZExpbmVMaXN0LmFkZChsaW5lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoZmluYWwgU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGxpbmVBcnJheSA9IHZjYXJkLnNwbGl0KCJcXHI/XFxuIik7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBsaW5lQXJyYXkubGVuZ3RoOwotICAgICAgICBib29sZWFuIGJlZ2luRXhpc3RzID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZW5kRXhpc3RzID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gdmVyc2lvbkV4aXN0cyA9IGZhbHNlOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gbGluZUFycmF5W2ldOwotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgiQkVHSU46VkNBUkQiLmVxdWFsc0lnbm9yZUNhc2UobGluZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYmVnaW5FeGlzdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiTXVsdGlwbGUgXCJCRUdJTjpWQ0FSRFwiIGxpbmUgZm91bmQiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiZWdpbkV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIkVORDpWQ0FSRCIuZXF1YWxzSWdub3JlQ2FzZShsaW5lKSkgewotICAgICAgICAgICAgICAgIGlmIChlbmRFeGlzdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiTXVsdGlwbGUgXCJFTkQ6VkNBUkRcIiBsaW5lIGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICgoVkNhcmRDb25maWcuaXNWZXJzaW9uMjEobVZDYXJkVHlwZSkgPyAiVkVSU0lPTjoyLjEiIDoKLSAgICAgICAgICAgICAgICAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAobVZDYXJkVHlwZSkgPyAiVkVSU0lPTjozLjAiIDoKLSAgICAgICAgICAgICAgICAgICAgIlZFUlNJT046NC4wIikpLmVxdWFsc0lnbm9yZUNhc2UobGluZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAodmVyc2lvbkV4aXN0cykgewotICAgICAgICAgICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJNdWx0aXBsZSBWRVJTSU9OIGxpbmUgKyBmb3VuZCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZlcnNpb25FeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghYmVnaW5FeGlzdHMpIHsKLSAgICAgICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJQcm9wZXJ0eSBvdGhlciB0aGFuIEJFR0lOIGNhbWUgYmVmb3JlIEJFR0lOIHByb3BlcnR5OiAiICsgbGluZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVuZEV4aXN0cykgewotICAgICAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlByb3BlcnR5IG90aGVyIHRoYW4gRU5EIGNhbWUgYWZ0ZXIgRU5EIHByb3BlcnR5OiAiICsgbGluZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IG1FeHBlY3RlZExpbmVMaXN0LmluZGV4T2YobGluZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIG1FeHBlY3RlZExpbmVMaXN0LnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgbGluZTogIiArIGxpbmUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtRXhwZWN0ZWRMaW5lTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBleHBlY3RlZExpbmUgOiBtRXhwZWN0ZWRMaW5lTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZXhwZWN0ZWRMaW5lKTsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJFeHBlY3RlZCBsaW5lKHMpIG5vdCBmb3VuZDoiICsgYnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvUHJvcGVydHlOb2RlLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Qcm9wZXJ0eU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU3YWQ4ZS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Qcm9wZXJ0eU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBjbGFzcyByZXByZXNlbnRpbmcgb25lIHByb3BlcnR5IChlLmcuICJOO0VOQ09ESU5HPVVURi04OmZhbWlseTpnaXZlbjptaWRkbGU6cHJlZml4OnN1ZmZpeCIpLgotICogPC9wPgotICogPHA+Ci0gKiBQcmV2aW91c2x5IHVzZWQgaW4gbWFpbiB2Q2FyZCBoYW5kbGluZyBjb2RlIGJ1dCBub3cgZXhpc3RzIG9ubHkgZm9yIHRlc3RpbmcuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEVzcGVjaWFsbHkgdXNlZnVsIGZvciB0ZXN0aW5nIHBhcnNlciBjb2RlIChWQ2FyZFBhcnNlciksIHNpbmNlIGFsbCBwcm9wZXJ0aWVzIGNhbiBiZQotICogY2hlY2tlZCB2aWEgdGhpcyBjbGFzcyB1bmxpa2Uge0BsaW5rIFZDYXJkRW50cnl9LCB3aGljaCBvbmx5IGVtaXRzIHRoZSByZXN1bHQgb2YKLSAqIGludGVycHJldGF0aW9uIG9mIHRoZSBjb250ZW50IG9mIGVhY2ggdkNhcmQuIFdlIGNhbm5vdCBrbm93IHdoZXRoZXIgdkNhcmQgcGFyc2VyIG9yCi0gKiB7QGxpbmsgVkNhcmRFbnRyeX0gaXMgd3Jvbmcgd2l0aG91dCB0aGlzIGNsYXNzLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlOb2RlIHsKLSAgICBwdWJsaWMgU3RyaW5nIHByb3BOYW1lOwotICAgIHB1YmxpYyBTdHJpbmcgcHJvcFZhbHVlOwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gcHJvcFZhbHVlX3ZlY3RvcjsKLQotICAgIC8qKiBTdG9yZSB2YWx1ZSBhcyBieXRlW10sYWZ0ZXIgZGVjb2RlLgotICAgICAqIFVzZWQgd2hlbiBwcm9wVmFsdWUgaXMgZW5jb2RlZCBieSBzb21ldGhpbmcgbGlrZSBCQVNFNjQsIFFVT1RFRC1QUklOVEFCTEUsIGV0Yy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYnl0ZVtdIHByb3BWYWx1ZV9ieXRlczsKLQotICAgIC8qKgotICAgICAqIHBhcmFtIHN0b3JlOiBrZXk9cGFyYW1UeXBlLCB2YWx1ZT1wYXJhbVZhbHVlCi0gICAgICogTm90ZSB0aGF0IGN1cnJlbnRseSBQcm9wZXJ0eU5vZGUgY2xhc3MgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBwYXJhbS12YWx1ZXMKLSAgICAgKiBkZWZpbmVkIGluIHZDYXJkIDMuMCAoU2VlIGFsc28gUkZDIDI0MjYpLiBtdWx0aXBsZS12YWx1ZXMgYXJlIHN0b3JlZCBhcwotICAgICAqIG9uZSBTdHJpbmcgdmFsdWUgbGlrZSAiQSxCIiwgbm90IFsiQSIsICJCIl0uLi4KLSAgICAgKiBUT0RPOiBmaXggdGhpcy4gCi0gICAgICovCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXA7Ci0KLSAgICAvKiogT25seSBmb3IgVFlQRT0/Pz8gcGFyYW0gc3RvcmUuICovCi0gICAgcHVibGljIFNldDxTdHJpbmc+IHBhcmFtTWFwX1RZUEU7Ci0KLSAgICAvKiogU3RvcmUgZ3JvdXAgdmFsdWVzLiBVc2VkIG9ubHkgaW4gVkNhcmQuICovCi0gICAgcHVibGljIFNldDxTdHJpbmc+IHByb3BHcm91cFNldDsKLSAgICAKLSAgICBwdWJsaWMgUHJvcGVydHlOb2RlKCkgewotICAgICAgICBwcm9wTmFtZSA9ICIiOwotICAgICAgICBwcm9wVmFsdWUgPSAiIjsKLSAgICAgICAgcHJvcFZhbHVlX3ZlY3RvciA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBwYXJhbU1hcCA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIHBhcmFtTWFwX1RZUEUgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIHByb3BHcm91cFNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZSgKLSAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZV92ZWN0b3IsCi0gICAgICAgICAgICBieXRlW10gcHJvcFZhbHVlX2J5dGVzLCBDb250ZW50VmFsdWVzIHBhcmFtTWFwLCBTZXQ8U3RyaW5nPiBwYXJhbU1hcF9UWVBFLAotICAgICAgICAgICAgU2V0PFN0cmluZz4gcHJvcEdyb3VwU2V0KSB7Ci0gICAgICAgIGlmIChwcm9wTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BOYW1lID0gcHJvcE5hbWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BOYW1lID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BWYWx1ZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucHJvcFZhbHVlID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BWYWx1ZV92ZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5wcm9wVmFsdWVfdmVjdG9yID0gcHJvcFZhbHVlX3ZlY3RvcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucHJvcFZhbHVlX3ZlY3RvciA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMucHJvcFZhbHVlX2J5dGVzID0gcHJvcFZhbHVlX2J5dGVzOwotICAgICAgICBpZiAocGFyYW1NYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5wYXJhbU1hcCA9IHBhcmFtTWFwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wYXJhbU1hcCA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtTWFwX1RZUEUgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5wYXJhbU1hcF9UWVBFID0gcGFyYW1NYXBfVFlQRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucGFyYW1NYXBfVFlQRSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcEdyb3VwU2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucHJvcEdyb3VwU2V0ID0gcHJvcEdyb3VwU2V0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wcm9wR3JvdXBTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgLy8gdkNhcmQgbWF5IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBzYW1lIGxpbmUgaW4gb25lIGVudHJ5LCB3aGlsZSBIYXNoU2V0IG9yIGFueSBvdGhlcgotICAgICAgICAvLyBsaWJyYXJ5IHdoaWNoIHV0aWxpemUgaGFzaENvZGUoKSBkb2VzIG5vdCBob25vciB0aGF0LCBzbyBpbnRlbnRpb25hbGx5IHRocm93IGFuCi0gICAgICAgIC8vIEV4Y2VwdGlvbi4KLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJQcm9wZXJ0eU5vZGUgZG9lcyBub3QgcHJvdmlkZSBoYXNoQ29kZSgpIGltcGxlbWVudGF0aW9uIGludGVudGlvbmFsbHkuIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUHJvcGVydHlOb2RlKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBQcm9wZXJ0eU5vZGUgbm9kZSA9IChQcm9wZXJ0eU5vZGUpb2JqOwotICAgICAgICAKLSAgICAgICAgaWYgKHByb3BOYW1lID09IG51bGwgfHwgIXByb3BOYW1lLmVxdWFscyhub2RlLnByb3BOYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKCFwYXJhbU1hcF9UWVBFLmVxdWFscyhub2RlLnBhcmFtTWFwX1RZUEUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXBhcmFtTWFwX1RZUEUuZXF1YWxzKG5vZGUucGFyYW1NYXBfVFlQRSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmICghcHJvcEdyb3VwU2V0LmVxdWFscyhub2RlLnByb3BHcm91cFNldCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9wVmFsdWVfYnl0ZXMgIT0gbnVsbCAmJiBBcnJheXMuZXF1YWxzKHByb3BWYWx1ZV9ieXRlcywgbm9kZS5wcm9wVmFsdWVfYnl0ZXMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghcHJvcFZhbHVlLmVxdWFscyhub2RlLnByb3BWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRoZSB2YWx1ZSBpbiBwcm9wVmFsdWVfdmVjdG9yIGlzIG5vdCBkZWNvZGVkIGV2ZW4gaWYgaXQgc2hvdWxkIGJlCi0gICAgICAgICAgICAvLyBkZWNvZGVkIGJ5IEJBU0U2NCBvciBRVU9URUQtUFJJTlRBQkxFLiBXaGVuIHRoZSBzaXplIG9mIHByb3BWYWx1ZV92ZWN0b3IKLSAgICAgICAgICAgIC8vIGlzIDEsIHRoZSBlbmNvZGVkIHZhbHVlIGlzIHN0b3JlZCBpbiBwcm9wVmFsdWUsIHNvIHdlIGRvIG5vdCBoYXZlIHRvCi0gICAgICAgICAgICAvLyBjaGVjayBpdC4KLSAgICAgICAgICAgIHJldHVybiAocHJvcFZhbHVlX3ZlY3Rvci5lcXVhbHMobm9kZS5wcm9wVmFsdWVfdmVjdG9yKSB8fAotICAgICAgICAgICAgICAgICAgICBwcm9wVmFsdWVfdmVjdG9yLnNpemUoKSA9PSAxIHx8Ci0gICAgICAgICAgICAgICAgICAgIG5vZGUucHJvcFZhbHVlX3ZlY3Rvci5zaXplKCkgPT0gMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoInByb3BOYW1lOiAiKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQocHJvcE5hbWUpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCBwYXJhbU1hcDogIik7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKHBhcmFtTWFwLnRvU3RyaW5nKCkpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCBwYXJhbU1hcF9UWVBFOiBbIik7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICBmb3IgKFN0cmluZyBlbGVtIDogcGFyYW1NYXBfVFlQRSkgewotICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnIicpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZWxlbSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnIicpOwotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJdIik7Ci0gICAgICAgIGlmICghcHJvcEdyb3VwU2V0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgcHJvcEdyb3VwU2V0OiBbIik7Ci0gICAgICAgICAgICBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBlbGVtIDogcHJvcEdyb3VwU2V0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCciJyk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZWxlbSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyInKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BWYWx1ZV92ZWN0b3IgIT0gbnVsbCAmJiBwcm9wVmFsdWVfdmVjdG9yLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHByb3BWYWx1ZV92ZWN0b3Igc2l6ZTogIik7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChwcm9wVmFsdWVfdmVjdG9yLnNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BWYWx1ZV9ieXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCBwcm9wVmFsdWVfYnl0ZXMgc2l6ZTogIik7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChwcm9wVmFsdWVfYnl0ZXMubGVuZ3RoKTsKLSAgICAgICAgfQotICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCBwcm9wVmFsdWU6IFwiIik7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKHByb3BWYWx1ZSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcIiIpOwotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1Byb3BlcnR5Tm9kZXNWZXJpZmllci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvUHJvcGVydHlOb2Rlc1ZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMjkyODQuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvUHJvcGVydHlOb2Rlc1ZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFByb3BlcnR5Tm9kZXNWZXJpZmllciBleHRlbmRzIFZOb2RlQnVpbGRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0+IG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtTGlzdDsKLSAgICBwcml2YXRlIGZpbmFsIEFuZHJvaWRUZXN0Q2FzZSBtQW5kcm9pZFRlc3RDYXNlOwotICAgIHByaXZhdGUgaW50IG1JbmRleDsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXIoQW5kcm9pZFRlc3RDYXNlIHRlc3RDYXNlKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbT4oKTsKLSAgICAgICAgbUFuZHJvaWRUZXN0Q2FzZSA9IHRlc3RDYXNlOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKSB7Ci0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG5ldyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKG1BbmRyb2lkVGVzdENhc2UpOwotICAgICAgICBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbUxpc3QuYWRkKGVsZW0pOwotICAgICAgICByZXR1cm4gZWxlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoaW50IHJlc0lkLCBpbnQgdmNhcmRUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdmVyaWZ5KG1BbmRyb2lkVGVzdENhc2UuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZShyZXNJZCksIHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KGludCByZXNJZCwgaW50IHZjYXJkVHlwZSwgZmluYWwgVkNhcmRQYXJzZXIgcGFyc2VyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZlcmlmeShtQW5kcm9pZFRlc3RDYXNlLmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5vcGVuUmF3UmVzb3VyY2UocmVzSWQpLAotICAgICAgICAgICAgICAgIHZjYXJkVHlwZSwgcGFyc2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoSW5wdXRTdHJlYW0gaXMsIGludCB2Y2FyZFR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBWQ2FyZFBhcnNlciBwYXJzZXIgPSBWQ2FyZFV0aWxzLmdldEFwcHJvcHJpYXRlUGFyc2VyKHZjYXJkVHlwZSk7Ci0gICAgICAgIHZlcmlmeShpcywgdmNhcmRUeXBlLCBwYXJzZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShJbnB1dFN0cmVhbSBpcywgaW50IHZjYXJkVHlwZSwgZmluYWwgVkNhcmRQYXJzZXIgcGFyc2VyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYXJzZXIucGFyc2UoaXMsIHRoaXMpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmRFbnRyeSgpIHsKLSAgICAgICAgc3VwZXIuZW5kRW50cnkoKTsKLSAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmFzc2VydFRydWUobUluZGV4IDwgbVByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1MaXN0LnNpemUoKSk7Ci0gICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5hc3NlcnRUcnVlKG1JbmRleCA8IHZOb2RlTGlzdC5zaXplKCkpOwotICAgICAgICBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbUxpc3QuZ2V0KG1JbmRleCkudmVyaWZ5KHZOb2RlTGlzdC5nZXQobUluZGV4KSk7Ci0gICAgICAgIG1JbmRleCsrOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1Byb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0uamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1Byb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRjNmFiYy4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3Mgd2hpY2ggdmVyaWZpZXMgaW5wdXQgVk5vZGUuCi0gKgotICogVGhpcyBjbGFzcyBmaXJzdCBjaGVja3Mgd2hldGhlciBlYWNoIHByb3BlcnR5Tm9kZSBpbiB0aGUgVk5vZGUgaXMgaW4gdGhlCi0gKiAib3JkZXJlZCBleHBlY3RlZCBwcm9wZXJ0eSBsaXN0Ii4KLSAqIElmIHRoZSBub2RlIGRvZXMgbm90IGV4aXN0IGluIHRoZSAib3JkZXJlZCBsaXN0IiwgdGhlIGNsYXNzIHJlZmVycyB0bwotICogInVub3JkZXJkIGV4cGVjdGVkIHByb3BlcnR5IHNldCIgYW5kIGNoZWNrcyB0aGUgbm9kZSBpcyBleHBlY3RlZCBzb21ld2hlcmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIHsKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFR5cGVTZXQgZXh0ZW5kcyBIYXNoU2V0PFN0cmluZz4gewotICAgICAgICBwdWJsaWMgVHlwZVNldChTdHJpbmcgLi4uIGFycmF5KSB7Ci0gICAgICAgICAgICBzdXBlcihBcnJheXMuYXNMaXN0KGFycmF5KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdyb3VwU2V0IGV4dGVuZHMgSGFzaFNldDxTdHJpbmc+IHsKLSAgICAgICAgcHVibGljIEdyb3VwU2V0KFN0cmluZyAuLi4gYXJyYXkpIHsKLSAgICAgICAgICAgIHN1cGVyKEFycmF5cy5hc0xpc3QoYXJyYXkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIExpc3Q8UHJvcGVydHlOb2RlPj4gbU9yZGVyZWROb2RlTWFwOwotICAgIC8vIEludGVudGlvbmFsbHkgdXNlIEFycmF5TGlzdCBpbnN0ZWFkIG9mIFNldCwgYXNzdW1pbmcgdGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUKLSAgICAvLyBleGFjdGx5IHNhbWUgb2JqZWN0cy4KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxQcm9wZXJ0eU5vZGU+IG1Vbm9yZGVyZWROb2RlTGlzdDsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKEFuZHJvaWRUZXN0Q2FzZSBhbmRyb2lkVGVzdENhc2UpIHsKLSAgICAgICAgbU9yZGVyZWROb2RlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFByb3BlcnR5Tm9kZT4+KCk7Ci0gICAgICAgIG1Vbm9yZGVyZWROb2RlTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPigpOwotICAgIH0KLQotICAgIC8vIFdpdGhPcmRlcgotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBwcm9wVmFsdWUsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigKLSAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsLCBjb250ZW50VmFsdWVzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoCi0gICAgICAgICAgICBTdHJpbmcgcHJvcE5hbWUsIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgbnVsbCwgcHJvcFZhbHVlTGlzdCwKLSAgICAgICAgICAgICAgICBudWxsLCBjb250ZW50VmFsdWVzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoCi0gICAgICAgICAgICBTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0KSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJvcFZhbHVlTGlzdCwgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoCi0gICAgICAgICAgICBTdHJpbmcgcHJvcE5hbWUsIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0KSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcm9wVmFsdWUgPSBjb25jYXRpbmF0ZUxpc3RXaXRoU2VtaUNvbG9uKHByb3BWYWx1ZUxpc3QpOwotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBwcm9wVmFsdWUudG9TdHJpbmcoKSwgcHJvcFZhbHVlTGlzdCwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoU3RyaW5nIHByb3BOYW1lLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBudWxsLCBwcm9wVmFsdWVMaXN0LCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgQ29udGVudFZhbHVlcyBwYXJhbU1hcCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIG51bGwsIHByb3BWYWx1ZUxpc3QsIG51bGwsIHBhcmFtTWFwLAotICAgICAgICAgICAgICAgIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBwYXJhbU1hcCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBwYXJhbU1hcCwgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgQ29udGVudFZhbHVlcyBwYXJhbU1hcCkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBwcm9wVmFsdWUsIHByb3BWYWx1ZUxpc3QsIG51bGwsIHBhcmFtTWFwLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgYnl0ZVtdIHByb3BWYWx1ZV9ieXRlcywKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSwgR3JvdXBTZXQgcHJvcEdyb3VwU2V0KSB7Ci0gICAgICAgIGlmIChwcm9wVmFsdWUgPT0gbnVsbCAmJiBwcm9wVmFsdWVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BWYWx1ZSA9IGNvbmNhdGluYXRlTGlzdFdpdGhTZW1pQ29sb24ocHJvcFZhbHVlTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgUHJvcGVydHlOb2RlIHByb3BlcnR5Tm9kZSA9IG5ldyBQcm9wZXJ0eU5vZGUocHJvcE5hbWUsCi0gICAgICAgICAgICAgICAgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBwcm9wVmFsdWVfYnl0ZXMsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXAsIHBhcmFtTWFwX1RZUEUsIHByb3BHcm91cFNldCk7Ci0gICAgICAgIExpc3Q8UHJvcGVydHlOb2RlPiBleHBlY3RlZE5vZGVMaXN0ID0gbU9yZGVyZWROb2RlTWFwLmdldChwcm9wTmFtZSk7Ci0gICAgICAgIGlmIChleHBlY3RlZE5vZGVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGV4cGVjdGVkTm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4oKTsKLSAgICAgICAgICAgIG1PcmRlcmVkTm9kZU1hcC5wdXQocHJvcE5hbWUsIGV4cGVjdGVkTm9kZUxpc3QpOwotICAgICAgICB9Ci0gICAgICAgIGV4cGVjdGVkTm9kZUxpc3QuYWRkKHByb3BlcnR5Tm9kZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8vIFdpdGhvdXRPcmRlcgotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLCBudWxsLCBjb250ZW50VmFsdWVzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBudWxsLAotICAgICAgICAgICAgICAgIHByb3BWYWx1ZUxpc3QsIG51bGwsIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsIHByb3BWYWx1ZUxpc3QsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBudWxsLCBwcm9wVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLCBudWxsLCBudWxsLCBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSkgewotICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcFZhbHVlID0gY29uY2F0aW5hdGVMaXN0V2l0aFNlbWlDb2xvbihwcm9wVmFsdWVMaXN0KTsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJvcFZhbHVlTGlzdCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBwYXJhbU1hcCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBwYXJhbU1hcCwgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBieXRlW10gcHJvcFZhbHVlX2J5dGVzLAotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBwYXJhbU1hcCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFLCBHcm91cFNldCBwcm9wR3JvdXBTZXQpIHsKLSAgICAgICAgaWYgKHByb3BWYWx1ZSA9PSBudWxsICYmIHByb3BWYWx1ZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcFZhbHVlID0gY29uY2F0aW5hdGVMaXN0V2l0aFNlbWlDb2xvbihwcm9wVmFsdWVMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBtVW5vcmRlcmVkTm9kZUxpc3QuYWRkKG5ldyBQcm9wZXJ0eU5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwKLSAgICAgICAgICAgICAgICBwcm9wVmFsdWVMaXN0LCBwcm9wVmFsdWVfYnl0ZXMsIHBhcmFtTWFwLCBwYXJhbU1hcF9UWVBFLCBwcm9wR3JvdXBTZXQpKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KFZOb2RlIHZub2RlKSB7Ci0gICAgICAgIGZvciAoUHJvcGVydHlOb2RlIGFjdHVhbE5vZGUgOiB2bm9kZS5wcm9wTGlzdCkgewotICAgICAgICAgICAgdmVyaWZ5Tm9kZShhY3R1YWxOb2RlLnByb3BOYW1lLCBhY3R1YWxOb2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbU9yZGVyZWROb2RlTWFwLmlzRW1wdHkoKSB8fCAhbVVub3JkZXJlZE5vZGVMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGV4cGVjdGVkUHJvcHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGZvciAoTGlzdDxQcm9wZXJ0eU5vZGU+IG5vZGVzIDogbU9yZGVyZWROb2RlTWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChQcm9wZXJ0eU5vZGUgbm9kZSA6IG5vZGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZXhwZWN0ZWRQcm9wcy5jb250YWlucyhub2RlLnByb3BOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRQcm9wcy5hZGQobm9kZS5wcm9wTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKFByb3BlcnR5Tm9kZSBub2RlIDogbVVub3JkZXJlZE5vZGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFleHBlY3RlZFByb3BzLmNvbnRhaW5zKG5vZGUucHJvcE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkUHJvcHMuYWRkKG5vZGUucHJvcE5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIkV4cGVjdGVkIHByb3BlcnR5ICIgKyBBcnJheXMudG9TdHJpbmcoZXhwZWN0ZWRQcm9wcy50b0FycmF5KCkpCi0gICAgICAgICAgICAgICAgICAgICsgIiB3YXMgbm90IGZvdW5kLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeU5vZGUoZmluYWwgU3RyaW5nIHByb3BOYW1lLCBmaW5hbCBQcm9wZXJ0eU5vZGUgYWN0dWFsTm9kZSkgewotICAgICAgICBmaW5hbCBMaXN0PFByb3BlcnR5Tm9kZT4gZXhwZWN0ZWROb2RlTGlzdCA9IG1PcmRlcmVkTm9kZU1hcC5nZXQocHJvcE5hbWUpOwotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IChleHBlY3RlZE5vZGVMaXN0ICE9IG51bGwgPyBleHBlY3RlZE5vZGVMaXN0LnNpemUoKSA6IDApOwotICAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUHJvcGVydHlOb2RlIGV4cGVjdGVkTm9kZSA9IGV4cGVjdGVkTm9kZUxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8UHJvcGVydHlOb2RlPiBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4oKTsKLSAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWROb2RlLnByb3BOYW1lLmVxdWFscyhwcm9wTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkTm9kZS5lcXVhbHMoYWN0dWFsTm9kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkTm9kZUxpc3QucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkTm9kZUxpc3Quc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3JkZXJlZE5vZGVNYXAucmVtb3ZlKHByb3BOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0LmFkZChleHBlY3RlZE5vZGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gImFjdHVhbE5vZGUiIGlzIG5vdCBpbiBvcmRlcmVkIGV4cGVjdGVkIGxpc3QuCi0gICAgICAgICAgICAgICAgLy8gVHJ5IGxvb2tpbmcgb3ZlciB1bm9yZGVyZWQgZXhwZWN0ZWQgbGlzdC4KLSAgICAgICAgICAgICAgICBpZiAodHJ5Rm91bmRFeHBlY3RlZE5vZGVGcm9tVW5vcmRlcmVkTGlzdChhY3R1YWxOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHByb3BOYW1lIGV4aXN0cyBidXQgd2l0aCBkaWZmZXJlbnQgdmFsdWUocykuCi0gICAgICAgICAgICAgICAgICAgIGZhaWxXaXRoRXhwZWN0ZWROb2RlTGlzdChwcm9wTmFtZSwgYWN0dWFsTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyBleHBlY3RlZCBub2RlIHdpdGggc2FtZSBwcm9wTmFtZS4KLSAgICAgICAgICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBwcm9wZXJ0eSBcIiIgKyBwcm9wTmFtZSArICJcIiBleGlzdHMuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eU5vZGU+IGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0ID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4oKTsKLSAgICAgICAgICAgIGlmICh0cnlGb3VuZEV4cGVjdGVkTm9kZUZyb21Vbm9yZGVyZWRMaXN0KGFjdHVhbE5vZGUsIGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0KSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwcm9wTmFtZSBleGlzdHMgYnV0IHdpdGggZGlmZmVyZW50IHZhbHVlKHMpLgotICAgICAgICAgICAgICAgICAgICBmYWlsV2l0aEV4cGVjdGVkTm9kZUxpc3QocHJvcE5hbWUsIGFjdHVhbE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gZXhwZWN0ZWQgbm9kZSB3aXRoIHNhbWUgcHJvcE5hbWUuCi0gICAgICAgICAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgcHJvcGVydHkgXCIiICsgcHJvcE5hbWUgKyAiXCIgZXhpc3RzLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNvbmNhdGluYXRlTGlzdFdpdGhTZW1pQ29sb24oTGlzdDxTdHJpbmc+IGFycmF5KSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICBmb3IgKFN0cmluZyBwcm9wVmFsdWVFbGVtIDogYXJyYXkpIHsKLSAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJzsnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQocHJvcFZhbHVlRWxlbSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHRyeUZvdW5kRXhwZWN0ZWROb2RlRnJvbVVub3JkZXJlZExpc3QoUHJvcGVydHlOb2RlIGFjdHVhbE5vZGUsCi0gICAgICAgICAgICBMaXN0PFByb3BlcnR5Tm9kZT4gZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByb3BOYW1lID0gYWN0dWFsTm9kZS5wcm9wTmFtZTsKLSAgICAgICAgaW50IHVub3JkZXJlZExpc3RTaXplID0gbVVub3JkZXJlZE5vZGVMaXN0LnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bm9yZGVyZWRMaXN0U2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eU5vZGUgdW5vcmRlcmVkRXhwZWN0ZWROb2RlID0gbVVub3JkZXJlZE5vZGVMaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmICh1bm9yZGVyZWRFeHBlY3RlZE5vZGUucHJvcE5hbWUuZXF1YWxzKHByb3BOYW1lKSkgewotICAgICAgICAgICAgICAgIGlmICh1bm9yZGVyZWRFeHBlY3RlZE5vZGUuZXF1YWxzKGFjdHVhbE5vZGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Vbm9yZGVyZWROb2RlTGlzdC5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdC5hZGQodW5vcmRlcmVkRXhwZWN0ZWROb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZhaWxXaXRoRXhwZWN0ZWROb2RlTGlzdChTdHJpbmcgcHJvcE5hbWUsIFByb3BlcnR5Tm9kZSBhY3R1YWxOb2RlLAotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eU5vZGU+IGV4cGVjdGVkTm9kZUxpc3QpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChQcm9wZXJ0eU5vZGUgZXhwZWN0ZWROb2RlIDogZXhwZWN0ZWROb2RlTGlzdCkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoImV4cGVjdGVkOiAiKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGV4cGVjdGVkTm9kZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcbiIpOwotICAgICAgICB9Ci0gICAgICAgIFRlc3RDYXNlLmZhaWwoIlByb3BlcnR5IFwiIiArIHByb3BOYW1lICsgIlwiIGhhcyB3cm9uZyB2YWx1ZS5cbiIKLSAgICAgICAgICAgICAgICArIGJ1aWxkZXIudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICsgIiAgYWN0dWFsOiAiICsgYWN0dWFsTm9kZS50b1N0cmluZygpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9WQ2FyZFRlc3RzQmFzZS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvVkNhcmRUZXN0c0Jhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0MTNhYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9WQ2FyZFRlc3RzQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotCi0vKioKLSAqIEJhc2VDbGFzcyBmb3IgdkNhcmQgdW5pdCB0ZXN0cyB3aXRoIHV0aWxpdHkgY2xhc3Nlcy4KLSAqIFBsZWFzZSBkbyBub3QgYWRkIGVhY2ggdW5pdCB0ZXN0IGhlcmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZFRlc3RzQmFzZSBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVjIxID0gVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfR0VORVJJQzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWMzAgPSBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9HRU5FUklDOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFY0MCA9IFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjQwX0dFTkVSSUM7Ci0KLSAgICAvLyBEbyBub3QgbW9kaWZ5IHRoZXNlIGR1cmluZyB0ZXN0cy4KLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvclFQOwotICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZW50VmFsdWVzIG1Db250ZW50VmFsdWVzRm9yU0ppczsKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvclV0Zjg7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFNKaXM7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0Zjg7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMjE7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMzA7Ci0KLSAgICBwcm90ZWN0ZWQgVkNhcmRWZXJpZmllciBtVmVyaWZpZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Ta2lwVmVyaWZpY2F0aW9uOwotCi0gICAgcHVibGljIFZDYXJkVGVzdHNCYXNlKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICAvLyBOb3QgdXNpbmcgY29uc3RhbnRzIGluIHZDYXJkIGNvZGUgc2luY2UgaXQgbWF5IGJlIHdyb25nLgotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUC5wdXQoIkVOQ09ESU5HIiwgIlFVT1RFRC1QUklOVEFCTEUiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLnB1dCgiQ0hBUlNFVCIsICJTSElGVF9KSVMiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JVdGY4ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JVdGY4LnB1dCgiQ0hBUlNFVCIsICJVVEYtOCIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzLnB1dCgiRU5DT0RJTkciLCAiUVVPVEVELVBSSU5UQUJMRSIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcy5wdXQoIkNIQVJTRVQiLCAiU0hJRlRfSklTIik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRVdGY4ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjgucHV0KCJFTkNPRElORyIsICJRVU9URUQtUFJJTlRBQkxFIik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRVdGY4LnB1dCgiQ0hBUlNFVCIsICJVVEYtOCIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvckJhc2U2NFYyMSA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yQmFzZTY0VjIxLnB1dCgiRU5DT0RJTkciLCAiQkFTRTY0Iik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yQmFzZTY0VjMwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMzAucHV0KCJFTkNPRElORyIsICJiIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVzdEFuZHJvaWRUZXN0Q2FzZVNldHVwUHJvcGVybHkoKSB7Ci0gICAgICAgIHN1cGVyLnRlc3RBbmRyb2lkVGVzdENhc2VTZXR1cFByb3Blcmx5KCk7Ci0gICAgICAgIG1Ta2lwVmVyaWZpY2F0aW9uID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb257Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIG1WZXJpZmllciA9IG5ldyBWQ2FyZFZlcmlmaWVyKHRoaXMpOwotICAgICAgICBtU2tpcFZlcmlmaWNhdGlvbiA9IGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIGlmICghbVNraXBWZXJpZmljYXRpb24pIHsKLSAgICAgICAgICAgIG1WZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1ZDYXJkVmVyaWZpZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1ZDYXJkVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM3OWE1Yi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9WQ2FyZFZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Ci0gKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotICogdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRW50aXR5SXRlcmF0b3I7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29tcG9zZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeUNvbnN0cnVjdG9yOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkSW50ZXJwcmV0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb247Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBjbGFzcyBsZXRzIHVzZXJzIGNoZWNrcyB0aGF0IGdpdmVuIGV4cGVjdGVkIHZDYXJkIGRhdGEgYXJlIHNhbWUgYXMgZ2l2ZW4gYWN0dWFsIHZDYXJkIGRhdGEuCi0gKiBBYmxlIHRvIHZlcmlmeSBib3RoIHZDYXJkIGltcG9ydGVyL2V4cG9ydGVyLgotICogPC9wPgotICogPHA+Ci0gKiBGaXJzdCBhIHVzZXIgaGFzIHRvIGluaXRpYWxpemUgdGhlIG9iamVjdCBieSBjYWxsaW5nIGVpdGhlcgotICoge0BsaW5rICNpbml0Rm9ySW1wb3J0VGVzdChpbnQsIGludCl9IG9yIHtAbGluayAjaW5pdEZvckV4cG9ydFRlc3QoaW50KX0uCi0gKiAiUm91bmQgdHJpcCB0ZXN0IiAoaW1wb3J0IC0+IGV4cG9ydCAtPiBpbXBvcnQsIG9yIGV4cG9ydCAtPiBpbXBvcnQgLT4gZXhwb3J0KSBpcyBub3Qgc3VwcG9ydGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRWZXJpZmllciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRWZXJpZmllciI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDdXN0b21Nb2NrQ29udGV4dCBleHRlbmRzIE1vY2tDb250ZXh0IHsKLSAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIG1SZXNvbHZlcjsKLSAgICAgICAgcHVibGljIEN1c3RvbU1vY2tDb250ZXh0KENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgewotICAgICAgICAgICAgbVJlc29sdmVyID0gcmVzb2x2ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIENvbnRlbnRSZXNvbHZlciBnZXRDb250ZW50UmVzb2x2ZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJlc29sdmVyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBWQ2FyZFZlcmlmaWVySW50ZXJuYWwgaW1wbGVtZW50cyBWQ2FyZENvbXBvc2VyLk9uZUVudHJ5SGFuZGxlciB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uSW5pdChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uRW50cnlDcmVhdGVkKFN0cmluZyB2Y2FyZCkgewotICAgICAgICAgICAgdmVyaWZ5T25lVkNhcmRGb3JFeHBvcnQodmNhcmQpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgb25UZXJtaW5hdGUoKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFuZHJvaWRUZXN0Q2FzZSBtQW5kcm9pZFRlc3RDYXNlOwotICAgIHByaXZhdGUgZmluYWwgVkNhcmRWZXJpZmllckludGVybmFsIG1WQ2FyZFZlcmlmaWVySW50ZXJuYWw7Ci0gICAgcHJpdmF0ZSBpbnQgbVZDYXJkVHlwZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzRG9Db01vOwotCi0gICAgLy8gT25seSBvbmUgb2YgdGhlbSBtdXN0IGJlIG5vbi1lbXB0eS4KLSAgICBwcml2YXRlIEV4cG9ydFRlc3RSZXNvbHZlciBtRXhwb3J0VGVzdFJlc29sdmVyOwotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gbUlucHV0U3RyZWFtOwotCi0gICAgLy8gVG8gYWxsb3cgZHVwbGljYXRpb24sIHVzZSBsaXN0IGluc3RlYWQgb2Ygc2V0LgotICAgIC8vIFdoZW4gbnVsbCwgd2UgZG9uJ3QgbmVlZCB0byBkbyB0aGUgdmVyaWZpY2F0aW9uLgotICAgIHByaXZhdGUgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyIG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXI7Ci0gICAgcHJpdmF0ZSBMaW5lVmVyaWZpZXIgbUxpbmVWZXJpZmllcjsKLSAgICBwcml2YXRlIENvbnRlbnRWYWx1ZXNWZXJpZmllciBtQ29udGVudFZhbHVlc1ZlcmlmaWVyOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSW5pdGlhbGl6ZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1WZXJpZmllZCA9IGZhbHNlOwotICAgIHByaXZhdGUgU3RyaW5nIG1DaGFyc2V0OwotCi0gICAgLy8gQ2FsbGVkIGJ5IFZDYXJkVGVzdHNCYXNlCi0gICAgcHVibGljIFZDYXJkVmVyaWZpZXIoQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSkgewotICAgICAgICBtQW5kcm9pZFRlc3RDYXNlID0gYW5kcm9pZFRlc3RDYXNlOwotICAgICAgICBtVkNhcmRWZXJpZmllckludGVybmFsID0gbmV3IFZDYXJkVmVyaWZpZXJJbnRlcm5hbCgpOwotICAgICAgICBtRXhwb3J0VGVzdFJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgbUlucHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7Ci0gICAgICAgIG1WZXJpZmllZCA9IGZhbHNlOwotICAgIH0KLQotICAgIC8vIFNob3VsZCBiZSBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGltcG9ydCB0ZXN0LgotICAgIHB1YmxpYyB2b2lkIGluaXRGb3JJbXBvcnRUZXN0KGludCB2Y2FyZFR5cGUsIGludCByZXNJZCkgewotICAgICAgICBpZiAobUluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuZmFpbCgiQWxyZWFkeSBpbml0aWFsaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgICAgIG1Jc0RvQ29NbyA9IFZDYXJkQ29uZmlnLmlzRG9Db01vKHZjYXJkVHlwZSk7Ci0gICAgICAgIHNldElucHV0UmVzb3VyY2VJZChyZXNJZCk7Ci0gICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7Ci0gICAgfQotCi0gICAgLy8gU2hvdWxkIGJlIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggZXhwb3J0IHRlc3QuCi0gICAgcHVibGljIHZvaWQgaW5pdEZvckV4cG9ydFRlc3QoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBpbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUsICJVVEYtOCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXRGb3JFeHBvcnRUZXN0KGludCB2Y2FyZFR5cGUsIFN0cmluZyBjaGFyc2V0KSB7Ci0gICAgICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJBbHJlYWR5IGluaXRpYWxpemVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUV4cG9ydFRlc3RSZXNvbHZlciA9IG5ldyBFeHBvcnRUZXN0UmVzb2x2ZXIobUFuZHJvaWRUZXN0Q2FzZSk7Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgICAgIG1Jc0RvQ29NbyA9IFZDYXJkQ29uZmlnLmlzRG9Db01vKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShjaGFyc2V0KSkgewotICAgICAgICAgICAgbUNoYXJzZXQgPSAiVVRGLTgiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNoYXJzZXQgPSBjaGFyc2V0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldElucHV0UmVzb3VyY2VJZChpbnQgcmVzSWQpIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBtQW5kcm9pZFRlc3RDYXNlLmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5vcGVuUmF3UmVzb3VyY2UocmVzSWQpOwotICAgICAgICBpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIldyb25nIHJlc0lkOiAiICsgcmVzSWQpOwotICAgICAgICB9Ci0gICAgICAgIHNldElucHV0U3RyZWFtKGlucHV0U3RyZWFtKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLSAgICAgICAgaWYgKG1FeHBvcnRUZXN0UmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoImFkZElucHV0RW50cnkoKSBpcyBjYWxsZWQuIik7Ci0gICAgICAgIH0gZWxzZSBpZiAobUlucHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJJbnB1dFN0cmVhbSBpcyBhbHJlYWR5IHNldCIpOwotICAgICAgICB9Ci0gICAgICAgIG1JbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0RW50cnkgYWRkSW5wdXRFbnRyeSgpIHsKLSAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlucHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJzZXRJbnB1dFN0cmVhbSBpcyBjYWxsZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUV4cG9ydFRlc3RSZXNvbHZlci5hZGRJbnB1dENvbnRhY3RFbnRyeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRob3V0VmVyc2lvbigpIHsKLSAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByb3BlcnR5Tm9kZXNWZXJpZmllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyID0gbmV3IFByb3BlcnR5Tm9kZXNWZXJpZmllcihtQW5kcm9pZFRlc3RDYXNlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVByb3BlcnR5Tm9kZXNWZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKSB7Ci0gICAgICAgIGZpbmFsIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IGFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRob3V0VmVyc2lvbigpOwotICAgICAgICBmaW5hbCBTdHJpbmcgdmVyc2lvblN0cmluZzsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjIxKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICB2ZXJzaW9uU3RyaW5nID0gIjIuMSI7Ci0gICAgICAgIH0gZWxzZSBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIHZlcnNpb25TdHJpbmcgPSAiMy4wIjsKLSAgICAgICAgfSBlbHNlIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb240MChtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgdmVyc2lvblN0cmluZyA9ICI0LjAiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdmNhcmQgdHlwZSBkdXJpbmcgYSB1bml0IHRlc3QiKTsKLSAgICAgICAgfQotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVkVSU0lPTiIsIHZlcnNpb25TdHJpbmcpOwotCi0gICAgICAgIHJldHVybiBlbGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkgewotICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIk5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IGFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjQwKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgIiIpOwotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwgIiIpOwotICAgICAgICB9IGVsc2UgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVsZW07Ci0gICAgfQotCi0gICAgcHVibGljIExpbmVWZXJpZmllckVsZW0gYWRkTGluZVZlcmlmaWVyRWxlbSgpIHsKLSAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUxpbmVWZXJpZmllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTGluZVZlcmlmaWVyID0gbmV3IExpbmVWZXJpZmllcihtQW5kcm9pZFRlc3RDYXNlLCBtVkNhcmRUeXBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUxpbmVWZXJpZmllci5hZGRMaW5lVmVyaWZpZXJFbGVtKCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpIHsKLSAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUNvbnRlbnRWYWx1ZXNWZXJpZmllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtQ29udGVudFZhbHVlc1ZlcmlmaWVyID0gbmV3IENvbnRlbnRWYWx1ZXNWZXJpZmllcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1Db250ZW50VmFsdWVzVmVyaWZpZXIuYWRkRWxlbShtQW5kcm9pZFRlc3RDYXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHVwIHN1Yi12ZXJpZmllcnMgY29ycmVjdGx5IGFuZCB0cnkgcGFyc2UgZ2l2ZW4gdkNhcmQgYXMgSW5wdXRTdHJlYW0uCi0gICAgICogRXJyb3JzIGFyb3VuZCBJbnB1dFN0cmVhbSBtdXN0IGJlIGhhbmRsZWQgb3V0c2lkZSB0aGlzIG1ldGhvZC4KLSAgICAgKgotICAgICAqIFVzZWQgYm90aCBmcm9tIHtAbGluayAjdmVyaWZ5Rm9ySW1wb3J0VGVzdCgpfSBhbmQgZnJvbSB7QGxpbmsgI3ZlcmlmeUZvckV4cG9ydFRlc3QoKX0uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVdpdGhJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgVkNhcmRJbnRlcnByZXRlciBpbnRlcnByZXRlcjsKLSAgICAgICAgaWYgKG1Db250ZW50VmFsdWVzVmVyaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgVkNhcmRFbnRyeUNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gbmV3IFZDYXJkRW50cnlDb25zdHJ1Y3RvcihtVkNhcmRUeXBlKTsKLSAgICAgICAgICAgIGNvbnN0cnVjdG9yLmFkZEVudHJ5SGFuZGxlcihtQ29udGVudFZhbHVlc1ZlcmlmaWVyKTsKLSAgICAgICAgICAgIGlmIChtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnRlcnByZXRlciA9IG5ldyBWQ2FyZEludGVycHJldGVyQ29sbGVjdGlvbihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgbVByb3BlcnR5Tm9kZXNWZXJpZmllciwgY29uc3RydWN0b3IpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIgPSBjb25zdHJ1Y3RvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnRlcnByZXRlciA9IG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludGVycHJldGVyID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBOb3RlOiB3ZSBtdXN0IG5vdCBzcGVjaWZ5IGNoYXJzZXQgdG93YXJkIHZDYXJkIHBhcnNlcnMuIFRoaXMgY29kZSBjaGVja3Mgd2hldGhlcgotICAgICAgICAgICAgLy8gdGhvc2UgcGFyc2VycyBhcmUgYWJsZSB0byBlbmNvZGUgZ2l2ZW4gYmluYXJ5IHdpdGhvdXQgYW55IGV4dHJhIGluZm9ybWF0aW9uIGZvcgotICAgICAgICAgICAgLy8gY2hhcnNldC4KLSAgICAgICAgICAgIGZpbmFsIFZDYXJkUGFyc2VyIHBhcnNlciA9IFZDYXJkVXRpbHMuZ2V0QXBwcm9wcmlhdGVQYXJzZXIobVZDYXJkVHlwZSk7Ci0gICAgICAgICAgICBwYXJzZXIucGFyc2UoaXMsIGludGVycHJldGVyKTsKLSAgICAgICAgfSBjYXRjaCAoVkNhcmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgVkNhcmRFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5T25lVkNhcmRGb3JFeHBvcnQoZmluYWwgU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgIExvZy5kKExPR19UQUcsIHZjYXJkKTsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odmNhcmQuZ2V0Qnl0ZXMobUNoYXJzZXQpKTsKLSAgICAgICAgICAgIHZlcmlmeVdpdGhJbnB1dFN0cmVhbShpcyk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KCkgewotICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiTm90IGluaXRpYWxpemVkLiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVmVyaWZpZWQpIHsKLSAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoInZlcmlmeSgpIHdhcyBjYWxsZWQgdHdpY2UuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUlucHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtRXhwb3J0VGVzdFJlc29sdmVyICE9IG51bGwpewotICAgICAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlRoZXJlIGFyZSB0d28gaW5wdXQgc291cmNlcy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZlcmlmeUZvckltcG9ydFRlc3QoKTsKLSAgICAgICAgfSBlbHNlIGlmIChtRXhwb3J0VGVzdFJlc29sdmVyICE9IG51bGwpewotICAgICAgICAgICAgdmVyaWZ5Rm9yRXhwb3J0VGVzdCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiTm8gaW5wdXQgaXMgZGV0ZXJtaW5lZCIpOwotICAgICAgICB9Ci0gICAgICAgIG1WZXJpZmllZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUZvckltcG9ydFRlc3QoKSB7Ci0gICAgICAgIGlmIChtTGluZVZlcmlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJOb3Qgc3VwcG9ydGVkIG5vdy4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2ZXJpZnlXaXRoSW5wdXRTdHJlYW0obUlucHV0U3RyZWFtKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIklPRXhjZXB0aW9uIHdhcyB0aHJvd246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAobUlucHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtSW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFbnRpdHlJdGVyYXRvciBtb2NrR2V0RW50aXR5SXRlcmF0b3JNZXRob2QoCi0gICAgICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIsCi0gICAgICAgICAgICBmaW5hbCBVcmkgdXJpLCBmaW5hbCBTdHJpbmcgc2VsZWN0aW9uLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgZmluYWwgU3RyaW5nIHNvcnRPcmRlcikgewotICAgICAgICBpZiAoRXhwb3J0VGVzdFJlc29sdmVyLmNsYXNzLmVxdWFscyhyZXNvbHZlci5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgcmV0dXJuICgoRXhwb3J0VGVzdFJlc29sdmVyKXJlc29sdmVyKS5nZXRQcm92aWRlcigpLnF1ZXJ5RW50aXRpZXMoCi0gICAgICAgICAgICAgICAgICAgIHVyaSwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBzb3J0T3JkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVuZXhwZWN0ZWQgcHJvdmlkZXIgZ2l2ZW4uIik7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgTWV0aG9kIGdldE1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCgpCi0gICAgICAgICAgICB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJtb2NrR2V0RW50aXR5SXRlcmF0b3JNZXRob2QiLAotICAgICAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlci5jbGFzcywgVXJpLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZ1tdLmNsYXNzLCBTdHJpbmcuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlGb3JFeHBvcnRUZXN0KCkgewotICAgICAgIGZpbmFsIFZDYXJkQ29tcG9zZXIgY29tcG9zZXIgPQotICAgICAgICAgICAgbmV3IFZDYXJkQ29tcG9zZXIobmV3IEN1c3RvbU1vY2tDb250ZXh0KG1FeHBvcnRUZXN0UmVzb2x2ZXIpLCBtVkNhcmRUeXBlLCBtQ2hhcnNldCk7Ci0gICAgICAgIGNvbXBvc2VyLmFkZEhhbmRsZXIobUxpbmVWZXJpZmllcik7Ci0gICAgICAgIGNvbXBvc2VyLmFkZEhhbmRsZXIobVZDYXJkVmVyaWZpZXJJbnRlcm5hbCk7Ci0gICAgICAgIGlmICghY29tcG9zZXIuaW5pdChWQ2FyZENvbXBvc2VyLkNPTlRBQ1RTX1RFU1RfQ09OVEVOVF9VUkksIG51bGwsIG51bGwsIG51bGwpKSB7Ci0gICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuZmFpbCgiaW5pdCgpIGZhaWxlZC4gUmVhc29uOiAiICsgY29tcG9zZXIuZ2V0RXJyb3JSZWFzb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmFzc2VydEZhbHNlKGNvbXBvc2VyLmlzQWZ0ZXJMYXN0KCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKCFjb21wb3Nlci5pc0FmdGVyTGFzdCgpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kIG1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCA9IGdldE1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCgpOwotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuYXNzZXJ0Tm90TnVsbChtb2NrR2V0RW50aXR5SXRlcmF0b3JNZXRob2QpOwotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3Nlci5jcmVhdGVPbmVFbnRyeShtb2NrR2V0RW50aXR5SXRlcmF0b3JNZXRob2QpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuZmFpbChlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNvbXBvc2VyLnRlcm1pbmF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvVk5vZGUuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1ZOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OTBlMmMuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvVk5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBQcmV2aW91c2x5IHVzZWQgaW4gbWFpbiB2Q2FyZCBoYW5kbGluZyBjb2RlIGJ1dCBub3cgZXhpc3RzIG9ubHkgZm9yIHRlc3RpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBWTm9kZSB7Ci0gICAgcHVibGljIFN0cmluZyBWTmFtZTsKLQotICAgIHB1YmxpYyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPiBwcm9wTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPigpOwotCi0gICAgLyoqIDA6cGFyc2Ugb3Zlci4gMTpwYXJzaW5nLiAqLwotICAgIHB1YmxpYyBpbnQgcGFyc2VTdGF0dXMgPSAxOwotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvVk5vZGVCdWlsZGVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9WTm9kZUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgzNzAzNC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9WTm9kZUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkSW50ZXJwcmV0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQmFzZTY0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5DaGFyc2V0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDxwPgotICogVGhlIGNsYXNzIHN0b3JpbmcgdGhlIHBhcnNlIHJlc3VsdCB0byBjdXN0b20gZGF0YXN0cnVjdDoKLSAqIHtAbGluayBWTm9kZX0sIGFuZCB7QGxpbmsgUHJvcGVydHlOb2RlfS4KLSAqIE1heWJlIHNldmVyYWwgdmNhcmQgaW5zdGFuY2UsIHNvIHVzZSB2Tm9kZUxpc3QgdG8gc3RvcmUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaXMgY2FsbGVkIFZOb2RlLCBub3QgVkNhcmROb2RlLCBzaW5jZSBpdCB3YXMgdXNlZCBmb3IgZXhwcmVzc2luZyB2Q2FsZW5kYXIgKGlDYWwpLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVk5vZGVCdWlsZGVyIGltcGxlbWVudHMgVkNhcmRJbnRlcnByZXRlciB7Ci0gICAgc3RhdGljIHByaXZhdGUgU3RyaW5nIExPR19UQUcgPSAiVk5vZGVCdWlsZGVyIjsgCi0gICAgCi0gICAgcHVibGljIExpc3Q8Vk5vZGU+IHZOb2RlTGlzdCA9IG5ldyBBcnJheUxpc3Q8Vk5vZGU+KCk7Ci0gICAgcHJpdmF0ZSBpbnQgbU5vZGVMaXN0UG9zID0gMDsKLSAgICBwcml2YXRlIFZOb2RlIG1DdXJyZW50Vk5vZGU7Ci0gICAgcHJpdmF0ZSBQcm9wZXJ0eU5vZGUgbUN1cnJlbnRQcm9wTm9kZTsKLSAgICBwcml2YXRlIFN0cmluZyBtQ3VycmVudFBhcmFtVHlwZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjaGFyc2V0IHVzaW5nIHdoaWNoIFZQYXJzZXIgcGFyc2VzIHRoZSB0ZXh0LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1Tb3VyY2VDaGFyc2V0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGNoYXJzZXQgd2l0aCB3aGljaCBieXRlIGFycmF5IGlzIGVuY29kZWQgdG8gU3RyaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1UYXJnZXRDaGFyc2V0OwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBtU3RyaWN0TGluZUJyZWFrUGFyc2luZzsKLSAgICAKLSAgICBwdWJsaWMgVk5vZGVCdWlsZGVyKCkgewotICAgICAgICB0aGlzKFZDYXJkQ29uZmlnLkRFRkFVTFRfSU1QT1JUX0NIQVJTRVQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVk5vZGVCdWlsZGVyKFN0cmluZyB0YXJnZXRDaGFyc2V0LCBib29sZWFuIHN0cmljdExpbmVCcmVha1BhcnNpbmcpIHsKLSAgICAgICAgbVNvdXJjZUNoYXJzZXQgPSBWQ2FyZENvbmZpZy5ERUZBVUxUX0lOVEVSTUVESUFURV9DSEFSU0VUOwotICAgICAgICBpZiAodGFyZ2V0Q2hhcnNldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGFyZ2V0Q2hhcnNldCA9IHRhcmdldENoYXJzZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVGFyZ2V0Q2hhcnNldCA9IFZDYXJkQ29uZmlnLkRFRkFVTFRfSU1QT1JUX0NIQVJTRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgbVN0cmljdExpbmVCcmVha1BhcnNpbmcgPSBzdHJpY3RMaW5lQnJlYWtQYXJzaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKLSAgICB9Ci0KLSAgICAvLyBOb3RlOiBJIGd1ZXNzIHRoYXQgdGhpcyBjb2RlIGFzc3VtZXMgdGhlIFJlY29yZCBtYXkgbmVzdCBsaWtlIHRoaXM6Ci0gICAgLy8gU1RBUlQ6VlBPUwotICAgIC8vIC4uLgotICAgIC8vIFNUQVJUOlZQT1MyCi0gICAgLy8gLi4uCi0gICAgLy8gRU5EOlZQT1MyCi0gICAgLy8gLi4uCi0gICAgLy8gRU5EOlZQT1MKLSAgICAvLwotICAgIC8vIEhvd2V2ZXIgdGhlIGZvbGxvd2luZyBjb2RlIGhhcyBhIGJ1Zy4KLSAgICAvLyBXaGVuIGVycm9yIG9jY3VycyBhZnRlciBjYWxsaW5nIHN0YXJ0UmVjb3JkKCksIHRoZSBlbnRyeSB3aGljaCBpcyBwcm9iYWJseQotICAgIC8vIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgcmVtYWlucyB0byBiZSBpbiB2Tm9kZUxpc3QsIHdoaWxlIGVuZFJlY29yZCgpIGlzIG5vdCBjYWxsZWQuCi0gICAgLy8KLSAgICAvLyBJIGxlYXZlIHRoaXMgY29kZSBhcyBpcyBzaW5jZSBJJ20gbm90IGZhbWlsaWFyIHdpdGggdmNhbGVuZGFyIHNwZWNpZmljYXRpb24uCi0gICAgLy8gQnV0IEkgYmVsaWV2ZSB3ZSBzaG91bGQgcmVmYWN0b3IgdGhpcyBjb2RlIGluIHRoZSBmdXR1cmUuCi0gICAgLy8gVW50aWwgdGhpcywgdGhlIGxhc3QgZW50cnkgaGFzIHRvIGJlIHJlbW92ZWQgd2hlbiBzb21lIGVycm9yIG9jY3Vycy4KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVudHJ5KCkgewotICAgICAgICBWTm9kZSB2bm9kZSA9IG5ldyBWTm9kZSgpOwotICAgICAgICB2bm9kZS5wYXJzZVN0YXR1cyA9IDE7Ci0gICAgICAgIHZub2RlLlZOYW1lID0gIlZDQVJEIjsKLSAgICAgICAgLy8gSSBmZWVsIHRoaXMgc2hvdWxkIGJlIGRvbmUgaW4gZW5kUmVjb3JkKCksIGJ1dCBpdCBjYW5ub3QgYmUgZG9uZSBiZWNhdXNlIG9mCi0gICAgICAgIC8vIHRoZSByZWFzb24gYWJvdmUuCi0gICAgICAgIHZOb2RlTGlzdC5hZGQodm5vZGUpOwotICAgICAgICBtTm9kZUxpc3RQb3MgPSB2Tm9kZUxpc3Quc2l6ZSgpIC0gMTsKLSAgICAgICAgbUN1cnJlbnRWTm9kZSA9IHZOb2RlTGlzdC5nZXQobU5vZGVMaXN0UG9zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRFbnRyeSgpIHsKLSAgICAgICAgVk5vZGUgZW5kTm9kZSA9IHZOb2RlTGlzdC5nZXQobU5vZGVMaXN0UG9zKTsKLSAgICAgICAgZW5kTm9kZS5wYXJzZVN0YXR1cyA9IDA7Ci0gICAgICAgIHdoaWxlKG1Ob2RlTGlzdFBvcyA+IDApewotICAgICAgICAgICAgbU5vZGVMaXN0UG9zLS07Ci0gICAgICAgICAgICBpZigodk5vZGVMaXN0LmdldChtTm9kZUxpc3RQb3MpKS5wYXJzZVN0YXR1cyA9PSAxKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50Vk5vZGUgPSB2Tm9kZUxpc3QuZ2V0KG1Ob2RlTGlzdFBvcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRQcm9wZXJ0eSgpIHsKLSAgICAgICAgbUN1cnJlbnRQcm9wTm9kZSA9IG5ldyBQcm9wZXJ0eU5vZGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRQcm9wZXJ0eSgpIHsKLSAgICAgICAgbUN1cnJlbnRWTm9kZS5wcm9wTGlzdC5hZGQobUN1cnJlbnRQcm9wTm9kZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BOYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUdyb3VwKFN0cmluZyBncm91cCkgewotICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BHcm91cFNldC5hZGQoZ3JvdXApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICBtQ3VycmVudFBhcmFtVHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAoIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbih2YWx1ZSkpIHsKLSAgICAgICAgICAgIHZhbHVlID0gVkNhcmRVdGlscy5jb252ZXJ0U3RyaW5nQ2hhcnNldCh2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25maWcuREVGQVVMVF9JTlRFUk1FRElBVEVfQ0hBUlNFVCwKLSAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25maWcuREVGQVVMVF9JTVBPUlRfQ0hBUlNFVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUN1cnJlbnRQYXJhbVR5cGUgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgIG1DdXJyZW50UGFyYW1UeXBlLmVxdWFsc0lnbm9yZUNhc2UoIlRZUEUiKSkgewotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wYXJhbU1hcF9UWVBFLmFkZCh2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnBhcmFtTWFwLnB1dChtQ3VycmVudFBhcmFtVHlwZSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUN1cnJlbnRQYXJhbVR5cGUgPSBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGVuY29kZVN0cmluZyhTdHJpbmcgb3JpZ2luYWxTdHJpbmcsIFN0cmluZyB0YXJnZXRDaGFyc2V0KSB7Ci0gICAgICAgIGlmIChtU291cmNlQ2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKHRhcmdldENoYXJzZXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxTdHJpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKG1Tb3VyY2VDaGFyc2V0KTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gY2hhcnNldC5lbmNvZGUob3JpZ2luYWxTdHJpbmcpOwotICAgICAgICAvLyBieXRlQnVmZmVyLmFycmF5KCkgIm1heSIgcmV0dXJuIGJ5dGUgYXJyYXkgd2hpY2ggaXMgbGFyZ2VyIHRoYW4KLSAgICAgICAgLy8gYnl0ZUJ1ZmZlci5yZW1haW5pbmcoKS4gSGVyZSwgd2Uga2VlcCBvbiB0aGUgc2FmZSBzaWRlLgotICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtieXRlQnVmZmVyLnJlbWFpbmluZygpXTsKLSAgICAgICAgYnl0ZUJ1ZmZlci5nZXQoYnl0ZXMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMsIHRhcmdldENoYXJzZXQpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJGYWlsZWQgdG8gZW5jb2RlOiBjaGFyc2V0PSIgKyB0YXJnZXRDaGFyc2V0KTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGhhbmRsZU9uZVZhbHVlKFN0cmluZyB2YWx1ZSwgU3RyaW5nIHRhcmdldENoYXJzZXQsIFN0cmluZyBlbmNvZGluZykgewotICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZy50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgaWYgKGVuY29kaW5nLmVxdWFscygiQkFTRTY0IikgfHwgZW5jb2RpbmcuZXF1YWxzKCJCIikpIHsKLSAgICAgICAgICAgICAgICAvLyBBc3N1bWUgQkFTRTY0IGlzIHVzZWQgb25seSB3aGVuIHRoZSBudW1iZXIgb2YgdmFsdWVzIGlzIDEuCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfYnl0ZXMgPSBCYXNlNjQuZGVjb2RlKHZhbHVlLmdldEJ5dGVzKCksIEJhc2U2NC5OT19XUkFQKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVuY29kaW5nLmVxdWFscygiUVVPVEVELVBSSU5UQUJMRSIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZDYXJkVXRpbHMucGFyc2VRdW90ZWRQcmludGFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgbVN0cmljdExpbmVCcmVha1BhcnNpbmcsIG1Tb3VyY2VDaGFyc2V0LCB0YXJnZXRDaGFyc2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFVua25vd24gZW5jb2RpbmcuIEZhbGwgYmFjayB0byBkZWZhdWx0LgotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmNvZGVTdHJpbmcodmFsdWUsIHRhcmdldENoYXJzZXQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlcyhMaXN0PFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcFZhbHVlX2J5dGVzID0gbnVsbDsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcFZhbHVlX3ZlY3Rvci5jbGVhcigpOwotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfdmVjdG9yLmFkZCgiIik7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BWYWx1ZSA9ICIiOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBDb250ZW50VmFsdWVzIHBhcmFtTWFwID0gbUN1cnJlbnRQcm9wTm9kZS5wYXJhbU1hcDsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB0YXJnZXRDaGFyc2V0ID0gQ2hhcnNldFV0aWxzLm5hbWVGb3JEZWZhdWx0VmVuZG9yKHBhcmFtTWFwLmdldEFzU3RyaW5nKCJDSEFSU0VUIikpOyAKLSAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gcGFyYW1NYXAuZ2V0QXNTdHJpbmcoIkVOQ09ESU5HIik7IAotICAgICAgICAKLSAgICAgICAgaWYgKHRhcmdldENoYXJzZXQgPT0gbnVsbCB8fCB0YXJnZXRDaGFyc2V0Lmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRhcmdldENoYXJzZXQgPSBtVGFyZ2V0Q2hhcnNldDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcFZhbHVlX3ZlY3Rvci5hZGQoCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZU9uZVZhbHVlKHZhbHVlLCB0YXJnZXRDaGFyc2V0LCBlbmNvZGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWUgPSBsaXN0VG9TdHJpbmcobUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfdmVjdG9yKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBsaXN0VG9TdHJpbmcoTGlzdDxTdHJpbmc+IGxpc3QpewotICAgICAgICBpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotICAgICAgICBpZiAoc2l6ZSA+IDEpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgdHlwZUxpc3RCID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGUgOiBsaXN0KSB7Ci0gICAgICAgICAgICAgICAgdHlwZUxpc3RCLmFwcGVuZCh0eXBlKS5hcHBlbmQoIjsiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBsZW4gPSB0eXBlTGlzdEIubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVuID4gMCAmJiB0eXBlTGlzdEIuY2hhckF0KGxlbiAtIDEpID09ICc7JykgewotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlTGlzdEIuc3Vic3RyaW5nKDAsIGxlbiAtIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHR5cGVMaXN0Qi50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgaWYgKHNpemUgPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIGxpc3QuZ2V0KDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0KCl7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3NQcm92aWRlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzUHJvdmlkZXJUZXN0LmphdmEKaW5kZXggMzcwYWU3OC4uYjgyZTY5OCAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3NQcm92aWRlclRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5nc1Byb3ZpZGVyVGVzdC5qYXZhCkBAIC0xNDQsNCArMTQ0LDUxIEBACiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIFNldHRpbmdzLkJvb2ttYXJrcy5nZXRJbnRlbnRGb3JTaG9ydGN1dChyLCAnKicpKTsKICAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVByb3ZpZGVyTGlzdCgpIHsKKyAgICAgICAgQ29udGVudFJlc29sdmVyIHIgPSBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGdldCBvdXQgd2hhdCB3ZSBwdXQgaW4uCisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELAorICAgICAgICAgICAgICAgICJ0ZXN0MSx0ZXN0Mix0ZXN0MyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpLAorICAgICAgICAgICAgICAgICJ0ZXN0MSx0ZXN0Mix0ZXN0MyIpOworCisgICAgICAgIC8vIFRlc3QgYWRkaW5nIGEgdmFsdWUKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsCisgICAgICAgICAgICAgICAgIiIpOworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwgIit0ZXN0MSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QxIiwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCkpOworCisgICAgICAgIC8vIFRlc3QgYWRkaW5nIGEgc2Vjb25kIHZhbHVlCisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELCAiK3Rlc3QyIik7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdDEsdGVzdDIiLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEKSk7CisKKyAgICAgICAgLy8gVGVzdCBhZGRpbmcgYSB0aGlyZCB2YWx1ZQorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwgIit0ZXN0MyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QxLHRlc3QyLHRlc3QzIiwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCkpOworCisgICAgICAgIC8vIFRlc3QgZGVsZXRpbmcgdGhlIGZpcnN0IHZhbHVlIGluIGEgMyBpdGVtIGxpc3QKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsICItdGVzdDEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0Mix0ZXN0MyIsCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpKTsKKworICAgICAgICAvLyBUZXN0IGRlbGV0aW5nIHRoZSBtaWRkbGUgdmFsdWUgaW4gYSAzIGl0ZW0gbGlzdAorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwKKyAgICAgICAgICAgICAgICAidGVzdDEsdGVzdDIsdGVzdDMiKTsKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsICItdGVzdDIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0MSx0ZXN0MyIsCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpKTsKKworICAgICAgICAvLyBUZXN0IGRlbGV0aW5nIHRoZSBsYXN0IHZhbHVlIGluIGEgMyBpdGVtIGxpc3QKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsCisgICAgICAgICAgICAgICAgInRlc3QxLHRlc3QyLHRlc3QzIik7CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELCAiLXRlc3QzIik7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdDEsdGVzdDIiLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEKSk7CisgICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0QmlkaVRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0QmlkaVRlc3QuamF2YQppbmRleCA4ZTdlNjNlLi5mYjBmMGMxIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dEJpZGlUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRCaWRpVGVzdC5qYXZhCkBAIC0yMiw3ICsyMiw3IEBACiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCiAvKioKLSAqIFRlc3RzIFN0YXRpY0xheW91dCBiaWRpIGltcGxlbWVudGF0aW9uLgorICogUXVpY2sgY2hlY2sgb2YgbmF0aXZlIGJpZGkgaW1wbGVtZW50YXRpb24uCiAgKi8KIHB1YmxpYyBjbGFzcyBTdGF0aWNMYXlvdXRCaWRpVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgICAKQEAgLTQxLDczICs0MSw0NyBAQAogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxMdHIoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX0RMLCAiYSB0ZXN0IiwgIjAwMDAwMCIsIEwpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9ETCwgImEgdGVzdCIsICIwMDAwMDAiLCBMKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEx0clJ0bCgpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfREwsICJhYmMgIiArIEFMRUYgKyBCRVQgKyBHSU1FTCwgIjAwMDAxMTEiLCBMKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfREwsICJhYmMgIiArIEFMRUYgKyBCRVQgKyBHSU1FTCwgIjAwMDAxMTEiLCBMKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFsbFJ0bCgpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfREwsIEFMRUYgKyBTUCArIEFMRUYgKyBCRVQgKyBHSU1FTCArIERBTEVULCAiMTExMTExIiwgUik7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0RMLCBBTEVGICsgU1AgKyBBTEVGICsgQkVUICsgR0lNRUwgKyBEQUxFVCwgIjExMTExMSIsIFIpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UnRsTHRyKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9ETCwgIEFMRUYgKyBCRVQgKyBHSU1FTCArICIgYWJjIiwgIjExMTEwMDAiLCBSKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfREwsICBBTEVGICsgQkVUICsgR0lNRUwgKyAiIGFiYyIsICIxMTExMjIyIiwgUik7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSQWxsTHRyKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9SLCAiYSB0ZXN0IiwgIjAwMDAwMCIsIFIpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9SLCAiYSB0ZXN0IiwgIjIyMjIyMiIsIFIpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Ukx0clJ0bCgpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfUiwgImFiYyAiICsgQUxFRiArIEJFVCArIEdJTUVMLCAiMDAwMTExMSIsIFIpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9SLCAiYWJjICIgKyBBTEVGICsgQkVUICsgR0lNRUwsICIyMjIxMTExIiwgUik7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RMQWxsUnRsKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9MLCBBTEVGICsgU1AgKyBBTEVGICsgQkVUICsgR0lNRUwgKyBEQUxFVCwgIjExMTExMSIsIEwpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9MLCBBTEVGICsgU1AgKyBBTEVGICsgQkVUICsgR0lNRUwgKyBEQUxFVCwgIjExMTExMSIsIEwpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TFJ0bEx0cigpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfTCwgIEFMRUYgKyBCRVQgKyBHSU1FTCArICIgYWJjIiwgIjExMTAwMDAiLCBMKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGV4cGVjdEJpZGkoaW50IGRpciwgU3RyaW5nIHRleHQsIAotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkTGV2ZWxzLCBpbnQgZXhwZWN0ZWREaXIpIHsKLSAgICAgICAgY2hhcltdIGNocyA9IHRleHQudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgaW50IG4gPSBjaHMubGVuZ3RoOwotICAgICAgICBieXRlW10gY2hJbmZvID0gbmV3IGJ5dGVbbl07Ci0gICAgICAgIAotICAgICAgICBpbnQgcmVzdWx0RGlyID0gU3RhdGljTGF5b3V0LmJpZGkoZGlyLCBjaHMsIGNoSW5mbywgbiwgZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJpbmZvOiIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAiKS5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoY2hJbmZvW2ldKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMb2cuaSgiQklESSIsIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjaGFyW10gcmVzdWx0TGV2ZWxDaGFycyA9IG5ldyBjaGFyW25dOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgcmVzdWx0TGV2ZWxDaGFyc1tpXSA9IChjaGFyKSgnMCcgKyBjaEluZm9baV0pOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyByZXN1bHRMZXZlbHMgPSBuZXcgU3RyaW5nKHJlc3VsdExldmVsQ2hhcnMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImRpcmVjdGlvbiIsIGV4cGVjdGVkRGlyLCByZXN1bHREaXIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImxldmVscyIsIGV4cGVjdGVkTGV2ZWxzLCByZXN1bHRMZXZlbHMpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9ETCwgIEFMRUYgKyBCRVQgKyBHSU1FTCArICIgYWJjIiwgIjExMTEyMjIiLCBSKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5hdGl2ZUJpZGkoKSB7Ci0gICAgICAgIC8vIG5hdGl2ZSBiaWRpIHJldHVybnMgbGV2ZWxzLCBub3Qgc2ltcGx5IGRpcmVjdGlvbnMKLSAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfREwsICBBTEVGICsgQkVUICsgR0lNRUwgKyAiIGFiYyIsICIxMTExMjIyIiwgUik7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0wsICBBTEVGICsgQkVUICsgR0lNRUwgKyAiIGFiYyIsICIxMTEwMDAwIiwgTCk7CiAgICAgfQogICAgIAogICAgIHByaXZhdGUgdm9pZCBleHBlY3ROYXRpdmVCaWRpKGludCBkaXIsIFN0cmluZyB0ZXh0LCAKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0RGlyZWN0aW9uc1Rlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0RGlyZWN0aW9uc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmRlODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXREaXJlY3Rpb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXh0OworCitpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dC5EaXJlY3Rpb25zOworaW1wb3J0IGFuZHJvaWQudGV4dC5TdGF0aWNMYXlvdXRUZXN0LkxheW91dEJ1aWxkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBTdGF0aWNMYXlvdXREaXJlY3Rpb25zVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEFMRUYgPSAnXHUwNWQwJzsKKworICAgIHByaXZhdGUgc3RhdGljIERpcmVjdGlvbnMgZGlycyhpbnQgLi4uIGRpcnMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEaXJlY3Rpb25zKGRpcnMpOworICAgIH0KKworICAgIC8vIGNvbnN0YW50cyBmcm9tIExheW91dCB0aGF0IGFyZSBwYWNrYWdlLXByb3RlY3RlZAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fTEVOR1RIX01BU0sgPSAweDAzZmZmZmZmOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fTEVWRUxfU0hJRlQgPSAyNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX0xFVkVMX01BU0sgPSAweDNmOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fUlRMX0ZMQUcgPSAxIDw8IFJVTl9MRVZFTF9TSElGVDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERpcmVjdGlvbnMgRElSU19BTExfTEVGVF9UT19SSUdIVCA9CisgICAgICAgIG5ldyBEaXJlY3Rpb25zKG5ldyBpbnRbXSB7IDAsIFJVTl9MRU5HVEhfTUFTSyB9KTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEaXJlY3Rpb25zIERJUlNfQUxMX1JJR0hUX1RPX0xFRlQgPQorICAgICAgICBuZXcgRGlyZWN0aW9ucyhuZXcgaW50W10geyAwLCBSVU5fTEVOR1RIX01BU0sgfCBSVU5fUlRMX0ZMQUcgfSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTFZMMV8xID0gMSB8ICgxIDw8IFJVTl9MRVZFTF9TSElGVCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExWTDJfMSA9IDEgfCAoMiA8PCBSVU5fTEVWRUxfU0hJRlQpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMVkwyXzIgPSAyIHwgKDIgPDwgUlVOX0xFVkVMX1NISUZUKTsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRleHRzID0geworICAgICAgICAiIiwKKyAgICAgICAgIiAiLAorICAgICAgICAiYSIsCisgICAgICAgICJhMSIsCisgICAgICAgICJhQSIsCisgICAgICAgICJhMWIiLAorICAgICAgICAiYTFBIiwKKyAgICAgICAgImFBMSIsCisgICAgICAgICJhQWIiLAorICAgICAgICAiYUExQiIsCisgICAgICAgICJhQTFCMiIsCisKKyAgICAgICAgLy8gcnRsCisgICAgICAgICJBIiwKKyAgICAgICAgIkExIiwKKyAgICAgICAgIkFhIiwKKyAgICAgICAgIkExQiIsCisgICAgICAgICJBMWEiLAorICAgICAgICAiQWExIiwKKyAgICAgICAgIkFhQiIKKyAgICB9OworCisgICAgLy8gRXhwZWN0ZWQgZGlyZWN0aW9ucyBhcmUgYW4gYXJyYXkgb2Ygc3RhcnQvbGVuZ3RoK2xldmVsIHBhaXJzLAorICAgIC8vIGluIHZpc3VhbCBvcmRlciBmcm9tIHRoZSBsZWFkaW5nIG1hcmdpbi4KKyAgICBwcml2YXRlIHN0YXRpYyBEaXJlY3Rpb25zW10gZXhwZWN0ZWQgPSB7CisgICAgICAgIERJUlNfQUxMX0xFRlRfVE9fUklHSFQsCisgICAgICAgIERJUlNfQUxMX0xFRlRfVE9fUklHSFQsCisgICAgICAgIERJUlNfQUxMX0xFRlRfVE9fUklHSFQsCisgICAgICAgIERJUlNfQUxMX0xFRlRfVE9fUklHSFQsCisgICAgICAgIGRpcnMoMCwgMSwgMSwgTFZMMV8xKSwKKyAgICAgICAgRElSU19BTExfTEVGVF9UT19SSUdIVCwKKyAgICAgICAgZGlycygwLCAyLCAyLCBMVkwxXzEpLAorICAgICAgICBkaXJzKDAsIDEsIDIsIExWTDJfMSwgMSwgTFZMMV8xKSwKKyAgICAgICAgZGlycygwLCAxLCAxLCBMVkwxXzEsIDIsIDEpLAorICAgICAgICBkaXJzKDAsIDEsIDMsIExWTDFfMSwgMiwgTFZMMl8xLCAxLCBMVkwxXzEpLAorICAgICAgICBkaXJzKDAsIDEsIDQsIExWTDJfMSwgMywgTFZMMV8xLCAyLCBMVkwyXzEsIDEsIExWTDFfMSksCisKKyAgICAgICAgLy8gcnRsCisgICAgICAgIERJUlNfQUxMX1JJR0hUX1RPX0xFRlQsCisgICAgICAgIGRpcnMoMCwgTFZMMV8xLCAxLCBMVkwyXzEpLAorICAgICAgICBkaXJzKDAsIExWTDFfMSwgMSwgTFZMMl8xKSwKKyAgICAgICAgZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMSwgMiwgTFZMMV8xKSwKKyAgICAgICAgZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMiksCisgICAgICAgIGRpcnMoMCwgTFZMMV8xLCAxLCBMVkwyXzIpLAorICAgICAgICBkaXJzKDAsIExWTDFfMSwgMSwgTFZMMl8xLCAyLCBMVkwxXzEpLAorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHNldWRvQmlkaVRvUmVhbChTdHJpbmcgc3JjKSB7CisgICAgICAgIGNoYXJbXSBjaGFycyA9IHNyYy50b0NoYXJBcnJheSgpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoYXJzLmxlbmd0aDsgKytqKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBjaGFyc1tqXTsKKyAgICAgICAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdEJykgeworICAgICAgICAgICAgICAgIGNoYXJzW2pdID0gKGNoYXIpKEFMRUYgKyBjIC0gJ0EnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGNoYXJzLCAwLCBjaGFycy5sZW5ndGgpOworICAgIH0KKworICAgIC8vIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlyZWN0aW9ucygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigiXG4iKTsKKyAgICAgICAgRm9ybWF0dGVyIGYgPSBuZXcgRm9ybWF0dGVyKGJ1Zik7CisKKyAgICAgICAgTGF5b3V0QnVpbGRlciBiID0gU3RhdGljTGF5b3V0VGVzdC5idWlsZGVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGV4dHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGIuc2V0VGV4dChwc2V1ZG9CaWRpVG9SZWFsKHRleHRzW2ldKSk7CisgICAgICAgICAgICBjaGVja0RpcmVjdGlvbnMoYi5idWlsZCgpLCBpLCBiLnRleHQsIGV4cGVjdGVkLCBmKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmLmxlbmd0aCgpID4gMSkgeworICAgICAgICAgICAgZmFpbChidWYudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYWlsaW5nV2hpdGVzcGFjZSgpIHsKKyAgICAgICAgTGF5b3V0QnVpbGRlciBiID0gU3RhdGljTGF5b3V0VGVzdC5idWlsZGVyKCk7CisgICAgICAgIGIuc2V0VGV4dChwc2V1ZG9CaWRpVG9SZWFsKCJBYiAgIGMiKSk7CisgICAgICAgIGZsb2F0IHdpZHRoID0gYi5wYWludC5tZWFzdXJlVGV4dChiLnRleHQsIDAsIDUpOyAgLy8gZXhjbHVkZSAnYycKKyAgICAgICAgYi5zZXRXaWR0aChNYXRoLnJvdW5kKHdpZHRoKSk7CisgICAgICAgIExheW91dCBsID0gYi5idWlsZCgpOworICAgICAgICBpZiAobC5nZXRMaW5lQ291bnQoKSAhPSAyKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZXhwZWN0ZWQgMiBsaW5lcywgZ290OiAiICsgbC5nZXRMaW5lQ291bnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgRGlyZWN0aW9ucyByZXN1bHQgPSBsLmdldExpbmVEaXJlY3Rpb25zKDApOworICAgICAgICBEaXJlY3Rpb25zIGV4cGVjdGVkID0gZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMSwgMiwgMyB8ICgxIDw8IExheW91dC5SVU5fTEVWRUxfU0hJRlQpKTsKKyAgICAgICAgZXhwZWN0RGlyZWN0aW9ucygic3BsaXQgbGluZSIsIGV4cGVjdGVkLCByZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXh0VG9SaWdodE9mKCkgeworICAgICAgICBMYXlvdXRCdWlsZGVyIGIgPSBTdGF0aWNMYXlvdXRUZXN0LmJ1aWxkZXIoKTsKKyAgICAgICAgYi5zZXRUZXh0KHBzZXVkb0JpZGlUb1JlYWwoImFBMUIyIikpOworICAgICAgICAvLyB2aXN1YWwgYTJCMUEgcG9zaXRpb25zIDA0MzIxCisgICAgICAgIC8vIDA6IHxhMkIxQSwgc3Ryb25nIGlzIHNvbCwgYWZ0ZXIgLT4gMAorICAgICAgICAvLyAxOiBhfDJCMUEsIHN0cm9uZyBpcyBhLCBhZnRlciAtPiwgMQorICAgICAgICAvLyAyOiBhMnxCMUEsIHN0cm9uZyBpcyBCLCBhZnRlciAtPiA0CisgICAgICAgIC8vIDM6IGEyQnwxQSwgc3Ryb25nIGlzIEIsIGJlZm9yZSAtPiAzCisgICAgICAgIC8vIDQ6IGEyQjF8QSwgc3Ryb25nIGlzIEEsIGFmdGVyIC0+IDIKKyAgICAgICAgLy8gNTogYTJCMUF8LCBzdHJvbmcgaXMgZW9sLCBiZWZvcmUgLT4gNQorICAgICAgICBpbnRbXSBleHBlY3RlZCA9IHsgMCwgMSwgNCwgMywgMiwgNSB9OworICAgICAgICBMYXlvdXQgbCA9IGIuYnVpbGQoKTsKKyAgICAgICAgaW50IG4gPSAwOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpbnQgdCA9IGwuZ2V0T2Zmc2V0VG9SaWdodE9mKG4pOworICAgICAgICAgICAgaWYgKHQgIT0gZXhwZWN0ZWRbaV0pIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJvZmZzZXRbIiArIGkgKyAiXSB0byByaWdodCBvZjogIiArIG4gKyAiIGV4cGVjdGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkW2ldICsgIiBnb3Q6ICIgKyB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG4gPSB0OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5leHRUb0xlZnRPZigpIHsKKyAgICAgICAgTGF5b3V0QnVpbGRlciBiID0gU3RhdGljTGF5b3V0VGVzdC5idWlsZGVyKCk7CisgICAgICAgIGIuc2V0VGV4dChwc2V1ZG9CaWRpVG9SZWFsKCJhQTFCMiIpKTsKKyAgICAgICAgaW50W10gZXhwZWN0ZWQgPSB7IDAsIDEsIDQsIDMsIDIsIDUgfTsKKyAgICAgICAgTGF5b3V0IGwgPSBiLmJ1aWxkKCk7CisgICAgICAgIGludCBuID0gNTsKKyAgICAgICAgZm9yIChpbnQgaSA9IGV4cGVjdGVkLmxlbmd0aCAtIDE7IC0taSA+PSAwOykgeworICAgICAgICAgICAgaW50IHQgPSBsLmdldE9mZnNldFRvTGVmdE9mKG4pOworICAgICAgICAgICAgaWYgKHQgIT0gZXhwZWN0ZWRbaV0pIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJvZmZzZXRbIiArIGkgKyAiXSB0byBsZWZ0IG9mOiAiICsgbiArICIgZXhwZWN0ZWQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRbaV0gKyAiIGdvdDogIiArIHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbiA9IHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1dGlsaXR5LCBub3QgcmVhbGx5IGEgdGVzdAorICAgIC8qCisgICAgcHVibGljIHZvaWQgdGVzdE1lYXN1cmVUZXh0MSgpIHsKKyAgICAgICAgTGF5b3V0QnVpbGRlciBiID0gU3RhdGljTGF5b3V0VGVzdC5idWlsZGVyKCk7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gIkFCQyI7IC8vICJhYkFCIgorICAgICAgICBiLnNldFRleHQocHNldWRvQmlkaVRvUmVhbCh0ZXh0KSk7CisgICAgICAgIExheW91dCBsID0gYi5idWlsZCgpOworICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMgPSBsLmdldExpbmVEaXJlY3Rpb25zKDApOworCisgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7CisKKyAgICAgICAgaW50IGRpciA9IC0xOyAvLyBMRUZUX1RPX1JJR0hUCisgICAgICAgIGJvb2xlYW4gdHJhaWxpbmcgPSB0cnVlOworICAgICAgICBib29sZWFuIGFsdCA9IHRydWU7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGRpciA9IC1kaXI7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgdHJhaWxpbmcgPSAhdHJhaWxpbmc7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgb2Zmc2V0ID0gMCwgZW5kID0gYi50ZXh0Lmxlbmd0aCgpOyBvZmZzZXQgPD0gZW5kOyArK29mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWR0aCA9IExheW91dC5tZWFzdXJlVGV4dChiLnBhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtQYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgb2Zmc2V0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyLCBkaXJlY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoIkJJREkiLCAiZGlyOiAiICsgZGlyICsgIiB0cmFpbDogIiArIHRyYWlsaW5nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG9mZnNldDogIiArIG9mZnNldCArICIgd2lkdGg6ICIgKyB3aWR0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoIXRyYWlsaW5nKTsKKyAgICAgICAgfSB3aGlsZSAoZGlyID4gMCk7CisgICAgfQorICAgICovCisKKyAgICAvLyB1dGlsaXR5IGZvciBkaXNwbGF5aW5nIGFycmF5cyBpbiBoZXgKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgaGV4QXJyYXkoaW50W10gYXJyYXkpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHNiLmFwcGVuZCgneycpOworICAgICAgICBmb3IgKGludCBpIDogYXJyYXkpIHsKKyAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhpKSk7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCd9Jyk7CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0RpcmVjdGlvbnMoTGF5b3V0IGwsIGludCBpLCBTdHJpbmcgdGV4dCwKKyAgICAgICAgICAgIERpcmVjdGlvbnNbXSBleHBlY3RlZERpcnMsIEZvcm1hdHRlciBmKSB7CisgICAgICAgIERpcmVjdGlvbnMgZXhwZWN0ZWQgPSBleHBlY3RlZERpcnNbaV07CisgICAgICAgIERpcmVjdGlvbnMgcmVzdWx0ID0gbC5nZXRMaW5lRGlyZWN0aW9ucygwKTsKKyAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKGV4cGVjdGVkLm1EaXJlY3Rpb25zLCByZXN1bHQubURpcmVjdGlvbnMpKSB7CisgICAgICAgICAgICBmLmZvcm1hdCgiJW5bJTJkXSAnJXMnLCAlcyAhPSAlcyIsIGksIHRleHQsCisgICAgICAgICAgICAgICAgICAgIGhleEFycmF5KGV4cGVjdGVkLm1EaXJlY3Rpb25zKSwKKyAgICAgICAgICAgICAgICAgICAgaGV4QXJyYXkocmVzdWx0Lm1EaXJlY3Rpb25zKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhwZWN0RGlyZWN0aW9ucyhTdHJpbmcgbXNnLCBEaXJlY3Rpb25zIGV4cGVjdGVkLCBEaXJlY3Rpb25zIHJlc3VsdCkgeworICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMoZXhwZWN0ZWQubURpcmVjdGlvbnMsIHJlc3VsdC5tRGlyZWN0aW9ucykpIHsKKyAgICAgICAgICAgIGZhaWwoImV4cGVjdGVkOiAiICsgaGV4QXJyYXkoZXhwZWN0ZWQubURpcmVjdGlvbnMpICsKKyAgICAgICAgICAgICAgICAgICAgIiBnb3Q6ICIgKyBoZXhBcnJheShyZXN1bHQubURpcmVjdGlvbnMpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0VGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRUZXN0LmphdmEKaW5kZXggMWY1OGEyYy4uZDU1NGE1MCAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRUZXN0LmphdmEKQEAgLTIyOCwxMSArMjI4LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBMYXlvdXRCdWlsZGVyIGJ1aWxkZXIoKSB7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgTGF5b3V0QnVpbGRlciBidWlsZGVyKCkgewogICAgICAgICByZXR1cm4gbmV3IExheW91dEJ1aWxkZXIoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMYXlvdXRCdWlsZGVyIHsKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjbGFzcyBMYXlvdXRCdWlsZGVyIHsKICAgICAgICAgU3RyaW5nIHRleHQgPSAiVGhpcyBpcyBhIHRlc3QiOwogICAgICAgICBUZXh0UGFpbnQgcGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7IC8vIGRlZmF1bHQKICAgICAgICAgaW50IHdpZHRoID0gMTAwOwpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9FeHBhbmRhYmxlTGlzdFNjZW5hcmlvLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0V4cGFuZGFibGVMaXN0U2NlbmFyaW8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGExMmIwZC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0V4cGFuZGFibGVMaXN0U2NlbmFyaW8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci0KLS8qKgotICogVXRpbGl0eSBiYXNlIGNsYXNzIGZvciBjcmVhdGluZyB2YXJpb3VzIEV4cGFuZGFibGUgTGlzdCBzY2VuYXJpb3MuCi0gKiA8cD4KLSAqIFdBUk5JTkc6IEEgbG90IG9mIHRoZSBmZWF0dXJlcyBhcmUgbWl4ZWQgYmV0d2VlbiBMaXN0VmlldydzIGV4cGVjdGVkIHBvc2l0aW9uCi0gKiAoZmxhdCBsaXN0IHBvc2l0aW9uKSBhbmQgYW4gRXhwYW5kYWJsZUxpc3RWaWV3J3MgZXhwZWN0ZWQgcG9zaXRpb24uICBZb3UgbXVzdCBhZGQvY2hhbmdlCi0gKiBmZWF0dXJlcyBhcyB5b3UgbmVlZCB0aGVtLgotICogCi0gKiBAc2VlIExpc3RTY2VuYXJpbwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhwYW5kYWJsZUxpc3RTY2VuYXJpbyBleHRlbmRzIExpc3RTY2VuYXJpbyB7Ci0gICAgcHJvdGVjdGVkIEV4cGFuZGFibGVMaXN0QWRhcHRlciBtQWRhcHRlcjsgCi0gICAgcHJvdGVjdGVkIExpc3Q8TXlHcm91cD4gbUdyb3VwczsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgTGlzdFZpZXcgY3JlYXRlTGlzdFZpZXcoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRXhwYW5kYWJsZUxpc3RWaWV3KHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBQYXJhbXMgY3JlYXRlUGFyYW1zKCkgewotICAgICAgICByZXR1cm4gbmV3IEV4cGFuZGFibGVQYXJhbXMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRBZGFwdGVyKExpc3RWaWV3IGxpc3RWaWV3KSB7Ci0gICAgICAgICgoRXhwYW5kYWJsZUxpc3RWaWV3KSBsaXN0Vmlldykuc2V0QWRhcHRlcihtQWRhcHRlciA9IGNyZWF0ZUFkYXB0ZXIoKSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgY3JlYXRlQWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNeUFkYXB0ZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVhZEFuZFZhbGlkYXRlUGFyYW1zKFBhcmFtcyBwYXJhbXMpIHsKLSAgICAgICAgRXhwYW5kYWJsZVBhcmFtcyBleHBhbmRhYmxlUGFyYW1zID0gKEV4cGFuZGFibGVQYXJhbXMpIHBhcmFtczsKLSAgICAgICAgCi0gICAgICAgIGludFtdIG51bUNoaWxkcmVuID0gZXhwYW5kYWJsZVBhcmFtcy5tTnVtQ2hpbGRyZW47Ci0gICAgICAgIAotICAgICAgICBtR3JvdXBzID0gbmV3IEFycmF5TGlzdDxNeUdyb3VwPihudW1DaGlsZHJlbi5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBtR3JvdXBzLmFkZChuZXcgTXlHcm91cChudW1DaGlsZHJlbltpXSkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBleHBhbmRhYmxlUGFyYW1zLnN1cGVyU2V0TnVtSXRlbXMoKTsKLSAgICAgICAgCi0gICAgICAgIHN1cGVyLnJlYWRBbmRWYWxpZGF0ZVBhcmFtcyhwYXJhbXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgRXhwYW5kYWJsZUxpc3RWaWV3IHdpZGdldC4KLSAgICAgKiBAcmV0dXJuIFRoZSBtYWluIHdpZGdldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RWaWV3IGdldEV4cGFuZGFibGVMaXN0VmlldygpIHsKLSAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlTGlzdFZpZXcpIHN1cGVyLmdldExpc3RWaWV3KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeHBhbmRhYmxlUGFyYW1zIGV4dGVuZHMgUGFyYW1zIHsKLSAgICAgICAgcHJpdmF0ZSBpbnRbXSBtTnVtQ2hpbGRyZW47Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHBlciBncm91cC4KLSAgICAgICAgICogIAotICAgICAgICAgKiBAcGFyYW0gbnVtQ2hpbGRyZW5QZXJHcm91cCBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuIHBlciBncm91cC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldE51bUNoaWxkcmVuKGludFtdIG51bUNoaWxkcmVuKSB7Ci0gICAgICAgICAgICBtTnVtQ2hpbGRyZW4gPSBudW1DaGlsZHJlbjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIG51bWJlciBvZiBpdGVtcyBvbiB0aGUgc3VwZXJjbGFzcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mCi0gICAgICAgICAqIGdyb3VwcyBhbmQgY2hpbGRyZW4gcGVyIGdyb3VwLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBFeHBhbmRhYmxlUGFyYW1zIHN1cGVyU2V0TnVtSXRlbXMoKSB7Ci0gICAgICAgICAgICBpbnQgbnVtSXRlbXMgPSAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobU51bUNoaWxkcmVuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gbU51bUNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIG51bUl0ZW1zICs9IG1OdW1DaGlsZHJlbltpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN1cGVyLnNldE51bUl0ZW1zKG51bUl0ZW1zKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgUGFyYW1zIHNldE51bUl0ZW1zKGludCBudW1JdGVtcykgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVXNlIHNldE51bUdyb3VwcyBhbmQgc2V0TnVtQ2hpbGRyZW4gaW5zdGVhZC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRGYWRpbmdFZGdlU2NyZWVuU2l6ZUZhY3Rvcihkb3VibGUgZmFkaW5nRWRnZVNjcmVlblNpemVGYWN0b3IpIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0RmFkaW5nRWRnZVNjcmVlblNpemVGYWN0b3IoZmFkaW5nRWRnZVNjcmVlblNpemVGYWN0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldEl0ZW1TY3JlZW5TaXplRmFjdG9yKGRvdWJsZSBpdGVtU2NyZWVuU2l6ZUZhY3RvcikgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRJdGVtU2NyZWVuU2l6ZUZhY3RvcihpdGVtU2NyZWVuU2l6ZUZhY3Rvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0SXRlbXNGb2N1c2FibGUoYm9vbGVhbiBpdGVtc0ZvY3VzYWJsZSkgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRJdGVtc0ZvY3VzYWJsZShpdGVtc0ZvY3VzYWJsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0TXVzdEZpbGxTY3JlZW4oYm9vbGVhbiBmaWxsU2NyZWVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldE11c3RGaWxsU2NyZWVuKGZpbGxTY3JlZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldFBvc2l0aW9uU2NyZWVuU2l6ZUZhY3Rvck92ZXJyaWRlKGludCBwb3NpdGlvbiwgZG91YmxlIGl0ZW1TY3JlZW5TaXplRmFjdG9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldFBvc2l0aW9uU2NyZWVuU2l6ZUZhY3Rvck92ZXJyaWRlKHBvc2l0aW9uLCBpdGVtU2NyZWVuU2l6ZUZhY3Rvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0UG9zaXRpb25VbnNlbGVjdGFibGUoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldFBvc2l0aW9uVW5zZWxlY3RhYmxlKHBvc2l0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRTdGFja0Zyb21Cb3R0b20oYm9vbGVhbiBzdGFja0Zyb21Cb3R0b20pIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0U3RhY2tGcm9tQm90dG9tKHN0YWNrRnJvbUJvdHRvbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0U3RhcnRpbmdTZWxlY3Rpb25Qb3NpdGlvbihpbnQgc3RhcnRpbmdTZWxlY3Rpb25Qb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRTdGFydGluZ1NlbGVjdGlvblBvc2l0aW9uKHN0YXJ0aW5nU2VsZWN0aW9uUG9zaXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldENvbm5lY3RBZGFwdGVyKGJvb2xlYW4gY29ubmVjdEFkYXB0ZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0Q29ubmVjdEFkYXB0ZXIoY29ubmVjdEFkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHN0cmluZyBmb3IgdGhlIHZhbHVlIG9mIHNvbWUgaXRlbS4KLSAgICAgKiBAcGFyYW0gcGFja2VkUG9zaXRpb24gVGhlIHBvc2l0aW9uIG9mIHRoZSBpdGVtLgotICAgICAqIEByZXR1cm4gVGhlIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFZhbHVlQXRQb3NpdGlvbihsb25nIHBhY2tlZFBvc2l0aW9uKSB7Ci0gICAgICAgIGZpbmFsIGludCB0eXBlID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uVHlwZShwYWNrZWRQb3NpdGlvbik7Ci0gICAgICAgIAotICAgICAgICBpZiAodHlwZSA9PSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfQ0hJTEQpIHsKLSAgICAgICAgICAgIHJldHVybiBtR3JvdXBzLmdldChFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Hcm91cChwYWNrZWRQb3NpdGlvbikpCi0gICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbi5nZXQoRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uQ2hpbGQocGFja2VkUG9zaXRpb24pKQotICAgICAgICAgICAgICAgICAgICAubmFtZTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9HUk9VUCkgewotICAgICAgICAgICAgcmV0dXJuIG1Hcm91cHMuZ2V0KEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkdyb3VwKHBhY2tlZFBvc2l0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgLm5hbWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwYWNrZWRQb3NpdGlvbiBpcyBub3QgYSB2YWxpZCBwb3NpdGlvbi4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgYSBwYXJ0aWN1bGFyIHBvc2l0aW9uIGlzIG91dCBvZiBib3VuZHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhY2tlZFBvc2l0aW9uIFRoZSBwYWNrZWQgcG9zaXRpb24uCi0gICAgICogQHJldHVybiBXaGV0aGVyIGl0J3Mgb3V0IG9mIGJvdW5kcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNPdXRPZkJvdW5kcyhsb25nIHBhY2tlZFBvc2l0aW9uKSB7Ci0gICAgICAgIGZpbmFsIGludCB0eXBlID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uVHlwZShwYWNrZWRQb3NpdGlvbik7Ci0gICAgICAgIAotICAgICAgICBpZiAodHlwZSA9PSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfTlVMTCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicGFja2VkUG9zaXRpb24gaXMgbm90IGEgdmFsaWQgcG9zaXRpb24uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBpbnQgZ3JvdXAgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Hcm91cChwYWNrZWRQb3NpdGlvbik7IAotICAgICAgICBpZiAoZ3JvdXAgPj0gbUdyb3Vwcy5zaXplKCkgfHwgZ3JvdXAgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHR5cGUgPT0gRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9UWVBFX0NISUxEKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGQgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25DaGlsZChwYWNrZWRQb3NpdGlvbik7IAotICAgICAgICAgICAgaWYgKGNoaWxkID49IG1Hcm91cHMuZ2V0KGdyb3VwKS5jaGlsZHJlbi5zaXplKCkgfHwgY2hpbGQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHZpZXcgZm9yIHRoZSBwYWNrZWQgcG9zaXRpb24sIHBvc3NpYmx5IHJldXNpbmcgdGhlIGNvbnZlcnRWaWV3LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYWNrZWRQb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gZ2V0IGEgdmlldyBmb3IuCi0gICAgICogQHBhcmFtIGNvbnZlcnRWaWV3IE9wdGlvbmFsIHZpZXcgdG8gY29udmVydC4KLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBmdXR1cmUgcGFyZW50LgotICAgICAqIEByZXR1cm4gQSB2aWV3LgotICAgICAqLwotICAgIHByaXZhdGUgVmlldyBnZXRWaWV3KGxvbmcgcGFja2VkUG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgaWYgKGlzT3V0T2ZCb3VuZHMocGFja2VkUG9zaXRpb24pKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwb3NpdGlvbiBvdXQgb2YgcmFuZ2UgZm9yIGFkYXB0ZXIhIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIEV4cGFuZGFibGVMaXN0VmlldyBlbHYgPSBnZXRFeHBhbmRhYmxlTGlzdFZpZXcoKTsKLSAgICAgICAgZmluYWwgaW50IGZsUG9zID0gZWx2LmdldEZsYXRMaXN0UG9zaXRpb24ocGFja2VkUG9zaXRpb24pOyAKLSAgICAgICAgCi0gICAgICAgIGlmIChjb252ZXJ0VmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAoKFRleHRWaWV3KSBjb252ZXJ0Vmlldykuc2V0VGV4dChnZXRWYWx1ZUF0UG9zaXRpb24ocGFja2VkUG9zaXRpb24pKTsKLSAgICAgICAgICAgIGNvbnZlcnRWaWV3LnNldElkKGZsUG9zKTsKLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VmlldzsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBkZXNpcmVkSGVpZ2h0ID0gZ2V0SGVpZ2h0Rm9yUG9zaXRpb24oZmxQb3MpOwotICAgICAgICByZXR1cm4gY3JlYXRlVmlldyhwYWNrZWRQb3NpdGlvbiwgZmxQb3MsIHBhcmVudCwgZGVzaXJlZEhlaWdodCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHZpZXcgZm9yIGEgZ3JvdXAgb3IgY2hpbGQgcG9zaXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhY2tlZFBvc2l0aW9uIFRoZSBwYWNrZWQgcG9zaXRpb24gKGhhcyB0eXBlLCBncm91cCBwb3MsIGFuZCBvcHRpb25hbGx5IGNoaWxkIHBvcykuCi0gICAgICogQHBhcmFtIGZsUG9zIFRoZSBmbGF0IGxpc3QgcG9zaXRpb24gKHRoZSBwb3NpdGlvbiB0aGF0IHRoZSBMaXN0VmlldyBnb2VzIGJ5KS4KLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgdmlldy4KLSAgICAgKiBAcGFyYW0gZGVzaXJlZEhlaWdodCBUaGUgZGVzaXJlZCBoZWlnaHQuCi0gICAgICogQHJldHVybiBBIHZpZXcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFZpZXcgY3JlYXRlVmlldyhsb25nIHBhY2tlZFBvc2l0aW9uLCBpbnQgZmxQb3MsIFZpZXdHcm91cCBwYXJlbnQsIGludCBkZXNpcmVkSGVpZ2h0KSB7Ci0gICAgICAgIFRleHRWaWV3IHJlc3VsdCA9IG5ldyBUZXh0VmlldyhwYXJlbnQuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgcmVzdWx0LnNldEhlaWdodChkZXNpcmVkSGVpZ2h0KTsKLSAgICAgICAgcmVzdWx0LnNldFRleHQoZ2V0VmFsdWVBdFBvc2l0aW9uKHBhY2tlZFBvc2l0aW9uKSk7Ci0gICAgICAgIGZpbmFsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgQWJzTGlzdFZpZXcuTGF5b3V0UGFyYW1zKAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKLSAgICAgICAgcmVzdWx0LnNldExheW91dFBhcmFtcyhscCk7Ci0gICAgICAgIHJlc3VsdC5zZXRHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMKTsKLSAgICAgICAgcmVzdWx0LnNldFBhZGRpbmcoMzYsIDAsIDAsIDApOwotICAgICAgICByZXN1bHQuc2V0SWQoZmxQb3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZ3JvdXAgaW5kZXggY29udGFpbmluZyBlaXRoZXIgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvciBhdAotICAgICAqIGxlYXN0IG9uZSBjaGlsZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbnVtQ2hpbGRyZW4gVGhlIGdyb3VwIG11c3QgaGF2ZSB0aGlzIGFtb3VudCwgb3IgLTEgaWYgdXNpbmcKLSAgICAgKiAgICAgICAgICAgIGF0TGVhc3RPbmVDaGlsZC4KLSAgICAgKiBAcGFyYW0gYXRMZWFzdE9uZUNoaWxkIFRoZSBncm91cCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGNoaWxkLCBvciBmYWxzZQotICAgICAqICAgICAgICAgICAgaWYgdXNpbmcgbnVtQ2hpbGRyZW4uCi0gICAgICogQHJldHVybiBBIGdyb3VwIGluZGV4IHdpdGggdGhlIHJlcXVpcmVtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGZpbmRHcm91cFdpdGhOdW1DaGlsZHJlbihpbnQgbnVtQ2hpbGRyZW4sIGJvb2xlYW4gYXRMZWFzdE9uZUNoaWxkKSB7Ci0gICAgICAgIGZpbmFsIEV4cGFuZGFibGVMaXN0QWRhcHRlciBhZGFwdGVyID0gbUFkYXB0ZXI7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gYWRhcHRlci5nZXRHcm91cENvdW50KCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgZmluYWwgaW50IGN1ck51bUNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbkNvdW50KGkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobnVtQ2hpbGRyZW4gPT0gY3VyTnVtQ2hpbGRyZW4gfHwgYXRMZWFzdE9uZUNoaWxkICYmIGN1ck51bUNoaWxkcmVuID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBMaXN0PE15R3JvdXA+IGdldEdyb3VwcygpIHsKLSAgICAgICAgcmV0dXJuIG1Hcm91cHM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgZ2V0QWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1BZGFwdGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbXBsZSBleHBhbmRhYmxlIGxpc3QgYWRhcHRlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgY2xhc3MgTXlBZGFwdGVyIGV4dGVuZHMgQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlciB7Ci0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q2hpbGQoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWVBdFBvc2l0aW9uKEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkZvckNoaWxkKGdyb3VwUG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkUG9zaXRpb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIGdldENoaWxkSWQoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3Vwcy5nZXQoZ3JvdXBQb3NpdGlvbikuY2hpbGRyZW4uZ2V0KGNoaWxkUG9zaXRpb24pLmlkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRDaGlsZHJlbkNvdW50KGludCBncm91cFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3Vwcy5nZXQoZ3JvdXBQb3NpdGlvbikuY2hpbGRyZW4uc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFZpZXcgZ2V0Q2hpbGRWaWV3KGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbiwgYm9vbGVhbiBpc0xhc3RDaGlsZCwKLSAgICAgICAgICAgICAgICBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VmlldyhFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JDaGlsZChncm91cFBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICBjaGlsZFBvc2l0aW9uKSwgY29udmVydFZpZXcsIHBhcmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEdyb3VwKGludCBncm91cFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWVBdFBvc2l0aW9uKEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkZvckdyb3VwKGdyb3VwUG9zaXRpb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0R3JvdXBDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtR3JvdXBzLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIGdldEdyb3VwSWQoaW50IGdyb3VwUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBtR3JvdXBzLmdldChncm91cFBvc2l0aW9uKS5pZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldEdyb3VwVmlldyhpbnQgZ3JvdXBQb3NpdGlvbiwgYm9vbGVhbiBpc0V4cGFuZGVkLCBWaWV3IGNvbnZlcnRWaWV3LAotICAgICAgICAgICAgICAgIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRWaWV3KEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkZvckdyb3VwKGdyb3VwUG9zaXRpb24pLAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VmlldywgcGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2hpbGRTZWxlY3RhYmxlKGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdGFibGVJZHMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15R3JvdXAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBsb25nIG1OZXh0SWQgPSAxMDAwOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5hbWU7Ci0gICAgICAgIGxvbmcgaWQgPSBtTmV4dElkKys7Ci0gICAgICAgIExpc3Q8TXlDaGlsZD4gY2hpbGRyZW47Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgTXlHcm91cChpbnQgbnVtQ2hpbGRyZW4pIHsKLSAgICAgICAgICAgIG5hbWUgPSAiR3JvdXAgIiArIGlkOwotICAgICAgICAgICAgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE15Q2hpbGQ+KG51bUNoaWxkcmVuKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2hpbGRyZW47IGkrKykgewotICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFkZChuZXcgTXlDaGlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15Q2hpbGQgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBsb25nIG1OZXh0SWQgPSAyMDAwOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5hbWU7Ci0gICAgICAgIGxvbmcgaWQgPSBtTmV4dElkKys7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgTXlDaGlsZCgpIHsKLSAgICAgICAgICAgIG5hbWUgPSAiQ2hpbGQgIiArIGlkOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXQoUGFyYW1zIHBhcmFtcykgewotICAgICAgICBpbml0KChFeHBhbmRhYmxlUGFyYW1zKSBwYXJhbXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgTGlzdFNjZW5hcmlvI2luaXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0KEV4cGFuZGFibGVQYXJhbXMgcGFyYW1zKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvSnNvblJlYWRlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvSnNvblJlYWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWQ5MzEwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9Kc29uUmVhZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnV0aWw7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworCitwdWJsaWMgZmluYWwgY2xhc3MgSnNvblJlYWRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbdHJ1ZSwgdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRFbXB0eUFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVhZGVyLmhhc05leHQoKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoCisgICAgICAgICAgICAgICAgIntcImFcIjogXCJhbmRyb2lkXCIsIFwiYlwiOiBcImJhbmFuYVwifSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbmRyb2lkIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYW5hbmEiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRFbXB0eU9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie30iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRGYWxzZShyZWFkZXIuaGFzTmV4dCgpKTsKKyAgICAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNraXBPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoCisgICAgICAgICAgICAgICAgIntcImFcIjogeyBcImNcIjogW10sIFwiZFwiOiBbdHJ1ZSwgdHJ1ZSwge31dIH0sIFwiYlwiOiBcImJhbmFuYVwifSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgcmVhZGVyLnNraXBWYWx1ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIHJlYWRlci5za2lwVmFsdWUoKTsKKyAgICAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcganNvbiA9ICJ7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgXCJoZWxsb1wiOiB0cnVlLFxuIiArCisgICAgICAgICAgICAgICAgIiAgIFwiZm9vXCI6IFtcIndvcmxkXCJdXG4iICsKKyAgICAgICAgICAgICAgICAifSI7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihqc29uKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3b3JsZCIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE51bGxzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEpzb25SZWFkZXIobnVsbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiIikpLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiIikpLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Ub3BMZXZlbE9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ0cnVlIikpLm5leHRCb29sZWFuKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhcmFjdGVyVW5lc2NhcGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqc29uID0gIltcImFcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJhXFxcIlwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcXCJcIiwiCisgICAgICAgICAgICAgICAgKyAiXCI6XCIsIgorICAgICAgICAgICAgICAgICsgIlwiLFwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcYlwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcZlwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcblwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcclwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcdFwiLCIKKyAgICAgICAgICAgICAgICArICJcIiBcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXFxcXCIsIgorICAgICAgICAgICAgICAgICsgIlwie1wiLCIKKyAgICAgICAgICAgICAgICArICJcIn1cIiwiCisgICAgICAgICAgICAgICAgKyAiXCJbXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXVwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcdTAwMDBcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXHUwMDE5XCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFx1MjBBQ1wiIgorICAgICAgICAgICAgICAgICsgIl0iOworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoanNvbikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhXCIiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcIiIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjoiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIsIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXGIiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcZiIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXHIiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcdCIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiAiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcXCIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInsiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ9IiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIl0iLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcMCIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlx1MDAxOSIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlx1MjBBQyIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlZ2Vyc1dpdGhGcmFjdGlvbmFsUGFydFNwZWNpZmllZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWzEuMCwxLjAsMS4wXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCByZWFkZXIubmV4dEludCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDFMLCByZWFkZXIubmV4dExvbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcganNvbiA9ICJbLTAuMCwiCisgICAgICAgICAgICAgICAgKyAiMS4wLCIKKyAgICAgICAgICAgICAgICArICIxLjc5NzY5MzEzNDg2MjMxNTdFMzA4LCIKKyAgICAgICAgICAgICAgICArICI0LjlFLTMyNCwiCisgICAgICAgICAgICAgICAgKyAiMC4wLCIKKyAgICAgICAgICAgICAgICArICItMC41LCIKKyAgICAgICAgICAgICAgICArICIyLjIyNTA3Mzg1ODUwNzIwMTRFLTMwOCwiCisgICAgICAgICAgICAgICAgKyAiMy4xNDE1OTI2NTM1ODk3OTMsIgorICAgICAgICAgICAgICAgICsgIjIuNzE4MjgxODI4NDU5MDQ1XSI7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihqc29uKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygtMC4wLCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLjc5NzY5MzEzNDg2MjMxNTdFMzA4LCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQuOUUtMzI0LCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMC41LCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIuMjI1MDczODU4NTA3MjAxNEUtMzA4LCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjUzNTg5NzkzLCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIuNzE4MjgxODI4NDU5MDQ1LCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRmluaXRlRG91YmxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqc29uID0gIltOYU5dIjsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGpzb24pKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0RG91YmxlKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGpzb24gPSAiWzAsMCwwLCIKKyAgICAgICAgICAgICAgICArICIxLDEsMSwiCisgICAgICAgICAgICAgICAgKyAiLTEsLTEsLTEsIgorICAgICAgICAgICAgICAgICsgIi05MjIzMzcyMDM2ODU0Nzc1ODA4LCIKKyAgICAgICAgICAgICAgICArICI5MjIzMzcyMDM2ODU0Nzc1ODA3XSI7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihqc29uKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygwTCwgcmVhZGVyLm5leHRMb25nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVhZGVyLm5leHRJbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLjAsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMUwsIHJlYWRlci5uZXh0TG9uZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlYWRlci5uZXh0SW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wLCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xTCwgcmVhZGVyLm5leHRMb25nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHJlYWRlci5uZXh0SW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEuMCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dEludCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoTG9uZy5NSU5fVkFMVUUsIHJlYWRlci5uZXh0TG9uZygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0SW50KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLk1BWF9WQUxVRSwgcmVhZGVyLm5leHRMb25nKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCBmYWlscyBiZWNhdXNlIHRoZXJlJ3Mgbm8gZG91YmxlIGZvciA5MjIzMzcyMDM2ODU0Nzc1ODA2LCBhbmQKKyAgICAgKiBvdXIgbG9uZyBwYXJzaW5nIHVzZXMgRG91YmxlLnBhcnNlRG91YmxlKCkgZm9yIGZyYWN0aW9uYWwgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RIaWdoUHJlY2lzaW9uTG9uZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqc29uID0gIls5MjIzMzcyMDM2ODU0Nzc1ODA2LjAwMF0iOworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoanNvbikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwNkwsIHJlYWRlci5uZXh0TG9uZygpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE51bWJlcldpdGhPY3RhbFByZWZpeCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqc29uID0gIlswMV0iOworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoanNvbikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRJbnQoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TG9uZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHREb3VibGUoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMSIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCb29sZWFucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWUsZmFsc2VdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWl4ZWRDYXNlTGl0ZXJhbHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIltUcnVlLFRydUUsRmFsc2UsRkFMU0UsTlVMTCxudWxMXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiOn0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dFN0cmluZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByZW1hdHVyZUVuZE9mSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIjp0cnVlLCIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByZW1hdHVyZWx5Q2xvc2VkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiOltdfSIpKTsKKyAgICAgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICByZWFkZXIubmV4dE5hbWUoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI6W119IikpOworICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI6dHJ1ZX0iKSk7CisgICAgICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgcmVhZGVyLnBlZWsoKTsKKyAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgcmVhZGVyLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5leHRGYWlsdXJlc0RvTm90QWR2YW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiOnRydWV9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0U3RyaW5nKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dFN0cmluZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROYW1lKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHJlYWRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nTnVsbElzTm90TnVsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW1wibnVsbFwiXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsTGl0ZXJhbElzTm90QVN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbbnVsbF0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dFN0cmluZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3ROYW1lVmFsdWVTZXBhcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIj10cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiPT50cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnROYW1lVmFsdWVTZXBhcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIj10cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiPT50cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdENvbW1lbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLy8gY29tbWVudCBcbiB0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWyMgY29tbWVudCBcbiB0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWy8qIGNvbW1lbnQgKi8gdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMZW5pZW50Q29tbWVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlsvLyBjb21tZW50IFxuIHRydWVdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbIyBjb21tZW50IFxuIHRydWVdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLyogY29tbWVudCAqLyB0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdFVucXVvdGVkTmFtZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoInthOnRydWV9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRVbnF1b3RlZE5hbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7YTp0cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdFNpbmdsZVF1b3RlZE5hbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7J2EnOnRydWV9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRTaW5nbGVRdW90ZWROYW1lcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigieydhJzp0cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdFVucXVvdGVkU3RyaW5ncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW2FdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRTdHJpbmcoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMZW5pZW50VW5xdW90ZWRTdHJpbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbYV0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaWN0U2luZ2xlUXVvdGVkU3RyaW5ncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWydhJ10iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dFN0cmluZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRTaW5nbGVRdW90ZWRTdHJpbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbJ2EnXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3RTZW1pY29sb25EZWxpbWl0ZWRBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWU7dHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRTZW1pY29sb25EZWxpbWl0ZWRBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWU7dHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3RTZW1pY29sb25EZWxpbWl0ZWROYW1lVmFsdWVQYWlyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI6dHJ1ZTtcImJcIjp0cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgcmVhZGVyLm5leHROYW1lKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVuaWVudFNlbWljb2xvbkRlbGltaXRlZE5hbWVWYWx1ZVBhaXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIjp0cnVlO1wiYlwiOnRydWV9IikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3RVbm5lY2Vzc2FyeUFycmF5U2VwYXJhdG9ycygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWUsLHRydWVdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLHRydWVdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbdHJ1ZSxdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLF0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMZW5pZW50VW5uZWNlc3NhcnlBcnJheVNlcGFyYXRvcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlt0cnVlLCx0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLHRydWVdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworCisgICAgICAgIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlt0cnVlLF0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWyxdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0pzb25Xcml0ZXJUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0pzb25Xcml0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4NDAyMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvSnNvbldyaXRlclRlc3QuamF2YQpAQCAtMCwwICsxLDQxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC51dGlsOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKKworcHVibGljIGZpbmFsIGNsYXNzIEpzb25Xcml0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdFdyb25nVG9wTGV2ZWxUeXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoImEiKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvTmFtZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci5uYW1lKCJhIik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5hbWVXaXRob3V0VmFsdWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsdWVXaXRob3V0TmFtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIudmFsdWUodHJ1ZSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlVG9wTGV2ZWxWYWx1ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKS5lbmRBcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJhZE5lc3RpbmdPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCYWROZXN0aW5nQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsTmFtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIubmFtZShudWxsKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsU3RyaW5nVmFsdWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKG51bGwpOworICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIntcImFcIjpudWxsfSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRmluaXRlRG91YmxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci52YWx1ZShEb3VibGUuTmFOKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoRG91YmxlLk5FR0FUSVZFX0lORklOSVRZKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoRG91YmxlLlBPU0lUSVZFX0lORklOSVRZKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKC0wLjApOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDEuMCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoRG91YmxlLk1BWF9WQUxVRSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoRG91YmxlLk1JTl9WQUxVRSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoMC4wKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgtMC41KTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShEb3VibGUuTUlOX05PUk1BTCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoTWF0aC5QSSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoTWF0aC5FKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiWy0wLjAsIgorICAgICAgICAgICAgICAgICsgIjEuMCwiCisgICAgICAgICAgICAgICAgKyAiMS43OTc2OTMxMzQ4NjIzMTU3RTMwOCwiCisgICAgICAgICAgICAgICAgKyAiNC45RS0zMjQsIgorICAgICAgICAgICAgICAgICsgIjAuMCwiCisgICAgICAgICAgICAgICAgKyAiLTAuNSwiCisgICAgICAgICAgICAgICAgKyAiMi4yMjUwNzM4NTg1MDcyMDE0RS0zMDgsIgorICAgICAgICAgICAgICAgICsgIjMuMTQxNTkyNjUzNTg5NzkzLCIKKyAgICAgICAgICAgICAgICArICIyLjcxODI4MTgyODQ1OTA0NV0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoMCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoMSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoLTEpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKExvbmcuTUlOX1ZBTFVFKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShMb25nLk1BWF9WQUxVRSk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5jbG9zZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlswLCIKKyAgICAgICAgICAgICAgICArICIxLCIKKyAgICAgICAgICAgICAgICArICItMSwiCisgICAgICAgICAgICAgICAgKyAiLTkyMjMzNzIwMzY4NTQ3NzU4MDgsIgorICAgICAgICAgICAgICAgICsgIjkyMjMzNzIwMzY4NTQ3NzU4MDddIiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCb29sZWFucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKHRydWUpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKGZhbHNlKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlt0cnVlLGZhbHNlXSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5udWxsVmFsdWUoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIltudWxsXSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5ncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJhIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoImFcIiIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJcIiIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCI6Iik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIiwiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXGIiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXGYiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXG4iKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXHIiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXHQiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiICIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJcXCIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJ7Iik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIn0iKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiWyIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJdIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIlwwIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIlx1MDAxOSIpOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiW1wiYVwiLCIKKyAgICAgICAgICAgICAgICArICJcImFcXFwiXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxcIlwiLCIKKyAgICAgICAgICAgICAgICArICJcIjpcIiwiCisgICAgICAgICAgICAgICAgKyAiXCIsXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxiXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxmXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxuXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxyXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFx0XCIsIgorICAgICAgICAgICAgICAgICsgIlwiIFwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcXFxcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJ7XCIsIgorICAgICAgICAgICAgICAgICsgIlwifVwiLCIKKyAgICAgICAgICAgICAgICArICJcIltcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJdXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFx1MDAwMFwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcdTAwMTlcIl0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5QXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIltdIiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eU9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7fSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T2JqZWN0c0luQXJyYXlzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIikudmFsdWUoNSk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYiIpLnZhbHVlKGZhbHNlKTsKKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImMiKS52YWx1ZSg2KTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJkIikudmFsdWUodHJ1ZSk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbe1wiYVwiOjUsXCJiXCI6ZmFsc2V9LCIKKyAgICAgICAgICAgICAgICArICJ7XCJjXCI6NixcImRcIjp0cnVlfV0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFycmF5c0luT2JqZWN0cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDUpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKGZhbHNlKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImIiKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoNik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUodHJ1ZSk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7XCJhXCI6WzUsZmFsc2VdLCIKKyAgICAgICAgICAgICAgICArICJcImJcIjpbNix0cnVlXX0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlZXBOZXN0aW5nQXJyYXlzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoIltbW1tbW1tbW1tbW1tbW1tbW1tbXV1dXV1dXV1dXV1dXV1dXV1dXV0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlZXBOZXN0aW5nT2JqZWN0cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKTsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIH0KKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6IgorICAgICAgICAgICAgICAgICsgIntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7IgorICAgICAgICAgICAgICAgICsgIn19fX19fX19fX19fX19fX19fX19fSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0ZWROYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKS52YWx1ZSh0cnVlKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIikudmFsdWUoZmFsc2UpOworICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICAvLyBKc29uV3JpdGVyIGRvZXNuJ3QgYXR0ZW1wdCB0byBkZXRlY3QgZHVwbGljYXRlIG5hbWVzCisgICAgICAgIGFzc2VydEVxdWFscygie1wiYVwiOnRydWUsXCJhXCI6ZmFsc2V9Iiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcmV0dHlQcmludE9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuc2V0SW5kZW50KCIgICAiKTsKKworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpLnZhbHVlKHRydWUpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImIiKS52YWx1ZShmYWxzZSk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYyIpLnZhbHVlKDUuMCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiZSIpLm51bGxWYWx1ZSgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImYiKS5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoNi4wKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSg3LjApOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiZyIpLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiaCIpLnZhbHVlKDguMCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiaSIpLnZhbHVlKDkuMCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gIntcbiIKKyAgICAgICAgICAgICAgICArICIgICBcImFcIjogdHJ1ZSxcbiIKKyAgICAgICAgICAgICAgICArICIgICBcImJcIjogZmFsc2UsXG4iCisgICAgICAgICAgICAgICAgKyAiICAgXCJjXCI6IDUuMCxcbiIKKyAgICAgICAgICAgICAgICArICIgICBcImVcIjogbnVsbCxcbiIKKyAgICAgICAgICAgICAgICArICIgICBcImZcIjogW1xuIgorICAgICAgICAgICAgICAgICsgIiAgICAgIDYuMCxcbiIKKyAgICAgICAgICAgICAgICArICIgICAgICA3LjBcbiIKKyAgICAgICAgICAgICAgICArICIgICBdLFxuIgorICAgICAgICAgICAgICAgICsgIiAgIFwiZ1wiOiB7XG4iCisgICAgICAgICAgICAgICAgKyAiICAgICAgXCJoXCI6IDguMCxcbiIKKyAgICAgICAgICAgICAgICArICIgICAgICBcImlcIjogOS4wXG4iCisgICAgICAgICAgICAgICAgKyAiICAgfVxuIgorICAgICAgICAgICAgICAgICsgIn0iOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJldHR5UHJpbnRBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuc2V0SW5kZW50KCIgICAiKTsKKworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSh0cnVlKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShmYWxzZSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoNS4wKTsKKyAgICAgICAganNvbldyaXRlci5udWxsVmFsdWUoKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKS52YWx1ZSg2LjApOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImIiKS52YWx1ZSg3LjApOworICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSg4LjApOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDkuMCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworCisgICAgICAgIFN0cmluZyBleHBlY3RlZCA9ICJbXG4iCisgICAgICAgICAgICAgICAgKyAiICAgdHJ1ZSxcbiIKKyAgICAgICAgICAgICAgICArICIgICBmYWxzZSxcbiIKKyAgICAgICAgICAgICAgICArICIgICA1LjAsXG4iCisgICAgICAgICAgICAgICAgKyAiICAgbnVsbCxcbiIKKyAgICAgICAgICAgICAgICArICIgICB7XG4iCisgICAgICAgICAgICAgICAgKyAiICAgICAgXCJhXCI6IDYuMCxcbiIKKyAgICAgICAgICAgICAgICArICIgICAgICBcImJcIjogNy4wXG4iCisgICAgICAgICAgICAgICAgKyAiICAgfSxcbiIKKyAgICAgICAgICAgICAgICArICIgICBbXG4iCisgICAgICAgICAgICAgICAgKyAiICAgICAgOC4wLFxuIgorICAgICAgICAgICAgICAgICsgIiAgICAgIDkuMFxuIgorICAgICAgICAgICAgICAgICsgIiAgIF1cbiIKKyAgICAgICAgICAgICAgICArICJdIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9QYXR0ZXJuc1Rlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvUGF0dGVybnNUZXN0LmphdmEKaW5kZXggYjkwYzk3Yi4uYWFkM2ZlMSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9QYXR0ZXJuc1Rlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL1BhdHRlcm5zVGVzdC5qYXZhCkBAIC02OCw2ICs2OCwxMyBAQAogICAgICAgICB0ID0gUGF0dGVybnMuV0VCX1VSTC5tYXRjaGVyKCJ4bi0tZnNxdTAwYS54bi0tMHp3bTU2ZCIpLm1hdGNoZXMoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgVVJMIiwgdCk7CiAKKyAgICAgICAgLy8gVXJsIGZvciB0ZXN0aW5nIHRvcCBsZXZlbCBBcmFiaWMgY291bnRyeSBjb2RlIGRvbWFpbiBpbiBQdW55Y29kZToKKyAgICAgICAgLy8gICBodHRwOi8veG4tLTRnYnJpbS54bi0tLS1ybWNrYmJhamxjNmRqN2J4bmUyYy54bi0td2diaDFjL2FyL2RlZmF1bHQuYXNweAorICAgICAgICB0ID0gUGF0dGVybnMuV0VCX1VSTC5tYXRjaGVyKCJodHRwOi8veG4tLTRnYnJpbS54bi0tLS1ybWNrYmJhamxjNmRqN2J4bmUyYy54bi0td2diaDFjL2FyL2RlZmF1bHQuYXNweCIpLm1hdGNoZXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgVVJMIiwgdCk7CisgICAgICAgIHQgPSBQYXR0ZXJucy5XRUJfVVJMLm1hdGNoZXIoInhuLS00Z2JyaW0ueG4tLS0tcm1ja2JiYWpsYzZkajdieG5lMmMueG4tLXdnYmgxYy9hci9kZWZhdWx0LmFzcHgiKS5tYXRjaGVzKCk7CisgICAgICAgIGFzc2VydFRydWUoIlZhbGlkIFVSTCIsIHQpOworCiAgICAgICAgIC8vIEludGVybmF0aW9uYWxpemVkIFVSTC4KICAgICAgICAgdCA9IFBhdHRlcm5zLldFQl9VUkwubWF0Y2hlcigiaHR0cDovL1x1RDYwNFx1QUUwOFx1QzYwMVx1QzIxOFx1Qzk5RC5rciIpLm1hdGNoZXMoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgVVJMIiwgdCk7CkBAIC0xMDksNyArMTE2LDcgQEAKICAgICAgICAgdCA9IFBhdHRlcm5zLkRPTUFJTl9OQU1FLm1hdGNoZXIoIm1haWwuZXhhbXBsZS5jb20iKS5tYXRjaGVzKCk7CiAgICAgICAgIGFzc2VydFRydWUoIlZhbGlkIGRvbWFpbiIsIHQpOwogCi0gICAgICAgIHQgPSBQYXR0ZXJucy5XRUJfVVJMLm1hdGNoZXIoImdvb2dsZS5tZSIpLm1hdGNoZXMoKTsKKyAgICAgICAgdCA9IFBhdHRlcm5zLkRPTUFJTl9OQU1FLm1hdGNoZXIoImdvb2dsZS5tZSIpLm1hdGNoZXMoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgZG9tYWluIiwgdCk7CiAKICAgICAgICAgLy8gSW50ZXJuYXRpb25hbGl6ZWQgZG9tYWlucy4KQEAgLTExOCw2ICsxMjUsMTQgQEAKIAogICAgICAgICB0ID0gUGF0dGVybnMuRE9NQUlOX05BTUUubWF0Y2hlcigiX18rJjQyLnhlciIpLm1hdGNoZXMoKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoIkludmFsaWQgZG9tYWluIiwgdCk7CisKKyAgICAgICAgLy8gT2Jzb2xldGUgZG9tYWluIC55dQorICAgICAgICB0ID0gUGF0dGVybnMuRE9NQUlOX05BTUUubWF0Y2hlcigidGVzdC55dSIpLm1hdGNoZXMoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIk9ic29sZXRlIGNvdW50cnkgY29kZSB0b3AgbGV2ZWwgZG9tYWluIiwgdCk7CisKKyAgICAgICAgLy8gVGVzdGluZyB0b3AgbGV2ZWwgQXJhYmljIGNvdW50cnkgY29kZSBkb21haW4gaW4gUHVueWNvZGU6CisgICAgICAgIHQgPSBQYXR0ZXJucy5ET01BSU5fTkFNRS5tYXRjaGVyKCJ4bi0tNGdicmltLnhuLS0tLXJtY2tiYmFqbGM2ZGo3YnhuZTJjLnhuLS13Z2JoMWMiKS5tYXRjaGVzKCk7CisgICAgICAgIGFzc2VydFRydWUoIlZhbGlkIGRvbWFpbiIsIHQpOwogICAgIH0KIAogICAgIEBTbWFsbFRlc3QKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dlYmtpdC9BY2Nlc3NpYmlsaXR5SW5qZWN0b3JUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93ZWJraXQvQWNjZXNzaWJpbGl0eUluamVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOWQ5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93ZWJraXQvQWNjZXNzaWJpbGl0eUluamVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOworCisvKioKKyAqIFRoaXMgaXMgYSB0ZXN0IGZvciB0aGUgYmVoYXZpb3Igb2YgdGhlIHtAbGluayBBY2Nlc3NpYmlsaXR5SW5qZWN0b3J9CisgKiB3aGljaCBpcyB1c2VkIGJ5IHtAbGluayBXZWJWaWV3fSB0byBwcm92aWRlIGJhc2ljIGFjY2Vzc2liaWxpdHkgc3VwcG9ydAorICogaW4gY2FzZSBKYXZhU2NyaXB0IGlzIGRpc2FibGVkLgorICogPC9wPgorICogTm90ZTogVGhpcyB0ZXN0IHdvcmtzIGFnYWluc3QgdGhlIGdlbmVyYXRlZCB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50fXMKKyAqICAgICAgIHRvIHNvIGl0IGFsc28gY2hlY2tzIGlmIHRoZSB0ZXN0IGZvciBhbm5vdW5jaW5nIG5hdmlnYXRpb24gYXhpcyBhbmQKKyAqICAgICAgIHN0YXR1cyBtZXNzYWdlcyBhcyBhcHByb3ByaWF0ZS4KKyAqLworcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlJbmplY3RvclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworCisgICAgLyoqIFRoZSB0aW1lb3V0IHRvIHdhaXQgZm9yIHRoZSBleHBlY3RlZCBzZWxlY3Rpb24uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FT1VUX1dBSVRfRk9SX1NFTEVDVElPTl9TVFJJTkcgPSAxMDAwOworCisgICAgLyoqIFRoZSB0aW1lb3V0IHRvIHdhaXQgZm9yIGFjY2Vzc2liaWxpdHkgYW5kIHRoZSBtb2NrIHNlcnZpY2UgdG8gYmUgZW5hYmxlZC4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfRU5BQkxFX0FDQ0VTU0lCSUxJVFlfQU5EX01PQ0tfU0VSVklDRSA9IDUwMDsKKworICAgIC8qKiBUaGUgY291bnQgb2YgdGVzdHMgdG8gZGV0ZWN0IHdoZW4gdG8gc2h1dCBkb3duIHRoZSBzZXJ2aWNlLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVNUX0NBU0VfQ09VTlQgPSA4OworCisgICAgLyoqIFRoZSBtZXRhIHN0YXRlIGZvciBwcmVzc2VkIGxlZnQgQUxULiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OID0gS2V5RXZlbnQuTUVUQV9BTFRfT04KKyAgICAgICAgICAgIHwgS2V5RXZlbnQuTUVUQV9BTFRfTEVGVF9PTjsKKworICAgIC8qKiBUaGUgdmFsdWUgZm9yIG5vdCBzcGVjaWZpZWQgc2VsZWN0aW9uIHN0cmluZyBzaW5jZSBudWxsIGlzIGEgdmFsaWQgdmFsdWUuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVElPTl9TVFJJTkdfVU5LTk9XTiA9ICJVbmtub3duIjsKKworICAgIC8qKiBMb2NrIGZvciBsb2NraW5nIHRoZSB0ZXN0LiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBzVGVzdExvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAvKiogSGFuZGxlIHRvIHRoZSB0ZXN0IGZvciB1c2UgYnkgdGhlIG1vY2sgc2VydmljZS4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBBY2Nlc3NpYmlsaXR5SW5qZWN0b3JUZXN0IHNJbnN0YW5jZTsKKworICAgIC8qKiBGbGFnIGluZGljYXRpbmcgaWYgdGhlIGFjY2Vzc2liaWxpdHkgc2VydmljZSBpcyByZWFkeSB0byByZWNlaXZlIGV2ZW50cy4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNJc0FjY2Vzc2liaWxpdHlTZXJ2aWNlUmVhZHk7CisKKyAgICAvKiogVGhlIGNvdW50IG9mIGV4ZWN1dGVkIHRlc3RzIHRvIGRldGVjdCB3aGVuIHRvIHRvZ2dsZSBhY2Nlc3NpYmlsaXR5IGFuZCB0aGUgc2VydmljZS4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgc0V4ZWN1dGVkVGVzdENvdW50OworCisgICAgLyoqIFdvcmtlciB0aHJlYWQgd2l0aCBhIGhhbmRsZXIgdG8gcGVyZm9ybSBub24gdGVzdCB0aHJlYWQgcHJvY2Vzc2luZy4gKi8KKyAgICBwcml2YXRlIFdvcmtlciBtV29ya2VyOworCisgICAgLyoqIEhhbmRsZSB0byB0aGUge0BsaW5rIFdlYlZpZXd9IHRvIGxvYWQgZGF0YSBpbi4gKi8KKyAgICBwcml2YXRlIFdlYlZpZXcgbVdlYlZpZXc7CisKKyAgICAvKiogVGhlIHJlY2VpdmVkIHNlbGVjdGlvbiBzdHJpbmcgZm9yIGFzc2VydGlvbiBjaGVja2luZy4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc1JlY2VpdmVkU2VsZWN0aW9uU3RyaW5nID0gU0VMRUNUSU9OX1NUUklOR19VTktOT1dOOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbVdvcmtlciA9IG5ldyBXb3JrZXIoKTsKKyAgICAgICAgc0luc3RhbmNlID0gdGhpczsKKyAgICAgICAgaWYgKHNFeGVjdXRlZFRlc3RDb3VudCA9PSAwKSB7CisgICAgICAgICAgICAvLyB1bnRpbCBKVW5pdDQgY29tZXMgdG8gcGxheSB3aXRoIEBCZWZvcmVUZXN0CisgICAgICAgICAgICBkaXNhYmxlQWNjZXNzaWJpbGl0eUFuZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSgpOworICAgICAgICAgICAgZW5hYmxlQWNjZXNzaWJpbGl0eUFuZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1Xb3JrZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVdvcmtlci5zdG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNFeGVjdXRlZFRlc3RDb3VudCA9PSBURVNUX0NBU0VfQ09VTlQpIHsKKyAgICAgICAgICAgIC8vIHVudGlsIEpVbml0NCBjb21lcyB0byBwbGF5IHdpdGggQEFmdGVyVGVzdAorICAgICAgICAgICAgZGlzYWJsZUFjY2Vzc2liaWxpdHlBbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UoKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIG5hdmlnYXRpb24gYnkgY2hhcmFjdGVyLgorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmF2aWdhdGlvbkJ5Q2hhcmFjdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGEgYml0IHVnbHkgYnV0IGhlbHBzIGRldGVjdCBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhbGwgdGVzdHMgc28gYWNjZXNzaWJpbGl0eQorICAgICAgICAvLyBhbmQgdGhlIG1vY2sgc2VydmljZSBhcmUgbm90IHRvZ2dsZWQgb24gZXZlcnkgdGVzdCAoZXhwZW5zaXZlKQorICAgICAgICBzRXhlY3V0ZWRUZXN0Q291bnQrKzsKKworICAgICAgICBTdHJpbmcgaHRtbCA9CisgICAgICAgICAgICAiPGh0bWw+IiArCisgICAgICAgICAgICAgICAiPGhlYWQ+IiArCisgICAgICAgICAgICAgICAiPC9oZWFkPiIgKworICAgICAgICAgICAgICAgIjxib2R5PiIgKworICAgICAgICAgICAgICAgICAgICI8cD4iICsKKyAgICAgICAgICAgICAgICAgICAgICAiYSA8Yj5iPC9iPiBjIiArCisgICAgICAgICAgICAgICAgICAgIjwvcD4iICsKKyAgICAgICAgICAgICAgICAgICAiPHA+IiArCisgICAgICAgICAgICAgICAgICAgICAiZCIgKworICAgICAgICAgICAgICAgICAgICAgIjxpbnB1dD5lPC9pbnB1dD4iICsKKyAgICAgICAgICAgICAgICAgICAiPC9wPiIgKworICAgICAgICAgICAgICAgIjwvYm9keT4iICsKKyAgICAgICAgICAgICAiPC9odG1sPiI7CisKKyAgICAgICAgV2ViVmlldyB3ZWJWaWV3ID0gY3JlYXRlV2ViVmV3V2l0aEh0bWwoaHRtbCk7CisKKyAgICAgICAgLy8gY2hhbmdlIG5hdmlnYXRpb24gYXhpcyB0byB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgTUVUQV9TVEFURV9BTFRfTEVGVF9PTik7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiMSIpOyAvLyBleHBlY3QgdGhlIHdvcmQgbmF2aWdhdGlvbiBheGlzCisKKyAgICAgICAgLy8gY2hhbmdlIG5hdmlnYXRpb24gYXhpcyB0byBjaGFyYWN0ZXIKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCIwIik7IC8vIGV4cGVjdCB0aGUgY2hhcmFjdGVyIG5hdmlnYXRpb24gYXhpcworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJhIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHNlY29uZCBjaGFyYWN0ZXIKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8Yj5iPC9iPiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSB0aGlyZCBjaGFyYWN0ZXIKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJjIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZvdXJ0aCBjaGFyYWN0ZXIKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJkIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpZnRoIGNoYXJhY3RlcgorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoImUiKTsKKworICAgICAgICAvLyB0cnkgdG8gZ28gcGFzdCB0aGUgbGFzdCBjaGFyYWN0ZXIKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKG51bGwpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmb3VydGggY2hhcmFjdGVyIChyZXZlcnNlKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJkIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHRoaXJkIGNoYXJhY3RlcgorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJjIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHNlY29uZCBjaGFyYWN0ZXIKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiPGI+YjwvYj4iKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZmlyc3QgY2hhcmFjdGVyCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoImEiKTsKKworICAgICAgICAvLyB0cnkgdG8gZ28gYmVmb3JlIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZyhudWxsKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgc2Vjb25kIGNoYXJhY3RlciAocmV2ZXJzZSBhZ2FpbikKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8Yj5iPC9iPiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIG5hdmlnYXRpb24gYnkgd29yZC4KKyAgICAgKi8KKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5hdmlnYXRpb25CeVdvcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gYSBiaXQgdWdseSBidXQgaGVscHMgZGV0ZWN0IGJlZ2lubmluZyBhbmQgZW5kIG9mIGFsbCB0ZXN0cyBzbyBhY2Nlc3NpYmlsaXR5CisgICAgICAgIC8vIGFuZCB0aGUgbW9jayBzZXJ2aWNlIGFyZSBub3QgdG9nZ2xlZCBvbiBldmVyeSB0ZXN0IChleHBlbnNpdmUpCisgICAgICAgIHNFeGVjdXRlZFRlc3RDb3VudCsrOworCisgICAgICAgIFN0cmluZyBodG1sID0KKyAgICAgICAgICAgICI8aHRtbD4iICsKKyAgICAgICAgICAgICAgICI8aGVhZD4iICsKKyAgICAgICAgICAgICAgICI8L2hlYWQ+IiArCisgICAgICAgICAgICAgICAiPGJvZHk+IiArCisgICAgICAgICAgICAgICAgICAgIjxwPiIgKworICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIDxiPmE8L2I+IHNlbnRlbmNlIiArCisgICAgICAgICAgICAgICAgICAgIjwvcD4iICsKKyAgICAgICAgICAgICAgICAgICAiPHA+IiArCisgICAgICAgICAgICAgICAgICAgICAiIHNjYXR0ZXJlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICI8aW5wdXQ+YWxsPC9pbnB1dD4iICsKKyAgICAgICAgICAgICAgICAgICAgICIgb3ZlciAiICsKKyAgICAgICAgICAgICAgICAgICAiPC9wPiIgKworICAgICAgICAgICAgICAgICAgICI8ZGl2PiIgKworICAgICAgICAgICAgICAgICAgICAgIjxidXR0b24+dGhlIHBsYWNlLjwvYnV0dG9uPiIgKworICAgICAgICAgICAgICAgICAgICI8L2Rpdj4iICsKKyAgICAgICAgICAgICAgICI8L2JvZHk+IiArCisgICAgICAgICAgICAgIjwvaHRtbD4iOworCisgICAgICAgIFdlYlZpZXcgd2ViVmlldyA9IGNyZWF0ZVdlYlZld1dpdGhIdG1sKGh0bWwpOworCisgICAgICAgIC8vIGNoYW5nZSBuYXZpZ2F0aW9uIGF4aXMgdG8gd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIE1FVEFfU1RBVEVfQUxUX0xFRlRfT04pOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjEiKTsgLy8gZXhwZWN0IHRoZSB3b3JkIG5hdmlnYXRpb24gYXhpcworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmaXJzdCB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiVGhpcyIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBzZWNvbmQgd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoImlzIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHRoaXJkIHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8Yj5hPC9iPiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmb3VydGggd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoInNlbnRlbmNlIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpZnRoIHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJzY2F0dGVyZWQiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgc2l4dGggd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoImFsbCIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBzZXZlbnRoIHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJvdmVyIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGVpZ2h0IHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJ0aGUiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgbmludGggd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoInBsYWNlIik7CisKKyAgICAgICAgLy8gTk9URTogV2ViS2l0IHNlbGVjdGlvbiByZXR1cm5zIHRoZSBkb3QgYXMgYSB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiLiIpOworCisgICAgICAgIC8vIHRyeSB0byBnbyBwYXN0IHRoZSBsYXN0IHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKG51bGwpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBsYXN0IHdvcmQgKHJldmVyc2UpCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoInBsYWNlIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGVpZ2h0IHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygidGhlIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHNldmVudGggd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJvdmVyIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHNpeHRoIHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiYWxsIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpZnRoIHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygic2NhdHRlcmVkIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZvdXJ0aCB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoInNlbnRlbmNlIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHRoaXJkIHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiPGI+YTwvYj4iKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgc2Vjb25kIHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiaXMiKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZmlyc3Qgd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJUaGlzIik7CisKKyAgICAgICAgLy8gdHJ5IHRvIGdvIGJlZm9yZSB0aGUgZmlyc3Qgd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKG51bGwpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBzZWNvbmQgd29yZCAocmV2ZXJzZSBhZ2FpbikKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJpcyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIG5hdmlnYXRpb24gYnkgc2VudGVuY2UuCisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYXZpZ2F0aW9uQnlTZW50ZW5jZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBhIGJpdCB1Z2x5IGJ1dCBoZWxwcyBkZXRlY3QgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYWxsIHRlc3RzIHNvIGFjY2Vzc2liaWxpdHkKKyAgICAgICAgLy8gYW5kIHRoZSBtb2NrIHNlcnZpY2UgYXJlIG5vdCB0b2dnbGVkIG9uIGV2ZXJ5IHRlc3QgKGV4cGVuc2l2ZSkKKyAgICAgICAgc0V4ZWN1dGVkVGVzdENvdW50Kys7CisKKyAgICAgICAgU3RyaW5nIGh0bWwgPQorICAgICAgICAgICAgIjxodG1sPiIgKworICAgICAgICAgICAgICAiPGhlYWQ+IiArCisgICAgICAgICAgICAgICI8L2hlYWQ+IiArCisgICAgICAgICAgICAgICI8Ym9keT4iICsKKyAgICAgICAgICAgICAgICAiPGRpdj4iICsKKyAgICAgICAgICAgICAgICAgICI8cD4iICsKKyAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgdGhlIGZpcnN0IHNlbnRlbmNlIG9mIHRoZSBmaXJzdCBwYXJhZ3JhcGggYW5kIGhhcyBhbiA8Yj5pbmxpbmUgYm9sZCB0YWc8L2I+LiIgKworICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyB0aGUgc2Vjb25kIHNlbnRlbmNlIG9mIHRoZSBmaXJzdCBwYXJhZ3JhcGguIiArCisgICAgICAgICAgICAgICAgICAiPC9wPiIgKworICAgICAgICAgICAgICAgICAgIjxoMT5UaGlzIGlzIGEgaGVhZGluZzwvaDE+IiArCisgICAgICAgICAgICAgICAgICAiPHA+IiArCisgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIHRoZSBmaXJzdCBzZW50ZW5jZSBvZiB0aGUgc2Vjb25kIHBhcmFncmFwaC4iICsKKyAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgdGhlIHNlY29uZCBzZW50ZW5jZSBvZiB0aGUgc2Vjb25kIHBhcmFncmFwaC4iICsKKyAgICAgICAgICAgICAgICAgICI8L3A+IiArCisgICAgICAgICAgICAgICAgIjwvZGl2PiIgKworICAgICAgICAgICAgICAiPC9ib2R5PiIgKworICAgICAgICAgICAgIjwvaHRtbD4iOworCisgICAgICAgIFdlYlZpZXcgd2ViVmlldyA9IGNyZWF0ZVdlYlZld1dpdGhIdG1sKGh0bWwpOworCisgICAgICAgIC8vIFNlbnRlbmNlIGF4aXMgaXMgdGhlIGRlZmF1bHQKKworICAgICAgICAvLyBnbyB0byB0aGUgZmlyc3Qgc2VudGVuY2UKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJUaGlzIGlzIHRoZSBmaXJzdCBzZW50ZW5jZSBvZiB0aGUgZmlyc3QgcGFyYWdyYXBoIGFuZCBoYXMgYW4gIgorICAgICAgICAgICAgICAgICsgIjxiPmlubGluZSBib2xkIHRhZzwvYj4uIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHNlY29uZCBzZW50ZW5jZQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIlRoaXMgaXMgdGhlIHNlY29uZCBzZW50ZW5jZSBvZiB0aGUgZmlyc3QgcGFyYWdyYXBoLiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSB0aGlyZCBzZW50ZW5jZQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIlRoaXMgaXMgYSBoZWFkaW5nIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZvdXJ0aCBzZW50ZW5jZQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIlRoaXMgaXMgdGhlIGZpcnN0IHNlbnRlbmNlIG9mIHRoZSBzZWNvbmQgcGFyYWdyYXBoLiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmaWZ0aCBzZW50ZW5jZQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIlRoaXMgaXMgdGhlIHNlY29uZCBzZW50ZW5jZSBvZiB0aGUgc2Vjb25kIHBhcmFncmFwaC4iKTsKKworICAgICAgICAvLyB0cnkgdG8gZ28gcGFzdCB0aGUgbGFzdCBzZW50ZW5jZQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcobnVsbCk7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZvdXJ0aCBzZW50ZW5jZSAocmV2ZXJzZSkKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiVGhpcyBpcyB0aGUgZmlyc3Qgc2VudGVuY2Ugb2YgdGhlIHNlY29uZCBwYXJhZ3JhcGguIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHRoaXJkIHNlbnRlbmNlCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIlRoaXMgaXMgYSBoZWFkaW5nIik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHNlY29uZCBzZW50ZW5jZQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJUaGlzIGlzIHRoZSBzZWNvbmQgc2VudGVuY2Ugb2YgdGhlIGZpcnN0IHBhcmFncmFwaC4iKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZmlyc3Qgc2VudGVuY2UKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiVGhpcyBpcyB0aGUgZmlyc3Qgc2VudGVuY2Ugb2YgdGhlIGZpcnN0IHBhcmFncmFwaCBhbmQgaGFzIGFuICIKKyAgICAgICAgICAgICAgICArICI8Yj5pbmxpbmUgYm9sZCB0YWc8L2I+LiIpOworCisgICAgICAgIC8vIHRyeSB0byBnbyBiZWZvcmUgdGhlIGZpcnN0IHNlbnRlbmNlCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcobnVsbCk7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHNlY29uZCBzZW50ZW5jZSAocmV2ZXJzZSBhZ2FpbikKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJUaGlzIGlzIHRoZSBzZWNvbmQgc2VudGVuY2Ugb2YgdGhlIGZpcnN0IHBhcmFncmFwaC4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBuYXZpZ2F0aW9uIGJ5IGhlYWRpbmcuCisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYXZpZ2F0aW9uQnlIZWFkaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGEgYml0IHVnbHkgYnV0IGhlbHBzIGRldGVjdCBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhbGwgdGVzdHMgc28gYWNjZXNzaWJpbGl0eQorICAgICAgICAvLyBhbmQgdGhlIG1vY2sgc2VydmljZSBhcmUgbm90IHRvZ2dsZWQgb24gZXZlcnkgdGVzdCAoZXhwZW5zaXZlKQorICAgICAgICBzRXhlY3V0ZWRUZXN0Q291bnQrKzsKKworICAgICAgICBTdHJpbmcgaHRtbCA9CisgICAgICAgICAgICAiPCFET0NUWVBFIGh0bWw+IiArCisgICAgICAgICAgICAiPGh0bWw+IiArCisgICAgICAgICAgICAgICI8aGVhZD4iICsKKyAgICAgICAgICAgICAgIjwvaGVhZD4iICsKKyAgICAgICAgICAgICAgIjxib2R5PiIgKworICAgICAgICAgICAgICAgICI8aDE+SGVhZGluZyBvbmU8L2gxPiIgKworICAgICAgICAgICAgICAgICI8cD4iICsKKyAgICAgICAgICAgICAgICAgICJUaGlzIGlzIHNvbWUgdGV4dCIgKworICAgICAgICAgICAgICAgICI8L3A+IiArCisgICAgICAgICAgICAgICAgIjxoMj5IZWFkaW5nIHR3bzwvaDI+IiArCisgICAgICAgICAgICAgICAgIjxwPiIgKworICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgc29tZSB0ZXh0IiArCisgICAgICAgICAgICAgICAgIjwvcD4iICsKKyAgICAgICAgICAgICAgICAiPGgzPkhlYWRpbmcgdGhyZWU8L2gzPiIgKworICAgICAgICAgICAgICAgICI8cD4iICsKKyAgICAgICAgICAgICAgICAgICJUaGlzIGlzIHNvbWUgdGV4dCIgKworICAgICAgICAgICAgICAgICI8L3A+IiArCisgICAgICAgICAgICAgICAgIjxoND5IZWFkaW5nIGZvdXI8L2g0PiIgKworICAgICAgICAgICAgICAgICI8cD4iICsKKyAgICAgICAgICAgICAgICAgICJUaGlzIGlzIHNvbWUgdGV4dCIgKworICAgICAgICAgICAgICAgICI8L3A+IiArCisgICAgICAgICAgICAgICAgIjxoNT5IZWFkaW5nIGZpdmU8L2g1PiIgKworICAgICAgICAgICAgICAgICI8cD4iICsKKyAgICAgICAgICAgICAgICAgICJUaGlzIGlzIHNvbWUgdGV4dCIgKworICAgICAgICAgICAgICAgICI8L3A+IiArCisgICAgICAgICAgICAgICAgIjxoNj5IZWFkaW5nIHNpeDwvaDY+IiArCisgICAgICAgICAgICAgICI8L2JvZHk+IiArCisgICAgICAgICAgICAiPC9odG1sPiI7CisKKyAgICAgICAgV2ViVmlldyB3ZWJWaWV3ID0gY3JlYXRlV2ViVmV3V2l0aEh0bWwoaHRtbCk7CisKKyAgICAgICAgLy8gY2hhbmdlIG5hdmlnYXRpb24gYXhpcyB0byBoZWFkaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQsIE1FVEFfU1RBVEVfQUxUX0xFRlRfT04pOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjMiKTsgLy8gZXhwZWN0IHRoZSBoZWFkaW5nIG5hdmlnYXRpb24gYXhpcworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmaXJzdCBoZWFkaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiPGgxPkhlYWRpbmcgb25lPC9oMT4iKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgc2Vjb25kIGhlYWRpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8aDI+SGVhZGluZyB0d288L2gyPiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSB0aGlyZCBoZWFkaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiPGgzPkhlYWRpbmcgdGhyZWU8L2gzPiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmb3VydGggaGVhZGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxoND5IZWFkaW5nIGZvdXI8L2g0PiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmaWZ0aCBoZWFkaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiPGg1PkhlYWRpbmcgZml2ZTwvaDU+Iik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHNpeHRoIGhlYWRpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8aDY+SGVhZGluZyBzaXg8L2g2PiIpOworCisgICAgICAgIC8vIHRyeSB0byBnbyBwYXN0IHRoZSBsYXN0IGhlYWRpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKG51bGwpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmaWZ0aCBoZWFkaW5nIChyZXZlcnNlKQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8aDU+SGVhZGluZyBmaXZlPC9oNT4iKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZm91cnRoIGhlYWRpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiPGg0PkhlYWRpbmcgZm91cjwvaDQ+Iik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHRoaXJkIGhlYWRpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiPGgzPkhlYWRpbmcgdGhyZWU8L2gzPiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBzZWNvbmQgaGVhZGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8aDI+SGVhZGluZyB0d288L2gyPiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmaXJzdCBoZWFkaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxoMT5IZWFkaW5nIG9uZTwvaDE+Iik7CisKKyAgICAgICAgLy8gdHJ5IHRvIGdvIGJlZm9yZSB0aGUgZmlyc3QgaGVhZGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKG51bGwpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBzZWNvbmQgaGVhZGluZyAocmV2ZXJzZSBhZ2FpbikKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8aDI+SGVhZGluZyB0d288L2gyPiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIG5hdmlnYXRpb24gYnkgc2libGluZy4KKyAgICAgKi8KKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5hdmlnYXRpb25CeVNpYmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBhIGJpdCB1Z2x5IGJ1dCBoZWxwcyBkZXRlY3QgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYWxsIHRlc3RzIHNvIGFjY2Vzc2liaWxpdHkKKyAgICAgICAgLy8gYW5kIHRoZSBtb2NrIHNlcnZpY2UgYXJlIG5vdCB0b2dnbGVkIG9uIGV2ZXJ5IHRlc3QgKGV4cGVuc2l2ZSkKKyAgICAgICAgc0V4ZWN1dGVkVGVzdENvdW50Kys7CisKKyAgICAgICAgU3RyaW5nIGh0bWwgPQorICAgICAgICAgICAgIjwhRE9DVFlQRSBodG1sPiIgKworICAgICAgICAgICAgIjxodG1sPiIgKworICAgICAgICAgICAgICAiPGhlYWQ+IiArCisgICAgICAgICAgICAgICI8L2hlYWQ+IiArCisgICAgICAgICAgICAgICI8Ym9keT4iICsKKyAgICAgICAgICAgICAgICAiPGgxPkhlYWRpbmcgb25lPC9oMT4iICsKKyAgICAgICAgICAgICAgICAiPHA+IiArCisgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBzb21lIHRleHQiICsKKyAgICAgICAgICAgICAgICAiPC9wPiIgKworICAgICAgICAgICAgICAgICI8ZGl2PiIgKworICAgICAgICAgICAgICAgICAgIjxidXR0b24+SW5wdXQ8L2J1dHRvbj4iICsKKyAgICAgICAgICAgICAgICAiPC9kaXY+IiArCisgICAgICAgICAgICAgICI8L2JvZHk+IiArCisgICAgICAgICAgICAiPC9odG1sPiI7CisKKyAgICAgICAgV2ViVmlldyB3ZWJWaWV3ID0gY3JlYXRlV2ViVmV3V2l0aEh0bWwoaHRtbCk7CisKKyAgICAgICAgLy8gY2hhbmdlIG5hdmlnYXRpb24gYXhpcyB0byBoZWFkaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQsIE1FVEFfU1RBVEVfQUxUX0xFRlRfT04pOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjMiKTsgLy8gZXhwZWN0IHRoZSBoZWFkaW5nIG5hdmlnYXRpb24gYXhpcworCisgICAgICAgIC8vIGNoYW5nZSBuYXZpZ2F0aW9uIGF4aXMgdG8gc2libGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hULCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI0Iik7IC8vIGV4cGVjdCB0aGUgc2libGluZyBuYXZpZ2F0aW9uIGF4aXMKKworICAgICAgICAvLyBjaGFuZ2UgbmF2aWdhdGlvbiBheGlzIHRvIHBhcmVudC9maXJzdCBjaGlsZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hULCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI1Iik7IC8vIGV4cGVjdCB0aGUgcGFyZW50L2ZpcnN0IGNoaWxkIG5hdmlnYXRpb24gYXhpcworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgYm9keQorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxoMT5IZWFkaW5nIG9uZTwvaDE+Iik7CisKKyAgICAgICAgLy8gY2hhbmdlIG5hdmlnYXRpb24gYXhpcyB0byBzaWJsaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfTEVGVCwgTUVUQV9TVEFURV9BTFRfTEVGVF9PTik7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiNCIpOyAvLyBleHBlY3QgdGhlIHNpYmxpbmcgbmF2aWdhdGlvbiBheGlzCisKKyAgICAgICAgLy8gZ28gdG8gdGhlIG5leHQgc2libGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxwPlRoaXMgaXMgc29tZSB0ZXh0PC9wPiIpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBuZXh0IHNpYmxpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8ZGl2PjxidXR0b24+SW5wdXQ8L2J1dHRvbj48L2Rpdj4iKTsKKworICAgICAgICAvLyB0cnkgdG8gZ28gcGFzdCB0aGUgbGFzdCBzaWJsaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZyhudWxsKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgcHJldmlvdXMgc2libGluZyAocmV2ZXJzZSkKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiPHA+VGhpcyBpcyBzb21lIHRleHQ8L3A+Iik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHByZXZpb3VzIHNpYmxpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiPGgxPkhlYWRpbmcgb25lPC9oMT4iKTsKKworICAgICAgICAvLyB0cnkgdG8gZ28gYmVmb3JlIHRoZSBwcmV2aW91cyBzaWJsaW5nCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAsIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcobnVsbCk7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIG5leHQgc2libGluZyAocmV2ZXJzZSBhZ2FpbikKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8cD5UaGlzIGlzIHNvbWUgdGV4dDwvcD4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBuYXZpZ2F0aW9uIGJ5IHBhcmVudC9maXJzdCBjaGlsZC4KKyAgICAgKi8KKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5hdmlnYXRpb25CeVBhcmVudEZpcnN0Q2hpbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gYSBiaXQgdWdseSBidXQgaGVscHMgZGV0ZWN0IGJlZ2lubmluZyBhbmQgZW5kIG9mIGFsbCB0ZXN0cyBzbyBhY2Nlc3NpYmlsaXR5CisgICAgICAgIC8vIGFuZCB0aGUgbW9jayBzZXJ2aWNlIGFyZSBub3QgdG9nZ2xlZCBvbiBldmVyeSB0ZXN0IChleHBlbnNpdmUpCisgICAgICAgIHNFeGVjdXRlZFRlc3RDb3VudCsrOworCisgICAgICAgIFN0cmluZyBodG1sID0KKyAgICAgICAgICAgICI8IURPQ1RZUEUgaHRtbD4iICsKKyAgICAgICAgICAgICI8aHRtbD4iICsKKyAgICAgICAgICAgICAgIjxoZWFkPiIgKworICAgICAgICAgICAgICAiPC9oZWFkPiIgKworICAgICAgICAgICAgICAiPGJvZHk+IiArCisgICAgICAgICAgICAgICAgIjxkaXY+IiArCisgICAgICAgICAgICAgICAgICAiPGJ1dHRvbj5JbnB1dDwvYnV0dG9uPiIgKworICAgICAgICAgICAgICAgICI8L2Rpdj4iICsKKyAgICAgICAgICAgICAgIjwvYm9keT4iICsKKyAgICAgICAgICAgICI8L2h0bWw+IjsKKworICAgICAgICBXZWJWaWV3IHdlYlZpZXcgPSBjcmVhdGVXZWJWZXdXaXRoSHRtbChodG1sKTsKKworICAgICAgICAvLyBjaGFuZ2UgbmF2aWdhdGlvbiBheGlzIHRvIGRvY3VtZW50CisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfTEVGVCwgTUVUQV9TVEFURV9BTFRfTEVGVF9PTik7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiNiIpOyAvLyBleHBlY3QgdGhlIGRvY3VtZW50IG5hdmlnYXRpb24gYXhpcworCisgICAgICAgIC8vIGNoYW5nZSBuYXZpZ2F0aW9uIGF4aXMgdG8gcGFyZW50L2ZpcnN0IGNoaWxkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfTEVGVCwgTUVUQV9TVEFURV9BTFRfTEVGVF9PTik7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiNSIpOyAvLyBleHBlY3QgdGhlIHBhcmVudC9maXJzdCBjaGlsZCBuYXZpZ2F0aW9uIGF4aXMKKworICAgICAgICAvLyBnbyB0byB0aGUgZmlyc3QgY2hpbGQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8ZGl2PjxidXR0b24+SW5wdXQ8L2J1dHRvbj48L2Rpdj4iKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgZmlyc3QgY2hpbGQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8YnV0dG9uPklucHV0PC9idXR0b24+Iik7CisKKyAgICAgICAgLy8gdHJ5IHRvIGdvIHRvIHRoZSBmaXJzdCBjaGlsZCBvZiBhIGxlYWYgZWxlbWVudAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcobnVsbCk7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHBhcmVudCAocmV2ZXJzZSkKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiPGRpdj48YnV0dG9uPklucHV0PC9idXR0b24+PC9kaXY+Iik7CisKKyAgICAgICAgLy8gZ28gdG8gdGhlIHBhcmVudAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8Ym9keT48ZGl2PjxidXR0b24+SW5wdXQ8L2J1dHRvbj48L2Rpdj48L2JvZHk+Iik7CisKKyAgICAgICAgLy8gdHJ5IHRvIGdvIHRvIHRoZSBib2R5IHBhcmVudAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKG51bGwpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBmaXJzdCBjaGlsZCAocmV2ZXJzZSBhZ2FpbikKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCI8ZGl2PjxidXR0b24+SW5wdXQ8L2J1dHRvbj48L2Rpdj4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBuYXZpZ2F0aW9uIGJ5IGRvY3VtZW50LgorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmF2aWdhdGlvbkJ5RG9jdW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gYSBiaXQgdWdseSBidXQgaGVscHMgZGV0ZWN0IGJlZ2lubmluZyBhbmQgZW5kIG9mIGFsbCB0ZXN0cyBzbyBhY2Nlc3NpYmlsaXR5CisgICAgICAgIC8vIGFuZCB0aGUgbW9jayBzZXJ2aWNlIGFyZSBub3QgdG9nZ2xlZCBvbiBldmVyeSB0ZXN0IChleHBlbnNpdmUpCisgICAgICAgIHNFeGVjdXRlZFRlc3RDb3VudCsrOworCisgICAgICAgIFN0cmluZyBodG1sID0KKyAgICAgICAgICAgICI8IURPQ1RZUEUgaHRtbD4iICsKKyAgICAgICAgICAgICI8aHRtbD4iICsKKyAgICAgICAgICAgICAgIjxoZWFkPiIgKworICAgICAgICAgICAgICAiPC9oZWFkPiIgKworICAgICAgICAgICAgICAiPGJvZHk+IiArCisgICAgICAgICAgICAgICAgIjxidXR0b24+Q2xpY2s8L2J1dHRvbj4iICsKKyAgICAgICAgICAgICAgIjwvYm9keT4iICsKKyAgICAgICAgICAgICI8L2h0bWw+IjsKKworICAgICAgICBXZWJWaWV3IHdlYlZpZXcgPSBjcmVhdGVXZWJWZXdXaXRoSHRtbChodG1sKTsKKworICAgICAgICAvLyBjaGFuZ2UgbmF2aWdhdGlvbiBheGlzIHRvIGRvY3VtZW50CisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfTEVGVCwgTUVUQV9TVEFURV9BTFRfTEVGVF9PTik7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiNiIpOyAvLyBleHBlY3QgdGhlIGRvY3VtZW50IG5hdmlnYXRpb24gYXhpcworCisgICAgICAgIC8vIGdvIHRvIHRoZSBib3R0b20gb2YgdGhlIGRvY3VtZW50CisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiQ2xpY2siKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgdG9wIG9mIHRoZSBkb2N1bWVudCAocmV2ZXJzZSkKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgMCk7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiPGJvZHk+PGJ1dHRvbj5DbGljazwvYnV0dG9uPjwvYm9keT4iKTsKKworICAgICAgICAvLyBnbyB0byB0aGUgYm90dG9tIG9mIHRoZSBkb2N1bWVudCAocmV2ZXJzZSBhZ2FpbikKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJDbGljayIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoZSBzeW5jIGJldHdlZW4gdGhlIHRleHQgbmF2aWdhdGlvbiBhbmQgbmF2aWdhdGlvbiBieSBET00gZWxlbWVudHMuCisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTeW5jQmV0d2VlblRleHRBbmREb21Ob2RlTmF2aWdhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBhIGJpdCB1Z2x5IGJ1dCBoZWxwcyBkZXRlY3QgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYWxsIHRlc3RzIHNvIGFjY2Vzc2liaWxpdHkKKyAgICAgICAgLy8gYW5kIHRoZSBtb2NrIHNlcnZpY2UgYXJlIG5vdCB0b2dnbGVkIG9uIGV2ZXJ5IHRlc3QgKGV4cGVuc2l2ZSkKKyAgICAgICAgc0V4ZWN1dGVkVGVzdENvdW50Kys7CisKKyAgICAgICAgU3RyaW5nIGh0bWwgPQorICAgICAgICAgICAgIjwhRE9DVFlQRSBodG1sPiIgKworICAgICAgICAgICAgIjxodG1sPiIgKworICAgICAgICAgICAgICAiPGhlYWQ+IiArCisgICAgICAgICAgICAgICI8L2hlYWQ+IiArCisgICAgICAgICAgICAgICI8Ym9keT4iICsKKyAgICAgICAgICAgICAgICAiPHA+IiArCisgICAgICAgICAgICAgICAgICAiRmlyc3QiICsKKyAgICAgICAgICAgICAgICAiPC9wPiIgKworICAgICAgICAgICAgICAgICI8YnV0dG9uPlNlY29uZDwvYnV0dG9uPiIgKworICAgICAgICAgICAgICAgICI8cD4iICsKKyAgICAgICAgICAgICAgICAgICJUaGlyZCIgKworICAgICAgICAgICAgICAgICI8L3A+IiArCisgICAgICAgICAgICAgICI8L2JvZHk+IiArCisgICAgICAgICAgICAiPC9odG1sPiI7CisKKyAgICAgICAgV2ViVmlldyB3ZWJWaWV3ID0gY3JlYXRlV2ViVmV3V2l0aEh0bWwoaHRtbCk7CisKKyAgICAgICAgLy8gY2hhbmdlIG5hdmlnYXRpb24gYXhpcyB0byB3b3JkCisgICAgICAgIHNlbmRLZXlFdmVudCh3ZWJWaWV3LCBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiwgTUVUQV9TVEFURV9BTFRfTEVGVF9PTik7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiMSIpOyAvLyBleHBlY3QgdGhlIHdvcmQgbmF2aWdhdGlvbiBheGlzCisKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpcnN0IHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOLCAwKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCJGaXJzdCIpOworCisgICAgICAgIC8vIGNoYW5nZSBuYXZpZ2F0aW9uIGF4aXMgdG8gaGVhZGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hULCBNRVRBX1NUQVRFX0FMVF9MRUZUX09OKTsKKyAgICAgICAgYXNzZXJ0U2VsZWN0aW9uU3RyaW5nKCIzIik7IC8vIGV4cGVjdCB0aGUgaGVhZGluZyBuYXZpZ2F0aW9uIGF4aXMKKworICAgICAgICAvLyBjaGFuZ2UgbmF2aWdhdGlvbiBheGlzIHRvIHNpYmxpbmcKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVCwgTUVUQV9TVEFURV9BTFRfTEVGVF9PTik7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiNCIpOyAvLyBleHBlY3QgdGhlIHNpYmxpbmcgbmF2aWdhdGlvbiBheGlzCisKKyAgICAgICAgLy8gZ28gdG8gdGhlIG5leHQgc2libGluZworICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIjxidXR0b24+U2Vjb25kPC9idXR0b24+Iik7CisKKyAgICAgICAgLy8gY2hhbmdlIG5hdmlnYXRpb24gYXhpcyB0byBjaGFyYWN0ZXIKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgTUVUQV9TVEFURV9BTFRfTEVGVF9PTik7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiMCIpOyAvLyBleHBlY3QgdGhlIGNoYXJhY3RlciBuYXZpZ2F0aW9uIGF4aXMKKworICAgICAgICAvLyBjaGFuZ2UgbmF2aWdhdGlvbiBheGlzIHRvIHdvcmQKKyAgICAgICAgc2VuZEtleUV2ZW50KHdlYlZpZXcsIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUCwgTUVUQV9TVEFURV9BTFRfTEVGVF9PTik7CisgICAgICAgIGFzc2VydFNlbGVjdGlvblN0cmluZygiMSIpOyAvLyBleHBlY3QgdGhlIHdvcmQgbmF2aWdhdGlvbiBheGlzCisKKyAgICAgICAgLy8gZ28gdG8gdGhlIG5leHQgd29yZAorICAgICAgICBzZW5kS2V5RXZlbnQod2ViVmlldywgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04sIDApOworICAgICAgICBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoIlRoaXJkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlIGFjY2Vzc2liaWxpdHkgYW5kIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5hYmxlQWNjZXNzaWJpbGl0eUFuZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSgpIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBtYW5hZ2VyIGlzIGluc3RhbnRpYXRlZCBzbyB0aGUgc3lzdGVtIGluaXRpYWxpemVzIGl0CisgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKGdldENvbnRleHQoKSk7CisKKyAgICAgICAgLy8gZW5hYmxlIGFjY2Vzc2liaWxpdHkgYW5kIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZQorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuQUNDRVNTSUJJTElUWV9FTkFCTEVELCAxKTsKKyAgICAgICAgU3RyaW5nIGVuYWJsZWRTZXJ2aWNlcyA9IG5ldyBDb21wb25lbnROYW1lKGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpLAorICAgICAgICAgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jbGFzcy5nZXROYW1lKCkpLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcoZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5FTkFCTEVEX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMsIGVuYWJsZWRTZXJ2aWNlcyk7CisKKyAgICAgICAgLy8gcG9sbCB3aXRoaW4gYSB0aW1lb3V0IGFuZCBsZXQgYmUgaW50ZXJydXB0ZWQgaW4gY2FzZSBvZiBzdWNjZXNzCisgICAgICAgIGxvbmcgaW5jcmVtZW50U3RlcCA9IFRJTUVPVVRfRU5BQkxFX0FDQ0VTU0lCSUxJVFlfQU5EX01PQ0tfU0VSVklDRSAvIDU7CisgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgd2hpbGUgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gc3RhcnQgPCBUSU1FT1VUX0VOQUJMRV9BQ0NFU1NJQklMSVRZX0FORF9NT0NLX1NFUlZJQ0UgJiYKKyAgICAgICAgICAgICAgICAhc0lzQWNjZXNzaWJpbGl0eVNlcnZpY2VSZWFkeSkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChzVGVzdExvY2spIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzVGVzdExvY2sud2FpdChpbmNyZW1lbnRTdGVwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXNJc0FjY2Vzc2liaWxpdHlTZXJ2aWNlUmVhZHkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBub3QgcmVhZHkuIERpZCB5b3UgYWRkICIgKworICAgICAgICAgICAgICAgICAgICAidGVzdHMgYW5kIGZvcmdvdCB0byB1cGRhdGUgQWNjZXNzaWJpbGl0eUluamVjdG9yVGVzdCNURVNUX0NBU0VfQ09VTlQ/Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzY3J1YkNsYXNzKENsYXNzPD8+IHRlc3RDYXNlQ2xhc3MpIHsKKyAgICAgICAgLyogZG8gbm90aGluZyAtIGF2b2lkIHN1cGVyY2xhc3MgYmVoYXZpb3IgKi8KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNhYmxlcyBhY2Nlc3NpYmlsaXR5IGFuZCB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRpc2FibGVBY2Nlc3NpYmlsaXR5QW5kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlKCkgeworICAgICAgICAvLyBkaXNhYmxlIGFjY2Vzc2liaWxpdHkgYW5kIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZQorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuQUNDRVNTSUJJTElUWV9FTkFCTEVELCAwKTsKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfQUNDRVNTSUJJTElUWV9TRVJWSUNFUywgIiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhlIG5leHQgPGNvZGU+ZXhwZWN0ZWRTZWxlY3Rpb25TdHJpbmc8L2NvZGU+IHRvIGJlIHJlY2VpdmVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRTZWxlY3Rpb25TdHJpbmcoU3RyaW5nIGV4cGVjdGVkU2VsZWN0aW9uU3RyaW5nKSB7CisgICAgICAgIGFzc2VydFRydWUoIk1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBub3QgcmVhZHkiLCBzSXNBY2Nlc3NpYmlsaXR5U2VydmljZVJlYWR5KTsKKworICAgICAgICBsb25nIGluY3JlbWVudFN0ZXAgPSBUSU1FT1VUX1dBSVRfRk9SX1NFTEVDVElPTl9TVFJJTkcgLyA1OworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgIHdoaWxlIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIHN0YXJ0IDwgVElNRU9VVF9XQUlUX0ZPUl9TRUxFQ1RJT05fU1RSSU5HICYmCisgICAgICAgICAgICAgICAgc1JlY2VpdmVkU2VsZWN0aW9uU3RyaW5nID09IFNFTEVDVElPTl9TVFJJTkdfVU5LTk9XTikgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChzVGVzdExvY2spIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzVGVzdExvY2sud2FpdChpbmNyZW1lbnRTdGVwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzUmVjZWl2ZWRTZWxlY3Rpb25TdHJpbmcgPT0gU0VMRUNUSU9OX1NUUklOR19VTktOT1dOKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiTm8gc2VsZWN0aW9uIHN0cmluZyByZWNlaXZlZC4gRXhwZWN0ZWQ6ICIgKyBleHBlY3RlZFNlbGVjdGlvblN0cmluZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTZWxlY3Rpb25TdHJpbmcsIHNSZWNlaXZlZFNlbGVjdGlvblN0cmluZyk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzUmVjZWl2ZWRTZWxlY3Rpb25TdHJpbmcgPSBTRUxFQ1RJT05fU1RSSU5HX1VOS05PV047CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyBhIHtAbGluayBLZXlFdmVudH0gKHVwIGFuZCBkb3duKSB0byB0aGUge0BsaW5rIFdlYlZpZXd9LgorICAgICAqCisgICAgICogQHBhcmFtIGtleUNvZGUgVGhlIGV2ZW50IGtleSBjb2RlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZW5kS2V5RXZlbnQoV2ViVmlldyB3ZWJWaWV3LCBpbnQga2V5Q29kZSwgaW50IG1ldGFTdGF0ZSkgeworICAgICAgICB3ZWJWaWV3Lm9uS2V5RG93bihrZXlDb2RlLCBuZXcgS2V5RXZlbnQoMCwgMCwgS2V5RXZlbnQuQUNUSU9OX0RPV04sIGtleUNvZGUsIDEsIG1ldGFTdGF0ZSkpOworICAgICAgICB3ZWJWaWV3Lm9uS2V5VXAoa2V5Q29kZSwgbmV3IEtleUV2ZW50KDAsIDAsIEtleUV2ZW50LkFDVElPTl9VUCwga2V5Q29kZSwgMSwgbWV0YVN0YXRlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBXZWJWaWV3fSB3aXRoIHdpdGggYSBnaXZlbiBIVE1MIGNvbnRlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaHRtbCBUaGUgSFRNTCBjb250ZW50OworICAgICAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgdmlldy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFdlYlZpZXcgY3JlYXRlV2ViVmV3V2l0aEh0bWwoZmluYWwgU3RyaW5nIGh0bWwpIHsKKyAgICAgICAgbVdvcmtlci5nZXRIYW5kbGVyKCkucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcgPSBuZXcgV2ViVmlldyhnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgICAgIG1XZWJWaWV3LmxvYWREYXRhKGh0bWwsICJ0ZXh0L2h0bWwiLCAidXRmLTgiKTsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5zZXRXZWJWaWV3Q2xpZW50KG5ldyBXZWJWaWV3Q2xpZW50KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25QYWdlRmluaXNoZWQoV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtV29ya2VyLmdldEhhbmRsZXIoKS5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc1Rlc3RMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzVGVzdExvY2subm90aWZ5QWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgc3luY2hyb25pemVkIChzVGVzdExvY2spIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc1Rlc3RMb2NrLndhaXQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICAgICAgLyogaWdub3JlICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1XZWJWaWV3OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgYSB3b3JrZXIgdGhyZWFkIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUge0BsaW5rIFdlYlZpZXd9LgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgV29ya2VyIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtV29ya2VyTG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOworCisgICAgICAgcHVibGljIFdvcmtlcigpIHsKKyAgICAgICAgICAgIG5ldyBUaHJlYWQodGhpcykuc3RhcnQoKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdvcmtlckxvY2spIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAobUhhbmRsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVdvcmtlckxvY2sud2FpdCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogaWdub3JlICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Xb3JrZXJMb2NrKSB7CisgICAgICAgICAgICAgICAgTG9vcGVyLnByZXBhcmUoKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgICAgICAgICAgICAgbVdvcmtlckxvY2subm90aWZ5QWxsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMb29wZXIubG9vcCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEhhbmRsZXIgZ2V0SGFuZGxlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBtSGFuZGxlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgICAgICBtSGFuZGxlci5nZXRMb29wZXIoKS5xdWl0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZSB0byByZWNlaXZlIHRoZSBhY2Nlc3NpYmlsaXR5IGV2ZW50cworICAgICAqIHdpdGggdGhlIGN1cnJlbnQge0BsaW5rIFdlYlZpZXd9IHNlbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBleHRlbmRzIEFjY2Vzc2liaWxpdHlTZXJ2aWNlIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1NlcnZpY2VJbmZvU2V0OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoKSB7CisgICAgICAgICAgICBpZiAobUlzU2VydmljZUluZm9TZXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gaW5mbyA9IG5ldyBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8oKTsKKyAgICAgICAgICAgIGluZm8uZXZlbnRUeXBlcyA9IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfU0VMRUNURUQ7CisgICAgICAgICAgICBpbmZvLmZlZWRiYWNrVHlwZSA9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5GRUVEQkFDS19HRU5FUklDOworICAgICAgICAgICAgc2V0U2VydmljZUluZm8oaW5mbyk7CisgICAgICAgICAgICBtSXNTZXJ2aWNlSW5mb1NldCA9IHRydWU7CisKKyAgICAgICAgICAgIHNJc0FjY2Vzc2liaWxpdHlTZXJ2aWNlUmVhZHkgPSB0cnVlOworCisgICAgICAgICAgICBpZiAoc0luc3RhbmNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNUZXN0TG9jaykgeworICAgICAgICAgICAgICAgIHNUZXN0TG9jay5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIGlmIChzSW5zdGFuY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZXZlbnQuZ2V0VGV4dCgpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gZXZlbnQuZ2V0VGV4dCgpLmdldCgwKTsKKyAgICAgICAgICAgICAgICBzUmVjZWl2ZWRTZWxlY3Rpb25TdHJpbmcgPSAodGV4dCAhPSBudWxsKSA/IHRleHQudG9TdHJpbmcoKSA6IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNUZXN0TG9jaykgeworICAgICAgICAgICAgICAgIHNUZXN0TG9jay5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkludGVycnVwdCgpIHsKKyAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblVuYmluZChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBzSXNBY2Nlc3NpYmlsaXR5U2VydmljZVJlYWR5ID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXJUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5ZGVmZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dlYmtpdC9ab29tTWFuYWdlclRlc3QuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFpvb21NYW5hZ2VyVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIFpvb21NYW5hZ2VyIHpvb21NYW5hZ2VyOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIFdlYlZpZXcgd2ViVmlldyA9IG5ldyBXZWJWaWV3KHRoaXMuZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgQ2FsbGJhY2tQcm94eSBjYWxsYmFja1Byb3h5ID0gbmV3IENhbGxiYWNrUHJveHkodGhpcy5nZXRDb250ZXh0KCksIHdlYlZpZXcpOworICAgICAgICB6b29tTWFuYWdlciA9IG5ldyBab29tTWFuYWdlcih3ZWJWaWV3LCBjYWxsYmFja1Byb3h5KTsKKworICAgICAgICB6b29tTWFuYWdlci5pbml0KDEuMDBmKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5pdCgpIHsKKyAgICAgICAgdGVzdEluaXQoMC4wMWYpOworICAgICAgICB0ZXN0SW5pdCgxLjAwZik7CisgICAgICAgIHRlc3RJbml0KDEuMjVmKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEluaXQoZmxvYXQgZGVuc2l0eSkgeworICAgICAgICB6b29tTWFuYWdlci5pbml0KGRlbnNpdHkpOworICAgICAgICBhY3R1YWxTY2FsZVRlc3QoZGVuc2l0eSk7CisgICAgICAgIGRlZmF1bHRTY2FsZVRlc3QoZGVuc2l0eSk7CisgICAgICAgIGFzc2VydEVxdWFscyh6b29tTWFuYWdlci5nZXREZWZhdWx0TWF4Wm9vbVNjYWxlKCksIHpvb21NYW5hZ2VyLmdldE1heFpvb21TY2FsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHpvb21NYW5hZ2VyLmdldERlZmF1bHRNaW5ab29tU2NhbGUoKSwgem9vbU1hbmFnZXIuZ2V0TWluWm9vbVNjYWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGVuc2l0eSwgem9vbU1hbmFnZXIuZ2V0VGV4dFdyYXBTY2FsZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KCkgeworICAgICAgICAvLyB0ZXN0IHRoZSBiYXNpYyBjYXNlIHdoZXJlIHRoZSBhY3R1YWwgdmFsdWVzIGFyZSBlcXVhbCB0byB0aGUgZGVmYXVsdHMKKyAgICAgICAgdGVzdFVwZGF0ZURlZmF1bHRab29tRGVuc2l0eSgwLjAxZik7CisgICAgICAgIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoMS4wMGYpOworICAgICAgICB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KDEuMjVmKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShmbG9hdCBkZW5zaXR5KSB7CisgICAgICAgIHpvb21NYW5hZ2VyLnVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShkZW5zaXR5KTsKKyAgICAgICAgZGVmYXVsdFNjYWxlVGVzdChkZW5zaXR5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5V2l0aFNtYWxsTWluWm9vbSgpIHsKKyAgICAgICAgLy8gdGVzdCB0aGUgY2FzZSB3aGVyZSB0aGUgbWluWm9vbVNjYWxlIGhhcyBjaGFuZ2VkIHRvIGJlIDwgdGhlIGRlZmF1bHQKKyAgICAgICAgZmxvYXQgbmV3RGVmYXVsdFNjYWxlID0gMS41MGY7CisgICAgICAgIGZsb2F0IG1pblpvb21TY2FsZSA9IFpvb21NYW5hZ2VyLkRFRkFVTFRfTUlOX1pPT01fU0NBTEVfRkFDVE9SICogbmV3RGVmYXVsdFNjYWxlOworICAgICAgICBXZWJWaWV3Q29yZS5WaWV3U3RhdGUgbWluVmlld1N0YXRlID0gbmV3IFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSgpOworICAgICAgICBtaW5WaWV3U3RhdGUubU1pblNjYWxlID0gbWluWm9vbVNjYWxlIC0gMC4xZjsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlWm9vbVJhbmdlKG1pblZpZXdTdGF0ZSwgMCwgMCk7CisgICAgICAgIHpvb21NYW5hZ2VyLnVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShuZXdEZWZhdWx0U2NhbGUpOworICAgICAgICBkZWZhdWx0U2NhbGVUZXN0KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRab29tRGVuc2l0eVdpdGhMYXJnZU1pblpvb20oKSB7CisgICAgICAgIC8vIHRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlIG1pblpvb21TY2FsZSBoYXMgY2hhbmdlZCB0byBiZSA+IHRoZSBkZWZhdWx0CisgICAgICAgIGZsb2F0IG5ld0RlZmF1bHRTY2FsZSA9IDEuNTBmOworICAgICAgICBmbG9hdCBtaW5ab29tU2NhbGUgPSBab29tTWFuYWdlci5ERUZBVUxUX01JTl9aT09NX1NDQUxFX0ZBQ1RPUiAqIG5ld0RlZmF1bHRTY2FsZTsKKyAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIG1pblZpZXdTdGF0ZSA9IG5ldyBXZWJWaWV3Q29yZS5WaWV3U3RhdGUoKTsKKyAgICAgICAgbWluVmlld1N0YXRlLm1NaW5TY2FsZSA9IG1pblpvb21TY2FsZSArIDAuMWY7CisgICAgICAgIHpvb21NYW5hZ2VyLnVwZGF0ZVpvb21SYW5nZShtaW5WaWV3U3RhdGUsIDAsIDApOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkobmV3RGVmYXVsdFNjYWxlKTsKKyAgICAgICAgZGVmYXVsdFNjYWxlVGVzdChuZXdEZWZhdWx0U2NhbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHlXaXRoU21hbGxNYXhab29tKCkgeworICAgICAgICAvLyB0ZXN0IHRoZSBjYXNlIHdoZXJlIHRoZSBtYXhab29tU2NhbGUgaGFzIGNoYW5nZWQgdG8gYmUgPCB0aGUgZGVmYXVsdAorICAgICAgICBmbG9hdCBuZXdEZWZhdWx0U2NhbGUgPSAxLjUwZjsKKyAgICAgICAgZmxvYXQgbWF4Wm9vbVNjYWxlID0gWm9vbU1hbmFnZXIuREVGQVVMVF9NQVhfWk9PTV9TQ0FMRV9GQUNUT1IgKiBuZXdEZWZhdWx0U2NhbGU7CisgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSBtYXhWaWV3U3RhdGUgPSBuZXcgV2ViVmlld0NvcmUuVmlld1N0YXRlKCk7CisgICAgICAgIG1heFZpZXdTdGF0ZS5tTWF4U2NhbGUgPSBtYXhab29tU2NhbGUgLSAwLjFmOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVab29tUmFuZ2UobWF4Vmlld1N0YXRlLCAwLCAwKTsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgICAgIGRlZmF1bHRTY2FsZVRlc3QobmV3RGVmYXVsdFNjYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5V2l0aExhcmdlTWF4Wm9vbSgpIHsKKyAgICAgICAgLy8gdGVzdCB0aGUgY2FzZSB3aGVyZSB0aGUgbWF4Wm9vbVNjYWxlIGhhcyBjaGFuZ2VkIHRvIGJlID4gdGhlIGRlZmF1bHQKKyAgICAgICAgZmxvYXQgbmV3RGVmYXVsdFNjYWxlID0gMS41MGY7CisgICAgICAgIGZsb2F0IG1heFpvb21TY2FsZSA9IFpvb21NYW5hZ2VyLkRFRkFVTFRfTUFYX1pPT01fU0NBTEVfRkFDVE9SICogbmV3RGVmYXVsdFNjYWxlOworICAgICAgICBXZWJWaWV3Q29yZS5WaWV3U3RhdGUgbWF4Vmlld1N0YXRlID0gbmV3IFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSgpOworICAgICAgICBtYXhWaWV3U3RhdGUubU1heFNjYWxlID0gbWF4Wm9vbVNjYWxlICsgMC4xZjsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlWm9vbVJhbmdlKG1heFZpZXdTdGF0ZSwgMCwgMCk7CisgICAgICAgIHpvb21NYW5hZ2VyLnVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShuZXdEZWZhdWx0U2NhbGUpOworICAgICAgICBkZWZhdWx0U2NhbGVUZXN0KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbXB1dGVTY2FsZVdpdGhMaW1pdHMoKSB7CisgICAgICAgIGZpbmFsIGZsb2F0IG1heFNjYWxlID0gem9vbU1hbmFnZXIuZ2V0TWF4Wm9vbVNjYWxlKCk7CisgICAgICAgIGZpbmFsIGZsb2F0IG1pblNjYWxlID0gem9vbU1hbmFnZXIuZ2V0TWluWm9vbVNjYWxlKCk7CisgICAgICAgIGFzc2VydFRydWUobWF4U2NhbGUgPiBtaW5TY2FsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtYXhTY2FsZSwgem9vbU1hbmFnZXIuY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhtYXhTY2FsZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMobWF4U2NhbGUsIHpvb21NYW5hZ2VyLmNvbXB1dGVTY2FsZVdpdGhMaW1pdHMobWF4U2NhbGUgKyAuMDFmKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtaW5TY2FsZSwgem9vbU1hbmFnZXIuY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhtaW5TY2FsZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMobWluU2NhbGUsIHpvb21NYW5hZ2VyLmNvbXB1dGVTY2FsZVdpdGhMaW1pdHMobWluU2NhbGUgLSAuMDFmKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFjdHVhbFNjYWxlVGVzdChmbG9hdCBhY3R1YWxTY2FsZSkgeworICAgICAgICBhc3NlcnRFcXVhbHMoYWN0dWFsU2NhbGUsIHpvb21NYW5hZ2VyLmdldFNjYWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSAvIGFjdHVhbFNjYWxlLCB6b29tTWFuYWdlci5nZXRJbnZTY2FsZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVmYXVsdFNjYWxlVGVzdChmbG9hdCBkZWZhdWx0U2NhbGUpIHsKKyAgICAgICAgZmluYWwgZmxvYXQgbWF4RGVmYXVsdCA9IFpvb21NYW5hZ2VyLkRFRkFVTFRfTUFYX1pPT01fU0NBTEVfRkFDVE9SICogZGVmYXVsdFNjYWxlOworICAgICAgICBmaW5hbCBmbG9hdCBtaW5EZWZhdWx0ID0gWm9vbU1hbmFnZXIuREVGQVVMVF9NSU5fWk9PTV9TQ0FMRV9GQUNUT1IgKiBkZWZhdWx0U2NhbGU7CisgICAgICAgIGFzc2VydEVxdWFscyhkZWZhdWx0U2NhbGUsIHpvb21NYW5hZ2VyLmdldERlZmF1bHRTY2FsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEgLyBkZWZhdWx0U2NhbGUsIHpvb21NYW5hZ2VyLmdldEludkRlZmF1bHRTY2FsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1heERlZmF1bHQsIHpvb21NYW5hZ2VyLmdldERlZmF1bHRNYXhab29tU2NhbGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtaW5EZWZhdWx0LCB6b29tTWFuYWdlci5nZXREZWZhdWx0TWluWm9vbVNjYWxlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIzYjUxNi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0QmFzaWNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC53aWRnZXQuZXhwYW5kYWJsZWxpc3R2aWV3OwotCi1pbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5FeHBhbmRhYmxlTGlzdFNjZW5hcmlvOwotaW1wb3J0IGFuZHJvaWQudXRpbC5MaXN0VXRpbDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRXhwYW5kYWJsZUxpc3RTY2VuYXJpby5NeUdyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEV4cGFuZGFibGVMaXN0QmFzaWNUZXN0IGV4dGVuZHMgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8RXhwYW5kYWJsZUxpc3RTaW1wbGU+IHsKLSAgICBwcml2YXRlIEV4cGFuZGFibGVMaXN0U2NlbmFyaW8gbUFjdGl2aXR5OwotICAgIHByaXZhdGUgRXhwYW5kYWJsZUxpc3RWaWV3IG1FeHBhbmRhYmxlTGlzdFZpZXc7Ci0gICAgcHJpdmF0ZSBFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7Ci0gICAgcHJpdmF0ZSBMaXN0VXRpbCBtTGlzdFV0aWw7Ci0gICAgCi0gICAgcHVibGljIEV4cGFuZGFibGVMaXN0QmFzaWNUZXN0KCkgewotICAgICAgICBzdXBlcihFeHBhbmRhYmxlTGlzdFNpbXBsZS5jbGFzcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgCi0gICAgICAgIG1BY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7Ci0gICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcgPSBtQWN0aXZpdHkuZ2V0RXhwYW5kYWJsZUxpc3RWaWV3KCk7Ci0gICAgICAgIG1BZGFwdGVyID0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRFeHBhbmRhYmxlTGlzdEFkYXB0ZXIoKTsKLSAgICAgICAgbUxpc3RVdGlsID0gbmV3IExpc3RVdGlsKG1FeHBhbmRhYmxlTGlzdFZpZXcsIGdldEluc3RydW1lbnRhdGlvbigpKTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlY29uZGl0aW9ucygpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtQWN0aXZpdHkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1FeHBhbmRhYmxlTGlzdFZpZXcpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBleHBhbmRHcm91cChpbnQgbnVtQ2hpbGRyZW4sIGJvb2xlYW4gYXRMZWFzdE9uZUNoaWxkKSB7Ci0gICAgICAgIGZpbmFsIGludCBncm91cFBvcyA9IG1BY3Rpdml0eS5maW5kR3JvdXBXaXRoTnVtQ2hpbGRyZW4obnVtQ2hpbGRyZW4sIGF0TGVhc3RPbmVDaGlsZCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkNvdWxkIG5vdCBmaW5kIGdyb3VwIHRvIGV4cGFuZCIsIGdyb3VwUG9zID49IDApOwotCi0gICAgICAgIGFzc2VydEZhbHNlKCJHcm91cCBpcyBhbHJlYWR5IGV4cGFuZGVkIiwgbUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoZ3JvdXBQb3MpKTsKLSAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGdyb3VwUG9zKTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIHNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiR3JvdXAgZGlkIG5vdCBleHBhbmQiLCBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZChncm91cFBvcykpOwotCi0gICAgICAgIHJldHVybiBncm91cFBvczsKLSAgICB9Ci0KLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBhbmRHcm91cCgpIHsKLSAgICAgICAgZXhwYW5kR3JvdXAoLTEsIHRydWUpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb2xsYXBzZUdyb3VwKCkgewotICAgICAgICBmaW5hbCBpbnQgZ3JvdXBQb3MgPSBleHBhbmRHcm91cCgtMSwgdHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBzZW5kS2V5cyhLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJHcm91cCBkaWQgbm90IGNvbGxhcHNlIiwgbUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoZ3JvdXBQb3MpKTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwYW5kZWRHcm91cE1vdmVtZW50KCkgewotICAgICAgICAvLyBFeHBhbmQgdGhlIGZpcnN0IGdyb3VwCi0gICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbigwKTsKLSAgICAgICAgc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotCi0gICAgICAgIC8vIEVuc3VyZSBpdCBleHBhbmRlZAotICAgICAgICBhc3NlcnRUcnVlKCJHcm91cCBkaWQgbm90IGV4cGFuZCIsIG1FeHBhbmRhYmxlTGlzdFZpZXcuaXNHcm91cEV4cGFuZGVkKDApKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdhaXQgdW50aWwgdGhhdCdzIGFsbCBnb29kCi0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICAKLSAgICAgICAgLy8gTWFrZSBzdXJlIGl0IGV4cGFuZGVkCi0gICAgICAgIGFzc2VydFRydWUoIkdyb3VwIGRpZCBub3QgZXhwYW5kIiwgbUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoMCkpOwotICAgICAgICAKLSAgICAgICAgLy8gSW5zZXJ0IGEgY29sbGFwc2VkIGdyb3VwIGluIGZyb250IG9mIHRoZSBvbmUganVzdCBleHBhbmRlZAotICAgICAgICBMaXN0PE15R3JvdXA+IGdyb3VwcyA9IG1BY3Rpdml0eS5nZXRHcm91cHMoKTsKLSAgICAgICAgTXlHcm91cCBpbnNlcnRlZEdyb3VwID0gbmV3IE15R3JvdXAoMSk7Ci0gICAgICAgIGdyb3Vwcy5hZGQoMCwgaW5zZXJ0ZWRHcm91cCk7Ci0gICAgICAgIAotICAgICAgICAvLyBOb3RpZnkgZGF0YSBjaGFuZ2UKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQWRhcHRlciBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdGhlIGJhc2UgYWRhcHRlciIsCi0gICAgICAgICAgICAgICAgbUFkYXB0ZXIgaW5zdGFuY2VvZiBCYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyKTsKLSAgICAgICAgZmluYWwgQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlciBhZGFwdGVyID0gKEJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIpIG1BZGFwdGVyOwotICAgICAKLSAgICAgICAgbUFjdGl2aXR5LnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICAKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByaWdodCBncm91cCBpcyBleHBhbmRlZAotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgZXhwYW5kZWQgc3RhdGUgZGlkbid0IHN0YXkgd2l0aCB0aGUgcHJvcGVyIGdyb3VwIiwKLSAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgxKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJUaGUgZXhwYW5kZWQgc3RhdGUgd2FzIGdpdmVuIHRvIHRoZSBpbnNlcnRlZCBncm91cCIsCi0gICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoMCkpOwotICAgIH0KLQotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnRleHRNZW51cygpIHsKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgdGVzdGVyID0gbmV3IEV4cGFuZGFibGVMaXN0VGVzdGVyKG1FeHBhbmRhYmxlTGlzdFZpZXcsIHRoaXMpOwotICAgICAgICB0ZXN0ZXIudGVzdENvbnRleHRNZW51cygpOwotICAgIH0KLQotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRpb25CZXR3ZWVuRmxhdEFuZFBhY2tlZCgpIHsKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgdGVzdGVyID0gbmV3IEV4cGFuZGFibGVMaXN0VGVzdGVyKG1FeHBhbmRhYmxlTGlzdFZpZXcsIHRoaXMpOwotICAgICAgICB0ZXN0ZXIudGVzdENvbnZlcnRpb25CZXR3ZWVuRmxhdEFuZFBhY2tlZE9uR3JvdXBzKCk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25DaGlsZHJlbigpOwotICAgIH0KLQotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGVkUG9zaXRpb24oKSB7Ci0gICAgICAgIEV4cGFuZGFibGVMaXN0VGVzdGVyIHRlc3RlciA9IG5ldyBFeHBhbmRhYmxlTGlzdFRlc3RlcihtRXhwYW5kYWJsZUxpc3RWaWV3LCB0aGlzKTsKLSAgICAgICAgdGVzdGVyLnRlc3RTZWxlY3RlZFBvc2l0aW9uT25Hcm91cHMoKTsKLSAgICAgICAgdGVzdGVyLnRlc3RTZWxlY3RlZFBvc2l0aW9uT25DaGlsZHJlbigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RTaW1wbGUuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RTaW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhkYjI4Yy4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0U2ltcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtLk9uTWVudUl0ZW1DbGlja0xpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXI7Ci0KLWltcG9ydCBhbmRyb2lkLnV0aWwuRXhwYW5kYWJsZUxpc3RTY2VuYXJpbzsKLQotcHVibGljIGNsYXNzIEV4cGFuZGFibGVMaXN0U2ltcGxlIGV4dGVuZHMgRXhwYW5kYWJsZUxpc3RTY2VuYXJpbyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gTlVNX0NISUxEUkVOID0gezQsIDMsIDIsIDEsIDB9OwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdChFeHBhbmRhYmxlUGFyYW1zIHBhcmFtcykgewotICAgICAgICBwYXJhbXMuc2V0TnVtQ2hpbGRyZW4oTlVNX0NISUxEUkVOKQotICAgICAgICAgICAgICAgIC5zZXRJdGVtU2NyZWVuU2l6ZUZhY3RvcigwLjE0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgewotCi0gICAgICAgIG1lbnUuYWRkKCJBZGQgaXRlbSIpLnNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKG5ldyBPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1DbGljayhNZW51SXRlbSBpdGVtKSB7Ci0gICAgICAgICAgICAgICAgbUdyb3Vwcy5hZGQoMCwgbmV3IE15R3JvdXAoMikpOwotICAgICAgICAgICAgICAgICgoQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcikgbUFkYXB0ZXIpLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFRlc3Rlci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmIxMGZiLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5FeHBhbmRhYmxlTGlzdFNjZW5hcmlvOwotaW1wb3J0IGFuZHJvaWQudXRpbC5MaXN0VXRpbDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLXB1YmxpYyBjbGFzcyBFeHBhbmRhYmxlTGlzdFRlc3RlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBFeHBhbmRhYmxlTGlzdFZpZXcgbUV4cGFuZGFibGVMaXN0VmlldzsKLSAgICBwcml2YXRlIGZpbmFsIEV4cGFuZGFibGVMaXN0QWRhcHRlciBtQWRhcHRlcjsKLSAgICBwcml2YXRlIGZpbmFsIExpc3RVdGlsIG1MaXN0VXRpbDsKLQotICAgIHByaXZhdGUgZmluYWwgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8PyBleHRlbmRzIEV4cGFuZGFibGVMaXN0U2NlbmFyaW8+Ci0gICAgICAgIG1BY3Rpdml0eUluc3RydW1lbnRhdGlvbjsKLQotICAgIEluc3RydW1lbnRhdGlvbiBtSW5zdHJ1bWVudGF0aW9uOwotCi0gICAgcHVibGljIEV4cGFuZGFibGVMaXN0VGVzdGVyKAotICAgICAgICAgICAgRXhwYW5kYWJsZUxpc3RWaWV3IGV4cGFuZGFibGVMaXN0VmlldywKLSAgICAgICAgICAgIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPD8gZXh0ZW5kcyBFeHBhbmRhYmxlTGlzdFNjZW5hcmlvPgotICAgICAgICAgICAgYWN0aXZpdHlJbnN0cnVtZW50YXRpb24pIHsKLSAgICAgICAgbUV4cGFuZGFibGVMaXN0VmlldyA9IGV4cGFuZGFibGVMaXN0VmlldzsKLSAgICAgICAgSW5zdHJ1bWVudGF0aW9uIGluc3RydW1lbnRhdGlvbiA9IGFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uLmdldEluc3RydW1lbnRhdGlvbigpOwotICAgICAgICBtTGlzdFV0aWwgPSBuZXcgTGlzdFV0aWwobUV4cGFuZGFibGVMaXN0VmlldywgaW5zdHJ1bWVudGF0aW9uKTsKLSAgICAgICAgbUFkYXB0ZXIgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEV4cGFuZGFibGVMaXN0QWRhcHRlcigpOwotICAgICAgICBtQWN0aXZpdHlJbnN0cnVtZW50YXRpb24gPSBhY3Rpdml0eUluc3RydW1lbnRhdGlvbjsKLSAgICAgICAgbUluc3RydW1lbnRhdGlvbiA9IG1BY3Rpdml0eUluc3RydW1lbnRhdGlvbi5nZXRJbnN0cnVtZW50YXRpb24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXhwYW5kR3JvdXAoZmluYWwgaW50IGdyb3VwSW5kZXgsIGludCBmbGF0UG9zaXRpb24pIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKCJHcm91cCBpcyBhbHJlYWR5IGV4cGFuZGVkIiwgbUV4cGFuZGFibGVMaXN0VmlldwotICAgICAgICAgICAgICAgIC5pc0dyb3VwRXhwYW5kZWQoZ3JvdXBJbmRleCkpOwotICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oZmxhdFBvc2l0aW9uKTsKLSAgICAgICAgbUluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgbUFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uLnNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotICAgICAgICBtQWN0aXZpdHlJbnN0cnVtZW50YXRpb24uZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJHcm91cCBkaWQgbm90IGV4cGFuZCAiICsgZ3JvdXBJbmRleCwgCi0gICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoZ3JvdXBJbmRleCkpOwotICAgIH0KLQotICAgIHZvaWQgdGVzdENvbnRleHRNZW51cygpIHsKLSAgICAgICAgLy8gQWRkIGEgcG9zaXRpb24gdGVzdGVyIENvbnRleHRNZW51IGxpc3RlbmVyIHRvIHRoZSBFeHBhbmRhYmxlTGlzdFZpZXcKLSAgICAgICAgUG9zaXRpb25UZXN0ZXJDb250ZXh0TWVudUxpc3RlbmVyIG1lbnVMaXN0ZW5lciA9IG5ldyBQb3NpdGlvblRlc3RlckNvbnRleHRNZW51TGlzdGVuZXIoKTsKLSAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5zZXRPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIobWVudUxpc3RlbmVyKTsKLQotICAgICAgICBpbnQgaW5kZXggPSAwOwotCi0gICAgICAgIC8vIFNjcm9sbGluZyBvbiBoZWFkZXIgZWxlbWVudHMgc2hvdWxkIHRyaWdnZXIgYW4gQWRhcHRlckNvbnRleHRNZW51Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEhlYWRlclZpZXdzQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBDaGVjayBncm91cCBpbmRleCBpbiBjb250ZXh0IG1lbnUKLSAgICAgICAgICAgIG1lbnVMaXN0ZW5lci5leHBlY3RBZGFwdGVyQ29udGV4dE1lbnUoaSk7Ci0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGdyb3VwIGlzIHZpc2libGUgc28gdGhhdCBnZXRDaGlsZCBmaW5kcyBpdAotICAgICAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGluZGV4KTsKLSAgICAgICAgICAgIFZpZXcgaGVhZGVyQ2hpbGQgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldENoaWxkQXQoaW5kZXgKLSAgICAgICAgICAgICAgICAgICAgLSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCkpOwotICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5zaG93Q29udGV4dE1lbnVGb3JDaGlsZChoZWFkZXJDaGlsZCk7Ci0gICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwobWVudUxpc3RlbmVyLmdldEVycm9yTWVzc2FnZSgpLCBtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCkpOwotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBncm91cENvdW50ID0gbUFkYXB0ZXIuZ2V0R3JvdXBDb3VudCgpOwotICAgICAgICBmb3IgKGludCBncm91cEluZGV4ID0gMDsgZ3JvdXBJbmRleCA8IGdyb3VwQ291bnQ7IGdyb3VwSW5kZXgrKykgewotCi0gICAgICAgICAgICAvLyBFeHBhbmQgZ3JvdXAKLSAgICAgICAgICAgIGV4cGFuZEdyb3VwKGdyb3VwSW5kZXgsIGluZGV4KTsKLQotICAgICAgICAgICAgLy8gQ2hlY2sgZ3JvdXAgaW5kZXggaW4gY29udGV4dCBtZW51Ci0gICAgICAgICAgICBtZW51TGlzdGVuZXIuZXhwZWN0R3JvdXBDb250ZXh0TWVudShncm91cEluZGV4KTsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZ3JvdXAgaXMgdmlzaWJsZSBzbyB0aGF0IGdldENoaWxkIGZpbmRzIGl0Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgVmlldyBncm91cENoaWxkID0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRDaGlsZEF0KGluZGV4Ci0gICAgICAgICAgICAgICAgICAgIC0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpKTsKLSAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuc2hvd0NvbnRleHRNZW51Rm9yQ2hpbGQoZ3JvdXBDaGlsZCk7Ci0gICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwobWVudUxpc3RlbmVyLmdldEVycm9yTWVzc2FnZSgpLCBtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCkpOwotICAgICAgICAgICAgaW5kZXgrKzsKLQotICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkcmVuQ291bnQgPSBtQWRhcHRlci5nZXRDaGlsZHJlbkNvdW50KGdyb3VwSW5kZXgpOwotICAgICAgICAgICAgZm9yIChpbnQgY2hpbGRJbmRleCA9IDA7IGNoaWxkSW5kZXggPCBjaGlsZHJlbkNvdW50OyBjaGlsZEluZGV4KyspIHsKLSAgICAgICAgICAgICAgICAvLyBDaGVjayBjaGlsZCBpbmRleCBpbiBjb250ZXh0IG1lbnUKLSAgICAgICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgICAgIG1lbnVMaXN0ZW5lci5leHBlY3RDaGlsZENvbnRleHRNZW51KGdyb3VwSW5kZXgsIGNoaWxkSW5kZXgpOwotICAgICAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldENoaWxkQXQoaW5kZXgKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpKTsKLSAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNob3dDb250ZXh0TWVudUZvckNoaWxkKGNoaWxkKTsKLSAgICAgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnROdWxsKG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSwgbWVudUxpc3RlbmVyLmdldEVycm9yTWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2Nyb2xsaW5nIG9uIGZvb3RlciBlbGVtZW50cyBzaG91bGQgdHJpZ2dlciBhbiBBZGFwdGVyQ29udGV4dE1lbnUKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Rm9vdGVyVmlld3NDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIC8vIENoZWNrIGdyb3VwIGluZGV4IGluIGNvbnRleHQgbWVudQotICAgICAgICAgICAgbWVudUxpc3RlbmVyLmV4cGVjdEFkYXB0ZXJDb250ZXh0TWVudShpbmRleCk7Ci0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGdyb3VwIGlzIHZpc2libGUgc28gdGhhdCBnZXRDaGlsZCBmaW5kcyBpdAotICAgICAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGluZGV4KTsKLSAgICAgICAgICAgIFZpZXcgZm9vdGVyQ2hpbGQgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldENoaWxkQXQoaW5kZXgKLSAgICAgICAgICAgICAgICAgICAgLSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCkpOwotICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5zaG93Q29udGV4dE1lbnVGb3JDaGlsZChmb290ZXJDaGlsZCk7Ci0gICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwobWVudUxpc3RlbmVyLmdldEVycm9yTWVzc2FnZSgpLCBtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCkpOwotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENsZWFudXA6IHJlbW92ZSB0aGUgbGlzdGVuZXIgd2UgYWRkZWQuCi0gICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuc2V0T25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyKG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGV4cGFuZEFHcm91cCgpIHsKLSAgICAgICAgZmluYWwgaW50IGdyb3VwSW5kZXggPSAyOwotICAgICAgICBmaW5hbCBpbnQgaGVhZGVyQ291bnQgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEhlYWRlclZpZXdzQ291bnQoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIk5vdCBlbm91Z2ggZ3JvdXBzIiwgZ3JvdXBJbmRleCA8IG1BZGFwdGVyLmdldEdyb3VwQ291bnQoKSk7Ci0gICAgICAgIGV4cGFuZEdyb3VwKGdyb3VwSW5kZXgsIGdyb3VwSW5kZXggKyBoZWFkZXJDb3VudCk7Ci0gICAgICAgIHJldHVybiBncm91cEluZGV4OwotICAgIH0KLQotICAgIC8vIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCBOTyBncm91cCBpcyBleHBhbmRlZCB3aGVuIGNhbGxlZAotICAgIHZvaWQgdGVzdENvbnZlcnRpb25CZXR3ZWVuRmxhdEFuZFBhY2tlZE9uR3JvdXBzKCkgewotICAgICAgICBmaW5hbCBpbnQgaGVhZGVyQ291bnQgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEhlYWRlclZpZXdzQ291bnQoKTsKLQotICAgICAgICBmb3IgKGludCBpPTA7IGk8aGVhZGVyQ291bnQ7IGkrKykgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiTm9uIE5VTEwgcG9zaXRpb24gZm9yIGhlYWRlciBpdGVtIiwKLSAgICAgICAgICAgICAgICAgICAgRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9WQUxVRV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEV4cGFuZGFibGVMaXN0UG9zaXRpb24oaSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGVzdCBhbGwgKG5vbiBleHBhbmRlZCkgZ3JvdXBzCi0gICAgICAgIGZpbmFsIGludCBncm91cENvdW50ID0gbUFkYXB0ZXIuZ2V0R3JvdXBDb3VudCgpOwotICAgICAgICBmb3IgKGludCBncm91cEluZGV4ID0gMDsgZ3JvdXBJbmRleCA8IGdyb3VwQ291bnQ7IGdyb3VwSW5kZXgrKykgewotICAgICAgICAgICAgaW50IGV4cGVjdGVkRmxhdFBvc2l0aW9uID0gaGVhZGVyQ291bnQgKyBncm91cEluZGV4OwotICAgICAgICAgICAgbG9uZyBwYWNrZWRQb3NpdGlvbkZvckdyb3VwID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yR3JvdXAoZ3JvdXBJbmRleCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJHcm91cCBub3QgZm91bmQgYXQgZmxhdCBwb3NpdGlvbiAiICsgZXhwZWN0ZWRGbGF0UG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIHBhY2tlZFBvc2l0aW9uRm9yR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RQb3NpdGlvbihleHBlY3RlZEZsYXRQb3NpdGlvbikpOwotCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJXcm9uZyBmbGF0IHBvc2l0aW9uIGZvciBncm91cCAiICsgZ3JvdXBJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRGbGF0UG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RmxhdExpc3RQb3NpdGlvbihwYWNrZWRQb3NpdGlvbkZvckdyb3VwKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpPTA7IGk8bUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGb290ZXJWaWV3c0NvdW50KCk7IGkrKykgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiTm9uIE5VTEwgcG9zaXRpb24gZm9yIGhlYWRlciBpdGVtIiwKLSAgICAgICAgICAgICAgICAgICAgRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9WQUxVRV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEV4cGFuZGFibGVMaXN0UG9zaXRpb24oaGVhZGVyQ291bnQgKyBncm91cENvdW50ICsgaSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IE5PIGdyb3VwIGlzIGV4cGFuZGVkIHdoZW4gY2FsbGVkCi0gICAgdm9pZCB0ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25DaGlsZHJlbigpIHsKLSAgICAgICAgLy8gVGVzdCB3aXRoIGFuIGV4cGFuZGVkIGdyb3VwCi0gICAgICAgIGZpbmFsIGludCBoZWFkZXJDb3VudCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOwotICAgICAgICBmaW5hbCBpbnQgZ3JvdXBJbmRleCA9IGV4cGFuZEFHcm91cCgpOwotCi0gICAgICAgIGZpbmFsIGludCBjaGlsZHJlbkNvdW50ID0gbUFkYXB0ZXIuZ2V0Q2hpbGRyZW5Db3VudChncm91cEluZGV4KTsKLSAgICAgICAgZm9yIChpbnQgY2hpbGRJbmRleCA9IDA7IGNoaWxkSW5kZXggPCBjaGlsZHJlbkNvdW50OyBjaGlsZEluZGV4KyspIHsKLSAgICAgICAgICAgIGludCBleHBlY3RlZEZsYXRQb3NpdGlvbiA9IGhlYWRlckNvdW50ICsgZ3JvdXBJbmRleCArIDEgKyBjaGlsZEluZGV4OwotICAgICAgICAgICAgbG9uZyBjaGlsZFBvcyA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkZvckNoaWxkKGdyb3VwSW5kZXgsIGNoaWxkSW5kZXgpOwotCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJXcm9uZyBmbGF0IHBvc2l0aW9uIGZvciBjaGlsZCAiLAotICAgICAgICAgICAgICAgICAgICBjaGlsZFBvcywKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRFeHBhbmRhYmxlTGlzdFBvc2l0aW9uKGV4cGVjdGVkRmxhdFBvc2l0aW9uKSk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIldyb25nIGZsYXQgcG9zaXRpb24gZm9yIGNoaWxkICIsCi0gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkRmxhdFBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZsYXRMaXN0UG9zaXRpb24oY2hpbGRQb3MpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCBOTyBncm91cCBpcyBleHBhbmRlZCB3aGVuIGNhbGxlZAotICAgIHZvaWQgdGVzdFNlbGVjdGVkUG9zaXRpb25Pbkdyb3VwcygpIHsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLQotICAgICAgICAvLyBTY3JvbGxpbmcgb24gaGVhZGVyIGVsZW1lbnRzIHNob3VsZCBub3QgZ2l2ZSBhIHZhbGlkIHNlbGVjdGVkIHBvc2l0aW9uLgotICAgICAgICBmb3IgKGludCBpPTA7IGk8bUV4cGFuZGFibGVMaXN0Vmlldy5nZXRIZWFkZXJWaWV3c0NvdW50KCk7IGkrKykgewotICAgICAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGluZGV4KTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkhlYWRlciBpdGVtIGlzIHNlbGVjdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9WQUxVRV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldFNlbGVjdGVkUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgc2VsZWN0aW9uIG9uIGdyb3VwIGl0ZW1zCi0gICAgICAgIGZpbmFsIGludCBncm91cENvdW50ID0gbUFkYXB0ZXIuZ2V0R3JvdXBDb3VudCgpOwotICAgICAgICBmb3IgKGludCBncm91cEluZGV4ID0gMDsgZ3JvdXBJbmRleCA8IGdyb3VwQ291bnQ7IGdyb3VwSW5kZXgrKykgewotICAgICAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGluZGV4KTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdyb3VwIGl0ZW0gaXMgbm90IHNlbGVjdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yR3JvdXAoZ3JvdXBJbmRleCksCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0U2VsZWN0ZWRQb3NpdGlvbigpKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTY3JvbGxpbmcgb24gZm9vdGVyIGVsZW1lbnRzIHNob3VsZCBub3QgZ2l2ZSBhIHZhbGlkIHNlbGVjdGVkIHBvc2l0aW9uLgotICAgICAgICBmb3IgKGludCBpPTA7IGk8bUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGb290ZXJWaWV3c0NvdW50KCk7IGkrKykgewotICAgICAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGluZGV4KTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkZvb3RlciBpdGVtIGlzIHNlbGVjdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9WQUxVRV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldFNlbGVjdGVkUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IE5PIGdyb3VwIGlzIGV4cGFuZGVkIHdoZW4gY2FsbGVkCi0gICAgdm9pZCB0ZXN0U2VsZWN0ZWRQb3NpdGlvbk9uQ2hpbGRyZW4oKSB7Ci0gICAgICAgIC8vIFRlc3Qgd2l0aCBhbiBleHBhbmRlZCBncm91cAotICAgICAgICBmaW5hbCBpbnQgaGVhZGVyQ291bnQgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEhlYWRlclZpZXdzQ291bnQoKTsKLSAgICAgICAgZmluYWwgaW50IGdyb3VwSW5kZXggPSBleHBhbmRBR3JvdXAoKTsKLQotICAgICAgICBmaW5hbCBpbnQgY2hpbGRyZW5Db3VudCA9IG1BZGFwdGVyLmdldENoaWxkcmVuQ291bnQoZ3JvdXBJbmRleCk7Ci0gICAgICAgIGZvciAoaW50IGNoaWxkSW5kZXggPSAwOyBjaGlsZEluZGV4IDwgY2hpbGRyZW5Db3VudDsgY2hpbGRJbmRleCsrKSB7Ci0gICAgICAgICAgICBpbnQgY2hpbGRGbGF0UG9zaXRpb24gPSBoZWFkZXJDb3VudCArIGdyb3VwSW5kZXggKyAxICsgY2hpbGRJbmRleDsKLSAgICAgICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihjaGlsZEZsYXRQb3NpdGlvbik7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJHcm91cCBpdGVtIGlzIG5vdCBzZWxlY3RlZCIsCi0gICAgICAgICAgICAgICAgICAgIEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkZvckNoaWxkKGdyb3VwSW5kZXgsIGNoaWxkSW5kZXgpLAotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldFNlbGVjdGVkUG9zaXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0V2l0aEhlYWRlcnMuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjUxYzFkLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC53aWRnZXQuZXhwYW5kYWJsZWxpc3R2aWV3OwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkV4cGFuZGFibGVMaXN0U2NlbmFyaW87Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKLQotcHVibGljIGNsYXNzIEV4cGFuZGFibGVMaXN0V2l0aEhlYWRlcnMgZXh0ZW5kcyBFeHBhbmRhYmxlTGlzdFNjZW5hcmlvIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBzTnVtQ2hpbGRyZW4gPSB7MSwgNCwgMywgMiwgNn07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHNOdW1PZkhlYWRlcnNBbmRGb290ZXJzID0gMTI7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdChFeHBhbmRhYmxlUGFyYW1zIHBhcmFtcykgewotICAgICAgICBwYXJhbXMuc2V0U3RhY2tGcm9tQm90dG9tKGZhbHNlKQotICAgICAgICAgICAgICAgIC5zZXRTdGFydGluZ1NlbGVjdGlvblBvc2l0aW9uKC0xKQotICAgICAgICAgICAgICAgIC5zZXROdW1DaGlsZHJlbihzTnVtQ2hpbGRyZW4pCi0gICAgICAgICAgICAgICAgLnNldEl0ZW1TY3JlZW5TaXplRmFjdG9yKDAuMTQpCi0gICAgICAgICAgICAgICAgLnNldENvbm5lY3RBZGFwdGVyKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7Ci0KLSAgICAgICAgZmluYWwgRXhwYW5kYWJsZUxpc3RWaWV3IGV4cGFuZGFibGVMaXN0VmlldyA9IGdldEV4cGFuZGFibGVMaXN0VmlldygpOwotICAgICAgICBleHBhbmRhYmxlTGlzdFZpZXcuc2V0SXRlbXNDYW5Gb2N1cyh0cnVlKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNOdW1PZkhlYWRlcnNBbmRGb290ZXJzOyBpKyspIHsKLSAgICAgICAgICAgIEJ1dHRvbiBoZWFkZXIgPSBuZXcgQnV0dG9uKHRoaXMpOwotICAgICAgICAgICAgaGVhZGVyLnNldFRleHQoIkhlYWRlciBWaWV3ICIgKyBpKTsKLSAgICAgICAgICAgIGV4cGFuZGFibGVMaXN0Vmlldy5hZGRIZWFkZXJWaWV3KGhlYWRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNOdW1PZkhlYWRlcnNBbmRGb290ZXJzOyBpKyspIHsKLSAgICAgICAgICAgIEJ1dHRvbiBmb290ZXIgPSBuZXcgQnV0dG9uKHRoaXMpOwotICAgICAgICAgICAgZm9vdGVyLnNldFRleHQoIkZvb3RlciBWaWV3ICIgKyBpKTsKLSAgICAgICAgICAgIGV4cGFuZGFibGVMaXN0Vmlldy5hZGRGb290ZXJWaWV3KGZvb3Rlcik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFNldCBhZGFwdGVyIGhlcmUgQUZURVIgd2Ugc2V0IGhlYWRlciBhbmQgZm9vdGVyIHZpZXdzCi0gICAgICAgIHNldEFkYXB0ZXIoZXhwYW5kYWJsZUxpc3RWaWV3KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGhlYWRlcnMgKGFuZCB0aGUgc2FtZSBudW1iZXIgb2YgZm9vdGVycykKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE51bU9mSGVhZGVyc0FuZEZvb3RlcnMoKSB7Ci0gICAgICAgIHJldHVybiBzTnVtT2ZIZWFkZXJzQW5kRm9vdGVyczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0Yzg1My4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0V2l0aEhlYWRlcnNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTGlzdFV0aWw7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKLQotcHVibGljIGNsYXNzIEV4cGFuZGFibGVMaXN0V2l0aEhlYWRlcnNUZXN0IGV4dGVuZHMKLSAgICAgICAgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8RXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVycz4gewotICAgIHByaXZhdGUgRXhwYW5kYWJsZUxpc3RWaWV3IG1FeHBhbmRhYmxlTGlzdFZpZXc7Ci0gICAgcHJpdmF0ZSBMaXN0VXRpbCBtTGlzdFV0aWw7Ci0gICAgCi0gICAgcHVibGljIEV4cGFuZGFibGVMaXN0V2l0aEhlYWRlcnNUZXN0KCkgewotICAgICAgICBzdXBlcihFeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICAKLSAgICAgICAgbUV4cGFuZGFibGVMaXN0VmlldyA9IGdldEFjdGl2aXR5KCkuZ2V0RXhwYW5kYWJsZUxpc3RWaWV3KCk7Ci0gICAgICAgIG1MaXN0VXRpbCA9IG5ldyBMaXN0VXRpbChtRXhwYW5kYWJsZUxpc3RWaWV3LCBnZXRJbnN0cnVtZW50YXRpb24oKSk7Ci0gICAgfQotICAgIAotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFByZWNvbmRpdGlvbnMoKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobUV4cGFuZGFibGVMaXN0Vmlldyk7Ci0gICAgfQotICAgIAotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEV4cGFuZE9uRmlyc3RQb3NpdGlvbigpIHsKLSAgICAgICAgLy8gU2hvdWxkIGJlIGEgaGVhZGVyLCBhbmQgaGVuY2UgdGhlIGZpcnN0IGdyb3VwIHNob3VsZCBOT1QgaGF2ZSBleHBhbmRlZAotICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oMCk7Ci0gICAgICAgIHNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UobUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoMCkpOwotICAgIH0KLQotICAgIEBMYXJnZVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwYW5kT25GaXJzdEdyb3VwKCkgewotICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oZ2V0QWN0aXZpdHkoKS5nZXROdW1PZkhlYWRlcnNBbmRGb290ZXJzKCkpOwotICAgICAgICBzZW5kS2V5cyhLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIGFzc2VydFRydWUobUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoMCkpOwotICAgIH0KLQotICAgIEBMYXJnZVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGV4dE1lbnVzKCkgewotICAgICAgICBFeHBhbmRhYmxlTGlzdFRlc3RlciB0ZXN0ZXIgPSBuZXcgRXhwYW5kYWJsZUxpc3RUZXN0ZXIobUV4cGFuZGFibGVMaXN0VmlldywgdGhpcyk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udGV4dE1lbnVzKCk7Ci0gICAgfQotCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWQoKSB7Ci0gICAgICAgIEV4cGFuZGFibGVMaXN0VGVzdGVyIHRlc3RlciA9IG5ldyBFeHBhbmRhYmxlTGlzdFRlc3RlcihtRXhwYW5kYWJsZUxpc3RWaWV3LCB0aGlzKTsKLSAgICAgICAgdGVzdGVyLnRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWRPbkdyb3VwcygpOwotICAgICAgICB0ZXN0ZXIudGVzdENvbnZlcnRpb25CZXR3ZWVuRmxhdEFuZFBhY2tlZE9uQ2hpbGRyZW4oKTsKLSAgICB9Ci0KLSAgICBATGFyZ2VUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGVkUG9zaXRpb24oKSB7Ci0gICAgICAgIEV4cGFuZGFibGVMaXN0VGVzdGVyIHRlc3RlciA9IG5ldyBFeHBhbmRhYmxlTGlzdFRlc3RlcihtRXhwYW5kYWJsZUxpc3RWaWV3LCB0aGlzKTsKLSAgICAgICAgdGVzdGVyLnRlc3RTZWxlY3RlZFBvc2l0aW9uT25Hcm91cHMoKTsKLSAgICAgICAgdGVzdGVyLnRlc3RTZWxlY3RlZFBvc2l0aW9uT25DaGlsZHJlbigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvSW5mbGF0ZWRFeHBhbmRhYmxlTGlzdFZpZXcuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvSW5mbGF0ZWRFeHBhbmRhYmxlTGlzdFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRjOWQ1Ni4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0luZmxhdGVkRXhwYW5kYWJsZUxpc3RWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC53aWRnZXQuZXhwYW5kYWJsZWxpc3R2aWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZnJhbWV3b3Jrcy5jb3JldGVzdHMuUjsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci0KLXB1YmxpYyBjbGFzcyBJbmZsYXRlZEV4cGFuZGFibGVMaXN0VmlldyBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgCi0gICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmluZmxhdGVkX2V4cGFuZGFibGVsaXN0dmlldyk7Ci0gICAgICAgIAotICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcgZWx2ID0gKEV4cGFuZGFibGVMaXN0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuZWx2KTsKLSAgICAgICAgZWx2LnNldEFkYXB0ZXIobmV3IE15RXhwYW5kYWJsZUxpc3RBZGFwdGVyKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBNeUV4cGFuZGFibGVMaXN0QWRhcHRlciBleHRlbmRzIEJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgewotICAgICAgICAvLyBTYW1wbGUgZGF0YSBzZXQuICBjaGlsZHJlbltpXSBjb250YWlucyB0aGUgY2hpbGRyZW4gKFN0cmluZ1tdKSBmb3IgZ3JvdXBzW2ldLgotICAgICAgICBwcml2YXRlIFN0cmluZ1tdIGdyb3VwcyA9IHsgIlBlb3BsZSBOYW1lcyIsICJEb2cgTmFtZXMiLCAiQ2F0IE5hbWVzIiwgIkZpc2ggTmFtZXMiIH07Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nW11bXSBjaGlsZHJlbiA9IHsKLSAgICAgICAgICAgICAgICB7ICJBcm5vbGQiLCAiQmFycnkiLCAiQ2h1Y2siLCAiRGF2aWQiIH0sCi0gICAgICAgICAgICAgICAgeyAiQWNlIiwgIkJhbmRpdCIsICJDaGEtQ2hhIiwgIkRldWNlIiB9LAotICAgICAgICAgICAgICAgIHsgIkZsdWZmeSIsICJTbnVnZ2xlcyIgfSwKLSAgICAgICAgICAgICAgICB7ICJHb2xkeSIsICJCdWJibGVzIiB9Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldENoaWxkKGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuW2dyb3VwUG9zaXRpb25dW2NoaWxkUG9zaXRpb25dOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgZ2V0Q2hpbGRJZChpbnQgZ3JvdXBQb3NpdGlvbiwgaW50IGNoaWxkUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZFBvc2l0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRDaGlsZHJlbkNvdW50KGludCBncm91cFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5bZ3JvdXBQb3NpdGlvbl0ubGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFRleHRWaWV3IGdldEdlbmVyaWNWaWV3KCkgewotICAgICAgICAgICAgLy8gTGF5b3V0IHBhcmFtZXRlcnMgZm9yIHRoZSBFeHBhbmRhYmxlTGlzdFZpZXcKLSAgICAgICAgICAgIEFic0xpc3RWaWV3LkxheW91dFBhcmFtcyBscCA9IG5ldyBBYnNMaXN0Vmlldy5MYXlvdXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCA2NCk7Ci0KLSAgICAgICAgICAgIFRleHRWaWV3IHRleHRWaWV3ID0gbmV3IFRleHRWaWV3KEluZmxhdGVkRXhwYW5kYWJsZUxpc3RWaWV3LnRoaXMpOwotICAgICAgICAgICAgdGV4dFZpZXcuc2V0TGF5b3V0UGFyYW1zKGxwKTsKLSAgICAgICAgICAgIC8vIENlbnRlciB0aGUgdGV4dCB2ZXJ0aWNhbGx5Ci0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMIHwgR3Jhdml0eS5MRUZUKTsKLSAgICAgICAgICAgIC8vIFNldCB0aGUgdGV4dCBzdGFydGluZyBwb3NpdGlvbgotICAgICAgICAgICAgdGV4dFZpZXcuc2V0UGFkZGluZygzNiwgMCwgMCwgMCk7Ci0gICAgICAgICAgICByZXR1cm4gdGV4dFZpZXc7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldENoaWxkVmlldyhpbnQgZ3JvdXBQb3NpdGlvbiwgaW50IGNoaWxkUG9zaXRpb24sIGJvb2xlYW4gaXNMYXN0Q2hpbGQsCi0gICAgICAgICAgICAgICAgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSBnZXRHZW5lcmljVmlldygpOwotICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dChnZXRDaGlsZChncm91cFBvc2l0aW9uLCBjaGlsZFBvc2l0aW9uKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0VmlldzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0R3JvdXAoaW50IGdyb3VwUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBncm91cHNbZ3JvdXBQb3NpdGlvbl07Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldEdyb3VwQ291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ3JvdXBzLmxlbmd0aDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIGdldEdyb3VwSWQoaW50IGdyb3VwUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBncm91cFBvc2l0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFZpZXcgZ2V0R3JvdXBWaWV3KGludCBncm91cFBvc2l0aW9uLCBib29sZWFuIGlzRXhwYW5kZWQsIFZpZXcgY29udmVydFZpZXcsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSBnZXRHZW5lcmljVmlldygpOwotICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dChnZXRHcm91cChncm91cFBvc2l0aW9uKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0VmlldzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2hpbGRTZWxlY3RhYmxlKGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdGFibGVJZHMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9Qb3NpdGlvblRlc3RlckNvbnRleHRNZW51TGlzdGVuZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvUG9zaXRpb25UZXN0ZXJDb250ZXh0TWVudUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYmRmZjguLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9Qb3NpdGlvblRlc3RlckNvbnRleHRNZW51TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3LkFkYXB0ZXJDb250ZXh0TWVudUluZm87Ci0KLXB1YmxpYyBjbGFzcyBQb3NpdGlvblRlc3RlckNvbnRleHRNZW51TGlzdGVuZXIgaW1wbGVtZW50cyBPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBpbnQgZ3JvdXBQb3NpdGlvbiwgY2hpbGRQb3NpdGlvbjsKLQotICAgIC8vIEZha2UgY29uc3RhbnQgdG8gc3RvcmUgaW4gdGVzdFR5cGUgYSB0ZXN0IHR5cGUgc3BlY2lmaWMgdG8gaGVhZGVycyBhbmQgZm9vdGVycwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBREFQVEVSX1RZUEUgPSAtMTsKLSAgICBwcml2YXRlIGludCB0ZXN0VHlwZTsgLy8gYXMgcmV0dXJuZWQgYnkgZ2V0UGFja2VkUG9zaXRpb25UeXBlCi0KLSAgICAvLyBXaWxsIGJlIHNldCB0byBudWxsIGJ5IGVhY2ggY2FsbCB0byBvbkNyZWF0ZUNvbnRleHRNZW51LCB1bmxlc3MgYW4gZXJyb3Igb2NjdXJyZWQuIAotICAgIHByaXZhdGUgU3RyaW5nIGVycm9yTWVzc2FnZTsKLQotICAgIHB1YmxpYyB2b2lkIGV4cGVjdEdyb3VwQ29udGV4dE1lbnUoaW50IGdyb3VwUG9zaXRpb24pIHsKLSAgICAgICAgdGhpcy5ncm91cFBvc2l0aW9uID0gZ3JvdXBQb3NpdGlvbjsKLSAgICAgICAgdGVzdFR5cGUgPSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfR1JPVVA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhwZWN0Q2hpbGRDb250ZXh0TWVudShpbnQgZ3JvdXBQb3NpdGlvbiwgaW50IGNoaWxkUG9zaXRpb24pIHsKLSAgICAgICAgdGhpcy5ncm91cFBvc2l0aW9uID0gZ3JvdXBQb3NpdGlvbjsKLSAgICAgICAgdGhpcy5jaGlsZFBvc2l0aW9uID0gY2hpbGRQb3NpdGlvbjsKLSAgICAgICAgdGVzdFR5cGUgPSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfQ0hJTEQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhwZWN0QWRhcHRlckNvbnRleHRNZW51KGludCBmbGF0UG9zaXRpb24pIHsKLSAgICAgICAgdGhpcy5ncm91cFBvc2l0aW9uID0gZmxhdFBvc2l0aW9uOwotICAgICAgICB0ZXN0VHlwZSA9IEFEQVBURVJfVFlQRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51IG1lbnUsIFZpZXcgdiwgQ29udGV4dE1lbnVJbmZvIG1lbnVJbmZvKSB7Ci0gICAgICAgIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0gICAgICAgIGlmICh0ZXN0VHlwZSA9PSBBREFQVEVSX1RZUEUpIHsKLSAgICAgICAgICAgIGlmICghaXNUcnVlKCJNZW51SW5mbyBpcyBub3QgYW4gQWRhcHRlckNvbnRleHRNZW51SW5mbyIsCi0gICAgICAgICAgICAgICAgICAgIG1lbnVJbmZvIGluc3RhbmNlb2YgQWRhcHRlckNvbnRleHRNZW51SW5mbykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBZGFwdGVyQ29udGV4dE1lbnVJbmZvIGFkYXB0ZXJDb250ZXh0TWVudUluZm8gPSAoQWRhcHRlckNvbnRleHRNZW51SW5mbykgbWVudUluZm87Ci0gICAgICAgICAgICBpZiAoIWFyZUVxdWFsKCJXcm9uZyBmbGF0IHBvc2l0aW9uIiwgZ3JvdXBQb3NpdGlvbiwgYWRhcHRlckNvbnRleHRNZW51SW5mby5wb3NpdGlvbikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIWlzVHJ1ZSgiTWVudUluZm8gaXMgbm90IGFuIEV4cGFuZGFibGVMaXN0Q29udGV4dE1lbnVJbmZvIiwKLSAgICAgICAgICAgICAgICAgICAgbWVudUluZm8gaW5zdGFuY2VvZiBFeHBhbmRhYmxlTGlzdFZpZXcuRXhwYW5kYWJsZUxpc3RDb250ZXh0TWVudUluZm8pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRXhwYW5kYWJsZUxpc3RWaWV3LkV4cGFuZGFibGVMaXN0Q29udGV4dE1lbnVJbmZvIGVsdk1lbnVJbmZvID0KLSAgICAgICAgICAgICAgICAoRXhwYW5kYWJsZUxpc3RWaWV3LkV4cGFuZGFibGVMaXN0Q29udGV4dE1lbnVJbmZvKSBtZW51SW5mbzsKLSAgICAgICAgICAgIGxvbmcgcGFja2VkUG9zaXRpb24gPSBlbHZNZW51SW5mby5wYWNrZWRQb3NpdGlvbjsKLQotICAgICAgICAgICAgaW50IHBhY2tlZFBvc2l0aW9uVHlwZSA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvblR5cGUocGFja2VkUG9zaXRpb24pOwotICAgICAgICAgICAgaWYgKCFhcmVFcXVhbCgiV3JvbmcgcGFja2VkIHBvc2l0aW9uIHR5cGUiLCB0ZXN0VHlwZSwgcGFja2VkUG9zaXRpb25UeXBlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHBhY2tlZFBvc2l0aW9uR3JvdXAgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Hcm91cChwYWNrZWRQb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAoIWFyZUVxdWFsKCJXcm9uZyBncm91cCBwb3NpdGlvbiIsIGdyb3VwUG9zaXRpb24sIHBhY2tlZFBvc2l0aW9uR3JvdXApKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodGVzdFR5cGUgPT0gRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9UWVBFX0NISUxEKSB7Ci0gICAgICAgICAgICAgICAgaW50IHBhY2tlZFBvc2l0aW9uQ2hpbGQgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25DaGlsZChwYWNrZWRQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKCFhcmVFcXVhbCgiV3JvbmcgY2hpbGQgcG9zaXRpb24iLCBjaGlsZFBvc2l0aW9uLCBwYWNrZWRQb3NpdGlvbkNoaWxkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGFyZUVxdWFsKFN0cmluZyBtZXNzYWdlLCBpbnQgZXhwZWN0ZWQsIGludCBhY3R1YWwpIHsKLSAgICAgICAgaWYgKGV4cGVjdGVkICE9IGFjdHVhbCkgewotICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gU3RyaW5nLmZvcm1hdChtZXNzYWdlICsgIiAoJWQgdnMgJWQiLCBleHBlY3RlZCwgYWN0dWFsKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNUcnVlKFN0cmluZyBtZXNzYWdlLCBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIGlmICghdmFsdWUpIHsKLSAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBlcnJvck1lc3NhZ2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuamF2YSBiL2NvcmUvdGVzdHMvaG9zdHRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLmphdmEKaW5kZXggZWJlMTNlMS4uYzY5OGU5OSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuamF2YQorKysgYi9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5qYXZhCkBAIC0xNTIsNyArMTUyLDExIEBACiAgICAgICAgIH0KIAogICAgICAgICBDb2xsZWN0aW5nVGVzdFJ1bkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IENvbGxlY3RpbmdUZXN0UnVuTGlzdGVuZXIoKTsKLSAgICAgICAgdGVzdFJ1bm5lci5ydW4obGlzdGVuZXIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGVzdFJ1bm5lci5ydW4obGlzdGVuZXIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJlbmNvdW50ZXJlZCBJT0V4Y2VwdGlvbiAiICsgaW9lKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gbGlzdGVuZXI7CiAgICAgfQogCmRpZmYgLS1naXQgYS9kYXRhL2V0Yy9wbGF0Zm9ybS54bWwgYi9kYXRhL2V0Yy9wbGF0Zm9ybS54bWwKaW5kZXggNmY4YWZmZi4uNDM5ZmM5MCAxMDA2NDQKLS0tIGEvZGF0YS9ldGMvcGxhdGZvcm0ueG1sCisrKyBiL2RhdGEvZXRjL3BsYXRmb3JtLnhtbApAQCAtNTgsNiArNTgsMTAgQEAKICAgICAgICAgPGdyb3VwIGdpZD0ic2RjYXJkX3J3IiAvPgogICAgIDwvcGVybWlzc2lvbj4KIAorICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfVVNCIiA+CisgICAgICAgIDxncm91cCBnaWQ9InVzYiIgLz4KKyAgICA8L3Blcm1pc3Npb24+CisKICAgICA8IS0tIFRoZSBncm91cCB0aGF0IC9jYWNoZSBiZWxvbmdzIHRvLCBsaW5rZWQgdG8gdGhlIHBlcm1pc3Npb24KICAgICAgICAgIHNldCBvbiB0aGUgYXBwbGljYXRpb25zIHRoYXQgY2FuIGFjY2VzcyAvY2FjaGUgLS0+CiAgICAgPHBlcm1pc3Npb24gbmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19DQUNIRV9GSUxFU1lTVEVNIiA+CmRpZmYgLS1naXQgYS9kYXRhL2V0Yy90YWJsZXRfY29yZV9oYXJkd2FyZS54bWwgYi9kYXRhL2V0Yy90YWJsZXRfY29yZV9oYXJkd2FyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyZDA3OAotLS0gL2Rldi9udWxsCisrKyBiL2RhdGEvZXRjL3RhYmxldF9jb3JlX2hhcmR3YXJlLnhtbApAQCAtMCwwICsxLDUzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBUaGVzZSBhcmUgdGhlIGhhcmR3YXJlIGNvbXBvbmVudHMgdGhhdCBhbGwgaGFuZGhlbGQgZGV2aWNlcworICAgICBtdXN0IGluY2x1ZGUuIERldmljZXMgd2l0aCBvcHRpb25hbCBoYXJkd2FyZSBtdXN0IGFsc28gaW5jbHVkZSBleHRyYQorICAgICBoYXJkd2FyZSBmaWxlcywgcGVyIHRoZSBjb21tZW50cyBiZWxvdy4KKworICAgICBIYW5kaGVsZCBkZXZpY2VzIGluY2x1ZGUgcGhvbmVzLCBtb2JpbGUgSW50ZXJuZXQgZGV2aWNlcyAoTUlEcyksCisgICAgIFBlcnNvbmFsIE1lZGlhIFBsYXllcnMgKFBNUHMpLCBzbWFsbCB0YWJsZXRzICg3IiBvciBsZXNzKSwgYW5kIHNpbWlsYXIKKyAgICAgZGV2aWNlcy4KKy0tPgorPHBlcm1pc3Npb25zPgorICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuaGFyZHdhcmUubG9jYXRpb24iIC8+CisgICAgPGZlYXR1cmUgbmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5sb2NhdGlvbi5uZXR3b3JrIiAvPgorICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuc2Vuc29yLmNvbXBhc3MiIC8+CisgICAgPGZlYXR1cmUgbmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IuYWNjZWxlcm9tZXRlciIgLz4KKyAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aCIgLz4KKyAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLnRvdWNoc2NyZWVuIiAvPgorICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuaGFyZHdhcmUudG91Y2hzY3JlZW4ubXVsdGl0b3VjaCIgLz4KKyAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLnRvdWNoc2NyZWVuLm11bHRpdG91Y2guZGlzdGluY3QiIC8+CisgICAgPGZlYXR1cmUgbmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5taWNyb3Bob25lIiAvPgorICAgIDwhLS0gZGV2aWNlcyB3aXRoIEdQUyBtdXN0IGluY2x1ZGUgYW5kcm9pZC5oYXJkd2FyZS5sb2NhdGlvbi5ncHMueG1sIC0tPgorICAgIDwhLS0gZGV2aWNlcyB3aXRoIGEgcmVhci1mYWNpbmcgY2FtZXJhIG11c3QgaW5jbHVkZSBvbmUgb2YgdGhlc2UgYXMgYXBwcm9wcmlhdGU6CisgICAgICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS54bWwgb3IgCisgICAgICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5hdXRvZm9jdXMueG1sIG9yIAorICAgICAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuYXV0b2ZvY3VzLWZsYXNoLnhtbCAtLT4KKyAgICA8IS0tIGRldmljZXMgd2l0aCBhIGZyb250IGZhY2luZyBjYW1lcmEgbXVzdCBpbmNsdWRlCisgICAgICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5mcm9udC54bWwgLS0+CisgICAgPCEtLSBkZXZpY2VzIHdpdGggV2lGaSBtdXN0IGFsc28gaW5jbHVkZSBhbmRyb2lkLmhhcmR3YXJlLndpZmkueG1sIC0tPgorICAgIDwhLS0gZGV2aWNlcyB3aXRoIGFuIGFtYmllbnQgbGlnaHQgc2Vuc29yIG11c3QgYWxzbyBpbmNsdWRlCisgICAgICAgICBhbmRyb2lkLmhhcmR3YXJlLnNlbnNvci5saWdodC54bWwgLS0+CisgICAgPCEtLSBkZXZpY2VzIHdpdGggYSBwcm94aW1pdHkgc2Vuc29yIG11c3QgYWxzbyBpbmNsdWRlCisgICAgICAgICBhbmRyb2lkLmhhcmR3YXJlLnNlbnNvci5wcm94aW1pdHkueG1sIC0tPgorICAgIDwhLS0gZGV2aWNlcyB3aXRoIGEgYmFyb21ldGVyIG11c3QgYWxzbyBpbmNsdWRlCisgICAgICAgICBhbmRyb2lkLmhhcmR3YXJlLnNlbnNvci5iYXJvbWV0ZXIueG1sIC0tPgorICAgIDwhLS0gZGV2aWNlcyB3aXRoIGEgZ3lyb3Njb3BlIG11c3QgYWxzbyBpbmNsdWRlCisgICAgICAgICBhbmRyb2lkLmhhcmR3YXJlLnNlbnNvci5neXJvc2NvcGUueG1sIC0tPgorICAgIDwhLS0gR1NNIHBob25lcyBtdXN0IGFsc28gaW5jbHVkZSBhbmRyb2lkLmhhcmR3YXJlLnRlbGVwaG9ueS5nc20ueG1sIC0tPgorICAgIDwhLS0gQ0RNQSBwaG9uZXMgbXVzdCBhbHNvIGluY2x1ZGUgYW5kcm9pZC5oYXJkd2FyZS50ZWxlcGhvbnkuY2RtYS54bWwgLS0+Cis8L3Blcm1pc3Npb25zPgpkaWZmIC0tZ2l0IGEvZGF0YS9mb250cy9BaGVtLnR0ZiBiL2RhdGEvZm9udHMvQWhlbS50dGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZTZjNjAuLjAwMDAwMDAKLS0tIGEvZGF0YS9mb250cy9BaGVtLnR0ZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RhdGEvZm9udHMvQW5kcm9pZC5tayBiL2RhdGEvZm9udHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM0MDY0Ni4uMDAwMDAwMAotLS0gYS9kYXRhL2ZvbnRzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1jb3B5X2Zyb20gOj0gICAgICAgICAgICAgICAgXAotICAgIERyb2lkU2Fucy50dGYgICAgICAgICAgIFwKLSAgICBEcm9pZFNhbnMtQm9sZC50dGYgICAgICBcCi0gICAgRHJvaWRTYW5zQXJhYmljLnR0ZiAgICAgXAotICAgIERyb2lkU2Fuc0hlYnJldy50dGYgICAgIFwKLSAgICBEcm9pZFNhbnNUaGFpLnR0ZiAgICAgICBcCi0gICAgRHJvaWRTZXJpZi1SZWd1bGFyLnR0ZiAgXAotICAgIERyb2lkU2VyaWYtQm9sZC50dGYgICAgIFwKLSAgICBEcm9pZFNlcmlmLUl0YWxpYy50dGYgICBcCi0gICAgRHJvaWRTZXJpZi1Cb2xkSXRhbGljLnR0ZiAgIFwKLSAgICBEcm9pZFNhbnNNb25vLnR0ZiAgICAgICAgXAotICAgIENsb2Nrb3BpYS50dGYKLQotaWZuZXEgKCQoTk9fRkFMTEJBQ0tfRk9OVCksdHJ1ZSkKLWlmZXEgKCQoZmlsdGVyICVzeXN0ZW0vZm9udHMvRHJvaWRTYW5zRmFsbGJhY2sudHRmLCQoUFJPRFVDVF9DT1BZX0ZJTEVTKSksKQotICAgICMgaWYgdGhlIHByb2R1Y3QgbWFrZWZpbGUgaGFzIHNldCB0aGUgdGhlIGZhbGxiYWNrIGZvbnQsIGRvbid0IG92ZXJyaWRlIGl0LgotICAgIGNvcHlfZnJvbSArPSBEcm9pZFNhbnNGYWxsYmFjay50dGYKLWVuZGlmCi1lbmRpZgotCi1jb3B5X2ZpbGVfcGFpcnMgOj0gJChmb3JlYWNoIGNmLCQoY29weV9mcm9tKSwkKExPQ0FMX1BBVEgpLyQoY2YpOnN5c3RlbS9mb250cy8kKGNmKSkKLVBST0RVQ1RfQ09QWV9GSUxFUyArPSAkKGNvcHlfZmlsZV9wYWlycykKZGlmZiAtLWdpdCBhL2RhdGEvZm9udHMvZm9udHMubWsgYi9kYXRhL2ZvbnRzL2ZvbnRzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZDAzMzEKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRhL2ZvbnRzL2ZvbnRzLm1rCkBAIC0wLDAgKzEsMjkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgV2FybmluZzogdGhpcyBpcyBhY3R1YWxseSBhIHByb2R1Y3QgZGVmaW5pdGlvbiwgdG8gYmUgaW5oZXJpdGVkIGZyb20KKworUFJPRFVDVF9DT1BZX0ZJTEVTIDo9IFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy9Ecm9pZFNhbnMudHRmOnN5c3RlbS9mb250cy9Ecm9pZFNhbnMudHRmIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy9Ecm9pZFNhbnMtQm9sZC50dGY6c3lzdGVtL2ZvbnRzL0Ryb2lkU2Fucy1Cb2xkLnR0ZiBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL2RhdGEvZm9udHMvRHJvaWRTYW5zQXJhYmljLnR0ZjpzeXN0ZW0vZm9udHMvRHJvaWRTYW5zQXJhYmljLnR0ZiBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL2RhdGEvZm9udHMvRHJvaWRTYW5zSGVicmV3LnR0ZjpzeXN0ZW0vZm9udHMvRHJvaWRTYW5zSGVicmV3LnR0ZiBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL2RhdGEvZm9udHMvRHJvaWRTYW5zVGhhaS50dGY6c3lzdGVtL2ZvbnRzL0Ryb2lkU2Fuc1RoYWkudHRmIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy9Ecm9pZFNlcmlmLVJlZ3VsYXIudHRmOnN5c3RlbS9mb250cy9Ecm9pZFNlcmlmLVJlZ3VsYXIudHRmIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy9Ecm9pZFNlcmlmLUJvbGQudHRmOnN5c3RlbS9mb250cy9Ecm9pZFNlcmlmLUJvbGQudHRmIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy9Ecm9pZFNlcmlmLUl0YWxpYy50dGY6c3lzdGVtL2ZvbnRzL0Ryb2lkU2VyaWYtSXRhbGljLnR0ZiBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL2RhdGEvZm9udHMvRHJvaWRTZXJpZi1Cb2xkSXRhbGljLnR0ZjpzeXN0ZW0vZm9udHMvRHJvaWRTZXJpZi1Cb2xkSXRhbGljLnR0ZiBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL2RhdGEvZm9udHMvRHJvaWRTYW5zTW9uby50dGY6c3lzdGVtL2ZvbnRzL0Ryb2lkU2Fuc01vbm8udHRmIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy9DbG9ja29waWEudHRmOnN5c3RlbS9mb250cy9DbG9ja29waWEudHRmIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy9Ecm9pZFNhbnNGYWxsYmFjay50dGY6c3lzdGVtL2ZvbnRzL0Ryb2lkU2Fuc0ZhbGxiYWNrLnR0ZgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvdGVzdGluZy9pbmRleC5qZCBiL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvaW5kZXguamQKaW5kZXggZWE2MWNjMy4uMjE2NDcwNSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvdGVzdGluZy9pbmRleC5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL2luZGV4LmpkCkBAIC0xLDYgKzEsNSBAQAogcGFnZS50aXRsZT1UZXN0aW5nIE92ZXJ2aWV3CiBAamQ6Ym9keQotCiA8cD4KICAgICBBbmRyb2lkIGluY2x1ZGVzIHBvd2VyZnVsIHRvb2xzIGZvciBzZXR0aW5nIHVwIGFuZCBydW5uaW5nIHRlc3QgYXBwbGljYXRpb25zLgogICAgIFdoZXRoZXIgeW91IGFyZSB3b3JraW5nIGluIEVjbGlwc2Ugd2l0aCBBRFQgb3Igd29ya2luZyBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHRoZXNlIHRvb2xzCkBAIC05LDcgKzgsNyBAQAogPC9wPgogPHA+CiAgICAgSWYgeW91IGFyZW4ndCB5ZXQgZmFtaWxpYXIgd2l0aCB0aGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yaywgcGxlYXNlIHJlYWQgdGhlIHRvcGljCi0gICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj5UZXN0aW5nIGFuZCBJbnN0cnVtZW50YXRpb248L2E+CisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj5UZXN0aW5nIEZ1bmRhbWVudGFsczwvYT4KICAgICBiZWZvcmUgeW91IGdldCBzdGFydGVkLgogICAgIEZvciBhIHN0ZXAtYnktc3RlcCBpbnRyb2R1Y3Rpb24gdG8gQW5kcm9pZCB0ZXN0aW5nLCB0cnkgdGhlIDxhCiAgICAgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9oZWxsb2FuZHJvaWRfdGVzdC5odG1sIj5IZWxsbywgVGVzdGluZzwvYT4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmpkIGIvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuamQKaW5kZXggZGExYzBmMC4uYmE3ZWFiYSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuamQKQEAgLTEsMjggKzEsMjMgQEAKIHBhZ2UudGl0bGU9VGVzdGluZyBJbiBFY2xpcHNlLCB3aXRoIEFEVAogQGpkOmJvZHkKLQogPGRpdiBpZD0icXYtd3JhcHBlciI+Ci0gIDxkaXYgaWQ9InF2Ij4KLSAgPGgyPkluIHRoaXMgZG9jdW1lbnQ8L2gyPgotICA8b2w+Ci0gICAgPGxpPjxhIGhyZWY9IiNDcmVhdGVUZXN0UHJvamVjdEVjbGlwc2UiPkNyZWF0aW5nIGEgVGVzdCBQcm9qZWN0PC9hPjwvbGk+Ci0gICAgPGxpPjxhIGhyZWY9IiNDcmVhdGVUZXN0QXBwRWNsaXBzZSI+Q3JlYXRpbmcgYSBUZXN0IEFwcGxpY2F0aW9uPC9hPjwvbGk+Ci0gICAgPGxpPjxhIGhyZWY9IiNSdW5UZXN0RWNsaXBzZSI+UnVubmluZyBUZXN0czwvYT48L2xpPgotICA8L29sPgotICA8L2Rpdj4KKyAgICA8ZGl2IGlkPSJxdiI+CisgICAgICAgIDxoMj5JbiB0aGlzIGRvY3VtZW50PC9oMj4KKyAgICAgICAgICAgIDxvbD4KKyAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI0NyZWF0ZVRlc3RQcm9qZWN0RWNsaXBzZSI+Q3JlYXRpbmcgYSBUZXN0IFByb2plY3Q8L2E+PC9saT4KKyAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI0NyZWF0ZVRlc3RBcHBFY2xpcHNlIj5DcmVhdGluZyBhIFRlc3QgUGFja2FnZTwvYT48L2xpPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjUnVuVGVzdEVjbGlwc2UiPlJ1bm5pbmcgVGVzdHM8L2E+PC9saT4KKyAgICAgICAgICAgIDwvb2w+CisgICAgPC9kaXY+CiA8L2Rpdj4KIDxwPgotICBUaGlzIHRvcGljIGV4cGxhaW5zIGhvdyBjcmVhdGUgYW5kIHJ1biB0ZXN0cyBvZiBBbmRyb2lkIGFwcGxpY2F0aW9ucyBpbiBFY2xpcHNlIHdpdGggQURULgotCi0gIHdpdGggdGhlIGJhc2ljIHByb2Nlc3NlcyBmb3IgY3JlYXRpbmcgYW5kIHJ1bm5pbmcgYXBwbGljYXRpb25zIHdpdGggQURULCBhcyBkZXNjcmliZWQgaW4KLSAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvZWNsaXBzZS1hZHQuaHRtbCI+RGV2ZWxvcGluZyBJbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uCi0KLSAgQmVmb3JlIHlvdSByZWFkIHRoaXMgdG9waWMsIHlvdSBzaG91bGQgcmVhZCBhYm91dCBob3cgdG8gY3JlYXRlIGEgQW5kcm9pZCBhcHBsaWNhdGlvbiB3aXRoIHRoZQotICBiYXNpYyBwcm9jZXNzZXMgZm9yIGNyZWF0aW5nIGFuZCBydW5uaW5nIGFwcGxpY2F0aW9ucyB3aXRoIEFEVCwgYXMgZGVzY3JpYmVkIGluCi0gIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL2VjbGlwc2UtYWR0Lmh0bWwiPkRldmVsb3BpbmcgSW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+LgotICBZb3UgbWF5IGFsc28gd2FudCB0byByZWFkCi0gIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCI+VGVzdGluZyBhbmQgSW5zdHJ1bWVudGF0aW9uPC9hPiwKLSAgd2hpY2ggcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIEFuZHJvaWQgdGVzdGluZyBmcmFtZXdvcmsuCisgICAgVGhpcyB0b3BpYyBleHBsYWlucyBob3cgY3JlYXRlIGFuZCBydW4gdGVzdHMgb2YgQW5kcm9pZCBhcHBsaWNhdGlvbnMgaW4gRWNsaXBzZSB3aXRoIEFEVC4KKyAgICBCZWZvcmUgeW91IHJlYWQgdGhpcyB0b3BpYywgeW91IHNob3VsZCByZWFkIGFib3V0IGhvdyB0byBjcmVhdGUgYSBBbmRyb2lkIGFwcGxpY2F0aW9uIHdpdGggdGhlCisgICAgYmFzaWMgcHJvY2Vzc2VzIGZvciBjcmVhdGluZyBhbmQgcnVubmluZyBhcHBsaWNhdGlvbnMgd2l0aCBBRFQsIGFzIGRlc2NyaWJlZCBpbgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL2VjbGlwc2UtYWR0Lmh0bWwiPkRldmVsb3BpbmcgSW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+LgorICAgIFlvdSBtYXkgYWxzbyB3YW50IHRvIHJlYWQKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPlRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPiwKKyAgICB3aGljaCBwcm92aWRlcyBhbiBvdmVydmlldyBvZiB0aGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yay4KIDwvcD4KIDxwPgogICAgIEFEVCBwcm92aWRlcyBzZXZlcmFsIGZlYXR1cmVzIHRoYXQgaGVscCB5b3Ugc2V0IHVwIGFuZCBtYW5hZ2UgeW91ciB0ZXN0aW5nIGVudmlyb25tZW50CkBAIC0zMiwyMCArMjcsMjAgQEAKICAgICAgICAgPGxpPgogICAgICAgICAgICAgSXQgbGV0cyB5b3UgcXVpY2tseSBjcmVhdGUgYSB0ZXN0IHByb2plY3QgYW5kIGxpbmsgaXQgdG8gdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuCiAgICAgICAgICAgICBXaGVuIGl0IGNyZWF0ZXMgdGhlIHRlc3QgcHJvamVjdCwgaXQgYXV0b21hdGljYWxseSBpbnNlcnRzIHRoZSBuZWNlc3NhcnkKLSAgICAgICAgICAgIDxjb2RlPiZsdDtpbnN0cnVtZW50YXRpb24mZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSB0ZXN0IGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3QgZmlsZS4KKyAgICAgICAgICAgIDxjb2RlPiZsdDtpbnN0cnVtZW50YXRpb24mZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSB0ZXN0IHBhY2thZ2UncyBtYW5pZmVzdCBmaWxlLgogICAgICAgICA8L2xpPgogICAgICAgICA8bGk+CiAgICAgICAgICAgICBJdCBsZXRzIHlvdSBxdWlja2x5IGltcG9ydCB0aGUgY2xhc3NlcyBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwgc28gdGhhdCB5b3VyCiAgICAgICAgICAgICB0ZXN0cyBjYW4gaW5zcGVjdCB0aGVtLgogICAgICAgICA8L2xpPgogICAgICAgICA8bGk+Ci0gICAgICAgICAgICBJdCBsZXRzIHlvdSBjcmVhdGUgcnVuIGNvbmZpZ3VyYXRpb25zIGZvciB5b3VyIHRlc3QgYXBwbGljYXRpb24gYW5kIGluY2x1ZGUgaW4KKyAgICAgICAgICAgIEl0IGxldHMgeW91IGNyZWF0ZSBydW4gY29uZmlndXJhdGlvbnMgZm9yIHlvdXIgdGVzdCBwYWNrYWdlIGFuZCBpbmNsdWRlIGluCiAgICAgICAgICAgICB0aGVtIGZsYWdzIHRoYXQgYXJlIHBhc3NlZCB0byB0aGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yay4KICAgICAgICAgPC9saT4KICAgICAgICAgPGxpPgotICAgICAgICAgICAgSXQgbGV0cyB5b3UgcnVuIHlvdXIgdGVzdCBhcHBsaWNhdGlvbiB3aXRob3V0IGxlYXZpbmcgRWNsaXBzZS4gQURUIGJ1aWxkcyBib3RoIHRoZQotICAgICAgICAgICAgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBhbmQgdGhlIHRlc3QgYXBwbGljYXRpb24gYXV0b21hdGljYWxseSwgaW5zdGFsbHMgdGhlbSBpZgotICAgICAgICAgICAgbmVjZXNzYXJ5IHRvIHlvdXIgZGV2aWNlIG9yIGVtdWxhdG9yLCBydW5zIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLCBhbmQgZGlzcGxheXMgdGhlCisgICAgICAgICAgICBJdCBsZXRzIHlvdSBydW4geW91ciB0ZXN0IHBhY2thZ2Ugd2l0aG91dCBsZWF2aW5nIEVjbGlwc2UuIEFEVCBidWlsZHMgYm90aCB0aGUKKyAgICAgICAgICAgIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgYW5kIHRoZSB0ZXN0IHBhY2thZ2UgYXV0b21hdGljYWxseSwgaW5zdGFsbHMgdGhlbSBpZgorICAgICAgICAgICAgbmVjZXNzYXJ5IHRvIHlvdXIgZGV2aWNlIG9yIGVtdWxhdG9yLCBydW5zIHRoZSB0ZXN0IHBhY2thZ2UsIGFuZCBkaXNwbGF5cyB0aGUKICAgICAgICAgICAgIHJlc3VsdHMgaW4gYSBzZXBhcmF0ZSB3aW5kb3cgaW4gRWNsaXBzZS4KICAgICAgICAgPC9saT4KICAgICA8L3VsPgpAQCAtNTUsMzA1ICs1MCw0NTIgQEAKICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlciBJREVzPC9hPi4KIDwvcD4KIDxoMiBpZD0iQ3JlYXRlVGVzdFByb2plY3RFY2xpcHNlIj5DcmVhdGluZyBhIFRlc3QgUHJvamVjdDwvaDI+Ci0gIDxwPgorPHA+CiAgICAgVG8gc2V0IHVwIGEgdGVzdCBlbnZpcm9ubWVudCBmb3IgeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9uLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgYSBzZXBhcmF0ZQotICAgIGFwcGxpY2F0aW9uIHByb2plY3QgdGhhdCBob2xkcyB0aGUgdGVzdCBjb2RlLiBUaGUgbmV3IHByb2plY3QgZm9sbG93cyB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZQorICAgIHByb2plY3QgdGhhdCBob2xkcyB0aGUgdGVzdCBjb2RlLiBUaGUgbmV3IHByb2plY3QgZm9sbG93cyB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZQogICAgIHVzZWQgZm9yIGFueSBBbmRyb2lkIGFwcGxpY2F0aW9uLiBJdCBpbmNsdWRlcyB0aGUgc2FtZSB0eXBlcyBvZiBjb250ZW50IGFuZCBmaWxlcywgc3VjaCBhcwotICAgIHNvdXJjZSBjb2RlLCByZXNvdXJjZXMsIGEgbWFuaWZlc3QgZmlsZSwgYW5kIHNvIGZvcnRoLiBUaGUgdGVzdCBhcHBsaWNhdGlvbiB5b3UKKyAgICBzb3VyY2UgY29kZSwgcmVzb3VyY2VzLCBhIG1hbmlmZXN0IGZpbGUsIGFuZCBzbyBmb3J0aC4gVGhlIHRlc3QgcGFja2FnZSB5b3UKICAgICBjcmVhdGUgaXMgY29ubmVjdGVkIHRvIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGJ5IGFuCiAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9pbnN0cnVtZW50YXRpb24tZWxlbWVudC5odG1sIj4KICAgICA8Y29kZT4mbHQ7aW5zdHJ1bWVudGF0aW9uJmd0OzwvY29kZT48L2E+IGVsZW1lbnQgaW4gaXRzIG1hbmlmZXN0IGZpbGUuCi0gIDwvcD4KLSAgPHA+Ci0gICAgVGhlIDxzdHJvbmc+TmV3IEFuZHJvaWQgVGVzdCBQcm9qZWN0PC9zdHJvbmc+IGRpYWxvZyBtYWtlcyBpdCBlYXN5IGZvciB5b3UgdG8gZ2VuZXJhdGUgYQotICAgIG5ldyB0ZXN0IHByb2plY3QgdGhhdCBoYXMgdGhlIHByb3BlciBzdHJ1Y3R1cmUsIGluY2x1ZGluZyB0aGUKLSAgICA8Y29kZT4mbHQ7aW5zdHJ1bWVudGF0aW9uJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgbWFuaWZlc3QgZmlsZS4gWW91IGNhbiB1c2UgdGhlIE5ldyBBbmRyb2lkCi0gICAgVGVzdCBQcm9qZWN0IGRpYWxvZyB0byBnZW5lcmF0ZSB0aGUgdGVzdCBwcm9qZWN0IGF0IGFueSB0aW1lLiBUaGUgZGlhbG9nIGFwcGVhcnMganVzdCBhZnRlciB5b3UKLSAgICBjcmVhdGUgYSBuZXcgQW5kcm9pZCBtYWluIGFwcGxpY2F0aW9uIHByb2plY3QsIGJ1dCB5b3UgY2FuIGFsc28gcnVuIGl0IHRvIGNyZWF0ZSBhIHRlc3QgcHJvamVjdAotICAgIGZvciBhIHByb2plY3QgdGhhdCB5b3UgY3JlYXRlZCBwcmV2aW91c2x5LgotICA8L3A+Cis8L3A+CiA8cD4KLSAgVG8gY3JlYXRlIGEgdGVzdCBwcm9qZWN0IGluIEVjbGlwc2Ugd2l0aCBBRFQ6CisgICAgVGhlIDxlbT5OZXcgQW5kcm9pZCBUZXN0IFByb2plY3Q8L2VtPiBkaWFsb2cgbWFrZXMgaXQgZWFzeSBmb3IgeW91IHRvIGdlbmVyYXRlIGEKKyAgICBuZXcgdGVzdCBwcm9qZWN0IHRoYXQgaGFzIHRoZSBwcm9wZXIgc3RydWN0dXJlLCBpbmNsdWRpbmcgdGhlCisgICAgPGNvZGU+Jmx0O2luc3RydW1lbnRhdGlvbiZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIG1hbmlmZXN0IGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBOZXcKKyAgICBBbmRyb2lkIFRlc3QgUHJvamVjdCBkaWFsb2cgdG8gZ2VuZXJhdGUgdGhlIHRlc3QgcHJvamVjdCBhdCBhbnkgdGltZS4gVGhlIGRpYWxvZyBhcHBlYXJzCisgICAganVzdCBhZnRlciB5b3UgY3JlYXRlIGEgbmV3IEFuZHJvaWQgbWFpbiBhcHBsaWNhdGlvbiBwcm9qZWN0LCBidXQgeW91IGNhbiBhbHNvIHJ1biBpdCB0bworICAgIGNyZWF0ZSBhIHRlc3QgcHJvamVjdCBmb3IgYSBwcm9qZWN0IHRoYXQgeW91IGNyZWF0ZWQgcHJldmlvdXNseS4KKzwvcD4KKzxwPgorICAgIFRvIGNyZWF0ZSBhIHRlc3QgcHJvamVjdCBpbiBFY2xpcHNlIHdpdGggQURUOgogPC9wPgogPG9sPgotICA8bGk+Ci0gICAgSW4gRWNsaXBzZSwgc2VsZWN0IDxzdHJvbmc+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyPC9zdHJvbmc+LiBUaGlzCi0gICAgb3BlbnMgdGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cuCi0gIDwvbGk+Ci0gIDxsaT4KLSAgICBJbiB0aGUgZGlhbG9nLCBpbiB0aGUgV2l6YXJkcyBkcm9wLWRvd24gbGlzdCwKLSAgICBmaW5kIHRoZSBlbnRyeSBmb3IgQW5kcm9pZCwgdGhlbiBjbGljayB0aGUgdG9nZ2xlIHRvIHRoZSBsZWZ0LiBTZWxlY3QKLSAgICBBbmRyb2lkIFRlc3QgUHJvamVjdCwgdGhlbiBhdCB0aGUgYm90dG9tCi0gICAgb2YgdGhlIGRpYWxvZyBjbGljayBOZXh0LiBUaGUgTmV3IEFuZHJvaWQgVGVzdCBQcm9qZWN0IHdpemFyZCBhcHBlYXJzLgotICA8L2xpPgotICA8bGk+Ci0gICAgRW50ZXIgYSBwcm9qZWN0IG5hbWUuIFlvdSBtYXkgdXNlIGFueSBuYW1lLCBidXQgeW91IG1heSB3YW50IHRvCi0gICAgYXNzb2NpYXRlIHRoZSBuYW1lIHdpdGggdGhlIHByb2plY3QgbmFtZSBmb3IgeW91ciBBcHBsaWNhdGlvbi4gT25lCi0gICAgd2F5IHRvIGRvIHRoaXMgaXMgdG8gdGFrZSB0aGUgQXBwbGljYXRpb24ncyBwcm9qZWN0IG5hbWUsIGFwcGVuZCB0aGUKLSAgICBzdHJpbmcgIlRlc3QiIHRvIGl0LCBhbmQgdGhlbiB1c2UgdGhpcyBhcyB0aGUgdGVzdCBjYXNlIHByb2plY3QgbmFtZS4KLSAgPC9saT4KLSAgPGxpPgotICAgIEluIHRoZSBUZXN0IFRhcmdldCBwYW5lbCwgc2V0Ci0gICAgQW4gRXhpc3RpbmcgQW5kcm9pZCBQcm9qZWN0LCBjbGljawotICAgIEJyb3dzZSwgdGhlbiBzZWxlY3QgeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9uIGZyb20KLSAgICB0aGUgbGlzdC4gWW91IG5vdyBzZWUgdGhhdCB0aGUgd2l6YXJkIGhhcyBjb21wbGV0ZWQgdGhlIFRlc3QKLSAgICBUYXJnZXQgUGFja2FnZSwgQXBwbGljYXRpb24gTmFtZSwgYW5kCi0gICAgUGFja2FnZSBOYW1lIGZpZWxkcyBmb3IgeW91ICh0aGUgbGF0dGVyIHR3byBhcmUgaW4KLSAgICB0aGUgUHJvcGVydGllcyBwYW5lbCkuCi0gIDwvbGk+Ci0gIDxsaT4KLSAgICBJbiB0aGUgQnVpbGQgVGFyZ2V0IHBhbmVsLCBzZWxlY3QgdGhlIEFuZHJvaWQgU0RLCi0gICAgcGxhdGZvcm0gdGhhdCB5b3Ugd2lsbCB1c2UgdG8gdGVzdCB5b3VyIGFwcGxpY2F0aW9uLiBNYWtlIHRoaXMgdGhlIHNhbWUgYXMgdGhlCi0gICAgYnVpbGQgdGFyZ2V0IG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LgotICA8L2xpPgotICA8bGk+Ci0gICAgQ2xpY2sgRmluaXNoIHRvIGNvbXBsZXRlIHRoZSB3aXphcmQuIElmCi0gICAgRmluaXNoIGlzIGRpc2FibGVkLCBsb29rCi0gICAgZm9yIGVycm9yIG1lc3NhZ2VzIGF0IHRoZSB0b3Agb2YgdGhlIHdpemFyZCBkaWFsb2csIGFuZCB0aGVuIGZpeAotICAgIGFueSBwcm9ibGVtcy4KLSAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEluIEVjbGlwc2UsIHNlbGVjdCA8c3Ryb25nPkZpbGUgJmd0OyBOZXcgJmd0OyBPdGhlcjwvc3Ryb25nPi4gVGhpcyBvcGVucyB0aGUgPGVtPlNlbGVjdCBhCisgICAgICAgIFdpemFyZDwvZW0+IGRpYWxvZy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgSW4gdGhlIGRpYWxvZywgaW4gdGhlIDxlbT5XaXphcmRzPC9lbT4gZHJvcC1kb3duIGxpc3QsIGZpbmQgdGhlIGVudHJ5IGZvciBBbmRyb2lkLCB0aGVuCisgICAgICAgIGNsaWNrIHRoZSB0b2dnbGUgdG8gdGhlIGxlZnQuIFNlbGVjdCA8c3Ryb25nPkFuZHJvaWQgVGVzdCBQcm9qZWN0PC9zdHJvbmc+LCB0aGVuIGF0IHRoZQorICAgICAgICBib3R0b20gb2YgdGhlIGRpYWxvZyBjbGljayA8c3Ryb25nPk5leHQ8L3N0cm9uZz4uIFRoZSA8ZW0+TmV3IEFuZHJvaWQgVGVzdCBQcm9qZWN0PC9lbT4KKyAgICAgICAgd2l6YXJkIGFwcGVhcnMuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIE5leHQgdG8gPGVtPlRlc3QgUHJvamVjdCBOYW1lPC9lbT4sIGVudGVyIGEgbmFtZSBmb3IgdGhlIHByb2plY3QuIFlvdSBtYXkgdXNlIGFueSBuYW1lLAorICAgICAgICBidXQgeW91IG1heSB3YW50IHRvIGFzc29jaWF0ZSB0aGUgbmFtZSB3aXRoIHRoZSBwcm9qZWN0IG5hbWUgZm9yIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LgorICAgICAgICBPbmUgd2F5IHRvIGRvIHRoaXMgaXMgdG8gdGFrZSB0aGUgYXBwbGljYXRpb24ncyBwcm9qZWN0IG5hbWUsIGFwcGVuZCB0aGUgc3RyaW5nICJUZXN0IiB0bworICAgICAgICBpdCwgYW5kIHRoZW4gdXNlIHRoaXMgYXMgdGhlIHRlc3QgcGFja2FnZSBwcm9qZWN0IG5hbWUuCisgICAgICAgIDxwPgorICAgICAgICAgICAgVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBzdWdnZXN0ZWQgcHJvamVjdCBwYXRoLCBidXQgeW91IGNhbiBjaGFuZ2UgdGhpcyBpbiB0aGUKKyAgICAgICAgICAgIG5leHQgc3RlcC4KKyAgICAgICAgPC9wPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBJbiB0aGUgPGVtPkNvbnRlbnQ8L2VtPiBwYW5lbCwgZXhhbWluZSB0aGUgc3VnZ2VzdGVkIHBhdGggdG8gdGhlIHByb2plY3QuCisgICAgICAgIElmIDxlbT5Vc2UgZGVmYXVsdCBsb2NhdGlvbjwvZW0+IGlzIHNldCwgdGhlbiB0aGUgd2l6YXJkIHdpbGwgc3VnZ2VzdCBhIHBhdGggdGhhdCBpcworICAgICAgICBhIGNvbmNhdGVuYXRpb24gb2YgdGhlIHdvcmtzcGFjZSBwYXRoIGFuZCB0aGUgcHJvamVjdCBuYW1lIHlvdSBlbnRlcmVkLiBGb3IgZXhhbXBsZSwKKyAgICAgICAgaWYgeW91ciB3b3Jrc3BhY2UgcGF0aCBpcyA8Y29kZT4vdXNyL2xvY2FsL3dvcmtzcGFjZTwvY29kZT4gYW5kIHlvdXIgcHJvamVjdCBuYW1lIGlzCisgICAgICAgIDxjb2RlPk15VGVzdEFwcDwvY29kZT4sIHRoZW4gdGhlIHdpemFyZCB3aWxsIHN1Z2dlc3QKKyAgICAgICAgPGNvZGU+L3Vzci9sb2NhbC93b3Jrc3BhY2UvTXlUZXN0QXBwPC9jb2RlPi4gVG8gZW50ZXIgeW91ciBvd24KKyAgICAgICAgY2hvaWNlIGZvciBhIHBhdGgsIHVuc2VsZWN0IDxlbT5Vc2UgZGVmYXVsdCBsb2NhdGlvbjwvZW0+LCB0aGVuIGVudGVyIG9yIGJyb3dzZSB0byB0aGUKKyAgICAgICAgcGF0aCB3aGVyZSB5b3Ugd2FudCB5b3VyIHByb2plY3QuCisgICAgICAgIDxwPgorICAgICAgICAgICAgVG8gbGVhcm4gbW9yZSBhYm91dCBjaG9vc2luZyB0aGUgbG9jYXRpb24gb2YgdGVzdCBwcm9qZWN0cywgcGxlYXNlIHJlYWQKKyAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCNUZXN0UHJvamVjdFBhdGhzIj4KKyAgICAgICAgICAgIFRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPi4KKyAgICAgICAgPC9wPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBJbiB0aGUgVGVzdCBUYXJnZXQgcGFuZWwsIHNldCBBbiBFeGlzdGluZyBBbmRyb2lkIFByb2plY3QsIGNsaWNrIEJyb3dzZSwgdGhlbiBzZWxlY3QgeW91cgorICAgICAgICBBbmRyb2lkIGFwcGxpY2F0aW9uIGZyb20gdGhlIGxpc3QuIFlvdSBub3cgc2VlIHRoYXQgdGhlIHdpemFyZCBoYXMgY29tcGxldGVkIHRoZSBUZXN0CisgICAgICAgIFRhcmdldCBQYWNrYWdlLCBBcHBsaWNhdGlvbiBOYW1lLCBhbmQgUGFja2FnZSBOYW1lIGZpZWxkcyBmb3IgeW91ICh0aGUgbGF0dGVyIHR3byBhcmUgaW4KKyAgICAgICAgdGhlIFByb3BlcnRpZXMgcGFuZWwpLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBJbiB0aGUgQnVpbGQgVGFyZ2V0IHBhbmVsLCBzZWxlY3QgdGhlIEFuZHJvaWQgU0RLIHBsYXRmb3JtIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QKKyAgICAgICAgdXNlcy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgQ2xpY2sgRmluaXNoIHRvIGNvbXBsZXRlIHRoZSB3aXphcmQuIElmIEZpbmlzaCBpcyBkaXNhYmxlZCwgbG9vayBmb3IgZXJyb3IgbWVzc2FnZXMgYXQgdGhlCisgICAgICAgIHRvcCBvZiB0aGUgd2l6YXJkIGRpYWxvZywgYW5kIHRoZW4gZml4IGFueSBwcm9ibGVtcy4KKyAgICA8L2xpPgorPC9vbD4KKzxoMiBpZD0iQ3JlYXRlVGVzdEFwcEVjbGlwc2UiPkNyZWF0aW5nIGEgVGVzdCBQYWNrYWdlPC9oMj4KKzxwPgorICAgIE9uY2UgeW91IGhhdmUgY3JlYXRlZCBhIHRlc3QgcHJvamVjdCwgeW91IHBvcHVsYXRlIGl0IHdpdGggYSB0ZXN0IHBhY2thZ2UuIFRoaXMgcGFja2FnZSBkb2VzIG5vdAorICAgIHJlcXVpcmUgYW4gQWN0aXZpdHksIGFsdGhvdWdoIHlvdSBjYW4gZGVmaW5lIG9uZSBpZiB5b3Ugd2lzaC4gQWx0aG91Z2ggeW91ciB0ZXN0IHBhY2thZ2UgY2FuCisgICAgY29tYmluZSBBY3Rpdml0eSBjbGFzc2VzLCB0ZXN0IGNhc2UgY2xhc3Nlcywgb3Igb3JkaW5hcnkgY2xhc3NlcywgeW91ciBtYWluIHRlc3QgY2FzZQorICAgIHNob3VsZCBleHRlbmQgb25lIG9mIHRoZSBBbmRyb2lkIHRlc3QgY2FzZSBjbGFzc2VzIG9yIEpVbml0IGNsYXNzZXMsIGJlY2F1c2UgdGhlc2UgcHJvdmlkZSB0aGUKKyAgICBiZXN0IHRlc3RpbmcgZmVhdHVyZXMuCis8L3A+Cis8cD4KKyAgICBUZXN0IHBhY2thZ2VzIGRvIG5vdCBuZWVkIHRvIGhhdmUgYW4gQW5kcm9pZCBHVUkuIFdoZW4geW91IHJ1biB0aGUgcGFja2FnZSBpbgorICAgIEVjbGlwc2Ugd2l0aCBBRFQsIGl0cyByZXN1bHRzIGFwcGVhciBpbiB0aGUgSlVuaXQgdmlldy4gUnVubmluZyB0ZXN0cyBhbmQgc2VlaW5nIHRoZSByZXN1bHRzIGlzCisgICAgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHRoZSBzZWN0aW9uIDxhIGhyZWY9IiNSdW5UZXN0RWNsaXBzZSI+UnVubmluZyBUZXN0czwvYT4uCis8L3A+CisKKzxwPgorICAgIFRvIGNyZWF0ZSBhIHRlc3QgcGFja2FnZSwgc3RhcnQgd2l0aCBvbmUgb2YgQW5kcm9pZCdzIHRlc3QgY2FzZSBjbGFzc2VzIGRlZmluZWQgaW4KKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0IGFuZHJvaWQudGVzdH0uIFRoZXNlIGV4dGVuZCB0aGUgSlVuaXQKKyAgICB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIFRlc3RDYXNlfSBjbGFzcy4gVGhlIEFuZHJvaWQgdGVzdCBjbGFzc2VzIGZvciBBY3Rpdml0eSBvYmplY3RzCisgICAgYWxzbyBwcm92aWRlIGluc3RydW1lbnRhdGlvbiBmb3IgdGVzdGluZyBhbiBBY3Rpdml0eS4gVG8gbGVhcm4gbW9yZSBhYm91dCB0ZXN0IGNhc2UKKyAgICBjbGFzc2VzLCBwbGVhc2UgcmVhZCB0aGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj4KKyAgICBUZXN0aW5nIEZ1bmRhbWVudGFsczwvYT4uCis8L3A+Cis8cD4KKyAgICBCZWZvcmUgeW91IGNyZWF0ZSB5b3VyIHRlc3QgcGFja2FnZSwgeW91IGNob29zZSB0aGUgSmF2YSBwYWNrYWdlIGlkZW50aWZpZXIgeW91IHdhbnQgdG8gdXNlCisgICAgZm9yIHlvdXIgdGVzdCBjYXNlIGNsYXNzZXMgYW5kIHRoZSBBbmRyb2lkIHBhY2thZ2UgbmFtZSB5b3Ugd2FudCB0byB1c2UuIFRvIGxlYXJuIG1vcmUKKyAgICBhYm91dCB0aGlzLCBwbGVhc2UgcmVhZAorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCNQYWNrYWdlTmFtZXMiPgorICAgIFRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPi4KKzwvcD4KKzxwPgorICAgIFRvIGFkZCBhIHRlc3QgY2FzZSBjbGFzcyB0byB5b3VyIHByb2plY3Q6Cis8L3A+Cis8b2w+CisgICAgPGxpPgorICAgICAgICBJbiB0aGUgPGVtPlByb2plY3QgRXhwbG9yZXI8L2VtPiB0YWIsIG9wZW4geW91ciB0ZXN0IHByb2plY3QsIHRoZW4gb3BlbiB0aGUgPGVtPnNyYzwvZW0+CisgICAgICAgIGZvbGRlci4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgRmluZCB0aGUgSmF2YSBwYWNrYWdlIGlkZW50aWZpZXIgc2V0IGJ5IHRoZSBwcm9qZWN0aW9uIGNyZWF0aW9uIHdpemFyZC4gSWYgeW91IGhhdmVuJ3QKKyAgICAgICAgYWRkZWQgY2xhc3NlcyB5ZXQsIHRoaXMgbm9kZSB3b24ndCBoYXZlIGFueSBjaGlsZHJlbiwgYW5kIGl0cyBpY29uIHdpbGwgbm90IGJlIGZpbGxlZCBpbi4KKyAgICAgICAgSWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoZSBpZGVudGlmaWVyIHZhbHVlLCByaWdodC1jbGljayB0aGUgaWRlbnRpZmllciBhbmQgc2VsZWN0CisgICAgICAgIDxzdHJvbmc+UmVmYWN0b3I8L3N0cm9uZz4gJmd0OyA8c3Ryb25nPlJlbmFtZTwvc3Ryb25nPiwgdGhlbiBlbnRlciB0aGUgbmV3IG5hbWUuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFdoZW4geW91IGFyZSByZWFkeSwgcmlnaHQtY2xpY2sgdGhlIEphdmEgcGFja2FnZSBpZGVudGlmaWVyIGFnYWluIGFuZCBzZWxlY3QKKyAgICAgICAgPHN0cm9uZz5OZXc8L3N0cm9uZz4gJmd0OyA8c3Ryb25nPkNsYXNzPC9zdHJvbmc+LiBUaGlzIGRpc3BsYXlzIHRoZSA8ZW0+TmV3IEphdmEgQ2xhc3M8L2VtPgorICAgICAgICBkaWFsb2csIHdpdGggdGhlIDxlbT5Tb3VyY2UgZm9sZGVyPC9lbT4gYW5kIDxlbT5QYWNrYWdlPC9lbT4gdmFsdWVzIGFscmVhZHkgc2V0LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBJbiB0aGUgPGVtPk5hbWU8L2VtPiBmaWVsZCwgZW50ZXIgYSBuYW1lIGZvciB0aGUgdGVzdCBjYXNlIGNsYXNzLiBPbmUgd2F5IHRvIGNob29zZSBhCisgICAgICAgIGNsYXNzIG5hbWUgaXMgdG8gYXBwZW5kIHRoZSBzdHJpbmcgIlRlc3QiIHRvIHRoZSBjbGFzcyBvZiB0aGUgY29tcG9uZW50IHlvdSBhcmUgdGVzdGluZy4KKyAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgdGVzdGluZyB0aGUgY2xhc3MgTXlBcHBBY3Rpdml0eSwgeW91ciB0ZXN0IGNhc2UgY2xhc3MKKyAgICAgICAgbmFtZSB3b3VsZCBiZSBNeUFwcEFjdGl2aXR5VGVzdC4gTGVhdmUgdGhlIG1vZGlmaWVycyBzZXQgdG8gPGVtPnB1YmxpYzwvZW0+LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBJbiB0aGUgPGVtPlN1cGVyY2xhc3M8L2VtPiBmaWVsZCwgZW50ZXIgdGhlIG5hbWUgb2YgdGhlIEFuZHJvaWQgdGVzdCBjYXNlIGNsYXNzIHlvdQorICAgICAgICBhcmUgZXh0ZW5kaW5nLiBZb3UgY2FuIGFsc28gYnJvd3NlIHRoZSBhdmFpbGFibGUgY2xhc3Nlcy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgSW4gPGVtPldoaWNoIG1ldGhvZCBzdHVicyB3b3VsZCB5b3UgbGlrZSB0byBjcmVhdGU/PC9lbT4sIHVuc2V0IGFsbCB0aGUgb3B0aW9ucywgdGhlbgorICAgICAgICBjbGljayA8c3Ryb25nPkZpbmlzaDwvc3Ryb25nPi4gWW91IHdpbGwgc2V0IHVwIHRoZSBjb25zdHJ1Y3RvciBtYW51YWxseS4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgWW91ciBuZXcgY2xhc3MgYXBwZWFycyBpbiBhIG5ldyBKYXZhIGVkaXRvciBwYW5lLgorICAgIDwvbGk+CiA8L29sPgogPHA+Ci0KLTwvcD4KLTxoMiBpZD0iQ3JlYXRlVGVzdEFwcEVjbGlwc2UiPkNyZWF0aW5nIGEgVGVzdCBBcHBsaWNhdGlvbjwvaDI+Ci08cD4KLSAgT25jZSB5b3UgaGF2ZSBjcmVhdGVkIGEgdGVzdCBwcm9qZWN0LCB5b3UgcG9wdWxhdGUgaXQgd2l0aCBhIHRlc3QKLSAgQW5kcm9pZCBhcHBsaWNhdGlvbi4gVGhpcyBhcHBsaWNhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFuIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSBBY3Rpdml0eX0sCi0gIGFsdGhvdWdoIHlvdSBjYW4gZGVmaW5lIG9uZSBpZiB5b3Ugd2lzaC4gQWx0aG91Z2ggeW91ciB0ZXN0IGFwcGxpY2F0aW9uIGNhbgotICBjb21iaW5lIEFjdGl2aXRpZXMsIEFuZHJvaWQgdGVzdCBjbGFzcyBleHRlbnNpb25zLCBKVW5pdCBleHRlbnNpb25zLCBvcgotICBvcmRpbmFyeSBjbGFzc2VzLCB5b3Ugc2hvdWxkIGV4dGVuZCBvbmUgb2YgdGhlIEFuZHJvaWQgdGVzdCBjbGFzc2VzIG9yIEpVbml0IGNsYXNzZXMsCi0gIGJlY2F1c2UgdGhlc2UgcHJvdmlkZSB0aGUgYmVzdCB0ZXN0aW5nIGZlYXR1cmVzLgorICAgIFlvdSBub3cgaGF2ZSB0byBlbnN1cmUgdGhhdCB0aGUgY29uc3RydWN0b3IgaXMgc2V0IHVwIGNvcnJlY3RseS4gQ3JlYXRlIGEgY29uc3RydWN0b3IgZm9yIHlvdXIKKyAgICBjbGFzcyB0aGF0IGhhcyBubyBhcmd1bWVudHM7IHRoaXMgaXMgcmVxdWlyZWQgYnkgSlVuaXQuIEFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhpcworICAgIGNvbnN0cnVjdG9yLCBhZGQgYSBjYWxsIHRvIHRoZSBiYXNlIGNsYXNzJyBjb25zdHJ1Y3Rvci4gRWFjaCBiYXNlIHRlc3QgY2FzZSBjbGFzcyBoYXMgaXRzCisgICAgb3duIGNvbnN0cnVjdG9yIHNpZ25hdHVyZS4gUmVmZXIgdG8gdGhlIGNsYXNzIGRvY3VtZW50YXRpb24gaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yCisgICAge0BsaW5rIGFuZHJvaWQudGVzdH0gZm9yIG1vcmUgaW5mb3JtYXRpb24uCiA8L3A+CiA8cD4KLSAgVGVzdCBhcHBsaWNhdGlvbnMgZG8gbm90IGhhdmUgYW4gQW5kcm9pZCBHVUkuIEluc3RlYWQsIHdoZW4geW91IHJ1biB0aGUgYXBwbGljYXRpb24gaW4KLSAgRWNsaXBzZSB3aXRoIEFEVCwgaXRzIHJlc3VsdHMgYXBwZWFyIGluIHRoZSBKVW5pdCB2aWV3LiBJZiB5b3UgcnVuCi0gIHlvdXIgdGVzdHMgd2l0aCB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0gKG9yIGEgcmVsYXRlZCB0ZXN0IHJ1bm5lciksCi0gIHRoZW4gaXQgd2lsbCBydW4gYWxsIHRoZSBtZXRob2RzIGluIGVhY2ggY2xhc3MuIFlvdSBjYW4gbW9kaWZ5IHRoaXMgYmVoYXZpb3IKLSAgYnkgdXNpbmcgdGhlIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlIFRlc3RTdWl0ZX0gY2xhc3MuCi08L3A+Ci0KLTxwPgotICBUbyBjcmVhdGUgYSB0ZXN0IGFwcGxpY2F0aW9uLCBzdGFydCB3aXRoIG9uZSBvZiBBbmRyb2lkJ3MgdGVzdCBjbGFzc2VzIGluIHRoZSBKYXZhIHBhY2thZ2Uge0BsaW5rIGFuZHJvaWQudGVzdCBhbmRyb2lkLnRlc3R9LgotICBUaGVzZSBleHRlbmQgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgVGVzdENhc2V9IGNsYXNzLiBXaXRoIGEgZmV3IGV4Y2VwdGlvbnMsIHRoZSBBbmRyb2lkIHRlc3QgY2xhc3NlcwotICBhbHNvIHByb3ZpZGUgaW5zdHJ1bWVudGF0aW9uIGZvciB0ZXN0aW5nLgotPC9wPgotPHA+Ci0gIEZvciB0ZXN0IGNsYXNzZXMgdGhhdCBleHRlbmQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSBUZXN0Q2FzZX0sIHlvdSBwcm9iYWJseSB3YW50IHRvIG92ZXJyaWRlCi0gIHRoZSA8Y29kZT5zZXRVcCgpPC9jb2RlPiBhbmQgPGNvZGU+dGVhckRvd24oKTwvY29kZT4gbWV0aG9kczoKKyAgICBUbyBjb250cm9sIHlvdXIgdGVzdCBlbnZpcm9ubWVudCwgeW91IHdpbGwgd2FudCB0byBvdmVycmlkZSB0aGUgPGNvZGU+c2V0VXAoKTwvY29kZT4gYW5kCisgICAgPGNvZGU+dGVhckRvd24oKTwvY29kZT4gbWV0aG9kczoKIDwvcD4KIDx1bD4KLSAgPGxpPgotICAgIDxjb2RlPnNldFVwKCk8L2NvZGU+OiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJlZm9yZSBhbnkgb2YgdGhlIHRlc3QgbWV0aG9kcyBpbiB0aGUgY2xhc3MuCi0gICAgICBVc2UgaXQgdG8gc2V0IHVwIHRoZSBlbnZpcm9ubWVudCBmb3IgdGhlIHRlc3QuIFlvdSBjYW4gdXNlIDxjb2RlPnNldFVwKCk8L2NvZGU+Ci0gICAgICB0byBpbnN0YW50aWF0ZSBhIG5ldyA8Y29kZT5JbnRlbnQ8L2NvZGU+IG9iamVjdCB3aXRoIHRoZSBhY3Rpb24gPGNvZGU+QUNUSU9OX01BSU48L2NvZGU+LiBZb3UgY2FuCi0gICAgICB0aGVuIHVzZSB0aGlzIGludGVudCB0byBzdGFydCB0aGUgQWN0aXZpdHkgdW5kZXIgdGVzdC4KLSAgICAgIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgY2FsbAotICAgICAgICA8Y29kZT5zdXBlci5zZXRVcCgpPC9jb2RlPiBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHlvdXIgY29kZS4KLSAgICAgIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxjb2RlPnRlYXJEb3duKCk8L2NvZGU+OiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGFmdGVyIGFsbCB0aGUgdGVzdCBtZXRob2RzIGluIHRoZSBjbGFzcy4gVXNlCi0gICAgaXQgdG8gZG8gZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZCByZS1zZXR0aW5nIGJlZm9yZSBtb3Zpbmcgb24gdG8gdGhlIG5leHQgc2V0IG9mIHRlc3RzLgotICAgIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgeW91IG11c3QgY2FsbAotICAgIDxjb2RlPnN1cGVyLnRlYXJEb3duKCk8L2NvZGU+IGFzIHRoZSA8ZW0+bGFzdDwvZW0+IHN0YXRlbWVudCBpbiB5b3VyIGNvZGUuPC9wPgotICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGNvZGU+c2V0VXAoKTwvY29kZT46IFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYmVmb3JlIGFueSBvZiB0aGUgdGVzdCBtZXRob2RzIGluIHRoZSBjbGFzcy4KKyAgICAgICAgVXNlIGl0IHRvIHNldCB1cCB0aGUgZW52aXJvbm1lbnQgZm9yIHRoZSB0ZXN0ICh0aGUgdGVzdCBmaXh0dXJlLiBZb3UgY2FuIHVzZQorICAgICAgICA8Y29kZT5zZXRVcCgpPC9jb2RlPiB0byBpbnN0YW50aWF0ZSBhIG5ldyBJbnRlbnQgd2l0aCB0aGUgYWN0aW9uIDxjb2RlPkFDVElPTl9NQUlOPC9jb2RlPi4KKyAgICAgICAgWW91IGNhbiB0aGVuIHVzZSB0aGlzIGludGVudCB0byBzdGFydCB0aGUgQWN0aXZpdHkgdW5kZXIgdGVzdC4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGNvZGU+dGVhckRvd24oKTwvY29kZT46IFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYWZ0ZXIgYWxsIHRoZSB0ZXN0IG1ldGhvZHMgaW4gdGhlIGNsYXNzLiBVc2UKKyAgICAgICAgaXQgdG8gZG8gZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZCB0byByZXNldCB0aGUgdGVzdCBmaXh0dXJlLgorICAgIDwvbGk+CiA8L3VsPgogPHA+Ci0gIEFub3RoZXIgdXNlZnVsIGNvbnZlbnRpb24gaXMgdG8gYWRkIHRoZSBtZXRob2QgPGNvZGU+dGVzdFByZUNvbmRpdGlvbnMoKTwvY29kZT4gdG8geW91ciB0ZXN0Ci0gIGNsYXNzLiBVc2UgdGhpcyBtZXRob2QgdG8gdGVzdCB0aGF0IHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGlzIGluaXRpYWxpemVkIGNvcnJlY3RseS4gSWYgdGhpcwotICB0ZXN0IGZhaWxzLCB5b3Uga25vdyB0aGF0IHRoYXQgdGhlIGluaXRpYWwgY29uZGl0aW9ucyB3ZXJlIGluIGVycm9yLiBXaGVuIHRoaXMgaGFwcGVucywgZnVydGhlciB0ZXN0Ci0gIHJlc3VsdHMgYXJlIHN1c3BlY3QsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgdGhlIHRlc3RzIHN1Y2NlZWRlZC4KKyAgICBBbm90aGVyIHVzZWZ1bCBjb252ZW50aW9uIGlzIHRvIGFkZCB0aGUgbWV0aG9kIDxjb2RlPnRlc3RQcmVjb25kaXRpb25zKCk8L2NvZGU+IHRvIHlvdXIgdGVzdAorICAgIGNsYXNzLiBVc2UgdGhpcyBtZXRob2QgdG8gdGVzdCB0aGF0IHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGlzIGluaXRpYWxpemVkIGNvcnJlY3RseS4gSWYgdGhpcworICAgIHRlc3QgZmFpbHMsIHlvdSBrbm93IHRoYXQgdGhhdCB0aGUgaW5pdGlhbCBjb25kaXRpb25zIHdlcmUgaW4gZXJyb3IuIFdoZW4gdGhpcyBoYXBwZW5zLCBmdXJ0aGVyCisgICAgdGVzdCByZXN1bHRzIGFyZSBzdXNwZWN0LCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IHRoZSB0ZXN0cyBzdWNjZWVkZWQuCiA8L3A+CiA8cD4KLSAgVGhlIFJlc291cmNlcyB0YWIgY29udGFpbnMgYW4gPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5IFRlc3Rpbmc8L2E+Ci0gIHR1dG9yaWFsIHdpdGggbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjcmVhdGluZyB0ZXN0IGNsYXNzZXMgYW5kIG1ldGhvZHMuCisgICAgVGhlIFJlc291cmNlcyB0YWIgY29udGFpbnMgYW4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+QWN0aXZpdHkgVGVzdGluZzwvYT4KKyAgICB0dXRvcmlhbCB3aXRoIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY3JlYXRpbmcgdGVzdCBjbGFzc2VzIGFuZCBtZXRob2RzLgogPC9wPgogPGgyIGlkPSJSdW5UZXN0RWNsaXBzZSI+UnVubmluZyBUZXN0czwvaDI+CisgICAgPGRpdiBjbGFzcz0ic2lkZWJveC13cmFwcGVyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJveCI+CisgICAgICAgICAgICA8aDI+UnVubmluZyB0ZXN0cyBmcm9tIHRoZSBjb21tYW5kIGxpbmU8L2gyPgorICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgICAgICBJZiB5b3UndmUgY3JlYXRlZCB5b3VyIHRlc3RzIGluIEVjbGlwc2UsIHlvdSBjYW4gc3RpbGwgcnVuIHlvdXIgdGVzdHMgYW5kIHRlc3QKKyAgICAgICAgICAgICAgICAgICAgc3VpdGVzIGJ5IHVzaW5nIGNvbW1hbmQtbGluZSB0b29scyBpbmNsdWRlZCB3aXRoIHRoZSBBbmRyb2lkIFNESy4gWW91IG1heSB3YW50CisgICAgICAgICAgICAgICAgICAgIHRvIGRvIHRoaXMsIGZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIGxhcmdlIG51bWJlciBvZiB0ZXN0cyB0byBydW4sIGlmIHlvdQorICAgICAgICAgICAgICAgICAgICBoYXZlIGEgbGFyZ2UgdGVzdCBjYXNlLCBvciBpZiB5b3Ugd2FudCBhIGZpbmUgbGV2ZWwgb2YgY29udHJvbCBvdmVyIHdoaWNoCisgICAgICAgICAgICAgICAgICAgIHRlc3RzIGFyZSBydW4gYXQgYSBwYXJ0aWN1bGFyIHRpbWUuCisgICAgICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgICAgICBUbyBydW4gdGVzdHMgY3JlYXRlZCBpbiBFY2xpcHNlIHdpdGggQURUIHdpdGggY29tbWFuZC1saW5lIHRvb2xzLCB5b3UgbXVzdCBmaXJzdAorICAgICAgICAgICAgICAgICAgICBpbnN0YWxsIGFkZGl0aW9uYWwgZmlsZXMgaW50byB0aGUgdGVzdCBwcm9qZWN0IHVzaW5nIHRoZSA8Y29kZT5hbmRyb2lkPC9jb2RlPgorICAgICAgICAgICAgICAgICAgICB0b29sJ3MgImNyZWF0ZSB0ZXN0LXByb2plY3QiIG9wdGlvbi4gVG8gc2VlIGhvdyB0byBkbyB0aGlzLCByZWFkCisgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwjQ3JlYXRlUHJvamVjdCI+CisgICAgICAgICAgICAgICAgICAgIFRlc3RpbmcgaW4gT3RoZXIgSURFczwvYT4uCisgICAgICAgICAgICAgICAgPC9wPgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKzxwPgorICAgIFdoZW4geW91IHJ1biBhIHRlc3QgcGFja2FnZSBpbiBFY2xpcHNlIHdpdGggQURULCB0aGUgb3V0cHV0IGFwcGVhcnMgaW4gdGhlIEVjbGlwc2UgSlVuaXQgdmlldy4KKyAgICBZb3UgY2FuIHJ1biB0aGUgZW50aXJlIHRlc3QgcGFja2FnZSBvciBvbmUgdGVzdCBjYXNlIGNsYXNzLiBUbyBkbyBydW4gdGVzdHMsIEVjbGlwc2UgcnVucyB0aGUKKyAgICA8Y29kZT5hZGI8L2NvZGU+IGNvbW1hbmQgZm9yIHJ1bm5pbmcgYSB0ZXN0IHBhY2thZ2UsIGFuZCBkaXNwbGF5cyB0aGUgb3V0cHV0LCBzbyB0aGVyZSBpcyBubworICAgIGRpZmZlcmVuY2UgYmV0d2VlbiBydW5uaW5nIHRlc3RzIGluc2lkZSBFY2xpcHNlIGFuZCBydW5uaW5nIHRoZW0gZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorPC9wPgorPHA+CisgICAgQXMgd2l0aCBhbnkgb3RoZXIgcGFja2FnZSwgdG8gcnVuIGEgdGVzdCBwYWNrYWdlIGluIEVjbGlwc2Ugd2l0aCBBRFQgeW91IG11c3QgZWl0aGVyIGF0dGFjaCBhCisgICAgZGV2aWNlIHRvIHlvdXIgY29tcHV0ZXIgb3IgdXNlIHRoZSBBbmRyb2lkIGVtdWxhdG9yLiBJZiB5b3UgdXNlIHRoZSBlbXVsYXRvciwgeW91IG11c3QgaGF2ZSBhbgorICAgIEFuZHJvaWQgVmlydHVhbCBEZXZpY2UgKEFWRCkgdGhhdCB1c2VzIHRoZSBzYW1lIHRhcmdldCBhcyB0aGUgdGVzdCBwYWNrYWdlLgorPC9wPgorPHA+CisgICAgVG8gcnVuIGEgdGVzdCBpbiBFY2xpcHNlLCB5b3UgaGF2ZSB0d28gY2hvaWNlczo8L3A+Cis8dWw+CisgICAgPGxpPgorICAgICAgICBSdW4gYSB0ZXN0IGp1c3QgYXMgeW91IHJ1biBhbiBhcHBsaWNhdGlvbiwgYnkgc2VsZWN0aW5nCisgICAgICAgIDxzdHJvbmc+UnVuIEFzLi4uICZndDsgQW5kcm9pZCBKVW5pdCBUZXN0PC9zdHJvbmc+IGZyb20gdGhlIHByb2plY3QncyBjb250ZXh0IG1lbnUgb3IKKyAgICAgICAgZnJvbSB0aGUgbWFpbiBtZW51J3MgPHN0cm9uZz5SdW48L3N0cm9uZz4gaXRlbS4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgQ3JlYXRlIGFuIEVjbGlwc2UgcnVuIGNvbmZpZ3VyYXRpb24gZm9yIHlvdXIgdGVzdCBwcm9qZWN0LiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudAorICAgICAgICBtdWx0aXBsZSB0ZXN0IHN1aXRlcywgZWFjaCBjb25zaXN0aW5nIG9mIHNlbGVjdGVkIHRlc3RzIGZyb20gdGhlIHByb2plY3QuIFRvIHJ1bgorICAgICAgICBhIHRlc3Qgc3VpdGUsIHlvdSBydW4gdGhlIHRlc3QgY29uZmlndXJhdGlvbi4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBDcmVhdGluZyBhbmQgcnVubmluZyB0ZXN0IGNvbmZpZ3VyYXRpb25zIGlzIGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLgorICAgICAgICA8L3A+CisgICAgPC9saT4KKzwvdWw+Cis8cD4KKyAgICBUbyBjcmVhdGUgYW5kIHJ1biBhIHRlc3Qgc3VpdGUgdXNpbmcgYSBydW4gY29uZmlndXJhdGlvbjoKKzwvcD4KKzxvbD4KKyAgICA8bGk+CisgICAgICAgIEluIHRoZSBQYWNrYWdlIEV4cGxvcmVyLCBzZWxlY3QgdGhlIHRlc3QgcHJvamVjdCwgdGhlbiBmcm9tIHRoZSBtYWluIG1lbnUsIHNlbGVjdAorICAgICAgICA8c3Ryb25nPlJ1biAmZ3Q7IFJ1biBDb25maWd1cmF0aW9ucy4uLjwvc3Ryb25nPi4gVGhlIFJ1biBDb25maWd1cmF0aW9ucyBkaWFsb2cgYXBwZWFycy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgSW4gdGhlIGxlZnQtaGFuZCBwYW5lLCBmaW5kIHRoZSBBbmRyb2lkIEpVbml0IFRlc3QgZW50cnkuIEluIHRoZSByaWdodC1oYW5kIHBhbmUsIGNsaWNrIHRoZQorICAgICAgICBUZXN0IHRhYi4gVGhlIE5hbWU6IHRleHQgYm94IHNob3dzIHRoZSBuYW1lIG9mIHlvdXIgcHJvamVjdC4gVGhlIFRlc3QgY2xhc3M6IGRyb3Bkb3duIGJveAorICAgICAgICBzaG93cyBvbmUgb2YgdGhlIHRlc3QgY2xhc3NlcyBpbiB5b3VyIHByb2plY3QuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRvIHJ1biBvbmUgdGVzdCBjbGFzcywgY2xpY2sgIFJ1biBhIHNpbmdsZSB0ZXN0LCB0aGVuIGVudGVyIHlvdXIgcHJvamVjdCBuYW1lIGluIHRoZQorICAgICAgICBQcm9qZWN0OiB0ZXh0IGJveCBhbmQgdGhlIGNsYXNzIG5hbWUgaW4gdGhlIFRlc3QgY2xhc3M6IHRleHQgYm94LgorICAgICAgICA8cD4KKyAgICAgICAgICAgIFRvIHJ1biBhbGwgdGhlIHRlc3QgY2xhc3NlcywgY2xpY2sgUnVuIGFsbCB0ZXN0cyBpbiB0aGUgc2VsZWN0ZWQgcHJvamVjdCBvciBwYWNrYWdlLAorICAgICAgICAgICAgdGhlbiBlbnRlciB0aGUgcHJvamVjdCBvciBwYWNrYWdlIG5hbWUgaW4gdGhlIHRleHQgYm94LgorICAgICAgICA8L3A+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIE5vdyBjbGljayB0aGUgVGFyZ2V0IHRhYi4KKyAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIE9wdGlvbmFsOiBJZiB5b3UgYXJlIHVzaW5nIHRoZSBlbXVsYXRvciwgY2xpY2sgQXV0b21hdGljLCB0aGVuIGluIHRoZSBBbmRyb2lkCisgICAgICAgICAgICAgICAgVmlydHVhbCBEZXZpY2UgKEFWRCkgc2VsZWN0aW9uIHRhYmxlLCBzZWxlY3QgYW4gZXhpc3RpbmcgQVZELgorICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICBJbiB0aGUgRW11bGF0b3IgTGF1bmNoIFBhcmFtZXRlcnMgcGFuZSwgc2V0IHRoZSBBbmRyb2lkIGVtdWxhdG9yIGZsYWdzIHlvdSB3YW50IHRvCisgICAgICAgICAgICAgICAgdXNlLiBUaGVzZSBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgdG9waWMKKyAgICAgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9lbXVsYXRvci5odG1sI3N0YXJ0dXAtb3B0aW9ucyI+CisgICAgICAgICAgICAgICAgQW5kcm9pZCBFbXVsYXRvcjwvYT4uCisgICAgICAgICAgICA8L2xpPgorICAgICAgICA8L3VsPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBDbGljayB0aGUgQ29tbW9uIHRhYi4gSW4gdGhlIFNhdmUgQXMgcGFuZSwgY2xpY2sgTG9jYWwgdG8gc2F2ZSB0aGlzIHJ1biBjb25maWd1cmF0aW9uCisgICAgICAgIGxvY2FsbHksIG9yIGNsaWNrIFNoYXJlZCB0byBzYXZlIGl0IHRvIGFub3RoZXIgcHJvamVjdC4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgT3B0aW9uYWw6IEFkZCB0aGUgY29uZmlndXJhdGlvbiB0byB0aGUgUnVuIHRvb2xiYXIgYW5kIHRoZSA8c3Ryb25nPkZhdm9yaXRlczwvc3Ryb25nPgorICAgICAgICBtZW51OiBpbiB0aGUgRGlzcGxheSBpbiBGYXZvcml0ZXMgcGFuZSBjbGljayB0aGUgY2hlY2tib3ggbmV4dCB0byBSdW4uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIE9wdGlvbmFsOiBUbyBhZGQgdGhpcyBjb25maWd1cmF0aW9uIHRvIHRoZSA8c3Ryb25nPkRlYnVnPC9zdHJvbmc+IG1lbnUgYW5kIHRvb2xiYXIsIGNsaWNrCisgICAgICAgIHRoZSBjaGVja2JveCBuZXh0IHRvIERlYnVnLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBUbyBzYXZlIHlvdXIgc2V0dGluZ3MsIGNsaWNrIENsb3NlLjxici8+CisgICAgICAgIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+CisgICAgICAgICAgICBBbHRob3VnaCB5b3UgY2FuIHJ1biB0aGUgdGVzdCBpbW1lZGlhdGVseSBieSBjbGlja2luZyBSdW4sIHlvdSBzaG91bGQgc2F2ZSB0aGUgdGVzdAorICAgICAgICAgICAgZmlyc3QgYW5kIHRoZW4gcnVuIGl0IGJ5IHNlbGVjdGluZyBpdCBmcm9tIHRoZSBFY2xpcHNlIHN0YW5kYXJkIHRvb2xiYXIuCisgICAgICAgIDwvcD4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgT24gdGhlIEVjbGlwc2Ugc3RhbmRhcmQgdG9vbGJhciwgY2xpY2sgdGhlIGRvd24gYXJyb3cgbmV4dCB0byB0aGUgZ3JlZW4gUnVuIGFycm93LiBUaGlzCisgICAgICAgIGRpc3BsYXlzIGEgbWVudSBvZiBzYXZlZCBSdW4gYW5kIERlYnVnIGNvbmZpZ3VyYXRpb25zLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBTZWxlY3QgdGhlIHRlc3QgcnVuIGNvbmZpZ3VyYXRpb24geW91IGp1c3QgY3JlYXRlZC4gVGhlIHRlc3Qgc3RhcnRzLgorICAgIDwvbGk+Cis8L29sPgorPHA+CisgICAgVGhlIHByb2dyZXNzIG9mIHlvdXIgdGVzdCBhcHBlYXJzIGluIHRoZSBDb25zb2xlIHZpZXcgYXMgYSBzZXJpZXMgb2YgbWVzc2FnZXMuIEVhY2ggbWVzc2FnZSBpcworICAgIHByZWNlZGVkIGJ5IGEgdGltZXN0YW1wIGFuZCB0aGUgPGNvZGU+LmFwazwvY29kZT4gZmlsZW5hbWUgdG8gd2hpY2ggaXQgYXBwbGllcy4gRm9yIGV4YW1wbGUsCisgICAgdGhpcyBtZXNzYWdlIGFwcGVhcnMgd2hlbiB5b3UgcnVuIGEgdGVzdCB0byB0aGUgZW11bGF0b3IsIGFuZCB0aGUgZW11bGF0b3IgaXMgbm90IHlldCBzdGFydGVkOgorPC9wPgogPGRpdiBjbGFzcz0ic2lkZWJveC13cmFwcGVyIj4KICAgICA8ZGl2IGNsYXNzPSJzaWRlYm94Ij4KLSAgICAgICAgPGgyPlJ1bm5pbmcgdGVzdHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lPC9oMj4KLSAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgIElmIHlvdSd2ZSBjcmVhdGVkIHlvdXIgdGVzdHMgaW4gRWNsaXBzZSwgeW91IGNhbiBzdGlsbCBydW4geW91ciB0ZXN0cyBhbmQgdGVzdAotICAgICAgICAgICAgICAgIHN1aXRlcyBieSB1c2luZyBjb21tYW5kLWxpbmUgdG9vbHMgaW5jbHVkZWQgd2l0aCB0aGUgQW5kcm9pZCBTREsuIFlvdSBtYXkgd2FudCB0bwotICAgICAgICAgICAgICAgIGRvIHRoaXMsIGZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIGxhcmdlIG51bWJlciBvZiB0ZXN0cyB0byBydW4sIGlmIHlvdSBoYXZlIGEKLSAgICAgICAgICAgICAgICBsYXJnZSB0ZXN0IGNhc2UsIG9yIGlmIHlvdSB3YW50IGEgZmluZSBsZXZlbCBvZiBjb250cm9sIG92ZXIgd2hpY2ggdGVzdHMgYXJlIHJ1biBhdAotICAgICAgICAgICAgICAgIGEgcGFydGljdWxhciB0aW1lLgotICAgICAgICAgICAgPC9wPgotICAgICAgICAgICAgPHA+Ci0gICAgICAgICAgICAgICAgVG8gcnVuIHRlc3RzIGNyZWF0ZWQgaW4gRWNsaXBzZSB3aXRoIEFEVCB3aXRoIGNvbW1hbmQtbGluZSB0b29scywgeW91IG11c3QgZmlyc3QKLSAgICAgICAgICAgICAgICBpbnN0YWxsIGFkZGl0aW9uYWwgZmlsZXMgaW50byB0aGUgdGVzdCBwcm9qZWN0IHVzaW5nIHRoZSA8Y29kZT5hbmRyb2lkPC9jb2RlPiB0b29sJ3MKLSAgICAgICAgICAgICAgICAiY3JlYXRlIHRlc3QtcHJvamVjdCIgb3B0aW9uLiBUbyBzZWUgaG93IHRvIGRvIHRoaXMsIHJlYWQgdGhlIHNlY3Rpb24KLSAgICAgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCNDcmVhdGVQcm9qZWN0Ij4KLSAgICAgICAgICAgICAgICBDcmVhdGluZyBhIHRlc3QgcHJvamVjdDwvYT4gaW4gdGhlIHRvcGljCi0gICAgICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwiPlRlc3RpbmcgaW4gT3RoZXIKLSAgICAgICAgICAgICAgICBJREVzPC9hPi4KLSAgICAgICAgICAgIDwvcD4KKyAgICAgICAgPGgyPk1lc3NhZ2UgRXhhbXBsZXM8L2gyPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIFRoZSBleGFtcGxlcyBzaG93biBpbiB0aGlzIHNlY3Rpb24gY29tZSBmcm9tIHRoZQorICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL1NwaW5uZXJUZXN0L2luZGV4Lmh0bWwiPlNwaW5uZXJUZXN0PC9hPgorICAgICAgICAgICAgc2FtcGxlIHRlc3QgcGFja2FnZSwgd2hpY2ggdGVzdHMgdGhlCisgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3NhbXBsZXMvU3Bpbm5lci9pbmRleC5odG1sIj5TcGlubmVyPC9hPgorICAgICAgICAgICAgc2FtcGxlIGFwcGxpY2F0aW9uLiBUaGlzIHRlc3QgcGFja2FnZSBpcyBhbHNvIGZlYXR1cmVkIGluIHRoZQorICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5IFRlc3Rpbmc8L2E+CisgICAgICAgICAgICB0dXRvcmlhbC4KKyAgICAgICAgPC9wPgogICAgIDwvZGl2PgogPC9kaXY+Cis8cHJlPgorICAgIFs8ZW0+eXl5eS1tbS1kZCBoaDptbTpzczwvZW0+IC0gPGVtPnRlc3RmaWxlPC9lbT5dIFdhaXRpbmcgZm9yIEhPTUUgKCdhbmRyb2lkLnByb2Nlc3MuYWNvcmUnKSB0byBiZSBsYXVuY2hlZC4uLgorPC9wcmU+CiA8cD4KLSAgV2hlbiB5b3UgcnVuIGEgdGVzdCBhcHBsaWNhdGlvbiBpbiBFY2xpcHNlIHdpdGggQURULCB0aGUgb3V0cHV0IGFwcGVhcnMgaW4KLSAgYW4gRWNsaXBzZSB2aWV3IHBhbmVsLiBZb3UgY2FuIHJ1biB0aGUgZW50aXJlIHRlc3QgYXBwbGljYXRpb24sIG9uZSBjbGFzcywgb3Igb25lCi0gIG1ldGhvZCBvZiBhIGNsYXNzLiBUbyBkbyB0aGlzLCBFY2xpcHNlIHJ1bnMgdGhlIDxjb2RlPmFkYjwvY29kZT4gY29tbWFuZCBmb3IgcnVubmluZyBhIHRlc3QgYXBwbGljYXRpb24sIGFuZAotICBkaXNwbGF5cyB0aGUgb3V0cHV0LCBzbyB0aGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gcnVubmluZyB0ZXN0cyBpbnNpZGUgRWNsaXBzZSBhbmQgcnVubmluZyB0aGVtIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KKyAgICBJbiB0aGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uIG9mIHRoZXNlIG1lc3NhZ2VzLCA8Y29kZT48ZW0+ZGV2aWNlbmFtZTwvZW0+PC9jb2RlPiBpcyB0aGUgbmFtZSBvZgorICAgIHRoZSBkZXZpY2Ugb3IgZW11bGF0b3IgeW91IGFyZSB1c2luZyB0byBydW4gdGhlIHRlc3QsIGFuZCA8Y29kZT48ZW0+cG9ydDwvZW0+PC9jb2RlPiBpcyB0aGUKKyAgICBwb3J0IG51bWJlciBmb3IgdGhlIGRldmljZS4gVGhlIG5hbWUgYW5kIHBvcnQgbnVtYmVyIGFyZSBpbiB0aGUgZm9ybWF0IHVzZWQgYnkgdGhlCisgICAgPGNvZGU+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYWRiLmh0bWwjZGV2aWNlc3RhdHVzIj5hZGIgZGV2aWNlczwvYT48L2NvZGU+CisgICAgY29tbWFuZC4gQWxzbywgPGNvZGU+PGVtPnRlc3RmaWxlPC9lbT48L2NvZGU+IGlzIHRoZSA8Y29kZT4uYXBrPC9jb2RlPiBmaWxlbmFtZSBvZiB0aGUgdGVzdAorICAgIHBhY2thZ2UgeW91IGFyZSBydW5uaW5nLCBhbmQgPGVtPmFwcGZpbGU8L2VtPiBpcyB0aGUgZmlsZW5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuCiA8L3A+Ci08cD4KLSAgICBBcyB3aXRoIGFueSBvdGhlciBhcHBsaWNhdGlvbiwgdG8gcnVuIGEgdGVzdCBhcHBsaWNhdGlvbiBpbiBFY2xpcHNlIHdpdGggQURUIHlvdSBtdXN0IGVpdGhlciBhdHRhY2ggYSBkZXZpY2UgdG8geW91cgotICAgIGNvbXB1dGVyIG9yIHVzZSB0aGUgQW5kcm9pZCBlbXVsYXRvci4gSWYgeW91IHVzZSB0aGUgZW11bGF0b3IsIHlvdSBtdXN0IGhhdmUgYW4gQW5kcm9pZCBWaXJ0dWFsIERldmljZSAoQVZEKSB0aGF0IHVzZXMKLSAgICB0aGUgc2FtZSB0YXJnZXQKLTwvcD4KLTxwPgotICBUbyBydW4gYSB0ZXN0IGluIEVjbGlwc2UsIHlvdSBoYXZlIHR3byBjaG9pY2VzOjwvcD4KLTxvbD4KLSAgPGxpPgotICBSdW4gYSB0ZXN0IGp1c3QgYXMgeW91IHJ1biBhbiBhcHBsaWNhdGlvbiwgYnkgc2VsZWN0aW5nCi0gIDxzdHJvbmc+UnVuIEFzLi4uICZndDsgQW5kcm9pZCBKVW5pdCBUZXN0PC9zdHJvbmc+IGZyb20gdGhlIHByb2plY3QncyBjb250ZXh0IG1lbnUgb3IKLSAgZnJvbSB0aGUgbWFpbiBtZW51J3MgPHN0cm9uZz5SdW48L3N0cm9uZz4gaXRlbS4KLSAgPC9saT4KLSAgPGxpPgotICBDcmVhdGUgYW4gRWNsaXBzZSBydW4gY29uZmlndXJhdGlvbiBmb3IgeW91ciB0ZXN0IHByb2plY3QuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IG11bHRpcGxlIHRlc3Qgc3VpdGVzLCBlYWNoIGNvbnNpc3Rpbmcgb2Ygc2VsZWN0ZWQgdGVzdHMgZnJvbSB0aGUgcHJvamVjdC4gVG8gcnVuCi0gIGEgdGVzdCBzdWl0ZSwgeW91IHJ1biB0aGUgdGVzdCBjb25maWd1cmF0aW9uLgotICA8cD4KLSAgICBDcmVhdGluZyBhbmQgcnVubmluZyB0ZXN0IGNvbmZpZ3VyYXRpb25zIGlzIGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLgotICA8L3A+Ci0gIDwvbGk+Ci08L29sPgotPHA+VG8gY3JlYXRlIGFuZCBydW4gYSB0ZXN0IHN1aXRlIHVzaW5nIGEgcnVuIGNvbmZpZ3VyYXRpb246PC9wPgotPG9sPgotICA8bGk+Ci0gICAgSW4gdGhlIFBhY2thZ2UgRXhwbG9yZXIsIHNlbGVjdCB0aGUgdGVzdAotICAgIHByb2plY3QsIHRoZW4gZnJvbSB0aGUgbWFpbiBtZW51LCBzZWxlY3QKLSAgICA8c3Ryb25nPlJ1biAmZ3Q7IFJ1biBDb25maWd1cmF0aW9ucy4uLjwvc3Ryb25nPi4gVGhlCi0gICAgUnVuIENvbmZpZ3VyYXRpb25zIGRpYWxvZyBhcHBlYXJzLgotICA8L2xpPgotICA8bGk+Ci0gICAgSW4gdGhlIGxlZnQtaGFuZCBwYW5lLCBmaW5kIHRoZQotICAgIEFuZHJvaWQgSlVuaXQgVGVzdCBlbnRyeS4KLSAgICBJbiB0aGUgcmlnaHQtaGFuZCBwYW5lLCBjbGljayB0aGUgVGVzdCB0YWIuCi0gICAgVGhlIE5hbWU6IHRleHQgYm94Ci0gICAgc2hvd3MgdGhlIG5hbWUgb2YgeW91ciBwcm9qZWN0LiBUaGUKLSAgICBUZXN0IGNsYXNzOiBkcm9wZG93biBib3ggc2hvd3Mgb25lIHlvdXIgcHJvamVjdCdzIGNsYXNzZXMKLSAgICB0ZXN0IGNsYXNzZXMgaW4geW91ciBwcm9qZWN0LgotICA8L2xpPgotICA8bGk+Ci0gICAgVG8gcnVuIG9uZSB0ZXN0IGNsYXNzLCBjbGljayAgUnVuIGEgc2luZ2xlIHRlc3QsIHRoZW4gZW50ZXIgeW91ciBwcm9qZWN0Ci0gICAgbmFtZSBpbiB0aGUgUHJvamVjdDogdGV4dCBib3ggYW5kIHRoZSBjbGFzcyBuYW1lIGluIHRoZQotICAgIFRlc3QgY2xhc3M6IHRleHQgYm94LgotICAgIDxwPgotICAgICAgICBUbyBydW4gYWxsIHRoZSB0ZXN0IGNsYXNzZXMsCi0gICAgICAgIGNsaWNrIFJ1biBhbGwgdGVzdHMgaW4gdGhlIHNlbGVjdGVkIHByb2plY3Qgb3IgcGFja2FnZSwKLSAgICAgICAgdGhlbiBlbnRlciB0aGUgcHJvamVjdCBvciBwYWNrYWdlIG5hbWUgaW4gdGhlIHRleHQgYm94LgotICAgIDwvcD4KLSA8L2xpPgotICA8bGk+Ci0gICAgTm93IGNsaWNrIHRoZSBUYXJnZXQgdGFiLgotICAgIDx1bD4KLSAgICAgICAgPGxpPgotICAgICAgICAgICAgT3B0aW9uYWw6IElmIHlvdSBhcmUgdXNpbmcgdGhlIGVtdWxhdG9yLCBjbGljawotICAgICAgICAgICAgQXV0b21hdGljLCB0aGVuIGluIHRoZSBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlIChBVkQpCi0gICAgICAgICAgICBzZWxlY3Rpb24gdGFibGUsIHNlbGVjdCBhbiBleGlzdGluZyBBVkQuCi0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT4KLSAgICAgICAgICAgIEluIHRoZSBFbXVsYXRvciBMYXVuY2ggUGFyYW1ldGVycyBwYW5lLCBzZXQgdGhlCi0gICAgICAgICAgICBBbmRyb2lkIGVtdWxhdG9yIGZsYWdzIHlvdSB3YW50IHRvIHVzZS4gVGhlc2UgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIHRvcGljCi0gICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9lbXVsYXRvci5odG1sI3N0YXJ0dXAtb3B0aW9ucyI+RW11bGF0b3IgU3RhcnR1cCBPcHRpb25zPC9hPi4KLSAgICAgICAgPC9saT4KLSAgICA8L3VsPgotICA8bGk+Ci0gICAgQ2xpY2sgdGhlIENvbW1vbiB0YWIuIEluIHRoZQotICAgIFNhdmUgQXMgcGFuZSwgY2xpY2sgTG9jYWwgdG8gc2F2ZQotICAgIHRoaXMgcnVuIGNvbmZpZ3VyYXRpb24gbG9jYWxseSwgb3IgY2xpY2sgU2hhcmVkIHRvCi0gICAgc2F2ZSBpdCB0byBhbm90aGVyIHByb2plY3QuCi0gIDwvbGk+Ci0gIDxsaT4KLSAgICBPcHRpb25hbDogQWRkIHRoZSBjb25maWd1cmF0aW9uIHRvIHRoZSBSdW4gdG9vbGJhciBhbmQgdGhlIDxzdHJvbmc+RmF2b3JpdGVzPC9zdHJvbmc+Ci0gICAgbWVudTogaW4gdGhlIERpc3BsYXkgaW4gRmF2b3JpdGVzIHBhbmUKLSAgICBjbGljayB0aGUgY2hlY2tib3ggbmV4dCB0byBSdW4uCi0gIDwvbGk+Ci0gIDxsaT4KLSAgICBPcHRpb25hbDogVG8gYWRkIHRoaXMgY29uZmlndXJhdGlvbiB0byB0aGUgPHN0cm9uZz5EZWJ1Zzwvc3Ryb25nPiBtZW51IGFuZCB0b29sYmFyLCBjbGljawotICAgIHRoZSBjaGVja2JveCBuZXh0IHRvIERlYnVnLgotICA8L2xpPgotICA8bGk+Ci0gICAgVG8gc2F2ZSB5b3VyIHNldHRpbmdzLCBjbGljayBDbG9zZS48YnIvPgotICAgIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEFsdGhvdWdoIHlvdSBjYW4gcnVuIHRoZSB0ZXN0IGltbWVkaWF0ZWx5IGJ5Ci0gICAgY2xpY2tpbmcgUnVuLCB5b3Ugc2hvdWxkIHNhdmUgdGhlIHRlc3QgZmlyc3QgYW5kIHRoZW4KLSAgICBydW4gaXQgYnkgc2VsZWN0aW5nIGl0IGZyb20gdGhlIEVjbGlwc2Ugc3RhbmRhcmQgdG9vbGJhci48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICBPbiB0aGUgRWNsaXBzZSBzdGFuZGFyZCB0b29sYmFyLCBjbGljayB0aGUgZG93biBhcnJvdyBuZXh0IHRvIHRoZQotICAgIGdyZWVuIFJ1biBhcnJvdy4gVGhpcyBkaXNwbGF5cyBhIG1lbnUgb2Ygc2F2ZWQgUnVuIGFuZCBEZWJ1ZwotICAgIGNvbmZpZ3VyYXRpb25zLgotICA8L2xpPgotICA8bGk+Ci0gICAgU2VsZWN0IHRoZSB0ZXN0IHJ1biBjb25maWd1cmF0aW9uIHlvdSBqdXN0IGNyZWF0ZWQuCi0gIDwvbGk+Ci0gIDxsaT4KLSAgICBUaGUgcHJvZ3Jlc3Mgb2YgeW91ciB0ZXN0IGFwcGVhcnMgaW4gdGhlIENvbnNvbGUgdmlldy4KLSAgICBZb3Ugc2hvdWxkIHNlZSB0aGUgZm9sbG93aW5nIG1lc3NhZ2VzLCBhbW9uZyBvdGhlcnM6Ci0gICAgPHVsPgotICAgICAgPGxpPgotICAgICAgICA8Y29kZT5QZXJmb3JtaW5nIEFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIEpVbml0IGxhdW5jaDwvY29kZT48YnI+Ci0gICAgICAgIFRoZSBjbGFzcyBuYW1lIHRoYXQgcHJvY2VlZHMgIkpVbml0IiBkZXBlbmRzIG9uIHRoZSBBbmRyb2lkIGluc3RydW1lbnRhdGlvbgotICAgICAgICBjbGFzcyB5b3UgaGF2ZSBjaG9zZW4uCi0gICAgICA8L2xpPgotICAgICAgPGxpPgotICAgICAgICBJZiB5b3UgYXJlIHVzaW5nIGFuIGVtdWxhdG9yIGFuZCB5b3UgaGF2ZSBub3QgeWV0IHN0YXJ0ZWQgaXQsIHRoZW4geW91IHdpbGwgc2VlCis8dWw+CisgICAgPGxpPgorICAgICAgICBJZiB5b3UgYXJlIHVzaW5nIGFuIGVtdWxhdG9yIGFuZCB5b3UgaGF2ZSBub3QgeWV0IHN0YXJ0ZWQgaXQsIHRoZW4gRWNsaXBzZQorICAgICAgICBmaXJzdCBzdGFydHMgdGhlIGVtdWxhdG9yLiBXaGVuIHRoaXMgaXMgY29tcGxldGUsIHlvdSBzZWUKICAgICAgICAgdGhlIG1lc3NhZ2U6CiAgICAgICAgIDxwPgotICAgICAgICAgIDxjb2RlPkF1dG9tYXRpYyBUYXJnZXQgTW9kZTogbGF1bmNoaW5nIG5ldyBlbXVsYXRvciB3aXRoIGNvbXBhdGlibGUKLSAgICAgICAgICBBVkQgPGVtPmF2ZG5hbWU8L2VtPjwvY29kZT48YnI+KHdoZXJlIDxlbT5hdmRuYW1lPC9lbT4gaXMgdGhlIG5hbWUgb2YKLSAgICAgICAgICB0aGUgQVZEIHlvdSBhcmUgdXNpbmcuKQorICAgICAgICAgICAgPGNvZGU+SE9NRSBpcyB1cCBvbiBkZXZpY2UgJzxlbT5kZXZpY2VuYW1lPC9lbT4tPGVtPnBvcnQ8L2VtPic8L2NvZGU+CiAgICAgICAgIDwvcD4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IGluc3RhbGxlZCB5b3VyIHRlc3QgYXBwbGljYXRpb24sIHRoZW4geW91IHdpbGwgc2VlCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IGluc3RhbGxlZCB5b3VyIHRlc3QgcGFja2FnZSwgdGhlbiB5b3Ugc2VlCiAgICAgICAgIHRoZSBtZXNzYWdlOgogICAgICAgICA8cD4KLSAgICAgICAgICA8Y29kZT5VcGxvYWRpbmcgPGVtPnRlc3RjbGFzczwvZW0+LmFwayBvbnRvIGRldmljZSAnPGVtPmRldmljZS1pZDwvZW0+JzwvY29kZT48YnI+Ci0gICAgICAgICAgd2hlcmUgPGVtPnRlc3RjbGFzczwvZW0+IGlzIHRoZSBuYW1lIG9mIHlvdXIgdW5pdCB0ZXN0IGNsYXNzIGFuZCA8ZW0+ZGV2aWNlLWlkPC9lbT4KLSAgICAgICAgICBpcyB0aGUgbmFtZSBhbmQgcG9ydCBmb3IgeW91ciB0ZXN0IGRldmljZSBvciBlbXVsYXRvciwgZm9sbG93ZWQgYnkgdGhlIG1lc3NhZ2UgPGNvZGU+SW5zdGFsbGluZyA8ZW0+dGVzdGNsYXNzPC9lbT4uYXBrPC9jb2RlPgorICAgICAgICAgICAgPGNvZGU+VXBsb2FkaW5nIDxlbT50ZXN0ZmlsZTwvZW0+IG9udG8gZGV2aWNlICc8ZW0+ZGV2aWNlbmFtZTwvZW0+LTxlbT5wb3J0PC9lbT4nCisgICAgICAgICAgICA8L2NvZGU+CiAgICAgICAgIDwvcD4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgPGNvZGU+TGF1bmNoaW5nIGluc3RydW1lbnRhdGlvbiBBbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciBvbiBkZXZpY2UgPGVtPmRldmljZS1pZDwvZW0+PC9jb2RlPi48YnI+Ci0gICAgICAgVGhpcyBpbmRpY2F0ZXMgdGhhdCBBbmRyb2lkJ3MgSW5zdHJ1bWVudGF0aW9uIHN5c3RlbSBpcyBub3cgdGVzdGluZyB5b3VyIGNvZGUuIEFnYWluLCB0aGUKLSAgICAgICBpbnN0cnVtZW50YXRpb24gY2xhc3MgbmFtZSBkZXBlbmRzIG9uIHRoZSBBbmRyb2lkIGluc3RydW1lbnRhdGlvbiBjbGFzcyB5b3UgaGF2ZSBjaG9zZW4uCi0gICAgICA8L2xpPgotICAgICAgPGxpPgotICAgICAgIDxjb2RlPlRlc3QgcnVuIGNvbXBsZXRlPC9jb2RlPi48YnI+IFdoZW4geW91IHNlZSB0aGlzLCB5b3VyIHVuaXQgdGVzdHMgaGF2ZSBmaW5pc2hlZC4KLSAgICAgIDwvbGk+Ci0gICAgPC91bD4KLTwvb2w+CisgICAgICAgIDxwPgorICAgICAgICAgICAgdGhlbiB0aGUgbWVzc2FnZSA8Y29kZT5JbnN0YWxsaW5nIDxlbT50ZXN0ZmlsZTwvZW0+PC9jb2RlPi4KKyAgICAgICAgPC9wPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIGFuZCBmaW5hbGx5IHRoZSBtZXNzYWdlIDxjb2RlPlN1Y2Nlc3MhPC9jb2RlPgorICAgICAgICA8L3A+CisgICAgPC9saT4KKzwvdWw+CiA8cD4KLSAgICAgICAgVGhlIHRlc3QgcmVzdWx0cyBhcHBlYXIgaW4gdGhlIEpVbml0IHZpZXcuIFRoaXMgaXMgZGl2aWRlZCBpbnRvIGFuIHVwcGVyIHN1bW1hcnkgcGFuZSwKLSAgICAgICAgYW5kIGEgbG93ZXIgc3RhY2sgdHJhY2UgcGFuZS4KKyAgICBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhbiBleGFtcGxlIG9mIHRoaXMgbWVzc2FnZSBzZXF1ZW5jZToKKzwvcD4KKzxjb2RlPgorWzIwMTAtMDctMDEgMTI6NDQ6NDAgLSBNeVRlc3RdIEhPTUUgaXMgdXAgb24gZGV2aWNlICdlbXVsYXRvci01NTU0Jzxicj4KK1syMDEwLTA3LTAxIDEyOjQ0OjQwIC0gTXlUZXN0XSBVcGxvYWRpbmcgTXlUZXN0LmFwayBvbnRvIGRldmljZSAnZW11bGF0b3ItNTU1NCc8YnI+CitbMjAxMC0wNy0wMSAxMjo0NDo0MCAtIE15VGVzdF0gSW5zdGFsbGluZyBNeVRlc3QuYXBrLi4uPGJyPgorWzIwMTAtMDctMDEgMTI6NDQ6NDkgLSBNeVRlc3RdIFN1Y2Nlc3MhPGJyPgorPC9jb2RlPgorPGJyPgorPHVsPgorICAgIDxsaT4KKyAgICAgICAgTmV4dCwgaWYgeW91IGhhdmUgbm90IHlldCBpbnN0YWxsZWQgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgdG8gdGhlIGRldmljZSBvcgorICAgICAgICBlbXVsYXRvciwgeW91IHNlZSB0aGUgbWVzc2FnZQorICAgICAgICA8cD4KKyAgICAgICAgPGNvZGU+UHJvamVjdCBkZXBlbmRlbmN5IGZvdW5kLCBpbnN0YWxsaW5nOiA8ZW0+YXBwZmlsZTwvZW0+PC9jb2RlPgorICAgICAgICA8L3A+CisgICAgICAgIDxwPgorICAgICAgICAgICAgdGhlbiB0aGUgbWVzc2FnZSA8Y29kZT5VcGxvYWRpbmcgPGVtPmFwcGZpbGU8L2VtPjwvY29kZT4gb250byBkZXZpY2UKKyAgICAgICAgICAgICc8ZW0+ZGV2aWNlbmFtZTwvZW0+LTxlbT5wb3J0PC9lbT4nCisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+CisgICAgICAgICAgICB0aGVuIHRoZSBtZXNzYWdlIDxjb2RlPkluc3RhbGxpbmcgPGVtPmFwcGZpbGU8L2VtPjwvY29kZT4KKyAgICAgICAgPC9wPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIGFuZCBmaW5hbGx5IHRoZSBtZXNzYWdlIDxjb2RlPlN1Y2Nlc3MhPC9jb2RlPgorICAgICAgICA8L3A+CisgICAgPC9saT4KKzwvdWw+Cis8cD4KKyAgICBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhbiBleGFtcGxlIG9mIHRoaXMgbWVzc2FnZSBzZXF1ZW5jZToKKzwvcD4KKzxjb2RlPgorWzIwMTAtMDctMDEgMTI6NDQ6NDkgLSBNeVRlc3RdIFByb2plY3QgZGVwZW5kZW5jeSBmb3VuZCwgaW5zdGFsbGluZzogTXlBcHA8YnI+CitbMjAxMC0wNy0wMSAxMjo0NDo0OSAtIE15QXBwXSBVcGxvYWRpbmcgTXlBcHAuYXBrIG9udG8gZGV2aWNlICdlbXVsYXRvci01NTU0Jzxicj4KK1syMDEwLTA3LTAxIDEyOjQ0OjQ5IC0gTXlBcHBdIEluc3RhbGxpbmcgTXlBcHAuYXBrLi4uPGJyPgorWzIwMTAtMDctMDEgMTI6NDQ6NTQgLSBNeUFwcF0gU3VjY2VzcyE8YnI+Cis8L2NvZGU+Cis8YnI+Cis8dWw+CisgICAgPGxpPgorICAgICAgICBOZXh0LCB5b3Ugc2VlIHRoZSBtZXNzYWdlCisgICAgICAgIDxjb2RlPkxhdW5jaGluZyBpbnN0cnVtZW50YXRpb24gPGVtPmluc3RydW1lbnRhdGlvbl9jbGFzczwvZW0+IG9uIGRldmljZQorICAgICAgICA8ZW0+ZGV2aWNlbmFtZTwvZW0+LTxlbT5wb3J0PC9lbT48L2NvZGU+CisgICAgICAgIDxwPgorICAgICAgICAgICAgPGNvZGU+aW5zdHJ1bWVudGF0aW9uX2NsYXNzPC9jb2RlPiBpcyB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlCisgICAgICAgICAgICBpbnN0cnVtZW50YXRpb24gdGVzdCBydW5uZXIgeW91IGhhdmUgc3BlY2lmaWVkICh1c3VhbGx5CisgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9LgorICAgICAgICA8L3A+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIE5leHQsIGFzIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0gYnVpbGRzIGEgbGlzdCBvZiB0ZXN0cyB0byBydW4sCisgICAgICAgIHlvdSBzZWUgdGhlIG1lc3NhZ2UKKyAgICAgICAgPHA+CisgICAgICAgICAgICA8Y29kZT5Db2xsZWN0aW5nIHRlc3QgaW5mb3JtYXRpb248L2NvZGU+CisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBmb2xsb3dlZCBieQorICAgICAgICA8L3A+CisgICAgICAgIDxwPgorICAgICAgICAgICAgPGNvZGU+U2VuZGluZyB0ZXN0IGluZm9ybWF0aW9uIHRvIEVjbGlwc2U8L2NvZGU+CisgICAgICAgIDwvcD4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgRmluYWxseSwgeW91IHNlZSB0aGUgbWVzc2FnZSA8Y29kZT5SdW5uaW5nIHRlc3RzPC9jb2RlPiwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgeW91ciB0ZXN0cworICAgICAgICBhcmUgcnVubmluZy4gQXQgdGhpcyBwb2ludCwgeW91IHNob3VsZCBzdGFydCBzZWVpbmcgdGhlIHRlc3QgcmVzdWx0cyBpbiB0aGUgSlVuaXQgdmlldy4KKyAgICAgICAgV2hlbiB0aGUgdGVzdHMgYXJlIGZpbmlzaGVkLCB5b3Ugc2VlIHRoZSBjb25zb2xlIG1lc3NhZ2UgPGNvZGU+VGVzdCBydW4gY29tcGxldGU8L2NvZGU+LgorICAgICAgICBUaGlzIGluZGljYXRlcyB0aGF0IHlvdXIgdGVzdHMgYXJlIGZpbmlzaGVkLgorICAgIDwvbGk+Cis8L3VsPgorPHA+CisgICAgVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYW4gZXhhbXBsZSBvZiB0aGlzIG1lc3NhZ2Ugc2VxdWVuY2U6Cis8L3A+Cis8Y29kZT4KK1syMDEwLTAxLTAxIDEyOjQ1OjAyIC0gTXlUZXN0XSBMYXVuY2hpbmcgaW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIG9uIGRldmljZSBlbXVsYXRvci01NTU0PGJyPgorWzIwMTAtMDEtMDEgMTI6NDU6MDIgLSBNeVRlc3RdIENvbGxlY3RpbmcgdGVzdCBpbmZvcm1hdGlvbjxicj4KK1syMDEwLTAxLTAxIDEyOjQ1OjAyIC0gTXlUZXN0XSBTZW5kaW5nIHRlc3QgaW5mb3JtYXRpb24gdG8gRWNsaXBzZTxicj4KK1syMDEwLTAxLTAxIDEyOjQ1OjAyIC0gTXlUZXN0XSBSdW5uaW5nIHRlc3RzLi4uPGJyPgorWzIwMTAtMDEtMDEgMTI6NDU6MjIgLSBNeVRlc3RdIFRlc3QgcnVuIGNvbXBsZXRlPGJyPgorPC9jb2RlPgorPGJyPgorPHA+CisgICAgVGhlIHRlc3QgcmVzdWx0cyBhcHBlYXIgaW4gdGhlIEpVbml0IHZpZXcuIFRoaXMgaXMgZGl2aWRlZCBpbnRvIGFuIHVwcGVyIHN1bW1hcnkgcGFuZSwKKyAgICBhbmQgYSBsb3dlciBzdGFjayB0cmFjZSBwYW5lLgogPC9wPgogPHA+Ci0gICAgICAgIFRoZSB1cHBlciBwYW5lIGNvbnRhaW5zIHRlc3QgaW5mb3JtYXRpb24uIEluIHRoZSBwYW5lJ3MgaGVhZGVyLCB5b3Ugc2VlIHRoZSBmb2xsb3dpbmcKLSAgICAgICAgaW5mb3JtYXRpb246CisgICAgVGhlIHVwcGVyIHBhbmUgY29udGFpbnMgdGVzdCBpbmZvcm1hdGlvbi4gSW4gdGhlIHBhbmUncyBoZWFkZXIsIHlvdSBzZWUgdGhlIGZvbGxvd2luZworICAgIGluZm9ybWF0aW9uOgogPC9wPgotICAgIDx1bD4KLSAgICAgICAgPGxpPgotICAgICAgICAgICBUb3RhbCB0aW1lIGVsYXBzZWQgZm9yIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIChsYWJlbGVkIEZpbmlzaGVkIGFmdGVyIDxlbT54PC9lbT4gc2Vjb25kcykuCi0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT4KLSAgICAgICAgICAgTnVtYmVyIG9mIHJ1bnMgKFJ1bnM6KSAtIHRoZSBudW1iZXIgb2YgdGVzdHMgaW4gdGhlIGVudGlyZSB0ZXN0IGNsYXNzLgotICAgICAgICA8L2xpPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgIE51bWJlciBvZiBlcnJvcnMgKEVycm9yczopIC0gdGhlIG51bWJlciBvZiBwcm9ncmFtIGVycm9ycyBhbmQgZXhjZXB0aW9ucyBlbmNvdW50ZXJlZAotICAgICAgICAgICBkdXJpbmcgdGhlIHRlc3QgcnVuLgotICAgICAgICA8L2xpPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgIE51bWJlciBvZiBmYWlsdXJlcyAoRmFpbHVyZXM6KSAtIHRoZSBudW1iZXIgb2YgdGVzdCBmYWlsdXJlcyBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIHRlc3QKLSAgICAgICAgICAgcnVuLiBUaGlzIGlzIHRoZSBudW1iZXIgb2YgYXNzZXJ0aW9uIGZhaWx1cmVzLiBBIHRlc3QgY2FuIGZhaWwgZXZlbiBpZiB0aGUgcHJvZ3JhbSBkb2VzCi0gICAgICAgICAgIG5vdCBlbmNvdW50ZXIgYW4gZXJyb3IuCi0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT4KLSAgICAgICAgICAgQSBwcm9ncmVzcyBiYXIuIFRoZSBwcm9ncmVzcyBiYXIgZXh0ZW5kcyBmcm9tIGxlZnQgdG8gcmlnaHQgYXMgdGhlIHRlc3RzIHJ1bi4gSWYgYWxsIHRoZQotICAgICAgICAgICB0ZXN0cyBzdWNjZWVkLCB0aGUgYmFyIHJlbWFpbnMgZ3JlZW4uIElmIGEgdGVzdCBmYWlscywgdGhlIGJhciB0dXJucyBmcm9tIGdyZWVuIHRvIHJlZC4KLSAgICAgICAgPC9saT4KLSAgICA8L3VsPgorPHVsPgorICAgIDxsaT4KKyAgICAgICAgVG90YWwgdGltZSBlbGFwc2VkIGZvciB0aGUgdGVzdCBwYWNrYWdlIChsYWJlbGVkIEZpbmlzaGVkIGFmdGVyIDxlbT54PC9lbT4gc2Vjb25kcykuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIE51bWJlciBvZiBydW5zIChSdW5zOikgLSB0aGUgbnVtYmVyIG9mIHRlc3RzIGluIHRoZSBlbnRpcmUgdGVzdCBjbGFzcy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgTnVtYmVyIG9mIGVycm9ycyAoRXJyb3JzOikgLSB0aGUgbnVtYmVyIG9mIHByb2dyYW0gZXJyb3JzIGFuZCBleGNlcHRpb25zIGVuY291bnRlcmVkCisgICAgICAgIGR1cmluZyB0aGUgdGVzdCBydW4uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIE51bWJlciBvZiBmYWlsdXJlcyAoRmFpbHVyZXM6KSAtIHRoZSBudW1iZXIgb2YgdGVzdCBmYWlsdXJlcyBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIHRlc3QKKyAgICAgICAgcnVuLiBUaGlzIGlzIHRoZSBudW1iZXIgb2YgYXNzZXJ0aW9uIGZhaWx1cmVzLiBBIHRlc3QgY2FuIGZhaWwgZXZlbiBpZiB0aGUgcHJvZ3JhbSBkb2VzCisgICAgICAgIG5vdCBlbmNvdW50ZXIgYW4gZXJyb3IuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEEgcHJvZ3Jlc3MgYmFyLiBUaGUgcHJvZ3Jlc3MgYmFyIGV4dGVuZHMgZnJvbSBsZWZ0IHRvIHJpZ2h0IGFzIHRoZSB0ZXN0cyBydW4uIElmIGFsbCB0aGUKKyAgICAgICAgdGVzdHMgc3VjY2VlZCwgdGhlIGJhciByZW1haW5zIGdyZWVuLiBJZiBhIHRlc3QgZmFpbHMsIHRoZSBiYXIgdHVybnMgZnJvbSBncmVlbiB0byByZWQuCisgICAgPC9saT4KKzwvdWw+CiA8cD4KICAgICBUaGUgYm9keSBvZiB0aGUgdXBwZXIgcGFuZSBjb250YWlucyB0aGUgZGV0YWlscyBvZiB0aGUgdGVzdCBydW4uIEZvciBlYWNoIHRlc3QgY2FzZSBjbGFzcwogICAgIHRoYXQgd2FzIHJ1biwgeW91IHNlZSBhIGxpbmUgd2l0aCB0aGUgY2xhc3MgbmFtZS4gVG8gbG9vayBhdCB0aGUgcmVzdWx0cyBmb3IgdGhlIGluZGl2aWR1YWwKQEAgLTM2Myw4ICs1MDUsMzAgQEAKICAgICBwYW5lIGFuZCBtb3ZlcyB0aGUgZm9jdXMgdG8gdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHRlc3QgbWV0aG9kLgogPC9wPgogPHA+CisgICAgVGhlIHJlc3VsdHMgb2YgYSBzdWNjZXNzZnVsIHRlc3QgYXJlIHNob3duIGluCisgICAgPGEgaHJlZj0iI1Rlc3RSZXN1bHRzIj5GaWd1cmUgMS4gTWVzc2FnZXMgZm9yIGEgc3VjY2Vzc2Z1bCB0ZXN0PC9hPjoKKzwvcD4KKzxhIGhyZWY9IntAZG9jUm9vdH1pbWFnZXMvdGVzdGluZy9lY2xpcHNlX3Rlc3RfcmVzdWx0cy5wbmciPgorICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL3Rlc3RpbmcvZWNsaXBzZV90ZXN0X3Jlc3VsdHMucG5nIgorICAgICAgICAgYWx0PSJNZXNzYWdlcyBmb3IgYSBzdWNjZXNzZnVsIHRlc3QiIGhlaWdodD0iMzI3cHgiIGlkPSJUZXN0UmVzdWx0cyIvPgorPC9hPgorPHAgY2xhc3M9ImltZy1jYXB0aW9uIj4KKyAgICA8c3Ryb25nPkZpZ3VyZSAxLjwvc3Ryb25nPiBNZXNzYWdlcyBmb3IgYSBzdWNjZXNzZnVsIHRlc3QKKzwvcD4KKzxwPgogICAgIFRoZSBsb3dlciBwYW5lIGlzIGZvciBzdGFjayB0cmFjZXMuIElmIHlvdSBoaWdobGlnaHQgYSBmYWlsZWQgdGVzdCBpbiB0aGUgdXBwZXIgcGFuZSwgdGhlCiAgICAgbG93ZXIgcGFuZSBjb250YWlucyBhIHN0YWNrIHRyYWNlIGZvciB0aGUgdGVzdC4gSWYgYSBsaW5lIGNvcnJlc3BvbmRzIHRvIGEgcG9pbnQgaW4geW91cgogICAgIHRlc3QgY29kZSwgeW91IGNhbiBkb3VibGUtY2xpY2sgaXQgdG8gZGlzcGxheSB0aGUgY29kZSBpbiBhbiBlZGl0b3IgdmlldyBwYW5lLCB3aXRoIHRoZQogICAgIGxpbmUgaGlnaGxpZ2h0ZWQuIEZvciBhIHN1Y2Nlc3NmdWwgdGVzdCwgdGhlIGxvd2VyIHBhbmUgaXMgZW1wdHkuCiA8L3A+Cis8cD4KKyAgICBUaGUgcmVzdWx0cyBvZiBhIGZhaWxlZCB0ZXN0IGFyZSBzaG93biBpbgorICAgIDxhIGhyZWY9IiNGYWlsZWRUZXN0UmVzdWx0cyI+RmlndXJlIDIuIE1lc3NhZ2VzIGZvciBhIHRlc3QgZmFpbHVyZTwvYT4KKzwvcD4KKzxhIGhyZWY9IntAZG9jUm9vdH1pbWFnZXMvdGVzdGluZy9lY2xpcHNlX3Rlc3RfcnVuX2ZhaWx1cmUucG5nIj4KKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWltYWdlcy90ZXN0aW5nL2VjbGlwc2VfdGVzdF9ydW5fZmFpbHVyZS5wbmciCisgICAgICAgICBhbHQ9Ik1lc3NhZ2VzIGZvciBhIHRlc3QgZmFpbHVyZSIgaGVpZ2h0PSIzNzJweCIgaWQ9IlRlc3RSdW4iLz4KKzwvYT4KKzxwIGNsYXNzPSJpbWctY2FwdGlvbiI+CisgICAgPHN0cm9uZz5GaWd1cmUgMi48L3N0cm9uZz4gTWVzc2FnZXMgZm9yIGEgdGVzdCBmYWlsdXJlCis8L3A+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuamQgYi9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuamQKaW5kZXggMmJkZjRkMC4uNTIzYThlNSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5qZApAQCAtMiwxMjIgKzIsMTI4IEBACiBAamQ6Ym9keQogCiA8ZGl2IGlkPSJxdi13cmFwcGVyIj4KLSAgPGRpdiBpZD0icXYiPgotICA8aDI+SW4gdGhpcyBkb2N1bWVudDwvaDI+Ci0gIDxvbD4KLSAgICA8bGk+Ci0gICAgICAgIDxhIGhyZWY9IiNDcmVhdGVUZXN0UHJvamVjdENvbW1hbmQiPldvcmtpbmcgd2l0aCBUZXN0IFByb2plY3RzPC9hPgotICAgICAgICA8b2w+Ci0gICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iI0NyZWF0ZVRlc3RQcm9qZWN0Ij5DcmVhdGluZyBhIHRlc3QgcHJvamVjdDwvYT4KLSAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iI1VwZGF0ZVRlc3RQcm9qZWN0Ij5VcGRhdGluZyBhIHRlc3QgcHJvamVjdDwvYT4KLSAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgIDwvb2w+Ci0gICAgPC9saT4KLSAgICA8bGk+Ci0gICAgICAgIDxhIGhyZWY9IiNDcmVhdGVUZXN0QXBwIj5DcmVhdGluZyBhIFRlc3QgQXBwbGljYXRpb248L2E+Ci0gICAgPC9saT4KLSAgICA8bGk+Ci0gICAgICAgIDxhIGhyZWY9IiNSdW5UZXN0c0NvbW1hbmQiPlJ1bm5pbmcgVGVzdHM8L2E+Ci0gICAgICAgIDxvbD4KLSAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAgICA8YSBocmVmPSIjUnVuVGVzdHNBbnQiPlF1aWNrIGJ1aWxkIGFuZCBydW4gd2l0aCBBbnQ8L2E+Ci0gICAgICAgICAgICA8L2xpPgotICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNSdW5UZXN0c0RldmljZSI+UnVubmluZyB0ZXN0cyBvbiBhIGRldmljZSBvciBlbXVsYXRvcjwvYT4KLSAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgIDwvb2w+Ci0gICAgPC9saT4KLSAgICA8bGk+Ci0gICAgICAgIDxhIGhyZWY9IiNBTVN5bnRheCI+VXNpbmcgdGhlIEluc3RydW1lbnQgQ29tbWFuZDwvYT4KLSAgICAgICAgPG9sPgotICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNBTU9wdGlvbnNTeW50YXgiPkluc3RydW1lbnQgb3B0aW9uczwvYT4KLSAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iI1J1blRlc3RFeGFtcGxlcyI+SW5zdHJ1bWVudCBleGFtcGxlczwvYT4KLSAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgIDwvb2w+Ci0gICAgPC9saT4KLQotICA8L29sPgotICA8aDI+U2VlIEFsc288L2gyPgotICA8b2w+Ci0gICAgPGxpPgotICAgICAgICA8YQotICAgICAgICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPlRlc3RpbmcgYW5kIEluc3RydW1lbnRhdGlvbjwvYT4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5IFRlc3Rpbmc8L2E+Ci0gICAgPC9saT4KLSAgICA8bGk+Ci0gICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2FkYi5odG1sIj5BbmRyb2lkIERlYnVnIEJyaWRnZTwvYT4KLSAgICA8L2xpPgotICA8L29sPgotICA8L2Rpdj4KKyAgICA8ZGl2IGlkPSJxdiI+CisgICAgICAgIDxoMj5JbiB0aGlzIGRvY3VtZW50PC9oMj4KKyAgICAgICAgICAgIDxvbD4KKyAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNDcmVhdGVUZXN0UHJvamVjdENvbW1hbmQiPldvcmtpbmcgd2l0aCBUZXN0IFByb2plY3RzPC9hPgorICAgICAgICAgICAgICAgICAgICA8b2w+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI0NyZWF0ZVRlc3RQcm9qZWN0Ij5DcmVhdGluZyBhIHRlc3QgcHJvamVjdDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI1VwZGF0ZVRlc3RQcm9qZWN0Ij5VcGRhdGluZyBhIHRlc3QgcHJvamVjdDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgIDwvb2w+CisgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNDcmVhdGVUZXN0QXBwIj5DcmVhdGluZyBhIFRlc3QgUGFja2FnZTwvYT4KKyAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI1J1blRlc3RzQ29tbWFuZCI+UnVubmluZyBUZXN0czwvYT4KKyAgICAgICAgICAgICAgICAgICAgPG9sPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNSdW5UZXN0c0FudCI+UXVpY2sgYnVpbGQgYW5kIHJ1biB3aXRoIEFudDwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI1J1blRlc3RzRGV2aWNlIj5SdW5uaW5nIHRlc3RzIG9uIGEgZGV2aWNlIG9yIGVtdWxhdG9yPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgPC9vbD4KKyAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI0FNU3ludGF4Ij5Vc2luZyB0aGUgSW5zdHJ1bWVudCBDb21tYW5kPC9hPgorICAgICAgICAgICAgICAgICAgICA8b2w+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI0FNT3B0aW9uc1N5bnRheCI+SW5zdHJ1bWVudCBvcHRpb25zPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjUnVuVGVzdEV4YW1wbGVzIj5JbnN0cnVtZW50IGV4YW1wbGVzPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgPC9vbD4KKyAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPC9vbD4KKyAgICAgICAgPGgyPlNlZSBBbHNvPC9oMj4KKyAgICAgICAgICAgIDxvbD4KKyAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCI+CisgICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nIEZ1bmRhbWVudGFsczwvYT4KKyAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYWRiLmh0bWwiPkFuZHJvaWQgRGVidWcgQnJpZGdlPC9hPgorICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8L29sPgorICAgIDwvZGl2PgogPC9kaXY+CiA8cD4KLSAgVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgaG93IHRvIGNyZWF0ZSBhbmQgcnVuIHRlc3RzIGRpcmVjdGx5IGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLSAgWW91IGNhbiB1c2UgdGhlIHRlY2huaXF1ZXMgZGVzY3JpYmVkIGhlcmUgaWYgeW91IGFyZSBkZXZlbG9waW5nIGluIGFuIElERSBvdGhlciB0aGFuIEVjbGlwc2UKLSAgb3IgaWYgeW91IHByZWZlciB0byB3b3JrIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gVGhpcyBkb2N1bWVudCBhc3N1bWVzIHRoYXQgeW91IGFscmVhZHkga25vdyBob3cKLSAgdG8gY3JlYXRlIGEgQW5kcm9pZCBhcHBsaWNhdGlvbiBpbiB5b3VyIHByb2dyYW1taW5nIGVudmlyb25tZW50LiBCZWZvcmUgeW91IHN0YXJ0IHRoaXMKLSAgZG9jdW1lbnQsIHlvdSBzaG91bGQgcmVhZCB0aGUgZG9jdW1lbnQgPGEKLSAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj5UZXN0aW5nIGFuZCBJbnN0cnVtZW50YXRpb248L2E+LAotICB3aGljaCBwcm92aWRlcyBhbiBvdmVydmlldyBvZiBBbmRyb2lkIHRlc3RpbmcuCisgICAgVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgaG93IHRvIGNyZWF0ZSBhbmQgcnVuIHRlc3RzIGRpcmVjdGx5IGZyb20gdGhlIGNvbW1hbmQgbGluZS4KKyAgICBZb3UgY2FuIHVzZSB0aGUgdGVjaG5pcXVlcyBkZXNjcmliZWQgaGVyZSBpZiB5b3UgYXJlIGRldmVsb3BpbmcgaW4gYW4gSURFIG90aGVyIHRoYW4gRWNsaXBzZQorICAgIG9yIGlmIHlvdSBwcmVmZXIgdG8gd29yayBmcm9tIHRoZSBjb21tYW5kIGxpbmUuIFRoaXMgZG9jdW1lbnQgYXNzdW1lcyB0aGF0IHlvdSBhbHJlYWR5IGtub3cgaG93CisgICAgdG8gY3JlYXRlIGEgQW5kcm9pZCBhcHBsaWNhdGlvbiBpbiB5b3VyIHByb2dyYW1taW5nIGVudmlyb25tZW50LiBCZWZvcmUgeW91IHN0YXJ0IHRoaXMKKyAgICBkb2N1bWVudCwgeW91IHNob3VsZCByZWFkIHRoZSB0b3BpYworICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCI+VGVzdGluZyBGdW5kYW1lbnRhbHM8L2E+LAorICAgIHdoaWNoIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIEFuZHJvaWQgdGVzdGluZy4KIDwvcD4KIDxwPgotICBJZiB5b3UgYXJlIGRldmVsb3BpbmcgaW4gRWNsaXBzZSB3aXRoIEFEVCwgeW91IGNhbiBzZXQgdXAgYW5kIHJ1biB5b3VyIHRlc3RzCi1kaXJlY3RseSBpbiBFY2xpcHNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlYWQgPGEKLSAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+VGVzdGluZyZuYnNwO2luJm5ic3A7RWNsaXBzZSwmbmJzcDt3aXRoJm5ic3A7QURUPC9hPi4KKyAgICBJZiB5b3UgYXJlIGRldmVsb3BpbmcgaW4gRWNsaXBzZSB3aXRoIEFEVCwgeW91IGNhbiBzZXQgdXAgYW5kIHJ1biB5b3VyIHRlc3RzCisgICAgZGlyZWN0bHkgaW4gRWNsaXBzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWFkCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+CisgICAgVGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uCiA8L3A+CiA8aDIgaWQ9IkNyZWF0ZVRlc3RQcm9qZWN0Q29tbWFuZCI+V29ya2luZyB3aXRoIFRlc3QgUHJvamVjdHM8L2gyPgogPHA+Ci0gIFlvdSB1c2UgdGhlIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IHRvb2wgdG8gY3JlYXRlIHRlc3QgcHJvamVjdHMuCi0gIFlvdSBhbHNvIHVzZSA8Y29kZT5hbmRyb2lkPC9jb2RlPiB0byBjb252ZXJ0IGV4aXN0aW5nIHRlc3QgY29kZSBpbnRvIGFuIEFuZHJvaWQgdGVzdCBwcm9qZWN0LAotICBvciB0byBhZGQgdGhlIDxjb2RlPnJ1bi10ZXN0czwvY29kZT4gQW50IHRhcmdldCB0byBhbiBleGlzdGluZyBBbmRyb2lkIHRlc3QgcHJvamVjdC4KLSAgVGhlc2Ugb3BlcmF0aW9ucyBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHRoZSBzZWN0aW9uIDxhCi0gIGhyZWY9IiNVcGRhdGVUZXN0UHJvamVjdCI+VXBkYXRpbmcgYSB0ZXN0IHByb2plY3Q8L2E+LgotICBUaGUgPGNvZGU+cnVuLXRlc3RzPC9jb2RlPiB0YXJnZXQgaXMgZGVzY3JpYmVkIGluIDxhCi0gIGhyZWY9IiNSdW5UZXN0c0FudCI+UXVpY2sgYnVpbGQgYW5kIHJ1biB3aXRoIEFudDwvYT4uCisgICAgWW91IHVzZSB0aGUgPGNvZGU+YW5kcm9pZDwvY29kZT4gdG9vbCB0byBjcmVhdGUgdGVzdCBwcm9qZWN0cy4KKyAgICBZb3UgYWxzbyB1c2UgPGNvZGU+YW5kcm9pZDwvY29kZT4gdG8gY29udmVydCBleGlzdGluZyB0ZXN0IGNvZGUgaW50byBhbiBBbmRyb2lkIHRlc3QgcHJvamVjdCwKKyAgICBvciB0byBhZGQgdGhlIDxjb2RlPnJ1bi10ZXN0czwvY29kZT4gQW50IHRhcmdldCB0byBhbiBleGlzdGluZyBBbmRyb2lkIHRlc3QgcHJvamVjdC4KKyAgICBUaGVzZSBvcGVyYXRpb25zIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIHNlY3Rpb24gPGEgaHJlZj0iI1VwZGF0ZVRlc3RQcm9qZWN0Ij4KKyAgICBVcGRhdGluZyBhIHRlc3QgcHJvamVjdDwvYT4uIFRoZSA8Y29kZT5ydW4tdGVzdHM8L2NvZGU+IHRhcmdldCBpcyBkZXNjcmliZWQgaW4KKyAgICA8YSBocmVmPSIjUnVuVGVzdHNBbnQiPlF1aWNrIGJ1aWxkIGFuZCBydW4gd2l0aCBBbnQ8L2E+LgogPC9wPgogPGgzIGlkPSJDcmVhdGVUZXN0UHJvamVjdCI+Q3JlYXRpbmcgYSB0ZXN0IHByb2plY3Q8L2gzPgogPHA+Ci0gIFRvIGNyZWF0ZSBhIHRlc3QgcHJvamVjdCB3aXRoIHRoZSA8Y29kZT5hbmRyb2lkPC9jb2RlPiB0b29sLCBlbnRlcjoKLTxwcmU+YW5kcm9pZCBjcmVhdGUgdGVzdC1wcm9qZWN0IC1tICZsdDttYWluX3BhdGgmZ3Q7IC1uICZsdDtwcm9qZWN0X25hbWUmZ3Q7IC1wICZsdDt0ZXN0X3BhdGgmZ3Q7PC9wcmU+CisgICAgVG8gY3JlYXRlIGEgdGVzdCBwcm9qZWN0IHdpdGggdGhlIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IHRvb2wsIGVudGVyOgorPC9wPgorPHByZT4KK2FuZHJvaWQgY3JlYXRlIHRlc3QtcHJvamVjdCAtbSAmbHQ7bWFpbl9wYXRoJmd0OyAtbiAmbHQ7cHJvamVjdF9uYW1lJmd0OyAtcCAmbHQ7dGVzdF9wYXRoJmd0OworPC9wcmU+CiA8cD4KLSAgWW91IG11c3Qgc3VwcGx5IGFsbCB0aGUgZmxhZ3MuIFRoZSBmb2xsb3dpbmcgdGFibGUgZXhwbGFpbnMgdGhlbSBpbiBkZXRhaWw6CisgICAgWW91IG11c3Qgc3VwcGx5IGFsbCB0aGUgZmxhZ3MuIFRoZSBmb2xsb3dpbmcgdGFibGUgZXhwbGFpbnMgdGhlbSBpbiBkZXRhaWw6CiA8L3A+CiA8dGFibGU+Ci0gIDx0cj4KLSAgICA8dGg+RmxhZzwvdGg+Ci0gICAgPHRoPlZhbHVlPC90aD4KLSAgICA8dGg+RGVzY3JpcHRpb248L3RoPgotICA8dHI+Ci0gICAgPHRkPjxjb2RlPi1tLCAtLW1haW48L2NvZGU+PC90ZD4KLSAgICA8dGQ+Ci0gICAgICAgIFBhdGggdG8gdGhlIHByb2plY3Qgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsIHJlbGF0aXZlIHRvIHRoZSB0ZXN0IGFwcGxpY2F0aW9uCi0gICAgICAgIGRpcmVjdG9yeS4KLSAgICA8L3RkPgotICAgIDx0ZD4KLSAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGlzIGluIDxjb2RlPnNvdXJjZS9IZWxsb0FuZHJvaWQ8L2NvZGU+LCBhbmQgeW91Ci0gICAgICAgIHdhbnQgdG8gY3JlYXRlIHRoZSB0ZXN0IHByb2plY3QgaW4gPGNvZGU+c291cmNlL0hlbGxvQW5kcm9pZFRlc3Q8L2NvZGU+LCB0aGVuIHRoZSB2YWx1ZSBvZgotICAgICAgICA8Y29kZT4tLW1haW48L2NvZGU+IHNob3VsZCBiZSA8Y29kZT4uLi9IZWxsb0FuZHJvaWQ8L2NvZGU+LgorICAgIDx0cj4KKyAgICAgICAgPHRoPkZsYWc8L3RoPgorICAgICAgICA8dGg+VmFsdWU8L3RoPgorICAgICAgICA8dGg+RGVzY3JpcHRpb248L3RoPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+LW0sIC0tbWFpbjwvY29kZT48L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICBQYXRoIHRvIHRoZSBwcm9qZWN0IG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCByZWxhdGl2ZSB0byB0aGUgdGVzdCBwYWNrYWdlCisgICAgICAgICAgICBkaXJlY3RvcnkuCiAgICAgICAgIDwvdGQ+Ci0gIDx0cj4KLSAgICA8dGQ+PGNvZGU+LW4sIC0tbmFtZTwvY29kZT48L3RkPgotICAgIDx0ZD5OYW1lIHRoYXQgeW91IHdhbnQgdG8gZ2l2ZSB0aGUgdGVzdCBwcm9qZWN0LjwvdGQ+Ci0gICAgPHRkPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+PGNvZGU+LXAsIC0tcGF0aDwvY29kZT48L3RkPgotICAgIDx0ZD5EaXJlY3RvcnkgaW4gd2hpY2ggeW91IHdhbnQgdG8gY3JlYXRlIHRoZSBuZXcgdGVzdCBwcm9qZWN0LjwvdGQ+Ci0gICAgPHRkPgotICAgICAgVGhlIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IHRvb2wgY3JlYXRlcyB0aGUgdGVzdCBwcm9qZWN0IGZpbGVzIGFuZCBkaXJlY3Rvcnkgc3RydWN0dXJlIGluIHRoaXMKLSAgICAgIGRpcmVjdG9yeS4gSWYgdGhlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCwgPGNvZGU+YW5kcm9pZDwvY29kZT4gY3JlYXRlcyBpdC4KLSAgICA8L3RkPgotICA8L3RyPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgaXMgaW4gPGNvZGU+c291cmNlL0hlbGxvQW5kcm9pZDwvY29kZT4sIGFuZAorICAgICAgICAgICAgeW91IHdhbnQgdG8gY3JlYXRlIHRoZSB0ZXN0IHByb2plY3QgaW4gPGNvZGU+c291cmNlL0hlbGxvQW5kcm9pZFRlc3Q8L2NvZGU+LCB0aGVuIHRoZQorICAgICAgICAgICAgdmFsdWUgb2YgPGNvZGU+LS1tYWluPC9jb2RlPiBzaG91bGQgYmUgPGNvZGU+Li4vSGVsbG9BbmRyb2lkPC9jb2RlPi4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBUbyBsZWFybiBtb3JlIGFib3V0IGNob29zaW5nIHRoZSBsb2NhdGlvbiBvZiB0ZXN0IHByb2plY3RzLCBwbGVhc2UgcmVhZAorICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sI1Rlc3RQcm9qZWN0cyI+CisgICAgICAgICAgICBUZXN0aW5nIEZ1bmRhbWVudGFsczwvYT4uCisgICAgICAgIDwvcD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPi1uLCAtLW5hbWU8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPk5hbWUgdGhhdCB5b3Ugd2FudCB0byBnaXZlIHRoZSB0ZXN0IHByb2plY3QuPC90ZD4KKyAgICAgICAgPHRkPiZuYnNwOzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT4tcCwgLS1wYXRoPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD5EaXJlY3RvcnkgaW4gd2hpY2ggeW91IHdhbnQgdG8gY3JlYXRlIHRoZSBuZXcgdGVzdCBwcm9qZWN0LjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFRoZSA8Y29kZT5hbmRyb2lkPC9jb2RlPiB0b29sIGNyZWF0ZXMgdGhlIHRlc3QgcHJvamVjdCBmaWxlcyBhbmQgZGlyZWN0b3J5IHN0cnVjdHVyZQorICAgICAgICAgICAgaW4gdGhpcyBkaXJlY3RvcnkuIElmIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QsIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IGNyZWF0ZXMgaXQuCisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KIDwvdGFibGU+CiA8cD4KICAgICBJZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwsIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IGxpc3RzIHRvIFNURE9VVCB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzCkBAIC0xMzUsMTEgKzE0MSwxMCBAQAogICAgIGFyZSB0ZXN0aW5nIGFuZCBjb250cm9sIGl0IHdpdGggaW5zdHJ1bWVudGF0aW9uLgogPC9wPgogPHA+Ci0gICAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGNyZWF0ZSB0aGUgPGEKLSAgICBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy9oZWxsby13b3JsZC5odG1sIj5IZWxsbywgV29ybGQ8L2E+IHR1dG9yaWFsIGFwcGxpY2F0aW9uCi0gICAgaW4gdGhlIGRpcmVjdG9yeSA8Y29kZT5+L3NvdXJjZS9IZWxsb0FuZHJvaWQ8L2NvZGU+LiBJbiB0aGUgdHV0b3JpYWwsIHRoaXMgYXBwbGljYXRpb24gdXNlcyB0aGUKLSAgICBwYWNrYWdlIG5hbWUgPGNvZGU+Y29tLmV4YW1wbGUuaGVsbG9hbmRyb2lkPC9jb2RlPiBhbmQgdGhlIGFjdGl2aXR5IG5hbWUKLSAgICA8Y29kZT5IZWxsb0FuZHJvaWQ8L2NvZGU+LiBZb3UgY2FuIHRvIGNyZWF0ZSB0aGUgdGVzdCBmb3IgdGhpcyBpbgorICAgIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBjcmVhdGUgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL2hlbGxvLXdvcmxkLmh0bWwiPgorICAgIEhlbGxvLCBXb3JsZDwvYT4gdHV0b3JpYWwgYXBwbGljYXRpb24gaW4gdGhlIGRpcmVjdG9yeSA8Y29kZT5+L3NvdXJjZS9IZWxsb0FuZHJvaWQ8L2NvZGU+LgorICAgIEluIHRoZSB0dXRvcmlhbCwgdGhpcyBhcHBsaWNhdGlvbiB1c2VzIHRoZSBwYWNrYWdlIG5hbWUgPGNvZGU+Y29tLmV4YW1wbGUuaGVsbG9hbmRyb2lkPC9jb2RlPgorICAgIGFuZCB0aGUgYWN0aXZpdHkgbmFtZSA8Y29kZT5IZWxsb0FuZHJvaWQ8L2NvZGU+LiBZb3UgY2FuIHRvIGNyZWF0ZSB0aGUgdGVzdCBmb3IgdGhpcyBpbgogICAgIDxjb2RlPn4vc291cmNlL0hlbGxvQW5kcm9pZFRlc3Q8L2NvZGU+LiBUbyBkbyBzbywgeW91IGVudGVyOgogPC9wPgogPHByZT4KQEAgLTE5Niw3ICsyMDEsNyBAQAogPHAgY2xhc3M9Im5vdGUiPgogICAgIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgeW91IGNoYW5nZSB0aGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsCiAgICAgeW91IG11c3QgPGVtPm1hbnVhbGx5PC9lbT4gY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+Jmx0O2FuZHJvaWQ6dGFyZ2V0UGFja2FnZSZndDs8L2NvZGU+Ci0gICAgYXR0cmlidXRlIHdpdGhpbiB0aGUgPGNvZGU+QW5kcm9pZE1hbmlmZXN0LnhtbDwvY29kZT4gZmlsZSBvZiB0aGUgdGVzdCBhcHBsaWNhdGlvbi4KKyAgICBhdHRyaWJ1dGUgd2l0aGluIHRoZSA8Y29kZT5BbmRyb2lkTWFuaWZlc3QueG1sPC9jb2RlPiBmaWxlIG9mIHRoZSB0ZXN0IHBhY2thZ2UuCiAgICAgUnVubmluZyA8Y29kZT5hbmRyb2lkIHVwZGF0ZSB0ZXN0LXByb2plY3Q8L2NvZGU+IGRvZXMgbm90IGRvIHRoaXMuCiA8L3A+CiA8cD4KQEAgLTIwNSwzOCArMjEwLDM4IEBACiA8cHJlPmFuZHJvaWQgdXBkYXRlLXRlc3QtcHJvamVjdCAtbSAmbHQ7bWFpbl9wYXRoJmd0OyAtcCAmbHQ7dGVzdF9wYXRoJmd0OzwvcHJlPgogCiA8dGFibGU+Ci08dHI+Ci0gIDx0aD5GbGFnPC90aD4KLSAgPHRoPlZhbHVlPC90aD4KLSAgPHRoPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08dHI+Ci0gIDx0ZD48Y29kZT4tbSwgLS1tYWluPC9jb2RlPjwvdGQ+Ci0gIDx0ZD5UaGUgcGF0aCB0byB0aGUgcHJvamVjdCBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwgcmVsYXRpdmUgdG8gdGhlIHRlc3QgcHJvamVjdDwvdGQ+Ci0gIDx0ZD4KLSAgICBGb3IgZXhhbXBsZSwgaWYgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgaXMgaW4gPGNvZGU+c291cmNlL0hlbGxvQW5kcm9pZDwvY29kZT4sIGFuZAotICAgIHRoZSB0ZXN0IHByb2plY3QgaXMgaW4gPGNvZGU+c291cmNlL0hlbGxvQW5kcm9pZFRlc3Q8L2NvZGU+LCB0aGVuIHRoZSB2YWx1ZSBmb3IKLSAgICA8Y29kZT4tLW1haW48L2NvZGU+IGlzIDxjb2RlPi4uL0hlbGxvQW5kcm9pZDwvY29kZT4uCi0gIDwvdGQ+Ci08L3RyPgotPHRyPgotICA8dGQ+PGNvZGU+LXAsIC0tcGF0aDwvY29kZT48L3RkPgotICA8dGQ+VGhlIG9mIHRoZSB0ZXN0IHByb2plY3QuPC90ZD4KLSAgPHRkPgotICAgIEZvciBleGFtcGxlLCBpZiB0aGUgdGVzdCBwcm9qZWN0IGlzIGluIDxjb2RlPnNvdXJjZS9IZWxsb0FuZHJvaWRUZXN0PC9jb2RlPiwgdGhlbiB0aGUKLSAgICB2YWx1ZSBmb3IgPGNvZGU+LS1wYXRoPC9jb2RlPiBpcyA8Y29kZT5IZWxsb0FuZHJvaWRUZXN0PC9jb2RlPi4KLSAgPC90ZD4KLTwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGg+RmxhZzwvdGg+CisgICAgICAgIDx0aD5WYWx1ZTwvdGg+CisgICAgICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT4tbSwgLS1tYWluPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD5UaGUgcGF0aCB0byB0aGUgcHJvamVjdCBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwgcmVsYXRpdmUgdG8gdGhlIHRlc3QgcHJvamVjdDwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIEZvciBleGFtcGxlLCBpZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBpcyBpbiA8Y29kZT5zb3VyY2UvSGVsbG9BbmRyb2lkPC9jb2RlPiwgYW5kCisgICAgICAgICAgICB0aGUgdGVzdCBwcm9qZWN0IGlzIGluIDxjb2RlPnNvdXJjZS9IZWxsb0FuZHJvaWRUZXN0PC9jb2RlPiwgdGhlbiB0aGUgdmFsdWUgZm9yCisgICAgICAgICAgICA8Y29kZT4tLW1haW48L2NvZGU+IGlzIDxjb2RlPi4uL0hlbGxvQW5kcm9pZDwvY29kZT4uCisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT4tcCwgLS1wYXRoPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD5UaGUgb2YgdGhlIHRlc3QgcHJvamVjdC48L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgdGhlIHRlc3QgcHJvamVjdCBpcyBpbiA8Y29kZT5zb3VyY2UvSGVsbG9BbmRyb2lkVGVzdDwvY29kZT4sIHRoZW4gdGhlCisgICAgICAgICAgICB2YWx1ZSBmb3IgPGNvZGU+LS1wYXRoPC9jb2RlPiBpcyA8Y29kZT5IZWxsb0FuZHJvaWRUZXN0PC9jb2RlPi4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgogPC90YWJsZT4KIDxwPgogICAgIElmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCwgPGNvZGU+YW5kcm9pZDwvY29kZT4gbGlzdHMgdG8gU1RET1VUIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMKICAgICBhbmQgZGlyZWN0b3JpZXMgaXQgaGFzIGNyZWF0ZWQuCiA8L3A+Ci08aDIgaWQ9IkNyZWF0ZVRlc3RBcHAiPkNyZWF0aW5nIGEgVGVzdCBBcHBsaWNhdGlvbjwvaDI+Cis8aDIgaWQ9IkNyZWF0ZVRlc3RBcHAiPkNyZWF0aW5nIGEgVGVzdCBQYWNrYWdlPC9oMj4KIDxwPgotICAgIE9uY2UgeW91IGhhdmUgY3JlYXRlZCBhIHRlc3QgcHJvamVjdCwgeW91IHBvcHVsYXRlIGl0IHdpdGggYSB0ZXN0IGFwcGxpY2F0aW9uLgorICAgIE9uY2UgeW91IGhhdmUgY3JlYXRlZCBhIHRlc3QgcHJvamVjdCwgeW91IHBvcHVsYXRlIGl0IHdpdGggYSB0ZXN0IHBhY2thZ2UuCiAgICAgVGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYW4ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5IEFjdGl2aXR5fSwKLSAgICBhbHRob3VnaCB5b3UgY2FuIGRlZmluZSBvbmUgaWYgeW91IHdpc2guIEFsdGhvdWdoIHlvdXIgdGVzdCBhcHBsaWNhdGlvbiBjYW4KKyAgICBhbHRob3VnaCB5b3UgY2FuIGRlZmluZSBvbmUgaWYgeW91IHdpc2guIEFsdGhvdWdoIHlvdXIgdGVzdCBwYWNrYWdlIGNhbgogICAgIGNvbWJpbmUgQWN0aXZpdGllcywgQW5kcm9pZCB0ZXN0IGNsYXNzIGV4dGVuc2lvbnMsIEpVbml0IGV4dGVuc2lvbnMsIG9yCiAgICAgb3JkaW5hcnkgY2xhc3NlcywgeW91IHNob3VsZCBleHRlbmQgb25lIG9mIHRoZSBBbmRyb2lkIHRlc3QgY2xhc3NlcyBvciBKVW5pdCBjbGFzc2VzLAogICAgIGJlY2F1c2UgdGhlc2UgcHJvdmlkZSB0aGUgYmVzdCB0ZXN0aW5nIGZlYXR1cmVzLgpAQCAtMjQ4LDcgKzI1Myw3IEBACiA8L3A+CiAKIDxwPgotICAgIFRvIGNyZWF0ZSBhIHRlc3QgYXBwbGljYXRpb24sIHN0YXJ0IHdpdGggb25lIG9mIEFuZHJvaWQncyB0ZXN0IGNsYXNzZXMgaW4gdGhlIEphdmEgcGFja2FnZQorICAgIFRvIGNyZWF0ZSBhIHRlc3QgcGFja2FnZSwgc3RhcnQgd2l0aCBvbmUgb2YgQW5kcm9pZCdzIHRlc3QgY2xhc3NlcyBpbiB0aGUgSmF2YSBwYWNrYWdlCiAgICAge0BsaW5rIGFuZHJvaWQudGVzdCBhbmRyb2lkLnRlc3R9LiBUaGVzZSBleHRlbmQgdGhlIEpVbml0CiAgICAge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSBUZXN0Q2FzZX0gY2xhc3MuIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgdGhlIEFuZHJvaWQgdGVzdAogICAgIGNsYXNzZXMgYWxzbyBwcm92aWRlIGluc3RydW1lbnRhdGlvbiBmb3IgdGVzdGluZy4KQEAgLTI4MiwyNCArMjg3LDE3IEBACiAgICAgdGVzdCByZXN1bHRzIGFyZSBzdXNwZWN0LCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IHRoZSB0ZXN0cyBzdWNjZWVkZWQuCiA8L3A+CiA8cD4KLSAgICBUbyBsZWFybiBtb3JlIGFib3V0IGNyZWF0aW5nIHRlc3QgYXBwbGljYXRpb25zLCBzZWUgdGhlIHRvcGljIDxhCi0gICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj5UZXN0aW5nIGFuZCBJbnN0cnVtZW50YXRpb248L2E+LAorICAgIFRvIGxlYXJuIG1vcmUgYWJvdXQgY3JlYXRpbmcgdGVzdCBwYWNrYWdlcywgc2VlIHRoZSB0b3BpYyA8YQorICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCI+VGVzdGluZyBGdW5kYW1lbnRhbHM8L2E+LAogICAgIHdoaWNoIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIEFuZHJvaWQgdGVzdGluZy4gSWYgeW91IHByZWZlciB0byBmb2xsb3cgYSB0dXRvcmlhbCwKICAgICB0cnkgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sIj5BY3Rpdml0eSBUZXN0aW5nPC9hPgogICAgIHR1dG9yaWFsLCB3aGljaCBsZWFkcyB5b3UgdGhyb3VnaCB0aGUgY3JlYXRpb24gb2YgdGVzdHMgZm9yIGFuIGFjdHVhbCBBbmRyb2lkIGFwcGxpY2F0aW9uLgogPC9wPgogPGgyIGlkPSJSdW5UZXN0c0NvbW1hbmQiPlJ1bm5pbmcgVGVzdHM8L2gyPgogPHA+Ci0gICAgSWYgeW91IGFyZSBub3QgZGV2ZWxvcGluZyBpbiBFY2xpcHNlIHdpdGggQURULCB5b3UgbmVlZCB0byBydW4gdGVzdHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgotICAgIFlvdSBjYW4gZG8gdGhpcyBlaXRoZXIgd2l0aCBBbnQgb3Igd2l0aCB0aGUge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlciBBY3Rpdml0eU1hbmFnZXJ9Ci0gICAgY29tbWFuZCBsaW5lIGludGVyZmFjZS4KLTwvcD4KLTxwPgotICAgIFlvdSBjYW4gYWxzbyBydW4gdGVzdHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGV2ZW4gaWYgeW91IGFyZSB1c2luZyBFY2xpcHNlIHdpdGggQURUIHRvIGRldmVsb3AKLSAgICB0aGVtLiBUbyBkbyB0aGlzLCB5b3UgbmVlZCB0byBjcmVhdGUgdGhlIHByb3BlciBmaWxlcyBhbmQgZGlyZWN0b3J5IHN0cnVjdHVyZSBpbiB0aGUgdGVzdAotICAgIHByb2plY3QsIHVzaW5nIHRoZSA8Y29kZT5hbmRyb2lkPC9jb2RlPiB0b29sIHdpdGggdGhlIG9wdGlvbiA8Y29kZT5jcmVhdGUgdGVzdC1wcm9qZWN0PC9jb2RlPi4KLSAgICBUaGlzIGlzIGRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbiA8YQotICAgIGhyZWY9IiNDcmVhdGVUZXN0UHJvamVjdENvbW1hbmQiPldvcmtpbmcgd2l0aCBUZXN0IFByb2plY3RzPC9hPi4KKyAgICBZb3UgcnVuIHRlc3RzIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgZWl0aGVyIHdpdGggQW50IG9yIHdpdGggYW4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9aHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2FkYi5odG1sIj4KKyAgICBBbmRyb2lkIERlYnVnIEJyaWRnZSAoYWRiKTwvYT4gc2hlbGwuCiA8L3A+CiA8aDMgaWQ9IlJ1blRlc3RzQW50Ij5RdWljayBidWlsZCBhbmQgcnVuIHdpdGggQW50PC9oMz4KIDxwPgpAQCAtMzE2LDU3ICszMTQsNjMgQEAKICAgICBZb3UgY2FuIHVwZGF0ZSBhbiBleGlzdGluZyB0ZXN0IHByb2plY3QgdG8gdXNlIHRoaXMgZmVhdHVyZS4gVG8gZG8gdGhpcywgdXNlIHRoZQogICAgIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IHRvb2wgd2l0aCB0aGUgPGNvZGU+dXBkYXRlIHRlc3QtcHJvamVjdDwvY29kZT4gb3B0aW9uLiBUaGlzIGlzIGRlc2NyaWJlZAogICAgIGluIHRoZSBzZWN0aW9uIDxhIGhyZWY9IiNVcGRhdGVUZXN0UHJvamVjdCI+VXBkYXRpbmcgYSB0ZXN0IHByb2plY3Q8L2E+LgorPC9wPgogPGgzIGlkPSJSdW5UZXN0c0RldmljZSI+UnVubmluZyB0ZXN0cyBvbiBhIGRldmljZSBvciBlbXVsYXRvcjwvaDM+CiA8cD4KLSAgICBXaGVuIHlvdSBydW4gdGVzdHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHdpdGggdGhlIEFjdGl2aXR5TWFuYWdlciAoPGNvZGU+YW08L2NvZGU+KQotICAgIGNvbW1hbmQtbGluZSB0b29sLCB5b3UgZ2V0IG1vcmUgb3B0aW9ucyBmb3IgY2hvb3NpbmcgdGhlIHRlc3RzIHRvIHJ1biB0aGFuIHdpdGggYW55IG90aGVyCi0gICAgbWV0aG9kLiBZb3UgY2FuIHNlbGVjdCBpbmRpdmlkdWFsIHRlc3QgbWV0aG9kcywgZmlsdGVyIHRlc3RzIGFjY29yZGluZyB0byB0aGVpciBhbm5vdGF0aW9uLCBvcgotICAgIHNwZWNpZnkgdGVzdGluZyBvcHRpb25zLiBTaW5jZSB0aGUgdGVzdCBydW4gaXMgY29udHJvbGxlZCBlbnRpcmVseSBmcm9tIGEgY29tbWFuZCBsaW5lLCB5b3UgY2FuCi0gICAgY3VzdG9taXplIHlvdXIgdGVzdGluZyB3aXRoIHNoZWxsIHNjcmlwdHMgaW4gdmFyaW91cyB3YXlzLgorICAgIFdoZW4geW91IHJ1biB0ZXN0cyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgd2l0aAorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1odHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2d1aWRlL2RldmVsb3BpbmcvdG9vbHMvYWRiLmh0bWwiPgorICAgIEFuZHJvaWQgRGVidWcgQnJpZGdlIChhZGIpPC9hPiwgeW91IGdldCBtb3JlIG9wdGlvbnMgZm9yIGNob29zaW5nIHRoZSB0ZXN0cworICAgIHRvIHJ1biB0aGFuIHdpdGggYW55IG90aGVyIG1ldGhvZC4gWW91IGNhbiBzZWxlY3QgaW5kaXZpZHVhbCB0ZXN0IG1ldGhvZHMsIGZpbHRlciB0ZXN0cworICAgIGFjY29yZGluZyB0byB0aGVpciBhbm5vdGF0aW9uLCBvciBzcGVjaWZ5IHRlc3Rpbmcgb3B0aW9ucy4gU2luY2UgdGhlIHRlc3QgcnVuIGlzIGNvbnRyb2xsZWQKKyAgICBlbnRpcmVseSBmcm9tIGEgY29tbWFuZCBsaW5lLCB5b3UgY2FuIGN1c3RvbWl6ZSB5b3VyIHRlc3Rpbmcgd2l0aCBzaGVsbCBzY3JpcHRzIGluIHZhcmlvdXMgd2F5cy4KIDwvcD4KIDxwPgotICAgIFlvdSBydW4gdGhlIDxjb2RlPmFtPC9jb2RlPiB0b29sIG9uIGFuIEFuZHJvaWQgZGV2aWNlIG9yIGVtdWxhdG9yIHVzaW5nIHRoZQotICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2FkYi5odG1sIj5BbmRyb2lkIERlYnVnIEJyaWRnZTwvYT4KLSAgICAoPGNvZGU+YWRiPC9jb2RlPikgc2hlbGwuIFdoZW4geW91IGRvIHRoaXMsIHlvdSB1c2UgdGhlIEFjdGl2aXR5TWFuYWdlcgotICAgIDxjb2RlPmluc3RydW1lbnQ8L2NvZGU+IG9wdGlvbiB0byBydW4geW91ciB0ZXN0IGFwcGxpY2F0aW9uIHVzaW5nIGFuIEFuZHJvaWQgdGVzdCBydW5uZXIKLSAgICAodXN1YWxseSB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9KS4gWW91IHNldCA8Y29kZT5hbTwvY29kZT4KLSAgICBvcHRpb25zIHdpdGggY29tbWFuZC1saW5lIGZsYWdzLgorICAgIFRvIHJ1biBhIHRlc3QgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCB5b3UgcnVuIDxjb2RlPmFkYiBzaGVsbDwvY29kZT4gdG8gc3RhcnQgYSBjb21tYW5kLWxpbmUKKyAgICBzaGVsbCBvbiB5b3VyIGRldmljZSBvciBlbXVsYXRvciwgYW5kIHRoZW4gaW4gdGhlIHNoZWxsIHJ1biB0aGUgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4KKyAgICBjb21tYW5kLiBZb3UgY29udHJvbCA8Y29kZT5hbTwvY29kZT4gYW5kIHlvdXIgdGVzdHMgd2l0aCBjb21tYW5kLWxpbmUgZmxhZ3MuCiA8L3A+CiA8cD4KLSAgICBUbyBydW4gYSB0ZXN0IHdpdGggPGNvZGU+YW08L2NvZGU+OgorICAgIEFzIGEgc2hvcnRjdXQsIHlvdSBjYW4gc3RhcnQgYW4gPGNvZGU+YWRiPC9jb2RlPiBzaGVsbCwgY2FsbCA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPiwgYW5kCisgICAgc3BlY2lmeSBjb21tYW5kLWxpbmUgZmxhZ3MgYWxsIG9uIG9uZSBpbnB1dCBsaW5lLiBUaGUgc2hlbGwgb3BlbnMgb24gdGhlIGRldmljZSBvciBlbXVsYXRvciwKKyAgICBydW5zIHlvdXIgdGVzdHMsIHByb2R1Y2VzIG91dHB1dCwgYW5kIHRoZW4gcmV0dXJucyB0byB0aGUgY29tbWFuZCBsaW5lIG9uIHlvdXIgY29tcHV0ZXIuCis8L3A+Cis8cD4KKyAgICBUbyBydW4gYSB0ZXN0IHdpdGggPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT46CiA8L3A+CiA8b2w+Ci0gIDxsaT4KLSAgICBJZiBuZWNlc3NhcnksIHJlLWJ1aWxkIHlvdXIgbWFpbiBhcHBsaWNhdGlvbiBhbmQgdGVzdCBhcHBsaWNhdGlvbi4KLSAgPC9saT4KLSAgPGxpPgotICAgIEluc3RhbGwgeW91ciB0ZXN0IGFwcGxpY2F0aW9uIGFuZCBtYWluIGFwcGxpY2F0aW9uIEFuZHJvaWQgcGFja2FnZSBmaWxlcwotICAgICg8Y29kZT4uYXBrPC9jb2RlPiBmaWxlcykgdG8geW91ciBjdXJyZW50IEFuZHJvaWQgZGV2aWNlIG9yIGVtdWxhdG9yPC9saT4KLSAgPGxpPgotICAgIEF0IHRoZSBjb21tYW5kIGxpbmUsIGVudGVyOgorICAgIDxsaT4KKyAgICAgICAgSWYgbmVjZXNzYXJ5LCByZWJ1aWxkIHlvdXIgbWFpbiBhcHBsaWNhdGlvbiBhbmQgdGVzdCBwYWNrYWdlLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBJbnN0YWxsIHlvdXIgdGVzdCBwYWNrYWdlIGFuZCBtYWluIGFwcGxpY2F0aW9uIEFuZHJvaWQgcGFja2FnZSBmaWxlcworICAgICAgICAoPGNvZGU+LmFwazwvY29kZT4gZmlsZXMpIHRvIHlvdXIgY3VycmVudCBBbmRyb2lkIGRldmljZSBvciBlbXVsYXRvcjwvbGk+CisgICAgPGxpPgorICAgICAgICBBdCB0aGUgY29tbWFuZCBsaW5lLCBlbnRlcjoKIDxwcmU+CiAkIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13ICZsdDt0ZXN0X3BhY2thZ2VfbmFtZSZndDsvJmx0O3J1bm5lcl9jbGFzcyZndDsKIDwvcHJlPgotPHA+Ci0gICAgd2hlcmUgPGNvZGU+Jmx0O3Rlc3RfcGFja2FnZV9uYW1lJmd0OzwvY29kZT4gaXMgdGhlIEFuZHJvaWQgcGFja2FnZSBuYW1lIG9mIHlvdXIgdGVzdAotICAgIGFwcGxpY2F0aW9uLCBhbmQgPGNvZGU+Jmx0O3J1bm5lcl9jbGFzcyZndDs8L2NvZGU+IGlzIHRoZSBuYW1lIG9mIHRoZSBBbmRyb2lkIHRlc3QgcnVubmVyCi0gICAgY2xhc3MgeW91IGFyZSB1c2luZy4gVGhlIEFuZHJvaWQgcGFja2FnZSBuYW1lIGlzIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+cGFja2FnZTwvY29kZT4KLSAgICBhdHRyaWJ1dGUgb2YgdGhlIDxjb2RlPm1hbmlmZXN0PC9jb2RlPiBlbGVtZW50IGluIHRoZSBtYW5pZmVzdCBmaWxlCi0gICAgKDxjb2RlPkFuZHJvaWRNYW5pZmVzdC54bWw8L2NvZGU+KSBvZiB5b3VyIHRlc3QgYXBwbGljYXRpb24uIFRoZSBBbmRyb2lkIHRlc3QgcnVubmVyCi0gICAgY2xhc3MgaXMgdXN1YWxseSA8Y29kZT5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyPC9jb2RlPi4KLTwvcD4KLTxwPllvdXIgdGVzdCByZXN1bHRzIGFwcGVhciBpbiA8Y29kZT5TVERPVVQ8L2NvZGU+LjwvcD4KLSAgPC9saT4KKyAgICAgICAgPHA+CisgICAgICAgICAgICB3aGVyZSA8Y29kZT4mbHQ7dGVzdF9wYWNrYWdlX25hbWUmZ3Q7PC9jb2RlPiBpcyB0aGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUgb2YgeW91ciB0ZXN0CisgICAgICAgICAgICBhcHBsaWNhdGlvbiwgYW5kIDxjb2RlPiZsdDtydW5uZXJfY2xhc3MmZ3Q7PC9jb2RlPiBpcyB0aGUgbmFtZSBvZiB0aGUgQW5kcm9pZCB0ZXN0CisgICAgICAgICAgICBydW5uZXIgY2xhc3MgeW91IGFyZSB1c2luZy4gVGhlIEFuZHJvaWQgcGFja2FnZSBuYW1lIGlzIHRoZSB2YWx1ZSBvZiB0aGUKKyAgICAgICAgICAgIDxjb2RlPnBhY2thZ2U8L2NvZGU+IGF0dHJpYnV0ZSBvZiB0aGUgPGNvZGU+bWFuaWZlc3Q8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIG1hbmlmZXN0IGZpbGUKKyAgICAgICAgICAgICg8Y29kZT5BbmRyb2lkTWFuaWZlc3QueG1sPC9jb2RlPikgb2YgeW91ciB0ZXN0IHBhY2thZ2UuIFRoZSBBbmRyb2lkIHRlc3QgcnVubmVyCisgICAgICAgICAgICBjbGFzcyBpcyB1c3VhbGx5IHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0uCisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBZb3VyIHRlc3QgcmVzdWx0cyBhcHBlYXIgaW4gPGNvZGU+U1RET1VUPC9jb2RlPi4KKyAgICAgICAgPC9wPgorICAgIDwvbGk+CiA8L29sPgogPHA+Ci0gICAgVGhpcyBvcGVyYXRpb24gc3RhcnRzIGFuIDxjb2RlPmFkYjwvY29kZT4gc2hlbGwsIHRoZW4gcnVucyA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPiBpbiBpdAorICAgIFRoaXMgb3BlcmF0aW9uIHN0YXJ0cyBhbiA8Y29kZT5hZGI8L2NvZGU+IHNoZWxsLCB0aGVuIHJ1bnMgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4KICAgICB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4gVGhpcyBwYXJ0aWN1bGFyIGZvcm0gb2YgdGhlIGNvbW1hbmQgd2lsbCBydW4gYWxsIG9mIHRoZSB0ZXN0cwotICAgIGluIHlvdXIgdGVzdCBhcHBsaWNhdGlvbi4gWW91IGNhbiBjb250cm9sIHRoaXMgYmVoYXZpb3Igd2l0aCBmbGFncyB0aGF0IHlvdSBwYXNzIHRvCisgICAgaW4geW91ciB0ZXN0IHBhY2thZ2UuIFlvdSBjYW4gY29udHJvbCB0aGlzIGJlaGF2aW9yIHdpdGggZmxhZ3MgdGhhdCB5b3UgcGFzcyB0bwogICAgIDxjb2RlPmFtIGluc3RydW1lbnQ8L2NvZGU+LiBUaGVzZSBmbGFncyBhcmUgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uCiA8L3A+Ci08aDIgaWQ9IkFNU3ludGF4Ij5Vc2luZyB0aGUgSW5zdHJ1bWVudCBDb21tYW5kPC9oMj4KKzxoMiBpZD0iQU1TeW50YXgiPlVzaW5nIHRoZSBhbSBpbnN0cnVtZW50IENvbW1hbmQ8L2gyPgogPHA+Ci0gIFRoZSBnZW5lcmFsIHN5bnRheCBvZiB0aGUgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4gY29tbWFuZCBpczoKKyAgICBUaGUgZ2VuZXJhbCBzeW50YXggb2YgdGhlIDxjb2RlPmFtIGluc3RydW1lbnQ8L2NvZGU+IGNvbW1hbmQgaXM6CiA8L3A+CiA8cHJlPgogICAgIGFtIGluc3RydW1lbnQgW2ZsYWdzXSAmbHQ7dGVzdF9wYWNrYWdlJmd0Oy8mbHQ7cnVubmVyX2NsYXNzJmd0OwpAQCAtMzkxLDExICszOTUsMTEgQEAKICAgICAgICAgICAgIDxjb2RlPiZsdDt0ZXN0X3BhY2thZ2UmZ3Q7PC9jb2RlPgogICAgICAgICA8L3RkPgogICAgICAgICA8dGQ+Ci0gICAgICAgICAgICBUaGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUgb2YgdGhlIHRlc3QgYXBwbGljYXRpb24uCisgICAgICAgICAgICBUaGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUgb2YgdGhlIHRlc3QgcGFja2FnZS4KICAgICAgICAgPC90ZD4KICAgICAgICAgPHRkPgogICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5wYWNrYWdlPC9jb2RlPiBhdHRyaWJ1dGUgb2YgdGhlIDxjb2RlPm1hbmlmZXN0PC9jb2RlPgotICAgICAgICAgICAgZWxlbWVudCBpbiB0aGUgdGVzdCBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGZpbGUuCisgICAgICAgICAgICBlbGVtZW50IGluIHRoZSB0ZXN0IHBhY2thZ2UncyBtYW5pZmVzdCBmaWxlLgogICAgICAgICA8L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgpAQCAtNDExLDcgKzQxNSw3IEBACiAgICAgPC90cj4KIDwvdGFibGU+CiA8cD4KLVRoZSBmbGFncyBmb3IgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4gYXJlIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorICAgIFRoZSBmbGFncyBmb3IgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4gYXJlIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgogPC9wPgogPHRhYmxlPgogICAgIDx0cj4KQEAgLTQ2MSwyMCArNDY1LDIxIEBACiAgICAgICAgICAgICAgJmx0O3Rlc3Rfb3B0aW9ucyZndDsKICAgICAgICAgPC90ZD4KICAgICAgICAgPHRkPgotICAgICAgICAgICAgUHJvdmlkZXMgdGVzdGluZyBvcHRpb25zICwgaW4gdGhlIGZvcm0gb2Yga2V5LXZhbHVlIHBhaXJzLiBUaGUKKyAgICAgICAgICAgIFByb3ZpZGVzIHRlc3Rpbmcgb3B0aW9ucyBhcyBrZXktdmFsdWUgcGFpcnMuIFRoZQogICAgICAgICAgICAgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4gdG9vbCBwYXNzZXMgdGhlc2UgdG8gdGhlIHNwZWNpZmllZCBpbnN0cnVtZW50YXRpb24gY2xhc3MKICAgICAgICAgICAgIHZpYSBpdHMgPGNvZGU+b25DcmVhdGUoKTwvY29kZT4gbWV0aG9kLiBZb3UgY2FuIHNwZWNpZnkgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YKLSAgICAgICAgICAgIDxjb2RlPi1lICZsdDt0ZXN0X29wdGlvbnM8L2NvZGU+LiBUaGUga2V5cyBhbmQgdmFsdWVzIGFyZSBkZXNjcmliZWQgaW4gdGhlIG5leHQgdGFibGUuCisgICAgICAgICAgICA8Y29kZT4tZSAmbHQ7dGVzdF9vcHRpb25zJmd0OzwvY29kZT4uIFRoZSBrZXlzIGFuZCB2YWx1ZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUKKyAgICAgICAgICAgIHNlY3Rpb24gPGEgaHJlZj0iI0FNT3B0aW9uc1N5bnRheCI+YW0gaW5zdHJ1bWVudCBvcHRpb25zPC9hPi4KICAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgIFRoZSBvbmx5IGluc3RydW1lbnRhdGlvbiBjbGFzcyB0aGF0IHVuZGVyc3RhbmRzIHRoZXNlIGtleS12YWx1ZSBwYWlycyBpcwotICAgICAgICAgICAgICAgIDxjb2RlPkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI8L2NvZGU+IChvciBhIHN1YmNsYXNzKS4gVXNpbmcgdGhlbSB3aXRoCisgICAgICAgICAgICAgICAgVGhlIG9ubHkgaW5zdHJ1bWVudGF0aW9uIGNsYXNzIHRoYXQgdXNlcyB0aGVzZSBrZXktdmFsdWUgcGFpcnMgaXMKKyAgICAgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9IChvciBhIHN1YmNsYXNzKS4gVXNpbmcgdGhlbSB3aXRoCiAgICAgICAgICAgICAgICAgYW55IG90aGVyIGNsYXNzIGhhcyBubyBlZmZlY3QuCiAgICAgICAgICAgICA8L3A+CiAgICAgICAgIDwvdGQ+CiAgICAgPC90cj4KIDwvdGFibGU+CiAKLTxoMyBpZD0iQU1PcHRpb25zU3ludGF4Ij5JbnN0cnVtZW50IG9wdGlvbnM8L2gzPgorPGgzIGlkPSJBTU9wdGlvbnNTeW50YXgiPmFtIGluc3RydW1lbnQgb3B0aW9uczwvaDM+CiA8cD4KICAgICBUaGUgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4gdG9vbCBwYXNzZXMgdGVzdGluZyBvcHRpb25zIHRvCiAgICAgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gb3IgYSBzdWJjbGFzcyBpbiB0aGUgZm9ybSBvZiBrZXktdmFsdWUgcGFpcnMsCkBAIC00ODQsMTIzICs0ODksMTI3IEBACiAgICAgLWUgJmx0O2tleSZndDsgJmx0O3ZhbHVlJmd0OwogPC9wcmU+CiA8cD4KLSAgICBXaGVyZSBhcHBsaWNhYmxlLCBhICZsdDtrZXkmZ3Q7IG1heSBoYXZlIG11bHRpcGxlIHZhbHVlcyBzZXBhcmF0ZWQgYnkgYSBjb21tYSAoLCkuCisgICAgU29tZSBrZXlzIGFjY2VwdCBtdWx0aXBsZSB2YWx1ZXMuIFlvdSBzcGVjaWZ5IG11bHRpcGxlIHZhbHVlcyBpbiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LgogICAgIEZvciBleGFtcGxlLCB0aGlzIGludm9jYXRpb24gb2YgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gcHJvdmlkZXMgbXVsdGlwbGUKICAgICB2YWx1ZXMgZm9yIHRoZSA8Y29kZT5wYWNrYWdlPC9jb2RlPiBrZXk6Cis8L3A+CiA8cHJlPgotJCBhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyAtZSBwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QucGFja2FnZTEsY29tLmFuZHJvaWQudGVzdC5wYWNrYWdlMiBjb20uYW5kcm9pZC50ZXN0L2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyCiskIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IC1lIHBhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5wYWNrYWdlMSxjb20uYW5kcm9pZC50ZXN0LnBhY2thZ2UyIFwKKyZndDsgY29tLmFuZHJvaWQudGVzdC9hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcgogPC9wcmU+CiA8cD4KICAgICBUaGUgZm9sbG93aW5nIHRhYmxlIGRlc2NyaWJlcyB0aGUga2V5LXZhbHVlIHBhaXJzIGFuZCB0aGVpciByZXN1bHQuIFBsZWFzZSByZXZpZXcgdGhlCiAgICAgPHN0cm9uZz5Vc2FnZSBOb3Rlczwvc3Ryb25nPiBmb2xsb3dpbmcgdGhlIHRhYmxlLgogPC9wPgogPHRhYmxlPgotPHRyPgotICAgIDx0aD5LZXk8L3RoPgotICAgIDx0aD5WYWx1ZTwvdGg+Ci0gICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08dHI+Ci0gICAgPHRkPgotICAgICAgICA8Y29kZT5wYWNrYWdlPC9jb2RlPgotICAgIDwvdGQ+Ci0gICAgPHRkPgotICAgICAgICAmbHQ7SmF2YV9wYWNrYWdlX25hbWUmZ3Q7Ci0gICAgPC90ZD4KLSAgICA8dGQ+Ci0gICAgICAgIFRoZSBmdWxseS1xdWFsaWZpZWQgPGVtPkphdmE8L2VtPiBwYWNrYWdlIG5hbWUgZm9yIG9uZSBvZiB0aGUgcGFja2FnZXMgaW4gdGhlIHRlc3QKLSAgICAgICAgYXBwbGljYXRpb24uIEFueSB0ZXN0IGNhc2UgY2xhc3MgdGhhdCB1c2VzIHRoaXMgcGFja2FnZSBuYW1lIGlzIGV4ZWN1dGVkLiBOb3RpY2UgdGhhdCB0aGlzCi0gICAgICAgIGlzIG5vdCBhbiA8ZW0+QW5kcm9pZDwvZW0+IHBhY2thZ2UgbmFtZTsgYSB0ZXN0IGFwcGxpY2F0aW9uIGhhcyBhIHNpbmdsZSBBbmRyb2lkIHBhY2thZ2UKLSAgICAgICAgbmFtZSBidXQgbWF5IGhhdmUgc2V2ZXJhbCBKYXZhIHBhY2thZ2VzIHdpdGhpbiBpdC4KLSAgICA8L3RkPgotPC90cj4KLTx0cj4KLSAgICA8dGQgcm93c3Bhbj0iMiI+PGNvZGU+Y2xhc3M8L2NvZGU+PC90ZD4KLSAgICA8dGQ+Jmx0O2NsYXNzX25hbWUmZ3Q7PC90ZD4KLSAgICA8dGQ+Ci0gICAgICAgIFRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIGZvciBvbmUgb2YgdGhlIHRlc3QgY2FzZSBjbGFzc2VzLiBPbmx5IHRoaXMgdGVzdCBjYXNlCi0gICAgICAgIGNsYXNzIGlzIGV4ZWN1dGVkLgotICAgIDwvdGQ+Ci08L3RyPgotPHRyPgotICAgIDx0ZD4mbHQ7Y2xhc3NfbmFtZSZndDs8c3Ryb25nPiM8L3N0cm9uZz5tZXRob2QgbmFtZTwvdGQ+Ci0gICAgPHRkPgotICAgICAgICBBIGZ1bGx5LXF1YWxpZmllZCB0ZXN0IGNhc2UgY2xhc3MgbmFtZSwgYW5kIG9uZSBvZiBpdHMgbWV0aG9kcy4gT25seSB0aGlzIG1ldGhvZCBpcwotICAgICAgICBleGVjdXRlZC4gTm90ZSB0aGUgaGFzaCBtYXJrICgjKSBiZXR3ZWVuIHRoZSBjbGFzcyBuYW1lIGFuZCB0aGUgbWV0aG9kIG5hbWUuCi0gICAgPC90ZD4KLTwvdHI+Ci08dHI+Ci0gICAgPHRkPjxjb2RlPmZ1bmM8L2NvZGU+PC90ZD4KLSAgICA8dGQ+PGNvZGU+dHJ1ZTwvY29kZT48L3RkPgotICAgIDx0ZD4KLSAgICAgICAgUnVucyBhbGwgdGVzdCBjbGFzc2VzIHRoYXQgZXh0ZW5kIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2V9LgotICAgIDwvdGQ+Ci08L3RyPgotPHRyPgotICAgIDx0ZD48Y29kZT51bml0PC9jb2RlPjwvdGQ+Ci0gICAgPHRkPjxjb2RlPnRydWU8L2NvZGU+PC90ZD4KLSAgICA8dGQ+Ci0gICAgICAgIFJ1bnMgYWxsIHRlc3QgY2xhc3NlcyB0aGF0IGRvIDxlbT5ub3Q8L2VtPiBleHRlbmQgZWl0aGVyCi0gICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2V9IG9yIHtAbGluayBhbmRyb2lkLnRlc3QuUGVyZm9ybWFuY2VUZXN0Q2FzZX0uCi0gICAgPC90ZD4KLTwvdHI+Ci08dHI+Ci0gICAgPHRkPjxjb2RlPnNpemU8L2NvZGU+PC90ZD4KLSAgICA8dGQ+Wzxjb2RlPnNtYWxsPC9jb2RlPiB8IDxjb2RlPm1lZGl1bTwvY29kZT4gfCA8Y29kZT5sYXJnZTwvY29kZT5dCi0gICAgPC90ZD4KLSAgICA8dGQ+Ci0gICAgICAgIFJ1bnMgYSB0ZXN0IG1ldGhvZCBhbm5vdGF0ZWQgYnkgc2l6ZS4gVGhlICBhbm5vdGF0aW9ucyBhcmUgPGNvZGU+QFNtYWxsVGVzdDwvY29kZT4sCi0gICAgICAgIDxjb2RlPkBNZWRpdW1UZXN0PC9jb2RlPiwgYW5kIDxjb2RlPkBMYXJnZVRlc3Q8L2NvZGU+LgotICAgIDwvdGQ+Ci08L3RyPgotPHRyPgotICAgIDx0ZD48Y29kZT5wZXJmPC9jb2RlPjwvdGQ+Ci0gICAgPHRkPjxjb2RlPnRydWU8L2NvZGU+PC90ZD4KLSAgICA8dGQ+Ci0gICAgICAgIFJ1bnMgYWxsIHRlc3QgY2xhc3NlcyB0aGF0IGltcGxlbWVudCB7QGxpbmsgYW5kcm9pZC50ZXN0LlBlcmZvcm1hbmNlVGVzdENhc2V9LgotICAgICAgICBXaGVuIHlvdSB1c2UgdGhpcyBvcHRpb24sIGFsc28gc3BlY2lmeSB0aGUgPGNvZGU+LXI8L2NvZGU+IGZsYWcgZm9yCi0gICAgICAgIDxjb2RlPmFtIGluc3RydW1lbnQ8L2NvZGU+LCBzbyB0aGF0IHRoZSBvdXRwdXQgaXMga2VwdCBpbiByYXcgZm9ybWF0IGFuZCBub3QKLSAgICAgICAgcmUtZm9ybWF0dGVkIGFzIHRlc3QgcmVzdWx0cy4KLSAgICA8L3RkPgotPC90cj4KLTx0cj4KLSAgICA8dGQ+PGNvZGU+ZGVidWc8L2NvZGU+PC90ZD4KLSAgICA8dGQ+PGNvZGU+dHJ1ZTwvY29kZT48L3RkPgotICAgIDx0ZD4KLSAgICAgICAgUnVucyB0ZXN0cyBpbiBkZWJ1ZyBtb2RlLgotICAgIDwvdGQ+Ci08L3RyPgotPHRyPgotICAgIDx0ZD48Y29kZT5sb2c8L2NvZGU+PC90ZD4KLSAgICA8dGQ+PGNvZGU+dHJ1ZTwvY29kZT48L3RkPgotICAgIDx0ZD4KLSAgICAgICAgTG9hZHMgYW5kIGxvZ3MgYWxsIHNwZWNpZmllZCB0ZXN0cywgYnV0IGRvZXMgbm90IHJ1biB0aGVtLiBUaGUgdGVzdAotICAgICAgICBpbmZvcm1hdGlvbiBhcHBlYXJzIGluIDxjb2RlPlNURE9VVDwvY29kZT4uIFVzZSB0aGlzIHRvIHZlcmlmeSBjb21iaW5hdGlvbnMgb2Ygb3RoZXIgZmlsdGVycwotICAgICAgICBhbmQgdGVzdCBzcGVjaWZpY2F0aW9ucy4KLSAgICA8L3RkPgotPC90cj4KLTx0cj4KLSAgICA8dGQ+PGNvZGU+ZW1tYTwvY29kZT48L3RkPgotICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+Ci0gICAgPHRkPgotICAgICAgICBSdW5zIGFuIEVNTUEgY29kZSBjb3ZlcmFnZSBhbmFseXNpcyBhbmQgd3JpdGVzIHRoZSBvdXRwdXQgdG8gPGNvZGU+L2RhdGEvL2NvdmVyYWdlLmVjPC9jb2RlPgotICAgICAgICBvbiB0aGUgZGV2aWNlLiBUbyBvdmVycmlkZSB0aGUgZmlsZSBsb2NhdGlvbiwgdXNlIHRoZSA8Y29kZT5jb3ZlcmFnZUZpbGU8L2NvZGU+IGtleSB0aGF0Ci0gICAgICAgIGlzIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIGVudHJ5LgotICAgICAgICA8cCBjbGFzcz0ibm90ZSI+Ci0gICAgICAgICAgICA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoaXMgb3B0aW9uIHJlcXVpcmVzIGFuIEVNTUEtaW5zdHJ1bWVudGVkIGJ1aWxkIG9mIHRoZSB0ZXN0Ci0gICAgICAgICAgICBhcHBsaWNhdGlvbiwgd2hpY2ggeW91IGNhbiBnZW5lcmF0ZSB3aXRoIHRoZSA8Y29kZT5jb3ZlcmFnZTwvY29kZT4gdGFyZ2V0LgotICAgICAgICA8L3A+Ci0gICAgPC90ZD4KLTwvdHI+Ci08dHI+Ci0gICAgPHRkPjxjb2RlPmNvdmVyYWdlRmlsZTwvY29kZT48L3RkPgotICAgIDx0ZD48Y29kZT4mbHQ7ZmlsZW5hbWUmZ3Q7PC9jb2RlPjwvdGQ+Ci0gICAgPHRkPgotICAgICAgICBPdmVycmlkZXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIEVNTUEgY292ZXJhZ2UgZmlsZSBvbiB0aGUgZGV2aWNlLiBTcGVjaWZ5IHRoaXMKLSAgICAgICAgdmFsdWUgYXMgYSBwYXRoIGFuZCBmaWxlbmFtZSBpbiBVTklYIGZvcm1hdC4gVGhlIGRlZmF1bHQgZmlsZW5hbWUgaXMgZGVzY3JpYmVkIGluIHRoZQotICAgICAgICBlbnRyeSBmb3IgdGhlIDxjb2RlPmVtbWE8L2NvZGU+IGtleS4KLSAgICA8L3RkPgotPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0aD5LZXk8L3RoPgorICAgICAgICA8dGg+VmFsdWU8L3RoPgorICAgICAgICA8dGg+RGVzY3JpcHRpb248L3RoPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICA8Y29kZT5wYWNrYWdlPC9jb2RlPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICAmbHQ7SmF2YV9wYWNrYWdlX25hbWUmZ3Q7CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFRoZSBmdWxseS1xdWFsaWZpZWQgPGVtPkphdmE8L2VtPiBwYWNrYWdlIG5hbWUgZm9yIG9uZSBvZiB0aGUgcGFja2FnZXMgaW4gdGhlIHRlc3QKKyAgICAgICAgICAgIGFwcGxpY2F0aW9uLiBBbnkgdGVzdCBjYXNlIGNsYXNzIHRoYXQgdXNlcyB0aGlzIHBhY2thZ2UgbmFtZSBpcyBleGVjdXRlZC4gTm90aWNlIHRoYXQKKyAgICAgICAgICAgIHRoaXMgaXMgbm90IGFuIDxlbT5BbmRyb2lkPC9lbT4gcGFja2FnZSBuYW1lOyBhIHRlc3QgcGFja2FnZSBoYXMgYSBzaW5nbGUKKyAgICAgICAgICAgIEFuZHJvaWQgcGFja2FnZSBuYW1lIGJ1dCBtYXkgaGF2ZSBzZXZlcmFsIEphdmEgcGFja2FnZXMgd2l0aGluIGl0LgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQgcm93c3Bhbj0iMiI+PGNvZGU+Y2xhc3M8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPiZsdDtjbGFzc19uYW1lJmd0OzwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIGZvciBvbmUgb2YgdGhlIHRlc3QgY2FzZSBjbGFzc2VzLiBPbmx5IHRoaXMgdGVzdAorICAgICAgICAgICAgY2FzZSBjbGFzcyBpcyBleGVjdXRlZC4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPiZsdDtjbGFzc19uYW1lJmd0OzxzdHJvbmc+Izwvc3Ryb25nPm1ldGhvZCBuYW1lPC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgQSBmdWxseS1xdWFsaWZpZWQgdGVzdCBjYXNlIGNsYXNzIG5hbWUsIGFuZCBvbmUgb2YgaXRzIG1ldGhvZHMuIE9ubHkgdGhpcyBtZXRob2QgaXMKKyAgICAgICAgICAgIGV4ZWN1dGVkLiBOb3RlIHRoZSBoYXNoIG1hcmsgKCMpIGJldHdlZW4gdGhlIGNsYXNzIG5hbWUgYW5kIHRoZSBtZXRob2QgbmFtZS4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPmZ1bmM8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPjxjb2RlPnRydWU8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgUnVucyBhbGwgdGVzdCBjbGFzc2VzIHRoYXQgZXh0ZW5kIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2V9LgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+dW5pdDwvY29kZT48L3RkPgorICAgICAgICA8dGQ+PGNvZGU+dHJ1ZTwvY29kZT48L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICBSdW5zIGFsbCB0ZXN0IGNsYXNzZXMgdGhhdCBkbyA8ZW0+bm90PC9lbT4gZXh0ZW5kIGVpdGhlcgorICAgICAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZX0gb3IKKyAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuUGVyZm9ybWFuY2VUZXN0Q2FzZX0uCisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT5zaXplPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFs8Y29kZT5zbWFsbDwvY29kZT4gfCA8Y29kZT5tZWRpdW08L2NvZGU+IHwgPGNvZGU+bGFyZ2U8L2NvZGU+XQorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICBSdW5zIGEgdGVzdCBtZXRob2QgYW5ub3RhdGVkIGJ5IHNpemUuIFRoZSAgYW5ub3RhdGlvbnMgYXJlIDxjb2RlPkBTbWFsbFRlc3Q8L2NvZGU+LAorICAgICAgICAgICAgPGNvZGU+QE1lZGl1bVRlc3Q8L2NvZGU+LCBhbmQgPGNvZGU+QExhcmdlVGVzdDwvY29kZT4uCisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT5wZXJmPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFJ1bnMgYWxsIHRlc3QgY2xhc3NlcyB0aGF0IGltcGxlbWVudCB7QGxpbmsgYW5kcm9pZC50ZXN0LlBlcmZvcm1hbmNlVGVzdENhc2V9LgorICAgICAgICAgICAgV2hlbiB5b3UgdXNlIHRoaXMgb3B0aW9uLCBhbHNvIHNwZWNpZnkgdGhlIDxjb2RlPi1yPC9jb2RlPiBmbGFnIGZvcgorICAgICAgICAgICAgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4sIHNvIHRoYXQgdGhlIG91dHB1dCBpcyBrZXB0IGluIHJhdyBmb3JtYXQgYW5kIG5vdAorICAgICAgICAgICAgcmUtZm9ybWF0dGVkIGFzIHRlc3QgcmVzdWx0cy4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPmRlYnVnPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFJ1bnMgdGVzdHMgaW4gZGVidWcgbW9kZS4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPmxvZzwvY29kZT48L3RkPgorICAgICAgICA8dGQ+PGNvZGU+dHJ1ZTwvY29kZT48L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICBMb2FkcyBhbmQgbG9ncyBhbGwgc3BlY2lmaWVkIHRlc3RzLCBidXQgZG9lcyBub3QgcnVuIHRoZW0uIFRoZSB0ZXN0CisgICAgICAgICAgICBpbmZvcm1hdGlvbiBhcHBlYXJzIGluIDxjb2RlPlNURE9VVDwvY29kZT4uIFVzZSB0aGlzIHRvIHZlcmlmeSBjb21iaW5hdGlvbnMgb2Ygb3RoZXIKKyAgICAgICAgICAgIGZpbHRlcnMgYW5kIHRlc3Qgc3BlY2lmaWNhdGlvbnMuCisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT5lbW1hPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFJ1bnMgYW4gRU1NQSBjb2RlIGNvdmVyYWdlIGFuYWx5c2lzIGFuZCB3cml0ZXMgdGhlIG91dHB1dCB0bworICAgICAgICAgICAgPGNvZGU+L2RhdGEvL2NvdmVyYWdlLmVjPC9jb2RlPiBvbiB0aGUgZGV2aWNlLiBUbyBvdmVycmlkZSB0aGUgZmlsZSBsb2NhdGlvbiwgdXNlIHRoZQorICAgICAgICAgICAgPGNvZGU+Y292ZXJhZ2VGaWxlPC9jb2RlPiBrZXkgdGhhdCBpcyBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyBlbnRyeS4KKyAgICAgICAgICAgIDxwIGNsYXNzPSJub3RlIj4KKyAgICAgICAgICAgICAgICA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoaXMgb3B0aW9uIHJlcXVpcmVzIGFuIEVNTUEtaW5zdHJ1bWVudGVkIGJ1aWxkIG9mIHRoZSB0ZXN0CisgICAgICAgICAgICAgICAgYXBwbGljYXRpb24sIHdoaWNoIHlvdSBjYW4gZ2VuZXJhdGUgd2l0aCB0aGUgPGNvZGU+Y292ZXJhZ2U8L2NvZGU+IHRhcmdldC4KKyAgICAgICAgICAgIDwvcD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPmNvdmVyYWdlRmlsZTwvY29kZT48L3RkPgorICAgICAgICA8dGQ+PGNvZGU+Jmx0O2ZpbGVuYW1lJmd0OzwvY29kZT48L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICBPdmVycmlkZXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIEVNTUEgY292ZXJhZ2UgZmlsZSBvbiB0aGUgZGV2aWNlLiBTcGVjaWZ5IHRoaXMKKyAgICAgICAgICAgIHZhbHVlIGFzIGEgcGF0aCBhbmQgZmlsZW5hbWUgaW4gVU5JWCBmb3JtYXQuIFRoZSBkZWZhdWx0IGZpbGVuYW1lIGlzIGRlc2NyaWJlZCBpbiB0aGUKKyAgICAgICAgICAgIGVudHJ5IGZvciB0aGUgPGNvZGU+ZW1tYTwvY29kZT4ga2V5LgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CiA8L3RhYmxlPgogPHN0cm9uZz48Y29kZT4tZTwvY29kZT4gRmxhZyBVc2FnZSBOb3Rlczwvc3Ryb25nPgogPHVsPgpAQCAtNjE4LDEzICs2MjcsMTMgQEAKICAgICAgICAgVGhlIDxjb2RlPmZ1bmM8L2NvZGU+IGtleSBhbmQgPGNvZGU+dW5pdDwvY29kZT4ga2V5IGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCiAgICAgPC9saT4KIDwvdWw+Ci08aDMgaWQ9IlJ1blRlc3RFeGFtcGxlcyI+SW5zdHJ1bWVudCBleGFtcGxlczwvaDM+Cis8aDMgaWQ9IlJ1blRlc3RFeGFtcGxlcyI+VXNhZ2UgZXhhbXBsZXM8L2gzPgogPHA+Ci1IZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIHVzaW5nIDxjb2RlPmFtIGluc3RydW1lbnQ8L2NvZGU+IHRvIHJ1biB0ZXN0cy4gVGhleSBhcmUgYmFzZWQgb24KLXRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOjwvcD4KK1RoZSBmb2xsb3dpbmcgc2VjdGlvbnMgcHJvdmlkZSBleGFtcGxlcyBvZiB1c2luZyA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPiB0byBydW4gdGVzdHMuCitUaGV5IGFyZSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTo8L3A+CiA8dWw+CiAgICAgPGxpPgotICAgICAgICBUaGUgdGVzdCBhcHBsaWNhdGlvbiBoYXMgdGhlIEFuZHJvaWQgcGFja2FnZSBuYW1lIDxjb2RlPmNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzPC9jb2RlPgorICAgICAgICBUaGUgdGVzdCBwYWNrYWdlIGhhcyB0aGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUgPGNvZGU+Y29tLmFuZHJvaWQuZGVtby5hcHAudGVzdHM8L2NvZGU+CiAgICAgPC9saT4KICAgICA8bGk+CiAgICAgICAgIFRoZXJlIGFyZSB0aHJlZSB0ZXN0IGNsYXNzZXM6CkBAIC02NDcsMzUgKzY1NiwzNSBAQAogICAgICAgICBUaGUgdGVzdCBydW5uZXIgaXMge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfS4KICAgICA8L2xpPgogPC91bD4KLTxoND5SdW5uaW5nIHRoZSBFbnRpcmUgVGVzdCBBcHBsaWNhdGlvbjwvaDQ+Cis8aDQ+UnVubmluZyB0aGUgZW50aXJlIHRlc3QgcGFja2FnZTwvaDQ+CiA8cD4KLSAgICBUbyBydW4gYWxsIG9mIHRoZSB0ZXN0IGNsYXNzZXMgaW4gdGhlIHRlc3QgYXBwbGljYXRpb24sIGVudGVyOgorICAgIFRvIHJ1biBhbGwgb2YgdGhlIHRlc3QgY2xhc3NlcyBpbiB0aGUgdGVzdCBwYWNrYWdlLCBlbnRlcjoKIDwvcD4KIDxwcmU+CiAkIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IGNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzL2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyCiA8L3ByZT4KLTxoND5SdW5uaW5nIEFsbCBUZXN0cyBpbiBhIFRlc3QgQ2FzZSBDbGFzczwvaDQ+Cis8aDQ+UnVubmluZyBhbGwgdGVzdHMgaW4gYSB0ZXN0IGNhc2UgY2xhc3M8L2g0PgogPHA+CiAgICAgVG8gcnVuIGFsbCBvZiB0aGUgdGVzdHMgaW4gdGhlIGNsYXNzIDxjb2RlPlVuaXRUZXN0czwvY29kZT4sIGVudGVyOgogPC9wPgogPHByZT4KICQgYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgIFwKLS1lIGNsYXNzIGNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzLlVuaXRUZXN0cyBcCi1jb20uYW5kcm9pZC5kZW1vLmFwcC50ZXN0cy9hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcgorJmd0OyAtZSBjbGFzcyBjb20uYW5kcm9pZC5kZW1vLmFwcC50ZXN0cy5Vbml0VGVzdHMgXAorJmd0OyBjb20uYW5kcm9pZC5kZW1vLmFwcC50ZXN0cy9hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcgogPC9wcmU+CiA8cD4KICAgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4gZ2V0cyB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPi1lPC9jb2RlPiBmbGFnLCBkZXRlY3RzIHRoZQogICA8Y29kZT5jbGFzczwvY29kZT4ga2V5d29yZCwgYW5kIHJ1bnMgYWxsIHRoZSBtZXRob2RzIGluIHRoZSA8Y29kZT5Vbml0VGVzdHM8L2NvZGU+IGNsYXNzLgogPC9wPgotPGg0PlNlbGVjdGluZyBhIFN1YnNldCBvZiBUZXN0czwvaDQ+Cis8aDQ+U2VsZWN0aW5nIGEgc3Vic2V0IG9mIHRlc3RzPC9oND4KIDxwPgotICBUbyBydW4gYWxsIG9mIHRoZSB0ZXN0cyBpbiA8Y29kZT5Vbml0VGVzdHM8L2NvZGU+LCBhbmQgdGhlIDxjb2RlPnRlc3RDYW1lcmE8L2NvZGU+IG1ldGhvZCBpbgotICA8Y29kZT5GdW5jdGlvblRlc3RzPC9jb2RlPiwgZW50ZXI6CisgICAgVG8gcnVuIGFsbCBvZiB0aGUgdGVzdHMgaW4gPGNvZGU+VW5pdFRlc3RzPC9jb2RlPiwgYW5kIHRoZSA8Y29kZT50ZXN0Q2FtZXJhPC9jb2RlPiBtZXRob2QgaW4KKyAgICA8Y29kZT5GdW5jdGlvblRlc3RzPC9jb2RlPiwgZW50ZXI6CiA8L3A+CiA8cHJlPgogJCBhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyBcCi0tZSBjbGFzcyBjb20uYW5kcm9pZC5kZW1vLmFwcC50ZXN0cy5Vbml0VGVzdHMsY29tLmFuZHJvaWQuZGVtby5hcHAudGVzdHMuRnVuY3Rpb25UZXN0cyN0ZXN0Q2FtZXJhIFwKLWNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzL2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyCismZ3Q7IC1lIGNsYXNzIGNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzLlVuaXRUZXN0cyxjb20uYW5kcm9pZC5kZW1vLmFwcC50ZXN0cy5GdW5jdGlvblRlc3RzI3Rlc3RDYW1lcmEgXAorJmd0OyBjb20uYW5kcm9pZC5kZW1vLmFwcC50ZXN0cy9hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcgogPC9wcmU+CiA8cD4KICAgICBZb3UgY2FuIGZpbmQgbW9yZSBleGFtcGxlcyBvZiB0aGUgY29tbWFuZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9ndWlkZV90b2MuY3MgYi9kb2NzL2h0bWwvZ3VpZGUvZ3VpZGVfdG9jLmNzCmluZGV4IDM1Y2UxN2UuLjk3OTM3NDggMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9ndWlkZV90b2MuY3MKKysrIGIvZG9jcy9odG1sL2d1aWRlL2d1aWRlX3RvYy5jcwpAQCAtMjU0LDkgKzI1NCwzMCBAQAogICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdD8+Z3VpZGUvdG9waWNzL3NlYXJjaC9zZWFyY2hhYmxlLWNvbmZpZy5odG1sIj5TZWFyY2hhYmxlIENvbmZpZ3VyYXRpb248L2E+PC9saT4KICAgICAgICAgICA8L3VsPgogICAgICAgPC9saT4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3Q/Pmd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VGVzdGluZyBhbmQgSW5zdHJ1bWVudGF0aW9uPC9zcGFuPjwvYT4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KKyAgICAgIDxsaSBjbGFzcz0idG9nZ2xlLWxpc3QiPgorICAgICAgICAgICA8ZGl2PgorICAgICAgICAgICAgICAgIDxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/Pmd1aWRlL3RvcGljcy90ZXN0aW5nL2luZGV4Lmh0bWwiPgorICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VGVzdGluZzwvc3Bhbj4KKyAgICAgICAgICAgICAgIDwvYT4gPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj4KKyAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdD8+Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VGVzdGluZyBGdW5kYW1lbnRhbHM8L3NwYW4+PC9hPgorICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290Pz5ndWlkZS90b3BpY3MvdGVzdGluZy9hY3Rpdml0eV90ZXN0aW5nLmh0bWwiPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QWN0aXZpdHkgVGVzdGluZzwvc3Bhbj48L2E+CisgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5ndWlkZS90b3BpY3MvdGVzdGluZy9jb250ZW50cHJvdmlkZXJfdGVzdGluZy5odG1sIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkNvbnRlbnQgUHJvdmlkZXIgVGVzdGluZzwvc3Bhbj48L2E+CisgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5ndWlkZS90b3BpY3MvdGVzdGluZy9zZXJ2aWNlX3Rlc3RpbmcuaHRtbCI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5TZXJ2aWNlIFRlc3Rpbmc8L3NwYW4+PC9hPgorICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z3VpZGUvdG9waWNzL3Rlc3Rpbmcvd2hhdF90b190ZXN0Lmh0bWwiPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+V2hhdCBUbyBUZXN0PC9zcGFuPjwvYT4KKyAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CiAgICAgPC91bD4KICAgPC9saT4KIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy5qZAppbmRleCBhMDk1MDg3Li44NGMyZWQyIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy5qZApAQCAtMjk0LDggKzI5NCw4IEBACiA8bGk+PHA+QSBzZXJ2aWNlIGlzIHN0YXJ0ZWQgKG9yIG5ldyBpbnN0cnVjdGlvbnMgYXJlIGdpdmVuIHRvIGFuIG9uZ29pbmcgCiBzZXJ2aWNlKSBieSBwYXNzaW5nIGFuIEludGVudCBvYmplY3QgdG8gPGNvZGU+e0BsaW5rIAogYW5kcm9pZC5jb250ZW50LkNvbnRleHQjc3RhcnRTZXJ2aWNlIENvbnRleHQuc3RhcnRTZXJ2aWNlKCl9PC9jb2RlPi4gIAotQW5kcm9pZCBjYWxscyB0aGUgc2VydmljZSdzIDxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uU3RhcnQgCi1vblN0YXJ0KCl9PC9jb2RlPiBtZXRob2QgYW5kIHBhc3NlcyBpdCB0aGUgSW50ZW50IG9iamVjdC48L3A+CitBbmRyb2lkIGNhbGxzIHRoZSBzZXJ2aWNlJ3MgPGNvZGU+e0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2Ujb25TdGFydENvbW1hbmQKK29uU3RhcnRDb21tYW5kKCl9PC9jb2RlPiBtZXRob2QgYW5kIHBhc3NlcyBpdCB0aGUgSW50ZW50IG9iamVjdC48L3A+CiAKIDxwPgogU2ltaWxhcmx5LCBhbiBpbnRlbnQgY2FuIGJlIHBhc3NlZCB0byA8Y29kZT57QGxpbmsgCkBAIC0xNTEwLDkgKzE1MTAsOSBAQAogaW4ge0Bjb2RlIG9uQ3JlYXRlKCl9LCBhbmQgdGhlbiBzdG9wIHRoZSB0aHJlYWQgaW4ge0Bjb2RlIG9uRGVzdHJveSgpfS48L2xpPgogCiA8bGk+PHA+VGhlIDxiPmFjdGl2ZSBsaWZldGltZTwvYj4gb2YgYSBzZXJ2aWNlIGJlZ2lucyB3aXRoIGEgY2FsbCB0byAKLTxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uU3RhcnQgb25TdGFydCgpfTwvY29kZT4uICBUaGlzIG1ldGhvZCAKKzxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uU3RhcnRDb21tYW5kIG9uU3RhcnRDb21tYW5kKCl9PC9jb2RlPi4gIFRoaXMgbWV0aG9kCiBpcyBoYW5kZWQgdGhlIEludGVudCBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIHRvIHtAY29kZSBzdGFydFNlcnZpY2UoKX0uCi1UaGUgbXVzaWMgc2VydmljZSB3b3VsZCBvcGVuIHRoZSBJbnRlbnQgdG8gZGlzY292ZXIgd2hpY2ggbXVzaWMgdG8gCitUaGUgbXVzaWMgc2VydmljZSB3b3VsZCBvcGVuIHRoZSBJbnRlbnQgdG8gZGlzY292ZXIgd2hpY2ggbXVzaWMgdG8KIHBsYXksIGFuZCBiZWdpbiB0aGUgcGxheWJhY2suPC9wPgogCiA8cD4KQEAgLTE1MjcsNyArMTUyNyw3IEBACiA8Y29kZT57QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjc3RhcnRTZXJ2aWNlIENvbnRleHQuc3RhcnRTZXJ2aWNlKCl9PC9jb2RlPgogb3IgCiA8Y29kZT57QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjYmluZFNlcnZpY2UgQ29udGV4dC5iaW5kU2VydmljZSgpfTwvY29kZT4uCi1Ib3dldmVyLCB7QGNvZGUgb25TdGFydCgpfSBpcyBjYWxsZWQgb25seSBmb3Igc2VydmljZXMgc3RhcnRlZCBieSB7QGNvZGUKK0hvd2V2ZXIsIHtAY29kZSBvblN0YXJ0Q29tbWFuZCgpfSBpcyBjYWxsZWQgb25seSBmb3Igc2VydmljZXMgc3RhcnRlZCBieSB7QGNvZGUKIHN0YXJ0U2VydmljZSgpfS4KIDwvcD4KIApAQCAtMTYzMSw3ICsxNjMxLDcgQEAKIAogPGxpPjxwPkl0IGhhcyBhIHtAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlfSBvYmplY3QgdGhhdCdzIGV4ZWN1dGluZwogb25lIG9mIGl0cyBsaWZlY3ljbGUgY2FsbGJhY2tzICg8Y29kZT57QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvbkNyZWF0ZSAKLW9uQ3JlYXRlKCl9PC9jb2RlPiwgPGNvZGU+e0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2Ujb25TdGFydCBvblN0YXJ0KCl9PC9jb2RlPiwgCitvbkNyZWF0ZSgpfTwvY29kZT4sIDxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uU3RhcnRDb21tYW5kIG9uU3RhcnRDb21tYW5kKCl9PC9jb2RlPiwKIG9yIDxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uRGVzdHJveSBvbkRlc3Ryb3koKX08L2NvZGU+KS48L3A+PC9saT4KIAogPGxpPjxwPkl0IGhhcyBhIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXJ9IG9iamVjdCB0aGF0J3MgCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy9hY3Rpdml0aWVzLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMvYWN0aXZpdGllcy5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjE2YWI4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMvYWN0aXZpdGllcy5qZApAQCAtMCwwICsxLDc2MiBAQAorcGFnZS50aXRsZT1BY3Rpdml0aWVzCitwYXJlbnQudGl0bGU9QXBwbGljYXRpb24gRnVuZGFtZW50YWxzCitwYXJlbnQubGluaz1pbmRleC5odG1sCitAamQ6Ym9keQorCis8ZGl2IGlkPSJxdi13cmFwcGVyIj4KKzxkaXYgaWQ9InF2Ij4KKzxoMj5RdWlja3ZpZXc8L2gyPgorPHVsPgorICA8bGk+QW4gYWN0aXZpdHkgcHJvdmlkZXMgYSB1c2VyIGludGVyZmFjZSBmb3IgYSBzaW5nbGUgc2NyZWVuIGluIHlvdXIgYXBwbGljYXRpb248L2xpPgorICA8bGk+QWN0aXZpdGllcyBjYW4gbW92ZSBpbnRvIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGVuIGJlIHJlc3VtZWQgd2l0aCB0aGVpciBzdGF0ZSByZXN0b3JlZDwvbGk+Cis8L3VsPgorCis8aDI+SW4gdGhpcyBkb2N1bWVudDwvaDI+Cis8b2w+CisgIDxsaT48YSBocmVmPSIjQ3JlYXRpbmciPkNyZWF0aW5nIGFuIEFjdGl2aXR5PC9hPgorICAgIDxvbD4KKyAgICAgIDxsaT48YSBocmVmPSIjVUkiPkltcGxlbWVudGluZyBhIHVzZXIgaW50ZXJmYWNlPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI0RlY2xhcmluZyI+RGVjbGFyaW5nIHRoZSBhY3Rpdml0eSBpbiB0aGUgbWFuaWZlc3Q8L2E+PC9saT4KKyAgICA8L29sPgorICA8L2xpPgorICA8bGk+PGEgaHJlZj0iI1N0YXJ0aW5nQW5BY3Rpdml0eSI+U3RhcnRpbmcgYW4gQWN0aXZpdHk8L2E+CisgICAgPG9sPgorICAgICAgPGxpPjxhIGhyZWY9IiNTdGFydGluZ0FuQWN0aXZpdHlGb3JSZXN1bHQiPlN0YXJ0aW5nIGFuIEFjdGl2aXR5IGZvciBhIFJlc3VsdDwvYT48L2xpPgorICAgIDwvb2w+CisgIDwvbGk+CisgIDxsaT48YSBocmVmPSIjTGlmZWN5Y2xlIj5NYW5hZ2luZyB0aGUgQWN0aXZpdHkgTGlmZWN5Y2xlPC9hPgorICAgIDxvbD4KKyAgICAgIDxsaT48YSBocmVmPSIjSW1wbGVtZW50aW5nTGlmZWN5Y2xlQ2FsbGJhY2tzIj5JbXBsZW1lbnRpbmcgdGhlIGxpZmVjeWNsZSBjYWxsYmFja3M8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjU2F2aW5nQWN0aXZpdHlTdGF0ZSI+U2F2aW5nIGFjdGl2aXR5IHN0YXRlPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI0NvbmZpZ3VyYXRpb25DaGFuZ2VzIj5IYW5kbGluZyBjb25maWd1cmF0aW9uIGNoYW5nZXM8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjQ29vcmRpbmF0aW5nQWN0aXZpdGllcyI+Q29vcmRpbmF0aW5nIGFjdGl2aXRpZXM8L2E+PC9saT4KKyAgICA8L29sPgorICA8L2xpPgorPC9vbD4KKworPGgyPktleSBjbGFzc2VzPC9oMj4KKzxvbD4KKyAgPGxpPntAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eX08L2xpPgorPC9vbD4KKworPGgyPlNlZSBhbHNvPC9oMj4KKzxvbD4KKyAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL2hlbGxvLXdvcmxkLmh0bWwiPkhlbGxvIFdvcmxkIFR1dG9yaWFsPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy90YXNrcy1hbmQtYmFjay1zdGFjayI+VGFza3MgYW5kIEJhY2sKK1N0YWNrPC9hPjwvbGk+Cis8L29sPgorCis8L2Rpdj4KKzwvZGl2PgorCisKKworPHA+QW4ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5fSBpcyBhbiBhcHBsaWNhdGlvbiBjb21wb25lbnQgdGhhdCBwcm92aWRlcyBhIHNjcmVlbiB3aXRoIHdoaWNoCit1c2VycyBjYW4gaW50ZXJhY3QgaW4gb3JkZXIgdG8gZG8gc29tZXRoaW5nLCBzdWNoIGFzIGRpYWwgdGhlIHBob25lLCB0YWtlIGEgcGhvdG8sIHNlbmQgYW4gZW1haWwsIG9yCit2aWV3IGEgbWFwLiBFYWNoIGFjdGl2aXR5IGlzIGdpdmVuIGEgd2luZG93IGluIHdoaWNoIHRvIGRyYXcgaXRzIHVzZXIgaW50ZXJmYWNlLiBUaGUgd2luZG93Cit0eXBpY2FsbHkgZmlsbHMgdGhlIHNjcmVlbiwgYnV0IG1heSBiZSBzbWFsbGVyIHRoYW4gdGhlIHNjcmVlbiBhbmQgZmxvYXQgb24gdG9wIG9mIG90aGVyCit3aW5kb3dzLjwvcD4KKworPHA+IEFuIGFwcGxpY2F0aW9uIHVzdWFsbHkgY29uc2lzdHMgb2YgbXVsdGlwbGUgYWN0aXZpdGllcyB0aGF0IGFyZSBsb29zZWx5IGJvdW5kCit0byBlYWNoIG90aGVyLiBUeXBpY2FsbHksIG9uZSBhY3Rpdml0eSBpbiBhbiBhcHBsaWNhdGlvbiBpcyBzcGVjaWZpZWQgYXMgdGhlICJtYWluIiBhY3Rpdml0eSwgd2hpY2gKK2lzIHByZXNlbnRlZCB0byB0aGUgdXNlciB3aGVuIGxhdW5jaGluZyB0aGUgYXBwbGljYXRpb24gZm9yIHRoZSBmaXJzdCB0aW1lLiBFYWNoCithY3Rpdml0eSBjYW4gdGhlbiBzdGFydCBhbm90aGVyIGFjdGl2aXR5IGluIG9yZGVyIHRvIHBlcmZvcm0gZGlmZmVyZW50IGFjdGlvbnMuIEVhY2ggdGltZSBhIG5ldworYWN0aXZpdHkgc3RhcnRzLCB0aGUgcHJldmlvdXMgYWN0aXZpdHkgaXMgc3RvcHBlZCwgYnV0IHRoZSBzeXN0ZW0gcHJlc2VydmVzIHRoZSBhY3Rpdml0eQoraW4gYSBzdGFjayAodGhlICJiYWNrIHN0YWNrIikuIFdoZW4gYSBuZXcgYWN0aXZpdHkgc3RhcnRzLCBpdCBpcyBwdXNoZWQgb250byB0aGUgYmFjayBzdGFjayBhbmQKK3Rha2VzIHVzZXIgZm9jdXMuIFRoZSBiYWNrIHN0YWNrIGFiaWRlcyB0byB0aGUgYmFzaWMgImxhc3QgaW4sIGZpcnN0IG91dCIgcXVldWUgbWVjaGFuaXNtLAorc28sIHdoZW4gdGhlIHVzZXIgaXMgZG9uZSB3aXRoIHRoZSBjdXJyZW50IGFjdGl2aXR5IGFuZCBwcmVzc2VzIHRoZSBCQUNLIGtleSwgaXQKK2lzIHBvcHBlZCBmcm9tIHRoZSBzdGFjayAoYW5kIGRlc3Ryb3llZCkgYW5kIHRoZSBwcmV2aW91cyBhY3Rpdml0eSByZXN1bWVzLiAoVGhlIGJhY2sgc3RhY2sgaXMKK2Rpc2N1c3NlZCBtb3JlIGluIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy90YXNrcy1hbmQtYmFjay1zdGFjay5odG1sIj5UYXNrcworYW5kIEJhY2sgU3RhY2s8L2E+IGRvY3VtZW50Lik8L3A+CisKKzxwPldoZW4gYW4gYWN0aXZpdHkgaXMgc3RvcHBlZCBiZWNhdXNlIGEgbmV3IGFjdGl2aXR5IHN0YXJ0cywgaXQgaXMgbm90aWZpZWQgb2YgdGhpcyBjaGFuZ2UgaW4gc3RhdGUKK3Rocm91Z2ggdGhlIGFjdGl2aXR5J3MgbGlmZWN5Y2xlIGNhbGxiYWNrIG1ldGhvZHMuCitUaGVyZSBhcmUgc2V2ZXJhbCBjYWxsYmFjayBtZXRob2RzIHRoYXQgYW4gYWN0aXZpdHkgbWlnaHQgcmVjZWl2ZSwgZHVlIHRvIGEgY2hhbmdlIGluIGl0cworc3RhdGUmbWRhc2g7d2hldGhlciB0aGUgc3lzdGVtIGlzIGNyZWF0aW5nIGl0LCBzdG9wcGluZyBpdCwgcmVzdW1pbmcgaXQsIG9yIGRlc3Ryb3lpbmcgaXQmbWRhc2g7YW5kCitlYWNoIGNhbGxiYWNrIHByb3ZpZGVzIHlvdSB0aGUgb3Bwb3J0dW5pdHkgdG8gcGVyZm9ybSBzcGVjaWZpYyB3b3JrIHRoYXQncworYXBwcm9wcmlhdGUgdG8gdGhhdCBzdGF0ZSBjaGFuZ2UuIEZvciBpbnN0YW5jZSwgd2hlbiBzdG9wcGVkLCB5b3VyIGFjdGl2aXR5IHNob3VsZCByZWxlYXNlIGFueQorbGFyZ2Ugb2JqZWN0cywgc3VjaCBhcyBuZXR3b3JrIG9yIGRhdGFiYXNlIGNvbm5lY3Rpb25zLiBXaGVuIHRoZSBhY3Rpdml0eSByZXN1bWVzLCB5b3UgY2FuCityZWFjcXVpcmUgdGhlIG5lY2Vzc2FyeSByZXNvdXJjZXMgYW5kIHJlc3VtZSBhY3Rpb25zIHRoYXQgd2VyZSBpbnRlcnJ1cHRlZC4gVGhlc2Ugc3RhdGUgdHJhbnNpdGlvbnMKK2FyZSBhbGwgcGFydCBvZiB0aGUgYWN0aXZpdHkgbGlmZWN5Y2xlLjwvcD4KKworPHA+VGhlIHJlc3Qgb2YgdGhpcyBkb2N1bWVudCBkaXNjdXNzZXMgdGhlIGJhc2ljcyBvZiBob3cgdG8gYnVpbGQgYW5kIHVzZSBhbiBhY3Rpdml0eSwKK2luY2x1ZGluZyBhIGNvbXBsZXRlIGRpc2N1c3Npb24gb2YgaG93IHRoZSBhY3Rpdml0eSBsaWZlY3ljbGUgd29ya3MsIHNvIHlvdSBjYW4gcHJvcGVybHkgbWFuYWdlCit0aGUgdHJhbnNpdGlvbiBiZXR3ZWVuIHZhcmlvdXMgYWN0aXZpdHkgc3RhdGVzLjwvcD4KKworCisKKzxoMiBpZD0iQ3JlYXRpbmciPkNyZWF0aW5nIGFuIEFjdGl2aXR5PC9oMj4KKworPHA+VG8gY3JlYXRlIGFuIGFjdGl2aXR5LCB5b3UgbXVzdCBjcmVhdGUgYSBzdWJjbGFzcyBvZiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHl9IChvcgorYW4gZXhpc3Rpbmcgc3ViY2xhc3Mgb2YgaXQpLiBJbiB5b3VyIHN1YmNsYXNzLCB5b3UgbmVlZCB0byBpbXBsZW1lbnQgY2FsbGJhY2sgbWV0aG9kcyB0aGF0IHRoZQorc3lzdGVtIGNhbGxzIHdoZW4gdGhlIGFjdGl2aXR5IHRyYW5zaXRpb25zIGJldHdlZW4gdmFyaW91cyBzdGF0ZXMgb2YgaXRzIGxpZmVjeWNsZSwgc3VjaCBhcyB3aGVuCit0aGUgYWN0aXZpdHkgaXMgYmVpbmcgY3JlYXRlZCwgc3RvcHBlZCwgcmVzdW1lZCwgb3IgZGVzdHJveWVkLiBUaGUgdHdvIG1vc3QgaW1wb3J0YW50IGNhbGxiYWNrCittZXRob2RzIGFyZTo8L3A+CisKKzxkbD4KKyAgPGR0PntAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkNyZWF0ZSBvbkNyZWF0ZSgpfTwvZHQ+CisgIDxkZD5Zb3UgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuIFRoZSBzeXN0ZW0gY2FsbHMgdGhpcyB3aGVuIGNyZWF0aW5nIHlvdXIKKyAgICBhY3Rpdml0eS4gV2l0aGluIHlvdXIgaW1wbGVtZW50YXRpb24sIHlvdSBzaG91bGQgaW5pdGlhbGl6ZSB0aGUgZXNzZW50aWFsIGNvbXBvbmVudHMgb2YgeW91cgorYWN0aXZpdHkuCisgICAgTW9zdCBpbXBvcnRhbnRseSwgdGhpcyBpcyB3aGVyZSB5b3UgbXVzdCBjYWxsIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNzZXRDb250ZW50VmlldworICAgIHNldENvbnRlbnRWaWV3KCl9IHRvIGRlZmluZSB0aGUgbGF5b3V0IGZvciB0aGUgYWN0aXZpdHkncyB1c2VyIGludGVyZmFjZS48L2RkPgorICA8ZHQ+e0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uUGF1c2Ugb25QYXVzZSgpfTwvZHQ+CisgIDxkZD5UaGUgc3lzdGVtIGNhbGxzIHRoaXMgbWV0aG9kIGFzIHRoZSBmaXJzdCBpbmRpY2F0aW9uIHRoYXQgdGhlIHVzZXIgaXMgbGVhdmluZyB5b3VyCithY3Rpdml0eSAodGhvdWdoIGl0IGRvZXMgbm90IGFsd2F5cyBtZWFuIHRoZSBhY3Rpdml0eSBpcyBiZWluZyBkZXN0cm95ZWQpLiBUaGlzIGlzIHVzdWFsbHkgd2hlcmUgeW91CitzaG91bGQgY29tbWl0IGFueSBjaGFuZ2VzIHRoYXQgc2hvdWxkIGJlIHBlcnNpc3RlZCBiZXlvbmQgdGhlIGN1cnJlbnQgdXNlciBzZXNzaW9uIChiZWNhdXNlCit0aGUgdXNlciBtaWdodCBub3QgY29tZSBiYWNrKS48L2RkPgorPC9kbD4KKworPHA+VGhlcmUgYXJlIHNldmVyYWwgb3RoZXIgbGlmZWN5Y2xlIGNhbGxiYWNrIG1ldGhvZHMgdGhhdCB5b3Ugc2hvdWxkIHVzZSBpbiBvcmRlciB0byBwcm92aWRlIGEKK2ZsdWlkIHVzZXIgZXhwZXJpZW5jZSBiZXR3ZWVuIGFjdGl2aXRpZXMgYW5kIGhhbmRsZSB1bmV4cGVjdGVkIGludGVydXB0aW9ucyB0aGF0IGNhdXNlIHlvdXIgYWN0aXZpdHkKK3RvIGJlIHN0b3BwZWQgYW5kIGV2ZW4gZGVzdHJveWVkLiBBbGwgb2YgdGhlIGxpZmVjeWNsZSBjYWxsYmFjayBtZXRob2RzIGFyZSBkaXNjdXNzZWQgbGF0ZXIsIGluCit0aGUgc2VjdGlvbiBhYm91dCA8YSBocmVmPSIjTGlmZWN5Y2xlIj5NYW5hZ2luZyB0aGUgQWN0aXZpdHkgTGlmZWN5Y2xlPC9hPi48L3A+CisKKworCis8aDMgaWQ9IlVJIj5JbXBsZW1lbnRpbmcgYSB1c2VyIGludGVyZmFjZTwvaDM+CisKKzxwPiBUaGUgdXNlciBpbnRlcmZhY2UgZm9yIGFuIGFjdGl2aXR5IGlzIHByb3ZpZGVkIGJ5IGEgaGllcmFyY2h5IG9mIHZpZXdzJm1kYXNoO29iamVjdHMgZGVyaXZlZAorZnJvbSB0aGUge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3fSBjbGFzcy4gIEVhY2ggdmlldyBjb250cm9scyBhIHBhcnRpY3VsYXIgcmVjdGFuZ3VsYXIgc3BhY2UKK3dpdGhpbiB0aGUgYWN0aXZpdHkncyB3aW5kb3cgYW5kIGNhbiByZXNwb25kIHRvIHVzZXIgaW50ZXJhY3Rpb24uIEZvciBleGFtcGxlLCBhIHZpZXcgbWlnaHQgYmUgYQorYnV0dG9uIHRoYXQgaW5pdGlhdGVzIGFuIGFjdGlvbiB3aGVuIHRoZSB1c2VyIHRvdWNoZXMgaXQuPC9wPgorCis8cD5BbmRyb2lkIHByb3ZpZGVzIGEgbnVtYmVyIG9mIHJlYWR5LW1hZGUgdmlld3MgdGhhdCB5b3UgY2FuIHVzZSB0byBkZXNpZ24gYW5kIG9yZ2FuaXplIHlvdXIKK2xheW91dC4gIldpZGdldHMiIGFyZSB2aWV3cyB0aGF0IHByb3ZpZGUgYSB2aXN1YWwgKGFuZCBpbnRlcmFjdGl2ZSkgZWxlbWVudHMgZm9yIHRoZSBzY3JlZW4sIHN1Y2gKK2FzIGEgYnV0dG9uLCB0ZXh0IGZpZWxkLCBjaGVja2JveCwgb3IganVzdCBhbiBpbWFnZS4gIkxheW91dHMiIGFyZSB2aWV3cyBkZXJpdmVkIGZyb20ge0BsaW5rCithbmRyb2lkLnZpZXcuVmlld0dyb3VwfSB0aGF0IHByb3ZpZGUgYSB1bmlxdWUgbGF5b3V0IG1vZGVsIGZvciBpdHMgY2hpbGQgdmlld3MsIHN1Y2ggYXMgYSBsaW5lYXIKK2xheW91dCwgYSBncmlkIGxheW91dCwgb3IgcmVsYXRpdmUgbGF5b3V0LiBZb3UgY2FuIGFsc28gc3ViY2xhc3MgdGhlIHtAbGluayBhbmRyb2lkLnZpZXcuVmlld30gYW5kCit7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXdHcm91cH0gY2xhc3NlcyAob3IgZXhpc3Rpbmcgc3ViY2xhc3NlcykgdG8gY3JlYXRlIHlvdXIgb3duIHdpZGdldHMgYW5kCitsYXlvdXRzIGFuZCBhcHBseSB0aGVtIHRvIHlvdXIgYWN0aXZpdHkgbGF5b3V0LjwvcD4KKworPHA+VGhlIG1vc3QgY29tbW9uIHdheSB0byBkZWZpbmUgYSBsYXlvdXQgdXNpbmcgdmlld3MgaXMgd2l0aCBhbiBYTUwgbGF5b3V0IGZpbGUgc2F2ZWQgaW4geW91cgorYXBwbGljYXRpb24gcmVzb3VyY2VzLiBUaGlzIHdheSwgeW91IGNhbiBtYWludGFpbiB0aGUgZGVzaWduIG9mIHlvdXIgdXNlciBpbnRlcmZhY2Ugc2VwYXJhdGVseSBmcm9tCit0aGUgc291cmNlIGNvZGUgdGhhdCBkZWZpbmVzIHRoZSBhY3Rpdml0eSdzIGJlaGF2aW9yLiBZb3UgY2FuIHNldCB0aGUgbGF5b3V0IGFzIHRoZSBVSSBmb3IgeW91cgorYWN0aXZpdHkgd2l0aCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjc2V0Q29udGVudFZpZXcoaW50KSBzZXRDb250ZW50VmlldygpfSwgcGFzc2luZyB0aGUKK3Jlc291cmNlIElEIGZvciB0aGUgbGF5b3V0LiBIb3dldmVyLCB5b3UgY2FuIGFsc28gY3JlYXRlIG5ldyB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXd9cyBpbiB5b3VyCithY3Rpdml0eSBjb2RlIGFuZCBidWlsZCBhIHZpZXcgaGllcmFyY2h5IGJ5IGluc2VydGluZyBuZXcge0BsaW5rCithbmRyb2lkLnZpZXcuVmlld31zIGludG8gYSB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXdHcm91cH0sIHRoZW4gdXNlIHRoYXQgbGF5b3V0IGJ5IHBhc3NpbmcgdGhlIHJvb3QKK3tAbGluayBhbmRyb2lkLnZpZXcuVmlld0dyb3VwfSB0byB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjc2V0Q29udGVudFZpZXcoVmlldykKK3NldENvbnRlbnRWaWV3KCl9LjwvcD4KKworPHA+Rm9yIGluZm9ybWF0aW9uIGFib3V0IGNyZWF0aW5nIGEgdXNlciBpbnRlcmZhY2UsIHNlZSB0aGUgPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdWkvaW5kZXguaHRtbCI+VXNlciBJbnRlcmZhY2U8L2E+IGRvY3VtZW50YXRpb24uPC9wPgorCisKKworPGgzIGlkPSJEZWNsYXJpbmciPkRlY2xhcmluZyB0aGUgYWN0aXZpdHkgaW4gdGhlIG1hbmlmZXN0PC9oMz4KKworPHA+WW91IG11c3QgZGVjbGFyZSB5b3VyIGFjdGl2aXR5IGluIHRoZSBtYW5pZmVzdCBmaWxlIGluIG9yZGVyIGZvciBpdCB0bworYmUgYWNjZXNzaWJsZSB0byB0aGUgc3lzdGVtLiBUbyBkZWNhbGFyZSB5b3VyIGFjdGl2aXR5LCBvcGVuIHlvdXIgbWFuaWZlc3QgZmlsZSBhbmQgYWRkIGFuIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCI+e0Bjb2RlICZsdDthY3Rpdml0eSZndDt9PC9hPiBlbGVtZW50CithcyBhIGNoaWxkIG9mIHRoZSA8YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9hcHBsaWNhdGlvbi1lbGVtZW50Lmh0bWwiPntAY29kZSAmbHQ7YXBwbGljYXRpb24mZ3Q7fTwvYT4KK2VsZW1lbnQuIEZvciBleGFtcGxlOjwvcD4KKworPHByZT4KKyZsdDttYW5pZmVzdCAuLi4gJmd0OworICAmbHQ7YXBwbGljYXRpb24gLi4uICZndDsKKyAgICAgICZsdDthY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5FeGFtcGxlQWN0aXZpdHkiIC8mZ3Q7CisgICAgICAuLi4KKyAgJmx0Oy9hcHBsaWNhdGlvbiAuLi4gJmd0OworICAuLi4KKyZsdDsvbWFuaWZlc3QgJmd0OworPC9wcmU+CisKKzxwPlRoZXJlIGFyZSBzZXZlcmFsIG90aGVyIGF0dHJpYnV0ZXMgdGhhdCB5b3UgY2FuIGluY2x1ZGUgaW4gdGhpcyBlbGVtZW50LCB0byBkZWZpbmUgcHJvcGVydGllcworc3VjaCBhcyB0aGUgbGFiZWwgZm9yIHRoZSBhY3Rpdml0eSwgYW4gaWNvbiBmb3IgdGhlIGFjdGl2aXR5LCBvciBhIHRoZW1lIHRvIHN0eWxlIHRoZSBhY3Rpdml0eSdzCitVSS4gU2VlIHRoZSA8YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9hY3Rpdml0eS1lbGVtZW50Lmh0bWwiPntAY29kZSAmbHQ7YWN0aXZpdHkmZ3Q7fTwvYT4gZWxlbWVudAorcmVmZXJlbmNlIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSBhdHRyaWJ1dGVzLjwvcD4KKworCis8aDQ+VXNpbmcgaW50ZW50IGZpbHRlcnM8L2g0PgorCis8cD5BbiA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCI+e0Bjb2RlCismbHQ7YWN0aXZpdHkmZ3Q7fTwvYT4gZWxlbWVudCBjYW4gYWxzbyBzcGVjaWZ5IHZhcmlvdXMgaW50ZW50IGZpbHRlcnMmbWRhc2g7dXNpbmcgdGhlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2ludGVudC1maWx0ZXItZWxlbWVudC5odG1sIj57QGNvZGUKKyZsdDtpbnRlbnQtZmlsdGVyJmd0O308L2E+IGVsZW1lbnQmbWRhc2g7aW4gb3JkZXIgdG8gZGVjbGFyZSBob3cgb3RoZXIgYXBwbGljYXRpb24gY29tcG9uZW50cyBtYXkKK2FjdGl2YXRlIGl0LjwvcD4KKworPHA+V2hlbiB5b3UgY3JlYXRlIGEgbmV3IGFwcGxpY2F0aW9uIHVzaW5nIHRoZSBBbmRyb2lkIFNESyB0b29scywgdGhlIHN0dWIgYWN0aXZpdHkKK3RoYXQncyBjcmVhdGVkIGZvciB5b3UgYXV0b21hdGljYWxseSBpbmNsdWRlcyBhbiBpbnRlbnQgZmlsdGVyIHRoYXQgZGVjbGFyZXMgdGhlIGFjdGl2aXR5CityZXNwb25kcyB0byB0aGUgIm1haW4iIGFjdGlvbiBhbmQgc2hvdWxkIGJlIHBsYWNlZCBpbiB0aGUgImxhdW5jaGVyIiBjYXRlZ29yeS4gVGhlIGludGVudCBmaWx0ZXIKK2xvb2tzIGxpa2UgdGhpczo8L3A+CisKKzxwcmU+CismbHQ7YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuRXhhbXBsZUFjdGl2aXR5IiBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9hcHBfaWNvbiImZ3Q7CisgICAgJmx0O2ludGVudC1maWx0ZXImZ3Q7CisgICAgICAgICZsdDthY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLyZndDsKKyAgICAgICAgJmx0O2NhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8mZ3Q7CisgICAgJmx0Oy9pbnRlbnQtZmlsdGVyJmd0OworJmx0Oy9hY3Rpdml0eSZndDsKKzwvcHJlPgorCis8cD5UaGUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9hY3Rpb24tZWxlbWVudC5odG1sIj57QGNvZGUKKyZsdDthY3Rpb24mZ3Q7fTwvYT4gZWxlbWVudCBzcGVjaWZpZXMgdGhhdCB0aGlzIGlzIHRoZSAibWFpbiIgZW50cnkgcG9pbnQgdG8gdGhlIGFwcGxpY2F0aW9uLiBUaGUgPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvY2F0ZWdvcnktZWxlbWVudC5odG1sIj57QGNvZGUKKyZsdDtjYXRlZ29yeSZndDt9PC9hPiBlbGVtZW50IHNwZWNpZmllcyB0aGF0IHRoaXMgYWN0aXZpdHkgc2hvdWxkIGJlIGxpc3RlZCBpbiB0aGUKK3N5c3RlbSdzIGFwcGxpY2F0aW9uIGxhdW5jaGVyICh0byBhbGxvdyB1c2VycyB0byBsYXVuY2ggdGhpcyBhY3Rpdml0eSkuPC9wPgorCis8cD5JZiB5b3UgaW50ZW5kIGZvciB5b3VyIGFwcGxpY2F0aW9uIHRvIGJlIHNlbGYtY29udGFpbmVkIGFuZCBub3QgYWxsb3cgb3RoZXIgYXBwbGljYXRpb25zIHRvCithY3RpdmF0ZSBpdHMgYWN0aXZpdGllcywgdGhlbiB5b3UgZG9uJ3QgbmVlZCBhbnkgb3RoZXIgaW50ZW50IGZpbHRlcnMuIE9ubHkgb25lIGFjdGl2aXR5IHNob3VsZAoraGF2ZSB0aGUgIm1haW4iIGFjdGlvbiBhbmQgImxhdW5jaGVyIiBjYXRlZ29yeSwgYXMgaW4gdGhlIHByZXZpb3VzIGV4YW1wbGUuIEFjdGl2aXRpZXMgdGhhdAoreW91IGRvbid0IHdhbnQgdG8gbWFrZSBhdmFpbGFibGUgdG8gb3RoZXIgYXBwbGljYXRpb25zIHNob3VsZCBoYXZlIG5vIGludGVudCBmaWx0ZXJzIGFuZCB5b3UgY2FuCitzdGFydCB0aGVtIHlvdXJzZWxmIHVzaW5nIGV4cGxpY2l0IGludGVudHMgKGFzIGRpc2N1c3NlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb24pLjwvcD4KKworPHA+SG93ZXZlciwgaWYgeW91IHdhbnQgeW91ciBhY3Rpdml0eSB0byByZXNwb25kIHRvIGltcGxpY2l0IGludGVudHMgdGhhdCBhcmUgZGVsaXZlcmVkIGZyb20KK290aGVyIGFwcGxpY2F0aW9ucyAoYW5kIHlvdXIgb3duKSwgdGhlbiB5b3UgbXVzdCBkZWZpbmUgYWRkaXRpb25hbCBpbnRlbnQgZmlsdGVycyBmb3IgeW91cgorYWN0aXZpdHkuIEZvciBlYWNoIHR5cGUgb2YgaW50ZW50IHRvIHdoaWNoIHlvdSB3YW50IHRvIHJlc3BvbmQsIHlvdSBtdXN0IGluY2x1ZGUgYW4gPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvaW50ZW50LWZpbHRlci1lbGVtZW50Lmh0bWwiPntAY29kZQorJmx0O2ludGVudC1maWx0ZXImZ3Q7fTwvYT4gdGhhdCBpbmNsdWRlcyBhbgorPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9hY3Rpb24tZWxlbWVudC5odG1sIj57QGNvZGUKKyZsdDthY3Rpb24mZ3Q7fTwvYT4gZWxlbWVudCBhbmQsIG9wdGlvbmFsbHksIGEgPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvY2F0ZWdvcnktZWxlbWVudC5odG1sIj57QGNvZGUKKyZsdDtjYXRlZ29yeSZndDt9PC9hPiBlbGVtZW50IGFuZC9vciBhIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2RhdGEtZWxlbWVudC5odG1sIj57QGNvZGUKKyZsdDtkYXRhJmd0O308L2E+IGVsZW1lbnQuIFRoZXNlIGVsZW1lbnRzIHNwZWNpZnkgdGhlIHR5cGUgb2YgaW50ZW50IHRvIHdoaWNoIHlvdXIgYWN0aXZpdHkgY2FuCityZXNwb25kLjwvcD4KKworPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHlvdXIgYWN0aXZpdGllcyBjYW4gcmVzcG9uZCB0byBpbnRlbnRzLCBzZWUgdGhlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2ludGVudHMvaW50ZW50cy1maWx0ZXJzLmh0bWwiPkludGVudHMgYW5kIEludGVudCBGaWx0ZXJzPC9hPgorZG9jdW1lbnQuPC9wPgorCisKKworPGgyIGlkPSJTdGFydGluZ0FuQWN0aXZpdHkiPlN0YXJ0aW5nIGFuIEFjdGl2aXR5PC9oMj4KKworPHA+WW91IGNhbiBzdGFydCBhbm90aGVyIGFjdGl2aXR5IGJ5IGNhbGxpbmcge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I3N0YXJ0QWN0aXZpdHkKKyAgc3RhcnRBY3Rpdml0eSgpfSwgcGFzc2luZyBpdCBhbiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudH0gdGhhdCBkZXNjcmliZXMgdGhlIGFjdGl2aXR5IHlvdQorICB3YW50IHRvIHN0YXJ0LiBUaGUgaW50ZW50IHNwZWNpZmllcyBlaXRoZXIgdGhlIGV4YWN0IGFjdGl2aXR5IHlvdSB3YW50IHRvIHN0YXJ0IG9yIGRlc2NyaWJlcyB0aGUKKyAgdHlwZSBvZiBhY3Rpb24geW91IHdhbnQgdG8gcGVyZm9ybSAoYW5kIHRoZSBzeXN0ZW0gc2VsZWN0cyB0aGUgYXBwcm9wcmlhdGUgYWN0aXZpdHkgZm9yIHlvdSwKK3doaWNoCisgIGNhbiBldmVuIGJlIGZyb20gYSBkaWZmZXJlbnQgYXBwbGljYXRpb24pLiBBbiBpbnRlbnQgY2FuIGFsc28gY2Fycnkgc21hbGwgYW1vdW50cyBvZiBkYXRhIHRvIGJlCisgIHVzZWQgYnkgdGhlIGFjdGl2aXR5IHRoYXQgaXMgc3RhcnRlZC48L3A+CisKKzxwPldoZW4gd29ya2luZyB3aXRoaW4geW91ciBvd24gYXBwbGljYXRpb24sIHlvdSdsbCBvZnRlbiBuZWVkIHRvIHNpbXBseSBsYXVuY2ggYSBrbm93biBhY3Rpdml0eS4KKyBZb3UgY2FuIGRvIHNvIGJ5IGNyZWF0aW5nIGFuIGludGVudCB0aGF0IGV4cGxpY2l0bHkgZGVmaW5lcyB0aGUgYWN0aXZpdHkgeW91IHdhbnQgdG8gc3RhcnQsCit1c2luZyB0aGUgY2xhc3MgbmFtZS4gRm9yIGV4YW1wbGUsIGhlcmUncyBob3cgb25lIGFjdGl2aXR5IHN0YXJ0cyBhbm90aGVyIGFjdGl2aXR5IG5hbWVkIHtAY29kZQorU2lnbkluQWN0aXZpdHl9OjwvcD4KKworPHByZT4KK0ludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KHRoaXMsIFNpZ25JbkFjdGl2aXR5LmNsYXNzKTsKK3N0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKzwvcHJlPgorCis8cD5Ib3dldmVyLCB5b3VyIGFwcGxpY2F0aW9uIG1pZ2h0IGFsc28gd2FudCB0byBwZXJmb3JtIHNvbWUgYWN0aW9uLCBzdWNoIGFzIHNlbmQgYW4gZW1haWwsIHRleHQKKyAgbWVzc2FnZSwgb3Igc3RhdHVzIHVwZGF0ZSwgdXNpbmcgZGF0YSBmcm9tIHlvdXIgYWN0aXZpdHkuIEluIHRoaXMgY2FzZSwgeW91ciBhcHBsaWNhdGlvbiBtaWdodAorIG5vdCBoYXZlIGl0cyBvd24gYWN0aXZpdGllcyB0byBwZXJmb3JtIHN1Y2ggYWN0aW9ucywgc28geW91IGNhbiBpbnN0ZWFkIGxldmVyYWdlIHRoZSBhY3Rpdml0aWVzCisgIHByb3ZpZGVkIGJ5IG90aGVyIGFwcGxpY2F0aW9ucyBvbiB0aGUgZGV2aWNlLCB3aGljaCBjYW4gcGVyZm9ybSB0aGUgYWN0aW9ucyBmb3IgeW91LiBUaGlzIGlzIHdoZXJlCitpbnRlbnRzIGFyZSByZWFsbHkgdmFsdWFibGUmbWRhc2g7eW91IGNhbiBjcmVhdGUgYW4gaW50ZW50IHRoYXQgZGVzY3JpYmVzIGFuIGFjdGlvbiB5b3Ugd2FudCB0bworcGVyZm9ybSBhbmQgdGhlIHN5c3RlbQorICBsYXVuY2hlcyB0aGUgYXBwcm9wcmlhdGUgYWN0aXZpdHkgZnJvbSBhbm90aGVyIGFwcGxpY2F0aW9uLiBJZiB0aGVyZSBhcmUKKyAgbXVsdGlwbGUgYWN0aXZpdGllcyB0aGF0IGNhbiBoYW5kbGUgdGhlIGludGVudCwgdGhlbiB0aGUgdXNlciBjYW4gc2VsZWN0IHdoaWNoIG9uZSB0byB1c2UuIEZvcgorICBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBhbGxvdyB0aGUgdXNlciB0byBzZW5kIGFuIGVtYWlsIG1lc3NhZ2UsIHlvdSBjYW4gY3JlYXRlIHRoZQorICBmb2xsb3dpbmcgaW50ZW50OjwvcD4KKworPHByZT4KK0ludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fU0VORCk7CitpbnRlbnQucHV0RXh0cmEoSW50ZW50LkVYVFJBX0VNQUlMLCByZWNpcGllbnRBcnJheSk7CitzdGFydEFjdGl2aXR5KGludGVudCk7Cis8L3ByZT4KKworPHA+VGhlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50I0VYVFJBX0VNQUlMfSBleHRyYSBhZGRlZCB0byB0aGUgaW50ZW50IGlzIGEgc3RyaW5nIGFycmF5IG9mCisgIGVtYWlsIGFkZHJlc3NlcyB0byB3aGljaCB0aGUgZW1haWwgc2hvdWxkIGJlIHNlbnQuIFdoZW4gYW4gZW1haWwgYXBwbGljYXRpb24gcmVzcG9uZHMgdG8gdGhpcworICBpbnRlbnQsIGl0IHJlYWRzIHRoZSBzdHJpbmcgYXJyYXkgcHJvdmlkZWQgaW4gdGhlIGV4dHJhIGFuZCBwbGFjZXMgdGhlbSBpbiB0aGUgInRvIiBmaWVsZCBvZiB0aGUKKyAgZW1haWwgY29tcG9zaXRpb24gZm9ybS4gSW4gdGhpcyBzaXR1YXRpb24sIHRoZSBlbWFpbCBhcHBsaWNhdGlvbidzIGFjdGl2aXR5IHN0YXJ0cyBhbmQgd2hlbiB0aGUKKyAgdXNlciBpcyBkb25lLCB5b3VyIGFjdGl2aXR5IHJlc3VtZXMuPC9wPgorCisKKworCis8aDMgaWQ9IlN0YXJ0aW5nQW5BY3Rpdml0eUZvclJlc3VsdCI+U3RhcnRpbmcgYW4gYWN0aXZpdHkgZm9yIGEgcmVzdWx0PC9oMz4KKworPHA+U29tZXRpbWVzLCB5b3UgbWlnaHQgd2FudCB0byByZWNlaXZlIGEgcmVzdWx0IGZyb20gdGhlIGFjdGl2aXR5IHRoYXQgeW91IHN0YXJ0LiBJbiB0aGF0IGNhc2UsCisgIHN0YXJ0IHRoZSBhY3Rpdml0eSBieSBjYWxsaW5nIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0CisgIHN0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoKX0gKGluc3RlYWQgb2Yge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I3N0YXJ0QWN0aXZpdHkKKyAgc3RhcnRBY3Rpdml0eSgpfSkuIFRvIHRoZW4gcmVjZWl2ZSB0aGUgcmVzdWx0IGZyb20gdGhlIHN1YnNlcXVlbnQKK2FjdGl2aXR5LCBpbXBsZW1lbnQgdGhlIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkFjdGl2aXR5UmVzdWx0IG9uQWN0aXZpdHlSZXN1bHQoKX0gY2FsbGJhY2sKKyAgbWV0aG9kLiBXaGVuIHRoZSBzdWJzZXF1ZW50IGFjdGl2aXR5IGlzIGRvbmUsIGl0IHJldHVybnMgYSByZXN1bHQgaW4gYW4ge0BsaW5rCithbmRyb2lkLmNvbnRlbnQuSW50ZW50fSB0byB5b3VyIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkFjdGl2aXR5UmVzdWx0IG9uQWN0aXZpdHlSZXN1bHQoKX0KK21ldGhvZC48L3A+CisKKzxwPkZvciBleGFtcGxlLCBwZXJoYXBzIHlvdSB3YW50IHRoZSB1c2VyIHRvIHBpY2sgb25lIG9mIHRoZWlyIGNvbnRhY3RzLCBzbyB5b3VyIGFjdGl2aXR5IGNhbgorZG8gc29tZXRoaW5nIHdpdGggdGhlIGluZm9ybWF0aW9uIGluIHRoYXQgY29udGFjdC4gSGVyZSdzIGhvdyB5b3UgY2FuIGNyZWF0ZSBzdWNoIGFuIGludGVudCBhbmQKK2hhbmRsZSB0aGUgcmVzdWx0OjwvcD4KKworPHByZT4KK3ByaXZhdGUgdm9pZCBwaWNrQ29udGFjdCgpIHsKKyAgICAvLyBDcmVhdGUgYW4gaW50ZW50IHRvICJwaWNrIiBhIGNvbnRhY3QsIGFzIGRlZmluZWQgYnkgdGhlIGNvbnRlbnQgcHJvdmlkZXIgVVJJCisgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9QSUNLLCBDb250YWN0cy5DT05URU5UX1VSSSk7CisgICAgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChpbnRlbnQsIFBJQ0tfQ09OVEFDVF9SRVFVRVNUKTsKK30KKworJiM2NDtPdmVycmlkZQorcHJvdGVjdGVkIHZvaWQgb25BY3Rpdml0eVJlc3VsdChpbnQgcmVxdWVzdENvZGUsIGludCByZXN1bHRDb2RlLCBJbnRlbnQgZGF0YSkgeworICAgIC8vIElmIHRoZSByZXF1ZXN0IHdlbnQgd2VsbCAoT0spIGFuZCB0aGUgcmVxdWVzdCB3YXMgUElDS19DT05UQUNUX1JFUVVFU1QKKyAgICBpZiAocmVzdWx0Q29kZSA9PSBBY3Rpdml0eS5SRVNVTFRfT0sgJmFtcDsmYW1wOyByZXF1ZXN0Q29kZSA9PSBQSUNLX0NPTlRBQ1RfUkVRVUVTVCkgeworICAgICAgICAvLyBQZXJmb3JtIGEgcXVlcnkgdG8gdGhlIGNvbnRhY3QncyBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgY29udGFjdCdzIG5hbWUKKyAgICAgICAgQ3Vyc29yIGN1cnNvciA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KGRhdGEuZ2V0RGF0YSgpLAorICAgICAgICBuZXcgU3RyaW5nW10ge0NvbnRhY3RzLkRJU1BMQVlfTkFNRX0sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBpZiAoY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsgLy8gVHJ1ZSBpZiB0aGUgY3Vyc29yIGlzIG5vdCBlbXB0eQorICAgICAgICAgICAgaW50IGNvbHVtbkluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KENvbnRhY3RzLkRJU1BMQVlfTkFNRSk7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGN1cnNvci5nZXRTdHJpbmcoY29sdW1uSW5kZXgpOworICAgICAgICAgICAgLy8gRG8gc29tZXRoaW5nIHdpdGggdGhlIHNlbGVjdGVkIGNvbnRhY3QncyBuYW1lLi4uCisgICAgICAgIH0KKyAgICB9Cit9Cis8L3ByZT4KKworPHA+VGhpcyBleGFtcGxlIHNob3dzIHRoZSBiYXNpYyBsb2dpYyB5b3Ugc2hvdWxkIHVzZSBpbiB5b3VyIHtAbGluaworYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25BY3Rpdml0eVJlc3VsdCBvbkFjdGl2aXR5UmVzdWx0KCl9IG1ldGhvZCBpbiBvcmRlciB0byBoYW5kbGUgYW4KK2FjdGl2aXR5IHJlc3VsdC4gVGhlIGZpcnN0IGNvbmRpdGlvbiBjaGVja3Mgd2hldGhlciB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bCZtZGFzaDtpZiBpdCB3YXMsIHRoZW4KK3RoZSB7QGNvZGUgcmVzdWx0Q29kZX0gd2lsbCBiZSB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjUkVTVUxUX09LfSZtZGFzaDthbmQgd2hldGhlciB0aGUgcmVxdWVzdAordG8gd2hpY2ggdGhpcyByZXN1bHQgaXMgcmVzcG9uZGluZyBpcyBrbm93biZtZGFzaDtpbiB0aGlzIGNhc2UsIHRoZSB7QGNvZGUgcmVxdWVzdENvZGV9IG1hdGNoZXMgdGhlCitzZWNvbmQgcGFyYW1ldGVyIHNlbnQgd2l0aCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjc3RhcnRBY3Rpdml0eUZvclJlc3VsdAorc3RhcnRBY3Rpdml0eUZvclJlc3VsdCgpfS4gRnJvbSB0aGVyZSwgdGhlIGNvZGUgaGFuZGxlcyB0aGUgYWN0aXZpdHkgcmVzdWx0IGJ5IHF1ZXJ5aW5nIHRoZQorZGF0YSByZXR1cm5lZCBpbiBhbiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudH0gKHRoZSB7QGNvZGUgZGF0YX0gcGFyYW1ldGVyKS48L3A+CisKKzxwPldoYXQgaGFwcGVucyBpcywgYSB7QGxpbmsKK2FuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXJ9IHBlcmZvcm1zIGEgcXVlcnkgYWdhaW5zdCBhIGNvbnRlbnQgcHJvdmlkZXIsIHdoaWNoIHJldHVybnMgYQore0BsaW5rIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yfSB0aGF0IGFsbG93cyB0aGUgcXVlcmllZCBkYXRhIHRvIGJlIHJlYWQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKK3RoZSA8YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9wcm92aWRlcnMvY29udGVudC1wcm92aWRlcnMuaHRtbCI+Q29udGVudCBQcm92aWRlcnM8L2E+IGRvY3VtZW50LjwvcD4KKworPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgaW50ZW50cywgc2VlIHRoZSA8YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9pbnRlbnRzL2ludGVudHMtZmlsdGVycy5odG1sIj5JbnRlbnRzIGFuZCBJbnRlbnQKK0ZpbHRlcnM8L2E+IGRvY3VtZW50LjwvcD4KKworCis8aDIgaWQ9IlNodXR0aW5nRG93biI+U2h1dHRpbmcgRG93biBhbiBBY3Rpdml0eTwvaDI+CisKKzxwPllvdSBjYW4gc2h1dCBkb3duIGFuIGFjdGl2aXR5IGJ5IGNhbGxpbmcgaXRzIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNmaW5pc2gKK2ZpbmlzaCgpfSBtZXRob2QuIFlvdSBjYW4gYWxzbyBzaHV0IGRvd24gYSBzZXBhcmF0ZSBhY3Rpdml0eSB0aGF0IHlvdSBwcmV2aW91c2x5IHN0YXJ0ZWQgYnkgY2FsbGluZwore0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I2ZpbmlzaEFjdGl2aXR5IGZpbmlzaEFjdGl2aXR5KCl9LjwvcD4KKworPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSW4gbW9zdCBjYXNlcywgeW91IHNob3VsZCBub3QgZXhwbGljaXRseSBmaW5pc2ggYW4gYWN0aXZpdHkKK3VzaW5nIHRoZXNlIG1ldGhvZHMuIEFzIGRpc2N1c3NlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb24gYWJvdXQgdGhlIGFjdGl2aXR5IGxpZmVjeWNsZSwgdGhlCitBbmRyb2lkIHN5c3RlbSBtYW5hZ2VzIHRoZSBsaWZlIG9mIGFuIGFjdGl2aXR5IGZvciB5b3UsIHNvIHlvdSBkbyBub3QgbmVlZCB0byBmaW5pc2ggeW91ciBvd24KK2FjdGl2aXRpZXMuIENhbGxpbmcgdGhlc2UgbWV0aG9kcyBjb3VsZCBhZHZlcnNlbHkgYWZmZWN0IHRoZSBleHBlY3RlZCB1c2VyCitleHBlcmllbmNlIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4geW91IGFic29sdXRlbHkgZG8gbm90IHdhbnQgdGhlIHVzZXIgdG8gcmV0dXJuIHRvIHRoaXMKK2luc3RhbmNlIG9mIHRoZSBhY3Rpdml0eS48L3A+CisKKworPGgyIGlkPSJMaWZlY3ljbGUiPk1hbmFnaW5nIHRoZSBBY3Rpdml0eSBMaWZlY3ljbGU8L2gyPgorCis8cD5NYW5hZ2luZyB0aGUgbGlmZWN5Y2xlIG9mIHlvdXIgYWN0aXZpdGllcyBieSBpbXBsZW1lbnRpbmcgY2FsbGJhY2sgbWV0aG9kcyBpcworY3J1Y2lhbCB0byBkZXZlbG9waW5nIGEgc3Ryb25nCithbmQgZmxleGlibGUgYXBwbGljYXRpb24uIFRoZSBsaWZlY3ljbGUgb2YgYW4gYWN0aXZpdHkgaXMgZGlyZWN0bHkgYWZmZWN0ZWQgYnkgaXRzIGFzc29jaWF0aW9uIHdpdGgKK290aGVyIGFjdGl2aXRpZXMsIGl0cyB0YXNrIGFuZCBiYWNrIHN0YWNrLjwvcD4KKworPHA+QW4gYWN0aXZpdHkgY2FuIGV4aXN0IGluIGVzc2VudGlhbGx5IHRocmVlIHN0YXRlczo8L3A+CisKKzxkbD4KKyAgPGR0PjxpPlJlc3VtZWQ8L2k+PC9kdD4KKyAgICA8ZGQ+VGhlIGFjdGl2aXR5IGlzIGluIHRoZSBmb3JlZ3JvdW5kIG9mIHRoZSBzY3JlZW4gYW5kIGhhcyB1c2VyIGZvY3VzLiAoVGhpcyBzdGF0ZSBpcworYWxzbyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgInJ1bm5pbmciLik8L2RkPgorCisgIDxkdD48aT5QYXVzZWQ8L2k+PC9kdD4KKyAgICA8ZGQ+QW5vdGhlciBhY3Rpdml0eSBpcyBpbiB0aGUgZm9yZWdyb3VuZCBhbmQgaGFzIGZvY3VzLCBidXQgdGhpcyBvbmUgaXMgc3RpbGwgdmlzaWJsZS4gVGhhdCBpcywKK2Fub3RoZXIgYWN0aXZpdHkgaXMgdmlzaWJsZSBvbiB0b3Agb2YgdGhpcyBvbmUgYW5kIHRoYXQgYWN0aXZpdHkgaXMgcGFydGlhbGx5IHRyYW5zcGFyZW50IG9yIGRvZXNuJ3QKK2NvdmVyIHRoZSBlbnRpcmUgc2NyZWVuLiBBIHBhdXNlZCBhY3Rpdml0eSBpcyBjb21wbGV0ZWx5IGFsaXZlICh0aGUge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5fQorb2JqZWN0IGlzIHJldGFpbmVkIGluIG1lbW9yeSwgaXQgbWFpbnRhaW5zIGFsbCBzdGF0ZSBhbmQgbWVtYmVyIGluZm9ybWF0aW9uLCBhbmQgcmVtYWlucyBhdHRhY2hlZCB0bwordGhlIHdpbmRvdyBtYW5hZ2VyKSwgYnV0IGNhbiBiZSBraWxsZWQgYnkgdGhlIHN5c3RlbSBpbiBleHRyZW1lbHkgbG93IG1lbW9yeSBzaXR1YXRpb25zLjwvZGQ+CisKKyAgPGR0PjxpPlN0b3BwZWQ8L2k+PC9kdD4KKyAgICA8ZGQ+VGhlIGFjdGl2aXR5IGlzIGNvbXBsZXRlbHkgb2JzY3VyZWQgYnkgYW5vdGhlciBhY3Rpdml0eSAodGhlIGFjdGl2aXR5IGlzIG5vdyBpbiB0aGUKKyJiYWNrZ3JvdW5kIikuIEEgc3RvcHBlZCBhY3Rpdml0eSBpcyBhbHNvIHN0aWxsIGFsaXZlICh0aGUge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5fQorb2JqZWN0IGlzIHJldGFpbmVkIGluIG1lbW9yeSwgaXQgbWFpbnRhaW5zIGFsbCBzdGF0ZSBhbmQgbWVtYmVyIGluZm9ybWF0aW9uLCBidXQgaXMgPGVtPm5vdDwvZW0+CithdHRhY2hlZCB0byB0aGUgd2luZG93IG1hbmFnZXIpLiBIb3dldmVyLCBpdCBpcyBubyBsb25nZXIgdmlzaWJsZSB0byB0aGUgdXNlciBhbmQgaXQKK2NhbiBiZSBraWxsZWQgYnkgdGhlIHN5c3RlbSB3aGVuIG1lbW9yeSBpcyBuZWVkZWQgZWxzZXdoZXJlLjwvZGQ+Cis8L2RsPgorCis8cD5JZiBhbiBhY3Rpdml0eSBpcyBwYXVzZWQgb3Igc3RvcHBlZCwgdGhlIHN5c3RlbSBjYW4gZHJvcCBpdCBmcm9tIG1lbW9yeSBlaXRoZXIgYnkgYXNraW5nIGl0IHRvCitmaW5pc2ggKGNhbGxpbmcgaXRzIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNmaW5pc2ggZmluaXNoKCl9IG1ldGhvZCksIG9yIHNpbXBseSBraWxsaW5nIGl0cworcHJvY2Vzcy4gIFdoZW4gdGhlIGFjdGl2aXR5IGlzIG9wZW5lZCBhZ2FpbiAoYWZ0ZXIgYmVpbmcgZmluaXNoZWQgb3Iga2lsbGVkKSwgaXQgbXVzdCBiZSBjcmVhdGVkIGFsbAorb3Zlci48L3A+CisKKworCis8aDMgaWQ9IkltcGxlbWVudGluZ0xpZmVjeWNsZUNhbGxiYWNrcyI+SW1wbGVtZW50aW5nIHRoZSBsaWZlY3ljbGUgY2FsbGJhY2tzPC9oMz4KKworPHA+V2hlbiBhbiBhY3Rpdml0eSB0cmFuc2l0aW9ucyBpbnRvIGFuZCBvdXQgb2YgdGhlIGRpZmZlcmVudCBzdGF0ZXMgZGVzY3JpYmVkIGFib3ZlLCBpdCBpcyBub3RpZmllZAordGhyb3VnaCB2YXJpb3VzIGNhbGxiYWNrIG1ldGhvZHMuIEFsbCBvZiB0aGUgY2FsbGJhY2sgbWV0aG9kcyBhcmUgaG9va3MgdGhhdCB5b3UKK2NhbiBvdmVycmlkZSB0byBkbyBhcHByb3ByaWF0ZSB3b3JrIHdoZW4gdGhlIHN0YXRlIG9mIHlvdXIgYWN0aXZpdHkgY2hhbmdlcy4gVGhlIGZvbGxvd2luZyBza2VsZXRvbgorYWN0aXZpdHkgaW5jbHVkZXMgZWFjaCBvZiB0aGUgZnVuZGFtZW50YWwgbGlmZWN5Y2xlIG1ldGhvZHM6PC9wPgorCisKKzxwcmU+CitwdWJsaWMgY2xhc3MgRXhhbXBsZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgICYjNjQ7T3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25DcmVhdGUgb25DcmVhdGV9KEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgLy8gVGhlIGFjdGl2aXR5IGlzIGJlaW5nIGNyZWF0ZWQuCisgICAgfQorICAgICYjNjQ7T3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TdGFydCBvblN0YXJ0KCl9IHsKKyAgICAgICAgc3VwZXIub25TdGFydCgpOworICAgICAgICAvLyBUaGUgYWN0aXZpdHkgaXMgYWJvdXQgdG8gYmVjb21lIHZpc2libGUuCisgICAgfQorICAgICYjNjQ7T3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25SZXN1bWUgb25SZXN1bWUoKX0geworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICAvLyBUaGUgYWN0aXZpdHkgaGFzIGJlY29tZSB2aXNpYmxlIChpdCBpcyBub3cgInJlc3VtZWQiKS4KKyAgICB9CisgICAgJiM2NDtPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblBhdXNlIG9uUGF1c2UoKX0geworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgICAgIC8vIEFub3RoZXIgYWN0aXZpdHkgaXMgdGFraW5nIGZvY3VzICh0aGlzIGFjdGl2aXR5IGlzIGFib3V0IHRvIGJlICJwYXVzZWQiKS4KKyAgICB9CisgICAgJiM2NDtPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblN0b3Agb25TdG9wKCl9IHsKKyAgICAgICAgc3VwZXIub25TdG9wKCk7CisgICAgICAgIC8vIFRoZSBhY3Rpdml0eSBpcyBubyBsb25nZXIgdmlzaWJsZSAoaXQgaXMgbm93ICJzdG9wcGVkIikKKyAgICB9CisgICAgJiM2NDtPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkRlc3Ryb3kgb25EZXN0cm95KCl9IHsKKyAgICAgICAgc3VwZXIub25EZXN0cm95KCk7CisgICAgICAgIC8vIFRoZSBhY3Rpdml0eSBpcyBhYm91dCB0byBiZSBkZXN0cm95ZWQuCisgICAgfQorfQorPC9wcmU+CisKKzxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFlvdXIgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgbGlmZWN5Y2xlIG1ldGhvZHMgbXVzdAorYWx3YXlzIGNhbGwgdGhlIHN1cGVyY2xhc3MgaW1wbGVtZW50YXRpb24gYmVmb3JlIGRvaW5nIGFueSB3b3JrLCBhcyBzaG93biBpbiB0aGUgZXhhbXBsZXMgYWJvdmUuPC9wPgorCis8cD5UYWtlbiB0b2dldGhlciwgdGhlc2UgbWV0aG9kcyBkZWZpbmUgdGhlIGVudGlyZSBsaWZlY3ljbGUgb2YgYW4gYWN0aXZpdHkuIEJ5IGltcGxlbWVudGluZyB0aGVzZQorbWV0aG9kcywgeW91IGNhbiBtb25pdG9yIHRocmVlIG5lc3RlZCBsb29wcyBpbiB0aGUgYWN0aXZpdHkgbGlmZWN5Y2xlOiA8L3A+CisKKzx1bD4KKzxsaT5UaGUgPGI+ZW50aXJlIGxpZmV0aW1lPC9iPiBvZiBhbiBhY3Rpdml0eSBoYXBwZW5zIGJldHdlZW4gdGhlIGNhbGwgdG8ge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkNyZWF0ZSBvbkNyZWF0ZSgpfSBhbmQgdGhlIGNhbGwgdG8ge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkRlc3Ryb3l9LiBZb3VyIGFjdGl2aXR5IHNob3VsZCBwZXJmb3JtIHNldHVwIG9mCisiZ2xvYmFsIiBzdGF0ZSAoc3VjaCBhcyBkZWZpbmluZyBsYXlvdXQpIGluIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkNyZWF0ZSBvbkNyZWF0ZSgpfSwgYW5kCityZWxlYXNlIGFsbCByZW1haW5pbmcgcmVzb3VyY2VzIGluIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkRlc3Ryb3l9LiBGb3IgZXhhbXBsZSwgaWYgeW91cgorYWN0aXZpdHkgaGFzIGEgdGhyZWFkIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQgdG8gZG93bmxvYWQgZGF0YSBmcm9tIHRoZSBuZXR3b3JrLCBpdCBtaWdodCBjcmVhdGUKK3RoYXQgdGhyZWFkIGluIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkNyZWF0ZSBvbkNyZWF0ZSgpfSBhbmQgdGhlbiBzdG9wIHRoZSB0aHJlYWQgaW4ge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkRlc3Ryb3l9LjwvbGk+CisKKzxsaT48cD5UaGUgPGI+dmlzaWJsZSBsaWZldGltZTwvYj4gb2YgYW4gYWN0aXZpdHkgaGFwcGVucyBiZXR3ZWVuIHRoZSBjYWxsIHRvIHtAbGluaworYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TdGFydCBvblN0YXJ0KCl9IGFuZCB0aGUgY2FsbCB0byB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I29uU3RvcCBvblN0b3AoKX0uIER1cmluZyB0aGlzIHRpbWUsIHRoZSB1c2VyIGNhbiBzZWUgdGhlIGFjdGl2aXR5Citvbi1zY3JlZW4gYW5kIGludGVyYWN0IHdpdGggaXQuIEZvciBleGFtcGxlLCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TdG9wIG9uU3RvcCgpfSBpcyBjYWxsZWQKK3doZW4gYSBuZXcgYWN0aXZpdHkgc3RhcnRzIGFuZCB0aGlzIG9uZSBpcyBubyBsb25nZXIgdmlzaWJsZS4gQmV0d2VlbiB0aGVzZSB0d28gbWV0aG9kcywgeW91IGNhbgorbWFpbnRhaW4gcmVzb3VyY2VzIHRoYXQgYXJlIG5lZWRlZCB0byBzaG93IHRoZSBhY3Rpdml0eSB0byB0aGUgdXNlci4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gcmVnaXN0ZXIgYQore0BsaW5rIGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcn0gaW4ge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvblN0YXJ0IG9uU3RhcnQoKX0gdG8gbW9uaXRvciBjaGFuZ2VzIHRoYXQgaW1wYWN0IHlvdXIgVUksIGFuZCB1bnJlZ2lzdGVyCitpdCBpbiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TdG9wIG9uU3RvcCgpfSB3aGVuIHRoZSB1c2VyIGNhbiBubyBsb25nZXIgc2VlIHdoYXQgeW91IGFyZQorZGlzcGxheWluZy4gVGhlIHN5c3RlbSBtaWdodCBjYWxsIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblN0YXJ0IG9uU3RhcnQoKX0gYW5kIHtAbGluaworYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TdG9wIG9uU3RvcCgpfSBtdWx0aXBsZSB0aW1lcyBkdXJpbmcgdGhlIGVudGlyZSBsaWZldGltZSBvZiB0aGUgYWN0aXZpdHksIGFzCit0aGUgYWN0aXZpdHkgYWx0ZXJuYXRlcyBiZXR3ZWVuIGJlaW5nIHZpc2libGUgYW5kIGhpZGRlbiB0byB0aGUgdXNlci48L3A+PC9saT4KKworPGxpPjxwPlRoZSA8Yj5mb3JlZ3JvdW5kIGxpZmV0aW1lPC9iPiBvZiBhbiBhY3Rpdml0eSBoYXBwZW5zIGJldHdlZW4gdGhlIGNhbGwgdG8ge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvblJlc3VtZSBvblJlc3VtZSgpfSBhbmQgdGhlIGNhbGwgdG8ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uUGF1c2UKK29uUGF1c2UoKX0uIER1cmluZyB0aGlzIHRpbWUsIHRoZSBhY3Rpdml0eSBpcyBpbiBmcm9udCBvZiBhbGwgb3RoZXIgYWN0aXZpdGllcyBvbiBzY3JlZW4gYW5kIGhhcwordXNlciBpbnB1dCBmb2N1cy4gIEFuIGFjdGl2aXR5IGNhbiBmcmVxdWVudGx5IHRyYW5zaXRpb24gaW4gYW5kIG91dCBvZiB0aGUgZm9yZWdyb3VuZCZtZGFzaDtmb3IKK2V4YW1wbGUsIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblBhdXNlIG9uUGF1c2UoKX0gaXMgY2FsbGVkIHdoZW4gdGhlIGRldmljZSBnb2VzIHRvIHNsZWVwIG9yCit3aGVuIGEgZGlhbG9nIGFwcGVhcnMuIEJlY2F1c2UgdGhpcyBzdGF0ZSBjYW4gdHJhbnNpdGlvbiBvZnRlbiwgdGhlIGNvZGUgaW4gdGhlc2UgdHdvIG1ldGhvZHMgc2hvdWxkCitiZSBmYWlybHkgbGlnaHR3ZWlnaHQgaW4gb3JkZXIgdG8gYXZvaWQgc2xvdyB0cmFuc2l0aW9ucyB0aGF0IG1ha2UgdGhlIHVzZXIgd2FpdC48L3A+PC9saT4KKzwvdWw+CisKKzxwPkZpZ3VyZSAxIGlsbHVzdHJhdGVzIHRoZXNlIGxvb3BzIGFuZCB0aGUgcGF0aHMgYW4gYWN0aXZpdHkgbWlnaHQgdGFrZSBiZXR3ZWVuIHN0YXRlcy4KK1RoZSByZWN0YW5nbGVzIHJlcHJlc2VudCB0aGUgY2FsbGJhY2sgbWV0aG9kcyB5b3UgY2FuIGltcGxlbWVudCB0byBwZXJmb3JtIG9wZXJhdGlvbnMgd2hlbgordGhlIGFjdGl2aXR5IHRyYW5zaXRpb25zIGJldHdlZW4gc3RhdGVzLiA8cD4KKworPGltZyBzcmM9IntAZG9jUm9vdH1pbWFnZXMvYWN0aXZpdHlfbGlmZWN5Y2xlLnBuZyIgYWx0PSIiIC8+Cis8cCBjbGFzcz0iaW1nLWNhcHRpb24iPjxzdHJvbmc+RmlndXJlIDEuPC9zdHJvbmc+IFRoZSBhY3Rpdml0eSBsaWZlY3ljbGUuPC9wPgorCis8cD5UaGUgc2FtZSBsaWZlY3ljbGUgY2FsbGJhY2sgbWV0aG9kcyBhcmUgbGlzdGVkIGluIHRhYmxlIDEsIHdoaWNoIGRlc2NyaWJlcyBlYWNoIG9mIHRoZSBjYWxsYmFjaworbWV0aG9kcyBpbiBtb3JlIGRldGFpbCBhbmQgbG9jYXRlcyBlYWNoIG9uZSB3aXRoaW4gdGhlCithY3Rpdml0eSdzIG92ZXJhbGwgbGlmZWN5Y2xlLCBpbmNsdWRpbmcgd2hldGhlciB0aGUgc3lzdGVtIGNhbiBraWxsIHRoZSBhY3Rpdml0eSBhZnRlciB0aGUKK2NhbGxiYWNrIG1ldGhvZCBjb21wbGV0ZXMuPC9wPgorCis8cCBjbGFzcz0idGFibGUtY2FwdGlvbiI+PHN0cm9uZz5UYWJsZSAxLjwvc3Ryb25nPiBBIHN1bW1hcnkgb2YgdGhlIGFjdGl2aXR5IGxpZmVjeWNsZSdzCitjYWxsYmFjayBtZXRob2RzLjwvcD4KKworPHRhYmxlIGJvcmRlcj0iMiIgd2lkdGg9Ijg1JSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9InJvd3MiPgorPGNvbGdyb3VwIGFsaWduPSJsZWZ0IiBzcGFuPSIzIj48L2NvbGdyb3VwPgorPGNvbGdyb3VwIGFsaWduPSJsZWZ0Ij48L2NvbGdyb3VwPgorPGNvbGdyb3VwIGFsaWduPSJjZW50ZXIiPjwvY29sZ3JvdXA+Cis8Y29sZ3JvdXAgYWxpZ249ImNlbnRlciI+PC9jb2xncm91cD4KKworPHRoZWFkPgorPHRyPjx0aCBjb2xzcGFuPSIzIj5NZXRob2Q8L3RoPiA8dGg+RGVzY3JpcHRpb248L3RoPiA8dGg+S2lsbGFibGUgYWZ0ZXI/PC90aD4gPHRoPk5leHQ8L3RoPjwvdHI+Cis8L3RoZWFkPgorCis8dGJvZHk+Cis8dHI+CisgIDx0ZCBjb2xzcGFuPSIzIiBhbGlnbj0ibGVmdCI+PGNvZGU+e0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uQ3JlYXRlIG9uQ3JlYXRlKCl9PC9jb2RlPjwvdGQ+CisgIDx0ZD5DYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4KKyAgICAgIFRoaXMgaXMgd2hlcmUgeW91IHNob3VsZCBkbyBhbGwgb2YgeW91ciBub3JtYWwgc3RhdGljIHNldCB1cCAmbWRhc2g7CisgICAgICBjcmVhdGUgdmlld3MsIGJpbmQgZGF0YSB0byBsaXN0cywgYW5kIHNvIG9uLiAgVGhpcyBtZXRob2QgaXMgcGFzc2VkCisgICAgICBhIEJ1bmRsZSBvYmplY3QgY29udGFpbmluZyB0aGUgYWN0aXZpdHkncyBwcmV2aW91cyBzdGF0ZSwgaWYgdGhhdAorICAgICAgc3RhdGUgd2FzIGNhcHR1cmVkIChzZWUgPGEgaHJlZj0iI2FjdHN0YXRlIj5TYXZpbmcgQWN0aXZpdHkgU3RhdGU8L2E+LAorICAgICAgbGF0ZXIpLgorICAgICAgPHA+QWx3YXlzIGZvbGxvd2VkIGJ5IHtAY29kZSBvblN0YXJ0KCl9LjwvcD48L3RkPgorICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPHRkIGFsaWduPSJjZW50ZXIiPntAY29kZSBvblN0YXJ0KCl9PC90ZD4KKzwvdHI+CisKKzx0cj4KKyAgIDx0ZCByb3dzcGFuPSI1IiBzdHlsZT0iYm9yZGVyLWxlZnQ6IG5vbmU7IGJvcmRlci1yaWdodDogbm9uZTsiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+CisgICA8dGQgY29sc3Bhbj0iMiIgYWxpZ249ImxlZnQiPjxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblJlc3RhcnQKK29uUmVzdGFydCgpfTwvY29kZT48L3RkPgorICAgPHRkPkNhbGxlZCBhZnRlciB0aGUgYWN0aXZpdHkgaGFzIGJlZW4gc3RvcHBlZCwganVzdCBwcmlvciB0byBpdCBiZWluZworICAgICAgIHN0YXJ0ZWQgYWdhaW4uCisgICAgICAgPHA+QWx3YXlzIGZvbGxvd2VkIGJ5IHtAY29kZSBvblN0YXJ0KCl9PC9wPjwvdGQ+CisgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgPHRkIGFsaWduPSJjZW50ZXIiPntAY29kZSBvblN0YXJ0KCl9PC90ZD4KKzwvdHI+CisKKzx0cj4KKyAgIDx0ZCBjb2xzcGFuPSIyIiBhbGlnbj0ibGVmdCI+PGNvZGU+e0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uU3RhcnQgb25TdGFydCgpfTwvY29kZT48L3RkPgorICAgPHRkPkNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgYWN0aXZpdHkgYmVjb21lcyB2aXNpYmxlIHRvIHRoZSB1c2VyLgorICAgICAgIDxwPkZvbGxvd2VkIGJ5IHtAY29kZSBvblJlc3VtZSgpfSBpZiB0aGUgYWN0aXZpdHkgY29tZXMKKyAgICAgICB0byB0aGUgZm9yZWdyb3VuZCwgb3Ige0Bjb2RlIG9uU3RvcCgpfSBpZiBpdCBiZWNvbWVzIGhpZGRlbi48L3A+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj57QGNvZGUgb25SZXN1bWUoKX0gPGJyLz5vcjxici8+IHtAY29kZSBvblN0b3AoKX08L3RkPgorPC90cj4KKworPHRyPgorICAgPHRkIHJvd3NwYW49IjIiIHN0eWxlPSJib3JkZXItbGVmdDogbm9uZTsiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+CisgICA8dGQgYWxpZ249ImxlZnQiPjxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblJlc3VtZSBvblJlc3VtZSgpfTwvY29kZT48L3RkPgorICAgPHRkPkNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgYWN0aXZpdHkgc3RhcnRzCisgICAgICAgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdXNlci4gIEF0IHRoaXMgcG9pbnQgdGhlIGFjdGl2aXR5IGlzIGF0CisgICAgICAgdGhlIHRvcCBvZiB0aGUgYWN0aXZpdHkgc3RhY2ssIHdpdGggdXNlciBpbnB1dCBnb2luZyB0byBpdC4KKyAgICAgICA8cD5BbHdheXMgZm9sbG93ZWQgYnkge0Bjb2RlIG9uUGF1c2UoKX0uPC9wPjwvdGQ+CisgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgPHRkIGFsaWduPSJjZW50ZXIiPntAY29kZSBvblBhdXNlKCl9PC90ZD4KKzwvdHI+CisKKzx0cj4KKyAgIDx0ZCBhbGlnbj0ibGVmdCI+PGNvZGU+e0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uUGF1c2Ugb25QYXVzZSgpfTwvY29kZT48L3RkPgorICAgPHRkPkNhbGxlZCB3aGVuIHRoZSBzeXN0ZW0gaXMgYWJvdXQgdG8gc3RhcnQgcmVzdW1pbmcgYW5vdGhlcgorICAgICAgIGFjdGl2aXR5LiAgVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IHVzZWQgdG8gY29tbWl0IHVuc2F2ZWQgY2hhbmdlcyB0bworICAgICAgIHBlcnNpc3RlbnQgZGF0YSwgc3RvcCBhbmltYXRpb25zIGFuZCBvdGhlciB0aGluZ3MgdGhhdCBtYXkgYmUgY29uc3VtaW5nCisgICAgICAgQ1BVLCBhbmQgc28gb24uICBJdCBzaG91bGQgZG8gd2hhdGV2ZXIgaXQgZG9lcyB2ZXJ5IHF1aWNrbHksIGJlY2F1c2UKKyAgICAgICB0aGUgbmV4dCBhY3Rpdml0eSB3aWxsIG5vdCBiZSByZXN1bWVkIHVudGlsIGl0IHJldHVybnMuCisgICAgICAgPHA+Rm9sbG93ZWQgZWl0aGVyIGJ5IHtAY29kZSBvblJlc3VtZSgpfSBpZiB0aGUgYWN0aXZpdHkKKyAgICAgICByZXR1cm5zIGJhY2sgdG8gdGhlIGZyb250LCBvciBieSB7QGNvZGUgb25TdG9wKCl9IGlmIGl0IGJlY29tZXMKKyAgICAgICBpbnZpc2libGUgdG8gdGhlIHVzZXIuPC90ZD4KKyAgIDx0ZCBhbGlnbj0iY2VudGVyIj48c3Ryb25nIHN0eWxlPSJjb2xvcjojODAwMDAwIj5ZZXM8L3N0cm9uZz48L3RkPgorICAgPHRkIGFsaWduPSJjZW50ZXIiPntAY29kZSBvblJlc3VtZSgpfSA8YnIvPm9yPGJyLz4ge0Bjb2RlIG9uU3RvcCgpfTwvdGQ+Cis8L3RyPgorCis8dHI+CisgICA8dGQgY29sc3Bhbj0iMiIgYWxpZ249ImxlZnQiPjxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblN0b3Agb25TdG9wKCl9PC9jb2RlPjwvdGQ+CisgICA8dGQ+Q2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGlzIG5vIGxvbmdlciB2aXNpYmxlIHRvIHRoZSB1c2VyLiAgVGhpcworICAgICAgIG1heSBoYXBwZW4gYmVjYXVzZSBpdCBpcyBiZWluZyBkZXN0cm95ZWQsIG9yIGJlY2F1c2UgYW5vdGhlciBhY3Rpdml0eQorICAgICAgIChlaXRoZXIgYW4gZXhpc3Rpbmcgb25lIG9yIGEgbmV3IG9uZSkgaGFzIGJlZW4gcmVzdW1lZCBhbmQgaXMgY292ZXJpbmcgaXQuCisgICAgICAgPHA+Rm9sbG93ZWQgZWl0aGVyIGJ5IHtAY29kZSBvblJlc3RhcnQoKX0gaWYKKyAgICAgICB0aGUgYWN0aXZpdHkgaXMgY29taW5nIGJhY2sgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgdXNlciwgb3IgYnkKKyAgICAgICB7QGNvZGUgb25EZXN0cm95KCl9IGlmIHRoaXMgYWN0aXZpdHkgaXMgZ29pbmcgYXdheS48L3A+PC90ZD4KKyAgIDx0ZCBhbGlnbj0iY2VudGVyIj48c3Ryb25nIHN0eWxlPSJjb2xvcjojODAwMDAwIj5ZZXM8L3N0cm9uZz48L3RkPgorICAgPHRkIGFsaWduPSJjZW50ZXIiPntAY29kZSBvblJlc3RhcnQoKX0gPGJyLz5vcjxici8+IHtAY29kZSBvbkRlc3Ryb3koKX08L3RkPgorPC90cj4KKworPHRyPgorICAgPHRkIGNvbHNwYW49IjMiIGFsaWduPSJsZWZ0Ij48Y29kZT57QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25EZXN0cm95CitvbkRlc3Ryb3koKX08L2NvZGU+PC90ZD4KKyAgIDx0ZD5DYWxsZWQgYmVmb3JlIHRoZSBhY3Rpdml0eSBpcyBkZXN0cm95ZWQuICBUaGlzIGlzIHRoZSBmaW5hbCBjYWxsCisgICAgICAgdGhhdCB0aGUgYWN0aXZpdHkgd2lsbCByZWNlaXZlLiAgSXQgY291bGQgYmUgY2FsbGVkIGVpdGhlciBiZWNhdXNlIHRoZQorICAgICAgIGFjdGl2aXR5IGlzIGZpbmlzaGluZyAoc29tZW9uZSBjYWxsZWQgPGNvZGU+e0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I2ZpbmlzaAorICAgICAgIGZpbmlzaCgpfTwvY29kZT4gb24gaXQpLCBvciBiZWNhdXNlIHRoZSBzeXN0ZW0gaXMgdGVtcG9yYXJpbHkgZGVzdHJveWluZyB0aGlzCisgICAgICAgaW5zdGFuY2Ugb2YgdGhlIGFjdGl2aXR5IHRvIHNhdmUgc3BhY2UuICBZb3UgY2FuIGRpc3Rpbmd1aXNoCisgICAgICAgYmV0d2VlbiB0aGVzZSB0d28gc2NlbmFyaW9zIHdpdGggdGhlIDxjb2RlPntAbGluaworICAgICAgIGFuZHJvaWQuYXBwLkFjdGl2aXR5I2lzRmluaXNoaW5nIGlzRmluaXNoaW5nKCl9PC9jb2RlPiBtZXRob2QuPC90ZD4KKyAgIDx0ZCBhbGlnbj0iY2VudGVyIj48c3Ryb25nIHN0eWxlPSJjb2xvcjojODAwMDAwIj5ZZXM8L3N0cm9uZz48L3RkPgorICAgPHRkIGFsaWduPSJjZW50ZXIiPjxlbT5ub3RoaW5nPC9lbT48L3RkPgorPC90cj4KKzwvdGJvZHk+Cis8L3RhYmxlPgorCis8cD5UaGUgY29sdW1uIGxhYmVsZWQgIktpbGxhYmxlIGFmdGVyPyIgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBzeXN0ZW0gY2FuCitraWxsIHRoZSBwcm9jZXNzIGhvc3RpbmcgdGhlIGFjdGl2aXR5IGF0IGFueSB0aW1lIDxlbT5hZnRlciB0aGUgbWV0aG9kIHJldHVybnM8L2VtPiwgd2l0aG91dAorZXhlY3V0aW5nIGFub3RoZXIgbGluZSBvZiB0aGUgYWN0aXZpdHkncyBjb2RlLiAgVGhyZWUgbWV0aG9kcyBhcmUgbWFya2VkICJ5ZXMiOiAoe0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvblBhdXNlCitvblBhdXNlKCl9LCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TdG9wIG9uU3RvcCgpfSwgYW5kIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkRlc3Ryb3kKK29uRGVzdHJveSgpfSkuIEJlY2F1c2Uge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uUGF1c2Ugb25QYXVzZSgpfSBpcyB0aGUgZmlyc3QKK29mIHRoZSB0aHJlZSwgb25jZSB0aGUgYWN0aXZpdHkgaXMgY3JlYXRlZCwge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uUGF1c2Ugb25QYXVzZSgpfSBpcyB0aGUKK2xhc3QgbWV0aG9kIHRoYXQncyBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIHByb2Nlc3MgPGVtPmNhbjwvZW0+IGJlIGtpbGxlZCZtZGFzaDtpZgordGhlIHN5c3RlbSBtdXN0IHJlY292ZXIgbWVtb3J5IGluIGFuIGVtZXJnZW5jeSwgdGhlbiB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I29uU3RvcCBvblN0b3AoKX0gYW5kIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkRlc3Ryb3kgb25EZXN0cm95KCl9IG1pZ2h0Citub3QgYmUgY2FsbGVkLiBUaGVyZWZvcmUsIHlvdSBzaG91bGQgdXNlIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblBhdXNlIG9uUGF1c2UoKX0gdG8gd3JpdGUKK2NydWNpYWwgcGVyc2lzdGVudCBkYXRhIChzdWNoIGFzIHVzZXIgZWRpdHMpIHRvIHN0b3JhZ2UuIEhvd2V2ZXIsIHlvdSBzaG91bGQgYmUgc2VsZWN0aXZlIGFib3V0Cit3aGF0IGluZm9ybWF0aW9uIG11c3QgYmUgcmV0YWluZWQgZHVyaW5nIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblBhdXNlIG9uUGF1c2UoKX0sIGJlY2F1c2UgYW55CitibG9ja2luZyBwcm9jZWR1cmVzIGluIHRoaXMgbWV0aG9kIGJsb2NrIHRoZSB0cmFuc2l0aW9uIHRvIHRoZSBuZXh0IGFjdGl2aXR5IGFuZCBzbG93IHRoZSB1c2VyCitleHBlcmllbmNlLjwvcD4KKworPHA+IE1ldGhvZHMgdGhhdCBhcmUgbWFya2VkICJObyIgaW4gdGhlIDxiPktpbGxhYmxlPC9iPiBjb2x1bW4gcHJvdGVjdCB0aGUgcHJvY2VzcyBob3N0aW5nIHRoZQorYWN0aXZpdHkgZnJvbSBiZWluZyBraWxsZWQgZnJvbSB0aGUgbW9tZW50IHRoZXkgYXJlIGNhbGxlZC4gIFRodXMsIGFuIGFjdGl2aXR5IGlzIGtpbGxhYmxlCitmcm9tIHRoZSB0aW1lIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblBhdXNlIG9uUGF1c2UoKX0gcmV0dXJucyB0byB0aGUgdGltZQore0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uUmVzdW1lIG9uUmVzdW1lKCl9IGlzIGNhbGxlZC4gSXQgd2lsbCBub3QgYWdhaW4gYmUga2lsbGFibGUgdW50aWwKK3tAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblBhdXNlIG9uUGF1c2UoKX0gaXMgYWdhaW4gY2FsbGVkIGFuZCByZXR1cm5zLiA8L3A+CisKKzxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEFuIGFjdGl2aXR5IHRoYXQncyBub3QgdGVjaG5pY2FsbHkgImtpbGxhYmxlIiBieSB0aGlzCitkZWZpbml0aW9uIGluIHRhYmxlIDEgbWlnaHQgc3RpbGwgYmUga2lsbGVkIGJ5IHRoZSBzeXN0ZW0mbWRhc2g7YnV0IHRoYXQgd291bGQgaGFwcGVuIG9ubHkgaW4KK2V4dHJlbWUgY2lyY3Vtc3RhbmNlcyB3aGVuIHRoZXJlIGlzIG5vIG90aGVyIHJlY291cnNlLiBXaGVuIGFuIGFjdGl2aXR5IG1pZ2h0IGJlIGtpbGxlZCBpcworZGlzY3Vzc2VkIG1vcmUgaW4gdGhlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy9wcm9jZXNzZXMtYW5kLXRocmVhZGluZy5odG1sIj5Qcm9jZXNzZXMgYW5kCitUaHJlYWRpbmc8L2E+IGRvY3VtZW50LjwvcD4KKworCis8aDMgaWQ9IlNhdmluZ0FjdGl2aXR5U3RhdGUiPlNhdmluZyBhY3Rpdml0eSBzdGF0ZTwvaDM+CisKKzxwPlRoZSBpbnRyb2R1Y3Rpb24gdG8gPGEgaHJlZj0iTGlmZWN5Y2xlIj5NYW5hZ2luZyB0aGUgQWN0aXZpdHkgTGlmZWN5Y2xlPC9hPiBicmllZmx5IG1lbnRpb25zIHRoYXQKK3doZW4gYW4gYWN0aXZpdHkgaXMgcGF1c2VkIG9yIHN0b3BwZWQsIHRoZSBzdGF0ZSBvZiB0aGUgYWN0aXZpdHkgaXMgcmV0YWluZWQuIFRoaXMgaXMgdHJ1ZSBiZWNhdXNlCit0aGUge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5fSBvYmplY3QgaXMgc3RpbGwgaGVsZCBpbiBtZW1vcnkgd2hlbiBpdCBpcyBwYXVzZWQgb3IKK3N0b3BwZWQmbWRhc2g7YWxsIGluZm9ybWF0aW9uIGFib3V0IGl0cyBtZW1iZXJzIGFuZCBjdXJyZW50IHN0YXRlIGlzIHN0aWxsIGFsaXZlLiBUaHVzLCBhbnkgY2hhbmdlcwordGhlIHVzZXIgbWFkZSB3aXRoaW4gdGhlIGFjdGl2aXR5IGFyZSByZXRhaW5lZCBpbiBtZW1vcnksIHNvIHRoYXQgd2hlbiB0aGUgYWN0aXZpdHkgcmV0dXJucyB0byB0aGUKK2ZvcmVncm91bmQgKHdoZW4gaXQgInJlc3VtZXMiKSwgdGhvc2UgY2hhbmdlcyBhcmUgc3RpbGwgdGhlcmUuPC9wPgorCis8ZGl2IGNsYXNzPSJmaWd1cmUiIHN0eWxlPSJ3aWR0aDo2MTVweCI+Cis8aW1nIHNyYz0ie0Bkb2NSb290fWltYWdlcy9mdW5kYW1lbnRhbHMvcmVzdG9yZV9pbnN0YW5jZS5wbmciIGFsdD0iIiAvPgorPHAgY2xhc3M9ImltZy1jYXB0aW9uIj48c3Ryb25nPkZpZ3VyZSAyLjwvc3Ryb25nPiBUaGUgdHdvIHdheXMgaW4gd2hpY2ggYW4gYWN0aXZpdHkgcmV0dXJucyB0byB1c2VyCitmb2N1cyB3aXRoIGl0cyBzdGF0ZSBpbnRhY3Q6IGVpdGhlciB0aGUgYWN0aXZpdHkgaXMgc3RvcHBlZCwgdGhlbiByZXN1bWVkIGFuZCB0aGUgYWN0aXZpdHkgc3RhdGUKK3JlbWFpbnMgaW50YWN0IChsZWZ0KSwgb3IgdGhlIGFjdGl2aXR5IGlzIGRlc3Ryb3llZCwgdGhlbiByZWNyZWF0ZWQgYW5kIHRoZSBhY3Rpdml0eSBtdXN0IHJlc3RvcmUKK3RoZSBwcmV2aW91cyBhY3Rpdml0eSBzdGF0ZSAocmlnaHQpLjwvcD4KKzwvZGl2PgorCis8cD5Ib3dldmVyLCB3aGVuIHRoZSBzeXN0ZW0gZGVzdHJveXMgYW4gYWN0aXZpdHkgaW4gb3JkZXIgdG8gcmVjb3ZlciBtZW1vcnksIHRoZSB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5fSBvYmplY3QgaXMgZGVzdHJveWVkLCBzbyB0aGUgc3lzdGVtIGNhbm5vdCBzaW1wbHkgcmVzdW1lIGl0IHdpdGggaXRzIHN0YXRlCitpbnRhY3QuIEluc3RlYWQsIHRoZSBzeXN0ZW0gbXVzdCByZWNyZWF0ZSB0aGUge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5fSBvYmplY3QgaWYgdGhlIHVzZXIKK25hdmlnYXRlcyBiYWNrIHRvIGl0LiBZZXQsIHRoZSB1c2VyIGlzIHVuYXdhcmUKK3RoYXQgdGhlIHN5c3RlbSBkZXN0cm95ZWQgdGhlIGFjdGl2aXR5IGFuZCByZWNyZWF0ZWQgaXQgYW5kLCB0aHVzLCBwcm9iYWJseQorZXhwZWN0cyB0aGUgYWN0aXZpdHkgdG8gYmUgZXhhY3RseSBhcyBpdCB3YXMuIEluIHRoaXMgc2l0dWF0aW9uLCB5b3UgY2FuIGVuc3VyZSB0aGF0CitpbXBvcnRhbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjdGl2aXR5IHN0YXRlIGlzIHByZXNlcnZlZCBieSBpbXBsZW1lbnRpbmcgYW4gYWRkaXRpb25hbAorY2FsbGJhY2sgbWV0aG9kIHRoYXQgYWxsb3dzIHlvdSB0byBzYXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0ZSBvZiB5b3VyIGFjdGl2aXR5IGFuZCB0aGVuCityZXN0b3JlIGl0IHdoZW4gdGhlIHRoZSBzeXN0ZW0gcmVjcmVhdGVzIHRoZSBhY3Rpdml0eS48L3A+CisKKzxwPlRoZSBjYWxsYmFjayBtZXRob2QgaW4gd2hpY2ggeW91IGNhbiBzYXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIHlvdXIgYWN0aXZpdHkgaXMKK3tAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblNhdmVJbnN0YW5jZVN0YXRlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKX0uIFRoZSBzeXN0ZW0gY2FsbHMgdGhpcyBtZXRob2QKK2JlZm9yZSBtYWtpbmcgdGhlIGFjdGl2aXR5IHZ1bG5lcmFibGUgdG8gYmVpbmcgZGVzdHJveWVkIGFuZCBwYXNzZXMgaXQKK2Ege0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvYmplY3QuIFRoZSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IGlzIHdoZXJlIHlvdSBjYW4gc3RvcmUgCitzdGF0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYWN0aXZpdHkgYXMgbmFtZS12YWx1ZSBwYWlycywgdXNpbmcgbWV0aG9kcyBzdWNoIGFzIHtAbGluaworYW5kcm9pZC5vcy5CdW5kbGUjcHV0U3RyaW5nIHB1dFN0cmluZygpfS4gVGhlbiwgaWYgdGhlIHN5c3RlbSBraWxscyB5b3VyIGFjdGl2aXR5J3MKK3Byb2Nlc3MgYW5kIHRoZSB1c2VyIG5hdmlnYXRlcyBiYWNrIHRvIHlvdXIgYWN0aXZpdHksIHRoZSBzeXN0ZW0gcGFzc2VzIHRoZSB7QGxpbmsKK2FuZHJvaWQub3MuQnVuZGxlfSB0byB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25DcmVhdGUgb25DcmVhdGUoKX0gc28geW91IGNhbiByZXN0b3JlIHRoZQorYWN0aXZpdHkgc3RhdGUgeW91IHNhdmVkIGR1cmluZyB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TYXZlSW5zdGFuY2VTdGF0ZQorb25TYXZlSW5zdGFuY2VTdGF0ZSgpfS4gSWYgdGhlcmUgaXMgbm8gc3RhdGUgaW5mb3JtYXRpb24gdG8gcmVzdG9yZSwgdGhlbiB0aGUge0BsaW5rCithbmRyb2lkLm9zLkJ1bmRsZX0gcGFzc2VkIHRvIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkNyZWF0ZSBvbkNyZWF0ZSgpfSBpcyBudWxsLjwvcD4KKworPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlcmUncyBubyBndWFyYW50ZWUgdGhhdCB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I29uU2F2ZUluc3RhbmNlU3RhdGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpfSB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgeW91cgorYWN0aXZpdHkgaXMgZGVzdHJveWVkLCBiZWNhdXNlIHRoZXJlIGFyZSBjYXNlcyBpbiB3aGljaCBpdCB3b24ndCBiZSBuZWNlc3NhcnkgdG8gc2F2ZSB0aGUgc3RhdGUKKyhzdWNoIGFzIHdoZW4gdGhlIHVzZXIgbGVhdmVzIHlvdXIgYWN0aXZpdHkgdXNpbmcgdGhlIEJBQ0sga2V5LCBiZWNhdXNlIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHkKK2Nsb3NpbmcgdGhlIGFjdGl2aXR5KS4gSWYgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIGl0IGlzIGFsd2F5cyBjYWxsZWQgYmVmb3JlIHtAbGluaworYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TdG9wIG9uU3RvcCgpfSBhbmQgcG9zc2libHkgYmVmb3JlIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblBhdXNlCitvblBhdXNlKCl9LjwvcD4KKworPHA+SG93ZXZlciwgZXZlbiBpZiB5b3UgZG8gbm90aGluZyBhbmQgZG8gbm90IGltcGxlbWVudCB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I29uU2F2ZUluc3RhbmNlU3RhdGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpfSwgc29tZSBvZiB0aGUgYWN0aXZpdHkgc3RhdGUgaXMKK3Jlc3RvcmVkIGJ5IHRoZSB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHl9IGNsYXNzJ3MgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I29uU2F2ZUluc3RhbmNlU3RhdGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpfS4gU3BlY2lmaWNhbGx5LCB0aGUgZGVmYXVsdAoraW1wbGVtZW50YXRpb24gY2FsbHMge0BsaW5rCithbmRyb2lkLnZpZXcuVmlldyNvblNhdmVJbnN0YW5jZVN0YXRlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKX0gZm9yIGV2ZXJ5IHtAbGluayBhbmRyb2lkLnZpZXcuVmlld30KK2luIHRoZSBsYXlvdXQsIHdoaWNoIGFsbG93cyBlYWNoIHZpZXcgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCBpdHNlbGYKK3RoYXQgc2hvdWxkIGJlIHNhdmVkLiBBbG1vc3QgZXZlcnkgd2lkZ2V0IGluIHRoZSBBbmRyb2lkIGZyYW1ld29yayBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kIGFzCithcHByb3ByaWF0ZSwgc3VjaCB0aGF0IGFueSB2aXNpYmxlIGNoYW5nZXMgdG8gdGhlIFVJIGFyZSBhdXRvbWF0aWNhbGx5IHNhdmVkIGFuZCByZXN0b3JlZCB3aGVuIHlvdXIKK2FjdGl2aXR5IGlzIHJlY3JlYXRlZC4gRm9yIGV4YW1wbGUsIHRoZSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuRWRpdFRleHR9IHdpZGdldCBzYXZlcyBhbnkgdGV4dAorZW50ZXJlZCBieSB0aGUgdXNlciBhbmQgdGhlIHtAbGluayBhbmRyb2lkLndpZGdldC5DaGVja0JveH0gd2lkZ2V0IHNhdmVzIHdoZXRoZXIgaXQncyBjaGVja2VkIG9yCitub3QuIFRoZSBvbmx5IHdvcmsgcmVxdWlyZWQgYnkgeW91IGlzIHRvIHByb3ZpZGUgYSB1bmlxdWUgSUQgKHdpdGggdGhlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Jlc291cmNlcy9sYXlvdXQtcmVzb3VyY2UuaHRtbCNpZHZhbHVlIj57QGNvZGUgYW5kcm9pZDppZH08L2E+CithdHRyaWJ1dGUpIGZvciBlYWNoIHdpZGdldCB5b3Ugd2FudCB0byBzYXZlIGl0cyBzdGF0ZS4gSWYgYSB3aWRnZXQgZG9lcyBub3QgaGF2ZSBhbiBJRCwgdGhlbiBpdAorY2Fubm90IHNhdmUgaXRzIHN0YXRlLjwvcD4KKworPGRpdiBjbGFzcz0ic2lkZWJveC13cmFwcGVyIj4KKzxkaXYgY2xhc3M9InNpZGVib3giPgorPHA+WW91IGNhbiBhbHNvIGV4cGxpY2l0bHkgc3RvcCBhIHZpZXcgaW4geW91ciBsYXlvdXQgZnJvbSBzYXZpbmcgaXRzIHN0YXRlIGJ5IHNldHRpbmcgdGhlCit7QGxpbmsgYW5kcm9pZC5SLmF0dHIjc2F2ZUVuYWJsZWQgYW5kcm9pZDpzYXZlRW5hYmxlZH0gYXR0cmlidXRlIHRvIHtAY29kZSAiZmFsc2UifSBvciBieSBjYWxsaW5nCit0aGUge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I3NldFNhdmVFbmFibGVkIHNldFNhdmVFbmFibGVkKCl9IG1ldGhvZC4gVXN1YWxseSwgeW91IHNob3VsZCBub3QKK2Rpc2FibGUgdGhpcywgYnV0IHlvdSBtaWdodCBpZiB5b3Ugd2FudCB0byByZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgYWN0aXZpdHkgVUkgZGlmZmVyZW50bHkuPC9wPgorPC9kaXY+Cis8L2Rpdj4KKworPHA+QWx0aG91Z2ggdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvblNhdmVJbnN0YW5jZVN0YXRlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKX0gc2F2ZXMgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0Cit5b3VyIGFjdGl2aXR5J3MgVUksIHlvdSBzdGlsbCBtaWdodCBuZWVkIHRvIG92ZXJyaWRlIGl0IHRvIHNhdmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KK0ZvciBleGFtcGxlLCB5b3UgbWlnaHQgbmVlZCB0byBzYXZlIG1lbWJlciB2YWx1ZXMgdGhhdCBjaGFuZ2VkIGR1cmluZyB0aGUgYWN0aXZpdHkncyBsaWZlICh3aGljaAorbWlnaHQgY29ycmVsYXRlIHRvIHZhbHVlcyByZXN0b3JlZCBpbiB0aGUgVUksIGJ1dCB0aGUgbWVtYmVycyB0aGF0IGhvbGQgdGhvc2UgVUkgdmFsdWVzIGFyZSBub3QKK3Jlc3RvcmVkLCBieSBkZWZhdWx0KS48L3A+CisKKzxwPkJlY2F1c2UgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvblNhdmVJbnN0YW5jZVN0YXRlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKX0gaGVscHMgc2F2ZSB0aGUgc3RhdGUgb2YgdGhlIFVJLCBpZgoreW91IG92ZXJyaWRlIHRoZSBtZXRob2QgaW4gb3JkZXIgdG8gc2F2ZSBhZGRpdGlvbmFsIHN0YXRlIGluZm9ybWF0aW9uLCB5b3Ugc2hvdWxkIGFsd2F5cyBjYWxsIHRoZQorc3VwZXJjbGFzcyBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TYXZlSW5zdGFuY2VTdGF0ZSBvblNhdmVJbnN0YW5jZVN0YXRlKCl9CitiZWZvcmUgZG9pbmcgYW55IHdvcmsuPC9wPgorCis8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBCZWNhdXNlIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblNhdmVJbnN0YW5jZVN0YXRlCitvblNhdmVJbnN0YW5jZVN0YXRlKCl9IGlzIG5vdCBndWFyYW50ZWVkCit0byBiZSBjYWxsZWQsIHlvdSBzaG91bGQgdXNlIGl0IG9ubHkgdG8gcmVjb3JkIHRoZSB0cmFuc2llbnQgc3RhdGUgb2YgdGhlIGFjdGl2aXR5ICh0aGUgc3RhdGUgb2YKK3RoZSBVSSkmbWRhc2g7eW91IHNob3VsZCBuZXZlciB1c2UgaXQgdG8gc3RvcmUgcGVyc2lzdGVudCBkYXRhLiAgSW5zdGVhZCwgeW91IHNob3VsZCB1c2UgIHtAbGluaworYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25QYXVzZSBvblBhdXNlKCl9IHRvIHN0b3JlIHBlcnNpc3RlbnQgZGF0YSAoc3VjaCBhcyBkYXRhIHRoYXQgc2hvdWxkIGJlIHNhdmVkCit0byBhIGRhdGFiYXNlKSB3aGVuIHRoZSB1c2VyIGxlYXZlcyB0aGUgYWN0aXZpdHkuPC9wPgorCis8cD5BIGdvb2Qgd2F5IHRvIHRlc3QgeW91ciBhcHBsaWNhdGlvbidzIGFiaWxpdHkgdG8gcmVzdG9yZSBpdHMgc3RhdGUgaXMgdG8gc2ltcGx5IHJvdGF0ZSB0aGUKK2RldmljZSBzbyB0aGF0IHRoZSBzY3JlZW4gb3JpZW50YXRpb24gY2hhbmdlcy4gV2hlbiB0aGUgc2NyZWVuIG9yaWVudGF0aW9uIGNoYW5nZXMsIHRoZSBzeXN0ZW0KK2Rlc3Ryb3lzIGFuZCByZWNyZWF0ZXMgdGhlIGFjdGl2aXR5IGluIG9yZGVyIHRvIGFwcGx5IGFsdGVybmF0aXZlIHJlc291cmNlcyB0aGF0IG1pZ2h0IGJlIGF2YWlsYWJsZQorZm9yIHRoZSBuZXcgb3JpZW50YXRpb24uIEZvciB0aGlzIHJlYXNvbiBhbG9uZSwgaXQncyB2ZXJ5IGltcG9ydGFudCB0aGF0IHlvdXIgYWN0aXZpdHkKK2NvbXBsZXRlbHkgcmVzdG9yZXMgaXRzIHN0YXRlIHdoZW4gaXQgaXMgcmVjcmVhdGVkLCBiZWNhdXNlIHVzZXJzIHJlZ3VsYXJseSByb3RhdGUgdGhlIHNjcmVlbiB3aGlsZQordXNpbmcgYXBwbGljYXRpb25zLjwvcD4KKworCis8aDMgaWQ9IkNvbmZpZ3VyYXRpb25DaGFuZ2VzIj5IYW5kbGluZyBjb25maWd1cmF0aW9uIGNoYW5nZXM8L2gzPgorCis8cD5Tb21lIGRldmljZSBjb25maWd1cmF0aW9ucyBjYW4gY2hhbmdlIGR1cmluZyBydW50aW1lIChzdWNoIGFzIHNjcmVlbiBvcmllbnRhdGlvbiwga2V5Ym9hcmQKK2F2YWlsYWJpbGl0eSwgYW5kIGxhbmd1YWdlKS4gV2hlbiBzdWNoIGEgY2hhbmdlIG9jY3VycywgQW5kcm9pZCByZXN0YXJ0cyB0aGUgcnVubmluZyBBY3Rpdml0eQorKHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkRlc3Ryb3l9IGlzIGNhbGxlZCwgZm9sbG93ZWQgaW1tZWRpYXRlbHkgYnkge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkNyZWF0ZSBvbkNyZWF0ZSgpfSkuIFRoZSByZXN0YXJ0IGJlaGF2aW9yIGlzCitkZXNpZ25lZCB0byBoZWxwIHlvdXIgYXBwbGljYXRpb24gYWRhcHQgdG8gbmV3IGNvbmZpZ3VyYXRpb25zIGJ5IGF1dG9tYXRpY2FsbHkgcmVsb2FkaW5nIHlvdXIKK2FwcGxpY2F0aW9uIHdpdGggYWx0ZXJuYXRpdmUgcmVzb3VyY2VzIHRoYXQgeW91J3ZlIHByb3ZpZGVkLiBJZiB5b3UgZGVzaWduIHlvdXIgYWN0aXZpdHkgdG8KK3Byb3Blcmx5IGhhbmRsZSB0aGlzIGV2ZW50LCBpdCB3aWxsIGJlIG1vcmUgcmVzaWxpZW50IHRvIHVuZXhwZWN0ZWQgZXZlbnRzIGluIHRoZSBhY3Rpdml0eQorbGlmZWN5Y2xlLjwvcD4KKworPHA+VGhlIGJlc3Qgd2F5IHRvIGhhbmRsZSBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlLCBzdWNoIGFzIGEgY2hhbmdlIGluIHRoZSBzY3JlZW4gb3JpZW50YXRpb24sIGlzCisgIHRvIHNpbXBseSBwcmVzZXJ2ZSB0aGUgc3RhdGUgb2YgeW91ciBhcHBsaWNhdGlvbiB1c2luZyB7QGxpbmsKKyAgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TYXZlSW5zdGFuY2VTdGF0ZSBvblNhdmVJbnN0YW5jZVN0YXRlKCl9IGFuZCB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I29uUmVzdG9yZUluc3RhbmNlU3RhdGUgb25SZXN0b3JlSW5zdGFuY2VTdGF0ZSgpfSAob3Ige0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkNyZWF0ZSBvbkNyZWF0ZSgpfSksIGFzIGRpc2N1c3NlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi48L3A+CisKKzxwPkZvciBhIGRldGFpbGVkIGRpc2N1c3Npb24gYWJvdXQgY29uZmlndXJhdGlvbiBjaGFuZ2VzIHRoYXQgaGFwcGVuIGF0IHJ1bnRpbWUgYW5kIGhvdyB5b3Ugc2hvdWxkCitoYW5kbGUgdGhlbSwgcmVhZCA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Jlc291cmNlcy9ydW50aW1lLWNoYW5nZXMuaHRtbCI+SGFuZGxpbmcKK1J1bnRpbWUgQ2hhbmdlczwvYT4uPC9wPgorCisKKworPGgzIGlkPSJDb29yZGluYXRpbmdBY3Rpdml0aWVzIj5Db29yZGluYXRpbmcgYWN0aXZpdGllczwvaDM+CisKKyA8cD5XaGVuIG9uZSBhY3Rpdml0eSBzdGFydHMgYW5vdGhlciwgdGhleSBib3RoIGV4cGVyaWVuY2UgbGlmZWN5Y2xlIHRyYW5zaXRpb25zLiBUaGUgZmlyc3QgYWN0aXZpdHkKK3BhdXNlcyBhbmQgc3RvcHMgKHRob3VnaCwgaXQgd29uJ3Qgc3RvcCBpZiBpdCdzIHN0aWxsIHZpc2libGUgaW4gdGhlIGJhY2tncm91bmQpLCB3aGlsZSB0aGUgb3RoZXIKK2FjdGl2aXR5IGlzIGNyZWF0ZWQuIEluIGNhc2UgdGhlc2UgYWN0aXZpdGllcyBzaGFyZSBkYXRhIHNhdmVkIHRvIGRpc2Mgb3IgZWxzZXdoZXJlLCBpdCdzIGltcG9ydGFudAordG8gdW5kZXJzdGFuZCB0aGF0IHRoZSBmaXJzdCBhY3Rpdml0eSBpcyBub3QgY29tcGxldGVseSBzdG9wcGVkIGJlZm9yZSB0aGUgc2Vjb25kIG9uZSBpcyBjcmVhdGVkLgorUmF0aGVyLCB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB0aGUgc2Vjb25kIG9uZSBvdmVybGFwcyB3aXRoIHRoZSBwcm9jZXNzIG9mIHN0b3BwaW5nIHRoZSBmaXJzdAorb25lLjwvcD4KKworPHA+VGhlIG9yZGVyIG9mIGxpZmVjeWNsZSBjYWxsYmFja3MgaXMgd2VsbCBkZWZpbmVkLCBwYXJ0aWN1bGFybHkgd2hlbiB0aGUgdHdvIGFjdGl2aXRpZXMgYXJlIGluIHRoZQorc2FtZSBwcm9jZXNzIGFuZCBvbmUgaXMgc3RhcnRpbmcgdGhlIG90aGVyLiBIZXJlJ3MgdGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgdGhhdCBvY2N1ciB3aGVuIEFjdGl2aXR5CitBIHN0YXJ0cyBBY2l2aXR5IEI6IDwvcD4KKworPG9sPgorPGxpPkFjdGl2aXR5IEEncyB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25QYXVzZSBvblBhdXNlKCl9IG1ldGhvZCBleGVjdXRlcy48L2xpPgorCis8bGk+QWN0aXZpdHkgQidzIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkNyZWF0ZSBvbkNyZWF0ZSgpfSwge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvblN0YXJ0IG9uU3RhcnQoKX0sIGFuZCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25SZXN1bWUgb25SZXN1bWUoKX0KK21ldGhvZHMgZXhlY3V0ZSBpbiBzZXF1ZW5jZS4gKEFjdGl2aXR5IEIgbm93IGhhcyB1c2VyIGZvY3VzLik8L2xpPgorCis8bGk+VGhlbiwgaWYgQWN0aXZpdHkgQSBpcyBubyBsb25nZXIgdmlzaWJsZSBvbiBzY3JlZW4sIGl0cyB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I29uU3RvcCBvblN0b3AoKX0gbWV0aG9kIGV4ZWN1dGVzLjwvbGk+Cis8L29sPgorCisgPHA+VGhpcyBwcmVkaWN0YWJsZSBzZXF1ZW5jZSBvZiBsaWZlY3ljbGUgY2FsbGJhY2tzIGFsbG93cyB5b3UgdG8gbWFuYWdlIHRoZSB0cmFuc2l0aW9uIG9mCitpbmZvcm1hdGlvbiBmcm9tIG9uZSBhY3Rpdml0eSB0byBhbm90aGVyLiBGb3IgZXhhbXBsZSwgaWYgeW91IG11c3Qgd3JpdGUgdG8gYSBkYXRhYmFzZSB3aGVuIHRoZQorZmlyc3QgYWN0aXZpdHkgc3RvcHMgc28gdGhhdCB0aGUgZm9sbG93aW5nIGFjdGl2aXR5IGNhbiByZWFkIGl0LCB0aGVuIHlvdSBzaG91bGQgd3JpdGUgdG8gdGhlCitkYXRhYmFzZSBkdXJpbmcge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uUGF1c2Ugb25QYXVzZSgpfSBpbnN0ZWFkIG9mIGR1cmluZyB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I29uU3RvcCBvblN0b3AoKX0uPC9wPgorCisKKzxoMj5CZWdpbm5lcidzIFBhdGg8L2gyPgorCis8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgQW5kcm9pZCBtYWludGFpbnMgYSBoaXN0b3J5IG9mIGFjdGl2aXRpZXMgYW5kCitlbmFibGVzIHVzZXIgbXVsdGl0YXNraW5nLCBjb250aW51ZSB3aXRoIHRoZSA8Yj48YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMvdGFza3MtYW5kLWJhY2stc3RhY2suaHRtbCI+VGFza3MgYW5kIEJhY2sKK1N0YWNrPC9hPjwvYj4gZG9jdW1lbnQuPC9wPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMvdGFza3MtYW5kLWJhY2stc3RhY2suamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy90YXNrcy1hbmQtYmFjay1zdGFjay5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2RjNTQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzL3Rhc2tzLWFuZC1iYWNrLXN0YWNrLmpkCkBAIC0wLDAgKzEsNTY4IEBACitwYWdlLnRpdGxlPVRhc2tzIGFuZCBCYWNrIFN0YWNrCitwYXJlbnQudGl0bGU9QXBwbGljYXRpb24gRnVuZGFtZW50YWxzCitwYXJlbnQubGluaz1pbmRleC5odG1sCitAamQ6Ym9keQorCis8ZGl2IGlkPSJxdi13cmFwcGVyIj4KKzxkaXYgaWQ9InF2Ij4KKzxoMj5RdWlja3ZpZXc8L2gyPgorPHVsPgorICA8bGk+QWxsIGFjdGl2aXRpZXMgYmVsb25nIHRvIGEgdGFzazwvbGk+CisgIDxsaT5BIHRhc2sgY29udGFpbnMgYSBjb2xsZWN0aW9uIG9mIGFjdGl2aXRpZXMgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSB1c2VyIGludGVyYWN0cyB3aXRoCit0aGVtPC9saT4KKyAgPGxpPlRhc2tzIGNhbiBtb3ZlIHRvIHRoZSBiYWNrZ3JvdW5kIGFuZCByZXRhaW4gdGhlIHN0YXRlIG9mIGVhY2ggYWN0aXZpdHkgaW4gb3JkZXIgZm9yIHRoZSB1c2VyCit0byBwZXJmb3JtIG90aGVyIHRhc2tzIHdpdGhvdXQgbG9vc2luZyB0aGVpciB3b3JrPC9saT4KKzwvdWw+CisKKzxoMj5JbiB0aGlzIGRvY3VtZW50PC9oMj4KKzxvbD4KKzxsaT48YSBocmVmPSIjQWN0aXZpdHlTdGF0ZSI+U2F2aW5nIEFjdGl2aXR5IFN0YXRlPC9hPjwvbGk+PC9saT4KKzxsaT48YSBocmVmPSIjTWFuYWdpbmdUYXNrcyI+TWFuYWdpbmcgVGFza3M8L2E+CisgIDxvbD4KKyAgICA8bGk+PGEgaHJlZj0iI1Rhc2tMYXVuY2hNb2RlcyI+RGVmaW5pbmcgbGF1bmNoIG1vZGVzPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9IiNBZmZpbml0aWVzIj5IYW5kbGluZyBhZmZpbml0aWVzPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9IiNDbGVhcmluZyI+Q2xlYXJpbmcgdGhlIGJhY2sgc3RhY2s8L2E+PC9saT4KKyAgICA8bGk+PGEgaHJlZj0iI1N0YXJ0aW5nIj5TdGFydGluZyBhIHRhc2s8L2E+PC9saT4KKyAgPC9vbD4KKzwvbGk+Cis8L29sPgorCis8aDI+U2VlIGFsc288L2gyPgorPG9sPgorICA8bGk+PGE+PGEgaHJlZj0ie0Bkb2NSb290fXZpZGVvcy9pbmRleC5odG1sI3Y9Zkw2Z1NkNHVnU0kiPkFwcGxpY2F0aW9uIExpZmVjeWNsZSB2aWRlbzwvYT48L2xpPgorICA8bGk+PGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sIj57QGNvZGUgJmx0O2FjdGl2aXR5Jmd0O30gbWFuaWZlc3QKK2VsZW1lbnQ8L2E+PC9saT4KKzwvb2w+Cis8L2Rpdj4KKzwvZGl2PgorCisKKzxwPkFuIGFwcGxpY2F0aW9uIHVzdWFsbHkgY29udGFpbnMgbXVsdGlwbGUgPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzL2FjdGl2aXRpZXMuaHRtbCI+YWN0aXZpdGllczwvYT4uIEVhY2ggYWN0aXZpdHkKK3Nob3VsZCBiZSBkZXNpZ25lZCBhcm91bmQgYSBzcGVjaWZpYyBraW5kIG9mIGFjdGlvbiB0aGUgdXNlciBjYW4gcGVyZm9ybSBhbmQgY2FuIHN0YXJ0IG90aGVyCithY3Rpdml0aWVzLiBGb3IgZXhhbXBsZSwgYW4gZW1haWwgYXBwbGljYXRpb24gbWlnaHQgaGF2ZSBvbmUgYWN0aXZpdHkgdG8gc2hvdyBhIGxpc3Qgb2YgbmV3IGVtYWlsLgorV2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIGVtYWlsLCBhIG5ldyBhY3Rpdml0eSBvcGVucyB0byB2aWV3IHRoYXQgZW1haWwuPC9wPgorCis8cD5BbiBhY3Rpdml0eSBjYW4gZXZlbiBzdGFydCBhY3Rpdml0aWVzIHRoYXQgZXhpc3QgaW4gb3RoZXIgYXBwbGljYXRpb25zIG9uIHRoZSBkZXZpY2UuIEZvcgorZXhhbXBsZSwgaWYgeW91ciBhcHBsaWNhdGlvbiB3YW50cyB0byBzZW5kIGFuIGVtYWlsLCB5b3UgY2FuIGRlZmluZSBhbiBpbnRlbnQgdG8gcGVyZm9ybSBhICJzZW5kIgorYWN0aW9uIGFuZCBpbmNsdWRlIHNvbWUgZGF0YSwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIGFuZCBhIG1lc3NhZ2UuIEFuIGFjdGl2aXR5IGZyb20gYW5vdGhlcgorYXBwbGljYXRpb24gdGhhdCBkZWNsYXJlcyBpdHNlbGYgdG8gaGFuZGxlIHRoaXMga2luZCBvZiBpbnRlbnQgdGhlbiBvcGVucy4gSW4gdGhpcyBjYXNlLCB0aGUgaW50ZW50CitpcyB0byBzZW5kIGFuIGVtYWlsLCBzbyBhbiBlbWFpbCBhcHBsaWNhdGlvbidzICJjb21wb3NlIiBhY3Rpdml0eSBzdGFydHMgKGlmIG11bHRpcGxlIGFjdGl2aXRpZXMKK3N1cHBvcnQgdGhlIHNhbWUgaW50ZW50LCB0aGVuIHRoZSBzeXN0ZW0gbGV0cyB0aGUgdXNlciBzZWxlY3Qgd2hpY2ggb25lIHRvIHVzZSkuIFdoZW4gdGhlIGVtYWlsIGlzCitzZW50LCB5b3VyIGFjdGl2aXR5IHJlc3VtZXMgYW5kIGl0IHNlZW1zIGFzIGlmIHRoZSBlbWFpbCBhY3Rpdml0eSB3YXMgcGFydCBvZiB5b3VyIGFwcGxpY2F0aW9uLiBFdmVuCit0aG91Z2ggdGhlIGFjdGl2aXRpZXMgbWF5IGJlIGZyb20gZGlmZmVyZW50IGFwcGxpY2F0aW9ucywgQW5kcm9pZCBtYWludGFpbnMgdGhpcyBzZWFtbGVzcyB1c2VyCitleHBlcmllbmNlIGJ5IGtlZXBpbmcgYm90aCBhY3Rpdml0aWVzIGluIHRoZSBzYW1lIDxlbT50YXNrPC9lbT4uPC9wPgorCis8cD5BIHRhc2sgaXMgYSBjb2xsZWN0aW9uIG9mIGFjdGl2aXRpZXMgdGhhdCB1c2VycyBpbnRlcmFjdCB3aXRoCit3aGVuIHBlcmZvcm1pbmcgYSBjZXJ0YWluIGpvYi4gVGhlIGFjdGl2aXRpZXMgYXJlIGFycmFuZ2VkIGluIGEgc3RhY2sgKHRoZSAiYmFjayBzdGFjayIpLCBpbiB0aGUKK29yZGVyIGluIHdoaWNoIGVhY2ggYWN0aXZpdHkgaXMgb3BlbmVkLjwvcD4KKworPCEtLSBTQVZFIEZPUiBXSEVOIFRIRSBGUkFHTUVOVCBET0MgSVMgQURERUQKKzxkaXYgY2xhc3M9InNpZGVib3gtd3JhcHBlciI+Cis8ZGl2IGNsYXNzPSJzaWRlYm94Ij4KKzxoMz5BZGRpbmcgZnJhZ21lbnRzIHRvIGEgdGFzaydzIGJhY2sgc3RhY2s8L2gzPgorCis8cD5Zb3VyIGFjdGl2aXR5IGNhbiBhbHNvIGluY2x1ZGUge0BsaW5rIGFuZHJvaWQuYXBwLkZyYWdtZW50fXMgdG8gdGhlIGJhY2sgc3RhY2suIEZvciBleGFtcGxlLAorc3VwcG9zZSB5b3UgaGF2ZSBhIHR3by1wYW5lIGxheW91dCB1c2luZyBmcmFnbWVudHMsIG9uZSBvZiB3aGljaCBpcyBhIGxpc3QgdmlldyAoZnJhZ21lbnQgQSkgYW5kIHRoZQorb3RoZXIgYmVpbmcgYSBsYXlvdXQgdG8gZGlzcGxheSBhbiBpdGVtIGZyb20gdGhlIGxpc3QgKGZyYWdtZW50IEIpLiBXaGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gaXRlbQorZnJvbSB0aGUgbGlzdCwgZnJhZ21lbnQgQiBpcyByZXBsYWNlZCBieSBhIG5ldyBmcmFnbWVudCAoZnJhZ21lbnQgQykuIEluIHRoaXMgY2FzZSwgaXQgbWlnaHQgYmUKK2Rlc2lyZWFibGUgZm9yIHRoZSB1c2VyIHRvIG5hdmlnYXRlIGJhY2sgdG8gcmV2ZWFsIGZyYWdtZW50IEIsIHVzaW5nIHRoZSBCQUNLIGtleS48L3A+Cis8cD5JbiBvcmRlciB0byBhZGQgZnJhZ21lbnQgQiB0byB0aGUgYmFjayBzdGFjayBzbyB0aGF0IHRoaXMgaXMgcG9zc2libGUsIHlvdSBtdXN0IGNhbGwge0BsaW5rCithbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uI2FkZFRvQmFja1N0YWNrIGFkZFRvQmFja1N0YWNrKCl9IGJlZm9yZSB5b3Uge0BsaW5rCithbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uI2NvbW1pdCgpfSB0aGUgdHJhbnNhY3Rpb24gdGhhdCByZXBsYWNlcyBmcmFnbWVudCBCIHdpdGggZnJhZ21lbnQKK0MuPC9wPgorPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgZnJhZ21lbnRzIGFuZCBhZGRpbmcgdGhlbSB0byB0aGUgYmFjayBzdGFjaywgc2VlIHRoZSB7QGxpbmsKK2FuZHJvaWQuYXBwLkZyYWdtZW50fSBjbGFzcyBkb2N1bWVudGF0aW9uLjwvcD4KKworPC9kaXY+Cis8L2Rpdj4KKy0tPgorCis8cD5UaGUgZGV2aWNlIEhvbWUgc2NyZWVuIGlzIHRoZSBzdGFydGluZyBwbGFjZSBmb3IgbW9zdCB0YXNrcy4gV2hlbiB0aGUgdXNlciB0b3VjaGVzIGFuIGljb24gaW4gdGhlCithcHBsaWNhdGlvbgorbGF1bmNoZXIgKG9yIGEgc2hvcnRjdXQgb24gdGhlIEhvbWUgc2NyZWVuKSwgdGhhdCBhcHBsaWNhdGlvbidzIHRhc2sgY29tZXMgdG8gdGhlIGZvcmVncm91bmQuIElmIG5vCit0YXNrIGV4aXN0cyBmb3IgdGhlIGFwcGxpY2F0aW9uICh0aGUgYXBwbGljYXRpb24gaGFzIG5vdCBiZWVuIHVzZWQgcmVjZW50bHkpLCB0aGVuIGEgbmV3IHRhc2sKK2lzIGNyZWF0ZWQgYW5kIHRoZSAibWFpbiIgYWN0aXZpdHkgZm9yIHRoYXQgYXBwbGljYXRpb24gb3BlbnMgYXMgdGhlIHJvb3QgYWN0aXZpdHkgaW4gdGhlIHN0YWNrLjwvcD4KKworPHA+V2hlbiB0aGUgY3VycmVudCBhY3Rpdml0eSBzdGFydHMgYW5vdGhlciwgdGhlIG5ldyBhY3Rpdml0eSBpcyBwdXNoZWQgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2sgYW5kCit0YWtlcyBmb2N1cy4gVGhlIHByZXZpb3VzIGFjdGl2aXR5IHJlbWFpbnMgaW4gdGhlIHN0YWNrLCBidXQgaXMgc3RvcHBlZC4gV2hlbiBhbiBhY3Rpdml0eQorc3RvcHMsIHRoZSBzeXN0ZW0gcmV0YWlucyB0aGUgY3VycmVudCBzdGF0ZSBvZiBpdHMgdXNlciBpbnRlcmZhY2UuIFdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgQkFDSwora2V5LCB0aGUgY3VycmVudCBhY3Rpdml0eSBpcyBwb3BwZWQgZnJvbSB0aGUgdG9wIG9mIHRoZSBzdGFjayAodGhlIGFjdGl2aXR5IGlzIGRlc3Ryb3llZCkgYW5kIHRoZQorcHJldmlvdXMgYWN0aXZpdHkgcmVzdW1lcyAodGhlIHByZXZpb3VzIHN0YXRlIG9mIGl0cyBVSSBpcyByZXN0b3JlZCkuIEFjdGl2aXRpZXMgaW4gdGhlIHN0YWNrIGFyZQorbmV2ZXIgcmVhcnJhbmdlZCwgb25seSBwdXNoZWQgYW5kIHBvcHBlZCBmcm9tIHRoZSBzdGFjayZtZGFzaDtwdXNoZWQgb250byB0aGUgc3RhY2sgd2hlbiBzdGFydGVkIGJ5Cit0aGUgY3VycmVudCBhY3Rpdml0eSBhbmQgcG9wcGVkIG9mZiB3aGVuIHRoZSB1c2VyIGxlYXZlcyBpdCB1c2luZyB0aGUgQkFDSyBrZXkuIEFzIHN1Y2gsIHRoZSBiYWNrCitzdGFjayBvcGVyYXRlcyBhcyBhICJsYXN0IGluLCBmaXJzdCBvdXQiIG9iamVjdCBzdHJ1Y3R1cmUuIEZpZ3VyZSAxIHZpc3VhbGl6ZXMKK3RoaXMgYmVoYXZpb3Igd2l0aCBhIHRpbWVsaW5lIHNob3dpbmcgdGhlIHByb2dyZXNzIGJldHdlZW4gYWN0aXZpdGllcyBhbG9uZyB3aXRoIHRoZSBjdXJyZW50IGJhY2sKK3N0YWNrIGF0IGVhY2ggcG9pbnQgaW4gdGltZS48L3A+CisKKzxpbWcgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL2Z1bmRhbWVudGFscy9kaWFncmFtX2JhY2tzdGFjay5wbmciIGFsdD0iIiAvPgorPHAgY2xhc3M9ImltZy1jYXB0aW9uIj48c3Ryb25nPkZpZ3VyZSAxLjwvc3Ryb25nPiBBIHJlcHJlc2VudGF0aW9uIG9mIGhvdyBlYWNoIG5ldyBhY3Rpdml0eSBpbiBhCit0YXNrIGFkZHMgYW4gaXRlbSB0byB0aGUgYmFjayBzdGFjay4gV2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSBCQUNLIGtleSwgdGhlIGN1cnJlbnQgYWN0aXZpdHkgaXMKK2Rlc3Ryb3llZCBhbmQgdGhlIHByZXZpb3VzIGFjdGl2aXR5IHJlc3VtZXMuPC9wPgorCisKKzxwPklmIHRoZSB1c2VyIGNvbnRpbnVlcyB0byBwcmVzcyBCQUNLLCB0aGVuIGVhY2ggYWN0aXZpdHkgaW4gdGhlIHN0YWNrIGlzIHBvcHBlZCBvZmYgdG8gcmV2ZWFsIHRoZQorcHJldmlvdXMgb25lLCB1bnRpbCB0aGUgdXNlciByZXR1cm5zIHRvIHRoZSBIb21lIHNjcmVlbiAob3IgdG8gd2hpY2hldmVyIGFjdGl2aXR5IHdhcyBydW5uaW5nIHdoZW4KK3RoZSB0YXNrIGJlZ2FuKS4gV2hlbiBhbGwgYWN0aXZpdGllcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBzdGFjaywgdGhlIHRhc2sgbm8gbG9uZ2VyIGV4aXN0cy48L3A+CisKKzxkaXYgY2xhc3M9ImZpZ3VyZSIgc3R5bGU9IndpZHRoOjM2OXB4Ij4KKzxpbWcgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL2Z1bmRhbWVudGFscy9kaWFncmFtX211bHRpdGFza2luZy5wbmciIGFsdD0iIiAvPiA8cAorY2xhc3M9ImltZy1jYXB0aW9uIj48c3Ryb25nPkZpZ3VyZSAyLjwvc3Ryb25nPiBUd28gdGFza3M6IFRhc2sgQSBpcyBpbiB0aGUgYmFja2dyb3VuZCwgd2FpdGluZwordG8gYmUgcmVzdW1lZCwgd2hpbGUgVGFzayBCIHJlY2VpdmVzIHVzZXIgaW50ZXJhY3Rpb24gaW4gdGhlIGZvcmVncm91bmQuPC9wPgorPC9kaXY+Cis8ZGl2IGNsYXNzPSJmaWd1cmUiIHN0eWxlPSJ3aWR0aDoxNzhweCI+CisgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL2Z1bmRhbWVudGFscy9kaWFncmFtX211bHRpcGxlX2luc3RhbmNlcy5wbmciIGFsdD0iIiAvPiA8cAorY2xhc3M9ImltZy1jYXB0aW9uIj48c3Ryb25nPkZpZ3VyZSAzLjwvc3Ryb25nPiBBIHNpbmdsZSBhY3Rpdml0eSBpcyBpbnN0YW50aWF0ZWQgbXVsdGlwbGUgdGltZXMuPC9wPgorPC9kaXY+CisKKzxwPkEgdGFzayBpcyBhIGNvaGVzaXZlIHVuaXQgdGhhdCBjYW4gbW92ZSB0byB0aGUgImJhY2tncm91bmQiIHdoZW4gdXNlcnMgYmVnaW4gYSBuZXcgdGFzayBvciBnbwordG8gdGhlIEhvbWUgc2NyZWVuLCB2aWEgdGhlIEhPTUUga2V5LiBXaGlsZSBpbiB0aGUgYmFja2dyb3VuZCwgYWxsIHRoZSBhY3Rpdml0aWVzIGluIHRoZSB0YXNrIGFyZQorc3RvcHBlZCwgYnV0IHRoZSBiYWNrIHN0YWNrIGZvciB0aGUgdGFzayByZW1haW5zIGludGFjdCZtZGFzaDt0aGUgdGFzayBoYXMgc2ltcGx5IGxvc3QgZm9jdXMgd2hpbGUKK2Fub3RoZXIgdGFzayB0YWtlcyBwbGFjZSwgYXMgc2hvd24gaW4gZmlndXJlIDIuIEEgdGFzayBjYW4gdGhlbiByZXR1cm4gdG8gdGhlICJmb3JlZ3JvdW5kIiBzbyB1c2VycworY2FuIHBpY2sgdXAgd2hlcmUgdGhleSBsZWZ0IG9mZi4gU3VwcG9zZSwgZm9yIGV4YW1wbGUsIHRoYXQgdGhlIGN1cnJlbnQgdGFzayAoVGFzayBBKSBoYXMgdGhyZWUKK2FjdGl2aXRpZXMgaW4gaXRzIHN0YWNrJm1kYXNoO3R3byB1bmRlciB0aGUgY3VycmVudCBhY3Rpdml0eS4gVGhlIHVzZXIgcHJlc3NlcyB0aGUgSE9NRSBrZXksIHRoZW4KK3N0YXJ0cyBhIG5ldyBhcHBsaWNhdGlvbiBmcm9tIHRoZSBhcHBsaWNhdGlvbiBsYXVuY2hlci4gV2hlbiB0aGUgSG9tZSBzY3JlZW4gYXBwZWFycywgVGFzayBBIGdvZXMKK2ludG8gdGhlIGJhY2tncm91bmQuIFdoZW4gdGhlIG5ldyBhcHBsaWNhdGlvbiBzdGFydHMsIHRoZSBzeXN0ZW0gc3RhcnRzIGEgdGFzayBmb3IgdGhhdCBhcHBsaWNhdGlvbgorKFRhc2sgQikgd2l0aCBpdHMgb3duIHN0YWNrIG9mIGFjdGl2aXRpZXMuIEFmdGVyIGludGVyYWN0aW5nIHdpdGgKK3RoYXQgYXBwbGljYXRpb24sIHRoZSB1c2VyIHJldHVybnMgSG9tZSBhZ2FpbiBhbmQgc2VsZWN0cyB0aGUgYXBwbGljYXRpb24gdGhhdCBvcmlnaW5hbGx5CitzdGFydGVkIFRhc2sgQS4gTm93LCBUYXNrIEEgY29tZXMgdG8gdGhlCitmb3JlZ3JvdW5kJm1kYXNoO2FsbCB0aHJlZSBhY3Rpdml0aWVzIGluIGl0cyBzdGFjayBhcmUgaW50YWN0IGFuZCB0aGUgYWN0aXZpdHkgYXQgdGhlIHRvcCBvZiB0aGUKK3N0YWNrIHJlc3VtZXMuIEF0Cit0aGlzIHBvaW50LCB0aGUgdXNlciBjYW4gYWxzbyBzd2l0Y2ggYmFjayB0byBUYXNrIEIgYnkgZ29pbmcgSG9tZSBhbmQgc2VsZWN0aW5nIHRoZSBhcHBsaWNhdGlvbiBpY29uCit0aGF0IHN0YXJ0ZWQgdGhhdCB0YXNrIChvciBieSB0b3VjaGluZyBhbmQgaG9sZGluZyB0aGUgSE9NRSBrZXkgdG8gcmV2ZWFsIHJlY2VudCB0YXNrcyBhbmQgc2VsZWN0aW5nCitvbmUpLiBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgbXVsdGl0YXNraW5nIG9uIEFuZHJvaWQuPC9wPgorCis8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBNdWx0aXBsZSB0YXNrcyBjYW4gYmUgaGVsZCBpbiB0aGUgYmFja2dyb3VuZCBhdCBvbmNlLgorSG93ZXZlciwgaWYgdGhlIHVzZXIgaXMgcnVubmluZyBtYW55IGJhY2tncm91bmQgdGFza3MgYXQgdGhlIHNhbWUgdGltZSwgdGhlIHN5c3RlbSBtaWdodCBiZWdpbgorZGVzdHJveWluZyBiYWNrZ3JvdW5kIGFjdGl2aXRpZXMgaW4gb3JkZXIgdG8gcmVjb3ZlciBtZW1vcnksIGNhdXNpbmcgdGhlIGFjdGl2aXR5IHN0YXRlcyB0byBiZSBsb3N0LgorU2VlIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBhYm91dCA8YSBocmVmPSIjQWN0aXZpdHlTdGF0ZSI+QWN0aXZpdHkgc3RhdGU8L2E+LjwvcD4KKworPHA+QmVjYXVzZSB0aGUgYWN0aXZpdGllcyBpbiB0aGUgYmFjayBzdGFjayBhcmUgbmV2ZXIgcmVhcnJhbmdlZCwgaWYgeW91ciBhcHBsaWNhdGlvbiBhbGxvd3MKK3VzZXJzIHRvIHN0YXJ0IGEgcGFydGljdWxhciBhY3Rpdml0eSBmcm9tIG1vcmUgdGhhbiBvbmUgYWN0aXZpdHksIGEgbmV3IGluc3RhbmNlIG9mCit0aGF0IGFjdGl2aXR5IGlzIGNyZWF0ZWQgYW5kIHBvcHBlZCBvbnRvIHRoZSBzdGFjayAocmF0aGVyIHRoYW4gYnJpbmdpbmcgYW55IHByZXZpb3VzIGluc3RhbmNlIG9mCit0aGUgYWN0aXZpdHkgdG8gdGhlIHRvcCkuIEFzIHN1Y2gsIG9uZSBhY3Rpdml0eSBpbiB5b3VyIGFwcGxpY2F0aW9uIG1pZ2h0IGJlIGluc3RhbnRpYXRlZCBtdWx0aXBsZQordGltZXMgKGV2ZW4gZnJvbSBkaWZmZXJlbnQgdGFza3MpLCBhcyBzaG93biBpbiBmaWd1cmUgMy4gQXMgc3VjaCwgaWYgdGhlIHVzZXIgbmF2aWdhdGVzIGJhY2t3YXJkCit1c2luZyB0aGUgQkFDSyBrZXksIGVhY2ggaW5zdGFuY2Ugb2YgdGhlIGFjdGl2aXR5IGlzIHJldmVhbGVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgb3BlbmVkIChlYWNoCit3aXRoIHRoZWlyIG93biBVSSBzdGF0ZSkuIEhvd2V2ZXIsIHlvdSBjYW4gbW9kaWZ5IHRoaXMgYmVoYXZpb3IgaWYgeW91IGRvIG5vdCB3YW50IGFuIGFjdGl2aXR5IHRvIGJlCitpbnN0YW50aWF0ZWQgbW9yZSB0aGFuIG9uY2UuIEhvdyB0byBkbyBzbyBpcyBkaXNjdXNzZWQgaW4gdGhlIGxhdGVyIHNlY3Rpb24gYWJvdXQgPGEKK2hyZWY9IiNNYW5hZ2luZ1Rhc2tzIj5NYW5hZ2luZyBUYXNrczwvYT4uPC9wPgorCisKKzxwPlRvIHN1bW1hcml6ZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgYWN0aXZpdGllcyBhbmQgdGFza3M6PC9wPgorCis8dWw+CisgIDxsaT5XaGVuIEFjdGl2aXR5IEEgc3RhcnRzIEFjdGl2aXR5IEIsIEFjdGl2aXR5IEEgaXMgc3RvcHBlZCwgYnV0IHRoZSBzeXN0ZW0gcmV0YWlucyBpdHMgc3RhdGUKKyhzdWNoIGFzIHNjcm9sbCBwb3NpdGlvbiBhbmQgdGV4dCBlbnRlcmVkIGludG8gZm9ybXMpLgorSWYgdGhlIHVzZXIgcHJlc3NlcyB0aGUgQkFDSyBrZXkgd2hpbGUgaW4gQWN0aXZpdHkgQiwgQWN0aXZpdHkgQSByZXN1bWVzIHdpdGggaXRzIHN0YXRlCityZXN0b3JlZC48L2xpPgorICA8bGk+V2hlbiB0aGUgdXNlciBsZWF2ZXMgYSB0YXNrIGJ5IHByZXNzaW5nIHRoZSBIT01FIGtleSwgdGhlIGN1cnJlbnQgYWN0aXZpdHkgaXMgc3RvcHBlZCBhbmQKK2l0cyB0YXNrIGdvZXMgaW50byB0aGUgYmFja2dyb3VuZC4gVGhlIHN5c3RlbSByZXRhaW5zIHRoZSBzdGF0ZSBvZiBldmVyeSBhY3Rpdml0eSBpbiB0aGUgdGFzay4gSWYKK3RoZSB1c2VyIGxhdGVyIHJlc3VtZXMgdGhlIHRhc2sgYnkgc2VsZWN0aW5nIHRoZSBsYXVuY2hlciBpY29uIHRoYXQgYmVnYW4gdGhlIHRhc2ssIHRoZSB0YXNrIGNvbWVzCit0byB0aGUgZm9yZWdyb3VuZCBhbmQgcmVzdW1lcyB0aGUgYWN0aXZpdHkgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2suPC9saT4KKyAgPGxpPklmIHRoZSB1c2VyIHByZXNzZXMgdGhlIEJBQ0sga2V5LCB0aGUgY3VycmVudCBhY3Rpdml0eSBpcyBwb3BwZWQgZnJvbSB0aGUgc3RhY2sgYW5kCitkZXN0cm95ZWQuIFRoZSBwcmV2aW91cyBhY3Rpdml0eSBpbiB0aGUgc3RhY2sgaXMgcmVzdW1lZC4gV2hlbiBhbiBhY3Rpdml0eSBpcyBkZXN0cm95ZWQsIHRoZSBzeXN0ZW0KKzxlbT5kb2VzIG5vdDwvZW0+IHJldGFpbiB0aGUgYWN0aXZpdHkncyBzdGF0ZS48L2xpPgorICA8bGk+QWN0aXZpdGllcyBjYW4gYmUgaW5zdGFudGlhdGVkIG11bHRpcGxlIHRpbWVzLCBldmVuIGZyb20gb3RoZXIgdGFza3MuPC9saT4KKzwvdWw+CisKKworPGgyIGlkPSJBY3Rpdml0eVN0YXRlIj5TYXZpbmcgQWN0aXZpdHkgU3RhdGU8L2gyPgorCis8cD5BcyBkaXNjdXNzZWQgYWJvdmUsIHRoZSBzeXN0ZW0ncyBkZWZhdWx0IGJlaGF2aW9yIHByZXNlcnZlcyB0aGUgc3RhdGUgb2YgYW4gYWN0aXZpdHkgd2hlbiBpdCBpcworc3RvcHBlZC4gVGhpcyB3YXksIHdoZW4gdXNlcnMgbmF2aWdhdGUgYmFjayB0byBhIHByZXZpb3VzIGFjdGl2aXR5LCBpdHMgdXNlciBpbnRlcmZhY2UgYXBwZWFycwordGhlIHdheSB0aGV5IGxlZnQgaXQuIEhvd2V2ZXIsIHlvdSBjYW4mbWRhc2g7YW5kIDxzdHJvbmc+c2hvdWxkPC9zdHJvbmc+Jm1kYXNoO3Byb2FjdGl2ZWx5IHJldGFpbgordGhlIHN0YXRlIG9mIHlvdXIgYWN0aXZpdGllcyB1c2luZyBjYWxsYmFjayBtZXRob2RzLCBpbiBjYXNlIHRoZSBhY3Rpdml0eSBpcyBkZXN0cm95ZWQgYW5kIG11c3QKK2JlIHJlY3JlYXRlZC48L3A+CisKKzxwPldoZW4gdGhlIHN5c3RlbSBzdG9wcyBvbmUgb2YgeW91ciBhY3Rpdml0aWVzIChzdWNoIGFzIHdoZW4gYSBuZXcgYWN0aXZpdHkgc3RhcnRzIG9yIHRoZSB0YXNrCittb3ZlcyB0byB0aGUgYmFja2dyb3VuZCksIHRoZSBzeXN0ZW0gbWlnaHQgZGVzdHJveSB0aGF0IGFjdGl2aXR5IGNvbXBsZXRlbHkgaWYgaXQgbmVlZHMgdG8gcmVjb3Zlcgorc3lzdGVtIG1lbW9yeS4gV2hlbiB0aGlzIGhhcHBlbnMsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhY3Rpdml0eSBzdGF0ZSBpcyBsb3N0LiBJZiB0aGlzIGhhcHBlbnMsIHRoZQorc3lzdGVtIHN0aWxsCitrbm93cyB0aGF0IHRoZSBhY3Rpdml0eSBoYXMgYSBwbGFjZSBpbiB0aGUgYmFjayBzdGFjaywgYnV0IHdoZW4gdGhlIGFjdGl2aXR5IGlzIGJyb3VnaHQgdG8gdGhlCit0b3Agb2YgdGhlIHN0YWNrIHRoZSBzeXN0ZW0gbXVzdCByZWNyZWF0ZSBpdCAocmF0aGVyIHRoYW4gcmVzdW1lIGl0KS4gSW4gb3JkZXIgdG8KK2F2b2lkIGxvb3NpbmcgdGhlIHVzZXIncyB3b3JrLCB5b3Ugc2hvdWxkIHByb2FjdGl2ZWx5IHJldGFpbiBpdCBieSBpbXBsZW1lbnRpbmcgdGhlIHtAbGluaworYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TYXZlSW5zdGFuY2VTdGF0ZSBvblNhdmVJbnN0YW5jZVN0YXRlKCl9IGNhbGxiYWNrCittZXRob2RzIGluIHlvdXIgYWN0aXZpdHkuPC9wPgorCis8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gc2F2ZSB5b3VyIGFjdGl2aXR5IHN0YXRlLCBzZWUgdGhlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy9hY3Rpdml0aWVzLmh0bWwjU2F2aW5nQWN0aXZpdHlTdGF0ZSI+QWN0aXZpdGllczwvYT4KK2RvY3VtZW50LjwvcD4KKworCisKKzxoMiBpZD0iTWFuYWdpbmdUYXNrcyI+TWFuYWdpbmcgVGFza3M8L2gyPgorCis8cD5UaGUgd2F5IEFuZHJvaWQgbWFuYWdlcyB0YXNrcyBhbmQgdGhlIGJhY2sgc3RhY2ssIGFzIGRlc2NyaWJlZCBhYm92ZSZtZGFzaDtieSBwbGFjaW5nIGFsbAorYWN0aXZpdGllcyBzdGFydGVkIGluIHN1Y2Nlc3Npb24gaW4gdGhlIHNhbWUgdGFzayBhbmQgaW4gYSAibGFzdCBpbiwgZmlyc3Qgb3V0IiBzdGFjayZtZGFzaDt3b3JrcworZ3JlYXQgZm9yIG1vc3QgYXBwbGljYXRpb25zIGFuZCB5b3Ugc2hvdWxkbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgaG93IHlvdXIgYWN0aXZpdGllcyBhcmUgYXNzb2NpYXRlZAord2l0aCB0YXNrcyBvciBob3cgdGhleSBleGlzdCBpbiB0aGUgYmFjayBzdGFjay4gSG93ZXZlciwgeW91IG1pZ2h0IGRlY2lkZSB0aGF0IHlvdSB3YW50IHRvIGludGVycnVwdAordGhlIG5vcm1hbCBiZWhhdmlvci4gUGVyaGFwcyB5b3Ugd2FudCBhbiBhY3Rpdml0eSBpbiB5b3VyIGFwcGxpY2F0aW9uIHRvIGJlZ2luIGEgbmV3IHRhc2sgd2hlbiBpdCBpcworc3RhcnRlZCAoaW5zdGVhZCBvZiBiZWluZyBwbGFjZWQgd2l0aGluIHRoZSBjdXJyZW50IHRhc2spOyBvciwgd2hlbiB5b3Ugc3RhcnQgYW4gYWN0aXZpdHksIHlvdSB3YW50Cit0byBicmluZyBmb3J3YXJkIGFuIGV4aXN0aW5nIGluc3RhbmNlIG9mIGl0IChpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3CitpbnN0YW5jZSBvbiB0b3Agb2YgdGhlIGJhY2sgc3RhY2spOyBvciwgeW91IHdhbnQgeW91ciBiYWNrIHN0YWNrIHRvIGJlIGNsZWFyZWQgb2YgYWxsCithY3Rpdml0aWVzc3RhcnQgYW4gYWN0aXZpdHkgZXhjZXB0IGZvciB0aGUgcm9vdCBhY3Rpdml0eSB3aGVuIHRoZSB1c2VyIGxlYXZlcyB0aGUgdGFzay48L3A+CisKKzxwPllvdSBjYW4gZG8gdGhlc2UgdGhpbmdzIGFuZCBtb3JlLCB3aXRoIGF0dHJpYnV0ZXMgaW4gdGhlCis8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCI+e0Bjb2RlCismbHQ7YWN0aXZpdHkmZ3Q7fTwvYT4gbWFuaWZlc3QgZWxlbWVudCBhbmQgd2l0aCBmbGFncyBpbiB0aGUgaW50ZW50IHRoYXQgeW91IHBhc3MgdG8ge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNzdGFydEFjdGl2aXR5IHN0YXJ0QWN0aXZpdHkoKX0uPC9wPgorCis8cD5JbiB0aGlzIHJlZ2FyZCwgdGhlIHRoZSBwcmluY2lwYWwgPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sIj57QGNvZGUgJmx0O2FjdGl2aXR5Jmd0O308L2E+CithdHRyaWJ1dGVzIHlvdSBjYW4gdXNlIGFyZTo8L3A+CisKKzx1bCBjbGFzcz0ibm9saXN0Ij4KKyAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sI2FmZiI+e0Bjb2RlCit0YXNrQWZmaW5pdHl9PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNsbW9kZSI+e0Bjb2RlCitsYXVuY2hNb2RlfTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9hY3Rpdml0eS1lbGVtZW50Lmh0bWwjcmVwYXJlbnQiPntAY29kZQorYWxsb3dUYXNrUmVwYXJlbnRpbmd9PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNjbGVhciI+e0Bjb2RlCitjbGVhclRhc2tPbkxhdW5jaH08L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sI2Fsd2F5cyI+e0Bjb2RlCithbHdheXNSZXRhaW5UYXNrU3RhdGV9PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNmaW5pc2giPntAY29kZQorZmluaXNoT25UYXNrTGF1bmNofTwvYT48L2xpPgorPC91bD4KKworPHA+QW5kIHRoZSBwcmluY2lwYWwgaW50ZW50IGZsYWdzIHlvdSBjYW4gdXNlIGFyZTo8L3A+CisKKzx1bCBjbGFzcz0ibm9saXN0Ij4KKyAgPGxpPntAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50I0ZMQUdfQUNUSVZJVFlfTkVXX1RBU0t9PC9saT4KKyAgPGxpPntAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50I0ZMQUdfQUNUSVZJVFlfQ0xFQVJfVE9QfTwvbGk+CisgIDxsaT57QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudCNGTEFHX0FDVElWSVRZX1NJTkdMRV9UT1B9PC9saT4KKzwvdWw+CisKKzxwPkluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMsIHlvdSdsbCBzZWUgaG93IHlvdSBjYW4gdXNlIHRoZXNlIG1hbmlmZXN0IGF0dHJpYnV0ZXMgYW5kIGludGVudAorZmxhZ3MgdG8gZGVmaW5lIGhvdyBhY3Rpdml0aWVzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGFza3MgYW5kIGhvdyB0aGUgYmVoYXZlIGluIHRoZSBiYWNrIHN0YWNrLjwvcD4KKworCis8cCBjbGFzcz0iY2F1dGlvbiI+PHN0cm9uZz5DYXV0aW9uOjwvc3Ryb25nPiBNb3N0IGFwcGxpY2F0aW9ucyBzaG91bGQgbm90IGludGVycnVwdCB0aGUgZGVmYXVsdAorYmVoYXZpb3IgZm9yIGFjdGl2aXRpZXMgYW5kIHRhc2tzLiBJZiB5b3UgZGV0ZXJtaW5lIHRoYXQgaXQncyBuZWNlc3NhcnkgZm9yIHlvdXIgYWN0aXZpdHkgdG8gbW9kaWZ5Cit0aGUgZGVmYXVsdCBiZWhhdmlvcnMsIHVzZSBjYXV0aW9uIGFuZCBiZSBzdXJlIHRvIHRlc3QgdGhlIHVzYWJpbGl0eSBvZiB0aGUgYWN0aXZpdHkgZHVyaW5nCitsYXVuY2ggYW5kIHdoZW4gbmF2aWdhdGluZyBiYWNrIHRvIGl0IGZyb20gb3RoZXIgYWN0aXZpdGllcyBhbmQgdGFza3Mgd2l0aCB0aGUgQkFDSyBrZXkuIEJlIHN1cmUgCit0byB0ZXN0IGZvciBuYXZpZ2F0aW9uIGJlaGF2aW9ycyB0aGF0IG1pZ2h0IGNvbmZsaWN0IHdpdGggdGhlIHVzZXIncyBleHBlY3RlZCBiZWhhdmlvci48L3A+CisKKworPGgzIGlkPSJUYXNrTGF1bmNoTW9kZXMiPkRlZmluaW5nIGxhdW5jaCBtb2RlczwvaDM+CisKKzxwPkxhdW5jaCBtb2RlcyBhbGxvdyB5b3UgdG8gZGVmaW5lIGhvdyBhIG5ldyBpbnN0YW5jZSBvZiBhbiBhY3Rpdml0eSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlCitjdXJyZW50IHRhc2suIFlvdSBjYW4gZGVmaW5lIGRpZmZlcmVudCBsYXVuY2ggbW9kZXMgaW4gdHdvIHdheXM6PC9wPgorPHVsIGNsYXNzPSJub2xpc3QiPgorICA8bGk+PGEgaHJlZj0iI01hbmlmZXN0Rm9yVGFza3MiPlVzaW5nIHRoZSBtYW5pZmVzdCBmaWxlPC9hPgorICAgIDxwPldoZW4geW91IGRlY2xhcmUgYW4gYWN0aXZpdHkgaW4geW91ciBtYW5pZmVzdCBmaWxlLCB5b3UgY2FuIHNwZWNpZnkgaG93IHRoZSBhY3Rpdml0eQorc2hvdWxkIGFzc29jaWF0ZSB3aXRoIHRhc2tzIHdoZW4gaXQgc3RhcnRzLjwvbGk+CisgIDxsaT48YSBocmVmPSIjSW50ZW50RmxhZ3NGb3JUYXNrcyI+VXNpbmcgSW50ZW50IGZsYWdzPC9hPgorICAgIDxwPldoZW4geW91IGNhbGwge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I3N0YXJ0QWN0aXZpdHkgc3RhcnRBY3Rpdml0eSgpfSwKK3lvdSBjYW4gaW5jbHVkZSBhIGZsYWcgaW4gdGhlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50fSB0aGF0IGRlY2xhcmVzIGhvdyAob3IKK3doZXRoZXIpIHRoZSBuZXcgYWN0aXZpdHkgc2hvdWxkIGFzc29jaWF0ZSB3aXRoIHRoZSBjdXJyZW50IHRhc2suPC9wPjwvbGk+Cis8L3VsPgorCis8cD5BcyBzdWNoLCBpZiBBY3Rpdml0eSBBIHN0YXJ0cyBBY3Rpdml0eSBCLCBBY3Rpdml0eSBCIGNhbiBkZWZpbmUgaW4gaXRzIG1hbmlmZXN0IGhvdyBpdAorc2hvdWxkIGFzc29jaWF0ZSB3aXRoIHRoZSBjdXJyZW50IHRhc2sgKGlmIGF0IGFsbCkgYW5kIEFjdGl2aXR5IEEgY2FuIGFsc28gcmVxdWVzdCBob3cgQWN0aXZpdHkKK0Igc2hvdWxkIGFzc29jaWF0ZSB3aXRoIGN1cnJlbnQgdGFzay4gSWYgYm90aCBhY3Rpdml0aWVzIGRlZmluZSBob3cgQWN0aXZpdHkgQgorc2hvdWxkIGFzc29jaWF0ZSB3aXRoIGEgdGFzaywgdGhlbiBBY3Rpdml0eSBBJ3MgcmVxdWVzdCAoYXMgZGVmaW5lZCBpbiB0aGUgaW50ZW50KSBpcyBob25vcmVkCitvdmVyIEFjdGl2aXR5IEIncyByZXF1ZXN0IChhcyBkZWZpbmVkIGluIGl0cyBtYW5pZmVzdCkuPC9wPgorCis8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBTb21lIHRoZSBsYXVuY2ggbW9kZXMgYXZhaWxhYmxlIGluIHRoZSBtYW5pZmVzdAorYXJlIG5vdCBhdmFpbGFibGUgYXMgZmxhZ3MgZm9yIGFuIGludGVudCBhbmQsIGxpa2V3aXNlLCBzb21lIGxhdW5jaCBtb2RlcyBhdmFpbGFibGUgYXMgZmxhZ3MKK2ZvciBhbiBpbnRlbnQgY2Fubm90IGJlIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0LjwvcD4KKworCis8aDQgaWQ9Ik1hbmlmZXN0Rm9yVGFza3MiPlVzaW5nIHRoZSBtYW5pZmVzdCBmaWxlPC9oND4KKworPHA+V2hlbiBkZWNsYXJpbmcgYW4gYWN0aXZpdHkgaW4geW91ciBtYW5pZmVzdCBmaWxlLCB5b3UgY2FuIHNwZWNpZnkgaG93IHRoZSBhY3Rpdml0eSBzaG91bGQKK2Fzc29jaWF0ZSB3aXRoIGEgdGFzayB1c2luZyB0aGUgPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sIj57QGNvZGUgJmx0O2FjdGl2aXR5Jmd0O308L2E+CitlbGVtZW50J3MgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9hY3Rpdml0eS1lbGVtZW50Lmh0bWwjbG1vZGUiPntAY29kZQorbGF1bmNoTW9kZX08L2E+IGF0dHJpYnV0ZS48L3A+CisKKzxwPlRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNsbW9kZSI+e0Bjb2RlCitsYXVuY2hNb2RlfTwvYT4gYXR0cmlidXRlIHNwZWNpZmllcyBhbiBpbnN0cnVjdGlvbiBvbiBob3cgdGhlIGFjdGl2aXR5IHNob3VsZCBiZSBsYXVuY2hlZCBpbnRvIGEKK3Rhc2suIFRoZXJlIGFyZSBmb3VyIGRpZmZlcmVudCBsYXVuY2ggbW9kZXMgeW91IGNhbiBhc3NpZ24gdG8gdGhlCis8Y29kZT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNsbW9kZSI+bGF1bmNoTW9kZTwvYT48L2NvZGU+CithdHRyaWJ1dGU6PC9wPgorCis8ZGw+Cis8ZHQ+e0Bjb2RlICJzdGFuZGFyZCJ9ICh0aGUgZGVmYXVsdCBtb2RlKTwvZHQ+CisgIDxkZD5EZWZhdWx0LiBUaGUgc3lzdGVtIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGFjdGl2aXR5IGluIHRoZSB0YXNrIGZyb20KK3doaWNoIGl0IHdhcyBzdGFydGVkIGFuZCByb3V0ZXMgdGhlIGludGVudCB0byBpdC4gVGhlIGFjdGl2aXR5IGNhbiBiZSBpbnN0YW50aWF0ZWQgbXVsdGlwbGUgdGltZXMsCitlYWNoIGluc3RhbmNlIGNhbiBiZWxvbmcgdG8gZGlmZmVyZW50IHRhc2tzLCBhbmQgb25lIHRhc2sgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzLjwvZGQ+Cis8ZHQ+e0Bjb2RlICJzaW5nbGVUb3AifTwvZHQ+CisgIDxkZD5JZiBhbiBpbnN0YW5jZSBvZiB0aGUgYWN0aXZpdHkgYWxyZWFkeSBleGlzdHMgYXQgdGhlIHRvcCBvZiB0aGUgY3VycmVudCB0YXNrLCB0aGUgc3lzdGVtCityb3V0ZXMgdGhlIGludGVudCB0byB0aGF0IGluc3RhbmNlIHRocm91Z2ggYSBjYWxsIHRvIGl0cyB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I29uTmV3SW50ZW50IG9uTmV3SW50ZW50KCl9IG1ldGhvZCwgcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlCithY3Rpdml0eS4gVGhlIGFjdGl2aXR5IGNhbiBiZSBpbnN0YW50aWF0ZWQgbXVsdGlwbGUgdGltZXMsIGVhY2ggaW5zdGFuY2UgY2FuCitiZWxvbmcgdG8gZGlmZmVyZW50IHRhc2tzLCBhbmQgb25lIHRhc2sgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIChidXQgb25seSBpZiB0aGUgdGhlCithY3Rpdml0eSBhdCB0aGUgdG9wIG9mIHRoZSBiYWNrIHN0YWNrIGlzIDxlbT5ub3Q8L2VtPiBhbiBleGlzdGluZyBpbnN0YW5jZSBvZiB0aGUgYWN0aXZpdHkpLgorICA8cD5Gb3IgZXhhbXBsZSwgc3VwcG9zZSBhIHRhc2sncyBiYWNrIHN0YWNrIGNvbnNpc3RzIG9mIHJvb3QgYWN0aXZpdHkgQSB3aXRoIGFjdGl2aXRpZXMgQiwgQywKK2FuZCBEIG9uIHRvcCAodGhlIHN0YWNrIGlzIEEtQi1DLUQ7IEQgaXMgb24gdG9wKS4gQW4gaW50ZW50IGFycml2ZXMgZm9yIGFuIGFjdGl2aXR5IG9mIHR5cGUgRC4KK0lmIEQgaGFzIHRoZSBkZWZhdWx0IHtAY29kZSAic3RhbmRhcmQifSBsYXVuY2ggbW9kZSwgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGlzIGxhdW5jaGVkIGFuZCB0aGUKK3N0YWNrIGJlY29tZXMgQS1CLUMtRC1ELiBIb3dldmVyLCBpZiBEJ3MgbGF1bmNoIG1vZGUgaXMge0Bjb2RlICJzaW5nbGVUb3AifSwgdGhlIGV4aXN0aW5nIGluc3RhbmNlCitvZiBEIGlzIGRlbGl2ZXJkIHRoZSBpbnRlbnQgdGhyb3VnaCB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I29uTmV3SW50ZW50IG9uTmV3SW50ZW50KCl9LCBiZWNhdXNlIGl0J3MgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2smbWRhc2g7dGhlCitzdGFjayByZW1haW5zIEEtQi1DLUQuIEhvd2V2ZXIsIGlmIGFuIGludGVudCBhcnJpdmVzIGZvciBhbiBhY3Rpdml0eSBvZiB0eXBlIEIsIHRoZW4gYSBuZXcKK2luc3RhbmNlIG9mIEIgaXMgYWRkZWQgdG8gdGhlIHN0YWNrLCBldmVuIGlmIGl0cyBsYXVuY2ggbW9kZSBpcyB7QGNvZGUgInNpbmdsZVRvcCJ9LjwvcD4KKyAgPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gV2hlbiBhIG5ldyBpbnN0YW5jZSBvZiBhbiBhY3Rpdml0eSBpcyBjcmVhdGVkLAordGhlIHVzZXIgY2FuIHByZXNzIHRoZSBCQUNLIGtleSB0byByZXR1cm4gdG8gdGhlIHByZXZpb3VzIGFjdGl2aXR5LiBCdXQgd2hlbiBhbiBleGlzdGluZyBpbnN0YW5jZSBvZgorYW4gYWN0aXZpdHkgaGFuZGxlcyBhIG5ldyBpbnRlbnQsIHRoZSB1c2VyIGNhbm5vdCBwcmVzcyB0aGUgQkFDSyBrZXkgdG8gcmV0dXJuIHRvIHRoZSBzdGF0ZSBvZgordGhlIGFjdGl2aXR5IGJlZm9yZSB0aGUgbmV3IGludGVudCBhcnJpdmVkIGluIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbk5ld0ludGVudAorb25OZXdJbnRlbnQoKX0uPC9wPgorPC9kZD4KKworPGR0PntAY29kZSAic2luZ2xlVGFzayJ9PC9kdD4KKyAgPGRkPlRoZSBzeXN0ZW0gY3JlYXRlcyBhIG5ldyB0YXNrIGFuZCBpbnN0YW50aWF0ZXMgdGhlIGFjdGl2aXR5IGF0IHRoZSByb290IG9mIHRoZSBuZXcgdGFzay4KK0hvd2V2ZXIsIGlmIGFuIGluc3RhbmNlIG9mIHRoZSBhY3Rpdml0eSBhbHJlYWR5IGV4aXN0cyBpbiBhIHNlcGFyYXRlIHRhc2ssIHRoZSBzeXN0ZW0gcm91dGVzIHRoZQoraW50ZW50IHRvIHRoZSBleGlzdGluZyBpbnN0YW5jZSB0aHJvdWdoIGEgY2FsbCB0byBpdHMge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNvbk5ld0ludGVudCBvbk5ld0ludGVudCgpfSBtZXRob2QsIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlLiBPbmx5CitvbmUgaW5zdGFuY2Ugb2YgdGhlIGFjdGl2aXR5IGNhbiBleGlzdCBhdCBhIHRpbWUuCisgIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEFsdGhvdWdoIHRoZSBhY3Rpdml0eSBzdGFydHMgaW4gYSBuZXcgdGFzaywgdGhlCitCQUNLIGtleSBzdGlsbCByZXR1cm5zIHRoZSB1c2VyIHRvIHRoZSBwcmV2aW91cyBhY3Rpdml0eS48L3A+PC9kZD4KKzxkdD57QGNvZGUgInNpbmdsZUluc3RhbmNlIn0uPC9kdD4KKyAgPGRkPlNhbWUgYXMge0Bjb2RlICJzaW5nbGVUYXNrIn0sIGV4Y2VwdCB0aGF0IHRoZSBzeXN0ZW0gZG9lc24ndCBsYXVuY2ggYW55IG90aGVyIGFjdGl2aXRpZXMgaW50bwordGhlIHRhc2sgaG9sZGluZyB0aGUgaW5zdGFuY2UuIFRoZSBhY3Rpdml0eSBpcyBhbHdheXMgdGhlIHNpbmdsZSBhbmQgb25seSBtZW1iZXIgb2YgaXRzIHRhc2s7CithbnkgYWN0aXZpdGllcyBzdGFydGVkIGJ5IHRoaXMgb25lIG9wZW4gaW4gYSBzZXBhcmF0ZSB0YXNrLjwvZGQ+Cis8L2RsPgorCisKKzxwPkFzIGFub3RoZXIgZXhhbXBsZSwgdGhlIEFuZHJvaWQgQnJvd3NlciBhcHBsaWNhdGlvbiBkZWNsYXJlcyB0aGF0IHRoZSB3ZWIgYnJvd3NlciBhY3Rpdml0eSBzaG91bGQKK2Fsd2F5cyBvcGVuIGluIGl0cyBvd24gdGFzayZtZGFzaDtieSBzcGVjaWZ5aW5nIHRoZSB7QGNvZGUgc2luZ2xlVGFza30gbGF1bmNoIG1vZGUgaW4gdGhlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCI+e0Bjb2RlICZsdDthY3Rpdml0eSZndDt9PC9hPiBlbGVtZW50LgorVGhpcyBtZWFucyB0aGF0IGlmIHlvdXIgYXBwbGljYXRpb24gaXNzdWVzIGFuCitpbnRlbnQgdG8gb3BlbiB0aGUgQW5kcm9pZCBCcm93c2VyLCBpdHMgYWN0aXZpdHkgaXMgPGVtPm5vdDwvZW0+IHBsYWNlZCBpbiB0aGUgc2FtZQordGFzayBhcyB5b3VyIGFwcGxpY2F0aW9uLiBJbnN0ZWFkLCBlaXRoZXIgYSBuZXcgdGFzayBzdGFydHMgZm9yIHRoZSBCcm93c2VyIG9yLCBpZiB0aGUgQnJvd3NlcgorYWxyZWFkeSBoYXMgYSB0YXNrIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQsIHRoYXQgdGFzayBpcyBicm91Z2h0IGZvcndhcmQgdG8gaGFuZGxlIHRoZSBuZXcKK2ludGVudC48L3A+CisKKzxwPlJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbiBhY3Rpdml0eSBzdGFydHMgaW4gYSBuZXcgdGFzayBvciBpbiB0aGUgc2FtZSB0YXNrIGFzIHRoZSBhY3Rpdml0eSB0aGF0CitzdGFydGVkIGl0LCB0aGUgQkFDSyBrZXkgYWx3YXlzIHRha2VzIHRoZSB1c2VyIHRvIHRoZSBwcmV2aW91cyBhY3Rpdml0eS4gSG93ZXZlciwgaWYgeW91CitzdGFydCBhbiBhY3Rpdml0eSBmcm9tIHlvdXIgdGFzayAoVGFzayBBKSB0aGF0IHNwZWNpZmllcyB0aGUge0Bjb2RlIHNpbmdsZVRhc2t9IGxhdW5jaCBtb2RlLCB0aGVuCit0aGF0IGFjdGl2aXR5IG1pZ2h0IGhhdmUgYW4gaW5zdGFuY2UgaW4gdGhlIGJhY2tncm91bmQgdGhhdCBiZWxvbmdzIHRvIGEgdGFzayB3aXRoIGl0cyBvd24gYmFjaworc3RhY2sgKFRhc2sgQikuIEluIHRoaXMKK2Nhc2UsIHdoZW4gVGFzayBCIGlzIGJyb3VnaHQgZm9yd2FyZCB0byBoYW5kbGUgYSBuZXcgaW50ZW50LCB0aGUgQkFDSyBrZXkgZmlyc3QgbmF2aWdhdGVzCitiYWNrd2FyZCB0aHJvdWdoIHRoZSBhY3Rpdml0aWVzIGluIFRhc2sgQiBiZWZvcmUgcmV0dXJuaW5nIHRvCit0aGUgdG9wLW1vc3QgYWN0aXZpdHkgaW4gVGFzayBBLiBGaWd1cmUgNCB2aXN1YWxpemVzIHRoaXMgdHlwZSBvZiBzY2VuYXJpby48L3A+CisKKzxpbWcgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL2Z1bmRhbWVudGFscy9kaWFncmFtX2JhY2tzdGFja19zaW5nbGV0YXNrX211bHRpYWN0aXZpdHkucG5nIiBhbHQ9IiIgLz4KKzxwIGNsYXNzPSJpbWctY2FwdGlvbiI+PHN0cm9uZz5GaWd1cmUgNC48L3N0cm9uZz4gQSByZXByZXNlbnRhdGlvbiBvZiBob3cgYW4gYWN0aXZpdHkgd2l0aAorbGF1bmNoIG1vZGUgInNpbmdsZVRhc2siIGlzIGFkZGVkIHRvIHRoZSBiYWNrIHN0YWNrLiBJZiB0aGUgYWN0aXZpdHkgaXMgYWxyZWFkeSBhIHBhcnQgb2YgYQorYmFja2dyb3VuZCB0YXNrIHdpdGggaXRzIG93biBiYWNrIHN0YWNrIChUYXNrIEIpLCB0aGVuIHRoZSBlbnRpcmUgYmFjayBzdGFjayBhbHNvIGNvbWVzCitmb3J3YXJkLCBvbiB0b3Agb2YgdGhlIGN1cnJlbnQgdGFzayAoVGFzayBBKS48L3A+CisKKzxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHVzaW5nIGxhdW5jaCBtb2RlcyBpbiB0aGUgbWFuaWZlc3QgZmlsZSwgc2VlIHRoZQorPGNvZGU+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9hY3Rpdml0eS1lbGVtZW50Lmh0bWwiPiZsdDthY3Rpdml0eSZndDs8L2E+PC9jb2RlPgorZWxlbWVudCBkb2N1bWVudGF0aW9uLCB3aGVyZSB0aGUge0Bjb2RlIGxhdW5jaE1vZGV9IGF0dHJpYnV0ZSBhbmQgdGhlIGFjY2VwdGVkIHZhbHVlcyBhcmUKK2Rpc2N1c3NlZCBtb3JlLjwvcD4KKworPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIGJlaGF2aW9ycyB0aGF0IHlvdSBzcGVjaWZ5IGZvciB5b3VyIGFjdGl2aXR5IHdpdGggdGhlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNsbW9kZSI+e0Bjb2RlIGxhdW5jaE1vZGV9PC9hPiBhdHRyaWJ1dGUKK2NhbiBiZSBvdmVycmlkZW4gYnkgZmxhZ3MgaW5jbHVkZWQgd2l0aCB0aGUgaW50ZW50IHRoYXQgc3RhcnQgeW91ciBhY3Rpdml0eSwgYXMgZGlzY3Vzc2VkIGluIHRoZQorbmV4dCBzZWN0aW9uLjwvcD4KKworCisKKzxoNCBpZD0iI0ludGVudEZsYWdzRm9yVGFza3MiPlVzaW5nIEludGVudCBmbGFnczwvaDQ+CisKKzxwPldoZW4gc3RhcnRpbmcgYW4gYWN0aXZpdHksIHlvdSBjYW4gbW9kaWZ5IHRoZSBkZWZhdWx0IGFzc29jaWF0aW9uIG9mIGFuIGFjdGl2aXR5IHRvIGl0cyB0YXNrCitieSBpbmNsdWRpbmcgZmxhZ3MgaW4gdGhlIGludGVudCB0aGF0IHlvdSBkZWxpdmVyIHRvIHtAbGluaworYW5kcm9pZC5hcHAuQWN0aXZpdHkjc3RhcnRBY3Rpdml0eSBzdGFydEFjdGl2aXR5KCl9LiBUaGUgZmxhZ3MgeW91IGNhbiB1c2UgdG8gbW9kaWZ5IHRoZQorZGVmYXVsdCBiZWhhdmlvciBhcmU6PC9wPgorCis8cD4KKyAgPGR0PntAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50I0ZMQUdfQUNUSVZJVFlfTkVXX1RBU0t9PC9kdD4KKyAgICA8ZGQ+U3RhcnQgdGhlIGFjdGl2aXR5IGluIGEgbmV3IHRhc2suIElmIGEgdGFzayBpcyBhbHJlYWR5IHJ1bm5pbmcgZm9yIHRoZSBhY3Rpdml0eSB5b3UgYXJlIG5vdworc3RhcnRpbmcsIHRoYXQgdGFzayBpcyBicm91Z2h0IHRvIHRoZSBmb3JlZ3JvdW5kIHdpdGggaXRzIGxhc3Qgc3RhdGUgcmVzdG9yZWQgYW5kIHRoZSBhY3Rpdml0eQorcmVjZWl2ZXMgdGhlIG5ldyBpbnRlbnQgaW4ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uTmV3SW50ZW50IG9uTmV3SW50ZW50KCl9LiAKKyAgICA8cD5UaGlzIHByb2R1Y2VzIHRoZSBzYW1lIGJlaGF2aW9yIGFzIHRoZSB7QGNvZGUgInNpbmdsZVRhc2sifSA8YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9hY3Rpdml0eS1lbGVtZW50Lmh0bWwjbG1vZGUiPntAY29kZSBsYXVuY2hNb2RlfTwvYT4gdmFsdWUsCitkaXNjdXNzZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24uPC9wPjwvZGQ+CisgIDxkdD57QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudCNGTEFHX0FDVElWSVRZX1NJTkdMRV9UT1B9PC9kdD4KKyAgICA8ZGQ+SWYgdGhlIGFjdGl2aXR5IGJlaW5nIHN0YXJ0ZWQgaXMgdGhlIGN1cnJlbnQgYWN0aXZpdHkgKGF0IHRoZSB0b3Agb2YgdGhlIGJhY2sgc3RhY2spLCB0aGVuCit0aGUgZXhpc3RpbmcgaW5zdGFuY2UgcmVjZWl2ZXMgYSBjYWxsIHRvIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbk5ld0ludGVudCBvbk5ld0ludGVudCgpfSwKK2luc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGFjdGl2aXR5LgorICAgIDxwPlRoaXMgcHJvZHVjZXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlIHtAY29kZSAic2luZ2xlVG9wIn0gPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sI2xtb2RlIj57QGNvZGUgbGF1bmNoTW9kZX08L2E+IHZhbHVlLAorZGlzY3Vzc2VkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLjwvcD48L2RkPgorICA8ZHQ+e0BsaW5rIGFuZHJvaWQuY29udGVudC5JbnRlbnQjRkxBR19BQ1RJVklUWV9DTEVBUl9UT1B9PC9kdD4KKyAgICA8ZGQ+SWYgdGhlIGFjdGl2aXR5IGJlaW5nIHN0YXJ0ZWQgaXMgYWxyZWFkeSBydW5uaW5nIGluIHRoZSBjdXJyZW50IHRhc2ssIHRoZW4gaW5zdGVhZAorb2YgbGF1bmNoaW5nIGEgbmV3IGluc3RhbmNlIG9mIHRoYXQgYWN0aXZpdHksIGFsbCBvZiB0aGUgb3RoZXIgYWN0aXZpdGllcyBvbiB0b3Agb2YgaXQgYXJlCitkZXN0cm95ZWQgYW5kIHRoaXMgaW50ZW50IGlzIGRlbGl2ZXJlZCB0byB0aGUgcmVzdW1lZCBpbnN0YW5jZSBvZiB0aGUgYWN0aXZpdHkgKG5vdyBvbiB0b3ApLAordGhyb3VnaCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25OZXdJbnRlbnQgb25OZXdJbnRlbnQoKX0pLgorICAgIDxwPlRoZXJlIGlzIG5vIHZhbHVlIGZvciB0aGUgPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sI2xtb2RlIj57QGNvZGUgbGF1bmNoTW9kZX08L2E+CithdHRyaWJ1dGUgdGhhdCBwcm9kdWNlcyB0aGlzIGJlaGF2aW9yLjwvcD4KKyAgICA8cD57QGNvZGUgRkxBR19BQ1RJVklUWV9DTEVBUl9UT1B9IGlzIG1vc3Qgb2Z0ZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHtAY29kZQorRkxBR19BQ1RJVklUWV9ORVdfVEFTS30uICBXaGVuIHVzZWQgdG9nZXRoZXIsIHRoZXNlIGZsYWdzIGFyZSBhIHdheSBvZiBsb2NhdGluZyBhbiBleGlzdGluZyBhY3Rpdml0eQoraW4gYW5vdGhlciB0YXNrIGFuZCBwdXR0aW5nIGl0IGluIGEgcG9zaXRpb24gd2hlcmUgaXQgY2FuIHJlc3BvbmQgdG8gdGhlIGludGVudC4gPC9wPgorICAgIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHRoZSBsYXVuY2ggbW9kZSBvZiB0aGUgZGVzaWduYXRlZCBhY3Rpdml0eSBpcyB7QGNvZGUKKyJzdGFuZGFyZCJ9LCBpdCB0b28gaXMgcmVtb3ZlZCBmcm9tIHRoZSBzdGFjayBhbmQgYSBuZXcgaW5zdGFuY2UgaXMgbGF1bmNoZWQgaW4gaXRzIHBsYWNlIHRvIGhhbmRsZQordGhlIGluY29taW5nIGludGVudC4gIFRoYXQncyBiZWNhdXNlIGEgbmV3IGluc3RhbmNlIGlzIGFsd2F5cyBjcmVhdGVkIGZvciBhIG5ldyBpbnRlbnQgd2hlbiB0aGUKK2xhdW5jaCBtb2RlIGlzIHtAY29kZSAic3RhbmRhcmQifS4gPC9wPgorPC9kZD4KKzwvZGw+CisKKworCisKKworPGgzIGlkPSJBZmZpbml0aWVzIj5IYW5kbGluZyBhZmZpbml0aWVzPC9oMz4KKworPHA+VGhlIDxlbT5hZmZpbml0eTwvZW0+IGluZGljYXRlcyB3aGljaCB0YXNrIGFuIGFjdGl2aXR5IHByZWZlcnMgdG8gYmVsb25nIHRvLiBCeSBkZWZhdWx0LCBhbGwgdGhlCithY3Rpdml0aWVzIGZyb20gdGhlIHNhbWUgYXBwbGljYXRpb24gaGF2ZSBhbiBhZmZpbml0eSBmb3IgZWFjaCBvdGhlci4gU28sIGJ5IGRlZmF1bHQsIGFsbAorYWN0aXZpdGllcyBpbiB0aGUgc2FtZSBhcHBsaWNhdGlvbiBwcmVmZXIgdG8gYmUgaW4gdGhlIHNhbWUgdGFzay4gSG93ZXZlciwgeW91IGNhbiBtb2RpZnkKK3RoZSBkZWZhdWx0IGFmZmluaXR5IGZvciBhbiBhY3Rpdml0eS4gQWN0aXZpdGllcyBkZWZpbmVkIGluCitkaWZmZXJlbnQgYXBwbGljYXRpb25zIGNhbiBzaGFyZSBhbiBhZmZpbml0eSwgb3IgYWN0aXZpdGllcyBkZWZpbmVkIGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uIGNhbiBiZQorYXNzaWduZWQgZGlmZmVyZW50IHRhc2sgYWZmaW5pdGllcy48L3A+CisKKzxwPllvdSBjYW4gbW9kaWZ5IHRoZSBhZmZpbml0eSBmb3IgYW55IGdpdmVuIGFjdGl2aXR5IHdpdGggdGhlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNhZmYiPntAY29kZSB0YXNrQWZmaW5pdHl9PC9hPiBhdHRyaWJ1dGUKK29mIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCI+e0Bjb2RlICZsdDthY3Rpdml0eSZndDt9PC9hPgorZWxlbWVudC48L3A+CisKKzxwPlRoZSA8YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9hY3Rpdml0eS1lbGVtZW50Lmh0bWwjYWZmIj57QGNvZGUgdGFza0FmZmluaXR5fTwvYT4KK2F0dHJpYnV0ZSB0YWtlcyBhIHN0cmluZyB2YWx1ZSwgd2hpY2ggbXVzdCBiZSB1bmlxdWUgZnJvbSB0aGUgZGVmYXVsdCBwYWNrYWdlIG5hbWUKK2RlY2xhcmVkIGluIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L21hbmlmZXN0LWVsZW1lbnQuaHRtbCI+e0Bjb2RlCismbHQ7bWFuaWZlc3QmZ3Q7fTwvYT4gZWxlbWVudCwgYmVjYXVzZSB0aGUgc3lzdGVtIHVzZXMgdGhhdCBuYW1lIHRvIGlkZW50aWZ5IHRoZSBkZWZhdWx0IHRhc2sKK2FmZmluaXR5IGZvciB0aGUgYXBwbGljYXRpb24uPC9wPgorCis8cD5UaGUgYWZmaW5pdHkgY29tZXMgaW50byBwbGF5IGluIHR3byBjaXJjdW1zdGFuY2VzOjwvcD4KKzx1bD4KKyAgPGxpPldoZW4gdGhlIGludGVudCB0aGF0IGxhdW5jaGVzIGFuIGFjdGl2aXR5IGNvbnRhaW5zIHRoZSB7QGxpbmsKK2FuZHJvaWQuY29udGVudC5JbnRlbnQjRkxBR19BQ1RJVklUWV9ORVdfVEFTS30gZmxhZy4KKworPHA+QSBuZXcgYWN0aXZpdHkgaXMsIGJ5IGRlZmF1bHQsIGxhdW5jaGVkIGludG8gdGhlIHRhc2sgb2YgdGhlIGFjdGl2aXR5Cit0aGF0IGNhbGxlZCB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjc3RhcnRBY3Rpdml0eSBzdGFydEFjdGl2aXR5KCl9LiBJdCdzIHB1c2hlZCBvbnRvIHRoZSBzYW1lCitiYWNrIHN0YWNrIGFzIHRoZSBjYWxsZXIuICBIb3dldmVyLCBpZiB0aGUgaW50ZW50IHBhc3NlZCB0byB7QGxpbmsKK2FuZHJvaWQuYXBwLkFjdGl2aXR5I3N0YXJ0QWN0aXZpdHkgc3RhcnRBY3Rpdml0eSgpfSBjb250YWlucyB0aGUge0BsaW5rCithbmRyb2lkLmNvbnRlbnQuSW50ZW50I0ZMQUdfQUNUSVZJVFlfTkVXX1RBU0t9CitmbGFnLCB0aGUgc3lzdGVtIGxvb2tzIGZvciBhIGRpZmZlcmVudCB0YXNrIHRvIGhvdXNlIHRoZSBuZXcgYWN0aXZpdHkuIE9mdGVuLCBpdCdzIGEgbmV3IHRhc2suIAorSG93ZXZlciwgaXQgZG9lc24ndCBoYXZlIHRvIGJlLiAgSWYgdGhlcmUncyBhbHJlYWR5IGFuIGV4aXN0aW5nIHRhc2sgd2l0aCB0aGUgc2FtZSBhZmZpbml0eSBhcyB0aGUKK25ldyBhY3Rpdml0eSwgdGhlIGFjdGl2aXR5IGlzIGxhdW5jaGVkIGludG8gdGhhdCB0YXNrLiAgSWYgbm90LCBpdCBiZWdpbnMgYSBuZXcgdGFzay48L3A+CisKKzxwPklmIHRoaXMgZmxhZyBjYXVzZXMgYW4gYWN0aXZpdHkgdG8gYmVnaW4gYSBuZXcgdGFzayBhbmQgdGhlIHVzZXIgcHJlc3NlcyB0aGUgSE9NRSBrZXkgdG8gbGVhdmUKK2l0LCB0aGVyZSBtdXN0IGJlIHNvbWUgd2F5IGZvciB0aGUgdXNlciB0byBuYXZpZ2F0ZSBiYWNrIHRvIHRoZSB0YXNrLiBTb21lIGVudGl0aWVzIChzdWNoIGFzIHRoZQorbm90aWZpY2F0aW9uIG1hbmFnZXIpIGFsd2F5cyBzdGFydCBhY3Rpdml0aWVzIGluIGFuIGV4dGVybmFsIHRhc2ssIG5ldmVyIGFzIHBhcnQgb2YgdGhlaXIgb3duLCBzbwordGhleSBhbHdheXMgcHV0IHtAY29kZSBGTEFHX0FDVElWSVRZX05FV19UQVNLfSBpbiB0aGUgaW50ZW50cyB0aGV5IHBhc3MgdG8ge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNzdGFydEFjdGl2aXR5IHN0YXJ0QWN0aXZpdHkoKX0uICBJZiB5b3UgaGF2ZSBhbiBhY3Rpdml0eSB0aGF0IGNhbiBiZSBpbnZva2VkIGJ5CithbiBleHRlcm5hbCBlbnRpdHkgdGhhdCBtaWdodCB1c2UgdGhpcyBmbGFnLCB0YWtlIGNhcmUgdGhhdCB0aGUgdXNlciBoYXMgYSBpbmRlcGVuZGVudCB3YXkgdG8gZ2V0CitiYWNrIHRvIHRoZSB0YXNrIHRoYXQncyBzdGFydGVkLCBzdWNoIGFzIHdpdGggYSBsYXVuY2hlciBpY29uICh0aGUgcm9vdCBhY3Rpdml0eSBvZiB0aGUgdGFzaworaGFzIGEge0BsaW5rIGFuZHJvaWQuY29udGVudC5JbnRlbnQjQ0FURUdPUllfTEFVTkNIRVJ9IGludGVudCBmaWx0ZXI7IHNlZSB0aGUgPGEKK2hyZWY9IiNTdGFydGluZyI+U3RhcnRpbmcgYSB0YXNrPC9hPiBzZWN0aW9uIGJlbG93KS48L3A+Cis8L2xpPgorCisgIDxsaT5XaGVuIGFuIGFjdGl2aXR5IGhhcyBpdHMgPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sI3JlcGFyZW50Ij57QGNvZGUKK2FsbG93VGFza1JlcGFyZW50aW5nfTwvYT4gYXR0cmlidXRlIHNldCB0byB7QGNvZGUgInRydWUifS4KKyAgPHA+SW4gdGhpcyBjYXNlLCB0aGUgYWN0aXZpdHkgY2FuIG1vdmUgZnJvbSB0aGUgdGFzayBpdCBzdGFydHMgdG8gdGhlIHRhc2sgaXQgaGFzIGFuIGFmZmluaXR5Citmb3IsIHdoZW4gdGhhdCB0YXNrIGNvbWVzIHRvIHRoZSBmb3JlZ3JvdW5kLjwvcD4KKyAgPHA+Rm9yIGV4YW1wbGUsIHN1cHBvc2UgdGhhdCBhbiBhY3Rpdml0eSB0aGF0IHJlcG9ydHMgd2VhdGhlciBjb25kaXRpb25zIGluIHNlbGVjdGVkIGNpdGllcyBpcworZGVmaW5lZCBhcyBwYXJ0IG9mIGEgdHJhdmVsIGFwcGxpY2F0aW9uLiAgSXQgaGFzIHRoZSBzYW1lIGFmZmluaXR5IGFzIG90aGVyIGFjdGl2aXRpZXMgaW4gdGhlIHNhbWUKK2FwcGxpY2F0aW9uICh0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiBhZmZpbml0eSkgYW5kIGl0IGFsbG93cyByZS1wYXJlbnRpbmcgd2l0aCB0aGlzIGF0dHJpYnV0ZS4KK1doZW4gb25lIG9mIHlvdXIgYWN0aXZpdGllcyBzdGFydHMgdGhlIHdlYXRoZXIgcmVwb3J0ZXIgYWN0aXZpdHksIGl0IGluaXRpYWxseSBiZWxvbmdzIHRvIHRoZSBzYW1lCit0YXNrIGFzIHlvdXIgYWN0aXZpdHkuIEhvd2V2ZXIsIHdoZW4gdGhlIHRyYXZlbCBhcHBsaWNhdGlvbidzIHRhc2sgY29tZXMgdG8gdGhlIGZvcmVncm91bmQsIHRoZQord2VhdGhlciByZXBvcnRlciBhY3Rpdml0eSBpcyByZWFzc2lnbmVkIHRvIHRoYXQgdGFzayBhbmQgZGlzcGxheWVkIHdpdGhpbiBpdC48L3A+Cis8L2xpPgorPC91bD4KKworPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+VGlwOjwvc3Ryb25nPiBJZiBhbiB7QGNvZGUgLmFwa30gZmlsZSBjb250YWlucyBtb3JlIHRoYW4gb25lICJhcHBsaWNhdGlvbiIKK2Zyb20gdGhlIHVzZXIncyBwb2ludCBvZiB2aWV3LCB5b3UgcHJvYmFibHkgd2FudCB0byB1c2UgdGhlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNhZmYiPntAY29kZSB0YXNrQWZmaW5pdHl9PC9hPgorYXR0cmlidXRlIHRvIGFzc2lnbiBkaWZmZXJlbnQgYWZmaW5pdGllcyB0byB0aGUgYWN0aXZpdGllcyBhc3NvY2lhdGVkIHdpdGggZWFjaCAiYXBwbGljYXRpb24iLjwvcD4KKworCisKKzxoMyBpZD0iQ2xlYXJpbmciPkNsZWFyaW5nIHRoZSBiYWNrIHN0YWNrPC9oMz4KKworPHA+SWYgdGhlIHVzZXIgbGVhdmVzIGEgdGFzayBmb3IgYSBsb25nIHRpbWUsIHRoZSBzeXN0ZW0gY2xlYXJzIHRoZSB0YXNrIG9mIGFsbCBhY3Rpdml0aWVzIGV4Y2VwdAordGhlIHJvb3QgYWN0aXZpdHkuICBXaGVuIHRoZSB1c2VyIHJldHVybnMgdG8gdGhlIHRhc2sgYWdhaW4sIG9ubHkgdGhlIHJvb3QgYWN0aXZpdHkgaXMgcmVzdG9yZWQuCitUaGUgc3lzdGVtIGJlaGF2ZXMgdGhpcyB3YXksIGJlY2F1c2UsIGFmdGVyIGFuIGV4dGVuZGVkIGFtb3VudCBvZiB0aW1lLCB1c2VycyBsaWtlbHkgaGF2ZSBhYmFuZG9uZWQKK3doYXQgdGhleSB3ZXJlIGRvaW5nIGJlZm9yZSBhbmQgYXJlIHJldHVybmluZyB0byB0aGUgdGFzayB0byBiZWdpbiBzb21ldGhpbmcgbmV3LiA8L3A+CisKKzxwPlRoZXJlIGFyZSBzb21lIGFjdGl2aXR5IGF0dHJpYnV0ZXMgdGhhdCB5b3UgY2FuIHVzZSB0byBtb2RpZnkgdGhpcyBiZWhhdmlvcjogPC9wPgorCis8ZGw+Cis8ZHQ+PGNvZGU+PGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sI2Fsd2F5cyI+YWx3YXlzUmV0YWluVGFza1N0YXRlPC9hPjwvY29kZT4KKzwvZHQ+Cis8ZGQ+SWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHtAY29kZSAidHJ1ZSJ9IGluIHRoZSByb290IGFjdGl2aXR5IG9mIGEgdGFzaywKK3RoZSBkZWZhdWx0IGJlaGF2aW9yIGp1c3QgZGVzY3JpYmVkIGRvZXMgbm90IGhhcHBlbi4KK1RoZSB0YXNrIHJldGFpbnMgYWxsIGFjdGl2aXRpZXMgaW4gaXRzIHN0YWNrIGV2ZW4gYWZ0ZXIgYSBsb25nIHBlcmlvZC48L2RkPgorCis8ZHQ+PGNvZGU+PGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sI2NsZWFyIj5jbGVhclRhc2tPbkxhdW5jaDwvYT48L2NvZGU+PC9kdD4KKzxkZD5JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8ge0Bjb2RlICJ0cnVlIn0gaW4gdGhlIHJvb3QgYWN0aXZpdHkgb2YgYSB0YXNrLAordGhlIHN0YWNrIGlzIGNsZWFyZWQgZG93biB0byB0aGUgcm9vdCBhY3Rpdml0eSB3aGVuZXZlciB0aGUgdXNlciBsZWF2ZXMgdGhlIHRhc2sKK2FuZCByZXR1cm5zIHRvIGl0LiAgSW4gb3RoZXIgd29yZHMsIGl0J3MgdGhlIG9wcG9zaXRlIG9mIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNhbHdheXMiPntAY29kZQorYWx3YXlzUmV0YWluVGFza1N0YXRlfTwvYT4uICBUaGUgdXNlciBhbHdheXMgcmV0dXJucyB0byB0aGUgdGFzayBpbiBpdHMKK2luaXRpYWwgc3RhdGUsIGV2ZW4gYWZ0ZXIgYSBsZWF2aW5nIHRoZSB0YXNrIGZvciBvbmx5IGEgbW9tZW50LjwvZGQ+CisKKzxkdD48Y29kZT48YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9hY3Rpdml0eS1lbGVtZW50Lmh0bWwjZmluaXNoIj5maW5pc2hPblRhc2tMYXVuY2g8L2E+PC9jb2RlPgorPC9kdD4KKzxkZD5UaGlzIGF0dHJpYnV0ZSBpcyBsaWtlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNjbGVhciI+e0Bjb2RlIGNsZWFyVGFza09uTGF1bmNofTwvYT4sCitidXQgaXQgb3BlcmF0ZXMgb24gYQorc2luZ2xlIGFjdGl2aXR5LCBub3QgYW4gZW50aXJlIHRhc2suICBJdCBjYW4gYWxzbyBjYXVzZSBhbnkgYWN0aXZpdHkgdG8gZ28KK2F3YXksIGluY2x1ZGluZyB0aGUgcm9vdCBhY3Rpdml0eS4gIFdoZW4gaXQncyBzZXQgdG8ge0Bjb2RlICJ0cnVlIn0sIHRoZQorYWN0aXZpdHkgcmVtYWlucyBwYXJ0IG9mIHRoZSB0YXNrIG9ubHkgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiB0aGUgdXNlcgorbGVhdmVzIGFuZCB0aGVuIHJldHVybnMgdG8gdGhlIHRhc2ssIGl0IGlzIG5vIGxvbmdlciBwcmVzZW50LjwvZGQ+Cis8L2RsPgorCisKKworCis8aDMgaWQ9IlN0YXJ0aW5nIj5TdGFydGluZyBhIHRhc2s8L2gzPgorCis8cD5Zb3UgY2FuIHNldCB1cCBhbiBhY3Rpdml0eSBhcyB0aGUgZW50cnkgcG9pbnQgZm9yIGEgdGFzayBieSBnaXZpbmcgaXQgYW4gaW50ZW50IGZpbHRlciB3aXRoCit7QGNvZGUgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIn0gYXMgdGhlIHNwZWNpZmllZCBhY3Rpb24gYW5kIHtAY29kZQorImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIn0gYXMgdGhlIHNwZWNpZmllZCBjYXRlZ29yeS4gRm9yIGV4YW1wbGU6PC9wPgorCis8cHJlPgorJmx0O2FjdGl2aXR5IC4uLiAmZ3Q7CisgICAgJmx0O2ludGVudC1maWx0ZXIgLi4uICZndDsKKyAgICAgICAgJmx0O2FjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvJmd0OworICAgICAgICAmbHQ7Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLyZndDsKKyAgICAmbHQ7L2ludGVudC1maWx0ZXImZ3Q7CisgICAgLi4uCismbHQ7L2FjdGl2aXR5Jmd0OworPC9wcmU+CisKKzxwPkFuIGludGVudCBmaWx0ZXIgb2YgdGhpcyBraW5kIGNhdXNlcyBhbiBpY29uIGFuZCBsYWJlbCBmb3IgdGhlCithY3Rpdml0eSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGFwcGxpY2F0aW9uIGxhdW5jaGVyLCBnaXZpbmcgdXNlcnMgYSB3YXkgdG8gbGF1bmNoIHRoZSBhY3Rpdml0eSBhbmQKK3RvIHJldHVybiB0byB0aGUgdGFzayB0aGF0IGl0IGNyZWF0ZXMgYW55IHRpbWUgYWZ0ZXIgaXQgaGFzIGJlZW4gbGF1bmNoZWQuCis8L3A+CisKKzxwPlRoaXMgc2Vjb25kIGFiaWxpdHkgaXMgaW1wb3J0YW50OiBVc2VycyBtdXN0IGJlIGFibGUgdG8gbGVhdmUgYSB0YXNrIGFuZCB0aGVuIGNvbWUgYmFjayB0byBpdAorbGF0ZXIgdXNpbmcgdGhpcyBhY3Rpdml0eSBsYXVuY2hlci4gIEZvciB0aGlzIHJlYXNvbiwgdGhlIHR3byA8YSBocmVmPSIjTGF1bmNoTW9kZXMiPmxhdW5jaAorbW9kZXM8L2E+IHRoYXQgbWFyayBhY3Rpdml0aWVzIGFzIGFsd2F5cyBpbml0aWF0aW5nIGEgdGFzaywge0Bjb2RlICJzaW5nbGVUYXNrIn0gYW5kICJ7QGNvZGUKKyJzaW5nbGVJbnN0YW5jZSJ9LCBzaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gdGhlIGFjdGl2aXR5IGhhcyBhbiB7QGxpbmsKK2FuZHJvaWQuY29udGVudC5JbnRlbnQjQUNUSU9OX01BSU59CithbmQgYSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudCNDQVRFR09SWV9MQVVOQ0hFUn0KK2ZpbHRlci4gSW1hZ2luZSwgZm9yIGV4YW1wbGUsIHdoYXQgY291bGQgaGFwcGVuIGlmIHRoZSBmaWx0ZXIgaXMgbWlzc2luZzogQW4gaW50ZW50IGxhdW5jaGVzIGEKK3tAY29kZSAic2luZ2xlVGFzayJ9IGFjdGl2aXR5LCBpbml0aWF0aW5nIGEgbmV3IHRhc2ssIGFuZCB0aGUgdXNlciBzcGVuZHMgc29tZSB0aW1lIHdvcmtpbmcgaW4KK3RoYXQgdGFzay4gIFRoZSB1c2VyIHRoZW4gcHJlc3NlcyB0aGUgSE9NRSBrZXkuIFRoZSB0YXNrIGlzIG5vdyBzZW50IHRvIHRoZSBiYWNrZ3JvdW5kIGFuZCBub3QKK3Zpc2libGUuIEJlY2F1c2UgaXQgaXMgbm90IHJlcHJlc2VudGVkIGluIHRoZSBhcHBsaWNhdGlvbiBsYXVuY2hlciwgdGhlIHVzZXIgaGFzIG5vIHdheSB0byByZXR1cm4gdG8KK3RoZSB0YXNrLgorPC9wPgorCis8cD5Gb3IgdGhvc2UgY2FzZXMgd2hlcmUgeW91IGRvbid0IHdhbnQgdGhlIHVzZXIgdG8gYmUgYWJsZSB0byByZXR1cm4gdG8gYW4gYWN0aXZpdHksIHNldCB0aGUKKyAgPGNvZGU+PGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5odG1sIj4mbHQ7YWN0aXZpdHkmZ3Q7PC9hPjwvY29kZT4gZWxlbWVudCdzCis8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNmaW5pc2giPntAY29kZQorZmluaXNoT25UYXNrTGF1bmNofTwvYT4gdG8ge0Bjb2RlICJ0cnVlIn0gKHNlZSA8YQoraHJlZj0iI0NsZWFyaW5nIj5DbGVhcmluZyB0aGUgc3RhY2s8L2E+KS48L3A+CisKKworCisKKzxoMj5CZWdpbm5lcidzIFBhdGg8L2gyPgorCis8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gdXNlIGludGVudHMgdG8KK2FjdGl2YXRlIG90aGVyIGFwcGxpY2F0aW9uIGNvbXBvbmVudHMgYW5kIHB1Ymxpc2ggdGhlIGludGVudHMgdG8gd2hpY2ggeW91ciBjb21wb25lbnRzCityZXNwb25kLCBjb250aW51ZSB3aXRoIHRoZSA8Yj48YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9pbnRlbnRzL2ludGVudHMtZmlsdGVycy5odG1sIj5JbnRlbnRzIGFuZCBJbnRlbnQKK0ZpbHRlcnM8L2E+PC9iPiBkb2N1bWVudC48L3A+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9zdHJpbmctcmVzb3VyY2UuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9zdHJpbmctcmVzb3VyY2UuamQKaW5kZXggODFjNWQ1NS4uMmRiMzhmMSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvc3RyaW5nLXJlc291cmNlLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3N0cmluZy1yZXNvdXJjZS5qZApAQCAtMTIsOCArMTIsOCBAQAogICAgIDxkZD5YTUwgcmVzb3VyY2UgdGhhdCBwcm92aWRlcyBhIHNpbmdsZSBzdHJpbmcuPC9kZD4KICAgPGR0PjxhIGhyZWY9IiNTdHJpbmdBcnJheSI+U3RyaW5nIEFycmF5PC9hPjwvZHQ+CiAgICAgPGRkPlhNTCByZXNvdXJjZSB0aGF0IHByb3ZpZGVzIGFuIGFycmF5IG9mIHN0cmluZ3MuPC9kZD4KLSAgPGR0PjxhIGhyZWY9IiNQbHVyYWxzIj5QbHVyYWxzPC9hPjwvZHQ+Ci0gICAgPGRkPlhNTCByZXNvdXJjZSB0aGF0IGNhcnJpZXMgZGlmZmVyZW50IHN0cmluZ3MgZm9yIGRpZmZlcmVudCBwbHVyYWxpemF0aW9ucworICA8ZHQ+PGEgaHJlZj0iI1BsdXJhbHMiPlF1YW50aXR5IFN0cmluZ3MgKFBsdXJhbHMpPC9hPjwvZHQ+CisgICAgPGRkPlhNTCByZXNvdXJjZSB0aGF0IGNhcnJpZXMgZGlmZmVyZW50IHN0cmluZ3MgZm9yIGRpZmZlcmVudCBxdWFudGl0aWVzCiAgICAgb2YgdGhlIHNhbWUgd29yZCBvciBwaHJhc2UuPC9kZD4KIDwvZGw+CiAKQEAgLTIxOCwxMyArMjE4LDMwIEBACiAKIAogCi08aDIgaWQ9IlBsdXJhbHMiPlBsdXJhbHM8L2gyPgorPGgyIGlkPSJQbHVyYWxzIj5RdWFudGl0eSBTdHJpbmdzIChQbHVyYWxzKTwvaDI+CiAKLTxwPkEgcGFpciBvZiBzdHJpbmdzIHRoYXQgZWFjaCBwcm92aWRlIGEgZGlmZmVyZW50IHBsdXJhbCBmb3JtIG9mIHRoZSBzYW1lIHdvcmQgb3IgcGhyYXNlLAotd2hpY2ggeW91IGNhbiBjb2xsZWN0aXZlbHkgcmVmZXJlbmNlIGZyb20gdGhlIGFwcGxpY2F0aW9uLiBXaGVuIHlvdSByZXF1ZXN0IHRoZSBwbHVyYWxzCi1yZXNvdXJjZSB1c2luZyBhIG1ldGhvZCBzdWNoIGFzIHtAbGluayBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyNnZXRRdWFudGl0eVN0cmluZyhpbnQsaW50KQotZ2V0UXVhbnRpdHlTdHJpbmcoKX0sIHlvdSBtdXN0IHBhc3MgYSAiY291bnQiLCB3aGljaCB3aWxsIGRldGVybWluZSB0aGUgcGx1cmFsIGZvcm0geW91Ci1yZXF1aXJlIGFuZCByZXR1cm4gdGhhdCBzdHJpbmcgdG8geW91LjwvcD4KKzxwPkRpZmZlcmVudCBsYW5ndWFnZXMgaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGdyYW1tYXRpY2FsIGFncmVlbWVudCB3aXRoIHF1YW50aXR5LiBJbiBFbmdsaXNoLAorZm9yIGV4YW1wbGUsIHRoZSBxdWFudGl0eSAxIGlzIGEgc3BlY2lhbCBjYXNlLiBXZSB3cml0ZSAiMSBib29rIiwgYnV0IGZvciBhbnkgb3RoZXIgcXVhbnRpdHkgd2UnZAord3JpdGUgIjxpPm48L2k+IGJvb2tzIi4gVGhpcyBkaXN0aW5jdGlvbiBiZXR3ZWVuIHNpbmd1bGFyIGFuZCBwbHVyYWwgaXMgdmVyeSBjb21tb24sIGJ1dCBvdGhlcgorbGFuZ3VhZ2VzIG1ha2UgZmluZXIgZGlzdGluY3Rpb25zLiBUaGUgZnVsbCBzZXQgc3VwcG9ydGVkIGJ5IEFuZHJvaWQgaXMgPGNvZGU+emVybzwvY29kZT4sCis8Y29kZT5vbmU8L2NvZGU+LCA8Y29kZT50d288L2NvZGU+LCA8Y29kZT5mZXc8L2NvZGU+LCA8Y29kZT5tYW55PC9jb2RlPiwgYW5kIDxjb2RlPm90aGVyPC9jb2RlPi4KKworPHA+VGhlIHJ1bGVzIGZvciBkZWNpZGluZyB3aGljaCBjYXNlIHRvIHVzZSBmb3IgYSBnaXZlbiBsYW5ndWFnZSBhbmQgcXVhbnRpdHkgY2FuIGJlIHZlcnkgY29tcGxleCwKK3NvIEFuZHJvaWQgcHJvdmlkZXMgeW91IHdpdGggbWV0aG9kcyBzdWNoIGFzCit7QGxpbmsgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMjZ2V0UXVhbnRpdHlTdHJpbmcoaW50LGludCkgZ2V0UXVhbnRpdHlTdHJpbmcoKX0gdG8gc2VsZWN0Cit0aGUgYXBwcm9wcmlhdGUgcmVzb3VyY2UgZm9yIHlvdS4KKworPHA+Tm90ZSB0aGF0IHRoZSBzZWxlY3Rpb24gaXMgbWFkZSBiYXNlZCBvbiBncmFtbWF0aWNhbCBuZWNlc3NpdHkuIEEgc3RyaW5nIGZvciA8Y29kZT56ZXJvPC9jb2RlPgoraW4gRW5nbGlzaCB3aWxsIGJlIGlnbm9yZWQgZXZlbiBpZiB0aGUgcXVhbnRpdHkgaXMgMCwgYmVjYXVzZSAwIGlzbid0IGdyYW1tYXRpY2FsbHkgZGlmZmVyZW50Citmcm9tIDIsIG9yIGFueSBvdGhlciBudW1iZXIgZXhjZXB0IDEgKCJ6ZXJvIGJvb2tzIiwgIm9uZSBib29rIiwgInR3byBib29rcyIsIGV0IGNldGVyYSkuCitEb24ndCBiZSBtaXNsZWQgZWl0aGVyIGJ5IHRoZSBmYWN0IHRoYXQsIHNheSwgPGNvZGU+dHdvPC9jb2RlPiBzb3VuZHMgbGlrZSBpdCBjb3VsZCBvbmx5IGFwcGx5IHRvCit0aGUgcXVhbnRpdHkgMjogYSBsYW5ndWFnZSBtYXkgcmVxdWlyZSB0aGF0IDIsIDEyLCAxMDIgKGV0IGNldGVyYSkgYXJlIGFsbCB0cmVhdGVkIGxpa2Ugb25lCithbm90aGVyIGJ1dCBkaWZmZXJlbnRseSB0byBvdGhlciBxdWFudGl0aWVzLiBSZWx5IG9uIHlvdXIgdHJhbnNsYXRvciB0byBrbm93IHdoYXQgZGlzdGluY3Rpb25zCit0aGVpciBsYW5ndWFnZSBhY3R1YWxseSBpbnNpc3RzIHVwb24uCisKKzxwPkl0J3Mgb2Z0ZW4gcG9zc2libGUgdG8gYXZvaWQgcXVhbnRpdHkgc3RyaW5ncyBieSB1c2luZyBxdWFudGl0eS1uZXV0cmFsIGZvcm11bGF0aW9ucyBzdWNoIGFzCisiQm9va3M6IDEiLiBUaGlzIHdpbGwgbWFrZSB5b3VyIGxpZmUgYW5kIHlvdXIgdHJhbnNsYXRvcnMnIGxpdmVzIGVhc2llciwgaWYgaXQncyBhIHN0eWxlIHRoYXQncworaW4ga2VlcGluZyB3aXRoIHlvdXIgYXBwbGljYXRpb24uCiAKIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEEgcGx1cmFscyBjb2xsZWN0aW9uIGlzIGEgc2ltcGxlIHJlc291cmNlIHRoYXQgaXMKIHJlZmVyZW5jZWQgdXNpbmcgdGhlIHZhbHVlIHByb3ZpZGVkIGluIHRoZSB7QGNvZGUgbmFtZX0gYXR0cmlidXRlIChub3QgdGhlIG5hbWUgb2YgdGhlIFhNTApAQCAtMjUxLDcgKzI2OCw3IEBACiAgICAgJmx0OzxhIGhyZWY9IiNwbHVyYWxzLWVsZW1lbnQiPnBsdXJhbHM8L2E+CiAgICAgICAgIG5hbWU9IjxlbT5wbHVyYWxfbmFtZTwvZW0+Ij4KICAgICAgICAgJmx0OzxhIGhyZWY9IiNwbHVyYWxzLWl0ZW0tZWxlbWVudCI+aXRlbTwvYT4KLSAgICAgICAgICAgIHF1YW50aXR5PVsib25lIiB8ICJvdGhlciJdCisgICAgICAgICAgICBxdWFudGl0eT1bInplcm8iIHwgIm9uZSIgfCAidHdvIiB8ICJmZXciIHwgIm1hbnkiIHwgIm90aGVyIl0KICAgICAgICAgICAgICZndDs8ZW0+dGV4dF9zdHJpbmc8L2VtPiZsdDsvaXRlbT4KICAgICAmbHQ7L3BsdXJhbHM+CiAmbHQ7L3Jlc291cmNlcz4KQEAgLTI4NSwxNiArMzAyLDI3IEBACiAgICAgICA8cCBjbGFzcz0iY2FwcyI+YXR0cmlidXRlczo8L3A+CiAgICAgICA8ZGwgY2xhc3M9ImF0bi1saXN0Ij4KICAgICAgICAgPGR0Pjxjb2RlPnF1YW50aXR5PC9jb2RlPjwvZHQ+Ci0gICAgICAgIDxkZD48ZW0+S2V5d29yZDwvZW0+LiBBIHZhbHVlIGluZGljYXRpbmcgdGhlIGNhc2UgaW4gd2hpY2ggdGhpcyBzdHJpbmcgc2hvdWxkIGJlIHVzZWQuIFZhbGlkCi12YWx1ZXM6CisgICAgICAgIDxkZD48ZW0+S2V5d29yZDwvZW0+LiBBIHZhbHVlIGluZGljYXRpbmcgd2hlbiB0aGlzIHN0cmluZyBzaG91bGQgYmUgdXNlZC4gVmFsaWQKK3ZhbHVlcywgd2l0aCBub24tZXhoYXVzdGl2ZSBleGFtcGxlcyBpbiBwYXJlbnRoZXNlczoKICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICA8dHI+PHRoPlZhbHVlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+CiAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZD57QGNvZGUgb25lfTwvdGQ+PHRkPldoZW4gdGhlcmUgaXMgb25lIChhIHNpbmd1bGFyIHN0cmluZykuPC90ZD4KKyAgICAgICAgICAgICAgPHRkPntAY29kZSB6ZXJvfTwvdGQ+PHRkPldoZW4gdGhlIGxhbmd1YWdlIHJlcXVpcmVzIHNwZWNpYWwgdHJlYXRtZW50IG9mIHRoZSBudW1iZXIgMCAoYXMgaW4gQXJhYmljKS48L3RkPgogICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkPntAY29kZSBvdGhlcn08L3RkPjx0ZD5XaGVuIHRoZSBxdWFudGl0eSBpcyBhbnl0aGluZyBvdGhlciB0aGFuIG9uZSAoYSBwbHVyYWwKLXN0cmluZywgYnV0IGFsc28gdXNlZCB3aGVuIHRoZSBjb3VudCBpcyB6ZXJvKS48L3RkPgorICAgICAgICAgICAgICA8dGQ+e0Bjb2RlIG9uZX08L3RkPjx0ZD5XaGVuIHRoZSBsYW5ndWFnZSByZXF1aXJlcyBzcGVjaWFsIHRyZWF0bWVudCBvZiBudW1iZXJzIGxpa2Ugb25lIChhcyB3aXRoIHRoZSBudW1iZXIgMSBpbiBFbmdsaXNoIGFuZCBtb3N0IG90aGVyIGxhbmd1YWdlczsgaW4gUnVzc2lhbiwgYW55IG51bWJlciBlbmRpbmcgaW4gMSBidXQgbm90IGVuZGluZyBpbiAxMSBpcyBpbiB0aGlzIGNsYXNzKS48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPntAY29kZSB0d299PC90ZD48dGQ+V2hlbiB0aGUgbGFuZ3VhZ2UgcmVxdWlyZXMgc3BlY2lhbCB0cmVhdG1lbnQgb2YgbnVtYmVycyBsaWtlIHR3byAoYXMgaW4gV2Vsc2gpLjwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGQ+e0Bjb2RlIGZld308L3RkPjx0ZD5XaGVuIHRoZSBsYW5ndWFnZSByZXF1aXJlcyBzcGVjaWFsIHRyZWF0bWVudCBvZiAic21hbGwiIG51bWJlcnMgKGFzIHdpdGggMiwgMywgYW5kIDQgaW4gQ3plY2g7IG9yIG51bWJlcnMgZW5kaW5nIDIsIDMsIG9yIDQgYnV0IG5vdCAxMiwgMTMsIG9yIDE0IGluIFBvbGlzaCkuPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZD57QGNvZGUgbWFueX08L3RkPjx0ZD5XaGVuIHRoZSBsYW5ndWFnZSByZXF1aXJlcyBzcGVjaWFsIHRyZWF0bWVudCBvZiAibGFyZ2UiIG51bWJlcnMgKGFzIHdpdGggbnVtYmVycyBlbmRpbmcgMTEtOTkgaW4gTWFsdGVzZSkuPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZD57QGNvZGUgb3RoZXJ9PC90ZD48dGQ+V2hlbiB0aGUgbGFuZ3VhZ2UgZG9lcyBub3QgcmVxdWlyZSBzcGVjaWFsIHRyZWF0bWVudCBvZiB0aGUgZ2l2ZW4gcXVhbnRpdHkuPC90ZD4KICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgPC9kZD4KQEAgLTMxNSw2ICszNDMsMTcgQEAKICAgICAmbHQ7L3BsdXJhbHM+CiAmbHQ7L3Jlc291cmNlcz4KIDwvcHJlPgorICAgIDxwPlhNTCBmaWxlIHNhdmVkIGF0IHtAY29kZSByZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sfTo8L3A+Cis8cHJlPgorJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKyZsdDtyZXNvdXJjZXM+CisgICAgJmx0O3BsdXJhbHMgbmFtZT0ibnVtYmVyT2ZTb25nc0F2YWlsYWJsZSI+CisgICAgICAgICZsdDtpdGVtIHF1YW50aXR5PSJvbmUiPlpuYWxlemlvbm8gamVkbiYjeDAxMDU7IHBpb3NlbmsmI3gwMTE5Oy4mbHQ7L2l0ZW0+CisgICAgICAgICZsdDtpdGVtIHF1YW50aXR5PSJmZXciPlpuYWxlemlvbm8gJWQgcGlvc2Vua2kuJmx0Oy9pdGVtPgorICAgICAgICAmbHQ7aXRlbSBxdWFudGl0eT0ib3RoZXIiPlpuYWxlemlvbm8gJWQgcGlvc2VuZWsuJmx0Oy9pdGVtPgorICAgICZsdDsvcGx1cmFscz4KKyZsdDsvcmVzb3VyY2VzPgorPC9wcmU+CiAgICAgPHA+SmF2YSBjb2RlOjwvcD4KIDxwcmU+CiBpbnQgY291bnQgPSBnZXROdW1iZXJPZnNvbmdzQXZhaWxhYmxlKCk7CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdGluZy5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy9hY3Rpdml0eV90ZXN0aW5nLmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOTJhZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdGluZy5qZApAQCAtMCwwICsxLDM5MiBAQAorcGFnZS50aXRsZT1BY3Rpdml0eSBUZXN0aW5nCitAamQ6Ym9keQorCis8ZGl2IGlkPSJxdi13cmFwcGVyIj4KKyAgPGRpdiBpZD0icXYiPgorICA8aDI+SW4gdGhpcyBkb2N1bWVudDwvaDI+CisgIDxvbD4KKyAgICA8bGk+CisgICAgICA8YSBocmVmPSIjQWN0aXZpdHlUZXN0QVBJIj5UaGUgQWN0aXZpdHkgVGVzdGluZyBBUEk8L2E+CisgICAgICA8b2w+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxhIGhyZWY9IiNBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMiI+QWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxhIGhyZWY9IiNBY3Rpdml0eVVuaXRUZXN0Q2FzZSI+QWN0aXZpdHlVbml0VGVzdENhc2U8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxhIGhyZWY9IiNTaW5nbGVMYXVuY2hBY3Rpdml0eVRlc3RDYXNlIj5TaW5nbGVMYXVuY2hBY3Rpdml0eVRlc3RDYXNlPC9hPgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgICA8YSBocmVmPSIjTW9ja09iamVjdE5vdGVzIj5Nb2NrIG9iamVjdHMgYW5kIGFjdGl2aXR5IHRlc3Rpbmc8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxhIGhyZWY9IiNBc3NlcnRpb25Ob3RlcyI+QXNzZXJ0aW9ucyBmb3IgYWN0aXZpdHkgdGVzdGluZzwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgIDwvb2w+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNXaGF0VG9UZXN0Ij5XaGF0IHRvIFRlc3Q8L2E+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNOZXh0U3RlcHMiPk5leHQgU3RlcHM8L2E+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICA8YSBocmVmPSIjVUlUZXN0aW5nIj5BcHBlbmRpeDogVUkgVGVzdGluZyBOb3RlczwvYT4KKyAgICAgIDxvbD4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IiNSdW5PblVJVGhyZWFkIj5UZXN0aW5nIG9uIHRoZSBVSSB0aHJlYWQ8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8YSBocmVmPSIjTm90b3VjaE1vZGUiPlR1cm5pbmcgb2ZmIHRvdWNoIG1vZGU8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8YSBocmVmPSIjVW5sb2NrRGV2aWNlIj5VbmxvY2tpbmcgdGhlIEVtdWxhdG9yIG9yIERldmljZTwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IiNVSVRlc3RUcm91Ymxlc2hvb3RpbmciPlRyb3VibGVzaG9vdGluZyBVSSB0ZXN0czwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgIDwvb2w+CisgICAgPC9saT4KKyAgICA8L29sPgorPGgyPktleSBDbGFzc2VzPC9oMj4KKyAgICA8b2w+CisgICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfTwvbGk+CisgICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMn08L2xpPgorICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9PC9saT4KKyAgICA8L29sPgorPGgyPlJlbGF0ZWQgVHV0b3JpYWxzPC9oMj4KKyAgICA8b2w+CisgICAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+CisgICAgICAgIEhlbGxvLCBUZXN0aW5nPC9hPgorICAgICAgPC9saT4KKyAgICAgIDxsaT4KKyAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sIj5BY3Rpdml0eSBUZXN0aW5nPC9hPgorICAgICAgPC9saT4KKyAgICA8L29sPgorPGgyPlNlZSBBbHNvPC9oMj4KKyAgICAgIDxvbD4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPgorICAgICAgICAgIFRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+CisgICAgICAgICAgVGVzdGluZyBpbiBPdGhlciBJREVzPC9hPgorICAgICAgICA8L2xpPgorICAgICAgPC9vbD4KKyAgPC9kaXY+Cis8L2Rpdj4KKzxwPgorICAgIEFjdGl2aXR5IHRlc3RpbmcgaXMgcGFydGljdWxhcmx5IGRlcGVuZGVudCBvbiB0aGUgdGhlIEFuZHJvaWQgaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yay4KKyAgICBVbmxpa2Ugb3RoZXIgY29tcG9uZW50cywgYWN0aXZpdGllcyBoYXZlIGEgY29tcGxleCBsaWZlY3ljbGUgYmFzZWQgb24gY2FsbGJhY2sgbWV0aG9kczsgdGhlc2UKKyAgICBjYW4ndCBiZSBpbnZva2VkIGRpcmVjdGx5IGV4Y2VwdCBieSBpbnN0cnVtZW50YXRpb24uIEFsc28sIHRoZSBvbmx5IHdheSB0byBzZW5kIGV2ZW50cyB0byB0aGUKKyAgICB1c2VyIGludGVyZmFjZSBmcm9tIGEgcHJvZ3JhbSBpcyB0aHJvdWdoIGluc3RydW1lbnRhdGlvbi4KKzwvcD4KKzxwPgorICAgIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyB0byB0ZXN0IGFjdGl2aXRpZXMgdXNpbmcgaW5zdHJ1bWVudGF0aW9uIGFuZCBvdGhlciB0ZXN0CisgICAgZmFjaWxpdGllcy4gVGhlIGRvY3VtZW50IGFzc3VtZXMgeW91IGhhdmUgYWxyZWFkeSByZWFkCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj5UZXN0aW5nIEZ1bmRhbWVudGFsczwvYT4sCisgICAgdGhlIGludHJvZHVjdGlvbiB0byB0aGUgQW5kcm9pZCB0ZXN0aW5nIGFuZCBpbnN0cnVtZW50YXRpb24gZnJhbWV3b3JrLgorPC9wPgorPGgyIGlkPSJBY3Rpdml0eVRlc3RBUEkiPlRoZSBBY3Rpdml0eSBUZXN0aW5nIEFQSTwvaDI+Cis8cD4KKyAgICBUaGUgYWN0aXZpdHkgdGVzdGluZyBBUEkgYmFzZSBjbGFzcyBpcyB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlfSwKKyAgICB3aGljaCBwcm92aWRlcyBpbnN0cnVtZW50YXRpb24gdG8gdGhlIHRlc3QgY2FzZSBzdWJjbGFzc2VzIHlvdSB1c2UgZm9yIEFjdGl2aXRpZXMuCis8L3A+Cis8cD4KKyAgICBGb3IgYWN0aXZpdHkgdGVzdGluZywgdGhpcyBiYXNlIGNsYXNzIHByb3ZpZGVzIHRoZXNlIGZ1bmN0aW9uczoKKzwvcD4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIExpZmVjeWNsZSBjb250cm9sOiBXaXRoIGluc3RydW1lbnRhdGlvbiwgeW91IGNhbiBzdGFydCB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdCwgcGF1c2UgaXQsCisgICAgICAgIGFuZCBkZXN0cm95IGl0LCB1c2luZyBtZXRob2RzIHByb3ZpZGVkIGJ5IHRoZSB0ZXN0IGNhc2UgY2xhc3Nlcy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgRGVwZW5kZW5jeSBpbmplY3Rpb246IEluc3RydW1lbnRhdGlvbiBhbGxvd3MgeW91IHRvIGNyZWF0ZSBtb2NrIHN5c3RlbSBvYmplY3RzIHN1Y2ggYXMKKyAgICAgICAgQ29udGV4dHMgb3IgQXBwbGljYXRpb25zIGFuZCB1c2UgdGhlbSB0byBydW4gdGhlIGFjdGl2aXR5IHVuZGVyIHRlc3QuIFRoaXMKKyAgICAgICAgaGVscHMgeW91IGNvbnRyb2wgdGhlIHRlc3QgZW52aXJvbm1lbnQgYW5kIGlzb2xhdGUgaXQgZnJvbSBwcm9kdWN0aW9uIHN5c3RlbXMuIFlvdSBjYW4KKyAgICAgICAgYWxzbyBzZXQgdXAgY3VzdG9taXplZCBJbnRlbnRzIGFuZCBzdGFydCBhbiBhY3Rpdml0eSB3aXRoIHRoZW0uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFVzZXIgaW50ZXJmYWNlIGludGVyYWN0aW9uOiBZb3UgdXNlIGluc3RydW1lbnRhdGlvbiB0byBzZW5kIGtleXN0cm9rZXMgb3IgdG91Y2ggZXZlbnRzCisgICAgICAgIGRpcmVjdGx5IHRvIHRoZSBVSSBvZiB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdC4KKyAgICA8L2xpPgorPC91bD4KKzxwPgorICAgIFRoZSBhY3Rpdml0eSB0ZXN0aW5nIGNsYXNzZXMgYWxzbyBwcm92aWRlIHRoZSBKVW5pdCBmcmFtZXdvcmsgYnkgZXh0ZW5kaW5nCisgICAge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZX0gYW5kIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fS4KKzwvcD4KKzxwPgorICAgIFRoZSB0d28gbWFpbiB0ZXN0aW5nIHN1YmNsYXNzZXMgYXJlIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTJ9IGFuZAorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9LiBUbyB0ZXN0IGFuIEFjdGl2aXR5IHRoYXQgaXMgbGF1bmNoZWQgaW4gYSBtb2RlCisgICAgb3RoZXIgdGhhbiA8Y29kZT5zdGFuZGFyZDwvY29kZT4sIHlvdSB1c2Uge0BsaW5rIGFuZHJvaWQudGVzdC5TaW5nbGVMYXVuY2hBY3Rpdml0eVRlc3RDYXNlfS4KKzwvcD4KKzxoMyBpZD0iQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTIiPkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPC9oMz4KKzxwPgorICAgIFRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyfSB0ZXN0IGNhc2UgY2xhc3MgaXMgZGVzaWduZWQgdG8gZG8KKyAgICBmdW5jdGlvbmFsIHRlc3Rpbmcgb2Ygb25lIG9yIG1vcmUgQWN0aXZpdGllcyBpbiBhbiBhcHBsaWNhdGlvbiwgdXNpbmcgYSBub3JtYWwgc3lzdGVtCisgICAgaW5mcmFzdHJ1Y3R1cmUuIEl0IHJ1bnMgdGhlIEFjdGl2aXRpZXMgaW4gYSBub3JtYWwgaW5zdGFuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsCisgICAgdXNpbmcgYSBzdGFuZGFyZCBzeXN0ZW0gQ29udGV4dC4gSXQgYWxsb3dzIHlvdSB0byBzZW5kIG1vY2sgSW50ZW50cyB0byB0aGUgYWN0aXZpdHkgdW5kZXIKKyAgICB0ZXN0LCBzbyB5b3UgY2FuIHVzZSBpdCB0byB0ZXN0IGFuIGFjdGl2aXR5IHRoYXQgcmVzcG9uZHMgdG8gbXVsdGlwbGUgdHlwZXMgb2YgaW50ZW50cywgb3IKKyAgICBhbiBhY3Rpdml0eSB0aGF0IGV4cGVjdHMgYSBjZXJ0YWluIHR5cGUgb2YgZGF0YSBpbiB0aGUgaW50ZW50LCBvciBib3RoLiBOb3RpY2UsIHRob3VnaCwgdGhhdCBpdAorICAgIGRvZXMgbm90IGFsbG93IG1vY2sgQ29udGV4dHMgb3IgQXBwbGljYXRpb25zLCBzbyB5b3UgY2FuIG5vdCBpc29sYXRlIHRoZSB0ZXN0IGZyb20gdGhlIHJlc3Qgb2YKKyAgICBhIHByb2R1Y3Rpb24gc3lzdGVtLgorPC9wPgorPGgzIGlkPSJBY3Rpdml0eVVuaXRUZXN0Q2FzZSI+QWN0aXZpdHlVbml0VGVzdENhc2U8L2gzPgorPHA+CisgICAgVGhlIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9IHRlc3QgY2FzZSBjbGFzcyB0ZXN0cyBhIHNpbmdsZSBhY3Rpdml0eSBpbgorICAgIGlzb2xhdGlvbi4gQmVmb3JlIHlvdSBzdGFydCB0aGUgYWN0aXZpdHksIHlvdSBjYW4gaW5qZWN0IGEgbW9jayBDb250ZXh0IG9yIEFwcGxpY2F0aW9uLCBvciBib3RoLgorICAgIFlvdSB1c2UgaXQgdG8gcnVuIGFjdGl2aXR5IHRlc3RzIGluIGlzb2xhdGlvbiwgYW5kIHRvIGRvIHVuaXQgdGVzdGluZyBvZiBtZXRob2RzCisgICAgdGhhdCBkbyBub3QgaW50ZXJhY3Qgd2l0aCBBbmRyb2lkLiBZb3UgY2FuIG5vdCBzZW5kIG1vY2sgSW50ZW50cyB0byB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdCwKKyAgICBhbHRob3VnaCB5b3UgY2FuIGNhbGwKKyAgICB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjc3RhcnRBY3Rpdml0eShJbnRlbnQpIEFjdGl2aXR5LnN0YXJ0QWN0aXZpdHkoSW50ZW50KX0gYW5kIHRoZW4KKyAgICBsb29rIGF0IGFyZ3VtZW50cyB0aGF0IHdlcmUgcmVjZWl2ZWQuCis8L3A+Cis8aDMgaWQ9IlNpbmdsZUxhdW5jaEFjdGl2aXR5VGVzdENhc2UiPlNpbmdsZUxhdW5jaEFjdGl2aXR5VGVzdENhc2U8L2gzPgorPHA+CisgICAgVGhlIHtAbGluayBhbmRyb2lkLnRlc3QuU2luZ2xlTGF1bmNoQWN0aXZpdHlUZXN0Q2FzZX0gY2xhc3MgaXMgYSBjb252ZW5pZW5jZSBjbGFzcyBmb3IKKyAgICB0ZXN0aW5nIGEgc2luZ2xlIGFjdGl2aXR5IGluIGFuIGVudmlyb25tZW50IHRoYXQgZG9lc24ndCBjaGFuZ2UgZnJvbSB0ZXN0IHRvIHRlc3QuCisgICAgSXQgaW52b2tlcyB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkgc2V0VXAoKX0gYW5kCisgICAge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpIHRlYXJEb3duKCl9IG9ubHkgb25jZSwgaW5zdGVhZCBvZiBvbmNlIHBlcgorICAgIG1ldGhvZCBjYWxsLiBJdCBkb2VzIG5vdCBhbGxvdyB5b3UgdG8gaW5qZWN0IGFueSBtb2NrIG9iamVjdHMuCis8L3A+Cis8cD4KKyAgICBUaGlzIHRlc3QgY2FzZSBpcyB1c2VmdWwgZm9yIHRlc3RpbmcgYW4gYWN0aXZpdHkgdGhhdCBydW5zIGluIGEgbW9kZSBvdGhlciB0aGFuCisgICAgPGNvZGU+c3RhbmRhcmQ8L2NvZGU+LiBJdCBlbnN1cmVzIHRoYXQgdGhlIHRlc3QgZml4dHVyZSBpcyBub3QgcmVzZXQgYmV0d2VlbiB0ZXN0cy4gWW91CisgICAgY2FuIHRoZW4gdGVzdCB0aGF0IHRoZSBhY3Rpdml0eSBoYW5kbGVzIG11bHRpcGxlIGNhbGxzIGNvcnJlY3RseS4KKzwvcD4KKzxoMyBpZD0iTW9ja09iamVjdE5vdGVzIj5Nb2NrIG9iamVjdHMgYW5kIGFjdGl2aXR5IHRlc3Rpbmc8L2gzPgorPHA+CisgICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIG5vdGVzIGFib3V0IHRoZSB1c2Ugb2YgdGhlIG1vY2sgb2JqZWN0cyBkZWZpbmVkIGluCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrfSB3aXRoIGFjdGl2aXR5IHRlc3RzLgorPC9wPgorPHA+CisgICAgVGhlIG1vY2sgb2JqZWN0IHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb259IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBhY3Rpdml0eQorICAgIHRlc3RpbmcgaWYgeW91IHVzZSB0aGUge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eVVuaXRUZXN0Q2FzZX0gdGVzdCBjYXNlIGNsYXNzLgorICAgIEJ5IGRlZmF1bHQsIDxjb2RlPkFjdGl2aXR5VW5pdFRlc3RDYXNlPC9jb2RlPiwgY3JlYXRlcyBhIGhpZGRlbiA8Y29kZT5Nb2NrQXBwbGljYXRpb248L2NvZGU+CisgICAgb2JqZWN0IHRoYXQgaXMgdXNlZCBhcyB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gWW91IGNhbiBpbmplY3QgeW91ciBvd24gb2JqZWN0IHVzaW5nCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eVVuaXRUZXN0Q2FzZSNzZXRBcHBsaWNhdGlvbihBcHBsaWNhdGlvbikgc2V0QXBwbGljYXRpb24oKX0uCis8L3A+Cis8aDMgaWQ9IkFzc2VydGlvbk5vdGVzIj5Bc3NlcnRpb25zIGZvciBhY3Rpdml0eSB0ZXN0aW5nPC9oMz4KKzxwPgorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuVmlld0Fzc2VydHN9IGRlZmluZXMgYXNzZXJ0aW9ucyBmb3IgVmlld3MuIFlvdSB1c2UgaXQgdG8gdmVyaWZ5IHRoZQorICAgIGFsaWdubWVudCBhbmQgcG9zaXRpb24gb2YgVmlldyBvYmplY3RzLCBhbmQgdG8gbG9vayBhdCB0aGUgc3RhdGUgb2YgVmlld0dyb3VwIG9iamVjdHMuCis8L3A+Cis8aDIgaWQ9IldoYXRUb1Rlc3QiPldoYXQgVG8gVGVzdDwvaDI+Cis8dWw+CisgICAgPGxpPgorICAgICAgICBJbnB1dCB2YWxpZGF0aW9uOiBUZXN0IHRoYXQgYW4gYWN0aXZpdHkgcmVzcG9uZHMgY29ycmVjdGx5IHRvIGlucHV0IHZhbHVlcyBpbiBhbgorICAgICAgICBFZGl0VGV4dCBWaWV3LiBTZXQgdXAgYSBrZXlzdHJva2Ugc2VxdWVuY2UsIHNlbmQgaXQgdG8gdGhlIGFjdGl2aXR5LCBhbmQgdGhlbgorICAgICAgICB1c2Uge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I2ZpbmRWaWV3QnlJZChpbnQpfSB0byBleGFtaW5lIHRoZSBzdGF0ZSBvZiB0aGUgVmlldy4gWW91IGNhbgorICAgICAgICB2ZXJpZnkgdGhhdCBhIHZhbGlkIGtleXN0cm9rZSBzZXF1ZW5jZSBlbmFibGVzIGFuIE9LIGJ1dHRvbiwgd2hpbGUgYW4gaW52YWxpZCBvbmUgbGVhdmVzIHRoZQorICAgICAgICBidXR0b24gZGlzYWJsZWQuIFlvdSBjYW4gYWxzbyB2ZXJpZnkgdGhhdCB0aGUgQWN0aXZpdHkgcmVzcG9uZHMgdG8gaW52YWxpZCBpbnB1dCBieQorICAgICAgICBzZXR0aW5nIGVycm9yIG1lc3NhZ2VzIGluIHRoZSBWaWV3LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBMaWZlY3ljbGUgZXZlbnRzOiBUZXN0IHRoYXQgZWFjaCBvZiB5b3VyIGFwcGxpY2F0aW9uJ3MgYWN0aXZpdGllcyBoYW5kbGVzIGxpZmVjeWNsZSBldmVudHMKKyAgICAgICAgY29ycmVjdGx5LiBJbiBnZW5lcmFsLCBsaWZlY3ljbGUgZXZlbnRzIGFyZSBhY3Rpb25zLCBlaXRoZXIgZnJvbSB0aGUgc3lzdGVtIG9yIGZyb20gdGhlCisgICAgICAgIHVzZXIsIHRoYXQgdHJpZ2dlciBhIGNhbGxiYWNrIG1ldGhvZCBzdWNoIGFzIDxjb2RlPm9uQ3JlYXRlKCk8L2NvZGU+IG9yCisgICAgICAgIDxjb2RlPm9uQ2xpY2soKTwvY29kZT4uIEZvciBleGFtcGxlLCBhbiBhY3Rpdml0eSBzaG91bGQgcmVzcG9uZCB0byBwYXVzZSBvciBkZXN0cm95IGV2ZW50cworICAgICAgICBieSBzYXZpbmcgaXRzIHN0YXRlLiBSZW1lbWJlciB0aGF0IGV2ZW4gYSBjaGFuZ2UgaW4gc2NyZWVuIG9yaWVudGF0aW9uIGNhdXNlcyB0aGUgY3VycmVudAorICAgICAgICBhY3Rpdml0eSB0byBiZSBkZXN0cm95ZWQsIHNvIHlvdSBzaG91bGQgdGVzdCB0aGF0IGFjY2lkZW50YWwgZGV2aWNlIG1vdmVtZW50cyBkb24ndAorICAgICAgICBhY2NpZGVudGFsbHkgbG9zZSB0aGUgYXBwbGljYXRpb24gc3RhdGUuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEludGVudHM6IFRlc3QgdGhhdCBlYWNoIGFjdGl2aXR5IGNvcnJlY3RseSBoYW5kbGVzIHRoZSBpbnRlbnRzIGxpc3RlZCBpbiB0aGUgaW50ZW50CisgICAgICAgIGZpbHRlciBzcGVjaWZpZWQgaW4gaXRzIG1hbmlmZXN0LiBZb3UgY2FuIHVzZQorICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyfSB0byBzZW5kIG1vY2sgSW50ZW50cyB0byB0aGUKKyAgICAgICAgYWN0aXZpdHkgdW5kZXIgdGVzdC4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgUnVudGltZSBjb25maWd1cmF0aW9uIGNoYW5nZXM6IFRlc3QgdGhhdCBlYWNoIGFjdGl2aXR5IHJlc3BvbmRzIGNvcnJlY3RseSB0byB0aGUKKyAgICAgICAgcG9zc2libGUgY2hhbmdlcyBpbiB0aGUgZGV2aWNlJ3MgY29uZmlndXJhdGlvbiB3aGlsZSB5b3VyIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcuIFRoZXNlCisgICAgICAgIGluY2x1ZGUgYSBjaGFuZ2UgdG8gdGhlIGRldmljZSdzIG9yaWVudGF0aW9uLCBhIGNoYW5nZSB0byB0aGUgY3VycmVudCBsYW5ndWFnZSwgYW5kIHNvCisgICAgICAgIGZvcnRoLiBIYW5kbGluZyB0aGVzZSBjaGFuZ2VzIGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgaW4gdGhlIHRvcGljCisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3J1bnRpbWUtY2hhbmdlcy5odG1sIj5IYW5kbGluZyBSdW50aW1lCisgICAgICAgIENoYW5nZXM8L2E+LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBTY3JlZW4gc2l6ZXMgYW5kIHJlc29sdXRpb25zOiBCZWZvcmUgeW91IHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbiwgbWFrZSBzdXJlIHRvIHRlc3QgaXQgb24KKyAgICAgICAgYWxsIG9mIHRoZSBzY3JlZW4gc2l6ZXMgYW5kIGRlbnNpdGllcyBvbiB3aGljaCB5b3Ugd2FudCBpdCB0byBydW4uIFlvdSBjYW4gdGVzdCB0aGUKKyAgICAgICAgYXBwbGljYXRpb24gb24gbXVsdGlwbGUgc2l6ZXMgYW5kIGRlbnNpdGllcyB1c2luZyBBVkRzLCBvciB5b3UgY2FuIHRlc3QgeW91ciBhcHBsaWNhdGlvbgorICAgICAgICBkaXJlY3RseSBvbiB0aGUgZGV2aWNlcyB0aGF0IHlvdSBhcmUgdGFyZ2V0aW5nLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSB0b3BpYworICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHJhY3RpY2VzL3NjcmVlbnNfc3VwcG9ydC5odG1sIj5TdXBwb3J0aW5nIE11bHRpcGxlIFNjcmVlbnM8L2E+LgorICAgIDwvbGk+Cis8L3VsPgorPGgyIGlkPSJOZXh0U3RlcHMiPk5leHQgU3RlcHM8L2gyPgorPHA+CisgICAgVG8gbGVhcm4gaG93IHRvIHNldCB1cCBhbmQgcnVuIHRlc3RzIGluIEVjbGlwc2UsIHBsZWFzZSByZWZlciB0byA8YQorICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4KKyAgICBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uIElmIHlvdSdyZSBub3Qgd29ya2luZyBpbiBFY2xpcHNlLCByZWZlciB0byA8YQorICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyCisgICAgSURFczwvYT4uCis8L3A+Cis8cD4KKyAgICBJZiB5b3Ugd2FudCBhIHN0ZXAtYnktc3RlcCBpbnRyb2R1Y3Rpb24gdG8gdGVzdGluZyBhY3Rpdml0aWVzLCB0cnkgb25lIG9mIHRoZQorICAgIHRlc3RpbmcgdHV0b3JpYWxzOgorPC9wPgorPHVsPgorICAgIDxsaT4KKyAgICAgICAgVGhlIDxhCisgICAgICAgIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+SGVsbG8sCisgICAgICAgIFRlc3Rpbmc8L2E+IHR1dG9yaWFsIGludHJvZHVjZXMgYmFzaWMgdGVzdGluZyBjb25jZXB0cyBhbmQgcHJvY2VkdXJlcyBpbiB0aGUKKyAgICAgICAgY29udGV4dCBvZiB0aGUgSGVsbG8sIFdvcmxkIGFwcGxpY2F0aW9uLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBUaGUgPGEKKyAgICAgICAgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5CisgICAgICAgIFRlc3Rpbmc8L2E+IHR1dG9yaWFsIGlzIGFuIGV4Y2VsbGVudCBmb2xsb3ctdXAgdG8gdGhlIEhlbGxvLCBUZXN0aW5nIHR1dG9yaWFsLgorICAgICAgICBJdCBndWlkZXMgeW91IHRocm91Z2ggYSBtb3JlIGNvbXBsZXggdGVzdGluZyBzY2VuYXJpbyB0aGF0IHlvdSBkZXZlbG9wIGFnYWluc3QgYQorICAgICAgICBtb3JlIHJlYWxpc3RpYyBhY3Rpdml0eS1vcmllbnRlZCBhcHBsaWNhdGlvbi4KKyAgICA8L2xpPgorPC91bD4KKzxoMiBpZD0iVUlUZXN0aW5nIj5BcHBlbmRpeDogVUkgVGVzdGluZyBOb3RlczwvaDI+Cis8cD4KKyAgICBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGhhdmUgdGlwcyBmb3IgdGVzdGluZyB0aGUgVUkgb2YgeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9uLCBzcGVjaWZpY2FsbHkKKyAgICB0byBoZWxwIHlvdSBoYW5kbGUgYWN0aW9ucyB0aGF0IHJ1biBpbiB0aGUgVUkgdGhyZWFkLCB0b3VjaCBzY3JlZW4gYW5kIGtleWJvYXJkIGV2ZW50cywgYW5kIGhvbWUKKyAgICBzY3JlZW4gdW5sb2NrIGR1cmluZyB0ZXN0aW5nLgorPC9wPgorPGgzIGlkPSJSdW5PblVJVGhyZWFkIj5UZXN0aW5nIG9uIHRoZSBVSSB0aHJlYWQ8L2gzPgorPHA+CisgICAgQW4gYXBwbGljYXRpb24ncyBhY3Rpdml0aWVzIHJ1biBvbiB0aGUgYXBwbGljYXRpb24ncyA8c3Ryb25nPlVJIHRocmVhZDwvc3Ryb25nPi4gT25jZSB0aGUKKyAgICBVSSBpcyBpbnN0YW50aWF0ZWQsIGZvciBleGFtcGxlIGluIHRoZSBhY3Rpdml0eSdzIDxjb2RlPm9uQ3JlYXRlKCk8L2NvZGU+IG1ldGhvZCwgdGhlbiBhbGwKKyAgICBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgVUkgbXVzdCBydW4gaW4gdGhlIFVJIHRocmVhZC4gV2hlbiB5b3UgcnVuIHRoZSBhcHBsaWNhdGlvbiBub3JtYWxseSwgaXQKKyAgICBoYXMgYWNjZXNzIHRvIHRoZSB0aHJlYWQgYW5kIGRvZXMgbm90IGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKzwvcD4KKzxwPgorICAgIFRoaXMgY2hhbmdlcyB3aGVuIHlvdSBydW4gdGVzdHMgYWdhaW5zdCB0aGUgYXBwbGljYXRpb24uIFdpdGggaW5zdHJ1bWVudGF0aW9uLWJhc2VkIGNsYXNzZXMsCisgICAgeW91IGNhbiBpbnZva2UgbWV0aG9kcyBhZ2FpbnN0IHRoZSBVSSBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gVGhlIG90aGVyIHRlc3QgY2xhc3NlcworICAgIGRvbid0IGFsbG93IHRoaXMuIFRvIHJ1biBhbiBlbnRpcmUgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCwgeW91IGNhbiBhbm5vdGF0ZSB0aGUgdGhyZWFkCisgICAgd2l0aCA8Y29kZT5AVUlUaHJlYWRUZXN0PC9jb2RlPi4gTm90aWNlIHRoYXQgdGhpcyB3aWxsIHJ1biA8ZW0+YWxsPC9lbT4gb2YgdGhlIG1ldGhvZCBzdGF0ZW1lbnRzCisgICAgb24gdGhlIFVJIHRocmVhZC4gIE1ldGhvZHMgdGhhdCBkbyBub3QgaW50ZXJhY3Qgd2l0aCB0aGUgVUkgYXJlIG5vdCBhbGxvd2VkOyBmb3IgZXhhbXBsZSwgeW91CisgICAgY2FuJ3QgaW52b2tlIDxjb2RlPkluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTwvY29kZT4uCis8L3A+Cis8cD4KKyAgICBUbyBydW4gYSBzdWJzZXQgb2YgYSB0ZXN0IG1ldGhvZCBvbiB0aGUgVUkgdGhyZWFkLCBjcmVhdGUgYW4gYW5vbnltb3VzIGNsYXNzIG9mIHR5cGUKKyAgICA8Y29kZT5SdW5uYWJsZTwvY29kZT4sIHB1dCB0aGUgc3RhdGVtZW50cyB5b3Ugd2FudCBpbiB0aGUgPGNvZGU+cnVuKCk8L2NvZGU+IG1ldGhvZCwgYW5kCisgICAgaW5zdGFudGlhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBtZXRob2QKKyAgICA8Y29kZT48ZW0+YXBwQWN0aXZpdHk8L2VtPi5ydW5PblVpVGhyZWFkKCk8L2NvZGU+LCB3aGVyZSA8Y29kZT48ZW0+YXBwQWN0aXZpdHk8L2VtPjwvY29kZT4gaXMKKyAgICB0aGUgaW5zdGFuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uIHlvdSBhcmUgdGVzdGluZy4KKzwvcD4KKzxwPgorICAgIEZvciBleGFtcGxlLCB0aGlzIGNvZGUgaW5zdGFudGlhdGVzIGFuIGFjdGl2aXR5IHRvIHRlc3QsIHJlcXVlc3RzIGZvY3VzIChhIFVJIGFjdGlvbikgZm9yIHRoZQorICAgIFNwaW5uZXIgZGlzcGxheWVkIGJ5IHRoZSBhY3Rpdml0eSwgYW5kIHRoZW4gc2VuZHMgYSBrZXkgdG8gaXQuIE5vdGljZSB0aGF0IHRoZSBjYWxscyB0bworICAgIDxjb2RlPndhaXRGb3JJZGxlU3luYzwvY29kZT4gYW5kIDxjb2RlPnNlbmRLZXlzPC9jb2RlPiBhcmVuJ3QgYWxsb3dlZCB0byBydW4gb24gdGhlIFVJIHRocmVhZDoKKzwvcD4KKzxwcmU+CisgIHByaXZhdGUgTXlBY3Rpdml0eSBtQWN0aXZpdHk7IC8vIE15QWN0aXZpdHkgaXMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGFwcCB1bmRlciB0ZXN0CisgIHByaXZhdGUgU3Bpbm5lciBtU3Bpbm5lcjsKKworICAuLi4KKworICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgIG1JbnN0cnVtZW50YXRpb24gPSBnZXRJbnN0cnVtZW50YXRpb24oKTsKKworICAgICAgbUFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsgLy8gZ2V0IGEgcmVmZXJlbmNlcyB0byB0aGUgYXBwIHVuZGVyIHRlc3QKKworICAgICAgLyoKKyAgICAgICAqIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgbWFpbiB3aWRnZXQgb2YgdGhlIGFwcCB1bmRlciB0ZXN0LCBhIFNwaW5uZXIKKyAgICAgICAqLworICAgICAgbVNwaW5uZXIgPSAoU3Bpbm5lcikgbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5kZW1vLm15YWN0aXZpdHkuUi5pZC5TcGlubmVyMDEpOworCisgIC4uLgorCisgIHB1YmxpYyB2b2lkIGFUZXN0KCkgeworICAgICAgLyoKKyAgICAgICAqIHJlcXVlc3QgZm9jdXMgZm9yIHRoZSBTcGlubmVyLCBzbyB0aGF0IHRoZSB0ZXN0IGNhbiBzZW5kIGtleSBldmVudHMgdG8gaXQKKyAgICAgICAqIFRoaXMgcmVxdWVzdCBtdXN0IGJlIHJ1biBvbiB0aGUgVUkgdGhyZWFkLiBUbyBkbyB0aGlzLCB1c2UgdGhlIHJ1bk9uVWlUaHJlYWQgbWV0aG9kCisgICAgICAgKiBhbmQgcGFzcyBpdCBhIFJ1bm5hYmxlIHRoYXQgY29udGFpbnMgYSBjYWxsIHRvIHJlcXVlc3RGb2N1cyBvbiB0aGUgU3Bpbm5lci4KKyAgICAgICAqLworICAgICAgbUFjdGl2aXR5LnJ1bk9uVWlUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgbVNwaW5uZXIucmVxdWVzdEZvY3VzKCk7CisgICAgICAgICAgfQorICAgICAgfSk7CisKKyAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7CisKKyAgICAgIHRoaXMuc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Cis8L3ByZT4KKworPGgzIGlkPSJOb3RvdWNoTW9kZSI+VHVybmluZyBvZmYgdG91Y2ggbW9kZTwvaDM+Cis8cD4KKyAgICBUbyBjb250cm9sIHRoZSBlbXVsYXRvciBvciBhIGRldmljZSB3aXRoIGtleSBldmVudHMgeW91IHNlbmQgZnJvbSB5b3VyIHRlc3RzLCB5b3UgbXVzdCB0dXJuIG9mZgorICAgIHRvdWNoIG1vZGUuIElmIHlvdSBkbyBub3QgZG8gdGhpcywgdGhlIGtleSBldmVudHMgYXJlIGlnbm9yZWQuCis8L3A+Cis8cD4KKyAgICBUbyB0dXJuIG9mZiB0b3VjaCBtb2RlLCB5b3UgaW52b2tlCisgICAgPGNvZGU+QWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTIuc2V0QWN0aXZpdHlUb3VjaE1vZGUoZmFsc2UpPC9jb2RlPgorICAgIDxlbT5iZWZvcmU8L2VtPiB5b3UgY2FsbCA8Y29kZT5nZXRBY3Rpdml0eSgpPC9jb2RlPiB0byBzdGFydCB0aGUgYWN0aXZpdHkuIFlvdSBtdXN0IGludm9rZSB0aGUKKyAgICBtZXRob2QgaW4gYSB0ZXN0IG1ldGhvZCB0aGF0IGlzIDxlbT5ub3Q8L2VtPiBydW5uaW5nIG9uIHRoZSBVSSB0aHJlYWQuIEZvciB0aGlzIHJlYXNvbiwgeW91CisgICAgY2FuJ3QgaW52b2tlIHRoZSB0b3VjaCBtb2RlIG1ldGhvZCBmcm9tIGEgdGVzdCBtZXRob2QgdGhhdCBpcyBhbm5vdGF0ZWQgd2l0aAorICAgIDxjb2RlPkBVSVRocmVhZDwvY29kZT4uIEluc3RlYWQsIGludm9rZSB0aGUgdG91Y2ggbW9kZSBtZXRob2QgZnJvbSA8Y29kZT5zZXRVcCgpPC9jb2RlPi4KKzwvcD4KKzxoMyBpZD0iVW5sb2NrRGV2aWNlIj5VbmxvY2tpbmcgdGhlIGVtdWxhdG9yIG9yIGRldmljZTwvaDM+Cis8cD4KKyAgICBZb3UgbWF5IGZpbmQgdGhhdCBVSSB0ZXN0cyBkb24ndCB3b3JrIGlmIHRoZSBlbXVsYXRvcidzIG9yIGRldmljZSdzIGhvbWUgc2NyZWVuIGlzIGRpc2FibGVkIHdpdGgKKyAgICB0aGUga2V5Z3VhcmQgcGF0dGVybi4gVGhpcyBpcyBiZWNhdXNlIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGNhbid0IHJlY2VpdmUga2V5IGV2ZW50cyBzZW50CisgICAgYnkgPGNvZGU+c2VuZEtleXMoKTwvY29kZT4uIFRoZSBiZXN0IHdheSB0byBhdm9pZCB0aGlzIGlzIHRvIHN0YXJ0IHlvdXIgZW11bGF0b3Igb3IgZGV2aWNlCisgICAgZmlyc3QgYW5kIHRoZW4gZGlzYWJsZSB0aGUga2V5Z3VhcmQgZm9yIHRoZSBob21lIHNjcmVlbi4KKzwvcD4KKzxwPgorICAgIFlvdSBjYW4gYWxzbyBleHBsaWNpdGx5IGRpc2FibGUgdGhlIGtleWd1YXJkLiBUbyBkbyB0aGlzLAorICAgIHlvdSBuZWVkIHRvIGFkZCBhIHBlcm1pc3Npb24gaW4gdGhlIG1hbmlmZXN0IGZpbGUgKDxjb2RlPkFuZHJvaWRNYW5pZmVzdC54bWw8L2NvZGU+KSBhbmQKKyAgICB0aGVuIGRpc2FibGUgdGhlIGtleWd1YXJkIGluIHlvdXIgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gTm90ZSwgdGhvdWdoLCB0aGF0IHlvdSBlaXRoZXIgaGF2ZSB0bworICAgIHJlbW92ZSB0aGlzIGJlZm9yZSB5b3UgcHVibGlzaCB5b3VyIGFwcGxpY2F0aW9uLCBvciB5b3UgaGF2ZSB0byBkaXNhYmxlIGl0IHdpdGggY29kZSBpbgorICAgIHRoZSBwdWJsaXNoZWQgYXBwbGljYXRpb24uCis8L3A+Cis8cD4KKyAgICBUbyBhZGQgdGhlIHRoZSBwZXJtaXNzaW9uLCBhZGQgdGhlIGVsZW1lbnQKKyAgICA8Y29kZT4mbHQ7dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkRJU0FCTEVfS0VZR1VBUkQiLyZndDs8L2NvZGU+CisgICAgYXMgYSBjaGlsZCBvZiB0aGUgPGNvZGU+Jmx0O21hbmlmZXN0Jmd0OzwvY29kZT4gZWxlbWVudC4gVG8gZGlzYWJsZSB0aGUgS2V5R3VhcmQsIGFkZCB0aGUKKyAgICBmb2xsb3dpbmcgY29kZSB0byB0aGUgPGNvZGU+b25DcmVhdGUoKTwvY29kZT4gbWV0aG9kIG9mIGFjdGl2aXRpZXMgeW91IGludGVuZCB0byB0ZXN0OgorPC9wPgorPHByZT4KKyAgbUtleUd1YXJkTWFuYWdlciA9IChLZXlndWFyZE1hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoS0VZR1VBUkRfU0VSVklDRSk7CisgIG1Mb2NrID0gbUtleUd1YXJkTWFuYWdlci5uZXdLZXlndWFyZExvY2soIjxlbT5hY3Rpdml0eV9jbGFzc25hbWU8L2VtPiIpOworICBtTG9jay5kaXNhYmxlS2V5Z3VhcmQoKTsKKzwvcHJlPgorPHA+d2hlcmUgPGNvZGU+PGVtPmFjdGl2aXR5X2NsYXNzbmFtZTwvZW0+PC9jb2RlPiBpcyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgYWN0aXZpdHkuPC9wPgorPGgzIGlkPSJVSVRlc3RUcm91Ymxlc2hvb3RpbmciPlRyb3VibGVzaG9vdGluZyBVSSB0ZXN0czwvaDM+Cis8cD4KKyAgICBUaGlzIHNlY3Rpb24gbGlzdHMgc29tZSBvZiB0aGUgY29tbW9uIHRlc3QgZmFpbHVyZXMgeW91IG1heSBlbmNvdW50ZXIgaW4gVUkgdGVzdGluZywgYW5kIHRoZWlyCisgICAgY2F1c2VzOgorPC9wPgorPGRsPgorICAgIDxkdD48Y29kZT5Xcm9uZ1RocmVhZEV4Y2VwdGlvbjwvY29kZT48L2R0PgorICAgIDxkZD4KKyAgICAgIDxwPjxzdHJvbmc+UHJvYmxlbTo8L3N0cm9uZz48L3A+CisgICAgICBGb3IgYSBmYWlsZWQgdGVzdCwgdGhlIEZhaWx1cmUgVHJhY2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlOgorICAgICAgPGNvZGU+CisgICAgICAgIGFuZHJvaWQudmlldy5WaWV3Um9vdCRDYWxsZWRGcm9tV3JvbmdUaHJlYWRFeGNlcHRpb246IE9ubHkgdGhlIG9yaWdpbmFsIHRocmVhZCB0aGF0IGNyZWF0ZWQKKyAgICAgICAgYSB2aWV3IGhpZXJhcmNoeSBjYW4gdG91Y2ggaXRzIHZpZXdzLgorICAgICAgPC9jb2RlPgorICAgICAgPHA+PHN0cm9uZz5Qcm9iYWJsZSBDYXVzZTo8L3N0cm9uZz48L3A+CisgICAgICAgIFRoaXMgZXJyb3IgaXMgY29tbW9uIGlmIHlvdSB0cmllZCB0byBzZW5kIFVJIGV2ZW50cyB0byB0aGUgVUkgdGhyZWFkIGZyb20gb3V0c2lkZSB0aGUgVUkKKyAgICAgICAgdGhyZWFkLiBUaGlzIGNvbW1vbmx5IGhhcHBlbnMgaWYgeW91IHNlbmQgVUkgZXZlbnRzIGZyb20gdGhlIHRlc3QgYXBwbGljYXRpb24sIGJ1dCB5b3UgZG9uJ3QKKyAgICAgICAgdXNlIHRoZSA8Y29kZT5AVUlUaHJlYWQ8L2NvZGU+IGFubm90YXRpb24gb3IgdGhlIDxjb2RlPnJ1bk9uVWlUaHJlYWQoKTwvY29kZT4gbWV0aG9kLiBUaGUKKyAgICAgICAgdGVzdCBtZXRob2QgdHJpZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgVUkgb3V0c2lkZSB0aGUgVUkgdGhyZWFkLgorICAgICAgPHA+PHN0cm9uZz5TdWdnZXN0ZWQgUmVzb2x1dGlvbjo8L3N0cm9uZz48L3A+CisgICAgICAgIFJ1biB0aGUgaW50ZXJhY3Rpb24gb24gdGhlIFVJIHRocmVhZC4gVXNlIGEgdGVzdCBjbGFzcyB0aGF0IHByb3ZpZGVzIGluc3RydW1lbnRhdGlvbi4gU2VlCisgICAgICAgIHRoZSBwcmV2aW91cyBzZWN0aW9uIDxhIGhyZWY9IiNSdW5PblVJVGhyZWFkIj5UZXN0aW5nIG9uIHRoZSBVSSBUaHJlYWQ8L2E+CisgICAgICAgIGZvciBtb3JlIGRldGFpbHMuCisgICAgPC9kZD4KKyAgICA8ZHQ+PGNvZGU+amF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb248L2NvZGU+PC9kdD4KKyAgICA8ZGQ+CisgICAgICA8cD48c3Ryb25nPlByb2JsZW06PC9zdHJvbmc+PC9wPgorICAgICAgICBGb3IgYSBmYWlsZWQgdGVzdCwgdGhlIEZhaWx1cmUgVHJhY2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlOgorICAgICAgPGNvZGU+CisgICAgICAgIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uOiBUaGlzIG1ldGhvZCBjYW4gbm90IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIGFwcGxpY2F0aW9uIHRocmVhZAorICAgICAgPC9jb2RlPgorICAgICAgPHA+PHN0cm9uZz5Qcm9iYWJsZSBDYXVzZTo8L3N0cm9uZz48L3A+CisgICAgICAgIFRoaXMgZXJyb3IgaXMgY29tbW9uIGlmIHlvdXIgdGVzdCBtZXRob2QgaXMgYW5ub3RhdGVkIHdpdGggPGNvZGU+QFVpVGhyZWFkVGVzdDwvY29kZT4gYnV0CisgICAgICAgIHRoZW4gdHJpZXMgdG8gZG8gc29tZXRoaW5nIG91dHNpZGUgdGhlIFVJIHRocmVhZCBvciB0cmllcyB0byBpbnZva2UKKyAgICAgICAgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPi4KKyAgICAgIDxwPjxzdHJvbmc+U3VnZ2VzdGVkIFJlc29sdXRpb246PC9zdHJvbmc+PC9wPgorICAgICAgICBSZW1vdmUgdGhlIDxjb2RlPkBVaVRocmVhZFRlc3Q8L2NvZGU+IGFubm90YXRpb24sIHJlbW92ZSB0aGUgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPgorICAgICAgICBjYWxsLCBvciByZS1mYWN0b3IgeW91ciB0ZXN0cy4KKyAgICA8L2RkPgorPC9kbD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy9jb250ZW50cHJvdmlkZXJfdGVzdGluZy5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy9jb250ZW50cHJvdmlkZXJfdGVzdGluZy5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTNiNWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL2NvbnRlbnRwcm92aWRlcl90ZXN0aW5nLmpkCkBAIC0wLDAgKzEsMjI0IEBACitwYWdlLnRpdGxlPUNvbnRlbnQgUHJvdmlkZXIgVGVzdGluZworQGpkOmJvZHkKKworPGRpdiBpZD0icXYtd3JhcHBlciI+CisgIDxkaXYgaWQ9InF2Ij4KKyAgPGgyPkluIHRoaXMgZG9jdW1lbnQ8L2gyPgorICA8b2w+CisgICAgPGxpPgorICAgICAgICA8YSBocmVmPSIjRGVzaWduQW5kVGVzdCI+Q29udGVudCBQcm92aWRlciBEZXNpZ24gYW5kIFRlc3Rpbmc8L2E+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICA8YSBocmVmPSIjQ29udGVudFByb3ZpZGVyVGVzdEFQSSI+VGhlIENvbnRlbnQgUHJvdmlkZXIgVGVzdGluZyBBUEk8L2E+CisgICAgICA8b2w+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8YSBocmVmPSIjUHJvdmlkZXJUZXN0Q2FzZTIiPlByb3ZpZGVyVGVzdENhc2UyIDwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IiNNb2NrT2JqZWN0cyI+TW9jayBvYmplY3QgY2xhc3NlczwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgIDwvb2w+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNXaGF0VG9UZXN0Ij5XaGF0IFRvIFRlc3Q8L2E+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNOZXh0U3RlcHMiPk5leHQgU3RlcHM8L2E+CisgICAgPC9saT4KKyAgPC9vbD4KKyAgPGgyPktleSBDbGFzc2VzPC9oMj4KKyAgICA8b2w+CisgICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfTwvbGk+CisgICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5Qcm92aWRlclRlc3RDYXNlMn08L2xpPgorICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3QuSXNvbGF0ZWRDb250ZXh0fTwvbGk+CisgICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXJ9PC9saT4KKyAgICA8L29sPgorICA8aDI+U2VlIEFsc288L2gyPgorICAgICAgPG9sPgorICAgICAgICA8bGk+CisgICAgICAgICAgPGEKKyAgICAgICAgICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdG9waWNzL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj4KKyAgICAgICAgICBUZXN0aW5nIEZ1bmRhbWVudGFsczwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPgorICAgICAgICAgIFRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+CisgICAgICAgICAgVGVzdGluZyBpbiBPdGhlciBJREVzPC9hPgorICAgICAgICA8L2xpPgorICAgICAgPC9vbD4KKyAgPC9kaXY+Cis8L2Rpdj4KKzxwPgorICAgIENvbnRlbnQgcHJvdmlkZXJzLCB3aGljaCBzdG9yZSBhbmQgcmV0cmlldmUgZGF0YSBhbmQgbWFrZSBpdCBhY2Nlc3NpYmxlIGFjcm9zcyBhcHBsaWNhdGlvbnMsCisgICAgYXJlIGEga2V5IHBhcnQgb2YgdGhlIEFuZHJvaWQgQVBJLiBBcyBhbiBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgeW91J3JlIGFsbG93ZWQgdG8gcHJvdmlkZSB5b3VyCisgICAgb3duIHB1YmxpYyBwcm92aWRlcnMgZm9yIHVzZSBieSBvdGhlciBhcHBsaWNhdGlvbnMuIElmIHlvdSBkbywgdGhlbiB5b3Ugc2hvdWxkIHRlc3QgdGhlbQorICAgIHVzaW5nIHRoZSBBUEkgeW91IHB1Ymxpc2guCis8L3A+Cis8cD4KKyAgICBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgdG8gdGVzdCBwdWJsaWMgY29udGVudCBwcm92aWRlcnMsIGFsdGhvdWdoIHRoZSBpbmZvcm1hdGlvbiBpcworICAgIGFsc28gYXBwbGljYWJsZSB0byBwcm92aWRlcnMgdGhhdCB5b3Uga2VlcCBwcml2YXRlIHRvIHlvdXIgb3duIGFwcGxpY2F0aW9uLiBJZiB5b3UgYXJlbid0CisgICAgZmFtaWxpYXIgd2l0aCBjb250ZW50ICBwcm92aWRlcnMgb3IgdGhlIEFuZHJvaWQgdGVzdGluZyBmcmFtZXdvcmssIHBsZWFzZSByZWFkCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9wcm92aWRlcnMvY29udGVudC1wcm92aWRlcnMuaHRtbCI+Q29udGVudCBQcm92aWRlcnM8L2E+LAorICAgIHRoZSBndWlkZSB0byBkZXZlbG9waW5nIGNvbnRlbnQgcHJvdmlkZXJzLCBhbmQKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPlRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPiwKKyAgICB0aGUgaW50cm9kdWN0aW9uIHRvIHRoZSBBbmRyb2lkIHRlc3RpbmcgYW5kIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsuCis8L3A+Cis8aDIgaWQ9IkRlc2lnbkFuZFRlc3QiPkNvbnRlbnQgUHJvdmlkZXIgRGVzaWduIGFuZCBUZXN0aW5nPC9oMj4KKzxwPgorICAgIEluIEFuZHJvaWQsIGNvbnRlbnQgcHJvdmlkZXJzIGFyZSB2aWV3ZWQgZXh0ZXJuYWxseSBhcyBkYXRhIEFQSXMgdGhhdCBwcm92aWRlCisgICAgdGFibGVzIG9mIGRhdGEsIHdpdGggdGhlaXIgaW50ZXJuYWxzIGhpZGRlbiBmcm9tIHZpZXcuIEEgY29udGVudCBwcm92aWRlciBtYXkgaGF2ZSBtYW55CisgICAgcHVibGljIGNvbnN0YW50cywgYnV0IGl0IHVzdWFsbHkgaGFzIGZldyBpZiBhbnkgcHVibGljIG1ldGhvZHMgYW5kIG5vIHB1YmxpYyB2YXJpYWJsZXMuCisgICAgVGhpcyBzdWdnZXN0cyB0aGF0IHlvdSBzaG91bGQgd3JpdGUgeW91ciB0ZXN0cyBiYXNlZCBvbmx5IG9uIHRoZSBwcm92aWRlcidzIHB1YmxpYyBtZW1iZXJzLgorICAgIEEgY29udGVudCBwcm92aWRlciB0aGF0IGlzIGRlc2lnbmVkIGxpa2UgdGhpcyBpcyBvZmZlcmluZyBhIGNvbnRyYWN0IGJldHdlZW4gaXRzZWxmIGFuZCBpdHMKKyAgICB1c2Vycy4KKzwvcD4KKzxwPgorICAgIFRoZSBiYXNlIHRlc3QgY2FzZSBjbGFzcyBmb3IgY29udGVudCBwcm92aWRlcnMsCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5Qcm92aWRlclRlc3RDYXNlMn0sIGFsbG93cyB5b3UgdG8gdGVzdCB5b3VyIGNvbnRlbnQgcHJvdmlkZXIgaW4gYW4KKyAgICBpc29sYXRlZCBlbnZpcm9ubWVudC4gQW5kcm9pZCBtb2NrIG9iamVjdHMgc3VjaCBhcyB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0gYW5kCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXJ9IGFsc28gaGVscCBwcm92aWRlIGFuIGlzb2xhdGVkIHRlc3QgZW52aXJvbm1lbnQuCis8L3A+Cis8cD4KKyAgICBBcyB3aXRoIG90aGVyIEFuZHJvaWQgdGVzdHMsIHByb3ZpZGVyIHRlc3QgcGFja2FnZXMgYXJlIHJ1biB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgdGVzdAorICAgIHJ1bm5lciB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9LiBUaGUgc2VjdGlvbgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCNJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIj4KKyAgICBSdW5uaW5nIFRlc3RzIFdpdGggSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvYT4gZGVzY3JpYmVzIHRoZSB0ZXN0IHJ1bm5lciBpbgorICAgIG1vcmUgZGV0YWlsLiBUaGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+CisgICAgVGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4gc2hvd3MgeW91IGhvdyB0byBydW4gYSB0ZXN0IHBhY2thZ2UgaW4gRWNsaXBzZSwgYW5kIHRoZQorICAgIHRvcGljIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj4KKyAgICBUZXN0aW5nIGluIE90aGVyIElERXM8L2E+CisgICAgc2hvd3MgeW91IGhvdyB0byBydW4gYSB0ZXN0IHBhY2thZ2UgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorPC9wPgorPGgyIGlkPSJDb250ZW50UHJvdmlkZXJUZXN0QVBJIj5Db250ZW50IFByb3ZpZGVyIFRlc3RpbmcgQVBJPC9oMj4KKzxwPgorICAgIFRoZSBtYWluIGZvY3VzIG9mIHRoZSBwcm92aWRlciB0ZXN0aW5nIEFQSSBpcyB0byBwcm92aWRlIGFuIGlzb2xhdGVkIHRlc3RpbmcgZW52aXJvbm1lbnQuIFRoaXMKKyAgICBlbnN1cmVzIHRoYXQgdGVzdHMgYWx3YXlzIHJ1biBhZ2FpbnN0IGRhdGEgZGVwZW5kZW5jaWVzIHNldCBleHBsaWNpdGx5IGluIHRoZSB0ZXN0IGNhc2UuIEl0CisgICAgYWxzbyBwcmV2ZW50cyB0ZXN0cyBmcm9tIG1vZGlmeWluZyBhY3R1YWwgdXNlciBkYXRhLiBGb3IgZXhhbXBsZSwgeW91IHdhbnQgdG8gYXZvaWQgd3JpdGluZworICAgIGEgdGVzdCB0aGF0IGZhaWxzIGJlY2F1c2UgdGhlcmUgd2FzIGRhdGEgbGVmdCBvdmVyIGZyb20gYSBwcmV2aW91cyB0ZXN0LCBhbmQgeW91IHdhbnQgdG8KKyAgICBhdm9pZCBhZGRpbmcgb3IgZGVsZXRpbmcgY29udGFjdCBpbmZvcm1hdGlvbiBpbiBhIGFjdHVhbCBwcm92aWRlci4KKzwvcD4KKzxwPgorICAgIFRoZSB0ZXN0IGNhc2UgY2xhc3MgYW5kIG1vY2sgb2JqZWN0IGNsYXNzZXMgZm9yIHByb3ZpZGVyIHRlc3Rpbmcgc2V0IHVwIHRoaXMgaXNvbGF0ZWQgdGVzdGluZworICAgIGVudmlyb25tZW50IGZvciB5b3UuCis8L3A+Cis8aDMgaWQ9IlByb3ZpZGVyVGVzdENhc2UyIj5Qcm92aWRlclRlc3RDYXNlMjwvaDM+Cis8cD4KKyAgICBZb3UgdGVzdCBhIHByb3ZpZGVyIHdpdGggYSBzdWJjbGFzcyBvZiB7QGxpbmsgYW5kcm9pZC50ZXN0LlByb3ZpZGVyVGVzdENhc2UyfS4gVGhpcyBiYXNlIGNsYXNzCisgICAgZXh0ZW5kcyB7QGxpbmsgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZX0sIHNvIGl0IHByb3ZpZGVzIHRoZSBKVW5pdCB0ZXN0aW5nIGZyYW1ld29yayBhcyB3ZWxsCisgICAgYXMgQW5kcm9pZC1zcGVjaWZpYyBtZXRob2RzIGZvciB0ZXN0aW5nIGFwcGxpY2F0aW9uIHBlcm1pc3Npb25zLiBUaGUgbW9zdCBpbXBvcnRhbnQKKyAgICBmZWF0dXJlIG9mIHRoaXMgY2xhc3MgaXMgaXRzIGluaXRpYWxpemF0aW9uLCB3aGljaCBjcmVhdGVzIHRoZSBpc29sYXRlZCB0ZXN0IGVudmlyb25tZW50LgorPC9wPgorPHA+CisgICAgVGhlIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgaW4gdGhlIGNvbnN0cnVjdG9yIGZvciB7QGxpbmsgYW5kcm9pZC50ZXN0LlByb3ZpZGVyVGVzdENhc2UyfSwgd2hpY2gKKyAgICBzdWJjbGFzc2VzIGNhbGwgaW4gdGhlaXIgb3duIGNvbnN0cnVjdG9ycy4gVGhlIHtAbGluayBhbmRyb2lkLnRlc3QuUHJvdmlkZXJUZXN0Q2FzZTJ9CisgICAgY29uc3RydWN0b3IgY3JlYXRlcyBhbiB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0gb2JqZWN0IHRoYXQgYWxsb3dzIGZpbGUgYW5kCisgICAgZGF0YWJhc2Ugb3BlcmF0aW9ucyBidXQgc3R1YnMgb3V0IG90aGVyIGludGVyYWN0aW9ucyB3aXRoIHRoZSBBbmRyb2lkIHN5c3RlbS4KKyAgICBUaGUgZmlsZSBhbmQgZGF0YWJhc2Ugb3BlcmF0aW9ucyB0aGVtc2VsdmVzIHRha2UgcGxhY2UgaW4gYSBkaXJlY3RvcnkgdGhhdCBpcyBsb2NhbCB0byB0aGUKKyAgICBkZXZpY2Ugb3IgZW11bGF0b3IgYW5kIGhhcyBhIHNwZWNpYWwgcHJlZml4LgorPC9wPgorPHA+CisgICAgVGhlIGNvbnN0cnVjdG9yIHRoZW4gY3JlYXRlcyBhIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyfSB0byB1c2UgYXMgdGhlCisgICAgcmVzb2x2ZXIgZm9yIHRoZSB0ZXN0LiBUaGUge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXJ9IGNsYXNzIGlzIGRlc2NyaWJlZCBpbgorICAgIGRldGFpbCBpbiB0aGUgc2VjdGlvbgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0X2FuZHJvaWQjTW9ja09iamVjdENsYXNzZXMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2E+LgorPC9wPgorPHA+CisgICAgTGFzdGx5LCB0aGUgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcHJvdmlkZXIgdW5kZXIgdGVzdC4gVGhpcyBpcyBhIG5vcm1hbAorICAgIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyfSBvYmplY3QsIGJ1dCBpdCB0YWtlcyBhbGwgb2YgaXRzIGVudmlyb25tZW50IGluZm9ybWF0aW9uCisgICAgZnJvbSB0aGUge0BsaW5rIGFuZHJvaWQudGVzdC5Jc29sYXRlZENvbnRleHR9LCBzbyBpdCBpcyByZXN0cmljdGVkIHRvCisgICAgd29ya2luZyBpbiB0aGUgaXNvbGF0ZWQgdGVzdCBlbnZpcm9ubWVudC4gQWxsIG9mIHRoZSB0ZXN0cyBkb25lIGluIHRoZSB0ZXN0IGNhc2UgY2xhc3MgcnVuCisgICAgYWdhaW5zdCB0aGlzIGlzb2xhdGVkIG9iamVjdC4KKzwvcD4KKzxoMyBpZD0iTW9ja09iamVjdHMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2gzPgorPHA+CisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5Qcm92aWRlclRlc3RDYXNlMn0gdXNlcyB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0gYW5kCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXJ9LCB3aGljaCBhcmUgc3RhbmRhcmQgbW9jayBvYmplY3QgY2xhc3Nlcy4gVG8KKyAgICBsZWFybiBtb3JlIGFib3V0IHRoZW0sIHBsZWFzZSByZWFkCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RfYW5kcm9pZCNNb2NrT2JqZWN0Q2xhc3NlcyI+CisgICAgVGVzdGluZyBGdW5kYW1lbnRhbHM8L2E+LgorPC9wPgorPGgyIGlkPSJXaGF0VG9UZXN0Ij5XaGF0IFRvIFRlc3Q8L2gyPgorPHA+CisgICAgVGhlIHRvcGljIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy93aGF0X3RvX3Rlc3QuaHRtbCI+V2hhdCBUbyBUZXN0PC9hPgorICAgIGxpc3RzIGdlbmVyYWwgY29uc2lkZXJhdGlvbnMgZm9yIHRlc3RpbmcgQW5kcm9pZCBjb21wb25lbnRzLgorICAgIEhlcmUgYXJlIHNvbWUgc3BlY2lmaWMgZ3VpZGVsaW5lcyBmb3IgdGVzdGluZyBjb250ZW50IHByb3ZpZGVycy4KKzwvcD4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIFRlc3Qgd2l0aCByZXNvbHZlciBtZXRob2RzOiBFdmVuIHRob3VnaCB5b3UgY2FuIGluc3RhbnRpYXRlIGEgcHJvdmlkZXIgb2JqZWN0IGluCisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuUHJvdmlkZXJUZXN0Q2FzZTJ9LCB5b3Ugc2hvdWxkIGFsd2F5cyB0ZXN0IHdpdGggYSByZXNvbHZlciBvYmplY3QKKyAgICAgICAgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFVSSS4gVGhpcyBlbnN1cmVzIHRoYXQgeW91IGFyZSB0ZXN0aW5nIHRoZSBwcm92aWRlciB1c2luZyB0aGUgc2FtZQorICAgICAgICBpbnRlcmFjdGlvbiB0aGF0IGEgcmVndWxhciBhcHBsaWNhdGlvbiB3b3VsZCB1c2UuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRlc3QgYSBwdWJsaWMgcHJvdmlkZXIgYXMgYSBjb250cmFjdDogSWYgeW91IGludGVudCB5b3VyIHByb3ZpZGVyIHRvIGJlIHB1YmxpYyBhbmQKKyAgICAgICAgYXZhaWxhYmxlIHRvIG90aGVyIGFwcGxpY2F0aW9ucywgeW91IHNob3VsZCB0ZXN0IGl0IGFzIGEgY29udHJhY3QuIFRoaXMgaW5jbHVkZXMKKyAgICAgICAgdGhlIGZvbGxvd2luZyBpZGVhczoKKyAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIFRlc3Qgd2l0aCBjb25zdGFudHMgdGhhdCB5b3VyIHByb3ZpZGVyIHB1YmxpY2x5IGV4cG9zZXMuIEZvcgorICAgICAgICAgICAgICAgIGV4YW1wbGUsIGxvb2sgZm9yIGNvbnN0YW50cyB0aGF0IHJlZmVyIHRvIGNvbHVtbiBuYW1lcyBpbiBvbmUgb2YgdGhlIHByb3ZpZGVyJ3MKKyAgICAgICAgICAgICAgICBkYXRhIHRhYmxlcy4gVGhlc2Ugc2hvdWxkIGFsd2F5cyBiZSBjb25zdGFudHMgcHVibGljbHkgZGVmaW5lZCBieSB0aGUgcHJvdmlkZXIuCisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIFRlc3QgYWxsIHRoZSBVUklzIG9mZmVyZWQgYnkgeW91ciBwcm92aWRlci4gWW91ciBwcm92aWRlciBtYXkgb2ZmZXIgc2V2ZXJhbCBVUklzLAorICAgICAgICAgICAgICAgIGVhY2ggb25lIHJlZmVycmluZyB0byBhIGRpZmZlcmVudCBhc3BlY3Qgb2YgdGhlIGRhdGEuIFRoZQorICAgICAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9Ob3RlUGFkL2luZGV4Lmh0bWwiPk5vdGUgUGFkPC9hPiBzYW1wbGUsCisgICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUsIGZlYXR1cmVzIGEgcHJvdmlkZXIgdGhhdCBvZmZlcnMgb25lIFVSSSBmb3IgcmV0cmlldmluZyBhIGxpc3Qgb2Ygbm90ZXMsCisgICAgICAgICAgICAgICAgYW5vdGhlciBmb3IgcmV0cmlldmluZyBhbiBpbmRpdmlkdWFsIG5vdGUgYnkgaXQncyBkYXRhYmFzZSBJRCwgYW5kIGEgdGhpcmQgZm9yCisgICAgICAgICAgICAgICAgZGlzcGxheWluZyBub3RlcyBpbiBhIGxpdmUgZm9sZGVyLiBUaGUgc2FtcGxlIHRlc3QgcGFja2FnZSBmb3IgTm90ZSBQYWQsCisgICAgICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL05vdGVQYWRUZXN0L2luZGV4Lmh0bWwiPiBOb3RlIFBhZCBUZXN0PC9hPiwgaGFzCisgICAgICAgICAgICAgICAgdW5pdCB0ZXN0cyBmb3IgdHdvIG9mIHRoZXNlIFVSSXMuCisgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIFRlc3QgaW52YWxpZCBVUklzOiBZb3VyIHVuaXQgdGVzdHMgc2hvdWxkIGRlbGliZXJhdGVseSBjYWxsIHRoZSBwcm92aWRlciB3aXRoIGFuCisgICAgICAgICAgICAgICAgaW52YWxpZCBVUkksIGFuZCBsb29rIGZvciBlcnJvcnMuIEdvb2QgcHJvdmlkZXIgZGVzaWduIGlzIHRvIHRocm93IGFuCisgICAgICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGZvciBpbnZhbGlkIFVSSXMuCisKKyAgICAgICAgICAgIDwvbGk+CisgICAgICAgIDwvdWw+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRlc3QgdGhlIHN0YW5kYXJkIHByb3ZpZGVyIGludGVyYWN0aW9uczogTW9zdCBwcm92aWRlcnMgb2ZmZXIgc2l4IGFjY2VzcyBtZXRob2RzOgorICAgICAgICBxdWVyeSwgaW5zZXJ0LCBkZWxldGUsIHVwZGF0ZSwgZ2V0VHlwZSwgYW5kIG9uQ3JlYXRlKCkuIFlvdXIgdGVzdHMgc2hvdWxkIHZlcmlmeSB0aGF0IGFsbAorICAgICAgICBvZiB0aGVzZSBtZXRob2RzIHdvcmsuIFRoZXNlIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIHRvcGljCisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvcHJvdmlkZXJzL2NvbnRlbnQtcHJvdmlkZXJzLmh0bWwiPkNvbnRlbnQgUHJvdmlkZXJzPC9hPi4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgVGVzdCBidXNpbmVzcyBsb2dpYzogRG9uJ3QgZm9yZ2V0IHRvIHRlc3QgdGhlIGJ1c2luZXNzIGxvZ2ljIHRoYXQgeW91ciBwcm92aWRlciBzaG91bGQKKyAgICAgICAgZW5mb3JjZS4gQnVzaW5lc3MgbG9naWMgaW5jbHVkZXMgaGFuZGxpbmcgb2YgaW52YWxpZCB2YWx1ZXMsIGZpbmFuY2lhbCBvciBhcml0aG1ldGljCisgICAgICAgIGNhbGN1bGF0aW9ucywgZWxpbWluYXRpb24gb3IgY29tYmluaW5nIG9mIGR1cGxpY2F0ZXMsIGFuZCBzbyBmb3J0aC4gQSBjb250ZW50IHByb3ZpZGVyCisgICAgICAgIGRvZXMgbm90IGhhdmUgdG8gaGF2ZSBidXNpbmVzcyBsb2dpYywgYmVjYXVzZSBpdCBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgYWN0aXZpdGllcyB0aGF0CisgICAgICAgIG1vZGlmeSB0aGUgZGF0YS4gSWYgdGhlIHByb3ZpZGVyIGRvZXMgaW1wbGVtZW50IGJ1c2luZXNzIGxvZ2ljLCB5b3Ugc2hvdWxkIHRlc3QgaXQuCisgICAgPC9saT4KKzwvdWw+Cis8aDIgaWQ9Ik5leHRTdGVwcyI+TmV4dCBTdGVwczwvaDI+Cis8cD4KKyAgICBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGFuZCBydW4gdGVzdHMgaW4gRWNsaXBzZSwgcGxlYXNlIHJlZmVyIHRvIDxhCisgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+VGVzdGluZyBpbgorICAgIEVjbGlwc2UsIHdpdGggQURUPC9hPi4gSWYgeW91J3JlIG5vdCB3b3JraW5nIGluIEVjbGlwc2UsIHJlZmVyIHRvIDxhCisgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwiPlRlc3RpbmcgaW4gT3RoZXIKKyAgICBJREVzPC9hPi4KKzwvcD4KKzxwPgorICAgIElmIHlvdSB3YW50IGEgc3RlcC1ieS1zdGVwIGludHJvZHVjdGlvbiB0byB0ZXN0aW5nIGFjdGl2aXRpZXMsIHRyeSBvbmUgb2YgdGhlCisgICAgdGVzdGluZyB0dXRvcmlhbHM6Cis8L3A+Cis8dWw+CisgICAgPGxpPgorICAgICAgICBUaGUgPGEKKyAgICAgICAgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9oZWxsb2FuZHJvaWRfdGVzdC5odG1sIj5IZWxsbywKKyAgICAgICAgVGVzdGluZzwvYT4gdHV0b3JpYWwgaW50cm9kdWNlcyBiYXNpYyB0ZXN0aW5nIGNvbmNlcHRzIGFuZCBwcm9jZWR1cmVzIGluIHRoZQorICAgICAgICBjb250ZXh0IG9mIHRoZSBIZWxsbywgV29ybGQgYXBwbGljYXRpb24uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRoZSA8YQorICAgICAgICBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+QWN0aXZpdHkKKyAgICAgICAgVGVzdGluZzwvYT4gdHV0b3JpYWwgaXMgYW4gZXhjZWxsZW50IGZvbGxvdy11cCB0byB0aGUgSGVsbG8sIFRlc3RpbmcgdHV0b3JpYWwuCisgICAgICAgIEl0IGd1aWRlcyB5b3UgdGhyb3VnaCBhIG1vcmUgY29tcGxleCB0ZXN0aW5nIHNjZW5hcmlvIHRoYXQgeW91IGRldmVsb3AgYWdhaW5zdCBhCisgICAgICAgIG1vcmUgcmVhbGlzdGljIGFjdGl2aXR5LW9yaWVudGVkIGFwcGxpY2F0aW9uLgorICAgIDwvbGk+Cis8L3VsPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL2luZGV4LmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL2luZGV4LmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZWQ1YTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvaW5kZXguamQKQEAgLTAsMCArMSw4MCBAQAorcGFnZS50aXRsZT1UZXN0aW5nCitAamQ6Ym9keQorPHA+CisgICAgVGhlIEFuZHJvaWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgaW5jbHVkZXMgYW4gaW50ZWdyYXRlZCB0ZXN0aW5nIGZyYW1ld29yayB0aGF0IGhlbHBzIHlvdQorICAgIHRlc3QgYWxsIGFzcGVjdHMgb2YgeW91ciBhcHBsaWNhdGlvbi4KKzwvcD4KKzxoND5GdW5kYW1lbnRhbHM8L2g0PgorPHA+CisgICAgVG8gc3RhcnQgbGVhcm5pbmcgaG93IHRvIHVzZSB0aGUgZnJhbWV3b3JrIHRvIGNyZWF0ZSB0ZXN0cyBmb3IgeW91ciBhcHBsaWNhdGlvbnMsIHBsZWFzZQorICAgIHJlYWQgdGhlIHRvcGljIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCI+CisgICAgVGVzdGluZyBGdW5kYW1lbnRhbHM8L2E+LgorPC9wPgorPGg0PkNvbmNlcHRzPC9oND4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIFRlc3RpbmcgVG9vbHMgZGVzY3JpYmVzIHRoZSBFY2xpcHNlIHdpdGggQURUIGFuZCBjb21tYW5kLWxpbmUgdG9vbHMgeW91IHVzZSB0byB0ZXN0CisgICAgICAgIEFuZHJvaWQgYXBwbGljYXRpb25zLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBXaGF0IHRvIFRlc3QgaXMgYW4gb3ZlcnZpZXcgb2YgdGhlIHR5cGVzIG9mIHRlc3RpbmcgeW91IHNob3VsZCBkby4gSXQgZm9jdXNlcyBvbiB0ZXN0aW5nCisgICAgICAgIHN5c3RlbS13aWRlIGFzcGVjdHMgb2YgQW5kcm9pZCB0aGF0IGNhbiBhZmZlY3QgZXZlcnkgY29tcG9uZW50IGluIHlvdXIgYXBwbGljYXRpb24uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy9hY3Rpdml0eV90ZXN0aW5nLmh0bWwiPgorICAgICAgICBBY3Rpdml0eSBUZXN0aW5nPC9hPiBmb2N1c2VzIG9uIHRlc3RpbmcgYWN0aXZpdGllcy4gSXQgZGVzY3JpYmVzIGhvdyBpbnN0cnVtZW50YXRpb24gYWxsb3dzCisgICAgICAgIHlvdSB0byBjb250cm9sIGFjdGl2aXRpZXMgb3V0c2lkZSB0aGUgbm9ybWFsIGFwcGxpY2F0aW9uIGxpZmVjeWNsZS4gSXQgYWxzbyBsaXN0cworICAgICAgICBhY3Rpdml0eS1zcGVjaWZpYyBmZWF0dXJlcyB5b3Ugc2hvdWxkIHRlc3QsIGFuZCBpdCBwcm92aWRlcyB0aXBzIGZvciB0ZXN0aW5nIEFuZHJvaWQKKyAgICAgICAgdXNlciBpbnRlcmZhY2VzLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvY29udGVudHByb3ZpZGVyX3Rlc3RpbmcuaHRtbCI+CisgICAgICAgIENvbnRlbnQgUHJvdmlkZXIgVGVzdGluZzwvYT4gZm9jdXNlcyBvbiB0ZXN0aW5nIGNvbnRlbnQgcHJvdmlkZXJzLiBJdCBkZXNjcmliZXMgdGhlCisgICAgICAgIG1vY2sgc3lzdGVtIG9iamVjdHMgeW91IGNhbiB1c2UsIHByb3ZpZGVzIHRpcHMgZm9yIGRlc2lnbmluZyBwcm92aWRlcnMgc28gdGhhdCB0aGV5CisgICAgICAgIGNhbiBiZSB0ZXN0ZWQsIGFuZCBsaXN0cyBwcm92aWRlci1zcGVjaWZpYyBmZWF0dXJlcyB5b3Ugc2hvdWxkIHRlc3QuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy9zZXJ2aWNlX3Rlc3RpbmcuaHRtbCI+CisgICAgICAgIFNlcnZpY2UgVGVzdGluZzwvYT4gZm9jdXNlcyBvbiB0ZXN0aW5nIHNlcnZpY2VzLiBJdCBhbHNvIGxpc3RzIHNlcnZpY2Utc3BlY2lmaWMgZmVhdHVyZXMKKyAgICAgICAgeW91IHNob3VsZCB0ZXN0LgorICAgIDwvbGk+Cis8L3VsPgorPGg0PlByb2NlZHVyZXM8L2g0PgorPHVsPgorICAgIDxsaT4KKyAgICAgICAgVGhlIHRvcGljIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPgorICAgICAgICBUZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPiBkZXNjcmliZXMgaG93IHRvIGNyZWF0ZSBhbmQgcnVuIHRlc3RzIGluIEVjbGlwc2Ugd2l0aCBBRFQuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRoZSB0b3BpYyA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+CisgICAgICAgIFRlc3RpbmcgaW4gb3RoZXIgSURFczwvYT4gZGVzY3JpYmVzIGhvdyB0byBjcmVhdGUgYW5kIHJ1biB0ZXN0cyB3aXRoIGNvbW1hbmQtbGluZSB0b29scy4KKyAgICA8L2xpPgorPC91bD4KKzxoND5UdXRvcmlhbHM8L2g0PgorPHVsPgorICAgIDxsaT4KKyAgICAgICAgVGhlIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+CisgICAgICAgIEhlbGxvLCBUZXN0aW5nPC9hPiB0dXRvcmlhbCBpbnRyb2R1Y2VzIGJhc2ljIHRlc3RpbmcgY29uY2VwdHMgYW5kIHByb2NlZHVyZXMuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEZvciBhIG1vcmUgYWR2YW5jZWQgdHV0b3JpYWwsIHRyeQorICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+QWN0aXZpdHkgVGVzdGluZzwvYT4sCisgICAgICAgIHdoaWNoIGd1aWRlcyB5b3UgdGhyb3VnaCBhIG1vcmUgY29tcGxleCB0ZXN0aW5nIHNjZW5hcmlvLgorICAgIDwvbGk+Cis8L3VsPgorPGg0PlNhbXBsZXM8L2g0PgorPHVsPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL05vdGVQYWRUZXN0Lmh0bWwiPk5vdGUgUGFkIFByb3ZpZGVyCisgICAgICAgIFRlc3Q8L2E+IGlzIGEgdGVzdCBwYWNrYWdlIGZvciB0aGUKKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL05vdGVQYWQuaHRtbCI+Tm90ZSBQYWQ8L2E+IHNhbXBsZQorICAgICAgICBhcHBsaWNhdGlvbi4gSXQgcHJvdmlkZXMgYSBzaW1wbGUgZXhhbXBsZSBvZiB1bml0IHRlc3RpbmcKKyAgICAgICAgYSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcn0uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3NhbXBsZXMvQWxhcm1TZXJ2aWNlVGVzdC5odG1sIj5BbGFybSBTZXJ2aWNlIFRlc3Q8L2E+CisgICAgICAgIGlzIGEgdGVzdCBwYWNrYWdlIGZvciB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL0FsYXJtLmh0bWwiPkFsYXJtPC9hPgorICAgICAgICBzYW1wbGUgYXBwbGljYXRpb24uIEl0IHByb3ZpZGVzIGEgc2ltcGxlIGV4YW1wbGUgb2YgdW5pdAorICAgICAgICB0ZXN0aW5nIGEge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2V9LgorICAgIDwvbGk+Cis8L3VsPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL3NlcnZpY2VfdGVzdGluZy5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy9zZXJ2aWNlX3Rlc3RpbmcuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3OWYzYwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy9zZXJ2aWNlX3Rlc3RpbmcuamQKQEAgLTAsMCArMSwxNzggQEAKK3BhZ2UudGl0bGU9U2VydmljZSBUZXN0aW5nCitAamQ6Ym9keQorCis8ZGl2IGlkPSJxdi13cmFwcGVyIj4KKyAgPGRpdiBpZD0icXYiPgorICA8aDI+SW4gdGhpcyBkb2N1bWVudDwvaDI+CisgIDxvbD4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNEZXNpZ25BbmRUZXN0Ij5TZXJ2aWNlIERlc2lnbiBhbmQgVGVzdGluZzwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0iI1NlcnZpY2VUZXN0Q2FzZSI+U2VydmljZVRlc3RDYXNlPC9hPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICA8YSBocmVmPSIjTW9ja09iamVjdHMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2E+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNUZXN0QXJlYXMiPldoYXQgdG8gVGVzdDwvYT4KKyAgICA8L2xpPgorICA8L29sPgorICA8aDI+S2V5IENsYXNzZXM8L2gyPgorICAgIDxvbD4KKyAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9PC9saT4KKyAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX08L2xpPgorICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb259PC9saT4KKyAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0LlJlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHR9PC9saT4KKyAgICA8L29sPgorICA8aDI+UmVsYXRlZCBUdXRvcmlhbHM8L2gyPgorICAgIDxvbD4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9oZWxsb2FuZHJvaWRfdGVzdC5odG1sIj4KKyAgICAgICAgICAgIEhlbGxvLCBUZXN0aW5nPC9hPgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+QWN0aXZpdHkgVGVzdGluZzwvYT4KKyAgICAgICAgPC9saT4KKyAgICA8L29sPgorICA8aDI+U2VlIEFsc288L2gyPgorICAgICAgPG9sPgorICAgICAgICA8bGk+CisgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+CisgICAgICAgICAgVGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj4KKyAgICAgICAgICBUZXN0aW5nIGluIE90aGVyIElERXM8L2E+CisgICAgICAgIDwvbGk+CisgICAgICA8L29sPgorICA8L2Rpdj4KKzwvZGl2PgorPHA+CisgICAgQW5kcm9pZCBwcm92aWRlcyBhIHRlc3RpbmcgZnJhbWV3b3JrIGZvciBTZXJ2aWNlIG9iamVjdHMgdGhhdCBjYW4gcnVuIHRoZW0gaW4KKyAgICBpc29sYXRpb24gYW5kIHByb3ZpZGVzIG1vY2sgb2JqZWN0cy4gVGhlIHRlc3QgY2FzZSBjbGFzcyBmb3IgU2VydmljZSBvYmplY3RzIGlzCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2V9LiBTaW5jZSB0aGUgU2VydmljZSBjbGFzcyBhc3N1bWVzIHRoYXQgaXQgaXMgc2VwYXJhdGUKKyAgICBmcm9tIGl0cyBjbGllbnRzLCB5b3UgY2FuIHRlc3QgYSBTZXJ2aWNlIG9iamVjdCB3aXRob3V0IHVzaW5nIGluc3RydW1lbnRhdGlvbi4KKzwvcD4KKzxwPgorICAgIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRlY2huaXF1ZXMgZm9yIHRlc3RpbmcgU2VydmljZSBvYmplY3RzLiBJZiB5b3UgYXJlbid0IGZhbWlsaWFyIHdpdGggdGhlCisgICAgU2VydmljZSBjbGFzcywgcGxlYXNlIHJlYWQgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMuaHRtbCI+CisgICAgQXBwbGljYXRpb24gRnVuZGFtZW50YWxzPC9hPi4gSWYgeW91IGFyZW4ndCBmYW1pbGlhciB3aXRoIEFuZHJvaWQgdGVzdGluZywgcGxlYXNlIHJlYWQKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPlRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPiwKKyAgICB0aGUgaW50cm9kdWN0aW9uIHRvIHRoZSBBbmRyb2lkIHRlc3RpbmcgYW5kIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsuCis8L3A+Cis8aDIgaWQ9IkRlc2lnbkFuZFRlc3QiPlNlcnZpY2UgRGVzaWduIGFuZCBUZXN0aW5nPC9oMj4KKzxwPgorICAgIFdoZW4geW91IGRlc2lnbiBhIFNlcnZpY2UsIHlvdSBzaG91bGQgY29uc2lkZXIgaG93IHlvdXIgdGVzdHMgY2FuIGV4YW1pbmUgdGhlIHZhcmlvdXMgc3RhdGVzCisgICAgb2YgdGhlIFNlcnZpY2UgbGlmZWN5Y2xlLiBJZiB0aGUgbGlmZWN5Y2xlIG1ldGhvZHMgdGhhdCBzdGFydCB1cCB5b3VyIFNlcnZpY2UsIHN1Y2ggYXMKKyAgICB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvbkNyZWF0ZSgpIG9uQ3JlYXRlKCl9IG9yCisgICAge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2Ujb25TdGFydENvbW1hbmQoSW50ZW50LCBpbnQsIGludCkgb25TdGFydENvbW1hbmQoKX0gZG8gbm90IG5vcm1hbGx5CisgICAgc2V0IGEgZ2xvYmFsIHZhcmlhYmxlIHRvIGluZGljYXRlIHRoYXQgdGhleSB3ZXJlIHN1Y2Nlc3NmdWwsIHlvdSBtYXkgd2FudCB0byBwcm92aWRlIHN1Y2ggYQorICAgIHZhcmlhYmxlIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorPC9wPgorPHA+CisgICAgTW9zdCBvdGhlciB0ZXN0aW5nIGlzIGZhY2lsaXRhdGVkIGJ5IHRoZSBtZXRob2RzIGluIHRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX0KKyAgICB0ZXN0IGNhc2UgY2xhc3MuIEZvciBleGFtcGxlLCB0aGUge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2UjZ2V0U2VydmljZSgpfSBtZXRob2QKKyAgICByZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBTZXJ2aWNlIHVuZGVyIHRlc3QsIHdoaWNoIHlvdSBjYW4gdGVzdCB0byBjb25maXJtIHRoYXQgdGhlIFNlcnZpY2UgaXMKKyAgICBydW5uaW5nIGV2ZW4gYXQgdGhlIGVuZCBvZiB5b3VyIHRlc3RzLgorPC9wPgorPGgyIGlkPSJTZXJ2aWNlVGVzdENhc2UiPlNlcnZpY2VUZXN0Q2FzZTwvaDI+Cis8cD4KKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX0gZXh0ZW5kcyB0aGUgSlVuaXQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZX0gY2xhc3MKKyAgICB3aXRoIHdpdGggbWV0aG9kcyBmb3IgdGVzdGluZyBhcHBsaWNhdGlvbiBwZXJtaXNzaW9ucyBhbmQgZm9yIGNvbnRyb2xsaW5nIHRoZSBhcHBsaWNhdGlvbiBhbmQKKyAgICBTZXJ2aWNlIHVuZGVyIHRlc3QuIEl0IGFsc28gcHJvdmlkZXMgbW9jayBhcHBsaWNhdGlvbiBhbmQgQ29udGV4dCBvYmplY3RzIHRoYXQgaXNvbGF0ZSB5b3VyCisgICAgdGVzdCBmcm9tIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0uCis8L3A+Cis8cD4KKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX0gZGVmZXJzIGluaXRpYWxpemF0aW9uIG9mIHRoZSB0ZXN0IGVudmlyb25tZW50IHVudGlsIHlvdQorICAgIGNhbGwge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2Ujc3RhcnRTZXJ2aWNlKEludGVudCkgU2VydmljZVRlc3RDYXNlLnN0YXJ0U2VydmljZSgpfSBvcgorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuU2VydmljZVRlc3RDYXNlI2JpbmRTZXJ2aWNlKEludGVudCkgU2VydmljZVRlc3RDYXNlLmJpbmRTZXJ2aWNlKCl9LiBUaGlzCisgICAgYWxsb3dzIHlvdSB0byBzZXQgdXAgeW91ciB0ZXN0IGVudmlyb25tZW50LCBwYXJ0aWN1bGFybHkgeW91ciBtb2NrIG9iamVjdHMsIGJlZm9yZSB0aGUgU2VydmljZQorICAgIGlzIHN0YXJ0ZWQuCis8L3A+Cis8cD4KKyAgICBOb3RpY2UgdGhhdCB0aGUgcGFyYW1ldGVycyB0byA8Y29kZT5TZXJ2aWNlVGVzdENhc2UuYmluZFNlcnZpY2UoKTwvY29kZT5hcmUgZGlmZmVyZW50IGZyb20KKyAgICB0aG9zZSBmb3IgPGNvZGU+U2VydmljZS5iaW5kU2VydmljZSgpPC9jb2RlPi4gRm9yIHRoZSA8Y29kZT5TZXJ2aWNlVGVzdENhc2U8L2NvZGU+IHZlcnNpb24sCisgICAgeW91IG9ubHkgcHJvdmlkZSBhbiBJbnRlbnQuIEluc3RlYWQgb2YgcmV0dXJuaW5nIGEgYm9vbGVhbiwKKyAgICA8Y29kZT5TZXJ2aWNlVGVzdENhc2UuYmluZFNlcnZpY2UoKTwvY29kZT4gcmV0dXJucyBhbiBvYmplY3QgdGhhdCBzdWJjbGFzc2VzCisgICAge0BsaW5rIGFuZHJvaWQub3MuSUJpbmRlcn0uCis8L3A+Cis8cD4KKyAgICBUaGUge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2Ujc2V0VXAoKX0gbWV0aG9kIGZvciB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX0KKyAgICBpcyBjYWxsZWQgYmVmb3JlIGVhY2ggdGVzdC4gSXQgc2V0cyB1cCB0aGUgdGVzdCBmaXh0dXJlIGJ5IG1ha2luZyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgc3lzdGVtCisgICAgQ29udGV4dCBiZWZvcmUgYW55IHRlc3QgbWV0aG9kcyB0b3VjaCBpdC4gWW91IGNhbiByZXRyaWV2ZSB0aGlzIENvbnRleHQgYnkgY2FsbGluZworICAgIHtAbGluayBhbmRyb2lkLnRlc3QuU2VydmljZVRlc3RDYXNlI2dldFN5c3RlbUNvbnRleHQoKX0uIElmIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgeW91IG11c3QKKyAgICBjYWxsIDxjb2RlPnN1cGVyLnNldFVwKCk8L2NvZGU+IGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlIG92ZXJyaWRlLgorPC9wPgorPHA+CisgICAgVGhlIG1ldGhvZHMge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2Ujc2V0QXBwbGljYXRpb24oQXBwbGljYXRpb24pIHNldEFwcGxpY2F0aW9uKCl9CisgICAgYW5kIHtAbGluayBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlI3NldENvbnRleHQoQ29udGV4dCl9IHNldENvbnRleHQoKX0gYWxsb3cgeW91IHRvIHNldAorICAgIGEgbW9jayBDb250ZXh0IG9yIG1vY2sgQXBwbGljYXRpb24gKG9yIGJvdGgpIGZvciB0aGUgU2VydmljZSwgYmVmb3JlIHlvdSBzdGFydCBpdC4gVGhlc2UgbW9jaworICAgIG9iamVjdHMgYXJlIGRlc2NyaWJlZCBpbiA8YSBocmVmPSIjTW9ja09iamVjdHMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2E+LgorPC9wPgorPHA+CisgICAgQnkgZGVmYXVsdCwge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2V9IHJ1bnMgdGhlIHRlc3QgbWV0aG9kCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2UjdGVzdEFuZHJvaWRUZXN0Q2FzZVNldHVwUHJvcGVybHkoKX0sIHdoaWNoIGFzc2VydHMgdGhhdAorICAgIHRoZSBiYXNlIHRlc3QgY2FzZSBjbGFzcyBzdWNjZXNzZnVsbHkgc2V0IHVwIGEgQ29udGV4dCBiZWZvcmUgcnVubmluZy4KKzwvcD4KKzxoMiBpZD0iTW9ja09iamVjdHMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2gyPgorPHA+CisgICAgPGNvZGU+U2VydmljZVRlc3RDYXNlPC9jb2RlPiBhc3N1bWVzIHRoYXQgeW91IHdpbGwgdXNlIGEgbW9jayBDb250ZXh0IG9yIG1vY2sgQXBwbGljYXRpb24KKyAgICAob3IgYm90aCkgZm9yIHRoZSB0ZXN0IGVudmlyb25tZW50LiBUaGVzZSBvYmplY3RzIGlzb2xhdGUgdGhlIHRlc3QgZW52aXJvbm1lbnQgZnJvbSB0aGUKKyAgICByZXN0IG9mIHRoZSBzeXN0ZW0uIElmIHlvdSBkb24ndCBwcm92aWRlIHlvdXIgb3duIGluc3RhbmNlcyBvZiB0aGVzZSBvYmplY3RzIGJlZm9yZSB5b3UKKyAgICBzdGFydCB0aGUgU2VydmljZSwgdGhlbiB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX0gd2lsbCBjcmVhdGUgaXRzIG93biBpbnRlcm5hbAorICAgIGluc3RhbmNlcyBhbmQgaW5qZWN0IHRoZW0gaW50byB0aGUgU2VydmljZS4gWW91IGNhbiBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIGJ5IGNyZWF0aW5nIGFuZAorICAgIGluamVjdGluZyB5b3VyIG93biBpbnN0YW5jZXMgYmVmb3JlIHN0YXJ0aW5nIHRoZSBTZXJ2aWNlCis8L3A+Cis8cD4KKyAgICBUbyBpbmplY3QgYSBtb2NrIEFwcGxpY2F0aW9uIG9iamVjdCBpbnRvIHRoZSBTZXJ2aWNlIHVuZGVyIHRlc3QsIGZpcnN0IGNyZWF0ZSBhIHN1YmNsYXNzIG9mCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbn0uIDxjb2RlPk1vY2tBcHBsaWNhdGlvbjwvY29kZT4gaXMgYSBzdWJjbGFzcyBvZgorICAgIHtAbGluayBhbmRyb2lkLmFwcC5BcHBsaWNhdGlvbn0gaW4gd2hpY2ggYWxsIHRoZSBtZXRob2RzIHRocm93IGFuIEV4Y2VwdGlvbiwgc28gdG8gdXNlIGl0CisgICAgZWZmZWN0aXZlbHkgeW91IHN1YmNsYXNzIGl0IGFuZCBvdmVycmlkZSB0aGUgbWV0aG9kcyB5b3UgbmVlZC4gWW91IHRoZW4gaW5qZWN0IGl0IGludG8gdGhlCisgICAgU2VydmljZSB3aXRoIHRoZQorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuU2VydmljZVRlc3RDYXNlI3NldEFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uKSBzZXRBcHBsaWNhdGlvbigpfSBtZXRob2QuCisgICAgVGhpcyBtb2NrIG9iamVjdCBhbGxvd3MgeW91IHRvIGNvbnRyb2wgdGhlIGFwcGxpY2F0aW9uIHZhbHVlcyB0aGF0IHRoZSBTZXJ2aWNlIHNlZXMsIGFuZAorICAgIGlzb2xhdGVzIGl0IGZyb20gdGhlIHJlYWwgc3lzdGVtLiBJbiBhZGRpdGlvbiwgYW55IGhpZGRlbiBkZXBlbmRlbmNpZXMgeW91ciBTZXJ2aWNlIGhhcyBvbgorICAgIGl0cyBhcHBsaWNhdGlvbiByZXZlYWwgdGhlbXNlbHZlcyBhcyBleGNlcHRpb25zIHdoZW4geW91IHJ1biB0aGUgdGVzdC4KKzwvcD4KKzxwPgorICAgIFlvdSBpbmplY3QgYSBtb2NrIENvbnRleHQgaW50byB0aGUgU2VydmljZSB1bmRlciB0ZXN0IHdpdGggdGhlCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2Ujc2V0Q29udGV4dChDb250ZXh0KSBzZXRDb250ZXh0KCl9IG1ldGhvZC4gVGhlIG1vY2sKKyAgICBDb250ZXh0IGNsYXNzZXMgeW91IGNhbiB1c2UgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCNNb2NrT2JqZWN0Q2xhc3NlcyI+CisgICAgVGVzdGluZyBGdW5kYW1lbnRhbHM8L2E+LgorPC9wPgorPGgyIGlkPSJUZXN0QXJlYXMiPldoYXQgdG8gVGVzdDwvaDI+Cis8cD4KKyAgICBUaGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3doYXRfdG9fdGVzdC5odG1sIj5XaGF0IFRvIFRlc3Q8L2E+CisgICAgbGlzdHMgZ2VuZXJhbCBjb25zaWRlcmF0aW9ucyBmb3IgdGVzdGluZyBBbmRyb2lkIGNvbXBvbmVudHMuCisgICAgSGVyZSBhcmUgc29tZSBzcGVjaWZpYyBndWlkZWxpbmVzIGZvciB0ZXN0aW5nIGEgU2VydmljZToKKzwvcD4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIEVuc3VyZSB0aGF0IHRoZSB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvbkNyZWF0ZSgpfSBpcyBjYWxsZWQgaW4gcmVzcG9uc2UgdG8KKyAgICAgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I3N0YXJ0U2VydmljZShJbnRlbnQpIENvbnRleHQuc3RhcnRTZXJ2aWNlKCl9IG9yCisgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2JpbmRTZXJ2aWNlKEludGVudCxTZXJ2aWNlQ29ubmVjdGlvbixpbnQpIENvbnRleHQuYmluZFNlcnZpY2UoKX0uCisgICAgICAgIFNpbWlsYXJseSwgeW91IHNob3VsZCBlbnN1cmUgdGhhdCB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvbkRlc3Ryb3koKX0gaXMgY2FsbGVkIGluCisgICAgICAgIHJlc3BvbnNlIHRvIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNzdG9wU2VydmljZShJbnRlbnQpIENvbnRleHQuc3RvcFNlcnZpY2UoKX0sCisgICAgICAgIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCN1bmJpbmRTZXJ2aWNlKFNlcnZpY2VDb25uZWN0aW9uKSBDb250ZXh0LnVuYmluZFNlcnZpY2UoKX0sCisgICAgICAgIHtAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI3N0b3BTZWxmKCl9LCBvcgorICAgICAgICB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNzdG9wU2VsZlJlc3VsdChpbnQpIHN0b3BTZWxmUmVzdWx0KCl9LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBUZXN0IHRoYXQgeW91ciBTZXJ2aWNlIGNvcnJlY3RseSBoYW5kbGVzIG11bHRpcGxlIGNhbGxzIGZyb20KKyAgICAgICAgPGNvZGU+Q29udGV4dC5zdGFydFNlcnZpY2UoKTwvY29kZT4uIE9ubHkgdGhlIGZpcnN0IGNhbGwgdHJpZ2dlcnMKKyAgICAgICAgPGNvZGU+U2VydmljZS5vbkNyZWF0ZSgpPC9jb2RlPiwgYnV0IGFsbCBjYWxscyB0cmlnZ2VyIGEgY2FsbCB0bworICAgICAgICA8Y29kZT5TZXJ2aWNlLm9uU3RhcnRDb21tYW5kKCk8L2NvZGU+LgorICAgICAgICA8cD4KKyAgICAgICAgICAgIEluIGFkZGl0aW9uLCByZW1lbWJlciB0aGF0IDxjb2RlPnN0YXJ0U2VydmljZSgpPC9jb2RlPiBjYWxscyBkb24ndAorICAgICAgICAgICAgbmVzdCwgc28gYSBzaW5nbGUgY2FsbCB0byA8Y29kZT5Db250ZXh0LnN0b3BTZXJ2aWNlKCk8L2NvZGU+IG9yCisgICAgICAgICAgICA8Y29kZT5TZXJ2aWNlLnN0b3BTZWxmKCk8L2NvZGU+IChidXQgbm90IDxjb2RlPnN0b3BTZWxmKGludCk8L2NvZGU+KQorICAgICAgICAgICAgd2lsbCBzdG9wIHRoZSBTZXJ2aWNlLiBZb3Ugc2hvdWxkIHRlc3QgdGhhdCB5b3VyIFNlcnZpY2Ugc3RvcHMgYXQgdGhlIGNvcnJlY3QgcG9pbnQuCisgICAgICAgIDwvcD4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgVGVzdCBhbnkgYnVzaW5lc3MgbG9naWMgdGhhdCB5b3VyIFNlcnZpY2UgaW1wbGVtZW50cy4gQnVzaW5lc3MgbG9naWMgaW5jbHVkZXMgY2hlY2tpbmcgZm9yCisgICAgICAgIGludmFsaWQgdmFsdWVzLCBmaW5hbmNpYWwgYW5kIGFyaXRobWV0aWMgY2FsY3VsYXRpb25zLCBhbmQgc28gZm9ydGguCisgICAgPC9saT4KKzwvdWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5qZAppbmRleCA5MzVhYWY5Li4xZDVmOTExIDEwMDc1NQotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuamQKQEAgLTEsNCArMSw0IEBACi1wYWdlLnRpdGxlPVRlc3RpbmcgYW5kIEluc3RydW1lbnRhdGlvbgorcGFnZS50aXRsZT1UZXN0aW5nIEZ1bmRhbWVudGFscwogQGpkOmJvZHkKIAogPGRpdiBpZD0icXYtd3JhcHBlciI+CkBAIC02LDY1ICs2LDYyIEBACiAgIDxoMj5JbiB0aGlzIGRvY3VtZW50PC9oMj4KICAgPG9sPgogICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0iI092ZXJ2aWV3Ij5PdmVydmlldzwvYT4KKyAgICAgICAgPGEgaHJlZj0iI1Rlc3RTdHJ1Y3R1cmUiPlRlc3QgU3RydWN0dXJlPC9hPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICA8YSBocmVmPSIjVGVzdFByb2plY3RzIj5UZXN0IFByb2plY3RzPC9hPgogICAgIDwvbGk+CiAgICAgPGxpPgogICAgICAgPGEgaHJlZj0iI1Rlc3RBUEkiPlRoZSBUZXN0aW5nIEFQSTwvYT4KICAgICAgIDxvbD4KICAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IiNFeHRlbnNpb25zIj5KVW5pdCB0ZXN0IGNhc2UgY2xhc3NlczwvYT4KKyAgICAgICAgICA8YSBocmVmPSIjSlVuaXQiPkpVbml0PC9hPgogICAgICAgICA8L2xpPgogICAgICAgICA8bGk+Ci0gICAgICAgICAgPGEgaHJlZj0iI0luc3RydW1lbnRhdGlvbiI+SW5zdHJ1bWVudGF0aW9uIHRlc3QgY2FzZSBjbGFzc2VzPC9hPgorICAgICAgICAgIDxhIGhyZWY9IiNJbnN0cnVtZW50YXRpb24iPkluc3RydW1lbnRhdGlvbjwvYT4KICAgICAgICAgPC9saT4KICAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IiNBc3NlcnQiPkFzc2VydCBjbGFzc2VzPC9hPgorICAgICAgICAgICAgPGEgaHJlZj0iI1Rlc3RDYXNlQ2xhc3NlcyI+VGVzdCBjYXNlIGNsYXNzZXM8L2E+CiAgICAgICAgIDwvbGk+CiAgICAgICAgIDxsaT4KLSAgICAgICAgICA8YSBocmVmPSIjTW9ja09iamVjdHMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2E+CisgICAgICAgICAgPGEgaHJlZj0iI0Fzc2VydGlvbkNsYXNzZXMiPkFzc2VydGlvbiBjbGFzc2VzPC9hPgogICAgICAgICA8L2xpPgotICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIj5JbnN0cnVtZW50YXRpb24gVGVzdCBSdW5uZXI8L2E+Ci0gICAgICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgPGEgaHJlZj0iI01vY2tPYmplY3RDbGFzc2VzIj5Nb2NrIG9iamVjdCBjbGFzc2VzPC9hPgorICAgICAgICA8L2xpPgogICAgICAgPC9vbD4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgPGEgaHJlZj0iI1Rlc3RFbnZpcm9tZW50Ij5Xb3JraW5nIGluIHRoZSBUZXN0IEVudmlyb25tZW50PC9hPgorICAgICAgICA8YSBocmVmPSIjSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciI+UnVubmluZyBUZXN0czwvYT4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0iI1Rlc3RBcmVhcyI+V2hhdCB0byBUZXN0PC9hPgorICAgICAgICA8YSBocmVmPSIjVGVzdFJlc3VsdHMiPlNlZWluZyBUZXN0IFJlc3VsdHM8L2E+CiAgICAgPC9saT4KICAgICA8bGk+Ci0gICAgICA8YSBocmVmPSIjVUlUZXN0aW5nIj5BcHBlbmRpeDogVUkgVGVzdGluZyBOb3RlczwvYT4KLSAgICAgIDxvbD4KLSAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IiNSdW5PblVJVGhyZWFkIj5UZXN0aW5nIG9uIHRoZSBVSSB0aHJlYWQ8L2E+Ci0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT4KLSAgICAgICAgICA8YSBocmVmPSIjTm90b3VjaE1vZGUiPlR1cm5pbmcgb2ZmIHRvdWNoIG1vZGU8L2E+Ci0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT4KLSAgICAgICAgICA8YSBocmVmPSIjVW5sb2NrRGV2aWNlIj5VbmxvY2tpbmcgdGhlIEVtdWxhdG9yIG9yIERldmljZTwvYT4KLSAgICAgICAgPC9saT4KLSAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IiNVSVRlc3RUcm91Ymxlc2hvb3RpbmciPlRyb3VibGVzaG9vdGluZyBVSSB0ZXN0czwvYT4KLSAgICAgICAgPC9saT4KLSAgICAgIDwvb2w+CisgICAgICAgIDxhIGhyZWY9IiNNb25rZXlzIj5Nb25rZXkgYW5kIE1vbmtleVJ1bm5lcjwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICA8YSBocmVmPSIjUGFja2FnZU5hbWVzIj5Xb3JraW5nIFdpdGggUGFja2FnZSBOYW1lczwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0iI1doYXRUb1Rlc3QiPldoYXQgVG8gVGVzdDwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0iI05leHRTdGVwcyI+TmV4dCBTdGVwczwvYT4KICAgICA8L2xpPgogICA8L29sPgogICA8aDI+S2V5IGNsYXNzZXM8L2gyPgogICAgIDxvbD4KICAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9PC9saT4KLSAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyfTwvbGk+Ci0gICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eVVuaXRUZXN0Q2FzZX08L2xpPgotICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3QuQXBwbGljYXRpb25UZXN0Q2FzZX08L2xpPgotICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3QuUHJvdmlkZXJUZXN0Q2FzZTJ9PC9saT4KLSAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX08L2xpPgorICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3R9PC9saT4KKyAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2t9PC9saT4KKyAgICAgIDxsaT57QGxpbmsganVuaXQuZnJhbWV3b3JrfTwvbGk+CiAgICAgPC9vbD4KICAgPGgyPlJlbGF0ZWQgdHV0b3JpYWxzPC9oMj4KICAgICA8b2w+CiAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+SGVsbG8sIFRlc3Rpbmc8L2E+CisgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2hlbGxvYW5kcm9pZF90ZXN0Lmh0bWwiPgorICAgICAgICAgICAgSGVsbG8sIFRlc3Rpbmc8L2E+CiAgICAgICAgIDwvbGk+CiAgICAgICAgIDxsaT4KICAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sIj5BY3Rpdml0eSBUZXN0aW5nPC9hPgpAQCAtNzMsNDQ1ICs3MCw1OTAgQEAKICAgPGgyPlNlZSBhbHNvPC9oMj4KICAgICAgIDxvbD4KICAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+CisgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+CisgICAgICAgICAgVGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4KICAgICAgICAgPC9saT4KICAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyIElERXM8L2E+CisgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwiPgorICAgICAgICAgIFRlc3RpbmcgaW4gT3RoZXIgSURFczwvYT4KICAgICAgICAgPC9saT4KICAgICAgIDwvb2w+CiAgIDwvZGl2PgogPC9kaXY+Ci0KLTxwPkFuZHJvaWQgaW5jbHVkZXMgYSBwb3dlcmZ1bCBzZXQgb2YgdGVzdGluZyB0b29scyB0aGF0IGV4dGVuZCB0aGUKLWluZHVzdHJ5LXN0YW5kYXJkIEpVbml0IHRlc3QgZnJhbWV3b3JrIHdpdGggZmVhdHVyZXMgc3BlY2lmaWMgdG8gdGhlIEFuZHJvaWQKLWVudmlyb25tZW50LiBBbHRob3VnaCB5b3UgY2FuIHRlc3QgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbiB3aXRoIEpVbml0LCB0aGUKLUFuZHJvaWQgdG9vbHMgYWxsb3cgeW91IHRvIHdyaXRlIG11Y2ggbW9yZSBzb3BoaXN0aWNhdGVkIHRlc3RzIGZvciBldmVyeSBhc3BlY3QKLW9mIHlvdXIgYXBwbGljYXRpb24sIGJvdGggYXQgdGhlIHVuaXQgYW5kIGZyYW1ld29yayBsZXZlbHMuPC9wPgotCi08cD5LZXkgZmVhdHVyZXMgb2YgdGhlIEFuZHJvaWQgdGVzdGluZyBlbnZpcm9ubWVudCBpbmNsdWRlOjwvcD4KLQorPHA+CisgICAgVGhlIEFuZHJvaWQgdGVzdGluZyBmcmFtZXdvcmssIGFuIGludGVncmFsIHBhcnQgb2YgdGhlIGRldmVsb3BtZW50IGVudmlyb25tZW50LAorICAgIHByb3ZpZGVzIGFuIGFyY2hpdGVjdHVyZSBhbmQgcG93ZXJmdWwgdG9vbHMgdGhhdCBoZWxwIHlvdSB0ZXN0IGV2ZXJ5IGFzcGVjdCBvZiB5b3VyIGFwcGxpY2F0aW9uCisgICAgYXQgZXZlcnkgbGV2ZWwgZnJvbSB1bml0IHRvIGZyYW1ld29yay4KKzwvcD4KKzxwPgorICAgIFRoZSB0ZXN0aW5nIGZyYW1ld29yayBoYXMgdGhlc2Uga2V5IGZlYXR1cmVzOgorPC9wPgogPHVsPgotICA8bGk+QW5kcm9pZCBleHRlbnNpb25zIHRvIHRoZSBKVW5pdCBmcmFtZXdvcmsgdGhhdCBwcm92aWRlIGFjY2VzcyB0byBBbmRyb2lkCi1zeXN0ZW0gb2JqZWN0cy48L2xpPgotICA8bGk+QW4gaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yayB0aGF0IGxldHMgdGVzdHMgY29udHJvbCBhbmQgZXhhbWluZSB0aGUKLWFwcGxpY2F0aW9uLjwvbGk+Ci0gIDxsaT5Nb2NrIHZlcnNpb25zIG9mIGNvbW1vbmx5LXVzZWQgQW5kcm9pZCBzeXN0ZW0gb2JqZWN0cy48L2xpPgotICA8bGk+VG9vbHMgZm9yIHJ1bm5pbmcgc2luZ2xlIHRlc3RzIG9yIHRlc3Qgc3VpdGVzLCB3aXRoIG9yIHdpdGhvdXQKLWluc3RydW1lbnRhdGlvbi48L2xpPgotICA8bGk+U3VwcG9ydCBmb3IgbWFuYWdpbmcgdGVzdHMgYW5kIHRlc3QgcHJvamVjdHMgaW4gdGhlIEFEVCBQbHVnaW4gZm9yIEVjbGlwc2UKLWFuZCBhdCB0aGUgY29tbWFuZCBsaW5lLjwvbGk+CisgICAgPGxpPgorICAgICAgICBBbmRyb2lkIHRlc3Qgc3VpdGVzIGFyZSBiYXNlZCBvbiBKVW5pdC4gWW91IGNhbiB1c2UgcGxhaW4gSlVuaXQgdG8gdGVzdCBhIGNsYXNzIHRoYXQgZG9lc24ndAorICAgICAgICBjYWxsIHRoZSBBbmRyb2lkIEFQSSwgb3IgQW5kcm9pZCdzIEpVbml0IGV4dGVuc2lvbnMgdG8gdGVzdCBBbmRyb2lkIGNvbXBvbmVudHMuIElmIHlvdSdyZQorICAgICAgICBuZXcgdG8gQW5kcm9pZCB0ZXN0aW5nLCB5b3UgY2FuIHN0YXJ0IHdpdGggZ2VuZXJhbC1wdXJwb3NlIHRlc3QgY2FzZSBjbGFzc2VzIHN1Y2ggYXMge0BsaW5rCisgICAgICAgIGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2V9IGFuZCB0aGVuIGdvIG9uIHRvIHVzZSBtb3JlIHNvcGhpc3RpY2F0ZWQgY2xhc3Nlcy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgVGhlIEFuZHJvaWQgSlVuaXQgZXh0ZW5zaW9ucyBwcm92aWRlIGNvbXBvbmVudC1zcGVjaWZpYyB0ZXN0IGNhc2UgY2xhc3Nlcy4gVGhlc2UgY2xhc3NlcworICAgICAgICBwcm92aWRlIGhlbHBlciBtZXRob2RzIGZvciBjcmVhdGluZyBtb2NrIG9iamVjdHMgYW5kIG1ldGhvZHMgdGhhdCBoZWxwIHlvdSBjb250cm9sIHRoZQorICAgICAgICBsaWZlY3ljbGUgb2YgYSBjb21wb25lbnQuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRlc3Qgc3VpdGVzIGFyZSBjb250YWluZWQgaW4gdGVzdCBwYWNrYWdlcyB0aGF0IGFyZSBzaW1pbGFyIHRvIG1haW4gYXBwbGljYXRpb24gcGFja2FnZXMsIHNvCisgICAgICAgIHlvdSBkb24ndCBuZWVkIHRvIGxlYXJuIGEgbmV3IHNldCBvZiB0b29scyBvciB0ZWNobmlxdWVzIGZvciBkZXNpZ25pbmcgYW5kIGJ1aWxkaW5nIHRlc3RzLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBUaGUgU0RLIHRvb2xzIGZvciBidWlsZGluZyBhbmQgdGVzdHMgYXJlIGF2YWlsYWJsZSBpbiBFY2xpcHNlIHdpdGggQURULCBhbmQgYWxzbyBpbgorICAgICAgICBjb21tYW5kLWxpbmUgZm9ybSBmb3IgdXNlIHdpdGggb3RoZXIgSURFUy4gVGhlc2UgdG9vbHMgZ2V0IGluZm9ybWF0aW9uIGZyb20gdGhlIHByb2plY3Qgb2YKKyAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgYW5kIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGF1dG9tYXRpY2FsbHkgY3JlYXRlIHRoZSBidWlsZCBmaWxlcywKKyAgICAgICAgbWFuaWZlc3QgZmlsZSwgYW5kIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIHRoZSB0ZXN0IHBhY2thZ2UuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRoZSBTREsgYWxzbyBwcm92aWRlcworICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvbW9ua2V5cnVubmVyLmh0bWwiPk1vbmtleVJ1bm5lcjwvYT4sIGFuIEFQSSBmb3IKKyAgICAgICAgdGVzdGluZyBkZXZpY2VzIHdpdGggSnl0aG9uIHNjcmlwdHMsIGFuZCA8YQorICAgICAgICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9tb25rZXkuaHRtbCI+TW9ua2V5PC9hPiwgYSBjb21tYW5kLWxpbmUgdG9vbCBmb3IKKyAgICAgICAgc3RyZXNzLXRlc3RpbmcgVUlzIGJ5IHNlbmRpbmcgcHNldWRvLXJhbmRvbSBldmVudHMgdG8gYSBkZXZpY2UuCisgICAgPC9saT4KIDwvdWw+Ci0KLTxwPlRoaXMgZG9jdW1lbnQgaXMgYW4gb3ZlcnZpZXcgb2YgdGhlIEFuZHJvaWQgdGVzdGluZyBlbnZpcm9ubWVudCBhbmQgdGhlIHdheQoteW91IHVzZSBpdC4gVGhlIGRvY3VtZW50IGFzc3VtZXMgeW91IGhhdmUgYSBiYXNpYyBrbm93bGVkZ2Ugb2YgQW5kcm9pZAotYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcgYW5kIEpVbml0IHRlc3RpbmcgbWV0aG9kb2xvZ3kuPC9wPgotCi08aDIgaWQ9Ik92ZXJ2aWV3Ij5PdmVydmlldzwvaDI+Ci0KLTxwPiBBdCB0aGUgaGVhcnQgb2YgdGhlIEFuZHJvaWQgdGVzdGluZyBlbnZpcm9ubWVudCBpcyBhbiBpbnN0cnVtZW50YXRpb24KLWZyYW1ld29yayB0aGF0IHlvdXIgdGVzdCBhcHBsaWNhdGlvbiB1c2VzIHRvIHByZWNpc2VseSBjb250cm9sIHRoZSBhcHBsaWNhdGlvbgotdW5kZXIgdGVzdC4gV2l0aCBpbnN0cnVtZW50YXRpb24sIHlvdSBjYW4gc2V0IHVwIG1vY2sgc3lzdGVtIG9iamVjdHMgc3VjaCBhcwotQ29udGV4dHMgYmVmb3JlIHRoZSBtYWluIGFwcGxpY2F0aW9uIHN0YXJ0cywgY29udHJvbCB5b3VyIGFwcGxpY2F0aW9uIGF0IHZhcmlvdXMKLXBvaW50cyBvZiBpdHMgbGlmZWN5Y2xlLCBzZW5kIFVJIGV2ZW50cyB0byB0aGUgYXBwbGljYXRpb24sIGFuZCBleGFtaW5lIHRoZQotYXBwbGljYXRpb24ncyBzdGF0ZSBkdXJpbmcgaXRzIGV4ZWN1dGlvbi4gVGhlIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsKLWFjY29tcGxpc2hlcyB0aGlzIGJ5IHJ1bm5pbmcgYm90aCB0aGUgbWFpbiBhcHBsaWNhdGlvbiBhbmQgdGhlIHRlc3QgYXBwbGljYXRpb24KLWluIHRoZSBzYW1lIHByb2Nlc3MuIDwvcD4KLQotPHA+WW91ciB0ZXN0IGFwcGxpY2F0aW9uIGlzIGxpbmtlZCB0byB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBieSBtZWFucyBvZiBhbgotPGEKLWhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvaW5zdHJ1bWVudGF0aW9uLWVsZW1lbnQuaHRtbCI+PGNvZGU+Jmx0O2luc3RydW1lbnRhdGlvbiZndDs8L2NvZGU+PC9hPgotZWxlbWVudCBpbiB0aGUgdGVzdCBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGZpbGUuIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50Ci1zcGVjaWZ5IHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgYW5kIGFsc28gdGVsbCBBbmRyb2lkIGhvdwotdG8gcnVuIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLiBJbnN0cnVtZW50YXRpb24gaXMgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHRoZQotc2VjdGlvbiA8YSBocmVmPSIjSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciI+SW5zdHJ1bWVudGF0aW9uIFRlc3QKLVJ1bm5lcjwvYT4uPC9wPgotCi08cD5UaGUgZm9sbG93aW5nIGRpYWdyYW0gc3VtbWFyaXplcyB0aGUgQW5kcm9pZCB0ZXN0aW5nIGVudmlyb25tZW50OjwvcD4KLQotPGltZyBzcmM9IntAZG9jUm9vdH1pbWFnZXMvdGVzdGluZy9hbmRyb2lkX3Rlc3RfZnJhbWV3b3JrLnBuZyIvPgotCi08cD5JbiBBbmRyb2lkLCB0ZXN0IGFwcGxpY2F0aW9ucyBhcmUgdGhlbXNlbHZlcyBBbmRyb2lkIGFwcGxpY2F0aW9ucywgc28geW91Ci13cml0ZSB0aGVtIGluIG11Y2ggdGhlIHNhbWUgd2F5IGFzIHRoZSBhcHBsaWNhdGlvbiB5b3UgYXJlIHRlc3RpbmcuIFRoZSBTREsKLXRvb2xzIGhlbHAgeW91IGNyZWF0ZSBhIG1haW4gYXBwbGljYXRpb24gcHJvamVjdCBhbmQgaXRzIHRlc3QgcHJvamVjdCBhdCB0aGUgc2FtZQotdGltZS4gWW91IGNhbiBydW4gQW5kcm9pZCB0ZXN0cyB3aXRoaW4gRWNsaXBzZSB3aXRoIEFEVCBvciBmcm9tIHRoZSBjb21tYW5kCi1saW5lLiBFY2xpcHNlIHdpdGggQURUIHByb3ZpZGVzIGFuIGV4dGVuc2l2ZSBzZXQgb2YgdG9vbHMgZm9yIGNyZWF0aW5nIHRlc3RzLAotcnVubmluZyB0aGVtLCBhbmQgdmlld2luZyB0aGVpciByZXN1bHRzLiBZb3UgY2FuIGFsc28gdXNlIHRoZSA8Y29kZT5hZGI8L2NvZGU+Ci10b29sIHRvIHJ1biB0ZXN0cywgb3IgdXNlIGEgYnVpbHQtaW4gQW50IHRhcmdldC48L3A+Ci0KLTxwPlRvIGxlYXJuIGhvdyB0byBzZXQgdXAgYW5kIHJ1biB0ZXN0cyBpbiBFY2xpcHNlLCBwbGVhc2UgcmVmZXIgdG8gPGEKLWhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4KLUVjbGlwc2UsIHdpdGggQURUPC9hPi4gSWYgeW91J3JlIG5vdCB3b3JraW5nIGluIEVjbGlwc2UsIHJlZmVyIHRvIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlcgotSURFczwvYT4uPC9wPgotCi08cD5JZiB5b3Ugd2FudCBhIHN0ZXAtYnktc3RlcCBpbnRyb2R1Y3Rpb24gdG8gQW5kcm9pZCB0ZXN0aW5nLCB0cnkgb25lIG9mIHRoZQotdGVzdGluZyB0dXRvcmlhbHM6PC9wPgotCi08dWw+Ci0gIDxsaT5UaGUgPGEKLWhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+SGVsbG8sCi1UZXN0aW5nPC9hPiB0dXRvcmlhbCBpbnRyb2R1Y2VzIGJhc2ljIHRlc3RpbmcgY29uY2VwdHMgYW5kIHByb2NlZHVyZXMgaW4gdGhlCi1jb250ZXh0IG9mIHRoZSBIZWxsbywgV29ybGQgYXBwbGljYXRpb24uPC9saT4KLSAgPGxpPlRoZSA8YQotaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5Ci1UZXN0aW5nPC9hPiB0dXRvcmlhbCBpcyBhbiBleGNlbGxlbnQgZm9sbG93LXVwIHRvIHRoZSBIZWxsbywgVGVzdGluZyB0dXRvcmlhbC4KLUl0IGd1aWRlcyB5b3UgdGhyb3VnaCBhIG1vcmUgY29tcGxleCB0ZXN0aW5nIHNjZW5hcmlvIHRoYXQgeW91IGRldmVsb3AgYWdhaW5zdCBhCi1tb3JlIHJlYWxpc3RpYyBhcHBsaWNhdGlvbi48L2xpPgotPC91bD4KLQorPHA+CisgICAgVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGZ1bmRhbWVudGFscyBvZiB0aGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yaywgaW5jbHVkaW5nIHRoZQorICAgIHN0cnVjdHVyZSBvZiB0ZXN0cywgdGhlIEFQSXMgdGhhdCB5b3UgdXNlIHRvIGRldmVsb3AgdGVzdHMsIGFuZCB0aGUgdG9vbHMgdGhhdCB5b3UgdXNlIHRvIHJ1bgorICAgIHRlc3RzIGFuZCB2aWV3IHJlc3VsdHMuIFRoZSBkb2N1bWVudCBhc3N1bWVzIHlvdSBoYXZlIGEgYmFzaWMga25vd2xlZGdlIG9mIEFuZHJvaWQgYXBwbGljYXRpb24KKyAgICBwcm9ncmFtbWluZyBhbmQgSlVuaXQgdGVzdGluZyBtZXRob2RvbG9neS4KKzwvcD4KKzxwPgorICAgIFRoZSBmb2xsb3dpbmcgZGlhZ3JhbSBzdW1tYXJpemVzIHRoZSB0ZXN0aW5nIGZyYW1ld29yazoKKzwvcD4KKzxkaXYgc3R5bGU9IndpZHRoOiA3MCU7IG1hcmdpbi1sZWZ0OmF1dG87IG1hcmdpbi1yaWdodDphdXRvOyI+Cis8YSBocmVmPSJ7QGRvY1Jvb3R9aW1hZ2VzL3Rlc3RpbmcvdGVzdF9mcmFtZXdvcmsucG5nIj4KKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWltYWdlcy90ZXN0aW5nL3Rlc3RfZnJhbWV3b3JrLnBuZyIKKyAgICAgICAgYWx0PSJUaGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yayIvPgorPC9hPgorPC9kaXY+Cis8aDIgaWQ9IlRlc3RTdHJ1Y3R1cmUiPlRlc3QgU3RydWN0dXJlPC9oMj4KKzxwPgorICAgIEFuZHJvaWQncyBidWlsZCBhbmQgdGVzdCB0b29scyBhc3N1bWUgdGhhdCB0ZXN0IHByb2plY3RzIGFyZSBvcmdhbml6ZWQgaW50byBhIHN0YW5kYXJkCisgICAgc3RydWN0dXJlIG9mIHRlc3RzLCB0ZXN0IGNhc2UgY2xhc3NlcywgdGVzdCBwYWNrYWdlcywgYW5kIHRlc3QgcHJvamVjdHMuCis8L3A+Cis8cD4KKyAgICBBbmRyb2lkIHRlc3RpbmcgaXMgYmFzZWQgb24gSlVuaXQuIEluIGdlbmVyYWwsIGEgSlVuaXQgdGVzdCBpcyBhIG1ldGhvZCB3aG9zZQorICAgIHN0YXRlbWVudHMgdGVzdCBhIHBhcnQgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFlvdSBvcmdhbml6ZSB0ZXN0IG1ldGhvZHMgaW50byBjbGFzc2VzCisgICAgY2FsbGVkIHRlc3QgY2FzZXMgKG9yIHRlc3Qgc3VpdGVzKS4gRWFjaCB0ZXN0IGlzIGFuIGlzb2xhdGVkIHRlc3Qgb2YgYW4gaW5kaXZpZHVhbCBtb2R1bGUgaW4KKyAgICB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gRWFjaCBjbGFzcyBpcyBhIGNvbnRhaW5lciBmb3IgcmVsYXRlZCB0ZXN0IG1ldGhvZHMsIGFsdGhvdWdoIGl0CisgICAgb2Z0ZW4gcHJvdmlkZXMgaGVscGVyIG1ldGhvZHMgYXMgd2VsbC4KKzwvcD4KKzxwPgorICAgIEluIEpVbml0LCB5b3UgYnVpbGQgb25lIG9yIG1vcmUgdGVzdCBzb3VyY2UgZmlsZXMgaW50byBhIGNsYXNzIGZpbGUuIFNpbWlsYXJseSwgaW4gQW5kcm9pZCB5b3UKKyAgICB1c2UgdGhlIFNESydzIGJ1aWxkIHRvb2xzIHRvIGJ1aWxkIG9uZSBvciBtb3JlIHRlc3Qgc291cmNlIGZpbGVzIGludG8gY2xhc3MgZmlsZXMgaW4gYW4KKyAgICBBbmRyb2lkIHRlc3QgcGFja2FnZS4gSW4gSlVuaXQsIHlvdSB1c2UgYSB0ZXN0IHJ1bm5lciB0byBleGVjdXRlIHRlc3QgY2xhc3Nlcy4gSW4gQW5kcm9pZCwgeW91CisgICAgdXNlIHRlc3QgdG9vbHMgdG8gbG9hZCB0aGUgdGVzdCBwYWNrYWdlIGFuZCB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwgYW5kIHRoZSB0b29scyB0aGVuCisgICAgZXhlY3V0ZSBhbiBBbmRyb2lkLXNwZWNpZmljIHRlc3QgcnVubmVyLgorPC9wPgorPGgyIGlkPSJUZXN0UHJvamVjdHMiPlRlc3QgUHJvamVjdHM8L2gyPgorPHA+CisgICAgVGVzdHMsIGxpa2UgQW5kcm9pZCBhcHBsaWNhdGlvbnMsIGFyZSBvcmdhbml6ZWQgaW50byBwcm9qZWN0cy4KKzwvcD4KKzxwPgorICAgIEEgdGVzdCBwcm9qZWN0IGlzIGEgZGlyZWN0b3J5IG9yIEVjbGlwc2UgcHJvamVjdCBpbiB3aGljaCB5b3UgY3JlYXRlIHRoZSBzb3VyY2UgY29kZSwgbWFuaWZlc3QKKyAgICBmaWxlLCBhbmQgb3RoZXIgZmlsZXMgZm9yIGEgdGVzdCBwYWNrYWdlLiBUaGUgQW5kcm9pZCBTREsgY29udGFpbnMgdG9vbHMgZm9yIEVjbGlwc2Ugd2l0aCBBRFQKKyAgICBhbmQgZm9yIHRoZSBjb21tYW5kIGxpbmUgdGhhdCBjcmVhdGUgYW5kIHVwZGF0ZSB0ZXN0IHByb2plY3RzIGZvciB5b3UuIFRoZSB0b29scyBjcmVhdGUgdGhlCisgICAgZGlyZWN0b3JpZXMgeW91IHVzZSBmb3Igc291cmNlIGNvZGUgYW5kIHJlc291cmNlcyBhbmQgdGhlIG1hbmlmZXN0IGZpbGUgZm9yIHRoZSB0ZXN0IHBhY2thZ2UuCisgICAgVGhlIGNvbW1hbmQtbGluZSB0b29scyBhbHNvIGNyZWF0ZSB0aGUgQW50IGJ1aWxkIGZpbGVzIHlvdSBuZWVkLgorPC9wPgorPHA+CisgICAgWW91IHNob3VsZCBhbHdheXMgdXNlIEFuZHJvaWQgdG9vbHMgdG8gY3JlYXRlIGEgdGVzdCBwcm9qZWN0LiBBbW9uZyBvdGhlciBiZW5lZml0cywKKyAgICB0aGUgdG9vbHM6Cis8L3A+CisgICAgPHVsPgorICAgICAgICA8bGk+CisgICAgICAgICAgICBBdXRvbWF0aWNhbGx5IHNldCB1cCB5b3VyIHRlc3QgcGFja2FnZSB0byB1c2UKKyAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0gYXMgdGhlIHRlc3QgY2FzZSBydW5uZXIuIFlvdSBtdXN0IHVzZQorICAgICAgICAgICAgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gKG9yIGEgc3ViY2xhc3MpIHRvIHJ1biBKVW5pdCB0ZXN0cy4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgQ3JlYXRlIGFuIGFwcHJvcHJpYXRlIG5hbWUgZm9yIHRoZSB0ZXN0IHBhY2thZ2UuIElmIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgICAgdW5kZXIgdGVzdCBoYXMgYSBwYWNrYWdlIG5hbWUgb2YgPGNvZGU+Y29tLm15ZG9tYWluLm15YXBwPC9jb2RlPiwgdGhlbiB0aGUKKyAgICAgICAgICAgIEFuZHJvaWQgdG9vbHMgc2V0IHRoZSB0ZXN0IHBhY2thZ2UgbmFtZSB0byA8Y29kZT5jb20ubXlkb21haW4ubXlhcHAudGVzdDwvY29kZT4uIFRoaXMKKyAgICAgICAgICAgIGhlbHBzIHlvdSBpZGVudGlmeSB0aGVpciByZWxhdGlvbnNoaXAsIHdoaWxlIHByZXZlbnRpbmcgY29uZmxpY3RzIHdpdGhpbiB0aGUgc3lzdGVtLgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgICBBdXRvbWF0aWNhbGx5IGNyZWF0ZSB0aGUgcHJvcGVyIGJ1aWxkIGZpbGVzLCBtYW5pZmVzdCBmaWxlLCBhbmQgZGlyZWN0b3J5CisgICAgICAgICAgICBzdHJ1Y3R1cmUgZm9yIHRoZSB0ZXN0IHByb2plY3QuIFRoaXMgaGVscHMgeW91IHRvIGJ1aWxkIHRoZSB0ZXN0IHBhY2thZ2Ugd2l0aG91dAorICAgICAgICAgICAgaGF2aW5nIHRvIG1vZGlmeSBidWlsZCBmaWxlcyBhbmQgc2V0cyB1cCB0aGUgbGlua2FnZSBiZXR3ZWVuIHlvdXIgdGVzdCBwYWNrYWdlIGFuZAorICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuCisgICAgICAgICAgICBUaGUKKyAgICAgICAgPC9saT4KKyAgICA8L3VsPgorPHA+CisgICAgWW91IGNhbiBjcmVhdGUgYSB0ZXN0IHByb2plY3QgYW55d2hlcmUgaW4geW91ciBmaWxlIHN5c3RlbSwgYnV0IHRoZSBiZXN0IGFwcHJvYWNoIGlzIHRvCisgICAgYWRkIHRoZSB0ZXN0IHByb2plY3Qgc28gdGhhdCBpdHMgcm9vdCBkaXJlY3RvcnkgPGNvZGU+dGVzdHMvPC9jb2RlPiBpcyBhdCB0aGUgc2FtZSBsZXZlbAorICAgIGFzIHRoZSA8Y29kZT5zcmMvPC9jb2RlPiBkaXJlY3Rvcnkgb2YgdGhlIG1haW4gYXBwbGljYXRpb24ncyBwcm9qZWN0LiBUaGlzIGhlbHBzIHlvdSBmaW5kIHRoZQorICAgIHRlc3RzIGFzc29jaWF0ZWQgd2l0aCBhbiBhcHBsaWNhdGlvbi4gRm9yIGV4YW1wbGUsIGlmIHlvdXIgYXBwbGljYXRpb24gcHJvamVjdCdzIHJvb3QgZGlyZWN0b3J5CisgICAgaXMgPGNvZGU+TXlQcm9qZWN0PC9jb2RlPiwgdGhlbiB5b3Ugc2hvdWxkIHVzZSB0aGUgZm9sbG93aW5nIGRpcmVjdG9yeSBzdHJ1Y3R1cmU6Cis8L3A+Cis8cHJlIGNsYXNzPSJjbGFzc2ljIG5vLXByZXR0eS1wcmludCI+CisgIE15UHJvamVjdC8KKyAgICAgIEFuZHJvaWRNYW5pZmVzdC54bWwKKyAgICAgIHJlcy8KKyAgICAgICAgICAuLi4gKHJlc291cmNlcyBmb3IgbWFpbiBhcHBsaWNhdGlvbikKKyAgICAgIHNyYy8KKyAgICAgICAgICAuLi4gKHNvdXJjZSBjb2RlIGZvciBtYWluIGFwcGxpY2F0aW9uKSAuLi4KKyAgICAgIHRlc3RzLworICAgICAgICAgIEFuZHJvaWRNYW5pZmVzdC54bWwKKyAgICAgICAgICByZXMvCisgICAgICAgICAgICAgIC4uLiAocmVzb3VyY2VzIGZvciB0ZXN0cykKKyAgICAgICAgICBzcmMvCisgICAgICAgICAgICAgIC4uLiAoc291cmNlIGNvZGUgZm9yIHRlc3RzKQorPC9wcmU+CiA8aDIgaWQ9IlRlc3RBUEkiPlRoZSBUZXN0aW5nIEFQSTwvaDI+CiA8cD4KLSAgICBGb3Igd3JpdGluZyB0ZXN0cyBhbmQgdGVzdCBhcHBsaWNhdGlvbnMgaW4gdGhlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIEFuZHJvaWQgcHJvdmlkZXMgYQotICAgIHRlc3RpbmcgQVBJIHRoYXQgaXMgYmFzZWQgaW4gcGFydCBvbiB0aGUgSlVuaXQgdGVzdCBmcmFtZXdvcmsuIEFkZGluZyB0byB0aGF0LCBBbmRyb2lkIGluY2x1ZGVzCi0gICAgYSBwb3dlcmZ1bCBpbnN0cnVtZW50YXRpb24gZnJhbWV3b3JrIHRoYXQgbGV0cyB5b3VyIHRlc3RzIGFjY2VzcyB0aGUgc3RhdGUgYW5kIHJ1bnRpbWUgb2JqZWN0cwotICAgIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0cy4KKyAgICBUaGUgQW5kcm9pZCB0ZXN0aW5nIEFQSSBpcyBiYXNlZCBvbiB0aGUgSlVuaXQgQVBJIGFuZCBleHRlbmRlZCB3aXRoIGEgaW5zdHJ1bWVudGF0aW9uCisgICAgZnJhbWV3b3JrIGFuZCBBbmRyb2lkLXNwZWNpZmljIHRlc3RpbmcgY2xhc3Nlcy4KIDwvcD4KLTxwPlRoZSBzZWN0aW9ucyBiZWxvdyBkZXNjcmliZSB0aGUgbWFqb3IgY29tcG9uZW50cyBvZiB0aGUgdGVzdGluZyBBUEkgYXZhaWxhYmxlIGluIEFuZHJvaWQuPC9wPgotPGgzIGlkPSJFeHRlbnNpb25zIj5KVW5pdCB0ZXN0IGNhc2UgY2xhc3NlczwvaDM+Cis8aDMgaWQ9IkpVbml0Ij5KVW5pdDwvaDM+CiA8cD4KLSAgU29tZSBvZiB0aGUgY2xhc3NlcyBpbiB0aGUgdGVzdGluZyBBUEkgZXh0ZW5kIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIFRlc3RDYXNlfSBidXQgZG8gbm90IHVzZSB0aGUgaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yay4gVGhlc2UgY2xhc3NlcwotICBjb250YWluIG1ldGhvZHMgZm9yIGFjY2Vzc2luZyBzeXN0ZW0gb2JqZWN0cyBzdWNoIGFzIHRoZSBDb250ZXh0IG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBXaXRoIHRoaXMgQ29udGV4dCwgeW91IGNhbiBsb29rIGF0IGl0cyByZXNvdXJjZXMsIGZpbGVzLCBkYXRhYmFzZXMsCi0gIGFuZCBzbyBmb3J0aC4gVGhlIGJhc2UgY2xhc3MgaXMge0BsaW5rIGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2V9LCBidXQgeW91IHVzdWFsbHkgdXNlIGEgc3ViY2xhc3MgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBjb21wb25lbnQuCi08cD4KLSAgVGhlIHN1YmNsYXNzZXMgYXJlOgotPC9wPgotICA8dWw+Ci0gICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BcHBsaWNhdGlvblRlc3RDYXNlfSAtIEEgY2xhc3MgZm9yIHRlc3RpbmcgYW4gZW50aXJlIGFwcGxpY2F0aW9uLiBJdCBhbGxvd3MgeW91IHRvIGluamVjdCBhIG1vY2sgQ29udGV4dCBpbnRvIHRoZSBhcHBsaWNhdGlvbiwKLSAgICAgIHNldCB1cCBpbml0aWFsIHRlc3QgcGFyYW1ldGVycyBiZWZvcmUgdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cywgYW5kIGV4YW1pbmUgdGhlIGFwcGxpY2F0aW9uIGFmdGVyIGl0IGZpbmlzaGVzIGJ1dCBiZWZvcmUgaXQgaXMgZGVzdHJveWVkLgotICAgIDwvbGk+Ci0gICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5Qcm92aWRlclRlc3RDYXNlMn0gLSBBIGNsYXNzIGZvciBpc29sYXRlZCB0ZXN0aW5nIG9mIGEgc2luZ2xlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyfS4gU2luY2UgaXQgaXMgcmVzdHJpY3RlZCB0byB1c2luZyBhCi0gICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcn0gZm9yIHRoZSBwcm92aWRlciwgYW5kIGl0IGluamVjdHMgYW4ge0BsaW5rIGFuZHJvaWQudGVzdC5Jc29sYXRlZENvbnRleHR9LCB5b3VyIHByb3ZpZGVyIHRlc3RpbmcgaXMgaXNvbGF0ZWQKLSAgICAgIGZyb20gdGhlIHJlc3Qgb2YgdGhlIE9TLgotICAgIDwvbGk+Ci0gICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2V9IC0gYSBjbGFzcyBmb3IgaXNvbGF0ZWQgdGVzdGluZyBvZiBhIHNpbmdsZSB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZX0uIFlvdSBjYW4gaW5qZWN0IGEgbW9jayBDb250ZXh0IG9yCi0gICAgICBtb2NrIEFwcGxpY2F0aW9uIChvciBib3RoKSwgb3IgbGV0IEFuZHJvaWQgcHJvdmlkZSB5b3UgYSBmdWxsIENvbnRleHQgYW5kIGEge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbn0uCi0gICAgPC9saT4KLSAgPC91bD4KLTxoMyBpZD0iSW5zdHJ1bWVudGF0aW9uIj5JbnN0cnVtZW50YXRpb24gdGVzdCBjYXNlIGNsYXNzZXM8L2gzPgotPHA+Ci0gIFRoZSBBUEkgZm9yIHRlc3RpbmcgYWN0aXZpdGllcyBleHRlbmRzIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIFRlc3RDYXNlfSBjbGFzcyBhbmQgYWxzbyB1c2VzIHRoZSBpbnN0cnVtZW50YXRpb24gZnJhbWV3b3JrLiBXaXRoIGluc3RydW1lbnRhdGlvbiwKLSAgQW5kcm9pZCBjYW4gYXV0b21hdGUgVUkgdGVzdGluZyBieSBzZW5kaW5nIGV2ZW50cyB0byB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwgcHJlY2lzZWx5IGNvbnRyb2wgdGhlIHN0YXJ0IG9mIGFuIGFjdGl2aXR5LCBhbmQgbW9uaXRvciB0aGUgc3RhdGUgb2YgdGhlCi0gIGFjdGl2aXR5IGR1cmluZyBpdHMgbGlmZSBjeWNsZS4KKyAgICBZb3UgY2FuIHVzZSB0aGUgSlVuaXQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSBUZXN0Q2FzZX0gY2xhc3MgdG8gZG8gdW5pdCB0ZXN0aW5nIG9uCisgICAgYSBwbGFpbiBKYXZhIG9iamVjdC4gPGNvZGU+VGVzdENhc2U8L2NvZGU+IGlzIGFsc28gdGhlIGJhc2UgY2xhc3MgZm9yCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2V9LCB3aGljaCB5b3UgY2FuIHVzZSB0byB0ZXN0IEFuZHJvaWQtZGVwZW5kZW50IG9iamVjdHMuCisgICAgQmVzaWRlcyBwcm92aWRpbmcgdGhlIEpVbml0IGZyYW1ld29yaywgQW5kcm9pZFRlc3RDYXNlIG9mZmVycyBBbmRyb2lkLXNwZWNpZmljIHNldHVwLAorICAgIHRlYXJkb3duLCBhbmQgaGVscGVyIG1ldGhvZHMuCiA8L3A+CiA8cD4KLSAgVGhlIGJhc2UgY2xhc3MgaXMge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZX0uIEFsbCBvZiBpdHMgc3ViY2xhc3NlcyBoYXZlIHRoZSBhYmlsaXR5IHRvIHNlbmQgYSBrZXlzdHJva2Ugb3IgdG91Y2ggZXZlbnQgdG8gdGhlIFVJIG9mIHRoZSBhcHBsaWNhdGlvbgotICB1bmRlciB0ZXN0LiBUaGUgc3ViY2xhc3NlcyBjYW4gYWxzbyBpbmplY3QgYSBtb2NrIEludGVudC4KLSAgVGhlIHN1YmNsYXNzZXMgYXJlOgorICAgIFlvdSB1c2UgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fSBjbGFzcyB0byBkaXNwbGF5IHRlc3QgcmVzdWx0cy4KKyAgICBUaGUgYXNzZXJ0IG1ldGhvZHMgY29tcGFyZSB2YWx1ZXMgeW91IGV4cGVjdCBmcm9tIGEgdGVzdCB0byB0aGUgYWN0dWFsIHJlc3VsdHMgYW5kCisgICAgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21wYXJpc29uIGZhaWxzLiBBbmRyb2lkIGFsc28gcHJvdmlkZXMgYSBjbGFzcyBvZiBhc3NlcnRpb25zIHRoYXQKKyAgICBleHRlbmQgdGhlIHBvc3NpYmxlIHR5cGVzIG9mIGNvbXBhcmlzb25zLCBhbmQgYW5vdGhlciBjbGFzcyBvZiBhc3NlcnRpb25zIGZvciB0ZXN0aW5nIHRoZSBVSS4KKyAgICBUaGVzZSBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHRoZSBzZWN0aW9uIDxhIGhyZWY9IiNBc3NlcnRpb25DbGFzc2VzIj4KKyAgICBBc3NlcnRpb24gY2xhc3NlczwvYT4KIDwvcD4KLSAgPHVsPgotICAgIDxsaT4KLSAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlUZXN0Q2FzZX0gLSBBIGJhc2UgY2xhc3MgZm9yIGFjdGl2aXR5IHRlc3QgY2xhc3Nlcy4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuU2luZ2xlTGF1bmNoQWN0aXZpdHlUZXN0Q2FzZX0gLSBBIGNvbnZlbmllbmNlIGNsYXNzIGZvciB0ZXN0aW5nIGEgc2luZ2xlIGFjdGl2aXR5LgotICAgICAgSXQgaW52b2tlcyB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkgc2V0VXAoKX0gYW5kIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKSB0ZWFyRG93bigpfSBvbmx5Ci0gICAgICBvbmNlLCBpbnN0ZWFkIG9mIG9uY2UgcGVyIG1ldGhvZCBjYWxsLiBVc2UgaXQgd2hlbiBhbGwgb2YgeW91ciB0ZXN0IG1ldGhvZHMgcnVuIGFnYWluc3QgdGhlIHNhbWUgYWN0aXZpdHkuCi0gICAgPC9saT4KLSAgICA8bGk+Ci0gICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlN5bmNCYXNlSW5zdHJ1bWVudGF0aW9ufSAtIEEgY2xhc3MgdGhhdCB0ZXN0cyBzeW5jaHJvbml6YXRpb24gb2YgYSBjb250ZW50IHByb3ZpZGVyLiBJdCB1c2VzIGluc3RydW1lbnRhdGlvbiB0byBjYW5jZWwgYW5kIGRpc2FibGUKLSAgICAgIGV4aXN0aW5nIHN5bmNocm9uaXphdGlvbnMgYmVmb3JlIHN0YXJ0aW5nIHRoZSB0ZXN0IHN5bmNocm9uaXphdGlvbi4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9IC0gVGhpcyBjbGFzcyBkb2VzIGFuIGlzb2xhdGVkIHRlc3Qgb2YgYSBzaW5nbGUgYWN0aXZpdHkuIFdpdGggaXQsIHlvdSBjYW4gaW5qZWN0IGEgbW9jayBjb250ZXh0IG9yIGFwcGxpY2F0aW9uLCBvciBib3RoLgotICAgICAgSXQgaXMgaW50ZW5kZWQgZm9yIGRvaW5nIHVuaXQgdGVzdHMgb2YgYW4gYWN0aXZpdHksIGFuZCBpcyB0aGUgYWN0aXZpdHkgZXF1aXZhbGVudCBvZiB0aGUgdGVzdCBjbGFzc2VzIGRlc2NyaWJlZCBpbiA8YSBocmVmPSIjRXh0ZW5zaW9ucyI+SlVuaXQgdGVzdCBjYXNlIGNsYXNzZXM8L2E+LgotICAgICAgPHA+IFVubGlrZSB0aGUgb3RoZXIgaW5zdHJ1bWVudGF0aW9uIGNsYXNzZXMsIHRoaXMgdGVzdCBjbGFzcyBjYW5ub3QgaW5qZWN0IGEgbW9jayBJbnRlbnQuPC9wPgotICAgIDwvbGk+Ci0gICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMn0gLSBUaGlzIGNsYXNzIHRlc3RzIGEgc2luZ2xlIGFjdGl2aXR5IHdpdGhpbiB0aGUgbm9ybWFsIHN5c3RlbSBlbnZpcm9ubWVudC4KLSAgICAgIFlvdSBjYW5ub3QgaW5qZWN0IGEgbW9jayBDb250ZXh0LCBidXQgeW91IGNhbiBpbmplY3QgbW9jayBJbnRlbnRzLiBBbHNvLCB5b3UgY2FuIHJ1biBhIHRlc3QgbWV0aG9kIG9uIHRoZSBVSSB0aHJlYWQgKHRoZSBtYWluIHRocmVhZCBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCksCi0gICAgICB3aGljaCBhbGxvd3MgeW91IHRvIHNlbmQga2V5IGFuZCB0b3VjaCBldmVudHMgdG8gdGhlIGFwcGxpY2F0aW9uIFVJLgotICAgIDwvbGk+Ci0gIDwvdWw+Ci08aDMgaWQ9IkFzc2VydCI+QXNzZXJ0IGNsYXNzZXM8L2gzPgogPHA+Ci0gIEFuZHJvaWQgYWxzbyBleHRlbmRzIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLkFzc2VydH0gY2xhc3MgdGhhdCBpcyB0aGUgYmFzaXMgb2YgPGNvZGU+YXNzZXJ0KCk8L2NvZGU+IGNhbGxzIGluIHRlc3RzLgotICBUaGVyZSBhcmUgdHdvIGV4dGVuc2lvbnMgdG8gdGhpcyBjbGFzcywge0BsaW5rIGFuZHJvaWQudGVzdC5Nb3JlQXNzZXJ0c30gYW5kIHtAbGluayBhbmRyb2lkLnRlc3QuVmlld0Fzc2VydHN9OgorICAgIFRvIGxlYXJuIG1vcmUgYWJvdXQgSlVuaXQsIHlvdSBjYW4gcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBvbiB0aGUKKyAgICA8YSBocmVmPSJodHRwOi8vd3d3Lmp1bml0Lm9yZyI+anVuaXQub3JnPC9hPiBob21lIHBhZ2UuCisgICAgTm90ZSB0aGF0IHRoZSBBbmRyb2lkIHRlc3RpbmcgQVBJIHN1cHBvcnRzIEpVbml0IDMgY29kZSBzdHlsZSwgYnV0IG5vdCBKVW5pdCA0LiBBbHNvLCB5b3UgbXVzdAorICAgIHVzZSBBbmRyb2lkJ3MgaW5zdHJ1bWVudGVkIHRlc3QgcnVubmVyIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0gdG8gcnVuCisgICAgeW91ciB0ZXN0IGNhc2UgY2xhc3Nlcy4gVGhpcyB0ZXN0IHJ1bm5lciBpcyBkZXNjcmliZWQgaW4gdGhlCisgICAgc2VjdGlvbiA8YSBocmVmPSIjSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciI+UnVubmluZyBUZXN0czwvYT4uCis8L3A+Cis8aDMgaWQ9Ikluc3RydW1lbnRhdGlvbiI+SW5zdHJ1bWVudGF0aW9uPC9oMz4KKzxwPgorICAgIEFuZHJvaWQgaW5zdHJ1bWVudGF0aW9uIGlzIGEgc2V0IG9mIGNvbnRyb2wgbWV0aG9kcyBvciAiaG9va3MiIGluIHRoZSBBbmRyb2lkIHN5c3RlbS4gVGhlc2UgaG9va3MKKyAgICBjb250cm9sIGFuIEFuZHJvaWQgY29tcG9uZW50IGluZGVwZW5kZW50bHkgb2YgaXRzIG5vcm1hbCBsaWZlY3ljbGUuIFRoZXkgYWxzbyBjb250cm9sIGhvdworICAgIEFuZHJvaWQgbG9hZHMgYXBwbGljYXRpb25zLgorPC9wPgorPHA+CisgICAgTm9ybWFsbHksIGFuIEFuZHJvaWQgY29tcG9uZW50IHJ1bnMgaW4gYSBsaWZlY3ljbGUgZGV0ZXJtaW5lZCBieSB0aGUgc3lzdGVtLiBGb3IgZXhhbXBsZSwgYW4KKyAgICBBY3Rpdml0eSBvYmplY3QncyBsaWZlY3ljbGUgc3RhcnRzIHdoZW4gdGhlIEFjdGl2aXR5IGlzIGFjdGl2YXRlZCBieSBhbiBJbnRlbnQuIFRoZSBvYmplY3QncworICAgIDxjb2RlPm9uQ3JlYXRlKCk8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQsIGZvbGxvd2VkIGJ5IDxjb2RlPm9uUmVzdW1lKCk8L2NvZGU+LiBXaGVuIHRoZSB1c2VyCisgICAgc3RhcnRzIGFub3RoZXIgYXBwbGljYXRpb24sIHRoZSA8Y29kZT5vblBhdXNlKCk8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQuIElmIHRoZSBBY3Rpdml0eQorICAgIGNvZGUgY2FsbHMgdGhlIDxjb2RlPmZpbmlzaCgpPC9jb2RlPiBtZXRob2QsIHRoZSA8Y29kZT5vbkRlc3Ryb3koKTwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZC4KKyAgICBUaGUgQW5kcm9pZCBmcmFtZXdvcmsgQVBJIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgZm9yIHlvdXIgY29kZSB0byBpbnZva2UgdGhlc2UgY2FsbGJhY2sKKyAgICBtZXRob2RzIGRpcmVjdGx5LCBidXQgeW91IGNhbiBkbyBzbyB1c2luZyBpbnN0cnVtZW50YXRpb24uCis8L3A+Cis8cD4KKyAgICBBbHNvLCB0aGUgc3lzdGVtIHJ1bnMgYWxsIHRoZSBjb21wb25lbnRzIG9mIGFuIGFwcGxpY2F0aW9uIGludG8gdGhlIHNhbWUKKyAgICBwcm9jZXNzLiBZb3UgY2FuIGFsbG93IHNvbWUgY29tcG9uZW50cywgc3VjaCBhcyBjb250ZW50IHByb3ZpZGVycywgdG8gcnVuIGluIGEgc2VwYXJhdGUgcHJvY2VzcywKKyAgICBidXQgeW91IGNhbid0IGZvcmNlIGFuIGFwcGxpY2F0aW9uIHRvIHJ1biBpbiB0aGUgc2FtZSBwcm9jZXNzIGFzIGFub3RoZXIgYXBwbGljYXRpb24gdGhhdCBpcworICAgIGFscmVhZHkgcnVubmluZy4KKzwvcD4KKzxwPgorICAgIFdpdGggQW5kcm9pZCBpbnN0cnVtZW50YXRpb24sIHRob3VnaCwgeW91IGNhbiBpbnZva2UgY2FsbGJhY2sgbWV0aG9kcyBpbiB5b3VyIHRlc3QgY29kZS4KKyAgICBUaGlzIGFsbG93cyB5b3UgdG8gcnVuIHRocm91Z2ggdGhlIGxpZmVjeWNsZSBvZiBhIGNvbXBvbmVudCBzdGVwIGJ5IHN0ZXAsIGFzIGlmIHlvdSB3ZXJlCisgICAgZGVidWdnaW5nIHRoZSBjb21wb25lbnQuIFRoZSBmb2xsb3dpbmcgdGVzdCBjb2RlIHNuaXBwZXQgZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgdGhpcyB0bworICAgIHRlc3QgdGhhdCBhbiBBY3Rpdml0eSBzYXZlcyBhbmQgcmVzdG9yZXMgaXRzIHN0YXRlOgorPC9wPgorPGEgbmFtZT0iQWN0aXZpdHlTbmlwcGV0Ij48L2E+Cis8cHJlPgorICAgIC8vIFN0YXJ0IHRoZSBtYWluIGFjdGl2aXR5IG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0CisgICAgbUFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKKworICAgIC8vIEdldCBhIGhhbmRsZSB0byB0aGUgQWN0aXZpdHkgb2JqZWN0J3MgbWFpbiBVSSB3aWRnZXQsIGEgU3Bpbm5lcgorICAgIG1TcGlubmVyID0gKFNwaW5uZXIpbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5leGFtcGxlLnNwaW5uZXIuUi5pZC5TcGlubmVyMDEpOworCisgICAgLy8gU2V0IHRoZSBTcGlubmVyIHRvIGEga25vd24gcG9zaXRpb24KKyAgICBtQWN0aXZpdHkuc2V0U3Bpbm5lclBvc2l0aW9uKFRFU1RfU1RBVEVfREVTVFJPWV9QT1NJVElPTik7CisKKyAgICAvLyBTdG9wIHRoZSBhY3Rpdml0eSAtIFRoZSBvbkRlc3Ryb3koKSBtZXRob2Qgc2hvdWxkIHNhdmUgdGhlIHN0YXRlIG9mIHRoZSBTcGlubmVyCisgICAgbUFjdGl2aXR5LmZpbmlzaCgpOworCisgICAgLy8gUmUtc3RhcnQgdGhlIEFjdGl2aXR5IC0gdGhlIG9uUmVzdW1lKCkgbWV0aG9kIHNob3VsZCByZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgU3Bpbm5lcgorICAgIG1BY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7CisKKyAgICAvLyBHZXQgdGhlIFNwaW5uZXIncyBjdXJyZW50IHBvc2l0aW9uCisgICAgaW50IGN1cnJlbnRQb3NpdGlvbiA9IG1BY3Rpdml0eS5nZXRTcGlubmVyUG9zaXRpb24oKTsKKworICAgIC8vIEFzc2VydCB0aGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBzdGFydGluZyBwb3NpdGlvbgorICAgIGFzc2VydEVxdWFscyhURVNUX1NUQVRFX0RFU1RST1lfUE9TSVRJT04sIGN1cnJlbnRQb3NpdGlvbik7Cis8L3ByZT4KKzxwPgorICAgIFRoZSBrZXkgbWV0aG9kIHVzZWQgaGVyZSBpcworICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTIjZ2V0QWN0aXZpdHkoKX0sIHdoaWNoIGlzIGEKKyAgICBwYXJ0IG9mIHRoZSBpbnN0cnVtZW50YXRpb24gQVBJLiBUaGUgQWN0aXZpdHkgdW5kZXIgdGVzdCBpcyBub3Qgc3RhcnRlZCB1bnRpbCB5b3UgY2FsbCB0aGlzCisgICAgbWV0aG9kLiBZb3UgY2FuIHNldCB1cCB0aGUgdGVzdCBmaXh0dXJlIGluIGFkdmFuY2UsIGFuZCB0aGVuIGNhbGwgdGhpcyBtZXRob2QgdG8gc3RhcnQgdGhlCisgICAgQWN0aXZpdHkuCis8L3A+Cis8cD4KKyAgICBBbHNvLCBpbnN0cnVtZW50YXRpb24gY2FuIGxvYWQgYm90aCBhIHRlc3QgcGFja2FnZSBhbmQgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgaW50byB0aGUKKyAgICBzYW1lIHByb2Nlc3MuIFNpbmNlIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnRzIGFuZCB0aGVpciB0ZXN0cyBhcmUgaW4gdGhlIHNhbWUgcHJvY2VzcywgdGhlCisgICAgdGVzdHMgY2FuIGludm9rZSBtZXRob2RzIGluIHRoZSBjb21wb25lbnRzLCBhbmQgbW9kaWZ5IGFuZCBleGFtaW5lIGZpZWxkcyBpbiB0aGUgY29tcG9uZW50cy4KKzwvcD4KKzxoMyBpZD0iVGVzdENhc2VDbGFzc2VzIj5UZXN0IGNhc2UgY2xhc3NlczwvaDM+Cis8cD4KKyAgICBBbmRyb2lkIHByb3ZpZGVzIHNldmVyYWwgdGVzdCBjYXNlIGNsYXNzZXMgdGhhdCBleHRlbmQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZX0gYW5kCisgICAge0BsaW5rIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9IHdpdGggQW5kcm9pZC1zcGVjaWZpYyBzZXR1cCwgdGVhcmRvd24sIGFuZCBoZWxwZXIgbWV0aG9kcy4KKzwvcD4KKzxoNCBpZD0iQW5kcm9pZFRlc3RDYXNlIj5BbmRyb2lkVGVzdENhc2U8L2g0PgorPHA+CisgICAgQSB1c2VmdWwgZ2VuZXJhbCB0ZXN0IGNhc2UgY2xhc3MsIGVzcGVjaWFsbHkgaWYgeW91IGFyZQorICAgIGp1c3Qgc3RhcnRpbmcgb3V0IHdpdGggQW5kcm9pZCB0ZXN0aW5nLCBpcyB7QGxpbmsgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZX0uIEl0IGV4dGVuZHMKKyAgICBib3RoIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2V9IGFuZCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLkFzc2VydH0uIEl0IHByb3ZpZGVzIHRoZQorICAgIEpVbml0LXN0YW5kYXJkIDxjb2RlPnNldFVwKCk8L2NvZGU+IGFuZCA8Y29kZT50ZWFyRG93bigpPC9jb2RlPiBtZXRob2RzLCBhcyB3ZWxsIGFzIHdlbGwgYXMKKyAgICBhbGwgb2YgSlVuaXQncyBBc3NlcnQgbWV0aG9kcy4gSW4gYWRkaXRpb24sIGl0IHByb3ZpZGVzIG1ldGhvZHMgZm9yIHRlc3RpbmcgcGVybWlzc2lvbnMsIGFuZCBhCisgICAgbWV0aG9kIHRoYXQgZ3VhcmRzIGFnYWluc3QgbWVtb3J5IGxlYWtzIGJ5IGNsZWFyaW5nIG91dCBjZXJ0YWluIGNsYXNzIHJlZmVyZW5jZXMuCis8L3A+Cis8aDQgaWQ9IkNvbXBvbmVudFRlc3RDYXNlIj5Db21wb25lbnQtc3BlY2lmaWMgdGVzdCBjYXNlczwvaDQ+Cis8cD4KKyAgICBBIGtleSBmZWF0dXJlIG9mIHRoZSBBbmRyb2lkIHRlc3RpbmcgZnJhbWV3b3JrIGlzIGl0cyBjb21wb25lbnQtc3BlY2lmaWMgdGVzdCBjYXNlIGNsYXNzZXMuCisgICAgVGhlc2UgYWRkcmVzcyBzcGVjaWZpYyBjb21wb25lbnQgdGVzdGluZyBuZWVkcyB3aXRoIG1ldGhvZHMgZm9yIGZpeHR1cmUgc2V0dXAgYW5kCisgICAgdGVhcmRvd24gYW5kIGNvbXBvbmVudCBsaWZlY3ljbGUgY29udHJvbC4gVGhleSBhbHNvIHByb3ZpZGUgbWV0aG9kcyBmb3Igc2V0dGluZyB1cCBtb2NrIG9iamVjdHMuCisgICAgVGhlc2UgY2xhc3NlcyBhcmUgZGVzY3JpYmVkIGluIHRoZSBjb21wb25lbnQtc3BlY2lmaWMgdGVzdGluZyB0b3BpY3M6CiA8L3A+CiA8dWw+Ci0gIDxsaT4KLSAgICBUaGUgPGNvZGU+TW9yZUFzc2VydHM8L2NvZGU+IGNsYXNzIGNvbnRhaW5zIG1vcmUgcG93ZXJmdWwgYXNzZXJ0aW9ucyBzdWNoIGFzIHtAbGluayBhbmRyb2lkLnRlc3QuTW9yZUFzc2VydHMjYXNzZXJ0Q29udGFpbnNSZWdleH0gdGhhdCBkb2VzIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZy4KLSAgPC9saT4KLSAgPGxpPgotICAgIFRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0LlZpZXdBc3NlcnRzfSBjbGFzcyBjb250YWlucyB1c2VmdWwgYXNzZXJ0aW9ucyBhYm91dCBBbmRyb2lkIFZpZXdzLCBzdWNoIGFzIHtAbGluayBhbmRyb2lkLnRlc3QuVmlld0Fzc2VydHMjYXNzZXJ0SGFzU2NyZWVuQ29vcmRpbmF0ZXN9IHRoYXQgdGVzdHMgaWYgYSBWaWV3IGhhcyBhIHBhcnRpY3VsYXIgWCBhbmQgWQotICAgIHBvc2l0aW9uIG9uIHRoZSB2aXNpYmxlIHNjcmVlbi4gVGhlc2UgYXNzZXJ0cyBzaW1wbGlmeSB0ZXN0aW5nIG9mIGdlb21ldHJ5IGFuZCBhbGlnbm1lbnQgaW4gdGhlIFVJLgotICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3RpbmcuaHRtbCI+QWN0aXZpdHkgVGVzdGluZzwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL2NvbnRlbnRwcm92aWRlcl90ZXN0aW5nLmh0bWwiPgorICAgICAgICBDb250ZW50IFByb3ZpZGVyIFRlc3Rpbmc8L2E+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy9zZXJ2aWNlX3Rlc3RpbmcuaHRtbCI+U2VydmljZSBUZXN0aW5nPC9hPgorICAgIDwvbGk+CiA8L3VsPgotPGgzIGlkPSJNb2NrT2JqZWN0cyI+TW9jayBvYmplY3QgY2xhc3NlczwvaDM+Ci0gIDxwPgotICAgIEFuZHJvaWQgaGFzIGNvbnZlbmllbmNlIGNsYXNzZXMgZm9yIGNyZWF0aW5nIG1vY2sgc3lzdGVtIG9iamVjdHMgc3VjaCBhcyBhcHBsaWNhdGlvbnMsIGNvbnRleHRzLCBjb250ZW50IHJlc29sdmVycywgYW5kIHJlc291cmNlcy4gQW5kcm9pZCBhbHNvIHByb3ZpZGVzCi0gICAgbWV0aG9kcyBpbiBzb21lIHRlc3QgY2xhc3NlcyBmb3IgY3JlYXRpbmcgbW9jayBJbnRlbnRzLiBVc2UgdGhlc2UgbW9ja3MgdG8gZmFjaWxpdGF0ZSBkZXBlbmRlbmN5IGluamVjdGlvbiwgc2luY2UgdGhleSBhcmUgZWFzaWVyIHRvIHVzZSB0aGFuIGNyZWF0aW5nIHRoZWlyCi0gICAgcmVhbCBjb3VudGVycGFydHMuIFRoZXNlIGNvbnZlbmllbmNlIGNsYXNzZXMgYXJlIGZvdW5kIGluIHtAbGluayBhbmRyb2lkLnRlc3R9IGFuZCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2t9LiBUaGV5IGFyZToKLSAgPC9wPgorPHA+CisgICAgQW5kcm9pZCBkb2VzIG5vdCBwcm92aWRlIGEgc2VwYXJhdGUgdGVzdCBjYXNlIGNsYXNzIGZvciBCcm9hZGNhc3RSZWNlaXZlci4gSW5zdGVhZCwgdGVzdCBhCisgICAgQnJvYWRjYXN0UmVjZWl2ZXIgYnkgdGVzdGluZyB0aGUgY29tcG9uZW50IHRoYXQgc2VuZHMgaXQgSW50ZW50IG9iamVjdHMsIHRvIHZlcmlmeSB0aGF0IHRoZQorICAgIEJyb2FkY2FzdFJlY2VpdmVyIHJlc3BvbmRzIGNvcnJlY3RseS4KKzwvcD4KKzxoNCBpZD0iQXBwbGljYXRpb25UZXN0Q2FzZSI+QXBwbGljYXRpb25UZXN0Q2FzZTwvaDQ+Cis8cD4KKyAgICBZb3UgdXNlIHRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0LkFwcGxpY2F0aW9uVGVzdENhc2V9IHRlc3QgY2FzZSBjbGFzcyB0byB0ZXN0IHRoZSBzZXR1cCBhbmQKKyAgICB0ZWFyZG93biBvZiB7QGxpbmsgYW5kcm9pZC5hcHAuQXBwbGljYXRpb259IG9iamVjdHMuIFRoZXNlIG9iamVjdHMgbWFpbnRhaW4gdGhlIGdsb2JhbCBzdGF0ZSBvZgorICAgIGluZm9ybWF0aW9uIHRoYXQgYXBwbGllcyB0byBhbGwgdGhlIGNvbXBvbmVudHMgaW4gYW4gYXBwbGljYXRpb24gcGFja2FnZS4gVGhlIHRlc3QgY2FzZSBjYW4KKyAgICBiZSB1c2VmdWwgaW4gdmVyaWZ5aW5nIHRoYXQgdGhlICZsdDthcHBsaWNhdGlvbiZndDsgZWxlbWVudCBpbiB0aGUgbWFuaWZlc3QgZmlsZSBpcyBjb3JyZWN0bHkKKyAgICBzZXQgdXAuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgdGhpcyB0ZXN0IGNhc2UgZG9lcyBub3QgYWxsb3cgeW91IHRvIGNvbnRyb2wgdGVzdGluZyBvZiB0aGUKKyAgICBjb21wb25lbnRzIHdpdGhpbiB5b3VyIGFwcGxpY2F0aW9uIHBhY2thZ2UuCis8L3A+Cis8aDQgaWQ9Ikluc3RydW1lbnRhdGlvblRlc3RDYXNlIj5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTwvaDQ+Cis8cD4KKyAgICBJZiB5b3Ugd2FudCB0byB1c2UgaW5zdHJ1bWVudGF0aW9uIG1ldGhvZHMgaW4gYSB0ZXN0IGNhc2UgY2xhc3MsIHlvdSBtdXN0IHVzZQorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2V9IG9yIG9uZSBvZiBpdHMgc3ViY2xhc3Nlcy4gVGhlCisgICAge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5fSB0ZXN0IGNhc2VzIGV4dGVuZCB0aGlzIGJhc2UgY2xhc3Mgd2l0aCBvdGhlciBmdW5jdGlvbmFsaXR5IHRoYXQKKyAgICBhc3Npc3RzIGluIEFjdGl2aXR5IHRlc3RpbmcuCis8L3A+CisKKzxoMyBpZD0iQXNzZXJ0aW9uQ2xhc3NlcyI+QXNzZXJ0aW9uIGNsYXNzZXM8L2gzPgorPHA+CisgICAgQmVjYXVzZSBBbmRyb2lkIHRlc3QgY2FzZSBjbGFzc2VzIGV4dGVuZCBKVW5pdCwgeW91IGNhbiB1c2UgYXNzZXJ0aW9uIG1ldGhvZHMgdG8gZGlzcGxheSB0aGUKKyAgICByZXN1bHRzIG9mIHRlc3RzLiBBbiBhc3NlcnRpb24gbWV0aG9kIGNvbXBhcmVzIGFuIGFjdHVhbCB2YWx1ZSByZXR1cm5lZCBieSBhIHRlc3QgdG8gYW4KKyAgICBleHBlY3RlZCB2YWx1ZSwgYW5kIHRocm93cyBhbiBBc3NlcnRpb25FeGNlcHRpb24gaWYgdGhlIGNvbXBhcmlzb24gdGVzdCBmYWlscy4gVXNpbmcgYXNzZXJ0aW9ucworICAgIGlzIG1vcmUgY29udmVuaWVudCB0aGFuIGRvaW5nIGxvZ2dpbmcsIGFuZCBwcm92aWRlcyBiZXR0ZXIgdGVzdCBwZXJmb3JtYW5jZS4KKzwvcD4KKzxwPgorICAgIEJlc2lkZXMgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fSBjbGFzcyBtZXRob2RzLCB0aGUgdGVzdGluZyBBUEkgYWxzbyBwcm92aWRlcworICAgIHRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0Lk1vcmVBc3NlcnRzfSBhbmQge0BsaW5rIGFuZHJvaWQudGVzdC5WaWV3QXNzZXJ0c30gY2xhc3NlczoKKzwvcD4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuTW9yZUFzc2VydHN9IGNvbnRhaW5zIG1vcmUgcG93ZXJmdWwgYXNzZXJ0aW9ucyBzdWNoIGFzCisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuTW9yZUFzc2VydHMjYXNzZXJ0Q29udGFpbnNSZWdleH0sIHdoaWNoIGRvZXMgcmVndWxhciBleHByZXNzaW9uCisgICAgICAgIG1hdGNoaW5nLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlZpZXdBc3NlcnRzfSBjb250YWlucyB1c2VmdWwgYXNzZXJ0aW9ucyBhYm91dCBWaWV3cy4gRm9yIGV4YW1wbGUKKyAgICAgICAgaXQgY29udGFpbnMge0BsaW5rIGFuZHJvaWQudGVzdC5WaWV3QXNzZXJ0cyNhc3NlcnRIYXNTY3JlZW5Db29yZGluYXRlc30gdGhhdCB0ZXN0cyBpZiBhIFZpZXcKKyAgICAgICAgaGFzIGEgcGFydGljdWxhciBYIGFuZCBZIHBvc2l0aW9uIG9uIHRoZSB2aXNpYmxlIHNjcmVlbi4gVGhlc2UgYXNzZXJ0cyBzaW1wbGlmeSB0ZXN0aW5nIG9mCisgICAgICAgIGdlb21ldHJ5IGFuZCBhbGlnbm1lbnQgaW4gdGhlIFVJLgorICAgIDwvbGk+Cis8L3VsPgorPGgzIGlkPSJNb2NrT2JqZWN0Q2xhc3NlcyI+TW9jayBvYmplY3QgY2xhc3NlczwvaDM+Cis8cD4KKyAgICBUbyBmYWNpbGl0YXRlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGluIHRlc3RpbmcsIEFuZHJvaWQgcHJvdmlkZXMgY2xhc3NlcyB0aGF0IGNyZWF0ZSBtb2NrIHN5c3RlbQorICAgIG9iamVjdHMgc3VjaCBhcyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHR9IG9iamVjdHMsCisgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJ9IG9iamVjdHMsIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyfQorICAgIG9iamVjdHMsIGFuZCB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZX0gb2JqZWN0cy4gU29tZSB0ZXN0IGNhc2VzIGFsc28gcHJvdmlkZSBtb2NrCisgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5JbnRlbnR9IG9iamVjdHMuIFlvdSB1c2UgdGhlc2UgbW9ja3MgYm90aCB0byBpc29sYXRlIHRlc3RzCisgICAgZnJvbSB0aGUgcmVzdCBvZiB0aGUgc3lzdGVtIGFuZCB0byBmYWNpbGl0YXRlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGZvciB0ZXN0aW5nLiBUaGVzZSBjbGFzc2VzCisgICAgYXJlIGZvdW5kIGluIHRoZSBKYXZhIHBhY2thZ2VzIHtAbGluayBhbmRyb2lkLnRlc3R9IGFuZCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2t9LgorPC9wPgorPHA+CisgICAgTW9jayBvYmplY3RzIGlzb2xhdGUgdGVzdHMgZnJvbSBhIHJ1bm5pbmcgc3lzdGVtIGJ5IHN0dWJiaW5nIG91dCBvciBvdmVycmlkaW5nCisgICAgbm9ybWFsIG9wZXJhdGlvbnMuIEZvciBleGFtcGxlLCBhIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyfQorICAgIHJlcGxhY2VzIHRoZSBub3JtYWwgcmVzb2x2ZXIgZnJhbWV3b3JrIHdpdGggaXRzIG93biBsb2NhbCBmcmFtZXdvcmssIHdoaWNoIGlzIGlzb2xhdGVkCisgICAgZnJvbSB0aGUgcmVzdCBvZiB0aGUgc3lzdGVtLiBNb2NrQ29udGVudFJlc29sdmVyIGFsc28gYWxzbyBzdHVicyBvdXQgdGhlCisgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIjbm90aWZ5Q2hhbmdlKFVyaSwgQ29udGVudE9ic2VydmVyLCBib29sZWFuKX0gbWV0aG9kCisgICAgc28gdGhhdCBvYnNlcnZlciBvYmplY3RzIG91dHNpZGUgdGhlIHRlc3QgZW52aXJvbm1lbnQgYXJlIG5vdCBhY2NpZGVudGFsbHkgdHJpZ2dlcmVkLgorPC9wPgorPHA+CisgICAgTW9jayBvYmplY3QgY2xhc3NlcyBhbHNvIGZhY2lsaXRhdGUgZGVwZW5kZW5jeSBpbmplY3Rpb24gYnkgcHJvdmlkaW5nIGEgc3ViY2xhc3Mgb2YgdGhlCisgICAgbm9ybWFsIG9iamVjdCB0aGF0IGlzIG5vbi1mdW5jdGlvbmFsIGV4Y2VwdCBmb3Igb3ZlcnJpZGVzIHlvdSBkZWZpbmUuIEZvciBleGFtcGxlLCB0aGUKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja1Jlc291cmNlc30gb2JqZWN0IHByb3ZpZGVzIGEgc3ViY2xhc3Mgb2YKKyAgICB7QGxpbmsgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXN9IGluIHdoaWNoIGFsbCB0aGUgbWV0aG9kcyB0aHJvdyBFeGNlcHRpb25zIHdoZW4gY2FsbGVkLgorICAgIFRvIHVzZSBpdCwgeW91IG92ZXJyaWRlIG9ubHkgdGhvc2UgbWV0aG9kcyB0aGF0IG11c3QgcHJvdmlkZSBpbmZvcm1hdGlvbi4KKzwvcD4KKzxwPgorICAgIFRoZXNlIGFyZSB0aGUgbW9jayBvYmplY3QgY2xhc3NlcyBhdmFpbGFibGUgaW4gQW5kcm9pZDoKKzwvcD4KKzxoNCBpZD0iU2ltcGxlTW9ja3MiPlNpbXBsZSBtb2NrIG9iamVjdCBjbGFzc2VzPC9oND4KKzxwPgorICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb259LCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRleHR9LAorICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFByb3ZpZGVyfSwge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDdXJzb3J9LAorICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrRGlhbG9nSW50ZXJmYWNlfSwge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tQYWNrYWdlTWFuYWdlcn0sIGFuZAorICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrUmVzb3VyY2VzfSBwcm92aWRlIGEgc2ltcGxlIGFuZCB1c2VmdWwgbW9jayBzdHJhdGVneS4gVGhleSBhcmUKKyAgICBzdHViYmVkLW91dCB2ZXJzaW9ucyBvZiB0aGUgY29ycmVzcG9uZGluZyBzeXN0ZW0gb2JqZWN0IGNsYXNzLCBhbmQgYWxsIG9mIHRoZWlyIG1ldGhvZHMgdGhyb3cgYW4KKyAgICB7QGxpbmsgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufSBleGNlcHRpb24gaWYgY2FsbGVkLiBUbyB1c2UgdGhlbSwgeW91IG92ZXJyaWRlCisgICAgdGhlIG1ldGhvZHMgeW91IG5lZWQgaW4gb3JkZXIgdG8gcHJvdmlkZSBtb2NrIGRlcGVuZGVuY2llcy4KKzwvcD4KKzxwIGNsYXNzPSJOb3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+CisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UHJvdmlkZXJ9CisgICAgYW5kIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ3Vyc29yfSBhcmUgbmV3IGFzIG9mIEFQSSBsZXZlbCA4LgorPC9wPgorPGg0IGlkPSJSZXNvbHZlck1vY2tzIj5SZXNvbHZlciBtb2NrIG9iamVjdHM8L2g0PgorPHA+CisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXJ9IHByb3ZpZGVzIGlzb2xhdGVkIHRlc3Rpbmcgb2YgY29udGVudCBwcm92aWRlcnMgYnkKKyAgICBtYXNraW5nIG91dCB0aGUgbm9ybWFsIHN5c3RlbSByZXNvbHZlciBmcmFtZXdvcmsuIEluc3RlYWQgb2YgbG9va2luZyBpbiB0aGUgc3lzdGVtIHRvIGZpbmQgYQorICAgIGNvbnRlbnQgcHJvdmlkZXIgZ2l2ZW4gYW4gYXV0aG9yaXR5IHN0cmluZywgTW9ja0NvbnRlbnRSZXNvbHZlciB1c2VzIGl0cyBvd24gaW50ZXJuYWwgdGFibGUuIFlvdQorICAgIG11c3QgZXhwbGljaXRseSBhZGQgcHJvdmlkZXJzIHRvIHRoaXMgdGFibGUgdXNpbmcKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlciNhZGRQcm92aWRlcihTdHJpbmcsQ29udGVudFByb3ZpZGVyKX0uCis8L3A+Cis8cD4KKyAgICBXaXRoIHRoaXMgZmVhdHVyZSwgeW91IGNhbiBhc3NvY2lhdGUgYSBtb2NrIGNvbnRlbnQgcHJvdmlkZXIgd2l0aCBhbiBhdXRob3JpdHkuIFlvdSBjYW4gY3JlYXRlCisgICAgYW4gaW5zdGFuY2Ugb2YgYSByZWFsIHByb3ZpZGVyIGJ1dCB1c2UgdGVzdCBkYXRhIGluIGl0LiBZb3UgY2FuIGV2ZW4gc2V0IHRoZSBwcm92aWRlciBmb3IgYW4KKyAgICBhdXRob3JpdHkgdG8gPGNvZGU+bnVsbDwvY29kZT4uIEluIGVmZmVjdCwgYSBNb2NrQ29udGVudFJlc29sdmVyIG9iamVjdCBpc29sYXRlcyB5b3VyIHRlc3QKKyAgICBmcm9tIHByb3ZpZGVycyB0aGF0IGNvbnRhaW4gcmVhbCBkYXRhLiBZb3UgY2FuIGNvbnRyb2wgdGhlCisgICAgZnVuY3Rpb24gb2YgdGhlIHByb3ZpZGVyLCBhbmQgeW91IGNhbiBwcmV2ZW50IHlvdXIgdGVzdCBmcm9tIGFmZmVjdGluZyByZWFsIGRhdGEuCis8L3A+Cis8aDMgaWQ9IkNvbnRleHRNb2NrcyI+Q29udGV4dHMgZm9yIHRlc3Rpbmc8L2gzPgorPHA+CisgICAgQW5kcm9pZCBwcm92aWRlcyB0d28gQ29udGV4dCBjbGFzc2VzIHRoYXQgYXJlIHVzZWZ1bCBmb3IgdGVzdGluZzoKKzwvcD4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSXNvbGF0ZWRDb250ZXh0fSBwcm92aWRlcyBhbiBpc29sYXRlZCB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHR9LAorICAgICAgICBGaWxlLCBkaXJlY3RvcnksIGFuZCBkYXRhYmFzZSBvcGVyYXRpb25zIHRoYXQgdXNlIHRoaXMgQ29udGV4dCB0YWtlIHBsYWNlIGluIGEgdGVzdCBhcmVhLgorICAgICAgICBUaG91Z2ggaXRzIGZ1bmN0aW9uYWxpdHkgaXMgbGltaXRlZCwgdGhpcyBDb250ZXh0IGhhcyBlbm91Z2ggc3R1YiBjb2RlIHRvIHJlc3BvbmQgdG8KKyAgICAgICAgc3lzdGVtIGNhbGxzLgorICAgICAgICA8cD4KKyAgICAgICAgICAgIFRoaXMgY2xhc3MgYWxsb3dzIHlvdSB0byB0ZXN0IGFuIGFwcGxpY2F0aW9uJ3MgZGF0YSBvcGVyYXRpb25zIHdpdGhvdXQgYWZmZWN0aW5nIHJlYWwKKyAgICAgICAgICAgIGRhdGEgdGhhdCBtYXkgYmUgcHJlc2VudCBvbiB0aGUgZGV2aWNlLgorICAgICAgICA8L3A+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dH0gcHJvdmlkZXMgYSBDb250ZXh0IGluIHdoaWNoCisgICAgICAgIG1vc3QgZnVuY3Rpb25zIGFyZSBoYW5kbGVkIGJ5IGFuIGV4aXN0aW5nIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dH0sIGJ1dAorICAgICAgICBmaWxlIGFuZCBkYXRhYmFzZSBvcGVyYXRpb25zIGFyZSBoYW5kbGVkIGJ5IGEge0BsaW5rIGFuZHJvaWQudGVzdC5Jc29sYXRlZENvbnRleHR9LgorICAgICAgICBUaGUgaXNvbGF0ZWQgcGFydCB1c2VzIGEgdGVzdCBkaXJlY3RvcnkgYW5kIGNyZWF0ZXMgc3BlY2lhbCBmaWxlIGFuZCBkaXJlY3RvcnkgbmFtZXMuCisgICAgICAgIFlvdSBjYW4gY29udHJvbCB0aGUgbmFtaW5nIHlvdXJzZWxmLCBvciBsZXQgdGhlIGNvbnN0cnVjdG9yIGRldGVybWluZSBpdCBhdXRvbWF0aWNhbGx5LgorICAgICAgICA8cD4KKyAgICAgICAgICAgIFRoaXMgb2JqZWN0IHByb3ZpZGVzIGEgcXVpY2sgd2F5IHRvIHNldCB1cCBhbiBpc29sYXRlZCBhcmVhIGZvciBkYXRhIG9wZXJhdGlvbnMsCisgICAgICAgICAgICB3aGlsZSBrZWVwaW5nIG5vcm1hbCBmdW5jdGlvbmFsaXR5IGZvciBhbGwgb3RoZXIgQ29udGV4dCBvcGVyYXRpb25zLgorICAgICAgICA8L3A+CisgICAgPC9saT4KKzwvdWw+Cis8aDIgaWQ9Ikluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiPlJ1bm5pbmcgVGVzdHM8L2gyPgorPHA+CisgICAgVGVzdCBjYXNlcyBhcmUgcnVuIGJ5IGEgdGVzdCBydW5uZXIgY2xhc3MgdGhhdCBsb2FkcyB0aGUgdGVzdCBjYXNlIGNsYXNzLCBzZXQgdXBzLAorICAgIHJ1bnMsIGFuZCB0ZWFycyBkb3duIGVhY2ggdGVzdC4gQW4gQW5kcm9pZCB0ZXN0IHJ1bm5lciBtdXN0IGFsc28gYmUgaW5zdHJ1bWVudGVkLCBzbyB0aGF0CisgICAgdGhlIHN5c3RlbSB1dGlsaXR5IGZvciBzdGFydGluZyBhcHBsaWNhdGlvbnMgY2FuIGNvbnRyb2wgaG93IHRoZSB0ZXN0IHBhY2thZ2UKKyAgICBsb2FkcyB0ZXN0IGNhc2VzIGFuZCB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gWW91IHRlbGwgdGhlIEFuZHJvaWQgcGxhdGZvcm0KKyAgICB3aGljaCBpbnN0cnVtZW50ZWQgdGVzdCBydW5uZXIgdG8gdXNlIGJ5IHNldHRpbmcgYSB2YWx1ZSBpbiB0aGUgdGVzdCBwYWNrYWdlJ3MgbWFuaWZlc3QgZmlsZS4KKzwvcD4KKzxwPgorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0gaXMgdGhlIHByaW1hcnkgQW5kcm9pZCB0ZXN0IHJ1bm5lciBjbGFzcy4gSXQKKyAgICBleHRlbmRzIHRoZSBKVW5pdCB0ZXN0IHJ1bm5lciBmcmFtZXdvcmsgYW5kIGlzIGFsc28gaW5zdHJ1bWVudGVkLiBJdCBjYW4gcnVuIGFueSBvZiB0aGUgdGVzdAorICAgIGNhc2UgY2xhc3NlcyBwcm92aWRlZCBieSBBbmRyb2lkIGFuZCBzdXBwb3J0cyBhbGwgcG9zc2libGUgdHlwZXMgb2YgdGVzdGluZy4KKzwvcD4KKzxwPgorICAgIFlvdSBzcGVjaWZ5IDxjb2RlPkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI8L2NvZGU+IG9yIGEgc3ViY2xhc3MgaW4geW91ciB0ZXN0IHBhY2thZ2UncworICAgIG1hbmlmZXN0IGZpbGUsIGluIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2luc3RydW1lbnRhdGlvbi1lbGVtZW50Lmh0bWwiPgorICAgIGluc3RydW1lbnRhdGlvbjwvYT4gZWxlbWVudC4gQWxzbywgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gY29kZSByZXNpZGVzCisgICAgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5IDxjb2RlPmFuZHJvaWQudGVzdC5ydW5uZXI8L2NvZGU+LCAgd2hpY2ggaXMgbm90IG5vcm1hbGx5IGxpbmtlZCB0bworICAgIEFuZHJvaWQgY29kZS4gVG8gaW5jbHVkZSBpdCwgeW91IG11c3Qgc3BlY2lmeSBpdCBpbiBhCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLWxpYnJhcnktZWxlbWVudC5odG1sIj51c2VzLWxpYnJhcnk8L2E+IGVsZW1lbnQuCisgICAgWW91IGRvIG5vdCBoYXZlIHRvIHNldCB1cCB0aGVzZSBlbGVtZW50cyB5b3Vyc2VsZi4gQm90aCBFY2xpcHNlIHdpdGggQURUIGFuZCB0aGUKKyAgICA8Y29kZT5hbmRyb2lkPC9jb2RlPiBjb21tYW5kLWxpbmUgdG9vbCBjb25zdHJ1Y3QgdGhlbSBhdXRvbWF0aWNhbGx5IGFuZCBhZGQgdGhlbSB0byB5b3VyCisgICAgdGVzdCBwYWNrYWdlJ3MgbWFuaWZlc3QgZmlsZS4KKzwvcD4KKzxwIGNsYXNzPSJOb3RlIj4KKyAgICA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHlvdSB1c2UgYSB0ZXN0IHJ1bm5lciBvdGhlciB0aGFuCisgICAgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4sIHlvdSBtdXN0IGNoYW5nZSB0aGUgJmx0O2luc3RydW1lbnRhdGlvbiZndDsKKyAgICBlbGVtZW50IHRvIHBvaW50IHRvIHRoZSBjbGFzcyB5b3Ugd2FudCB0byB1c2UuCis8L3A+Cis8cD4KKyAgICBUbyBydW4ge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfSwgeW91IHVzZSBpbnRlcm5hbCBzeXN0ZW0gY2xhc3NlcyBjYWxsZWQgYnkKKyAgICBBbmRyb2lkIHRvb2xzLiBXaGVuIHlvdSBydW4gYSB0ZXN0IGluIEVjbGlwc2Ugd2l0aCBBRFQsIHRoZSBjbGFzc2VzIGFyZSBjYWxsZWQgYXV0b21hdGljYWxseS4KKyAgICBXaGVuIHlvdSBydW4gYSB0ZXN0IGZyb20gdGhlIGNvbW1hbmQgbGluZSwgeW91IHJ1biB0aGVzZSBjbGFzc2VzIHdpdGgKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9hZGIuaHRtbCI+QW5kcm9pZCBEZWJ1ZyBCcmlkZ2UgKGFkYik8L2E+LgorPC9wPgorPHA+CisgICAgVGhlIHN5c3RlbSBjbGFzc2VzIGxvYWQgYW5kIHN0YXJ0IHRoZSB0ZXN0IHBhY2thZ2UsIGtpbGwgYW55IHByb2Nlc3NlcyB0aGF0CisgICAgYXJlIHJ1bm5pbmcgYW4gaW5zdGFuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsIGFuZCB0aGVuIGxvYWQgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlCisgICAgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gVGhleSB0aGVuIHBhc3MgY29udHJvbCB0bworICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0sIHdoaWNoIHJ1bnMKKyAgICBlYWNoIHRlc3QgY2FzZSBjbGFzcyBpbiB0aGUgdGVzdCBwYWNrYWdlLiBZb3UgY2FuIGFsc28gY29udHJvbCB3aGljaCB0ZXN0IGNhc2VzIGFuZAorICAgIG1ldGhvZHMgYXJlIHJ1biB1c2luZyBzZXR0aW5ncyBpbiBFY2xpcHNlIHdpdGggQURULCBvciB1c2luZyBmbGFncyB3aXRoIHRoZSBjb21tYW5kLWxpbmUgdG9vbHMuCis8L3A+Cis8cD4KKyAgICBOZWl0aGVyIHRoZSBzeXN0ZW0gY2xhc3NlcyBub3Ige0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfSBydW4KKyAgICB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gSW5zdGVhZCwgdGhlIHRlc3QgY2FzZSBkb2VzIHRoaXMgZGlyZWN0bHkuIEl0IGVpdGhlciBjYWxscyBtZXRob2RzCisgICAgaW4gdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsIG9yIGl0IGNhbGxzIGl0cyBvd24gbWV0aG9kcyB0aGF0IHRyaWdnZXIgbGlmZWN5Y2xlIGV2ZW50cyBpbgorICAgIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBUaGUgYXBwbGljYXRpb24gaXMgdW5kZXIgdGhlIGNvbXBsZXRlIGNvbnRyb2wgb2YgdGhlIHRlc3QgY2FzZSwKKyAgICB3aGljaCBhbGxvd3MgaXQgdG8gc2V0IHVwIHRoZSB0ZXN0IGVudmlyb25tZW50ICh0aGUgdGVzdCBmaXh0dXJlKSBiZWZvcmUgcnVubmluZyBhIHRlc3QuIFRoaXMKKyAgICBpcyBkZW1vbnN0cmF0ZWQgaW4gdGhlIHByZXZpb3VzIDxhIGhyZWY9IiNBY3Rpdml0eVNuaXBwZXQiPmNvZGUgc25pcHBldDwvYT4gdGhhdCB0ZXN0cyBhbgorICAgIEFjdGl2aXR5IHRoYXQgZGlzcGxheXMgYSBTcGlubmVyIHdpZGdldC4KKzwvcD4KKzxwPgorICAgIFRvIGxlYXJuIG1vcmUgYWJvdXQgcnVubmluZyB0ZXN0cywgcGxlYXNlIHJlYWQgdGhlIHRvcGljcworICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiIj4KKyAgICBUZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPiBvcgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj4KKyAgICBUZXN0aW5nIGluIE90aGVyIElEZXM8L2E+LgorPC9wPgorPGgyIGlkPSJUZXN0UmVzdWx0cyI+U2VlaW5nIFRlc3QgUmVzdWx0czwvaDI+Cis8cD4KKyAgICBUaGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yayByZXR1cm5zIHRlc3QgcmVzdWx0cyBiYWNrIHRvIHRoZSB0b29sIHRoYXQgc3RhcnRlZCB0aGUgdGVzdC4KKyAgICBJZiB5b3UgcnVuIGEgdGVzdCBpbiBFY2xpcHNlIHdpdGggQURULCB0aGUgcmVzdWx0cyBhcmUgZGlzcGxheWVkIGluIGEgbmV3IEpVbml0IHZpZXcgcGFuZS4gSWYKKyAgICB5b3UgcnVuIGEgdGVzdCBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHRoZSByZXN1bHRzIGFyZSBkaXNwbGF5ZWQgaW4gPGNvZGU+U1RET1VUPC9jb2RlPi4gSW4KKyAgICBib3RoIGNhc2VzLCB5b3Ugc2VlIGEgdGVzdCBzdW1tYXJ5IHRoYXQgZGlzcGxheXMgdGhlIG5hbWUgb2YgZWFjaCB0ZXN0IGNhc2UgYW5kIG1ldGhvZCB0aGF0CisgICAgd2FzIHJ1bi4gWW91IGFsc28gc2VlIGFsbCB0aGUgYXNzZXJ0aW9uIGZhaWx1cmVzIHRoYXQgb2NjdXJyZWQuIFRoZXNlIGluY2x1ZGUgcG9pbnRlcnMgdG8gdGhlCisgICAgbGluZSBpbiB0aGUgdGVzdCBjb2RlIHdoZXJlIHRoZSBmYWlsdXJlIG9jY3VycmVkLiBBc3NlcnRpb24gZmFpbHVyZXMgYWxzbyBsaXN0IHRoZSBleHBlY3RlZAorICAgIHZhbHVlIGFuZCBhY3R1YWwgdmFsdWUuCis8L3A+Cis8cD4KKyAgICBUaGUgdGVzdCByZXN1bHRzIGhhdmUgYSBmb3JtYXQgdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgSURFIHRoYXQgeW91IGFyZSB1c2luZy4gVGhlIHRlc3QKKyAgICByZXN1bHRzIGZvcm1hdCBmb3IgRWNsaXBzZSB3aXRoIEFEVCBpcyBkZXNjcmliZWQgaW4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sI1J1blRlc3RFY2xpcHNlIj4KKyAgICBUZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPi4gVGhlIHRlc3QgcmVzdWx0cyBmb3JtYXQgZm9yIHRlc3RzIHJ1biBmcm9tIHRoZQorICAgIGNvbW1hbmQgbGluZSBpcyBkZXNjcmliZWQgaW4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCNSdW5UZXN0c0NvbW1hbmQiPgorICAgIFRlc3RpbmcgaW4gT3RoZXIgSURFczwvYT4uCis8L3A+Cis8aDIgaWQ9Ik1vbmtleXMiPk1vbmtleSBhbmQgTW9ua2V5UnVubmVyPC9oMj4KKzxwPgorICAgIFRoZSBTREsgcHJvdmlkZXMgdHdvIHRvb2xzIGZvciBmdW5jdGlvbmFsLWxldmVsIGFwcGxpY2F0aW9uIHRlc3Rpbmc6Cis8L3A+CiAgICAgPHVsPgotICAgICAgPGxpPgotICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0gLSBNb2NrcyBhIENvbnRleHQgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gdXNpbmcgaXQgcnVucyBpbiBpc29sYXRpb24uCi0gICAgICAgIEF0IHRoZSBzYW1lIHRpbWUsIGl0IGhhcyBlbm91Z2ggc3R1YiBjb2RlIHRvIHNhdGlzZnkgT1MgY29kZSB0aGF0IHRyaWVzIHRvIGNvbW11bmljYXRlIHdpdGggY29udGV4dHMuIFRoaXMgY2xhc3MgaXMgdXNlZnVsIGluIHVuaXQgdGVzdGluZy4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dH0gLSBEZWxlZ2F0ZXMgbW9zdCBjb250ZXh0IGZ1bmN0aW9ucyB0byBhbiBleGlzdGluZywgbm9ybWFsIGNvbnRleHQgd2hpbGUgY2hhbmdpbmcgdGhlIGRlZmF1bHQgZmlsZSBhbmQgZGF0YWJhc2UKLSAgICAgICAgbmFtZXMgaW4gdGhlIGNvbnRleHQuIFVzZSB0aGlzIHRvIHRlc3QgZmlsZSBhbmQgZGF0YWJhc2Ugb3BlcmF0aW9ucyB3aXRoIGEgbm9ybWFsIHN5c3RlbSBjb250ZXh0LCB1c2luZyB0ZXN0IG5hbWVzLgotICAgICAgPC9saT4KLSAgICAgIDxsaT4KLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbn0sIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyfSwge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZXh0fSwKLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tEaWFsb2dJbnRlcmZhY2V9LCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja1BhY2thZ2VNYW5hZ2VyfSwKLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tSZXNvdXJjZXN9IC0gQ2xhc3NlcyB0aGF0IGNyZWF0ZSBtb2NrIEFuZHJvaWQgc3lzdGVtIG9iamVjdHMgZm9yIHVzZSBpbiB0ZXN0aW5nLiBUaGV5IGV4cG9zZSBvbmx5IHRob3NlIG1ldGhvZHMgdGhhdCBhcmUKLSAgICAgICAgdXNlZnVsIGluIG1hbmFnaW5nIHRoZSBvYmplY3QuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiB0aGVzZSBtZXRob2RzIHNpbXBseSB0aHJvdyBhbiBFeGNlcHRpb24uIFlvdSBhcmUgZXhwZWN0ZWQgdG8gZXh0ZW5kIHRoZSBjbGFzc2VzIGFuZAotICAgICAgICBvdmVycmlkZSBhbnkgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuCi0gICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9tb25rZXkuaHRtbCI+TW9ua2V5PC9hPiBpcyBhIGNvbW1hbmQtbGluZQorICAgICAgICAgICAgdG9vbCB0aGF0IHNlbmRzIHBzZXVkby1yYW5kb20gc3RyZWFtcyBvZiBrZXlzdHJva2VzLCB0b3VjaGVzLCBhbmQgZ2VzdHVyZXMgdG8gYQorICAgICAgICAgICAgZGV2aWNlLiBZb3UgcnVuIGl0IHdpdGggdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2FkYi5odG1sIj4KKyAgICAgICAgICAgIEFuZHJvaWQgRGVidWcgQnJpZGdlPC9hPiAoYWRiKSB0b29sLiBZb3UgdXNlIGl0IHRvIHN0cmVzcy10ZXN0IHlvdXIgYXBwbGljYXRpb24gYW5kCisgICAgICAgICAgICByZXBvcnQgYmFjayBlcnJvcnMgdGhhdCBhcmUgZW5jb3VudGVyZWQuIFlvdSBjYW4gcmVwZWF0IGEgc3RyZWFtIG9mIGV2ZW50cyBieQorICAgICAgICAgICAgcnVubmluZyB0aGUgdG9vbCBlYWNoIHRpbWUgd2l0aCB0aGUgc2FtZSByYW5kb20gbnVtYmVyIHNlZWQuCisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy9tb25rZXlydW5uZXIuaHRtbCI+TW9ua2V5UnVubmVyPC9hPiBpcyBhCisgICAgICAgICAgICBKeXRob24gQVBJIHRoYXQgeW91IHVzZSBpbiB0ZXN0IHByb2dyYW1zIHdyaXR0ZW4gaW4gUHl0aG9uLiBUaGUgQVBJIGluY2x1ZGVzIGZ1bmN0aW9ucworICAgICAgICAgICAgZm9yIGNvbm5lY3RpbmcgdG8gYSBkZXZpY2UsIGluc3RhbGxpbmcgYW5kIHVuaW5zdGFsbGluZyBwYWNrYWdlcywgdGFraW5nIHNjcmVlbnNob3RzLAorICAgICAgICAgICAgY29tcGFyaW5nIHR3byBpbWFnZXMsIGFuZCBydW5uaW5nIGEgdGVzdCBwYWNrYWdlIGFnYWluc3QgYW4gYXBwbGljYXRpb24uIFVzaW5nIHRoZSBBUEkKKyAgICAgICAgICAgIHdpdGggUHl0aG9uLCB5b3UgY2FuIHdyaXRlIGEgd2lkZSByYW5nZSBvZiBsYXJnZSwgcG93ZXJmdWwsIGFuZCBjb21wbGV4IHRlc3RzLgorICAgICAgICA8L2xpPgogICAgIDwvdWw+Ci08aDMgaWQ9Ikluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiPkluc3RydW1lbnRhdGlvbiBUZXN0IFJ1bm5lcjwvaDM+Cis8aDIgaWQ9IlBhY2thZ2VOYW1lcyI+V29ya2luZyBXaXRoIFBhY2thZ2UgbmFtZXM8L2gyPgogPHA+Ci0gIEFuZHJvaWQgcHJvdmlkZXMgYSBjdXN0b20gY2xhc3MgZm9yIHJ1bm5pbmcgdGVzdHMgd2l0aCBpbnN0cnVtZW50YXRpb24gY2FsbGVkIGNhbGxlZAotICB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9LiBUaGlzIGNsYXNzCi0gIGNvbnRyb2xzIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCBydW5zIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIGFuZCB0aGUgbWFpbiBhcHBsaWNhdGlvbiBpbiB0aGUgc2FtZSBwcm9jZXNzLCBhbmQgcm91dGVzCi0gIHRlc3Qgb3V0cHV0IHRvIHRoZSBhcHByb3ByaWF0ZSBwbGFjZS4gVXNpbmcgaW5zdHJ1bWVudGF0aW9uIGlzIGtleSB0byB0aGUgYWJpbGl0eSBvZiA8Y29kZT5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyPC9jb2RlPiB0byBjb250cm9sIHRoZSBlbnRpcmUgdGVzdAotICBlbnZpcm9ubWVudCBhdCBydW50aW1lLiBOb3RpY2UgdGhhdCB5b3UgdXNlIHRoaXMgdGVzdCBydW5uZXIgZXZlbiBpZiB5b3VyIHRlc3QgY2xhc3MgZG9lcyBub3QgaXRzZWxmIHVzZSBpbnN0cnVtZW50YXRpb24uCisgICAgSW4gdGhlIHRlc3QgZW52aXJvbm1lbnQsIHlvdSB3b3JrIHdpdGggYm90aCBBbmRyb2lkIGFwcGxpY2F0aW9uIHBhY2thZ2UgbmFtZXMgYW5kCisgICAgSmF2YSBwYWNrYWdlIGlkZW50aWZpZXJzLiBCb3RoIHVzZSB0aGUgc2FtZSBuYW1pbmcgZm9ybWF0LCBidXQgdGhleSByZXByZXNlbnQgc3Vic3RhbnRpYWxseQorICAgIGRpZmZlcmVudCBlbnRpdGllcy4gWW91IG5lZWQgdG8ga25vdyB0aGUgZGlmZmVyZW5jZSB0byBzZXQgdXAgeW91ciB0ZXN0cyBjb3JyZWN0bHkuCiA8L3A+CiA8cD4KLSAgV2hlbiB5b3UgcnVuIGEgdGVzdCBhcHBsaWNhdGlvbiwgeW91IGZpcnN0IHJ1biBhIHN5c3RlbSB1dGlsaXR5IGNhbGxlZCBBY3Rpdml0eSBNYW5hZ2VyLiBBY3Rpdml0eSBNYW5hZ2VyIHVzZXMgdGhlIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsgdG8gc3RhcnQgYW5kIGNvbnRyb2wgdGhlIHRlc3QgcnVubmVyLCB3aGljaCBpbiB0dXJuIHVzZXMgaW5zdHJ1bWVudGF0aW9uIHRvIHNodXQgZG93biBhbnkgcnVubmluZyBpbnN0YW5jZXMKLSAgb2YgdGhlIG1haW4gYXBwbGljYXRpb24sIHN0YXJ0cyB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgYW5kIHRoZW4gc3RhcnRzIHRoZSBtYWluIGFwcGxpY2F0aW9uIGluIHRoZSBzYW1lIHByb2Nlc3MuIFRoaXMgYWxsb3dzIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgdGVzdCBhcHBsaWNhdGlvbiB0byB3b3JrIGRpcmVjdGx5IHdpdGggdGhlIG1haW4gYXBwbGljYXRpb24uCisgICAgQW4gQW5kcm9pZCBwYWNrYWdlIG5hbWUgaXMgYSB1bmlxdWUgc3lzdGVtIG5hbWUgZm9yIGEgPGNvZGU+LmFwazwvY29kZT4gZmlsZSwgc2V0IGJ5IHRoZQorICAgICZxdW90O2FuZHJvaWQ6cGFja2FnZSZxdW90OyBhdHRyaWJ1dGUgb2YgdGhlICZsdDttYW5pZmVzdCZndDsgZWxlbWVudCBpbiB0aGUgcGFja2FnZSdzCisgICAgbWFuaWZlc3QuIFRoZSBBbmRyb2lkIHBhY2thZ2UgbmFtZSBvZiB5b3VyIHRlc3QgcGFja2FnZSBtdXN0IGJlIGRpZmZlcmVudCBmcm9tIHRoZQorICAgIEFuZHJvaWQgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBCeSBkZWZhdWx0LCBBbmRyb2lkIHRvb2xzIGNyZWF0ZSB0aGUKKyAgICB0ZXN0IHBhY2thZ2UgbmFtZSBieSBhcHBlbmRpbmcgIi50ZXN0IiB0byB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LgogPC9wPgogPHA+Ci0gIElmIHlvdSBhcmUgZGV2ZWxvcGluZyBpbiBFY2xpcHNlLCB0aGUgQURUIHBsdWdpbiBhc3Npc3RzIHlvdSBpbiB0aGUgc2V0dXAgb2YgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gb3Igb3RoZXIgdGVzdCBydW5uZXJzLgotICBUaGUgcGx1Z2luIFVJIHByb21wdHMgeW91IHRvIHNwZWNpZnkgdGhlIHRlc3QgcnVubmVyIGNsYXNzIHRvIHVzZSwgYXMgd2VsbCBhcyB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LgotICBUaGUgcGx1Z2luIHRoZW4gYWRkcyBhbiA8Y29kZT4mbHQ7aW5zdHJ1bWVudGF0aW9uJmd0OzwvY29kZT4gZWxlbWVudCB3aXRoIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgdG8gdGhlIG1hbmlmZXN0IGZpbGUgb2YgdGhlIHRlc3QgYXBwbGljYXRpb24uCi0gIEVjbGlwc2Ugd2l0aCBBRFQgYXV0b21hdGljYWxseSBzdGFydHMgYSB0ZXN0IGFwcGxpY2F0aW9uIHVuZGVyIHRoZSBjb250cm9sIG9mIEFjdGl2aXR5IE1hbmFnZXIgdXNpbmcgaW5zdHJ1bWVudGF0aW9uLAotICBhbmQgcmVkaXJlY3RzIHRoZSB0ZXN0IG91dHB1dCB0byB0aGUgRWNsaXBzZSB3aW5kb3cncyBKVW5pdCB2aWV3LgorICAgIFRoZSB0ZXN0IHBhY2thZ2UgYWxzbyB1c2VzIGFuIEFuZHJvaWQgcGFja2FnZSBuYW1lIHRvIHRhcmdldCB0aGUgYXBwbGljYXRpb24gcGFja2FnZSBpdAorICAgIHRlc3RzLiBUaGlzIGlzIHNldCBpbiB0aGUgJnF1b3Q7YW5kcm9pZDp0YXJnZXRQYWNrYWdlJnF1b3Q7IGF0dHJpYnV0ZSBvZiB0aGUKKyAgICAmbHQ7aW5zdHJ1bWVudGF0aW9uJmd0OyBlbGVtZW50IGluIHRoZSB0ZXN0IHBhY2thZ2UncyBtYW5pZmVzdC4KIDwvcD4KIDxwPgotICBJZiB5b3UgcHJlZmVyIHdvcmtpbmcgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCB5b3UgY2FuIHVzZSBBbnQgYW5kIHRoZSA8Y29kZT5hbmRyb2lkPC9jb2RlPgotICB0b29sIHRvIGhlbHAgeW91IHNldCB1cCB5b3VyIHRlc3QgcHJvamVjdHMuIFRvIHJ1biB0ZXN0cyB3aXRoIGluc3RydW1lbnRhdGlvbiwgeW91IGNhbiBhY2Nlc3MgdGhlCi0gIEFjdGl2aXR5IE1hbmFnZXIgdGhyb3VnaCB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYWRiLmh0bWwiPkFuZHJvaWQgRGVidWcKLSAgQnJpZGdlPC9hPiAoPGNvZGU+YWRiPC9jb2RlPikgdG9vbCBhbmQgdGhlIG91dHB1dCBpcyBkaXJlY3RlZCB0byA8Y29kZT5TVERPVVQ8L2NvZGU+LgotPC9wPgotPGgyIGlkPSJUZXN0RW52aXJvbWVudCI+V29ya2luZyBpbiB0aGUgVGVzdCBFbnZpcm9ubWVudDwvaDI+Ci08cD4KLSAgICBUaGUgdGVzdHMgZm9yIGFuIEFuZHJvaWQgYXBwbGljYXRpb24gYXJlIGNvbnRhaW5lZCBpbiBhIHRlc3QgYXBwbGljYXRpb24sIHdoaWNoIGl0c2VsZiBpcyBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uLiBBIHRlc3QgYXBwbGljYXRpb24gcmVzaWRlcyBpbiBhIHNlcGFyYXRlIEFuZHJvaWQgcHJvamVjdCB0aGF0IGhhcyB0aGUKLSAgICBzYW1lIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBhcyBhIHJlZ3VsYXIgQW5kcm9pZCBhcHBsaWNhdGlvbi4gVGhlIHRlc3QgcHJvamVjdCBpcyBsaW5rZWQgdG8gdGhlIHByb2plY3Qgb2YgdGhlIGFwcGxpY2F0aW9uIGl0IHRlc3RzCi0gICAgKGtub3duIGFzIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0KSBieSBpdHMgbWFuaWZlc3QgZmlsZS4KKyAgICBBIEphdmEgcGFja2FnZSBpZGVudGlmaWVyIGFwcGxpZXMgdG8gYSBzb3VyY2UgZmlsZS4gVGhpcyBwYWNrYWdlIG5hbWUgcmVmbGVjdHMgdGhlIGRpcmVjdG9yeQorICAgIHBhdGggb2YgdGhlIHNvdXJjZSBmaWxlLiBJdCBhbHNvIGFmZmVjdHMgdGhlIHZpc2liaWxpdHkgb2YgY2xhc3NlcyBhbmQgbWVtYmVycyB0byBlYWNoIG90aGVyLgogPC9wPgogPHA+Ci0gICAgRWFjaCB0ZXN0IGFwcGxpY2F0aW9uIGNvbnRhaW5zIG9uZSBvciBtb3JlIHRlc3QgY2FzZSBjbGFzc2VzIGJhc2VkIG9uIGFuIEFuZHJvaWQgY2xhc3MgZm9yIGEKLSAgICBwYXJ0aWN1bGFyIHR5cGUgb2YgY29tcG9uZW50LiBUaGUgdGVzdCBjYXNlIGNsYXNzIGNvbnRhaW5zIG1ldGhvZHMgdGhhdCBkZWZpbmUgdGVzdHMgb24gc29tZSBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBXaGVuIHlvdSBydW4gdGhlIHRlc3QgYXBwbGljYXRpb24sIEFuZHJvaWQKLSAgICBzdGFydHMgaXQsIGxvYWRzIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGludG8gdGhlIHNhbWUgcHJvY2VzcywgYW5kIHRoZW4gaW52b2tlcyBlYWNoIG1ldGhvZCBpbiB0aGUgdGVzdCBjYXNlIGNsYXNzLgorICAgIEFuZHJvaWQgdG9vbHMgdGhhdCBjcmVhdGUgdGVzdCBwcm9qZWN0cyBzZXQgdXAgYW4gQW5kcm9pZCB0ZXN0IHBhY2thZ2UgbmFtZSBmb3IgeW91LgorICAgIEZyb20geW91ciBpbnB1dCwgdGhlIHRvb2xzIHNldCB1cCB0aGUgdGVzdCBwYWNrYWdlIG5hbWUgYW5kIHRoZSB0YXJnZXQgcGFja2FnZSBuYW1lIGZvciB0aGUKKyAgICBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBGb3IgdGhlc2UgdG9vbHMgdG8gd29yaywgdGhlIGFwcGxpY2F0aW9uIHByb2plY3QgbXVzdCBhbHJlYWR5IGV4aXN0LgogPC9wPgogPHA+Ci0gICAgVGhlIHRvb2xzIGFuZCBwcm9jZWR1cmVzIHlvdSB1c2Ugd2l0aCB0ZXN0aW5nIGRlcGVuZCBvbiB0aGUgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgeW91IGFyZSB1c2luZy4gSWYgeW91IHVzZSBFY2xpcHNlLCB0aGVuIHRoZSBBRFQgcGx1ZyBpbiBmb3IgRWNsaXBzZSBwcm92aWRlcyB0b29scyB0aGF0Ci0gICAgYWxsb3cgeW91IHRvIGRldmVsb3AgYW5kIHJ1biB0ZXN0cyBlbnRpcmVseSB3aXRoaW4gRWNsaXBzZS4gVGhpcyBpcyBkb2N1bWVudGVkIGluIHRoZSB0b3BpYyA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sIj5UZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPi4KLSAgICBJZiB5b3UgdXNlIGFub3RoZXIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIHRoZW4geW91IHVzZSBBbmRyb2lkJ3MgY29tbWFuZC1saW5lIHRvb2xzLCBhcyBkb2N1bWVudGVkIGluIHRoZSB0b3BpYyA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlciBJREVzPC9hPi4KKyAgICBCeSBkZWZhdWx0LCB0aGVzZSB0b29scyBzZXQgdGhlIEphdmEgcGFja2FnZSBpZGVudGlmaWVyIGZvciB0aGUgdGVzdCBjbGFzcyB0byBiZSB0aGUgc2FtZQorICAgIGFzIHRoZSBBbmRyb2lkIHBhY2thZ2UgaWRlbnRpZmllci4gWW91IG1heSB3YW50IHRvIGNoYW5nZSB0aGlzIGlmIHlvdSB3YW50IHRvIGV4cG9zZQorICAgIG1lbWJlcnMgaW4gdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgYnkgZ2l2aW5nIHRoZW0gcGFja2FnZSB2aXNpYmlsaXR5LiBJZiB5b3UgZG8gdGhpcywKKyAgICBjaGFuZ2Ugb25seSB0aGUgSmF2YSBwYWNrYWdlIGlkZW50aWZpZXIsIG5vdCB0aGUgQW5kcm9pZCBwYWNrYWdlIG5hbWVzLCBhbmQgY2hhbmdlIG9ubHkgdGhlCisgICAgdGVzdCBjYXNlIHNvdXJjZSBmaWxlcy4gRG8gbm90IGNoYW5nZSB0aGUgSmF2YSBwYWNrYWdlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZAorICAgIDxjb2RlPlIuamF2YTwvY29kZT4gY2xhc3MgaW4geW91ciB0ZXN0IHBhY2thZ2UsIGJlY2F1c2UgaXQgd2lsbCB0aGVuIGNvbmZsaWN0IHdpdGggdGhlCisgICAgPGNvZGU+Ui5qYXZhPC9jb2RlPiBjbGFzcyBpbiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gRG8gbm90IGNoYW5nZSB0aGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUKKyAgICBvZiB5b3VyIHRlc3QgcGFja2FnZSB0byBiZSB0aGUgc2FtZSBhcyB0aGUgYXBwbGljYXRpb24gaXQgdGVzdHMsIGJlY2F1c2UgdGhlbiB0aGVpciBuYW1lcworICAgIHdpbGwgbm8gbG9uZ2VyIGJlIHVuaXF1ZSBpbiB0aGUgc3lzdGVtLgogPC9wPgotPGgzIGlkPSJUZXN0UHJvamVjdHMiPldvcmtpbmcgd2l0aCB0ZXN0IHByb2plY3RzPC9oMz4KKzxoMiBpZD0iV2hhdFRvVGVzdCI+V2hhdCB0byBUZXN0PC9oMj4KIDxwPgotICAgIFRvIHN0YXJ0IHRlc3RpbmcgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbiwgeW91IGNyZWF0ZSBhIHRlc3QgcHJvamVjdCBmb3IgaXQgdXNpbmcgQW5kcm9pZCB0b29scy4gVGhlIHRvb2xzIGNyZWF0ZSB0aGUgcHJvamVjdCBkaXJlY3RvcnkgYW5kIHRoZSBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgbmVlZGVkLgotICAgIFRoZSB0b29scyBhbHNvIGNyZWF0ZSBhIG1hbmlmZXN0IGZpbGUgdGhhdCBsaW5rcyB0aGUgYXBwbGljYXRpb24gaW4gdGhlIHRlc3QgcHJvamVjdCB0byB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gVGhlIHByb2NlZHVyZSBmb3IgY3JlYXRpbmcgYSB0ZXN0IHByb2plY3QgaW4gRWNsaXBzZSB3aXRoCi0gICAgQURUIGlzIGRvY3VtZW50ZWQgaW4gPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+VGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uIFRoZSBwcm9jZWR1cmUgZm9yIGNyZWF0aW5nIGEgdGVzdCBwcm9qZWN0IGZvciB1c2Ugd2l0aCBkZXZlbG9wbWVudAotICAgIHRvb2xzIG90aGVyIHRoYW4gRWNsaXBzZSBpcyBkb2N1bWVudGVkIGluIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyIElERXM8L2E+LgotPC9wPgotPGgzIGlkPSJUZXN0Q2xhc3NlcyI+V29ya2luZyB3aXRoIHRlc3QgY2FzZSBjbGFzc2VzPC9oMz4KLTxwPgotICAgIEEgdGVzdCBhcHBsaWNhdGlvbiBjb250YWlucyBvbmUgb3IgbW9yZSB0ZXN0IGNhc2UgY2xhc3NlcyB0aGF0IGV4dGVuZCBhbiBBbmRyb2lkIHRlc3QgY2FzZSBjbGFzcy4gWW91IGNob29zZSBhIHRlc3QgY2FzZSBjbGFzcyBiYXNlZCBvbiB0aGUgdHlwZSBvZiBBbmRyb2lkIGNvbXBvbmVudCB5b3UgYXJlIHRlc3RpbmcgYW5kIHRoZQotICAgIHRlc3RzIHlvdSBhcmUgZG9pbmcuIEEgdGVzdCBhcHBsaWNhdGlvbiBjYW4gdGVzdCBkaWZmZXJlbnQgY29tcG9uZW50cywgYnV0IGVhY2ggdGVzdCBjYXNlIGNsYXNzIGlzIGRlc2lnbmVkIHRvIHRlc3QgYSBzaW5nbGUgdHlwZSBvZiBjb21wb25lbnQuCi0gICAgVGhlIEFuZHJvaWQgdGVzdCBjYXNlIGNsYXNzZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbiA8YSBocmVmPSIjVGVzdEFQSSI+VGhlIFRlc3RpbmcgQVBJPC9hPi4KKyAgICBUaGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3doYXRfdG9fdGVzdC5odG1sIj5XaGF0IFRvIFRlc3Q8L2E+CisgICAgZGVzY3JpYmVzIHRoZSBrZXkgZnVuY3Rpb25hbGl0eSB5b3Ugc2hvdWxkIHRlc3QgaW4gYW4gQW5kcm9pZCBhcHBsaWNhdGlvbiwgYW5kIHRoZSBrZXkKKyAgICBzaXR1YXRpb25zIHRoYXQgbWlnaHQgYWZmZWN0IHRoYXQgZnVuY3Rpb25hbGl0eS4KIDwvcD4KIDxwPgotICAgIFNvbWUgQW5kcm9pZCBjb21wb25lbnRzIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3NvY2lhdGVkIHRlc3QgY2FzZSBjbGFzcy4gSW4gdGhpcyBjYXNlLCB5b3UgY2hvb3NlIGFtb25nIHRoZSBhdmFpbGFibGUgY2xhc3NlcyBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0ZXN0cyB5b3Ugd2FudCB0byBkby4gRm9yIGFjdGl2aXRpZXMsCi0gICAgZm9yIGV4YW1wbGUsIHlvdSBoYXZlIHRoZSBjaG9pY2Ugb2YgZWl0aGVyIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTJ9IG9yIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9LgotPHA+Ci0gICAgPGNvZGU+QWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8L2NvZGU+IGlzIGRlc2lnbmVkIHRvIGRvIGZ1bmN0aW9uYWwgdGVzdGluZywgc28gaXQgdGVzdHMgYWN0aXZpdGllcyBpbiBhIG5vcm1hbCBzeXN0ZW0gaW5mcmFzdHJ1Y3R1cmUuIFlvdSBjYW4gaW5qZWN0IG1vY2tlZCBJbnRlbnRzLCBidXQgbm90Ci0gICAgbW9ja2VkIENvbnRleHRzLiBJbiBnZW5lcmFsLCB5b3UgY2FuJ3QgbW9jayBkZXBlbmRlbmNpZXMgZm9yIHRoZSBhY3Rpdml0eSB1bmRlciB0ZXN0LgorICAgIE1vc3QgdW5pdCB0ZXN0aW5nIGlzIHNwZWNpZmljIHRvIHRoZSBBbmRyb2lkIGNvbXBvbmVudCB5b3UgYXJlIHRlc3RpbmcuCisgICAgVGhlIHRvcGljcyA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdGluZy5odG1sIj5BY3Rpdml0eSBUZXN0aW5nPC9hPiwKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvY29udGVudHByb3ZpZGVyX3Rlc3RpbmcuaHRtbCI+CisgICAgQ29udGVudCBQcm92aWRlciBUZXN0aW5nPC9hPiwgYW5kIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy9zZXJ2aWNlX3Rlc3RpbmcuaHRtbCI+CisgICAgU2VydmljZSBUZXN0aW5nPC9hPiBlYWNoIGhhdmUgYSBzZWN0aW9uIGVudGl0bGVkICJXaGF0IFRvIFRlc3QiIHRoYXQgbGlzdHMgcG9zc2libGUgdGVzdGluZworICAgIGFyZWFzLgogPC9wPgogPHA+Ci0gICAgSW4gY29tcGFyaXNvbiwgPGNvZGU+QWN0aXZpdHlVbml0VGVzdENhc2U8L2NvZGU+IGlzIGRlc2lnbmVkIGZvciB1bml0IHRlc3RpbmcsIHNvIGl0IHRlc3RzIGFjdGl2aXRpZXMgaW4gYW4gaXNvbGF0ZWQgc3lzdGVtIGluZnJhc3RydWN0dXJlLiBZb3UgY2FuIGluamVjdCBtb2NrZWQgb3Igd3JhcHBlcmVkIGRlcGVuZGVuY2llcyBmb3IKLSAgICB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdCwgcGFydGljdWxhcmx5IG1vY2tlZCBDb250ZXh0cy4gT24gdGhlIG90aGVyIGhhbmQsIHdoZW4geW91IHVzZSB0aGlzIHRlc3QgY2FzZSBjbGFzcyB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdCBydW5zIGluIGlzb2xhdGlvbiBhbmQgY2FuJ3QgaW50ZXJhY3Qgd2l0aCBvdGhlciBhY3Rpdml0aWVzLgorICAgIFdoZW4gcG9zc2libGUsIHlvdSBzaG91bGQgcnVuIHRoZXNlIHRlc3RzIG9uIGFuIGFjdHVhbCBkZXZpY2UuIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlLCB5b3UgY2FuCisgICAgdXNlIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9lbXVsYXRvci5odG1sIj5BbmRyb2lkIEVtdWxhdG9yPC9hPiB3aXRoCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYXZkLmh0bWwiPkFuZHJvaWQgVmlydHVhbCBEZXZpY2VzPC9hPiBjb25maWd1cmVkIGZvcgorICAgIHRoZSBoYXJkd2FyZSwgc2NyZWVucywgYW5kIHZlcnNpb25zIHlvdSB3YW50IHRvIHRlc3QuCis8L3A+Cis8aDIgaWQ9Ik5leHRTdGVwcyI+TmV4dCBTdGVwczwvaDI+Cis8cD4KKyAgICBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGFuZCBydW4gdGVzdHMgaW4gRWNsaXBzZSwgcGxlYXNlIHJlZmVyIHRvIDxhCisgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+VGVzdGluZyBpbgorICAgIEVjbGlwc2UsIHdpdGggQURUPC9hPi4gSWYgeW91J3JlIG5vdCB3b3JraW5nIGluIEVjbGlwc2UsIHJlZmVyIHRvIDxhCisgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwiPlRlc3RpbmcgaW4gT3RoZXIKKyAgICBJREVzPC9hPi4KIDwvcD4KIDxwPgotICAgIEFzIGEgcnVsZSBvZiB0aHVtYiwgaWYgeW91IHdhbnRlZCB0byB0ZXN0IGFuIGFjdGl2aXR5J3MgaW50ZXJhY3Rpb24gd2l0aCB0aGUgcmVzdCBvZiBBbmRyb2lkLCB5b3Ugd291bGQgdXNlIDxjb2RlPkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPC9jb2RlPi4gSWYgeW91IHdhbnRlZCB0byBkbyByZWdyZXNzaW9uIHRlc3RpbmcKLSAgICBvbiBhbiBhY3Rpdml0eSwgeW91IHdvdWxkIHVzZSA8Y29kZT5BY3Rpdml0eVVuaXRUZXN0Q2FzZTwvY29kZT4uCisgICAgSWYgeW91IHdhbnQgYSBzdGVwLWJ5LXN0ZXAgaW50cm9kdWN0aW9uIHRvIEFuZHJvaWQgdGVzdGluZywgdHJ5IG9uZSBvZiB0aGUKKyAgICB0ZXN0aW5nIHR1dG9yaWFscyBvciBzYW1wbGUgdGVzdCBwYWNrYWdlczoKIDwvcD4KLTxoMyBpZD0iVGVzdHMiPldvcmtpbmcgd2l0aCB0ZXN0IG1ldGhvZHM8L2gzPgotPHA+Ci0gICAgRWFjaCB0ZXN0IGNhc2UgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyB0aGF0IHlvdSB1c2UgdG8gc2V0IHVwIHRoZSB0ZXN0IGVudmlyb25tZW50IGFuZCBjb250cm9sIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBGb3IgZXhhbXBsZSwgYWxsIHRlc3QgY2FzZSBjbGFzc2VzIHByb3ZpZGUgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKSBzZXRVcCgpfQotICAgIG1ldGhvZCB0aGF0IHlvdSBjYW4gb3ZlcnJpZGUgdG8gc2V0IHVwIGZpeHR1cmVzLiBJbiBhZGRpdGlvbiwgeW91IGFkZCBtZXRob2RzIHRvIHRoZSBjbGFzcyB0byBkZWZpbmUgaW5kaXZpZHVhbCB0ZXN0cy4gRWFjaCBtZXRob2QgeW91IGFkZCBpcyBydW4gb25jZSBlYWNoIHRpbWUgeW91IHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbi4gSWYgeW91IG92ZXJyaWRlIHRoZSA8Y29kZT5zZXRVcCgpPC9jb2RlPgotICAgIG1ldGhvZCwgaXQgcnVucyBiZWZvcmUgZWFjaCBvZiB5b3VyIG1ldGhvZHMuIFNpbWlsYXJseSwgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKSB0ZWFyRG93bigpfSBtZXRob2QgaXMgcnVuIG9uY2UgYWZ0ZXIgZWFjaCBvZiB5b3VyIG1ldGhvZHMuCi08L3A+Ci08cD4KLSAgICBUaGUgdGVzdCBjYXNlIGNsYXNzZXMgZ2l2ZSB5b3Ugc3Vic3RhbnRpYWwgY29udHJvbCBvdmVyIHN0YXJ0aW5nIGFuZCBzdG9wcGluZyBjb21wb25lbnRzLiBGb3IgdGhpcyByZWFzb24sIHlvdSBoYXZlIHRvIHNwZWNpZmljYWxseSB0ZWxsIEFuZHJvaWQgdG8gc3RhcnQgYSBjb21wb25lbnQgYmVmb3JlIHlvdSBydW4gdGVzdHMgYWdhaW5zdCBpdC4gRm9yIGV4YW1wbGUsIHlvdSB1c2UgdGhlCi0gICAge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMiNnZXRBY3Rpdml0eSgpfSBtZXRob2QgdG8gc3RhcnQgdGhlIGFjdGl2aXR5IHVuZGVyIHRlc3QuIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBvbmNlIGR1cmluZyB0aGUgZW50aXJlIHRlc3QgY2FzZSwgb3Igb25jZSBmb3IgZWFjaCB0ZXN0IG1ldGhvZC4gWW91IGNhbiBldmVuIGRlc3Ryb3kgdGhlCi0gICAgYWN0aXZpdHkgdW5kZXIgdGVzdCBieSBjYWxsaW5nIGl0cyB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjZmluaXNoKCl9IG1ldGhvZCBhbmQgdGhlbiByZXN0YXJ0IGl0IHdpdGggPGNvZGU+Z2V0QWN0aXZpdHkoKTwvY29kZT4gd2l0aGluIGEgc2luZ2xlIHRlc3QgbWV0aG9kLgotPC9wPgotPGgzIGlkPSJSdW5UZXN0cyI+UnVubmluZyB0ZXN0cyBhbmQgc2VlaW5nIHRoZSByZXN1bHRzPC9oMz4KLTxwPgotICAgIFRvIHJ1biB5b3VyIHRlc3RzLCB5b3UgYnVpbGQgeW91ciB0ZXN0IHByb2plY3QgYW5kIHRoZW4gcnVuIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIHVzaW5nIHRoZSBzeXN0ZW0gdXRpbGl0eSBBY3Rpdml0eSBNYW5hZ2VyIHdpdGggaW5zdHJ1bWVudGF0aW9uLiBZb3UgcHJvdmlkZSB0byBBY3Rpdml0eSBNYW5hZ2VyIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IHJ1bm5lciAodXN1YWxseQotICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0pIHlvdSBzcGVjaWZpZWQgZm9yIHlvdXIgYXBwbGljYXRpb247IHRoZSBuYW1lIGluY2x1ZGVzIGJvdGggeW91ciB0ZXN0IGFwcGxpY2F0aW9uJ3MgcGFja2FnZSBuYW1lIGFuZCB0aGUgdGVzdCBydW5uZXIgY2xhc3MgbmFtZS4gQWN0aXZpdHkgTWFuYWdlciBsb2FkcyBhbmQgc3RhcnRzIHlvdXIKLSAgICB0ZXN0IGFwcGxpY2F0aW9uLCBraWxscyBhbnkgaW5zdGFuY2VzIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCBsb2FkcyBhbiBpbnN0YW5jZSBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBpbnRvIHRoZSBzYW1lIHByb2Nlc3MgYXMgdGhlIHRlc3QgYXBwbGljYXRpb24sIGFuZCB0aGVuIHBhc3NlcyBjb250cm9sIHRvIHRoZSBmaXJzdCB0ZXN0IGNhc2UKLSAgICBjbGFzcyBpbiB5b3VyIHRlc3QgYXBwbGljYXRpb24uIFRoZSB0ZXN0IHJ1bm5lciB0aGVuIHRha2VzIGNvbnRyb2wgb2YgdGhlIHRlc3RzLCBydW5uaW5nIGVhY2ggb2YgeW91ciB0ZXN0IG1ldGhvZHMgYWdhaW5zdCB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCB1bnRpbCBhbGwgdGhlIG1ldGhvZHMgaW4gYWxsIHRoZSBjbGFzc2VzIGhhdmUgYmVlbiBydW4uCi08L3A+Ci08cD4KLSAgICBJZiB5b3UgcnVuIGEgdGVzdCB3aXRoaW4gRWNsaXBzZSB3aXRoIEFEVCwgdGhlIG91dHB1dCBhcHBlYXJzIGluIGEgbmV3IEpVbml0IHZpZXcgcGFuZS4gSWYgeW91IHJ1biBhIHRlc3QgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCB0aGUgb3V0cHV0IGdvZXMgdG8gU1RET1VULgotPC9wPgotPGgyIGlkPSJUZXN0QXJlYXMiPldoYXQgdG8gVGVzdDwvaDI+Ci08cD4KLSAgSW4gYWRkaXRpb24gdG8gdGhlIGZ1bmN0aW9uYWwgYXJlYXMgeW91IHdvdWxkIG5vcm1hbGx5IHRlc3QsIGhlcmUgYXJlIHNvbWUgYXJlYXMKLSAgb2YgQW5kcm9pZCBhcHBsaWNhdGlvbiB0ZXN0aW5nIHRoYXQgeW91IHNob3VsZCBjb25zaWRlcjoKLTwvcD4KLSAgPHVsPgorPHVsPgogICAgIDxsaT4KLSAgICAgIEFjdGl2aXR5IGxpZmVjeWNsZSBldmVudHM6IFlvdSBzaG91bGQgdGVzdCB0aGF0IHlvdXIgYWN0aXZpdGllcyBoYW5kbGUgbGlmZWN5Y2xlIGV2ZW50cyBjb3JyZWN0bHkuIEZvciBleGFtcGxlCi0gICAgICBhbiBhY3Rpdml0eSBzaG91bGQgcmVzcG9uZCB0byBwYXVzZSBvciBkZXN0cm95IGV2ZW50cyBieSBzYXZpbmcgaXRzIHN0YXRlLiBSZW1lbWJlciB0aGF0IGV2ZW4gYSBjaGFuZ2UgaW4gc2NyZWVuIG9yaWVudGF0aW9uCi0gICAgICBjYXVzZXMgdGhlIGN1cnJlbnQgYWN0aXZpdHkgdG8gYmUgZGVzdHJveWVkLCBzbyB5b3Ugc2hvdWxkIHRlc3QgdGhhdCBhY2NpZGVudGFsIGRldmljZSBtb3ZlbWVudHMgZG9uJ3QgYWNjaWRlbnRhbGx5IGxvc2UgdGhlCi0gICAgICBhcHBsaWNhdGlvbiBzdGF0ZS4KKyAgICAgICAgVGhlIDxhCisgICAgICAgIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+SGVsbG8sCisgICAgICAgIFRlc3Rpbmc8L2E+IHR1dG9yaWFsIGludHJvZHVjZXMgYmFzaWMgdGVzdGluZyBjb25jZXB0cyBhbmQgcHJvY2VkdXJlcyBpbiB0aGUKKyAgICAgICAgY29udGV4dCBvZiB0aGUgSGVsbG8sIFdvcmxkIGFwcGxpY2F0aW9uLgogICAgIDwvbGk+CiAgICAgPGxpPgotICAgICAgRGF0YWJhc2Ugb3BlcmF0aW9uczogWW91IHNob3VsZCBlbnN1cmUgdGhhdCBkYXRhYmFzZSBvcGVyYXRpb25zIGNvcnJlY3RseSBoYW5kbGUgY2hhbmdlcyB0byB0aGUgYXBwbGljYXRpb24ncyBzdGF0ZS4KLSAgICAgIFRvIGRvIHRoaXMsIHVzZSBtb2NrIG9iamVjdHMgZnJvbSB0aGUgcGFja2FnZSB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2sgYW5kcm9pZC50ZXN0Lm1vY2t9LgorICAgICAgICBUaGUgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5CisgICAgICAgIFRlc3Rpbmc8L2E+IHR1dG9yaWFsIGlzIGFuIGV4Y2VsbGVudCBmb2xsb3ctdXAgdG8gdGhlIEhlbGxvLCBUZXN0aW5nIHR1dG9yaWFsLgorICAgICAgICBJdCBndWlkZXMgeW91IHRocm91Z2ggYSBtb3JlIGNvbXBsZXggdGVzdGluZyBzY2VuYXJpbyB0aGF0IHlvdSBkZXZlbG9wIGFnYWluc3QgYQorICAgICAgICBtb3JlIHJlYWxpc3RpYyBhcHBsaWNhdGlvbi4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgICAgU2NyZWVuIHNpemVzIGFuZCByZXNvbHV0aW9uczogQmVmb3JlIHlvdSBwdWJsaXNoIHlvdXIgYXBwbGljYXRpb24sIG1ha2Ugc3VyZSB0byB0ZXN0IGl0IG9uIGFsbCBvZiB0aGUKLSAgICAgICAgc2NyZWVuIHNpemVzIGFuZCBkZW5zaXRpZXMgb24gd2hpY2ggeW91IHdhbnQgaXQgdG8gcnVuLiBZb3UgY2FuIHRlc3QgdGhlIGFwcGxpY2F0aW9uIG9uIG11bHRpcGxlIHNpemVzIGFuZCBkZW5zaXRpZXMgdXNpbmcKLSAgICAgICAgQVZEcywgb3IgeW91IGNhbiB0ZXN0IHlvdXIgYXBwbGljYXRpb24gZGlyZWN0bHkgb24gdGhlIGRldmljZXMgdGhhdCB5b3UgYXJlIHRhcmdldGluZy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQotICAgICAgICB0aGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3ByYWN0aWNlcy9zY3JlZW5zX3N1cHBvcnQuaHRtbCI+U3VwcG9ydGluZyBNdWx0aXBsZSBTY3JlZW5zPC9hPi4KKyAgICAgICAgVGhlIHNhbXBsZSB0ZXN0IHBhY2thZ2UKKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL05vdGVQYWRUZXN0Ij5Ob3RlIFBhZCBUZXN0PC9hPiBpcyBhbiBleGFtcGxlIG9mCisgICAgICAgIHRlc3RpbmcgYSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcn0uIEl0IGNvbnRhaW5zIGEgc2V0IG9mIHVuaXQgdGVzdHMgZm9yIHRoZQorICAgICAgICBOb3RlIFBhZCBzYW1wbGUgYXBwbGljYXRpb24ncyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcn0uCiAgICAgPC9saT4KLSAgPC91bD4KLTxwPgotICBXaGVuIHBvc3NpYmxlLCB5b3Ugc2hvdWxkIHJ1biB0aGVzZSB0ZXN0cyBvbiBhbiBhY3R1YWwgZGV2aWNlLiBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgeW91IGNhbgotICB1c2UgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2VtdWxhdG9yLmh0bWwiPkFuZHJvaWQgRW11bGF0b3I8L2E+IHdpdGgKLSAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYXZkLmh0bWwiPkFuZHJvaWQgVmlydHVhbCBEZXZpY2VzPC9hPiBjb25maWd1cmVkIGZvcgotICB0aGUgaGFyZHdhcmUsIHNjcmVlbnMsIGFuZCB2ZXJzaW9ucyB5b3Ugd2FudCB0byB0ZXN0LgotPC9wPgotPGgyIGlkPSJVSVRlc3RpbmciPkFwcGVuZGl4OiBVSSBUZXN0aW5nIE5vdGVzPC9oMj4KLTxwPgotICBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGhhdmUgdGlwcyBmb3IgdGVzdGluZyB0aGUgVUkgb2YgeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9uLCBzcGVjaWZpY2FsbHkKLSAgdG8gaGVscCB5b3UgaGFuZGxlIGFjdGlvbnMgdGhhdCBydW4gaW4gdGhlIFVJIHRocmVhZCwgdG91Y2ggc2NyZWVuIGFuZCBrZXlib2FyZCBldmVudHMsIGFuZCBob21lCi0gIHNjcmVlbiB1bmxvY2sgZHVyaW5nIHRlc3RpbmcuCi08L3A+Ci08aDMgaWQ9IlJ1bk9uVUlUaHJlYWQiPlRlc3Rpbmcgb24gdGhlIFVJIHRocmVhZDwvaDM+Ci08cD4KLSAgQW4gYXBwbGljYXRpb24ncyBhY3Rpdml0aWVzIHJ1biBvbiB0aGUgYXBwbGljYXRpb24ncyA8c3Ryb25nPlVJIHRocmVhZDwvc3Ryb25nPi4gT25jZSB0aGUKLSAgVUkgaXMgaW5zdGFudGlhdGVkLCBmb3IgZXhhbXBsZSBpbiB0aGUgYWN0aXZpdHkncyA8Y29kZT5vbkNyZWF0ZSgpPC9jb2RlPiBtZXRob2QsIHRoZW4gYWxsCi0gIGludGVyYWN0aW9ucyB3aXRoIHRoZSBVSSBtdXN0IHJ1biBpbiB0aGUgVUkgdGhyZWFkLiBXaGVuIHlvdSBydW4gdGhlIGFwcGxpY2F0aW9uIG5vcm1hbGx5LCBpdAotICBoYXMgYWNjZXNzIHRvIHRoZSB0aHJlYWQgYW5kIGRvZXMgbm90IGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KLTwvcD4KLTxwPgotICBUaGlzIGNoYW5nZXMgd2hlbiB5b3UgcnVuIHRlc3RzIGFnYWluc3QgdGhlIGFwcGxpY2F0aW9uLiBXaXRoIGluc3RydW1lbnRhdGlvbi1iYXNlZCBjbGFzc2VzLAotICB5b3UgY2FuIGludm9rZSBtZXRob2RzIGFnYWluc3QgdGhlIFVJIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBUaGUgb3RoZXIgdGVzdCBjbGFzc2VzIGRvbid0IGFsbG93IHRoaXMuCi0gIFRvIHJ1biBhbiBlbnRpcmUgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCwgeW91IGNhbiBhbm5vdGF0ZSB0aGUgdGhyZWFkIHdpdGggPGNvZGU+QFVJVGhyZWFkVGVzdDwvY29kZT4uCi0gIE5vdGljZSB0aGF0IHRoaXMgd2lsbCBydW4gPGVtPmFsbDwvZW0+IG9mIHRoZSBtZXRob2Qgc3RhdGVtZW50cyBvbiB0aGUgVUkgdGhyZWFkLiAgTWV0aG9kcyB0aGF0IGRvIG5vdCBpbnRlcmFjdCB3aXRoIHRoZSBVSQotICBhcmUgbm90IGFsbG93ZWQ7IGZvciBleGFtcGxlLCB5b3UgY2FuJ3QgaW52b2tlIDxjb2RlPkluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTwvY29kZT4uCi08L3A+Ci08cD4KLSAgVG8gcnVuIGEgc3Vic2V0IG9mIGEgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCwgY3JlYXRlIGFuIGFub255bW91cyBjbGFzcyBvZiB0eXBlCi0gIDxjb2RlPlJ1bm5hYmxlPC9jb2RlPiwgcHV0IHRoZSBzdGF0ZW1lbnRzIHlvdSB3YW50IGluIHRoZSA8Y29kZT5ydW4oKTwvY29kZT4gbWV0aG9kLCBhbmQgaW5zdGFudGlhdGUgYSBuZXcKLSAgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBtZXRob2QgPGNvZGU+PGVtPmFwcEFjdGl2aXR5PC9lbT4ucnVuT25VaVRocmVhZCgpPC9jb2RlPiwgd2hlcmUKLSAgPGNvZGU+PGVtPmFwcEFjdGl2aXR5PC9lbT48L2NvZGU+IGlzIHRoZSBpbnN0YW5jZSBvZiB0aGUgYXBwIHlvdSBhcmUgdGVzdGluZy4KLTwvcD4KLTxwPgotICBGb3IgZXhhbXBsZSwgdGhpcyBjb2RlIGluc3RhbnRpYXRlcyBhbiBhY3Rpdml0eSB0byB0ZXN0LCByZXF1ZXN0cyBmb2N1cyAoYSBVSSBhY3Rpb24pIGZvciB0aGUgU3Bpbm5lciBkaXNwbGF5ZWQKLSAgYnkgdGhlIGFjdGl2aXR5LCBhbmQgdGhlbiBzZW5kcyBhIGtleSB0byBpdC4gTm90aWNlIHRoYXQgdGhlIGNhbGxzIHRvIDxjb2RlPndhaXRGb3JJZGxlU3luYzwvY29kZT4gYW5kIDxjb2RlPnNlbmRLZXlzPC9jb2RlPgotICBhcmVuJ3QgYWxsb3dlZCB0byBydW4gb24gdGhlIFVJIHRocmVhZDo8L3A+Ci08cHJlPgotICBwcml2YXRlIE15QWN0aXZpdHkgbUFjdGl2aXR5OyAvLyBNeUFjdGl2aXR5IGlzIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBhcHAgdW5kZXIgdGVzdAotICBwcml2YXRlIFNwaW5uZXIgbVNwaW5uZXI7Ci0KLSAgLi4uCi0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICBtSW5zdHJ1bWVudGF0aW9uID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCk7Ci0KLSAgICAgIG1BY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7IC8vIGdldCBhIHJlZmVyZW5jZXMgdG8gdGhlIGFwcCB1bmRlciB0ZXN0Ci0KLSAgICAgIC8qCi0gICAgICAgKiBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIG1haW4gd2lkZ2V0IG9mIHRoZSBhcHAgdW5kZXIgdGVzdCwgYSBTcGlubmVyCi0gICAgICAgKi8KLSAgICAgIG1TcGlubmVyID0gKFNwaW5uZXIpIG1BY3Rpdml0eS5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuZGVtby5teWFjdGl2aXR5LlIuaWQuU3Bpbm5lcjAxKTsKLQotICAuLi4KLQotICBwdWJsaWMgdm9pZCBhVGVzdCgpIHsKLSAgICAgIC8qCi0gICAgICAgKiByZXF1ZXN0IGZvY3VzIGZvciB0aGUgU3Bpbm5lciwgc28gdGhhdCB0aGUgdGVzdCBjYW4gc2VuZCBrZXkgZXZlbnRzIHRvIGl0Ci0gICAgICAgKiBUaGlzIHJlcXVlc3QgbXVzdCBiZSBydW4gb24gdGhlIFVJIHRocmVhZC4gVG8gZG8gdGhpcywgdXNlIHRoZSBydW5PblVpVGhyZWFkIG1ldGhvZAotICAgICAgICogYW5kIHBhc3MgaXQgYSBSdW5uYWJsZSB0aGF0IGNvbnRhaW5zIGEgY2FsbCB0byByZXF1ZXN0Rm9jdXMgb24gdGhlIFNwaW5uZXIuCi0gICAgICAgKi8KLSAgICAgIG1BY3Rpdml0eS5ydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgIG1TcGlubmVyLnJlcXVlc3RGb2N1cygpOwotICAgICAgICAgIH0KLSAgICAgIH0pOwotCi0gICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwotCi0gICAgICB0aGlzLnNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotPC9wcmU+Ci0KLTxoMyBpZD0iTm90b3VjaE1vZGUiPlR1cm5pbmcgb2ZmIHRvdWNoIG1vZGU8L2gzPgotPHA+Ci0gIFRvIGNvbnRyb2wgdGhlIGVtdWxhdG9yIG9yIGEgZGV2aWNlIHdpdGgga2V5IGV2ZW50cyB5b3Ugc2VuZCBmcm9tIHlvdXIgdGVzdHMsIHlvdSBtdXN0IHR1cm4gb2ZmCi0gIHRvdWNoIG1vZGUuIElmIHlvdSBkbyBub3QgZG8gdGhpcywgdGhlIGtleSBldmVudHMgYXJlIGlnbm9yZWQuCi08L3A+Ci08cD4KLSAgVG8gdHVybiBvZmYgdG91Y2ggbW9kZSwgeW91IGludm9rZSA8Y29kZT5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMi5zZXRBY3Rpdml0eVRvdWNoTW9kZShmYWxzZSk8L2NvZGU+Ci0gIDxlbT5iZWZvcmU8L2VtPiB5b3UgY2FsbCA8Y29kZT5nZXRBY3Rpdml0eSgpPC9jb2RlPiB0byBzdGFydCB0aGUgYWN0aXZpdHkuIFlvdSBtdXN0IGludm9rZSB0aGUgbWV0aG9kIGluIGEgdGVzdCBtZXRob2QKLSAgdGhhdCBpcyA8ZW0+bm90PC9lbT4gcnVubmluZyBvbiB0aGUgVUkgdGhyZWFkLiBGb3IgdGhpcyByZWFzb24sIHlvdSBjYW4ndCBpbnZva2UgdGhlIHRvdWNoIG1vZGUgbWV0aG9kCi0gIGZyb20gYSB0ZXN0IG1ldGhvZCB0aGF0IGlzIGFubm90YXRlZCB3aXRoIDxjb2RlPkBVSVRocmVhZDwvY29kZT4uIEluc3RlYWQsIGludm9rZSB0aGUgdG91Y2ggbW9kZSBtZXRob2QgZnJvbSA8Y29kZT5zZXRVcCgpPC9jb2RlPi4KLTwvcD4KLTxoMyBpZD0iVW5sb2NrRGV2aWNlIj5VbmxvY2tpbmcgdGhlIGVtdWxhdG9yIG9yIGRldmljZTwvaDM+Ci08cD4KLSAgWW91IG1heSBmaW5kIHRoYXQgVUkgdGVzdHMgZG9uJ3Qgd29yayBpZiB0aGUgZW11bGF0b3IncyBvciBkZXZpY2UncyBob21lIHNjcmVlbiBpcyBkaXNhYmxlZCB3aXRoIHRoZSBrZXlndWFyZCBwYXR0ZXJuLgotICBUaGlzIGlzIGJlY2F1c2UgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgY2FuJ3QgcmVjZWl2ZSBrZXkgZXZlbnRzIHNlbnQgYnkgPGNvZGU+c2VuZEtleXMoKTwvY29kZT4uIFRoZSBiZXN0Ci0gIHdheSB0byBhdm9pZCB0aGlzIGlzIHRvIHN0YXJ0IHlvdXIgZW11bGF0b3Igb3IgZGV2aWNlIGZpcnN0IGFuZCB0aGVuIGRpc2FibGUgdGhlIGtleWd1YXJkIGZvciB0aGUgaG9tZSBzY3JlZW4uCi08L3A+Ci08cD4KLSAgWW91IGNhbiBhbHNvIGV4cGxpY2l0bHkgZGlzYWJsZSB0aGUga2V5Z3VhcmQuIFRvIGRvIHRoaXMsCi0gIHlvdSBuZWVkIHRvIGFkZCBhIHBlcm1pc3Npb24gaW4gdGhlIG1hbmlmZXN0IGZpbGUgKDxjb2RlPkFuZHJvaWRNYW5pZmVzdC54bWw8L2NvZGU+KSBhbmQKLSAgdGhlbiBkaXNhYmxlIHRoZSBrZXlndWFyZCBpbiB5b3VyIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIE5vdGUsIHRob3VnaCwgdGhhdCB5b3UgZWl0aGVyIGhhdmUgdG8gcmVtb3ZlIHRoaXMgYmVmb3JlCi0gIHlvdSBwdWJsaXNoIHlvdXIgYXBwbGljYXRpb24sIG9yIHlvdSBoYXZlIHRvIGRpc2FibGUgaXQgcHJvZ3JhbW1hdGljYWxseSBpbiB0aGUgcHVibGlzaGVkIGFwcC4KLTwvcD4KLTxwPgotICBUbyBhZGQgdGhlIHRoZSBwZXJtaXNzaW9uLCBhZGQgdGhlIGVsZW1lbnQgPGNvZGU+Jmx0O3VzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ESVNBQkxFX0tFWUdVQVJEIi8mZ3Q7PC9jb2RlPgotICBhcyBhIGNoaWxkIG9mIHRoZSA8Y29kZT4mbHQ7bWFuaWZlc3QmZ3Q7PC9jb2RlPiBlbGVtZW50LiBUbyBkaXNhYmxlIHRoZSBLZXlHdWFyZCwgYWRkIHRoZSBmb2xsb3dpbmcgY29kZQotICB0byB0aGUgPGNvZGU+b25DcmVhdGUoKTwvY29kZT4gbWV0aG9kIG9mIGFjdGl2aXRpZXMgeW91IGludGVuZCB0byB0ZXN0OgotPC9wPgotPHByZT4KLSAgbUtleUd1YXJkTWFuYWdlciA9IChLZXlndWFyZE1hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoS0VZR1VBUkRfU0VSVklDRSk7Ci0gIG1Mb2NrID0gbUtleUd1YXJkTWFuYWdlci5uZXdLZXlndWFyZExvY2soIjxlbT5hY3Rpdml0eV9jbGFzc25hbWU8L2VtPiIpOwotICBtTG9jay5kaXNhYmxlS2V5Z3VhcmQoKTsKLTwvcHJlPgotPHA+d2hlcmUgPGNvZGU+PGVtPmFjdGl2aXR5X2NsYXNzbmFtZTwvZW0+PC9jb2RlPiBpcyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgYWN0aXZpdHkuPC9wPgotPGgzIGlkPSJVSVRlc3RUcm91Ymxlc2hvb3RpbmciPlRyb3VibGVzaG9vdGluZyBVSSB0ZXN0czwvaDM+Ci08cD4KLSAgVGhpcyBzZWN0aW9uIGxpc3RzIHNvbWUgb2YgdGhlIGNvbW1vbiB0ZXN0IGZhaWx1cmVzIHlvdSBtYXkgZW5jb3VudGVyIGluIFVJIHRlc3RpbmcsIGFuZCB0aGVpciBjYXVzZXM6Ci08L3A+Ci08ZGw+Ci0gICAgPGR0Pjxjb2RlPldyb25nVGhyZWFkRXhjZXB0aW9uPC9jb2RlPjwvZHQ+Ci0gICAgPGRkPgotICAgICAgPHA+PHN0cm9uZz5Qcm9ibGVtOjwvc3Ryb25nPjwvcD4KLSAgICAgIEZvciBhIGZhaWxlZCB0ZXN0LCB0aGUgRmFpbHVyZSBUcmFjZSBjb250YWlucyB0aGUgZm9sbG93aW5nIGVycm9yIG1lc3NhZ2U6Ci0gICAgICA8Y29kZT4KLSAgICAgICAgYW5kcm9pZC52aWV3LlZpZXdSb290JENhbGxlZEZyb21Xcm9uZ1RocmVhZEV4Y2VwdGlvbjogT25seSB0aGUgb3JpZ2luYWwgdGhyZWFkIHRoYXQgY3JlYXRlZCBhIHZpZXcgaGllcmFyY2h5IGNhbiB0b3VjaCBpdHMgdmlld3MuCi0gICAgICA8L2NvZGU+Ci0gICAgICA8cD48c3Ryb25nPlByb2JhYmxlIENhdXNlOjwvc3Ryb25nPjwvcD4KLSAgICAgICAgVGhpcyBlcnJvciBpcyBjb21tb24gaWYgeW91IHRyaWVkIHRvIHNlbmQgVUkgZXZlbnRzIHRvIHRoZSBVSSB0aHJlYWQgZnJvbSBvdXRzaWRlIHRoZSBVSSB0aHJlYWQuIFRoaXMgY29tbW9ubHkgaGFwcGVucyBpZiB5b3Ugc2VuZCBVSSBldmVudHMKLSAgICAgICAgZnJvbSB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgYnV0IHlvdSBkb24ndCB1c2UgdGhlIDxjb2RlPkBVSVRocmVhZDwvY29kZT4gYW5ub3RhdGlvbiBvciB0aGUgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPiBtZXRob2QuIFRoZSB0ZXN0IG1ldGhvZCB0cmllZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBVSSBvdXRzaWRlIHRoZSBVSSB0aHJlYWQuCi0gICAgICA8cD48c3Ryb25nPlN1Z2dlc3RlZCBSZXNvbHV0aW9uOjwvc3Ryb25nPjwvcD4KLSAgICAgICAgUnVuIHRoZSBpbnRlcmFjdGlvbiBvbiB0aGUgVUkgdGhyZWFkLiBVc2UgYSB0ZXN0IGNsYXNzIHRoYXQgcHJvdmlkZXMgaW5zdHJ1bWVudGF0aW9uLiBTZWUgdGhlIHByZXZpb3VzIHNlY3Rpb24gPGEgaHJlZj0iI1J1bk9uVUlUaHJlYWQiPlRlc3Rpbmcgb24gdGhlIFVJIFRocmVhZDwvYT4KLSAgICAgICAgZm9yIG1vcmUgZGV0YWlscy4KLSAgICA8L2RkPgotICAgIDxkdD48Y29kZT5qYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjwvY29kZT48L2R0PgotICAgIDxkZD4KLSAgICAgIDxwPjxzdHJvbmc+UHJvYmxlbTo8L3N0cm9uZz48L3A+Ci0gICAgICBGb3IgYSBmYWlsZWQgdGVzdCwgdGhlIEZhaWx1cmUgVHJhY2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlOgotICAgICAgPGNvZGU+Ci0gICAgICAgIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uOiBUaGlzIG1ldGhvZCBjYW4gbm90IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIGFwcGxpY2F0aW9uIHRocmVhZAotICAgICAgPC9jb2RlPgotICAgICAgPHA+PHN0cm9uZz5Qcm9iYWJsZSBDYXVzZTo8L3N0cm9uZz48L3A+Ci0gICAgICAgIFRoaXMgZXJyb3IgaXMgY29tbW9uIGlmIHlvdXIgdGVzdCBtZXRob2QgaXMgYW5ub3RhdGVkIHdpdGggPGNvZGU+QFVpVGhyZWFkVGVzdDwvY29kZT4gYnV0IHRoZW4gdHJpZXMgdG8KLSAgICAgICAgZG8gc29tZXRoaW5nIG91dHNpZGUgdGhlIFVJIHRocmVhZCBvciB0cmllcyB0byBpbnZva2UgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPi4KLSAgICAgIDxwPjxzdHJvbmc+U3VnZ2VzdGVkIFJlc29sdXRpb246PC9zdHJvbmc+PC9wPgotICAgICAgICBSZW1vdmUgdGhlIDxjb2RlPkBVaVRocmVhZFRlc3Q8L2NvZGU+IGFubm90YXRpb24sIHJlbW92ZSB0aGUgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPiBjYWxsLCBvciByZS1mYWN0b3IgeW91ciB0ZXN0cy4KLSAgICA8L2RkPgotPC9kbD4KKyAgICA8bGk+CisgICAgICAgIFRoZSBzYW1wbGUgdGVzdCBwYWNrYWdlIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9BbGFybVNlcnZpY2VUZXN0In0+CisgICAgICAgIEFsYXJtIFNlcnZpY2UgVGVzdDwvYT4gaXMgYW4gZXhhbXBsZSBvZiB0ZXN0aW5nIGEge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2V9LiBJdCBjb250YWlucworICAgICAgICBhIHNldCBvZiB1bml0IHRlc3RzIGZvciB0aGUgQWxhcm0gU2VydmljZSBzYW1wbGUgYXBwbGljYXRpb24ncyB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZX0uCisgICAgPC9saT4KKzwvdWw+CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy93aGF0X3RvX3Rlc3QuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3Rpbmcvd2hhdF90b190ZXN0LmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMzUzOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3Rpbmcvd2hhdF90b190ZXN0LmpkCkBAIC0wLDAgKzEsODQgQEAKK3BhZ2UudGl0bGU9V2hhdCBUbyBUZXN0CitAamQ6Ym9keQorPHA+CisgICAgQXMgeW91IGRldmVsb3AgQW5kcm9pZCBhcHBsaWNhdGlvbnMsIGtub3dpbmcgd2hhdCB0byB0ZXN0IGlzIGFzIGltcG9ydGFudCBhcyBrbm93aW5nIGhvdyB0bworICAgIHRlc3QuIFRoaXMgZG9jdW1lbnQgbGlzdHMgc29tZSBtb3N0IGNvbW1vbiBBbmRyb2lkLXJlbGF0ZWQgc2l0dWF0aW9ucyB0aGF0IHlvdSBzaG91bGQgY29uc2lkZXIKKyAgICB3aGVuIHlvdSB0ZXN0LCBldmVuIGF0IHRoZSB1bml0IHRlc3QgbGV2ZWwuIFRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCwgYW5kIHlvdSBjb25zdWx0IHRoZQorICAgIGRvY3VtZW50YXRpb24gZm9yIHRoZSBmZWF0dXJlcyB0aGF0IHlvdSB1c2UgZm9yIG1vcmUgaWRlYXMuIFRoZQorICAgIDxhIGhyZWY9Imh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9hbmRyb2lkLWRldmVsb3BlcnMiPmFuZHJvaWQtZGV2ZWxvcGVyczwvYT4gR29vZ2xlIEdyb3VwcworICAgIHNpdGUgaXMgYW5vdGhlciByZXNvdXJjZSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGVzdGluZy4KKzwvcD4KKzxoMiBpZD0iVGVzdHMiPklkZWFzIGZvciBUZXN0aW5nPC9oMj4KKzxwPgorICAgIFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgYXJlIG9yZ2FuaXplZCBieSBiZWhhdmlvcnMgb3Igc2l0dWF0aW9ucyB0aGF0IHlvdSBzaG91bGQgdGVzdC4gRWFjaAorICAgIHNlY3Rpb24gY29udGFpbnMgYSBzY2VuYXJpbyB0aGF0IGZ1cnRoZXIgaWxsdXN0cmF0ZXMgdGhlIHNpdHVhdGlvbiBhbmQgdGhlIHRlc3Qgb3IgdGVzdHMgeW91CisgICAgc2hvdWxkIGRvLgorPC9wPgorPGg0PkNoYW5nZSBpbiBvcmllbnRhdGlvbjwvaDQ+Cis8cD4KKyAgICBGb3IgZGV2aWNlcyB0aGF0IHN1cHBvcnQgbXVsdGlwbGUgb3JpZW50YXRpb25zLCBBbmRyb2lkIGRldGVjdHMgYSBjaGFuZ2UgaW4gb3JpZW50YXRpb24gd2hlbgorICAgIHRoZSB1c2VyIHR1cm5zIHRoZSBkZXZpY2Ugc28gdGhhdCB0aGUgZGlzcGxheSBpcyAibGFuZHNjYXBlIiAobG9uZyBlZGdlIGlzIGhvcml6b250YWwpIGluc3RlYWQKKyAgICBvZiAicG9ydHJhaXQiIChsb25nIGVkZ2UgaXMgdmVydGljYWwpLgorPC9wPgorPHA+CisgICAgV2hlbiBBbmRyb2lkIGRldGVjdHMgYSBjaGFuZ2UgaW4gb3JpZW50YXRpb24sIGl0cyBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRlc3Ryb3kgYW5kIHRoZW4KKyAgICByZS1zdGFydCB0aGUgZm9yZWdyb3VuZCBBY3Rpdml0eS4gWW91IHNob3VsZCBjb25zaWRlciB0ZXN0aW5nIHRoZSBmb2xsb3dpbmc6Cis8L3A+Cis8dWw+CisgICAgPGxpPgorICAgICAgICBJcyB0aGUgc2NyZWVuIHJlLWRyYXduIGNvcnJlY3RseT8gQW55IGN1c3RvbSBVSSBjb2RlIHlvdSBoYXZlIHNob3VsZCBoYW5kbGUgY2hhbmdlcyBpbiB0aGUKKyAgICAgICAgb3JpZW50YXRpb24uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIERvZXMgdGhlIGFwcGxpY2F0aW9uIG1haW50YWluIGl0cyBzdGF0ZT8gVGhlIEFjdGl2aXR5IHNob3VsZCBub3QgbG9zZSBhbnl0aGluZyB0aGF0IHRoZQorICAgICAgICB1c2VyIGhhcyBhbHJlYWR5IGVudGVyZWQgaW50byB0aGUgVUkuIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbm90ICJmb3JnZXQiIGl0cyBwbGFjZSBpbiB0aGUKKyAgICAgICAgY3VycmVudCB0cmFuc2FjdGlvbi4KKyAgICA8L2xpPgorPC91bD4KKzxoND5DaGFuZ2UgaW4gY29uZmlndXJhdGlvbjwvaDQ+Cis8cD4KKyAgICBBIHNpdHVhdGlvbiB0aGF0IGlzIG1vcmUgZ2VuZXJhbCB0aGFuIGEgY2hhbmdlIGluIG9yaWVudGF0aW9uIGlzIGEgY2hhbmdlIGluIHRoZSBkZXZpY2UncworICAgIGNvbmZpZ3VyYXRpb24sIHN1Y2ggYXMgYSBjaGFuZ2UgaW4gdGhlIGF2YWlsYWJpbGl0eSBvZiBhIGtleWJvYXJkIG9yIGEgY2hhbmdlIGluIHN5c3RlbQorICAgIGxhbmd1YWdlLgorPC9wPgorPHA+CisgICAgQSBjaGFuZ2UgaW4gY29uZmlndXJhdGlvbiBhbHNvIHRyaWdnZXJzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGRlc3Ryb3lpbmcgYW5kIHRoZW4gcmVzdGFydGluZworICAgIHRoZSBmb3JlZ3JvdW5kIEFjdGl2aXR5LiBCZXNpZGVzIHRlc3RpbmcgdGhhdCB0aGUgYXBwbGljYXRpb24gbWFpbnRhaW5zIHRoZSBVSSBhbmQgaXRzCisgICAgdHJhbnNhY3Rpb24gc3RhdGUsIHlvdSBzaG91bGQgYWxzbyB0ZXN0IHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVwZGF0ZXMgaXRzZWxmIHRvIHJlc3BvbmQKKyAgICBjb3JyZWN0bHkgdG8gdGhlIG5ldyBjb25maWd1cmF0aW9uLgorPC9wPgorPGg0PkJhdHRlcnkgbGlmZTwvaDQ+Cis8cD4KKyAgICBNb2JpbGUgZGV2aWNlcyBwcmltYXJpbHkgcnVuIG9uIGJhdHRlcnkgcG93ZXIuIEEgZGV2aWNlIGhhcyBmaW5pdGUgImJhdHRlcnkgYnVkZ2V0IiwgYW5kIHdoZW4gaXQKKyAgICBpcyBnb25lLCB0aGUgZGV2aWNlIGlzIHVzZWxlc3MgdW50aWwgaXQgaXMgcmVjaGFyZ2VkLiBZb3UgbmVlZCB0byB3cml0ZSB5b3VyIGFwcGxpY2F0aW9uIHRvCisgICAgbWluaW1pemUgYmF0dGVyeSB1c2FnZSwgeW91IG5lZWQgdG8gdGVzdCBpdHMgYmF0dGVyeSBwZXJmb3JtYW5jZSwgYW5kIHlvdSBuZWVkIHRvIHRlc3QgdGhlCisgICAgbWV0aG9kcyB0aGF0IG1hbmFnZSBiYXR0ZXJ5IHVzYWdlLgorPC9wPgorPHA+CisgICAgVGVjaG5pcXVlcyBmb3IgbWluaW1pemluZyBiYXR0ZXJ5IHVzYWdlIHdlcmUgcHJlc2VudGVkIGF0IHRoZSAyMDEwIEdvb2dsZSBJL08gY29uZmVyZW5jZSBpbiB0aGUKKyAgICBwcmVzZW50YXRpb24KKyAgICA8YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL2V2ZW50cy9pby8yMDA5L3Nlc3Npb25zL0NvZGluZ0xpZmVCYXR0ZXJ5TGlmZS5odG1sIj4KKyAgICBDb2RpbmcgZm9yIExpZmUgLS0gQmF0dGVyeSBMaWZlLCBUaGF0IElzPC9hPi4gVGhpcyBwcmVzZW50YXRpb24gZGVzY3JpYmVzIHRoZSBpbXBhY3Qgb24gYmF0dGVyeQorICAgIGxpZmUgb2YgdmFyaW91cyBvcGVyYXRpb25zLCBhbmQgdGhlIHdheXMgeW91IGNhbiBkZXNpZ24geW91ciBhcHBsaWNhdGlvbiB0byBtaW5pbWl6ZSB0aGVzZQorICAgIGltcGFjdHMuIFdoZW4geW91IGNvZGUgeW91ciBhcHBsaWNhdGlvbiB0byByZWR1Y2UgYmF0dGVyeSB1c2FnZSwgeW91IGFsc28gd3JpdGUgdGhlCisgICAgYXBwcm9wcmlhdGUgdW5pdCB0ZXN0cy4KKzwvcD4KKzxoND5EZXBlbmRlbmNlIG9uIGV4dGVybmFsIHJlc291cmNlczwvaDQ+Cis8cD4KKyAgICBJZiB5b3VyIGFwcGxpY2F0aW9uIGRlcGVuZHMgb24gbmV0d29yayBhY2Nlc3MsIFNNUywgQmx1ZXRvb3RoLCBvciBHUFMsIHRoZW4geW91IHNob3VsZAorICAgIHRlc3Qgd2hhdCBoYXBwZW5zIHdoZW4gdGhlIHJlc291cmNlIG9yIHJlc291cmNlcyBhcmUgbm90IGF2YWlsYWJsZS4KKzwvcD4KKzxwPgorICAgIEZvciBleGFtcGxlLCBpZiB5b3VyIGFwcGxpY2F0aW9uIHVzZXMgdGhlIG5ldHdvcmssaXQgY2FuIG5vdGlmeSB0aGUgdXNlciBpZiBhY2Nlc3MgaXMKKyAgICB1bmF2YWlsYWJsZSwgb3IgZGlzYWJsZSBuZXR3b3JrLXJlbGF0ZWQgZmVhdHVyZXMsIG9yIGRvIGJvdGguIEZvciBHUFMsIGl0IGNhbiBzd2l0Y2ggdG8KKyAgICBJUC1iYXNlZCBsb2NhdGlvbiBhd2FyZW5lc3MuIEl0IGNhbiBhbHNvIHdhaXQgZm9yIFdpRmkgYWNjZXNzIGJlZm9yZSBkb2luZyBsYXJnZSBkYXRhIHRyYW5zZmVycywKKyAgICBzaW5jZSBXaUZpIHRyYW5zZmVycyBtYXhpbWl6ZSBiYXR0ZXJ5IHVzYWdlIGNvbXBhcmVkIHRvIHRyYW5zZmVycyBvdmVyIDNHIG9yIEVER0UuCis8L3A+Cis8cD4KKyAgICBZb3UgY2FuIHVzZSB0aGUgZW11bGF0b3IgdG8gdGVzdCBuZXR3b3JrIGFjY2VzcyBhbmQgYmFuZHdpZHRoLiBUbyBsZWFybiBtb3JlLCBwbGVhc2Ugc2VlCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvZW11bGF0b3IuaHRtbCNuZXRzcGVlZCI+TmV0d29yayBTcGVlZCBFbXVsYXRpb248L2E+LgorICAgIFRvIHRlc3QgR1BTLCB5b3UgY2FuIHVzZSB0aGUgZW11bGF0b3IgY29uc29sZSBhbmQge0BsaW5rIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyfS4gVG8KKyAgICBsZWFybiBtb3JlIGFib3V0IHRoZSBlbXVsYXRvciBjb25zb2xlLCBwbGVhc2Ugc2VlCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fS9ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2VtdWxhdG9yLmh0bWwjY29uc29sZSI+CisgICAgVXNpbmcgdGhlIEVtdWxhdG9yIENvbnNvbGU8L2E+LgorPC9wPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy91aS9kaWFsb2dzLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy91aS9kaWFsb2dzLmpkCmluZGV4IDFhOTk3ZjkuLjg3OWViOGIgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdWkvZGlhbG9ncy5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3VpL2RpYWxvZ3MuamQKQEAgLTQ3MywxOCArNDczLDI1IEBACiAgICAgICAgICAgICBwcm9ncmVzc0RpYWxvZyA9IG5ldyBQcm9ncmVzc0RpYWxvZyhOb3RpZmljYXRpb25UZXN0LnRoaXMpOwogICAgICAgICAgICAgcHJvZ3Jlc3NEaWFsb2cuc2V0UHJvZ3Jlc3NTdHlsZShQcm9ncmVzc0RpYWxvZy5TVFlMRV9IT1JJWk9OVEFMKTsKICAgICAgICAgICAgIHByb2dyZXNzRGlhbG9nLnNldE1lc3NhZ2UoIkxvYWRpbmcuLi4iKTsKLSAgICAgICAgICAgIHByb2dyZXNzVGhyZWFkID0gbmV3IFByb2dyZXNzVGhyZWFkKGhhbmRsZXIpOwotICAgICAgICAgICAgcHJvZ3Jlc3NUaHJlYWQuc3RhcnQoKTsKICAgICAgICAgICAgIHJldHVybiBwcm9ncmVzc0RpYWxvZzsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQogCisgICAgJiM2NDtPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlcGFyZURpYWxvZyhpbnQgaWQsIERpYWxvZyBkaWFsb2cpIHsKKyAgICAgICAgc3dpdGNoKGlkKSB7CisgICAgICAgIGNhc2UgUFJPR1JFU1NfRElBTE9HOgorICAgICAgICAgICAgcHJvZ3Jlc3NEaWFsb2cuc2V0UHJvZ3Jlc3MoMCk7CisgICAgICAgICAgICBwcm9ncmVzc1RocmVhZCA9IG5ldyBQcm9ncmVzc1RocmVhZChoYW5kbGVyKTsKKyAgICAgICAgICAgIHByb2dyZXNzVGhyZWFkLnN0YXJ0KCk7CisgICAgfQorCiAgICAgLy8gRGVmaW5lIHRoZSBIYW5kbGVyIHRoYXQgcmVjZWl2ZXMgbWVzc2FnZXMgZnJvbSB0aGUgdGhyZWFkIGFuZCB1cGRhdGUgdGhlIHByb2dyZXNzCiAgICAgZmluYWwgSGFuZGxlciBoYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CiAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIGludCB0b3RhbCA9IG1zZy5nZXREYXRhKCkuZ2V0SW50KCJ0b3RhbCIpOworICAgICAgICAgICAgaW50IHRvdGFsID0gbXNnLmFyZzE7CiAgICAgICAgICAgICBwcm9ncmVzc0RpYWxvZy5zZXRQcm9ncmVzcyh0b3RhbCk7CiAgICAgICAgICAgICBpZiAodG90YWwgPj0gMTAwKXsKICAgICAgICAgICAgICAgICBkaXNtaXNzRGlhbG9nKFBST0dSRVNTX0RJQUxPRyk7CkBAIC01MTUsOSArNTIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgTG9nLmUoIkVSUk9SIiwgIlRocmVhZCBJbnRlcnJ1cHRlZCIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBCdW5kbGUgYiA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgICAgICBiLnB1dEludCgidG90YWwiLCB0b3RhbCk7Ci0gICAgICAgICAgICAgICAgbXNnLnNldERhdGEoYik7CisgICAgICAgICAgICAgICAgbXNnLmFyZzEgPSB0b3RhbDsKICAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwogICAgICAgICAgICAgICAgIHRvdGFsKys7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdHV0b3JpYWxzL25vdGVwYWQvbm90ZXBhZC1leDIuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdHV0b3JpYWxzL25vdGVwYWQvbm90ZXBhZC1leDIuamQKaW5kZXggYTk0NWE2Mi4uODU0NzMxZiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3R1dG9yaWFscy9ub3RlcGFkL25vdGVwYWQtZXgyLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90dXRvcmlhbHMvbm90ZXBhZC9ub3RlcGFkLWV4Mi5qZApAQCAtODcsOCArODcsOCBAQAogICAgIG1lbnUgY2FsbGJhY2sgdXNlZCBmb3IgdGhlIG9wdGlvbnMgbWVudS4gSGVyZSwgd2UgYWRkIGp1c3Qgb25lIGxpbmUsIHdoaWNoIHdpbGwgYWRkIGEgbWVudSBpdGVtCiAgICAgdG8gZGVsZXRlIGEgbm90ZS4gQ2FsbCA8Y29kZT5tZW51LmFkZCgpPC9jb2RlPiBsaWtlIHNvOgogICAgICAgPHByZT4KLXB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQ29udGV4dE1lbnUoTWVudSBtZW51LCBWaWV3IHYKLSAgICAgICAgQ29udGV4dE1lbnVJbmZvIG1lbnVJbmZvKSB7CitwdWJsaWMgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KE1lbnUgbWVudSwgVmlldyB2LAorICAgICAgICBDb250ZXh0TWVudS5Db250ZXh0TWVudUluZm8gbWVudUluZm8pIHsKICAgICBzdXBlci5vbkNyZWF0ZUNvbnRleHRNZW51KG1lbnUsIHYsIG1lbnVJbmZvKTsKICAgICBtZW51LmFkZCgwLCBERUxFVEVfSUQsIDAsIFIuc3RyaW5nLm1lbnVfZGVsZXRlKTsKIH08L3ByZT4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9pbWFnZXMvZnVuZGFtZW50YWxzL2RpYWdyYW1fYmFja3N0YWNrLnBuZyBiL2RvY3MvaHRtbC9pbWFnZXMvZnVuZGFtZW50YWxzL2RpYWdyYW1fYmFja3N0YWNrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzZlMzNmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2ltYWdlcy9mdW5kYW1lbnRhbHMvZGlhZ3JhbV9iYWNrc3RhY2sucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9pbWFnZXMvZnVuZGFtZW50YWxzL2RpYWdyYW1fYmFja3N0YWNrX3NpbmdsZXRhc2tfbXVsdGlhY3Rpdml0eS5wbmcgYi9kb2NzL2h0bWwvaW1hZ2VzL2Z1bmRhbWVudGFscy9kaWFncmFtX2JhY2tzdGFja19zaW5nbGV0YXNrX211bHRpYWN0aXZpdHkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YTIxZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvaW1hZ2VzL2Z1bmRhbWVudGFscy9kaWFncmFtX2JhY2tzdGFja19zaW5nbGV0YXNrX211bHRpYWN0aXZpdHkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9pbWFnZXMvZnVuZGFtZW50YWxzL2RpYWdyYW1fbXVsdGlwbGVfaW5zdGFuY2VzLnBuZyBiL2RvY3MvaHRtbC9pbWFnZXMvZnVuZGFtZW50YWxzL2RpYWdyYW1fbXVsdGlwbGVfaW5zdGFuY2VzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODBlNzc4OAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9pbWFnZXMvZnVuZGFtZW50YWxzL2RpYWdyYW1fbXVsdGlwbGVfaW5zdGFuY2VzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvaW1hZ2VzL2Z1bmRhbWVudGFscy9kaWFncmFtX211bHRpdGFza2luZy5wbmcgYi9kb2NzL2h0bWwvaW1hZ2VzL2Z1bmRhbWVudGFscy9kaWFncmFtX211bHRpdGFza2luZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjN2I0NQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9pbWFnZXMvZnVuZGFtZW50YWxzL2RpYWdyYW1fbXVsdGl0YXNraW5nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvaW1hZ2VzL2Z1bmRhbWVudGFscy9yZXN0b3JlX2luc3RhbmNlLnBuZyBiL2RvY3MvaHRtbC9pbWFnZXMvZnVuZGFtZW50YWxzL3Jlc3RvcmVfaW5zdGFuY2UucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNDI4YTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvaW1hZ2VzL2Z1bmRhbWVudGFscy9yZXN0b3JlX2luc3RhbmNlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvaW1hZ2VzL3Rlc3RpbmcvYW5kcm9pZF90ZXN0X2ZyYW1ld29yay5wbmcgYi9kb2NzL2h0bWwvaW1hZ2VzL3Rlc3RpbmcvYW5kcm9pZF90ZXN0X2ZyYW1ld29yay5wbmcKaW5kZXggNmY4MDUzMC4uNDU5OTc1YyAxMDA3NTUKLS0tIGEvZG9jcy9odG1sL2ltYWdlcy90ZXN0aW5nL2FuZHJvaWRfdGVzdF9mcmFtZXdvcmsucG5nCisrKyBiL2RvY3MvaHRtbC9pbWFnZXMvdGVzdGluZy9hbmRyb2lkX3Rlc3RfZnJhbWV3b3JrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvaW1hZ2VzL3Rlc3RpbmcvZWNsaXBzZV90ZXN0X3Jlc3VsdHMucG5nIGIvZG9jcy9odG1sL2ltYWdlcy90ZXN0aW5nL2VjbGlwc2VfdGVzdF9yZXN1bHRzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDVlMTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2ltYWdlcy90ZXN0aW5nL2VjbGlwc2VfdGVzdF9yZXN1bHRzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvaW1hZ2VzL3Rlc3RpbmcvZWNsaXBzZV90ZXN0X3J1bl9mYWlsdXJlLnBuZyBiL2RvY3MvaHRtbC9pbWFnZXMvdGVzdGluZy9lY2xpcHNlX3Rlc3RfcnVuX2ZhaWx1cmUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMTExMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvaW1hZ2VzL3Rlc3RpbmcvZWNsaXBzZV90ZXN0X3J1bl9mYWlsdXJlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvaW1hZ2VzL3Rlc3RpbmcvdGVzdF9mcmFtZXdvcmsucG5nIGIvZG9jcy9odG1sL2ltYWdlcy90ZXN0aW5nL3Rlc3RfZnJhbWV3b3JrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM1ZmMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2ltYWdlcy90ZXN0aW5nL3Rlc3RfZnJhbWV3b3JrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2Jyb3dzZXIuamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2Jyb3dzZXIuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwODc2OQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYnJvd3Nlci5qZApAQCAtMCwwICsxLDQ5IEBACitwYWdlLnRpdGxlPVRlY2huaWNhbCBSZXNvdXJjZXMKK0BqZDpib2R5CisKKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgIHtAbGl0ZXJhbCBAaW1wb3J0fSAie0Bkb2NSb290fWFzc2V0cy9hbmRyb2lkLWRldmVsb3Blci1yZXNvdXJjZS1icm93c2VyLmNzcyI7Cis8L3N0eWxlPgorCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2FuZHJvaWQtZGV2ZWxvcGVyLXJlc291cmNlLWJyb3dzZXIuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9taWNyb3RlbXBsYXRlLmpzIj48L3NjcmlwdD4KKworPGRpdj4KKyAgPHAgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IGZsb2F0OiByaWdodCI+RmlsdGVyOiA8aW5wdXQgaWQ9InJlc291cmNlLWJyb3dzZXIta2V5d29yZC1maWx0ZXIiLz48L3A+CisgIDxwIGlkPSJyZXNvdXJjZS1icm93c2VyLXNlYXJjaC1wYXJhbXMiPlNob3dpbmcgYWxsIHRlY2huaWNhbCByZXNvdXJjZXM6PC9wPgorPC9kaXY+CisKKzxub3NjcmlwdD4KKyAgPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+RXJyb3I6PC9zdHJvbmc+CisgICAgWW91IG11c3QgaGF2ZSBKYXZhU2NyaXB0IGVuYWJsZWQgdG8gdmlldyB0aGlzIHBhZ2UuIFJlc291cmNlcyBhcmUgYWxzbworICAgIGF2YWlsYWJsZSBvZmZsaW5lIGluIHRoZSBTREsuCisgIDwvcD4KKzwvbm9zY3JpcHQ+CisKKzxkaXYgaWQ9InJlc291cmNlLWJyb3dzZXItcmVzdWx0cyI+CisgIDxkaXYgY2xhc3M9Im5vLXJlc3VsdHMiPk5vIHJlc3VsdHMuPC9kaXY+Cis8L2Rpdj4KKworPHNjcmlwdCB0eXBlPSJ0ZXh0L2h0bWwiIGlkPSJ0bXBsX3Jlc291cmNlX2Jyb3dzZXJfcmVzdWx0Ij4KKzxkaXYgY2xhc3M9InJlc3VsdCI+CisgIDxoMz4KKyAgICA8JSBpZiAoJ2V4dGVybmFsJyBpbiB0YWdzSGFzaCkgeyAlPjxzdHJvbmc+RXh0ZXJuYWw6IDwvc3Ryb25nPiA8JSB9ICU+CisgICAgPGEgaHJlZj0iPCU9IHBhdGggJT4iPjwlPSB0aXRsZS5lbiAlPjwvYT4KKyAgICA8JSBpZiAoJ25ldycgaW4gdGFnc0hhc2gpIHsgJT48c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPiA8JSB9ICU+CisgIDwvaDM+CisgIDxwIGNsYXNzPSJyZXNvdXJjZS1tZXRhIj48JQorICAgIHZhciBfX2cgPSBbJycsICcnXTsKKyAgICBpZiAoJ2FydGljbGUnIGluIHRhZ3NIYXNoKSB7CisgICAgICBfX2cgPSBbJ0FydGljbGUnLCAnYWJvdXQnXTsKKyAgICB9IGVsc2UgaWYgKCd0dXRvcmlhbCcgaW4gdGFnc0hhc2gpIHsKKyAgICAgIF9fZyA9IFsnVHV0b3JpYWwnLCAnb24nXTsKKyAgICB9IGVsc2UgaWYgKCdzYW1wbGUnIGluIHRhZ3NIYXNoKSB7CisgICAgICBfX2cgPSBbJ1NhbXBsZScsICdmb3InXTsKKyAgICB9IGVsc2UgaWYgKCd2aWRlbycgaW4gdGFnc0hhc2gpIHsKKyAgICAgIF9fZyA9IFsnVmlkZW8nLCAnYWJvdXQnXTsKKyAgICB9CisgICU+CisgIDwlPSBfX2dbMF0gJT48JSBpZiAodG9waWNzSHRtbCkgeyAlPiA8JT0gX19nWzFdICU+PCUgfSAlPiA8JT0gdG9waWNzSHRtbCAlPjwvcD4KKyAgPHA+PCU9IGRlc2NyaXB0aW9uLmVuICU+PC9wPgorPC9kaXY+Cis8L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvaW5kZXguamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2luZGV4LmpkCmluZGV4IDE2Njg3MjEuLjkwNTU4NjggMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvaW5kZXguamQKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9pbmRleC5qZApAQCAtMSwzOCArMSw5MCBAQAogcGFnZS50aXRsZT1EZXZlbG9wZXIgUmVzb3VyY2VzCiBAamQ6Ym9keQogCis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAjcmVzb3VyY2UtbGlzdC10YWJsZSB0ZCB7CisgICAgYm9yZGVyOiAwOworICAgIHBhZGRpbmc6IDAgMjRweDsKKyAgICB3aWR0aDogMzMlOworICAgIG1heC13aWR0aDogMjUwcHg7CisgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RkZDsKKyAgfQorCisgICNyZXNvdXJjZS1saXN0LXRhYmxlIHRkLmxhc3QgeworICAgIGJvcmRlci1yaWdodDogMDsKKyAgICBwYWRkaW5nLXJpZ2h0OiAwOworICB9Cis8L3N0eWxlPgorCiA8cD4KLVRoaXMgc2VjdGlvbiBwcm92aWRlcyB0ZWNobmljYWwgYXJ0aWNsZXMsIHR1dG9yaWFscywgc2FtcGxlIGNvZGUsIGFuZCBvdGhlcgorVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGFydGljbGVzLCB0dXRvcmlhbHMsIHNhbXBsZSBjb2RlLCBhbmQgb3RoZXIKIGluZm9ybWF0aW9uIHRvIGhlbHAgeW91IHF1aWNrbHkgaW1wbGVtZW50IHRoZSBmZWF0dXJlcyB5b3Ugd2FudCBpbiB5b3VyCi1hcHBsaWNhdGlvbi4KK2FwcGxpY2F0aW9uLiBUbyByZXR1cm4gdG8gdGhpcyBwYWdlIGxhdGVyLCBqdXN0IGNsaWNrIHRoZSAiUmVzb3VyY2VzIgordGFiIHdoaWxlIGFueSBSZXNvdXJjZXMgcGFnZSBpcyBsb2FkZWQuCiA8L3A+CiAKKzxoMj5UZWNobmljYWwgUmVzb3VyY2VzPC9oMj4KKworPHRhYmxlIGlkPSJyZXNvdXJjZS1saXN0LXRhYmxlIj4KKzx0cj4KKyAgPHRkPgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1zYW1wbGUiPgorICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3Jlc291cmNlLWJpZy1zYW1wbGUucG5nIi8+CisgICAgPC9hPgorICAgIDxoMz48YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9c2FtcGxlIj4KKyAgICAgIFNhbXBsZSBDb2RlCisgICAgPC9hPjwvaDM+CisgICAgPHA+RnVsbHktZnVuY3Rpb25pbmcgc2FtcGxlIGFwcGxpY2F0aW9ucyB0aGF0IHlvdSBjYW4gYnVpbGQgYW5kIHJ1bgorICAgIHRvIGxlYXJuIGFib3V0IGhvdyBBbmRyb2lkIHdvcmtzLiBGZWVsIGZyZWUgdG8gcmV1c2UgYW55IG9mIHRoZSBjb2RlIG9yCisgICAgdGVjaG5pcXVlcyBpbiB0aGUgc2FtcGxlcy48L3A+CisgIDwvdGQ+CisgIDx0ZD4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9YXJ0aWNsZSI+CisgICAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLWFydGljbGUucG5nIi8+CisgICAgPC9hPgorICAgIDxoMz48YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9YXJ0aWNsZSI+CisgICAgICBBcnRpY2xlcworICAgIDwvYT48L2gzPgorICAgIDxwPkZvY3VzZWQgZGlzY3Vzc2lvbnMgYWJvdXQgQW5kcm9pZCBkZXZlbG9wbWVudCBzdWJqZWN0cywgaW5jbHVkaW5nCisgICAgb3B0aW1pemF0aW9ucywgdGlwcywgaW50ZXJlc3RpbmcgaW1wbGVtZW50YXRpb25zLCAiaG93LXRvcyIsCisgICAgYW5kIHNvIG9uLjwvcD4KKyAgPC90ZD4KKyAgPHRkPgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz10dXRvcmlhbCI+CisgICAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLXR1dG9yaWFsLnBuZyIvPgorICAgIDwvYT4KKyAgICA8aDM+PGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXR1dG9yaWFsIj4KKyAgICAgIFR1dG9yaWFscworICAgIDwvYT48L2gzPgorICAgIDxwPlN0ZXAtYnktc3RlcCBpbnN0cnVjdGlvbnMgZGVtb25zdHJhdGluZyBob3cgdG8gYnVpbGQgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbgorICAgIHRoYXQgaGFzIHRoZSBzcGVjaWZpYyBmZWF0dXJlcyB5b3Ugd2FudC48L3A+CisgIDwvdGQ+CisgIDwhLS0gPHRkIGNsYXNzPSJsYXN0Ij4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9dmlkZW8iPgorICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3Jlc291cmNlLWJpZy12aWRlby5wbmciLz4KKyAgICA8L2E+CisgICAgPGgzPjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz12aWRlbyI+CisgICAgICBWaWRlb3MgJmFtcDsgU2NyZWVuY2FzdHMKKyAgICA8L2E+PC9oMz4KKyAgICA8cD5WaWRlb3MgYW5kIHByZXNlbnRhdGlvbiBzbGlkZXMgZnJvbSBkZXZlbG9wZXIgZXZlbnRzLCBhbG9uZyB3aXRoCisgICAgc2NyZWVuY2FzdHMgdG8gd2FsayB5b3UgdGhyb3VnaCBjb21tb24gQW5kcm9pZCBkZXZlbG9wbWVudAorICAgIHdvcmtmbG93cy48L3A+CisgIDwvdGQ+IC0tPgorPC90cj4KKzwvdGFibGU+CisKKzxoMj5PdGhlciBSZXNvdXJjZXM8L2gyPgorCiA8ZGw+Ci08ZHQ+PGI+VGVjaG5pY2FsIEFydGljbGVzPC9iPjwvZHQ+Ci08ZGQ+Rm9jdXNlZCBkaXNjdXNzaW9ucyBhYm91dCBBbmRyb2lkIGRldmVsb3BtZW50IHN1YmplY3RzLCBpbmNsdWRpbmcKLW9wdGltaXphdGlvbnMsIHRpcHMsIGludGVyZXN0aW5nIGltcGxlbWVudGF0aW9ucywKLWFuZCBzbyBvbi4gTW9zdCBvZiB0aGUgYXJ0aWNsZXMgcHJvdmlkZSAiaG93LXRvIiBpbnN0cnVjdGlvbnMgZm9yIGFkZGluZwotZmVhdHVyZXMgb3IgZnVuY3Rpb25hbGl0eSB0byB5b3VyIGFwcC4gVGhlIGFydGljbGVzIGFyZSBkcmF3biBmcm9tIHBvc3RzIHRvIHRoZQotQW5kcm9pZCBEZXZlbG9wZXJzIEJsb2cuCi08L2RkPgotCi08ZHQ+PGI+VHV0b3JpYWxzPC9iPjwvZHQ+Ci08ZGQ+U3RlcC1ieS1zdGVwIGluc3RydWN0aW9ucyBkZW1vbnN0cmF0aW5nIGhvdyB0byBidWlsZCBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uCi10aGF0IGhhcyB0aGUgc3BlY2lmaWMgZmVhdHVyZXMgeW91IHdhbnQuIDwvZGQ+Ci0KLTxkdD48Yj5TYW1wbGUgQ29kZTwvYj48L2R0PgotPGRkPkZ1bGx5LWZ1bmN0aW9uaW5nIHNhbXBsZSBhcHBsaWNhdGlvbnMgdGhhdCB5b3UgY2FuIGxvb2sgYXQgb3IgYnVpbGQgYW5kIHJ1biwKLXRvIGxlYXJuIGFib3V0IGhvdyBBbmRyb2lkIHdvcmtzLiBGZWVsIGZyZWUgdG8gcmV1c2UgYW55IG9mIHRoZSBjb2RlIG9yCi10ZWNobmlxdWVzIHRoYXQgeW91IGZpbmQgaW4gdGhlIHNhbXBsZXMhPC9kZD4KLQogPGR0PjxiPkNvbW11bml0eTwvYj48L2R0PgogPGRkPkxpbmtzIHRvIHRoZSBBbmRyb2lkIGRpc2N1c3Npb24gZ3JvdXBzIGFuZCBpbmZvcm1hdGlvbiBhYm91dCBvdGhlciB3YXlzIHRvCiBjb2xsYWJvcmF0ZSB3aXRoIG90aGVyIGRldmVsb3BlcnMuIDwvZGQ+CiAKKzxkdD48Yj5EZXZpY2UgRGFzaGJvYXJkPC9iPjwvZHQ+Cis8ZGQ+RGV2aWNlIGRpc3RyaWJ1dGlvbiBkYXRhLCBncm91cGVkIGJ5IHZhcmlvdXMgZGltZW5zaW9ucyBzdWNoIGFzIHNjcmVlbiBzaXplCithbmQgQW5kcm9pZCBwbGF0Zm9ybSB2ZXJzaW9uLiA8L2RkPgorCiA8ZHQ+PGI+TW9yZTwvYj48L2R0PgogPGRkPlF1aWNrIGRldmVsb3BtZW50IHRpcHMsIHRyb3VibGVzaG9vdGluZyBpbmZvcm1hdGlvbiwgYW5kIGZyZXF1ZW50bHkgYXNrZWQKIHF1ZXN0aW9ucyAoRkFRcykuIDwvZGQ+CiA8L2RsPgotCi08cD5UbyByZXR1cm4gdG8gdGhpcyBwYWdlIGxhdGVyLCBqdXN0IGNsaWNrIHRoZSAiUmVzb3VyY2VzIiB0YWIgd2hpbGUgYW55Ci1SZXNvdXJjZXMgcGFnZSBpcyBsb2FkZWQuIDwvcD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlcy1kYXRhLmpzIGIvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXMtZGF0YS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDZiNjk1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXMtZGF0YS5qcwpAQCAtMCwwICsxLDYzMiBAQAordmFyIEFORFJPSURfVEFHUyA9IHsKKyAgdHlwZTogeworICAgICdhcnRpY2xlJzogJ0FydGljbGUnLAorICAgICd0dXRvcmlhbCc6ICdUdXRvcmlhbCcsCisgICAgJ3NhbXBsZSc6ICdTYW1wbGUnLAorICAgICd2aWRlbyc6ICdWaWRlbycsCisgICAgJ2xpYnJhcnknOiAnQ29kZSBMaWJyYXJ5JworICB9LAorICB0b3BpYzogeworICAgICdhY2Nlc3NpYmlsaXR5JzogJ0FjY2Vzc2liaWxpdHknLAorICAgICdhY2NvdW50c3luYyc6ICdBY2NvdW50cyAmYW1wOyBTeW5jJywKKyAgICAnYmVzdHByYWN0aWNlJzogJ0Jlc3QgUHJhY3RpY2VzJywKKyAgICAnY29tbXVuaWNhdGlvbic6ICdDb21tdW5pY2F0aW9uJywKKyAgICAnY29tcGF0aWJpbGl0eSc6ICdDb21wYXRpYmlsaXR5JywKKyAgICAnZGF0YSc6ICdEYXRhIEFjY2VzcycsCisgICAgJ2RyYXdpbmcnOiAnQ2FudmFzIERyYXdpbmcnLAorICAgICdnYW1lZGV2JzogJ0dhbWUgRGV2ZWxvcG1lbnQnLAorICAgICdnbCc6ICdPcGVuR0wgRVMnLAorICAgICdpbnB1dCc6ICdJbnB1dCBNZXRob2RzJywKKyAgICAnaW50ZW50JzogJ0ludGVudHMnLAorICAgICdsYXlvdXQnOiAnTGF5b3V0cy9WaWV3cycsCisgICAgJ21lZGlhJzogJ011bHRpbWVkaWEnLAorICAgICduZXdmZWF0dXJlJzogJ05ldyBGZWF0dXJlcycsCisgICAgJ3BlcmZvcm1hbmNlJzogJ1BlcmZvcm1hbmNlJywKKyAgICAnc2VhcmNoJzogJ1NlYXJjaCcsCisgICAgJ3Rlc3RpbmcnOiAnVGVzdGluZycsCisgICAgJ3VpJzogJ1VzZXIgSW50ZXJmYWNlJywKKyAgICAnd2ViJzogJ1dlYiBDb250ZW50JworICB9LAorICBtaXNjOiB7CisgICAgJ2V4dGVybmFsJzogJ0V4dGVybmFsJywKKyAgICAnbmV3JzogJ05ldycKKyAgfQorfTsKKwordmFyIEFORFJPSURfUkVTT1VSQ0VTID0gWworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vIFRFQ0hOSUNBTCBBUlRJQ0xFUyAvLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdwZXJmb3JtYW5jZScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvYXZvaWRpbmctbWVtb3J5LWxlYWtzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0F2b2lkaW5nIE1lbW9yeSBMZWFrcycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ01vYmlsZSBkZXZpY2VzIG9mdGVuIGhhdmUgbGltaXRlZCBtZW1vcnksIGFuZCBtZW1vcnkgbGVha3MgY2FuIGNhdXNlIHlvdXIgYXBwbGljYXRpb24gdG8gd2FzdGUgdGhpcyB2YWx1YWJsZSByZXNvdXJjZSB3aXRob3V0IHlvdXIga25vd2xlZGdlLiBUaGlzIGFydGljbGUgcHJvdmlkZXMgdGlwcyB0byBoZWxwIHlvdSBhdm9pZCBjb21tb24gY2F1c2VzIG9mIG1lbW9yeSBsZWFrcyBvbiB0aGUgQW5kcm9pZCBwbGF0Zm9ybS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2NvbXBhdGliaWxpdHknXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvYmFja3dhcmQtY29tcGF0aWJpbGl0eS5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdCYWNrd2FyZCBDb21wYXRpYmlsaXR5JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhlIEFuZHJvaWQgcGxhdGZvcm0gc3RyaXZlcyB0byBlbnN1cmUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEhvd2V2ZXIsIHNvbWV0aW1lcyB5b3Ugd2FudCB0byB1c2UgbmV3IGZlYXR1cmVzIHdoaWNoIGFyZW5cJ3Qgc3VwcG9ydGVkIG9uIG9sZGVyIHBsYXRmb3Jtcy4gVGhpcyBhcnRpY2xlIGRpc2N1c3NlcyBzdHJhdGVnaWVzIGZvciBzZWxlY3RpdmVseSB1c2luZyB0aGVzZSBmZWF0dXJlcyBiYXNlZCBvbiBhdmFpbGFiaWxpdHksIGFsbG93aW5nIHlvdSB0byBrZWVwIHlvdXIgYXBwbGljYXRpb25zIHBvcnRhYmxlIGFjcm9zcyBhIHdpZGUgcmFuZ2Ugb2YgZGV2aWNlcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2ludGVudCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9jYW4taS11c2UtdGhpcy1pbnRlbnQuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQ2FuIEkgVXNlIHRoaXMgSW50ZW50PycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuZHJvaWQgb2ZmZXJzIGEgdmVyeSBwb3dlcmZ1bCBhbmQgeWV0IGVhc3ktdG8tdXNlIG1lc3NhZ2UgdHlwZSBjYWxsZWQgYW4gaW50ZW50LiBZb3UgY2FuIHVzZSBpbnRlbnRzIHRvIHR1cm4gYXBwbGljYXRpb25zIGludG8gaGlnaC1sZXZlbCBsaWJyYXJpZXMgYW5kIG1ha2UgY29kZSBtb2R1bGFyIGFuZCByZXVzYWJsZS4gV2hpbGUgaXQgaXMgbmljZSB0byBiZSBhYmxlIHRvIG1ha2UgdXNlIG9mIGEgbG9vc2VseSBjb3VwbGVkIEFQSSwgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIGludGVudCB5b3Ugc2VuZCB3aWxsIGJlIHJlY2VpdmVkIGJ5IGFub3RoZXIgYXBwbGljYXRpb24uIFRoaXMgYXJ0aWNsZSBkZXNjcmliZXMgYSB0ZWNobmlxdWUgeW91IGNhbiB1c2UgdG8gZmluZCBvdXQgd2hldGhlciB0aGUgc3lzdGVtIGNvbnRhaW5zIGFueSBhcHBsaWNhdGlvbiBjYXBhYmxlIG9mIHJlc3BvbmRpbmcgdG8gdGhlIGludGVudCB5b3Ugd2FudCB0byB1c2UuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdpbnB1dCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9jcmVhdGluZy1pbnB1dC1tZXRob2QuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQ3JlYXRpbmcgYW4gSW5wdXQgTWV0aG9kJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnSW5wdXQgTWV0aG9kIEVkaXRvcnMgKElNRXMpIHByb3ZpZGUgdGhlIG1lY2hhbmlzbSBmb3IgZW50ZXJpbmcgdGV4dCBpbnRvIHRleHQgZmllbGRzIGFuZCBvdGhlciBWaWV3cy4gQW5kcm9pZCBkZXZpY2VzIGNvbWUgYnVuZGxlZCB3aXRoIGF0IGxlYXN0IG9uZSBJTUUsIGJ1dCB1c2VycyBjYW4gaW5zdGFsbCBhZGRpdGlvbmFsIElNRXMuIFRoaXMgYXJ0aWNsZSBjb3ZlcnMgdGhlIGJhc2ljcyBvZiBkZXZlbG9waW5nIGFuIElNRSBmb3IgdGhlIEFuZHJvaWQgcGxhdGZvcm0uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdkcmF3aW5nJywgJ3VpJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2RyYXdhYmxlLW11dGF0aW9ucy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdEcmF3YWJsZSBNdXRhdGlvbnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdEcmF3YWJsZXMgYXJlIHBsdWdnYWJsZSBkcmF3aW5nIGNvbnRhaW5lcnMgdGhhdCBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gZGlzcGxheSBncmFwaGljcy4gVGhpcyBhcnRpY2xlIGV4cGxhaW5zIHNvbWUgY29tbW9uIHBpdGZhbGxzIHdoZW4gdHJ5aW5nIHRvIG1vZGlmeSB0aGUgcHJvcGVydGllcyBvZiBtdWx0aXBsZSBEcmF3YWJsZXMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdiZXN0cHJhY3RpY2UnLCAndWknXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvZmFzdGVyLXNjcmVlbi1vcmllbnRhdGlvbi1jaGFuZ2UuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnRmFzdGVyIFNjcmVlbiBPcmllbnRhdGlvbiBDaGFuZ2UnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdXaGVuIGFuIEFuZHJvaWQgZGV2aWNlIGNoYW5nZXMgaXRzIG9yaWVudGF0aW9uLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBhdXRvbWF0aWNhbGx5IHJlc3RhcnQgdGhlIGN1cnJlbnQgYWN0aXZpdHkgd2l0aCBhIG5ldyBjb25maWd1cmF0aW9uLiBIb3dldmVyLCB0aGlzIGNhbiBiZWNvbWUgYSBib3R0bGVuZWNrIGluIGFwcGxpY2F0aW9ucyB0aGF0IGFjY2VzcyBhIGxhcmdlIGFtb3VudCBvZiBleHRlcm5hbCBkYXRhLiBUaGlzIGFydGljbGUgZGlzY3Vzc2VzIGhvdyB0byBncmFjZWZ1bGx5IGhhbmRsZSB0aGlzIHNpdHVhdGlvbiB3aXRob3V0IHJlc29ydGluZyB0byBtYW51YWxseSBwcm9jZXNzaW5nIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2NvbXBhdGliaWxpdHknXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvZnV0dXJlLXByb29maW5nLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0Z1dHVyZS1Qcm9vZmluZyBZb3VyIEFwcHMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIGNvbGxlY3Rpb24gb2YgY29tbW9uIHNlbnNlIGFkdmljZSB0byBoZWxwIHlvdSBlbnN1cmUgdGhhdCB5b3VyIGFwcGxpY2F0aW9ucyBkb25cJ3QgYnJlYWsgd2hlbiBuZXcgdmVyc2lvbnMgb2YgdGhlIEFuZHJvaWQgcGxhdGZvcm0gYXJlIHJlbGVhc2VkLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnaW5wdXQnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvZ2VzdHVyZXMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnR2VzdHVyZXMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUb3VjaCBzY3JlZW5zIGFsbG93IHVzZXJzIHRvIHBlcmZvcm0gZ2VzdHVyZXMsIHN1Y2ggYXMgdGFwcGluZywgZHJhZ2dpbmcsIGZsaW5naW5nLCBvciBzbGlkaW5nLCB0byBwZXJmb3JtIHZhcmlvdXMgYWN0aW9ucy4gVGhlIGdlc3R1cmVzIEFQSSBlbmFibGVzIHlvdXIgYXBwbGljYXRpb24gdG8gcmVjb2duaXplIGV2ZW4gY29tcGxpY2F0ZWQgZ2VzdHVyZXMgd2l0aCBlYXNlLiBUaGlzIGFydGljbGUgZXhwbGFpbnMgaG93IHRvIGludGVncmF0ZSB0aGlzIEFQSSBpbnRvIGFuIGFwcGxpY2F0aW9uLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnZ2FtZWRldicsICdnbCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9nbHN1cmZhY2V2aWV3Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0ludHJvZHVjaW5nIEdMU3VyZmFjZVZpZXcnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGlzIGFydGljbGUgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgR0xTdXJmYWNlVmlldywgYSBjbGFzcyB0aGF0IG1ha2VzIGl0IGVhc3kgdG8gaW1wbGVtZW50IDJEIG9yIDNEIE9wZW5HTCByZW5kZXJpbmcgaW5zaWRlIG9mIGFuIEFuZHJvaWQgYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aScsICdsYXlvdXQnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1yZXVzZS5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMYXlvdXQgVHJpY2tzOiBDcmVhdGluZyBSZXVzYWJsZSBVSSBDb21wb25lbnRzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTGVhcm4gaG93IHRvIGNvbWJpbmUgbXVsdGlwbGUgc3RhbmRhcmQgVUkgd2lkZ2V0cyBpbnRvIGEgc2luZ2xlIGhpZ2gtbGV2ZWwgY29tcG9uZW50LCB3aGljaCBjYW4gYmUgcmV1c2VkIHRocm91Z2hvdXQgeW91ciBhcHBsaWNhdGlvbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2xheW91dCcsICd1aScsICdwZXJmb3JtYW5jZScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1lZmZpY2llbmN5Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0xheW91dCBUcmlja3M6IENyZWF0aW5nIEVmZmljaWVudCBMYXlvdXRzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTGVhcm4gaG93IHRvIG9wdGltaXplIGFwcGxpY2F0aW9uIGxheW91dHMgYXMgdGhpcyBhcnRpY2xlIHdhbGtzIHlvdSB0aHJvdWdoIGNvbnZlcnRpbmcgYSBMaW5lYXJMYXlvdXQgaW50byBhIFJlbGF0aXZlTGF5b3V0LCBhbmQgYW5hbHl6ZXMgdGhlIHJlc3VsdGluZyBpbXBsaWNhdGlvbnMgb24gcGVyZm9ybWFuY2UuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdsYXlvdXQnLCAndWknLCAncGVyZm9ybWFuY2UnLCAnYmVzdHByYWN0aWNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2xheW91dC10cmlja3Mtc3R1YnMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGF5b3V0IFRyaWNrczogVXNpbmcgVmlld1N0dWJzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTGVhcm4gYWJvdXQgdXNpbmcgVmlld1N0dWJzIGluc2lkZSBhbiBhcHBsaWNhdGlvblwncyBsYXlvdXQgaW4gb3JkZXIgdG8gaW5mbGF0ZSByYXJlbHkgdXNlZCBVSSBlbGVtZW50cywgd2l0aG91dCB0aGUgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBiZSBjYXVzZWQgYnkgdXNpbmcgdGhlIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4gdGFnLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnbGF5b3V0JywgJ3VpJywgJ3BlcmZvcm1hbmNlJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9sYXlvdXQtdHJpY2tzLW1lcmdlLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0xheW91dCBUcmlja3M6IE1lcmdpbmcgTGF5b3V0cycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0xlYXJuIGhvdyB0byB1c2UgdGhlIDxjb2RlPiZsdDttZXJnZSZndDs8L2NvZGU+IHRhZyBpbiB5b3VyIFhNTCBsYXlvdXRzIGluIG9yZGVyIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGxldmVscyBvZiBoaWVyYXJjaHkgd2l0aGluIGFuIGFwcGxpY2F0aW9uXCdzIHZpZXcgdHJlZS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ3BlcmZvcm1hbmNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2xpc3R2aWV3LWJhY2tncm91bmRzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0xpc3RWaWV3IEJhY2tncm91bmRzOiBBbiBPcHRpbWl6YXRpb24nCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMaXN0Vmlld3MgYXJlIHZlcnkgcG9wdWxhciB3aWRnZXRzIHdpdGhpbiB0aGUgQW5kcm9pZCBmcmFtZXdvcmsuIFRoaXMgYXJ0aWNsZSBkZXNjcmliZXMgc29tZSBvZiB0aGUgb3B0aW1pemF0aW9ucyB1c2VkIGJ5IHRoZSBMaXN0VmlldyB3aWRnZXQsIGFuZCBob3cgdG8gYXZvaWQgc29tZSBjb21tb24gaXNzdWVzIHRoYXQgdGhpcyBjYXVzZXMgd2hlbiB0cnlpbmcgdG8gdXNlIGEgY3VzdG9tIGJhY2tncm91bmQuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aScsICduZXdmZWF0dXJlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2xpdmUtZm9sZGVycy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMaXZlIEZvbGRlcnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMaXZlIEZvbGRlcnMgYWxsb3cgdXNlcnMgdG8gZGlzcGxheSBhbnkgc291cmNlIG9mIGRhdGEgb24gdGhlaXIgaG9tZSBzY3JlZW4gd2l0aG91dCBsYXVuY2hpbmcgYW4gYXBwbGljYXRpb24uIFRoaXMgYXJ0aWNsZSBkaXNjdXNzZXMgaG93IHRvIGV4cG9ydCBhbiBhcHBsaWNhdGlvblwncyBkYXRhIGluIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBkaXNwbGF5IGluc2lkZSBvZiBhIGxpdmUgZm9sZGVyLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAnbmV3ZmVhdHVyZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9saXZlLXdhbGxwYXBlcnMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGl2ZSBXYWxscGFwZXJzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTGl2ZSB3YWxscGFwZXJzIGFyZSByaWNoZXIsIGFuaW1hdGVkLCBpbnRlcmFjdGl2ZSBiYWNrZ3JvdW5kcyB0aGF0IHVzZXJzIGNhbiBkaXNwbGF5IGluIHRoZWlyIGhvbWUgc2NyZWVucy4gTGVhcm4gaG93IHRvIGNyZWF0ZSBhIGxpdmUgd2FsbHBhcGVyIGFuZCBidW5kbGUgaXQgaW4gYW4gYXBwbGljYXRpb24gdGhhdCB1c2VycyBjYW4gaW5zdGFsbCBvbiB0aGVpciBkZXZpY2VzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnaW5wdXQnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvb24tc2NyZWVuLWlucHV0cy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdPbnNjcmVlbiBJbnB1dCBNZXRob2RzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhlIElucHV0IE1ldGhvZCBGcmFtZXdvcmsgKElNRikgYWxsb3dzIHVzZXJzIHRvIHRha2UgYWR2YW50YWdlIG9mIG9uLXNjcmVlbiBpbnB1dCBtZXRob2RzLCBzdWNoIGFzIHNvZnR3YXJlIGtleWJvYXJkcy4gVGhpcyBhcnRpY2xlIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIElucHV0IE1ldGhvZCBFZGl0b3JzIChJTUVzKSBhbmQgaG93IGFwcGxpY2F0aW9ucyBpbnRlcmFjdCB3aXRoIHRoZW0uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdwZXJmb3JtYW5jZScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvcGFpbmxlc3MtdGhyZWFkaW5nLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1BhaW5sZXNzIFRocmVhZGluZycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBkaXNjdXNzZXMgdGhlIHRocmVhZGluZyBtb2RlbCB1c2VkIGJ5IEFuZHJvaWQgYXBwbGljYXRpb25zIGFuZCBob3cgYXBwbGljYXRpb25zIGNhbiBlbnN1cmUgYmVzdCBVSSBwZXJmb3JtYW5jZSBieSBzcGF3bmluZyB3b3JrZXIgdGhyZWFkcyB0byBoYW5kbGUgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbnMsIHJhdGhlciB0aGFuIGhhbmRsaW5nIHRoZW0gaW4gdGhlIG1haW4gdGhyZWFkLiBUaGUgYXJ0aWNsZSBhbHNvIGV4cGxhaW5zIHRoZSBBUEkgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGNhbiB1c2UgdG8gaW50ZXJhY3Qgd2l0aCBBbmRyb2lkIFVJIHRvb2xraXQgY29tcG9uZW50cyBydW5uaW5nIG9uIHRoZSBtYWluIHRocmVhZCBhbmQgc3Bhd24gbWFuYWdlZCB3b3JrZXIgdGhyZWFkcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ3NlYXJjaCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9xc2IuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnUXVpY2sgU2VhcmNoIEJveCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1F1aWNrIFNlYXJjaCBCb3ggKFFTQikgaXMgYSBwb3dlcmZ1bCwgc3lzdGVtLXdpZGUgc2VhcmNoIGZyYW1ld29yay4gUVNCIG1ha2VzIGl0IHBvc3NpYmxlIGZvciB1c2VycyB0byBxdWlja2x5IGFuZCBlYXNpbHkgZmluZCB3aGF0IHRoZXlcJ3JlIGxvb2tpbmcgZm9yLCBib3RoIG9uIHRoZWlyIGRldmljZXMgYW5kIG9uIHRoZSB3ZWIuIFRoaXMgYXJ0aWNsZSBkaXNjdXNzZXMgaG93IHRvIHdvcmsgd2l0aCB0aGUgUVNCIGZyYW1ld29yayB0byBhZGQgbmV3IHNlYXJjaCByZXN1bHRzIGZvciBhbiBpbnN0YWxsZWQgYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy90b3VjaC1tb2RlLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1RvdWNoIE1vZGUnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGlzIGFydGljbGUgZXhwbGFpbnMgdGhlIHRvdWNoIG1vZGUsIG9uZSBvZiB0aGUgbW9zdCBpbXBvcnRhbnQgcHJpbmNpcGxlcyBvZiBBbmRyb2lkXCdzIFVJIHRvb2xraXQuIFdoZW5ldmVyIGEgdXNlciBpbnRlcmFjdHMgd2l0aCBhIGRldmljZVwncyB0b3VjaCBzY3JlZW4sIHRoZSBzeXN0ZW0gZW50ZXJzIHRvdWNoIG1vZGUuIFdoaWxlIHNpbXBsZSBpbiBjb25jZXB0LCB0aGVyZSBhcmUgaW1wb3J0YW50IGltcGxpY2F0aW9ucyB0b3VjaCBtb2RlIHRoYXQgYXJlIG9mdGVuIG92ZXJsb29rZWQuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdwZXJmb3JtYW5jZScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvdHJhY2stbWVtLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1RyYWNraW5nIE1lbW9yeSBBbGxvY2F0aW9ucycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBkaXNjdXNzZXMgaG93IHRvIHVzZSB0aGUgQWxsb2NhdGlvbiBUcmFja2VyIHRvb2wgdG8gb2JzZXJ2ZSBtZW1vcnkgYWxsb2NhdGlvbnMgYW5kIGF2b2lkIHBlcmZvcm1hbmNlIHByb2JsZW1zIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIGNhdXNlZCBieSBpZ25vcmluZyB0aGUgZWZmZWN0IG9mIERhbHZpa1wncyBnYXJiYWdlIGNvbGxlY3Rvci4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ25ld2ZlYXR1cmUnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvdWktMS41Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1VJIEZyYW1ld29yayBDaGFuZ2VzIGluIEFuZHJvaWQgMS41JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnRXhwbG9yZSB0aGUgVUkgY2hhbmdlcyB0aGF0IHdlcmUgaW50cm9kdWNlZCBpbiBBbmRyb2lkIDEuNSwgY29tcGFyZWQgd2l0aCB0aGUgVUkgcHJvdmlkZWQgaW4gQW5kcm9pZCAxLjAgYW5kIDEuMS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ25ld2ZlYXR1cmUnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvdWktMS42Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1VJIEZyYW1ld29yayBDaGFuZ2VzIGluIEFuZHJvaWQgMS42JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnRXhwbG9yZSB0aGUgVUkgY2hhbmdlcyB0aGF0IHdlcmUgaW50cm9kdWNlZCBpbiBBbmRyb2lkIDEuNiwgY29tcGFyZWQgd2l0aCB0aGUgVUkgcHJvdmlkZWQgaW4gQW5kcm9pZCAxLjUuIEluIHBhcnRpY3VsYXIsIHRoaXMgYXJ0aWNsZSBkaXNjdXNzZXMgY2hhbmdlcyB0byBSZWxhdGl2ZUxheW91dHMgYW5kIGNsaWNrIGxpc3RlbmVycy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy90aW1lZC11aS11cGRhdGVzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1VwZGF0aW5nIHRoZSBVSSBmcm9tIGEgVGltZXInCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMZWFybiBhYm91dCBob3cgdG8gdXNlIEhhbmRsZXJzIGFzIGEgbW9yZSBlZmZpY2llbnQgcmVwbGFjZW1lbnQgZm9yIGphdmEudXRpbC5UaW1lciBvbiB0aGUgQW5kcm9pZCBwbGF0Zm9ybS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ2FjY2Vzc2liaWxpdHknXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvdHRzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1VzaW5nIFRleHQtdG8tU3BlZWNoJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhlIHRleHQtdG8tc3BlZWNoIEFQSSBsZXRzIHlvdXIgYXBwbGljYXRpb24gInNwZWFrIiB0byB1c2VycywgaW4gYW55IG9mIHNldmVyYWwgbGFuZ3VhZ2VzLiBUaGlzIGFydGljbGUgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIFRUUyBBUEkgYW5kIGhvdyB5b3UgdXNlIHRvIGFkZCBzcGVlY2ggY2FwYWJpbGl0aWVzIHRvIHlvdXIgYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aScsICd3ZWInXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvdXNpbmctd2Vidmlld3MuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVXNpbmcgV2ViVmlld3MnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdXZWJWaWV3cyBhbGxvdyBhbiBhcHBsaWNhdGlvbiB0byBkeW5hbWljYWxseSBkaXNwbGF5IEhUTUwgYW5kIGV4ZWN1dGUgSmF2YVNjcmlwdCwgd2l0aG91dCByZWxpbnF1aXNoaW5nIGNvbnRyb2wgdG8gYSBzZXBhcmF0ZSBicm93c2VyIGFwcGxpY2F0aW9uLiBUaGlzIGFydGljbGUgaW50cm9kdWNlcyB0aGUgV2ViVmlldyBjbGFzc2VzIGFuZCBwcm92aWRlcyBhIHNhbXBsZSBhcHBsaWNhdGlvbiB0aGF0IGRlbW9uc3RyYXRlcyBpdHMgdXNlLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvd2lraW5vdGVzLWxpbmtpZnkuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnV2lraU5vdGVzOiBMaW5raWZ5IHlvdXIgVGV4dCEnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGlzIGFydGljbGUgaW50cm9kdWNlcyBXaWtpTm90ZXMgZm9yIEFuZHJvaWQsIHBhcnQgb2YgdGhlIEFwcHMgZm9yIEFuZHJvaWQgcHJvamVjdC4gSXQgY292ZXJzIHRoZSB1c2Ugb2YgTGlua2lmeSB0byB0dXJuIG9yZGluYXJ5IHRleHQgdmlld3MgaW50byByaWNoZXIsIGxpbmstb3JpZW50ZWQgY29udGVudCB0aGF0IGNhdXNlcyBBbmRyb2lkIGludGVudHMgdG8gZmlyZSB3aGVuIGEgbGluayBpcyBzZWxlY3RlZC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2ludGVudCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy93aWtpbm90ZXMtaW50ZW50cy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdXaWtpTm90ZXM6IFJvdXRpbmcgSW50ZW50cycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBpbGx1c3RyYXRlcyBob3cgYW4gYXBwbGljYXRpb24sIGluIHRoaXMgY2FzZSB0aGUgV2lraU5vdGVzIHNhbXBsZSBhcHAsIGNhbiB1c2UgaW50ZW50cyB0byByb3V0ZSB2YXJpb3VzIHR5cGVzIG9mIGxpbmtlZCB0ZXh0IHRvIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGhhbmRsZXMgdGhhdCB0eXBlIG9mIGRhdGEuIEZvciBleGFtcGxlLCBhbiBhcHAgY2FuIHVzZSBpbnRlbnRzIHRvIHJvdXRlIGEgbGlua2VkIHRlbGVwaG9uZSBudW1iZXIgdG8gYSBkaWFsZXIgYXBwIGFuZCBhIHdlYiBVUkwgdG8gYSBicm93c2VyLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAncGVyZm9ybWFuY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvd2luZG93LWJnLXNwZWVkLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1dpbmRvdyBCYWNrZ3JvdW5kcyAmIFVJIFNwZWVkJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnU29tZSBBbmRyb2lkIGFwcGxpY2F0aW9ucyBuZWVkIHRvIHNxdWVlemUgZXZlcnkgYml0IG9mIHBlcmZvcm1hbmNlIG91dCBvZiB0aGUgVUkgdG9vbGtpdCBhbmQgdGhlcmUgYXJlIG1hbnkgd2F5cyB0byBkbyBzby4gSW4gdGhpcyBhcnRpY2xlLCB5b3Ugd2lsbCBkaXNjb3ZlciBob3cgdG8gc3BlZWQgdXAgdGhlIGRyYXdpbmcgYW5kIHRoZSBwZXJjZWl2ZWQgc3RhcnR1cCB0aW1lIG9mIHlvdXIgYWN0aXZpdGllcy4gQm90aCBvZiB0aGVzZSB0ZWNobmlxdWVzIHJlbHkgb24gYSBzaW5nbGUgZmVhdHVyZSwgdGhlIHdpbmRvd1wncyBiYWNrZ3JvdW5kIGRyYXdhYmxlLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAncGVyZm9ybWFuY2UnLCAnYmVzdHByYWN0aWNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3ppcGFsaWduLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1ppcGFsaWduOiBhbiBFYXN5IE9wdGltaXphdGlvbicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoZSBBbmRyb2lkIFNESyBpbmNsdWRlcyBhIHRvb2wgY2FsbGVkIHppcGFsaWduIHRoYXQgb3B0aW1pemVzIHRoZSB3YXkgYW4gYXBwbGljYXRpb24gaXMgcGFja2FnZWQuIFJ1bm5pbmcgemlwYWxpZ24gYWdhaW5zdCB5b3VyIGFwcGxpY2F0aW9uIGVuYWJsZXMgQW5kcm9pZCB0byBpbnRlcmFjdCB3aXRoIGl0IG1vcmUgZWZmaWNpZW50bHkgYXQgcnVuIHRpbWUgYW5kIHRodXMgaGFzIHRoZSBwb3RlbnRpYWwgdG8gbWFrZSBpdCBhbmQgdGhlIG92ZXJhbGwgc3lzdGVtIHJ1biBmYXN0ZXIuIFRoaXMgYXJ0aWNsZSBwcm92aWRlcyBhIGhpZ2gtbGV2ZWwgb3ZlcnZpZXcgb2YgdGhlIHppcGFsaWduIHRvb2wgYW5kIGl0cyB1c2UuJworICAgIH0KKyAgfSwKKworLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vIFNBTVBMRSBDT0RFIC8vLworLy8vLy8vLy8vLy8vLy8vLy8vLworCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdsYXlvdXQnLCAndWknXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9BcGlEZW1vcy9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdBUEkgRGVtb3MnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIHZhcmlldHkgb2Ygc21hbGwgYXBwbGljYXRpb25zIHRoYXQgZGVtb25zdHJhdGUgYW4gZXh0ZW5zaXZlIGNvbGxlY3Rpb24gb2YgZnJhbWV3b3JrIHRvcGljcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnZGF0YScsICduZXdmZWF0dXJlJywgJ2FjY291bnRzeW5jJywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL0JhY2t1cFJlc3RvcmUvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQmFja3VwIGFuZCBSZXN0b3JlJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnSWxsdXN0cmF0ZXMgYSBmZXcgZGlmZmVyZW50IGFwcHJvYWNoZXMgdGhhdCBhbiBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgY2FuIHRha2Ugd2hlbiBpbnRlZ3JhdGluZyB3aXRoIHRoZSBBbmRyb2lkIEJhY2t1cCBNYW5hZ2VyIHVzaW5nIHRoZSBCYWNrdXBBZ2VudCBBUEkgaW50cm9kdWNlZCBpbiBBbmRyb2lkIDIuMi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnY29tbXVuaWNhdGlvbiddLAorICAgIHBhdGg6ICdzYW1wbGVzL0JsdWV0b290aENoYXQvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQmx1ZXRvb3RoIENoYXQnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBhcHBsaWNhdGlvbiBmb3IgdHdvLXdheSB0ZXh0IG1lc3NhZ2luZyBvdmVyIEJsdWV0b290aC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnYWNjb3VudHN5bmMnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9CdXNpbmVzc0NhcmQvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQnVzaW5lc3NDYXJkJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW4gYXBwbGljYXRpb24gdGhhdCBkZW1vbnN0cmF0ZXMgaG93IHRvIGxhdW5jaCB0aGUgYnVpbHQtaW4gY29udGFjdCBwaWNrZXIgZnJvbSB3aXRoaW4gYW4gYWN0aXZpdHkuIFRoaXMgc2FtcGxlIGFsc28gdXNlcyByZWZsZWN0aW9uIHRvIGVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0IHZlcnNpb24gb2YgdGhlIGNvbnRhY3RzIEFQSSBpcyB1c2VkLCBkZXBlbmRpbmcgb24gd2hpY2ggQVBJIGxldmVsIHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIHVuZGVyLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdhY2NvdW50c3luYyddLAorICAgIHBhdGg6ICdzYW1wbGVzL0NvbnRhY3RNYW5hZ2VyL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0NvbnRhY3QgTWFuYWdlcicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGFwcGxpY2F0aW9uIHRoYXQgZGVtb25zdHJhdGVzIGhvdyB0byBxdWVyeSB0aGUgc3lzdGVtIGNvbnRhY3RzIHByb3ZpZGVyICB1c2luZyB0aGUgPGNvZGU+Q29udGFjdHNDb250cmFjdDwvY29kZT4gQVBJLCBhcyB3ZWxsIGFzIGluc2VydCBjb250YWN0cyBpbnRvIGEgc3BlY2lmaWMgYWNjb3VudC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9Ib21lL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0hvbWUnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIGhvbWUgc2NyZWVuIHJlcGxhY2VtZW50IGFwcGxpY2F0aW9uLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdnYW1lZGV2JywgJ21lZGlhJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvSmV0Qm95L2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0pldEJveScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgZ2FtZSB0aGF0IGRlbW9uc3RyYXRlcyB0aGUgU09OaVZPWCBKRVQgaW50ZXJhY3RpdmUgbXVzaWMgdGVjaG5vbG9neSwgd2l0aCA8Y29kZT48YSBocmVmPSIvcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvSmV0UGxheWVyLmh0bWwiPkpldFBsYXllcjwvYT48L2NvZGU+LicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICd1aScsICduZXdmZWF0dXJlJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvQ3ViZUxpdmVXYWxscGFwZXIvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGl2ZSBXYWxscGFwZXInCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBhcHBsaWNhdGlvbiB0aGF0IGRlbW9uc3RyYXRlcyBob3cgdG8gY3JlYXRlIGEgbGl2ZSB3YWxscGFwZXIgYW5kICBidW5kbGUgaXQgaW4gYW4gYXBwbGljYXRpb24gdGhhdCB1c2VycyBjYW4gaW5zdGFsbCBvbiB0aGVpciBkZXZpY2VzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdnYW1lZGV2JywgJ21lZGlhJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvTHVuYXJMYW5kZXIvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTHVuYXIgTGFuZGVyJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBjbGFzc2ljIEx1bmFyIExhbmRlciBnYW1lLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICd1aScsICdiZXN0cHJhY3RpY2UnLCAnbGF5b3V0J10sCisgICAgcGF0aDogJ3NhbXBsZXMvTXVsdGlSZXNvbHV0aW9uL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ011bHRpcGxlIFJlc29sdXRpb25zJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBzYW1wbGUgYXBwbGljYXRpb24gdGhhdCBzaG93cyBob3cgdG8gdXNlIHJlc291cmNlIGRpcmVjdG9yeSBxdWFsaWZpZXJzIHRvIHByb3ZpZGUgZGlmZmVyZW50IHJlc291cmNlcyBmb3IgZGlmZmVyZW50IHNjcmVlbiBjb25maWd1cmF0aW9ucy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnZGF0YSddLAorICAgIHBhdGg6ICdzYW1wbGVzL05vdGVQYWQvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTm90ZSBQYWQnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBhcHBsaWNhdGlvbiBmb3Igc2F2aW5nIG5vdGVzLiBTaW1pbGFyIChidXQgbm90IGlkZW50aWNhbCkgdG8gdGhlIDxhIGhyZWY9Ii9yZXNvdXJjZXMvdHV0b3JpYWxzL25vdGVwYWQvaW5kZXguaHRtbCI+Tm90ZXBhZCB0dXRvcmlhbDwvYT4uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2FjY291bnRzeW5jJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnU2FtcGxlU3luY0FkYXB0ZXInCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdEZW1vbnN0cmF0ZXMgaG93IGFuIGFwcGxpY2F0aW9uIGNhbiBjb21tdW5pY2F0ZSB3aXRoIGEgY2xvdWQtYmFzZWQgc2VydmljZSBhbmQgc3luY2hyb25pemUgaXRzIGRhdGEgd2l0aCBkYXRhIHN0b3JlZCBsb2NhbGx5IGluIGEgY29udGVudCBwcm92aWRlci4gVGhlIHNhbXBsZSB1c2VzIHR3byByZWxhdGVkIHBhcnRzIG9mIHRoZSBBbmRyb2lkIGZyYW1ld29yayAmbWRhc2g7IHRoZSBhY2NvdW50IG1hbmFnZXIgYW5kIHRoZSBzeW5jaHJvbml6YXRpb24gbWFuYWdlciAodGhyb3VnaCBhIHN5bmMgYWRhcHRlcikuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3VpJywgJ3NlYXJjaCcsICduZXcnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9TZWFyY2hhYmxlRGljdGlvbmFyeS9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdTZWFyY2hhYmxlIERpY3Rpb25hcnkgdjInCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIHNhbXBsZSBhcHBsaWNhdGlvbiB0aGF0IGRlbW9uc3RyYXRlcyBBbmRyb2lkXCdzIHNlYXJjaCBmcmFtZXdvcmssIGluY2x1ZGluZyBob3cgdG8gcHJvdmlkZSBzZWFyY2ggc3VnZ2VzdGlvbnMgZm9yIFF1aWNrIFNlYXJjaCBCb3guJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2xheW91dCcsICd1aSddLAorICAgIHBhdGg6ICdzYW1wbGVzL1NuYWtlL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1NuYWtlJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGNsYXNzaWMgZ2FtZSAiU25ha2UuIicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICd0ZXN0aW5nJywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL1NwaW5uZXIvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnU3Bpbm5lcicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0Egc2ltcGxlIGFwcGxpY2F0aW9uIHRoYXQgc2VydmVzIGFzIGFuIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgZm9yIHRoZSBTcGlubmVyVGVzdCBleGFtcGxlLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICd0ZXN0aW5nJywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL1NwaW5uZXJUZXN0L2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1NwaW5uZXJUZXN0JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhlIHRlc3QgYXBwbGljYXRpb24gZm9yIHRoZSBBY3Rpdml0eSBUZXN0aW5nIHR1dG9yaWFsLiBJdCB0ZXN0cyB0aGUgU3Bpbm5lciBleGFtcGxlIGFwcGxpY2F0aW9uLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICduZXdmZWF0dXJlJywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL1RpY1RhY1RvZUxpYi9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdUaWNUYWNUb2VMaWInCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBleGFtcGxlIG9mIGFuIEFuZHJvaWQgbGlicmFyeSBwcm9qZWN0LCBhIHR5cGUgb2YgcHJvamVjdCB0aGF0IGxldHMgeW91IHN0b3JlIGFuZCBtYW5hZ2Ugc2hhcmVkIGNvZGUgYW5kIHJlc291cmNlcyBpbiBvbmUgcGxhY2UsIHRoZW4gbWFrZSB0aGVtIGF2YWlsYWJsZSB0byB5b3VyIG90aGVyIEFuZHJvaWQgYXBwbGljYXRpb25zLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICduZXdmZWF0dXJlJywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL1RpY1RhY1RvZU1haW4vaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVGljVGFjVG9lTWFpbicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0RlbW9uc3RyYXRlcyBob3cgYW4gYXBwbGljYXRpb24gY2FuIG1ha2UgdXNlIG9mIHNoYXJlZCBjb2RlIGFuZCByZXNvdXJjZXMgc3RvcmVkIGluIGFuIEFuZHJvaWQgbGlicmFyeSBwcm9qZWN0LicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdpbnB1dCddLAorICAgIHBhdGg6ICdzYW1wbGVzL1NvZnRLZXlib2FyZC9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdTb2Z0IEtleWJvYXJkJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW4gZXhhbXBsZSBvZiB3cml0aW5nIGFuIGlucHV0IG1ldGhvZCBmb3IgYSBzb2Z0d2FyZSBrZXlib2FyZC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAndWknXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9XaWt0aW9uYXJ5L2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1dpa3Rpb25hcnknCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBleGFtcGxlIG9mIGNyZWF0aW5nIGludGVyYWN0aXZlIHdpZGdldHMgZm9yIGRpc3BsYXkgb24gdGhlIEFuZHJvaWQgaG9tZSBzY3JlZW4uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3VpJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvV2lrdGlvbmFyeVNpbXBsZS9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdXaWt0aW9uYXJ5IChTaW1wbGlmaWVkKScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0Egc2ltcGxlIEFuZHJvaWQgaG9tZSBzY3JlZW4gd2lkZ2V0cyBleGFtcGxlLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdsYXlvdXQnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvWG1sQWRhcHRlcnMvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnWE1MIEFkYXB0ZXJzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQmluZGluZyBkYXRhIHRvIHZpZXdzIHVzaW5nIFhNTCBBZGFwdGVycyBleGFtcGxlcy4nCisgICAgfQorICB9LAorCisvLy8vLy8vLy8vLy8vLy8vLworLy8vIFRVVE9SSUFMUyAvLy8KKy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgeworICAgIHRhZ3M6IFsndHV0b3JpYWwnXSwKKyAgICBwYXRoOiAndHV0b3JpYWxzL2hlbGxvLXdvcmxkLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0hlbGxvIFdvcmxkJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQmVnaW5uaW5nIGJhc2ljIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IHdpdGggdGhlIEFuZHJvaWQgU0RLLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3R1dG9yaWFsJywgJ3VpJywgJ2xheW91dCddLAorICAgIHBhdGg6ICd0dXRvcmlhbHMvdmlld3MvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSGVsbG8gVmlld3MnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIHdhbGstdGhyb3VnaCBvZiB0aGUgdmFyaW91cyB0eXBlcyBvZiBsYXlvdXRzIGFuZCB2aWV3cyBhdmFpbGFibGUgaW4gdGhlIEFuZHJvaWQgU0RLLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3R1dG9yaWFsJywgJ3VpJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICd0dXRvcmlhbHMvbG9jYWxpemF0aW9uL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0hlbGxvIExvY2FsaXphdGlvbicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoZSBiYXNpY3Mgb2YgbG9jYWxpemluZyB5b3VyIGFwcGxpY2F0aW9ucyBmb3IgbXVsdGlwbGUgbGFuZ3VhZ2VzIGFuZCBsb2NhbGVzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3R1dG9yaWFsJywgJ2RhdGEnXSwKKyAgICBwYXRoOiAndHV0b3JpYWxzL25vdGVwYWQvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTm90ZXBhZCBUdXRvcmlhbCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgbXVsdGktcGFydCB0dXRvcmlhbCBkaXNjdXNzaW5nIGludGVybWVkaWF0ZS1sZXZlbCBjb25jZXB0cyBzdWNoIGFzIGRhdGEgYWNjZXNzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3R1dG9yaWFsJywgJ3Rlc3RpbmcnLCAnbmV3J10sCisgICAgcGF0aDogJ3R1dG9yaWFscy90ZXN0aW5nL2hlbGxvYW5kcm9pZF90ZXN0Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0hlbGxvIFRlc3RpbmcnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIGJhc2ljIGludHJvZHVjdGlvbiB0byB0aGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yay4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWyd0dXRvcmlhbCcsICd0ZXN0aW5nJywgJ25ldyddLAorICAgIHBhdGg6ICd0dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0FjdGl2aXR5IFRlc3RpbmcnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIG1vcmUgYWR2YW5jZWQgZGVtb25zdHJhdGlvbiBvZiB0aGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yayBhbmQgdG9vbHMuJworICAgIH0KKyAgfQorXTsKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvcmVzb3VyY2VzX3RvYy5jcyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvcmVzb3VyY2VzX3RvYy5jcwppbmRleCA1MjY4OWI2Li5hMTcxMWI1IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlc190b2MuY3MKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXNfdG9jLmNzCkBAIC0xLDUgKzEsNTYgQEAKIDx1bD4KICAgPGxpPgorICAgIDxoMj48c3BhbiBjbGFzcz0iZW4iPlRlY2huaWNhbCBSZXNvdXJjZXM8L3NwYW4+CisgICAgPC9oMj4KKyAgICA8dWw+CisgICAgICA8bGkgY2xhc3M9InRvZ2dsZS1saXN0Ij4KKyAgICAgICAgPGRpdj48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1zYW1wbGUiPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5TYW1wbGUgQ29kZTwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+QmVpc3BpZWxjb2RlPC9zcGFuPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVzIiBzdHlsZT0iZGlzcGxheTpub25lIj5Dw7NkaWdvIGRlIGVqZW1wbG88L3NwYW4+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZnIiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkV4ZW1wbGUgZGUgY29kZTwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpdCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+Q29kaWNlIGRpIGVzZW1waW88L3NwYW4+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamEiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPuOCteODs+ODl+ODqyDjgrPjg7zjg4k8L3NwYW4+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtQ04iIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6aC1UVyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9zcGFuPgorICAgICAgICAgIDwvYT48L2Rpdj4KKyAgICAgICAgPHVsIGlkPSJkZXZkb2MtbmF2LXNhbXBsZS1saXN0Ij4KKyAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvZ2V0Lmh0bWwiPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+R2V0dGluZyB0aGUgU2FtcGxlczwvc3Bhbj4KKyAgICAgICAgICAgICAgPC9hPjwvbGk+CisgICAgICAgIDwvdWw+CisgICAgICA8L2xpPgorICAgICAgPGxpIGNsYXNzPSJ0b2dnbGUtbGlzdCI+CisgICAgICAgIDxkaXY+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9YXJ0aWNsZSI+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkFydGljbGVzPC9zcGFuPgorICAgICAgICAgICAgIDwvYT48L2Rpdj4KKyAgICAgICAgPHVsIGlkPSJkZXZkb2MtbmF2LWFydGljbGUtbGlzdCI+CisgICAgICAgIDwvdWw+CisgICAgICA8L2xpPgorICAgICAgPGxpIGNsYXNzPSJ0b2dnbGUtbGlzdCI+CisgICAgICAgIDxkaXY+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9dHV0b3JpYWwiPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5UdXRvcmlhbHM8L3NwYW4+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGUiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkxlcm5wcm9ncmFtbWU8L3NwYW4+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXMiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPlR1dG9yaWFsZXM8L3NwYW4+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZnIiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkRpZGFjdGljaWVsczwvc3Bhbj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpdCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+RXNlcmNpdGF6aW9uaTwvc3Bhbj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+44OB44Ol44O844OI44Oq44Ki44OrPC9zcGFuPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InpoLUNOIiBzdHlsZT0iZGlzcGxheTpub25lIj48L3NwYW4+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtVFciIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KKyAgICAgICAgICAgICA8L2E+PC9kaXY+CisgICAgICAgIDx1bCBpZD0iZGV2ZG9jLW5hdi10dXRvcmlhbC1saXN0Ij4KKyAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CisgICAgICA8bGkgY2xhc3M9InRvZ2dsZS1saXN0Ij4KKyAgICAgICAgPGRpdj48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvdG9waWNzLmh0bWwiPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Ub3BpY3M8L3NwYW4+CisgICAgICAgICAgICAgPC9hPjwvZGl2PgorICAgICAgICA8dWwgaWQ9ImRldmRvYy1uYXYtdG9waWMtbGlzdCI+CisgICAgICAgIDwvdWw+CisgICAgICA8L2xpPgorICAgIDwvdWw+CisgIDwvbGk+CisgIDxsaT4KICAgICA8aDI+PHNwYW4gY2xhc3M9ImVuIj5Db21tdW5pdHk8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0iZGUiPjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmUiIGNsYXNzPSJlcyI+Q29tdW5pZGFkPC9zcGFuPgpAQCAtMzQsMjQxICs4NSw2IEBACiAgIDwvbGk+PD9jcwogICAvaWYKID8+Ci0KLSAgPGxpPgotICAgIDxoMj48c3BhbiBjbGFzcz0iZW4iPlRlY2huaWNhbCBBcnRpY2xlczwvc3Bhbj4KLSAgICA8L2gyPgotICAgIDx1bD4KLSAgICAgIDxsaSBjbGFzcz0idG9nZ2xlLWxpc3QiPgotICAgICAgICA8ZGl2PjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGlzdCBvZiBBcnRpY2xlczwvc3Bhbj4KLSAgICAgICAgICAgICA8L2E+PC9kaXY+Ci0gICAgICAgIDx1bD4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9hdm9pZGluZy1tZW1vcnktbGVha3MuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Bdm9pZGluZyBNZW1vcnkgTGVha3M8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvYmFja3dhcmQtY29tcGF0aWJpbGl0eS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkJhY2t3YXJkIENvbXBhdGliaWxpdHk8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvY2FuLWktdXNlLXRoaXMtaW50ZW50Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+Q2FuIEkgVXNlIHRoaXMgSW50ZW50Pzwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9jcmVhdGluZy1pbnB1dC1tZXRob2QuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5DcmVhdGluZyBhbiBJbnB1dCBNZXRob2Q8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvZHJhd2FibGUtbXV0YXRpb25zLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+RHJhd2FibGUgTXV0YXRpb25zPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2Zhc3Rlci1zY3JlZW4tb3JpZW50YXRpb24tY2hhbmdlLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+RmFzdGVyIFNjcmVlbiBPcmllbnRhdGlvbiBDaGFuZ2U8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvZnV0dXJlLXByb29maW5nLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+RnV0dXJlLVByb29maW5nIFlvdXIgQXBwczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9nZXN0dXJlcy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkdlc3R1cmVzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2dsc3VyZmFjZXZpZXcuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5JbnRyb2R1Y2luZyBHTFN1cmZhY2VWaWV3PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2xheW91dC10cmlja3MtcmV1c2UuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MYXlvdXQgVHJpY2tzOiBSZXVzaW5nIDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9sYXlvdXQtdHJpY2tzLWVmZmljaWVuY3kuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MYXlvdXQgVHJpY2tzOiBFZmZpY2llbmN5PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2xheW91dC10cmlja3Mtc3R1YnMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MYXlvdXQgVHJpY2tzOiBWaWV3U3R1YnMgPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2xheW91dC10cmlja3MtbWVyZ2UuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MYXlvdXQgVHJpY2tzOiBNZXJnaW5nIDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9saXN0dmlldy1iYWNrZ3JvdW5kcy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxpc3RWaWV3IEJhY2tncm91bmRzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2xpdmUtZm9sZGVycy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxpdmUgRm9sZGVyczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9saXZlLXdhbGxwYXBlcnMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MaXZlIFdhbGxwYXBlcnM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvb24tc2NyZWVuLWlucHV0cy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPk9uc2NyZWVuIElucHV0IE1ldGhvZHM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvcGFpbmxlc3MtdGhyZWFkaW5nLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+UGFpbmxlc3MgVGhyZWFkaW5nPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3FzYi5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlF1aWNrIFNlYXJjaCBCb3g8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvc3BlZWNoLWlucHV0Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U3BlZWNoIElucHV0PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3RvdWNoLW1vZGUuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Ub3VjaCBNb2RlPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3RyYWNrLW1lbS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlRyYWNraW5nIE1lbW9yeSBBbGxvY2F0aW9uczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy91aS0xLjUuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5VSSBGcmFtZXdvcmsgQ2hhbmdlcyBpbiBBbmRyb2lkIDEuNTwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy91aS0xLjYuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5VSSBGcmFtZXdvcmsgQ2hhbmdlcyBpbiBBbmRyb2lkIDEuNjwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy90aW1lZC11aS11cGRhdGVzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VXBkYXRpbmcgdGhlIFVJIGZyb20gYSBUaW1lcjwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy90dHMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Vc2luZyBUZXh0LXRvLVNwZWVjaDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9jb250YWN0cy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlVzaW5nIHRoZSBDb250YWN0cyBBUEk8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvdXNpbmctd2Vidmlld3MuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Vc2luZyBXZWJWaWV3czwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy93aWtpbm90ZXMtbGlua2lmeS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPldpa2lOb3RlczogTGlua2lmeSB5b3VyIFRleHQhPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3dpa2lub3Rlcy1pbnRlbnRzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+V2lraU5vdGVzOiBSb3V0aW5nIEludGVudHM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvd2luZG93LWJnLXNwZWVkLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+V2luZG93IEJhY2tncm91bmRzICZhbXA7IFVJIFNwZWVkPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3ppcGFsaWduLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+WmlwYWxpZ246IEFuIEVhc3kgT3B0aW1pemF0aW9uPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8L3VsPgotICAgICAgPC9saT4KLSAgICA8L3VsPgotICAgPC9saT4KLQotICA8bGk+Ci0gICAgPGgyPjxzcGFuIGNsYXNzPSJlbiI+VHV0b3JpYWxzPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRlIiBzdHlsZT0iZGlzcGxheTpub25lIj5MZXJucHJvZ3JhbW1lPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVzIiBzdHlsZT0iZGlzcGxheTpub25lIj5UdXRvcmlhbGVzPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZyIiBzdHlsZT0iZGlzcGxheTpub25lIj5EaWRhY3RpY2llbHM8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaXQiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkVzZXJjaXRhemlvbmk8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamEiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPuODgeODpeODvOODiOODquOCouODqzwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6aC1DTiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InpoLVRXIiBzdHlsZT0iZGlzcGxheTpub25lIj48L3NwYW4+Ci0gICAgPC9oMj4KLSAgICA8dWw+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3R1dG9yaWFscy9oZWxsby13b3JsZC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+SGVsbG8gV29ybGQ8L3NwYW4+Ci0gICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3R1dG9yaWFscy92aWV3cy9pbmRleC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+SGVsbG8gVmlld3M8L3NwYW4+Ci0gICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3R1dG9yaWFscy9sb2NhbGl6YXRpb24vaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkhlbGxvIExvY2FsaXphdGlvbjwvc3Bhbj4KLSAgICAgICAgICA8L2E+PC9saT4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkhlbGxvIFRlc3Rpbmc8L3NwYW4+PC9hPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3R1dG9yaWFscy9ub3RlcGFkL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Ob3RlcGFkIFR1dG9yaWFsPC9zcGFuPgotICAgICAgICAgIDwvYT48L2xpPgotICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5BY3Rpdml0eSBUZXN0aW5nPC9zcGFuPjwvYT4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+Ci0gICAgICA8L2xpPgotICAgIDwvdWw+Ci0gIDwvbGk+Ci0KLQotICA8bGk+Ci0gICAgPGgyPjxzcGFuIGNsYXNzPSJlbiI+U2FtcGxlIENvZGU8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGUiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkJlaXNwaWVsY29kZTwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+Q8OzZGlnbyBkZSBlamVtcGxvPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZyIiBzdHlsZT0iZGlzcGxheTpub25lIj5FeGVtcGxlIGRlIGNvZGU8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaXQiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkNvZGljZSBkaSBlc2VtcGlvPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphIiBzdHlsZT0iZGlzcGxheTpub25lIj7jgrXjg7Pjg5fjg6sg44Kz44O844OJPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InpoLUNOIiBzdHlsZT0iZGlzcGxheTpub25lIj48L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtVFciIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KLSAgICA8L2gyPgotICAgIDx1bD4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9nZXQuaHRtbCI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkdldHRpbmcgdGhlIFNhbXBsZXM8L3NwYW4+Ci0gICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICA8bGkgY2xhc3M9InRvZ2dsZS1saXN0Ij4KLSAgICAgICAgPGRpdj48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGlzdCBvZiBTYW1wbGVzPC9zcGFuPgotICAgICAgICAgICAgIDwvYT48L2Rpdj4KLSAgICAgICAgPHVsPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9BcGlEZW1vcy9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkFQSSBEZW1vczwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0JhY2t1cFJlc3RvcmUvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5CYWNrdXAgYW5kIFJlc3RvcmU8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT4gPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9CbHVldG9vdGhDaGF0L2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+Qmx1ZXRvb3RoIENoYXQ8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9CdXNpbmVzc0NhcmQvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5CdXNpbmVzcyBDYXJkPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvQ29udGFjdE1hbmFnZXIvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Db250YWN0IE1hbmFnZXI8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9Ib21lL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+SG9tZTwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0pldEJveS9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkpldEJveTwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0N1YmVMaXZlV2FsbHBhcGVyL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGl2ZSBXYWxscGFwZXI8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0x1bmFyTGFuZGVyL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+THVuYXIgTGFuZGVyPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvTXVsdGlSZXNvbHV0aW9uL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TXVsdGlwbGUgUmVzb2x1dGlvbnM8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9Ob3RlUGFkL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+Tm90ZSBQYWQ8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNhbXBsZSBTeW5jIEFkYXB0ZXI8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9TZWFyY2hhYmxlRGljdGlvbmFyeS9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNlYXJjaGFibGUgRGljdGlvbmFyeSB2Mjwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPiA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1NuYWtlL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U25ha2U8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9Tb2Z0S2V5Ym9hcmQvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Tb2Z0IEtleWJvYXJkPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvU3Bpbm5lci9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNwaW5uZXI8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPiA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1NwaW5uZXJUZXN0L2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U3Bpbm5lclRlc3Q8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPiA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1RpY1RhY1RvZUxpYi9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlRpY1RhY1RvZUxpYjwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+IDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvVGljVGFjVG9lTWFpbi9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlRpY1RhY1RvZU1haW48L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPiA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1dpa3Rpb25hcnkvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5XaWt0aW9uYXJ5PC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvV2lrdGlvbmFyeVNpbXBsZS9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPldpa3Rpb25hcnkgKFNpbXBsaWZpZWQpPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPC91bD4KLSAgICAgIDwvbGk+Ci0gICAgPC91bD4KLSAgPC9saT4KLQotCi0KICAgPGxpPgogICAgIDxoMj48c3BhbiBjbGFzcz0iZW4iPk1vcmU8L3NwYW4+CiAgICAgPC9oMj4KQEAgLTI5Nyw4ICsxMTMsNiBAQAogICAgICA8L2xpPgogICAgIDwvdWw+CiAgIDwvbGk+Ci0KLQogPC91bD4KIAogPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9YbWxQaG90b3NBZGFwdGVyLnBuZyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvc2FtcGxlcy9pbWFnZXMvWG1sUGhvdG9zQWRhcHRlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAxOGQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvc2FtcGxlcy9pbWFnZXMvWG1sUGhvdG9zQWRhcHRlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9YbWxSc3NSZWFkZXIucG5nIGIvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9YbWxSc3NSZWFkZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZjg0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3NhbXBsZXMvaW1hZ2VzL1htbFJzc1JlYWRlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9zYW1wbGVfbm90ZXBhZHRlc3RfanVuaXQucG5nIGIvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9zYW1wbGVfbm90ZXBhZHRlc3RfanVuaXQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZGE1NGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3NhbXBsZXMvaW1hZ2VzL3NhbXBsZV9ub3RlcGFkdGVzdF9qdW5pdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy90b3BpY3MuamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3RvcGljcy5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTk2MGZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy90b3BpY3MuamQKQEAgLTAsMCArMSw3MiBAQAorcGFnZS50aXRsZT1UZWNobmljYWwgUmVzb3VyY2UgVG9waWNzCitAamQ6Ym9keQorCis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAjcmVzb3VyY2UtdG9waWMtdGFibGUgdGQgeworICAgIGJvcmRlcjogMDsKKyAgICBwYWRkaW5nOiAwOworICAgIG1hcmdpbjogMDsKKyAgICBwYWRkaW5nLWxlZnQ6IDFlbTsKKyAgICB3aWR0aDogMThlbTsKKyAgfQorCisgICNyZXNvdXJjZS10b3BpYy10YWJsZSB1bCB7CisgICAgcGFkZGluZzogMDsKKyAgICBtYXJnaW46IDA7CisgIH0KKworICAjcmVzb3VyY2UtdG9waWMtdGFibGUgbGkgeworICAgIGxpc3Qtc3R5bGU6IG5vbmU7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmc6IDA7CisgIH0KKzwvc3R5bGU+CisKKzxwPgorWW91IGNhbiBicm93c2UgdGhlIGxpc3Qgb2YgdGVjaG5pY2FsIHJlc291cmNlcyBieSB0b3BpYyBieSBjbGlja2luZyBvbiB0aGUKK2xpbmtzIGJlbG93LiBPdmVyIHRpbWUsIGFzIG1vcmUgdG9waWNzIGFyZSBhZGRlZCwgdGhleSB3aWxsIGJlIGFkZGVkIHRvIHRoZQorbGlzdCBiZWxvdy4KKzwvcD4KKworPG5vc2NyaXB0PgorICA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5FcnJvcjo8L3N0cm9uZz4KKyAgICBZb3UgbXVzdCBoYXZlIEphdmFTY3JpcHQgZW5hYmxlZCB0byB2aWV3IHRoaXMgcGFnZS4gUmVzb3VyY2VzIGFyZSBhbHNvCisgICAgYXZhaWxhYmxlIG9mZmxpbmUgaW4gdGhlIFNESy4KKyAgPC9wPgorPC9ub3NjcmlwdD4KKworPHRhYmxlIGlkPSJyZXNvdXJjZS10b3BpYy10YWJsZSI+CisgIDx0cj48L3RyPgorPC90YWJsZT4KKworPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorPCEtLSAKKyhmdW5jdGlvbigpIHsKKyAgdmFyIHRvcGljcyA9IFtdOworICBmb3IgKHZhciB0b3BpYyBpbiBBTkRST0lEX1RBR1NbJ3RvcGljJ10pIHsKKyAgICB0b3BpY3MucHVzaCh7bmFtZTp0b3BpYyx0aXRsZTpBTkRST0lEX1RBR1NbJ3RvcGljJ11bdG9waWNdfSk7CisgIH0KKyAgdG9waWNzLnNvcnQoZnVuY3Rpb24oeCx5KXsgcmV0dXJuICh4LnRpdGxlIDwgeS50aXRsZSkgPyAtMSA6IDE7IH0pOworICB2YXIgdG9waWNQYXJlbnQgPSBudWxsOworICBmb3IgKHZhciBpID0gMDsgaSA8IHRvcGljcy5sZW5ndGg7IGkrKykgeworICAgIGlmICh0b3BpY1BhcmVudCA9PSBudWxsIHx8IGkgJSAxMCA9PSAwKSB7CisgICAgICAvLyBjcmVhdGUgYSBuZXcgY29sdW1uCisgICAgICB0b3BpY1BhcmVudCA9ICQoJ3VsJywgJCgnPHRkPjx1bD4nKS5hcHBlbmRUbygnI3Jlc291cmNlLXRvcGljLXRhYmxlIHRyJykpOworICAgIH0KKworICAgIHRvcGljUGFyZW50LmFwcGVuZCgKKyAgICAgICAgJCgnPGxpPicpLmFwcGVuZCgKKyAgICAgICAgICAkKCc8aDM+JykuYXBwZW5kKAorICAgICAgICAgICAgJCgnPGE+JykKKyAgICAgICAgICAgICAgLmF0dHIoJ2hyZWYnLCB0b1Jvb3QgKyAicmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9IiArIHRvcGljc1tpXS5uYW1lKQorICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxzcGFuPicpCisgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdlbicpCisgICAgICAgICAgICAgICAgLmh0bWwodG9waWNzW2ldLnRpdGxlKQorICAgICAgICAgICAgICApCisgICAgICAgICAgICApCisgICAgICAgICAgKQorICAgICAgICApOworICB9Cit9KSgpOworLy8tLT4KKzwvc2NyaXB0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvdHV0b3JpYWxzL25vdGVwYWQvbm90ZXBhZC1leDIuamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3R1dG9yaWFscy9ub3RlcGFkL25vdGVwYWQtZXgyLmpkCmluZGV4IDI4OWI1ZmUuLjQ5OWI3OTYgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvdHV0b3JpYWxzL25vdGVwYWQvbm90ZXBhZC1leDIuamQKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy90dXRvcmlhbHMvbm90ZXBhZC9ub3RlcGFkLWV4Mi5qZApAQCAtODcsOCArODcsOCBAQAogICAgIG1lbnUgY2FsbGJhY2sgdXNlZCBmb3IgdGhlIG9wdGlvbnMgbWVudS4gSGVyZSwgd2UgYWRkIGp1c3Qgb25lIGxpbmUsIHdoaWNoIHdpbGwgYWRkIGEgbWVudSBpdGVtCiAgICAgdG8gZGVsZXRlIGEgbm90ZS4gQ2FsbCA8Y29kZT5tZW51LmFkZCgpPC9jb2RlPiBsaWtlIHNvOgogICAgICAgPHByZT4KLXB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQ29udGV4dE1lbnUoTWVudSBtZW51LCBWaWV3IHYKLSAgICAgICAgQ29udGV4dE1lbnVJbmZvIG1lbnVJbmZvKSB7CitwdWJsaWMgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KE1lbnUgbWVudSwgVmlldyB2LAorICAgICAgICBDb250ZXh0TWVudS5Db250ZXh0TWVudUluZm8gbWVudUluZm8pIHsKICAgICBzdXBlci5vbkNyZWF0ZUNvbnRleHRNZW51KG1lbnUsIHYsIG1lbnVJbmZvKTsKICAgICBtZW51LmFkZCgwLCBERUxFVEVfSUQsIDAsIFIuc3RyaW5nLm1lbnVfZGVsZXRlKTsKIH08L3ByZT4KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuamF2YQppbmRleCBkZDgzYzNiLi5kMjgzZGVhMyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuamF2YQpAQCAtMTksMTIgKzE5LDE2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRmluYWxpemVyczsKIAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubmlvLkJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLkludEJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5TaG9ydEJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogcHVibGljIGZpbmFsIGNsYXNzIEJpdG1hcCBpbXBsZW1lbnRzIFBhcmNlbGFibGUgewogICAgIC8qKgpAQCAtMzUsOSArMzksMTMgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERU5TSVRZX05PTkUgPSAwOwogICAgIAotICAgIC8vIE5vdGU6ICBtTmF0aXZlQml0bWFwIGlzIHVzZWQgYnkgRmFjZURldGVjdG9yX2puaS5jcHAKLSAgICAvLyBEb24ndCBjaGFuZ2UvcmVuYW1lIHdpdGhvdXQgdXBkYXRpbmcgRmFjZURldGVjdG9yX2puaS5jcHAKLSAgICBwcml2YXRlIGZpbmFsIGludCBtTmF0aXZlQml0bWFwOworICAgIC8qKgorICAgICAqIE5vdGU6ICBtTmF0aXZlQml0bWFwIGlzIHVzZWQgYnkgRmFjZURldGVjdG9yX2puaS5jcHAKKyAgICAgKiBEb24ndCBjaGFuZ2UvcmVuYW1lIHdpdGhvdXQgdXBkYXRpbmcgRmFjZURldGVjdG9yX2puaS5jcHAKKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgbU5hdGl2ZUJpdG1hcDsKIAogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNNdXRhYmxlOwogICAgIHByaXZhdGUgYnl0ZVtdIG1OaW5lUGF0Y2hDaHVuazsgICAvLyBtYXkgYmUgbnVsbApAQCAtNTEsNyArNTksNyBAQAogICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIE1hdHJpeCBzU2NhbGVNYXRyaXg7CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBpbnQgc0RlZmF1bHREZW5zaXR5ID0gLTE7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGFsbG93cyB0aGUgYXBwIGxheWVyIHRvIGNoYW5nZSB0aGUgZGVmYXVsdAogICAgICAqIGRlbnNpdHkgd2hlbiBydW5uaW5nIG9sZCBhcHBzLgpAQCAtNzcsOCArODUsNyBAQAogCiAgICAgICAgIFRoaXMgY2FuIGJlIGNhbGxlZCBmcm9tIEpOSSBjb2RlLgogICAgICovCi0gICAgcHJpdmF0ZSBCaXRtYXAoaW50IG5hdGl2ZUJpdG1hcCwgYm9vbGVhbiBpc011dGFibGUsIGJ5dGVbXSBuaW5lUGF0Y2hDaHVuaywKLSAgICAgICAgICAgIGludCBkZW5zaXR5KSB7CisgICAgcHJpdmF0ZSBCaXRtYXAoaW50IG5hdGl2ZUJpdG1hcCwgYm9vbGVhbiBpc011dGFibGUsIGJ5dGVbXSBuaW5lUGF0Y2hDaHVuaywgaW50IGRlbnNpdHkpIHsKICAgICAgICAgaWYgKG5hdGl2ZUJpdG1hcCA9PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaW50ZXJuYWwgZXJyb3I6IG5hdGl2ZSBiaXRtYXAgaXMgMCIpOwogICAgICAgICB9CkBAIC05MCw2ICs5NywxMyBAQAogICAgICAgICBpZiAoZGVuc2l0eSA+PSAwKSB7CiAgICAgICAgICAgICBtRGVuc2l0eSA9IGRlbnNpdHk7CiAgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgZmluYWxpemVycyBxdWV1ZSBpcyBudWxsLCB3ZSBhcmUgcnVubmluZyBpbiB6eWdvdGUgYW5kIHRoZQorICAgICAgICAvLyBiaXRtYXAgd2lsbCBuZXZlciBiZSByZWNsYWltZWQsIHNvIHdlIGRvbid0IG5lZWQgdG8gcnVuIG91ciBuYXRpdmUKKyAgICAgICAgLy8gZGVzdHJ1Y3RvcgorICAgICAgICBpZiAoRmluYWxpemVycy5nZXRRdWV1ZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIG5ldyBCaXRtYXBGaW5hbGl6ZXIodGhpcyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE3Miw2ICsxODYsMTkgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBnZW5lcmF0aW9uIElEIG9mIHRoaXMgYml0bWFwLiBUaGUgZ2VuZXJhdGlvbiBJRCBjaGFuZ2VzCisgICAgICogd2hlbmV2ZXIgdGhlIGJpdG1hcCBpcyBtb2RpZmllZC4gVGhpcyBjYW4gYmUgdXNlZCBhcyBhbiBlZmZpY2llbnQgd2F5IHRvCisgICAgICogY2hlY2sgaWYgYSBiaXRtYXAgaGFzIGNoYW5nZWQuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBnZW5lcmF0aW9uIElEIGZvciB0aGlzIGJpdG1hcC4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0R2VuZXJhdGlvbklkKCkgeworICAgICAgICByZXR1cm4gbmF0aXZlR2VuZXJhdGlvbklkKG1OYXRpdmVCaXRtYXApOworICAgIH0KKyAgICAKKyAgICAvKioKICAgICAgKiBUaGlzIGlzIGNhbGxlZCBieSBtZXRob2RzIHRoYXQgd2FudCB0byB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGJpdG1hcAogICAgICAqIGhhcyBhbHJlYWR5IGJlZW4gcmVjeWNsZWQuCiAgICAgICovCkBAIC00MjgsMjggKzQ1NSwzMCBAQAogICAgICAgICBSZWN0IHNyY1IgPSBuZXcgUmVjdCh4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQpOwogICAgICAgICBSZWN0RiBkc3RSID0gbmV3IFJlY3RGKDAsIDAsIHdpZHRoLCBoZWlnaHQpOwogCisgICAgICAgIGZpbmFsIENvbmZpZyBuZXdDb25maWcgPSBzb3VyY2UuZ2V0Q29uZmlnKCkgPT0gQ29uZmlnLkFSR0JfODg4OCA/CisgICAgICAgICAgICAgICAgQ29uZmlnLkFSR0JfODg4OCA6IENvbmZpZy5SR0JfNTY1OworCiAgICAgICAgIGlmIChtID09IG51bGwgfHwgbS5pc0lkZW50aXR5KCkpIHsKLSAgICAgICAgICAgIGJpdG1hcCA9IGNyZWF0ZUJpdG1hcChuZXd3LCBuZXdoLAotICAgICAgICAgICAgICAgICAgICBzb3VyY2UuaGFzQWxwaGEoKSA/IENvbmZpZy5BUkdCXzg4ODggOiBDb25maWcuUkdCXzU2NSk7CisgICAgICAgICAgICBiaXRtYXAgPSBjcmVhdGVCaXRtYXAobmV3dywgbmV3aCwgbmV3Q29uZmlnLCBzb3VyY2UuaGFzQWxwaGEoKSk7CiAgICAgICAgICAgICBwYWludCA9IG51bGw7ICAgLy8gbm90IG5lZWRlZAogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogIHRoZSBkc3Qgc2hvdWxkIGhhdmUgYWxwaGEgaWYgdGhlIHNyYyBkb2VzLCBvciBpZiBvdXIgbWF0cml4Ci0gICAgICAgICAgICAgICAgZG9lc24ndCBwcmVzZXJ2ZSByZWN0bmVzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGJvb2xlYW4gaGFzQWxwaGEgPSBzb3VyY2UuaGFzQWxwaGEoKSB8fCAhbS5yZWN0U3RheXNSZWN0KCk7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHRyYW5zZm9ybWVkID0gIW0ucmVjdFN0YXlzUmVjdCgpOworCiAgICAgICAgICAgICBSZWN0RiBkZXZpY2VSID0gbmV3IFJlY3RGKCk7CiAgICAgICAgICAgICBtLm1hcFJlY3QoZGV2aWNlUiwgZHN0Uik7CisKICAgICAgICAgICAgIG5ld3cgPSBNYXRoLnJvdW5kKGRldmljZVIud2lkdGgoKSk7CiAgICAgICAgICAgICBuZXdoID0gTWF0aC5yb3VuZChkZXZpY2VSLmhlaWdodCgpKTsKLSAgICAgICAgICAgIGJpdG1hcCA9IGNyZWF0ZUJpdG1hcChuZXd3LCBuZXdoLCBoYXNBbHBoYSA/IENvbmZpZy5BUkdCXzg4ODggOiBDb25maWcuUkdCXzU2NSk7Ci0gICAgICAgICAgICBpZiAoaGFzQWxwaGEpIHsKLSAgICAgICAgICAgICAgICBiaXRtYXAuZXJhc2VDb2xvcigwKTsKLSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYml0bWFwID0gY3JlYXRlQml0bWFwKG5ld3csIG5ld2gsIHRyYW5zZm9ybWVkID8gQ29uZmlnLkFSR0JfODg4OCA6IG5ld0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWQgfHwgc291cmNlLmhhc0FscGhhKCkpOworCiAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC1kZXZpY2VSLmxlZnQsIC1kZXZpY2VSLnRvcCk7CiAgICAgICAgICAgICBjYW52YXMuY29uY2F0KG0pOworCiAgICAgICAgICAgICBwYWludCA9IG5ldyBQYWludCgpOwogICAgICAgICAgICAgcGFpbnQuc2V0RmlsdGVyQml0bWFwKGZpbHRlcik7Ci0gICAgICAgICAgICBpZiAoIW0ucmVjdFN0YXlzUmVjdCgpKSB7CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtZWQpIHsKICAgICAgICAgICAgICAgICBwYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQ3NCw4ICs1MDMsMzAgQEAKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgd2lkdGggb3IgaGVpZ2h0IGFyZSA8PSAwCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBCaXRtYXAgY3JlYXRlQml0bWFwKGludCB3aWR0aCwgaW50IGhlaWdodCwgQ29uZmlnIGNvbmZpZykgeworICAgICAgICByZXR1cm4gY3JlYXRlQml0bWFwKHdpZHRoLCBoZWlnaHQsIGNvbmZpZywgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG11dGFibGUgYml0bWFwIHdpdGggdGhlIHNwZWNpZmllZCB3aWR0aCBhbmQgaGVpZ2h0LiAgSXRzCisgICAgICogaW5pdGlhbCBkZW5zaXR5IGlzIGFzIHBlciB7QGxpbmsgI2dldERlbnNpdHl9LgorICAgICAqCisgICAgICogQHBhcmFtIHdpZHRoICAgIFRoZSB3aWR0aCBvZiB0aGUgYml0bWFwCisgICAgICogQHBhcmFtIGhlaWdodCAgIFRoZSBoZWlnaHQgb2YgdGhlIGJpdG1hcAorICAgICAqIEBwYXJhbSBjb25maWcgICBUaGUgYml0bWFwIGNvbmZpZyB0byBjcmVhdGUuCisgICAgICogQHBhcmFtIGhhc0FscGhhIElmIHRoZSBiaXRtYXAgaXMgQVJHQl84ODg4IHRoaXMgZmxhZyBjYW4gYmUgdXNlZCB0byBtYXJrIHRoZQorICAgICAqICAgICAgICAgICAgICAgICBiaXRtYXAgYXMgb3BhcXVlLiBEb2luZyBzbyB3aWxsIGNsZWFyIHRoZSBiaXRtYXAgaW4gYmxhY2sKKyAgICAgKiAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiB0cmFuc3BhcmVudC4gIAorICAgICAqIAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB3aWR0aCBvciBoZWlnaHQgYXJlIDw9IDAKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBCaXRtYXAgY3JlYXRlQml0bWFwKGludCB3aWR0aCwgaW50IGhlaWdodCwgQ29uZmlnIGNvbmZpZywgYm9vbGVhbiBoYXNBbHBoYSkgewogICAgICAgICBCaXRtYXAgYm0gPSBuYXRpdmVDcmVhdGUobnVsbCwgMCwgd2lkdGgsIHdpZHRoLCBoZWlnaHQsIGNvbmZpZy5uYXRpdmVJbnQsIHRydWUpOwotICAgICAgICBibS5lcmFzZUNvbG9yKDApOyAgICAvLyBzdGFydCB3aXRoIGJsYWNrL3RyYW5zcGFyZW50IHBpeGVscworICAgICAgICBpZiAoY29uZmlnID09IENvbmZpZy5BUkdCXzg4ODggJiYgIWhhc0FscGhhKSB7CisgICAgICAgICAgICBibS5lcmFzZUNvbG9yKDB4ZmYwMDAwMDApOworICAgICAgICAgICAgbmF0aXZlU2V0SGFzQWxwaGEoYm0ubU5hdGl2ZUJpdG1hcCwgaGFzQWxwaGEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYm0uZXJhc2VDb2xvcigwKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gYm07CiAgICAgfQogCkBAIC0xMDA4LDEyICsxMDU5LDIyIEBACiAgICAgICAgIG5hdGl2ZVByZXBhcmVUb0RyYXcobU5hdGl2ZUJpdG1hcCk7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgdHJ5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCaXRtYXBGaW5hbGl6ZXIgZXh0ZW5kcyBGaW5hbGl6ZXJzLlJlY2xhaW1hYmxlUmVmZXJlbmNlPEJpdG1hcD4geworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8Qml0bWFwRmluYWxpemVyPiBzRmluYWxpemVycyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNldCgKKyAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDxCaXRtYXBGaW5hbGl6ZXI+KCkpOworCisgICAgICAgIHByaXZhdGUgaW50IG1OYXRpdmVCaXRtYXA7CisKKyAgICAgICAgQml0bWFwRmluYWxpemVyKEJpdG1hcCBiKSB7CisgICAgICAgICAgICBzdXBlcihiLCBGaW5hbGl6ZXJzLmdldFF1ZXVlKCkpOworICAgICAgICAgICAgbU5hdGl2ZUJpdG1hcCA9IGIubU5hdGl2ZUJpdG1hcDsKKyAgICAgICAgICAgIHNGaW5hbGl6ZXJzLmFkZCh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCByZWNsYWltKCkgewogICAgICAgICAgICAgbmF0aXZlRGVzdHJ1Y3RvcihtTmF0aXZlQml0bWFwKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgICAgICBzRmluYWxpemVycy5yZW1vdmUodGhpcyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEwNTAsNiArMTExMSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlQ29weVBpeGVsc1RvQnVmZmVyKGludCBuYXRpdmVCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlciBkc3QpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUNvcHlQaXhlbHNGcm9tQnVmZmVyKGludCBuYiwgQnVmZmVyIHNyYyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVHZW5lcmF0aW9uSWQoaW50IG5hdGl2ZUJpdG1hcCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgQml0bWFwIG5hdGl2ZUNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHApOwogICAgIC8vIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzCkBAIC0xMDY1LDcgKzExMjcsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVByZXBhcmVUb0RyYXcoaW50IG5hdGl2ZUJpdG1hcCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlU2V0SGFzQWxwaGEoaW50IG5CaXRtYXAsIGJvb2xlYW4gaGFzQWxwaGEpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZVNhbWVBcyhpbnQgbmIwLCBpbnQgbmIxKTsKLQorICAgIAogICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgaW50IG5pKCkgewogICAgICAgICByZXR1cm4gbU5hdGl2ZUJpdG1hcDsKICAgICB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcEZhY3RvcnkuamF2YQppbmRleCA3YjQ5YmM1Li5lYTVlZDZiIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBGYWN0b3J5LmphdmEKQEAgLTE4LDcgKzE4LDYgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQub3MuTWVtb3J5RmlsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CiAKQEAgLTg0LDcgKzgzLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBwaXhlbCBkZW5zaXR5IHRvIHVzZSBmb3IgdGhlIGJpdG1hcC4gIFRoaXMgd2lsbCBhbHdheXMgcmVzdWx0CiAgICAgICAgICAqIGluIHRoZSByZXR1cm5lZCBiaXRtYXAgaGF2aW5nIGEgZGVuc2l0eSBzZXQgZm9yIGl0IChzZWUKLSAgICAgICAgICoge0BsaW5rIEJpdG1hcCNzZXREZW5zaXR5KGludCkgQml0bWFwLnNldERlbnNpdHkoaW50KSkuICBJbiBhZGRpdGlvbiwKKyAgICAgICAgICoge0BsaW5rIEJpdG1hcCNzZXREZW5zaXR5KGludCkgQml0bWFwLnNldERlbnNpdHkoaW50KX0pLiAgSW4gYWRkaXRpb24sCiAgICAgICAgICAqIGlmIHtAbGluayAjaW5TY2FsZWR9IGlzIHNldCAod2hpY2ggaXQgaXMgYnkgZGVmYXVsdH0gYW5kIHRoaXMKICAgICAgICAgICogZGVuc2l0eSBkb2VzIG5vdCBtYXRjaCB7QGxpbmsgI2luVGFyZ2V0RGVuc2l0eX0sIHRoZW4gdGhlIGJpdG1hcAogICAgICAgICAgKiB3aWxsIGJlIHNjYWxlZCB0byB0aGUgdGFyZ2V0IGRlbnNpdHkgYmVmb3JlIGJlaW5nIHJldHVybmVkLgpAQCAtNTA3LDkgKzUwNiw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gaXMgVGhlIGlucHV0IHN0cmVhbSB0aGF0IGhvbGRzIHRoZSByYXcgZGF0YSB0byBiZSBkZWNvZGVkIGludG8gYQogICAgICAqICAgICAgICAgICBiaXRtYXAuCi0gICAgICogQHJldHVybiBUaGUgZGVjb2RlZCBiaXRtYXAsIG9yIG51bGwgaWYgdGhlIGltYWdlIGRhdGEgY291bGQgbm90IGJlCi0gICAgICogICAgICAgICBkZWNvZGVkLCBvciwgaWYgb3B0cyBpcyBub24tbnVsbCwgaWYgb3B0cyByZXF1ZXN0ZWQgb25seSB0aGUKLSAgICAgKiAgICAgICAgIHNpemUgYmUgcmV0dXJuZWQgKGluIG9wdHMub3V0V2lkdGggYW5kIG9wdHMub3V0SGVpZ2h0KQorICAgICAqIEByZXR1cm4gVGhlIGRlY29kZWQgYml0bWFwLCBvciBudWxsIGlmIHRoZSBpbWFnZSBkYXRhIGNvdWxkIG5vdCBiZSBkZWNvZGVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQml0bWFwIGRlY29kZVN0cmVhbShJbnB1dFN0cmVhbSBpcykgewogICAgICAgICByZXR1cm4gZGVjb2RlU3RyZWFtKGlzLCBudWxsLCBudWxsKTsKQEAgLTUzMCwxOCArNTI3LDYgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIGJpdG1hcCwgb3IgbnVsbAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQml0bWFwIGRlY29kZUZpbGVEZXNjcmlwdG9yKEZpbGVEZXNjcmlwdG9yIGZkLCBSZWN0IG91dFBhZGRpbmcsIE9wdGlvbnMgb3B0cykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKE1lbW9yeUZpbGUuaXNNZW1vcnlGaWxlKGZkKSkgewotICAgICAgICAgICAgICAgIGludCBtYXBwZWRsZW5ndGggPSBNZW1vcnlGaWxlLmdldFNpemUoZmQpOwotICAgICAgICAgICAgICAgIE1lbW9yeUZpbGUgZmlsZSA9IG5ldyBNZW1vcnlGaWxlKGZkLCBtYXBwZWRsZW5ndGgsICJyIik7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBmaWxlLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgQml0bWFwIGJtID0gZGVjb2RlU3RyZWFtKGlzLCBvdXRQYWRkaW5nLCBvcHRzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmluaXNoRGVjb2RlKGJtLCBvdXRQYWRkaW5nLCBvcHRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIGludmFsaWQgZmlsZWRlc2NyaXB0b3IsIG5vIG5lZWQgdG8gY2FsbCBuYXRpdmVEZWNvZGVGaWxlRGVzY3JpcHRvcigpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQogICAgICAgICBCaXRtYXAgYm0gPSBuYXRpdmVEZWNvZGVGaWxlRGVzY3JpcHRvcihmZCwgb3V0UGFkZGluZywgb3B0cyk7CiAgICAgICAgIHJldHVybiBmaW5pc2hEZWNvZGUoYm0sIG91dFBhZGRpbmcsIG9wdHMpOwogICAgIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBSZWdpb25EZWNvZGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwUmVnaW9uRGVjb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NGViNGEKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwUmVnaW9uRGVjb2Rlci5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3M7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworLyoqCisgKiBCaXRtYXBSZWdpb25EZWNvZGVyIGNhbiBiZSB1c2VkIHRvIGRlY29kZSBhIHJlY3RhbmdsZSByZWdpb24gZnJvbSBhbiBpbWFnZS4KKyAqIEJpdG1hcFJlZ2lvbkRlY29kZXIgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIGFuIG9yaWdpbmFsIGltYWdlIGlzIGxhcmdlIGFuZAorICogeW91IG9ubHkgbmVlZCBwYXJ0cyBvZiB0aGUgaW1hZ2UuCisgKgorICogPHA+VG8gY3JlYXRlIGEgQml0bWFwUmVnaW9uRGVjb2RlciwgY2FsbCBuZXdJbnN0YW5jZSguLi4pLgorICogR2l2ZW4gYSBCaXRtYXBSZWdpb25EZWNvZGVyLCB1c2VycyBjYW4gY2FsbCBkZWNvZGVSZWdpb24oKSByZXBlYXRlZGx5CisgKiB0byBnZXQgYSBkZWNvZGVkIEJpdG1hcCBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lvbi4KKyAqCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCaXRtYXBSZWdpb25EZWNvZGVyIHsKKyAgICBwcml2YXRlIGludCBtTmF0aXZlQml0bWFwUmVnaW9uRGVjb2RlcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVJlY3ljbGVkOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgQml0bWFwUmVnaW9uRGVjb2RlciBmcm9tIHRoZSBzcGVjaWZpZWQgYnl0ZSBhcnJheS4KKyAgICAgKiBDdXJyZW50bHkgb25seSB0aGUgSnBlZyBmb3JtYXQgaXMgc3VwcG9ydGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEgYnl0ZSBhcnJheSBvZiBjb21wcmVzc2VkIGltYWdlIGRhdGEuCisgICAgICogQHBhcmFtIG9mZnNldCBvZmZzZXQgaW50byBkYXRhIGZvciB3aGVyZSB0aGUgZGVjb2RlciBzaG91bGQgYmVnaW4KKyAgICAgKiAgICAgICAgICAgICAgIHBhcnNpbmcuCisgICAgICogQHBhcmFtIGxlbmd0aCB0aGUgbnVtYmVyIG9mIGJ5dGVzLCBiZWdpbm5pbmcgYXQgb2Zmc2V0LCB0byBwYXJzZQorICAgICAqIEBwYXJhbSBpc1NoYXJlYWJsZSBJZiB0aGlzIGlzIHRydWUsIHRoZW4gdGhlIEJpdG1hcFJlZ2lvbkRlY29kZXIgbWF5IGtlZXAgYQorICAgICAqICAgICAgICAgICAgICAgICAgICBzaGFsbG93IHJlZmVyZW5jZSB0byB0aGUgaW5wdXQuIElmIHRoaXMgaXMgZmFsc2UsCisgICAgICogICAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIEJpdG1hcFJlZ2lvbkRlY29kZXIgd2lsbCBleHBsaWNpdGx5IG1ha2UgYSBjb3B5IG9mIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICBpbnB1dCBkYXRhLCBhbmQga2VlcCB0aGF0LiBFdmVuIGlmIHNoYXJpbmcgaXMgYWxsb3dlZCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uIG1heSBzdGlsbCBkZWNpZGUgdG8gbWFrZSBhIGRlZXAKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgY29weSBvZiB0aGUgaW5wdXQgZGF0YS4gSWYgYW4gaW1hZ2UgaXMgcHJvZ3Jlc3NpdmVseSBlbmNvZGVkLAorICAgICAqICAgICAgICAgICAgICAgICAgICBhbGxvd2luZyBzaGFyaW5nIG1heSBkZWdyYWRlIHRoZSBkZWNvZGluZyBzcGVlZC4KKyAgICAgKiBAcmV0dXJuIEJpdG1hcFJlZ2lvbkRlY29kZXIsIG9yIG51bGwgaWYgdGhlIGltYWdlIGRhdGEgY291bGQgbm90IGJlIGRlY29kZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgaW1hZ2UgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQgb3IgY2FuIG5vdCBiZSBkZWNvZGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQml0bWFwUmVnaW9uRGVjb2RlciBuZXdJbnN0YW5jZShieXRlW10gZGF0YSwKKyAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gaXNTaGFyZWFibGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICgob2Zmc2V0IHwgbGVuZ3RoKSA8IDAgfHwgZGF0YS5sZW5ndGggPCBvZmZzZXQgKyBsZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmF0aXZlTmV3SW5zdGFuY2UoZGF0YSwgb2Zmc2V0LCBsZW5ndGgsIGlzU2hhcmVhYmxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBCaXRtYXBSZWdpb25EZWNvZGVyIGZyb20gdGhlIGZpbGUgZGVzY3JpcHRvci4KKyAgICAgKiBUaGUgcG9zaXRpb24gd2l0aGluIHRoZSBkZXNjcmlwdG9yIHdpbGwgbm90IGJlIGNoYW5nZWQgd2hlbgorICAgICAqIHRoaXMgcmV0dXJucywgc28gdGhlIGRlc2NyaXB0b3IgY2FuIGJlIHVzZWQgYWdhaW4gYXMgaXMuCisgICAgICogQ3VycmVudGx5IG9ubHkgdGhlIEpwZWcgZm9ybWF0IGlzIHN1cHBvcnRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmZCBUaGUgZmlsZSBkZXNjcmlwdG9yIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gZGVjb2RlCisgICAgICogQHBhcmFtIGlzU2hhcmVhYmxlIElmIHRoaXMgaXMgdHJ1ZSwgdGhlbiB0aGUgQml0bWFwUmVnaW9uRGVjb2RlciBtYXkga2VlcCBhCisgICAgICogICAgICAgICAgICAgICAgICAgIHNoYWxsb3cgcmVmZXJlbmNlIHRvIHRoZSBpbnB1dC4gSWYgdGhpcyBpcyBmYWxzZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlbiB0aGUgQml0bWFwUmVnaW9uRGVjb2RlciB3aWxsIGV4cGxpY2l0bHkgbWFrZSBhIGNvcHkgb2YgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgIGlucHV0IGRhdGEsIGFuZCBrZWVwIHRoYXQuIEV2ZW4gaWYgc2hhcmluZyBpcyBhbGxvd2VkLAorICAgICAqICAgICAgICAgICAgICAgICAgICB0aGUgaW1wbGVtZW50YXRpb24gbWF5IHN0aWxsIGRlY2lkZSB0byBtYWtlIGEgZGVlcAorICAgICAqICAgICAgICAgICAgICAgICAgICBjb3B5IG9mIHRoZSBpbnB1dCBkYXRhLiBJZiBhbiBpbWFnZSBpcyBwcm9ncmVzc2l2ZWx5IGVuY29kZWQsCisgICAgICogICAgICAgICAgICAgICAgICAgIGFsbG93aW5nIHNoYXJpbmcgbWF5IGRlZ3JhZGUgdGhlIGRlY29kaW5nIHNwZWVkLgorICAgICAqIEByZXR1cm4gQml0bWFwUmVnaW9uRGVjb2Rlciwgb3IgbnVsbCBpZiB0aGUgaW1hZ2UgZGF0YSBjb3VsZCBub3QgYmUgZGVjb2RlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBpbWFnZSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCBvciBjYW4gbm90IGJlIGRlY29kZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCaXRtYXBSZWdpb25EZWNvZGVyIG5ld0luc3RhbmNlKAorICAgICAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQsIGJvb2xlYW4gaXNTaGFyZWFibGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuYXRpdmVOZXdJbnN0YW5jZShmZCwgaXNTaGFyZWFibGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIEJpdG1hcFJlZ2lvbkRlY29kZXIgZnJvbSBhbiBpbnB1dCBzdHJlYW0uCisgICAgICogVGhlIHN0cmVhbSdzIHBvc2l0aW9uIHdpbGwgYmUgd2hlcmUgZXZlciBpdCB3YXMgYWZ0ZXIgdGhlIGVuY29kZWQgZGF0YQorICAgICAqIHdhcyByZWFkLgorICAgICAqIEN1cnJlbnRseSBvbmx5IHRoZSBKcGVnIGZvcm1hdCBpcyBzdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXMgVGhlIGlucHV0IHN0cmVhbSB0aGF0IGhvbGRzIHRoZSByYXcgZGF0YSB0byBiZSBkZWNvZGVkIGludG8gYQorICAgICAqICAgICAgICAgICBCaXRtYXBSZWdpb25EZWNvZGVyLgorICAgICAqIEBwYXJhbSBpc1NoYXJlYWJsZSBJZiB0aGlzIGlzIHRydWUsIHRoZW4gdGhlIEJpdG1hcFJlZ2lvbkRlY29kZXIgbWF5IGtlZXAgYQorICAgICAqICAgICAgICAgICAgICAgICAgICBzaGFsbG93IHJlZmVyZW5jZSB0byB0aGUgaW5wdXQuIElmIHRoaXMgaXMgZmFsc2UsCisgICAgICogICAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIEJpdG1hcFJlZ2lvbkRlY29kZXIgd2lsbCBleHBsaWNpdGx5IG1ha2UgYSBjb3B5IG9mIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICBpbnB1dCBkYXRhLCBhbmQga2VlcCB0aGF0LiBFdmVuIGlmIHNoYXJpbmcgaXMgYWxsb3dlZCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uIG1heSBzdGlsbCBkZWNpZGUgdG8gbWFrZSBhIGRlZXAKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgY29weSBvZiB0aGUgaW5wdXQgZGF0YS4gSWYgYW4gaW1hZ2UgaXMgcHJvZ3Jlc3NpdmVseSBlbmNvZGVkLAorICAgICAqICAgICAgICAgICAgICAgICAgICBhbGxvd2luZyBzaGFyaW5nIG1heSBkZWdyYWRlIHRoZSBkZWNvZGluZyBzcGVlZC4KKyAgICAgKiBAcmV0dXJuIEJpdG1hcFJlZ2lvbkRlY29kZXIsIG9yIG51bGwgaWYgdGhlIGltYWdlIGRhdGEgY291bGQgbm90IGJlIGRlY29kZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgaW1hZ2UgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQgb3IgY2FuIG5vdCBiZSBkZWNvZGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQml0bWFwUmVnaW9uRGVjb2RlciBuZXdJbnN0YW5jZShJbnB1dFN0cmVhbSBpcywKKyAgICAgICAgICAgIGJvb2xlYW4gaXNTaGFyZWFibGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIHdlIG5lZWQgbWFyay9yZXNldCB0byB3b3JrIHByb3Blcmx5IGluIEpOSQorCisgICAgICAgIGlmICghaXMubWFya1N1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICBpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlzLCAxNiAqIDEwMjQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzIGluc3RhbmNlb2YgQXNzZXRNYW5hZ2VyLkFzc2V0SW5wdXRTdHJlYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBuYXRpdmVOZXdJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICAgICAgKChBc3NldE1hbmFnZXIuQXNzZXRJbnB1dFN0cmVhbSkgaXMpLmdldEFzc2V0SW50KCksCisgICAgICAgICAgICAgICAgICAgIGlzU2hhcmVhYmxlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHBhc3Mgc29tZSB0ZW1wIHN0b3JhZ2UgZG93biB0byB0aGUgbmF0aXZlIGNvZGUuIDEwMjQgaXMgbWFkZSB1cCwKKyAgICAgICAgICAgIC8vIGJ1dCBzaG91bGQgYmUgbGFyZ2UgZW5vdWdoIHRvIGF2b2lkIHRvbyBtYW55IHNtYWxsIGNhbGxzIGJhY2sKKyAgICAgICAgICAgIC8vIGludG8gaXMucmVhZCguLi4pLgorICAgICAgICAgICAgYnl0ZSBbXSB0ZW1wU3RvcmFnZSA9IG5ldyBieXRlWzE2ICogMTAyNF07CisgICAgICAgICAgICByZXR1cm4gbmF0aXZlTmV3SW5zdGFuY2UoaXMsIHRlbXBTdG9yYWdlLCBpc1NoYXJlYWJsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBCaXRtYXBSZWdpb25EZWNvZGVyIGZyb20gYSBmaWxlIHBhdGguCisgICAgICogQ3VycmVudGx5IG9ubHkgdGhlIEpwZWcgZm9ybWF0IGlzIHN1cHBvcnRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoTmFtZSBjb21wbGV0ZSBwYXRoIG5hbWUgZm9yIHRoZSBmaWxlIHRvIGJlIGRlY29kZWQuCisgICAgICogQHBhcmFtIGlzU2hhcmVhYmxlIElmIHRoaXMgaXMgdHJ1ZSwgdGhlbiB0aGUgQml0bWFwUmVnaW9uRGVjb2RlciBtYXkga2VlcCBhCisgICAgICogICAgICAgICAgICAgICAgICAgIHNoYWxsb3cgcmVmZXJlbmNlIHRvIHRoZSBpbnB1dC4gSWYgdGhpcyBpcyBmYWxzZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlbiB0aGUgQml0bWFwUmVnaW9uRGVjb2RlciB3aWxsIGV4cGxpY2l0bHkgbWFrZSBhIGNvcHkgb2YgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgIGlucHV0IGRhdGEsIGFuZCBrZWVwIHRoYXQuIEV2ZW4gaWYgc2hhcmluZyBpcyBhbGxvd2VkLAorICAgICAqICAgICAgICAgICAgICAgICAgICB0aGUgaW1wbGVtZW50YXRpb24gbWF5IHN0aWxsIGRlY2lkZSB0byBtYWtlIGEgZGVlcAorICAgICAqICAgICAgICAgICAgICAgICAgICBjb3B5IG9mIHRoZSBpbnB1dCBkYXRhLiBJZiBhbiBpbWFnZSBpcyBwcm9ncmVzc2l2ZWx5IGVuY29kZWQsCisgICAgICogICAgICAgICAgICAgICAgICAgIGFsbG93aW5nIHNoYXJpbmcgbWF5IGRlZ3JhZGUgdGhlIGRlY29kaW5nIHNwZWVkLgorICAgICAqIEByZXR1cm4gQml0bWFwUmVnaW9uRGVjb2Rlciwgb3IgbnVsbCBpZiB0aGUgaW1hZ2UgZGF0YSBjb3VsZCBub3QgYmUgZGVjb2RlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBpbWFnZSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCBvciBjYW4gbm90IGJlIGRlY29kZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCaXRtYXBSZWdpb25EZWNvZGVyIG5ld0luc3RhbmNlKFN0cmluZyBwYXRoTmFtZSwKKyAgICAgICAgICAgIGJvb2xlYW4gaXNTaGFyZWFibGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJpdG1hcFJlZ2lvbkRlY29kZXIgZGVjb2RlciA9IG51bGw7CisgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aE5hbWUpOworICAgICAgICAgICAgZGVjb2RlciA9IG5ld0luc3RhbmNlKHN0cmVhbSwgaXNTaGFyZWFibGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nIGhlcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlY29kZXI7CisgICAgfQorCisgICAgLyogIFByaXZhdGUgY29uc3RydWN0b3IgdGhhdCBtdXN0IHJlY2VpdmUgYW4gYWxyZWFkeSBhbGxvY2F0ZWQgbmF0aXZlCisgICAgICAgIHJlZ2lvbiBkZWNvZGVyIGludCAocG9pbnRlcikuCisKKyAgICAgICAgVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gSk5JIGNvZGUuCisgICAgKi8KKyAgICBwcml2YXRlIEJpdG1hcFJlZ2lvbkRlY29kZXIoaW50IGRlY29kZXIpIHsKKyAgICAgICAgbU5hdGl2ZUJpdG1hcFJlZ2lvbkRlY29kZXIgPSBkZWNvZGVyOworICAgICAgICBtUmVjeWNsZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvZGVzIGEgcmVjdGFuZ2xlIHJlZ2lvbiBpbiB0aGUgaW1hZ2Ugc3BlY2lmaWVkIGJ5IHJlY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVjdCBUaGUgcmVjdGFuZ2xlIHRoYXQgc3BlY2lmaWVkIHRoZSByZWdpb24gdG8gYmUgZGVjb2RlLgorICAgICAqIEBwYXJhbSBvcHRpb25zIG51bGwtb2s7IE9wdGlvbnMgdGhhdCBjb250cm9sIGRvd25zYW1wbGluZy4KKyAgICAgKiAgICAgICAgICAgICBpblB1cmdlYWJsZSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqIEByZXR1cm4gVGhlIGRlY29kZWQgYml0bWFwLCBvciBudWxsIGlmIHRoZSBpbWFnZSBkYXRhIGNvdWxkIG5vdCBiZQorICAgICAqICAgICAgICAgZGVjb2RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQml0bWFwIGRlY29kZVJlZ2lvbihSZWN0IHJlY3QsIEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBvcHRpb25zKSB7CisgICAgICAgIGNoZWNrUmVjeWNsZWQoImRlY29kZVJlZ2lvbiBjYWxsZWQgb24gcmVjeWNsZWQgcmVnaW9uIGRlY29kZXIiKTsKKyAgICAgICAgaWYgKHJlY3QubGVmdCA8IDAgfHwgcmVjdC50b3AgPCAwIHx8IHJlY3QucmlnaHQgPiBnZXRXaWR0aCgpCisgICAgICAgICAgICAgICAgfHwgcmVjdC5ib3R0b20gPiBnZXRIZWlnaHQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJlY3RhbmdsZSBpcyBub3QgaW5zaWRlIHRoZSBpbWFnZSIpOworICAgICAgICByZXR1cm4gbmF0aXZlRGVjb2RlUmVnaW9uKG1OYXRpdmVCaXRtYXBSZWdpb25EZWNvZGVyLCByZWN0LmxlZnQsIHJlY3QudG9wLAorICAgICAgICAgICAgICAgIHJlY3QucmlnaHQgLSByZWN0LmxlZnQsIHJlY3QuYm90dG9tIC0gcmVjdC50b3AsIG9wdGlvbnMpOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBpbWFnZSdzIHdpZHRoICovCisgICAgcHVibGljIGludCBnZXRXaWR0aCgpIHsKKyAgICAgICAgY2hlY2tSZWN5Y2xlZCgiZ2V0V2lkdGggY2FsbGVkIG9uIHJlY3ljbGVkIHJlZ2lvbiBkZWNvZGVyIik7CisgICAgICAgIHJldHVybiBuYXRpdmVHZXRXaWR0aChtTmF0aXZlQml0bWFwUmVnaW9uRGVjb2Rlcik7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdGhlIG9yaWdpbmFsIGltYWdlJ3MgaGVpZ2h0ICovCisgICAgcHVibGljIGludCBnZXRIZWlnaHQoKSB7CisgICAgICAgIGNoZWNrUmVjeWNsZWQoImdldEhlaWdodCBjYWxsZWQgb24gcmVjeWNsZWQgcmVnaW9uIGRlY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZUdldEhlaWdodChtTmF0aXZlQml0bWFwUmVnaW9uRGVjb2Rlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRnJlZXMgdXAgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyByZWdpb24gZGVjb2RlciwgYW5kIG1hcmsgdGhlCisgICAgICogcmVnaW9uIGRlY29kZXIgYXMgImRlYWQiLCBtZWFuaW5nIGl0IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGRlY29kZVJlZ2lvbigpLAorICAgICAqIGdldFdpZHRoKCkgb3IgZ2V0SGVpZ2h0KCkgaXMgY2FsbGVkLgorICAgICAqCisgICAgICogPHA+VGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHJldmVyc2VkLCBzbyBpdCBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgeW91IGFyZQorICAgICAqIHN1cmUgdGhlcmUgYXJlIG5vIGZ1cnRoZXIgdXNlcyBmb3IgdGhlIHJlZ2lvbiBkZWNvZGVyLiBUaGlzIGlzIGFuIGFkdmFuY2VkIGNhbGwsCisgICAgICogYW5kIG5vcm1hbGx5IG5lZWQgbm90IGJlIGNhbGxlZCwgc2luY2UgdGhlIG5vcm1hbCBHQyBwcm9jZXNzIHdpbGwgZnJlZSB1cCB0aGlzCisgICAgICogbWVtb3J5IHdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgcmVmZXJlbmNlcyB0byB0aGlzIHJlZ2lvbiBkZWNvZGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlY3ljbGUoKSB7CisgICAgICAgIGlmICghbVJlY3ljbGVkKSB7CisgICAgICAgICAgICBuYXRpdmVDbGVhbihtTmF0aXZlQml0bWFwUmVnaW9uRGVjb2Rlcik7CisgICAgICAgICAgICBtUmVjeWNsZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcmVnaW9uIGRlY29kZXIgaGFzIGJlZW4gcmVjeWNsZWQuCisgICAgICogSWYgc28sIHRoZW4gaXQgaXMgYW4gZXJyb3IgdG8gdHJ5IHVzZSBpdHMgbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWdpb24gZGVjb2RlciBoYXMgYmVlbiByZWN5Y2xlZAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzUmVjeWNsZWQoKSB7CisgICAgICAgIHJldHVybiBtUmVjeWNsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IG1ldGhvZHMgdGhhdCB3YW50IHRvIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgcmVnaW9uIGRlY29kZXIKKyAgICAgKiBoYXMgYWxyZWFkeSBiZWVuIHJlY3ljbGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja1JlY3ljbGVkKFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKKyAgICAgICAgaWYgKG1SZWN5Y2xlZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlY3ljbGUoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgQml0bWFwIG5hdGl2ZURlY29kZVJlZ2lvbihpbnQgbGJtLAorICAgICAgICAgICAgaW50IHN0YXJ0X3gsIGludCBzdGFydF95LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICBCaXRtYXBGYWN0b3J5Lk9wdGlvbnMgb3B0aW9ucyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVHZXRXaWR0aChpbnQgbGJtKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUdldEhlaWdodChpbnQgbGJtKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVDbGVhbihpbnQgbGJtKTsKKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBCaXRtYXBSZWdpb25EZWNvZGVyIG5hdGl2ZU5ld0luc3RhbmNlKAorICAgICAgICAgICAgYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gaXNTaGFyZWFibGUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBCaXRtYXBSZWdpb25EZWNvZGVyIG5hdGl2ZU5ld0luc3RhbmNlKAorICAgICAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQsIGJvb2xlYW4gaXNTaGFyZWFibGUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBCaXRtYXBSZWdpb25EZWNvZGVyIG5hdGl2ZU5ld0luc3RhbmNlKAorICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMsIGJ5dGVbXSBzdG9yYWdlLCBib29sZWFuIGlzU2hhcmVhYmxlKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgQml0bWFwUmVnaW9uRGVjb2RlciBuYXRpdmVOZXdJbnN0YW5jZSgKKyAgICAgICAgICAgIGludCBhc3NldCwgYm9vbGVhbiBpc1NoYXJlYWJsZSk7Cit9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwU2hhZGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwU2hhZGVyLmphdmEKaW5kZXggNjEyYjBhYi4uNGJhNjc5YiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFNoYWRlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBTaGFkZXIuamF2YQpAQCAtMTYsMTAgKzE2LDE2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5ncmFwaGljczsKIAorLyoqCisgKiBTaGFkZXIgdXNlZCB0byBkcmF3IGEgYml0bWFwIGFzIGEgdGV4dHVyZS4gVGhlIGJpdG1hcCBjYW4gYmUgcmVwZWF0ZWQgb3IKKyAqIG1pcnJvcmVkIGJ5IHNldHRpbmcgdGhlIHRpbGluZyBtb2RlLgorICovCiBwdWJsaWMgY2xhc3MgQml0bWFwU2hhZGVyIGV4dGVuZHMgU2hhZGVyIHsKLQotICAgIC8vIHdlIGhvbGQgb24ganVzdCBmb3IgdGhlIEdDLCBzaW5jZSBvdXIgbmF0aXZlIGNvdW50ZXJwYXJ0IGlzIHVzaW5nIGl0Ci0gICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcDsKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50IGdhcmJhZ2UgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkZpZWxkQ2FuQmVMb2NhbCIsICJVbnVzZWREZWNsYXJhdGlvbiJ9KQorICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXA7CiAKICAgICAvKioKICAgICAgKiBDYWxsIHRoaXMgdG8gY3JlYXRlIGEgbmV3IHNoYWRlciB0aGF0IHdpbGwgZHJhdyB3aXRoIGEgYml0bWFwLgpAQCAtMzAsMTIgKzM2LDEzIEBACiAgICAgICovCiAgICAgcHVibGljIEJpdG1hcFNoYWRlcihCaXRtYXAgYml0bWFwLCBUaWxlTW9kZSB0aWxlWCwgVGlsZU1vZGUgdGlsZVkpIHsKICAgICAgICAgbUJpdG1hcCA9IGJpdG1hcDsKLSAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlQ3JlYXRlKGJpdG1hcC5uaSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZVgubmF0aXZlSW50LCB0aWxlWS5uYXRpdmVJbnQpOworICAgICAgICBmaW5hbCBpbnQgYiA9IGJpdG1hcC5uaSgpOworICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDcmVhdGUoYiwgdGlsZVgubmF0aXZlSW50LCB0aWxlWS5uYXRpdmVJbnQpOworICAgICAgICBuYXRpdmVfc2hhZGVyID0gbmF0aXZlUG9zdENyZWF0ZShuYXRpdmVfaW5zdGFuY2UsIGIsIHRpbGVYLm5hdGl2ZUludCwgdGlsZVkubmF0aXZlSW50KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZShpbnQgbmF0aXZlX2JpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hhZGVyVGlsZU1vZGVYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGFkZXJUaWxlTW9kZVkpOyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZShpbnQgbmF0aXZlX2JpdG1hcCwgaW50IHNoYWRlclRpbGVNb2RlWCwKKyAgICAgICAgICAgIGludCBzaGFkZXJUaWxlTW9kZVkpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlUG9zdENyZWF0ZShpbnQgbmF0aXZlX3NoYWRlciwgaW50IG5hdGl2ZV9iaXRtYXAsCisgICAgICAgICAgICBpbnQgc2hhZGVyVGlsZU1vZGVYLCBpbnQgc2hhZGVyVGlsZU1vZGVZKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCmluZGV4IGE1ODdkMGQxLi45NTJmMmI1IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCkBAIC0xNiwxMSArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzOwogCi1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZFN0cmluZzsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOwogaW1wb3J0IGFuZHJvaWQudGV4dC5HcmFwaGljc09wZXJhdGlvbnM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWRTdHJpbmc7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIAogaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMOwogCkBAIC00MywyMiArNDIsMzkgQEAKICAgICAgICAgZm9yIGJvdGggdG8gYmUgbnVsbC4KICAgICAqLwogICAgIHByaXZhdGUgQml0bWFwICBtQml0bWFwOyAgICAvLyBpZiBub3QgbnVsbCwgbUdMIG11c3QgYmUgbnVsbAotICAgIHByaXZhdGUgR0wgICAgICBtR0w7ICAgICAgICAvLyBpZiBub3QgbnVsbCwgbUJpdG1hcCBtdXN0IGJlIG51bGwKICAgICAKICAgICAvLyBvcHRpb25hbCBmaWVsZCBzZXQgYnkgdGhlIGNhbGxlcgotICAgIHByaXZhdGUgRHJhd0ZpbHRlciAgbURyYXdGaWx0ZXI7CisgICAgcHJpdmF0ZSBEcmF3RmlsdGVyIG1EcmF3RmlsdGVyOwogCi0gICAgLy8gUGFja2FnZS1zY29wZWQgZm9yIHF1aWNrIGFjY2Vzcy4KLSAgICAvKnBhY2thZ2UqLyBpbnQgbURlbnNpdHkgPSBCaXRtYXAuREVOU0lUWV9OT05FOworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBtRGVuc2l0eSA9IEJpdG1hcC5ERU5TSVRZX05PTkU7CiAKLSAgICAvLyBVc2VkIHRvIGRldGVybWluZSB3aGVuIGNvbXBhdGliaWxpdHkgc2NhbGluZyBpcyBpbiBlZmZlY3QuCi0gICAgcHJpdmF0ZSBpbnQgbVNjcmVlbkRlbnNpdHkgPSBCaXRtYXAuREVOU0lUWV9OT05FOworICAgIC8qKgorICAgICAqIFVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gY29tcGF0aWJpbGl0eSBzY2FsaW5nIGlzIGluIGVmZmVjdC4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgbVNjcmVlbkRlbnNpdHkgPSBCaXRtYXAuREVOU0lUWV9OT05FOwogICAgIAogICAgIC8vIFVzZWQgYnkgbmF0aXZlIGNvZGUKICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCiAgICAgcHJpdmF0ZSBpbnQgICAgICAgICBtU3VyZmFjZUZvcm1hdDsKIAogICAgIC8qKgorICAgICAqIEZsYWcgZm9yIGRyYXdUZXh0UnVuIGluZGljYXRpbmcgbGVmdC10by1yaWdodCBydW4gZGlyZWN0aW9uLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUSU9OX0xUUiA9IDA7CisgICAgCisgICAgLyoqCisgICAgICogRmxhZyBmb3IgZHJhd1RleHRSdW4gaW5kaWNhdGluZyByaWdodC10by1sZWZ0IHJ1biBkaXJlY3Rpb24uCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJFQ1RJT05fUlRMID0gMTsKKyAgICAKKyAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgYW4gZW1wdHkgcmFzdGVyIGNhbnZhcy4gVXNlIHNldEJpdG1hcCgpIHRvIHNwZWNpZnkgYSBiaXRtYXAgdG8KICAgICAgKiBkcmF3IGludG8uICBUaGUgaW5pdGlhbCB0YXJnZXQgZGVuc2l0eSBpcyB7QGxpbmsgQml0bWFwI0RFTlNJVFlfTk9ORX07CiAgICAgICogdGhpcyB3aWxsIHR5cGljYWxseSBiZSByZXBsYWNlZCB3aGVuIGEgdGFyZ2V0IGJpdG1hcCBpcyBzZXQgZm9yIHRoZQpAQCAtODksNDcgKzEwNSwzNyBAQAogICAgICAgICBtRGVuc2l0eSA9IGJpdG1hcC5tRGVuc2l0eTsKICAgICB9CiAgICAgCi0gICAgLypwYWNrYWdlKi8gQ2FudmFzKGludCBuYXRpdmVDYW52YXMpIHsKKyAgICBDYW52YXMoaW50IG5hdGl2ZUNhbnZhcykgewogICAgICAgICBpZiAobmF0aXZlQ2FudmFzID09IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKICAgICAgICAgfQogICAgICAgICBtTmF0aXZlQ2FudmFzID0gbmF0aXZlQ2FudmFzOwogICAgICAgICBtRGVuc2l0eSA9IEJpdG1hcC5nZXREZWZhdWx0RGVuc2l0eSgpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIGNhbnZhcyB3aXRoIHRoZSBzcGVjaWZpZWQgZ2wgY29udGV4dC4gQWxsIGRyYXdpbmcgdGhyb3VnaAotICAgICAqIHRoaXMgY2FudmFzIHdpbGwgYmUgcmVkaXJlY3RlZCB0byBPcGVuR0wuIE5vdGU6IHNvbWUgZmVhdHVyZXMgbWF5IG5vdAotICAgICAqIGJlIHN1cHBvcnRlZCBpbiB0aGlzIG1vZGUgKGUuZy4gc29tZSBHTCBpbXBsZW1lbnRhdGlvbnMgbWF5IG5vdCBzdXBwb3J0Ci0gICAgICogYW50aWFsaWFzaW5nIG9yIGNlcnRhaW4gZWZmZWN0cyBsaWtlIENvbG9yTWF0cml4IG9yIGNlcnRhaW4gWGZlcm1vZGVzKS4KLSAgICAgKiBIb3dldmVyLCBubyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaW4gdGhvc2UgY2FzZXMuCisgICAgICogUmV0dXJucyBudWxsLgogICAgICAqIAotICAgICAqIDxwPlRoZSBpbml0aWFsIHRhcmdldCBkZW5zaXR5IG9mIHRoZSBjYW52YXMgaXMgdGhlIHNhbWUgYXMgdGhlIGluaXRpYWwKLSAgICAgKiBkZW5zaXR5IG9mIGJpdG1hcHMgYXMgcGVyIHtAbGluayBCaXRtYXAjZ2V0RGVuc2l0eSgpIEJpdG1hcC5nZXREZW5zaXR5KCl9LgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBub3QgYmUgaW52b2tlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgQ2FudmFzKEdMIGdsKSB7Ci0gICAgICAgIG1OYXRpdmVDYW52YXMgPSBpbml0R0woKTsKLSAgICAgICAgbUdMID0gZ2w7Ci0gICAgICAgIG1EZW5zaXR5ID0gQml0bWFwLmdldERlZmF1bHREZW5zaXR5KCk7CisgICAgQERlcHJlY2F0ZWQKKyAgICBwcm90ZWN0ZWQgR0wgZ2V0R0woKSB7CisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgR0wgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhbnZhcywgb3IgbnVsbCBpZiBpdCBpcyBub3QKLSAgICAgKiBiYWNrZWQgYnkgR0wuCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBDYW52YXMgdXNlcyBoYXJkd2FyZSBhY2NlbGVyYXRpb24uCisgICAgICogCisgICAgICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlZmluZSB3aGF0IHR5cGUgb2YgaGFyZHdhcmUgYWNjZWxlcmF0aW9uCisgICAgICogbWF5IG9yIG1heSBub3QgYmUgdXNlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgZHJhd2luZyBvcGVyYXRpb25zIGFyZSBoYXJkd2FyZSBhY2NlbGVyYXRlZCwKKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KLSAgICBwdWJsaWMgR0wgZ2V0R0woKSB7Ci0gICAgICAgIHJldHVybiBtR0w7CisgICAgcHVibGljIGJvb2xlYW4gaXNIYXJkd2FyZUFjY2VsZXJhdGVkKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENhbGwgdGhpcyB0byBmcmVlIHVwIE9wZW5HTCByZXNvdXJjZXMgdGhhdCBtYXkgYmUgY2FjaGVkIG9yIGFsbG9jYXRlZAotICAgICAqIG9uIGJlaGFsZiBvZiB0aGUgQ2FudmFzLiBBbnkgc3Vic2VxdWVudCBkcmF3aW5nIHdpdGggYSBHTC1iYWNrZWQgQ2FudmFzCi0gICAgICogd2lsbCBoYXZlIHRvIHJlY3JlYXRlIHRob3NlIHJlc291cmNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZnJlZUdsQ2FjaGVzKCkgewotICAgICAgICBmcmVlQ2FjaGVzKCk7Ci0gICAgfQotICAgICAgICAKKwogICAgIC8qKgogICAgICAqIFNwZWNpZnkgYSBiaXRtYXAgZm9yIHRoZSBjYW52YXMgdG8gZHJhdyBpbnRvLiAgQXMgYSBzaWRlLWVmZmVjdCwgYWxzbwogICAgICAqIHVwZGF0ZXMgdGhlIGNhbnZhcydzIHRhcmdldCBkZW5zaXR5IHRvIG1hdGNoIHRoYXQgb2YgdGhlIGJpdG1hcC4KQEAgLTE0Myw3ICsxNDksNyBAQAogICAgICAgICBpZiAoIWJpdG1hcC5pc011dGFibGUoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtR0wgIT0gbnVsbCkgeworICAgICAgICBpZiAoaXNIYXJkd2FyZUFjY2VsZXJhdGVkKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW4ndCBzZXQgYSBiaXRtYXAgZGV2aWNlIG9uIGEgR0wgY2FudmFzIik7CiAgICAgICAgIH0KICAgICAgICAgdGhyb3dJZlJlY3ljbGVkKGJpdG1hcCk7CkBAIC0xNTcsMTMgKzE2MywxMiBAQAogICAgICAqIFNldCB0aGUgdmlld3BvcnQgZGltZW5zaW9ucyBpZiB0aGlzIGNhbnZhcyBpcyBHTCBiYXNlZC4gSWYgaXQgaXMgbm90LAogICAgICAqIHRoaXMgbWV0aG9kIGlzIGlnbm9yZWQgYW5kIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICoKLSAgICAgKiAgQHBhcmFtIHdpZHRoICAgIFRoZSB3aWR0aCBvZiB0aGUgdmlld3BvcnQKLSAgICAgKiAgQHBhcmFtIGhlaWdodCAgIFRoZSBoZWlnaHQgb2YgdGhlIHZpZXdwb3J0CisgICAgICogQHBhcmFtIHdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgdmlld3BvcnQKKyAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIHZpZXdwb3J0CisgICAgICogCisgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRWaWV3cG9ydChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgaWYgKG1HTCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBuYXRpdmVTZXRWaWV3cG9ydChtTmF0aXZlQ2FudmFzLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMzc3LDggKzM4Miw4IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gc3ggVGhlIGFtb3VudCB0byBzY2FsZSBpbiBYCiAgICAgICogQHBhcmFtIHN5IFRoZSBhbW91bnQgdG8gc2NhbGUgaW4gWQotICAgICAqIEBwYXJhbSBweCBUaGUgeC1jb29yZCBmb3IgdGhlIHBpdm90IHBvaW50ICh1bmNoYW5nZWQgYnkgdGhlIHJvdGF0aW9uKQotICAgICAqIEBwYXJhbSBweSBUaGUgeS1jb29yZCBmb3IgdGhlIHBpdm90IHBvaW50ICh1bmNoYW5nZWQgYnkgdGhlIHJvdGF0aW9uKQorICAgICAqIEBwYXJhbSBweCBUaGUgeC1jb29yZCBmb3IgdGhlIHBpdm90IHBvaW50ICh1bmNoYW5nZWQgYnkgdGhlIHNjYWxlKQorICAgICAqIEBwYXJhbSBweSBUaGUgeS1jb29yZCBmb3IgdGhlIHBpdm90IHBvaW50ICh1bmNoYW5nZWQgYnkgdGhlIHNjYWxlKQogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNjYWxlKGZsb2F0IHN4LCBmbG9hdCBzeSwgZmxvYXQgcHgsIGZsb2F0IHB5KSB7CiAgICAgICAgIHRyYW5zbGF0ZShweCwgcHkpOwpAQCAtNjIxLDcgKzYyNiwxMSBAQAogICAgICAgICBFZGdlVHlwZShpbnQgbmF0aXZlSW50KSB7CiAgICAgICAgICAgICB0aGlzLm5hdGl2ZUludCA9IG5hdGl2ZUludDsKICAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgbmF0aXZlSW50OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIGludCBuYXRpdmVJbnQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC05NTgsNiArOTY3LDIxIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRHJhd3MgdGhlIHNwZWNpZmllZCBiaXRtYXAgYXMgYW4gTi1wYXRjaCAobW9zdCBvZnRlbiwgYSA5LXBhdGNoZXMuKQorICAgICAqCisgICAgICogTm90ZTogT25seSBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUgYWNjZWxlcmF0ZWQgY2FudmFzIGF0IHRoZSBtb21lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYml0bWFwIFRoZSBiaXRtYXAgdG8gZHJhdyBhcyBhbiBOLXBhdGNoCisgICAgICogQHBhcmFtIGNodW5rcyBUaGUgcGF0Y2hlcyBpbmZvcm1hdGlvbiAobWF0Y2hlcyB0aGUgbmF0aXZlIHN0cnVjdCBSZXNfcG5nXzlwYXRjaCkKKyAgICAgKiBAcGFyYW0gZHN0IFRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUuCisgICAgICogQHBhcmFtIHBhaW50IFRoZSBwYWludCB0byBkcmF3IHRoZSBiaXRtYXAgd2l0aC4gbWF5IGJlIG51bGwKKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRyYXdQYXRjaChCaXRtYXAgYml0bWFwLCBieXRlW10gY2h1bmtzLCBSZWN0RiBkc3QsIFBhaW50IHBhaW50KSB7CisgICAgfSAgICAKKyAgICAKKyAgICAvKioKICAgICAgKiBEcmF3IHRoZSBzcGVjaWZpZWQgYml0bWFwLCB3aXRoIGl0cyB0b3AvbGVmdCBjb3JuZXIgYXQgKHgseSksIHVzaW5nCiAgICAgICogdGhlIHNwZWNpZmllZCBwYWludCwgdHJhbnNmb3JtZWQgYnkgdGhlIGN1cnJlbnQgbWF0cml4LgogICAgICAqIApAQCAtMTI0Niw4ICsxMjcwLDggQEAKICAgICAgICAgICAgICh0ZXh0Lmxlbmd0aCAtIGluZGV4IC0gY291bnQpKSA8IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLSAgICAgICAgbmF0aXZlX2RyYXdUZXh0KG1OYXRpdmVDYW52YXMsIHRleHQsIGluZGV4LCBjb3VudCwgeCwgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIG5hdGl2ZV9kcmF3VGV4dChtTmF0aXZlQ2FudmFzLCB0ZXh0LCBpbmRleCwgY291bnQsIHgsIHksIHBhaW50Lm1CaWRpRmxhZ3MsCisgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyNTksNyArMTI4MywxMCBAQAogICAgICAqIEBwYXJhbSB5ICAgICBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBvcmlnaW4gb2YgdGhlIHRleHQgYmVpbmcgZHJhd24KICAgICAgKiBAcGFyYW0gcGFpbnQgVGhlIHBhaW50IHVzZWQgZm9yIHRoZSB0ZXh0IChlLmcuIGNvbG9yLCBzaXplLCBzdHlsZSkKICAgICAgKi8KLSAgICBwdWJsaWMgbmF0aXZlIHZvaWQgZHJhd1RleHQoU3RyaW5nIHRleHQsIGZsb2F0IHgsIGZsb2F0IHksIFBhaW50IHBhaW50KTsKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dChTdHJpbmcgdGV4dCwgZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgbmF0aXZlX2RyYXdUZXh0KG1OYXRpdmVDYW52YXMsIHRleHQsIDAsIHRleHQubGVuZ3RoKCksIHgsIHksIHBhaW50Lm1CaWRpRmxhZ3MsCisgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBEcmF3IHRoZSB0ZXh0LCB3aXRoIG9yaWdpbiBhdCAoeCx5KSwgdXNpbmcgdGhlIHNwZWNpZmllZCBwYWludC4KQEAgLTEyNzcsOCArMTMwNCw4IEBACiAgICAgICAgIGlmICgoc3RhcnQgfCBlbmQgfCAoZW5kIC0gc3RhcnQpIHwgKHRleHQubGVuZ3RoKCkgLSBlbmQpKSA8IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLSAgICAgICAgbmF0aXZlX2RyYXdUZXh0KG1OYXRpdmVDYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsIHgsIHksCi0gICAgICAgICAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICBuYXRpdmVfZHJhd1RleHQobU5hdGl2ZUNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwgeCwgeSwgcGFpbnQubUJpZGlGbGFncywKKyAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTI5OSwxNiArMTMyNiwxMDggQEAKICAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWRTdHJpbmcgfHwKICAgICAgICAgICAgIHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGVTdHJpbmcpIHsKICAgICAgICAgICAgIG5hdGl2ZV9kcmF3VGV4dChtTmF0aXZlQ2FudmFzLCB0ZXh0LnRvU3RyaW5nKCksIHN0YXJ0LCBlbmQsIHgsIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0ZXh0IGluc3RhbmNlb2YgR3JhcGhpY3NPcGVyYXRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQubUJpZGlGbGFncywgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgfSBlbHNlIGlmICh0ZXh0IGluc3RhbmNlb2YgR3JhcGhpY3NPcGVyYXRpb25zKSB7CiAgICAgICAgICAgICAoKEdyYXBoaWNzT3BlcmF0aW9ucykgdGV4dCkuZHJhd1RleHQodGhpcywgc3RhcnQsIGVuZCwgeCwgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRlbXBvcmFyeUJ1ZmZlci5vYnRhaW4oZW5kIC0gc3RhcnQpOwogICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIGJ1ZiwgMCk7Ci0gICAgICAgICAgICBkcmF3VGV4dChidWYsIDAsIGVuZCAtIHN0YXJ0LCB4LCB5LCBwYWludCk7CisgICAgICAgICAgICBuYXRpdmVfZHJhd1RleHQobU5hdGl2ZUNhbnZhcywgYnVmLCAwLCBlbmQgLSBzdGFydCwgeCwgeSwgCisgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1CaWRpRmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgICAgICBUZW1wb3JhcnlCdWZmZXIucmVjeWNsZShidWYpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVuZGVyIGEgcnVuIG9mIGFsbCBMVFIgb3IgYWxsIFJUTCB0ZXh0LCB3aXRoIHNoYXBpbmcuIFRoaXMgZG9lcyBub3QgcnVuCisgICAgICogYmlkaSBvbiB0aGUgcHJvdmlkZWQgdGV4dCwgYnV0IHJlbmRlcnMgaXQgYXMgYSB1bmlmb3JtIHJpZ2h0LXRvLWxlZnQgb3IKKyAgICAgKiBsZWZ0LXRvLXJpZ2h0IHJ1biwgYXMgaW5kaWNhdGVkIGJ5IGRpci4gQWxpZ25tZW50IG9mIHRoZSB0ZXh0IGlzIGFzCisgICAgICogZGV0ZXJtaW5lZCBieSB0aGUgUGFpbnQncyBUZXh0QWxpZ24gdmFsdWUuCisgICAgICogCisgICAgICogQHBhcmFtIHRleHQgdGhlIHRleHQgdG8gcmVuZGVyCisgICAgICogQHBhcmFtIGluZGV4IHRoZSBzdGFydCBvZiB0aGUgdGV4dCB0byByZW5kZXIKKyAgICAgKiBAcGFyYW0gY291bnQgdGhlIGNvdW50IG9mIGNoYXJzIHRvIHJlbmRlcgorICAgICAqIEBwYXJhbSBjb250ZXh0SW5kZXggdGhlIHN0YXJ0IG9mIHRoZSBjb250ZXh0IGZvciBzaGFwaW5nLiAgTXVzdCBiZQorICAgICAqICAgICAgICAgbm8gZ3JlYXRlciB0aGFuIGluZGV4LgorICAgICAqIEBwYXJhbSBjb250ZXh0Q291bnQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBjb250ZXh0IGZvciBzaGFwaW5nLgorICAgICAqICAgICAgICAgQ29udGV4SW5kZXggKyBjb250ZXh0Q291bnQgbXVzdCBiZSBubyBsZXNzIHRoYW4gaW5kZXgKKyAgICAgKiAgICAgICAgICsgY291bnQuCisgICAgICogQHBhcmFtIHggdGhlIHggcG9zaXRpb24gYXQgd2hpY2ggdG8gZHJhdyB0aGUgdGV4dAorICAgICAqIEBwYXJhbSB5IHRoZSB5IHBvc2l0aW9uIGF0IHdoaWNoIHRvIGRyYXcgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gZGlyIHRoZSBydW4gZGlyZWN0aW9uLCBlaXRoZXIge0BsaW5rICNESVJFQ1RJT05fTFRSfSBvcgorICAgICAqICAgICAgICAge0BsaW5rICNESVJFQ1RJT05fUlRMfS4KKyAgICAgKiBAcGFyYW0gcGFpbnQgdGhlIHBhaW50CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dFJ1bihjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCisgICAgICAgICAgICBpbnQgY29udGV4dEluZGV4LCBpbnQgY29udGV4dENvdW50LCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZGlyLAorICAgICAgICAgICAgUGFpbnQgcGFpbnQpIHsKKworICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInRleHQgaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChwYWludCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInBhaW50IGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGluZGV4IHwgY291bnQgfCB0ZXh0Lmxlbmd0aCAtIGluZGV4IC0gY291bnQpIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGlyICE9IERJUkVDVElPTl9MVFIgJiYgZGlyICE9IERJUkVDVElPTl9SVEwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZGlyOiAiICsgZGlyKTsKKyAgICAgICAgfQorCisgICAgICAgIG5hdGl2ZV9kcmF3VGV4dFJ1bihtTmF0aXZlQ2FudmFzLCB0ZXh0LCBpbmRleCwgY291bnQsCisgICAgICAgICAgICAgICAgY29udGV4dEluZGV4LCBjb250ZXh0Q291bnQsIHgsIHksIGRpciwgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgYSBydW4gb2YgYWxsIExUUiBvciBhbGwgUlRMIHRleHQsIHdpdGggc2hhcGluZy4gVGhpcyBkb2VzIG5vdCBydW4KKyAgICAgKiBiaWRpIG9uIHRoZSBwcm92aWRlZCB0ZXh0LCBidXQgcmVuZGVycyBpdCBhcyBhIHVuaWZvcm0gcmlnaHQtdG8tbGVmdCBvcgorICAgICAqIGxlZnQtdG8tcmlnaHQgcnVuLCBhcyBpbmRpY2F0ZWQgYnkgZGlyLiBBbGlnbm1lbnQgb2YgdGhlIHRleHQgaXMgYXMKKyAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBQYWludCdzIFRleHRBbGlnbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIHJlbmRlcgorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgdG8gcmVuZGVyLiBEYXRhIGJlZm9yZSB0aGlzIHBvc2l0aW9uCisgICAgICogICAgICAgICAgICBjYW4gYmUgdXNlZCBmb3Igc2hhcGluZyBjb250ZXh0LgorICAgICAqIEBwYXJhbSBlbmQgdGhlIGVuZCBvZiB0aGUgdGV4dCB0byByZW5kZXIuIERhdGEgYXQgb3IgYWZ0ZXIgdGhpcworICAgICAqICAgICAgICAgICAgcG9zaXRpb24gY2FuIGJlIHVzZWQgZm9yIHNoYXBpbmcgY29udGV4dC4KKyAgICAgKiBAcGFyYW0geCB0aGUgeCBwb3NpdGlvbiBhdCB3aGljaCB0byBkcmF3IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIHkgdGhlIHkgcG9zaXRpb24gYXQgd2hpY2ggdG8gZHJhdyB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBkaXIgdGhlIHJ1biBkaXJlY3Rpb24sIGVpdGhlciAwIGZvciBMVFIgb3IgMSBmb3IgUlRMLgorICAgICAqIEBwYXJhbSBwYWludCB0aGUgcGFpbnQKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0UnVuKENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgZmxvYXQgeCwgZmxvYXQgeSwgaW50IGRpciwKKyAgICAgICAgICAgIFBhaW50IHBhaW50KSB7CisKKyAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0ZXh0IGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFpbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwYWludCBpcyBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChzdGFydCB8IGVuZCB8IGVuZCAtIHN0YXJ0IHwgdGV4dC5sZW5ndGgoKSAtIGVuZCkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGZsYWdzID0gZGlyID09IDAgPyAwIDogMTsKKworICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFN0cmluZyB8fCB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZFN0cmluZyB8fAorICAgICAgICAgICAgICAgIHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGVTdHJpbmcpIHsKKyAgICAgICAgICAgIG5hdGl2ZV9kcmF3VGV4dFJ1bihtTmF0aXZlQ2FudmFzLCB0ZXh0LnRvU3RyaW5nKCksIHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgeCwgeSwgZmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIH0gZWxzZSBpZiAodGV4dCBpbnN0YW5jZW9mIEdyYXBoaWNzT3BlcmF0aW9ucykgeworICAgICAgICAgICAgKChHcmFwaGljc09wZXJhdGlvbnMpIHRleHQpLmRyYXdUZXh0UnVuKHRoaXMsIHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgeCwgeSwgZmxhZ3MsIHBhaW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBUZW1wb3JhcnlCdWZmZXIub2J0YWluKGNvbnRleHRMZW4pOworICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYnVmLCAwKTsKKyAgICAgICAgICAgIG5hdGl2ZV9kcmF3VGV4dFJ1bihtTmF0aXZlQ2FudmFzLCBidWYsIHN0YXJ0IC0gY29udGV4dFN0YXJ0LCBsZW4sCisgICAgICAgICAgICAgICAgICAgIDAsIGNvbnRleHRMZW4sIHgsIHksIGZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOwogICAgICAgICAgICAgVGVtcG9yYXJ5QnVmZmVyLnJlY3ljbGUoYnVmKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEzNjgsNyArMTQ4Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgbmF0aXZlX2RyYXdUZXh0T25QYXRoKG1OYXRpdmVDYW52YXMsIHRleHQsIGluZGV4LCBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgubmkoKSwgaE9mZnNldCwgdk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludC5tQmlkaUZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM4OCw3ICsxNTA3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2T2Zmc2V0LCBQYWludCBwYWludCkgewogICAgICAgICBpZiAodGV4dC5sZW5ndGgoKSA+IDApIHsKICAgICAgICAgICAgIG5hdGl2ZV9kcmF3VGV4dE9uUGF0aChtTmF0aXZlQ2FudmFzLCB0ZXh0LCBwYXRoLm5pKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaE9mZnNldCwgdk9mZnNldCwgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoT2Zmc2V0LCB2T2Zmc2V0LCBwYWludC5tQmlkaUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE0MzEsMjggKzE1NTEsNzQgQEAKICAgICAgICAgZHJhd1BpY3R1cmUocGljdHVyZSk7CiAgICAgICAgIHJlc3RvcmUoKTsKICAgICB9Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiA8cD5BY3F1aXJlcyB0aGUgQ2FudmFzIGNvbnRleHQuIEFmdGVyIGludm9raW5nIHRoaXMgbWV0aG9kLCB0aGUgQ2FudmFzCisgICAgICogY29udGV4dCAgY2FuIGJlIG1vZGlmaWVkIGJ5IHRoZSBjYWxsZXIuIEZvciBpbnN0YW5jZSwgaWYgeW91IGFjcXVpcmUKKyAgICAgKiB0aGUgY29udGV4dCBvZiBhbiBPcGVuR0wgQ2FudmFzIHlvdSBjYW4gcmVzZXQgdGhlIEdMIHZpZXdwb3J0LCBzY2lzc29yLAorICAgICAqIGV0Yy48L3A+CisgICAgICogCisgICAgICogPHA+QSBjYWxsIHRvIHtAbGluayAjYWNxdWlyZUNvbnRleHQoKX0gc2hvdWxkIGF3YXlzIGJlIGZvbGxvd2VkIGJ5CisgICAgICogYSBjYWxsIHRvIHtAbGluayAjcmVsZWFzZUNvbnRleHQoKX0sIHByZWZlcnJhYmx5IHVzaW5nIGEgdHJ5IGJsb2NrOjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cHJlPgorICAgICAqIHRyeSB7CisgICAgICogICAgIGlmIChjYW52YXMuYWNxdWlyZUNvbnRleHQoKSkgeworICAgICAqICAgICAgICAgLy8gVXNlIHRoZSBjYW52YXMgYW5kL29yIGl0cyBjb250ZXh0CisgICAgICogICAgIH0KKyAgICAgKiB9IGZpbmFsbHkgeworICAgICAqICAgICBjYW52YXMucmVsZWFzZUNvbnRleHQoKTsKKyAgICAgKiB9CisgICAgICogPC9wcmU+CisgICAgICogCisgICAgICogPHA+QWNxdWlyaW5nIHRoZSBjb250ZXh0IGNhbiBiZSBhbiBleHBlbnNpdmUgb3BlcmF0aW9uIGFuZCBzaG91bGQgbm90CisgICAgICogYmUgZG9uZSB1bmxlc3MgYWJzb2x1dGVseSBuZWNlc3NhcnkuPC9wPgorICAgICAqIAorICAgICAqIDxwPkFwcGxpY2F0aW9ucyBzaG91bGQgbmV2ZXIgaW52b2tlIHRoaXMgbWV0aG9kIGRpcmVjdGx5LjwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNvbnRleHQgY291bGQgYmUgYWNxdWlyZWQgc3VjY2Vzc2Z1bGx5LCBmYWxzZQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlIChpZiB0aGUgY29udGV4dCBpcyBhbHJlYWR5IGFjcXVpcmVkIGZvciBpbnN0YW5jZS4pCisgICAgICogCisgICAgICogQHNlZSAjcmVsZWFzZUNvbnRleHQoKSAKKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFjcXVpcmVDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+UmVsZWFzZSB0aGUgY29udGV4dCBhY3F1aXJlZCB3aXRoIHtAbGluayAjYWNxdWlyZUNvbnRleHQoKX0uPC9wPgorICAgICAqIAorICAgICAqIEBzZWUgI2FjcXVpcmVDb250ZXh0KCkgCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlQ29udGV4dCgpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgICAgICAvLyBJZiB0aGUgY29uc3RydWN0b3IgdGhyZXcgYW4gZXhjZXB0aW9uIGJlZm9yZSBzZXR0aW5nIG1OYXRpdmVDYW52YXMsIHRoZSBuYXRpdmUgZmluYWxpemVyCi0gICAgICAgIC8vIG11c3Qgbm90IGJlIGludm9rZWQuCi0gICAgICAgIGlmIChtTmF0aXZlQ2FudmFzICE9IDApIHsKLSAgICAgICAgICAgIGZpbmFsaXplcihtTmF0aXZlQ2FudmFzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgY29uc3RydWN0b3IgdGhyZXcgYW4gZXhjZXB0aW9uIGJlZm9yZSBzZXR0aW5nIG1OYXRpdmVDYW52YXMsCisgICAgICAgICAgICAvLyB0aGUgbmF0aXZlIGZpbmFsaXplciBtdXN0IG5vdCBiZSBpbnZva2VkLgorICAgICAgICAgICAgaWYgKG1OYXRpdmVDYW52YXMgIT0gMCkgeworICAgICAgICAgICAgICAgIGZpbmFsaXplcihtTmF0aXZlQ2FudmFzKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEZyZWUgdXAgYXMgbXVjaCBtZW1vcnkgYXMgcG9zc2libGUgZnJvbSBwcml2YXRlIGNhY2hlcyAoZS5nLiBmb250cywKLSAgICAgKiBpbWFnZXMpCisgICAgICogRnJlZSB1cCBhcyBtdWNoIG1lbW9yeSBhcyBwb3NzaWJsZSBmcm9tIHByaXZhdGUgY2FjaGVzIChlLmcuIGZvbnRzLCBpbWFnZXMpCiAgICAgICoKLSAgICAgKiBAaGlkZSAtIGZvciBub3cKKyAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgZnJlZUNhY2hlcygpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBpbml0UmFzdGVyKGludCBuYXRpdmVCaXRtYXBPclplcm8pOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgaW5pdEdMKCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX3NldEJpdG1hcChpbnQgbmF0aXZlQ2FudmFzLCBpbnQgYml0bWFwKTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVTZXRWaWV3cG9ydChpbnQgbkNhbnZhcywgaW50IHcsIGludCBoKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9zYXZlTGF5ZXIoaW50IG5hdGl2ZUNhbnZhcywgUmVjdEYgYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFpbnQsIGludCBsYXllckZsYWdzKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9zYXZlTGF5ZXIoaW50IG5hdGl2ZUNhbnZhcywgZmxvYXQgbCwKQEAgLTE1NTUsMTAgKzE3MjEsMTkgQEAKICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZHJhd1RleHQoaW50IG5hdGl2ZUNhbnZhcywgY2hhcltdIHRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgaW50IGNvdW50LCBmbG9hdCB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5LCBpbnQgcGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5LCBpbnQgZmxhZ3MsIGludCBwYWludCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdUZXh0KGludCBuYXRpdmVDYW52YXMsIFN0cmluZyB0ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsIGZsb2F0IHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHksIGludCBwYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHksIGludCBmbGFncywgaW50IHBhaW50KTsKKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3VGV4dFJ1bihpbnQgbmF0aXZlQ2FudmFzLCBTdHJpbmcgdGV4dCwKKyAgICAgICAgICAgIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZmxhZ3MsIGludCBwYWludCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZHJhd1RleHRSdW4oaW50IG5hdGl2ZUNhbnZhcywgY2hhcltdIHRleHQsCisgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBjb3VudCwgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBmbGFncywgaW50IHBhaW50KTsKKwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3UG9zVGV4dChpbnQgbmF0aXZlQ2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gdGV4dCwgaW50IGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIGZsb2F0W10gcG9zLApAQCAtMTU3MCwxMSArMTc0NSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gdGV4dCwgaW50IGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIGludCBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBoT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2T2Zmc2V0LCBpbnQgcGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2T2Zmc2V0LCBpbnQgYmlkaUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFpbnQpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3VGV4dE9uUGF0aChpbnQgbmF0aXZlQ2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwgaW50IHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGhPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZPZmZzZXQsIGludCBwYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGhPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2T2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLCBpbnQgcGFpbnQpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3UGljdHVyZShpbnQgbmF0aXZlQ2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmF0aXZlUGljdHVyZSk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgZmluYWxpemVyKGludCBuYXRpdmVDYW52YXMpOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29sb3JGaWx0ZXIuamF2YQppbmRleCA3NmYyYzdmLi5lNWNmODMwIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29sb3JGaWx0ZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29sb3JGaWx0ZXIuamF2YQpAQCAtMjMsMTIgKzIzLDIwIEBACiAKIAogcHVibGljIGNsYXNzIENvbG9yRmlsdGVyIHsKKyAgICBpbnQgbmF0aXZlX2luc3RhbmNlOworCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG5hdGl2ZUNvbG9yRmlsdGVyOwogCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgZmluYWxpemVyKG5hdGl2ZV9pbnN0YW5jZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZmluYWxpemVyKG5hdGl2ZV9pbnN0YW5jZSwgbmF0aXZlQ29sb3JGaWx0ZXIpOworICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgZmluYWxpemVyKGludCBuYXRpdmVfaW5zdGFuY2UpOwotCi0gICAgaW50IG5hdGl2ZV9pbnN0YW5jZTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBmaW5hbGl6ZXIoaW50IG5hdGl2ZV9pbnN0YW5jZSwgaW50IG5hdGl2ZUNvbG9yRmlsdGVyKTsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db2xvck1hdHJpeENvbG9yRmlsdGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29sb3JNYXRyaXhDb2xvckZpbHRlci5qYXZhCmluZGV4IDVkNzNjZmYuLjI0NWM2MTUgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db2xvck1hdHJpeENvbG9yRmlsdGVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yTWF0cml4Q29sb3JGaWx0ZXIuamF2YQpAQCAtMjUsNyArMjUsOSBAQAogICAgICAqICAgICAgICAgICAgICAgaXMgY29uc3RydWN0ZWQgd2lsbCBub3QgYmUgcmVmbGVjdGVkIGluIHRoZSBmaWx0ZXIuCiAgICAgICovCiAgICAgcHVibGljIENvbG9yTWF0cml4Q29sb3JGaWx0ZXIoQ29sb3JNYXRyaXggbWF0cml4KSB7Ci0gICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNvbG9yTWF0cml4RmlsdGVyKG1hdHJpeC5nZXRBcnJheSgpKTsKKyAgICAgICAgZmluYWwgZmxvYXRbXSBjb2xvck1hdHJpeCA9IG1hdHJpeC5nZXRBcnJheSgpOworICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDb2xvck1hdHJpeEZpbHRlcihjb2xvck1hdHJpeCk7CisgICAgICAgIG5hdGl2ZUNvbG9yRmlsdGVyID0gbkNvbG9yTWF0cml4RmlsdGVyKGNvbG9yTWF0cml4KTsKICAgICB9CiAKICAgICAvKioKQEAgLTQwLDcgKzQyLDkgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgfQogICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDb2xvck1hdHJpeEZpbHRlcihhcnJheSk7CisgICAgICAgIG5hdGl2ZUNvbG9yRmlsdGVyID0gbkNvbG9yTWF0cml4RmlsdGVyKGFycmF5KTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNvbG9yTWF0cml4RmlsdGVyKGZsb2F0W10gYXJyYXkpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbkNvbG9yTWF0cml4RmlsdGVyKGZsb2F0W10gYXJyYXkpOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbXBvc2VTaGFkZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db21wb3NlU2hhZGVyLmphdmEKaW5kZXggYTA2ZDMwYi4uOGQ1YzkxMyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbXBvc2VTaGFkZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29tcG9zZVNoYWRlci5qYXZhCkBAIC0yMCw2ICsyMCwxNCBAQAogICAgIGFuIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLlhmZXJtb2RlfSBzdWJjbGFzcy4KICovCiBwdWJsaWMgY2xhc3MgQ29tcG9zZVNoYWRlciBleHRlbmRzIFNoYWRlciB7CisgICAgLyoqCisgICAgICogSG9sZCBvbnRvIHRoZSBzaGFkZXJzIHRvIGF2b2lkIEdDLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKKyAgICBwcml2YXRlIGZpbmFsIFNoYWRlciBtU2hhZGVyQTsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCisgICAgcHJpdmF0ZSBmaW5hbCBTaGFkZXIgbVNoYWRlckI7CisKICAgICAvKiogQ3JlYXRlIGEgbmV3IGNvbXBvc2Ugc2hhZGVyLCBnaXZlbiBzaGFkZXJzIEEsIEIsIGFuZCBhIGNvbWJpbmluZyBtb2RlLgogICAgICAgICBXaGVuIHRoZSBtb2RlIGlzIGFwcGxpZWQsIGl0IHdpbGwgYmUgZ2l2ZW4gdGhlIHJlc3VsdCBmcm9tIHNoYWRlciBBIGFzIGl0cwogICAgICAgICAiZHN0IiwgYW5kIHRoZSByZXN1bHQgb2YgZnJvbSBzaGFkZXIgQiBhcyBpdHMgInNyYyIuCkBAIC0yOSw4ICszNywxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaXMgbnVsbCwgdGhlbiBTUkNfT1ZFUiBpcyBhc3N1bWVkLgogICAgICovCiAgICAgcHVibGljIENvbXBvc2VTaGFkZXIoU2hhZGVyIHNoYWRlckEsIFNoYWRlciBzaGFkZXJCLCBYZmVybW9kZSBtb2RlKSB7CisgICAgICAgIG1TaGFkZXJBID0gc2hhZGVyQTsKKyAgICAgICAgbVNoYWRlckIgPSBzaGFkZXJCOwogICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDcmVhdGUxKHNoYWRlckEubmF0aXZlX2luc3RhbmNlLCBzaGFkZXJCLm5hdGl2ZV9pbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW9kZSAhPSBudWxsKSA/IG1vZGUubmF0aXZlX2luc3RhbmNlIDogMCk7CisgICAgICAgICAgICAgICAgKG1vZGUgIT0gbnVsbCkgPyBtb2RlLm5hdGl2ZV9pbnN0YW5jZSA6IDApOworICAgICAgICBpZiAobW9kZSBpbnN0YW5jZW9mIFBvcnRlckR1ZmZYZmVybW9kZSkgeworICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlIHBkTW9kZSA9ICgoUG9ydGVyRHVmZlhmZXJtb2RlKSBtb2RlKS5tb2RlOworICAgICAgICAgICAgbmF0aXZlX3NoYWRlciA9IG5hdGl2ZVBvc3RDcmVhdGUyKG5hdGl2ZV9pbnN0YW5jZSwgc2hhZGVyQS5uYXRpdmVfc2hhZGVyLAorICAgICAgICAgICAgICAgICAgICBzaGFkZXJCLm5hdGl2ZV9zaGFkZXIsIHBkTW9kZSAhPSBudWxsID8gcGRNb2RlLm5hdGl2ZUludCA6IDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmF0aXZlX3NoYWRlciA9IG5hdGl2ZVBvc3RDcmVhdGUxKG5hdGl2ZV9pbnN0YW5jZSwgc2hhZGVyQS5uYXRpdmVfc2hhZGVyLAorICAgICAgICAgICAgICAgICAgICBzaGFkZXJCLm5hdGl2ZV9zaGFkZXIsIG1vZGUgIT0gbnVsbCA/IG1vZGUubmF0aXZlX2luc3RhbmNlIDogMCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKiogQ3JlYXRlIGEgbmV3IGNvbXBvc2Ugc2hhZGVyLCBnaXZlbiBzaGFkZXJzIEEsIEIsIGFuZCBhIGNvbWJpbmluZyBQb3J0ZXJEdWZmIG1vZGUuCkBAIC00MSwxMSArNTksMjAgQEAKICAgICAgICAgQHBhcmFtIG1vZGUgICAgIFRoZSBQb3J0ZXJEdWZmIG1vZGUgdGhhdCBjb21iaW5lcyB0aGUgY29sb3JzIGZyb20gdGhlIHR3byBzaGFkZXJzLgogICAgICovCiAgICAgcHVibGljIENvbXBvc2VTaGFkZXIoU2hhZGVyIHNoYWRlckEsIFNoYWRlciBzaGFkZXJCLCBQb3J0ZXJEdWZmLk1vZGUgbW9kZSkgeworICAgICAgICBtU2hhZGVyQSA9IHNoYWRlckE7CisgICAgICAgIG1TaGFkZXJCID0gc2hhZGVyQjsKICAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlQ3JlYXRlMihzaGFkZXJBLm5hdGl2ZV9pbnN0YW5jZSwgc2hhZGVyQi5uYXRpdmVfaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZS5uYXRpdmVJbnQpOworICAgICAgICAgICAgICAgIG1vZGUubmF0aXZlSW50KTsKKyAgICAgICAgbmF0aXZlX3NoYWRlciA9IG5hdGl2ZVBvc3RDcmVhdGUyKG5hdGl2ZV9pbnN0YW5jZSwgc2hhZGVyQS5uYXRpdmVfc2hhZGVyLAorICAgICAgICAgICAgICAgIHNoYWRlckIubmF0aXZlX3NoYWRlciwgbW9kZS5uYXRpdmVJbnQpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMShpbnQgbmF0aXZlX3NoYWRlckEsIGludCBuYXRpdmVfc2hhZGVyQiwgaW50IG5hdGl2ZV9tb2RlKTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTIoaW50IG5hdGl2ZV9zaGFkZXJBLCBpbnQgbmF0aXZlX3NoYWRlckIsIGludCBwb3J0ZXJEdWZmTW9kZSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUxKGludCBuYXRpdmVfc2hhZGVyQSwgaW50IG5hdGl2ZV9zaGFkZXJCLAorICAgICAgICAgICAgaW50IG5hdGl2ZV9tb2RlKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTIoaW50IG5hdGl2ZV9zaGFkZXJBLCBpbnQgbmF0aXZlX3NoYWRlckIsCisgICAgICAgICAgICBpbnQgcG9ydGVyRHVmZk1vZGUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlUG9zdENyZWF0ZTEoaW50IG5hdGl2ZV9zaGFkZXIsIGludCBuYXRpdmVfc2tpYVNoYWRlckEsCisgICAgICAgICAgICBpbnQgbmF0aXZlX3NraWFTaGFkZXJCLCBpbnQgbmF0aXZlX21vZGUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlUG9zdENyZWF0ZTIoaW50IG5hdGl2ZV9zaGFkZXIsIGludCBuYXRpdmVfc2tpYVNoYWRlckEsCisgICAgICAgICAgICBpbnQgbmF0aXZlX3NraWFTaGFkZXJCLCBpbnQgcG9ydGVyRHVmZk1vZGUpOwogfQotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTGlnaHRpbmdDb2xvckZpbHRlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0xpZ2h0aW5nQ29sb3JGaWx0ZXIuamF2YQppbmRleCA1NTYyMzg5Li43MTVjZTg2IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTGlnaHRpbmdDb2xvckZpbHRlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9MaWdodGluZ0NvbG9yRmlsdGVyLmphdmEKQEAgLTMwLDcgKzMwLDkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgTGlnaHRpbmdDb2xvckZpbHRlcihpbnQgbXVsLCBpbnQgYWRkKSB7CiAgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZV9DcmVhdGVMaWdodGluZ0ZpbHRlcihtdWwsIGFkZCk7CisgICAgICAgIG5hdGl2ZUNvbG9yRmlsdGVyID0gbkNyZWF0ZUxpZ2h0aW5nRmlsdGVyKG11bCwgYWRkKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9DcmVhdGVMaWdodGluZ0ZpbHRlcihpbnQgbXVsLCBpbnQgYWRkKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5DcmVhdGVMaWdodGluZ0ZpbHRlcihpbnQgbXVsLCBpbnQgYWRkKTsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9MaW5lYXJHcmFkaWVudC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0xpbmVhckdyYWRpZW50LmphdmEKaW5kZXggZTNkYjEwNS4uODJlZDE5OSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0xpbmVhckdyYWRpZW50LmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0xpbmVhckdyYWRpZW50LmphdmEKQEAgLTE3LDcgKzE3LDYgQEAKIHBhY2thZ2UgYW5kcm9pZC5ncmFwaGljczsKIAogcHVibGljIGNsYXNzIExpbmVhckdyYWRpZW50IGV4dGVuZHMgU2hhZGVyIHsKLQogCS8qKglDcmVhdGUgYSBzaGFkZXIgdGhhdCBkcmF3cyBhIGxpbmVhciBncmFkaWVudCBhbG9uZyBhIGxpbmUuCiAgICAgICAgIEBwYXJhbSB4MCAgICAgICAgICAgVGhlIHgtY29vcmRpbmF0ZSBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBncmFkaWVudCBsaW5lCiAgICAgICAgIEBwYXJhbSB5MCAgICAgICAgICAgVGhlIHktY29vcmRpbmF0ZSBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBncmFkaWVudCBsaW5lCkBAIC0zOCw2ICszNyw4IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb2xvciBhbmQgcG9zaXRpb24gYXJyYXlzIG11c3QgYmUgb2YgZXF1YWwgbGVuZ3RoIik7CiAgICAgICAgIH0KICAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlQ3JlYXRlMSh4MCwgeTAsIHgxLCB5MSwgY29sb3JzLCBwb3NpdGlvbnMsIHRpbGUubmF0aXZlSW50KTsKKyAgICAgICAgbmF0aXZlX3NoYWRlciA9IG5hdGl2ZVBvc3RDcmVhdGUxKG5hdGl2ZV9pbnN0YW5jZSwgeDAsIHkwLCB4MSwgeTEsIGNvbG9ycywgcG9zaXRpb25zLAorICAgICAgICAgICAgICAgIHRpbGUubmF0aXZlSW50KTsKICAgICB9CiAKIAkvKioJQ3JlYXRlIGEgc2hhZGVyIHRoYXQgZHJhd3MgYSBsaW5lYXIgZ3JhZGllbnQgYWxvbmcgYSBsaW5lLgpAQCAtNTIsMTIgKzUzLDE2IEBACiAJcHVibGljIExpbmVhckdyYWRpZW50KGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IwLCBpbnQgY29sb3IxLCBUaWxlTW9kZSB0aWxlKSB7CiAgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNyZWF0ZTIoeDAsIHkwLCB4MSwgeTEsIGNvbG9yMCwgY29sb3IxLCB0aWxlLm5hdGl2ZUludCk7CisgICAgICAgIG5hdGl2ZV9zaGFkZXIgPSBuYXRpdmVQb3N0Q3JlYXRlMihuYXRpdmVfaW5zdGFuY2UsIHgwLCB5MCwgeDEsIHkxLCBjb2xvcjAsIGNvbG9yMSwKKyAgICAgICAgICAgICAgICB0aWxlLm5hdGl2ZUludCk7CiAgICAgfQogCi0KLQlwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTEoZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvcnNbXSwgZmxvYXQgcG9zaXRpb25zW10sIGludCB0aWxlTW9kZSk7Ci0JcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUyKGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IwLCBpbnQgY29sb3IxLCBpbnQgdGlsZU1vZGUpOworCXByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUxKGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLAorICAgICAgICAgICAgaW50IGNvbG9yc1tdLCBmbG9hdCBwb3NpdGlvbnNbXSwgaW50IHRpbGVNb2RlKTsKKwlwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMihmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwKKyAgICAgICAgICAgIGludCBjb2xvcjAsIGludCBjb2xvcjEsIGludCB0aWxlTW9kZSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZVBvc3RDcmVhdGUxKGludCBuYXRpdmVfc2hhZGVyLCBmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwKKyAgICAgICAgICAgIGludCBjb2xvcnNbXSwgZmxvYXQgcG9zaXRpb25zW10sIGludCB0aWxlTW9kZSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZVBvc3RDcmVhdGUyKGludCBuYXRpdmVfc2hhZGVyLCBmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwKKyAgICAgICAgICAgIGludCBjb2xvcjAsIGludCBjb2xvcjEsIGludCB0aWxlTW9kZSk7CiB9Ci0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9NYXRyaXguamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9NYXRyaXguamF2YQppbmRleCBmNTQ5OTAwLi42NmVkMTA0IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTWF0cml4LmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL01hdHJpeC5qYXZhCkBAIC0zNyw3ICszNywxMCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1QRVJTUF8xID0gNzsgICAvLyE8IHVzZSB3aXRoIGdldFZhbHVlcy9zZXRWYWx1ZXMKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNUEVSU1BfMiA9IDg7ICAgLy8hPCB1c2Ugd2l0aCBnZXRWYWx1ZXMvc2V0VmFsdWVzCiAKLSAgICAvKiBwYWNrYWdlICovIGludCBuYXRpdmVfaW5zdGFuY2U7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG5hdGl2ZV9pbnN0YW5jZTsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbiBpZGVudGl0eSBtYXRyaXgKQEAgLTQxOSw2ICs0MjIsMTAgQEAKICAgICAgKiB0aGUgdHJhbnNmb3JtZWQgdmVjdG9ycyBpbnRvIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHNwZWNpZmllZCBieSBkc3QuIFRoZQogICAgICAqIHR3byBhcnJheXMgcmVwcmVzZW50IHRoZWlyICJ2ZWN0b3JzIiBhcyBwYWlycyBvZiBmbG9hdHMgW3gsIHldLgogICAgICAqCisgICAgICogTm90ZTogdGhpcyBtZXRob2QgZG9lcyBub3QgYXBwbHkgdGhlIHRyYW5zbGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWF0cml4LiBVc2UKKyAgICAgKiB7QGxpbmsgTWF0cml4I21hcFBvaW50cyhmbG9hdFtdLCBpbnQsIGZsb2F0W10sIGludCwgaW50KX0gaWYgeW91IHdhbnQgdGhlIHRyYW5zbGF0aW9uCisgICAgICogdG8gYmUgYXBwbGllZC4KKyAgICAgKgogICAgICAqIEBwYXJhbSBkc3QgICBUaGUgYXJyYXkgb2YgZHN0IHZlY3RvcnMgKHgseSBwYWlycykKICAgICAgKiBAcGFyYW0gZHN0SW5kZXggVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBbeCx5XSBwYWlyIG9mIGRzdCBmbG9hdHMKICAgICAgKiBAcGFyYW0gc3JjICAgVGhlIGFycmF5IG9mIHNyYyB2ZWN0b3JzICh4LHkgcGFpcnMpCkBAIC00NTIsNiArNDU5LDkgQEAKICAgICAgKiB0aGUgdHJhbnNmb3JtZWQgdmVjdG9ycyBpbnRvIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHNwZWNpZmllZCBieSBkc3QuIFRoZQogICAgICAqIHR3byBhcnJheXMgcmVwcmVzZW50IHRoZWlyICJ2ZWN0b3JzIiBhcyBwYWlycyBvZiBmbG9hdHMgW3gsIHldLgogICAgICAqCisgICAgICogTm90ZTogdGhpcyBtZXRob2QgZG9lcyBub3QgYXBwbHkgdGhlIHRyYW5zbGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWF0cml4LiBVc2UKKyAgICAgKiB7QGxpbmsgTWF0cml4I21hcFBvaW50cyhmbG9hdFtdLCBmbG9hdFtdKX0gaWYgeW91IHdhbnQgdGhlIHRyYW5zbGF0aW9uIHRvIGJlIGFwcGxpZWQuCisgICAgICoKICAgICAgKiBAcGFyYW0gZHN0ICAgVGhlIGFycmF5IG9mIGRzdCB2ZWN0b3JzICh4LHkgcGFpcnMpCiAgICAgICogQHBhcmFtIHNyYyAgIFRoZSBhcnJheSBvZiBzcmMgdmVjdG9ycyAoeCx5IHBhaXJzKQogICAgICAqLwpAQCAtNDc1LDYgKzQ4NSwxMCBAQAogICAgIC8qKgogICAgICAqIEFwcGx5IHRoaXMgbWF0cml4IHRvIHRoZSBhcnJheSBvZiAyRCB2ZWN0b3JzLCBhbmQgd3JpdGUgdGhlIHRyYW5zZm9ybWVkCiAgICAgICogdmVjdG9ycyBiYWNrIGludG8gdGhlIGFycmF5LgorICAgICAqCisgICAgICogTm90ZTogdGhpcyBtZXRob2QgZG9lcyBub3QgYXBwbHkgdGhlIHRyYW5zbGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWF0cml4LiBVc2UKKyAgICAgKiB7QGxpbmsgTWF0cml4I21hcFBvaW50cyhmbG9hdFtdKX0gaWYgeW91IHdhbnQgdGhlIHRyYW5zbGF0aW9uIHRvIGJlIGFwcGxpZWQuCisgICAgICoKICAgICAgKiBAcGFyYW0gdmVjcyBUaGUgYXJyYXkgW3gwLCB5MCwgeDEsIHkxLCAuLi5dIG9mIHZlY3RvcnMgdG8gdHJhbnNmb3JtLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG1hcFZlY3RvcnMoZmxvYXRbXSB2ZWNzKSB7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTmluZVBhdGNoLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTmluZVBhdGNoLmphdmEKaW5kZXggODhkZmQ2Ny4uZGY2ZmViYSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL05pbmVQYXRjaC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9OaW5lUGF0Y2guamF2YQpAQCAtMzUsNiArMzUsMTIgQEAKICAqIDwvcD4KICAqLwogcHVibGljIGNsYXNzIE5pbmVQYXRjaCB7CisgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDsKKyAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBtQ2h1bms7CisgICAgcHJpdmF0ZSBQYWludCBtUGFpbnQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVNyY05hbWU7ICAvLyBVc2VmdWwgZm9yIGRlYnVnZ2luZworICAgIHByaXZhdGUgZmluYWwgUmVjdEYgbVJlY3QgPSBuZXcgUmVjdEYoKTsKKyAgICAKICAgICAvKiogCiAgICAgICogQ3JlYXRlIGEgZHJhd2FibGUgcHJvamVjdGlvbiBmcm9tIGEgYml0bWFwIHRvIG5pbmUgcGF0Y2hlcy4KICAgICAgKgpAQCAtNzQsMTAgKzgwLDE0IEBACiAgICAgICogQHBhcmFtIGxvY2F0aW9uICBXaGVyZSB0byBkcmF3IHRoZSBiaXRtYXAuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzLCBSZWN0RiBsb2NhdGlvbikgewotICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywKLSAgICAgICAgICAgICAgICAgICBtUGFpbnQgIT0gbnVsbCA/IG1QYWludC5tTmF0aXZlUGFpbnQgOiAwLAotICAgICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIGlmICghY2FudmFzLmlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpKSB7CisgICAgICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgbUJpdG1hcC5uaSgpLCBtQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgIG1QYWludCAhPSBudWxsID8gbVBhaW50Lm1OYXRpdmVQYWludCA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGNoKG1CaXRtYXAsIG1DaHVuaywgbG9jYXRpb24sIG51bGwpOworICAgICAgICB9CiAgICAgfQogICAgIAogICAgIC8qKiAKQEAgLTg3LDEwICs5NywxNSBAQAogICAgICAqIEBwYXJhbSBsb2NhdGlvbiAgV2hlcmUgdG8gZHJhdyB0aGUgYml0bWFwLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcywgUmVjdCBsb2NhdGlvbikgewotICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywKLSAgICAgICAgICAgICAgICBtUGFpbnQgIT0gbnVsbCA/IG1QYWludC5tTmF0aXZlUGFpbnQgOiAwLAotICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIGlmICghY2FudmFzLmlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpKSB7CisgICAgICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CaXRtYXAubmkoKSwgbUNodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgbVBhaW50ICE9IG51bGwgPyBtUGFpbnQubU5hdGl2ZVBhaW50IDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVjdC5zZXQobG9jYXRpb24pOworICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRjaChtQml0bWFwLCBtQ2h1bmssIG1SZWN0LCBudWxsKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKiAKQEAgLTEwMSw5ICsxMTYsMTQgQEAKICAgICAgKiBAcGFyYW0gcGFpbnQgICAgIFRoZSBQYWludCB0byBkcmF3IHRocm91Z2guCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzLCBSZWN0IGxvY2F0aW9uLCBQYWludCBwYWludCkgewotICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywgcGFpbnQgIT0gbnVsbCA/IHBhaW50Lm1OYXRpdmVQYWludCA6IDAsCi0gICAgICAgICAgICAgICAgY2FudmFzLm1EZW5zaXR5LCBtQml0bWFwLm1EZW5zaXR5KTsKKyAgICAgICAgaWYgKCFjYW52YXMuaXNIYXJkd2FyZUFjY2VsZXJhdGVkKCkpIHsKKyAgICAgICAgICAgIG5hdGl2ZURyYXcoY2FudmFzLm1OYXRpdmVDYW52YXMsIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywgcGFpbnQgIT0gbnVsbCA/IHBhaW50Lm1OYXRpdmVQYWludCA6IDAsCisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVjdC5zZXQobG9jYXRpb24pOworICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRjaChtQml0bWFwLCBtQ2h1bmssIG1SZWN0LCBwYWludCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTEzMywxMSArMTUzLDYgQEAKICAgICAKICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIGlzTmluZVBhdGNoQ2h1bmsoYnl0ZVtdIGNodW5rKTsKIAotICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gbUNodW5rOwotICAgIHByaXZhdGUgUGFpbnQgICAgICAgIG1QYWludDsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgICBtU3JjTmFtZTsgIC8vIFVzZWZ1bCBmb3IgZGVidWdnaW5nCi0KICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCB2YWxpZGF0ZU5pbmVQYXRjaENodW5rKGludCBiaXRtYXAsIGJ5dGVbXSBjaHVuayk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlRHJhdyhpbnQgY2FudmFzX2luc3RhbmNlLCBSZWN0RiBsb2MsIGludCBiaXRtYXBfaW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYywgaW50IHBhaW50X2luc3RhbmNlX29yX251bGwsCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYWludC5qYXZhCmluZGV4IDNlM2Y4N2IuLjYyZmJmYjQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYWludC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYWludC5qYXZhCkBAIC0xNiwxMCArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzOwogCi1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuR3JhcGhpY3NPcGVyYXRpb25zOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWRTdHJpbmc7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LkdyYXBoaWNzT3BlcmF0aW9uczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogCiAvKioKICAqIFRoZSBQYWludCBjbGFzcyBob2xkcyB0aGUgc3R5bGUgYW5kIGNvbG9yIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBkcmF3CkBAIC0yNyw3ICsyNywxMSBAQAogICovCiBwdWJsaWMgY2xhc3MgUGFpbnQgewogCi0gICAgLypwYWNrYWdlKi8gaW50ICAgICBtTmF0aXZlUGFpbnQ7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG1OYXRpdmVQYWludDsKKwogICAgIHByaXZhdGUgQ29sb3JGaWx0ZXIgbUNvbG9yRmlsdGVyOwogICAgIHByaXZhdGUgTWFza0ZpbHRlciAgbU1hc2tGaWx0ZXI7CiAgICAgcHJpdmF0ZSBQYXRoRWZmZWN0ICBtUGF0aEVmZmVjdDsKQEAgLTM5LDYgKzQzLDMyIEBACiAgICAgcHJpdmF0ZSBib29sZWFuICAgICBtSGFzQ29tcGF0U2NhbGluZzsKICAgICBwcml2YXRlIGZsb2F0ICAgICAgIG1Db21wYXRTY2FsaW5nOwogICAgIHByaXZhdGUgZmxvYXQgICAgICAgbUludkNvbXBhdFNjYWxpbmc7CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1NoYWRvdzsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBzaGFkb3dEeDsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBzaGFkb3dEeTsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBzaGFkb3dSYWRpdXM7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNoYWRvd0NvbG9yOworCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgIGludCAgICAgICAgIG1CaWRpRmxhZ3MgPSBCSURJX0RFRkFVTFRfTFRSOwogICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0eWxlW10gc1N0eWxlQXJyYXkgPSB7CiAgICAgICAgIFN0eWxlLkZJTEwsIFN0eWxlLlNUUk9LRSwgU3R5bGUuRklMTF9BTkRfU1RST0tFCkBAIC03Niw4ICsxMDYsMTE2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUEFJTlRfRkxBR1MgPSBERVZfS0VSTl9URVhUX0ZMQUc7CiAKICAgICAvKioKLSAgICAgKiBUaGUgU3R5bGUgc3BlY2lmaWVzIGlmIHRoZSBwcmltaXRpdmUgYmVpbmcgZHJhd24gaXMgZmlsbGVkLAotICAgICAqIHN0cm9rZWQsIG9yIGJvdGggKGluIHRoZSBzYW1lIGNvbG9yKS4gVGhlIGRlZmF1bHQgaXMgRklMTC4KKyAgICAgKiBCaWRpIGZsYWcgdG8gc2V0IExUUiBwYXJhZ3JhcGggZGlyZWN0aW9uLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklESV9MVFIgPSAweDA7CisKKyAgICAvKioKKyAgICAgKiBCaWRpIGZsYWcgdG8gc2V0IFJUTCBwYXJhZ3JhcGggZGlyZWN0aW9uLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklESV9SVEwgPSAweDE7CisKKyAgICAvKioKKyAgICAgKiBCaWRpIGZsYWcgdG8gZGV0ZWN0IHBhcmFncmFwaCBkaXJlY3Rpb24gdmlhIGhldXJpc3RpY3MsIGRlZmF1bHRpbmcgdG8KKyAgICAgKiBMVFIuCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSURJX0RFRkFVTFRfTFRSID0gMHgyOworCisgICAgLyoqCisgICAgICogQmlkaSBmbGFnIHRvIGRldGVjdCBwYXJhZ3JhcGggZGlyZWN0aW9uIHZpYSBoZXVyaXN0aWNzLCBkZWZhdWx0aW5nIHRvCisgICAgICogUlRMLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklESV9ERUZBVUxUX1JUTCA9IDB4MzsKKworICAgIC8qKgorICAgICAqIEJpZGkgZmxhZyB0byBvdmVycmlkZSBkaXJlY3Rpb24gdG8gYWxsIExUUiAoaWdub3JlIGJpZGkpLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklESV9GT1JDRV9MVFIgPSAweDQ7CisKKyAgICAvKioKKyAgICAgKiBCaWRpIGZsYWcgdG8gb3ZlcnJpZGUgZGlyZWN0aW9uIHRvIGFsbCBSVEwgKGlnbm9yZSBiaWRpKS4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJRElfRk9SQ0VfUlRMID0gMHg1OworCisgICAgLyoqCisgICAgICogTWF4aW11bSBCaWRpIGZsYWcgdmFsdWUuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQklESV9NQVhfRkxBR19WQUxVRSA9IEJJRElfRk9SQ0VfUlRMOworCisgICAgLyoqCisgICAgICogTWFzayBmb3IgYmlkaSBmbGFncy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCSURJX0ZMQUdfTUFTSyA9IDB4NzsKKworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIGdldFRleHRSdW5BZHZhbmNlcyBpbmRpY2F0aW5nIGxlZnQtdG8tcmlnaHQgcnVuIGRpcmVjdGlvbi4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9MVFIgPSAwOworCisgICAgLyoqCisgICAgICogRmxhZyBmb3IgZ2V0VGV4dFJ1bkFkdmFuY2VzIGluZGljYXRpbmcgcmlnaHQtdG8tbGVmdCBydW4gZGlyZWN0aW9uLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUSU9OX1JUTCA9IDE7CisKKyAgICAvKioKKyAgICAgKiBPcHRpb24gZm9yIGdldFRleHRSdW5DdXJzb3IgdG8gY29tcHV0ZSB0aGUgdmFsaWQgY3Vyc29yIGFmdGVyCisgICAgICogb2Zmc2V0IG9yIHRoZSBsaW1pdCBvZiB0aGUgY29udGV4dCwgd2hpY2hldmVyIGlzIGxlc3MuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVVJTT1JfQUZURVIgPSAwOworCisgICAgLyoqCisgICAgICogT3B0aW9uIGZvciBnZXRUZXh0UnVuQ3Vyc29yIHRvIGNvbXB1dGUgdGhlIHZhbGlkIGN1cnNvciBhdCBvciBhZnRlcgorICAgICAqIHRoZSBvZmZzZXQgb3IgdGhlIGxpbWl0IG9mIHRoZSBjb250ZXh0LCB3aGljaGV2ZXIgaXMgbGVzcy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVUlNPUl9BVF9PUl9BRlRFUiA9IDE7CisKKyAgICAgLyoqCisgICAgICogT3B0aW9uIGZvciBnZXRUZXh0UnVuQ3Vyc29yIHRvIGNvbXB1dGUgdGhlIHZhbGlkIGN1cnNvciBiZWZvcmUKKyAgICAgKiBvZmZzZXQgb3IgdGhlIHN0YXJ0IG9mIHRoZSBjb250ZXh0LCB3aGljaGV2ZXIgaXMgZ3JlYXRlci4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVUlNPUl9CRUZPUkUgPSAyOworCisgICAvKioKKyAgICAgKiBPcHRpb24gZm9yIGdldFRleHRSdW5DdXJzb3IgdG8gY29tcHV0ZSB0aGUgdmFsaWQgY3Vyc29yIGF0IG9yIGJlZm9yZQorICAgICAqIG9mZnNldCBvciB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQsIHdoaWNoZXZlciBpcyBncmVhdGVyLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VSU09SX0FUX09SX0JFRk9SRSA9IDM7CisKKyAgICAvKioKKyAgICAgKiBPcHRpb24gZm9yIGdldFRleHRSdW5DdXJzb3IgdG8gcmV0dXJuIG9mZnNldCBpZiB0aGUgY3Vyc29yIGF0IG9mZnNldAorICAgICAqIGlzIHZhbGlkLCBvciAtMSBpZiBpdCBpc24ndC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVUlNPUl9BVCA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBNYXhpbXVtIGN1cnNvciBvcHRpb24gdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENVUlNPUl9PUFRfTUFYX1ZBTFVFID0gQ1VSU09SX0FUOworCisgICAgLyoqCisgICAgICogVGhlIFN0eWxlIHNwZWNpZmllcyBpZiB0aGUgcHJpbWl0aXZlIGJlaW5nIGRyYXduIGlzIGZpbGxlZCwgc3Ryb2tlZCwgb3IKKyAgICAgKiBib3RoIChpbiB0aGUgc2FtZSBjb2xvcikuIFRoZSBkZWZhdWx0IGlzIEZJTEwuCiAgICAgICovCiAgICAgcHVibGljIGVudW0gU3R5bGUgewogICAgICAgICAvKioKQEAgLTkzLDcgKzIzMSw5IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZW9tZXRyeSBhbmQgdGV4dCBkcmF3biB3aXRoIHRoaXMgc3R5bGUgd2lsbCBiZSBib3RoIGZpbGxlZCBhbmQKICAgICAgICAgICogc3Ryb2tlZCBhdCB0aGUgc2FtZSB0aW1lLCByZXNwZWN0aW5nIHRoZSBzdHJva2UtcmVsYXRlZCBmaWVsZHMgb24KLSAgICAgICAgICogdGhlIHBhaW50LgorICAgICAgICAgKiB0aGUgcGFpbnQuIFRoaXMgbW9kZSBjYW4gZ2l2ZSB1bmV4cGVjdGVkIHJlc3VsdHMgaWYgdGhlIGdlb21ldHJ5CisgICAgICAgICAqIGlzIG9yaWVudGVkIGNvdW50ZXItY2xvY2t3aXNlLiBUaGlzIHJlc3RyaWN0aW9uIGRvZXMgbm90IGFwcGx5IHRvCisgICAgICAgICAqIGVpdGhlciBGSUxMIG9yIFNUUk9LRS4KICAgICAgICAgICovCiAgICAgICAgIEZJTExfQU5EX1NUUk9LRSAoMik7CiAgICAgICAgIApAQCAtMjA4LDYgKzM0OCw3IEBACiAgICAgICAgIG1IYXNDb21wYXRTY2FsaW5nID0gcGFpbnQubUhhc0NvbXBhdFNjYWxpbmc7CiAgICAgICAgIG1Db21wYXRTY2FsaW5nID0gcGFpbnQubUNvbXBhdFNjYWxpbmc7CiAgICAgICAgIG1JbnZDb21wYXRTY2FsaW5nID0gcGFpbnQubUludkNvbXBhdFNjYWxpbmc7CisgICAgICAgIG1CaWRpRmxhZ3MgPSBwYWludC5tQmlkaUZsYWdzOwogICAgIH0KIAogICAgIC8qKiBSZXN0b3JlcyB0aGUgcGFpbnQgdG8gaXRzIGRlZmF1bHQgc2V0dGluZ3MuICovCkBAIC0yMTYsNiArMzU3LDcgQEAKICAgICAgICAgc2V0RmxhZ3MoREVGQVVMVF9QQUlOVF9GTEFHUyk7CiAgICAgICAgIG1IYXNDb21wYXRTY2FsaW5nID0gZmFsc2U7CiAgICAgICAgIG1Db21wYXRTY2FsaW5nID0gbUludkNvbXBhdFNjYWxpbmcgPSAxOworICAgICAgICBtQmlkaUZsYWdzID0gQklESV9ERUZBVUxUX0xUUjsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0yMzgsNiArMzgwLDcgQEAKICAgICAgICAgICAgIG1IYXNDb21wYXRTY2FsaW5nID0gc3JjLm1IYXNDb21wYXRTY2FsaW5nOwogICAgICAgICAgICAgbUNvbXBhdFNjYWxpbmcgICAgPSBzcmMubUNvbXBhdFNjYWxpbmc7CiAgICAgICAgICAgICBtSW52Q29tcGF0U2NhbGluZyA9IHNyYy5tSW52Q29tcGF0U2NhbGluZzsKKyAgICAgICAgICAgIG1CaWRpRmxhZ3MgICAgICA9IHNyYy5tQmlkaUZsYWdzOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNTIsMTAgKzM5NSwzMyBAQAogICAgICAgICAgICAgbUludkNvbXBhdFNjYWxpbmcgPSAxLjBmL2ZhY3RvcjsKICAgICAgICAgfQogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYmlkaSBmbGFncyBvbiB0aGUgcGFpbnQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgYmlkaSBmbGFncyBvbiB0aGUgcGFpbnQKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QmlkaUZsYWdzKCkgeworICAgICAgICByZXR1cm4gbUJpZGlGbGFnczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGJpZGkgZmxhZ3Mgb24gdGhlIHBhaW50LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmlkaUZsYWdzKGludCBmbGFncykgeworICAgICAgICAvLyBvbmx5IGZsYWcgdmFsdWUgaXMgdGhlIDMtYml0IEJJREkgY29udHJvbCBzZXR0aW5nCisgICAgICAgIGZsYWdzICY9IEJJRElfRkxBR19NQVNLOworICAgICAgICBpZiAoZmxhZ3MgPiBCSURJX01BWF9GTEFHX1ZBTFVFKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGJpZGkgZmxhZzogIiArIGZsYWdzKTsKKyAgICAgICAgfQorICAgICAgICBtQmlkaUZsYWdzID0gZmxhZ3M7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBwYWludCdzIGZsYWdzLiBVc2UgdGhlIEZsYWcgZW51bSB0byB0ZXN0IGZsYWcgdmFsdWVzLgotICAgICAqCisgICAgICogCiAgICAgICogQHJldHVybiB0aGUgcGFpbnQncyBmbGFncyAoc2VlIGVudW1zIGVuZGluZyBpbiBfRmxhZyBmb3IgYml0IG1hc2tzKQogICAgICAqLwogICAgIHB1YmxpYyBuYXRpdmUgaW50IGdldEZsYWdzKCk7CkBAIC03ODcsMTggKzk1MywyNyBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBUZW1wb3JhcnkgQVBJIHRvIGV4cG9zZSBsYXllciBkcmF3aW5nLiBUaGlzIGRyYXdzIGEgc2hhZG93IGxheWVyIGJlbG93Ci0gICAgICogdGhlIG1haW4gbGF5ZXIsIHdpdGggdGhlIHNwZWNpZmllZCBvZmZzZXQgYW5kIGNvbG9yLCBhbmQgYmx1ciByYWRpdXMuCi0gICAgICogSWYgcmFkaXVzIGlzIDAsIHRoZW4gdGhlIHNoYWRvdyBsYXllciBpcyByZW1vdmVkLgorICAgICAqIFRoaXMgZHJhd3MgYSBzaGFkb3cgbGF5ZXIgYmVsb3cgdGhlIG1haW4gbGF5ZXIsIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG9mZnNldCBhbmQgY29sb3IsIGFuZCBibHVyIHJhZGl1cy4gSWYgcmFkaXVzIGlzIDAsIHRoZW4gdGhlIHNoYWRvdworICAgICAqIGxheWVyIGlzIHJlbW92ZWQuCiAgICAgICovCi0gICAgcHVibGljIG5hdGl2ZSB2b2lkIHNldFNoYWRvd0xheWVyKGZsb2F0IHJhZGl1cywgZmxvYXQgZHgsIGZsb2F0IGR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IpOworICAgIHB1YmxpYyB2b2lkIHNldFNoYWRvd0xheWVyKGZsb2F0IHJhZGl1cywgZmxvYXQgZHgsIGZsb2F0IGR5LCBpbnQgY29sb3IpIHsKKyAgICAgICAgaGFzU2hhZG93ID0gcmFkaXVzID4gMC4wZjsKKyAgICAgICAgc2hhZG93UmFkaXVzID0gcmFkaXVzOworICAgICAgICBzaGFkb3dEeCA9IGR4OworICAgICAgICBzaGFkb3dEeSA9IGR5OworICAgICAgICBzaGFkb3dDb2xvciA9IGNvbG9yOworICAgICAgICBuU2V0U2hhZG93TGF5ZXIocmFkaXVzLCBkeCwgZHksIGNvbG9yKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0U2hhZG93TGF5ZXIoZmxvYXQgcmFkaXVzLCBmbG9hdCBkeCwgZmxvYXQgZHksIGludCBjb2xvcik7CiAKICAgICAvKioKLSAgICAgKiBUZW1wb3JhcnkgQVBJIHRvIGNsZWFyIHRoZSBzaGFkb3cgbGF5ZXIuCisgICAgICogQ2xlYXIgdGhlIHNoYWRvdyBsYXllci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhclNoYWRvd0xheWVyKCkgewotICAgICAgICBzZXRTaGFkb3dMYXllcigwLCAwLCAwLCAwKTsKKyAgICAgICAgaGFzU2hhZG93ID0gZmFsc2U7CisgICAgICAgIG5TZXRTaGFkb3dMYXllcigwLCAwLCAwLCAwKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyMzIsMTAgKzE0MDcsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIGNoYXJbXSBidWYgPSBUZW1wb3JhcnlCdWZmZXIub2J0YWluKGVuZCAtIHN0YXJ0KTsKLSAgICAJVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIGJ1ZiwgMCk7Ci0gICAgCWludCByZXN1bHQgPSBnZXRUZXh0V2lkdGhzKGJ1ZiwgMCwgZW5kIC0gc3RhcnQsIHdpZHRocyk7CisgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOworICAgICAgICBpbnQgcmVzdWx0ID0gZ2V0VGV4dFdpZHRocyhidWYsIDAsIGVuZCAtIHN0YXJ0LCB3aWR0aHMpOwogICAgICAgICBUZW1wb3JhcnlCdWZmZXIucmVjeWNsZShidWYpOwotICAgIAlyZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIC8qKgpAQCAtMTI4Miw2ICsxNDU3LDI4NCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG92ZXJsb2FkIHRoYXQgdGFrZXMgYSBjaGFyIGFycmF5IGluc3RlYWQgb2YgYQorICAgICAqIFN0cmluZy4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFRleHRSdW5BZHZhbmNlcyhTdHJpbmcsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBmbG9hdFtdLCBpbnQpCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0VGV4dFJ1bkFkdmFuY2VzKGNoYXJbXSBjaGFycywgaW50IGluZGV4LCBpbnQgY291bnQsCisgICAgICAgICAgICBpbnQgY29udGV4dEluZGV4LCBpbnQgY29udGV4dENvdW50LCBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsCisgICAgICAgICAgICBpbnQgYWR2YW5jZXNJbmRleCkgeworCisgICAgICAgIGlmICgoaW5kZXggfCBjb3VudCB8IGNvbnRleHRJbmRleCB8IGNvbnRleHRDb3VudCB8IGFkdmFuY2VzSW5kZXgKKyAgICAgICAgICAgICAgICB8IChpbmRleCAtIGNvbnRleHRJbmRleCkKKyAgICAgICAgICAgICAgICB8ICgoY29udGV4dEluZGV4ICsgY29udGV4dENvdW50KSAtIChpbmRleCArIGNvdW50KSkKKyAgICAgICAgICAgICAgICB8IChjaGFycy5sZW5ndGggLSAoY29udGV4dEluZGV4ICsgY29udGV4dENvdW50KSkKKyAgICAgICAgICAgICAgICB8IChhZHZhbmNlcyA9PSBudWxsID8gMCA6CisgICAgICAgICAgICAgICAgICAgIChhZHZhbmNlcy5sZW5ndGggLSAoYWR2YW5jZXNJbmRleCArIGNvdW50KSkpKSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdzICE9IERJUkVDVElPTl9MVFIgJiYgZmxhZ3MgIT0gRElSRUNUSU9OX1JUTCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBmbGFncyB2YWx1ZTogIiArIGZsYWdzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUhhc0NvbXBhdFNjYWxpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBuYXRpdmVfZ2V0VGV4dFJ1bkFkdmFuY2VzKG1OYXRpdmVQYWludCwgY2hhcnMsIGluZGV4LCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dEluZGV4LCBjb250ZXh0Q291bnQsIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBmbG9hdCBvbGRTaXplID0gZ2V0VGV4dFNpemUoKTsKKyAgICAgICAgc2V0VGV4dFNpemUob2xkU2l6ZSAqIG1Db21wYXRTY2FsaW5nKTsKKyAgICAgICAgZmxvYXQgcmVzID0gbmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyhtTmF0aXZlUGFpbnQsIGNoYXJzLCBpbmRleCwgY291bnQsCisgICAgICAgICAgICAgICAgY29udGV4dEluZGV4LCBjb250ZXh0Q291bnQsIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIHNldFRleHRTaXplKG9sZFNpemUpOworCisgICAgICAgIGlmIChhZHZhbmNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gYWR2YW5jZXNJbmRleCwgZSA9IGkgKyBjb3VudDsgaSA8IGU7IGkrKykgeworICAgICAgICAgICAgICAgIGFkdmFuY2VzW2ldICo9IG1JbnZDb21wYXRTY2FsaW5nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXMgKiBtSW52Q29tcGF0U2NhbGluZzsgLy8gYXNzdW1lIGVycm9ycyBhcmUgbm90IHNpZ25pZmljYW50CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2Ugb3ZlcmxvYWQgdGhhdCB0YWtlcyBhIENoYXJTZXF1ZW5jZSBpbnN0ZWFkIG9mIGEKKyAgICAgKiBTdHJpbmcuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRUZXh0UnVuQWR2YW5jZXMoU3RyaW5nLCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgZmxvYXRbXSwgaW50KQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlcyhDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywgZmxvYXRbXSBhZHZhbmNlcywKKyAgICAgICAgICAgIGludCBhZHZhbmNlc0luZGV4KSB7CisKKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRUZXh0UnVuQWR2YW5jZXMoKFN0cmluZykgdGV4dCwgc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICB9CisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZFN0cmluZyB8fAorICAgICAgICAgICAgdGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgeworICAgICAgICAgICAgcmV0dXJuIGdldFRleHRSdW5BZHZhbmNlcyh0ZXh0LnRvU3RyaW5nKCksIHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIEdyYXBoaWNzT3BlcmF0aW9ucykgeworICAgICAgICAgICAgcmV0dXJuICgoR3JhcGhpY3NPcGVyYXRpb25zKSB0ZXh0KS5nZXRUZXh0UnVuQWR2YW5jZXMoc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgsIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIGNoYXJbXSBidWYgPSBUZW1wb3JhcnlCdWZmZXIub2J0YWluKGNvbnRleHRMZW4pOworICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmLCAwKTsKKyAgICAgICAgZmxvYXQgcmVzdWx0ID0gZ2V0VGV4dFJ1bkFkdmFuY2VzKGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwKKyAgICAgICAgICAgICAgICAwLCBjb250ZXh0TGVuLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBUZW1wb3JhcnlCdWZmZXIucmVjeWNsZShidWYpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRvdGFsIGFkdmFuY2Ugd2lkdGggZm9yIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBydW4KKyAgICAgKiBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQsIGFuZCBpZiBhZHZhbmNlcyBpcyBub3QgbnVsbCwgdGhlIGFkdmFuY2UKKyAgICAgKiBhc3NpZ25lZCB0byBlYWNoIG9mIHRoZXNlIGNoYXJhY3RlcnMgKGphdmEgY2hhcnMpLgorICAgICAqCisgICAgICogPHA+VGhlIHRyYWlsaW5nIHN1cnJvZ2F0ZSBpbiBhIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyIGlzIGFzc2lnbmVkCisgICAgICogYW4gYWR2YW5jZSBvZiAwLiAgVGh1cyB0aGUgbnVtYmVyIG9mIHJldHVybmVkIGFkdmFuY2VzIGlzCisgICAgICogYWx3YXlzIGVxdWFsIHRvIGNvdW50LCBub3QgdG8gdGhlIG51bWJlciBvZiB1bmljb2RlIGNvZGVwb2ludHMKKyAgICAgKiByZXByZXNlbnRlZCBieSB0aGUgcnVuLgorICAgICAqCisgICAgICogPHA+SW4gdGhlIGNhc2Ugb2YgY29uanVuY3RzIG9yIGNvbWJpbmluZyBtYXJrcywgdGhlIHRvdGFsCisgICAgICogYWR2YW5jZSBpcyBhc3NpZ25lZCB0byB0aGUgZmlyc3QgbG9naWNhbCBjaGFyYWN0ZXIsIGFuZCB0aGUKKyAgICAgKiBmb2xsb3dpbmcgY2hhcmFjdGVycyBhcmUgYXNzaWduZWQgYW4gYWR2YW5jZSBvZiAwLgorICAgICAqCisgICAgICogPHA+VGhpcyBnZW5lcmF0ZXMgdGhlIHN1bSBvZiB0aGUgYWR2YW5jZXMgb2YgZ2x5cGhzIGZvcgorICAgICAqIGNoYXJhY3RlcnMgaW4gYSByZW9yZGVyZWQgY2x1c3RlciBhcyB0aGUgd2lkdGggb2YgdGhlIGZpcnN0CisgICAgICogbG9naWNhbCBjaGFyYWN0ZXIgaW4gdGhlIGNsdXN0ZXIsIGFuZCAwIGZvciB0aGUgd2lkdGhzIG9mIGFsbAorICAgICAqIG90aGVyIGNoYXJhY3RlcnMgaW4gdGhlIGNsdXN0ZXIuICBJbiBlZmZlY3QsIHN1Y2ggY2x1c3RlcnMgYXJlCisgICAgICogdHJlYXRlZCBsaWtlIGNvbmp1bmN0cy4KKyAgICAgKgorICAgICAqIDxwPlRoZSBzaGFwaW5nIGJvdW5kcyBsaW1pdCB0aGUgYW1vdW50IG9mIGNvbnRleHQgYXZhaWxhYmxlCisgICAgICogb3V0c2lkZSBzdGFydCBhbmQgZW5kIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHNoYXBpbmcgYW5hbHlzaXMuCisgICAgICogVGhlc2UgYm91bmRzIHR5cGljYWxseSByZWZsZWN0IGNoYW5nZXMgaW4gYmlkaSBsZXZlbCBvciBmb250CisgICAgICogbWV0cmljcyBhY3Jvc3Mgd2hpY2ggc2hhcGluZyBkb2VzIG5vdCBvY2N1ci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIG1lYXN1cmUKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gbWVhc3VyZQorICAgICAqIEBwYXJhbSBlbmQgdGhlIGluZGV4IHBhc3QgdGhlIGxhc3QgY2hhcmFjdGVyIHRvIG1lYXN1cmUKKyAgICAgKiBAcGFyYW0gY29udGV4dFN0YXJ0IHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIHVzZSBmb3Igc2hhcGluZyBjb250ZXh0LAorICAgICAqIG11c3QgYmUgPD0gc3RhcnQKKyAgICAgKiBAcGFyYW0gY29udGV4dEVuZCB0aGUgaW5kZXggcGFzdCB0aGUgbGFzdCBjaGFyYWN0ZXIgdG8gdXNlIGZvciBzaGFwaW5nIGNvbnRleHQsCisgICAgICogbXVzdCBiZSA+PSBlbmQKKyAgICAgKiBAcGFyYW0gZmxhZ3MgdGhlIGZsYWdzIHRvIGNvbnRyb2wgdGhlIGFkdmFuY2VzLCBlaXRoZXIge0BsaW5rICNESVJFQ1RJT05fTFRSfQorICAgICAqIG9yIHtAbGluayAjRElSRUNUSU9OX1JUTH0KKyAgICAgKiBAcGFyYW0gYWR2YW5jZXMgYXJyYXkgdG8gcmVjZWl2ZSB0aGUgYWR2YW5jZXMsIG11c3QgaGF2ZSByb29tIGZvciBhbGwgYWR2YW5jZXMsCisgICAgICogY2FuIGJlIG51bGwgaWYgb25seSB0b3RhbCBhZHZhbmNlIGlzIG5lZWRlZAorICAgICAqIEBwYXJhbSBhZHZhbmNlc0luZGV4IHRoZSBwb3NpdGlvbiBpbiBhZHZhbmNlcyBhdCB3aGljaCB0byBwdXQgdGhlCisgICAgICogYWR2YW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjaGFyYWN0ZXIgYXQgc3RhcnQKKyAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBhZHZhbmNlCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXMoU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsIGludCBhZHZhbmNlc0luZGV4KSB7CisKKyAgICAgICAgaWYgKChzdGFydCB8IGVuZCB8IGNvbnRleHRTdGFydCB8IGNvbnRleHRFbmQgfCBhZHZhbmNlc0luZGV4IHwgKGVuZCAtIHN0YXJ0KQorICAgICAgICAgICAgICAgIHwgKHN0YXJ0IC0gY29udGV4dFN0YXJ0KSB8IChjb250ZXh0RW5kIC0gZW5kKQorICAgICAgICAgICAgICAgIHwgKHRleHQubGVuZ3RoKCkgLSBjb250ZXh0RW5kKQorICAgICAgICAgICAgICAgIHwgKGFkdmFuY2VzID09IG51bGwgPyAwIDoKKyAgICAgICAgICAgICAgICAgICAgKGFkdmFuY2VzLmxlbmd0aCAtIGFkdmFuY2VzSW5kZXggLSAoZW5kIC0gc3RhcnQpKSkpIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmxhZ3MgIT0gRElSRUNUSU9OX0xUUiAmJiBmbGFncyAhPSBESVJFQ1RJT05fUlRMKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGZsYWdzIHZhbHVlOiAiICsgZmxhZ3MpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtSGFzQ29tcGF0U2NhbGluZykgeworICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRUZXh0UnVuQWR2YW5jZXMobU5hdGl2ZVBhaW50LCB0ZXh0LCBzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBmbG9hdCBvbGRTaXplID0gZ2V0VGV4dFNpemUoKTsKKyAgICAgICAgc2V0VGV4dFNpemUob2xkU2l6ZSAqIG1Db21wYXRTY2FsaW5nKTsKKyAgICAgICAgZmxvYXQgdG90YWxBZHZhbmNlID0gbmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyhtTmF0aXZlUGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBzZXRUZXh0U2l6ZShvbGRTaXplKTsKKworICAgICAgICBpZiAoYWR2YW5jZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGFkdmFuY2VzSW5kZXgsIGUgPSBpICsgKGVuZCAtIHN0YXJ0KTsgaSA8IGU7IGkrKykgeworICAgICAgICAgICAgICAgIGFkdmFuY2VzW2ldICo9IG1JbnZDb21wYXRTY2FsaW5nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0b3RhbEFkdmFuY2UgKiBtSW52Q29tcGF0U2NhbGluZzsgLy8gYXNzdW1lIGVycm9ycyBhcmUgaW5zaWduaWZpY2FudAorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSBydW4uICBUaGlzIGF2b2lkcyBwbGFjaW5nIHRoZQorICAgICAqIGN1cnNvciBiZXR3ZWVuIHN1cnJvZ2F0ZXMsIGJldHdlZW4gY2hhcmFjdGVycyB0aGF0IGZvcm0gY29uanVuY3RzLAorICAgICAqIGJldHdlZW4gYmFzZSBjaGFyYWN0ZXJzIGFuZCBjb21iaW5pbmcgbWFya3MsIG9yIHdpdGhpbiBhIHJlb3JkZXJpbmcKKyAgICAgKiBjbHVzdGVyLgorICAgICAqCisgICAgICogPHA+Q29udGV4dFN0YXJ0IGFuZCBvZmZzZXQgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0ZXh0LgorICAgICAqIFRoZSBjb250ZXh0IGlzIHRoZSBzaGFwaW5nIGNvbnRleHQgZm9yIGN1cnNvciBtb3ZlbWVudCwgZ2VuZXJhbGx5CisgICAgICogdGhlIGJvdW5kcyBvZiB0aGUgbWV0cmljIHNwYW4gZW5jbG9zaW5nIHRoZSBjdXJzb3IgaW4gdGhlIGRpcmVjdGlvbiBvZgorICAgICAqIG1vdmVtZW50LgorICAgICAqCisgICAgICogPHA+SWYgY3Vyc29yT3B0IGlzIHtAbGluayAjQ1VSU09SX0FUfSBhbmQgdGhlIG9mZnNldCBpcyBub3QgYSB2YWxpZAorICAgICAqIGN1cnNvciBwb3NpdGlvbiwgdGhpcyByZXR1cm5zIC0xLiAgT3RoZXJ3aXNlIHRoaXMgd2lsbCBuZXZlciByZXR1cm4gYQorICAgICAqIHZhbHVlIGJlZm9yZSBjb250ZXh0U3RhcnQgb3IgYWZ0ZXIgY29udGV4dFN0YXJ0ICsgY29udGV4dExlbmd0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gY29udGV4dExlbmd0aCB0aGUgbGVuZ3RoIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGZsYWdzIGVpdGhlciB7QGxpbmsgI0RJUkVDVElPTl9SVEx9IG9yIHtAbGluayAjRElSRUNUSU9OX0xUUn0KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gbW92ZSBmcm9tCisgICAgICogQHBhcmFtIGN1cnNvck9wdCBob3cgdG8gbW92ZSB0aGUgY3Vyc29yLCBvbmUgb2Yge0BsaW5rICNDVVJTT1JfQUZURVJ9LAorICAgICAqIHtAbGluayAjQ1VSU09SX0FUX09SX0FGVEVSfSwge0BsaW5rICNDVVJTT1JfQkVGT1JFfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9CRUZPUkV9LCBvciB7QGxpbmsgI0NVUlNPUl9BVH0KKyAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgcG9zaXRpb24sIG9yIC0xCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoY2hhcltdIHRleHQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0TGVuZ3RoLAorICAgICAgICAgICAgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0KSB7CisgICAgICAgIGludCBjb250ZXh0RW5kID0gY29udGV4dFN0YXJ0ICsgY29udGV4dExlbmd0aDsKKyAgICAgICAgaWYgKCgoY29udGV4dFN0YXJ0IHwgY29udGV4dEVuZCB8IG9mZnNldCB8IChjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0KQorICAgICAgICAgICAgICAgIHwgKG9mZnNldCAtIGNvbnRleHRTdGFydCkgfCAoY29udGV4dEVuZCAtIG9mZnNldCkKKyAgICAgICAgICAgICAgICB8ICh0ZXh0Lmxlbmd0aCAtIGNvbnRleHRFbmQpIHwgY3Vyc29yT3B0KSA8IDApCisgICAgICAgICAgICAgICAgfHwgY3Vyc29yT3B0ID4gQ1VSU09SX09QVF9NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmF0aXZlX2dldFRleHRSdW5DdXJzb3IobU5hdGl2ZVBhaW50LCB0ZXh0LAorICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dExlbmd0aCwgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgcnVuLiAgVGhpcyBhdm9pZHMgcGxhY2luZyB0aGUKKyAgICAgKiBjdXJzb3IgYmV0d2VlbiBzdXJyb2dhdGVzLCBiZXR3ZWVuIGNoYXJhY3RlcnMgdGhhdCBmb3JtIGNvbmp1bmN0cywKKyAgICAgKiBiZXR3ZWVuIGJhc2UgY2hhcmFjdGVycyBhbmQgY29tYmluaW5nIG1hcmtzLCBvciB3aXRoaW4gYSByZW9yZGVyaW5nCisgICAgICogY2x1c3Rlci4KKyAgICAgKgorICAgICAqIDxwPkNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYW5kIG9mZnNldCBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mCisgICAgICogdGV4dC4gIFRoZSBjb250ZXh0IGlzIHRoZSBzaGFwaW5nIGNvbnRleHQgZm9yIGN1cnNvciBtb3ZlbWVudCwgZ2VuZXJhbGx5CisgICAgICogdGhlIGJvdW5kcyBvZiB0aGUgbWV0cmljIHNwYW4gZW5jbG9zaW5nIHRoZSBjdXJzb3IgaW4gdGhlIGRpcmVjdGlvbiBvZgorICAgICAqIG1vdmVtZW50LgorICAgICAqCisgICAgICogPHA+SWYgY3Vyc29yT3B0IGlzIHtAbGluayAjQ1VSU09SX0FUfSBhbmQgdGhlIG9mZnNldCBpcyBub3QgYSB2YWxpZAorICAgICAqIGN1cnNvciBwb3NpdGlvbiwgdGhpcyByZXR1cm5zIC0xLiAgT3RoZXJ3aXNlIHRoaXMgd2lsbCBuZXZlciByZXR1cm4gYQorICAgICAqIHZhbHVlIGJlZm9yZSBjb250ZXh0U3RhcnQgb3IgYWZ0ZXIgY29udGV4dEVuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gY29udGV4dEVuZCB0aGUgZW5kIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGZsYWdzIGVpdGhlciB7QGxpbmsgI0RJUkVDVElPTl9SVEx9IG9yIHtAbGluayAjRElSRUNUSU9OX0xUUn0KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gbW92ZSBmcm9tCisgICAgICogQHBhcmFtIGN1cnNvck9wdCBob3cgdG8gbW92ZSB0aGUgY3Vyc29yLCBvbmUgb2Yge0BsaW5rICNDVVJTT1JfQUZURVJ9LAorICAgICAqIHtAbGluayAjQ1VSU09SX0FUX09SX0FGVEVSfSwge0BsaW5rICNDVVJTT1JfQkVGT1JFfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9CRUZPUkV9LCBvciB7QGxpbmsgI0NVUlNPUl9BVH0KKyAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgcG9zaXRpb24sIG9yIC0xCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoQ2hhclNlcXVlbmNlIHRleHQsIGludCBjb250ZXh0U3RhcnQsCisgICAgICAgICAgIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGludCBvZmZzZXQsIGludCBjdXJzb3JPcHQpIHsKKworICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFN0cmluZyB8fCB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZFN0cmluZyB8fAorICAgICAgICAgICAgICAgIHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGVTdHJpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRUZXh0UnVuQ3Vyc29yKHRleHQudG9TdHJpbmcoKSwgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLAorICAgICAgICAgICAgICAgICAgICBmbGFncywgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICB9CisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgR3JhcGhpY3NPcGVyYXRpb25zKSB7CisgICAgICAgICAgICByZXR1cm4gKChHcmFwaGljc09wZXJhdGlvbnMpIHRleHQpLmdldFRleHRSdW5DdXJzb3IoCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0LCB0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgY2hhcltdIGJ1ZiA9IFRlbXBvcmFyeUJ1ZmZlci5vYnRhaW4oY29udGV4dExlbik7CisgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGJ1ZiwgMCk7CisgICAgICAgIGludCByZXN1bHQgPSBnZXRUZXh0UnVuQ3Vyc29yKGJ1ZiwgMCwgY29udGV4dExlbiwgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICAgICAgVGVtcG9yYXJ5QnVmZmVyLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgcnVuLiAgVGhpcyBhdm9pZHMgcGxhY2luZyB0aGUKKyAgICAgKiBjdXJzb3IgYmV0d2VlbiBzdXJyb2dhdGVzLCBiZXR3ZWVuIGNoYXJhY3RlcnMgdGhhdCBmb3JtIGNvbmp1bmN0cywKKyAgICAgKiBiZXR3ZWVuIGJhc2UgY2hhcmFjdGVycyBhbmQgY29tYmluaW5nIG1hcmtzLCBvciB3aXRoaW4gYSByZW9yZGVyaW5nCisgICAgICogY2x1c3Rlci4KKyAgICAgKgorICAgICAqIDxwPkNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYW5kIG9mZnNldCBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mCisgICAgICogdGV4dC4gIFRoZSBjb250ZXh0IGlzIHRoZSBzaGFwaW5nIGNvbnRleHQgZm9yIGN1cnNvciBtb3ZlbWVudCwgZ2VuZXJhbGx5CisgICAgICogdGhlIGJvdW5kcyBvZiB0aGUgbWV0cmljIHNwYW4gZW5jbG9zaW5nIHRoZSBjdXJzb3IgaW4gdGhlIGRpcmVjdGlvbiBvZgorICAgICAqIG1vdmVtZW50LgorICAgICAqCisgICAgICogPHA+SWYgY3Vyc29yT3B0IGlzIHtAbGluayAjQ1VSU09SX0FUfSBhbmQgdGhlIG9mZnNldCBpcyBub3QgYSB2YWxpZAorICAgICAqIGN1cnNvciBwb3NpdGlvbiwgdGhpcyByZXR1cm5zIC0xLiAgT3RoZXJ3aXNlIHRoaXMgd2lsbCBuZXZlciByZXR1cm4gYQorICAgICAqIHZhbHVlIGJlZm9yZSBjb250ZXh0U3RhcnQgb3IgYWZ0ZXIgY29udGV4dEVuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gY29udGV4dEVuZCB0aGUgZW5kIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGZsYWdzIGVpdGhlciB7QGxpbmsgI0RJUkVDVElPTl9SVEx9IG9yIHtAbGluayAjRElSRUNUSU9OX0xUUn0KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gbW92ZSBmcm9tCisgICAgICogQHBhcmFtIGN1cnNvck9wdCBob3cgdG8gbW92ZSB0aGUgY3Vyc29yLCBvbmUgb2Yge0BsaW5rICNDVVJTT1JfQUZURVJ9LAorICAgICAqIHtAbGluayAjQ1VSU09SX0FUX09SX0FGVEVSfSwge0BsaW5rICNDVVJTT1JfQkVGT1JFfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9CRUZPUkV9LCBvciB7QGxpbmsgI0NVUlNPUl9BVH0KKyAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgcG9zaXRpb24sIG9yIC0xCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoU3RyaW5nIHRleHQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLAorICAgICAgICAgICAgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0KSB7CisgICAgICAgIGlmICgoKGNvbnRleHRTdGFydCB8IGNvbnRleHRFbmQgfCBvZmZzZXQgfCAoY29udGV4dEVuZCAtIGNvbnRleHRTdGFydCkKKyAgICAgICAgICAgICAgICB8IChvZmZzZXQgLSBjb250ZXh0U3RhcnQpIHwgKGNvbnRleHRFbmQgLSBvZmZzZXQpCisgICAgICAgICAgICAgICAgfCAodGV4dC5sZW5ndGgoKSAtIGNvbnRleHRFbmQpIHwgY3Vyc29yT3B0KSA8IDApCisgICAgICAgICAgICAgICAgfHwgY3Vyc29yT3B0ID4gQ1VSU09SX09QVF9NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmF0aXZlX2dldFRleHRSdW5DdXJzb3IobU5hdGl2ZVBhaW50LCB0ZXh0LAorICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHBhdGggKG91dGxpbmUpIGZvciB0aGUgc3BlY2lmaWVkIHRleHQuCiAgICAgICogTm90ZToganVzdCBsaWtlIENhbnZhcy5kcmF3VGV4dCwgdGhpcyB3aWxsIHJlc3BlY3QgdGhlIEFsaWduIHNldHRpbmcgaW4KICAgICAgKiB0aGUgcGFpbnQuCkBAIC0xMjk5LDcgKzE3NTIsOCBAQAogICAgICAgICBpZiAoKGluZGV4IHwgY291bnQpIDwgMCB8fCBpbmRleCArIGNvdW50ID4gdGV4dC5sZW5ndGgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgfQotICAgICAgICBuYXRpdmVfZ2V0VGV4dFBhdGgobU5hdGl2ZVBhaW50LCB0ZXh0LCBpbmRleCwgY291bnQsIHgsIHksIHBhdGgubmkoKSk7CisgICAgICAgIG5hdGl2ZV9nZXRUZXh0UGF0aChtTmF0aXZlUGFpbnQsIG1CaWRpRmxhZ3MsIHRleHQsIGluZGV4LCBjb3VudCwgeCwgeSwgCisgICAgICAgICAgICAgICAgcGF0aC5uaSgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzMjAsNyArMTc3NCw4IEBACiAgICAgICAgIGlmICgoc3RhcnQgfCBlbmQgfCAoZW5kIC0gc3RhcnQpIHwgKHRleHQubGVuZ3RoKCkgLSBlbmQpKSA8IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLSAgICAgICAgbmF0aXZlX2dldFRleHRQYXRoKG1OYXRpdmVQYWludCwgdGV4dCwgc3RhcnQsIGVuZCwgeCwgeSwgcGF0aC5uaSgpKTsKKyAgICAgICAgbmF0aXZlX2dldFRleHRQYXRoKG1OYXRpdmVQYWludCwgbUJpZGlGbGFncywgdGV4dCwgc3RhcnQsIGVuZCwgeCwgeSwgCisgICAgICAgICAgICAgICAgcGF0aC5uaSgpKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xNDA0LDkgKzE4NTksMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0W10gd2lkdGhzKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9nZXRUZXh0V2lkdGhzKGludCBuYXRpdmVfb2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGZsb2F0W10gd2lkdGhzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZ2V0VGV4dFBhdGgoaW50IG5hdGl2ZV9vYmplY3QsCisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgZmxvYXQgbmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyhpbnQgbmF0aXZlX29iamVjdCwKKyAgICAgICAgICAgIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgaW50IGNvbnRleHRJbmRleCwgaW50IGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgIGludCBmbGFncywgZmxvYXRbXSBhZHZhbmNlcywgaW50IGFkdmFuY2VzSW5kZXgpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBmbG9hdCBuYXRpdmVfZ2V0VGV4dFJ1bkFkdmFuY2VzKGludCBuYXRpdmVfb2JqZWN0LAorICAgICAgICAgICAgU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsCisgICAgICAgICAgICBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsIGludCBhZHZhbmNlc0luZGV4KTsKKworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVfZ2V0VGV4dFJ1bkN1cnNvcihpbnQgbmF0aXZlX29iamVjdCwgY2hhcltdIHRleHQsCisgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dExlbmd0aCwgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0KTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX2dldFRleHRSdW5DdXJzb3IoaW50IG5hdGl2ZV9vYmplY3QsIFN0cmluZyB0ZXh0LAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywgaW50IG9mZnNldCwgaW50IGN1cnNvck9wdCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZ2V0VGV4dFBhdGgoaW50IG5hdGl2ZV9vYmplY3QsIGludCBiaWRpRmxhZ3MsCiAgICAgICAgICAgICAgICAgY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgcGF0aCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2dldFRleHRQYXRoKGludCBuYXRpdmVfb2JqZWN0LAorICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9nZXRUZXh0UGF0aChpbnQgbmF0aXZlX29iamVjdCwgaW50IGJpZGlGbGFncywKICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgcGF0aCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlR2V0U3RyaW5nQm91bmRzKGludCBuYXRpdmVQYWludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgUmVjdCBib3VuZHMpOwpAQCAtMTQxNCw0ICsxODgyLDMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBSZWN0IGJvdW5kcyk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgZmluYWxpemVyKGludCBuYXRpdmVQYWludCk7CiB9Ci0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYXRoLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGF0aC5qYXZhCmluZGV4IDI4MTgyM2EuLjEzMjQ0MzEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYXRoLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BhdGguamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3M7CiAKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSGFyZHdhcmVSZW5kZXJlcjsKKwogLyoqCiAgKiBUaGUgUGF0aCBjbGFzcyBlbmNhcHN1bGF0ZXMgY29tcG91bmQgKG11bHRpcGxlIGNvbnRvdXIpIGdlb21ldHJpYyBwYXRocwogICogY29uc2lzdGluZyBvZiBzdHJhaWdodCBsaW5lIHNlZ21lbnRzLCBxdWFkcmF0aWMgY3VydmVzLCBhbmQgY3ViaWMgY3VydmVzLgpAQCAtMjQsMTIgKzI2LDI3IEBACiAgKiB0ZXh0IG9uIGEgcGF0aC4KICAqLwogcHVibGljIGNsYXNzIFBhdGggeworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBtTmF0aXZlUGF0aDsKKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTaW1wbGVQYXRoID0gdHJ1ZTsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBSZWdpb24gcmVjdHM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EZXRlY3RTaW1wbGVQYXRoczsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbiBlbXB0eSBwYXRoCiAgICAgICovCiAgICAgcHVibGljIFBhdGgoKSB7CiAgICAgICAgIG1OYXRpdmVQYXRoID0gaW5pdDEoKTsKKyAgICAgICAgbURldGVjdFNpbXBsZVBhdGhzID0gSGFyZHdhcmVSZW5kZXJlci5pc0F2YWlsYWJsZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDMsNiArNjAsNyBAQAogICAgICAgICAgICAgdmFsTmF0aXZlID0gc3JjLm1OYXRpdmVQYXRoOwogICAgICAgICB9CiAgICAgICAgIG1OYXRpdmVQYXRoID0gaW5pdDIodmFsTmF0aXZlKTsKKyAgICAgICAgbURldGVjdFNpbXBsZVBhdGhzID0gSGFyZHdhcmVSZW5kZXJlci5pc0F2YWlsYWJsZSgpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTUwLDYgKzY4LDEwIEBACiAgICAgICogVGhpcyBkb2VzIE5PVCBjaGFuZ2UgdGhlIGZpbGwtdHlwZSBzZXR0aW5nLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICBpc1NpbXBsZVBhdGggPSB0cnVlOworICAgICAgICBpZiAobURldGVjdFNpbXBsZVBhdGhzKSB7CisgICAgICAgICAgICBpZiAocmVjdHMgIT0gbnVsbCkgcmVjdHMuc2V0RW1wdHkoKTsKKyAgICAgICAgfQogICAgICAgICBuYXRpdmVfcmVzZXQobU5hdGl2ZVBhdGgpOwogICAgIH0KIApAQCAtNTgsNiArODAsMTAgQEAKICAgICAgKiBrZWVwcyB0aGUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgZm9yIGZhc3RlciByZXVzZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZXdpbmQoKSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IHRydWU7CisgICAgICAgIGlmIChtRGV0ZWN0U2ltcGxlUGF0aHMpIHsKKyAgICAgICAgICAgIGlmIChyZWN0cyAhPSBudWxsKSByZWN0cy5zZXRFbXB0eSgpOworICAgICAgICB9CiAgICAgICAgIG5hdGl2ZV9yZXdpbmQobU5hdGl2ZVBhdGgpOwogICAgIH0KIApAQCAtNjUsNiArOTEsNyBAQAogICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0KFBhdGggc3JjKSB7CiAgICAgICAgIGlmICh0aGlzICE9IHNyYykgeworICAgICAgICAgICAgaXNTaW1wbGVQYXRoID0gc3JjLmlzU2ltcGxlUGF0aDsKICAgICAgICAgICAgIG5hdGl2ZV9zZXQobU5hdGl2ZVBhdGgsIHNyYy5tTmF0aXZlUGF0aCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNjAsNiArMTg3LDcgQEAKICAgICAgKiBAcGFyYW0gYm91bmRzIFJldHVybnMgdGhlIGNvbXB1dGVkIGJvdW5kcyBvZiB0aGUgcGF0aCdzIGNvbnRyb2wgcG9pbnRzLgogICAgICAqIEBwYXJhbSBleGFjdCBUaGlzIHBhcmFtZXRlciBpcyBubyBsb25nZXIgdXNlZC4KICAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCiAgICAgcHVibGljIHZvaWQgY29tcHV0ZUJvdW5kcyhSZWN0RiBib3VuZHMsIGJvb2xlYW4gZXhhY3QpIHsKICAgICAgICAgbmF0aXZlX2NvbXB1dGVCb3VuZHMobU5hdGl2ZVBhdGgsIGJvdW5kcyk7CiAgICAgfQpAQCAtMjA4LDYgKzIzNiw3IEBACiAgICAgICogQHBhcmFtIHkgVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgZW5kIG9mIGEgbGluZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGxpbmVUbyhmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfbGluZVRvKG1OYXRpdmVQYXRoLCB4LCB5KTsKICAgICB9CiAKQEAgLTIyMiw2ICsyNTEsNyBAQAogICAgICAqICAgICAgICAgICB0aGlzIGNvbnRvdXIsIHRvIHNwZWNpZnkgYSBsaW5lCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgckxpbmVUbyhmbG9hdCBkeCwgZmxvYXQgZHkpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9yTGluZVRvKG1OYXRpdmVQYXRoLCBkeCwgZHkpOwogICAgIH0KIApAQCAtMjM2LDYgKzI2Niw3IEBACiAgICAgICogQHBhcmFtIHkyIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvbiBhIHF1YWRyYXRpYyBjdXJ2ZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHF1YWRUbyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MikgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX3F1YWRUbyhtTmF0aXZlUGF0aCwgeDEsIHkxLCB4MiwgeTIpOwogICAgIH0KIApAQCAtMjU0LDYgKzI4NSw3IEBACiAgICAgICogICAgICAgICAgICB0aGlzIGNvbnRvdXIsIGZvciB0aGUgZW5kIHBvaW50IG9mIGEgcXVhZHJhdGljIGN1cnZlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgclF1YWRUbyhmbG9hdCBkeDEsIGZsb2F0IGR5MSwgZmxvYXQgZHgyLCBmbG9hdCBkeTIpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9yUXVhZFRvKG1OYXRpdmVQYXRoLCBkeDEsIGR5MSwgZHgyLCBkeTIpOwogICAgIH0KIApAQCAtMjcxLDYgKzMwMyw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY3ViaWNUbyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MiwKICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MykgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2N1YmljVG8obU5hdGl2ZVBhdGgsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpOwogICAgIH0KIApAQCAtMjgxLDYgKzMxNCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgckN1YmljVG8oZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzKSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfckN1YmljVG8obU5hdGl2ZVBhdGgsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpOwogICAgIH0KIApAQCAtMjk5LDYgKzMzMyw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYXJjVG8oUmVjdEYgb3ZhbCwgZmxvYXQgc3RhcnRBbmdsZSwgZmxvYXQgc3dlZXBBbmdsZSwKICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZvcmNlTW92ZVRvKSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfYXJjVG8obU5hdGl2ZVBhdGgsIG92YWwsIHN0YXJ0QW5nbGUsIHN3ZWVwQW5nbGUsIGZvcmNlTW92ZVRvKTsKICAgICB9CiAgICAgCkBAIC0zMTQsNiArMzQ5LDcgQEAKICAgICAgKiBAcGFyYW0gc3dlZXBBbmdsZSAgU3dlZXAgYW5nbGUgKGluIGRlZ3JlZXMpIG1lYXN1cmVkIGNsb2Nrd2lzZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFyY1RvKFJlY3RGIG92YWwsIGZsb2F0IHN0YXJ0QW5nbGUsIGZsb2F0IHN3ZWVwQW5nbGUpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9hcmNUbyhtTmF0aXZlUGF0aCwgb3ZhbCwgc3RhcnRBbmdsZSwgc3dlZXBBbmdsZSwgZmFsc2UpOwogICAgIH0KICAgICAKQEAgLTMyMiw2ICszNTgsNyBAQAogICAgICAqIGZpcnN0IHBvaW50IG9mIHRoZSBjb250b3VyLCBhIGxpbmUgc2VnbWVudCBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2Nsb3NlKG1OYXRpdmVQYXRoKTsKICAgICB9CiAKQEAgLTM1MSw2ICszODgsMTEgQEAKICAgICAgICAgaWYgKHJlY3QgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJuZWVkIHJlY3QgcGFyYW1ldGVyIik7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1EZXRlY3RTaW1wbGVQYXRocykgeworICAgICAgICAgICAgaWYgKHJlY3RzID09IG51bGwpIHJlY3RzID0gbmV3IFJlZ2lvbigpOworICAgICAgICAgICAgcmVjdHMub3AoKGludCkgcmVjdC5sZWZ0LCAoaW50KSByZWN0LnRvcCwgKGludCkgcmVjdC5yaWdodCwgKGludCkgcmVjdC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgIFJlZ2lvbi5PcC5VTklPTik7CisgICAgICAgIH0KICAgICAgICAgbmF0aXZlX2FkZFJlY3QobU5hdGl2ZVBhdGgsIHJlY3QsIGRpci5uYXRpdmVJbnQpOwogICAgIH0KIApAQCAtMzYzLDggKzQwNSwxMSBAQAogICAgICAqIEBwYXJhbSBib3R0b20gVGhlIGJvdHRvbSBvZiBhIHJlY3RhbmdsZSB0byBhZGQgdG8gdGhlIHBhdGgKICAgICAgKiBAcGFyYW0gZGlyICAgIFRoZSBkaXJlY3Rpb24gdG8gd2luZCB0aGUgcmVjdGFuZ2xlJ3MgY29udG91cgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uIGRpcikgeworICAgIHB1YmxpYyB2b2lkIGFkZFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBEaXJlY3Rpb24gZGlyKSB7CisgICAgICAgIGlmIChtRGV0ZWN0U2ltcGxlUGF0aHMpIHsKKyAgICAgICAgICAgIGlmIChyZWN0cyA9PSBudWxsKSByZWN0cyA9IG5ldyBSZWdpb24oKTsKKyAgICAgICAgICAgIHJlY3RzLm9wKChpbnQpIGxlZnQsIChpbnQpIHRvcCwgKGludCkgcmlnaHQsIChpbnQpIGJvdHRvbSwgUmVnaW9uLk9wLlVOSU9OKTsKKyAgICAgICAgfQogICAgICAgICBuYXRpdmVfYWRkUmVjdChtTmF0aXZlUGF0aCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBkaXIubmF0aXZlSW50KTsKICAgICB9CiAKQEAgLTM3OCw2ICs0MjMsNyBAQAogICAgICAgICBpZiAob3ZhbCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm5lZWQgb3ZhbCBwYXJhbWV0ZXIiKTsKICAgICAgICAgfQorICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZE92YWwobU5hdGl2ZVBhdGgsIG92YWwsIGRpci5uYXRpdmVJbnQpOwogICAgIH0KIApAQCAtMzkwLDYgKzQzNiw3IEBACiAgICAgICogQHBhcmFtIGRpciAgICBUaGUgZGlyZWN0aW9uIHRvIHdpbmQgdGhlIGNpcmNsZSdzIGNvbnRvdXIKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRDaXJjbGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcmFkaXVzLCBEaXJlY3Rpb24gZGlyKSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfYWRkQ2lyY2xlKG1OYXRpdmVQYXRoLCB4LCB5LCByYWRpdXMsIGRpci5uYXRpdmVJbnQpOwogICAgIH0KIApAQCAtNDA0LDYgKzQ1MSw3IEBACiAgICAgICAgIGlmIChvdmFsID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibmVlZCBvdmFsIHBhcmFtZXRlciIpOwogICAgICAgICB9CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfYWRkQXJjKG1OYXRpdmVQYXRoLCBvdmFsLCBzdGFydEFuZ2xlLCBzd2VlcEFuZ2xlKTsKICAgICB9CiAKQEAgLTQxOSw2ICs0NjcsNyBAQAogICAgICAgICBpZiAocmVjdCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm5lZWQgcmVjdCBwYXJhbWV0ZXIiKTsKICAgICAgICAgfQorICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZFJvdW5kUmVjdChtTmF0aXZlUGF0aCwgcmVjdCwgcngsIHJ5LCBkaXIubmF0aXZlSW50KTsKICAgICB9CiAgICAgCkBAIC00MzgsNiArNDg3LDcgQEAKICAgICAgICAgaWYgKHJhZGlpLmxlbmd0aCA8IDgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oInJhZGlpW10gbmVlZHMgOCB2YWx1ZXMiKTsKICAgICAgICAgfQorICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZFJvdW5kUmVjdChtTmF0aXZlUGF0aCwgcmVjdCwgcmFkaWksIGRpci5uYXRpdmVJbnQpOwogICAgIH0KICAgICAKQEAgLTQ0OCw2ICs0OTgsNyBAQAogICAgICAqIEBwYXJhbSBkeCAgVGhlIGFtb3VudCB0byB0cmFuc2xhdGUgdGhlIHBhdGggaW4gWCBhcyBpdCBpcyBhZGRlZAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFBhdGgoUGF0aCBzcmMsIGZsb2F0IGR4LCBmbG9hdCBkeSkgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZFBhdGgobU5hdGl2ZVBhdGgsIHNyYy5tTmF0aXZlUGF0aCwgZHgsIGR5KTsKICAgICB9CiAKQEAgLTQ1Nyw2ICs1MDgsNyBAQAogICAgICAqIEBwYXJhbSBzcmMgVGhlIHBhdGggdGhhdCBpcyBhcHBlbmRlZCB0byB0aGUgY3VycmVudCBwYXRoCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkUGF0aChQYXRoIHNyYykgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZFBhdGgobU5hdGl2ZVBhdGgsIHNyYy5tTmF0aXZlUGF0aCk7CiAgICAgfQogCkBAIC00NjYsNiArNTE4LDcgQEAKICAgICAgKiBAcGFyYW0gc3JjIFRoZSBwYXRoIHRvIGFkZCBhcyBhIG5ldyBjb250b3VyCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkUGF0aChQYXRoIHNyYywgTWF0cml4IG1hdHJpeCkgeworICAgICAgICBpZiAoIXNyYy5pc1NpbXBsZVBhdGgpIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfYWRkUGF0aChtTmF0aXZlUGF0aCwgc3JjLm1OYXRpdmVQYXRoLCBtYXRyaXgubmF0aXZlX2luc3RhbmNlKTsKICAgICB9CiAKQEAgLTUwMiw2ICs1NTUsNyBAQAogICAgICAqIEBwYXJhbSBkeSBUaGUgbmV3IFkgY29vcmRpbmF0ZSBmb3IgdGhlIGxhc3QgcG9pbnQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRMYXN0UG9pbnQoZmxvYXQgZHgsIGZsb2F0IGR5KSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfc2V0TGFzdFBvaW50KG1OYXRpdmVQYXRoLCBkeCwgZHkpOwogICAgIH0KIApAQCAtNTM3LDggKzU5MSw4IEBACiAgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwogICAgICAgICB9CiAgICAgfQotICAgIAotICAgIC8qcGFja2FnZSovIGZpbmFsIGludCBuaSgpIHsKKworICAgIGZpbmFsIGludCBuaSgpIHsKICAgICAgICAgcmV0dXJuIG1OYXRpdmVQYXRoOwogICAgIH0KIApAQCAtNTkyLDYgKzY0Niw0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3BhdGgpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV90cmFuc2Zvcm0oaW50IG5QYXRoLCBpbnQgbWF0cml4KTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBmaW5hbGl6ZXIoaW50IG5QYXRoKTsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IG1OYXRpdmVQYXRoOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmLmphdmEKaW5kZXggMzkwNDIzNC4uMmVmMTY2MiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmYuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZi5qYXZhCkBAIC01MywxMSArNTMsMTggQEAKICAgICAgICAgLyoqIFtTYSAqIERhLCBTYyAqIERjXSAqLwogICAgICAgICBNVUxUSVBMWSAgICAoMTQpLAogICAgICAgICAvKiogW1NhICsgRGEgLSBTYSAqIERhLCBTYyArIERjIC0gU2MgKiBEY10gKi8KLSAgICAgICAgU0NSRUVOICAgICAgKDE1KTsKKyAgICAgICAgU0NSRUVOICAgICAgKDE1KSwKKyAgICAgICAgLyoqIFNhdHVyYXRlKFMgKyBEKSAqLworICAgICAgICBBREQgICAgICAgICAoMTYpLAorICAgICAgICBPVkVSTEFZICAgICAoMTcpOwogCiAgICAgICAgIE1vZGUoaW50IG5hdGl2ZUludCkgewogICAgICAgICAgICAgdGhpcy5uYXRpdmVJbnQgPSBuYXRpdmVJbnQ7CiAgICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IG5hdGl2ZUludDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbmF0aXZlSW50OwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXIuamF2YQppbmRleCAwNjcyNGJkLi5iMDJkYWIxIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZkNvbG9yRmlsdGVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmZDb2xvckZpbHRlci5qYXZhCkBAIC0yNSwxMCArMjUsMTAgQEAKICAgICAgKiBAcGFyYW0gbW9kZSAgICAgICAgICAgVGhlIHBvcnRlci1kdWZmIG1vZGUgdGhhdCBpcyBhcHBsaWVkCiAgICAgICovCiAgICAgcHVibGljIFBvcnRlckR1ZmZDb2xvckZpbHRlcihpbnQgc3JjQ29sb3IsIFBvcnRlckR1ZmYuTW9kZSBtb2RlKSB7Ci0gICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZV9DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyKHNyY0NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLm5hdGl2ZUludCk7CisgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZV9DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyKHNyY0NvbG9yLCBtb2RlLm5hdGl2ZUludCk7CisgICAgICAgIG5hdGl2ZUNvbG9yRmlsdGVyID0gbkNyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIoc3JjQ29sb3IsIG1vZGUubmF0aXZlSW50KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyKGludCBzcmNDb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0ZXJEdWZmTW9kZSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihpbnQgc3JjQ29sb3IsIGludCBwb3J0ZXJEdWZmTW9kZSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihpbnQgc3JjQ29sb3IsIGludCBwb3J0ZXJEdWZmTW9kZSk7CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZlhmZXJtb2RlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZlhmZXJtb2RlLmphdmEKaW5kZXggY2IxMjdmZC4uNmJhMDY0YyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmZYZmVybW9kZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmWGZlcm1vZGUuamF2YQpAQCAtMTgsMTEgKzE4LDE3IEBACiAKIHB1YmxpYyBjbGFzcyBQb3J0ZXJEdWZmWGZlcm1vZGUgZXh0ZW5kcyBYZmVybW9kZSB7CiAgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUG9ydGVyRHVmZi5Nb2RlIG1vZGU7CisKKyAgICAvKioKICAgICAgKiBDcmVhdGUgYW4geGZlcm1vZGUgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgcG9ydGVyLWR1ZmYgbW9kZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBtb2RlICAgICAgICAgICBUaGUgcG9ydGVyLWR1ZmYgbW9kZSB0aGF0IGlzIGFwcGxpZWQKICAgICAgKi8KICAgICBwdWJsaWMgUG9ydGVyRHVmZlhmZXJtb2RlKFBvcnRlckR1ZmYuTW9kZSBtb2RlKSB7CisgICAgICAgIHRoaXMubW9kZSA9IG1vZGU7CiAgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNyZWF0ZVhmZXJtb2RlKG1vZGUubmF0aXZlSW50KTsKICAgICB9CiAgICAgCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUmFkaWFsR3JhZGllbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9SYWRpYWxHcmFkaWVudC5qYXZhCmluZGV4IGI0ZTkwMmQuLjg5Nzc2MmMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9SYWRpYWxHcmFkaWVudC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9SYWRpYWxHcmFkaWVudC5qYXZhCkBAIC00MCw2ICs0MCw4IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb2xvciBhbmQgcG9zaXRpb24gYXJyYXlzIG11c3QgYmUgb2YgZXF1YWwgbGVuZ3RoIik7CiAgICAgICAgIH0KICAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlQ3JlYXRlMSh4LCB5LCByYWRpdXMsIGNvbG9ycywgcG9zaXRpb25zLCB0aWxlLm5hdGl2ZUludCk7CisgICAgICAgIG5hdGl2ZV9zaGFkZXIgPSBuYXRpdmVQb3N0Q3JlYXRlMShuYXRpdmVfaW5zdGFuY2UsIHgsIHksIHJhZGl1cywgY29sb3JzLCBwb3NpdGlvbnMsCisgICAgICAgICAgICAgICAgdGlsZS5uYXRpdmVJbnQpOwogICAgIH0KIAogCS8qKglDcmVhdGUgYSBzaGFkZXIgdGhhdCBkcmF3cyBhIHJhZGlhbCBncmFkaWVudCBnaXZlbiB0aGUgY2VudGVyIGFuZCByYWRpdXMuCkBAIC01NiwxMSArNTgsMTggQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJhZGl1cyBtdXN0IGJlID4gMCIpOwogICAgICAgICB9CiAgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNyZWF0ZTIoeCwgeSwgcmFkaXVzLCBjb2xvcjAsIGNvbG9yMSwgdGlsZS5uYXRpdmVJbnQpOworICAgICAgICBuYXRpdmVfc2hhZGVyID0gbmF0aXZlUG9zdENyZWF0ZTIobmF0aXZlX2luc3RhbmNlLCB4LCB5LCByYWRpdXMsIGNvbG9yMCwgY29sb3IxLAorICAgICAgICAgICAgICAgIHRpbGUubmF0aXZlSW50KTsKICAgICB9CiAKIAlwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTEoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3JzW10sIGZsb2F0IHBvc2l0aW9uc1tdLCBpbnQgdGlsZU1vZGUpOworICAgICAgICAgICAgaW50IGNvbG9yc1tdLCBmbG9hdCBwb3NpdGlvbnNbXSwgaW50IHRpbGVNb2RlKTsKIAlwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IwLCBpbnQgY29sb3IxLCBpbnQgdGlsZU1vZGUpOworICAgICAgICAgICAgaW50IGNvbG9yMCwgaW50IGNvbG9yMSwgaW50IHRpbGVNb2RlKTsKKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlUG9zdENyZWF0ZTEoaW50IG5hdGl2ZV9zaGFkZXIsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHJhZGl1cywKKyAgICAgICAgICAgIGludCBjb2xvcnNbXSwgZmxvYXQgcG9zaXRpb25zW10sIGludCB0aWxlTW9kZSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVQb3N0Q3JlYXRlMihpbnQgbmF0aXZlX3NoYWRlciwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcmFkaXVzLAorICAgICAgICAgICAgaW50IGNvbG9yMCwgaW50IGNvbG9yMSwgaW50IHRpbGVNb2RlKTsKIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1JlZ2lvbi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1JlZ2lvbi5qYXZhCmluZGV4IDJiMDgwYWEuLmU1NDA4MDYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9SZWdpb24uamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUmVnaW9uLmphdmEKQEAgLTIwLDYgKzIwLDEwIEBACiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogCiBwdWJsaWMgY2xhc3MgUmVnaW9uIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IG1OYXRpdmVSZWdpb247CiAKICAgICAvLyB0aGUgbmF0aXZlIHZhbHVlcyBmb3IgdGhlc2UgbXVzdCBtYXRjaCB1cCB3aXRoIHRoZSBlbnVtIGluIFNrUmVnaW9uLmgKICAgICBwdWJsaWMgZW51bSBPcCB7CkBAIC0zMyw3ICszNywxMSBAQAogICAgICAgICBPcChpbnQgbmF0aXZlSW50KSB7CiAgICAgICAgICAgICB0aGlzLm5hdGl2ZUludCA9IG5hdGl2ZUludDsKICAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgbmF0aXZlSW50OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIGludCBuYXRpdmVJbnQ7CiAgICAgfQogCiAgICAgLyoqIENyZWF0ZSBhbiBlbXB0eSByZWdpb24KQEAgLTMyNSwxMCArMzMzLDE0IEBACiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgbmF0aXZlRGVzdHJ1Y3RvcihtTmF0aXZlUmVnaW9uKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5hdGl2ZURlc3RydWN0b3IobU5hdGl2ZVJlZ2lvbik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CiAgICAgfQogICAgIAotICAgIC8qcGFja2FnZSovIFJlZ2lvbihpbnQgbmkpIHsKKyAgICBSZWdpb24oaW50IG5pKSB7CiAgICAgICAgIGlmIChuaSA9PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwogICAgICAgICB9CkBAIC0zNDEsNyArMzUzLDcgQEAKICAgICAgICAgdGhpcyhuaSk7CiAgICAgfQogCi0gICAgLypwYWNrYWdlKi8gZmluYWwgaW50IG5pKCkgeworICAgIGZpbmFsIGludCBuaSgpIHsKICAgICAgICAgcmV0dXJuIG1OYXRpdmVSZWdpb247CiAgICAgfQogCkBAIC0zNzAsNiArMzgyLDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCBwKTsKIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZUVxdWFscyhpbnQgbmF0aXZlX3IxLCBpbnQgbmF0aXZlX3IyKTsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IG1OYXRpdmVSZWdpb247CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvU2hhZGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvU2hhZGVyLmphdmEKaW5kZXggYWUwMzA0ZS4uMDQwMGI1YyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1NoYWRlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuamF2YQpAQCAtMjMsOSArMjMsMTYgQEAKICAqIGRyYXduIHdpdGggdGhhdCBwYWludCB3aWxsIGdldCBpdHMgY29sb3IocykgZnJvbSB0aGUgc2hhZGVyLgogICovCiBwdWJsaWMgY2xhc3MgU2hhZGVyIHsKLQotICAgIC8vIHRoaXMgaXMgc2V0IGJ5IHN1YmNsYXNzZXMsIGJ1dCBkb24ndCBtYWtlIGl0IHB1YmxpYwotICAgIC8qIHBhY2thZ2UgKi8gaW50IG5hdGl2ZV9pbnN0YW5jZTsKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHNldCBieSBzdWJjbGFzc2VzLCBidXQgZG9uJ3QgbWFrZSBpdCBwdWJsaWMuCisgICAgICogCisgICAgICogQGhpZGUgCisgICAgICovCisgICAgcHVibGljIGludCBuYXRpdmVfaW5zdGFuY2U7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG5hdGl2ZV9zaGFkZXI7CiAKICAgICBwdWJsaWMgZW51bSBUaWxlTW9kZSB7CiAgICAgICAgIC8qKgpAQCAtNjQsMTcgKzcxLDIxIEBACiAgICAgICogQHBhcmFtIGxvY2FsTSBUaGUgc2hhZGVyJ3MgbmV3IGxvY2FsIG1hdHJpeCwgb3IgbnVsbCB0byBzcGVjaWZ5IGlkZW50aXR5CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TG9jYWxNYXRyaXgoTWF0cml4IGxvY2FsTSkgewotICAgICAgICBuYXRpdmVTZXRMb2NhbE1hdHJpeChuYXRpdmVfaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTSAhPSBudWxsID8gbG9jYWxNLm5hdGl2ZV9pbnN0YW5jZSA6IDApOworICAgICAgICBuYXRpdmVTZXRMb2NhbE1hdHJpeChuYXRpdmVfaW5zdGFuY2UsIG5hdGl2ZV9zaGFkZXIsCisgICAgICAgICAgICAgICAgbG9jYWxNID09IG51bGwgPyAwIDogbG9jYWxNLm5hdGl2ZV9pbnN0YW5jZSk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgbmF0aXZlRGVzdHJ1Y3RvcihuYXRpdmVfaW5zdGFuY2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG5hdGl2ZURlc3RydWN0b3IobmF0aXZlX2luc3RhbmNlLCBuYXRpdmVfc2hhZGVyKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZURlc3RydWN0b3IoaW50IG5hdGl2ZV9zaGFkZXIpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZURlc3RydWN0b3IoaW50IG5hdGl2ZV9zaGFkZXIsIGludCBuYXRpdmVfc2tpYVNoYWRlcik7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlR2V0TG9jYWxNYXRyaXgoaW50IG5hdGl2ZV9zaGFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hdHJpeF9pbnN0YW5jZSk7CisgICAgICAgICAgICBpbnQgbWF0cml4X2luc3RhbmNlKTsgCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlU2V0TG9jYWxNYXRyaXgoaW50IG5hdGl2ZV9zaGFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hdHJpeF9pbnN0YW5jZSk7CisgICAgICAgICAgICBpbnQgbmF0aXZlX3NraWFTaGFkZXIsIGludCBtYXRyaXhfaW5zdGFuY2UpOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1N3ZWVwR3JhZGllbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Td2VlcEdyYWRpZW50LmphdmEKaW5kZXggNzQ1Njk5My4uMmFmZGQ0ZCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1N3ZWVwR3JhZGllbnQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvU3dlZXBHcmFkaWVudC5qYXZhCkBAIC00Miw2ICs0Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3IgYW5kIHBvc2l0aW9uIGFycmF5cyBtdXN0IGJlIG9mIGVxdWFsIGxlbmd0aCIpOwogICAgICAgICB9CiAgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNyZWF0ZTEoY3gsIGN5LCBjb2xvcnMsIHBvc2l0aW9ucyk7CisgICAgICAgIG5hdGl2ZV9zaGFkZXIgPSBuYXRpdmVQb3N0Q3JlYXRlMShuYXRpdmVfaW5zdGFuY2UsIGN4LCBjeSwgY29sb3JzLCBwb3NpdGlvbnMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTQsMTEgKzU1LDE1IEBACiAgICAgICovCiAgICAgcHVibGljIFN3ZWVwR3JhZGllbnQoZmxvYXQgY3gsIGZsb2F0IGN5LCBpbnQgY29sb3IwLCBpbnQgY29sb3IxKSB7CiAgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNyZWF0ZTIoY3gsIGN5LCBjb2xvcjAsIGNvbG9yMSk7CisgICAgICAgIG5hdGl2ZV9zaGFkZXIgPSBuYXRpdmVQb3N0Q3JlYXRlMihuYXRpdmVfaW5zdGFuY2UsIGN4LCBjeSwgY29sb3IwLCBjb2xvcjEpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMShmbG9hdCB4LCBmbG9hdCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3JzW10sIGZsb2F0IHBvc2l0aW9uc1tdKTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTIoZmxvYXQgeCwgZmxvYXQgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yMCwgaW50IGNvbG9yMSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUxKGZsb2F0IHgsIGZsb2F0IHksIGludCBjb2xvcnNbXSwgZmxvYXQgcG9zaXRpb25zW10pOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMihmbG9hdCB4LCBmbG9hdCB5LCBpbnQgY29sb3IwLCBpbnQgY29sb3IxKTsKKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlUG9zdENyZWF0ZTEoaW50IG5hdGl2ZV9zaGFkZXIsIGZsb2F0IGN4LCBmbG9hdCBjeSwKKyAgICAgICAgICAgIGludFtdIGNvbG9ycywgZmxvYXRbXSBwb3NpdGlvbnMpOyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZVBvc3RDcmVhdGUyKGludCBuYXRpdmVfc2hhZGVyLCBmbG9hdCBjeCwgZmxvYXQgY3ksCisgICAgICAgICAgICBpbnQgY29sb3IwLCBpbnQgY29sb3IxKTsKIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1RlbXBvcmFyeUJ1ZmZlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1RlbXBvcmFyeUJ1ZmZlci5qYXZhCmluZGV4IDFkN2ZlMDEuLmM1YjgxNDMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9UZW1wb3JhcnlCdWZmZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvVGVtcG9yYXJ5QnVmZmVyLmphdmEKQEAgLTE4LDkgKzE4LDExIEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7CiAKLS8qIHBhY2thZ2UgKi8gY2xhc3MgVGVtcG9yYXJ5QnVmZmVyCi17Ci0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgY2hhcltdIG9idGFpbihpbnQgbGVuKSB7CisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBUZW1wb3JhcnlCdWZmZXIgeworICAgIHB1YmxpYyBzdGF0aWMgY2hhcltdIG9idGFpbihpbnQgbGVuKSB7CiAgICAgICAgIGNoYXJbXSBidWY7CiAKICAgICAgICAgc3luY2hyb25pemVkIChUZW1wb3JhcnlCdWZmZXIuY2xhc3MpIHsKQEAgLTI4LDE1ICszMCwxNSBAQAogICAgICAgICAgICAgc1RlbXAgPSBudWxsOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGJ1ZiA9PSBudWxsIHx8IGJ1Zi5sZW5ndGggPCBsZW4pCisgICAgICAgIGlmIChidWYgPT0gbnVsbCB8fCBidWYubGVuZ3RoIDwgbGVuKSB7CiAgICAgICAgICAgICBidWYgPSBuZXcgY2hhcltBcnJheVV0aWxzLmlkZWFsQ2hhckFycmF5U2l6ZShsZW4pXTsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBidWY7CiAgICAgfQogCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgdm9pZCByZWN5Y2xlKGNoYXJbXSB0ZW1wKSB7Ci0gICAgICAgIGlmICh0ZW1wLmxlbmd0aCA+IDEwMDApCi0gICAgICAgICAgICByZXR1cm47CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlY3ljbGUoY2hhcltdIHRlbXApIHsKKyAgICAgICAgaWYgKHRlbXAubGVuZ3RoID4gMTAwMCkgcmV0dXJuOwogCiAgICAgICAgIHN5bmNocm9uaXplZCAoVGVtcG9yYXJ5QnVmZmVyLmNsYXNzKSB7CiAgICAgICAgICAgICBzVGVtcCA9IHRlbXA7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvWGZlcm1vZGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9YZmVybW9kZS5qYXZhCmluZGV4IDQyYzQxMGUuLjI0NjdiZGMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9YZmVybW9kZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9YZmVybW9kZS5qYXZhCkBAIC0zMSw3ICszMSwxMSBAQAogcHVibGljIGNsYXNzIFhmZXJtb2RlIHsKIAogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGZpbmFsaXplcihuYXRpdmVfaW5zdGFuY2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWxpemVyKG5hdGl2ZV9pbnN0YW5jZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgZmluYWxpemVyKGludCBuYXRpdmVfaW5zdGFuY2UpOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0NvbG9yRHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9Db2xvckRyYXdhYmxlLmphdmEKaW5kZXggNjA0YzYwMi4uYTI1ZmFkNCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0NvbG9yRHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQ29sb3JEcmF3YWJsZS5qYXZhCkBAIC0yNiwxMCArMjYsOCBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIC8qKgotICogQSBzcGVjaWFsaXplZCBEcmF3YWJsZSB0aGF0IGZpbGxzIHRoZSBDYW52YXMgd2l0aCBhIHNwZWNpZmllZCBjb2xvciwKLSAqIHdpdGggcmVzcGVjdCB0byB0aGUgY2xpcCByZWdpb24uIE5vdGUgdGhhdCBhIENvbG9yRHJhd2FibGUgaWdub3JlcyB0aGUgQ29sb3JGaWx0ZXIuCi0gKiBJdCBhbHNvIGlnbm9yZXMgdGhlIEJvdW5kcywgbWVhbmluZyBpdCB3aWxsIGRyYXcgZXZlcnl3aGVyZSBpbiB0aGUgY3VycmVudCBjbGlwLAotICogZXZlbiBpZiBzZXRCb3VuZHMoLi4uKSB3YXMgY2FsbGVkIHdpdGggYSBzbWFsbGVyIGFyZWEuCisgKiBBIHNwZWNpYWxpemVkIERyYXdhYmxlIHRoYXQgZmlsbHMgdGhlIENhbnZhcyB3aXRoIGEgc3BlY2lmaWVkIGNvbG9yLgorICogTm90ZSB0aGF0IGEgQ29sb3JEcmF3YWJsZSBpZ25vcmVzIHRoZSBDb2xvckZpbHRlci4KICAqCiAgKiA8cD5JdCBjYW4gYmUgZGVmaW5lZCBpbiBhbiBYTUwgZmlsZSB3aXRoIHRoZSA8Y29kZT4mbHQ7Y29sb3I+PC9jb2RlPiBlbGVtZW50LjwvcD4KICAqCkBAIC0zNyw2ICszNSw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBDb2xvckRyYXdhYmxlIGV4dGVuZHMgRHJhd2FibGUgewogICAgIHByaXZhdGUgQ29sb3JTdGF0ZSBtU3RhdGU7CisgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUGFpbnQgPSBuZXcgUGFpbnQoKTsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBuZXcgYmxhY2sgQ29sb3JEcmF3YWJsZS4KQEAgLTY2LDcgKzY1LDEwIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgY2FudmFzLmRyYXdDb2xvcihtU3RhdGUubVVzZUNvbG9yKTsKKyAgICAgICAgaWYgKChtU3RhdGUubVVzZUNvbG9yID4+PiAyNCkgIT0gMCkgeworICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKG1TdGF0ZS5tVXNlQ29sb3IpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KGdldEJvdW5kcygpLCBtUGFpbnQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZS5qYXZhCmluZGV4IDMxMjUzMjEuLjdiMmQ5ZDcgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZS5qYXZhCkBAIC0xNiwyMSArMTYsMzAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlOwogCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy4qOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTmluZVBhdGNoOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3RhdGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKIC8qKgogICogQSBEcmF3YWJsZSBpcyBhIGdlbmVyYWwgYWJzdHJhY3Rpb24gZm9yICJzb21ldGhpbmcgdGhhdCBjYW4gYmUgZHJhd24uIiAgTW9zdApAQCAtNjQ1LDYgKzY1NCw4IEBACiAgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhIG11dGFibGUgRHJhd2FibGUgd2lsbCBoYXZlIG5vIGVmZmVjdC4KICAgICAgKgogICAgICAqIEByZXR1cm4gVGhpcyBkcmF3YWJsZS4KKyAgICAgKiBAc2VlIENvbnN0YW50U3RhdGUKKyAgICAgKiBAc2VlICNnZXRDb25zdGFudFN0YXRlKCkKICAgICAgKi8KICAgICBwdWJsaWMgRHJhd2FibGUgbXV0YXRlKCkgewogICAgICAgICByZXR1cm4gdGhpczsKQEAgLTc0OSw2ICs3NjAsOCBAQAogICAgICAgICAgICAgZHJhd2FibGUgPSBuZXcgU3RhdGVMaXN0RHJhd2FibGUoKTsKICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygibGV2ZWwtbGlzdCIpKSB7CiAgICAgICAgICAgICBkcmF3YWJsZSA9IG5ldyBMZXZlbExpc3REcmF3YWJsZSgpOworICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJtaXBtYXAiKSkgeworICAgICAgICAgICAgZHJhd2FibGUgPSBuZXcgTWlwbWFwRHJhd2FibGUoKTsKICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygibGF5ZXItbGlzdCIpKSB7CiAgICAgICAgICAgICBkcmF3YWJsZSA9IG5ldyBMYXllckRyYXdhYmxlKCk7CiAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoInRyYW5zaXRpb24iKSkgewpAQCAtNzcwLDcgKzc4Myw3IEBACiAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImluc2V0IikpIHsKICAgICAgICAgICAgIGRyYXdhYmxlID0gbmV3IEluc2V0RHJhd2FibGUoKTsKICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygiYml0bWFwIikpIHsKLSAgICAgICAgICAgIGRyYXdhYmxlID0gbmV3IEJpdG1hcERyYXdhYmxlKCk7CisgICAgICAgICAgICBkcmF3YWJsZSA9IG5ldyBCaXRtYXBEcmF3YWJsZShyKTsKICAgICAgICAgICAgIGlmIChyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICgoQml0bWFwRHJhd2FibGUpIGRyYXdhYmxlKS5zZXRUYXJnZXREZW5zaXR5KHIuZ2V0RGlzcGxheU1ldHJpY3MoKSk7CiAgICAgICAgICAgICB9CkBAIC04MDUsNiArODE4LDkgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCisgICAgLyoqCisgICAgICogSW5mbGF0ZSB0aGlzIERyYXdhYmxlIGZyb20gYW4gWE1MIHJlc291cmNlLgorICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGluZmxhdGUoUmVzb3VyY2VzIHIsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBBdHRyaWJ1dGVTZXQgYXR0cnMpCiAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCkBAIC04MTMsNiArODI5LDEyIEBACiAgICAgICAgIGEucmVjeWNsZSgpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEluZmxhdGUgYSBEcmF3YWJsZSBmcm9tIGFuIFhNTCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KICAgICB2b2lkIGluZmxhdGVXaXRoQXR0cmlidXRlcyhSZXNvdXJjZXMgciwgWG1sUHVsbFBhcnNlciBwYXJzZXIsCiAgICAgICAgICAgICBUeXBlZEFycmF5IGF0dHJzLCBpbnQgdmlzaWJsZUF0dHIpCiAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewpAQCAtODIwLDEyICs4NDIsMjcgQEAKICAgICAgICAgbVZpc2libGUgPSBhdHRycy5nZXRCb29sZWFuKHZpc2libGVBdHRyLCBtVmlzaWJsZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyB1c2VkIGJ5IHtAbGluayBEcmF3YWJsZX1zIHRvIHN0b3JlIHNoYXJlZCBjb25zdGFudCBzdGF0ZSBhbmQgZGF0YQorICAgICAqIGJldHdlZW4gRHJhd2FibGVzLiB7QGxpbmsgQml0bWFwRHJhd2FibGV9cyBjcmVhdGVkIGZyb20gdGhlIHNhbWUgcmVzb3VyY2Ugd2lsbCBmb3IgaW5zdGFuY2UKKyAgICAgKiBzaGFyZSBhIHVuaXF1ZSBiaXRtYXAgc3RvcmVkIGluIHRoZWlyIENvbnN0YW50U3RhdGUuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiB7QGxpbmsgI25ld0RyYXdhYmxlKFJlc291cmNlcyl9IGNhbiBiZSB1c2VkIGFzIGEgZmFjdG9yeSB0byBjcmVhdGUgbmV3IERyYXdhYmxlIGluc3RhbmNlcworICAgICAqIGZyb20gdGhpcyBDb25zdGFudFN0YXRlLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIFVzZSB7QGxpbmsgRHJhd2FibGUjZ2V0Q29uc3RhbnRTdGF0ZSgpfSB0byByZXRyaWV2ZSB0aGUgQ29uc3RhbnRTdGF0ZSBvZiBhIERyYXdhYmxlLiBDYWxsaW5nCisgICAgICoge0BsaW5rIERyYXdhYmxlI211dGF0ZSgpfSBvbiBhIERyYXdhYmxlIHNob3VsZCB0eXBpY2FsbHkgY3JlYXRlIGEgbmV3IENvbnN0YW50U3RhdGUgZm9yIHRoYXQKKyAgICAgKiBEcmF3YWJsZS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIENvbnN0YW50U3RhdGUgewogICAgICAgICAvKioKICAgICAgICAgICogQ3JlYXRlIGEgbmV3IGRyYXdhYmxlIHdpdGhvdXQgc3VwcGx5aW5nIHJlc291cmNlcyB0aGUgY2FsbGVyCiAgICAgICAgICAqIGlzIHJ1bm5pbmcgaW4uICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBtZWFucyB0aGUgZGVuc2l0eS1kZXBlbmRlbnQKICAgICAgICAgICogZHJhd2FibGVzIChsaWtlIGJpdG1hcHMpIHdpbGwgbm90IGJlIGFibGUgdG8gdXBkYXRlIHRoZWlyIHRhcmdldAotICAgICAgICAgKiBkZW5zaXR5IGNvcnJlY3RseS4KKyAgICAgICAgICogZGVuc2l0eSBjb3JyZWN0bHkuIE9uZSBzaG91bGQgdXNlIHtAbGluayAjbmV3RHJhd2FibGUoUmVzb3VyY2VzKX0KKyAgICAgICAgICogaW5zdGVhZCB0byBwcm92aWRlIGEgcmVzb3VyY2UuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgRHJhd2FibGUgbmV3RHJhd2FibGUoKTsKICAgICAgICAgLyoqCkBAIC04NDQsNiArODgxLDEzIEBACiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Q2hhbmdpbmdDb25maWd1cmF0aW9ucygpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybiBhIHtAbGluayBDb25zdGFudFN0YXRlfSBpbnN0YW5jZSB0aGF0IGhvbGRzIHRoZSBzaGFyZWQgc3RhdGUgb2YgdGhpcyBEcmF3YWJsZS4KKyAgICAgKnEKKyAgICAgKiBAcmV0dXJuIFRoZSBDb25zdGFudFN0YXRlIGFzc29jaWF0ZWQgdG8gdGhhdCBEcmF3YWJsZS4KKyAgICAgKiBAc2VlIENvbnN0YW50U3RhdGUKKyAgICAgKiBAc2VlIERyYXdhYmxlI211dGF0ZSgpCisgICAgICovCiAgICAgcHVibGljIENvbnN0YW50U3RhdGUgZ2V0Q29uc3RhbnRTdGF0ZSgpIHsKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlQ29udGFpbmVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGVDb250YWluZXIuamF2YQppbmRleCBjNmY1N2Q0Li4xMjRkOTA3IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGVDb250YWluZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGVDb250YWluZXIuamF2YQpAQCAtMTcsOCArMTcsMTYgQEAKIHBhY2thZ2UgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZTsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuKjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogCisvKioKKyAqIEEgaGVscGVyIGNsYXNzIHRoYXQgY29udGFpbnMgc2V2ZXJhbCB7QGxpbmsgRHJhd2FibGV9cyBhbmQgc2VsZWN0cyB3aGljaCBvbmUgdG8gdXNlLgorICoKKyAqIFlvdSBjYW4gc3ViY2xhc3MgaXQgdG8gY3JlYXRlIHlvdXIgb3duIERyYXdhYmxlQ29udGFpbmVycyBvciBkaXJlY3RseSB1c2Ugb25lIGl0cyBjaGlsZCBjbGFzc2VzLgorICovCiBwdWJsaWMgY2xhc3MgRHJhd2FibGVDb250YWluZXIgZXh0ZW5kcyBEcmF3YWJsZSBpbXBsZW1lbnRzIERyYXdhYmxlLkNhbGxiYWNrIHsKIAogICAgIC8qKgpAQCAtMTk2LDggKzIwNCw3IEBACiAgICAgICAgICAgICAgICAgbURyYXdhYmxlQ29udGFpbmVyU3RhdGUuZ2V0T3BhY2l0eSgpOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdERyYXdhYmxlKGludCBpZHgpCi0gICAgeworICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdERyYXdhYmxlKGludCBpZHgpIHsKICAgICAgICAgaWYgKGlkeCA9PSBtQ3VySW5kZXgpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtMjU1LDYgKzI2MiwxMiBAQAogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBBIENvbnN0YW50U3RhdGUgdGhhdCBjYW4gY29udGFpbiBzZXZlcmFsIHtAbGluayBEcmF3YWJsZX1zLgorICAgICAqCisgICAgICogVGhpcyBjbGFzcyB3YXMgbWFkZSBwdWJsaWMgdG8gZW5hYmxlIHRlc3RpbmcsIGFuZCBpdHMgdmlzaWJpbGl0eSBtYXkgY2hhbmdlIGluIGEgZnV0dXJlCisgICAgICogcmVsZWFzZS4KKyAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIERyYXdhYmxlQ29udGFpbmVyU3RhdGUgZXh0ZW5kcyBDb25zdGFudFN0YXRlIHsKICAgICAgICAgZmluYWwgRHJhd2FibGVDb250YWluZXIgbU93bmVyOwogCkBAIC00NDMsMTIgKzQ1NiwxMiBAQAogICAgICAgICAgICAgcmV0dXJuIG1Db25zdGFudE1pbmltdW1IZWlnaHQ7CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgY29tcHV0ZUNvbnN0YW50U2l6ZSgpIHsKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZUNvbnN0YW50U2l6ZSgpIHsKICAgICAgICAgICAgIG1Db21wdXRlZENvbnN0YW50U2l6ZSA9IHRydWU7CiAKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gZ2V0Q2hpbGRDb3VudCgpOwogICAgICAgICAgICAgZmluYWwgRHJhd2FibGVbXSBkcmF3YWJsZXMgPSBtRHJhd2FibGVzOwotICAgICAgICAgICAgbUNvbnN0YW50V2lkdGggPSBtQ29uc3RhbnRIZWlnaHQgPSAwOworICAgICAgICAgICAgbUNvbnN0YW50V2lkdGggPSBtQ29uc3RhbnRIZWlnaHQgPSAtMTsKICAgICAgICAgICAgIG1Db25zdGFudE1pbmltdW1XaWR0aCA9IG1Db25zdGFudE1pbmltdW1IZWlnaHQgPSAwOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICAgICAgICAgICBEcmF3YWJsZSBkciA9IGRyYXdhYmxlc1tpXTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9HcmFkaWVudERyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvR3JhZGllbnREcmF3YWJsZS5qYXZhCmluZGV4IDMzZWNiZWEuLjg4ZjZkNDMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9HcmFkaWVudERyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0dyYWRpZW50RHJhd2FibGUuamF2YQpAQCAtMzEzLDE4ICszMTMsMTYgQEAKICAgICAgICAgICAgIGNhc2UgUkVDVEFOR0xFOgogICAgICAgICAgICAgICAgIGlmIChzdC5tUmFkaXVzQXJyYXkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBtUGF0aC5yZXNldCgpOwotICAgICAgICAgICAgICAgICAgICBtUGF0aC5hZGRSb3VuZFJlY3QobVJlY3QsIHN0Lm1SYWRpdXNBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGguRGlyZWN0aW9uLkNXKTsKKyAgICAgICAgICAgICAgICAgICAgbVBhdGguYWRkUm91bmRSZWN0KG1SZWN0LCBzdC5tUmFkaXVzQXJyYXksIFBhdGguRGlyZWN0aW9uLkNXKTsKICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRoKG1QYXRoLCBtRmlsbFBhaW50KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVTdHJva2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbVN0cm9rZVBhaW50KTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0Lm1SYWRpdXMgPiAwLjBmKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBjYWxsZXIgaXMgb25seSBnaXZpbmcgdXMgMSB2YWx1ZSwgd2Ugd2lsbCBmb3JjZQogICAgICAgICAgICAgICAgICAgICAvLyBpdCB0byBiZSBzcXVhcmUgaWYgdGhlIHJlY3QgaXMgdG9vIHNtYWxsIGluIG9uZSBkaW1lbnNpb24KICAgICAgICAgICAgICAgICAgICAgLy8gdG8gc2hvdyBpdC4gSWYgd2UgZGlkIG5vdGhpbmcsIFNraWEgd291bGQgY2xhbXAgdGhlIHJhZAotICAgICAgICAgICAgICAgICAgICAvLyBpbmRlcGVuZGVudGx5IGFsb25nIGVhY2ggYXhpcywgZ2l2aW5nIHVzIGEgdGhpbiBlbGxpcHMKKyAgICAgICAgICAgICAgICAgICAgLy8gaW5kZXBlbmRlbnRseSBhbG9uZyBlYWNoIGF4aXMsIGdpdmluZyB1cyBhIHRoaW4gZWxsaXBzZQogICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcmVjdCB3ZXJlIHZlcnkgd2lkZSBidXQgbm90IHZlcnkgdGFsbAogICAgICAgICAgICAgICAgICAgICBmbG9hdCByYWQgPSBzdC5tUmFkaXVzOwogICAgICAgICAgICAgICAgICAgICBmbG9hdCByID0gTWF0aC5taW4obVJlY3Qud2lkdGgoKSwgbVJlY3QuaGVpZ2h0KCkpICogMC41ZjsKQEAgLTMzNSw2ICszMzMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVTdHJva2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3Um91bmRSZWN0KG1SZWN0LCByYWQsIHJhZCwgbVN0cm9rZVBhaW50KTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdChtUmVjdCwgbUZpbGxQYWludCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYXZlU3Ryb2tlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QobVJlY3QsIG1TdHJva2VQYWludCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIE9WQUw6CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTGF5ZXJEcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0xheWVyRHJhd2FibGUuamF2YQppbmRleCA4MDQ3ZGQ0Li41MDFjY2E5IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTGF5ZXJEcmF3YWJsZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9MYXllckRyYXdhYmxlLmphdmEKQEAgLTI2Niw2ICsyNjYsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHNldERyYXdhYmxlQnlMYXllcklkKGludCBpZCwgRHJhd2FibGUgZHJhd2FibGUpIHsKICAgICAgICAgZmluYWwgQ2hpbGREcmF3YWJsZVtdIGxheWVycyA9IG1MYXllclN0YXRlLm1DaGlsZHJlbjsKKyAgICAgICAgZHJhd2FibGUuc2V0Q2FsbGJhY2sodGhpcyk7CiAgICAgICAgIAogICAgICAgICBmb3IgKGludCBpID0gbUxheWVyU3RhdGUubU51bSAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICBpZiAobGF5ZXJzW2ldLm1JZCA9PSBpZCkgewpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL01pcG1hcERyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTWlwbWFwRHJhd2FibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWZkZWVkCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL01pcG1hcERyYXdhYmxlLmphdmEKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGU7CisKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIEEgcmVzb3VyY2UgdGhhdCBtYW5hZ2VzIGEgbnVtYmVyIG9mIGFsdGVybmF0ZSBEcmF3YWJsZXMsIGFuZCB3aGljaCBhY3R1YWxseSBkcmF3cyB0aGUgb25lIHdoaWNoCisgKiBzaXplIG1hdGNoZXMgdGhlIG1vc3QgY2xvc2VseSB0aGUgZHJhd2luZyBib3VuZHMuIFByb3ZpZGluZyBzZXZlcmFsIHByZS1zY2FsZWQgdmVyc2lvbiBvZiB0aGUKKyAqIGRyYXdhYmxlIGhlbHBzIG1pbmltaXppbmcgdGhlIGFsaWFzaW5nIGFydGlmYWN0cyB0aGF0IGNhbiBiZSBpbnRyb2R1Y2VkIGJ5IHRoZSBzY2FsaW5nLgorICoKKyAqIDxwPgorICogVXNlIHtAbGluayAjYWRkRHJhd2FibGUoRHJhd2FibGUpfSB0byBkZWZpbmUgdGhlIGRpZmZlcmVudCBEcmF3YWJsZXMgdGhhdCB3aWxsIHJlcHJlc2VudCB0aGUKKyAqIG1pcG1hcCBsZXZlbHMgb2YgdGhpcyBNaXBtYXBEcmF3YWJsZS4gVGhlIG1pcG1hcCBEcmF3YWJsZSB0aGF0IHdpbGwgYWN0dWFsbHkgYmUgdXNlZCB3aGVuIHRoaXMKKyAqIE1pcG1hcERyYXdhYmxlIGlzIGRyYXduIGlzIHRoZSBvbmUgd2hpY2ggaGFzIHRoZSBzbWFsbGVzdCBpbnRyaW5zaWMgaGVpZ2h0IGdyZWF0ZXIgb3IgZXF1YWwgdGhhbgorICogdGhlIGJvdW5kcycgaGVpZ2h0LiBUaGlzIHNlbGVjdGlvbiBlbnN1cmVzIHRoYXQgdGhlIGJlc3QgYXZhaWxhYmxlIG1pcG1hcCBsZXZlbCBpcyBzY2FsZWQgZG93biB0bworICogZHJhdyB0aGlzIE1pcG1hcERyYXdhYmxlLgorICogPC9wPgorICoKKyAqIElmIHRoZSBib3VuZHMnIGhlaWdodCBpcyBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCBtaXBtYXAsIHRoZSBsYXJnZXN0IG1pcG1hcCB3aWxsIGJlIHNjYWxlZCB1cC4KKyAqIE5vdGUgdGhhdCBEcmF3YWJsZXMgd2l0aG91dCBpbnRyaW5zaWMgaGVpZ2h0IChpLmUuIHdpdGggYSBuZWdhdGl2ZSB2YWx1ZSwgc3VjaCBhcyBDb2xvcikgd2lsbAorICogb25seSBiZSB1c2VkIGlmIG5vIG90aGVyIG1pcG1hcCBEcmF3YWJsZSBhcmUgcHJvdmlkZWQuIFRoZSBEcmF3YWJsZXMnIGludHJpbnNpYyBoZWlnaHRzIHNob3VsZAorICogbm90IGJlIGNoYW5nZWQgYWZ0ZXIgdGhlIERyYXdhYmxlIGhhcyBiZWVuIGFkZGVkIHRvIHRoaXMgTWlwbWFwRHJhd2FibGUuCisgKgorICogPHA+CisgKiBUaGUgZGlmZmVyZW50IG1pcG1hcHMnIHBhcmFtZXRlcnMgKG9wYWNpdHksIHBhZGRpbmcsIGNvbG9yIGZpbHRlciwgZ3Jhdml0eS4uLikgc2hvdWxkIHR5cGljYWxseQorICogYmUgc2ltaWxhciB0byBlbnN1cmUgYSBjb250aW51b3VzIHZpc3VhbCBhcHBlYXJhbmNlIHdoZW4gdGhlIE1pcG1hcERyYXdhYmxlIGlzIHNjYWxlZC4gVGhlIGFzcGVjdAorICogcmF0aW8gb2YgdGhlIGRpZmZlcmVudCBtaXBtYXBzIHNob3VsZCBlc3BlY2lhbGx5IGJlIGVxdWFsLgorICogPC9wPgorICoKKyAqIEEgdHlwaWNhbCBleGFtcGxlIHVzZSBvZiBhIE1pcG1hcERyYXdhYmxlIHdvdWxkIGJlIGZvciBhbiBpbWFnZSB3aGljaCBpcyBpbnRlbmRlZCB0byBiZSBzY2FsZWQgYXQKKyAqIHZhcmlvdXMgc2l6ZXMsIGFuZCBmb3Igd2hpY2ggb25lIHdhbnRzIHRvIHByb3ZpZGUgcHJlLXNjYWxlZCB2ZXJzaW9ucyB0byBwcmVjaXNlbHkgY29udHJvbCBpdHMKKyAqIGFwcGVhcmFuY2UuCisgKgorICogPHA+CisgKiBUaGUgaW50cmluc2ljIHNpemUgb2YgYSBNaXBtYXBEcmF3YWJsZSBhcmUgaW5mZXJyZWQgZnJvbSB0aG9zZSBvZiB0aGUgbGFyZ2VzdCBtaXBtYXAgKGluIHRlcm1zIG9mCisgKiB7QGxpbmsgRHJhd2FibGUjZ2V0SW50cmluc2ljSGVpZ2h0KCl9KS4gT24gdGhlIG9wcG9zaXRlLCBpdHMgbWluaW11bQorICogc2l6ZSBpcyBkZWZpbmVkIGJ5IHRoZSBzbWFsbGVzdCBwcm92aWRlZCBtaXBtYXAuCisgKiA8L3A+CisKKyAqIEl0IGNhbiBiZSBkZWZpbmVkIGluIGFuIFhNTCBmaWxlIHdpdGggdGhlIDxjb2RlPiZsdDttaXBtYXA+PC9jb2RlPiBlbGVtZW50LgorICogRWFjaCBtaXBtYXAgRHJhd2FibGUgaXMgZGVmaW5lZCBpbiBhIG5lc3RlZCA8Y29kZT4mbHQ7aXRlbT48L2NvZGU+LiBGb3IgZXhhbXBsZToKKyAqIDxwcmU+CisgKiAmbHQ7bWlwbWFwIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgKiAgJmx0O2l0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL215X2ltYWdlXzgiIC8+CisgKiAgJmx0O2l0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL215X2ltYWdlXzMyIiAvPgorICogICZsdDtpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9teV9pbWFnZV8xMjgiIC8+CisgKiAmbHQ7L21pcG1hcD4KKyAqPC9wcmU+CisgKiA8cD4KKyAqIFdpdGggdGhpcyBYTUwgc2F2ZWQgaW50byB0aGUgcmVzL2RyYXdhYmxlLyBmb2xkZXIgb2YgdGhlIHByb2plY3QsIGl0IGNhbiBiZSByZWZlcmVuY2VkIGFzCisgKiB0aGUgZHJhd2FibGUgZm9yIGFuIHtAbGluayBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXd9LiBBc3N1bWluZyB0aGF0IHRoZSBoZWlnaHRzIG9mIHRoZSBwcm92aWRlZAorICogZHJhd2FibGVzIGFyZSByZXNwZWN0aXZlbHkgOCwgMzIgYW5kIDEyOCBwaXhlbHMsIHRoZSBmaXJzdCBvbmUgd2lsbCBiZSBzY2FsZWQgZG93biB3aGVuIHRoZQorICogYm91bmRzJyBoZWlnaHQgaXMgbG93ZXIgb3IgZXF1YWwgdGhhbiA4IHBpeGVscy4gVGhlIHNlY29uZCBkcmF3YWJsZSB3aWxsIHRoZW4gYmUgdXNlZCB1cCB0byBhCisgKiBoZWlnaHQgb2YgMzIgcGl4ZWxzIGFuZCB0aGUgbGFyZ2VzdCBkcmF3YWJsZSB3aWxsIGJlIHVzZWQgZm9yIGdyZWF0ZXIgaGVpZ2h0cy4KKyAqIDwvcD4KKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI01pcG1hcERyYXdhYmxlSXRlbV9kcmF3YWJsZQorICovCitwdWJsaWMgY2xhc3MgTWlwbWFwRHJhd2FibGUgZXh0ZW5kcyBEcmF3YWJsZUNvbnRhaW5lciB7CisgICAgcHJpdmF0ZSBmaW5hbCBNaXBtYXBDb250YWluZXJTdGF0ZSBtTWlwbWFwQ29udGFpbmVyU3RhdGU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1NdXRhdGVkOworCisgICAgcHVibGljIE1pcG1hcERyYXdhYmxlKCkgeworICAgICAgICB0aGlzKG51bGwsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBEcmF3YWJsZSB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgbWlwbWFwIERyYXdhYmxlcy4gVGhlIERyYXdhYmxlIGFjdHVhbGx5IHVzZWQgd2hlbgorICAgICAqIHRoaXMgTWlwbWFwRHJhd2FibGUgaXMgZHJhd24gaXMgZGV0ZXJtaW5lZCBmcm9tIGl0cyBib3VuZHMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0IGlmIGRyYXdhYmxlIGlzIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHJhd2FibGUgVGhlIERyYXdhYmxlIHRoYXQgd2lsbCBiZSBhZGRlZCB0byBsaXN0IG9mIGF2YWlsYWJsZSBtaXBtYXAgRHJhd2FibGVzLgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgYWRkRHJhd2FibGUoRHJhd2FibGUgZHJhd2FibGUpIHsKKyAgICAgICAgaWYgKGRyYXdhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1NaXBtYXBDb250YWluZXJTdGF0ZS5hZGREcmF3YWJsZShkcmF3YWJsZSk7CisgICAgICAgICAgICBvbkRyYXdhYmxlQWRkZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkRyYXdhYmxlQWRkZWQoKSB7CisgICAgICAgIC8vIHNlbGVjdERyYXdhYmxlIGFzc3VtZXMgdGhhdCB0aGUgY29udGFpbmVyIGNvbnRlbnQgZG9lcyBub3QgY2hhbmdlLgorICAgICAgICAvLyBXaGVuIGEgRHJhd2FibGUgaXMgYWRkZWQsIHRoZSBzYW1lIGluZGV4IGNhbiBjb3JyZXNwb25kIHRvIGEgbmV3IERyYXdhYmxlLCBhbmQgc2luY2UKKyAgICAgICAgLy8gc2VsZWN0RHJhd2FibGUgaGFzIGEgZmFzdCBleGl0IGNhc2Ugd2hlbiBvbGRJbmRleD09bmV3SW5kZXgsIHRoZSBuZXcgZHJhd2FibGUgY291bGQgZW5kCisgICAgICAgIC8vIHVwIG5vdCBiZWluZyB1c2VkIGluIHBsYWNlIG9mIHRoZSBwcmV2aW91cyBvbmUgaWYgdGhleSBoYXBwZW4gdG8gc2hhcmUgdGhlIHNhbWUgaW5kZXguCisgICAgICAgIC8vIFRoaXMgbWFrZSBzdXJlIHRoZSBuZXcgY29tcHV0ZWQgaW5kZXggY2FuIGFjdHVhbGx5IHJlcGxhY2UgdGhlIHByZXZpb3VzIG9uZS4KKyAgICAgICAgc2VsZWN0RHJhd2FibGUoLTEpOworICAgICAgICBvbkJvdW5kc0NoYW5nZShnZXRCb3VuZHMoKSk7CisgICAgfQorCisgICAgLy8gb3ZlcnJpZGVzIGZyb20gRHJhd2FibGUKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQm91bmRzQ2hhbmdlKFJlY3QgYm91bmRzKSB7CisgICAgICAgIGZpbmFsIGludCBpbmRleCA9IG1NaXBtYXBDb250YWluZXJTdGF0ZS5pbmRleEZvckJvdW5kcyhib3VuZHMpOworCisgICAgICAgIC8vIFdpbGwgY2FsbCBpbnZhbGlkYXRlU2VsZigpIGlmIG5lZWRlZAorICAgICAgICBzZWxlY3REcmF3YWJsZShpbmRleCk7CisKKyAgICAgICAgc3VwZXIub25Cb3VuZHNDaGFuZ2UoYm91bmRzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbmZsYXRlKFJlc291cmNlcyByLCBYbWxQdWxsUGFyc2VyIHBhcnNlciwgQXR0cmlidXRlU2V0IGF0dHJzKQorICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIuaW5mbGF0ZShyLCBwYXJzZXIsIGF0dHJzKTsKKworICAgICAgICBpbnQgdHlwZTsKKworICAgICAgICBmaW5hbCBpbnQgaW5uZXJEZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpICsgMTsKKyAgICAgICAgaW50IGRlcHRoOworICAgICAgICB3aGlsZSAoKHR5cGUgPSBwYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVAorICAgICAgICAgICAgICAgICYmICgoZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKSkgPj0gaW5uZXJEZXB0aAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcpKSB7CisgICAgICAgICAgICBpZiAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGVwdGggPiBpbm5lckRlcHRoIHx8ICFwYXJzZXIuZ2V0TmFtZSgpLmVxdWFscygiaXRlbSIpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IHIub2J0YWluQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTWlwbWFwRHJhd2FibGVJdGVtKTsKKworICAgICAgICAgICAgaW50IGRyYXdhYmxlUmVzID0gYS5nZXRSZXNvdXJjZUlkKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NaXBtYXBEcmF3YWJsZUl0ZW1fZHJhd2FibGUsIDApOworCisgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgRHJhd2FibGUgZHI7CisgICAgICAgICAgICBpZiAoZHJhd2FibGVSZXMgIT0gMCkgeworICAgICAgICAgICAgICAgIGRyID0gci5nZXREcmF3YWJsZShkcmF3YWJsZVJlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdoaWxlICgodHlwZSA9IHBhcnNlci5uZXh0KCkpID09IFhtbFB1bGxQYXJzZXIuVEVYVCkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiA8aXRlbT4gdGFnIHJlcXVpcmVzIGEgJ2RyYXdhYmxlJyBhdHRyaWJ1dGUgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNoaWxkIHRhZyBkZWZpbmluZyBhIGRyYXdhYmxlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRyID0gRHJhd2FibGUuY3JlYXRlRnJvbVhtbElubmVyKHIsIHBhcnNlciwgYXR0cnMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTWlwbWFwQ29udGFpbmVyU3RhdGUuYWRkRHJhd2FibGUoZHIpOworICAgICAgICB9CisKKyAgICAgICAgb25EcmF3YWJsZUFkZGVkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIERyYXdhYmxlIG11dGF0ZSgpIHsKKyAgICAgICAgaWYgKCFtTXV0YXRlZCAmJiBzdXBlci5tdXRhdGUoKSA9PSB0aGlzKSB7CisgICAgICAgICAgICBtTWlwbWFwQ29udGFpbmVyU3RhdGUubU1pcG1hcEhlaWdodHMgPSBtTWlwbWFwQ29udGFpbmVyU3RhdGUubU1pcG1hcEhlaWdodHMuY2xvbmUoKTsKKyAgICAgICAgICAgIG1NdXRhdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBjbGFzcyBNaXBtYXBDb250YWluZXJTdGF0ZSBleHRlbmRzIERyYXdhYmxlQ29udGFpbmVyU3RhdGUgeworICAgICAgICBwcml2YXRlIGludFtdIG1NaXBtYXBIZWlnaHRzOworCisgICAgICAgIE1pcG1hcENvbnRhaW5lclN0YXRlKE1pcG1hcENvbnRhaW5lclN0YXRlIG9yaWcsIE1pcG1hcERyYXdhYmxlIG93bmVyLCBSZXNvdXJjZXMgcmVzKSB7CisgICAgICAgICAgICBzdXBlcihvcmlnLCBvd25lciwgcmVzKTsKKworICAgICAgICAgICAgaWYgKG9yaWcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1NaXBtYXBIZWlnaHRzID0gb3JpZy5tTWlwbWFwSGVpZ2h0czsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU1pcG1hcEhlaWdodHMgPSBuZXcgaW50W2dldENoaWxkcmVuKCkubGVuZ3RoXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlCisgICAgICAgICAgICBzZXRDb25zdGFudFNpemUodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIG1pcG1hcCBkcmF3YWJsZSB0aGF0IHdpbGwgYmVzdCBmaXQgdGhlIHByb3ZpZGVkIGJvdW5kcy4KKyAgICAgICAgICogVGhpcyBpbmRleCBpcyBkZXRlcm1pbmVkIGJ5IGNvbXBhcmluZyBib3VuZHMnIGhlaWdodCBhbmQgY2hpbGRyZW4gaW50cmluc2ljIGhlaWdodHMuCisgICAgICAgICAqIFRoZSByZXR1cm5lZCBtaXBtYXAgaW5kZXggaXMgdGhlIHNtYWxsZXN0IG1pcG1hcCB3aGljaCBoZWlnaHQgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGFuCisgICAgICAgICAqIHRoZSBib3VuZHMnIGhlaWdodC4gSWYgdGhlIGJvdW5kcycgaGVpZ2h0IGlzIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IG1pcG1hcCwgdGhlIGxhcmdlc3QKKyAgICAgICAgICogbWlwbWFwIGluZGV4IGlzIHJldHVybmVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYm91bmRzIFRoZSBib3VuZHMgb2YgdGhlIE1pcE1hcERyYXdhYmxlLgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgY2hpbGQgRHJhd2FibGUgdGhhdCB3aWxsIGJlc3QgZml0IHRoZXNlIGJvdW5kcywgb3IgLTEgaWYgdGhlcmUKKyAgICAgICAgICogYXJlIG5vIGNoaWxkcmVuIG1pcG1hcHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGluZGV4Rm9yQm91bmRzKFJlY3QgYm91bmRzKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgYm91bmRzSGVpZ2h0ID0gYm91bmRzLmhlaWdodCgpOworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChib3VuZHNIZWlnaHQgPD0gbU1pcG1hcEhlaWdodHNbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBObyBtaXBtYXAgbGFyZ2VyIHRoYW4gYm91bmRzIGZvdW5kLiBVc2UgbGFyZ2VzdCBvbmUgd2hpY2ggd2lsbCBiZSBzY2FsZWQgdXAuCisgICAgICAgICAgICBpZiAoTiA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTiAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBObyBEcmF3YWJsZSBtaXBtYXAgYXQgYWxsCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIERyYXdhYmxlIHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBtaXBtYXAgRHJhd2FibGVzLiBUaGlzIGxpc3QgY2FuIGJlIHJldHJpZXZlZAorICAgICAgICAgKiB1c2luZyB7QGxpbmsgRHJhd2FibGVDb250YWluZXIuRHJhd2FibGVDb250YWluZXJTdGF0ZSNnZXRDaGlsZHJlbigpfSBhbmQgdGhpcyBtZXRob2QKKyAgICAgICAgICogZW5zdXJlcyB0aGF0IGl0IGlzIGFsd2F5cyBzb3J0ZWQgYnkgaW5jcmVhc2luZyB7QGxpbmsgRHJhd2FibGUjZ2V0SW50cmluc2ljSGVpZ2h0KCl9LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZHJhd2FibGUgVGhlIERyYXdhYmxlIHRoYXQgd2lsbCBiZSBhZGRlZCB0byBjaGlsZHJlbiBsaXN0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhZGREcmF3YWJsZShEcmF3YWJsZSBkcmF3YWJsZSkgeworICAgICAgICAgICAgLy8gSW5zZXJ0IGRyYXdhYmxlIGluIGxhc3QgcG9zaXRpb24sIGNvcnJlY3RseSByZXNldHRpbmcgY2FjaGVkIHZhbHVlcyBhbmQKKyAgICAgICAgICAgIC8vIGVzcGVjaWFsbHkgbUNvbXB1dGVkQ29uc3RhbnRTaXplCisgICAgICAgICAgICBpbnQgcG9zID0gYWRkQ2hpbGQoZHJhd2FibGUpOworCisgICAgICAgICAgICAvLyBCdWJibGUgc29ydCB0aGUgbGFzdCBkcmF3YWJsZSB0byByZXN0b3JlIHRoZSBzb3J0IGJ5IGludHJpbnNpYyBoZWlnaHQKKyAgICAgICAgICAgIGZpbmFsIGludCBkcmF3YWJsZUhlaWdodCA9IGRyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpOworCisgICAgICAgICAgICB3aGlsZSAocG9zID4gMCkgeworICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIHByZXZpb3VzRHJhd2FibGUgPSBtRHJhd2FibGVzW3Bvcy0xXTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcHJldmlvdXNJbnRyaW5zaWNIZWlnaHQgPSBwcmV2aW91c0RyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpOworCisgICAgICAgICAgICAgICAgaWYgKGRyYXdhYmxlSGVpZ2h0IDwgcHJldmlvdXNJbnRyaW5zaWNIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbURyYXdhYmxlc1twb3NdID0gcHJldmlvdXNEcmF3YWJsZTsKKyAgICAgICAgICAgICAgICAgICAgbU1pcG1hcEhlaWdodHNbcG9zXSA9IHByZXZpb3VzSW50cmluc2ljSGVpZ2h0OworCisgICAgICAgICAgICAgICAgICAgIG1EcmF3YWJsZXNbcG9zLTFdID0gZHJhd2FibGU7CisgICAgICAgICAgICAgICAgICAgIG1NaXBtYXBIZWlnaHRzW3Bvcy0xXSA9IGRyYXdhYmxlSGVpZ2h0OworICAgICAgICAgICAgICAgICAgICBwb3MtLTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSW50cmluc2ljIHNpemVzIGFyZSB0aG9zZSBvZiB0aGUgbGFyZ2VzdCBhdmFpbGFibGUgbWlwbWFwLgorICAgICAgICAgKiBNaW5pbXVtIHNpemVzIGFyZSB0aG9zZSBvZiB0aGUgc21hbGxlc3QgYXZhaWxhYmxlIG1pcG1hcC4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlQ29uc3RhbnRTaXplKCkgeworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgICAgICBpZiAoTiA+IDApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBzbWFsbGVzdERyYXdhYmxlID0gbURyYXdhYmxlc1swXTsKKyAgICAgICAgICAgICAgICBtQ29uc3RhbnRNaW5pbXVtV2lkdGggPSBzbWFsbGVzdERyYXdhYmxlLmdldE1pbmltdW1XaWR0aCgpOworICAgICAgICAgICAgICAgIG1Db25zdGFudE1pbmltdW1IZWlnaHQgPSBzbWFsbGVzdERyYXdhYmxlLmdldE1pbmltdW1IZWlnaHQoKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGxhcmdlc3REcmF3YWJsZSA9IG1EcmF3YWJsZXNbTi0xXTsKKyAgICAgICAgICAgICAgICBtQ29uc3RhbnRXaWR0aCA9IGxhcmdlc3REcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpOworICAgICAgICAgICAgICAgIG1Db25zdGFudEhlaWdodCA9IGxhcmdlc3REcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUNvbnN0YW50V2lkdGggPSBtQ29uc3RhbnRIZWlnaHQgPSAtMTsKKyAgICAgICAgICAgICAgICBtQ29uc3RhbnRNaW5pbXVtV2lkdGggPSBtQ29uc3RhbnRNaW5pbXVtSGVpZ2h0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db21wdXRlZENvbnN0YW50U2l6ZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIERyYXdhYmxlIG5ld0RyYXdhYmxlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNaXBtYXBEcmF3YWJsZSh0aGlzLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRHJhd2FibGUgbmV3RHJhd2FibGUoUmVzb3VyY2VzIHJlcykgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNaXBtYXBEcmF3YWJsZSh0aGlzLCByZXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGdyb3dBcnJheShpbnQgb2xkU2l6ZSwgaW50IG5ld1NpemUpIHsKKyAgICAgICAgICAgIHN1cGVyLmdyb3dBcnJheShvbGRTaXplLCBuZXdTaXplKTsKKyAgICAgICAgICAgIGludFtdIG5ld0ludHMgPSBuZXcgaW50W25ld1NpemVdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtTWlwbWFwSGVpZ2h0cywgMCwgbmV3SW50cywgMCwgb2xkU2l6ZSk7CisgICAgICAgICAgICBtTWlwbWFwSGVpZ2h0cyA9IG5ld0ludHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIE1pcG1hcERyYXdhYmxlKE1pcG1hcENvbnRhaW5lclN0YXRlIHN0YXRlLCBSZXNvdXJjZXMgcmVzKSB7CisgICAgICAgIE1pcG1hcENvbnRhaW5lclN0YXRlIGFzID0gbmV3IE1pcG1hcENvbnRhaW5lclN0YXRlKHN0YXRlLCB0aGlzLCByZXMpOworICAgICAgICBtTWlwbWFwQ29udGFpbmVyU3RhdGUgPSBhczsKKyAgICAgICAgc2V0Q29uc3RhbnRTdGF0ZShhcyk7CisgICAgICAgIG9uRHJhd2FibGVBZGRlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9OaW5lUGF0Y2hEcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL05pbmVQYXRjaERyYXdhYmxlLmphdmEKaW5kZXggMDA0MTZkOC4uMjNlZmNkMSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL05pbmVQYXRjaERyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL05pbmVQYXRjaERyYXdhYmxlLmphdmEKQEAgLTE3NywxNiArMTc3LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICAvLyBvdmVycmlkZXMKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgIGZsb2F0W10gcHRzID0gbmV3IGZsb2F0WzJdOwotICAgICAgICAgICAgY2FudmFzLmdldE1hdHJpeCgpLm1hcFBvaW50cyhwdHMpOwotICAgICAgICAgICAgTG9nLnYoIjlwYXRjaCIsICJEcmF3aW5nIDktcGF0Y2ggQCAiICsgcHRzWzBdICsgIiwiICsgcHRzWzFdICsgIjogIiArIGdldEJvdW5kcygpKTsKLSAgICAgICAgfQogICAgICAgICBtTmluZVBhdGNoLmRyYXcoY2FudmFzLCBnZXRCb3VuZHMoKSwgbVBhaW50KTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9zaGFwZXMvUm91bmRSZWN0U2hhcGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9zaGFwZXMvUm91bmRSZWN0U2hhcGUuamF2YQppbmRleCBmNGNmMTVjLi5iNDY5ZDJhIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvc2hhcGVzL1JvdW5kUmVjdFNoYXBlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL3NoYXBlcy9Sb3VuZFJlY3RTaGFwZS5qYXZhCkBAIC01NywxMyArNTcsMTEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgUm91bmRSZWN0U2hhcGUoZmxvYXRbXSBvdXRlclJhZGlpLCBSZWN0RiBpbnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRbXSBpbm5lclJhZGlpKSB7Ci0gICAgICAgIGlmIChvdXRlclJhZGlpLmxlbmd0aCA8IDgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dGVyIHJhZGlpIG11c3QgaGF2ZSA+PSA4IHZhbHVlcyIpOworICAgICAgICBpZiAob3V0ZXJSYWRpaSAhPSBudWxsICYmIG91dGVyUmFkaWkubGVuZ3RoIDwgOCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigib3V0ZXIgcmFkaWkgbXVzdCBoYXZlID49IDggdmFsdWVzIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlubmVyUmFkaWkgIT0gbnVsbCAmJiBpbm5lclJhZGlpLmxlbmd0aCA8IDgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlubmVyIHJhZGlpIG11c3QgaGF2ZSA+PSA4IHZhbHVlcyIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiaW5uZXIgcmFkaWkgbXVzdCBoYXZlID49IDggdmFsdWVzIik7CiAgICAgICAgIH0KICAgICAgICAgbU91dGVyUmFkaWkgPSBvdXRlclJhZGlpOwogICAgICAgICBtSW5zZXQgPSBpbnNldDsKQEAgLTk3LDggKzk1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIucmlnaHQgLSBtSW5zZXQucmlnaHQsIHIuYm90dG9tIC0gbUluc2V0LmJvdHRvbSk7CiAgICAgICAgICAgICBpZiAobUlubmVyUmVjdC53aWR0aCgpIDwgdyAmJiBtSW5uZXJSZWN0LmhlaWdodCgpIDwgaCkgewogICAgICAgICAgICAgICAgIGlmIChtSW5uZXJSYWRpaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QYXRoLmFkZFJvdW5kUmVjdChtSW5uZXJSZWN0LCBtSW5uZXJSYWRpaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGguRGlyZWN0aW9uLkNDVyk7CisgICAgICAgICAgICAgICAgICAgIG1QYXRoLmFkZFJvdW5kUmVjdChtSW5uZXJSZWN0LCBtSW5uZXJSYWRpaSwgUGF0aC5EaXJlY3Rpb24uQ0NXKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtUGF0aC5hZGRSZWN0KG1Jbm5lclJlY3QsIFBhdGguRGlyZWN0aW9uLkNDVyk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTA5LDggKzEwNiw4IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFJvdW5kUmVjdFNoYXBlIGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKICAgICAgICAgUm91bmRSZWN0U2hhcGUgc2hhcGUgPSAoUm91bmRSZWN0U2hhcGUpIHN1cGVyLmNsb25lKCk7Ci0gICAgICAgIHNoYXBlLm1PdXRlclJhZGlpID0gbU91dGVyUmFkaWkuY2xvbmUoKTsKLSAgICAgICAgc2hhcGUubUlubmVyUmFkaWkgPSBtSW5uZXJSYWRpaS5jbG9uZSgpOworICAgICAgICBzaGFwZS5tT3V0ZXJSYWRpaSA9IG1PdXRlclJhZGlpICE9IG51bGwgPyBtT3V0ZXJSYWRpaS5jbG9uZSgpIDogbnVsbDsKKyAgICAgICAgc2hhcGUubUlubmVyUmFkaWkgPSBtSW5uZXJSYWRpaSAhPSBudWxsID8gbUlubmVyUmFkaWkuY2xvbmUoKSA6IG51bGw7CiAgICAgICAgIHNoYXBlLm1JbnNldCA9IG5ldyBSZWN0RihtSW5zZXQpOwogICAgICAgICBzaGFwZS5tSW5uZXJSZWN0ID0gbmV3IFJlY3RGKG1Jbm5lclJlY3QpOwogICAgICAgICBzaGFwZS5tUGF0aCA9IG5ldyBQYXRoKG1QYXRoKTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQWxsb2NhdGlvbi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9BbGxvY2F0aW9uLmphdmEKaW5kZXggYjI3YzdmNS4uMmMwNzZiMyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9BbGxvY2F0aW9uLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9BbGxvY2F0aW9uLmphdmEKQEAgLTM1LDExICszNSwyNSBAQAogICAgIEJpdG1hcCBtQml0bWFwOwogCiAgICAgQWxsb2NhdGlvbihpbnQgaWQsIFJlbmRlclNjcmlwdCBycywgVHlwZSB0KSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgICAgIG1UeXBlID0gdDsKICAgICB9CiAKKyAgICBBbGxvY2F0aW9uKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCB1cGRhdGVGcm9tTmF0aXZlKCkgeworICAgICAgICBtUlMudmFsaWRhdGUoKTsKKyAgICAgICAgbU5hbWUgPSBtUlMubkdldE5hbWUobUlEKTsKKyAgICAgICAgaW50IHR5cGVJRCA9IG1SUy5uQWxsb2NhdGlvbkdldFR5cGUobUlEKTsKKyAgICAgICAgaWYodHlwZUlEICE9IDApIHsKKyAgICAgICAgICAgIG1UeXBlID0gbmV3IFR5cGUodHlwZUlELCBtUlMpOworICAgICAgICAgICAgbVR5cGUudXBkYXRlRnJvbU5hdGl2ZSgpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKICAgICAgICAgcmV0dXJuIG1UeXBlOwogICAgIH0KQEAgLTc2LDEwICs5MCw1MCBAQAogICAgICAgICBzdWJEYXRhMUQoMCwgbVR5cGUuZ2V0RWxlbWVudENvdW50KCksIGQpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHN1YkRhdGEoaW50IHhvZmYsIEZpZWxkUGFja2VyIGZwKSB7CisgICAgICAgIGludCBlU2l6ZSA9IG1UeXBlLm1FbGVtZW50LmdldFNpemVCeXRlcygpOworICAgICAgICBmaW5hbCBieXRlW10gZGF0YSA9IGZwLmdldERhdGEoKTsKKworICAgICAgICBpbnQgY291bnQgPSBkYXRhLmxlbmd0aCAvIGVTaXplOworICAgICAgICBpZiAoKGVTaXplICogY291bnQpICE9IGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCBwYWNrZXIgbGVuZ3RoICIgKyBkYXRhLmxlbmd0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbm90IGRpdmlzaWJsZSBieSBlbGVtZW50IHNpemUgIiArIGVTaXplICsgIi4iKTsKKyAgICAgICAgfQorICAgICAgICBkYXRhMURDaGVja3MoeG9mZiwgY291bnQsIGRhdGEubGVuZ3RoLCBkYXRhLmxlbmd0aCk7CisgICAgICAgIG1SUy5uQWxsb2NhdGlvblN1YkRhdGExRChtSUQsIHhvZmYsIGNvdW50LCBkYXRhLCBkYXRhLmxlbmd0aCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzdWJFbGVtZW50RGF0YShpbnQgeG9mZiwgaW50IGNvbXBvbmVudF9udW1iZXIsIEZpZWxkUGFja2VyIGZwKSB7CisgICAgICAgIGlmIChjb21wb25lbnRfbnVtYmVyID49IG1UeXBlLm1FbGVtZW50Lm1FbGVtZW50cy5sZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbXBvbmVudF9udW1iZXIgIiArIGNvbXBvbmVudF9udW1iZXIgKyAiIG91dCBvZiByYW5nZS4iKTsKKyAgICAgICAgfQorICAgICAgICBpZih4b2ZmIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT2Zmc2V0IG11c3QgYmUgPj0gMC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGJ5dGVbXSBkYXRhID0gZnAuZ2V0RGF0YSgpOworICAgICAgICBpbnQgZVNpemUgPSBtVHlwZS5tRWxlbWVudC5tRWxlbWVudHNbY29tcG9uZW50X251bWJlcl0uZ2V0U2l6ZUJ5dGVzKCk7CisKKyAgICAgICAgaWYgKGRhdGEubGVuZ3RoICE9IGVTaXplKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCBwYWNrZXIgc2l6ZWxlbmd0aCAiICsgZGF0YS5sZW5ndGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IG1hdGNoIGNvbXBvbmVudCBzaXplICIgKyBlU2l6ZSArICIuIik7CisgICAgICAgIH0KKworICAgICAgICBtUlMubkFsbG9jYXRpb25TdWJFbGVtZW50RGF0YTFEKG1JRCwgeG9mZiwgY29tcG9uZW50X251bWJlciwgZGF0YSwgZGF0YS5sZW5ndGgpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBkYXRhMURDaGVja3MoaW50IG9mZiwgaW50IGNvdW50LCBpbnQgbGVuLCBpbnQgZGF0YVNpemUpIHsKICAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIGlmKChvZmYgPCAwKSB8fCAoY291bnQgPCAxKSB8fCAoKG9mZiArIGNvdW50KSA+IG1UeXBlLmdldEVsZW1lbnRDb3VudCgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT2Zmc2V0IG9yIENvdW50IG91dCBvZiBib3VuZHMuIik7CisgICAgICAgIGlmKG9mZiA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9mZnNldCBtdXN0IGJlID49IDAuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYoY291bnQgPCAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb3VudCBtdXN0IGJlID49IDEuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYoKG9mZiArIGNvdW50KSA+IG1UeXBlLmdldEVsZW1lbnRDb3VudCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPdmVyZmxvdywgQXZhaWxhYmxlIGNvdW50ICIgKyBtVHlwZS5nZXRFbGVtZW50Q291bnQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGdvdCAiICsgY291bnQgKyAiIGF0IG9mZnNldCAiICsgb2ZmICsgIi4iKTsKICAgICAgICAgfQogICAgICAgICBpZigobGVuKSA8IGRhdGFTaXplKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBcnJheSB0b28gc21hbGwgZm9yIGFsbG9jYXRpb24gdHlwZS4iKTsKQEAgLTEwOCw3ICsxNjIsNiBAQAogICAgIH0KIAogCi0KICAgICBwdWJsaWMgdm9pZCBzdWJEYXRhMkQoaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGludFtdIGQpIHsKICAgICAgICAgbVJTLnZhbGlkYXRlKCk7CiAgICAgICAgIG1SUy5uQWxsb2NhdGlvblN1YkRhdGEyRChtSUQsIHhvZmYsIHlvZmYsIHcsIGgsIGQsIGQubGVuZ3RoICogNCk7CkBAIC0xMjksMjUgKzE4MiwyOCBAQAogICAgICAgICBtUlMubkFsbG9jYXRpb25SZWFkKG1JRCwgZCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgZGF0YShPYmplY3QgbykgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5BbGxvY2F0aW9uU3ViRGF0YUZyb21PYmplY3QobUlELCBtVHlwZSwgMCwgbyk7CisgICAgcHVibGljIHZvaWQgcmVzaXplKGludCBkaW1YKSB7CisgICAgICAgIGlmICgobVR5cGUuZ2V0WSgpID4gMCl8fCAobVR5cGUuZ2V0WigpID4gMCkgfHwgbVR5cGUuZ2V0RmFjZXMoKSB8fCBtVHlwZS5nZXRMT0QoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVzaXplIG9ubHkgc3VwcG9ydCBmb3IgMUQgYWxsb2NhdGlvbnMgYXQgdGhpcyB0aW1lLiIpOworICAgICAgICB9CisgICAgICAgIG1SUy5uQWxsb2NhdGlvblJlc2l6ZTFEKG1JRCwgZGltWCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgcmVhZChPYmplY3QgbykgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5BbGxvY2F0aW9uU3ViUmVhZEZyb21PYmplY3QobUlELCBtVHlwZSwgMCwgbyk7CisgICAgLyoKKyAgICBwdWJsaWMgdm9pZCByZXNpemUoaW50IGRpbVgsIGludCBkaW1ZKSB7CisgICAgICAgIGlmICgobVR5cGUuZ2V0WigpID4gMCkgfHwgbVR5cGUuZ2V0RmFjZXMoKSB8fCBtVHlwZS5nZXRMT0QoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVzaXplIG9ubHkgc3VwcG9ydCBmb3IgMkQgYWxsb2NhdGlvbnMgYXQgdGhpcyB0aW1lLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChtVHlwZS5nZXRZKCkgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVzaXplIG9ubHkgc3VwcG9ydCBmb3IgMkQgYWxsb2NhdGlvbnMgYXQgdGhpcyB0aW1lLiIpOworICAgICAgICB9CisgICAgICAgIG1SUy5uQWxsb2NhdGlvblJlc2l6ZTJEKG1JRCwgZGltWCwgZGltWSk7CiAgICAgfQotCi0gICAgcHVibGljIHZvaWQgc3ViRGF0YShpbnQgb2Zmc2V0LCBPYmplY3QgbykgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5BbGxvY2F0aW9uU3ViRGF0YUZyb21PYmplY3QobUlELCBtVHlwZSwgb2Zmc2V0LCBvKTsKLSAgICB9CisgICAgKi8KIAogICAgIHB1YmxpYyBjbGFzcyBBZGFwdGVyMUQgZXh0ZW5kcyBCYXNlT2JqIHsKICAgICAgICAgQWRhcHRlcjFEKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgICAgICBzdXBlcihycyk7Ci0gICAgICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50KERpbWVuc2lvbiBkaW0sIGludCB2YWx1ZSkgewpAQCAtMTg5LDggKzI0NSw3IEBACiAKICAgICBwdWJsaWMgY2xhc3MgQWRhcHRlcjJEIGV4dGVuZHMgQmFzZU9iaiB7CiAgICAgICAgIEFkYXB0ZXIyRChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgewotICAgICAgICAgICAgc3VwZXIocnMpOwotICAgICAgICAgICAgbUlEID0gaWQ7CisgICAgICAgICAgICBzdXBlcihpZCwgcnMpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgc2V0Q29uc3RyYWludChEaW1lbnNpb24gZGltLCBpbnQgdmFsdWUpIHsKQEAgLTM3Nyw2ICs0MzIsMjEgQEAKICAgICAgICAgQml0bWFwIGIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKHJlcywgaWQsIG1CaXRtYXBPcHRpb25zKTsKICAgICAgICAgcmV0dXJuIGNyZWF0ZUZyb21CaXRtYXBCb3hlZChycywgYiwgZHN0Rm10LCBnZW5NaXBzKTsKICAgICB9CisKKyAgICBzdGF0aWMgcHVibGljIEFsbG9jYXRpb24gY3JlYXRlRnJvbVN0cmluZyhSZW5kZXJTY3JpcHQgcnMsIFN0cmluZyBzdHIpCisgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBieXRlW10gYWxsb2NBcnJheSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhbGxvY0FycmF5ID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOworICAgICAgICAgICAgQWxsb2NhdGlvbiBhbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQocnMsIEVsZW1lbnQuVTgocnMpLCBhbGxvY0FycmF5Lmxlbmd0aCk7CisgICAgICAgICAgICBhbGxvYy5kYXRhKGFsbG9jQXJyYXkpOworICAgICAgICAgICAgcmV0dXJuIGFsbG9jOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoInJzIiwgImNvdWxkIG5vdCBjb252ZXJ0IHN0cmluZyB0byB1dGYtOCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIH0KIAogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Jhc2VPYmouamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQmFzZU9iai5qYXZhCmluZGV4IDAwMmZjNzguLjcxNWUzZmIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQmFzZU9iai5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQmFzZU9iai5qYXZhCkBAIC0yNCwxNCArMjQsMTcgQEAKICAqKi8KIGNsYXNzIEJhc2VPYmogewogCi0gICAgQmFzZU9iaihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICBCYXNlT2JqKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7CiAgICAgICAgIHJzLnZhbGlkYXRlKCk7CiAgICAgICAgIG1SUyA9IHJzOwotICAgICAgICBtSUQgPSAwOworICAgICAgICBtSUQgPSBpZDsKICAgICAgICAgbURlc3Ryb3llZCA9IGZhbHNlOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0SUQoKSB7CisgICAgICAgIGlmIChtRGVzdHJveWVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1c2luZyBhIGRlc3Ryb3llZCBvYmplY3QuIik7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG1JRDsKICAgICB9CiAKQEAgLTYyLDcgKzY1LDcgQEAKICAgICB7CiAgICAgICAgIGlmICghbURlc3Ryb3llZCkgewogICAgICAgICAgICAgaWYobUlEICE9IDAgJiYgbVJTLmlzQWxpdmUoKSkgewotICAgICAgICAgICAgICAgIG1SUy5uT2JqRGVzdHJveU9PQihtSUQpOworICAgICAgICAgICAgICAgIG1SUy5uT2JqRGVzdHJveShtSUQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVJTID0gbnVsbDsKICAgICAgICAgICAgIG1JRCA9IDA7CkBAIC04MSw1ICs4NCwxMCBAQAogICAgICAgICBtUlMubk9iakRlc3Ryb3kobUlEKTsKICAgICB9CiAKKyAgICAvLyBJZiBhbiBvYmplY3QgY2FtZSBmcm9tIGFuIGEzZCBmaWxlLCBqYXZhIGZpZWxkcyBuZWVkIHRvIGJlCisgICAgLy8gY3JlYXRlZCB3aXRoIG9iamVjdHMgZnJvbSB0aGUgbmF0aXZlIGxheWVyCisgICAgdm9pZCB1cGRhdGVGcm9tTmF0aXZlKCkgeworICAgIH0KKwogfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGUyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGUyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjZjg4YwotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBCeXRlMiB7CisgICAgcHVibGljIEJ5dGUyKCkgeworICAgIH0KKworICAgIHB1YmxpYyBieXRlIHg7CisgICAgcHVibGljIGJ5dGUgeTsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlMy5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YzBjYTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGUzLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgQnl0ZTMgeworICAgIHB1YmxpYyBCeXRlMygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSB4OworICAgIHB1YmxpYyBieXRlIHk7CisgICAgcHVibGljIGJ5dGUgejsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlNC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlNC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YmZjNjEKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGU0LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgQnl0ZTQgeworICAgIHB1YmxpYyBCeXRlNCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSB4OworICAgIHB1YmxpYyBieXRlIHk7CisgICAgcHVibGljIGJ5dGUgejsKKyAgICBwdWJsaWMgYnl0ZSB3OworfQorCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9FbGVtZW50LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0VsZW1lbnQuamF2YQppbmRleCAxMGVmMDVhLi45MTgyNGU2IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0VsZW1lbnQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0VsZW1lbnQuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIC8qKgogICogQGhpZGUKQEAgLTI2LDYgKzI3LDcgQEAKICAgICBpbnQgbVNpemU7CiAgICAgRWxlbWVudFtdIG1FbGVtZW50czsKICAgICBTdHJpbmdbXSBtRWxlbWVudE5hbWVzOworICAgIGludFtdIG1BcnJheVNpemVzOwogCiAgICAgRGF0YVR5cGUgbVR5cGU7CiAgICAgRGF0YUtpbmQgbUtpbmQ7CkBAIC0zNywzMCArMzksMzYgQEAKICAgICBwdWJsaWMgZW51bSBEYXRhVHlwZSB7CiAgICAgICAgIC8vRkxPQVRfMTYgKDEsIDIpLAogICAgICAgICBGTE9BVF8zMiAoMiwgNCksCi0gICAgICAgIC8vRkxPQVRfNjQgKDMsIDgpLAorICAgICAgICBGTE9BVF82NCAoMywgOCksCiAgICAgICAgIFNJR05FRF84ICg0LCAxKSwKICAgICAgICAgU0lHTkVEXzE2ICg1LCAyKSwKICAgICAgICAgU0lHTkVEXzMyICg2LCA0KSwKLSAgICAgICAgLy9TSUdORURfNjQgKDcsIDgpLAorICAgICAgICBTSUdORURfNjQgKDcsIDgpLAogICAgICAgICBVTlNJR05FRF84ICg4LCAxKSwKICAgICAgICAgVU5TSUdORURfMTYgKDksIDIpLAogICAgICAgICBVTlNJR05FRF8zMiAoMTAsIDQpLAogICAgICAgICAvL1VOU0lHTkVEXzY0ICgxMSwgOCksCiAKLSAgICAgICAgVU5TSUdORURfNV82XzUgKDEyLCAyKSwKLSAgICAgICAgVU5TSUdORURfNV81XzVfMSAoMTMsIDIpLAotICAgICAgICBVTlNJR05FRF80XzRfNF80ICgxNCwgMiksCisgICAgICAgIEJPT0xFQU4oMTIsIDEpLAogCi0gICAgICAgIFJTX0VMRU1FTlQgKDE1LCA0KSwKLSAgICAgICAgUlNfVFlQRSAoMTYsIDQpLAotICAgICAgICBSU19BTExPQ0FUSU9OICgxNywgNCksCi0gICAgICAgIFJTX1NBTVBMRVIgKDE4LCA0KSwKLSAgICAgICAgUlNfU0NSSVBUICgxOSwgNCksCi0gICAgICAgIFJTX01FU0ggKDIwLCA0KSwKLSAgICAgICAgUlNfUFJPR1JBTV9GUkFHTUVOVCAoMjEsIDQpLAotICAgICAgICBSU19QUk9HUkFNX1ZFUlRFWCAoMjIsIDQpLAotICAgICAgICBSU19QUk9HUkFNX1JBU1RFUiAoMjMsIDQpLAotICAgICAgICBSU19QUk9HUkFNX1NUT1JFICgyNCwgNCk7CisgICAgICAgIFVOU0lHTkVEXzVfNl81ICgxMywgMiksCisgICAgICAgIFVOU0lHTkVEXzVfNV81XzEgKDE0LCAyKSwKKyAgICAgICAgVU5TSUdORURfNF80XzRfNCAoMTUsIDIpLAorCisgICAgICAgIE1BVFJJWF80WDQgKDE2LCA2NCksCisgICAgICAgIE1BVFJJWF8zWDMgKDE3LCAzNiksCisgICAgICAgIE1BVFJJWF8yWDIgKDE4LCAxNiksCisKKyAgICAgICAgUlNfRUxFTUVOVCAoMTAwMCwgNCksCisgICAgICAgIFJTX1RZUEUgKDEwMDEsIDQpLAorICAgICAgICBSU19BTExPQ0FUSU9OICgxMDAyLCA0KSwKKyAgICAgICAgUlNfU0FNUExFUiAoMTAwMywgNCksCisgICAgICAgIFJTX1NDUklQVCAoMTAwNCwgNCksCisgICAgICAgIFJTX01FU0ggKDEwMDUsIDQpLAorICAgICAgICBSU19QUk9HUkFNX0ZSQUdNRU5UICgxMDA2LCA0KSwKKyAgICAgICAgUlNfUFJPR1JBTV9WRVJURVggKDEwMDcsIDQpLAorICAgICAgICBSU19QUk9HUkFNX1JBU1RFUiAoMTAwOCwgNCksCisgICAgICAgIFJTX1BST0dSQU1fU1RPUkUgKDEwMDksIDQpOwogCiAgICAgICAgIGludCBtSUQ7CiAgICAgICAgIGludCBtU2l6ZTsKQEAgLTcyLDEyICs4MCw2IEBACiAKICAgICBwdWJsaWMgZW51bSBEYXRhS2luZCB7CiAgICAgICAgIFVTRVIgKDApLAotICAgICAgICBDT0xPUiAoMSksCi0gICAgICAgIFBPU0lUSU9OICgyKSwKLSAgICAgICAgVEVYVFVSRSAoMyksCi0gICAgICAgIE5PUk1BTCAoNCksCi0gICAgICAgIElOREVYICg1KSwKLSAgICAgICAgUE9JTlRfU0laRSg2KSwKIAogICAgICAgICBQSVhFTF9MICg3KSwKICAgICAgICAgUElYRUxfQSAoOCksCkBAIC05MSw0MSArOTMsMTQ3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVVNFUl9VOChSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfVVNFUl9VOCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9VU0VSX1U4ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuVU5TSUdORURfOCk7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEJPT0xFQU4oUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0JPT0xFQU4gPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfQk9PTEVBTiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLkJPT0xFQU4pOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VU0VSX1U4OworICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfQk9PTEVBTjsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVVNFUl9JOChSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfVVNFUl9JOCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9VU0VSX0k4ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzgpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBVOChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfVTggPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfVTggPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5VTlNJR05FRF84KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVVNFUl9JODsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1U4OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBVU0VSX1UzMihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfVVNFUl9VMzIgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfVVNFUl9VMzIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5VTlNJR05FRF8zMik7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEk4KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9JOCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9JOCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF84KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVVNFUl9VMzI7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9JODsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVVNFUl9JMzIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1VTRVJfSTMyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1VTRVJfSTMyID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzMyKTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVTE2KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9VMTYgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfVTE2ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuVU5TSUdORURfMTYpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VU0VSX0kzMjsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1UxNjsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVVNFUl9GMzIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1VTRVJfRjMyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1VTRVJfRjMyID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuRkxPQVRfMzIpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBJMTYoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0kxNiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9JMTYgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5TSUdORURfMTYpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VU0VSX0YzMjsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0kxNjsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVTMyKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9VMzIgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfVTMyID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuVU5TSUdORURfMzIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VMzI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEkzMihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfSTMyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0kzMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF8zMik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0kzMjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgSTY0KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9JNjQgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfSTY0ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzY0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfSTY0OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBGMzIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0YzMiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9GMzIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5GTE9BVF8zMik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0YzMjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgRjY0KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9GNjQgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfRjY0ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuRkxPQVRfNjQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9GNjQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEVMRU1FTlQoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0VMRU1FTlQgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfRUxFTUVOVCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX0VMRU1FTlQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9FTEVNRU5UOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBUWVBFKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9UWVBFID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1RZUEUgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19UWVBFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVFlQRTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgQUxMT0NBVElPTihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfQUxMT0NBVElPTiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9BTExPQ0FUSU9OID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfQUxMT0NBVElPTik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0FMTE9DQVRJT047CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFNBTVBMRVIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1NBTVBMRVIgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfU0FNUExFUiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX1NBTVBMRVIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9TQU1QTEVSOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBTQ1JJUFQoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1NDUklQVCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9TQ1JJUFQgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19TQ1JJUFQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9TQ1JJUFQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IE1FU0goUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X01FU0ggPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfTUVTSCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX01FU0gpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9NRVNIOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBQUk9HUkFNX0ZSQUdNRU5UKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9QUk9HUkFNX0ZSQUdNRU5UID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1BST0dSQU1fRlJBR01FTlQgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19QUk9HUkFNX0ZSQUdNRU5UKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUFJPR1JBTV9GUkFHTUVOVDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgUFJPR1JBTV9WRVJURVgoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1BST0dSQU1fVkVSVEVYID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1BST0dSQU1fVkVSVEVYID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfUFJPR1JBTV9WRVJURVgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9QUk9HUkFNX1ZFUlRFWDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgUFJPR1JBTV9SQVNURVIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1BST0dSQU1fUkFTVEVSID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1BST0dSQU1fUkFTVEVSID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfUFJPR1JBTV9SQVNURVIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9QUk9HUkFNX1JBU1RFUjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgUFJPR1JBTV9TVE9SRShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfUFJPR1JBTV9TVE9SRSA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9QUk9HUkFNX1NUT1JFID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfUFJPR1JBTV9TVE9SRSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1BST0dSQU1fU1RPUkU7CisgICAgfQorCisKICAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgQV84KFJlbmRlclNjcmlwdCBycykgewogICAgICAgICBpZihycy5tRWxlbWVudF9BXzggPT0gbnVsbCkgewogICAgICAgICAgICAgcnMubUVsZW1lbnRfQV84ID0gY3JlYXRlUGl4ZWwocnMsIERhdGFUeXBlLlVOU0lHTkVEXzgsIERhdGFLaW5kLlBJWEVMX0EpOwpAQCAtMTY4LDE2OCArMjc2LDE0MSBAQAogICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUkdCQV84ODg4OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBJTkRFWF8xNihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfSU5ERVhfMTYgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfSU5ERVhfMTYgPSBjcmVhdGVJbmRleChycyk7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEYzMl8yKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9GTE9BVF8yID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0ZMT0FUXzIgPSBjcmVhdGVWZWN0b3IocnMsIERhdGFUeXBlLkZMT0FUXzMyLCAyKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfSU5ERVhfMTY7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9GTE9BVF8yOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBVFRSSUJfUE9TSVRJT05fMihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfUE9TSVRJT05fMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9QT1NJVElPTl8yID0gY3JlYXRlQXR0cmliKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgRGF0YUtpbmQuUE9TSVRJT04sIDIpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBGMzJfMyhSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfRkxPQVRfMyA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9GTE9BVF8zID0gY3JlYXRlVmVjdG9yKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgMyk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1BPU0lUSU9OXzI7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9GTE9BVF8zOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBVFRSSUJfUE9TSVRJT05fMyhSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfUE9TSVRJT05fMyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9QT1NJVElPTl8zID0gY3JlYXRlQXR0cmliKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgRGF0YUtpbmQuUE9TSVRJT04sIDMpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBGMzJfNChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfRkxPQVRfNCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9GTE9BVF80ID0gY3JlYXRlVmVjdG9yKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgNCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1BPU0lUSU9OXzM7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9GTE9BVF80OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBVFRSSUJfVEVYVFVSRV8yKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9URVhUVVJFXzIgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfVEVYVFVSRV8yID0gY3JlYXRlQXR0cmliKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgRGF0YUtpbmQuVEVYVFVSRSwgMik7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFU4XzQoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1VDSEFSXzQgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfVUNIQVJfNCA9IGNyZWF0ZVZlY3RvcihycywgRGF0YVR5cGUuVU5TSUdORURfOCwgNCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1RFWFRVUkVfMjsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1VDSEFSXzQ7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9OT1JNQUxfMyhSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfTk9STUFMXzMgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfTk9STUFMXzMgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLkZMT0FUXzMyLCBEYXRhS2luZC5OT1JNQUwsIDMpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBNQVRSSVhfNFg0KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9NQVRSSVhfNFg0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X01BVFJJWF80WDQgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5NQVRSSVhfNFg0KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfTk9STUFMXzM7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9NQVRSSVhfNFg0OworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgTUFUUklYNFg0KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICByZXR1cm4gTUFUUklYXzRYNChycyk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9DT0xPUl9VOF80KFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9DT0xPUl9VOF80ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X0NPTE9SX1U4XzQgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLlVOU0lHTkVEXzgsIERhdGFLaW5kLkNPTE9SLCA0KTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgTUFUUklYXzNYMyhSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfTUFUUklYXzNYMyA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9NQVRSSVhfM1gzID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuTUFUUklYXzNYMyk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0NPTE9SX1U4XzQ7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9NQVRSSVhfNFg0OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBVFRSSUJfQ09MT1JfRjMyXzQoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X0NPTE9SX0YzMl80ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X0NPTE9SX0YzMl80ID0gY3JlYXRlQXR0cmliKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiwgRGF0YUtpbmQuQ09MT1IsIDQpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBNQVRSSVhfMlgyKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9NQVRSSVhfMlgyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X01BVFJJWF8yWDIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5NQVRSSVhfMlgyKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfQ09MT1JfRjMyXzQ7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9NQVRSSVhfMlgyOwogICAgIH0KIAotICAgIEVsZW1lbnQoUmVuZGVyU2NyaXB0IHJzLCBFbGVtZW50W10gZSwgU3RyaW5nW10gbikgewotICAgICAgICBzdXBlcihycyk7CisgICAgRWxlbWVudChpbnQgaWQsIFJlbmRlclNjcmlwdCBycywgRWxlbWVudFtdIGUsIFN0cmluZ1tdIG4sIGludFtdIGFzKSB7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgICAgIG1TaXplID0gMDsKICAgICAgICAgbUVsZW1lbnRzID0gZTsKICAgICAgICAgbUVsZW1lbnROYW1lcyA9IG47Ci0gICAgICAgIGludFtdIGlkcyA9IG5ldyBpbnRbbUVsZW1lbnRzLmxlbmd0aF07CisgICAgICAgIG1BcnJheVNpemVzID0gYXM7CiAgICAgICAgIGZvciAoaW50IGN0ID0gMDsgY3QgPCBtRWxlbWVudHMubGVuZ3RoOyBjdCsrICkgewogICAgICAgICAgICAgbVNpemUgKz0gbUVsZW1lbnRzW2N0XS5tU2l6ZTsKLSAgICAgICAgICAgIGlkc1tjdF0gPSBtRWxlbWVudHNbY3RdLm1JRDsKICAgICAgICAgfQotICAgICAgICBtSUQgPSBycy5uRWxlbWVudENyZWF0ZTIoaWRzLCBtRWxlbWVudE5hbWVzKTsKICAgICB9CiAKLSAgICBFbGVtZW50KFJlbmRlclNjcmlwdCBycywgRGF0YVR5cGUgZHQsIERhdGFLaW5kIGRrLCBib29sZWFuIG5vcm0sIGludCBzaXplKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKKyAgICBFbGVtZW50KGludCBpZCwgUmVuZGVyU2NyaXB0IHJzLCBEYXRhVHlwZSBkdCwgRGF0YUtpbmQgZGssIGJvb2xlYW4gbm9ybSwgaW50IHNpemUpIHsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICAgICAgbVNpemUgPSBkdC5tU2l6ZSAqIHNpemU7CiAgICAgICAgIG1UeXBlID0gZHQ7CiAgICAgICAgIG1LaW5kID0gZGs7CiAgICAgICAgIG1Ob3JtYWxpemVkID0gbm9ybTsKICAgICAgICAgbVZlY3RvclNpemUgPSBzaXplOwotICAgICAgICBtSUQgPSBycy5uRWxlbWVudENyZWF0ZShkdC5tSUQsIGRrLm1JRCwgbm9ybSwgc2l6ZSk7CisgICAgfQorCisgICAgRWxlbWVudChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBzdXBlcihpZCwgcnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgdXBkYXRlRnJvbU5hdGl2ZSgpIHsKKworICAgICAgICAvLyB3ZSB3aWxsIHBhY2sgbVR5cGU7IG1LaW5kOyBtTm9ybWFsaXplZDsgbVZlY3RvclNpemU7IE51bVN1YkVsZW1lbnRzCisgICAgICAgIGludFtdIGRhdGFCdWZmZXIgPSBuZXcgaW50WzVdOworICAgICAgICBtUlMubkVsZW1lbnRHZXROYXRpdmVEYXRhKG1JRCwgZGF0YUJ1ZmZlcik7CisKKyAgICAgICAgbU5vcm1hbGl6ZWQgPSBkYXRhQnVmZmVyWzJdID09IDEgPyB0cnVlIDogZmFsc2U7CisgICAgICAgIG1WZWN0b3JTaXplID0gZGF0YUJ1ZmZlclszXTsKKyAgICAgICAgbVNpemUgPSAwOworICAgICAgICBmb3IgKERhdGFUeXBlIGR0OiBEYXRhVHlwZS52YWx1ZXMoKSkgeworICAgICAgICAgICAgaWYoZHQubUlEID09IGRhdGFCdWZmZXJbMF0peworICAgICAgICAgICAgICAgIG1UeXBlID0gZHQ7CisgICAgICAgICAgICAgICAgbVNpemUgPSBtVHlwZS5tU2l6ZSAqIG1WZWN0b3JTaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoRGF0YUtpbmQgZGs6IERhdGFLaW5kLnZhbHVlcygpKSB7CisgICAgICAgICAgICBpZihkay5tSUQgPT0gZGF0YUJ1ZmZlclsxXSl7CisgICAgICAgICAgICAgICAgbUtpbmQgPSBkazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCBudW1TdWJFbGVtZW50cyA9IGRhdGFCdWZmZXJbNF07CisgICAgICAgIGlmKG51bVN1YkVsZW1lbnRzID4gMCkgeworICAgICAgICAgICAgbUVsZW1lbnRzID0gbmV3IEVsZW1lbnRbbnVtU3ViRWxlbWVudHNdOworICAgICAgICAgICAgbUVsZW1lbnROYW1lcyA9IG5ldyBTdHJpbmdbbnVtU3ViRWxlbWVudHNdOworCisgICAgICAgICAgICBpbnRbXSBzdWJFbGVtZW50SWRzID0gbmV3IGludFtudW1TdWJFbGVtZW50c107CisgICAgICAgICAgICBtUlMubkVsZW1lbnRHZXRTdWJFbGVtZW50cyhtSUQsIHN1YkVsZW1lbnRJZHMsIG1FbGVtZW50TmFtZXMpOworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bVN1YkVsZW1lbnRzOyBpICsrKSB7CisgICAgICAgICAgICAgICAgbUVsZW1lbnRzW2ldID0gbmV3IEVsZW1lbnQoc3ViRWxlbWVudElkc1tpXSwgbVJTKTsKKyAgICAgICAgICAgICAgICBtRWxlbWVudHNbaV0udXBkYXRlRnJvbU5hdGl2ZSgpOworICAgICAgICAgICAgICAgIG1TaXplICs9IG1FbGVtZW50c1tpXS5tU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogICAgICAgICBzdXBlci5kZXN0cm95KCk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZUZyb21DbGFzcyhSZW5kZXJTY3JpcHQgcnMsIENsYXNzIGMpIHsKLSAgICAgICAgcnMudmFsaWRhdGUoKTsKLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjLmdldEZpZWxkcygpOwotICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7Ci0KLSAgICAgICAgZm9yKEZpZWxkIGY6IGZpZWxkcykgewotICAgICAgICAgICAgQ2xhc3MgZmMgPSBmLmdldFR5cGUoKTsKLSAgICAgICAgICAgIGlmKGZjID09IGludC5jbGFzcykgewotICAgICAgICAgICAgICAgIGIuYWRkKGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF8zMiksIGYuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBzaG9ydC5jbGFzcykgewotICAgICAgICAgICAgICAgIGIuYWRkKGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF8xNiksIGYuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBieXRlLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgYi5hZGQoY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzgpLCBmLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoZmMgPT0gZmxvYXQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICBiLmFkZChjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5GTE9BVF8zMiksIGYuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rb3duIGZpZWxkIHR5cGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYi5jcmVhdGUoKTsKLSAgICB9Ci0KLQogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZVVzZXIoUmVuZGVyU2NyaXB0IHJzLCBEYXRhVHlwZSBkdCkgewotICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQocnMsIGR0LCBEYXRhS2luZC5VU0VSLCBmYWxzZSwgMSk7CisgICAgICAgIERhdGFLaW5kIGRrID0gRGF0YUtpbmQuVVNFUjsKKyAgICAgICAgYm9vbGVhbiBub3JtID0gZmFsc2U7CisgICAgICAgIGludCB2ZWNTaXplID0gMTsKKyAgICAgICAgaW50IGlkID0gcnMubkVsZW1lbnRDcmVhdGUoZHQubUlELCBkay5tSUQsIG5vcm0sIHZlY1NpemUpOworICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQoaWQsIHJzLCBkdCwgZGssIG5vcm0sIHZlY1NpemUpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVWZWN0b3IoUmVuZGVyU2NyaXB0IHJzLCBEYXRhVHlwZSBkdCwgaW50IHNpemUpIHsKICAgICAgICAgaWYgKHNpemUgPCAyIHx8IHNpemUgPiA0KSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgc2l6ZSIpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudChycywgZHQsIERhdGFLaW5kLlVTRVIsIGZhbHNlLCBzaXplKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlSW5kZXgoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudChycywgRGF0YVR5cGUuVU5TSUdORURfMTYsIERhdGFLaW5kLklOREVYLCBmYWxzZSwgMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZUF0dHJpYihSZW5kZXJTY3JpcHQgcnMsIERhdGFUeXBlIGR0LCBEYXRhS2luZCBkaywgaW50IHNpemUpIHsKLSAgICAgICAgaWYgKCEoZHQgPT0gRGF0YVR5cGUuRkxPQVRfMzIgfHwKLSAgICAgICAgICAgICAgZHQgPT0gRGF0YVR5cGUuVU5TSUdORURfOCB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5VTlNJR05FRF8xNiB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5VTlNJR05FRF8zMiB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5TSUdORURfOCB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5TSUdORURfMTYgfHwKLSAgICAgICAgICAgICAgZHQgPT0gRGF0YVR5cGUuU0lHTkVEXzMyKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgRGF0YVR5cGUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghKGRrID09IERhdGFLaW5kLkNPTE9SIHx8Ci0gICAgICAgICAgICAgIGRrID09IERhdGFLaW5kLlBPU0lUSU9OIHx8Ci0gICAgICAgICAgICAgIGRrID09IERhdGFLaW5kLlRFWFRVUkUgfHwKLSAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuTk9STUFMIHx8Ci0gICAgICAgICAgICAgIGRrID09IERhdGFLaW5kLlBPSU5UX1NJWkUgfHwKLSAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuVVNFUikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIERhdGFLaW5kIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGsgPT0gRGF0YUtpbmQuQ09MT1IgJiYKLSAgICAgICAgICAgICgoZHQgIT0gRGF0YVR5cGUuRkxPQVRfMzIgJiYgZHQgIT0gRGF0YVR5cGUuVU5TSUdORURfOCkgfHwKLSAgICAgICAgICAgICBzaXplIDwgMyB8fCBzaXplID4gNCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBjb21ibyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkayA9PSBEYXRhS2luZC5QT1NJVElPTiAmJiAoc2l6ZSA8IDEgfHwgc2l6ZSA+IDQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgY29tYm8iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGsgPT0gRGF0YUtpbmQuVEVYVFVSRSAmJgotICAgICAgICAgICAgKGR0ICE9IERhdGFUeXBlLkZMT0FUXzMyIHx8IHNpemUgPCAxIHx8IHNpemUgPiA0KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGNvbWJvIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRrID09IERhdGFLaW5kLk5PUk1BTCAmJgotICAgICAgICAgICAgKGR0ICE9IERhdGFUeXBlLkZMT0FUXzMyIHx8IHNpemUgIT0gMykpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBjb21ibyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkayA9PSBEYXRhS2luZC5QT0lOVF9TSVpFICYmCi0gICAgICAgICAgICAoZHQgIT0gRGF0YVR5cGUuRkxPQVRfMzIgfHwgc2l6ZSAhPSAxKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGNvbWJvIik7Ci0gICAgICAgIH0KLQorICAgICAgICBEYXRhS2luZCBkayA9IERhdGFLaW5kLlVTRVI7CiAgICAgICAgIGJvb2xlYW4gbm9ybSA9IGZhbHNlOwotICAgICAgICBpZiAoZGsgPT0gRGF0YUtpbmQuQ09MT1IgJiYgZHQgPT0gRGF0YVR5cGUuVU5TSUdORURfOCkgewotICAgICAgICAgICAgbm9ybSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQocnMsIGR0LCBkaywgbm9ybSwgc2l6ZSk7CisgICAgICAgIGludCBpZCA9IHJzLm5FbGVtZW50Q3JlYXRlKGR0Lm1JRCwgZGsubUlELCBub3JtLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KGlkLCBycywgZHQsIGRrLCBub3JtLCBzaXplKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlUGl4ZWwoUmVuZGVyU2NyaXB0IHJzLCBEYXRhVHlwZSBkdCwgRGF0YUtpbmQgZGspIHsKQEAgLTM2NywxMyArNDQ4LDE2IEBACiAgICAgICAgICAgICBzaXplID0gNDsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudChycywgZHQsIGRrLCB0cnVlLCBzaXplKTsKKyAgICAgICAgYm9vbGVhbiBub3JtID0gdHJ1ZTsKKyAgICAgICAgaW50IGlkID0gcnMubkVsZW1lbnRDcmVhdGUoZHQubUlELCBkay5tSUQsIG5vcm0sIHNpemUpOworICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQoaWQsIHJzLCBkdCwgZGssIG5vcm0sIHNpemUpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CiAgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CiAgICAgICAgIEVsZW1lbnRbXSBtRWxlbWVudHM7CiAgICAgICAgIFN0cmluZ1tdIG1FbGVtZW50TmFtZXM7CisgICAgICAgIGludFtdIG1BcnJheVNpemVzOwogICAgICAgICBpbnQgbUNvdW50OwogCiAgICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgewpAQCAtMzgxLDI5ICs0NjUsNDkgQEAKICAgICAgICAgICAgIG1Db3VudCA9IDA7CiAgICAgICAgICAgICBtRWxlbWVudHMgPSBuZXcgRWxlbWVudFs4XTsKICAgICAgICAgICAgIG1FbGVtZW50TmFtZXMgPSBuZXcgU3RyaW5nWzhdOworICAgICAgICAgICAgbUFycmF5U2l6ZXMgPSBuZXcgaW50WzhdOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgYWRkKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcHVibGljIHZvaWQgYWRkKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWUsIGludCBhcnJheVNpemUpIHsKKyAgICAgICAgICAgIGlmIChhcnJheVNpemUgPCAxKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXJyYXkgc2l6ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIDEuIik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZihtQ291bnQgPT0gbUVsZW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgIEVsZW1lbnRbXSBlID0gbmV3IEVsZW1lbnRbbUNvdW50ICsgOF07CiAgICAgICAgICAgICAgICAgU3RyaW5nW10gcyA9IG5ldyBTdHJpbmdbbUNvdW50ICsgOF07CisgICAgICAgICAgICAgICAgaW50W10gYXMgPSBuZXcgaW50W21Db3VudCArIDhdOwogICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobUVsZW1lbnRzLCAwLCBlLCAwLCBtQ291bnQpOwogICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobUVsZW1lbnROYW1lcywgMCwgcywgMCwgbUNvdW50KTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1BcnJheVNpemVzLCAwLCBhcywgMCwgbUNvdW50KTsKICAgICAgICAgICAgICAgICBtRWxlbWVudHMgPSBlOwogICAgICAgICAgICAgICAgIG1FbGVtZW50TmFtZXMgPSBzOworICAgICAgICAgICAgICAgIG1BcnJheVNpemVzID0gYXM7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtRWxlbWVudHNbbUNvdW50XSA9IGVsZW1lbnQ7CiAgICAgICAgICAgICBtRWxlbWVudE5hbWVzW21Db3VudF0gPSBuYW1lOworICAgICAgICAgICAgbUFycmF5U2l6ZXNbbUNvdW50XSA9IGFycmF5U2l6ZTsKICAgICAgICAgICAgIG1Db3VudCsrOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgYWRkKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIGFkZChlbGVtZW50LCBuYW1lLCAxKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBFbGVtZW50IGNyZWF0ZSgpIHsKICAgICAgICAgICAgIG1SUy52YWxpZGF0ZSgpOwogICAgICAgICAgICAgRWxlbWVudFtdIGVpbiA9IG5ldyBFbGVtZW50W21Db3VudF07CiAgICAgICAgICAgICBTdHJpbmdbXSBzaW4gPSBuZXcgU3RyaW5nW21Db3VudF07CisgICAgICAgICAgICBpbnRbXSBhc2luID0gbmV3IGludFttQ291bnRdOwogICAgICAgICAgICAgamF2YS5sYW5nLlN5c3RlbS5hcnJheWNvcHkobUVsZW1lbnRzLCAwLCBlaW4sIDAsIG1Db3VudCk7CiAgICAgICAgICAgICBqYXZhLmxhbmcuU3lzdGVtLmFycmF5Y29weShtRWxlbWVudE5hbWVzLCAwLCBzaW4sIDAsIG1Db3VudCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQobVJTLCBlaW4sIHNpbik7CisgICAgICAgICAgICBqYXZhLmxhbmcuU3lzdGVtLmFycmF5Y29weShtQXJyYXlTaXplcywgMCwgYXNpbiwgMCwgbUNvdW50KTsKKworICAgICAgICAgICAgaW50W10gaWRzID0gbmV3IGludFtlaW4ubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGN0ID0gMDsgY3QgPCBlaW4ubGVuZ3RoOyBjdCsrICkgeworICAgICAgICAgICAgICAgIGlkc1tjdF0gPSBlaW5bY3RdLm1JRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBpZCA9IG1SUy5uRWxlbWVudENyZWF0ZTIoaWRzLCBzaW4sIGFzaW4pOworICAgICAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KGlkLCBtUlMsIGVpbiwgc2luLCBhc2luKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWVsZFBhY2tlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWVsZFBhY2tlci5qYXZhCmluZGV4IGIyNmU0N2QuLmZmM2UyMmIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmllbGRQYWNrZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZpZWxkUGFja2VyLmphdmEKQEAgLTMzLDIxICszMywyOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCByZXNldCgpIHsKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKICAgICAgICAgbVBvcyA9IDA7CiAgICAgfQorICAgIHB1YmxpYyB2b2lkIHJlc2V0KGludCBpKSB7CisgICAgICAgIG1Qb3MgPSBpOworICAgIH0KIAotICAgIHZvaWQgYWRkSTgoYnl0ZSB2KSB7CisgICAgcHVibGljIHZvaWQgc2tpcChpbnQgaSkgeworICAgICAgICBtUG9zICs9IGk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSTgoYnl0ZSB2KSB7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSB2OwogICAgIH0KIAotICAgIHZvaWQgYWRkSTE2KHNob3J0IHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRJMTYoc2hvcnQgdikgewogICAgICAgICBhbGlnbigyKTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSh2ICYgMHhmZik7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkodiA+PiA4KTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEkzMihpbnQgdikgeworICAgIHB1YmxpYyB2b2lkIGFkZEkzMihpbnQgdikgewogICAgICAgICBhbGlnbig0KTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSh2ICYgMHhmZik7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkoKHYgPj4gOCkgJiAweGZmKTsKQEAgLTU1LDcgKzYyLDcgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiAyNCkgJiAweGZmKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEk2NChsb25nIHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRJNjQobG9uZyB2KSB7CiAgICAgICAgIGFsaWduKDgpOwogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKHYgJiAweGZmKTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwpAQCAtNjcsMTUgKzc0LDE3IEBACiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkoKHYgPj4gNTYpICYgMHhmZik7CiAgICAgfQogCi0gICAgdm9pZCBhZGRVOChzaG9ydCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkVTgoc2hvcnQgdikgewogICAgICAgICBpZiAoKHYgPCAwKSB8fCAodiA+IDB4ZmYpKSB7CisgICAgICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLmUoInJzIiwgIkZpZWxkUGFja2VyLmFkZFU4KCAiICsgdiArICIgKSIpOwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2F2aW5nIHZhbHVlIG91dCBvZiByYW5nZSBmb3IgdHlwZSIpOwogICAgICAgICB9CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSl2OwogICAgIH0KIAotICAgIHZvaWQgYWRkVTE2KGludCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkVTE2KGludCB2KSB7CiAgICAgICAgIGlmICgodiA8IDApIHx8ICh2ID4gMHhmZmZmKSkgeworICAgICAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKCJycyIsICJGaWVsZFBhY2tlci5hZGRVMTYoICIgKyB2ICsgIiApIik7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTYXZpbmcgdmFsdWUgb3V0IG9mIHJhbmdlIGZvciB0eXBlIik7CiAgICAgICAgIH0KICAgICAgICAgYWxpZ24oMik7CkBAIC04Myw4ICs5Miw5IEBACiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkodiA+PiA4KTsKICAgICB9CiAKLSAgICB2b2lkIGFkZFUzMihsb25nIHYpIHsKLSAgICAgICAgaWYgKCh2IDwgMCkgfHwgKHYgPiAweGZmZmZmZmZmKSkgeworICAgIHB1YmxpYyB2b2lkIGFkZFUzMihsb25nIHYpIHsKKyAgICAgICAgaWYgKCh2IDwgMCkgfHwgKHYgPiAweGZmZmZmZmZmTCkpIHsKKyAgICAgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cuZSgicnMiLCAiRmllbGRQYWNrZXIuYWRkVTMyKCAiICsgdiArICIgKSIpOwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2F2aW5nIHZhbHVlIG91dCBvZiByYW5nZSBmb3IgdHlwZSIpOwogICAgICAgICB9CiAgICAgICAgIGFsaWduKDQpOwpAQCAtOTQsOCArMTA0LDkgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiAyNCkgJiAweGZmKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZFU2NChsb25nIHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRVNjQobG9uZyB2KSB7CiAgICAgICAgIGlmICh2IDwgMCkgeworICAgICAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKCJycyIsICJGaWVsZFBhY2tlci5hZGRVNjQoICIgKyB2ICsgIiApIik7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTYXZpbmcgdmFsdWUgb3V0IG9mIHJhbmdlIGZvciB0eXBlIik7CiAgICAgICAgIH0KICAgICAgICAgYWxpZ24oOCk7CkBAIC0xMDksMTUgKzEyMCwxNTcgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiA1NikgJiAweGZmKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEYzMihmbG9hdCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkRjMyKGZsb2F0IHYpIHsKICAgICAgICAgYWRkSTMyKEZsb2F0LmZsb2F0VG9SYXdJbnRCaXRzKHYpKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZEY2NChmbG9hdCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkRjY0KGRvdWJsZSB2KSB7CiAgICAgICAgIGFkZEk2NChEb3VibGUuZG91YmxlVG9SYXdMb25nQml0cyh2KSk7CiAgICAgfQogCi0gICAgZmluYWwgYnl0ZVtdIGdldERhdGEoKSB7CisgICAgcHVibGljIHZvaWQgYWRkT2JqKEJhc2VPYmogb2JqKSB7CisgICAgICAgIGlmIChvYmogIT0gbnVsbCkgeworICAgICAgICAgICAgYWRkSTMyKG9iai5nZXRJRCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZEkzMigwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEYzMihGbG9hdDIgdikgeworICAgICAgICBhZGRGMzIodi54KTsKKyAgICAgICAgYWRkRjMyKHYueSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEYzMihGbG9hdDMgdikgeworICAgICAgICBhZGRGMzIodi54KTsKKyAgICAgICAgYWRkRjMyKHYueSk7CisgICAgICAgIGFkZEYzMih2LnopOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRGMzIoRmxvYXQ0IHYpIHsKKyAgICAgICAgYWRkRjMyKHYueCk7CisgICAgICAgIGFkZEYzMih2LnkpOworICAgICAgICBhZGRGMzIodi56KTsKKyAgICAgICAgYWRkRjMyKHYudyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSTgoQnl0ZTIgdikgeworICAgICAgICBhZGRJOCh2LngpOworICAgICAgICBhZGRJOCh2LnkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRJOChCeXRlMyB2KSB7CisgICAgICAgIGFkZEk4KHYueCk7CisgICAgICAgIGFkZEk4KHYueSk7CisgICAgICAgIGFkZEk4KHYueik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEk4KEJ5dGU0IHYpIHsKKyAgICAgICAgYWRkSTgodi54KTsKKyAgICAgICAgYWRkSTgodi55KTsKKyAgICAgICAgYWRkSTgodi56KTsKKyAgICAgICAgYWRkSTgodi53KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRVOChTaG9ydDIgdikgeworICAgICAgICBhZGRVOCh2LngpOworICAgICAgICBhZGRVOCh2LnkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRVOChTaG9ydDMgdikgeworICAgICAgICBhZGRVOCh2LngpOworICAgICAgICBhZGRVOCh2LnkpOworICAgICAgICBhZGRVOCh2LnopOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRVOChTaG9ydDQgdikgeworICAgICAgICBhZGRVOCh2LngpOworICAgICAgICBhZGRVOCh2LnkpOworICAgICAgICBhZGRVOCh2LnopOworICAgICAgICBhZGRVOCh2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEkxNihTaG9ydDIgdikgeworICAgICAgICBhZGRJMTYodi54KTsKKyAgICAgICAgYWRkSTE2KHYueSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEkxNihTaG9ydDMgdikgeworICAgICAgICBhZGRJMTYodi54KTsKKyAgICAgICAgYWRkSTE2KHYueSk7CisgICAgICAgIGFkZEkxNih2LnopOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRJMTYoU2hvcnQ0IHYpIHsKKyAgICAgICAgYWRkSTE2KHYueCk7CisgICAgICAgIGFkZEkxNih2LnkpOworICAgICAgICBhZGRJMTYodi56KTsKKyAgICAgICAgYWRkSTE2KHYudyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVTE2KEludDIgdikgeworICAgICAgICBhZGRVMTYodi54KTsKKyAgICAgICAgYWRkVTE2KHYueSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZFUxNihJbnQzIHYpIHsKKyAgICAgICAgYWRkVTE2KHYueCk7CisgICAgICAgIGFkZFUxNih2LnkpOworICAgICAgICBhZGRVMTYodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkVTE2KEludDQgdikgeworICAgICAgICBhZGRVMTYodi54KTsKKyAgICAgICAgYWRkVTE2KHYueSk7CisgICAgICAgIGFkZFUxNih2LnopOworICAgICAgICBhZGRVMTYodi53KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJMzIoSW50MiB2KSB7CisgICAgICAgIGFkZEkzMih2LngpOworICAgICAgICBhZGRJMzIodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkSTMyKEludDMgdikgeworICAgICAgICBhZGRJMzIodi54KTsKKyAgICAgICAgYWRkSTMyKHYueSk7CisgICAgICAgIGFkZEkzMih2LnopOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRJMzIoSW50NCB2KSB7CisgICAgICAgIGFkZEkzMih2LngpOworICAgICAgICBhZGRJMzIodi55KTsKKyAgICAgICAgYWRkSTMyKHYueik7CisgICAgICAgIGFkZEkzMih2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFUzMihJbnQyIHYpIHsKKyAgICAgICAgYWRkVTMyKHYueCk7CisgICAgICAgIGFkZFUzMih2LnkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRVMzIoSW50MyB2KSB7CisgICAgICAgIGFkZFUzMih2LngpOworICAgICAgICBhZGRVMzIodi55KTsKKyAgICAgICAgYWRkVTMyKHYueik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZFUzMihJbnQ0IHYpIHsKKyAgICAgICAgYWRkVTMyKHYueCk7CisgICAgICAgIGFkZFUzMih2LnkpOworICAgICAgICBhZGRVMzIodi56KTsKKyAgICAgICAgYWRkVTMyKHYudyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkT2JqKE1hdHJpeDRmIHYpIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgdi5tTWF0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhZGRGMzIodi5tTWF0W2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE9iaihNYXRyaXgzZiB2KSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHYubU1hdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYWRkRjMyKHYubU1hdFtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRPYmooTWF0cml4MmYgdikgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCB2Lm1NYXQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFkZEYzMih2Lm1NYXRbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQm9vbGVhbihib29sZWFuIHYpIHsKKyAgICAgICAgYWRkSTgoKGJ5dGUpKHYgPyAxIDogMCkpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBieXRlW10gZ2V0RGF0YSgpIHsKICAgICAgICAgcmV0dXJuIG1EYXRhOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWxlQTNELmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZpbGVBM0QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDE0MDYyCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWxlQTNELmphdmEKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgRmlsZUEzRCBleHRlbmRzIEJhc2VPYmogeworCisgICAgcHVibGljIGVudW0gQ2xhc3NJRCB7CisKKyAgICAgICAgVU5LTk9XTiwKKyAgICAgICAgTUVTSCwKKyAgICAgICAgVFlQRSwKKyAgICAgICAgRUxFTUVOVCwKKyAgICAgICAgQUxMT0NBVElPTiwKKyAgICAgICAgUFJPR1JBTV9WRVJURVgsCisgICAgICAgIFBST0dSQU1fUkFTVEVSLAorICAgICAgICBQUk9HUkFNX0ZSQUdNRU5ULAorICAgICAgICBQUk9HUkFNX1NUT1JFLAorICAgICAgICBTQU1QTEVSLAorICAgICAgICBBTklNQVRJT04sCisgICAgICAgIExJR0hULAorICAgICAgICBBREFQVEVSXzFELAorICAgICAgICBBREFQVEVSXzJELAorICAgICAgICBTQ1JJUFRfQzsKKworICAgICAgICBwdWJsaWMgc3RhdGljIENsYXNzSUQgdG9DbGFzc0lEKGludCBpbnRJRCkgeworICAgICAgICAgICAgcmV0dXJuIENsYXNzSUQudmFsdWVzKClbaW50SURdOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmVhZCBvbmx5IGNsYXNzIHdpdGggaW5kZXggZW50cmllcworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5kZXhFbnRyeSB7CisgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CisgICAgICAgIGludCBtSW5kZXg7CisgICAgICAgIGludCBtSUQ7CisgICAgICAgIFN0cmluZyBtTmFtZTsKKyAgICAgICAgQ2xhc3NJRCBtQ2xhc3NJRDsKKyAgICAgICAgQmFzZU9iaiBtTG9hZGVkT2JqOworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDbGFzc0lEIGdldENsYXNzSUQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNsYXNzSUQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQmFzZU9iaiBnZXRPYmplY3QoKSB7CisgICAgICAgICAgICBtUlMudmFsaWRhdGUoKTsKKyAgICAgICAgICAgIEJhc2VPYmogb2JqID0gaW50ZXJuYWxDcmVhdGUobVJTLCB0aGlzKTsKKyAgICAgICAgICAgIHJldHVybiBvYmo7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgc3luY2hyb25pemVkIEJhc2VPYmogaW50ZXJuYWxDcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBJbmRleEVudHJ5IGVudHJ5KSB7CisgICAgICAgICAgICBpZihlbnRyeS5tTG9hZGVkT2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkubUxvYWRlZE9iajsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoZW50cnkubUNsYXNzSUQgPT0gQ2xhc3NJRC5VTktOT1dOKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBvYmplY3RJRCA9IHJzLm5GaWxlQTNER2V0RW50cnlCeUluZGV4KGVudHJ5Lm1JRCwgZW50cnkubUluZGV4KTsKKyAgICAgICAgICAgIGlmKG9iamVjdElEID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChlbnRyeS5tQ2xhc3NJRCkgeworICAgICAgICAgICAgY2FzZSBNRVNIOgorICAgICAgICAgICAgICAgIGVudHJ5Lm1Mb2FkZWRPYmogPSBuZXcgTWVzaChvYmplY3RJRCwgcnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUWVBFOgorICAgICAgICAgICAgICAgIGVudHJ5Lm1Mb2FkZWRPYmogPSBuZXcgVHlwZShvYmplY3RJRCwgcnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFTEVNRU5UOgorICAgICAgICAgICAgICAgIGVudHJ5Lm1Mb2FkZWRPYmogPSBudWxsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTExPQ0FUSU9OOgorICAgICAgICAgICAgICAgIGVudHJ5Lm1Mb2FkZWRPYmogPSBudWxsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQUk9HUkFNX1ZFUlRFWDoKKyAgICAgICAgICAgICAgICBlbnRyeS5tTG9hZGVkT2JqID0gbmV3IFByb2dyYW1WZXJ0ZXgob2JqZWN0SUQsIHJzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUFJPR1JBTV9SQVNURVI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBST0dSQU1fRlJBR01FTlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBST0dSQU1fU1RPUkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNBTVBMRVI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFOSU1BVElPTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTElHSFQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFEQVBURVJfMUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFEQVBURVJfMkQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNDUklQVF9DOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbnRyeS5tTG9hZGVkT2JqLnVwZGF0ZUZyb21OYXRpdmUoKTsKKworICAgICAgICAgICAgcmV0dXJuIGVudHJ5Lm1Mb2FkZWRPYmo7CisgICAgICAgIH0KKworICAgICAgICBJbmRleEVudHJ5KFJlbmRlclNjcmlwdCBycywgaW50IGluZGV4LCBpbnQgaWQsIFN0cmluZyBuYW1lLCBDbGFzc0lEIGNsYXNzSUQpIHsKKyAgICAgICAgICAgIG1SUyA9IHJzOworICAgICAgICAgICAgbUluZGV4ID0gaW5kZXg7CisgICAgICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgICAgIG1OYW1lID0gbmFtZTsKKyAgICAgICAgICAgIG1DbGFzc0lEID0gY2xhc3NJRDsKKyAgICAgICAgICAgIG1Mb2FkZWRPYmogPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgSW5kZXhFbnRyeVtdIG1GaWxlRW50cmllczsKKworICAgIEZpbGVBM0QoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdEVudHJpZXMoKSB7CisgICAgICAgIGludCBudW1GaWxlRW50cmllcyA9IG1SUy5uRmlsZUEzREdldE51bUluZGV4RW50cmllcyhtSUQpOworICAgICAgICBpZihudW1GaWxlRW50cmllcyA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtRmlsZUVudHJpZXMgPSBuZXcgSW5kZXhFbnRyeVtudW1GaWxlRW50cmllc107CisgICAgICAgIGludFtdIGlkcyA9IG5ldyBpbnRbbnVtRmlsZUVudHJpZXNdOworICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbbnVtRmlsZUVudHJpZXNdOworCisgICAgICAgIG1SUy5uRmlsZUEzREdldEluZGV4RW50cmllcyhtSUQsIG51bUZpbGVFbnRyaWVzLCBpZHMsIG5hbWVzKTsKKworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtRmlsZUVudHJpZXM7IGkgKyspIHsKKyAgICAgICAgICAgIG1GaWxlRW50cmllc1tpXSA9IG5ldyBJbmRleEVudHJ5KG1SUywgaSwgbUlELCBuYW1lc1tpXSwgQ2xhc3NJRC50b0NsYXNzSUQoaWRzW2ldKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE51bUluZGV4RW50cmllcygpIHsKKyAgICAgICAgaWYobUZpbGVFbnRyaWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRmlsZUVudHJpZXMubGVuZ3RoOworICAgIH0KKworICAgIHB1YmxpYyBJbmRleEVudHJ5IGdldEluZGV4RW50cnkoaW50IGluZGV4KSB7CisgICAgICAgIGlmKGdldE51bUluZGV4RW50cmllcygpID09IDAgfHwgaW5kZXggPCAwIHx8IGluZGV4ID49IG1GaWxlRW50cmllcy5sZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRmlsZUVudHJpZXNbaW5kZXhdOworICAgIH0KKworICAgIHN0YXRpYyBwdWJsaWMgRmlsZUEzRCBjcmVhdGVGcm9tUmVzb3VyY2UoUmVuZGVyU2NyaXB0IHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgaWQpCisgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCisgICAgICAgIHJzLnZhbGlkYXRlKCk7CisgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOworICAgICAgICAgICAgaXMgPSByZXMub3BlblJhd1Jlc291cmNlKGlkLCB2YWx1ZSk7CisKKyAgICAgICAgICAgIGludCBhc3NldCA9ICgoQXNzZXRNYW5hZ2VyLkFzc2V0SW5wdXRTdHJlYW0pIGlzKS5nZXRBc3NldEludCgpOworCisgICAgICAgICAgICBpbnQgZmlsZUlkID0gcnMubkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0oYXNzZXQpOworCisgICAgICAgICAgICBpZihmaWxlSWQgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkxvYWQgZmFpbGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRmlsZUEzRCBmYTNkID0gbmV3IEZpbGVBM0QoZmlsZUlkLCBycyk7CisgICAgICAgICAgICBmYTNkLmluaXRFbnRyaWVzKCk7CisgICAgICAgICAgICByZXR1cm4gZmEzZDsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0Mi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODliZjdiCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDIuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBGbG9hdDIgeworICAgIHB1YmxpYyBGbG9hdDIoKSB7CisgICAgfQorCisgICAgcHVibGljIEZsb2F0MihmbG9hdCBpbml0WCwgZmxvYXQgaW5pdFkpIHsKKyAgICAgICAgeCA9IGluaXRYOworICAgICAgICB5ID0gaW5pdFk7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IHg7CisgICAgcHVibGljIGZsb2F0IHk7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQzLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0My5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZTE0MGQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0My5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEZsb2F0MyB7CisgICAgcHVibGljIEZsb2F0MygpIHsKKyAgICB9CisgICAgcHVibGljIEZsb2F0MyhmbG9hdCBpbml0WCwgZmxvYXQgaW5pdFksIGZsb2F0IGluaXRaKSB7CisgICAgICAgIHggPSBpbml0WDsKKyAgICAgICAgeSA9IGluaXRZOworICAgICAgICB6ID0gaW5pdFo7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IHg7CisgICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIGZsb2F0IHo7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQ0LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0NC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NzczMmYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0NC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEZsb2F0NCB7CisgICAgcHVibGljIEZsb2F0NCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgRmxvYXQ0KGZsb2F0IGluaXRYLCBmbG9hdCBpbml0WSwgZmxvYXQgaW5pdFosIGZsb2F0IGluaXRXKSB7CisgICAgICAgIHggPSBpbml0WDsKKyAgICAgICAgeSA9IGluaXRZOworICAgICAgICB6ID0gaW5pdFo7CisgICAgICAgIHcgPSBpbml0VzsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgeDsKKyAgICBwdWJsaWMgZmxvYXQgeTsKKyAgICBwdWJsaWMgZmxvYXQgejsKKyAgICBwdWJsaWMgZmxvYXQgdzsKK30KKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRm9udC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Gb250LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUyNTAxNAotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRm9udC5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBGb250IGV4dGVuZHMgQmFzZU9iaiB7CisKKyAgICAvL1RoZXNlIGhlbHAgdXMgY3JlYXRlIGEgZm9udCBieSBmYW1pbHkgbmFtZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHNTYW5zTmFtZXMgPSB7CisgICAgICAgICJzYW5zLXNlcmlmIiwgImFyaWFsIiwgImhlbHZldGljYSIsICJ0YWhvbWEiLCAidmVyZGFuYSIKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc1NlcmlmTmFtZXMgPSB7CisgICAgICAgICJzZXJpZiIsICJ0aW1lcyIsICJ0aW1lcyBuZXcgcm9tYW4iLCAicGFsYXRpbm8iLCAiZ2VvcmdpYSIsICJiYXNrZXJ2aWxsZSIsCisgICAgICAgICJnb3VkeSIsICJmYW50YXN5IiwgImN1cnNpdmUiLCAiSVRDIFN0b25lIFNlcmlmIgorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzTW9ub05hbWVzID0geworICAgICAgICAibW9ub3NwYWNlIiwgImNvdXJpZXIiLCAiY291cmllciBuZXciLCAibW9uYWNvIgorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGb250RmFtaWx5IHsKKyAgICAgICAgU3RyaW5nW10gbU5hbWVzOworICAgICAgICBTdHJpbmcgbU5vcm1hbEZpbGVOYW1lOworICAgICAgICBTdHJpbmcgbUJvbGRGaWxlTmFtZTsKKyAgICAgICAgU3RyaW5nIG1JdGFsaWNGaWxlTmFtZTsKKyAgICAgICAgU3RyaW5nIG1Cb2xkSXRhbGljRmlsZU5hbWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgRm9udEZhbWlseT4gc0ZvbnRGYW1pbHlNYXA7CisKKyAgICBwdWJsaWMgZW51bSBTdHlsZSB7CisgICAgICAgIE5PUk1BTCwKKyAgICAgICAgQk9MRCwKKyAgICAgICAgSVRBTElDLAorICAgICAgICBCT0xEX0lUQUxJQzsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEZhbWlseVRvTWFwKEZvbnRGYW1pbHkgZmFtaWx5KSB7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBmYW1pbHkubU5hbWVzLmxlbmd0aDsgaSArKykgeworICAgICAgICAgICAgc0ZvbnRGYW1pbHlNYXAucHV0KGZhbWlseS5tTmFtZXNbaV0sIGZhbWlseSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRGb250RmFtaWx5TWFwKCkgeworICAgICAgICBzRm9udEZhbWlseU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgRm9udEZhbWlseT4oKTsKKworICAgICAgICBGb250RmFtaWx5IHNhbnNGYW1pbHkgPSBuZXcgRm9udEZhbWlseSgpOworICAgICAgICBzYW5zRmFtaWx5Lm1OYW1lcyA9IHNTYW5zTmFtZXM7CisgICAgICAgIHNhbnNGYW1pbHkubU5vcm1hbEZpbGVOYW1lID0gIkRyb2lkU2Fucy50dGYiOworICAgICAgICBzYW5zRmFtaWx5Lm1Cb2xkRmlsZU5hbWUgPSAiRHJvaWRTYW5zLUJvbGQudHRmIjsKKyAgICAgICAgc2Fuc0ZhbWlseS5tSXRhbGljRmlsZU5hbWUgPSAiRHJvaWRTYW5zLnR0ZiI7CisgICAgICAgIHNhbnNGYW1pbHkubUJvbGRJdGFsaWNGaWxlTmFtZSA9ICJEcm9pZFNhbnMtQm9sZC50dGYiOworICAgICAgICBhZGRGYW1pbHlUb01hcChzYW5zRmFtaWx5KTsKKworICAgICAgICBGb250RmFtaWx5IHNlcmlmRmFtaWx5ID0gbmV3IEZvbnRGYW1pbHkoKTsKKyAgICAgICAgc2VyaWZGYW1pbHkubU5hbWVzID0gc1NlcmlmTmFtZXM7CisgICAgICAgIHNlcmlmRmFtaWx5Lm1Ob3JtYWxGaWxlTmFtZSA9ICJEcm9pZFNlcmlmLVJlZ3VsYXIudHRmIjsKKyAgICAgICAgc2VyaWZGYW1pbHkubUJvbGRGaWxlTmFtZSA9ICJEcm9pZFNlcmlmLUJvbGQudHRmIjsKKyAgICAgICAgc2VyaWZGYW1pbHkubUl0YWxpY0ZpbGVOYW1lID0gIkRyb2lkU2VyaWYtSXRhbGljLnR0ZiI7CisgICAgICAgIHNlcmlmRmFtaWx5Lm1Cb2xkSXRhbGljRmlsZU5hbWUgPSAiRHJvaWRTZXJpZi1Cb2xkSXRhbGljLnR0ZiI7CisgICAgICAgIGFkZEZhbWlseVRvTWFwKHNlcmlmRmFtaWx5KTsKKworICAgICAgICBGb250RmFtaWx5IG1vbm9GYW1pbHkgPSBuZXcgRm9udEZhbWlseSgpOworICAgICAgICBtb25vRmFtaWx5Lm1OYW1lcyA9IHNNb25vTmFtZXM7CisgICAgICAgIG1vbm9GYW1pbHkubU5vcm1hbEZpbGVOYW1lID0gIkRyb2lkU2Fuc01vbm8udHRmIjsKKyAgICAgICAgbW9ub0ZhbWlseS5tQm9sZEZpbGVOYW1lID0gIkRyb2lkU2Fuc01vbm8udHRmIjsKKyAgICAgICAgbW9ub0ZhbWlseS5tSXRhbGljRmlsZU5hbWUgPSAiRHJvaWRTYW5zTW9uby50dGYiOworICAgICAgICBtb25vRmFtaWx5Lm1Cb2xkSXRhbGljRmlsZU5hbWUgPSAiRHJvaWRTYW5zTW9uby50dGYiOworICAgICAgICBhZGRGYW1pbHlUb01hcChtb25vRmFtaWx5KTsKKyAgICB9CisKKyAgICBzdGF0aWMgeworICAgICAgICBpbml0Rm9udEZhbWlseU1hcCgpOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgZ2V0Rm9udEZpbGVOYW1lKFN0cmluZyBmYW1pbHlOYW1lLCBTdHlsZSBzdHlsZSkgeworICAgICAgICBGb250RmFtaWx5IGZhbWlseSA9IHNGb250RmFtaWx5TWFwLmdldChmYW1pbHlOYW1lKTsKKyAgICAgICAgaWYoZmFtaWx5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN3aXRjaChzdHlsZSkgeworICAgICAgICAgICAgICAgIGNhc2UgTk9STUFMOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFtaWx5Lm1Ob3JtYWxGaWxlTmFtZTsKKyAgICAgICAgICAgICAgICBjYXNlIEJPTEQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYW1pbHkubUJvbGRGaWxlTmFtZTsKKyAgICAgICAgICAgICAgICBjYXNlIElUQUxJQzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbWlseS5tSXRhbGljRmlsZU5hbWU7CisgICAgICAgICAgICAgICAgY2FzZSBCT0xEX0lUQUxJQzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbWlseS5tQm9sZEl0YWxpY0ZpbGVOYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIEZhbGxiYWNrIGlmIHdlIGNvdWxkIG5vdCBmaW5kIHRoZSBkZXNpcmVkIGZhbWlseQorICAgICAgICByZXR1cm4gIkRyb2lkU2Fucy50dGYiOworICAgIH0KKworICAgIEZvbnQoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUYWtlcyBhIHNwZWNpZmljIGZpbGUgbmFtZSBhcyBhbiBhcmd1bWVudAorICAgICAqLworICAgIHN0YXRpYyBwdWJsaWMgRm9udCBjcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBSZXNvdXJjZXMgcmVzLCBTdHJpbmcgZmlsZU5hbWUsIGludCBzaXplKQorICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKworICAgICAgICBycy52YWxpZGF0ZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGRwaSA9IHJlcy5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHlEcGk7CisgICAgICAgICAgICBpbnQgZm9udElkID0gcnMubkZvbnRDcmVhdGVGcm9tRmlsZShmaWxlTmFtZSwgc2l6ZSwgZHBpKTsKKworICAgICAgICAgICAgaWYoZm9udElkID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGYWlsZWQgbG9hZGluZyBhIGZvbnQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZvbnQgcnNGb250ID0gbmV3IEZvbnQoZm9udElkLCBycyk7CisKKyAgICAgICAgICAgIHJldHVybiByc0ZvbnQ7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNjZXB0cyBvbmUgb2YgdGhlIGZvbGxvd2luZyBmYW1pbHkgbmFtZXMgYXMgYW4gYXJndW1lbnQKKyAgICAgKiBhbmQgd2lsbCBhdHRlbXAgdG8gcHJvZHVjZSB0aGUgYmVzdCBtYXRjaCB3aXRoIGEgc3lzdGVtIGZvbnQKKyAgICAgKiAic2Fucy1zZXJpZiIgImFyaWFsIiAiaGVsdmV0aWNhIiAidGFob21hIiAidmVyZGFuYSIKKyAgICAgKiAic2VyaWYiICJ0aW1lcyIgInRpbWVzIG5ldyByb21hbiIgInBhbGF0aW5vIiAiZ2VvcmdpYSIgImJhc2tlcnZpbGxlIgorICAgICAqICJnb3VkeSIgImZhbnRhc3kiICJjdXJzaXZlIiAiSVRDIFN0b25lIFNlcmlmIgorICAgICAqICJtb25vc3BhY2UiICJjb3VyaWVyIiAiY291cmllciBuZXciICJtb25hY28iCisgICAgICogUmV0dXJucyBkZWZhdWx0IGZvbnQgaWYgbm8gbWF0Y2ggY291bGQgYmUgZm91bmQKKyAgICAgKi8KKyAgICBzdGF0aWMgcHVibGljIEZvbnQgY3JlYXRlRnJvbUZhbWlseShSZW5kZXJTY3JpcHQgcnMsIFJlc291cmNlcyByZXMsIFN0cmluZyBmYW1pbHlOYW1lLCBTdHlsZSBmb250U3R5bGUsIGludCBzaXplKQorICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBnZXRGb250RmlsZU5hbWUoZmFtaWx5TmFtZSwgZm9udFN0eWxlKTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZShycywgcmVzLCBmaWxlTmFtZSwgc2l6ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmUyZmU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgSW50MiB7CisgICAgcHVibGljIEludDIoKSB7CisgICAgfQorCisgICAgcHVibGljIGludCB4OworICAgIHB1YmxpYyBpbnQgeTsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQzLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjI3NTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQzLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgSW50MyB7CisgICAgcHVibGljIEludDMoKSB7CisgICAgfQorCisgICAgcHVibGljIGludCB4OworICAgIHB1YmxpYyBpbnQgeTsKKyAgICBwdWJsaWMgaW50IHo7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50NC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q2ZjNmNQotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50NC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEludDQgeworICAgIHB1YmxpYyBJbnQ0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBpbnQgeDsKKyAgICBwdWJsaWMgaW50IHk7CisgICAgcHVibGljIGludCB6OworICAgIHB1YmxpYyBpbnQgdzsKK30KKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTGlnaHQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTGlnaHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiNjU2Zi4uMDAwMDAwMAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xpZ2h0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKLQotaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotLyoqCi0gKiBAaGlkZQotICoKLSAqKi8KLXB1YmxpYyBjbGFzcyBMaWdodCBleHRlbmRzIEJhc2VPYmogewotICAgIExpZ2h0KGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYikgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5MaWdodFNldENvbG9yKG1JRCwgciwgZywgYik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UG9zaXRpb24oZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5MaWdodFNldFBvc2l0aW9uKG1JRCwgeCwgeSwgeik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKLSAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKLSAgICAgICAgYm9vbGVhbiBtSXNNb25vOwotICAgICAgICBib29sZWFuIG1Jc0xvY2FsOwotCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICAgICAgbVJTID0gcnM7Ci0gICAgICAgICAgICBtSXNNb25vID0gZmFsc2U7Ci0gICAgICAgICAgICBtSXNMb2NhbCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgbGlnaHRTZXRJc01vbm8oYm9vbGVhbiBpc01vbm8pIHsKLSAgICAgICAgICAgIG1Jc01vbm8gPSBpc01vbm87Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBsaWdodFNldElzTG9jYWwoYm9vbGVhbiBpc0xvY2FsKSB7Ci0gICAgICAgICAgICBtSXNMb2NhbCA9IGlzTG9jYWw7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgc3luY2hyb25pemVkIExpZ2h0IGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgQnVpbGRlciBiKSB7Ci0gICAgICAgICAgICBycy5uU2FtcGxlckJlZ2luKCk7Ci0gICAgICAgICAgICBycy5uTGlnaHRTZXRJc01vbm8oYi5tSXNNb25vKTsKLSAgICAgICAgICAgIHJzLm5MaWdodFNldElzTG9jYWwoYi5tSXNMb2NhbCk7Ci0gICAgICAgICAgICBpbnQgaWQgPSBycy5uTGlnaHRDcmVhdGUoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTGlnaHQoaWQsIHJzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBMaWdodCBjcmVhdGUoKSB7Ci0gICAgICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbENyZWF0ZShtUlMsIHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWVhZDJmCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nMi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIExvbmcyIHsKKyAgICBwdWJsaWMgTG9uZzIoKSB7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgeDsKKyAgICBwdWJsaWMgbG9uZyB5OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmczLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmczLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwNDUzMgotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzMuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBMb25nMyB7CisgICAgcHVibGljIExvbmczKCkgeworICAgIH0KKworICAgIHB1YmxpYyBsb25nIHg7CisgICAgcHVibGljIGxvbmcgeTsKKyAgICBwdWJsaWMgbG9uZyB6OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmc0LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmc0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkMjc0NwotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzQuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBMb25nNCB7CisgICAgcHVibGljIExvbmc0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBsb25nIHg7CisgICAgcHVibGljIGxvbmcgeTsKKyAgICBwdWJsaWMgbG9uZyB6OworICAgIHB1YmxpYyBsb25nIHc7Cit9CisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDJmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDJmLmphdmEKaW5kZXggNGI1ZTYxYi4uOTlkMjNkYiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXgyZi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4MmYuamF2YQpAQCAtNTEsNiArNTEsNTcgQEAKICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtTWF0LCAwLCBzcmMsIDAsIDQpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGxvYWRSb3RhdGUoZmxvYXQgcm90KSB7CisgICAgICAgIGZsb2F0IGMsIHM7CisgICAgICAgIHJvdCAqPSAoZmxvYXQpKGphdmEubGFuZy5NYXRoLlBJIC8gMTgwLjBmKTsKKyAgICAgICAgYyA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5jb3Mocm90KTsKKyAgICAgICAgcyA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zaW4ocm90KTsKKyAgICAgICAgbU1hdFswXSA9IGM7CisgICAgICAgIG1NYXRbMV0gPSAtczsKKyAgICAgICAgbU1hdFsyXSA9IHM7CisgICAgICAgIG1NYXRbM10gPSBjOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRTY2FsZShmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIGxvYWRJZGVudGl0eSgpOworICAgICAgICBtTWF0WzBdID0geDsKKyAgICAgICAgbU1hdFszXSA9IHk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGxvYWRNdWx0aXBseShNYXRyaXgyZiBsaHMsIE1hdHJpeDJmIHJocykgeworICAgICAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKKyAgICAgICAgICAgIGZsb2F0IHJpMCA9IDA7CisgICAgICAgICAgICBmbG9hdCByaTEgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaj0wIDsgajwyIDsgaisrKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgcmhzX2lqID0gcmhzLmdldChpLGopOworICAgICAgICAgICAgICAgIHJpMCArPSBsaHMuZ2V0KGosMCkgKiByaHNfaWo7CisgICAgICAgICAgICAgICAgcmkxICs9IGxocy5nZXQoaiwxKSAqIHJoc19pajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldChpLDAsIHJpMCk7CisgICAgICAgICAgICBzZXQoaSwxLCByaTEpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbXVsdGlwbHkoTWF0cml4MmYgcmhzKSB7CisgICAgICAgIE1hdHJpeDJmIHRtcCA9IG5ldyBNYXRyaXgyZigpOworICAgICAgICB0bXAubG9hZE11bHRpcGx5KHRoaXMsIHJocyk7CisgICAgICAgIGxvYWQodG1wKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgcm90YXRlKGZsb2F0IHJvdCkgeworICAgICAgICBNYXRyaXgyZiB0bXAgPSBuZXcgTWF0cml4MmYoKTsKKyAgICAgICAgdG1wLmxvYWRSb3RhdGUocm90KTsKKyAgICAgICAgbXVsdGlwbHkodG1wKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2NhbGUoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBNYXRyaXgyZiB0bXAgPSBuZXcgTWF0cml4MmYoKTsKKyAgICAgICAgdG1wLmxvYWRTY2FsZSh4LCB5KTsKKyAgICAgICAgbXVsdGlwbHkodG1wKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdHJhbnNwb3NlKCkgeworICAgICAgICBmbG9hdCB0ZW1wID0gbU1hdFsxXTsKKyAgICAgICAgbU1hdFsxXSA9IG1NYXRbMl07CisgICAgICAgIG1NYXRbMl0gPSB0ZW1wOworICAgIH0KKwogICAgIGZpbmFsIGZsb2F0W10gbU1hdDsKIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXgzZi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXgzZi5qYXZhCmluZGV4IDE5ZDdiNDMuLjk2MWJjNWQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4M2YuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDNmLmphdmEKQEAgLTU3LDYgKzU3LDEyNCBAQAogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1NYXQsIDAsIHNyYywgMCwgOSk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgbG9hZFJvdGF0ZShmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgZmxvYXQgYywgczsKKyAgICAgICAgcm90ICo9IChmbG9hdCkoamF2YS5sYW5nLk1hdGguUEkgLyAxODAuMGYpOworICAgICAgICBjID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLmNvcyhyb3QpOworICAgICAgICBzID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLnNpbihyb3QpOworCisgICAgICAgIGZsb2F0IGxlbiA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zcXJ0KHgqeCArIHkqeSArIHoqeik7CisgICAgICAgIGlmICghKGxlbiAhPSAxKSkgeworICAgICAgICAgICAgZmxvYXQgcmVjaXBMZW4gPSAxLmYgLyBsZW47CisgICAgICAgICAgICB4ICo9IHJlY2lwTGVuOworICAgICAgICAgICAgeSAqPSByZWNpcExlbjsKKyAgICAgICAgICAgIHogKj0gcmVjaXBMZW47CisgICAgICAgIH0KKyAgICAgICAgZmxvYXQgbmMgPSAxLjBmIC0gYzsKKyAgICAgICAgZmxvYXQgeHkgPSB4ICogeTsKKyAgICAgICAgZmxvYXQgeXogPSB5ICogejsKKyAgICAgICAgZmxvYXQgenggPSB6ICogeDsKKyAgICAgICAgZmxvYXQgeHMgPSB4ICogczsKKyAgICAgICAgZmxvYXQgeXMgPSB5ICogczsKKyAgICAgICAgZmxvYXQgenMgPSB6ICogczsKKyAgICAgICAgbU1hdFswXSA9IHgqeCpuYyArICBjOworICAgICAgICBtTWF0WzNdID0gIHh5Km5jIC0genM7CisgICAgICAgIG1NYXRbNl0gPSAgengqbmMgKyB5czsKKyAgICAgICAgbU1hdFsxXSA9ICB4eSpuYyArIHpzOworICAgICAgICBtTWF0WzRdID0geSp5Km5jICsgIGM7CisgICAgICAgIG1NYXRbOV0gPSAgeXoqbmMgLSB4czsKKyAgICAgICAgbU1hdFsyXSA9ICB6eCpuYyAtIHlzOworICAgICAgICBtTWF0WzZdID0gIHl6Km5jICsgeHM7CisgICAgICAgIG1NYXRbOF0gPSB6KnoqbmMgKyAgYzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkUm90YXRlKGZsb2F0IHJvdCkgeworICAgICAgICBmbG9hdCBjLCBzOworICAgICAgICByb3QgKj0gKGZsb2F0KShqYXZhLmxhbmcuTWF0aC5QSSAvIDE4MC4wZik7CisgICAgICAgIGMgPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguY29zKHJvdCk7CisgICAgICAgIHMgPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguc2luKHJvdCk7CisgICAgICAgIG1NYXRbMF0gPSBjOworICAgICAgICBtTWF0WzFdID0gLXM7CisgICAgICAgIG1NYXRbM10gPSBzOworICAgICAgICBtTWF0WzRdID0gYzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkU2NhbGUoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBsb2FkSWRlbnRpdHkoKTsKKyAgICAgICAgbU1hdFswXSA9IHg7CisgICAgICAgIG1NYXRbNF0gPSB5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRTY2FsZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIGxvYWRJZGVudGl0eSgpOworICAgICAgICBtTWF0WzBdID0geDsKKyAgICAgICAgbU1hdFs0XSA9IHk7CisgICAgICAgIG1NYXRbOF0gPSB6OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRUcmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBsb2FkSWRlbnRpdHkoKTsKKyAgICAgICAgbU1hdFs2XSA9IHg7CisgICAgICAgIG1NYXRbN10gPSB5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRNdWx0aXBseShNYXRyaXgzZiBsaHMsIE1hdHJpeDNmIHJocykgeworICAgICAgICBmb3IgKGludCBpPTAgOyBpPDMgOyBpKyspIHsKKyAgICAgICAgICAgIGZsb2F0IHJpMCA9IDA7CisgICAgICAgICAgICBmbG9hdCByaTEgPSAwOworICAgICAgICAgICAgZmxvYXQgcmkyID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGo9MCA7IGo8MyA7IGorKykgeworICAgICAgICAgICAgICAgIGZsb2F0IHJoc19paiA9IHJocy5nZXQoaSxqKTsKKyAgICAgICAgICAgICAgICByaTAgKz0gbGhzLmdldChqLDApICogcmhzX2lqOworICAgICAgICAgICAgICAgIHJpMSArPSBsaHMuZ2V0KGosMSkgKiByaHNfaWo7CisgICAgICAgICAgICAgICAgcmkyICs9IGxocy5nZXQoaiwyKSAqIHJoc19pajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldChpLDAsIHJpMCk7CisgICAgICAgICAgICBzZXQoaSwxLCByaTEpOworICAgICAgICAgICAgc2V0KGksMiwgcmkyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG11bHRpcGx5KE1hdHJpeDNmIHJocykgeworICAgICAgICBNYXRyaXgzZiB0bXAgPSBuZXcgTWF0cml4M2YoKTsKKyAgICAgICAgdG1wLmxvYWRNdWx0aXBseSh0aGlzLCByaHMpOworICAgICAgICBsb2FkKHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHJvdGF0ZShmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgTWF0cml4M2YgdG1wID0gbmV3IE1hdHJpeDNmKCk7CisgICAgICAgIHRtcC5sb2FkUm90YXRlKHJvdCwgeCwgeSwgeik7CisgICAgICAgIG11bHRpcGx5KHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHJvdGF0ZShmbG9hdCByb3QpIHsKKyAgICAgICAgTWF0cml4M2YgdG1wID0gbmV3IE1hdHJpeDNmKCk7CisgICAgICAgIHRtcC5sb2FkUm90YXRlKHJvdCk7CisgICAgICAgIG11bHRpcGx5KHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNjYWxlKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgTWF0cml4M2YgdG1wID0gbmV3IE1hdHJpeDNmKCk7CisgICAgICAgIHRtcC5sb2FkU2NhbGUoeCwgeSk7CisgICAgICAgIG11bHRpcGx5KHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNjYWxlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgTWF0cml4M2YgdG1wID0gbmV3IE1hdHJpeDNmKCk7CisgICAgICAgIHRtcC5sb2FkU2NhbGUoeCwgeSwgeik7CisgICAgICAgIG11bHRpcGx5KHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIE1hdHJpeDNmIHRtcCA9IG5ldyBNYXRyaXgzZigpOworICAgICAgICB0bXAubG9hZFRyYW5zbGF0ZSh4LCB5KTsKKyAgICAgICAgbXVsdGlwbHkodG1wKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdHJhbnNwb3NlKCkgeworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICAgICAgICBmb3IoaW50IGogPSBpICsgMTsgaiA8IDM7ICsraikgeworICAgICAgICAgICAgICAgIGZsb2F0IHRlbXAgPSBtTWF0W2kqMyArIGpdOworICAgICAgICAgICAgICAgIG1NYXRbaSozICsgal0gPSBtTWF0W2oqMyArIGldOworICAgICAgICAgICAgICAgIG1NYXRbaiozICsgaV0gPSB0ZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgZmluYWwgZmxvYXRbXSBtTWF0OwogfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDRmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDRmLmphdmEKaW5kZXggZWJkNWJkZS4uNWZmYzIxYSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXg0Zi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4NGYuamF2YQpAQCAtMTc5LDYgKzE3OSw4NSBAQAogICAgICAgICB0bXAubG9hZFRyYW5zbGF0ZSh4LCB5LCB6KTsKICAgICAgICAgbXVsdGlwbHkodG1wKTsKICAgICB9CisgICAgcHJpdmF0ZSBmbG9hdCBjb21wdXRlQ29mYWN0b3IoaW50IGksIGludCBqKSB7CisgICAgICAgIGludCBjMCA9IChpKzEpICUgNDsKKyAgICAgICAgaW50IGMxID0gKGkrMikgJSA0OworICAgICAgICBpbnQgYzIgPSAoaSszKSAlIDQ7CisgICAgICAgIGludCByMCA9IChqKzEpICUgNDsKKyAgICAgICAgaW50IHIxID0gKGorMikgJSA0OworICAgICAgICBpbnQgcjIgPSAoaiszKSAlIDQ7CisKKyAgICAgICAgZmxvYXQgbWlub3IgPSAobU1hdFtjMCArIDQqcjBdICogKG1NYXRbYzEgKyA0KnIxXSAqIG1NYXRbYzIgKyA0KnIyXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXRbYzEgKyA0KnIyXSAqIG1NYXRbYzIgKyA0KnIxXSkpCisgICAgICAgICAgICAgICAgICAgICAtIChtTWF0W2MwICsgNCpyMV0gKiAobU1hdFtjMSArIDQqcjBdICogbU1hdFtjMiArIDQqcjJdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hdFtjMSArIDQqcjJdICogbU1hdFtjMiArIDQqcjBdKSkKKyAgICAgICAgICAgICAgICAgICAgICsgKG1NYXRbYzAgKyA0KnIyXSAqIChtTWF0W2MxICsgNCpyMF0gKiBtTWF0W2MyICsgNCpyMV0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWF0W2MxICsgNCpyMV0gKiBtTWF0W2MyICsgNCpyMF0pKTsKKworICAgICAgICBmbG9hdCBjb2ZhY3RvciA9ICgoaStqKSAmIDEpICE9IDAgPyAtbWlub3IgOiBtaW5vcjsKKyAgICAgICAgcmV0dXJuIGNvZmFjdG9yOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGludmVyc2UoKSB7CisKKyAgICAgICAgTWF0cml4NGYgcmVzdWx0ID0gbmV3IE1hdHJpeDRmKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgKytqKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0Lm1NYXRbNCppICsgal0gPSBjb21wdXRlQ29mYWN0b3IoaSwgaik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEb3QgcHJvZHVjdCBvZiAwdGggY29sdW1uIG9mIHNvdXJjZSBhbmQgMHRoIHJvdyBvZiByZXN1bHQKKyAgICAgICAgZmxvYXQgZGV0ID0gbU1hdFswXSpyZXN1bHQubU1hdFswXSArIG1NYXRbNF0qcmVzdWx0Lm1NYXRbMV0gKworICAgICAgICAgICAgICAgICAgICAgbU1hdFs4XSpyZXN1bHQubU1hdFsyXSArIG1NYXRbMTJdKnJlc3VsdC5tTWF0WzNdOworCisgICAgICAgIGlmIChNYXRoLmFicyhkZXQpIDwgMWUtNikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZGV0ID0gMS4wZiAvIGRldDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICAgICAgICBtTWF0W2ldID0gcmVzdWx0Lm1NYXRbaV0gKiBkZXQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpbnZlcnNlVHJhbnNwb3NlKCkgeworCisgICAgICAgIE1hdHJpeDRmIHJlc3VsdCA9IG5ldyBNYXRyaXg0ZigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7ICsraikgeworICAgICAgICAgICAgICAgIHJlc3VsdC5tTWF0WzQqaiArIGldID0gY29tcHV0ZUNvZmFjdG9yKGksIGopOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgZGV0ID0gbU1hdFswXSpyZXN1bHQubU1hdFswXSArIG1NYXRbNF0qcmVzdWx0Lm1NYXRbNF0gKworICAgICAgICAgICAgICAgICAgICAgbU1hdFs4XSpyZXN1bHQubU1hdFs4XSArIG1NYXRbMTJdKnJlc3VsdC5tTWF0WzEyXTsKKworICAgICAgICBpZiAoTWF0aC5hYnMoZGV0KSA8IDFlLTYpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGRldCA9IDEuMGYgLyBkZXQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgICAgICAgICAgbU1hdFtpXSA9IHJlc3VsdC5tTWF0W2ldICogZGV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdHJhbnNwb3NlKCkgeworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICAgICAgICBmb3IoaW50IGogPSBpICsgMTsgaiA8IDQ7ICsraikgeworICAgICAgICAgICAgICAgIGZsb2F0IHRlbXAgPSBtTWF0W2kqNCArIGpdOworICAgICAgICAgICAgICAgIG1NYXRbaSo0ICsgal0gPSBtTWF0W2oqNCArIGldOworICAgICAgICAgICAgICAgIG1NYXRbaio0ICsgaV0gPSB0ZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCiAgICAgZmluYWwgZmxvYXRbXSBtTWF0OwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NZXNoLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01lc2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzZiMmYxCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NZXNoLmphdmEKQEAgLTAsMCArMSw0NzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBNZXNoIGV4dGVuZHMgQmFzZU9iaiB7CisKKyAgICBBbGxvY2F0aW9uW10gbVZlcnRleEJ1ZmZlcnM7CisgICAgQWxsb2NhdGlvbltdIG1JbmRleEJ1ZmZlcnM7CisgICAgUHJpbWl0aXZlW10gbVByaW1pdGl2ZXM7CisKKyAgICBNZXNoKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRWZXJ0ZXhBbGxvY2F0aW9uQ291bnQoKSB7CisgICAgICAgIGlmKG1WZXJ0ZXhCdWZmZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtVmVydGV4QnVmZmVycy5sZW5ndGg7CisgICAgfQorICAgIHB1YmxpYyBBbGxvY2F0aW9uIGdldFZlcnRleEFsbG9jYXRpb24oaW50IHNsb3QpIHsKKyAgICAgICAgcmV0dXJuIG1WZXJ0ZXhCdWZmZXJzW3Nsb3RdOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UHJpbWl0aXZlQ291bnQoKSB7CisgICAgICAgIGlmKG1JbmRleEJ1ZmZlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1JbmRleEJ1ZmZlcnMubGVuZ3RoOworICAgIH0KKyAgICBwdWJsaWMgQWxsb2NhdGlvbiBnZXRJbmRleEFsbG9jYXRpb24oaW50IHNsb3QpIHsKKyAgICAgICAgcmV0dXJuIG1JbmRleEJ1ZmZlcnNbc2xvdF07CisgICAgfQorICAgIHB1YmxpYyBQcmltaXRpdmUgZ2V0UHJpbWl0aXZlKGludCBzbG90KSB7CisgICAgICAgIHJldHVybiBtUHJpbWl0aXZlc1tzbG90XTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIHVwZGF0ZUZyb21OYXRpdmUoKSB7CisgICAgICAgIG1OYW1lID0gbVJTLm5HZXROYW1lKG1JRCk7CisgICAgICAgIGludCB2dHhDb3VudCA9IG1SUy5uTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50KG1JRCk7CisgICAgICAgIGludCBpZHhDb3VudCA9IG1SUy5uTWVzaEdldEluZGV4Q291bnQobUlEKTsKKworICAgICAgICBpbnRbXSB2dHhJRHMgPSBuZXcgaW50W3Z0eENvdW50XTsKKyAgICAgICAgaW50W10gaWR4SURzID0gbmV3IGludFtpZHhDb3VudF07CisgICAgICAgIGludFtdIHByaW1pdGl2ZXMgPSBuZXcgaW50W2lkeENvdW50XTsKKworICAgICAgICBtUlMubk1lc2hHZXRWZXJ0aWNlcyhtSUQsIHZ0eElEcywgdnR4Q291bnQpOworICAgICAgICBtUlMubk1lc2hHZXRJbmRpY2VzKG1JRCwgaWR4SURzLCBwcmltaXRpdmVzLCBpZHhDb3VudCk7CisKKyAgICAgICAgbVZlcnRleEJ1ZmZlcnMgPSBuZXcgQWxsb2NhdGlvblt2dHhDb3VudF07CisgICAgICAgIG1JbmRleEJ1ZmZlcnMgPSBuZXcgQWxsb2NhdGlvbltpZHhDb3VudF07CisgICAgICAgIG1QcmltaXRpdmVzID0gbmV3IFByaW1pdGl2ZVtpZHhDb3VudF07CisKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHZ0eENvdW50OyBpICsrKSB7CisgICAgICAgICAgICBpZih2dHhJRHNbaV0gIT0gMCkgeworICAgICAgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2ldID0gbmV3IEFsbG9jYXRpb24odnR4SURzW2ldLCBtUlMpOworICAgICAgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2ldLnVwZGF0ZUZyb21OYXRpdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBpZHhDb3VudDsgaSArKykgeworICAgICAgICAgICAgaWYoaWR4SURzW2ldICE9IDApIHsKKyAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXJzW2ldID0gbmV3IEFsbG9jYXRpb24oaWR4SURzW2ldLCBtUlMpOworICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlcnNbaV0udXBkYXRlRnJvbU5hdGl2ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVByaW1pdGl2ZXNbaV0gPSBQcmltaXRpdmUudmFsdWVzKClbcHJpbWl0aXZlc1tpXV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgeworICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOworCisgICAgICAgIGNsYXNzIEVudHJ5IHsKKyAgICAgICAgICAgIFR5cGUgdDsKKyAgICAgICAgICAgIEVsZW1lbnQgZTsKKyAgICAgICAgICAgIGludCBzaXplOworICAgICAgICAgICAgUHJpbWl0aXZlIHByaW07CisgICAgICAgIH0KKworICAgICAgICBpbnQgbVZlcnRleFR5cGVDb3VudDsKKyAgICAgICAgRW50cnlbXSBtVmVydGV4VHlwZXM7CisgICAgICAgIFZlY3RvciBtSW5kZXhUeXBlczsKKworICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgICAgIG1SUyA9IHJzOworICAgICAgICAgICAgbVZlcnRleFR5cGVDb3VudCA9IDA7CisgICAgICAgICAgICBtVmVydGV4VHlwZXMgPSBuZXcgRW50cnlbMTZdOworICAgICAgICAgICAgbUluZGV4VHlwZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZFZlcnRleFR5cGUoVHlwZSB0KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChtVmVydGV4VHlwZUNvdW50ID49IG1WZXJ0ZXhUeXBlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNYXggdmVydGV4IHR5cGVzIGV4Y2VlZGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgYWRkZWRJbmRleCA9IG1WZXJ0ZXhUeXBlQ291bnQ7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0gPSBuZXcgRW50cnkoKTsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS50ID0gdDsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS5lID0gbnVsbDsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQrKzsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGRWZXJ0ZXhUeXBlKEVsZW1lbnQgZSwgaW50IHNpemUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG1WZXJ0ZXhUeXBlQ291bnQgPj0gbVZlcnRleFR5cGVzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1heCB2ZXJ0ZXggdHlwZXMgZXhjZWVkZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBhZGRlZEluZGV4ID0gbVZlcnRleFR5cGVDb3VudDsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XSA9IG5ldyBFbnRyeSgpOworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdLnQgPSBudWxsOworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdLmUgPSBlOworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdLnNpemUgPSBzaXplOworICAgICAgICAgICAgbVZlcnRleFR5cGVDb3VudCsrOworICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZEluZGV4VHlwZShUeXBlIHQsIFByaW1pdGl2ZSBwKSB7CisgICAgICAgICAgICBpbnQgYWRkZWRJbmRleCAgPSBtSW5kZXhUeXBlcy5zaXplKCk7CisgICAgICAgICAgICBFbnRyeSBpbmRleFR5cGUgPSBuZXcgRW50cnkoKTsKKyAgICAgICAgICAgIGluZGV4VHlwZS50ID0gdDsKKyAgICAgICAgICAgIGluZGV4VHlwZS5lID0gbnVsbDsKKyAgICAgICAgICAgIGluZGV4VHlwZS5zaXplID0gMDsKKyAgICAgICAgICAgIGluZGV4VHlwZS5wcmltID0gcDsKKyAgICAgICAgICAgIG1JbmRleFR5cGVzLmFkZEVsZW1lbnQoaW5kZXhUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGRJbmRleFR5cGUoUHJpbWl0aXZlIHApIHsKKyAgICAgICAgICAgIGludCBhZGRlZEluZGV4ICA9IG1JbmRleFR5cGVzLnNpemUoKTsKKyAgICAgICAgICAgIEVudHJ5IGluZGV4VHlwZSA9IG5ldyBFbnRyeSgpOworICAgICAgICAgICAgaW5kZXhUeXBlLnQgPSBudWxsOworICAgICAgICAgICAgaW5kZXhUeXBlLmUgPSBudWxsOworICAgICAgICAgICAgaW5kZXhUeXBlLnNpemUgPSAwOworICAgICAgICAgICAgaW5kZXhUeXBlLnByaW0gPSBwOworICAgICAgICAgICAgbUluZGV4VHlwZXMuYWRkRWxlbWVudChpbmRleFR5cGUpOworICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZEluZGV4VHlwZShFbGVtZW50IGUsIGludCBzaXplLCBQcmltaXRpdmUgcCkgeworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggID0gbUluZGV4VHlwZXMuc2l6ZSgpOworICAgICAgICAgICAgRW50cnkgaW5kZXhUeXBlID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBpbmRleFR5cGUudCA9IG51bGw7CisgICAgICAgICAgICBpbmRleFR5cGUuZSA9IGU7CisgICAgICAgICAgICBpbmRleFR5cGUuc2l6ZSA9IHNpemU7CisgICAgICAgICAgICBpbmRleFR5cGUucHJpbSA9IHA7CisgICAgICAgICAgICBtSW5kZXhUeXBlcy5hZGRFbGVtZW50KGluZGV4VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIFR5cGUgbmV3VHlwZShFbGVtZW50IGUsIGludCBzaXplKSB7CisgICAgICAgICAgICBUeXBlLkJ1aWxkZXIgdGIgPSBuZXcgVHlwZS5CdWlsZGVyKG1SUywgZSk7CisgICAgICAgICAgICB0Yi5hZGQoRGltZW5zaW9uLlgsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIHRiLmNyZWF0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBNZXNoIGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgQnVpbGRlciBiKSB7CisKKyAgICAgICAgICAgIGludCBpZCA9IHJzLm5NZXNoQ3JlYXRlKGIubVZlcnRleFR5cGVDb3VudCwgYi5tSW5kZXhUeXBlcy5zaXplKCkpOworICAgICAgICAgICAgTWVzaCBuZXdNZXNoID0gbmV3IE1lc2goaWQsIHJzKTsKKyAgICAgICAgICAgIG5ld01lc2gubUluZGV4QnVmZmVycyA9IG5ldyBBbGxvY2F0aW9uW2IubUluZGV4VHlwZXMuc2l6ZSgpXTsKKyAgICAgICAgICAgIG5ld01lc2gubVByaW1pdGl2ZXMgPSBuZXcgUHJpbWl0aXZlW2IubUluZGV4VHlwZXMuc2l6ZSgpXTsKKyAgICAgICAgICAgIG5ld01lc2gubVZlcnRleEJ1ZmZlcnMgPSBuZXcgQWxsb2NhdGlvbltiLm1WZXJ0ZXhUeXBlQ291bnRdOworCisgICAgICAgICAgICBmb3IoaW50IGN0ID0gMDsgY3QgPCBiLm1JbmRleFR5cGVzLnNpemUoKTsgY3QgKyspIHsKKyAgICAgICAgICAgICAgICBBbGxvY2F0aW9uIGFsbG9jID0gbnVsbDsKKyAgICAgICAgICAgICAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSliLm1JbmRleFR5cGVzLmVsZW1lbnRBdChjdCk7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQocnMsIGVudHJ5LnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKGVudHJ5LmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQocnMsIGVudHJ5LmUsIGVudHJ5LnNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgYWxsb2NJRCA9IChhbGxvYyA9PSBudWxsKSA/IDAgOiBhbGxvYy5nZXRJRCgpOworICAgICAgICAgICAgICAgIHJzLm5NZXNoQmluZEluZGV4KGlkLCBhbGxvY0lELCBlbnRyeS5wcmltLm1JRCwgY3QpOworICAgICAgICAgICAgICAgIG5ld01lc2gubUluZGV4QnVmZmVyc1tjdF0gPSBhbGxvYzsKKyAgICAgICAgICAgICAgICBuZXdNZXNoLm1QcmltaXRpdmVzW2N0XSA9IGVudHJ5LnByaW07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcihpbnQgY3QgPSAwOyBjdCA8IGIubVZlcnRleFR5cGVDb3VudDsgY3QgKyspIHsKKyAgICAgICAgICAgICAgICBBbGxvY2F0aW9uIGFsbG9jID0gbnVsbDsKKyAgICAgICAgICAgICAgICBFbnRyeSBlbnRyeSA9IGIubVZlcnRleFR5cGVzW2N0XTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChycywgZW50cnkudCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGVudHJ5LmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQocnMsIGVudHJ5LmUsIGVudHJ5LnNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBycy5uTWVzaEJpbmRWZXJ0ZXgoaWQsIGFsbG9jLmdldElEKCksIGN0KTsKKyAgICAgICAgICAgICAgICBuZXdNZXNoLm1WZXJ0ZXhCdWZmZXJzW2N0XSA9IGFsbG9jOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3TWVzaDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZXNoIGNyZWF0ZSgpIHsKKyAgICAgICAgICAgIG1SUy52YWxpZGF0ZSgpOworICAgICAgICAgICAgTWVzaCBzbSA9IGludGVybmFsQ3JlYXRlKG1SUywgdGhpcyk7CisgICAgICAgICAgICByZXR1cm4gc207CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFsbG9jYXRpb25CdWlsZGVyIHsKKyAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKKworICAgICAgICBjbGFzcyBFbnRyeSB7CisgICAgICAgICAgICBBbGxvY2F0aW9uIGE7CisgICAgICAgICAgICBQcmltaXRpdmUgcHJpbTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBtVmVydGV4VHlwZUNvdW50OworICAgICAgICBFbnRyeVtdIG1WZXJ0ZXhUeXBlczsKKworICAgICAgICBWZWN0b3IgbUluZGV4VHlwZXM7CisKKyAgICAgICAgcHVibGljIEFsbG9jYXRpb25CdWlsZGVyKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICAgICAgbVJTID0gcnM7CisgICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50ID0gMDsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlcyA9IG5ldyBFbnRyeVsxNl07CisgICAgICAgICAgICBtSW5kZXhUeXBlcyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkVmVydGV4QWxsb2NhdGlvbihBbGxvY2F0aW9uIGEpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG1WZXJ0ZXhUeXBlQ291bnQgPj0gbVZlcnRleFR5cGVzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1heCB2ZXJ0ZXggdHlwZXMgZXhjZWVkZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBhZGRlZEluZGV4ID0gbVZlcnRleFR5cGVDb3VudDsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XSA9IG5ldyBFbnRyeSgpOworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdLmEgPSBhOworICAgICAgICAgICAgbVZlcnRleFR5cGVDb3VudCsrOworICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZEluZGV4QWxsb2NhdGlvbihBbGxvY2F0aW9uIGEsIFByaW1pdGl2ZSBwKSB7CisgICAgICAgICAgICBpbnQgYWRkZWRJbmRleCAgPSBtSW5kZXhUeXBlcy5zaXplKCk7CisgICAgICAgICAgICBFbnRyeSBpbmRleFR5cGUgPSBuZXcgRW50cnkoKTsKKyAgICAgICAgICAgIGluZGV4VHlwZS5hID0gYTsKKyAgICAgICAgICAgIGluZGV4VHlwZS5wcmltID0gcDsKKyAgICAgICAgICAgIG1JbmRleFR5cGVzLmFkZEVsZW1lbnQoaW5kZXhUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGRJbmRleFR5cGUoUHJpbWl0aXZlIHApIHsKKyAgICAgICAgICAgIGludCBhZGRlZEluZGV4ICA9IG1JbmRleFR5cGVzLnNpemUoKTsKKyAgICAgICAgICAgIEVudHJ5IGluZGV4VHlwZSA9IG5ldyBFbnRyeSgpOworICAgICAgICAgICAgaW5kZXhUeXBlLmEgPSBudWxsOworICAgICAgICAgICAgaW5kZXhUeXBlLnByaW0gPSBwOworICAgICAgICAgICAgbUluZGV4VHlwZXMuYWRkRWxlbWVudChpbmRleFR5cGUpOworICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgc3luY2hyb25pemVkIE1lc2ggaW50ZXJuYWxDcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBBbGxvY2F0aW9uQnVpbGRlciBiKSB7CisKKyAgICAgICAgICAgIGludCBpZCA9IHJzLm5NZXNoQ3JlYXRlKGIubVZlcnRleFR5cGVDb3VudCwgYi5tSW5kZXhUeXBlcy5zaXplKCkpOworICAgICAgICAgICAgTWVzaCBuZXdNZXNoID0gbmV3IE1lc2goaWQsIHJzKTsKKyAgICAgICAgICAgIG5ld01lc2gubUluZGV4QnVmZmVycyA9IG5ldyBBbGxvY2F0aW9uW2IubUluZGV4VHlwZXMuc2l6ZSgpXTsKKyAgICAgICAgICAgIG5ld01lc2gubVByaW1pdGl2ZXMgPSBuZXcgUHJpbWl0aXZlW2IubUluZGV4VHlwZXMuc2l6ZSgpXTsKKyAgICAgICAgICAgIG5ld01lc2gubVZlcnRleEJ1ZmZlcnMgPSBuZXcgQWxsb2NhdGlvbltiLm1WZXJ0ZXhUeXBlQ291bnRdOworCisgICAgICAgICAgICBmb3IoaW50IGN0ID0gMDsgY3QgPCBiLm1JbmRleFR5cGVzLnNpemUoKTsgY3QgKyspIHsKKyAgICAgICAgICAgICAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSliLm1JbmRleFR5cGVzLmVsZW1lbnRBdChjdCk7CisgICAgICAgICAgICAgICAgaW50IGFsbG9jSUQgPSAoZW50cnkuYSA9PSBudWxsKSA/IDAgOiBlbnRyeS5hLmdldElEKCk7CisgICAgICAgICAgICAgICAgcnMubk1lc2hCaW5kSW5kZXgoaWQsIGFsbG9jSUQsIGVudHJ5LnByaW0ubUlELCBjdCk7CisgICAgICAgICAgICAgICAgbmV3TWVzaC5tSW5kZXhCdWZmZXJzW2N0XSA9IGVudHJ5LmE7CisgICAgICAgICAgICAgICAgbmV3TWVzaC5tUHJpbWl0aXZlc1tjdF0gPSBlbnRyeS5wcmltOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoaW50IGN0ID0gMDsgY3QgPCBiLm1WZXJ0ZXhUeXBlQ291bnQ7IGN0ICsrKSB7CisgICAgICAgICAgICAgICAgRW50cnkgZW50cnkgPSBiLm1WZXJ0ZXhUeXBlc1tjdF07CisgICAgICAgICAgICAgICAgcnMubk1lc2hCaW5kVmVydGV4KGlkLCBlbnRyeS5hLm1JRCwgY3QpOworICAgICAgICAgICAgICAgIG5ld01lc2gubVZlcnRleEJ1ZmZlcnNbY3RdID0gZW50cnkuYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ld01lc2g7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWVzaCBjcmVhdGUoKSB7CisgICAgICAgICAgICBtUlMudmFsaWRhdGUoKTsKKyAgICAgICAgICAgIE1lc2ggc20gPSBpbnRlcm5hbENyZWF0ZShtUlMsIHRoaXMpOworICAgICAgICAgICAgcmV0dXJuIHNtOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRyaWFuZ2xlTWVzaEJ1aWxkZXIgeworICAgICAgICBmbG9hdCBtVnR4RGF0YVtdOworICAgICAgICBpbnQgbVZ0eENvdW50OworICAgICAgICBzaG9ydCBtSW5kZXhEYXRhW107CisgICAgICAgIGludCBtSW5kZXhDb3VudDsKKyAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKKyAgICAgICAgRWxlbWVudCBtRWxlbWVudDsKKworICAgICAgICBmbG9hdCBtTlggPSAwOworICAgICAgICBmbG9hdCBtTlkgPSAwOworICAgICAgICBmbG9hdCBtTlogPSAtMTsKKyAgICAgICAgZmxvYXQgbVMwID0gMDsKKyAgICAgICAgZmxvYXQgbVQwID0gMDsKKyAgICAgICAgZmxvYXQgbVIgPSAxOworICAgICAgICBmbG9hdCBtRyA9IDE7CisgICAgICAgIGZsb2F0IG1CID0gMTsKKyAgICAgICAgZmxvYXQgbUEgPSAxOworCisgICAgICAgIGludCBtVnR4U2l6ZTsKKyAgICAgICAgaW50IG1GbGFnczsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xPUiA9IDB4MDAwMTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9STUFMID0gMHgwMDAyOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUVVJFXzAgPSAweDAxMDA7CisKKyAgICAgICAgcHVibGljIFRyaWFuZ2xlTWVzaEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzLCBpbnQgdnR4U2l6ZSwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBtUlMgPSByczsKKyAgICAgICAgICAgIG1WdHhDb3VudCA9IDA7CisgICAgICAgICAgICBtSW5kZXhDb3VudCA9IDA7CisgICAgICAgICAgICBtVnR4RGF0YSA9IG5ldyBmbG9hdFsxMjhdOworICAgICAgICAgICAgbUluZGV4RGF0YSA9IG5ldyBzaG9ydFsxMjhdOworICAgICAgICAgICAgbVZ0eFNpemUgPSB2dHhTaXplOworICAgICAgICAgICAgbUZsYWdzID0gZmxhZ3M7CisKKyAgICAgICAgICAgIGlmICh2dHhTaXplIDwgMiB8fCB2dHhTaXplID4gMykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlZlcnRleCBzaXplIG91dCBvZiByYW5nZS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBtYWtlU3BhY2UoaW50IGNvdW50KSB7CisgICAgICAgICAgICBpZiAoKG1WdHhDb3VudCArIGNvdW50KSA+PSBtVnR4RGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB0W10gPSBuZXcgZmxvYXRbbVZ0eERhdGEubGVuZ3RoICogMl07CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtVnR4RGF0YSwgMCwgdCwgMCwgbVZ0eERhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YSA9IHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgbGF0Y2goKSB7CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIENPTE9SKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbWFrZVNwYWNlKDQpOworICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1SOworICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1HOworICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1COworICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1BOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBURVhUVVJFXzApICE9IDApIHsKKyAgICAgICAgICAgICAgICBtYWtlU3BhY2UoMik7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbVMwOworICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1UMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgTk9STUFMKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbWFrZVNwYWNlKDMpOworICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1OWDsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtTlk7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbU5aOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkVmVydGV4KGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgICAgIGlmIChtVnR4U2l6ZSAhPSAyKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYWtlU3BhY2UoMik7CisgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB4OworICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geTsKKyAgICAgICAgICAgIGxhdGNoKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGRWZXJ0ZXgoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICAgICAgaWYgKG1WdHhTaXplICE9IDMpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1ha2VTcGFjZSgzKTsKKyAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHg7CisgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB5OworICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gejsKKyAgICAgICAgICAgIGxhdGNoKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0dXJlKGZsb2F0IHMsIGZsb2F0IHQpIHsKKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgVEVYVFVSRV8wKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUzAgPSBzOworICAgICAgICAgICAgbVQwID0gdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5vcm1hbChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIE5PUk1BTCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU5YID0geDsKKyAgICAgICAgICAgIG1OWSA9IHk7CisgICAgICAgICAgICBtTlogPSB6OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkgeworICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBDT0xPUikgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVIgPSByOworICAgICAgICAgICAgbUcgPSBnOworICAgICAgICAgICAgbUIgPSBiOworICAgICAgICAgICAgbUEgPSBhOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkVHJpYW5nbGUoaW50IGlkeDEsIGludCBpZHgyLCBpbnQgaWR4MykgeworICAgICAgICAgICAgaWYoKGlkeDEgPj0gbVZ0eENvdW50KSB8fCAoaWR4MSA8IDApIHx8CisgICAgICAgICAgICAgICAoaWR4MiA+PSBtVnR4Q291bnQpIHx8IChpZHgyIDwgMCkgfHwKKyAgICAgICAgICAgICAgIChpZHgzID49IG1WdHhDb3VudCkgfHwgKGlkeDMgPCAwKSkgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW5kZXggcHJvdmlkZWQgZ3JlYXRlciB0aGFuIHZlcnRleCBjb3VudC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgobUluZGV4Q291bnQgKyAzKSA+PSBtSW5kZXhEYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHNob3J0IHRbXSA9IG5ldyBzaG9ydFttSW5kZXhEYXRhLmxlbmd0aCAqIDJdOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobUluZGV4RGF0YSwgMCwgdCwgMCwgbUluZGV4RGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIG1JbmRleERhdGEgPSB0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUluZGV4RGF0YVttSW5kZXhDb3VudCsrXSA9IChzaG9ydClpZHgxOworICAgICAgICAgICAgbUluZGV4RGF0YVttSW5kZXhDb3VudCsrXSA9IChzaG9ydClpZHgyOworICAgICAgICAgICAgbUluZGV4RGF0YVttSW5kZXhDb3VudCsrXSA9IChzaG9ydClpZHgzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1lc2ggY3JlYXRlKGJvb2xlYW4gdXBsb2FkVG9CdWZmZXJPYmplY3QpIHsKKyAgICAgICAgICAgIEVsZW1lbnQuQnVpbGRlciBiID0gbmV3IEVsZW1lbnQuQnVpbGRlcihtUlMpOworICAgICAgICAgICAgaW50IGZsb2F0Q291bnQgPSBtVnR4U2l6ZTsKKyAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuY3JlYXRlVmVjdG9yKG1SUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVnR4U2l6ZSksICJwb3NpdGlvbiIpOworICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBDT0xPUikgIT0gMCkgeworICAgICAgICAgICAgICAgIGZsb2F0Q291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LkYzMl80KG1SUyksICJjb2xvciIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBURVhUVVJFXzApICE9IDApIHsKKyAgICAgICAgICAgICAgICBmbG9hdENvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5GMzJfMihtUlMpLCAidGV4dHVyZTAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgTk9STUFMKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZmxvYXRDb3VudCArPSAzOworICAgICAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuRjMyXzMobVJTKSwgIm5vcm1hbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUVsZW1lbnQgPSBiLmNyZWF0ZSgpOworCisgICAgICAgICAgICBCdWlsZGVyIHNtYiA9IG5ldyBCdWlsZGVyKG1SUyk7CisgICAgICAgICAgICBzbWIuYWRkVmVydGV4VHlwZShtRWxlbWVudCwgbVZ0eENvdW50IC8gZmxvYXRDb3VudCk7CisgICAgICAgICAgICBzbWIuYWRkSW5kZXhUeXBlKEVsZW1lbnQuVTE2KG1SUyksIG1JbmRleENvdW50LCBQcmltaXRpdmUuVFJJQU5HTEUpOworCisgICAgICAgICAgICBNZXNoIHNtID0gc21iLmNyZWF0ZSgpOworCisgICAgICAgICAgICBzbS5nZXRWZXJ0ZXhBbGxvY2F0aW9uKDApLmRhdGEobVZ0eERhdGEpOworICAgICAgICAgICAgaWYodXBsb2FkVG9CdWZmZXJPYmplY3QpIHsKKyAgICAgICAgICAgICAgICBzbS5nZXRWZXJ0ZXhBbGxvY2F0aW9uKDApLnVwbG9hZFRvQnVmZmVyT2JqZWN0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNtLmdldEluZGV4QWxsb2NhdGlvbigwKS5kYXRhKG1JbmRleERhdGEpOworICAgICAgICAgICAgc20uZ2V0SW5kZXhBbGxvY2F0aW9uKDApLnVwbG9hZFRvQnVmZmVyT2JqZWN0KCk7CisKKyAgICAgICAgICAgIHJldHVybiBzbTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW0uamF2YQppbmRleCAxNjE0ZWM1Li5mZmNkYmJjNSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtLmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiBwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwogCiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCkBAIC0zOCw4ICs0Myw3IEBACiAgICAgU3RyaW5nIG1TaGFkZXI7CiAKICAgICBQcm9ncmFtKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgYmluZENvbnN0YW50cyhBbGxvY2F0aW9uIGEsIGludCBzbG90KSB7CkBAIC05MSw4ICs5NSw0NyBAQAogICAgICAgICAgICAgbVRleHR1cmVDb3VudCA9IDA7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTaGFkZXIoU3RyaW5nIHMpIHsKKyAgICAgICAgcHVibGljIEJhc2VQcm9ncmFtQnVpbGRlciBzZXRTaGFkZXIoU3RyaW5nIHMpIHsKICAgICAgICAgICAgIG1TaGFkZXIgPSBzOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQmFzZVByb2dyYW1CdWlsZGVyIHNldFNoYWRlcihSZXNvdXJjZXMgcmVzb3VyY2VzLCBpbnQgcmVzb3VyY2VJRCkgeworICAgICAgICAgICAgYnl0ZVtdIHN0cjsKKyAgICAgICAgICAgIGludCBzdHJMZW5ndGg7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHJlc291cmNlcy5vcGVuUmF3UmVzb3VyY2UocmVzb3VyY2VJRCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0ciA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICAgICAgICAgICAgICBzdHJMZW5ndGggPSAwOworICAgICAgICAgICAgICAgICAgICB3aGlsZSh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNMZWZ0ID0gc3RyLmxlbmd0aCAtIHN0ckxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc0xlZnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWYyID0gbmV3IGJ5dGVbc3RyLmxlbmd0aCAqIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc3RyLCAwLCBidWYyLCAwLCBzdHIubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBidWYyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzTGVmdCA9IHN0ci5sZW5ndGggLSBzdHJMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gaXMucmVhZChzdHIsIHN0ckxlbmd0aCwgYnl0ZXNMZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyTGVuZ3RoICs9IGJ5dGVzUmVhZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TaGFkZXIgPSBuZXcgU3RyaW5nKHN0ciwgMCwgc3RyTGVuZ3RoLCAiVVRGLTgiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKCJSZW5kZXJzY3JpcHQgc2hhZGVyIGNyZWF0aW9uIiwgIkNvdWxkIG5vdCBkZWNvZGUgc2hhZGVyIHN0cmluZyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGFkZElucHV0KEVsZW1lbnQgZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CkBAIC0xMTEsNiArMTU0LDEzIEBACiAgICAgICAgICAgICBtT3V0cHV0c1ttT3V0cHV0Q291bnQrK10gPSBlOwogICAgICAgICB9CiAKKyAgICAgICAgdm9pZCByZXNldENvbnN0YW50KCkgeworICAgICAgICAgICAgbUNvbnN0YW50Q291bnQgPSAwOworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IE1BWF9DT05TVEFOVDsgaSArKykgeworICAgICAgICAgICAgICAgIG1Db25zdGFudHNbaV0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgcHVibGljIGludCBhZGRDb25zdGFudChUeXBlIHQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogICAgICAgICAgICAgLy8gU2hvdWxkIGNoZWNrIGZvciBjb25zaXN0YW50IGFuZCBub24tY29uZmxpY3RpbmcgbmFtZXMuLi4KICAgICAgICAgICAgIGlmKG1Db25zdGFudENvdW50ID49IE1BWF9DT05TVEFOVCkgewpAQCAtMTIwLDEyICsxNzAsMTMgQEAKICAgICAgICAgICAgIHJldHVybiBtQ29uc3RhbnRDb3VudCsrOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dHVyZUNvdW50KGludCBjb3VudCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIHB1YmxpYyBCYXNlUHJvZ3JhbUJ1aWxkZXIgc2V0VGV4dHVyZUNvdW50KGludCBjb3VudCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAvLyBTaG91bGQgY2hlY2sgZm9yIGNvbnNpc3RhbnQgYW5kIG5vbi1jb25mbGljdGluZyBuYW1lcy4uLgotICAgICAgICAgICAgaWYoY291bnQgPj0gTUFYX0NPTlNUQU5UKSB7CisgICAgICAgICAgICBpZihjb3VudCA+PSBNQVhfVEVYVFVSRSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1heCB0ZXh0dXJlIGNvdW50IGV4Y2VlZGVkLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVRleHR1cmVDb3VudCA9IGNvdW50OworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0UHJvZ3JhbShQcm9ncmFtIHApIHsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbUZyYWdtZW50LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1GcmFnbWVudC5qYXZhCmluZGV4IDVlMDRmMGMuLjg4NThiNzQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbUZyYWdtZW50LmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtRnJhZ21lbnQuamF2YQpAQCAtNTUsMTcgKzU1LDE4IEBACiAgICAgICAgICAgICB0bXBbaWR4KytdID0gMzsKICAgICAgICAgICAgIHRtcFtpZHgrK10gPSBtVGV4dHVyZUNvdW50OwogCi0gICAgICAgICAgICBpbnQgaWQgPSBtUlMublByb2dyYW1GcmFnbWVudENyZWF0ZTIobVNoYWRlciwgdG1wKTsKKyAgICAgICAgICAgIGludCBpZCA9IG1SUy5uUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKG1TaGFkZXIsIHRtcCk7CiAgICAgICAgICAgICBQcm9ncmFtRnJhZ21lbnQgcGYgPSBuZXcgUHJvZ3JhbUZyYWdtZW50KGlkLCBtUlMpOwogICAgICAgICAgICAgaW5pdFByb2dyYW0ocGYpOwogICAgICAgICAgICAgcmV0dXJuIHBmOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgZXh0ZW5kcyBTaGFkZXJCdWlsZGVyIHsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1RFWFRVUkUgPSAyOwotICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOworICAgICAgICBpbnQgbU51bVRleHR1cmVzOwogICAgICAgICBib29sZWFuIG1Qb2ludFNwcml0ZUVuYWJsZTsKKyAgICAgICAgYm9vbGVhbiBtVmFyeWluZ0NvbG9yRW5hYmxlOwogCiAgICAgICAgIHB1YmxpYyBlbnVtIEVudk1vZGUgewogICAgICAgICAgICAgUkVQTEFDRSAoMSksCkBAIC0xMDAsMzkgKzEwMSwxMjYgQEAKICAgICAgICAgfQogICAgICAgICBTbG90W10gbVNsb3RzOwogCisgICAgICAgIHByaXZhdGUgdm9pZCBidWlsZFNoYWRlclN0cmluZygpIHsKKyAgICAgICAgICAgIG1TaGFkZXIgID0gIi8vcnNfc2hhZGVyX2ludGVybmFsXG4iOworICAgICAgICAgICAgbVNoYWRlciArPSAidmFyeWluZyBsb3dwIHZlYzQgdmFyQ29sb3I7XG4iOworICAgICAgICAgICAgbVNoYWRlciArPSAidmFyeWluZyB2ZWMyIHZhclRleDA7XG4iOworCisgICAgICAgICAgICBtU2hhZGVyICs9ICJ2b2lkIG1haW4oKSB7XG4iOworICAgICAgICAgICAgaWYgKG1WYXJ5aW5nQ29sb3JFbmFibGUpIHsKKyAgICAgICAgICAgICAgICBtU2hhZGVyICs9ICIgIGxvd3AgdmVjNCBjb2wgPSB2YXJDb2xvcjtcbiI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TaGFkZXIgKz0gIiAgbG93cCB2ZWM0IGNvbCA9IFVOSV9Db2xvcjtcbiI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtTnVtVGV4dHVyZXMgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChtUG9pbnRTcHJpdGVFbmFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNoYWRlciArPSAiICB2ZWMyIHQwID0gZ2xfUG9pbnRDb29yZDtcbiI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVNoYWRlciArPSAiICB2ZWMyIHQwID0gdmFyVGV4MC54eTtcbiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbU51bVRleHR1cmVzOyBpICsrKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoKG1TbG90c1tpXS5lbnYpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFJFUExBQ0U6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobVNsb3RzW2ldLmZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFMUEhBOgorICAgICAgICAgICAgICAgICAgICAgICAgbVNoYWRlciArPSAiICBjb2wuYSA9IHRleHR1cmUyRChVTklfVGV4MCwgdDApLmE7XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTFVNSU5BTkNFX0FMUEhBOgorICAgICAgICAgICAgICAgICAgICAgICAgbVNoYWRlciArPSAiICBjb2wucmdiYSA9IHRleHR1cmUyRChVTklfVGV4MCwgdDApLnJnYmE7XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUkdCOgorICAgICAgICAgICAgICAgICAgICAgICAgbVNoYWRlciArPSAiICBjb2wucmdiID0gdGV4dHVyZTJEKFVOSV9UZXgwLCB0MCkucmdiO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJHQkE6CisgICAgICAgICAgICAgICAgICAgICAgICBtU2hhZGVyICs9ICIgIGNvbC5yZ2JhID0gdGV4dHVyZTJEKFVOSV9UZXgwLCB0MCkucmdiYTtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1PRFVMQVRFOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1TbG90c1tpXS5mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTFBIQToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIgKz0gIiAgY29sLmEgKj0gdGV4dHVyZTJEKFVOSV9UZXgwLCB0MCkuYTtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMVU1JTkFOQ0VfQUxQSEE6CisgICAgICAgICAgICAgICAgICAgICAgICBtU2hhZGVyICs9ICIgIGNvbC5yZ2JhICo9IHRleHR1cmUyRChVTklfVGV4MCwgdDApLnJnYmE7XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUkdCOgorICAgICAgICAgICAgICAgICAgICAgICAgbVNoYWRlciArPSAiICBjb2wucmdiICo9IHRleHR1cmUyRChVTklfVGV4MCwgdDApLnJnYjtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSR0JBOgorICAgICAgICAgICAgICAgICAgICAgICAgbVNoYWRlciArPSAiICBjb2wucmdiYSAqPSB0ZXh0dXJlMkQoVU5JX1RleDAsIHQwKS5yZ2JhO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgREVDQUw6CisgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIgKz0gIiAgY29sID0gdGV4dHVyZTJEKFVOSV9UZXgwLCB0MCk7XG4iOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1TaGFkZXIgKz0gIiAgZ2xfRnJhZ0NvbG9yID0gY29sO1xuIjsKKyAgICAgICAgICAgIG1TaGFkZXIgKz0gIn1cbiI7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgICAgIHN1cGVyKHJzKTsKICAgICAgICAgICAgIG1SUyA9IHJzOwogICAgICAgICAgICAgbVNsb3RzID0gbmV3IFNsb3RbTUFYX1RFWFRVUkVdOwogICAgICAgICAgICAgbVBvaW50U3ByaXRlRW5hYmxlID0gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0dXJlKEVudk1vZGUgZW52LCBGb3JtYXQgZm10LCBpbnQgc2xvdCkKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0VGV4dHVyZShFbnZNb2RlIGVudiwgRm9ybWF0IGZtdCwgaW50IHNsb3QpCiAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgICAgIGlmKChzbG90IDwgMCkgfHwgKHNsb3QgPj0gTUFYX1RFWFRVUkUpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTUFYX1RFWFRVUkUgZXhjZWVkZWQuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtU2xvdHNbc2xvdF0gPSBuZXcgU2xvdChlbnYsIGZtdCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBvaW50U3ByaXRlVGV4Q29vcmRpbmF0ZVJlcGxhY2VtZW50KGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBvaW50U3ByaXRlVGV4Q29vcmRpbmF0ZVJlcGxhY2VtZW50KGJvb2xlYW4gZW5hYmxlKSB7CiAgICAgICAgICAgICBtUG9pbnRTcHJpdGVFbmFibGUgPSBlbmFibGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFZhcnlpbmdDb2xvcihib29sZWFuIGVuYWJsZSkgeworICAgICAgICAgICAgbVZhcnlpbmdDb2xvckVuYWJsZSA9IGVuYWJsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBQcm9ncmFtRnJhZ21lbnQgY3JlYXRlKCkgewotICAgICAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICBpbnRbXSB0bXAgPSBuZXcgaW50W01BWF9URVhUVVJFICogMiArIDFdOwotICAgICAgICAgICAgaWYgKG1TbG90c1swXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdG1wWzBdID0gbVNsb3RzWzBdLmVudi5tSUQ7Ci0gICAgICAgICAgICAgICAgdG1wWzFdID0gbVNsb3RzWzBdLmZvcm1hdC5tSUQ7CisgICAgICAgICAgICBtTnVtVGV4dHVyZXMgPSAwOworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IE1BWF9URVhUVVJFOyBpICsrKSB7CisgICAgICAgICAgICAgICAgaWYobVNsb3RzW2ldICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbU51bVRleHR1cmVzICsrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU2xvdHNbMV0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRtcFsyXSA9IG1TbG90c1sxXS5lbnYubUlEOwotICAgICAgICAgICAgICAgIHRtcFszXSA9IG1TbG90c1sxXS5mb3JtYXQubUlEOworICAgICAgICAgICAgcmVzZXRDb25zdGFudCgpOworICAgICAgICAgICAgYnVpbGRTaGFkZXJTdHJpbmcoKTsKKyAgICAgICAgICAgIFR5cGUgY29uc3RUeXBlID0gbnVsbDsKKyAgICAgICAgICAgIGlmICghbVZhcnlpbmdDb2xvckVuYWJsZSkgeworICAgICAgICAgICAgICAgIEVsZW1lbnQuQnVpbGRlciBiID0gbmV3IEVsZW1lbnQuQnVpbGRlcihtUlMpOworICAgICAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuRjMyXzQobVJTKSwgIkNvbG9yIik7CisgICAgICAgICAgICAgICAgVHlwZS5CdWlsZGVyIHR5cGVCdWlsZGVyID0gbmV3IFR5cGUuQnVpbGRlcihtUlMsIGIuY3JlYXRlKCkpOworICAgICAgICAgICAgICAgIHR5cGVCdWlsZGVyLmFkZChEaW1lbnNpb24uWCwgMSk7CisgICAgICAgICAgICAgICAgY29uc3RUeXBlID0gdHlwZUJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgICAgICAgICAgYWRkQ29uc3RhbnQoY29uc3RUeXBlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRtcFs0XSA9IG1Qb2ludFNwcml0ZUVuYWJsZSA/IDEgOiAwOwotICAgICAgICAgICAgaW50IGlkID0gbVJTLm5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUodG1wKTsKLSAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudCBwZiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQoaWQsIG1SUyk7CisgICAgICAgICAgICBzZXRUZXh0dXJlQ291bnQobU51bVRleHR1cmVzKTsKKworICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50IHBmID0gc3VwZXIuY3JlYXRlKCk7CiAgICAgICAgICAgICBwZi5tVGV4dHVyZUNvdW50ID0gTUFYX1RFWFRVUkU7CisgICAgICAgICAgICBpZiAoIW1WYXJ5aW5nQ29sb3JFbmFibGUpIHsKKyAgICAgICAgICAgICAgICBBbGxvY2F0aW9uIGNvbnN0YW50RGF0YSA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQobVJTLGNvbnN0VHlwZSk7CisgICAgICAgICAgICAgICAgZmxvYXRbXSBkYXRhID0gbmV3IGZsb2F0WzRdOworICAgICAgICAgICAgICAgIGRhdGFbMF0gPSBkYXRhWzFdID0gZGF0YVsyXSA9IGRhdGFbM10gPSAxLjBmOworICAgICAgICAgICAgICAgIGNvbnN0YW50RGF0YS5kYXRhKGRhdGEpOworICAgICAgICAgICAgICAgIHBmLmJpbmRDb25zdGFudHMoY29uc3RhbnREYXRhLCAwKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBwZjsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVJhc3Rlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtUmFzdGVyLmphdmEKaW5kZXggNTZmOWJmNC4uNzkxZGFjOCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtUmFzdGVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtUmFzdGVyLmphdmEKQEAgLTI2LDc2ICsyNiwxMTMgQEAKICAqCiAgKiovCiBwdWJsaWMgY2xhc3MgUHJvZ3JhbVJhc3RlciBleHRlbmRzIEJhc2VPYmogeworCisgICAgcHVibGljIGVudW0gQ3VsbE1vZGUgeworICAgICAgICBCQUNLICgwKSwKKyAgICAgICAgRlJPTlQgKDEpLAorICAgICAgICBOT05FICgyKTsKKworICAgICAgICBpbnQgbUlEOworICAgICAgICBDdWxsTW9kZShpbnQgaWQpIHsKKyAgICAgICAgICAgIG1JRCA9IGlkOworICAgICAgICB9CisgICAgfQorCiAgICAgYm9vbGVhbiBtUG9pbnRTbW9vdGg7CiAgICAgYm9vbGVhbiBtTGluZVNtb290aDsKICAgICBib29sZWFuIG1Qb2ludFNwcml0ZTsKLSAgICBmbG9hdCBtUG9pbnRTaXplOwogICAgIGZsb2F0IG1MaW5lV2lkdGg7Ci0gICAgRWxlbWVudCBtSW47Ci0gICAgRWxlbWVudCBtT3V0OworICAgIEN1bGxNb2RlIG1DdWxsTW9kZTsKIAogICAgIFByb2dyYW1SYXN0ZXIoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgc3VwZXIocnMpOwotICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKIAotICAgICAgICBtUG9pbnRTaXplID0gMS4wZjsKICAgICAgICAgbUxpbmVXaWR0aCA9IDEuMGY7CiAgICAgICAgIG1Qb2ludFNtb290aCA9IGZhbHNlOwogICAgICAgICBtTGluZVNtb290aCA9IGZhbHNlOwogICAgICAgICBtUG9pbnRTcHJpdGUgPSBmYWxzZTsKKworICAgICAgICBtQ3VsbE1vZGUgPSBDdWxsTW9kZS5CQUNLOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldExpbmVXaWR0aChmbG9hdCB3KSB7CisgICAgdm9pZCBzZXRMaW5lV2lkdGgoZmxvYXQgdykgewogICAgICAgICBtUlMudmFsaWRhdGUoKTsKICAgICAgICAgbUxpbmVXaWR0aCA9IHc7CiAgICAgICAgIG1SUy5uUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChtSUQsIHcpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldFBvaW50U2l6ZShmbG9hdCBzKSB7CisgICAgdm9pZCBzZXRDdWxsTW9kZShDdWxsTW9kZSBtKSB7CiAgICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUG9pbnRTaXplID0gczsKLSAgICAgICAgbVJTLm5Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplKG1JRCwgcyk7CisgICAgICAgIG1DdWxsTW9kZSA9IG07CisgICAgICAgIG1SUy5uUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlKG1JRCwgbS5tSUQpOwogICAgIH0KIAotICAgIHZvaWQgaW50ZXJuYWxJbml0KCkgewotICAgICAgICBpbnQgaW5JRCA9IDA7Ci0gICAgICAgIGludCBvdXRJRCA9IDA7Ci0gICAgICAgIGlmIChtSW4gIT0gbnVsbCkgewotICAgICAgICAgICAgaW5JRCA9IG1Jbi5tSUQ7CisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtUmFzdGVyIENVTExfQkFDSyhSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1SYXN0ZXJfQ1VMTF9CQUNLID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1SYXN0ZXIuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1SYXN0ZXIuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEN1bGxNb2RlKEN1bGxNb2RlLkJBQ0spOworICAgICAgICAgICAgcnMubVByb2dyYW1SYXN0ZXJfQ1VMTF9CQUNLID0gYnVpbGRlci5jcmVhdGUoKTsKICAgICAgICAgfQotICAgICAgICBpZiAobU91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvdXRJRCA9IG1PdXQubUlEOwotICAgICAgICB9Ci0gICAgICAgIG1JRCA9IG1SUy5uUHJvZ3JhbVJhc3RlckNyZWF0ZShpbklELCBvdXRJRCwgbVBvaW50U21vb3RoLCBtTGluZVNtb290aCwgbVBvaW50U3ByaXRlKTsKKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtUmFzdGVyX0NVTExfQkFDSzsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1SYXN0ZXIgQ1VMTF9GUk9OVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1SYXN0ZXJfQ1VMTF9GUk9OVCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtUmFzdGVyLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtUmFzdGVyLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXRDdWxsTW9kZShDdWxsTW9kZS5GUk9OVCk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVJhc3Rlcl9DVUxMX0ZST05UID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1SYXN0ZXJfQ1VMTF9GUk9OVDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1SYXN0ZXIgQ1VMTF9OT05FKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVJhc3Rlcl9DVUxMX05PTkUgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVJhc3Rlci5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVJhc3Rlci5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q3VsbE1vZGUoQ3VsbE1vZGUuTk9ORSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVJhc3Rlcl9DVUxMX05PTkUgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVJhc3Rlcl9DVUxMX05PTkU7CisgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKICAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKLSAgICAgICAgUHJvZ3JhbVJhc3RlciBtUFI7CisgICAgICAgIGJvb2xlYW4gbVBvaW50U3ByaXRlOworICAgICAgICBib29sZWFuIG1Qb2ludFNtb290aDsKKyAgICAgICAgYm9vbGVhbiBtTGluZVNtb290aDsKKyAgICAgICAgQ3VsbE1vZGUgbUN1bGxNb2RlOwogCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycywgRWxlbWVudCBpbiwgRWxlbWVudCBvdXQpIHsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CiAgICAgICAgICAgICBtUlMgPSByczsKLSAgICAgICAgICAgIG1QUiA9IG5ldyBQcm9ncmFtUmFzdGVyKDAsIHJzKTsKKyAgICAgICAgICAgIG1Qb2ludFNtb290aCA9IGZhbHNlOworICAgICAgICAgICAgbUxpbmVTbW9vdGggPSBmYWxzZTsKKyAgICAgICAgICAgIG1Qb2ludFNwcml0ZSA9IGZhbHNlOworICAgICAgICAgICAgbUN1bGxNb2RlID0gQ3VsbE1vZGUuQkFDSzsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBvaW50U3ByaXRlRW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgICAgICBtUFIubVBvaW50U3ByaXRlID0gZW5hYmxlOworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQb2ludFNwcml0ZUVuYWJsZShib29sZWFuIGVuYWJsZSkgeworICAgICAgICAgICAgbVBvaW50U3ByaXRlID0gZW5hYmxlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQb2ludFNtb290aEVuYWJsZShib29sZWFuIGVuYWJsZSkgewotICAgICAgICAgICAgbVBSLm1Qb2ludFNtb290aCA9IGVuYWJsZTsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UG9pbnRTbW9vdGhFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgICAgIG1Qb2ludFNtb290aCA9IGVuYWJsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0TGluZVNtb290aEVuYWJsZShib29sZWFuIGVuYWJsZSkgewotICAgICAgICAgICAgbVBSLm1MaW5lU21vb3RoID0gZW5hYmxlOworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRMaW5lU21vb3RoRW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgICAgICBtTGluZVNtb290aCA9IGVuYWJsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q3VsbE1vZGUoQ3VsbE1vZGUgbSkgeworICAgICAgICAgICAgbUN1bGxNb2RlID0gbTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CiAKICAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBQcm9ncmFtUmFzdGVyIGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgQnVpbGRlciBiKSB7Ci0gICAgICAgICAgICBiLm1QUi5pbnRlcm5hbEluaXQoKTsKLSAgICAgICAgICAgIFByb2dyYW1SYXN0ZXIgcHIgPSBiLm1QUjsKLSAgICAgICAgICAgIGIubVBSID0gbmV3IFByb2dyYW1SYXN0ZXIoMCwgYi5tUlMpOworICAgICAgICAgICAgaW50IGlkID0gcnMublByb2dyYW1SYXN0ZXJDcmVhdGUoYi5tUG9pbnRTbW9vdGgsIGIubUxpbmVTbW9vdGgsIGIubVBvaW50U3ByaXRlKTsKKyAgICAgICAgICAgIFByb2dyYW1SYXN0ZXIgcHIgPSBuZXcgUHJvZ3JhbVJhc3RlcihpZCwgcnMpOworICAgICAgICAgICAgcHIuc2V0Q3VsbE1vZGUoYi5tQ3VsbE1vZGUpOwogICAgICAgICAgICAgcmV0dXJuIHByOwogICAgICAgICB9CiAKQEAgLTExMSwzICsxNDgsNCBAQAogCiAKIAorCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1TdG9yZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtU3RvcmUuamF2YQppbmRleCA2OWJlMjQ1Li4zMmMwZDAxIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1TdG9yZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVN0b3JlLmphdmEKQEAgLTc2LDExICs3NiwxNDMgQEAKIAogCiAgICAgUHJvZ3JhbVN0b3JlKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfTk9ORV9ERVBUSF9URVNUKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfVEVTVCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuTEVTUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuT05FLCBCbGVuZERzdEZ1bmMuWkVSTyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayh0cnVlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9URVNUID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX1RFU1Q7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX05PTkVfREVQVEhfTk9fREVQVEgoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19ERVBUSCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuQUxXQVlTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5PTkUsIEJsZW5kRHN0RnVuYy5aRVJPKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKGZhbHNlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19ERVBUSCA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19ERVBUSDsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfTk9ORV9ERVBUSF9OT19URVNUKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fVEVTVCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuQUxXQVlTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5PTkUsIEJsZW5kRHN0RnVuYy5aRVJPKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKHRydWUpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX05PX1RFU1QgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fVEVTVDsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfTk9ORV9ERVBUSF9OT19XUklURShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX05PX1dSSVRFID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5MRVNTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5PTkUsIEJsZW5kRHN0RnVuYy5aRVJPKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKGZhbHNlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19XUklURSA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19XUklURTsKKyAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9BTFBIQV9ERVBUSF9URVNUKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX1RFU1QgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkxFU1MpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLlNSQ19BTFBIQSwgQmxlbmREc3RGdW5jLk9ORV9NSU5VU19TUkNfQUxQSEEpOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2sodHJ1ZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX1RFU1QgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX1RFU1Q7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX0FMUEhBX0RFUFRIX05PX0RFUFRIKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX0RFUFRIID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5BTFdBWVMpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLlNSQ19BTFBIQSwgQmxlbmREc3RGdW5jLk9ORV9NSU5VU19TUkNfQUxQSEEpOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2soZmFsc2UpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19ERVBUSCA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfTk9fREVQVEg7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX0FMUEhBX0RFUFRIX05PX1RFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfTk9fVEVTVCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuQUxXQVlTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5TUkNfQUxQSEEsIEJsZW5kRHN0RnVuYy5PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKHRydWUpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19URVNUID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19URVNUOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9BTFBIQV9ERVBUSF9OT19XUklURShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19XUklURSA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuTEVTUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuU1JDX0FMUEhBLCBCbGVuZERzdEZ1bmMuT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayhmYWxzZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX1dSSVRFID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19XUklURTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9BRERfREVQVEhfVEVTVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfVEVTVCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuTEVTUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuT05FLCBCbGVuZERzdEZ1bmMuT05FKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKHRydWUpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfVEVTVCA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX1RFU1Q7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX0FERF9ERVBUSF9OT19ERVBUSChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fREVQVEggPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkFMV0FZUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuT05FLCBCbGVuZERzdEZ1bmMuT05FKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKGZhbHNlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX05PX0RFUFRIID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fREVQVEg7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX0FERF9ERVBUSF9OT19URVNUKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19URVNUID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5BTFdBWVMpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLk9ORSwgQmxlbmREc3RGdW5jLk9ORSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayh0cnVlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX05PX0RFUFRIID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fVEVTVDsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfQUREX0RFUFRIX05PX1dSSVRFKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19XUklURSA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuQUxXQVlTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5PTkUsIEJsZW5kRHN0RnVuYy5PTkUpOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2soZmFsc2UpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fV1JJVEUgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19XUklURTsKKyAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgewogICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOwpAQCAtMTEwLDMyICsyNDIsNDkgQEAKICAgICAgICAgICAgIG1Db2xvck1hc2tBID0gdHJ1ZTsKICAgICAgICAgICAgIG1CbGVuZFNyYyA9IEJsZW5kU3JjRnVuYy5PTkU7CiAgICAgICAgICAgICBtQmxlbmREc3QgPSBCbGVuZERzdEZ1bmMuWkVSTzsKLQotCiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXREZXB0aEZ1bmMoRGVwdGhGdW5jIGZ1bmMpIHsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgICAgICBtUlMgPSByczsKKyAgICAgICAgICAgIG1JbiA9IG51bGw7CisgICAgICAgICAgICBtT3V0ID0gbnVsbDsKKyAgICAgICAgICAgIG1EZXB0aEZ1bmMgPSBEZXB0aEZ1bmMuQUxXQVlTOworICAgICAgICAgICAgbURlcHRoTWFzayA9IGZhbHNlOworICAgICAgICAgICAgbUNvbG9yTWFza1IgPSB0cnVlOworICAgICAgICAgICAgbUNvbG9yTWFza0cgPSB0cnVlOworICAgICAgICAgICAgbUNvbG9yTWFza0IgPSB0cnVlOworICAgICAgICAgICAgbUNvbG9yTWFza0EgPSB0cnVlOworICAgICAgICAgICAgbUJsZW5kU3JjID0gQmxlbmRTcmNGdW5jLk9ORTsKKyAgICAgICAgICAgIG1CbGVuZERzdCA9IEJsZW5kRHN0RnVuYy5aRVJPOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGVwdGhGdW5jKERlcHRoRnVuYyBmdW5jKSB7CiAgICAgICAgICAgICBtRGVwdGhGdW5jID0gZnVuYzsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0RGVwdGhNYXNrKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERlcHRoTWFzayhib29sZWFuIGVuYWJsZSkgewogICAgICAgICAgICAgbURlcHRoTWFzayA9IGVuYWJsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q29sb3JNYXNrKGJvb2xlYW4gciwgYm9vbGVhbiBnLCBib29sZWFuIGIsIGJvb2xlYW4gYSkgeworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDb2xvck1hc2soYm9vbGVhbiByLCBib29sZWFuIGcsIGJvb2xlYW4gYiwgYm9vbGVhbiBhKSB7CiAgICAgICAgICAgICBtQ29sb3JNYXNrUiA9IHI7CiAgICAgICAgICAgICBtQ29sb3JNYXNrRyA9IGc7CiAgICAgICAgICAgICBtQ29sb3JNYXNrQiA9IGI7CiAgICAgICAgICAgICBtQ29sb3JNYXNrQSA9IGE7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMgc3JjLCBCbGVuZERzdEZ1bmMgZHN0KSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMgc3JjLCBCbGVuZERzdEZ1bmMgZHN0KSB7CiAgICAgICAgICAgICBtQmxlbmRTcmMgPSBzcmM7CiAgICAgICAgICAgICBtQmxlbmREc3QgPSBkc3Q7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERpdGhlckVuYWJsZShib29sZWFuIGVuYWJsZSkgeworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXREaXRoZXJFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKICAgICAgICAgICAgIG1EaXRoZXIgPSBlbmFibGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCiAgICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgUHJvZ3JhbVN0b3JlIGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgQnVpbGRlciBiKSB7CkBAIC0xNDcsMTcgKzI5NiwxNyBAQAogICAgICAgICAgICAgaWYgKGIubU91dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgb3V0SUQgPSBiLm1PdXQubUlEOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcnMublByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oaW5JRCwgb3V0SUQpOwotICAgICAgICAgICAgcnMublByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jKGIubURlcHRoRnVuYy5tSUQpOwotICAgICAgICAgICAgcnMublByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrKGIubURlcHRoTWFzayk7Ci0gICAgICAgICAgICBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2soYi5tQ29sb3JNYXNrUiwKKyAgICAgICAgICAgIHJzLm5Qcm9ncmFtU3RvcmVCZWdpbihpbklELCBvdXRJRCk7CisgICAgICAgICAgICBycy5uUHJvZ3JhbVN0b3JlRGVwdGhGdW5jKGIubURlcHRoRnVuYy5tSUQpOworICAgICAgICAgICAgcnMublByb2dyYW1TdG9yZURlcHRoTWFzayhiLm1EZXB0aE1hc2spOworICAgICAgICAgICAgcnMublByb2dyYW1TdG9yZUNvbG9yTWFzayhiLm1Db2xvck1hc2tSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIubUNvbG9yTWFza0csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5tQ29sb3JNYXNrQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLm1Db2xvck1hc2tBKTsKLSAgICAgICAgICAgIHJzLm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyhiLm1CbGVuZFNyYy5tSUQsIGIubUJsZW5kRHN0Lm1JRCk7Ci0gICAgICAgICAgICBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIoYi5tRGl0aGVyKTsKKyAgICAgICAgICAgIHJzLm5Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMoYi5tQmxlbmRTcmMubUlELCBiLm1CbGVuZERzdC5tSUQpOworICAgICAgICAgICAgcnMublByb2dyYW1TdG9yZURpdGhlcihiLm1EaXRoZXIpOwogCi0gICAgICAgICAgICBpbnQgaWQgPSBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUoKTsKKyAgICAgICAgICAgIGludCBpZCA9IHJzLm5Qcm9ncmFtU3RvcmVDcmVhdGUoKTsKICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvZ3JhbVN0b3JlKGlkLCBycyk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtVmVydGV4LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1WZXJ0ZXguamF2YQppbmRleCAxYjE1NWQ3Li42NWEwYWYyIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1WZXJ0ZXguamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1WZXJ0ZXguamF2YQpAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKIAogCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCkBAIC0zOCwyNSArMzksNiBAQAogICAgICAgICBiaW5kQ29uc3RhbnRzKHZhLm1BbGxvYywgMCk7CiAgICAgfQogCi0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOwotICAgICAgICBib29sZWFuIG1UZXh0dXJlTWF0cml4RW5hYmxlOwotCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycywgRWxlbWVudCBpbiwgRWxlbWVudCBvdXQpIHsKLSAgICAgICAgICAgIG1SUyA9IHJzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dHVyZU1hdHJpeEVuYWJsZShib29sZWFuIGVuYWJsZSkgewotICAgICAgICAgICAgbVRleHR1cmVNYXRyaXhFbmFibGUgPSBlbmFibGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUHJvZ3JhbVZlcnRleCBjcmVhdGUoKSB7Ci0gICAgICAgICAgICBpbnQgaWQgPSBtUlMublByb2dyYW1WZXJ0ZXhDcmVhdGUobVRleHR1cmVNYXRyaXhFbmFibGUpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9ncmFtVmVydGV4KGlkLCBtUlMpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaGFkZXJCdWlsZGVyIGV4dGVuZHMgQmFzZVByb2dyYW1CdWlsZGVyIHsKICAgICAgICAgcHVibGljIFNoYWRlckJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CiAgICAgICAgICAgICBzdXBlcihycyk7CkBAIC04MiwxMyArNjQsNzUgQEAKICAgICAgICAgICAgIHRtcFtpZHgrK10gPSAzOwogICAgICAgICAgICAgdG1wW2lkeCsrXSA9IG1UZXh0dXJlQ291bnQ7CiAKLSAgICAgICAgICAgIGludCBpZCA9IG1SUy5uUHJvZ3JhbVZlcnRleENyZWF0ZTIobVNoYWRlciwgdG1wKTsKKyAgICAgICAgICAgIGludCBpZCA9IG1SUy5uUHJvZ3JhbVZlcnRleENyZWF0ZShtU2hhZGVyLCB0bXApOwogICAgICAgICAgICAgUHJvZ3JhbVZlcnRleCBwdiA9IG5ldyBQcm9ncmFtVmVydGV4KGlkLCBtUlMpOwogICAgICAgICAgICAgaW5pdFByb2dyYW0ocHYpOwogICAgICAgICAgICAgcmV0dXJuIHB2OwogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIGV4dGVuZHMgU2hhZGVyQnVpbGRlciB7CisgICAgICAgIGJvb2xlYW4gbVRleHR1cmVNYXRyaXhFbmFibGU7CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzLCBFbGVtZW50IGluLCBFbGVtZW50IG91dCkgeworICAgICAgICAgICAgc3VwZXIocnMpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICAgICAgc3VwZXIocnMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0VGV4dHVyZU1hdHJpeEVuYWJsZShib29sZWFuIGVuYWJsZSkgeworICAgICAgICAgICAgbVRleHR1cmVNYXRyaXhFbmFibGUgPSBlbmFibGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgVHlwZSBnZXRDb25zdGFudElucHV0VHlwZShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgICAgIEVsZW1lbnQuQnVpbGRlciBiID0gbmV3IEVsZW1lbnQuQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLmFkZChFbGVtZW50Lk1BVFJJWDRYNChycyksICJNViIpOworICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5NQVRSSVg0WDQocnMpLCAiUCIpOworICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5NQVRSSVg0WDQocnMpLCAiVGV4TWF0cml4Iik7CisgICAgICAgICAgICBiLmFkZChFbGVtZW50Lk1BVFJJWDRYNChycyksICJNVlAiKTsKKworICAgICAgICAgICAgVHlwZS5CdWlsZGVyIHR5cGVCdWlsZGVyID0gbmV3IFR5cGUuQnVpbGRlcihycywgYi5jcmVhdGUoKSk7CisgICAgICAgICAgICB0eXBlQnVpbGRlci5hZGQoRGltZW5zaW9uLlgsIDEpOworICAgICAgICAgICAgcmV0dXJuIHR5cGVCdWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGJ1aWxkU2hhZGVyU3RyaW5nKCkgeworCisgICAgICAgICAgICBtU2hhZGVyICA9ICIvL3JzX3NoYWRlcl9pbnRlcm5hbFxuIjsKKyAgICAgICAgICAgIG1TaGFkZXIgKz0gInZhcnlpbmcgdmVjNCB2YXJDb2xvcjtcbiI7CisgICAgICAgICAgICBtU2hhZGVyICs9ICJ2YXJ5aW5nIHZlYzIgdmFyVGV4MDtcbiI7CisKKyAgICAgICAgICAgIG1TaGFkZXIgKz0gInZvaWQgbWFpbigpIHtcbiI7CisgICAgICAgICAgICBtU2hhZGVyICs9ICIgIGdsX1Bvc2l0aW9uID0gVU5JX01WUCAqIEFUVFJJQl9wb3NpdGlvbjtcbiI7CisgICAgICAgICAgICBtU2hhZGVyICs9ICIgIGdsX1BvaW50U2l6ZSA9IDEuMDtcbiI7CisKKyAgICAgICAgICAgIG1TaGFkZXIgKz0gIiAgdmFyQ29sb3IgPSBBVFRSSUJfY29sb3I7XG4iOworICAgICAgICAgICAgaWYgKG1UZXh0dXJlTWF0cml4RW5hYmxlKSB7CisgICAgICAgICAgICAgICAgbVNoYWRlciArPSAiICB2YXJUZXgwID0gKFVOSV9UZXhNYXRyaXggKiB2ZWM0KEFUVFJJQl90ZXh0dXJlMCwgMC4wLCAxLjApKS54eTtcbiI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TaGFkZXIgKz0gIiAgdmFyVGV4MCA9IEFUVFJJQl90ZXh0dXJlMDtcbiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU2hhZGVyICs9ICJ9XG4iOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQcm9ncmFtVmVydGV4IGNyZWF0ZSgpIHsKKyAgICAgICAgICAgIGJ1aWxkU2hhZGVyU3RyaW5nKCk7CisKKyAgICAgICAgICAgIGFkZENvbnN0YW50KGdldENvbnN0YW50SW5wdXRUeXBlKG1SUykpOworCisgICAgICAgICAgICBFbGVtZW50LkJ1aWxkZXIgYiA9IG5ldyBFbGVtZW50LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuRjMyXzQobVJTKSwgInBvc2l0aW9uIik7CisgICAgICAgICAgICBiLmFkZChFbGVtZW50LkYzMl80KG1SUyksICJjb2xvciIpOworICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5GMzJfMyhtUlMpLCAibm9ybWFsIik7CisgICAgICAgICAgICBiLmFkZChFbGVtZW50LkYzMl8yKG1SUyksICJ0ZXh0dXJlMCIpOworICAgICAgICAgICAgYWRkSW5wdXQoYi5jcmVhdGUoKSk7CisKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKwogCiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hdHJpeEFsbG9jYXRpb24gewpAQCAtMTAxLDE2ICsxNDUsMTcgQEAKICAgICAgICAgTWF0cml4NGYgbVRleHR1cmU7CiAKICAgICAgICAgcHVibGljIEFsbG9jYXRpb24gbUFsbG9jOworICAgICAgICBwcml2YXRlIEZpZWxkUGFja2VyIG1JT0J1ZmZlcjsKIAogICAgICAgICBwdWJsaWMgTWF0cml4QWxsb2NhdGlvbihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgICAgIG1Nb2RlbCA9IG5ldyBNYXRyaXg0ZigpOwotICAgICAgICAgICAgbVByb2plY3Rpb24gPSBuZXcgTWF0cml4NGYoKTsKLSAgICAgICAgICAgIG1UZXh0dXJlID0gbmV3IE1hdHJpeDRmKCk7Ci0KLSAgICAgICAgICAgIG1BbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQocnMsIEVsZW1lbnQuY3JlYXRlVXNlcihycywgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiksIDQ4KTsKLSAgICAgICAgICAgIG1BbGxvYy5zdWJEYXRhMUQoTU9ERUxWSUVXX09GRlNFVCwgMTYsIG1Nb2RlbC5tTWF0KTsKLSAgICAgICAgICAgIG1BbGxvYy5zdWJEYXRhMUQoUFJPSkVDVElPTl9PRkZTRVQsIDE2LCBtUHJvamVjdGlvbi5tTWF0KTsKLSAgICAgICAgICAgIG1BbGxvYy5zdWJEYXRhMUQoVEVYVFVSRV9PRkZTRVQsIDE2LCBtVGV4dHVyZS5tTWF0KTsKKyAgICAgICAgICAgIFR5cGUgY29uc3RJbnB1dFR5cGUgPSBQcm9ncmFtVmVydGV4LkJ1aWxkZXIuZ2V0Q29uc3RhbnRJbnB1dFR5cGUocnMpOworICAgICAgICAgICAgbUFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChycywgY29uc3RJbnB1dFR5cGUpOworICAgICAgICAgICAgaW50IGJ1ZmZlclNpemUgPSBjb25zdElucHV0VHlwZS5nZXRFbGVtZW50KCkuZ2V0U2l6ZUJ5dGVzKCkqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0SW5wdXRUeXBlLmdldEVsZW1lbnRDb3VudCgpOworICAgICAgICAgICAgbUlPQnVmZmVyID0gbmV3IEZpZWxkUGFja2VyKGJ1ZmZlclNpemUpOworICAgICAgICAgICAgbG9hZE1vZGVsdmlldyhuZXcgTWF0cml4NGYoKSk7CisgICAgICAgICAgICBsb2FkUHJvamVjdGlvbihuZXcgTWF0cml4NGYoKSk7CisgICAgICAgICAgICBsb2FkVGV4dHVyZShuZXcgTWF0cml4NGYoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewpAQCAtMTE4LDI0ICsxNjMsMzIgQEAKICAgICAgICAgICAgIG1BbGxvYyA9IG51bGw7CiAgICAgICAgIH0KIAorICAgICAgICBwcml2YXRlIHZvaWQgYWRkVG9CdWZmZXIoaW50IG9mZnNldCwgTWF0cml4NGYgbSkgeworICAgICAgICAgICAgbUlPQnVmZmVyLnJlc2V0KG9mZnNldCk7CisgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkgKyspIHsKKyAgICAgICAgICAgICAgICBtSU9CdWZmZXIuYWRkRjMyKG0ubU1hdFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQWxsb2MuZGF0YShtSU9CdWZmZXIuZ2V0RGF0YSgpKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIGxvYWRNb2RlbHZpZXcoTWF0cml4NGYgbSkgewogICAgICAgICAgICAgbU1vZGVsID0gbTsKLSAgICAgICAgICAgIG1BbGxvYy5zdWJEYXRhMUQoTU9ERUxWSUVXX09GRlNFVCwgMTYsIG0ubU1hdCk7CisgICAgICAgICAgICBhZGRUb0J1ZmZlcihNT0RFTFZJRVdfT0ZGU0VUKjQsIG0pOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgbG9hZFByb2plY3Rpb24oTWF0cml4NGYgbSkgewogICAgICAgICAgICAgbVByb2plY3Rpb24gPSBtOwotICAgICAgICAgICAgbUFsbG9jLnN1YkRhdGExRChQUk9KRUNUSU9OX09GRlNFVCwgMTYsIG0ubU1hdCk7CisgICAgICAgICAgICBhZGRUb0J1ZmZlcihQUk9KRUNUSU9OX09GRlNFVCo0LCBtKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGxvYWRUZXh0dXJlKE1hdHJpeDRmIG0pIHsKICAgICAgICAgICAgIG1UZXh0dXJlID0gbTsKLSAgICAgICAgICAgIG1BbGxvYy5zdWJEYXRhMUQoVEVYVFVSRV9PRkZTRVQsIDE2LCBtLm1NYXQpOworICAgICAgICAgICAgYWRkVG9CdWZmZXIoVEVYVFVSRV9PRkZTRVQqNCwgbSk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXR1cE9ydGhvV2luZG93KGludCB3LCBpbnQgaCkgewogICAgICAgICAgICAgbVByb2plY3Rpb24ubG9hZE9ydGhvKDAsdywgaCwwLCAtMSwxKTsKLSAgICAgICAgICAgIG1BbGxvYy5zdWJEYXRhMUQoUFJPSkVDVElPTl9PRkZTRVQsIDE2LCBtUHJvamVjdGlvbi5tTWF0KTsKKyAgICAgICAgICAgIGFkZFRvQnVmZmVyKFBST0pFQ1RJT05fT0ZGU0VUKjQsIG1Qcm9qZWN0aW9uKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldHVwT3J0aG9Ob3JtYWxpemVkKGludCB3LCBpbnQgaCkgewpAQCAtMTQ3LDcgKzIwMCw3IEBACiAgICAgICAgICAgICAgICAgZmxvYXQgYXNwZWN0ID0gKChmbG9hdCloKSAvIHc7CiAgICAgICAgICAgICAgICAgbVByb2plY3Rpb24ubG9hZE9ydGhvKC0xLDEsIC1hc3BlY3QsYXNwZWN0LCAgLTEsMSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQWxsb2Muc3ViRGF0YTFEKFBST0pFQ1RJT05fT0ZGU0VULCAxNiwgbVByb2plY3Rpb24ubU1hdCk7CisgICAgICAgICAgICBhZGRUb0J1ZmZlcihQUk9KRUNUSU9OX09GRlNFVCo0LCBtUHJvamVjdGlvbik7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXR1cFByb2plY3Rpb25Ob3JtYWxpemVkKGludCB3LCBpbnQgaCkgewpAQCAtMTczLDcgKzIyNiw3IEBACiAgICAgICAgICAgICBtMS5sb2FkTXVsdGlwbHkobTEsIG0yKTsKIAogICAgICAgICAgICAgbVByb2plY3Rpb24gPSBtMTsKLSAgICAgICAgICAgIG1BbGxvYy5zdWJEYXRhMUQoUFJPSkVDVElPTl9PRkZTRVQsIDE2LCBtUHJvamVjdGlvbi5tTWF0KTsKKyAgICAgICAgICAgIGFkZFRvQnVmZmVyKFBST0pFQ1RJT05fT0ZGU0VUKjQsIG1Qcm9qZWN0aW9uKTsKICAgICAgICAgfQogCiAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0LmphdmEKaW5kZXggYTkzNTI0My4uMDA4ODM3MyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdC5qYXZhCkBAIC01NywxNTEgKzU3LDQ3NCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gTm9uLXRocmVhZHNhZmUgZnVuY3Rpb25zLgogICAgIG5hdGl2ZSB2b2lkIG5Jbml0RWxlbWVudHMoaW50IGE4LCBpbnQgcmdiYTQ0NDQsIGludCByZ2JhODg4OCwgaW50IHJnYjU2NSk7Ci0KICAgICBuYXRpdmUgaW50ICBuRGV2aWNlQ3JlYXRlKCk7CiAgICAgbmF0aXZlIHZvaWQgbkRldmljZURlc3Ryb3koaW50IGRldik7CiAgICAgbmF0aXZlIHZvaWQgbkRldmljZVNldENvbmZpZyhpbnQgZGV2LCBpbnQgcGFyYW0sIGludCB2YWx1ZSk7Ci0gICAgbmF0aXZlIGludCAgbkNvbnRleHRDcmVhdGVHTChpbnQgZGV2LCBpbnQgdmVyLCBib29sZWFuIHVzZURlcHRoKTsKLSAgICBuYXRpdmUgaW50ICBuQ29udGV4dENyZWF0ZShpbnQgZGV2LCBpbnQgdmVyKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dERlc3Ryb3koaW50IGNvbik7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRTZXRTdXJmYWNlKGludCB3LCBpbnQgaCwgU3VyZmFjZSBzdXIpOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0U2V0UHJpb3JpdHkoaW50IHApOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0RHVtcChpbnQgYml0cyk7Ci0KLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRSb290U2NyaXB0KGludCBzY3JpcHQpOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0QmluZFNhbXBsZXIoaW50IHNhbXBsZXIsIGludCBzbG90KTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShpbnQgcGZzKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQoaW50IHBmKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4KGludCBwZik7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlcihpbnQgcHIpOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0UGF1c2UoKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dFJlc3VtZSgpOwotICAgIG5hdGl2ZSBpbnQgbkNvbnRleHRHZXRNZXNzYWdlKGludFtdIGRhdGEsIGJvb2xlYW4gd2FpdCk7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRJbml0VG9DbGllbnQoKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dERlaW5pdFRvQ2xpZW50KCk7Ci0KLSAgICBuYXRpdmUgdm9pZCBuQXNzaWduTmFtZShpbnQgb2JqLCBieXRlW10gbmFtZSk7Ci0gICAgbmF0aXZlIHZvaWQgbk9iakRlc3Ryb3koaW50IGlkKTsKLSAgICBuYXRpdmUgdm9pZCBuT2JqRGVzdHJveU9PQihpbnQgaWQpOwotICAgIG5hdGl2ZSBpbnQgIG5GaWxlT3BlbihieXRlW10gbmFtZSk7CisgICAgbmF0aXZlIGludCAgbkNvbnRleHRHZXRNZXNzYWdlKGludCBjb24sIGludFtdIGRhdGEsIGJvb2xlYW4gd2FpdCk7CisgICAgbmF0aXZlIHZvaWQgbkNvbnRleHRJbml0VG9DbGllbnQoaW50IGNvbik7CisgICAgbmF0aXZlIHZvaWQgbkNvbnRleHREZWluaXRUb0NsaWVudChpbnQgY29uKTsKIAogCi0gICAgbmF0aXZlIGludCAgbkVsZW1lbnRDcmVhdGUoaW50IHR5cGUsIGludCBraW5kLCBib29sZWFuIG5vcm0sIGludCB2ZWNTaXplKTsKLSAgICBuYXRpdmUgaW50ICBuRWxlbWVudENyZWF0ZTIoaW50W10gZWxlbWVudHMsIFN0cmluZ1tdIG5hbWVzKTsKKyAgICAvLyBNZXRob2RzIGJlbG93IGFyZSB3cmFwcGVkIHRvIHByb3RlY3QgdGhlIG5vbi10aHJlYWRzYWZlCisgICAgLy8gbG9ja2xlc3MgZmlmby4KKyAgICBuYXRpdmUgaW50ICByc25Db250ZXh0Q3JlYXRlR0woaW50IGRldiwgaW50IHZlciwgYm9vbGVhbiB1c2VEZXB0aCk7CisgICAgc3luY2hyb25pemVkIGludCBuQ29udGV4dENyZWF0ZUdMKGludCBkZXYsIGludCB2ZXIsIGJvb2xlYW4gdXNlRGVwdGgpIHsKKyAgICAgICAgcmV0dXJuIHJzbkNvbnRleHRDcmVhdGVHTChkZXYsIHZlciwgdXNlRGVwdGgpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25Db250ZXh0Q3JlYXRlKGludCBkZXYsIGludCB2ZXIpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkNvbnRleHRDcmVhdGUoaW50IGRldiwgaW50IHZlcikgeworICAgICAgICByZXR1cm4gcnNuQ29udGV4dENyZWF0ZShkZXYsIHZlcik7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHREZXN0cm95KGludCBjb24pOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0RGVzdHJveSgpIHsKKyAgICAgICAgcnNuQ29udGV4dERlc3Ryb3kobUNvbnRleHQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0U2V0U3VyZmFjZShpbnQgY29uLCBpbnQgdywgaW50IGgsIFN1cmZhY2Ugc3VyKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dFNldFN1cmZhY2UoaW50IHcsIGludCBoLCBTdXJmYWNlIHN1cikgeworICAgICAgICByc25Db250ZXh0U2V0U3VyZmFjZShtQ29udGV4dCwgdywgaCwgc3VyKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dFNldFByaW9yaXR5KGludCBjb24sIGludCBwKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dFNldFByaW9yaXR5KGludCBwKSB7CisgICAgICAgIHJzbkNvbnRleHRTZXRQcmlvcml0eShtQ29udGV4dCwgcCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHREdW1wKGludCBjb24sIGludCBiaXRzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dER1bXAoaW50IGJpdHMpIHsKKyAgICAgICAgcnNuQ29udGV4dER1bXAobUNvbnRleHQsIGJpdHMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0RmluaXNoKGludCBjb24pOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0RmluaXNoKCkgeworICAgICAgICByc25Db250ZXh0RmluaXNoKG1Db250ZXh0KTsKKyAgICB9CiAKLSAgICBuYXRpdmUgdm9pZCBuVHlwZUJlZ2luKGludCBlbGVtZW50SUQpOwotICAgIG5hdGl2ZSB2b2lkIG5UeXBlQWRkKGludCBkaW0sIGludCB2YWwpOwotICAgIG5hdGl2ZSBpbnQgIG5UeXBlQ3JlYXRlKCk7Ci0gICAgbmF0aXZlIHZvaWQgblR5cGVGaW5hbERlc3Ryb3koVHlwZSB0KTsKLSAgICBuYXRpdmUgdm9pZCBuVHlwZVNldHVwRmllbGRzKFR5cGUgdCwgaW50W10gdHlwZXMsIGludFtdIGJpdHMsIEZpZWxkW10gSURzKTsKKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0QmluZFJvb3RTY3JpcHQoaW50IGNvbiwgaW50IHNjcmlwdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRCaW5kUm9vdFNjcmlwdChpbnQgc2NyaXB0KSB7CisgICAgICAgIHJzbkNvbnRleHRCaW5kUm9vdFNjcmlwdChtQ29udGV4dCwgc2NyaXB0KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dEJpbmRTYW1wbGVyKGludCBjb24sIGludCBzYW1wbGVyLCBpbnQgc2xvdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRCaW5kU2FtcGxlcihpbnQgc2FtcGxlciwgaW50IHNsb3QpIHsKKyAgICAgICAgcnNuQ29udGV4dEJpbmRTYW1wbGVyKG1Db250ZXh0LCBzYW1wbGVyLCBzbG90KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUoaW50IGNvbiwgaW50IHBmcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKGludCBwZnMpIHsKKyAgICAgICAgcnNuQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUobUNvbnRleHQsIHBmcyk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KGludCBjb24sIGludCBwZik7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KGludCBwZikgeworICAgICAgICByc25Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudChtQ29udGV4dCwgcGYpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgoaW50IGNvbiwgaW50IHB2KTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4KGludCBwdikgeworICAgICAgICByc25Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgobUNvbnRleHQsIHB2KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKGludCBjb24sIGludCBwcik7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlcihpbnQgcHIpIHsKKyAgICAgICAgcnNuQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKG1Db250ZXh0LCBwcik7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHRQYXVzZShpbnQgY29uKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dFBhdXNlKCkgeworICAgICAgICByc25Db250ZXh0UGF1c2UobUNvbnRleHQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0UmVzdW1lKGludCBjb24pOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0UmVzdW1lKCkgeworICAgICAgICByc25Db250ZXh0UmVzdW1lKG1Db250ZXh0KTsKKyAgICB9CiAKLSAgICBuYXRpdmUgaW50ICBuQWxsb2NhdGlvbkNyZWF0ZVR5cGVkKGludCB0eXBlKTsKLSAgICBuYXRpdmUgaW50ICBuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAoaW50IGRzdEZtdCwgYm9vbGVhbiBnZW5NaXBzLCBCaXRtYXAgYm1wKTsKLSAgICBuYXRpdmUgaW50ICBuQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZihpbnQgdHlwZSwgQml0bWFwIGJtcCk7Ci0gICAgbmF0aXZlIGludCAgbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQoaW50IGRzdEZtdCwgYm9vbGVhbiBnZW5NaXBzLCBCaXRtYXAgYm1wKTsKLSAgICBuYXRpdmUgaW50ICBuQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbShpbnQgZHN0Rm10LCBib29sZWFuIGdlbk1pcHMsIGludCBhc3NldFN0cmVhbSk7CisgICAgbmF0aXZlIHZvaWQgcnNuQXNzaWduTmFtZShpbnQgY29uLCBpbnQgb2JqLCBieXRlW10gbmFtZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFzc2lnbk5hbWUoaW50IG9iaiwgYnl0ZVtdIG5hbWUpIHsKKyAgICAgICAgcnNuQXNzaWduTmFtZShtQ29udGV4dCwgb2JqLCBuYW1lKTsKKyAgICB9CisgICAgbmF0aXZlIFN0cmluZyByc25HZXROYW1lKGludCBjb24sIGludCBvYmopOworICAgIHN5bmNocm9uaXplZCBTdHJpbmcgbkdldE5hbWUoaW50IG9iaikgeworICAgICAgICByZXR1cm4gcnNuR2V0TmFtZShtQ29udGV4dCwgb2JqKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuT2JqRGVzdHJveShpbnQgY29uLCBpbnQgaWQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5PYmpEZXN0cm95KGludCBpZCkgeworICAgICAgICByc25PYmpEZXN0cm95KG1Db250ZXh0LCBpZCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkZpbGVPcGVuKGludCBjb24sIGJ5dGVbXSBuYW1lKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5GaWxlT3BlbihieXRlW10gbmFtZSkgeworICAgICAgICByZXR1cm4gcnNuRmlsZU9wZW4obUNvbnRleHQsIG5hbWUpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKGludCBhbGxvYywgYm9vbGVhbiBnZW5NaXBzLCBpbnQgYmFzZU1pb0xldmVsKTsKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KGludCBhbGxvYyk7CisgICAgbmF0aXZlIGludCAgcnNuRWxlbWVudENyZWF0ZShpbnQgY29uLCBpbnQgdHlwZSwgaW50IGtpbmQsIGJvb2xlYW4gbm9ybSwgaW50IHZlY1NpemUpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkVsZW1lbnRDcmVhdGUoaW50IHR5cGUsIGludCBraW5kLCBib29sZWFuIG5vcm0sIGludCB2ZWNTaXplKSB7CisgICAgICAgIHJldHVybiByc25FbGVtZW50Q3JlYXRlKG1Db250ZXh0LCB0eXBlLCBraW5kLCBub3JtLCB2ZWNTaXplKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuRWxlbWVudENyZWF0ZTIoaW50IGNvbiwgaW50W10gZWxlbWVudHMsIFN0cmluZ1tdIG5hbWVzLCBpbnRbXSBhcnJheVNpemVzKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5FbGVtZW50Q3JlYXRlMihpbnRbXSBlbGVtZW50cywgU3RyaW5nW10gbmFtZXMsIGludFtdIGFycmF5U2l6ZXMpIHsKKyAgICAgICAgcmV0dXJuIHJzbkVsZW1lbnRDcmVhdGUyKG1Db250ZXh0LCBlbGVtZW50cywgbmFtZXMsIGFycmF5U2l6ZXMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25FbGVtZW50R2V0TmF0aXZlRGF0YShpbnQgY29uLCBpbnQgaWQsIGludFtdIGVsZW1lbnREYXRhKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuRWxlbWVudEdldE5hdGl2ZURhdGEoaW50IGlkLCBpbnRbXSBlbGVtZW50RGF0YSkgeworICAgICAgICByc25FbGVtZW50R2V0TmF0aXZlRGF0YShtQ29udGV4dCwgaWQsIGVsZW1lbnREYXRhKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuRWxlbWVudEdldFN1YkVsZW1lbnRzKGludCBjb24sIGludCBpZCwgaW50W10gSURzLCBTdHJpbmdbXSBuYW1lcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkVsZW1lbnRHZXRTdWJFbGVtZW50cyhpbnQgaWQsIGludFtdIElEcywgU3RyaW5nW10gbmFtZXMpIHsKKyAgICAgICAgcnNuRWxlbWVudEdldFN1YkVsZW1lbnRzKG1Db250ZXh0LCBpZCwgSURzLCBuYW1lcyk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGludFtdIGQsIGludCBzaXplQnl0ZXMpOwotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBzaG9ydFtdIGQsIGludCBzaXplQnl0ZXMpOwotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBieXRlW10gZCwgaW50IHNpemVCeXRlcyk7Ci0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGZsb2F0W10gZCwgaW50IHNpemVCeXRlcyk7CisgICAgbmF0aXZlIHZvaWQgcnNuVHlwZUJlZ2luKGludCBjb24sIGludCBlbGVtZW50SUQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5UeXBlQmVnaW4oaW50IGVsZW1lbnRJRCkgeworICAgICAgICByc25UeXBlQmVnaW4obUNvbnRleHQsIGVsZW1lbnRJRCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblR5cGVBZGQoaW50IGNvbiwgaW50IGRpbSwgaW50IHZhbCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblR5cGVBZGQoaW50IGRpbSwgaW50IHZhbCkgeworICAgICAgICByc25UeXBlQWRkKG1Db250ZXh0LCBkaW0sIHZhbCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzblR5cGVDcmVhdGUoaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIGludCBuVHlwZUNyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJzblR5cGVDcmVhdGUobUNvbnRleHQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25UeXBlR2V0TmF0aXZlRGF0YShpbnQgY29uLCBpbnQgaWQsIGludFtdIHR5cGVEYXRhKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuVHlwZUdldE5hdGl2ZURhdGEoaW50IGlkLCBpbnRbXSB0eXBlRGF0YSkgeworICAgICAgICByc25UeXBlR2V0TmF0aXZlRGF0YShtQ29udGV4dCwgaWQsIHR5cGVEYXRhKTsKKyAgICB9CiAKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblN1YkRhdGEyRChpbnQgaWQsIGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IHcsIGludCBoLCBpbnRbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblN1YkRhdGEyRChpbnQgaWQsIGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IHcsIGludCBoLCBmbG9hdFtdIGQsIGludCBzaXplQnl0ZXMpOwotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uUmVhZChpbnQgaWQsIGludFtdIGQpOwotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uUmVhZChpbnQgaWQsIGZsb2F0W10gZCk7Ci0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdChpbnQgaWQsIFR5cGUgdCwgaW50IG9mZnNldCwgT2JqZWN0IG8pOwotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uU3ViUmVhZEZyb21PYmplY3QoaW50IGlkLCBUeXBlIHQsIGludCBvZmZzZXQsIE9iamVjdCBvKTsKKyAgICBuYXRpdmUgaW50ICByc25BbGxvY2F0aW9uQ3JlYXRlVHlwZWQoaW50IGNvbiwgaW50IHR5cGUpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkFsbG9jYXRpb25DcmVhdGVUeXBlZChpbnQgdHlwZSkgeworICAgICAgICByZXR1cm4gcnNuQWxsb2NhdGlvbkNyZWF0ZVR5cGVkKG1Db250ZXh0LCB0eXBlKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAoaW50IGNvbiwgaW50IGRzdEZtdCwgYm9vbGVhbiBnZW5NaXBzLCBCaXRtYXAgYm1wKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcChpbnQgZHN0Rm10LCBib29sZWFuIGdlbk1pcHMsIEJpdG1hcCBibXApIHsKKyAgICAgICAgcmV0dXJuIHJzbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwKG1Db250ZXh0LCBkc3RGbXQsIGdlbk1pcHMsIGJtcCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkFsbG9jYXRpb25DcmVhdGVCaXRtYXBSZWYoaW50IGNvbiwgaW50IHR5cGUsIEJpdG1hcCBibXApOworICAgIHN5bmNocm9uaXplZCBpbnQgbkFsbG9jYXRpb25DcmVhdGVCaXRtYXBSZWYoaW50IHR5cGUsIEJpdG1hcCBibXApIHsKKyAgICAgICAgcmV0dXJuIHJzbkFsbG9jYXRpb25DcmVhdGVCaXRtYXBSZWYobUNvbnRleHQsIHR5cGUsIGJtcCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQoaW50IGNvbiwgaW50IGRzdEZtdCwgYm9vbGVhbiBnZW5NaXBzLCBCaXRtYXAgYm1wKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkKGludCBkc3RGbXQsIGJvb2xlYW4gZ2VuTWlwcywgQml0bWFwIGJtcCkgeworICAgICAgICByZXR1cm4gcnNuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXBCb3hlZChtQ29udGV4dCwgZHN0Rm10LCBnZW5NaXBzLCBibXApOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25BbGxvY2F0aW9uQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKGludCBjb24sIGludCBkc3RGbXQsIGJvb2xlYW4gZ2VuTWlwcywgaW50IGFzc2V0U3RyZWFtKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5BbGxvY2F0aW9uQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKGludCBkc3RGbXQsIGJvb2xlYW4gZ2VuTWlwcywgaW50IGFzc2V0U3RyZWFtKSB7CisgICAgICAgIHJldHVybiByc25BbGxvY2F0aW9uQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKG1Db250ZXh0LCBkc3RGbXQsIGdlbk1pcHMsIGFzc2V0U3RyZWFtKTsKKyAgICB9CiAKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjFEQmluZEFsbG9jYXRpb24oaW50IGFkLCBpbnQgYWxsb2MpOwotICAgIG5hdGl2ZSB2b2lkIG5BZGFwdGVyMURTZXRDb25zdHJhaW50KGludCBhZCwgaW50IGRpbSwgaW50IHZhbHVlKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjFERGF0YShpbnQgYWQsIGludFtdIGQpOwotICAgIG5hdGl2ZSB2b2lkIG5BZGFwdGVyMUREYXRhKGludCBhZCwgZmxvYXRbXSBkKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjFEU3ViRGF0YShpbnQgYWQsIGludCBvZmYsIGludCBjb3VudCwgaW50W10gZCk7Ci0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIxRFN1YkRhdGEoaW50IGFkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGZsb2F0W10gZCk7Ci0gICAgbmF0aXZlIGludCAgbkFkYXB0ZXIxRENyZWF0ZSgpOworICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25VcGxvYWRUb1RleHR1cmUoaW50IGNvbiwgaW50IGFsbG9jLCBib29sZWFuIGdlbk1pcHMsIGludCBiYXNlTWlvTGV2ZWwpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKGludCBhbGxvYywgYm9vbGVhbiBnZW5NaXBzLCBpbnQgYmFzZU1pb0xldmVsKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25VcGxvYWRUb1RleHR1cmUobUNvbnRleHQsIGFsbG9jLCBnZW5NaXBzLCBiYXNlTWlvTGV2ZWwpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QoaW50IGNvbiwgaW50IGFsbG9jKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KGludCBhbGxvYykgeworICAgICAgICByc25BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QobUNvbnRleHQsIGFsbG9jKTsKKyAgICB9CiAKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjJEQmluZEFsbG9jYXRpb24oaW50IGFkLCBpbnQgYWxsb2MpOwotICAgIG5hdGl2ZSB2b2lkIG5BZGFwdGVyMkRTZXRDb25zdHJhaW50KGludCBhZCwgaW50IGRpbSwgaW50IHZhbHVlKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjJERGF0YShpbnQgYWQsIGludFtdIGQpOwotICAgIG5hdGl2ZSB2b2lkIG5BZGFwdGVyMkREYXRhKGludCBhZCwgZmxvYXRbXSBkKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjJEU3ViRGF0YShpbnQgYWQsIGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IHcsIGludCBoLCBpbnRbXSBkKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjJEU3ViRGF0YShpbnQgYWQsIGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IHcsIGludCBoLCBmbG9hdFtdIGQpOwotICAgIG5hdGl2ZSBpbnQgIG5BZGFwdGVyMkRDcmVhdGUoKTsKKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBjb24sIGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBpbnRbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgaW50W10gZCwgaW50IHNpemVCeXRlcykgeworICAgICAgICByc25BbGxvY2F0aW9uU3ViRGF0YTFEKG1Db250ZXh0LCBpZCwgb2ZmLCBjb3VudCwgZCwgc2l6ZUJ5dGVzKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgY29uLCBpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgc2hvcnRbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgc2hvcnRbXSBkLCBpbnQgc2l6ZUJ5dGVzKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25TdWJEYXRhMUQobUNvbnRleHQsIGlkLCBvZmYsIGNvdW50LCBkLCBzaXplQnl0ZXMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBjb24sIGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBieXRlW10gZCwgaW50IHNpemVCeXRlcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGJ5dGVbXSBkLCBpbnQgc2l6ZUJ5dGVzKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25TdWJEYXRhMUQobUNvbnRleHQsIGlkLCBvZmYsIGNvdW50LCBkLCBzaXplQnl0ZXMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uU3ViRWxlbWVudERhdGExRChpbnQgY29uLCBpbnQgaWQsIGludCB4b2ZmLCBpbnQgY29tcElkeCwgYnl0ZVtdIGQsIGludCBzaXplQnl0ZXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uU3ViRWxlbWVudERhdGExRChpbnQgaWQsIGludCB4b2ZmLCBpbnQgY29tcElkeCwgYnl0ZVtdIGQsIGludCBzaXplQnl0ZXMpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblN1YkVsZW1lbnREYXRhMUQobUNvbnRleHQsIGlkLCB4b2ZmLCBjb21wSWR4LCBkLCBzaXplQnl0ZXMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBjb24sIGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBmbG9hdFtdIGQsIGludCBzaXplQnl0ZXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBmbG9hdFtdIGQsIGludCBzaXplQnl0ZXMpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblN1YkRhdGExRChtQ29udGV4dCwgaWQsIG9mZiwgY291bnQsIGQsIHNpemVCeXRlcyk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgblNjcmlwdEJpbmRBbGxvY2F0aW9uKGludCBzY3JpcHQsIGludCBhbGxvYywgaW50IHNsb3QpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRTZXRDbGVhckNvbG9yKGludCBzY3JpcHQsIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRTZXRDbGVhckRlcHRoKGludCBzY3JpcHQsIGZsb2F0IGRlcHRoKTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0Q2xlYXJTdGVuY2lsKGludCBzY3JpcHQsIGludCBzdGVuY2lsKTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0VGltZVpvbmUoaW50IHNjcmlwdCwgYnl0ZVtdIHRpbWVab25lKTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0VHlwZShpbnQgdHlwZSwgYm9vbGVhbiB3cml0YWJsZSwgU3RyaW5nIG5hbWUsIGludCBzbG90KTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0Um9vdChib29sZWFuIGlzUm9vdCk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldEludm9rYWJsZShTdHJpbmcgbmFtZSwgaW50IHNsb3QpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRJbnZva2UoaW50IGlkLCBpbnQgc2xvdCk7CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblN1YkRhdGEyRChpbnQgY29uLCBpbnQgaWQsIGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IHcsIGludCBoLCBpbnRbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblN1YkRhdGEyRChpbnQgaWQsIGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IHcsIGludCBoLCBpbnRbXSBkLCBpbnQgc2l6ZUJ5dGVzKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25TdWJEYXRhMkQobUNvbnRleHQsIGlkLCB4b2ZmLCB5b2ZmLCB3LCBoLCBkLCBzaXplQnl0ZXMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uU3ViRGF0YTJEKGludCBjb24sIGludCBpZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGZsb2F0W10gZCwgaW50IHNpemVCeXRlcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMkQoaW50IGlkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgZmxvYXRbXSBkLCBpbnQgc2l6ZUJ5dGVzKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25TdWJEYXRhMkQobUNvbnRleHQsIGlkLCB4b2ZmLCB5b2ZmLCB3LCBoLCBkLCBzaXplQnl0ZXMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uUmVhZChpbnQgY29uLCBpbnQgaWQsIGludFtdIGQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uUmVhZChpbnQgaWQsIGludFtdIGQpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblJlYWQobUNvbnRleHQsIGlkLCBkKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblJlYWQoaW50IGNvbiwgaW50IGlkLCBmbG9hdFtdIGQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uUmVhZChpbnQgaWQsIGZsb2F0W10gZCkgeworICAgICAgICByc25BbGxvY2F0aW9uUmVhZChtQ29udGV4dCwgaWQsIGQpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25BbGxvY2F0aW9uR2V0VHlwZShpbnQgY29uLCBpbnQgaWQpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkFsbG9jYXRpb25HZXRUeXBlKGludCBpZCkgeworICAgICAgICByZXR1cm4gcnNuQWxsb2NhdGlvbkdldFR5cGUobUNvbnRleHQsIGlkKTsKKyAgICB9CiAKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0Q0JlZ2luKCk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdENTZXRTY3JpcHQoYnl0ZVtdIHNjcmlwdCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7Ci0gICAgbmF0aXZlIGludCAgblNjcmlwdENDcmVhdGUoKTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0Q0FkZERlZmluZUkzMihTdHJpbmcgbmFtZSwgaW50IHZhbHVlKTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0Q0FkZERlZmluZUYoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKTsKKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uUmVzaXplMUQoaW50IGNvbiwgaW50IGlkLCBpbnQgZGltWCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25SZXNpemUxRChpbnQgaWQsIGludCBkaW1YKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25SZXNpemUxRChtQ29udGV4dCwgaWQsIGRpbVgpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uUmVzaXplMkQoaW50IGNvbiwgaW50IGlkLCBpbnQgZGltWCwgaW50IGRpbVkpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uUmVzaXplMkQoaW50IGlkLCBpbnQgZGltWCwgaW50IGRpbVkpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblJlc2l6ZTJEKG1Db250ZXh0LCBpZCwgZGltWCwgZGltWSk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgblNhbXBsZXJCZWdpbigpOwotICAgIG5hdGl2ZSB2b2lkIG5TYW1wbGVyU2V0KGludCBwYXJhbSwgaW50IHZhbHVlKTsKLSAgICBuYXRpdmUgaW50ICBuU2FtcGxlckNyZWF0ZSgpOworICAgIG5hdGl2ZSBpbnQgIHJzbkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0oaW50IGNvbiwgaW50IGFzc2V0U3RyZWFtKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5GaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKGludCBhc3NldFN0cmVhbSkgeworICAgICAgICByZXR1cm4gcnNuRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShtQ29udGV4dCwgYXNzZXRTdHJlYW0pOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzKGludCBjb24sIGludCBmaWxlQTNEKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzKGludCBmaWxlQTNEKSB7CisgICAgICAgIHJldHVybiByc25GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzKG1Db250ZXh0LCBmaWxlQTNEKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuRmlsZUEzREdldEluZGV4RW50cmllcyhpbnQgY29uLCBpbnQgZmlsZUEzRCwgaW50IG51bUVudHJpZXMsIGludFtdIElEcywgU3RyaW5nW10gbmFtZXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5GaWxlQTNER2V0SW5kZXhFbnRyaWVzKGludCBmaWxlQTNELCBpbnQgbnVtRW50cmllcywgaW50W10gSURzLCBTdHJpbmdbXSBuYW1lcykgeworICAgICAgICByc25GaWxlQTNER2V0SW5kZXhFbnRyaWVzKG1Db250ZXh0LCBmaWxlQTNELCBudW1FbnRyaWVzLCBJRHMsIG5hbWVzKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuRmlsZUEzREdldEVudHJ5QnlJbmRleChpbnQgY29uLCBpbnQgZmlsZUEzRCwgaW50IGluZGV4KTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5GaWxlQTNER2V0RW50cnlCeUluZGV4KGludCBmaWxlQTNELCBpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIHJzbkZpbGVBM0RHZXRFbnRyeUJ5SW5kZXgobUNvbnRleHQsIGZpbGVBM0QsIGluZGV4KTsKKyAgICB9CiAKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbihpbnQgaW4sIGludCBvdXQpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyhpbnQgZnVuYyk7Ci0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrKGJvb2xlYW4gZW5hYmxlKTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2soYm9vbGVhbiByLCBib29sZWFuIGcsIGJvb2xlYW4gYiwgYm9vbGVhbiBhKTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMoaW50IHNyYywgaW50IGRzdCk7Ci0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyKGJvb2xlYW4gZW5hYmxlKTsKLSAgICBuYXRpdmUgaW50ICBuUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUoKTsKKyAgICBuYXRpdmUgaW50ICByc25Gb250Q3JlYXRlRnJvbUZpbGUoaW50IGNvbiwgU3RyaW5nIGZpbGVOYW1lLCBpbnQgc2l6ZSwgaW50IGRwaSk7CisgICAgc3luY2hyb25pemVkIGludCBuRm9udENyZWF0ZUZyb21GaWxlKFN0cmluZyBmaWxlTmFtZSwgaW50IHNpemUsIGludCBkcGkpIHsKKyAgICAgICAgcmV0dXJuIHJzbkZvbnRDcmVhdGVGcm9tRmlsZShtQ29udGV4dCwgZmlsZU5hbWUsIHNpemUsIGRwaSk7CisgICAgfQogCi0gICAgbmF0aXZlIGludCAgblByb2dyYW1SYXN0ZXJDcmVhdGUoaW50IGluLCBpbnQgb3V0LCBib29sZWFuIHBvaW50U21vb3RoLCBib29sZWFuIGxpbmVTbW9vdGgsIGJvb2xlYW4gcG9pbnRTcHJpdGUpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoKGludCBwciwgZmxvYXQgdik7Ci0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1SYXN0ZXJTZXRQb2ludFNpemUoaW50IHByLCBmbG9hdCB2KTsKKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMURCaW5kQWxsb2NhdGlvbihpbnQgY29uLCBpbnQgYWQsIGludCBhbGxvYyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uKGludCBhZCwgaW50IGFsbG9jKSB7CisgICAgICAgIHJzbkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uKG1Db250ZXh0LCBhZCwgYWxsb2MpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMURTZXRDb25zdHJhaW50KGludCBjb24sIGludCBhZCwgaW50IGRpbSwgaW50IHZhbHVlKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWRhcHRlcjFEU2V0Q29uc3RyYWludChpbnQgYWQsIGludCBkaW0sIGludCB2YWx1ZSkgeworICAgICAgICByc25BZGFwdGVyMURTZXRDb25zdHJhaW50KG1Db250ZXh0LCBhZCwgZGltLCB2YWx1ZSk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFkYXB0ZXIxRERhdGEoaW50IGNvbiwgaW50IGFkLCBpbnRbXSBkKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWRhcHRlcjFERGF0YShpbnQgYWQsIGludFtdIGQpIHsKKyAgICAgICAgcnNuQWRhcHRlcjFERGF0YShtQ29udGV4dCwgYWQsIGQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMUREYXRhKGludCBjb24sIGludCBhZCwgZmxvYXRbXSBkKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWRhcHRlcjFERGF0YShpbnQgYWQsIGZsb2F0W10gZCkgeworICAgICAgICByc25BZGFwdGVyMUREYXRhKG1Db250ZXh0LCBhZCwgZCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFkYXB0ZXIxRFN1YkRhdGEoaW50IGNvbiwgaW50IGFkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGludFtdIGQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMURTdWJEYXRhKGludCBhZCwgaW50IG9mZiwgaW50IGNvdW50LCBpbnRbXSBkKSB7CisgICAgICAgIHJzbkFkYXB0ZXIxRFN1YkRhdGEobUNvbnRleHQsIGFkLCBvZmYsIGNvdW50LCBkKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjFEU3ViRGF0YShpbnQgY29uLCBpbnQgYWQsIGludCBvZmYsIGludCBjb3VudCwgZmxvYXRbXSBkKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWRhcHRlcjFEU3ViRGF0YShpbnQgYWQsIGludCBvZmYsIGludCBjb3VudCwgZmxvYXRbXSBkKSB7CisgICAgICAgIHJzbkFkYXB0ZXIxRFN1YkRhdGEobUNvbnRleHQsIGFkLCBvZmYsIGNvdW50LCBkKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuQWRhcHRlcjFEQ3JlYXRlKGludCBjb24pOworICAgIHN5bmNocm9uaXplZCBpbnQgbkFkYXB0ZXIxRENyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJzbkFkYXB0ZXIxRENyZWF0ZShtQ29udGV4dCk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1CaW5kQ29uc3RhbnRzKGludCBwdiwgaW50IHNsb3QsIGludCBtSUQpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtQmluZFRleHR1cmUoaW50IHZwZiwgaW50IHNsb3QsIGludCBhKTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUJpbmRTYW1wbGVyKGludCB2cGYsIGludCBzbG90LCBpbnQgcyk7CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjJEQmluZEFsbG9jYXRpb24oaW50IGNvbiwgaW50IGFkLCBpbnQgYWxsb2MpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbihpbnQgYWQsIGludCBhbGxvYykgeworICAgICAgICByc25BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbihtQ29udGV4dCwgYWQsIGFsbG9jKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjJEU2V0Q29uc3RyYWludChpbnQgY29uLCBpbnQgYWQsIGludCBkaW0sIGludCB2YWx1ZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIyRFNldENvbnN0cmFpbnQoaW50IGFkLCBpbnQgZGltLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgcnNuQWRhcHRlcjJEU2V0Q29uc3RyYWludChtQ29udGV4dCwgYWQsIGRpbSwgdmFsdWUpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMkREYXRhKGludCBjb24sIGludCBhZCwgaW50W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIyRERhdGEoaW50IGFkLCBpbnRbXSBkKSB7CisgICAgICAgIHJzbkFkYXB0ZXIyRERhdGEobUNvbnRleHQsIGFkLCBkKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjJERGF0YShpbnQgY29uLCBpbnQgYWQsIGZsb2F0W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIyRERhdGEoaW50IGFkLCBmbG9hdFtdIGQpIHsKKyAgICAgICAgcnNuQWRhcHRlcjJERGF0YShtQ29udGV4dCwgYWQsIGQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMkRTdWJEYXRhKGludCBjb24sIGludCBhZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGludFtdIGQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMkRTdWJEYXRhKGludCBhZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGludFtdIGQpIHsKKyAgICAgICAgcnNuQWRhcHRlcjJEU3ViRGF0YShtQ29udGV4dCwgYWQsIHhvZmYsIHlvZmYsIHcsIGgsIGQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMkRTdWJEYXRhKGludCBjb24sIGludCBhZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGZsb2F0W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIyRFN1YkRhdGEoaW50IGFkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgZmxvYXRbXSBkKSB7CisgICAgICAgIHJzbkFkYXB0ZXIyRFN1YkRhdGEobUNvbnRleHQsIGFkLCB4b2ZmLCB5b2ZmLCB3LCBoLCBkKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuQWRhcHRlcjJEQ3JlYXRlKGludCBjb24pOworICAgIHN5bmNocm9uaXplZCBpbnQgbkFkYXB0ZXIyRENyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJzbkFkYXB0ZXIyRENyZWF0ZShtQ29udGV4dCk7CisgICAgfQogCi0gICAgbmF0aXZlIGludCAgblByb2dyYW1GcmFnbWVudENyZWF0ZShpbnRbXSBwYXJhbXMpOwotICAgIG5hdGl2ZSBpbnQgIG5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUyKFN0cmluZyBzaGFkZXIsIGludFtdIHBhcmFtcyk7CisgICAgbmF0aXZlIHZvaWQgcnNuU2NyaXB0QmluZEFsbG9jYXRpb24oaW50IGNvbiwgaW50IHNjcmlwdCwgaW50IGFsbG9jLCBpbnQgc2xvdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNjcmlwdEJpbmRBbGxvY2F0aW9uKGludCBzY3JpcHQsIGludCBhbGxvYywgaW50IHNsb3QpIHsKKyAgICAgICAgcnNuU2NyaXB0QmluZEFsbG9jYXRpb24obUNvbnRleHQsIHNjcmlwdCwgYWxsb2MsIHNsb3QpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRTZXRUaW1lWm9uZShpbnQgY29uLCBpbnQgc2NyaXB0LCBieXRlW10gdGltZVpvbmUpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRTZXRUaW1lWm9uZShpbnQgc2NyaXB0LCBieXRlW10gdGltZVpvbmUpIHsKKyAgICAgICAgcnNuU2NyaXB0U2V0VGltZVpvbmUobUNvbnRleHQsIHNjcmlwdCwgdGltZVpvbmUpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRJbnZva2UoaW50IGNvbiwgaW50IGlkLCBpbnQgc2xvdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNjcmlwdEludm9rZShpbnQgaWQsIGludCBzbG90KSB7CisgICAgICAgIHJzblNjcmlwdEludm9rZShtQ29udGV4dCwgaWQsIHNsb3QpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRJbnZva2VWKGludCBjb24sIGludCBpZCwgaW50IHNsb3QsIGJ5dGVbXSBwYXJhbXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRJbnZva2VWKGludCBpZCwgaW50IHNsb3QsIGJ5dGVbXSBwYXJhbXMpIHsKKyAgICAgICAgcnNuU2NyaXB0SW52b2tlVihtQ29udGV4dCwgaWQsIHNsb3QsIHBhcmFtcyk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblNjcmlwdFNldFZhckkoaW50IGNvbiwgaW50IGlkLCBpbnQgc2xvdCwgaW50IHZhbCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNjcmlwdFNldFZhckkoaW50IGlkLCBpbnQgc2xvdCwgaW50IHZhbCkgeworICAgICAgICByc25TY3JpcHRTZXRWYXJJKG1Db250ZXh0LCBpZCwgc2xvdCwgdmFsKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuU2NyaXB0U2V0VmFyRihpbnQgY29uLCBpbnQgaWQsIGludCBzbG90LCBmbG9hdCB2YWwpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRTZXRWYXJGKGludCBpZCwgaW50IHNsb3QsIGZsb2F0IHZhbCkgeworICAgICAgICByc25TY3JpcHRTZXRWYXJGKG1Db250ZXh0LCBpZCwgc2xvdCwgdmFsKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuU2NyaXB0U2V0VmFyRChpbnQgY29uLCBpbnQgaWQsIGludCBzbG90LCBkb3VibGUgdmFsKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuU2NyaXB0U2V0VmFyRChpbnQgaWQsIGludCBzbG90LCBkb3VibGUgdmFsKSB7CisgICAgICAgIHJzblNjcmlwdFNldFZhckQobUNvbnRleHQsIGlkLCBzbG90LCB2YWwpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRTZXRWYXJWKGludCBjb24sIGludCBpZCwgaW50IHNsb3QsIGJ5dGVbXSB2YWwpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRTZXRWYXJWKGludCBpZCwgaW50IHNsb3QsIGJ5dGVbXSB2YWwpIHsKKyAgICAgICAgcnNuU2NyaXB0U2V0VmFyVihtQ29udGV4dCwgaWQsIHNsb3QsIHZhbCk7CisgICAgfQogCi0gICAgbmF0aXZlIGludCAgblByb2dyYW1WZXJ0ZXhDcmVhdGUoYm9vbGVhbiB0ZXhNYXQpOwotICAgIG5hdGl2ZSBpbnQgIG5Qcm9ncmFtVmVydGV4Q3JlYXRlMihTdHJpbmcgc2hhZGVyLCBpbnRbXSBwYXJhbXMpOworICAgIG5hdGl2ZSB2b2lkIHJzblNjcmlwdENCZWdpbihpbnQgY29uKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuU2NyaXB0Q0JlZ2luKCkgeworICAgICAgICByc25TY3JpcHRDQmVnaW4obUNvbnRleHQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRDU2V0U2NyaXB0KGludCBjb24sIGJ5dGVbXSBzY3JpcHQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRDU2V0U2NyaXB0KGJ5dGVbXSBzY3JpcHQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgcnNuU2NyaXB0Q1NldFNjcmlwdChtQ29udGV4dCwgc2NyaXB0LCBvZmZzZXQsIGxlbmd0aCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzblNjcmlwdENDcmVhdGUoaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIGludCBuU2NyaXB0Q0NyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJzblNjcmlwdENDcmVhdGUobUNvbnRleHQpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5MaWdodEJlZ2luKCk7Ci0gICAgbmF0aXZlIHZvaWQgbkxpZ2h0U2V0SXNNb25vKGJvb2xlYW4gaXNNb25vKTsKLSAgICBuYXRpdmUgdm9pZCBuTGlnaHRTZXRJc0xvY2FsKGJvb2xlYW4gaXNMb2NhbCk7Ci0gICAgbmF0aXZlIGludCAgbkxpZ2h0Q3JlYXRlKCk7Ci0gICAgbmF0aXZlIHZvaWQgbkxpZ2h0U2V0Q29sb3IoaW50IGwsIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIpOwotICAgIG5hdGl2ZSB2b2lkIG5MaWdodFNldFBvc2l0aW9uKGludCBsLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKKyAgICBuYXRpdmUgdm9pZCByc25TYW1wbGVyQmVnaW4oaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNhbXBsZXJCZWdpbigpIHsKKyAgICAgICAgcnNuU2FtcGxlckJlZ2luKG1Db250ZXh0KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuU2FtcGxlclNldChpbnQgY29uLCBpbnQgcGFyYW0sIGludCB2YWx1ZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNhbXBsZXJTZXQoaW50IHBhcmFtLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgcnNuU2FtcGxlclNldChtQ29udGV4dCwgcGFyYW0sIHZhbHVlKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuU2FtcGxlclNldDIoaW50IGNvbiwgaW50IHBhcmFtLCBmbG9hdCB2YWx1ZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNhbXBsZXJTZXQyKGludCBwYXJhbSwgZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgcnNuU2FtcGxlclNldDIobUNvbnRleHQsIHBhcmFtLCB2YWx1ZSk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzblNhbXBsZXJDcmVhdGUoaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIGludCBuU2FtcGxlckNyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJzblNhbXBsZXJDcmVhdGUobUNvbnRleHQpOworICAgIH0KIAotICAgIG5hdGl2ZSBpbnQgIG5TaW1wbGVNZXNoQ3JlYXRlKGludCBiYXRjaElELCBpbnQgaWR4SUQsIGludFtdIHZ0eElELCBpbnQgcHJpbSk7Ci0gICAgbmF0aXZlIHZvaWQgblNpbXBsZU1lc2hCaW5kVmVydGV4KGludCBpZCwgaW50IGFsbG9jLCBpbnQgc2xvdCk7Ci0gICAgbmF0aXZlIHZvaWQgblNpbXBsZU1lc2hCaW5kSW5kZXgoaW50IGlkLCBpbnQgYWxsb2MpOworICAgIG5hdGl2ZSB2b2lkIHJzblByb2dyYW1TdG9yZUJlZ2luKGludCBjb24sIGludCBpbiwgaW50IG91dCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1TdG9yZUJlZ2luKGludCBpbiwgaW50IG91dCkgeworICAgICAgICByc25Qcm9ncmFtU3RvcmVCZWdpbihtQ29udGV4dCwgaW4sIG91dCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblByb2dyYW1TdG9yZURlcHRoRnVuYyhpbnQgY29uLCBpbnQgZnVuYyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1TdG9yZURlcHRoRnVuYyhpbnQgZnVuYykgeworICAgICAgICByc25Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMobUNvbnRleHQsIGZ1bmMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVEZXB0aE1hc2soaW50IGNvbiwgYm9vbGVhbiBlbmFibGUpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Qcm9ncmFtU3RvcmVEZXB0aE1hc2soYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgcnNuUHJvZ3JhbVN0b3JlRGVwdGhNYXNrKG1Db250ZXh0LCBlbmFibGUpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVDb2xvck1hc2soaW50IGNvbiwgYm9vbGVhbiByLCBib29sZWFuIGcsIGJvb2xlYW4gYiwgYm9vbGVhbiBhKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuUHJvZ3JhbVN0b3JlQ29sb3JNYXNrKGJvb2xlYW4gciwgYm9vbGVhbiBnLCBib29sZWFuIGIsIGJvb2xlYW4gYSkgeworICAgICAgICByc25Qcm9ncmFtU3RvcmVDb2xvck1hc2sobUNvbnRleHQsIHIsIGcsIGIsIGEpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMoaW50IGNvbiwgaW50IHNyYywgaW50IGRzdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1TdG9yZUJsZW5kRnVuYyhpbnQgc3JjLCBpbnQgZHN0KSB7CisgICAgICAgIHJzblByb2dyYW1TdG9yZUJsZW5kRnVuYyhtQ29udGV4dCwgc3JjLCBkc3QpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVEaXRoZXIoaW50IGNvbiwgYm9vbGVhbiBlbmFibGUpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Qcm9ncmFtU3RvcmVEaXRoZXIoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgcnNuUHJvZ3JhbVN0b3JlRGl0aGVyKG1Db250ZXh0LCBlbmFibGUpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25Qcm9ncmFtU3RvcmVDcmVhdGUoaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIGludCBuUHJvZ3JhbVN0b3JlQ3JlYXRlKCkgeworICAgICAgICByZXR1cm4gcnNuUHJvZ3JhbVN0b3JlQ3JlYXRlKG1Db250ZXh0KTsKKyAgICB9CiAKLSAgICBuYXRpdmUgdm9pZCBuQW5pbWF0aW9uQmVnaW4oaW50IGF0dHJpYkNvdW50LCBpbnQga2V5ZnJhbWVDb3VudCk7Ci0gICAgbmF0aXZlIHZvaWQgbkFuaW1hdGlvbkFkZChmbG9hdCB0aW1lLCBmbG9hdFtdIGF0dHJpYnMpOwotICAgIG5hdGl2ZSBpbnQgIG5BbmltYXRpb25DcmVhdGUoKTsKKyAgICBuYXRpdmUgaW50ICByc25Qcm9ncmFtUmFzdGVyQ3JlYXRlKGludCBjb24sIGJvb2xlYW4gcG9pbnRTbW9vdGgsIGJvb2xlYW4gbGluZVNtb290aCwgYm9vbGVhbiBwb2ludFNwcml0ZSk7CisgICAgc3luY2hyb25pemVkIGludCBuUHJvZ3JhbVJhc3RlckNyZWF0ZShib29sZWFuIHBvaW50U21vb3RoLCBib29sZWFuIGxpbmVTbW9vdGgsIGJvb2xlYW4gcG9pbnRTcHJpdGUpIHsKKyAgICAgICAgcmV0dXJuIHJzblByb2dyYW1SYXN0ZXJDcmVhdGUobUNvbnRleHQsIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgoaW50IGNvbiwgaW50IHByLCBmbG9hdCB2KTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChpbnQgcHIsIGZsb2F0IHYpIHsKKyAgICAgICAgcnNuUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChtQ29udGV4dCwgcHIsIHYpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUoaW50IGNvbiwgaW50IHByLCBpbnQgbW9kZSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShpbnQgcHIsIGludCBtb2RlKSB7CisgICAgICAgIHJzblByb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShtQ29udGV4dCwgcHIsIG1vZGUpOworICAgIH0KKworICAgIG5hdGl2ZSB2b2lkIHJzblByb2dyYW1CaW5kQ29uc3RhbnRzKGludCBjb24sIGludCBwdiwgaW50IHNsb3QsIGludCBtSUQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Qcm9ncmFtQmluZENvbnN0YW50cyhpbnQgcHYsIGludCBzbG90LCBpbnQgbUlEKSB7CisgICAgICAgIHJzblByb2dyYW1CaW5kQ29uc3RhbnRzKG1Db250ZXh0LCBwdiwgc2xvdCwgbUlEKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuUHJvZ3JhbUJpbmRUZXh0dXJlKGludCBjb24sIGludCB2cGYsIGludCBzbG90LCBpbnQgYSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1CaW5kVGV4dHVyZShpbnQgdnBmLCBpbnQgc2xvdCwgaW50IGEpIHsKKyAgICAgICAgcnNuUHJvZ3JhbUJpbmRUZXh0dXJlKG1Db250ZXh0LCB2cGYsIHNsb3QsIGEpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtQmluZFNhbXBsZXIoaW50IGNvbiwgaW50IHZwZiwgaW50IHNsb3QsIGludCBzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuUHJvZ3JhbUJpbmRTYW1wbGVyKGludCB2cGYsIGludCBzbG90LCBpbnQgcykgeworICAgICAgICByc25Qcm9ncmFtQmluZFNhbXBsZXIobUNvbnRleHQsIHZwZiwgc2xvdCwgcyk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzblByb2dyYW1GcmFnbWVudENyZWF0ZShpbnQgY29uLCBTdHJpbmcgc2hhZGVyLCBpbnRbXSBwYXJhbXMpOworICAgIHN5bmNocm9uaXplZCBpbnQgblByb2dyYW1GcmFnbWVudENyZWF0ZShTdHJpbmcgc2hhZGVyLCBpbnRbXSBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIHJzblByb2dyYW1GcmFnbWVudENyZWF0ZShtQ29udGV4dCwgc2hhZGVyLCBwYXJhbXMpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25Qcm9ncmFtVmVydGV4Q3JlYXRlKGludCBjb24sIFN0cmluZyBzaGFkZXIsIGludFtdIHBhcmFtcyk7CisgICAgc3luY2hyb25pemVkIGludCBuUHJvZ3JhbVZlcnRleENyZWF0ZShTdHJpbmcgc2hhZGVyLCBpbnRbXSBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIHJzblByb2dyYW1WZXJ0ZXhDcmVhdGUobUNvbnRleHQsIHNoYWRlciwgcGFyYW1zKTsKKyAgICB9CisKKyAgICBuYXRpdmUgaW50ICByc25NZXNoQ3JlYXRlKGludCBjb24sIGludCB2dHhDb3VudCwgaW50IGluZGV4Q291bnQpOworICAgIHN5bmNocm9uaXplZCBpbnQgbk1lc2hDcmVhdGUoaW50IHZ0eENvdW50LCBpbnQgaW5kZXhDb3VudCkgeworICAgICAgICByZXR1cm4gcnNuTWVzaENyZWF0ZShtQ29udGV4dCwgdnR4Q291bnQsIGluZGV4Q291bnQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25NZXNoQmluZFZlcnRleChpbnQgY29uLCBpbnQgaWQsIGludCBhbGxvYywgaW50IHNsb3QpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5NZXNoQmluZFZlcnRleChpbnQgaWQsIGludCBhbGxvYywgaW50IHNsb3QpIHsKKyAgICAgICAgcnNuTWVzaEJpbmRWZXJ0ZXgobUNvbnRleHQsIGlkLCBhbGxvYywgc2xvdCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbk1lc2hCaW5kSW5kZXgoaW50IGNvbiwgaW50IGlkLCBpbnQgYWxsb2MsIGludCBwcmltLCBpbnQgc2xvdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbk1lc2hCaW5kSW5kZXgoaW50IGlkLCBpbnQgYWxsb2MsIGludCBwcmltLCBpbnQgc2xvdCkgeworICAgICAgICByc25NZXNoQmluZEluZGV4KG1Db250ZXh0LCBpZCwgYWxsb2MsIHByaW0sIHNsb3QpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQoaW50IGNvbiwgaW50IGlkKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQoaW50IGlkKSB7CisgICAgICAgIHJldHVybiByc25NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQobUNvbnRleHQsIGlkKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuTWVzaEdldEluZGV4Q291bnQoaW50IGNvbiwgaW50IGlkKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5NZXNoR2V0SW5kZXhDb3VudChpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIHJzbk1lc2hHZXRJbmRleENvdW50KG1Db250ZXh0LCBpZCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbk1lc2hHZXRWZXJ0aWNlcyhpbnQgY29uLCBpbnQgaWQsIGludFtdIHZ0eElkcywgaW50IHZ0eElkQ291bnQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5NZXNoR2V0VmVydGljZXMoaW50IGlkLCBpbnRbXSB2dHhJZHMsIGludCB2dHhJZENvdW50KSB7CisgICAgICAgIHJzbk1lc2hHZXRWZXJ0aWNlcyhtQ29udGV4dCwgaWQsIHZ0eElkcywgdnR4SWRDb3VudCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbk1lc2hHZXRJbmRpY2VzKGludCBjb24sIGludCBpZCwgaW50W10gaWR4SWRzLCBpbnRbXSBwcmltaXRpdmVzLCBpbnQgdnR4SWRDb3VudCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbk1lc2hHZXRJbmRpY2VzKGludCBpZCwgaW50W10gaWR4SWRzLCBpbnRbXSBwcmltaXRpdmVzLCBpbnQgdnR4SWRDb3VudCkgeworICAgICAgICByc25NZXNoR2V0SW5kaWNlcyhtQ29udGV4dCwgaWQsIGlkeElkcywgcHJpbWl0aXZlcywgdnR4SWRDb3VudCk7CisgICAgfQorCiAKICAgICBwcm90ZWN0ZWQgaW50ICAgICBtRGV2OwogICAgIHByb3RlY3RlZCBpbnQgICAgIG1Db250ZXh0OwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCiAgICAgcHJvdGVjdGVkIE1lc3NhZ2VUaHJlYWQgbU1lc3NhZ2VUaHJlYWQ7CiAKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfVTg7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX0k4OwotICAgIEVsZW1lbnQgbUVsZW1lbnRfVVNFUl9VMTY7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX0kxNjsKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfVTMyOwotICAgIEVsZW1lbnQgbUVsZW1lbnRfVVNFUl9JMzI7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX0YzMjsKKyAgICBFbGVtZW50IG1FbGVtZW50X1U4OworICAgIEVsZW1lbnQgbUVsZW1lbnRfSTg7CisgICAgRWxlbWVudCBtRWxlbWVudF9VMTY7CisgICAgRWxlbWVudCBtRWxlbWVudF9JMTY7CisgICAgRWxlbWVudCBtRWxlbWVudF9VMzI7CisgICAgRWxlbWVudCBtRWxlbWVudF9JMzI7CisgICAgRWxlbWVudCBtRWxlbWVudF9JNjQ7CisgICAgRWxlbWVudCBtRWxlbWVudF9GMzI7CisgICAgRWxlbWVudCBtRWxlbWVudF9GNjQ7CisgICAgRWxlbWVudCBtRWxlbWVudF9CT09MRUFOOworCisgICAgRWxlbWVudCBtRWxlbWVudF9FTEVNRU5UOworICAgIEVsZW1lbnQgbUVsZW1lbnRfVFlQRTsKKyAgICBFbGVtZW50IG1FbGVtZW50X0FMTE9DQVRJT047CisgICAgRWxlbWVudCBtRWxlbWVudF9TQU1QTEVSOworICAgIEVsZW1lbnQgbUVsZW1lbnRfU0NSSVBUOworICAgIEVsZW1lbnQgbUVsZW1lbnRfTUVTSDsKKyAgICBFbGVtZW50IG1FbGVtZW50X1BST0dSQU1fRlJBR01FTlQ7CisgICAgRWxlbWVudCBtRWxlbWVudF9QUk9HUkFNX1ZFUlRFWDsKKyAgICBFbGVtZW50IG1FbGVtZW50X1BST0dSQU1fUkFTVEVSOworICAgIEVsZW1lbnQgbUVsZW1lbnRfUFJPR1JBTV9TVE9SRTsKIAogICAgIEVsZW1lbnQgbUVsZW1lbnRfQV84OwogICAgIEVsZW1lbnQgbUVsZW1lbnRfUkdCXzU2NTsKQEAgLTIxMCwxMyArNTMzLDM4IEBACiAgICAgRWxlbWVudCBtRWxlbWVudF9SR0JBXzQ0NDQ7CiAgICAgRWxlbWVudCBtRWxlbWVudF9SR0JBXzg4ODg7CiAKLSAgICBFbGVtZW50IG1FbGVtZW50X0lOREVYXzE2OwotICAgIEVsZW1lbnQgbUVsZW1lbnRfUE9TSVRJT05fMjsKLSAgICBFbGVtZW50IG1FbGVtZW50X1BPU0lUSU9OXzM7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9URVhUVVJFXzI7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9OT1JNQUxfMzsKLSAgICBFbGVtZW50IG1FbGVtZW50X0NPTE9SX1U4XzQ7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9DT0xPUl9GMzJfNDsKKyAgICBFbGVtZW50IG1FbGVtZW50X0ZMT0FUXzI7CisgICAgRWxlbWVudCBtRWxlbWVudF9GTE9BVF8zOworICAgIEVsZW1lbnQgbUVsZW1lbnRfRkxPQVRfNDsKKyAgICBFbGVtZW50IG1FbGVtZW50X1VDSEFSXzQ7CisKKyAgICBFbGVtZW50IG1FbGVtZW50X01BVFJJWF80WDQ7CisgICAgRWxlbWVudCBtRWxlbWVudF9NQVRSSVhfM1gzOworICAgIEVsZW1lbnQgbUVsZW1lbnRfTUFUUklYXzJYMjsKKworICAgIFNhbXBsZXIgbVNhbXBsZXJfQ0xBTVBfTkVBUkVTVDsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX0NMQU1QX0xJTkVBUjsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX0NMQU1QX0xJTkVBUl9NSVBfTElORUFSOworICAgIFNhbXBsZXIgbVNhbXBsZXJfV1JBUF9ORUFSRVNUOworICAgIFNhbXBsZXIgbVNhbXBsZXJfV1JBUF9MSU5FQVI7CisgICAgU2FtcGxlciBtU2FtcGxlcl9XUkFQX0xJTkVBUl9NSVBfTElORUFSOworCisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9URVNUOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fREVQVEg7CisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19URVNUOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fV1JJVEU7CisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfVEVTVDsKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19ERVBUSDsKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19URVNUOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX1dSSVRFOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9URVNUOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19ERVBUSDsKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fVEVTVDsKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fV1JJVEU7CisKKyAgICBQcm9ncmFtUmFzdGVyIG1Qcm9ncmFtUmFzdGVyX0NVTExfQkFDSzsKKyAgICBQcm9ncmFtUmFzdGVyIG1Qcm9ncmFtUmFzdGVyX0NVTExfRlJPTlQ7CisgICAgUHJvZ3JhbVJhc3RlciBtUHJvZ3JhbVJhc3Rlcl9DVUxMX05PTkU7CiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIC8vCkBAIC0yNjQsMjUgKzYxMiwzMiBAQAogICAgICAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhIHRlbXBvcmFyeSBzb2x1dGlvbi4gIFRoZSBmaW5hbCBzb2x1dGlvbiB3aWxsCiAgICAgICAgICAgICAvLyB1c2VkIHR5cGVkIGFsbG9jYXRpb25zIHdoZXJlIHRoZSBtZXNzYWdlIGlkIGlzIHRoZSB0eXBlIGluZGljYXRvci4KICAgICAgICAgICAgIGludFtdIHJidWYgPSBuZXcgaW50WzE2XTsKLSAgICAgICAgICAgIG1SUy5uQ29udGV4dEluaXRUb0NsaWVudCgpOworICAgICAgICAgICAgbVJTLm5Db250ZXh0SW5pdFRvQ2xpZW50KG1SUy5tQ29udGV4dCk7CiAgICAgICAgICAgICB3aGlsZShtUnVuKSB7Ci0gICAgICAgICAgICAgICAgaW50IG1zZyA9IG1SUy5uQ29udGV4dEdldE1lc3NhZ2UocmJ1ZiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1zZyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBvbmx5IGhhcHBlbiBkdXJpbmcgdGVhcmRvd24uCi0gICAgICAgICAgICAgICAgICAgIC8vIEJ1dCB3ZSB3YW50IHRvIGF2b2lkIHN0YXJ2aW5nIG90aGVyIHRocmVhZHMgZHVyaW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIHRlYXJkb3duIGJ5IHlpZWxkaW5nIHVudGlsIHRoZSBuZXh0IGxpbmUgaW4gdGhlIGRlc3RydWN0b3IKLSAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGV4ZWN1dGUgdG8gc2V0IG1SdW4gPSBmYWxzZQotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXAoMSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJidWZbMF0gPSAwOworICAgICAgICAgICAgICAgIGludCBtc2cgPSBtUlMubkNvbnRleHRHZXRNZXNzYWdlKG1SUy5tQ29udGV4dCwgcmJ1ZiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKChtc2cgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2FuIGhhcHBlbiBmb3IgdHdvIHJlYXNvbnMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJidWZbMF0gPiAwICYmIG1SdW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDE6IEJ1ZmZlciBuZWVkcyB0byBiZSBlbmxhcmdlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJidWYgPSBuZXcgaW50W3JidWZbMF0gKyAyXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI6IHRlYXJkb3duLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnV0IHdlIHdhbnQgdG8gYXZvaWQgc3RhcnZpbmcgb3RoZXIgdGhyZWFkcyBkdXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlYXJkb3duIGJ5IHlpZWxkaW5nIHVudGlsIHRoZSBuZXh0IGxpbmUgaW4gdGhlIGRlc3RydWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbiBleGVjdXRlIHRvIHNldCBtUnVuID0gZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXAoMSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYobVJTLm1NZXNzYWdlQ2FsbGJhY2sgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBtUlMubU1lc3NhZ2VDYWxsYmFjay5tRGF0YSA9IHJidWY7CiAgICAgICAgICAgICAgICAgICAgIG1SUy5tTWVzc2FnZUNhbGxiYWNrLm1JRCA9IG1zZzsKICAgICAgICAgICAgICAgICAgICAgbVJTLm1NZXNzYWdlQ2FsbGJhY2sucnVuKCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vTG9nLmQoTE9HX1RBRywgIk1lc3NhZ2VUaHJlYWQgbXNnICIgKyBtc2cgKyAiIHYxICIgKyByYnVmWzBdICsgIiB2MiAiICsgcmJ1ZlsxXSArICIgdjMgIiArcmJ1ZlsyXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiTWVzc2FnZVRocmVhZCBleGl0aW5nLiIpOwogICAgICAgICB9CkBAIC0zMDcsMTIgKzY2MiwyMCBAQAogICAgICAgICBuQ29udGV4dER1bXAoYml0cyk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgICAgICBuQ29udGV4dEZpbmlzaCgpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CiAgICAgICAgIHZhbGlkYXRlKCk7Ci0gICAgICAgIG5Db250ZXh0RGVpbml0VG9DbGllbnQoKTsKKyAgICAgICAgbkNvbnRleHREZWluaXRUb0NsaWVudChtQ29udGV4dCk7CiAgICAgICAgIG1NZXNzYWdlVGhyZWFkLm1SdW4gPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1NZXNzYWdlVGhyZWFkLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KIAotICAgICAgICBuQ29udGV4dERlc3Ryb3kobUNvbnRleHQpOworICAgICAgICBuQ29udGV4dERlc3Ryb3koKTsKICAgICAgICAgbUNvbnRleHQgPSAwOwogCiAgICAgICAgIG5EZXZpY2VEZXN0cm95KG1EZXYpOwpAQCAtMzM1LDMgKzY5OCw0IEBACiB9CiAKIAorCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdEdMLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdEdMLmphdmEKaW5kZXggZDFkZjIzZC4uNjFlY2M4ZCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHRHTC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0R0wuamF2YQpAQCAtNzQsOSArNzQsOSBAQAogICAgICAgICBuQ29udGV4dEJpbmRSb290U2NyaXB0KHNhZmVJRChzKSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgY29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShQcm9ncmFtU3RvcmUgcCkgeworICAgIHB1YmxpYyB2b2lkIGNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKFByb2dyYW1TdG9yZSBwKSB7CiAgICAgICAgIHZhbGlkYXRlKCk7Ci0gICAgICAgIG5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlKHNhZmVJRChwKSk7CisgICAgICAgIG5Db250ZXh0QmluZFByb2dyYW1TdG9yZShzYWZlSUQocCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KFByb2dyYW1GcmFnbWVudCBwKSB7CkBAIC0xMDIsOCArMTAyLDcgQEAKIAogICAgIHB1YmxpYyBjbGFzcyBGaWxlIGV4dGVuZHMgQmFzZU9iaiB7CiAgICAgICAgIEZpbGUoaW50IGlkKSB7Ci0gICAgICAgICAgICBzdXBlcihSZW5kZXJTY3JpcHRHTC50aGlzKTsKLSAgICAgICAgICAgIG1JRCA9IGlkOworICAgICAgICAgICAgc3VwZXIoaWQsIFJlbmRlclNjcmlwdEdMLnRoaXMpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NhbXBsZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2FtcGxlci5qYXZhCmluZGV4IDQwYmE3MjIuLmI2MjcyMDcgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2FtcGxlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2FtcGxlci5qYXZhCkBAIC00NywxMCArNDcsODIgQEAKICAgICB9CiAKICAgICBTYW1wbGVyKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBTYW1wbGVyIENMQU1QX05FQVJFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1TYW1wbGVyX0NMQU1QX05FQVJFU1QgPT0gbnVsbCkgeworICAgICAgICAgICAgQnVpbGRlciBiID0gbmV3IEJ1aWxkZXIocnMpOworICAgICAgICAgICAgYi5zZXRNaW4oVmFsdWUuTkVBUkVTVCk7CisgICAgICAgICAgICBiLnNldE1hZyhWYWx1ZS5ORUFSRVNUKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFMoVmFsdWUuQ0xBTVApOworICAgICAgICAgICAgYi5zZXRXcmFwVChWYWx1ZS5DTEFNUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9DTEFNUF9ORUFSRVNUID0gYi5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVNhbXBsZXJfQ0xBTVBfTkVBUkVTVDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNhbXBsZXIgQ0xBTVBfTElORUFSKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tU2FtcGxlcl9DTEFNUF9MSU5FQVIgPT0gbnVsbCkgeworICAgICAgICAgICAgQnVpbGRlciBiID0gbmV3IEJ1aWxkZXIocnMpOworICAgICAgICAgICAgYi5zZXRNaW4oVmFsdWUuTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0TWFnKFZhbHVlLkxJTkVBUik7CisgICAgICAgICAgICBiLnNldFdyYXBTKFZhbHVlLkNMQU1QKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFQoVmFsdWUuQ0xBTVApOworICAgICAgICAgICAgcnMubVNhbXBsZXJfQ0xBTVBfTElORUFSID0gYi5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVNhbXBsZXJfQ0xBTVBfTElORUFSOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2FtcGxlciBDTEFNUF9MSU5FQVJfTUlQX0xJTkVBUihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVNhbXBsZXJfQ0xBTVBfTElORUFSX01JUF9MSU5FQVIgPT0gbnVsbCkgeworICAgICAgICAgICAgQnVpbGRlciBiID0gbmV3IEJ1aWxkZXIocnMpOworICAgICAgICAgICAgYi5zZXRNaW4oVmFsdWUuTElORUFSX01JUF9MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRNYWcoVmFsdWUuTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFMoVmFsdWUuQ0xBTVApOworICAgICAgICAgICAgYi5zZXRXcmFwVChWYWx1ZS5DTEFNUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9DTEFNUF9MSU5FQVJfTUlQX0xJTkVBUiA9IGIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1TYW1wbGVyX0NMQU1QX0xJTkVBUl9NSVBfTElORUFSOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2FtcGxlciBXUkFQX05FQVJFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1TYW1wbGVyX1dSQVBfTkVBUkVTVCA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5ORUFSRVNUKTsKKyAgICAgICAgICAgIGIuc2V0TWFnKFZhbHVlLk5FQVJFU1QpOworICAgICAgICAgICAgYi5zZXRXcmFwUyhWYWx1ZS5XUkFQKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFQoVmFsdWUuV1JBUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9XUkFQX05FQVJFU1QgPSBiLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tU2FtcGxlcl9XUkFQX05FQVJFU1Q7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTYW1wbGVyIFdSQVBfTElORUFSKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tU2FtcGxlcl9XUkFQX0xJTkVBUiA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRNYWcoVmFsdWUuTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFMoVmFsdWUuV1JBUCk7CisgICAgICAgICAgICBiLnNldFdyYXBUKFZhbHVlLldSQVApOworICAgICAgICAgICAgcnMubVNhbXBsZXJfV1JBUF9MSU5FQVIgPSBiLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tU2FtcGxlcl9XUkFQX0xJTkVBUjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNhbXBsZXIgV1JBUF9MSU5FQVJfTUlQX0xJTkVBUihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVNhbXBsZXJfV1JBUF9MSU5FQVJfTUlQX0xJTkVBUiA9PSBudWxsKSB7CisgICAgICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycyk7CisgICAgICAgICAgICBiLnNldE1pbihWYWx1ZS5MSU5FQVJfTUlQX0xJTkVBUik7CisgICAgICAgICAgICBiLnNldE1hZyhWYWx1ZS5MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRXcmFwUyhWYWx1ZS5XUkFQKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFQoVmFsdWUuV1JBUCk7CisgICAgICAgICAgICBycy5tU2FtcGxlcl9XUkFQX0xJTkVBUl9NSVBfTElORUFSID0gYi5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVNhbXBsZXJfV1JBUF9MSU5FQVJfTUlQX0xJTkVBUjsKKyAgICB9CisKKwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CiAgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CiAgICAgICAgIFZhbHVlIG1NaW47CkBAIC01OCw2ICsxMzAsNyBAQAogICAgICAgICBWYWx1ZSBtV3JhcFM7CiAgICAgICAgIFZhbHVlIG1XcmFwVDsKICAgICAgICAgVmFsdWUgbVdyYXBSOworICAgICAgICBmbG9hdCBtQW5pc287CiAKICAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CiAgICAgICAgICAgICBtUlMgPSByczsKQEAgLTY2LDYgKzEzOSw3IEBACiAgICAgICAgICAgICBtV3JhcFMgPSBWYWx1ZS5XUkFQOwogICAgICAgICAgICAgbVdyYXBUID0gVmFsdWUuV1JBUDsKICAgICAgICAgICAgIG1XcmFwUiA9IFZhbHVlLldSQVA7CisgICAgICAgICAgICBtQW5pc28gPSAxLjBmOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgc2V0TWluKFZhbHVlIHYpIHsKQEAgLTExMCw2ICsxODQsMTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEFuaXNvdHJvcHkoZmxvYXQgdikgeworICAgICAgICAgICAgaWYodiA+PSAwLjBmKSB7CisgICAgICAgICAgICAgICAgbUFuaXNvID0gdjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCB2YWx1ZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBTYW1wbGVyIGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgQnVpbGRlciBiKSB7CiAgICAgICAgICAgICBycy5uU2FtcGxlckJlZ2luKCk7CiAgICAgICAgICAgICBycy5uU2FtcGxlclNldCgwLCBiLm1NaW4ubUlEKTsKQEAgLTExNyw2ICsxOTksNyBAQAogICAgICAgICAgICAgcnMublNhbXBsZXJTZXQoMiwgYi5tV3JhcFMubUlEKTsKICAgICAgICAgICAgIHJzLm5TYW1wbGVyU2V0KDMsIGIubVdyYXBULm1JRCk7CiAgICAgICAgICAgICBycy5uU2FtcGxlclNldCg0LCBiLm1XcmFwUi5tSUQpOworICAgICAgICAgICAgcnMublNhbXBsZXJTZXQyKDUsIGIubUFuaXNvKTsKICAgICAgICAgICAgIGludCBpZCA9IHJzLm5TYW1wbGVyQ3JlYXRlKCk7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFNhbXBsZXIoaWQsIHJzKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0LmphdmEKaW5kZXggNTdjY2ZhMy4uODc3MmM0YyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdC5qYXZhCkBAIC00MiwyOSArNDIsNTAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByb3RlY3RlZCB2b2lkIGludm9rZShpbnQgc2xvdCkgeworICAgICAgICBtUlMublNjcmlwdEludm9rZShtSUQsIHNsb3QpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGludm9rZShpbnQgc2xvdCwgRmllbGRQYWNrZXIgdikgeworICAgICAgICBpZiAodiAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMublNjcmlwdEludm9rZVYobUlELCBzbG90LCB2LmdldERhdGEoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUlMublNjcmlwdEludm9rZShtSUQsIHNsb3QpOworICAgICAgICB9CisgICAgfQorCisKICAgICBTY3JpcHQoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgc3VwZXIocnMpOwotICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBiaW5kQWxsb2NhdGlvbihBbGxvY2F0aW9uIHZhLCBpbnQgc2xvdCkgewogICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5TY3JpcHRCaW5kQWxsb2NhdGlvbihtSUQsIHZhLm1JRCwgc2xvdCk7CisgICAgICAgIGlmICh2YSAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMublNjcmlwdEJpbmRBbGxvY2F0aW9uKG1JRCwgdmEubUlELCBzbG90KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1SUy5uU2NyaXB0QmluZEFsbG9jYXRpb24obUlELCAwLCBzbG90KTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldENsZWFyQ29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5TY3JpcHRTZXRDbGVhckNvbG9yKG1JRCwgciwgZywgYiwgYSk7CisgICAgcHVibGljIHZvaWQgc2V0VmFyKGludCBpbmRleCwgZmxvYXQgdikgeworICAgICAgICBtUlMublNjcmlwdFNldFZhckYobUlELCBpbmRleCwgdik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0Q2xlYXJEZXB0aChmbG9hdCBkKSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMublNjcmlwdFNldENsZWFyRGVwdGgobUlELCBkKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRWYXIoaW50IGluZGV4LCBkb3VibGUgdikgeworICAgICAgICBtUlMublNjcmlwdFNldFZhckQobUlELCBpbmRleCwgdik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0Q2xlYXJTdGVuY2lsKGludCBzdGVuY2lsKSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMublNjcmlwdFNldENsZWFyU3RlbmNpbChtSUQsIHN0ZW5jaWwpOworICAgIHB1YmxpYyB2b2lkIHNldFZhcihpbnQgaW5kZXgsIGludCB2KSB7CisgICAgICAgIG1SUy5uU2NyaXB0U2V0VmFySShtSUQsIGluZGV4LCB2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYXIoaW50IGluZGV4LCBib29sZWFuIHYpIHsKKyAgICAgICAgbVJTLm5TY3JpcHRTZXRWYXJJKG1JRCwgaW5kZXgsIHYgPyAxIDogMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFyKGludCBpbmRleCwgRmllbGRQYWNrZXIgdikgeworICAgICAgICBtUlMublNjcmlwdFNldFZhclYobUlELCBpbmRleCwgdi5nZXREYXRhKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldFRpbWVab25lKFN0cmluZyB0aW1lWm9uZSkgewpAQCAtNzgsNzIgKzk5LDU0IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgewogICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOwotICAgICAgICBib29sZWFuIG1Jc1Jvb3QgPSBmYWxzZTsKLSAgICAgICAgVHlwZVtdIG1UeXBlczsKLSAgICAgICAgU3RyaW5nW10gbU5hbWVzOwotICAgICAgICBib29sZWFuW10gbVdyaXRhYmxlOwotICAgICAgICBpbnQgbUludm9rYWJsZUNvdW50ID0gMDsKLSAgICAgICAgSW52b2thYmxlW10gbUludm9rYWJsZXM7CiAKICAgICAgICAgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKICAgICAgICAgICAgIG1SUyA9IHJzOwotICAgICAgICAgICAgbVR5cGVzID0gbmV3IFR5cGVbTUFYX1NMT1RdOwotICAgICAgICAgICAgbU5hbWVzID0gbmV3IFN0cmluZ1tNQVhfU0xPVF07Ci0gICAgICAgICAgICBtV3JpdGFibGUgPSBuZXcgYm9vbGVhbltNQVhfU0xPVF07Ci0gICAgICAgICAgICBtSW52b2thYmxlcyA9IG5ldyBJbnZva2FibGVbTUFYX1NMT1RdOwogICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VHlwZShUeXBlIHQsIGludCBzbG90KSB7Ci0gICAgICAgICAgICBtVHlwZXNbc2xvdF0gPSB0OwotICAgICAgICAgICAgbU5hbWVzW3Nsb3RdID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoVHlwZSB0LCBTdHJpbmcgbmFtZSwgaW50IHNsb3QpIHsKLSAgICAgICAgICAgIG1UeXBlc1tzbG90XSA9IHQ7Ci0gICAgICAgICAgICBtTmFtZXNbc2xvdF0gPSBuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEludm9rYWJsZSBhZGRJbnZva2FibGUoU3RyaW5nIGZ1bmMpIHsKLSAgICAgICAgICAgIEludm9rYWJsZSBpID0gbmV3IEludm9rYWJsZSgpOwotICAgICAgICAgICAgaS5tTmFtZSA9IGZ1bmM7Ci0gICAgICAgICAgICBpLm1SUyA9IG1SUzsKLSAgICAgICAgICAgIGkubVNsb3QgPSBtSW52b2thYmxlQ291bnQ7Ci0gICAgICAgICAgICBtSW52b2thYmxlc1ttSW52b2thYmxlQ291bnQrK10gPSBpOwotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKGJvb2xlYW4gd3JpdGFibGUsIGludCBzbG90KSB7Ci0gICAgICAgICAgICBtV3JpdGFibGVbc2xvdF0gPSB3cml0YWJsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdHJhbnNmZXJDcmVhdGUoKSB7Ci0gICAgICAgICAgICBtUlMublNjcmlwdFNldFJvb3QobUlzUm9vdCk7Ci0gICAgICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgbVR5cGVzLmxlbmd0aDsgY3QrKykgewotICAgICAgICAgICAgICAgIGlmKG1UeXBlc1tjdF0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUlMublNjcmlwdFNldFR5cGUobVR5cGVzW2N0XS5tSUQsIG1Xcml0YWJsZVtjdF0sIG1OYW1lc1tjdF0sIGN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgbUludm9rYWJsZUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICAgICAgbVJTLm5TY3JpcHRTZXRJbnZva2FibGUobUludm9rYWJsZXNbY3RdLm1OYW1lLCBjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHRyYW5zZmVyT2JqZWN0KFNjcmlwdCBzKSB7Ci0gICAgICAgICAgICBzLm1Jc1Jvb3QgPSBtSXNSb290OwotICAgICAgICAgICAgcy5tVHlwZXMgPSBtVHlwZXM7Ci0gICAgICAgICAgICBzLm1JbnZva2FibGVzID0gbmV3IEludm9rYWJsZVttSW52b2thYmxlQ291bnRdOwotICAgICAgICAgICAgZm9yKGludCBjdD0wOyBjdCA8IG1JbnZva2FibGVDb3VudDsgY3QrKykgewotICAgICAgICAgICAgICAgIHMubUludm9rYWJsZXNbY3RdID0gbUludm9rYWJsZXNbY3RdOwotICAgICAgICAgICAgICAgIHMubUludm9rYWJsZXNbY3RdLm1TY3JpcHQgPSBzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcy5tSW52b2thYmxlcyA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRSb290KGJvb2xlYW4gcikgewotICAgICAgICAgICAgbUlzUm9vdCA9IHI7Ci0gICAgICAgIH0KLQogICAgIH0KIAorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWVsZEJhc2UgeworICAgICAgICBwcm90ZWN0ZWQgRWxlbWVudCBtRWxlbWVudDsKKyAgICAgICAgcHJvdGVjdGVkIFR5cGUgbVR5cGU7CisgICAgICAgIHByb3RlY3RlZCBBbGxvY2F0aW9uIG1BbGxvY2F0aW9uOworCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGluaXQoUmVuZGVyU2NyaXB0IHJzLCBpbnQgZGlteCkgeworICAgICAgICAgICAgbUFsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKHJzLCBtRWxlbWVudCwgZGlteCk7CisgICAgICAgICAgICBtVHlwZSA9IG1BbGxvY2F0aW9uLmdldFR5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBGaWVsZEJhc2UoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1FbGVtZW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBbGxvY2F0aW9uIGdldEFsbG9jYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbUFsbG9jYXRpb247CisgICAgICAgIH0KKworICAgICAgICAvL0BPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVBbGxvY2F0aW9uKCkgeworICAgICAgICB9CisKKworICAgICAgICAvLworICAgICAgICAvKgorICAgICAgICBwdWJsaWMgY2xhc3MgU2NyaXB0RmllbGRfVXNlckZpZWxkCisgICAgICAgICAgICBleHRlbmRzIGFuZHJvaWQucmVuZGVyc2NyaXB0LlNjcmlwdC5GaWVsZEJhc2UgeworCisgICAgICAgICAgICBwcm90ZWN0ZWQKKworICAgICAgICB9CisKKyAgICAgICAgKi8KKworICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHRDLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdEMuamF2YQppbmRleCBiYjk5ZTIzLi41OTU5YmU0IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdEMuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdEMuamF2YQpAQCAtMzcsMTEgKzM3LDQ5IEBACiAgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgfQogCisgICAgcHJvdGVjdGVkIFNjcmlwdEMoUmVuZGVyU2NyaXB0IHJzLCBSZXNvdXJjZXMgcmVzb3VyY2VzLCBpbnQgcmVzb3VyY2VJRCwgYm9vbGVhbiBpc1Jvb3QpIHsKKyAgICAgICAgc3VwZXIoMCwgcnMpOworICAgICAgICBtSUQgPSBpbnRlcm5hbENyZWF0ZShycywgcmVzb3VyY2VzLCByZXNvdXJjZUlEKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBpbnQgaW50ZXJuYWxDcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBSZXNvdXJjZXMgcmVzb3VyY2VzLCBpbnQgcmVzb3VyY2VJRCkgeworICAgICAgICBieXRlW10gcGdtOworICAgICAgICBpbnQgcGdtTGVuZ3RoOworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHJlc291cmNlcy5vcGVuUmF3UmVzb3VyY2UocmVzb3VyY2VJRCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHBnbSA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICAgICAgICAgIHBnbUxlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNMZWZ0ID0gcGdtLmxlbmd0aCAtIHBnbUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzTGVmdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmMiA9IG5ldyBieXRlW3BnbS5sZW5ndGggKiAyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocGdtLCAwLCBidWYyLCAwLCBwZ20ubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBnbSA9IGJ1ZjI7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc0xlZnQgPSBwZ20ubGVuZ3RoIC0gcGdtTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBieXRlc1JlYWQgPSBpcy5yZWFkKHBnbSwgcGdtTGVuZ3RoLCBieXRlc0xlZnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBnbUxlbmd0aCArPSBieXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHJzLm5TY3JpcHRDQmVnaW4oKTsKKyAgICAgICAgcnMublNjcmlwdENTZXRTY3JpcHQocGdtLCAwLCBwZ21MZW5ndGgpOworICAgICAgICByZXR1cm4gcnMublNjcmlwdENDcmVhdGUoKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgZXh0ZW5kcyBTY3JpcHQuQnVpbGRlciB7CiAgICAgICAgIGJ5dGVbXSBtUHJvZ3JhbTsKICAgICAgICAgaW50IG1Qcm9ncmFtTGVuZ3RoOwotICAgICAgICBIYXNoTWFwPFN0cmluZyxJbnRlZ2VyPiBtSW50RGVmaW5lcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLEZsb2F0PiBtRmxvYXREZWZpbmVzID0gbmV3IEhhc2hNYXAoKTsKIAogICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKICAgICAgICAgICAgIHN1cGVyKHJzKTsKQEAgLTkyLDY2ICsxMzAsMjAgQEAKIAogICAgICAgICBzdGF0aWMgc3luY2hyb25pemVkIFNjcmlwdEMgaW50ZXJuYWxDcmVhdGUoQnVpbGRlciBiKSB7CiAgICAgICAgICAgICBiLm1SUy5uU2NyaXB0Q0JlZ2luKCk7Ci0gICAgICAgICAgICBiLnRyYW5zZmVyQ3JlYXRlKCk7CiAKLSAgICAgICAgICAgIGZvciAoRW50cnk8U3RyaW5nLEludGVnZXI+IGU6IGIubUludERlZmluZXMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIGIubVJTLm5TY3JpcHRDQWRkRGVmaW5lSTMyKGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoRW50cnk8U3RyaW5nLEZsb2F0PiBlOiBiLm1GbG9hdERlZmluZXMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIGIubVJTLm5TY3JpcHRDQWRkRGVmaW5lRihlLmdldEtleSgpLCBlLmdldFZhbHVlKCkuZmxvYXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKCJycyIsICJsZW4gPSAiICsgYi5tUHJvZ3JhbUxlbmd0aCk7CiAgICAgICAgICAgICBiLm1SUy5uU2NyaXB0Q1NldFNjcmlwdChiLm1Qcm9ncmFtLCAwLCBiLm1Qcm9ncmFtTGVuZ3RoKTsKIAogICAgICAgICAgICAgaW50IGlkID0gYi5tUlMublNjcmlwdENDcmVhdGUoKTsKICAgICAgICAgICAgIFNjcmlwdEMgb2JqID0gbmV3IFNjcmlwdEMoaWQsIGIubVJTKTsKLSAgICAgICAgICAgIGIudHJhbnNmZXJPYmplY3Qob2JqKTsKLQogICAgICAgICAgICAgcmV0dXJuIG9iajsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZShTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7Ci0gICAgICAgICAgICBtSW50RGVmaW5lcy5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lKFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSkgewotICAgICAgICAgICAgbUZsb2F0RGVmaW5lcy5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRha2VzIHRoZSBhbGwgcHVibGljIHN0YXRpYyBmaW5hbCBmaWVsZHMgZm9yIGEgY2xhc3MsIGFuZCBhZGRzIGRlZmluZXMKLSAgICAgICAgICogZm9yIHRoZW0sIHVzaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhcyB0aGUgbmFtZSBvZiB0aGUgZGVmaW5lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lcyhDbGFzcyBjbCkgewotICAgICAgICAgICAgYWRkRGVmaW5lcyhjbC5nZXRGaWVsZHMoKSwgKE1vZGlmaWVyLlNUQVRJQyB8IE1vZGlmaWVyLkZJTkFMIHwgTW9kaWZpZXIuUFVCTElDKSwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGFrZXMgdGhlIGFsbCBwdWJsaWMgZmllbGRzIGZvciBhbiBvYmplY3QsIGFuZCBhZGRzIGRlZmluZXMKLSAgICAgICAgICogZm9yIHRoZW0sIHVzaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhcyB0aGUgbmFtZSBvZiB0aGUgZGVmaW5lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lcyhPYmplY3QgbykgewotICAgICAgICAgICAgYWRkRGVmaW5lcyhvLmdldENsYXNzKCkuZ2V0RmllbGRzKCksIE1vZGlmaWVyLlBVQkxJQywgbyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFkZERlZmluZXMoRmllbGRbXSBmaWVsZHMsIGludCBtYXNrLCBPYmplY3QgbykgewotICAgICAgICAgICAgZm9yIChGaWVsZCBmOiBmaWVsZHMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGYuZ2V0TW9kaWZpZXJzKCkgJiBtYXNrKSA9PSBtYXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyB0ID0gZi5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA9PSBpbnQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW50RGVmaW5lcy5wdXQoZi5nZXROYW1lKCksIGYuZ2V0SW50KG8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHQgPT0gZmxvYXQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmxvYXREZWZpbmVzLnB1dChmLmdldE5hbWUoKSwgZi5nZXRGbG9hdChvKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IERvIHdlIHdhbnQgdGhpcyBsb2c/Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImFkZERlZmluZXMgc2tpcHBpbmcgZmllbGQgIiArIGYuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZShTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZXMoQ2xhc3MgY2wpIHt9CisgICAgICAgIHB1YmxpYyB2b2lkIGFkZERlZmluZXMoT2JqZWN0IG8pIHt9CisgICAgICAgIHZvaWQgYWRkRGVmaW5lcyhGaWVsZFtdIGZpZWxkcywgaW50IG1hc2ssIE9iamVjdCBvKSB7fQogCiAgICAgICAgIHB1YmxpYyBTY3JpcHRDIGNyZWF0ZSgpIHsKICAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbENyZWF0ZSh0aGlzKTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Nob3J0Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNjgwMWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Nob3J0Mi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIFNob3J0MiB7CisgICAgcHVibGljIFNob3J0MigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgeDsKKyAgICBwdWJsaWMgc2hvcnQgeTsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDMuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5YzMwNQotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQzLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgU2hvcnQzIHsKKyAgICBwdWJsaWMgU2hvcnQzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCB4OworICAgIHB1YmxpYyBzaG9ydCB5OworICAgIHB1YmxpYyBzaG9ydCB6OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Nob3J0NC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQ3NGUyCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDQuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBTaG9ydDQgeworICAgIHB1YmxpYyBTaG9ydDQoKSB7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IHg7CisgICAgcHVibGljIHNob3J0IHk7CisgICAgcHVibGljIHNob3J0IHo7CisgICAgcHVibGljIHNob3J0IHc7Cit9CisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NpbXBsZU1lc2guamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2ltcGxlTWVzaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTIxN2E5Li4wMDAwMDAwCi0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2ltcGxlTWVzaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwotCi1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi0vKioKLSAqIEBoaWRlCi0gKgotICoqLwotcHVibGljIGNsYXNzIFNpbXBsZU1lc2ggZXh0ZW5kcyBCYXNlT2JqIHsKLSAgICBUeXBlW10gbVZlcnRleFR5cGVzOwotICAgIFR5cGUgbUluZGV4VHlwZTsKLSAgICAvL1R5cGUgbUJhdGNoZVR5cGU7Ci0gICAgUHJpbWl0aXZlIG1QcmltaXRpdmU7Ci0KLSAgICBTaW1wbGVNZXNoKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYmluZFZlcnRleEFsbG9jYXRpb24oQWxsb2NhdGlvbiBhLCBpbnQgc2xvdCkgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5TaW1wbGVNZXNoQmluZFZlcnRleChtSUQsIGEubUlELCBzbG90KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiaW5kSW5kZXhBbGxvY2F0aW9uKEFsbG9jYXRpb24gYSkgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5TaW1wbGVNZXNoQmluZEluZGV4KG1JRCwgYS5tSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyBBbGxvY2F0aW9uIGNyZWF0ZVZlcnRleEFsbG9jYXRpb24oaW50IHNsb3QpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIHJldHVybiBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgbVZlcnRleFR5cGVzW3Nsb3RdKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWxsb2NhdGlvbiBjcmVhdGVJbmRleEFsbG9jYXRpb24oKSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICByZXR1cm4gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIG1JbmRleFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlIGdldFZlcnRleFR5cGUoaW50IHNsb3QpIHsKLSAgICAgICAgcmV0dXJuIG1WZXJ0ZXhUeXBlc1tzbG90XTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZSBnZXRJbmRleFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtSW5kZXhUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7Ci0gICAgICAgIFJlbmRlclNjcmlwdCBtUlM7Ci0KLSAgICAgICAgY2xhc3MgRW50cnkgewotICAgICAgICAgICAgVHlwZSB0OwotICAgICAgICAgICAgRWxlbWVudCBlOwotICAgICAgICAgICAgaW50IHNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbVZlcnRleFR5cGVDb3VudDsKLSAgICAgICAgRW50cnlbXSBtVmVydGV4VHlwZXM7Ci0gICAgICAgIEVudHJ5IG1JbmRleFR5cGU7Ci0gICAgICAgIC8vRW50cnkgbUJhdGNoVHlwZTsKLSAgICAgICAgUHJpbWl0aXZlIG1QcmltaXRpdmU7Ci0KLQotICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgICAgIG1SUyA9IHJzOwotICAgICAgICAgICAgbVZlcnRleFR5cGVDb3VudCA9IDA7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXMgPSBuZXcgRW50cnlbMTZdOwotICAgICAgICAgICAgbUluZGV4VHlwZSA9IG5ldyBFbnRyeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBhZGRWZXJ0ZXhUeXBlKFR5cGUgdCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAobVZlcnRleFR5cGVDb3VudCA+PSBtVmVydGV4VHlwZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWF4IHZlcnRleCB0eXBlcyBleGNlZWRlZC4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggPSBtVmVydGV4VHlwZUNvdW50OwotICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdID0gbmV3IEVudHJ5KCk7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0udCA9IHQ7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50Kys7Ci0gICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgYWRkVmVydGV4VHlwZShFbGVtZW50IGUsIGludCBzaXplKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChtVmVydGV4VHlwZUNvdW50ID49IG1WZXJ0ZXhUeXBlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNYXggdmVydGV4IHR5cGVzIGV4Y2VlZGVkLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgYWRkZWRJbmRleCA9IG1WZXJ0ZXhUeXBlQ291bnQ7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0gPSBuZXcgRW50cnkoKTsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS5lID0gZTsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS5zaXplID0gc2l6ZTsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQrKzsKLSAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SW5kZXhUeXBlKFR5cGUgdCkgewotICAgICAgICAgICAgbUluZGV4VHlwZS50ID0gdDsKLSAgICAgICAgICAgIG1JbmRleFR5cGUuZSA9IG51bGw7Ci0gICAgICAgICAgICBtSW5kZXhUeXBlLnNpemUgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SW5kZXhUeXBlKEVsZW1lbnQgZSwgaW50IHNpemUpIHsKLSAgICAgICAgICAgIG1JbmRleFR5cGUudCA9IG51bGw7Ci0gICAgICAgICAgICBtSW5kZXhUeXBlLmUgPSBlOwotICAgICAgICAgICAgbUluZGV4VHlwZS5zaXplID0gc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFByaW1pdGl2ZShQcmltaXRpdmUgcCkgewotICAgICAgICAgICAgbVByaW1pdGl2ZSA9IHA7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIFR5cGUgbmV3VHlwZShFbGVtZW50IGUsIGludCBzaXplKSB7Ci0gICAgICAgICAgICBUeXBlLkJ1aWxkZXIgdGIgPSBuZXcgVHlwZS5CdWlsZGVyKG1SUywgZSk7Ci0gICAgICAgICAgICB0Yi5hZGQoRGltZW5zaW9uLlgsIHNpemUpOwotICAgICAgICAgICAgcmV0dXJuIHRiLmNyZWF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBTaW1wbGVNZXNoIGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgQnVpbGRlciBiKSB7Ci0gICAgICAgICAgICBUeXBlW10gdG9EZXN0cm95ID0gbmV3IFR5cGVbMThdOwotICAgICAgICAgICAgaW50IHRvRGVzdHJveUNvdW50ID0gMDsKLQotICAgICAgICAgICAgaW50IGluZGV4SUQgPSAwOwotICAgICAgICAgICAgaWYgKGIubUluZGV4VHlwZS50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbmRleElEID0gYi5tSW5kZXhUeXBlLnQubUlEOwotICAgICAgICAgICAgfSBlbHNlIGlmIChiLm1JbmRleFR5cGUuc2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYi5tSW5kZXhUeXBlLnQgPSBiLm5ld1R5cGUoYi5tSW5kZXhUeXBlLmUsIGIubUluZGV4VHlwZS5zaXplKTsKLSAgICAgICAgICAgICAgICBpbmRleElEID0gYi5tSW5kZXhUeXBlLnQubUlEOwotICAgICAgICAgICAgICAgIHRvRGVzdHJveVt0b0Rlc3Ryb3lDb3VudCsrXSA9IGIubUluZGV4VHlwZS50OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnRbXSBJRHMgPSBuZXcgaW50W2IubVZlcnRleFR5cGVDb3VudF07Ci0gICAgICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgYi5tVmVydGV4VHlwZUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGIubVZlcnRleFR5cGVzW2N0XS50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSURzW2N0XSA9IGIubVZlcnRleFR5cGVzW2N0XS50Lm1JRDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiLm1WZXJ0ZXhUeXBlc1tjdF0udCA9IGIubmV3VHlwZShiLm1WZXJ0ZXhUeXBlc1tjdF0uZSwgYi5tVmVydGV4VHlwZXNbY3RdLnNpemUpOwotICAgICAgICAgICAgICAgICAgICBJRHNbY3RdID0gYi5tVmVydGV4VHlwZXNbY3RdLnQubUlEOwotICAgICAgICAgICAgICAgICAgICB0b0Rlc3Ryb3lbdG9EZXN0cm95Q291bnQrK10gPSBiLm1WZXJ0ZXhUeXBlc1tjdF0udDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBpZCA9IHJzLm5TaW1wbGVNZXNoQ3JlYXRlKDAsIGluZGV4SUQsIElEcywgYi5tUHJpbWl0aXZlLm1JRCk7Ci0gICAgICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgdG9EZXN0cm95Q291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgICAgICB0b0Rlc3Ryb3lbY3RdLmRlc3Ryb3koKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVNZXNoKGlkLCBycyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2ltcGxlTWVzaCBjcmVhdGUoKSB7Ci0gICAgICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgICAgIFNpbXBsZU1lc2ggc20gPSBpbnRlcm5hbENyZWF0ZShtUlMsIHRoaXMpOwotICAgICAgICAgICAgc20ubVZlcnRleFR5cGVzID0gbmV3IFR5cGVbbVZlcnRleFR5cGVDb3VudF07Ci0gICAgICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgbVZlcnRleFR5cGVDb3VudDsgY3QrKykgewotICAgICAgICAgICAgICAgIHNtLm1WZXJ0ZXhUeXBlc1tjdF0gPSBtVmVydGV4VHlwZXNbY3RdLnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbS5tSW5kZXhUeXBlID0gbUluZGV4VHlwZS50OwotICAgICAgICAgICAgc20ubVByaW1pdGl2ZSA9IG1QcmltaXRpdmU7Ci0gICAgICAgICAgICByZXR1cm4gc207Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRyaWFuZ2xlTWVzaEJ1aWxkZXIgewotICAgICAgICBmbG9hdCBtVnR4RGF0YVtdOwotICAgICAgICBpbnQgbVZ0eENvdW50OwotICAgICAgICBzaG9ydCBtSW5kZXhEYXRhW107Ci0gICAgICAgIGludCBtSW5kZXhDb3VudDsKLSAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKLSAgICAgICAgRWxlbWVudCBtRWxlbWVudDsKLQotICAgICAgICBmbG9hdCBtTlggPSAwOwotICAgICAgICBmbG9hdCBtTlkgPSAwOwotICAgICAgICBmbG9hdCBtTlogPSAtMTsKLSAgICAgICAgZmxvYXQgbVMwID0gMDsKLSAgICAgICAgZmxvYXQgbVQwID0gMDsKLSAgICAgICAgZmxvYXQgbVIgPSAxOwotICAgICAgICBmbG9hdCBtRyA9IDE7Ci0gICAgICAgIGZsb2F0IG1CID0gMTsKLSAgICAgICAgZmxvYXQgbUEgPSAxOwotCi0gICAgICAgIGludCBtVnR4U2l6ZTsKLSAgICAgICAgaW50IG1GbGFnczsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xPUiA9IDB4MDAwMTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9STUFMID0gMHgwMDAyOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUVVJFXzAgPSAweDAxMDA7Ci0KLSAgICAgICAgcHVibGljIFRyaWFuZ2xlTWVzaEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzLCBpbnQgdnR4U2l6ZSwgaW50IGZsYWdzKSB7Ci0gICAgICAgICAgICBtUlMgPSByczsKLSAgICAgICAgICAgIG1WdHhDb3VudCA9IDA7Ci0gICAgICAgICAgICBtSW5kZXhDb3VudCA9IDA7Ci0gICAgICAgICAgICBtVnR4RGF0YSA9IG5ldyBmbG9hdFsxMjhdOwotICAgICAgICAgICAgbUluZGV4RGF0YSA9IG5ldyBzaG9ydFsxMjhdOwotICAgICAgICAgICAgbVZ0eFNpemUgPSB2dHhTaXplOwotICAgICAgICAgICAgbUZsYWdzID0gZmxhZ3M7Ci0KLSAgICAgICAgICAgIGlmICh2dHhTaXplIDwgMiB8fCB2dHhTaXplID4gMykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlZlcnRleCBzaXplIG91dCBvZiByYW5nZS4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBtYWtlU3BhY2UoaW50IGNvdW50KSB7Ci0gICAgICAgICAgICBpZiAoKG1WdHhDb3VudCArIGNvdW50KSA+PSBtVnR4RGF0YS5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB0W10gPSBuZXcgZmxvYXRbbVZ0eERhdGEubGVuZ3RoICogMl07Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtVnR4RGF0YSwgMCwgdCwgMCwgbVZ0eERhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YSA9IHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbGF0Y2goKSB7Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIENPTE9SKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbWFrZVNwYWNlKDQpOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1SOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1HOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1COwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1BOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBURVhUVVJFXzApICE9IDApIHsKLSAgICAgICAgICAgICAgICBtYWtlU3BhY2UoMik7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbVMwOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1UMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgTk9STUFMKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbWFrZVNwYWNlKDMpOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1OWDsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtTlk7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbU5aOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkVmVydGV4KGZsb2F0IHgsIGZsb2F0IHkpIHsKLSAgICAgICAgICAgIGlmIChtVnR4U2l6ZSAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYWtlU3BhY2UoMik7Ci0gICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB4OwotICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geTsKLSAgICAgICAgICAgIGxhdGNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRWZXJ0ZXgoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgewotICAgICAgICAgICAgaWYgKG1WdHhTaXplICE9IDMpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1ha2VTcGFjZSgzKTsKLSAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHg7Ci0gICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB5OwotICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gejsKLSAgICAgICAgICAgIGxhdGNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0dXJlKGZsb2F0IHMsIGZsb2F0IHQpIHsKLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgVEVYVFVSRV8wKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUzAgPSBzOwotICAgICAgICAgICAgbVQwID0gdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5vcm1hbChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIE5PUk1BTCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU5YID0geDsKLSAgICAgICAgICAgIG1OWSA9IHk7Ci0gICAgICAgICAgICBtTlogPSB6OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkgewotICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBDT0xPUikgPT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVIgPSByOwotICAgICAgICAgICAgbUcgPSBnOwotICAgICAgICAgICAgbUIgPSBiOwotICAgICAgICAgICAgbUEgPSBhOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkVHJpYW5nbGUoaW50IGlkeDEsIGludCBpZHgyLCBpbnQgaWR4MykgewotICAgICAgICAgICAgaWYoKGlkeDEgPj0gbVZ0eENvdW50KSB8fCAoaWR4MSA8IDApIHx8Ci0gICAgICAgICAgICAgICAoaWR4MiA+PSBtVnR4Q291bnQpIHx8IChpZHgyIDwgMCkgfHwKLSAgICAgICAgICAgICAgIChpZHgzID49IG1WdHhDb3VudCkgfHwgKGlkeDMgPCAwKSkgewotICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW5kZXggcHJvdmlkZWQgZ3JlYXRlciB0aGFuIHZlcnRleCBjb3VudC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobUluZGV4Q291bnQgKyAzKSA+PSBtSW5kZXhEYXRhLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHNob3J0IHRbXSA9IG5ldyBzaG9ydFttSW5kZXhEYXRhLmxlbmd0aCAqIDJdOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobUluZGV4RGF0YSwgMCwgdCwgMCwgbUluZGV4RGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIG1JbmRleERhdGEgPSB0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUluZGV4RGF0YVttSW5kZXhDb3VudCsrXSA9IChzaG9ydClpZHgxOwotICAgICAgICAgICAgbUluZGV4RGF0YVttSW5kZXhDb3VudCsrXSA9IChzaG9ydClpZHgyOwotICAgICAgICAgICAgbUluZGV4RGF0YVttSW5kZXhDb3VudCsrXSA9IChzaG9ydClpZHgzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNpbXBsZU1lc2ggY3JlYXRlKCkgewotICAgICAgICAgICAgRWxlbWVudC5CdWlsZGVyIGIgPSBuZXcgRWxlbWVudC5CdWlsZGVyKG1SUyk7Ci0gICAgICAgICAgICBpbnQgZmxvYXRDb3VudCA9IG1WdHhTaXplOwotICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5jcmVhdGVBdHRyaWIobVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YUtpbmQuUE9TSVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVnR4U2l6ZSksICJwb3NpdGlvbiIpOwotICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBDT0xPUikgIT0gMCkgewotICAgICAgICAgICAgICAgIGZsb2F0Q291bnQgKz0gNDsKLSAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LmNyZWF0ZUF0dHJpYihtUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFLaW5kLkNPTE9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQpLCAiY29sb3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgVEVYVFVSRV8wKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXRDb3VudCArPSAyOwotICAgICAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuY3JlYXRlQXR0cmliKG1SUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YUtpbmQuVEVYVFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSwgInRleHR1cmUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgTk9STUFMKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXRDb3VudCArPSAzOwotICAgICAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuY3JlYXRlQXR0cmliKG1SUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YUtpbmQuTk9STUFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMpLCAibm9ybWFsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRWxlbWVudCA9IGIuY3JlYXRlKCk7Ci0KLSAgICAgICAgICAgIEJ1aWxkZXIgc21iID0gbmV3IEJ1aWxkZXIobVJTKTsKLSAgICAgICAgICAgIHNtYi5hZGRWZXJ0ZXhUeXBlKG1FbGVtZW50LCBtVnR4Q291bnQgLyBmbG9hdENvdW50KTsKLSAgICAgICAgICAgIHNtYi5zZXRJbmRleFR5cGUoRWxlbWVudC5jcmVhdGVJbmRleChtUlMpLCBtSW5kZXhDb3VudCk7Ci0gICAgICAgICAgICBzbWIuc2V0UHJpbWl0aXZlKFByaW1pdGl2ZS5UUklBTkdMRSk7Ci0gICAgICAgICAgICBTaW1wbGVNZXNoIHNtID0gc21iLmNyZWF0ZSgpOwotCi0gICAgICAgICAgICBBbGxvY2F0aW9uIHZlcnRleEFsbG9jID0gc20uY3JlYXRlVmVydGV4QWxsb2NhdGlvbigwKTsKLSAgICAgICAgICAgIEFsbG9jYXRpb24gaW5kZXhBbGxvYyA9IHNtLmNyZWF0ZUluZGV4QWxsb2NhdGlvbigpOwotICAgICAgICAgICAgc20uYmluZFZlcnRleEFsbG9jYXRpb24odmVydGV4QWxsb2MsIDApOwotICAgICAgICAgICAgc20uYmluZEluZGV4QWxsb2NhdGlvbihpbmRleEFsbG9jKTsKLQotICAgICAgICAgICAgdmVydGV4QWxsb2MuZGF0YShtVnR4RGF0YSk7Ci0gICAgICAgICAgICB2ZXJ0ZXhBbGxvYy51cGxvYWRUb0J1ZmZlck9iamVjdCgpOwotCi0gICAgICAgICAgICBpbmRleEFsbG9jLmRhdGEobUluZGV4RGF0YSk7Ci0gICAgICAgICAgICBpbmRleEFsbG9jLnVwbG9hZFRvQnVmZmVyT2JqZWN0KCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBzbTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGUuamF2YQppbmRleCA2MmQzODY3Li4wYjNkYjY5IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGUuamF2YQpAQCAtMTYsNyArMTYsOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwogCisKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiAvKioKICAqIEBoaWRlCkBAIC0zMSw3ICszMyw2IEBACiAgICAgaW50IG1FbGVtZW50Q291bnQ7CiAgICAgRWxlbWVudCBtRWxlbWVudDsKIAotICAgIHByaXZhdGUgaW50IG1OYXRpdmVDYWNoZTsKICAgICBDbGFzcyBtSmF2YUNsYXNzOwogCiAgICAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKQEAgLTk1LDYxICs5NiwzNyBAQAogCiAKICAgICBUeXBlKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7Ci0gICAgICAgIG1OYXRpdmVDYWNoZSA9IDA7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgaWYobU5hdGl2ZUNhY2hlICE9IDApIHsKLSAgICAgICAgICAgIG1SUy5uVHlwZUZpbmFsRGVzdHJveSh0aGlzKTsKLSAgICAgICAgICAgIG1OYXRpdmVDYWNoZSA9IDA7Ci0gICAgICAgIH0KICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIFR5cGUgY3JlYXRlRnJvbUNsYXNzKFJlbmRlclNjcmlwdCBycywgQ2xhc3MgYywgaW50IHNpemUpIHsKLSAgICAgICAgRWxlbWVudCBlID0gRWxlbWVudC5jcmVhdGVGcm9tQ2xhc3MocnMsIGMpOwotICAgICAgICBCdWlsZGVyIGIgPSBuZXcgQnVpbGRlcihycywgZSk7Ci0gICAgICAgIGIuYWRkKERpbWVuc2lvbi5YLCBzaXplKTsKLSAgICAgICAgVHlwZSB0ID0gYi5jcmVhdGUoKTsKLSAgICAgICAgZS5kZXN0cm95KCk7CisgICAgQE92ZXJyaWRlCisgICAgdm9pZCB1cGRhdGVGcm9tTmF0aXZlKCkgeworICAgICAgICAvLyBXZSBoYXZlIDYgaW50ZWdlciB0byBvYnRhaW4gbURpbVg7IG1EaW1ZOyBtRGltWjsKKyAgICAgICAgLy8gbURpbUxPRDsgbURpbUZhY2VzOyBtRWxlbWVudDsKKyAgICAgICAgaW50W10gZGF0YUJ1ZmZlciA9IG5ldyBpbnRbNl07CisgICAgICAgIG1SUy5uVHlwZUdldE5hdGl2ZURhdGEobUlELCBkYXRhQnVmZmVyKTsKIAotICAgICAgICAvLyBuYXRpdmUgZmllbGRzCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkW10gZmllbGRzID0gYy5nZXRGaWVsZHMoKTsKLSAgICAgICAgICAgIGludFtdIGFyVHlwZXMgPSBuZXcgaW50W2ZpZWxkcy5sZW5ndGhdOwotICAgICAgICAgICAgaW50W10gYXJCaXRzID0gbmV3IGludFtmaWVsZHMubGVuZ3RoXTsKKyAgICAgICAgbURpbVggPSBkYXRhQnVmZmVyWzBdOworICAgICAgICBtRGltWSA9IGRhdGFCdWZmZXJbMV07CisgICAgICAgIG1EaW1aID0gZGF0YUJ1ZmZlclsyXTsKKyAgICAgICAgbURpbUxPRCA9IGRhdGFCdWZmZXJbM10gPT0gMSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgbURpbUZhY2VzID0gZGF0YUJ1ZmZlcls0XSA9PSAxID8gdHJ1ZSA6IGZhbHNlOwogCi0gICAgICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgZmllbGRzLmxlbmd0aDsgY3QrKykgewotICAgICAgICAgICAgICAgIEZpZWxkIGYgPSBmaWVsZHNbY3RdOwotICAgICAgICAgICAgICAgIENsYXNzIGZjID0gZi5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYoZmMgPT0gaW50LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyVHlwZXNbY3RdID0gRWxlbWVudC5EYXRhVHlwZS5TSUdORURfMzIubUlEOwotICAgICAgICAgICAgICAgICAgICBhckJpdHNbY3RdID0gMzI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKGZjID09IHNob3J0LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyVHlwZXNbY3RdID0gRWxlbWVudC5EYXRhVHlwZS5TSUdORURfMTYubUlEOwotICAgICAgICAgICAgICAgICAgICBhckJpdHNbY3RdID0gMTY7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKGZjID09IGJ5dGUuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJUeXBlc1tjdF0gPSBFbGVtZW50LkRhdGFUeXBlLlNJR05FRF84Lm1JRDsKLSAgICAgICAgICAgICAgICAgICAgYXJCaXRzW2N0XSA9IDg7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKGZjID09IGZsb2F0LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyVHlwZXNbY3RdID0gRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMi5tSUQ7Ci0gICAgICAgICAgICAgICAgICAgIGFyQml0c1tjdF0gPSAzMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtvd24gZmllbGQgdHlwZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJzLm5UeXBlU2V0dXBGaWVsZHModCwgYXJUeXBlcywgYXJCaXRzLCBmaWVsZHMpOworICAgICAgICBpbnQgZWxlbWVudElEID0gZGF0YUJ1ZmZlcls1XTsKKyAgICAgICAgaWYoZWxlbWVudElEICE9IDApIHsKKyAgICAgICAgICAgIG1FbGVtZW50ID0gbmV3IEVsZW1lbnQoZWxlbWVudElELCBtUlMpOworICAgICAgICAgICAgbUVsZW1lbnQudXBkYXRlRnJvbU5hdGl2ZSgpOwogICAgICAgICB9Ci0gICAgICAgIHQubUphdmFDbGFzcyA9IGM7Ci0gICAgICAgIHJldHVybiB0OworICAgICAgICBjYWxjRWxlbWVudENvdW50KCk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBUeXBlIGNyZWF0ZUZyb21DbGFzcyhSZW5kZXJTY3JpcHQgcnMsIENsYXNzIGMsIGludCBzaXplLCBTdHJpbmcgc2NyaXB0TmFtZSkgewotICAgICAgICBUeXBlIHQgPSBjcmVhdGVGcm9tQ2xhc3MocnMsIGMsIHNpemUpOwotICAgICAgICB0LnNldE5hbWUoc2NyaXB0TmFtZSk7Ci0gICAgICAgIHJldHVybiB0OworICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLmUoIlJlbmRlclNjcmlwdCIsICJDYWxsaW5nIGRlcHJpY2F0ZWQgY3JlYXRlRnJvbUNsYXNzIik7CisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjJmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2N2Q1N2ZhLi4wMDAwMDAwCi0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwotCi1pbXBvcnQgamF2YS5sYW5nLk1hdGg7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotCi0vKioKLSAqIEBoaWRlCi0gKgotICoqLwotcHVibGljIGNsYXNzIFZlY3RvcjJmIHsKLSAgICBwdWJsaWMgVmVjdG9yMmYoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yM2YuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yM2YuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI4NDJmMy4uMDAwMDAwMAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjNmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKLQotaW1wb3J0IGphdmEubGFuZy5NYXRoOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLQotLyoqCi0gKiBAaGlkZQotICoKLSAqKi8KLXB1YmxpYyBjbGFzcyBWZWN0b3IzZiB7Ci0gICAgcHVibGljIFZlY3RvcjNmKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCB4OwotICAgIHB1YmxpYyBmbG9hdCB5OwotICAgIHB1YmxpYyBmbG9hdCB6OwotfQotCi0KLQotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjRmLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjRmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYmQ5NTkuLjAwMDAwMDAKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3I0Zi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcuTWF0aDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi0KLS8qKgotICogQGhpZGUKLSAqCi0gKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yNGYgewotICAgIHB1YmxpYyBWZWN0b3I0ZigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgeDsKLSAgICBwdWJsaWMgZmxvYXQgeTsKLSAgICBwdWJsaWMgZmxvYXQgejsKLSAgICBwdWJsaWMgZmxvYXQgdzsKLX0KLQotCi0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2puaS9BbmRyb2lkLm1rIGIvZ3JhcGhpY3Mvam5pL0FuZHJvaWQubWsKaW5kZXggODQ3NmJlMS4uNGM0YTEyOCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvam5pL0FuZHJvaWQubWsKKysrIGIvZ3JhcGhpY3Mvam5pL0FuZHJvaWQubWsKQEAgLTEzLDE0ICsxMywxMyBAQAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGliYW5kcm9pZF9ydW50aW1lIFwKLSAgICAgICAgbGliYWNjIFwKICAgICAgICAgbGlibmF0aXZlaGVscGVyIFwKICAgICAgICAgbGliUlMgXAogICAgICAgICBsaWJjdXRpbHMgXAogICAgICAgICBsaWJza2lhIFwKICAgICAgICAgbGlidXRpbHMgXAogICAgICAgICBsaWJ1aSBcCi0gICAgICAgIGxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudCAKKyAgICAgICAgbGlic3VyZmFjZWZsaW5nZXJfY2xpZW50CiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfcmVuZGVyc2NyaXB0X1JlbmRlclNjcmlwdC5jcHAgYi9ncmFwaGljcy9qbmkvYW5kcm9pZF9yZW5kZXJzY3JpcHRfUmVuZGVyU2NyaXB0LmNwcAppbmRleCA0NWNjNzJlLi44ZjFlOTNjIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qbmkvYW5kcm9pZF9yZW5kZXJzY3JpcHRfUmVuZGVyU2NyaXB0LmNwcAorKysgYi9ncmFwaGljcy9qbmkvYW5kcm9pZF9yZW5kZXJzY3JpcHRfUmVuZGVyU2NyaXB0LmNwcApAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgImpuaS5oIgogI2luY2x1ZGUgIkpOSUhlbHAuaCIKICNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvYW5kcm9pZF92aWV3X1N1cmZhY2UuaCIKIAogI2luY2x1ZGUgPFJlbmRlclNjcmlwdC5oPgogI2luY2x1ZGUgPFJlbmRlclNjcmlwdEVudi5oPgpAQCAtNjksOSArNzAsNiBAQAogCiAgICAgamNsYXNzIGJpdG1hcENsYXNzID0gX2Vudi0+RmluZENsYXNzKCJhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcCIpOwogICAgIGdOYXRpdmVCaXRtYXBJRCA9IF9lbnYtPkdldEZpZWxkSUQoYml0bWFwQ2xhc3MsICJtTmF0aXZlQml0bWFwIiwgIkkiKTsKLQotICAgIGpjbGFzcyB0eXBlQ2xhc3MgPSBfZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGUiKTsKLSAgICBnVHlwZU5hdGl2ZUNhY2hlID0gX2Vudi0+R2V0RmllbGRJRCh0eXBlQ2xhc3MsICJtTmF0aXZlQ2FjaGUiLCAiSSIpOwogfQogCiBzdGF0aWMgdm9pZCBuSW5pdEVsZW1lbnRzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhOCwgamludCByZ2JhNDQ0NCwgamludCByZ2JhODg4OCwgamludCByZ2I1NjUpCkBAIC04NSw0MSArODMsNDMgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotbkFzc2lnbk5hbWUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG9iaiwgamJ5dGVBcnJheSBzdHIpCituQ29udGV4dEZpbmlzaChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibkFzc2lnbk5hbWUsIGNvbiglcCksIG9iaiglcCkiLCBjb24sICh2b2lkICopb2JqKTsKKyAgICBMT0dfQVBJKCJuQ29udGV4dEZpbmlzaCwgY29uKCVwKSIsIGNvbik7CisgICAgcnNDb250ZXh0RmluaXNoKGNvbik7Cit9CiAKK3N0YXRpYyB2b2lkCituQXNzaWduTmFtZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgb2JqLCBqYnl0ZUFycmF5IHN0cikKK3sKKyAgICBMT0dfQVBJKCJuQXNzaWduTmFtZSwgY29uKCVwKSwgb2JqKCVwKSIsIGNvbiwgKHZvaWQgKilvYmopOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoc3RyKTsKICAgICBqYnl0ZSAqIGNwdHIgPSAoamJ5dGUgKikgX2Vudi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChzdHIsIDApOwogICAgIHJzQXNzaWduTmFtZShjb24sICh2b2lkICopb2JqLCAoY29uc3QgY2hhciAqKWNwdHIsIGxlbik7CiAgICAgX2Vudi0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoc3RyLCBjcHRyLCBKTklfQUJPUlQpOwogfQogCi1zdGF0aWMgdm9pZAotbk9iakRlc3Ryb3koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG9iaikKK3N0YXRpYyBqc3RyaW5nCituR2V0TmFtZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgb2JqKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOworICAgIExPR19BUEkoIm5HZXROYW1lLCBjb24oJXApLCBvYmooJXApIiwgY29uLCAodm9pZCAqKW9iaik7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisgICAgcnNHZXROYW1lKGNvbiwgKHZvaWQgKilvYmosICZuYW1lKTsKKyAgICByZXR1cm4gX2Vudi0+TmV3U3RyaW5nVVRGKG5hbWUpOworfQorCitzdGF0aWMgdm9pZAorbk9iakRlc3Ryb3koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG9iaikKK3sKICAgICBMT0dfQVBJKCJuT2JqRGVzdHJveSwgY29uKCVwKSBvYmooJXApIiwgY29uLCAodm9pZCAqKW9iaik7CiAgICAgcnNPYmpEZXN0cm95KGNvbiwgKHZvaWQgKilvYmopOwogfQogCi1zdGF0aWMgdm9pZAotbk9iakRlc3Ryb3lPT0IoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG9iaikKLXsKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIG9ubHkgZGlmZmVycyBmcm9tIG5PYmpEZXN0cm95IGluIHRoYXQgaXQgY2FsbHMgdGhlCi0gICAgLy8gc3BlY2lhbCBPdXQgT2YgQmFuZCB2ZXJzaW9uIG9mIE9iakRlc3Ryb3kgd2hpY2ggaXMgdGhyZWFkIHNhZmUuCi0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibk9iakRlc3Ryb3lPT0IsIGNvbiglcCkgb2JqKCVwKSIsIGNvbiwgKHZvaWQgKilvYmopOwotICAgIHJzT2JqRGVzdHJveU9PQihjb24sICh2b2lkICopb2JqKTsKLX0KIAogc3RhdGljIGppbnQKLW5GaWxlT3BlbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpieXRlQXJyYXkgc3RyKQorbkZpbGVPcGVuKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamJ5dGVBcnJheSBzdHIpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkZpbGVPcGVuLCBjb24oJXApIiwgY29uKTsKLQogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoc3RyKTsKICAgICBqYnl0ZSAqIGNwdHIgPSAoamJ5dGUgKikgX2Vudi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChzdHIsIDApOwogICAgIGppbnQgcmV0ID0gKGppbnQpcnNGaWxlT3Blbihjb24sIChjb25zdCBjaGFyICopY3B0ciwgbGVuKTsKQEAgLTE2NSw5ICsxNjUsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkNvbnRleHRTZXRQcmlvcml0eShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgcCkKK25Db250ZXh0U2V0UHJpb3JpdHkoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHApCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiQ29udGV4dFNldFByaW9yaXR5LCBjb24oJXApLCBwcmlvcml0eSglaSkiLCBjb24sIHApOwogICAgIHJzQ29udGV4dFNldFByaW9yaXR5KGNvbiwgcCk7CiB9CkBAIC0xNzUsMTAxICsxNzQsOTIgQEAKIAogCiBzdGF0aWMgdm9pZAotbkNvbnRleHRTZXRTdXJmYWNlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB3aWR0aCwgamludCBoZWlnaHQsIGpvYmplY3Qgd25kKQorbkNvbnRleHRTZXRTdXJmYWNlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB3aWR0aCwgamludCBoZWlnaHQsIGpvYmplY3Qgd25kKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Db250ZXh0U2V0U3VyZmFjZSwgY29uKCVwKSwgd2lkdGgoJWkpLCBoZWlnaHQoJWkpLCBzdXJmYWNlKCVwKSIsIGNvbiwgd2lkdGgsIGhlaWdodCwgKFN1cmZhY2UgKil3bmQpOwogCiAgICAgU3VyZmFjZSAqIHdpbmRvdyA9IE5VTEw7CiAgICAgaWYgKHduZCA9PSBOVUxMKSB7CiAKICAgICB9IGVsc2UgewotICAgICAgICBqY2xhc3Mgc3VyZmFjZV9jbGFzcyA9IF9lbnYtPkZpbmRDbGFzcygiYW5kcm9pZC92aWV3L1N1cmZhY2UiKTsKLSAgICAgICAgamZpZWxkSUQgc3VyZmFjZUZpZWxkSUQgPSBfZW52LT5HZXRGaWVsZElEKHN1cmZhY2VfY2xhc3MsIEFORFJPSURfVklFV19TVVJGQUNFX0pOSV9JRCwgIkkiKTsKLSAgICAgICAgd2luZG93ID0gKFN1cmZhY2UqKV9lbnYtPkdldEludEZpZWxkKHduZCwgc3VyZmFjZUZpZWxkSUQpOworICAgICAgICB3aW5kb3cgPSAoU3VyZmFjZSopIGFuZHJvaWRfU3VyZmFjZV9nZXROYXRpdmVXaW5kb3coX2Vudiwgd25kKS5nZXQoKTsKICAgICB9CiAKICAgICByc0NvbnRleHRTZXRTdXJmYWNlKGNvbiwgd2lkdGgsIGhlaWdodCwgd2luZG93KTsKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0RGVzdHJveShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgY29uKQorbkNvbnRleHREZXN0cm95KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBMT0dfQVBJKCJuQ29udGV4dERlc3Ryb3ksIGNvbiglcCkiLCAoUnNDb250ZXh0KWNvbik7Ci0gICAgcnNDb250ZXh0RGVzdHJveSgoUnNDb250ZXh0KWNvbik7CisgICAgTE9HX0FQSSgibkNvbnRleHREZXN0cm95LCBjb24oJXApIiwgY29uKTsKKyAgICByc0NvbnRleHREZXN0cm95KGNvbik7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQ29udGV4dER1bXAoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGJpdHMpCituQ29udGV4dER1bXAoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGJpdHMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHREdW1wLCBjb24oJXApICBiaXRzKCVpKSIsIChSc0NvbnRleHQpY29uLCBiaXRzKTsKICAgICByc0NvbnRleHREdW1wKChSc0NvbnRleHQpY29uLCBiaXRzKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0UGF1c2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorbkNvbnRleHRQYXVzZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRQYXVzZSwgY29uKCVwKSIsIGNvbik7CiAgICAgcnNDb250ZXh0UGF1c2UoY29uKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0UmVzdW1lKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK25Db250ZXh0UmVzdW1lKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dFJlc3VtZSwgY29uKCVwKSIsIGNvbik7CiAgICAgcnNDb250ZXh0UmVzdW1lKGNvbik7CiB9CiAKIHN0YXRpYyBqaW50Ci1uQ29udGV4dEdldE1lc3NhZ2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50QXJyYXkgZGF0YSwgamJvb2xlYW4gd2FpdCkKK25Db250ZXh0R2V0TWVzc2FnZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnRBcnJheSBkYXRhLCBqYm9vbGVhbiB3YWl0KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRHZXRNZXNzYWdlLCBjb24oJXApLCBsZW4oJWkpIiwgY29uLCBsZW4pOwogICAgIGppbnQgKnB0ciA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CiAgICAgc2l6ZV90IHJlY2VpdmVMZW47CiAgICAgaW50IGlkID0gcnNDb250ZXh0R2V0TWVzc2FnZShjb24sIHB0ciwgJnJlY2VpdmVMZW4sIGxlbiAqIDQsIHdhaXQpOwogICAgIGlmICghaWQgJiYgcmVjZWl2ZUxlbikgewotICAgICAgICBMT0dFKCJtZXNzYWdlIHJlY2VpdmUgYnVmZmVyIHRvbyBzbWFsbC4gICVpIiwgcmVjZWl2ZUxlbik7CisgICAgICAgIExPR1YoIm1lc3NhZ2UgcmVjZWl2ZSBidWZmZXIgdG9vIHNtYWxsLiAgJWkiLCByZWNlaXZlTGVuKTsKKyAgICAgICAgKnB0ciA9IChqaW50KXJlY2VpdmVMZW47CiAgICAgfQogICAgIF9lbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGRhdGEsIHB0ciwgMCk7CiAgICAgcmV0dXJuIGlkOwogfQogCi1zdGF0aWMgdm9pZCBuQ29udGV4dEluaXRUb0NsaWVudChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCitzdGF0aWMgdm9pZCBuQ29udGV4dEluaXRUb0NsaWVudChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRJbml0VG9DbGllbnQsIGNvbiglcCkiLCBjb24pOwogICAgIHJzQ29udGV4dEluaXRUb0NsaWVudChjb24pOwogfQogCi1zdGF0aWMgdm9pZCBuQ29udGV4dERlaW5pdFRvQ2xpZW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK3N0YXRpYyB2b2lkIG5Db250ZXh0RGVpbml0VG9DbGllbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Db250ZXh0RGVpbml0VG9DbGllbnQsIGNvbiglcCkiLCBjb24pOwogICAgIHJzQ29udGV4dERlaW5pdFRvQ2xpZW50KGNvbik7CiB9CiAKIAogc3RhdGljIGppbnQKLW5FbGVtZW50Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB0eXBlLCBqaW50IGtpbmQsIGpib29sZWFuIG5vcm0sIGppbnQgc2l6ZSkKK25FbGVtZW50Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB0eXBlLCBqaW50IGtpbmQsIGpib29sZWFuIG5vcm0sIGppbnQgc2l6ZSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuRWxlbWVudENyZWF0ZSwgY29uKCVwKSwgdHlwZSglaSksIGtpbmQoJWkpLCBub3JtKCVpKSwgc2l6ZSglaSkiLCBjb24sIHR5cGUsIGtpbmQsIG5vcm0sIHNpemUpOwogICAgIHJldHVybiAoamludClyc0VsZW1lbnRDcmVhdGUoY29uLCAoUnNEYXRhVHlwZSl0eXBlLCAoUnNEYXRhS2luZClraW5kLCBub3JtLCBzaXplKTsKIH0KIAogc3RhdGljIGppbnQKLW5FbGVtZW50Q3JlYXRlMihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnRBcnJheSBfaWRzLCBqb2JqZWN0QXJyYXkgX25hbWVzKQorbkVsZW1lbnRDcmVhdGUyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludEFycmF5IF9pZHMsIGpvYmplY3RBcnJheSBfbmFtZXMsIGppbnRBcnJheSBfYXJyYXlTaXplcykKIHsKICAgICBpbnQgZmllbGRDb3VudCA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKF9pZHMpOwotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5FbGVtZW50Q3JlYXRlMiwgY29uKCVwKSIsIGNvbik7CiAKICAgICBqaW50ICppZHMgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKF9pZHMsIE5VTEwpOworICAgIGppbnQgKmFycmF5U2l6ZXMgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKF9hcnJheVNpemVzLCBOVUxMKTsKICAgICBjb25zdCBjaGFyICoqIG5hbWVBcnJheSA9IChjb25zdCBjaGFyICoqKWNhbGxvYyhmaWVsZENvdW50LCBzaXplb2YoY2hhciAqKSk7CiAgICAgc2l6ZV90KiBzaXplQXJyYXkgPSAoc2l6ZV90KiljYWxsb2MoZmllbGRDb3VudCwgc2l6ZW9mKHNpemVfdCkpOwogCkBAIC0yNzgsMTgzICsyNjgsMTE2IEBACiAgICAgICAgIG5hbWVBcnJheVtjdF0gPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzLCBOVUxMKTsKICAgICAgICAgc2l6ZUFycmF5W2N0XSA9IF9lbnYtPkdldFN0cmluZ1VURkxlbmd0aChzKTsKICAgICB9Ci0gICAgamludCBpZCA9IChqaW50KXJzRWxlbWVudENyZWF0ZTIoY29uLCBmaWVsZENvdW50LCAoUnNFbGVtZW50ICopaWRzLCBuYW1lQXJyYXksIHNpemVBcnJheSk7CisgICAgamludCBpZCA9IChqaW50KXJzRWxlbWVudENyZWF0ZTIoY29uLCBmaWVsZENvdW50LCAoUnNFbGVtZW50ICopaWRzLCBuYW1lQXJyYXksIHNpemVBcnJheSwgKGNvbnN0IHVpbnQzMl90ICopYXJyYXlTaXplcyk7CiAgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCBmaWVsZENvdW50OyBjdCsrKSB7CiAgICAgICAgIGpzdHJpbmcgcyA9IChqc3RyaW5nKV9lbnYtPkdldE9iamVjdEFycmF5RWxlbWVudChfbmFtZXMsIGN0KTsKICAgICAgICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHMsIG5hbWVBcnJheVtjdF0pOwogICAgIH0KICAgICBfZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhfaWRzLCBpZHMsIEpOSV9BQk9SVCk7CisgICAgX2Vudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoX2FycmF5U2l6ZXMsIGFycmF5U2l6ZXMsIEpOSV9BQk9SVCk7CiAgICAgZnJlZShuYW1lQXJyYXkpOwogICAgIGZyZWUoc2l6ZUFycmF5KTsKICAgICByZXR1cm4gKGppbnQpaWQ7CiB9CiAKK3N0YXRpYyB2b2lkCituRWxlbWVudEdldE5hdGl2ZURhdGEoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGlkLCBqaW50QXJyYXkgX2VsZW1lbnREYXRhKQoreworICAgIGludCBkYXRhU2l6ZSA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKF9lbGVtZW50RGF0YSk7CisgICAgTE9HX0FQSSgibkVsZW1lbnRHZXROYXRpdmVEYXRhLCBjb24oJXApIiwgY29uKTsKKworICAgIC8vIHdlIHdpbGwgcGFjayBtVHlwZTsgbUtpbmQ7IG1Ob3JtYWxpemVkOyBtVmVjdG9yU2l6ZTsgTnVtU3ViRWxlbWVudHMKKyAgICBhc3NlcnQoZGF0YVNpemUgPT0gNSk7CisKKyAgICB1aW50MzJfdCBlbGVtZW50RGF0YVs1XTsKKyAgICByc0VsZW1lbnRHZXROYXRpdmVEYXRhKGNvbiwgKFJzRWxlbWVudClpZCwgZWxlbWVudERhdGEsIGRhdGFTaXplKTsKKworICAgIGZvcihqaW50IGkgPSAwOyBpIDwgZGF0YVNpemU7IGkgKyspIHsKKyAgICAgICAgX2Vudi0+U2V0SW50QXJyYXlSZWdpb24oX2VsZW1lbnREYXRhLCBpLCAxLCAoY29uc3QgamludCopJmVsZW1lbnREYXRhW2ldKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK25FbGVtZW50R2V0U3ViRWxlbWVudHMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGlkLCBqaW50QXJyYXkgX0lEcywgam9iamVjdEFycmF5IF9uYW1lcykKK3sKKyAgICBpbnQgZGF0YVNpemUgPSBfZW52LT5HZXRBcnJheUxlbmd0aChfSURzKTsKKyAgICBMT0dfQVBJKCJuRWxlbWVudEdldFN1YkVsZW1lbnRzLCBjb24oJXApIiwgY29uKTsKKworICAgIHVpbnQzMl90ICppZHMgPSAodWludDMyX3QgKiltYWxsb2MoKHVpbnQzMl90KWRhdGFTaXplICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgY29uc3QgY2hhciAqKm5hbWVzID0gKGNvbnN0IGNoYXIgKiopbWFsbG9jKCh1aW50MzJfdClkYXRhU2l6ZSAqIHNpemVvZihjb25zdCBjaGFyICopKTsKKworICAgIHJzRWxlbWVudEdldFN1YkVsZW1lbnRzKGNvbiwgKFJzRWxlbWVudClpZCwgaWRzLCBuYW1lcywgKHVpbnQzMl90KWRhdGFTaXplKTsKKworICAgIGZvcihqaW50IGkgPSAwOyBpIDwgZGF0YVNpemU7IGkgKyspIHsKKyAgICAgICAgX2Vudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KF9uYW1lcywgaSwgX2Vudi0+TmV3U3RyaW5nVVRGKG5hbWVzW2ldKSk7CisgICAgICAgIF9lbnYtPlNldEludEFycmF5UmVnaW9uKF9JRHMsIGksIDEsIChjb25zdCBqaW50KikmaWRzW2ldKTsKKyAgICB9CisKKyAgICBmcmVlKGlkcyk7CisgICAgZnJlZShuYW1lcyk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyB2b2lkCi1uVHlwZUJlZ2luKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBlSUQpCituVHlwZUJlZ2luKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBlSUQpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblR5cGVCZWdpbiwgY29uKCVwKSBlKCVwKSIsIGNvbiwgKFJzRWxlbWVudCllSUQpOwogICAgIHJzVHlwZUJlZ2luKGNvbiwgKFJzRWxlbWVudCllSUQpOwogfQogCiBzdGF0aWMgdm9pZAotblR5cGVBZGQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGRpbSwgamludCB2YWwpCituVHlwZUFkZChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZGltLCBqaW50IHZhbCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuVHlwZUFkZCwgY29uKCVwKSBkaW0oJWkpLCB2YWwoJWkpIiwgY29uLCBkaW0sIHZhbCk7CiAgICAgcnNUeXBlQWRkKGNvbiwgKFJzRGltZW5zaW9uKWRpbSwgdmFsKTsKIH0KIAogc3RhdGljIGppbnQKLW5UeXBlQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK25UeXBlQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuVHlwZUNyZWF0ZSwgY29uKCVwKSIsIGNvbik7CiAgICAgcmV0dXJuIChqaW50KXJzVHlwZUNyZWF0ZShjb24pOwogfQogCi1zdGF0aWMgdm9pZCAqIFNGX0xvYWRJbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF9vYmosIGpmaWVsZElEIF9maWVsZCwgdm9pZCAqYnVmZmVyKQotewotICAgICgoaW50MzJfdCAqKWJ1ZmZlcilbMF0gPSBfZW52LT5HZXRJbnRGaWVsZChfb2JqLCBfZmllbGQpOwotICAgIHJldHVybiAoKHVpbnQ4X3QgKilidWZmZXIpICsgNDsKLX0KLQotc3RhdGljIHZvaWQgKiBTRl9Mb2FkU2hvcnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF9vYmosIGpmaWVsZElEIF9maWVsZCwgdm9pZCAqYnVmZmVyKQotewotICAgICgoaW50MTZfdCAqKWJ1ZmZlcilbMF0gPSBfZW52LT5HZXRTaG9ydEZpZWxkKF9vYmosIF9maWVsZCk7Ci0gICAgcmV0dXJuICgodWludDhfdCAqKWJ1ZmZlcikgKyAyOwotfQotCi1zdGF0aWMgdm9pZCAqIFNGX0xvYWRCeXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBfZmllbGQsIHZvaWQgKmJ1ZmZlcikKLXsKLSAgICAoKGludDhfdCAqKWJ1ZmZlcilbMF0gPSBfZW52LT5HZXRCeXRlRmllbGQoX29iaiwgX2ZpZWxkKTsKLSAgICByZXR1cm4gKCh1aW50OF90ICopYnVmZmVyKSArIDE7Ci19Ci0KLXN0YXRpYyB2b2lkICogU0ZfTG9hZEZsb2F0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBfZmllbGQsIHZvaWQgKmJ1ZmZlcikKLXsKLSAgICAoKGZsb2F0ICopYnVmZmVyKVswXSA9IF9lbnYtPkdldEZsb2F0RmllbGQoX29iaiwgX2ZpZWxkKTsKLSAgICByZXR1cm4gKCh1aW50OF90ICopYnVmZmVyKSArIDQ7Ci19Ci0KLXN0YXRpYyB2b2lkICogU0ZfU2F2ZUludChKTklFbnYgKl9lbnYsIGpvYmplY3QgX29iaiwgamZpZWxkSUQgX2ZpZWxkLCB2b2lkICpidWZmZXIpCi17Ci0gICAgX2Vudi0+U2V0SW50RmllbGQoX29iaiwgX2ZpZWxkLCAoKGludDMyX3QgKilidWZmZXIpWzBdKTsKLSAgICByZXR1cm4gKCh1aW50OF90ICopYnVmZmVyKSArIDQ7Ci19Ci0KLXN0YXRpYyB2b2lkICogU0ZfU2F2ZVNob3J0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBfZmllbGQsIHZvaWQgKmJ1ZmZlcikKLXsKLSAgICBfZW52LT5TZXRTaG9ydEZpZWxkKF9vYmosIF9maWVsZCwgKChpbnQxNl90ICopYnVmZmVyKVswXSk7Ci0gICAgcmV0dXJuICgodWludDhfdCAqKWJ1ZmZlcikgKyAyOwotfQotCi1zdGF0aWMgdm9pZCAqIFNGX1NhdmVCeXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBfZmllbGQsIHZvaWQgKmJ1ZmZlcikKLXsKLSAgICBfZW52LT5TZXRCeXRlRmllbGQoX29iaiwgX2ZpZWxkLCAoKGludDhfdCAqKWJ1ZmZlcilbMF0pOwotICAgIHJldHVybiAoKHVpbnQ4X3QgKilidWZmZXIpICsgMTsKLX0KLQotc3RhdGljIHZvaWQgKiBTRl9TYXZlRmxvYXQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF9vYmosIGpmaWVsZElEIF9maWVsZCwgdm9pZCAqYnVmZmVyKQotewotICAgIF9lbnYtPlNldEZsb2F0RmllbGQoX29iaiwgX2ZpZWxkLCAoKGZsb2F0ICopYnVmZmVyKVswXSk7Ci0gICAgcmV0dXJuICgodWludDhfdCAqKWJ1ZmZlcikgKyA0OwotfQotCi1zdHJ1Y3QgVHlwZUZpZWxkQ2FjaGUgewotICAgIGpmaWVsZElEIGZpZWxkOwotICAgIGludCBiaXRzOwotICAgIHZvaWQgKiAoKnB0cikoSk5JRW52ICosIGpvYmplY3QsIGpmaWVsZElELCB2b2lkICpidWZmZXIpOwotICAgIHZvaWQgKiAoKnJlYWRQdHIpKEpOSUVudiAqLCBqb2JqZWN0LCBqZmllbGRJRCwgdm9pZCAqYnVmZmVyKTsKLX07Ci0KLXN0cnVjdCBUeXBlQ2FjaGUgewotICAgIGludCBmaWVsZENvdW50OwotICAgIGludCBzaXplOwotICAgIFR5cGVGaWVsZENhY2hlIGZpZWxkc1sxXTsKLX07Ci0KLS8veyJuVHlwZUZpbmFsRGVzdHJveSIsICAgICAgICAgICAgICAiKExhbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlOylWIiwgICAgICAgKHZvaWQqKW5UeXBlRmluYWxEZXN0cm95IH0sCiBzdGF0aWMgdm9pZAotblR5cGVGaW5hbERlc3Ryb3koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqb2JqZWN0IF90eXBlKQorblR5cGVHZXROYXRpdmVEYXRhKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBpZCwgamludEFycmF5IF90eXBlRGF0YSkKIHsKLSAgICBUeXBlQ2FjaGUgKnRjID0gKFR5cGVDYWNoZSAqKV9lbnYtPkdldEludEZpZWxkKF90eXBlLCBnVHlwZU5hdGl2ZUNhY2hlKTsKLSAgICBmcmVlKHRjKTsKLX0KKyAgICAvLyBXZSBhcmUgcGFja2luZyA2IGl0ZW1zOiBtRGltWDsgbURpbVk7IG1EaW1aOworICAgIC8vIG1EaW1MT0Q7IG1EaW1GYWNlczsgbUVsZW1lbnQ7IGludG8gdHlwZURhdGEKKyAgICBpbnQgZWxlbWVudENvdW50ID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoX3R5cGVEYXRhKTsKIAotLy8gbmF0aXZlIHZvaWQgblR5cGVTZXR1cEZpZWxkcyhUeXBlIHQsIGludFtdIHR5cGVzLCBpbnRbXSBiaXRzLCBGaWVsZFtdIElEcyk7Ci1zdGF0aWMgdm9pZAotblR5cGVTZXR1cEZpZWxkcyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpvYmplY3QgX3R5cGUsIGppbnRBcnJheSBfdHlwZXMsIGppbnRBcnJheSBfYml0cywgam9iamVjdEFycmF5IF9JRHMpCi17Ci0gICAgaW50IGZpZWxkQ291bnQgPSBfZW52LT5HZXRBcnJheUxlbmd0aChfdHlwZXMpOwotICAgIHNpemVfdCBzdHJ1Y3RTaXplID0gc2l6ZW9mKFR5cGVDYWNoZSkgKyAoc2l6ZW9mKFR5cGVGaWVsZENhY2hlKSAqIChmaWVsZENvdW50LTEpKTsKLSAgICBUeXBlQ2FjaGUgKnRjID0gKFR5cGVDYWNoZSAqKW1hbGxvYyhzdHJ1Y3RTaXplKTsKLSAgICBtZW1zZXQodGMsIDAsIHN0cnVjdFNpemUpOworICAgIGFzc2VydChlbGVtZW50Q291bnQgPT0gNik7CisgICAgTE9HX0FQSSgiblR5cGVDcmVhdGUsIGNvbiglcCkiLCBjb24pOwogCi0gICAgVHlwZUZpZWxkQ2FjaGUgKnRmYyA9ICZ0Yy0+ZmllbGRzWzBdOwotICAgIHRjLT5maWVsZENvdW50ID0gZmllbGRDb3VudDsKLSAgICBfZW52LT5TZXRJbnRGaWVsZChfdHlwZSwgZ1R5cGVOYXRpdmVDYWNoZSwgKGppbnQpdGMpOworICAgIHVpbnQzMl90IHR5cGVEYXRhWzZdOworICAgIHJzVHlwZUdldE5hdGl2ZURhdGEoY29uLCAoUnNUeXBlKWlkLCB0eXBlRGF0YSwgNik7CiAKLSAgICBqaW50ICpmVHlwZSA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMoX3R5cGVzLCBOVUxMKTsKLSAgICBqaW50ICpmQml0cyA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMoX2JpdHMsIE5VTEwpOwotICAgIGZvciAoaW50IGN0PTA7IGN0IDwgZmllbGRDb3VudDsgY3QrKykgewotICAgICAgICBqb2JqZWN0IGZpZWxkID0gX2Vudi0+R2V0T2JqZWN0QXJyYXlFbGVtZW50KF9JRHMsIGN0KTsKLSAgICAgICAgdGZjW2N0XS5maWVsZCA9IF9lbnYtPkZyb21SZWZsZWN0ZWRGaWVsZChmaWVsZCk7Ci0gICAgICAgIHRmY1tjdF0uYml0cyA9IGZCaXRzW2N0XTsKLQotICAgICAgICBzd2l0Y2goZlR5cGVbY3RdKSB7Ci0gICAgICAgIGNhc2UgUlNfVFlQRV9GTE9BVF8zMjoKLSAgICAgICAgICAgIHRmY1tjdF0ucHRyID0gU0ZfTG9hZEZsb2F0OwotICAgICAgICAgICAgdGZjW2N0XS5yZWFkUHRyID0gU0ZfU2F2ZUZsb2F0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlNfVFlQRV9VTlNJR05FRF8zMjoKLSAgICAgICAgY2FzZSBSU19UWVBFX1NJR05FRF8zMjoKLSAgICAgICAgICAgIHRmY1tjdF0ucHRyID0gU0ZfTG9hZEludDsKLSAgICAgICAgICAgIHRmY1tjdF0ucmVhZFB0ciA9IFNGX1NhdmVJbnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSU19UWVBFX1VOU0lHTkVEXzE2OgotICAgICAgICBjYXNlIFJTX1RZUEVfU0lHTkVEXzE2OgotICAgICAgICAgICAgdGZjW2N0XS5wdHIgPSBTRl9Mb2FkU2hvcnQ7Ci0gICAgICAgICAgICB0ZmNbY3RdLnJlYWRQdHIgPSBTRl9TYXZlU2hvcnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSU19UWVBFX1VOU0lHTkVEXzg6Ci0gICAgICAgIGNhc2UgUlNfVFlQRV9TSUdORURfODoKLSAgICAgICAgICAgIHRmY1tjdF0ucHRyID0gU0ZfTG9hZEJ5dGU7Ci0gICAgICAgICAgICB0ZmNbY3RdLnJlYWRQdHIgPSBTRl9TYXZlQnl0ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHRjLT5zaXplICs9IDQ7CisgICAgZm9yKGppbnQgaSA9IDA7IGkgPCBlbGVtZW50Q291bnQ7IGkgKyspIHsKKyAgICAgICAgX2Vudi0+U2V0SW50QXJyYXlSZWdpb24oX3R5cGVEYXRhLCBpLCAxLCAoY29uc3QgamludCopJnR5cGVEYXRhW2ldKTsKICAgICB9Ci0KLSAgICBfZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhfdHlwZXMsIGZUeXBlLCBKTklfQUJPUlQpOwotICAgIF9lbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKF9iaXRzLCBmQml0cywgSk5JX0FCT1JUKTsKIH0KIAotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgamludAotbkFsbG9jYXRpb25DcmVhdGVUeXBlZChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgZSkKK25BbGxvY2F0aW9uQ3JlYXRlVHlwZWQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGUpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb25DcmVhdGVUeXBlZCwgY29uKCVwKSwgZSglcCkiLCBjb24sIChSc0VsZW1lbnQpZSk7CiAgICAgcmV0dXJuIChqaW50KSByc0FsbG9jYXRpb25DcmVhdGVUeXBlZChjb24sIChSc0VsZW1lbnQpZSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYSwgamJvb2xlYW4gZ2VuTWlwLCBqaW50IG1pcCkKK25BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhLCBqYm9vbGVhbiBnZW5NaXAsIGppbnQgbWlwKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlLCBjb24oJXApLCBhKCVwKSwgZ2VuTWlwKCVpKSwgbWlwKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhLCBnZW5NaXAsIG1pcCk7CiAgICAgcnNBbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKGNvbiwgKFJzQWxsb2NhdGlvbilhLCBnZW5NaXAsIG1pcCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhKQorbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0LCBjb24oJXApLCBhKCVwKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhKTsKICAgICByc0FsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdChjb24sIChSc0FsbG9jYXRpb24pYSk7CiB9CkBAIC00ODAsOSArNDAzLDggQEAKIH0KIAogc3RhdGljIGludAotbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBkc3RGbXQsIGpib29sZWFuIGdlbk1pcHMsIGpvYmplY3QgamJpdG1hcCkKK25BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZHN0Rm10LCBqYm9vbGVhbiBnZW5NaXBzLCBqb2JqZWN0IGpiaXRtYXApCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgU2tCaXRtYXAgY29uc3QgKiBuYXRpdmVCaXRtYXAgPQogICAgICAgICAgICAgKFNrQml0bWFwIGNvbnN0ICopX2Vudi0+R2V0SW50RmllbGQoamJpdG1hcCwgZ05hdGl2ZUJpdG1hcElEKTsKICAgICBjb25zdCBTa0JpdG1hcCYgYml0bWFwKCpuYXRpdmVCaXRtYXApOwpAQCAtNTA4LDkgKzQzMCw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB0eXBlLCBqb2JqZWN0IGpiaXRtYXApCituQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgdHlwZSwgam9iamVjdCBqYml0bWFwKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIFNrQml0bWFwICogbmF0aXZlQml0bWFwID0KICAgICAgICAgICAgIChTa0JpdG1hcCAqKV9lbnYtPkdldEludEZpZWxkKGpiaXRtYXAsIGdOYXRpdmVCaXRtYXBJRCk7CiAKQEAgLTUyMiwxMCArNDQzLDggQEAKIH0KIAogc3RhdGljIGludAotbkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGRzdEZtdCwgamJvb2xlYW4gZ2VuTWlwcywgamludCBuYXRpdmVfYXNzZXQpCituQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZHN0Rm10LCBqYm9vbGVhbiBnZW5NaXBzLCBqaW50IG5hdGl2ZV9hc3NldCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLQogICAgIEFzc2V0KiBhc3NldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8QXNzZXQqPihuYXRpdmVfYXNzZXQpOwogICAgIFNrQml0bWFwIGJpdG1hcDsKICAgICBTa0ltYWdlRGVjb2Rlcjo6RGVjb2RlTWVtb3J5KGFzc2V0LT5nZXRCdWZmZXIoZmFsc2UpLCBhc3NldC0+Z2V0TGVuZ3RoKCksCkBAIC01NDgsOSArNDY3LDggQEAKIH0KIAogc3RhdGljIGludAotbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGRzdEZtdCwgamJvb2xlYW4gZ2VuTWlwcywgam9iamVjdCBqYml0bWFwKQorbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGRzdEZtdCwgamJvb2xlYW4gZ2VuTWlwcywgam9iamVjdCBqYml0bWFwKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIFNrQml0bWFwIGNvbnN0ICogbmF0aXZlQml0bWFwID0KICAgICAgICAgICAgIChTa0JpdG1hcCBjb25zdCAqKV9lbnYtPkdldEludEZpZWxkKGpiaXRtYXAsIGdOYXRpdmVCaXRtYXBJRCk7CiAgICAgY29uc3QgU2tCaXRtYXAmIGJpdG1hcCgqbmF0aXZlQml0bWFwKTsKQEAgLTU3Miw5ICs0OTAsOCBAQAogCiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YkRhdGExRF9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgamludCBvZmZzZXQsIGppbnQgY291bnQsIGppbnRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQorbkFsbG9jYXRpb25TdWJEYXRhMURfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWxsb2MsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqaW50QXJyYXkgZGF0YSwgaW50IHNpemVCeXRlcykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BbGxvY2F0aW9uMURTdWJEYXRhX2ksIGNvbiglcCksIGFkYXB0ZXIoJXApLCBvZmZzZXQoJWkpLCBjb3VudCglaSksIGxlbiglaSksIHNpemVCeXRlcyglaSkiLCBjb24sIChSc0FsbG9jYXRpb24pYWxsb2MsIG9mZnNldCwgY291bnQsIGxlbiwgc2l6ZUJ5dGVzKTsKICAgICBqaW50ICpwdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNTgzLDkgKzUwMCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YkRhdGExRF9zKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgamludCBvZmZzZXQsIGppbnQgY291bnQsIGpzaG9ydEFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCituQWxsb2NhdGlvblN1YkRhdGExRF9zKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgamludCBvZmZzZXQsIGppbnQgY291bnQsIGpzaG9ydEFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWxsb2NhdGlvbjFEU3ViRGF0YV9zLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgb2Zmc2V0KCVpKSwgY291bnQoJWkpLCBsZW4oJWkpLCBzaXplQnl0ZXMoJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBvZmZzZXQsIGNvdW50LCBsZW4sIHNpemVCeXRlcyk7CiAgICAganNob3J0ICpwdHIgPSBfZW52LT5HZXRTaG9ydEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CkBAIC01OTQsOSArNTEwLDggQEAKIH0KIAogc3RhdGljIHZvaWQKLW5BbGxvY2F0aW9uU3ViRGF0YTFEX2IoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFsbG9jLCBqaW50IG9mZnNldCwgamludCBjb3VudCwgamJ5dGVBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQorbkFsbG9jYXRpb25TdWJEYXRhMURfYihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWxsb2MsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqYnl0ZUFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWxsb2NhdGlvbjFEU3ViRGF0YV9iLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgb2Zmc2V0KCVpKSwgY291bnQoJWkpLCBsZW4oJWkpLCBzaXplQnl0ZXMoJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBvZmZzZXQsIGNvdW50LCBsZW4sIHNpemVCeXRlcyk7CiAgICAgamJ5dGUgKnB0ciA9IF9lbnYtPkdldEJ5dGVBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNjA1LDkgKzUyMCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YkRhdGExRF9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgamludCBvZmZzZXQsIGppbnQgY291bnQsIGpmbG9hdEFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCituQWxsb2NhdGlvblN1YkRhdGExRF9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgamludCBvZmZzZXQsIGppbnQgY291bnQsIGpmbG9hdEFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWxsb2NhdGlvbjFEU3ViRGF0YV9mLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgb2Zmc2V0KCVpKSwgY291bnQoJWkpLCBsZW4oJWkpLCBzaXplQnl0ZXMoJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBvZmZzZXQsIGNvdW50LCBsZW4sIHNpemVCeXRlcyk7CiAgICAgamZsb2F0ICpwdHIgPSBfZW52LT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CkBAIC02MTYsOSArNTMwLDE5IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YkRhdGEyRF9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqaW50QXJyYXkgZGF0YSwgaW50IHNpemVCeXRlcykKKy8vICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25TdWJFbGVtZW50RGF0YTFEKGludCBjb24sIGludCBpZCwgaW50IHhvZmYsIGludCBjb21wSWR4LCBieXRlW10gZCwgaW50IHNpemVCeXRlcyk7CituQWxsb2NhdGlvblN1YkVsZW1lbnREYXRhMUQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqaW50IG9mZnNldCwgamludCBjb21wSWR4LCBqYnl0ZUFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CisgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKKyAgICBMT0dfQVBJKCJuQWxsb2NhdGlvblN1YkVsZW1lbnREYXRhMUQsIGNvbiglcCksIGFsbG9jKCVwKSwgb2Zmc2V0KCVpKSwgY29tcCglaSksIGxlbiglaSksIHNpemVCeXRlcyglaSkiLCBjb24sIChSc0FsbG9jYXRpb24pYWxsb2MsIG9mZnNldCwgY29tcElkeCwgbGVuLCBzaXplQnl0ZXMpOworICAgIGpieXRlICpwdHIgPSBfZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKKyAgICByc0FsbG9jYXRpb24xRFN1YkVsZW1lbnREYXRhKGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgb2Zmc2V0LCBwdHIsIGNvbXBJZHgsIHNpemVCeXRlcyk7CisgICAgX2Vudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGRhdGEsIHB0ciwgSk5JX0FCT1JUKTsKK30KKworc3RhdGljIHZvaWQKK25BbGxvY2F0aW9uU3ViRGF0YTJEX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqaW50IHhvZmYsIGppbnQgeW9mZiwgamludCB3LCBqaW50IGgsIGppbnRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQorewogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb24yRFN1YkRhdGFfaSwgY29uKCVwKSwgYWRhcHRlciglcCksIHhvZmYoJWkpLCB5b2ZmKCVpKSwgdyglaSksIGgoJWkpLCBsZW4oJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCB4b2ZmLCB5b2ZmLCB3LCBoLCBsZW4pOwogICAgIGppbnQgKnB0ciA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CkBAIC02MjcsOSArNTUxLDggQEAKIH0KIAogc3RhdGljIHZvaWQKLW5BbGxvY2F0aW9uU3ViRGF0YTJEX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFsbG9jLCBqaW50IHhvZmYsIGppbnQgeW9mZiwgamludCB3LCBqaW50IGgsIGpmbG9hdEFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCituQWxsb2NhdGlvblN1YkRhdGEyRF9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqZmxvYXRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb24yRFN1YkRhdGFfaSwgY29uKCVwKSwgYWRhcHRlciglcCksIHhvZmYoJWkpLCB5b2ZmKCVpKSwgdyglaSksIGgoJWkpLCBsZW4oJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCB4b2ZmLCB5b2ZmLCB3LCBoLCBsZW4pOwogICAgIGpmbG9hdCAqcHRyID0gX2Vudi0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNjM4LDkgKzU2MSw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblJlYWRfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWxsb2MsIGppbnRBcnJheSBkYXRhKQorbkFsbG9jYXRpb25SZWFkX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqaW50QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BbGxvY2F0aW9uUmVhZF9pLCBjb24oJXApLCBhbGxvYyglcCksIGxlbiglaSkiLCBjb24sIChSc0FsbG9jYXRpb24pYWxsb2MsIGxlbik7CiAgICAgamludCAqcHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTY0OSw5ICs1NzEsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25SZWFkX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFsbG9jLCBqZmxvYXRBcnJheSBkYXRhKQorbkFsbG9jYXRpb25SZWFkX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqZmxvYXRBcnJheSBkYXRhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb25SZWFkX2YsIGNvbiglcCksIGFsbG9jKCVwKSwgbGVuKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgbGVuKTsKICAgICBqZmxvYXQgKnB0ciA9IF9lbnYtPkdldEZsb2F0QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTY1OSw3MCArNTgwLDEwMyBAQAogICAgIF9lbnYtPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoZGF0YSwgcHRyLCAwKTsKIH0KIAotCi0vL3sibkFsbG9jYXRpb25EYXRhRnJvbU9iamVjdCIsICAgICAgIihJTGFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGU7TGphdmEvbGFuZy9PYmplY3Q7KVYiLCAgICh2b2lkKiluQWxsb2NhdGlvbkRhdGFGcm9tT2JqZWN0IH0sCi1zdGF0aWMgdm9pZAotbkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWxsb2MsIGpvYmplY3QgX3R5cGUsIGppbnQgb2Zmc2V0LCBqb2JqZWN0IF9vKQorc3RhdGljIGppbnQKK25BbGxvY2F0aW9uR2V0VHlwZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuQWxsb2NhdGlvbkRhdGFGcm9tT2JqZWN0IGNvbiglcCksIGFsbG9jKCVwKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYyk7Ci0KLSAgICBjb25zdCBUeXBlQ2FjaGUgKnRjID0gKFR5cGVDYWNoZSAqKV9lbnYtPkdldEludEZpZWxkKF90eXBlLCBnVHlwZU5hdGl2ZUNhY2hlKTsKLQotICAgIHZvaWQgKiBidWZBbGxvYyA9IG1hbGxvYyh0Yy0+c2l6ZSk7Ci0gICAgdm9pZCAqIGJ1ZiA9IGJ1ZkFsbG9jOwotICAgIGZvciAoaW50IGN0PTA7IGN0IDwgdGMtPmZpZWxkQ291bnQ7IGN0KyspIHsKLSAgICAgICAgY29uc3QgVHlwZUZpZWxkQ2FjaGUgKnRmYyA9ICZ0Yy0+ZmllbGRzW2N0XTsKLSAgICAgICAgYnVmID0gdGZjLT5wdHIoX2VudiwgX28sIHRmYy0+ZmllbGQsIGJ1Zik7Ci0gICAgfQotICAgIHJzQWxsb2NhdGlvbjFEU3ViRGF0YShjb24sIChSc0FsbG9jYXRpb24pYWxsb2MsIG9mZnNldCwgMSwgYnVmQWxsb2MsIHRjLT5zaXplKTsKLSAgICBmcmVlKGJ1ZkFsbG9jKTsKKyAgICBMT0dfQVBJKCJuQWxsb2NhdGlvbkdldFR5cGUsIGNvbiglcCksIGEoJXApIiwgY29uLCAoUnNBbGxvY2F0aW9uKWEpOworICAgIHJldHVybiAoamludCkgcnNBbGxvY2F0aW9uR2V0VHlwZShjb24sIChSc0FsbG9jYXRpb24pYSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgam9iamVjdCBfdHlwZSwgamludCBvZmZzZXQsIGpvYmplY3QgX28pCituQWxsb2NhdGlvblJlc2l6ZTFEKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgamludCBkaW1YKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5BbGxvY2F0aW9uUmVhZEZyb21PYmplY3QgY29uKCVwKSwgYWxsb2MoJXApIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKKyAgICBMT0dfQVBJKCJuQWxsb2NhdGlvblJlc2l6ZTFELCBjb24oJXApLCBhbGxvYyglcCksIHNpemVYKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgZGltWCk7CisgICAgcnNBbGxvY2F0aW9uUmVzaXplMUQoY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBkaW1YKTsKK30KIAotICAgIGFzc2VydChvZmZzZXQgPT0gMCk7CitzdGF0aWMgdm9pZAorbkFsbG9jYXRpb25SZXNpemUyRChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWxsb2MsIGppbnQgZGltWCwgamludCBkaW1ZKQoreworICAgIExPR19BUEkoIm5BbGxvY2F0aW9uUmVzaXplMUQsIGNvbiglcCksIGFsbG9jKCVwKSwgc2l6ZVgoJWkpLCBzaXplWSglaSkiLCBjb24sIChSc0FsbG9jYXRpb24pYWxsb2MsIGRpbVgsIGRpbVkpOworICAgIHJzQWxsb2NhdGlvblJlc2l6ZTJEKGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgZGltWCwgZGltWSk7Cit9CiAKLSAgICBjb25zdCBUeXBlQ2FjaGUgKnRjID0gKFR5cGVDYWNoZSAqKV9lbnYtPkdldEludEZpZWxkKF90eXBlLCBnVHlwZU5hdGl2ZUNhY2hlKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgICB2b2lkICogYnVmQWxsb2MgPSBtYWxsb2ModGMtPnNpemUpOwotICAgIHZvaWQgKiBidWYgPSBidWZBbGxvYzsKLSAgICByc0FsbG9jYXRpb25SZWFkKGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgYnVmQWxsb2MpOworc3RhdGljIGludAorbkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG5hdGl2ZV9hc3NldCkKK3sKKyAgICBMT0dWKCJfX19fX19uRmlsZUEzRCAldSIsICh1aW50MzJfdCkgbmF0aXZlX2Fzc2V0KTsKIAotICAgIGZvciAoaW50IGN0PTA7IGN0IDwgdGMtPmZpZWxkQ291bnQ7IGN0KyspIHsKLSAgICAgICAgY29uc3QgVHlwZUZpZWxkQ2FjaGUgKnRmYyA9ICZ0Yy0+ZmllbGRzW2N0XTsKLSAgICAgICAgYnVmID0gdGZjLT5yZWFkUHRyKF9lbnYsIF9vLCB0ZmMtPmZpZWxkLCBidWYpOworICAgIEFzc2V0KiBhc3NldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8QXNzZXQqPihuYXRpdmVfYXNzZXQpOworCisgICAgamludCBpZCA9IChqaW50KXJzRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShjb24sIGFzc2V0LT5nZXRCdWZmZXIoZmFsc2UpLCBhc3NldC0+Z2V0TGVuZ3RoKCkpOworICAgIHJldHVybiBpZDsKK30KKworc3RhdGljIGludAorbkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGZpbGVBM0QpCit7CisgICAgaW50MzJfdCBudW1FbnRyaWVzID0gMDsKKyAgICByc0ZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoY29uLCAmbnVtRW50cmllcywgKFJzRmlsZSlmaWxlQTNEKTsKKyAgICByZXR1cm4gbnVtRW50cmllczsKK30KKworc3RhdGljIHZvaWQKK25GaWxlQTNER2V0SW5kZXhFbnRyaWVzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBmaWxlQTNELCBqaW50IG51bUVudHJpZXMsIGppbnRBcnJheSBfaWRzLCBqb2JqZWN0QXJyYXkgX2VudHJpZXMpCit7CisgICAgTE9HVigiX19fX19fbkZpbGVBM0QgJXUiLCAodWludDMyX3QpIGZpbGVBM0QpOworICAgIFJzRmlsZUluZGV4RW50cnkgKmZpbGVFbnRyaWVzID0gKFJzRmlsZUluZGV4RW50cnkqKW1hbGxvYygodWludDMyX3QpbnVtRW50cmllcyAqIHNpemVvZihSc0ZpbGVJbmRleEVudHJ5KSk7CisKKyAgICByc0ZpbGVBM0RHZXRJbmRleEVudHJpZXMoY29uLCBmaWxlRW50cmllcywgKHVpbnQzMl90KW51bUVudHJpZXMsIChSc0ZpbGUpZmlsZUEzRCk7CisKKyAgICBmb3IoamludCBpID0gMDsgaSA8IG51bUVudHJpZXM7IGkgKyspIHsKKyAgICAgICAgX2Vudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KF9lbnRyaWVzLCBpLCBfZW52LT5OZXdTdHJpbmdVVEYoZmlsZUVudHJpZXNbaV0ub2JqZWN0TmFtZSkpOworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfaWRzLCBpLCAxLCAoY29uc3QgamludCopJmZpbGVFbnRyaWVzW2ldLmNsYXNzSUQpOwogICAgIH0KLSAgICBmcmVlKGJ1ZkFsbG9jKTsKKworICAgIGZyZWUoZmlsZUVudHJpZXMpOworfQorCitzdGF0aWMgaW50CituRmlsZUEzREdldEVudHJ5QnlJbmRleChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZmlsZUEzRCwgamludCBpbmRleCkKK3sKKyAgICBMT0dWKCJfX19fX19uRmlsZUEzRCAldSIsICh1aW50MzJfdCkgZmlsZUEzRCk7CisgICAgamludCBpZCA9IChqaW50KXJzRmlsZUEzREdldEVudHJ5QnlJbmRleChjb24sICh1aW50MzJfdClpbmRleCwgKFJzRmlsZSlmaWxlQTNEKTsKKyAgICByZXR1cm4gaWQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQKK25Gb250Q3JlYXRlRnJvbUZpbGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqc3RyaW5nIGZpbGVOYW1lLCBqaW50IGZvbnRTaXplLCBqaW50IGRwaSkKK3sKKyAgICBjb25zdCBjaGFyKiBmaWxlTmFtZVVURiA9IF9lbnYtPkdldFN0cmluZ1VURkNoYXJzKGZpbGVOYW1lLCBOVUxMKTsKKworICAgIGppbnQgaWQgPSAoamludClyc0ZvbnRDcmVhdGVGcm9tRmlsZShjb24sIGZpbGVOYW1lVVRGLCBmb250U2l6ZSwgZHBpKTsKKyAgICByZXR1cm4gaWQ7CiB9CiAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5BZGFwdGVyMURCaW5kQWxsb2NhdGlvbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCBhbGxvYykKK25BZGFwdGVyMURCaW5kQWxsb2NhdGlvbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCBhbGxvYykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFEQmluZEFsbG9jYXRpb24sIGNvbiglcCksIGFkYXB0ZXIoJXApLCBhbGxvYyglcCkiLCBjb24sIChSc0FkYXB0ZXIxRClhZGFwdGVyLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKICAgICByc0FkYXB0ZXIxREJpbmRBbGxvY2F0aW9uKGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIChSc0FsbG9jYXRpb24pYWxsb2MpOwogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIxRFNldENvbnN0cmFpbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFkYXB0ZXIsIGppbnQgZGltLCBqaW50IHZhbHVlKQorbkFkYXB0ZXIxRFNldENvbnN0cmFpbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFkYXB0ZXIsIGppbnQgZGltLCBqaW50IHZhbHVlKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMURTZXRDb25zdHJhaW50LCBjb24oJXApLCBhZGFwdGVyKCVwKSwgZGltKCVpKSwgdmFsdWUoJWkpIiwgY29uLCAoUnNBZGFwdGVyMUQpYWRhcHRlciwgZGltLCB2YWx1ZSk7CiAgICAgcnNBZGFwdGVyMURTZXRDb25zdHJhaW50KGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIChSc0RpbWVuc2lvbilkaW0sIHZhbHVlKTsKIH0KIAogc3RhdGljIHZvaWQKLW5BZGFwdGVyMUREYXRhX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFkYXB0ZXIsIGppbnRBcnJheSBkYXRhKQorbkFkYXB0ZXIxRERhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFERGF0YV9pLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgbGVuKCVpKSIsIGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIGxlbik7CiAgICAgamludCAqcHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTczMSw5ICs2ODUsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIxRFN1YkRhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCBvZmZzZXQsIGppbnQgY291bnQsIGppbnRBcnJheSBkYXRhKQorbkFkYXB0ZXIxRFN1YkRhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCBvZmZzZXQsIGppbnQgY291bnQsIGppbnRBcnJheSBkYXRhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIxRFN1YkRhdGFfaSwgY29uKCVwKSwgYWRhcHRlciglcCksIG9mZnNldCglaSksIGNvdW50KCVpKSwgbGVuKCVpKSIsIGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIG9mZnNldCwgY291bnQsIGxlbik7CiAgICAgamludCAqcHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTc0Miw5ICs2OTUsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIxRERhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamZsb2F0QXJyYXkgZGF0YSkKK25BZGFwdGVyMUREYXRhX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFkYXB0ZXIsIGpmbG9hdEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFERGF0YV9mLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgbGVuKCVpKSIsIGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIGxlbik7CiAgICAgamZsb2F0ICpwdHIgPSBfZW52LT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CkBAIC03NTMsOSArNzA1LDggQEAKIH0KIAogc3RhdGljIHZvaWQKLW5BZGFwdGVyMURTdWJEYXRhX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFkYXB0ZXIsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqZmxvYXRBcnJheSBkYXRhKQorbkFkYXB0ZXIxRFN1YkRhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCBvZmZzZXQsIGppbnQgY291bnQsIGpmbG9hdEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFEU3ViRGF0YV9mLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgb2Zmc2V0KCVpKSwgY291bnQoJWkpLCBsZW4oJWkpIiwgY29uLCAoUnNBZGFwdGVyMUQpYWRhcHRlciwgb2Zmc2V0LCBjb3VudCwgbGVuKTsKICAgICBqZmxvYXQgKnB0ciA9IF9lbnYtPkdldEZsb2F0QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTc2NCw5ICs3MTUsOCBAQAogfQogCiBzdGF0aWMgamludAotbkFkYXB0ZXIxRENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituQWRhcHRlcjFEQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFEQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKICAgICByZXR1cm4gKGppbnQpcnNBZGFwdGVyMURDcmVhdGUoY29uKTsKIH0KQEAgLTc3NCwyNSArNzI0LDIyIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqaW50IGFsbG9jKQorbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqaW50IGFsbG9jKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbiwgY29uKCVwKSwgYWRhcHRlciglcCksIGFsbG9jKCVwKSIsIGNvbiwgKFJzQWRhcHRlcjJEKWFkYXB0ZXIsIChSc0FsbG9jYXRpb24pYWxsb2MpOwogICAgIHJzQWRhcHRlcjJEQmluZEFsbG9jYXRpb24oY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgKFJzQWxsb2NhdGlvbilhbGxvYyk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjJEU2V0Q29uc3RyYWludChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCBkaW0sIGppbnQgdmFsdWUpCituQWRhcHRlcjJEU2V0Q29uc3RyYWludChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCBkaW0sIGppbnQgdmFsdWUpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIyRFNldENvbnN0cmFpbnQsIGNvbiglcCksIGFkYXB0ZXIoJXApLCBkaW0oJWkpLCB2YWx1ZSglaSkiLCBjb24sIChSc0FkYXB0ZXIyRClhZGFwdGVyLCBkaW0sIHZhbHVlKTsKICAgICByc0FkYXB0ZXIyRFNldENvbnN0cmFpbnQoY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgKFJzRGltZW5zaW9uKWRpbSwgdmFsdWUpOwogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIyRERhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludEFycmF5IGRhdGEpCituQWRhcHRlcjJERGF0YV9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqaW50QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMkREYXRhX2ksIGNvbiglcCksIGFkYXB0ZXIoJXApLCBsZW4oJWkpIiwgY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgbGVuKTsKICAgICBqaW50ICpwdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtODAxLDkgKzc0OCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjJERGF0YV9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqZmxvYXRBcnJheSBkYXRhKQorbkFkYXB0ZXIyRERhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamZsb2F0QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMkREYXRhX2YsIGNvbiglcCksIGFkYXB0ZXIoJXApLCBsZW4oJWkpIiwgY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgbGVuKTsKICAgICBqZmxvYXQgKnB0ciA9IF9lbnYtPkdldEZsb2F0QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTgxMiw5ICs3NTgsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIyRFN1YkRhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqaW50QXJyYXkgZGF0YSkKK25BZGFwdGVyMkRTdWJEYXRhX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFkYXB0ZXIsIGppbnQgeG9mZiwgamludCB5b2ZmLCBqaW50IHcsIGppbnQgaCwgamludEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjJEU3ViRGF0YV9pLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgeG9mZiglaSksIHlvZmYoJWkpLCB3KCVpKSwgaCglaSksIGxlbiglaSkiLAogICAgICAgICAgICAgY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgeG9mZiwgeW9mZiwgdywgaCwgbGVuKTsKQEAgLTgyNCw5ICs3NjksOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIyRFN1YkRhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqZmxvYXRBcnJheSBkYXRhKQorbkFkYXB0ZXIyRFN1YkRhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqZmxvYXRBcnJheSBkYXRhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIyRFN1YkRhdGFfZiwgY29uKCVwKSwgYWRhcHRlciglcCksIHhvZmYoJWkpLCB5b2ZmKCVpKSwgdyglaSksIGgoJWkpLCBsZW4oJWkpIiwKICAgICAgICAgICAgIGNvbiwgKFJzQWRhcHRlcjJEKWFkYXB0ZXIsIHhvZmYsIHlvZmYsIHcsIGgsIGxlbik7CkBAIC04MzYsOSArNzgwLDggQEAKIH0KIAogc3RhdGljIGppbnQKLW5BZGFwdGVyMkRDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorbkFkYXB0ZXIyRENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIyRENyZWF0ZSwgY29uKCVwKSIsIGNvbik7CiAgICAgcmV0dXJuIChqaW50KXJzQWRhcHRlcjJEQ3JlYXRlKGNvbik7CiB9CkBAIC04NDYsNDEgKzc4OSw0NyBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRCaW5kQWxsb2NhdGlvbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqaW50IGFsbG9jLCBqaW50IHNsb3QpCituU2NyaXB0QmluZEFsbG9jYXRpb24oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHNjcmlwdCwgamludCBhbGxvYywgamludCBzbG90KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5TY3JpcHRCaW5kQWxsb2NhdGlvbiwgY29uKCVwKSwgc2NyaXB0KCVwKSwgYWxsb2MoJXApLCBzbG90KCVpKSIsIGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgKFJzQWxsb2NhdGlvbilhbGxvYywgc2xvdCk7CiAgICAgcnNTY3JpcHRCaW5kQWxsb2NhdGlvbihjb24sIChSc1NjcmlwdClzY3JpcHQsIChSc0FsbG9jYXRpb24pYWxsb2MsIHNsb3QpOwogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldENsZWFyQ29sb3IoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHNjcmlwdCwgamZsb2F0IHIsIGpmbG9hdCBnLCBqZmxvYXQgYiwgamZsb2F0IGEpCituU2NyaXB0U2V0VmFySShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgc2NyaXB0LCBqaW50IHNsb3QsIGppbnQgdmFsKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5TY3JpcHRTZXRDbGVhckNvbG9yLCBjb24oJXApLCBzKCVwKSwgciglZiksIGcoJWYpLCBiKCVmKSwgYSglZikiLCBjb24sICh2b2lkICopc2NyaXB0LCByLCBnLCBiLCBhKTsKLSAgICByc1NjcmlwdFNldENsZWFyQ29sb3IoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCByLCBnLCBiLCBhKTsKKyAgICBMT0dfQVBJKCJuU2NyaXB0U2V0VmFySSwgY29uKCVwKSwgcyglcCksIHNsb3QoJWkpLCB2YWwoJWkpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCwgdmFsKTsKKyAgICByc1NjcmlwdFNldFZhckkoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBzbG90LCB2YWwpOwogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldENsZWFyRGVwdGgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHNjcmlwdCwgamZsb2F0IGQpCituU2NyaXB0U2V0VmFyRihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgc2NyaXB0LCBqaW50IHNsb3QsIGZsb2F0IHZhbCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q1NldENsZWFyRGVwdGgsIGNvbiglcCksIHMoJXApLCBkZXB0aCglZikiLCBjb24sICh2b2lkICopc2NyaXB0LCBkKTsKLSAgICByc1NjcmlwdFNldENsZWFyRGVwdGgoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBkKTsKKyAgICBMT0dfQVBJKCJuU2NyaXB0U2V0VmFyRiwgY29uKCVwKSwgcyglcCksIHNsb3QoJWkpLCB2YWwoJWYpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCwgdmFsKTsKKyAgICByc1NjcmlwdFNldFZhckYoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBzbG90LCB2YWwpOwogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldENsZWFyU3RlbmNpbChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqaW50IHN0ZW5jaWwpCituU2NyaXB0U2V0VmFyRChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgc2NyaXB0LCBqaW50IHNsb3QsIGRvdWJsZSB2YWwpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdENTZXRDbGVhclN0ZW5jaWwsIGNvbiglcCksIHMoJXApLCBzdGVuY2lsKCVpKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIHN0ZW5jaWwpOwotICAgIHJzU2NyaXB0U2V0Q2xlYXJTdGVuY2lsKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgc3RlbmNpbCk7CisgICAgTE9HX0FQSSgiblNjcmlwdFNldFZhckQsIGNvbiglcCksIHMoJXApLCBzbG90KCVpKSwgdmFsKCVsZikiLCBjb24sICh2b2lkICopc2NyaXB0LCBzbG90LCB2YWwpOworICAgIHJzU2NyaXB0U2V0VmFyRChjb24sIChSc1NjcmlwdClzY3JpcHQsIHNsb3QsIHZhbCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uU2NyaXB0U2V0VGltZVpvbmUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHNjcmlwdCwgamJ5dGVBcnJheSB0aW1lWm9uZSkKK25TY3JpcHRTZXRWYXJWKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBzY3JpcHQsIGppbnQgc2xvdCwgamJ5dGVBcnJheSBkYXRhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOworICAgIExPR19BUEkoIm5TY3JpcHRTZXRWYXJWLCBjb24oJXApLCBzKCVwKSwgc2xvdCglaSkiLCBjb24sICh2b2lkICopc2NyaXB0LCBzbG90KTsKKyAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOworICAgIGpieXRlICpwdHIgPSBfZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKKyAgICByc1NjcmlwdFNldFZhclYoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBzbG90LCBwdHIsIGxlbik7CisgICAgX2Vudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGRhdGEsIHB0ciwgSk5JX0FCT1JUKTsKK30KKworCitzdGF0aWMgdm9pZAorblNjcmlwdFNldFRpbWVab25lKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBzY3JpcHQsIGpieXRlQXJyYXkgdGltZVpvbmUpCit7CiAgICAgTE9HX0FQSSgiblNjcmlwdENTZXRUaW1lWm9uZSwgY29uKCVwKSwgcyglcCksIHRpbWVab25lKCVzKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIChjb25zdCBjaGFyICopdGltZVpvbmUpOwogCiAgICAgamludCBsZW5ndGggPSBfZW52LT5HZXRBcnJheUxlbmd0aCh0aW1lWm9uZSk7CkBAIC04OTUsNjYgKzg0NCwzNiBAQAogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldFR5cGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHR5cGUsIGpib29sZWFuIHdyaXRhYmxlLCBqc3RyaW5nIF9zdHIsIGppbnQgc2xvdCkKK25TY3JpcHRJbnZva2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG9iaiwgamludCBzbG90KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5TY3JpcHRDQWRkVHlwZSwgY29uKCVwKSwgdHlwZSglcCksIHdyaXRhYmxlKCVpKSwgc2xvdCglaSkiLCBjb24sIChSc1R5cGUpdHlwZSwgd3JpdGFibGUsIHNsb3QpOwotICAgIGNvbnN0IGNoYXIqIG4gPSBOVUxMOwotICAgIGlmIChfc3RyKSB7Ci0gICAgICAgIG4gPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhfc3RyLCBOVUxMKTsKLSAgICB9Ci0gICAgcnNTY3JpcHRTZXRUeXBlKGNvbiwgKFJzVHlwZSl0eXBlLCBzbG90LCB3cml0YWJsZSwgbik7Ci0gICAgaWYgKG4pIHsKLSAgICAgICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKF9zdHIsIG4pOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLW5TY3JpcHRTZXRJbnZva2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqc3RyaW5nIF9zdHIsIGppbnQgc2xvdCkKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0U2V0SW52b2tlLCBjb24oJXApIiwgY29uKTsKLSAgICBjb25zdCBjaGFyKiBuID0gTlVMTDsKLSAgICBpZiAoX3N0cikgewotICAgICAgICBuID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMoX3N0ciwgTlVMTCk7Ci0gICAgfQotICAgIHJzU2NyaXB0U2V0SW52b2tlKGNvbiwgbiwgc2xvdCk7Ci0gICAgaWYgKG4pIHsKLSAgICAgICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKF9zdHIsIG4pOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLW5TY3JpcHRJbnZva2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG9iaiwgamludCBzbG90KQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5TY3JpcHRJbnZva2UsIGNvbiglcCksIHNjcmlwdCglcCkiLCBjb24sICh2b2lkICopb2JqKTsKICAgICByc1NjcmlwdEludm9rZShjb24sIChSc1NjcmlwdClvYmosIHNsb3QpOwogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldFJvb3QoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiBpc1Jvb3QpCituU2NyaXB0SW52b2tlVihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgc2NyaXB0LCBqaW50IHNsb3QsIGpieXRlQXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q1NldFJvb3QsIGNvbiglcCksIGlzUm9vdCglaSkiLCBjb24sIGlzUm9vdCk7Ci0gICAgcnNTY3JpcHRTZXRSb290KGNvbiwgaXNSb290KTsKKyAgICBMT0dfQVBJKCJuU2NyaXB0SW52b2tlViwgY29uKCVwKSwgcyglcCksIHNsb3QoJWkpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCk7CisgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKKyAgICBqYnl0ZSAqcHRyID0gX2Vudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CisgICAgcnNTY3JpcHRJbnZva2VWKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgc2xvdCwgcHRyLCBsZW4pOworICAgIF9lbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBwdHIsIEpOSV9BQk9SVCk7CiB9CiAKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRDQmVnaW4oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorblNjcmlwdENCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblNjcmlwdENCZWdpbiwgY29uKCVwKSIsIGNvbik7CiAgICAgcnNTY3JpcHRDQmVnaW4oY29uKTsKIH0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRDU2V0U2NyaXB0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamJ5dGVBcnJheSBzY3JpcHRSZWYsCituU2NyaXB0Q1NldFNjcmlwdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGpieXRlQXJyYXkgc2NyaXB0UmVmLAogICAgICAgICAgICAgICAgICAgamludCBvZmZzZXQsIGppbnQgbGVuZ3RoKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIiEhISBuU2NyaXB0Q1NldFNjcmlwdCwgY29uKCVwKSIsIGNvbik7CiAgICAgamludCBfZXhjZXB0aW9uID0gMDsKICAgICBqaW50IHJlbWFpbmluZzsKQEAgLTk5NSwxMTQgKzkxNCw4MiBAQAogfQogCiBzdGF0aWMgamludAotblNjcmlwdENDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorblNjcmlwdENDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5TY3JpcHRDQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKICAgICByZXR1cm4gKGppbnQpcnNTY3JpcHRDQ3JlYXRlKGNvbik7CiB9CiAKLXN0YXRpYyB2b2lkCi1uU2NyaXB0Q0FkZERlZmluZUkzMihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpzdHJpbmcgbmFtZSwgamludCB2YWx1ZSkKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBjb25zdCBjaGFyKiBuID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMobmFtZSwgTlVMTCk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdENBZGREZWZpbmVJMzIsIGNvbiglcCkgbmFtZSglcykgdmFsdWUoJWQpIiwgY29uLCBuLCB2YWx1ZSk7Ci0gICAgcnNTY3JpcHRDU2V0RGVmaW5lSTMyKGNvbiwgbiwgdmFsdWUpOwotICAgIF9lbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhuYW1lLCBuKTsKLX0KLQotc3RhdGljIHZvaWQKLW5TY3JpcHRDQWRkRGVmaW5lRihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpzdHJpbmcgbmFtZSwgamZsb2F0IHZhbHVlKQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIGNvbnN0IGNoYXIqIG4gPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhuYW1lLCBOVUxMKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q0FkZERlZmluZUYsIGNvbiglcCkgbmFtZSglcykgdmFsdWUoJWYpIiwgY29uLCBuLCB2YWx1ZSk7Ci0gICAgcnNTY3JpcHRDU2V0RGVmaW5lRihjb24sIG4sIHZhbHVlKTsKLSAgICBfZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMobmFtZSwgbik7Ci19Ci0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGluLCBqaW50IG91dCkKK25Qcm9ncmFtU3RvcmVCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgaW4sIGppbnQgb3V0KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luLCBjb24oJXApLCBpbiglcCksIG91dCglcCkiLCBjb24sIChSc0VsZW1lbnQpaW4sIChSc0VsZW1lbnQpb3V0KTsKLSAgICByc1Byb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oY29uLCAoUnNFbGVtZW50KWluLCAoUnNFbGVtZW50KW91dCk7CisgICAgTE9HX0FQSSgiblByb2dyYW1TdG9yZUJlZ2luLCBjb24oJXApLCBpbiglcCksIG91dCglcCkiLCBjb24sIChSc0VsZW1lbnQpaW4sIChSc0VsZW1lbnQpb3V0KTsKKyAgICByc1Byb2dyYW1TdG9yZUJlZ2luKGNvbiwgKFJzRWxlbWVudClpbiwgKFJzRWxlbWVudClvdXQpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBmdW5jKQorblByb2dyYW1TdG9yZURlcHRoRnVuYyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZnVuYykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMsIGNvbiglcCksIGZ1bmMoJWkpIiwgY29uLCBmdW5jKTsKLSAgICByc1Byb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jKGNvbiwgKFJzRGVwdGhGdW5jKWZ1bmMpOworICAgIExPR19BUEkoIm5Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMsIGNvbiglcCksIGZ1bmMoJWkpIiwgY29uLCBmdW5jKTsKKyAgICByc1Byb2dyYW1TdG9yZURlcHRoRnVuYyhjb24sIChSc0RlcHRoRnVuYylmdW5jKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIGVuYWJsZSkKK25Qcm9ncmFtU3RvcmVEZXB0aE1hc2soSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqYm9vbGVhbiBlbmFibGUpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrLCBjb24oJXApLCBlbmFibGUoJWkpIiwgY29uLCBlbmFibGUpOwotICAgIHJzUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2soY29uLCBlbmFibGUpOworICAgIExPR19BUEkoIm5Qcm9ncmFtU3RvcmVEZXB0aE1hc2ssIGNvbiglcCksIGVuYWJsZSglaSkiLCBjb24sIGVuYWJsZSk7CisgICAgcnNQcm9ncmFtU3RvcmVEZXB0aE1hc2soY29uLCBlbmFibGUpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamJvb2xlYW4gciwgamJvb2xlYW4gZywgamJvb2xlYW4gYiwgamJvb2xlYW4gYSkKK25Qcm9ncmFtU3RvcmVDb2xvck1hc2soSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqYm9vbGVhbiByLCBqYm9vbGVhbiBnLCBqYm9vbGVhbiBiLCBqYm9vbGVhbiBhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzaywgY29uKCVwKSwgciglaSksIGcoJWkpLCBiKCVpKSwgYSglaSkiLCBjb24sIHIsIGcsIGIsIGEpOwotICAgIHJzUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2soY29uLCByLCBnLCBiLCBhKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlQ29sb3JNYXNrLCBjb24oJXApLCByKCVpKSwgZyglaSksIGIoJWkpLCBhKCVpKSIsIGNvbiwgciwgZywgYiwgYSk7CisgICAgcnNQcm9ncmFtU3RvcmVDb2xvck1hc2soY29uLCByLCBnLCBiLCBhKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGludCBzcmMsIGludCBkc3QpCituUHJvZ3JhbVN0b3JlQmxlbmRGdW5jKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgaW50IHNyYywgaW50IGRzdCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMsIGNvbiglcCksIHNyYyglaSksIGRzdCglaSkiLCBjb24sIHNyYywgZHN0KTsKLSAgICByc1Byb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jKGNvbiwgKFJzQmxlbmRTcmNGdW5jKXNyYywgKFJzQmxlbmREc3RGdW5jKWRzdCk7CisgICAgTE9HX0FQSSgiblByb2dyYW1TdG9yZUJsZW5kRnVuYywgY29uKCVwKSwgc3JjKCVpKSwgZHN0KCVpKSIsIGNvbiwgc3JjLCBkc3QpOworICAgIHJzUHJvZ3JhbVN0b3JlQmxlbmRGdW5jKGNvbiwgKFJzQmxlbmRTcmNGdW5jKXNyYywgKFJzQmxlbmREc3RGdW5jKWRzdCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiBlbmFibGUpCituUHJvZ3JhbVN0b3JlRGl0aGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamJvb2xlYW4gZW5hYmxlKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlciwgY29uKCVwKSwgZW5hYmxlKCVpKSIsIGNvbiwgZW5hYmxlKTsKLSAgICByc1Byb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyKGNvbiwgZW5hYmxlKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlRGl0aGVyLCBjb24oJXApLCBlbmFibGUoJWkpIiwgY29uLCBlbmFibGUpOworICAgIHJzUHJvZ3JhbVN0b3JlRGl0aGVyKGNvbiwgZW5hYmxlKTsKIH0KIAogc3RhdGljIGppbnQKLW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituUHJvZ3JhbVN0b3JlQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUsIGNvbiglcCkiLCBjb24pOwotCi0gICAgcmV0dXJuIChqaW50KXJzUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUoY29uKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKKyAgICByZXR1cm4gKGppbnQpcnNQcm9ncmFtU3RvcmVDcmVhdGUoY29uKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUJpbmRDb25zdGFudHMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHZwdiwgamludCBzbG90LCBqaW50IGEpCituUHJvZ3JhbUJpbmRDb25zdGFudHMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHZwdiwgamludCBzbG90LCBqaW50IGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblByb2dyYW1CaW5kQ29uc3RhbnRzLCBjb24oJXApLCB2cGYoJXApLCBzbG9hdCglaSksIGEoJXApIiwgY29uLCAoUnNQcm9ncmFtVmVydGV4KXZwdiwgc2xvdCwgKFJzQWxsb2NhdGlvbilhKTsKICAgICByc1Byb2dyYW1CaW5kQ29uc3RhbnRzKGNvbiwgKFJzUHJvZ3JhbSl2cHYsIHNsb3QsIChSc0FsbG9jYXRpb24pYSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUJpbmRUZXh0dXJlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB2cGYsIGppbnQgc2xvdCwgamludCBhKQorblByb2dyYW1CaW5kVGV4dHVyZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgdnBmLCBqaW50IHNsb3QsIGppbnQgYSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuUHJvZ3JhbUJpbmRUZXh0dXJlLCBjb24oJXApLCB2cGYoJXApLCBzbG90KCVpKSwgYSglcCkiLCBjb24sIChSc1Byb2dyYW1GcmFnbWVudCl2cGYsIHNsb3QsIChSc0FsbG9jYXRpb24pYSk7CiAgICAgcnNQcm9ncmFtQmluZFRleHR1cmUoY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnBmLCBzbG90LCAoUnNBbGxvY2F0aW9uKWEpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1CaW5kU2FtcGxlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgdnBmLCBqaW50IHNsb3QsIGppbnQgYSkKK25Qcm9ncmFtQmluZFNhbXBsZXIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHZwZiwgamludCBzbG90LCBqaW50IGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblByb2dyYW1CaW5kU2FtcGxlciwgY29uKCVwKSwgdnBmKCVwKSwgc2xvdCglaSksIGEoJXApIiwgY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnBmLCBzbG90LCAoUnNTYW1wbGVyKWEpOwogICAgIHJzUHJvZ3JhbUJpbmRTYW1wbGVyKGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50KXZwZiwgc2xvdCwgKFJzU2FtcGxlcilhKTsKIH0KQEAgLTExMTAsMzEgKzk5NywxNiBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyBqaW50Ci1uUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludEFycmF5IHBhcmFtcykKK25Qcm9ncmFtRnJhZ21lbnRDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqc3RyaW5nIHNoYWRlciwgamludEFycmF5IHBhcmFtcykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBqaW50ICpwYXJhbVB0ciA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMocGFyYW1zLCBOVUxMKTsKLSAgICBqaW50IHBhcmFtTGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgocGFyYW1zKTsKLQotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUsIGNvbiglcCksIHBhcmFtTGVuKCVpKSIsIGNvbiwgcGFyYW1MZW4pOwotCi0gICAgamludCByZXQgPSAoamludClyc1Byb2dyYW1GcmFnbWVudENyZWF0ZShjb24sICh1aW50MzJfdCAqKXBhcmFtUHRyLCBwYXJhbUxlbik7Ci0gICAgX2Vudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMocGFyYW1zLCBwYXJhbVB0ciwgSk5JX0FCT1JUKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgamludAotblByb2dyYW1GcmFnbWVudENyZWF0ZTIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqc3RyaW5nIHNoYWRlciwgamludEFycmF5IHBhcmFtcykKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBjb25zdCBjaGFyKiBzaGFkZXJVVEYgPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzaGFkZXIsIE5VTEwpOwogICAgIGppbnQgc2hhZGVyTGVuID0gX2Vudi0+R2V0U3RyaW5nVVRGTGVuZ3RoKHNoYWRlcik7CiAgICAgamludCAqcGFyYW1QdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKHBhcmFtcywgTlVMTCk7CiAgICAgamludCBwYXJhbUxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKHBhcmFtcyk7CiAKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMiwgY29uKCVwKSwgc2hhZGVyTGVuKCVpKSwgcGFyYW1MZW4oJWkpIiwgY29uLCBzaGFkZXJMZW4sIHBhcmFtTGVuKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlLCBjb24oJXApLCBzaGFkZXJMZW4oJWkpLCBwYXJhbUxlbiglaSkiLCBjb24sIHNoYWRlckxlbiwgcGFyYW1MZW4pOwogCi0gICAgamludCByZXQgPSAoamludClyc1Byb2dyYW1GcmFnbWVudENyZWF0ZTIoY29uLCBzaGFkZXJVVEYsIHNoYWRlckxlbiwgKHVpbnQzMl90ICopcGFyYW1QdHIsIHBhcmFtTGVuKTsKKyAgICBqaW50IHJldCA9IChqaW50KXJzUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKGNvbiwgc2hhZGVyVVRGLCBzaGFkZXJMZW4sICh1aW50MzJfdCAqKXBhcmFtUHRyLCBwYXJhbUxlbik7CiAgICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNoYWRlciwgc2hhZGVyVVRGKTsKICAgICBfZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhwYXJhbXMsIHBhcmFtUHRyLCBKTklfQUJPUlQpOwogICAgIHJldHVybiByZXQ7CkBAIC0xMTQ0LDI1ICsxMDE2LDE2IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIGppbnQKLW5Qcm9ncmFtVmVydGV4Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamJvb2xlYW4gdGV4TWF0KQorblByb2dyYW1WZXJ0ZXhDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqc3RyaW5nIHNoYWRlciwgamludEFycmF5IHBhcmFtcykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbVZlcnRleENyZWF0ZSwgY29uKCVwKSwgdGV4TWF0KCVpKSIsIGNvbiwgdGV4TWF0KTsKLSAgICByZXR1cm4gKGppbnQpcnNQcm9ncmFtVmVydGV4Q3JlYXRlKGNvbiwgdGV4TWF0KTsKLX0KLQotc3RhdGljIGppbnQKLW5Qcm9ncmFtVmVydGV4Q3JlYXRlMihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpzdHJpbmcgc2hhZGVyLCBqaW50QXJyYXkgcGFyYW1zKQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGNvbnN0IGNoYXIqIHNoYWRlclVURiA9IF9lbnYtPkdldFN0cmluZ1VURkNoYXJzKHNoYWRlciwgTlVMTCk7CiAgICAgamludCBzaGFkZXJMZW4gPSBfZW52LT5HZXRTdHJpbmdVVEZMZW5ndGgoc2hhZGVyKTsKICAgICBqaW50ICpwYXJhbVB0ciA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMocGFyYW1zLCBOVUxMKTsKICAgICBqaW50IHBhcmFtTGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgocGFyYW1zKTsKIAotICAgIExPR19BUEkoIm5Qcm9ncmFtVmVydGV4Q3JlYXRlMiwgY29uKCVwKSwgc2hhZGVyTGVuKCVpKSwgcGFyYW1MZW4oJWkpIiwgY29uLCBzaGFkZXJMZW4sIHBhcmFtTGVuKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVZlcnRleENyZWF0ZSwgY29uKCVwKSwgc2hhZGVyTGVuKCVpKSwgcGFyYW1MZW4oJWkpIiwgY29uLCBzaGFkZXJMZW4sIHBhcmFtTGVuKTsKIAotICAgIGppbnQgcmV0ID0gKGppbnQpcnNQcm9ncmFtVmVydGV4Q3JlYXRlMihjb24sIHNoYWRlclVURiwgc2hhZGVyTGVuLCAodWludDMyX3QgKilwYXJhbVB0ciwgcGFyYW1MZW4pOworICAgIGppbnQgcmV0ID0gKGppbnQpcnNQcm9ncmFtVmVydGV4Q3JlYXRlKGNvbiwgc2hhZGVyVVRGLCBzaGFkZXJMZW4sICh1aW50MzJfdCAqKXBhcmFtUHRyLCBwYXJhbUxlbik7CiAgICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNoYWRlciwgc2hhZGVyVVRGKTsKICAgICBfZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhwYXJhbXMsIHBhcmFtUHRyLCBKTklfQUJPUlQpOwogICAgIHJldHVybiByZXQ7CkBAIC0xMTcxLDcwICsxMDM0LDYxIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIGppbnQKLW5Qcm9ncmFtUmFzdGVyQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBpbiwgamludCBvdXQsCi0gICAgICAgICAgICAgICAgICAgICBqYm9vbGVhbiBwb2ludFNtb290aCwgamJvb2xlYW4gbGluZVNtb290aCwgamJvb2xlYW4gcG9pbnRTcHJpdGUpCituUHJvZ3JhbVJhc3RlckNyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGpib29sZWFuIHBvaW50U21vb3RoLCBqYm9vbGVhbiBsaW5lU21vb3RoLCBqYm9vbGVhbiBwb2ludFNwcml0ZSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbVJhc3RlckNyZWF0ZSwgY29uKCVwKSwgaW4oJXApLCBvdXQoJXApLCBwb2ludFNtb290aCglaSksIGxpbmVTbW9vdGgoJWkpLCBwb2ludFNwcml0ZSglaSkiLAotICAgICAgICAgICAgY29uLCAoUnNFbGVtZW50KWluLCAoUnNFbGVtZW50KW91dCwgcG9pbnRTbW9vdGgsIGxpbmVTbW9vdGgsIHBvaW50U3ByaXRlKTsKLSAgICByZXR1cm4gKGppbnQpcnNQcm9ncmFtUmFzdGVyQ3JlYXRlKGNvbiwgKFJzRWxlbWVudClpbiwgKFJzRWxlbWVudClvdXQsIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7CisgICAgTE9HX0FQSSgiblByb2dyYW1SYXN0ZXJDcmVhdGUsIGNvbiglcCksIHBvaW50U21vb3RoKCVpKSwgbGluZVNtb290aCglaSksIHBvaW50U3ByaXRlKCVpKSIsCisgICAgICAgICAgICBjb24sIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7CisgICAgcmV0dXJuIChqaW50KXJzUHJvZ3JhbVJhc3RlckNyZWF0ZShjb24sIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbVJhc3RlclNldFBvaW50U2l6ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgdnByLCBqZmxvYXQgdikKK25Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB2cHIsIGpmbG9hdCB2KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplLCBjb24oJXApLCB2cGYoJXApLCB2YWx1ZSglZikiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCB2KTsKLSAgICByc1Byb2dyYW1SYXN0ZXJTZXRQb2ludFNpemUoY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnByLCB2KTsKLX0KLQotc3RhdGljIHZvaWQKLW5Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB2cHIsIGpmbG9hdCB2KQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoLCBjb24oJXApLCB2cGYoJXApLCB2YWx1ZSglZikiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCB2KTsKLSAgICByc1Byb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgoY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnByLCB2KTsKKyAgICByc1Byb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgoY29uLCAoUnNQcm9ncmFtUmFzdGVyKXZwciwgdik7Cit9CisKK3N0YXRpYyB2b2lkCituUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB2cHIsIGppbnQgdikKK3sKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlLCBjb24oJXApLCB2cGYoJXApLCB2YWx1ZSglaSkiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCB2KTsKKyAgICByc1Byb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCAoUnNDdWxsTW9kZSl2KTsKIH0KIAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0QmluZFJvb3RTY3JpcHQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHNjcmlwdCkKK25Db250ZXh0QmluZFJvb3RTY3JpcHQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHNjcmlwdCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dEJpbmRSb290U2NyaXB0LCBjb24oJXApLCBzY3JpcHQoJXApIiwgY29uLCAoUnNTY3JpcHQpc2NyaXB0KTsKICAgICByc0NvbnRleHRCaW5kUm9vdFNjcmlwdChjb24sIChSc1NjcmlwdClzY3JpcHQpOwogfQogCiBzdGF0aWMgdm9pZAotbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHBmcykKK25Db250ZXh0QmluZFByb2dyYW1TdG9yZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgcGZzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlLCBjb24oJXApLCBwZnMoJXApIiwgY29uLCAoUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSlwZnMpOwotICAgIHJzQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShjb24sIChSc1Byb2dyYW1GcmFnbWVudFN0b3JlKXBmcyk7CisgICAgTE9HX0FQSSgibkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlLCBjb24oJXApLCBwZnMoJXApIiwgY29uLCAoUnNQcm9ncmFtU3RvcmUpcGZzKTsKKyAgICByc0NvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKGNvbiwgKFJzUHJvZ3JhbVN0b3JlKXBmcyk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHBmKQorbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBwZikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQsIGNvbiglcCksIHBmKCVwKSIsIGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50KXBmKTsKICAgICByc0NvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50KXBmKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHBmKQorbkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgcGYpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleCwgY29uKCVwKSwgcGYoJXApIiwgY29uLCAoUnNQcm9ncmFtVmVydGV4KXBmKTsKICAgICByc0NvbnRleHRCaW5kUHJvZ3JhbVZlcnRleChjb24sIChSc1Byb2dyYW1WZXJ0ZXgpcGYpOwogfQogCiBzdGF0aWMgdm9pZAotbkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgcGYpCituQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBwZikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyLCBjb24oJXApLCBwZiglcCkiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpcGYpOwogICAgIHJzQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKGNvbiwgKFJzUHJvZ3JhbVJhc3RlcilwZik7CiB9CkBAIC0xMjQzLDEwOCArMTA5NywxMDcgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotblNhbXBsZXJCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituU2FtcGxlckJlZ2luKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuU2FtcGxlckJlZ2luLCBjb24oJXApIiwgY29uKTsKICAgICByc1NhbXBsZXJCZWdpbihjb24pOwogfQogCiBzdGF0aWMgdm9pZAotblNhbXBsZXJTZXQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHAsIGppbnQgdikKK25TYW1wbGVyU2V0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBwLCBqaW50IHYpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblNhbXBsZXJTZXQsIGNvbiglcCksIHBhcmFtKCVpKSwgdmFsdWUoJWkpIiwgY29uLCBwLCB2KTsKICAgICByc1NhbXBsZXJTZXQoY29uLCAoUnNTYW1wbGVyUGFyYW0pcCwgKFJzU2FtcGxlclZhbHVlKXYpOwogfQogCi1zdGF0aWMgamludAotblNhbXBsZXJDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorc3RhdGljIHZvaWQKK25TYW1wbGVyU2V0MihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgcCwgamZsb2F0IHYpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CisgICAgTE9HX0FQSSgiblNhbXBsZXJTZXQyLCBjb24oJXApLCBwYXJhbSglaSksIHZhbHVlKCVmKSIsIGNvbiwgcCwgdik7CisgICAgcnNTYW1wbGVyU2V0Mihjb24sIChSc1NhbXBsZXJQYXJhbSlwLCB2KTsKK30KKworc3RhdGljIGppbnQKK25TYW1wbGVyQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKK3sKICAgICBMT0dfQVBJKCJuU2FtcGxlckNyZWF0ZSwgY29uKCVwKSIsIGNvbik7CiAgICAgcmV0dXJuIChqaW50KXJzU2FtcGxlckNyZWF0ZShjb24pOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3RhdGljIHZvaWQKLW5MaWdodEJlZ2luKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuTGlnaHRCZWdpbiwgY29uKCVwKSIsIGNvbik7Ci0gICAgcnNMaWdodEJlZ2luKGNvbik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1uTGlnaHRTZXRJc01vbm8oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiBpc01vbm8pCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibkxpZ2h0U2V0SXNNb25vLCBjb24oJXApLCBpc01vbm8oJWkpIiwgY29uLCBpc01vbm8pOwotICAgIHJzTGlnaHRTZXRNb25vY2hyb21hdGljKGNvbiwgaXNNb25vKTsKLX0KLQotc3RhdGljIHZvaWQKLW5MaWdodFNldElzTG9jYWwoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiBpc0xvY2FsKQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5MaWdodFNldElzTG9jYWwsIGNvbiglcCksIGlzTG9jYWwoJWkpIiwgY29uLCBpc0xvY2FsKTsKLSAgICByc0xpZ2h0U2V0TG9jYWwoY29uLCBpc0xvY2FsKTsKLX0KLQogc3RhdGljIGppbnQKLW5MaWdodENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituTWVzaENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgdnR4Q291bnQsIGppbnQgaWR4Q291bnQpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibkxpZ2h0Q3JlYXRlLCBjb24oJXApIiwgY29uKTsKLSAgICByZXR1cm4gKGppbnQpcnNMaWdodENyZWF0ZShjb24pOwotfQotCi1zdGF0aWMgdm9pZAotbkxpZ2h0U2V0Q29sb3IoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGxpZ2h0LCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5MaWdodFNldENvbG9yLCBjb24oJXApLCBsaWdodCglcCksIHIoJWYpLCBnKCVmKSwgYiglZikiLCBjb24sIChSc0xpZ2h0KWxpZ2h0LCByLCBnLCBiKTsKLSAgICByc0xpZ2h0U2V0Q29sb3IoY29uLCAoUnNMaWdodClsaWdodCwgciwgZywgYik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1uTGlnaHRTZXRQb3NpdGlvbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgbGlnaHQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibkxpZ2h0U2V0UG9zaXRpb24sIGNvbiglcCksIGxpZ2h0KCVwKSwgeCglZiksIHkoJWYpLCB6KCVmKSIsIGNvbiwgKFJzTGlnaHQpbGlnaHQsIHgsIHksIHopOwotICAgIHJzTGlnaHRTZXRQb3NpdGlvbihjb24sIChSc0xpZ2h0KWxpZ2h0LCB4LCB5LCB6KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBqaW50Ci1uU2ltcGxlTWVzaENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYmF0Y2hJRCwgamludCBpbmRleElELCBqaW50QXJyYXkgdnR4SURzLCBqaW50IHByaW1JRCkKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKHZ0eElEcyk7Ci0gICAgTE9HX0FQSSgiblNpbXBsZU1lc2hDcmVhdGUsIGNvbiglcCksIGJhdGNoSUQoJWkpLCBpbmRleElEKCVpKSwgdnR4SURzLmxlbiglaSksIHByaW1JRCglaSkiLAotICAgICAgICAgICAgY29uLCBiYXRjaElELCBpbmRleElELCBsZW4sIHByaW1JRCk7Ci0gICAgamludCAqcHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyh2dHhJRHMsIE5VTEwpOwotICAgIGludCBpZCA9IChpbnQpcnNTaW1wbGVNZXNoQ3JlYXRlKGNvbiwgKHZvaWQgKiliYXRjaElELCAodm9pZCAqKWluZGV4SUQsICh2b2lkICoqKXB0ciwgbGVuLCBwcmltSUQpOwotICAgIF9lbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKHZ0eElEcywgcHRyLCAwLypKTklfQUJPUlQqLyk7CisgICAgTE9HX0FQSSgibk1lc2hDcmVhdGUsIGNvbiglcCksIHZ0eENvdW50KCVpKSwgaWR4Q291bnQoJWkpIiwgY29uLCB2dHhDb3VudCwgaWR4Q291bnQpOworICAgIGludCBpZCA9IChpbnQpcnNNZXNoQ3JlYXRlKGNvbiwgdnR4Q291bnQsIGlkeENvdW50KTsKICAgICByZXR1cm4gaWQ7CiB9CiAKIHN0YXRpYyB2b2lkCi1uU2ltcGxlTWVzaEJpbmRWZXJ0ZXgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHMsIGppbnQgYWxsb2MsIGppbnQgc2xvdCkKK25NZXNoQmluZFZlcnRleChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgbWVzaCwgamludCBhbGxvYywgamludCBzbG90KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5TaW1wbGVNZXNoQmluZFZlcnRleCwgY29uKCVwKSwgU2ltcGxlTWVzaCglcCksIEFsbG9jKCVwKSwgc2xvdCglaSkiLCBjb24sIChSc1NpbXBsZU1lc2gpcywgKFJzQWxsb2NhdGlvbilhbGxvYywgc2xvdCk7Ci0gICAgcnNTaW1wbGVNZXNoQmluZFZlcnRleChjb24sIChSc1NpbXBsZU1lc2gpcywgKFJzQWxsb2NhdGlvbilhbGxvYywgc2xvdCk7CisgICAgTE9HX0FQSSgibk1lc2hCaW5kVmVydGV4LCBjb24oJXApLCBNZXNoKCVwKSwgQWxsb2MoJXApLCBzbG90KCVpKSIsIGNvbiwgKFJzTWVzaCltZXNoLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBzbG90KTsKKyAgICByc01lc2hCaW5kVmVydGV4KGNvbiwgKFJzTWVzaCltZXNoLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBzbG90KTsKIH0KIAogc3RhdGljIHZvaWQKLW5TaW1wbGVNZXNoQmluZEluZGV4KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBzLCBqaW50IGFsbG9jKQorbk1lc2hCaW5kSW5kZXgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG1lc2gsIGppbnQgYWxsb2MsIGppbnQgcHJpbUlELCBqaW50IHNsb3QpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNpbXBsZU1lc2hCaW5kSW5kZXgsIGNvbiglcCksIFNpbXBsZU1lc2goJXApLCBBbGxvYyglcCkiLCBjb24sIChSc1NpbXBsZU1lc2gpcywgKFJzQWxsb2NhdGlvbilhbGxvYyk7Ci0gICAgcnNTaW1wbGVNZXNoQmluZEluZGV4KGNvbiwgKFJzU2ltcGxlTWVzaClzLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKKyAgICBMT0dfQVBJKCJuTWVzaEJpbmRJbmRleCwgY29uKCVwKSwgTWVzaCglcCksIEFsbG9jKCVwKSIsIGNvbiwgKFJzTWVzaCltZXNoLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKKyAgICByc01lc2hCaW5kSW5kZXgoY29uLCAoUnNNZXNoKW1lc2gsIChSc0FsbG9jYXRpb24pYWxsb2MsIHByaW1JRCwgc2xvdCk7Cit9CisKK3N0YXRpYyBqaW50CituTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBtZXNoKQoreworICAgIExPR19BUEkoIm5NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQsIGNvbiglcCksIE1lc2goJXApIiwgY29uLCAoUnNNZXNoKW1lc2gpOworICAgIGppbnQgdnR4Q291bnQgPSAwOworICAgIHJzTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50KGNvbiwgKFJzTWVzaCltZXNoLCAmdnR4Q291bnQpOworICAgIHJldHVybiB2dHhDb3VudDsKK30KKworc3RhdGljIGppbnQKK25NZXNoR2V0SW5kZXhDb3VudChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgbWVzaCkKK3sKKyAgICBMT0dfQVBJKCJuTWVzaEdldEluZGV4Q291bnQsIGNvbiglcCksIE1lc2goJXApIiwgY29uLCAoUnNNZXNoKW1lc2gpOworICAgIGppbnQgaWR4Q291bnQgPSAwOworICAgIHJzTWVzaEdldEluZGV4Q291bnQoY29uLCAoUnNNZXNoKW1lc2gsICZpZHhDb3VudCk7CisgICAgcmV0dXJuIGlkeENvdW50OworfQorCitzdGF0aWMgdm9pZAorbk1lc2hHZXRWZXJ0aWNlcyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgbWVzaCwgamludEFycmF5IF9pZHMsIGludCBudW1WdHhJRHMpCit7CisgICAgTE9HX0FQSSgibk1lc2hHZXRWZXJ0aWNlcywgY29uKCVwKSwgTWVzaCglcCkiLCBjb24sIChSc01lc2gpbWVzaCk7CisKKyAgICBSc0FsbG9jYXRpb24gKmFsbG9jcyA9IChSc0FsbG9jYXRpb24qKW1hbGxvYygodWludDMyX3QpbnVtVnR4SURzICogc2l6ZW9mKFJzQWxsb2NhdGlvbikpOworICAgIHJzTWVzaEdldFZlcnRpY2VzKGNvbiwgKFJzTWVzaCltZXNoLCBhbGxvY3MsICh1aW50MzJfdCludW1WdHhJRHMpOworCisgICAgZm9yKGppbnQgaSA9IDA7IGkgPCBudW1WdHhJRHM7IGkgKyspIHsKKyAgICAgICAgX2Vudi0+U2V0SW50QXJyYXlSZWdpb24oX2lkcywgaSwgMSwgKGNvbnN0IGppbnQqKSZhbGxvY3NbaV0pOworICAgIH0KKworICAgIGZyZWUoYWxsb2NzKTsKK30KKworc3RhdGljIHZvaWQKK25NZXNoR2V0SW5kaWNlcyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgbWVzaCwgamludEFycmF5IF9pZHhJZHMsIGppbnRBcnJheSBfcHJpbWl0aXZlcywgaW50IG51bUluZGljZXMpCit7CisgICAgTE9HX0FQSSgibk1lc2hHZXRWZXJ0aWNlcywgY29uKCVwKSwgTWVzaCglcCkiLCBjb24sIChSc01lc2gpbWVzaCk7CisKKyAgICBSc0FsbG9jYXRpb24gKmFsbG9jcyA9IChSc0FsbG9jYXRpb24qKW1hbGxvYygodWludDMyX3QpbnVtSW5kaWNlcyAqIHNpemVvZihSc0FsbG9jYXRpb24pKTsKKyAgICB1aW50MzJfdCAqcHJpbXM9ICh1aW50MzJfdCopbWFsbG9jKCh1aW50MzJfdCludW1JbmRpY2VzICogc2l6ZW9mKHVpbnQzMl90KSk7CisKKyAgICByc01lc2hHZXRJbmRpY2VzKGNvbiwgKFJzTWVzaCltZXNoLCBhbGxvY3MsIHByaW1zLCAodWludDMyX3QpbnVtSW5kaWNlcyk7CisKKyAgICBmb3IoamludCBpID0gMDsgaSA8IG51bUluZGljZXM7IGkgKyspIHsKKyAgICAgICAgX2Vudi0+U2V0SW50QXJyYXlSZWdpb24oX2lkeElkcywgaSwgMSwgKGNvbnN0IGppbnQqKSZhbGxvY3NbaV0pOworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfcHJpbWl0aXZlcywgaSwgMSwgKGNvbnN0IGppbnQqKSZwcmltc1tpXSk7CisgICAgfQorCisgICAgZnJlZShhbGxvY3MpOworICAgIGZyZWUocHJpbXMpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEzNTksMTI0ICsxMjEyLDEzMSBAQAogeyJuRGV2aWNlQ3JlYXRlIiwgICAgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5EZXZpY2VDcmVhdGUgfSwKIHsibkRldmljZURlc3Ryb3kiLCAgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRGV2aWNlRGVzdHJveSB9LAogeyJuRGV2aWNlU2V0Q29uZmlnIiwgICAgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5EZXZpY2VTZXRDb25maWcgfSwKLXsibkNvbnRleHRDcmVhdGUiLCAgICAgICAgICAgICAgICAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dENyZWF0ZSB9LAoteyJuQ29udGV4dENyZWF0ZUdMIiwgICAgICAgICAgICAgICAiKElJWilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0Q3JlYXRlR0wgfSwKLXsibkNvbnRleHRTZXRQcmlvcml0eSIsICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dFNldFByaW9yaXR5IH0sCi17Im5Db250ZXh0U2V0U3VyZmFjZSIsICAgICAgICAgICAgICIoSUlMYW5kcm9pZC92aWV3L1N1cmZhY2U7KVYiLCAgICAgICAgICAodm9pZCopbkNvbnRleHRTZXRTdXJmYWNlIH0sCi17Im5Db250ZXh0RGVzdHJveSIsICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHREZXN0cm95IH0sCi17Im5Db250ZXh0RHVtcCIsICAgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHREdW1wIH0sCi17Im5Db250ZXh0UGF1c2UiLCAgICAgICAgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRQYXVzZSB9LAoteyJuQ29udGV4dFJlc3VtZSIsICAgICAgICAgICAgICAgICAiKClWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0UmVzdW1lIH0sCi17Im5Bc3NpZ25OYW1lIiwgICAgICAgICAgICAgICAgICAgICIoSVtCKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFzc2lnbk5hbWUgfSwKLXsibk9iakRlc3Ryb3kiLCAgICAgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluT2JqRGVzdHJveSB9LAoteyJuT2JqRGVzdHJveU9PQiIsICAgICAgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5PYmpEZXN0cm95T09CIH0sCi17Im5Db250ZXh0R2V0TWVzc2FnZSIsICAgICAgICAgICAgICIoW0laKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRHZXRNZXNzYWdlIH0sCi17Im5Db250ZXh0SW5pdFRvQ2xpZW50IiwgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRJbml0VG9DbGllbnQgfSwKLXsibkNvbnRleHREZWluaXRUb0NsaWVudCIsICAgICAgICAgIigpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dERlaW5pdFRvQ2xpZW50IH0sCit7Im5Db250ZXh0R2V0TWVzc2FnZSIsICAgICAgICAgICAgICIoSVtJWilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0R2V0TWVzc2FnZSB9LAoreyJuQ29udGV4dEluaXRUb0NsaWVudCIsICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEluaXRUb0NsaWVudCB9LAoreyJuQ29udGV4dERlaW5pdFRvQ2xpZW50IiwgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dERlaW5pdFRvQ2xpZW50IH0sCiAKLXsibkZpbGVPcGVuIiwgICAgICAgICAgICAgICAgICAgICAgIihbQilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRmlsZU9wZW4gfSwKIAoteyJuRWxlbWVudENyZWF0ZSIsICAgICAgICAgICAgICAgICAiKElJWkkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5FbGVtZW50Q3JlYXRlIH0sCi17Im5FbGVtZW50Q3JlYXRlMiIsICAgICAgICAgICAgICAgICIoW0lbTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAgICAgICAgICAgICAodm9pZCopbkVsZW1lbnRDcmVhdGUyIH0sCisvLyBBbGwgbWV0aG9kcyBiZWxvdyBhcmUgdGhyZWFkIHByb3RlY3RlZCBpbiBqYXZhLgoreyJyc25Db250ZXh0Q3JlYXRlIiwgICAgICAgICAgICAgICAgICIoSUkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0Q3JlYXRlIH0sCit7InJzbkNvbnRleHRDcmVhdGVHTCIsICAgICAgICAgICAgICAgIihJSVopSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRDcmVhdGVHTCB9LAoreyJyc25Db250ZXh0RmluaXNoIiwgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0RmluaXNoIH0sCit7InJzbkNvbnRleHRTZXRQcmlvcml0eSIsICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRTZXRQcmlvcml0eSB9LAoreyJyc25Db250ZXh0U2V0U3VyZmFjZSIsICAgICAgICAgICAgICIoSUlJTGFuZHJvaWQvdmlldy9TdXJmYWNlOylWIiwgICAgICAgICAgKHZvaWQqKW5Db250ZXh0U2V0U3VyZmFjZSB9LAoreyJyc25Db250ZXh0RGVzdHJveSIsICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0RGVzdHJveSB9LAoreyJyc25Db250ZXh0RHVtcCIsICAgICAgICAgICAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0RHVtcCB9LAoreyJyc25Db250ZXh0UGF1c2UiLCAgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0UGF1c2UgfSwKK3sicnNuQ29udGV4dFJlc3VtZSIsICAgICAgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dFJlc3VtZSB9LAoreyJyc25Bc3NpZ25OYW1lIiwgICAgICAgICAgICAgICAgICAgICIoSUlbQilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Bc3NpZ25OYW1lIH0sCit7InJzbkdldE5hbWUiLCAgICAgICAgICAgICAgICAgICAgICAgIihJSSlMamF2YS9sYW5nL1N0cmluZzsiLCAgICAgICAgICAgICAgICAodm9pZCopbkdldE5hbWUgfSwKK3sicnNuT2JqRGVzdHJveSIsICAgICAgICAgICAgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluT2JqRGVzdHJveSB9LAogCi17Im5UeXBlQmVnaW4iLCAgICAgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblR5cGVCZWdpbiB9LAoteyJuVHlwZUFkZCIsICAgICAgICAgICAgICAgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5UeXBlQWRkIH0sCi17Im5UeXBlQ3JlYXRlIiwgICAgICAgICAgICAgICAgICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblR5cGVDcmVhdGUgfSwKLXsiblR5cGVGaW5hbERlc3Ryb3kiLCAgICAgICAgICAgICAgIihMYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZTspViIsICAgICAgICh2b2lkKiluVHlwZUZpbmFsRGVzdHJveSB9LAoteyJuVHlwZVNldHVwRmllbGRzIiwgICAgICAgICAgICAgICAiKExhbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlO1tJW0lbTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOylWIiwgKHZvaWQqKW5UeXBlU2V0dXBGaWVsZHMgfSwKK3sicnNuRmlsZU9wZW4iLCAgICAgICAgICAgICAgICAgICAgICAiKElbQilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRmlsZU9wZW4gfSwKK3sicnNuRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbSIsICAiKElJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbSB9LAoreyJyc25GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzIiwgICAgICIoSUkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzIH0sCit7InJzbkZpbGVBM0RHZXRJbmRleEVudHJpZXMiLCAgICAgICAgIihJSUlbSVtMamF2YS9sYW5nL1N0cmluZzspViIsICAgICAgICAgICAodm9pZCopbkZpbGVBM0RHZXRJbmRleEVudHJpZXMgfSwKK3sicnNuRmlsZUEzREdldEVudHJ5QnlJbmRleCIsICAgICAgICAiKElJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRmlsZUEzREdldEVudHJ5QnlJbmRleCB9LAogCi17Im5BbGxvY2F0aW9uQ3JlYXRlVHlwZWQiLCAgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25DcmVhdGVUeXBlZCB9LAoteyJuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAiLCAgICAiKElaTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOylJIiwgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcCB9LAoteyJuQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZiIsICAgICAiKElMYW5kcm9pZC9ncmFwaGljcy9CaXRtYXA7KUkiLCAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmIH0sCi17Im5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkIiwiKElaTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOylJIiwgICAgICAodm9pZCopbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQgfSwKLXsibkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0iLCIoSVpJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbSB9LAoteyJuQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZSIsICAgICAiKElaSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlIH0sCi17Im5BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QiLCIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdCB9LAoteyJuQWxsb2NhdGlvblN1YkRhdGExRCIsICAgICAgICAgICAiKElJSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTFEX2kgfSwKLXsibkFsbG9jYXRpb25TdWJEYXRhMUQiLCAgICAgICAgICAgIihJSUlbU0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGExRF9zIH0sCi17Im5BbGxvY2F0aW9uU3ViRGF0YTFEIiwgICAgICAgICAgICIoSUlJW0JJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMURfYiB9LAoteyJuQWxsb2NhdGlvblN1YkRhdGExRCIsICAgICAgICAgICAiKElJSVtGSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTFEX2YgfSwKLXsibkFsbG9jYXRpb25TdWJEYXRhMkQiLCAgICAgICAgICAgIihJSUlJSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGEyRF9pIH0sCi17Im5BbGxvY2F0aW9uU3ViRGF0YTJEIiwgICAgICAgICAgICIoSUlJSUlbRkkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMkRfZiB9LAoteyJuQWxsb2NhdGlvblJlYWQiLCAgICAgICAgICAgICAgICAiKElbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uUmVhZF9pIH0sCi17Im5BbGxvY2F0aW9uUmVhZCIsICAgICAgICAgICAgICAgICIoSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25SZWFkX2YgfSwKLXsibkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdCIsICAgIihJTGFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGU7SUxqYXZhL2xhbmcvT2JqZWN0OylWIiwgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdCB9LAoteyJuQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0IiwgICAiKElMYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZTtJTGphdmEvbGFuZy9PYmplY3Q7KVYiLCAgICh2b2lkKiluQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0IH0sCit7InJzbkZvbnRDcmVhdGVGcm9tRmlsZSIsICAgICAgICAgICAgIihJTGphdmEvbGFuZy9TdHJpbmc7SUkpSSIsICAgICAgICAgICAgICAodm9pZCopbkZvbnRDcmVhdGVGcm9tRmlsZSB9LAogCi17Im5BZGFwdGVyMURCaW5kQWxsb2NhdGlvbiIsICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uIH0sCi17Im5BZGFwdGVyMURTZXRDb25zdHJhaW50IiwgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRFNldENvbnN0cmFpbnQgfSwKLXsibkFkYXB0ZXIxRERhdGEiLCAgICAgICAgICAgICAgICAgIihJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFERGF0YV9pIH0sCi17Im5BZGFwdGVyMUREYXRhIiwgICAgICAgICAgICAgICAgICIoSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRERhdGFfZiB9LAoteyJuQWRhcHRlcjFEU3ViRGF0YSIsICAgICAgICAgICAgICAiKElJSVtJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMURTdWJEYXRhX2kgfSwKLXsibkFkYXB0ZXIxRFN1YkRhdGEiLCAgICAgICAgICAgICAgIihJSUlbRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEU3ViRGF0YV9mIH0sCi17Im5BZGFwdGVyMURDcmVhdGUiLCAgICAgICAgICAgICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRENyZWF0ZSB9LAoreyJyc25FbGVtZW50Q3JlYXRlIiwgICAgICAgICAgICAgICAgICIoSUlJWkkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5FbGVtZW50Q3JlYXRlIH0sCit7InJzbkVsZW1lbnRDcmVhdGUyIiwgICAgICAgICAgICAgICAgIihJW0lbTGphdmEvbGFuZy9TdHJpbmc7W0kpSSIsICAgICAgICAgICAodm9pZCopbkVsZW1lbnRDcmVhdGUyIH0sCit7InJzbkVsZW1lbnRHZXROYXRpdmVEYXRhIiwgICAgICAgICAgIihJSVtJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkVsZW1lbnRHZXROYXRpdmVEYXRhIH0sCit7InJzbkVsZW1lbnRHZXRTdWJFbGVtZW50cyIsICAgICAgICAgIihJSVtJW0xqYXZhL2xhbmcvU3RyaW5nOylWIiwgICAgICAgICAgICAodm9pZCopbkVsZW1lbnRHZXRTdWJFbGVtZW50cyB9LAogCi17Im5BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbiIsICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uIH0sCi17Im5BZGFwdGVyMkRTZXRDb25zdHJhaW50IiwgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRFNldENvbnN0cmFpbnQgfSwKLXsibkFkYXB0ZXIyRERhdGEiLCAgICAgICAgICAgICAgICAgIihJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJERGF0YV9pIH0sCi17Im5BZGFwdGVyMkREYXRhIiwgICAgICAgICAgICAgICAgICIoSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRERhdGFfZiB9LAoteyJuQWRhcHRlcjJEU3ViRGF0YSIsICAgICAgICAgICAgICAiKElJSUlJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRTdWJEYXRhX2kgfSwKLXsibkFkYXB0ZXIyRFN1YkRhdGEiLCAgICAgICAgICAgICAgIihJSUlJSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJEU3ViRGF0YV9mIH0sCi17Im5BZGFwdGVyMkRDcmVhdGUiLCAgICAgICAgICAgICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRENyZWF0ZSB9LAoreyJyc25UeXBlQmVnaW4iLCAgICAgICAgICAgICAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5UeXBlQmVnaW4gfSwKK3sicnNuVHlwZUFkZCIsICAgICAgICAgICAgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluVHlwZUFkZCB9LAoreyJyc25UeXBlQ3JlYXRlIiwgICAgICAgICAgICAgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5UeXBlQ3JlYXRlIH0sCit7InJzblR5cGVHZXROYXRpdmVEYXRhIiwgICAgICAgICAgICAgIihJSVtJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblR5cGVHZXROYXRpdmVEYXRhIH0sCiAKLXsiblNjcmlwdEJpbmRBbGxvY2F0aW9uIiwgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0QmluZEFsbG9jYXRpb24gfSwKLXsiblNjcmlwdFNldENsZWFyQ29sb3IiLCAgICAgICAgICAgIihJRkZGRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0Q2xlYXJDb2xvciB9LAoteyJuU2NyaXB0U2V0Q2xlYXJEZXB0aCIsICAgICAgICAgICAiKElGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRDbGVhckRlcHRoIH0sCi17Im5TY3JpcHRTZXRDbGVhclN0ZW5jaWwiLCAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldENsZWFyU3RlbmNpbCB9LAoteyJuU2NyaXB0U2V0VGltZVpvbmUiLCAgICAgICAgICAgICAiKElbQilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRUaW1lWm9uZSB9LAoteyJuU2NyaXB0U2V0VHlwZSIsICAgICAgICAgICAgICAgICAiKElaTGphdmEvbGFuZy9TdHJpbmc7SSlWIiwgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRUeXBlIH0sCi17Im5TY3JpcHRTZXRSb290IiwgICAgICAgICAgICAgICAgICIoWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFJvb3QgfSwKLXsiblNjcmlwdFNldEludm9rYWJsZSIsICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztJKVYiLCAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0SW52b2tlIH0sCi17Im5TY3JpcHRJbnZva2UiLCAgICAgICAgICAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdEludm9rZSB9LAoreyJyc25BbGxvY2F0aW9uQ3JlYXRlVHlwZWQiLCAgICAgICAgICIoSUkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlVHlwZWQgfSwKK3sicnNuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAiLCAgICAiKElJWkxhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcDspSSIsICAgICAgICh2b2lkKiluQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAgfSwKK3sicnNuQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZiIsICAgICAiKElJTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOylJIiwgICAgICAgICh2b2lkKiluQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZiB9LAoreyJyc25BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkIiwiKElJWkxhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcDspSSIsICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkIH0sCit7InJzbkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0iLCIoSUlaSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0gfSwKK3sicnNuQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZSIsICAgICAiKElJWkkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZSB9LAoreyJyc25BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QiLCIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QgfSwKK3sicnNuQWxsb2NhdGlvblN1YkRhdGExRCIsICAgICAgICAgICAiKElJSUlbSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGExRF9pIH0sCit7InJzbkFsbG9jYXRpb25TdWJEYXRhMUQiLCAgICAgICAgICAgIihJSUlJW1NJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMURfcyB9LAoreyJyc25BbGxvY2F0aW9uU3ViRGF0YTFEIiwgICAgICAgICAgICIoSUlJSVtCSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTFEX2IgfSwKK3sicnNuQWxsb2NhdGlvblN1YkRhdGExRCIsICAgICAgICAgICAiKElJSUlbRkkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGExRF9mIH0sCit7InJzbkFsbG9jYXRpb25TdWJFbGVtZW50RGF0YTFEIiwgICAgIihJSUlJW0JJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJFbGVtZW50RGF0YTFEIH0sCit7InJzbkFsbG9jYXRpb25TdWJEYXRhMkQiLCAgICAgICAgICAgIihJSUlJSUlbSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMkRfaSB9LAoreyJyc25BbGxvY2F0aW9uU3ViRGF0YTJEIiwgICAgICAgICAgICIoSUlJSUlJW0ZJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTJEX2YgfSwKK3sicnNuQWxsb2NhdGlvblJlYWQiLCAgICAgICAgICAgICAgICAiKElJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblJlYWRfaSB9LAoreyJyc25BbGxvY2F0aW9uUmVhZCIsICAgICAgICAgICAgICAgICIoSUlbRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uUmVhZF9mIH0sCit7InJzbkFsbG9jYXRpb25HZXRUeXBlIiwgICAgICAgICAgICAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25HZXRUeXBlfSwKK3sicnNuQWxsb2NhdGlvblJlc2l6ZTFEIiwgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblJlc2l6ZTFEIH0sCit7InJzbkFsbG9jYXRpb25SZXNpemUyRCIsICAgICAgICAgICAgIihJSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25SZXNpemUyRCB9LAogCi17Im5TY3JpcHRDQmVnaW4iLCAgICAgICAgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdENCZWdpbiB9LAoteyJuU2NyaXB0Q1NldFNjcmlwdCIsICAgICAgICAgICAgICAiKFtCSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDU2V0U2NyaXB0IH0sCi17Im5TY3JpcHRDQ3JlYXRlIiwgICAgICAgICAgICAgICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdENDcmVhdGUgfSwKLXsiblNjcmlwdENBZGREZWZpbmVJMzIiLCAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztJKVYiLCAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0Q0FkZERlZmluZUkzMiB9LAoteyJuU2NyaXB0Q0FkZERlZmluZUYiLCAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0YpViIsICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDQWRkRGVmaW5lRiB9LAoreyJyc25BZGFwdGVyMURCaW5kQWxsb2NhdGlvbiIsICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMURCaW5kQWxsb2NhdGlvbiB9LAoreyJyc25BZGFwdGVyMURTZXRDb25zdHJhaW50IiwgICAgICAgICIoSUlJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMURTZXRDb25zdHJhaW50IH0sCit7InJzbkFkYXB0ZXIxRERhdGEiLCAgICAgICAgICAgICAgICAgIihJSVtJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRERhdGFfaSB9LAoreyJyc25BZGFwdGVyMUREYXRhIiwgICAgICAgICAgICAgICAgICIoSUlbRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMUREYXRhX2YgfSwKK3sicnNuQWRhcHRlcjFEU3ViRGF0YSIsICAgICAgICAgICAgICAiKElJSUlbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEU3ViRGF0YV9pIH0sCit7InJzbkFkYXB0ZXIxRFN1YkRhdGEiLCAgICAgICAgICAgICAgIihJSUlJW0YpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRFN1YkRhdGFfZiB9LAoreyJyc25BZGFwdGVyMURDcmVhdGUiLCAgICAgICAgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMURDcmVhdGUgfSwKIAoteyJuUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbiIsICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyIsICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayIsICIoWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzayIsICIoWlpaWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyIsICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlciIsICAgICIoWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZSIsICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlIH0sCit7InJzbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uIiwgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uIH0sCit7InJzbkFkYXB0ZXIyRFNldENvbnN0cmFpbnQiLCAgICAgICAgIihJSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRFNldENvbnN0cmFpbnQgfSwKK3sicnNuQWRhcHRlcjJERGF0YSIsICAgICAgICAgICAgICAgICAiKElJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJERGF0YV9pIH0sCit7InJzbkFkYXB0ZXIyRERhdGEiLCAgICAgICAgICAgICAgICAgIihJSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRERhdGFfZiB9LAoreyJyc25BZGFwdGVyMkRTdWJEYXRhIiwgICAgICAgICAgICAgICIoSUlJSUlJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRTdWJEYXRhX2kgfSwKK3sicnNuQWRhcHRlcjJEU3ViRGF0YSIsICAgICAgICAgICAgICAiKElJSUlJSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJEU3ViRGF0YV9mIH0sCit7InJzbkFkYXB0ZXIyRENyZWF0ZSIsICAgICAgICAgICAgICAgIihJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRENyZWF0ZSB9LAogCi17Im5Qcm9ncmFtQmluZENvbnN0YW50cyIsICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1CaW5kQ29uc3RhbnRzIH0sCi17Im5Qcm9ncmFtQmluZFRleHR1cmUiLCAgICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1CaW5kVGV4dHVyZSB9LAoteyJuUHJvZ3JhbUJpbmRTYW1wbGVyIiwgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtQmluZFNhbXBsZXIgfSwKK3sicnNuU2NyaXB0QmluZEFsbG9jYXRpb24iLCAgICAgICAgICAiKElJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0QmluZEFsbG9jYXRpb24gfSwKK3sicnNuU2NyaXB0U2V0VGltZVpvbmUiLCAgICAgICAgICAgICAiKElJW0IpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0VGltZVpvbmUgfSwKK3sicnNuU2NyaXB0SW52b2tlIiwgICAgICAgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0SW52b2tlIH0sCit7InJzblNjcmlwdEludm9rZVYiLCAgICAgICAgICAgICAgICAgIihJSUlbQilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdEludm9rZVYgfSwKK3sicnNuU2NyaXB0U2V0VmFySSIsICAgICAgICAgICAgICAgICAiKElJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0VmFySSB9LAoreyJyc25TY3JpcHRTZXRWYXJGIiwgICAgICAgICAgICAgICAgICIoSUlJRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRWYXJGIH0sCit7InJzblNjcmlwdFNldFZhckQiLCAgICAgICAgICAgICAgICAgIihJSUlEKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFZhckQgfSwKK3sicnNuU2NyaXB0U2V0VmFyViIsICAgICAgICAgICAgICAgICAiKElJSVtCKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0VmFyViB9LAogCi17Im5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUiLCAgICAgICAgICIoW0kpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudENyZWF0ZSB9LAoteyJuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMiIsICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO1tJKUkiLCAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUyIH0sCit7InJzblNjcmlwdENCZWdpbiIsICAgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdENCZWdpbiB9LAoreyJyc25TY3JpcHRDU2V0U2NyaXB0IiwgICAgICAgICAgICAgICIoSVtCSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDU2V0U2NyaXB0IH0sCit7InJzblNjcmlwdENDcmVhdGUiLCAgICAgICAgICAgICAgICAgIihJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdENDcmVhdGUgfSwKIAoteyJuUHJvZ3JhbVJhc3RlckNyZWF0ZSIsICAgICAgICAgICAiKElJWlpaKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtUmFzdGVyQ3JlYXRlIH0sCi17Im5Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplIiwgICAgICIoSUYpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1SYXN0ZXJTZXRQb2ludFNpemUgfSwKLXsiblByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgiLCAgICAgIihJRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aCB9LAoreyJyc25Qcm9ncmFtU3RvcmVCZWdpbiIsICAgICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtU3RvcmVCZWdpbiB9LAoreyJyc25Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMiLCAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMgfSwKK3sicnNuUHJvZ3JhbVN0b3JlRGVwdGhNYXNrIiwgICAgICAgICAiKElaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVN0b3JlRGVwdGhNYXNrIH0sCit7InJzblByb2dyYW1TdG9yZUNvbG9yTWFzayIsICAgICAgICAgIihJWlpaWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZUNvbG9yTWFzayB9LAoreyJyc25Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMiLCAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMgfSwKK3sicnNuUHJvZ3JhbVN0b3JlRGl0aGVyIiwgICAgICAgICAgICAiKElaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVN0b3JlRGl0aGVyIH0sCit7InJzblByb2dyYW1TdG9yZUNyZWF0ZSIsICAgICAgICAgICAgIihJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZUNyZWF0ZSB9LAogCi17Im5Qcm9ncmFtVmVydGV4Q3JlYXRlIiwgICAgICAgICAgICIoWilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1WZXJ0ZXhDcmVhdGUgfSwKLXsiblByb2dyYW1WZXJ0ZXhDcmVhdGUyIiwgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztbSSlJIiwgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVZlcnRleENyZWF0ZTIgfSwKK3sicnNuUHJvZ3JhbUJpbmRDb25zdGFudHMiLCAgICAgICAgICAiKElJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUJpbmRDb25zdGFudHMgfSwKK3sicnNuUHJvZ3JhbUJpbmRUZXh0dXJlIiwgICAgICAgICAgICAiKElJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUJpbmRUZXh0dXJlIH0sCit7InJzblByb2dyYW1CaW5kU2FtcGxlciIsICAgICAgICAgICAgIihJSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1CaW5kU2FtcGxlciB9LAogCi17Im5MaWdodEJlZ2luIiwgICAgICAgICAgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkxpZ2h0QmVnaW4gfSwKLXsibkxpZ2h0U2V0SXNNb25vIiwgICAgICAgICAgICAgICAgIihaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTGlnaHRTZXRJc01vbm8gfSwKLXsibkxpZ2h0U2V0SXNMb2NhbCIsICAgICAgICAgICAgICAgIihaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTGlnaHRTZXRJc0xvY2FsIH0sCi17Im5MaWdodENyZWF0ZSIsICAgICAgICAgICAgICAgICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkxpZ2h0Q3JlYXRlIH0sCi17Im5MaWdodFNldENvbG9yIiwgICAgICAgICAgICAgICAgICIoSUZGRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkxpZ2h0U2V0Q29sb3IgfSwKLXsibkxpZ2h0U2V0UG9zaXRpb24iLCAgICAgICAgICAgICAgIihJRkZGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTGlnaHRTZXRQb3NpdGlvbiB9LAoreyJyc25Qcm9ncmFtRnJhZ21lbnRDcmVhdGUiLCAgICAgICAgIihJTGphdmEvbGFuZy9TdHJpbmc7W0kpSSIsICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUgfSwKIAoteyJuQ29udGV4dEJpbmRSb290U2NyaXB0IiwgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFJvb3RTY3JpcHQgfSwKLXsibkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUiLCIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSB9LAoteyJuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQiLCAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudCB9LAoteyJuQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4IiwgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXggfSwKLXsibkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlciIsICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyIH0sCit7InJzblByb2dyYW1SYXN0ZXJDcmVhdGUiLCAgICAgICAgICAgIihJWlpaKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1SYXN0ZXJDcmVhdGUgfSwKK3sicnNuUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aCIsICAgICAiKElJRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aCB9LAoreyJyc25Qcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUiLCAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUgfSwKIAoteyJuU2FtcGxlckJlZ2luIiwgICAgICAgICAgICAgICAgICAiKClWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TYW1wbGVyQmVnaW4gfSwKLXsiblNhbXBsZXJTZXQiLCAgICAgICAgICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2FtcGxlclNldCB9LAoteyJuU2FtcGxlckNyZWF0ZSIsICAgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TYW1wbGVyQ3JlYXRlIH0sCit7InJzblByb2dyYW1WZXJ0ZXhDcmVhdGUiLCAgICAgICAgICAiKElMamF2YS9sYW5nL1N0cmluZztbSSlJIiwgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1WZXJ0ZXhDcmVhdGUgfSwKIAoteyJuU2ltcGxlTWVzaENyZWF0ZSIsICAgICAgICAgICAgICAiKElJW0lJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TaW1wbGVNZXNoQ3JlYXRlIH0sCi17Im5TaW1wbGVNZXNoQmluZFZlcnRleCIsICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNpbXBsZU1lc2hCaW5kVmVydGV4IH0sCi17Im5TaW1wbGVNZXNoQmluZEluZGV4IiwgICAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNpbXBsZU1lc2hCaW5kSW5kZXggfSwKK3sicnNuQ29udGV4dEJpbmRSb290U2NyaXB0IiwgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRSb290U2NyaXB0IH0sCit7InJzbkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlIiwgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlIH0sCit7InJzbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50IiwgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50IH0sCit7InJzbkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleCIsICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleCB9LAoreyJyc25Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIiLCAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIgfSwKKworeyJyc25TYW1wbGVyQmVnaW4iLCAgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TYW1wbGVyQmVnaW4gfSwKK3sicnNuU2FtcGxlclNldCIsICAgICAgICAgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2FtcGxlclNldCB9LAoreyJyc25TYW1wbGVyU2V0MiIsICAgICAgICAgICAgICAgICAgICIoSUlGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TYW1wbGVyU2V0MiB9LAoreyJyc25TYW1wbGVyQ3JlYXRlIiwgICAgICAgICAgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TYW1wbGVyQ3JlYXRlIH0sCisKK3sicnNuTWVzaENyZWF0ZSIsICAgICAgICAgICAgICAgICAgICAiKElJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTWVzaENyZWF0ZSB9LAoreyJyc25NZXNoQmluZFZlcnRleCIsICAgICAgICAgICAgICAgICIoSUlJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5NZXNoQmluZFZlcnRleCB9LAoreyJyc25NZXNoQmluZEluZGV4IiwgICAgICAgICAgICAgICAgICIoSUlJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5NZXNoQmluZEluZGV4IH0sCisKK3sicnNuTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50IiwgICAgICAiKElJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50IH0sCit7InJzbk1lc2hHZXRJbmRleENvdW50IiwgICAgICAgICAgICAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk1lc2hHZXRJbmRleENvdW50IH0sCit7InJzbk1lc2hHZXRWZXJ0aWNlcyIsICAgICAgICAgICAgICAgIihJSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk1lc2hHZXRWZXJ0aWNlcyB9LAoreyJyc25NZXNoR2V0SW5kaWNlcyIsICAgICAgICAgICAgICAgICIoSUlbSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5NZXNoR2V0SW5kaWNlcyB9LAogCiB9OwogCkBAIC0xNTEwLDMgKzEzNzAsNCBAQAogYmFpbDoKICAgICByZXR1cm4gcmVzdWx0OwogfQorCmRpZmYgLS1naXQgYS9ncmFwaGljcy90ZXN0cy9ncmFwaGljc3Rlc3RzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcEZhY3RvcnlUZXN0LmphdmEgYi9ncmFwaGljcy90ZXN0cy9ncmFwaGljc3Rlc3RzL3NyYy9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcEZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk4MjBlZgotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL3Rlc3RzL2dyYXBoaWNzdGVzdHMvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeVRlc3QuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzOworCitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworCitwdWJsaWMgY2xhc3MgQml0bWFwRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvLyB0ZXN0cyB0aGF0IHdlIGNhbiBkZWNvZGUgYml0bWFwcyBmcm9tIE1lbW9yeUZpbGVzCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCaXRtYXBQYXJjZWxGaWxlRGVzY3JpcHRvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCaXRtYXAgYml0bWFwMSA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoCisgICAgICAgICAgICAgICAgbmV3IGludFtdIHsgQ29sb3IuQkxVRSB9LCAxLCAxLCBCaXRtYXAuQ29uZmlnLlJHQl81NjUpOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBiaXRtYXAxLmNvbXByZXNzKEJpdG1hcC5Db21wcmVzc0Zvcm1hdC5QTkcsIDEwMCwgb3V0KTsKKyAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkID0gUGFyY2VsRmlsZURlc2NyaXB0b3IuZnJvbURhdGEob3V0LnRvQnl0ZUFycmF5KCksIG51bGwpOworICAgICAgICBGaWxlRGVzY3JpcHRvciBmZCA9IHBmZC5nZXRGaWxlRGVzY3JpcHRvcigpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJHb3QgbnVsbCBGaWxlRGVzY3JpcHRvciIsIGZkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiR290IGludmFsaWQgRmlsZURlc2NyaXB0b3IiLCBmZC52YWxpZCgpKTsKKyAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlRmlsZURlc2NyaXB0b3IoZmQpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJCaXRtYXBGYWN0b3J5IHJldHVybmVkIG51bGwiLCBiaXRtYXApOworICAgICAgICBhc3NlcnRFcXVhbHMoIkJpdG1hcCB3aWR0aCIsIDEsIGJpdG1hcC5nZXRXaWR0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJCaXRtYXAgaGVpZ2h0IiwgMSwgYml0bWFwLmdldEhlaWdodCgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2ljdTRqL2phdmEvYW5kcm9pZC9pY3UvdGV4dC9BcmFiaWNTaGFwaW5nLmphdmEgYi9pY3U0ai9qYXZhL2FuZHJvaWQvaWN1L3RleHQvQXJhYmljU2hhcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZTIxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9pY3U0ai9qYXZhL2FuZHJvaWQvaWN1L3RleHQvQXJhYmljU2hhcGluZy5qYXZhCkBAIC0wLDAgKzEsMTk0NyBAQAorLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworLyoKKyAqIFBvcnRlZCB3aXRoIG1pbm9yIG1vZGlmaWNhdGlvbnMgZnJvbSBJQ1U0SiA0LjIncworICogY29tLmlibS5pY3UudGV4dC5BcmFiaWNTaGFwaW5nIGNsYXNzLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5pY3UudGV4dDsKKworCisvKioKKyAqIFNoYXBlIEFyYWJpYyB0ZXh0IG9uIGEgY2hhcmFjdGVyIGJhc2lzLgorICoKKyAqIDxwPkFyYWJpY1NoYXBpbmcgcGVyZm9ybXMgYmFzaWMgb3BlcmF0aW9ucyBmb3IgInNoYXBpbmciIEFyYWJpYyB0ZXh0LiBJdCBpcyBtb3N0CisgKiB1c2VmdWwgZm9yIHVzZSB3aXRoIGxlZ2FjeSBkYXRhIGZvcm1hdHMgYW5kIGxlZ2FjeSBkaXNwbGF5IHRlY2hub2xvZ3kKKyAqIChzaW1wbGUgdGVybWluYWxzKS4gQWxsIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBvbiBVbmljb2RlIGNoYXJhY3RlcnMuPC9wPgorICoKKyAqIDxwPlRleHQtYmFzZWQgc2hhcGluZyBtZWFucyB0aGF0IHNvbWUgY2hhcmFjdGVyIGNvZGUgcG9pbnRzIGluIHRoZSB0ZXh0IGFyZQorICogcmVwbGFjZWQgYnkgb3RoZXJzIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dC4gSXQgdHJhbnNmb3JtcyBvbmUga2luZCBvZiB0ZXh0CisgKiBpbnRvIGFub3RoZXIuIEluIGNvbXBhcmlzb24sIG1vZGVybiBkaXNwbGF5cyBmb3IgQXJhYmljIHRleHQgc2VsZWN0CisgKiBhcHByb3ByaWF0ZSwgY29udGV4dC1kZXBlbmRlbnQgZm9udCBnbHlwaHMgZm9yIGVhY2ggdGV4dCBlbGVtZW50LCB3aGljaCBtZWFucworICogdGhhdCB0aGV5IHRyYW5zZm9ybSB0ZXh0IGludG8gYSBnbHlwaCB2ZWN0b3IuPC9wPgorICoKKyAqIDxwPlRleHQgdHJhbnNmb3JtYXRpb25zIGFyZSBuZWNlc3Nhcnkgd2hlbiBtb2Rlcm4gZGlzcGxheSB0ZWNobm9sb2d5IGlzIG5vdAorICogYXZhaWxhYmxlIG9yIHdoZW4gdGV4dCBuZWVkcyB0byBiZSB0cmFuc2Zvcm1lZCB0byBvciBmcm9tIGxlZ2FjeSBmb3JtYXRzIHRoYXQKKyAqIHVzZSAic2hhcGVkIiBjaGFyYWN0ZXJzLiBTaW5jZSB0aGUgQXJhYmljIHNjcmlwdCBpcyBjdXJzaXZlLCBjb25uZWN0aW5nCisgKiBhZGphY2VudCBsZXR0ZXJzIHRvIGVhY2ggb3RoZXIsIGNvbXB1dGVycyBzZWxlY3QgaW1hZ2VzIGZvciBlYWNoIGxldHRlciBiYXNlZAorICogb24gdGhlIHN1cnJvdW5kaW5nIGxldHRlcnMuIFRoaXMgdXN1YWxseSByZXN1bHRzIGluIGZvdXIgaW1hZ2VzIHBlciBBcmFiaWMKKyAqIGxldHRlcjogaW5pdGlhbCwgbWlkZGxlLCBmaW5hbCwgYW5kIGlzb2xhdGVkIGZvcm1zLiBJbiBVbmljb2RlLCBvbiB0aGUgb3RoZXIKKyAqIGhhbmQsIGxldHRlcnMgYXJlIG5vcm1hbGx5IHN0b3JlZCBhYnN0cmFjdCwgYW5kIGEgZGlzcGxheSBzeXN0ZW0gaXMgZXhwZWN0ZWQKKyAqIHRvIHNlbGVjdCB0aGUgbmVjZXNzYXJ5IGdseXBocy4gKFRoaXMgbWFrZXMgc2VhcmNoaW5nIGFuZCBvdGhlciB0ZXh0CisgKiBwcm9jZXNzaW5nIGVhc2llciBiZWNhdXNlIHRoZSBzYW1lIGxldHRlciBoYXMgb25seSBvbmUgY29kZS4pIEl0IGlzIHBvc3NpYmxlCisgKiB0byBtaW1pYyB0aGlzIHdpdGggdGV4dCB0cmFuc2Zvcm1hdGlvbnMgYmVjYXVzZSB0aGVyZSBhcmUgY2hhcmFjdGVycyBpbgorICogVW5pY29kZSB0aGF0IGFyZSByZW5kZXJlZCBhcyBsZXR0ZXJzIHdpdGggYSBzcGVjaWZpYyBzaGFwZQorICogKG9yIGN1cnNpdmUgY29ubmVjdGl2aXR5KS4gVGhleSB3ZXJlIGluY2x1ZGVkIGZvciBpbnRlcm9wZXJhYmlsaXR5IHdpdGgKKyAqIGxlZ2FjeSBzeXN0ZW1zIGFuZCBjb2RlcGFnZXMsIGFuZCBmb3IgdW5zb3BoaXN0aWNhdGVkIGRpc3BsYXkgc3lzdGVtcy48L3A+CisgKgorICogPHA+QSBzZWNvbmQga2luZCBvZiB0ZXh0IHRyYW5zZm9ybWF0aW9ucyBpcyBzdXBwb3J0ZWQgZm9yIEFyYWJpYyBkaWdpdHM6CisgKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSBjb2RlcGFnZXMgdGhhdCBvbmx5IGluY2x1ZGUgRXVyb3BlYW4gZGlnaXRzLAorICogaXQgaXMgcG9zc2libGUgdG8gcmVwbGFjZSBvbmUgc2V0IG9mIGRpZ2l0cyBieSBhbm90aGVyLCBjaGFuZ2luZyB0aGUKKyAqIGNoYXJhY3RlciBjb2RlIHBvaW50cy4gVGhlc2Ugb3BlcmF0aW9ucyBjYW4gYmUgcGVyZm9ybWVkIGZvciBlaXRoZXIKKyAqIEFyYWJpYy1JbmRpYyBEaWdpdHMgKFUrMDY2MC4uLlUrMDY2OSkgb3IgRWFzdGVybiAoRXh0ZW5kZWQpIEFyYWJpYy1JbmRpYworICogZGlnaXRzIChVKzA2ZjAuLi5VKzA2ZjkpLjwvcD4KKyAqCisgKiA8cD5Tb21lIHJlcGxhY2VtZW50cyBtYXkgcmVzdWx0IGluIG1vcmUgb3IgZmV3ZXIgY2hhcmFjdGVycyAoY29kZSBwb2ludHMpLgorICogQnkgZGVmYXVsdCwgdGhpcyBtZWFucyB0aGF0IHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgbWF5IHJlY2VpdmUgdGV4dCB3aXRoIGEKKyAqIGxlbmd0aCBkaWZmZXJlbnQgZnJvbSB0aGUgc291cmNlIGxlbmd0aC4gU29tZSBsZWdhY3kgc3lzdGVtcyByZWx5IG9uIHRoZQorICogbGVuZ3RoIG9mIHRoZSB0ZXh0IHRvIGJlIGNvbnN0YW50LiBUaGV5IGV4cGVjdCBleHRyYSBzcGFjZXMgdG8gYmUgYWRkZWQKKyAqIG9yIGNvbnN1bWVkIGVpdGhlciBuZXh0IHRvIHRoZSBhZmZlY3RlZCBjaGFyYWN0ZXIgb3IgYXQgdGhlIGVuZCBvZiB0aGUKKyAqIHRleHQuPC9wPgorICogQHN0YWJsZSBJQ1UgMi4wCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEFyYWJpY1NoYXBpbmcgeworICAgIHByaXZhdGUgZmluYWwgaW50IG9wdGlvbnM7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzTG9naWNhbDsgLy8gY29udmVuaWVuY2UKKyAgICBwcml2YXRlIGJvb2xlYW4gc3BhY2VzUmVsYXRpdmVUb1RleHRCZWdpbkVuZDsKKyAgICBwcml2YXRlIGNoYXIgdGFpbENoYXI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFyYWJpY1NoYXBpbmcgU0hBUEVSID0gbmV3IEFyYWJpY1NoYXBpbmcoCisgICAgICAgICAgICBBcmFiaWNTaGFwaW5nLlRFWFRfRElSRUNUSU9OX0xPR0lDQUwgfAorICAgICAgICAgICAgQXJhYmljU2hhcGluZy5MRU5HVEhfRklYRURfU1BBQ0VTX05FQVIgfAorICAgICAgICAgICAgQXJhYmljU2hhcGluZy5MRVRURVJTX1NIQVBFIHwKKyAgICAgICAgICAgIEFyYWJpY1NoYXBpbmcuRElHSVRTX05PT1ApOworCisgICAgLyoqCisgICAgICogQ29udmVydCBhIHJhbmdlIG9mIHRleHQgaW4gdGhlIHNvdXJjZSBhcnJheSwgcHV0dGluZyB0aGUgcmVzdWx0CisgICAgICogaW50byBhIHJhbmdlIG9mIHRleHQgaW4gdGhlIGRlc3RpbmF0aW9uIGFycmF5LCBhbmQgcmV0dXJuIHRoZSBudW1iZXIKKyAgICAgKiBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGlucHV0IHRleHQKKyAgICAgKiBAcGFyYW0gc291cmNlU3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZSBvZiB0ZXh0IHRvIGNvbnZlcnQKKyAgICAgKiBAcGFyYW0gc291cmNlTGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJhbmdlIG9mIHRleHQgdG8gY29udmVydAorICAgICAqIEBwYXJhbSBkZXN0IFRoZSBkZXN0aW5hdGlvbiBhcnJheSB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgcmVzdWx0LgorICAgICAqICAgSXQgbWF5IGJlIDxjb2RlPk5VTEw8L2NvZGU+IG9ubHkgaWYgIDxjb2RlPmRlc3RTaXplPC9jb2RlPiBpcyAwLgorICAgICAqIEBwYXJhbSBkZXN0U3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIHRvIHVzZS4KKyAgICAgKiBAcGFyYW0gZGVzdFNpemUgVGhlIHNpemUgKGNhcGFjaXR5KSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLgorICAgICAqICAgSWYgPGNvZGU+ZGVzdFNpemU8L2NvZGU+IGlzIDAsIHRoZW4gbm8gb3V0cHV0IGlzIHByb2R1Y2VkLAorICAgICAqICAgYnV0IHRoZSBuZWNlc3NhcnkgYnVmZmVyIHNpemUgaXMgcmV0dXJuZWQgKCJwcmVmbGlnaHRpbmciKS4gIFRoaXMKKyAgICAgKiAgIGRvZXMgbm90IHZhbGlkYXRlIHRoZSB0ZXh0IGFnYWluc3QgdGhlIG9wdGlvbnMsIGZvciBleGFtcGxlLAorICAgICAqICAgaWYgbGV0dGVycyBhcmUgYmVpbmcgdW5zaGFwZWQsIGFuZCBzcGFjZXMgYXJlIGJlaW5nIGNvbnN1bWVkCisgICAgICogICBmb2xsb3dpbmcgbGFtYWxlZiwgdGhpcyB3aWxsIG5vdCBkZXRlY3QgYSBsYW1hbGVmIHdpdGhvdXQgYQorICAgICAqICAgY29ycmVzcG9uZGluZyBzcGFjZS4gIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIHdoZW4gdGhlIGFjdHVhbAorICAgICAqICAgY29udmVyc2lvbiBpcyBhdHRlbXB0ZWQuCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGNoYXJzIHdyaXR0ZW4gdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAgICAgKiAgIElmIGFuIGVycm9yIG9jY3VycywgdGhlbiBubyBvdXRwdXQgd2FzIHdyaXR0ZW4sIG9yIGl0IG1heSBiZQorICAgICAqICAgaW5jb21wbGV0ZS4KKyAgICAgKiBAdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24gaWYgdGhlIHRleHQgY2Fubm90IGJlIGNvbnZlcnRlZCBhY2NvcmRpbmcgdG8gdGhlIG9wdGlvbnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIGludCBzaGFwZShjaGFyW10gc291cmNlLCBpbnQgc291cmNlU3RhcnQsIGludCBzb3VyY2VMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICBjaGFyW10gZGVzdCwgaW50IGRlc3RTdGFydCwgaW50IGRlc3RTaXplKSB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic291cmNlIGNhbiBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChzb3VyY2VTdGFydCA8IDAgfHwgc291cmNlTGVuZ3RoIDwgMCB8fCBzb3VyY2VTdGFydCArIHNvdXJjZUxlbmd0aCA+IHNvdXJjZS5sZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImJhZCBzb3VyY2Ugc3RhcnQgKCIgKyBzb3VyY2VTdGFydCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIG9yIGxlbmd0aCAoIiArIHNvdXJjZUxlbmd0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIGZvciBidWZmZXIgb2YgbGVuZ3RoICIgKyBzb3VyY2UubGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzdCA9PSBudWxsICYmIGRlc3RTaXplICE9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm51bGwgZGVzdCByZXF1aXJlcyBkZXN0U2l6ZSA9PSAwIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkZXN0U2l6ZSAhPSAwKSAmJgorICAgICAgICAgICAgKGRlc3RTdGFydCA8IDAgfHwgZGVzdFNpemUgPCAwIHx8IGRlc3RTdGFydCArIGRlc3RTaXplID4gZGVzdC5sZW5ndGgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJiYWQgZGVzdCBzdGFydCAoIiArIGRlc3RTdGFydCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIG9yIHNpemUgKCIgKyBkZXN0U2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIGZvciBidWZmZXIgb2YgbGVuZ3RoICIgKyBkZXN0Lmxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgLyogVmFsaWRhdGUgaW5wdXQgb3B0aW9ucyAqLworICAgICAgICBpZiAoICgob3B0aW9ucyZUQVNIS0VFTF9NQVNLKSA+IDApICYmCisgICAgICAgICAgICAgISgoKG9wdGlvbnMgJiBUQVNIS0VFTF9NQVNLKT09VEFTSEtFRUxfQkVHSU4pICB8fAorICAgICAgICAgICAgICAgKChvcHRpb25zICYgVEFTSEtFRUxfTUFTSyk9PVRBU0hLRUVMX0VORCApICAgfHwKKyAgICAgICAgICAgICAgICgob3B0aW9ucyAmIFRBU0hLRUVMX01BU0spPT1UQVNIS0VFTF9SRVNJWkUgKXx8CisgICAgICAgICAgICAgICAoKG9wdGlvbnMgJiBUQVNIS0VFTF9NQVNLKT09VEFTSEtFRUxfUkVQTEFDRV9CWV9UQVRXRUVMKSkgKXsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIldyb25nIFRhc2hrZWVsIGFyZ3VtZW50Iik7CisgICAgICAgIH0KKworICAgICAgIC8vL0NMT1ZFUjpPRkYKKyAgICAgICAvL0FjY29yZGluZyB0byBTdGV2ZW4gTG9vbWlzLCB0aGUgY29kZSBpcyB1bnJlYWNoYWJsZSB3aGVuIHlvdSBPUiBhbGwgdGhlIGNvbnN0YW50cyB3aXRoaW4gdGhlIGlmIHN0YXRlbWVudHMKKyAgICAgICBpZigoKG9wdGlvbnMmTEFNQUxFRl9NQVNLKSA+IDApJiYKKyAgICAgICAgICAgICAgISgoKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spPT1MQU1BTEVGX0JFR0lOKSAgfHwKKyAgICAgICAgICAgICAgICAoKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spPT1MQU1BTEVGX0VORCApICAgfHwKKyAgICAgICAgICAgICAgICAoKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spPT1MQU1BTEVGX1JFU0laRSApfHwKKyAgICAgICAgICAgICAgICAgKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKT09TEFNQUxFRl9BVVRPKSAgfHwKKyAgICAgICAgICAgICAgICAgKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKT09TEFNQUxFRl9ORUFSKSkpeworICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJXcm9uZyBMYW0gQWxlZiBhcmd1bWVudCIpOworICAgICAgIH0KKyAgICAgICAvLy9DTE9WRVI6T04KKworICAgICAgIC8qIFZhbGlkYXRlIFRhc2hrZWVsIChUYXNoa2VlbCByZXBsYWNlbWVudCBvcHRpb25zIHNob3VsZCBiZSBlbmFibGVkIGluIHNoYXBpbmcgbW9kZSBvbmx5KSovCisgICAgICAgaWYoKChvcHRpb25zJlRBU0hLRUVMX01BU0spID4gMCkgJiYgKG9wdGlvbnMmTEVUVEVSU19NQVNLKSA9PSBMRVRURVJTX1VOU0hBUEUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRhc2hrZWVsIHJlcGxhY2VtZW50IHNob3VsZCBub3QgYmUgZW5hYmxlZCBpbiBkZXNoYXBpbmcgbW9kZSAiKTsKKyAgICAgICB9CisgICAgICAgcmV0dXJuIGludGVybmFsU2hhcGUoc291cmNlLCBzb3VyY2VTdGFydCwgc291cmNlTGVuZ3RoLCBkZXN0LCBkZXN0U3RhcnQsIGRlc3RTaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgcmFuZ2Ugb2YgdGV4dCBpbiBwbGFjZS4gIFRoaXMgbWF5IG9ubHkgYmUgdXNlZCBpZiB0aGUgTGVuZ3RoIG9wdGlvbgorICAgICAqIGRvZXMgbm90IGdyb3cgb3Igc2hyaW5rIHRoZSB0ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZSBBbiBhcnJheSBjb250YWluaW5nIHRoZSBpbnB1dCB0ZXh0CisgICAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2Ugb2YgdGV4dCB0byBjb252ZXJ0CisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByYW5nZSBvZiB0ZXh0IHRvIGNvbnZlcnQKKyAgICAgKiBAdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24gaWYgdGhlIHRleHQgY2Fubm90IGJlIGNvbnZlcnRlZCBhY2NvcmRpbmcgdG8gdGhlIG9wdGlvbnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2hhcGUoY2hhcltdIHNvdXJjZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICgob3B0aW9ucyAmIExBTUFMRUZfTUFTSykgPT0gTEFNQUxFRl9SRVNJWkUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJDYW5ub3Qgc2hhcGUgaW4gcGxhY2Ugd2l0aCBsZW5ndGggb3B0aW9uIHJlc2l6ZS4iKTsKKyAgICAgICAgfQorICAgICAgICBzaGFwZShzb3VyY2UsIHN0YXJ0LCBsZW5ndGgsIHNvdXJjZSwgc3RhcnQsIGxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBhIHN0cmluZywgcmV0dXJuaW5nIHRoZSBuZXcgc3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHRleHQgdGhlIHN0cmluZyB0byBjb252ZXJ0CisgICAgICogQHJldHVybiB0aGUgY29udmVydGVkIHN0cmluZworICAgICAqIEB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGNhbm5vdCBiZSBjb252ZXJ0ZWQgYWNjb3JkaW5nIHRvIHRoZSBvcHRpb25zLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgc2hhcGUoU3RyaW5nIHRleHQpIHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgY2hhcltdIHNyYyA9IHRleHQudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgY2hhcltdIGRlc3QgPSBzcmM7CisgICAgICAgIGlmICgoKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spID09IExBTUFMRUZfUkVTSVpFKSAmJgorICAgICAgICAgICAgKChvcHRpb25zICYgTEVUVEVSU19NQVNLKSA9PSBMRVRURVJTX1VOU0hBUEUpKSB7CisKKyAgICAgICAgICAgIGRlc3QgPSBuZXcgY2hhcltzcmMubGVuZ3RoICogMl07IC8vIG1heAorICAgICAgICB9CisgICAgICAgIGludCBsZW4gPSBzaGFwZShzcmMsIDAsIHNyYy5sZW5ndGgsIGRlc3QsIDAsIGRlc3QubGVuZ3RoKTsKKworICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhkZXN0LCAwLCBsZW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBBcmFiaWNTaGFwaW5nIHVzaW5nIHRoZSBvcHRpb25zIGZsYWdzLgorICAgICAqIFRoZSBmbGFncyBhcmUgYXMgZm9sbG93czo8YnI+CisgICAgICogJ0xFTkdUSCcgZmxhZ3MgY29udHJvbCB3aGV0aGVyIHRoZSB0ZXh0IGNhbiBjaGFuZ2Ugc2l6ZSwgYW5kIGlmIG5vdCwKKyAgICAgKiBob3cgdG8gbWFpbnRhaW4gdGhlIHNpemUgb2YgdGhlIHRleHQgd2hlbiBMYW1BbGVmIGxpZ2F0dXJlcyBhcmUKKyAgICAgKiBmb3JtZWQgb3IgYnJva2VuLjxicj4KKyAgICAgKiAnVEVYVF9ESVJFQ1RJT04nIGZsYWdzIGNvbnRyb2wgd2hldGhlciB0aGUgdGV4dCBpcyByZWFkIGFuZCB3cml0dGVuCisgICAgICogaW4gdmlzdWFsIG9yZGVyIG9yIGluIGxvZ2ljYWwgb3JkZXIuPGJyPgorICAgICAqICdMRVRURVJTX1NIQVBFJyBmbGFncyBjb250cm9sIHdoZXRoZXIgY29udmVyc2lvbiBpcyB0byBvciBmcm9tCisgICAgICogcHJlc2VudGF0aW9uIGZvcm1zLjxicj4KKyAgICAgKiAnRElHSVRTJyBmbGFncyBjb250cm9sIHdoZXRoZXIgZGlnaXRzIGFyZSBzaGFwZWQsIGFuZCB3aGV0aGVyIGZyb20KKyAgICAgKiBFdXJvcGVhbiB0byBBcmFiaWMtSW5kaWMgb3IgdmljZS12ZXJzYS48YnI+CisgICAgICogJ0RJR0lUX1RZUEUnIGZsYWdzIGNvbnRyb2wgd2hldGhlciBzdGFuZGFyZCBvciBleHRlbmRlZCBBcmFiaWMtSW5kaWMKKyAgICAgKiBkaWdpdHMgYXJlIHVzZWQgd2hlbiBwZXJmb3JtaW5nIGRpZ2l0IGNvbnZlcnNpb24uCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIEFyYWJpY1NoYXBpbmcoaW50IG9wdGlvbnMpIHsKKyAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKyAgICAgICAgaWYgKChvcHRpb25zICYgRElHSVRTX01BU0spID4gMHg4MCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYmFkIERJR0lUUyBvcHRpb25zIik7CisgICAgICAgIH0KKworICAgICAgICBpc0xvZ2ljYWwgPSAoIChvcHRpb25zICYgVEVYVF9ESVJFQ1RJT05fTUFTSykgPT0gVEVYVF9ESVJFQ1RJT05fTE9HSUNBTCApOworICAgICAgICAvKiBWYWxpZGF0ZSBvcHRpb25zICovCisgICAgICAgIHNwYWNlc1JlbGF0aXZlVG9UZXh0QmVnaW5FbmQgPSAoIChvcHRpb25zICYgU1BBQ0VTX1JFTEFUSVZFX1RPX1RFWFRfTUFTSykgPT0gU1BBQ0VTX1JFTEFUSVZFX1RPX1RFWFRfQkVHSU5fRU5EICk7CisgICAgICAgIGlmICggKG9wdGlvbnMmU0hBUEVfVEFJTF9UWVBFX01BU0spID09IFNIQVBFX1RBSUxfTkVXX1VOSUNPREUpeworICAgICAgICAgICAgdGFpbENoYXIgPSBORVdfVEFJTF9DSEFSOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGFpbENoYXIgPSBPTERfVEFJTF9DSEFSOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU2VlbiBUYWlsIG9wdGlvbnMgKi8KKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBTaGFwaW5nIG1vZGU6IFRoZSBTRUVOIGZhbWlseSBjaGFyYWN0ZXIgd2lsbCBleHBhbmQgaW50byB0d28gY2hhcmFjdGVycyB1c2luZyBzcGFjZSBuZWFyCisgICAgICogICAgICAgICAgICAgICB0aGUgU0VFTiBmYW1pbHkgY2hhcmFjdGVyKGkuZS4gdGhlIHNwYWNlIGFmdGVyIHRoZSBjaGFyYWN0ZXIpLgorICAgICAqICAgICAgICAgICAgICAgaWYgdGhlcmUgYXJlIG5vIHNwYWNlcyBmb3VuZCwgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB3aWxsIGJlIHRocm93bgorICAgICAqCisgICAgICogRGUtc2hhcGluZyBtb2RlOiBBbnkgU2VlbiBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkgVGFpbCBjaGFyYWN0ZXIgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgcmVwbGFjZWQgYnkgb25lIGNlbGwgU2VlbiBhbmQgYSBzcGFjZSB3aWxsIHJlcGxhY2UgdGhlIFRhaWwuCisgICAgICogQWZmZWN0czogU2VlbiBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VFTl9UV09DRUxMX05FQVIgPSAweDIwMDAwMDsKKworICAgIC8qKiBCaXQgbWFzayBmb3IgU2VlbiBtZW1vcnkgb3B0aW9ucy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUVOX01BU0sgPSAweDcwMDAwMDsKKworICAgIC8qIFllaEhhbXphIG9wdGlvbnMgKi8KKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBTaGFwaW5nIG1vZGU6IFRoZSBZRUhIQU1aQSBjaGFyYWN0ZXIgd2lsbCBleHBhbmQgaW50byB0d28gY2hhcmFjdGVycyB1c2luZyBzcGFjZSBuZWFyIGl0CisgICAgICogICAgICAgICAgICAgIChpLmUuIHRoZSBzcGFjZSBhZnRlciB0aGUgY2hhcmFjdGVyKQorICAgICAqICAgICAgICAgICAgICAgaWYgdGhlcmUgYXJlIG5vIHNwYWNlcyBmb3VuZCwgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB3aWxsIGJlIHRocm93bgorICAgICAqCisgICAgICogRGUtc2hhcGluZyBtb2RlOiBBbnkgWWVoIChmaW5hbCBvciBpc29sYXRlZCkgY2hhcmFjdGVyIGZvbGxvd2VkIGJ5IEhhbXphIGNoYXJhY3RlciB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgICByZXBsYWNlZCBieSBvbmUgY2VsbCBZZWhIYW16YSBhbmQgc3BhY2Ugd2lsbCByZXBsYWNlIHRoZSBIYW16YS4KKyAgICAgKiBBZmZlY3RzOiBZZWhIYW16YSBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWUVISEFNWkFfVFdPQ0VMTF9ORUFSICA9IDB4MTAwMDAwMDsKKworCisgICAgLyoqIEJpdCBtYXNrIGZvciBZZWhIYW16YSBtZW1vcnkgb3B0aW9ucy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZRUhIQU1aQV9NQVNLID0gMHgzODAwMDAwOworCisgICAgLyogTmV3IFRhc2hrZWVsIG9wdGlvbnMgKi8KKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBTaGFwaW5nIG1vZGU6IFRhc2hrZWVsIGNoYXJhY3RlcnMgd2lsbCBiZSByZXBsYWNlZCBieSBzcGFjZXMuCisgICAgICogICAgICAgICAgICAgICBTcGFjZXMgd2lsbCBiZSBwbGFjZWQgYXQgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIKKyAgICAgKgorICAgICAqIERlLXNoYXBpbmcgbW9kZTogTi9BCisgICAgICogQWZmZWN0czogVGFzaGtlZWwgb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBU0hLRUVMX0JFR0lOID0gMHg0MDAwMDsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIFNoYXBpbmcgbW9kZTogVGFzaGtlZWwgY2hhcmFjdGVycyB3aWxsIGJlIHJlcGxhY2VkIGJ5IHNwYWNlcy4KKyAgICAgKiAgICAgICAgICAgICAgIFNwYWNlcyB3aWxsIGJlIHBsYWNlZCBhdCBlbmQgb2YgdGhlIGJ1ZmZlcgorICAgICAqCisgICAgICogRGUtc2hhcGluZyBtb2RlOiBOL0EKKyAgICAgKiBBZmZlY3RzOiBUYXNoa2VlbCBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFTSEtFRUxfRU5EID0gMHg2MDAwMDsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IGFsbG93IHRoZSByZXN1bHQgdG8gaGF2ZSBhIGRpZmZlcmVudCBsZW5ndGggdGhhbiB0aGUgc291cmNlLgorICAgICAqIFNoYXBpbmcgbW9kZTogVGFzaGtlZWwgY2hhcmFjdGVycyB3aWxsIGJlIHJlbW92ZWQsIGJ1ZmZlciBsZW5ndGggd2lsbCBzaHJpbmsuCisgICAgICogRGUtc2hhcGluZyBtb2RlOiBOL0EKKyAgICAgKgorICAgICAqIEFmZmVjdHM6IFRhc2hrZWVsIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQVNIS0VFTF9SRVNJWkUgPSAweDgwMDAwOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogU2hhcGluZyBtb2RlOiBUYXNoa2VlbCBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVwbGFjZWQgYnkgVGF0d2VlbCBpZiBpdCBpcyBjb25uZWN0ZWQgdG8gYWRqYWNlbnQKKyAgICAgKiAgICAgICAgICAgICAgIGNoYXJhY3RlcnMgKGkuZS4gc2hhcGVkIG9uIFRhdHdlZWwpIG9yIHJlcGxhY2VkIGJ5IHNwYWNlIGlmIGl0IGlzIG5vdCBjb25uZWN0ZWQuCisgICAgICoKKyAgICAgKiBEZS1zaGFwaW5nIG1vZGU6IE4vQQorICAgICAqIEFmZmVjdHM6IFllaEhhbXphIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQVNIS0VFTF9SRVBMQUNFX0JZX1RBVFdFRUwgPSAweEMwMDAwOworCisgICAgLyoqIEJpdCBtYXNrIGZvciBUYXNoa2VlbCByZXBsYWNlbWVudCB3aXRoIFNwYWNlIG9yIFRhdHdlZWwgbWVtb3J5IG9wdGlvbnMuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFTSEtFRUxfTUFTSyAgPSAweEUwMDAwOworCisgICAgLyogU3BhY2UgbG9jYXRpb24gQ29udHJvbCBvcHRpb25zICovCisgICAgLyoqCisgICAgICogVGhpcyBvcHRpb24gZWZmZWN0cyB0aGUgbWVhbmluZyBvZiBCRUdJTiBhbmQgRU5EIG9wdGlvbnMuIGlmIHRoaXMgb3B0aW9uIGlzIG5vdCB1c2VkIHRoZSBkZWZhdWx0CisgICAgICogZm9yIEJFR0lOIGFuZCBFTkQgd2lsbCBiZSBhcyBmb2xsb3dpbmc6CisgICAgICogVGhlIERlZmF1bHQgKGZvciBib3RoIFZpc3VhbCBMVFIsIFZpc3VhbCBSVEwgYW5kIExvZ2ljYWwgVGV4dCkKKyAgICAgKiAgICAgICAgICAgMS4gQkVHSU4gYWx3YXlzIHJlZmVycyB0byB0aGUgc3RhcnQgYWRkcmVzcyBvZiBwaHlzaWNhbCBtZW1vcnkuCisgICAgICogICAgICAgICAgIDIuIEVORCBhbHdheXMgcmVmZXJzIHRvIHRoZSBlbmQgYWRkcmVzcyBvZiBwaHlzaWNhbCBtZW1vcnkuCisgICAgICoKKyAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyB1c2VkIGl0IHdpbGwgc3dhcCB0aGUgbWVhbmluZyBvZiBCRUdJTiBhbmQgRU5EIG9ubHkgZm9yIFZpc3VhbCBMVFIgdGV4dC4KKyAgICAgKgorICAgICAqIFRoZSBhZmZlY3Qgb24gQkVHSU4gYW5kIEVORCBNZW1vcnkgT3B0aW9ucyB3aWxsIGJlIGFzIGZvbGxvd2luZzoKKyAgICAgKiAgICBBLiBCRUdJTiBGb3IgVmlzdWFsIExUUiB0ZXh0OiBUaGlzIHdpbGwgYmUgdGhlIGJlZ2lubmluZyAocmlnaHQgc2lkZSkgb2YgdGhlIHZpc3VhbCB0ZXh0CisgICAgICogICAgICAgKGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzIGVuZCwgc2FtZSBhcyBFTkQgaW4gZGVmYXVsdCBiZWhhdmlvcikKKyAgICAgKiAgICBCLiBCRUdJTiBGb3IgTG9naWNhbCB0ZXh0OiBTYW1lIGFzIEJFR0lOIGluIGRlZmF1bHQgYmVoYXZpb3IuCisgICAgICogICAgQy4gRU5EIEZvciBWaXN1YWwgTFRSIHRleHQ6IFRoaXMgd2lsbCBiZSB0aGUgZW5kIChsZWZ0IHNpZGUpIG9mIHRoZSB2aXN1YWwgdGV4dC4gKGNvcnJlc3BvbmRpbmcgdG8KKyAgICAgKiAgICAgIHRoZSBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzcyBiZWdpbm5pbmcsIHNhbWUgYXMgQkVHSU4gaW4gZGVmYXVsdCBiZWhhdmlvcikKKyAgICAgKiAgICBELiBFTkQgRm9yIExvZ2ljYWwgdGV4dDogU2FtZSBhcyBFTkQgaW4gZGVmYXVsdCBiZWhhdmlvci4KKyAgICAgKiBBZmZlY3RzOiBBbGwgTGFtQWxlZiBCRUdJTiwgRU5EIGFuZCBBVVRPIG9wdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1BBQ0VTX1JFTEFUSVZFX1RPX1RFWFRfQkVHSU5fRU5EID0gMHg0MDAwMDAwOworCisgICAgLyoqIEJpdCBtYXNrIGZvciBzd2FwcGluZyBCRUdJTiBhbmQgRU5EIGZvciBWaXN1YWwgTFRSIHRleHQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUEFDRVNfUkVMQVRJVkVfVE9fVEVYVF9NQVNLID0gMHg0MDAwMDAwOworCisgICAgLyoqCisgICAgICogSWYgdGhpcyBvcHRpb24gaXMgdXNlZCwgc2hhcGluZyB3aWxsIHVzZSB0aGUgbmV3IFVuaWNvZGUgY29kZSBwb2ludCBmb3IgVEFJTCAoaS5lLiAweEZFNzMpLgorICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQgKERlZmF1bHQpLCBvbGQgdW5vZmZpY2lhbCBVbmljb2RlIFRBSUwgY29kZSBwb2ludCBpcyB1c2VkIChpLmUuIDB4MjAwQikKKyAgICAgKiBEZS1zaGFwaW5nIHdpbGwgbm90IHVzZSB0aGlzIG9wdGlvbiBhcyBpdCB3aWxsIGFsd2F5cyBzZWFyY2ggZm9yIGJvdGggdGhlIG5ldyBVbmljb2RlIGNvZGUgcG9pbnQgZm9yIHRoZQorICAgICAqIFRBSUwgKGkuZS4gMHhGRTczKSBvciB0aGUgb2xkIHVub2ZmaWNpYWwgVW5pY29kZSBUQUlMIGNvZGUgcG9pbnQgKGkuZS4gMHgyMDBCKSBhbmQgZGUtc2hhcGUgdGhlCisgICAgICogU2Vlbi1GYW1pbHkgbGV0dGVyIGFjY29yZGluZ2x5LgorICAgICAqCisgICAgICogU2hhcGluZyBNb2RlOiBPbmx5IHNoYXBpbmcuCisgICAgICogRGUtc2hhcGluZyBNb2RlOiBOL0EuCisgICAgICogQWZmZWN0czogQWxsIFNlZW4gb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIQVBFX1RBSUxfTkVXX1VOSUNPREUgPSAweDgwMDAwMDA7CisKKyAgICAvKiogQml0IG1hc2sgZm9yIG5ldyBVbmljb2RlIFRhaWwgb3B0aW9uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hBUEVfVEFJTF9UWVBFX01BU0sgPSAweDgwMDAwMDA7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiBhbGxvdyB0aGUgcmVzdWx0IHRvIGhhdmUgYSBkaWZmZXJlbnQgbGVuZ3RoIHRoYW4gdGhlIHNvdXJjZS4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRU5HVEhfR1JPV19TSFJJTksgPSAwOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogYWxsb3cgdGhlIHJlc3VsdCB0byBoYXZlIGEgZGlmZmVyZW50IGxlbmd0aCB0aGFuIHRoZSBzb3VyY2UuCisgICAgICogQWZmZWN0czogTGFtQWxlZiBvcHRpb25zCisgICAgICogVGhpcyBvcHRpb24gaXMgYW4gYWxpYXMgdG8gTEVOR1RIX0dST1dfU0hSSU5LCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFNQUxFRl9SRVNJWkUgICA9IDA7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBJZiBtb3JlIHJvb20gaXMgbmVjZXNzYXJ5LCB0aGVuIHRyeSB0byBjb25zdW1lIHNwYWNlcyBuZXh0IHRvIG1vZGlmaWVkIGNoYXJhY3RlcnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVOR1RIX0ZJWEVEX1NQQUNFU19ORUFSID0gMTsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIElmIG1vcmUgcm9vbSBpcyBuZWNlc3NhcnksIHRoZW4gdHJ5IHRvIGNvbnN1bWUgc3BhY2VzIG5leHQgdG8gbW9kaWZpZWQgY2hhcmFjdGVycy4KKyAgICAgKiBBZmZlY3RzOiBMYW1BbGVmIG9wdGlvbnMKKyAgICAgKiBUaGlzIG9wdGlvbiBpcyBhbiBhbGlhcyB0byBMRU5HVEhfRklYRURfU1BBQ0VTX05FQVIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQU1BTEVGX05FQVIgPSAxIDsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIElmIG1vcmUgcm9vbSBpcyBuZWNlc3NhcnksIHRoZW4gdHJ5IHRvIGNvbnN1bWUgc3BhY2VzIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVOR1RIX0ZJWEVEX1NQQUNFU19BVF9FTkQgPSAyOworCisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBJZiBtb3JlIHJvb20gaXMgbmVjZXNzYXJ5LCB0aGVuIHRyeSB0byBjb25zdW1lIHNwYWNlcyBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0LgorICAgICAqIEFmZmVjdHM6IExhbUFsZWYgb3B0aW9ucworICAgICAqIFRoaXMgb3B0aW9uIGlzIGFuIGFsaWFzIHRvIExFTkdUSF9GSVhFRF9TUEFDRVNfQVRfRU5ECisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFNQUxFRl9FTkQgPSAyOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogSWYgbW9yZSByb29tIGlzIG5lY2Vzc2FyeSwgdGhlbiB0cnkgdG8gY29uc3VtZSBzcGFjZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGV4dC4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRU5HVEhfRklYRURfU1BBQ0VTX0FUX0JFR0lOTklORyA9IDM7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBJZiBtb3JlIHJvb20gaXMgbmVjZXNzYXJ5LCB0aGVuIHRyeSB0byBjb25zdW1lIHNwYWNlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0LgorICAgICAqIEFmZmVjdHM6IExhbUFsZWYgb3B0aW9ucworICAgICAqIFRoaXMgb3B0aW9uIGlzIGFuIGFsaWFzIHRvIExFTkdUSF9GSVhFRF9TUEFDRVNfQVRfQkVHSU5OSU5HCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFNQUxFRl9CRUdJTiA9IDM7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBTaGFwaW5nIE1vZGU6IEZvciBlYWNoIExBTUFMRUYgY2hhcmFjdGVyIGZvdW5kLCBleHBhbmQgTEFNQUxFRiB1c2luZyBzcGFjZSBhdCBlbmQuCisgICAgICogICAgICAgICAgICAgICBJZiB0aGVyZSBpcyBubyBzcGFjZSBhdCBlbmQsIHVzZSBzcGFjZXMgYXQgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIuIElmIHRoZXJlCisgICAgICogICAgICAgICAgICAgICBpcyBubyBzcGFjZSBhdCBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciwgdXNlIHNwYWNlcyBhdCB0aGUgbmVhciAoaS5lLiB0aGUgc3BhY2UKKyAgICAgKiAgICAgICAgICAgICAgIGFmdGVyIHRoZSBMQU1BTEVGIGNoYXJhY3RlcikuCisgICAgICoKKyAgICAgKiBEZXNoYXBpbmcgTW9kZTogUGVyZm9ybSB0aGUgc2FtZSBmdW5jdGlvbiBhcyB0aGUgZmxhZyBlcXVhbHMgTEFNQUxFRl9FTkQuCisgICAgICogQWZmZWN0czogTGFtQWxlZiBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFNQUxFRl9BVVRPICA9IDB4MTAwMDA7CisKKyAgICAvKioKKyAgICAgKiBCaXQgbWFzayBmb3IgbWVtb3J5IG9wdGlvbnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVOR1RIX01BU0sgPSAweDEwMDAzOworCisgICAgLyoqIEJpdCBtYXNrIGZvciBMYW1BbGVmIG1lbW9yeSBvcHRpb25zLiAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFNQUxFRl9NQVNLICA9IDB4MTAwMDM7CisKKyAgICAvKioKKyAgICAgKiBEaXJlY3Rpb24gaW5kaWNhdG9yOiB0aGUgc291cmNlIGlzIGluIGxvZ2ljYWwgKGtleWJvYXJkKSBvcmRlci4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUX0RJUkVDVElPTl9MT0dJQ0FMID0gMDsKKworICAgIC8qKgorICAgICAqIERpcmVjdGlvbiBpbmRpY2F0b3I6dGhlIHNvdXJjZSBpcyBpbiB2aXN1YWwgUlRMIG9yZGVyLAorICAgICAqIHRoZSByaWdodG1vc3QgZGlzcGxheWVkIGNoYXJhY3RlciBzdG9yZWQgZmlyc3QuCisgICAgICogVGhpcyBvcHRpb24gaXMgYW4gYWxpYXMgdG8gVV9TSEFQRV9URVhUX0RJUkVDVElPTl9MT0dJQ0FMCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVF9ESVJFQ1RJT05fVklTVUFMX1JUTCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEaXJlY3Rpb24gaW5kaWNhdG9yOiB0aGUgc291cmNlIGlzIGluIHZpc3VhbCAoZGlzcGxheSkgb3JkZXIsIHRoYXQgaXMsCisgICAgICogdGhlIGxlZnRtb3N0IGRpc3BsYXllZCBjaGFyYWN0ZXIgaXMgc3RvcmVkIGZpcnN0LgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFRfRElSRUNUSU9OX1ZJU1VBTF9MVFIgPSA0OworCisgICAgLyoqCisgICAgICogQml0IG1hc2sgZm9yIGRpcmVjdGlvbiBpbmRpY2F0b3JzLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFRfRElSRUNUSU9OX01BU0sgPSA0OworCisKKyAgICAvKioKKyAgICAgKiBMZXR0ZXIgc2hhcGluZyBvcHRpb246IGRvIG5vdCBwZXJmb3JtIGxldHRlciBzaGFwaW5nLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFVFRFUlNfTk9PUCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBMZXR0ZXIgc2hhcGluZyBvcHRpb246IHJlcGxhY2Ugbm9ybWF0aXZlIGxldHRlciBjaGFyYWN0ZXJzIGluIHRoZSBVKzA2MDAgKEFyYWJpYykgYmxvY2ssCisgICAgICogYnkgc2hhcGVkIG9uZXMgaW4gdGhlIFUrRkU3MCAoUHJlc2VudGF0aW9uIEZvcm1zIEIpIGJsb2NrLiBQZXJmb3JtcyBMYW0tQWxlZiBsaWdhdHVyZQorICAgICAqIHN1YnN0aXR1dGlvbi4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRVRURVJTX1NIQVBFID0gODsKKworICAgIC8qKgorICAgICAqIExldHRlciBzaGFwaW5nIG9wdGlvbjogcmVwbGFjZSBzaGFwZWQgbGV0dGVyIGNoYXJhY3RlcnMgaW4gdGhlIFUrRkU3MCAoUHJlc2VudGF0aW9uIEZvcm1zIEIpIGJsb2NrCisgICAgICogYnkgbm9ybWF0aXZlIG9uZXMgaW4gdGhlIFUrMDYwMCAoQXJhYmljKSBibG9jay4gIENvbnZlcnRzIExhbS1BbGVmIGxpZ2F0dXJlcyB0byBwYWlycyBvZiBMYW0gYW5kCisgICAgICogQWxlZiBjaGFyYWN0ZXJzLCBjb25zdW1pbmcgc3BhY2VzIGlmIHJlcXVpcmVkLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFVFRFUlNfVU5TSEFQRSA9IDB4MTA7CisKKyAgICAvKioKKyAgICAgKiBMZXR0ZXIgc2hhcGluZyBvcHRpb246IHJlcGxhY2Ugbm9ybWF0aXZlIGxldHRlciBjaGFyYWN0ZXJzIGluIHRoZSBVKzA2MDAgKEFyYWJpYykgYmxvY2ssCisgICAgICogZXhjZXB0IGZvciB0aGUgVEFTSEtFRUwgY2hhcmFjdGVycyBhdCBVKzA2NEIuLi5VKzA2NTIsIGJ5IHNoYXBlZCBvbmVzIGluIHRoZSBVK0ZlNzAKKyAgICAgKiAoUHJlc2VudGF0aW9uIEZvcm1zIEIpIGJsb2NrLiAgVGhlIFRBU0hLRUVMIGNoYXJhY3RlcnMgd2lsbCBhbHdheXMgYmUgY29udmVydGVkIHRvCisgICAgICogdGhlIGlzb2xhdGVkIGZvcm1zIHJhdGhlciB0aGFuIHRvIHRoZWlyIGNvcnJlY3Qgc2hhcGUuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVUVEVSU19TSEFQRV9UQVNIS0VFTF9JU09MQVRFRCA9IDB4MTg7CisKKyAgICAvKioKKyAgICAgKiBCaXQgbWFzayBmb3IgbGV0dGVyIHNoYXBpbmcgb3B0aW9ucy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRVRURVJTX01BU0sgPSAweDE4OworCisKKyAgICAvKioKKyAgICAgKiBEaWdpdCBzaGFwaW5nIG9wdGlvbjogZG8gbm90IHBlcmZvcm0gZGlnaXQgc2hhcGluZy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVFNfTk9PUCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEaWdpdCBzaGFwaW5nIG9wdGlvbjogUmVwbGFjZSBFdXJvcGVhbiBkaWdpdHMgKFUrMDAzMC4uLlUrMDAzOSkgYnkgQXJhYmljLUluZGljIGRpZ2l0cy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVFNfRU4yQU4gPSAweDIwOworCisgICAgLyoqCisgICAgICogRGlnaXQgc2hhcGluZyBvcHRpb246IFJlcGxhY2UgQXJhYmljLUluZGljIGRpZ2l0cyBieSBFdXJvcGVhbiBkaWdpdHMgKFUrMDAzMC4uLlUrMDAzOSkuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRTX0FOMkVOID0gMHg0MDsKKworICAgIC8qKgorICAgICAqIERpZ2l0IHNoYXBpbmcgb3B0aW9uOgorICAgICAqIFJlcGxhY2UgRXVyb3BlYW4gZGlnaXRzIChVKzAwMzAuLi5VKzAwMzkpIGJ5IEFyYWJpYy1JbmRpYyBkaWdpdHMKKyAgICAgKiBpZiB0aGUgbW9zdCByZWNlbnQgc3Ryb25nbHkgZGlyZWN0aW9uYWwgY2hhcmFjdGVyCisgICAgICogaXMgYW4gQXJhYmljIGxldHRlciAoaXRzIEJpZGkgZGlyZWN0aW9uIHZhbHVlIGlzIFJJR0hUX1RPX0xFRlRfQVJBQklDKS4KKyAgICAgKiBUaGUgaW5pdGlhbCBzdGF0ZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgaXMgYXNzdW1lZCB0byBiZSBub3QgYW4gQXJhYmljLAorICAgICAqIGxldHRlciwgc28gRXVyb3BlYW4gZGlnaXRzIGF0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCB3aWxsIG5vdCBjaGFuZ2UuCisgICAgICogQ29tcGFyZSB0byBESUdJVFNfQUxFTjJBTl9JTklUX0FMLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUU19FTjJBTl9JTklUX0xSID0gMHg2MDsKKworICAgIC8qKgorICAgICAqIERpZ2l0IHNoYXBpbmcgb3B0aW9uOgorICAgICAqIFJlcGxhY2UgRXVyb3BlYW4gZGlnaXRzIChVKzAwMzAuLi5VKzAwMzkpIGJ5IEFyYWJpYy1JbmRpYyBkaWdpdHMKKyAgICAgKiBpZiB0aGUgbW9zdCByZWNlbnQgc3Ryb25nbHkgZGlyZWN0aW9uYWwgY2hhcmFjdGVyCisgICAgICogaXMgYW4gQXJhYmljIGxldHRlciAoaXRzIEJpZGkgZGlyZWN0aW9uIHZhbHVlIGlzIFJJR0hUX1RPX0xFRlRfQVJBQklDKS4KKyAgICAgKiBUaGUgaW5pdGlhbCBzdGF0ZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgaXMgYXNzdW1lZCB0byBiZSBhbiBBcmFiaWMsCisgICAgICogbGV0dGVyLCBzbyBFdXJvcGVhbiBkaWdpdHMgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHdpbGwgY2hhbmdlLgorICAgICAqIENvbXBhcmUgdG8gRElHSVRTX0FMRU4yQU5fSU5UX0xSLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUU19FTjJBTl9JTklUX0FMID0gMHg4MDsKKworICAgIC8qKiBOb3QgYSB2YWxpZCBvcHRpb24gdmFsdWUuICovCisgICAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRTX1JFU0VSVkVEID0gMHhhMDsKKworICAgIC8qKgorICAgICAqIEJpdCBtYXNrIGZvciBkaWdpdCBzaGFwaW5nIG9wdGlvbnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRTX01BU0sgPSAweGUwOworCisgICAgLyoqCisgICAgICogRGlnaXQgdHlwZSBvcHRpb246IFVzZSBBcmFiaWMtSW5kaWMgZGlnaXRzIChVKzA2NjAuLi5VKzA2NjkpLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUX1RZUEVfQU4gPSAwOworCisgICAgLyoqCisgICAgICogRGlnaXQgdHlwZSBvcHRpb246IFVzZSBFYXN0ZXJuIChFeHRlbmRlZCkgQXJhYmljLUluZGljIGRpZ2l0cyAoVSswNmYwLi4uVSswNmY5KS4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVF9UWVBFX0FOX0VYVEVOREVEID0gMHgxMDA7CisKKyAgICAvKioKKyAgICAgKiBCaXQgbWFzayBmb3IgZGlnaXQgdHlwZSBvcHRpb25zLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUX1RZUEVfTUFTSyA9IDB4MDEwMDsgLy8gMHgzZjAwPworCisgICAgLyoqCisgICAgICogc29tZSBjb25zdGFudHMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEhBTVpBRkVfQ0hBUiAgICAgICA9ICdcdWZlODAnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgSEFNWkEwNl9DSEFSICAgICAgID0gJ1x1MDYyMSc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBZRUhfSEFNWkFfQ0hBUiAgICAgPSAnXHUwNjI2JzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFlFSF9IQU1aQUZFX0NIQVIgICA9ICdcdUZFODknOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgTEFNQUxFRl9TUEFDRV9TVUIgID0gJ1x1ZmZmZic7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBUQVNIS0VFTF9TUEFDRV9TVUIgPSAnXHVmZmZlJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIExBTV9DSEFSICAgICAgPSAnXHUwNjQ0JzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNQQUNFX0NIQVIgICAgPSAnXHUwMDIwJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNQQUNFX0NIQVJfRk9SX0xBTUFMRUYgPSAnXHVmZWZmJzsgLy8gWFhYOiB0d2VhayBmb3IgVGV4dExpbmUgdXNlCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTSEFEREFfQ0hBUiAgID0gJ1x1RkU3Qyc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBUQVRXRUVMX0NIQVIgID0gJ1x1MDY0MCc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTSEFEREFfVEFUV0VFTF9DSEFSID0gJ1x1RkU3RCc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBORVdfVEFJTF9DSEFSID0gJ1x1RkU3Myc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBPTERfVEFJTF9DSEFSID0gJ1x1MjAwQic7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNIQVBFX01PREUgICAgICA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFU0hBUEVfTU9ERSAgICA9IDE7CisKKyAgICAvKioKKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHJocykgeworICAgICAgICByZXR1cm4gcmhzICE9IG51bGwgJiYKKyAgICAgICAgICAgIHJocy5nZXRDbGFzcygpID09IEFyYWJpY1NoYXBpbmcuY2xhc3MgJiYKKyAgICAgICAgICAgIG9wdGlvbnMgPT0gKChBcmFiaWNTaGFwaW5nKXJocykub3B0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICAgLy8vQ0xPVkVSOk9GRgorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBvcHRpb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworICAgICAgICBidWYuYXBwZW5kKCdbJyk7CisKKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgTEFNQUxFRl9NQVNLKSB7CisgICAgICAgIGNhc2UgTEFNQUxFRl9SRVNJWkU6IGJ1Zi5hcHBlbmQoIkxhbUFsZWYgcmVzaXplIik7IGJyZWFrOworICAgICAgICBjYXNlIExBTUFMRUZfTkVBUjogYnVmLmFwcGVuZCgiTGFtQWxlZiBzcGFjZXMgYXQgbmVhciIpOyBicmVhazsKKyAgICAgICAgY2FzZSBMQU1BTEVGX0JFR0lOOiBidWYuYXBwZW5kKCJMYW1BbGVmIHNwYWNlcyBhdCBiZWdpbiIpOyBicmVhazsKKyAgICAgICAgY2FzZSBMQU1BTEVGX0VORDogYnVmLmFwcGVuZCgiTGFtQWxlZiBzcGFjZXMgYXQgZW5kIik7IGJyZWFrOworICAgICAgICBjYXNlIExBTUFMRUZfQVVUTzogYnVmLmFwcGVuZCgibGFtQWxlZiBhdXRvIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIFRFWFRfRElSRUNUSU9OX01BU0spIHsKKyAgICAgICAgY2FzZSBURVhUX0RJUkVDVElPTl9MT0dJQ0FMOiBidWYuYXBwZW5kKCIsIGxvZ2ljYWwiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgVEVYVF9ESVJFQ1RJT05fVklTVUFMX0xUUjogYnVmLmFwcGVuZCgiLCB2aXN1YWwiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgTEVUVEVSU19NQVNLKSB7CisgICAgICAgIGNhc2UgTEVUVEVSU19OT09QOiBidWYuYXBwZW5kKCIsIG5vIGxldHRlciBzaGFwaW5nIik7IGJyZWFrOworICAgICAgICBjYXNlIExFVFRFUlNfU0hBUEU6IGJ1Zi5hcHBlbmQoIiwgc2hhcGUgbGV0dGVycyIpOyBicmVhazsKKyAgICAgICAgY2FzZSBMRVRURVJTX1NIQVBFX1RBU0hLRUVMX0lTT0xBVEVEOiBidWYuYXBwZW5kKCIsIHNoYXBlIGxldHRlcnMgdGFzaGtlZWwgaXNvbGF0ZWQiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTEVUVEVSU19VTlNIQVBFOiBidWYuYXBwZW5kKCIsIHVuc2hhcGUgbGV0dGVycyIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBTRUVOX01BU0spIHsKKyAgICAgICAgY2FzZSBTRUVOX1RXT0NFTExfTkVBUjogYnVmLmFwcGVuZCgiLCBTZWVuIGF0IG5lYXIiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgWUVISEFNWkFfTUFTSykgeworICAgICAgICBjYXNlIFlFSEhBTVpBX1RXT0NFTExfTkVBUjogYnVmLmFwcGVuZCgiLCBZZWggSGFtemEgYXQgbmVhciIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBUQVNIS0VFTF9NQVNLKSB7CisgICAgICAgIGNhc2UgVEFTSEtFRUxfQkVHSU46IGJ1Zi5hcHBlbmQoIiwgVGFzaGtlZWwgYXQgYmVnaW4iKTsgYnJlYWs7CisgICAgICAgIGNhc2UgVEFTSEtFRUxfRU5EOiBidWYuYXBwZW5kKCIsIFRhc2hrZWVsIGF0IGVuZCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBUQVNIS0VFTF9SRVBMQUNFX0JZX1RBVFdFRUw6IGJ1Zi5hcHBlbmQoIiwgVGFzaGtlZWwgcmVwbGFjZSB3aXRoIHRhdHdlZWwiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgVEFTSEtFRUxfUkVTSVpFOiBidWYuYXBwZW5kKCIsIFRhc2hrZWVsIHJlc2l6ZSIpOyBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIERJR0lUU19NQVNLKSB7CisgICAgICAgIGNhc2UgRElHSVRTX05PT1A6IGJ1Zi5hcHBlbmQoIiwgbm8gZGlnaXQgc2hhcGluZyIpOyBicmVhazsKKyAgICAgICAgY2FzZSBESUdJVFNfRU4yQU46IGJ1Zi5hcHBlbmQoIiwgc2hhcGUgZGlnaXRzIHRvIEFOIik7IGJyZWFrOworICAgICAgICBjYXNlIERJR0lUU19BTjJFTjogYnVmLmFwcGVuZCgiLCBzaGFwZSBkaWdpdHMgdG8gRU4iKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRElHSVRTX0VOMkFOX0lOSVRfTFI6IGJ1Zi5hcHBlbmQoIiwgc2hhcGUgZGlnaXRzIHRvIEFOIGNvbnRleHR1YWxseTogZGVmYXVsdCBFTiIpOyBicmVhazsKKyAgICAgICAgY2FzZSBESUdJVFNfRU4yQU5fSU5JVF9BTDogYnVmLmFwcGVuZCgiLCBzaGFwZSBkaWdpdHMgdG8gQU4gY29udGV4dHVhbGx5OiBkZWZhdWx0IEFMIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIERJR0lUX1RZUEVfTUFTSykgeworICAgICAgICBjYXNlIERJR0lUX1RZUEVfQU46IGJ1Zi5hcHBlbmQoIiwgc3RhbmRhcmQgQXJhYmljLUluZGljIGRpZ2l0cyIpOyBicmVhazsKKyAgICAgICAgY2FzZSBESUdJVF9UWVBFX0FOX0VYVEVOREVEOiBidWYuYXBwZW5kKCIsIGV4dGVuZGVkIEFyYWJpYy1JbmRpYyBkaWdpdHMiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgiXSIpOworCisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisgICAgLy8vQ0xPVkVSOk9OCisKKyAgICAvLworICAgIC8vIHBvcnRlZCBhcGkKKyAgICAvLworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElSUkVMRVZBTlQgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQU1UWVBFID0gMTY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFMRUZUWVBFID0gMzI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElOS1IgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5LTCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJTktfTUFTSyA9IDM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgaXJyZWxldmFudFBvc1tdID0geworICAgICAgICAweDAsIDB4MiwgMHg0LCAweDYsIDB4OCwgMHhBLCAweEMsIDB4RQorICAgIH07CisKKy8qCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBjb252ZXJ0TGFtQWxlZltdID0gIHsKKyAgICAgICAgJ1x1MDYyMicsIC8vIEZFRjUKKyAgICAgICAgJ1x1MDYyMicsIC8vIEZFRjYKKyAgICAgICAgJ1x1MDYyMycsIC8vIEZFRjcKKyAgICAgICAgJ1x1MDYyMycsIC8vIEZFRjgKKyAgICAgICAgJ1x1MDYyNScsIC8vIEZFRjkKKyAgICAgICAgJ1x1MDYyNScsIC8vIEZFRkEKKyAgICAgICAgJ1x1MDYyNycsIC8vIEZFRkIKKyAgICAgICAgJ1x1MDYyNycgIC8vIEZFRkMKKyAgICB9OworKi8KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCB0YWlsRmFtaWx5SXNvbGF0ZWRGaW5hbFtdID0geworICAgICAgICAvKiBGRUIxICovIDEsCisgICAgICAgIC8qIEZFQjIgKi8gMSwKKyAgICAgICAgLyogRkVCMyAqLyAwLAorICAgICAgICAvKiBGRUI0ICovIDAsCisgICAgICAgIC8qIEZFQjUgKi8gMSwKKyAgICAgICAgLyogRkVCNiAqLyAxLAorICAgICAgICAvKiBGRUI3ICovIDAsCisgICAgICAgIC8qIEZFQjggKi8gMCwKKyAgICAgICAgLyogRkVCOSAqLyAxLAorICAgICAgICAvKiBGRUJBICovIDEsCisgICAgICAgIC8qIEZFQkIgKi8gMCwKKyAgICAgICAgLyogRkVCQyAqLyAwLAorICAgICAgICAvKiBGRUJEICovIDEsCisgICAgICAgIC8qIEZFQkUgKi8gMQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgdGFzaGtlZWxNZWRpYWxbXSA9IHsKKyAgICAgICAgLyogRkU3MCAqLyAwLAorICAgICAgICAvKiBGRTcxICovIDEsCisgICAgICAgIC8qIEZFNzIgKi8gMCwKKyAgICAgICAgLyogRkU3MyAqLyAwLAorICAgICAgICAvKiBGRTc0ICovIDAsCisgICAgICAgIC8qIEZFNzUgKi8gMCwKKyAgICAgICAgLyogRkU3NiAqLyAwLAorICAgICAgICAvKiBGRTc3ICovIDEsCisgICAgICAgIC8qIEZFNzggKi8gMCwKKyAgICAgICAgLyogRkU3OSAqLyAxLAorICAgICAgICAvKiBGRTdBICovIDAsCisgICAgICAgIC8qIEZFN0IgKi8gMSwKKyAgICAgICAgLyogRkU3QyAqLyAwLAorICAgICAgICAvKiBGRTdEICovIDEsCisgICAgICAgIC8qIEZFN0UgKi8gMCwKKyAgICAgICAgLyogRkU3RiAqLyAxCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgeWVoSGFtemFUb1llaFtdID0KKyAgICB7CisgICAgLyogaXNvbGF0ZWQqLyAweEZFRUYsCisgICAgLyogZmluYWwgICAqLyAweEZFRjAKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBjb252ZXJ0Tm9ybWFsaXplZExhbUFsZWZbXSA9IHsKKyAgICAgICAgJ1x1MDYyMicsIC8vIDA2NUMKKyAgICAgICAgJ1x1MDYyMycsIC8vIDA2NUQKKyAgICAgICAgJ1x1MDYyNScsIC8vIDA2NUUKKyAgICAgICAgJ1x1MDYyNycsIC8vIDA2NUYKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gYXJhTGluayA9IHsKKyAgICAgICAgMSAgICAgICAgICAgKyAzMiArIDI1NiAqIDB4MTEsICAvKjB4MDYyMiovCisgICAgICAgIDEgICAgICAgICAgICsgMzIgKyAyNTYgKiAweDEzLCAgLyoweDA2MjMqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHgxNSwgIC8qMHgwNjI0Ki8KKyAgICAgICAgMSAgICAgICAgICAgKyAzMiArIDI1NiAqIDB4MTcsICAvKjB4MDYyNSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDE5LCAgLyoweDA2MjYqLworICAgICAgICAxICAgICAgICAgICArIDMyICsgMjU2ICogMHgxRCwgIC8qMHgwNjI3Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4MUYsICAvKjB4MDYyOCovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDIzLCAgLyoweDA2MjkqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHgyNSwgIC8qMHgwNjJBKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4MjksICAvKjB4MDYyQiovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDJELCAgLyoweDA2MkMqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHgzMSwgIC8qMHgwNjJEKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4MzUsICAvKjB4MDYyRSovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDM5LCAgLyoweDA2MkYqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHgzQiwgIC8qMHgwNjMwKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4M0QsICAvKjB4MDYzMSovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDNGLCAgLyoweDA2MzIqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg0MSwgIC8qMHgwNjMzKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NDUsICAvKjB4MDYzNCovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDQ5LCAgLyoweDA2MzUqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg0RCwgIC8qMHgwNjM2Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NTEsICAvKjB4MDYzNyovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDU1LCAgLyoweDA2MzgqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg1OSwgIC8qMHgwNjM5Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NUQsICAvKjB4MDYzQSovCisgICAgICAgIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgLyoweDA2M0ItMHgwNjNGKi8KKyAgICAgICAgMSArIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDY0MCovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDYxLCAgLyoweDA2NDEqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg2NSwgIC8qMHgwNjQyKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NjksICAvKjB4MDY0MyovCisgICAgICAgIDEgKyAyICAgICAgICsgMTYgKyAyNTYgKiAweDZELCAgLyoweDA2NDQqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg3MSwgIC8qMHgwNjQ1Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NzUsICAvKjB4MDY0NiovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDc5LCAgLyoweDA2NDcqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHg3RCwgIC8qMHgwNjQ4Ki8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4N0YsICAvKjB4MDY0OSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDgxLCAgLyoweDA2NEEqLworICAgICAgICA0LCA0LCA0LCA0LCAgICAgICAgICAgICAgICAgICAgIC8qMHgwNjRCLTB4MDY0RSovCisgICAgICAgIDQsIDQsIDQsIDQsICAgICAgICAgICAgICAgICAgICAgLyoweDA2NEYtMHgwNjUyKi8KKyAgICAgICAgNCwgNCwgNCwgMCwgMCwgICAgICAgICAgICAgICAgICAvKjB4MDY1My0weDA2NTcqLworICAgICAgICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgIC8qMHgwNjU4LTB4MDY1QiovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDg1LCAgLyoweDA2NUMqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHg4NywgIC8qMHgwNjVEKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4ODksICAvKjB4MDY1RSovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDhCLCAgLyoweDA2NUYqLworICAgICAgICAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgIC8qMHgwNjYwLTB4MDY2NCovCisgICAgICAgIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgLyoweDA2NjUtMHgwNjY5Ki8KKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAvKjB4MDY2QS0weDA2NkYqLworICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNjcwKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDY3MSovCisgICAgICAgIDEgICAgICAgICAgICsgMzIsICAgICAgICAgICAgICAgLyoweDA2NzIqLworICAgICAgICAxICAgICAgICAgICArIDMyLCAgICAgICAgICAgICAgIC8qMHgwNjczKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDY3NCovCisgICAgICAgIDEgICAgICAgICAgICsgMzIsICAgICAgICAgICAgICAgLyoweDA2NzUqLworICAgICAgICAxLCAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNjc2LTB4MDY3NyovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsICAgLyoweDA2NzgtMHgwNjdEKi8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgICAvKjB4MDY3RS0weDA2ODMqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsICAgICAgICAgICAgIC8qMHgwNjg0LTB4MDY4NyovCisgICAgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAgLyoweDA2ODgtMHgwNjkxKi8KKyAgICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgICAgICAgICAvKjB4MDY5Mi0weDA2OTkqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAgIC8qMHgwNjlBLTB4MDZBMyovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgICAgICAgICAgICAgLyoweDA2OUEtMHgwNkEzKi8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgICAvKjB4MDZBNC0weDA2QUQqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsICAgICAgICAgICAgIC8qMHgwNkE0LTB4MDZBRCovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsICAgLyoweDA2QUUtMHgwNkI3Ki8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAgICAgICAgICAgICAvKjB4MDZBRS0weDA2QjcqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAgIC8qMHgwNkI4LTB4MDZCRiovCisgICAgICAgIDErMiwgMSsyLCAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2QjgtMHgwNkJGKi8KKyAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDZDMCovCisgICAgICAgIDErMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2QzEqLworICAgICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgIC8qMHgwNkMyLTB4MDZDQiovCisgICAgICAgIDErMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2Q0MqLworICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNkNEKi8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAgICAgICAgICAgICAvKjB4MDZDRS0weDA2RDEqLworICAgICAgICAxLCAxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNkQyLTB4MDZEMyovCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHByZXNMaW5rID0geworICAgICAgICAxICsgMiwgICAgICAgICAgICAgICAgICAgICAgICAvKjB4RkU3MCovCisgICAgICAgIDEgKyAyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qMHhGRTcxKi8KKyAgICAgICAgMSArIDIsIDAsIDErIDIsIDAsIDErIDIsICAgICAgLyoweEZFNzItMHhGRTc2Ki8KKyAgICAgICAgMSArIDIsICAgICAgICAgICAgICAgICAgICAgICAgLyoweEZFNzcqLworICAgICAgICAxKyAyLCAxICsgMiwgMSsyLCAxICsgMiwgICAgICAvKjB4RkU3OC0weEZFODEqLworICAgICAgICAxKyAyLCAxICsgMiwgMSsyLCAxICsgMiwgICAgICAvKjB4RkU4Mi0weEZFODUqLworICAgICAgICAwLCAwICsgMzIsIDEgKyAzMiwgMCArIDMyLCAgICAvKjB4RkU4Ni0weEZFODkqLworICAgICAgICAxICsgMzIsIDAsIDEsICAwICsgMzIsICAgICAgICAvKjB4RkU4QS0weEZFOEQqLworICAgICAgICAxICsgMzIsIDAsIDIsICAxICsgMiwgICAgICAgICAvKjB4RkU4RS0weEZFOTEqLworICAgICAgICAxLCAwICsgMzIsIDEgKyAzMiwgMCwgICAgICAgICAvKjB4RkU5Mi0weEZFOTUqLworICAgICAgICAyLCAxICsgMiwgMSwgMCwgICAgICAgICAgICAgICAvKjB4RkU5Ni0weEZFOTkqLworICAgICAgICAxLCAwLCAyLCAxICsgMiwgICAgICAgICAgICAgICAvKjB4RkU5QS0weEZFOUQqLworICAgICAgICAxLCAwLCAyLCAxICsgMiwgICAgICAgICAgICAgICAvKjB4RkU5RS0weEZFQTEqLworICAgICAgICAxLCAwLCAyLCAxICsgMiwgICAgICAgICAgICAgICAvKjB4RkVBMi0weEZFQTUqLworICAgICAgICAxLCAwLCAyLCAxICsgMiwgICAgICAgICAgICAgICAvKjB4RkVBNi0weEZFQTkqLworICAgICAgICAxLCAwLCAyLCAxICsgMiwgICAgICAgICAgICAgICAvKjB4RkVBQS0weEZFQUQqLworICAgICAgICAxLCAwLCAxLCAwLCAgICAgICAgICAgICAgICAgICAvKjB4RkVBRS0weEZFQjEqLworICAgICAgICAxLCAwLCAxLCAwLCAgICAgICAgICAgICAgICAgICAvKjB4RkVCMi0weEZFQjUqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVCNi0weEZFQjkqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVCQS0weEZFQkQqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVCRS0weEZFQzEqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVDMi0weEZFQzUqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVDNi0weEZFQzkqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVDQS0weEZFQ0QqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVDRS0weEZFRDEqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVEMi0weEZFRDUqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVENi0weEZFRDkqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVEQS0weEZFREQqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVERS0weEZFRTEqLworICAgICAgICAxLCAwICsgMTYsIDIgKyAxNiwgMSArIDIgKzE2LCAvKjB4RkVFMi0weEZFRTUqLworICAgICAgICAxICsgMTYsIDAsIDIsIDErMiwgICAgICAgICAgICAvKjB4RkVFNi0weEZFRTkqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVFQS0weEZFRUQqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVFRS0weEZFRjEqLworICAgICAgICAxLCAwLCAxLCAwLCAgICAgICAgICAgICAgICAgICAvKjB4RkVGMi0weEZFRjUqLworICAgICAgICAxLCAwLCAyLCAxKzIsICAgICAgICAgICAgICAgICAvKjB4RkVGNi0weEZFRjkqLworICAgICAgICAxLCAwLCAxLCAwLCAgICAgICAgICAgICAgICAgICAvKjB4RkVGQS0weEZFRkQqLworICAgICAgICAxLCAwLCAxLCAwLAorICAgICAgICAxCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGludFtdIGNvbnZlcnRGRXRvMDYgPSB7CisgICAgICAgIC8qKioqKioqKioqKjAqKioqKioxKioqKioqMioqKioqKjMqKioqKio0KioqKioqNSoqKioqKjYqKioqKio3KioqKioqOCoqKioqKjkqKioqKipBKioqKioqQioqKioqKkMqKioqKipEKioqKioqRSoqKioqKkYqKiovCisgICAgICAgIC8qRkU3Ki8gICAweDY0QiwgMHg2NEIsIDB4NjRDLCAweDY0QywgMHg2NEQsIDB4NjRELCAweDY0RSwgMHg2NEUsIDB4NjRGLCAweDY0RiwgMHg2NTAsIDB4NjUwLCAweDY1MSwgMHg2NTEsIDB4NjUyLCAweDY1MiwKKyAgICAgICAgLypGRTgqLyAgIDB4NjIxLCAweDYyMiwgMHg2MjIsIDB4NjIzLCAweDYyMywgMHg2MjQsIDB4NjI0LCAweDYyNSwgMHg2MjUsIDB4NjI2LCAweDYyNiwgMHg2MjYsIDB4NjI2LCAweDYyNywgMHg2MjcsIDB4NjI4LAorICAgICAgICAvKkZFOSovICAgMHg2MjgsIDB4NjI4LCAweDYyOCwgMHg2MjksIDB4NjI5LCAweDYyQSwgMHg2MkEsIDB4NjJBLCAweDYyQSwgMHg2MkIsIDB4NjJCLCAweDYyQiwgMHg2MkIsIDB4NjJDLCAweDYyQywgMHg2MkMsCisgICAgICAgIC8qRkVBKi8gICAweDYyQywgMHg2MkQsIDB4NjJELCAweDYyRCwgMHg2MkQsIDB4NjJFLCAweDYyRSwgMHg2MkUsIDB4NjJFLCAweDYyRiwgMHg2MkYsIDB4NjMwLCAweDYzMCwgMHg2MzEsIDB4NjMxLCAweDYzMiwKKyAgICAgICAgLypGRUIqLyAgIDB4NjMyLCAweDYzMywgMHg2MzMsIDB4NjMzLCAweDYzMywgMHg2MzQsIDB4NjM0LCAweDYzNCwgMHg2MzQsIDB4NjM1LCAweDYzNSwgMHg2MzUsIDB4NjM1LCAweDYzNiwgMHg2MzYsIDB4NjM2LAorICAgICAgICAvKkZFQyovICAgMHg2MzYsIDB4NjM3LCAweDYzNywgMHg2MzcsIDB4NjM3LCAweDYzOCwgMHg2MzgsIDB4NjM4LCAweDYzOCwgMHg2MzksIDB4NjM5LCAweDYzOSwgMHg2MzksIDB4NjNBLCAweDYzQSwgMHg2M0EsCisgICAgICAgIC8qRkVEKi8gICAweDYzQSwgMHg2NDEsIDB4NjQxLCAweDY0MSwgMHg2NDEsIDB4NjQyLCAweDY0MiwgMHg2NDIsIDB4NjQyLCAweDY0MywgMHg2NDMsIDB4NjQzLCAweDY0MywgMHg2NDQsIDB4NjQ0LCAweDY0NCwKKyAgICAgICAgLypGRUUqLyAgIDB4NjQ0LCAweDY0NSwgMHg2NDUsIDB4NjQ1LCAweDY0NSwgMHg2NDYsIDB4NjQ2LCAweDY0NiwgMHg2NDYsIDB4NjQ3LCAweDY0NywgMHg2NDcsIDB4NjQ3LCAweDY0OCwgMHg2NDgsIDB4NjQ5LAorICAgICAgICAvKkZFRiovICAgMHg2NDksIDB4NjRBLCAweDY0QSwgMHg2NEEsIDB4NjRBLCAweDY1QywgMHg2NUMsIDB4NjVELCAweDY1RCwgMHg2NUUsIDB4NjVFLCAweDY1RiwgMHg2NUYKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHNoYXBlVGFibGVbXVtdW10gPSB7CisgICAgICAgIHsgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDEsMCwzfSwgezAsMSwwLDF9IH0sCisgICAgICAgIHsgezAsMCwyLDJ9LCB7MCwwLDEsMn0sIHswLDEsMSwyfSwgezAsMSwxLDN9IH0sCisgICAgICAgIHsgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDEsMCwzfSwgezAsMSwwLDN9IH0sCisgICAgICAgIHsgezAsMCwxLDJ9LCB7MCwwLDEsMn0sIHswLDEsMSwyfSwgezAsMSwxLDN9IH0KKyAgICB9OworCisgICAgLyoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHNoYXBlcyBFdXJvcGVhbiBkaWdpdHMgdG8gQXJhYmljLUluZGljIGRpZ2l0cworICAgICAqIGluLXBsYWNlLCB3cml0aW5nIG92ZXIgdGhlIGlucHV0IGNoYXJhY3RlcnMuICBEYXRhIGlzIGluIHZpc3VhbAorICAgICAqIG9yZGVyLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzaGFwZVRvQXJhYmljRGlnaXRzV2l0aENvbnRleHQoY2hhcltdIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaWdpdEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGxhc3RTdHJvbmdXYXNBTCkgeworICAgICAgICBkaWdpdEJhc2UgLT0gJzAnOyAvLyBtb3ZlIGNvbW1vbiBhZGp1c3RtZW50IG91dCBvZiBsb29wCisKKyAgICAgICAgZm9yKGludCBpID0gc3RhcnQgKyBsZW5ndGg7IC0taSA+PSBzdGFydDspIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSBkZXN0W2ldOworICAgICAgICAgICAgc3dpdGNoIChDaGFyYWN0ZXIuZ2V0RGlyZWN0aW9uYWxpdHkoY2gpKSB7CisgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUOgorICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVDoKKyAgICAgICAgICAgICAgICBsYXN0U3Ryb25nV2FzQUwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlRfQVJBQklDOgorICAgICAgICAgICAgICAgIGxhc3RTdHJvbmdXYXNBTCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVI6CisgICAgICAgICAgICAgICAgaWYgKGxhc3RTdHJvbmdXYXNBTCAmJiBjaCA8PSAnXHUwMDM5JykgeworICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gKGNoYXIpKGNoICsgZGlnaXRCYXNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogaW52ZXJ0QnVmZmVyCisgICAgICogRnVuY3Rpb246IFRoaXMgZnVuY3Rpb24gaW52ZXJ0cyB0aGUgYnVmZmVyLCBpdCdzIHVzZWQKKyAgICAgKiAgICAgICAgICAgaW4gY2FzZSB0aGUgdXNlciBzcGVjaWZpZXMgdGhlIGJ1ZmZlciB0byBiZQorICAgICAqICAgICAgICAgICBURVhUX0RJUkVDVElPTl9MT0dJQ0FMCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnZlcnRCdWZmZXIoY2hhcltdIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkgeworCisgICAgICAgIGZvcihpbnQgaSA9IHN0YXJ0LCBqID0gc3RhcnQgKyBsZW5ndGggLSAxOyBpIDwgajsgaSsrLCAtLWopIHsKKyAgICAgICAgICAgIGNoYXIgdGVtcCA9IGJ1ZmZlcltpXTsKKyAgICAgICAgICAgIGJ1ZmZlcltpXSA9IGJ1ZmZlcltqXTsKKyAgICAgICAgICAgIGJ1ZmZlcltqXSA9IHRlbXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBjaGFuZ2VMYW1BbGVmCisgICAgICogRnVuY3Rpb246IENvbnZlcnRzIHRoZSBBbGVmIGNoYXJhY3RlcnMgaW50byBhbiBlcXVpdmFsZW50CisgICAgICogICAgICAgICAgIExhbUFsZWYgbG9jYXRpb24gaW4gdGhlIDB4MDZ4eCBSYW5nZSwgdGhpcyBpcyBhbgorICAgICAqICAgICAgICAgICBpbnRlcm1lZGlhdGUgc3RhZ2UgaW4gdGhlIG9wZXJhdGlvbiBvZiB0aGUgcHJvZ3JhbQorICAgICAqICAgICAgICAgICBsYXRlciBpdCdsbCBiZSBjb252ZXJ0ZWQgaW50byB0aGUgMHhGRXh4IExhbUFsZWZzCisgICAgICogICAgICAgICAgIGluIHRoZSBzaGFwaW5nIGZ1bmN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNoYXIgY2hhbmdlTGFtQWxlZihjaGFyIGNoKSB7CisgICAgICAgIHN3aXRjaChjaCkgeworICAgICAgICBjYXNlICdcdTA2MjInOiByZXR1cm4gJ1x1MDY1Qyc7CisgICAgICAgIGNhc2UgJ1x1MDYyMyc6IHJldHVybiAnXHUwNjVEJzsKKyAgICAgICAgY2FzZSAnXHUwNjI1JzogcmV0dXJuICdcdTA2NUUnOworICAgICAgICBjYXNlICdcdTA2MjcnOiByZXR1cm4gJ1x1MDY1Ric7CisgICAgICAgIGRlZmF1bHQ6ICByZXR1cm4gJ1x1MDAwMCc7IC8vIG5vdCBhIGxhbWFsZWYKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IHNwZWNpYWxDaGFyCisgICAgICogRnVuY3Rpb246IFNwZWNpYWwgQXJhYmljIGNoYXJhY3RlcnMgbmVlZCBzcGVjaWFsIGhhbmRsaW5nIGluIHRoZSBzaGFwZVVuaWNvZGUKKyAgICAgKiAgICAgICAgICAgZnVuY3Rpb24sIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAxIG9yIDIgZm9yIHRoZXNlIHNwZWNpYWwgY2hhcmFjdGVycworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBzcGVjaWFsQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIGlmICgoY2ggPiAnXHUwNjIxJyAmJiBjaCA8ICdcdTA2MjYnKSB8fAorICAgICAgICAgICAgKGNoID09ICdcdTA2MjcnKSB8fAorICAgICAgICAgICAgKGNoID4gJ1x1MDYyRScgJiYgY2ggPCAnXHUwNjMzJykgfHwKKyAgICAgICAgICAgIChjaCA+ICdcdTA2NDcnICYmIGNoIDwgJ1x1MDY0QScpIHx8CisgICAgICAgICAgICAoY2ggPT0gJ1x1MDYyOScpKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAnXHUwNjRCJyAmJiBjaDw9ICdcdTA2NTInKSB7CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAweDA2NTMgJiYgY2ggPD0gMHgwNjU1IHx8CisgICAgICAgICAgICAgICAgICAgY2ggPT0gMHgwNjcwIHx8CisgICAgICAgICAgICAgICAgICAgY2ggPj0gMHhGRTcwICYmIGNoIDw9IDB4RkU3RikgeworICAgICAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGdldExpbmsKKyAgICAgKiBGdW5jdGlvbjogUmVzb2x2ZXMgdGhlIGxpbmsgYmV0d2VlbiB0aGUgY2hhcmFjdGVycyBhcworICAgICAqICAgICAgICAgICBBcmFiaWMgY2hhcmFjdGVycyBoYXZlIGZvdXIgZm9ybXMgOgorICAgICAqICAgICAgICAgICBJc29sYXRlZCwgSW5pdGlhbCwgTWlkZGxlIGFuZCBGaW5hbCBGb3JtCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldExpbmsoY2hhciBjaCkgeworICAgICAgICBpZiAoY2ggPj0gJ1x1MDYyMicgJiYgY2ggPD0gJ1x1MDZEMycpIHsKKyAgICAgICAgICAgIHJldHVybiBhcmFMaW5rW2NoIC0gJ1x1MDYyMiddOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdcdTIwMEQnKSB7CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAnXHUyMDZEJyAmJiBjaCA8PSAnXHUyMDZGJykgeworICAgICAgICAgICAgcmV0dXJuIDQ7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gJ1x1RkU3MCcgJiYgY2ggPD0gJ1x1RkVGQycpIHsKKyAgICAgICAgICAgIHJldHVybiBwcmVzTGlua1tjaCAtICdcdUZFNzAnXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogY291bnRTcGFjZXMKKyAgICAgKiBGdW5jdGlvbjogQ291bnRzIHRoZSBudW1iZXIgb2Ygc3BhY2VzCisgICAgICogICAgICAgICAgIGF0IGVhY2ggZW5kIG9mIHRoZSBsb2dpY2FsIGJ1ZmZlcgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBjb3VudFNwYWNlc0xlZnQoY2hhcltdIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBlID0gc3RhcnQgKyBjb3VudDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgaWYgKGRlc3RbaV0gIT0gU1BBQ0VfQ0hBUikgeworICAgICAgICAgICAgICAgIHJldHVybiBpIC0gc3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBjb3VudFNwYWNlc1JpZ2h0KGNoYXJbXSBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpIHsKKworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQgKyBjb3VudDsgLS1pID49IHN0YXJ0OykgeworICAgICAgICAgICAgaWYgKGRlc3RbaV0gIT0gU1BBQ0VfQ0hBUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGFydCArIGNvdW50IC0gMSAtIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGlzVGFzaGtlZWxDaGFyCisgICAgICogRnVuY3Rpb246IFJldHVybnMgdHJ1ZSBmb3IgVGFzaGtlZWwgY2hhcmFjdGVycyBlbHNlIHJldHVybiBmYWxzZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUYXNoa2VlbENoYXIoY2hhciBjaCkgeworICAgICAgICByZXR1cm4gKCBjaCA+PSdcdTA2NEInICYmIGNoIDw9ICdcdTA2NTInICk7CisgICAgfQorCisgICAgLyoKKyAgICAgKk5hbWUgICAgIDogaXNTZWVuVGFpbEZhbWlseUNoYXIKKyAgICAgKkZ1bmN0aW9uIDogcmV0dXJucyAxIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSBzZWVuIGZhbWlseSBpc29sYXRlZCBjaGFyYWN0ZXIKKyAgICAgKiAgICAgICAgICAgaW4gdGhlIEZFIHJhbmdlIG90aGVyd2lzZSByZXR1cm5zIDAKKyAgICAgKi8KKworICAgIHByaXZhdGUgc3RhdGljIGludCBpc1NlZW5UYWlsRmFtaWx5Q2hhcihjaGFyIGNoKSB7CisgICAgICAgIGlmIChjaCA+PSAweGZlYjEgJiYgY2ggPCAweGZlYmYpeworICAgICAgICAgICAgIHJldHVybiB0YWlsRmFtaWx5SXNvbGF0ZWRGaW5hbCBbY2ggLSAweEZFQjFdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgIC8qIE5hbWUgICAgIDogaXNTZWVuRmFtaWx5Q2hhcgorICAgICAgKiBGdW5jdGlvbiA6IHJldHVybnMgMSBpZiB0aGUgY2hhcmFjdGVyIGlzIGEgc2VlbiBmYW1pbHkgY2hhcmFjdGVyIGluIHRoZSBVbmljb2RlCisgICAgICAqICAgICAgICAgICAgMDYgcmFuZ2Ugb3RoZXJ3aXNlIHJldHVybnMgMAorICAgICAqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGlzU2VlbkZhbWlseUNoYXIoY2hhciAgY2gpeworICAgICAgICBpZiAoY2ggPj0gMHg2MzMgJiYgY2ggPD0gMHg2MzYpeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH1lbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKk5hbWUgICAgIDogaXNUYWlsQ2hhcgorICAgICAqRnVuY3Rpb24gOiByZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBtYXRjaGVzIG9uZSBvZiB0aGUgdGFpbCBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICgweGZlNzMgb3IgMHgyMDBiKSBvdGhlcndpc2UgcmV0dXJucyBmYWxzZQorICAgICAqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RhaWxDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgaWYoY2ggPT0gT0xEX1RBSUxfQ0hBUiB8fCBjaCA9PSBORVdfVEFJTF9DSEFSKXsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKk5hbWUgICAgIDogaXNBbGVmTWFrc291cmFDaGFyCisgICAgICpGdW5jdGlvbiA6IHJldHVybnMgdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIGlzIGEgQWxlZiBNYWtzb3VyYSBGaW5hbCBvciBpc29sYXRlZAorICAgICAqICAgICAgICAgICBvdGhlcndpc2UgcmV0dXJucyBmYWxzZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBbGVmTWFrc291cmFDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgcmV0dXJuICggKGNoID09IDB4RkVFRikgfHwgKCBjaCA9PSAweEZFRjApIHx8IChjaCA9PSAweDA2NDkpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgIDogaXNZZWhIYW16YUNoYXIKKyAgICAgKiBGdW5jdGlvbiA6IHJldHVybnMgdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIGlzIGEgeWVoSGFtemEgaXNvbGF0ZWQgb3IgeWVoaGFtemEKKyAgICAgKiAgICAgICAgICAgIGZpbmFsIGlzIGZvdW5kIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1llaEhhbXphQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIGlmKChjaD09MHhGRTg5KXx8KGNoPT0weEZFOEEpKXsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICpOYW1lICAgICA6IGlzVGFzaGtlZWxDaGFyRkUKKyAgICAgKkZ1bmN0aW9uIDogUmV0dXJucyB0cnVlIGZvciBUYXNoa2VlbCBjaGFyYWN0ZXJzIGluIEZFIHJhbmdlIGVsc2UgcmV0dXJuIGZhbHNlCisgICAgICovCisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVGFzaGtlZWxDaGFyRkUoY2hhciBjaCkgeworICAgICAgICByZXR1cm4gKCBjaCE9MHhGRTc1ICYmKGNoPj0weEZFNzAgJiYgY2g8PSAweEZFN0YpICk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lOiBpc1Rhc2hrZWVsT25UYXR3ZWVsQ2hhcgorICAgICAqIEZ1bmN0aW9uOiBDaGVja3MgaWYgdGhlIFRhc2hrZWVsIENoYXJhY3RlciBpcyBvbiBUYXR3ZWVsIG9yIG5vdCxpZiB0aGUKKyAgICAgKiAgICAgICAgICAgVGFzaGtlZWwgb24gdGF0d2VlbCAoRkUgcmFuZ2UpLCBpdCByZXR1cm5zIDEgZWxzZSBpZiB0aGUKKyAgICAgKiAgICAgICAgICAgVGFzaGtlZWwgd2l0aCBzaGFkZGEgb24gdGF0d2VlbCAoRkMgcmFuZ2UpcmV0dXJuIDIgb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgIHJldHVybnMgMAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBpc1Rhc2hrZWVsT25UYXR3ZWVsQ2hhcihjaGFyIGNoKXsKKyAgICAgICAgaWYgKGNoID49IDB4ZmU3MCAmJiBjaCA8PSAweGZlN2YgJiYgY2ggIT0gTkVXX1RBSUxfQ0hBUiAmJiBjaCAhPSAweEZFNzUgJiYgY2ggIT0gU0hBRERBX1RBVFdFRUxfQ0hBUikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRhc2hrZWVsTWVkaWFsIFtjaCAtIDB4RkU3MF07CisgICAgICAgIH0gZWxzZSBpZiggKGNoID49IDB4ZmNmMiAmJiBjaCA8PSAweGZjZjQpIHx8IChjaCA9PSBTSEFEREFfVEFUV0VFTF9DSEFSKSkgeworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTmFtZTogaXNJc29sYXRlZFRhc2hrZWVsQ2hhcgorICAgICAqIEZ1bmN0aW9uOiBDaGVja3MgaWYgdGhlIFRhc2hrZWVsIENoYXJhY3RlciBpcyBpbiB0aGUgaXNvbGF0ZWQgZm9ybQorICAgICAqICAgICAgICAgICAoaS5lLiBVbmljb2RlIEZFIHJhbmdlKSByZXR1cm5zIDEgZWxzZSBpZiB0aGUgVGFzaGtlZWwKKyAgICAgKiAgICAgICAgICAgd2l0aCBzaGFkZGEgaXMgaW4gdGhlIGlzb2xhdGVkIGZvcm0gKGkuZS4gVW5pY29kZSBGQyByYW5nZSkKKyAgICAgKiAgICAgICAgICAgcmV0dXJucyAxIG90aGVyd2lzZSByZXR1cm5zIDAKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgaXNJc29sYXRlZFRhc2hrZWVsQ2hhcihjaGFyIGNoKXsKKyAgICAgICAgaWYgKGNoID49IDB4ZmU3MCAmJiBjaCA8PSAweGZlN2YgJiYgY2ggIT0gTkVXX1RBSUxfQ0hBUiAmJiBjaCAhPSAweEZFNzUpeworICAgICAgICAgICAgcmV0dXJuICgxIC0gdGFzaGtlZWxNZWRpYWwgW2NoIC0gMHhGRTcwXSk7CisgICAgICAgIH0gZWxzZSBpZihjaCA+PSAweGZjNWUgJiYgY2ggPD0gMHhmYzYzKXsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGlzQWxlZkNoYXIKKyAgICAgKiBGdW5jdGlvbjogUmV0dXJucyAxIGZvciBBbGVmIGNoYXJhY3RlcnMgZWxzZSByZXR1cm4gMAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBbGVmQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIHJldHVybiBjaCA9PSAnXHUwNjIyJyB8fCBjaCA9PSAnXHUwNjIzJyB8fCBjaCA9PSAnXHUwNjI1JyB8fCBjaCA9PSAnXHUwNjI3JzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBpc0xhbUFsZWZDaGFyCisgICAgICogRnVuY3Rpb246IFJldHVybnMgdHJ1ZSBmb3IgTGFtQWxlZiBjaGFyYWN0ZXJzIGVsc2UgcmV0dXJuIGZhbHNlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xhbUFsZWZDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgcmV0dXJuIGNoID49ICdcdUZFRjUnICYmIGNoIDw9ICdcdUZFRkMnOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb3JtYWxpemVkTGFtQWxlZkNoYXIoY2hhciBjaCkgeworICAgICAgICByZXR1cm4gY2ggPj0gJ1x1MDY1QycgJiYgY2ggPD0gJ1x1MDY1Ric7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogY2FsY3VsYXRlU2l6ZQorICAgICAqIEZ1bmN0aW9uOiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGRlc3RTaXplIHRvIGJlIHVzZWQgaW4gcHJlZmxpZ2h0aW5nCisgICAgICogICAgICAgICAgIHdoZW4gdGhlIGRlc3RTaXplIGlzIGVxdWFsIHRvIDAKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBjYWxjdWxhdGVTaXplKGNoYXJbXSBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlTGVuZ3RoKSB7CisKKyAgICAgICAgaW50IGRlc3RTaXplID0gc291cmNlTGVuZ3RoOworCisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIExFVFRFUlNfTUFTSykgeworICAgICAgICBjYXNlIExFVFRFUlNfU0hBUEU6CisgICAgICAgIGNhc2UgTEVUVEVSU19TSEFQRV9UQVNIS0VFTF9JU09MQVRFRDoKKyAgICAgICAgICAgIGlmIChpc0xvZ2ljYWwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gc291cmNlU3RhcnQsIGUgPSBzb3VyY2VTdGFydCArIHNvdXJjZUxlbmd0aCAtIDE7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzb3VyY2VbaV0gPT0gTEFNX0NIQVIgJiYgaXNBbGVmQ2hhcihzb3VyY2VbaSsxXSkpIHx8IGlzVGFzaGtlZWxDaGFyRkUoc291cmNlW2ldKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAtLWRlc3RTaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gdmlzdWFsCisgICAgICAgICAgICAgICAgZm9yKGludCBpID0gc291cmNlU3RhcnQgKyAxLCBlID0gc291cmNlU3RhcnQgKyBzb3VyY2VMZW5ndGg7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzb3VyY2VbaV0gPT0gTEFNX0NIQVIgJiYgaXNBbGVmQ2hhcihzb3VyY2VbaS0xXSkpIHx8IGlzVGFzaGtlZWxDaGFyRkUoc291cmNlW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLS1kZXN0U2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTEVUVEVSU19VTlNIQVBFOgorICAgICAgICAgICAgZm9yKGludCBpID0gc291cmNlU3RhcnQsIGUgPSBzb3VyY2VTdGFydCArIHNvdXJjZUxlbmd0aDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChpc0xhbUFsZWZDaGFyKHNvdXJjZVtpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzdFNpemUrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGVzdFNpemU7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBjb3VudFNwYWNlU3ViCisgICAgICogRnVuY3Rpb246IENvdW50cyBudW1iZXIgb2YgdGltZXMgdGhlIHN1YkNoYXIgYXBwZWFycyBpbiB0aGUgYXJyYXkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBjb3VudFNwYWNlU3ViKGNoYXIgW10gZGVzdCxpbnQgbGVuZ3RoLCBjaGFyIHN1YkNoYXIpeworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7CisgICAgICAgICAgaWYgKGRlc3RbaV0gPT0gc3ViQ2hhcikgeworICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBzaGlmdEFycmF5CisgICAgICogRnVuY3Rpb246IFNoaWZ0cyBjaGFyYWN0ZXJzIHRvIHJlcGxhY2Ugc3BhY2Ugc3ViIGNoYXJhY3RlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2hpZnRBcnJheShjaGFyIFtdIGRlc3QsaW50IHN0YXJ0LCBpbnQgZSwgY2hhciBzdWJDaGFyKXsKKyAgICAgICAgaW50IHcgPSBlOworICAgICAgICBpbnQgciA9IGU7CisgICAgICAgIHdoaWxlICgtLXIgPj0gc3RhcnQpIHsKKyAgICAgICAgICBjaGFyIGNoID0gZGVzdFtyXTsKKyAgICAgICAgICBpZiAoY2ggIT0gc3ViQ2hhcikgeworICAgICAgICAgICAgLS13OworICAgICAgICAgICAgaWYgKHcgIT0gcikgeworICAgICAgICAgICAgICBkZXN0W3ddID0gY2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBmbGlwQXJyYXkKKyAgICAgKiBGdW5jdGlvbjogaW52ZXJ0cyBhcnJheSwgc28gdGhhdCBzdGFydCBiZWNvbWVzIGVuZCBhbmQgdmljZSB2ZXJzYQorICAgICAqLworICAgICAgcHVibGljIHN0YXRpYyBpbnQgZmxpcEFycmF5KGNoYXIgW10gZGVzdCwgaW50IHN0YXJ0LCBpbnQgZSwgaW50IHcpeworICAgICAgICBpbnQgcjsKKyAgICAgICAgaWYgKHcgPiBzdGFydCkgeworICAgICAgICAvLyBzaGlmdCwgYXNzdW1lIHNtYWxsIGJ1ZmZlciBzaXplIHNvIGRvbid0IHVzZSBhcnJheWNvcHkKKyAgICAgICAgICByID0gdzsKKyAgICAgICAgICB3ID0gc3RhcnQ7CisgICAgICAgICAgd2hpbGUgKHIgPCBlKSB7CisgICAgICAgICAgICBkZXN0W3crK10gPSBkZXN0W3IrK107CisgICAgICAgICAgIH0KKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgdyA9IGU7CisgICAgICAgICB9CisgICAgICAgIHJldHVybiB3OworICAgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgICA6IGhhbmRsZVRhc2hrZWVsV2l0aFRhdHdlZWwKKyAgICAgKiBGdW5jdGlvbiA6IFJlcGxhY2VzIFRhc2hrZWVsIGFzIGZvbGxvd2luZzoKKyAgICAgKiAgICAgICAgICAgIENhc2UgMSA6aWYgdGhlIFRhc2hrZWVsIG9uIHRhdHdlZWwsIHJlcGxhY2UgaXQgd2l0aCBUYXR3ZWVsLgorICAgICAqICAgICAgICAgICAgQ2FzZSAyIDppZiB0aGUgVGFzaGtlZWwgYWdncmVnYXRlZCB3aXRoIFNoYWRkYSBvbiBUYXR3ZWVsLCByZXBsYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgaXQgd2l0aCBTaGFkZGEgb24gVGF0d2VlbC4KKyAgICAgKiAgICAgICAgICAgIENhc2UgMzogaWYgdGhlIFRhc2hrZWVsIGlzIGlzb2xhdGVkIHJlcGxhY2UgaXQgd2l0aCBTcGFjZS4KKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBoYW5kbGVUYXNoa2VlbFdpdGhUYXR3ZWVsKGNoYXJbXSBkZXN0LCBpbnQgc291cmNlTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IHNvdXJjZUxlbmd0aDsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZigoaXNUYXNoa2VlbE9uVGF0d2VlbENoYXIoZGVzdFtpXSkgPT0gMSkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gVEFUV0VFTF9DSEFSOworICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoKGlzVGFzaGtlZWxPblRhdHdlZWxDaGFyKGRlc3RbaV0pID09IDIpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IFNIQUREQV9UQVRXRUVMX0NIQVI7CisgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZigoaXNJc29sYXRlZFRhc2hrZWVsQ2hhcihkZXN0W2ldKT09MSkgJiYgZGVzdFtpXSAhPSBTSEFEREFfQ0hBUil7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBTUEFDRV9DSEFSOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZUxlbmd0aDsKKyAgICB9CisKKyAgICAvKgorICAgICAqTmFtZSAgICAgOiBoYW5kbGVHZW5lcmF0ZWRTcGFjZXMKKyAgICAgKkZ1bmN0aW9uIDogVGhlIHNoYXBlVW5pY29kZSBmdW5jdGlvbiBjb252ZXJ0cyBMYW0gKyBBbGVmIGludG8gTGFtQWxlZiArIHNwYWNlLAorICAgICAqICAgICAgICAgICBhbmQgVGFzaGtlZWwgdG8gc3BhY2UuCisgICAgICogICAgICAgICAgIGhhbmRsZUdlbmVyYXRlZFNwYWNlcyBmdW5jdGlvbiBwdXRzIHRoZXNlIGdlbmVyYXRlZCBzcGFjZXMKKyAgICAgKiAgICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBvcHRpb25zIHRoZSB1c2VyIHNwZWNpZmllcy4gTGFtQWxlZiBhbmQgVGFzaGtlZWwKKyAgICAgKiAgICAgICAgICAgc3BhY2VzIGNhbiBiZSByZXBsYWNlZCBhdCBiZWdpbiwgYXQgZW5kLCBhdCBuZWFyIG9yIGRlY3JlYXNlIHRoZQorICAgICAqICAgICAgICAgICBidWZmZXIgc2l6ZS4KKyAgICAgKgorICAgICAqICAgICAgICAgICBUaGVyZSBpcyBhbHNvIEF1dG8gb3B0aW9uIGZvciBMYW1BbGVmIGFuZCB0YXNoa2VlbCwgd2hpY2ggd2lsbCBwdXQKKyAgICAgKiAgICAgICAgICAgdGhlIHNwYWNlcyBhdCBlbmQgb2YgdGhlIGJ1ZmZlciAob3IgZW5kIG9mIHRleHQgaWYgdGhlIHVzZXIgdXNlZAorICAgICAqICAgICAgICAgICB0aGUgb3B0aW9uIFNQQUNFU19SRUxBVElWRV9UT19URVhUX0JFR0lOX0VORCkuCisgICAgICoKKyAgICAgKiAgICAgICAgICAgSWYgdGhlIHRleHQgdHlwZSB3YXMgdmlzdWFsX0xUUiBhbmQgdGhlIG9wdGlvbgorICAgICAqICAgICAgICAgICBTUEFDRVNfUkVMQVRJVkVfVE9fVEVYVF9CRUdJTl9FTkQgd2FzIHNlbGVjdGVkIHRoZSBFTkQKKyAgICAgKiAgICAgICAgICAgb3B0aW9uIHdpbGwgcGxhY2UgdGhlIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciBhbmQKKyAgICAgKiAgICAgICAgICAgQkVHSU4gd2lsbCBwbGFjZSB0aGUgc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorICAgICAqLworICBwcml2YXRlIGludCBoYW5kbGVHZW5lcmF0ZWRTcGFjZXMoY2hhcltdIGRlc3QsCisgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICBpbnQgbGVuZ3RoKSB7CisKKyAgICAgIGludCBsZW5PcHRpb25zTGFtQWxlZiA9IG9wdGlvbnMgJiBMQU1BTEVGX01BU0s7CisgICAgICBpbnQgbGVuT3B0aW9uc1Rhc2hrZWVsID0gb3B0aW9ucyAmIFRBU0hLRUVMX01BU0s7CisgICAgICBib29sZWFuIGxhbUFsZWZPbiA9IGZhbHNlOworICAgICAgYm9vbGVhbiB0YXNoa2VlbE9uID0gZmFsc2U7CisKKyAgICAgIGlmICghaXNMb2dpY2FsICYgIXNwYWNlc1JlbGF0aXZlVG9UZXh0QmVnaW5FbmQpIHsKKyAgICAgICAgICBzd2l0Y2ggKGxlbk9wdGlvbnNMYW1BbGVmKSB7CisgICAgICAgICAgY2FzZSBMQU1BTEVGX0JFR0lOOiBsZW5PcHRpb25zTGFtQWxlZiA9IExBTUFMRUZfRU5EOyBicmVhazsKKyAgICAgICAgICBjYXNlIExBTUFMRUZfRU5EOiBsZW5PcHRpb25zTGFtQWxlZiA9IExBTUFMRUZfQkVHSU47IGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICAgfQorICAgICAgICAgIHN3aXRjaCAobGVuT3B0aW9uc1Rhc2hrZWVsKXsKKyAgICAgICAgICBjYXNlIFRBU0hLRUVMX0JFR0lOOiBsZW5PcHRpb25zVGFzaGtlZWwgPSBUQVNIS0VFTF9FTkQ7IGJyZWFrOworICAgICAgICAgIGNhc2UgVEFTSEtFRUxfRU5EOiBsZW5PcHRpb25zVGFzaGtlZWwgPSBUQVNIS0VFTF9CRUdJTjsgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgaWYgKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfTkVBUikgeworICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgZSA9IGkgKyBsZW5ndGg7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgICAgaWYgKGRlc3RbaV0gPT0gTEFNQUxFRl9TUEFDRV9TVUIpIHsKKyAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBTUEFDRV9DSEFSX0ZPUl9MQU1BTEVGOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICB9IGVsc2UgeworCisgICAgICAgICAgZmluYWwgaW50IGUgPSBzdGFydCArIGxlbmd0aDsKKyAgICAgICAgICBpbnQgd0wgPSBjb3VudFNwYWNlU3ViKGRlc3QsIGxlbmd0aCwgTEFNQUxFRl9TUEFDRV9TVUIpOworICAgICAgICAgIGludCB3VCA9IGNvdW50U3BhY2VTdWIoZGVzdCwgbGVuZ3RoLCBUQVNIS0VFTF9TUEFDRV9TVUIpOworCisgICAgICAgICAgaWYgKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfRU5EKXsKKyAgICAgICAgICAgIGxhbUFsZWZPbiA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChsZW5PcHRpb25zVGFzaGtlZWwgPT0gVEFTSEtFRUxfRU5EKXsKKyAgICAgICAgICAgIHRhc2hrZWVsT24gPSB0cnVlOworICAgICAgICAgIH0KKworCisgICAgICAgICAgaWYgKGxhbUFsZWZPbiAmJiAobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9FTkQpKSB7CisgICAgICAgICAgICBzaGlmdEFycmF5KGRlc3QsIHN0YXJ0LCBlLCBMQU1BTEVGX1NQQUNFX1NVQik7CisgICAgICAgICAgICB3aGlsZSAod0wgPiBzdGFydCkgeworICAgICAgICAgICAgICAgIGRlc3RbLS13TF0gPSBTUEFDRV9DSEFSOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmICh0YXNoa2VlbE9uICYmIChsZW5PcHRpb25zVGFzaGtlZWwgPT0gVEFTSEtFRUxfRU5EKSl7CisgICAgICAgICAgICBzaGlmdEFycmF5KGRlc3QsIHN0YXJ0LCBlLCBUQVNIS0VFTF9TUEFDRV9TVUIpOworICAgICAgICAgICAgd2hpbGUgKHdUID4gc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgZGVzdFstLXdUXSA9IFNQQUNFX0NIQVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgbGFtQWxlZk9uID0gZmFsc2U7CisgICAgICAgICAgdGFzaGtlZWxPbiA9IGZhbHNlOworCisgICAgICAgICAgaWYgKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfUkVTSVpFKXsKKyAgICAgICAgICAgIGxhbUFsZWZPbiA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChsZW5PcHRpb25zVGFzaGtlZWwgPT0gVEFTSEtFRUxfUkVTSVpFKXsKKyAgICAgICAgICAgIHRhc2hrZWVsT24gPSB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChsYW1BbGVmT24gJiYgKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfUkVTSVpFKSl7CisgICAgICAgICAgICAgIHNoaWZ0QXJyYXkoZGVzdCwgc3RhcnQsIGUsIExBTUFMRUZfU1BBQ0VfU1VCKTsKKyAgICAgICAgICAgICAgd0wgPSBmbGlwQXJyYXkoZGVzdCxzdGFydCxlLCB3TCk7CisgICAgICAgICAgICAgIGxlbmd0aCA9IHdMIC0gc3RhcnQ7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICh0YXNoa2VlbE9uICYmIChsZW5PcHRpb25zVGFzaGtlZWwgPT0gVEFTSEtFRUxfUkVTSVpFKSkgeworICAgICAgICAgICAgICBzaGlmdEFycmF5KGRlc3QsIHN0YXJ0LCBlLCBUQVNIS0VFTF9TUEFDRV9TVUIpOworICAgICAgICAgICAgICB3VCA9IGZsaXBBcnJheShkZXN0LHN0YXJ0LGUsIHdUKTsKKyAgICAgICAgICAgICAgbGVuZ3RoID0gd1QgLSBzdGFydDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBsYW1BbGVmT24gPSBmYWxzZTsKKyAgICAgICAgICB0YXNoa2VlbE9uID0gZmFsc2U7CisKKyAgICAgICAgICBpZiAoKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfQkVHSU4pIHx8CisgICAgICAgICAgICAgIChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0FVVE8pKXsKKyAgICAgICAgICAgICAgICBsYW1BbGVmT24gPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobGVuT3B0aW9uc1Rhc2hrZWVsID09IFRBU0hLRUVMX0JFR0lOKXsKKyAgICAgICAgICAgICAgICB0YXNoa2VlbE9uID0gdHJ1ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobGFtQWxlZk9uICYmICgobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9CRUdJTil8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0FVVE8pKSkgeyAvLyBzcGFjZXMgYXQgYmVnaW5uaW5nCisgICAgICAgICAgICAgIHNoaWZ0QXJyYXkoZGVzdCwgc3RhcnQsIGUsIExBTUFMRUZfU1BBQ0VfU1VCKTsKKyAgICAgICAgICAgICAgIHdMID0gZmxpcEFycmF5KGRlc3Qsc3RhcnQsZSwgd0wpOworICAgICAgICAgICAgICAgICAgd2hpbGUgKHdMIDwgZSkgeworICAgICAgICAgICAgICAgICAgICAgIGRlc3Rbd0wrK10gPSBTUEFDRV9DSEFSOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmKHRhc2hrZWVsT24gJiYgKGxlbk9wdGlvbnNUYXNoa2VlbCA9PSBUQVNIS0VFTF9CRUdJTikpeworICAgICAgICAgICAgICAgc2hpZnRBcnJheShkZXN0LCBzdGFydCwgZSwgVEFTSEtFRUxfU1BBQ0VfU1VCKTsKKyAgICAgICAgICAgICAgIHdUID0gZmxpcEFycmF5KGRlc3Qsc3RhcnQsZSwgd1QpOworICAgICAgICAgICAgICAgICAgd2hpbGUgKHdUIDwgZSkgeworICAgICAgICAgICAgICAgICAgICAgIGRlc3Rbd1QrK10gPSBTUEFDRV9DSEFSOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKworICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgfQorCisKKyAgLyoKKyAgICpOYW1lICAgICA6ZXhwYW5kQ29tcG9zaXRDaGFyQXRCZWdpbgorICAgKkZ1bmN0aW9uIDpFeHBhbmRzIHRoZSBMYW1BbGVmIGNoYXJhY3RlciB0byBMYW0gYW5kIEFsZWYgY29uc3VtaW5nIHRoZSByZXF1aXJlZAorICAgKiAgICAgICAgIHNwYWNlIGZyb20gYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIuIElmIHRoZSB0ZXh0IHR5cGUgd2FzIHZpc3VhbF9MVFIKKyAgICogICAgICAgICBhbmQgdGhlIG9wdGlvbiBTUEFDRVNfUkVMQVRJVkVfVE9fVEVYVF9CRUdJTl9FTkQgd2FzIHNlbGVjdGVkCisgICAqICAgICAgICAgdGhlIHNwYWNlcyB3aWxsIGJlIGxvY2F0ZWQgYXQgZW5kIG9mIGJ1ZmZlci4KKyAgICogICAgICAgICBJZiB0aGVyZSBhcmUgbm8gc3BhY2VzIHRvIGV4cGFuZCB0aGUgTGFtQWxlZiwgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyovCisgcHJpdmF0ZSBib29sZWFuIGV4cGFuZENvbXBvc2l0Q2hhckF0QmVnaW4oY2hhcltdIGRlc3QsaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYWNvdW50KSB7CisgICAgIGJvb2xlYW4gc3BhY2VOb3RGb3VuZCA9IGZhbHNlOworCisgICAgIGlmIChsYWNvdW50ID4gY291bnRTcGFjZXNSaWdodChkZXN0LCBzdGFydCwgbGVuZ3RoKSkgeworICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IHRydWU7CisgICAgICAgICByZXR1cm4gc3BhY2VOb3RGb3VuZDsKKyAgICAgfQorICAgICBmb3IgKGludCByID0gc3RhcnQgKyBsZW5ndGggLSBsYWNvdW50LCB3ID0gc3RhcnQgKyBsZW5ndGg7IC0tciA+PSBzdGFydDspIHsKKyAgICAgICAgIGNoYXIgY2ggPSBkZXN0W3JdOworICAgICAgICAgaWYgKGlzTm9ybWFsaXplZExhbUFsZWZDaGFyKGNoKSkgeworICAgICAgICAgICAgIGRlc3RbLS13XSA9IExBTV9DSEFSOworICAgICAgICAgICAgIGRlc3RbLS13XSA9IGNvbnZlcnROb3JtYWxpemVkTGFtQWxlZltjaCAtICdcdTA2NUMnXTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgZGVzdFstLXddID0gY2g7CisgICAgICAgICB9CisgICAgIH0KKyAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisKKyAgfQorCisgIC8qCisgICAqTmFtZSAgICAgOiBleHBhbmRDb21wb3NpdENoYXJBdEVuZAorICAgKkZ1bmN0aW9uIDogRXhwYW5kcyB0aGUgTGFtQWxlZiBjaGFyYWN0ZXIgdG8gTGFtIGFuZCBBbGVmIGNvbnN1bWluZyB0aGUKKyAgICogICAgICAgICAgIHJlcXVpcmVkIHNwYWNlIGZyb20gZW5kIG9mIHRoZSBidWZmZXIuIElmIHRoZSB0ZXh0IHR5cGUgd2FzCisgICAqICAgICAgICAgICBWaXN1YWwgTFRSIGFuZCB0aGUgb3B0aW9uIFNQQUNFU19SRUxBVElWRV9UT19URVhUX0JFR0lOX0VORAorICAgKiAgICAgICAgICAgd2FzIHVzZWQsIHRoZSBzcGFjZXMgd2lsbCBiZSBjb25zdW1lZCBmcm9tIGJlZ2luIG9mIGJ1ZmZlci4gSWYKKyAgICogICAgICAgICAgIHRoZXJlIGFyZSBubyBzcGFjZXMgdG8gZXhwYW5kIHRoZSBMYW1BbGVmLCBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgKi8KKworICBwcml2YXRlIGJvb2xlYW4gIGV4cGFuZENvbXBvc2l0Q2hhckF0RW5kKGNoYXJbXSBkZXN0LGludCBzdGFydCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhY291bnQpeworICAgICAgYm9vbGVhbiBzcGFjZU5vdEZvdW5kID0gZmFsc2U7CisKKyAgICAgIGlmIChsYWNvdW50ID4gY291bnRTcGFjZXNMZWZ0KGRlc3QsIHN0YXJ0LCBsZW5ndGgpKSB7CisgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IHRydWU7CisgICAgICAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisgICAgICB9CisgICAgICBmb3IgKGludCByID0gc3RhcnQgKyBsYWNvdW50LCB3ID0gc3RhcnQsIGUgPSBzdGFydCArIGxlbmd0aDsgciA8IGU7ICsrcikgeworICAgICAgICAgIGNoYXIgY2ggPSBkZXN0W3JdOworICAgICAgICAgIGlmIChpc05vcm1hbGl6ZWRMYW1BbGVmQ2hhcihjaCkpIHsKKyAgICAgICAgICAgICAgZGVzdFt3KytdID0gY29udmVydE5vcm1hbGl6ZWRMYW1BbGVmW2NoIC0gJ1x1MDY1QyddOworICAgICAgICAgICAgICBkZXN0W3crK10gPSBMQU1fQ0hBUjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBkZXN0W3crK10gPSBjaDsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gc3BhY2VOb3RGb3VuZDsKKyAgfQorCisgIC8qCisgICAqTmFtZSAgICAgOiBleHBhbmRDb21wb3NpdENoYXJBdE5lYXIKKyAgICpGdW5jdGlvbiA6IEV4cGFuZHMgdGhlIExhbUFsZWYgY2hhcmFjdGVyIGludG8gTGFtICsgQWxlZiwgWWVoSGFtemEgY2hhcmFjdGVyCisgICAqICAgICAgICAgICBpbnRvIFllaCArIEhhbXphLCBTZWVuRmFtaWx5IGNoYXJhY3RlciBpbnRvIFNlZW5GYW1pbHkgY2hhcmFjdGVyCisgICAqICAgICAgICAgICArIFRhaWwsIHdoaWxlIGNvbnN1bWluZyB0aGUgc3BhY2UgbmV4dCB0byB0aGUgY2hhcmFjdGVyLgorICAgKi8KKworICBwcml2YXRlIGJvb2xlYW4gZXhwYW5kQ29tcG9zaXRDaGFyQXROZWFyKGNoYXJbXSBkZXN0LGludCBzdGFydCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5ZWhIYW16YU9wdGlvbiwgaW50IHNlZW5UYWlsT3B0aW9uLCBpbnQgbGFtQWxlZk9wdGlvbil7CisKKyAgICAgIGJvb2xlYW4gc3BhY2VOb3RGb3VuZCA9IGZhbHNlOworCisKKworICAgICAgaWYgKGlzTm9ybWFsaXplZExhbUFsZWZDaGFyKGRlc3Rbc3RhcnRdKSkgeworICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworICAgICAgfQorICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0ICsgbGVuZ3RoOyAtLWkgPj1zdGFydDspIHsKKyAgICAgICAgICBjaGFyIGNoID0gZGVzdFtpXTsKKyAgICAgICAgICBpZiAobGFtQWxlZk9wdGlvbiA9PSAxICYmIGlzTm9ybWFsaXplZExhbUFsZWZDaGFyKGNoKSkgeworICAgICAgICAgICAgICBpZiAoaT5zdGFydCAmJmRlc3RbaS0xXSA9PSBTUEFDRV9DSEFSKSB7CisgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gTEFNX0NIQVI7CisgICAgICAgICAgICAgICAgICBkZXN0Wy0taV0gPSBjb252ZXJ0Tm9ybWFsaXplZExhbUFsZWZbY2ggLSAnXHUwNjVDJ107CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfWVsc2UgaWYoc2VlblRhaWxPcHRpb24gPT0gMSAmJiBpc1NlZW5UYWlsRmFtaWx5Q2hhcihjaCkgPT0gMSl7CisgICAgICAgICAgICAgIGlmKGk+c3RhcnQgJiZkZXN0W2ktMV0gPT0gU1BBQ0VfQ0hBUil7CisgICAgICAgICAgICAgICAgICBkZXN0W2ktMV0gPSB0YWlsQ2hhcjsKKyAgICAgICAgICAgICAgfSBlbHNleworICAgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICByZXR1cm4gc3BhY2VOb3RGb3VuZDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH1lbHNlIGlmKHllaEhhbXphT3B0aW9uID09IDEgJiYgaXNZZWhIYW16YUNoYXIoY2gpKXsKKworICAgICAgICAgICAgICAgaWYoaT5zdGFydCAmJmRlc3RbaS0xXSA9PSBTUEFDRV9DSEFSKXsKKyAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSB5ZWhIYW16YVRvWWVoW2NoIC0gWUVIX0hBTVpBRkVfQ0hBUl07CisgICAgICAgICAgICAgICAgICBkZXN0W2ktMV0gPSBIQU1aQUZFX0NIQVI7CisgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICByZXR1cm4gc3BhY2VOb3RGb3VuZDsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKworICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBleHBhbmRDb21wb3NpdENoYXIKKyAgICAgKiBGdW5jdGlvbjogTGFtQWxlZiBuZWVkcyBzcGVjaWFsIGhhbmRsaW5nIGFzIHRoZSBMYW1BbGVmIGlzCisgICAgICogICAgICAgICAgIG9uZSBjaGFyYWN0ZXIgd2hpbGUgZXhwYW5kaW5nIGl0IHdpbGwgZ2l2ZSB0d28KKyAgICAgKiAgICAgICAgICAgY2hhcmFjdGVycyBMYW0gKyBBbGVmLCBzbyB3ZSBuZWVkIHRvIGV4cGFuZCB0aGUgTGFtQWxlZgorICAgICAqICAgICAgICAgICBpbiBuZWFyIG9yIGZhciBzcGFjZXMgYWNjb3JkaW5nIHRvIHRoZSBvcHRpb25zIHRoZSB1c2VyCisgICAgICogICAgICAgICAgIHNwZWNpZmllcyBvciBpbmNyZWFzZSB0aGUgYnVmZmVyIHNpemUuCisgICAgICogICAgICAgICAgIERlc3QgaGFzIGVub3VnaCByb29tIGZvciB0aGUgZXhwYW5zaW9uIGlmIHdlIGFyZSBncm93aW5nLgorICAgICAqICAgICAgICAgICBsYW1hbGVmIGFyZSBub3JtYWxpemVkIHRvIHRoZSAnc3BlY2lhbCBjaGFyYWN0ZXJzJworICAgICAqLworICAgIHByaXZhdGUgaW50IGV4cGFuZENvbXBvc2l0Q2hhcihjaGFyW10gZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGFwaW5nTW9kZSkgdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24geworCisgICAgICAgIGludCBsZW5PcHRpb25zTGFtQWxlZiA9IG9wdGlvbnMgJiBMQU1BTEVGX01BU0s7CisgICAgICAgIGludCBsZW5PcHRpb25zU2VlbiA9IG9wdGlvbnMgJiBTRUVOX01BU0s7CisgICAgICAgIGludCBsZW5PcHRpb25zWWVoSGFtemEgPSBvcHRpb25zICYgWUVISEFNWkFfTUFTSzsKKyAgICAgICAgYm9vbGVhbiBzcGFjZU5vdEZvdW5kID0gZmFsc2U7CisKKyAgICAgICAgaWYgKCFpc0xvZ2ljYWwgJiYgIXNwYWNlc1JlbGF0aXZlVG9UZXh0QmVnaW5FbmQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobGVuT3B0aW9uc0xhbUFsZWYpIHsKKyAgICAgICAgICAgIGNhc2UgTEFNQUxFRl9CRUdJTjogbGVuT3B0aW9uc0xhbUFsZWYgPSBMQU1BTEVGX0VORDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExBTUFMRUZfRU5EOiBsZW5PcHRpb25zTGFtQWxlZiA9IExBTUFMRUZfQkVHSU47IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihzaGFwaW5nTW9kZSA9PSAxKXsKKyAgICAgICAgICAgIGlmKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfQVVUTyl7CisgICAgICAgICAgICAgICAgaWYoaXNMb2dpY2FsKXsKKyAgICAgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0RW5kKGRlc3QsIHN0YXJ0LCBsZW5ndGgsIGxhY291bnQpOworICAgICAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdEJlZ2luKGRlc3QsIHN0YXJ0LCBsZW5ndGgsIGxhY291bnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0TmVhcihkZXN0LCBzdGFydCwgbGVuZ3RoLDAsMCwxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJObyBzcGFjZWZvciBsYW1hbGVmIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0QmVnaW4oZGVzdCwgc3RhcnQsIGxlbmd0aCwgbGFjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0RW5kKGRlc3QsIHN0YXJ0LCBsZW5ndGgsIGxhY291bnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0TmVhcihkZXN0LCBzdGFydCwgbGVuZ3RoLDAsMCwxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJObyBzcGFjZWZvciBsYW1hbGVmIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ZWxzZSBpZihsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0VORCl7CisgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0RW5kKGRlc3QsIHN0YXJ0LCBsZW5ndGgsIGxhY291bnQpOworICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigiTm8gc3BhY2Vmb3IgbGFtYWxlZiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNlIGlmKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfQkVHSU4peworICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdEJlZ2luKGRlc3QsIHN0YXJ0LCBsZW5ndGgsIGxhY291bnQpOworICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigiTm8gc3BhY2Vmb3IgbGFtYWxlZiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNlIGlmKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfTkVBUil7CisgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0TmVhcihkZXN0LCBzdGFydCwgbGVuZ3RoLDAsMCwxKTsKKyAgICAgICAgICAgICAgICBpZihzcGFjZU5vdEZvdW5kKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIk5vIHNwYWNlZm9yIGxhbWFsZWYiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNlIGlmKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfUkVTSVpFKXsKKyAgICAgICAgICAgICAgICBmb3IgKGludCByID0gc3RhcnQgKyBsZW5ndGgsIHcgPSByICsgbGFjb3VudDsgLS1yID49IHN0YXJ0OykgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gZGVzdFtyXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzTm9ybWFsaXplZExhbUFsZWZDaGFyKGNoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFstLXddID0gJ1x1MDY0NCc7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0Wy0td10gPSBjb252ZXJ0Tm9ybWFsaXplZExhbUFsZWZbY2ggLSAnXHUwNjVDJ107CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0Wy0td10gPSBjaDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsZW5ndGggKz0gbGFjb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGlmKGxlbk9wdGlvbnNTZWVuID09IFNFRU5fVFdPQ0VMTF9ORUFSKXsKKyAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXROZWFyKGRlc3QsIHN0YXJ0LCBsZW5ndGgsMCwxLDApOworICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigiTm8gc3BhY2UgZm9yIFNlZW4gdGFpbCBleHBhbnNpb24iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihsZW5PcHRpb25zWWVoSGFtemEgPT0gWUVISEFNWkFfVFdPQ0VMTF9ORUFSKXsKKyAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXROZWFyKGRlc3QsIHN0YXJ0LCBsZW5ndGgsMSwwLDApOworICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigiTm8gc3BhY2UgZm9yIFllaEhhbXphIGV4cGFuc2lvbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICB9CisKKworICAgIC8qIENvbnZlcnQgdGhlIGlucHV0IGJ1ZmZlciBmcm9tIEZFeHggUmFuZ2UgaW50byAwNnh4IFJhbmdlCisgICAgICogdG8gcHV0IGFsbCBjaGFyYWN0ZXJzIGludG8gdGhlIDA2eHggcmFuZ2UKKyAgICAgKiBldmVuIHRoZSBsYW1hbGVmIGlzIGNvbnZlcnRlZCB0byB0aGUgc3BlY2lhbCByZWdpb24gaW4KKyAgICAgKiB0aGUgMDZ4eCByYW5nZS4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGxhbWFsZWYgY2hhcnMgZm91bmQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbm9ybWFsaXplKGNoYXJbXSBkZXN0LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgaW50IGxhY291bnQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBpICsgbGVuZ3RoOyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICBjaGFyIGNoID0gZGVzdFtpXTsKKyAgICAgICAgICAgIGlmIChjaCA+PSAnXHVGRTcwJyAmJiBjaCA8PSAnXHVGRUZDJykgeworICAgICAgICAgICAgICAgIGlmIChpc0xhbUFsZWZDaGFyKGNoKSkgeworICAgICAgICAgICAgICAgICAgICArK2xhY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlc3RbaV0gPSAoY2hhciljb252ZXJ0RkV0bzA2W2NoIC0gJ1x1RkU3MCddOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBsYWNvdW50OworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGRlc2hhcGVOb3JtYWxpemUKKyAgICAgKiBGdW5jdGlvbjogQ29udmVydCB0aGUgaW5wdXQgYnVmZmVyIGZyb20gRkV4eCBSYW5nZSBpbnRvIDA2eHggUmFuZ2UKKyAgICAgKiAgICAgICAgICAgZXZlbiB0aGUgbGFtYWxlZiBpcyBjb252ZXJ0ZWQgdG8gdGhlIHNwZWNpYWwgcmVnaW9uIGluIHRoZSAwNnh4IHJhbmdlLgorICAgICAqICAgICAgICAgICBBY2NvcmRpbmcgdG8gdGhlIG9wdGlvbnMgdGhlIHVzZXIgZW50ZXJzLCBhbGwgc2VlbiBmYW1pbHkgY2hhcmFjdGVycworICAgICAqICAgICAgICAgICBmb2xsb3dlZCBieSBhIHRhaWwgY2hhcmFjdGVyIGFyZSBtZXJnZWQgdG8gc2VlbiB0YWlsIGZhbWlseSBjaGFyYWN0ZXIgYW5kCisgICAgICogICAgICAgICAgIGFueSB5ZWggZm9sbG93ZWQgYnkgYSBoYW16YSBjaGFyYWN0ZXIgYXJlIG1lcmdlZCB0byB5ZWhoYW16YSBjaGFyYWN0ZXIuCisgICAgICogICAgICAgICAgIE1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgbGFtYWxlZiBjaGFycyBmb3VuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBkZXNoYXBlTm9ybWFsaXplKGNoYXJbXSBkZXN0LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgaW50IGxhY291bnQgPSAwOworICAgICAgICBpbnQgeWVoSGFtemFDb21wb3NlRW5hYmxlZCA9IDA7CisgICAgICAgIGludCBzZWVuQ29tcG9zZUVuYWJsZWQgPSAwOworCisgICAgICAgIHllaEhhbXphQ29tcG9zZUVuYWJsZWQgPSAoKG9wdGlvbnMmWUVISEFNWkFfTUFTSykgPT0gWUVISEFNWkFfVFdPQ0VMTF9ORUFSKSA/IDEgOiAwOworICAgICAgICBzZWVuQ29tcG9zZUVuYWJsZWQgPSAoKG9wdGlvbnMmU0VFTl9NQVNLKSA9PSBTRUVOX1RXT0NFTExfTkVBUik/IDEgOiAwOworCisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgZSA9IGkgKyBsZW5ndGg7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSBkZXN0W2ldOworCisgICAgICAgIGlmKCAoeWVoSGFtemFDb21wb3NlRW5hYmxlZCA9PSAxKSAmJiAoKGNoID09IEhBTVpBMDZfQ0hBUikgfHwgKGNoID09IEhBTVpBRkVfQ0hBUikpCisgICAgICAgICAgICAgICAmJiAoaSA8IChsZW5ndGggLSAxKSkgJiYgaXNBbGVmTWFrc291cmFDaGFyKGRlc3RbaSsxXSApKSB7CisgICAgICAgICAgICAgICAgZGVzdFtpXSA9IFNQQUNFX0NIQVI7CisgICAgICAgICAgICAgICAgZGVzdFtpKzFdID0gWUVIX0hBTVpBX0NIQVI7CisgICAgICAgfSBlbHNlIGlmICggKHNlZW5Db21wb3NlRW5hYmxlZCA9PSAxKSAmJiAoaXNUYWlsQ2hhcihjaCkpICYmIChpPCAobGVuZ3RoIC0gMSkpCisgICAgICAgICAgICAgICAgICAgICAgICYmIChpc1NlZW5UYWlsRmFtaWx5Q2hhcihkZXN0W2krMV0pPT0xKSApIHsKKyAgICAgICAgICAgICAgIGRlc3RbaV0gPSBTUEFDRV9DSEFSOworICAgICAgIH0KKyAgICAgICBlbHNlIGlmIChjaCA+PSAnXHVGRTcwJyAmJiBjaCA8PSAnXHVGRUZDJykgeworICAgICAgICAgICAgICAgIGlmIChpc0xhbUFsZWZDaGFyKGNoKSkgeworICAgICAgICAgICAgICAgICAgICArK2xhY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlc3RbaV0gPSAoY2hhciljb252ZXJ0RkV0bzA2W2NoIC0gJ1x1RkU3MCddOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBsYWNvdW50OworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IHNoYXBlVW5pY29kZQorICAgICAqIEZ1bmN0aW9uOiBDb252ZXJ0cyBhbiBBcmFiaWMgVW5pY29kZSBidWZmZXIgaW4gMDZ4eCBSYW5nZSBpbnRvIGEgc2hhcGVkCisgICAgICogICAgICAgICAgIGFyYWJpYyBVbmljb2RlIGJ1ZmZlciBpbiBGRXh4IFJhbmdlCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc2hhcGVVbmljb2RlKGNoYXJbXSBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhc2hrZWVsRmxhZyl0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaW50IGxhbWFsZWZfY291bnQgPSBub3JtYWxpemUoZGVzdCwgc3RhcnQsIGxlbmd0aCk7CisKKyAgICAgICAgLy8gcmVzb2x2ZSB0aGUgbGluayBiZXR3ZWVuIHRoZSBjaGFyYWN0ZXJzLgorICAgICAgICAvLyBBcmFiaWMgY2hhcmFjdGVycyBoYXZlIGZvdXIgZm9ybXM6IElzb2xhdGVkLCBJbml0aWFsLCBNZWRpYWwgYW5kIEZpbmFsLgorICAgICAgICAvLyBUYXNoa2VlbCBjaGFyYWN0ZXJzIGhhdmUgdHdvLCBpc29sYXRlZCBvciBtZWRpYWwsIGFuZCBzb21ldGltZXMgb25seSBpc29sYXRlZC4KKyAgICAgICAgLy8gdGFzaGtlZWxGbGFnID09IDA6IHNoYXBlIG5vcm1hbGx5LCAxOiBzaGFwZSBpc29sYXRlZCwgMjogZG9uJ3Qgc2hhcGUKKworICAgICAgICBib29sZWFuIGxhbWFsZWZfZm91bmQgPSBmYWxzZSwgc2VlbmZhbV9mb3VuZCA9IGZhbHNlOworICAgICAgICBib29sZWFuIHllaGhhbXphX2ZvdW5kID0gZmFsc2UsIHRhc2hrZWVsX2ZvdW5kID0gZmFsc2U7CisgICAgICAgIGludCBpID0gc3RhcnQgKyBsZW5ndGggLSAxOworICAgICAgICBpbnQgY3VyckxpbmsgPSBnZXRMaW5rKGRlc3RbaV0pOworICAgICAgICBpbnQgbmV4dExpbmsgPSAwOworICAgICAgICBpbnQgcHJldkxpbmsgPSAwOworICAgICAgICBpbnQgbGFzdExpbmsgPSAwOworICAgICAgICAvL2ludCBwcmV2UG9zID0gaTsKKyAgICAgICAgaW50IGxhc3RQb3MgPSBpOworICAgICAgICBpbnQgbnggPSAtMjsKKyAgICAgICAgaW50IG53ID0gMDsKKworICAgICAgICB3aGlsZSAoaSA+PSAwKSB7CisgICAgICAgICAgICAvLyBJZiBoaWdoIGJ5dGUgb2YgY3VyckxpbmsgPiAwIHRoZW4gdGhlcmUgbWlnaHQgYmUgbW9yZSB0aGFuIG9uZSBzaGFwZQorICAgICAgICAgICAgaWYgKChjdXJyTGluayAmICdcdUZGMDAnKSA+IDAgfHwgaXNUYXNoa2VlbENoYXIoZGVzdFtpXSkpIHsKKyAgICAgICAgICAgICAgICBudyA9IGkgLSAxOworICAgICAgICAgICAgICAgIG54ID0gLTI7CisgICAgICAgICAgICAgICAgd2hpbGUgKG54IDwgMCkgeyAvLyB3ZSBuZWVkIHRvIGtub3cgYWJvdXQgbmV4dCBjaGFyCisgICAgICAgICAgICAgICAgICAgIGlmIChudyA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExpbmsgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbnggPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMaW5rID0gZ2V0TGluayhkZXN0W253XSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG5leHRMaW5rICYgSVJSRUxFVkFOVCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG54ID0gbnc7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tbnc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKChjdXJyTGluayAmIEFMRUZUWVBFKSA+IDApICYmICgobGFzdExpbmsgJiBMQU1UWVBFKSA+IDApKSB7CisgICAgICAgICAgICAgICAgICAgIGxhbWFsZWZfZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBjaGFyIHdMYW1hbGVmID0gY2hhbmdlTGFtQWxlZihkZXN0W2ldKTsgLy8gZ2V0IGZyb20gMHgwNjVDLTB4MDY1ZgorICAgICAgICAgICAgICAgICAgICBpZiAod0xhbWFsZWYgIT0gJ1x1MDAwMCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgYWxlZiBieSBtYXJrZXIsIGl0IHdpbGwgYmUgcmVtb3ZlZCBsYXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9ICdcdWZmZmYnOworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtsYXN0UG9zXSA9IHdMYW1hbGVmOworICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGxhc3RQb3M7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBsYXN0TGluayA9IHByZXZMaW5rOworICAgICAgICAgICAgICAgICAgICBjdXJyTGluayA9IGdldExpbmsod0xhbWFsZWYpOyAvLyByZXF1aXJlcyAnXHUwMDAwJywgdW5mb3J0dW5hdGVseQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGkgPiAwKSAmJiAoZGVzdFtpLTFdID09IFNQQUNFX0NIQVIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpc1NlZW5GYW1pbHlDaGFyKGRlc3RbaV0pID09IDEpeworICAgICAgICAgICAgICAgICAgICAgICAgc2VlbmZhbV9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzdFtpXSA9PSBZRUhfSEFNWkFfQ0hBUikgeworICAgICAgICAgICAgICAgICAgICAgICAgeWVoaGFtemFfZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoaT09MCl7CisgICAgICAgICAgICAgICAgICAgIGlmICggaXNTZWVuRmFtaWx5Q2hhcihkZXN0W2ldKSA9PSAxKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5mYW1fZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc3RbaV0gPT0gWUVIX0hBTVpBX0NIQVIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHllaGhhbXphX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBwcm9wZXIgc2hhcGUgYWNjb3JkaW5nIHRvIGxpbmsgYWJpbGl0eSBvZiBuZWlnaGJvcnMKKyAgICAgICAgICAgICAgICAvLyBhbmQgb2YgY2hhcmFjdGVyOyBkZXBlbmRzIG9uIHRoZSBvcmRlciBvZiB0aGUgc2hhcGVzCisgICAgICAgICAgICAgICAgLy8gKGlzb2xhdGVkLCBpbml0aWFsLCBtaWRkbGUsIGZpbmFsKSBpbiB0aGUgY29tcGF0aWJpbGl0eSBhcmVhCisKKyAgICAgICAgICAgICAgICBpbnQgZmxhZyA9IHNwZWNpYWxDaGFyKGRlc3RbaV0pOworCisgICAgICAgICAgICAgICAgaW50IHNoYXBlID0gc2hhcGVUYWJsZVtuZXh0TGluayAmIExJTktfTUFTS10KKyAgICAgICAgICAgICAgICAgICAgW2xhc3RMaW5rICYgTElOS19NQVNLXQorICAgICAgICAgICAgICAgICAgICBbY3VyckxpbmsgJiBMSU5LX01BU0tdOworCisgICAgICAgICAgICAgICAgaWYgKGZsYWcgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBzaGFwZSAmPSAweDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbGFnID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2hrZWVsRmxhZyA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoKGxhc3RMaW5rICYgTElOS0wpICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoKG5leHRMaW5rICYgTElOS1IpICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2ldICE9ICdcdTA2NEMnICYmCisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2ldICE9ICdcdTA2NEQnICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhKChuZXh0TGluayAmIEFMRUZUWVBFKSA9PSBBTEVGVFlQRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAobGFzdExpbmsgJiBMQU1UWVBFKSA9PSBMQU1UWVBFKSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZsYWcgPT0gMikgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFzaGtlZWxGbGFnID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBUQVNIS0VFTF9TUEFDRV9TVUI7CisgICAgICAgICAgICAgICAgICAgICAgICB0YXNoa2VlbF9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSAoY2hhcikoJ1x1RkU3MCcgKyBpcnJlbGV2YW50UG9zW2Rlc3RbaV0gLSAnXHUwNjRCJ10gKyBzaGFwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSBsZWF2ZSB0YXNoa2VlbCBhbG9uZQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSAoY2hhcikoJ1x1RkU3MCcgKyAoY3VyckxpbmsgPj4gOCkgKyBzaGFwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBtb3ZlIG9uZSBub3RjaCBmb3J3YXJkCisgICAgICAgICAgICBpZiAoKGN1cnJMaW5rICYgSVJSRUxFVkFOVCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHByZXZMaW5rID0gbGFzdExpbms7CisgICAgICAgICAgICAgICAgbGFzdExpbmsgPSBjdXJyTGluazsKKyAgICAgICAgICAgICAgICAvL3ByZXZQb3MgPSBsYXN0UG9zOworICAgICAgICAgICAgICAgIGxhc3RQb3MgPSBpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICBpZiAoaSA9PSBueCkgeworICAgICAgICAgICAgICAgIGN1cnJMaW5rID0gbmV4dExpbms7CisgICAgICAgICAgICAgICAgbnggPSAtMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGN1cnJMaW5rID0gZ2V0TGluayhkZXN0W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIGZvdW5kIGEgbGFtL2FsZWYgcGFpciBpbiB0aGUgYnVmZmVyCisgICAgICAgIC8vIGNhbGwgaGFuZGxlR2VuZXJhdGVkU3BhY2VzIHRvIHJlbW92ZSB0aGUgc3BhY2VzIHRoYXQgd2VyZSBhZGRlZAorCisgICAgICAgIGRlc3RTaXplID0gbGVuZ3RoOworICAgICAgICBpZiAobGFtYWxlZl9mb3VuZCB8fCB0YXNoa2VlbF9mb3VuZCkgeworICAgICAgICAgICAgZGVzdFNpemUgPSBoYW5kbGVHZW5lcmF0ZWRTcGFjZXMoZGVzdCwgc3RhcnQsIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlZW5mYW1fZm91bmQgfHwgeWVoaGFtemFfZm91bmQpeworICAgICAgICAgICAgZGVzdFNpemUgPSBleHBhbmRDb21wb3NpdENoYXIoZGVzdCwgc3RhcnQsIGRlc3RTaXplLCBsYW1hbGVmX2NvdW50LCBTSEFQRV9NT0RFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVzdFNpemU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogZGVTaGFwZVVuaWNvZGUKKyAgICAgKiBGdW5jdGlvbjogQ29udmVydHMgYW4gQXJhYmljIFVuaWNvZGUgYnVmZmVyIGluIEZFeHggUmFuZ2UgaW50byB1bnNoYXBlZAorICAgICAqICAgICAgICAgICBhcmFiaWMgVW5pY29kZSBidWZmZXIgaW4gMDZ4eCBSYW5nZQorICAgICAqLworICAgIHByaXZhdGUgaW50IGRlU2hhcGVVbmljb2RlKGNoYXJbXSBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0U2l6ZSkgdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24geworCisgICAgICAgIGludCBsYW1hbGVmX2NvdW50ID0gZGVzaGFwZU5vcm1hbGl6ZShkZXN0LCBzdGFydCwgbGVuZ3RoKTsKKworICAgICAgICAvLyBJZiB0aGVyZSB3YXMgYSBsYW1hbGVmIGluIHRoZSBidWZmZXIgY2FsbCBleHBhbmRMYW1BbGVmCisgICAgICAgIGlmIChsYW1hbGVmX2NvdW50ICE9IDApIHsKKyAgICAgICAgICAgIC8vIG5lZWQgdG8gYWRqdXN0IGRlc3QgdG8gZml0IGV4cGFuZGVkIGJ1ZmZlci4uLiAhISEKKyAgICAgICAgICAgIGRlc3RTaXplID0gZXhwYW5kQ29tcG9zaXRDaGFyKGRlc3QsIHN0YXJ0LCBsZW5ndGgsIGxhbWFsZWZfY291bnQsREVTSEFQRV9NT0RFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3RTaXplID0gbGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRlc3RTaXplOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGludGVybmFsU2hhcGUoY2hhcltdIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0U3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdFNpemUpIHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoc291cmNlTGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlc3RTaXplID09IDApIHsKKyAgICAgICAgICAgIGlmICgoKG9wdGlvbnMgJiBMRVRURVJTX01BU0spICE9IExFVFRFUlNfTk9PUCkgJiYKKyAgICAgICAgICAgICAgICAoKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spID09IExBTUFMRUZfUkVTSVpFKSkgeworCisgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZVNpemUoc291cmNlLCBzb3VyY2VTdGFydCwgc291cmNlTGVuZ3RoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZUxlbmd0aDsgLy8gYnkgZGVmaW5pdGlvbgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYWx3YXlzIHVzZSB0ZW1wIGJ1ZmZlcgorICAgICAgICBjaGFyW10gdGVtcCA9IG5ldyBjaGFyW3NvdXJjZUxlbmd0aCAqIDJdOyAvLyBhbGwgbGFtYWxlZnMgcmVxdWlyaW5nIGV4cGFuc2lvbgorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHNvdXJjZSwgc291cmNlU3RhcnQsIHRlbXAsIDAsIHNvdXJjZUxlbmd0aCk7CisKKyAgICAgICAgaWYgKGlzTG9naWNhbCkgeworICAgICAgICAgICAgaW52ZXJ0QnVmZmVyKHRlbXAsIDAsIHNvdXJjZUxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgb3V0cHV0U2l6ZSA9IHNvdXJjZUxlbmd0aDsKKworICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBMRVRURVJTX01BU0spIHsKKyAgICAgICAgY2FzZSBMRVRURVJTX1NIQVBFX1RBU0hLRUVMX0lTT0xBVEVEOgorICAgICAgICAgICAgb3V0cHV0U2l6ZSA9IHNoYXBlVW5pY29kZSh0ZW1wLCAwLCBzb3VyY2VMZW5ndGgsIGRlc3RTaXplLCAxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTEVUVEVSU19TSEFQRToKKyAgICAgICAgICAgIGlmKCAoKG9wdGlvbnMmVEFTSEtFRUxfTUFTSyk+IDApICYmCisgICAgICAgICAgICAgICAgKChvcHRpb25zJlRBU0hLRUVMX01BU0spICE9VEFTSEtFRUxfUkVQTEFDRV9CWV9UQVRXRUVMKSkgeworICAgICAgICAgICAgICAgICAgIC8qIENhbGwgdGhlIHNoYXBpbmcgZnVuY3Rpb24gd2l0aCB0YXNoa2VlbCBmbGFnID09IDIgZm9yIHJlbW92YWwgb2YgdGFzaGtlZWwgKi8KKyAgICAgICAgICAgICAgICBvdXRwdXRTaXplID0gc2hhcGVVbmljb2RlKHRlbXAsIDAsIHNvdXJjZUxlbmd0aCwgZGVzdFNpemUsIDIpOworICAgICAgICAgICAgICAgIH1lbHNlIHsKKyAgICAgICAgICAgICAgICAgICAvL2RlZmF1bHQgQ2FsbCB0aGUgc2hhcGluZyBmdW5jdGlvbiB3aXRoIHRhc2hrZWVsIGZsYWcgPT0gMSAqLworICAgICAgICAgICAgICAgICAgICBvdXRwdXRTaXplID0gc2hhcGVVbmljb2RlKHRlbXAsIDAsIHNvdXJjZUxlbmd0aCwgZGVzdFNpemUsIDApOworCisgICAgICAgICAgICAgICAgICAgLypBZnRlciBzaGFwaW5nIHRleHQgY2hlY2sgaWYgdXNlciB3YW50cyB0byByZW1vdmUgdGFzaGtlZWwgYW5kIHJlcGxhY2UgaXQgd2l0aCB0YXR3ZWVsKi8KKyAgICAgICAgICAgICAgICAgICBpZiggKG9wdGlvbnMmVEFTSEtFRUxfTUFTSykgPT0gVEFTSEtFRUxfUkVQTEFDRV9CWV9UQVRXRUVMKXsKKyAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U2l6ZSA9IGhhbmRsZVRhc2hrZWVsV2l0aFRhdHdlZWwodGVtcCxzb3VyY2VMZW5ndGgpOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTEVUVEVSU19VTlNIQVBFOgorICAgICAgICAgICAgb3V0cHV0U2l6ZSA9IGRlU2hhcGVVbmljb2RlKHRlbXAsIDAsIHNvdXJjZUxlbmd0aCwgZGVzdFNpemUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dHB1dFNpemUgPiBkZXN0U2l6ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIm5vdCBlbm91Z2ggcm9vbSBmb3IgcmVzdWx0IGRhdGEiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgob3B0aW9ucyAmIERJR0lUU19NQVNLKSAhPSBESUdJVFNfTk9PUCkgeworICAgICAgICAgICAgY2hhciBkaWdpdEJhc2UgPSAnXHUwMDMwJzsgLy8gRXVyb3BlYW4gZGlnaXRzCisgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBESUdJVF9UWVBFX01BU0spIHsKKyAgICAgICAgICAgIGNhc2UgRElHSVRfVFlQRV9BTjoKKyAgICAgICAgICAgICAgICBkaWdpdEJhc2UgPSAnXHUwNjYwJzsgIC8vIEFyYWJpYy1JbmRpYyBkaWdpdHMKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBESUdJVF9UWVBFX0FOX0VYVEVOREVEOgorICAgICAgICAgICAgICAgIGRpZ2l0QmFzZSA9ICdcdTA2ZjAnOyAgLy8gRWFzdGVybiBBcmFiaWMtSW5kaWMgZGlnaXRzIChQZXJzaWFuIGFuZCBVcmR1KQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBESUdJVFNfTUFTSykgeworICAgICAgICAgICAgY2FzZSBESUdJVFNfRU4yQU46CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgZGlnaXREZWx0YSA9IGRpZ2l0QmFzZSAtICdcdTAwMzAnOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dFNpemU7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IHRlbXBbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPD0gJ1x1MDAzOScgJiYgY2ggPj0gJ1x1MDAzMCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wW2ldICs9IGRpZ2l0RGVsdGE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgRElHSVRTX0FOMkVOOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBkaWdpdFRvcCA9IChjaGFyKShkaWdpdEJhc2UgKyA5KTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRpZ2l0RGVsdGEgPSAnXHUwMDMwJyAtIGRpZ2l0QmFzZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdXRwdXRTaXplOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY2ggPSB0ZW1wW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoIDw9IGRpZ2l0VG9wICYmIGNoID49IGRpZ2l0QmFzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBbaV0gKz0gZGlnaXREZWx0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBESUdJVFNfRU4yQU5fSU5JVF9MUjoKKyAgICAgICAgICAgICAgICBzaGFwZVRvQXJhYmljRGlnaXRzV2l0aENvbnRleHQodGVtcCwgMCwgb3V0cHV0U2l6ZSwgZGlnaXRCYXNlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgRElHSVRTX0VOMkFOX0lOSVRfQUw6CisgICAgICAgICAgICAgICAgc2hhcGVUb0FyYWJpY0RpZ2l0c1dpdGhDb250ZXh0KHRlbXAsIDAsIG91dHB1dFNpemUsIGRpZ2l0QmFzZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNMb2dpY2FsKSB7CisgICAgICAgICAgICBpbnZlcnRCdWZmZXIodGVtcCwgMCwgb3V0cHV0U2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIGRlc3QsIGRlc3RTdGFydCwgb3V0cHV0U2l6ZSk7CisKKyAgICAgICAgcmV0dXJuIG91dHB1dFNpemU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICAgICAgICAgIHN1cGVyKG1zZyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pY3U0ai9saWNlbnNlLmh0bWwgYi9pY3U0ai9saWNlbnNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkwNWRkZgotLS0gL2Rldi9udWxsCisrKyBiL2ljdTRqL2xpY2Vuc2UuaHRtbApAQCAtMCwwICsxLDUxIEBACis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSI+PC9tZXRhPgorPHRpdGxlPklDVSBMaWNlbnNlIC0gSUNVIDEuOC4xIGFuZCBsYXRlcjwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IEJHQ09MT1I9IiNmZmZmZmYiPgorPGgyPklDVSBMaWNlbnNlIC0gSUNVIDEuOC4xIGFuZCBsYXRlcjwvaDI+CisKKzxwPkNPUFlSSUdIVCBBTkQgUEVSTUlTU0lPTiBOT1RJQ0U8L3A+CisKKzxwPgorQ29weXJpZ2h0IChjKSAxOTk1LTIwMDYgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzCis8L3A+Cis8cD4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuCis8L3A+Cis8cD4KK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAordG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgordGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMKK3RvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKK2NvcHlyaWdodCBub3RpY2UocykgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMKK29mIHRoZSBTb2Z0d2FyZSBhbmQgdGhhdCBib3RoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlKHMpIGFuZCB0aGlzCitwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLgorPC9wPgorPHA+CitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCAKK0lOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuIElOIE5PIEVWRU5UIFNIQUxMCitUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBIT0xERVJTIElOQ0xVREVEIElOIFRISVMgTk9USUNFIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSCitSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKK05FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCitVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKzwvcD4KKzxwPgorRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgYSBjb3B5cmlnaHQgaG9sZGVyIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluCit0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyLgorPC9wPgorCis8aHI+Cis8cD48c21hbGw+CitBbGwgdHJhZGVtYXJrcyBhbmQgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG1lbnRpb25lZCBoZXJlaW4gYXJlIHRoZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKzwvc21hbGw+PC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCBiL2luY2x1ZGUvYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgKaW5kZXggMDlmMGRlMS4uMjJjOWI3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaAorKysgYi9pbmNsdWRlL2FuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oCkBAIC0zMCw3ICszMCw5IEBACiAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewotICAgIAorCitjbGFzcyBDdXJzb3JXaW5kb3c7CisKIGNsYXNzIEFuZHJvaWRSdW50aW1lCiB7CiBwdWJsaWM6CkBAIC0xMjIsNiArMTI0LDggQEAKIC8vIFJldHVybnMgdGhlIFVuaXggZmlsZSBkZXNjcmlwdG9yIGZvciBhIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9iamVjdAogZXh0ZXJuIGludCBnZXRQYXJjZWxGaWxlRGVzY3JpcHRvckZEKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCk7CiAKK2V4dGVybiBDdXJzb3JXaW5kb3cgKiBnZXRfd2luZG93X2Zyb21fb2JqZWN0KEpOSUVudiAqIGVudiwgam9iamVjdCBqYXZhV2luZG93KTsKKwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYmluZGVyL0N1cnNvcldpbmRvdy5oIGIvaW5jbHVkZS9iaW5kZXIvQ3Vyc29yV2luZG93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiZmYyYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYmluZGVyL0N1cnNvcldpbmRvdy5oCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfQU5EUk9JRF9fREFUQUJBU0VfV0lORE9XX0gKKyNkZWZpbmUgX0FORFJPSURfX0RBVEFCQVNFX1dJTkRPV19ICisKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2RlZmluZSBERUZBVUxUX1dJTkRPV19TSVpFIDQwOTYKKyNkZWZpbmUgTUFYX1dJTkRPV19TSVpFICgxMDI0ICogMTAyNCkKKyNkZWZpbmUgV0lORE9XX0FMTE9DQVRJT05fU0laRSA0MDk2CisKKyNkZWZpbmUgUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MgMTYKKworLy8gUm93IHNsb3RzIGFyZSBhbGxvY2F0ZWQgaW4gY2h1bmtzIG9mIFJPV19TTE9UX0NIVU5LX05VTV9ST1dTLAorLy8gd2l0aCBhbiBvZmZzZXQgYWZ0ZXIgdGhlIHJvd3MgdGhhdCBwb2ludHMgdG8gdGhlIG5leHQgY2h1bmsKKyNkZWZpbmUgUk9XX1NMT1RfQ0hVTktfU0laRSAoKFJPV19TTE9UX0NIVU5LX05VTV9ST1dTICogc2l6ZW9mKHJvd19zbG90X3QpKSArIHNpemVvZih1aW50MzJfdCkpCisKKworI2lmIExPR19OREVCVUcKKworI2RlZmluZSBJRl9MT0dfV0lORE9XKCkgaWYgKGZhbHNlKQorI2RlZmluZSBMT0dfV0lORE9XKC4uLikKKworI2Vsc2UKKworI2RlZmluZSBJRl9MT0dfV0lORE9XKCkgSUZfTE9HKExPR19ERUJVRywgIkN1cnNvcldpbmRvdyIpCisjZGVmaW5lIExPR19XSU5ET1coLi4uKSBMT0coTE9HX0RFQlVHLCAiQ3Vyc29yV2luZG93IiwgX19WQV9BUkdTX18pCisKKyNlbmRpZgorCisKKy8vIFdoZW4gZGVmaW5lZCB0byB0cnVlIHN0cmluZ3MgYXJlIHN0b3JlZCBhcyBVVEY4LCBvdGhlcndpc2UgdGhleSdyZSBVVEYxNgorI2RlZmluZSBXSU5ET1dfU1RPUkFHRV9VVEY4IDEKKworLy8gV2hlbiBkZWZpbmVkIHRvIHRydWUgbnVtYmVyaWMgdmFsdWVzIGFyZSBzdG9yZWQgaW5saW5lIGluIHRoZSBmaWVsZF9zbG90X3QsIG90aGVyd2lzZSB0aGV5J3JlIGFsbG9jYXRlZCBpbiB0aGUgd2luZG93CisjZGVmaW5lIFdJTkRPV19TVE9SQUdFX0lOTElORV9OVU1FUklDUyAxCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50MzJfdCBudW1Sb3dzOworICAgIHVpbnQzMl90IG51bUNvbHVtbnM7Cit9IHdpbmRvd19oZWFkZXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50MzJfdCBvZmZzZXQ7Cit9IHJvd19zbG90X3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCB0eXBlOworICAgIHVuaW9uIHsKKyAgICAgICAgZG91YmxlIGQ7CisgICAgICAgIGludDY0X3QgbDsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICAgICAgICAgIHVpbnQzMl90IHNpemU7CisgICAgICAgIH0gYnVmZmVyOworICAgIH0gZGF0YTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgZmllbGRfc2xvdF90OworCisjZGVmaW5lIEZJRUxEX1RZUEVfTlVMTCAwCisjZGVmaW5lIEZJRUxEX1RZUEVfSU5URUdFUiAxCisjZGVmaW5lIEZJRUxEX1RZUEVfRkxPQVQgMgorI2RlZmluZSBGSUVMRF9UWVBFX1NUUklORyAzCisjZGVmaW5lIEZJRUxEX1RZUEVfQkxPQiA0CisKKy8qKgorICogVGhpcyBjbGFzcyBzdG9yZXMgYSBzZXQgb2Ygcm93cyBmcm9tIGEgZGF0YWJhc2UgaW4gYSBidWZmZXIuIFRoZSBiZWdpbmluZyBvZiB0aGUKKyAqIHdpbmRvdyBoYXMgZmlyc3QgY2h1bmsgb2Ygcm93X3Nsb3RfdHMsIHdoaWNoIGFyZSBvZmZzZXRzIHRvIHRoZSByb3cgZGlyZWN0b3J5LCBmb2xsb3dlZCBieQorICogYW4gb2Zmc2V0IHRvIHRoZSBuZXh0IGNodW5rIGluIGEgbGlua2VkLWxpc3Qgb2YgYWRkaXRpb25hbCBjaHVuayBvZiByb3dfc2xvdF90cyBpbiBjYXNlCisgKiB0aGUgcHJlLWFsbG9jYXRlZCBjaHVuayBpc24ndCBiaWcgZW5vdWdoIHRvIHJlZmVyIHRvIGFsbCByb3dzLiBFYWNoIHJvdyBkaXJlY3RvcnkgaGFzIGEKKyAqIGZpZWxkX3Nsb3RfdCBwZXIgY29sdW1uLCB3aGljaCBoYXMgdGhlIHNpemUsIG9mZnNldCwgYW5kIHR5cGUgb2YgdGhlIGRhdGEgZm9yIHRoYXQgZmllbGQuCisgKiBOb3RlIHRoYXQgdGhlIGRhdGEgdHlwZXMgY29tZSBmcm9tIHNxbGl0ZTMuaC4KKyAqLworY2xhc3MgQ3Vyc29yV2luZG93Cit7CitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBDdXJzb3JXaW5kb3coc2l6ZV90IG1heFNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgQ3Vyc29yV2luZG93KCl7fQorICAgIGJvb2wgICAgICAgICAgICAgICAgc2V0TWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+Jik7CisgICAgICAgICAgICAgICAgICAgICAgICB+Q3Vyc29yV2luZG93KCk7CisKKyAgICBib29sICAgICAgICAgICAgICAgIGluaXRCdWZmZXIoYm9vbCBsb2NhbE9ubHkpOworICAgIHNwPElNZW1vcnk+ICAgICAgICAgZ2V0TWVtb3J5KCkge3JldHVybiBtTWVtb3J5O30KKworICAgIHNpemVfdCAgICAgICAgICAgICAgc2l6ZSgpIHtyZXR1cm4gbVNpemU7fQorICAgIHVpbnQ4X3QgKiAgICAgICAgICAgZGF0YSgpIHtyZXR1cm4gbURhdGE7fQorICAgIHVpbnQzMl90ICAgICAgICAgICAgZ2V0TnVtUm93cygpIHtyZXR1cm4gbUhlYWRlci0+bnVtUm93czt9CisgICAgdWludDMyX3QgICAgICAgICAgICBnZXROdW1Db2x1bW5zKCkge3JldHVybiBtSGVhZGVyLT5udW1Db2x1bW5zO30KKyAgICB2b2lkICAgICAgICAgICAgICAgIGZyZWVMYXN0Um93KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSGVhZGVyLT5udW1Sb3dzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5udW1Sb3dzLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGJvb2wgICAgICAgICAgICAgICAgc2V0TnVtQ29sdW1ucyh1aW50MzJfdCBudW1Db2x1bW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY3VyID0gbUhlYWRlci0+bnVtQ29sdW1uczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ciA+IDAgJiYgY3VyICE9IG51bUNvbHVtbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIlRyeWluZyB0byBnbyBmcm9tICVkIGNvbHVtbnMgdG8gJWQiLCBjdXIsIG51bUNvbHVtbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICBpbnQzMl90ICAgICAgICAgICAgIGZyZWVTcGFjZSgpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBjbGVhcigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIGEgcm93IHNsb3QgYW5kIGl0cyBkaXJlY3RvcnkuIFRoZSByZXR1cm5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICogcG9pbnRlciBwb2ludHMgdG8gdGhlIGJlZ2luaW5nIG9mIHRoZSByb3cncyBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIG9yIE5VTEwgaWYgdGhlcmUgd2Fzbid0IHJvb20uIFRoZSBkaXJlY3RvcnkgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGluaXRpYWxpZWQgd2l0aCBOVUxMIGVudHJpZXMgZm9yIGVhY2ggZmllbGQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBmaWVsZF9zbG90X3QgKiAgICAgIGFsbG9jUm93KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgICAgICogQWxsb2NhdGUgYSBwb3J0aW9uIG9mIHRoZSB3aW5kb3cuIFJldHVybnMgdGhlIG9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgdGhlIGFsbG9jYXRpb24sIG9yIDAgaWYgdGhlcmUgaXNuJ3QgZW5vdWdoIHNwYWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICogSWYgYWxpZ25lZCBpcyB0cnVlLCB0aGUgYWxsb2NhdGlvbiBnZXRzIDQgYnl0ZSBhbGlnbm1lbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1aW50MzJfdCAgICAgICAgICAgIGFsbG9jKHNpemVfdCBzaXplLCBib29sIGFsaWduZWQgPSBmYWxzZSk7CisKKyAgICB1aW50MzJfdCAgICAgICAgICAgIHJlYWRfZmllbGRfc2xvdChpbnQgcm93LCBpbnQgY29sdW1uLCBmaWVsZF9zbG90X3QgKiBzbG90KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBDb3B5IGRhdGEgaW50byB0aGUgd2luZG93IGF0IHRoZSBnaXZlbiBvZmZzZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgIGNvcHlJbih1aW50MzJfdCBvZmZzZXQsIHVpbnQ4X3QgY29uc3QgKiBkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCBpbnQ2NF90IGRhdGEpOworICAgIHZvaWQgICAgICAgICAgICAgICAgY29weUluKHVpbnQzMl90IG9mZnNldCwgZG91YmxlIGRhdGEpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBjb3B5T3V0KHVpbnQzMl90IG9mZnNldCwgdWludDhfdCAqIGRhdGEsIHNpemVfdCBzaXplKTsKKyAgICBpbnQ2NF90ICAgICAgICAgICAgIGNvcHlPdXRMb25nKHVpbnQzMl90IG9mZnNldCk7CisgICAgZG91YmxlICAgICAgICAgICAgICBjb3B5T3V0RG91YmxlKHVpbnQzMl90IG9mZnNldCk7CisKKyAgICBib29sICAgICAgICAgICAgICAgIHB1dExvbmcodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgaW50NjRfdCB2YWx1ZSk7CisgICAgYm9vbCAgICAgICAgICAgICAgICBwdXREb3VibGUodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgZG91YmxlIHZhbHVlKTsKKyAgICBib29sICAgICAgICAgICAgICAgIHB1dE51bGwodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCk7CisKKyAgICBib29sICAgICAgICAgICAgICAgIGdldExvbmcodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgaW50NjRfdCAqIHZhbHVlT3V0KTsKKyAgICBib29sICAgICAgICAgICAgICAgIGdldERvdWJsZSh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBkb3VibGUgKiB2YWx1ZU91dCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICBnZXROdWxsKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGJvb2wgKiB2YWx1ZU91dCk7CisKKyAgICB1aW50OF90ICogICAgICAgICAgIG9mZnNldFRvUHRyKHVpbnQzMl90IG9mZnNldCkge3JldHVybiBtRGF0YSArIG9mZnNldDt9CisKKyAgICByb3dfc2xvdF90ICogICAgICAgIGFsbG9jUm93U2xvdCgpOworCisgICAgcm93X3Nsb3RfdCAqICAgICAgICBnZXRSb3dTbG90KGludCByb3cpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHJldHVybiBOVUxMIGlmIEZhaWxlZCB0byBmaW5kIHJvd1Nsb3Qgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIEludmFsaWQgcm93U2xvdAorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgZmllbGRfc2xvdF90ICogICAgICBnZXRGaWVsZFNsb3RXaXRoQ2hlY2soaW50IHJvdywgaW50IGNvbHVtbik7CisgICAgZmllbGRfc2xvdF90ICogICAgICBnZXRGaWVsZFNsb3QoaW50IHJvdywgaW50IGNvbHVtbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZERpck9mZnNldCA9IGdldFJvd1Nsb3Qocm93KS0+b2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChmaWVsZF9zbG90X3QgKilvZmZzZXRUb1B0cihmaWVsZERpck9mZnNldCkpICsgY29sdW1uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworcHJpdmF0ZToKKyAgICB1aW50OF90ICogbURhdGE7CisgICAgc2l6ZV90IG1TaXplOworICAgIHNpemVfdCBtTWF4U2l6ZTsKKyAgICB3aW5kb3dfaGVhZGVyX3QgKiBtSGVhZGVyOworICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7CisKKyAgICAvKioKKyAgICAgKiBPZmZzZXQgb2YgdGhlIGxvd2VzdCB1bnVzZWQgZGF0YSBieXRlIGluIHRoZSBhcnJheS4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBtRnJlZU9mZnNldDsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmggYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaAppbmRleCA5NjQ3MDBiLi5mN2IzYjQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaApAQCAtMjIsOCArMjIsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIElTdXJmYWNlOwotCiAvKgogICogQSBzZXQgb2YgYml0IG1hc2tzIGZvciBzcGVjaWZ5aW5nIGhvdyB0aGUgcmVjZWl2ZWQgcHJldmlldyBmcmFtZXMgYXJlCiAgKiBoYW5kbGVkIGJlZm9yZSB0aGUgcHJldmlld0NhbGxiYWNrKCkgY2FsbC4KQEAgLTg0LDYgKzgyLDE0IEBACiAgICAgQ0FNRVJBX0NNRF9TVEFSVF9TTU9PVEhfWk9PTSAgICAgPSAxLAogICAgIENBTUVSQV9DTURfU1RPUF9TTU9PVEhfWk9PTSAgICAgID0gMiwKICAgICBDQU1FUkFfQ01EX1NFVF9ESVNQTEFZX09SSUVOVEFUSU9OID0gMywKKworICAgIC8vIGNtZFR5cGUgdG8gZGlzYWJsZS9lbmFibGUgc2h1dHRlciBzb3VuZC4KKyAgICAvLyBJbiBzZW5kQ29tbWFuZCBwYXNzaW5nIGFyZzEgPSAwIHdpbGwgZGlzYWJsZSwKKyAgICAvLyB3aGlsZSBwYXNzaW5nIGFyZzEgPSAxIHdpbGwgZW5hYmxlIHRoZSBzaHV0dGVyIHNvdW5kLgorICAgIENBTUVSQV9DTURfRU5BQkxFX1NIVVRURVJfU09VTkQgPSA0LAorCisgICAgLy8gY21kVHlwZSB0byBwbGF5IHJlY29yZGluZyBzb3VuZC4KKyAgICBDQU1FUkFfQ01EX1BMQVlfUkVDT1JESU5HX1NPVU5EID0gNSwKIH07CiAKIC8vIGNhbWVyYSBmYXRhbCBlcnJvcnMKQEAgLTE1Miw5ICsxNTgsOCBAQAogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRTdGF0dXMoKSB7IHJldHVybiBtU3RhdHVzOyB9CiAKLSAgICAgICAgICAgIC8vIHBhc3MgdGhlIGJ1ZmZlcmVkIElTdXJmYWNlIHRvIHRoZSBjYW1lcmEgc2VydmljZQorICAgICAgICAgICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgU3VyZmFjZSB0byB0aGUgY2FtZXJhIHNlcnZpY2UKICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CiAKICAgICAgICAgICAgIC8vIHN0YXJ0IHByZXZpZXcgbW9kZSwgbXVzdCBjYWxsIHNldFByZXZpZXdEaXNwbGF5IGZpcnN0CiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzdGFydFByZXZpZXcoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmggYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCmluZGV4IDZhNjZlM2MuLjNhNzdkZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NBTUVSQV9IQVJEV0FSRV9JTlRFUkZBQ0VfSAogCiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDx1aS9lZ2wvYW5kcm9pZF9uYXRpdmVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lTdXJmYWNlLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYS5oPgpAQCAtODYsOCArODcsOCBAQAogcHVibGljOgogICAgIHZpcnR1YWwgfkNhbWVyYUhhcmR3YXJlSW50ZXJmYWNlKCkgeyB9CiAKLSAgICAvKiogUmV0dXJuIHRoZSBJTWVtb3J5SGVhcCBmb3IgdGhlIHByZXZpZXcgaW1hZ2UgaGVhcCAqLwotICAgIHZpcnR1YWwgc3A8SU1lbW9yeUhlYXA+ICAgICAgICAgZ2V0UHJldmlld0hlYXAoKSBjb25zdCA9IDA7CisgICAgLyoqIFNldCB0aGUgQU5hdGl2ZVdpbmRvdyB0byB3aGljaCBwcmV2aWV3IGZyYW1lcyBhcmUgc2VudCAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJldmlld1dpbmRvdyhjb25zdCBzcDxBTmF0aXZlV2luZG93PiYgYnVmKSA9IDA7CiAKICAgICAvKiogUmV0dXJuIHRoZSBJTWVtb3J5SGVhcCBmb3IgdGhlIHJhdyBpbWFnZSBoZWFwICovCiAgICAgdmlydHVhbCBzcDxJTWVtb3J5SGVhcD4gICAgICAgICBnZXRSYXdIZWFwKCkgY29uc3QgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oCmluZGV4IDUzMDM5YTAuLjYwMDMxYTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmgKQEAgLTU5LDYgKzU5LDI3IEBACiAgICAgdm9pZCBzZXRQcmV2aWV3U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogICAgIHZvaWQgZ2V0UHJldmlld1NpemUoaW50ICp3aWR0aCwgaW50ICpoZWlnaHQpIGNvbnN0OwogICAgIHZvaWQgZ2V0U3VwcG9ydGVkUHJldmlld1NpemVzKFZlY3RvcjxTaXplPiAmc2l6ZXMpIGNvbnN0OworCisgICAgLy8gU2V0IHRoZSBkaW1lbnNpb25zIGluIHBpeGVscyB0byB0aGUgZ2l2ZW4gd2lkdGggYW5kIGhlaWdodAorICAgIC8vIGZvciB2aWRlbyBmcmFtZXMuIFRoZSBnaXZlbiB3aWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgb25lCisgICAgLy8gb2YgdGhlIHN1cHBvcnRlZCBkaW1lbnNpb25zIHJldHVybmVkIGZyb20KKyAgICAvLyBnZXRTdXBwb3J0ZWRWaWRlb1NpemVzKCkuIE11c3Qgbm90IGJlIGNhbGxlZCBpZgorICAgIC8vIGdldFN1cHBvcnRlZFZpZGVvU2l6ZXMoKSByZXR1cm5zIGFuIGVtcHR5IFZlY3RvciBvZiBTaXplLgorICAgIHZvaWQgc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CisgICAgLy8gUmV0cmlldmUgdGhlIGN1cnJlbnQgZGltZW5zaW9ucyAod2lkdGggYW5kIGhlaWdodCkKKyAgICAvLyBpbiBwaXhlbHMgZm9yIHZpZGVvIGZyYW1lcywgd2hpY2ggbXVzdCBiZSBvbmUgb2YgdGhlCisgICAgLy8gc3VwcG9ydGVkIGRpbWVuc2lvbnMgcmV0dXJuZWQgZnJvbSBnZXRTdXBwb3J0ZWRWaWRlb1NpemVzKCkuCisgICAgLy8gTXVzdCBub3QgYmUgY2FsbGVkIGlmIGdldFN1cHBvcnRlZFZpZGVvU2l6ZXMoKSByZXR1cm5zIGFuCisgICAgLy8gZW1wdHkgVmVjdG9yIG9mIFNpemUuCisgICAgdm9pZCBnZXRWaWRlb1NpemUoaW50ICp3aWR0aCwgaW50ICpoZWlnaHQpIGNvbnN0OworICAgIC8vIFJldHJpZXZlIGEgVmVjdG9yIG9mIHN1cHBvcnRlZCBkaW1lbnNpb25zICh3aWR0aCBhbmQgaGVpZ2h0KQorICAgIC8vIGluIHBpeGVscyBmb3IgdmlkZW8gZnJhbWVzLiBJZiBzaXplcyByZXR1cm5lZCBmcm9tIHRoZSBtZXRob2QKKyAgICAvLyBpcyBlbXB0eSwgdGhlIGNhbWVyYSBkb2VzIG5vdCBzdXBwb3J0IGNhbGxzIHRvIHNldFZpZGVvU2l6ZSgpCisgICAgLy8gb3IgZ2V0VmlkZW9TaXplKCkuIEluIGFkZGRpdGlvbiwgaXQgYWxzbyBpbmRpY2F0ZXMgdGhhdAorICAgIC8vIHRoZSBjYW1lcmEgb25seSBoYXMgYSBzaW5nbGUgb3V0cHV0LCBhbmQgZG9lcyBub3QgaGF2ZQorICAgIC8vIHNlcGFyYXRlIG91dHB1dCBmb3IgdmlkZW8gZnJhbWVzIGFuZCBwcmV2aWV3IGZyYW1lLgorICAgIHZvaWQgZ2V0U3VwcG9ydGVkVmlkZW9TaXplcyhWZWN0b3I8U2l6ZT4gJnNpemVzKSBjb25zdDsKKwogICAgIHZvaWQgc2V0UHJldmlld0ZyYW1lUmF0ZShpbnQgZnBzKTsKICAgICBpbnQgZ2V0UHJldmlld0ZyYW1lUmF0ZSgpIGNvbnN0OwogICAgIHZvaWQgZ2V0UHJldmlld0Zwc1JhbmdlKGludCAqbWluX2ZwcywgaW50ICptYXhfZnBzKSBjb25zdDsKQEAgLTI4MSw2ICszMDIsMTYgQEAKICAgICAvLyBFeGFtcGxlIHZhbHVlOiAiMC45NSwxLjksSW5maW5pdHkiIG9yICIwLjA0OSwwLjA1LDAuMDUxIi4gUmVhZCBvbmx5LgogICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9GT0NVU19ESVNUQU5DRVNbXTsKIAorICAgIC8vIFRoZSBjdXJyZW50IGRpbWVuc2lvbnMgaW4gcGl4ZWxzICh3aWR0aCB4IGhlaWdodCkgZm9yIHZpZGVvIGZyYW1lcy4KKyAgICAvLyBUaGUgd2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIG9uZSBvZiB0aGUgc3VwcG9ydGVkIHNpemVzIHJldHJpZXZlZAorICAgIC8vIHZpYSBLRVlfU1VQUE9SVEVEX1ZJREVPX1NJWkVTLgorICAgIC8vIEV4YW1wbGUgdmFsdWU6ICIxMjgweDcyMCIuIFJlYWQvd3JpdGUuCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1ZJREVPX1NJWkVbXTsKKyAgICAvLyBBIGxpc3Qgb2YgdGhlIHN1cHBvcnRlZCBkaW1lbnNpb25zIGluIHBpeGVscyAod2lkdGggeCBoZWlnaHQpCisgICAgLy8gZm9yIHZpZGVvIGZyYW1lcy4gU2VlIENBTUVSQV9NU0dfVklERU9fRlJBTUUgZm9yIGRldGFpbHMgaW4KKyAgICAvLyBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmguCisgICAgLy8gRXhhbXBsZTogIjE3NngxNDQsMTI4MHg3MjAiLiBSZWFkIG9ubHkuCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1NVUFBPUlRFRF9WSURFT19TSVpFU1tdOwogICAgIC8vIFRoZSBpbWFnZSBmb3JtYXQgZm9yIHZpZGVvIGZyYW1lcy4gU2VlIENBTUVSQV9NU0dfVklERU9fRlJBTUUgaW4KICAgICAvLyBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmguCiAgICAgLy8gRXhhbXBsZSB2YWx1ZTogInl1djQyMHNwIiBvciBQSVhFTF9GT1JNQVRfWFhYIGNvbnN0YW50cy4gUmVhZCBvbmx5LgpAQCAtMzU0LDcgKzM4NSwxMCBAQAogICAgIC8vIGZvciBiYXJjb2RlIHJlYWRpbmcuCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgU0NFTkVfTU9ERV9CQVJDT0RFW107CiAKLSAgICAvLyBGb3JtYXRzIGZvciBzZXRQcmV2aWV3Rm9ybWF0IGFuZCBzZXRQaWN0dXJlRm9ybWF0LgorICAgIC8vIFBpeGVsIGNvbG9yIGZvcm1hdHMgZm9yIEtFWV9QUkVWSUVXX0ZPUk1BVCwgS0VZX1BJQ1RVUkVfRk9STUFULAorICAgIC8vIGFuZCBLRVlfVklERU9fRlJBTUVfRk9STUFUCisgICAgLy8gUGxhbmFyIHZhcmlhbnQgb2YgdGhlIFlVVjQyMCBjb2xvciBmb3JtYXQKKyAgICBzdGF0aWMgY29uc3QgY2hhciBQSVhFTF9GT1JNQVRfWVVWNDIwUFtdOwogICAgIHN0YXRpYyBjb25zdCBjaGFyIFBJWEVMX0ZPUk1BVF9ZVVY0MjJTUFtdOwogICAgIHN0YXRpYyBjb25zdCBjaGFyIFBJWEVMX0ZPUk1BVF9ZVVY0MjBTUFtdOyAvLyBOVjIxCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgUElYRUxfRk9STUFUX1lVVjQyMklbXTsgLy8gWVVZMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYS5oIGIvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYS5oCmluZGV4IDZmY2Y5ZTUuLjhiY2VlYTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmEuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhLmgKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KKyNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYS5oPgpAQCAtNDUsOCArNDUsOCBAQAogICAgIC8vIGFsbG93IG90aGVyIHByb2Nlc3NlcyB0byB1c2UgdGhpcyBJQ2FtZXJhIGludGVyZmFjZQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHVubG9jaygpID0gMDsKIAotICAgIC8vIHBhc3MgdGhlIGJ1ZmZlcmVkIElTdXJmYWNlIHRvIHRoZSBjYW1lcmEgc2VydmljZQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOworICAgIC8vIHBhc3MgdGhlIGJ1ZmZlcmVkIFN1cmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKIAogICAgIC8vIHNldCB0aGUgcHJldmlldyBjYWxsYmFjayBmbGFnIHRvIGFmZmVjdCBob3cgdGhlIHJlY2VpdmVkIGZyYW1lcyBmcm9tCiAgICAgLy8gcHJldmlldyBhcmUgaGFuZGxlZC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCmluZGV4IGFmOWE3ZWQuLmExY2UxMTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaApAQCAtMjUsNiArMjUsNyBAQAogCiBjbGFzcyBQYXJjZWw7CiBjbGFzcyBJU3VyZmFjZTsKK2NsYXNzIFN1cmZhY2U7CiAKIGNsYXNzIElNZWRpYVBsYXllcjogcHVibGljIElJbnRlcmZhY2UKIHsKQEAgLTMzLDcgKzM0LDggQEAKIAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRpc2Nvbm5lY3QoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9JU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBwcmVwYXJlQXN5bmMoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RhcnQoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RvcCgpID0gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaAppbmRleCA1NGFkY2E4Li4yOGJlN2MxIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCkBAIC0yMiw3ICsyMiw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgSVN1cmZhY2U7CitjbGFzcyBTdXJmYWNlOwogY2xhc3MgSUNhbWVyYTsKIGNsYXNzIElNZWRpYVJlY29yZGVyQ2xpZW50OwogCkBAIC0zMiw3ICszMiw3IEBACiAgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShNZWRpYVJlY29yZGVyKTsKIAogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhKSA9IDA7Ci0gICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CisgICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKICAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRWaWRlb1NvdXJjZShpbnQgdnMpID0gMDsKICAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRBdWRpb1NvdXJjZShpbnQgYXMpID0gMDsKICAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRPdXRwdXRGb3JtYXQoaW50IG9mKSA9IDA7CkBAIC00MCw2ICs0MCw3IEBACiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0QXVkaW9FbmNvZGVyKGludCBhZSkgPSAwOwogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldE91dHB1dEZpbGUoY29uc3QgY2hhciogcGF0aCkgPSAwOwogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldE91dHB1dEZpbGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpID0gMDsKKyAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGludCBmZCkgPSAwOwogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpID0gMDsKICAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRWaWRlb0ZyYW1lUmF0ZShpbnQgZnJhbWVzX3Blcl9zZWNvbmQpID0gMDsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcykgPSAwOwpAQCAtNjgsNCArNjksMyBAQAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfSU1FRElBUkVDT1JERVJfSAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lPTVguaCBiL2luY2x1ZGUvbWVkaWEvSU9NWC5oCmluZGV4IDJmNjFjYmUuLjFmOGNlNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU9NWC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSU9NWC5oCkBAIC0xOSw2ICsxOSw3IEBACiAjZGVmaW5lIEFORFJPSURfSU9NWF9IXwogCiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIApAQCAtNzgsMTAgKzc5LDE3IEBACiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9JTkRFWFRZUEUgaW5kZXgsCiAgICAgICAgICAgICBjb25zdCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUdyYXBoaWNCdWZmZXJzKAorICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSkgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCB1c2VCdWZmZXIoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKICAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHVzZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZncmFwaGljQnVmZmVyLCBidWZmZXJfaWQgKmJ1ZmZlcikgPSAwOworCiAgICAgLy8gVGhpcyBBUEkgY2xlYXJseSBvbmx5IG1ha2VzIHNlbnNlIGlmIHRoZSBjYWxsZXIgbGl2ZXMgaW4gdGhlCiAgICAgLy8gc2FtZSBwcm9jZXNzIGFzIHRoZSBjYWxsZWUsIGkuZS4gaXMgdGhlIG1lZGlhX3NlcnZlciwgYXMgdGhlCiAgICAgLy8gcmV0dXJuZWQgImJ1ZmZlcl9kYXRhIiBwb2ludGVyIGlzIGp1c3QgdGhhdCwgYSBwb2ludGVyIGludG8gbG9jYWwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAppbmRleCAzNjYyOTgzLi4xM2M3M2FjIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCkBAIC0zMyw2ICszMyw3IEBACiAKIGNsYXNzIFBhcmNlbDsKIGNsYXNzIElTdXJmYWNlOworY2xhc3MgU3VyZmFjZTsKIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgU29ydGVkVmVjdG9yOwogCkBAIC0xMDQsNyArMTA1LDggQEAKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBwcmVwYXJlKCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZUFzeW5jKCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoKSA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCmluZGV4IGMzY2QzNjEuLmFhOTc4NzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCkBAIC0yNSw3ICsyNSwyMCBAQAogCiBlbnVtIGNhbWNvcmRlcl9xdWFsaXR5IHsKICAgICBDQU1DT1JERVJfUVVBTElUWV9MT1cgID0gMCwKLSAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIID0gMQorICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0ggPSAxLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1FDSUYgPSAyLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0NJRiA9IDMsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfNDgwUCA9IDQsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfNzIwUCA9IDUsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfMTA4MFAgPSA2LAorCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MT1cgID0gMTAwMCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0hJR0ggPSAxMDAxLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfUUNJRiA9IDEwMDIsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9DSUYgPSAxMDAzLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfNDgwUCA9IDEwMDQsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV83MjBQID0gMTAwNSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzEwODBQID0gMTAwNgogfTsKIAogZW51bSB2aWRlb19kZWNvZGVyIHsKQEAgLTY4LDYgKzgxLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KSBjb25zdDsKIAogICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhIHByb2ZpbGUgZm9yIHRoZSBnaXZlbiBjYW1lcmEgYXQgdGhlIGdpdmVuIHF1YWxpdHkgZXhpc3RzLAorICAgICAqIG9yIGZhbHNlIGlmIG5vdC4KKyAgICAgKi8KKyAgICBib29sIGhhc0NhbWNvcmRlclByb2ZpbGUoaW50IGNhbWVyYUlkLCBjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KSBjb25zdDsKKworICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG91dHB1dCBmaWxlIGZvcm1hdHMgc3VwcG9ydGVkLgogICAgICAqLwogICAgIFZlY3RvcjxvdXRwdXRfZm9ybWF0PiBnZXRPdXRwdXRGaWxlRm9ybWF0cygpIGNvbnN0OwpAQCAtMjUyLDYgKzI3MSw4IEBACiAgICAgICAgIFZlY3RvcjxpbnQ+IG1MZXZlbHM7CiAgICAgfTsKIAorICAgIGludCBnZXRDYW1jb3JkZXJQcm9maWxlSW5kZXgoaW50IGNhbWVyYUlkLCBjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KSBjb25zdDsKKwogICAgIC8vIERlYnVnCiAgICAgc3RhdGljIHZvaWQgbG9nVmlkZW9Db2RlYyhjb25zdCBWaWRlb0NvZGVjJiBjb2RlYyk7CiAgICAgc3RhdGljIHZvaWQgbG9nQXVkaW9Db2RlYyhjb25zdCBBdWRpb0NvZGVjJiBjb2RlYyk7CkBAIC0yODEsOCArMzAyLDI1IEBACiAKICAgICAvLyBJZiB0aGUgeG1sIGNvbmZpZ3VyYXRpb24gZmlsZSBkb2VzIG5vdCBleGlzdCwgdXNlIGhhcmQtY29kZWQgdmFsdWVzCiAgICAgc3RhdGljIE1lZGlhUHJvZmlsZXMqIGNyZWF0ZURlZmF1bHRJbnN0YW5jZSgpOwotICAgIHN0YXRpYyBDYW1jb3JkZXJQcm9maWxlICpjcmVhdGVEZWZhdWx0Q2FtY29yZGVyTG93UHJvZmlsZSgpOwotICAgIHN0YXRpYyBDYW1jb3JkZXJQcm9maWxlICpjcmVhdGVEZWZhdWx0Q2FtY29yZGVySGlnaFByb2ZpbGUoKTsKKworICAgIHN0YXRpYyBDYW1jb3JkZXJQcm9maWxlICpjcmVhdGVEZWZhdWx0Q2FtY29yZGVyUWNpZlByb2ZpbGUoY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSk7CisgICAgc3RhdGljIENhbWNvcmRlclByb2ZpbGUgKmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJDaWZQcm9maWxlKGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpOworICAgIHN0YXRpYyB2b2lkIGNyZWF0ZURlZmF1bHRDYW1jb3JkZXJMb3dQcm9maWxlcygKKyAgICAgICAgICAgIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUgKipsb3dQcm9maWxlLAorICAgICAgICAgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqKmxvd1NwZWNpZmljUHJvZmlsZSk7CisgICAgc3RhdGljIHZvaWQgY3JlYXRlRGVmYXVsdENhbWNvcmRlckhpZ2hQcm9maWxlcygKKyAgICAgICAgICAgIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUgKipoaWdoUHJvZmlsZSwKKyAgICAgICAgICAgIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUgKipoaWdoU3BlY2lmaWNQcm9maWxlKTsKKworICAgIHN0YXRpYyBDYW1jb3JkZXJQcm9maWxlICpjcmVhdGVEZWZhdWx0Q2FtY29yZGVyVGltZUxhcHNlUWNpZlByb2ZpbGUoY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSk7CisgICAgc3RhdGljIENhbWNvcmRlclByb2ZpbGUgKmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2U0ODBwUHJvZmlsZShjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KTsKKyAgICBzdGF0aWMgdm9pZCBjcmVhdGVEZWZhdWx0Q2FtY29yZGVyVGltZUxhcHNlTG93UHJvZmlsZXMoCisgICAgICAgICAgICBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlICoqbG93VGltZUxhcHNlUHJvZmlsZSwKKyAgICAgICAgICAgIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUgKipsb3dTcGVjaWZpY1RpbWVMYXBzZVByb2ZpbGUpOworICAgIHN0YXRpYyB2b2lkIGNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2VIaWdoUHJvZmlsZXMoCisgICAgICAgICAgICBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlICoqaGlnaFRpbWVMYXBzZVByb2ZpbGUsCisgICAgICAgICAgICBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlICoqaGlnaFNwZWNpZmljVGltZUxhcHNlUHJvZmlsZSk7CisKICAgICBzdGF0aWMgdm9pZCBjcmVhdGVEZWZhdWx0Q2FtY29yZGVyUHJvZmlsZXMoTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpOwogICAgIHN0YXRpYyB2b2lkIGNyZWF0ZURlZmF1bHRWaWRlb0VuY29kZXJzKE1lZGlhUHJvZmlsZXMgKnByb2ZpbGVzKTsKICAgICBzdGF0aWMgdm9pZCBjcmVhdGVEZWZhdWx0QXVkaW9FbmNvZGVycyhNZWRpYVByb2ZpbGVzICpwcm9maWxlcyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmggYi9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKaW5kZXggNWU5ZTM2OC4uYzQyMzQ2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaApAQCAtMjIsNyArMjIsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIElTdXJmYWNlOworY2xhc3MgU3VyZmFjZTsKIAogc3RydWN0IE1lZGlhUmVjb3JkZXJCYXNlIHsKICAgICBNZWRpYVJlY29yZGVyQmFzZSgpIHt9CkBAIC0zNyw5ICszNywxMCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYW1lcmEoY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyICpwYXRoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGludCBmZCkge3JldHVybiBJTlZBTElEX09QRVJBVElPTjt9CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+JiBsaXN0ZW5lcikgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZSgpID0gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvUFZNZWRpYVJlY29yZGVyLmggYi9pbmNsdWRlL21lZGlhL1BWTWVkaWFSZWNvcmRlci5oCmluZGV4IGMwOTFjMzkuLjRiNDRjY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvUFZNZWRpYVJlY29yZGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9QVk1lZGlhUmVjb3JkZXIuaApAQCAtMjMsNyArMjMsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIElTdXJmYWNlOworY2xhc3MgU3VyZmFjZTsKIGNsYXNzIElDYW1lcmE7CiBjbGFzcyBBdXRob3JEcml2ZXJXcmFwcGVyOwogCkBAIC00MSw3ICs0MSw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvRnJhbWVSYXRlKGludCBmcmFtZXNfcGVyX3NlY29uZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYW1lcmEoY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyICpwYXRoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpOwpAQCAtNjYsNCArNjYsMyBAQAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfUFZNRURJQVJFQ09SREVSX0gKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9QVlBsYXllci5oIGIvaW5jbHVkZS9tZWRpYS9QVlBsYXllci5oCmluZGV4IGRmNTA5ODEuLjY1N2U3YTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvUFZQbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL1BWUGxheWVyLmgKQEAgLTQzLDcgKzQzLDggQEAKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9JU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmUoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmVBc3luYygpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKaW5kZXggMjkxYjE4YS4uYTYwMGY2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKQEAgLTE3MCw2ICsxNzAsNyBAQAogICAgIHN0YXR1c190ICAgIHNldEF1ZGlvRW5jb2RlcihpbnQgYWUpOwogICAgIHN0YXR1c190ICAgIHNldE91dHB1dEZpbGUoY29uc3QgY2hhciogcGF0aCk7CiAgICAgc3RhdHVzX3QgICAgc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CisgICAgc3RhdHVzX3QgICAgc2V0T3V0cHV0RmlsZUF1eGlsaWFyeShpbnQgZmQpOwogICAgIHN0YXR1c190ICAgIHNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogICAgIHN0YXR1c190ICAgIHNldFZpZGVvRnJhbWVSYXRlKGludCBmcmFtZXNfcGVyX3NlY29uZCk7CiAgICAgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpOwpAQCAtMTk2LDYgKzE5Nyw3IEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0F1ZGlvRW5jb2RlclNldDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUlzVmlkZW9FbmNvZGVyU2V0OwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtSXNPdXRwdXRGaWxlU2V0OworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtSXNBdXhpbGlhcnlPdXRwdXRGaWxlU2V0OwogICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbU5vdGlmeUxvY2s7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYXNjYW5uZXIuaCBiL2luY2x1ZGUvbWVkaWEvbWVkaWFzY2FubmVyLmgKaW5kZXggMGQzOTdhYy4uNzRjOWQ1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9tZWRpYXNjYW5uZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhc2Nhbm5lci5oCkBAIC0zOCw4ICszOCw3IEBACiAKICAgICB0eXBlZGVmIGJvb2wgKCpFeGNlcHRpb25DaGVjaykodm9pZCogZW52KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3NEaXJlY3RvcnkoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpleHRlbnNpb25zLAotICAgICAgICAgICAgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQsCisgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoLCBNZWRpYVNjYW5uZXJDbGllbnQgJmNsaWVudCwKICAgICAgICAgICAgIEV4Y2VwdGlvbkNoZWNrIGV4Y2VwdGlvbkNoZWNrLCB2b2lkICpleGNlcHRpb25FbnYpOwogCiAgICAgdm9pZCBzZXRMb2NhbGUoY29uc3QgY2hhciAqbG9jYWxlKTsKQEAgLTU1LDkgKzU0LDggQEAKICAgICBjaGFyICptTG9jYWxlOwogCiAgICAgc3RhdHVzX3QgZG9Qcm9jZXNzRGlyZWN0b3J5KAotICAgICAgICAgICAgY2hhciAqcGF0aCwgaW50IHBhdGhSZW1haW5pbmcsIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnMsCi0gICAgICAgICAgICBNZWRpYVNjYW5uZXJDbGllbnQgJmNsaWVudCwgRXhjZXB0aW9uQ2hlY2sgZXhjZXB0aW9uQ2hlY2ssCi0gICAgICAgICAgICB2b2lkICpleGNlcHRpb25FbnYpOworICAgICAgICAgICAgY2hhciAqcGF0aCwgaW50IHBhdGhSZW1haW5pbmcsIE1lZGlhU2Nhbm5lckNsaWVudCAmY2xpZW50LAorICAgICAgICAgICAgRXhjZXB0aW9uQ2hlY2sgZXhjZXB0aW9uQ2hlY2ssIHZvaWQgKmV4Y2VwdGlvbkVudik7CiAKICAgICBNZWRpYVNjYW5uZXIoY29uc3QgTWVkaWFTY2FubmVyICYpOwogICAgIE1lZGlhU2Nhbm5lciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhU2Nhbm5lciAmKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCmluZGV4IDMxOTJkMDMuLmVkNWYwOWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaApAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDcsMTIgKzQ2LDM0IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIqIGJ1ZmZlcik7CiAKLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIENhbWVyYVNvdXJjZUxpc3RlbmVyOwotCitwcm90ZWN0ZWQ6CiAgICAgc3A8Q2FtZXJhPiBtQ2FtZXJhOwogICAgIHNwPE1ldGFEYXRhPiBtTWV0YTsKIAorICAgIGludDY0X3QgbVN0YXJ0VGltZVVzOworICAgIGludDMyX3QgbU51bUZyYW1lc1JlY2VpdmVkOworICAgIGludDY0X3QgbUxhc3RGcmFtZVRpbWVzdGFtcFVzOworICAgIGJvb2wgbVN0YXJ0ZWQ7CisKKyAgICBDYW1lcmFTb3VyY2UoY29uc3Qgc3A8Q2FtZXJhPiAmY2FtZXJhKTsKKworICAgIHZpcnR1YWwgdm9pZCBzdGFydENhbWVyYVJlY29yZGluZygpOworICAgIHZpcnR1YWwgdm9pZCBzdG9wQ2FtZXJhUmVjb3JkaW5nKCk7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgZnJhbWUpOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIG5lZWQgdG8gc2tpcCB0aGUgY3VycmVudCBmcmFtZS4KKyAgICAvLyBDYWxsZWQgZnJvbSBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAuCisgICAgdmlydHVhbCBib29sIHNraXBDdXJyZW50RnJhbWUoaW50NjRfdCB0aW1lc3RhbXBVcykge3JldHVybiBmYWxzZTt9CisKKyAgICAvLyBDYWxsYmFjayBjYWxsZWQgd2hlbiBzdGlsbCBjYW1lcmEgcmF3IGRhdGEgaXMgYXZhaWxhYmxlLgorICAgIHZpcnR1YWwgdm9pZCBkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSkge30KKworICAgIHZpcnR1YWwgdm9pZCBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXBVcywgaW50MzJfdCBtc2dUeXBlLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBDYW1lcmFTb3VyY2VMaXN0ZW5lcjsKKwogICAgIE11dGV4IG1Mb2NrOwogICAgIENvbmRpdGlvbiBtRnJhbWVBdmFpbGFibGVDb25kaXRpb247CiAgICAgQ29uZGl0aW9uIG1GcmFtZUNvbXBsZXRlQ29uZGl0aW9uOwpAQCAtNjAsMjEgKzgxLDEyIEBACiAgICAgTGlzdDxzcDxJTWVtb3J5PiA+IG1GcmFtZXNCZWluZ0VuY29kZWQ7CiAgICAgTGlzdDxpbnQ2NF90PiBtRnJhbWVUaW1lczsKIAotICAgIGludDY0X3QgbVN0YXJ0VGltZVVzOwogICAgIGludDY0X3QgbUZpcnN0RnJhbWVUaW1lVXM7Ci0gICAgaW50NjRfdCBtTGFzdEZyYW1lVGltZXN0YW1wVXM7Ci0gICAgaW50MzJfdCBtTnVtRnJhbWVzUmVjZWl2ZWQ7CiAgICAgaW50MzJfdCBtTnVtRnJhbWVzRW5jb2RlZDsKICAgICBpbnQzMl90IG1OdW1GcmFtZXNEcm9wcGVkOwogICAgIGludDMyX3QgbU51bUdsaXRjaGVzOwogICAgIGludDY0X3QgbUdsaXRjaER1cmF0aW9uVGhyZXNob2xkVXM7CiAgICAgYm9vbCBtQ29sbGVjdFN0YXRzOwotICAgIGJvb2wgbVN0YXJ0ZWQ7Ci0KLSAgICBDYW1lcmFTb3VyY2UoY29uc3Qgc3A8Q2FtZXJhPiAmY2FtZXJhKTsKLQotICAgIHZvaWQgZGF0YUNhbGxiYWNrVGltZXN0YW1wKAotICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSk7CiAKICAgICB2b2lkIHJlbGVhc2VRdWV1ZWRGcmFtZXMoKTsKICAgICB2b2lkIHJlbGVhc2VPbmVSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgZnJhbWUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzMDNmOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmgKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENBTUVSQV9TT1VSQ0VfVElNRV9MQVBTRV9IXworCisjZGVmaW5lIENBTUVSQV9TT1VSQ0VfVElNRV9MQVBTRV9IXworCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJQ2FtZXJhOworY2xhc3MgSU1lbW9yeTsKK2NsYXNzIENhbWVyYTsKKworY2xhc3MgQ2FtZXJhU291cmNlVGltZUxhcHNlIDogcHVibGljIENhbWVyYVNvdXJjZSB7CitwdWJsaWM6CisgICAgc3RhdGljIENhbWVyYVNvdXJjZVRpbWVMYXBzZSAqQ3JlYXRlKAorICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICBpbnQzMl90IHZpZGVvRnJhbWVSYXRlKTsKKworICAgIHN0YXRpYyBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKkNyZWF0ZUZyb21DYW1lcmEoY29uc3Qgc3A8Q2FtZXJhPiAmY2FtZXJhLAorICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICBpbnQzMl90IHZpZGVvRnJhbWVSYXRlKTsKKworICAgIHZpcnR1YWwgfkNhbWVyYVNvdXJjZVRpbWVMYXBzZSgpOworCisgICAgLy8gSWYgdGhlIGZyYW1lIGNhcHR1cmUgaW50ZXJ2YWwgaXMgbGFyZ2UsIHJlYWQgd2lsbCBibG9jayBmb3IgYSBsb25nIHRpbWUuCisgICAgLy8gRHVlIHRvIHRoZSB3YXkgdGhlIG1lZGlhUmVjb3JkZXIgZnJhbWV3b3JrIHdvcmtzLCBhIHN0b3AoKSBjYWxsIGZyb20KKyAgICAvLyBtZWRpYVJlY29yZGVyIHdhaXRzIHVudGlsIHRoZSByZWFkIHJldHVybnMsIGNhdXNpbmcgYSBsb25nIHdhaXQgZm9yCisgICAgLy8gc3RvcCgpIHRvIHJldHVybi4gVG8gYXZvaWQgdGhpcywgd2UgY2FuIG1ha2UgcmVhZCgpIHJldHVybiBhIGNvcHkgb2YgdGhlCisgICAgLy8gbGFzdCByZWFkIGZyYW1lIHdpdGggdGhlIHNhbWUgdGltZSBzdGFtcCBmcmVxdWVudGx5LiBUaGlzIGtlZXBzIHRoZQorICAgIC8vIHJlYWQoKSBjYWxsIGZyb20gYmxvY2tpbmcgdG9vIGxvbmcuIENhbGxpbmcgdGhpcyBmdW5jdGlvbiBxdWlja2x5CisgICAgLy8gY2FwdHVyZXMgYW5vdGhlciBmcmFtZSwga2VlcHMgaXRzIGNvcHksIGFuZCBlbmFibGVzIHRoaXMgbW9kZSBvZiByZWFkKCkKKyAgICAvLyByZXR1cm5pbmcgcXVpY2tseS4KKyAgICB2b2lkIHN0YXJ0UXVpY2tSZWFkUmV0dXJucygpOworCitwcml2YXRlOgorICAgIC8vIElmIHRydWUsIHdpbGwgdXNlIHN0aWxsIGNhbWVyYSB0YWtlUGljdHVyZSgpIGZvciB0aW1lIGxhcHNlIGZyYW1lcworICAgIC8vIElmIGZhbHNlLCB3aWxsIHVzZSB0aGUgdmlkZW9jYW1lcmEgZnJhbWVzIGluc3RlYWQuCisgICAgYm9vbCBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2U7CisKKyAgICAvLyBTaXplIG9mIHBpY3R1cmUgdGFrZW4gZnJvbSBzdGlsbCBjYW1lcmEuIFRoaXMgbWF5IGJlIGxhcmdlciB0aGFuIHRoZSBzaXplCisgICAgLy8gb2YgdGhlIHZpZGVvLCBhcyBzdGlsbCBjYW1lcmEgbWF5IG5vdCBzdXBwb3J0IHRoZSBleGFjdCB2aWRlbyByZXNvbHV0aW9uCisgICAgLy8gZGVtYW5kZWQuIFNlZSBzZXRQaWN0dXJlU2l6ZVRvQ2xvc2VzdFN1cHBvcnRlZCgpLgorICAgIGludDMyX3QgbVBpY3R1cmVXaWR0aDsKKyAgICBpbnQzMl90IG1QaWN0dXJlSGVpZ2h0OworCisgICAgLy8gc2l6ZSBvZiB0aGUgZW5jb2RlZCB2aWRlby4KKyAgICBpbnQzMl90IG1WaWRlb1dpZHRoOworICAgIGludDMyX3QgbVZpZGVvSGVpZ2h0OworCisgICAgLy8gVHJ1ZSBpZiB3ZSBuZWVkIHRvIGNyb3AgdGhlIHN0aWxsIGNhbWVyYSBpbWFnZSB0byBnZXQgdGhlIHZpZGVvIGZyYW1lLgorICAgIGJvb2wgbU5lZWRDcm9wcGluZzsKKworICAgIC8vIFN0YXJ0IGxvY2F0aW9uIG9mIHRoZSBjcm9wcGluZyByZWN0YW5nbGUuCisgICAgaW50MzJfdCBtQ3JvcFJlY3RTdGFydFg7CisgICAgaW50MzJfdCBtQ3JvcFJlY3RTdGFydFk7CisKKyAgICAvLyBUaW1lIGJldHdlZW4gY2FwdHVyZSBvZiB0d28gZnJhbWVzIGR1cmluZyB0aW1lIGxhcHNlIHJlY29yZGluZworICAgIC8vIE5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcyB0aGF0IHRpbWVsYXBzZSBpcyBkaXNhYmxlZC4KKyAgICBpbnQ2NF90IG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzOworCisgICAgLy8gVGltZSBiZXR3ZWVuIHR3byBmcmFtZXMgaW4gZmluYWwgdmlkZW8gKDEvZnJhbWVSYXRlKQorICAgIGludDY0X3QgbVRpbWVCZXR3ZWVuVGltZUxhcHNlVmlkZW9GcmFtZXNVczsKKworICAgIC8vIFJlYWwgdGltZXN0YW1wIG9mIHRoZSBsYXN0IGVuY29kZWQgdGltZSBsYXBzZSBmcmFtZQorICAgIGludDY0X3QgbUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVczsKKworICAgIC8vIFRocmVhZCBpZCBvZiB0aHJlYWQgd2hpY2ggdGFrZXMgc3RpbGwgcGljdHVyZSBhbmQgc2xlZXBzIGluIGEgbG9vcC4KKyAgICBwdGhyZWFkX3QgbVRocmVhZFRpbWVMYXBzZTsKKworICAgIC8vIFZhcmlhYmxlIHNldCBpbiBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoKSB0byBoZWxwIHNraXBDdXJyZW50RnJhbWUoKQorICAgIC8vIHRvIGtub3cgaWYgY3VycmVudCBmcmFtZSBuZWVkcyB0byBiZSBza2lwcGVkLgorICAgIGJvb2wgbVNraXBDdXJyZW50RnJhbWU7CisKKyAgICAvLyBMb2NrIGZvciBhY2Nlc3NpbmcgbUNhbWVyYUlkbGUKKyAgICBNdXRleCBtQ2FtZXJhSWRsZUxvY2s7CisKKyAgICAvLyBDb25kaXRpb24gdmFyaWFibGUgdG8gd2FpdCBvbiBpZiBjYW1lcmEgaXMgaXMgbm90IHlldCBpZGxlLiBPbmNlIHRoZQorICAgIC8vIGNhbWVyYSBnZXRzIGlkbGUsIHRoaXMgdmFyaWFibGUgd2lsbCBiZSBzaWduYWxsZWQuCisgICAgQ29uZGl0aW9uIG1DYW1lcmFJZGxlQ29uZGl0aW9uOworCisgICAgLy8gVHJ1ZSBpZiBjYW1lcmEgaXMgaW4gcHJldmlldyBtb2RlIGFuZCByZWFkeSBmb3IgdGFrZVBpY3R1cmUoKS4KKyAgICAvLyBGYWxzZSBhZnRlciBhIGNhbGwgdG8gdGFrZVBpY3R1cmUoKSBidXQgYmVmb3JlIHRoZSBmaW5hbCBjb21wcmVzc2VkCisgICAgLy8gZGF0YSBjYWxsYmFjayBoYXMgYmVlbiBjYWxsZWQgYW5kIHByZXZpZXcgaGFzIGJlZW4gcmVzdGFydGVkLgorICAgIHZvbGF0aWxlIGJvb2wgbUNhbWVyYUlkbGU7CisKKyAgICAvLyBUcnVlIGlmIHN0b3AoKSBpcyB3YWl0aW5nIGZvciBjYW1lcmEgdG8gZ2V0IGlkbGUsIGkuZS4gZm9yIHRoZSBsYXN0CisgICAgLy8gdGFrZVBpY3R1cmUoKSB0byBjb21wbGV0ZS4gVGhpcyBpcyBuZWVkZWQgc28gdGhhdCBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoKQorICAgIC8vIGNhbiByZXR1cm4gaW1tZWRpYXRlbHkuCisgICAgdm9sYXRpbGUgYm9vbCBtU3RvcFdhaXRpbmdGb3JJZGxlQ2FtZXJhOworCisgICAgLy8gTG9jayBmb3IgYWNjZXNzaW5nIHF1aWNrIHN0b3AgdmFyaWFibGVzLgorICAgIE11dGV4IG1RdWlja1N0b3BMb2NrOworCisgICAgLy8gQ29uZGl0aW9uIHZhcmlhYmxlIHRvIHdha2UgdXAgc3RpbGwgcGljdHVyZSB0aHJlYWQuCisgICAgQ29uZGl0aW9uIG1UYWtlUGljdHVyZUNvbmRpdGlvbjsKKworICAgIC8vIG1RdWlja1N0b3AgaXMgc2V0IHRvIHRydWUgaWYgd2UgdXNlIHF1aWNrIHJlYWQoKSByZXR1cm5zLCBvdGhlcndpc2UgaXQgaXMgc2V0CisgICAgLy8gdG8gZmFsc2UuIE9uY2UgaW4gdGhpcyBtb2RlIHJlYWQoKSByZXR1cm4gYSBjb3B5IG9mIHRoZSBsYXN0IHJlYWQgZnJhbWUKKyAgICAvLyB3aXRoIHRoZSBzYW1lIHRpbWUgc3RhbXAuIFNlZSBzdGFydFF1aWNrUmVhZFJldHVybnMoKS4KKyAgICB2b2xhdGlsZSBib29sIG1RdWlja1N0b3A7CisKKyAgICAvLyBGb3JjZXMgdGhlIG5leHQgZnJhbWUgcGFzc2VkIHRvIGRhdGFDYWxsYmFja1RpbWVzdGFtcCgpIHRvIGJlIHJlYWQKKyAgICAvLyBhcyBhIHRpbWUgbGFwc2UgZnJhbWUuIFVzZWQgYnkgc3RhcnRRdWlja1JlYWRSZXR1cm5zKCkgc28gdGhhdCB0aGUgbmV4dAorICAgIC8vIGZyYW1lIHdha2VzIHVwIGFueSBibG9ja2luZyByZWFkLgorICAgIHZvbGF0aWxlIGJvb2wgbUZvcmNlUmVhZDsKKworICAgIC8vIFN0b3JlcyBhIGNvcHkgb2YgdGhlIE1lZGlhQnVmZmVyIHJlYWQgaW4gdGhlIGxhc3QgcmVhZCgpIGNhbGwgYWZ0ZXIKKyAgICAvLyBtUXVpY2tTdG9wIHdhcyB0cnVlLgorICAgIE1lZGlhQnVmZmVyKiBtTGFzdFJlYWRCdWZmZXJDb3B5OworCisgICAgLy8gU3RhdHVzIGNvZGUgZm9yIGxhc3QgcmVhZC4KKyAgICBzdGF0dXNfdCBtTGFzdFJlYWRTdGF0dXM7CisKKyAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2UoY29uc3Qgc3A8Q2FtZXJhPiAmY2FtZXJhLAorICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICBpbnQzMl90IHZpZGVvRnJhbWVSYXRlKTsKKworICAgIC8vIFdyYXBwZXIgb3ZlciBDYW1lcmFTb3VyY2U6OnNpZ25hbEJ1ZmZlclJldHVybmVkKCkgdG8gaW1wbGVtZW50IHF1aWNrIHN0b3AuCisgICAgLy8gSXQgb25seSBoYW5kbGVzIHRoZSBjYXNlIHdoZW4gbUxhc3RSZWFkQnVmZmVyQ29weSBpcyBzaWduYWxsZWQuIE90aGVyd2lzZQorICAgIC8vIGl0IGNhbGxzIHRoZSBiYXNlIGNsYXNzJyBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIqIGJ1ZmZlcik7CisKKyAgICAvLyBXcmFwcGVyIG92ZXIgQ2FtZXJhU291cmNlOjpyZWFkKCkgdG8gaW1wbGVtZW50IHF1aWNrIHN0b3AuCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworCisgICAgLy8gRm9yIHN0aWxsIGNhbWVyYSBjYXNlIHN0YXJ0cyBhIHRocmVhZCB3aGljaCBjYWxscyBjYW1lcmEncyB0YWtlUGljdHVyZSgpCisgICAgLy8gaW4gYSBsb29wLiBGb3IgdmlkZW8gY2FtZXJhIGNhc2UsIGp1c3Qgc3RhcnRzIHRoZSBjYW1lcmEncyB2aWRlbyByZWNvcmRpbmcuCisgICAgdmlydHVhbCB2b2lkIHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCk7CisKKyAgICAvLyBGb3Igc3RpbGwgY2FtZXJhIGNhc2Ugam9pbnMgdGhlIHRocmVhZCBjcmVhdGVkIGluIHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCkuCisgICAgLy8gRm9yIHZpZGVvIGNhbWVyYSBjYXNlLCBqdXN0IHN0b3BzIHRoZSBjYW1lcmEncyB2aWRlbyByZWNvcmRpbmcuCisgICAgdmlydHVhbCB2b2lkIHN0b3BDYW1lcmFSZWNvcmRpbmcoKTsKKworICAgIC8vIEZvciBzdGlsbCBjYW1lcmEgY2FzZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGFzIG1lbW9yeSBpcyBsb2NhbGx5CisgICAgLy8gYWxsb2NhdGVkIHdpdGggcmVmY291bnRpbmcuCisgICAgLy8gRm9yIHZpZGVvIGNhbWVyYSBjYXNlIGp1c3QgdGVsbCB0aGUgY2FtZXJhIHRvIHJlbGVhc2UgdGhlIGZyYW1lLgorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIGZyYW1lKTsKKworICAgIC8vIG1Ta2lwQ3VycmVudEZyYW1lIGlzIHNldCB0byB0cnVlIGluIGRhdGFDYWxsYmFja1RpbWVzdGFtcCgpIGlmIHRoZSBjdXJyZW50CisgICAgLy8gZnJhbWUgbmVlZHMgdG8gYmUgc2tpcHBlZCBhbmQgdGhpcyBmdW5jdGlvbiBqdXN0IHJldHVybnMgdGhlIHZhbHVlIG9mIG1Ta2lwQ3VycmVudEZyYW1lLgorICAgIHZpcnR1YWwgYm9vbCBza2lwQ3VycmVudEZyYW1lKGludDY0X3QgdGltZXN0YW1wVXMpOworCisgICAgLy8gSGFuZGxlcyB0aGUgY2FsbGJhY2sgdG8gaGFuZGxlIHJhdyBmcmFtZSBkYXRhIGZyb20gdGhlIHN0aWxsIGNhbWVyYS4KKyAgICAvLyBDcmVhdGVzIGEgY29weSBvZiB0aGUgZnJhbWUgZGF0YSBhcyB0aGUgY2FtZXJhIGNhbiByZXVzZSB0aGUgZnJhbWUgbWVtb3J5CisgICAgLy8gb25jZSB0aGlzIGNhbGxiYWNrIHJldHVybnMuIFRoZSBmdW5jdGlvbiBhbHNvIHNldHMgYSBuZXcgdGltc3RhbXAgY29ycmVzcG9uZGluZworICAgIC8vIHRvIG9uZSBmcmFtZSB0aW1lIGFoZWFkIG9mIHRoZSBsYXN0IGVuY29kZWQgZnJhbWUncyB0aW1lIHN0YW1wLiBJdCB0aGVuCisgICAgLy8gY2FsbHMgZGF0YUNhbGxiYWNrVGltZXN0YW1wKCkgb2YgdGhlIGJhc2UgY2xhc3Mgd2l0aCB0aGUgY29waWVkIGRhdGEgYW5kIHRoZQorICAgIC8vIG1vZGlmaWVkIHRpbWVzdGFtcCwgd2hpY2ggd2lsbCB0aGluayB0aGF0IGl0IHJlY2lldmVkIHRoZSBmcmFtZSBmcm9tIGEgdmlkZW8KKyAgICAvLyBjYW1lcmEgYW5kIHByb2NlZWQgYXMgdXN1YWwuCisgICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKTsKKworICAgIC8vIEluIHRoZSB2aWRlbyBjYW1lcmEgY2FzZSBjYWxscyBza2lwRnJhbWVBbmRNb2RpZnlUaW1lU3RhbXAoKSB0byBtb2RpZnkKKyAgICAvLyB0aW1lc3RhbXAgYW5kIHNldCBtU2tpcEN1cnJlbnRGcmFtZS4KKyAgICAvLyBUaGVuIGl0IGNhbGxzIHRoZSBiYXNlIENhbWVyYVNvdXJjZTo6ZGF0YUNhbGxiYWNrVGltZXN0YW1wKCkKKyAgICB2aXJ0dWFsIHZvaWQgZGF0YUNhbGxiYWNrVGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wVXMsIGludDMyX3QgbXNnVHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKTsKKworICAgIC8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGZpbGwgbUxhc3RSZWFkQnVmZmVyQ29weSBmcm9tIHRoZSBqdXN0IHJlYWQKKyAgICAvLyBidWZmZXIuCisgICAgdm9pZCBmaWxsTGFzdFJlYWRCdWZmZXJDb3B5KE1lZGlhQnVmZmVyJiBzb3VyY2VCdWZmZXIpOworCisgICAgLy8gSWYgdGhlIHBhc3NlZCBpbiBzaXplICh3aWR0aCB4IGhlaWdodCkgaXMgYSBzdXBwb3J0ZWQgcHJldmlldyBzaXplLAorICAgIC8vIHRoZSBmdW5jdGlvbiBzZXRzIHRoZSBjYW1lcmEncyBwcmV2aWV3IHNpemUgdG8gaXQgYW5kIHJldHVybnMgdHJ1ZS4KKyAgICAvLyBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KKyAgICBib29sIHRyeVNldHRpbmdQcmV2aWV3U2l6ZShpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisKKyAgICAvLyBUaGUgc3RpbGwgY2FtZXJhIG1heSBub3Qgc3VwcG9ydCB0aGUgZGVtYW5kZWQgdmlkZW8gd2lkdGggYW5kIGhlaWdodC4KKyAgICAvLyBXZSBsb29rIGZvciB0aGUgc3VwcG9ydGVkIHBpY3R1cmUgc2l6ZXMgZnJvbSB0aGUgc3RpbGwgY2FtZXJhIGFuZAorICAgIC8vIGNob29zZSB0aGUgc21hbGxlc3Qgb25lIHdpdGggZWl0aGVyIGRpbWVuc2lvbnMgaGlnaGVyIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAvLyB2aWRlbyBkaW1lbnNpb25zLiBUaGUgc3RpbGwgcGljdHVyZSB3aWxsIGJlIGNyb3BwZWQgdG8gZ2V0IHRoZSB2aWRlbyBmcmFtZS4KKyAgICAvLyBUaGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBjYW1lcmEgc3VwcG9ydHMgcGljdHVyZSBzaXplcyBncmVhdGVyIHRoYW4KKyAgICAvLyBvciBlcXVhbCB0byB0aGUgcGFzc2VkIGluIHdpZHRoIGFuZCBoZWlnaHQsIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgYm9vbCBzZXRQaWN0dXJlU2l6ZVRvQ2xvc2VzdFN1cHBvcnRlZChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisKKyAgICAvLyBDb21wdXRlcyB0aGUgb2Zmc2V0IG9mIHRoZSByZWN0YW5nbGUgZnJvbSB3aGVyZSB0byBzdGFydCBjcm9wcGluZyB0aGUKKyAgICAvLyBzdGlsbCBpbWFnZSBpbnRvIHRoZSB2aWRlbyBmcmFtZS4gV2UgY2hvb3NlIHRoZSBjZW50ZXIgb2YgdGhlIGltYWdlIHRvIGJlCisgICAgLy8gY3JvcHBlZC4gVGhlIG9mZnNldCBpcyBzdG9yZWQgaW4gKG1Dcm9wUmVjdFN0YXJ0WCwgbUNyb3BSZWN0U3RhcnRZKS4KKyAgICBib29sIGNvbXB1dGVDcm9wUmVjdGFuZ2xlT2Zmc2V0KCk7CisKKyAgICAvLyBDcm9wcyB0aGUgc291cmNlIGRhdGEgaW50byBhIHNtYWxsZXIgaW1hZ2Ugc3RhcnRpbmcgYXQKKyAgICAvLyAobUNyb3BSZWN0U3RhcnRYLCBtQ3JvcFJlY3RTdGFydFkpIGFuZCBvZiB0aGUgc2l6ZSBvZiB0aGUgdmlkZW8gZnJhbWUuCisgICAgLy8gVGhlIGRhdGEgaXMgcmV0dXJuZWQgaW50byBhIG5ld2x5IGFsbG9jYXRlZCBJTWVtb3J5LgorICAgIHNwPElNZW1vcnk+IGNyb3BZVVZJbWFnZShjb25zdCBzcDxJTWVtb3J5PiAmc291cmNlX2RhdGEpOworCisgICAgLy8gV2hlbiB2aWRlbyBjYW1lcmEgaXMgdXNlZCBmb3IgdGltZSBsYXBzZSBjYXB0dXJlLCByZXR1cm5zIHRydWUKKyAgICAvLyB1bnRpbCBlbm91Z2ggdGltZSBoYXMgcGFzc2VkIGZvciB0aGUgbmV4dCB0aW1lIGxhcHNlIGZyYW1lLiBXaGVuCisgICAgLy8gdGhlIGZyYW1lIG5lZWRzIHRvIGJlIGVuY29kZWQsIGl0IHJldHVybnMgZmFsc2UgYW5kIGFsc28gbW9kaWZpZXMKKyAgICAvLyB0aGUgdGltZSBzdGFtcCB0byBiZSBvbmUgZnJhbWUgdGltZSBhaGVhZCBvZiB0aGUgbGFzdCBlbmNvZGVkCisgICAgLy8gZnJhbWUncyB0aW1lIHN0YW1wLgorICAgIGJvb2wgc2tpcEZyYW1lQW5kTW9kaWZ5VGltZVN0YW1wKGludDY0X3QgKnRpbWVzdGFtcFVzKTsKKworICAgIC8vIFdyYXBwZXIgdG8gZW50ZXIgdGhyZWFkVGltZUxhcHNlRW50cnkoKQorICAgIHN0YXRpYyB2b2lkICpUaHJlYWRUaW1lTGFwc2VXcmFwcGVyKHZvaWQgKm1lKTsKKworICAgIC8vIFJ1bnMgYSBsb29wIHdoaWNoIHNsZWVwcyB1bnRpbCBhIHN0aWxsIHBpY3R1cmUgaXMgcmVxdWlyZWQKKyAgICAvLyBhbmQgdGhlbiBjYWxscyBtQ2FtZXJhLT50YWtlUGljdHVyZSgpIHRvIHRha2UgdGhlIHN0aWxsIHBpY3R1cmUuCisgICAgLy8gVXNlZCBvbmx5IGluIHRoZSBjYXNlIG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSA9IHRydWUuCisgICAgdm9pZCB0aHJlYWRUaW1lTGFwc2VFbnRyeSgpOworCisgICAgLy8gV3JhcHBlciB0byBlbnRlciB0aHJlYWRTdGFydFByZXZpZXcoKQorICAgIHN0YXRpYyB2b2lkICpUaHJlYWRTdGFydFByZXZpZXdXcmFwcGVyKHZvaWQgKm1lKTsKKworICAgIC8vIFN0YXJ0cyB0aGUgY2FtZXJhJ3MgcHJldmlldy4KKyAgICB2b2lkIHRocmVhZFN0YXJ0UHJldmlldygpOworCisgICAgLy8gU3RhcnRzIHRocmVhZCBUaHJlYWRTdGFydFByZXZpZXdXcmFwcGVyKCkgZm9yIHJlc3RhcnRpbmcgcHJldmlldy4KKyAgICAvLyBOZWVkcyB0byBiZSBkb25lIGluIGEgdGhyZWFkIHNvIHRoYXQgZGF0YUNhbGxiYWNrKCkgd2hpY2ggY2FsbHMgdGhpcyBmdW5jdGlvbgorICAgIC8vIGNhbiByZXR1cm4sIGFuZCB0aGUgY2FtZXJhIGNhbiBrbm93IHRoYXQgdGFrZVBpY3R1cmUoKSBpcyBkb25lLgorICAgIHZvaWQgcmVzdGFydFByZXZpZXcoKTsKKworICAgIC8vIENyZWF0ZXMgYSBjb3B5IG9mIHNvdXJjZV9kYXRhIGludG8gYSBuZXcgbWVtb3J5IG9mIGZpbmFsIHR5cGUgTWVtb3J5QmFzZS4KKyAgICBzcDxJTWVtb3J5PiBjcmVhdGVJTWVtb3J5Q29weShjb25zdCBzcDxJTWVtb3J5PiAmc291cmNlX2RhdGEpOworCisgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlKGNvbnN0IENhbWVyYVNvdXJjZVRpbWVMYXBzZSAmKTsKKyAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgJm9wZXJhdG9yPShjb25zdCBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENBTUVSQV9TT1VSQ0VfVElNRV9MQVBTRV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9IYXJkd2FyZUFQSS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9IYXJkd2FyZUFQSS5oCmluZGV4IDIyMWM2NzkuLjRkZWQ1ZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSGFyZHdhcmVBUEkuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0hhcmR3YXJlQVBJLmgKQEAgLTIxLDEwICsyMSw2MCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWFBsdWdpbkJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb1JlbmRlcmVyLmg+CiAjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KKyNpbmNsdWRlIDx1aS9hbmRyb2lkX25hdGl2ZV9idWZmZXIuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAKICNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CiAKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gQSBwb2ludGVyIHRvIHRoaXMgc3RydWN0IGlzIHBhc3NlZCB0byB0aGUgT01YX1NldFBhcmFtZXRlciB3aGVuIHRoZSBleHRlbnNpb24KKy8vIGluZGV4IGZvciB0aGUgJ09NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5lbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVycycgZXh0ZW5zaW9uCisvLyBpcyBnaXZlbi4KKy8vCisvLyBXaGVuIEFuZHJvaWQgbmF0aXZlIGJ1ZmZlciB1c2UgaXMgZGlzYWJsZWQgZm9yIGEgcG9ydCAodGhlIGRlZmF1bHQgc3RhdGUpLAorLy8gdGhlIE9NWCBub2RlIHNob3VsZCBvcGVyYXRlIGFzIG5vcm1hbCwgYW5kIGV4cGVjdCBVc2VCdWZmZXIgY2FsbHMgdG8gc2V0IGl0cworLy8gYnVmZmVycy4gIFRoaXMgaXMgdGhlIG1vZGUgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiBDUFUgYWNjZXNzIHRvIHRoZSBidWZmZXIgaXMKKy8vIHJlcXVpcmVkLgorLy8KKy8vIFdoZW4gQW5kcm9pZCBuYXRpdmUgYnVmZmVyIHVzZSBoYXMgYmVlbiBlbmFibGVkLCB0aGUgT01YIG5vZGUgbXVzdCBzdXBwb3J0CisvLyBvbmx5IGNvbG9yIGZvcm1hdHMgaW4gdGhlIHJhbmdlIFtPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZFByaXZhdGVTdGFydCwKKy8vIE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkUHJpdmF0ZUVuZCkuICBUaGUgbm9kZSBzaG91bGQgdGhlbiBleHBlY3QgdG8gcmVjZWl2ZQorLy8gVXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlciBjYWxscyAodmlhIE9NWF9TZXRQYXJhbWV0ZXIpIHJhdGhlciB0aGFuIFVzZUJ1ZmZlcgorLy8gY2FsbHMuCitzdHJ1Y3QgRW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnNQYXJhbXMgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfQk9PTCBlbmFibGU7Cit9OworCisvLyBDb2xvciBmb3JtYXRzIGluIHRoZSByYW5nZSBbT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRQcml2YXRlU3RhcnQsCisvLyBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZFByaXZhdGVFbmQpIHdpbGwgYmUgY29udmVydGVkIHRvIGEgZ3JhbGxvYyBwaXhlbAorLy8gZm9ybWF0IHdoZW4gdXNlZCB0byBhbGxvY2F0ZSBBbmRyb2lkIG5hdGl2ZSBidWZmZXJzIHZpYSBncmFsbG9jLiAgVGhlCisvLyBjb252ZXJzaW9uIGlzIGRvbmUgYnkgc3VidHJhY3RpbmcgT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRQcml2YXRlU3RhcnQgZnJvbQorLy8gdGhlIGNvbG9yIGZvcm1hdCByZXBvcnRlZCBieSB0aGUgY29kZWMuCitlbnVtIHsKKyAgICBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZFByaXZhdGVTdGFydCA9IDB4QTAwMDAwMDAsCisgICAgT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRQcml2YXRlRW5kID0gMHhCMDAwMDAwMCwKK307CisKKy8vIEEgcG9pbnRlciB0byB0aGlzIHN0cnVjdCBpcyBwYXNzZWQgdG8gT01YX1NldFBhcmFtZXRlciB3aGVuIHRoZSBleHRlbnNpb24KKy8vIGluZGV4IGZvciB0aGUgJ09NWC5nb29nbGUuYW5kcm9pZC5pbmRleC51c2VBbmRyb2lkTmF0aXZlQnVmZmVyJyBleHRlbnNpb24gaXMKKy8vIGdpdmVuLiAgVGhpcyBjYWxsIHdpbGwgb25seSBiZSBwZXJmb3JtZWQgaWYgYSBwcmlvciBjYWxsIHdhcyBtYWRlIHdpdGggdGhlCisvLyAnT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzJyBleHRlbnNpb24gaW5kZXgsCisvLyBlbmFibGluZyB1c2Ugb2YgQW5kcm9pZCBuYXRpdmUgYnVmZmVycy4KK3N0cnVjdCBVc2VBbmRyb2lkTmF0aXZlQnVmZmVyUGFyYW1zIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1BUUiBwQXBwUHJpdmF0ZTsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmJ1ZmZlckhlYWRlcjsKKyAgICBjb25zdCBzcDxhbmRyb2lkX25hdGl2ZV9idWZmZXJfdD4mIG5hdGl2ZUJ1ZmZlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKIGV4dGVybiBhbmRyb2lkOjpWaWRlb1JlbmRlcmVyICpjcmVhdGVSZW5kZXJlcigKICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6SVN1cmZhY2U+ICZzdXJmYWNlLAogICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLApAQCAtMzUsNCArODUsMyBAQAogZXh0ZXJuIGFuZHJvaWQ6Ok9NWFBsdWdpbkJhc2UgKmNyZWF0ZU9NWFBsdWdpbigpOwogCiAjZW5kaWYgIC8vIEhBUkRXQVJFX0FQSV9IXwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlU3BsaXR0ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2VTcGxpdHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OGY0YzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlU3BsaXR0ZXIuaApAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSB3YXkgdG8gc3BsaXQgYSBzaW5nbGUgbWVkaWEgc291cmNlIGludG8gbXVsdGlwbGUgc291cmNlcy4KKy8vIFRoZSBjb25zdHJ1Y3RvciB0YWtlcyBpbiB0aGUgcmVhbCBtZWRpYVNvdXJjZSBhbmQgY3JlYXRlQ2xpZW50KCkgY2FuIHRoZW4gYmUKKy8vIHVzZWQgdG8gY3JlYXRlIG11bHRpcGxlIHNvdXJjZXMgc2VydmVkIGZyb20gdGhpcyByZWFsIG1lZGlhU291cmNlLgorLy8KKy8vIFVzYWdlOgorLy8gLSBDcmVhdGUgTWVkaWFTb3VyY2VTcGxpdHRlciBieSBwYXNzaW5nIGluIGEgcmVhbCBtZWRpYVNvdXJjZSBmcm9tIHdoaWNoCisvLyBtdWx0aXBsZSBkdXBsaWNhdGUgY2hhbm5lbHMgYXJlIG5lZWRlZC4KKy8vIC0gQ3JlYXRlIGEgY2xpZW50IHVzaW5nIGNyZWF0ZUNsaWVudCgpIGFuZCB1c2UgaXQgYXMgYW55IG90aGVyIG1lZGlhU291cmNlLgorLy8KKy8vIE5vdGUgdGhhdCBtdWx0aXBsZSBjbGllbnRzIGNhbiBiZSBjcmVhdGVkIHVzaW5nIGNyZWF0ZUNsaWVudCgpIGFuZAorLy8gc3RhcnRlZC9zdG9wcGVkIGluIGFueSBvcmRlci4gTWVkaWFTb3VyY2VTcGxpdHRlciBzdG9wcyB0aGUgcmVhbCBzb3VyY2Ugb25seQorLy8gd2hlbiBhbGwgY2xpZW50cyBoYXZlIGJlZW4gc3RvcHBlZC4KKy8vCisvLyBJZiBhIG5ldyBjbGllbnQgaXMgY3JlYXRlZC9zdGFydGVkIGFmdGVyIHNvbWUgZXhpc3RpbmcgY2xpZW50cyBoYXZlIGFscmVhZHkKKy8vIHN0YXJ0ZWQsIHRoZSBuZXcgY2xpZW50IHdpbGwgc3RhcnQgZ2V0dGluZyBpdHMgcmVhZCBmcmFtZXMgZnJvbSB0aGUgY3VycmVudAorLy8gdGltZS4KKworI2lmbmRlZiBNRURJQV9TT1VSQ0VfU1BMSVRURVJfSF8KKworI2RlZmluZSBNRURJQV9TT1VSQ0VfU1BMSVRURVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYUJ1ZmZlcjsKK2NsYXNzIE1ldGFEYXRhOworCitjbGFzcyBNZWRpYVNvdXJjZVNwbGl0dGVyIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIC8vIENvbnN0cnVjdG9yCisgICAgLy8gbWVkaWFTb3VyY2U6IFRoZSByZWFsIG1lZGlhU291cmNlLiBUaGUgY2xhc3Mga2VlcHMgYSByZWZlcmVuY2UgdG8gaXQgdG8KKyAgICAvLyBpbXBsZW1lbnQgdGhlIHZhcmlvdXMgY2xpZW50cy4KKyAgICBNZWRpYVNvdXJjZVNwbGl0dGVyKHNwPE1lZGlhU291cmNlPiBtZWRpYVNvdXJjZSk7CisKKyAgICB+TWVkaWFTb3VyY2VTcGxpdHRlcigpOworCisgICAgLy8gQ3JlYXRlcyBhIG5ldyBjbGllbnQgb2YgYmFzZSB0eXBlIE1lZGlhU291cmNlLiBNdWx0aXBsZSBjbGllbnRzIGNhbiBiZQorICAgIC8vIGNyZWF0ZWQgd2hpY2ggZ2V0IHRoZWlyIGRhdGEgdGhyb3VnaCB0aGUgc2FtZSByZWFsIG1lZGlhU291cmNlLiBUaGVzZQorICAgIC8vIGNsaWVudHMgY2FuIHRoZW4gYmUgdXNlZCBsaWtlIGFueSBvdGhlciBNZWRpYVNvdXJjZSwgYWxsIG9mIHdoaWNoIHByb3ZpZGUKKyAgICAvLyBkYXRhIGZyb20gdGhlIHNhbWUgcmVhbCBzb3VyY2UuCisgICAgc3A8TWVkaWFTb3VyY2U+IGNyZWF0ZUNsaWVudCgpOworCitwcml2YXRlOgorICAgIC8vIFRvdGFsIG51bWJlciBvZiBjbGllbnRzIGNyZWF0ZWQgdGhyb3VnaCBjcmVhdGVDbGllbnQoKS4KKyAgICBpbnQzMl90IG1OdW1iZXJPZkNsaWVudHM7CisKKyAgICAvLyByZWZlcmVuY2UgdG8gdGhlIHJlYWwgTWVkaWFTb3VyY2UgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKworICAgIC8vIFN0b3JlcyBwb2ludGVyIHRvIHRoZSBNZWRpYUJ1ZmZlciByZWFkIGZyb20gdGhlIHJlYWwgTWVkaWFTb3VyY2UuCisgICAgLy8gQWxsIGNsaWVudHMgdXNlIHRoaXMgdG8gaW1wbGVtZW50IHRoZSByZWFkKCkgY2FsbC4KKyAgICBNZWRpYUJ1ZmZlciAqbUxhc3RSZWFkTWVkaWFCdWZmZXI7CisKKyAgICAvLyBTdGF0dXMgY29kZSBmb3IgcmVhZCBmcm9tIHRoZSByZWFsIE1lZGlhU291cmNlLiBBbGwgY2xpZW50cyByZXR1cm4KKyAgICAvLyB0aGlzIGZvciB0aGVpciByZWFkKCkuCisgICAgc3RhdHVzX3QgbUxhc3RSZWFkU3RhdHVzOworCisgICAgLy8gQm9vbGVhbiB0ZWxsaW5nIHdoZXRoZXIgdGhlIHJlYWwgTWVkaWFTb3VyY2UgaGFzIHN0YXJ0ZWQuCisgICAgYm9vbCBtU291cmNlU3RhcnRlZDsKKworICAgIC8vIExpc3Qgb2YgYm9vbGVhbnMsIG9uZSBmb3IgZWFjaCBjbGllbnQsIHN0b3Jpbmcgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZworICAgIC8vIGNsaWVudCdzIHN0YXJ0KCkgaGFzIGJlZW4gY2FsbGVkLgorICAgIFZlY3Rvcjxib29sPiBtQ2xpZW50c1N0YXJ0ZWQ7CisKKyAgICAvLyBTdG9yZXMgdGhlIG51bWJlciBvZiBjbGllbnRzIHdoaWNoIGFyZSBjdXJyZW50bHkgc3RhcnRlZC4KKyAgICBpbnQzMl90IG1OdW1iZXJPZkNsaWVudHNTdGFydGVkOworCisgICAgLy8gU2luY2UgZGlmZmVyZW50IGNsaWVudHMgY2FsbCByZWFkKCkgYXN5bmNocm9ub3VzbHksIHdlIG5lZWQgdG8ga2VlcCB0cmFjaworICAgIC8vIG9mIHdoYXQgZGF0YSBpcyBjdXJyZW50bHkgcmVhZCBpbnRvIHRoZSBtTGFzdFJlYWRNZWRpYUJ1ZmZlci4KKyAgICAvLyBtQ3VycmVudFJlYWRCaXQgc3RvcmVzIHRoZSBiaXQgZm9yIHRoZSBjdXJyZW50IHJlYWQgYnVmZmVyLiBUaGlzIGJpdAorICAgIC8vIGZsaXBzIGVhY2ggdGltZSBhIG5ldyBidWZmZXIgaXMgcmVhZCBmcm9tIHRoZSBzb3VyY2UuCisgICAgLy8gbUNsaWVudHNEZXNpcmVkUmVhZEJpdCBzdG9yZXMgdGhlIGJpdCBmb3IgdGhlIG5leHQgZGVzaXJlZCByZWFkIGJ1ZmZlcgorICAgIC8vIGZvciBlYWNoIGNsaWVudC4gVGhpcyBiaXQgZmxpcHMgZWFjaCB0aW1lIHJlYWQoKSBpcyBjb21wbGV0ZWQgZm9yIHRoaXMKKyAgICAvLyBjbGllbnQuCisgICAgYm9vbCBtQ3VycmVudFJlYWRCaXQ7CisgICAgVmVjdG9yPGJvb2w+IG1DbGllbnRzRGVzaXJlZFJlYWRCaXQ7CisKKyAgICAvLyBOdW1iZXIgb2YgY2xpZW50cyB3aG9zZSBjdXJyZW50IHJlYWQgaGFzIGJlZW4gY29tcGxldGVkLgorICAgIGludDMyX3QgbU51bWJlck9mQ3VycmVudFJlYWRzOworCisgICAgLy8gQm9vbGVhbiB0ZWxsaW5nIHdoZXRoZXIgdGhlIGxhc3QgcmVhZCBoYXMgYmVlbiBjb21wbGV0ZWQgZm9yIGFsbCBjbGllbnRzLgorICAgIC8vIFRoZSB2YXJpYWJsZSBpcyByZXNldCB0byBmYWxzZSBlYWNoIHRpbWUgYnVmZmVyIGlzIHJlYWQgZnJvbSB0aGUgcmVhbAorICAgIC8vIHNvdXJjZS4KKyAgICBib29sIG1MYXN0UmVhZENvbXBsZXRlZDsKKworICAgIC8vIEEgZ2xvYmFsIG11dGV4IGZvciBhY2Nlc3MgdG8gY3JpdGljYWwgc2VjdGlvbnMuCisgICAgTXV0ZXggbUxvY2s7CisKKyAgICAvLyBDb25kaXRpb24gdmFyaWFibGUgZm9yIHdhaXRpbmcgb24gcmVhZCBmcm9tIHNvdXJjZSB0byBjb21wbGV0ZS4KKyAgICBDb25kaXRpb24gbVJlYWRGcm9tU291cmNlQ29uZGl0aW9uOworCisgICAgLy8gQ29uZGl0aW9uIHZhcmlhYmxlIGZvciB3YWl0aW5nIG9uIGFsbCBjbGllbnQncyBsYXN0IHJlYWQgdG8gY29tcGxldGUuCisgICAgQ29uZGl0aW9uIG1BbGxSZWFkc0NvbXBsZXRlQ29uZGl0aW9uOworCisgICAgLy8gRnVuY3Rpb25zIHVzZWQgYnkgQ2xpZW50IHRvIGltcGxlbWVudCB0aGUgTWVkaWFTb3VyY2UgaW50ZXJmYWNlLgorCisgICAgLy8gSWYgdGhlIHJlYWwgc291cmNlIGhhcyBub3QgYmVlbiBzdGFydGVkIHlldCBieSBhbnkgY2xpZW50LCBzdGFydHMgaXQuCisgICAgc3RhdHVzX3Qgc3RhcnQoaW50IGNsaWVudElkLCBNZXRhRGF0YSAqcGFyYW1zKTsKKworICAgIC8vIFN0b3BzIHRoZSByZWFsIHNvdXJjZSBhZnRlciBhbGwgY2xpZW50cyBoYXZlIGNhbGxlZCBzdG9wKCkuCisgICAgc3RhdHVzX3Qgc3RvcChpbnQgY2xpZW50SWQpOworCisgICAgLy8gcmV0dXJucyB0aGUgcmVhbCBzb3VyY2UncyBnZXRGb3JtYXQoKS4KKyAgICBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KGludCBjbGllbnRJZCk7CisKKyAgICAvLyBJZiB0aGUgY2xpZW50J3MgZGVzaXJlZCBidWZmZXIgaGFzIGFscmVhZHkgYmVlbiByZWFkIGludG8KKyAgICAvLyBtTGFzdFJlYWRNZWRpYUJ1ZmZlciwgcG9pbnRzIHRoZSBidWZmZXIgdG8gdGhhdC4gT3RoZXJ3aXNlIGlmIGl0IGlzIHRoZQorICAgIC8vIG1hc3RlciBjbGllbnQsIHJlYWRzIHRoZSBidWZmZXIgZnJvbSBzb3VyY2Ugb3IgZWxzZSB3YWl0cyBmb3IgdGhlIG1hc3RlcgorICAgIC8vIGNsaWVudCB0byByZWFkIHRoZSBidWZmZXIgYW5kIHVzZXMgdGhhdC4KKyAgICBzdGF0dXNfdCByZWFkKGludCBjbGllbnRJZCwKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworICAgIC8vIE5vdCBpbXBsZW1lbnRlZCByaWdodCBub3cuCisgICAgc3RhdHVzX3QgcGF1c2UoaW50IGNsaWVudElkKTsKKworICAgIC8vIEZ1bmN0aW9uIHdoaWNoIHJlYWRzIGEgYnVmZmVyIGZyb20gdGhlIHJlYWwgc291cmNlIGludG8KKyAgICAvLyBtTGFzdFJlYWRNZWRpYUJ1ZmZlcgorICAgIHZvaWQgcmVhZEZyb21Tb3VyY2VfbG9jayhjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMpOworCisgICAgLy8gV2FpdHMgdW50aWwgcmVhZCBmcm9tIHRoZSByZWFsIHNvdXJjZSBoYXMgYmVlbiBjb21wbGV0ZWQuCisgICAgLy8gX2xvY2sgbWVhbnMgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSB0aHJlYWQgaGFzIGFscmVhZHkKKyAgICAvLyBvYnRhaW5lZCB0aGUgbG9jayBmb3IgdGhlIG11dGV4IG1Mb2NrLgorICAgIHZvaWQgd2FpdEZvclJlYWRGcm9tU291cmNlX2xvY2soaW50MzJfdCBjbGllbnRJZCk7CisKKyAgICAvLyBXYWl0cyB1bnRpbCBhbGwgY2xpZW50cyBoYXZlIHJlYWQgdGhlIGN1cnJlbnQgYnVmZmVyIGluCisgICAgLy8gbUxhc3RSZWFkQ29tcGxldGVkLgorICAgIHZvaWQgd2FpdEZvckFsbENsaWVudHNMYXN0UmVhZF9sb2NrKGludDMyX3QgY2xpZW50SWQpOworCisgICAgLy8gRWFjaCBjbGllbnQgY2FsbHMgdGhpcyBhZnRlciBpdCBjb21wbGV0ZXMgaXRzIHJlYWQoKS4gT25jZSBhbGwgY2xpZW50cworICAgIC8vIGhhdmUgY2FsbGVkIHRoaXMgZm9yIHRoZSBjdXJyZW50IGJ1ZmZlciwgdGhlIGZ1bmN0aW9uIGNhbGxzCisgICAgLy8gbUFsbFJlYWRzQ29tcGxldGVDb25kaXRpb24uYnJvYWRjYXN0KCkgdG8gc2lnbmFsIHRoZSB3YWl0aW5nIGNsaWVudHMuCisgICAgdm9pZCBzaWduYWxSZWFkQ29tcGxldGVfbG9jayhib29sIHJlYWRBYm9ydGVkKTsKKworICAgIC8vIE1ha2UgdGhlc2UgY29uc3RydWN0b3JzIHByaXZhdGUuCisgICAgTWVkaWFTb3VyY2VTcGxpdHRlcigpOworICAgIE1lZGlhU291cmNlU3BsaXR0ZXIoY29uc3QgTWVkaWFTb3VyY2VTcGxpdHRlciAmKTsKKyAgICBNZWRpYVNvdXJjZVNwbGl0dGVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFTb3VyY2VTcGxpdHRlciAmKTsKKworICAgIC8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgTWVkaWFTb3VyY2UgaW50ZXJmYWNlLiBFYWNoIGNsaWVudCBzdG9yZXMgYQorICAgIC8vIHJlZmVyZW5jZSB0byB0aGUgcGFyZW50IE1lZGlhU291cmNlU3BsaXR0ZXIgYW5kIHVzZXMgaXQgdG8gY29tcGxldGUgdGhlCisgICAgLy8gdmFyaW91cyBjYWxscy4KKyAgICBjbGFzcyBDbGllbnQgOiBwdWJsaWMgTWVkaWFTb3VyY2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgLy8gQ29uc3RydWN0b3Igc3RvcmVzIHJlZmVyZW5jZSB0byB0aGUgcGFyZW50IE1lZGlhU291cmNlU3BsaXR0ZXIgYW5kIGl0CisgICAgICAgIC8vIGNsaWVudCBpZC4KKyAgICAgICAgQ2xpZW50KHNwPE1lZGlhU291cmNlU3BsaXR0ZXI+IHNwbGl0dGVyLCBpbnQzMl90IGNsaWVudElkKTsKKworICAgICAgICAvLyBNZWRpYVNvdXJjZSBpbnRlcmZhY2UKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisKKyAgICAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIFJlZmVybmNlIHRvIHRoZSBwYXJlbnQgTWVkaWFTb3VyY2VTcGxpdHRlcgorICAgICAgICBzcDxNZWRpYVNvdXJjZVNwbGl0dGVyPiBtU3BsaXR0ZXI7CisKKyAgICAgICAgLy8gSWQgb2YgdGhpcyBjbGllbnQuCisgICAgICAgIGludDMyX3QgbUNsaWVudElkOworICAgIH07CisKKyAgICBmcmllbmQgY2xhc3MgQ2xpZW50OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9TT1VSQ0VfU1BMSVRURVJfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9Tb3VyY2VEb3duU2FtcGxlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb1NvdXJjZURvd25TYW1wbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM5OTE4YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9Tb3VyY2VEb3duU2FtcGxlci5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBWaWRlb1NvdXJjZURvd25TYW1wbGVyIGltcGxlbWVudHMgdGhlIE1lZGlhU291cmNlIGludGVyZmFjZSwKKy8vIGRvd25zYW1wbGluZyBmcmFtZXMgcHJvdmlkZWQgZnJvbSBhIHJlYWwgdmlkZW8gc291cmNlLgorCisjaWZuZGVmIFZJREVPX1NPVVJDRV9ET1dOX1NBTVBMRVJfSF8KKworI2RlZmluZSBWSURFT19TT1VSQ0VfRE9XTl9TQU1QTEVSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJTWVtb3J5OworY2xhc3MgTWVkaWFCdWZmZXI7CitjbGFzcyBNZXRhRGF0YTsKKworY2xhc3MgVmlkZW9Tb3VyY2VEb3duU2FtcGxlciA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+VmlkZW9Tb3VyY2VEb3duU2FtcGxlcigpOworCisgICAgLy8gQ29uc3RydWN0b3I6CisgICAgLy8gdmlkZW9Tb3VyY2U6IFRoZSByZWFsIHZpZGVvIHNvdXJjZSB3aGljaCBwcm92aWRlcyB0aGUgb3JpZ2luYWwgZnJhbWVzLgorICAgIC8vIHdpZHRoLCBoZWlnaHQ6IFRoZSBkZXNpcmVkIHdpZHRoLCBoZWlnaHQuIFRoZXNlIHNob3VsZCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwKKyAgICAvLyB0byB0aG9zZSBvZiB0aGUgcmVhbCB2aWRlbyBzb3VyY2UuIFdlIHRoZW4gZG93bnNhbXBsZSB0aGUgb3JpZ2luYWwgZnJhbWVzIHRvCisgICAgLy8gdGhpcyBzaXplLgorICAgIFZpZGVvU291cmNlRG93blNhbXBsZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZ2aWRlb1NvdXJjZSwKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworCisgICAgLy8gTWVkaWFTb3VyY2UgaW50ZXJmYWNlCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKK3ByaXZhdGU6CisgICAgLy8gUmVmZXJlbmNlIHRvIHRoZSByZWFsIHZpZGVvIHNvdXJjZS4KKyAgICBzcDxNZWRpYVNvdXJjZT4gbVJlYWxWaWRlb1NvdXJjZTsKKworICAgIC8vIFNpemUgb2YgZnJhbWVzIHRvIGJlIHByb3ZpZGVkIGJ5IHRoaXMgc291cmNlLgorICAgIGludDMyX3QgbVdpZHRoOworICAgIGludDMyX3QgbUhlaWdodDsKKworICAgIC8vIFNpemUgb2YgZnJhbWVzIHByb3ZpZGVkIGJ5IHRoZSByZWFsIHNvdXJjZS4KKyAgICBpbnQzMl90IG1SZWFsU291cmNlV2lkdGg7CisgICAgaW50MzJfdCBtUmVhbFNvdXJjZUhlaWdodDsKKworICAgIC8vIERvd24gc2FtcGxpbmcgcGFyYW10ZXJzLgorICAgIGludDMyX3QgbURvd25TYW1wbGVPZmZzZXRYOworICAgIGludDMyX3QgbURvd25TYW1wbGVPZmZzZXRZOworICAgIGludDMyX3QgbURvd25TYW1wbGVTa2lwWDsKKyAgICBpbnQzMl90IG1Eb3duU2FtcGxlU2tpcFk7CisKKyAgICAvLyBUcnVlIGlmIHdlIG5lZWQgdG8gY3JvcCB0aGUgc3RpbGwgdmlkZW8gaW1hZ2UgdG8gZ2V0IHRoZSB2aWRlbyBmcmFtZS4KKyAgICBib29sIG1OZWVkRG93blNhbXBsaW5nOworCisgICAgLy8gTWV0YSBkYXRhLiBUaGlzIGlzIGEgY29weSBvZiB0aGUgcmVhbCBzb3VyY2UgZXhjZXB0IGZvciB0aGUgd2lkdGggYW5kCisgICAgLy8gaGVpZ2h0IHBhcmFtZXRlcnMuCisgICAgc3A8TWV0YURhdGE+IG1NZXRhOworCisgICAgLy8gQ29tcHV0ZXMgdGhlIG9mZnNldCwgc2tpcCBwYXJhbWV0ZXJzIGZvciBkb3duc2FtcGxpbmcgdGhlIG9yaWdpbmFsIGZyYW1lCisgICAgLy8gdG8gdGhlIGRlc2lyZWQgc2l6ZS4KKyAgICB2b2lkIGNvbXB1dGVEb3duU2FtcGxpbmdQYXJhbWV0ZXJzKCk7CisKKyAgICAvLyBEb3duc2FtcGxlcyB0aGUgZnJhbWUgaW4gc291cmNlQnVmZmVyIHRvIHNpemUgKG1XaWR0aCB4IG1IZWlnaHQpLiBBIG5ldworICAgIC8vIGJ1ZmZlciBpcyBjcmVhdGVkIHdoaWNoIHN0b3JlcyB0aGUgZG93bnNhbXBsZWQgaW1hZ2UuCisgICAgdm9pZCBkb3duU2FtcGxlWVVWSW1hZ2UoY29uc3QgTWVkaWFCdWZmZXIgJnNvdXJjZUJ1ZmZlciwgTWVkaWFCdWZmZXIgKipidWZmZXIpIGNvbnN0OworCisgICAgLy8gRGlzYWxsb3cgdGhlc2UuCisgICAgVmlkZW9Tb3VyY2VEb3duU2FtcGxlcihjb25zdCBWaWRlb1NvdXJjZURvd25TYW1wbGVyICYpOworICAgIFZpZGVvU291cmNlRG93blNhbXBsZXIgJm9wZXJhdG9yPShjb25zdCBWaWRlb1NvdXJjZURvd25TYW1wbGVyICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBWSURFT19TT1VSQ0VfRE9XTl9TQU1QTEVSX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1lVVkNhbnZhcy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ZVVZDYW52YXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjcwOTIzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ZVVZDYW52YXMuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gWVVWQ2FudmFzIGhvbGRzIGEgcmVmZXJlbmNlIHRvIGEgWVVWSW1hZ2Ugb24gd2hpY2ggaXQgY2FuIGRvIHZhcmlvdXMKKy8vIGRyYXdpbmcgb3BlcmF0aW9ucy4gSXQgcHJvdmlkZXMgdmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgZmlsbGluZywKKy8vIGNyb3BwaW5nLCBldGMuCisKKworI2lmbmRlZiBZVVZfQ0FOVkFTX0hfCisKKyNkZWZpbmUgWVVWX0NBTlZBU19IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgWVVWSW1hZ2U7CitjbGFzcyBSZWN0OworCitjbGFzcyBZVVZDYW52YXMgeworcHVibGljOgorCisgICAgLy8gQ29uc3RydWN0b3IgdGFrZXMgaW4gcmVmZXJlbmNlIHRvIGEgeXV2SW1hZ2Ugb24gd2hpY2ggaXQgY2FuIGRvCisgICAgLy8gdmFyaW91cyBkcmF3aW5nIG9wcmVhdGlvbnMuCisgICAgWVVWQ2FudmFzKFlVVkltYWdlICZ5dXZJbWFnZSk7CisgICAgfllVVkNhbnZhcygpOworCisgICAgLy8gRmlsbHMgdGhlIGVudGlyZSBpbWFnZSB3aXRoIHRoZSBnaXZlbiBZVVYgdmFsdWVzLgorICAgIHZvaWQgRmlsbFlVVih1aW50OF90IHlWYWx1ZSwgdWludDhfdCB1VmFsdWUsIHVpbnQ4X3QgdlZhbHVlKTsKKworICAgIC8vIEZpbGxzIHRoZSByZWN0YW5ndWxhciByZWdpb24gW3N0YXJ0WCxlbmRYXXhbc3RhcnRZLGVuZFldIHdpdGggdGhlIGdpdmVuIFlVViB2YWx1ZXMuCisgICAgdm9pZCBGaWxsWVVWUmVjdGFuZ2xlKGNvbnN0IFJlY3QmIHJlY3QsCisgICAgICAgICAgICB1aW50OF90IHlWYWx1ZSwgdWludDhfdCB1VmFsdWUsIHVpbnQ4X3QgdlZhbHVlKTsKKworICAgIC8vIENvcGllcyB0aGUgcmVnaW9uIFtzdGFydFgsZW5kWF14W3N0YXJ0WSxlbmRZXSBmcm9tIHNyY0ltYWdlIGludG8gdGhlCisgICAgLy8gY2FudmFzJyB0YXJnZXQgaW1hZ2UgKG1ZVVZJbWFnZSkgc3RhcnRpbmcgYXQKKyAgICAvLyAoZGVzdGluYXRpb25TdGFydFgsZGVzdGluYXRpb25TdGFydFkpLgorICAgIC8vIE5vdGUgdGhhdCB1bmRlZmluZWQgYmVoYXZpb3IgbWF5IG9jY3VyIGlmIHNyY0ltYWdlIGlzIHNhbWUgYXMgdGhlIGNhbnZhcycKKyAgICAvLyB0YXJnZXQgaW1hZ2UuCisgICAgdm9pZCBDb3B5SW1hZ2VSZWN0KAorICAgICAgICAgICAgY29uc3QgUmVjdCYgc3JjUmVjdCwKKyAgICAgICAgICAgIGludDMyX3QgZGVzdFN0YXJ0WCwgaW50MzJfdCBkZXN0U3RhcnRZLAorICAgICAgICAgICAgY29uc3QgWVVWSW1hZ2UgJnNyY0ltYWdlKTsKKworICAgIC8vIERvd25zYW1wbGVzIHRoZSBzcmNJbWFnZSBpbnRvIHRoZSBjYW52YXMnIHRhcmdldCBpbWFnZSAobVlVVkltYWdlKQorICAgIC8vIFRoZSBkb3duc2FtcGxpbmcgY29waWVzIHBpeGVscyBmcm9tIHRoZSBzb3VyY2UgaW1hZ2Ugc3RhcnRpbmcgYXQKKyAgICAvLyAoc3JjT2Zmc2V0WCwgc3JjT2Zmc2V0WSkgdG8gdGhlIHRhcmdldCBpbWFnZSwgc3RhcnRpbmcgYXQgKDAsIDApLgorICAgIC8vIEZvciBlYWNoIFggaW5jcmVtZW50IGluIHRoZSB0YXJnZXQgaW1hZ2UsIHNraXBYIHBpeGVscyBhcmUgc2tpcHBlZAorICAgIC8vIGluIHRoZSBzb3VyY2UgaW1hZ2UuCisgICAgLy8gU2ltaWxhcmx5IGZvciBlYWNoIFkgaW5jcmVtZW50IGluIHRoZSB0YXJnZXQgaW1hZ2UsIHNraXBZIHBpeGVscworICAgIC8vIGFyZSBza2lwcGVkIGluIHRoZSBzb3VyY2UgaW1hZ2UuCisgICAgdm9pZCBkb3duc2FtcGxlKAorICAgICAgICAgICAgaW50MzJfdCBzcmNPZmZzZXRYLCBpbnQzMl90IHNyY09mZnNldFksCisgICAgICAgICAgICBpbnQzMl90IHNraXBYLCBpbnQzMl90IHNraXBZLAorICAgICAgICAgICAgY29uc3QgWVVWSW1hZ2UgJnNyY0ltYWdlKTsKKworcHJpdmF0ZToKKyAgICBZVVZJbWFnZSYgbVlVVkltYWdlOworCisgICAgWVVWQ2FudmFzKGNvbnN0IFlVVkNhbnZhcyAmKTsKKyAgICBZVVZDYW52YXMgJm9wZXJhdG9yPShjb25zdCBZVVZDYW52YXMgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFlVVl9DQU5WQVNfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvWVVWSW1hZ2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvWVVWSW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTk4NjE4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ZVVZJbWFnZS5oCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gQSBjb250YWluZXIgY2xhc3MgdG8gaG9sZCBZVVYgZGF0YSBhbmQgcHJvdmlkZSB2YXJpb3VzIHV0aWxpdGllcywKKy8vIGUuZy4gdG8gc2V0L2dldCBwaXhlbCB2YWx1ZXMuCisvLyBTdXBwb3J0ZWQgZm9ybWF0czoKKy8vICAtIFlVVjQyMCBQbGFuYXIKKy8vICAtIFlVVjQyMCBTZW1pIFBsYW5hcgorLy8KKy8vICBDdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydCB2YXJpYWJsZSBzdHJpZGVzLgorLy8KKy8vICBJbXBsZW1lbnRhdGlvbjogVHdvIHNpbXBsZSBhYnN0cmFjdGlvbnMgYXJlIGRvbmUgdG8gc2ltcGxpZnkgYWNjZXNzCisvLyAgdG8gWVVWIGNoYW5uZWxzIGZvciBkaWZmZXJlbnQgZm9ybWF0czoKKy8vICAtIGluaXRpYWxpemVZVVZQb2ludGVycygpIHNldHMgdXAgcG9pbnRlcnMgKG1ZZGF0YSwgbVVkYXRhLCBtVmRhdGEpIHRvCisvLyAgcG9pbnQgdG8gdGhlIHJpZ2h0IHN0YXJ0IGxvY2F0aW9ucyBvZiB0aGUgZGlmZmVyZW50IGNoYW5uZWwgZGF0YSBkZXBlbmRpbmcKKy8vICBvbiB0aGUgZm9ybWF0LgorLy8gIC0gZ2V0T2Zmc2V0cygpIHJldHVybnMgdGhlIGNvcnJlY3Qgb2Zmc2V0IGZvciB0aGUgZGlmZmVyZW50IGNoYW5uZWxzCisvLyAgZGVwZW5kaW5nIG9uIHRoZSBmb3JtYXQuCisvLyAgTG9jYXRpb24gb2YgYW55IHBpeGVsJ3MgWVVWIGNoYW5uZWxzIGNhbiB0aGVuIGJlIGVhc2lseSBjb21wdXRlZCB1c2luZyB0aGVzZS4KKy8vCisKKyNpZm5kZWYgWVVWX0lNQUdFX0hfCisKKyNkZWZpbmUgWVVWX0lNQUdFX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFJlY3Q7CisKK2NsYXNzIFlVVkltYWdlIHsKK3B1YmxpYzoKKyAgICAvLyBTdXBwb3J0ZWQgWVVWIGZvcm1hdHMKKyAgICBlbnVtIFlVVkZvcm1hdCB7CisgICAgICAgIFlVVjQyMFBsYW5hciwKKyAgICAgICAgWVVWNDIwU2VtaVBsYW5hcgorICAgIH07CisKKyAgICAvLyBDb25zdHJ1Y3RzIGFuIGltYWdlIHdpdGggdGhlIGdpdmVuIHNpemUsIGZvcm1hdC4gQWxzbyBhbGxvY2F0ZXMgYW5kIG93bnMKKyAgICAvLyB0aGUgcmVxdWlyZWQgbWVtb3J5LgorICAgIFlVVkltYWdlKFlVVkZvcm1hdCB5dXZGb3JtYXQsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKworICAgIC8vIENvbnN0cnVjdHMgYW4gaW1hZ2Ugd2l0aCB0aGUgZ2l2ZW4gc2l6ZSwgZm9ybWF0LiBUaGUgbWVtb3J5IGlzIHByb3ZpZGVkCisgICAgLy8gYnkgdGhlIGNhbGxlciBhbmQgd2UgZG9uJ3Qgb3duIGl0LgorICAgIFlVVkltYWdlKFlVVkZvcm1hdCB5dXZGb3JtYXQsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCB1aW50OF90ICpidWZmZXIpOworCisgICAgLy8gRGVzdHJ1Y3RvciB0byBkZWxldGUgdGhlIG1lbW9yeSBpZiBpdCBvd25zIGl0LgorICAgIH5ZVVZJbWFnZSgpOworCisgICAgLy8gUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSBZVVYgZGF0YSBmb3IgdGhlIGdpdmVuCisgICAgLy8gZm9ybWF0IGFuZCBnZW9tZXRyeS4gVXNlZnVsIHdoZW4gdGhlIGNhbGxlciB3YW50cyB0byBhbGxvY2F0ZSB0aGUgcmVxdWlzaXRlCisgICAgLy8gbWVtb3J5LgorICAgIHN0YXRpYyBzaXplX3QgYnVmZmVyU2l6ZShZVVZGb3JtYXQgeXV2Rm9ybWF0LCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisKKyAgICBpbnQzMl90IHdpZHRoKCkgY29uc3Qge3JldHVybiBtV2lkdGg7fQorICAgIGludDMyX3QgaGVpZ2h0KCkgY29uc3Qge3JldHVybiBtSGVpZ2h0O30KKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBwaXhlbCBpcyB0aGUgcmFuZ2UgWzAsIHdpZHRoLTFdIHggWzAsIGhlaWdodC0xXQorICAgIC8vIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgYm9vbCB2YWxpZFBpeGVsKGludDMyX3QgeCwgaW50MzJfdCB5KSBjb25zdDsKKworICAgIC8vIEdldCB0aGUgcGl4ZWwgWVVWIHZhbHVlIGF0IHBpeGVsICh4LHkpLgorICAgIC8vIE5vdGUgdGhhdCB0aGUgcmFuZ2Ugb2YgeCBpcyBbMCwgd2lkdGgtMV0gYW5kIHRoZSByYW5nZSBvZiB5IGlzIFswLCBoZWlnaHQtMV0uCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGdldCB3YXMgc3VjY2Vzc2Z1bCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgZ2V0UGl4ZWxWYWx1ZShpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgICAgIHVpbnQ4X3QgKnlQdHIsIHVpbnQ4X3QgKnVQdHIsIHVpbnQ4X3QgKnZQdHIpIGNvbnN0OworCisgICAgLy8gU2V0IHRoZSBwaXhlbCBZVVYgdmFsdWUgYXQgcGl4ZWwgKHgseSkuCisgICAgLy8gTm90ZSB0aGF0IHRoZSByYW5nZSBvZiB4IGlzIFswLCB3aWR0aC0xXSBhbmQgdGhlIHJhbmdlIG9mIHkgaXMgWzAsIGhlaWdodC0xXS4KKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgc2V0IHdhcyBzdWNjZXNzZnVsIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgYm9vbCBzZXRQaXhlbFZhbHVlKGludDMyX3QgeCwgaW50MzJfdCB5LAorICAgICAgICAgICAgdWludDhfdCB5VmFsdWUsIHVpbnQ4X3QgdVZhbHVlLCB1aW50OF90IHZWYWx1ZSk7CisKKyAgICAvLyBVc2VzIG1lbWNweSB0byBjb3B5IGFuIGVudGlyZSByb3cgb2YgZGF0YQorICAgIHN0YXRpYyB2b2lkIGZhc3RDb3B5UmVjdGFuZ2xlNDIwUGxhbmFyKAorICAgICAgICAgICAgY29uc3QgUmVjdCYgc3JjUmVjdCwKKyAgICAgICAgICAgIGludDMyX3QgZGVzdFN0YXJ0WCwgaW50MzJfdCBkZXN0U3RhcnRZLAorICAgICAgICAgICAgY29uc3QgWVVWSW1hZ2UgJnNyY0ltYWdlLCBZVVZJbWFnZSAmZGVzdEltYWdlKTsKKworICAgIC8vIFVzZXMgbWVtY3B5IHRvIGNvcHkgYW4gZW50aXJlIHJvdyBvZiBkYXRhCisgICAgc3RhdGljIHZvaWQgZmFzdENvcHlSZWN0YW5nbGU0MjBTZW1pUGxhbmFyKAorICAgICAgICAgICAgY29uc3QgUmVjdCYgc3JjUmVjdCwKKyAgICAgICAgICAgIGludDMyX3QgZGVzdFN0YXJ0WCwgaW50MzJfdCBkZXN0U3RhcnRZLAorICAgICAgICAgICAgY29uc3QgWVVWSW1hZ2UgJnNyY0ltYWdlLCBZVVZJbWFnZSAmZGVzdEltYWdlKTsKKworICAgIC8vIFRyaWVzIHRvIHVzZSBtZW1jb3B5IHRvIGNvcHkgZW50aXJlIHJvd3Mgb2YgZGF0YS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIGZhc3QgY29weSBpcyBub3QgcG9zc2libGUgZm9yIHRoZSBwYXNzZWQgaW1hZ2UgZm9ybWF0cy4KKyAgICBzdGF0aWMgYm9vbCBmYXN0Q29weVJlY3RhbmdsZSgKKyAgICAgICAgICAgIGNvbnN0IFJlY3QmIHNyY1JlY3QsCisgICAgICAgICAgICBpbnQzMl90IGRlc3RTdGFydFgsIGludDMyX3QgZGVzdFN0YXJ0WSwKKyAgICAgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSwgWVVWSW1hZ2UgJmRlc3RJbWFnZSk7CisKKyAgICAvLyBDb252ZXJ0IHRoZSBnaXZlbiBZVVYgdmFsdWUgdG8gUkdCLgorICAgIHZvaWQgeXV2MnJnYih1aW50OF90IHlWYWx1ZSwgdWludDhfdCB1VmFsdWUsIHVpbnQ4X3QgdlZhbHVlLAorICAgICAgICB1aW50OF90ICpyLCB1aW50OF90ICpnLCB1aW50OF90ICpiKSBjb25zdDsKKworICAgIC8vIFdyaXRlIHRoZSBpbWFnZSB0byBhIGh1bWFuIHJlYWRhYmxlIFBQTSBmaWxlLgorICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB3cml0ZSB3YXMgc3VjY2VzZnVsIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgYm9vbCB3cml0ZVRvUFBNKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvLyBZVVYgRm9ybWF0IG9mIHRoZSBpbWFnZS4KKyAgICBZVVZGb3JtYXQgbVlVVkZvcm1hdDsKKworICAgIGludDMyX3QgbVdpZHRoOworICAgIGludDMyX3QgbUhlaWdodDsKKworICAgIC8vIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBidWZmZXIuCisgICAgdWludDhfdCAqbUJ1ZmZlcjsKKworICAgIC8vIEJvb2xlYW4gdGVsbGluZyB3aGV0aGVyIHdlIG93biB0aGUgbWVtb3J5IGJ1ZmZlci4KKyAgICBib29sIG1Pd25CdWZmZXI7CisKKyAgICAvLyBQb2ludGVyIHRvIHN0YXJ0IG9mIHRoZSBZIGRhdGEgcGxhbmUuCisgICAgdWludDhfdCAqbVlkYXRhOworCisgICAgLy8gUG9pbnRlciB0byBzdGFydCBvZiB0aGUgVSBkYXRhIHBsYW5lLiBOb3RlIHRoYXQgaW4gY2FzZSBvZiBpbnRlcmxlYXZlZCBmb3JtYXRzIGxpa2UKKyAgICAvLyBZVVY0MjAgc2VtaXBsYW5hciwgbVVkYXRhIHBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlIFUgZGF0YSBpbiB0aGUgVVYgcGxhbmUuCisgICAgdWludDhfdCAqbVVkYXRhOworCisgICAgLy8gUG9pbnRlciB0byBzdGFydCBvZiB0aGUgViBkYXRhIHBsYW5lLiBOb3RlIHRoYXQgaW4gY2FzZSBvZiBpbnRlcmxlYXZlZCBmb3JtYXRzIGxpa2UKKyAgICAvLyBZVVY0MjAgc2VtaXBsYW5hciwgbVZkYXRhIHBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlIFYgZGF0YSBpbiB0aGUgVVYgcGxhbmUuCisgICAgdWludDhfdCAqbVZkYXRhOworCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcG9pbnRlcnMgbVlkYXRhLCBtVWRhdGEsIG1WZGF0YSB0byBwb2ludCB0byB0aGUgcmlnaHQgbG9jYXRpb25zIGZvcgorICAgIC8vIHRoZSBnaXZlbiBmb3JtYXQgYW5kIGdlb21ldHJ5LgorICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBpbml0aWFsaXplIHdhcyBzdWNjZXNmdWwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIGluaXRpYWxpemVZVVZQb2ludGVycygpOworCisgICAgLy8gRm9yIHRoZSBnaXZlbiBwaXhlbCBsb2NhdGlvbiwgdGhpcyByZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIGxvY2F0aW9uIG9mIHksIHUgYW5kIHYKKyAgICAvLyBkYXRhIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgYmFzZSBwb2ludGVycyAtLSBtWWRhdGEsIG1VZGF0YSwgbVZkYXRhLgorICAgIC8vIE5vdGUgdGhhdCB0aGUgcmFuZ2Ugb2YgeCBpcyBbMCwgd2lkdGgtMV0gYW5kIHRoZSByYW5nZSBvZiB5IGlzIFswLCBoZWlnaHQtMV0uCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGdldHRpbmcgb2Zmc2V0cyB3YXMgc3VjY2VzZnVsIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgYm9vbCBnZXRPZmZzZXRzKGludDMyX3QgeCwgaW50MzJfdCB5LAorICAgICAgICBpbnQzMl90ICp5T2Zmc2V0LCBpbnQzMl90ICp1T2Zmc2V0LCBpbnQzMl90ICp2T2Zmc2V0KSBjb25zdDsKKworICAgIC8vIFJldHVybnMgdGhlIG9mZnNldCBpbmNyZW1lbnRzIGluY3VycmVkIGluIGdvaW5nIGZyb20gb25lIGRhdGEgcm93IHRvIHRoZSBuZXh0IGRhdGEgcm93CisgICAgLy8gZm9yIHRoZSBZVVYgY2hhbm5lbHMuIE5vdGUgdGhhdCB0aGlzIGNvcnJlc3BvbmRzIHRvIGRhdGEgcm93cyBhbmQgbm90IHBpeGVsIHJvd3MuCisgICAgLy8gRS5nLiBkZXBlbmRpbmcgb24gZm9ybWF0cywgVS9WIGNoYW5uZWxzIG1heSBoYXZlIG9ubHkgb25lIGRhdGEgcm93IGNvcnJlc3BvbmRpbmcKKyAgICAvLyB0byB0d28gcGl4ZWwgcm93cy4KKyAgICBib29sIGdldE9mZnNldEluY3JlbWVudHNQZXJEYXRhUm93KAorICAgICAgICBpbnQzMl90ICp5RGF0YU9mZnNldEluY3JlbWVudCwKKyAgICAgICAgaW50MzJfdCAqdURhdGFPZmZzZXRJbmNyZW1lbnQsCisgICAgICAgIGludDMyX3QgKnZEYXRhT2Zmc2V0SW5jcmVtZW50KSBjb25zdDsKKworICAgIC8vIEdpdmVuIHRoZSBvZmZzZXQgcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwncyBkYXRhLgorICAgIHVpbnQ4X3QqIGdldFlBZGRyZXNzKGludDMyX3Qgb2Zmc2V0KSBjb25zdDsKKyAgICB1aW50OF90KiBnZXRVQWRkcmVzcyhpbnQzMl90IG9mZnNldCkgY29uc3Q7CisgICAgdWludDhfdCogZ2V0VkFkZHJlc3MoaW50MzJfdCBvZmZzZXQpIGNvbnN0OworCisgICAgLy8gR2l2ZW4gdGhlIHBpeGVsIGxvY2F0aW9uLCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwncyBkYXRhLgorICAgIC8vIE5vdGUgdGhhdCB0aGUgcmFuZ2Ugb2YgeCBpcyBbMCwgd2lkdGgtMV0gYW5kIHRoZSByYW5nZSBvZiB5IGlzIFswLCBoZWlnaHQtMV0uCisgICAgYm9vbCBnZXRZVVZBZGRyZXNzZXMoaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgIHVpbnQ4X3QgKip5QWRkciwgdWludDhfdCAqKnVBZGRyLCB1aW50OF90ICoqdkFkZHIpIGNvbnN0OworCisgICAgLy8gRGlzYWxsb3cgaW1wbGljaXQgY2FzdGluZyBhbmQgY29weWluZy4KKyAgICBZVVZJbWFnZShjb25zdCBZVVZJbWFnZSAmKTsKKyAgICBZVVZJbWFnZSAmb3BlcmF0b3I9KGNvbnN0IFlVVkltYWdlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBZVVZfSU1BR0VfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oIGIvaW5jbHVkZS9zdXJmYWNlZmxpbmdlci9TdXJmYWNlLmgKaW5kZXggMjI2ODRkYi4uY2VmNDM5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zdXJmYWNlZmxpbmdlci9TdXJmYWNlLmgKKysrIGIvaW5jbHVkZS9zdXJmYWNlZmxpbmdlci9TdXJmYWNlLmgKQEAgLTk0LDcgKzk0LDcgQEAKICAgICBmcmllbmQgY2xhc3MgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OwogCiAgICAgLy8gY2FtZXJhIGFuZCBjYW1jb3JkZXIgbmVlZCBhY2Nlc3MgdG8gdGhlIElTdXJmYWNlIGJpbmRlciBpbnRlcmZhY2UgZm9yIHByZXZpZXcKLSAgICBmcmllbmQgY2xhc3MgQ2FtZXJhOworICAgIGZyaWVuZCBjbGFzcyBDYW1lcmFTZXJ2aWNlOwogICAgIGZyaWVuZCBjbGFzcyBNZWRpYVJlY29yZGVyOwogICAgIC8vIG1lZGlhcGxheWVyIG5lZWRzIGFjY2VzcyB0byBJU3VyZmFjZSBmb3IgZGlzcGxheQogICAgIGZyaWVuZCBjbGFzcyBNZWRpYVBsYXllcjsKQEAgLTE3MywxMSArMTczLDEyIEBACiAgICAgICogKGV2ZW50dWFsbHkgdGhpcyBzaG91bGQgZ28gYXdheSBhbmQgYmUgcmVwbGFjZWQgYnkgcHJvcGVyIEFQSXMpCiAgICAgICovCiAgICAgLy8gY2FtZXJhIGFuZCBjYW1jb3JkZXIgbmVlZCBhY2Nlc3MgdG8gdGhlIElTdXJmYWNlIGJpbmRlciBpbnRlcmZhY2UgZm9yIHByZXZpZXcKLSAgICBmcmllbmQgY2xhc3MgQ2FtZXJhOworICAgIGZyaWVuZCBjbGFzcyBDYW1lcmFTZXJ2aWNlOwogICAgIGZyaWVuZCBjbGFzcyBNZWRpYVJlY29yZGVyOwogICAgIC8vIE1lZGlhUGxheWVyIG5lZWRzIGFjY2VzcyB0byBJU3VyZmFjZSBmb3IgZGlzcGxheQogICAgIGZyaWVuZCBjbGFzcyBNZWRpYVBsYXllcjsKICAgICBmcmllbmQgY2xhc3MgSU9NWDsKKyAgICBmcmllbmQgY2xhc3MgU29mdHdhcmVSZW5kZXJlcjsKICAgICAvLyB0aGlzIGlzIGp1c3QgdG8gYmUgYWJsZSB0byB3cml0ZSBzb21lIHVuaXQgdGVzdHMKICAgICBmcmllbmQgY2xhc3MgVGVzdDsKIApAQCAtMzE0LDQgKzMxNSwzIEBACiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9TRl9TVVJGQUNFX0gKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9JbnB1dERpc3BhdGNoZXIuaCBiL2luY2x1ZGUvdWkvSW5wdXREaXNwYXRjaGVyLmgKaW5kZXggY2MxNjAxMi4uOGQ0NjU0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91aS9JbnB1dERpc3BhdGNoZXIuaAorKysgYi9pbmNsdWRlL3VpL0lucHV0RGlzcGF0Y2hlci5oCkBAIC0zNTUsNiArMzU1LDE0IEBACiAgICAgICovCiAgICAgdmlydHVhbCB2b2lkIHNldElucHV0RGlzcGF0Y2hNb2RlKGJvb2wgZW5hYmxlZCwgYm9vbCBmcm96ZW4pID0gMDsKIAorICAgIC8qIFRyYW5zZmVycyB0b3VjaCBmb2N1cyBmcm9tIHRoZSB3aW5kb3cgYXNzb2NpYXRlZCB3aXRoIG9uZSBjaGFubmVsIHRvIHRoZQorICAgICAqIHdpbmRvdyBhc3NvY2lhdGVkIHdpdGggdGhlIG90aGVyIGNoYW5uZWwuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4gIEZhbHNlIGlmIHRoZSB3aW5kb3cgZGlkIG5vdCBhY3R1YWxseSBoYXZlIHRvdWNoIGZvY3VzLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCB0cmFuc2ZlclRvdWNoRm9jdXMoY29uc3Qgc3A8SW5wdXRDaGFubmVsPiYgZnJvbUNoYW5uZWwsCisgICAgICAgICAgICBjb25zdCBzcDxJbnB1dENoYW5uZWw+JiB0b0NoYW5uZWwpID0gMDsKKwogICAgIC8qIFJlZ2lzdGVycyBvciB1bnJlZ2lzdGVyIGlucHV0IGNoYW5uZWxzIHRoYXQgbWF5IGJlIHVzZWQgYXMgdGFyZ2V0cyBmb3IgaW5wdXQgZXZlbnRzLgogICAgICAqIElmIG1vbml0b3IgaXMgdHJ1ZSwgdGhlIGNoYW5uZWwgd2lsbCByZWNlaXZlIGEgY29weSBvZiBhbGwgaW5wdXQgZXZlbnRzLgogICAgICAqCkBAIC00MDksNiArNDE3LDkgQEAKICAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9jdXNlZEFwcGxpY2F0aW9uKGNvbnN0IElucHV0QXBwbGljYXRpb24qIGlucHV0QXBwbGljYXRpb24pOwogICAgIHZpcnR1YWwgdm9pZCBzZXRJbnB1dERpc3BhdGNoTW9kZShib29sIGVuYWJsZWQsIGJvb2wgZnJvemVuKTsKIAorICAgIHZpcnR1YWwgYm9vbCB0cmFuc2ZlclRvdWNoRm9jdXMoY29uc3Qgc3A8SW5wdXRDaGFubmVsPiYgZnJvbUNoYW5uZWwsCisgICAgICAgICAgICBjb25zdCBzcDxJbnB1dENoYW5uZWw+JiB0b0NoYW5uZWwpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlcklucHV0Q2hhbm5lbChjb25zdCBzcDxJbnB1dENoYW5uZWw+JiBpbnB1dENoYW5uZWwsIGJvb2wgbW9uaXRvcik7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVySW5wdXRDaGFubmVsKGNvbnN0IHNwPElucHV0Q2hhbm5lbD4mIGlucHV0Q2hhbm5lbCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvU2luZ2xldG9uLmggYi9pbmNsdWRlL3V0aWxzL1NpbmdsZXRvbi5oCmluZGV4IDNiOTc1YjQuLmUxZWU4ZWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdXRpbHMvU2luZ2xldG9uLmgKKysrIGIvaW5jbHVkZS91dGlscy9TaW5nbGV0b24uaApAQCAtMzcsNiArMzcsMTEgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gKmluc3RhbmNlOwogICAgIH0KKworICAgIHN0YXRpYyBib29sIGhhc0luc3RhbmNlKCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woc0xvY2spOworICAgICAgICByZXR1cm4gc0luc3RhbmNlICE9IDA7CisgICAgfQogICAgIAogcHJvdGVjdGVkOgogICAgIH5TaW5nbGV0b24oKSB7IH07CmRpZmYgLS1naXQgYS9saWJzL2JpbmRlci9BbmRyb2lkLm1rIGIvbGlicy9iaW5kZXIvQW5kcm9pZC5tawppbmRleCAxM2RjNTAwLi5mOWQ5ZjI1IDEwMDY0NAotLS0gYS9saWJzL2JpbmRlci9BbmRyb2lkLm1rCisrKyBiL2xpYnMvYmluZGVyL0FuZHJvaWQubWsKQEAgLTE2LDYgKzE2LDcgQEAKIHNvdXJjZXMgOj0gXAogICAgIEJpbmRlci5jcHAgXAogICAgIEJwQmluZGVyLmNwcCBcCisgICAgQ3Vyc29yV2luZG93LmNwcCBcCiAgICAgSUludGVyZmFjZS5jcHAgXAogICAgIElNZW1vcnkuY3BwIFwKICAgICBJUENUaHJlYWRTdGF0ZS5jcHAgXApkaWZmIC0tZ2l0IGEvbGlicy9iaW5kZXIvQ3Vyc29yV2luZG93LmNwcCBiL2xpYnMvYmluZGVyL0N1cnNvcldpbmRvdy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkNGRkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYmluZGVyL0N1cnNvcldpbmRvdy5jcHAKQEAgLTAsMCArMSw0MTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQ3Vyc29yV2luZG93IgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8YmluZGVyL0N1cnNvcldpbmRvdy5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitDdXJzb3JXaW5kb3c6OkN1cnNvcldpbmRvdyhzaXplX3QgbWF4U2l6ZSkgOgorICAgIG1NYXhTaXplKG1heFNpemUpCit7Cit9CisKK2Jvb2wgQ3Vyc29yV2luZG93OjpzZXRNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbW9yeSkKK3sKKyAgICBtTWVtb3J5ID0gbWVtb3J5OworICAgIG1EYXRhID0gKHVpbnQ4X3QgKikgbWVtb3J5LT5wb2ludGVyKCk7CisgICAgaWYgKG1EYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtSGVhZGVyID0gKHdpbmRvd19oZWFkZXJfdCAqKSBtRGF0YTsKKworICAgIC8vIE1ha2UgdGhlIHdpbmRvdyByZWFkLW9ubHkKKyAgICBzc2l6ZV90IHNpemUgPSBtZW1vcnktPnNpemUoKTsKKyAgICBtU2l6ZSA9IHNpemU7CisgICAgbU1heFNpemUgPSBzaXplOworICAgIG1GcmVlT2Zmc2V0ID0gc2l6ZTsKK0xPR19XSU5ET1coIkNyZWF0ZWQgQ3Vyc29yV2luZG93IGZyb20gZXhpc3RpbmcgSU1lbW9yeTogbUZyZWVPZmZzZXQgPSAlZCwgbnVtUm93cyA9ICVkLCBudW1Db2x1bW5zID0gJWQsIG1TaXplID0gJWQsIG1NYXhTaXplID0gJWQsIG1EYXRhID0gJXAiLCBtRnJlZU9mZnNldCwgbUhlYWRlci0+bnVtUm93cywgbUhlYWRlci0+bnVtQ29sdW1ucywgbVNpemUsIG1NYXhTaXplLCBtRGF0YSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ3Vyc29yV2luZG93Ojppbml0QnVmZmVyKGJvb2wgbG9jYWxPbmx5KQoreworICAgIC8vVE9ETyBVc2UgYSBub24tbWVtb3J5IGRlYWxlciBtbWFwIHJlZ2lvbiBmb3IgbG9jYWxPbmx5CisKKyAgICBzcDxNZW1vcnlIZWFwQmFzZT4gaGVhcDsKKyAgICBoZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKG1NYXhTaXplLCAwLCAiQ3Vyc29yV2luZG93Iik7CisgICAgaWYgKGhlYXAgIT0gTlVMTCkgeworICAgICAgICBtTWVtb3J5ID0gbmV3IE1lbW9yeUJhc2UoaGVhcCwgMCwgbU1heFNpemUpOworICAgICAgICBpZiAobU1lbW9yeSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtRGF0YSA9ICh1aW50OF90ICopIG1NZW1vcnktPnBvaW50ZXIoKTsKKyAgICAgICAgICAgIGlmIChtRGF0YSkgeworICAgICAgICAgICAgICAgIG1IZWFkZXIgPSAod2luZG93X2hlYWRlcl90ICopIG1EYXRhOworICAgICAgICAgICAgICAgIG1TaXplID0gbU1heFNpemU7CisKKyAgICAgICAgICAgICAgICAvLyBQdXQgdGhlIHdpbmRvdyBpbnRvIGEgY2xlYW4gc3RhdGUKKyAgICAgICAgICAgICAgICBjbGVhcigpOworICAgICAgICAgICAgTE9HX1dJTkRPVygiQ3JlYXRlZCBDdXJzb3JXaW5kb3cgd2l0aCBuZXcgTWVtb3J5RGVhbGVyOiBtRnJlZU9mZnNldCA9ICVkLCBtU2l6ZSA9ICVkLCBtTWF4U2l6ZSA9ICVkLCBtRGF0YSA9ICVwIiwgbUZyZWVPZmZzZXQsIG1TaXplLCBtTWF4U2l6ZSwgbURhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAKKyAgICAgICAgTE9HRSgiQ3Vyc29yV2luZG93IGhlYXAgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoImZhaWxlZCB0byBjcmVhdGUgdGhlIEN1cnNvcldpbmRvdyBoZWFwIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK0N1cnNvcldpbmRvdzo6fkN1cnNvcldpbmRvdygpCit7CisgICAgLy8gRXZlcnl0aGluZyB0aGF0IG1hdHRlcnMgaXMgYSBzbWFydCBwb2ludGVyCit9CisKK3ZvaWQgQ3Vyc29yV2luZG93OjpjbGVhcigpCit7CisgICAgbUhlYWRlci0+bnVtUm93cyA9IDA7CisgICAgbUhlYWRlci0+bnVtQ29sdW1ucyA9IDA7CisgICAgbUZyZWVPZmZzZXQgPSBzaXplb2Yod2luZG93X2hlYWRlcl90KSArIFJPV19TTE9UX0NIVU5LX1NJWkU7CisgICAgLy8gTWFyayB0aGUgZmlyc3QgY2h1bmsncyBuZXh0ICdwb2ludGVyJyBhcyBudWxsCisgICAgKigodWludDMyX3QgKikobURhdGEgKyBtRnJlZU9mZnNldCAtIHNpemVvZih1aW50MzJfdCkpKSA9IDA7Cit9CisKK2ludDMyX3QgQ3Vyc29yV2luZG93OjpmcmVlU3BhY2UoKQoreworICAgIGludDMyX3QgZnJlZVNwYWNlID0gbVNpemUgLSBtRnJlZU9mZnNldDsKKyAgICBpZiAoZnJlZVNwYWNlIDwgMCkgeworICAgICAgICBmcmVlU3BhY2UgPSAwOworICAgIH0KKyAgICByZXR1cm4gZnJlZVNwYWNlOworfQorCitmaWVsZF9zbG90X3QgKiBDdXJzb3JXaW5kb3c6OmFsbG9jUm93KCkKK3sKKyAgICAvLyBGaWxsIGluIHRoZSByb3cgc2xvdAorICAgIHJvd19zbG90X3QgKiByb3dTbG90ID0gYWxsb2NSb3dTbG90KCk7CisgICAgaWYgKHJvd1Nsb3QgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZSB0aGUgc2xvdHMgZm9yIHRoZSBmaWVsZCBkaXJlY3RvcnkKKyAgICBzaXplX3QgZmllbGREaXJTaXplID0gbUhlYWRlci0+bnVtQ29sdW1ucyAqIHNpemVvZihmaWVsZF9zbG90X3QpOworICAgIHVpbnQzMl90IGZpZWxkRGlyT2Zmc2V0ID0gYWxsb2MoZmllbGREaXJTaXplKTsKKyAgICBpZiAoIWZpZWxkRGlyT2Zmc2V0KSB7CisgICAgICAgIG1IZWFkZXItPm51bVJvd3MtLTsKKyAgICAgICAgTE9HRSgiVGhlIHJvdyBmYWlsZWQsIHNvIGJhY2sgb3V0IHRoZSBuZXcgcm93IGFjY291bnRpbmcgZnJvbSBhbGxvY1Jvd1Nsb3QgJWQiLCBtSGVhZGVyLT5udW1Sb3dzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkRGlyID0gKGZpZWxkX3Nsb3RfdCAqKW9mZnNldFRvUHRyKGZpZWxkRGlyT2Zmc2V0KTsKKyAgICBtZW1zZXQoZmllbGREaXIsIDB4MCwgZmllbGREaXJTaXplKTsKKworTE9HX1dJTkRPVygiQWxsb2NhdGVkIHJvdyAldSwgcm93U2xvdCBpcyBhdCBvZmZzZXQgJXUsIGZpZWxkRGlyIGlzICVkIGJ5dGVzIGF0IG9mZnNldCAldVxuIiwgKG1IZWFkZXItPm51bVJvd3MgLSAxKSwgKCh1aW50OF90ICopcm93U2xvdCkgLSBtRGF0YSwgZmllbGREaXJTaXplLCBmaWVsZERpck9mZnNldCk7CisgICAgcm93U2xvdC0+b2Zmc2V0ID0gZmllbGREaXJPZmZzZXQ7CisKKyAgICByZXR1cm4gZmllbGREaXI7Cit9CisKK3VpbnQzMl90IEN1cnNvcldpbmRvdzo6YWxsb2Moc2l6ZV90IHJlcXVlc3RlZFNpemUsIGJvb2wgYWxpZ25lZCkKK3sKKyAgICBpbnQzMl90IHNpemU7CisgICAgdWludDMyX3QgcGFkZGluZzsKKyAgICBpZiAoYWxpZ25lZCkgeworICAgICAgICAvLyA0IGJ5dGUgYWxpZ25tZW50CisgICAgICAgIHBhZGRpbmcgPSA0IC0gKG1GcmVlT2Zmc2V0ICYgMHgzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwYWRkaW5nID0gMDsKKyAgICB9CisKKyAgICBzaXplID0gcmVxdWVzdGVkU2l6ZSArIHBhZGRpbmc7CisKKyAgICBpZiAoc2l6ZSA+IGZyZWVTcGFjZSgpKSB7CisgICAgICAgIExPR1YoIm5lZWQgdG8gZ3JvdzogbVNpemUgPSAlZCwgc2l6ZSA9ICVkLCBmcmVlU3BhY2UoKSA9ICVkLCBudW1Sb3dzID0gJWQiLCBtU2l6ZSwgc2l6ZSwKKyAgICAgICAgICAgICAgICBmcmVlU3BhY2UoKSwgbUhlYWRlci0+bnVtUm93cyk7CisgICAgICAgIC8vIE9ubHkgZ3JvdyB0aGUgd2luZG93IGlmIHRoZSBmaXJzdCByb3cgZG9lc24ndCBmaXQKKyAgICAgICAgaWYgKG1IZWFkZXItPm51bVJvd3MgPiAxKSB7CisgICAgICAgICAgICBMT0dWKCJub3QgZ3Jvd2luZyBzaW5jZSB0aGVyZSBhcmUgYWxyZWFkeSAlZCByb3cocyksIG1heCBzaXplICVkIiwgbUhlYWRlci0+bnVtUm93cywKKyAgICAgICAgICAgICAgICAgICAgbU1heFNpemUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaW5kIGEgbmV3IHNpemUgdGhhdCB3aWxsIGZpdCB0aGUgYWxsb2NhdGlvbgorICAgICAgICBpbnQgYWxsb2NhdGVkID0gbVNpemUgLSBmcmVlU3BhY2UoKTsKKyAgICAgICAgaW50IG5ld1NpemUgPSBtU2l6ZSArIFdJTkRPV19BTExPQ0FUSU9OX1NJWkU7CisgICAgICAgIHdoaWxlIChzaXplID4gKG5ld1NpemUgLSBhbGxvY2F0ZWQpKSB7CisgICAgICAgICAgICBuZXdTaXplICs9IFdJTkRPV19BTExPQ0FUSU9OX1NJWkU7CisgICAgICAgICAgICBpZiAobmV3U2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiQXR0ZW1wdGluZyB0byBncm93IHdpbmRvdyBiZXlvbmQgbWF4IHNpemUgKCVkKSIsIG1NYXhTaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorTE9HX1dJTkRPVygiZm91bmQgc2l6ZSAlZCIsIG5ld1NpemUpOworICAgICAgICBtU2l6ZSA9IG5ld1NpemU7CisgICAgfQorCisgICAgdWludDMyX3Qgb2Zmc2V0ID0gbUZyZWVPZmZzZXQgKyBwYWRkaW5nOworICAgIG1GcmVlT2Zmc2V0ICs9IHNpemU7CisgICAgcmV0dXJuIG9mZnNldDsKK30KKworcm93X3Nsb3RfdCAqIEN1cnNvcldpbmRvdzo6Z2V0Um93U2xvdChpbnQgcm93KQoreworICAgIExPR19XSU5ET1coImVudGVyIGdldFJvd1Nsb3QgY3VycmVudCByb3cgbnVtICVkLCB0aGlzIHJvdyAlZCIsIG1IZWFkZXItPm51bVJvd3MsIHJvdyk7CisgICAgaW50IGNodW5rTnVtID0gcm93IC8gUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1M7CisgICAgaW50IGNodW5rUG9zID0gcm93ICUgUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1M7CisgICAgaW50IGNodW5rUHRyT2Zmc2V0ID0gc2l6ZW9mKHdpbmRvd19oZWFkZXJfdCkgKyBST1dfU0xPVF9DSFVOS19TSVpFIC0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICB1aW50OF90ICogcm93Q2h1bmsgPSBtRGF0YSArIHNpemVvZih3aW5kb3dfaGVhZGVyX3QpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2h1bmtOdW07IGkrKykgeworICAgICAgICByb3dDaHVuayA9IG9mZnNldFRvUHRyKCooKHVpbnQzMl90ICopKG1EYXRhICsgY2h1bmtQdHJPZmZzZXQpKSk7CisgICAgICAgIGNodW5rUHRyT2Zmc2V0ID0gcm93Q2h1bmsgLSBtRGF0YSArIChST1dfU0xPVF9DSFVOS19OVU1fUk9XUyAqIHNpemVvZihyb3dfc2xvdF90KSk7CisgICAgfQorICAgIHJldHVybiAocm93X3Nsb3RfdCAqKShyb3dDaHVuayArIChjaHVua1BvcyAqIHNpemVvZihyb3dfc2xvdF90KSkpOworICAgIExPR19XSU5ET1coImV4aXQgZ2V0Um93U2xvdCBjdXJyZW50IHJvdyBudW0gJWQsIHRoaXMgcm93ICVkIiwgbUhlYWRlci0+bnVtUm93cywgcm93KTsgICAgCit9CisKK3Jvd19zbG90X3QgKiBDdXJzb3JXaW5kb3c6OmFsbG9jUm93U2xvdCgpCit7CisgICAgaW50IGNodW5rTnVtID0gbUhlYWRlci0+bnVtUm93cyAvIFJPV19TTE9UX0NIVU5LX05VTV9ST1dTOworICAgIGludCBjaHVua1BvcyA9IG1IZWFkZXItPm51bVJvd3MgJSBST1dfU0xPVF9DSFVOS19OVU1fUk9XUzsKKyAgICBpbnQgY2h1bmtQdHJPZmZzZXQgPSBzaXplb2Yod2luZG93X2hlYWRlcl90KSArIFJPV19TTE9UX0NIVU5LX1NJWkUgLSBzaXplb2YodWludDMyX3QpOworICAgIHVpbnQ4X3QgKiByb3dDaHVuayA9IG1EYXRhICsgc2l6ZW9mKHdpbmRvd19oZWFkZXJfdCk7CitMT0dfV0lORE9XKCJBbGxvY2F0aW5nIHJvdyBzbG90LCBtSGVhZGVyLT5udW1Sb3dzIGlzICVkLCBjaHVua051bSBpcyAlZCwgY2h1bmtQb3MgaXMgJWQiLCBtSGVhZGVyLT5udW1Sb3dzLCBjaHVua051bSwgY2h1bmtQb3MpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2h1bmtOdW07IGkrKykgeworICAgICAgICB1aW50MzJfdCBuZXh0Q2h1bmtPZmZzZXQgPSAqKCh1aW50MzJfdCAqKShtRGF0YSArIGNodW5rUHRyT2Zmc2V0KSk7CitMT0dfV0lORE9XKCJuZXh0Q2h1bmtPZmZzZXQgaXMgJWQiLCBuZXh0Q2h1bmtPZmZzZXQpOworICAgICAgICBpZiAobmV4dENodW5rT2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlIGEgbmV3IHJvdyBjaHVuaworICAgICAgICAgICAgbmV4dENodW5rT2Zmc2V0ID0gYWxsb2MoUk9XX1NMT1RfQ0hVTktfU0laRSwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAobmV4dENodW5rT2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJvd0NodW5rID0gb2Zmc2V0VG9QdHIobmV4dENodW5rT2Zmc2V0KTsKK0xPR19XSU5ET1coImFsbG9jYXRlZCBuZXcgY2h1bmsgYXQgJWQsIHJvd0NodW5rID0gJXAiLCBuZXh0Q2h1bmtPZmZzZXQsIHJvd0NodW5rKTsKKyAgICAgICAgICAgICooKHVpbnQzMl90ICopKG1EYXRhICsgY2h1bmtQdHJPZmZzZXQpKSA9IHJvd0NodW5rIC0gbURhdGE7CisgICAgICAgICAgICAvLyBNYXJrIHRoZSBuZXcgY2h1bmsncyBuZXh0ICdwb2ludGVyJyBhcyBudWxsCisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKShyb3dDaHVuayArIFJPV19TTE9UX0NIVU5LX1NJWkUgLSBzaXplb2YodWludDMyX3QpKSkgPSAwOworICAgICAgICB9IGVsc2UgeworTE9HX1dJTkRPVygiZm9sbHdpbmcgJ3BvaW50ZXInIHRvIG5leHQgY2h1bmssIG9mZnNldCBvZiBuZXh0IHBvaW50ZXIgaXMgJWQiLCBjaHVua1B0ck9mZnNldCk7CisgICAgICAgICAgICByb3dDaHVuayA9IG9mZnNldFRvUHRyKG5leHRDaHVua09mZnNldCk7CisgICAgICAgICAgICBjaHVua1B0ck9mZnNldCA9IHJvd0NodW5rIC0gbURhdGEgKyAoUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MgKiBzaXplb2Yocm93X3Nsb3RfdCkpOworICAgICAgICB9CisgICAgfQorICAgIG1IZWFkZXItPm51bVJvd3MrKzsKKworICAgIHJldHVybiAocm93X3Nsb3RfdCAqKShyb3dDaHVuayArIChjaHVua1BvcyAqIHNpemVvZihyb3dfc2xvdF90KSkpOworfQorCitmaWVsZF9zbG90X3QgKiBDdXJzb3JXaW5kb3c6OmdldEZpZWxkU2xvdFdpdGhDaGVjayhpbnQgcm93LCBpbnQgY29sdW1uKQoreworICBpZiAocm93IDwgMCB8fCByb3cgPj0gbUhlYWRlci0+bnVtUm93cyB8fCBjb2x1bW4gPCAwIHx8IGNvbHVtbiA+PSBtSGVhZGVyLT5udW1Db2x1bW5zKSB7CisgICAgICBMT0dFKCJCYWQgcmVxdWVzdCBmb3IgZmllbGQgc2xvdCAlZCwlZC4gbnVtUm93cyA9ICVkLCBudW1Db2x1bW5zID0gJWQiLCByb3csIGNvbHVtbiwgbUhlYWRlci0+bnVtUm93cywgbUhlYWRlci0+bnVtQ29sdW1ucyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgfSAgICAgICAgCisgIHJvd19zbG90X3QgKiByb3dTbG90ID0gZ2V0Um93U2xvdChyb3cpOworICBpZiAoIXJvd1Nsb3QpIHsKKyAgICAgIExPR0UoIkZhaWxlZCB0byBmaW5kIHJvd1Nsb3QgZm9yIHJvdyAlZCIsIHJvdyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAocm93U2xvdC0+b2Zmc2V0ID09IDAgfHwgcm93U2xvdC0+b2Zmc2V0ID49IG1TaXplKSB7CisgICAgICBMT0dFKCJJbnZhbGlkIHJvd1Nsb3QsIG9mZnNldCA9ICVkIiwgcm93U2xvdC0+b2Zmc2V0KTsKKyAgICAgIHJldHVybiBOVUxMOworICB9ICAKKyAgaW50IGZpZWxkRGlyT2Zmc2V0ID0gcm93U2xvdC0+b2Zmc2V0OworICByZXR1cm4gKChmaWVsZF9zbG90X3QgKilvZmZzZXRUb1B0cihmaWVsZERpck9mZnNldCkpICsgY29sdW1uOyAgCit9CisKK3VpbnQzMl90IEN1cnNvcldpbmRvdzo6cmVhZF9maWVsZF9zbG90KGludCByb3csIGludCBjb2x1bW4sIGZpZWxkX3Nsb3RfdCAqIHNsb3RPdXQpCit7CisgICAgaWYgKHJvdyA8IDAgfHwgcm93ID49IG1IZWFkZXItPm51bVJvd3MgfHwgY29sdW1uIDwgMCB8fCBjb2x1bW4gPj0gbUhlYWRlci0+bnVtQ29sdW1ucykgeworICAgICAgICBMT0dFKCJCYWQgcmVxdWVzdCBmb3IgZmllbGQgc2xvdCAlZCwlZC4gbnVtUm93cyA9ICVkLCBudW1Db2x1bW5zID0gJWQiLCByb3csIGNvbHVtbiwgbUhlYWRlci0+bnVtUm93cywgbUhlYWRlci0+bnVtQ29sdW1ucyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9ICAgICAgICAKKyAgICByb3dfc2xvdF90ICogcm93U2xvdCA9IGdldFJvd1Nsb3Qocm93KTsKKyAgICBpZiAoIXJvd1Nsb3QpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGZpbmQgcm93U2xvdCBmb3Igcm93ICVkIiwgcm93KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAocm93U2xvdC0+b2Zmc2V0ID09IDAgfHwgcm93U2xvdC0+b2Zmc2V0ID49IG1TaXplKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgcm93U2xvdCwgb2Zmc2V0ID0gJWQiLCByb3dTbG90LT5vZmZzZXQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorTE9HX1dJTkRPVygiRm91bmQgZmllbGQgZGlyZWN0b3J5IGZvciAlZCwlZCBhdCByb3dTbG90ICVkLCBvZmZzZXQgJWQiLCByb3csIGNvbHVtbiwgKHVpbnQ4X3QgKilyb3dTbG90IC0gbURhdGEsIHJvd1Nsb3QtPm9mZnNldCk7CisgICAgZmllbGRfc2xvdF90ICogZmllbGREaXIgPSAoZmllbGRfc2xvdF90ICopb2Zmc2V0VG9QdHIocm93U2xvdC0+b2Zmc2V0KTsKK0xPR19XSU5ET1coIlJlYWQgZmllbGRfc2xvdF90ICVkLCVkOiBvZmZzZXQgPSAlZCwgc2l6ZSA9ICVkLCB0eXBlID0gJWQiLCByb3csIGNvbHVtbiwgZmllbGREaXJbY29sdW1uXS5kYXRhLmJ1ZmZlci5vZmZzZXQsIGZpZWxkRGlyW2NvbHVtbl0uZGF0YS5idWZmZXIuc2l6ZSwgZmllbGREaXJbY29sdW1uXS50eXBlKTsKKworICAgIC8vIENvcHkgdGhlIGRhdGEgdG8gdGhlIG91dCBwYXJhbQorICAgIHNsb3RPdXQtPmRhdGEuYnVmZmVyLm9mZnNldCA9IGZpZWxkRGlyW2NvbHVtbl0uZGF0YS5idWZmZXIub2Zmc2V0OworICAgIHNsb3RPdXQtPmRhdGEuYnVmZmVyLnNpemUgPSBmaWVsZERpcltjb2x1bW5dLmRhdGEuYnVmZmVyLnNpemU7CisgICAgc2xvdE91dC0+dHlwZSA9IGZpZWxkRGlyW2NvbHVtbl0udHlwZTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBDdXJzb3JXaW5kb3c6OmNvcHlJbih1aW50MzJfdCBvZmZzZXQsIHVpbnQ4X3QgY29uc3QgKiBkYXRhLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBhc3NlcnQob2Zmc2V0ICsgc2l6ZSA8PSBtU2l6ZSk7ICAgIAorICAgIG1lbWNweShtRGF0YSArIG9mZnNldCwgZGF0YSwgc2l6ZSk7Cit9CisKK3ZvaWQgQ3Vyc29yV2luZG93Ojpjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCBpbnQ2NF90IGRhdGEpCit7CisgICAgYXNzZXJ0KG9mZnNldCArIHNpemVvZihpbnQ2NF90KSA8PSBtU2l6ZSk7CisgICAgbWVtY3B5KG1EYXRhICsgb2Zmc2V0LCAodWludDhfdCAqKSZkYXRhLCBzaXplb2YoaW50NjRfdCkpOworfQorCit2b2lkIEN1cnNvcldpbmRvdzo6Y29weUluKHVpbnQzMl90IG9mZnNldCwgZG91YmxlIGRhdGEpCit7CisgICAgYXNzZXJ0KG9mZnNldCArIHNpemVvZihkb3VibGUpIDw9IG1TaXplKTsKKyAgICBtZW1jcHkobURhdGEgKyBvZmZzZXQsICh1aW50OF90ICopJmRhdGEsIHNpemVvZihkb3VibGUpKTsKK30KKwordm9pZCBDdXJzb3JXaW5kb3c6OmNvcHlPdXQodWludDMyX3Qgb2Zmc2V0LCB1aW50OF90ICogZGF0YSwgc2l6ZV90IHNpemUpCit7CisgICAgYXNzZXJ0KG9mZnNldCArIHNpemUgPD0gbVNpemUpOworICAgIG1lbWNweShkYXRhLCBtRGF0YSArIG9mZnNldCwgc2l6ZSk7Cit9CisKK2ludDY0X3QgQ3Vyc29yV2luZG93Ojpjb3B5T3V0TG9uZyh1aW50MzJfdCBvZmZzZXQpCit7CisgICAgaW50NjRfdCB2YWx1ZTsKKyAgICBhc3NlcnQob2Zmc2V0ICsgc2l6ZW9mKGludDY0X3QpIDw9IG1TaXplKTsKKyAgICBtZW1jcHkoJnZhbHVlLCBtRGF0YSArIG9mZnNldCwgc2l6ZW9mKGludDY0X3QpKTsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK2RvdWJsZSBDdXJzb3JXaW5kb3c6OmNvcHlPdXREb3VibGUodWludDMyX3Qgb2Zmc2V0KQoreworICAgIGRvdWJsZSB2YWx1ZTsKKyAgICBhc3NlcnQob2Zmc2V0ICsgc2l6ZW9mKGRvdWJsZSkgPD0gbVNpemUpOworICAgIG1lbWNweSgmdmFsdWUsIG1EYXRhICsgb2Zmc2V0LCBzaXplb2YoZG91YmxlKSk7CisgICAgcmV0dXJuIHZhbHVlOworfQorCitib29sIEN1cnNvcldpbmRvdzo6cHV0TG9uZyh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBpbnQ2NF90IHZhbHVlKQoreworICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7CisgICAgaWYgKCFmaWVsZFNsb3QpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworI2lmIFdJTkRPV19TVE9SQUdFX0lOTElORV9OVU1FUklDUworICAgIGZpZWxkU2xvdC0+ZGF0YS5sID0gdmFsdWU7CisjZWxzZQorICAgIGludCBvZmZzZXQgPSBhbGxvYyhzaXplb2YoaW50NjRfdCkpOworICAgIGlmICghb2Zmc2V0KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb3B5SW4ob2Zmc2V0LCB2YWx1ZSk7CisKKyAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCA9IG9mZnNldDsKKyAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLnNpemUgPSBzaXplb2YoaW50NjRfdCk7CisjZW5kaWYKKyAgICBmaWVsZFNsb3QtPnR5cGUgPSBGSUVMRF9UWVBFX0lOVEVHRVI7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ3Vyc29yV2luZG93OjpwdXREb3VibGUodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgZG91YmxlIHZhbHVlKQoreworICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7CisgICAgaWYgKCFmaWVsZFNsb3QpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworI2lmIFdJTkRPV19TVE9SQUdFX0lOTElORV9OVU1FUklDUworICAgIGZpZWxkU2xvdC0+ZGF0YS5kID0gdmFsdWU7CisjZWxzZQorICAgIGludCBvZmZzZXQgPSBhbGxvYyhzaXplb2YoaW50NjRfdCkpOworICAgIGlmICghb2Zmc2V0KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb3B5SW4ob2Zmc2V0LCB2YWx1ZSk7CisKKyAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCA9IG9mZnNldDsKKyAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLnNpemUgPSBzaXplb2YoZG91YmxlKTsKKyNlbmRpZgorICAgIGZpZWxkU2xvdC0+dHlwZSA9IEZJRUxEX1RZUEVfRkxPQVQ7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ3Vyc29yV2luZG93OjpwdXROdWxsKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wpCit7CisgICAgZmllbGRfc2xvdF90ICogZmllbGRTbG90ID0gZ2V0RmllbGRTbG90V2l0aENoZWNrKHJvdywgY29sKTsKKyAgICBpZiAoIWZpZWxkU2xvdCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZmllbGRTbG90LT50eXBlID0gRklFTERfVFlQRV9OVUxMOworICAgIGZpZWxkU2xvdC0+ZGF0YS5idWZmZXIub2Zmc2V0ID0gMDsKKyAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLnNpemUgPSAwOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEN1cnNvcldpbmRvdzo6Z2V0TG9uZyh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBpbnQ2NF90ICogdmFsdWVPdXQpCit7CisgICAgZmllbGRfc2xvdF90ICogZmllbGRTbG90ID0gZ2V0RmllbGRTbG90V2l0aENoZWNrKHJvdywgY29sKTsKKyAgICBpZiAoIWZpZWxkU2xvdCB8fCBmaWVsZFNsb3QtPnR5cGUgIT0gRklFTERfVFlQRV9JTlRFR0VSKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisjaWYgV0lORE9XX1NUT1JBR0VfSU5MSU5FX05VTUVSSUNTCisgICAgKnZhbHVlT3V0ID0gZmllbGRTbG90LT5kYXRhLmw7CisjZWxzZQorICAgICp2YWx1ZU91dCA9IGNvcHlPdXRMb25nKGZpZWxkU2xvdC0+ZGF0YS5idWZmZXIub2Zmc2V0KTsKKyNlbmRpZgorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEN1cnNvcldpbmRvdzo6Z2V0RG91YmxlKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGRvdWJsZSAqIHZhbHVlT3V0KQoreworICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7CisgICAgaWYgKCFmaWVsZFNsb3QgfHwgZmllbGRTbG90LT50eXBlICE9IEZJRUxEX1RZUEVfRkxPQVQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworI2lmIFdJTkRPV19TVE9SQUdFX0lOTElORV9OVU1FUklDUworICAgICp2YWx1ZU91dCA9IGZpZWxkU2xvdC0+ZGF0YS5kOworI2Vsc2UKKyAgICAqdmFsdWVPdXQgPSBjb3B5T3V0RG91YmxlKGZpZWxkU2xvdC0+ZGF0YS5idWZmZXIub2Zmc2V0KTsKKyNlbmRpZgorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEN1cnNvcldpbmRvdzo6Z2V0TnVsbCh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBib29sICogdmFsdWVPdXQpCit7CisgICAgZmllbGRfc2xvdF90ICogZmllbGRTbG90ID0gZ2V0RmllbGRTbG90V2l0aENoZWNrKHJvdywgY29sKTsKKyAgICBpZiAoIWZpZWxkU2xvdCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIGlmIChmaWVsZFNsb3QtPnR5cGUgIT0gRklFTERfVFlQRV9OVUxMKSB7CisgICAgICAgICp2YWx1ZU91dCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgICp2YWx1ZU91dCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9jYW1lcmEvQ2FtZXJhLmNwcCBiL2xpYnMvY2FtZXJhL0NhbWVyYS5jcHAKaW5kZXggN2VmYzZkNy4uYjVmNzhlOCAxMDA2NDQKLS0tIGEvbGlicy9jYW1lcmEvQ2FtZXJhLmNwcAorKysgYi9saWJzL2NhbWVyYS9DYW1lcmEuY3BwCkBAIC0xNjcsMzIgKzE2NywyMCBAQAogICAgIHJldHVybiBjLT51bmxvY2soKTsKIH0KIAotLy8gcGFzcyB0aGUgYnVmZmVyZWQgSVN1cmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlCisvLyBwYXNzIHRoZSBidWZmZXJlZCBTdXJmYWNlIHRvIHRoZSBjYW1lcmEgc2VydmljZQogc3RhdHVzX3QgQ2FtZXJhOjpzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkKIHsKLSAgICBMT0dWKCJzZXRQcmV2aWV3RGlzcGxheSIpOworICAgIExPR1YoInNldFByZXZpZXdEaXNwbGF5KCVwKSIsIHN1cmZhY2UuZ2V0KCkpOwogICAgIHNwIDxJQ2FtZXJhPiBjID0gbUNhbWVyYTsKICAgICBpZiAoYyA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICBpZiAoc3VyZmFjZSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBjLT5zZXRQcmV2aWV3RGlzcGxheShzdXJmYWNlLT5nZXRJU3VyZmFjZSgpKTsKKyAgICAgICAgcmV0dXJuIGMtPnNldFByZXZpZXdEaXNwbGF5KHN1cmZhY2UpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIExPR0QoImFwcCBwYXNzZWQgTlVMTCBzdXJmYWNlIik7CiAgICAgICAgIHJldHVybiBjLT5zZXRQcmV2aWV3RGlzcGxheSgwKTsKICAgICB9CiB9CiAKLXN0YXR1c190IENhbWVyYTo6c2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQotewotICAgIExPR1YoInNldFByZXZpZXdEaXNwbGF5Iik7Ci0gICAgaWYgKHN1cmZhY2UgPT0gMCkgewotICAgICAgICBMT0dEKCJhcHAgcGFzc2VkIE5VTEwgc3VyZmFjZSIpOwotICAgIH0KLSAgICBzcCA8SUNhbWVyYT4gYyA9IG1DYW1lcmE7Ci0gICAgaWYgKGMgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIGMtPnNldFByZXZpZXdEaXNwbGF5KHN1cmZhY2UpOwotfQotCi0KIC8vIHN0YXJ0IHByZXZpZXcgbW9kZQogc3RhdHVzX3QgQ2FtZXJhOjpzdGFydFByZXZpZXcoKQogewpAQCAtMzc1LDQgKzM2MywzIEBACiB9CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2xpYnMvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwIGIvbGlicy9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAKaW5kZXggODNlNWU1N2YuLjQ1YjFiOWEgMTAwNjQ0Ci0tLSBhL2xpYnMvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCisrKyBiL2xpYnMvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCkBAIC03Myw2ICs3Myw4IEBACiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9TTU9PVEhfWk9PTV9TVVBQT1JURURbXSA9ICJzbW9vdGgtem9vbS1zdXBwb3J0ZWQiOwogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRk9DVVNfRElTVEFOQ0VTW10gPSAiZm9jdXMtZGlzdGFuY2VzIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1ZJREVPX0ZSQU1FX0ZPUk1BVFtdID0gInZpZGVvLWZyYW1lLWZvcm1hdCI7Citjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9WSURFT19TSVpFW10gPSAidmlkZW8tc2l6ZSI7Citjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfVklERU9fU0laRVNbXSA9ICJ2aWRlby1zaXplLXZhbHVlcyI7CiAKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6VFJVRVtdID0gInRydWUiOwogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpGT0NVU19ESVNUQU5DRV9JTkZJTklUWVtdID0gIkluZmluaXR5IjsKQEAgLTEyOSw3ICsxMzEsNyBAQAogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpTQ0VORV9NT0RFX0NBTkRMRUxJR0hUW10gPSAiY2FuZGxlbGlnaHQiOwogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpTQ0VORV9NT0RFX0JBUkNPREVbXSA9ICJiYXJjb2RlIjsKIAotLy8gRm9ybWF0cyBmb3Igc2V0UHJldmlld0Zvcm1hdCBhbmQgc2V0UGljdHVyZUZvcm1hdC4KK2NvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMFBbXSAgPSAieXV2NDIwcCI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9ZVVY0MjJTUFtdID0gInl1djQyMnNwIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMFNQW10gPSAieXV2NDIwc3AiOwogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfWVVWNDIySVtdID0gInl1djQyMmkteXV5diI7CkBAIC0zMzcsNiArMzM5LDI3IEBACiAgICAgcGFyc2VTaXplc0xpc3QocHJldmlld1NpemVzU3RyLCBzaXplcyk7CiB9CiAKK3ZvaWQgQ2FtZXJhUGFyYW1ldGVyczo6c2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBjaGFyIHN0clszMl07CisgICAgc3ByaW50ZihzdHIsICIlZHglZCIsIHdpZHRoLCBoZWlnaHQpOworICAgIHNldChLRVlfVklERU9fU0laRSwgc3RyKTsKK30KKwordm9pZCBDYW1lcmFQYXJhbWV0ZXJzOjpnZXRWaWRlb1NpemUoaW50ICp3aWR0aCwgaW50ICpoZWlnaHQpIGNvbnN0Cit7CisgICAgKndpZHRoID0gKmhlaWdodCA9IC0xOworICAgIGNvbnN0IGNoYXIgKnAgPSBnZXQoS0VZX1ZJREVPX1NJWkUpOworICAgIGlmIChwID09IDApIHJldHVybjsKKyAgICBwYXJzZV9wYWlyKHAsIHdpZHRoLCBoZWlnaHQsICd4Jyk7Cit9CisKK3ZvaWQgQ2FtZXJhUGFyYW1ldGVyczo6Z2V0U3VwcG9ydGVkVmlkZW9TaXplcyhWZWN0b3I8U2l6ZT4gJnNpemVzKSBjb25zdAoreworICAgIGNvbnN0IGNoYXIgKnZpZGVvU2l6ZXNTdHIgPSBnZXQoS0VZX1NVUFBPUlRFRF9WSURFT19TSVpFUyk7CisgICAgcGFyc2VTaXplc0xpc3QodmlkZW9TaXplc1N0ciwgc2l6ZXMpOworfQorCiB2b2lkIENhbWVyYVBhcmFtZXRlcnM6OnNldFByZXZpZXdGcmFtZVJhdGUoaW50IGZwcykKIHsKICAgICBzZXQoS0VZX1BSRVZJRVdfRlJBTUVfUkFURSwgZnBzKTsKZGlmZiAtLWdpdCBhL2xpYnMvY2FtZXJhL0lDYW1lcmEuY3BwIGIvbGlicy9jYW1lcmEvSUNhbWVyYS5jcHAKaW5kZXggMTM2NzNiNS4uOTRkYzVjMSAxMDA2NDQKLS0tIGEvbGlicy9jYW1lcmEvSUNhbWVyYS5jcHAKKysrIGIvbGlicy9jYW1lcmEvSUNhbWVyYS5jcHAKQEAgLTY0LDEzICs2NCwxMyBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRElTQ09OTkVDVCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKLSAgICAvLyBwYXNzIHRoZSBidWZmZXJlZCBJU3VyZmFjZSB0byB0aGUgY2FtZXJhIHNlcnZpY2UKLSAgICBzdGF0dXNfdCBzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpCisgICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgU3VyZmFjZSB0byB0aGUgY2FtZXJhIHNlcnZpY2UKKyAgICBzdGF0dXNfdCBzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkKICAgICB7CiAgICAgICAgIExPR1YoInNldFByZXZpZXdEaXNwbGF5Iik7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmE6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoc3VyZmFjZS0+YXNCaW5kZXIoKSk7CisgICAgICAgIFN1cmZhY2U6OndyaXRlVG9QYXJjZWwoc3VyZmFjZSwgJmRhdGEpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1BSRVZJRVdfRElTUExBWSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTI1OCw3ICsyNTgsNyBAQAogICAgICAgICBjYXNlIFNFVF9QUkVWSUVXX0RJU1BMQVk6IHsKICAgICAgICAgICAgIExPR1YoIlNFVF9QUkVWSUVXX0RJU1BMQVkiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzcDxJU3VyZmFjZT4gc3VyZmFjZSA9IGludGVyZmFjZV9jYXN0PElTdXJmYWNlPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gU3VyZmFjZTo6cmVhZEZyb21QYXJjZWwoZGF0YSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRQcmV2aWV3RGlzcGxheShzdXJmYWNlKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC0zNzYsNCArMzc2LDMgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0FuZHJvaWQubWsgYi9saWJzL2h3dWkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2FmNzAyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0NiBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBPbmx5IGJ1aWxkIGxpYmh3dWkgd2hlbiBVU0VfT1BFTkdMX1JFTkRFUkVSIGlzCisjIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgZGV2aWNlL2JvYXJkIGNvbmZpZ3VyYXRpb24KK2lmZXEgKCQoVVNFX09QRU5HTF9SRU5ERVJFUiksdHJ1ZSkKKwlMT0NBTF9TUkNfRklMRVM6PSBcCisJCURpc3BsYXlMaXN0UmVuZGVyZXIuY3BwIFwKKwkJRmJvQ2FjaGUuY3BwIFwKKwkJRm9udFJlbmRlcmVyLmNwcCBcCisJCUdhbW1hRm9udFJlbmRlcmVyLmNwcCBcCisJCUdyYWRpZW50Q2FjaGUuY3BwIFwKKwkJTGF5ZXJDYWNoZS5jcHAgXAorCQlNYXRyaXguY3BwIFwKKwkJT3BlbkdMRGVidWdSZW5kZXJlci5jcHAgXAorCQlPcGVuR0xSZW5kZXJlci5jcHAgXAorCQlQYXRjaC5jcHAgXAorCQlQYXRjaENhY2hlLmNwcCBcCisJCVBhdGhDYWNoZS5jcHAgXAorCQlQcm9ncmFtLmNwcCBcCisJCVByb2dyYW1DYWNoZS5jcHAgXAorCQlTa2lhQ29sb3JGaWx0ZXIuY3BwIFwKKwkJU2tpYVNoYWRlci5jcHAgXAorCQlUZXh0dXJlQ2FjaGUuY3BwIFwKKwkJVGV4dERyb3BTaGFkb3dDYWNoZS5jcHAKKwkKKwlMT0NBTF9DX0lOQ0xVREVTICs9IFwKKwkJJChKTklfSF9JTkNMVURFKSBcCisJCSQoTE9DQUxfUEFUSCkvLi4vLi4vaW5jbHVkZS91dGlscyBcCisJCWV4dGVybmFsL3NraWEvaW5jbHVkZS9jb3JlIFwKKwkJZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2VmZmVjdHMgXAorCQlleHRlcm5hbC9za2lhL2luY2x1ZGUvaW1hZ2VzIFwKKwkJZXh0ZXJuYWwvc2tpYS9zcmMvcG9ydHMgXAorCQlleHRlcm5hbC9za2lhL2luY2x1ZGUvdXRpbHMKKworCUxPQ0FMX0NGTEFHUyArPSAtRFVTRV9PUEVOR0xfUkVOREVSRVIKKwlMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gU0hBUkVEX0xJQlJBUklFUworCUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYnV0aWxzIGxpYkdMRVN2MiBsaWJza2lhCisJTE9DQUxfTU9EVUxFIDo9IGxpYmh3dWkKKwlMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisJCisJaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisgICAgaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQorZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9DYWNoZXMuaCBiL2xpYnMvaHd1aS9DYWNoZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTUyYTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0NhY2hlcy5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfQ0FDSEVTX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9DQUNIRVNfSAorCisjaWZuZGVmIExPR19UQUcKKyAgICAjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorI2VuZGlmCisKKyNpbmNsdWRlIDx1dGlscy9TaW5nbGV0b24uaD4KKworI2luY2x1ZGUgIlRleHR1cmVDYWNoZS5oIgorI2luY2x1ZGUgIkxheWVyQ2FjaGUuaCIKKyNpbmNsdWRlICJHcmFkaWVudENhY2hlLmgiCisjaW5jbHVkZSAiUGF0Y2hDYWNoZS5oIgorI2luY2x1ZGUgIkdhbW1hRm9udFJlbmRlcmVyLmgiCisjaW5jbHVkZSAiUHJvZ3JhbUNhY2hlLmgiCisjaW5jbHVkZSAiUGF0aENhY2hlLmgiCisjaW5jbHVkZSAiVGV4dERyb3BTaGFkb3dDYWNoZS5oIgorI2luY2x1ZGUgIkZib0NhY2hlLmgiCisjaW5jbHVkZSAiTGluZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKK3N0cnVjdCBDYWNoZUxvZ2dlciB7CisgICAgQ2FjaGVMb2dnZXIoKSB7CisgICAgICAgIExPR0QoIkNyZWF0aW5nIGNhY2hlcyIpOworICAgIH0KK307IC8vIHN0cnVjdCBDYWNoZUxvZ2dlcgorCitjbGFzcyBDYWNoZXM6IHB1YmxpYyBTaW5nbGV0b248Q2FjaGVzPiB7CisgICAgQ2FjaGVzKCk6IFNpbmdsZXRvbjxDYWNoZXM+KCksIGJsZW5kKGZhbHNlKSwgbGFzdFNyY01vZGUoR0xfWkVSTyksCisgICAgICAgICAgICBsYXN0RHN0TW9kZShHTF9aRVJPKSwgY3VycmVudFByb2dyYW0oTlVMTCkgeworICAgIH0KKworICAgIGZyaWVuZCBjbGFzcyBTaW5nbGV0b248Q2FjaGVzPjsKKworICAgIENhY2hlTG9nZ2VyIGxvZ2dlcjsKKworcHVibGljOgorICAgIGJvb2wgYmxlbmQ7CisgICAgR0xlbnVtIGxhc3RTcmNNb2RlOworICAgIEdMZW51bSBsYXN0RHN0TW9kZTsKKyAgICBQcm9ncmFtKiBjdXJyZW50UHJvZ3JhbTsKKworICAgIFRleHR1cmVDYWNoZSB0ZXh0dXJlQ2FjaGU7CisgICAgTGF5ZXJDYWNoZSBsYXllckNhY2hlOworICAgIEdyYWRpZW50Q2FjaGUgZ3JhZGllbnRDYWNoZTsKKyAgICBQcm9ncmFtQ2FjaGUgcHJvZ3JhbUNhY2hlOworICAgIFBhdGhDYWNoZSBwYXRoQ2FjaGU7CisgICAgUGF0Y2hDYWNoZSBwYXRjaENhY2hlOworICAgIFRleHREcm9wU2hhZG93Q2FjaGUgZHJvcFNoYWRvd0NhY2hlOworICAgIEZib0NhY2hlIGZib0NhY2hlOworICAgIEdhbW1hRm9udFJlbmRlcmVyIGZvbnRSZW5kZXJlcjsKKworICAgIExpbmUgbGluZTsKK307IC8vIGNsYXNzIENhY2hlcworCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorCisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgordXNpbmcgbmFtZXNwYWNlIHVpcmVuZGVyZXI7CitBTkRST0lEX1NJTkdMRVRPTl9TVEFUSUNfSU5TVEFOQ0UoQ2FjaGVzKTsKKyNlbmRpZgorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9DQUNIRVNfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0Rpc3BsYXlMaXN0UmVuZGVyZXIuY3BwIGIvbGlicy9od3VpL0Rpc3BsYXlMaXN0UmVuZGVyZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlODVkNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvRGlzcGxheUxpc3RSZW5kZXJlci5jcHAKQEAgLTAsMCArMSw1ODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSAiRGlzcGxheUxpc3RSZW5kZXJlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlZmluZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBQQVRIX0hFQVBfU0laRSA2NAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBIZWxwZXJzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1BhdGhIZWFwOjpQYXRoSGVhcCgpOiBtSGVhcChQQVRIX0hFQVBfU0laRSAqIHNpemVvZihTa1BhdGgpKSB7Cit9CisKK1BhdGhIZWFwOjpQYXRoSGVhcChTa0ZsYXR0ZW5hYmxlUmVhZEJ1ZmZlciYgYnVmZmVyKTogbUhlYXAoUEFUSF9IRUFQX1NJWkUgKiBzaXplb2YoU2tQYXRoKSkgeworICAgIGludCBjb3VudCA9IGJ1ZmZlci5yZWFkUzMyKCk7CisKKyAgICBtUGF0aHMuc2V0Q291bnQoY291bnQpOworICAgIFNrUGF0aCoqIHB0ciA9IG1QYXRocy5iZWdpbigpOworICAgIFNrUGF0aCogcCA9IChTa1BhdGgqKSBtSGVhcC5hbGxvY1Rocm93KGNvdW50ICogc2l6ZW9mKFNrUGF0aCkpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIG5ldyAocCkgU2tQYXRoOworICAgICAgICBwLT51bmZsYXR0ZW4oYnVmZmVyKTsKKyAgICAgICAgKnB0cisrID0gcDsKKyAgICAgICAgcCsrOworICAgIH0KK30KKworUGF0aEhlYXA6On5QYXRoSGVhcCgpIHsKKyAgICBTa1BhdGgqKiBpdGVyID0gbVBhdGhzLmJlZ2luKCk7CisgICAgU2tQYXRoKiogc3RvcCA9IG1QYXRocy5lbmQoKTsKKyAgICB3aGlsZSAoaXRlciA8IHN0b3ApIHsKKyAgICAgICAgKCppdGVyKS0+flNrUGF0aCgpOworICAgICAgICBpdGVyKys7CisgICAgfQorfQorCitpbnQgUGF0aEhlYXA6OmFwcGVuZChjb25zdCBTa1BhdGgmIHBhdGgpIHsKKyAgICBTa1BhdGgqIHAgPSAoU2tQYXRoKikgbUhlYXAuYWxsb2NUaHJvdyhzaXplb2YoU2tQYXRoKSk7CisgICAgbmV3IChwKSBTa1BhdGgocGF0aCk7CisgICAgKm1QYXRocy5hcHBlbmQoKSA9IHA7CisgICAgcmV0dXJuIG1QYXRocy5jb3VudCgpOworfQorCit2b2lkIFBhdGhIZWFwOjpmbGF0dGVuKFNrRmxhdHRlbmFibGVXcml0ZUJ1ZmZlciYgYnVmZmVyKSBjb25zdCB7CisgICAgaW50IGNvdW50ID0gbVBhdGhzLmNvdW50KCk7CisKKyAgICBidWZmZXIud3JpdGUzMihjb3VudCk7CisgICAgU2tQYXRoKiogaXRlciA9IG1QYXRocy5iZWdpbigpOworICAgIFNrUGF0aCoqIHN0b3AgPSBtUGF0aHMuZW5kKCk7CisgICAgd2hpbGUgKGl0ZXIgPCBzdG9wKSB7CisgICAgICAgICgqaXRlciktPmZsYXR0ZW4oYnVmZmVyKTsKKyAgICAgICAgaXRlcisrOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGlzcGxheSBsaXN0CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0Rpc3BsYXlMaXN0OjpEaXNwbGF5TGlzdChjb25zdCBEaXNwbGF5TGlzdFJlbmRlcmVyJiByZWNvcmRlcikgeworICAgIGNvbnN0IFNrV3JpdGVyMzImIHdyaXRlciA9IHJlY29yZGVyLndyaXRlU3RyZWFtKCk7CisgICAgaW5pdCgpOworCisgICAgaWYgKHdyaXRlci5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IHNpemUgPSB3cml0ZXIuc2l6ZSgpOworICAgIHZvaWQqIGJ1ZmZlciA9IHNrX21hbGxvY190aHJvdyhzaXplKTsKKyAgICB3cml0ZXIuZmxhdHRlbihidWZmZXIpOworICAgIG1SZWFkZXIuc2V0TWVtb3J5KGJ1ZmZlciwgc2l6ZSk7CisKKyAgICBtUkNQbGF5YmFjay5yZXNldCgmcmVjb3JkZXIubVJDUmVjb3JkZXIpOworICAgIG1SQ1BsYXliYWNrLnNldHVwQnVmZmVyKG1SZWFkZXIpOworCisgICAgbVRGUGxheWJhY2sucmVzZXQoJnJlY29yZGVyLm1URlJlY29yZGVyKTsKKyAgICBtVEZQbGF5YmFjay5zZXR1cEJ1ZmZlcihtUmVhZGVyKTsKKworICAgIGNvbnN0IFNrVERBcnJheTxjb25zdCBTa0ZsYXRCaXRtYXAqPiYgYml0bWFwcyA9IHJlY29yZGVyLmdldEJpdG1hcHMoKTsKKyAgICBtQml0bWFwQ291bnQgPSBiaXRtYXBzLmNvdW50KCk7CisgICAgaWYgKG1CaXRtYXBDb3VudCA+IDApIHsKKyAgICAgICAgbUJpdG1hcHMgPSBuZXcgU2tCaXRtYXBbbUJpdG1hcENvdW50XTsKKyAgICAgICAgZm9yIChjb25zdCBTa0ZsYXRCaXRtYXAqKiBmbGF0Qml0bWFwUHRyID0gYml0bWFwcy5iZWdpbigpOworICAgICAgICAgICAgICAgIGZsYXRCaXRtYXBQdHIgIT0gYml0bWFwcy5lbmQoKTsgZmxhdEJpdG1hcFB0cisrKSB7CisgICAgICAgICAgICBjb25zdCBTa0ZsYXRCaXRtYXAqIGZsYXRCaXRtYXAgPSAqZmxhdEJpdG1hcFB0cjsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGZsYXRCaXRtYXAtPmluZGV4KCkgLSAxOworICAgICAgICAgICAgZmxhdEJpdG1hcC0+dW5mbGF0dGVuKCZtQml0bWFwc1tpbmRleF0sICZtUkNQbGF5YmFjayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBTa1REQXJyYXk8Y29uc3QgU2tGbGF0TWF0cml4Kj4mIG1hdHJpY2VzID0gcmVjb3JkZXIuZ2V0TWF0cmljZXMoKTsKKyAgICBtTWF0cml4Q291bnQgPSBtYXRyaWNlcy5jb3VudCgpOworICAgIGlmIChtTWF0cml4Q291bnQgPiAwKSB7CisgICAgICAgIG1NYXRyaWNlcyA9IG5ldyBTa01hdHJpeFttTWF0cml4Q291bnRdOworICAgICAgICBmb3IgKGNvbnN0IFNrRmxhdE1hdHJpeCoqIG1hdHJpeFB0ciA9IG1hdHJpY2VzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgbWF0cml4UHRyICE9IG1hdHJpY2VzLmVuZCgpOyBtYXRyaXhQdHIrKykgeworICAgICAgICAgICAgY29uc3QgU2tGbGF0TWF0cml4KiBmbGF0TWF0cml4ID0gKm1hdHJpeFB0cjsKKyAgICAgICAgICAgIGZsYXRNYXRyaXgtPnVuZmxhdHRlbigmbU1hdHJpY2VzW2ZsYXRNYXRyaXgtPmluZGV4KCkgLSAxXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBTa1REQXJyYXk8Y29uc3QgU2tGbGF0UGFpbnQqPiYgcGFpbnRzID0gcmVjb3JkZXIuZ2V0UGFpbnRzKCk7CisgICAgbVBhaW50Q291bnQgPSBwYWludHMuY291bnQoKTsKKyAgICBpZiAobVBhaW50Q291bnQgPiAwKSB7CisgICAgICAgIG1QYWludHMgPSBuZXcgU2tQYWludFttUGFpbnRDb3VudF07CisgICAgICAgIGZvciAoY29uc3QgU2tGbGF0UGFpbnQqKiBmbGF0UGFpbnRQdHIgPSBwYWludHMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBmbGF0UGFpbnRQdHIgIT0gcGFpbnRzLmVuZCgpOyBmbGF0UGFpbnRQdHIrKykgeworICAgICAgICAgICAgY29uc3QgU2tGbGF0UGFpbnQqIGZsYXRQYWludCA9ICpmbGF0UGFpbnRQdHI7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBmbGF0UGFpbnQtPmluZGV4KCkgLSAxOworICAgICAgICAgICAgZmxhdFBhaW50LT51bmZsYXR0ZW4oJm1QYWludHNbaW5kZXhdLCAmbVJDUGxheWJhY2ssICZtVEZQbGF5YmFjayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtUGF0aEhlYXAgPSByZWNvcmRlci5tUGF0aEhlYXA7CisgICAgbVBhdGhIZWFwLT5zYWZlUmVmKCk7Cit9CisKK0Rpc3BsYXlMaXN0Ojp+RGlzcGxheUxpc3QoKSB7CisgICAgc2tfZnJlZSgodm9pZCopIG1SZWFkZXIuYmFzZSgpKTsKKworICAgIENhY2hlcyYgY2FjaGVzID0gQ2FjaGVzOjpnZXRJbnN0YW5jZSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUJpdG1hcENvdW50OyBpKyspIHsKKyAgICAgICAgY2FjaGVzLnRleHR1cmVDYWNoZS5yZW1vdmUoJm1CaXRtYXBzW2ldKTsKKyAgICB9CisKKyAgICBkZWxldGVbXSBtQml0bWFwczsKKyAgICBkZWxldGVbXSBtTWF0cmljZXM7CisgICAgZGVsZXRlW10gbVBhaW50czsKKworICAgIG1QYXRoSGVhcC0+c2FmZVVucmVmKCk7Cit9CisKK3ZvaWQgRGlzcGxheUxpc3Q6OmluaXQoKSB7CisgICAgbUJpdG1hcHMgPSBOVUxMOworICAgIG1NYXRyaWNlcyA9IE5VTEw7CisgICAgbVBhaW50cyA9IE5VTEw7CisgICAgbVBhdGhIZWFwID0gTlVMTDsKKyAgICBtQml0bWFwQ291bnQgPSBtTWF0cml4Q291bnQgPSBtUGFpbnRDb3VudCA9IDA7Cit9CisKK3ZvaWQgRGlzcGxheUxpc3Q6OnJlcGxheShPcGVuR0xSZW5kZXJlciYgcmVuZGVyZXIpIHsKKyAgICBUZXh0Q29udGFpbmVyIHRleHQ7CisgICAgbVJlYWRlci5yZXdpbmQoKTsKKworICAgIGludCBzYXZlQ291bnQgPSByZW5kZXJlci5nZXRTYXZlQ291bnQoKSAtIDE7CisKKyAgICB3aGlsZSAoIW1SZWFkZXIuZW9mKCkpIHsKKyAgICAgICAgc3dpdGNoIChtUmVhZGVyLnJlYWRJbnQoKSkgeworICAgICAgICAgICAgY2FzZSBBY3F1aXJlQ29udGV4dDogeworICAgICAgICAgICAgICAgIHJlbmRlcmVyLmFjcXVpcmVDb250ZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUmVsZWFzZUNvbnRleHQ6IHsKKyAgICAgICAgICAgICAgICByZW5kZXJlci5yZWxlYXNlQ29udGV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNhdmU6IHsKKyAgICAgICAgICAgICAgICByZW5kZXJlci5zYXZlKGdldEludCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSZXN0b3JlOiB7CisgICAgICAgICAgICAgICAgcmVuZGVyZXIucmVzdG9yZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJlc3RvcmVUb0NvdW50OiB7CisgICAgICAgICAgICAgICAgcmVuZGVyZXIucmVzdG9yZVRvQ291bnQoc2F2ZUNvdW50ICsgZ2V0SW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNhdmVMYXllcjogeworICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNhdmVMYXllcihnZXRGbG9hdCgpLCBnZXRGbG9hdCgpLCBnZXRGbG9hdCgpLCBnZXRGbG9hdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGFpbnQoKSwgZ2V0SW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRyYW5zbGF0ZTogeworICAgICAgICAgICAgICAgIHJlbmRlcmVyLnRyYW5zbGF0ZShnZXRGbG9hdCgpLCBnZXRGbG9hdCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSb3RhdGU6IHsKKyAgICAgICAgICAgICAgICByZW5kZXJlci5yb3RhdGUoZ2V0RmxvYXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2NhbGU6IHsKKyAgICAgICAgICAgICAgICByZW5kZXJlci5zY2FsZShnZXRGbG9hdCgpLCBnZXRGbG9hdCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTZXRNYXRyaXg6IHsKKyAgICAgICAgICAgICAgICByZW5kZXJlci5zZXRNYXRyaXgoZ2V0TWF0cml4KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENvbmNhdE1hdHJpeDogeworICAgICAgICAgICAgICAgIHJlbmRlcmVyLmNvbmNhdE1hdHJpeChnZXRNYXRyaXgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ2xpcFJlY3Q6IHsKKyAgICAgICAgICAgICAgICByZW5kZXJlci5jbGlwUmVjdChnZXRGbG9hdCgpLCBnZXRGbG9hdCgpLCBnZXRGbG9hdCgpLCBnZXRGbG9hdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKFNrUmVnaW9uOjpPcCkgZ2V0SW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERyYXdCaXRtYXA6IHsKKyAgICAgICAgICAgICAgICByZW5kZXJlci5kcmF3Qml0bWFwKGdldEJpdG1hcCgpLCBnZXRGbG9hdCgpLCBnZXRGbG9hdCgpLCBnZXRQYWludCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEcmF3Qml0bWFwTWF0cml4OiB7CisgICAgICAgICAgICAgICAgcmVuZGVyZXIuZHJhd0JpdG1hcChnZXRCaXRtYXAoKSwgZ2V0TWF0cml4KCksIGdldFBhaW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERyYXdCaXRtYXBSZWN0OiB7CisgICAgICAgICAgICAgICAgcmVuZGVyZXIuZHJhd0JpdG1hcChnZXRCaXRtYXAoKSwgZ2V0RmxvYXQoKSwgZ2V0RmxvYXQoKSwgZ2V0RmxvYXQoKSwgZ2V0RmxvYXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEZsb2F0KCksIGdldEZsb2F0KCksIGdldEZsb2F0KCksIGdldEZsb2F0KCksIGdldFBhaW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERyYXdQYXRjaDogeworICAgICAgICAgICAgICAgIGludDMyX3QqIHhEaXZzID0gTlVMTDsKKyAgICAgICAgICAgICAgICBpbnQzMl90KiB5RGl2cyA9IE5VTEw7CisgICAgICAgICAgICAgICAgdWludDMyX3QgeERpdnNDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgdWludDMyX3QgeURpdnNDb3VudCA9IDA7CisKKyAgICAgICAgICAgICAgICBTa0JpdG1hcCogYml0bWFwID0gZ2V0Qml0bWFwKCk7CisKKyAgICAgICAgICAgICAgICB4RGl2cyA9IGdldEludHMoeERpdnNDb3VudCk7CisgICAgICAgICAgICAgICAgeURpdnMgPSBnZXRJbnRzKHlEaXZzQ291bnQpOworCisgICAgICAgICAgICAgICAgcmVuZGVyZXIuZHJhd1BhdGNoKGJpdG1hcCwgeERpdnMsIHlEaXZzLCB4RGl2c0NvdW50LCB5RGl2c0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmxvYXQoKSwgZ2V0RmxvYXQoKSwgZ2V0RmxvYXQoKSwgZ2V0RmxvYXQoKSwgZ2V0UGFpbnQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRHJhd0NvbG9yOiB7CisgICAgICAgICAgICAgICAgcmVuZGVyZXIuZHJhd0NvbG9yKGdldEludCgpLCAoU2tYZmVybW9kZTo6TW9kZSkgZ2V0SW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERyYXdSZWN0OiB7CisgICAgICAgICAgICAgICAgcmVuZGVyZXIuZHJhd1JlY3QoZ2V0RmxvYXQoKSwgZ2V0RmxvYXQoKSwgZ2V0RmxvYXQoKSwgZ2V0RmxvYXQoKSwgZ2V0UGFpbnQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRHJhd1BhdGg6IHsKKyAgICAgICAgICAgICAgICByZW5kZXJlci5kcmF3UGF0aChnZXRQYXRoKCksIGdldFBhaW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERyYXdMaW5lczogeworICAgICAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgZmxvYXQqIHBvaW50cyA9IGdldEZsb2F0cyhjb3VudCk7CisgICAgICAgICAgICAgICAgcmVuZGVyZXIuZHJhd0xpbmVzKHBvaW50cywgY291bnQsIGdldFBhaW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERyYXdUZXh0OiB7CisgICAgICAgICAgICAgICAgZ2V0VGV4dCgmdGV4dCk7CisgICAgICAgICAgICAgICAgcmVuZGVyZXIuZHJhd1RleHQodGV4dC50ZXh0KCksIHRleHQubGVuZ3RoKCksIGdldEludCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmxvYXQoKSwgZ2V0RmxvYXQoKSwgZ2V0UGFpbnQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUmVzZXRTaGFkZXI6IHsKKyAgICAgICAgICAgICAgICByZW5kZXJlci5yZXNldFNoYWRlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNldHVwU2hhZGVyOiB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUmVzZXRDb2xvckZpbHRlcjogeworICAgICAgICAgICAgICAgIHJlbmRlcmVyLnJlc2V0Q29sb3JGaWx0ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTZXR1cENvbG9yRmlsdGVyOiB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUmVzZXRTaGFkb3c6IHsKKyAgICAgICAgICAgICAgICByZW5kZXJlci5yZXNldFNoYWRvdygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNldHVwU2hhZG93OiB7CisgICAgICAgICAgICAgICAgcmVuZGVyZXIuc2V0dXBTaGFkb3coZ2V0RmxvYXQoKSwgZ2V0RmxvYXQoKSwgZ2V0RmxvYXQoKSwgZ2V0SW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJhc2Ugc3RydWN0dXJlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0Rpc3BsYXlMaXN0UmVuZGVyZXI6OkRpc3BsYXlMaXN0UmVuZGVyZXIoKToKKyAgICAgICAgbUhlYXAoSEVBUF9CTE9DS19TSVpFKSwgbVdyaXRlcihNSU5fV1JJVEVSX1NJWkUpIHsKKyAgICBtQml0bWFwSW5kZXggPSBtTWF0cml4SW5kZXggPSBtUGFpbnRJbmRleCA9IDE7CisgICAgbVBhdGhIZWFwID0gTlVMTDsKK30KKworRGlzcGxheUxpc3RSZW5kZXJlcjo6fkRpc3BsYXlMaXN0UmVuZGVyZXIoKSB7CisgICAgcmVzZXQoKTsKK30KKwordm9pZCBEaXNwbGF5TGlzdFJlbmRlcmVyOjpyZXNldCgpIHsKKyAgICBpZiAobVBhdGhIZWFwKSB7CisgICAgICAgIG1QYXRoSGVhcC0+dW5yZWYoKTsKKyAgICAgICAgbVBhdGhIZWFwID0gTlVMTDsKKyAgICB9CisKKyAgICBtQml0bWFwcy5yZXNldCgpOworICAgIG1NYXRyaWNlcy5yZXNldCgpOworICAgIG1QYWludHMucmVzZXQoKTsKKworICAgIG1Xcml0ZXIucmVzZXQoKTsKKyAgICBtSGVhcC5yZXNldCgpOworCisgICAgbVJDUmVjb3JkZXIucmVzZXQoKTsKKyAgICBtVEZSZWNvcmRlci5yZXNldCgpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBPcGVyYXRpb25zCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgRGlzcGxheUxpc3RSZW5kZXJlcjo6c2V0Vmlld3BvcnQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgbU9ydGhvTWF0cml4LmxvYWRPcnRobygwLCB3aWR0aCwgaGVpZ2h0LCAwLCAtMSwgMSk7CisKKyAgICBtV2lkdGggPSB3aWR0aDsKKyAgICBtSGVpZ2h0ID0gaGVpZ2h0OworfQorCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OnByZXBhcmUoKSB7CisgICAgbVNuYXBzaG90ID0gbmV3IFNuYXBzaG90KG1GaXJzdFNuYXBzaG90LAorICAgICAgICAgICAgU2tDYW52YXM6OmtNYXRyaXhfU2F2ZUZsYWcgfCBTa0NhbnZhczo6a0NsaXBfU2F2ZUZsYWcpOworICAgIG1TYXZlQ291bnQgPSAxOworICAgIG1TbmFwc2hvdC0+c2V0Q2xpcCgwLjBmLCAwLjBmLCBtV2lkdGgsIG1IZWlnaHQpOworfQorCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OmFjcXVpcmVDb250ZXh0KCkgeworICAgIGFkZE9wKERpc3BsYXlMaXN0OjpBY3F1aXJlQ29udGV4dCk7CisgICAgT3BlbkdMUmVuZGVyZXI6OmFjcXVpcmVDb250ZXh0KCk7Cit9CisKK3ZvaWQgRGlzcGxheUxpc3RSZW5kZXJlcjo6cmVsZWFzZUNvbnRleHQoKSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OlJlbGVhc2VDb250ZXh0KTsKKyAgICBPcGVuR0xSZW5kZXJlcjo6cmVsZWFzZUNvbnRleHQoKTsKK30KKworaW50IERpc3BsYXlMaXN0UmVuZGVyZXI6OnNhdmUoaW50IGZsYWdzKSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OlNhdmUpOworICAgIGFkZEludChmbGFncyk7CisgICAgcmV0dXJuIE9wZW5HTFJlbmRlcmVyOjpzYXZlKGZsYWdzKTsKK30KKwordm9pZCBEaXNwbGF5TGlzdFJlbmRlcmVyOjpyZXN0b3JlKCkgeworICAgIGFkZE9wKERpc3BsYXlMaXN0OjpSZXN0b3JlKTsKKyAgICBPcGVuR0xSZW5kZXJlcjo6cmVzdG9yZSgpOworfQorCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OnJlc3RvcmVUb0NvdW50KGludCBzYXZlQ291bnQpIHsKKyAgICBhZGRPcChEaXNwbGF5TGlzdDo6UmVzdG9yZVRvQ291bnQpOworICAgIGFkZEludChzYXZlQ291bnQpOworICAgIE9wZW5HTFJlbmRlcmVyOjpyZXN0b3JlVG9Db3VudChzYXZlQ291bnQpOworfQorCitpbnQgRGlzcGxheUxpc3RSZW5kZXJlcjo6c2F2ZUxheWVyKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgY29uc3QgU2tQYWludCogcCwgaW50IGZsYWdzKSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OlNhdmVMYXllcik7CisgICAgYWRkQm91bmRzKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgYWRkUGFpbnQocCk7CisgICAgYWRkSW50KGZsYWdzKTsKKyAgICByZXR1cm4gT3BlbkdMUmVuZGVyZXI6OnNhdmUoZmxhZ3MpOworfQorCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OnRyYW5zbGF0ZShmbG9hdCBkeCwgZmxvYXQgZHkpIHsKKyAgICBhZGRPcChEaXNwbGF5TGlzdDo6VHJhbnNsYXRlKTsKKyAgICBhZGRQb2ludChkeCwgZHkpOworICAgIE9wZW5HTFJlbmRlcmVyOjp0cmFuc2xhdGUoZHgsIGR5KTsKK30KKwordm9pZCBEaXNwbGF5TGlzdFJlbmRlcmVyOjpyb3RhdGUoZmxvYXQgZGVncmVlcykgeworICAgIGFkZE9wKERpc3BsYXlMaXN0OjpSb3RhdGUpOworICAgIGFkZEZsb2F0KGRlZ3JlZXMpOworICAgIE9wZW5HTFJlbmRlcmVyOjpyb3RhdGUoZGVncmVlcyk7Cit9CisKK3ZvaWQgRGlzcGxheUxpc3RSZW5kZXJlcjo6c2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5KSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OlNjYWxlKTsKKyAgICBhZGRQb2ludChzeCwgc3kpOworICAgIE9wZW5HTFJlbmRlcmVyOjpzY2FsZShzeCwgc3kpOworfQorCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OnNldE1hdHJpeChTa01hdHJpeCogbWF0cml4KSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OlNldE1hdHJpeCk7CisgICAgYWRkTWF0cml4KG1hdHJpeCk7CisgICAgT3BlbkdMUmVuZGVyZXI6OnNldE1hdHJpeChtYXRyaXgpOworfQorCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OmNvbmNhdE1hdHJpeChTa01hdHJpeCogbWF0cml4KSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OkNvbmNhdE1hdHJpeCk7CisgICAgYWRkTWF0cml4KG1hdHJpeCk7CisgICAgT3BlbkdMUmVuZGVyZXI6OmNvbmNhdE1hdHJpeChtYXRyaXgpOworfQorCitib29sIERpc3BsYXlMaXN0UmVuZGVyZXI6OmNsaXBSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgU2tSZWdpb246Ok9wIG9wKSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OkNsaXBSZWN0KTsKKyAgICBhZGRCb3VuZHMobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICBhZGRJbnQob3ApOworICAgIHJldHVybiBPcGVuR0xSZW5kZXJlcjo6Y2xpcFJlY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBvcCk7Cit9CisKK3ZvaWQgRGlzcGxheUxpc3RSZW5kZXJlcjo6ZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsCisgICAgICAgIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OkRyYXdCaXRtYXApOworICAgIGFkZEJpdG1hcChiaXRtYXApOworICAgIGFkZFBvaW50KGxlZnQsIHRvcCk7CisgICAgYWRkUGFpbnQocGFpbnQpOworfQorCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OmRyYXdCaXRtYXAoU2tCaXRtYXAqIGJpdG1hcCwgY29uc3QgU2tNYXRyaXgqIG1hdHJpeCwKKyAgICAgICAgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBhZGRPcChEaXNwbGF5TGlzdDo6RHJhd0JpdG1hcE1hdHJpeCk7CisgICAgYWRkQml0bWFwKGJpdG1hcCk7CisgICAgYWRkTWF0cml4KG1hdHJpeCk7CisgICAgYWRkUGFpbnQocGFpbnQpOworfQorCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OmRyYXdCaXRtYXAoU2tCaXRtYXAqIGJpdG1hcCwgZmxvYXQgc3JjTGVmdCwgZmxvYXQgc3JjVG9wLAorICAgICAgICBmbG9hdCBzcmNSaWdodCwgZmxvYXQgc3JjQm90dG9tLCBmbG9hdCBkc3RMZWZ0LCBmbG9hdCBkc3RUb3AsCisgICAgICAgIGZsb2F0IGRzdFJpZ2h0LCBmbG9hdCBkc3RCb3R0b20sIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OkRyYXdCaXRtYXBSZWN0KTsKKyAgICBhZGRCaXRtYXAoYml0bWFwKTsKKyAgICBhZGRCb3VuZHMoc3JjTGVmdCwgc3JjVG9wLCBzcmNSaWdodCwgc3JjQm90dG9tKTsKKyAgICBhZGRCb3VuZHMoZHN0TGVmdCwgZHN0VG9wLCBkc3RSaWdodCwgZHN0Qm90dG9tKTsKKyAgICBhZGRQYWludChwYWludCk7Cit9CisKK3ZvaWQgRGlzcGxheUxpc3RSZW5kZXJlcjo6ZHJhd1BhdGNoKFNrQml0bWFwKiBiaXRtYXAsIGNvbnN0IGludDMyX3QqIHhEaXZzLCBjb25zdCBpbnQzMl90KiB5RGl2cywKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIGFkZE9wKERpc3BsYXlMaXN0OjpEcmF3UGF0Y2gpOworICAgIGFkZEJpdG1hcChiaXRtYXApOworICAgIGFkZEludHMoeERpdnMsIHdpZHRoKTsKKyAgICBhZGRJbnRzKHlEaXZzLCBoZWlnaHQpOworICAgIGFkZEJvdW5kcyhsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgIGFkZFBhaW50KHBhaW50KTsKK30KKwordm9pZCBEaXNwbGF5TGlzdFJlbmRlcmVyOjpkcmF3Q29sb3IoaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpIHsKKyAgICBhZGRPcChEaXNwbGF5TGlzdDo6RHJhd0NvbG9yKTsKKyAgICBhZGRJbnQoY29sb3IpOworICAgIGFkZEludChtb2RlKTsKK30KKwordm9pZCBEaXNwbGF5TGlzdFJlbmRlcmVyOjpkcmF3UmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OkRyYXdSZWN0KTsKKyAgICBhZGRCb3VuZHMobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICBhZGRQYWludChwYWludCk7Cit9CisKK3ZvaWQgRGlzcGxheUxpc3RSZW5kZXJlcjo6ZHJhd1BhdGgoU2tQYXRoKiBwYXRoLCBTa1BhaW50KiBwYWludCkgeworICAgIGFkZE9wKERpc3BsYXlMaXN0OjpEcmF3UGF0aCk7CisgICAgYWRkUGF0aChwYXRoKTsKKyAgICBhZGRQYWludChwYWludCk7Cit9CisKK3ZvaWQgRGlzcGxheUxpc3RSZW5kZXJlcjo6ZHJhd0xpbmVzKGZsb2F0KiBwb2ludHMsIGludCBjb3VudCwgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBhZGRPcChEaXNwbGF5TGlzdDo6RHJhd0xpbmVzKTsKKyAgICBhZGRGbG9hdHMocG9pbnRzLCBjb3VudCk7CisgICAgYWRkUGFpbnQocGFpbnQpOworfQorCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OmRyYXdUZXh0KGNvbnN0IGNoYXIqIHRleHQsIGludCBieXRlc0NvdW50LCBpbnQgY291bnQsCisgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIFNrUGFpbnQqIHBhaW50KSB7CisgICAgYWRkT3AoRGlzcGxheUxpc3Q6OkRyYXdUZXh0KTsKKyAgICBhZGRUZXh0KHRleHQsIGJ5dGVzQ291bnQpOworICAgIGFkZEludChjb3VudCk7CisgICAgYWRkUG9pbnQoeCwgeSk7CisgICAgYWRkUGFpbnQocGFpbnQpOworfQorCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OnJlc2V0U2hhZGVyKCkgeworICAgIGFkZE9wKERpc3BsYXlMaXN0OjpSZXNldFNoYWRlcik7CisgICAgT3BlbkdMUmVuZGVyZXI6OnJlc2V0U2hhZGVyKCk7Cit9CisKK3ZvaWQgRGlzcGxheUxpc3RSZW5kZXJlcjo6c2V0dXBTaGFkZXIoU2tpYVNoYWRlciogc2hhZGVyKSB7CisgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgT3BlbkdMUmVuZGVyZXI6OnNldHVwU2hhZGVyKHNoYWRlcik7Cit9CisKK3ZvaWQgRGlzcGxheUxpc3RSZW5kZXJlcjo6cmVzZXRDb2xvckZpbHRlcigpIHsKKyAgICBhZGRPcChEaXNwbGF5TGlzdDo6UmVzZXRDb2xvckZpbHRlcik7CisgICAgT3BlbkdMUmVuZGVyZXI6OnJlc2V0Q29sb3JGaWx0ZXIoKTsKK30KKwordm9pZCBEaXNwbGF5TGlzdFJlbmRlcmVyOjpzZXR1cENvbG9yRmlsdGVyKFNraWFDb2xvckZpbHRlciogZmlsdGVyKSB7CisgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgT3BlbkdMUmVuZGVyZXI6OnNldHVwQ29sb3JGaWx0ZXIoZmlsdGVyKTsKK30KKwordm9pZCBEaXNwbGF5TGlzdFJlbmRlcmVyOjpyZXNldFNoYWRvdygpIHsKKyAgICBhZGRPcChEaXNwbGF5TGlzdDo6UmVzZXRTaGFkb3cpOworICAgIE9wZW5HTFJlbmRlcmVyOjpyZXNldFNoYWRvdygpOworfQorCit2b2lkIERpc3BsYXlMaXN0UmVuZGVyZXI6OnNldHVwU2hhZG93KGZsb2F0IHJhZGl1cywgZmxvYXQgZHgsIGZsb2F0IGR5LCBpbnQgY29sb3IpIHsKKyAgICBhZGRPcChEaXNwbGF5TGlzdDo6U2V0dXBTaGFkb3cpOworICAgIGFkZEZsb2F0KHJhZGl1cyk7CisgICAgYWRkUG9pbnQoZHgsIGR5KTsKKyAgICBhZGRJbnQoY29sb3IpOworICAgIE9wZW5HTFJlbmRlcmVyOjpzZXR1cFNoYWRvdyhyYWRpdXMsIGR4LCBkeSwgY29sb3IpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZWNvcmRpbmcgbWFuYWdlbWVudAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitpbnQgRGlzcGxheUxpc3RSZW5kZXJlcjo6ZmluZChTa1REQXJyYXk8Y29uc3QgU2tGbGF0UGFpbnQqPiYgcGFpbnRzLCBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIGlmIChwYWludCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIFNrRmxhdFBhaW50KiBmbGF0ID0gU2tGbGF0UGFpbnQ6OkZsYXR0ZW4oJm1IZWFwLCAqcGFpbnQsIG1QYWludEluZGV4LAorICAgICAgICAgICAgJm1SQ1JlY29yZGVyLCAmbVRGUmVjb3JkZXIpOworICAgIGludCBpbmRleCA9IFNrVFNlYXJjaDxTa0ZsYXREYXRhPigoY29uc3QgU2tGbGF0RGF0YSoqKSBwYWludHMuYmVnaW4oKSwKKyAgICAgICAgICAgIHBhaW50cy5jb3VudCgpLCAoU2tGbGF0RGF0YSopIGZsYXQsIHNpemVvZihmbGF0KSwgJlNrRmxhdERhdGE6OkNvbXBhcmUpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICh2b2lkKSBtSGVhcC51bmFsbG9jKGZsYXQpOworICAgICAgICByZXR1cm4gcGFpbnRzW2luZGV4XS0+aW5kZXgoKTsKKyAgICB9CisKKyAgICBpbmRleCA9IH5pbmRleDsKKyAgICAqcGFpbnRzLmluc2VydChpbmRleCkgPSBmbGF0OworICAgIHJldHVybiBtUGFpbnRJbmRleCsrOworfQorCitpbnQgRGlzcGxheUxpc3RSZW5kZXJlcjo6ZmluZChTa1REQXJyYXk8Y29uc3QgU2tGbGF0TWF0cml4Kj4mIG1hdHJpY2VzLCBjb25zdCBTa01hdHJpeCogbWF0cml4KSB7CisgICAgaWYgKG1hdHJpeCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIFNrRmxhdE1hdHJpeCogZmxhdCA9IFNrRmxhdE1hdHJpeDo6RmxhdHRlbigmbUhlYXAsICptYXRyaXgsIG1NYXRyaXhJbmRleCk7CisgICAgaW50IGluZGV4ID0gU2tUU2VhcmNoPFNrRmxhdERhdGE+KChjb25zdCBTa0ZsYXREYXRhKiopIG1hdHJpY2VzLmJlZ2luKCksCisgICAgICAgICAgICBtYXRyaWNlcy5jb3VudCgpLCAoU2tGbGF0RGF0YSopIGZsYXQsIHNpemVvZihmbGF0KSwgJlNrRmxhdERhdGE6OkNvbXBhcmUpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICh2b2lkKSBtSGVhcC51bmFsbG9jKGZsYXQpOworICAgICAgICByZXR1cm4gbWF0cmljZXNbaW5kZXhdLT5pbmRleCgpOworICAgIH0KKyAgICBpbmRleCA9IH5pbmRleDsKKyAgICAqbWF0cmljZXMuaW5zZXJ0KGluZGV4KSA9IGZsYXQ7CisgICAgcmV0dXJuIG1NYXRyaXhJbmRleCsrOworfQorCitpbnQgRGlzcGxheUxpc3RSZW5kZXJlcjo6ZmluZChTa1REQXJyYXk8Y29uc3QgU2tGbGF0Qml0bWFwKj4mIGJpdG1hcHMsIGNvbnN0IFNrQml0bWFwJiBiaXRtYXApIHsKKyAgICBTa0ZsYXRCaXRtYXAqIGZsYXQgPSBTa0ZsYXRCaXRtYXA6OkZsYXR0ZW4oJm1IZWFwLCBiaXRtYXAsIG1CaXRtYXBJbmRleCwgJm1SQ1JlY29yZGVyKTsKKyAgICBpbnQgaW5kZXggPSBTa1RTZWFyY2g8U2tGbGF0RGF0YT4oKGNvbnN0IFNrRmxhdERhdGEqKikgYml0bWFwcy5iZWdpbigpLAorICAgICAgICAgICAgYml0bWFwcy5jb3VudCgpLCAoU2tGbGF0RGF0YSopIGZsYXQsIHNpemVvZihmbGF0KSwgJlNrRmxhdERhdGE6OkNvbXBhcmUpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICh2b2lkKSBtSGVhcC51bmFsbG9jKGZsYXQpOworICAgICAgICByZXR1cm4gYml0bWFwc1tpbmRleF0tPmluZGV4KCk7CisgICAgfQorICAgIGluZGV4ID0gfmluZGV4OworICAgICpiaXRtYXBzLmluc2VydChpbmRleCkgPSBmbGF0OworICAgIHJldHVybiBtQml0bWFwSW5kZXgrKzsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvRGlzcGxheUxpc3RSZW5kZXJlci5oIGIvbGlicy9od3VpL0Rpc3BsYXlMaXN0UmVuZGVyZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDAyYmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0Rpc3BsYXlMaXN0UmVuZGVyZXIuaApAQCAtMCwwICsxLDM3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9ESVNQTEFZX0xJU1RfUkVOREVSRVJfSAorI2RlZmluZSBBTkRST0lEX1VJX0RJU1BMQVlfTElTVF9SRU5ERVJFUl9ICisKKyNpbmNsdWRlIDxTa0NodW5rQWxsb2MuaD4KKyNpbmNsdWRlIDxTa0ZsYXR0ZW5hYmxlLmg+CisjaW5jbHVkZSA8U2tNYXRyaXguaD4KKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisjaW5jbHVkZSA8U2tQYXRoLmg+CisjaW5jbHVkZSA8U2tQaWN0dXJlRmxhdC5oPgorI2luY2x1ZGUgPFNrUmVmQ250Lmg+CisjaW5jbHVkZSA8U2tUREFycmF5Lmg+CisjaW5jbHVkZSA8U2tUU2VhcmNoLmg+CisKKyNpbmNsdWRlICJPcGVuR0xSZW5kZXJlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlZmluZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBNSU5fV1JJVEVSX1NJWkUgMTYzODQKKyNkZWZpbmUgSEVBUF9CTE9DS19TSVpFIDQwOTYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSGVscGVycworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBQYXRoSGVhcDogcHVibGljIFNrUmVmQ250IHsKK3B1YmxpYzoKKyAgICBQYXRoSGVhcCgpOworICAgIFBhdGhIZWFwKFNrRmxhdHRlbmFibGVSZWFkQnVmZmVyJiBidWZmZXIpOworICAgIH5QYXRoSGVhcCgpOworCisgICAgaW50IGFwcGVuZChjb25zdCBTa1BhdGgmIHBhdGgpOworCisgICAgaW50IGNvdW50KCkgY29uc3QgeyByZXR1cm4gbVBhdGhzLmNvdW50KCk7IH0KKworICAgIFNrUGF0aCYgb3BlcmF0b3JbXShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICptUGF0aHNbaW5kZXhdOworICAgIH0KKworICAgIHZvaWQgZmxhdHRlbihTa0ZsYXR0ZW5hYmxlV3JpdGVCdWZmZXImIGJ1ZmZlcikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgU2tDaHVua0FsbG9jIG1IZWFwOworICAgIFNrVERBcnJheTxTa1BhdGgqPiBtUGF0aHM7Cit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEaXNwbGF5IGxpc3QKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgRGlzcGxheUxpc3RSZW5kZXJlcjsKKworLyoqCisgKiBSZXBsYXlzIHJlY29yZGVkIGRyYXdpbmcgY29tbWFuZHMuCisgKi8KK2NsYXNzIERpc3BsYXlMaXN0IHsKK3B1YmxpYzoKKyAgICBEaXNwbGF5TGlzdChjb25zdCBEaXNwbGF5TGlzdFJlbmRlcmVyJiByZWNvcmRlcik7CisgICAgfkRpc3BsYXlMaXN0KCk7CisKKyAgICBlbnVtIE9wIHsKKyAgICAgICAgQWNxdWlyZUNvbnRleHQsCisgICAgICAgIFJlbGVhc2VDb250ZXh0LAorICAgICAgICBTYXZlLAorICAgICAgICBSZXN0b3JlLAorICAgICAgICBSZXN0b3JlVG9Db3VudCwKKyAgICAgICAgU2F2ZUxheWVyLAorICAgICAgICBUcmFuc2xhdGUsCisgICAgICAgIFJvdGF0ZSwKKyAgICAgICAgU2NhbGUsCisgICAgICAgIFNldE1hdHJpeCwKKyAgICAgICAgQ29uY2F0TWF0cml4LAorICAgICAgICBDbGlwUmVjdCwKKyAgICAgICAgRHJhd0JpdG1hcCwKKyAgICAgICAgRHJhd0JpdG1hcE1hdHJpeCwKKyAgICAgICAgRHJhd0JpdG1hcFJlY3QsCisgICAgICAgIERyYXdQYXRjaCwKKyAgICAgICAgRHJhd0NvbG9yLAorICAgICAgICBEcmF3UmVjdCwKKyAgICAgICAgRHJhd1BhdGgsCisgICAgICAgIERyYXdMaW5lcywKKyAgICAgICAgRHJhd1RleHQsCisgICAgICAgIFJlc2V0U2hhZGVyLAorICAgICAgICBTZXR1cFNoYWRlciwKKyAgICAgICAgUmVzZXRDb2xvckZpbHRlciwKKyAgICAgICAgU2V0dXBDb2xvckZpbHRlciwKKyAgICAgICAgUmVzZXRTaGFkb3csCisgICAgICAgIFNldHVwU2hhZG93CisgICAgfTsKKworICAgIHZvaWQgcmVwbGF5KE9wZW5HTFJlbmRlcmVyJiByZW5kZXJlcik7CisKK3ByaXZhdGU6CisgICAgdm9pZCBpbml0KCk7CisKKyAgICBjbGFzcyBUZXh0Q29udGFpbmVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHNpemVfdCBsZW5ndGgoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbUJ5dGVMZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBjaGFyKiB0ZXh0KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIChjb25zdCBjaGFyKikgbVRleHQ7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgbUJ5dGVMZW5ndGg7CisgICAgICAgIGNvbnN0IGNoYXIqIG1UZXh0OworICAgIH07CisKKyAgICBTa0JpdG1hcCogZ2V0Qml0bWFwKCkgeworICAgICAgICBpbnQgaW5kZXggPSBnZXRJbnQoKTsKKyAgICAgICAgcmV0dXJuICZtQml0bWFwc1tpbmRleCAtIDFdOworICAgIH0KKworICAgIGlubGluZSBpbnQgZ2V0SW5kZXgoKSB7CisgICAgICAgIHJldHVybiBtUmVhZGVyLnJlYWRJbnQoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgaW50IGdldEludCgpIHsKKyAgICAgICAgcmV0dXJuIG1SZWFkZXIucmVhZEludCgpOworICAgIH0KKworICAgIFNrTWF0cml4KiBnZXRNYXRyaXgoKSB7CisgICAgICAgIGludCBpbmRleCA9IGdldEludCgpOworICAgICAgICBpZiAoaW5kZXggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICZtTWF0cmljZXNbaW5kZXggLSAxXTsKKyAgICB9CisKKyAgICBTa1BhdGgqIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiAmKCptUGF0aEhlYXApW2dldEludCgpIC0gMV07CisgICAgfQorCisgICAgU2tQYWludCogZ2V0UGFpbnQoKSB7CisgICAgICAgIGludCBpbmRleCA9IGdldEludCgpOworICAgICAgICBpZiAoaW5kZXggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICZtUGFpbnRzW2luZGV4IC0gMV07CisgICAgfQorCisgICAgaW5saW5lIGZsb2F0IGdldEZsb2F0KCkgeworICAgICAgICByZXR1cm4gbVJlYWRlci5yZWFkU2NhbGFyKCk7CisgICAgfQorCisgICAgaW50MzJfdCogZ2V0SW50cyh1aW50MzJfdCYgY291bnQpIHsKKyAgICAgICAgY291bnQgPSBnZXRJbnQoKTsKKyAgICAgICAgcmV0dXJuIChpbnQzMl90KikgbVJlYWRlci5za2lwKGNvdW50ICogc2l6ZW9mKGludDMyX3QpKTsKKyAgICB9CisKKyAgICBmbG9hdCogZ2V0RmxvYXRzKGludCYgY291bnQpIHsKKyAgICAgICAgY291bnQgPSBnZXRJbnQoKTsKKyAgICAgICAgcmV0dXJuIChmbG9hdCopIG1SZWFkZXIuc2tpcChjb3VudCAqIHNpemVvZihmbG9hdCkpOworICAgIH0KKworICAgIHZvaWQgZ2V0VGV4dChUZXh0Q29udGFpbmVyKiB0ZXh0KSB7CisgICAgICAgIHNpemVfdCBsZW5ndGggPSB0ZXh0LT5tQnl0ZUxlbmd0aCA9IGdldEludCgpOworICAgICAgICB0ZXh0LT5tVGV4dCA9IChjb25zdCBjaGFyKikgbVJlYWRlci5za2lwKGxlbmd0aCk7CisgICAgfQorCisgICAgUGF0aEhlYXAqIG1QYXRoSGVhcDsKKworICAgIFNrQml0bWFwKiBtQml0bWFwczsKKyAgICBpbnQgbUJpdG1hcENvdW50OworCisgICAgU2tNYXRyaXgqIG1NYXRyaWNlczsKKyAgICBpbnQgbU1hdHJpeENvdW50OworCisgICAgU2tQYWludCogbVBhaW50czsKKyAgICBpbnQgbVBhaW50Q291bnQ7CisKKyAgICBtdXRhYmxlIFNrRmxhdHRlbmFibGVSZWFkQnVmZmVyIG1SZWFkZXI7CisKKyAgICBTa1JlZkNudFBsYXliYWNrIG1SQ1BsYXliYWNrOworICAgIFNrVHlwZWZhY2VQbGF5YmFjayBtVEZQbGF5YmFjazsKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJlbmRlcmVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogUmVjb3JkcyBkcmF3aW5nIGNvbW1hbmRzIGluIGEgZGlzcGxheSBsaXN0IGZvciBsYXR0ZXIgcGxheWJhY2suCisgKi8KK2NsYXNzIERpc3BsYXlMaXN0UmVuZGVyZXI6IHB1YmxpYyBPcGVuR0xSZW5kZXJlciB7CitwdWJsaWM6CisgICAgRGlzcGxheUxpc3RSZW5kZXJlcigpOworICAgIH5EaXNwbGF5TGlzdFJlbmRlcmVyKCk7CisKKyAgICB2b2lkIHNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCk7CisgICAgdm9pZCBwcmVwYXJlKCk7CisKKyAgICB2b2lkIGFjcXVpcmVDb250ZXh0KCk7CisgICAgdm9pZCByZWxlYXNlQ29udGV4dCgpOworCisgICAgaW50IHNhdmUoaW50IGZsYWdzKTsKKyAgICB2b2lkIHJlc3RvcmUoKTsKKyAgICB2b2lkIHJlc3RvcmVUb0NvdW50KGludCBzYXZlQ291bnQpOworCisgICAgaW50IHNhdmVMYXllcihmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBjb25zdCBTa1BhaW50KiBwLCBpbnQgZmxhZ3MpOworCisgICAgdm9pZCB0cmFuc2xhdGUoZmxvYXQgZHgsIGZsb2F0IGR5KTsKKyAgICB2b2lkIHJvdGF0ZShmbG9hdCBkZWdyZWVzKTsKKyAgICB2b2lkIHNjYWxlKGZsb2F0IHN4LCBmbG9hdCBzeSk7CisKKyAgICB2b2lkIHNldE1hdHJpeChTa01hdHJpeCogbWF0cml4KTsKKyAgICB2b2lkIGNvbmNhdE1hdHJpeChTa01hdHJpeCogbWF0cml4KTsKKworICAgIGJvb2wgY2xpcFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBTa1JlZ2lvbjo6T3Agb3ApOworCisgICAgdm9pZCBkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgY29uc3QgU2tQYWludCogcGFpbnQpOworICAgIHZvaWQgZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBjb25zdCBTa01hdHJpeCogbWF0cml4LCBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdm9pZCBkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IHNyY0xlZnQsIGZsb2F0IHNyY1RvcCwKKyAgICAgICAgICAgIGZsb2F0IHNyY1JpZ2h0LCBmbG9hdCBzcmNCb3R0b20sIGZsb2F0IGRzdExlZnQsIGZsb2F0IGRzdFRvcCwKKyAgICAgICAgICAgIGZsb2F0IGRzdFJpZ2h0LCBmbG9hdCBkc3RCb3R0b20sIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdQYXRjaChTa0JpdG1hcCogYml0bWFwLCBjb25zdCBpbnQzMl90KiB4RGl2cywgY29uc3QgaW50MzJfdCogeURpdnMsCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdm9pZCBkcmF3Q29sb3IoaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpOworICAgIHZvaWQgZHJhd1JlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdm9pZCBkcmF3UGF0aChTa1BhdGgqIHBhdGgsIFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdMaW5lcyhmbG9hdCogcG9pbnRzLCBpbnQgY291bnQsIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdUZXh0KGNvbnN0IGNoYXIqIHRleHQsIGludCBieXRlc0NvdW50LCBpbnQgY291bnQsIGZsb2F0IHgsIGZsb2F0IHksIFNrUGFpbnQqIHBhaW50KTsKKworICAgIHZvaWQgcmVzZXRTaGFkZXIoKTsKKyAgICB2b2lkIHNldHVwU2hhZGVyKFNraWFTaGFkZXIqIHNoYWRlcik7CisKKyAgICB2b2lkIHJlc2V0Q29sb3JGaWx0ZXIoKTsKKyAgICB2b2lkIHNldHVwQ29sb3JGaWx0ZXIoU2tpYUNvbG9yRmlsdGVyKiBmaWx0ZXIpOworCisgICAgdm9pZCByZXNldFNoYWRvdygpOworICAgIHZvaWQgc2V0dXBTaGFkb3coZmxvYXQgcmFkaXVzLCBmbG9hdCBkeCwgZmxvYXQgZHksIGludCBjb2xvcik7CisKKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICBEaXNwbGF5TGlzdCogZ2V0RGlzcGxheUxpc3QoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBuZXcgRGlzcGxheUxpc3QoKnRoaXMpOworICAgIH0KKworICAgIGNvbnN0IFNrV3JpdGVyMzImIHdyaXRlU3RyZWFtKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVdyaXRlcjsKKyAgICB9CisKKyAgICBjb25zdCBTa1REQXJyYXk8Y29uc3QgU2tGbGF0Qml0bWFwKj4mIGdldEJpdG1hcHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQml0bWFwczsKKyAgICB9CisKKyAgICBjb25zdCBTa1REQXJyYXk8Y29uc3QgU2tGbGF0TWF0cml4Kj4mIGdldE1hdHJpY2VzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU1hdHJpY2VzOworICAgIH0KKworICAgIGNvbnN0IFNrVERBcnJheTxjb25zdCBTa0ZsYXRQYWludCo+JiBnZXRQYWludHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUGFpbnRzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBpbmxpbmUgdm9pZCBhZGRPcChEaXNwbGF5TGlzdDo6T3AgZHJhd09wKSB7CisgICAgICAgIG1Xcml0ZXIud3JpdGVJbnQoZHJhd09wKTsKKyAgICB9CisKKyAgICBpbmxpbmUgdm9pZCBhZGRJbnQoaW50IHZhbHVlKSB7CisgICAgICAgIG1Xcml0ZXIud3JpdGVJbnQodmFsdWUpOworICAgIH0KKworICAgIHZvaWQgYWRkSW50cyhjb25zdCBpbnQzMl90KiB2YWx1ZXMsIHVpbnQzMl90IGNvdW50KSB7CisgICAgICAgIG1Xcml0ZXIud3JpdGVJbnQoY291bnQpOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgbVdyaXRlci53cml0ZUludCh2YWx1ZXNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIHZvaWQgYWRkRmxvYXQoZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgbVdyaXRlci53cml0ZVNjYWxhcih2YWx1ZSk7CisgICAgfQorCisgICAgdm9pZCBhZGRGbG9hdHMoY29uc3QgZmxvYXQqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgICAgIG1Xcml0ZXIud3JpdGVJbnQoY291bnQpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIG1Xcml0ZXIud3JpdGVTY2FsYXIodmFsdWVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSB2b2lkIGFkZFBvaW50KGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgbVdyaXRlci53cml0ZVNjYWxhcih4KTsKKyAgICAgICAgbVdyaXRlci53cml0ZVNjYWxhcih5KTsKKyAgICB9CisKKyAgICBpbmxpbmUgdm9pZCBhZGRCb3VuZHMoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKSB7CisgICAgICAgIG1Xcml0ZXIud3JpdGVTY2FsYXIobGVmdCk7CisgICAgICAgIG1Xcml0ZXIud3JpdGVTY2FsYXIodG9wKTsKKyAgICAgICAgbVdyaXRlci53cml0ZVNjYWxhcihyaWdodCk7CisgICAgICAgIG1Xcml0ZXIud3JpdGVTY2FsYXIoYm90dG9tKTsKKyAgICB9CisKKyAgICBpbmxpbmUgdm9pZCBhZGRUZXh0KGNvbnN0IHZvaWQqIHRleHQsIHNpemVfdCBieXRlTGVuZ3RoKSB7CisgICAgICAgIG1Xcml0ZXIud3JpdGVJbnQoYnl0ZUxlbmd0aCk7CisgICAgICAgIG1Xcml0ZXIud3JpdGVQYWQodGV4dCwgYnl0ZUxlbmd0aCk7CisgICAgfQorCisgICAgaW5saW5lIHZvaWQgYWRkUGF0aChjb25zdCBTa1BhdGgqIHBhdGgpIHsKKyAgICAgICAgaWYgKG1QYXRoSGVhcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBtUGF0aEhlYXAgPSBuZXcgUGF0aEhlYXAoKTsKKyAgICAgICAgfQorICAgICAgICBhZGRJbnQobVBhdGhIZWFwLT5hcHBlbmQoKnBhdGgpKTsKKyAgICB9CisKKyAgICBpbnQgZmluZChTa1REQXJyYXk8Y29uc3QgU2tGbGF0UGFpbnQqPiYgcGFpbnRzLCBjb25zdCBTa1BhaW50KiBwYWludCk7CisKKyAgICBpbmxpbmUgdm9pZCBhZGRQYWludChjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgICAgICBhZGRJbnQoZmluZChtUGFpbnRzLCBwYWludCkpOworICAgIH0KKworICAgIGludCBmaW5kKFNrVERBcnJheTxjb25zdCBTa0ZsYXRNYXRyaXgqPiYgbWF0cmljZXMsIGNvbnN0IFNrTWF0cml4KiBtYXRyaXgpOworCisgICAgaW5saW5lIHZvaWQgYWRkTWF0cml4KGNvbnN0IFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICAgICAgYWRkSW50KGZpbmQobU1hdHJpY2VzLCBtYXRyaXgpKTsKKyAgICB9CisKKyAgICBpbnQgZmluZChTa1REQXJyYXk8Y29uc3QgU2tGbGF0Qml0bWFwKj4mIGJpdG1hcHMsIGNvbnN0IFNrQml0bWFwJiBiaXRtYXApOworCisgICAgaW5saW5lIHZvaWQgYWRkQml0bWFwKGNvbnN0IFNrQml0bWFwKiBiaXRtYXApIHsKKyAgICAgICAgYWRkSW50KGZpbmQobUJpdG1hcHMsICpiaXRtYXApKTsKKyAgICB9CisKKyAgICBTa0NodW5rQWxsb2MgbUhlYXA7CisKKyAgICBpbnQgbUJpdG1hcEluZGV4OworICAgIFNrVERBcnJheTxjb25zdCBTa0ZsYXRCaXRtYXAqPiBtQml0bWFwczsKKworICAgIGludCBtTWF0cml4SW5kZXg7CisgICAgU2tUREFycmF5PGNvbnN0IFNrRmxhdE1hdHJpeCo+IG1NYXRyaWNlczsKKworICAgIGludCBtUGFpbnRJbmRleDsKKyAgICBTa1REQXJyYXk8Y29uc3QgU2tGbGF0UGFpbnQqPiBtUGFpbnRzOworCisgICAgUGF0aEhlYXAqIG1QYXRoSGVhcDsKKyAgICBTa1dyaXRlcjMyIG1Xcml0ZXI7CisKKyAgICBTa1JlZkNudFJlY29yZGVyIG1SQ1JlY29yZGVyOworICAgIFNrUmVmQ250UmVjb3JkZXIgbVRGUmVjb3JkZXI7CisKKyAgICBmcmllbmQgY2xhc3MgRGlzcGxheUxpc3Q7CisKK307IC8vIGNsYXNzIERpc3BsYXlMaXN0UmVuZGVyZXIKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX0RJU1BMQVlfTElTVF9SRU5ERVJFUl9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvRXh0ZW5zaW9ucy5oIGIvbGlicy9od3VpL0V4dGVuc2lvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTBkMzZlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0V4dGVuc2lvbnMuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0VYVEVOU0lPTlNfSAorI2RlZmluZSBBTkRST0lEX1VJX0VYVEVOU0lPTlNfSAorCisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGVmaW5lcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBEZWJ1ZworI2RlZmluZSBERUJVR19FWFRFTlNJT05TIDAKKworLy8gRGVidWcKKyNpZiBERUJVR19FWFRFTlNJT05TCisgICAgI2RlZmluZSBFWFRfTE9HRCguLi4pIExPR0QoX19WQV9BUkdTX18pCisjZWxzZQorICAgICNkZWZpbmUgRVhUX0xPR0QoLi4uKQorI2VuZGlmCisKK2NsYXNzIEV4dGVuc2lvbnMgeworcHVibGljOgorICAgIEV4dGVuc2lvbnMoKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGJ1ZmZlciA9IChjb25zdCBjaGFyKikgZ2xHZXRTdHJpbmcoR0xfRVhURU5TSU9OUyk7CisgICAgICAgIGNvbnN0IGNoYXIqIGN1cnJlbnQgPSBidWZmZXI7CisgICAgICAgIGNvbnN0IGNoYXIqIGhlYWQgPSBjdXJyZW50OworICAgICAgICBFWFRfTE9HRCgiQXZhaWxhYmxlIEdMIGV4dGVuc2lvbnM6Iik7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGhlYWQgPSBzdHJjaHIoY3VycmVudCwgJyAnKTsKKyAgICAgICAgICAgIFN0cmluZzggcyhjdXJyZW50LCBoZWFkID8gaGVhZCAtIGN1cnJlbnQgOiBzdHJsZW4oY3VycmVudCkpOworICAgICAgICAgICAgaWYgKHMubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICBtRXh0ZW5zaW9uTGlzdC5hZGQocyk7CisgICAgICAgICAgICAgICAgRVhUX0xPR0QoIiAgJXMiLCBzLnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnJlbnQgPSBoZWFkICsgMTsKKyAgICAgICAgfSB3aGlsZSAoaGVhZCk7CisKKyAgICAgICAgbUhhc05Qb3QgPSBoYXNFeHRlbnNpb24oIkdMX09FU190ZXh0dXJlX25wb3QiKTsKKyAgICAgICAgbUhhc0RyYXdQYXRoID0gaGFzRXh0ZW5zaW9uKCJHTF9OVl9kcmF3X3BhdGgiKTsKKyAgICAgICAgbUhhc0NvdmVyYWdlU2FtcGxlID0gaGFzRXh0ZW5zaW9uKCJHTF9OVl9jb3ZlcmFnZV9zYW1wbGUiKTsKKyAgICAgICAgbUhhc0ZyYW1lYnVmZmVyRmV0Y2ggPSBoYXNFeHRlbnNpb24oIkdMX05WX3NoYWRlcl9mcmFtZWJ1ZmZlcl9mZXRjaCIpOworCisgICAgICAgIG1FeHRlbnNpb25zID0gYnVmZmVyOworICAgIH0KKworICAgIGlubGluZSBib29sIGhhc05Qb3QoKSBjb25zdCB7IHJldHVybiBtSGFzTlBvdDsgfQorICAgIGlubGluZSBib29sIGhhc0RyYXdQYXRoKCkgY29uc3QgeyByZXR1cm4gbUhhc0RyYXdQYXRoOyB9CisgICAgaW5saW5lIGJvb2wgaGFzQ292ZXJhZ2VTYW1wbGUoKSBjb25zdCB7IHJldHVybiBtSGFzQ292ZXJhZ2VTYW1wbGU7IH0KKyAgICBpbmxpbmUgYm9vbCBoYXNGcmFtZWJ1ZmZlckZldGNoKCkgY29uc3QgeyByZXR1cm4gbUhhc0ZyYW1lYnVmZmVyRmV0Y2g7IH0KKworICAgIGJvb2wgaGFzRXh0ZW5zaW9uKGNvbnN0IGNoYXIqIGV4dGVuc2lvbikgY29uc3QgeworICAgICAgICBjb25zdCBTdHJpbmc4IHMoZXh0ZW5zaW9uKTsKKyAgICAgICAgcmV0dXJuIG1FeHRlbnNpb25MaXN0LmluZGV4T2YocykgPj0gMDsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoKSB7CisgICAgICAgIExPR0QoIlN1cHBvcnRlZCBleHRlbnNpb25zOlxuJXMiLCBtRXh0ZW5zaW9ucyk7CisgICAgfQorCitwcml2YXRlOgorICAgIFNvcnRlZFZlY3RvcjxTdHJpbmc4PiBtRXh0ZW5zaW9uTGlzdDsKKworICAgIGNvbnN0IGNoYXIqIG1FeHRlbnNpb25zOworCisgICAgYm9vbCBtSGFzTlBvdDsKKyAgICBib29sIG1IYXNEcmF3UGF0aDsKKyAgICBib29sIG1IYXNDb3ZlcmFnZVNhbXBsZTsKKyAgICBib29sIG1IYXNGcmFtZWJ1ZmZlckZldGNoOworfTsgLy8gY2xhc3MgRXh0ZW5zaW9ucworCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfRVhURU5TSU9OU19ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvRmJvQ2FjaGUuY3BwIGIvbGlicy9od3VpL0Zib0NhY2hlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWY3MWMyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0Zib0NhY2hlLmNwcApAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiRmJvQ2FjaGUuaCIKKyNpbmNsdWRlICJQcm9wZXJ0aWVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29uc3RydWN0b3JzL2Rlc3RydWN0b3IKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworRmJvQ2FjaGU6OkZib0NhY2hlKCk6IG1NYXhTaXplKERFRkFVTFRfRkJPX0NBQ0hFX1NJWkUpIHsKKyAgICBjaGFyIHByb3BlcnR5W1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9GQk9fQ0FDSEVfU0laRSwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgZmJvIGNhY2hlIHNpemUgdG8gJXMiLCBwcm9wZXJ0eSk7CisgICAgICAgIG1NYXhTaXplID0gYXRvaShwcm9wZXJ0eSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiICBVc2luZyBkZWZhdWx0IGZibyBjYWNoZSBzaXplIG9mICVkIiwgREVGQVVMVF9GQk9fQ0FDSEVfU0laRSk7CisgICAgfQorfQorCitGYm9DYWNoZTo6fkZib0NhY2hlKCkgeworICAgIGNsZWFyKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNpemUgbWFuYWdlbWVudAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit1aW50MzJfdCBGYm9DYWNoZTo6Z2V0U2l6ZSgpIHsKKyAgICByZXR1cm4gbUNhY2hlLnNpemUoKTsKK30KKwordWludDMyX3QgRmJvQ2FjaGU6OmdldE1heFNpemUoKSB7CisgICAgcmV0dXJuIG1NYXhTaXplOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoaW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgRmJvQ2FjaGU6OmNsZWFyKCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNhY2hlLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IEdMdWludCBmYm8gPSBtQ2FjaGUuaXRlbUF0KGkpOworICAgICAgICBnbERlbGV0ZUZyYW1lYnVmZmVycygxLCAmZmJvKTsKKyAgICB9CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKK0dMdWludCBGYm9DYWNoZTo6Z2V0KCkgeworICAgIEdMdWludCBmYm87CisgICAgaWYgKG1DYWNoZS5zaXplKCkgPiAwKSB7CisgICAgICAgIGZibyA9IG1DYWNoZS5pdGVtQXQobUNhY2hlLnNpemUoKSAtIDEpOworICAgICAgICBtQ2FjaGUucmVtb3ZlQXQobUNhY2hlLnNpemUoKSAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsR2VuRnJhbWVidWZmZXJzKDEsICZmYm8pOworICAgIH0KKyAgICByZXR1cm4gZmJvOworfQorCitib29sIEZib0NhY2hlOjpwdXQoR0x1aW50IGZibykgeworICAgIGlmIChtQ2FjaGUuc2l6ZSgpIDwgbU1heFNpemUpIHsKKyAgICAgICAgbUNhY2hlLmFkZChmYm8pOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBnbERlbGV0ZUZyYW1lYnVmZmVycygxLCAmZmJvKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0Zib0NhY2hlLmggYi9saWJzL2h3dWkvRmJvQ2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzRhZmU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0Zib0NhY2hlLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9GQk9fQ0FDSEVfSAorI2RlZmluZSBBTkRST0lEX1VJX0ZCT19DQUNIRV9ICisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIEZib0NhY2hlIHsKK3B1YmxpYzoKKyAgICBGYm9DYWNoZSgpOworICAgIH5GYm9DYWNoZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBGQk8gZnJvbSB0aGUgY2FjaGUuIElmIG5vIEZCTyBpcyBhdmFpbGFibGUsIGEgbmV3IG9uZQorICAgICAqIGlzIGNyZWF0ZWQuIElmIGNyZWF0aW5nIGEgbmV3IEZCTyBmYWlscywgMCBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIFdoZW4gYW4gRkJPIGlzIG9idGFpbmVkIGZyb20gdGhlIGNhY2hlLCBpdCBpcyByZW1vdmVkIGFuZCB0aGUKKyAgICAgKiB0b3RhbCBudW1iZXIgb2YgRkJPcyBhdmFpbGFibGUgaW4gdGhlIGNhY2hlIGRlY3JlYXNlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIEZCTywgb3IgMCBpZiBubyBGQk8gY2FuIGJlIG9idGFpbmVkLgorICAgICAqLworICAgIEdMdWludCBnZXQoKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBGQk8gdG8gdGhlIGNhY2hlLgorICAgICAqCisgICAgICogQHBhcmFtIGZibyBUaGUgRkJPIHRvIGFkZCB0byB0aGUgY2FjaGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIEZCTyB3YXMgYWRkZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIHB1dChHTHVpbnQgZmJvKTsKKworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgY2FjaGUuIFRoaXMgY2F1c2VzIGFsbCBGQk9zIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjYWNoZS4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRTaXplKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBGQk9zIHRoYXQgdGhlIGNhY2hlIGNhbiBob2xkLgorICAgICAqLworICAgIHVpbnQzMl90IGdldE1heFNpemUoKTsKKworcHJpdmF0ZToKKyAgICBTb3J0ZWRWZWN0b3I8R0x1aW50PiBtQ2FjaGU7CisgICAgdWludDMyX3QgbU1heFNpemU7Cit9OyAvLyBjbGFzcyBGYm9DYWNoZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfRkJPX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Gb250UmVuZGVyZXIuY3BwIGIvbGlicy9od3VpL0ZvbnRSZW5kZXJlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM4OWU1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Gb250UmVuZGVyZXIuY3BwCkBAIC0wLDAgKzEsODMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPFNrVXRpbHMuaD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkZvbnRSZW5kZXJlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlZmluZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBERUZBVUxUX1RFWFRfQ0FDSEVfV0lEVEggMTAyNAorI2RlZmluZSBERUZBVUxUX1RFWFRfQ0FDSEVfSEVJR0hUIDI1NgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGb250CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0ZvbnQ6OkZvbnQoRm9udFJlbmRlcmVyKiBzdGF0ZSwgdWludDMyX3QgZm9udElkLCBmbG9hdCBmb250U2l6ZSkgOgorICAgIG1TdGF0ZShzdGF0ZSksIG1Gb250SWQoZm9udElkKSwgbUZvbnRTaXplKGZvbnRTaXplKSB7Cit9CisKKworRm9udDo6fkZvbnQoKSB7CisgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgbVN0YXRlLT5tQWN0aXZlRm9udHMuc2l6ZSgpOyBjdCsrKSB7CisgICAgICAgIGlmIChtU3RhdGUtPm1BY3RpdmVGb250c1tjdF0gPT0gdGhpcykgeworICAgICAgICAgICAgbVN0YXRlLT5tQWN0aXZlRm9udHMucmVtb3ZlQXQoY3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlZEdseXBocy5zaXplKCk7IGkrKykgeworICAgICAgICBDYWNoZWRHbHlwaEluZm8qIGdseXBoID0gbUNhY2hlZEdseXBocy52YWx1ZUF0KGkpOworICAgICAgICBkZWxldGUgZ2x5cGg7CisgICAgfQorfQorCit2b2lkIEZvbnQ6OmludmFsaWRhdGVUZXh0dXJlQ2FjaGUoKSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZWRHbHlwaHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUNhY2hlZEdseXBocy52YWx1ZUF0KGkpLT5tSXNWYWxpZCA9IGZhbHNlOworICAgIH0KK30KKwordm9pZCBGb250OjptZWFzdXJlQ2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5LCBSZWN0ICpib3VuZHMpIHsKKyAgICBpbnQgblBlblggPSB4ICsgZ2x5cGgtPm1CaXRtYXBMZWZ0OworICAgIGludCBuUGVuWSA9IHkgKyBnbHlwaC0+bUJpdG1hcFRvcDsKKworICAgIGludCB3aWR0aCA9IChpbnQpIGdseXBoLT5tQml0bWFwV2lkdGg7CisgICAgaW50IGhlaWdodCA9IChpbnQpIGdseXBoLT5tQml0bWFwSGVpZ2h0OworCisgICAgaWYgKGJvdW5kcy0+Ym90dG9tID4gblBlblkpIHsKKyAgICAgICAgYm91bmRzLT5ib3R0b20gPSBuUGVuWTsKKyAgICB9CisgICAgaWYgKGJvdW5kcy0+bGVmdCA+IG5QZW5YKSB7CisgICAgICAgIGJvdW5kcy0+bGVmdCA9IG5QZW5YOworICAgIH0KKyAgICBpZiAoYm91bmRzLT5yaWdodCA8IG5QZW5YICsgd2lkdGgpIHsKKyAgICAgICAgYm91bmRzLT5yaWdodCA9IG5QZW5YICsgd2lkdGg7CisgICAgfQorICAgIGlmIChib3VuZHMtPnRvcCA8IG5QZW5ZICsgaGVpZ2h0KSB7CisgICAgICAgIGJvdW5kcy0+dG9wID0gblBlblkgKyBoZWlnaHQ7CisgICAgfQorfQorCit2b2lkIEZvbnQ6OmRyYXdDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8qIGdseXBoLCBpbnQgeCwgaW50IHkpIHsKKyAgICBpbnQgblBlblggPSB4ICsgZ2x5cGgtPm1CaXRtYXBMZWZ0OworICAgIGludCBuUGVuWSA9IHkgKyBnbHlwaC0+bUJpdG1hcFRvcCArIGdseXBoLT5tQml0bWFwSGVpZ2h0OworCisgICAgZmxvYXQgdTEgPSBnbHlwaC0+bUJpdG1hcE1pblU7CisgICAgZmxvYXQgdTIgPSBnbHlwaC0+bUJpdG1hcE1heFU7CisgICAgZmxvYXQgdjEgPSBnbHlwaC0+bUJpdG1hcE1pblY7CisgICAgZmxvYXQgdjIgPSBnbHlwaC0+bUJpdG1hcE1heFY7CisKKyAgICBpbnQgd2lkdGggPSAoaW50KSBnbHlwaC0+bUJpdG1hcFdpZHRoOworICAgIGludCBoZWlnaHQgPSAoaW50KSBnbHlwaC0+bUJpdG1hcEhlaWdodDsKKworICAgIG1TdGF0ZS0+YXBwZW5kTWVzaFF1YWQoblBlblgsIG5QZW5ZLCAwLCB1MSwgdjIsCisgICAgICAgICAgICBuUGVuWCArIHdpZHRoLCBuUGVuWSwgMCwgdTIsIHYyLAorICAgICAgICAgICAgblBlblggKyB3aWR0aCwgblBlblkgLSBoZWlnaHQsIDAsIHUyLCB2MSwKKyAgICAgICAgICAgIG5QZW5YLCBuUGVuWSAtIGhlaWdodCwgMCwgdTEsIHYxKTsKK30KKwordm9pZCBGb250OjpkcmF3Q2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvKiBnbHlwaCwgaW50IHgsIGludCB5LAorICAgICAgICB1aW50OF90KiBiaXRtYXAsIHVpbnQzMl90IGJpdG1hcFcsIHVpbnQzMl90IGJpdG1hcEgpIHsKKyAgICBpbnQgblBlblggPSB4ICsgZ2x5cGgtPm1CaXRtYXBMZWZ0OworICAgIGludCBuUGVuWSA9IHkgKyBnbHlwaC0+bUJpdG1hcFRvcDsKKworICAgIHVpbnQzMl90IGVuZFggPSBnbHlwaC0+bVN0YXJ0WCArIGdseXBoLT5tQml0bWFwV2lkdGg7CisgICAgdWludDMyX3QgZW5kWSA9IGdseXBoLT5tU3RhcnRZICsgZ2x5cGgtPm1CaXRtYXBIZWlnaHQ7CisKKyAgICB1aW50MzJfdCBjYWNoZVdpZHRoID0gbVN0YXRlLT5nZXRDYWNoZVdpZHRoKCk7CisgICAgY29uc3QgdWludDhfdCogY2FjaGVCdWZmZXIgPSBtU3RhdGUtPmdldFRleHRUZXh0dXJlRGF0YSgpOworCisgICAgdWludDMyX3QgY2FjaGVYID0gMCwgY2FjaGVZID0gMDsKKyAgICBpbnQzMl90IGJYID0gMCwgYlkgPSAwOworICAgIGZvciAoY2FjaGVYID0gZ2x5cGgtPm1TdGFydFgsIGJYID0gblBlblg7IGNhY2hlWCA8IGVuZFg7IGNhY2hlWCsrLCBiWCsrKSB7CisgICAgICAgIGZvciAoY2FjaGVZID0gZ2x5cGgtPm1TdGFydFksIGJZID0gblBlblk7IGNhY2hlWSA8IGVuZFk7IGNhY2hlWSsrLCBiWSsrKSB7CisgICAgICAgICAgICBpZiAoYlggPCAwIHx8IGJZIDwgMCB8fCBiWCA+PSAoaW50MzJfdCkgYml0bWFwVyB8fCBiWSA+PSAoaW50MzJfdCkgYml0bWFwSCkgeworICAgICAgICAgICAgICAgIExPR0UoIlNraXBwaW5nIGludmFsaWQgaW5kZXgiKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQ4X3QgdGVtcENvbCA9IGNhY2hlQnVmZmVyW2NhY2hlWSAqIGNhY2hlV2lkdGggKyBjYWNoZVhdOworICAgICAgICAgICAgYml0bWFwW2JZICogYml0bWFwVyArIGJYXSA9IHRlbXBDb2w7CisgICAgICAgIH0KKyAgICB9CisKK30KKworRm9udDo6Q2FjaGVkR2x5cGhJbmZvKiBGb250OjpnZXRDYWNoZWRVVEZDaGFyKFNrUGFpbnQqIHBhaW50LCBpbnQzMl90IHV0ZkNoYXIpIHsKKyAgICBDYWNoZWRHbHlwaEluZm8qIGNhY2hlZEdseXBoID0gTlVMTDsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUNhY2hlZEdseXBocy5pbmRleE9mS2V5KHV0ZkNoYXIpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIGNhY2hlZEdseXBoID0gbUNhY2hlZEdseXBocy52YWx1ZUF0KGluZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBjYWNoZWRHbHlwaCA9IGNhY2hlR2x5cGgocGFpbnQsIHV0ZkNoYXIpOworICAgIH0KKworICAgIC8vIElzIHRoZSBnbHlwaCBzdGlsbCBpbiB0ZXh0dXJlIGNhY2hlPworICAgIGlmICghY2FjaGVkR2x5cGgtPm1Jc1ZhbGlkKSB7CisgICAgICAgIGNvbnN0IFNrR2x5cGgmIHNraWFHbHlwaCA9IHBhaW50LT5nZXRVbmljaGFyTWV0cmljcyh1dGZDaGFyKTsKKyAgICAgICAgdXBkYXRlR2x5cGhDYWNoZShwYWludCwgc2tpYUdseXBoLCBjYWNoZWRHbHlwaCk7CisgICAgfQorCisgICAgcmV0dXJuIGNhY2hlZEdseXBoOworfQorCit2b2lkIEZvbnQ6OnJlbmRlclVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgaW50IG51bUdseXBocywgaW50IHgsIGludCB5LCB1aW50OF90ICpiaXRtYXAsIHVpbnQzMl90IGJpdG1hcFcsIHVpbnQzMl90IGJpdG1hcEgpIHsKKyAgICBpZiAoYml0bWFwICE9IE5VTEwgJiYgYml0bWFwVyA+IDAgJiYgYml0bWFwSCA+IDApIHsKKyAgICAgICAgcmVuZGVyVVRGKHBhaW50LCB0ZXh0LCBzdGFydCwgbGVuLCBudW1HbHlwaHMsIHgsIHksIEJJVE1BUCwgYml0bWFwLAorICAgICAgICAgICAgICAgIGJpdG1hcFcsIGJpdG1hcEgsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlclVURihwYWludCwgdGV4dCwgc3RhcnQsIGxlbiwgbnVtR2x5cGhzLCB4LCB5LCBGUkFNRUJVRkZFUiwgTlVMTCwgMCwgMCwgTlVMTCk7CisgICAgfQorCit9CisKK3ZvaWQgRm9udDo6bWVhc3VyZVVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgaW50IG51bUdseXBocywgUmVjdCAqYm91bmRzKSB7CisgICAgaWYgKGJvdW5kcyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIk5vIHJldHVybiByZWN0YW5nbGUgcHJvdmlkZWQgdG8gbWVhc3VyZSB0ZXh0Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYm91bmRzLT5zZXQoMWU2LCAtMWU2LCAtMWU2LCAxZTYpOworICAgIHJlbmRlclVURihwYWludCwgdGV4dCwgc3RhcnQsIGxlbiwgbnVtR2x5cGhzLCAwLCAwLCBNRUFTVVJFLCBOVUxMLCAwLCAwLCBib3VuZHMpOworfQorCisjZGVmaW5lIFNrQXV0b0tlcm5fQWRqdXN0RihwcmV2LCBuZXh0KSAoKChuZXh0KSAtIChwcmV2KSArIDMyKSA+PiA2IDw8IDE2KQorCit2b2lkIEZvbnQ6OnJlbmRlclVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgaW50IG51bUdseXBocywgaW50IHgsIGludCB5LCBSZW5kZXJNb2RlIG1vZGUsIHVpbnQ4X3QgKmJpdG1hcCwKKyAgICAgICAgdWludDMyX3QgYml0bWFwVywgdWludDMyX3QgYml0bWFwSCxSZWN0ICpib3VuZHMpIHsKKyAgICBpZiAobnVtR2x5cGhzID09IDAgfHwgdGV4dCA9PSBOVUxMIHx8IGxlbiA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTa0ZpeGVkIHBlblggPSBTa0ludFRvRml4ZWQoeCk7CisgICAgaW50IHBlblkgPSB5OworICAgIGludCBnbHlwaHNMZWZ0ID0gMTsKKyAgICBpZiAobnVtR2x5cGhzID4gMCkgeworICAgICAgICBnbHlwaHNMZWZ0ID0gbnVtR2x5cGhzOworICAgIH0KKworICAgIFNrRml4ZWQgcHJldlJzYkRlbHRhID0gMDsKKyAgICBwZW5YICs9IFNLX0ZpeGVkMSAvIDI7CisKKyAgICB0ZXh0ICs9IHN0YXJ0OworCisgICAgd2hpbGUgKGdseXBoc0xlZnQgPiAwKSB7CisgICAgICAgIGludDMyX3QgdXRmQ2hhciA9IFNrVVRGMTZfTmV4dFVuaWNoYXIoKGNvbnN0IHVpbnQxNl90KiopICZ0ZXh0KTsKKworICAgICAgICAvLyBSZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHN0cmluZworICAgICAgICBpZiAodXRmQ2hhciA8IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQ2FjaGVkR2x5cGhJbmZvKiBjYWNoZWRHbHlwaCA9IGdldENhY2hlZFVURkNoYXIocGFpbnQsIHV0ZkNoYXIpOworICAgICAgICBwZW5YICs9IFNrQXV0b0tlcm5fQWRqdXN0RihwcmV2UnNiRGVsdGEsIGNhY2hlZEdseXBoLT5tTHNiRGVsdGEpOworICAgICAgICBwcmV2UnNiRGVsdGEgPSBjYWNoZWRHbHlwaC0+bVJzYkRlbHRhOworCisgICAgICAgIC8vIElmIGl0J3Mgc3RpbGwgbm90IHZhbGlkLCB3ZSBjb3VsZG4ndCBjYWNoZSBpdCwgc28gd2Ugc2hvdWxkbid0IGRyYXcgZ2FyYmFnZQorICAgICAgICBpZiAoY2FjaGVkR2x5cGgtPm1Jc1ZhbGlkKSB7CisgICAgICAgICAgICBzd2l0Y2gobW9kZSkgeworICAgICAgICAgICAgY2FzZSBGUkFNRUJVRkZFUjoKKyAgICAgICAgICAgICAgICBkcmF3Q2FjaGVkR2x5cGgoY2FjaGVkR2x5cGgsIFNrRml4ZWRGbG9vcihwZW5YKSwgcGVuWSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJJVE1BUDoKKyAgICAgICAgICAgICAgICBkcmF3Q2FjaGVkR2x5cGgoY2FjaGVkR2x5cGgsIFNrRml4ZWRGbG9vcihwZW5YKSwgcGVuWSwgYml0bWFwLCBiaXRtYXBXLCBiaXRtYXBIKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUVBU1VSRToKKyAgICAgICAgICAgICAgICBtZWFzdXJlQ2FjaGVkR2x5cGgoY2FjaGVkR2x5cGgsIFNrRml4ZWRGbG9vcihwZW5YKSwgcGVuWSwgYm91bmRzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBlblggKz0gY2FjaGVkR2x5cGgtPm1BZHZhbmNlWDsKKworICAgICAgICAvLyBJZiB3ZSB3ZXJlIGdpdmVuIGEgc3BlY2lmaWMgbnVtYmVyIG9mIGdseXBocywgZGVjcmVtZW50CisgICAgICAgIGlmIChudW1HbHlwaHMgPiAwKSB7CisgICAgICAgICAgICBnbHlwaHNMZWZ0LS07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRm9udDo6dXBkYXRlR2x5cGhDYWNoZShTa1BhaW50KiBwYWludCwgY29uc3QgU2tHbHlwaCYgc2tpYUdseXBoLCBDYWNoZWRHbHlwaEluZm8qIGdseXBoKSB7CisgICAgZ2x5cGgtPm1BZHZhbmNlWCA9IHNraWFHbHlwaC5mQWR2YW5jZVg7CisgICAgZ2x5cGgtPm1BZHZhbmNlWSA9IHNraWFHbHlwaC5mQWR2YW5jZVk7CisgICAgZ2x5cGgtPm1CaXRtYXBMZWZ0ID0gc2tpYUdseXBoLmZMZWZ0OworICAgIGdseXBoLT5tQml0bWFwVG9wID0gc2tpYUdseXBoLmZUb3A7CisgICAgZ2x5cGgtPm1Mc2JEZWx0YSA9IHNraWFHbHlwaC5mTHNiRGVsdGE7CisgICAgZ2x5cGgtPm1Sc2JEZWx0YSA9IHNraWFHbHlwaC5mUnNiRGVsdGE7CisKKyAgICB1aW50MzJfdCBzdGFydFggPSAwOworICAgIHVpbnQzMl90IHN0YXJ0WSA9IDA7CisKKyAgICAvLyBHZXQgdGhlIGJpdG1hcCBmb3IgdGhlIGdseXBoCisgICAgcGFpbnQtPmZpbmRJbWFnZShza2lhR2x5cGgpOworICAgIGdseXBoLT5tSXNWYWxpZCA9IG1TdGF0ZS0+Y2FjaGVCaXRtYXAoc2tpYUdseXBoLCAmc3RhcnRYLCAmc3RhcnRZKTsKKworICAgIGlmICghZ2x5cGgtPm1Jc1ZhbGlkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50MzJfdCBlbmRYID0gc3RhcnRYICsgc2tpYUdseXBoLmZXaWR0aDsKKyAgICB1aW50MzJfdCBlbmRZID0gc3RhcnRZICsgc2tpYUdseXBoLmZIZWlnaHQ7CisKKyAgICBnbHlwaC0+bVN0YXJ0WCA9IHN0YXJ0WDsKKyAgICBnbHlwaC0+bVN0YXJ0WSA9IHN0YXJ0WTsKKyAgICBnbHlwaC0+bUJpdG1hcFdpZHRoID0gc2tpYUdseXBoLmZXaWR0aDsKKyAgICBnbHlwaC0+bUJpdG1hcEhlaWdodCA9IHNraWFHbHlwaC5mSGVpZ2h0OworCisgICAgdWludDMyX3QgY2FjaGVXaWR0aCA9IG1TdGF0ZS0+Z2V0Q2FjaGVXaWR0aCgpOworICAgIHVpbnQzMl90IGNhY2hlSGVpZ2h0ID0gbVN0YXRlLT5nZXRDYWNoZUhlaWdodCgpOworCisgICAgZ2x5cGgtPm1CaXRtYXBNaW5VID0gKGZsb2F0KSBzdGFydFggLyAoZmxvYXQpIGNhY2hlV2lkdGg7CisgICAgZ2x5cGgtPm1CaXRtYXBNaW5WID0gKGZsb2F0KSBzdGFydFkgLyAoZmxvYXQpIGNhY2hlSGVpZ2h0OworICAgIGdseXBoLT5tQml0bWFwTWF4VSA9IChmbG9hdCkgZW5kWCAvIChmbG9hdCkgY2FjaGVXaWR0aDsKKyAgICBnbHlwaC0+bUJpdG1hcE1heFYgPSAoZmxvYXQpIGVuZFkgLyAoZmxvYXQpIGNhY2hlSGVpZ2h0OworCisgICAgbVN0YXRlLT5tVXBsb2FkVGV4dHVyZSA9IHRydWU7Cit9CisKK0ZvbnQ6OkNhY2hlZEdseXBoSW5mbyogRm9udDo6Y2FjaGVHbHlwaChTa1BhaW50KiBwYWludCwgaW50MzJfdCBnbHlwaCkgeworICAgIENhY2hlZEdseXBoSW5mbyogbmV3R2x5cGggPSBuZXcgQ2FjaGVkR2x5cGhJbmZvKCk7CisgICAgbUNhY2hlZEdseXBocy5hZGQoZ2x5cGgsIG5ld0dseXBoKTsKKworICAgIGNvbnN0IFNrR2x5cGgmIHNraWFHbHlwaCA9IHBhaW50LT5nZXRVbmljaGFyTWV0cmljcyhnbHlwaCk7CisgICAgbmV3R2x5cGgtPm1HbHlwaEluZGV4ID0gc2tpYUdseXBoLmZJRDsKKyAgICBuZXdHbHlwaC0+bUlzVmFsaWQgPSBmYWxzZTsKKworICAgIHVwZGF0ZUdseXBoQ2FjaGUocGFpbnQsIHNraWFHbHlwaCwgbmV3R2x5cGgpOworCisgICAgcmV0dXJuIG5ld0dseXBoOworfQorCitGb250KiBGb250OjpjcmVhdGUoRm9udFJlbmRlcmVyKiBzdGF0ZSwgdWludDMyX3QgZm9udElkLCBmbG9hdCBmb250U2l6ZSkgeworICAgIFZlY3RvcjxGb250Kj4gJmFjdGl2ZUZvbnRzID0gc3RhdGUtPm1BY3RpdmVGb250czsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhY3RpdmVGb250cy5zaXplKCk7IGkrKykgeworICAgICAgICBGb250KiBmb250ID0gYWN0aXZlRm9udHNbaV07CisgICAgICAgIGlmIChmb250LT5tRm9udElkID09IGZvbnRJZCAmJiBmb250LT5tRm9udFNpemUgPT0gZm9udFNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBmb250OworICAgICAgICB9CisgICAgfQorCisgICAgRm9udCogbmV3Rm9udCA9IG5ldyBGb250KHN0YXRlLCBmb250SWQsIGZvbnRTaXplKTsKKyAgICBhY3RpdmVGb250cy5wdXNoKG5ld0ZvbnQpOworICAgIHJldHVybiBuZXdGb250OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGb250UmVuZGVyZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworRm9udFJlbmRlcmVyOjpGb250UmVuZGVyZXIoKSB7CisgICAgTE9HRCgiQ3JlYXRpbmcgRm9udFJlbmRlcmVyIik7CisKKyAgICBtR2FtbWFUYWJsZSA9IE5VTEw7CisgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgbU1heE51bWJlck9mUXVhZHMgPSAxMDI0OworICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICBtVGV4dHVyZUlkID0gMDsKKworICAgIG1UZXh0TWVzaFB0ciA9IE5VTEw7CisgICAgbVRleHRUZXh0dXJlID0gTlVMTDsKKworICAgIG1JbmRleEJ1ZmZlcklEID0gMDsKKworICAgIG1DYWNoZVdpZHRoID0gREVGQVVMVF9URVhUX0NBQ0hFX1dJRFRIOworICAgIG1DYWNoZUhlaWdodCA9IERFRkFVTFRfVEVYVF9DQUNIRV9IRUlHSFQ7CisKKyAgICBjaGFyIHByb3BlcnR5W1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9URVhUX0NBQ0hFX1dJRFRILCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyB0ZXh0IGNhY2hlIHdpZHRoIHRvICVzIHBpeGVscyIsIHByb3BlcnR5KTsKKyAgICAgICAgbUNhY2hlV2lkdGggPSBhdG9pKHByb3BlcnR5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCIgIFVzaW5nIGRlZmF1bHQgdGV4dCBjYWNoZSB3aWR0aCBvZiAlaSBwaXhlbHMiLCBtQ2FjaGVXaWR0aCk7CisgICAgfQorCisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9URVhUX0NBQ0hFX0hFSUdIVCwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgdGV4dCBjYWNoZSB3aWR0aCB0byAlcyBwaXhlbHMiLCBwcm9wZXJ0eSk7CisgICAgICAgIG1DYWNoZUhlaWdodCA9IGF0b2kocHJvcGVydHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCB0ZXh0IGNhY2hlIGhlaWdodCBvZiAlaSBwaXhlbHMiLCBtQ2FjaGVIZWlnaHQpOworICAgIH0KK30KKworRm9udFJlbmRlcmVyOjp+Rm9udFJlbmRlcmVyKCkgeworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkrKykgeworICAgICAgICBkZWxldGUgbUNhY2hlTGluZXNbaV07CisgICAgfQorICAgIG1DYWNoZUxpbmVzLmNsZWFyKCk7CisKKyAgICBpZiAobUluaXRpYWxpemVkKSB7CisgICAgICAgIGRlbGV0ZVtdIG1UZXh0TWVzaFB0cjsKKyAgICAgICAgZGVsZXRlW10gbVRleHRUZXh0dXJlOworICAgIH0KKworICAgIGlmIChtVGV4dHVyZUlkKSB7CisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJm1UZXh0dXJlSWQpOworICAgIH0KKworICAgIFZlY3RvcjxGb250Kj4gZm9udHNUb0RlcmVmZXJlbmNlID0gbUFjdGl2ZUZvbnRzOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBmb250c1RvRGVyZWZlcmVuY2Uuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZGVsZXRlIGZvbnRzVG9EZXJlZmVyZW5jZVtpXTsKKyAgICB9Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjpmbHVzaEFsbEFuZEludmFsaWRhdGUoKSB7CisgICAgaWYgKG1DdXJyZW50UXVhZEluZGV4ICE9IDApIHsKKyAgICAgICAgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgICAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQWN0aXZlRm9udHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUFjdGl2ZUZvbnRzW2ldLT5pbnZhbGlkYXRlVGV4dHVyZUNhY2hlKCk7CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkrKykgeworICAgICAgICBtQ2FjaGVMaW5lc1tpXS0+bUN1cnJlbnRDb2wgPSAwOworICAgIH0KK30KKworYm9vbCBGb250UmVuZGVyZXI6OmNhY2hlQml0bWFwKGNvbnN0IFNrR2x5cGgmIGdseXBoLCB1aW50MzJfdCogcmV0T3JpZ2luWCwgdWludDMyX3QqIHJldE9yaWdpblkpIHsKKyAgICAvLyBJZiB0aGUgZ2x5cGggaXMgdG9vIHRhbGwsIGRvbid0IGNhY2hlIGl0CisgICAgaWYgKGdseXBoLmZIZWlnaHQgPiBtQ2FjaGVMaW5lc1ttQ2FjaGVMaW5lcy5zaXplKCkgLSAxXS0+bU1heEhlaWdodCkgeworICAgICAgICBMT0dFKCJGb250IHNpemUgdG8gbGFyZ2UgdG8gZml0IGluIGNhY2hlLiB3aWR0aCwgaGVpZ2h0ID0gJWksICVpIiwKKyAgICAgICAgICAgICAgICAoaW50KSBnbHlwaC5mV2lkdGgsIChpbnQpIGdseXBoLmZIZWlnaHQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTm93IGNvcHkgdGhlIGJpdG1hcCBpbnRvIHRoZSBjYWNoZSB0ZXh0dXJlCisgICAgdWludDMyX3Qgc3RhcnRYID0gMDsKKyAgICB1aW50MzJfdCBzdGFydFkgPSAwOworCisgICAgYm9vbCBiaXRtYXBGaXQgPSBmYWxzZTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYml0bWFwRml0ID0gbUNhY2hlTGluZXNbaV0tPmZpdEJpdG1hcChnbHlwaCwgJnN0YXJ0WCwgJnN0YXJ0WSk7CisgICAgICAgIGlmIChiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlIG5ldyBnbHlwaCBkaWRuJ3QgZml0LCBmbHVzaCB0aGUgc3RhdGUgc28gZmFyIGFuZCBpbnZhbGlkYXRlIGV2ZXJ5dGhpbmcKKyAgICBpZiAoIWJpdG1hcEZpdCkgeworICAgICAgICBmbHVzaEFsbEFuZEludmFsaWRhdGUoKTsKKworICAgICAgICAvLyBUcnkgdG8gZml0IGl0IGFnYWluCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgYml0bWFwRml0ID0gbUNhY2hlTGluZXNbaV0tPmZpdEJpdG1hcChnbHlwaCwgJnN0YXJ0WCwgJnN0YXJ0WSk7CisgICAgICAgICAgICBpZiAoYml0bWFwRml0KSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB3ZSBzdGlsbCBkb24ndCBmaXQsIHNvbWV0aGluZyBpcyB3cm9uZyBhbmQgd2Ugc2hvdWxkbid0IGRyYXcKKyAgICAgICAgaWYgKCFiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgIExPR0UoIkJpdG1hcCBkb2Vzbid0IGZpdCBpbiBjYWNoZS4gd2lkdGgsIGhlaWdodCA9ICVpLCAlaSIsCisgICAgICAgICAgICAgICAgICAgIChpbnQpIGdseXBoLmZXaWR0aCwgKGludCkgZ2x5cGguZkhlaWdodCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqcmV0T3JpZ2luWCA9IHN0YXJ0WDsKKyAgICAqcmV0T3JpZ2luWSA9IHN0YXJ0WTsKKworICAgIHVpbnQzMl90IGVuZFggPSBzdGFydFggKyBnbHlwaC5mV2lkdGg7CisgICAgdWludDMyX3QgZW5kWSA9IHN0YXJ0WSArIGdseXBoLmZIZWlnaHQ7CisKKyAgICB1aW50MzJfdCBjYWNoZVdpZHRoID0gbUNhY2hlV2lkdGg7CisKKyAgICB1aW50OF90KiBjYWNoZUJ1ZmZlciA9IG1UZXh0VGV4dHVyZTsKKyAgICB1aW50OF90KiBiaXRtYXBCdWZmZXIgPSAodWludDhfdCopIGdseXBoLmZJbWFnZTsKKyAgICB1bnNpZ25lZCBpbnQgc3RyaWRlID0gZ2x5cGgucm93Qnl0ZXMoKTsKKworICAgIHVpbnQzMl90IGNhY2hlWCA9IDAsIGJYID0gMCwgY2FjaGVZID0gMCwgYlkgPSAwOworICAgIGZvciAoY2FjaGVYID0gc3RhcnRYLCBiWCA9IDA7IGNhY2hlWCA8IGVuZFg7IGNhY2hlWCsrLCBiWCsrKSB7CisgICAgICAgIGZvciAoY2FjaGVZID0gc3RhcnRZLCBiWSA9IDA7IGNhY2hlWSA8IGVuZFk7IGNhY2hlWSsrLCBiWSsrKSB7CisgICAgICAgICAgICB1aW50OF90IHRlbXBDb2wgPSBiaXRtYXBCdWZmZXJbYlkgKiBzdHJpZGUgKyBiWF07CisgICAgICAgICAgICBjYWNoZUJ1ZmZlcltjYWNoZVkgKiBjYWNoZVdpZHRoICsgY2FjaGVYXSA9IG1HYW1tYVRhYmxlW3RlbXBDb2xdOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjppbml0VGV4dFRleHR1cmUoKSB7CisgICAgbVRleHRUZXh0dXJlID0gbmV3IHVpbnQ4X3RbbUNhY2hlV2lkdGggKiBtQ2FjaGVIZWlnaHRdOworICAgIG1lbXNldChtVGV4dFRleHR1cmUsIDAsIG1DYWNoZVdpZHRoICogbUNhY2hlSGVpZ2h0ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKworICAgIG1VcGxvYWRUZXh0dXJlID0gZmFsc2U7CisKKyAgICBnbEdlblRleHR1cmVzKDEsICZtVGV4dHVyZUlkKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1UZXh0dXJlSWQpOworICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgMSk7CisgICAgLy8gSW5pdGlhbGl6ZSB0ZXh0dXJlIGRpbWVudGlvbnMKKyAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfQUxQSEEsIG1DYWNoZVdpZHRoLCBtQ2FjaGVIZWlnaHQsIDAsCisgICAgICAgICAgICBHTF9BTFBIQSwgR0xfVU5TSUdORURfQllURSwgMCk7CisKKyAgICBtTGluZWFyRmlsdGVyaW5nID0gZmFsc2U7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7CisKKyAgICAvLyBTcGxpdCB1cCBvdXIgY2FjaGUgdGV4dHVyZSBpbnRvIGxpbmVzIG9mIGNlcnRhaW4gd2lkdGhzCisgICAgaW50IG5leHRMaW5lID0gMDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKG1DYWNoZVdpZHRoLCAxOCwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKG1DYWNoZVdpZHRoLCAyNiwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKG1DYWNoZVdpZHRoLCAyNiwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKG1DYWNoZVdpZHRoLCAzNCwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKG1DYWNoZVdpZHRoLCAzNCwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKG1DYWNoZVdpZHRoLCA0MiwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKG1DYWNoZVdpZHRoLCBtQ2FjaGVIZWlnaHQgLSBuZXh0TGluZSwgbmV4dExpbmUsIDApKTsKK30KKworLy8gQXZvaWQgaGF2aW5nIHRvIHJlYWxsb2NhdGUgbWVtb3J5IGFuZCByZW5kZXIgcXVhZCBieSBxdWFkCit2b2lkIEZvbnRSZW5kZXJlcjo6aW5pdFZlcnRleEFycmF5QnVmZmVycygpIHsKKyAgICB1aW50MzJfdCBudW1JbmRpY2llcyA9IG1NYXhOdW1iZXJPZlF1YWRzICogNjsKKyAgICB1aW50MzJfdCBpbmRleEJ1ZmZlclNpemVCeXRlcyA9IG51bUluZGljaWVzICogc2l6ZW9mKHVpbnQxNl90KTsKKyAgICB1aW50MTZfdCogaW5kZXhCdWZmZXJEYXRhID0gKHVpbnQxNl90KikgbWFsbG9jKGluZGV4QnVmZmVyU2l6ZUJ5dGVzKTsKKworICAgIC8vIEZvdXIgdmVydHMsIHR3byB0cmlhbmdsZXMgLCBzaXggaW5kaWNlcyBwZXIgcXVhZAorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtTWF4TnVtYmVyT2ZRdWFkczsgaSsrKSB7CisgICAgICAgIGludCBpNiA9IGkgKiA2OworICAgICAgICBpbnQgaTQgPSBpICogNDsKKworICAgICAgICBpbmRleEJ1ZmZlckRhdGFbaTYgKyAwXSA9IGk0ICsgMDsKKyAgICAgICAgaW5kZXhCdWZmZXJEYXRhW2k2ICsgMV0gPSBpNCArIDE7CisgICAgICAgIGluZGV4QnVmZmVyRGF0YVtpNiArIDJdID0gaTQgKyAyOworCisgICAgICAgIGluZGV4QnVmZmVyRGF0YVtpNiArIDNdID0gaTQgKyAwOworICAgICAgICBpbmRleEJ1ZmZlckRhdGFbaTYgKyA0XSA9IGk0ICsgMjsKKyAgICAgICAgaW5kZXhCdWZmZXJEYXRhW2k2ICsgNV0gPSBpNCArIDM7CisgICAgfQorCisgICAgZ2xHZW5CdWZmZXJzKDEsICZtSW5kZXhCdWZmZXJJRCk7CisgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbUluZGV4QnVmZmVySUQpOworICAgIGdsQnVmZmVyRGF0YShHTF9BUlJBWV9CVUZGRVIsIGluZGV4QnVmZmVyU2l6ZUJ5dGVzLCBpbmRleEJ1ZmZlckRhdGEsIEdMX0RZTkFNSUNfRFJBVyk7CisgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgMCk7CisKKyAgICBmcmVlKGluZGV4QnVmZmVyRGF0YSk7CisKKyAgICB1aW50MzJfdCBjb29yZFNpemUgPSAzOworICAgIHVpbnQzMl90IHV2U2l6ZSA9IDI7CisgICAgdWludDMyX3QgdmVydHNQZXJRdWFkID0gNDsKKyAgICB1aW50MzJfdCB2ZXJ0ZXhCdWZmZXJTaXplID0gbU1heE51bWJlck9mUXVhZHMgKiB2ZXJ0c1BlclF1YWQgKiBjb29yZFNpemUgKiB1dlNpemU7CisgICAgbVRleHRNZXNoUHRyID0gbmV3IGZsb2F0W3ZlcnRleEJ1ZmZlclNpemVdOworfQorCisvLyBXZSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIGFueXRoaW5nIHVubGVzcyB3ZSBhY3R1YWxseSBkcmF3IHRleHQKK3ZvaWQgRm9udFJlbmRlcmVyOjpjaGVja0luaXQoKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW5pdFRleHRUZXh0dXJlKCk7CisgICAgaW5pdFZlcnRleEFycmF5QnVmZmVycygpOworCisgICAgLy8gV2Ugc3RvcmUgYSBzdHJpbmcgd2l0aCBsZXR0ZXJzIGluIGEgcm91Z2ggZnJlcXVlbmN5IG9mIG9jY3VycmVuY2UKKyAgICBtTGF0aW5QcmVjYWNoZSA9IFN0cmluZzE2KCJlaXNhcm50b2xjZHVncG1oYnlmdmt3enhqcSAiKTsKKyAgICBtTGF0aW5QcmVjYWNoZSArPSBTdHJpbmcxNigiRUlTQVJOVE9MQ0RVR1BNSEJZRlZLV1pYSlEiKTsKKyAgICBtTGF0aW5QcmVjYWNoZSArPSBTdHJpbmcxNigiLC4/ISgpLStAOzpgJyIpOworICAgIG1MYXRpblByZWNhY2hlICs9IFN0cmluZzE2KCIwMTIzNDU2Nzg5Iik7CisKKyAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6Y2hlY2tUZXh0dXJlVXBkYXRlKCkgeworICAgIGlmICghbVVwbG9hZFRleHR1cmUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbVRleHR1cmVJZCk7CisKKyAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBjYWNoZSBsaW5lcyBhbmQgc2VlIHdoaWNoIG9uZXMgbmVlZCB0byBiZSB1cGRhdGVkCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIENhY2hlVGV4dHVyZUxpbmUqIGNsID0gbUNhY2hlTGluZXNbaV07CisgICAgICAgIGlmKGNsLT5tRGlydHkpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHhPZmZzZXQgPSAwOworICAgICAgICAgICAgdWludDMyX3QgeU9mZnNldCA9IGNsLT5tQ3VycmVudFJvdzsKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoICAgPSBtQ2FjaGVXaWR0aDsKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCAgPSBjbC0+bU1heEhlaWdodDsKKyAgICAgICAgICAgIHZvaWQqIHRleHR1cmVEYXRhID0gbVRleHRUZXh0dXJlICsgeU9mZnNldCp3aWR0aDsKKworICAgICAgICAgICAgZ2xUZXhTdWJJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIHhPZmZzZXQsIHlPZmZzZXQsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIEdMX0FMUEhBLCBHTF9VTlNJR05FRF9CWVRFLCB0ZXh0dXJlRGF0YSk7CisKKyAgICAgICAgICAgIGNsLT5tRGlydHkgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1VcGxvYWRUZXh0dXJlID0gZmFsc2U7Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjppc3N1ZURyYXdDb21tYW5kKCkgeworICAgIGNoZWNrVGV4dHVyZVVwZGF0ZSgpOworCisgICAgZmxvYXQqIHZ0eCA9IG1UZXh0TWVzaFB0cjsKKyAgICBmbG9hdCogdGV4ID0gdnR4ICsgMzsKKworICAgIC8vIHBvc2l0aW9uIGlzIHNsb3QgMAorICAgIHVpbnQzMl90IHNsb3QgPSAwOworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihzbG90LCAzLCBHTF9GTE9BVCwgZmFsc2UsIDIwLCB2dHgpOworCisgICAgLy8gdGV4dHVyZTAgaXMgc2xvdCAxCisgICAgc2xvdCA9IDE7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKHNsb3QsIDIsIEdMX0ZMT0FULCBmYWxzZSwgMjAsIHRleCk7CisKKyAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1JbmRleEJ1ZmZlcklEKTsKKyAgICBnbERyYXdFbGVtZW50cyhHTF9UUklBTkdMRVMsIG1DdXJyZW50UXVhZEluZGV4ICogNiwgR0xfVU5TSUdORURfU0hPUlQsIE5VTEwpOworfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6YXBwZW5kTWVzaFF1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgdTEsIGZsb2F0IHYxLCBmbG9hdCB4MiwKKyAgICAgICAgZmxvYXQgeTIsIGZsb2F0IHoyLCBmbG9hdCB1MiwgZmxvYXQgdjIsIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsIGZsb2F0IHUzLCBmbG9hdCB2MywKKyAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCwgZmxvYXQgdTQsIGZsb2F0IHY0KSB7CisgICAgaWYgKHgxID4gbUNsaXAtPnJpZ2h0IHx8IHkxIDwgbUNsaXAtPnRvcCB8fCB4MiA8IG1DbGlwLT5sZWZ0IHx8IHk0ID4gbUNsaXAtPmJvdHRvbSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgdWludDMyX3QgdmVydHNQZXJRdWFkID0gNDsKKyAgICBjb25zdCB1aW50MzJfdCBmbG9hdHNQZXJWZXJ0ID0gNTsKKyAgICBmbG9hdCogY3VycmVudFBvcyA9IG1UZXh0TWVzaFB0ciArIG1DdXJyZW50UXVhZEluZGV4ICogdmVydHNQZXJRdWFkICogZmxvYXRzUGVyVmVydDsKKworICAgICgqY3VycmVudFBvcysrKSA9IHgxOworICAgICgqY3VycmVudFBvcysrKSA9IHkxOworICAgICgqY3VycmVudFBvcysrKSA9IHoxOworICAgICgqY3VycmVudFBvcysrKSA9IHUxOworICAgICgqY3VycmVudFBvcysrKSA9IHYxOworCisgICAgKCpjdXJyZW50UG9zKyspID0geDI7CisgICAgKCpjdXJyZW50UG9zKyspID0geTI7CisgICAgKCpjdXJyZW50UG9zKyspID0gejI7CisgICAgKCpjdXJyZW50UG9zKyspID0gdTI7CisgICAgKCpjdXJyZW50UG9zKyspID0gdjI7CisKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB4MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB5MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB6MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB1MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB2MzsKKworICAgICgqY3VycmVudFBvcysrKSA9IHg0OworICAgICgqY3VycmVudFBvcysrKSA9IHk0OworICAgICgqY3VycmVudFBvcysrKSA9IHo0OworICAgICgqY3VycmVudFBvcysrKSA9IHU0OworICAgICgqY3VycmVudFBvcysrKSA9IHY0OworCisgICAgbUN1cnJlbnRRdWFkSW5kZXgrKzsKKworICAgIGlmIChtQ3VycmVudFF1YWRJbmRleCA9PSBtTWF4TnVtYmVyT2ZRdWFkcykgeworICAgICAgICBpc3N1ZURyYXdDb21tYW5kKCk7CisgICAgICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICB9Cit9CisKK3VpbnQzMl90IEZvbnRSZW5kZXJlcjo6Z2V0UmVtYWluaW5nQ2FjaGVDYXBhY2l0eSgpIHsKKyAgICB1aW50MzJfdCByZW1haW5pbmdDYXBhY2l0eSA9IDA7CisgICAgZmxvYXQgdG90YWxQaXhlbHMgPSAwOworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSArKykgeworICAgICAgICAgcmVtYWluaW5nQ2FwYWNpdHkgKz0gKG1DYWNoZUxpbmVzW2ldLT5tTWF4V2lkdGggLSBtQ2FjaGVMaW5lc1tpXS0+bUN1cnJlbnRDb2wpOworICAgICAgICAgdG90YWxQaXhlbHMgKz0gbUNhY2hlTGluZXNbaV0tPm1NYXhXaWR0aDsKKyAgICB9CisgICAgcmVtYWluaW5nQ2FwYWNpdHkgPSAocmVtYWluaW5nQ2FwYWNpdHkgKiAxMDApIC8gdG90YWxQaXhlbHM7CisgICAgcmV0dXJuIHJlbWFpbmluZ0NhcGFjaXR5OworfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6cHJlY2FjaGVMYXRpbihTa1BhaW50KiBwYWludCkgeworICAgIC8vIFJlbWFpbmluZyBjYXBhY2l0eSBpcyBtZWFzdXJlZCBpbiAlCisgICAgdWludDMyX3QgcmVtYWluaW5nQ2FwYWNpdHkgPSBnZXRSZW1haW5pbmdDYWNoZUNhcGFjaXR5KCk7CisgICAgdWludDMyX3QgcHJlY2FjaGVJZHggPSAwOworICAgIHdoaWxlKHJlbWFpbmluZ0NhcGFjaXR5ID4gMjUgJiYgcHJlY2FjaGVJZHggPCBtTGF0aW5QcmVjYWNoZS5zaXplKCkpIHsKKyAgICAgICAgbUN1cnJlbnRGb250LT5nZXRDYWNoZWRVVEZDaGFyKHBhaW50LCAoaW50MzJfdCltTGF0aW5QcmVjYWNoZVtwcmVjYWNoZUlkeF0pOworICAgICAgICByZW1haW5pbmdDYXBhY2l0eSA9IGdldFJlbWFpbmluZ0NhY2hlQ2FwYWNpdHkoKTsKKyAgICAgICAgcHJlY2FjaGVJZHggKys7CisgICAgfQorfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6c2V0Rm9udChTa1BhaW50KiBwYWludCwgdWludDMyX3QgZm9udElkLCBmbG9hdCBmb250U2l6ZSkgeworICAgIHVpbnQzMl90IGN1cnJlbnROdW1Gb250cyA9IG1BY3RpdmVGb250cy5zaXplKCk7CisgICAgbUN1cnJlbnRGb250ID0gRm9udDo6Y3JlYXRlKHRoaXMsIGZvbnRJZCwgZm9udFNpemUpOworCisgICAgY29uc3QgZmxvYXQgbWF4UHJlY2FjaGVGb250U2l6ZSA9IDQwLjBmOworICAgIGJvb2wgaXNOZXdGb250ID0gY3VycmVudE51bUZvbnRzICE9IG1BY3RpdmVGb250cy5zaXplKCk7CisKKyAgICBpZiAoaXNOZXdGb250ICYmIGZvbnRTaXplIDw9IG1heFByZWNhY2hlRm9udFNpemUpIHsKKyAgICAgICAgcHJlY2FjaGVMYXRpbihwYWludCk7CisgICAgfQorfQorCitGb250UmVuZGVyZXI6OkRyb3BTaGFkb3cgRm9udFJlbmRlcmVyOjpyZW5kZXJEcm9wU2hhZG93KFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyICp0ZXh0LAorICAgICAgICB1aW50MzJfdCBzdGFydEluZGV4LCB1aW50MzJfdCBsZW4sIGludCBudW1HbHlwaHMsIHVpbnQzMl90IHJhZGl1cykgeworICAgIGNoZWNrSW5pdCgpOworCisgICAgaWYgKCFtQ3VycmVudEZvbnQpIHsKKyAgICAgICAgRHJvcFNoYWRvdyBpbWFnZTsKKyAgICAgICAgaW1hZ2Uud2lkdGggPSAwOworICAgICAgICBpbWFnZS5oZWlnaHQgPSAwOworICAgICAgICBpbWFnZS5pbWFnZSA9IE5VTEw7CisgICAgICAgIGltYWdlLnBlblggPSAwOworICAgICAgICBpbWFnZS5wZW5ZID0gMDsKKyAgICAgICAgcmV0dXJuIGltYWdlOworICAgIH0KKworICAgIFJlY3QgYm91bmRzOworICAgIG1DdXJyZW50Rm9udC0+bWVhc3VyZVVURihwYWludCwgdGV4dCwgc3RhcnRJbmRleCwgbGVuLCBudW1HbHlwaHMsICZib3VuZHMpOworICAgIHVpbnQzMl90IHBhZGRlZFdpZHRoID0gKHVpbnQzMl90KSAoYm91bmRzLnJpZ2h0IC0gYm91bmRzLmxlZnQpICsgMiAqIHJhZGl1czsKKyAgICB1aW50MzJfdCBwYWRkZWRIZWlnaHQgPSAodWludDMyX3QpIChib3VuZHMudG9wIC0gYm91bmRzLmJvdHRvbSkgKyAyICogcmFkaXVzOworICAgIHVpbnQ4X3QqIGRhdGFCdWZmZXIgPSBuZXcgdWludDhfdFtwYWRkZWRXaWR0aCAqIHBhZGRlZEhlaWdodF07CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBhZGRlZFdpZHRoICogcGFkZGVkSGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZGF0YUJ1ZmZlcltpXSA9IDA7CisgICAgfQorCisgICAgaW50IHBlblggPSByYWRpdXMgLSBib3VuZHMubGVmdDsKKyAgICBpbnQgcGVuWSA9IHJhZGl1cyAtIGJvdW5kcy5ib3R0b207CisKKyAgICBtQ3VycmVudEZvbnQtPnJlbmRlclVURihwYWludCwgdGV4dCwgc3RhcnRJbmRleCwgbGVuLCBudW1HbHlwaHMsIHBlblgsIHBlblksCisgICAgICAgICAgICBkYXRhQnVmZmVyLCBwYWRkZWRXaWR0aCwgcGFkZGVkSGVpZ2h0KTsKKyAgICBibHVySW1hZ2UoZGF0YUJ1ZmZlciwgcGFkZGVkV2lkdGgsIHBhZGRlZEhlaWdodCwgcmFkaXVzKTsKKworICAgIERyb3BTaGFkb3cgaW1hZ2U7CisgICAgaW1hZ2Uud2lkdGggPSBwYWRkZWRXaWR0aDsKKyAgICBpbWFnZS5oZWlnaHQgPSBwYWRkZWRIZWlnaHQ7CisgICAgaW1hZ2UuaW1hZ2UgPSBkYXRhQnVmZmVyOworICAgIGltYWdlLnBlblggPSBwZW5YOworICAgIGltYWdlLnBlblkgPSBwZW5ZOworICAgIHJldHVybiBpbWFnZTsKK30KKwordm9pZCBGb250UmVuZGVyZXI6OnJlbmRlclRleHQoU2tQYWludCogcGFpbnQsIGNvbnN0IFJlY3QqIGNsaXAsIGNvbnN0IGNoYXIgKnRleHQsCisgICAgICAgIHVpbnQzMl90IHN0YXJ0SW5kZXgsIHVpbnQzMl90IGxlbiwgaW50IG51bUdseXBocywgaW50IHgsIGludCB5KSB7CisgICAgY2hlY2tJbml0KCk7CisKKyAgICBpZiAoIW1DdXJyZW50Rm9udCkgeworICAgICAgICBMT0dFKCJObyBmb250IHNldCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUNsaXAgPSBjbGlwOworICAgIG1DdXJyZW50Rm9udC0+cmVuZGVyVVRGKHBhaW50LCB0ZXh0LCBzdGFydEluZGV4LCBsZW4sIG51bUdseXBocywgeCwgeSk7CisKKyAgICBpZiAobUN1cnJlbnRRdWFkSW5kZXggIT0gMCkgeworICAgICAgICBpc3N1ZURyYXdDb21tYW5kKCk7CisgICAgICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjpjb21wdXRlR2F1c3NpYW5XZWlnaHRzKGZsb2F0KiB3ZWlnaHRzLCBpbnQzMl90IHJhZGl1cykgeworICAgIC8vIENvbXB1dGUgZ2F1c3NpYW4gd2VpZ2h0cyBmb3IgdGhlIGJsdXIKKyAgICAvLyBlIGlzIHRoZSBldWxlcidzIG51bWJlcgorICAgIGZsb2F0IGUgPSAyLjcxODI4MTgyODQ1OTA0NWY7CisgICAgZmxvYXQgcGkgPSAzLjE0MTU5MjY1MzU4OTc5MzJmOworICAgIC8vIGcoeCkgPSAoIDEgLyBzcXJ0KCAyICogcGkgKSAqIHNpZ21hKSAqIGUgXiAoIC14XjIgLyAyICogc2lnbWFeMiApCisgICAgLy8geCBpcyBvZiB0aGUgZm9ybSBbLXJhZGl1cyAuLiAwIC4uIHJhZGl1c10KKyAgICAvLyBhbmQgc2lnbWEgdmFyaWVzIHdpdGggcmFkaXVzLgorICAgIC8vIEJhc2VkIG9uIHNvbWUgZXhwZXJpbWVudGFsIHJhZGl1cyB2YWx1ZXMgYW5kIHNpZ21hJ3MKKyAgICAvLyB3ZSBhcHByb3hpbWF0ZWx5IGZpdCBzaWdtYSA9IGYocmFkaXVzKSBhcworICAgIC8vIHNpZ21hID0gcmFkaXVzICogMC4zICArIDAuNgorICAgIC8vIFRoZSBsYXJnZXIgdGhlIHJhZGl1cyBnZXRzLCB0aGUgbW9yZSBvdXIgZ2F1c3NpYW4gYmx1cgorICAgIC8vIHdpbGwgcmVzZW1ibGUgYSBib3ggYmx1ciBzaW5jZSB3aXRoIGxhcmdlIHNpZ21hCisgICAgLy8gdGhlIGdhdXNzaWFuIGN1cnZlIGJlZ2lucyB0byBsb3NlIGl0cyBzaGFwZQorICAgIGZsb2F0IHNpZ21hID0gMC4zZiAqIChmbG9hdClyYWRpdXMgKyAwLjZmOworCisgICAgLy8gTm93IGNvbXB1dGUgdGhlIGNvZWZmaWNpbnRzCisgICAgLy8gV2Ugd2lsbCBzdG9yZSBzb21lIHJlZHVuZGFudCB2YWx1ZXMgdG8gc2F2ZSBzb21lIG1hdGggZHVyaW5nCisgICAgLy8gdGhlIGJsdXIgY2FsY3VsYXRpb25zCisgICAgLy8gcHJlY29tcHV0ZSBzb21lIHZhbHVlcworICAgIGZsb2F0IGNvZWZmMSA9IDEuMGYgLyAoc3FydCggMi4wZiAqIHBpICkgKiBzaWdtYSk7CisgICAgZmxvYXQgY29lZmYyID0gLSAxLjBmIC8gKDIuMGYgKiBzaWdtYSAqIHNpZ21hKTsKKworICAgIGZsb2F0IG5vcm1hbGl6ZUZhY3RvciA9IDAuMGY7CisgICAgZm9yKGludDMyX3QgciA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgIGZsb2F0IGZsb2F0UiA9IChmbG9hdCkgcjsKKyAgICAgICAgd2VpZ2h0c1tyICsgcmFkaXVzXSA9IGNvZWZmMSAqIHBvdyhlLCBmbG9hdFIgKiBmbG9hdFIgKiBjb2VmZjIpOworICAgICAgICBub3JtYWxpemVGYWN0b3IgKz0gd2VpZ2h0c1tyICsgcmFkaXVzXTsKKyAgICB9CisKKyAgICAvL05vdyB3ZSBuZWVkIHRvIG5vcm1hbGl6ZSB0aGUgd2VpZ2h0cyBiZWNhdXNlIGFsbCBvdXIgY29lZmZpY2llbnRzIG5lZWQgdG8gYWRkIHVwIHRvIG9uZQorICAgIG5vcm1hbGl6ZUZhY3RvciA9IDEuMGYgLyBub3JtYWxpemVGYWN0b3I7CisgICAgZm9yKGludDMyX3QgciA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgIHdlaWdodHNbciArIHJhZGl1c10gKj0gbm9ybWFsaXplRmFjdG9yOworICAgIH0KK30KKwordm9pZCBGb250UmVuZGVyZXI6Omhvcml6b250YWxCbHVyKGZsb2F0KiB3ZWlnaHRzLCBpbnQzMl90IHJhZGl1cywKKyAgICAgICAgY29uc3QgdWludDhfdCogc291cmNlLCB1aW50OF90KiBkZXN0LCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgIGZsb2F0IGJsdXJyZWRQaXhlbCA9IDAuMGY7CisgICAgZmxvYXQgY3VycmVudFBpeGVsID0gMC4wZjsKKworICAgIGZvcihpbnQzMl90IHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICsrKSB7CisKKyAgICAgICAgY29uc3QgdWludDhfdCogaW5wdXQgPSBzb3VyY2UgKyB5ICogd2lkdGg7CisgICAgICAgIHVpbnQ4X3QqIG91dHB1dCA9IGRlc3QgKyB5ICogd2lkdGg7CisKKyAgICAgICAgZm9yKGludDMyX3QgeCA9IDA7IHggPCB3aWR0aDsgeCArKykgeworICAgICAgICAgICAgYmx1cnJlZFBpeGVsID0gMC4wZjsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBnUHRyID0gd2VpZ2h0czsKKyAgICAgICAgICAgIC8vIE9wdGltaXphdGlvbiBmb3Igbm9uLWJvcmRlciBwaXhlbHMKKyAgICAgICAgICAgIGlmICgoeCA+IHJhZGl1cykgJiYgKHggPCAod2lkdGggLSByYWRpdXMpKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmkgPSBpbnB1dCArICh4IC0gcmFkaXVzKTsKKyAgICAgICAgICAgICAgICBmb3IoaW50IHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGl4ZWwgPSAoZmxvYXQpICgqaSk7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbCArPSBjdXJyZW50UGl4ZWwgKiBnUHRyWzBdOworICAgICAgICAgICAgICAgICAgICBnUHRyKys7CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvcihpbnQzMl90IHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICAgICAgICAgICAgICAvLyBTdGVwcGluZyBsZWZ0IGFuZCByaWdodCBhd2F5IGZyb20gdGhlIHBpeGVsCisgICAgICAgICAgICAgICAgICAgIGludCB2YWxpZFcgPSB4ICsgcjsKKyAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRXIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRXID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZih2YWxpZFcgPiB3aWR0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkVyA9IHdpZHRoIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQaXhlbCA9IChmbG9hdCkoaW5wdXRbdmFsaWRXXSk7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbCArPSBjdXJyZW50UGl4ZWwgKiBnUHRyWzBdOworICAgICAgICAgICAgICAgICAgICBnUHRyKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKm91dHB1dCA9ICh1aW50OF90KWJsdXJyZWRQaXhlbDsKKyAgICAgICAgICAgIG91dHB1dCArKzsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBGb250UmVuZGVyZXI6OnZlcnRpY2FsQmx1cihmbG9hdCogd2VpZ2h0cywgaW50MzJfdCByYWRpdXMsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNvdXJjZSwgdWludDhfdCogZGVzdCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKyAgICBmbG9hdCBibHVycmVkUGl4ZWwgPSAwLjBmOworICAgIGZsb2F0IGN1cnJlbnRQaXhlbCA9IDAuMGY7CisKKyAgICBmb3IoaW50MzJfdCB5ID0gMDsgeSA8IGhlaWdodDsgeSArKykgeworCisgICAgICAgIHVpbnQ4X3QqIG91dHB1dCA9IGRlc3QgKyB5ICogd2lkdGg7CisKKyAgICAgICAgZm9yKGludDMyX3QgeCA9IDA7IHggPCB3aWR0aDsgeCArKykgeworICAgICAgICAgICAgYmx1cnJlZFBpeGVsID0gMC4wZjsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBnUHRyID0gd2VpZ2h0czsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGlucHV0ID0gc291cmNlICsgeDsKKyAgICAgICAgICAgIC8vIE9wdGltaXphdGlvbiBmb3Igbm9uLWJvcmRlciBwaXhlbHMKKyAgICAgICAgICAgIGlmICgoeSA+IHJhZGl1cykgJiYgKHkgPCAoaGVpZ2h0IC0gcmFkaXVzKSkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppID0gaW5wdXQgKyAoKHkgLSByYWRpdXMpICogd2lkdGgpOworICAgICAgICAgICAgICAgIGZvcihpbnQzMl90IHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGl4ZWwgPSAoZmxvYXQpKCppKTsKKyAgICAgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsICs9IGN1cnJlbnRQaXhlbCAqIGdQdHJbMF07CisgICAgICAgICAgICAgICAgICAgIGdQdHIrKzsKKyAgICAgICAgICAgICAgICAgICAgaSArPSB3aWR0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvcihpbnQzMl90IHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgdmFsaWRIID0geSArIHI7CisgICAgICAgICAgICAgICAgICAgIC8vIENsYW1wIHRvIHplcm8gYW5kIHdpZHRoCisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkSCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkSCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRIID4gaGVpZ2h0IC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRIID0gaGVpZ2h0IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmkgPSBpbnB1dCArIHZhbGlkSCAqIHdpZHRoOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGl4ZWwgPSAoZmxvYXQpKCppKTsKKyAgICAgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsICs9IGN1cnJlbnRQaXhlbCAqIGdQdHJbMF07CisgICAgICAgICAgICAgICAgICAgIGdQdHIrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqb3V0cHV0ID0gKHVpbnQ4X3QpYmx1cnJlZFBpeGVsOworICAgICAgICAgICAgb3V0cHV0ICsrOworICAgICAgICB9CisgICAgfQorfQorCisKK3ZvaWQgRm9udFJlbmRlcmVyOjpibHVySW1hZ2UodWludDhfdCAqaW1hZ2UsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IHJhZGl1cykgeworICAgIGZsb2F0ICpnYXVzc2lhbiA9IG5ldyBmbG9hdFsyICogcmFkaXVzICsgMV07CisgICAgY29tcHV0ZUdhdXNzaWFuV2VpZ2h0cyhnYXVzc2lhbiwgcmFkaXVzKTsKKyAgICB1aW50OF90KiBzY3JhdGNoID0gbmV3IHVpbnQ4X3Rbd2lkdGggKiBoZWlnaHRdOworICAgIGhvcml6b250YWxCbHVyKGdhdXNzaWFuLCByYWRpdXMsIGltYWdlLCBzY3JhdGNoLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB2ZXJ0aWNhbEJsdXIoZ2F1c3NpYW4sIHJhZGl1cywgc2NyYXRjaCwgaW1hZ2UsIHdpZHRoLCBoZWlnaHQpOworICAgIGRlbGV0ZVtdIGdhdXNzaWFuOworICAgIGRlbGV0ZVtdIHNjcmF0Y2g7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0ZvbnRSZW5kZXJlci5oIGIvbGlicy9od3VpL0ZvbnRSZW5kZXJlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMGVmYWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvRm9udFJlbmRlcmVyLmgKQEAgLTAsMCArMSwyNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfRk9OVF9SRU5ERVJFUl9ICisjZGVmaW5lIEFORFJPSURfVUlfRk9OVF9SRU5ERVJFUl9ICisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorCisjaW5jbHVkZSA8U2tTY2FsZXJDb250ZXh0Lmg+CisjaW5jbHVkZSA8U2tQYWludC5oPgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlICJSZWN0LmgiCisjaW5jbHVkZSAiUHJvcGVydGllcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKK2NsYXNzIEZvbnRSZW5kZXJlcjsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgZm9udCwgZGVmaW5lZCBieSBhIFNraWEgZm9udCBpZCBhbmQgYSBmb250IHNpemUuIEEgZm9udCBpcyB1c2VkCisgKiB0byBnZW5lcmF0ZSBnbHlwaHMgYW5kIGNhY2hlIHRoZW0gaW4gdGhlIEZvbnRTdGF0ZS4KKyAqLworY2xhc3MgRm9udCB7CitwdWJsaWM6CisgICAgfkZvbnQoKTsKKworICAgIC8qKgorICAgICAqIFJlbmRlcnMgdGhlIHNwZWNpZmllZCBzdHJpbmcgb2YgdGV4dC4KKyAgICAgKiBJZiBiaXRtYXAgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIGJlIHVzZWQgYXMgdGhlIHJlbmRlciB0YXJnZXQKKyAgICAgKi8KKyAgICB2b2lkIHJlbmRlclVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgIGludCBudW1HbHlwaHMsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJpdG1hcCA9IE5VTEwsIHVpbnQzMl90IGJpdG1hcFcgPSAwLCB1aW50MzJfdCBiaXRtYXBIID0gMCk7CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBmb250IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGZvbnQgc3RhdGUuCisgICAgICovCisgICAgc3RhdGljIEZvbnQqIGNyZWF0ZShGb250UmVuZGVyZXIqIHN0YXRlLCB1aW50MzJfdCBmb250SWQsIGZsb2F0IGZvbnRTaXplKTsKKworcHJvdGVjdGVkOgorICAgIGZyaWVuZCBjbGFzcyBGb250UmVuZGVyZXI7CisKKyAgICBlbnVtIFJlbmRlck1vZGUgeworICAgICAgICBGUkFNRUJVRkZFUiwKKyAgICAgICAgQklUTUFQLAorICAgICAgICBNRUFTVVJFLAorICAgIH07CisKKyAgICB2b2lkIHJlbmRlclVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgIGludCBudW1HbHlwaHMsIGludCB4LCBpbnQgeSwgUmVuZGVyTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYml0bWFwLCB1aW50MzJfdCBiaXRtYXBXLCB1aW50MzJfdCBiaXRtYXBILAorICAgICAgICAgICAgICAgICAgICAgUmVjdCAqYm91bmRzKTsKKworICAgIHZvaWQgbWVhc3VyZVVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtR2x5cGhzLCBSZWN0ICpib3VuZHMpOworCisgICAgc3RydWN0IENhY2hlZEdseXBoSW5mbyB7CisgICAgICAgIC8vIEhhcyB0aGUgY2FjaGUgYmVlbiBpbnZhbGlkYXRlZD8KKyAgICAgICAgYm9vbCBtSXNWYWxpZDsKKyAgICAgICAgLy8gTG9jYXRpb24gb2YgdGhlIGNhY2hlZCBnbHlwaCBpbiB0aGUgYml0bWFwCisgICAgICAgIC8vIGluIGNhc2Ugd2UgbmVlZCB0byByZXNpemUgdGhlIHRleHR1cmUgb3IKKyAgICAgICAgLy8gcmVuZGVyIHRvIGJpdG1hcAorICAgICAgICB1aW50MzJfdCBtU3RhcnRYOworICAgICAgICB1aW50MzJfdCBtU3RhcnRZOworICAgICAgICB1aW50MzJfdCBtQml0bWFwV2lkdGg7CisgICAgICAgIHVpbnQzMl90IG1CaXRtYXBIZWlnaHQ7CisgICAgICAgIC8vIEFsc28gY2FjaGUgdGV4dHVyZSBjb29yZHMgZm9yIHRoZSBxdWFkCisgICAgICAgIGZsb2F0IG1CaXRtYXBNaW5VOworICAgICAgICBmbG9hdCBtQml0bWFwTWluVjsKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1heFU7CisgICAgICAgIGZsb2F0IG1CaXRtYXBNYXhWOworICAgICAgICAvLyBNaW5pbWl6ZSBob3cgbXVjaCB3ZSBjYWxsIGZyZWV0eXBlCisgICAgICAgIHVpbnQzMl90IG1HbHlwaEluZGV4OworICAgICAgICB1aW50MzJfdCBtQWR2YW5jZVg7CisgICAgICAgIHVpbnQzMl90IG1BZHZhbmNlWTsKKyAgICAgICAgLy8gVmFsdWVzIGJlbG93IGNvbnRhaW4gYSBnbHlwaCdzIG9yaWdpbiBpbiB0aGUgYml0bWFwCisgICAgICAgIGludDMyX3QgbUJpdG1hcExlZnQ7CisgICAgICAgIGludDMyX3QgbUJpdG1hcFRvcDsKKyAgICAgICAgLy8gQXV0by1rZXJuaW5nCisgICAgICAgIFNrRml4ZWQgbUxzYkRlbHRhOworICAgICAgICBTa0ZpeGVkIG1Sc2JEZWx0YTsKKyAgICB9OworCisgICAgRm9udChGb250UmVuZGVyZXIqIHN0YXRlLCB1aW50MzJfdCBmb250SWQsIGZsb2F0IGZvbnRTaXplKTsKKworICAgIERlZmF1bHRLZXllZFZlY3RvcjxpbnQzMl90LCBDYWNoZWRHbHlwaEluZm8qPiBtQ2FjaGVkR2x5cGhzOworCisgICAgdm9pZCBpbnZhbGlkYXRlVGV4dHVyZUNhY2hlKCk7CisKKyAgICBDYWNoZWRHbHlwaEluZm8qIGNhY2hlR2x5cGgoU2tQYWludCogcGFpbnQsIGludDMyX3QgZ2x5cGgpOworICAgIHZvaWQgdXBkYXRlR2x5cGhDYWNoZShTa1BhaW50KiBwYWludCwgY29uc3QgU2tHbHlwaCYgc2tpYUdseXBoLCBDYWNoZWRHbHlwaEluZm8gKmdseXBoKTsKKyAgICB2b2lkIG1lYXN1cmVDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8gKmdseXBoLCBpbnQgeCwgaW50IHksIFJlY3QgKmJvdW5kcyk7CisgICAgdm9pZCBkcmF3Q2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5KTsKKyAgICB2b2lkIGRyYXdDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8gKmdseXBoLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJpdG1hcCwgdWludDMyX3QgYml0bWFwVywgdWludDMyX3QgYml0bWFwSCk7CisKKyAgICBDYWNoZWRHbHlwaEluZm8qIGdldENhY2hlZFVURkNoYXIoU2tQYWludCogcGFpbnQsIGludDMyX3QgdXRmQ2hhcik7CisKKyAgICBGb250UmVuZGVyZXIqIG1TdGF0ZTsKKyAgICB1aW50MzJfdCBtRm9udElkOworICAgIGZsb2F0IG1Gb250U2l6ZTsKK307CisKK2NsYXNzIEZvbnRSZW5kZXJlciB7CitwdWJsaWM6CisgICAgRm9udFJlbmRlcmVyKCk7CisgICAgfkZvbnRSZW5kZXJlcigpOworCisgICAgdm9pZCBpbml0KCk7CisgICAgdm9pZCBkZWluaXQoKTsKKworICAgIHZvaWQgc2V0R2FtbWFUYWJsZShjb25zdCB1aW50OF90KiBnYW1tYVRhYmxlKSB7CisgICAgICAgIG1HYW1tYVRhYmxlID0gZ2FtbWFUYWJsZTsKKyAgICB9CisKKyAgICB2b2lkIHNldEZvbnQoU2tQYWludCogcGFpbnQsIHVpbnQzMl90IGZvbnRJZCwgZmxvYXQgZm9udFNpemUpOworICAgIHZvaWQgcmVuZGVyVGV4dChTa1BhaW50KiBwYWludCwgY29uc3QgUmVjdCogY2xpcCwgY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3Qgc3RhcnRJbmRleCwKKyAgICAgICAgICAgIHVpbnQzMl90IGxlbiwgaW50IG51bUdseXBocywgaW50IHgsIGludCB5KTsKKworICAgIHN0cnVjdCBEcm9wU2hhZG93IHsKKyAgICAgICAgRHJvcFNoYWRvdygpIHsgfTsKKworICAgICAgICBEcm9wU2hhZG93KGNvbnN0IERyb3BTaGFkb3cmIGRyb3BTaGFkb3cpOgorICAgICAgICAgICAgd2lkdGgoZHJvcFNoYWRvdy53aWR0aCksIGhlaWdodChkcm9wU2hhZG93LmhlaWdodCksCisgICAgICAgICAgICBpbWFnZShkcm9wU2hhZG93LmltYWdlKSwgcGVuWChkcm9wU2hhZG93LnBlblgpLAorICAgICAgICAgICAgcGVuWShkcm9wU2hhZG93LnBlblkpIHsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IHdpZHRoOworICAgICAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgICAgIHVpbnQ4X3QqIGltYWdlOworICAgICAgICBpbnQzMl90IHBlblg7CisgICAgICAgIGludDMyX3QgcGVuWTsKKyAgICB9OworCisgICAgLy8gQWZ0ZXIgcmVuZGVyRHJvcFNoYWRvdyByZXR1cm5zLCB0aGUgY2FsbGVkIG93bnMgdGhlIG1lbW9yeSBpbiBEcm9wU2hhZG93LmltYWdlCisgICAgLy8gYW5kIGlzIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgaXQgd2hlbiBpdCdzIGRvbmUgd2l0aCBpdAorICAgIERyb3BTaGFkb3cgcmVuZGVyRHJvcFNoYWRvdyhTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3Qgc3RhcnRJbmRleCwKKyAgICAgICAgICAgIHVpbnQzMl90IGxlbiwgaW50IG51bUdseXBocywgdWludDMyX3QgcmFkaXVzKTsKKworICAgIEdMdWludCBnZXRUZXh0dXJlKGJvb2wgbGluZWFyRmlsdGVyaW5nID0gZmFsc2UpIHsKKyAgICAgICAgY2hlY2tJbml0KCk7CisgICAgICAgIGlmIChsaW5lYXJGaWx0ZXJpbmcgIT0gbUxpbmVhckZpbHRlcmluZykgeworICAgICAgICAgICAgbUxpbmVhckZpbHRlcmluZyA9IGxpbmVhckZpbHRlcmluZzsKKyAgICAgICAgICAgIGNvbnN0IEdMZW51bSBmaWx0ZXJpbmcgPSBsaW5lYXJGaWx0ZXJpbmcgPyBHTF9MSU5FQVIgOiBHTF9ORUFSRVNUOworCisgICAgICAgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1UZXh0dXJlSWQpOworICAgICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgZmlsdGVyaW5nKTsKKyAgICAgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIGZpbHRlcmluZyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1UZXh0dXJlSWQ7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgZnJpZW5kIGNsYXNzIEZvbnQ7CisKKyAgICBjb25zdCB1aW50OF90KiBtR2FtbWFUYWJsZTsKKworICAgIHN0cnVjdCBDYWNoZVRleHR1cmVMaW5lIHsKKyAgICAgICAgdWludDE2X3QgbU1heEhlaWdodDsKKyAgICAgICAgdWludDE2X3QgbU1heFdpZHRoOworICAgICAgICB1aW50MzJfdCBtQ3VycmVudFJvdzsKKyAgICAgICAgdWludDMyX3QgbUN1cnJlbnRDb2w7CisgICAgICAgIGJvb2wgbURpcnR5OworCisgICAgICAgIENhY2hlVGV4dHVyZUxpbmUodWludDE2X3QgbWF4V2lkdGgsIHVpbnQxNl90IG1heEhlaWdodCwgdWludDMyX3QgY3VycmVudFJvdywKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBjdXJyZW50Q29sKToKKyAgICAgICAgICAgICAgICAgICAgbU1heEhlaWdodChtYXhIZWlnaHQpLAorICAgICAgICAgICAgICAgICAgICBtTWF4V2lkdGgobWF4V2lkdGgpLAorICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFJvdyhjdXJyZW50Um93KSwKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRDb2woY3VycmVudENvbCksCisgICAgICAgICAgICAgICAgICAgIG1EaXJ0eShmYWxzZSkgeworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBmaXRCaXRtYXAoY29uc3QgU2tHbHlwaCYgZ2x5cGgsIHVpbnQzMl90ICpyZXRPcmlnaW5YLCB1aW50MzJfdCAqcmV0T3JpZ2luWSkgeworICAgICAgICAgICAgaWYgKGdseXBoLmZIZWlnaHQgKyAyID4gbU1heEhlaWdodCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1DdXJyZW50Q29sICsgZ2x5cGguZldpZHRoICsgMiA8IG1NYXhXaWR0aCkgeworICAgICAgICAgICAgICAgICpyZXRPcmlnaW5YID0gbUN1cnJlbnRDb2wgKyAxOworICAgICAgICAgICAgICAgICpyZXRPcmlnaW5ZID0gbUN1cnJlbnRSb3cgKyAxOworICAgICAgICAgICAgICAgIG1DdXJyZW50Q29sICs9IGdseXBoLmZXaWR0aCArIDI7CisgICAgICAgICAgICAgICAgbURpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfTsKKworICAgIHVpbnQzMl90IGdldENhY2hlV2lkdGgoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2FjaGVXaWR0aDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRDYWNoZUhlaWdodCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DYWNoZUhlaWdodDsKKyAgICB9CisKKyAgICB2b2lkIGluaXRUZXh0VGV4dHVyZSgpOworICAgIGJvb2wgY2FjaGVCaXRtYXAoY29uc3QgU2tHbHlwaCYgZ2x5cGgsIHVpbnQzMl90ICpyZXRPcmlnaW5YLCB1aW50MzJfdCAqcmV0T3JpZ2luWSk7CisKKyAgICB2b2lkIGZsdXNoQWxsQW5kSW52YWxpZGF0ZSgpOworICAgIHZvaWQgaW5pdFZlcnRleEFycmF5QnVmZmVycygpOworCisgICAgdm9pZCBjaGVja0luaXQoKTsKKworICAgIFN0cmluZzE2IG1MYXRpblByZWNhY2hlOworICAgIHZvaWQgcHJlY2FjaGVMYXRpbihTa1BhaW50KiBwYWludCk7CisKKyAgICB2b2lkIGlzc3VlRHJhd0NvbW1hbmQoKTsKKyAgICB2b2lkIGFwcGVuZE1lc2hRdWFkKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHUxLCBmbG9hdCB2MSwgZmxvYXQgeDIsIGZsb2F0IHkyLAorICAgICAgICAgICAgZmxvYXQgejIsIGZsb2F0IHUyLCBmbG9hdCB2MiwgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgdTMsIGZsb2F0IHYzLAorICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCwgZmxvYXQgdTQsIGZsb2F0IHY0KTsKKworICAgIHVpbnQzMl90IG1DYWNoZVdpZHRoOworICAgIHVpbnQzMl90IG1DYWNoZUhlaWdodDsKKworICAgIFZlY3RvcjxDYWNoZVRleHR1cmVMaW5lKj4gbUNhY2hlTGluZXM7CisgICAgdWludDMyX3QgZ2V0UmVtYWluaW5nQ2FjaGVDYXBhY2l0eSgpOworCisgICAgRm9udCogbUN1cnJlbnRGb250OworICAgIFZlY3RvcjxGb250Kj4gbUFjdGl2ZUZvbnRzOworCisgICAgLy8gVGV4dHVyZSB0byBjYWNoZSBnbHlwaCBiaXRtYXBzCisgICAgdWludDhfdCogbVRleHRUZXh0dXJlOworICAgIGNvbnN0IHVpbnQ4X3QqIGdldFRleHRUZXh0dXJlRGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UZXh0VGV4dHVyZTsKKyAgICB9CisgICAgR0x1aW50IG1UZXh0dXJlSWQ7CisgICAgdm9pZCBjaGVja1RleHR1cmVVcGRhdGUoKTsKKyAgICBib29sIG1VcGxvYWRUZXh0dXJlOworCisgICAgLy8gUG9pbnRlciB0byB2ZXJ0ZXggZGF0YSB0byBzcGVlZCB1cCBmcmFtZSB0byBmcmFtZSB3b3JrCisgICAgZmxvYXQgKm1UZXh0TWVzaFB0cjsKKyAgICB1aW50MzJfdCBtQ3VycmVudFF1YWRJbmRleDsKKyAgICB1aW50MzJfdCBtTWF4TnVtYmVyT2ZRdWFkczsKKworICAgIHVpbnQzMl90IG1JbmRleEJ1ZmZlcklEOworCisgICAgY29uc3QgUmVjdCogbUNsaXA7CisKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKworICAgIGJvb2wgbUxpbmVhckZpbHRlcmluZzsKKworICAgIHZvaWQgY29tcHV0ZUdhdXNzaWFuV2VpZ2h0cyhmbG9hdCogd2VpZ2h0cywgaW50MzJfdCByYWRpdXMpOworICAgIHZvaWQgaG9yaXpvbnRhbEJsdXIoZmxvYXQqIHdlaWdodHMsIGludDMyX3QgcmFkaXVzLCBjb25zdCB1aW50OF90ICpzb3VyY2UsIHVpbnQ4X3QgKmRlc3QsCisgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisgICAgdm9pZCB2ZXJ0aWNhbEJsdXIoZmxvYXQqIHdlaWdodHMsIGludDMyX3QgcmFkaXVzLCBjb25zdCB1aW50OF90ICpzb3VyY2UsIHVpbnQ4X3QgKmRlc3QsCisgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisgICAgdm9pZCBibHVySW1hZ2UodWludDhfdCogaW1hZ2UsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IHJhZGl1cyk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfRk9OVF9SRU5ERVJFUl9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvR2FtbWFGb250UmVuZGVyZXIuY3BwIGIvbGlicy9od3VpL0dhbW1hRm9udFJlbmRlcmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDA4N2UzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0dhbW1hRm9udFJlbmRlcmVyLmNwcApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlICJHYW1tYUZvbnRSZW5kZXJlci5oIgorI2luY2x1ZGUgIlByb3BlcnRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitHYW1tYUZvbnRSZW5kZXJlcjo6R2FtbWFGb250UmVuZGVyZXIoKSB7CisgICAgTE9HRCgiQ3JlYXRpbmcgZ2FtbWEgZm9udCByZW5kZXJlciIpOworCisgICAgLy8gR2V0IHRoZSByZW5kZXJlciBwcm9wZXJ0aWVzCisgICAgY2hhciBwcm9wZXJ0eVtQUk9QRVJUWV9WQUxVRV9NQVhdOworCisgICAgLy8gR2V0IHRoZSBnYW1tYQorICAgIGZsb2F0IGdhbW1hID0gREVGQVVMVF9URVhUX0dBTU1BOworICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUEVSVFlfVEVYVF9HQU1NQSwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgdGV4dCBnYW1tYSB0byAlcyIsIHByb3BlcnR5KTsKKyAgICAgICAgZ2FtbWEgPSBhdG9mKHByb3BlcnR5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCIgIFVzaW5nIGRlZmF1bHQgdGV4dCBnYW1tYSBvZiAlLjJmIiwgREVGQVVMVF9URVhUX0dBTU1BKTsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIGJsYWNrIGdhbW1hIHRocmVzaG9sZAorICAgIG1CbGFja1RocmVzaG9sZCA9IERFRkFVTFRfVEVYVF9CTEFDS19HQU1NQV9USFJFU0hPTEQ7CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9URVhUX0JMQUNLX0dBTU1BX1RIUkVTSE9MRCwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgdGV4dCBibGFjayBnYW1tYSB0aHJlc2hvbGQgdG8gJXMiLCBwcm9wZXJ0eSk7CisgICAgICAgIG1CbGFja1RocmVzaG9sZCA9IGF0b2kocHJvcGVydHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCB0ZXh0IGJsYWNrIGdhbW1hIHRocmVzaG9sZCBvZiAlZCIsCisgICAgICAgICAgICAgICAgREVGQVVMVF9URVhUX0JMQUNLX0dBTU1BX1RIUkVTSE9MRCk7CisgICAgfQorCisgICAgLy8gR2V0IHRoZSB3aGl0ZSBnYW1tYSB0aHJlc2hvbGQKKyAgICBtV2hpdGVUaHJlc2hvbGQgPSBERUZBVUxUX1RFWFRfV0hJVEVfR0FNTUFfVEhSRVNIT0xEOworICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUEVSVFlfVEVYVF9XSElURV9HQU1NQV9USFJFU0hPTEQsIHByb3BlcnR5LCBOVUxMKSA+IDApIHsKKyAgICAgICAgTE9HRCgiICBTZXR0aW5nIHRleHQgd2hpdGUgZ2FtbWEgdGhyZXNob2xkIHRvICVzIiwgcHJvcGVydHkpOworICAgICAgICBtV2hpdGVUaHJlc2hvbGQgPSBhdG9pKHByb3BlcnR5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCIgIFVzaW5nIGRlZmF1bHQgd2hpdGUgYmxhY2sgZ2FtbWEgdGhyZXNob2xkIG9mICVkIiwKKyAgICAgICAgICAgICAgICBERUZBVUxUX1RFWFRfV0hJVEVfR0FNTUFfVEhSRVNIT0xEKTsKKyAgICB9CisKKyAgICAvLyBDb21wdXRlIHRoZSBnYW1tYSB0YWJsZXMKKyAgICBjb25zdCBmbG9hdCBibGFja0dhbW1hID0gZ2FtbWE7CisgICAgY29uc3QgZmxvYXQgd2hpdGVHYW1tYSA9IDEuMGYgLyBnYW1tYTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPD0gMjU1OyBpKyspIHsKKyAgICAgICAgbURlZmF1bHRbaV0gPSBpOworCisgICAgICAgIGNvbnN0IGZsb2F0IHYgPSBpIC8gMjU1LjBmOworICAgICAgICBjb25zdCBmbG9hdCBibGFjayA9IHBvdyh2LCBibGFja0dhbW1hKTsKKyAgICAgICAgY29uc3QgZmxvYXQgd2hpdGUgPSBwb3codiwgd2hpdGVHYW1tYSk7CisKKyAgICAgICAgbUJsYWNrR2FtbWFbaV0gPSB1aW50OF90KChmbG9hdCk6OmZsb29yKGJsYWNrICogMjU1LjBmICsgMC41ZikpOworICAgICAgICBtV2hpdGVHYW1tYVtpXSA9IHVpbnQ4X3QoKGZsb2F0KTo6Zmxvb3Iod2hpdGUgKiAyNTUuMGYgKyAwLjVmKSk7CisgICAgfQorCisgICAgLy8gQ29uZmlndXJlIHRoZSBmb250IHJlbmRlcmVycworICAgIG1EZWZhdWx0UmVuZGVyZXIuc2V0R2FtbWFUYWJsZSgmbURlZmF1bHRbMF0pOworICAgIG1CbGFja0dhbW1hUmVuZGVyZXIuc2V0R2FtbWFUYWJsZSgmbUJsYWNrR2FtbWFbMF0pOworICAgIG1XaGl0ZUdhbW1hUmVuZGVyZXIuc2V0R2FtbWFUYWJsZSgmbVdoaXRlR2FtbWFbMF0pOworfQorCitGb250UmVuZGVyZXImIEdhbW1hRm9udFJlbmRlcmVyOjpnZXRGb250UmVuZGVyZXIoY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBpZiAocGFpbnQtPmdldFNoYWRlcigpID09IE5VTEwpIHsKKyAgICAgICAgdWludDMyX3QgYyA9IHBhaW50LT5nZXRDb2xvcigpOworICAgICAgICBjb25zdCBpbnQgciA9IChjID4+IDE2KSAmIDB4RkY7CisgICAgICAgIGNvbnN0IGludCBnID0gKGMgPj4gIDgpICYgMHhGRjsKKyAgICAgICAgY29uc3QgaW50IGIgPSAoYyAgICAgICkgJiAweEZGOworICAgICAgICBjb25zdCBpbnQgbHVtaW5hbmNlID0gKHIgKiAyICsgZyAqIDUgKyBiKSA+PiAzOworCisgICAgICAgIGlmIChsdW1pbmFuY2UgPD0gbUJsYWNrVGhyZXNob2xkKSB7CisgICAgICAgICAgICByZXR1cm4gbUJsYWNrR2FtbWFSZW5kZXJlcjsKKyAgICAgICAgfSBlbHNlIGlmIChsdW1pbmFuY2UgPj0gbVdoaXRlVGhyZXNob2xkKSB7CisgICAgICAgICAgICByZXR1cm4gbVdoaXRlR2FtbWFSZW5kZXJlcjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbURlZmF1bHRSZW5kZXJlcjsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvR2FtbWFGb250UmVuZGVyZXIuaCBiL2xpYnMvaHd1aS9HYW1tYUZvbnRSZW5kZXJlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYTQ1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvR2FtbWFGb250UmVuZGVyZXIuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0dBTU1BX0ZPTlRfUkVOREVSRVJfSAorI2RlZmluZSBBTkRST0lEX1VJX0dBTU1BX0ZPTlRfUkVOREVSRVJfSAorCisjaW5jbHVkZSA8U2tQYWludC5oPgorCisjaW5jbHVkZSAiRm9udFJlbmRlcmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworc3RydWN0IEdhbW1hRm9udFJlbmRlcmVyIHsKKyAgICBHYW1tYUZvbnRSZW5kZXJlcigpOworCisgICAgRm9udFJlbmRlcmVyJiBnZXRGb250UmVuZGVyZXIoY29uc3QgU2tQYWludCogcGFpbnQpOworCitwcml2YXRlOgorICAgIEZvbnRSZW5kZXJlciBtRGVmYXVsdFJlbmRlcmVyOworICAgIEZvbnRSZW5kZXJlciBtQmxhY2tHYW1tYVJlbmRlcmVyOworICAgIEZvbnRSZW5kZXJlciBtV2hpdGVHYW1tYVJlbmRlcmVyOworCisgICAgaW50IG1CbGFja1RocmVzaG9sZDsKKyAgICBpbnQgbVdoaXRlVGhyZXNob2xkOworCisgICAgdWludDhfdCBtRGVmYXVsdFsyNTZdOworICAgIHVpbnQ4X3QgbUJsYWNrR2FtbWFbMjU2XTsKKyAgICB1aW50OF90IG1XaGl0ZUdhbW1hWzI1Nl07Cit9OworCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfR0FNTUFfRk9OVF9SRU5ERVJFUl9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvR2VuZXJhdGlvbkNhY2hlLmggYi9saWJzL2h3dWkvR2VuZXJhdGlvbkNhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVjNmJlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9HZW5lcmF0aW9uQ2FjaGUuaApAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9HRU5FUkFUSU9OX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9HRU5FUkFUSU9OX0NBQ0hFX0gKKworI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEVudHJ5S2V5LCB0eXBlbmFtZSBFbnRyeVZhbHVlPgorY2xhc3MgT25FbnRyeVJlbW92ZWQgeworcHVibGljOgorICAgIHZpcnR1YWwgfk9uRW50cnlSZW1vdmVkKCkgeyB9OworICAgIHZpcnR1YWwgdm9pZCBvcGVyYXRvcigpKEVudHJ5S2V5JiBrZXksIEVudHJ5VmFsdWUmIHZhbHVlKSA9IDA7Cit9OyAvLyBjbGFzcyBPbkVudHJ5UmVtb3ZlZAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBFbnRyeUtleSwgdHlwZW5hbWUgRW50cnlWYWx1ZT4KK3N0cnVjdCBFbnRyeTogcHVibGljIExpZ2h0UmVmQmFzZTxFbnRyeTxFbnRyeUtleSwgRW50cnlWYWx1ZT4gPiB7CisgICAgRW50cnkoKSB7IH0KKyAgICBFbnRyeShjb25zdCBFbnRyeTxFbnRyeUtleSwgRW50cnlWYWx1ZT4mIGUpOgorICAgICAgICAgICAga2V5KGUua2V5KSwgdmFsdWUoZS52YWx1ZSksIHBhcmVudChlLnBhcmVudCksIGNoaWxkKGUuY2hpbGQpIHsgfQorICAgIEVudHJ5KHNwPEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiA+IGUpOgorICAgICAgICAgICAga2V5KGUtPmtleSksIHZhbHVlKGUtPnZhbHVlKSwgcGFyZW50KGUtPnBhcmVudCksIGNoaWxkKGUtPmNoaWxkKSB7IH0KKworICAgIEVudHJ5S2V5IGtleTsKKyAgICBFbnRyeVZhbHVlIHZhbHVlOworCisgICAgc3A8RW50cnk8RW50cnlLZXksIEVudHJ5VmFsdWU+ID4gcGFyZW50OworICAgIHNwPEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiA+IGNoaWxkOworfTsgLy8gc3RydWN0IEVudHJ5CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitjbGFzcyBHZW5lcmF0aW9uQ2FjaGUgeworcHVibGljOgorICAgIEdlbmVyYXRpb25DYWNoZSh1aW50MzJfdCBtYXhDYXBhY2l0eSk7CisgICAgdmlydHVhbCB+R2VuZXJhdGlvbkNhY2hlKCk7CisKKyAgICBlbnVtIENhcGFjaXR5IHsKKyAgICAgICAga1VubGltaXRlZENhcGFjaXR5LAorICAgIH07CisKKyAgICB2b2lkIHNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIoT25FbnRyeVJlbW92ZWQ8SywgVj4qIGxpc3RlbmVyKTsKKworICAgIHZvaWQgY2xlYXIoKTsKKworICAgIGJvb2wgY29udGFpbnMoSyBrZXkpIGNvbnN0OworICAgIFYgZ2V0KEsga2V5KTsKKyAgICBLIGdldEtleUF0KHVpbnQzMl90IGluZGV4KSBjb25zdDsKKyAgICB2b2lkIHB1dChLIGtleSwgViB2YWx1ZSk7CisgICAgViByZW1vdmUoSyBrZXkpOworICAgIFYgcmVtb3ZlT2xkZXN0KCk7CisgICAgViBnZXRWYWx1ZUF0KHVpbnQzMl90IGluZGV4KSBjb25zdDsKKworICAgIHVpbnQzMl90IHNpemUoKSBjb25zdDsKKworICAgIHZvaWQgYWRkVG9DYWNoZShzcDxFbnRyeTxLLCBWPiA+IGVudHJ5LCBLIGtleSwgViB2YWx1ZSk7CisgICAgdm9pZCBhdHRhY2hUb0NhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnkpOworICAgIHZvaWQgZGV0YWNoRnJvbUNhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnkpOworCisgICAgViByZW1vdmVBdChzc2l6ZV90IGluZGV4KTsKKworICAgIEtleWVkVmVjdG9yPEssIHNwPEVudHJ5PEssIFY+ID4gPiBtQ2FjaGU7CisgICAgdWludDMyX3QgbU1heENhcGFjaXR5OworCisgICAgT25FbnRyeVJlbW92ZWQ8SywgVj4qIG1MaXN0ZW5lcjsKKworICAgIHNwPEVudHJ5PEssIFY+ID4gbU9sZGVzdDsKKyAgICBzcDxFbnRyeTxLLCBWPiA+IG1Zb3VuZ2VzdDsKK307IC8vIGNsYXNzIEdlbmVyYXRpb25DYWNoZQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpHZW5lcmF0aW9uQ2FjaGUodWludDMyX3QgbWF4Q2FwYWNpdHkpOiBtTWF4Q2FwYWNpdHkobWF4Q2FwYWNpdHkpLCBtTGlzdGVuZXIoTlVMTCkgeworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK0dlbmVyYXRpb25DYWNoZTxLLCBWPjo6fkdlbmVyYXRpb25DYWNoZSgpIHsKKyAgICBjbGVhcigpOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3VpbnQzMl90IEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6c2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNhY2hlLnNpemUoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpzZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKE9uRW50cnlSZW1vdmVkPEssIFY+KiBsaXN0ZW5lcikgeworICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgordm9pZCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OmNsZWFyKCkgeworICAgIGlmIChtTGlzdGVuZXIpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG1DYWNoZS52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKG1MaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICgqbUxpc3RlbmVyKShlbnRyeS0+a2V5LCBlbnRyeS0+dmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1DYWNoZS5jbGVhcigpOworICAgIG1Zb3VuZ2VzdC5jbGVhcigpOworICAgIG1PbGRlc3QuY2xlYXIoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK2Jvb2wgR2VuZXJhdGlvbkNhY2hlPEssIFY+Ojpjb250YWlucyhLIGtleSkgY29uc3QgeworICAgIHJldHVybiBtQ2FjaGUuaW5kZXhPZktleShrZXkpID49IDA7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitLIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6Z2V0S2V5QXQodWludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNhY2hlLmtleUF0KGluZGV4KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK1YgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpnZXRWYWx1ZUF0KHVpbnQzMl90IGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1DYWNoZS52YWx1ZUF0KGluZGV4KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK1YgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpnZXQoSyBrZXkpIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUNhY2hlLmluZGV4T2ZLZXkoa2V5KTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBzcDxFbnRyeTxLLCBWPiA+IGVudHJ5ID0gbUNhY2hlLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBpZiAoZW50cnkuZ2V0KCkpIHsKKyAgICAgICAgICAgIGRldGFjaEZyb21DYWNoZShlbnRyeSk7CisgICAgICAgICAgICBhdHRhY2hUb0NhY2hlKGVudHJ5KTsKKyAgICAgICAgICAgIHJldHVybiBlbnRyeS0+dmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpwdXQoSyBrZXksIFYgdmFsdWUpIHsKKyAgICBpZiAobU1heENhcGFjaXR5ICE9IGtVbmxpbWl0ZWRDYXBhY2l0eSAmJiBtQ2FjaGUuc2l6ZSgpID49IG1NYXhDYXBhY2l0eSkgeworICAgICAgICByZW1vdmVPbGRlc3QoKTsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUNhY2hlLmluZGV4T2ZLZXkoa2V5KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHNwPEVudHJ5PEssIFY+ID4gZW50cnkgPSBuZXcgRW50cnk8SywgVj47CisgICAgICAgIGFkZFRvQ2FjaGUoZW50cnksIGtleSwgdmFsdWUpOworICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjphZGRUb0NhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnksIEsga2V5LCBWIHZhbHVlKSB7CisgICAgZW50cnktPmtleSA9IGtleTsKKyAgICBlbnRyeS0+dmFsdWUgPSB2YWx1ZTsKKyAgICBtQ2FjaGUuYWRkKGtleSwgZW50cnkpOworICAgIGF0dGFjaFRvQ2FjaGUoZW50cnkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorViBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OnJlbW92ZShLIGtleSkgeworICAgIHNzaXplX3QgaW5kZXggPSBtQ2FjaGUuaW5kZXhPZktleShrZXkpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHJldHVybiByZW1vdmVBdChpbmRleCk7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitWIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6cmVtb3ZlQXQoc3NpemVfdCBpbmRleCkgeworICAgIHNwPEVudHJ5PEssIFY+ID4gZW50cnkgPSBtQ2FjaGUudmFsdWVBdChpbmRleCk7CisgICAgaWYgKG1MaXN0ZW5lcikgeworICAgICAgICAoKm1MaXN0ZW5lcikoZW50cnktPmtleSwgZW50cnktPnZhbHVlKTsKKyAgICB9CisgICAgbUNhY2hlLnJlbW92ZUl0ZW1zQXQoaW5kZXgsIDEpOworICAgIGRldGFjaEZyb21DYWNoZShlbnRyeSk7CisKKyAgICByZXR1cm4gZW50cnktPnZhbHVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorViBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OnJlbW92ZU9sZGVzdCgpIHsKKyAgICBpZiAobU9sZGVzdC5nZXQoKSkgeworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUNhY2hlLmluZGV4T2ZLZXkobU9sZGVzdC0+a2V5KTsKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgIHJldHVybiByZW1vdmVBdChpbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjphdHRhY2hUb0NhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnkpIHsKKyAgICBpZiAoIW1Zb3VuZ2VzdC5nZXQoKSkgeworICAgICAgICBtWW91bmdlc3QgPSBtT2xkZXN0ID0gZW50cnk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW50cnktPnBhcmVudCA9IG1Zb3VuZ2VzdDsKKyAgICAgICAgbVlvdW5nZXN0LT5jaGlsZCA9IGVudHJ5OworICAgICAgICBtWW91bmdlc3QgPSBlbnRyeTsKKyAgICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Cit2b2lkIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6ZGV0YWNoRnJvbUNhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnkpIHsKKyAgICBpZiAoZW50cnktPnBhcmVudC5nZXQoKSkgeworICAgICAgICBlbnRyeS0+cGFyZW50LT5jaGlsZCA9IGVudHJ5LT5jaGlsZDsKKyAgICB9CisKKyAgICBpZiAoZW50cnktPmNoaWxkLmdldCgpKSB7CisgICAgICAgIGVudHJ5LT5jaGlsZC0+cGFyZW50ID0gZW50cnktPnBhcmVudDsKKyAgICB9CisKKyAgICBpZiAobU9sZGVzdCA9PSBlbnRyeSkgeworICAgICAgICBtT2xkZXN0ID0gZW50cnktPmNoaWxkOworICAgIH0KKworICAgIGlmIChtWW91bmdlc3QgPT0gZW50cnkpIHsKKyAgICAgICAgbVlvdW5nZXN0ID0gZW50cnktPnBhcmVudDsKKyAgICB9CisKKyAgICBlbnRyeS0+cGFyZW50LmNsZWFyKCk7CisgICAgZW50cnktPmNoaWxkLmNsZWFyKCk7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9HRU5FUkFUSU9OX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9HcmFkaWVudENhY2hlLmNwcCBiL2xpYnMvaHd1aS9HcmFkaWVudENhY2hlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2Y0Y2I0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuY3BwCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8U2tDYW52YXMuaD4KKyNpbmNsdWRlIDxTa0dyYWRpZW50U2hhZGVyLmg+CisKKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKKyNpbmNsdWRlICJHcmFkaWVudENhY2hlLmgiCisjaW5jbHVkZSAiUHJvcGVydGllcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0dyYWRpZW50Q2FjaGU6OkdyYWRpZW50Q2FjaGUoKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxTa1NoYWRlciosIFRleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKE1CKERFRkFVTFRfR1JBRElFTlRfQ0FDSEVfU0laRSkpIHsKKyAgICBjaGFyIHByb3BlcnR5W1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9HUkFESUVOVF9DQUNIRV9TSVpFLCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyBncmFkaWVudCBjYWNoZSBzaXplIHRvICVzTUIiLCBwcm9wZXJ0eSk7CisgICAgICAgIHNldE1heFNpemUoTUIoYXRvZihwcm9wZXJ0eSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCIgIFVzaW5nIGRlZmF1bHQgZ3JhZGllbnQgY2FjaGUgc2l6ZSBvZiAlLjJmTUIiLCBERUZBVUxUX0dSQURJRU5UX0NBQ0hFX1NJWkUpOworICAgIH0KKworICAgIG1DYWNoZS5zZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKHRoaXMpOworfQorCitHcmFkaWVudENhY2hlOjpHcmFkaWVudENhY2hlKHVpbnQzMl90IG1heEJ5dGVTaXplKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxTa1NoYWRlciosIFRleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKG1heEJ5dGVTaXplKSB7CisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIodGhpcyk7Cit9CisKK0dyYWRpZW50Q2FjaGU6On5HcmFkaWVudENhY2hlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNpemUgbWFuYWdlbWVudAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit1aW50MzJfdCBHcmFkaWVudENhY2hlOjpnZXRTaXplKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1TaXplOworfQorCit1aW50MzJfdCBHcmFkaWVudENhY2hlOjpnZXRNYXhTaXplKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1NYXhTaXplOworfQorCit2b2lkIEdyYWRpZW50Q2FjaGU6OnNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbU1heFNpemUgPSBtYXhTaXplOworICAgIHdoaWxlIChtU2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgIG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhbGxiYWNrcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIEdyYWRpZW50Q2FjaGU6Om9wZXJhdG9yKCkoU2tTaGFkZXIqJiBzaGFkZXIsIFRleHR1cmUqJiB0ZXh0dXJlKSB7CisgICAgLy8gQWxyZWFkeSBsb2NrZWQgaGVyZQorICAgIGlmIChzaGFkZXIpIHsKKyAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IHRleHR1cmUtPndpZHRoICogdGV4dHVyZS0+aGVpZ2h0ICogNDsKKyAgICAgICAgbVNpemUgLT0gc2l6ZTsKKyAgICB9CisKKyAgICBpZiAodGV4dHVyZSkgeworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisgICAgICAgIGRlbGV0ZSB0ZXh0dXJlOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FjaGluZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitUZXh0dXJlKiBHcmFkaWVudENhY2hlOjpnZXQoU2tTaGFkZXIqIHNoYWRlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1DYWNoZS5nZXQoc2hhZGVyKTsKK30KKwordm9pZCBHcmFkaWVudENhY2hlOjpyZW1vdmUoU2tTaGFkZXIqIHNoYWRlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhY2hlLnJlbW92ZShzaGFkZXIpOworfQorCit2b2lkIEdyYWRpZW50Q2FjaGU6OmNsZWFyKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKK1RleHR1cmUqIEdyYWRpZW50Q2FjaGU6OmFkZExpbmVhckdyYWRpZW50KFNrU2hhZGVyKiBzaGFkZXIsIHVpbnQzMl90KiBjb2xvcnMsCisgICAgICAgIGZsb2F0KiBwb3NpdGlvbnMsIGludCBjb3VudCwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVNb2RlKSB7CisgICAgU2tCaXRtYXAgYml0bWFwOworICAgIGJpdG1hcC5zZXRDb25maWcoU2tCaXRtYXA6OmtBUkdCXzg4ODhfQ29uZmlnLCAxMDI0LCAxKTsKKyAgICBiaXRtYXAuYWxsb2NQaXhlbHMoKTsKKyAgICBiaXRtYXAuZXJhc2VDb2xvcigwKTsKKworICAgIFNrQ2FudmFzIGNhbnZhcyhiaXRtYXApOworCisgICAgU2tQb2ludCBwb2ludHNbMl07CisgICAgcG9pbnRzWzBdLnNldCgwLjBmLCAwLjBmKTsKKyAgICBwb2ludHNbMV0uc2V0KGJpdG1hcC53aWR0aCgpLCAwLjBmKTsKKworICAgIFNrU2hhZGVyKiBsb2NhbFNoYWRlciA9IFNrR3JhZGllbnRTaGFkZXI6OkNyZWF0ZUxpbmVhcihwb2ludHMsCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFNrQ29sb3IqPihjb2xvcnMpLCBwb3NpdGlvbnMsIGNvdW50LCB0aWxlTW9kZSk7CisKKyAgICBTa1BhaW50IHA7CisgICAgcC5zZXRTdHlsZShTa1BhaW50OjprU3Ryb2tlQW5kRmlsbF9TdHlsZSk7CisgICAgcC5zZXRTaGFkZXIobG9jYWxTaGFkZXIpLT51bnJlZigpOworCisgICAgY2FudmFzLmRyYXdSZWN0Q29vcmRzKDAuMGYsIDAuMGYsIGJpdG1hcC53aWR0aCgpLCAxLjBmLCBwKTsKKworICAgIG1Mb2NrLmxvY2soKTsKKyAgICAvLyBBc3VtZSB0aGUgY2FjaGUgaXMgYWx3YXlzIGJpZyBlbm91Z2gKKyAgICBjb25zdCB1aW50MzJfdCBzaXplID0gYml0bWFwLnJvd0J5dGVzKCkgKiBiaXRtYXAuaGVpZ2h0KCk7CisgICAgd2hpbGUgKG1TaXplICsgc2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgIG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICB9CisgICAgbUxvY2sudW5sb2NrKCk7CisKKyAgICBUZXh0dXJlKiB0ZXh0dXJlID0gbmV3IFRleHR1cmU7CisgICAgZ2VuZXJhdGVUZXh0dXJlKCZiaXRtYXAsIHRleHR1cmUpOworCisgICAgbUxvY2subG9jaygpOworICAgIG1TaXplICs9IHNpemU7CisgICAgbUNhY2hlLnB1dChzaGFkZXIsIHRleHR1cmUpOworICAgIG1Mb2NrLnVubG9jaygpOworCisgICAgcmV0dXJuIHRleHR1cmU7Cit9CisKK3ZvaWQgR3JhZGllbnRDYWNoZTo6Z2VuZXJhdGVUZXh0dXJlKFNrQml0bWFwKiBiaXRtYXAsIFRleHR1cmUqIHRleHR1cmUpIHsKKyAgICBTa0F1dG9Mb2NrUGl4ZWxzIGF1dG9Mb2NrKCpiaXRtYXApOworICAgIGlmICghYml0bWFwLT5yZWFkeVRvRHJhdygpKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBnZW5lcmF0ZSB0ZXh0dXJlIGZyb20gc2hhZGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0ZXh0dXJlLT5nZW5lcmF0aW9uID0gYml0bWFwLT5nZXRHZW5lcmF0aW9uSUQoKTsKKyAgICB0ZXh0dXJlLT53aWR0aCA9IGJpdG1hcC0+d2lkdGgoKTsKKyAgICB0ZXh0dXJlLT5oZWlnaHQgPSBiaXRtYXAtPmhlaWdodCgpOworCisgICAgZ2xHZW5UZXh0dXJlcygxLCAmdGV4dHVyZS0+aWQpOworCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlLT5pZCk7CisgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCBiaXRtYXAtPmJ5dGVzUGVyUGl4ZWwoKSk7CisKKyAgICB0ZXh0dXJlLT5ibGVuZCA9ICFiaXRtYXAtPmlzT3BhcXVlKCk7CisgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIGJpdG1hcC0+cm93Qnl0ZXNBc1BpeGVscygpLCB0ZXh0dXJlLT5oZWlnaHQsIDAsCisgICAgICAgICAgICBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBiaXRtYXAtPmdldFBpeGVscygpKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvR3JhZGllbnRDYWNoZS5oIGIvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODI5ZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0dSQURJRU5UX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9HUkFESUVOVF9DQUNIRV9ICisKKyNpbmNsdWRlIDxTa1NoYWRlci5oPgorCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorI2luY2x1ZGUgIkdlbmVyYXRpb25DYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogQSBzaW1wbGUgTFJVIGdyYWRpZW50IGNhY2hlLiBUaGUgY2FjaGUgaGFzIGEgbWF4aW11bSBzaXplIGV4cHJlc3NlZCBpbiBieXRlcy4KKyAqIEFueSB0ZXh0dXJlIGFkZGVkIHRvIHRoZSBjYWNoZSBjYXVzaW5nIHRoZSBjYWNoZSB0byBncm93IGJleW9uZCB0aGUgbWF4aW11bQorICogYWxsb3dlZCBzaXplIHdpbGwgYWxzbyBjYXVzZSB0aGUgb2xkZXN0IHRleHR1cmUgdG8gYmUga2lja2VkIG91dC4KKyAqLworY2xhc3MgR3JhZGllbnRDYWNoZTogcHVibGljIE9uRW50cnlSZW1vdmVkPFNrU2hhZGVyKiwgVGV4dHVyZSo+IHsKK3B1YmxpYzoKKyAgICBHcmFkaWVudENhY2hlKCk7CisgICAgR3JhZGllbnRDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk7CisgICAgfkdyYWRpZW50Q2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoU2tTaGFkZXIqJiBzaGFkZXIsIFRleHR1cmUqJiB0ZXh0dXJlKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXcgbGluZWFyIGdyYWRpZW50IHRvIHRoZSBjYWNoZS4gVGhlIGdlbmVyYXRlZCB0ZXh0dXJlIGlzCisgICAgICogcmV0dXJuZWQuCisgICAgICovCisgICAgVGV4dHVyZSogYWRkTGluZWFyR3JhZGllbnQoU2tTaGFkZXIqIHNoYWRlciwgdWludDMyX3QqIGNvbG9ycywgZmxvYXQqIHBvc2l0aW9ucywKKyAgICAgICAgICAgIGludCBjb3VudCwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVNb2RlID0gU2tTaGFkZXI6OmtDbGFtcF9UaWxlTW9kZSk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGV4dHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBzaGFkZXIuCisgICAgICovCisgICAgVGV4dHVyZSogZ2V0KFNrU2hhZGVyKiBzaGFkZXIpOworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIHRleHR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgc2hhZGVyLiBSZXR1cm5zIE5VTEwKKyAgICAgKiBpZiB0aGUgdGV4dHVyZSBjYW5ub3QgYmUgZm91bmQuIFVwb24gcmVtb3ZlIHRoZSB0ZXh0dXJlIGlzIGZyZWVkLgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlKFNrU2hhZGVyKiBzaGFkZXIpOworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgY2FjaGUuIFRoaXMgY2F1c2VzIGFsbCB0ZXh0dXJlcyB0byBiZSBkZWxldGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYXIoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdm9pZCBzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0TWF4U2l6ZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0U2l6ZSgpOworCitwcml2YXRlOgorICAgIHZvaWQgZ2VuZXJhdGVUZXh0dXJlKFNrQml0bWFwKiBiaXRtYXAsIFRleHR1cmUqIHRleHR1cmUpOworCisgICAgR2VuZXJhdGlvbkNhY2hlPFNrU2hhZGVyKiwgVGV4dHVyZSo+IG1DYWNoZTsKKworICAgIHVpbnQzMl90IG1TaXplOworICAgIHVpbnQzMl90IG1NYXhTaXplOworCisgICAgLyoqCisgICAgICogVXNlZCB0byBhY2Nlc3MgbUNhY2hlIGFuZCBtU2l6ZS4gQWxsIG1ldGhvZHMgYXJlIGFjY2Vzc2VkIGZyb20gYSBzaW5nbGUKKyAgICAgKiB0aHJlYWQgZXhjZXB0IGZvciByZW1vdmUoKS4KKyAgICAgKi8KKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworfTsgLy8gY2xhc3MgR3JhZGllbnRDYWNoZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfR1JBRElFTlRfQ0FDSEVfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0xheWVyLmggYi9saWJzL2h3dWkvTGF5ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDI0NzY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0xheWVyLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9MQVlFUl9ICisjZGVmaW5lIEFORFJPSURfVUlfTEFZRVJfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgPFNrWGZlcm1vZGUuaD4KKworI2luY2x1ZGUgIlJlY3QuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvKioKKyAqIERpbWVuc2lvbnMgb2YgYSBsYXllci4KKyAqLworc3RydWN0IExheWVyU2l6ZSB7CisgICAgTGF5ZXJTaXplKCk6IHdpZHRoKDApLCBoZWlnaHQoMCkgeyB9CisgICAgTGF5ZXJTaXplKGNvbnN0IHVpbnQzMl90IHdpZHRoLCBjb25zdCB1aW50MzJfdCBoZWlnaHQpOiB3aWR0aCh3aWR0aCksIGhlaWdodChoZWlnaHQpIHsgfQorICAgIExheWVyU2l6ZShjb25zdCBMYXllclNpemUmIHNpemUpOiB3aWR0aChzaXplLndpZHRoKSwgaGVpZ2h0KHNpemUuaGVpZ2h0KSB7IH0KKworICAgIHVpbnQzMl90IHdpZHRoOworICAgIHVpbnQzMl90IGhlaWdodDsKKworICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IExheWVyU2l6ZSYgcmhzKSBjb25zdCB7CisgICAgICAgIGlmICh3aWR0aCA9PSByaHMud2lkdGgpIHsKKyAgICAgICAgICAgIHJldHVybiBoZWlnaHQgPCByaHMuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiB3aWR0aCA8IHJocy53aWR0aDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTGF5ZXJTaXplJiByaHMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHdpZHRoID09IHJocy53aWR0aCAmJiBoZWlnaHQgPT0gcmhzLmhlaWdodDsKKyAgICB9Cit9OyAvLyBzdHJ1Y3QgTGF5ZXJTaXplCisKKy8qKgorICogQSBsYXllciBoYXMgZGltZW5zaW9ucyBhbmQgaXMgYmFja2VkIGJ5IGFuIE9wZW5HTCB0ZXh0dXJlIG9yIEZCTy4KKyAqLworc3RydWN0IExheWVyIHsKKyAgICAvKioKKyAgICAgKiBDb29yZGluYXRlcyBvZiB0aGUgbGF5ZXIuCisgICAgICovCisgICAgUmVjdCBsYXllcjsKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSB0ZXh0dXJlIHVzZWQgdG8gcmVuZGVyIHRoZSBsYXllci4KKyAgICAgKi8KKyAgICBHTHVpbnQgdGV4dHVyZTsKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSBGQk8gdXNlZCB0byByZW5kZXIgdGhlIGxheWVyLiBJZiB0aGUgbmFtZSBpcyAwCisgICAgICogdGhpcyBsYXllciBpcyBub3QgYmFja2VkIGJ5IGFuIEZCTywgYnV0IGEgc2ltcGxlIHRleHR1cmUuCisgICAgICovCisgICAgR0x1aW50IGZibzsKKyAgICAvKioKKyAgICAgKiBPcGFjaXR5IG9mIHRoZSBsYXllci4KKyAgICAgKi8KKyAgICBpbnQgYWxwaGE7CisgICAgLyoqCisgICAgICogQmxlbmRpbmcgbW9kZSBvZiB0aGUgbGF5ZXIuCisgICAgICovCisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlOworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgbGF5ZXIgc2hvdWxkIGJlIGJsZW5kZWQuCisgICAgICovCisgICAgYm9vbCBibGVuZDsKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGxheWVyIGhhcyBiZWVuIHVzZWQgYWxyZWFkeS4KKyAgICAgKi8KKyAgICBib29sIGVtcHR5OworfTsgLy8gc3RydWN0IExheWVyCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9MQVlFUl9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTGF5ZXJDYWNoZS5jcHAgYi9saWJzL2h3dWkvTGF5ZXJDYWNoZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE4MzcxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9MYXllckNhY2hlLmNwcApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTGF5ZXJDYWNoZS5oIgorI2luY2x1ZGUgIlByb3BlcnRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitMYXllckNhY2hlOjpMYXllckNhY2hlKCk6CisgICAgICAgIG1DYWNoZShHZW5lcmF0aW9uQ2FjaGU8TGF5ZXJTaXplLCBMYXllcio+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtU2l6ZSgwKSwgbU1heFNpemUoTUIoREVGQVVMVF9MQVlFUl9DQUNIRV9TSVpFKSkgeworICAgIGNoYXIgcHJvcGVydHlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX0xBWUVSX0NBQ0hFX1NJWkUsIHByb3BlcnR5LCBOVUxMKSA+IDApIHsKKyAgICAgICAgTE9HRCgiICBTZXR0aW5nIGxheWVyIGNhY2hlIHNpemUgdG8gJXNNQiIsIHByb3BlcnR5KTsKKyAgICAgICAgc2V0TWF4U2l6ZShNQihhdG9mKHByb3BlcnR5KSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCBsYXllciBjYWNoZSBzaXplIG9mICUuMmZNQiIsIERFRkFVTFRfTEFZRVJfQ0FDSEVfU0laRSk7CisgICAgfQorfQorCitMYXllckNhY2hlOjpMYXllckNhY2hlKHVpbnQzMl90IG1heEJ5dGVTaXplKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxMYXllclNpemUsIExheWVyKj46OmtVbmxpbWl0ZWRDYXBhY2l0eSksCisgICAgICAgIG1TaXplKDApLCBtTWF4U2l6ZShtYXhCeXRlU2l6ZSkgeworfQorCitMYXllckNhY2hlOjp+TGF5ZXJDYWNoZSgpIHsKKyAgICBjbGVhcigpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTaXplIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWludDMyX3QgTGF5ZXJDYWNoZTo6Z2V0U2l6ZSgpIHsKKyAgICByZXR1cm4gbVNpemU7Cit9CisKK3VpbnQzMl90IExheWVyQ2FjaGU6OmdldE1heFNpemUoKSB7CisgICAgcmV0dXJuIG1NYXhTaXplOworfQorCit2b2lkIExheWVyQ2FjaGU6OnNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSkgeworICAgIG1NYXhTaXplID0gbWF4U2l6ZTsKKyAgICB3aGlsZSAobVNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICBMYXllciogb2xkZXN0ID0gbUNhY2hlLnJlbW92ZU9sZGVzdCgpOworICAgICAgICBkZWxldGVMYXllcihvbGRlc3QpOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FsbGJhY2tzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgTGF5ZXJDYWNoZTo6b3BlcmF0b3IoKShMYXllclNpemUmIHNpemUsIExheWVyKiYgbGF5ZXIpIHsKKyAgICBkZWxldGVMYXllcihsYXllcik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBMYXllckNhY2hlOjpkZWxldGVMYXllcihMYXllciogbGF5ZXIpIHsKKyAgICBpZiAobGF5ZXIpIHsKKyAgICAgICAgbVNpemUgLT0gbGF5ZXItPmxheWVyLmdldFdpZHRoKCkgKiBsYXllci0+bGF5ZXIuZ2V0SGVpZ2h0KCkgKiA0OworCisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJmxheWVyLT50ZXh0dXJlKTsKKyAgICAgICAgZGVsZXRlIGxheWVyOworICAgIH0KK30KKwordm9pZCBMYXllckNhY2hlOjpjbGVhcigpIHsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcih0aGlzKTsKKyAgICBtQ2FjaGUuY2xlYXIoKTsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcihOVUxMKTsKK30KKworTGF5ZXIqIExheWVyQ2FjaGU6OmdldChMYXllclNpemUmIHNpemUpIHsKKyAgICBMYXllciogbGF5ZXIgPSBtQ2FjaGUucmVtb3ZlKHNpemUpOworICAgIGlmIChsYXllcikgeworICAgICAgICBMQVlFUl9MT0dEKCJSZXVzaW5nIGxheWVyIik7CisKKyAgICAgICAgbVNpemUgLT0gbGF5ZXItPmxheWVyLmdldFdpZHRoKCkgKiBsYXllci0+bGF5ZXIuZ2V0SGVpZ2h0KCkgKiA0OworICAgIH0gZWxzZSB7CisgICAgICAgIExBWUVSX0xPR0QoIkNyZWF0aW5nIG5ldyBsYXllciIpOworCisgICAgICAgIGxheWVyID0gbmV3IExheWVyOworICAgICAgICBsYXllci0+YmxlbmQgPSB0cnVlOworICAgICAgICBsYXllci0+ZW1wdHkgPSB0cnVlOworICAgICAgICBsYXllci0+ZmJvID0gMDsKKworICAgICAgICBnbEdlblRleHR1cmVzKDEsICZsYXllci0+dGV4dHVyZSk7CisgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbGF5ZXItPnRleHR1cmUpOworCisgICAgICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgNCk7CisKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworCisjaWYgREVCVUdfTEFZRVJTCisgICAgICAgIHVpbnQzMl90IHNpemUgPSBtQ2FjaGUuc2l6ZSgpOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBMYXllclNpemUgbHMgPSBtQ2FjaGUuZ2V0S2V5QXQoaSk7CisgICAgICAgICAgICBMQVlFUl9MT0dEKCIgIExheWVyIHNpemUgJWR4JWQiLCBscy53aWR0aCwgbHMuaGVpZ2h0KTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgcmV0dXJuIGxheWVyOworfQorCitib29sIExheWVyQ2FjaGU6OnB1dChMYXllclNpemUmIGxheWVyU2l6ZSwgTGF5ZXIqIGxheWVyKSB7CisgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IGxheWVyU2l6ZS53aWR0aCAqIGxheWVyU2l6ZS5oZWlnaHQgKiA0OworICAgIC8vIERvbid0IGV2ZW4gdHJ5IHRvIGNhY2hlIGEgbGF5ZXIgdGhhdCdzIGJpZ2dlciB0aGFuIHRoZSBjYWNoZQorICAgIGlmIChzaXplIDwgbU1heFNpemUpIHsKKyAgICAgICAgd2hpbGUgKG1TaXplICsgc2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgICAgICBMYXllciogb2xkZXN0ID0gbUNhY2hlLnJlbW92ZU9sZGVzdCgpOworICAgICAgICAgICAgZGVsZXRlTGF5ZXIob2xkZXN0KTsKKyAgICAgICAgICAgIExBWUVSX0xPR0QoIiAgRGVsZXRpbmcgbGF5ZXIgJS4yZnglLjJmIiwgb2xkZXN0LT5sYXllci5nZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICBvbGRlc3QtPmxheWVyLmdldEhlaWdodCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIG1DYWNoZS5wdXQobGF5ZXJTaXplLCBsYXllcik7CisgICAgICAgIG1TaXplICs9IHNpemU7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTGF5ZXJDYWNoZS5oIGIvbGlicy9od3VpL0xheWVyQ2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmI3YWUyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0xheWVyQ2FjaGUuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9MQVlFUl9DQUNIRV9ICisjZGVmaW5lIEFORFJPSURfVUlfTEFZRVJfQ0FDSEVfSAorCisjaW5jbHVkZSAiTGF5ZXIuaCIKKyNpbmNsdWRlICJHZW5lcmF0aW9uQ2FjaGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWZpbmVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIERlYnVnCisjZGVmaW5lIERFQlVHX0xBWUVSUyAwCisKKy8vIERlYnVnCisjaWYgREVCVUdfTEFZRVJTCisgICAgI2RlZmluZSBMQVlFUl9MT0dEKC4uLikgTE9HRChfX1ZBX0FSR1NfXykKKyNlbHNlCisgICAgI2RlZmluZSBMQVlFUl9MT0dEKC4uLikKKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBMYXllckNhY2hlOiBwdWJsaWMgT25FbnRyeVJlbW92ZWQ8TGF5ZXJTaXplLCBMYXllcio+IHsKK3B1YmxpYzoKKyAgICBMYXllckNhY2hlKCk7CisgICAgTGF5ZXJDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk7CisgICAgfkxheWVyQ2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoTGF5ZXJTaXplJiBzaXplLCBMYXllciomIGxheWVyKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxheWVyIG9mIHNwZWNpZmllZCBkaW1lbnNpb25zLiBJZiBub3Qgc3VpdGFibGUgbGF5ZXIKKyAgICAgKiBjYW4gYmUgZm91bmQsIGEgbmV3IG9uZSBpcyBjcmVhdGVkIGFuZCByZXR1cm5lZC4gSWYgY3JlYXRpbmcgYSBuZXcKKyAgICAgKiBsYXllciBmYWlscywgTlVMTCBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIFdoZW4gYSBsYXllciBpcyBvYnRhaW5lZCBmcm9tIHRoZSBjYWNoZSwgaXQgaXMgcmVtb3ZlZCBhbmQgdGhlIHRvdGFsCisgICAgICogc2l6ZSBvZiB0aGUgY2FjaGUgZ29lcyBkb3duLgorICAgICAqCisgICAgICogQHBhcmFtIHNpemUgVGhlIGRpbWVuc2lvbnMgb2YgdGhlIGRlc2lyZWQgbGF5ZXIKKyAgICAgKi8KKyAgICBMYXllciogZ2V0KExheWVyU2l6ZSYgc2l6ZSk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBsYXllciB0byB0aGUgY2FjaGUuIFRoZSBsYXllciB3aWxsIG5vdCBiZSBhZGRlZCBpZiB0aGVyZSBpcworICAgICAqIG5vdCBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIHNpemUgVGhlIGRpbWVuc2lvbnMgb2YgdGhlIGxheWVyCisgICAgICogQHBhcmFtIGxheWVyIFRoZSBsYXllciB0byBhZGQgdG8gdGhlIGNhY2hlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGxheWVyIHdhcyBhZGRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgcHV0KExheWVyU2l6ZSYgc2l6ZSwgTGF5ZXIqIGxheWVyKTsKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIGNhY2hlLiBUaGlzIGNhdXNlcyBhbGwgbGF5ZXJzIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRNYXhTaXplKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRTaXplKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBkZWxldGVMYXllcihMYXllciogbGF5ZXIpOworCisgICAgR2VuZXJhdGlvbkNhY2hlPExheWVyU2l6ZSwgTGF5ZXIqPiBtQ2FjaGU7CisKKyAgICB1aW50MzJfdCBtU2l6ZTsKKyAgICB1aW50MzJfdCBtTWF4U2l6ZTsKK307IC8vIGNsYXNzIExheWVyQ2FjaGUKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX0xBWUVSX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9MaW5lLmggYi9saWJzL2h3dWkvTGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YmRkNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTGluZS5oCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0xJTkVfSAorI2RlZmluZSBBTkRST0lEX1VJX0xJTkVfSAorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlIDxjbWF0aD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiUGF0Y2guaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBHbG9iYWxzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIEFscGhhOCB0ZXh0dXJlIHVzZWQgdG8gcGVyZm9ybSB0ZXh0dXJlIGFudGktYWxpYXNpbmcKK3N0YXRpYyBjb25zdCB1aW50OF90IGdMaW5lVGV4dHVyZVtdID0geworICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAwLAorICAgICAgICAwLCAyNTUsIDI1NSwgMjU1LCAwLAorICAgICAgICAwLCAyNTUsIDI1NSwgMjU1LCAwLAorICAgICAgICAwLCAyNTUsIDI1NSwgMjU1LCAwLAorICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAwCit9Oworc3RhdGljIGNvbnN0IEdMc2l6ZWkgZ0xpbmVUZXh0dXJlV2lkdGggPSA1Oworc3RhdGljIGNvbnN0IEdMc2l6ZWkgZ0xpbmVUZXh0dXJlSGVpZ2h0ID0gNTsKK3N0YXRpYyBjb25zdCBmbG9hdCBnTGluZUFBQmlhcyA9IDEuMGY7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIExpbmUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgTGluZSB7CitwdWJsaWM6CisgICAgTGluZSgpOiBtWERpdnNDb3VudCgyKSwgbVlEaXZzQ291bnQoMikgeworICAgICAgICBtUGF0Y2ggPSBuZXcgUGF0Y2gobVhEaXZzQ291bnQsIG1ZRGl2c0NvdW50KTsKKyAgICAgICAgbVhEaXZzID0gbmV3IGludDMyX3RbbVhEaXZzQ291bnRdOworICAgICAgICBtWURpdnMgPSBuZXcgaW50MzJfdFttWURpdnNDb3VudF07CisKKyAgICAgICAgbVhEaXZzWzBdID0gbVlEaXZzWzBdID0gMjsKKyAgICAgICAgbVhEaXZzWzFdID0gbVlEaXZzWzFdID0gMzsKKworICAgICAgICBnbEdlblRleHR1cmVzKDEsICZtVGV4dHVyZSk7CisgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbVRleHR1cmUpOworCisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKKworICAgICAgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDEpOworICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfQUxQSEEsIGdMaW5lVGV4dHVyZVdpZHRoLCBnTGluZVRleHR1cmVIZWlnaHQsIDAsCisgICAgICAgICAgICAgICAgR0xfQUxQSEEsIEdMX1VOU0lHTkVEX0JZVEUsIGdMaW5lVGV4dHVyZSk7CisgICAgfQorCisgICAgfkxpbmUoKSB7CisgICAgICAgIGRlbGV0ZSBtUGF0Y2g7CisgICAgICAgIGRlbGV0ZVtdIG1YRGl2czsKKyAgICAgICAgZGVsZXRlW10gbVlEaXZzOworCisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJm1UZXh0dXJlKTsKKyAgICB9CisKKyAgICBpbmxpbmUgZmxvYXQgZ2V0TGVuZ3RoKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyKSB7CisgICAgICAgIHJldHVybiBzcXJ0ZigoeDIgLSB4MSkgKiAoeDIgLSB4MSkgKyAoeTIgLSB5MSkgKiAoeTIgLSB5MSkpOworICAgIH0KKworICAgIHZvaWQgdXBkYXRlKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCBsaW5lV2lkdGgsIGZsb2F0JiB0eCwgZmxvYXQmIHR5KSB7CisgICAgICAgIGNvbnN0IGZsb2F0IGxlbmd0aCA9IGdldExlbmd0aCh4MSwgeTEsIHgyLCB5Mik7CisgICAgICAgIGNvbnN0IGZsb2F0IGhhbGYgPSBsaW5lV2lkdGggKiAwLjVmOworCisgICAgICAgIG1QYXRjaC0+dXBkYXRlVmVydGljZXMoZ0xpbmVUZXh0dXJlV2lkdGgsIGdMaW5lVGV4dHVyZUhlaWdodCwKKyAgICAgICAgICAgICAgICAtZ0xpbmVBQUJpYXMsIC1oYWxmIC0gZ0xpbmVBQUJpYXMsIGxlbmd0aCArIGdMaW5lQUFCaWFzLCBoYWxmICsgZ0xpbmVBQUJpYXMsCisgICAgICAgICAgICAgICAgbVhEaXZzLCBtWURpdnMsIG1YRGl2c0NvdW50LCBtWURpdnNDb3VudCk7CisKKyAgICAgICAgdHggPSAtZ0xpbmVBQUJpYXM7CisgICAgICAgIHR5ID0gbGluZVdpZHRoIDw9IDEuMGYgPyAtZ0xpbmVBQUJpYXMgOiAtaGFsZiAtIGdMaW5lQUFCaWFzOworICAgIH0KKworICAgIGlubGluZSBHTHZvaWQqIGdldFZlcnRpY2VzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gJm1QYXRjaC0+dmVydGljZXNbMF0ucG9zaXRpb25bMF07CisgICAgfQorCisgICAgaW5saW5lIEdMdm9pZCogZ2V0VGV4Q29vcmRzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gJm1QYXRjaC0+dmVydGljZXNbMF0udGV4dHVyZVswXTsKKyAgICB9CisKKyAgICBpbmxpbmUgR0xzaXplaSBnZXRFbGVtZW50c0NvdW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVBhdGNoLT52ZXJ0aWNlc0NvdW50OworICAgIH0KKworICAgIGlubGluZSBHTHVpbnQgZ2V0VGV4dHVyZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UZXh0dXJlOworICAgIH0KKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtWERpdnNDb3VudDsKKyAgICB1aW50MzJfdCBtWURpdnNDb3VudDsKKworICAgIGludDMyX3QqIG1YRGl2czsKKyAgICBpbnQzMl90KiBtWURpdnM7CisKKyAgICBQYXRjaCogbVBhdGNoOworCisgICAgR0x1aW50IG1UZXh0dXJlOworfTsgLy8gY2xhc3MgTGluZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfTElORV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnMvaHd1aS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL01hdHJpeC5jcHAgYi9saWJzL2h3dWkvTWF0cml4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTlmZDVlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL01hdHJpeC5jcHAKQEAgLTAsMCArMSwzMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxTa01hdHJpeC5oPgorCisjaW5jbHVkZSAiTWF0cml4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKwordm9pZCBNYXRyaXg0Ojpsb2FkSWRlbnRpdHkoKSB7CisgICAgZGF0YVtrU2NhbGVYXSAgICAgICA9IDEuMGY7CisgICAgZGF0YVtrU2tld1ldICAgICAgICA9IDAuMGY7CisgICAgZGF0YVsyXSAgICAgICAgICAgICA9IDAuMGY7CisgICAgZGF0YVtrUGVyc3BlY3RpdmUwXSA9IDAuMGY7CisKKyAgICBkYXRhW2tTa2V3WF0gICAgICAgID0gMC4wZjsKKyAgICBkYXRhW2tTY2FsZVldICAgICAgID0gMS4wZjsKKyAgICBkYXRhWzZdICAgICAgICAgICAgID0gMC4wZjsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTFdID0gMC4wZjsKKworICAgIGRhdGFbOF0gICAgICAgICAgICAgPSAwLjBmOworICAgIGRhdGFbOV0gICAgICAgICAgICAgPSAwLjBmOworICAgIGRhdGFba1NjYWxlWl0gICAgICAgPSAxLjBmOworICAgIGRhdGFbMTFdICAgICAgICAgICAgPSAwLjBmOworCisgICAgZGF0YVtrVHJhbnNsYXRlWF0gICA9IDAuMGY7CisgICAgZGF0YVtrVHJhbnNsYXRlWV0gICA9IDAuMGY7CisgICAgZGF0YVtrVHJhbnNsYXRlWl0gICA9IDAuMGY7CisgICAgZGF0YVtrUGVyc3BlY3RpdmUyXSA9IDEuMGY7CisKKyAgICBtU2ltcGxlTWF0cml4ID0gdHJ1ZTsKK30KKworI2RlZmluZSBFUFNJTE9OIDAuMDAwMDFmCisjZGVmaW5lIGFsbW9zdCh1LCB2KSAoZmFicygodSkgLSAodikpIDwgRVBTSUxPTikKKworYm9vbCBNYXRyaXg0OjpjaGFuZ2VzQm91bmRzKCkgeworICAgIHJldHVybiAhKGFsbW9zdChkYXRhWzBdLCAxLjBmKSAmJiBhbG1vc3QoZGF0YVsxXSwgMC4wZikgJiYgYWxtb3N0KGRhdGFbMl0sIDAuMGYpICYmCisgICAgICAgICAgICAgYWxtb3N0KGRhdGFbNF0sIDAuMGYpICYmIGFsbW9zdChkYXRhWzVdLCAxLjBmKSAmJiBhbG1vc3QoZGF0YVs2XSwgMC4wZikgJiYKKyAgICAgICAgICAgICBhbG1vc3QoZGF0YVs4XSwgMC4wZikgJiYgYWxtb3N0KGRhdGFbOV0sIDAuMGYpICYmIGFsbW9zdChkYXRhWzEwXSwgMS4wZikpOworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWQoY29uc3QgZmxvYXQqIHYpIHsKKyAgICBtZW1jcHkoZGF0YSwgdiwgc2l6ZW9mKGRhdGEpKTsKKyAgICBtU2ltcGxlTWF0cml4ID0gZmFsc2U7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZChjb25zdCBNYXRyaXg0JiB2KSB7CisgICAgbWVtY3B5KGRhdGEsIHYuZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICBtU2ltcGxlTWF0cml4ID0gdi5tU2ltcGxlTWF0cml4OworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWQoY29uc3QgU2tNYXRyaXgmIHYpIHsKKyAgICBtZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKworICAgIGRhdGFba1NjYWxlWF0gICAgID0gdltTa01hdHJpeDo6a01TY2FsZVhdOworICAgIGRhdGFba1NrZXdYXSAgICAgID0gdltTa01hdHJpeDo6a01Ta2V3WF07CisgICAgZGF0YVtrVHJhbnNsYXRlWF0gPSB2W1NrTWF0cml4OjprTVRyYW5zWF07CisKKyAgICBkYXRhW2tTa2V3WV0gICAgICA9IHZbU2tNYXRyaXg6OmtNU2tld1ldOworICAgIGRhdGFba1NjYWxlWV0gICAgID0gdltTa01hdHJpeDo6a01TY2FsZVldOworICAgIGRhdGFba1RyYW5zbGF0ZVldID0gdltTa01hdHJpeDo6a01UcmFuc1ldOworCisgICAgZGF0YVtrUGVyc3BlY3RpdmUwXSAgPSB2W1NrTWF0cml4OjprTVBlcnNwMF07CisgICAgZGF0YVtrUGVyc3BlY3RpdmUxXSAgPSB2W1NrTWF0cml4OjprTVBlcnNwMV07CisgICAgZGF0YVtrUGVyc3BlY3RpdmUyXSAgPSB2W1NrTWF0cml4OjprTVBlcnNwMl07CisKKyAgICBkYXRhW2tTY2FsZVpdID0gMS4wZjsKKworICAgIG1TaW1wbGVNYXRyaXggPSAodi5nZXRUeXBlKCkgPD0gU2tNYXRyaXg6OmtTY2FsZV9NYXNrKTsKK30KKwordm9pZCBNYXRyaXg0Ojpjb3B5VG8oU2tNYXRyaXgmIHYpIGNvbnN0IHsKKyAgICB2LnJlc2V0KCk7CisKKyAgICB2LnNldChTa01hdHJpeDo6a01TY2FsZVgsIGRhdGFba1NjYWxlWF0pOworICAgIHYuc2V0KFNrTWF0cml4OjprTVNrZXdYLCAgZGF0YVtrU2tld1hdKTsKKyAgICB2LnNldChTa01hdHJpeDo6a01UcmFuc1gsIGRhdGFba1RyYW5zbGF0ZVhdKTsKKworICAgIHYuc2V0KFNrTWF0cml4OjprTVNrZXdZLCAgZGF0YVtrU2tld1ldKTsKKyAgICB2LnNldChTa01hdHJpeDo6a01TY2FsZVksIGRhdGFba1NjYWxlWV0pOworICAgIHYuc2V0KFNrTWF0cml4OjprTVRyYW5zWSwgZGF0YVtrVHJhbnNsYXRlWV0pOworCisgICAgdi5zZXQoU2tNYXRyaXg6OmtNUGVyc3AwLCBkYXRhW2tQZXJzcGVjdGl2ZTBdKTsKKyAgICB2LnNldChTa01hdHJpeDo6a01QZXJzcDEsIGRhdGFba1BlcnNwZWN0aXZlMV0pOworICAgIHYuc2V0KFNrTWF0cml4OjprTVBlcnNwMiwgZGF0YVtrUGVyc3BlY3RpdmUyXSk7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZEludmVyc2UoY29uc3QgTWF0cml4NCYgdikgeworICAgIGRvdWJsZSBzY2FsZSA9IDEuMCAvCisgICAgICAgICAgICAodi5kYXRhW2tTY2FsZVhdICogKChkb3VibGUpIHYuZGF0YVtrU2NhbGVZXSAgKiB2LmRhdGFba1BlcnNwZWN0aXZlMl0gLQorICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSB2LmRhdGFba1RyYW5zbGF0ZVldICogdi5kYXRhW2tQZXJzcGVjdGl2ZTFdKSArCisgICAgICAgICAgICAgdi5kYXRhW2tTa2V3WF0gKiAoKGRvdWJsZSkgdi5kYXRhW2tUcmFuc2xhdGVZXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUwXSAtCisgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSB2LmRhdGFba1NrZXdZXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUyXSkgKworICAgICAgICAgICAgIHYuZGF0YVtrVHJhbnNsYXRlWF0gKiAoKGRvdWJsZSkgdi5kYXRhW2tTa2V3WV0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMV0gLQorICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgdi5kYXRhW2tTY2FsZVldICogdi5kYXRhW2tQZXJzcGVjdGl2ZTBdKSk7CisKKyAgICBkYXRhW2tTY2FsZVhdID0gKHYuZGF0YVtrU2NhbGVZXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUyXSAtCisgICAgICAgICAgICB2LmRhdGFba1RyYW5zbGF0ZVldICogdi5kYXRhW2tQZXJzcGVjdGl2ZTFdKSAgKiBzY2FsZTsKKyAgICBkYXRhW2tTa2V3WF0gPSAodi5kYXRhW2tUcmFuc2xhdGVYXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUxXSAtCisgICAgICAgICAgICB2LmRhdGFba1NrZXdYXSAgKiB2LmRhdGFba1BlcnNwZWN0aXZlMl0pICogc2NhbGU7CisgICAgZGF0YVtrVHJhbnNsYXRlWF0gPSAodi5kYXRhW2tTa2V3WF0gKiB2LmRhdGFba1RyYW5zbGF0ZVldIC0KKyAgICAgICAgICAgIHYuZGF0YVtrVHJhbnNsYXRlWF0gKiB2LmRhdGFba1NjYWxlWV0pICAqIHNjYWxlOworCisgICAgZGF0YVtrU2tld1ldID0gKHYuZGF0YVtrVHJhbnNsYXRlWV0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMF0gLQorICAgICAgICAgICAgdi5kYXRhW2tTa2V3WV0gICogdi5kYXRhW2tQZXJzcGVjdGl2ZTJdKSAqIHNjYWxlOworICAgIGRhdGFba1NjYWxlWV0gPSAodi5kYXRhW2tTY2FsZVhdICogdi5kYXRhW2tQZXJzcGVjdGl2ZTJdIC0KKyAgICAgICAgICAgIHYuZGF0YVtrVHJhbnNsYXRlWF0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMF0pICAqIHNjYWxlOworICAgIGRhdGFba1RyYW5zbGF0ZVldID0gKHYuZGF0YVtrVHJhbnNsYXRlWF0gKiB2LmRhdGFba1NrZXdZXSAtCisgICAgICAgICAgICB2LmRhdGFba1NjYWxlWF0gICogdi5kYXRhW2tUcmFuc2xhdGVZXSkgKiBzY2FsZTsKKworICAgIGRhdGFba1BlcnNwZWN0aXZlMF0gPSAodi5kYXRhW2tTa2V3WV0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMV0gLQorICAgICAgICAgICAgdi5kYXRhW2tTY2FsZVldICogdi5kYXRhW2tQZXJzcGVjdGl2ZTBdKSAqIHNjYWxlOworICAgIGRhdGFba1BlcnNwZWN0aXZlMV0gPSAodi5kYXRhW2tTa2V3WF0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMF0gLQorICAgICAgICAgICAgdi5kYXRhW2tTY2FsZVhdICogdi5kYXRhW2tQZXJzcGVjdGl2ZTFdKSAqIHNjYWxlOworICAgIGRhdGFba1BlcnNwZWN0aXZlMl0gPSAodi5kYXRhW2tTY2FsZVhdICogdi5kYXRhW2tTY2FsZVldIC0KKyAgICAgICAgICAgIHYuZGF0YVtrU2tld1hdICogdi5kYXRhW2tTa2V3WV0pICogc2NhbGU7CisKKyAgICBtU2ltcGxlTWF0cml4ID0gdi5tU2ltcGxlTWF0cml4OworfQorCit2b2lkIE1hdHJpeDQ6OmNvcHlUbyhmbG9hdCogdikgY29uc3QgeworICAgIG1lbWNweSh2LCBkYXRhLCBzaXplb2YoZGF0YSkpOworfQorCitmbG9hdCBNYXRyaXg0OjpnZXRUcmFuc2xhdGVYKCkgeworICAgIHJldHVybiBkYXRhW2tUcmFuc2xhdGVYXTsKK30KKworZmxvYXQgTWF0cml4NDo6Z2V0VHJhbnNsYXRlWSgpIHsKKyAgICByZXR1cm4gZGF0YVtrVHJhbnNsYXRlWV07Cit9CisKK3ZvaWQgTWF0cml4NDo6bXVsdGlwbHkoZmxvYXQgdikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICBkYXRhW2ldICo9IHY7CisgICAgfQorfQorCit2b2lkIE1hdHJpeDQ6OmxvYWRUcmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIGxvYWRJZGVudGl0eSgpOworICAgIGRhdGFba1RyYW5zbGF0ZVhdID0geDsKKyAgICBkYXRhW2tUcmFuc2xhdGVZXSA9IHk7CisgICAgZGF0YVtrVHJhbnNsYXRlWl0gPSB6OworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWRTY2FsZShmbG9hdCBzeCwgZmxvYXQgc3ksIGZsb2F0IHN6KSB7CisgICAgbG9hZElkZW50aXR5KCk7CisgICAgZGF0YVtrU2NhbGVYXSA9IHN4OworICAgIGRhdGFba1NjYWxlWV0gPSBzeTsKKyAgICBkYXRhW2tTY2FsZVpdID0gc3o7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZFJvdGF0ZShmbG9hdCBhbmdsZSwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIGRhdGFba1BlcnNwZWN0aXZlMF0gID0gMC4wZjsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTFdICA9IDAuMGY7CisgICAgZGF0YVsxMV0gICAgICAgICAgICAgPSAwLjBmOworICAgIGRhdGFba1RyYW5zbGF0ZVhdICAgID0gMC4wZjsKKyAgICBkYXRhW2tUcmFuc2xhdGVZXSAgICA9IDAuMGY7CisgICAgZGF0YVtrVHJhbnNsYXRlWl0gICAgPSAwLjBmOworICAgIGRhdGFba1BlcnNwZWN0aXZlMl0gID0gMS4wZjsKKworICAgIGFuZ2xlICo9IGZsb2F0KE1fUEkgLyAxODAuMGYpOworICAgIGZsb2F0IGMgPSBjb3NmKGFuZ2xlKTsKKyAgICBmbG9hdCBzID0gc2luZihhbmdsZSk7CisKKyAgICBjb25zdCBmbG9hdCBsZW5ndGggPSBzcXJ0Zih4ICogeCArIHkgKiB5ICsgeiAqIHopOworICAgIGZsb2F0IHJlY2lwTGVuID0gMS4wZiAvIGxlbmd0aDsKKyAgICB4ICo9IHJlY2lwTGVuOworICAgIHkgKj0gcmVjaXBMZW47CisgICAgeiAqPSByZWNpcExlbjsKKworICAgIGNvbnN0IGZsb2F0IG5jID0gMS4wZiAtIGM7CisgICAgY29uc3QgZmxvYXQgeHkgPSB4ICogeTsKKyAgICBjb25zdCBmbG9hdCB5eiA9IHkgKiB6OworICAgIGNvbnN0IGZsb2F0IHp4ID0geiAqIHg7CisgICAgY29uc3QgZmxvYXQgeHMgPSB4ICogczsKKyAgICBjb25zdCBmbG9hdCB5cyA9IHkgKiBzOworICAgIGNvbnN0IGZsb2F0IHpzID0geiAqIHM7CisKKyAgICBkYXRhW2tTY2FsZVhdID0geCAqIHggKiBuYyArICBjOworICAgIGRhdGFba1NrZXdYXSAgPSAgICB4eSAqIG5jIC0genM7CisgICAgZGF0YVs4XSAgICAgICA9ICAgIHp4ICogbmMgKyB5czsKKyAgICBkYXRhW2tTa2V3WV0gID0gICAgeHkgKiBuYyArIHpzOworICAgIGRhdGFba1NjYWxlWV0gPSB5ICogeSAqIG5jICsgIGM7CisgICAgZGF0YVs5XSAgICAgICA9ICAgIHl6ICogbmMgLSB4czsKKyAgICBkYXRhWzJdICAgICAgID0gICAgenggKiBuYyAtIHlzOworICAgIGRhdGFbNl0gICAgICAgPSAgICB5eiAqIG5jICsgeHM7CisgICAgZGF0YVtrU2NhbGVaXSA9IHogKiB6ICogbmMgKyAgYzsKKworICAgIG1TaW1wbGVNYXRyaXggPSBmYWxzZTsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkTXVsdGlwbHkoY29uc3QgTWF0cml4NCYgdSwgY29uc3QgTWF0cml4NCYgdikgeworICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IDQgOyBpKyspIHsKKyAgICAgICAgZmxvYXQgeCA9IDA7CisgICAgICAgIGZsb2F0IHkgPSAwOworICAgICAgICBmbG9hdCB6ID0gMDsKKyAgICAgICAgZmxvYXQgdyA9IDA7CisKKyAgICAgICAgZm9yIChpbnQgaiA9IDAgOyBqIDwgNCA7IGorKykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgZSA9IHYuZ2V0KGksIGopOworICAgICAgICAgICAgeCArPSB1LmdldChqLCAwKSAqIGU7CisgICAgICAgICAgICB5ICs9IHUuZ2V0KGosIDEpICogZTsKKyAgICAgICAgICAgIHogKz0gdS5nZXQoaiwgMikgKiBlOworICAgICAgICAgICAgdyArPSB1LmdldChqLCAzKSAqIGU7CisgICAgICAgIH0KKworICAgICAgICBzZXQoaSwgMCwgeCk7CisgICAgICAgIHNldChpLCAxLCB5KTsKKyAgICAgICAgc2V0KGksIDIsIHopOworICAgICAgICBzZXQoaSwgMywgdyk7CisgICAgfQorCisgICAgbVNpbXBsZU1hdHJpeCA9IHUubVNpbXBsZU1hdHJpeCAmJiB2Lm1TaW1wbGVNYXRyaXg7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZE9ydGhvKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGZsb2F0IHRvcCwgZmxvYXQgbmVhciwgZmxvYXQgZmFyKSB7CisgICAgbG9hZElkZW50aXR5KCk7CisgICAgZGF0YVtrU2NhbGVYXSA9IDIuMGYgLyAocmlnaHQgLSBsZWZ0KTsKKyAgICBkYXRhW2tTY2FsZVldID0gMi4wZiAvICh0b3AgLSBib3R0b20pOworICAgIGRhdGFba1NjYWxlWl0gPSAtMi4wZiAvIChmYXIgLSBuZWFyKTsKKyAgICBkYXRhW2tUcmFuc2xhdGVYXSA9IC0ocmlnaHQgKyBsZWZ0KSAvIChyaWdodCAtIGxlZnQpOworICAgIGRhdGFba1RyYW5zbGF0ZVldID0gLSh0b3AgKyBib3R0b20pIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgZGF0YVtrVHJhbnNsYXRlWl0gPSAtKGZhciArIG5lYXIpIC8gKGZhciAtIG5lYXIpOworfQorCisjZGVmaW5lIE1VTF9BRERfU1RPUkUoYSwgYiwgYykgYSA9IChhKSAqIChiKSArIChjKQorCit2b2lkIE1hdHJpeDQ6Om1hcFBvaW50KGZsb2F0JiB4LCBmbG9hdCYgeSkgY29uc3QgeworICAgIGlmIChtU2ltcGxlTWF0cml4KSB7CisgICAgICAgIE1VTF9BRERfU1RPUkUoeCwgZGF0YVtrU2NhbGVYXSwgZGF0YVtrVHJhbnNsYXRlWF0pOworICAgICAgICBNVUxfQUREX1NUT1JFKHksIGRhdGFba1NjYWxlWV0sIGRhdGFba1RyYW5zbGF0ZVldKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZsb2F0IGR4ID0geCAqIGRhdGFba1NjYWxlWF0gKyB5ICogZGF0YVtrU2tld1hdICsgZGF0YVtrVHJhbnNsYXRlWF07CisgICAgZmxvYXQgZHkgPSB4ICogZGF0YVtrU2tld1ldICsgeSAqIGRhdGFba1NjYWxlWV0gKyBkYXRhW2tUcmFuc2xhdGVZXTsKKyAgICBmbG9hdCBkeiA9IHggKiBkYXRhW2tQZXJzcGVjdGl2ZTBdICsgeSAqIGRhdGFba1BlcnNwZWN0aXZlMV0gKyBkYXRhW2tQZXJzcGVjdGl2ZTJdOworICAgIGlmIChkeikgZHogPSAxLjBmIC8gZHo7CisKKyAgICB4ID0gZHggKiBkejsKKyAgICB5ID0gZHkgKiBkejsKK30KKwordm9pZCBNYXRyaXg0OjptYXBSZWN0KFJlY3QmIHIpIGNvbnN0IHsKKyAgICBpZiAobVNpbXBsZU1hdHJpeCkgeworICAgICAgICBNVUxfQUREX1NUT1JFKHIubGVmdCwgZGF0YVtrU2NhbGVYXSwgZGF0YVtrVHJhbnNsYXRlWF0pOworICAgICAgICBNVUxfQUREX1NUT1JFKHIucmlnaHQsIGRhdGFba1NjYWxlWF0sIGRhdGFba1RyYW5zbGF0ZVhdKTsKKyAgICAgICAgTVVMX0FERF9TVE9SRShyLnRvcCwgZGF0YVtrU2NhbGVZXSwgZGF0YVtrVHJhbnNsYXRlWV0pOworICAgICAgICBNVUxfQUREX1NUT1JFKHIuYm90dG9tLCBkYXRhW2tTY2FsZVldLCBkYXRhW2tUcmFuc2xhdGVZXSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmbG9hdCB2ZXJ0aWNlc1tdID0geworICAgICAgICByLmxlZnQsIHIudG9wLAorICAgICAgICByLnJpZ2h0LCByLnRvcCwKKyAgICAgICAgci5yaWdodCwgci5ib3R0b20sCisgICAgICAgIHIubGVmdCwgci5ib3R0b20KKyAgICB9OworCisgICAgZmxvYXQgeCwgeSwgejsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSs9IDIpIHsKKyAgICAgICAgZmxvYXQgcHggPSB2ZXJ0aWNlc1tpXTsKKyAgICAgICAgZmxvYXQgcHkgPSB2ZXJ0aWNlc1tpICsgMV07CisKKyAgICAgICAgeCA9IHB4ICogZGF0YVtrU2NhbGVYXSArIHB5ICogZGF0YVtrU2tld1hdICsgZGF0YVtrVHJhbnNsYXRlWF07CisgICAgICAgIHkgPSBweCAqIGRhdGFba1NrZXdZXSArIHB5ICogZGF0YVtrU2NhbGVZXSArIGRhdGFba1RyYW5zbGF0ZVldOworICAgICAgICB6ID0gcHggKiBkYXRhW2tQZXJzcGVjdGl2ZTBdICsgcHkgKiBkYXRhW2tQZXJzcGVjdGl2ZTFdICsgZGF0YVtrUGVyc3BlY3RpdmUyXTsKKyAgICAgICAgaWYgKHopIHogPSAxLjBmIC8gejsKKworICAgICAgICB2ZXJ0aWNlc1tpXSA9IHggKiB6OworICAgICAgICB2ZXJ0aWNlc1tpICsgMV0gPSB5ICogejsKKyAgICB9CisKKyAgICByLmxlZnQgPSByLnJpZ2h0ID0gdmVydGljZXNbMF07CisgICAgci50b3AgPSByLmJvdHRvbSA9IHZlcnRpY2VzWzFdOworCisgICAgZm9yIChpbnQgaSA9IDI7IGkgPCA4OyBpICs9IDIpIHsKKyAgICAgICAgeCA9IHZlcnRpY2VzW2ldOworICAgICAgICB5ID0gdmVydGljZXNbaSArIDFdOworCisgICAgICAgIGlmICh4IDwgci5sZWZ0KSByLmxlZnQgPSB4OworICAgICAgICBlbHNlIGlmICh4ID4gci5yaWdodCkgci5yaWdodCA9IHg7CisgICAgICAgIGlmICh5IDwgci50b3ApIHIudG9wID0geTsKKyAgICAgICAgZWxzZSBpZiAoeSA+IHIuYm90dG9tKSByLmJvdHRvbSA9IHk7CisgICAgfQorfQorCit2b2lkIE1hdHJpeDQ6OmR1bXAoKSBjb25zdCB7CisgICAgTE9HRCgiTWF0cml4NFtzaW1wbGU9JWQiLCBtU2ltcGxlTWF0cml4KTsKKyAgICBMT0dEKCIgICVmICVmICVmICVmIiwgZGF0YVtrU2NhbGVYXSwgZGF0YVtrU2tld1hdLCBkYXRhWzhdLCBkYXRhW2tUcmFuc2xhdGVYXSk7CisgICAgTE9HRCgiICAlZiAlZiAlZiAlZiIsIGRhdGFba1NrZXdZXSwgZGF0YVtrU2NhbGVZXSwgZGF0YVs5XSwgZGF0YVtrVHJhbnNsYXRlWV0pOworICAgIExPR0QoIiAgJWYgJWYgJWYgJWYiLCBkYXRhWzJdLCBkYXRhWzZdLCBkYXRhW2tTY2FsZVpdLCBkYXRhW2tUcmFuc2xhdGVaXSk7CisgICAgTE9HRCgiICAlZiAlZiAlZiAlZiIsIGRhdGFba1BlcnNwZWN0aXZlMF0sIGRhdGFba1BlcnNwZWN0aXZlMV0sIGRhdGFbMTFdLCBkYXRhW2tQZXJzcGVjdGl2ZTJdKTsKKyAgICBMT0dEKCJdIik7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL01hdHJpeC5oIGIvbGlicy9od3VpL01hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlODExNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTWF0cml4LmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfTUFUUklYX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9NQVRSSVhfSAorCisjaW5jbHVkZSA8U2tNYXRyaXguaD4KKworI2luY2x1ZGUgIlJlY3QuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDbGFzc2VzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIE1hdHJpeDQgeworcHVibGljOgorICAgIGZsb2F0IGRhdGFbMTZdOworCisgICAgZW51bSBFbnRyeSB7CisgICAgICAgIGtTY2FsZVggPSAwLAorICAgICAgICBrU2tld1kgPSAxLAorICAgICAgICBrUGVyc3BlY3RpdmUwID0gMywKKyAgICAgICAga1NrZXdYID0gNCwKKyAgICAgICAga1NjYWxlWSA9IDUsCisgICAgICAgIGtQZXJzcGVjdGl2ZTEgPSA3LAorICAgICAgICBrU2NhbGVaID0gMTAsCisgICAgICAgIGtUcmFuc2xhdGVYID0gMTIsCisgICAgICAgIGtUcmFuc2xhdGVZID0gMTMsCisgICAgICAgIGtUcmFuc2xhdGVaID0gMTQsCisgICAgICAgIGtQZXJzcGVjdGl2ZTIgPSAxNQorICAgIH07CisKKyAgICBNYXRyaXg0KCkgeworICAgICAgICBsb2FkSWRlbnRpdHkoKTsKKyAgICB9CisKKyAgICBNYXRyaXg0KGNvbnN0IGZsb2F0KiB2KSB7CisgICAgICAgIGxvYWQodik7CisgICAgfQorCisgICAgTWF0cml4NChjb25zdCBNYXRyaXg0JiB2KSB7CisgICAgICAgIGxvYWQodik7CisgICAgfQorCisgICAgTWF0cml4NChjb25zdCBTa01hdHJpeCYgdikgeworICAgICAgICBsb2FkKHYpOworICAgIH0KKworICAgIHZvaWQgbG9hZElkZW50aXR5KCk7CisKKyAgICB2b2lkIGxvYWQoY29uc3QgZmxvYXQqIHYpOworICAgIHZvaWQgbG9hZChjb25zdCBNYXRyaXg0JiB2KTsKKyAgICB2b2lkIGxvYWQoY29uc3QgU2tNYXRyaXgmIHYpOworCisgICAgdm9pZCBsb2FkSW52ZXJzZShjb25zdCBNYXRyaXg0JiB2KTsKKworICAgIHZvaWQgbG9hZFRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKKyAgICB2b2lkIGxvYWRTY2FsZShmbG9hdCBzeCwgZmxvYXQgc3ksIGZsb2F0IHN6KTsKKyAgICB2b2lkIGxvYWRSb3RhdGUoZmxvYXQgYW5nbGUsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopOworICAgIHZvaWQgbG9hZE11bHRpcGx5KGNvbnN0IE1hdHJpeDQmIHUsIGNvbnN0IE1hdHJpeDQmIHYpOworCisgICAgdm9pZCBsb2FkT3J0aG8oZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgZmxvYXQgdG9wLCBmbG9hdCBuZWFyLCBmbG9hdCBmYXIpOworCisgICAgdm9pZCBtdWx0aXBseShjb25zdCBNYXRyaXg0JiB2KSB7CisgICAgICAgIE1hdHJpeDQgdTsKKyAgICAgICAgdS5sb2FkTXVsdGlwbHkoKnRoaXMsIHYpOworICAgICAgICBsb2FkKHUpOworICAgIH0KKworICAgIHZvaWQgbXVsdGlwbHkoZmxvYXQgdik7CisKKyAgICB2b2lkIHRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIE1hdHJpeDQgdTsKKyAgICAgICAgdS5sb2FkVHJhbnNsYXRlKHgsIHksIHopOworICAgICAgICBtdWx0aXBseSh1KTsKKyAgICB9CisKKyAgICB2b2lkIHNjYWxlKGZsb2F0IHN4LCBmbG9hdCBzeSwgZmxvYXQgc3opIHsKKyAgICAgICAgTWF0cml4NCB1OworICAgICAgICB1LmxvYWRTY2FsZShzeCwgc3ksIHN6KTsKKyAgICAgICAgbXVsdGlwbHkodSk7CisgICAgfQorCisgICAgdm9pZCByb3RhdGUoZmxvYXQgYW5nbGUsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgTWF0cml4NCB1OworICAgICAgICB1LmxvYWRSb3RhdGUoYW5nbGUsIHgsIHksIHopOworICAgICAgICBtdWx0aXBseSh1KTsKKyAgICB9CisKKyAgICBib29sIGNoYW5nZXNCb3VuZHMoKTsKKworICAgIHZvaWQgY29weVRvKGZsb2F0KiB2KSBjb25zdDsKKyAgICB2b2lkIGNvcHlUbyhTa01hdHJpeCYgdikgY29uc3Q7CisKKyAgICB2b2lkIG1hcFJlY3QoUmVjdCYgcikgY29uc3Q7CisgICAgdm9pZCBtYXBQb2ludChmbG9hdCYgeCwgZmxvYXQmIHkpIGNvbnN0OworCisgICAgZmxvYXQgZ2V0VHJhbnNsYXRlWCgpOworICAgIGZsb2F0IGdldFRyYW5zbGF0ZVkoKTsKKworICAgIHZvaWQgZHVtcCgpIGNvbnN0OworCitwcml2YXRlOgorICAgIGJvb2wgbVNpbXBsZU1hdHJpeDsKKworICAgIGlubGluZSBmbG9hdCBnZXQoaW50IGksIGludCBqKSBjb25zdCB7CisgICAgICAgIHJldHVybiBkYXRhW2kgKiA0ICsgal07CisgICAgfQorCisgICAgaW5saW5lIHZvaWQgc2V0KGludCBpLCBpbnQgaiwgZmxvYXQgdikgeworICAgICAgICBkYXRhW2kgKiA0ICsgal0gPSB2OworICAgIH0KK307IC8vIGNsYXNzIE1hdHJpeDQKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVHlwZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordHlwZWRlZiBNYXRyaXg0IG1hdDQ7CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9NQVRSSVhfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL05PVElDRSBiL2xpYnMvaHd1aS9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMWVmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvT3BlbkdMRGVidWdSZW5kZXJlci5jcHAgYi9saWJzL2h3dWkvT3BlbkdMRGVidWdSZW5kZXJlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU1MTIzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9PcGVuR0xEZWJ1Z1JlbmRlcmVyLmNwcApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDx1dGlscy9TdG9wV2F0Y2guaD4KKworI2luY2x1ZGUgIk9wZW5HTERlYnVnUmVuZGVyZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCit2b2lkIE9wZW5HTERlYnVnUmVuZGVyZXI6OnByZXBhcmUoKSB7CisgICAgbVByaW1pdGl2ZXNDb3VudCA9IDA7CisgICAgTE9HRCgiPT09PT09PT09IEZyYW1lIHN0YXJ0ID09PT09PT09PSIpOworICAgIE9wZW5HTFJlbmRlcmVyOjpwcmVwYXJlKCk7Cit9CisKK3ZvaWQgT3BlbkdMRGVidWdSZW5kZXJlcjo6ZmluaXNoKCkgeworICAgIExPR0QoIj09PT09PT09PSBGcmFtZSBlbmQgPT09PT09PT09Iik7CisgICAgTE9HRCgiUHJpbWl0aXZlcyBkcmF3IGNvdW50ID0gJWQiLCBtUHJpbWl0aXZlc0NvdW50KTsKKyAgICBPcGVuR0xSZW5kZXJlcjo6ZmluaXNoKCk7Cit9CisKK3ZvaWQgT3BlbkdMRGVidWdSZW5kZXJlcjo6Y29tcG9zZUxheWVyKHNwPFNuYXBzaG90PiBjdXJyZW50LCBzcDxTbmFwc2hvdD4gcHJldmlvdXMpIHsKKyAgICBtUHJpbWl0aXZlc0NvdW50Kys7CisgICAgU3RvcFdhdGNoIHcoImNvbXBvc2VMYXllciIpOworICAgIHJldHVybiBPcGVuR0xSZW5kZXJlcjo6Y29tcG9zZUxheWVyKGN1cnJlbnQsIHByZXZpb3VzKTsKK30KKworaW50IE9wZW5HTERlYnVnUmVuZGVyZXI6OnNhdmVMYXllcihmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIGNvbnN0IFNrUGFpbnQqIHAsIGludCBmbGFncykgeworICAgIG1QcmltaXRpdmVzQ291bnQrKzsKKyAgICBTdG9wV2F0Y2ggdygic2F2ZUxheWVyIik7CisgICAgcmV0dXJuIE9wZW5HTFJlbmRlcmVyOjpzYXZlTGF5ZXIobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBwLCBmbGFncyk7Cit9CisKK3ZvaWQgT3BlbkdMRGVidWdSZW5kZXJlcjo6ZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsCisgICAgICAgIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgbVByaW1pdGl2ZXNDb3VudCsrOworICAgIFN0b3BXYXRjaCB3KCJkcmF3Qml0bWFwIik7CisgICAgT3BlbkdMUmVuZGVyZXI6OmRyYXdCaXRtYXAoYml0bWFwLCBsZWZ0LCB0b3AsIHBhaW50KTsKK30KKwordm9pZCBPcGVuR0xEZWJ1Z1JlbmRlcmVyOjpkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGNvbnN0IFNrTWF0cml4KiBtYXRyaXgsCisgICAgICAgIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgbVByaW1pdGl2ZXNDb3VudCsrOworICAgIFN0b3BXYXRjaCB3KCJkcmF3Qml0bWFwTWF0cml4Iik7CisgICAgT3BlbkdMUmVuZGVyZXI6OmRyYXdCaXRtYXAoYml0bWFwLCBtYXRyaXgsIHBhaW50KTsKK30KKwordm9pZCBPcGVuR0xEZWJ1Z1JlbmRlcmVyOjpkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IHNyY0xlZnQsIGZsb2F0IHNyY1RvcCwKKyAgICAgICAgZmxvYXQgc3JjUmlnaHQsIGZsb2F0IHNyY0JvdHRvbSwgZmxvYXQgZHN0TGVmdCwgZmxvYXQgZHN0VG9wLAorICAgICAgICBmbG9hdCBkc3RSaWdodCwgZmxvYXQgZHN0Qm90dG9tLCBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIG1QcmltaXRpdmVzQ291bnQrKzsKKyAgICBTdG9wV2F0Y2ggdygiZHJhd0JpdG1hcFJlY3QiKTsKKyAgICBPcGVuR0xSZW5kZXJlcjo6ZHJhd0JpdG1hcChiaXRtYXAsIHNyY0xlZnQsIHNyY1RvcCwgc3JjUmlnaHQsIHNyY0JvdHRvbSwKKyAgICAgICAgICAgIGRzdExlZnQsIGRzdFRvcCwgZHN0UmlnaHQsIGRzdEJvdHRvbSwgcGFpbnQpOworfQorCit2b2lkIE9wZW5HTERlYnVnUmVuZGVyZXI6OmRyYXdQYXRjaChTa0JpdG1hcCogYml0bWFwLCBjb25zdCBpbnQzMl90KiB4RGl2cywgY29uc3QgaW50MzJfdCogeURpdnMsCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBtUHJpbWl0aXZlc0NvdW50Kys7CisgICAgU3RvcFdhdGNoIHcoImRyYXdQYXRjaCIpOworICAgIE9wZW5HTFJlbmRlcmVyOjpkcmF3UGF0Y2goYml0bWFwLCB4RGl2cywgeURpdnMsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBhaW50KTsKK30KKwordm9pZCBPcGVuR0xEZWJ1Z1JlbmRlcmVyOjpkcmF3Q29sb3IoaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpIHsKKyAgICBtUHJpbWl0aXZlc0NvdW50Kys7CisgICAgU3RvcFdhdGNoIHcoImRyYXdDb2xvciIpOworICAgIE9wZW5HTFJlbmRlcmVyOjpkcmF3Q29sb3IoY29sb3IsIG1vZGUpOworfQorCit2b2lkIE9wZW5HTERlYnVnUmVuZGVyZXI6OmRyYXdSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBtUHJpbWl0aXZlc0NvdW50Kys7CisgICAgU3RvcFdhdGNoIHcoImRyYXdSZWN0Iik7CisgICAgT3BlbkdMUmVuZGVyZXI6OmRyYXdSZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgcGFpbnQpOworfQorCit2b2lkIE9wZW5HTERlYnVnUmVuZGVyZXI6OmRyYXdQYXRoKFNrUGF0aCogcGF0aCwgU2tQYWludCogcGFpbnQpIHsKKyAgICBtUHJpbWl0aXZlc0NvdW50Kys7CisgICAgU3RvcFdhdGNoIHcoImRyYXdQYXRoIik7CisgICAgT3BlbkdMUmVuZGVyZXI6OmRyYXdQYXRoKHBhdGgsIHBhaW50KTsKK30KKwordm9pZCBPcGVuR0xEZWJ1Z1JlbmRlcmVyOjpkcmF3TGluZXMoZmxvYXQqIHBvaW50cywgaW50IGNvdW50LCBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIG1QcmltaXRpdmVzQ291bnQrKzsKKyAgICBTdG9wV2F0Y2ggdygiZHJhd0xpbmVzIik7CisgICAgT3BlbkdMUmVuZGVyZXI6OmRyYXdMaW5lcyhwb2ludHMsIGNvdW50LCBwYWludCk7Cit9CisKK3ZvaWQgT3BlbkdMRGVidWdSZW5kZXJlcjo6ZHJhd1RleHQoY29uc3QgY2hhciogdGV4dCwgaW50IGJ5dGVzQ291bnQsIGludCBjb3VudCwgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgU2tQYWludCogcGFpbnQpIHsKKyAgICBtUHJpbWl0aXZlc0NvdW50Kys7CisgICAgU3RvcFdhdGNoIHcoImRyYXdUZXh0Iik7CisgICAgT3BlbkdMUmVuZGVyZXI6OmRyYXdUZXh0KHRleHQsIGJ5dGVzQ291bnQsIGNvdW50LCB4LCB5LCBwYWludCk7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL09wZW5HTERlYnVnUmVuZGVyZXIuaCBiL2xpYnMvaHd1aS9PcGVuR0xEZWJ1Z1JlbmRlcmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UxNTUxMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9PcGVuR0xEZWJ1Z1JlbmRlcmVyLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9PUEVOR0xfREVCVUdfUkVOREVSRVJfSAorI2RlZmluZSBBTkRST0lEX1VJX09QRU5HTF9ERUJVR19SRU5ERVJFUl9ICisKKyNpbmNsdWRlICJPcGVuR0xSZW5kZXJlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJlbmRlcmVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIE9wZW5HTERlYnVnUmVuZGVyZXI6IHB1YmxpYyBPcGVuR0xSZW5kZXJlciB7CitwdWJsaWM6CisgICAgT3BlbkdMRGVidWdSZW5kZXJlcigpOiBtUHJpbWl0aXZlc0NvdW50KDApIHsKKyAgICB9CisKKyAgICB+T3BlbkdMRGVidWdSZW5kZXJlcigpIHsKKyAgICB9CisKKyAgICB2b2lkIHByZXBhcmUoKTsKKyAgICB2b2lkIGZpbmlzaCgpOworCisgICAgaW50IHNhdmVMYXllcihmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBjb25zdCBTa1BhaW50KiBwLCBpbnQgZmxhZ3MpOworCisgICAgdm9pZCBkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgY29uc3QgU2tQYWludCogcGFpbnQpOworICAgIHZvaWQgZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBjb25zdCBTa01hdHJpeCogbWF0cml4LCBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdm9pZCBkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IHNyY0xlZnQsIGZsb2F0IHNyY1RvcCwKKyAgICAgICAgICAgIGZsb2F0IHNyY1JpZ2h0LCBmbG9hdCBzcmNCb3R0b20sIGZsb2F0IGRzdExlZnQsIGZsb2F0IGRzdFRvcCwKKyAgICAgICAgICAgIGZsb2F0IGRzdFJpZ2h0LCBmbG9hdCBkc3RCb3R0b20sIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdQYXRjaChTa0JpdG1hcCogYml0bWFwLCBjb25zdCBpbnQzMl90KiB4RGl2cywgY29uc3QgaW50MzJfdCogeURpdnMsCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdm9pZCBkcmF3Q29sb3IoaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpOworICAgIHZvaWQgZHJhd1JlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdm9pZCBkcmF3UGF0aChTa1BhdGgqIHBhdGgsIFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdMaW5lcyhmbG9hdCogcG9pbnRzLCBpbnQgY291bnQsIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2b2lkIGRyYXdUZXh0KGNvbnN0IGNoYXIqIHRleHQsIGludCBieXRlc0NvdW50LCBpbnQgY291bnQsIGZsb2F0IHgsIGZsb2F0IHksCisgICAgICAgICAgICBTa1BhaW50KiBwYWludCk7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIGNvbXBvc2VMYXllcihzcDxTbmFwc2hvdD4gY3VycmVudCwgc3A8U25hcHNob3Q+IHByZXZpb3VzKTsKKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtUHJpbWl0aXZlc0NvdW50OworCit9OyAvLyBjbGFzcyBPcGVuR0xEZWJ1Z1JlbmRlcmVyCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9PUEVOR0xfREVCVUdfUkVOREVSRVJfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmNwcCBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1ZmUyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5jcHAKQEAgLTAsMCArMSwxMzIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8U2tDYW52YXMuaD4KKyNpbmNsdWRlIDxTa1R5cGVmYWNlLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdG9wV2F0Y2guaD4KKworI2luY2x1ZGUgIk9wZW5HTFJlbmRlcmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGVmaW5lcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIFJFUVVJUkVEX1RFWFRVUkVfVU5JVFNfQ09VTlQgMworCisvLyBHZW5lcmF0ZXMgc2ltcGxlIGFuZCB0ZXh0dXJlZCB2ZXJ0aWNlcworI2RlZmluZSBGVih4LCB5LCB1LCB2KSB7IHsgeCwgeSB9LCB7IHUsIHYgfSB9CisKKyNkZWZpbmUgUkFEX1RPX0RFRyAoMTgwLjBmIC8gMy4xNDE1OTI2NWYpCisjZGVmaW5lIE1JTl9BTkdMRSAwLjAwMWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gR2xvYmFscworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBUaGlzIGFycmF5IGlzIG5ldmVyIHVzZWQgZGlyZWN0bHkgYnV0IHVzZWQgYXMgYSBtZW1jcHkgc291cmNlIGluIHRoZQorLy8gT3BlbkdMUmVuZGVyZXIgY29uc3RydWN0b3IKK3N0YXRpYyBjb25zdCBUZXh0dXJlVmVydGV4IGdNZXNoVmVydGljZXNbXSA9IHsKKyAgICAgICAgRlYoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiksCisgICAgICAgIEZWKDEuMGYsIDAuMGYsIDEuMGYsIDAuMGYpLAorICAgICAgICBGVigwLjBmLCAxLjBmLCAwLjBmLCAxLjBmKSwKKyAgICAgICAgRlYoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZikKK307CitzdGF0aWMgY29uc3QgR0xzaXplaSBnTWVzaFN0cmlkZSA9IHNpemVvZihUZXh0dXJlVmVydGV4KTsKK3N0YXRpYyBjb25zdCBHTHNpemVpIGdNZXNoQ291bnQgPSA0OworCisvKioKKyAqIFN0cnVjdHVyZSBtYXBwaW5nIFNraWEgeGZlcm1vZGVzIHRvIE9wZW5HTCBibGVuZGluZyBmYWN0b3JzLgorICovCitzdHJ1Y3QgQmxlbmRlciB7CisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlOworICAgIEdMZW51bSBzcmM7CisgICAgR0xlbnVtIGRzdDsKK307IC8vIHN0cnVjdCBCbGVuZGVyCisKKy8vIEluIHRoaXMgYXJyYXksIHRoZSBpbmRleCBvZiBlYWNoIEJsZW5kZXIgZXF1YWxzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QKKy8vIGVudHJ5LiBGb3IgaW5zdGFuY2UsIGdCbGVuZHNbMV0gPT0gZ0JsZW5kc1tTa1hmZXJtb2RlOjprU3JjX01vZGVdCitzdGF0aWMgY29uc3QgQmxlbmRlciBnQmxlbmRzW10gPSB7CisgICAgICAgIHsgU2tYZmVybW9kZTo6a0NsZWFyX01vZGUsICAgR0xfWkVSTywgICAgICAgICAgICAgICAgIEdMX1pFUk8gfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjX01vZGUsICAgICBHTF9PTkUsICAgICAgICAgICAgICAgICAgR0xfWkVSTyB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RfTW9kZSwgICAgIEdMX1pFUk8sICAgICAgICAgICAgICAgICBHTF9PTkUgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlLCBHTF9PTkUsICAgICAgICAgICAgICAgICAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RPdmVyX01vZGUsIEdMX09ORV9NSU5VU19EU1RfQUxQSEEsICBHTF9PTkUgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjSW5fTW9kZSwgICBHTF9EU1RfQUxQSEEsICAgICAgICAgICAgR0xfWkVSTyB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RJbl9Nb2RlLCAgIEdMX1pFUk8sICAgICAgICAgICAgICAgICBHTF9TUkNfQUxQSEEgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjT3V0X01vZGUsICBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBLCAgR0xfWkVSTyB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RPdXRfTW9kZSwgIEdMX1pFUk8sICAgICAgICAgICAgICAgICBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1NyY0FUb3BfTW9kZSwgR0xfRFNUX0FMUEhBLCAgICAgICAgICAgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprRHN0QVRvcF9Nb2RlLCBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBLCAgR0xfU1JDX0FMUEhBIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1hvcl9Nb2RlLCAgICAgR0xfT05FX01JTlVTX0RTVF9BTFBIQSwgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgfQorfTsKKworLy8gVGhpcyBhcnJheSBjb250YWlucyB0aGUgc3dhcHBlZCB2ZXJzaW9uIG9mIGVhY2ggU2tYZmVybW9kZS4gRm9yIGluc3RhbmNlCisvLyB0aGlzIGFycmF5J3MgU3JjT3ZlciBibGVuZGluZyBtb2RlIGlzIGFjdHVhbGx5IERzdE92ZXIuIFlvdSBjYW4gcmVmZXIgdG8KKy8vIGNyZWF0ZUxheWVyKCkgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHB1cnBvc2Ugb2YgdGhpcyBhcnJheS4KK3N0YXRpYyBjb25zdCBCbGVuZGVyIGdCbGVuZHNTd2FwW10gPSB7CisgICAgICAgIHsgU2tYZmVybW9kZTo6a0NsZWFyX01vZGUsICAgR0xfWkVSTywgICAgICAgICAgICAgICAgIEdMX1pFUk8gfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjX01vZGUsICAgICBHTF9aRVJPLCAgICAgICAgICAgICAgICAgR0xfT05FIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a0RzdF9Nb2RlLCAgICAgR0xfT05FLCAgICAgICAgICAgICAgICAgIEdMX1pFUk8gfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlLCBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBLCAgR0xfT05FIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a0RzdE92ZXJfTW9kZSwgR0xfT05FLCAgICAgICAgICAgICAgICAgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjSW5fTW9kZSwgICBHTF9aRVJPLCAgICAgICAgICAgICAgICAgR0xfU1JDX0FMUEhBIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a0RzdEluX01vZGUsICAgR0xfRFNUX0FMUEhBLCAgICAgICAgICAgIEdMX1pFUk8gfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjT3V0X01vZGUsICBHTF9aRVJPLCAgICAgICAgICAgICAgICAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RPdXRfTW9kZSwgIEdMX09ORV9NSU5VU19EU1RfQUxQSEEsICBHTF9aRVJPIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1NyY0FUb3BfTW9kZSwgR0xfT05FX01JTlVTX0RTVF9BTFBIQSwgIEdMX1NSQ19BTFBIQSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RBVG9wX01vZGUsIEdMX0RTVF9BTFBIQSwgICAgICAgICAgICBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1hvcl9Nb2RlLCAgICAgR0xfT05FX01JTlVTX0RTVF9BTFBIQSwgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgfQorfTsKKworc3RhdGljIGNvbnN0IEdMZW51bSBnVGV4dHVyZVVuaXRzW10gPSB7CisgICAgICAgIEdMX1RFWFRVUkUwLAorICAgICAgICBHTF9URVhUVVJFMSwKKyAgICAgICAgR0xfVEVYVFVSRTIKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK09wZW5HTFJlbmRlcmVyOjpPcGVuR0xSZW5kZXJlcigpOiBtQ2FjaGVzKENhY2hlczo6Z2V0SW5zdGFuY2UoKSkgeworICAgIG1TaGFkZXIgPSBOVUxMOworICAgIG1Db2xvckZpbHRlciA9IE5VTEw7CisgICAgbUhhc1NoYWRvdyA9IGZhbHNlOworCisgICAgbWVtY3B5KG1NZXNoVmVydGljZXMsIGdNZXNoVmVydGljZXMsIHNpemVvZihnTWVzaFZlcnRpY2VzKSk7CisKKyAgICBtRmlyc3RTbmFwc2hvdCA9IG5ldyBTbmFwc2hvdDsKKworICAgIEdMaW50IG1heFRleHR1cmVVbml0czsKKyAgICBnbEdldEludGVnZXJ2KEdMX01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTLCAmbWF4VGV4dHVyZVVuaXRzKTsKKyAgICBpZiAobWF4VGV4dHVyZVVuaXRzIDwgUkVRVUlSRURfVEVYVFVSRV9VTklUU19DT1VOVCkgeworICAgICAgICBMT0dXKCJBdCBsZWFzdCAlZCB0ZXh0dXJlIHVuaXRzIGFyZSByZXF1aXJlZCEiLCBSRVFVSVJFRF9URVhUVVJFX1VOSVRTX0NPVU5UKTsKKyAgICB9CisKKyAgICBnbEdldEludGVnZXJ2KEdMX01BWF9URVhUVVJFX1NJWkUsICZtTWF4VGV4dHVyZVNpemUpOworfQorCitPcGVuR0xSZW5kZXJlcjo6fk9wZW5HTFJlbmRlcmVyKCkgeworICAgIC8vIFRoZSBjb250ZXh0IGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkIGF0IHRoaXMgcG9pbnQsIGRvIG5vdCBjYWxsCisgICAgLy8gR0wgQVBJcy4gQWxsIEdMIHN0YXRlIHNob3VsZCBiZSBrZXB0IGluIENhY2hlcy5oCit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNldHVwCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgIGdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgbU9ydGhvTWF0cml4LmxvYWRPcnRobygwLCB3aWR0aCwgaGVpZ2h0LCAwLCAtMSwgMSk7CisKKyAgICBtV2lkdGggPSB3aWR0aDsKKyAgICBtSGVpZ2h0ID0gaGVpZ2h0OworCisgICAgbUZpcnN0U25hcHNob3QtPmhlaWdodCA9IGhlaWdodDsKKyAgICBtRmlyc3RTbmFwc2hvdC0+dmlld3BvcnQuc2V0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpwcmVwYXJlKCkgeworICAgIG1TbmFwc2hvdCA9IG5ldyBTbmFwc2hvdChtRmlyc3RTbmFwc2hvdCwKKyAgICAgICAgICAgIFNrQ2FudmFzOjprTWF0cml4X1NhdmVGbGFnIHwgU2tDYW52YXM6OmtDbGlwX1NhdmVGbGFnKTsKKyAgICBtU2F2ZUNvdW50ID0gMTsKKworICAgIGdsVmlld3BvcnQoMCwgMCwgbVdpZHRoLCBtSGVpZ2h0KTsKKworICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOworICAgIGdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOworCisgICAgZ2xDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisKKyAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOworICAgIGdsU2Npc3NvcigwLCAwLCBtV2lkdGgsIG1IZWlnaHQpOworCisgICAgbVNuYXBzaG90LT5zZXRDbGlwKDAuMGYsIDAuMGYsIG1XaWR0aCwgbUhlaWdodCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmZpbmlzaCgpIHsKKyNpZiBERUJVR19PUEVOR0wKKyAgICBHTGVudW0gc3RhdHVzID0gR0xfTk9fRVJST1I7CisgICAgd2hpbGUgKChzdGF0dXMgPSBnbEdldEVycm9yKCkpICE9IEdMX05PX0VSUk9SKSB7CisgICAgICAgIExPR0QoIkdMIGVycm9yIGZyb20gT3BlbkdMUmVuZGVyZXI6IDB4JXgiLCBzdGF0dXMpOworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjphY3F1aXJlQ29udGV4dCgpIHsKKyAgICBpZiAobUNhY2hlcy5jdXJyZW50UHJvZ3JhbSkgeworICAgICAgICBpZiAobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+aXNJblVzZSgpKSB7CisgICAgICAgICAgICBtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5yZW1vdmUoKTsKKyAgICAgICAgICAgIG1DYWNoZXMuY3VycmVudFByb2dyYW0gPSBOVUxMOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpyZWxlYXNlQ29udGV4dCgpIHsKKyAgICBnbFZpZXdwb3J0KDAsIDAsIG1TbmFwc2hvdC0+dmlld3BvcnQuZ2V0V2lkdGgoKSwgbVNuYXBzaG90LT52aWV3cG9ydC5nZXRIZWlnaHQoKSk7CisKKyAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOworICAgIHNldFNjaXNzb3JGcm9tQ2xpcCgpOworCisgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7CisKKyAgICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgMCk7CisKKyAgICBpZiAobUNhY2hlcy5ibGVuZCkgeworICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jKG1DYWNoZXMubGFzdFNyY01vZGUsIG1DYWNoZXMubGFzdERzdE1vZGUpOworICAgICAgICBnbEJsZW5kRXF1YXRpb24oR0xfRlVOQ19BREQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTdGF0ZSBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBPcGVuR0xSZW5kZXJlcjo6Z2V0U2F2ZUNvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtU2F2ZUNvdW50OworfQorCitpbnQgT3BlbkdMUmVuZGVyZXI6OnNhdmUoaW50IGZsYWdzKSB7CisgICAgcmV0dXJuIHNhdmVTbmFwc2hvdChmbGFncyk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnJlc3RvcmUoKSB7CisgICAgaWYgKG1TYXZlQ291bnQgPiAxKSB7CisgICAgICAgIHJlc3RvcmVTbmFwc2hvdCgpOworICAgIH0KK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cmVzdG9yZVRvQ291bnQoaW50IHNhdmVDb3VudCkgeworICAgIGlmIChzYXZlQ291bnQgPCAxKSBzYXZlQ291bnQgPSAxOworCisgICAgd2hpbGUgKG1TYXZlQ291bnQgPiBzYXZlQ291bnQpIHsKKyAgICAgICAgcmVzdG9yZVNuYXBzaG90KCk7CisgICAgfQorfQorCitpbnQgT3BlbkdMUmVuZGVyZXI6OnNhdmVTbmFwc2hvdChpbnQgZmxhZ3MpIHsKKyAgICBtU25hcHNob3QgPSBuZXcgU25hcHNob3QobVNuYXBzaG90LCBmbGFncyk7CisgICAgcmV0dXJuIG1TYXZlQ291bnQrKzsKK30KKworYm9vbCBPcGVuR0xSZW5kZXJlcjo6cmVzdG9yZVNuYXBzaG90KCkgeworICAgIGJvb2wgcmVzdG9yZUNsaXAgPSBtU25hcHNob3QtPmZsYWdzICYgU25hcHNob3Q6OmtGbGFnQ2xpcFNldDsKKyAgICBib29sIHJlc3RvcmVMYXllciA9IG1TbmFwc2hvdC0+ZmxhZ3MgJiBTbmFwc2hvdDo6a0ZsYWdJc0xheWVyOworICAgIGJvb2wgcmVzdG9yZU9ydGhvID0gbVNuYXBzaG90LT5mbGFncyAmIFNuYXBzaG90OjprRmxhZ0RpcnR5T3J0aG87CisKKyAgICBzcDxTbmFwc2hvdD4gY3VycmVudCA9IG1TbmFwc2hvdDsKKyAgICBzcDxTbmFwc2hvdD4gcHJldmlvdXMgPSBtU25hcHNob3QtPnByZXZpb3VzOworCisgICAgaWYgKHJlc3RvcmVPcnRobykgeworICAgICAgICBSZWN0JiByID0gcHJldmlvdXMtPnZpZXdwb3J0OworICAgICAgICBnbFZpZXdwb3J0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tKTsKKyAgICAgICAgbU9ydGhvTWF0cml4LmxvYWQoY3VycmVudC0+b3J0aG9NYXRyaXgpOworICAgIH0KKworICAgIG1TYXZlQ291bnQtLTsKKyAgICBtU25hcHNob3QgPSBwcmV2aW91czsKKworICAgIGlmIChyZXN0b3JlTGF5ZXIpIHsKKyAgICAgICAgY29tcG9zZUxheWVyKGN1cnJlbnQsIHByZXZpb3VzKTsKKyAgICB9CisKKyAgICBpZiAocmVzdG9yZUNsaXApIHsKKyAgICAgICAgc2V0U2Npc3NvckZyb21DbGlwKCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3RvcmVDbGlwOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBMYXllcnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW50IE9wZW5HTFJlbmRlcmVyOjpzYXZlTGF5ZXIoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICBjb25zdCBTa1BhaW50KiBwLCBpbnQgZmxhZ3MpIHsKKyAgICBjb25zdCBHTHVpbnQgcHJldmlvdXNGYm8gPSBtU25hcHNob3QtPmZibzsKKyAgICBjb25zdCBpbnQgY291bnQgPSBzYXZlU25hcHNob3QoZmxhZ3MpOworCisgICAgaW50IGFscGhhID0gMjU1OworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZTsKKworICAgIGlmIChwKSB7CisgICAgICAgIGFscGhhID0gcC0+Z2V0QWxwaGEoKTsKKyAgICAgICAgaWYgKCFtRXh0ZW5zaW9ucy5oYXNGcmFtZWJ1ZmZlckZldGNoKCkpIHsKKyAgICAgICAgICAgIGNvbnN0IGJvb2wgaXNNb2RlID0gU2tYZmVybW9kZTo6SXNNb2RlKHAtPmdldFhmZXJtb2RlKCksICZtb2RlKTsKKyAgICAgICAgICAgIGlmICghaXNNb2RlKSB7CisgICAgICAgICAgICAgICAgLy8gQXNzdW1lIFNSQ19PVkVSCisgICAgICAgICAgICAgICAgbW9kZSA9IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtb2RlID0gZ2V0WGZlcm1vZGUocC0+Z2V0WGZlcm1vZGUoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtb2RlID0gU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZTsKKyAgICB9CisKKyAgICBjcmVhdGVMYXllcihtU25hcHNob3QsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgYWxwaGEsIG1vZGUsIGZsYWdzLCBwcmV2aW91c0Zibyk7CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKK2ludCBPcGVuR0xSZW5kZXJlcjo6c2F2ZUxheWVyQWxwaGEoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICBpbnQgYWxwaGEsIGludCBmbGFncykgeworICAgIGlmIChhbHBoYSA9PSAweGZmKSB7CisgICAgICAgIHJldHVybiBzYXZlTGF5ZXIobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBOVUxMLCBmbGFncyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU2tQYWludCBwYWludDsKKyAgICAgICAgcGFpbnQuc2V0QWxwaGEoYWxwaGEpOworICAgICAgICByZXR1cm4gc2F2ZUxheWVyKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgJnBhaW50LCBmbGFncyk7CisgICAgfQorfQorCisvKioKKyAqIExheWVycyBhcmUgdmlld2VkIGJ5IFNraWEgYXJlIHNsaWdodGx5IGRpZmZlcmVudCB0aGFuIGxheWVycyBpbiBpbWFnZSBlZGl0aW5nCisgKiBwcm9ncmFtcyAoZm9yIGluc3RhbmNlLikgV2hlbiBhIGxheWVyIGlzIGNyZWF0ZWQsIHByZXZpb3VzbHkgY3JlYXRlZCBsYXllcnMKKyAqIGFuZCB0aGUgZnJhbWUgYnVmZmVyIHN0aWxsIHJlY2VpdmUgZXZlcnkgZHJhd2luZyBjb21tYW5kLiBGb3IgaW5zdGFuY2UsIGlmIGEKKyAqIGxheWVyIGlzIGNyZWF0ZWQgYW5kIGEgc2hhcGUgaW50ZXJzZWN0aW5nIHRoZSBib3VuZHMgb2YgdGhlIGxheWVycyBhbmQgdGhlCisgKiBmcmFtZWJ1ZmZlciBpcyBkcmF3LCB0aGUgc2hhcGUgd2lsbCBiZSBkcmF3biBvbiBib3RoICh1bmxlc3MgdGhlIGxheWVyIHdhcworICogY3JlYXRlZCB3aXRoIHRoZSBTa0NhbnZhczo6a0NsaXBUb0xheWVyX1NhdmVGbGFnIGZsYWcuKQorICoKKyAqIEEgd2F5IHRvIGltcGxlbWVudCBsYXllcnMgaXMgdG8gY3JlYXRlIGFuIEZCTyBmb3IgZWFjaCBsYXllciwgYmFja2VkIGJ5IGFuIFJHQkEKKyAqIHRleHR1cmUuIFVuZm9ydHVuYXRlbHksIHRoaXMgaXMgaW5lZmZpY2llbnQgYXMgaXQgcmVxdWlyZXMgZXZlcnkgcHJpbWl0aXZlIHRvCisgKiBiZSBkcmF3biBuICsgMSB0aW1lcywgd2hlcmUgbiBpcyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBsYXllcnMuIEluIHByYWN0aWNlIHRoaXMKKyAqIG1lYW5zLCBmb3IgZXZlcnkgcHJpbWl0aXZlOgorICogICAtIFN3aXRjaCBhY3RpdmUgZnJhbWUgYnVmZmVyCisgKiAgIC0gQ2hhbmdlIHZpZXdwb3J0LCBjbGlwIGFuZCBwcm9qZWN0aW9uIG1hdHJpeAorICogICAtIElzc3VlIHRoZSBkcmF3aW5nCisgKgorICogU3dpdGNoaW5nIHJlbmRlcmluZyB0YXJnZXQgbiArIDEgdGltZXMgcGVyIGRyYXduIHByaW1pdGl2ZSBpcyBleHRyZW1lbHkgY29zdGx5LgorICogVG8gYXZvaWQgdGhpcywgbGF5ZXJzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIGRpZmZlcmVudCB3YXkgaGVyZS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJlbGllcyBvbiB0aGUgZnJhbWUgYnVmZmVyIGJlaW5nIGF0IGxlYXN0IFJHQkEgODg4OC4gV2hlbgorICogYSBsYXllciBpcyBjcmVhdGVkLCBvbmx5IGEgdGV4dHVyZSBpcyBjcmVhdGVkLCBub3QgYW4gRkJPLiBUaGUgY29udGVudCBvZiB0aGUKKyAqIGZyYW1lIGJ1ZmZlciBjb250YWluZWQgd2l0aGluIHRoZSBsYXllcidzIGJvdW5kcyBpcyBjb3BpZWQgaW50byB0aGlzIHRleHR1cmUKKyAqIHVzaW5nIGdsQ29weVRleEltYWdlMkQoKS4gVGhlIGxheWVyJ3MgcmVnaW9uIGlzIHRoZW4gY2xlYXJlZCgxKSBpbiB0aGUgZnJhbWUKKyAqIGJ1ZmZlciBhbmQgZHJhd2luZyBjb250aW51ZXMgYXMgbm9ybWFsLiBUaGlzIHRlY2huaXF1ZSB0aGVyZWZvcmUgdHJlYXRzIHRoZQorICogZnJhbWUgYnVmZmVyIGFzIGEgc2NyYXRjaCBidWZmZXIgZm9yIHRoZSBsYXllcnMuCisgKgorICogVG8gY29tcG9zZSB0aGUgbGF5ZXJzIGJhY2sgb250byB0aGUgZnJhbWUgYnVmZmVyLCBlYWNoIGxheWVyIHRleHR1cmUKKyAqIChjb250YWluaW5nIHRoZSBvcmlnaW5hbCBmcmFtZSBidWZmZXIgZGF0YSkgaXMgZHJhd24gYXMgYSBzaW1wbGUgcXVhZCBvdmVyCisgKiB0aGUgZnJhbWUgYnVmZmVyLiBUaGUgdHJpY2sgaXMgdGhhdCB0aGUgcXVhZCBpcyBzZXQgYXMgdGhlIGNvbXBvc2l0aW9uCisgKiBkZXN0aW5hdGlvbiBpbiB0aGUgYmxlbmRpbmcgZXF1YXRpb24sIGFuZCB0aGUgZnJhbWUgYnVmZmVyIGJlY29tZXMgdGhlIHNvdXJjZQorICogb2YgdGhlIGNvbXBvc2l0aW9uLgorICoKKyAqIERyYXdpbmcgbGF5ZXJzIHdpdGggYW4gYWxwaGEgdmFsdWUgcmVxdWlyZXMgYW4gZXh0cmEgc3RlcCBiZWZvcmUgY29tcG9zaXRpb24uCisgKiBBbiBlbXB0eSBxdWFkIGlzIGRyYXduIG92ZXIgdGhlIGxheWVyJ3MgcmVnaW9uIGluIHRoZSBmcmFtZSBidWZmZXIuIFRoaXMgcXVhZAorICogaXMgZHJhd24gd2l0aCB0aGUgcmdiYSBjb2xvciAoMCwwLDAsYWxwaGEpLiBUaGUgYWxwaGEgdmFsdWUgb2ZmZXJlZCBieSB0aGUKKyAqIHF1YWQgaXMgdXNlZCB0byBtdWx0aXBseSB0aGUgY29sb3JzIGluIHRoZSBmcmFtZSBidWZmZXIuIFRoaXMgaXMgYWNoaWV2ZWQgYnkKKyAqIGNoYW5naW5nIHRoZSBHTCBibGVuZCBmdW5jdGlvbnMgZm9yIHRoZSBHTF9GVU5DX0FERCBibGVuZCBlcXVhdGlvbiB0bworICogR0xfWkVSTywgR0xfU1JDX0FMUEhBLgorICoKKyAqIEJlY2F1c2UgZ2xDb3B5VGV4SW1hZ2UyRCgpIGNhbiBiZSBzbG93LCBhbiBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBtaWdodAorICogYmUgdXNlIHRvIGRyYXcgYSBzaW5nbGUgY2xpcHBlZCBsYXllci4gVGhlIGltcGxlbWVudGF0aW9uIGRlc2NyaWJlZCBhYm92ZQorICogaXMgY29ycmVjdCBpbiBldmVyeSBjYXNlLgorICoKKyAqICgxKSBUaGUgZnJhbWUgYnVmZmVyIGlzIGFjdHVhbGx5IG5vdCBjbGVhcmVkIHJpZ2h0IGF3YXkuIFRvIGFsbG93IHRoZSBHUFUKKyAqICAgICB0byBwb3RlbnRpYWxseSBvcHRpbWl6ZSBzZXJpZXMgb2YgY2FsbHMgdG8gZ2xDb3B5VGV4SW1hZ2UyRCwgdGhlIGZyYW1lCisgKiAgICAgYnVmZmVyIGlzIGxlZnQgdW50b3VjaGVkIHVudGlsIHRoZSBmaXJzdCBkcmF3aW5nIG9wZXJhdGlvbi4gT25seSB3aGVuCisgKiAgICAgc29tZXRoaW5nIGFjdHVhbGx5IGdldHMgZHJhd24gYXJlIHRoZSBsYXllcnMgcmVnaW9ucyBjbGVhcmVkLgorICovCitib29sIE9wZW5HTFJlbmRlcmVyOjpjcmVhdGVMYXllcihzcDxTbmFwc2hvdD4gc25hcHNob3QsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwKKyAgICAgICAgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IGFscGhhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsCisgICAgICAgIGludCBmbGFncywgR0x1aW50IHByZXZpb3VzRmJvKSB7CisgICAgTEFZRVJfTE9HRCgiUmVxdWVzdGluZyBsYXllciAlLjJmeCUuMmYiLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7CisgICAgTEFZRVJfTE9HRCgiTGF5ZXIgY2FjaGUgc2l6ZSA9ICVkIiwgbUNhY2hlcy5sYXllckNhY2hlLmdldFNpemUoKSk7CisKKyAgICBjb25zdCBib29sIGZib0xheWVyID0gZmxhZ3MgJiBTa0NhbnZhczo6a0NsaXBUb0xheWVyX1NhdmVGbGFnOworCisgICAgLy8gV2luZG93IGNvb3JkaW5hdGVzIG9mIHRoZSBsYXllcgorICAgIFJlY3QgYm91bmRzKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgaWYgKCFmYm9MYXllcikgeworICAgICAgICBtU25hcHNob3QtPnRyYW5zZm9ybS0+bWFwUmVjdChib3VuZHMpOworICAgICAgICAvLyBMYXllcnMgb25seSBtYWtlIHNlbnNlIGlmIHRoZXkgYXJlIGluIHRoZSBmcmFtZWJ1ZmZlcidzIGJvdW5kcworICAgICAgICBib3VuZHMuaW50ZXJzZWN0KCptU25hcHNob3QtPmNsaXBSZWN0KTsKKyAgICAgICAgYm91bmRzLnNuYXBUb1BpeGVsQm91bmRhcmllcygpOworICAgIH0KKworICAgIGlmIChib3VuZHMuaXNFbXB0eSgpIHx8IGJvdW5kcy5nZXRXaWR0aCgpID4gbU1heFRleHR1cmVTaXplIHx8CisgICAgICAgICAgICBib3VuZHMuZ2V0SGVpZ2h0KCkgPiBtTWF4VGV4dHVyZVNpemUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7CisKKyAgICBMYXllclNpemUgc2l6ZShib3VuZHMuZ2V0V2lkdGgoKSwgYm91bmRzLmdldEhlaWdodCgpKTsKKyAgICBMYXllciogbGF5ZXIgPSBtQ2FjaGVzLmxheWVyQ2FjaGUuZ2V0KHNpemUpOworICAgIGlmICghbGF5ZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGxheWVyLT5tb2RlID0gbW9kZTsKKyAgICBsYXllci0+YWxwaGEgPSBhbHBoYTsKKyAgICBsYXllci0+bGF5ZXIuc2V0KGJvdW5kcyk7CisKKyAgICAvLyBTYXZlIHRoZSBsYXllciBpbiB0aGUgc25hcHNob3QKKyAgICBzbmFwc2hvdC0+ZmxhZ3MgfD0gU25hcHNob3Q6OmtGbGFnSXNMYXllcjsKKyAgICBzbmFwc2hvdC0+bGF5ZXIgPSBsYXllcjsKKworICAgIGlmIChmYm9MYXllcikgeworICAgICAgICBsYXllci0+ZmJvID0gbUNhY2hlcy5mYm9DYWNoZS5nZXQoKTsKKworICAgICAgICBzbmFwc2hvdC0+ZmxhZ3MgfD0gU25hcHNob3Q6OmtGbGFnSXNGYm9MYXllcjsKKyAgICAgICAgc25hcHNob3QtPmZibyA9IGxheWVyLT5mYm87CisgICAgICAgIHNuYXBzaG90LT5yZXNldFRyYW5zZm9ybSgtYm91bmRzLmxlZnQsIC1ib3VuZHMudG9wLCAwLjBmKTsKKyAgICAgICAgc25hcHNob3QtPnJlc2V0Q2xpcCgwLjBmLCAwLjBmLCBib3VuZHMuZ2V0V2lkdGgoKSwgYm91bmRzLmdldEhlaWdodCgpKTsKKyAgICAgICAgc25hcHNob3QtPnZpZXdwb3J0LnNldCgwLjBmLCAwLjBmLCBib3VuZHMuZ2V0V2lkdGgoKSwgYm91bmRzLmdldEhlaWdodCgpKTsKKyAgICAgICAgc25hcHNob3QtPmhlaWdodCA9IGJvdW5kcy5nZXRIZWlnaHQoKTsKKyAgICAgICAgc25hcHNob3QtPmZsYWdzIHw9IFNuYXBzaG90OjprRmxhZ0RpcnR5T3J0aG87CisgICAgICAgIHNuYXBzaG90LT5vcnRob01hdHJpeC5sb2FkKG1PcnRob01hdHJpeCk7CisKKyAgICAgICAgc2V0U2Npc3NvckZyb21DbGlwKCk7CisKKyAgICAgICAgLy8gQmluZCB0ZXh0dXJlIHRvIEZCTworICAgICAgICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgbGF5ZXItPmZibyk7CisgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbGF5ZXItPnRleHR1cmUpOworCisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHRleHR1cmUgaWYgbmVlZGVkCisgICAgICAgIGlmIChsYXllci0+ZW1wdHkpIHsKKyAgICAgICAgICAgIGxheWVyLT5lbXB0eSA9IGZhbHNlOworICAgICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgICAgICBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBOVUxMKTsKKyAgICAgICAgfQorCisgICAgICAgIGdsRnJhbWVidWZmZXJUZXh0dXJlMkQoR0xfRlJBTUVCVUZGRVIsIEdMX0NPTE9SX0FUVEFDSE1FTlQwLCBHTF9URVhUVVJFXzJELAorICAgICAgICAgICAgICAgIGxheWVyLT50ZXh0dXJlLCAwKTsKKworICAgICAgICBHTGVudW0gc3RhdHVzID0gZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzKEdMX0ZSQU1FQlVGRkVSKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSkgeworICAgICAgICAgICAgTE9HRSgiRnJhbWVidWZmZXIgaW5jb21wbGV0ZSAoR0wgZXJyb3IgY29kZSAweCV4KSIsIHN0YXR1cyk7CisKKyAgICAgICAgICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBwcmV2aW91c0Zibyk7CisgICAgICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZsYXllci0+dGV4dHVyZSk7CisgICAgICAgICAgICBtQ2FjaGVzLmZib0NhY2hlLnB1dChsYXllci0+ZmJvKTsKKworICAgICAgICAgICAgZGVsZXRlIGxheWVyOworCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBDbGVhciB0aGUgRkJPCisgICAgICAgIGdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOworICAgICAgICBnbENsZWFyQ29sb3IoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisKKyAgICAgICAgLy8gQ2hhbmdlIHRoZSBvcnRobyBwcm9qZWN0aW9uCisgICAgICAgIGdsVmlld3BvcnQoMCwgMCwgYm91bmRzLmdldFdpZHRoKCksIGJvdW5kcy5nZXRIZWlnaHQoKSk7CisgICAgICAgIG1PcnRob01hdHJpeC5sb2FkT3J0aG8oMC4wZiwgYm91bmRzLmdldFdpZHRoKCksIGJvdW5kcy5nZXRIZWlnaHQoKSwgMC4wZiwgLTEuMGYsIDEuMGYpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENvcHkgdGhlIGZyYW1lYnVmZmVyIGludG8gdGhlIGxheWVyCisgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbGF5ZXItPnRleHR1cmUpOworCisgICAgICAgIC8vIFRPRE86IFdvcmthcm91bmQgZm9yIGIvMzA1NDIwNAorICAgICAgICBnbENvcHlUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIGJvdW5kcy5sZWZ0LCBtSGVpZ2h0IC0gYm91bmRzLmJvdHRvbSwKKyAgICAgICAgICAgICAgICBib3VuZHMuZ2V0V2lkdGgoKSwgYm91bmRzLmdldEhlaWdodCgpLCAwKTsKKworICAgICAgICAvLyBUT0RPOiBXYWl0aW5nIGZvciBiLzMwNTQyMDQgdG8gYmUgZml4ZWQKKyAgICAgICAgLy8gaWYgKGxheWVyLT5lbXB0eSkgeworICAgICAgICAvLyAgICAgZ2xDb3B5VGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCBib3VuZHMubGVmdCwgbUhlaWdodCAtIGJvdW5kcy5ib3R0b20sCisgICAgICAgIC8vICAgICAgICAgICAgIGJvdW5kcy5nZXRXaWR0aCgpLCBib3VuZHMuZ2V0SGVpZ2h0KCksIDApOworICAgICAgICAvLyAgICAgbGF5ZXItPmVtcHR5ID0gZmFsc2U7CisgICAgICAgIC8vIH0gZWxzZSB7CisgICAgICAgIC8vICAgICBnbENvcHlUZXhTdWJJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIDAsIDAsIGJvdW5kcy5sZWZ0LCBtSGVpZ2h0IC0gYm91bmRzLmJvdHRvbSwKKyAgICAgICAgLy8gICAgICAgICAgICAgYm91bmRzLmdldFdpZHRoKCksIGJvdW5kcy5nZXRIZWlnaHQoKSk7CisgICAgICAgIC8vICB9CisKKyAgICAgICAgLy8gRW5xdWV1ZSB0aGUgYnVmZmVyIGNvb3JkaW5hdGVzIHRvIGNsZWFyIHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lvbiBsYXRlcgorICAgICAgICBtTGF5ZXJzLnB1c2gobmV3IFJlY3QoYm91bmRzKSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBjcmVhdGVMYXllcigpIGJlZm9yZSBkb2luZyBhbnl0aGluZyBpbiB0aGlzIG1ldGhvZC4KKyAqLwordm9pZCBPcGVuR0xSZW5kZXJlcjo6Y29tcG9zZUxheWVyKHNwPFNuYXBzaG90PiBjdXJyZW50LCBzcDxTbmFwc2hvdD4gcHJldmlvdXMpIHsKKyAgICBpZiAoIWN1cnJlbnQtPmxheWVyKSB7CisgICAgICAgIExPR0UoIkF0dGVtcHRpbmcgdG8gY29tcG9zZSBhIGxheWVyIHRoYXQgZG9lcyBub3QgZXhpc3QiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGJvb2wgZmJvTGF5ZXIgPSBjdXJyZW50LT5mbGFncyAmIFNrQ2FudmFzOjprQ2xpcFRvTGF5ZXJfU2F2ZUZsYWc7CisKKyAgICBpZiAoZmJvTGF5ZXIpIHsKKyAgICAgICAgLy8gVW5iaW5kIGN1cnJlbnQgRkJPIGFuZCByZXN0b3JlIHByZXZpb3VzIG9uZQorICAgICAgICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgcHJldmlvdXMtPmZibyk7CisgICAgfQorCisgICAgLy8gUmVzdG9yZSB0aGUgY2xpcCBmcm9tIHRoZSBwcmV2aW91cyBzbmFwc2hvdAorICAgIGNvbnN0IFJlY3QmIGNsaXAgPSAqcHJldmlvdXMtPmNsaXBSZWN0OworICAgIGdsU2Npc3NvcihjbGlwLmxlZnQsIHByZXZpb3VzLT5oZWlnaHQgLSBjbGlwLmJvdHRvbSwgY2xpcC5nZXRXaWR0aCgpLCBjbGlwLmdldEhlaWdodCgpKTsKKworICAgIExheWVyKiBsYXllciA9IGN1cnJlbnQtPmxheWVyOworICAgIGNvbnN0IFJlY3QmIHJlY3QgPSBsYXllci0+bGF5ZXI7CisKKyAgICBpZiAoIWZib0xheWVyICYmIGxheWVyLT5hbHBoYSA8IDI1NSkgeworICAgICAgICBkcmF3Q29sb3JSZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLAorICAgICAgICAgICAgICAgIGxheWVyLT5hbHBoYSA8PCAyNCwgU2tYZmVybW9kZTo6a0RzdEluX01vZGUsIHRydWUpOworICAgIH0KKworICAgIC8vIExheWVycyBhcmUgYWxyZWFkeSBkcmF3biB3aXRoIGEgdG9wLWxlZnQgb3JpZ2luLCBkb24ndCBmbGlwIHRoZSB0ZXh0dXJlCisgICAgcmVzZXREcmF3VGV4dHVyZVRleENvb3JkcygwLjBmLCAxLjBmLCAxLjBmLCAwLjBmKTsKKworICAgIGlmIChmYm9MYXllcikgeworICAgICAgICBkcmF3VGV4dHVyZVJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sCisgICAgICAgICAgICAgICAgbGF5ZXItPnRleHR1cmUsIGxheWVyLT5hbHBoYSAvIDI1NS4wZiwgbGF5ZXItPm1vZGUsIGxheWVyLT5ibGVuZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHJhd1RleHR1cmVNZXNoKHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLCBsYXllci0+dGV4dHVyZSwKKyAgICAgICAgICAgICAgICAxLjBmLCBsYXllci0+bW9kZSwgbGF5ZXItPmJsZW5kLCAmbU1lc2hWZXJ0aWNlc1swXS5wb3NpdGlvblswXSwKKyAgICAgICAgICAgICAgICAmbU1lc2hWZXJ0aWNlc1swXS50ZXh0dXJlWzBdLCBHTF9UUklBTkdMRV9TVFJJUCwgZ01lc2hDb3VudCwgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcmVzZXREcmF3VGV4dHVyZVRleENvb3JkcygwLjBmLCAwLjBmLCAxLjBmLCAxLjBmKTsKKworICAgIGlmIChmYm9MYXllcikgeworICAgICAgICAvLyBEZXRhY2ggdGhlIHRleHR1cmUgZnJvbSB0aGUgRkJPCisgICAgICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBjdXJyZW50LT5mYm8pOworICAgICAgICBnbEZyYW1lYnVmZmVyVGV4dHVyZTJEKEdMX0ZSQU1FQlVGRkVSLCBHTF9DT0xPUl9BVFRBQ0hNRU5UMCwgR0xfVEVYVFVSRV8yRCwgMCwgMCk7CisgICAgICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBwcmV2aW91cy0+ZmJvKTsKKworICAgICAgICAvLyBQdXQgdGhlIEZCTyBuYW1lIGJhY2sgaW4gdGhlIGNhY2hlLCBpZiBpdCBkb2Vzbid0IGZpdCwgaXQgd2lsbCBiZSBkZXN0cm95ZWQKKyAgICAgICAgbUNhY2hlcy5mYm9DYWNoZS5wdXQoY3VycmVudC0+ZmJvKTsKKyAgICB9CisKKyAgICBMYXllclNpemUgc2l6ZShyZWN0LmdldFdpZHRoKCksIHJlY3QuZ2V0SGVpZ2h0KCkpOworICAgIC8vIEZhaWxpbmcgdG8gYWRkIHRoZSBsYXllciB0byB0aGUgY2FjaGUgc2hvdWxkIGhhcHBlbiBvbmx5IGlmIHRoZSBsYXllciBpcyB0b28gbGFyZ2UKKyAgICBpZiAoIW1DYWNoZXMubGF5ZXJDYWNoZS5wdXQoc2l6ZSwgbGF5ZXIpKSB7CisgICAgICAgIExBWUVSX0xPR0QoIkRlbGV0aW5nIGxheWVyIik7CisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJmxheWVyLT50ZXh0dXJlKTsKKyAgICAgICAgZGVsZXRlIGxheWVyOworICAgIH0KK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6Y2xlYXJMYXllclJlZ2lvbnMoKSB7CisgICAgaWYgKG1MYXllcnMuc2l6ZSgpID09IDApIHJldHVybjsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtTGF5ZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIFJlY3QqIGJvdW5kcyA9IG1MYXllcnMuaXRlbUF0KGkpOworCisgICAgICAgIC8vIENsZWFyIHRoZSBmcmFtZWJ1ZmZlciB3aGVyZSB0aGUgbGF5ZXIgd2lsbCBkcmF3CisgICAgICAgIGdsU2Npc3Nvcihib3VuZHMtPmxlZnQsIG1IZWlnaHQgLSBib3VuZHMtPmJvdHRvbSwKKyAgICAgICAgICAgICAgICBib3VuZHMtPmdldFdpZHRoKCksIGJvdW5kcy0+Z2V0SGVpZ2h0KCkpOworICAgICAgICBnbENsZWFyQ29sb3IoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisKKyAgICAgICAgZGVsZXRlIGJvdW5kczsKKyAgICB9CisgICAgbUxheWVycy5jbGVhcigpOworCisgICAgLy8gUmVzdG9yZSB0aGUgY2xpcAorICAgIHNldFNjaXNzb3JGcm9tQ2xpcCgpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUcmFuc2Zvcm1zCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnRyYW5zbGF0ZShmbG9hdCBkeCwgZmxvYXQgZHkpIHsKKyAgICBtU25hcHNob3QtPnRyYW5zZm9ybS0+dHJhbnNsYXRlKGR4LCBkeSwgMC4wZik7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnJvdGF0ZShmbG9hdCBkZWdyZWVzKSB7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0tPnJvdGF0ZShkZWdyZWVzLCAwLjBmLCAwLjBmLCAxLjBmKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5KSB7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0tPnNjYWxlKHN4LCBzeSwgMS4wZik7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldE1hdHJpeChTa01hdHJpeCogbWF0cml4KSB7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0tPmxvYWQoKm1hdHJpeCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmdldE1hdHJpeChTa01hdHJpeCogbWF0cml4KSB7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0tPmNvcHlUbygqbWF0cml4KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6Y29uY2F0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICBtYXQ0IG0oKm1hdHJpeCk7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0tPm11bHRpcGx5KG0pOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDbGlwcGluZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXRTY2lzc29yRnJvbUNsaXAoKSB7CisgICAgY29uc3QgUmVjdCYgY2xpcCA9ICptU25hcHNob3QtPmNsaXBSZWN0OworICAgIGdsU2Npc3NvcihjbGlwLmxlZnQsIG1TbmFwc2hvdC0+aGVpZ2h0IC0gY2xpcC5ib3R0b20sIGNsaXAuZ2V0V2lkdGgoKSwgY2xpcC5nZXRIZWlnaHQoKSk7Cit9CisKK2NvbnN0IFJlY3QmIE9wZW5HTFJlbmRlcmVyOjpnZXRDbGlwQm91bmRzKCkgeworICAgIHJldHVybiBtU25hcHNob3QtPmdldExvY2FsQ2xpcCgpOworfQorCitib29sIE9wZW5HTFJlbmRlcmVyOjpxdWlja1JlamVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIHsKKyAgICBSZWN0IHIobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICBtU25hcHNob3QtPnRyYW5zZm9ybS0+bWFwUmVjdChyKTsKKyAgICByZXR1cm4gIW1TbmFwc2hvdC0+Y2xpcFJlY3QtPmludGVyc2VjdHMocik7Cit9CisKK2Jvb2wgT3BlbkdMUmVuZGVyZXI6OmNsaXBSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgU2tSZWdpb246Ok9wIG9wKSB7CisgICAgYm9vbCBjbGlwcGVkID0gbVNuYXBzaG90LT5jbGlwKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgb3ApOworICAgIGlmIChjbGlwcGVkKSB7CisgICAgICAgIHNldFNjaXNzb3JGcm9tQ2xpcCgpOworICAgIH0KKyAgICByZXR1cm4gIW1TbmFwc2hvdC0+Y2xpcFJlY3QtPmlzRW1wdHkoKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRHJhd2luZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBjb25zdCBmbG9hdCByaWdodCA9IGxlZnQgKyBiaXRtYXAtPndpZHRoKCk7CisgICAgY29uc3QgZmxvYXQgYm90dG9tID0gdG9wICsgYml0bWFwLT5oZWlnaHQoKTsKKworICAgIGlmIChxdWlja1JlamVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUgPSBtQ2FjaGVzLnRleHR1cmVDYWNoZS5nZXQoYml0bWFwKTsKKyAgICBpZiAoIXRleHR1cmUpIHJldHVybjsKKyAgICBjb25zdCBBdXRvVGV4dHVyZSBhdXRvQ2xlYW51cCh0ZXh0dXJlKTsKKworICAgIGRyYXdUZXh0dXJlUmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHRleHR1cmUsIHBhaW50KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBjb25zdCBTa01hdHJpeCogbWF0cml4LCBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIFJlY3QgcigwLjBmLCAwLjBmLCBiaXRtYXAtPndpZHRoKCksIGJpdG1hcC0+aGVpZ2h0KCkpOworICAgIGNvbnN0IG1hdDQgdHJhbnNmb3JtKCptYXRyaXgpOworICAgIHRyYW5zZm9ybS5tYXBSZWN0KHIpOworCisgICAgaWYgKHF1aWNrUmVqZWN0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICBjb25zdCBUZXh0dXJlKiB0ZXh0dXJlID0gbUNhY2hlcy50ZXh0dXJlQ2FjaGUuZ2V0KGJpdG1hcCk7CisgICAgaWYgKCF0ZXh0dXJlKSByZXR1cm47CisgICAgY29uc3QgQXV0b1RleHR1cmUgYXV0b0NsZWFudXAodGV4dHVyZSk7CisKKyAgICBkcmF3VGV4dHVyZVJlY3Qoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20sIHRleHR1cmUsIHBhaW50KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLAorICAgICAgICAgZmxvYXQgc3JjTGVmdCwgZmxvYXQgc3JjVG9wLCBmbG9hdCBzcmNSaWdodCwgZmxvYXQgc3JjQm90dG9tLAorICAgICAgICAgZmxvYXQgZHN0TGVmdCwgZmxvYXQgZHN0VG9wLCBmbG9hdCBkc3RSaWdodCwgZmxvYXQgZHN0Qm90dG9tLAorICAgICAgICAgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBpZiAocXVpY2tSZWplY3QoZHN0TGVmdCwgZHN0VG9wLCBkc3RSaWdodCwgZHN0Qm90dG9tKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICBjb25zdCBUZXh0dXJlKiB0ZXh0dXJlID0gbUNhY2hlcy50ZXh0dXJlQ2FjaGUuZ2V0KGJpdG1hcCk7CisgICAgaWYgKCF0ZXh0dXJlKSByZXR1cm47CisgICAgY29uc3QgQXV0b1RleHR1cmUgYXV0b0NsZWFudXAodGV4dHVyZSk7CisKKyAgICBjb25zdCBmbG9hdCB3aWR0aCA9IHRleHR1cmUtPndpZHRoOworICAgIGNvbnN0IGZsb2F0IGhlaWdodCA9IHRleHR1cmUtPmhlaWdodDsKKworICAgIGNvbnN0IGZsb2F0IHUxID0gc3JjTGVmdCAvIHdpZHRoOworICAgIGNvbnN0IGZsb2F0IHYxID0gc3JjVG9wIC8gaGVpZ2h0OworICAgIGNvbnN0IGZsb2F0IHUyID0gc3JjUmlnaHQgLyB3aWR0aDsKKyAgICBjb25zdCBmbG9hdCB2MiA9IHNyY0JvdHRvbSAvIGhlaWdodDsKKworICAgIHJlc2V0RHJhd1RleHR1cmVUZXhDb29yZHModTEsIHYxLCB1MiwgdjIpOworCisgICAgZHJhd1RleHR1cmVSZWN0KGRzdExlZnQsIGRzdFRvcCwgZHN0UmlnaHQsIGRzdEJvdHRvbSwgdGV4dHVyZSwgcGFpbnQpOworCisgICAgcmVzZXREcmF3VGV4dHVyZVRleENvb3JkcygwLjBmLCAwLjBmLCAxLjBmLCAxLjBmKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1BhdGNoKFNrQml0bWFwKiBiaXRtYXAsIGNvbnN0IGludDMyX3QqIHhEaXZzLCBjb25zdCBpbnQzMl90KiB5RGl2cywKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIGlmIChxdWlja1JlamVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUgPSBtQ2FjaGVzLnRleHR1cmVDYWNoZS5nZXQoYml0bWFwKTsKKyAgICBpZiAoIXRleHR1cmUpIHJldHVybjsKKyAgICBjb25zdCBBdXRvVGV4dHVyZSBhdXRvQ2xlYW51cCh0ZXh0dXJlKTsKKworICAgIGludCBhbHBoYTsKKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisgICAgZ2V0QWxwaGFBbmRNb2RlKHBhaW50LCAmYWxwaGEsICZtb2RlKTsKKworICAgIFBhdGNoKiBtZXNoID0gbUNhY2hlcy5wYXRjaENhY2hlLmdldCh3aWR0aCwgaGVpZ2h0KTsKKyAgICBtZXNoLT51cGRhdGVWZXJ0aWNlcyhiaXRtYXAtPndpZHRoKCksIGJpdG1hcC0+aGVpZ2h0KCksbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLAorICAgICAgICAgICAgeERpdnMsIHlEaXZzLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIC8vIFNwZWNpZnkgcmlnaHQgYW5kIGJvdHRvbSBhcyArMS4wZiBmcm9tIGxlZnQvdG9wIHRvIHByZXZlbnQgc2NhbGluZyBzaW5jZSB0aGUKKyAgICAvLyBwYXRjaCBtZXNoIGFscmVhZHkgZGVmaW5lcyB0aGUgZmluYWwgc2l6ZQorICAgIGRyYXdUZXh0dXJlTWVzaChsZWZ0LCB0b3AsIGxlZnQgKyAxLjBmLCB0b3AgKyAxLjBmLCB0ZXh0dXJlLT5pZCwgYWxwaGEgLyAyNTUuMGYsCisgICAgICAgICAgICBtb2RlLCB0ZXh0dXJlLT5ibGVuZCwgJm1lc2gtPnZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdLAorICAgICAgICAgICAgJm1lc2gtPnZlcnRpY2VzWzBdLnRleHR1cmVbMF0sIEdMX1RSSUFOR0xFUywgbWVzaC0+dmVydGljZXNDb3VudCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdMaW5lcyhmbG9hdCogcG9pbnRzLCBpbnQgY291bnQsIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgaW50IGFscGhhOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZTsKKyAgICBnZXRBbHBoYUFuZE1vZGUocGFpbnQsICZhbHBoYSwgJm1vZGUpOworCisgICAgdWludDMyX3QgY29sb3IgPSBwYWludC0+Z2V0Q29sb3IoKTsKKyAgICBjb25zdCBHTGZsb2F0IGEgPSBhbHBoYSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IHIgPSBhICogKChjb2xvciA+PiAxNikgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGcgPSBhICogKChjb2xvciA+PiAgOCkgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGIgPSBhICogKChjb2xvciAgICAgICkgJiAweEZGKSAvIDI1NS4wZjsKKworICAgIGNvbnN0IGJvb2wgaXNBQSA9IHBhaW50LT5pc0FudGlBbGlhcygpOworICAgIGlmIChpc0FBKSB7CisgICAgICAgIEdMdWludCB0ZXh0dXJlVW5pdCA9IDA7CisgICAgICAgIHNldHVwVGV4dHVyZUFscGhhOChtQ2FjaGVzLmxpbmUuZ2V0VGV4dHVyZSgpLCAwLCAwLCB0ZXh0dXJlVW5pdCwgMC4wZiwgMC4wZiwgciwgZywgYiwgYSwKKyAgICAgICAgICAgICAgICBtb2RlLCBmYWxzZSwgdHJ1ZSwgbUNhY2hlcy5saW5lLmdldFZlcnRpY2VzKCksIG1DYWNoZXMubGluZS5nZXRUZXhDb29yZHMoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0dXBDb2xvclJlY3QoMC4wZiwgMC4wZiwgMS4wZiwgMS4wZiwgciwgZywgYiwgYSwgbW9kZSwgZmFsc2UpOworICAgIH0KKworICAgIGNvbnN0IGZsb2F0IHN0cm9rZVdpZHRoID0gcGFpbnQtPmdldFN0cm9rZVdpZHRoKCk7CisgICAgY29uc3QgR0xzaXplaSBlbGVtZW50c0NvdW50ID0gaXNBQSA/IG1DYWNoZXMubGluZS5nZXRFbGVtZW50c0NvdW50KCkgOiBnTWVzaENvdW50OworICAgIGNvbnN0IEdMZW51bSBkcmF3TW9kZSA9IGlzQUEgPyBHTF9UUklBTkdMRVMgOiBHTF9UUklBTkdMRV9TVFJJUDsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkgKz0gNCkgeworICAgICAgICBmbG9hdCB0eCA9IDAuMGY7CisgICAgICAgIGZsb2F0IHR5ID0gMC4wZjsKKworICAgICAgICBpZiAoaXNBQSkgeworICAgICAgICAgICAgbUNhY2hlcy5saW5lLnVwZGF0ZShwb2ludHNbaV0sIHBvaW50c1tpICsgMV0sIHBvaW50c1tpICsgMl0sIHBvaW50c1tpICsgM10sCisgICAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoLCB0eCwgdHkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHkgPSBzdHJva2VXaWR0aCA8PSAxLjBmID8gMC4wZiA6IC1zdHJva2VXaWR0aCAqIDAuNWY7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBmbG9hdCBkeCA9IHBvaW50c1tpICsgMl0gLSBwb2ludHNbaV07CisgICAgICAgIGNvbnN0IGZsb2F0IGR5ID0gcG9pbnRzW2kgKyAzXSAtIHBvaW50c1tpICsgMV07CisgICAgICAgIGNvbnN0IGZsb2F0IG1hZyA9IHNxcnRmKGR4ICogZHggKyBkeSAqIGR5KTsKKyAgICAgICAgY29uc3QgZmxvYXQgYW5nbGUgPSBhY29zKGR4IC8gbWFnKTsKKworICAgICAgICBtTW9kZWxWaWV3LmxvYWRUcmFuc2xhdGUocG9pbnRzW2ldLCBwb2ludHNbaSArIDFdLCAwLjBmKTsKKyAgICAgICAgaWYgKGFuZ2xlID4gTUlOX0FOR0xFIHx8IGFuZ2xlIDwgLU1JTl9BTkdMRSkgeworICAgICAgICAgICAgbU1vZGVsVmlldy5yb3RhdGUoYW5nbGUgKiBSQURfVE9fREVHLCAwLjBmLCAwLjBmLCAxLjBmKTsKKyAgICAgICAgfQorICAgICAgICBtTW9kZWxWaWV3LnRyYW5zbGF0ZSh0eCwgdHksIDAuMGYpOworICAgICAgICBpZiAoIWlzQUEpIHsKKyAgICAgICAgICAgIGZsb2F0IGxlbmd0aCA9IG1DYWNoZXMubGluZS5nZXRMZW5ndGgocG9pbnRzW2ldLCBwb2ludHNbaSArIDFdLAorICAgICAgICAgICAgICAgICAgICBwb2ludHNbaSArIDJdLCBwb2ludHNbaSArIDNdKTsKKyAgICAgICAgICAgIG1Nb2RlbFZpZXcuc2NhbGUobGVuZ3RoLCBzdHJva2VXaWR0aCwgMS4wZik7CisgICAgICAgIH0KKyAgICAgICAgbUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+c2V0KG1PcnRob01hdHJpeCwgbU1vZGVsVmlldywgKm1TbmFwc2hvdC0+dHJhbnNmb3JtKTsKKworICAgICAgICBpZiAobVNoYWRlcikgeworICAgICAgICAgICAgbVNoYWRlci0+dXBkYXRlVHJhbnNmb3JtcyhtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLCBtTW9kZWxWaWV3LCAqbVNuYXBzaG90KTsKKyAgICAgICAgfQorCisgICAgICAgIGdsRHJhd0FycmF5cyhkcmF3TW9kZSwgMCwgZWxlbWVudHNDb3VudCk7CisgICAgfQorCisgICAgaWYgKGlzQUEpIHsKKyAgICAgICAgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Z2V0QXR0cmliKCJ0ZXhDb29yZHMiKSk7CisgICAgfQorfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3Q29sb3IoaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpIHsKKyAgICBjb25zdCBSZWN0JiBjbGlwID0gKm1TbmFwc2hvdC0+Y2xpcFJlY3Q7CisgICAgZHJhd0NvbG9yUmVjdChjbGlwLmxlZnQsIGNsaXAudG9wLCBjbGlwLnJpZ2h0LCBjbGlwLmJvdHRvbSwgY29sb3IsIG1vZGUsIHRydWUpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3UmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGNvbnN0IFNrUGFpbnQqIHApIHsKKyAgICBpZiAocXVpY2tSZWplY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlOworICAgIGlmICghbUV4dGVuc2lvbnMuaGFzRnJhbWVidWZmZXJGZXRjaCgpKSB7CisgICAgICAgIGNvbnN0IGJvb2wgaXNNb2RlID0gU2tYZmVybW9kZTo6SXNNb2RlKHAtPmdldFhmZXJtb2RlKCksICZtb2RlKTsKKyAgICAgICAgaWYgKCFpc01vZGUpIHsKKyAgICAgICAgICAgIC8vIEFzc3VtZSBTUkNfT1ZFUgorICAgICAgICAgICAgbW9kZSA9IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtb2RlID0gZ2V0WGZlcm1vZGUocC0+Z2V0WGZlcm1vZGUoKSk7CisgICAgfQorCisgICAgLy8gU2tpYSBkcmF3cyB1c2luZyB0aGUgY29sb3IncyBhbHBoYSBjaGFubmVsIGlmIDwgMjU1CisgICAgLy8gT3RoZXJ3aXNlLCBpdCB1c2VzIHRoZSBwYWludCdzIGFscGhhCisgICAgaW50IGNvbG9yID0gcC0+Z2V0Q29sb3IoKTsKKyAgICBpZiAoKChjb2xvciA+PiAyNCkgJiAweGZmKSA9PSAyNTUpIHsKKyAgICAgICAgY29sb3IgfD0gcC0+Z2V0QWxwaGEoKSA8PCAyNDsKKyAgICB9CisKKyAgICBkcmF3Q29sb3JSZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgY29sb3IsIG1vZGUpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3VGV4dChjb25zdCBjaGFyKiB0ZXh0LCBpbnQgYnl0ZXNDb3VudCwgaW50IGNvdW50LAorICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBTa1BhaW50KiBwYWludCkgeworICAgIGlmICh0ZXh0ID09IE5VTEwgfHwgY291bnQgPT0gMCB8fCAocGFpbnQtPmdldEFscGhhKCkgPT0gMCAmJiBwYWludC0+Z2V0WGZlcm1vZGUoKSA9PSBOVUxMKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcGFpbnQtPnNldEFudGlBbGlhcyh0cnVlKTsKKworICAgIGZsb2F0IGxlbmd0aCA9IC0xLjBmOworICAgIHN3aXRjaCAocGFpbnQtPmdldFRleHRBbGlnbigpKSB7CisgICAgICAgIGNhc2UgU2tQYWludDo6a0NlbnRlcl9BbGlnbjoKKyAgICAgICAgICAgIGxlbmd0aCA9IHBhaW50LT5tZWFzdXJlVGV4dCh0ZXh0LCBieXRlc0NvdW50KTsKKyAgICAgICAgICAgIHggLT0gbGVuZ3RoIC8gMi4wZjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNrUGFpbnQ6OmtSaWdodF9BbGlnbjoKKyAgICAgICAgICAgIGxlbmd0aCA9IHBhaW50LT5tZWFzdXJlVGV4dCh0ZXh0LCBieXRlc0NvdW50KTsKKyAgICAgICAgICAgIHggLT0gbGVuZ3RoOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpbnQgYWxwaGE7CisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlOworICAgIGdldEFscGhhQW5kTW9kZShwYWludCwgJmFscGhhLCAmbW9kZSk7CisKKyAgICB1aW50MzJfdCBjb2xvciA9IHBhaW50LT5nZXRDb2xvcigpOworICAgIGNvbnN0IEdMZmxvYXQgYSA9IGFscGhhIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgciA9IGEgKiAoKGNvbG9yID4+IDE2KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgZyA9IGEgKiAoKGNvbG9yID4+ICA4KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgYiA9IGEgKiAoKGNvbG9yICAgICAgKSAmIDB4RkYpIC8gMjU1LjBmOworCisgICAgRm9udFJlbmRlcmVyJiBmb250UmVuZGVyZXIgPSBtQ2FjaGVzLmZvbnRSZW5kZXJlci5nZXRGb250UmVuZGVyZXIocGFpbnQpOworICAgIGZvbnRSZW5kZXJlci5zZXRGb250KHBhaW50LCBTa1R5cGVmYWNlOjpVbmlxdWVJRChwYWludC0+Z2V0VHlwZWZhY2UoKSksCisgICAgICAgICAgICBwYWludC0+Z2V0VGV4dFNpemUoKSk7CisKKyAgICBpZiAobUhhc1NoYWRvdykgeworICAgICAgICBnbEFjdGl2ZVRleHR1cmUoZ1RleHR1cmVVbml0c1swXSk7CisgICAgICAgIG1DYWNoZXMuZHJvcFNoYWRvd0NhY2hlLnNldEZvbnRSZW5kZXJlcihmb250UmVuZGVyZXIpOworICAgICAgICBjb25zdCBTaGFkb3dUZXh0dXJlKiBzaGFkb3cgPSBtQ2FjaGVzLmRyb3BTaGFkb3dDYWNoZS5nZXQocGFpbnQsIHRleHQsIGJ5dGVzQ291bnQsCisgICAgICAgICAgICAgICAgY291bnQsIG1TaGFkb3dSYWRpdXMpOworICAgICAgICBjb25zdCBBdXRvVGV4dHVyZSBhdXRvQ2xlYW51cChzaGFkb3cpOworCisgICAgICAgIHNldHVwU2hhZG93KHNoYWRvdywgeCwgeSwgbW9kZSwgYSk7CisKKyAgICAgICAgLy8gRHJhdyB0aGUgbWVzaAorICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfU1RSSVAsIDAsIGdNZXNoQ291bnQpOworICAgICAgICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5nZXRBdHRyaWIoInRleENvb3JkcyIpKTsKKyAgICB9CisKKyAgICBHTHVpbnQgdGV4dHVyZVVuaXQgPSAwOworICAgIGdsQWN0aXZlVGV4dHVyZShnVGV4dHVyZVVuaXRzW3RleHR1cmVVbml0XSk7CisKKyAgICAvLyBBc3N1bWUgdGhhdCB0aGUgbW9kZWxWaWV3IG1hdHJpeCBkb2VzIG5vdCBmb3JjZSBzY2FsZXMsIHJvdGF0ZXMsIGV0Yy4KKyAgICBjb25zdCBib29sIGxpbmVhckZpbHRlciA9IG1TbmFwc2hvdC0+dHJhbnNmb3JtLT5jaGFuZ2VzQm91bmRzKCk7CisgICAgc2V0dXBUZXh0dXJlQWxwaGE4KGZvbnRSZW5kZXJlci5nZXRUZXh0dXJlKGxpbmVhckZpbHRlciksIDAsIDAsIHRleHR1cmVVbml0LAorICAgICAgICAgICAgeCwgeSwgciwgZywgYiwgYSwgbW9kZSwgZmFsc2UsIHRydWUpOworCisgICAgY29uc3QgUmVjdCYgY2xpcCA9IG1TbmFwc2hvdC0+Z2V0TG9jYWxDbGlwKCk7CisgICAgY2xlYXJMYXllclJlZ2lvbnMoKTsKKyAgICBmb250UmVuZGVyZXIucmVuZGVyVGV4dChwYWludCwgJmNsaXAsIHRleHQsIDAsIGJ5dGVzQ291bnQsIGNvdW50LCB4LCB5KTsKKworICAgIGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgMCk7CisgICAgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Z2V0QXR0cmliKCJ0ZXhDb29yZHMiKSk7CisKKyAgICBkcmF3VGV4dERlY29yYXRpb25zKHRleHQsIGJ5dGVzQ291bnQsIGxlbmd0aCwgeCwgeSwgcGFpbnQpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3UGF0aChTa1BhdGgqIHBhdGgsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgR0x1aW50IHRleHR1cmVVbml0ID0gMDsKKyAgICBnbEFjdGl2ZVRleHR1cmUoZ1RleHR1cmVVbml0c1t0ZXh0dXJlVW5pdF0pOworCisgICAgY29uc3QgUGF0aFRleHR1cmUqIHRleHR1cmUgPSBtQ2FjaGVzLnBhdGhDYWNoZS5nZXQocGF0aCwgcGFpbnQpOworICAgIGlmICghdGV4dHVyZSkgcmV0dXJuOworICAgIGNvbnN0IEF1dG9UZXh0dXJlIGF1dG9DbGVhbnVwKHRleHR1cmUpOworCisgICAgY29uc3QgZmxvYXQgeCA9IHRleHR1cmUtPmxlZnQgLSB0ZXh0dXJlLT5vZmZzZXQ7CisgICAgY29uc3QgZmxvYXQgeSA9IHRleHR1cmUtPnRvcCAtIHRleHR1cmUtPm9mZnNldDsKKworICAgIGlmIChxdWlja1JlamVjdCh4LCB5LCB4ICsgdGV4dHVyZS0+d2lkdGgsIHkgKyB0ZXh0dXJlLT5oZWlnaHQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgYWxwaGE7CisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlOworICAgIGdldEFscGhhQW5kTW9kZShwYWludCwgJmFscGhhLCAmbW9kZSk7CisKKyAgICB1aW50MzJfdCBjb2xvciA9IHBhaW50LT5nZXRDb2xvcigpOworICAgIGNvbnN0IEdMZmxvYXQgYSA9IGFscGhhIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgciA9IGEgKiAoKGNvbG9yID4+IDE2KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgZyA9IGEgKiAoKGNvbG9yID4+ICA4KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgYiA9IGEgKiAoKGNvbG9yICAgICAgKSAmIDB4RkYpIC8gMjU1LjBmOworCisgICAgc2V0dXBUZXh0dXJlQWxwaGE4KHRleHR1cmUsIHRleHR1cmVVbml0LCB4LCB5LCByLCBnLCBiLCBhLCBtb2RlLCB0cnVlLCB0cnVlKTsKKworICAgIGNsZWFyTGF5ZXJSZWdpb25zKCk7CisKKyAgICAvLyBEcmF3IHRoZSBtZXNoCisgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX1NUUklQLCAwLCBnTWVzaENvdW50KTsKKyAgICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5nZXRBdHRyaWIoInRleENvb3JkcyIpKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2hhZGVycworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpyZXNldFNoYWRlcigpIHsKKyAgICBtU2hhZGVyID0gTlVMTDsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0dXBTaGFkZXIoU2tpYVNoYWRlciogc2hhZGVyKSB7CisgICAgbVNoYWRlciA9IHNoYWRlcjsKKyAgICBpZiAobVNoYWRlcikgeworICAgICAgICBtU2hhZGVyLT5zZXQoJm1DYWNoZXMudGV4dHVyZUNhY2hlLCAmbUNhY2hlcy5ncmFkaWVudENhY2hlKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbG9yIGZpbHRlcnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cmVzZXRDb2xvckZpbHRlcigpIHsKKyAgICBtQ29sb3JGaWx0ZXIgPSBOVUxMOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXR1cENvbG9yRmlsdGVyKFNraWFDb2xvckZpbHRlciogZmlsdGVyKSB7CisgICAgbUNvbG9yRmlsdGVyID0gZmlsdGVyOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEcm9wIHNoYWRvdworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpyZXNldFNoYWRvdygpIHsKKyAgICBtSGFzU2hhZG93ID0gZmFsc2U7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldHVwU2hhZG93KGZsb2F0IHJhZGl1cywgZmxvYXQgZHgsIGZsb2F0IGR5LCBpbnQgY29sb3IpIHsKKyAgICBtSGFzU2hhZG93ID0gdHJ1ZTsKKyAgICBtU2hhZG93UmFkaXVzID0gcmFkaXVzOworICAgIG1TaGFkb3dEeCA9IGR4OworICAgIG1TaGFkb3dEeSA9IGR5OworICAgIG1TaGFkb3dDb2xvciA9IGNvbG9yOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEcmF3aW5nIGltcGxlbWVudGF0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldHVwU2hhZG93KGNvbnN0IFNoYWRvd1RleHR1cmUqIHRleHR1cmUsIGZsb2F0IHgsIGZsb2F0IHksCisgICAgICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgZmxvYXQgYWxwaGEpIHsKKyAgICBjb25zdCBmbG9hdCBzeCA9IHggLSB0ZXh0dXJlLT5sZWZ0ICsgbVNoYWRvd0R4OworICAgIGNvbnN0IGZsb2F0IHN5ID0geSAtIHRleHR1cmUtPnRvcCArIG1TaGFkb3dEeTsKKworICAgIGNvbnN0IGludCBzaGFkb3dBbHBoYSA9ICgobVNoYWRvd0NvbG9yID4+IDI0KSAmIDB4RkYpOworICAgIGNvbnN0IEdMZmxvYXQgYSA9IHNoYWRvd0FscGhhIDwgMjU1ID8gc2hhZG93QWxwaGEgLyAyNTUuMGYgOiBhbHBoYTsKKyAgICBjb25zdCBHTGZsb2F0IHIgPSBhICogKChtU2hhZG93Q29sb3IgPj4gMTYpICYgMHhGRikgLyAyNTUuMGY7CisgICAgY29uc3QgR0xmbG9hdCBnID0gYSAqICgobVNoYWRvd0NvbG9yID4+ICA4KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgYiA9IGEgKiAoKG1TaGFkb3dDb2xvciAgICAgICkgJiAweEZGKSAvIDI1NS4wZjsKKworICAgIEdMdWludCB0ZXh0dXJlVW5pdCA9IDA7CisgICAgc2V0dXBUZXh0dXJlQWxwaGE4KHRleHR1cmUsIHRleHR1cmVVbml0LCBzeCwgc3ksIHIsIGcsIGIsIGEsIG1vZGUsIHRydWUsIGZhbHNlKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0dXBUZXh0dXJlQWxwaGE4KGNvbnN0IFRleHR1cmUqIHRleHR1cmUsIEdMdWludCYgdGV4dHVyZVVuaXQsCisgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwKKyAgICAgICAgYm9vbCB0cmFuc2Zvcm1zLCBib29sIGFwcGx5RmlsdGVycykgeworICAgIHNldHVwVGV4dHVyZUFscGhhOCh0ZXh0dXJlLT5pZCwgdGV4dHVyZS0+d2lkdGgsIHRleHR1cmUtPmhlaWdodCwgdGV4dHVyZVVuaXQsCisgICAgICAgICAgICB4LCB5LCByLCBnLCBiLCBhLCBtb2RlLCB0cmFuc2Zvcm1zLCBhcHBseUZpbHRlcnMsCisgICAgICAgICAgICAmbU1lc2hWZXJ0aWNlc1swXS5wb3NpdGlvblswXSwgJm1NZXNoVmVydGljZXNbMF0udGV4dHVyZVswXSk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldHVwVGV4dHVyZUFscGhhOChHTHVpbnQgdGV4dHVyZSwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgR0x1aW50JiB0ZXh0dXJlVW5pdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSwKKyAgICAgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIHRyYW5zZm9ybXMsIGJvb2wgYXBwbHlGaWx0ZXJzKSB7CisgICAgc2V0dXBUZXh0dXJlQWxwaGE4KHRleHR1cmUsIHdpZHRoLCBoZWlnaHQsIHRleHR1cmVVbml0LAorICAgICAgICAgICAgeCwgeSwgciwgZywgYiwgYSwgbW9kZSwgdHJhbnNmb3JtcywgYXBwbHlGaWx0ZXJzLAorICAgICAgICAgICAgJm1NZXNoVmVydGljZXNbMF0ucG9zaXRpb25bMF0sICZtTWVzaFZlcnRpY2VzWzBdLnRleHR1cmVbMF0pOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXR1cFRleHR1cmVBbHBoYTgoR0x1aW50IHRleHR1cmUsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgIEdMdWludCYgdGV4dHVyZVVuaXQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEsCisgICAgICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCB0cmFuc2Zvcm1zLCBib29sIGFwcGx5RmlsdGVycywKKyAgICAgICAgR0x2b2lkKiB2ZXJ0aWNlcywgR0x2b2lkKiB0ZXhDb29yZHMpIHsKKyAgICAgLy8gRGVzY3JpYmUgdGhlIHJlcXVpcmVkIHNoYWRlcnMKKyAgICAgUHJvZ3JhbURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOworICAgICBkZXNjcmlwdGlvbi5oYXNUZXh0dXJlID0gdHJ1ZTsKKyAgICAgZGVzY3JpcHRpb24uaGFzQWxwaGE4VGV4dHVyZSA9IHRydWU7CisKKyAgICAgaWYgKGFwcGx5RmlsdGVycykgeworICAgICAgICAgaWYgKG1TaGFkZXIpIHsKKyAgICAgICAgICAgICBtU2hhZGVyLT5kZXNjcmliZShkZXNjcmlwdGlvbiwgbUV4dGVuc2lvbnMpOworICAgICAgICAgfQorICAgICAgICAgaWYgKG1Db2xvckZpbHRlcikgeworICAgICAgICAgICAgIG1Db2xvckZpbHRlci0+ZGVzY3JpYmUoZGVzY3JpcHRpb24sIG1FeHRlbnNpb25zKTsKKyAgICAgICAgIH0KKyAgICAgfQorCisgICAgIC8vIFNldHVwIHRoZSBibGVuZGluZyBtb2RlCisgICAgIGNob29zZUJsZW5kaW5nKHRydWUsIG1vZGUsIGRlc2NyaXB0aW9uKTsKKworICAgICAvLyBCdWlsZCBhbmQgdXNlIHRoZSBhcHByb3ByaWF0ZSBzaGFkZXIKKyAgICAgdXNlUHJvZ3JhbShtQ2FjaGVzLnByb2dyYW1DYWNoZS5nZXQoZGVzY3JpcHRpb24pKTsKKworICAgICBiaW5kVGV4dHVyZSh0ZXh0dXJlLCBHTF9DTEFNUF9UT19FREdFLCBHTF9DTEFNUF9UT19FREdFLCB0ZXh0dXJlVW5pdCk7CisgICAgIGdsVW5pZm9ybTFpKG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmdldFVuaWZvcm0oInNhbXBsZXIiKSwgdGV4dHVyZVVuaXQpOworCisgICAgIGludCB0ZXhDb29yZHNTbG90ID0gbUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Z2V0QXR0cmliKCJ0ZXhDb29yZHMiKTsKKyAgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0ZXhDb29yZHNTbG90KTsKKworICAgICAvLyBTZXR1cCBhdHRyaWJ1dGVzCisgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5wb3NpdGlvbiwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICAgICAgIGdNZXNoU3RyaWRlLCB2ZXJ0aWNlcyk7CisgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcih0ZXhDb29yZHNTbG90LCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsCisgICAgICAgICAgICAgZ01lc2hTdHJpZGUsIHRleENvb3Jkcyk7CisKKyAgICAgLy8gU2V0dXAgdW5pZm9ybXMKKyAgICAgaWYgKHRyYW5zZm9ybXMpIHsKKyAgICAgICAgIG1Nb2RlbFZpZXcubG9hZFRyYW5zbGF0ZSh4LCB5LCAwLjBmKTsKKyAgICAgICAgIG1Nb2RlbFZpZXcuc2NhbGUod2lkdGgsIGhlaWdodCwgMS4wZik7CisgICAgIH0gZWxzZSB7CisgICAgICAgICBtTW9kZWxWaWV3LmxvYWRJZGVudGl0eSgpOworICAgICB9CisgICAgIG1DYWNoZXMuY3VycmVudFByb2dyYW0tPnNldChtT3J0aG9NYXRyaXgsIG1Nb2RlbFZpZXcsICptU25hcHNob3QtPnRyYW5zZm9ybSk7CisgICAgIGdsVW5pZm9ybTRmKG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmNvbG9yLCByLCBnLCBiLCBhKTsKKworICAgICB0ZXh0dXJlVW5pdCsrOworICAgICBpZiAoYXBwbHlGaWx0ZXJzKSB7CisgICAgICAgICAvLyBTZXR1cCBhdHRyaWJ1dGVzIGFuZCB1bmlmb3JtcyByZXF1aXJlZCBieSB0aGUgc2hhZGVycworICAgICAgICAgaWYgKG1TaGFkZXIpIHsKKyAgICAgICAgICAgICBtU2hhZGVyLT5zZXR1cFByb2dyYW0obUNhY2hlcy5jdXJyZW50UHJvZ3JhbSwgbU1vZGVsVmlldywgKm1TbmFwc2hvdCwgJnRleHR1cmVVbml0KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmIChtQ29sb3JGaWx0ZXIpIHsKKyAgICAgICAgICAgICBtQ29sb3JGaWx0ZXItPnNldHVwUHJvZ3JhbShtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtKTsKKyAgICAgICAgIH0KKyAgICAgfQorfQorCisvLyBTYW1lIHZhbHVlcyB1c2VkIGJ5IFNraWEKKyNkZWZpbmUga1N0ZFN0cmlrZVRocnVfT2Zmc2V0ICAgKC02LjBmIC8gMjEuMGYpCisjZGVmaW5lIGtTdGRVbmRlcmxpbmVfT2Zmc2V0ICAgICgxLjBmIC8gOS4wZikKKyNkZWZpbmUga1N0ZFVuZGVybGluZV9UaGlja25lc3MgKDEuMGYgLyAxOC4wZikKKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1RleHREZWNvcmF0aW9ucyhjb25zdCBjaGFyKiB0ZXh0LCBpbnQgYnl0ZXNDb3VudCwgZmxvYXQgbGVuZ3RoLAorICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBTa1BhaW50KiBwYWludCkgeworICAgIC8vIEhhbmRsZSB1bmRlcmxpbmUgYW5kIHN0cmlrZS10aHJvdWdoCisgICAgdWludDMyX3QgZmxhZ3MgPSBwYWludC0+Z2V0RmxhZ3MoKTsKKyAgICBpZiAoZmxhZ3MgJiAoU2tQYWludDo6a1VuZGVybGluZVRleHRfRmxhZyB8IFNrUGFpbnQ6OmtTdHJpa2VUaHJ1VGV4dF9GbGFnKSkgeworICAgICAgICBmbG9hdCB1bmRlcmxpbmVXaWR0aCA9IGxlbmd0aDsKKyAgICAgICAgLy8gSWYgbGVuZ3RoIGlzID4gMC4wZiwgd2UgYWxyZWFkeSBtZWFzdXJlZCB0aGUgdGV4dCBmb3IgdGhlIHRleHQgYWxpZ25tZW50CisgICAgICAgIGlmIChsZW5ndGggPD0gMC4wZikgeworICAgICAgICAgICAgdW5kZXJsaW5lV2lkdGggPSBwYWludC0+bWVhc3VyZVRleHQodGV4dCwgYnl0ZXNDb3VudCk7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBvZmZzZXRYID0gMDsKKyAgICAgICAgc3dpdGNoIChwYWludC0+Z2V0VGV4dEFsaWduKCkpIHsKKyAgICAgICAgICAgIGNhc2UgU2tQYWludDo6a0NlbnRlcl9BbGlnbjoKKyAgICAgICAgICAgICAgICBvZmZzZXRYID0gdW5kZXJsaW5lV2lkdGggKiAwLjVmOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTa1BhaW50OjprUmlnaHRfQWxpZ246CisgICAgICAgICAgICAgICAgb2Zmc2V0WCA9IHVuZGVybGluZVdpZHRoOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh1bmRlcmxpbmVXaWR0aCA+IDAuMGYpIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHRleHRTaXplID0gcGFpbnQtPmdldFRleHRTaXplKCk7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBzdHJva2VXaWR0aCA9IHRleHRTaXplICoga1N0ZFVuZGVybGluZV9UaGlja25lc3M7CisKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IGxlZnQgPSB4IC0gb2Zmc2V0WDsKKyAgICAgICAgICAgIGZsb2F0IHRvcCA9IDAuMGY7CisKKyAgICAgICAgICAgIGNvbnN0IGludCBwb2ludHNDb3VudCA9IDQgKiAoZmxhZ3MgJiBTa1BhaW50OjprU3RyaWtlVGhydVRleHRfRmxhZyA/IDIgOiAxKTsKKyAgICAgICAgICAgIGZsb2F0IHBvaW50c1twb2ludHNDb3VudF07CisgICAgICAgICAgICBpbnQgY3VycmVudFBvaW50ID0gMDsKKworICAgICAgICAgICAgaWYgKGZsYWdzICYgU2tQYWludDo6a1VuZGVybGluZVRleHRfRmxhZykgeworICAgICAgICAgICAgICAgIHRvcCA9IHkgKyB0ZXh0U2l6ZSAqIGtTdGRVbmRlcmxpbmVfT2Zmc2V0OworICAgICAgICAgICAgICAgIHBvaW50c1tjdXJyZW50UG9pbnQrK10gPSBsZWZ0OworICAgICAgICAgICAgICAgIHBvaW50c1tjdXJyZW50UG9pbnQrK10gPSB0b3A7CisgICAgICAgICAgICAgICAgcG9pbnRzW2N1cnJlbnRQb2ludCsrXSA9IGxlZnQgKyB1bmRlcmxpbmVXaWR0aDsKKyAgICAgICAgICAgICAgICBwb2ludHNbY3VycmVudFBvaW50KytdID0gdG9wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBTa1BhaW50OjprU3RyaWtlVGhydVRleHRfRmxhZykgeworICAgICAgICAgICAgICAgIHRvcCA9IHkgKyB0ZXh0U2l6ZSAqIGtTdGRTdHJpa2VUaHJ1X09mZnNldDsKKyAgICAgICAgICAgICAgICBwb2ludHNbY3VycmVudFBvaW50KytdID0gbGVmdDsKKyAgICAgICAgICAgICAgICBwb2ludHNbY3VycmVudFBvaW50KytdID0gdG9wOworICAgICAgICAgICAgICAgIHBvaW50c1tjdXJyZW50UG9pbnQrK10gPSBsZWZ0ICsgdW5kZXJsaW5lV2lkdGg7CisgICAgICAgICAgICAgICAgcG9pbnRzW2N1cnJlbnRQb2ludCsrXSA9IHRvcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2tQYWludCBsaW5lc1BhaW50KCpwYWludCk7CisgICAgICAgICAgICBsaW5lc1BhaW50LnNldFN0cm9rZVdpZHRoKHN0cm9rZVdpZHRoKTsKKworICAgICAgICAgICAgZHJhd0xpbmVzKCZwb2ludHNbMF0sIHBvaW50c0NvdW50LCAmbGluZXNQYWludCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdDb2xvclJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICBpbnQgY29sb3IsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCBpZ25vcmVUcmFuc2Zvcm0pIHsKKyAgICBjbGVhckxheWVyUmVnaW9ucygpOworCisgICAgLy8gSWYgYSBzaGFkZXIgaXMgc2V0LCBwcmVzZXJ2ZSBvbmx5IHRoZSBhbHBoYQorICAgIGlmIChtU2hhZGVyKSB7CisgICAgICAgIGNvbG9yIHw9IDB4MDBmZmZmZmY7CisgICAgfQorCisgICAgLy8gUmVuZGVyIHVzaW5nIHByZS1tdWx0aXBsaWVkIGFscGhhCisgICAgY29uc3QgaW50IGFscGhhID0gKGNvbG9yID4+IDI0KSAmIDB4RkY7CisgICAgY29uc3QgR0xmbG9hdCBhID0gYWxwaGEgLyAyNTUuMGY7CisgICAgY29uc3QgR0xmbG9hdCByID0gYSAqICgoY29sb3IgPj4gMTYpICYgMHhGRikgLyAyNTUuMGY7CisgICAgY29uc3QgR0xmbG9hdCBnID0gYSAqICgoY29sb3IgPj4gIDgpICYgMHhGRikgLyAyNTUuMGY7CisgICAgY29uc3QgR0xmbG9hdCBiID0gYSAqICgoY29sb3IgICAgICApICYgMHhGRikgLyAyNTUuMGY7CisKKyAgICBzZXR1cENvbG9yUmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHIsIGcsIGIsIGEsIG1vZGUsIGlnbm9yZVRyYW5zZm9ybSk7CisKKyAgICAvLyBEcmF3IHRoZSBtZXNoCisgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX1NUUklQLCAwLCBnTWVzaENvdW50KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0dXBDb2xvclJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgaWdub3JlVHJhbnNmb3JtKSB7CisgICAgR0x1aW50IHRleHR1cmVVbml0ID0gMDsKKworICAgIC8vIERlc2NyaWJlIHRoZSByZXF1aXJlZCBzaGFkZXJzCisgICAgUHJvZ3JhbURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOworICAgIGlmIChtU2hhZGVyKSB7CisgICAgICAgIG1TaGFkZXItPmRlc2NyaWJlKGRlc2NyaXB0aW9uLCBtRXh0ZW5zaW9ucyk7CisgICAgfQorICAgIGlmIChtQ29sb3JGaWx0ZXIpIHsKKyAgICAgICAgbUNvbG9yRmlsdGVyLT5kZXNjcmliZShkZXNjcmlwdGlvbiwgbUV4dGVuc2lvbnMpOworICAgIH0KKworICAgIC8vIFNldHVwIHRoZSBibGVuZGluZyBtb2RlCisgICAgY2hvb3NlQmxlbmRpbmcoYSA8IDEuMGYgfHwgKG1TaGFkZXIgJiYgbVNoYWRlci0+YmxlbmQoKSksIG1vZGUsIGRlc2NyaXB0aW9uKTsKKworICAgIC8vIEJ1aWxkIGFuZCB1c2UgdGhlIGFwcHJvcHJpYXRlIHNoYWRlcgorICAgIHVzZVByb2dyYW0obUNhY2hlcy5wcm9ncmFtQ2FjaGUuZ2V0KGRlc2NyaXB0aW9uKSk7CisKKyAgICAvLyBTZXR1cCBhdHRyaWJ1dGVzCisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG1DYWNoZXMuY3VycmVudFByb2dyYW0tPnBvc2l0aW9uLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsCisgICAgICAgICAgICBnTWVzaFN0cmlkZSwgJm1NZXNoVmVydGljZXNbMF0ucG9zaXRpb25bMF0pOworCisgICAgLy8gU2V0dXAgdW5pZm9ybXMKKyAgICBtTW9kZWxWaWV3LmxvYWRUcmFuc2xhdGUobGVmdCwgdG9wLCAwLjBmKTsKKyAgICBtTW9kZWxWaWV3LnNjYWxlKHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wLCAxLjBmKTsKKyAgICBpZiAoIWlnbm9yZVRyYW5zZm9ybSkgeworICAgICAgICBtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5zZXQobU9ydGhvTWF0cml4LCBtTW9kZWxWaWV3LCAqbVNuYXBzaG90LT50cmFuc2Zvcm0pOworICAgIH0gZWxzZSB7CisgICAgICAgIG1hdDQgaWRlbnRpdHk7CisgICAgICAgIG1DYWNoZXMuY3VycmVudFByb2dyYW0tPnNldChtT3J0aG9NYXRyaXgsIG1Nb2RlbFZpZXcsIGlkZW50aXR5KTsKKyAgICB9CisgICAgZ2xVbmlmb3JtNGYobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Y29sb3IsIHIsIGcsIGIsIGEpOworCisgICAgLy8gU2V0dXAgYXR0cmlidXRlcyBhbmQgdW5pZm9ybXMgcmVxdWlyZWQgYnkgdGhlIHNoYWRlcnMKKyAgICBpZiAobVNoYWRlcikgeworICAgICAgICBtU2hhZGVyLT5zZXR1cFByb2dyYW0obUNhY2hlcy5jdXJyZW50UHJvZ3JhbSwgbU1vZGVsVmlldywgKm1TbmFwc2hvdCwgJnRleHR1cmVVbml0KTsKKyAgICB9CisgICAgaWYgKG1Db2xvckZpbHRlcikgeworICAgICAgICBtQ29sb3JGaWx0ZXItPnNldHVwUHJvZ3JhbShtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtKTsKKyAgICB9Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdUZXh0dXJlUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUsIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgaW50IGFscGhhOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZTsKKyAgICBnZXRBbHBoYUFuZE1vZGUocGFpbnQsICZhbHBoYSwgJm1vZGUpOworCisgICAgZHJhd1RleHR1cmVNZXNoKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgdGV4dHVyZS0+aWQsIGFscGhhIC8gMjU1LjBmLCBtb2RlLAorICAgICAgICAgICAgdGV4dHVyZS0+YmxlbmQsICZtTWVzaFZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdLCAmbU1lc2hWZXJ0aWNlc1swXS50ZXh0dXJlWzBdLAorICAgICAgICAgICAgR0xfVFJJQU5HTEVfU1RSSVAsIGdNZXNoQ291bnQpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3VGV4dHVyZVJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICBHTHVpbnQgdGV4dHVyZSwgZmxvYXQgYWxwaGEsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCBibGVuZCkgeworICAgIGRyYXdUZXh0dXJlTWVzaChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHRleHR1cmUsIGFscGhhLCBtb2RlLCBibGVuZCwKKyAgICAgICAgICAgICZtTWVzaFZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdLCAmbU1lc2hWZXJ0aWNlc1swXS50ZXh0dXJlWzBdLAorICAgICAgICAgICAgR0xfVFJJQU5HTEVfU1RSSVAsIGdNZXNoQ291bnQpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3VGV4dHVyZU1lc2goZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICBHTHVpbnQgdGV4dHVyZSwgZmxvYXQgYWxwaGEsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCBibGVuZCwKKyAgICAgICAgR0x2b2lkKiB2ZXJ0aWNlcywgR0x2b2lkKiB0ZXhDb29yZHMsIEdMZW51bSBkcmF3TW9kZSwgR0xzaXplaSBlbGVtZW50c0NvdW50LAorICAgICAgICBib29sIHN3YXBTcmNEc3QsIGJvb2wgaWdub3JlVHJhbnNmb3JtKSB7CisgICAgY2xlYXJMYXllclJlZ2lvbnMoKTsKKworICAgIFByb2dyYW1EZXNjcmlwdGlvbiBkZXNjcmlwdGlvbjsKKyAgICBkZXNjcmlwdGlvbi5oYXNUZXh0dXJlID0gdHJ1ZTsKKyAgICBpZiAobUNvbG9yRmlsdGVyKSB7CisgICAgICAgIG1Db2xvckZpbHRlci0+ZGVzY3JpYmUoZGVzY3JpcHRpb24sIG1FeHRlbnNpb25zKTsKKyAgICB9CisKKyAgICBtTW9kZWxWaWV3LmxvYWRUcmFuc2xhdGUobGVmdCwgdG9wLCAwLjBmKTsKKyAgICBtTW9kZWxWaWV3LnNjYWxlKHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wLCAxLjBmKTsKKworICAgIGNob29zZUJsZW5kaW5nKGJsZW5kIHx8IGFscGhhIDwgMS4wZiwgbW9kZSwgZGVzY3JpcHRpb24sIHN3YXBTcmNEc3QpOworCisgICAgdXNlUHJvZ3JhbShtQ2FjaGVzLnByb2dyYW1DYWNoZS5nZXQoZGVzY3JpcHRpb24pKTsKKyAgICBpZiAoIWlnbm9yZVRyYW5zZm9ybSkgeworICAgICAgICBtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5zZXQobU9ydGhvTWF0cml4LCBtTW9kZWxWaWV3LCAqbVNuYXBzaG90LT50cmFuc2Zvcm0pOworICAgIH0gZWxzZSB7CisgICAgICAgIG1hdDQgbTsKKyAgICAgICAgbUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+c2V0KG1PcnRob01hdHJpeCwgbU1vZGVsVmlldywgbSk7CisgICAgfQorCisgICAgLy8gVGV4dHVyZQorICAgIGJpbmRUZXh0dXJlKHRleHR1cmUsIEdMX0NMQU1QX1RPX0VER0UsIEdMX0NMQU1QX1RPX0VER0UsIDApOworICAgIGdsVW5pZm9ybTFpKG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmdldFVuaWZvcm0oInNhbXBsZXIiKSwgMCk7CisKKyAgICAvLyBBbHdheXMgcHJlbXVsdGlwbGllZAorICAgIGdsVW5pZm9ybTRmKG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmNvbG9yLCBhbHBoYSwgYWxwaGEsIGFscGhhLCBhbHBoYSk7CisKKyAgICAvLyBNZXNoCisgICAgaW50IHRleENvb3Jkc1Nsb3QgPSBtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5nZXRBdHRyaWIoInRleENvb3JkcyIpOworICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkodGV4Q29vcmRzU2xvdCk7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG1DYWNoZXMuY3VycmVudFByb2dyYW0tPnBvc2l0aW9uLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsCisgICAgICAgICAgICBnTWVzaFN0cmlkZSwgdmVydGljZXMpOworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcih0ZXhDb29yZHNTbG90LCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsIGdNZXNoU3RyaWRlLCB0ZXhDb29yZHMpOworCisgICAgLy8gQ29sb3IgZmlsdGVyCisgICAgaWYgKG1Db2xvckZpbHRlcikgeworICAgICAgICBtQ29sb3JGaWx0ZXItPnNldHVwUHJvZ3JhbShtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtKTsKKyAgICB9CisKKyAgICBnbERyYXdBcnJheXMoZHJhd01vZGUsIDAsIGVsZW1lbnRzQ291bnQpOworICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHRleENvb3Jkc1Nsb3QpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpjaG9vc2VCbGVuZGluZyhib29sIGJsZW5kLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsCisgICAgICAgIFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGJvb2wgc3dhcFNyY0RzdCkgeworICAgIGJsZW5kID0gYmxlbmQgfHwgbW9kZSAhPSBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlOworICAgIGlmIChibGVuZCkgeworICAgICAgICBpZiAobW9kZSA8IFNrWGZlcm1vZGU6OmtQbHVzX01vZGUpIHsKKyAgICAgICAgICAgIGlmICghbUNhY2hlcy5ibGVuZCkgeworICAgICAgICAgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgR0xlbnVtIHNvdXJjZU1vZGUgPSBzd2FwU3JjRHN0ID8gZ0JsZW5kc1N3YXBbbW9kZV0uc3JjIDogZ0JsZW5kc1ttb2RlXS5zcmM7CisgICAgICAgICAgICBHTGVudW0gZGVzdE1vZGUgPSBzd2FwU3JjRHN0ID8gZ0JsZW5kc1N3YXBbbW9kZV0uZHN0IDogZ0JsZW5kc1ttb2RlXS5kc3Q7CisKKyAgICAgICAgICAgIGlmIChzb3VyY2VNb2RlICE9IG1DYWNoZXMubGFzdFNyY01vZGUgfHwgZGVzdE1vZGUgIT0gbUNhY2hlcy5sYXN0RHN0TW9kZSkgeworICAgICAgICAgICAgICAgIGdsQmxlbmRGdW5jKHNvdXJjZU1vZGUsIGRlc3RNb2RlKTsKKyAgICAgICAgICAgICAgICBtQ2FjaGVzLmxhc3RTcmNNb2RlID0gc291cmNlTW9kZTsKKyAgICAgICAgICAgICAgICBtQ2FjaGVzLmxhc3REc3RNb2RlID0gZGVzdE1vZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGVzZSBibGVuZCBtb2RlcyBhcmUgbm90IHN1cHBvcnRlZCBieSBPcGVuR0wgZGlyZWN0bHkgYW5kIGhhdmUKKyAgICAgICAgICAgIC8vIHRvIGJlIGltcGxlbWVudGVkIHVzaW5nIHNoYWRlcnMuIFNpbmNlIHRoZSBzaGFkZXIgd2lsbCBwZXJmb3JtCisgICAgICAgICAgICAvLyB0aGUgYmxlbmRpbmcsIHR1cm4gYmxlbmRpbmcgb2ZmIGhlcmUKKyAgICAgICAgICAgIGlmIChtRXh0ZW5zaW9ucy5oYXNGcmFtZWJ1ZmZlckZldGNoKCkpIHsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5mcmFtZWJ1ZmZlck1vZGUgPSBtb2RlOworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLnN3YXBTcmNEc3QgPSBzd2FwU3JjRHN0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUNhY2hlcy5ibGVuZCkgeworICAgICAgICAgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBibGVuZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtQ2FjaGVzLmJsZW5kKSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgfQorICAgIG1DYWNoZXMuYmxlbmQgPSBibGVuZDsKK30KKworYm9vbCBPcGVuR0xSZW5kZXJlcjo6dXNlUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKSB7CisgICAgaWYgKCFwcm9ncmFtLT5pc0luVXNlKCkpIHsKKyAgICAgICAgaWYgKG1DYWNoZXMuY3VycmVudFByb2dyYW0gIT0gTlVMTCkgbUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+cmVtb3ZlKCk7CisgICAgICAgIHByb2dyYW0tPnVzZSgpOworICAgICAgICBtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtID0gcHJvZ3JhbTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cmVzZXREcmF3VGV4dHVyZVRleENvb3JkcyhmbG9hdCB1MSwgZmxvYXQgdjEsIGZsb2F0IHUyLCBmbG9hdCB2MikgeworICAgIFRleHR1cmVWZXJ0ZXgqIHYgPSAmbU1lc2hWZXJ0aWNlc1swXTsKKyAgICBUZXh0dXJlVmVydGV4OjpzZXRVVih2KyssIHUxLCB2MSk7CisgICAgVGV4dHVyZVZlcnRleDo6c2V0VVYodisrLCB1MiwgdjEpOworICAgIFRleHR1cmVWZXJ0ZXg6OnNldFVWKHYrKywgdTEsIHYyKTsKKyAgICBUZXh0dXJlVmVydGV4OjpzZXRVVih2KyssIHUyLCB2Mik7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmdldEFscGhhQW5kTW9kZShjb25zdCBTa1BhaW50KiBwYWludCwgaW50KiBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSogbW9kZSkgeworICAgIGlmIChwYWludCkgeworICAgICAgICBpZiAoIW1FeHRlbnNpb25zLmhhc0ZyYW1lYnVmZmVyRmV0Y2goKSkgeworICAgICAgICAgICAgY29uc3QgYm9vbCBpc01vZGUgPSBTa1hmZXJtb2RlOjpJc01vZGUocGFpbnQtPmdldFhmZXJtb2RlKCksIG1vZGUpOworICAgICAgICAgICAgaWYgKCFpc01vZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBBc3N1bWUgU1JDX09WRVIKKyAgICAgICAgICAgICAgICAqbW9kZSA9IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqbW9kZSA9IGdldFhmZXJtb2RlKHBhaW50LT5nZXRYZmVybW9kZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNraWEgZHJhd3MgdXNpbmcgdGhlIGNvbG9yJ3MgYWxwaGEgY2hhbm5lbCBpZiA8IDI1NQorICAgICAgICAvLyBPdGhlcndpc2UsIGl0IHVzZXMgdGhlIHBhaW50J3MgYWxwaGEKKyAgICAgICAgaW50IGNvbG9yID0gcGFpbnQtPmdldENvbG9yKCk7CisgICAgICAgICphbHBoYSA9IChjb2xvciA+PiAyNCkgJiAweEZGOworICAgICAgICBpZiAoKmFscGhhID09IDI1NSkgeworICAgICAgICAgICAgKmFscGhhID0gcGFpbnQtPmdldEFscGhhKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAqbW9kZSA9IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgICAgICphbHBoYSA9IDI1NTsKKyAgICB9Cit9CisKK1NrWGZlcm1vZGU6Ok1vZGUgT3BlbkdMUmVuZGVyZXI6OmdldFhmZXJtb2RlKFNrWGZlcm1vZGUqIG1vZGUpIHsKKyAgICBpZiAobW9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlOworICAgIH0KKyAgICByZXR1cm4gbW9kZS0+Zk1vZGU7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmJpbmRUZXh0dXJlKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gd3JhcFMsIEdMZW51bSB3cmFwVCwgR0x1aW50IHRleHR1cmVVbml0KSB7CisgICAgZ2xBY3RpdmVUZXh0dXJlKGdUZXh0dXJlVW5pdHNbdGV4dHVyZVVuaXRdKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgd3JhcFMpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgd3JhcFQpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5oIGIvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNkNDY1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5oCkBAIC0wLDAgKzEsNDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX09QRU5HTF9SRU5ERVJFUl9ICisjZGVmaW5lIEFORFJPSURfVUlfT1BFTkdMX1JFTkRFUkVSX0gKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCisjaW5jbHVkZSA8U2tCaXRtYXAuaD4KKyNpbmNsdWRlIDxTa01hdHJpeC5oPgorI2luY2x1ZGUgPFNrUGFpbnQuaD4KKyNpbmNsdWRlIDxTa1JlZ2lvbi5oPgorI2luY2x1ZGUgPFNrU2hhZGVyLmg+CisjaW5jbHVkZSA8U2tYZmVybW9kZS5oPgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSAiRXh0ZW5zaW9ucy5oIgorI2luY2x1ZGUgIk1hdHJpeC5oIgorI2luY2x1ZGUgIlByb2dyYW0uaCIKKyNpbmNsdWRlICJSZWN0LmgiCisjaW5jbHVkZSAiU25hcHNob3QuaCIKKyNpbmNsdWRlICJWZXJ0ZXguaCIKKyNpbmNsdWRlICJTa2lhU2hhZGVyLmgiCisjaW5jbHVkZSAiU2tpYUNvbG9yRmlsdGVyLmgiCisjaW5jbHVkZSAiQ2FjaGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGVmaW5lcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBEZWJ1ZworI2RlZmluZSBERUJVR19PUEVOR0wgMQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZW5kZXJlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBEaXNwbGF5TGlzdFJlbmRlcmVyOworCisvKioKKyAqIE9wZW5HTCByZW5kZXJlciB1c2VkIHRvIGRyYXcgYWNjZWxlcmF0ZWQgMkQgZ3JhcGhpY3MuIFRoZSBBUEkgaXMgYQorICogc2ltcGxpZmllZCB2ZXJzaW9uIG9mIFNraWEncyBDYW52YXMgQVBJLgorICovCitjbGFzcyBPcGVuR0xSZW5kZXJlciB7CitwdWJsaWM6CisgICAgT3BlbkdMUmVuZGVyZXIoKTsKKyAgICB2aXJ0dWFsIH5PcGVuR0xSZW5kZXJlcigpOworCisgICAgdmlydHVhbCB2b2lkIHNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZSgpOworICAgIHZpcnR1YWwgdm9pZCBmaW5pc2goKTsKKworICAgIHZpcnR1YWwgdm9pZCBhY3F1aXJlQ29udGV4dCgpOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQ29udGV4dCgpOworCisgICAgaW50IGdldFNhdmVDb3VudCgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IHNhdmUoaW50IGZsYWdzKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzdG9yZSgpOworICAgIHZpcnR1YWwgdm9pZCByZXN0b3JlVG9Db3VudChpbnQgc2F2ZUNvdW50KTsKKworICAgIHZpcnR1YWwgaW50IHNhdmVMYXllcihmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBjb25zdCBTa1BhaW50KiBwLCBpbnQgZmxhZ3MpOworICAgIHZpcnR1YWwgaW50IHNhdmVMYXllckFscGhhKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgIGludCBhbHBoYSwgaW50IGZsYWdzKTsKKworICAgIHZpcnR1YWwgdm9pZCB0cmFuc2xhdGUoZmxvYXQgZHgsIGZsb2F0IGR5KTsKKyAgICB2aXJ0dWFsIHZvaWQgcm90YXRlKGZsb2F0IGRlZ3JlZXMpOworICAgIHZpcnR1YWwgdm9pZCBzY2FsZShmbG9hdCBzeCwgZmxvYXQgc3kpOworCisgICAgdm9pZCBnZXRNYXRyaXgoU2tNYXRyaXgqIG1hdHJpeCk7CisgICAgdmlydHVhbCB2b2lkIHNldE1hdHJpeChTa01hdHJpeCogbWF0cml4KTsKKyAgICB2aXJ0dWFsIHZvaWQgY29uY2F0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpOworCisgICAgY29uc3QgUmVjdCYgZ2V0Q2xpcEJvdW5kcygpOworICAgIGJvb2wgcXVpY2tSZWplY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKTsKKyAgICB2aXJ0dWFsIGJvb2wgY2xpcFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBTa1JlZ2lvbjo6T3Agb3ApOworCisgICAgdmlydHVhbCB2b2lkIGRyYXdCaXRtYXAoU2tCaXRtYXAqIGJpdG1hcCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdmlydHVhbCB2b2lkIGRyYXdCaXRtYXAoU2tCaXRtYXAqIGJpdG1hcCwgY29uc3QgU2tNYXRyaXgqIG1hdHJpeCwgY29uc3QgU2tQYWludCogcGFpbnQpOworICAgIHZpcnR1YWwgdm9pZCBkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IHNyY0xlZnQsIGZsb2F0IHNyY1RvcCwKKyAgICAgICAgICAgIGZsb2F0IHNyY1JpZ2h0LCBmbG9hdCBzcmNCb3R0b20sIGZsb2F0IGRzdExlZnQsIGZsb2F0IGRzdFRvcCwKKyAgICAgICAgICAgIGZsb2F0IGRzdFJpZ2h0LCBmbG9hdCBkc3RCb3R0b20sIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgZHJhd1BhdGNoKFNrQml0bWFwKiBiaXRtYXAsIGNvbnN0IGludDMyX3QqIHhEaXZzLCBjb25zdCBpbnQzMl90KiB5RGl2cywKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgZHJhd0NvbG9yKGludCBjb2xvciwgU2tYZmVybW9kZTo6TW9kZSBtb2RlKTsKKyAgICB2aXJ0dWFsIHZvaWQgZHJhd1JlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdmlydHVhbCB2b2lkIGRyYXdQYXRoKFNrUGF0aCogcGF0aCwgU2tQYWludCogcGFpbnQpOworICAgIHZpcnR1YWwgdm9pZCBkcmF3TGluZXMoZmxvYXQqIHBvaW50cywgaW50IGNvdW50LCBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdmlydHVhbCB2b2lkIGRyYXdUZXh0KGNvbnN0IGNoYXIqIHRleHQsIGludCBieXRlc0NvdW50LCBpbnQgY291bnQsIGZsb2F0IHgsIGZsb2F0IHksCisgICAgICAgICAgICBTa1BhaW50KiBwYWludCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXRTaGFkZXIoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0dXBTaGFkZXIoU2tpYVNoYWRlciogc2hhZGVyKTsKKworICAgIHZpcnR1YWwgdm9pZCByZXNldENvbG9yRmlsdGVyKCk7CisgICAgdmlydHVhbCB2b2lkIHNldHVwQ29sb3JGaWx0ZXIoU2tpYUNvbG9yRmlsdGVyKiBmaWx0ZXIpOworCisgICAgdmlydHVhbCB2b2lkIHJlc2V0U2hhZG93KCk7CisgICAgdmlydHVhbCB2b2lkIHNldHVwU2hhZG93KGZsb2F0IHJhZGl1cywgZmxvYXQgZHgsIGZsb2F0IGR5LCBpbnQgY29sb3IpOworCitwcm90ZWN0ZWQ6CisgICAgLyoqCisgICAgICogQ29tcG9zZSB0aGUgbGF5ZXIgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBzbmFwc2hvdCB3aXRoIHRoZSBsYXllcgorICAgICAqIGRlZmluZWQgYnkgdGhlIHByZXZpb3VzIHNuYXBzaG90LgorICAgICAqCisgICAgICogVGhlIGN1cnJlbnQgc25hcHNob3QgKm11c3QqIGJlIGEgbGF5ZXIgKGZsYWcga0ZsYWdJc0xheWVyIHNldC4pCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3VyZW50IFRoZSBjdXJyZW50IHNuYXBzaG90IGNvbnRhaW5pbmcgdGhlIGxheWVyIHRvIGNvbXBvc2UKKyAgICAgKiBAcGFyYW0gcHJldmlvdXMgVGhlIHByZXZpb3VzIHNuYXBzaG90IHRvIGNvbXBvc2UgdGhlIGN1cnJlbnQgbGF5ZXIgd2l0aAorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBjb21wb3NlTGF5ZXIoc3A8U25hcHNob3Q+IGN1cnJlbnQsIHNwPFNuYXBzaG90PiBwcmV2aW91cyk7CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogU2F2ZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJlbmRlcmVyIGFzIGEgbmV3IHNuYXBzaG90LgorICAgICAqIFRoZSBuZXcgc25hcHNob3QgaXMgc2F2ZWQgaW4gbVNuYXBzaG90IGFuZCB0aGUgcHJldmlvdXMgc25hcHNob3QKKyAgICAgKiBpcyBsaW5rZWQgZnJvbSBtU25hcHNob3QtPnByZXZpb3VzLgorICAgICAqCisgICAgICogQHBhcmFtIGZsYWdzIFRoZSBzYXZlIGZsYWdzOyBzZWUgU2tDYW52YXMgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG5ldyBzYXZlIGNvdW50LiBUaGlzIHZhbHVlIGNhbiBiZSBwYXNzZWQgdG8gI3Jlc3RvcmVUb0NvdW50KCkKKyAgICAgKi8KKyAgICBpbnQgc2F2ZVNuYXBzaG90KGludCBmbGFncyk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0b3JlcyB0aGUgY3VycmVudCBzbmFwc2hvdDsgbVNuYXBzaG90IGJlY29tZXMgbVNuYXBzaG90LT5wcmV2aW91cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2xpcCB3YXMgbW9kaWZpZWQuCisgICAgICovCisgICAgYm9vbCByZXN0b3JlU25hcHNob3QoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNsaXBwaW5nIHJlY3RhbmdsZSB1c2luZyBnbFNjaXNzb3IuIFRoZSBjbGlwIGlzIGRlZmluZWQgYnkKKyAgICAgKiB0aGUgY3VycmVudCBzbmFwc2hvdCdzIGNsaXBSZWN0IG1lbWJlci4KKyAgICAgKi8KKyAgICB2b2lkIHNldFNjaXNzb3JGcm9tQ2xpcCgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBsYXllciBzdG9yZWQgaW4gdGhlIHNwZWNpZmllZCBzbmFwc2hvdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzbmFwc2hvdCBUaGUgc25hcHNob3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgbGF5ZXIKKyAgICAgKiBAcGFyYW0gbGVmdCBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSBsYXllcgorICAgICAqIEBwYXJhbSB0b3AgVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBsYXllcgorICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgY29vcmRpbmF0ZSBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gYm90dG9tIFRoZSBib3R0b20gY29vcmRpbmF0ZSBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gYWxwaGEgVGhlIHRyYW5zbHVjZW5jeSBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgYmxlbmRpbmcgbW9kZSBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gZmxhZ3MgVGhlIGxheWVyIHNhdmUgZmxhZ3MKKyAgICAgKiBAcGFyYW0gcHJldmlvdXNGYm8gVGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgZnJhbWVidWZmZXIKKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbGF5ZXIgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIGNyZWF0ZUxheWVyKHNwPFNuYXBzaG90PiBzbmFwc2hvdCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgaW50IGFscGhhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGludCBmbGFncywgR0x1aW50IHByZXZpb3VzRmJvKTsKKworICAgIC8qKgorICAgICAqIENsZWFycyBhbGwgdGhlIHJlZ2lvbnMgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCBsaXN0IG9mIGxheWVycy4KKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIGludm9rZWQgYmVmb3JlIGFueSBkcmF3aW5nIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyTGF5ZXJSZWdpb25zKCk7CisKKyAgICAvKioKKyAgICAgKiBEcmF3cyBhIGNvbG9yZWQgcmVjdGFuZ2xlIHdpdGggdGhlIHNwZWNpZmllZCBjb2xvci4gVGhlIHNwZWNpZmllZCBjb29yZGluYXRlcworICAgICAqIGFyZSB0cmFuc2Zvcm1lZCBieSB0aGUgY3VycmVudCBzbmFwc2hvdCdzIHRyYW5zZm9ybSBtYXRyaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gdG9wIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHJpZ2h0IFRoZSByaWdodCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gYm90dG9tIFRoZSBib3R0b20gY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIGNvbG9yIFRoZSByZWN0YW5nbGUncyBBUkdCIGNvbG9yLCBkZWZpbmVkIGFzIGEgcGFja2VkIDMyIGJpdHMgd29yZAorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBTa2lhIHhmZXJtb2RlIHRvIHVzZQorICAgICAqIEBwYXJhbSBpZ25vcmVUcmFuc2Zvcm0gVHJ1ZSBpZiB0aGUgY3VycmVudCB0cmFuc2Zvcm0gc2hvdWxkIGJlIGlnbm9yZWQKKyAgICAgKiBAcGFyYW4gaWdub3JlQmxlbmRpbmcgVHJ1ZSBpZiB0aGUgYmxlbmRpbmcgaXMgc2V0IGJ5IHRoZSBjYWxsZXIKKyAgICAgKi8KKyAgICB2b2lkIGRyYXdDb2xvclJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgaWdub3JlVHJhbnNmb3JtID0gZmFsc2UpOworCisgICAgLyoqCisgICAgICogU2V0dXBzIHNoYWRlcnMgdG8gZHJhdyBhIGNvbG9yZWQgcmVjdC4KKyAgICAgKi8KKyAgICB2b2lkIHNldHVwQ29sb3JSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCBpZ25vcmVUcmFuc2Zvcm0pOworCisgICAgLyoqCisgICAgICogRHJhd3MgYSB0ZXh0dXJlZCByZWN0YW5nbGUgd2l0aCB0aGUgc3BlY2lmaWVkIHRleHR1cmUuIFRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZXMKKyAgICAgKiBhcmUgdHJhbnNmb3JtZWQgYnkgdGhlIGN1cnJlbnQgc25hcHNob3QncyB0cmFuc2Zvcm0gbWF0cml4LgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSB0ZXh0dXJlIFRoZSB0ZXh0dXJlIG5hbWUgdG8gbWFwIG9udG8gdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBhbHBoYSBBbiBhZGRpdGlvbmFsIHRyYW5zbHVjZW5jeSBwYXJhbWV0ZXIsIGJldHdlZW4gMC4wZiBhbmQgMS4wZgorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBibGVuZGluZyBtb2RlCisgICAgICogQHBhcmFtIGJsZW5kIFRydWUgaWYgdGhlIHRleHR1cmUgY29udGFpbnMgYW4gYWxwaGEgY2hhbm5lbAorICAgICAqLworICAgIHZvaWQgZHJhd1RleHR1cmVSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgR0x1aW50IHRleHR1cmUsCisgICAgICAgICAgICBmbG9hdCBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGJsZW5kKTsKKworICAgIC8qKgorICAgICAqIERyYXdzIGEgdGV4dHVyZWQgcmVjdGFuZ2xlIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0dXJlLiBUaGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzCisgICAgICogYXJlIHRyYW5zZm9ybWVkIGJ5IHRoZSBjdXJyZW50IHNuYXBzaG90J3MgdHJhbnNmb3JtIG1hdHJpeC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSB0b3AgVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBib3R0b20gVGhlIGJvdHRvbSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gdGV4dHVyZSBUaGUgdGV4dHVyZSB0byB1c2UKKyAgICAgKiBAcGFyYW0gcGFpbnQgVGhlIHBhaW50IGNvbnRhaW5pbmcgdGhlIGFscGhhLCBibGVuZGluZyBtb2RlLCBldGMuCisgICAgICovCisgICAgdm9pZCBkcmF3VGV4dHVyZVJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgY29uc3QgVGV4dHVyZSogdGV4dHVyZSwgY29uc3QgU2tQYWludCogcGFpbnQpOworCisgICAgLyoqCisgICAgICogRHJhd3MgYSB0ZXh0dXJlZCBtZXNoIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0dXJlLiBJZiB0aGUgaW5kaWNlcyBhcmUgb21pdHRlZCwgdGhlCisgICAgICogbWVzaCBpcyBkcmF3biBhcyBhIHNpbXBsZSBxdWFkLgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSB0ZXh0dXJlIFRoZSB0ZXh0dXJlIG5hbWUgdG8gbWFwIG9udG8gdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBhbHBoYSBBbiBhZGRpdGlvbmFsIHRyYW5zbHVjZW5jeSBwYXJhbWV0ZXIsIGJldHdlZW4gMC4wZiBhbmQgMS4wZgorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBibGVuZGluZyBtb2RlCisgICAgICogQHBhcmFtIGJsZW5kIFRydWUgaWYgdGhlIHRleHR1cmUgY29udGFpbnMgYW4gYWxwaGEgY2hhbm5lbAorICAgICAqIEBwYXJhbSB2ZXJ0aWNlcyBUaGUgdmVydGljZXMgdGhhdCBkZWZpbmUgdGhlIG1lc2gKKyAgICAgKiBAcGFyYW0gdGV4Q29vcmRzIFRoZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIG9mIGVhY2ggdmVydGV4CisgICAgICogQHBhcmFtIGluZGljZXMgVGhlIGluZGljZXMgb2YgdGhlIHZlcnRpY2VzLCBjYW4gYmUgTlVMTAorICAgICAqIEBwYXJhbSBlbGVtZW50c0NvdW50IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG1lc2gsIHJlcXVpcmVkIGJ5IGluZGljZXMKKyAgICAgKiBAcGFyYW0gc3dhcFNyY0RzdCBXaGV0aGVyIG9yIG5vdCB0aGUgc3JjIGFuZCBkc3QgYmxlbmRpbmcgb3BlcmF0aW9ucyBzaG91bGQgYmUgc3dhcHBlZAorICAgICAqIEBwYXJhbSBpZ25vcmVUcmFuc2Zvcm0gVHJ1ZSBpZiB0aGUgY3VycmVudCB0cmFuc2Zvcm0gc2hvdWxkIGJlIGlnbm9yZWQKKyAgICAgKi8KKyAgICB2b2lkIGRyYXdUZXh0dXJlTWVzaChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIEdMdWludCB0ZXh0dXJlLAorICAgICAgICAgICAgZmxvYXQgYWxwaGEsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCBibGVuZCwKKyAgICAgICAgICAgIEdMdm9pZCogdmVydGljZXMsIEdMdm9pZCogdGV4Q29vcmRzLCBHTGVudW0gZHJhd01vZGUsIEdMc2l6ZWkgZWxlbWVudHNDb3VudCwKKyAgICAgICAgICAgIGJvb2wgc3dhcFNyY0RzdCA9IGZhbHNlLCBib29sIGlnbm9yZVRyYW5zZm9ybSA9IGZhbHNlKTsKKworICAgIC8qKgorICAgICAqIFByZXBhcmVzIHRoZSByZW5kZXJlciB0byBkcmF3IHRoZSBzcGVjaWZpZWQgc2hhZG93LgorICAgICAqCisgICAgICogQHBhcmFtIHRleHR1cmUgVGhlIHNoYWRvdyB0ZXh0dXJlCisgICAgICogQHBhcmFtIHggVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgc2hhZG93CisgICAgICogQHBhcmFtIHkgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgc2hhZG93CisgICAgICogQHBhcmFtIG1vZGUgVGhlIGJsZW5kaW5nIG1vZGUKKyAgICAgKiBAcGFyYW0gYWxwaGEgVGhlIGFscGhhIHZhbHVlCisgICAgICovCisgICAgdm9pZCBzZXR1cFNoYWRvdyhjb25zdCBTaGFkb3dUZXh0dXJlKiB0ZXh0dXJlLCBmbG9hdCB4LCBmbG9hdCB5LCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsCisgICAgICAgICAgICBmbG9hdCBhbHBoYSk7CisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlcyB0aGUgcmVuZGVyZXIgdG8gZHJhdyB0aGUgc3BlY2lmaWVkIEFscGhhOCB0ZXh0dXJlIGFzIGEgcmVjdGFuZ2xlLgorICAgICAqCisgICAgICogQHBhcmFtIHRleHR1cmUgVGhlIHRleHR1cmUgdG8gcmVuZGVyIHdpdGgKKyAgICAgKiBAcGFyYW0gdGV4dHVyZVVuaXQgVGhlIHRleHR1cmUgdW5pdCB0byB1c2UsIG1heSBiZSBtb2RpZmllZAorICAgICAqIEBwYXJhbSB4IFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSB0byBkcmF3CisgICAgICogQHBhcmFtIHkgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHRvIGRyYXcKKyAgICAgKiBAcGFyYW0gciBUaGUgcmVkIGNvbXBvbmVudCBvZiB0aGUgY29sb3IKKyAgICAgKiBAcGFyYW0gZyBUaGUgZ3JlZW4gY29tcG9uZW50IG9mIHRoZSBjb2xvcgorICAgICAqIEBwYXJhbSBiIFRoZSBibHVlIGNvbXBvbmVudCBvZiB0aGUgY29sb3IKKyAgICAgKiBAcGFyYW0gYSBUaGUgYWxwaGEgY29tcG9uZW50IG9mIHRoZSBjb2xvcgorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBibGVuZGluZyBtb2RlCisgICAgICogQHBhcmFtIHRyYW5zZm9ybXMgVHJ1ZSBpZiB0aGUgbWF0cml4IHBhc3NlZCB0byB0aGUgc2hhZGVyIHNob3VsZCBiZSBtdWx0aXBsaWVkCisgICAgICogICAgICAgIGJ5IHRoZSBtb2RlbC12aWV3IG1hdHJpeAorICAgICAqIEBwYXJhbSBhcHBseUZpbHRlcnMgV2hldGhlciBvciBub3QgdG8gdGFrZSBjb2xvciBmaWx0ZXJzIGFuZAorICAgICAqICAgICAgICBzaGFkZXJzIGludG8gYWNjb3VudAorICAgICAqLworICAgIHZvaWQgc2V0dXBUZXh0dXJlQWxwaGE4KGNvbnN0IFRleHR1cmUqIHRleHR1cmUsIEdMdWludCYgdGV4dHVyZVVuaXQsIGZsb2F0IHgsIGZsb2F0IHksCisgICAgICAgICAgICBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgdHJhbnNmb3JtcywKKyAgICAgICAgICAgIGJvb2wgYXBwbHlGaWx0ZXJzKTsKKworICAgIC8qKgorICAgICAqIFByZXBhcmVzIHRoZSByZW5kZXJlciB0byBkcmF3IHRoZSBzcGVjaWZpZWQgQWxwaGE4IHRleHR1cmUgYXMgYSByZWN0YW5nbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dHVyZSBUaGUgdGV4dHVyZSB0byByZW5kZXIgd2l0aAorICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIHRleHR1cmUKKyAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIHRleHR1cmUKKyAgICAgKiBAcGFyYW0gdGV4dHVyZVVuaXQgVGhlIHRleHR1cmUgdW5pdCB0byB1c2UsIG1heSBiZSBtb2RpZmllZAorICAgICAqIEBwYXJhbSB4IFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZSB0byBkcmF3CisgICAgICogQHBhcmFtIHkgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHRvIGRyYXcKKyAgICAgKiBAcGFyYW0gciBUaGUgcmVkIGNvbXBvbmVudCBvZiB0aGUgY29sb3IKKyAgICAgKiBAcGFyYW0gZyBUaGUgZ3JlZW4gY29tcG9uZW50IG9mIHRoZSBjb2xvcgorICAgICAqIEBwYXJhbSBiIFRoZSBibHVlIGNvbXBvbmVudCBvZiB0aGUgY29sb3IKKyAgICAgKiBAcGFyYW0gYSBUaGUgYWxwaGEgY29tcG9uZW50IG9mIHRoZSBjb2xvcgorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBibGVuZGluZyBtb2RlCisgICAgICogQHBhcmFtIHRyYW5zZm9ybXMgVHJ1ZSBpZiB0aGUgbWF0cml4IHBhc3NlZCB0byB0aGUgc2hhZGVyIHNob3VsZCBiZSBtdWx0aXBsaWVkCisgICAgICogICAgICAgIGJ5IHRoZSBtb2RlbC12aWV3IG1hdHJpeAorICAgICAqIEBwYXJhbSBhcHBseUZpbHRlcnMgV2hldGhlciBvciBub3QgdG8gdGFrZSBjb2xvciBmaWx0ZXJzIGFuZAorICAgICAqICAgICAgICBzaGFkZXJzIGludG8gYWNjb3VudAorICAgICAqLworICAgIHZvaWQgc2V0dXBUZXh0dXJlQWxwaGE4KEdMdWludCB0ZXh0dXJlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgR0x1aW50JiB0ZXh0dXJlVW5pdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSwKKyAgICAgICAgICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCB0cmFuc2Zvcm1zLCBib29sIGFwcGx5RmlsdGVycyk7CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIGFib3ZlIHNldHVwVGV4dHVyZUFscGhhOCgpIGJ1dCBzcGVjaWZpZXMgdGhlIG1lc2gncyB2ZXJ0aWNlcworICAgICAqIGFuZCB0ZXhDb29yZHMgcG9pbnRlcnMuCisgICAgICovCisgICAgdm9pZCBzZXR1cFRleHR1cmVBbHBoYTgoR0x1aW50IHRleHR1cmUsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICBHTHVpbnQmIHRleHR1cmVVbml0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhLAorICAgICAgICAgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIHRyYW5zZm9ybXMsIGJvb2wgYXBwbHlGaWx0ZXJzLAorICAgICAgICAgICAgR0x2b2lkKiB2ZXJ0aWNlcywgR0x2b2lkKiB0ZXhDb29yZHMpOworCisgICAgLyoqCisgICAgICogRHJhd3MgdGV4dCB1bmRlcmxpbmUgYW5kIHN0cmlrZS10aHJvdWdoIGlmIG5lZWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIGRlY29yCisgICAgICogQHBhcmFtIGJ5dGVzQ291bnQgVGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIGxlbmd0aCBpbiBwaXhlbHMgb2YgdGhlIHRleHQsIGNhbiBiZSA8PSAwLjBmIHRvIGZvcmNlIGEgbWVhc3VyZW1lbnQKKyAgICAgKiBAcGFyYW0geCBUaGUgeCBjb29yZGluYXRlIHdoZXJlIHRoZSB0ZXh0IHdpbGwgYmUgZHJhd24KKyAgICAgKiBAcGFyYW0geSBUaGUgeSBjb29yZGluYXRlIHdoZXJlIHRoZSB0ZXh0IHdpbGwgYmUgZHJhd24KKyAgICAgKiBAcGFyYW0gcGFpbnQgVGhlIHBhaW50IHRvIGRyYXcgdGhlIHRleHQgd2l0aAorICAgICAqLworICAgIHZvaWQgZHJhd1RleHREZWNvcmF0aW9ucyhjb25zdCBjaGFyKiB0ZXh0LCBpbnQgYnl0ZXNDb3VudCwgZmxvYXQgbGVuZ3RoLAorICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgU2tQYWludCogcGFpbnQpOworCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIHN0b3JlZCBpbiBtTWVzaFZlcnRpY2VzLiBTZXR0aW5nIHRoZSB2YWx1ZXMKKyAgICAgKiBiYWNrIHRvIGRlZmF1bHQgaXMgYWNoaWV2ZWQgYnkgY2FsbGluZzoKKyAgICAgKgorICAgICAqIHJlc2V0RHJhd1RleHR1cmVUZXhDb29yZHMoMC4wZiwgMC4wZiwgMS4wZiwgMS4wZik7CisgICAgICoKKyAgICAgKiBAcGFyYW0gdTEgVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgdGV4dHVyZQorICAgICAqIEBwYXJhbSB2MSBUaGUgYm90dG9tIGNvb3JkaW5hdGUgb2YgdGhlIHRleHR1cmUKKyAgICAgKiBAcGFyYW0gdTIgVGhlIHJpZ2h0IGNvb3JkaW5hdGUgb2YgdGhlIHRleHR1cmUKKyAgICAgKiBAcGFyYW0gdjIgVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSB0ZXh0dXJlCisgICAgICovCisgICAgdm9pZCByZXNldERyYXdUZXh0dXJlVGV4Q29vcmRzKGZsb2F0IHUxLCBmbG9hdCB2MSwgZmxvYXQgdTIsIGZsb2F0IHYyKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGFscGhhIGFuZCB4ZmVybW9kZSBvdXQgb2YgYSBwYWludCBvYmplY3QuIElmIHRoZSBwYWludCBpcyBudWxsCisgICAgICogYWxwaGEgd2lsbCBiZSAyNTUgYW5kIHRoZSB4ZmVybW9kZSB3aWxsIGJlIFNSQ19PVkVSLgorICAgICAqCisgICAgICogQHBhcmFtIHBhaW50IFRoZSBwYWludCB0byBleHRyYWN0IHZhbHVlcyBmcm9tCisgICAgICogQHBhcmFtIGFscGhhIFdoZXJlIHRvIHN0b3JlIHRoZSByZXN1bHRpbmcgYWxwaGEKKyAgICAgKiBAcGFyYW0gbW9kZSBXaGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0aW5nIHhmZXJtb2RlCisgICAgICovCisgICAgaW5saW5lIHZvaWQgZ2V0QWxwaGFBbmRNb2RlKGNvbnN0IFNrUGFpbnQqIHBhaW50LCBpbnQqIGFscGhhLCBTa1hmZXJtb2RlOjpNb2RlKiBtb2RlKTsKKworICAgIC8qKgorICAgICAqIEJpbmRzIHRoZSBzcGVjaWZpZWQgdGV4dHVyZSB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcCBtb2Rlcy4KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBiaW5kVGV4dHVyZShHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHdyYXBTLCBHTGVudW0gd3JhcFQsIEdMdWludCB0ZXh0dXJlVW5pdCA9IDApOworCisgICAgLyoqCisgICAgICogRW5hYmxlIG9yIGRpc2FibGUgYmxlbmRpbmcgYXMgbmVjZXNzYXJ5LiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGFwcHJvcHJpYXRlCisgICAgICogYmxlbmQgZnVuY3Rpb24gYmFzZWQgb24gdGhlIHNwZWNpZmllZCB4ZmVybW9kZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBjaG9vc2VCbGVuZGluZyhib29sIGJsZW5kLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sCisgICAgICAgICAgICBib29sIHN3YXBTcmNEc3QgPSBmYWxzZSk7CisKKyAgICAvKioKKyAgICAgKiBTYWZlbHkgcmV0cmlldmVzIHRoZSBtb2RlIGZyb20gdGhlIHNwZWNpZmllZCB4ZmVybW9kZS4gSWYgdGhlIHNwZWNpZmllZAorICAgICAqIHhmZXJtb2RlIGlzIG51bGwsIHRoZSBtb2RlIGlzIGFzc3VtZWQgdG8gYmUgU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgU2tYZmVybW9kZTo6TW9kZSBnZXRYZmVybW9kZShTa1hmZXJtb2RlKiBtb2RlKTsKKworICAgIC8qKgorICAgICAqIFVzZSB0aGUgc3BlY2lmaWVkIHByb2dyYW0gd2l0aCB0aGUgY3VycmVudCBHTCBjb250ZXh0LiBJZiB0aGUgcHJvZ3JhbSBpcyBhbHJlYWR5CisgICAgICogaW4gdXNlLCBpdCB3aWxsIG5vdCBiZSBib3VuZCBhZ2Fpbi4gSWYgaXQgaXMgbm90IGluIHVzZSwgdGhlIGN1cnJlbnQgcHJvZ3JhbSBpcworICAgICAqIG1hcmtlZCB1bnVzZWQgYW5kIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbSBiZWNvbWVzIHVzZWQgYW5kIGJlY29tZXMgdGhlIG5ldworICAgICAqIGN1cnJlbnQgcHJvZ3JhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIHVzZQorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIElmIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbSB3YXMgYWxyZWFkeSBpbiB1c2UsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCB1c2VQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0pOworCisgICAgLy8gRGltZW5zaW9ucyBvZiB0aGUgZHJhd2luZyBzdXJmYWNlCisgICAgaW50IG1XaWR0aCwgbUhlaWdodDsKKworICAgIC8vIE1hdHJpeCB1c2VkIGZvciBvcnRobyBwcm9qZWN0aW9uIGluIHNoYWRlcnMKKyAgICBtYXQ0IG1PcnRob01hdHJpeDsKKworICAgIC8vIE1vZGVsLXZpZXcgbWF0cml4IHVzZWQgdG8gcG9zaXRpb24vc2l6ZSBvYmplY3RzCisgICAgbWF0NCBtTW9kZWxWaWV3OworCisgICAgLy8gTnVtYmVyIG9mIHNhdmVkIHN0YXRlcworICAgIGludCBtU2F2ZUNvdW50OworICAgIC8vIEJhc2Ugc3RhdGUKKyAgICBzcDxTbmFwc2hvdD4gbUZpcnN0U25hcHNob3Q7CisgICAgLy8gQ3VycmVudCBzdGF0ZQorICAgIHNwPFNuYXBzaG90PiBtU25hcHNob3Q7CisKKyAgICAvLyBTaGFkZXJzCisgICAgU2tpYVNoYWRlciogbVNoYWRlcjsKKworICAgIC8vIENvbG9yIGZpbHRlcnMKKyAgICBTa2lhQ29sb3JGaWx0ZXIqIG1Db2xvckZpbHRlcjsKKworICAgIC8vIFVzZWQgdG8gZHJhdyB0ZXh0dXJlZCBxdWFkcworICAgIFRleHR1cmVWZXJ0ZXggbU1lc2hWZXJ0aWNlc1s0XTsKKworICAgIC8vIEdMIGV4dGVuc2lvbnMKKyAgICBFeHRlbnNpb25zIG1FeHRlbnNpb25zOworCisgICAgLy8gRHJvcCBzaGFkb3cKKyAgICBib29sIG1IYXNTaGFkb3c7CisgICAgZmxvYXQgbVNoYWRvd1JhZGl1czsKKyAgICBmbG9hdCBtU2hhZG93RHg7CisgICAgZmxvYXQgbVNoYWRvd0R5OworICAgIGludCBtU2hhZG93Q29sb3I7CisKKyAgICAvLyBWYXJpb3VzIGNhY2hlcworICAgIENhY2hlcyYgbUNhY2hlczsKKworICAgIC8vIExpc3Qgb2YgcmVjdGFuZ2xlcyB0byBjbGVhciBkdWUgdG8gY2FsbHMgdG8gc2F2ZUxheWVyKCkKKyAgICBWZWN0b3I8UmVjdCo+IG1MYXllcnM7CisKKyAgICAvLyBNaXNjCisgICAgR0xpbnQgbU1heFRleHR1cmVTaXplOworCisgICAgZnJpZW5kIGNsYXNzIERpc3BsYXlMaXN0UmVuZGVyZXI7CisKK307IC8vIGNsYXNzIE9wZW5HTFJlbmRlcmVyCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9PUEVOR0xfUkVOREVSRVJfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1BhdGNoLmNwcCBiL2xpYnMvaHd1aS9QYXRjaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EwYTBiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9QYXRjaC5jcHAKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8Y21hdGg+CisKKyNpbmNsdWRlICJQYXRjaC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1BhdGNoOjpQYXRjaChjb25zdCB1aW50MzJfdCB4Q291bnQsIGNvbnN0IHVpbnQzMl90IHlDb3VudCkgeworICAgIC8vIDIgdHJpYW5nbGVzIHBlciBwYXRjaCwgMyB2ZXJ0aWNlcyBwZXIgdHJpYW5nbGUKKyAgICB2ZXJ0aWNlc0NvdW50ID0gKHhDb3VudCArIDEpICogKHlDb3VudCArIDEpICogMiAqIDM7CisgICAgdmVydGljZXMgPSBuZXcgVGV4dHVyZVZlcnRleFt2ZXJ0aWNlc0NvdW50XTsKK30KKworUGF0Y2g6On5QYXRjaCgpIHsKKyAgICBkZWxldGVbXSB2ZXJ0aWNlczsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVmVydGljZXMgbWFuYWdlbWVudAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFBhdGNoOjp1cGRhdGVWZXJ0aWNlcyhjb25zdCBmbG9hdCBiaXRtYXBXaWR0aCwgY29uc3QgZmxvYXQgYml0bWFwSGVpZ2h0LAorICAgICAgICBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIGNvbnN0IGludDMyX3QqIHhEaXZzLCBjb25zdCBpbnQzMl90KiB5RGl2cywgY29uc3QgdWludDMyX3Qgd2lkdGgsIGNvbnN0IHVpbnQzMl90IGhlaWdodCkgeworICAgIGNvbnN0IHVpbnQzMl90IHhTdHJldGNoQ291bnQgPSAod2lkdGggKyAxKSA+PiAxOworICAgIGNvbnN0IHVpbnQzMl90IHlTdHJldGNoQ291bnQgPSAoaGVpZ2h0ICsgMSkgPj4gMTsKKworICAgIGZsb2F0IHN0cmV0Y2hYID0gMC4wZjsKKyAgICBmbG9hdCBzdHJldGNoWSA9IDAuMDsKKworICAgIGNvbnN0IGZsb2F0IG1lc2hXaWR0aCA9IHJpZ2h0IC0gbGVmdDsKKworICAgIGlmICh4U3RyZXRjaENvdW50ID4gMCkgeworICAgICAgICB1aW50MzJfdCBzdHJldGNoU2l6ZSA9IDA7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDE7IGkgPCB3aWR0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBzdHJldGNoU2l6ZSArPSB4RGl2c1tpXSAtIHhEaXZzW2kgLSAxXTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBmbG9hdCB4U3RyZXRjaFRleCA9IHN0cmV0Y2hTaXplOworICAgICAgICBjb25zdCBmbG9hdCBmaXhlZCA9IGJpdG1hcFdpZHRoIC0gc3RyZXRjaFNpemU7CisgICAgICAgIGNvbnN0IGZsb2F0IHhTdHJldGNoID0gcmlnaHQgLSBsZWZ0IC0gZml4ZWQ7CisgICAgICAgIHN0cmV0Y2hYID0geFN0cmV0Y2ggLyB4U3RyZXRjaFRleDsKKyAgICB9CisKKyAgICBpZiAoeVN0cmV0Y2hDb3VudCA+IDApIHsKKyAgICAgICAgdWludDMyX3Qgc3RyZXRjaFNpemUgPSAwOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAxOyBpIDwgaGVpZ2h0OyBpICs9IDIpIHsKKyAgICAgICAgICAgIHN0cmV0Y2hTaXplICs9IHlEaXZzW2ldIC0geURpdnNbaSAtIDFdOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGZsb2F0IHlTdHJldGNoVGV4ID0gc3RyZXRjaFNpemU7CisgICAgICAgIGNvbnN0IGZsb2F0IGZpeGVkID0gYml0bWFwSGVpZ2h0IC0gc3RyZXRjaFNpemU7CisgICAgICAgIGNvbnN0IGZsb2F0IHlTdHJldGNoID0gYm90dG9tIC0gdG9wIC0gZml4ZWQ7CisgICAgICAgIHN0cmV0Y2hZID0geVN0cmV0Y2ggLyB5U3RyZXRjaFRleDsKKyAgICB9CisKKyAgICBUZXh0dXJlVmVydGV4KiB2ZXJ0ZXggPSB2ZXJ0aWNlczsKKworICAgIGZsb2F0IHByZXZpb3VzU3RlcFkgPSAwLjBmOworCisgICAgZmxvYXQgeTEgPSAwLjBmOworICAgIGZsb2F0IHYxID0gMC4wZjsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICBmbG9hdCBzdGVwWSA9IHlEaXZzW2ldOworCisgICAgICAgIGZsb2F0IHkyID0gMC4wZjsKKyAgICAgICAgaWYgKGkgJiAxKSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBzZWdtZW50ID0gc3RlcFkgLSBwcmV2aW91c1N0ZXBZOworICAgICAgICAgICAgeTIgPSB5MSArIHNlZ21lbnQgKiBzdHJldGNoWTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHkyID0geTEgKyBzdGVwWSAtIHByZXZpb3VzU3RlcFk7CisgICAgICAgIH0KKyAgICAgICAgZmxvYXQgdjIgPSBmbWF4KDAuMGYsIHN0ZXBZIC0gMC41ZikgLyBiaXRtYXBIZWlnaHQ7CisKKyAgICAgICAgZ2VuZXJhdGVSb3codmVydGV4LCB5MSwgeTIsIHYxLCB2MiwgeERpdnMsIHdpZHRoLCBzdHJldGNoWCwKKyAgICAgICAgICAgICAgICByaWdodCAtIGxlZnQsIGJpdG1hcFdpZHRoKTsKKworICAgICAgICB5MSA9IHkyOworICAgICAgICB2MSA9IChzdGVwWSArIDAuNWYpIC8gYml0bWFwSGVpZ2h0OworCisgICAgICAgIHByZXZpb3VzU3RlcFkgPSBzdGVwWTsKKyAgICB9CisKKyAgICBnZW5lcmF0ZVJvdyh2ZXJ0ZXgsIHkxLCBib3R0b20gLSB0b3AsIHYxLCAxLjBmLCB4RGl2cywgd2lkdGgsIHN0cmV0Y2hYLAorICAgICAgICAgICAgcmlnaHQgLSBsZWZ0LCBiaXRtYXBXaWR0aCk7Cit9CisKK2lubGluZSB2b2lkIFBhdGNoOjpnZW5lcmF0ZVJvdyhUZXh0dXJlVmVydGV4KiYgdmVydGV4LCBmbG9hdCB5MSwgZmxvYXQgeTIsIGZsb2F0IHYxLCBmbG9hdCB2MiwKKyAgICAgICAgY29uc3QgaW50MzJfdCB4RGl2c1tdLCB1aW50MzJfdCB4Q291bnQsIGZsb2F0IHN0cmV0Y2hYLCBmbG9hdCB3aWR0aCwgZmxvYXQgYml0bWFwV2lkdGgpIHsKKyAgICBmbG9hdCBwcmV2aW91c1N0ZXBYID0gMC4wZjsKKworICAgIGZsb2F0IHgxID0gMC4wZjsKKyAgICBmbG9hdCB1MSA9IDAuMGY7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgcm93IHF1YWQgYnkgcXVhZAorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB4Q291bnQ7IGkrKykgeworICAgICAgICBmbG9hdCBzdGVwWCA9IHhEaXZzW2ldOworCisgICAgICAgIGZsb2F0IHgyID0gMC4wZjsKKyAgICAgICAgaWYgKGkgJiAxKSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBzZWdtZW50ID0gc3RlcFggLSBwcmV2aW91c1N0ZXBYOworICAgICAgICAgICAgeDIgPSB4MSArIHNlZ21lbnQgKiBzdHJldGNoWDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHgyID0geDEgKyBzdGVwWCAtIHByZXZpb3VzU3RlcFg7CisgICAgICAgIH0KKyAgICAgICAgZmxvYXQgdTIgPSBmbWF4KDAuMGYsIHN0ZXBYIC0gMC41ZikgLyBiaXRtYXBXaWR0aDsKKworICAgICAgICBnZW5lcmF0ZVF1YWQodmVydGV4LCB4MSwgeTEsIHgyLCB5MiwgdTEsIHYxLCB1MiwgdjIpOworCisgICAgICAgIHgxID0geDI7CisgICAgICAgIHUxID0gKHN0ZXBYICsgMC41ZikgLyBiaXRtYXBXaWR0aDsKKworICAgICAgICBwcmV2aW91c1N0ZXBYID0gc3RlcFg7CisgICAgfQorCisgICAgZ2VuZXJhdGVRdWFkKHZlcnRleCwgeDEsIHkxLCB3aWR0aCwgeTIsIHUxLCB2MSwgMS4wZiwgdjIpOworfQorCitpbmxpbmUgdm9pZCBQYXRjaDo6Z2VuZXJhdGVRdWFkKFRleHR1cmVWZXJ0ZXgqJiB2ZXJ0ZXgsIGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyLAorICAgICAgICAgICAgZmxvYXQgdTEsIGZsb2F0IHYxLCBmbG9hdCB1MiwgZmxvYXQgdjIpIHsKKyAgICAvLyBMZWZ0IHRyaWFuZ2xlCisgICAgVGV4dHVyZVZlcnRleDo6c2V0KHZlcnRleCsrLCB4MSwgeTEsIHUxLCB2MSk7CisgICAgVGV4dHVyZVZlcnRleDo6c2V0KHZlcnRleCsrLCB4MiwgeTEsIHUyLCB2MSk7CisgICAgVGV4dHVyZVZlcnRleDo6c2V0KHZlcnRleCsrLCB4MSwgeTIsIHUxLCB2Mik7CisKKyAgICAvLyBSaWdodCB0cmlhbmdsZQorICAgIFRleHR1cmVWZXJ0ZXg6OnNldCh2ZXJ0ZXgrKywgeDEsIHkyLCB1MSwgdjIpOworICAgIFRleHR1cmVWZXJ0ZXg6OnNldCh2ZXJ0ZXgrKywgeDIsIHkxLCB1MiwgdjEpOworICAgIFRleHR1cmVWZXJ0ZXg6OnNldCh2ZXJ0ZXgrKywgeDIsIHkyLCB1MiwgdjIpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9QYXRjaC5oIGIvbGlicy9od3VpL1BhdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQwOGM2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9QYXRjaC5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfUEFUQ0hfSAorI2RlZmluZSBBTkRST0lEX1VJX1BBVENIX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiVmVydGV4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLyoqCisgKiBEZXNjcmlwdGlvbiBvZiBhIHBhdGNoLgorICovCitzdHJ1Y3QgUGF0Y2hEZXNjcmlwdGlvbiB7CisgICAgUGF0Y2hEZXNjcmlwdGlvbigpOiB4Q291bnQoMCksIHlDb3VudCgwKSB7IH0KKyAgICBQYXRjaERlc2NyaXB0aW9uKGNvbnN0IHVpbnQzMl90IHhDb3VudCwgY29uc3QgdWludDMyX3QgeUNvdW50KToKKyAgICAgICAgICAgIHhDb3VudCh4Q291bnQpLCB5Q291bnQoeUNvdW50KSB7IH0KKyAgICBQYXRjaERlc2NyaXB0aW9uKGNvbnN0IFBhdGNoRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKToKKyAgICAgICAgICAgIHhDb3VudChkZXNjcmlwdGlvbi54Q291bnQpLCB5Q291bnQoZGVzY3JpcHRpb24ueUNvdW50KSB7IH0KKworICAgIHVpbnQzMl90IHhDb3VudDsKKyAgICB1aW50MzJfdCB5Q291bnQ7CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBQYXRjaERlc2NyaXB0aW9uJiByaHMpIGNvbnN0IHsKKyAgICAgICAgaWYgKHhDb3VudCA9PSByaHMueENvdW50KSB7CisgICAgICAgICAgICByZXR1cm4geUNvdW50IDwgcmhzLnlDb3VudDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4geENvdW50IDwgcmhzLnhDb3VudDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgUGF0Y2hEZXNjcmlwdGlvbiYgcmhzKSBjb25zdCB7CisgICAgICAgIHJldHVybiB4Q291bnQgPT0gcmhzLnhDb3VudCAmJiB5Q291bnQgPT0gcmhzLnlDb3VudDsKKyAgICB9Cit9OyAvLyBzdHJ1Y3QgUGF0Y2hEZXNjcmlwdGlvbgorCisvKioKKyAqIEFuIE9wZW5HTCBwYXRjaC4gVGhpcyBjb250YWlucyBhbiBhcnJheSBvZiB2ZXJ0aWNlcyBhbmQgYW4gYXJyYXkgb2YKKyAqIGluZGljZXMgdG8gcmVuZGVyIHRoZSB2ZXJ0aWNlcy4KKyAqLworc3RydWN0IFBhdGNoIHsKKyAgICBQYXRjaChjb25zdCB1aW50MzJfdCB4Q291bnQsIGNvbnN0IHVpbnQzMl90IHlDb3VudCk7CisgICAgflBhdGNoKCk7CisKKyAgICB2b2lkIHVwZGF0ZVZlcnRpY2VzKGNvbnN0IGZsb2F0IGJpdG1hcFdpZHRoLCBjb25zdCBmbG9hdCBiaXRtYXBIZWlnaHQsCisgICAgICAgICAgICBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgICAgICBjb25zdCBpbnQzMl90KiB4RGl2cywgY29uc3QgaW50MzJfdCogeURpdnMsCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCB3aWR0aCwgY29uc3QgdWludDMyX3QgaGVpZ2h0KTsKKworICAgIFRleHR1cmVWZXJ0ZXgqIHZlcnRpY2VzOworICAgIHVpbnQzMl90IHZlcnRpY2VzQ291bnQ7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGlubGluZSB2b2lkIGdlbmVyYXRlUm93KFRleHR1cmVWZXJ0ZXgqJiB2ZXJ0ZXgsIGZsb2F0IHkxLCBmbG9hdCB5MiwKKyAgICAgICAgICAgIGZsb2F0IHYxLCBmbG9hdCB2MiwgY29uc3QgaW50MzJfdCB4RGl2c1tdLCB1aW50MzJfdCB4Q291bnQsCisgICAgICAgICAgICBmbG9hdCBzdHJldGNoWCwgZmxvYXQgd2lkdGgsIGZsb2F0IGJpdG1hcFdpZHRoKTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgZ2VuZXJhdGVRdWFkKFRleHR1cmVWZXJ0ZXgqJiB2ZXJ0ZXgsCisgICAgICAgICAgICBmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MiwKKyAgICAgICAgICAgIGZsb2F0IHUxLCBmbG9hdCB2MSwgZmxvYXQgdTIsIGZsb2F0IHYyKTsKK307IC8vIHN0cnVjdCBQYXRjaAorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfUEFUQ0hfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1BhdGNoQ2FjaGUuY3BwIGIvbGlicy9od3VpL1BhdGNoQ2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyY2Y1NDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUGF0Y2hDYWNoZS5jcHAKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9SZXNvdXJjZVR5cGVzLmg+CisKKyNpbmNsdWRlICJQYXRjaENhY2hlLmgiCisjaW5jbHVkZSAiUHJvcGVydGllcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1BhdGNoQ2FjaGU6OlBhdGNoQ2FjaGUoKTogbUNhY2hlKERFRkFVTFRfUEFUQ0hfQ0FDSEVfU0laRSkgeworfQorCitQYXRjaENhY2hlOjpQYXRjaENhY2hlKHVpbnQzMl90IG1heEVudHJpZXMpOiBtQ2FjaGUobWF4RW50cmllcykgeworfQorCitQYXRjaENhY2hlOjp+UGF0Y2hDYWNoZSgpIHsKKyAgICBjbGVhcigpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWxsYmFja3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQYXRjaENhY2hlOjpvcGVyYXRvcigpKFBhdGNoRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBQYXRjaComIG1lc2gpIHsKKyAgICBpZiAobWVzaCkgZGVsZXRlIG1lc2g7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQYXRjaENhY2hlOjpjbGVhcigpIHsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcih0aGlzKTsKKyAgICBtQ2FjaGUuY2xlYXIoKTsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcihOVUxMKTsKK30KKworUGF0Y2gqIFBhdGNoQ2FjaGU6OmdldCh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgY29uc3QgUGF0Y2hEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbih3aWR0aCwgaGVpZ2h0KTsKKworICAgIFBhdGNoKiBtZXNoID0gbUNhY2hlLmdldChkZXNjcmlwdGlvbik7CisgICAgaWYgKCFtZXNoKSB7CisgICAgICAgIFBBVENIX0xPR0QoIkNyZWF0aW5nIG5ldyBwYXRjaCBtZXNoLCB3PSVkIGg9JWQiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgbWVzaCA9IG5ldyBQYXRjaCh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgbUNhY2hlLnB1dChkZXNjcmlwdGlvbiwgbWVzaCk7CisgICAgfQorCisgICAgcmV0dXJuIG1lc2g7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1BhdGNoQ2FjaGUuaCBiL2xpYnMvaHd1aS9QYXRjaENhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3NzQ2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9QYXRjaENhY2hlLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9QQVRDSF9DQUNIRV9ICisjZGVmaW5lIEFORFJPSURfVUlfUEFUQ0hfQ0FDSEVfSAorCisjaW5jbHVkZSAiUGF0Y2guaCIKKyNpbmNsdWRlICJHZW5lcmF0aW9uQ2FjaGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWZpbmVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIERlYnVnCisjZGVmaW5lIERFQlVHX1BBVENIRVMgMAorCisvLyBEZWJ1ZworI2lmIERFQlVHX1BBVENIRVMKKyAgICAjZGVmaW5lIFBBVENIX0xPR0QoLi4uKSBMT0dEKF9fVkFfQVJHU19fKQorI2Vsc2UKKyAgICAjZGVmaW5lIFBBVENIX0xPR0QoLi4uKQorI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NsYXNzIFBhdGNoQ2FjaGU6IHB1YmxpYyBPbkVudHJ5UmVtb3ZlZDxQYXRjaERlc2NyaXB0aW9uLCBQYXRjaCo+IHsKK3B1YmxpYzoKKyAgICBQYXRjaENhY2hlKCk7CisgICAgUGF0Y2hDYWNoZSh1aW50MzJfdCBtYXhDYXBhY2l0eSk7CisgICAgflBhdGNoQ2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoUGF0Y2hEZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIFBhdGNoKiYgbWVzaCk7CisKKyAgICBQYXRjaCogZ2V0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOworICAgIHZvaWQgY2xlYXIoKTsKKworcHJpdmF0ZToKKyAgICBHZW5lcmF0aW9uQ2FjaGU8UGF0Y2hEZXNjcmlwdGlvbiwgUGF0Y2gqPiBtQ2FjaGU7Cit9OyAvLyBjbGFzcyBQYXRjaENhY2hlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9QQVRDSF9DQUNIRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUGF0aENhY2hlLmNwcCBiL2xpYnMvaHd1aS9QYXRoQ2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NzcyN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUGF0aENhY2hlLmNwcApAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgPFNrQ2FudmFzLmg+CisjaW5jbHVkZSA8U2tSZWN0Lmg+CisKKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKKyNpbmNsdWRlICJQYXRoQ2FjaGUuaCIKKyNpbmNsdWRlICJQcm9wZXJ0aWVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29uc3RydWN0b3JzL2Rlc3RydWN0b3IKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUGF0aENhY2hlOjpQYXRoQ2FjaGUoKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxQYXRoQ2FjaGVFbnRyeSwgUGF0aFRleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKE1CKERFRkFVTFRfUEFUSF9DQUNIRV9TSVpFKSkgeworICAgIGNoYXIgcHJvcGVydHlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX1BBVEhfQ0FDSEVfU0laRSwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgcGF0aCBjYWNoZSBzaXplIHRvICVzTUIiLCBwcm9wZXJ0eSk7CisgICAgICAgIHNldE1heFNpemUoTUIoYXRvZihwcm9wZXJ0eSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCIgIFVzaW5nIGRlZmF1bHQgcGF0aCBjYWNoZSBzaXplIG9mICUuMmZNQiIsIERFRkFVTFRfUEFUSF9DQUNIRV9TSVpFKTsKKyAgICB9CisgICAgaW5pdCgpOworfQorCitQYXRoQ2FjaGU6OlBhdGhDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk6CisgICAgICAgIG1DYWNoZShHZW5lcmF0aW9uQ2FjaGU8UGF0aENhY2hlRW50cnksIFBhdGhUZXh0dXJlKj46OmtVbmxpbWl0ZWRDYXBhY2l0eSksCisgICAgICAgIG1TaXplKDApLCBtTWF4U2l6ZShtYXhCeXRlU2l6ZSkgeworICAgIGluaXQoKTsKK30KKworUGF0aENhY2hlOjp+UGF0aENhY2hlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKK3ZvaWQgUGF0aENhY2hlOjppbml0KCkgeworICAgIG1DYWNoZS5zZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKHRoaXMpOworCisgICAgR0xpbnQgbWF4VGV4dHVyZVNpemU7CisgICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfVEVYVFVSRV9TSVpFLCAmbWF4VGV4dHVyZVNpemUpOworICAgIG1NYXhUZXh0dXJlU2l6ZSA9IG1heFRleHR1cmVTaXplOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTaXplIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWludDMyX3QgUGF0aENhY2hlOjpnZXRTaXplKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1TaXplOworfQorCit1aW50MzJfdCBQYXRoQ2FjaGU6OmdldE1heFNpemUoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbU1heFNpemU7Cit9CisKK3ZvaWQgUGF0aENhY2hlOjpzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1NYXhTaXplID0gbWF4U2l6ZTsKKyAgICB3aGlsZSAobVNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWxsYmFja3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQYXRoQ2FjaGU6Om9wZXJhdG9yKCkoUGF0aENhY2hlRW50cnkmIHBhdGgsIFBhdGhUZXh0dXJlKiYgdGV4dHVyZSkgeworICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSB0ZXh0dXJlLT53aWR0aCAqIHRleHR1cmUtPmhlaWdodDsKKyAgICBtU2l6ZSAtPSBzaXplOworCisgICAgaWYgKHRleHR1cmUpIHsKKyAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmdGV4dHVyZS0+aWQpOworICAgICAgICBkZWxldGUgdGV4dHVyZTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQYXRoQ2FjaGU6OnJlbW92ZShTa1BhdGgqIHBhdGgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIC8vIFRPRE86IExpbmVhciBzZWFyY2guLi4KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtQ2FjaGUuZ2V0S2V5QXQoaSkucGF0aCA9PSBwYXRoKSB7CisgICAgICAgICAgICBtQ2FjaGUucmVtb3ZlQXQoaSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1BhdGhUZXh0dXJlKiBQYXRoQ2FjaGU6OmdldChTa1BhdGgqIHBhdGgsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgUGF0aENhY2hlRW50cnkgZW50cnkocGF0aCwgcGFpbnQpOworCisgICAgbUxvY2subG9jaygpOworICAgIFBhdGhUZXh0dXJlKiB0ZXh0dXJlID0gbUNhY2hlLmdldChlbnRyeSk7CisgICAgbUxvY2sudW5sb2NrKCk7CisKKyAgICBpZiAoIXRleHR1cmUpIHsKKyAgICAgICAgdGV4dHVyZSA9IGFkZFRleHR1cmUoZW50cnksIHBhdGgsIHBhaW50KTsKKyAgICB9IGVsc2UgaWYgKHBhdGgtPmdldEdlbmVyYXRpb25JRCgpICE9IHRleHR1cmUtPmdlbmVyYXRpb24pIHsKKyAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICBtQ2FjaGUucmVtb3ZlKGVudHJ5KTsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIHRleHR1cmUgPSBhZGRUZXh0dXJlKGVudHJ5LCBwYXRoLCBwYWludCk7CisgICAgfQorCisgICAgcmV0dXJuIHRleHR1cmU7Cit9CisKK1BhdGhUZXh0dXJlKiBQYXRoQ2FjaGU6OmFkZFRleHR1cmUoY29uc3QgUGF0aENhY2hlRW50cnkmIGVudHJ5LAorICAgICAgICBjb25zdCBTa1BhdGggKnBhdGgsIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgY29uc3QgU2tSZWN0JiBib3VuZHMgPSBwYXRoLT5nZXRCb3VuZHMoKTsKKworICAgIGNvbnN0IGZsb2F0IHBhdGhXaWR0aCA9IGZtYXgoYm91bmRzLndpZHRoKCksIDEuMGYpOworICAgIGNvbnN0IGZsb2F0IHBhdGhIZWlnaHQgPSBmbWF4KGJvdW5kcy5oZWlnaHQoKSwgMS4wZik7CisKKyAgICBpZiAocGF0aFdpZHRoID4gbU1heFRleHR1cmVTaXplIHx8IHBhdGhIZWlnaHQgPiBtTWF4VGV4dHVyZVNpemUpIHsKKyAgICAgICAgTE9HVygiUGF0aCB0b28gbGFyZ2UgdG8gYmUgcmVuZGVyZWQgaW50byBhIHRleHR1cmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY29uc3QgZmxvYXQgb2Zmc2V0ID0gZW50cnkuc3Ryb2tlV2lkdGggKiAxLjVmOworICAgIGNvbnN0IHVpbnQzMl90IHdpZHRoID0gdWludDMyX3QocGF0aFdpZHRoICsgb2Zmc2V0ICogMi4wICsgMC41KTsKKyAgICBjb25zdCB1aW50MzJfdCBoZWlnaHQgPSB1aW50MzJfdChwYXRoSGVpZ2h0ICsgb2Zmc2V0ICogMi4wICsgMC41KTsKKworICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSB3aWR0aCAqIGhlaWdodDsKKyAgICAvLyBEb24ndCBldmVuIHRyeSB0byBjYWNoZSBhIGJpdG1hcCB0aGF0J3MgYmlnZ2VyIHRoYW4gdGhlIGNhY2hlCisgICAgaWYgKHNpemUgPCBtTWF4U2l6ZSkgeworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIHdoaWxlIChtU2l6ZSArIHNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICAgICAgbUNhY2hlLnJlbW92ZU9sZGVzdCgpOworICAgICAgICB9CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgIH0KKworICAgIFBhdGhUZXh0dXJlKiB0ZXh0dXJlID0gbmV3IFBhdGhUZXh0dXJlOworICAgIHRleHR1cmUtPmxlZnQgPSBib3VuZHMuZkxlZnQ7CisgICAgdGV4dHVyZS0+dG9wID0gYm91bmRzLmZUb3A7CisgICAgdGV4dHVyZS0+b2Zmc2V0ID0gb2Zmc2V0OworICAgIHRleHR1cmUtPndpZHRoID0gd2lkdGg7CisgICAgdGV4dHVyZS0+aGVpZ2h0ID0gaGVpZ2h0OworICAgIHRleHR1cmUtPmdlbmVyYXRpb24gPSBwYXRoLT5nZXRHZW5lcmF0aW9uSUQoKTsKKworICAgIFNrQml0bWFwIGJpdG1hcDsKKyAgICBiaXRtYXAuc2V0Q29uZmlnKFNrQml0bWFwOjprQThfQ29uZmlnLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBiaXRtYXAuYWxsb2NQaXhlbHMoKTsKKyAgICBiaXRtYXAuZXJhc2VDb2xvcigwKTsKKworICAgIFNrQ2FudmFzIGNhbnZhcyhiaXRtYXApOworICAgIGNhbnZhcy50cmFuc2xhdGUoLWJvdW5kcy5mTGVmdCArIG9mZnNldCwgLWJvdW5kcy5mVG9wICsgb2Zmc2V0KTsKKyAgICBjYW52YXMuZHJhd1BhdGgoKnBhdGgsICpwYWludCk7CisKKyAgICBnZW5lcmF0ZVRleHR1cmUoYml0bWFwLCB0ZXh0dXJlKTsKKworICAgIGlmIChzaXplIDwgbU1heFNpemUpIHsKKyAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICBtU2l6ZSArPSBzaXplOworICAgICAgICBtQ2FjaGUucHV0KGVudHJ5LCB0ZXh0dXJlKTsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGV4dHVyZS0+Y2xlYW51cCA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIHRleHR1cmU7Cit9CisKK3ZvaWQgUGF0aENhY2hlOjpjbGVhcigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1DYWNoZS5jbGVhcigpOworfQorCit2b2lkIFBhdGhDYWNoZTo6Z2VuZXJhdGVUZXh0dXJlKFNrQml0bWFwJiBiaXRtYXAsIFRleHR1cmUqIHRleHR1cmUpIHsKKyAgICBTa0F1dG9Mb2NrUGl4ZWxzIGFscChiaXRtYXApOworICAgIGlmICghYml0bWFwLnJlYWR5VG9EcmF3KCkpIHsKKyAgICAgICAgTE9HRSgiQ2Fubm90IGdlbmVyYXRlIHRleHR1cmUgZnJvbSBiaXRtYXAiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdsR2VuVGV4dHVyZXMoMSwgJnRleHR1cmUtPmlkKTsKKworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZS0+aWQpOworICAgIC8vIFRleHR1cmVzIGFyZSBBbHBoYTgKKyAgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDEpOworCisgICAgdGV4dHVyZS0+YmxlbmQgPSB0cnVlOworICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9BTFBIQSwgdGV4dHVyZS0+d2lkdGgsIHRleHR1cmUtPmhlaWdodCwgMCwKKyAgICAgICAgICAgIEdMX0FMUEhBLCBHTF9VTlNJR05FRF9CWVRFLCBiaXRtYXAuZ2V0UGl4ZWxzKCkpOworCisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworCisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9QYXRoQ2FjaGUuaCBiL2xpYnMvaHd1aS9QYXRoQ2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGUwZTdkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1BhdGhDYWNoZS5oCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1BBVEhfQ0FDSEVfSAorI2RlZmluZSBBTkRST0lEX1VJX1BBVEhfQ0FDSEVfSAorCisjaW5jbHVkZSA8U2tCaXRtYXAuaD4KKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisjaW5jbHVkZSA8U2tQYXRoLmg+CisKKyNpbmNsdWRlICJUZXh0dXJlLmgiCisjaW5jbHVkZSAiR2VuZXJhdGlvbkNhY2hlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLyoqCisgKiBEZXNjcmliZSBhIHBhdGggaW4gdGhlIHBhdGggY2FjaGUuCisgKi8KK3N0cnVjdCBQYXRoQ2FjaGVFbnRyeSB7CisgICAgUGF0aENhY2hlRW50cnkoKSB7CisgICAgICAgIHBhdGggPSBOVUxMOworICAgICAgICBqb2luID0gU2tQYWludDo6a0RlZmF1bHRfSm9pbjsKKyAgICAgICAgY2FwID0gU2tQYWludDo6a0RlZmF1bHRfQ2FwOworICAgICAgICBzdHlsZSA9IFNrUGFpbnQ6OmtGaWxsX1N0eWxlOworICAgICAgICBtaXRlciA9IDQuMGY7CisgICAgICAgIHN0cm9rZVdpZHRoID0gMS4wZjsKKyAgICB9CisKKyAgICBQYXRoQ2FjaGVFbnRyeShjb25zdCBQYXRoQ2FjaGVFbnRyeSYgZW50cnkpOgorICAgICAgICBwYXRoKGVudHJ5LnBhdGgpLCBqb2luKGVudHJ5LmpvaW4pLCBjYXAoZW50cnkuY2FwKSwKKyAgICAgICAgc3R5bGUoZW50cnkuc3R5bGUpLCBtaXRlcihlbnRyeS5taXRlciksCisgICAgICAgIHN0cm9rZVdpZHRoKGVudHJ5LnN0cm9rZVdpZHRoKSB7CisgICAgfQorCisgICAgUGF0aENhY2hlRW50cnkoU2tQYXRoKiBwYXRoLCBTa1BhaW50KiBwYWludCkgeworICAgICAgICB0aGlzLT5wYXRoID0gcGF0aDsKKyAgICAgICAgam9pbiA9IHBhaW50LT5nZXRTdHJva2VKb2luKCk7CisgICAgICAgIGNhcCA9IHBhaW50LT5nZXRTdHJva2VDYXAoKTsKKyAgICAgICAgbWl0ZXIgPSBwYWludC0+Z2V0U3Ryb2tlTWl0ZXIoKTsKKyAgICAgICAgc3Ryb2tlV2lkdGggPSBwYWludC0+Z2V0U3Ryb2tlV2lkdGgoKTsKKyAgICAgICAgc3R5bGUgPSBwYWludC0+Z2V0U3R5bGUoKTsKKyAgICB9CisKKyAgICBTa1BhdGgqIHBhdGg7CisgICAgU2tQYWludDo6Sm9pbiBqb2luOworICAgIFNrUGFpbnQ6OkNhcCBjYXA7CisgICAgU2tQYWludDo6U3R5bGUgc3R5bGU7CisgICAgZmxvYXQgbWl0ZXI7CisgICAgZmxvYXQgc3Ryb2tlV2lkdGg7CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBQYXRoQ2FjaGVFbnRyeSYgcmhzKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtZW1jbXAodGhpcywgJnJocywgc2l6ZW9mKFBhdGhDYWNoZUVudHJ5KSkgPCAwOworICAgIH0KK307IC8vIHN0cnVjdCBQYXRoQ2FjaGVFbnRyeQorCisvKioKKyAqIEFscGhhIHRleHR1cmUgdXNlZCB0byByZXByZXNlbnQgYSBwYXRoLgorICovCitzdHJ1Y3QgUGF0aFRleHR1cmU6IHB1YmxpYyBUZXh0dXJlIHsKKyAgICBQYXRoVGV4dHVyZSgpOiBUZXh0dXJlKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIExlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcGF0aCBib3VuZHMuCisgICAgICovCisgICAgZmxvYXQgbGVmdDsKKyAgICAvKioKKyAgICAgKiBUb3AgY29vcmRpbmF0ZSBvZiB0aGUgcGF0aCBib3VuZHMuCisgICAgICovCisgICAgZmxvYXQgdG9wOworICAgIC8qKgorICAgICAqIE9mZnNldCB0byBkcmF3IHRoZSBwYXRoIGF0IHRoZSBjb3JyZWN0IG9yaWdpbi4KKyAgICAgKi8KKyAgICBmbG9hdCBvZmZzZXQ7Cit9OyAvLyBzdHJ1Y3QgUGF0aFRleHR1cmUKKworLyoqCisgKiBBIHNpbXBsZSBMUlUgcGF0aCBjYWNoZS4gVGhlIGNhY2hlIGhhcyBhIG1heGltdW0gc2l6ZSBleHByZXNzZWQgaW4gYnl0ZXMuCisgKiBBbnkgdGV4dHVyZSBhZGRlZCB0byB0aGUgY2FjaGUgY2F1c2luZyB0aGUgY2FjaGUgdG8gZ3JvdyBiZXlvbmQgdGhlIG1heGltdW0KKyAqIGFsbG93ZWQgc2l6ZSB3aWxsIGFsc28gY2F1c2UgdGhlIG9sZGVzdCB0ZXh0dXJlIHRvIGJlIGtpY2tlZCBvdXQuCisgKi8KK2NsYXNzIFBhdGhDYWNoZTogcHVibGljIE9uRW50cnlSZW1vdmVkPFBhdGhDYWNoZUVudHJ5LCBQYXRoVGV4dHVyZSo+IHsKK3B1YmxpYzoKKyAgICBQYXRoQ2FjaGUoKTsKKyAgICBQYXRoQ2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOworICAgIH5QYXRoQ2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoUGF0aENhY2hlRW50cnkmIHBhdGgsIFBhdGhUZXh0dXJlKiYgdGV4dHVyZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdGguIElmIHRoZSB0ZXh0dXJlCisgICAgICogY2Fubm90IGJlIGZvdW5kIGluIHRoZSBjYWNoZSwgYSBuZXcgdGV4dHVyZSBpcyBnZW5lcmF0ZWQuCisgICAgICovCisgICAgUGF0aFRleHR1cmUqIGdldChTa1BhdGgqIHBhdGgsIFNrUGFpbnQqIHBhaW50KTsKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIGNhY2hlLiBUaGlzIGNhdXNlcyBhbGwgdGV4dHVyZXMgdG8gYmUgZGVsZXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCk7CisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbiBlbnRyeS4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZShTa1BhdGgqIHBhdGgpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRNYXhTaXplKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRTaXplKCk7CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSB0ZXh0dXJlIGZyb20gYSBiaXRtYXAgaW50byB0aGUgc3BlY2lmaWVkIHRleHR1cmUgc3RydWN0dXJlLgorICAgICAqLworICAgIHZvaWQgZ2VuZXJhdGVUZXh0dXJlKFNrQml0bWFwJiBiaXRtYXAsIFRleHR1cmUqIHRleHR1cmUpOworCisgICAgUGF0aFRleHR1cmUqIGFkZFRleHR1cmUoY29uc3QgUGF0aENhY2hlRW50cnkmIGVudHJ5LCBjb25zdCBTa1BhdGggKnBhdGgsIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKworICAgIHZvaWQgaW5pdCgpOworCisgICAgR2VuZXJhdGlvbkNhY2hlPFBhdGhDYWNoZUVudHJ5LCBQYXRoVGV4dHVyZSo+IG1DYWNoZTsKKworICAgIHVpbnQzMl90IG1TaXplOworICAgIHVpbnQzMl90IG1NYXhTaXplOworICAgIEdMdWludCBtTWF4VGV4dHVyZVNpemU7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGFjY2VzcyBtQ2FjaGUgYW5kIG1TaXplLiBBbGwgbWV0aG9kcyBhcmUgYWNjZXNzZWQgZnJvbSBhIHNpbmdsZQorICAgICAqIHRocmVhZCBleGNlcHQgZm9yIHJlbW92ZSgpLgorICAgICAqLworICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Cit9OyAvLyBjbGFzcyBQYXRoQ2FjaGUKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1BBVEhfQ0FDSEVfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1Byb2dyYW0uY3BwIGIvbGlicy9od3VpL1Byb2dyYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMWI5YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUHJvZ3JhbS5jcHAKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSAiUHJvZ3JhbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNoYWRlcnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBTSEFERVJfU09VUkNFKG5hbWUsIHNvdXJjZSkgY29uc3QgY2hhciogbmFtZSA9ICNzb3VyY2UKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQmFzZSBwcm9ncmFtCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1Byb2dyYW06OlByb2dyYW0oY29uc3QgY2hhciogdmVydGV4LCBjb25zdCBjaGFyKiBmcmFnbWVudCkgeworICAgIHZlcnRleFNoYWRlciA9IGJ1aWxkU2hhZGVyKHZlcnRleCwgR0xfVkVSVEVYX1NIQURFUik7CisgICAgZnJhZ21lbnRTaGFkZXIgPSBidWlsZFNoYWRlcihmcmFnbWVudCwgR0xfRlJBR01FTlRfU0hBREVSKTsKKworICAgIGlkID0gZ2xDcmVhdGVQcm9ncmFtKCk7CisgICAgZ2xBdHRhY2hTaGFkZXIoaWQsIHZlcnRleFNoYWRlcik7CisgICAgZ2xBdHRhY2hTaGFkZXIoaWQsIGZyYWdtZW50U2hhZGVyKTsKKyAgICBnbExpbmtQcm9ncmFtKGlkKTsKKworICAgIEdMaW50IHN0YXR1czsKKyAgICBnbEdldFByb2dyYW1pdihpZCwgR0xfTElOS19TVEFUVVMsICZzdGF0dXMpOworICAgIGlmIChzdGF0dXMgIT0gR0xfVFJVRSkgeworICAgICAgICBHTGludCBpbmZvTGVuID0gMDsKKyAgICAgICAgZ2xHZXRQcm9ncmFtaXYoaWQsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmluZm9MZW4pOworICAgICAgICBpZiAoaW5mb0xlbiA+IDEpIHsKKyAgICAgICAgICAgIEdMY2hhciBsb2dbaW5mb0xlbl07CisgICAgICAgICAgICBnbEdldFByb2dyYW1JbmZvTG9nKGlkLCBpbmZvTGVuLCAwLCAmbG9nWzBdKTsKKyAgICAgICAgICAgIExPR0UoIkVycm9yIHdoaWxlIGxpbmtpbmcgc2hhZGVyczogJXMiLCBsb2cpOworICAgICAgICB9CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKHZlcnRleFNoYWRlcik7CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKKyAgICAgICAgZ2xEZWxldGVQcm9ncmFtKGlkKTsKKyAgICB9CisKKyAgICBtVXNlID0gZmFsc2U7CisKKyAgICBwb3NpdGlvbiA9IGFkZEF0dHJpYigicG9zaXRpb24iKTsKKyAgICBjb2xvciA9IGFkZFVuaWZvcm0oImNvbG9yIik7CisgICAgdHJhbnNmb3JtID0gYWRkVW5pZm9ybSgidHJhbnNmb3JtIik7Cit9CisKK1Byb2dyYW06On5Qcm9ncmFtKCkgeworICAgIGdsRGVsZXRlU2hhZGVyKHZlcnRleFNoYWRlcik7CisgICAgZ2xEZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOworICAgIGdsRGVsZXRlUHJvZ3JhbShpZCk7Cit9CisKK2ludCBQcm9ncmFtOjphZGRBdHRyaWIoY29uc3QgY2hhciogbmFtZSkgeworICAgIGludCBzbG90ID0gZ2xHZXRBdHRyaWJMb2NhdGlvbihpZCwgbmFtZSk7CisgICAgYXR0cmlidXRlcy5hZGQobmFtZSwgc2xvdCk7CisgICAgcmV0dXJuIHNsb3Q7Cit9CisKK2ludCBQcm9ncmFtOjpnZXRBdHRyaWIoY29uc3QgY2hhciogbmFtZSkgeworICAgIHNzaXplX3QgaW5kZXggPSBhdHRyaWJ1dGVzLmluZGV4T2ZLZXkobmFtZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMudmFsdWVBdChpbmRleCk7CisgICAgfQorICAgIHJldHVybiBhZGRBdHRyaWIobmFtZSk7Cit9CisKK2ludCBQcm9ncmFtOjphZGRVbmlmb3JtKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBpbnQgc2xvdCA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKGlkLCBuYW1lKTsKKyAgICB1bmlmb3Jtcy5hZGQobmFtZSwgc2xvdCk7CisgICAgcmV0dXJuIHNsb3Q7Cit9CisKK2ludCBQcm9ncmFtOjpnZXRVbmlmb3JtKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gdW5pZm9ybXMuaW5kZXhPZktleShuYW1lKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICByZXR1cm4gdW5pZm9ybXMudmFsdWVBdChpbmRleCk7CisgICAgfQorICAgIHJldHVybiBhZGRVbmlmb3JtKG5hbWUpOworfQorCitHTHVpbnQgUHJvZ3JhbTo6YnVpbGRTaGFkZXIoY29uc3QgY2hhciogc291cmNlLCBHTGVudW0gdHlwZSkgeworICAgIEdMdWludCBzaGFkZXIgPSBnbENyZWF0ZVNoYWRlcih0eXBlKTsKKyAgICBnbFNoYWRlclNvdXJjZShzaGFkZXIsIDEsICZzb3VyY2UsIDApOworICAgIGdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOworCisgICAgR0xpbnQgc3RhdHVzOworICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJnN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyAhPSBHTF9UUlVFKSB7CisgICAgICAgIC8vIFNvbWUgZHJpdmVycyByZXR1cm4gd3JvbmcgdmFsdWVzIGZvciBHTF9JTkZPX0xPR19MRU5HVEgKKyAgICAgICAgLy8gdXNlIGEgZml4ZWQgc2l6ZSBpbnN0ZWFkCisgICAgICAgIEdMY2hhciBsb2dbNTEyXTsKKyAgICAgICAgZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgc2l6ZW9mKGxvZyksIDAsICZsb2dbMF0pOworICAgICAgICBMT0dFKCJFcnJvciB3aGlsZSBjb21waWxpbmcgc2hhZGVyOiAlcyIsIGxvZyk7CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7CisgICAgfQorCisgICAgcmV0dXJuIHNoYWRlcjsKK30KKwordm9pZCBQcm9ncmFtOjpzZXQoY29uc3QgbWF0NCYgcHJvamVjdGlvbk1hdHJpeCwgY29uc3QgbWF0NCYgbW9kZWxWaWV3TWF0cml4LAorICAgICAgICBjb25zdCBtYXQ0JiB0cmFuc2Zvcm1NYXRyaXgpIHsKKyAgICBtYXQ0IHQocHJvamVjdGlvbk1hdHJpeCk7CisgICAgdC5tdWx0aXBseSh0cmFuc2Zvcm1NYXRyaXgpOworICAgIHQubXVsdGlwbHkobW9kZWxWaWV3TWF0cml4KTsKKworICAgIGdsVW5pZm9ybU1hdHJpeDRmdih0cmFuc2Zvcm0sIDEsIEdMX0ZBTFNFLCAmdC5kYXRhWzBdKTsKK30KKwordm9pZCBQcm9ncmFtOjp1c2UoKSB7CisgICAgZ2xVc2VQcm9ncmFtKGlkKTsKKyAgICBtVXNlID0gdHJ1ZTsKKworICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb24pOworfQorCit2b2lkIFByb2dyYW06OnJlbW92ZSgpIHsKKyAgICBtVXNlID0gZmFsc2U7CisKKyAgICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShwb3NpdGlvbik7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1Byb2dyYW0uaCBiL2xpYnMvaHd1aS9Qcm9ncmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUzMWM3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Qcm9ncmFtLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfUFJPR1JBTV9ICisjZGVmaW5lIEFORFJPSURfVUlfUFJPR1JBTV9ICisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKKyNpbmNsdWRlICJNYXRyaXguaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvKioKKyAqIEEgcHJvZ3JhbSBob2xkcyBhIHZlcnRleCBhbmQgYSBmcmFnbWVudCBzaGFkZXIuIEl0IG9mZmVycyBzZXZlcmFsIHV0aWxpdHkKKyAqIG1ldGhvZHMgdG8gcXVlcnkgYXR0cmlidXRlcyBhbmQgdW5pZm9ybXMuCisgKi8KK2NsYXNzIFByb2dyYW0geworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgcHJvZ3JhbSB3aXRoIHRoZSBzcGVjaWZpZWQgdmVydGV4IGFuZCBmcmFnbWVudAorICAgICAqIHNoYWRlcnMgc291cmNlcy4KKyAgICAgKi8KKyAgICBQcm9ncmFtKGNvbnN0IGNoYXIqIHZlcnRleCwgY29uc3QgY2hhciogZnJhZ21lbnQpOworICAgIHZpcnR1YWwgflByb2dyYW0oKTsKKworICAgIC8qKgorICAgICAqIEJpbmRzIHRoaXMgcHJvZ3JhbSB0byB0aGUgR0wgY29udGV4dC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgdXNlKCk7CisKKyAgICAvKioKKyAgICAgKiBNYXJrcyB0aGlzIHByb2dyYW0gYXMgdW51c2VkLiBUaGlzIHdpbGwgbm90IHVuYmluZAorICAgICAqIHRoZSBwcm9ncmFtIGZyb20gdGhlIEdMIGNvbnRleHQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHJlbW92ZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgT3BlbkdMIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUuCisgICAgICovCisgICAgaW50IGdldEF0dHJpYihjb25zdCBjaGFyKiBuYW1lKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIE9wZW5HTCBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgdW5pZm9ybS4KKyAgICAgKi8KKyAgICBpbnQgZ2V0VW5pZm9ybShjb25zdCBjaGFyKiBuYW1lKTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcHJvZ3JhbSBpcyBjdXJyZW50bHkgaW4gdXNlIHdpdGgKKyAgICAgKiB0aGUgR0wgY29udGV4dC4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc0luVXNlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVVzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyB0aGUgcHJvZ3JhbSB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvamVjdGlvbiwgbW9kZWxWaWV3IGFuZAorICAgICAqIHRyYW5zZm9ybSBtYXRyaWNlcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldChjb25zdCBtYXQ0JiBwcm9qZWN0aW9uTWF0cml4LCBjb25zdCBtYXQ0JiBtb2RlbFZpZXdNYXRyaXgsCisgICAgICAgICAgICAgY29uc3QgbWF0NCYgdHJhbnNmb3JtTWF0cml4KTsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHBvc2l0aW9uIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBpbnQgcG9zaXRpb247CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSBjb2xvciB1bmlmb3JtLgorICAgICAqLworICAgIGludCBjb2xvcjsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHRyYW5zZm9ybSB1bmlmb3JtLgorICAgICAqLworICAgIGludCB0cmFuc2Zvcm07CisKK3Byb3RlY3RlZDoKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIE9wZW5HTCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAgICovCisgICAgaW50IGFkZEF0dHJpYihjb25zdCBjaGFyKiBuYW1lKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSB1bmlmb3JtIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgT3BlbkdMIG5hbWUgb2YgdGhlIHVuaWZvcm0uCisgICAgICovCisgICAgaW50IGFkZFVuaWZvcm0oY29uc3QgY2hhciogbmFtZSk7CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQ29tcGlsZXMgdGhlIHNwZWNpZmllZCBzaGFkZXIgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgY29tcGlsZWQgc2hhZGVyLgorICAgICAqLworICAgIEdMdWludCBidWlsZFNoYWRlcihjb25zdCBjaGFyKiBzb3VyY2UsIEdMZW51bSB0eXBlKTsKKworICAgIC8vIE5hbWUgb2YgdGhlIE9wZW5HTCBwcm9ncmFtCisgICAgR0x1aW50IGlkOworCisgICAgLy8gTmFtZSBvZiB0aGUgc2hhZGVycworICAgIEdMdWludCB2ZXJ0ZXhTaGFkZXI7CisgICAgR0x1aW50IGZyYWdtZW50U2hhZGVyOworCisgICAgLy8gS2VlcHMgdHJhY2sgb2YgYXR0cmlidXRlcyBhbmQgdW5pZm9ybXMgc2xvdHMKKyAgICBLZXllZFZlY3Rvcjxjb25zdCBjaGFyKiwgaW50PiBhdHRyaWJ1dGVzOworICAgIEtleWVkVmVjdG9yPGNvbnN0IGNoYXIqLCBpbnQ+IHVuaWZvcm1zOworCisgICAgYm9vbCBtVXNlOworfTsgLy8gY2xhc3MgUHJvZ3JhbQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfUFJPR1JBTV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUHJvZ3JhbUNhY2hlLmNwcCBiL2xpYnMvaHd1aS9Qcm9ncmFtQ2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYTFiNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUHJvZ3JhbUNhY2hlLmNwcApAQCAtMCwwICsxLDQ5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlICJQcm9ncmFtQ2FjaGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBWZXJ0ZXggc2hhZGVycyBzbmlwcGV0cworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjb25zdCBjaGFyKiBnVlNfSGVhZGVyX0F0dHJpYnV0ZXMgPQorICAgICAgICAiYXR0cmlidXRlIHZlYzQgcG9zaXRpb247XG4iOworY29uc3QgY2hhciogZ1ZTX0hlYWRlcl9BdHRyaWJ1dGVzX1RleENvb3JkcyA9CisgICAgICAgICJhdHRyaWJ1dGUgdmVjMiB0ZXhDb29yZHM7XG4iOworY29uc3QgY2hhciogZ1ZTX0hlYWRlcl9Vbmlmb3JtcyA9CisgICAgICAgICJ1bmlmb3JtIG1hdDQgdHJhbnNmb3JtO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19IZWFkZXJfVW5pZm9ybXNfSGFzR3JhZGllbnRbM10gPSB7CisgICAgICAgIC8vIExpbmVhcgorICAgICAgICAidW5pZm9ybSBtYXQ0IHNjcmVlblNwYWNlO1xuIiwKKyAgICAgICAgLy8gQ2lyY3VsYXIKKyAgICAgICAgInVuaWZvcm0gdmVjMiBncmFkaWVudFN0YXJ0O1xuIgorICAgICAgICAidW5pZm9ybSBtYXQ0IGdyYWRpZW50TWF0cml4O1xuIgorICAgICAgICAidW5pZm9ybSBtYXQ0IHNjcmVlblNwYWNlO1xuIiwKKyAgICAgICAgLy8gU3dlZXAKKyAgICAgICAgInVuaWZvcm0gdmVjMiBncmFkaWVudFN0YXJ0O1xuIgorICAgICAgICAidW5pZm9ybSBtYXQ0IGdyYWRpZW50TWF0cml4O1xuIgorICAgICAgICAidW5pZm9ybSBtYXQ0IHNjcmVlblNwYWNlO1xuIgorfTsKK2NvbnN0IGNoYXIqIGdWU19IZWFkZXJfVW5pZm9ybXNfSGFzQml0bWFwID0KKyAgICAgICAgInVuaWZvcm0gbWF0NCB0ZXh0dXJlVHJhbnNmb3JtO1xuIgorICAgICAgICAidW5pZm9ybSB2ZWMyIHRleHR1cmVEaW1lbnNpb247XG4iOworY29uc3QgY2hhciogZ1ZTX0hlYWRlcl9WYXJ5aW5nc19IYXNUZXh0dXJlID0KKyAgICAgICAgInZhcnlpbmcgdmVjMiBvdXRUZXhDb29yZHM7XG4iOworY29uc3QgY2hhciogZ1ZTX0hlYWRlcl9WYXJ5aW5nc19IYXNCaXRtYXAgPQorICAgICAgICAidmFyeWluZyB2ZWMyIG91dEJpdG1hcFRleENvb3JkcztcbiI7Citjb25zdCBjaGFyKiBnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc0dyYWRpZW50WzNdID0geworICAgICAgICAvLyBMaW5lYXIKKyAgICAgICAgInZhcnlpbmcgZmxvYXQgaW5kZXg7XG4iLAorICAgICAgICAvLyBDaXJjdWxhcgorICAgICAgICAidmFyeWluZyB2ZWMyIGNpcmN1bGFyO1xuIiwKKyAgICAgICAgLy8gU3dlZXAKKyAgICAgICAgInZhcnlpbmcgdmVjMiBzd2VlcDtcbiIKK307Citjb25zdCBjaGFyKiBnVlNfTWFpbiA9CisgICAgICAgICJcbnZvaWQgbWFpbih2b2lkKSB7XG4iOworY29uc3QgY2hhciogZ1ZTX01haW5fT3V0VGV4Q29vcmRzID0KKyAgICAgICAgIiAgICBvdXRUZXhDb29yZHMgPSB0ZXhDb29yZHM7XG4iOworY29uc3QgY2hhciogZ1ZTX01haW5fT3V0R3JhZGllbnRbM10gPSB7CisgICAgICAgIC8vIExpbmVhcgorICAgICAgICAiICAgIGluZGV4ID0gKHNjcmVlblNwYWNlICogcG9zaXRpb24pLng7XG4iLAorICAgICAgICAvLyBDaXJjdWxhcgorICAgICAgICAiICAgIHZlYzQgbG9jYXRpb24gPSBzY3JlZW5TcGFjZSAqIHBvc2l0aW9uO1xuIgorICAgICAgICAiICAgIGNpcmN1bGFyID0gKGdyYWRpZW50TWF0cml4ICogdmVjNChsb2NhdGlvbi54eSAtIGdyYWRpZW50U3RhcnQsIDAuMCwgMC4wKSkueHk7XG4iLAorICAgICAgICAvLyBTd2VlcAorICAgICAgICAiICAgIHZlYzQgbG9jYXRpb24gPSBzY3JlZW5TcGFjZSAqIHBvc2l0aW9uO1xuIgorICAgICAgICAiICAgIHN3ZWVwID0gKGdyYWRpZW50TWF0cml4ICogdmVjNChsb2NhdGlvbi54eSAtIGdyYWRpZW50U3RhcnQsIDAuMCwgMC4wKSkueHk7XG4iCit9OworY29uc3QgY2hhciogZ1ZTX01haW5fT3V0Qml0bWFwVGV4Q29vcmRzID0KKyAgICAgICAgIiAgICB2ZWM0IGJpdG1hcENvb3JkcyA9IHRleHR1cmVUcmFuc2Zvcm0gKiBwb3NpdGlvbjtcbiIKKyAgICAgICAgIiAgICBvdXRCaXRtYXBUZXhDb29yZHMgPSBiaXRtYXBDb29yZHMueHkgKiB0ZXh0dXJlRGltZW5zaW9uO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19NYWluX1Bvc2l0aW9uID0KKyAgICAgICAgIiAgICBnbF9Qb3NpdGlvbiA9IHRyYW5zZm9ybSAqIHBvc2l0aW9uO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19Gb290ZXIgPQorICAgICAgICAifVxuXG4iOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGcmFnbWVudCBzaGFkZXJzIHNuaXBwZXRzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NvbnN0IGNoYXIqIGdGU19IZWFkZXJfRXh0ZW5zaW9uX0ZyYW1lYnVmZmVyRmV0Y2ggPQorICAgICAgICAiI2V4dGVuc2lvbiBHTF9OVl9zaGFkZXJfZnJhbWVidWZmZXJfZmV0Y2ggOiBlbmFibGVcblxuIjsKK2NvbnN0IGNoYXIqIGdGU19IZWFkZXIgPQorICAgICAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbiI7Citjb25zdCBjaGFyKiBnRlNfVW5pZm9ybXNfQ29sb3IgPQorICAgICAgICAidW5pZm9ybSB2ZWM0IGNvbG9yO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19Vbmlmb3Jtc19UZXh0dXJlU2FtcGxlciA9CisgICAgICAgICJ1bmlmb3JtIHNhbXBsZXIyRCBzYW1wbGVyO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19Vbmlmb3Jtc19HcmFkaWVudFNhbXBsZXJbM10gPSB7CisgICAgICAgIC8vIExpbmVhcgorICAgICAgICAidW5pZm9ybSBzYW1wbGVyMkQgZ3JhZGllbnRTYW1wbGVyO1xuIiwKKyAgICAgICAgLy8gQ2lyY3VsYXIKKyAgICAgICAgInVuaWZvcm0gZmxvYXQgZ3JhZGllbnRSYWRpdXM7XG4iCisgICAgICAgICJ1bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudFNhbXBsZXI7XG4iLAorICAgICAgICAvLyBTd2VlcAorICAgICAgICAidW5pZm9ybSBzYW1wbGVyMkQgZ3JhZGllbnRTYW1wbGVyO1xuIgorfTsKK2NvbnN0IGNoYXIqIGdGU19Vbmlmb3Jtc19CaXRtYXBTYW1wbGVyID0KKyAgICAgICAgInVuaWZvcm0gc2FtcGxlcjJEIGJpdG1hcFNhbXBsZXI7XG4iOworY29uc3QgY2hhciogZ0ZTX1VuaWZvcm1zX0NvbG9yT3BbNF0gPSB7CisgICAgICAgIC8vIE5vbmUKKyAgICAgICAgIiIsCisgICAgICAgIC8vIE1hdHJpeAorICAgICAgICAidW5pZm9ybSBtYXQ0IGNvbG9yTWF0cml4O1xuIgorICAgICAgICAidW5pZm9ybSB2ZWM0IGNvbG9yTWF0cml4VmVjdG9yO1xuIiwKKyAgICAgICAgLy8gTGlnaHRpbmcKKyAgICAgICAgInVuaWZvcm0gdmVjNCBsaWdodGluZ011bDtcbiIKKyAgICAgICAgInVuaWZvcm0gdmVjNCBsaWdodGluZ0FkZDtcbiIsCisgICAgICAgIC8vIFBvcnRlckR1ZmYKKyAgICAgICAgInVuaWZvcm0gdmVjNCBjb2xvckJsZW5kO1xuIgorfTsKK2NvbnN0IGNoYXIqIGdGU19NYWluID0KKyAgICAgICAgIlxudm9pZCBtYWluKHZvaWQpIHtcbiIKKyAgICAgICAgIiAgICBsb3dwIHZlYzQgZnJhZ0NvbG9yO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0ZldGNoQ29sb3IgPQorICAgICAgICAiICAgIGZyYWdDb2xvciA9IGNvbG9yO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0ZldGNoVGV4dHVyZSA9CisgICAgICAgICIgICAgZnJhZ0NvbG9yID0gY29sb3IgKiB0ZXh0dXJlMkQoc2FtcGxlciwgb3V0VGV4Q29vcmRzKTtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GZXRjaEE4VGV4dHVyZSA9CisgICAgICAgICIgICAgZnJhZ0NvbG9yID0gY29sb3IgKiB0ZXh0dXJlMkQoc2FtcGxlciwgb3V0VGV4Q29vcmRzKS5hO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0ZldGNoR3JhZGllbnRbM10gPSB7CisgICAgICAgIC8vIExpbmVhcgorICAgICAgICAiICAgIHZlYzQgZ3JhZGllbnRDb2xvciA9IHRleHR1cmUyRChncmFkaWVudFNhbXBsZXIsIHZlYzIoaW5kZXgsIDAuNSkpO1xuIiwKKyAgICAgICAgLy8gQ2lyY3VsYXIKKyAgICAgICAgIiAgICBmbG9hdCBpbmRleCA9IGxlbmd0aChjaXJjdWxhcikgKiBncmFkaWVudFJhZGl1cztcbiIKKyAgICAgICAgIiAgICB2ZWM0IGdyYWRpZW50Q29sb3IgPSB0ZXh0dXJlMkQoZ3JhZGllbnRTYW1wbGVyLCB2ZWMyKGluZGV4LCAwLjUpKTtcbiIsCisgICAgICAgIC8vIFN3ZWVwCisgICAgICAgICIgICAgZmxvYXQgaW5kZXggPSBhdGFuKHN3ZWVwLnksIHN3ZWVwLngpICogMC4xNTkxNTQ5NDMwOTsgLy8gaW52KDIgKiBQSSlcbiIKKyAgICAgICAgIiAgICB2ZWM0IGdyYWRpZW50Q29sb3IgPSB0ZXh0dXJlMkQoZ3JhZGllbnRTYW1wbGVyLCB2ZWMyKGluZGV4IC0gZmxvb3IoaW5kZXgpLCAwLjUpKTtcbiIKK307Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GZXRjaEJpdG1hcCA9CisgICAgICAgICIgICAgdmVjNCBiaXRtYXBDb2xvciA9IHRleHR1cmUyRChiaXRtYXBTYW1wbGVyLCBvdXRCaXRtYXBUZXhDb29yZHMpO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0ZldGNoQml0bWFwTnBvdCA9CisgICAgICAgICIgICAgdmVjNCBiaXRtYXBDb2xvciA9IHRleHR1cmUyRChiaXRtYXBTYW1wbGVyLCB3cmFwKG91dEJpdG1hcFRleENvb3JkcykpO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0JsZW5kU2hhZGVyc0JHID0KKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBibGVuZFNoYWRlcnMoZ3JhZGllbnRDb2xvciwgYml0bWFwQ29sb3IpIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0JsZW5kU2hhZGVyc0dCID0KKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBibGVuZFNoYWRlcnMoYml0bWFwQ29sb3IsIGdyYWRpZW50Q29sb3IpIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0JsZW5kU2hhZGVyc19Nb2R1bGF0ZSA9CisgICAgICAgICIgKiBmcmFnQ29sb3IuYTtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9HcmFkaWVudFNoYWRlcl9Nb2R1bGF0ZSA9CisgICAgICAgICIgICAgZnJhZ0NvbG9yID0gZ3JhZGllbnRDb2xvciAqIGZyYWdDb2xvci5hO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0JpdG1hcFNoYWRlcl9Nb2R1bGF0ZSA9CisgICAgICAgICIgICAgZnJhZ0NvbG9yID0gYml0bWFwQ29sb3IgKiBmcmFnQ29sb3IuYTtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GcmFnQ29sb3IgPQorICAgICAgICAiICAgIGdsX0ZyYWdDb2xvciA9IGZyYWdDb2xvcjtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GcmFnQ29sb3JfQmxlbmQgPQorICAgICAgICAiICAgIGdsX0ZyYWdDb2xvciA9IGJsZW5kRnJhbWVidWZmZXIoZnJhZ0NvbG9yLCBnbF9MYXN0RnJhZ0NvbG9yKTtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GcmFnQ29sb3JfQmxlbmRfU3dhcCA9CisgICAgICAgICIgICAgZ2xfRnJhZ0NvbG9yID0gYmxlbmRGcmFtZWJ1ZmZlcihnbF9MYXN0RnJhZ0NvbG9yLCBmcmFnQ29sb3IpO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0FwcGx5Q29sb3JPcFs0XSA9IHsKKyAgICAgICAgLy8gTm9uZQorICAgICAgICAiIiwKKyAgICAgICAgLy8gTWF0cml4CisgICAgICAgIC8vIFRPRE86IEZpeCBwcmVtdWx0aXBsaWVkIGFscGhhIGNvbXB1dGF0aW9ucyBmb3IgY29sb3IgbWF0cml4CisgICAgICAgICIgICAgZnJhZ0NvbG9yICo9IGNvbG9yTWF0cml4O1xuIgorICAgICAgICAiICAgIGZyYWdDb2xvciArPSBjb2xvck1hdHJpeFZlY3RvcjtcbiIKKyAgICAgICAgIiAgICBmcmFnQ29sb3IucmdiICo9IGZyYWdDb2xvci5hO1xuIiwKKyAgICAgICAgLy8gTGlnaHRpbmcKKyAgICAgICAgIiAgICBmbG9hdCBsaWdodGluZ0FscGhhID0gZnJhZ0NvbG9yLmE7XG4iCisgICAgICAgICIgICAgZnJhZ0NvbG9yID0gbWluKGZyYWdDb2xvciAqIGxpZ2h0aW5nTXVsICsgKGxpZ2h0aW5nQWRkICogbGlnaHRpbmdBbHBoYSksIGxpZ2h0aW5nQWxwaGEpO1xuIgorICAgICAgICAiICAgIGZyYWdDb2xvci5hID0gbGlnaHRpbmdBbHBoYTtcbiIsCisgICAgICAgIC8vIFBvcnRlckR1ZmYKKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBibGVuZENvbG9ycyhjb2xvckJsZW5kLCBmcmFnQ29sb3IpO1xuIgorfTsKK2NvbnN0IGNoYXIqIGdGU19Gb290ZXIgPQorICAgICAgICAifVxuXG4iOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQb3J0ZXJEdWZmIHNuaXBwZXRzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NvbnN0IGNoYXIqIGdCbGVuZE9wc1sxOF0gPSB7CisgICAgICAgIC8vIENsZWFyCisgICAgICAgICJyZXR1cm4gdmVjNCgwLjAsIDAuMCwgMC4wLCAwLjApO1xuIiwKKyAgICAgICAgLy8gU3JjCisgICAgICAgICJyZXR1cm4gc3JjO1xuIiwKKyAgICAgICAgLy8gRHN0CisgICAgICAgICJyZXR1cm4gZHN0O1xuIiwKKyAgICAgICAgLy8gU3JjT3ZlcgorICAgICAgICAicmV0dXJuIHNyYyArIGRzdCAqICgxLjAgLSBzcmMuYSk7XG4iLAorICAgICAgICAvLyBEc3RPdmVyCisgICAgICAgICJyZXR1cm4gZHN0ICsgc3JjICogKDEuMCAtIGRzdC5hKTtcbiIsCisgICAgICAgIC8vIFNyY0luCisgICAgICAgICJyZXR1cm4gc3JjICogZHN0LmE7XG4iLAorICAgICAgICAvLyBEc3RJbgorICAgICAgICAicmV0dXJuIGRzdCAqIHNyYy5hO1xuIiwKKyAgICAgICAgLy8gU3JjT3V0CisgICAgICAgICJyZXR1cm4gc3JjICogKDEuMCAtIGRzdC5hKTtcbiIsCisgICAgICAgIC8vIERzdE91dAorICAgICAgICAicmV0dXJuIGRzdCAqICgxLjAgLSBzcmMuYSk7XG4iLAorICAgICAgICAvLyBTcmNBdG9wCisgICAgICAgICJyZXR1cm4gdmVjNChzcmMucmdiICogZHN0LmEgKyAoMS4wIC0gc3JjLmEpICogZHN0LnJnYiwgZHN0LmEpO1xuIiwKKyAgICAgICAgLy8gRHN0QXRvcAorICAgICAgICAicmV0dXJuIHZlYzQoZHN0LnJnYiAqIHNyYy5hICsgKDEuMCAtIGRzdC5hKSAqIHNyYy5yZ2IsIHNyYy5hKTtcbiIsCisgICAgICAgIC8vIFhvcgorICAgICAgICAicmV0dXJuIHZlYzQoc3JjLnJnYiAqICgxLjAgLSBkc3QuYSkgKyAoMS4wIC0gc3JjLmEpICogZHN0LnJnYiwgIgorICAgICAgICAgICAgICAgICJzcmMuYSArIGRzdC5hIC0gMi4wICogc3JjLmEgKiBkc3QuYSk7XG4iLAorICAgICAgICAvLyBBZGQKKyAgICAgICAgInJldHVybiBtaW4oc3JjICsgZHN0LCAxLjApO1xuIiwKKyAgICAgICAgLy8gTXVsdGlwbHkKKyAgICAgICAgInJldHVybiBzcmMgKiBkc3Q7XG4iLAorICAgICAgICAvLyBTY3JlZW4KKyAgICAgICAgInJldHVybiBzcmMgKyBkc3QgLSBzcmMgKiBkc3Q7XG4iLAorICAgICAgICAvLyBPdmVybGF5CisgICAgICAgICJyZXR1cm4gY2xhbXAodmVjNChtaXgoIgorICAgICAgICAgICAgICAgICIyLjAgKiBzcmMucmdiICogZHN0LnJnYiArIHNyYy5yZ2IgKiAoMS4wIC0gZHN0LmEpICsgZHN0LnJnYiAqICgxLjAgLSBzcmMuYSksICIKKyAgICAgICAgICAgICAgICAic3JjLmEgKiBkc3QuYSAtIDIuMCAqIChkc3QuYSAtIGRzdC5yZ2IpICogKHNyYy5hIC0gc3JjLnJnYikgKyBzcmMucmdiICogKDEuMCAtIGRzdC5hKSArIGRzdC5yZ2IgKiAoMS4wIC0gc3JjLmEpLCAiCisgICAgICAgICAgICAgICAgInN0ZXAoZHN0LmEsIDIuMCAqIGRzdC5yZ2IpKSwgIgorICAgICAgICAgICAgICAgICJzcmMuYSArIGRzdC5hIC0gc3JjLmEgKiBkc3QuYSksIDAuMCwgMS4wKTtcbiIsCisgICAgICAgIC8vIERhcmtlbgorICAgICAgICAicmV0dXJuIHZlYzQoc3JjLnJnYiAqICgxLjAgLSBkc3QuYSkgKyAoMS4wIC0gc3JjLmEpICogZHN0LnJnYiArICIKKyAgICAgICAgICAgICAgICAibWluKHNyYy5yZ2IgKiBkc3QuYSwgZHN0LnJnYiAqIHNyYy5hKSwgc3JjLmEgKyBkc3QuYSAtIHNyYy5hICogZHN0LmEpO1xuIiwKKyAgICAgICAgLy8gTGlnaHRlbgorICAgICAgICAicmV0dXJuIHZlYzQoc3JjLnJnYiAqICgxLjAgLSBkc3QuYSkgKyAoMS4wIC0gc3JjLmEpICogZHN0LnJnYiArICIKKyAgICAgICAgICAgICAgICAibWF4KHNyYy5yZ2IgKiBkc3QuYSwgZHN0LnJnYiAqIHNyYy5hKSwgc3JjLmEgKyBkc3QuYSAtIHNyYy5hICogZHN0LmEpO1xuIiwKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQcm9ncmFtQ2FjaGU6OlByb2dyYW1DYWNoZSgpIHsKK30KKworUHJvZ3JhbUNhY2hlOjp+UHJvZ3JhbUNhY2hlKCkgeworICAgIGNsZWFyKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhY2hlIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQcm9ncmFtQ2FjaGU6OmNsZWFyKCkgeworICAgIHNpemVfdCBjb3VudCA9IG1DYWNoZS5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGRlbGV0ZSBtQ2FjaGUudmFsdWVBdChpKTsKKyAgICB9CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKK1Byb2dyYW0qIFByb2dyYW1DYWNoZTo6Z2V0KGNvbnN0IFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pIHsKKyAgICBwcm9ncmFtaWQga2V5ID0gZGVzY3JpcHRpb24ua2V5KCk7CisgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mS2V5KGtleSk7CisgICAgUHJvZ3JhbSogcHJvZ3JhbSA9IE5VTEw7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBkZXNjcmlwdGlvbi5sb2coIkNvdWxkIG5vdCBmaW5kIHByb2dyYW0iKTsKKyAgICAgICAgcHJvZ3JhbSA9IGdlbmVyYXRlUHJvZ3JhbShkZXNjcmlwdGlvbiwga2V5KTsKKyAgICAgICAgbUNhY2hlLmFkZChrZXksIHByb2dyYW0pOworICAgIH0gZWxzZSB7CisgICAgICAgIHByb2dyYW0gPSBtQ2FjaGUudmFsdWVBdChpbmRleCk7CisgICAgfQorICAgIHJldHVybiBwcm9ncmFtOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBQcm9ncmFtIGdlbmVyYXRpb24KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUHJvZ3JhbSogUHJvZ3JhbUNhY2hlOjpnZW5lcmF0ZVByb2dyYW0oY29uc3QgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgcHJvZ3JhbWlkIGtleSkgeworICAgIFN0cmluZzggdmVydGV4U2hhZGVyID0gZ2VuZXJhdGVWZXJ0ZXhTaGFkZXIoZGVzY3JpcHRpb24pOworICAgIFN0cmluZzggZnJhZ21lbnRTaGFkZXIgPSBnZW5lcmF0ZUZyYWdtZW50U2hhZGVyKGRlc2NyaXB0aW9uKTsKKworICAgIFByb2dyYW0qIHByb2dyYW0gPSBuZXcgUHJvZ3JhbSh2ZXJ0ZXhTaGFkZXIuc3RyaW5nKCksIGZyYWdtZW50U2hhZGVyLnN0cmluZygpKTsKKyAgICByZXR1cm4gcHJvZ3JhbTsKK30KKworU3RyaW5nOCBQcm9ncmFtQ2FjaGU6OmdlbmVyYXRlVmVydGV4U2hhZGVyKGNvbnN0IFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pIHsKKyAgICAvLyBBZGQgYXR0cmlidXRlcworICAgIFN0cmluZzggc2hhZGVyKGdWU19IZWFkZXJfQXR0cmlidXRlcyk7CisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc1RleHR1cmUpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX0F0dHJpYnV0ZXNfVGV4Q29vcmRzKTsKKyAgICB9CisgICAgLy8gVW5pZm9ybXMKKyAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfVW5pZm9ybXMpOworICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfVW5pZm9ybXNfSGFzR3JhZGllbnRbZGVzY3JpcHRpb24uZ3JhZGllbnRUeXBlXSk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1VuaWZvcm1zX0hhc0JpdG1hcCk7CisgICAgfQorICAgIC8vIFZhcnlpbmdzCisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc1RleHR1cmUpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc1RleHR1cmUpOworICAgIH0KKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzR3JhZGllbnQpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc0dyYWRpZW50W2Rlc2NyaXB0aW9uLmdyYWRpZW50VHlwZV0pOworICAgIH0KKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzQml0bWFwKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0hlYWRlcl9WYXJ5aW5nc19IYXNCaXRtYXApOworICAgIH0KKworICAgIC8vIEJlZ2luIHRoZSBzaGFkZXIKKyAgICBzaGFkZXIuYXBwZW5kKGdWU19NYWluKTsgeworICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzVGV4dHVyZSkgeworICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfTWFpbl9PdXRUZXhDb29yZHMpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCkgeworICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfTWFpbl9PdXRHcmFkaWVudFtkZXNjcmlwdGlvbi5ncmFkaWVudFR5cGVdKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzQml0bWFwKSB7CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19NYWluX091dEJpdG1hcFRleENvb3Jkcyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gT3V0cHV0IHRyYW5zZm9ybWVkIHBvc2l0aW9uCisgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX01haW5fUG9zaXRpb24pOworICAgIH0KKyAgICAvLyBFbmQgdGhlIHNoYWRlcgorICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0Zvb3Rlcik7CisKKyAgICBQUk9HUkFNX0xPR0QoIioqKiBHZW5lcmF0ZWQgdmVydGV4IHNoYWRlcjpcblxuJXMiLCBzaGFkZXIuc3RyaW5nKCkpOworCisgICAgcmV0dXJuIHNoYWRlcjsKK30KKworU3RyaW5nOCBQcm9ncmFtQ2FjaGU6OmdlbmVyYXRlRnJhZ21lbnRTaGFkZXIoY29uc3QgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgeworICAgIC8vIFNldCB0aGUgZGVmYXVsdCBwcmVjaXNpb24KKyAgICBTdHJpbmc4IHNoYWRlcjsKKworICAgIGJvb2wgYmxlbmRGcmFtZWJ1ZmZlciA9IGRlc2NyaXB0aW9uLmZyYW1lYnVmZmVyTW9kZSA+PSBTa1hmZXJtb2RlOjprUGx1c19Nb2RlOworICAgIGlmIChibGVuZEZyYW1lYnVmZmVyKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX0hlYWRlcl9FeHRlbnNpb25fRnJhbWVidWZmZXJGZXRjaCk7CisgICAgfQorCisgICAgc2hhZGVyLmFwcGVuZChnRlNfSGVhZGVyKTsKKworICAgIC8vIFZhcnlpbmdzCisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc1RleHR1cmUpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc1RleHR1cmUpOworICAgIH0KKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzR3JhZGllbnQpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc0dyYWRpZW50W2Rlc2NyaXB0aW9uLmdyYWRpZW50VHlwZV0pOworICAgIH0KKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzQml0bWFwKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0hlYWRlcl9WYXJ5aW5nc19IYXNCaXRtYXApOworICAgIH0KKworCisgICAgLy8gVW5pZm9ybXMKKyAgICBzaGFkZXIuYXBwZW5kKGdGU19Vbmlmb3Jtc19Db2xvcik7CisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc1RleHR1cmUpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfVW5pZm9ybXNfVGV4dHVyZVNhbXBsZXIpOworICAgIH0KKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzR3JhZGllbnQpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfVW5pZm9ybXNfR3JhZGllbnRTYW1wbGVyW2Rlc2NyaXB0aW9uLmdyYWRpZW50VHlwZV0pOworICAgIH0KKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzQml0bWFwKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX1VuaWZvcm1zX0JpdG1hcFNhbXBsZXIpOworICAgIH0KKyAgICBzaGFkZXIuYXBwZW5kKGdGU19Vbmlmb3Jtc19Db2xvck9wW2Rlc2NyaXB0aW9uLmNvbG9yT3BdKTsKKworICAgIC8vIEdlbmVyYXRlIHJlcXVpcmVkIGZ1bmN0aW9ucworICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCAmJiBkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgZ2VuZXJhdGVCbGVuZChzaGFkZXIsICJibGVuZFNoYWRlcnMiLCBkZXNjcmlwdGlvbi5zaGFkZXJzTW9kZSk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5jb2xvck9wID09IFByb2dyYW1EZXNjcmlwdGlvbjo6a0NvbG9yQmxlbmQpIHsKKyAgICAgICAgZ2VuZXJhdGVCbGVuZChzaGFkZXIsICJibGVuZENvbG9ycyIsIGRlc2NyaXB0aW9uLmNvbG9yTW9kZSk7CisgICAgfQorICAgIGlmIChibGVuZEZyYW1lYnVmZmVyKSB7CisgICAgICAgIGdlbmVyYXRlQmxlbmQoc2hhZGVyLCAiYmxlbmRGcmFtZWJ1ZmZlciIsIGRlc2NyaXB0aW9uLmZyYW1lYnVmZmVyTW9kZSk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5pc0JpdG1hcE5wb3QpIHsKKyAgICAgICAgZ2VuZXJhdGVUZXh0dXJlV3JhcChzaGFkZXIsIGRlc2NyaXB0aW9uLmJpdG1hcFdyYXBTLCBkZXNjcmlwdGlvbi5iaXRtYXBXcmFwVCk7CisgICAgfQorCisgICAgLy8gQmVnaW4gdGhlIHNoYWRlcgorICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW4pOyB7CisgICAgICAgIC8vIFN0b3JlcyB0aGUgcmVzdWx0IGluIGZyYWdDb2xvciBkaXJlY3RseQorICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzVGV4dHVyZSkgeworICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0FscGhhOFRleHR1cmUpIHsKKyAgICAgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0ZldGNoQThUZXh0dXJlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9GZXRjaFRleHR1cmUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9GZXRjaENvbG9yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzR3JhZGllbnQpIHsKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fRmV0Y2hHcmFkaWVudFtkZXNjcmlwdGlvbi5ncmFkaWVudFR5cGVdKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzQml0bWFwKSB7CisgICAgICAgICAgICBpZiAoIWRlc2NyaXB0aW9uLmlzQml0bWFwTnBvdCkgeworICAgICAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fRmV0Y2hCaXRtYXApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0ZldGNoQml0bWFwTnBvdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2FzZSB3aGVuIHdlIGhhdmUgdHdvIHNoYWRlcnMgc2V0CisgICAgICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCAmJiBkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbi5pc0JpdG1hcEZpcnN0KSB7CisgICAgICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9CbGVuZFNoYWRlcnNCRyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fQmxlbmRTaGFkZXJzR0IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9CbGVuZFNoYWRlcnNfTW9kdWxhdGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0dyYWRpZW50KSB7CisgICAgICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9HcmFkaWVudFNoYWRlcl9Nb2R1bGF0ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fQml0bWFwU2hhZGVyX01vZHVsYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBBcHBseSB0aGUgY29sb3Igb3AgaWYgbmVlZGVkCisgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fQXBwbHlDb2xvck9wW2Rlc2NyaXB0aW9uLmNvbG9yT3BdKTsKKyAgICAgICAgLy8gT3V0cHV0IHRoZSBmcmFnbWVudAorICAgICAgICBpZiAoIWJsZW5kRnJhbWVidWZmZXIpIHsKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fRnJhZ0NvbG9yKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoIWRlc2NyaXB0aW9uLnN3YXBTcmNEc3QgPworICAgICAgICAgICAgICAgICAgICBnRlNfTWFpbl9GcmFnQ29sb3JfQmxlbmQgOiBnRlNfTWFpbl9GcmFnQ29sb3JfQmxlbmRfU3dhcCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gRW5kIHRoZSBzaGFkZXIKKyAgICBzaGFkZXIuYXBwZW5kKGdGU19Gb290ZXIpOworCisgICAgaWYgKERFQlVHX1BST0dSQU1fQ0FDSEUpIHsKKyAgICAgICAgUFJPR1JBTV9MT0dEKCIqKiogR2VuZXJhdGVkIGZyYWdtZW50IHNoYWRlcjpcblxuIik7CisgICAgICAgIHByaW50TG9uZ1N0cmluZyhzaGFkZXIpOworICAgIH0KKworICAgIHJldHVybiBzaGFkZXI7Cit9CisKK3ZvaWQgUHJvZ3JhbUNhY2hlOjpnZW5lcmF0ZUJsZW5kKFN0cmluZzgmIHNoYWRlciwgY29uc3QgY2hhciogbmFtZSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlKSB7CisgICAgc2hhZGVyLmFwcGVuZCgiXG52ZWM0ICIpOworICAgIHNoYWRlci5hcHBlbmQobmFtZSk7CisgICAgc2hhZGVyLmFwcGVuZCgiKHZlYzQgc3JjLCB2ZWM0IGRzdCkge1xuIik7CisgICAgc2hhZGVyLmFwcGVuZCgiICAgICIpOworICAgIHNoYWRlci5hcHBlbmQoZ0JsZW5kT3BzW21vZGVdKTsKKyAgICBzaGFkZXIuYXBwZW5kKCJ9XG4iKTsKK30KKwordm9pZCBQcm9ncmFtQ2FjaGU6OmdlbmVyYXRlVGV4dHVyZVdyYXAoU3RyaW5nOCYgc2hhZGVyLCBHTGVudW0gd3JhcFMsIEdMZW51bSB3cmFwVCkgeworICAgIHNoYWRlci5hcHBlbmQoIlxudmVjMiB3cmFwKHZlYzIgdGV4Q29vcmRzKSB7XG4iKTsKKyAgICBpZiAod3JhcFMgPT0gR0xfTUlSUk9SRURfUkVQRUFUKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoIiAgICBmbG9hdCB4TW9kMiA9IG1vZCh0ZXhDb29yZHMueCwgMi4wKTtcbiIpOworICAgICAgICBzaGFkZXIuYXBwZW5kKCIgICAgaWYgKHhNb2QyID4gMS4wKSB4TW9kMiA9IDIuMCAtIHhNb2QyO1xuIik7CisgICAgfQorICAgIGlmICh3cmFwVCA9PSBHTF9NSVJST1JFRF9SRVBFQVQpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZCgiICAgIGZsb2F0IHlNb2QyID0gbW9kKHRleENvb3Jkcy55LCAyLjApO1xuIik7CisgICAgICAgIHNoYWRlci5hcHBlbmQoIiAgICBpZiAoeU1vZDIgPiAxLjApIHlNb2QyID0gMi4wIC0geU1vZDI7XG4iKTsKKyAgICB9CisgICAgc2hhZGVyLmFwcGVuZCgiICAgIHJldHVybiB2ZWMyKCIpOworICAgIHN3aXRjaCAod3JhcFMpIHsKKyAgICAgICAgY2FzZSBHTF9DTEFNUF9UT19FREdFOgorICAgICAgICAgICAgc2hhZGVyLmFwcGVuZCgidGV4Q29vcmRzLngiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX1JFUEVBVDoKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoIm1vZCh0ZXhDb29yZHMueCwgMS4wKSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfTUlSUk9SRURfUkVQRUFUOgorICAgICAgICAgICAgc2hhZGVyLmFwcGVuZCgieE1vZDIiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBzaGFkZXIuYXBwZW5kKCIsICIpOworICAgIHN3aXRjaCAod3JhcFQpIHsKKyAgICAgICAgY2FzZSBHTF9DTEFNUF9UT19FREdFOgorICAgICAgICAgICAgc2hhZGVyLmFwcGVuZCgidGV4Q29vcmRzLnkiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX1JFUEVBVDoKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoIm1vZCh0ZXhDb29yZHMueSwgMS4wKSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfTUlSUk9SRURfUkVQRUFUOgorICAgICAgICAgICAgc2hhZGVyLmFwcGVuZCgieU1vZDIiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBzaGFkZXIuYXBwZW5kKCIpO1xuIik7CisgICAgc2hhZGVyLmFwcGVuZCgifVxuIik7Cit9CisKK3ZvaWQgUHJvZ3JhbUNhY2hlOjpwcmludExvbmdTdHJpbmcoY29uc3QgU3RyaW5nOCYgc2hhZGVyKSBjb25zdCB7CisgICAgc3NpemVfdCBpbmRleCA9IDA7CisgICAgc3NpemVfdCBsYXN0SW5kZXggPSAwOworICAgIGNvbnN0IGNoYXIqIHN0ciA9IHNoYWRlci5zdHJpbmcoKTsKKyAgICB3aGlsZSAoKGluZGV4ID0gc2hhZGVyLmZpbmQoIlxuIiwgaW5kZXgpKSA+IC0xKSB7CisgICAgICAgIFN0cmluZzggbGluZShzdHIsIGluZGV4IC0gbGFzdEluZGV4KTsKKyAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgPT0gMCkgbGluZS5hcHBlbmQoIlxuIik7CisgICAgICAgIFBST0dSQU1fTE9HRCgiJXMiLCBsaW5lLnN0cmluZygpKTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgc3RyICs9IChpbmRleCAtIGxhc3RJbmRleCk7CisgICAgICAgIGxhc3RJbmRleCA9IGluZGV4OworICAgIH0KK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUHJvZ3JhbUNhY2hlLmggYi9saWJzL2h3dWkvUHJvZ3JhbUNhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZhODAxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Qcm9ncmFtQ2FjaGUuaApAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9QUk9HUkFNX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9QUk9HUkFNX0NBQ0hFX0gKKworI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlIDxTa1hmZXJtb2RlLmg+CisKKyNpbmNsdWRlICJQcm9ncmFtLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGVmaW5lcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBEZWJ1ZworI2RlZmluZSBERUJVR19QUk9HUkFNX0NBQ0hFIDAKKworLy8gRGVidWcKKyNpZiBERUJVR19QUk9HUkFNX0NBQ0hFCisgICAgI2RlZmluZSBQUk9HUkFNX0xPR0QoLi4uKSBMT0dEKF9fVkFfQVJHU19fKQorI2Vsc2UKKyAgICAjZGVmaW5lIFBST0dSQU1fTE9HRCguLi4pCisjZW5kaWYKKworI2RlZmluZSBQUk9HUkFNX0tFWV9URVhUVVJFIDB4MQorI2RlZmluZSBQUk9HUkFNX0tFWV9BOF9URVhUVVJFIDB4MgorI2RlZmluZSBQUk9HUkFNX0tFWV9CSVRNQVAgMHg0CisjZGVmaW5lIFBST0dSQU1fS0VZX0dSQURJRU5UIDB4OAorI2RlZmluZSBQUk9HUkFNX0tFWV9CSVRNQVBfRklSU1QgMHgxMAorI2RlZmluZSBQUk9HUkFNX0tFWV9DT0xPUl9NQVRSSVggMHgyMAorI2RlZmluZSBQUk9HUkFNX0tFWV9DT0xPUl9MSUdIVElORyAweDQwCisjZGVmaW5lIFBST0dSQU1fS0VZX0NPTE9SX0JMRU5EIDB4ODAKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQklUTUFQX05QT1QgMHgxMDAKKyNkZWZpbmUgUFJPR1JBTV9LRVlfU1dBUF9TUkNfRFNUIDB4MjAwMAorCisjZGVmaW5lIFBST0dSQU1fS0VZX0JJVE1BUF9XUkFQU19NQVNLIDB4NjAwCisjZGVmaW5lIFBST0dSQU1fS0VZX0JJVE1BUF9XUkFQVF9NQVNLIDB4MTgwMAorCisvLyBFbmNvZGUgdGhlIHhmZXJtb2RlcyBvbiA2IGJpdHMKKyNkZWZpbmUgUFJPR1JBTV9NQVhfWEZFUk1PREUgMHgxZgorI2RlZmluZSBQUk9HUkFNX1hGRVJNT0RFX1NIQURFUl9TSElGVCAyNgorI2RlZmluZSBQUk9HUkFNX1hGRVJNT0RFX0NPTE9SX09QX1NISUZUIDIwCisjZGVmaW5lIFBST0dSQU1fWEZFUk1PREVfRlJBTUVCVUZGRVJfU0hJRlQgMTQKKworI2RlZmluZSBQUk9HUkFNX0JJVE1BUF9XUkFQU19TSElGVCA5CisjZGVmaW5lIFBST0dSQU1fQklUTUFQX1dSQVBUX1NISUZUIDExCisKKyNkZWZpbmUgUFJPR1JBTV9HUkFESUVOVF9UWVBFX1NISUZUIDMzCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFR5cGVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3R5cGVkZWYgdWludDY0X3QgcHJvZ3JhbWlkOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIERlc2NyaWJlIHRoZSBmZWF0dXJlcyByZXF1aXJlZCBmb3IgYSBnaXZlbiBwcm9ncmFtLiBUaGUgZmVhdHVyZXMKKyAqIGRldGVybWluZSB0aGUgZ2VuZXJhdGlvbiBvZiBib3RoIHRoZSB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlcnMuCisgKiBBIFByb2dyYW1EZXNjcmlwdGlvbiBtdXN0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhIFByb2dyYW1DYWNoZS4KKyAqLworc3RydWN0IFByb2dyYW1EZXNjcmlwdGlvbiB7CisgICAgZW51bSBDb2xvck1vZGlmaWVyIHsKKyAgICAgICAga0NvbG9yTm9uZSwKKyAgICAgICAga0NvbG9yTWF0cml4LAorICAgICAgICBrQ29sb3JMaWdodGluZywKKyAgICAgICAga0NvbG9yQmxlbmQKKyAgICB9OworCisgICAgZW51bSBHcmFkaWVudCB7CisgICAgICAgIGtHcmFkaWVudExpbmVhciwKKyAgICAgICAga0dyYWRpZW50Q2lyY3VsYXIsCisgICAgICAgIGtHcmFkaWVudFN3ZWVwCisgICAgfTsKKworICAgIFByb2dyYW1EZXNjcmlwdGlvbigpOgorICAgICAgICBoYXNUZXh0dXJlKGZhbHNlKSwgaGFzQWxwaGE4VGV4dHVyZShmYWxzZSksCisgICAgICAgIGhhc0JpdG1hcChmYWxzZSksIGlzQml0bWFwTnBvdChmYWxzZSksIGhhc0dyYWRpZW50KGZhbHNlKSwKKyAgICAgICAgZ3JhZGllbnRUeXBlKGtHcmFkaWVudExpbmVhciksCisgICAgICAgIHNoYWRlcnNNb2RlKFNrWGZlcm1vZGU6OmtDbGVhcl9Nb2RlKSwgaXNCaXRtYXBGaXJzdChmYWxzZSksCisgICAgICAgIGJpdG1hcFdyYXBTKEdMX0NMQU1QX1RPX0VER0UpLCBiaXRtYXBXcmFwVChHTF9DTEFNUF9UT19FREdFKSwKKyAgICAgICAgY29sb3JPcChrQ29sb3JOb25lKSwgY29sb3JNb2RlKFNrWGZlcm1vZGU6OmtDbGVhcl9Nb2RlKSwKKyAgICAgICAgZnJhbWVidWZmZXJNb2RlKFNrWGZlcm1vZGU6OmtDbGVhcl9Nb2RlKSwgc3dhcFNyY0RzdChmYWxzZSkgeworICAgIH0KKworICAgIC8vIFRleHR1cmluZworICAgIGJvb2wgaGFzVGV4dHVyZTsKKyAgICBib29sIGhhc0FscGhhOFRleHR1cmU7CisKKyAgICAvLyBTaGFkZXJzCisgICAgYm9vbCBoYXNCaXRtYXA7CisgICAgYm9vbCBpc0JpdG1hcE5wb3Q7CisKKyAgICBib29sIGhhc0dyYWRpZW50OworICAgIEdyYWRpZW50IGdyYWRpZW50VHlwZTsKKworICAgIFNrWGZlcm1vZGU6Ok1vZGUgc2hhZGVyc01vZGU7CisKKyAgICBib29sIGlzQml0bWFwRmlyc3Q7CisgICAgR0xlbnVtIGJpdG1hcFdyYXBTOworICAgIEdMZW51bSBiaXRtYXBXcmFwVDsKKworICAgIC8vIENvbG9yIG9wZXJhdGlvbnMKKyAgICBpbnQgY29sb3JPcDsKKyAgICBTa1hmZXJtb2RlOjpNb2RlIGNvbG9yTW9kZTsKKworICAgIC8vIEZyYW1lYnVmZmVyIGJsZW5kaW5nIChyZXF1aXJlcyBFeHRlbnNpb25zLmhhc0ZyYW1lYnVmZmVyRmV0Y2goKSkKKyAgICAvLyBJZ25vcmVkIGZvciBhbGwgdmFsdWVzIDwgU2tYZmVybW9kZTo6a1BsdXNfTW9kZQorICAgIFNrWGZlcm1vZGU6Ok1vZGUgZnJhbWVidWZmZXJNb2RlOworICAgIGJvb2wgc3dhcFNyY0RzdDsKKworICAgIGlubGluZSB1aW50MzJfdCBnZXRFbnVtRm9yV3JhcChHTGVudW0gd3JhcCkgY29uc3QgeworICAgICAgICBzd2l0Y2ggKHdyYXApIHsKKyAgICAgICAgICAgIGNhc2UgR0xfQ0xBTVBfVE9fRURHRToKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGNhc2UgR0xfUkVQRUFUOgorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgY2FzZSBHTF9NSVJST1JFRF9SRVBFQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHJvZ3JhbWlkIGtleSgpIGNvbnN0IHsKKyAgICAgICAgcHJvZ3JhbWlkIGtleSA9IDA7CisgICAgICAgIGlmIChoYXNUZXh0dXJlKSBrZXkgfD0gUFJPR1JBTV9LRVlfVEVYVFVSRTsKKyAgICAgICAgaWYgKGhhc0FscGhhOFRleHR1cmUpIGtleSB8PSBQUk9HUkFNX0tFWV9BOF9URVhUVVJFOworICAgICAgICBpZiAoaGFzQml0bWFwKSB7CisgICAgICAgICAgICBrZXkgfD0gUFJPR1JBTV9LRVlfQklUTUFQOworICAgICAgICAgICAgaWYgKGlzQml0bWFwTnBvdCkgeworICAgICAgICAgICAgICAgIGtleSB8PSBQUk9HUkFNX0tFWV9CSVRNQVBfTlBPVDsKKyAgICAgICAgICAgICAgICBrZXkgfD0gZ2V0RW51bUZvcldyYXAoYml0bWFwV3JhcFMpIDw8IFBST0dSQU1fQklUTUFQX1dSQVBTX1NISUZUOworICAgICAgICAgICAgICAgIGtleSB8PSBnZXRFbnVtRm9yV3JhcChiaXRtYXBXcmFwVCkgPDwgUFJPR1JBTV9CSVRNQVBfV1JBUFRfU0hJRlQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhc0dyYWRpZW50KSBrZXkgfD0gUFJPR1JBTV9LRVlfR1JBRElFTlQ7CisgICAgICAgIGtleSB8PSBwcm9ncmFtaWQoZ3JhZGllbnRUeXBlKSA8PCBQUk9HUkFNX0dSQURJRU5UX1RZUEVfU0hJRlQ7CisgICAgICAgIGlmIChpc0JpdG1hcEZpcnN0KSBrZXkgfD0gUFJPR1JBTV9LRVlfQklUTUFQX0ZJUlNUOworICAgICAgICBpZiAoaGFzQml0bWFwICYmIGhhc0dyYWRpZW50KSB7CisgICAgICAgICAgICBrZXkgfD0gKHNoYWRlcnNNb2RlICYgUFJPR1JBTV9NQVhfWEZFUk1PREUpIDw8IFBST0dSQU1fWEZFUk1PREVfU0hBREVSX1NISUZUOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoY29sb3JPcCkgeworICAgICAgICAgICAgY2FzZSBrQ29sb3JNYXRyaXg6CisgICAgICAgICAgICAgICAga2V5IHw9IFBST0dSQU1fS0VZX0NPTE9SX01BVFJJWDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga0NvbG9yTGlnaHRpbmc6CisgICAgICAgICAgICAgICAga2V5IHw9IFBST0dSQU1fS0VZX0NPTE9SX0xJR0hUSU5HOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrQ29sb3JCbGVuZDoKKyAgICAgICAgICAgICAgICBrZXkgfD0gUFJPR1JBTV9LRVlfQ09MT1JfQkxFTkQ7CisgICAgICAgICAgICAgICAga2V5IHw9IChjb2xvck1vZGUgJiBQUk9HUkFNX01BWF9YRkVSTU9ERSkgPDwgUFJPR1JBTV9YRkVSTU9ERV9DT0xPUl9PUF9TSElGVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga0NvbG9yTm9uZToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBrZXkgfD0gKGZyYW1lYnVmZmVyTW9kZSAmIFBST0dSQU1fTUFYX1hGRVJNT0RFKSA8PCBQUk9HUkFNX1hGRVJNT0RFX0ZSQU1FQlVGRkVSX1NISUZUOworICAgICAgICBpZiAoc3dhcFNyY0RzdCkga2V5IHw9IFBST0dSQU1fS0VZX1NXQVBfU1JDX0RTVDsKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKyAgICB2b2lkIGxvZyhjb25zdCBjaGFyKiBtZXNzYWdlKSBjb25zdCB7CisgICAgICAgIHByb2dyYW1pZCBrID0ga2V5KCk7CisgICAgICAgIFBST0dSQU1fTE9HRCgiJXMgKGtleSA9IDB4JS44eCUuOHgpIiwgbWVzc2FnZSwgdWludDMyX3QoayA+PiAzMiksCisgICAgICAgICAgICAgICAgdWludDMyX3QoayAmIDB4ZmZmZmZmZmYpKTsKKyAgICB9Cit9OyAvLyBzdHJ1Y3QgUHJvZ3JhbURlc2NyaXB0aW9uCisKKy8qKgorICogR2VuZXJhdGVzIGFuZCBjYWNoZXMgcHJvZ3JhbS4gUHJvZ3JhbXMgYXJlIGdlbmVyYXRlZCBiYXNlZCBvbgorICogUHJvZ3JhbURlc2NyaXB0aW9ucy4KKyAqLworY2xhc3MgUHJvZ3JhbUNhY2hlIHsKK3B1YmxpYzoKKyAgICBQcm9ncmFtQ2FjaGUoKTsKKyAgICB+UHJvZ3JhbUNhY2hlKCk7CisKKyAgICBQcm9ncmFtKiBnZXQoY29uc3QgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CisKKyAgICB2b2lkIGNsZWFyKCk7CisKK3ByaXZhdGU6CisgICAgUHJvZ3JhbSogZ2VuZXJhdGVQcm9ncmFtKGNvbnN0IFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIHByb2dyYW1pZCBrZXkpOworICAgIFN0cmluZzggZ2VuZXJhdGVWZXJ0ZXhTaGFkZXIoY29uc3QgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CisgICAgU3RyaW5nOCBnZW5lcmF0ZUZyYWdtZW50U2hhZGVyKGNvbnN0IFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOworICAgIHZvaWQgZ2VuZXJhdGVCbGVuZChTdHJpbmc4JiBzaGFkZXIsIGNvbnN0IGNoYXIqIG5hbWUsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSk7CisgICAgdm9pZCBnZW5lcmF0ZVRleHR1cmVXcmFwKFN0cmluZzgmIHNoYWRlciwgR0xlbnVtIHdyYXBTLCBHTGVudW0gd3JhcFQpOworCisgICAgdm9pZCBwcmludExvbmdTdHJpbmcoY29uc3QgU3RyaW5nOCYgc2hhZGVyKSBjb25zdDsKKworICAgIEtleWVkVmVjdG9yPHByb2dyYW1pZCwgUHJvZ3JhbSo+IG1DYWNoZTsKK307IC8vIGNsYXNzIFByb2dyYW1DYWNoZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfUFJPR1JBTV9DQUNIRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUHJvcGVydGllcy5oIGIvbGlicy9od3VpL1Byb3BlcnRpZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDEyODI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1Byb3BlcnRpZXMuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1BST1BFUlRJRVNfSAorI2RlZmluZSBBTkRST0lEX1VJX1BST1BFUlRJRVNfSAorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworLyoqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGxpc3Qgb2Ygc3lzdGVtIHByb3BlcnRpZXMgdXNlZCB0byBjb25maWd1cmUKKyAqIHRoZSBPcGVuR0xSZW5kZXJlci4KKyAqLworCisvLyBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIGluIG1lZ2EtYnl0ZXMKKyNkZWZpbmUgUFJPUEVSVFlfVEVYVFVSRV9DQUNIRV9TSVpFICJyby5od3VpLnRleHR1cmVfY2FjaGVfc2l6ZSIKKyNkZWZpbmUgUFJPUEVSVFlfTEFZRVJfQ0FDSEVfU0laRSAicm8uaHd1aS5sYXllcl9jYWNoZV9zaXplIgorI2RlZmluZSBQUk9QRVJUWV9HUkFESUVOVF9DQUNIRV9TSVpFICJyby5od3VpLmdyYWRpZW50X2NhY2hlX3NpemUiCisjZGVmaW5lIFBST1BFUlRZX1BBVEhfQ0FDSEVfU0laRSAicm8uaHd1aS5wYXRoX2NhY2hlX3NpemUiCisjZGVmaW5lIFBST1BFUlRZX0RST1BfU0hBRE9XX0NBQ0hFX1NJWkUgInJvLmh3dWkuZHJvcF9zaGFkb3dfY2FjaGVfc2l6ZSIKKyNkZWZpbmUgUFJPUEVSVFlfRkJPX0NBQ0hFX1NJWkUgInJvLmh3dWkuZmJvX2NhY2hlX3NpemUiCisKKy8vIFRoZXNlIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgaW4gcGl4ZWxzCisjZGVmaW5lIFBST1BFUlRZX1RFWFRfQ0FDSEVfV0lEVEggInJvLmh3dWkudGV4dF9jYWNoZV93aWR0aCIKKyNkZWZpbmUgUFJPUEVSVFlfVEVYVF9DQUNIRV9IRUlHSFQgInJvLmh3dWkudGV4dF9jYWNoZV9oZWlnaHQiCisKKy8vIEdhbW1hICg+PSAxLjAsIDw9IDEwLjApCisjZGVmaW5lIFBST1BFUlRZX1RFWFRfR0FNTUEgInJvLnRleHRfZ2FtbWEiCisjZGVmaW5lIFBST1BFUlRZX1RFWFRfQkxBQ0tfR0FNTUFfVEhSRVNIT0xEICJyby50ZXh0X2dhbW1hLmJsYWNrX3RocmVzaG9sZCIKKyNkZWZpbmUgUFJPUEVSVFlfVEVYVF9XSElURV9HQU1NQV9USFJFU0hPTEQgInJvLnRleHRfZ2FtbWEud2hpdGVfdGhyZXNob2xkIgorCisvLyBDb252ZXJ0cyBhIG51bWJlciBvZiBtZWdhLWJ5dGVzIGludG8gYnl0ZXMKKyNkZWZpbmUgTUIocykgcyAqIDEwMjQgKiAxMDI0CisKKyNkZWZpbmUgREVGQVVMVF9URVhUVVJFX0NBQ0hFX1NJWkUgMTguMGYKKyNkZWZpbmUgREVGQVVMVF9MQVlFUl9DQUNIRV9TSVpFIDguMGYKKyNkZWZpbmUgREVGQVVMVF9QQVRIX0NBQ0hFX1NJWkUgNS4wZgorI2RlZmluZSBERUZBVUxUX1BBVENIX0NBQ0hFX1NJWkUgMTAwCisjZGVmaW5lIERFRkFVTFRfR1JBRElFTlRfQ0FDSEVfU0laRSAwLjVmCisjZGVmaW5lIERFRkFVTFRfRFJPUF9TSEFET1dfQ0FDSEVfU0laRSAyLjBmCisjZGVmaW5lIERFRkFVTFRfRkJPX0NBQ0hFX1NJWkUgMjUKKworI2RlZmluZSBERUZBVUxUX1RFWFRfR0FNTUEgMS40ZgorI2RlZmluZSBERUZBVUxUX1RFWFRfQkxBQ0tfR0FNTUFfVEhSRVNIT0xEIDY0CisjZGVmaW5lIERFRkFVTFRfVEVYVF9XSElURV9HQU1NQV9USFJFU0hPTEQgMTkyCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1BST1BFUlRJRVNfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1JlY3QuaCBiL2xpYnMvaHd1aS9SZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAzYTYwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9SZWN0LmgKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfUkVDVF9ICisjZGVmaW5lIEFORFJPSURfVUlfUkVDVF9ICisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTdHJ1Y3RzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0cnVjdCBSZWN0IHsKKyAgICBmbG9hdCBsZWZ0OworICAgIGZsb2F0IHRvcDsKKyAgICBmbG9hdCByaWdodDsKKyAgICBmbG9hdCBib3R0b207CisKKyAgICBSZWN0KCk6CisgICAgICAgICAgICBsZWZ0KDApLAorICAgICAgICAgICAgdG9wKDApLAorICAgICAgICAgICAgcmlnaHQoMCksCisgICAgICAgICAgICBib3R0b20oMCkgeworICAgIH0KKworICAgIFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKToKKyAgICAgICAgICAgIGxlZnQobGVmdCksCisgICAgICAgICAgICB0b3AodG9wKSwKKyAgICAgICAgICAgIHJpZ2h0KHJpZ2h0KSwKKyAgICAgICAgICAgIGJvdHRvbShib3R0b20pIHsKKyAgICB9CisKKyAgICBSZWN0KGNvbnN0IFJlY3QmIHIpIHsKKyAgICAgICAgc2V0KHIpOworICAgIH0KKworICAgIFJlY3QoUmVjdCYgcikgeworICAgICAgICBzZXQocik7CisgICAgfQorCisgICAgUmVjdCYgb3BlcmF0b3I9KGNvbnN0IFJlY3QmIHIpIHsKKyAgICAgICAgc2V0KHIpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgUmVjdCYgb3BlcmF0b3I9KFJlY3QmIHIpIHsKKyAgICAgICAgc2V0KHIpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgZnJpZW5kIGludCBvcGVyYXRvcj09KGNvbnN0IFJlY3QmIGEsIGNvbnN0IFJlY3QmIGIpIHsKKyAgICAgICAgcmV0dXJuICFtZW1jbXAoJmEsICZiLCBzaXplb2YoYSkpOworICAgIH0KKworICAgIGZyaWVuZCBpbnQgb3BlcmF0b3IhPShjb25zdCBSZWN0JiBhLCBjb25zdCBSZWN0JiBiKSB7CisgICAgICAgIHJldHVybiBtZW1jbXAoJmEsICZiLCBzaXplb2YoYSkpOworICAgIH0KKworICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxlZnQgPj0gcmlnaHQgfHwgdG9wID49IGJvdHRvbTsKKyAgICB9CisKKyAgICB2b2lkIHNldEVtcHR5KCkgeworICAgICAgICBtZW1zZXQodGhpcywgMCwgc2l6ZW9mKCp0aGlzKSk7CisgICAgfQorCisgICAgdm9pZCBzZXQoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKSB7CisgICAgICAgIHRoaXMtPmxlZnQgPSBsZWZ0OworICAgICAgICB0aGlzLT5yaWdodCA9IHJpZ2h0OworICAgICAgICB0aGlzLT50b3AgPSB0b3A7CisgICAgICAgIHRoaXMtPmJvdHRvbSA9IGJvdHRvbTsKKyAgICB9CisKKyAgICB2b2lkIHNldChjb25zdCBSZWN0JiByKSB7CisgICAgICAgIHNldChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSk7CisgICAgfQorCisgICAgaW5saW5lIGZsb2F0IGdldFdpZHRoKCkgY29uc3QgeworICAgICAgICByZXR1cm4gcmlnaHQgLSBsZWZ0OworICAgIH0KKworICAgIGlubGluZSBmbG9hdCBnZXRIZWlnaHQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBib3R0b20gLSB0b3A7CisgICAgfQorCisgICAgYm9vbCBpbnRlcnNlY3RzKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSkgY29uc3QgeworICAgICAgICByZXR1cm4gbGVmdCA8IHJpZ2h0ICYmIHRvcCA8IGJvdHRvbSAmJgorICAgICAgICAgICAgICAgIHRoaXMtPmxlZnQgPCB0aGlzLT5yaWdodCAmJiB0aGlzLT50b3AgPCB0aGlzLT5ib3R0b20gJiYKKyAgICAgICAgICAgICAgICB0aGlzLT5sZWZ0IDwgcmlnaHQgJiYgbGVmdCA8IHRoaXMtPnJpZ2h0ICYmCisgICAgICAgICAgICAgICAgdGhpcy0+dG9wIDwgYm90dG9tICYmIHRvcCA8IHRoaXMtPmJvdHRvbTsKKyAgICB9CisKKyAgICBib29sIGludGVyc2VjdHMoY29uc3QgUmVjdCYgcikgY29uc3QgeworICAgICAgICByZXR1cm4gaW50ZXJzZWN0cyhyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSk7CisgICAgfQorCisgICAgYm9vbCBpbnRlcnNlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tKSB7CisgICAgICAgIGlmIChsZWZ0IDwgcmlnaHQgJiYgdG9wIDwgYm90dG9tICYmICF0aGlzLT5pc0VtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICB0aGlzLT5sZWZ0IDwgcmlnaHQgJiYgbGVmdCA8IHRoaXMtPnJpZ2h0ICYmCisgICAgICAgICAgICAgICAgdGhpcy0+dG9wIDwgYm90dG9tICYmIHRvcCA8IHRoaXMtPmJvdHRvbSkgeworCisgICAgICAgICAgICBpZiAodGhpcy0+bGVmdCA8IGxlZnQpIHRoaXMtPmxlZnQgPSBsZWZ0OworICAgICAgICAgICAgaWYgKHRoaXMtPnRvcCA8IHRvcCkgdGhpcy0+dG9wID0gdG9wOworICAgICAgICAgICAgaWYgKHRoaXMtPnJpZ2h0ID4gcmlnaHQpIHRoaXMtPnJpZ2h0ID0gcmlnaHQ7CisgICAgICAgICAgICBpZiAodGhpcy0+Ym90dG9tID4gYm90dG9tKSB0aGlzLT5ib3R0b20gPSBib3R0b207CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGludGVyc2VjdChjb25zdCBSZWN0JiByKSB7CisgICAgICAgIHJldHVybiBpbnRlcnNlY3Qoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20pOworICAgIH0KKworICAgIGJvb2wgdW5pb25XaXRoKGNvbnN0IFJlY3QmIHIpIHsKKyAgICAgICAgaWYgKHIubGVmdCA8IHIucmlnaHQgJiYgci50b3AgPCByLmJvdHRvbSkgeworICAgICAgICAgICAgaWYgKGxlZnQgPCByaWdodCAmJiB0b3AgPCBib3R0b20pIHsKKyAgICAgICAgICAgICAgICBpZiAobGVmdCA+IHIubGVmdCkgbGVmdCA9IHIubGVmdDsKKyAgICAgICAgICAgICAgICBpZiAodG9wID4gci50b3ApIHRvcCA9IHIudG9wOworICAgICAgICAgICAgICAgIGlmIChyaWdodCA8IHIucmlnaHQpIHJpZ2h0ID0gci5yaWdodDsKKyAgICAgICAgICAgICAgICBpZiAoYm90dG9tIDwgci5ib3R0b20pIGJvdHRvbSA9IHIuYm90dG9tOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gci5sZWZ0OworICAgICAgICAgICAgICAgIHRvcCA9IHIudG9wOworICAgICAgICAgICAgICAgIHJpZ2h0ID0gci5yaWdodDsKKyAgICAgICAgICAgICAgICBib3R0b20gPSByLmJvdHRvbTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBzbmFwVG9QaXhlbEJvdW5kYXJpZXMoKSB7CisgICAgICAgIGxlZnQgPSBmbG9vcihsZWZ0KTsKKyAgICAgICAgdG9wID0gZmxvb3IodG9wKTsKKyAgICAgICAgcmlnaHQgPSBjZWlsKHJpZ2h0KTsKKyAgICAgICAgYm90dG9tID0gY2VpbChib3R0b20pOworICAgIH0KKworICAgIHZvaWQgZHVtcCgpIGNvbnN0IHsKKyAgICAgICAgTE9HRCgiUmVjdFtsPSVmIHQ9JWYgcj0lZiBiPSVmXSIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgfQorCit9OyAvLyBzdHJ1Y3QgUmVjdAorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfUkVDVF9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvU2tpYUNvbG9yRmlsdGVyLmNwcCBiL2xpYnMvaHd1aS9Ta2lhQ29sb3JGaWx0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNTdhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvU2tpYUNvbG9yRmlsdGVyLmNwcApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJTa2lhQ29sb3JGaWx0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCYXNlIGNvbG9yIGZpbHRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTa2lhQ29sb3JGaWx0ZXI6OlNraWFDb2xvckZpbHRlcihUeXBlIHR5cGUsIGJvb2wgYmxlbmQpOiBtVHlwZSh0eXBlKSwgbUJsZW5kKGJsZW5kKSB7Cit9CisKK1NraWFDb2xvckZpbHRlcjo6flNraWFDb2xvckZpbHRlcigpIHsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29sb3IgbWF0cml4IGZpbHRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTa2lhQ29sb3JNYXRyaXhGaWx0ZXI6OlNraWFDb2xvck1hdHJpeEZpbHRlcihmbG9hdCogbWF0cml4LCBmbG9hdCogdmVjdG9yKToKKyAgICAgICAgU2tpYUNvbG9yRmlsdGVyKGtDb2xvck1hdHJpeCwgdHJ1ZSksIG1NYXRyaXgobWF0cml4KSwgbVZlY3Rvcih2ZWN0b3IpIHsKK30KKworU2tpYUNvbG9yTWF0cml4RmlsdGVyOjp+U2tpYUNvbG9yTWF0cml4RmlsdGVyKCkgeworICAgIGRlbGV0ZVtdIG1NYXRyaXg7CisgICAgZGVsZXRlW10gbVZlY3RvcjsKK30KKwordm9pZCBTa2lhQ29sb3JNYXRyaXhGaWx0ZXI6OmRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sCisgICAgICAgIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpIHsKKyAgICBkZXNjcmlwdGlvbi5jb2xvck9wID0gUHJvZ3JhbURlc2NyaXB0aW9uOjprQ29sb3JNYXRyaXg7Cit9CisKK3ZvaWQgU2tpYUNvbG9yTWF0cml4RmlsdGVyOjpzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSkgeworICAgIGdsVW5pZm9ybU1hdHJpeDRmdihwcm9ncmFtLT5nZXRVbmlmb3JtKCJjb2xvck1hdHJpeCIpLCAxLCBHTF9GQUxTRSwgJm1NYXRyaXhbMF0pOworICAgIGdsVW5pZm9ybTRmdihwcm9ncmFtLT5nZXRVbmlmb3JtKCJjb2xvck1hdHJpeFZlY3RvciIpLCAxLCBtVmVjdG9yKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTGlnaHRpbmcgY29sb3IgZmlsdGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NraWFMaWdodGluZ0ZpbHRlcjo6U2tpYUxpZ2h0aW5nRmlsdGVyKGludCBtdWx0aXBseSwgaW50IGFkZCk6CisgICAgICAgIFNraWFDb2xvckZpbHRlcihrTGlnaHRpbmcsIHRydWUpIHsKKyAgICBtTXVsUiA9ICgobXVsdGlwbHkgPj4gMTYpICYgMHhGRikgLyAyNTUuMGY7CisgICAgbU11bEcgPSAoKG11bHRpcGx5ID4+ICA4KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIG1NdWxCID0gKChtdWx0aXBseSAgICAgICkgJiAweEZGKSAvIDI1NS4wZjsKKworICAgIG1BZGRSID0gKChhZGQgPj4gMTYpICYgMHhGRikgLyAyNTUuMGY7CisgICAgbUFkZEcgPSAoKGFkZCA+PiAgOCkgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBtQWRkQiA9ICgoYWRkICAgICAgKSAmIDB4RkYpIC8gMjU1LjBmOworfQorCit2b2lkIFNraWFMaWdodGluZ0ZpbHRlcjo6ZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgeworICAgIGRlc2NyaXB0aW9uLmNvbG9yT3AgPSBQcm9ncmFtRGVzY3JpcHRpb246OmtDb2xvckxpZ2h0aW5nOworfQorCit2b2lkIFNraWFMaWdodGluZ0ZpbHRlcjo6c2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0pIHsKKyAgICBnbFVuaWZvcm00Zihwcm9ncmFtLT5nZXRVbmlmb3JtKCJsaWdodGluZ011bCIpLCBtTXVsUiwgbU11bEcsIG1NdWxCLCAxLjBmKTsKKyAgICBnbFVuaWZvcm00Zihwcm9ncmFtLT5nZXRVbmlmb3JtKCJsaWdodGluZ0FkZCIpLCBtQWRkUiwgbUFkZEcsIG1BZGRCLCAwLjBmKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQmxlbmQgY29sb3IgZmlsdGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NraWFCbGVuZEZpbHRlcjo6U2tpYUJsZW5kRmlsdGVyKGludCBjb2xvciwgU2tYZmVybW9kZTo6TW9kZSBtb2RlKToKKyAgICAgICAgU2tpYUNvbG9yRmlsdGVyKGtCbGVuZCwgdHJ1ZSksIG1Nb2RlKG1vZGUpIHsKKyAgICBjb25zdCBpbnQgYWxwaGEgPSAoY29sb3IgPj4gMjQpICYgMHhGRjsKKyAgICBtQSA9IGFscGhhIC8gMjU1LjBmOworICAgIG1SID0gbUEgKiAoKGNvbG9yID4+IDE2KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIG1HID0gbUEgKiAoKGNvbG9yID4+ICA4KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIG1CID0gbUEgKiAoKGNvbG9yICAgICAgKSAmIDB4RkYpIC8gMjU1LjBmOworfQorCit2b2lkIFNraWFCbGVuZEZpbHRlcjo6ZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgeworICAgIGRlc2NyaXB0aW9uLmNvbG9yT3AgPSBQcm9ncmFtRGVzY3JpcHRpb246OmtDb2xvckJsZW5kOworICAgIGRlc2NyaXB0aW9uLmNvbG9yTW9kZSA9IG1Nb2RlOworfQorCit2b2lkIFNraWFCbGVuZEZpbHRlcjo6c2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0pIHsKKyAgICBnbFVuaWZvcm00Zihwcm9ncmFtLT5nZXRVbmlmb3JtKCJjb2xvckJsZW5kIiksIG1SLCBtRywgbUIsIG1BKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvU2tpYUNvbG9yRmlsdGVyLmggYi9saWJzL2h3dWkvU2tpYUNvbG9yRmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY1YjZmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Ta2lhQ29sb3JGaWx0ZXIuaApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9TS0lBX0NPTE9SX0ZJTFRFUl9ICisjZGVmaW5lIEFORFJPSURfVUlfU0tJQV9DT0xPUl9GSUxURVJfSAorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlICJQcm9ncmFtQ2FjaGUuaCIKKyNpbmNsdWRlICJFeHRlbnNpb25zLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQmFzZSBjb2xvciBmaWx0ZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBSZXByZXNlbnRzIGEgU2tpYSBjb2xvciBmaWx0ZXIuIEEgY29sb3IgZmlsdGVyIG1vZGlmaWVzIGEgUHJvZ3JhbURlc2NyaXB0aW9uCisgKiBhbmQgc2V0cyB1bmlmb3JtcyBvbiB0aGUgcmVzdWx0aW5nIHNoYWRlcnMuCisgKi8KK3N0cnVjdCBTa2lhQ29sb3JGaWx0ZXIgeworICAgIC8qKgorICAgICAqIFR5cGUgb2YgU2tpYSBjb2xvciBmaWx0ZXIgaW4gdXNlLgorICAgICAqLworICAgIGVudW0gVHlwZSB7CisgICAgICAgIGtOb25lLAorICAgICAgICBrQ29sb3JNYXRyaXgsCisgICAgICAgIGtMaWdodGluZywKKyAgICAgICAga0JsZW5kLAorICAgIH07CisKKyAgICBTa2lhQ29sb3JGaWx0ZXIoVHlwZSB0eXBlLCBib29sIGJsZW5kKTsKKyAgICB2aXJ0dWFsIH5Ta2lhQ29sb3JGaWx0ZXIoKTsKKworICAgIHZpcnR1YWwgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKSA9IDA7CisKKyAgICBpbmxpbmUgYm9vbCBibGVuZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CbGVuZDsKKyAgICB9CisKKyAgICBUeXBlIHR5cGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHlwZTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBUeXBlIG1UeXBlOworICAgIGJvb2wgbUJsZW5kOworfTsgLy8gc3RydWN0IFNraWFDb2xvckZpbHRlcgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBJbXBsZW1lbnRhdGlvbnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBBIGNvbG9yIGZpbHRlciB0aGF0IG11bHRpcGxpZXMgdGhlIHNvdXJjZSBjb2xvciB3aXRoIGEgbWF0cml4IGFuZCBhZGRzIGEgdmVjdG9yLgorICovCitzdHJ1Y3QgU2tpYUNvbG9yTWF0cml4RmlsdGVyOiBwdWJsaWMgU2tpYUNvbG9yRmlsdGVyIHsKKyAgICBTa2lhQ29sb3JNYXRyaXhGaWx0ZXIoZmxvYXQqIG1hdHJpeCwgZmxvYXQqIHZlY3Rvcik7CisgICAgflNraWFDb2xvck1hdHJpeEZpbHRlcigpOworCisgICAgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKTsKKworcHJpdmF0ZToKKyAgICBmbG9hdCogbU1hdHJpeDsKKyAgICBmbG9hdCogbVZlY3RvcjsKK307IC8vIHN0cnVjdCBTa2lhQ29sb3JNYXRyaXhGaWx0ZXIKKworLyoqCisgKiBBIGNvbG9yIGZpbHRlcnMgdGhhdCBtdWx0aXBsaWVzIHRoZSBzb3VyY2UgY29sb3Igd2l0aCBhIGZpeGVkIHZhbHVlIGFuZCBhZGRzCisgKiBhbm90aGVyIGZpeGVkIHZhbHVlLiBJZ25vcmVzIHRoZSBhbHBoYSBjaGFubmVsIG9mIGJvdGggYXJndW1lbnRzLgorICovCitzdHJ1Y3QgU2tpYUxpZ2h0aW5nRmlsdGVyOiBwdWJsaWMgU2tpYUNvbG9yRmlsdGVyIHsKKyAgICBTa2lhTGlnaHRpbmdGaWx0ZXIoaW50IG11bHRpcGx5LCBpbnQgYWRkKTsKKworICAgIHZvaWQgZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucyk7CisgICAgdm9pZCBzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSk7CisKK3ByaXZhdGU6CisgICAgR0xmbG9hdCBtTXVsUiwgbU11bEcsIG1NdWxCOworICAgIEdMZmxvYXQgbUFkZFIsIG1BZGRHLCBtQWRkQjsKK307IC8vIHN0cnVjdCBTa2lhTGlnaHRpbmdGaWx0ZXIKKworLyoqCisgKiBBIGNvbG9yIGZpbHRlcnMgdGhhdCBibGVuZHMgdGhlIHNvdXJjZSBjb2xvciB3aXRoIGEgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIGNvbG9yCisgKiBhbmQgUG9ydGVyRHVmZiBibGVuZGluZyBtb2RlLgorICovCitzdHJ1Y3QgU2tpYUJsZW5kRmlsdGVyOiBwdWJsaWMgU2tpYUNvbG9yRmlsdGVyIHsKKyAgICBTa2lhQmxlbmRGaWx0ZXIoaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpOworCisgICAgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKTsKKworcHJpdmF0ZToKKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1Nb2RlOworICAgIEdMZmxvYXQgbVIsIG1HLCBtQiwgbUE7Cit9OyAvLyBzdHJ1Y3QgU2tpYUJsZW5kRmlsdGVyCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9TS0lBX0NPTE9SX0ZJTFRFUl9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvU2tpYVNoYWRlci5jcHAgYi9saWJzL2h3dWkvU2tpYVNoYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNkZTJiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Ta2lhU2hhZGVyLmNwcApAQCAtMCwwICsxLDM2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPFNrTWF0cml4Lmg+CisKKyNpbmNsdWRlICJTa2lhU2hhZGVyLmgiCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorI2luY2x1ZGUgIk1hdHJpeC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFN1cHBvcnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGNvbnN0IEdMZW51bSBnVGV4dHVyZVVuaXRzTWFwW10gPSB7CisgICAgICAgIEdMX1RFWFRVUkUwLAorICAgICAgICBHTF9URVhUVVJFMSwKKyAgICAgICAgR0xfVEVYVFVSRTIKK307CisKK3N0YXRpYyBjb25zdCBHTGludCBnVGlsZU1vZGVzW10gPSB7CisgICAgICAgIEdMX0NMQU1QX1RPX0VER0UsICAgLy8gPT0gU2tTaGFkZXI6OmtDbGFtcF9UaWxlTW9kZQorICAgICAgICBHTF9SRVBFQVQsICAgICAgICAgIC8vID09IFNrU2hhZGVyOjprUmVwZWF0X01vZGUKKyAgICAgICAgR0xfTUlSUk9SRURfUkVQRUFUICAvLyA9PSBTa1NoYWRlcjo6a01pcnJvcl9UaWxlTW9kZQorfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQmFzZSBzaGFkZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2tpYVNoYWRlcjo6U2tpYVNoYWRlcihUeXBlIHR5cGUsIFNrU2hhZGVyKiBrZXksIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlWCwKKyAgICAgICAgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVZLCBTa01hdHJpeCogbWF0cml4LCBib29sIGJsZW5kKToKKyAgICAgICAgbVR5cGUodHlwZSksIG1LZXkoa2V5KSwgbVRpbGVYKHRpbGVYKSwgbVRpbGVZKHRpbGVZKSwgbU1hdHJpeChtYXRyaXgpLCBtQmxlbmQoYmxlbmQpIHsKK30KKworU2tpYVNoYWRlcjo6flNraWFTaGFkZXIoKSB7Cit9CisKK3ZvaWQgU2tpYVNoYWRlcjo6ZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgeworfQorCit2b2lkIFNraWFTaGFkZXI6OnNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwKKyAgICAgICAgR0x1aW50KiB0ZXh0dXJlVW5pdCkgeworfQorCit2b2lkIFNraWFTaGFkZXI6OmJpbmRUZXh0dXJlKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gd3JhcFMsIEdMZW51bSB3cmFwVCwgR0x1aW50IHRleHR1cmVVbml0KSB7CisgICAgZ2xBY3RpdmVUZXh0dXJlKGdUZXh0dXJlVW5pdHNNYXBbdGV4dHVyZVVuaXRdKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgd3JhcFMpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgd3JhcFQpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCaXRtYXAgc2hhZGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NraWFCaXRtYXBTaGFkZXI6OlNraWFCaXRtYXBTaGFkZXIoU2tCaXRtYXAqIGJpdG1hcCwgU2tTaGFkZXIqIGtleSwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVYLAorICAgICAgICBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZVksIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOgorICAgICAgICBTa2lhU2hhZGVyKGtCaXRtYXAsIGtleSwgdGlsZVgsIHRpbGVZLCBtYXRyaXgsIGJsZW5kKSwgbUJpdG1hcChiaXRtYXApLCBtVGV4dHVyZShOVUxMKSB7Cit9CisKK3ZvaWQgU2tpYUJpdG1hcFNoYWRlcjo6ZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgeworICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUgPSBtVGV4dHVyZUNhY2hlLT5nZXQobUJpdG1hcCk7CisgICAgaWYgKCF0ZXh0dXJlKSByZXR1cm47CisgICAgbVRleHR1cmUgPSB0ZXh0dXJlOworCisgICAgY29uc3QgZmxvYXQgd2lkdGggPSB0ZXh0dXJlLT53aWR0aDsKKyAgICBjb25zdCBmbG9hdCBoZWlnaHQgPSB0ZXh0dXJlLT5oZWlnaHQ7CisKKyAgICBkZXNjcmlwdGlvbi5oYXNCaXRtYXAgPSB0cnVlOworICAgIC8vIFRoZSBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBub24tcG93ZXIgb2YgdHdvIG1pcnJvcmVkL3JlcGVhdGVkCisgICAgLy8gdGV4dHVyZXMsIHNvIGRvIGl0IG91cnNlbHZlcworICAgIGlmICghZXh0ZW5zaW9ucy5oYXNOUG90KCkgJiYgKCFpc1Bvd2VyT2ZUd28od2lkdGgpIHx8ICFpc1Bvd2VyT2ZUd28oaGVpZ2h0KSkgJiYKKyAgICAgICAgICAgIChtVGlsZVggIT0gU2tTaGFkZXI6OmtDbGFtcF9UaWxlTW9kZSB8fCBtVGlsZVkgIT0gU2tTaGFkZXI6OmtDbGFtcF9UaWxlTW9kZSkpIHsKKyAgICAgICAgZGVzY3JpcHRpb24uaXNCaXRtYXBOcG90ID0gdHJ1ZTsKKyAgICAgICAgZGVzY3JpcHRpb24uYml0bWFwV3JhcFMgPSBnVGlsZU1vZGVzW21UaWxlWF07CisgICAgICAgIGRlc2NyaXB0aW9uLmJpdG1hcFdyYXBUID0gZ1RpbGVNb2Rlc1ttVGlsZVldOworICAgICAgICBtV3JhcFMgPSBHTF9DTEFNUF9UT19FREdFOworICAgICAgICBtV3JhcFQgPSBHTF9DTEFNUF9UT19FREdFOworICAgIH0gZWxzZSB7CisgICAgICAgIG1XcmFwUyA9IGdUaWxlTW9kZXNbbVRpbGVYXTsKKyAgICAgICAgbVdyYXBUID0gZ1RpbGVNb2Rlc1ttVGlsZVldOworICAgIH0KK30KKwordm9pZCBTa2lhQml0bWFwU2hhZGVyOjpzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LAorICAgICAgICBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QsIEdMdWludCogdGV4dHVyZVVuaXQpIHsKKyAgICBHTHVpbnQgdGV4dHVyZVNsb3QgPSAoKnRleHR1cmVVbml0KSsrOworICAgIGdsQWN0aXZlVGV4dHVyZShnVGV4dHVyZVVuaXRzTWFwW3RleHR1cmVTbG90XSk7CisKKyAgICBjb25zdCBUZXh0dXJlKiB0ZXh0dXJlID0gbVRleHR1cmU7CisgICAgbVRleHR1cmUgPSBOVUxMOworICAgIGlmICghdGV4dHVyZSkgcmV0dXJuOworICAgIGNvbnN0IEF1dG9UZXh0dXJlIGF1dG9DbGVhbnVwKHRleHR1cmUpOworCisgICAgY29uc3QgZmxvYXQgd2lkdGggPSB0ZXh0dXJlLT53aWR0aDsKKyAgICBjb25zdCBmbG9hdCBoZWlnaHQgPSB0ZXh0dXJlLT5oZWlnaHQ7CisKKyAgICBtYXQ0IHRleHR1cmVUcmFuc2Zvcm07CisgICAgaWYgKG1NYXRyaXgpIHsKKyAgICAgICAgU2tNYXRyaXggaW52ZXJzZTsKKyAgICAgICAgbU1hdHJpeC0+aW52ZXJ0KCZpbnZlcnNlKTsKKyAgICAgICAgdGV4dHVyZVRyYW5zZm9ybS5sb2FkKGludmVyc2UpOworICAgICAgICB0ZXh0dXJlVHJhbnNmb3JtLm11bHRpcGx5KG1vZGVsVmlldyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGV4dHVyZVRyYW5zZm9ybS5sb2FkKG1vZGVsVmlldyk7CisgICAgfQorCisgICAgLy8gVW5pZm9ybXMKKyAgICBiaW5kVGV4dHVyZSh0ZXh0dXJlLT5pZCwgbVdyYXBTLCBtV3JhcFQsIHRleHR1cmVTbG90KTsKKyAgICBnbFVuaWZvcm0xaShwcm9ncmFtLT5nZXRVbmlmb3JtKCJiaXRtYXBTYW1wbGVyIiksIHRleHR1cmVTbG90KTsKKyAgICBnbFVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgidGV4dHVyZVRyYW5zZm9ybSIpLCAxLAorICAgICAgICAgICAgR0xfRkFMU0UsICZ0ZXh0dXJlVHJhbnNmb3JtLmRhdGFbMF0pOworICAgIGdsVW5pZm9ybTJmKHByb2dyYW0tPmdldFVuaWZvcm0oInRleHR1cmVEaW1lbnNpb24iKSwgMS4wZiAvIHdpZHRoLCAxLjBmIC8gaGVpZ2h0KTsKK30KKwordm9pZCBTa2lhQml0bWFwU2hhZGVyOjp1cGRhdGVUcmFuc2Zvcm1zKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywKKyAgICAgICAgY29uc3QgU25hcHNob3QmIHNuYXBzaG90KSB7CisgICAgbWF0NCB0ZXh0dXJlVHJhbnNmb3JtOworICAgIGlmIChtTWF0cml4KSB7CisgICAgICAgIFNrTWF0cml4IGludmVyc2U7CisgICAgICAgIG1NYXRyaXgtPmludmVydCgmaW52ZXJzZSk7CisgICAgICAgIHRleHR1cmVUcmFuc2Zvcm0ubG9hZChpbnZlcnNlKTsKKyAgICAgICAgdGV4dHVyZVRyYW5zZm9ybS5tdWx0aXBseShtb2RlbFZpZXcpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRleHR1cmVUcmFuc2Zvcm0ubG9hZChtb2RlbFZpZXcpOworICAgIH0KKworICAgIGdsVW5pZm9ybU1hdHJpeDRmdihwcm9ncmFtLT5nZXRVbmlmb3JtKCJ0ZXh0dXJlVHJhbnNmb3JtIiksIDEsCisgICAgICAgICAgICBHTF9GQUxTRSwgJnRleHR1cmVUcmFuc2Zvcm0uZGF0YVswXSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIExpbmVhciBncmFkaWVudCBzaGFkZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgdG9Vbml0TWF0cml4KGNvbnN0IFNrUG9pbnQgcHRzWzJdLCBTa01hdHJpeCogbWF0cml4KSB7CisgICAgU2tWZWN0b3IgdmVjID0gcHRzWzFdIC0gcHRzWzBdOworICAgIGNvbnN0IGZsb2F0IG1hZyA9IHZlYy5sZW5ndGgoKTsKKyAgICBjb25zdCBmbG9hdCBpbnYgPSBtYWcgPyAxLjBmIC8gbWFnIDogMDsKKworICAgIHZlYy5zY2FsZShpbnYpOworICAgIG1hdHJpeC0+c2V0U2luQ29zKC12ZWMuZlksIHZlYy5mWCwgcHRzWzBdLmZYLCBwdHNbMF0uZlkpOworICAgIG1hdHJpeC0+cG9zdFRyYW5zbGF0ZSgtcHRzWzBdLmZYLCAtcHRzWzBdLmZZKTsKKyAgICBtYXRyaXgtPnBvc3RTY2FsZShpbnYsIGludik7Cit9CisKK1NraWFMaW5lYXJHcmFkaWVudFNoYWRlcjo6U2tpYUxpbmVhckdyYWRpZW50U2hhZGVyKGZsb2F0KiBib3VuZHMsIHVpbnQzMl90KiBjb2xvcnMsCisgICAgICAgIGZsb2F0KiBwb3NpdGlvbnMsIGludCBjb3VudCwgU2tTaGFkZXIqIGtleSwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVNb2RlLAorICAgICAgICBTa01hdHJpeCogbWF0cml4LCBib29sIGJsZW5kKToKKyAgICAgICAgU2tpYVNoYWRlcihrTGluZWFyR3JhZGllbnQsIGtleSwgdGlsZU1vZGUsIHRpbGVNb2RlLCBtYXRyaXgsIGJsZW5kKSwKKyAgICAgICAgbUJvdW5kcyhib3VuZHMpLCBtQ29sb3JzKGNvbG9ycyksIG1Qb3NpdGlvbnMocG9zaXRpb25zKSwgbUNvdW50KGNvdW50KSB7CisgICAgU2tQb2ludCBwb2ludHNbMl07CisgICAgcG9pbnRzWzBdLnNldChib3VuZHNbMF0sIGJvdW5kc1sxXSk7CisgICAgcG9pbnRzWzFdLnNldChib3VuZHNbMl0sIGJvdW5kc1szXSk7CisKKyAgICBTa01hdHJpeCB1bml0TWF0cml4OworICAgIHRvVW5pdE1hdHJpeChwb2ludHMsICZ1bml0TWF0cml4KTsKKyAgICBtVW5pdE1hdHJpeC5sb2FkKHVuaXRNYXRyaXgpOworCisgICAgdXBkYXRlTG9jYWxNYXRyaXgobWF0cml4KTsKK30KKworU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyOjp+U2tpYUxpbmVhckdyYWRpZW50U2hhZGVyKCkgeworICAgIGRlbGV0ZVtdIG1Cb3VuZHM7CisgICAgZGVsZXRlW10gbUNvbG9yczsKKyAgICBkZWxldGVbXSBtUG9zaXRpb25zOworfQorCit2b2lkIFNraWFMaW5lYXJHcmFkaWVudFNoYWRlcjo6ZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwKKyAgICAgICAgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgeworICAgIGRlc2NyaXB0aW9uLmhhc0dyYWRpZW50ID0gdHJ1ZTsKKyAgICBkZXNjcmlwdGlvbi5ncmFkaWVudFR5cGUgPSBQcm9ncmFtRGVzY3JpcHRpb246OmtHcmFkaWVudExpbmVhcjsKK30KKwordm9pZCBTa2lhTGluZWFyR3JhZGllbnRTaGFkZXI6OmNvbXB1dGVTY3JlZW5TcGFjZU1hdHJpeChtYXQ0JiBzY3JlZW5TcGFjZSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3KSB7CisgICAgc2NyZWVuU3BhY2UubG9hZE11bHRpcGx5KG1Vbml0TWF0cml4LCBtU2hhZGVyTWF0cml4KTsKKyAgICBzY3JlZW5TcGFjZS5tdWx0aXBseShtb2RlbFZpZXcpOworfQorCit2b2lkIFNraWFMaW5lYXJHcmFkaWVudFNoYWRlcjo6dXBkYXRlTG9jYWxNYXRyaXgoY29uc3QgU2tNYXRyaXgqIG1hdHJpeCkgeworICAgIGlmIChtYXRyaXgpIHsKKyAgICAgICAgbWF0NCBsb2NhbE1hdHJpeCgqbWF0cml4KTsKKyAgICAgICAgbVNoYWRlck1hdHJpeC5sb2FkSW52ZXJzZShsb2NhbE1hdHJpeCk7CisgICAgfQorfQorCit2b2lkIFNraWFMaW5lYXJHcmFkaWVudFNoYWRlcjo6c2V0TWF0cml4KFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICBTa2lhU2hhZGVyOjpzZXRNYXRyaXgobWF0cml4KTsKKyAgICB1cGRhdGVMb2NhbE1hdHJpeChtYXRyaXgpOworfQorCit2b2lkIFNraWFMaW5lYXJHcmFkaWVudFNoYWRlcjo6c2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywKKyAgICAgICAgY29uc3QgU25hcHNob3QmIHNuYXBzaG90LCBHTHVpbnQqIHRleHR1cmVVbml0KSB7CisgICAgR0x1aW50IHRleHR1cmVTbG90ID0gKCp0ZXh0dXJlVW5pdCkrKzsKKyAgICBnbEFjdGl2ZVRleHR1cmUoZ1RleHR1cmVVbml0c01hcFt0ZXh0dXJlU2xvdF0pOworCisgICAgVGV4dHVyZSogdGV4dHVyZSA9IG1HcmFkaWVudENhY2hlLT5nZXQobUtleSk7CisgICAgaWYgKCF0ZXh0dXJlKSB7CisgICAgICAgIHRleHR1cmUgPSBtR3JhZGllbnRDYWNoZS0+YWRkTGluZWFyR3JhZGllbnQobUtleSwgbUNvbG9ycywgbVBvc2l0aW9ucywgbUNvdW50LCBtVGlsZVgpOworICAgIH0KKworICAgIG1hdDQgc2NyZWVuU3BhY2U7CisgICAgY29tcHV0ZVNjcmVlblNwYWNlTWF0cml4KHNjcmVlblNwYWNlLCBtb2RlbFZpZXcpOworCisgICAgLy8gVW5pZm9ybXMKKyAgICBiaW5kVGV4dHVyZSh0ZXh0dXJlLT5pZCwgZ1RpbGVNb2Rlc1ttVGlsZVhdLCBnVGlsZU1vZGVzW21UaWxlWV0sIHRleHR1cmVTbG90KTsKKyAgICBnbFVuaWZvcm0xaShwcm9ncmFtLT5nZXRVbmlmb3JtKCJncmFkaWVudFNhbXBsZXIiKSwgdGV4dHVyZVNsb3QpOworICAgIGdsVW5pZm9ybU1hdHJpeDRmdihwcm9ncmFtLT5nZXRVbmlmb3JtKCJzY3JlZW5TcGFjZSIpLCAxLCBHTF9GQUxTRSwgJnNjcmVlblNwYWNlLmRhdGFbMF0pOworfQorCit2b2lkIFNraWFMaW5lYXJHcmFkaWVudFNoYWRlcjo6dXBkYXRlVHJhbnNmb3JtcyhQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsCisgICAgICAgIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCkgeworICAgIG1hdDQgc2NyZWVuU3BhY2U7CisgICAgY29tcHV0ZVNjcmVlblNwYWNlTWF0cml4KHNjcmVlblNwYWNlLCBtb2RlbFZpZXcpOworICAgIGdsVW5pZm9ybU1hdHJpeDRmdihwcm9ncmFtLT5nZXRVbmlmb3JtKCJzY3JlZW5TcGFjZSIpLCAxLCBHTF9GQUxTRSwgJnNjcmVlblNwYWNlLmRhdGFbMF0pOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDaXJjdWxhciBncmFkaWVudCBzaGFkZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2tpYUNpcmN1bGFyR3JhZGllbnRTaGFkZXI6OlNraWFDaXJjdWxhckdyYWRpZW50U2hhZGVyKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHJhZGl1cywKKyAgICAgICAgdWludDMyX3QqIGNvbG9ycywgZmxvYXQqIHBvc2l0aW9ucywgaW50IGNvdW50LCBTa1NoYWRlcioga2V5LCBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZU1vZGUsCisgICAgICAgIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOgorICAgICAgICBTa2lhU3dlZXBHcmFkaWVudFNoYWRlcihrQ2lyY3VsYXJHcmFkaWVudCwgeCwgeSwgY29sb3JzLCBwb3NpdGlvbnMsIGNvdW50LCBrZXksCisgICAgICAgICAgICAgICAgdGlsZU1vZGUsIG1hdHJpeCwgYmxlbmQpLAorICAgICAgICBtUmFkaXVzKHJhZGl1cykgeworfQorCit2b2lkIFNraWFDaXJjdWxhckdyYWRpZW50U2hhZGVyOjpkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLAorICAgICAgICBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKSB7CisgICAgZGVzY3JpcHRpb24uaGFzR3JhZGllbnQgPSB0cnVlOworICAgIGRlc2NyaXB0aW9uLmdyYWRpZW50VHlwZSA9IFByb2dyYW1EZXNjcmlwdGlvbjo6a0dyYWRpZW50Q2lyY3VsYXI7Cit9CisKK3ZvaWQgU2tpYUNpcmN1bGFyR3JhZGllbnRTaGFkZXI6OnNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsCisgICAgICAgIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwgR0x1aW50KiB0ZXh0dXJlVW5pdCkgeworICAgIFNraWFTd2VlcEdyYWRpZW50U2hhZGVyOjpzZXR1cFByb2dyYW0ocHJvZ3JhbSwgbW9kZWxWaWV3LCBzbmFwc2hvdCwgdGV4dHVyZVVuaXQpOworICAgIGdsVW5pZm9ybTFmKHByb2dyYW0tPmdldFVuaWZvcm0oImdyYWRpZW50UmFkaXVzIiksIDEuMGYgLyBtUmFkaXVzKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU3dlZXAgZ3JhZGllbnQgc2hhZGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NraWFTd2VlcEdyYWRpZW50U2hhZGVyOjpTa2lhU3dlZXBHcmFkaWVudFNoYWRlcihmbG9hdCB4LCBmbG9hdCB5LCB1aW50MzJfdCogY29sb3JzLAorICAgICAgICBmbG9hdCogcG9zaXRpb25zLCBpbnQgY291bnQsIFNrU2hhZGVyKiBrZXksIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOgorICAgICAgICBTa2lhU2hhZGVyKGtTd2VlcEdyYWRpZW50LCBrZXksIFNrU2hhZGVyOjprQ2xhbXBfVGlsZU1vZGUsCisgICAgICAgICAgICAgICAgU2tTaGFkZXI6OmtDbGFtcF9UaWxlTW9kZSwgbWF0cml4LCBibGVuZCksCisgICAgICAgIG1YKHgpLCBtWSh5KSwgbUNvbG9ycyhjb2xvcnMpLCBtUG9zaXRpb25zKHBvc2l0aW9ucyksIG1Db3VudChjb3VudCkgeworfQorCitTa2lhU3dlZXBHcmFkaWVudFNoYWRlcjo6U2tpYVN3ZWVwR3JhZGllbnRTaGFkZXIoVHlwZSB0eXBlLCBmbG9hdCB4LCBmbG9hdCB5LCB1aW50MzJfdCogY29sb3JzLAorICAgICAgICBmbG9hdCogcG9zaXRpb25zLCBpbnQgY291bnQsIFNrU2hhZGVyKiBrZXksIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlTW9kZSwKKyAgICAgICAgU2tNYXRyaXgqIG1hdHJpeCwgYm9vbCBibGVuZCk6CisgICAgICAgIFNraWFTaGFkZXIodHlwZSwga2V5LCB0aWxlTW9kZSwgdGlsZU1vZGUsIG1hdHJpeCwgYmxlbmQpLAorICAgICAgICBtWCh4KSwgbVkoeSksIG1Db2xvcnMoY29sb3JzKSwgbVBvc2l0aW9ucyhwb3NpdGlvbnMpLCBtQ291bnQoY291bnQpIHsKK30KKworU2tpYVN3ZWVwR3JhZGllbnRTaGFkZXI6On5Ta2lhU3dlZXBHcmFkaWVudFNoYWRlcigpIHsKKyAgICBkZWxldGVbXSBtQ29sb3JzOworICAgIGRlbGV0ZVtdIG1Qb3NpdGlvbnM7Cit9CisKK3ZvaWQgU2tpYVN3ZWVwR3JhZGllbnRTaGFkZXI6OmRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sCisgICAgICAgIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpIHsKKyAgICBkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCA9IHRydWU7CisgICAgZGVzY3JpcHRpb24uZ3JhZGllbnRUeXBlID0gUHJvZ3JhbURlc2NyaXB0aW9uOjprR3JhZGllbnRTd2VlcDsKK30KKwordm9pZCBTa2lhU3dlZXBHcmFkaWVudFNoYWRlcjo6c2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywKKyAgICAgICAgY29uc3QgU25hcHNob3QmIHNuYXBzaG90LCBHTHVpbnQqIHRleHR1cmVVbml0KSB7CisgICAgR0x1aW50IHRleHR1cmVTbG90ID0gKCp0ZXh0dXJlVW5pdCkrKzsKKyAgICBnbEFjdGl2ZVRleHR1cmUoZ1RleHR1cmVVbml0c01hcFt0ZXh0dXJlU2xvdF0pOworCisgICAgVGV4dHVyZSogdGV4dHVyZSA9IG1HcmFkaWVudENhY2hlLT5nZXQobUtleSk7CisgICAgaWYgKCF0ZXh0dXJlKSB7CisgICAgICAgIHRleHR1cmUgPSBtR3JhZGllbnRDYWNoZS0+YWRkTGluZWFyR3JhZGllbnQobUtleSwgbUNvbG9ycywgbVBvc2l0aW9ucywgbUNvdW50KTsKKyAgICB9CisKKyAgICBmbG9hdCBsZWZ0ID0gbVg7CisgICAgZmxvYXQgdG9wID0gbVk7CisKKyAgICBtYXQ0IHNoYWRlck1hdHJpeDsKKyAgICBpZiAobU1hdHJpeCkgeworICAgICAgICBzaGFkZXJNYXRyaXgubG9hZCgqbU1hdHJpeCk7CisgICAgICAgIHNoYWRlck1hdHJpeC5tYXBQb2ludChsZWZ0LCB0b3ApOworICAgIH0KKworICAgIG1hdDQgY29weShzaGFkZXJNYXRyaXgpOworICAgIHNoYWRlck1hdHJpeC5sb2FkSW52ZXJzZShjb3B5KTsKKworICAgIHNuYXBzaG90LnRyYW5zZm9ybS0+bWFwUG9pbnQobGVmdCwgdG9wKTsKKworICAgIG1hdDQgc2NyZWVuU3BhY2UoKnNuYXBzaG90LnRyYW5zZm9ybSk7CisgICAgc2NyZWVuU3BhY2UubXVsdGlwbHkobW9kZWxWaWV3KTsKKworICAgIC8vIFVuaWZvcm1zCisgICAgYmluZFRleHR1cmUodGV4dHVyZS0+aWQsIGdUaWxlTW9kZXNbbVRpbGVYXSwgZ1RpbGVNb2Rlc1ttVGlsZVldLCB0ZXh0dXJlU2xvdCk7CisgICAgZ2xVbmlmb3JtMWkocHJvZ3JhbS0+Z2V0VW5pZm9ybSgiZ3JhZGllbnRTYW1wbGVyIiksIHRleHR1cmVTbG90KTsKKyAgICBnbFVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgiZ3JhZGllbnRNYXRyaXgiKSwgMSwgR0xfRkFMU0UsICZzaGFkZXJNYXRyaXguZGF0YVswXSk7CisgICAgZ2xVbmlmb3JtMmYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgiZ3JhZGllbnRTdGFydCIpLCBsZWZ0LCB0b3ApOworICAgIGdsVW5pZm9ybU1hdHJpeDRmdihwcm9ncmFtLT5nZXRVbmlmb3JtKCJzY3JlZW5TcGFjZSIpLCAxLCBHTF9GQUxTRSwgJnNjcmVlblNwYWNlLmRhdGFbMF0pOworfQorCit2b2lkIFNraWFTd2VlcEdyYWRpZW50U2hhZGVyOjp1cGRhdGVUcmFuc2Zvcm1zKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywKKyAgICAgICAgY29uc3QgU25hcHNob3QmIHNuYXBzaG90KSB7CisgICAgbWF0NCBzY3JlZW5TcGFjZSgqc25hcHNob3QudHJhbnNmb3JtKTsKKyAgICBzY3JlZW5TcGFjZS5tdWx0aXBseShtb2RlbFZpZXcpOworICAgIGdsVW5pZm9ybU1hdHJpeDRmdihwcm9ncmFtLT5nZXRVbmlmb3JtKCJzY3JlZW5TcGFjZSIpLCAxLCBHTF9GQUxTRSwgJnNjcmVlblNwYWNlLmRhdGFbMF0pOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb21wb3NlIHNoYWRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTa2lhQ29tcG9zZVNoYWRlcjo6U2tpYUNvbXBvc2VTaGFkZXIoU2tpYVNoYWRlciogZmlyc3QsIFNraWFTaGFkZXIqIHNlY29uZCwKKyAgICAgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBTa1NoYWRlcioga2V5KToKKyAgICAgICAgU2tpYVNoYWRlcihrQ29tcG9zZSwga2V5LCBTa1NoYWRlcjo6a0NsYW1wX1RpbGVNb2RlLCBTa1NoYWRlcjo6a0NsYW1wX1RpbGVNb2RlLAorICAgICAgICBOVUxMLCBmaXJzdC0+YmxlbmQoKSB8fCBzZWNvbmQtPmJsZW5kKCkpLCBtRmlyc3QoZmlyc3QpLCBtU2Vjb25kKHNlY29uZCksIG1Nb2RlKG1vZGUpIHsKK30KKwordm9pZCBTa2lhQ29tcG9zZVNoYWRlcjo6c2V0KFRleHR1cmVDYWNoZSogdGV4dHVyZUNhY2hlLCBHcmFkaWVudENhY2hlKiBncmFkaWVudENhY2hlKSB7CisgICAgU2tpYVNoYWRlcjo6c2V0KHRleHR1cmVDYWNoZSwgZ3JhZGllbnRDYWNoZSk7CisgICAgbUZpcnN0LT5zZXQodGV4dHVyZUNhY2hlLCBncmFkaWVudENhY2hlKTsKKyAgICBtU2Vjb25kLT5zZXQodGV4dHVyZUNhY2hlLCBncmFkaWVudENhY2hlKTsKK30KKwordm9pZCBTa2lhQ29tcG9zZVNoYWRlcjo6ZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgeworICAgIG1GaXJzdC0+ZGVzY3JpYmUoZGVzY3JpcHRpb24sIGV4dGVuc2lvbnMpOworICAgIG1TZWNvbmQtPmRlc2NyaWJlKGRlc2NyaXB0aW9uLCBleHRlbnNpb25zKTsKKyAgICBpZiAobUZpcnN0LT50eXBlKCkgPT0ga0JpdG1hcCkgeworICAgICAgICBkZXNjcmlwdGlvbi5pc0JpdG1hcEZpcnN0ID0gdHJ1ZTsKKyAgICB9CisgICAgZGVzY3JpcHRpb24uc2hhZGVyc01vZGUgPSBtTW9kZTsKK30KKwordm9pZCBTa2lhQ29tcG9zZVNoYWRlcjo6c2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywKKyAgICAgICAgY29uc3QgU25hcHNob3QmIHNuYXBzaG90LCBHTHVpbnQqIHRleHR1cmVVbml0KSB7CisgICAgbUZpcnN0LT5zZXR1cFByb2dyYW0ocHJvZ3JhbSwgbW9kZWxWaWV3LCBzbmFwc2hvdCwgdGV4dHVyZVVuaXQpOworICAgIG1TZWNvbmQtPnNldHVwUHJvZ3JhbShwcm9ncmFtLCBtb2RlbFZpZXcsIHNuYXBzaG90LCB0ZXh0dXJlVW5pdCk7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1NraWFTaGFkZXIuaCBiL2xpYnMvaHd1aS9Ta2lhU2hhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMxZWIzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Ta2lhU2hhZGVyLmgKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfU0tJQV9TSEFERVJfSAorI2RlZmluZSBBTkRST0lEX1VJX1NLSUFfU0hBREVSX0gKKworI2luY2x1ZGUgPFNrU2hhZGVyLmg+CisjaW5jbHVkZSA8U2tYZmVybW9kZS5oPgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlICJFeHRlbnNpb25zLmgiCisjaW5jbHVkZSAiUHJvZ3JhbUNhY2hlLmgiCisjaW5jbHVkZSAiVGV4dHVyZUNhY2hlLmgiCisjaW5jbHVkZSAiR3JhZGllbnRDYWNoZS5oIgorI2luY2x1ZGUgIlNuYXBzaG90LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQmFzZSBzaGFkZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBSZXByZXNlbnRzIGEgU2tpYSBzaGFkZXIuIEEgc2hhZGVyIHdpbGwgbW9kaWZ5IHRoZSBHTCBjb250ZXh0IGFuZCBhY3RpdmUKKyAqIHByb2dyYW0gdG8gcmVjcmVhdGUgdGhlIG9yaWdpbmFsIGVmZmVjdC4KKyAqLworc3RydWN0IFNraWFTaGFkZXIgeworICAgIC8qKgorICAgICAqIFR5cGUgb2YgU2tpYSBzaGFkZXIgaW4gdXNlLgorICAgICAqLworICAgIGVudW0gVHlwZSB7CisgICAgICAgIGtOb25lLAorICAgICAgICBrQml0bWFwLAorICAgICAgICBrTGluZWFyR3JhZGllbnQsCisgICAgICAgIGtDaXJjdWxhckdyYWRpZW50LAorICAgICAgICBrU3dlZXBHcmFkaWVudCwKKyAgICAgICAga0NvbXBvc2UKKyAgICB9OworCisgICAgU2tpYVNoYWRlcihUeXBlIHR5cGUsIFNrU2hhZGVyKiBrZXksIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlWCwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVZLAorICAgICAgICAgICAgU2tNYXRyaXgqIG1hdHJpeCwgYm9vbCBibGVuZCk7CisgICAgdmlydHVhbCB+U2tpYVNoYWRlcigpOworCisgICAgdmlydHVhbCB2b2lkIGRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpOworICAgIHZpcnR1YWwgdm9pZCBzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LCBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QsCisgICAgICAgICAgICBHTHVpbnQqIHRleHR1cmVVbml0KTsKKworICAgIGlubGluZSBib29sIGJsZW5kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJsZW5kOworICAgIH0KKworICAgIFR5cGUgdHlwZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UeXBlOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBzZXQoVGV4dHVyZUNhY2hlKiB0ZXh0dXJlQ2FjaGUsIEdyYWRpZW50Q2FjaGUqIGdyYWRpZW50Q2FjaGUpIHsKKyAgICAgICAgbVRleHR1cmVDYWNoZSA9IHRleHR1cmVDYWNoZTsKKyAgICAgICAgbUdyYWRpZW50Q2FjaGUgPSBncmFkaWVudENhY2hlOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVUcmFuc2Zvcm1zKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywKKyAgICAgICAgICAgIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCkgeworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBzZXRNYXRyaXgoU2tNYXRyaXgqIG1hdHJpeCkgeworICAgICAgICBtTWF0cml4ID0gbWF0cml4OworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGlubGluZSB2b2lkIGJpbmRUZXh0dXJlKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gd3JhcFMsIEdMZW51bSB3cmFwVCwgR0x1aW50IHRleHR1cmVVbml0KTsKKworICAgIFR5cGUgbVR5cGU7CisgICAgU2tTaGFkZXIqIG1LZXk7CisgICAgU2tTaGFkZXI6OlRpbGVNb2RlIG1UaWxlWDsKKyAgICBTa1NoYWRlcjo6VGlsZU1vZGUgbVRpbGVZOworICAgIFNrTWF0cml4KiBtTWF0cml4OworICAgIGJvb2wgbUJsZW5kOworCisgICAgVGV4dHVyZUNhY2hlKiBtVGV4dHVyZUNhY2hlOworICAgIEdyYWRpZW50Q2FjaGUqIG1HcmFkaWVudENhY2hlOworfTsgLy8gc3RydWN0IFNraWFTaGFkZXIKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBJbXBsZW1lbnRhdGlvbnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBBIHNoYWRlciB0aGF0IGRyYXdzIGEgYml0bWFwLgorICovCitzdHJ1Y3QgU2tpYUJpdG1hcFNoYWRlcjogcHVibGljIFNraWFTaGFkZXIgeworICAgIFNraWFCaXRtYXBTaGFkZXIoU2tCaXRtYXAqIGJpdG1hcCwgU2tTaGFkZXIqIGtleSwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVYLAorICAgICAgICAgICAgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVZLCBTa01hdHJpeCogbWF0cml4LCBib29sIGJsZW5kKTsKKworICAgIHZvaWQgZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucyk7CisgICAgdm9pZCBzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LCBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QsCisgICAgICAgICAgICBHTHVpbnQqIHRleHR1cmVVbml0KTsKKyAgICB2b2lkIHVwZGF0ZVRyYW5zZm9ybXMoUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LCBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgZm9yIG4gPT0gMC4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBpc1Bvd2VyT2ZUd28odW5zaWduZWQgaW50IG4pIHsKKyAgICAgICAgcmV0dXJuICEobiAmIChuIC0gMSkpOworICAgIH0KKworICAgIFNrQml0bWFwKiBtQml0bWFwOworICAgIGNvbnN0IFRleHR1cmUqIG1UZXh0dXJlOworICAgIEdMZW51bSBtV3JhcFM7CisgICAgR0xlbnVtIG1XcmFwVDsKK307IC8vIHN0cnVjdCBTa2lhQml0bWFwU2hhZGVyCisKKy8qKgorICogQSBzaGFkZXIgdGhhdCBkcmF3cyBhIGxpbmVhciBncmFkaWVudC4KKyAqLworc3RydWN0IFNraWFMaW5lYXJHcmFkaWVudFNoYWRlcjogcHVibGljIFNraWFTaGFkZXIgeworICAgIFNraWFMaW5lYXJHcmFkaWVudFNoYWRlcihmbG9hdCogYm91bmRzLCB1aW50MzJfdCogY29sb3JzLCBmbG9hdCogcG9zaXRpb25zLCBpbnQgY291bnQsCisgICAgICAgICAgICBTa1NoYWRlcioga2V5LCBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZU1vZGUsIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOworICAgIH5Ta2lhTGluZWFyR3JhZGllbnRTaGFkZXIoKTsKKworICAgIHZvaWQgZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucyk7CisgICAgdm9pZCBzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LCBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QsCisgICAgICAgICAgICBHTHVpbnQqIHRleHR1cmVVbml0KTsKKyAgICB2b2lkIHVwZGF0ZVRyYW5zZm9ybXMoUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LCBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QpOworCisgICAgdm9pZCBzZXRNYXRyaXgoU2tNYXRyaXgqIG1hdHJpeCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCB1cGRhdGVMb2NhbE1hdHJpeChjb25zdCBTa01hdHJpeCogbWF0cml4KTsKKyAgICB2b2lkIGNvbXB1dGVTY3JlZW5TcGFjZU1hdHJpeChtYXQ0JiBzY3JlZW5TcGFjZSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3KTsKKworICAgIG1hdDQgbVVuaXRNYXRyaXg7CisgICAgbWF0NCBtU2hhZGVyTWF0cml4OworCisgICAgZmxvYXQqIG1Cb3VuZHM7CisgICAgdWludDMyX3QqIG1Db2xvcnM7CisgICAgZmxvYXQqIG1Qb3NpdGlvbnM7CisgICAgaW50IG1Db3VudDsKK307IC8vIHN0cnVjdCBTa2lhTGluZWFyR3JhZGllbnRTaGFkZXIKKworLyoqCisgKiBBIHNoYWRlciB0aGF0IGRyYXdzIGEgc3dlZXAgZ3JhZGllbnQuCisgKi8KK3N0cnVjdCBTa2lhU3dlZXBHcmFkaWVudFNoYWRlcjogcHVibGljIFNraWFTaGFkZXIgeworICAgIFNraWFTd2VlcEdyYWRpZW50U2hhZGVyKGZsb2F0IHgsIGZsb2F0IHksIHVpbnQzMl90KiBjb2xvcnMsIGZsb2F0KiBwb3NpdGlvbnMsIGludCBjb3VudCwKKyAgICAgICAgICAgIFNrU2hhZGVyKiBrZXksIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOworICAgIH5Ta2lhU3dlZXBHcmFkaWVudFNoYWRlcigpOworCisgICAgdmlydHVhbCB2b2lkIGRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpOworICAgIHZpcnR1YWwgdm9pZCBzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LCBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QsCisgICAgICAgICAgICBHTHVpbnQqIHRleHR1cmVVbml0KTsKKyAgICB2b2lkIHVwZGF0ZVRyYW5zZm9ybXMoUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LCBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QpOworCitwcm90ZWN0ZWQ6CisgICAgU2tpYVN3ZWVwR3JhZGllbnRTaGFkZXIoVHlwZSB0eXBlLCBmbG9hdCB4LCBmbG9hdCB5LCB1aW50MzJfdCogY29sb3JzLCBmbG9hdCogcG9zaXRpb25zLAorICAgICAgICAgICAgaW50IGNvdW50LCBTa1NoYWRlcioga2V5LCBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZU1vZGUsIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOworCisgICAgZmxvYXQgbVgsIG1ZOworICAgIHVpbnQzMl90KiBtQ29sb3JzOworICAgIGZsb2F0KiBtUG9zaXRpb25zOworICAgIGludCBtQ291bnQ7Cit9OyAvLyBzdHJ1Y3QgU2tpYVN3ZWVwR3JhZGllbnRTaGFkZXIKKworLyoqCisgKiBBIHNoYWRlciB0aGF0IGRyYXdzIGEgY2lyY3VsYXIgZ3JhZGllbnQuCisgKi8KK3N0cnVjdCBTa2lhQ2lyY3VsYXJHcmFkaWVudFNoYWRlcjogcHVibGljIFNraWFTd2VlcEdyYWRpZW50U2hhZGVyIHsKKyAgICBTa2lhQ2lyY3VsYXJHcmFkaWVudFNoYWRlcihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCByYWRpdXMsIHVpbnQzMl90KiBjb2xvcnMsIGZsb2F0KiBwb3NpdGlvbnMsCisgICAgICAgICAgICBpbnQgY291bnQsIFNrU2hhZGVyKiBrZXksU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVNb2RlLCBTa01hdHJpeCogbWF0cml4LCBib29sIGJsZW5kKTsKKworICAgIHZvaWQgZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucyk7CisgICAgdm9pZCBzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LCBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QsCisgICAgICAgICAgICBHTHVpbnQqIHRleHR1cmVVbml0KTsKKworcHJpdmF0ZToKKyAgICBmbG9hdCBtUmFkaXVzOworfTsgLy8gc3RydWN0IFNraWFDaXJjdWxhckdyYWRpZW50U2hhZGVyCisKKy8qKgorICogQSBzaGFkZXIgdGhhdCBkcmF3cyB0d28gc2hhZGVycywgY29tcG9zaXRlZCB3aXRoIGFuIHhmZXJtb2RlLgorICovCitzdHJ1Y3QgU2tpYUNvbXBvc2VTaGFkZXI6IHB1YmxpYyBTa2lhU2hhZGVyIHsKKyAgICBTa2lhQ29tcG9zZVNoYWRlcihTa2lhU2hhZGVyKiBmaXJzdCwgU2tpYVNoYWRlciogc2Vjb25kLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIFNrU2hhZGVyKiBrZXkpOworCisgICAgdm9pZCBzZXQoVGV4dHVyZUNhY2hlKiB0ZXh0dXJlQ2FjaGUsIEdyYWRpZW50Q2FjaGUqIGdyYWRpZW50Q2FjaGUpOworCisgICAgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwKKyAgICAgICAgICAgIEdMdWludCogdGV4dHVyZVVuaXQpOworCitwcml2YXRlOgorICAgIFNraWFTaGFkZXIqIG1GaXJzdDsKKyAgICBTa2lhU2hhZGVyKiBtU2Vjb25kOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbU1vZGU7Cit9OyAvLyBzdHJ1Y3QgU2tpYUNvbXBvc2VTaGFkZXIKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1NLSUFfU0hBREVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9TbmFwc2hvdC5oIGIvbGlicy9od3VpL1NuYXBzaG90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3NGI0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9TbmFwc2hvdC5oCkBAIC0wLDAgKzEsMjUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1NOQVBTSE9UX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9TTkFQU0hPVF9ICisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgPFNrQ2FudmFzLmg+CisjaW5jbHVkZSA8U2tSZWdpb24uaD4KKworI2luY2x1ZGUgIkxheWVyLmgiCisjaW5jbHVkZSAiTWF0cml4LmgiCisjaW5jbHVkZSAiUmVjdC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogQSBzbmFwc2hvdCBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcmVuZGVyaW5nCisgKiBzdXJmYWNlLiBBIHNuYXBzaG90IGlzIHVzdWFsbHkgY3JlYXRlZCB3aGVuZXZlciB0aGUgdXNlciBjYWxscyBzYXZlKCkKKyAqIGFuZCBkaXNjYXJkZWQgd2hlbiB0aGUgdXNlciBjYWxscyByZXN0b3JlKCkuIE9uY2UgYSBzbmFwc2hvdCBpcyBjcmVhdGVkLAorICogaXQgY2FuIGhvbGQgaW5mb3JtYXRpb24gZm9yIGRlZmVycmVkIHJlbmRlcmluZy4KKyAqCisgKiBFYWNoIHNuYXBzaG90IGhhcyBhIGxpbmsgdG8gYSBwcmV2aW91cyBzbmFwc2hvdCwgaW5kaWNhdGluZyB0aGUgcHJldmlvdXMKKyAqIHN0YXRlIG9mIHRoZSByZW5kZXJlci4KKyAqLworY2xhc3MgU25hcHNob3Q6IHB1YmxpYyBMaWdodFJlZkJhc2U8U25hcHNob3Q+IHsKK3B1YmxpYzoKKyAgICBTbmFwc2hvdCgpOiBmbGFncygwKSwgcHJldmlvdXMoTlVMTCksIGxheWVyKE5VTEwpLCBmYm8oMCkgeworICAgICAgICB0cmFuc2Zvcm0gPSAmbVRyYW5zZm9ybVJvb3Q7CisgICAgICAgIGNsaXBSZWN0ID0gJm1DbGlwUmVjdFJvb3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29waWVzIHRoZSBzcGVjaWZpZWQgc25hcHNob3QvIFRoZSBzcGVjaWZpZWQgc25hcHNob3QgaXMgc3RvcmVkIGFzCisgICAgICogdGhlIHByZXZpb3VzIHNuYXBzaG90LgorICAgICAqLworICAgIFNuYXBzaG90KGNvbnN0IHNwPFNuYXBzaG90PiYgcywgaW50IHNhdmVGbGFncyk6CisgICAgICAgICAgICBmbGFncygwKSwgcHJldmlvdXMocyksIGxheWVyKE5VTEwpLAorICAgICAgICAgICAgZmJvKHMtPmZibyksIHZpZXdwb3J0KHMtPnZpZXdwb3J0KSwgaGVpZ2h0KHMtPmhlaWdodCkgeworICAgICAgICBpZiAoc2F2ZUZsYWdzICYgU2tDYW52YXM6OmtNYXRyaXhfU2F2ZUZsYWcpIHsKKyAgICAgICAgICAgIG1UcmFuc2Zvcm1Sb290LmxvYWQoKnMtPnRyYW5zZm9ybSk7CisgICAgICAgICAgICB0cmFuc2Zvcm0gPSAmbVRyYW5zZm9ybVJvb3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cmFuc2Zvcm0gPSBzLT50cmFuc2Zvcm07CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2F2ZUZsYWdzICYgU2tDYW52YXM6OmtDbGlwX1NhdmVGbGFnKSB7CisgICAgICAgICAgICBtQ2xpcFJlY3RSb290LnNldCgqcy0+Y2xpcFJlY3QpOworICAgICAgICAgICAgY2xpcFJlY3QgPSAmbUNsaXBSZWN0Um9vdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNsaXBSZWN0ID0gcy0+Y2xpcFJlY3Q7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHMtPmZsYWdzICYgU25hcHNob3Q6OmtGbGFnQ2xpcFNldCkgJiYKKyAgICAgICAgICAgICAgICAhKHMtPmZsYWdzICYgU25hcHNob3Q6OmtGbGFnRGlydHlMb2NhbENsaXApKSB7CisgICAgICAgICAgICBtTG9jYWxDbGlwLnNldChzLT5tTG9jYWxDbGlwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IFNuYXBzaG90OjprRmxhZ0RpcnR5TG9jYWxDbGlwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFyaW91cyBmbGFncyBzZXQgb24gI2ZsYWdzLgorICAgICAqLworICAgIGVudW0gRmxhZ3MgeworICAgICAgICAvKioKKyAgICAgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGNsaXAgcmVnaW9uIHdhcyBtb2RpZmllZC4gV2hlbiB0aGlzCisgICAgICAgICAqIHNuYXBzaG90IGlzIHJlc3RvcmVkIHNvIG11c3QgdGhlIGNsaXAuCisgICAgICAgICAqLworICAgICAgICBrRmxhZ0NsaXBTZXQgPSAweDEsCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGlzIHNuYXBzaG90IHdhcyBjcmVhdGVkIHdoZW4gc2F2aW5nCisgICAgICAgICAqIGEgbmV3IGxheWVyLgorICAgICAgICAgKi8KKyAgICAgICAga0ZsYWdJc0xheWVyID0gMHgyLAorICAgICAgICAvKioKKyAgICAgICAgICogSW5kaWNhdGVzIHRoYXQgdGhpcyBzbmFwc2hvdCBpcyBhIHNwZWNpYWwgdHlwZSBvZiBsYXllcgorICAgICAgICAgKiBiYWNrZWQgYnkgYW4gRkJPLiBUaGlzIGZsYWcgb25seSBtYWtlcyBzZW5zZSB3aGVuIHRoZQorICAgICAgICAgKiBmbGFnIGtGbGFnSXNMYXllciBpcyBhbHNvIHNldC4KKyAgICAgICAgICovCisgICAgICAgIGtGbGFnSXNGYm9MYXllciA9IDB4NCwKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBsb2NhbCBjbGlwIHNob3VsZCBiZSByZWNvbXB1dGVkLgorICAgICAgICAgKi8KKyAgICAgICAga0ZsYWdEaXJ0eUxvY2FsQ2xpcCA9IDB4OCwKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluZGljYXRlcyB0aGF0IHRoaXMgc25hcHNob3QgaGFzIGNoYW5nZWQgdGhlIG9ydGhvIG1hdHJpeC4KKyAgICAgICAgICovCisgICAgICAgIGtGbGFnRGlydHlPcnRobyA9IDB4MTAsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIE1vZGlmaWVzIHRoZSBjdXJyZW50IGNsaXAgd2l0aCB0aGUgbmV3IGNsaXAgcmVjdGFuZ2xlIGFuZAorICAgICAqIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uLiBUaGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBpcyB0cmFuc2Zvcm1lZAorICAgICAqIGJ5IHRoaXMgc25hcHNob3QncyB0cmFzbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBib29sIGNsaXAoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgU2tSZWdpb246Ok9wIG9wID0gU2tSZWdpb246OmtJbnRlcnNlY3RfT3ApIHsKKyAgICAgICAgUmVjdCByKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgICAgIHRyYW5zZm9ybS0+bWFwUmVjdChyKTsKKyAgICAgICAgcmV0dXJuIGNsaXBUcmFuc2Zvcm1lZChyLCBvcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTW9kaWZpZXMgdGhlIGN1cnJlbnQgY2xpcCB3aXRoIHRoZSBuZXcgY2xpcCByZWN0YW5nbGUgYW5kCisgICAgICogdGhlIHNwZWNpZmllZCBvcGVyYXRpb24uIFRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIGlzIGNvbnNpZGVyZWQKKyAgICAgKiBhbHJlYWR5IHRyYW5zZm9ybWVkLgorICAgICAqLworICAgIGJvb2wgY2xpcFRyYW5zZm9ybWVkKGNvbnN0IFJlY3QmIHIsIFNrUmVnaW9uOjpPcCBvcCA9IFNrUmVnaW9uOjprSW50ZXJzZWN0X09wKSB7CisgICAgICAgIGJvb2wgY2xpcHBlZCA9IGZhbHNlOworCisgICAgICAgIC8vIE5PVEU6IFRoZSB1bmltcGxlbWVudGVkIG9wZXJhdGlvbnMgcmVxdWlyZSBzdXBwb3J0IGZvciByZWdpb25zCisgICAgICAgIC8vIFN1cHBvcnRpbmcgcmVnaW9ucyB3b3VsZCByZXF1aXJlIHVzaW5nIGEgc3RlbmNpbCBidWZmZXIgaW5zdGVhZAorICAgICAgICAvLyBvZiB0aGUgc2Npc3Nvci4gVGhlIHN0ZW5jaWwgYnVmZmVyIGl0c2VsZiBpcyBub3QgdG9vIGV4cGVuc2l2ZQorICAgICAgICAvLyAobWVtb3J5IGNvc3QgZXhjbHVkZWQpIGJ1dCBvbiBmaWxscmF0ZSBsaW1pdGVkIGRldmljZXMsIG1hbmFnaW5nCisgICAgICAgIC8vIHRoZSBzdGVuY2lsIG1pZ2h0IGhhdmUgYSBuZWdhdGl2ZSBpbXBhY3Qgb24gdGhlIGZyYW1lcmF0ZS4KKyAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgY2FzZSBTa1JlZ2lvbjo6a0RpZmZlcmVuY2VfT3A6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNrUmVnaW9uOjprSW50ZXJzZWN0X09wOgorICAgICAgICAgICAgICAgIGNsaXBwZWQgPSBjbGlwUmVjdC0+aW50ZXJzZWN0KHIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTa1JlZ2lvbjo6a1VuaW9uX09wOgorICAgICAgICAgICAgICAgIGNsaXBwZWQgPSBjbGlwUmVjdC0+dW5pb25XaXRoKHIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTa1JlZ2lvbjo6a1hPUl9PcDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2tSZWdpb246OmtSZXZlcnNlRGlmZmVyZW5jZV9PcDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2tSZWdpb246OmtSZXBsYWNlX09wOgorICAgICAgICAgICAgICAgIGNsaXBSZWN0LT5zZXQocik7CisgICAgICAgICAgICAgICAgY2xpcHBlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2xpcHBlZCkgeworICAgICAgICAgICAgY2xpcFJlY3QtPnNuYXBUb1BpeGVsQm91bmRhcmllcygpOworICAgICAgICAgICAgZmxhZ3MgfD0gU25hcHNob3Q6OmtGbGFnQ2xpcFNldCB8IFNuYXBzaG90OjprRmxhZ0RpcnR5TG9jYWxDbGlwOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNsaXBwZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY3VycmVudCBjbGlwLgorICAgICAqLworICAgIHZvaWQgc2V0Q2xpcChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIHsKKyAgICAgICAgY2xpcFJlY3QtPnNldChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgICAgICBmbGFncyB8PSBTbmFwc2hvdDo6a0ZsYWdDbGlwU2V0IHwgU25hcHNob3Q6OmtGbGFnRGlydHlMb2NhbENsaXA7CisgICAgfQorCisgICAgY29uc3QgUmVjdCYgZ2V0TG9jYWxDbGlwKCkgeworICAgICAgICBpZiAoZmxhZ3MgJiBTbmFwc2hvdDo6a0ZsYWdEaXJ0eUxvY2FsQ2xpcCkgeworICAgICAgICAgICAgbWF0NCBpbnZlcnNlOworICAgICAgICAgICAgaW52ZXJzZS5sb2FkSW52ZXJzZSgqdHJhbnNmb3JtKTsKKworICAgICAgICAgICAgbUxvY2FsQ2xpcC5zZXQoKmNsaXBSZWN0KTsKKyAgICAgICAgICAgIGludmVyc2UubWFwUmVjdChtTG9jYWxDbGlwKTsKKworICAgICAgICAgICAgZmxhZ3MgJj0gflNuYXBzaG90OjprRmxhZ0RpcnR5TG9jYWxDbGlwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtTG9jYWxDbGlwOworICAgIH0KKworICAgIHZvaWQgcmVzZXRUcmFuc2Zvcm0oZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICB0cmFuc2Zvcm0gPSAmbVRyYW5zZm9ybVJvb3Q7CisgICAgICAgIHRyYW5zZm9ybS0+bG9hZFRyYW5zbGF0ZSh4LCB5LCB6KTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0Q2xpcChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIHsKKyAgICAgICAgY2xpcFJlY3QgPSAmbUNsaXBSZWN0Um9vdDsKKyAgICAgICAgY2xpcFJlY3QtPnNldChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgICAgICBmbGFncyB8PSBTbmFwc2hvdDo6a0ZsYWdDbGlwU2V0IHwgU25hcHNob3Q6OmtGbGFnRGlydHlMb2NhbENsaXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlydHkgZmxhZ3MuCisgICAgICovCisgICAgaW50IGZsYWdzOworCisgICAgLyoqCisgICAgICogUHJldmlvdXMgc25hcHNob3QuCisgICAgICovCisgICAgc3A8U25hcHNob3Q+IHByZXZpb3VzOworCisgICAgLyoqCisgICAgICogT25seSBzZXQgd2hlbiB0aGUgZmxhZyBrRmxhZ0lzTGF5ZXIgaXMgc2V0LgorICAgICAqLworICAgIExheWVyKiBsYXllcjsKKworICAgIC8qKgorICAgICAqIE9ubHkgc2V0IHdoZW4gdGhlIGZsYWcga0ZsYWdJc0Zib0xheWVyIGlzIHNldC4KKyAgICAgKi8KKyAgICBHTHVpbnQgZmJvOworCisgICAgLyoqCisgICAgICogQ3VycmVudCB2aWV3cG9ydC4KKyAgICAgKi8KKyAgICBSZWN0IHZpZXdwb3J0OworCisgICAgLyoqCisgICAgICogSGVpZ2h0IG9mIHRoZSBmcmFtZWJ1ZmZlciB0aGUgc25hcHNob3QgaXMgcmVuZGVyaW5nIGludG8uCisgICAgICovCisgICAgaW50IGhlaWdodDsKKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIHRoZSBwcmV2aW91cyBvcnRobyBtYXRyaXguCisgICAgICovCisgICAgbWF0NCBvcnRob01hdHJpeDsKKworICAgIC8qKgorICAgICAqIExvY2FsIHRyYW5zZm9ybWF0aW9uLiBIb2xkcyB0aGUgY3VycmVudCB0cmFuc2xhdGlvbiwgc2NhbGUgYW5kCisgICAgICogcm90YXRpb24gdmFsdWVzLgorICAgICAqLworICAgIG1hdDQqIHRyYW5zZm9ybTsKKworICAgIC8qKgorICAgICAqIEN1cnJlbnQgY2xpcCByZWdpb24uIFRoZSBjbGlwIGlzIHN0b3JlZCBpbiBjYW52YXMtc3BhY2UgY29vcmRpbmF0ZXMsCisgICAgICogKHNjcmVlbi1zcGFjZSBjb29yZGluYXRlcyBpbiB0aGUgcmVndWxhciBjYXNlLikKKyAgICAgKi8KKyAgICBSZWN0KiBjbGlwUmVjdDsKKworcHJpdmF0ZToKKyAgICBtYXQ0IG1UcmFuc2Zvcm1Sb290OworICAgIFJlY3QgbUNsaXBSZWN0Um9vdDsKKyAgICBSZWN0IG1Mb2NhbENsaXA7CisKK307IC8vIGNsYXNzIFNuYXBzaG90CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9TTkFQU0hPVF9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvVGV4dERyb3BTaGFkb3dDYWNoZS5jcHAgYi9saWJzL2h3dWkvVGV4dERyb3BTaGFkb3dDYWNoZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1NDI3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9UZXh0RHJvcFNoYWRvd0NhY2hlLmNwcApAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlICJUZXh0RHJvcFNoYWRvd0NhY2hlLmgiCisjaW5jbHVkZSAiUHJvcGVydGllcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1RleHREcm9wU2hhZG93Q2FjaGU6OlRleHREcm9wU2hhZG93Q2FjaGUoKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxTaGFkb3dUZXh0LCBTaGFkb3dUZXh0dXJlKj46OmtVbmxpbWl0ZWRDYXBhY2l0eSksCisgICAgICAgIG1TaXplKDApLCBtTWF4U2l6ZShNQihERUZBVUxUX0RST1BfU0hBRE9XX0NBQ0hFX1NJWkUpKSB7CisgICAgY2hhciBwcm9wZXJ0eVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUEVSVFlfRFJPUF9TSEFET1dfQ0FDSEVfU0laRSwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgZHJvcCBzaGFkb3cgY2FjaGUgc2l6ZSB0byAlc01CIiwgcHJvcGVydHkpOworICAgICAgICBzZXRNYXhTaXplKE1CKGF0b2YocHJvcGVydHkpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiICBVc2luZyBkZWZhdWx0IGRyb3Agc2hhZG93IGNhY2hlIHNpemUgb2YgJS4yZk1CIiwgREVGQVVMVF9EUk9QX1NIQURPV19DQUNIRV9TSVpFKTsKKyAgICB9CisKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcih0aGlzKTsKK30KKworVGV4dERyb3BTaGFkb3dDYWNoZTo6VGV4dERyb3BTaGFkb3dDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk6CisgICAgICAgIG1DYWNoZShHZW5lcmF0aW9uQ2FjaGU8U2hhZG93VGV4dCwgU2hhZG93VGV4dHVyZSo+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtU2l6ZSgwKSwgbU1heFNpemUobWF4Qnl0ZVNpemUpIHsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcih0aGlzKTsKK30KKworVGV4dERyb3BTaGFkb3dDYWNoZTo6flRleHREcm9wU2hhZG93Q2FjaGUoKSB7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNpemUgbWFuYWdlbWVudAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit1aW50MzJfdCBUZXh0RHJvcFNoYWRvd0NhY2hlOjpnZXRTaXplKCkgeworICAgIHJldHVybiBtU2l6ZTsKK30KKwordWludDMyX3QgVGV4dERyb3BTaGFkb3dDYWNoZTo6Z2V0TWF4U2l6ZSgpIHsKKyAgICByZXR1cm4gbU1heFNpemU7Cit9CisKK3ZvaWQgVGV4dERyb3BTaGFkb3dDYWNoZTo6c2V0TWF4U2l6ZSh1aW50MzJfdCBtYXhTaXplKSB7CisgICAgbU1heFNpemUgPSBtYXhTaXplOworICAgIHdoaWxlIChtU2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgIG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhbGxiYWNrcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFRleHREcm9wU2hhZG93Q2FjaGU6Om9wZXJhdG9yKCkoU2hhZG93VGV4dCYgdGV4dCwgU2hhZG93VGV4dHVyZSomIHRleHR1cmUpIHsKKyAgICBjb25zdCB1aW50MzJfdCBzaXplID0gdGV4dHVyZS0+d2lkdGggKiB0ZXh0dXJlLT5oZWlnaHQ7CisgICAgbVNpemUgLT0gc2l6ZTsKKworICAgIGlmICh0ZXh0dXJlKSB7CisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRleHR1cmUtPmlkKTsKKyAgICAgICAgZGVsZXRlIHRleHR1cmU7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoaW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgVGV4dERyb3BTaGFkb3dDYWNoZTo6Y2xlYXIoKSB7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKK1NoYWRvd1RleHR1cmUqIFRleHREcm9wU2hhZG93Q2FjaGU6OmdldChTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3QgbGVuLAorICAgICAgICBpbnQgbnVtR2x5cGhzLCB1aW50MzJfdCByYWRpdXMpIHsKKyAgICBTaGFkb3dUZXh0IGVudHJ5KHBhaW50LCByYWRpdXMsIGxlbiwgdGV4dCk7CisgICAgU2hhZG93VGV4dHVyZSogdGV4dHVyZSA9IG1DYWNoZS5nZXQoZW50cnkpOworCisgICAgaWYgKCF0ZXh0dXJlKSB7CisgICAgICAgIEZvbnRSZW5kZXJlcjo6RHJvcFNoYWRvdyBzaGFkb3cgPSBtUmVuZGVyZXItPnJlbmRlckRyb3BTaGFkb3cocGFpbnQsIHRleHQsIDAsCisgICAgICAgICAgICAgICAgbGVuLCBudW1HbHlwaHMsIHJhZGl1cyk7CisKKyAgICAgICAgdGV4dHVyZSA9IG5ldyBTaGFkb3dUZXh0dXJlOworICAgICAgICB0ZXh0dXJlLT5sZWZ0ID0gc2hhZG93LnBlblg7CisgICAgICAgIHRleHR1cmUtPnRvcCA9IHNoYWRvdy5wZW5ZOworICAgICAgICB0ZXh0dXJlLT53aWR0aCA9IHNoYWRvdy53aWR0aDsKKyAgICAgICAgdGV4dHVyZS0+aGVpZ2h0ID0gc2hhZG93LmhlaWdodDsKKyAgICAgICAgdGV4dHVyZS0+Z2VuZXJhdGlvbiA9IDA7CisgICAgICAgIHRleHR1cmUtPmJsZW5kID0gdHJ1ZTsKKworICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplID0gc2hhZG93LndpZHRoICogc2hhZG93LmhlaWdodDsKKyAgICAgICAgLy8gRG9uJ3QgZXZlbiB0cnkgdG8gY2FjaGUgYSBiaXRtYXAgdGhhdCdzIGJpZ2dlciB0aGFuIHRoZSBjYWNoZQorICAgICAgICBpZiAoc2l6ZSA8IG1NYXhTaXplKSB7CisgICAgICAgICAgICB3aGlsZSAobVNpemUgKyBzaXplID4gbU1heFNpemUpIHsKKyAgICAgICAgICAgICAgICBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBnbEdlblRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisKKyAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlLT5pZCk7CisgICAgICAgIC8vIFRleHR1cmVzIGFyZSBBbHBoYTgKKyAgICAgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCAxKTsKKworICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfQUxQSEEsIHRleHR1cmUtPndpZHRoLCB0ZXh0dXJlLT5oZWlnaHQsIDAsCisgICAgICAgICAgICAgICAgR0xfQUxQSEEsIEdMX1VOU0lHTkVEX0JZVEUsIHNoYWRvdy5pbWFnZSk7CisKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworCisgICAgICAgIGlmIChzaXplIDwgbU1heFNpemUpIHsKKyAgICAgICAgICAgIG1TaXplICs9IHNpemU7CisgICAgICAgICAgICBtQ2FjaGUucHV0KGVudHJ5LCB0ZXh0dXJlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRleHR1cmUtPmNsZWFudXAgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2xlYW51cCBzaGFkb3cKKyAgICAgICAgZGVsZXRlW10gc2hhZG93LmltYWdlOworICAgIH0KKworICAgIHJldHVybiB0ZXh0dXJlOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9UZXh0RHJvcFNoYWRvd0NhY2hlLmggYi9saWJzL2h3dWkvVGV4dERyb3BTaGFkb3dDYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NWQ2MmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvVGV4dERyb3BTaGFkb3dDYWNoZS5oCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1RFWFRfRFJPUF9TSEFET1dfQ0FDSEVfSAorI2RlZmluZSBBTkRST0lEX1VJX1RFWFRfRFJPUF9TSEFET1dfQ0FDSEVfSAorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisKKyNpbmNsdWRlICJHZW5lcmF0aW9uQ2FjaGUuaCIKKyNpbmNsdWRlICJGb250UmVuZGVyZXIuaCIKKyNpbmNsdWRlICJUZXh0dXJlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworc3RydWN0IFNoYWRvd1RleHQgeworICAgIFNoYWRvd1RleHQoKSB7CisgICAgICAgIHRleHQgPSBOVUxMOworICAgIH0KKworICAgIFNoYWRvd1RleHQoU2tQYWludCogcGFpbnQsIHVpbnQzMl90IHJhZGl1cywgdWludDMyX3QgbGVuLCBjb25zdCBjaGFyKiBzcmNUZXh0KToKKyAgICAgICAgICAgIHJhZGl1cyhyYWRpdXMpLCBsZW4obGVuKSB7CisgICAgICAgIHRleHQgPSBuZXcgY2hhcltsZW5dOworICAgICAgICBtZW1jcHkodGV4dCwgc3JjVGV4dCwgbGVuKTsKKworICAgICAgICB0ZXh0U2l6ZSA9IHBhaW50LT5nZXRUZXh0U2l6ZSgpOworICAgICAgICB0eXBlZmFjZSA9IHBhaW50LT5nZXRUeXBlZmFjZSgpOworCisgICAgICAgIGhhc2ggPSAwOworICAgICAgICB1aW50MzJfdCBtdWx0aXBsaWVyID0gMTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBoYXNoICs9IHRleHRbaV0gKiBtdWx0aXBsaWVyOworICAgICAgICAgICAgdWludDMyX3Qgc2hpZnRlZCA9IG11bHRpcGxpZXIgPDwgNTsKKyAgICAgICAgICAgIG11bHRpcGxpZXIgPSBzaGlmdGVkIC0gbXVsdGlwbGllcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIFNoYWRvd1RleHQoY29uc3QgU2hhZG93VGV4dCYgc2hhZG93KToKKyAgICAgICAgICAgIHJhZGl1cyhzaGFkb3cucmFkaXVzKSwgbGVuKHNoYWRvdy5sZW4pLCBoYXNoKHNoYWRvdy5oYXNoKSwKKyAgICAgICAgICAgIHRleHRTaXplKHNoYWRvdy50ZXh0U2l6ZSksIHR5cGVmYWNlKHNoYWRvdy50eXBlZmFjZSkgeworICAgICAgICB0ZXh0ID0gbmV3IGNoYXJbc2hhZG93Lmxlbl07CisgICAgICAgIG1lbWNweSh0ZXh0LCBzaGFkb3cudGV4dCwgc2hhZG93Lmxlbik7CisgICAgfQorCisgICAgflNoYWRvd1RleHQoKSB7CisgICAgICAgIGRlbGV0ZVtdIHRleHQ7CisgICAgfQorCisgICAgdWludDMyX3QgcmFkaXVzOworICAgIHVpbnQzMl90IGxlbjsKKyAgICB1aW50MzJfdCBoYXNoOworICAgIGZsb2F0IHRleHRTaXplOworICAgIFNrVHlwZWZhY2UqIHR5cGVmYWNlOworICAgIGNoYXIgKnRleHQ7CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBTaGFkb3dUZXh0JiByaHMpIGNvbnN0IHsKKyAgICAgICAgaWYgKGhhc2ggPCByaHMuaGFzaCkgcmV0dXJuIHRydWU7CisgICAgICAgIGVsc2UgaWYgKGhhc2ggPT0gcmhzLmhhc2gpIHsKKyAgICAgICAgICAgIGlmIChsZW4gPCByaHMubGVuKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGxlbiA9PSByaHMubGVuKSB7CisgICAgICAgICAgICAgICAgaWYgKHJhZGl1cyA8IHJocy5yYWRpdXMpIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhZGl1cyA9PSByaHMucmFkaXVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0U2l6ZSA8IHJocy50ZXh0U2l6ZSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRleHRTaXplID09IHJocy50ZXh0U2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVmYWNlIDwgcmhzLnR5cGVmYWNlKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVmYWNlID09IHJocy50eXBlZmFjZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJuY21wKHRleHQsIHJocy50ZXh0LCBsZW4pIDwgMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfTsgLy8gc3RydWN0IFNoYWRvd1RleHQKKworLyoqCisgKiBBbHBoYSB0ZXh0dXJlIHVzZWQgdG8gcmVwcmVzZW50IGEgc2hhZG93LgorICovCitzdHJ1Y3QgU2hhZG93VGV4dHVyZTogcHVibGljIFRleHR1cmUgeworICAgIFNoYWRvd1RleHR1cmUoKTogVGV4dHVyZSgpIHsKKyAgICB9CisKKyAgICBmbG9hdCBsZWZ0OworICAgIGZsb2F0IHRvcDsKK307IC8vIHN0cnVjdCBTaGFkb3dUZXh0dXJlCisKK2NsYXNzIFRleHREcm9wU2hhZG93Q2FjaGU6IHB1YmxpYyBPbkVudHJ5UmVtb3ZlZDxTaGFkb3dUZXh0LCBTaGFkb3dUZXh0dXJlKj4geworcHVibGljOgorICAgIFRleHREcm9wU2hhZG93Q2FjaGUoKTsKKyAgICBUZXh0RHJvcFNoYWRvd0NhY2hlKHVpbnQzMl90IG1heEJ5dGVTaXplKTsKKyAgICB+VGV4dERyb3BTaGFkb3dDYWNoZSgpOworCisgICAgLyoqCisgICAgICogVXNlZCBhcyBhIGNhbGxiYWNrIHdoZW4gYW4gZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKiBEbyBub3QgaW52b2tlIGRpcmVjdGx5LgorICAgICAqLworICAgIHZvaWQgb3BlcmF0b3IoKShTaGFkb3dUZXh0JiB0ZXh0LCBTaGFkb3dUZXh0dXJlKiYgdGV4dHVyZSk7CisKKyAgICBTaGFkb3dUZXh0dXJlKiBnZXQoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIqIHRleHQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgICAgIGludCBudW1HbHlwaHMsIHVpbnQzMl90IHJhZGl1cyk7CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIGNhY2hlLiBUaGlzIGNhdXNlcyBhbGwgdGV4dHVyZXMgdG8gYmUgZGVsZXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICB2b2lkIHNldEZvbnRSZW5kZXJlcihGb250UmVuZGVyZXImIGZvbnRSZW5kZXJlcikgeworICAgICAgICBtUmVuZGVyZXIgPSAmZm9udFJlbmRlcmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdm9pZCBzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0TWF4U2l6ZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0U2l6ZSgpOworCitwcml2YXRlOgorICAgIEdlbmVyYXRpb25DYWNoZTxTaGFkb3dUZXh0LCBTaGFkb3dUZXh0dXJlKj4gbUNhY2hlOworCisgICAgdWludDMyX3QgbVNpemU7CisgICAgdWludDMyX3QgbU1heFNpemU7CisgICAgRm9udFJlbmRlcmVyKiBtUmVuZGVyZXI7Cit9OyAvLyBjbGFzcyBUZXh0RHJvcFNoYWRvd0NhY2hlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9URVhUX0RST1BfU0hBRE9XX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9UZXh0dXJlLmggYi9saWJzL2h3dWkvVGV4dHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxN2YxNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvVGV4dHVyZS5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfVEVYVFVSRV9ICisjZGVmaW5lIEFORFJPSURfVUlfVEVYVFVSRV9ICisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvKioKKyAqIFJlcHJlc2VudHMgYW4gT3BlbkdMIHRleHR1cmUuCisgKi8KK3N0cnVjdCBUZXh0dXJlIHsKKyAgICBUZXh0dXJlKCkgeworICAgICAgICBjbGVhbnVwID0gZmFsc2U7CisgICAgICAgIGJpdG1hcFNpemUgPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHRleHR1cmUuCisgICAgICovCisgICAgR0x1aW50IGlkOworICAgIC8qKgorICAgICAqIEdlbmVyYXRpb24gb2YgdGhlIGJhY2tpbmcgYml0bWFwLAorICAgICAqLworICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRleHR1cmUgcmVxdWlyZXMgYmxlbmRpbmcuCisgICAgICovCisgICAgYm9vbCBibGVuZDsKKyAgICAvKioKKyAgICAgKiBXaWR0aCBvZiB0aGUgYmFja2luZyBiaXRtYXAuCisgICAgICovCisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgLyoqCisgICAgICogSGVpZ2h0IG9mIHRoZSBiYWNraW5nIGJpdG1hcC4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0ZXh0dXJlIHNob3VsZCBiZSBjbGVhbmVkIHVwIGFmdGVyIHVzZS4KKyAgICAgKi8KKyAgICBib29sIGNsZWFudXA7CisgICAgLyoqCisgICAgICogT3B0aW9uYWwsIHNpemUgb2YgdGhlIG9yaWdpbmFsIGJpdG1hcC4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBiaXRtYXBTaXplOworfTsgLy8gc3RydWN0IFRleHR1cmUKKworY2xhc3MgQXV0b1RleHR1cmUgeworcHVibGljOgorICAgIEF1dG9UZXh0dXJlKGNvbnN0IFRleHR1cmUqIHRleHR1cmUpOiBtVGV4dHVyZSh0ZXh0dXJlKSB7IH0KKyAgICB+QXV0b1RleHR1cmUoKSB7CisgICAgICAgIGlmIChtVGV4dHVyZSAmJiBtVGV4dHVyZS0+Y2xlYW51cCkgeworICAgICAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmbVRleHR1cmUtPmlkKTsKKyAgICAgICAgICAgIGRlbGV0ZSBtVGV4dHVyZTsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBUZXh0dXJlKiBtVGV4dHVyZTsKK307IC8vIGNsYXNzIEF1dG9UZXh0dXJlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9URVhUVVJFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9UZXh0dXJlQ2FjaGUuY3BwIGIvbGlicy9od3VpL1RleHR1cmVDYWNoZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAxZGY4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9UZXh0dXJlQ2FjaGUuY3BwCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8U2tDYW52YXMuaD4KKworI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworI2luY2x1ZGUgIlRleHR1cmVDYWNoZS5oIgorI2luY2x1ZGUgIlByb3BlcnRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitUZXh0dXJlQ2FjaGU6OlRleHR1cmVDYWNoZSgpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPFNrQml0bWFwKiwgVGV4dHVyZSo+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtU2l6ZSgwKSwgbU1heFNpemUoTUIoREVGQVVMVF9URVhUVVJFX0NBQ0hFX1NJWkUpKSB7CisgICAgY2hhciBwcm9wZXJ0eVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUEVSVFlfVEVYVFVSRV9DQUNIRV9TSVpFLCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyB0ZXh0dXJlIGNhY2hlIHNpemUgdG8gJXNNQiIsIHByb3BlcnR5KTsKKyAgICAgICAgc2V0TWF4U2l6ZShNQihhdG9mKHByb3BlcnR5KSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCB0ZXh0dXJlIGNhY2hlIHNpemUgb2YgJS4yZk1CIiwgREVGQVVMVF9URVhUVVJFX0NBQ0hFX1NJWkUpOworICAgIH0KKworICAgIGluaXQoKTsKK30KKworVGV4dHVyZUNhY2hlOjpUZXh0dXJlQ2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPFNrQml0bWFwKiwgVGV4dHVyZSo+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtU2l6ZSgwKSwgbU1heFNpemUobWF4Qnl0ZVNpemUpIHsKKyAgICBpbml0KCk7Cit9CisKK1RleHR1cmVDYWNoZTo6flRleHR1cmVDYWNoZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1DYWNoZS5jbGVhcigpOworfQorCit2b2lkIFRleHR1cmVDYWNoZTo6aW5pdCgpIHsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcih0aGlzKTsKKworICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX1RFWFRVUkVfU0laRSwgJm1NYXhUZXh0dXJlU2l6ZSk7CisgICAgTE9HRCgiICAgIE1heGltdW0gdGV4dHVyZSBkaW1lbnNpb24gaXMgJWQgcGl4ZWxzIiwgbU1heFRleHR1cmVTaXplKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2l6ZSBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VpbnQzMl90IFRleHR1cmVDYWNoZTo6Z2V0U2l6ZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtU2l6ZTsKK30KKwordWludDMyX3QgVGV4dHVyZUNhY2hlOjpnZXRNYXhTaXplKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1NYXhTaXplOworfQorCit2b2lkIFRleHR1cmVDYWNoZTo6c2V0TWF4U2l6ZSh1aW50MzJfdCBtYXhTaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtTWF4U2l6ZSA9IG1heFNpemU7CisgICAgd2hpbGUgKG1TaXplID4gbU1heFNpemUpIHsKKyAgICAgICAgbUNhY2hlLnJlbW92ZU9sZGVzdCgpOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FsbGJhY2tzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgVGV4dHVyZUNhY2hlOjpvcGVyYXRvcigpKFNrQml0bWFwKiYgYml0bWFwLCBUZXh0dXJlKiYgdGV4dHVyZSkgeworICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgYWxyZWFkeSBsb2NrZWQKKyAgICBpZiAodGV4dHVyZSkgeworICAgICAgICBtU2l6ZSAtPSB0ZXh0dXJlLT5iaXRtYXBTaXplOworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisgICAgICAgIGRlbGV0ZSB0ZXh0dXJlOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FjaGluZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitUZXh0dXJlKiBUZXh0dXJlQ2FjaGU6OmdldChTa0JpdG1hcCogYml0bWFwKSB7CisgICAgbUxvY2subG9jaygpOworICAgIFRleHR1cmUqIHRleHR1cmUgPSBtQ2FjaGUuZ2V0KGJpdG1hcCk7CisgICAgbUxvY2sudW5sb2NrKCk7CisKKyAgICBpZiAoIXRleHR1cmUpIHsKKyAgICAgICAgaWYgKGJpdG1hcC0+d2lkdGgoKSA+IG1NYXhUZXh0dXJlU2l6ZSB8fCBiaXRtYXAtPmhlaWdodCgpID4gbU1heFRleHR1cmVTaXplKSB7CisgICAgICAgICAgICBMT0dXKCJCaXRtYXAgdG9vIGxhcmdlIHRvIGJlIHVwbG9hZGVkIGludG8gYSB0ZXh0dXJlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSBiaXRtYXAtPnJvd0J5dGVzKCkgKiBiaXRtYXAtPmhlaWdodCgpOworICAgICAgICAvLyBEb24ndCBldmVuIHRyeSB0byBjYWNoZSBhIGJpdG1hcCB0aGF0J3MgYmlnZ2VyIHRoYW4gdGhlIGNhY2hlCisgICAgICAgIGlmIChzaXplIDwgbU1heFNpemUpIHsKKyAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgIHdoaWxlIChtU2l6ZSArIHNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICAgICAgICAgIG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICB9CisKKyAgICAgICAgdGV4dHVyZSA9IG5ldyBUZXh0dXJlOworICAgICAgICB0ZXh0dXJlLT5iaXRtYXBTaXplID0gc2l6ZTsKKyAgICAgICAgZ2VuZXJhdGVUZXh0dXJlKGJpdG1hcCwgdGV4dHVyZSwgZmFsc2UpOworCisgICAgICAgIGlmIChzaXplIDwgbU1heFNpemUpIHsKKyAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgIG1TaXplICs9IHNpemU7CisgICAgICAgICAgICBtQ2FjaGUucHV0KGJpdG1hcCwgdGV4dHVyZSk7CisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRleHR1cmUtPmNsZWFudXAgPSB0cnVlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChiaXRtYXAtPmdldEdlbmVyYXRpb25JRCgpICE9IHRleHR1cmUtPmdlbmVyYXRpb24pIHsKKyAgICAgICAgZ2VuZXJhdGVUZXh0dXJlKGJpdG1hcCwgdGV4dHVyZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIHRleHR1cmU7Cit9CisKK3ZvaWQgVGV4dHVyZUNhY2hlOjpyZW1vdmUoU2tCaXRtYXAqIGJpdG1hcCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhY2hlLnJlbW92ZShiaXRtYXApOworfQorCit2b2lkIFRleHR1cmVDYWNoZTo6Y2xlYXIoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQ2FjaGUuY2xlYXIoKTsKK30KKwordm9pZCBUZXh0dXJlQ2FjaGU6OmdlbmVyYXRlVGV4dHVyZShTa0JpdG1hcCogYml0bWFwLCBUZXh0dXJlKiB0ZXh0dXJlLCBib29sIHJlZ2VuZXJhdGUpIHsKKyAgICBTa0F1dG9Mb2NrUGl4ZWxzIGFscCgqYml0bWFwKTsKKworICAgIGlmICghYml0bWFwLT5yZWFkeVRvRHJhdygpKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBnZW5lcmF0ZSB0ZXh0dXJlIGZyb20gYml0bWFwIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBib29sIHJlc2l6ZSA9ICFyZWdlbmVyYXRlIHx8IGJpdG1hcC0+d2lkdGgoKSAhPSBpbnQodGV4dHVyZS0+d2lkdGgpIHx8CisgICAgICAgICAgICBiaXRtYXAtPmhlaWdodCgpICE9IGludCh0ZXh0dXJlLT5oZWlnaHQpOworCisgICAgaWYgKCFyZWdlbmVyYXRlKSB7CisgICAgICAgIGdsR2VuVGV4dHVyZXMoMSwgJnRleHR1cmUtPmlkKTsKKyAgICB9CisKKyAgICB0ZXh0dXJlLT5nZW5lcmF0aW9uID0gYml0bWFwLT5nZXRHZW5lcmF0aW9uSUQoKTsKKyAgICB0ZXh0dXJlLT53aWR0aCA9IGJpdG1hcC0+d2lkdGgoKTsKKyAgICB0ZXh0dXJlLT5oZWlnaHQgPSBiaXRtYXAtPmhlaWdodCgpOworCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlLT5pZCk7CisgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCBiaXRtYXAtPmJ5dGVzUGVyUGl4ZWwoKSk7CisKKyAgICBzd2l0Y2ggKGJpdG1hcC0+Z2V0Q29uZmlnKCkpIHsKKyAgICBjYXNlIFNrQml0bWFwOjprQThfQ29uZmlnOgorICAgICAgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDEpOworICAgICAgICB1cGxvYWRUb1RleHR1cmUocmVzaXplLCBHTF9BTFBIQSwgYml0bWFwLT5yb3dCeXRlc0FzUGl4ZWxzKCksIHRleHR1cmUtPmhlaWdodCwKKyAgICAgICAgICAgICAgICBHTF9VTlNJR05FRF9CWVRFLCBiaXRtYXAtPmdldFBpeGVscygpKTsKKyAgICAgICAgdGV4dHVyZS0+YmxlbmQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNrQml0bWFwOjprUkdCXzU2NV9Db25maWc6CisgICAgICAgIHVwbG9hZFRvVGV4dHVyZShyZXNpemUsIEdMX1JHQiwgYml0bWFwLT5yb3dCeXRlc0FzUGl4ZWxzKCksIHRleHR1cmUtPmhlaWdodCwKKyAgICAgICAgICAgICAgICBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgYml0bWFwLT5nZXRQaXhlbHMoKSk7CisgICAgICAgIHRleHR1cmUtPmJsZW5kID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2tCaXRtYXA6OmtBUkdCXzg4ODhfQ29uZmlnOgorICAgICAgICB1cGxvYWRUb1RleHR1cmUocmVzaXplLCBHTF9SR0JBLCBiaXRtYXAtPnJvd0J5dGVzQXNQaXhlbHMoKSwgdGV4dHVyZS0+aGVpZ2h0LAorICAgICAgICAgICAgICAgIEdMX1VOU0lHTkVEX0JZVEUsIGJpdG1hcC0+Z2V0UGl4ZWxzKCkpOworICAgICAgICAvLyBEbyB0aGlzIGFmdGVyIGNhbGxpbmcgZ2V0UGl4ZWxzKCkgdG8gbWFrZSBzdXJlIFNraWEncyBkZWZlcnJlZAorICAgICAgICAvLyBkZWNvZGluZyBoYXBwZW5lZAorICAgICAgICB0ZXh0dXJlLT5ibGVuZCA9ICFiaXRtYXAtPmlzT3BhcXVlKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2tCaXRtYXA6OmtJbmRleDhfQ29uZmlnOgorICAgICAgICB1cGxvYWRQYWxldHRlZFRleHR1cmUocmVzaXplLCBiaXRtYXAsIHRleHR1cmUtPndpZHRoLCB0ZXh0dXJlLT5oZWlnaHQpOworICAgICAgICB0ZXh0dXJlLT5ibGVuZCA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dXKCJVbnN1cHBvcnRlZCBiaXRtYXAgY29uZmlnOiAlZCIsIGJpdG1hcC0+Z2V0Q29uZmlnKCkpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7Cit9CisKK3ZvaWQgVGV4dHVyZUNhY2hlOjp1cGxvYWRQYWxldHRlZFRleHR1cmUoYm9vbCByZXNpemUsIFNrQml0bWFwKiBiaXRtYXAsCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICBTa0JpdG1hcCByZ2JhQml0bWFwOworICAgIHJnYmFCaXRtYXAuc2V0Q29uZmlnKFNrQml0bWFwOjprQVJHQl84ODg4X0NvbmZpZywgd2lkdGgsIGhlaWdodCk7CisgICAgcmdiYUJpdG1hcC5hbGxvY1BpeGVscygpOworICAgIHJnYmFCaXRtYXAuZXJhc2VDb2xvcigwKTsKKworICAgIFNrQ2FudmFzIGNhbnZhcyhyZ2JhQml0bWFwKTsKKyAgICBjYW52YXMuZHJhd0JpdG1hcCgqYml0bWFwLCAwLjBmLCAwLjBmLCBOVUxMKTsKKworICAgIHVwbG9hZFRvVGV4dHVyZShyZXNpemUsIEdMX1JHQkEsIHJnYmFCaXRtYXAucm93Qnl0ZXNBc1BpeGVscygpLCBoZWlnaHQsCisgICAgICAgICAgICBHTF9VTlNJR05FRF9CWVRFLCByZ2JhQml0bWFwLmdldFBpeGVscygpKTsKK30KKwordm9pZCBUZXh0dXJlQ2FjaGU6OnVwbG9hZFRvVGV4dHVyZShib29sIHJlc2l6ZSwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKiBkYXRhKSB7CisgICAgaWYgKHJlc2l6ZSkgeworICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCAwLCBmb3JtYXQsIHR5cGUsIGRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsVGV4U3ViSW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIGRhdGEpOworICAgIH0KK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmggYi9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRjNTQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9UZXh0dXJlQ2FjaGUuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9URVhUVVJFX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9URVhUVVJFX0NBQ0hFX0gKKworI2luY2x1ZGUgPFNrQml0bWFwLmg+CisKKyNpbmNsdWRlICJUZXh0dXJlLmgiCisjaW5jbHVkZSAiR2VuZXJhdGlvbkNhY2hlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLyoqCisgKiBBIHNpbXBsZSBMUlUgdGV4dHVyZSBjYWNoZS4gVGhlIGNhY2hlIGhhcyBhIG1heGltdW0gc2l6ZSBleHByZXNzZWQgaW4gYnl0ZXMuCisgKiBBbnkgdGV4dHVyZSBhZGRlZCB0byB0aGUgY2FjaGUgY2F1c2luZyB0aGUgY2FjaGUgdG8gZ3JvdyBiZXlvbmQgdGhlIG1heGltdW0KKyAqIGFsbG93ZWQgc2l6ZSB3aWxsIGFsc28gY2F1c2UgdGhlIG9sZGVzdCB0ZXh0dXJlIHRvIGJlIGtpY2tlZCBvdXQuCisgKi8KK2NsYXNzIFRleHR1cmVDYWNoZTogcHVibGljIE9uRW50cnlSZW1vdmVkPFNrQml0bWFwKiwgVGV4dHVyZSo+IHsKK3B1YmxpYzoKKyAgICBUZXh0dXJlQ2FjaGUoKTsKKyAgICBUZXh0dXJlQ2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOworICAgIH5UZXh0dXJlQ2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoU2tCaXRtYXAqJiBiaXRtYXAsIFRleHR1cmUqJiB0ZXh0dXJlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRleHR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgYml0bWFwLiBJZiB0aGUgdGV4dHVyZQorICAgICAqIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgY2FjaGUsIGEgbmV3IHRleHR1cmUgaXMgZ2VuZXJhdGVkLgorICAgICAqLworICAgIFRleHR1cmUqIGdldChTa0JpdG1hcCogYml0bWFwKTsKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSB0ZXh0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGJpdG1hcC4gUmV0dXJucyBOVUxMCisgICAgICogaWYgdGhlIHRleHR1cmUgY2Fubm90IGJlIGZvdW5kLiBVcG9uIHJlbW92ZSB0aGUgdGV4dHVyZSBpcyBmcmVlZC4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZShTa0JpdG1hcCogYml0bWFwKTsKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIGNhY2hlLiBUaGlzIGNhdXNlcyBhbGwgdGV4dHVyZXMgdG8gYmUgZGVsZXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHZvaWQgc2V0TWF4U2l6ZSh1aW50MzJfdCBtYXhTaXplKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldE1heFNpemUoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldFNpemUoKTsKKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIHRleHR1cmUgZnJvbSBhIGJpdG1hcCBpbnRvIHRoZSBzcGVjaWZpZWQgdGV4dHVyZSBzdHJ1Y3R1cmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVnZW5lcmF0ZSBJZiB0cnVlLCB0aGUgYml0bWFwIGRhdGEgaXMgcmV1cGxvYWRlZCBpbnRvIHRoZSB0ZXh0dXJlLCBidXQKKyAgICAgKiAgICAgICAgbm8gbmV3IHRleHR1cmUgaXMgZ2VuZXJhdGVkLgorICAgICAqLworICAgIHZvaWQgZ2VuZXJhdGVUZXh0dXJlKFNrQml0bWFwKiBiaXRtYXAsIFRleHR1cmUqIHRleHR1cmUsIGJvb2wgcmVnZW5lcmF0ZSA9IGZhbHNlKTsKKworICAgIHZvaWQgdXBsb2FkUGFsZXR0ZWRUZXh0dXJlKGJvb2wgcmVzaXplLCBTa0JpdG1hcCogYml0bWFwLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KTsKKyAgICB2b2lkIHVwbG9hZFRvVGV4dHVyZShib29sIHJlc2l6ZSwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICogZGF0YSk7CisKKyAgICB2b2lkIGluaXQoKTsKKworICAgIEdlbmVyYXRpb25DYWNoZTxTa0JpdG1hcCosIFRleHR1cmUqPiBtQ2FjaGU7CisKKyAgICB1aW50MzJfdCBtU2l6ZTsKKyAgICB1aW50MzJfdCBtTWF4U2l6ZTsKKyAgICBHTGludCBtTWF4VGV4dHVyZVNpemU7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGFjY2VzcyBtQ2FjaGUgYW5kIG1TaXplLiBBbGwgbWV0aG9kcyBhcmUgYWNjZXNzZWQgZnJvbSBhIHNpbmdsZQorICAgICAqIHRocmVhZCBleGNlcHQgZm9yIHJlbW92ZSgpLgorICAgICAqLworICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Cit9OyAvLyBjbGFzcyBUZXh0dXJlQ2FjaGUKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1RFWFRVUkVfQ0FDSEVfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1ZlcnRleC5oIGIvbGlicy9od3VpL1ZlcnRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNTQwODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvVmVydGV4LmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9WRVJURVhfSAorI2RlZmluZSBBTkRST0lEX1VJX1ZFUlRFWF9ICisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLyoqCisgKiBTaW1wbGUgc3RydWN0dXJlIHRvIGRlc2NyaWJlIGEgdmVydGV4IHdpdGggYSBwb3NpdGlvbiBhbmQgYSB0ZXh0dXJlLgorICovCitzdHJ1Y3QgVGV4dHVyZVZlcnRleCB7CisgICAgZmxvYXQgcG9zaXRpb25bMl07CisgICAgZmxvYXQgdGV4dHVyZVsyXTsKKworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXQoVGV4dHVyZVZlcnRleCogdmVydGV4LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB1LCBmbG9hdCB2KSB7CisgICAgICAgIHZlcnRleFswXS5wb3NpdGlvblswXSA9IHg7CisgICAgICAgIHZlcnRleFswXS5wb3NpdGlvblsxXSA9IHk7CisgICAgICAgIHZlcnRleFswXS50ZXh0dXJlWzBdID0gdTsKKyAgICAgICAgdmVydGV4WzBdLnRleHR1cmVbMV0gPSB2OworICAgIH0KKworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRVVihUZXh0dXJlVmVydGV4KiB2ZXJ0ZXgsIGZsb2F0IHUsIGZsb2F0IHYpIHsKKyAgICAgICAgdmVydGV4WzBdLnRleHR1cmVbMF0gPSB1OworICAgICAgICB2ZXJ0ZXhbMF0udGV4dHVyZVsxXSA9IHY7CisgICAgfQorfTsgLy8gc3RydWN0IFRleHR1cmVWZXJ0ZXgKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1ZFUlRFWF9ICmRpZmYgLS1naXQgYS9saWJzL3JzL0FuZHJvaWQubWsgYi9saWJzL3JzL0FuZHJvaWQubWsKaW5kZXggOTg0NjRhMC4uMDVjMWE0OCAxMDA2NDQKLS0tIGEvbGlicy9ycy9BbmRyb2lkLm1rCisrKyBiL2xpYnMvcnMvQW5kcm9pZC5tawpAQCAtNzYsMzQgKzc2LDQzIEBACiBMT0NBTF9TUkNfRklMRVM6PSBcCiAJcnNBZGFwdGVyLmNwcCBcCiAJcnNBbGxvY2F0aW9uLmNwcCBcCisJcnNBbmltYXRpb24uY3BwIFwKIAlyc0NvbXBvbmVudC5jcHAgXAogCXJzQ29udGV4dC5jcHAgXAogCXJzRGV2aWNlLmNwcCBcCiAJcnNFbGVtZW50LmNwcCBcCi0gICAgICAgIHJzRmlsZUEzRC5jcHAgXAotCXJzTGlnaHQuY3BwIFwKKwlyc0ZpbGVBM0QuY3BwIFwKKwlyc0ZvbnQuY3BwIFwKIAlyc0xvY2tsZXNzRmlmby5jcHAgXAogCXJzT2JqZWN0QmFzZS5jcHAgXAogCXJzTWF0cml4LmNwcCBcCi0gICAgICAgIHJzTWVzaC5jcHAgXAotCXJzTm9pc2UuY3BwIFwKKwlyc01lc2guY3BwIFwKKwlyc011dGV4LmNwcCBcCiAJcnNQcm9ncmFtLmNwcCBcCiAJcnNQcm9ncmFtRnJhZ21lbnQuY3BwIFwKLQlyc1Byb2dyYW1GcmFnbWVudFN0b3JlLmNwcCBcCisJcnNQcm9ncmFtU3RvcmUuY3BwIFwKIAlyc1Byb2dyYW1SYXN0ZXIuY3BwIFwKIAlyc1Byb2dyYW1WZXJ0ZXguY3BwIFwKIAlyc1NhbXBsZXIuY3BwIFwKIAlyc1NjcmlwdC5jcHAgXAogCXJzU2NyaXB0Qy5jcHAgXAogCXJzU2NyaXB0Q19MaWIuY3BwIFwKLSAgICAgICAgcnNTaGFkZXJDYWNoZS5jcHAgXAotCXJzU2ltcGxlTWVzaC5jcHAgXAorCXJzU2NyaXB0Q19MaWJDTC5jcHAgXAorCXJzU2NyaXB0Q19MaWJHTC5jcHAgXAorCXJzU2hhZGVyQ2FjaGUuY3BwIFwKKwlyc1NpZ25hbC5jcHAgXAorCXJzU3RyZWFtLmNwcCBcCiAJcnNUaHJlYWRJTy5jcHAgXAogCXJzVHlwZS5jcHAgXAogCXJzVmVydGV4QXJyYXkuY3BwCiAKIAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJjdXRpbHMgbGlidXRpbHMgbGliRUdMIGxpYkdMRVN2MV9DTSBsaWJHTEVTdjIgbGlidWkgbGliYWNjCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmN1dGlscyBsaWJ1dGlscyBsaWJFR0wgbGliR0xFU3YxX0NNIGxpYkdMRVN2MiBsaWJ1aSBsaWJiY2MKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJmdDIKKworTE9DQUxfQ19JTkNMVURFUyArPSBleHRlcm5hbC9mcmVldHlwZS9pbmNsdWRlCisKIExPQ0FMX0xETElCUyA6PSAtbHB0aHJlYWQgLWxkbAogTE9DQUxfTU9EVUxFOj0gbGliUlMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCmRpZmYgLS1naXQgYS9saWJzL3JzL1JlbmRlclNjcmlwdC5oIGIvbGlicy9ycy9SZW5kZXJTY3JpcHQuaAppbmRleCBkMjgwZjUwLi42NmUyN2YzIDEwMDY0NAotLS0gYS9saWJzL3JzL1JlbmRlclNjcmlwdC5oCisrKyBiL2xpYnMvcnMvUmVuZGVyU2NyaXB0LmgKQEAgLTMwLDIwICszMCwyMiBAQAogdHlwZWRlZiB2b2lkICogUnNBZGFwdGVyMUQ7CiB0eXBlZGVmIHZvaWQgKiBSc0FkYXB0ZXIyRDsKIHR5cGVkZWYgdm9pZCAqIFJzQWxsb2NhdGlvbjsKK3R5cGVkZWYgdm9pZCAqIFJzQW5pbWF0aW9uOwogdHlwZWRlZiB2b2lkICogUnNDb250ZXh0OwogdHlwZWRlZiB2b2lkICogUnNEZXZpY2U7CiB0eXBlZGVmIHZvaWQgKiBSc0VsZW1lbnQ7CiB0eXBlZGVmIHZvaWQgKiBSc0ZpbGU7Cit0eXBlZGVmIHZvaWQgKiBSc0ZvbnQ7CiB0eXBlZGVmIHZvaWQgKiBSc1NhbXBsZXI7CiB0eXBlZGVmIHZvaWQgKiBSc1NjcmlwdDsKLXR5cGVkZWYgdm9pZCAqIFJzU2ltcGxlTWVzaDsKK3R5cGVkZWYgdm9pZCAqIFJzTWVzaDsKIHR5cGVkZWYgdm9pZCAqIFJzVHlwZTsKLXR5cGVkZWYgdm9pZCAqIFJzTGlnaHQ7Cit0eXBlZGVmIHZvaWQgKiBSc09iamVjdEJhc2U7CiAKIHR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbTsKIHR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbVZlcnRleDsKIHR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbUZyYWdtZW50OwotdHlwZWRlZiB2b2lkICogUnNQcm9ncmFtRnJhZ21lbnRTdG9yZTsKK3R5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbVN0b3JlOwogdHlwZWRlZiB2b2lkICogUnNQcm9ncmFtUmFzdGVyOwogCiB0eXBlZGVmIHZvaWQgKCogUnNCaXRtYXBDYWxsYmFja190KSh2b2lkICopOwpAQCAtNjAsNyArNjIsNiBAQAogUnNDb250ZXh0IHJzQ29udGV4dENyZWF0ZShSc0RldmljZSwgdWludDMyX3QgdmVyc2lvbik7CiBSc0NvbnRleHQgcnNDb250ZXh0Q3JlYXRlR0woUnNEZXZpY2UsIHVpbnQzMl90IHZlcnNpb24sIGJvb2wgdXNlRGVwdGgpOwogdm9pZCByc0NvbnRleHREZXN0cm95KFJzQ29udGV4dCk7Ci12b2lkIHJzT2JqRGVzdHJveU9PQihSc0NvbnRleHQsIHZvaWQgKik7CiAKIHVpbnQzMl90IHJzQ29udGV4dEdldE1lc3NhZ2UoUnNDb250ZXh0LCB2b2lkICpkYXRhLCBzaXplX3QgKnJlY2VpdmVMZW4sIHNpemVfdCBidWZmZXJMZW4sIGJvb2wgd2FpdCk7CiB2b2lkIHJzQ29udGV4dEluaXRUb0NsaWVudChSc0NvbnRleHQpOwpAQCAtODMsMTEgKzg0LDE3IEBACiAgICAgUlNfVFlQRV9VTlNJR05FRF8zMiwKICAgICBSU19UWVBFX1VOU0lHTkVEXzY0LAogCisgICAgUlNfVFlQRV9CT09MRUFOLAorCiAgICAgUlNfVFlQRV9VTlNJR05FRF81XzZfNSwKICAgICBSU19UWVBFX1VOU0lHTkVEXzVfNV81XzEsCiAgICAgUlNfVFlQRV9VTlNJR05FRF80XzRfNF80LAogCi0gICAgUlNfVFlQRV9FTEVNRU5ULAorICAgIFJTX1RZUEVfTUFUUklYXzRYNCwKKyAgICBSU19UWVBFX01BVFJJWF8zWDMsCisgICAgUlNfVFlQRV9NQVRSSVhfMlgyLAorCisgICAgUlNfVFlQRV9FTEVNRU5UID0gMTAwMCwKICAgICBSU19UWVBFX1RZUEUsCiAgICAgUlNfVFlQRV9BTExPQ0FUSU9OLAogICAgIFJTX1RZUEVfU0FNUExFUiwKQEAgLTk2LDI0ICsxMDMsMTcgQEAKICAgICBSU19UWVBFX1BST0dSQU1fRlJBR01FTlQsCiAgICAgUlNfVFlQRV9QUk9HUkFNX1ZFUlRFWCwKICAgICBSU19UWVBFX1BST0dSQU1fUkFTVEVSLAotICAgIFJTX1RZUEVfUFJPR1JBTV9TVE9SRQorICAgIFJTX1RZUEVfUFJPR1JBTV9TVE9SRSwKIH07CiAKIGVudW0gUnNEYXRhS2luZCB7CiAgICAgUlNfS0lORF9VU0VSLAotICAgIFJTX0tJTkRfQ09MT1IsCi0gICAgUlNfS0lORF9QT1NJVElPTiwKLSAgICBSU19LSU5EX1RFWFRVUkUsCi0gICAgUlNfS0lORF9OT1JNQUwsCi0gICAgUlNfS0lORF9JTkRFWCwKLSAgICBSU19LSU5EX1BPSU5UX1NJWkUsCiAKLSAgICBSU19LSU5EX1BJWEVMX0wsCisgICAgUlNfS0lORF9QSVhFTF9MID0gNywKICAgICBSU19LSU5EX1BJWEVMX0EsCiAgICAgUlNfS0lORF9QSVhFTF9MQSwKICAgICBSU19LSU5EX1BJWEVMX1JHQiwKICAgICBSU19LSU5EX1BJWEVMX1JHQkEsCi0KIH07CiAKIGVudW0gUnNTYW1wbGVyUGFyYW0gewpAQCAtMTIxLDcgKzEyMSw4IEBACiAgICAgUlNfU0FNUExFUl9NQUdfRklMVEVSLAogICAgIFJTX1NBTVBMRVJfV1JBUF9TLAogICAgIFJTX1NBTVBMRVJfV1JBUF9ULAotICAgIFJTX1NBTVBMRVJfV1JBUF9SCisgICAgUlNfU0FNUExFUl9XUkFQX1IsCisgICAgUlNfU0FNUExFUl9BTklTTwogfTsKIAogZW51bSBSc1NhbXBsZXJWYWx1ZSB7CkBAIC0yMDUsOSArMjA2LDcwIEBACiBlbnVtIFJzRXJyb3IgewogICAgIFJTX0VSUk9SX05PTkUsCiAgICAgUlNfRVJST1JfQkFEX1NIQURFUiwKLSAgICBSU19FUlJPUl9CQURfU0NSSVBUCisgICAgUlNfRVJST1JfQkFEX1NDUklQVCwKKyAgICBSU19FUlJPUl9CQURfVkFMVUUsCisgICAgUlNfRVJST1JfT1VUX09GX01FTU9SWQogfTsKIAorZW51bSBSc0FuaW1hdGlvbkludGVycG9sYXRpb24geworICAgIFJTX0FOSU1BVElPTl9JTlRFUlBPTEFUSU9OX1NURVAsCisgICAgUlNfQU5JTUFUSU9OX0lOVEVSUE9MQVRJT05fTElORUFSLAorICAgIFJTX0FOSU1BVElPTl9JTlRFUlBPTEFUSU9OX0JFWklFUiwKKyAgICBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9DQVJESU5BTCwKKyAgICBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9IRVJNSVRFLAorICAgIFJTX0FOSU1BVElPTl9JTlRFUlBPTEFUSU9OX0JTUExJTkUKK307CisKK2VudW0gUnNBbmltYXRpb25FZGdlIHsKKyAgICBSU19BTklNQVRJT05fRURHRV9VTkRFRklORUQsCisgICAgUlNfQU5JTUFUSU9OX0VER0VfQ09OU1RBTlQsCisgICAgUlNfQU5JTUFUSU9OX0VER0VfR1JBRElFTlQsCisgICAgUlNfQU5JTUFUSU9OX0VER0VfQ1lDTEUsCisgICAgUlNfQU5JTUFUSU9OX0VER0VfT1NDSUxMQVRFLAorICAgIFJTX0FOSU1BVElPTl9FREdFX0NZTEVfUkVMQVRJVkUKK307CisKK2VudW0gUnNBM0RDbGFzc0lEIHsKKyAgICBSU19BM0RfQ0xBU1NfSURfVU5LTk9XTiwKKyAgICBSU19BM0RfQ0xBU1NfSURfTUVTSCwKKyAgICBSU19BM0RfQ0xBU1NfSURfVFlQRSwKKyAgICBSU19BM0RfQ0xBU1NfSURfRUxFTUVOVCwKKyAgICBSU19BM0RfQ0xBU1NfSURfQUxMT0NBVElPTiwKKyAgICBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9WRVJURVgsCisgICAgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fUkFTVEVSLAorICAgIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX0ZSQUdNRU5ULAorICAgIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1NUT1JFLAorICAgIFJTX0EzRF9DTEFTU19JRF9TQU1QTEVSLAorICAgIFJTX0EzRF9DTEFTU19JRF9BTklNQVRJT04sCisgICAgUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMUQsCisgICAgUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMkQsCisgICAgUlNfQTNEX0NMQVNTX0lEX1NDUklQVF9DCit9OworCitlbnVtIFJzQ3VsbE1vZGUgeworICAgIFJTX0NVTExfQkFDSywKKyAgICBSU19DVUxMX0ZST05ULAorICAgIFJTX0NVTExfTk9ORQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFJzQTNEQ2xhc3NJRCBjbGFzc0lEOworICAgIGNvbnN0IGNoYXIqIG9iamVjdE5hbWU7Cit9IFJzRmlsZUluZGV4RW50cnk7CisKKy8vIFNjcmlwdCB0byBTY3JpcHQKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCB4U3RhcnQ7CisgICAgdWludDMyX3QgeEVuZDsKKyAgICB1aW50MzJfdCB5U3RhcnQ7CisgICAgdWludDMyX3QgeUVuZDsKKyAgICB1aW50MzJfdCB6U3RhcnQ7CisgICAgdWludDMyX3QgekVuZDsKKyAgICB1aW50MzJfdCBhcnJheVN0YXJ0OworICAgIHVpbnQzMl90IGFycmF5RW5kOworCit9IFJzU2NyaXB0Q2FsbDsKKwogI2lmbmRlZiBOT19SU19GVU5DUwogI2luY2x1ZGUgInJzZ0FwaUZ1bmNEZWNsLmgiCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvUmVuZGVyU2NyaXB0RW52LmggYi9saWJzL3JzL1JlbmRlclNjcmlwdEVudi5oCmluZGV4IDk5YjhjMDQuLmI4MmVhZjEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvUmVuZGVyU2NyaXB0RW52LmgKKysrIGIvbGlicy9ycy9SZW5kZXJTY3JpcHRFbnYuaApAQCAtOSwxMiArOSwxMCBAQAogdHlwZWRlZiB2b2lkICogUnNFbGVtZW50OwogdHlwZWRlZiB2b2lkICogUnNTYW1wbGVyOwogdHlwZWRlZiB2b2lkICogUnNTY3JpcHQ7Ci10eXBlZGVmIHZvaWQgKiBSc1NpbXBsZU1lc2g7Cit0eXBlZGVmIHZvaWQgKiBSc01lc2g7CiB0eXBlZGVmIHZvaWQgKiBSc1R5cGU7CiB0eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1GcmFnbWVudDsKLXR5cGVkZWYgdm9pZCAqIFJzUHJvZ3JhbUZyYWdtZW50U3RvcmU7Ci10eXBlZGVmIHZvaWQgKiBSc0xpZ2h0OwotCit0eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1TdG9yZTsKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIGZsb2F0IG1bMTZdOwpAQCAtMjgsNCArMjYsNCBAQAogI2RlZmluZSBSU19QUk9HUkFNX1ZFUlRFWF9NT0RFTFZJRVdfT0ZGU0VUIDAKICNkZWZpbmUgUlNfUFJPR1JBTV9WRVJURVhfUFJPSkVDVElPTl9PRkZTRVQgMTYKICNkZWZpbmUgUlNfUFJPR1JBTV9WRVJURVhfVEVYVFVSRV9PRkZTRVQgMzIKLQorI2RlZmluZSBSU19QUk9HUkFNX1ZFUlRFWF9NVlBfT0ZGU0VUIDQ4CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9BbmRyb2lkLm1rIGIvbGlicy9ycy9qYXZhL0ZpbG0vQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU2ZWQ3ZS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKLSNMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC5yZW5kZXJzY3JpcHQKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEZpbG0KLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvbGlicy9ycy9qYXZhL0ZpbG0vQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjZThhMS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iY29tLmFuZHJvaWQuZmlsbSI+Ci0gICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkZpbG0iPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJGaWxtIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5CbGFjay5Ob1RpdGxlQmFyIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLSAgICA8L2FwcGxpY2F0aW9uPgotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDEucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YjliZGIuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAyLnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTYyYzgyLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMy5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNlMjZjMC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDQucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZWU2MDMuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA1LnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWM1MjQ4Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNi5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I1MTI2MS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDcucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YmQ5MzguLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA4LnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjE3NWU4Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwOS5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmMzg3NC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTAucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwODgyN2QuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDExLnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjg5ZjcxLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMi5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFhZjE2YS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTMucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwOGJjYmUuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvcmF3L2ZpbG1pbWFnZS5jIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL3Jhdy9maWxtaW1hZ2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1NGM2OC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvcmF3L2ZpbG1pbWFnZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vIEZvdW50YWluIHRlc3Qgc2NyaXB0Ci0KLSNwcmFnbWEgdmVyc2lvbigxKQotI3ByYWdtYSBzdGF0ZVZlcnRleChvcnRob1dpbmRvdykKLSNwcmFnbWEgc3RhdGVSYXN0ZXIoZmxhdCkKLSNwcmFnbWEgc3RhdGVGcmFnbWVudChQZ21GcmFnQmFja2dyb3VuZCkKLSNwcmFnbWEgc3RhdGVTdG9yZShNeUJsZW5kKQotCi0KLWludCBtYWluKHZvaWQqIGNvbiwgaW50IGZ0LCBpbnQgbGF1bmNoSUQpIHsKLSAgICBpbnQgY291bnQsIHRvdWNoLCB4LCB5LCByYXRlLCBtYXhMaWZlLCBsaWZlU2hpZnQ7Ci0gICAgaW50IGxpZmU7Ci0gICAgaW50IGN0LCBjdDI7Ci0gICAgaW50IG5ld1BhcnQ7Ci0gICAgaW50IGRyYXdDb3VudDsKLSAgICBpbnQgZHgsIGR5LCBpZHg7Ci0gICAgaW50IHBvc3gscG9zeTsKLSAgICBpbnQgYzsKLSAgICBpbnQgc3JjSWR4OwotICAgIGludCBkc3RJZHg7Ci0KLSAgICBjb3VudCA9IGxvYWRJMzIoY29uLCAwLCAxKTsKLSAgICB0b3VjaCA9IGxvYWRJMzIoY29uLCAwLCAyKTsKLSAgICB4ID0gbG9hZEkzMihjb24sIDAsIDMpOwotICAgIHkgPSBsb2FkSTMyKGNvbiwgMCwgNCk7Ci0KLSAgICByYXRlID0gNDsKLSAgICBtYXhMaWZlID0gKGNvdW50IC8gcmF0ZSkgLSAxOwotICAgIGxpZmVTaGlmdCA9IDA7Ci0gICAgewotICAgICAgICBsaWZlID0gbWF4TGlmZTsKLSAgICAgICAgd2hpbGUgKGxpZmUgPiAyNTUpIHsKLSAgICAgICAgICAgIGxpZmUgPSBsaWZlID4+IDE7Ci0gICAgICAgICAgICBsaWZlU2hpZnQgKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkcmF3UmVjdChjb24sIDAsIDI1NiwgMCwgNTEyKTsKLSAgICBjb250ZXh0QmluZFByb2dyYW1GcmFnbWVudChjb24sIE5BTUVEX1BnbUZyYWdQYXJ0cyk7Ci0KLSAgICBpZiAodG91Y2gpIHsKLSAgICAgICAgbmV3UGFydCA9IGxvYWRJMzIoY29uLCAyLCAwKTsKLSAgICAgICAgZm9yIChjdDI9MDsgY3QyPHJhdGU7IGN0MisrKSB7Ci0gICAgICAgICAgICBkeCA9IHNjcmlwdFJhbmQoY29uLCAweDEwMDAwKSAtIDB4ODAwMDsKLSAgICAgICAgICAgIGR5ID0gc2NyaXB0UmFuZChjb24sIDB4MTAwMDApIC0gMHg4MDAwOwotCi0gICAgICAgICAgICBpZHggPSBuZXdQYXJ0ICogNSArIDE7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIGlkeCwgZHgpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBpZHggKyAxLCBkeSk7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIGlkeCArIDIsIG1heExpZmUpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBpZHggKyAzLCB4IDw8IDE2KTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgaWR4ICsgNCwgeSA8PCAxNik7Ci0KLSAgICAgICAgICAgIG5ld1BhcnQrKzsKLSAgICAgICAgICAgIGlmIChuZXdQYXJ0ID49IGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgbmV3UGFydCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3RvcmVJMzIoY29uLCAyLCAwLCBuZXdQYXJ0KTsKLSAgICB9Ci0KLSAgICBkcmF3Q291bnQgPSAwOwotICAgIGZvciAoY3Q9MDsgY3QgPCBjb3VudDsgY3QrKykgewotICAgICAgICBzcmNJZHggPSBjdCAqIDUgKyAxOwotCi0gICAgICAgIGR4ID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCk7Ci0gICAgICAgIGR5ID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCArIDEpOwotICAgICAgICBsaWZlID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCArIDIpOwotICAgICAgICBwb3N4ID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCArIDMpOwotICAgICAgICBwb3N5ID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCArIDQpOwotCi0gICAgICAgIGlmIChsaWZlKSB7Ci0gICAgICAgICAgICBpZiAocG9zeSA8ICg0ODAgPDwgMTYpKSB7Ci0gICAgICAgICAgICAgICAgZHN0SWR4ID0gZHJhd0NvdW50ICogOTsKLSAgICAgICAgICAgICAgICBjID0gMHhmZmFmY2YgfCAoKGxpZmUgPj4gbGlmZVNoaWZ0KSA8PCAyNCk7Ci0KLSAgICAgICAgICAgICAgICBzdG9yZVUzMihjb24sIDEsIGRzdElkeCwgYyk7Ci0gICAgICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAxLCBkc3RJZHggKyAxLCBwb3N4KTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDIsIHBvc3kpOwotCi0gICAgICAgICAgICAgICAgc3RvcmVVMzIoY29uLCAxLCBkc3RJZHggKyAzLCBjKTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDQsIHBvc3ggKyAweDEwMDAwKTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDUsIHBvc3kgKyBkeSAqIDQpOwotCi0gICAgICAgICAgICAgICAgc3RvcmVVMzIoY29uLCAxLCBkc3RJZHggKyA2LCBjKTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDcsIHBvc3ggLSAweDEwMDAwKTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDgsIHBvc3kgKyBkeSAqIDQpOwotICAgICAgICAgICAgICAgIGRyYXdDb3VudCArKzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGR5ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBkeSA9ICgtZHkpID4+IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwb3N4ID0gcG9zeCArIGR4OwotICAgICAgICAgICAgcG9zeSA9IHBvc3kgKyBkeTsKLSAgICAgICAgICAgIGR5ID0gZHkgKyAweDQwMDsKLSAgICAgICAgICAgIGxpZmUgLS07Ci0KLSAgICAgICAgICAgIC8vc3RvcmVJMzIoY29uLCAyLCBzcmNJZHgsIGR4KTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgc3JjSWR4ICsgMSwgZHkpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBzcmNJZHggKyAyLCBsaWZlKTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgc3JjSWR4ICsgMywgcG9zeCk7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIHNyY0lkeCArIDQsIHBvc3kpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZHJhd1RyaWFuZ2xlQXJyYXkoY29uLCBOQU1FRF9QYXJ0QnVmZmVyLCBkcmF3Q291bnQpOwotICAgIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL3Jhdy9maWxtc3RyaXAuYyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9yYXcvZmlsbXN0cmlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNzU2NzUuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL3Jhdy9maWxtc3RyaXAuYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8vIEZvdW50YWluIHRlc3Qgc2NyaXB0Ci0KLSNwcmFnbWEgdmVyc2lvbigxKQotI3ByYWdtYSBzdGF0ZVZlcnRleChQVkJhY2tncm91bmQpCi0jcHJhZ21hIHN0YXRlRnJhZ21lbnQoUEZCYWNrZ3JvdW5kKQotI3ByYWdtYSBzdGF0ZVN0b3JlKFBTQmFja2dyb3VuZCkKLQotI2RlZmluZSBTVEFURV9UUklBTkdMRV9PRkZTRVRfQ09VTlQgMAotI2RlZmluZSBTVEFURV9MQVNUX0ZPQ1VTIDEKLQotCi0vLyBUaGUgc2NyaXB0IGVudmlyb21lbnQgaGFzIDMgZW52IGFsbG9jYXRpb25zLgotLy8gYmFuazA6IChyKSBUaGUgZW52aXJvbWVudCBzdHJ1Y3R1cmUKLS8vIGJhbmsxOiAocikgVGhlIHBvc2l0aW9uIGluZm9ybWF0aW9uCi0vLyBiYW5rMjogKHJ3KSBUaGUgdGVtcG9yYXJ5IHRleHR1cmUgc3RhdGUKLQotaW50IGxhc3RGb2N1czsKLQotaW50IG1haW4oaW50IGluZGV4KQotewotICAgIGZsb2F0IG1hdDFbMTZdOwotCi0gICAgZmxvYXQgdHJhbnMgPSBQb3MtPnRyYW5zbGF0ZTsKLSAgICBmbG9hdCByb3QgPSBQb3MtPnJvdGF0ZTsKLQotICAgIG1hdHJpeExvYWRTY2FsZShtYXQxLCAyLmYsIDIuZiwgMi5mKTsKLSAgICBtYXRyaXhUcmFuc2xhdGUobWF0MSwgMC5mLCAwLmYsIHRyYW5zKTsKLSAgICBtYXRyaXhSb3RhdGUobWF0MSwgOTAuZiwgMC5mLCAwLmYsIDEuZik7Ci0gICAgbWF0cml4Um90YXRlKG1hdDEsIHJvdCwgMS5mLCAwLmYsIDAuZik7Ci0gICAgdnBMb2FkTW9kZWxNYXRyaXgobWF0MSk7Ci0KLSAgICAvLyBEcmF3IHRoZSBsaWdodGluZyBlZmZlY3QgaW4gdGhlIHN0cmlwIGFuZCBmaWxsIHRoZSBaIGJ1ZmZlci4KLSAgICBkcmF3U2ltcGxlTWVzaChOQU1FRF9tZXNoKTsKLQotICAgIC8vIFN0YXJ0IG9mIGltYWdlcy4KLSAgICBiaW5kUHJvZ3JhbVN0b3JlKE5BTUVEX1BTSW1hZ2VzKTsKLSAgICBiaW5kUHJvZ3JhbUZyYWdtZW50KE5BTUVEX1BGSW1hZ2VzKTsKLSAgICBiaW5kUHJvZ3JhbVZlcnRleChOQU1FRF9QVkltYWdlcyk7Ci0KLSAgICBmbG9hdCBmb2N1c1BvcyA9IFBvcy0+Zm9jdXM7Ci0gICAgaW50IGZvY3VzSUQgPSAwOwotICAgIGludCBsYXN0Rm9jdXNJRCA9IGxvYWRJMzIoMiwgU1RBVEVfTEFTVF9GT0NVUyk7Ci0gICAgaW50IGltZ0NvdW50ID0gMTM7Ci0KLSAgICBpZiAodHJhbnMgPiAoLS4zZikpIHsKLSAgICAgICAgZm9jdXNJRCA9IC0xLjBmIC0gZm9jdXNQb3M7Ci0gICAgICAgIGlmIChmb2N1c0lEID49IGltZ0NvdW50KSB7Ci0gICAgICAgICAgICBmb2N1c0lEID0gLTE7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb2N1c0lEID0gLTE7Ci0gICAgfQotCi0gICAgLyoKLSAgICBpZiAoZm9jdXNJRCAhPSBsYXN0Rm9jdXNJRCkgewotICAgICAgICBpZiAobGFzdEZvY3VzSUQgPj0gMCkgewotICAgICAgICAgICAgdXBsb2FkVG9UZXh0dXJlKGNvbiwgZW52LT50ZXhbbGFzdEZvY3VzSURdLCAxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZm9jdXNJRCA+PSAwKSB7Ci0gICAgICAgICAgICB1cGxvYWRUb1RleHR1cmUoY29uLCBlbnYtPnRleFtmb2N1c0lEXSwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKi8KLSAgICBsYXN0Rm9jdXMgPSBmb2N1c0lEOwotCi0gICAgaW50IHRyaWFuZ2xlT2Zmc2V0c0NvdW50ID0gUG9zLT50cmlhbmdsZU9mZnNldENvdW50OwotCi0gICAgaW50IGltZ0lkID0gMDsKLSAgICBmb3IgKGltZ0lkPTE7IGltZ0lkIDw9IGltZ0NvdW50OyBpbWdJZCsrKSB7Ci0gICAgICAgIGZsb2F0IHBvcyA9IGZvY3VzUG9zICsgaW1nSWQgKyAwLjRmOwotICAgICAgICBpbnQgb2Zmc2V0ID0gKGludClmbG9vcmYocG9zICogMi5mKTsKLSAgICAgICAgcG9zID0gcG9zIC0gMC43NWY7Ci0KLSAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgdHJpYW5nbGVPZmZzZXRzQ291bnQgLyAyOwotICAgICAgICBpZiAoISgob2Zmc2V0IDwgMCkgfHwgKG9mZnNldCA+PSB0cmlhbmdsZU9mZnNldHNDb3VudCkpKSB7Ci0gICAgICAgICAgICBpbnQgc3RhcnQgPSBvZmZzZXQgLTI7Ci0gICAgICAgICAgICBpbnQgZW5kID0gb2Zmc2V0ICsgMjsKLQotICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewotICAgICAgICAgICAgICAgIHN0YXJ0ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbmQgPj0gdHJpYW5nbGVPZmZzZXRzQ291bnQpIHsKLSAgICAgICAgICAgICAgICBlbmQgPSB0cmlhbmdsZU9mZnNldHNDb3VudC0xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBiaW5kVGV4dHVyZShOQU1FRF9QRkltYWdlcywgMCwgbG9hZEkzMigwLCBpbWdJZCAtIDEpKTsKLSAgICAgICAgICAgIG1hdHJpeExvYWRUcmFuc2xhdGUobWF0MSwgLXBvcyAtIGxvYWRGKDUsIHRyaWFuZ2xlT2Zmc2V0c0NvdW50IC8gMiksIDAsIDApOwotICAgICAgICAgICAgdnBMb2FkVGV4dHVyZU1hdHJpeChtYXQxKTsKLSAgICAgICAgICAgIGRyYXdTaW1wbGVNZXNoUmFuZ2UoTkFNRURfbWVzaCwgbG9hZEkzMig0LCBzdGFydCksIChsb2FkSTMyKDQsIGVuZCkgLSBsb2FkSTMyKDQsIHN0YXJ0KSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtLmphdmEgYi9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOTk4MTYuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZmlsbTsKLQotaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TeXN0ZW07Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLQotaW1wb3J0IGphdmEubGFuZy5SdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgRmlsbSBleHRlbmRzIEFjdGl2aXR5IHsKLSAgICAvL0V2ZW50TGlzdGVuZXIgbUxpc3RlbmVyID0gbmV3IEV2ZW50TGlzdGVuZXIoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gImxpYlJTX2puaSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyAgPSBmYWxzZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPR19FTkFCTEVEID0gREVCVUcgPyBDb25maWcuTE9HRCA6IENvbmZpZy5MT0dWOwotCi0gICAgcHJpdmF0ZSBGaWxtVmlldyBtVmlldzsKLQotICAgIC8vIGdldCB0aGUgY3VycmVudCBsb29wZXIgKGZyb20geW91ciBBY3Rpdml0eSBVSSB0aHJlYWQgZm9yIGluc3RhbmNlCi0KLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwotCi0gICAgICAgIC8vIENyZWF0ZSBvdXIgUHJldmlldyB2aWV3IGFuZCBzZXQgaXQgYXMgdGhlIGNvbnRlbnQgb2Ygb3VyCi0gICAgICAgIC8vIEFjdGl2aXR5Ci0gICAgICAgIG1WaWV3ID0gbmV3IEZpbG1WaWV3KHRoaXMpOwotICAgICAgICBzZXRDb250ZW50VmlldyhtVmlldyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCi0gICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cwotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgICAgICBtVmlldy5vblJlc3VtZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7Ci0gICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCi0gICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cwotICAgICAgICBzdXBlci5vblBhdXNlKCk7Ci0gICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKLQotICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGl0KDApOwotICAgIH0KLQotCi0gICAgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGlmIChMT0dfRU5BQkxFRCkgewotICAgICAgICAgICAgTG9nLnYoTE9HX1RBRywgbWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQotCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtUlMuamF2YSBiL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1SUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDA0NTAyLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1SUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmZpbG07Ci0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOwotCi1wdWJsaWMgY2xhc3MgRmlsbVJTIHsKLSAgICBjbGFzcyBTdHJpcFBvc2l0aW9uIHsKLSAgICAgICAgcHVibGljIGZsb2F0IHRyYW5zbGF0ZTsKLSAgICAgICAgcHVibGljIGZsb2F0IHJvdGF0ZTsKLSAgICAgICAgcHVibGljIGZsb2F0IGZvY3VzOwotICAgICAgICBwdWJsaWMgaW50IHRyaWFuZ2xlT2Zmc2V0Q291bnQ7Ci0gICAgfQotICAgIFN0cmlwUG9zaXRpb24gbVBvcyA9IG5ldyBTdHJpcFBvc2l0aW9uKCk7Ci0KLQotICAgIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX0xBU1RfRk9DVVMgPSAxOwotCi0gICAgcHVibGljIEZpbG1SUygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgbVJTID0gcnM7Ci0gICAgICAgIG1SZXMgPSByZXM7Ci0gICAgICAgIGluaXRSUygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbG1TdHJpcFBvc2l0aW9uKGludCB4LCBpbnQgeSkKLSAgICB7Ci0gICAgICAgIGlmICh4IDwgNTApIHsKLSAgICAgICAgICAgIHggPSA1MDsKLSAgICAgICAgfQotICAgICAgICBpZiAoeCA+IDI3MCkgewotICAgICAgICAgICAgeCA9IDI3MDsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGFuaW0gPSAoKGZsb2F0KXgtNTApIC8gMjcwLmY7Ci0gICAgICAgIG1Qb3MudHJhbnNsYXRlID0gMmYgKiBhbmltICsgMC41ZjsgICAvLyB0cmFuc2xhdGlvbgotICAgICAgICBtUG9zLnJvdGF0ZSA9IChhbmltICogNDApOyAgLy8gcm90YXRpb24KLSAgICAgICAgbVBvcy5mb2N1cyA9ICgoZmxvYXQpeSkgLyAxNi5mIC0gMTAuZjsgIC8vIGZvY3VzUG9zCi0gICAgICAgIG1Qb3MudHJpYW5nbGVPZmZzZXRDb3VudCA9IG1GU00ubVRyaWFuZ2xlT2Zmc2V0c0NvdW50OwotICAgICAgICBtQWxsb2NQb3MuZGF0YShtUG9zKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7Ci0gICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7Ci0gICAgcHJpdmF0ZSBTY3JpcHQgbVNjcmlwdFN0cmlwOwotICAgIHByaXZhdGUgU2NyaXB0IG1TY3JpcHRJbWFnZTsKLSAgICBwcml2YXRlIFNhbXBsZXIgbVNhbXBsZXI7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtU3RvcmUgbVBTQmFja2dyb3VuZDsKLSAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUFNJbWFnZXM7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtRnJhZ21lbnQgbVBGQmFja2dyb3VuZDsKLSAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUEZJbWFnZXM7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1QVkJhY2tncm91bmQ7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1QVkltYWdlczsKLSAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbiBtUFZBOwotICAgIHByaXZhdGUgVHlwZSBtU3RyaXBQb3NpdGlvblR5cGU7Ci0KLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUltYWdlc1tdOwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NJRHM7Ci0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1BbGxvY1BvczsKLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jU3RhdGU7Ci0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1BbGxvY1BWOwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NPZmZzZXRzVGV4OwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NPZmZzZXRzOwotCi0gICAgcHJpdmF0ZSBTaW1wbGVNZXNoIG1NZXNoOwotICAgIHByaXZhdGUgTGlnaHQgbUxpZ2h0OwotCi0gICAgcHJpdmF0ZSBGaWxtU3RyaXBNZXNoIG1GU007Ci0KLSAgICBwcml2YXRlIGludFtdIG1CdWZmZXJJRHM7Ci0gICAgcHJpdmF0ZSBmbG9hdFtdIG1CdWZmZXJQb3MgPSBuZXcgZmxvYXRbM107Ci0gICAgcHJpdmF0ZSBpbnRbXSBtQnVmZmVyU3RhdGU7Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFBGUygpIHsKLSAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYiA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihtUlMsIG51bGwsIG51bGwpOwotCi0gICAgICAgIGIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuTEVTUyk7Ci0gICAgICAgIGIuc2V0RGl0aGVyRW5hYmxlKHRydWUpOwotICAgICAgICBiLnNldERlcHRoTWFzayh0cnVlKTsKLSAgICAgICAgbVBTQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7Ci0gICAgICAgIG1QU0JhY2tncm91bmQuc2V0TmFtZSgiUFNCYWNrZ3JvdW5kIik7Ci0KLSAgICAgICAgYi5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5FUVVBTCk7Ci0gICAgICAgIGIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKLSAgICAgICAgYi5zZXREZXB0aE1hc2soZmFsc2UpOwotICAgICAgICBiLnNldEJsZW5kRnVuYyhQcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jLk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJsZW5kRHN0RnVuYy5PTkUpOwotICAgICAgICBtUFNJbWFnZXMgPSBiLmNyZWF0ZSgpOwotICAgICAgICBtUFNJbWFnZXMuc2V0TmFtZSgiUFNJbWFnZXMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFBGKCkgewotICAgICAgICBTYW1wbGVyLkJ1aWxkZXIgYnMgPSBuZXcgU2FtcGxlci5CdWlsZGVyKG1SUyk7Ci0gICAgICAgIGJzLnNldE1pbihTYW1wbGVyLlZhbHVlLkxJTkVBUik7Ly9fTUlQX0xJTkVBUik7Ci0gICAgICAgIGJzLnNldE1hZyhTYW1wbGVyLlZhbHVlLkxJTkVBUik7Ci0gICAgICAgIGJzLnNldFdyYXBTKFNhbXBsZXIuVmFsdWUuQ0xBTVApOwotICAgICAgICBicy5zZXRXcmFwVChTYW1wbGVyLlZhbHVlLldSQVApOwotICAgICAgICBtU2FtcGxlciA9IGJzLmNyZWF0ZSgpOwotCi0gICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIobVJTKTsKLSAgICAgICAgbVBGQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7Ci0gICAgICAgIG1QRkJhY2tncm91bmQuc2V0TmFtZSgiUEZCYWNrZ3JvdW5kIik7Ci0KLSAgICAgICAgYiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlcihtUlMpOwotICAgICAgICBiLnNldFRleHR1cmUoUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRW52TW9kZS5SRVBMQUNFLAotICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRm9ybWF0LlJHQkEsIDApOwotICAgICAgICBtUEZJbWFnZXMgPSBiLmNyZWF0ZSgpOwotICAgICAgICBtUEZJbWFnZXMuYmluZFNhbXBsZXIobVNhbXBsZXIsIDApOwotICAgICAgICBtUEZJbWFnZXMuc2V0TmFtZSgiUEZJbWFnZXMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFBWKCkgewotICAgICAgICBtTGlnaHQgPSAobmV3IExpZ2h0LkJ1aWxkZXIobVJTKSkuY3JlYXRlKCk7Ci0gICAgICAgIG1MaWdodC5zZXRQb3NpdGlvbigwLCAtMC41ZiwgLTEuMGYpOwotCi0gICAgICAgIFByb2dyYW1WZXJ0ZXguQnVpbGRlciBwdmIgPSBuZXcgUHJvZ3JhbVZlcnRleC5CdWlsZGVyKG1SUywgbnVsbCwgbnVsbCk7Ci0gICAgICAgIC8vcHZiLmFkZExpZ2h0KG1MaWdodCk7Ci0gICAgICAgIG1QVkJhY2tncm91bmQgPSBwdmIuY3JlYXRlKCk7Ci0gICAgICAgIG1QVkJhY2tncm91bmQuc2V0TmFtZSgiUFZCYWNrZ3JvdW5kIik7Ci0KLSAgICAgICAgcHZiID0gbmV3IFByb2dyYW1WZXJ0ZXguQnVpbGRlcihtUlMsIG51bGwsIG51bGwpOwotICAgICAgICBwdmIuc2V0VGV4dHVyZU1hdHJpeEVuYWJsZSh0cnVlKTsKLSAgICAgICAgbVBWSW1hZ2VzID0gcHZiLmNyZWF0ZSgpOwotICAgICAgICBtUFZJbWFnZXMuc2V0TmFtZSgiUFZJbWFnZXMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZEltYWdlcygpIHsKLSAgICAgICAgbUJ1ZmZlcklEcyA9IG5ldyBpbnRbMTNdOwotICAgICAgICBtSW1hZ2VzID0gbmV3IEFsbG9jYXRpb25bMTNdOwotICAgICAgICBtQWxsb2NJRHMgPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlVXNlcihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIpLAotICAgICAgICAgICAgbUJ1ZmZlcklEcy5sZW5ndGgpOwotCi0gICAgICAgIEVsZW1lbnQgaWUgPSBFbGVtZW50LmNyZWF0ZVBpeGVsKG1SUywgRWxlbWVudC5EYXRhVHlwZS5VTlNJR05FRF81XzZfNSwgRWxlbWVudC5EYXRhS2luZC5QSVhFTF9SR0IpOwotICAgICAgICBtSW1hZ2VzWzBdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDAxLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMV0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDIsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1syXSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwMywgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzNdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDA0LCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbNF0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDUsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1s1XSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwNiwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzZdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDA3LCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbN10gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDgsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1s4XSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwOSwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzldID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDEwLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMTBdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDExLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMTFdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDEyLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMTJdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDEzLCBpZSwgdHJ1ZSk7Ci0KLSAgICAgICAgaW50IGJsYWNrW10gPSBuZXcgaW50WzEwMjRdOwotICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgbUltYWdlcy5sZW5ndGg7IGN0KyspIHsKLSAgICAgICAgICAgIEFsbG9jYXRpb24uQWRhcHRlcjJEIGEgPSBtSW1hZ2VzW2N0XS5jcmVhdGVBZGFwdGVyMkQoKTsKLQotICAgICAgICAgICAgaW50IHNpemUgPSA1MTI7Ci0gICAgICAgICAgICBpbnQgbWlwID0gMDsKLSAgICAgICAgICAgIHdoaWxlKHNpemUgPj0gMikgewotICAgICAgICAgICAgICAgIGEuc3ViRGF0YSgwLCAwLCAyLCBzaXplLCBibGFjayk7Ci0gICAgICAgICAgICAgICAgYS5zdWJEYXRhKHNpemUtMiwgMCwgMiwgc2l6ZSwgYmxhY2spOwotICAgICAgICAgICAgICAgIGEuc3ViRGF0YSgwLCAwLCBzaXplLCAyLCBibGFjayk7Ci0gICAgICAgICAgICAgICAgYS5zdWJEYXRhKDAsIHNpemUtMiwgc2l6ZSwgMiwgYmxhY2spOwotICAgICAgICAgICAgICAgIHNpemUgPj49IDE7Ci0gICAgICAgICAgICAgICAgbWlwKys7Ci0gICAgICAgICAgICAgICAgYS5zZXRDb25zdHJhaW50KERpbWVuc2lvbi5MT0QsIG1pcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1JbWFnZXNbY3RdLnVwbG9hZFRvVGV4dHVyZSgxKTsKLSAgICAgICAgICAgIG1CdWZmZXJJRHNbY3RdID0gbUltYWdlc1tjdF0uZ2V0SUQoKTsKLSAgICAgICAgfQotICAgICAgICBtQWxsb2NJRHMuZGF0YShtQnVmZmVySURzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFN0YXRlKCkKLSAgICB7Ci0gICAgICAgIG1CdWZmZXJTdGF0ZSA9IG5ldyBpbnRbMTBdOwotICAgICAgICBtQWxsb2NTdGF0ZSA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQobVJTLAotICAgICAgICAgICAgRWxlbWVudC5jcmVhdGVVc2VyKG1SUywgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiksCi0gICAgICAgICAgICBtQnVmZmVyU3RhdGUubGVuZ3RoKTsKLSAgICAgICAgbUJ1ZmZlclN0YXRlW1NUQVRFX0xBU1RfRk9DVVNdID0gLTE7Ci0gICAgICAgIG1BbGxvY1N0YXRlLmRhdGEobUJ1ZmZlclN0YXRlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFJTKCkgewotICAgICAgICBtRlNNID0gbmV3IEZpbG1TdHJpcE1lc2goKTsKLSAgICAgICAgbU1lc2ggPSBtRlNNLmluaXQobVJTKTsKLSAgICAgICAgbU1lc2guc2V0TmFtZSgibWVzaCIpOwotCi0gICAgICAgIGluaXRQRlMoKTsKLSAgICAgICAgaW5pdFBGKCk7Ci0gICAgICAgIGluaXRQVigpOwotCi0gICAgICAgIExvZy5lKCJycyIsICJEb25lIGxvYWRpbmcgbmFtZWQiKTsKLQotICAgICAgICBtU3RyaXBQb3NpdGlvblR5cGUgPSBUeXBlLmNyZWF0ZUZyb21DbGFzcyhtUlMsIFN0cmlwUG9zaXRpb24uY2xhc3MsIDEpOwotCi0gICAgICAgIFNjcmlwdEMuQnVpbGRlciBzYiA9IG5ldyBTY3JpcHRDLkJ1aWxkZXIobVJTKTsKLSAgICAgICAgc2Iuc2V0U2NyaXB0KG1SZXMsIFIucmF3LmZpbG1zdHJpcCk7Ci0gICAgICAgIHNiLnNldFJvb3QodHJ1ZSk7Ci0gICAgICAgIHNiLnNldFR5cGUobVN0cmlwUG9zaXRpb25UeXBlLCAiUG9zIiwgMSk7Ci0gICAgICAgIG1TY3JpcHRTdHJpcCA9IHNiLmNyZWF0ZSgpOwotICAgICAgICBtU2NyaXB0U3RyaXAuc2V0Q2xlYXJDb2xvcigwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKTsKLQotICAgICAgICBtQWxsb2NQb3MgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgbVN0cmlwUG9zaXRpb25UeXBlKTsKLQotICAgICAgICBsb2FkSW1hZ2VzKCk7Ci0gICAgICAgIGluaXRTdGF0ZSgpOwotCi0gICAgICAgIG1QVkEgPSBuZXcgUHJvZ3JhbVZlcnRleC5NYXRyaXhBbGxvY2F0aW9uKG1SUyk7Ci0gICAgICAgIG1QVkJhY2tncm91bmQuYmluZEFsbG9jYXRpb24obVBWQSk7Ci0gICAgICAgIG1QVkltYWdlcy5iaW5kQWxsb2NhdGlvbihtUFZBKTsKLSAgICAgICAgbVBWQS5zZXR1cFByb2plY3Rpb25Ob3JtYWxpemVkKDMyMCwgNDgwKTsKLQotCi0gICAgICAgIG1TY3JpcHRTdHJpcC5iaW5kQWxsb2NhdGlvbihtQWxsb2NJRHMsIDApOwotICAgICAgICBtU2NyaXB0U3RyaXAuYmluZEFsbG9jYXRpb24obUFsbG9jUG9zLCAxKTsKLSAgICAgICAgbVNjcmlwdFN0cmlwLmJpbmRBbGxvY2F0aW9uKG1BbGxvY1N0YXRlLCAyKTsKLSAgICAgICAgbVNjcmlwdFN0cmlwLmJpbmRBbGxvY2F0aW9uKG1QVkEubUFsbG9jLCAzKTsKLQotCi0gICAgICAgIG1BbGxvY09mZnNldHMgPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlVXNlcihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuU0lHTkVEXzMyKSwgbUZTTS5tVHJpYW5nbGVPZmZzZXRzLmxlbmd0aCk7Ci0gICAgICAgIG1BbGxvY09mZnNldHMuZGF0YShtRlNNLm1UcmlhbmdsZU9mZnNldHMpOwotICAgICAgICBtU2NyaXB0U3RyaXAuYmluZEFsbG9jYXRpb24obUFsbG9jT2Zmc2V0cywgNCk7Ci0KLSAgICAgICAgbUFsbG9jT2Zmc2V0c1RleCA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQobVJTLAotICAgICAgICAgICAgRWxlbWVudC5jcmVhdGVVc2VyKG1SUywgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiksIG1GU00ubVRyaWFuZ2xlT2Zmc2V0c1RleC5sZW5ndGgpOwotICAgICAgICBtQWxsb2NPZmZzZXRzVGV4LmRhdGEobUZTTS5tVHJpYW5nbGVPZmZzZXRzVGV4KTsKLSAgICAgICAgbVNjcmlwdFN0cmlwLmJpbmRBbGxvY2F0aW9uKG1BbGxvY09mZnNldHNUZXgsIDUpOwotCi0gICAgICAgIHNldEZpbG1TdHJpcFBvc2l0aW9uKDAsIDApOwotICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHRTdHJpcCk7Ci0gICAgfQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVN0cmlwTWVzaC5qYXZhIGIvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVN0cmlwTWVzaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDhjY2UwLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1TdHJpcE1lc2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmZpbG07Ci0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcuTWF0aDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OwotaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlNpbXBsZU1lc2g7Ci0KLQotY2xhc3MgRmlsbVN0cmlwTWVzaCB7Ci0KLSAgICBjbGFzcyBWZXJ0ZXggewotICAgICAgICBmbG9hdCBueDsKLSAgICAgICAgZmxvYXQgbnk7Ci0gICAgICAgIGZsb2F0IG56OwotICAgICAgICBmbG9hdCBzOwotICAgICAgICBmbG9hdCB0OwotICAgICAgICBmbG9hdCB4OwotICAgICAgICBmbG9hdCB5OwotICAgICAgICBmbG9hdCB6OwotCi0gICAgICAgIFZlcnRleCgpIHsKLSAgICAgICAgICAgIG54ID0gMDsKLSAgICAgICAgICAgIG55ID0gMDsKLSAgICAgICAgICAgIG56ID0gMDsKLSAgICAgICAgICAgIHMgPSAwOwotICAgICAgICAgICAgdCA9IDA7Ci0gICAgICAgICAgICB4ID0gMDsKLSAgICAgICAgICAgIHkgPSAwOwotICAgICAgICAgICAgeiA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHh5eihmbG9hdCBfeCwgZmxvYXQgX3ksIGZsb2F0IF96KSB7Ci0gICAgICAgICAgICB4ID0gX3g7Ci0gICAgICAgICAgICB5ID0gX3k7Ci0gICAgICAgICAgICB6ID0gX3o7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIG54eXooZmxvYXQgX3gsIGZsb2F0IF95LCBmbG9hdCBfeikgewotICAgICAgICAgICAgbnggPSBfeDsKLSAgICAgICAgICAgIG55ID0gX3k7Ci0gICAgICAgICAgICBueiA9IF96OwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzdChmbG9hdCBfcywgZmxvYXQgX3QpIHsKLSAgICAgICAgICAgIHMgPSBfczsKLSAgICAgICAgICAgIHQgPSBfdDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgY29tcHV0ZU5vcm0oVmVydGV4IHYxLCBWZXJ0ZXggdjIpIHsKLSAgICAgICAgICAgIGZsb2F0IGR4ID0gdjEueCAtIHYyLng7Ci0gICAgICAgICAgICBmbG9hdCBkeSA9IHYxLnkgLSB2Mi55OwotICAgICAgICAgICAgZmxvYXQgZHogPSB2MS56IC0gdjIuejsKLSAgICAgICAgICAgIGZsb2F0IGxlbiA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zcXJ0KGR4KmR4ICsgZHkqZHkgKyBkeipkeik7Ci0gICAgICAgICAgICBkeCAvPSBsZW47Ci0gICAgICAgICAgICBkeSAvPSBsZW47Ci0gICAgICAgICAgICBkeiAvPSBsZW47Ci0KLSAgICAgICAgICAgIG54ID0gZHggKiBkejsKLSAgICAgICAgICAgIG55ID0gZHkgKiBkejsKLSAgICAgICAgICAgIG56ID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLnNxcnQoZHgqZHggKyBkeSpkeSk7Ci0KLSAgICAgICAgICAgIGxlbiA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zcXJ0KG54Km54ICsgbnkqbnkgKyBueipueik7Ci0gICAgICAgICAgICBueCAvPSBsZW47Ci0gICAgICAgICAgICBueSAvPSBsZW47Ci0gICAgICAgICAgICBueiAvPSBsZW47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnRbXSBtVHJpYW5nbGVPZmZzZXRzOwotICAgIGZsb2F0W10gbVRyaWFuZ2xlT2Zmc2V0c1RleDsKLSAgICBpbnQgbVRyaWFuZ2xlT2Zmc2V0c0NvdW50OwotCi0gICAgU2ltcGxlTWVzaCBpbml0KFJlbmRlclNjcmlwdCBycykKLSAgICB7Ci0gICAgICAgIGZsb2F0IHZ0eFtdID0gbmV3IGZsb2F0W10gewotICAgICAgICAgICAgNjAuNDMxMDAzZiwgMTI0LjQ4MjA1MGYsCi0gICAgICAgICAgICA2MC44NjIwNzRmLCAxMjAuODcyNjA0ZiwKLSAgICAgICAgICAgIDYxLjcwNTMwM2YsIDExNy4zMzY2NjJmLAotICAgICAgICAgICAgNjIuOTQ5NTA1ZiwgMTEzLjkyMTEyN2YsCi0gICAgICAgICAgICA2NC41NzgxNzdmLCAxMTAuNjcxMzA0ZiwKLSAgICAgICAgICAgIDY2LjU2OTcxNmYsIDEwNy42MzAzMDJmLAotICAgICAgICAgICAgNjguODk3NzAzZiwgMTA0LjgzODQ1N2YsCi0gICAgICAgICAgICA3MS41MzEyNTlmLCAxMDIuMzMyODAzZiwKLSAgICAgICAgICAgIDc0LjQzNTQ1MmYsIDEwMC4xNDY1NzdmLAotICAgICAgICAgICAgNzcuNTcxNzU3ZiwgOTguMzA4Nzc3ZiwKLSAgICAgICAgICAgIDgwLjg5ODU3NGYsIDk2Ljg0Mzc4MWYsCi0gICAgICAgICAgICA4NC4zNzE3NzNmLCA5NS43NzEwMjNmLAotICAgICAgICAgICAgODcuOTQ1MjgzZiwgOTUuMTA0NzMxZiwKLSAgICAgICAgICAgIDk4Ljk1ODk5NGYsIDk1LjI2NzA5OGYsCi0gICAgICAgICAgICAxMDkuNDg5NTIzZiwgOTguNDk3NTk2ZiwKLSAgICAgICAgICAgIDExOC42OTk1ODJmLCAxMDQuNTM5MzY2ZiwKLSAgICAgICAgICAgIDEyNS44NTY4NzJmLCAxMTIuOTEyMDIyZiwKLSAgICAgICAgICAgIDEzMC4zOTIzMTFmLCAxMjIuOTQ5ODQ5ZiwKLSAgICAgICAgICAgIDEzMS45NDUyODNmLCAxMzMuODU0NzMxZiwKLSAgICAgICAgICAgIDEzMC4zOTIzMTFmLCAxNDQuNzU5NjEzZiwKLSAgICAgICAgICAgIDEyNS44NTY4NzJmLCAxNTQuNzk3NDM5ZiwKLSAgICAgICAgICAgIDExOC42OTk1ODJmLCAxNjMuMTcwMDk2ZiwKLSAgICAgICAgICAgIDEwOS40ODk1MjNmLCAxNjkuMjExODY2ZiwKLSAgICAgICAgICAgIDk4Ljk1ODk5NGYsIDE3Mi40NDIzNjRmLAotICAgICAgICAgICAgODcuOTQ1MjgzZiwgMTcyLjYwNDczMWYsCi0gICAgICAgICAgICA3Mi41MDczMTNmLCAxNzIuNjcyOTI3ZiwKLSAgICAgICAgICAgIDU3LjY3ODkyMGYsIDE2OC4zNzcwNzFmLAotICAgICAgICAgICAgNDQuNjY4MTM1ZiwgMTYwLjA2NzEzNGYsCi0gICAgICAgICAgICAzNC41MzQ5MDhmLCAxNDguNDIwMTA0ZiwKLSAgICAgICAgICAgIDI4LjEwNDc2N2YsIDEzNC4zODQ4MzFmLAotICAgICAgICAgICAgMjUuOTAxNTU3ZiwgMTE5LjEwNDczMWYsCi0gICAgICAgICAgICAyOC4xMDQ3NjdmLCAxMDMuODI0NjMxZiwKLSAgICAgICAgICAgIDM0LjUzNDkwOGYsIDg5Ljc4OTM1OGYsCi0gICAgICAgICAgICA0NC42NjgxMzVmLCA3OC4xNDIzMjdmLAotICAgICAgICAgICAgNTcuNjc4OTIwZiwgNjkuODMyMzkwZiwKLSAgICAgICAgICAgIDcyLjUwNzMxM2YsIDY1LjUzNjUzNGYsCi0gICAgICAgICAgICA4Ny45NDUyODNmLCA2NS42MDQ3MzFmLAotICAgICAgICAgICAgMTA2LjkxODExN2YsIDY1LjY4ODU0MmYsCi0gICAgICAgICAgICAxMjUuMTQxNzk1ZiwgNjAuNDA5MDU2ZiwKLSAgICAgICAgICAgIDE0MS4xMzE2ODZmLCA1MC4xOTYzNzZmLAotICAgICAgICAgICAgMTUzLjU4NTEzN2YsIDM1Ljg4MjUwMmYsCi0gICAgICAgICAgICAxNjEuNDg3NjAwZiwgMTguNjMzNTQ1ZiwKLSAgICAgICAgICAgIDE2NC4xOTUyODNmLCAtMC4xNDUyNjlmLAotICAgICAgICAgICAgMTYxLjQ4NzYwMGYsIC0xOC45MjQwODRmLAotICAgICAgICAgICAgMTUzLjU4NTEzN2YsIC0zNi4xNzMwNDBmLAotICAgICAgICAgICAgMTQxLjEzMTY4NmYsIC01MC40ODY5MTRmLAotICAgICAgICAgICAgMTI1LjE0MTc5NWYsIC02MC42OTk1OTRmLAotICAgICAgICAgICAgMTA2LjkxODExN2YsIC02NS45NzkwODFmLAotICAgICAgICAgICAgODcuOTQ1MjgzZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICA4MGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgNjBmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIDQwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAyMGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgMGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgLTIwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAtNDBmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIC02MGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgLTgwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAtODcuOTQ1MjgzZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAtMTA2LjkxODExN2YsIC02NS45NzkwODFmLAotICAgICAgICAgICAgLTEyNS4xNDE3OTVmLCAtNjAuNjk5NTk0ZiwKLSAgICAgICAgICAgIC0xNDEuMTMxNjg2ZiwgLTUwLjQ4NjkxNGYsCi0gICAgICAgICAgICAtMTUzLjU4NTEzN2YsIC0zNi4xNzMwNDBmLAotICAgICAgICAgICAgLTE2MS40ODc2MDBmLCAtMTguOTI0MDg0ZiwKLSAgICAgICAgICAgIC0xNjQuMTk1MjgzZiwgLTAuMTQ1MjY5ZiwKLSAgICAgICAgICAgIC0xNjEuNDg3NjAwZiwgMTguNjMzNTQ1ZiwKLSAgICAgICAgICAgICAtMTUzLjU4NTEzN2YsIDM1Ljg4MjUwMmYsCi0gICAgICAgICAgICAgLTE0MS4xMzE2ODZmLCA1MC4xOTYzNzZmLAotICAgICAgICAgICAgIC0xMjUuMTQxNzk1ZiwgNjAuNDA5MDU2ZiwKLSAgICAgICAgICAgICAtMTA2LjkxODExN2YsIDY1LjY4ODU0MmYsCi0gICAgICAgICAgICAgLTg3Ljk0NTI4M2YsIDY1LjYwNDczMWYsCi0gICAgICAgICAgICAgLTcyLjUwNzMxM2YsIDY1LjUzNjUzNGYsCi0gICAgICAgICAgICAgLTU3LjY3ODkyMGYsIDY5LjgzMjM5MGYsCi0gICAgICAgICAgICAgLTQ0LjY2ODEzNWYsIDc4LjE0MjMyN2YsCi0gICAgICAgICAgICAgLTM0LjUzNDkwOGYsIDg5Ljc4OTM1OGYsCi0gICAgICAgICAgICAgLTI4LjEwNDc2N2YsIDEwMy44MjQ2MzFmLAotICAgICAgICAgICAgIC0yNS45MDE1NTdmLCAxMTkuMTA0NzMxZiwKLSAgICAgICAgICAgICAtMjguMTA0NzY3ZiwgMTM0LjM4NDgzMWYsCi0gICAgICAgICAgICAgLTM0LjUzNDkwOGYsIDE0OC40MjAxMDRmLAotICAgICAgICAgICAgIC00NC42NjgxMzVmLCAxNjAuMDY3MTM0ZiwKLSAgICAgICAgICAgICAtNTcuNjc4OTIwZiwgMTY4LjM3NzA3MWYsCi0gICAgICAgICAgICAgLTcyLjUwNzMxM2YsIDE3Mi42NzI5MjdmLAotICAgICAgICAgICAgIC04Ny45NDUyODNmLCAxNzIuNjA0NzMxZiwKLSAgICAgICAgICAgICAtOTguOTU4OTk0ZiwgMTcyLjQ0MjM2NGYsCi0gICAgICAgICAgICAgLTEwOS40ODk1MjNmLCAxNjkuMjExODY2ZiwKLSAgICAgICAgICAgICAtMTE4LjY5OTU4MmYsIDE2My4xNzAwOTZmLAotICAgICAgICAgICAgIC0xMjUuODU2ODcyZiwgMTU0Ljc5NzQzOWYsCi0gICAgICAgICAgICAgLTEzMC4zOTIzMTFmLCAxNDQuNzU5NjEzZiwKLSAgICAgICAgICAgICAtMTMxLjk0NTI4M2YsIDEzMy44NTQ3MzFmLAotICAgICAgICAgICAgIC0xMzAuMzkyMzExZiwgMTIyLjk0OTg0OWYsCi0gICAgICAgICAgICAgLTEyNS44NTY4NzJmLCAxMTIuOTEyMDIyZiwKLSAgICAgICAgICAgICAtMTE4LjY5OTU4MmYsIDEwNC41MzkzNjZmLAotICAgICAgICAgICAgIC0xMDkuNDg5NTIzZiwgOTguNDk3NTk2ZiwKLSAgICAgICAgICAgICAtOTguOTU4OTk0ZiwgOTUuMjY3MDk4ZiwKLSAgICAgICAgICAgICAtODcuOTQ1MjgzZiwgOTUuMTA0NzMxZiwKLSAgICAgICAgICAgICAtODQuMzcxNzczZiwgOTUuNzcxMDIzZiwKLSAgICAgICAgICAgICAtODAuODk4NTc0ZiwgOTYuODQzNzgxZiwKLSAgICAgICAgICAgICAtNzcuNTcxNzU3ZiwgOTguMzA4Nzc3ZiwKLSAgICAgICAgICAgICAtNzQuNDM1NDUyZiwgMTAwLjE0NjU3N2YsCi0gICAgICAgICAgICAgLTcxLjUzMTI1OWYsIDEwMi4zMzI4MDNmLAotICAgICAgICAgICAgIC02OC44OTc3MDNmLCAxMDQuODM4NDU3ZiwKLSAgICAgICAgICAgICAtNjYuNTY5NzE2ZiwgMTA3LjYzMDMwMmYsCi0gICAgICAgICAgICAgLTY0LjU3ODE3N2YsIDExMC42NzEzMDRmLAotICAgICAgICAgICAgIC02Mi45NDk1MDVmLCAxMTMuOTIxMTI3ZiwKLSAgICAgICAgICAgICAtNjEuNzA1MzAzZiwgMTE3LjMzNjY2MmYsCi0gICAgICAgICAgICAgLTYwLjg2MjA3NGYsIDEyMC44NzI2MDRmLAotICAgICAgICAgICAgIC02MC40MzEwMDNmLCAxMjQuNDgyMDUwZgotICAgICAgICB9OwotCi0KLSAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0cyA9IG5ldyBpbnRbNjRdOwotICAgICAgICBtVHJpYW5nbGVPZmZzZXRzVGV4ID0gbmV3IGZsb2F0WzY0XTsKLQotICAgICAgICBtVHJpYW5nbGVPZmZzZXRzWzBdID0gMDsKLSAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0c0NvdW50ID0gMTsKLQotICAgICAgICBWZXJ0ZXggdCA9IG5ldyBWZXJ0ZXgoKTsKLSAgICAgICAgdC5ueHl6KDEsIDAsIDApOwotICAgICAgICBpbnQgY291bnQgPSB2dHgubGVuZ3RoIC8gMjsKLQotICAgICAgICBTaW1wbGVNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIgdG0gPSBuZXcgU2ltcGxlTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyKAotICAgICAgICAgICAgcnMsIDMsCi0gICAgICAgICAgICBTaW1wbGVNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIuTk9STUFMIHwgU2ltcGxlTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyLlRFWFRVUkVfMCk7Ci0KLSAgICAgICAgZmxvYXQgcnVubmluZ1MgPSAwOwotICAgICAgICBmb3IgKGludCBjdD0wOyBjdCA8IChjb3VudC0xKTsgY3QrKykgewotICAgICAgICAgICAgdC54ID0gLXZ0eFtjdCoyXSAvIDEwMC5mOwotICAgICAgICAgICAgdC56ID0gdnR4W2N0KjIrMV0gLyAxMDAuZjsKLSAgICAgICAgICAgIHQucyA9IHJ1bm5pbmdTOwotICAgICAgICAgICAgdC5ueCA9ICAodnR4W2N0KjIrM10gLSB2dHhbY3QqMiArMV0pOwotICAgICAgICAgICAgdC5ueSA9ICAodnR4W2N0KjIrMl0gLSB2dHhbY3QqMiAgIF0pOwotICAgICAgICAgICAgZmxvYXQgbGVuID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLnNxcnQodC5ueCAqIHQubnggKyB0Lm55ICogdC5ueSk7Ci0gICAgICAgICAgICBydW5uaW5nUyArPSBsZW4gLyAxMDA7Ci0gICAgICAgICAgICB0Lm54IC89IGxlbjsKLSAgICAgICAgICAgIHQubnkgLz0gbGVuOwotICAgICAgICAgICAgdC55ID0gLTAuNWY7Ci0gICAgICAgICAgICB0LnQgPSAwOwotICAgICAgICAgICAgdG0uc2V0Tm9ybWFsKHQubngsIHQubnksIHQubnopOwotICAgICAgICAgICAgdG0uc2V0VGV4dHVyZSh0LnMsIHQudCk7Ci0gICAgICAgICAgICB0bS5hZGRWZXJ0ZXgodC54LCB0LnksIHQueik7Ci0gICAgICAgICAgICAvL2FuZHJvaWQudXRpbC5Mb2cuZSgicnMiLCAidnR4IHg9Iit0LngrIiB5PSIrdC55KyIgej0iK3QueisiIHM9Iit0LnMrIiB0PSIrdC50KTsKLSAgICAgICAgICAgIHQueSA9IC41ZjsKLSAgICAgICAgICAgIHQudCA9IDE7Ci0gICAgICAgICAgICB0bS5zZXRUZXh0dXJlKHQucywgdC50KTsKLSAgICAgICAgICAgIHRtLmFkZFZlcnRleCh0LngsIHQueSwgdC56KTsKLSAgICAgICAgICAgIC8vYW5kcm9pZC51dGlsLkxvZy5lKCJycyIsICJ2dHggeD0iK3QueCsiIHk9Iit0LnkrIiB6PSIrdC56KyIgcz0iK3QucysiIHQ9Iit0LnQpOwotCi0gICAgICAgICAgICBpZigocnVubmluZ1MqMikgPiBtVHJpYW5nbGVPZmZzZXRzQ291bnQpIHsKLSAgICAgICAgICAgICAgICBtVHJpYW5nbGVPZmZzZXRzW21UcmlhbmdsZU9mZnNldHNDb3VudF0gPSBjdCoyICogMzsKLSAgICAgICAgICAgICAgICBtVHJpYW5nbGVPZmZzZXRzVGV4W21UcmlhbmdsZU9mZnNldHNDb3VudF0gPSB0LnM7Ci0gICAgICAgICAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0c0NvdW50ICsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY291bnQgPSAoY291bnQgKiAyIC0gMik7Ci0gICAgICAgIGZvciAoaW50IGN0PTA7IGN0IDwgKGNvdW50LTIpOyBjdCs9IDIpIHsKLSAgICAgICAgICAgIHRtLmFkZFRyaWFuZ2xlKGN0LCBjdCsxLCBjdCsyKTsKLSAgICAgICAgICAgIHRtLmFkZFRyaWFuZ2xlKGN0KzEsIGN0KzMsIGN0KzIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0bS5jcmVhdGUoKTsKLSAgICB9Ci0KLQotfQotCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtVmlldy5qYXZhIGIvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjMjgxMS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZmlsbTsKLQotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOwotCi1pbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7Ci1pbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0w7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBGaWxtVmlldyBleHRlbmRzIFJTU3VyZmFjZVZpZXcgewotCi0gICAgcHVibGljIEZpbG1WaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgLy9zZXRGb2N1c2FibGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7Ci0gICAgcHJpdmF0ZSBGaWxtUlMgbVJlbmRlcjsKLQotCi0gICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3LCBpbnQgaCkgewotICAgICAgICBzdXBlci5zdXJmYWNlQ2hhbmdlZChob2xkZXIsIGZvcm1hdCwgdywgaCk7Ci0gICAgICAgIGlmIChtUlMgPT0gbnVsbCkgewotICAgICAgICAgICAgbVJTID0gY3JlYXRlUmVuZGVyU2NyaXB0KHRydWUpOwotICAgICAgICAgICAgbVJTLmNvbnRleHRTZXRTdXJmYWNlKHcsIGgsIGhvbGRlci5nZXRTdXJmYWNlKCkpOwotICAgICAgICAgICAgbVJlbmRlciA9IG5ldyBGaWxtUlMoKTsKLSAgICAgICAgICAgIG1SZW5kZXIuaW5pdChtUlMsIGdldFJlc291cmNlcygpLCB3LCBoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBpZihtUlMgIT0gbnVsbCkgewotICAgICAgICAgICAgbVJTID0gbnVsbDsKLSAgICAgICAgICAgIGRlc3Ryb3lSZW5kZXJTY3JpcHQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgICAvLyBicmVhayBwb2ludCBhdCBoZXJlCi0gICAgICAgIC8vIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgd29yayB3aGVuICdleHRlbmRzIFZpZXcnIGluY2x1ZGUgJ2V4dGVuZHMgU2Nyb2xsVmlldycuCi0gICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOwotICAgIH0KLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQotICAgIHsKLSAgICAgICAgYm9vbGVhbiByZXQgPSB0cnVlOwotICAgICAgICBpbnQgYWN0ID0gZXYuZ2V0QWN0aW9uKCk7Ci0gICAgICAgIGlmIChhY3QgPT0gZXYuQUNUSU9OX1VQKSB7Ci0gICAgICAgICAgICByZXQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtUmVuZGVyLnNldEZpbG1TdHJpcFBvc2l0aW9uKChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSAvIDUpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLX0KLQotCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRm91bnRhaW4vQW5kcm9pZC5tayBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9BbmRyb2lkLm1rCmluZGV4IGY3ZTUzYTguLjcxOTQ0YjIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9BbmRyb2lkLm1rCisrKyBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9BbmRyb2lkLm1rCkBAIC0xNCwxNCArMTQsMTggQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisKIExPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpICQoY2FsbCBhbGwtcmVuZGVyc2NyaXB0LWZpbGVzLXVuZGVyLCBzcmMpCiAjTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQucmVuZGVyc2NyaXB0CiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBGb3VudGFpbgogCiBpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9yZXMvZHJhd2FibGUvZ2FkZ2V0c19jbG9ja19tcDMucG5nIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9kcmF3YWJsZS9nYWRnZXRzX2Nsb2NrX21wMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5MWJmYjQuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9kcmF3YWJsZS9nYWRnZXRzX2Nsb2NrX21wMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbi5jIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNiODE5Yi4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8gRm91bnRhaW4gdGVzdCBzY3JpcHQKLSNwcmFnbWEgdmVyc2lvbigxKQotCi1pbnQgbmV3UGFydCA9IDA7Ci0KLWludCBtYWluKGludCBsYXVuY2hJRCkgewotICAgIGludCBjdDsKLSAgICBpbnQgY291bnQgPSBDb250cm9sLT5jb3VudDsKLSAgICBpbnQgcmF0ZSA9IENvbnRyb2wtPnJhdGU7Ci0gICAgZmxvYXQgaGVpZ2h0ID0gZ2V0SGVpZ2h0KCk7Ci0gICAgc3RydWN0IHBvaW50X3MgKiBwID0gKHN0cnVjdCBwb2ludF9zICopcG9pbnQ7Ci0KLSAgICBpZiAocmF0ZSkgewotICAgICAgICBmbG9hdCByTWF4ID0gKChmbG9hdClyYXRlKSAqIDAuMDA1ZjsKLSAgICAgICAgaW50IHggPSBDb250cm9sLT54OwotICAgICAgICBpbnQgeSA9IENvbnRyb2wtPnk7Ci0gICAgICAgIGludCBjb2xvciA9ICgoaW50KShDb250cm9sLT5yICogMjU1LmYpKSB8Ci0gICAgICAgICAgICAgICAgICAgICgoaW50KShDb250cm9sLT5nICogMjU1LmYpKSA8PCA4IHwKLSAgICAgICAgICAgICAgICAgICAgKChpbnQpKENvbnRyb2wtPmIgKiAyNTUuZikpIDw8IDE2IHwKLSAgICAgICAgICAgICAgICAgICAgKDB4ZjAgPDwgMjQpOwotICAgICAgICBzdHJ1Y3QgcG9pbnRfcyAqIG5wID0gJnBbbmV3UGFydF07Ci0KLSAgICAgICAgd2hpbGUgKHJhdGUtLSkgewotICAgICAgICAgICAgdmVjMlJhbmQoKGZsb2F0ICopJm5wLT5kZWx0YS54LCByTWF4KTsKLSAgICAgICAgICAgIG5wLT5wb3NpdGlvbi54ID0geDsKLSAgICAgICAgICAgIG5wLT5wb3NpdGlvbi55ID0geTsKLSAgICAgICAgICAgIG5wLT5jb2xvciA9IGNvbG9yOwotICAgICAgICAgICAgbmV3UGFydCsrOwotICAgICAgICAgICAgbnArKzsKLSAgICAgICAgICAgIGlmIChuZXdQYXJ0ID49IGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgbmV3UGFydCA9IDA7Ci0gICAgICAgICAgICAgICAgbnAgPSAmcFtuZXdQYXJ0XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoY3Q9MDsgY3QgPCBjb3VudDsgY3QrKykgewotICAgICAgICBmbG9hdCBkeSA9IHAtPmRlbHRhLnkgKyAwLjE1ZjsKLSAgICAgICAgZmxvYXQgcG9zeSA9IHAtPnBvc2l0aW9uLnkgKyBkeTsKLSAgICAgICAgaWYgKChwb3N5ID4gaGVpZ2h0KSAmJiAoZHkgPiAwKSkgewotICAgICAgICAgICAgZHkgKj0gLTAuM2Y7Ci0gICAgICAgIH0KLSAgICAgICAgcC0+ZGVsdGEueSA9IGR5OwotICAgICAgICBwLT5wb3NpdGlvbi54ICs9IHAtPmRlbHRhLng7Ci0gICAgICAgIHAtPnBvc2l0aW9uLnkgPSBwb3N5OwotICAgICAgICBwKys7Ci0gICAgfQotCi0gICAgdXBsb2FkVG9CdWZmZXJPYmplY3QoTkFNRURfUGFydEJ1ZmZlcik7Ci0gICAgZHJhd1NpbXBsZU1lc2goTkFNRURfUGFydE1lc2gpOwotICAgIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4yLnJzIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4yLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzAxMTQwLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9yZXMvcmF3L2ZvdW50YWluMi5ycworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vIEZvdW50YWluIHRlc3Qgc2NyaXB0Ci0jcHJhZ21hIHZlcnNpb24oMSkKLQotI2luY2x1ZGUgInJzX3R5cGVzLnJzaCIKLSNpbmNsdWRlICJyc19tYXRoLnJzaCIKLSNpbmNsdWRlICJyc19ncmFwaGljcy5yc2giCi0KLXN0YXRpYyBpbnQgbmV3UGFydCA9IDA7Ci0KLXR5cGVkZWYgc3RydWN0IENvbnRyb2xfcyB7Ci0gICAgaW50IHgsIHk7Ci0gICAgaW50IHJhdGU7Ci0gICAgaW50IGNvdW50OwotICAgIGZsb2F0IHIsIGcsIGI7Ci0gICAgcnNfYWxsb2NhdGlvbiBwYXJ0QnVmZmVyOwotICAgIHJzX21lc2ggcGFydE1lc2g7Ci19IENvbnRyb2xfdDsKLUNvbnRyb2xfdCAqQ29udHJvbDsKLQotdHlwZWRlZiBzdHJ1Y3QgUG9pbnRfc3sKLSAgICBmbG9hdDIgZGVsdGE7Ci0gICAgZmxvYXQyIHBvc2l0aW9uOwotICAgIHVuc2lnbmVkIGludCBjb2xvcjsKLX0gUG9pbnRfdDsKLVBvaW50X3QgKnBvaW50OwotCi1pbnQgbWFpbihpbnQgbGF1bmNoSUQpIHsKLSAgICBpbnQgY3Q7Ci0gICAgaW50IGNvdW50ID0gQ29udHJvbC0+Y291bnQ7Ci0gICAgaW50IHJhdGUgPSBDb250cm9sLT5yYXRlOwotICAgIGZsb2F0IGhlaWdodCA9IGdldEhlaWdodCgpOwotICAgIFBvaW50X3QgKiBwID0gcG9pbnQ7Ci0KLSAgICBpZiAocmF0ZSkgewotICAgICAgICBmbG9hdCByTWF4ID0gKChmbG9hdClyYXRlKSAqIDAuMDA1ZjsKLSAgICAgICAgaW50IHggPSBDb250cm9sLT54OwotICAgICAgICBpbnQgeSA9IENvbnRyb2wtPnk7Ci0gICAgICAgIGludCBjb2xvciA9ICgoaW50KShDb250cm9sLT5yICogMjU1LmYpKSB8Ci0gICAgICAgICAgICAgICAgICAgICgoaW50KShDb250cm9sLT5nICogMjU1LmYpKSA8PCA4IHwKLSAgICAgICAgICAgICAgICAgICAgKChpbnQpKENvbnRyb2wtPmIgKiAyNTUuZikpIDw8IDE2IHwKLSAgICAgICAgICAgICAgICAgICAgKDB4ZjAgPDwgMjQpOwotICAgICAgICBQb2ludF90ICogbnAgPSAmcFtuZXdQYXJ0XTsKLQotICAgICAgICB3aGlsZSAocmF0ZS0tKSB7Ci0gICAgICAgICAgICBucC0+ZGVsdGEgPSB2ZWMyUmFuZChyTWF4KTsKLSAgICAgICAgICAgIG5wLT5wb3NpdGlvbi54ID0geDsKLSAgICAgICAgICAgIG5wLT5wb3NpdGlvbi55ID0geTsKLSAgICAgICAgICAgIG5wLT5jb2xvciA9IGNvbG9yOwotICAgICAgICAgICAgbmV3UGFydCsrOwotICAgICAgICAgICAgbnArKzsKLSAgICAgICAgICAgIGlmIChuZXdQYXJ0ID49IGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgbmV3UGFydCA9IDA7Ci0gICAgICAgICAgICAgICAgbnAgPSAmcFtuZXdQYXJ0XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoY3Q9MDsgY3QgPCBjb3VudDsgY3QrKykgewotICAgICAgICBmbG9hdCBkeSA9IHAtPmRlbHRhLnkgKyAwLjE1ZjsKLSAgICAgICAgZmxvYXQgcG9zeSA9IHAtPnBvc2l0aW9uLnkgKyBkeTsKLSAgICAgICAgaWYgKChwb3N5ID4gaGVpZ2h0KSAmJiAoZHkgPiAwKSkgewotICAgICAgICAgICAgZHkgKj0gLTAuM2Y7Ci0gICAgICAgIH0KLSAgICAgICAgcC0+ZGVsdGEueSA9IGR5OwotICAgICAgICBwLT5wb3NpdGlvbi54ICs9IHAtPmRlbHRhLng7Ci0gICAgICAgIHAtPnBvc2l0aW9uLnkgPSBwb3N5OwotICAgICAgICBwKys7Ci0gICAgfQotCi0gICAgdXBsb2FkVG9CdWZmZXJPYmplY3QoQ29udHJvbC0+cGFydEJ1ZmZlcik7Ci0gICAgZHJhd1NpbXBsZU1lc2goQ29udHJvbC0+cGFydE1lc2gpOwotICAgIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblJTLmphdmEgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluUlMuamF2YQppbmRleCA5MzU2NTc5Li4wYjI2Y2ZkIDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluUlMuamF2YQorKysgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluUlMuamF2YQpAQCAtMjIsOTQgKzIyLDUwIEBACiAKIAogcHVibGljIGNsYXNzIEZvdW50YWluUlMgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlRfQ09VTlQgPSAyMDAwMDsKLQotICAgIHN0YXRpYyBjbGFzcyBTb21lRGF0YSB7Ci0gICAgICAgIHB1YmxpYyBpbnQgeDsKLSAgICAgICAgcHVibGljIGludCB5OwotICAgICAgICBwdWJsaWMgaW50IHJhdGU7Ci0gICAgICAgIHB1YmxpYyBpbnQgY291bnQ7Ci0gICAgICAgIHB1YmxpYyBmbG9hdCByOwotICAgICAgICBwdWJsaWMgZmxvYXQgZzsKLSAgICAgICAgcHVibGljIGZsb2F0IGI7Ci0gICAgfQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlRfQ09VTlQgPSA1MDAwMDsKIAogICAgIHB1YmxpYyBGb3VudGFpblJTKCkgewogICAgIH0KIAorICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBTY3JpcHRDX2ZvdW50YWluIG1TY3JpcHQ7CiAgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CiAgICAgICAgIG1SUyA9IHJzOwogICAgICAgICBtUmVzID0gcmVzOwotICAgICAgICBpbml0UlMoKTsKKworICAgICAgICBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlciBwZmIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIocnMpOworICAgICAgICBwZmIuc2V0VmFyeWluZ0NvbG9yKHRydWUpOworICAgICAgICBycy5jb250ZXh0QmluZFByb2dyYW1GcmFnbWVudChwZmIuY3JlYXRlKCkpOworCisgICAgICAgIFNjcmlwdEZpZWxkX1BvaW50IHBvaW50cyA9IG5ldyBTY3JpcHRGaWVsZF9Qb2ludChtUlMsIFBBUlRfQ09VTlQpOworCisgICAgICAgIE1lc2guQWxsb2NhdGlvbkJ1aWxkZXIgc21iID0gbmV3IE1lc2guQWxsb2NhdGlvbkJ1aWxkZXIobVJTKTsKKyAgICAgICAgc21iLmFkZFZlcnRleEFsbG9jYXRpb24ocG9pbnRzLmdldEFsbG9jYXRpb24oKSk7CisgICAgICAgIHNtYi5hZGRJbmRleFR5cGUoUHJpbWl0aXZlLlBPSU5UKTsKKyAgICAgICAgTWVzaCBzbSA9IHNtYi5jcmVhdGUoKTsKKworICAgICAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdENfZm91bnRhaW4obVJTLCBtUmVzLCBSLnJhdy5mb3VudGFpbiwgdHJ1ZSk7CisgICAgICAgIG1TY3JpcHQuc2V0X3BhcnRNZXNoKHNtKTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX3BvaW50KHBvaW50cyk7CisgICAgICAgIG1SUy5jb250ZXh0QmluZFJvb3RTY3JpcHQobVNjcmlwdCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbmV3VG91Y2hQb3NpdGlvbihpbnQgeCwgaW50IHksIGludCByYXRlKSB7Ci0gICAgICAgIGlmIChtU0QucmF0ZSA9PSAwKSB7Ci0gICAgICAgICAgICBtU0QuciA9ICgoeCAmIDB4MSkgIT0gMCkgPyAwLmYgOiAxLmY7Ci0gICAgICAgICAgICBtU0QuZyA9ICgoeCAmIDB4MikgIT0gMCkgPyAwLmYgOiAxLmY7Ci0gICAgICAgICAgICBtU0QuYiA9ICgoeCAmIDB4NCkgIT0gMCkgPyAwLmYgOiAxLmY7Ci0gICAgICAgICAgICBpZiAoKG1TRC5yICsgbVNELmcgKyBtU0QuYikgPCAwLjlmKSB7Ci0gICAgICAgICAgICAgICAgbVNELnIgPSAwLjhmOwotICAgICAgICAgICAgICAgIG1TRC5nID0gMC41ZjsKLSAgICAgICAgICAgICAgICBtU0QuYiA9IDEuZjsKLSAgICAgICAgICAgIH0KKyAgICBib29sZWFuIGhvbGRpbmdDb2xvcltdID0gbmV3IGJvb2xlYW5bMTBdOworICAgIHB1YmxpYyB2b2lkIG5ld1RvdWNoUG9zaXRpb24oZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcHJlc3N1cmUsIGludCBpZCkgeworICAgICAgICBpZiAoaWQgPiBob2xkaW5nQ29sb3IubGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgbVNELnJhdGUgPSByYXRlOwotICAgICAgICBtU0QueCA9IHg7Ci0gICAgICAgIG1TRC55ID0geTsKLSAgICAgICAgbUludEFsbG9jLmRhdGEobVNEKTsKKyAgICAgICAgaW50IHJhdGUgPSAoaW50KShwcmVzc3VyZSAqIHByZXNzdXJlICogNTAwLmYpOworICAgICAgICBpZihyYXRlID4gNTAwKSB7CisgICAgICAgICAgICByYXRlID0gNTAwOworICAgICAgICB9CisgICAgICAgIGlmIChyYXRlID4gMCkgeworICAgICAgICAgICAgbVNjcmlwdC5pbnZva2VfYWRkUGFydGljbGVzKHJhdGUsIHgsIHksIGlkLCAhaG9sZGluZ0NvbG9yW2lkXSk7CisgICAgICAgICAgICBob2xkaW5nQ29sb3JbaWRdID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhvbGRpbmdDb2xvcltpZF0gPSBmYWxzZTsKKyAgICAgICAgfQorCiAgICAgfQotCi0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKLQotICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtSW50QWxsb2M7Ci0gICAgcHJpdmF0ZSBTaW1wbGVNZXNoIG1TTTsKLSAgICBwcml2YXRlIFNvbWVEYXRhIG1TRDsKLSAgICBwcml2YXRlIFR5cGUgbVNEVHlwZTsKLQotICAgIHByaXZhdGUgdm9pZCBpbml0UlMoKSB7Ci0gICAgICAgIG1TRCA9IG5ldyBTb21lRGF0YSgpOwotICAgICAgICBtU0RUeXBlID0gVHlwZS5jcmVhdGVGcm9tQ2xhc3MobVJTLCBTb21lRGF0YS5jbGFzcywgMSwgIlNvbWVEYXRhIik7Ci0gICAgICAgIG1JbnRBbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQobVJTLCBtU0RUeXBlKTsKLSAgICAgICAgbVNELmNvdW50ID0gUEFSVF9DT1VOVDsKLSAgICAgICAgbUludEFsbG9jLmRhdGEobVNEKTsKLQotICAgICAgICBFbGVtZW50LkJ1aWxkZXIgZWIgPSBuZXcgRWxlbWVudC5CdWlsZGVyKG1SUyk7Ci0gICAgICAgIGViLmFkZChFbGVtZW50LmNyZWF0ZVZlY3RvcihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsIDIpLCAiZGVsdGEiKTsKLSAgICAgICAgZWIuYWRkKEVsZW1lbnQuY3JlYXRlQXR0cmliKG1SUywgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiwgRWxlbWVudC5EYXRhS2luZC5QT1NJVElPTiwgMiksICJwb3NpdGlvbiIpOwotICAgICAgICBlYi5hZGQoRWxlbWVudC5jcmVhdGVBdHRyaWIobVJTLCBFbGVtZW50LkRhdGFUeXBlLlVOU0lHTkVEXzgsIEVsZW1lbnQuRGF0YUtpbmQuQ09MT1IsIDQpLCAiY29sb3IiKTsKLSAgICAgICAgRWxlbWVudCBwcmltRWxlbWVudCA9IGViLmNyZWF0ZSgpOwotCi0KLSAgICAgICAgU2ltcGxlTWVzaC5CdWlsZGVyIHNtYiA9IG5ldyBTaW1wbGVNZXNoLkJ1aWxkZXIobVJTKTsKLSAgICAgICAgaW50IHZ0eFNsb3QgPSBzbWIuYWRkVmVydGV4VHlwZShwcmltRWxlbWVudCwgUEFSVF9DT1VOVCk7Ci0gICAgICAgIHNtYi5zZXRQcmltaXRpdmUoUHJpbWl0aXZlLlBPSU5UKTsKLSAgICAgICAgbVNNID0gc21iLmNyZWF0ZSgpOwotICAgICAgICBtU00uc2V0TmFtZSgiUGFydE1lc2giKTsKLQotICAgICAgICBBbGxvY2F0aW9uIHBhcnRBbGxvYyA9IG1TTS5jcmVhdGVWZXJ0ZXhBbGxvY2F0aW9uKHZ0eFNsb3QpOwotICAgICAgICBwYXJ0QWxsb2Muc2V0TmFtZSgiUGFydEJ1ZmZlciIpOwotICAgICAgICBtU00uYmluZFZlcnRleEFsbG9jYXRpb24ocGFydEFsbG9jLCAwKTsKLQotICAgICAgICAvLyBBbGwgc2V0dXAgb2YgbmFtZWQgb2JqZWN0cyBzaG91bGQgYmUgZG9uZSBieSB0aGlzIHBvaW50Ci0gICAgICAgIC8vIGJlY2F1c2Ugd2UgYXJlIGFib3V0IHRvIGNvbXBpbGUgdGhlIHNjcmlwdC4KLSAgICAgICAgU2NyaXB0Qy5CdWlsZGVyIHNiID0gbmV3IFNjcmlwdEMuQnVpbGRlcihtUlMpOwotICAgICAgICBzYi5zZXRTY3JpcHQobVJlcywgUi5yYXcuZm91bnRhaW4pOwotICAgICAgICBzYi5zZXRSb290KHRydWUpOwotICAgICAgICBzYi5zZXRUeXBlKG1TRFR5cGUsICJDb250cm9sIiwgMCk7Ci0gICAgICAgIHNiLnNldFR5cGUobVNNLmdldFZlcnRleFR5cGUoMCksICJwb2ludCIsIDEpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gc2IuY3JlYXRlKCk7Ci0gICAgICAgIHNjcmlwdC5zZXRDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYpOwotCi0gICAgICAgIHNjcmlwdC5iaW5kQWxsb2NhdGlvbihtSW50QWxsb2MsIDApOwotICAgICAgICBzY3JpcHQuYmluZEFsbG9jYXRpb24ocGFydEFsbG9jLCAxKTsKLSAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChzY3JpcHQpOwotICAgIH0KLQogfQotCi0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5WaWV3LmphdmEgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluVmlldy5qYXZhCmluZGV4IGRmZDZhNDkuLmMxNDExNjU2YiAxMDA2NDQKLS0tIGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblZpZXcuamF2YQorKysgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluVmlldy5qYXZhCkBAIC03MSwxNyArNzEsMzMgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpCiAgICAgewotICAgICAgICBpbnQgYWN0ID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIGludCBhY3QgPSBldi5nZXRBY3Rpb25NYXNrZWQoKTsKICAgICAgICAgaWYgKGFjdCA9PSBldi5BQ1RJT05fVVApIHsKLSAgICAgICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbigwLCAwLCAwKTsKKyAgICAgICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbigwLCAwLCAwLCBldi5nZXRQb2ludGVySWQoMCkpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKGFjdCA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUCkgeworICAgICAgICAgICAgLy8gb25seSBvbmUgcG9pbnRlciBnb2luZyB1cCwgd2UgY2FuIGdldCB0aGUgaW5kZXggbGlrZSB0aGlzCisgICAgICAgICAgICBpbnQgcG9pbnRlckluZGV4ID0gZXYuZ2V0QWN0aW9uSW5kZXgoKTsKKyAgICAgICAgICAgIGludCBwb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQocG9pbnRlckluZGV4KTsKKyAgICAgICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbigwLCAwLCAwLCBwb2ludGVySWQpOwogICAgICAgICB9Ci0gICAgICAgIGZsb2F0IHJhdGUgPSAoZXYuZ2V0UHJlc3N1cmUoKSAqIDUwLmYpOwotICAgICAgICByYXRlICo9IHJhdGU7Ci0gICAgICAgIGlmKHJhdGUgPiAyMDAwLmYpIHsKLSAgICAgICAgICAgIHJhdGUgPSAyMDAwLmY7CisgICAgICAgIGludCBjb3VudCA9IGV2LmdldEhpc3RvcnlTaXplKCk7CisgICAgICAgIGludCBwY291bnQgPSBldi5nZXRQb2ludGVyQ291bnQoKTsKKworICAgICAgICBmb3IgKGludCBwPTA7IHAgPCBwY291bnQ7IHArKykgeworICAgICAgICAgICAgaW50IGlkID0gZXYuZ2V0UG9pbnRlcklkKHApOworICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKGV2LmdldFgocCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuZ2V0WShwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5nZXRQcmVzc3VyZShwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oZXYuZ2V0SGlzdG9yaWNhbFgocCwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldEhpc3RvcmljYWxZKHAsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5nZXRIaXN0b3JpY2FsUHJlc3N1cmUocCwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oKGludClldi5nZXRYKCksIChpbnQpZXYuZ2V0WSgpLCAoaW50KXJhdGUpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL2ZvdW50YWluLnJzIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9mb3VudGFpbi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTJjYjdhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9mb3VudGFpbi5ycwpAQCAtMCwwICsxLDcyIEBACisvLyBGb3VudGFpbiB0ZXN0IHNjcmlwdAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQuZm91bnRhaW4pCisKKyNwcmFnbWEgc3RhdGVGcmFnbWVudChwYXJlbnQpCisKKyNpbmNsdWRlICJyc19ncmFwaGljcy5yc2giCisKK3N0YXRpYyBpbnQgbmV3UGFydCA9IDA7Cityc19tZXNoIHBhcnRNZXNoOworCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSBQb2ludCB7CisgICAgZmxvYXQyIGRlbHRhOworICAgIGZsb2F0MiBwb3NpdGlvbjsKKyAgICB1Y2hhcjQgY29sb3I7Cit9IFBvaW50X3Q7CitQb2ludF90ICpwb2ludDsKKworI3ByYWdtYSBycyBleHBvcnRfdmFyKHBvaW50LCBwYXJ0TWVzaCkKKyNwcmFnbWEgcnMgZXhwb3J0X2Z1bmMoYWRkUGFydGljbGVzKQorCitpbnQgcm9vdCgpIHsKKyAgICBmbG9hdCBkdCA9IG1pbihyc0dldER0KCksIDAuMWYpOworICAgIHJzZ0NsZWFyQ29sb3IoMC5mLCAwLmYsIDAuZiwgMS5mKTsKKyAgICBjb25zdCBmbG9hdCBoZWlnaHQgPSByc2dHZXRIZWlnaHQoKTsKKyAgICBjb25zdCBpbnQgc2l6ZSA9IHJzQWxsb2NhdGlvbkdldERpbVgocnNHZXRBbGxvY2F0aW9uKHBvaW50KSk7CisgICAgZmxvYXQgZHkyID0gZHQgKiAoMTAuZik7CisgICAgUG9pbnRfdCAqIHAgPSBwb2ludDsKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IHNpemU7IGN0KyspIHsKKyAgICAgICAgcC0+ZGVsdGEueSArPSBkeTI7CisgICAgICAgIHAtPnBvc2l0aW9uICs9IHAtPmRlbHRhOworICAgICAgICBpZiAoKHAtPnBvc2l0aW9uLnkgPiBoZWlnaHQpICYmIChwLT5kZWx0YS55ID4gMCkpIHsKKyAgICAgICAgICAgIHAtPmRlbHRhLnkgKj0gLTAuM2Y7CisgICAgICAgIH0KKyAgICAgICAgcCsrOworICAgIH0KKworICAgIHJzZ0RyYXdNZXNoKHBhcnRNZXNoKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGZsb2F0NCBwYXJ0Q29sb3JbMTBdOwordm9pZCBhZGRQYXJ0aWNsZXMoaW50IHJhdGUsIGZsb2F0IHgsIGZsb2F0IHksIGludCBpbmRleCwgYm9vbCBuZXdDb2xvcikKK3sKKyAgICBpZiAobmV3Q29sb3IpIHsKKyAgICAgICAgcGFydENvbG9yW2luZGV4XS54ID0gcnNSYW5kKDAuNWYsIDEuMGYpOworICAgICAgICBwYXJ0Q29sb3JbaW5kZXhdLnkgPSByc1JhbmQoMS4wZik7CisgICAgICAgIHBhcnRDb2xvcltpbmRleF0ueiA9IHJzUmFuZCgxLjBmKTsKKyAgICB9CisgICAgZmxvYXQgck1heCA9ICgoZmxvYXQpcmF0ZSkgKiAwLjAyZjsKKyAgICBpbnQgc2l6ZSA9IHJzQWxsb2NhdGlvbkdldERpbVgocnNHZXRBbGxvY2F0aW9uKHBvaW50KSk7CisgICAgdWNoYXI0IGMgPSByc1BhY2tDb2xvclRvODg4OChwYXJ0Q29sb3JbaW5kZXhdKTsKKworICAgIFBvaW50X3QgKiBucCA9ICZwb2ludFtuZXdQYXJ0XTsKKyAgICBmbG9hdDIgcCA9IHt4LCB5fTsKKyAgICB3aGlsZSAocmF0ZS0tKSB7CisgICAgICAgIGZsb2F0IGFuZ2xlID0gcnNSYW5kKDMuMTRmICogMi5mKTsKKyAgICAgICAgZmxvYXQgbGVuID0gcnNSYW5kKHJNYXgpOworICAgICAgICBucC0+ZGVsdGEueCA9IGxlbiAqIHNpbihhbmdsZSk7CisgICAgICAgIG5wLT5kZWx0YS55ID0gbGVuICogY29zKGFuZ2xlKTsKKyAgICAgICAgbnAtPnBvc2l0aW9uID0gcDsKKyAgICAgICAgbnAtPmNvbG9yID0gYzsKKyAgICAgICAgbmV3UGFydCsrOworICAgICAgICBucCsrOworICAgICAgICBpZiAobmV3UGFydCA+PSBzaXplKSB7CisgICAgICAgICAgICBuZXdQYXJ0ID0gMDsKKyAgICAgICAgICAgIG5wID0gJnBvaW50W25ld1BhcnRdOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL0FuZHJvaWQubWsgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL0FuZHJvaWQubWsKaW5kZXggODMzNDI3Yi4uN2ZhMzBkMCAxMDA2NDQKLS0tIGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9BbmRyb2lkLm1rCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvQW5kcm9pZC5tawpAQCAtMTQsMTQgKzE0LDE5IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorCiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCisgICAgICAgICAgICAgICAgICAgJChjYWxsIGFsbC1yZW5kZXJzY3JpcHQtZmlsZXMtdW5kZXIsIHNyYykKICNMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC5yZW5kZXJzY3JpcHQKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEltYWdlUHJvY2Vzc2luZwogCiBpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBiNDhkMjA4Li5kNmEyZGI0IDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC02LDcgKzYsOCBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KIAogICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJJbWFnZSBQcm9jZXNzaW5nIj4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJJbWFnZVByb2Nlc3NpbmdBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249InBvcnRyYWl0Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL2RyYXdhYmxlL2RhdGEuanBnIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvZHJhd2FibGUvZGF0YS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhODdiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL2RyYXdhYmxlL2RhdGEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL2xheW91dC9tYWluLnhtbCBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL2xheW91dC9tYWluLnhtbAppbmRleCA2NzcwYzE4Li5jNmVjNzI5IDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9sYXlvdXQvbWFpbi54bWwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvbGF5b3V0L21haW4ueG1sCkBAIC0yNSw5ICsyNSwxNDcgQEAKICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kaXNwbGF5IgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzIwZGlwIgogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI2NmRpcCIgLz4KLSAgICAKKworICAgIDxCdXR0b24KKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxNzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDBkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9iZW5jaG1hcmsiCisgICAgICAgIGFuZHJvaWQ6b25DbGljaz0iYmVuY2htYXJrIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JlbmNobWFya1RleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMDBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTc1ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zYXR1cmF0aW9uIi8+CisKKyAgICAgPFNlZWtCYXIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pblNhdHVyYXRpb24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTQwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5TYXR1cmF0aW9uVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjE0MmRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiMwMDAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NhdHVyYXRpb24iLz4KKwogICAgIDxTZWVrQmFyCi0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGhyZXNob2xkIgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2luR2FtbWEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5HYW1tYVRleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxMTJkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9nYW1tYSIvPgorCisgICAgPFNlZWtCYXIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdXRXaGl0ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTcwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdXRXaGl0ZVRleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIyMjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iODJkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9vdXRfd2hpdGUiLz4KKworICAgIDxTZWVrQmFyCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5XaGl0ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxNzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pbldoaXRlVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjgyZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iIzAwMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvaW5fd2hpdGUiLz4KKworICAgIDxTZWVrQmFyCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb3V0QmxhY2siCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjE3MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb3V0QmxhY2tUZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMjIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjUyZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iIzAwMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvb3V0X2JsYWNrIi8+CisKKyAgICA8U2Vla0JhcgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2luQmxhY2siCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTcwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5CbGFja1RleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI1MmRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiMwMDAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2luX2JsYWNrIi8+CisKKyAgICA8U2Vla0JhcgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3JhZGl1cyIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxMGRpcCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxMGRpcCIKQEAgLTM1LDQgKzE3MywxNSBAQAogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgogCisgICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JsdXJUZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTJkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9ibHVyX2Rlc2NyaXB0aW9uIi8+CisKIDwvbWVyZ2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvcmF3L3RocmVzaG9sZC5ycyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL3Jhdy90aHJlc2hvbGQucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OGYwY2QuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvcmF3L3RocmVzaG9sZC5ycworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0vLyBibG9jayBvZiBkZWZpbmVzIG1hdGNoaW5nIHdoYXQgUlMgd2lsbCBpbnNlcnQgYXQgcnVudGltZS4KLXN0cnVjdCBQYXJhbXNfc3sKLSAgICBpbnQgaW5IZWlnaHQ7Ci0gICAgaW50IGluV2lkdGg7Ci0gICAgaW50IG91dEhlaWdodDsKLSAgICBpbnQgb3V0V2lkdGg7Ci0gICAgZmxvYXQgdGhyZXNob2xkOwotfTsKLXN0cnVjdCBQYXJhbXNfcyAqIFBhcmFtczsKLXN0cnVjdCBJblBpeGVsX3N7Ci0gICAgY2hhciBhOwotICAgIGNoYXIgYjsKLSAgICBjaGFyIGc7Ci0gICAgY2hhciByOwotfTsKLXN0cnVjdCBJblBpeGVsX3MgKiBJblBpeGVsOwotc3RydWN0IE91dFBpeGVsX3N7Ci0gICAgY2hhciBhOwotICAgIGNoYXIgYjsKLSAgICBjaGFyIGc7Ci0gICAgY2hhciByOwotfTsKLXN0cnVjdCBPdXRQaXhlbF9zICogT3V0UGl4ZWw7Ci0qLwotCi1zdHJ1Y3QgY29sb3JfcyB7Ci0gICAgY2hhciBiOwotICAgIGNoYXIgZzsKLSAgICBjaGFyIHI7Ci0gICAgY2hhciBhOwotfTsKLQotdm9pZCBtYWluKCkgewotICAgIGludCB0ID0gdXB0aW1lTWlsbGlzKCk7Ci0KLSAgICBzdHJ1Y3QgY29sb3JfcyAqaW4gPSAoc3RydWN0IGNvbG9yX3MgKikgSW5QaXhlbDsKLSAgICBzdHJ1Y3QgY29sb3JfcyAqb3V0ID0gKHN0cnVjdCBjb2xvcl9zICopIE91dFBpeGVsOwotCi0gICAgaW50IGNvdW50ID0gUGFyYW1zLT5pbldpZHRoICogUGFyYW1zLT5pbkhlaWdodDsKLSAgICBpbnQgaTsKLSAgICBmbG9hdCB0aHJlc2hvbGQgPSAoUGFyYW1zLT50aHJlc2hvbGQgKiAyNTUuZik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBmbG9hdCBsdW1pbmFuY2UgPSAwLjIxMjVmICogaW4tPnIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcxNTRmICogaW4tPmcgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA3MjFmICogaW4tPmI7Ci0gICAgICAgIGlmIChsdW1pbmFuY2UgPiB0aHJlc2hvbGQpIHsKLSAgICAgICAgICAgICpvdXQgPSAqaW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqKChpbnQgKilvdXQpID0gKigoaW50ICopaW4pICYgMHhmZjAwMDAwMDsKLSAgICAgICAgfQotCi0gICAgICAgIGluKys7Ci0gICAgICAgIG91dCsrOwotICAgIH0KLQotICAgIHQ9IHVwdGltZU1pbGxpcygpIC0gdDsKLSAgICBkZWJ1Z0kzMigiRmlsdGVyIHRpbWUiLCB0KTsKLQotICAgIHNlbmRUb0NsaWVudCgmY291bnQsIDEsIDQsIDApOwotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNWNjNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8cmVzb3VyY2VzIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8IS0tIEdlbmVyYWwgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tc2xpZGVyIGxhYmVsIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iYmx1cl9kZXNjcmlwdGlvbiI+Qmx1ciBSYWRpdXM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImluX3doaXRlIj5JbiBXaGl0ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ib3V0X3doaXRlIj5PdXQgV2hpdGU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImluX2JsYWNrIj5JbiBCbGFjazwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ib3V0X2JsYWNrIj5PdXQgQmxhY2s8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImdhbW1hIj5HYW1tYTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2F0dXJhdGlvbiI+U2F0dXJhdGlvbjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmVuY2htYXJrIj5CZW5jaG1hcms8L3N0cmluZz4KKworPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9JbWFnZVByb2Nlc3NpbmdBY3Rpdml0eS5qYXZhIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkuamF2YQppbmRleCA5Y2U1M2Q4Li5lODA2OTY5IDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9JbWFnZVByb2Nlc3NpbmdBY3Rpdml0eS5qYXZhCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0ltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5LmphdmEKQEAgLTMxLDUzICszMSw1NiBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGphdmEubGFuZy5NYXRoOwogCi1wdWJsaWMgY2xhc3MgSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSBpbXBsZW1lbnRzIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2sgewotICAgIHByaXZhdGUgQml0bWFwIG1CaXRtYXA7Ci0gICAgcHJpdmF0ZSBQYXJhbXMgbVBhcmFtczsKLSAgICBwcml2YXRlIFNjcmlwdC5JbnZva2FibGUgbUludm9rYWJsZTsKLSAgICBwcml2YXRlIGludFtdIG1JbkRhdGE7Ci0gICAgcHJpdmF0ZSBpbnRbXSBtT3V0RGF0YTsKK3B1YmxpYyBjbGFzcyBJbWFnZVByb2Nlc3NpbmdBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyIHsKKyAgICBwcml2YXRlIEJpdG1hcCBtQml0bWFwSW47CisgICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcE91dDsKKyAgICBwcml2YXRlIEJpdG1hcCBtQml0bWFwU2NyYXRjaDsKKyAgICBwcml2YXRlIFNjcmlwdENfdGhyZXNob2xkIG1TY3JpcHQ7CisgICAgcHJpdmF0ZSBTY3JpcHRDX3ZlcnRpY2FsX2JsdXIgbVNjcmlwdFZCbHVyOworICAgIHByaXZhdGUgU2NyaXB0Q19ob3Jpem9udGFsX2JsdXIgbVNjcmlwdEhCbHVyOworICAgIHByaXZhdGUgaW50IG1SYWRpdXMgPSAwOworICAgIHByaXZhdGUgU2Vla0JhciBtUmFkaXVzU2Vla0JhcjsKKworICAgIHByaXZhdGUgZmxvYXQgbUluQmxhY2sgPSAwLjBmOworICAgIHByaXZhdGUgU2Vla0JhciBtSW5CbGFja1NlZWtCYXI7CisgICAgcHJpdmF0ZSBmbG9hdCBtT3V0QmxhY2sgPSAwLjBmOworICAgIHByaXZhdGUgU2Vla0JhciBtT3V0QmxhY2tTZWVrQmFyOworICAgIHByaXZhdGUgZmxvYXQgbUluV2hpdGUgPSAyNTUuMGY7CisgICAgcHJpdmF0ZSBTZWVrQmFyIG1JbldoaXRlU2Vla0JhcjsKKyAgICBwcml2YXRlIGZsb2F0IG1PdXRXaGl0ZSA9IDI1NS4wZjsKKyAgICBwcml2YXRlIFNlZWtCYXIgbU91dFdoaXRlU2Vla0JhcjsKKyAgICBwcml2YXRlIGZsb2F0IG1HYW1tYSA9IDEuMGY7CisgICAgcHJpdmF0ZSBTZWVrQmFyIG1HYW1tYVNlZWtCYXI7CisKKyAgICBwcml2YXRlIGZsb2F0IG1TYXR1cmF0aW9uID0gMS4wZjsKKyAgICBwcml2YXRlIFNlZWtCYXIgbVNhdHVyYXRpb25TZWVrQmFyOworCisgICAgcHJpdmF0ZSBUZXh0VmlldyBtQmVuY2htYXJrUmVzdWx0OwogCiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKICAgICBwcml2YXRlIFJlbmRlclNjcmlwdCBtUlM7CiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKLSAgICBwcml2YXRlIFR5cGUgbVBhcmFtc1R5cGU7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbVBhcmFtc0FsbG9jYXRpb247Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKICAgICBwcml2YXRlIFR5cGUgbVBpeGVsVHlwZTsKICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkZpZWxkQ2FuQmVMb2NhbCJ9KQogICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtSW5QaXhlbHNBbGxvY2F0aW9uOwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCiAgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1PdXRQaXhlbHNBbGxvY2F0aW9uOworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1TY3JhdGNoUGl4ZWxzQWxsb2NhdGlvbjE7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1TY3JhdGNoUGl4ZWxzQWxsb2NhdGlvbjI7CiAKICAgICBwcml2YXRlIFN1cmZhY2VWaWV3IG1TdXJmYWNlVmlldzsKICAgICBwcml2YXRlIEltYWdlVmlldyBtRGlzcGxheVZpZXc7CiAKLSAgICBzdGF0aWMgY2xhc3MgUGFyYW1zIHsKLSAgICAgICAgcHVibGljIGludCBpbldpZHRoOwotICAgICAgICBwdWJsaWMgaW50IG91dFdpZHRoOwotICAgICAgICBwdWJsaWMgaW50IGluSGVpZ2h0OwotICAgICAgICBwdWJsaWMgaW50IG91dEhlaWdodDsKLQotICAgICAgICBwdWJsaWMgZmxvYXQgdGhyZXNob2xkOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBQaXhlbCB7Ci0gICAgICAgIHB1YmxpYyBieXRlIGE7Ci0gICAgICAgIHB1YmxpYyBieXRlIHI7Ci0gICAgICAgIHB1YmxpYyBieXRlIGc7Ci0gICAgICAgIHB1YmxpYyBieXRlIGI7Ci0gICAgfQotCiAgICAgY2xhc3MgRmlsdGVyQ2FsbGJhY2sgZXh0ZW5kcyBSZW5kZXJTY3JpcHQuUlNNZXNzYWdlIHsKICAgICAgICAgcHJpdmF0ZSBSdW5uYWJsZSBtQWN0aW9uID0gbmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIG1PdXRQaXhlbHNBbGxvY2F0aW9uLnJlYWREYXRhKG1PdXREYXRhKTsKLSAgICAgICAgICAgICAgICBtQml0bWFwLnNldFBpeGVscyhtT3V0RGF0YSwgMCwgbVBhcmFtcy5vdXRXaWR0aCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbXMub3V0V2lkdGgsIG1QYXJhbXMub3V0SGVpZ2h0KTsKICAgICAgICAgICAgICAgICBtRGlzcGxheVZpZXcuaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9OwpAQCAtODksMjkgKzkyLDIxOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGphdmFGaWx0ZXIoKSB7CisgICAgaW50IGluW107CisgICAgaW50IGludGVybVtdOworICAgIGludCBvdXRbXTsKKyAgICBpbnQgTUFYX1JBRElVUyA9IDI1OworICAgIC8vIFN0b3JlIG91ciBjb2VmZmljaWVudHMgaGVyZQorICAgIGZsb2F0IGdhdXNzaWFuW107CisKKyAgICBwcml2YXRlIGxvbmcgamF2YUZpbHRlcigpIHsKKyAgICAgICAgZmluYWwgaW50IHdpZHRoID0gbUJpdG1hcEluLmdldFdpZHRoKCk7CisgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBtQml0bWFwSW4uZ2V0SGVpZ2h0KCk7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHdpZHRoICogaGVpZ2h0OworCisgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICAgICAgICBpbiA9IG5ldyBpbnRbY291bnRdOworICAgICAgICAgICAgaW50ZXJtID0gbmV3IGludFtjb3VudF07CisgICAgICAgICAgICBvdXQgPSBuZXcgaW50W2NvdW50XTsKKyAgICAgICAgICAgIGdhdXNzaWFuID0gbmV3IGZsb2F0W01BWF9SQURJVVMgKiAyICsgMV07CisgICAgICAgICAgICBtQml0bWFwSW4uZ2V0UGl4ZWxzKGluLCAwLCB3aWR0aCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0KKwogICAgICAgICBsb25nIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGludCBjb3VudCA9IG1QYXJhbXMuaW5XaWR0aCAqIG1QYXJhbXMuaW5IZWlnaHQ7Ci0gICAgICAgIGZsb2F0IHRocmVzaG9sZCA9IG1QYXJhbXMudGhyZXNob2xkICogMjU1LmY7CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCByID0gKGZsb2F0KSgobUluRGF0YVtpXSA+PiAwKSAmIDB4ZmYpOwotICAgICAgICAgICAgZmluYWwgZmxvYXQgZyA9IChmbG9hdCkoKG1JbkRhdGFbaV0gPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IGIgPSAoZmxvYXQpKChtSW5EYXRhW2ldID4+IDE2KSAmIDB4ZmYpOworICAgICAgICBpbnQgdywgaCwgcjsKIAotICAgICAgICAgICAgZmluYWwgZmxvYXQgbHVtaW5hbmNlID0gMC4yMTI1ZiAqIHIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43MTU0ZiAqIGcgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNzIxZiAqIGI7Ci0gICAgICAgICAgICBpZiAobHVtaW5hbmNlID4gdGhyZXNob2xkKSB7Ci0gICAgICAgICAgICAgICAgbU91dERhdGFbaV0gPSBtSW5EYXRhW2ldOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtT3V0RGF0YVtpXSA9IG1JbkRhdGFbaV0gJiAweGZmMDAwMDAwOworICAgICAgICBmbG9hdCBmUmFkaXVzID0gKGZsb2F0KW1SYWRpdXM7CisgICAgICAgIGludCByYWRpdXMgPSAoaW50KW1SYWRpdXM7CisKKyAgICAgICAgLy8gQ29tcHV0ZSBnYXVzc2lhbiB3ZWlnaHRzIGZvciB0aGUgYmx1cgorICAgICAgICAvLyBlIGlzIHRoZSBldWxlcidzIG51bWJlcgorICAgICAgICBmbG9hdCBlID0gMi43MTgyODE4Mjg0NTkwNDVmOworICAgICAgICBmbG9hdCBwaSA9IDMuMTQxNTkyNjUzNTg5NzkzMmY7CisgICAgICAgIC8vIGcoeCkgPSAoIDEgLyBzcXJ0KCAyICogcGkgKSAqIHNpZ21hKSAqIGUgXiAoIC14XjIgLyAyICogc2lnbWFeMiApCisgICAgICAgIC8vIHggaXMgb2YgdGhlIGZvcm0gWy1yYWRpdXMgLi4gMCAuLiByYWRpdXNdCisgICAgICAgIC8vIGFuZCBzaWdtYSB2YXJpZXMgd2l0aCByYWRpdXMuCisgICAgICAgIC8vIEJhc2VkIG9uIHNvbWUgZXhwZXJpbWVudGFsIHJhZGl1cyB2YWx1ZXMgYW5kIHNpZ21hJ3MKKyAgICAgICAgLy8gd2UgYXBwcm94aW1hdGVseSBmaXQgc2lnbWEgPSBmKHJhZGl1cykgYXMKKyAgICAgICAgLy8gc2lnbWEgPSByYWRpdXMgKiAwLjQgICsgMC42CisgICAgICAgIC8vIFRoZSBsYXJnZXIgdGhlIHJhZGl1cyBnZXRzLCB0aGUgbW9yZSBvdXIgZ2F1c3NpYW4gYmx1cgorICAgICAgICAvLyB3aWxsIHJlc2VtYmxlIGEgYm94IGJsdXIgc2luY2Ugd2l0aCBsYXJnZSBzaWdtYQorICAgICAgICAvLyB0aGUgZ2F1c3NpYW4gY3VydmUgYmVnaW5zIHRvIGxvc2UgaXRzIHNoYXBlCisgICAgICAgIGZsb2F0IHNpZ21hID0gMC40ZiAqIGZSYWRpdXMgKyAwLjZmOworICAgICAgICAvLyBOb3cgY29tcHV0ZSB0aGUgY29lZmZpY2ludHMKKyAgICAgICAgLy8gV2Ugd2lsbCBzdG9yZSBzb21lIHJlZHVuZGFudCB2YWx1ZXMgdG8gc2F2ZSBzb21lIG1hdGggZHVyaW5nCisgICAgICAgIC8vIHRoZSBibHVyIGNhbGN1bGF0aW9ucworICAgICAgICAvLyBwcmVjb21wdXRlIHNvbWUgdmFsdWVzCisgICAgICAgIGZsb2F0IGNvZWZmMSA9IDEuMGYgLyAoZmxvYXQpKE1hdGguc3FydCggMi4wZiAqIHBpICkgKiBzaWdtYSk7CisgICAgICAgIGZsb2F0IGNvZWZmMiA9IC0gMS4wZiAvICgyLjBmICogc2lnbWEgKiBzaWdtYSk7CisgICAgICAgIGZsb2F0IG5vcm1hbGl6ZUZhY3RvciA9IDAuMGY7CisgICAgICAgIGZsb2F0IGZsb2F0UiA9IDAuMGY7CisgICAgICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgIGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICAgICAgZ2F1c3NpYW5bciArIHJhZGl1c10gPSBjb2VmZjEgKiAoZmxvYXQpTWF0aC5wb3coZSwgZmxvYXRSICogZmxvYXRSICogY29lZmYyKTsKKyAgICAgICAgICAgIG5vcm1hbGl6ZUZhY3RvciArPSBnYXVzc2lhbltyICsgcmFkaXVzXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vTm93IHdlIG5lZWQgdG8gbm9ybWFsaXplIHRoZSB3ZWlnaHRzIGJlY2F1c2UgYWxsIG91ciBjb2VmZmljaWVudHMgbmVlZCB0byBhZGQgdXAgdG8gb25lCisgICAgICAgIG5vcm1hbGl6ZUZhY3RvciA9IDEuMGYgLyBub3JtYWxpemVGYWN0b3I7CisgICAgICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgIGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICAgICAgZ2F1c3NpYW5bciArIHJhZGl1c10gKj0gbm9ybWFsaXplRmFjdG9yOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgYmx1cnJlZFBpeGVsUiA9IDAuMGY7CisgICAgICAgIGZsb2F0IGJsdXJyZWRQaXhlbEcgPSAwLjBmOworICAgICAgICBmbG9hdCBibHVycmVkUGl4ZWxCID0gMC4wZjsKKyAgICAgICAgZmxvYXQgYmx1cnJlZFBpeGVsQSA9IDAuMGY7CisKKyAgICAgICAgZm9yKGggPSAwOyBoIDwgaGVpZ2h0OyBoICsrKSB7CisgICAgICAgICAgICBmb3IodyA9IDA7IHcgPCB3aWR0aDsgdyArKykgeworCisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsUiA9IDAuMGY7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsRyA9IDAuMGY7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQiA9IDAuMGY7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQSA9IDAuMGY7CisKKyAgICAgICAgICAgICAgICBmb3IociA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXBwaW5nIGxlZnQgYW5kIHJpZ2h0IGF3YXkgZnJvbSB0aGUgcGl4ZWwKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbGlkVyA9IHcgKyByOworICAgICAgICAgICAgICAgICAgICAvLyBDbGFtcCB0byB6ZXJvIGFuZCB3aWR0aCBtYXgoKSBpc24ndCBleHBvc2VkIGZvciBpbnRzIHlldAorICAgICAgICAgICAgICAgICAgICBpZih2YWxpZFcgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFcgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkVyA+IHdpZHRoIC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRXID0gd2lkdGggLSAxOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0ID0gaW5baCp3aWR0aCArIHZhbGlkV107CisKKyAgICAgICAgICAgICAgICAgICAgaW50IFIgPSAoKGlucHV0ID4+IDI0KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBpbnQgRyA9ICgoaW5wdXQgPj4gMTYpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIGludCBCID0gKChpbnB1dCA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBpbnQgQSA9IChpbnB1dCAmIDB4ZmYpOworCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdlaWdodCA9IGdhdXNzaWFuW3IgKyByYWRpdXNdOworCisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbFIgKz0gKGZsb2F0KShSKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEcgKz0gKGZsb2F0KShHKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEIgKz0gKGZsb2F0KShCKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEEgKz0gKGZsb2F0KShBKSp3ZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IFIgPSAoaW50KWJsdXJyZWRQaXhlbFI7CisgICAgICAgICAgICAgICAgaW50IEcgPSAoaW50KWJsdXJyZWRQaXhlbEc7CisgICAgICAgICAgICAgICAgaW50IEIgPSAoaW50KWJsdXJyZWRQaXhlbEI7CisgICAgICAgICAgICAgICAgaW50IEEgPSAoaW50KWJsdXJyZWRQaXhlbEE7CisKKyAgICAgICAgICAgICAgICBpbnRlcm1baCp3aWR0aCArIHddID0gKFIgPDwgMjQpIHwgKEcgPDwgMTYpIHwgKEIgPDwgOCkgfCAoQSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoaCA9IDA7IGggPCBoZWlnaHQ7IGggKyspIHsKKyAgICAgICAgICAgIGZvcih3ID0gMDsgdyA8IHdpZHRoOyB3ICsrKSB7CisKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxSID0gMC4wZjsKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxHID0gMC4wZjsKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxCID0gMC4wZjsKKyAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxBID0gMC4wZjsKKyAgICAgICAgICAgICAgICBmb3IociA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB2YWxpZEggPSBoICsgcjsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xhbXAgdG8gemVybyBhbmQgd2lkdGgKKyAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRIIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRIID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZih2YWxpZEggPiBoZWlnaHQgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEggPSBoZWlnaHQgLSAxOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0ID0gaW50ZXJtW3ZhbGlkSCp3aWR0aCArIHddOworCisgICAgICAgICAgICAgICAgICAgIGludCBSID0gKChpbnB1dCA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IEcgPSAoKGlucHV0ID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBpbnQgQiA9ICgoaW5wdXQgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IEEgPSAoaW5wdXQgJiAweGZmKTsKKworICAgICAgICAgICAgICAgICAgICBmbG9hdCB3ZWlnaHQgPSBnYXVzc2lhbltyICsgcmFkaXVzXTsKKworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxSICs9IChmbG9hdCkoUikqd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxHICs9IChmbG9hdCkoRykqd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxCICs9IChmbG9hdCkoQikqd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxBICs9IChmbG9hdCkoQSkqd2VpZ2h0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBSID0gKGludClibHVycmVkUGl4ZWxSOworICAgICAgICAgICAgICAgIGludCBHID0gKGludClibHVycmVkUGl4ZWxHOworICAgICAgICAgICAgICAgIGludCBCID0gKGludClibHVycmVkUGl4ZWxCOworICAgICAgICAgICAgICAgIGludCBBID0gKGludClibHVycmVkUGl4ZWxBOworCisgICAgICAgICAgICAgICAgb3V0W2gqd2lkdGggKyB3XSA9IChSIDw8IDI0KSB8IChHIDw8IDE2KSB8IChCIDw8IDgpIHwgKEEpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdCA9IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHQ7CisgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cudigiSW1nIiwgIkphdmEgZnJhbWUgdGltZSBtcyAiICsgdCk7CisgICAgICAgIG1CaXRtYXBPdXQuc2V0UGl4ZWxzKG91dCwgMCwgd2lkdGgsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICByZXR1cm4gdDsKKyAgICB9CiAKLSAgICAgICAgYW5kcm9pZC51dGlsLkxvZy52KCJJbWciLCAiZnJhbWUgdGltZSBtcyAiICsgdCk7CisgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBzZWVrQmFyLCBpbnQgcHJvZ3Jlc3MsIGJvb2xlYW4gZnJvbVVzZXIpIHsKKyAgICAgICAgaWYgKGZyb21Vc2VyKSB7CisKKyAgICAgICAgICAgIGlmKHNlZWtCYXIgPT0gbVJhZGl1c1NlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBmUmFkaXVzID0gcHJvZ3Jlc3MgLyAxMDAuMGY7CisgICAgICAgICAgICAgICAgZlJhZGl1cyAqPSAoZmxvYXQpKE1BWF9SQURJVVMpOworICAgICAgICAgICAgICAgIG1SYWRpdXMgPSAoaW50KWZSYWRpdXM7CisKKyAgICAgICAgICAgICAgICBtU2NyaXB0LnNldF9yYWRpdXMobVJhZGl1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHNlZWtCYXIgPT0gbUluQmxhY2tTZWVrQmFyKSB7CisgICAgICAgICAgICAgICAgbUluQmxhY2sgPSAoZmxvYXQpcHJvZ3Jlc3M7CisgICAgICAgICAgICAgICAgbVNjcmlwdFZCbHVyLmludm9rZV9zZXRMZXZlbHMobUluQmxhY2ssIG1PdXRCbGFjaywgbUluV2hpdGUsIG1PdXRXaGl0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHNlZWtCYXIgPT0gbU91dEJsYWNrU2Vla0JhcikgeworICAgICAgICAgICAgICAgIG1PdXRCbGFjayA9IChmbG9hdClwcm9ncmVzczsKKyAgICAgICAgICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldExldmVscyhtSW5CbGFjaywgbU91dEJsYWNrLCBtSW5XaGl0ZSwgbU91dFdoaXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoc2Vla0JhciA9PSBtSW5XaGl0ZVNlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBtSW5XaGl0ZSA9IChmbG9hdClwcm9ncmVzcyArIDEyNy4wZjsKKyAgICAgICAgICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldExldmVscyhtSW5CbGFjaywgbU91dEJsYWNrLCBtSW5XaGl0ZSwgbU91dFdoaXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoc2Vla0JhciA9PSBtT3V0V2hpdGVTZWVrQmFyKSB7CisgICAgICAgICAgICAgICAgbU91dFdoaXRlID0gKGZsb2F0KXByb2dyZXNzICsgMTI3LjBmOworICAgICAgICAgICAgICAgIG1TY3JpcHRWQmx1ci5pbnZva2Vfc2V0TGV2ZWxzKG1JbkJsYWNrLCBtT3V0QmxhY2ssIG1JbldoaXRlLCBtT3V0V2hpdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihzZWVrQmFyID09IG1HYW1tYVNlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBtR2FtbWEgPSAoZmxvYXQpcHJvZ3Jlc3MvMTAwLjBmOworICAgICAgICAgICAgICAgIG1HYW1tYSA9IE1hdGgubWF4KG1HYW1tYSwgMC4xZik7CisgICAgICAgICAgICAgICAgbUdhbW1hID0gMS4wZiAvIG1HYW1tYTsKKyAgICAgICAgICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldEdhbW1hKG1HYW1tYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHNlZWtCYXIgPT0gbVNhdHVyYXRpb25TZWVrQmFyKSB7CisgICAgICAgICAgICAgICAgbVNhdHVyYXRpb24gPSAoZmxvYXQpcHJvZ3Jlc3MgLyA1MC4wZjsKKyAgICAgICAgICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldFNhdHVyYXRpb24obVNhdHVyYXRpb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb25nIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBpZiAodHJ1ZSkgeworICAgICAgICAgICAgICAgIG1TY3JpcHQuaW52b2tlX2ZpbHRlcigpOworICAgICAgICAgICAgICAgIG1SUy5maW5pc2goKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgamF2YUZpbHRlcigpOworICAgICAgICAgICAgICAgIG1EaXNwbGF5Vmlldy5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0OworICAgICAgICAgICAgYW5kcm9pZC51dGlsLkxvZy52KCJJbWciLCAiUmVuZGVyc2NyaXB0IGZyYW1lIHRpbWUgY29yZSBtcyAiICsgdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgewogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTE5LDQ1ICszMTEsNTQgQEAKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKICAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubWFpbik7CiAKLSAgICAgICAgbUJpdG1hcCA9IGxvYWRCaXRtYXAoUi5kcmF3YWJsZS5kYXRhKTsKKyAgICAgICAgbUJpdG1hcEluID0gbG9hZEJpdG1hcChSLmRyYXdhYmxlLmRhdGEpOworICAgICAgICBtQml0bWFwT3V0ID0gbG9hZEJpdG1hcChSLmRyYXdhYmxlLmRhdGEpOworICAgICAgICBtQml0bWFwU2NyYXRjaCA9IGxvYWRCaXRtYXAoUi5kcmF3YWJsZS5kYXRhKTsKIAogICAgICAgICBtU3VyZmFjZVZpZXcgPSAoU3VyZmFjZVZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN1cmZhY2UpOwogICAgICAgICBtU3VyZmFjZVZpZXcuZ2V0SG9sZGVyKCkuYWRkQ2FsbGJhY2sodGhpcyk7CiAKICAgICAgICAgbURpc3BsYXlWaWV3ID0gKEltYWdlVmlldykgZmluZFZpZXdCeUlkKFIuaWQuZGlzcGxheSk7Ci0gICAgICAgIG1EaXNwbGF5Vmlldy5zZXRJbWFnZUJpdG1hcChtQml0bWFwKTsKKyAgICAgICAgbURpc3BsYXlWaWV3LnNldEltYWdlQml0bWFwKG1CaXRtYXBPdXQpOwogCi0gICAgICAgICgoU2Vla0JhcikgZmluZFZpZXdCeUlkKFIuaWQudGhyZXNob2xkKSkuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgbmV3IFNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChTZWVrQmFyIHNlZWtCYXIsIGludCBwcm9ncmVzcywgYm9vbGVhbiBmcm9tVXNlcikgewotICAgICAgICAgICAgICAgIGlmIChmcm9tVXNlcikgewotICAgICAgICAgICAgICAgICAgICBtUGFyYW1zLnRocmVzaG9sZCA9IHByb2dyZXNzIC8gMTAwLjBmOwotICAgICAgICAgICAgICAgICAgICBtUGFyYW1zQWxsb2NhdGlvbi5kYXRhKG1QYXJhbXMpOworICAgICAgICBtUmFkaXVzU2Vla0JhciA9IChTZWVrQmFyKSBmaW5kVmlld0J5SWQoUi5pZC5yYWRpdXMpOworICAgICAgICBtUmFkaXVzU2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUludm9rYWJsZS5leGVjdXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhRmlsdGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQml0bWFwLnNldFBpeGVscyhtT3V0RGF0YSwgMCwgbVBhcmFtcy5vdXRXaWR0aCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtcy5vdXRXaWR0aCwgbVBhcmFtcy5vdXRIZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbURpc3BsYXlWaWV3LmludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgbUluQmxhY2tTZWVrQmFyID0gKFNlZWtCYXIpZmluZFZpZXdCeUlkKFIuaWQuaW5CbGFjayk7CisgICAgICAgIG1JbkJsYWNrU2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbUluQmxhY2tTZWVrQmFyLnNldE1heCgxMjgpOworICAgICAgICBtSW5CbGFja1NlZWtCYXIuc2V0UHJvZ3Jlc3MoMCk7CisgICAgICAgIG1PdXRCbGFja1NlZWtCYXIgPSAoU2Vla0JhcilmaW5kVmlld0J5SWQoUi5pZC5vdXRCbGFjayk7CisgICAgICAgIG1PdXRCbGFja1NlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1PdXRCbGFja1NlZWtCYXIuc2V0TWF4KDEyOCk7CisgICAgICAgIG1PdXRCbGFja1NlZWtCYXIuc2V0UHJvZ3Jlc3MoMCk7CiAKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgewotICAgICAgICAgICAgfQorICAgICAgICBtSW5XaGl0ZVNlZWtCYXIgPSAoU2Vla0JhcilmaW5kVmlld0J5SWQoUi5pZC5pbldoaXRlKTsKKyAgICAgICAgbUluV2hpdGVTZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtSW5XaGl0ZVNlZWtCYXIuc2V0TWF4KDEyOCk7CisgICAgICAgIG1JbldoaXRlU2Vla0Jhci5zZXRQcm9ncmVzcygxMjgpOworICAgICAgICBtT3V0V2hpdGVTZWVrQmFyID0gKFNlZWtCYXIpZmluZFZpZXdCeUlkKFIuaWQub3V0V2hpdGUpOworICAgICAgICBtT3V0V2hpdGVTZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtT3V0V2hpdGVTZWVrQmFyLnNldE1heCgxMjgpOworICAgICAgICBtT3V0V2hpdGVTZWVrQmFyLnNldFByb2dyZXNzKDEyOCk7CiAKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOworICAgICAgICBtR2FtbWFTZWVrQmFyID0gKFNlZWtCYXIpZmluZFZpZXdCeUlkKFIuaWQuaW5HYW1tYSk7CisgICAgICAgIG1HYW1tYVNlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1HYW1tYVNlZWtCYXIuc2V0TWF4KDE1MCk7CisgICAgICAgIG1HYW1tYVNlZWtCYXIuc2V0UHJvZ3Jlc3MoMTAwKTsKKworICAgICAgICBtU2F0dXJhdGlvblNlZWtCYXIgPSAoU2Vla0JhcilmaW5kVmlld0J5SWQoUi5pZC5pblNhdHVyYXRpb24pOworICAgICAgICBtU2F0dXJhdGlvblNlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1TYXR1cmF0aW9uU2Vla0Jhci5zZXRQcm9ncmVzcyg1MCk7CisKKyAgICAgICAgbUJlbmNobWFya1Jlc3VsdCA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuYmVuY2htYXJrVGV4dCk7CisgICAgICAgIG1CZW5jaG1hcmtSZXN1bHQuc2V0VGV4dCgiQmVuY2htYXJrIG5vdCB5ZXQgcnVuIik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc3VyZmFjZUNyZWF0ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKLSAgICAgICAgbVBhcmFtcyA9IGNyZWF0ZVBhcmFtcygpOwotICAgICAgICBtSW52b2thYmxlID0gY3JlYXRlU2NyaXB0KCk7Ci0KLSAgICAgICAgbUludm9rYWJsZS5leGVjdXRlKCk7CisgICAgICAgIGNyZWF0ZVNjcmlwdCgpOworICAgICAgICBtU2NyaXB0Lmludm9rZV9maWx0ZXIoKTsKKyAgICAgICAgbVJTLmZpbmlzaCgpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKQEAgLTE2Niw1NCArMzY3LDM4IEBACiAgICAgcHVibGljIHZvaWQgc3VyZmFjZURlc3Ryb3llZChTdXJmYWNlSG9sZGVyIGhvbGRlcikgewogICAgIH0KIAotICAgIHByaXZhdGUgU2NyaXB0Lkludm9rYWJsZSBjcmVhdGVTY3JpcHQoKSB7CisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNjcmlwdCgpIHsKICAgICAgICAgbVJTID0gUmVuZGVyU2NyaXB0LmNyZWF0ZSgpOwogICAgICAgICBtUlMubU1lc3NhZ2VDYWxsYmFjayA9IG5ldyBGaWx0ZXJDYWxsYmFjaygpOwogCi0gICAgICAgIG1QYXJhbXNUeXBlID0gVHlwZS5jcmVhdGVGcm9tQ2xhc3MobVJTLCBQYXJhbXMuY2xhc3MsIDEsICJQYXJhbWV0ZXJzIik7Ci0gICAgICAgIG1QYXJhbXNBbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIG1QYXJhbXNUeXBlKTsKLSAgICAgICAgbVBhcmFtc0FsbG9jYXRpb24uZGF0YShtUGFyYW1zKTsKKyAgICAgICAgbUluUGl4ZWxzQWxsb2NhdGlvbiA9IEFsbG9jYXRpb24uY3JlYXRlQml0bWFwUmVmKG1SUywgbUJpdG1hcEluKTsKKyAgICAgICAgbU91dFBpeGVsc0FsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZUJpdG1hcFJlZihtUlMsIG1CaXRtYXBPdXQpOwogCi0gICAgICAgIGZpbmFsIGludCBwaXhlbENvdW50ID0gbVBhcmFtcy5pbldpZHRoICogbVBhcmFtcy5pbkhlaWdodDsKKyAgICAgICAgVHlwZS5CdWlsZGVyIHRiID0gbmV3IFR5cGUuQnVpbGRlcihtUlMsIEVsZW1lbnQuRjMyXzQobVJTKSk7CisgICAgICAgIHRiLmFkZChhbmRyb2lkLnJlbmRlcnNjcmlwdC5EaW1lbnNpb24uWCwgbUJpdG1hcEluLmdldFdpZHRoKCkpOworICAgICAgICB0Yi5hZGQoYW5kcm9pZC5yZW5kZXJzY3JpcHQuRGltZW5zaW9uLlksIG1CaXRtYXBJbi5nZXRIZWlnaHQoKSk7CisgICAgICAgIG1TY3JhdGNoUGl4ZWxzQWxsb2NhdGlvbjEgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgdGIuY3JlYXRlKCkpOworICAgICAgICBtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb24yID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIHRiLmNyZWF0ZSgpKTsKIAotICAgICAgICBtUGl4ZWxUeXBlID0gVHlwZS5jcmVhdGVGcm9tQ2xhc3MobVJTLCBQaXhlbC5jbGFzcywgMSwgIlBpeGVsIik7Ci0gICAgICAgIG1JblBpeGVsc0FsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgICAgICBFbGVtZW50LmNyZWF0ZVVzZXIobVJTLCBFbGVtZW50LkRhdGFUeXBlLlNJR05FRF8zMiksCi0gICAgICAgICAgICAgICAgcGl4ZWxDb3VudCk7Ci0gICAgICAgIG1PdXRQaXhlbHNBbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChtUlMsCi0gICAgICAgICAgICAgICAgRWxlbWVudC5jcmVhdGVVc2VyKG1SUywgRWxlbWVudC5EYXRhVHlwZS5TSUdORURfMzIpLAotICAgICAgICAgICAgICAgIHBpeGVsQ291bnQpOworICAgICAgICBtU2NyaXB0VkJsdXIgPSBuZXcgU2NyaXB0Q192ZXJ0aWNhbF9ibHVyKG1SUywgZ2V0UmVzb3VyY2VzKCksIFIucmF3LnZlcnRpY2FsX2JsdXIsIGZhbHNlKTsKKyAgICAgICAgbVNjcmlwdEhCbHVyID0gbmV3IFNjcmlwdENfaG9yaXpvbnRhbF9ibHVyKG1SUywgZ2V0UmVzb3VyY2VzKCksIFIucmF3Lmhvcml6b250YWxfYmx1ciwgZmFsc2UpOwogCi0gICAgICAgIG1JbkRhdGEgPSBuZXcgaW50W3BpeGVsQ291bnRdOwotICAgICAgICBtQml0bWFwLmdldFBpeGVscyhtSW5EYXRhLCAwLCBtUGFyYW1zLmluV2lkdGgsIDAsIDAsIG1QYXJhbXMuaW5XaWR0aCwgbVBhcmFtcy5pbkhlaWdodCk7Ci0gICAgICAgIG1JblBpeGVsc0FsbG9jYXRpb24uZGF0YShtSW5EYXRhKTsKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX3RocmVzaG9sZChtUlMsIGdldFJlc291cmNlcygpLCBSLnJhdy50aHJlc2hvbGQsIGZhbHNlKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfd2lkdGgobUJpdG1hcEluLmdldFdpZHRoKCkpOworICAgICAgICBtU2NyaXB0LnNldF9oZWlnaHQobUJpdG1hcEluLmdldEhlaWdodCgpKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfcmFkaXVzKG1SYWRpdXMpOwogCi0gICAgICAgIG1PdXREYXRhID0gbmV3IGludFtwaXhlbENvdW50XTsKLSAgICAgICAgbU91dFBpeGVsc0FsbG9jYXRpb24uZGF0YShtT3V0RGF0YSk7CisgICAgICAgIG1TY3JpcHRWQmx1ci5pbnZva2Vfc2V0TGV2ZWxzKG1JbkJsYWNrLCBtT3V0QmxhY2ssIG1JbldoaXRlLCBtT3V0V2hpdGUpOworICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldEdhbW1hKG1HYW1tYSk7CisgICAgICAgIG1TY3JpcHRWQmx1ci5pbnZva2Vfc2V0U2F0dXJhdGlvbihtU2F0dXJhdGlvbik7CiAKLSAgICAgICAgU2NyaXB0Qy5CdWlsZGVyIHNiID0gbmV3IFNjcmlwdEMuQnVpbGRlcihtUlMpOwotICAgICAgICBzYi5zZXRUeXBlKG1QYXJhbXNUeXBlLCAiUGFyYW1zIiwgMCk7Ci0gICAgICAgIHNiLnNldFR5cGUobVBpeGVsVHlwZSwgIkluUGl4ZWwiLCAxKTsKLSAgICAgICAgc2Iuc2V0VHlwZShtUGl4ZWxUeXBlLCAiT3V0UGl4ZWwiLCAyKTsKLSAgICAgICAgc2Iuc2V0VHlwZSh0cnVlLCAyKTsKLSAgICAgICAgU2NyaXB0Lkludm9rYWJsZSBpbnZva2FibGUgPSBzYi5hZGRJbnZva2FibGUoIm1haW4iKTsKLSAgICAgICAgc2Iuc2V0U2NyaXB0KGdldFJlc291cmNlcygpLCBSLnJhdy50aHJlc2hvbGQpOwotICAgICAgICAvL3NiLnNldFJvb3QodHJ1ZSk7CisgICAgICAgIG1TY3JpcHQuYmluZF9JblBpeGVsKG1JblBpeGVsc0FsbG9jYXRpb24pOworICAgICAgICBtU2NyaXB0LmJpbmRfT3V0UGl4ZWwobU91dFBpeGVsc0FsbG9jYXRpb24pOworICAgICAgICBtU2NyaXB0LmJpbmRfU2NyYXRjaFBpeGVsMShtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb24xKTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX1NjcmF0Y2hQaXhlbDIobVNjcmF0Y2hQaXhlbHNBbGxvY2F0aW9uMik7CiAKLSAgICAgICAgU2NyaXB0QyBzY3JpcHQgPSBzYi5jcmVhdGUoKTsKLSAgICAgICAgc2NyaXB0LmJpbmRBbGxvY2F0aW9uKG1QYXJhbXNBbGxvY2F0aW9uLCAwKTsKLSAgICAgICAgc2NyaXB0LmJpbmRBbGxvY2F0aW9uKG1JblBpeGVsc0FsbG9jYXRpb24sIDEpOwotICAgICAgICBzY3JpcHQuYmluZEFsbG9jYXRpb24obU91dFBpeGVsc0FsbG9jYXRpb24sIDIpOwotCi0gICAgICAgIHJldHVybiBpbnZva2FibGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQYXJhbXMgY3JlYXRlUGFyYW1zKCkgewotICAgICAgICBmaW5hbCBQYXJhbXMgcGFyYW1zID0gbmV3IFBhcmFtcygpOwotICAgICAgICBwYXJhbXMuaW5XaWR0aCA9IHBhcmFtcy5vdXRXaWR0aCA9IG1CaXRtYXAuZ2V0V2lkdGgoKTsKLSAgICAgICAgcGFyYW1zLmluSGVpZ2h0ID0gcGFyYW1zLm91dEhlaWdodCA9IG1CaXRtYXAuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIHBhcmFtcy50aHJlc2hvbGQgPSAwLjVmOwotICAgICAgICByZXR1cm4gcGFyYW1zOworICAgICAgICBtU2NyaXB0LnNldF92Qmx1clNjcmlwdChtU2NyaXB0VkJsdXIpOworICAgICAgICBtU2NyaXB0LnNldF9oQmx1clNjcmlwdChtU2NyaXB0SEJsdXIpOwogICAgIH0KIAogICAgIHByaXZhdGUgQml0bWFwIGxvYWRCaXRtYXAoaW50IHJlc291cmNlKSB7CkBAIC0yMjksNCArNDE0LDMwIEBACiAgICAgICAgIHNvdXJjZS5yZWN5Y2xlKCk7CiAgICAgICAgIHJldHVybiBiOwogICAgIH0KKworICAgIC8vIGJ1dHRvbiBob29rCisgICAgcHVibGljIHZvaWQgYmVuY2htYXJrKFZpZXcgdikgeworICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLnYoIkltZyIsICJCZW5jaG1hcmtpbmciKTsKKyAgICAgICAgaW50IG9sZFJhZGl1cyA9IG1SYWRpdXM7CisgICAgICAgIG1SYWRpdXMgPSBNQVhfUkFESVVTOworICAgICAgICBtU2NyaXB0LnNldF9yYWRpdXMobVJhZGl1cyk7CisKKyAgICAgICAgbG9uZyB0ID0gamF2YS5sYW5nLlN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIG1TY3JpcHQuaW52b2tlX2ZpbHRlcigpOworICAgICAgICBtUlMuZmluaXNoKCk7CisKKyAgICAgICAgdCA9IGphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHQ7CisgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cudigiSW1nIiwgIlJlbmRlcnNjcmlwdCBmcmFtZSB0aW1lIGNvcmUgbXMgIiArIHQpOworCisgICAgICAgIC8vbG9uZyBqYXZhVGltZSA9IGphdmFGaWx0ZXIoKTsKKyAgICAgICAgLy9tQmVuY2htYXJrUmVzdWx0LnNldFRleHQoIlJTOiAiICsgdCArICIgbXMgIEphdmE6ICIgKyBqYXZhVGltZSArICIgbXMiKTsKKyAgICAgICAgbUJlbmNobWFya1Jlc3VsdC5zZXRUZXh0KCJSUzogIiArIHQgKyAiIG1zIik7CisKKyAgICAgICAgbVJhZGl1cyA9IG9sZFJhZGl1czsKKyAgICAgICAgbVNjcmlwdC5zZXRfcmFkaXVzKG1SYWRpdXMpOworCisgICAgICAgIG1TY3JpcHQuaW52b2tlX2ZpbHRlcigpOworICAgICAgICBtUlMuZmluaXNoKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvaG9yaXpvbnRhbF9ibHVyLnJzIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvaG9yaXpvbnRhbF9ibHVyLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZmZhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9ob3Jpem9udGFsX2JsdXIucnMKQEAgLTAsMCArMSwzMCBAQAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNpbmNsdWRlICJpcC5yc2giCisKK3ZvaWQgcm9vdChjb25zdCB2b2lkICp2X2luLCB2b2lkICp2X291dCwgY29uc3Qgdm9pZCAqdXNyRGF0YSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIGZsb2F0NCAqb3V0cHV0ID0gKGZsb2F0NCAqKXZfb3V0OworICAgIGNvbnN0IEZpbHRlclN0cnVjdCAqZnMgPSAoY29uc3QgRmlsdGVyU3RydWN0ICopdXNyRGF0YTsKKyAgICBjb25zdCBmbG9hdDQgKmlucHV0ID0gKGNvbnN0IGZsb2F0NCAqKXJzR2V0RWxlbWVudEF0KGZzLT5haW4sIDAsIHkpOworCisgICAgZmxvYXQzIGJsdXJyZWRQaXhlbCA9IDA7CisgICAgY29uc3QgZmxvYXQgKmdQdHIgPSBmcy0+Z2F1c3NpYW47CisgICAgaWYgKCh4ID4gZnMtPnJhZGl1cykgJiYgKHggPCAoZnMtPndpZHRoIC0gZnMtPnJhZGl1cykpKSB7CisgICAgICAgIGNvbnN0IGZsb2F0NCAqaSA9IGlucHV0ICsgKHggLSBmcy0+cmFkaXVzKTsKKyAgICAgICAgZm9yKGludCByID0gLWZzLT5yYWRpdXM7IHIgPD0gZnMtPnJhZGl1czsgciArKykgeworICAgICAgICAgICAgYmx1cnJlZFBpeGVsICs9IGktPnh5eiAqIGdQdHJbMF07CisgICAgICAgICAgICBnUHRyKys7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IoaW50IHIgPSAtZnMtPnJhZGl1czsgciA8PSBmcy0+cmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAvLyBTdGVwcGluZyBsZWZ0IGFuZCByaWdodCBhd2F5IGZyb20gdGhlIHBpeGVsCisgICAgICAgICAgICBpbnQgdmFsaWRXID0gcnNDbGFtcCh4ICsgciwgKHVpbnQpMCwgKHVpbnQpKGZzLT53aWR0aCAtIDEpKTsKKyAgICAgICAgICAgIGJsdXJyZWRQaXhlbCArPSBpbnB1dFt2YWxpZFddLnh5eiAqIGdQdHJbMF07CisgICAgICAgICAgICBnUHRyKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXRwdXQtPnh5eiA9IGJsdXJyZWRQaXhlbDsKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvaXAucnNoIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvaXAucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkN2E3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9pcC5yc2gKQEAgLTAsMCArMSwxNSBAQAorI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5ycy5pbWFnZSkKKworI2RlZmluZSBNQVhfUkFESVVTIDI1CisKK3R5cGVkZWYgc3RydWN0IEZpbHRlclN0cnVjdF9zIHsKKyAgICByc19hbGxvY2F0aW9uIGFpbjsKKworICAgIGZsb2F0ICpnYXVzc2lhbjsgLy9bTUFYX1JBRElVUyAqIDIgKyAxXTsKKyAgICBpbnQgaGVpZ2h0OworICAgIGludCB3aWR0aDsKKyAgICBpbnQgcmFkaXVzOworCit9IEZpbHRlclN0cnVjdDsKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS90aHJlc2hvbGQucnMgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS90aHJlc2hvbGQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVmZWNiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL3RocmVzaG9sZC5ycwpAQCAtMCwwICsxLDk1IEBACisjcHJhZ21hIHZlcnNpb24oMSkKKworI2luY2x1ZGUgImlwLnJzaCIKKworaW50IGhlaWdodDsKK2ludCB3aWR0aDsKK2ludCByYWRpdXM7CisKK3VjaGFyNCAqIEluUGl4ZWw7Cit1Y2hhcjQgKiBPdXRQaXhlbDsKK2Zsb2F0NCAqIFNjcmF0Y2hQaXhlbDE7CitmbG9hdDQgKiBTY3JhdGNoUGl4ZWwyOworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoaGVpZ2h0LCB3aWR0aCwgcmFkaXVzLCBJblBpeGVsLCBPdXRQaXhlbCwgU2NyYXRjaFBpeGVsMSwgU2NyYXRjaFBpeGVsMiwgdkJsdXJTY3JpcHQsIGhCbHVyU2NyaXB0KQorI3ByYWdtYSBycyBleHBvcnRfZnVuYyhmaWx0ZXIpOworCityc19zY3JpcHQgdkJsdXJTY3JpcHQ7Cityc19zY3JpcHQgaEJsdXJTY3JpcHQ7CisKK2NvbnN0IGludCBDTURfRklOSVNIRUQgPSAxOworCisvLyBTdG9yZSBvdXIgY29lZmZpY2llbnRzIGhlcmUKK3N0YXRpYyBmbG9hdCBnYXVzc2lhbltNQVhfUkFESVVTICogMiArIDFdOworCisKK3N0YXRpYyB2b2lkIGNvbXB1dGVHYXVzc2lhbldlaWdodHMoKSB7CisgICAgLy8gQ29tcHV0ZSBnYXVzc2lhbiB3ZWlnaHRzIGZvciB0aGUgYmx1cgorICAgIC8vIGUgaXMgdGhlIGV1bGVyJ3MgbnVtYmVyCisgICAgZmxvYXQgZSA9IDIuNzE4MjgxODI4NDU5MDQ1ZjsKKyAgICBmbG9hdCBwaSA9IDMuMTQxNTkyNjUzNTg5NzkzMmY7CisgICAgLy8gZyh4KSA9ICggMSAvIHNxcnQoIDIgKiBwaSApICogc2lnbWEpICogZSBeICggLXheMiAvIDIgKiBzaWdtYV4yICkKKyAgICAvLyB4IGlzIG9mIHRoZSBmb3JtIFstcmFkaXVzIC4uIDAgLi4gcmFkaXVzXQorICAgIC8vIGFuZCBzaWdtYSB2YXJpZXMgd2l0aCByYWRpdXMuCisgICAgLy8gQmFzZWQgb24gc29tZSBleHBlcmltZW50YWwgcmFkaXVzIHZhbHVlcyBhbmQgc2lnbWEncworICAgIC8vIHdlIGFwcHJveGltYXRlbHkgZml0IHNpZ21hID0gZihyYWRpdXMpIGFzCisgICAgLy8gc2lnbWEgPSByYWRpdXMgKiAwLjQgICsgMC42CisgICAgLy8gVGhlIGxhcmdlciB0aGUgcmFkaXVzIGdldHMsIHRoZSBtb3JlIG91ciBnYXVzc2lhbiBibHVyCisgICAgLy8gd2lsbCByZXNlbWJsZSBhIGJveCBibHVyIHNpbmNlIHdpdGggbGFyZ2Ugc2lnbWEKKyAgICAvLyB0aGUgZ2F1c3NpYW4gY3VydmUgYmVnaW5zIHRvIGxvc2UgaXRzIHNoYXBlCisgICAgZmxvYXQgc2lnbWEgPSAwLjRmICogKGZsb2F0KXJhZGl1cyArIDAuNmY7CisKKyAgICAvLyBOb3cgY29tcHV0ZSB0aGUgY29lZmZpY2ludHMKKyAgICAvLyBXZSB3aWxsIHN0b3JlIHNvbWUgcmVkdW5kYW50IHZhbHVlcyB0byBzYXZlIHNvbWUgbWF0aCBkdXJpbmcKKyAgICAvLyB0aGUgYmx1ciBjYWxjdWxhdGlvbnMKKyAgICAvLyBwcmVjb21wdXRlIHNvbWUgdmFsdWVzCisgICAgZmxvYXQgY29lZmYxID0gMS4wZiAvIChzcXJ0KCAyLjBmICogcGkgKSAqIHNpZ21hKTsKKyAgICBmbG9hdCBjb2VmZjIgPSAtIDEuMGYgLyAoMi4wZiAqIHNpZ21hICogc2lnbWEpOworCisgICAgZmxvYXQgbm9ybWFsaXplRmFjdG9yID0gMC4wZjsKKyAgICBmbG9hdCBmbG9hdFIgPSAwLjBmOworICAgIGludCByOworICAgIGZvcihyID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgZmxvYXRSID0gKGZsb2F0KXI7CisgICAgICAgIGdhdXNzaWFuW3IgKyByYWRpdXNdID0gY29lZmYxICogcG93KGUsIGZsb2F0UiAqIGZsb2F0UiAqIGNvZWZmMik7CisgICAgICAgIG5vcm1hbGl6ZUZhY3RvciArPSBnYXVzc2lhbltyICsgcmFkaXVzXTsKKyAgICB9CisKKyAgICAvL05vdyB3ZSBuZWVkIHRvIG5vcm1hbGl6ZSB0aGUgd2VpZ2h0cyBiZWNhdXNlIGFsbCBvdXIgY29lZmZpY2llbnRzIG5lZWQgdG8gYWRkIHVwIHRvIG9uZQorICAgIG5vcm1hbGl6ZUZhY3RvciA9IDEuMGYgLyBub3JtYWxpemVGYWN0b3I7CisgICAgZm9yKHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICBmbG9hdFIgPSAoZmxvYXQpcjsKKyAgICAgICAgZ2F1c3NpYW5bciArIHJhZGl1c10gKj0gbm9ybWFsaXplRmFjdG9yOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBjb3B5SW5wdXQoKSB7CisgICAgcnNfYWxsb2NhdGlvbiBhaW4gPSByc0dldEFsbG9jYXRpb24oSW5QaXhlbCk7CisgICAgdWludDMyX3QgZGlteCA9IHJzQWxsb2NhdGlvbkdldERpbVgoYWluKTsKKyAgICB1aW50MzJfdCBkaW15ID0gcnNBbGxvY2F0aW9uR2V0RGltWShhaW4pOworICAgIGZvcih1aW50MzJfdCB5ID0gMDsgeSA8IGRpbXk7IHkrKykgeworICAgICAgICBmb3IodWludDMyX3QgeCA9IDA7IHggPCBkaW14OyB4KyspIHsKKyAgICAgICAgICAgIFNjcmF0Y2hQaXhlbDFbeCArIHkgKiBkaW14XSA9IGNvbnZlcnRfZmxvYXQ0KEluUGl4ZWxbeCArIHkgKiBkaW14XSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgZmlsdGVyKCkgeworICAgIGNvcHlJbnB1dCgpOworICAgIGNvbXB1dGVHYXVzc2lhbldlaWdodHMoKTsKKworICAgIEZpbHRlclN0cnVjdCBmczsKKyAgICBmcy5nYXVzc2lhbiA9IGdhdXNzaWFuOworICAgIGZzLndpZHRoID0gd2lkdGg7CisgICAgZnMuaGVpZ2h0ID0gaGVpZ2h0OworICAgIGZzLnJhZGl1cyA9IHJhZGl1czsKKworICAgIGZzLmFpbiA9IHJzR2V0QWxsb2NhdGlvbihTY3JhdGNoUGl4ZWwxKTsKKyAgICByc0ZvckVhY2goaEJsdXJTY3JpcHQsIGZzLmFpbiwgcnNHZXRBbGxvY2F0aW9uKFNjcmF0Y2hQaXhlbDIpLCAmZnMpOworCisgICAgZnMuYWluID0gcnNHZXRBbGxvY2F0aW9uKFNjcmF0Y2hQaXhlbDIpOworICAgIHJzRm9yRWFjaCh2Qmx1clNjcmlwdCwgZnMuYWluLCByc0dldEFsbG9jYXRpb24oT3V0UGl4ZWwpLCAmZnMpOworICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoQ01EX0ZJTklTSEVEKTsKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvdmVydGljYWxfYmx1ci5ycyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL3ZlcnRpY2FsX2JsdXIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkwMWQyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL3ZlcnRpY2FsX2JsdXIucnMKQEAgLTAsMCArMSw5MiBAQAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNpbmNsdWRlICJpcC5yc2giCisKK3N0YXRpYyBmbG9hdCBpbkJsYWNrOworc3RhdGljIGZsb2F0IG91dEJsYWNrOworc3RhdGljIGZsb2F0IGluV2hpdGU7CitzdGF0aWMgZmxvYXQgb3V0V2hpdGU7CitzdGF0aWMgZmxvYXQzIGdhbW1hOworc3RhdGljIGZsb2F0IHNhdHVyYXRpb247CisKK3N0YXRpYyBmbG9hdCBpbldNaW5JbkI7CitzdGF0aWMgZmxvYXQgb3V0V01pbk91dEI7CitzdGF0aWMgZmxvYXQgb3ZlckluV01pbkluQjsKK3N0YXRpYyByc19tYXRyaXgzeDMgY29sb3JNYXQ7CisKKyNwcmFnbWEgcnMgZXhwb3J0X2Z1bmMoc2V0TGV2ZWxzLCBzZXRTYXR1cmF0aW9uLCBzZXRHYW1tYSk7CisKK3ZvaWQgc2V0TGV2ZWxzKGZsb2F0IGlCbGssIGZsb2F0IG9CbGssIGZsb2F0IGlXaHQsIGZsb2F0IG9XaHQpIHsKKyAgICBpbkJsYWNrID0gaUJsazsKKyAgICBvdXRCbGFjayA9IG9CbGs7CisgICAgaW5XaGl0ZSA9IGlXaHQ7CisgICAgb3V0V2hpdGUgPSBvV2h0OworCisgICAgaW5XTWluSW5CID0gaW5XaGl0ZSAtIGluQmxhY2s7CisgICAgb3V0V01pbk91dEIgPSBvdXRXaGl0ZSAtIG91dEJsYWNrOworICAgIG92ZXJJbldNaW5JbkIgPSAxLmYgLyBpbldNaW5JbkI7Cit9CisKK3ZvaWQgc2V0U2F0dXJhdGlvbihmbG9hdCBzYXQpIHsKKyAgICBzYXR1cmF0aW9uID0gc2F0OworCisgICAgLy8gU2F0dXJhdGlvbgorICAgIC8vIExpbmVhciB3ZWlnaHRzCisgICAgLy9mbG9hdCByV2VpZ2h0ID0gMC4zMDg2ZjsKKyAgICAvL2Zsb2F0IGdXZWlnaHQgPSAwLjYwOTRmOworICAgIC8vZmxvYXQgYldlaWdodCA9IDAuMDgyMGY7CisKKyAgICAvLyBHYW1tYSAyLjIgd2VpZ2h0cyAod2UgaGF2ZW4ndCBjb252ZXJ0ZWQgb3VyIGltYWdlIHRvIGxpbmVhciBzcGFjZSB5ZXQgZm9yIHBlcmYgcmVhc29ucykKKyAgICBmbG9hdCByV2VpZ2h0ID0gMC4yOTlmOworICAgIGZsb2F0IGdXZWlnaHQgPSAwLjU4N2Y7CisgICAgZmxvYXQgYldlaWdodCA9IDAuMTE0ZjsKKworICAgIGZsb2F0IG9uZU1pbnVzUyA9IDEuMGYgLSBzYXR1cmF0aW9uOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMCwgMCwgb25lTWludXNTICogcldlaWdodCArIHNhdHVyYXRpb24pOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMCwgMSwgb25lTWludXNTICogcldlaWdodCk7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAwLCAyLCBvbmVNaW51c1MgKiByV2VpZ2h0KTsKKyAgICByc01hdHJpeFNldCgmY29sb3JNYXQsIDEsIDAsIG9uZU1pbnVzUyAqIGdXZWlnaHQpOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMSwgMSwgb25lTWludXNTICogZ1dlaWdodCArIHNhdHVyYXRpb24pOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMSwgMiwgb25lTWludXNTICogZ1dlaWdodCk7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAyLCAwLCBvbmVNaW51c1MgKiBiV2VpZ2h0KTsKKyAgICByc01hdHJpeFNldCgmY29sb3JNYXQsIDIsIDEsIG9uZU1pbnVzUyAqIGJXZWlnaHQpOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMiwgMiwgb25lTWludXNTICogYldlaWdodCArIHNhdHVyYXRpb24pOworfQorCit2b2lkIHNldEdhbW1hKGZsb2F0IGcpIHsKKyAgICBnYW1tYSA9IChmbG9hdDMpZzsKK30KKwordm9pZCByb290KGNvbnN0IHZvaWQgKnZfaW4sIHZvaWQgKnZfb3V0LCBjb25zdCB2b2lkICp1c3JEYXRhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgdWNoYXI0ICpvdXRwdXQgPSAodWNoYXI0ICopdl9vdXQ7CisgICAgY29uc3QgRmlsdGVyU3RydWN0ICpmcyA9IChjb25zdCBGaWx0ZXJTdHJ1Y3QgKil1c3JEYXRhOworICAgIGNvbnN0IGZsb2F0NCAqaW5wdXQgPSAoY29uc3QgZmxvYXQ0ICopcnNHZXRFbGVtZW50QXQoZnMtPmFpbiwgeCwgMCk7CisKKyAgICBmbG9hdDMgYmx1cnJlZFBpeGVsID0gMDsKKyAgICBjb25zdCBmbG9hdCAqZ1B0ciA9IGZzLT5nYXVzc2lhbjsKKyAgICBpZiAoKHkgPiBmcy0+cmFkaXVzKSAmJiAoeSA8IChmcy0+aGVpZ2h0IC0gZnMtPnJhZGl1cykpKSB7CisgICAgICAgIGNvbnN0IGZsb2F0NCAqaSA9IGlucHV0ICsgKCh5IC0gZnMtPnJhZGl1cykgKiBmcy0+d2lkdGgpOworICAgICAgICBmb3IoaW50IHIgPSAtZnMtPnJhZGl1czsgciA8PSBmcy0+cmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gaS0+eHl6ICogZ1B0clswXTsKKyAgICAgICAgICAgIGdQdHIrKzsKKyAgICAgICAgICAgIGkgKz0gZnMtPndpZHRoOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yKGludCByID0gLWZzLT5yYWRpdXM7IHIgPD0gZnMtPnJhZGl1czsgciArKykgeworICAgICAgICAgICAgaW50IHZhbGlkSCA9IHJzQ2xhbXAoeSArIHIsICh1aW50KTAsICh1aW50KShmcy0+aGVpZ2h0IC0gMSkpOworICAgICAgICAgICAgY29uc3QgZmxvYXQ0ICppID0gaW5wdXQgKyB2YWxpZEggKiBmcy0+d2lkdGg7CisgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gaS0+eHl6ICogZ1B0clswXTsKKyAgICAgICAgICAgIGdQdHIrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0MyB0ZW1wID0gcnNNYXRyaXhNdWx0aXBseSgmY29sb3JNYXQsIGJsdXJyZWRQaXhlbCk7CisgICAgdGVtcCA9IChjbGFtcCh0ZW1wLCAwLmYsIDI1NS5mKSAtIGluQmxhY2spICogb3ZlckluV01pbkluQjsKKyAgICBpZiAoZ2FtbWEueCAhPSAxLjBmKQorICAgICAgICB0ZW1wID0gcG93KHRlbXAsIChmbG9hdDMpZ2FtbWEpOworICAgIHRlbXAgPSBjbGFtcCh0ZW1wICogb3V0V01pbk91dEIgKyBvdXRCbGFjaywgMC5mLCAyNTUuZik7CisKKyAgICBvdXRwdXQtPnh5eiA9IGNvbnZlcnRfdWNoYXIzKHRlbXApOworICAgIC8vb3V0cHV0LT53ID0gaW5wdXQtPnc7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9BbmRyb2lkLm1rIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZlNzdkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpICQoY2FsbCBhbGwtcmVuZGVyc2NyaXB0LWZpbGVzLXVuZGVyLCBzcmMpCisjTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQucmVuZGVyc2NyaXB0CisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBNb2RlbFZpZXdlcgorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9BbmRyb2lkTWFuaWZlc3QueG1sIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5ZmU1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm1vZGVsdmlld2VyIj4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iTW9kZWxWaWV3ZXIiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJTaW1wbGVNb2RlbCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlNpbXBsZU1vZGVsIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5CbGFjay5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iU2NlbmVHcmFwaCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlNjZW5lR3JhcGgiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5CbGFjay5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvZHJhd2FibGUvcm9ib3QucG5nIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3Jlcy9kcmF3YWJsZS9yb2JvdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczNTNmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvZHJhd2FibGUvcm9ib3QucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvcmF3L3JvYm90LmEzZCBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvcmF3L3JvYm90LmEzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDg4OTVjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3Jlcy9yYXcvcm9ib3QuYTNkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaC5qYXZhIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TY2VuZUdyYXBoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3ZTBjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaC5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlN5c3RlbTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCitpbXBvcnQgamF2YS5sYW5nLlJ1bnRpbWU7CisKK3B1YmxpYyBjbGFzcyBTY2VuZUdyYXBoIGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBTY2VuZUdyYXBoVmlldyBtVmlldzsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICAvLyBDcmVhdGUgb3VyIFByZXZpZXcgdmlldyBhbmQgc2V0IGl0IGFzIHRoZSBjb250ZW50IG9mIG91cgorICAgICAgICAvLyBBY3Rpdml0eQorICAgICAgICBtVmlldyA9IG5ldyBTY2VuZUdyYXBoVmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtVmlldy5vblBhdXNlKCk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaFJTLmphdmEgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NjZW5lR3JhcGhSUy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NTkyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NjZW5lR3JhcGhSUy5qYXZhCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5CdWlsZGVyOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5EZXB0aEZ1bmM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCitwdWJsaWMgY2xhc3MgU2NlbmVHcmFwaFJTIHsKKworICAgIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX0xBU1RfRk9DVVMgPSAxOworCisgICAgaW50IG1XaWR0aDsKKyAgICBpbnQgbUhlaWdodDsKKyAgICBpbnQgbVJvdGF0aW9uOworCisgICAgcHVibGljIFNjZW5lR3JhcGhSUygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgbVJTID0gcnM7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgICAgIG1XaWR0aCA9IHdpZHRoOworICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBtUm90YXRpb24gPSAwOworICAgICAgICBpbml0UlMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgU2FtcGxlciBtU2FtcGxlcjsKKyAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUFNCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgUHJvZ3JhbUZyYWdtZW50IG1QRkJhY2tncm91bmQ7CisgICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1QVkJhY2tncm91bmQ7CisgICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4Lk1hdHJpeEFsbG9jYXRpb24gbVBWQTsKKworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtR3JpZEltYWdlOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NQVjsKKworICAgIHByaXZhdGUgTWVzaCBtTWVzaDsKKworICAgIHByaXZhdGUgRm9udCBtSXRhbGljOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtVGV4dEFsbG9jOworCisgICAgcHJpdmF0ZSBTY3JpcHRDX3NjZW5lZ3JhcGggbVNjcmlwdDsKKyAgICBwcml2YXRlIFNjcmlwdENfdHJhbnNmb3JtIG1UcmFuc2Zvcm1TY3JpcHQ7CisKKyAgICBpbnQgbUxhc3RYOworICAgIGludCBtTGFzdFk7CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaEV2ZW50KGludCB4LCBpbnQgeSkgeworICAgICAgICBpbnQgZHggPSBtTGFzdFggLSB4OworICAgICAgICBpZihNYXRoLmFicyhkeCkgPiA1MCB8fCBNYXRoLmFicyhkeCkgPCAzKSB7CisgICAgICAgICAgICBkeCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBtUm90YXRpb24gLT0gZHg7CisgICAgICAgIGlmKG1Sb3RhdGlvbiA+IDM2MCkgeworICAgICAgICAgICAgbVJvdGF0aW9uIC09IDM2MDsKKyAgICAgICAgfQorICAgICAgICBpZihtUm90YXRpb24gPCAwKSB7CisgICAgICAgICAgICBtUm90YXRpb24gKz0gMzYwOworICAgICAgICB9CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1JvdGF0ZSgtKGZsb2F0KW1Sb3RhdGlvbik7CisKKyAgICAgICAgbUxhc3RYID0geDsKKyAgICAgICAgbUxhc3RZID0geTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFBGUygpIHsKKyAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYiA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihtUlMpOworCisgICAgICAgIGIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuTEVTUyk7CisgICAgICAgIGIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgYi5zZXREZXB0aE1hc2sodHJ1ZSk7CisgICAgICAgIG1QU0JhY2tncm91bmQgPSBiLmNyZWF0ZSgpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQRlNCYWNrZ3JvdW5kKG1QU0JhY2tncm91bmQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UEYoKSB7CisgICAgICAgIFNhbXBsZXIuQnVpbGRlciBicyA9IG5ldyBTYW1wbGVyLkJ1aWxkZXIobVJTKTsKKyAgICAgICAgYnMuc2V0TWluKFNhbXBsZXIuVmFsdWUuTElORUFSKTsKKyAgICAgICAgYnMuc2V0TWFnKFNhbXBsZXIuVmFsdWUuTElORUFSKTsKKyAgICAgICAgYnMuc2V0V3JhcFMoU2FtcGxlci5WYWx1ZS5DTEFNUCk7CisgICAgICAgIGJzLnNldFdyYXBUKFNhbXBsZXIuVmFsdWUuQ0xBTVApOworICAgICAgICBtU2FtcGxlciA9IGJzLmNyZWF0ZSgpOworCisgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgYi5zZXRUZXh0dXJlKFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkVudk1vZGUuUkVQTEFDRSwKKyAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkZvcm1hdC5SR0JBLCAwKTsKKyAgICAgICAgbVBGQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7CisgICAgICAgIG1QRkJhY2tncm91bmQuYmluZFNhbXBsZXIobVNhbXBsZXIsIDApOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQRkJhY2tncm91bmQobVBGQmFja2dyb3VuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQVigpIHsKKyAgICAgICAgUHJvZ3JhbVZlcnRleC5CdWlsZGVyIHB2YiA9IG5ldyBQcm9ncmFtVmVydGV4LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgbVBWQmFja2dyb3VuZCA9IHB2Yi5jcmVhdGUoKTsKKworICAgICAgICBtUFZBID0gbmV3IFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbihtUlMpOworICAgICAgICBtUFZCYWNrZ3JvdW5kLmJpbmRBbGxvY2F0aW9uKG1QVkEpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQVkJhY2tncm91bmQobVBWQmFja2dyb3VuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvYWRJbWFnZSgpIHsKKyAgICAgICAgbUdyaWRJbWFnZSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnJvYm90LCBFbGVtZW50LlJHQl81NjUobVJTKSwgdHJ1ZSk7CisgICAgICAgIG1HcmlkSW1hZ2UudXBsb2FkVG9UZXh0dXJlKDApOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dUR3JpZChtR3JpZEltYWdlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFRleHRBbGxvY2F0aW9uKCkgeworICAgICAgICBTdHJpbmcgYWxsb2NTdHJpbmcgPSAiRGlzcGxheWluZyBmaWxlOiBSLnJhdy5yb2JvdCI7CisgICAgICAgIG1UZXh0QWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21TdHJpbmcobVJTLCBhbGxvY1N0cmluZyk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dUZXh0QWxsb2MobVRleHRBbGxvYyk7CisgICAgfQorCisgICAgU2dUcmFuc2Zvcm0gbVJvb3RUcmFuc2Zvcm07CisgICAgU2dUcmFuc2Zvcm0gbUdyb3VwMTsKKworICAgIFNnVHJhbnNmb3JtIG1Sb2JvdDE7CisgICAgU2dUcmFuc2Zvcm0gbVJvYm90MjsKKworICAgIHZvaWQgaW5pdFRyYW5zZm9ybUhpZXJhcmNoeSgpIHsKKyAgICAgICAgbVJvb3RUcmFuc2Zvcm0gPSBuZXcgU2dUcmFuc2Zvcm0obVJTKTsKKworICAgICAgICBtR3JvdXAxID0gbmV3IFNnVHJhbnNmb3JtKG1SUyk7CisgICAgICAgIG1Sb290VHJhbnNmb3JtLmFkZENoaWxkKG1Hcm91cDEpOworCisgICAgICAgIG1Sb2JvdDEgPSBuZXcgU2dUcmFuc2Zvcm0obVJTKTsKKyAgICAgICAgbVJvYm90MiA9IG5ldyBTZ1RyYW5zZm9ybShtUlMpOworCisgICAgICAgIG1Hcm91cDEuYWRkQ2hpbGQobVJvYm90MSk7CisgICAgICAgIG1Hcm91cDEuYWRkQ2hpbGQobVJvYm90Mik7CisKKyAgICAgICAgbUdyb3VwMS5zZXRUcmFuc2Zvcm0oMCwgbmV3IEZsb2F0NCgwLjBmLCAwLjBmLCAtMTUuMGYsIDAuMGYpLCBUcmFuc2Zvcm1UeXBlLlRSQU5TTEFURSk7CisgICAgICAgIG1Hcm91cDEuc2V0VHJhbnNmb3JtKDEsIG5ldyBGbG9hdDQoMC4wZiwgMS4wZiwgMC4wZiwgMTUuMGYpLCBUcmFuc2Zvcm1UeXBlLlJPVEFURSk7CisKKyAgICAgICAgbVJvYm90MS5zZXRUcmFuc2Zvcm0oMCwgbmV3IEZsb2F0NCgtMy4wZiwgLTAuNWYsIDAuMGYsIDAuMGYpLCBUcmFuc2Zvcm1UeXBlLlRSQU5TTEFURSk7CisgICAgICAgIG1Sb2JvdDEuc2V0VHJhbnNmb3JtKDEsIG5ldyBGbG9hdDQoMC4wZiwgMS4wZiwgMC4wZiwgMjAuMGYpLCBUcmFuc2Zvcm1UeXBlLlJPVEFURSk7CisgICAgICAgIG1Sb2JvdDEuc2V0VHJhbnNmb3JtKDIsIG5ldyBGbG9hdDQoMC4yZiwgMC4yZiwgMC4yZiwgMC4wZiksIFRyYW5zZm9ybVR5cGUuU0NBTEUpOworCisgICAgICAgIG1Sb2JvdDIuc2V0VHJhbnNmb3JtKDAsIG5ldyBGbG9hdDQoMy4wZiwgMC4wZiwgMC4wZiwgMC4wZiksIFRyYW5zZm9ybVR5cGUuVFJBTlNMQVRFKTsKKyAgICAgICAgbVJvYm90Mi5zZXRUcmFuc2Zvcm0oMSwgbmV3IEZsb2F0NCgwLjBmLCAxLjBmLCAwLjBmLCAtMjAuMGYpLCBUcmFuc2Zvcm1UeXBlLlJPVEFURSk7CisgICAgICAgIG1Sb2JvdDIuc2V0VHJhbnNmb3JtKDIsIG5ldyBGbG9hdDQoMC4zZiwgMC4zZiwgMC4zZiwgMC4wZiksIFRyYW5zZm9ybVR5cGUuU0NBTEUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UlMoKSB7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX3NjZW5lZ3JhcGgobVJTLCBtUmVzLCBSLnJhdy5zY2VuZWdyYXBoLCB0cnVlKTsKKyAgICAgICAgbVRyYW5zZm9ybVNjcmlwdCA9IG5ldyBTY3JpcHRDX3RyYW5zZm9ybShtUlMsIG1SZXMsIFIucmF3LnRyYW5zZm9ybSwgZmFsc2UpOworICAgICAgICBtVHJhbnNmb3JtU2NyaXB0LnNldF90cmFuc2Zvcm1TY3JpcHQobVRyYW5zZm9ybVNjcmlwdCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RyYW5zZm9ybVJTKG1UcmFuc2Zvcm1TY3JpcHQpOworCisgICAgICAgIGluaXRQRlMoKTsKKyAgICAgICAgaW5pdFBGKCk7CisgICAgICAgIGluaXRQVigpOworCisgICAgICAgIGxvYWRJbWFnZSgpOworCisgICAgICAgIEZpbGVBM0QgbW9kZWwgPSBGaWxlQTNELmNyZWF0ZUZyb21SZXNvdXJjZShtUlMsIG1SZXMsIFIucmF3LnJvYm90KTsKKyAgICAgICAgRmlsZUEzRC5JbmRleEVudHJ5IGVudHJ5ID0gbW9kZWwuZ2V0SW5kZXhFbnRyeSgwKTsKKyAgICAgICAgaWYoZW50cnkgPT0gbnVsbCB8fCBlbnRyeS5nZXRDbGFzc0lEKCkgIT0gRmlsZUEzRC5DbGFzc0lELk1FU0gpIHsKKyAgICAgICAgICAgIExvZy5lKCJycyIsICJjb3VsZCBub3QgbG9hZCBtb2RlbCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbU1lc2ggPSAoTWVzaCllbnRyeS5nZXRPYmplY3QoKTsKKyAgICAgICAgICAgIG1TY3JpcHQuc2V0X2dUZXN0TWVzaChtTWVzaCk7CisgICAgICAgIH0KKworICAgICAgICBtSXRhbGljID0gRm9udC5jcmVhdGUobVJTLCBtUmVzLCAiRHJvaWRTZXJpZi1JdGFsaWMudHRmIiwgOCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dJdGFsaWMobUl0YWxpYyk7CisKKyAgICAgICAgaW5pdFRleHRBbGxvY2F0aW9uKCk7CisKKyAgICAgICAgaW5pdFRyYW5zZm9ybUhpZXJhcmNoeSgpOworCisgICAgICAgIExvZy52KCI9PT09PT09PVNjZW5lR3JhcGg9PT09PT09PSIsICJ0cmFuc2Zvcm0gaGllcmFyY2h5IGluaXRpYWxpemVkIik7CisKKyAgICAgICAgbVNjcmlwdC5iaW5kX2dSb290Tm9kZShtUm9vdFRyYW5zZm9ybS5nZXRGaWVsZCgpKTsKKworICAgICAgICBtU2NyaXB0LmJpbmRfZ0dyb3VwKG1Hcm91cDEubVBhcmVudC5tQ2hpbGRGaWVsZCk7CisgICAgICAgIG1TY3JpcHQuYmluZF9nUm9ib3QxKG1Sb2JvdDEubVBhcmVudC5tQ2hpbGRGaWVsZCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dSb2JvdDFJbmRleChtUm9ib3QxLm1JbmRleEluUGFyZW50R3JvdXApOworICAgICAgICBtU2NyaXB0LmJpbmRfZ1JvYm90MihtUm9ib3QyLm1QYXJlbnQubUNoaWxkRmllbGQpOworICAgICAgICBtU2NyaXB0LnNldF9nUm9ib3QySW5kZXgobVJvYm90Mi5tSW5kZXhJblBhcmVudEdyb3VwKTsKKworICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaFZpZXcuamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGE1OWIyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TY2VuZUdyYXBoVmlldy5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworcHVibGljIGNsYXNzIFNjZW5lR3JhcGhWaWV3IGV4dGVuZHMgUlNTdXJmYWNlVmlldyB7CisKKyAgICBwdWJsaWMgU2NlbmVHcmFwaFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICAvL3NldEZvY3VzYWJsZSh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFNjZW5lR3JhcGhSUyBtUmVuZGVyOworCisKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIHN1cGVyLnN1cmZhY2VDaGFuZ2VkKGhvbGRlciwgZm9ybWF0LCB3LCBoKTsKKyAgICAgICAgaWYgKG1SUyA9PSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBjcmVhdGVSZW5kZXJTY3JpcHQodHJ1ZSk7CisgICAgICAgICAgICBtUlMuY29udGV4dFNldFN1cmZhY2UodywgaCwgaG9sZGVyLmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICBtUmVuZGVyID0gbmV3IFNjZW5lR3JhcGhSUygpOworICAgICAgICAgICAgbVJlbmRlci5pbml0KG1SUywgZ2V0UmVzb3VyY2VzKCksIHcsIGgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIGlmKG1SUyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBudWxsOworICAgICAgICAgICAgZGVzdHJveVJlbmRlclNjcmlwdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkKKyAgICB7CisgICAgICAgIC8vIGJyZWFrIHBvaW50IGF0IGhlcmUKKyAgICAgICAgLy8gdGhpcyBtZXRob2QgZG9lc24ndCB3b3JrIHdoZW4gJ2V4dGVuZHMgVmlldycgaW5jbHVkZSAnZXh0ZW5kcyBTY3JvbGxWaWV3Jy4KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpCisgICAgeworICAgICAgICBib29sZWFuIHJldCA9IHRydWU7CisgICAgICAgIGludCBhY3QgPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgaWYgKGFjdCA9PSBldi5BQ1RJT05fVVApIHsKKyAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbVJlbmRlci50b3VjaEV2ZW50KChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2dUcmFuc2Zvcm0uamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2dUcmFuc2Zvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzBlODExCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TZ1RyYW5zZm9ybS5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5CdWlsZGVyOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5EZXB0aEZ1bmM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworZW51bSBUcmFuc2Zvcm1UeXBlIHsKKworICAgIE5PTkUoMCksCisgICAgVFJBTlNMQVRFKDEpLAorICAgIFJPVEFURSgyKSwKKyAgICBTQ0FMRSgzKTsKKworICAgIGludCBtSUQ7CisgICAgVHJhbnNmb3JtVHlwZShpbnQgaWQpIHsKKyAgICAgICAgbUlEID0gaWQ7CisgICAgfQorfQorCitwdWJsaWMgY2xhc3MgU2dUcmFuc2Zvcm0geworCisKKyAgICBTY3JpcHRGaWVsZF9TZ1RyYW5zZm9ybSBtVHJhbnNmb3JtRmllbGQ7CisgICAgU2NyaXB0RmllbGRfU2dUcmFuc2Zvcm0gbUNoaWxkRmllbGQ7CisgICAgcHVibGljIFNjcmlwdEZpZWxkX1NnVHJhbnNmb3JtLkl0ZW0gbVRyYW5zZm9ybURhdGE7CisKKyAgICBGbG9hdDRbXSBtVHJhbnNmb3JtczsKKyAgICBUcmFuc2Zvcm1UeXBlW10gbVRyYW5zZm9ybVR5cGVzOworCisgICAgUmVuZGVyU2NyaXB0IG1SUzsKKworICAgIFZlY3RvciBtQ2hpbGRyZW47CisgICAgU2dUcmFuc2Zvcm0gbVBhcmVudDsKKyAgICBpbnQgbUluZGV4SW5QYXJlbnRHcm91cDsKKworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChTZ1RyYW5zZm9ybSBwYXJlbnQsIGludCBwYXJlbnRJbmRleCkgeworICAgICAgICBtUGFyZW50ID0gcGFyZW50OworICAgICAgICBtSW5kZXhJblBhcmVudEdyb3VwID0gcGFyZW50SW5kZXg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQ2hpbGQoU2dUcmFuc2Zvcm0gY2hpbGQpIHsKKyAgICAgICAgbUNoaWxkcmVuLmFkZChjaGlsZCk7CisgICAgICAgIGNoaWxkLnNldFBhcmVudCh0aGlzLCBtQ2hpbGRyZW4uc2l6ZSgpIC0gMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNmb3JtKGludCBpbmRleCwgRmxvYXQ0IHZhbHVlLCBUcmFuc2Zvcm1UeXBlIHR5cGUpIHsKKyAgICAgICAgbVRyYW5zZm9ybXNbaW5kZXhdID0gdmFsdWU7CisgICAgICAgIG1UcmFuc2Zvcm1UeXBlc1tpbmRleF0gPSB0eXBlOworICAgIH0KKworICAgIHZvaWQgaW5pdERhdGEoKSB7CisgICAgICAgIGludCBudW1UcmFuc2Zvcm1zID0gMTY7CisgICAgICAgIG1UcmFuc2Zvcm1zID0gbmV3IEZsb2F0NFtudW1UcmFuc2Zvcm1zXTsKKyAgICAgICAgbVRyYW5zZm9ybVR5cGVzID0gbmV3IFRyYW5zZm9ybVR5cGVbbnVtVHJhbnNmb3Jtc107CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1UcmFuc2Zvcm1zOyBpICsrKSB7CisgICAgICAgICAgICBtVHJhbnNmb3Jtc1tpXSA9IG5ldyBGbG9hdDQoMCwgMCwgMCwgMCk7CisgICAgICAgICAgICBtVHJhbnNmb3JtVHlwZXNbaV0gPSBUcmFuc2Zvcm1UeXBlLk5PTkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHNldERhdGEoKSB7CisKKyAgICAgICAgbVRyYW5zZm9ybURhdGEuZ2xvYmFsTWF0ID0gbmV3IE1hdHJpeDRmKCk7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLmxvY2FsTWF0ID0gbmV3IE1hdHJpeDRmKCk7CisKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczAgPSBtVHJhbnNmb3Jtc1swXTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczEgPSBtVHJhbnNmb3Jtc1sxXTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczIgPSBtVHJhbnNmb3Jtc1syXTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczMgPSBtVHJhbnNmb3Jtc1szXTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczQgPSBtVHJhbnNmb3Jtc1s0XTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczUgPSBtVHJhbnNmb3Jtc1s1XTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczYgPSBtVHJhbnNmb3Jtc1s2XTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczcgPSBtVHJhbnNmb3Jtc1s3XTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczggPSBtVHJhbnNmb3Jtc1s4XTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczkgPSBtVHJhbnNmb3Jtc1s5XTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczEwID0gbVRyYW5zZm9ybXNbMTBdOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zMTEgPSBtVHJhbnNmb3Jtc1sxMV07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMxMiA9IG1UcmFuc2Zvcm1zWzEyXTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczEzID0gbVRyYW5zZm9ybXNbMTNdOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zMTQgPSBtVHJhbnNmb3Jtc1sxNF07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMxNSA9IG1UcmFuc2Zvcm1zWzE1XTsKKworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlMCA9IG1UcmFuc2Zvcm1UeXBlc1swXS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGUxID0gbVRyYW5zZm9ybVR5cGVzWzFdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTIgPSBtVHJhbnNmb3JtVHlwZXNbMl0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlMyA9IG1UcmFuc2Zvcm1UeXBlc1szXS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGU0ID0gbVRyYW5zZm9ybVR5cGVzWzRdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTUgPSBtVHJhbnNmb3JtVHlwZXNbNV0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlNiA9IG1UcmFuc2Zvcm1UeXBlc1s2XS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGU3ID0gbVRyYW5zZm9ybVR5cGVzWzddLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTggPSBtVHJhbnNmb3JtVHlwZXNbOF0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlOSA9IG1UcmFuc2Zvcm1UeXBlc1s5XS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGUxMCA9IG1UcmFuc2Zvcm1UeXBlc1sxMF0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlMTEgPSBtVHJhbnNmb3JtVHlwZXNbMTFdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTEyID0gbVRyYW5zZm9ybVR5cGVzWzEyXS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGUxMyA9IG1UcmFuc2Zvcm1UeXBlc1sxM10ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlMTQgPSBtVHJhbnNmb3JtVHlwZXNbMTRdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTE1ID0gbVRyYW5zZm9ybVR5cGVzWzE1XS5tSUQ7CisKKyAgICAgICAgbVRyYW5zZm9ybURhdGEuaXNEaXJ0eSA9IDE7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLmNoaWxkcmVuID0gbnVsbDsKKworICAgIH0KKworICAgIHB1YmxpYyBTZ1RyYW5zZm9ybShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgbVJTID0gcnM7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhID0gbmV3IFNjcmlwdEZpZWxkX1NnVHJhbnNmb3JtLkl0ZW0oKTsKKyAgICAgICAgbUNoaWxkcmVuID0gbmV3IFZlY3RvcigpOworICAgICAgICBpbml0RGF0YSgpOworICAgIH0KKworICAgIHB1YmxpYyBTY3JpcHRGaWVsZF9TZ1RyYW5zZm9ybS5JdGVtIGdldERhdGEoKSB7CisgICAgICAgIHNldERhdGEoKTsKKyAgICAgICAgaWYobUNoaWxkcmVuLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICBtQ2hpbGRGaWVsZCA9IG5ldyBTY3JpcHRGaWVsZF9TZ1RyYW5zZm9ybShtUlMsIG1DaGlsZHJlbi5zaXplKCkpOworICAgICAgICAgICAgbVRyYW5zZm9ybURhdGEuY2hpbGRyZW4gPSBtQ2hpbGRGaWVsZC5nZXRBbGxvY2F0aW9uKCk7CisKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBtQ2hpbGRyZW4uc2l6ZSgpOyBpICsrKSB7CisgICAgICAgICAgICAgICAgU2dUcmFuc2Zvcm0gY2hpbGQgPSAoU2dUcmFuc2Zvcm0pbUNoaWxkcmVuLmdldChpKTsKKyAgICAgICAgICAgICAgICBtQ2hpbGRGaWVsZC5zZXQoY2hpbGQuZ2V0RGF0YSgpLCBpLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2hpbGRGaWVsZC5jb3B5QWxsKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbVRyYW5zZm9ybURhdGE7CisgICAgfQorCisgICAgcHVibGljIFNjcmlwdEZpZWxkX1NnVHJhbnNmb3JtIGdldEZpZWxkKCkgeworICAgICAgICBtVHJhbnNmb3JtRmllbGQgPSBuZXcgU2NyaXB0RmllbGRfU2dUcmFuc2Zvcm0obVJTLCAxKTsKKyAgICAgICAgbVRyYW5zZm9ybUZpZWxkLnNldChnZXREYXRhKCksIDAsIHRydWUpOworICAgICAgICByZXR1cm4gbVRyYW5zZm9ybUZpZWxkOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWwuamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjdjMzljCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TaW1wbGVNb2RlbC5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlN5c3RlbTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCitpbXBvcnQgamF2YS5sYW5nLlJ1bnRpbWU7CisKK3B1YmxpYyBjbGFzcyBTaW1wbGVNb2RlbCBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgU2ltcGxlTW9kZWxWaWV3IG1WaWV3OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworCisgICAgICAgIC8vIENyZWF0ZSBvdXIgUHJldmlldyB2aWV3IGFuZCBzZXQgaXQgYXMgdGhlIGNvbnRlbnQgb2Ygb3VyCisgICAgICAgIC8vIEFjdGl2aXR5CisgICAgICAgIG1WaWV3ID0gbmV3IFNpbXBsZU1vZGVsVmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb29zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtVmlldy5vblBhdXNlKCk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWxSUy5qYXZhIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TaW1wbGVNb2RlbFJTLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiZjMwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWxSUy5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworcHVibGljIGNsYXNzIFNpbXBsZU1vZGVsUlMgeworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgU1RBVEVfTEFTVF9GT0NVUyA9IDE7CisKKyAgICBpbnQgbVdpZHRoOworICAgIGludCBtSGVpZ2h0OworICAgIGludCBtUm90YXRpb247CisKKyAgICBwdWJsaWMgU2ltcGxlTW9kZWxSUygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgbVJTID0gcnM7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgICAgIG1XaWR0aCA9IHdpZHRoOworICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBtUm90YXRpb24gPSAwOworICAgICAgICBpbml0UlMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgU2FtcGxlciBtU2FtcGxlcjsKKyAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUFNCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgUHJvZ3JhbUZyYWdtZW50IG1QRkJhY2tncm91bmQ7CisgICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1QVkJhY2tncm91bmQ7CisgICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4Lk1hdHJpeEFsbG9jYXRpb24gbVBWQTsKKworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtR3JpZEltYWdlOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NQVjsKKworICAgIHByaXZhdGUgTWVzaCBtTWVzaDsKKworICAgIHByaXZhdGUgRm9udCBtSXRhbGljOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtVGV4dEFsbG9jOworCisgICAgcHJpdmF0ZSBTY3JpcHRDX3NpbXBsZW1vZGVsIG1TY3JpcHQ7CisKKyAgICBpbnQgbUxhc3RYOworICAgIGludCBtTGFzdFk7CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaEV2ZW50KGludCB4LCBpbnQgeSkgeworICAgICAgICBpbnQgZHggPSBtTGFzdFggLSB4OworICAgICAgICBpZihNYXRoLmFicyhkeCkgPiA1MCB8fCBNYXRoLmFicyhkeCkgPCAzKSB7CisgICAgICAgICAgICBkeCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBtUm90YXRpb24gLT0gZHg7CisgICAgICAgIGlmKG1Sb3RhdGlvbiA+IDM2MCkgeworICAgICAgICAgICAgbVJvdGF0aW9uIC09IDM2MDsKKyAgICAgICAgfQorICAgICAgICBpZihtUm90YXRpb24gPCAwKSB7CisgICAgICAgICAgICBtUm90YXRpb24gKz0gMzYwOworICAgICAgICB9CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1JvdGF0ZSgoZmxvYXQpbVJvdGF0aW9uKTsKKworICAgICAgICBtTGFzdFggPSB4OworICAgICAgICBtTGFzdFkgPSB5OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UEZTKCkgeworICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBiID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKG1SUyk7CisKKyAgICAgICAgYi5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5MRVNTKTsKKyAgICAgICAgYi5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICBiLnNldERlcHRoTWFzayh0cnVlKTsKKyAgICAgICAgbVBTQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1BGU0JhY2tncm91bmQobVBTQmFja2dyb3VuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQRigpIHsKKyAgICAgICAgU2FtcGxlci5CdWlsZGVyIGJzID0gbmV3IFNhbXBsZXIuQnVpbGRlcihtUlMpOworICAgICAgICBicy5zZXRNaW4oU2FtcGxlci5WYWx1ZS5MSU5FQVIpOworICAgICAgICBicy5zZXRNYWcoU2FtcGxlci5WYWx1ZS5MSU5FQVIpOworICAgICAgICBicy5zZXRXcmFwUyhTYW1wbGVyLlZhbHVlLkNMQU1QKTsKKyAgICAgICAgYnMuc2V0V3JhcFQoU2FtcGxlci5WYWx1ZS5DTEFNUCk7CisgICAgICAgIG1TYW1wbGVyID0gYnMuY3JlYXRlKCk7CisKKyAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIgYiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlcihtUlMpOworICAgICAgICBiLnNldFRleHR1cmUoUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRW52TW9kZS5SRVBMQUNFLAorICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRm9ybWF0LlJHQkEsIDApOworICAgICAgICBtUEZCYWNrZ3JvdW5kID0gYi5jcmVhdGUoKTsKKyAgICAgICAgbVBGQmFja2dyb3VuZC5iaW5kU2FtcGxlcihtU2FtcGxlciwgMCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1BGQmFja2dyb3VuZChtUEZCYWNrZ3JvdW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFBWKCkgeworICAgICAgICBQcm9ncmFtVmVydGV4LkJ1aWxkZXIgcHZiID0gbmV3IFByb2dyYW1WZXJ0ZXguQnVpbGRlcihtUlMpOworICAgICAgICBtUFZCYWNrZ3JvdW5kID0gcHZiLmNyZWF0ZSgpOworCisgICAgICAgIG1QVkEgPSBuZXcgUHJvZ3JhbVZlcnRleC5NYXRyaXhBbGxvY2F0aW9uKG1SUyk7CisgICAgICAgIG1QVkJhY2tncm91bmQuYmluZEFsbG9jYXRpb24obVBWQSk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1BWQmFja2dyb3VuZChtUFZCYWNrZ3JvdW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9hZEltYWdlKCkgeworICAgICAgICBtR3JpZEltYWdlID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucm9ib3QsIEVsZW1lbnQuUkdCXzU2NShtUlMpLCB0cnVlKTsKKyAgICAgICAgbUdyaWRJbWFnZS51cGxvYWRUb1RleHR1cmUoMCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RHcmlkKG1HcmlkSW1hZ2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0VGV4dEFsbG9jYXRpb24oKSB7CisgICAgICAgIFN0cmluZyBhbGxvY1N0cmluZyA9ICJEaXNwbGF5aW5nIGZpbGU6IFIucmF3LnJvYm90IjsKKyAgICAgICAgbVRleHRBbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbVN0cmluZyhtUlMsIGFsbG9jU3RyaW5nKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RleHRBbGxvYyhtVGV4dEFsbG9jKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFJTKCkgeworCisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19zaW1wbGVtb2RlbChtUlMsIG1SZXMsIFIucmF3LnNpbXBsZW1vZGVsLCB0cnVlKTsKKworICAgICAgICBpbml0UEZTKCk7CisgICAgICAgIGluaXRQRigpOworICAgICAgICBpbml0UFYoKTsKKworICAgICAgICBsb2FkSW1hZ2UoKTsKKworICAgICAgICBGaWxlQTNEIG1vZGVsID0gRmlsZUEzRC5jcmVhdGVGcm9tUmVzb3VyY2UobVJTLCBtUmVzLCBSLnJhdy5yb2JvdCk7CisgICAgICAgIEZpbGVBM0QuSW5kZXhFbnRyeSBlbnRyeSA9IG1vZGVsLmdldEluZGV4RW50cnkoMCk7CisgICAgICAgIGlmKGVudHJ5ID09IG51bGwgfHwgZW50cnkuZ2V0Q2xhc3NJRCgpICE9IEZpbGVBM0QuQ2xhc3NJRC5NRVNIKSB7CisgICAgICAgICAgICBMb2cuZSgicnMiLCAiY291bGQgbm90IGxvYWQgbW9kZWwiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1NZXNoID0gKE1lc2gpZW50cnkuZ2V0T2JqZWN0KCk7CisgICAgICAgICAgICBtU2NyaXB0LnNldF9nVGVzdE1lc2gobU1lc2gpOworICAgICAgICB9CisKKyAgICAgICAgbUl0YWxpYyA9IEZvbnQuY3JlYXRlKG1SUywgbVJlcywgIkRyb2lkU2VyaWYtSXRhbGljLnR0ZiIsIDgpOworICAgICAgICBtU2NyaXB0LnNldF9nSXRhbGljKG1JdGFsaWMpOworCisgICAgICAgIGluaXRUZXh0QWxsb2NhdGlvbigpOworCisgICAgICAgIG1SUy5jb250ZXh0QmluZFJvb3RTY3JpcHQobVNjcmlwdCk7CisgICAgfQorfQorCisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TaW1wbGVNb2RlbFZpZXcuamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWxWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3NGZkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWxWaWV3LmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubW9kZWx2aWV3ZXI7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworCitwdWJsaWMgY2xhc3MgU2ltcGxlTW9kZWxWaWV3IGV4dGVuZHMgUlNTdXJmYWNlVmlldyB7CisKKyAgICBwdWJsaWMgU2ltcGxlTW9kZWxWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgLy9zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBTaW1wbGVNb2RlbFJTIG1SZW5kZXI7CisKKworICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgc3VwZXIuc3VyZmFjZUNoYW5nZWQoaG9sZGVyLCBmb3JtYXQsIHcsIGgpOworICAgICAgICBpZiAobVJTID09IG51bGwpIHsKKyAgICAgICAgICAgIG1SUyA9IGNyZWF0ZVJlbmRlclNjcmlwdCh0cnVlKTsKKyAgICAgICAgICAgIG1SUy5jb250ZXh0U2V0U3VyZmFjZSh3LCBoLCBob2xkZXIuZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgICAgIG1SZW5kZXIgPSBuZXcgU2ltcGxlTW9kZWxSUygpOworICAgICAgICAgICAgbVJlbmRlci5pbml0KG1SUywgZ2V0UmVzb3VyY2VzKCksIHcsIGgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIGlmKG1SUyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBudWxsOworICAgICAgICAgICAgZGVzdHJveVJlbmRlclNjcmlwdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkKKyAgICB7CisgICAgICAgIC8vIGJyZWFrIHBvaW50IGF0IGhlcmUKKyAgICAgICAgLy8gdGhpcyBtZXRob2QgZG9lc24ndCB3b3JrIHdoZW4gJ2V4dGVuZHMgVmlldycgaW5jbHVkZSAnZXh0ZW5kcyBTY3JvbGxWaWV3Jy4KKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpCisgICAgeworICAgICAgICBib29sZWFuIHJldCA9IHRydWU7CisgICAgICAgIGludCBhY3QgPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgaWYgKGFjdCA9PSBldi5BQ1RJT05fVVApIHsKKyAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbVJlbmRlci50b3VjaEV2ZW50KChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvc2NlbmVncmFwaC5ycyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvc2NlbmVncmFwaC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTZiYjFlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9zY2VuZWdyYXBoLnJzCkBAIC0wLDAgKzEsOTYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5tb2RlbHZpZXdlcikKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKyNpbmNsdWRlICJ0cmFuc2Zvcm1fZGVmLnJzaCIKKworcnNfcHJvZ3JhbV92ZXJ0ZXggZ1BWQmFja2dyb3VuZDsKK3JzX3Byb2dyYW1fZnJhZ21lbnQgZ1BGQmFja2dyb3VuZDsKKworcnNfYWxsb2NhdGlvbiBnVEdyaWQ7Cityc19tZXNoIGdUZXN0TWVzaDsKKworcnNfcHJvZ3JhbV9zdG9yZSBnUEZTQmFja2dyb3VuZDsKKworZmxvYXQgZ1JvdGF0ZTsKKworcnNfZm9udCBnSXRhbGljOworcnNfYWxsb2NhdGlvbiBnVGV4dEFsbG9jOworCityc19zY3JpcHQgZ1RyYW5zZm9ybVJTOworCitTZ1RyYW5zZm9ybSAqZ0dyb3VwOworU2dUcmFuc2Zvcm0gKmdSb2JvdDE7CitpbnQgZ1JvYm90MUluZGV4OworU2dUcmFuc2Zvcm0gKmdSb2JvdDI7CitpbnQgZ1JvYm90MkluZGV4OworCitTZ1RyYW5zZm9ybSAqZ1Jvb3ROb2RlOworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ1BWQmFja2dyb3VuZCwgZ1BGQmFja2dyb3VuZCwgZ1RHcmlkLCBnVGVzdE1lc2gsIGdQRlNCYWNrZ3JvdW5kLCBnUm90YXRlLCBnSXRhbGljLCBnVGV4dEFsbG9jLCBnVHJhbnNmb3JtUlMsIGdHcm91cCwgZ1JvYm90MSwgZ1JvYm90MUluZGV4LCBnUm9ib3QyLCBnUm9ib3QySW5kZXgsIGdSb290Tm9kZSkKKworZmxvYXQgZ0RUOworaW50NjRfdCBnTGFzdFRpbWU7CisKK3ZvaWQgaW5pdCgpIHsKKyAgICBnUm90YXRlID0gMC4wZjsKK30KKworaW50IHJvb3QoaW50IGxhdW5jaElEKSB7CisKKyAgICBnR3JvdXAtPnRyYW5zZm9ybXMxLncgKz0gMC41ZjsKKyAgICBnR3JvdXAtPmlzRGlydHkgPSAxOworCisgICAgU2dUcmFuc2Zvcm0gKnJvYm90MVB0ciA9IGdSb2JvdDEgKyBnUm9ib3QxSW5kZXg7CisKKyAgICByb2JvdDFQdHItPnRyYW5zZm9ybXMxLncgLT0gMS41ZjsKKyAgICByb2JvdDFQdHItPmlzRGlydHkgPSAxOworCisgICAgU2dUcmFuc2Zvcm0gKnJvYm90MlB0ciA9IGdSb2JvdDIgKyBnUm9ib3QySW5kZXg7CisgICAgcm9ib3QyUHRyLT50cmFuc2Zvcm1zMS53ICs9IDIuNWY7CisgICAgcm9ib3QyUHRyLT5pc0RpcnR5ID0gMTsKKworICAgIHJzRm9yRWFjaChnVHJhbnNmb3JtUlMsIGdSb290Tm9kZS0+Y2hpbGRyZW4sIGdSb290Tm9kZS0+Y2hpbGRyZW4sIDApOworCisgICAgcnNnQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dDbGVhckRlcHRoKDEuMGYpOworCisgICAgcnNnQmluZFByb2dyYW1WZXJ0ZXgoZ1BWQmFja2dyb3VuZCk7CisgICAgcnNfbWF0cml4NHg0IHByb2o7CisgICAgZmxvYXQgYXNwZWN0ID0gKGZsb2F0KXJzZ0dldFdpZHRoKCkgLyAoZmxvYXQpcnNnR2V0SGVpZ2h0KCk7CisgICAgcnNNYXRyaXhMb2FkUGVyc3BlY3RpdmUoJnByb2osIDMwLjBmLCBhc3BlY3QsIDAuMWYsIDEwMC4wZik7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRQcm9qZWN0aW9uTWF0cml4KCZwcm9qKTsKKworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1BGQmFja2dyb3VuZCk7CisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUEZTQmFja2dyb3VuZCk7CisgICAgcnNnQmluZFRleHR1cmUoZ1BGQmFja2dyb3VuZCwgMCwgZ1RHcmlkKTsKKworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJnJvYm90MVB0ci0+Z2xvYmFsTWF0KTsKKyAgICByc2dEcmF3TWVzaChnVGVzdE1lc2gpOworCisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmcm9ib3QyUHRyLT5nbG9iYWxNYXQpOworICAgIHJzZ0RyYXdNZXNoKGdUZXN0TWVzaCk7CisKKyAgICBjb2xvcigwLjNmLCAwLjNmLCAwLjNmLCAxLjBmKTsKKyAgICByc2dEcmF3VGV4dCgiUmVuZGVyc2NyaXB0IHRyYW5zZm9ybSB0ZXN0IiwgMzAsIDY5NSk7CisKKyAgICByc2dCaW5kRm9udChnSXRhbGljKTsKKyAgICByc2dEcmF3VGV4dChnVGV4dEFsbG9jLCAzMCwgNzMwKTsKKworICAgIHJldHVybiAxMDsKK30KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvc2ltcGxlbW9kZWwucnMgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3NpbXBsZW1vZGVsLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYmUyNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3NpbXBsZW1vZGVsLnJzCkBAIC0wLDAgKzEsNzYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5tb2RlbHZpZXdlcikKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKworcnNfcHJvZ3JhbV92ZXJ0ZXggZ1BWQmFja2dyb3VuZDsKK3JzX3Byb2dyYW1fZnJhZ21lbnQgZ1BGQmFja2dyb3VuZDsKKworcnNfYWxsb2NhdGlvbiBnVEdyaWQ7Cityc19tZXNoIGdUZXN0TWVzaDsKKworcnNfcHJvZ3JhbV9zdG9yZSBnUEZTQmFja2dyb3VuZDsKKworZmxvYXQgZ1JvdGF0ZTsKKworcnNfZm9udCBnSXRhbGljOworcnNfYWxsb2NhdGlvbiBnVGV4dEFsbG9jOworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ1BWQmFja2dyb3VuZCwgZ1BGQmFja2dyb3VuZCwgZ1RHcmlkLCBnVGVzdE1lc2gsIGdQRlNCYWNrZ3JvdW5kLCBnUm90YXRlLCBnSXRhbGljLCBnVGV4dEFsbG9jKQorCitmbG9hdCBnRFQ7CitpbnQ2NF90IGdMYXN0VGltZTsKKwordm9pZCBpbml0KCkgeworICAgIGdSb3RhdGUgPSAwLjBmOworfQorCitpbnQgcm9vdChpbnQgbGF1bmNoSUQpIHsKKworICAgIHJzZ0NsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQ2xlYXJEZXB0aCgxLjBmKTsKKworICAgIHJzZ0JpbmRQcm9ncmFtVmVydGV4KGdQVkJhY2tncm91bmQpOworICAgIHJzX21hdHJpeDR4NCBwcm9qOworICAgIGZsb2F0IGFzcGVjdCA9IChmbG9hdClyc2dHZXRXaWR0aCgpIC8gKGZsb2F0KXJzZ0dldEhlaWdodCgpOworICAgIHJzTWF0cml4TG9hZFBlcnNwZWN0aXZlKCZwcm9qLCAzMC4wZiwgYXNwZWN0LCAwLjFmLCAxMDAuMGYpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkUHJvamVjdGlvbk1hdHJpeCgmcHJvaik7CisKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQRkJhY2tncm91bmQpOworICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1BGU0JhY2tncm91bmQpOworICAgIHJzZ0JpbmRUZXh0dXJlKGdQRkJhY2tncm91bmQsIDAsIGdUR3JpZCk7CisKKyAgICByc19tYXRyaXg0eDQgbWF0cml4OworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KCZtYXRyaXgpOworICAgIC8vIFBvc2l0aW9uIG91ciBtb2RlbCBvbiB0aGUgc2NyZWVuCisgICAgcnNNYXRyaXhUcmFuc2xhdGUoJm1hdHJpeCwgMC4wZiwgLTAuM2YsIC0xMC4wZik7CisgICAgcnNNYXRyaXhTY2FsZSgmbWF0cml4LCAwLjJmLCAwLjJmLCAwLjJmKTsKKyAgICByc01hdHJpeFJvdGF0ZSgmbWF0cml4LCAyNS4wZiwgMS4wZiwgMC4wZiwgMC4wZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJm1hdHJpeCwgZ1JvdGF0ZSwgMC4wZiwgMS4wZiwgMC4wZik7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmbWF0cml4KTsKKworICAgIHJzZ0RyYXdNZXNoKGdUZXN0TWVzaCk7CisKKyAgICByc2dGb250Q29sb3IoMC4zZiwgMC4zZiwgMC4zZiwgMS4wZik7CisgICAgcnNnRHJhd1RleHQoIlJlbmRlcnNjcmlwdCBtb2RlbCB0ZXN0IiwgMzAsIDY5NSk7CisKKyAgICByc2dCaW5kRm9udChnSXRhbGljKTsKKyAgICByc2dEcmF3VGV4dChnVGV4dEFsbG9jLCAzMCwgNzMwKTsKKworICAgIHJldHVybiAxMDsKK30KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvdHJhbnNmb3JtLnJzIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci90cmFuc2Zvcm0ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVmMjljZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvdHJhbnNmb3JtLnJzCkBAIC0wLDAgKzEsMTAyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQubW9kZWx2aWV3ZXIpCisKKyNpbmNsdWRlICJ0cmFuc2Zvcm1fZGVmLnJzaCIKKworcnNfc2NyaXB0IHRyYW5zZm9ybVNjcmlwdDsKKworI3ByYWdtYSBycyBleHBvcnRfdmFyKHRyYW5zZm9ybVNjcmlwdCkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBjaGFuZ2VkOworICAgIHJzX21hdHJpeDR4NCAqbWF0OworfSBQYXJlbnREYXRhOworCit2b2lkIGFwcGVuZFRyYW5zZm9ybWF0aW9uKGludCB0eXBlLCBmbG9hdDQgZGF0YSwgcnNfbWF0cml4NHg0ICptYXQpIHsKKyAgICByc19tYXRyaXg0eDQgdGVtcDsKKworICAgIHN3aXRjaCh0eXBlKSB7CisgICAgY2FzZSBUUkFOU0ZPUk1fVFJBTlNMQVRFOgorICAgICAgICByc01hdHJpeExvYWRUcmFuc2xhdGUoJnRlbXAsIGRhdGEueCwgZGF0YS55LCBkYXRhLnopOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRSQU5TRk9STV9ST1RBVEU6CisgICAgICAgIHJzTWF0cml4TG9hZFJvdGF0ZSgmdGVtcCwgZGF0YS53LCBkYXRhLngsIGRhdGEueSwgZGF0YS56KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFOU0ZPUk1fU0NBTEU6CisgICAgICAgIHJzTWF0cml4TG9hZFNjYWxlKCZ0ZW1wLCBkYXRhLngsIGRhdGEueSwgZGF0YS56KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJzTWF0cml4TXVsdGlwbHkobWF0LCAmdGVtcCk7Cit9CisKK3ZvaWQgcm9vdChjb25zdCB2b2lkICp2X2luLCB2b2lkICp2X291dCwgY29uc3Qgdm9pZCAqdXNyRGF0YSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworCisgICAgU2dUcmFuc2Zvcm0gKmRhdGEgPSAoU2dUcmFuc2Zvcm0gKil2X291dDsKKyAgICBjb25zdCBQYXJlbnREYXRhICpwYXJlbnQgPSAoY29uc3QgUGFyZW50RGF0YSAqKXVzckRhdGE7CisKKyAgICAvL3JzRGVidWcoIlRyYW5zZm9ybSBkYXRhIiwgKGludClkYXRhKTsKKyAgICAvL3JzRGVidWcoIkVudGVyaW5nIHBhcmVudCIsIChpbnQpcGFyZW50KTsKKworICAgIHJzX21hdHJpeDR4NCAqbG9jYWxNYXQgPSAmZGF0YS0+bG9jYWxNYXQ7CisgICAgcnNfbWF0cml4NHg0ICpnbG9iYWxNYXQgPSAmZGF0YS0+Z2xvYmFsTWF0OworCisgICAgUGFyZW50RGF0YSB0b0NoaWxkOworICAgIHRvQ2hpbGQuY2hhbmdlZCA9IDA7CisgICAgdG9DaGlsZC5tYXQgPSBnbG9iYWxNYXQ7CisKKyAgICAvL3JzRGVidWcoIlRyYW5zZm9ybSBpcyBkaXJ0eSIsIGRhdGEtPmlzRGlydHkpOworCisgICAgLy8gUmVmcmVzaCBtYXRyaWNlcyBpZiBkaXJ0eQorICAgIGlmKGRhdGEtPmlzRGlydHkpIHsKKyAgICAgICAgZGF0YS0+aXNEaXJ0eSA9IDA7CisgICAgICAgIHRvQ2hpbGQuY2hhbmdlZCA9IDE7CisKKyAgICAgICAgLy8gUmVzZXQgb3VyIGxvY2FsIG1hdHJpeAorICAgICAgICByc01hdHJpeExvYWRJZGVudGl0eShsb2NhbE1hdCk7CisKKyAgICAgICAgZmxvYXQ0ICp0cmFuc2Zvcm1Tb3VyY2UgPSAmZGF0YS0+dHJhbnNmb3JtczA7CisgICAgICAgIGludCAqdHJhbnNmb3JtVHlwZXMgPSAmZGF0YS0+dHJhbnNmb3JtVHlwZTA7CisKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDE2OyBpICsrKSB7CisgICAgICAgICAgICBpZih0cmFuc2Zvcm1UeXBlc1tpXSA9PSBUUkFOU0ZPUk1fTk9ORSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9yc0RlYnVnKCJUcmFuc2Zvcm0gYWRkaW5nIHRyYW5zZm9ybWF0aW9uIiwgdHJhbnNmb3JtVHlwZXNbaV0pOworICAgICAgICAgICAgYXBwZW5kVHJhbnNmb3JtYXRpb24odHJhbnNmb3JtVHlwZXNbaV0sIHRyYW5zZm9ybVNvdXJjZVtpXSwgbG9jYWxNYXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy9yc0RlYnVnKCJUcmFuc2Zvcm0gY2hlY2tpbmcgcGFyZW50IiwgKGludCkwKTsKKworICAgIGlmKHBhcmVudCkgeworICAgICAgICBpZihwYXJlbnQtPmNoYW5nZWQpIHsKKyAgICAgICAgICAgIHRvQ2hpbGQuY2hhbmdlZCA9IDE7CisKKyAgICAgICAgICAgIHJzTWF0cml4TG9hZChnbG9iYWxNYXQsIHBhcmVudC0+bWF0KTsKKyAgICAgICAgICAgIHJzTWF0cml4TXVsdGlwbHkoZ2xvYmFsTWF0LCBsb2NhbE1hdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzTWF0cml4TG9hZChnbG9iYWxNYXQsIGxvY2FsTWF0KTsKKyAgICB9CisKKyAgICAvL3JzRGVidWcoIlRyYW5zZm9ybSBjYWxsaW5nIHNlbGYgd2l0aCBjaGlsZCAiLCAoaW50KWRhdGEtPmNoaWxkcmVuLnApOworICAgIGlmKGRhdGEtPmNoaWxkcmVuLnApIHsKKyAgICAgICAgcnNGb3JFYWNoKHRyYW5zZm9ybVNjcmlwdCwgZGF0YS0+Y2hpbGRyZW4sIGRhdGEtPmNoaWxkcmVuLCAodm9pZCopJnRvQ2hpbGQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvdHJhbnNmb3JtX2RlZi5yc2ggYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3RyYW5zZm9ybV9kZWYucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjODcyYTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3RyYW5zZm9ybV9kZWYucnNoCkBAIC0wLDAgKzEsNjYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5tb2RlbHZpZXdlcikKKworI2RlZmluZSBUUkFOU0ZPUk1fTk9ORSAwCisjZGVmaW5lIFRSQU5TRk9STV9UUkFOU0xBVEUgMQorI2RlZmluZSBUUkFOU0ZPUk1fUk9UQVRFIDIKKyNkZWZpbmUgVFJBTlNGT1JNX1NDQUxFIDMKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHJzX21hdHJpeDR4NCBnbG9iYWxNYXQ7CisgICAgcnNfbWF0cml4NHg0IGxvY2FsTWF0OworCisgICAgZmxvYXQ0IHRyYW5zZm9ybXMwOworICAgIGZsb2F0NCB0cmFuc2Zvcm1zMTsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczI7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXMzOworICAgIGZsb2F0NCB0cmFuc2Zvcm1zNDsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczU7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXM2OworICAgIGZsb2F0NCB0cmFuc2Zvcm1zNzsKKyAgICBmbG9hdDQgdHJhbnNmb3Jtczg7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXM5OworICAgIGZsb2F0NCB0cmFuc2Zvcm1zMTA7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXMxMTsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczEyOworICAgIGZsb2F0NCB0cmFuc2Zvcm1zMTM7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXMxNDsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczE1OworCisgICAgaW50IHRyYW5zZm9ybVR5cGUwOworICAgIGludCB0cmFuc2Zvcm1UeXBlMTsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTI7CisgICAgaW50IHRyYW5zZm9ybVR5cGUzOworICAgIGludCB0cmFuc2Zvcm1UeXBlNDsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTU7CisgICAgaW50IHRyYW5zZm9ybVR5cGU2OworICAgIGludCB0cmFuc2Zvcm1UeXBlNzsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTg7CisgICAgaW50IHRyYW5zZm9ybVR5cGU5OworICAgIGludCB0cmFuc2Zvcm1UeXBlMTA7CisgICAgaW50IHRyYW5zZm9ybVR5cGUxMTsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTEyOworICAgIGludCB0cmFuc2Zvcm1UeXBlMTM7CisgICAgaW50IHRyYW5zZm9ybVR5cGUxNDsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTE1OworCisgICAgaW50IGlzRGlydHk7CisKKyAgICByc19hbGxvY2F0aW9uIGNoaWxkcmVuOworCit9IFNnVHJhbnNmb3JtOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvQW5kcm9pZC5tayBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVhZTczNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMSBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgJChjYWxsIGFsbC1yZW5kZXJzY3JpcHQtZmlsZXMtdW5kZXIsIHNyYykKKyNMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC5yZW5kZXJzY3JpcHQKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFNhbXBsZXMKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTE5MWYyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5zYW1wbGVzIj4KKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iU2FtcGxlcyIKKyAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS90ZXN0X3BhdHRlcm4iPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJSc0xpc3QiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJSc0xpc3QiICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5CbGFjay5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlJzUmVuZGVyU3RhdGVzIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iUnNTdGF0ZXMiICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5CbGFjay5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS9jaGVja2VyLnBuZyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS9jaGVja2VyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjMxZTFlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL2NoZWNrZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS9kYXRhLnBuZyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS9kYXRhLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTM0NzE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL2RhdGEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS9sZWFmLnBuZyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS9sZWFmLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2QzNzc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL2xlYWYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS90ZXN0X3BhdHRlcm4ucG5nIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL3Rlc3RfcGF0dGVybi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkMTQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS90ZXN0X3BhdHRlcm4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS90b3J1c21hcC5wbmcgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvdG9ydXNtYXAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMDhmM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvdG9ydXNtYXAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9yYXcvbXVsdGl0ZXhmLmdsc2wgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvcmF3L211bHRpdGV4Zi5nbHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MWZmOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvcmF3L211bHRpdGV4Zi5nbHNsCkBAIC0wLDAgKzEsMTIgQEAKK3ZhcnlpbmcgdmVjMiB2YXJUZXgwOworCit2b2lkIG1haW4oKSB7CisgICB2ZWMyIHQwID0gdmFyVGV4MC54eTsKKyAgIGxvd3AgdmVjNCBjb2wwID0gdGV4dHVyZTJEKFVOSV9UZXgwLCB0MCkucmdiYTsKKyAgIGxvd3AgdmVjNCBjb2wxID0gdGV4dHVyZTJEKFVOSV9UZXgxLCB0MCo0LjApLnJnYmE7CisgICBsb3dwIHZlYzQgY29sMiA9IHRleHR1cmUyRChVTklfVGV4MiwgdDApLnJnYmE7CisgICBjb2wwLnh5eiA9IGNvbDAueHl6KmNvbDEueHl6KjEuNTsKKyAgIGNvbDAueHl6ID0gbWl4KGNvbDAueHl6LCBjb2wyLnh5eiwgY29sMi53KTsKKyAgIGdsX0ZyYWdDb2xvciA9IGNvbDA7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9yYXcvc2hhZGVyZi5nbHNsIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL3Jhdy9zaGFkZXJmLmdsc2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiZTdlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9yYXcvc2hhZGVyZi5nbHNsCkBAIC0wLDAgKzEsMTYgQEAKKwordmFyeWluZyBsb3dwIGZsb2F0IGxpZ2h0MF9EaWZmdXNlOwordmFyeWluZyBsb3dwIGZsb2F0IGxpZ2h0MF9TcGVjdWxhcjsKK3ZhcnlpbmcgbG93cCBmbG9hdCBsaWdodDFfRGlmZnVzZTsKK3ZhcnlpbmcgbG93cCBmbG9hdCBsaWdodDFfU3BlY3VsYXI7Cit2YXJ5aW5nIHZlYzIgdmFyVGV4MDsKKwordm9pZCBtYWluKCkgeworICAgdmVjMiB0MCA9IHZhclRleDAueHk7CisgICBsb3dwIHZlYzQgY29sID0gdGV4dHVyZTJEKFVOSV9UZXgwLCB0MCkucmdiYTsKKyAgIGNvbC54eXogPSBjb2wueHl6ICogKGxpZ2h0MF9EaWZmdXNlICogVU5JX2xpZ2h0MF9EaWZmdXNlQ29sb3IgKyBsaWdodDFfRGlmZnVzZSAqIFVOSV9saWdodDFfRGlmZnVzZUNvbG9yKTsKKyAgIGNvbC54eXogKz0gbGlnaHQwX1NwZWN1bGFyICogVU5JX2xpZ2h0MF9TcGVjdWxhckNvbG9yOworICAgY29sLnh5eiArPSBsaWdodDFfU3BlY3VsYXIgKiBVTklfbGlnaHQxX1NwZWN1bGFyQ29sb3I7CisgICBnbF9GcmFnQ29sb3IgPSBjb2w7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9yYXcvc2hhZGVydi5nbHNsIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL3Jhdy9zaGFkZXJ2Lmdsc2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3NTg5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvcmF3L3NoYWRlcnYuZ2xzbApAQCAtMCwwICsxLDMwIEBACit2YXJ5aW5nIGZsb2F0IGxpZ2h0MF9EaWZmdXNlOwordmFyeWluZyBmbG9hdCBsaWdodDBfU3BlY3VsYXI7Cit2YXJ5aW5nIGZsb2F0IGxpZ2h0MV9EaWZmdXNlOwordmFyeWluZyBmbG9hdCBsaWdodDFfU3BlY3VsYXI7Cit2YXJ5aW5nIHZlYzIgdmFyVGV4MDsKKworLy8gVGhpcyBpcyB3aGVyZSBhY3R1YWwgc2hhZGVyIGNvZGUgYmVnaW5zCit2b2lkIG1haW4oKSB7CisgICB2ZWM0IHdvcmxkUG9zID0gVU5JX21vZGVsICogQVRUUklCX3Bvc2l0aW9uOworICAgZ2xfUG9zaXRpb24gPSBVTklfcHJvaiAqIHdvcmxkUG9zOworCisgICBtYXQzIG1vZGVsMyA9IG1hdDMoVU5JX21vZGVsWzBdLnh5eiwgVU5JX21vZGVsWzFdLnh5eiwgVU5JX21vZGVsWzJdLnh5eik7CisgICB2ZWMzIHdvcmxkTm9ybSA9IG1vZGVsMyAqIEFUVFJJQl9ub3JtYWw7CisgICB2ZWMzIFYgPSBub3JtYWxpemUoLXdvcmxkUG9zLnh5eik7CisKKyAgIHZlYzMgbGlnaHQwVmVjID0gbm9ybWFsaXplKFVOSV9saWdodDBfUG9zaXNpb24gLSB3b3JsZFBvcy54eXopOworICAgdmVjMyBsaWdodDBSID0gcmVmbGVjdChsaWdodDBWZWMsIHdvcmxkTm9ybSk7CisgICBsaWdodDBfRGlmZnVzZSA9IGNsYW1wKGRvdCh3b3JsZE5vcm0sIGxpZ2h0MFZlYyksIDAuMCwgMS4wKSAqIFVOSV9saWdodDBfRGlmZnVzZTsKKyAgIGZsb2F0IGxpZ2h0MFNwZWMgPSBjbGFtcChkb3QobGlnaHQwUiwgViksIDAuMDAxLCAxLjApOworICAgbGlnaHQwX1NwZWN1bGFyID0gcG93KGxpZ2h0MFNwZWMsIFVOSV9saWdodDBfQ29zaW5lUG93ZXIpICogVU5JX2xpZ2h0MF9TcGVjdWxhcjsKKworICAgdmVjMyBsaWdodDFWZWMgPSBub3JtYWxpemUoVU5JX2xpZ2h0MV9Qb3Npc2lvbiAtIHdvcmxkUG9zLnh5eik7CisgICB2ZWMzIGxpZ2h0MVIgPSByZWZsZWN0KGxpZ2h0MVZlYywgd29ybGROb3JtKTsKKyAgIGxpZ2h0MV9EaWZmdXNlID0gY2xhbXAoZG90KHdvcmxkTm9ybSwgbGlnaHQxVmVjKSwgMC4wLCAxLjApICogVU5JX2xpZ2h0MV9EaWZmdXNlOworICAgZmxvYXQgbGlnaHQxU3BlYyA9IGNsYW1wKGRvdChsaWdodDFSLCBWKSwgMC4wMDEsIDEuMCk7CisgICBsaWdodDFfU3BlY3VsYXIgPSBwb3cobGlnaHQxU3BlYywgVU5JX2xpZ2h0MV9Db3NpbmVQb3dlcikgKiBVTklfbGlnaHQxX1NwZWN1bGFyOworCisgICBnbF9Qb2ludFNpemUgPSAxLjA7CisgICB2YXJUZXgwID0gQVRUUklCX3RleHR1cmUwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL3Jhdy90b3J1cy5hM2QgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvcmF3L3RvcnVzLmEzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzIyYjAxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL3Jhdy90b3J1cy5hM2QKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNMaXN0LmphdmEgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjZiMWFjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNMaXN0LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2FtcGxlczsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TeXN0ZW07CitpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKKworaW1wb3J0IGphdmEubGFuZy5SdW50aW1lOworCitwdWJsaWMgY2xhc3MgUnNMaXN0IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBSc0xpc3RWaWV3IG1WaWV3OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworCisgICAgICAgIC8vIENyZWF0ZSBvdXIgUHJldmlldyB2aWV3IGFuZCBzZXQgaXQgYXMgdGhlIGNvbnRlbnQgb2Ygb3VyCisgICAgICAgIC8vIEFjdGl2aXR5CisgICAgICAgIG1WaWV3ID0gbmV3IFJzTGlzdFZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNMaXN0UlMuamF2YSBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzTGlzdFJTLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFlZWE4NzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3RSUy5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zYW1wbGVzOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKK3B1YmxpYyBjbGFzcyBSc0xpc3RSUyB7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBTVEFURV9MQVNUX0ZPQ1VTID0gMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERBVEFfTElTVCA9IHsKKyAgICAiQWZnaGFuaXN0YW4iLCAiQWxiYW5pYSIsICJBbGdlcmlhIiwgIkFtZXJpY2FuIFNhbW9hIiwgIkFuZG9ycmEiLAorICAgICJBbmdvbGEiLCAiQW5ndWlsbGEiLCAiQW50YXJjdGljYSIsICJBbnRpZ3VhIGFuZCBCYXJidWRhIiwgIkFyZ2VudGluYSIsCisgICAgIkFybWVuaWEiLCAiQXJ1YmEiLCAiQXVzdHJhbGlhIiwgIkF1c3RyaWEiLCAiQXplcmJhaWphbiIsCisgICAgIkJhaHJhaW4iLCAiQmFuZ2xhZGVzaCIsICJCYXJiYWRvcyIsICJCZWxhcnVzIiwgIkJlbGdpdW0iLAorICAgICJCZWxpemUiLCAiQmVuaW4iLCAiQmVybXVkYSIsICJCaHV0YW4iLCAiQm9saXZpYSIsCisgICAgIkJvc25pYSBhbmQgSGVyemVnb3ZpbmEiLCAiQm90c3dhbmEiLCAiQm91dmV0IElzbGFuZCIsICJCcmF6aWwiLAorICAgICJCcml0aXNoIEluZGlhbiBPY2VhbiBUZXJyaXRvcnkiLCAiQnJpdGlzaCBWaXJnaW4gSXNsYW5kcyIsICJCcnVuZWkiLCAiQnVsZ2FyaWEiLAorICAgICJCdXJraW5hIEZhc28iLCAiQnVydW5kaSIsICJDb3RlIGQnSXZvaXJlIiwgIkNhbWJvZGlhIiwgIkNhbWVyb29uIiwgIkNhbmFkYSIsICJDYXBlIFZlcmRlIiwKKyAgICAiQ2F5bWFuIElzbGFuZHMiLCAiQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljIiwgIkNoYWQiLCAiQ2hpbGUiLCAiQ2hpbmEiLAorICAgICJDaHJpc3RtYXMgSXNsYW5kIiwgIkNvY29zIChLZWVsaW5nKSBJc2xhbmRzIiwgIkNvbG9tYmlhIiwgIkNvbW9yb3MiLCAiQ29uZ28iLAorICAgICJDb29rIElzbGFuZHMiLCAiQ29zdGEgUmljYSIsICJDcm9hdGlhIiwgIkN1YmEiLCAiQ3lwcnVzIiwgIkN6ZWNoIFJlcHVibGljIiwKKyAgICAiRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUgQ29uZ28iLCAiRGVubWFyayIsICJEamlib3V0aSIsICJEb21pbmljYSIsICJEb21pbmljYW4gUmVwdWJsaWMiLAorICAgICJFYXN0IFRpbW9yIiwgIkVjdWFkb3IiLCAiRWd5cHQiLCAiRWwgU2FsdmFkb3IiLCAiRXF1YXRvcmlhbCBHdWluZWEiLCAiRXJpdHJlYSIsCisgICAgIkVzdG9uaWEiLCAiRXRoaW9waWEiLCAiRmFlcm9lIElzbGFuZHMiLCAiRmFsa2xhbmQgSXNsYW5kcyIsICJGaWppIiwgIkZpbmxhbmQiLAorICAgICJGb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YgTWFjZWRvbmlhIiwgIkZyYW5jZSIsICJGcmVuY2ggR3VpYW5hIiwgIkZyZW5jaCBQb2x5bmVzaWEiLAorICAgICJGcmVuY2ggU291dGhlcm4gVGVycml0b3JpZXMiLCAiR2Fib24iLCAiR2VvcmdpYSIsICJHZXJtYW55IiwgIkdoYW5hIiwgIkdpYnJhbHRhciIsCisgICAgIkdyZWVjZSIsICJHcmVlbmxhbmQiLCAiR3JlbmFkYSIsICJHdWFkZWxvdXBlIiwgIkd1YW0iLCAiR3VhdGVtYWxhIiwgIkd1aW5lYSIsICJHdWluZWEtQmlzc2F1IiwKKyAgICAiR3V5YW5hIiwgIkhhaXRpIiwgIkhlYXJkIElzbGFuZCBhbmQgTWNEb25hbGQgSXNsYW5kcyIsICJIb25kdXJhcyIsICJIb25nIEtvbmciLCAiSHVuZ2FyeSIsCisgICAgIkljZWxhbmQiLCAiSW5kaWEiLCAiSW5kb25lc2lhIiwgIklyYW4iLCAiSXJhcSIsICJJcmVsYW5kIiwgIklzcmFlbCIsICJJdGFseSIsICJKYW1haWNhIiwKKyAgICAiSmFwYW4iLCAiSm9yZGFuIiwgIkthemFraHN0YW4iLCAiS2VueWEiLCAiS2lyaWJhdGkiLCAiS3V3YWl0IiwgIkt5cmd5enN0YW4iLCAiTGFvcyIsCisgICAgIkxhdHZpYSIsICJMZWJhbm9uIiwgIkxlc290aG8iLCAiTGliZXJpYSIsICJMaWJ5YSIsICJMaWVjaHRlbnN0ZWluIiwgIkxpdGh1YW5pYSIsICJMdXhlbWJvdXJnIiwKKyAgICAiTWFjYXUiLCAiTWFkYWdhc2NhciIsICJNYWxhd2kiLCAiTWFsYXlzaWEiLCAiTWFsZGl2ZXMiLCAiTWFsaSIsICJNYWx0YSIsICJNYXJzaGFsbCBJc2xhbmRzIiwKKyAgICAiTWFydGluaXF1ZSIsICJNYXVyaXRhbmlhIiwgIk1hdXJpdGl1cyIsICJNYXlvdHRlIiwgIk1leGljbyIsICJNaWNyb25lc2lhIiwgIk1vbGRvdmEiLAorICAgICJNb25hY28iLCAiTW9uZ29saWEiLCAiTW9udHNlcnJhdCIsICJNb3JvY2NvIiwgIk1vemFtYmlxdWUiLCAiTXlhbm1hciIsICJOYW1pYmlhIiwKKyAgICAiTmF1cnUiLCAiTmVwYWwiLCAiTmV0aGVybGFuZHMiLCAiTmV0aGVybGFuZHMgQW50aWxsZXMiLCAiTmV3IENhbGVkb25pYSIsICJOZXcgWmVhbGFuZCIsCisgICAgIk5pY2FyYWd1YSIsICJOaWdlciIsICJOaWdlcmlhIiwgIk5pdWUiLCAiTm9yZm9sayBJc2xhbmQiLCAiTm9ydGggS29yZWEiLCAiTm9ydGhlcm4gTWFyaWFuYXMiLAorICAgICJOb3J3YXkiLCAiT21hbiIsICJQYWtpc3RhbiIsICJQYWxhdSIsICJQYW5hbWEiLCAiUGFwdWEgTmV3IEd1aW5lYSIsICJQYXJhZ3VheSIsICJQZXJ1IiwKKyAgICAiUGhpbGlwcGluZXMiLCAiUGl0Y2Fpcm4gSXNsYW5kcyIsICJQb2xhbmQiLCAiUG9ydHVnYWwiLCAiUHVlcnRvIFJpY28iLCAiUWF0YXIiLAorICAgICJSZXVuaW9uIiwgIlJvbWFuaWEiLCAiUnVzc2lhIiwgIlJ3YW5kYSIsICJTcW8gVG9tZSBhbmQgUHJpbmNpcGUiLCAiU2FpbnQgSGVsZW5hIiwKKyAgICAiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIiwgIlNhaW50IEx1Y2lhIiwgIlNhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24iLAorICAgICJTYWludCBWaW5jZW50IGFuZCB0aGUgR3JlbmFkaW5lcyIsICJTYW1vYSIsICJTYW4gTWFyaW5vIiwgIlNhdWRpIEFyYWJpYSIsICJTZW5lZ2FsIiwKKyAgICAiU2V5Y2hlbGxlcyIsICJTaWVycmEgTGVvbmUiLCAiU2luZ2Fwb3JlIiwgIlNsb3Zha2lhIiwgIlNsb3ZlbmlhIiwgIlNvbG9tb24gSXNsYW5kcyIsCisgICAgIlNvbWFsaWEiLCAiU291dGggQWZyaWNhIiwgIlNvdXRoIEdlb3JnaWEgYW5kIHRoZSBTb3V0aCBTYW5kd2ljaCBJc2xhbmRzIiwgIlNvdXRoIEtvcmVhIiwKKyAgICAiU3BhaW4iLCAiU3JpIExhbmthIiwgIlN1ZGFuIiwgIlN1cmluYW1lIiwgIlN2YWxiYXJkIGFuZCBKYW4gTWF5ZW4iLCAiU3dhemlsYW5kIiwgIlN3ZWRlbiIsCisgICAgIlN3aXR6ZXJsYW5kIiwgIlN5cmlhIiwgIlRhaXdhbiIsICJUYWppa2lzdGFuIiwgIlRhbnphbmlhIiwgIlRoYWlsYW5kIiwgIlRoZSBCYWhhbWFzIiwKKyAgICAiVGhlIEdhbWJpYSIsICJUb2dvIiwgIlRva2VsYXUiLCAiVG9uZ2EiLCAiVHJpbmlkYWQgYW5kIFRvYmFnbyIsICJUdW5pc2lhIiwgIlR1cmtleSIsCisgICAgIlR1cmttZW5pc3RhbiIsICJUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMiLCAiVHV2YWx1IiwgIlZpcmdpbiBJc2xhbmRzIiwgIlVnYW5kYSIsCisgICAgIlVrcmFpbmUiLCAiVW5pdGVkIEFyYWIgRW1pcmF0ZXMiLCAiVW5pdGVkIEtpbmdkb20iLAorICAgICJVbml0ZWQgU3RhdGVzIiwgIlVuaXRlZCBTdGF0ZXMgTWlub3IgT3V0bHlpbmcgSXNsYW5kcyIsICJVcnVndWF5IiwgIlV6YmVraXN0YW4iLAorICAgICJWYW51YXR1IiwgIlZhdGljYW4gQ2l0eSIsICJWZW5lenVlbGEiLCAiVmlldG5hbSIsICJXYWxsaXMgYW5kIEZ1dHVuYSIsICJXZXN0ZXJuIFNhaGFyYSIsCisgICAgIlllbWVuIiwgIll1Z29zbGF2aWEiLCAiWmFtYmlhIiwgIlppbWJhYndlIgorICAgIH07CisKKyAgICBpbnQgbVdpZHRoOworICAgIGludCBtSGVpZ2h0OworCisgICAgcHVibGljIFJzTGlzdFJTKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXQoUmVuZGVyU2NyaXB0R0wgcnMsIFJlc291cmNlcyByZXMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBtUlMgPSByczsKKyAgICAgICAgbVJlcyA9IHJlczsKKyAgICAgICAgbVdpZHRoID0gd2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIGluaXRSUygpOworICAgIH0KKworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBGb250IG1JdGFsaWM7CisKKyAgICBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MgbUxpc3RBbGxvY3M7CisKKyAgICBwcml2YXRlIFNjcmlwdENfcnNsaXN0IG1TY3JpcHQ7CisKKyAgICBpbnQgbUxhc3RYOworICAgIGludCBtTGFzdFk7CisKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGlvbkRvd24oaW50IHgsIGludCB5KSB7CisgICAgICAgIG1TY3JpcHQuc2V0X2dEWSgwLjBmKTsKKworICAgICAgICBtTGFzdFggPSB4OworICAgICAgICBtTGFzdFkgPSB5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQWN0aW9uTW92ZShpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgaW50IGR4ID0gbUxhc3RYIC0geDsKKyAgICAgICAgaW50IGR5ID0gbUxhc3RZIC0geTsKKworICAgICAgICBpZihNYXRoLmFicyhkeSkgPD0gMikgeworICAgICAgICAgICAgZHkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0RZKGR5KTsKKworICAgICAgICBtTGFzdFggPSB4OworICAgICAgICBtTGFzdFkgPSB5OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UlMoKSB7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX3JzbGlzdChtUlMsIG1SZXMsIFIucmF3LnJzbGlzdCwgdHJ1ZSk7CisKKyAgICAgICAgbUxpc3RBbGxvY3MgPSBuZXcgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zKG1SUywgREFUQV9MSVNULmxlbmd0aCk7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBEQVRBX0xJU1QubGVuZ3RoOyBpICsrKSB7CisgICAgICAgICAgICBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MuSXRlbSBsaXN0RWxlbSA9IG5ldyBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MuSXRlbSgpOworICAgICAgICAgICAgbGlzdEVsZW0udGV4dCA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbVN0cmluZyhtUlMsIERBVEFfTElTVFtpXSk7CisgICAgICAgICAgICBtTGlzdEFsbG9jcy5zZXQobGlzdEVsZW0sIGksIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1MaXN0QWxsb2NzLmNvcHlBbGwoKTsKKworICAgICAgICBtU2NyaXB0LmJpbmRfZ0xpc3QobUxpc3RBbGxvY3MpOworCisgICAgICAgIG1JdGFsaWMgPSBGb250LmNyZWF0ZUZyb21GYW1pbHkobVJTLCBtUmVzLCAic2VyaWYiLCBGb250LlN0eWxlLkJPTERfSVRBTElDLCA4KTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0l0YWxpYyhtSXRhbGljKTsKKworICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzTGlzdFZpZXcuamF2YSBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzTGlzdFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOThlYTA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNMaXN0Vmlldy5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNhbXBsZXM7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworCitwdWJsaWMgY2xhc3MgUnNMaXN0VmlldyBleHRlbmRzIFJTU3VyZmFjZVZpZXcgeworCisgICAgcHVibGljIFJzTGlzdFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICAvL3NldEZvY3VzYWJsZSh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFJzTGlzdFJTIG1SZW5kZXI7CisKKworICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgc3VwZXIuc3VyZmFjZUNoYW5nZWQoaG9sZGVyLCBmb3JtYXQsIHcsIGgpOworICAgICAgICBpZiAobVJTID09IG51bGwpIHsKKyAgICAgICAgICAgIG1SUyA9IGNyZWF0ZVJlbmRlclNjcmlwdCh0cnVlKTsKKyAgICAgICAgICAgIG1SUy5jb250ZXh0U2V0U3VyZmFjZSh3LCBoLCBob2xkZXIuZ2V0U3VyZmFjZSgpKTsKKyAgICAgICAgICAgIG1SZW5kZXIgPSBuZXcgUnNMaXN0UlMoKTsKKyAgICAgICAgICAgIG1SZW5kZXIuaW5pdChtUlMsIGdldFJlc291cmNlcygpLCB3LCBoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBpZihtUlMgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gbnVsbDsKKyAgICAgICAgICAgIGRlc3Ryb3lSZW5kZXJTY3JpcHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpCisgICAgeworICAgICAgICAvLyBicmVhayBwb2ludCBhdCBoZXJlCisgICAgICAgIC8vIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgd29yayB3aGVuICdleHRlbmRzIFZpZXcnIGluY2x1ZGUgJ2V4dGVuZHMgU2Nyb2xsVmlldycuCisgICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQorICAgIHsKKyAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKKyAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9ET1dOKSB7CisgICAgICAgICAgICBtUmVuZGVyLm9uQWN0aW9uRG93bigoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkpOworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhY3QgPT0gZXYuQUNUSU9OX01PVkUpIHsKKyAgICAgICAgICAgIG1SZW5kZXIub25BY3Rpb25Nb3ZlKChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSk7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNSZW5kZXJTdGF0ZXMuamF2YSBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzUmVuZGVyU3RhdGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxMDA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzUmVuZGVyU3RhdGVzLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2FtcGxlczsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TeXN0ZW07CitpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKKworaW1wb3J0IGphdmEubGFuZy5SdW50aW1lOworCitwdWJsaWMgY2xhc3MgUnNSZW5kZXJTdGF0ZXMgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIFJzUmVuZGVyU3RhdGVzVmlldyBtVmlldzsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICAvLyBDcmVhdGUgb3VyIFByZXZpZXcgdmlldyBhbmQgc2V0IGl0IGFzIHRoZSBjb250ZW50IG9mIG91cgorICAgICAgICAvLyBBY3Rpdml0eQorICAgICAgICBtVmlldyA9IG5ldyBSc1JlbmRlclN0YXRlc1ZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcub25QYXVzZSgpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc1JlbmRlclN0YXRlc1JTLmphdmEgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc1JlbmRlclN0YXRlc1JTLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk5MGRhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzUmVuZGVyU3RhdGVzUlMuamF2YQpAQCAtMCwwICsxLDM1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2FtcGxlczsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworcHVibGljIGNsYXNzIFJzUmVuZGVyU3RhdGVzUlMgeworCisgICAgaW50IG1XaWR0aDsKKyAgICBpbnQgbUhlaWdodDsKKworICAgIHB1YmxpYyBSc1JlbmRlclN0YXRlc1JTKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXQoUmVuZGVyU2NyaXB0R0wgcnMsIFJlc291cmNlcyByZXMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBtUlMgPSByczsKKyAgICAgICAgbVJlcyA9IHJlczsKKyAgICAgICAgbVdpZHRoID0gd2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIG1PcHRpb25zQVJHQi5pblNjYWxlZCA9IGZhbHNlOworICAgICAgICBtT3B0aW9uc0FSR0IuaW5QcmVmZXJyZWRDb25maWcgPSBCaXRtYXAuQ29uZmlnLkFSR0JfODg4ODsKKyAgICAgICAgbU1vZGUgPSAwOworICAgICAgICBtTWF4TW9kZXMgPSA5OworICAgICAgICBpbml0UlMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworCisgICAgcHJpdmF0ZSBTYW1wbGVyIG1MaW5lYXJDbGFtcDsKKyAgICBwcml2YXRlIFNhbXBsZXIgbUxpbmVhcldyYXA7CisgICAgcHJpdmF0ZSBTYW1wbGVyIG1NaXBMaW5lYXJXcmFwOworICAgIHByaXZhdGUgU2FtcGxlciBtTmVhcmVzdENsYW1wOworICAgIHByaXZhdGUgU2FtcGxlciBtTWlwTGluZWFyQW5pc284OworICAgIHByaXZhdGUgU2FtcGxlciBtTWlwTGluZWFyQW5pc28xNTsKKworICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1Qcm9nU3RvcmVCbGVuZE5vbmVEZXB0aDsKKyAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUHJvZ1N0b3JlQmxlbmROb25lOworICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1Qcm9nU3RvcmVCbGVuZEFscGhhOworICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1Qcm9nU3RvcmVCbGVuZEFkZDsKKworICAgIHByaXZhdGUgUHJvZ3JhbUZyYWdtZW50IG1Qcm9nRnJhZ21lbnRUZXh0dXJlOworICAgIHByaXZhdGUgUHJvZ3JhbUZyYWdtZW50IG1Qcm9nRnJhZ21lbnRDb2xvcjsKKworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleCBtUHJvZ1ZlcnRleDsKKyAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbiBtUFZBOworCisgICAgLy8gQ3VzdG9tIHNoYWRlcnMKKyAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXggbVByb2dWZXJ0ZXhDdXN0b207CisgICAgcHJpdmF0ZSBQcm9ncmFtRnJhZ21lbnQgbVByb2dGcmFnbWVudEN1c3RvbTsKKyAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUHJvZ0ZyYWdtZW50TXVsdGl0ZXg7CisgICAgcHJpdmF0ZSBTY3JpcHRGaWVsZF9WZXJ0ZXhTaGFkZXJDb25zdGFudHNfcyBtVlNDb25zdDsKKyAgICBwcml2YXRlIFNjcmlwdEZpZWxkX0ZyYWdlbnRTaGFkZXJDb25zdGFudHNfcyBtRlNDb25zdDsKKworICAgIHByaXZhdGUgUHJvZ3JhbVJhc3RlciBtQ3VsbEJhY2s7CisgICAgcHJpdmF0ZSBQcm9ncmFtUmFzdGVyIG1DdWxsRnJvbnQ7CisgICAgcHJpdmF0ZSBQcm9ncmFtUmFzdGVyIG1DdWxsTm9uZTsKKworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtVGV4VG9ydXM7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1UZXhPcGFxdWU7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1UZXhUcmFuc3BhcmVudDsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVRleENoZWNrZXI7CisKKyAgICBwcml2YXRlIE1lc2ggbU1ieU5NZXNoOworICAgIHByaXZhdGUgTWVzaCBtVG9ydXM7CisKKyAgICBGb250IG1Gb250U2FuczsKKyAgICBGb250IG1Gb250U2VyaWY7CisgICAgRm9udCBtRm9udFNlcmlmQm9sZDsKKyAgICBGb250IG1Gb250U2VyaWZJdGFsaWM7CisgICAgRm9udCBtRm9udFNlcmlmQm9sZEl0YWxpYzsKKyAgICBGb250IG1Gb250TW9ubzsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVRleHRBbGxvYzsKKworICAgIHByaXZhdGUgU2NyaXB0Q19yc3JlbmRlcnN0YXRlcyBtU2NyaXB0OworCisgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXBGYWN0b3J5Lk9wdGlvbnMgbU9wdGlvbnNBUkdCID0gbmV3IEJpdG1hcEZhY3RvcnkuT3B0aW9ucygpOworCisgICAgaW50IG1Nb2RlOworICAgIGludCBtTWF4TW9kZXM7CisKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGlvbkRvd24oaW50IHgsIGludCB5KSB7CisgICAgICAgIG1Nb2RlICsrOworICAgICAgICBtTW9kZSA9IG1Nb2RlICUgbU1heE1vZGVzOworICAgICAgICBtU2NyaXB0LnNldF9nRGlzcGxheU1vZGUobU1vZGUpOworICAgIH0KKworICAgIHByaXZhdGUgTWVzaCBnZXRNYnlOTWVzaChmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0LCBpbnQgd1Jlc29sdXRpb24sIGludCBoUmVzb2x1dGlvbikgeworCisgICAgICAgIE1lc2guVHJpYW5nbGVNZXNoQnVpbGRlciB0bWIgPSBuZXcgTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyKG1SUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCBNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIuVEVYVFVSRV8wKTsKKworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8PSBoUmVzb2x1dGlvbjsgeSsrKSB7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBub3JtYWxpemVkWSA9IChmbG9hdCl5IC8gaFJlc29sdXRpb247CisgICAgICAgICAgICBmaW5hbCBmbG9hdCB5T2Zmc2V0ID0gKG5vcm1hbGl6ZWRZIC0gMC41ZikgKiBoZWlnaHQ7CisgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8PSB3UmVzb2x1dGlvbjsgeCsrKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgbm9ybWFsaXplZFggPSAoZmxvYXQpeCAvIHdSZXNvbHV0aW9uOworICAgICAgICAgICAgICAgIGZsb2F0IHhPZmZzZXQgPSAobm9ybWFsaXplZFggLSAwLjVmKSAqIHdpZHRoOworICAgICAgICAgICAgICAgIHRtYi5zZXRUZXh0dXJlKG5vcm1hbGl6ZWRYLCBub3JtYWxpemVkWSk7CisgICAgICAgICAgICAgICAgdG1iLmFkZFZlcnRleCh4T2Zmc2V0LCB5T2Zmc2V0KTsKKyAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhSZXNvbHV0aW9uOyB5KyspIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBjdXJZID0geSAqICh3UmVzb2x1dGlvbiArIDEpOworICAgICAgICAgICAgZmluYWwgaW50IGJlbG93WSA9ICh5ICsgMSkgKiAod1Jlc29sdXRpb24gKyAxKTsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd1Jlc29sdXRpb247IHgrKykgeworICAgICAgICAgICAgICAgIGludCBjdXJWID0gY3VyWSArIHg7CisgICAgICAgICAgICAgICAgaW50IGJlbG93ViA9IGJlbG93WSArIHg7CisgICAgICAgICAgICAgICAgdG1iLmFkZFRyaWFuZ2xlKGN1clYsIGJlbG93ViwgY3VyViArIDEpOworICAgICAgICAgICAgICAgIHRtYi5hZGRUcmlhbmdsZShiZWxvd1YsIGJlbG93ViArIDEsIGN1clYgKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0bWIuY3JlYXRlKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UHJvZ3JhbVN0b3JlKCkgeworICAgICAgICAvLyBVc2Ugc3RvY2sgdGhlIHN0b2NrIHByb2dyYW0gc3RvcmUgb2JqZWN0CisgICAgICAgIG1Qcm9nU3RvcmVCbGVuZE5vbmVEZXB0aCA9IFByb2dyYW1TdG9yZS5CTEVORF9OT05FX0RFUFRIX1RFU1QobVJTKTsKKyAgICAgICAgbVByb2dTdG9yZUJsZW5kTm9uZSA9IFByb2dyYW1TdG9yZS5CTEVORF9OT05FX0RFUFRIX05PX0RFUFRIKG1SUyk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgY3VzdG9tIHByb2dyYW0gc3RvcmUKKyAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihtUlMpOworICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkFMV0FZUyk7CisgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKFByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmMuU1JDX0FMUEhBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jLk9ORV9NSU5VU19TUkNfQUxQSEEpOworICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKGZhbHNlKTsKKyAgICAgICAgbVByb2dTdG9yZUJsZW5kQWxwaGEgPSBidWlsZGVyLmNyZWF0ZSgpOworCisgICAgICAgIG1Qcm9nU3RvcmVCbGVuZEFkZCA9IFByb2dyYW1TdG9yZS5CTEVORF9BRERfREVQVEhfTk9fREVQVEgobVJTKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ1N0b3JlQmxlbmROb25lRGVwdGgobVByb2dTdG9yZUJsZW5kTm9uZURlcHRoKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dTdG9yZUJsZW5kTm9uZShtUHJvZ1N0b3JlQmxlbmROb25lKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dTdG9yZUJsZW5kQWxwaGEobVByb2dTdG9yZUJsZW5kQWxwaGEpOworICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ1N0b3JlQmxlbmRBZGQobVByb2dTdG9yZUJsZW5kQWRkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFByb2dyYW1GcmFnbWVudCgpIHsKKworICAgICAgICBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlciB0ZXhCdWlsZGVyID0gbmV3IFByb2dyYW1GcmFnbWVudC5CdWlsZGVyKG1SUyk7CisgICAgICAgIHRleEJ1aWxkZXIuc2V0VGV4dHVyZShQcm9ncmFtRnJhZ21lbnQuQnVpbGRlci5FbnZNb2RlLlJFUExBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlci5Gb3JtYXQuUkdCQSwgMCk7CisgICAgICAgIG1Qcm9nRnJhZ21lbnRUZXh0dXJlID0gdGV4QnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgbVByb2dGcmFnbWVudFRleHR1cmUuYmluZFNhbXBsZXIobUxpbmVhckNsYW1wLCAwKTsKKworICAgICAgICBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlciBjb2xCdWlsZGVyID0gbmV3IFByb2dyYW1GcmFnbWVudC5CdWlsZGVyKG1SUyk7CisgICAgICAgIGNvbEJ1aWxkZXIuc2V0VmFyeWluZ0NvbG9yKGZhbHNlKTsKKyAgICAgICAgbVByb2dGcmFnbWVudENvbG9yID0gY29sQnVpbGRlci5jcmVhdGUoKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ0ZyYWdtZW50Q29sb3IobVByb2dGcmFnbWVudENvbG9yKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dGcmFnbWVudFRleHR1cmUobVByb2dGcmFnbWVudFRleHR1cmUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UHJvZ3JhbVZlcnRleCgpIHsKKyAgICAgICAgUHJvZ3JhbVZlcnRleC5CdWlsZGVyIHB2YiA9IG5ldyBQcm9ncmFtVmVydGV4LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgbVByb2dWZXJ0ZXggPSBwdmIuY3JlYXRlKCk7CisKKyAgICAgICAgbVBWQSA9IG5ldyBQcm9ncmFtVmVydGV4Lk1hdHJpeEFsbG9jYXRpb24obVJTKTsKKyAgICAgICAgbVByb2dWZXJ0ZXguYmluZEFsbG9jYXRpb24obVBWQSk7CisgICAgICAgIG1QVkEuc2V0dXBPcnRob1dpbmRvdyhtV2lkdGgsIG1IZWlnaHQpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nVmVydGV4KG1Qcm9nVmVydGV4KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdEN1c3RvbVNoYWRlcnMoKSB7CisgICAgICAgIG1WU0NvbnN0ID0gbmV3IFNjcmlwdEZpZWxkX1ZlcnRleFNoYWRlckNvbnN0YW50c19zKG1SUywgMSk7CisgICAgICAgIG1GU0NvbnN0ID0gbmV3IFNjcmlwdEZpZWxkX0ZyYWdlbnRTaGFkZXJDb25zdGFudHNfcyhtUlMsIDEpOworCisgICAgICAgIG1TY3JpcHQuYmluZF9nVlNDb25zdGFudHMobVZTQ29uc3QpOworICAgICAgICBtU2NyaXB0LmJpbmRfZ0ZTQ29uc3RhbnRzKG1GU0NvbnN0KTsKKworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBzaGFkZXIgYnVpbGRlcgorICAgICAgICBQcm9ncmFtVmVydGV4LlNoYWRlckJ1aWxkZXIgcHZiQ3VzdG9tID0gbmV3IFByb2dyYW1WZXJ0ZXguU2hhZGVyQnVpbGRlcihtUlMpOworICAgICAgICAvLyBTcGVjaWZ5IHRoZSByZXNvdXJjZSB0aGF0IGNvbnRhaW5zIHRoZSBzaGFkZXIgc3RyaW5nCisgICAgICAgIHB2YkN1c3RvbS5zZXRTaGFkZXIobVJlcywgUi5yYXcuc2hhZGVydik7CisgICAgICAgIC8vIFVzZSBhIHNjcmlwdCBmaWVsZCB0byBzcGNpZnkgdGhlIGlucHV0IGxheW91dAorICAgICAgICBwdmJDdXN0b20uYWRkSW5wdXQoU2NyaXB0RmllbGRfVmVydGV4U2hhZGVySW5wdXRzX3MuY3JlYXRlRWxlbWVudChtUlMpKTsKKyAgICAgICAgLy8gRGVmaW5lIHRoZSBjb25zdGFudCBpbnB1dCBsYXlvdXQKKyAgICAgICAgcHZiQ3VzdG9tLmFkZENvbnN0YW50KG1WU0NvbnN0LmdldEFsbG9jYXRpb24oKS5nZXRUeXBlKCkpOworICAgICAgICBtUHJvZ1ZlcnRleEN1c3RvbSA9IHB2YkN1c3RvbS5jcmVhdGUoKTsKKyAgICAgICAgLy8gQmluZCB0aGUgc291cmNlIG9mIGNvbnN0YW50IGRhdGEKKyAgICAgICAgbVByb2dWZXJ0ZXhDdXN0b20uYmluZENvbnN0YW50cyhtVlNDb25zdC5nZXRBbGxvY2F0aW9uKCksIDApOworCisgICAgICAgIFByb2dyYW1GcmFnbWVudC5TaGFkZXJCdWlsZGVyIHBmYkN1c3RvbSA9IG5ldyBQcm9ncmFtRnJhZ21lbnQuU2hhZGVyQnVpbGRlcihtUlMpOworICAgICAgICAvLyBTcGVjaWZ5IHRoZSByZXNvdXJjZSB0aGF0IGNvbnRhaW5zIHRoZSBzaGFkZXIgc3RyaW5nCisgICAgICAgIHBmYkN1c3RvbS5zZXRTaGFkZXIobVJlcywgUi5yYXcuc2hhZGVyZik7CisgICAgICAgIC8vVGVsbCB0aGUgYnVpbGRlciBob3cgbWFueSB0ZXh0dXJlcyB3ZSBoYXZlCisgICAgICAgIHBmYkN1c3RvbS5zZXRUZXh0dXJlQ291bnQoMSk7CisgICAgICAgIC8vIERlZmluZSB0aGUgY29uc3RhbnQgaW5wdXQgbGF5b3V0CisgICAgICAgIHBmYkN1c3RvbS5hZGRDb25zdGFudChtRlNDb25zdC5nZXRBbGxvY2F0aW9uKCkuZ2V0VHlwZSgpKTsKKyAgICAgICAgbVByb2dGcmFnbWVudEN1c3RvbSA9IHBmYkN1c3RvbS5jcmVhdGUoKTsKKyAgICAgICAgLy8gQmluZCB0aGUgc291cmNlIG9mIGNvbnN0YW50IGRhdGEKKyAgICAgICAgbVByb2dGcmFnbWVudEN1c3RvbS5iaW5kQ29uc3RhbnRzKG1GU0NvbnN0LmdldEFsbG9jYXRpb24oKSwgMCk7CisKKyAgICAgICAgcGZiQ3VzdG9tID0gbmV3IFByb2dyYW1GcmFnbWVudC5TaGFkZXJCdWlsZGVyKG1SUyk7CisgICAgICAgIHBmYkN1c3RvbS5zZXRTaGFkZXIobVJlcywgUi5yYXcubXVsdGl0ZXhmKTsKKyAgICAgICAgcGZiQ3VzdG9tLnNldFRleHR1cmVDb3VudCgzKTsKKyAgICAgICAgbVByb2dGcmFnbWVudE11bHRpdGV4ID0gcGZiQ3VzdG9tLmNyZWF0ZSgpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nVmVydGV4Q3VzdG9tKG1Qcm9nVmVydGV4Q3VzdG9tKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dGcmFnbWVudEN1c3RvbShtUHJvZ0ZyYWdtZW50Q3VzdG9tKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dGcmFnbWVudE11bHRpdGV4KG1Qcm9nRnJhZ21lbnRNdWx0aXRleCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIGxvYWRUZXh0dXJlUkdCKGludCBpZCkgeworICAgICAgICBmaW5hbCBBbGxvY2F0aW9uIGFsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZShtUlMsIG1SZXMsCisgICAgICAgICAgICAgICAgaWQsIEVsZW1lbnQuUkdCXzU2NShtUlMpLCB0cnVlKTsKKyAgICAgICAgYWxsb2NhdGlvbi51cGxvYWRUb1RleHR1cmUoMCk7CisgICAgICAgIHJldHVybiBhbGxvY2F0aW9uOworICAgIH0KKworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBsb2FkVGV4dHVyZUFSR0IoaW50IGlkKSB7CisgICAgICAgIEJpdG1hcCBiID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShtUmVzLCBpZCwgbU9wdGlvbnNBUkdCKTsKKyAgICAgICAgZmluYWwgQWxsb2NhdGlvbiBhbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwKG1SUywgYiwgRWxlbWVudC5SR0JBXzg4ODgobVJTKSwgdHJ1ZSk7CisgICAgICAgIGFsbG9jYXRpb24udXBsb2FkVG9UZXh0dXJlKDApOworICAgICAgICByZXR1cm4gYWxsb2NhdGlvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9hZEltYWdlcygpIHsKKyAgICAgICAgbVRleFRvcnVzID0gbG9hZFRleHR1cmVSR0IoUi5kcmF3YWJsZS50b3J1c21hcCk7CisgICAgICAgIG1UZXhPcGFxdWUgPSBsb2FkVGV4dHVyZVJHQihSLmRyYXdhYmxlLmRhdGEpOworICAgICAgICBtVGV4VHJhbnNwYXJlbnQgPSBsb2FkVGV4dHVyZUFSR0IoUi5kcmF3YWJsZS5sZWFmKTsKKyAgICAgICAgbVRleENoZWNrZXIgPSBsb2FkVGV4dHVyZVJHQihSLmRyYXdhYmxlLmNoZWNrZXIpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dUZXhUb3J1cyhtVGV4VG9ydXMpOworICAgICAgICBtU2NyaXB0LnNldF9nVGV4T3BhcXVlKG1UZXhPcGFxdWUpOworICAgICAgICBtU2NyaXB0LnNldF9nVGV4VHJhbnNwYXJlbnQobVRleFRyYW5zcGFyZW50KTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RleENoZWNrZXIobVRleENoZWNrZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0Rm9udHMoKSB7CisgICAgICAgIC8vIFNhbnMgZm9udCBieSBmYW1pbHkgbmFtZQorICAgICAgICBtRm9udFNhbnMgPSBGb250LmNyZWF0ZUZyb21GYW1pbHkobVJTLCBtUmVzLCAic2Fucy1zZXJpZiIsIEZvbnQuU3R5bGUuTk9STUFMLCA4KTsKKyAgICAgICAgLy8gQ3JlYXRlIGZvbnQgYnkgZmlsZSBuYW1lCisgICAgICAgIG1Gb250U2VyaWYgPSBGb250LmNyZWF0ZShtUlMsIG1SZXMsICJEcm9pZFNlcmlmLVJlZ3VsYXIudHRmIiwgOCk7CisgICAgICAgIC8vIENyZWF0ZSBmb250cyBieSBmYW1pbHkgYW5kIHN0eWxlCisgICAgICAgIG1Gb250U2VyaWZCb2xkID0gRm9udC5jcmVhdGVGcm9tRmFtaWx5KG1SUywgbVJlcywgInNlcmlmIiwgRm9udC5TdHlsZS5CT0xELCA4KTsKKyAgICAgICAgbUZvbnRTZXJpZkl0YWxpYyA9IEZvbnQuY3JlYXRlRnJvbUZhbWlseShtUlMsIG1SZXMsICJzZXJpZiIsIEZvbnQuU3R5bGUuSVRBTElDLCA4KTsKKyAgICAgICAgbUZvbnRTZXJpZkJvbGRJdGFsaWMgPSBGb250LmNyZWF0ZUZyb21GYW1pbHkobVJTLCBtUmVzLCAic2VyaWYiLCBGb250LlN0eWxlLkJPTERfSVRBTElDLCA4KTsKKyAgICAgICAgbUZvbnRNb25vID0gRm9udC5jcmVhdGVGcm9tRmFtaWx5KG1SUywgbVJlcywgIm1vbm8iLCBGb250LlN0eWxlLk5PUk1BTCwgOCk7CisKKyAgICAgICAgbVRleHRBbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbVN0cmluZyhtUlMsICJTdHJpbmcgZnJvbSBhbGxvY2F0aW9uIik7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0ZvbnRTYW5zKG1Gb250U2Fucyk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dGb250U2VyaWYobUZvbnRTZXJpZik7CisgICAgICAgIG1TY3JpcHQuc2V0X2dGb250U2VyaWZCb2xkKG1Gb250U2VyaWZCb2xkKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0ZvbnRTZXJpZkl0YWxpYyhtRm9udFNlcmlmSXRhbGljKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0ZvbnRTZXJpZkJvbGRJdGFsaWMobUZvbnRTZXJpZkJvbGRJdGFsaWMpOworICAgICAgICBtU2NyaXB0LnNldF9nRm9udE1vbm8obUZvbnRNb25vKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RleHRBbGxvYyhtVGV4dEFsbG9jKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdE1lc2goKSB7CisgICAgICAgIG1NYnlOTWVzaCA9IGdldE1ieU5NZXNoKDI1NiwgMjU2LCAxMCwgMTApOworICAgICAgICBtU2NyaXB0LnNldF9nTWJ5Tk1lc2gobU1ieU5NZXNoKTsKKworICAgICAgICBGaWxlQTNEIG1vZGVsID0gRmlsZUEzRC5jcmVhdGVGcm9tUmVzb3VyY2UobVJTLCBtUmVzLCBSLnJhdy50b3J1cyk7CisgICAgICAgIEZpbGVBM0QuSW5kZXhFbnRyeSBlbnRyeSA9IG1vZGVsLmdldEluZGV4RW50cnkoMCk7CisgICAgICAgIGlmKGVudHJ5ID09IG51bGwgfHwgZW50cnkuZ2V0Q2xhc3NJRCgpICE9IEZpbGVBM0QuQ2xhc3NJRC5NRVNIKSB7CisgICAgICAgICAgICBMb2cuZSgicnMiLCAiY291bGQgbm90IGxvYWQgbW9kZWwiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1Ub3J1cyA9IChNZXNoKWVudHJ5LmdldE9iamVjdCgpOworICAgICAgICAgICAgbVNjcmlwdC5zZXRfZ1RvcnVzTWVzaChtVG9ydXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRTYW1wbGVycygpIHsKKyAgICAgICAgU2FtcGxlci5CdWlsZGVyIGJzID0gbmV3IFNhbXBsZXIuQnVpbGRlcihtUlMpOworICAgICAgICBicy5zZXRNaW4oU2FtcGxlci5WYWx1ZS5MSU5FQVIpOworICAgICAgICBicy5zZXRNYWcoU2FtcGxlci5WYWx1ZS5MSU5FQVIpOworICAgICAgICBicy5zZXRXcmFwUyhTYW1wbGVyLlZhbHVlLldSQVApOworICAgICAgICBicy5zZXRXcmFwVChTYW1wbGVyLlZhbHVlLldSQVApOworICAgICAgICBtTGluZWFyV3JhcCA9IGJzLmNyZWF0ZSgpOworCisgICAgICAgIG1MaW5lYXJDbGFtcCA9IFNhbXBsZXIuQ0xBTVBfTElORUFSKG1SUyk7CisgICAgICAgIG1OZWFyZXN0Q2xhbXAgPSBTYW1wbGVyLkNMQU1QX05FQVJFU1QobVJTKTsKKyAgICAgICAgbU1pcExpbmVhcldyYXAgPSBTYW1wbGVyLldSQVBfTElORUFSX01JUF9MSU5FQVIobVJTKTsKKworICAgICAgICBicyA9IG5ldyBTYW1wbGVyLkJ1aWxkZXIobVJTKTsKKyAgICAgICAgYnMuc2V0TWluKFNhbXBsZXIuVmFsdWUuTElORUFSX01JUF9MSU5FQVIpOworICAgICAgICBicy5zZXRNYWcoU2FtcGxlci5WYWx1ZS5MSU5FQVIpOworICAgICAgICBicy5zZXRXcmFwUyhTYW1wbGVyLlZhbHVlLldSQVApOworICAgICAgICBicy5zZXRXcmFwVChTYW1wbGVyLlZhbHVlLldSQVApOworICAgICAgICBicy5zZXRBbmlzb3Ryb3B5KDguMGYpOworICAgICAgICBtTWlwTGluZWFyQW5pc284ID0gYnMuY3JlYXRlKCk7CisgICAgICAgIGJzLnNldEFuaXNvdHJvcHkoMTUuMGYpOworICAgICAgICBtTWlwTGluZWFyQW5pc28xNSA9IGJzLmNyZWF0ZSgpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dMaW5lYXJDbGFtcChtTGluZWFyQ2xhbXApOworICAgICAgICBtU2NyaXB0LnNldF9nTGluZWFyV3JhcChtTGluZWFyV3JhcCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dNaXBMaW5lYXJXcmFwKG1NaXBMaW5lYXJXcmFwKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ01pcExpbmVhckFuaXNvOChtTWlwTGluZWFyQW5pc284KTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ01pcExpbmVhckFuaXNvMTUobU1pcExpbmVhckFuaXNvMTUpOworICAgICAgICBtU2NyaXB0LnNldF9nTmVhcmVzdENsYW1wKG1OZWFyZXN0Q2xhbXApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UHJvZ3JhbVJhc3RlcigpIHsKKyAgICAgICAgbUN1bGxCYWNrID0gUHJvZ3JhbVJhc3Rlci5DVUxMX0JBQ0sobVJTKTsKKyAgICAgICAgbUN1bGxGcm9udCA9IFByb2dyYW1SYXN0ZXIuQ1VMTF9GUk9OVChtUlMpOworICAgICAgICBtQ3VsbE5vbmUgPSBQcm9ncmFtUmFzdGVyLkNVTExfTk9ORShtUlMpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dDdWxsQmFjayhtQ3VsbEJhY2spOworICAgICAgICBtU2NyaXB0LnNldF9nQ3VsbEZyb250KG1DdWxsRnJvbnQpOworICAgICAgICBtU2NyaXB0LnNldF9nQ3VsbE5vbmUobUN1bGxOb25lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFJTKCkgeworCisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19yc3JlbmRlcnN0YXRlcyhtUlMsIG1SZXMsIFIucmF3LnJzcmVuZGVyc3RhdGVzLCB0cnVlKTsKKworICAgICAgICBpbml0U2FtcGxlcnMoKTsKKyAgICAgICAgaW5pdFByb2dyYW1TdG9yZSgpOworICAgICAgICBpbml0UHJvZ3JhbUZyYWdtZW50KCk7CisgICAgICAgIGluaXRQcm9ncmFtVmVydGV4KCk7CisgICAgICAgIGluaXRGb250cygpOworICAgICAgICBsb2FkSW1hZ2VzKCk7CisgICAgICAgIGluaXRNZXNoKCk7CisgICAgICAgIGluaXRQcm9ncmFtUmFzdGVyKCk7CisgICAgICAgIGluaXRDdXN0b21TaGFkZXJzKCk7CisKKyAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc1JlbmRlclN0YXRlc1ZpZXcuamF2YSBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzUmVuZGVyU3RhdGVzVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NDhkZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc1JlbmRlclN0YXRlc1ZpZXcuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zYW1wbGVzOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworcHVibGljIGNsYXNzIFJzUmVuZGVyU3RhdGVzVmlldyBleHRlbmRzIFJTU3VyZmFjZVZpZXcgeworCisgICAgcHVibGljIFJzUmVuZGVyU3RhdGVzVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIC8vc2V0Rm9jdXNhYmxlKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgUnNSZW5kZXJTdGF0ZXNSUyBtUmVuZGVyOworCisKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIHN1cGVyLnN1cmZhY2VDaGFuZ2VkKGhvbGRlciwgZm9ybWF0LCB3LCBoKTsKKyAgICAgICAgaWYgKG1SUyA9PSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBjcmVhdGVSZW5kZXJTY3JpcHQodHJ1ZSk7CisgICAgICAgICAgICBtUlMuY29udGV4dFNldFN1cmZhY2UodywgaCwgaG9sZGVyLmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICBtUmVuZGVyID0gbmV3IFJzUmVuZGVyU3RhdGVzUlMoKTsKKyAgICAgICAgICAgIG1SZW5kZXIuaW5pdChtUlMsIGdldFJlc291cmNlcygpLCB3LCBoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBpZihtUlMgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gbnVsbDsKKyAgICAgICAgICAgIGRlc3Ryb3lSZW5kZXJTY3JpcHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpCisgICAgeworICAgICAgICAvLyBicmVhayBwb2ludCBhdCBoZXJlCisgICAgICAgIC8vIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgd29yayB3aGVuICdleHRlbmRzIFZpZXcnIGluY2x1ZGUgJ2V4dGVuZHMgU2Nyb2xsVmlldycuCisgICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQorICAgIHsKKyAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKKyAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9ET1dOKSB7CisgICAgICAgICAgICBtUmVuZGVyLm9uQWN0aW9uRG93bigoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkpOworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL3JzbGlzdC5ycyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL3JzbGlzdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzNmNDYzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvcnNsaXN0LnJzCkBAIC0wLDAgKzEsNzMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5zYW1wbGVzKQorCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorCitmbG9hdCBnRFk7CisKK3JzX2ZvbnQgZ0l0YWxpYzsKKwordHlwZWRlZiBzdHJ1Y3QgTGlzdEFsbG9jc19zIHsKKyAgICByc19hbGxvY2F0aW9uIHRleHQ7Cit9IExpc3RBbGxvY3M7CisKK0xpc3RBbGxvY3MgKmdMaXN0OworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ0RZLCBnSXRhbGljLCBnTGlzdCkKKwordm9pZCBpbml0KCkgeworICAgIGdEWSA9IDAuMGY7Cit9CisKK2ludCB0ZXh0UG9zID0gMDsKKworaW50IHJvb3QoaW50IGxhdW5jaElEKSB7CisKKyAgICByc2dDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworICAgIHJzZ0NsZWFyRGVwdGgoMS4wZik7CisKKyAgICB0ZXh0UG9zIC09IChpbnQpZ0RZKjI7CisgICAgZ0RZICo9IDAuOTU7CisKKyAgICByc2dGb250Q29sb3IoMC45ZiwgMC45ZiwgMC45ZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0l0YWxpYyk7CisgICAgY29sb3IoMC4yLCAwLjIsIDAuMiwgMCk7CisKKyAgICByc19hbGxvY2F0aW9uIGxpc3RBbGxvYyA9IHJzR2V0QWxsb2NhdGlvbihnTGlzdCk7CisgICAgaW50IGFsbG9jU2l6ZSA9IHJzQWxsb2NhdGlvbkdldERpbVgobGlzdEFsbG9jKTsKKworICAgIGludCB3aWR0aCA9IHJzZ0dldFdpZHRoKCk7CisgICAgaW50IGhlaWdodCA9IHJzZ0dldEhlaWdodCgpOworCisgICAgaW50IGl0ZW1IZWlnaHQgPSA4MDsKKyAgICBpbnQgY3VycmVudFlQb3MgPSBpdGVtSGVpZ2h0ICsgdGV4dFBvczsKKworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBhbGxvY1NpemU7IGkgKyspIHsKKyAgICAgICAgaWYoY3VycmVudFlQb3MgLSBpdGVtSGVpZ2h0ID4gaGVpZ2h0KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGN1cnJlbnRZUG9zID4gMCkgeworICAgICAgICAgICAgcnNnRHJhd1JlY3QoMCwgY3VycmVudFlQb3MgLSAxLCB3aWR0aCwgY3VycmVudFlQb3MsIDApOworICAgICAgICAgICAgcnNnRHJhd1RleHQoZ0xpc3RbaV0udGV4dCwgMzAsIGN1cnJlbnRZUG9zIC0gMzIpOworICAgICAgICB9CisgICAgICAgIGN1cnJlbnRZUG9zICs9IGl0ZW1IZWlnaHQ7CisgICAgfQorCisgICAgcmV0dXJuIDEwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvcnNyZW5kZXJzdGF0ZXMucnMgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9yc3JlbmRlcnN0YXRlcy5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzM4NGVmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvcnNyZW5kZXJzdGF0ZXMucnMKQEAgLTAsMCArMSw1OTUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5zYW1wbGVzKQorCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorI2luY2x1ZGUgInNoYWRlcl9kZWYucnNoIgorCityc19wcm9ncmFtX3ZlcnRleCBnUHJvZ1ZlcnRleDsKK3JzX3Byb2dyYW1fZnJhZ21lbnQgZ1Byb2dGcmFnbWVudENvbG9yOworcnNfcHJvZ3JhbV9mcmFnbWVudCBnUHJvZ0ZyYWdtZW50VGV4dHVyZTsKKworcnNfcHJvZ3JhbV9zdG9yZSBnUHJvZ1N0b3JlQmxlbmROb25lRGVwdGg7Cityc19wcm9ncmFtX3N0b3JlIGdQcm9nU3RvcmVCbGVuZE5vbmU7Cityc19wcm9ncmFtX3N0b3JlIGdQcm9nU3RvcmVCbGVuZEFscGhhOworcnNfcHJvZ3JhbV9zdG9yZSBnUHJvZ1N0b3JlQmxlbmRBZGQ7CisKK3JzX2FsbG9jYXRpb24gZ1RleE9wYXF1ZTsKK3JzX2FsbG9jYXRpb24gZ1RleFRvcnVzOworcnNfYWxsb2NhdGlvbiBnVGV4VHJhbnNwYXJlbnQ7Cityc19hbGxvY2F0aW9uIGdUZXhDaGVja2VyOworCityc19tZXNoIGdNYnlOTWVzaDsKK3JzX21lc2ggZ1RvcnVzTWVzaDsKKworcnNfZm9udCBnRm9udFNhbnM7Cityc19mb250IGdGb250U2VyaWY7Cityc19mb250IGdGb250U2VyaWZCb2xkOworcnNfZm9udCBnRm9udFNlcmlmSXRhbGljOworcnNfZm9udCBnRm9udFNlcmlmQm9sZEl0YWxpYzsKK3JzX2ZvbnQgZ0ZvbnRNb25vOworcnNfYWxsb2NhdGlvbiBnVGV4dEFsbG9jOworCitpbnQgZ0Rpc3BsYXlNb2RlOworCityc19zYW1wbGVyIGdMaW5lYXJDbGFtcDsKK3JzX3NhbXBsZXIgZ0xpbmVhcldyYXA7Cityc19zYW1wbGVyIGdNaXBMaW5lYXJXcmFwOworcnNfc2FtcGxlciBnTWlwTGluZWFyQW5pc284OworcnNfc2FtcGxlciBnTWlwTGluZWFyQW5pc28xNTsKK3JzX3NhbXBsZXIgZ05lYXJlc3RDbGFtcDsKKworcnNfcHJvZ3JhbV9yYXN0ZXIgZ0N1bGxCYWNrOworcnNfcHJvZ3JhbV9yYXN0ZXIgZ0N1bGxGcm9udDsKK3JzX3Byb2dyYW1fcmFzdGVyIGdDdWxsTm9uZTsKKworLy8gQ3VzdG9tIHZlcnRleCBzaGFkZXIgY29tcHVuZW50cworVmVydGV4U2hhZGVyQ29uc3RhbnRzICpnVlNDb25zdGFudHM7CitGcmFnZW50U2hhZGVyQ29uc3RhbnRzICpnRlNDb25zdGFudHM7CisvLyBFeHBvcnQgdGhlc2Ugb3V0IHRvIGVhc2lseSBzZXQgdGhlIGlucHV0cyB0byBzaGFkZXIKK1ZlcnRleFNoYWRlcklucHV0cyAqZ1ZTSW5wdXRzOworLy8gQ3VzdG9tIHNoYWRlcnMgd2UgdXNlIGZvciBsaWdodGluZworcnNfcHJvZ3JhbV92ZXJ0ZXggZ1Byb2dWZXJ0ZXhDdXN0b207Cityc19wcm9ncmFtX2ZyYWdtZW50IGdQcm9nRnJhZ21lbnRDdXN0b207Cityc19wcm9ncmFtX2ZyYWdtZW50IGdQcm9nRnJhZ21lbnRNdWx0aXRleDsKKworI3ByYWdtYSBycyBleHBvcnRfdmFyKGdQcm9nVmVydGV4LCBnUHJvZ0ZyYWdtZW50Q29sb3IsIGdQcm9nRnJhZ21lbnRUZXh0dXJlKQorI3ByYWdtYSBycyBleHBvcnRfdmFyKGdQcm9nU3RvcmVCbGVuZE5vbmVEZXB0aCwgZ1Byb2dTdG9yZUJsZW5kTm9uZSwgZ1Byb2dTdG9yZUJsZW5kQWxwaGEsIGdQcm9nU3RvcmVCbGVuZEFkZCkKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihnVGV4T3BhcXVlLCBnVGV4VG9ydXMsIGdUZXhUcmFuc3BhcmVudCwgZ1RleENoZWNrZXIpCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ01ieU5NZXNoLCBnVG9ydXNNZXNoKQorI3ByYWdtYSBycyBleHBvcnRfdmFyKGdGb250U2FucywgZ0ZvbnRTZXJpZiwgZ0ZvbnRTZXJpZkJvbGQsIGdGb250U2VyaWZJdGFsaWMsIGdGb250U2VyaWZCb2xkSXRhbGljLCBnRm9udE1vbm8sIGdUZXh0QWxsb2MpCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ0xpbmVhckNsYW1wLCBnTGluZWFyV3JhcCwgZ01pcExpbmVhcldyYXAsIGdNaXBMaW5lYXJBbmlzbzgsIGdNaXBMaW5lYXJBbmlzbzE1LCBnTmVhcmVzdENsYW1wKQorI3ByYWdtYSBycyBleHBvcnRfdmFyKGdDdWxsQmFjaywgZ0N1bGxGcm9udCwgZ0N1bGxOb25lKQorI3ByYWdtYSBycyBleHBvcnRfdmFyKGdWU0NvbnN0YW50cywgZ0ZTQ29uc3RhbnRzLCBnVlNJbnB1dHMsIGdQcm9nVmVydGV4Q3VzdG9tLCBnUHJvZ0ZyYWdtZW50Q3VzdG9tLCBnUHJvZ0ZyYWdtZW50TXVsdGl0ZXgpCisKKy8vV2hhdCB3ZSBhcmUgc2hvd2luZworI3ByYWdtYSBycyBleHBvcnRfdmFyKGdEaXNwbGF5TW9kZSkKKworZmxvYXQgZ0R0ID0gMDsKKwordm9pZCBpbml0KCkgeworfQorCit2b2lkIGRpc3BsYXlGb250U2FtcGxlcygpIHsKKyAgICByc2dGb250Q29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgaW50IHlQb3MgPSAxMDA7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRTYW5zKTsKKyAgICByc2dEcmF3VGV4dCgiU2FucyBmb250IHNhbXBsZSIsIDMwLCB5UG9zKTsKKyAgICB5UG9zICs9IDMwOworICAgIHJzZ0ZvbnRDb2xvcigwLjVmLCAwLjlmLCAwLjVmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udFNlcmlmKTsKKyAgICByc2dEcmF3VGV4dCgiU2VyaWYgZm9udCBzYW1wbGUiLCAzMCwgeVBvcyk7CisgICAgeVBvcyArPSAzMDsKKyAgICByc2dGb250Q29sb3IoMC43ZiwgMC43ZiwgMC43ZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRTZXJpZkJvbGQpOworICAgIHJzZ0RyYXdUZXh0KCJTZXJpZiBCb2xkIGZvbnQgc2FtcGxlIiwgMzAsIHlQb3MpOworICAgIHlQb3MgKz0gMzA7CisgICAgcnNnRm9udENvbG9yKDAuNWYsIDAuNWYsIDAuOWYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250U2VyaWZJdGFsaWMpOworICAgIHJzZ0RyYXdUZXh0KCJTZXJpZiBJdGFsaWMgZm9udCBzYW1wbGUiLCAzMCwgeVBvcyk7CisgICAgeVBvcyArPSAzMDsKKyAgICByc2dGb250Q29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRTZXJpZkJvbGRJdGFsaWMpOworICAgIHJzZ0RyYXdUZXh0KCJTZXJpZiBCb2xkIEl0YWxpYyBmb250IHNhbXBsZSIsIDMwLCB5UG9zKTsKKyAgICB5UG9zICs9IDMwOworICAgIHJzZ0JpbmRGb250KGdGb250TW9ubyk7CisgICAgcnNnRHJhd1RleHQoIk1vbm9zcGFjZSBmb250IHNhbXBsZSIsIDMwLCB5UG9zKTsKKyAgICB5UG9zICs9IDUwOworCisgICAgLy8gTm93IHVzZSB0ZXh0IG1ldHJpY3MgdG8gY2VudGVyIHRoZSB0ZXh0CisgICAgdWludCB3aWR0aCA9IHJzZ0dldFdpZHRoKCk7CisgICAgdWludCBoZWlnaHQgPSByc2dHZXRIZWlnaHQoKTsKKyAgICBpbnQgbGVmdCA9IDAsIHJpZ2h0ID0gMCwgdG9wID0gMCwgYm90dG9tID0gMDsKKworICAgIHJzZ0ZvbnRDb2xvcigwLjlmLCAwLjlmLCAwLjk1ZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRTZXJpZkJvbGRJdGFsaWMpOworCisgICAgcnNnTWVhc3VyZVRleHQoZ1RleHRBbGxvYywgJmxlZnQsICZyaWdodCwgJnRvcCwgJmJvdHRvbSk7CisgICAgaW50IGNlbnRlcmVkUG9zID0gd2lkdGggLyAyIC0gKHJpZ2h0IC0gbGVmdCkgLyAyOworICAgIHJzZ0RyYXdUZXh0KGdUZXh0QWxsb2MsIGNlbnRlcmVkUG9zLCB5UG9zKTsKKyAgICB5UG9zICs9IDMwOworCisgICAgY29uc3QgY2hhciogdGV4dCA9ICJDZW50ZXJlZCBUZXh0IFNhbXBsZSI7CisgICAgcnNnTWVhc3VyZVRleHQodGV4dCwgJmxlZnQsICZyaWdodCwgJnRvcCwgJmJvdHRvbSk7CisgICAgY2VudGVyZWRQb3MgPSB3aWR0aCAvIDIgLSAocmlnaHQgLSBsZWZ0KSAvIDI7CisgICAgcnNnRHJhd1RleHQodGV4dCwgY2VudGVyZWRQb3MsIHlQb3MpOworICAgIHlQb3MgKz0gMzA7CisKKyAgICByc2dCaW5kRm9udChnRm9udFNhbnMpOworICAgIHRleHQgPSAiTW9yZSBDZW50ZXJlZCBUZXh0IFNhbXBsZXMiOworICAgIHJzZ01lYXN1cmVUZXh0KHRleHQsICZsZWZ0LCAmcmlnaHQsICZ0b3AsICZib3R0b20pOworICAgIGNlbnRlcmVkUG9zID0gd2lkdGggLyAyIC0gKHJpZ2h0IC0gbGVmdCkgLyAyOworICAgIHJzZ0RyYXdUZXh0KHRleHQsIGNlbnRlcmVkUG9zLCB5UG9zKTsKKyAgICB5UG9zICs9IDMwOworCisgICAgLy8gTm93IGRyYXcgYm90dG9tIGFuZCB0b3AgcmlnaHQgYWxpZ25lZCB0ZXh0CisgICAgdGV4dCA9ICJUb3AtcmlnaHQgYWxpZ25lZCB0ZXh0IjsKKyAgICByc2dNZWFzdXJlVGV4dCh0ZXh0LCAmbGVmdCwgJnJpZ2h0LCAmdG9wLCAmYm90dG9tKTsKKyAgICByc2dEcmF3VGV4dCh0ZXh0LCB3aWR0aCAtIHJpZ2h0LCB0b3ApOworCisgICAgdGV4dCA9ICJUb3AtbGVmdCI7CisgICAgcnNnTWVhc3VyZVRleHQodGV4dCwgJmxlZnQsICZyaWdodCwgJnRvcCwgJmJvdHRvbSk7CisgICAgcnNnRHJhd1RleHQodGV4dCwgLWxlZnQsIHRvcCk7CisKKyAgICB0ZXh0ID0gIkJvdHRvbS1yaWdodCBhbGlnbmVkIHRleHQiOworICAgIHJzZ01lYXN1cmVUZXh0KHRleHQsICZsZWZ0LCAmcmlnaHQsICZ0b3AsICZib3R0b20pOworICAgIHJzZ0RyYXdUZXh0KHRleHQsIHdpZHRoIC0gcmlnaHQsIGhlaWdodCArIGJvdHRvbSk7CisKK30KKwordm9pZCBiaW5kUHJvZ3JhbVZlcnRleE9ydGhvKCkgeworICAgIC8vIERlZmF1bHQgdmVydGV4IHNhaGRlcgorICAgIHJzZ0JpbmRQcm9ncmFtVmVydGV4KGdQcm9nVmVydGV4KTsKKyAgICAvLyBTZXR1cCB0aGUgcHJvamVjdGlvbmkgbWF0cml4CisgICAgcnNfbWF0cml4NHg0IHByb2o7CisgICAgcnNNYXRyaXhMb2FkT3J0aG8oJnByb2osIDAsIHJzZ0dldFdpZHRoKCksIHJzZ0dldEhlaWdodCgpLCAwLCAtNTAwLCA1MDApOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkUHJvamVjdGlvbk1hdHJpeCgmcHJvaik7Cit9CisKK3ZvaWQgZGlzcGxheVNoYWRlclNhbXBsZXMoKSB7CisgICAgYmluZFByb2dyYW1WZXJ0ZXhPcnRobygpOworICAgIHJzX21hdHJpeDR4NCBtYXRyaXg7CisgICAgcnNNYXRyaXhMb2FkSWRlbnRpdHkoJm1hdHJpeCk7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmbWF0cml4KTsKKworICAgIC8vIEZyYWdtZW50IHNoYWRlciB3aXRoIHRleHR1cmUKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZE5vbmUpOworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1Byb2dGcmFnbWVudFRleHR1cmUpOworICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnTGluZWFyQ2xhbXApOworICAgIHJzZ0JpbmRUZXh0dXJlKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnVGV4T3BhcXVlKTsKKworICAgIGZsb2F0IHN0YXJ0WCA9IDAsIHN0YXJ0WSA9IDA7CisgICAgZmxvYXQgd2lkdGggPSAyNTYsIGhlaWdodCA9IDI1NjsKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhzdGFydFgsIHN0YXJ0WSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFksIDAsIDEsIDApOworCisgICAgc3RhcnRYID0gMjAwOyBzdGFydFkgPSAwOworICAgIHdpZHRoID0gMTI4OyBoZWlnaHQgPSAxMjg7CisgICAgcnNnRHJhd1F1YWRUZXhDb29yZHMoc3RhcnRYLCBzdGFydFksIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYLCBzdGFydFkgKyBoZWlnaHQsIDAsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZLCAwLCAxLCAwKTsKKworICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kQWxwaGEpOworICAgIHJzZ0JpbmRUZXh0dXJlKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnVGV4VHJhbnNwYXJlbnQpOworICAgIHN0YXJ0WCA9IDA7IHN0YXJ0WSA9IDIwMDsKKyAgICB3aWR0aCA9IDEyODsgaGVpZ2h0ID0gMTI4OworICAgIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKHN0YXJ0WCwgc3RhcnRZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSwgMCwgMSwgMCk7CisKKyAgICAvLyBGcmFnbWVudCBwcm9ncmFtIHdpdGggc2ltcGxlIGNvbG9yCisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50Q29sb3IpOworICAgIHJzZ1Byb2dyYW1GcmFnbWVudENvbnN0YW50Q29sb3IoZ1Byb2dGcmFnbWVudENvbG9yLCAwLjksIDAuMywgMC4zLCAxKTsKKyAgICByc2dEcmF3UmVjdCgyMDAsIDMwMCwgMzUwLCA0NTAsIDApOworICAgIHJzZ1Byb2dyYW1GcmFnbWVudENvbnN0YW50Q29sb3IoZ1Byb2dGcmFnbWVudENvbG9yLCAwLjMsIDAuOSwgMC4zLCAxKTsKKyAgICByc2dEcmF3UmVjdCg1MCwgNDAwLCA0MDAsIDYwMCwgMCk7CisKKyAgICByc2dGb250Q29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRNb25vKTsKKyAgICByc2dEcmF3VGV4dCgiVGV4dHVyZSBzaGFkZXIiLCAxMCwgNTApOworICAgIHJzZ0RyYXdUZXh0KCJBbHBoYS1ibGVuZGVkIHRleHR1cmUgc2hhZGVyIiwgMTAsIDI4MCk7CisgICAgcnNnRHJhd1RleHQoIkZsYXQgY29sb3Igc2hhZGVyIiwgMTAwLCA0NTApOworfQorCit2b2lkIGRpc3BsYXlCbGVuZGluZ1NhbXBsZXMoKSB7CisgICAgaW50IGk7CisKKyAgICBiaW5kUHJvZ3JhbVZlcnRleE9ydGhvKCk7CisgICAgcnNfbWF0cml4NHg0IG1hdHJpeDsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eSgmbWF0cml4KTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworCisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50Q29sb3IpOworCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmROb25lKTsKKyAgICBmb3IoaSA9IDA7IGkgPCAzOyBpICsrKSB7CisgICAgICAgIGZsb2F0IGlQbHVzT25lID0gKGZsb2F0KShpICsgMSk7CisgICAgICAgIHJzZ1Byb2dyYW1GcmFnbWVudENvbnN0YW50Q29sb3IoZ1Byb2dGcmFnbWVudENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMWYqaVBsdXNPbmUsIDAuMmYqaVBsdXNPbmUsIDAuM2YqaVBsdXNPbmUsIDEpOworICAgICAgICBmbG9hdCB5UG9zID0gMTUwICogKGZsb2F0KWk7CisgICAgICAgIHJzZ0RyYXdSZWN0KDAsIHlQb3MsIDIwMCwgeVBvcyArIDIwMCwgMCk7CisgICAgfQorCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmRBbHBoYSk7CisgICAgZm9yKGkgPSAwOyBpIDwgMzsgaSArKykgeworICAgICAgICBmbG9hdCBpUGx1c09uZSA9IChmbG9hdCkoaSArIDEpOworICAgICAgICByc2dQcm9ncmFtRnJhZ21lbnRDb25zdGFudENvbG9yKGdQcm9nRnJhZ21lbnRDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjJmKmlQbHVzT25lLCAwLjNmKmlQbHVzT25lLCAwLjFmKmlQbHVzT25lLCAwLjUpOworICAgICAgICBmbG9hdCB5UG9zID0gMTUwICogKGZsb2F0KWk7CisgICAgICAgIHJzZ0RyYXdSZWN0KDE1MCwgeVBvcywgMzUwLCB5UG9zICsgMjAwLCAwKTsKKyAgICB9CisKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZEFkZCk7CisgICAgZm9yKGkgPSAwOyBpIDwgMzsgaSArKykgeworICAgICAgICBmbG9hdCBpUGx1c09uZSA9IChmbG9hdCkoaSArIDEpOworICAgICAgICByc2dQcm9ncmFtRnJhZ21lbnRDb25zdGFudENvbG9yKGdQcm9nRnJhZ21lbnRDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjNmKmlQbHVzT25lLCAwLjFmKmlQbHVzT25lLCAwLjJmKmlQbHVzT25lLCAwLjUpOworICAgICAgICBmbG9hdCB5UG9zID0gMTUwICogKGZsb2F0KWk7CisgICAgICAgIHJzZ0RyYXdSZWN0KDMwMCwgeVBvcywgNTAwLCB5UG9zICsgMjAwLCAwKTsKKyAgICB9CisKKworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udE1vbm8pOworICAgIHJzZ0RyYXdUZXh0KCJObyBCbGVuZGluZyIsIDEwLCA1MCk7CisgICAgcnNnRHJhd1RleHQoIkFscGhhIEJsZW5kaW5nIiwgMTYwLCAxNTApOworICAgIHJzZ0RyYXdUZXh0KCJBZGRpdGl2ZSBCbGVuZGluZyIsIDMyMCwgMjUwKTsKKworfQorCit2b2lkIGRpc3BsYXlNZXNoU2FtcGxlcygpIHsKKworICAgIGJpbmRQcm9ncmFtVmVydGV4T3J0aG8oKTsKKyAgICByc19tYXRyaXg0eDQgbWF0cml4OworICAgIHJzTWF0cml4TG9hZFRyYW5zbGF0ZSgmbWF0cml4LCAxMjgsIDEyOCwgMCk7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmbWF0cml4KTsKKworICAgIC8vIEZyYWdtZW50IHNoYWRlciB3aXRoIHRleHR1cmUKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZE5vbmUpOworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1Byb2dGcmFnbWVudFRleHR1cmUpOworICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnTGluZWFyQ2xhbXApOworICAgIHJzZ0JpbmRUZXh0dXJlKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnVGV4T3BhcXVlKTsKKworICAgIHJzZ0RyYXdNZXNoKGdNYnlOTWVzaCk7CisKKyAgICByc2dGb250Q29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRNb25vKTsKKyAgICByc2dEcmF3VGV4dCgiVXNlciBnZW4gMTAgYnkgMTAgZ3JpZCBtZXNoIiwgMTAsIDI1MCk7Cit9CisKK3ZvaWQgZGlzcGxheVRleHR1cmVTYW1wbGVycygpIHsKKworICAgIGJpbmRQcm9ncmFtVmVydGV4T3J0aG8oKTsKKyAgICByc19tYXRyaXg0eDQgbWF0cml4OworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KCZtYXRyaXgpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisKKyAgICAvLyBGcmFnbWVudCBzaGFkZXIgd2l0aCB0ZXh0dXJlCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmROb25lKTsKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQcm9nRnJhZ21lbnRUZXh0dXJlKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ1RleE9wYXF1ZSk7CisKKyAgICAvLyBMaW5lYXIgY2xhbXAKKyAgICByc2dCaW5kU2FtcGxlcihnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ0xpbmVhckNsYW1wKTsKKyAgICBmbG9hdCBzdGFydFggPSAwLCBzdGFydFkgPSAwOworICAgIGZsb2F0IHdpZHRoID0gMzAwLCBoZWlnaHQgPSAzMDA7CisgICAgcnNnRHJhd1F1YWRUZXhDb29yZHMoc3RhcnRYLCBzdGFydFksIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYLCBzdGFydFkgKyBoZWlnaHQsIDAsIDAsIDEuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAxLjEsIDEuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZLCAwLCAxLjEsIDApOworCisgICAgLy8gTGluZWFyIFdyYXAKKyAgICByc2dCaW5kU2FtcGxlcihnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ0xpbmVhcldyYXApOworICAgIHN0YXJ0WCA9IDA7IHN0YXJ0WSA9IDMwMDsKKyAgICB3aWR0aCA9IDMwMDsgaGVpZ2h0ID0gMzAwOworICAgIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKHN0YXJ0WCwgc3RhcnRZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAwLCAxLjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMS4xLCAxLjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSwgMCwgMS4xLCAwKTsKKworICAgIC8vIE5lYXJlc3QKKyAgICByc2dCaW5kU2FtcGxlcihnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ05lYXJlc3RDbGFtcCk7CisgICAgc3RhcnRYID0gMzAwOyBzdGFydFkgPSAwOworICAgIHdpZHRoID0gMzAwOyBoZWlnaHQgPSAzMDA7CisgICAgcnNnRHJhd1F1YWRUZXhDb29yZHMoc3RhcnRYLCBzdGFydFksIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYLCBzdGFydFkgKyBoZWlnaHQsIDAsIDAsIDEuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAxLjEsIDEuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZLCAwLCAxLjEsIDApOworCisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdNaXBMaW5lYXJXcmFwKTsKKyAgICBzdGFydFggPSAzMDA7IHN0YXJ0WSA9IDMwMDsKKyAgICB3aWR0aCA9IDMwMDsgaGVpZ2h0ID0gMzAwOworICAgIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKHN0YXJ0WCwgc3RhcnRZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAwLCAxLjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMS41LCAxLjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSwgMCwgMS41LCAwKTsKKworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udE1vbm8pOworICAgIHJzZ0RyYXdUZXh0KCJGaWx0ZXJpbmc6IGxpbmVhciBjbGFtcCIsIDEwLCAyOTApOworICAgIHJzZ0RyYXdUZXh0KCJGaWx0ZXJpbmc6IGxpbmVhciB3cmFwIiwgMTAsIDU5MCk7CisgICAgcnNnRHJhd1RleHQoIkZpbHRlcmluZzogbmVhcmVzdCBjbGFtcCIsIDMxMCwgMjkwKTsKKyAgICByc2dEcmF3VGV4dCgiRmlsdGVyaW5nOiBtaXBsaW5lYXIgd3JhcCIsIDMxMCwgNTkwKTsKK30KKworZmxvYXQgZ1RvcnVzUm90YXRpb24gPSAwOworCit2b2lkIGRpc3BsYXlDdWxsaW5nU2FtcGxlcygpIHsKKyAgICByc2dCaW5kUHJvZ3JhbVZlcnRleChnUHJvZ1ZlcnRleCk7CisgICAgLy8gU2V0dXAgdGhlIHByb2plY3Rpb25pIG1hdHJpeCB3aXRoIDYwIGRlZ3JlZSBmaWVsZCBvZiB2aWV3CisgICAgcnNfbWF0cml4NHg0IHByb2o7CisgICAgZmxvYXQgYXNwZWN0ID0gKGZsb2F0KXJzZ0dldFdpZHRoKCkgLyAoZmxvYXQpcnNnR2V0SGVpZ2h0KCk7CisgICAgcnNNYXRyaXhMb2FkUGVyc3BlY3RpdmUoJnByb2osIDMwLjBmLCBhc3BlY3QsIDAuMWYsIDEwMC4wZik7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRQcm9qZWN0aW9uTWF0cml4KCZwcm9qKTsKKworICAgIC8vIEZyYWdtZW50IHNoYWRlciB3aXRoIHRleHR1cmUKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZE5vbmVEZXB0aCk7CisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50VGV4dHVyZSk7CisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdMaW5lYXJDbGFtcCk7CisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdUZXhUb3J1cyk7CisKKyAgICAvLyBBcGxseSBhIHJvdGF0aW9uIHRvIG91ciBtZXNoCisgICAgZ1RvcnVzUm90YXRpb24gKz0gNTAuMGYgKiBnRHQ7CisgICAgaWYoZ1RvcnVzUm90YXRpb24gPiAzNjAuMGYpIHsKKyAgICAgICAgZ1RvcnVzUm90YXRpb24gLT0gMzYwLjBmOworICAgIH0KKworICAgIHJzX21hdHJpeDR4NCBtYXRyaXg7CisgICAgLy8gUG9zaXRpb24gb3VyIG1vZGVsIG9uIHRoZSBzY3JlZW4KKyAgICByc01hdHJpeExvYWRUcmFuc2xhdGUoJm1hdHJpeCwgLTIuMGYsIDAuMGYsIC0xMC4wZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJm1hdHJpeCwgZ1RvcnVzUm90YXRpb24sIDEuMGYsIDAuMGYsIDAuMGYpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisgICAgLy8gVXNlIGZyb250IGZhY2UgY3VsbGluZworICAgIHJzZ0JpbmRQcm9ncmFtUmFzdGVyKGdDdWxsRnJvbnQpOworICAgIHJzZ0RyYXdNZXNoKGdUb3J1c01lc2gpOworCisgICAgcnNNYXRyaXhMb2FkVHJhbnNsYXRlKCZtYXRyaXgsIDIuMGYsIDAuMGYsIC0xMC4wZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJm1hdHJpeCwgZ1RvcnVzUm90YXRpb24sIDEuMGYsIDAuMGYsIDAuMGYpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisgICAgLy8gVXNlIGJhY2sgZmFjZSBjdWxsaW5nCisgICAgcnNnQmluZFByb2dyYW1SYXN0ZXIoZ0N1bGxCYWNrKTsKKyAgICByc2dEcmF3TWVzaChnVG9ydXNNZXNoKTsKKworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udE1vbm8pOworICAgIHJzZ0RyYXdUZXh0KCJEaXNwbGF5aW5nIG1lc2ggZnJvbnQvYmFjayBmYWNlIGN1bGxpbmciLCAxMCwgcnNnR2V0SGVpZ2h0KCkgLSAxMCk7Cit9CisKK2Zsb2F0IGdMaWdodDBSb3RhdGlvbiA9IDA7CitmbG9hdCBnTGlnaHQxUm90YXRpb24gPSAwOworCit2b2lkIHNldHVwQ3VzdG9tU2hhZGVyTGlnaHRzKCkgeworICAgIGZsb2F0NCBsaWdodDBQb3MgPSB7LTUuMGYsIDUuMGYsIC0xMC4wZiwgMS4wZn07CisgICAgZmxvYXQ0IGxpZ2h0MVBvcyA9IHsyLjBmLCA1LjBmLCAxNS4wZiwgMS4wZn07CisgICAgZmxvYXQzIGxpZ2h0MERpZmZDb2wgPSB7MC45ZiwgMC43ZiwgMC43Zn07CisgICAgZmxvYXQzIGxpZ2h0MFNwZWNDb2wgPSB7MC45ZiwgMC42ZiwgMC42Zn07CisgICAgZmxvYXQzIGxpZ2h0MURpZmZDb2wgPSB7MC41ZiwgMC41ZiwgMC45Zn07CisgICAgZmxvYXQzIGxpZ2h0MVNwZWNDb2wgPSB7MC41ZiwgMC41ZiwgMC45Zn07CisKKyAgICBnTGlnaHQwUm90YXRpb24gKz0gNTAuMGYgKiBnRHQ7CisgICAgaWYoZ0xpZ2h0MFJvdGF0aW9uID4gMzYwLjBmKSB7CisgICAgICAgIGdMaWdodDBSb3RhdGlvbiAtPSAzNjAuMGY7CisgICAgfQorICAgIGdMaWdodDFSb3RhdGlvbiAtPSA1MC4wZiAqIGdEdDsKKyAgICBpZihnTGlnaHQxUm90YXRpb24gPiAzNjAuMGYpIHsKKyAgICAgICAgZ0xpZ2h0MVJvdGF0aW9uIC09IDM2MC4wZjsKKyAgICB9CisKKyAgICByc19tYXRyaXg0eDQgbDBNYXQ7CisgICAgcnNNYXRyaXhMb2FkUm90YXRlKCZsME1hdCwgZ0xpZ2h0MFJvdGF0aW9uLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICBsaWdodDBQb3MgPSByc01hdHJpeE11bHRpcGx5KCZsME1hdCwgbGlnaHQwUG9zKTsKKyAgICByc19tYXRyaXg0eDQgbDFNYXQ7CisgICAgcnNNYXRyaXhMb2FkUm90YXRlKCZsMU1hdCwgZ0xpZ2h0MVJvdGF0aW9uLCAwLjBmLCAwLjBmLCAxLjBmKTsKKyAgICBsaWdodDFQb3MgPSByc01hdHJpeE11bHRpcGx5KCZsMU1hdCwgbGlnaHQxUG9zKTsKKworICAgIC8vIFNldCBsaWdodCAwIHByb3BlcnRpZXMKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MF9Qb3Npc2lvbi54ID0gbGlnaHQwUG9zLng7CisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDBfUG9zaXNpb24ueSA9IGxpZ2h0MFBvcy55OworICAgIGdWU0NvbnN0YW50cy0+bGlnaHQwX1Bvc2lzaW9uLnogPSBsaWdodDBQb3MuejsKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MF9EaWZmdXNlID0gMS4wZjsKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MF9TcGVjdWxhciA9IDAuNWY7CisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDBfQ29zaW5lUG93ZXIgPSA0MC4wZjsKKyAgICAvLyBTZXQgbGlnaHQgMSBwcm9wZXJ0aWVzCisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDFfUG9zaXNpb24ueCA9IGxpZ2h0MVBvcy54OworICAgIGdWU0NvbnN0YW50cy0+bGlnaHQxX1Bvc2lzaW9uLnkgPSBsaWdodDFQb3MueTsKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MV9Qb3Npc2lvbi56ID0gbGlnaHQxUG9zLno7CisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDFfRGlmZnVzZSA9IDEuMGY7CisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDFfU3BlY3VsYXIgPSAwLjdmOworICAgIGdWU0NvbnN0YW50cy0+bGlnaHQxX0Nvc2luZVBvd2VyID0gNTAuMGY7CisgICAgcnNBbGxvY2F0aW9uTWFya0RpcnR5KHJzR2V0QWxsb2NhdGlvbihnVlNDb25zdGFudHMpKTsKKworICAgIC8vIFVwZGF0ZSBmcmFnbWV0biBzaGFkZXIgY29uc3RhbnRzCisgICAgLy8gU2V0IGxpZ2h0IDAgY29sb3JzCisgICAgZ0ZTQ29uc3RhbnRzLT5saWdodDBfRGlmZnVzZUNvbG9yID0gbGlnaHQwRGlmZkNvbDsKKyAgICBnRlNDb25zdGFudHMtPmxpZ2h0MF9TcGVjdWxhckNvbG9yID0gbGlnaHQwU3BlY0NvbDsKKyAgICAvLyBTZXQgbGlnaHQgMSBjb2xvcnMKKyAgICBnRlNDb25zdGFudHMtPmxpZ2h0MV9EaWZmdXNlQ29sb3IgPSBsaWdodDFEaWZmQ29sOworICAgIGdGU0NvbnN0YW50cy0+bGlnaHQxX1NwZWN1bGFyQ29sb3IgPSBsaWdodDFTcGVjQ29sOworICAgIHJzQWxsb2NhdGlvbk1hcmtEaXJ0eShyc0dldEFsbG9jYXRpb24oZ0ZTQ29uc3RhbnRzKSk7Cit9CisKK3ZvaWQgZGlzcGxheUN1c3RvbVNoYWRlclNhbXBsZXMoKSB7CisKKyAgICAvLyBVcGRhdGUgdmVydGV4IHNoYWRlciBjb25zdGFudHMKKyAgICAvLyBMb2FkIG1vZGVsIG1hdHJpeAorICAgIC8vIEFwbGx5IGEgcm90YXRpb24gdG8gb3VyIG1lc2gKKyAgICBnVG9ydXNSb3RhdGlvbiArPSA1MC4wZiAqIGdEdDsKKyAgICBpZihnVG9ydXNSb3RhdGlvbiA+IDM2MC4wZikgeworICAgICAgICBnVG9ydXNSb3RhdGlvbiAtPSAzNjAuMGY7CisgICAgfQorCisgICAgLy8gUG9zaXRpb24gb3VyIG1vZGVsIG9uIHRoZSBzY3JlZW4KKyAgICByc01hdHJpeExvYWRUcmFuc2xhdGUoJmdWU0NvbnN0YW50cy0+bW9kZWwsIDAuMGYsIDAuMGYsIC0xMC4wZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJmdWU0NvbnN0YW50cy0+bW9kZWwsIGdUb3J1c1JvdGF0aW9uLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICByc01hdHJpeFJvdGF0ZSgmZ1ZTQ29uc3RhbnRzLT5tb2RlbCwgZ1RvcnVzUm90YXRpb24sIDAuMGYsIDAuMGYsIDEuMGYpOworICAgIC8vIFNldHVwIHRoZSBwcm9qZWN0aW9uaSBtYXRyaXgKKyAgICBmbG9hdCBhc3BlY3QgPSAoZmxvYXQpcnNnR2V0V2lkdGgoKSAvIChmbG9hdClyc2dHZXRIZWlnaHQoKTsKKyAgICByc01hdHJpeExvYWRQZXJzcGVjdGl2ZSgmZ1ZTQ29uc3RhbnRzLT5wcm9qLCAzMC4wZiwgYXNwZWN0LCAwLjFmLCAxMDAuMGYpOworICAgIHNldHVwQ3VzdG9tU2hhZGVyTGlnaHRzKCk7CisKKyAgICByc2dCaW5kUHJvZ3JhbVZlcnRleChnUHJvZ1ZlcnRleEN1c3RvbSk7CisKKyAgICAvLyBGcmFnbWVudCBzaGFkZXIgd2l0aCB0ZXh0dXJlCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmROb25lRGVwdGgpOworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1Byb2dGcmFnbWVudEN1c3RvbSk7CisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudEN1c3RvbSwgMCwgZ0xpbmVhckNsYW1wKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUHJvZ0ZyYWdtZW50Q3VzdG9tLCAwLCBnVGV4VG9ydXMpOworCisgICAgLy8gVXNlIGJhY2sgZmFjZSBjdWxsaW5nCisgICAgcnNnQmluZFByb2dyYW1SYXN0ZXIoZ0N1bGxCYWNrKTsKKyAgICByc2dEcmF3TWVzaChnVG9ydXNNZXNoKTsKKworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udE1vbm8pOworICAgIHJzZ0RyYXdUZXh0KCJDdXN0b20gc2hhZGVyIHNhbXBsZSIsIDEwLCByc2dHZXRIZWlnaHQoKSAtIDEwKTsKK30KKwordm9pZCBkaXNwbGF5TXVsdGl0ZXh0dXJlU2FtcGxlKCkgeworICAgIGJpbmRQcm9ncmFtVmVydGV4T3J0aG8oKTsKKyAgICByc19tYXRyaXg0eDQgbWF0cml4OworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KCZtYXRyaXgpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisKKyAgICAvLyBGcmFnbWVudCBzaGFkZXIgd2l0aCB0ZXh0dXJlCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmROb25lKTsKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQcm9nRnJhZ21lbnRNdWx0aXRleCk7CisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudE11bHRpdGV4LCAwLCBnTGluZWFyQ2xhbXApOworICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRNdWx0aXRleCwgMSwgZ0xpbmVhcldyYXApOworICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRNdWx0aXRleCwgMiwgZ0xpbmVhckNsYW1wKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUHJvZ0ZyYWdtZW50TXVsdGl0ZXgsIDAsIGdUZXhDaGVja2VyKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUHJvZ0ZyYWdtZW50TXVsdGl0ZXgsIDEsIGdUZXhUb3J1cyk7CisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudE11bHRpdGV4LCAyLCBnVGV4VHJhbnNwYXJlbnQpOworCisgICAgZmxvYXQgc3RhcnRYID0gMCwgc3RhcnRZID0gMDsKKyAgICBmbG9hdCB3aWR0aCA9IDI1NiwgaGVpZ2h0ID0gMjU2OworICAgIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKHN0YXJ0WCwgc3RhcnRZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSwgMCwgMSwgMCk7CisKKyAgICByc2dGb250Q29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRNb25vKTsKKyAgICByc2dEcmF3VGV4dCgiQ3VzdG9tIHNoYWRlciB3aXRoIG11bHRpdGV4dHVyaW5nIiwgMTAsIDI4MCk7Cit9CisKK2Zsb2F0IGdBbmlzb1RpbWUgPSAwLjBmOwordWludCBhbmlzb01vZGUgPSAwOwordm9pZCBkaXNwbGF5QW5pc29TYW1wbGUoKSB7CisKKyAgICBnQW5pc29UaW1lICs9IGdEdDsKKworICAgIHJzZ0JpbmRQcm9ncmFtVmVydGV4KGdQcm9nVmVydGV4KTsKKyAgICBmbG9hdCBhc3BlY3QgPSAoZmxvYXQpcnNnR2V0V2lkdGgoKSAvIChmbG9hdClyc2dHZXRIZWlnaHQoKTsKKyAgICByc19tYXRyaXg0eDQgcHJvajsKKyAgICByc01hdHJpeExvYWRQZXJzcGVjdGl2ZSgmcHJvaiwgMzAuMGYsIGFzcGVjdCwgMC4xZiwgMTAwLjBmKTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZFByb2plY3Rpb25NYXRyaXgoJnByb2opOworCisgICAgcnNfbWF0cml4NHg0IG1hdHJpeDsKKyAgICAvLyBGcmFnbWVudCBzaGFkZXIgd2l0aCB0ZXh0dXJlCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmROb25lKTsKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQcm9nRnJhZ21lbnRUZXh0dXJlKTsKKyAgICByc01hdHJpeExvYWRUcmFuc2xhdGUoJm1hdHJpeCwgMC4wZiwgMC4wZiwgLTEwLjBmKTsKKyAgICByc01hdHJpeFJvdGF0ZSgmbWF0cml4LCAtODAsIDEuMGYsIDAuMGYsIDAuMGYpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisKKyAgICByc2dCaW5kUHJvZ3JhbVJhc3RlcihnQ3VsbE5vbmUpOworCisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdUZXhDaGVja2VyKTsKKworICAgIGlmKGdBbmlzb1RpbWUgPj0gNS4wZikgeworICAgICAgICBnQW5pc29UaW1lID0gMC4wZjsKKyAgICAgICAgYW5pc29Nb2RlICsrOworICAgICAgICBhbmlzb01vZGUgPSBhbmlzb01vZGUgJSAzOworICAgIH0KKworICAgIGlmKGFuaXNvTW9kZSA9PSAwKSB7CisgICAgICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnTWlwTGluZWFyQW5pc284KTsKKyAgICB9CisgICAgZWxzZSBpZihhbmlzb01vZGUgPT0gMSkgeworICAgICAgICByc2dCaW5kU2FtcGxlcihnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ01pcExpbmVhckFuaXNvMTUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdNaXBMaW5lYXJXcmFwKTsKKyAgICB9CisKKyAgICBmbG9hdCBzdGFydFggPSAtMTU7CisgICAgZmxvYXQgc3RhcnRZID0gLTE1OworICAgIGZsb2F0IHdpZHRoID0gMzA7CisgICAgZmxvYXQgaGVpZ2h0ID0gMzA7CisgICAgcnNnRHJhd1F1YWRUZXhDb29yZHMoc3RhcnRYLCBzdGFydFksIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYLCBzdGFydFkgKyBoZWlnaHQsIDAsIDAsIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEwLCAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZLCAwLCAxMCwgMCk7CisKKyAgICByc2dCaW5kUHJvZ3JhbVJhc3RlcihnQ3VsbEJhY2spOworCisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250TW9ubyk7CisgICAgaWYoYW5pc29Nb2RlID09IDApIHsKKyAgICAgICAgcnNnRHJhd1RleHQoIkFuaXNvdHJvcGljIGZpbHRlcmluZyA4IiwgMTAsIDQwKTsKKyAgICB9CisgICAgZWxzZSBpZihhbmlzb01vZGUgPT0gMSkgeworICAgICAgICByc2dEcmF3VGV4dCgiQW5pc290cm9waWMgZmlsdGVyaW5nIDE1IiwgMTAsIDQwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzZ0RyYXdUZXh0KCJNaXBsaW5lYXIgZmlsdGVyaW5nIiwgMTAsIDQwKTsKKyAgICB9Cit9CisKK2ludCByb290KGludCBsYXVuY2hJRCkgeworCisgICAgZ0R0ID0gcnNHZXREdCgpOworCisgICAgcnNnQ2xlYXJDb2xvcigwLjJmLCAwLjJmLCAwLjJmLCAwLjBmKTsKKyAgICByc2dDbGVhckRlcHRoKDEuMGYpOworCisgICAgc3dpdGNoKGdEaXNwbGF5TW9kZSkgeworICAgIGNhc2UgMDoKKyAgICAgICAgZGlzcGxheUZvbnRTYW1wbGVzKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgZGlzcGxheVNoYWRlclNhbXBsZXMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBkaXNwbGF5QmxlbmRpbmdTYW1wbGVzKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgZGlzcGxheU1lc2hTYW1wbGVzKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgZGlzcGxheVRleHR1cmVTYW1wbGVycygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICAgIGRpc3BsYXlDdWxsaW5nU2FtcGxlcygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICAgIGRpc3BsYXlDdXN0b21TaGFkZXJTYW1wbGVzKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgICAgZGlzcGxheU11bHRpdGV4dHVyZVNhbXBsZSgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICAgIGRpc3BsYXlBbmlzb1NhbXBsZSgpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gMTA7Cit9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9zaGFkZXJfZGVmLnJzaCBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL3NoYWRlcl9kZWYucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZjYyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9zaGFkZXJfZGVmLnJzaApAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQuc2FtcGxlcykKKwordHlwZWRlZiBzdHJ1Y3QgVmVydGV4U2hhZGVyQ29uc3RhbnRzX3MgeworICAgIHJzX21hdHJpeDR4NCBtb2RlbDsKKyAgICByc19tYXRyaXg0eDQgcHJvajsKKyAgICBmbG9hdDMgbGlnaHQwX1Bvc2lzaW9uOworICAgIGZsb2F0IGxpZ2h0MF9EaWZmdXNlOworICAgIGZsb2F0IGxpZ2h0MF9TcGVjdWxhcjsKKyAgICBmbG9hdCBsaWdodDBfQ29zaW5lUG93ZXI7CisKKyAgICBmbG9hdDMgbGlnaHQxX1Bvc2lzaW9uOworICAgIGZsb2F0IGxpZ2h0MV9EaWZmdXNlOworICAgIGZsb2F0IGxpZ2h0MV9TcGVjdWxhcjsKKyAgICBmbG9hdCBsaWdodDFfQ29zaW5lUG93ZXI7Cit9IFZlcnRleFNoYWRlckNvbnN0YW50czsKKwordHlwZWRlZiBzdHJ1Y3QgRnJhZ2VudFNoYWRlckNvbnN0YW50c19zIHsKKyAgICBmbG9hdDMgbGlnaHQwX0RpZmZ1c2VDb2xvcjsKKyAgICBmbG9hdDMgbGlnaHQwX1NwZWN1bGFyQ29sb3I7CisKKyAgICBmbG9hdDMgbGlnaHQxX0RpZmZ1c2VDb2xvcjsKKyAgICBmbG9hdDMgbGlnaHQxX1NwZWN1bGFyQ29sb3I7CisKK30gRnJhZ2VudFNoYWRlckNvbnN0YW50czsKKwordHlwZWRlZiBzdHJ1Y3QgVmVydGV4U2hhZGVySW5wdXRzX3MgeworICAgIGZsb2F0NCBwb3NpdGlvbjsKKyAgICBmbG9hdDMgbm9ybWFsOworICAgIGZsb2F0MiB0ZXh0dXJlMDsKK30gVmVydGV4U2hhZGVySW5wdXRzOworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvdGVzdHMvQW5kcm9pZC5tayBiL2xpYnMvcnMvamF2YS90ZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOTkyZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMwIEBACisjCisjIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSAkKGNhbGwgYWxsLXJlbmRlcnNjcmlwdC1maWxlcy11bmRlciwgc3JjKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gUlNUZXN0CisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9saWJzL3JzL2phdmEvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjYwMzk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwxNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQucnMudGVzdCI+CisgICAgPGFwcGxpY2F0aW9uIAorICAgICAgICBhbmRyb2lkOmxhYmVsPSJfUlNfVGVzdCIKKyAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvdGVzdF9wYXR0ZXJuIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iUlNUZXN0IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL3Rlc3RzL3Jlcy9kcmF3YWJsZS90ZXN0X3BhdHRlcm4ucG5nIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3Jlcy9kcmF3YWJsZS90ZXN0X3BhdHRlcm4ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDE0NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvcmVzL2RyYXdhYmxlL3Rlc3RfcGF0dGVybi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdC5qYXZhIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNjQ2NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdDsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TeXN0ZW07CitpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKKworaW1wb3J0IGphdmEubGFuZy5SdW50aW1lOworCitwdWJsaWMgY2xhc3MgUlNUZXN0IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIC8vRXZlbnRMaXN0ZW5lciBtTGlzdGVuZXIgPSBuZXcgRXZlbnRMaXN0ZW5lcigpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAibGliUlNfam5pIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHICA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9HX0VOQUJMRUQgPSBERUJVRyA/IENvbmZpZy5MT0dEIDogQ29uZmlnLkxPR1Y7CisKKyAgICBwcml2YXRlIFJTVGVzdFZpZXcgbVZpZXc7CisKKyAgICAvLyBnZXQgdGhlIGN1cnJlbnQgbG9vcGVyIChmcm9tIHlvdXIgQWN0aXZpdHkgVUkgdGhyZWFkIGZvciBpbnN0YW5jZQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworCisgICAgICAgIC8vIENyZWF0ZSBvdXIgUHJldmlldyB2aWV3IGFuZCBzZXQgaXQgYXMgdGhlIGNvbnRlbnQgb2Ygb3VyCisgICAgICAgIC8vIEFjdGl2aXR5CisgICAgICAgIG1WaWV3ID0gbmV3IFJTVGVzdFZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgaWYgKExPR19FTkFCTEVEKSB7CisgICAgICAgICAgICBMb2cudihMT0dfVEFHLCBtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0Q29yZS5qYXZhIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdENvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzVkZWEyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdENvcmUuamF2YQpAQCAtMCwwICsxLDE5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyOworaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7CisKKworcHVibGljIGNsYXNzIFJTVGVzdENvcmUgeworICAgIGludCBtV2lkdGg7CisgICAgaW50IG1IZWlnaHQ7CisKKyAgICBwdWJsaWMgUlNUZXN0Q29yZSgpIHsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworCisgICAgcHJpdmF0ZSBGb250IG1Gb250OworICAgIFNjcmlwdEZpZWxkX0xpc3RBbGxvY3NfcyBtTGlzdEFsbG9jczsKKyAgICBpbnQgbUxhc3RYOworICAgIGludCBtTGFzdFk7CisgICAgcHJpdmF0ZSBTY3JpcHRDX3JzbGlzdCBtU2NyaXB0OworCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8VW5pdFRlc3Q+IHVuaXRUZXN0czsKKyAgICBwcml2YXRlIExpc3RJdGVyYXRvcjxVbml0VGVzdD4gdGVzdF9pdGVyOworICAgIHByaXZhdGUgVW5pdFRlc3QgYWN0aXZlVGVzdDsKKyAgICBwcml2YXRlIGJvb2xlYW4gc3RvcFRlc3Rpbmc7CisKKyAgICAvKiBQZXJpb2RpYyB0aW1lciBmb3IgZW5zdXJpbmcgZnV0dXJlIHRlc3RzIGdldCBzY2hlZHVsZWQgKi8KKyAgICBwcml2YXRlIFRpbWVyIG1UaW1lcjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSU19USU1FUl9QRVJJT0QgPSAxMDA7CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgbVJTID0gcnM7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgICAgIG1XaWR0aCA9IHdpZHRoOworICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBzdG9wVGVzdGluZyA9IGZhbHNlOworCisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19yc2xpc3QobVJTLCBtUmVzLCBSLnJhdy5yc2xpc3QsIHRydWUpOworCisgICAgICAgIHVuaXRUZXN0cyA9IG5ldyBBcnJheUxpc3Q8VW5pdFRlc3Q+KCk7CisKKyAgICAgICAgdW5pdFRlc3RzLmFkZChuZXcgVVRfcHJpbWl0aXZlcyh0aGlzLCBtUmVzKSk7CisgICAgICAgIHVuaXRUZXN0cy5hZGQobmV3IFVUX2ZwX21hZCh0aGlzLCBtUmVzKSk7CisgICAgICAgIC8qCisgICAgICAgIHVuaXRUZXN0cy5hZGQobmV3IFVuaXRUZXN0KG51bGwsICI8UGFzcz4iLCAxKSk7CisgICAgICAgIHVuaXRUZXN0cy5hZGQobmV3IFVuaXRUZXN0KCkpOworICAgICAgICB1bml0VGVzdHMuYWRkKG5ldyBVbml0VGVzdChudWxsLCAiPEZhaWw+IiwgLTEpKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICAgICAgICAgIHVuaXRUZXN0cy5hZGQobmV3IFVuaXRUZXN0KG51bGwsICI8UGFzcz4iLCAxKSk7CisgICAgICAgIH0KKyAgICAgICAgKi8KKworICAgICAgICBVbml0VGVzdCBbXSB1dGEgPSBuZXcgVW5pdFRlc3RbdW5pdFRlc3RzLnNpemUoKV07CisgICAgICAgIHV0YSA9IHVuaXRUZXN0cy50b0FycmF5KHV0YSk7CisKKyAgICAgICAgbUxpc3RBbGxvY3MgPSBuZXcgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zKG1SUywgdXRhLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXRhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MuSXRlbSBsaXN0RWxlbSA9IG5ldyBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MuSXRlbSgpOworICAgICAgICAgICAgbGlzdEVsZW0udGV4dCA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbVN0cmluZyhtUlMsIHV0YVtpXS5uYW1lKTsKKyAgICAgICAgICAgIGxpc3RFbGVtLnJlc3VsdCA9IHV0YVtpXS5yZXN1bHQ7CisgICAgICAgICAgICBtTGlzdEFsbG9jcy5zZXQobGlzdEVsZW0sIGksIGZhbHNlKTsKKyAgICAgICAgICAgIHV0YVtpXS5zZXRJdGVtKGxpc3RFbGVtKTsKKyAgICAgICAgfQorCisgICAgICAgIG1MaXN0QWxsb2NzLmNvcHlBbGwoKTsKKworICAgICAgICBtU2NyaXB0LmJpbmRfZ0xpc3QobUxpc3RBbGxvY3MpOworCisgICAgICAgIG1Gb250ID0gRm9udC5jcmVhdGVGcm9tRmFtaWx5KG1SUywgbVJlcywgInNlcmlmIiwgRm9udC5TdHlsZS5CT0xELCA4KTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0ZvbnQobUZvbnQpOworCisgICAgICAgIG1SUy5jb250ZXh0QmluZFJvb3RTY3JpcHQobVNjcmlwdCk7CisKKyAgICAgICAgdGVzdF9pdGVyID0gdW5pdFRlc3RzLmxpc3RJdGVyYXRvcigpOworICAgICAgICByZWZyZXNoVGVzdFJlc3VsdHMoKTsgLyogS2ljayBvZmYgdGhlIGZpcnN0IHRlc3QgKi8KKworICAgICAgICBUaW1lclRhc2sgcFRhc2sgPSBuZXcgVGltZXJUYXNrKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHJlZnJlc2hUZXN0UmVzdWx0cygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIG1UaW1lciA9IG5ldyBUaW1lcigpOworICAgICAgICBtVGltZXIuc2NoZWR1bGUocFRhc2ssIFJTX1RJTUVSX1BFUklPRCwgUlNfVElNRVJfUEVSSU9EKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjaGVja0FuZFJ1bk5leHRUZXN0KCkgeworICAgICAgICBpZiAoYWN0aXZlVGVzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIWFjdGl2ZVRlc3QuaXNBbGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgLyogUHJvcGVybHkgY2xlYW4gdXAgb24gb3VyIGxhc3QgdGVzdCAqLworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRlc3Quam9pbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhY3RpdmVUZXN0ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghc3RvcFRlc3RpbmcgJiYgYWN0aXZlVGVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAodGVzdF9pdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGFjdGl2ZVRlc3QgPSB0ZXN0X2l0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGFjdGl2ZVRlc3Quc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAvKiBUaGlzIHJvdXRpbmUgd2lsbCBvbmx5IGdldCBjYWxsZWQgb25jZSB3aGVuIGEgbmV3IHRlc3QKKyAgICAgICAgICAgICAgICAgKiBzaG91bGQgc3RhcnQgcnVubmluZy4gVGhlIG1lc3NhZ2UgaGFuZGxlciBpbiBVbml0VGVzdC5qYXZhCisgICAgICAgICAgICAgICAgICogZW5zdXJlcyB0aGlzLiAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1UaW1lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lci5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVyLnB1cmdlKCk7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lciA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVmcmVzaFRlc3RSZXN1bHRzKCkgeworICAgICAgICBjaGVja0FuZFJ1bk5leHRUZXN0KCk7CisKKyAgICAgICAgaWYgKG1MaXN0QWxsb2NzICE9IG51bGwgJiYgbVNjcmlwdCAhPSBudWxsICYmIG1SUyAhPSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdEFsbG9jcy5jb3B5QWxsKCk7CisKKyAgICAgICAgICAgIG1TY3JpcHQuYmluZF9nTGlzdChtTGlzdEFsbG9jcyk7CisgICAgICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKKyAgICAgICAgc3RvcFRlc3RpbmcgPSB0cnVlOworICAgICAgICBVbml0VGVzdCB0ID0gYWN0aXZlVGVzdDsKKworICAgICAgICAvKiBTdG9wIHBlcmlvZGljIHJlZnJlc2ggb2YgdGVzdGluZyAqLworICAgICAgICBpZiAobVRpbWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UaW1lci5jYW5jZWwoKTsKKyAgICAgICAgICAgIG1UaW1lci5wdXJnZSgpOworICAgICAgICAgICAgbVRpbWVyID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFdhaXQgdG8gZXhpdCB1bnRpbCB3ZSBmaW5pc2ggdGhlIGN1cnJlbnQgdGVzdCAqLworICAgICAgICBpZiAodCAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHQgPSBudWxsOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBuZXdUb3VjaFBvc2l0aW9uKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHByZXNzdXJlLCBpbnQgaWQpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGlvbkRvd24oaW50IHgsIGludCB5KSB7CisgICAgICAgIG1TY3JpcHQuc2V0X2dEWSgwLjBmKTsKKyAgICAgICAgbUxhc3RYID0geDsKKyAgICAgICAgbUxhc3RZID0geTsKKyAgICAgICAgcmVmcmVzaFRlc3RSZXN1bHRzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25BY3Rpb25Nb3ZlKGludCB4LCBpbnQgeSkgeworICAgICAgICBpbnQgZHggPSBtTGFzdFggLSB4OworICAgICAgICBpbnQgZHkgPSBtTGFzdFkgLSB5OworCisgICAgICAgIGlmIChNYXRoLmFicyhkeSkgPD0gMikgeworICAgICAgICAgICAgZHkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0RZKGR5KTsKKworICAgICAgICBtTGFzdFggPSB4OworICAgICAgICBtTGFzdFkgPSB5OworICAgICAgICByZWZyZXNoVGVzdFJlc3VsdHMoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0Vmlldy5qYXZhIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODExZDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdFZpZXcuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0OworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworcHVibGljIGNsYXNzIFJTVGVzdFZpZXcgZXh0ZW5kcyBSU1N1cmZhY2VWaWV3IHsKKworICAgIHB1YmxpYyBSU1Rlc3RWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgLy9zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBSU1Rlc3RDb3JlIG1SZW5kZXI7CisKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIHN1cGVyLnN1cmZhY2VDaGFuZ2VkKGhvbGRlciwgZm9ybWF0LCB3LCBoKTsKKyAgICAgICAgaWYgKG1SUyA9PSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBjcmVhdGVSZW5kZXJTY3JpcHQoZmFsc2UpOworICAgICAgICAgICAgbVJTLmNvbnRleHRTZXRTdXJmYWNlKHcsIGgsIGhvbGRlci5nZXRTdXJmYWNlKCkpOworICAgICAgICAgICAgbVJlbmRlciA9IG5ldyBSU1Rlc3RDb3JlKCk7CisgICAgICAgICAgICBtUmVuZGVyLmluaXQobVJTLCBnZXRSZXNvdXJjZXMoKSwgdywgaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgaWYobVJTICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SZW5kZXIuY2xlYW51cCgpOworICAgICAgICAgICAgbVJTID0gbnVsbDsKKyAgICAgICAgICAgIGRlc3Ryb3lSZW5kZXJTY3JpcHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpCisgICAgeworICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpCisgICAgeworICAgICAgICBib29sZWFuIHJldCA9IGZhbHNlOworICAgICAgICBpbnQgYWN0ID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIGlmIChhY3QgPT0gZXYuQUNUSU9OX0RPV04pIHsKKyAgICAgICAgICAgIG1SZW5kZXIub25BY3Rpb25Eb3duKChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSk7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFjdCA9PSBldi5BQ1RJT05fTU9WRSkgeworICAgICAgICAgICAgbVJlbmRlci5vbkFjdGlvbk1vdmUoKGludClldi5nZXRYKCksIChpbnQpZXYuZ2V0WSgpKTsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfZnBfbWFkLmphdmEgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfZnBfbWFkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1N2U5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9mcF9tYWQuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKKworcHVibGljIGNsYXNzIFVUX2ZwX21hZCBleHRlbmRzIFVuaXRUZXN0IHsKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworCisgICAgcHJvdGVjdGVkIFVUX2ZwX21hZChSU1Rlc3RDb3JlIHJzdGMsIFJlc291cmNlcyByZXMpIHsKKyAgICAgICAgc3VwZXIocnN0YywgIkZwX01hZCIpOworICAgICAgICBtUmVzID0gcmVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgUmVuZGVyU2NyaXB0IHBSUyA9IFJlbmRlclNjcmlwdC5jcmVhdGUoKTsKKyAgICAgICAgU2NyaXB0Q19mcF9tYWQgcyA9IG5ldyBTY3JpcHRDX2ZwX21hZChwUlMsIG1SZXMsIFIucmF3LmZwX21hZCwgdHJ1ZSk7CisgICAgICAgIHBSUy5tTWVzc2FnZUNhbGxiYWNrID0gbVJzTWVzc2FnZTsKKyAgICAgICAgcy5pbnZva2VfZnBfbWFkX3Rlc3QoMCwgMCk7CisgICAgICAgIHBSUy5maW5pc2goKTsKKyAgICAgICAgd2FpdEZvck1lc3NhZ2UoKTsKKyAgICAgICAgcFJTLmRlc3Ryb3koKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9wcmltaXRpdmVzLmphdmEgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfcHJpbWl0aXZlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMzU1ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfcHJpbWl0aXZlcy5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworCitwdWJsaWMgY2xhc3MgVVRfcHJpbWl0aXZlcyBleHRlbmRzIFVuaXRUZXN0IHsKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworCisgICAgcHJvdGVjdGVkIFVUX3ByaW1pdGl2ZXMoUlNUZXN0Q29yZSByc3RjLCBSZXNvdXJjZXMgcmVzKSB7CisgICAgICAgIHN1cGVyKHJzdGMsICJQcmltaXRpdmVzIik7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBSZW5kZXJTY3JpcHQgcFJTID0gUmVuZGVyU2NyaXB0LmNyZWF0ZSgpOworICAgICAgICBTY3JpcHRDX3ByaW1pdGl2ZXMgcyA9IG5ldyBTY3JpcHRDX3ByaW1pdGl2ZXMocFJTLCBtUmVzLCBSLnJhdy5wcmltaXRpdmVzLCB0cnVlKTsKKyAgICAgICAgcFJTLm1NZXNzYWdlQ2FsbGJhY2sgPSBtUnNNZXNzYWdlOworICAgICAgICBzLmludm9rZV9wcmltaXRpdmVzX3Rlc3QoMCwgMCk7CisgICAgICAgIHBSUy5maW5pc2goKTsKKyAgICAgICAgd2FpdEZvck1lc3NhZ2UoKTsKKyAgICAgICAgcFJTLmRlc3Ryb3koKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9Vbml0VGVzdC5qYXZhIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VuaXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlkODhhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9Vbml0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdC5SU01lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIFVuaXRUZXN0IGV4dGVuZHMgVGhyZWFkIHsKKyAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisgICAgcHVibGljIGludCByZXN1bHQ7CisgICAgcHJpdmF0ZSBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MuSXRlbSBtSXRlbTsKKyAgICBwcml2YXRlIFJTVGVzdENvcmUgbVJTVEM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1zZ0hhbmRsZWQ7CisKKyAgICAvKiBUaGVzZSBjb25zdGFudHMgbXVzdCBtYXRjaCB0aG9zZSBpbiBzaGFyZWQucnNoICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlNfTVNHX1RFU1RfUEFTU0VEID0gMTAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJTX01TR19URVNUX0ZBSUxFRCA9IDEwMTsKKworICAgIHByaXZhdGUgc3RhdGljIGludCBudW1UZXN0cyA9IDA7CisgICAgcHVibGljIGludCB0ZXN0SUQ7CisKKyAgICBwcm90ZWN0ZWQgVW5pdFRlc3QoUlNUZXN0Q29yZSByc3RjLCBTdHJpbmcgbiwgaW50IGluaXRSZXN1bHQpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgbVJTVEMgPSByc3RjOworICAgICAgICBuYW1lID0gbjsKKyAgICAgICAgbXNnSGFuZGxlZCA9IGZhbHNlOworICAgICAgICByZXN1bHQgPSBpbml0UmVzdWx0OworICAgICAgICB0ZXN0SUQgPSBudW1UZXN0cysrOworICAgIH0KKworICAgIHByb3RlY3RlZCBVbml0VGVzdChSU1Rlc3RDb3JlIHJzdGMsIFN0cmluZyBuKSB7CisgICAgICAgIHRoaXMocnN0YywgbiwgMCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFVuaXRUZXN0KFJTVGVzdENvcmUgcnN0YykgeworICAgICAgICB0aGlzIChyc3RjLCAiPFVua25vd24+Iik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFVuaXRUZXN0KCkgeworICAgICAgICB0aGlzIChudWxsKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUlNNZXNzYWdlIG1Sc01lc3NhZ2UgPSBuZXcgUlNNZXNzYWdlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1JRCkgeworICAgICAgICAgICAgICAgIGNhc2UgUlNfTVNHX1RFU1RfUEFTU0VEOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJTX01TR19URVNUX0ZBSUxFRDoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cudigiUmVuZGVyU2NyaXB0IiwgIlVuaXQgdGVzdCBnb3QgdW5leHBlY3RlZCBtZXNzYWdlIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1JdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtSXRlbS5yZXN1bHQgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgbXNnSGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbVJTVEMucmVmcmVzaFRlc3RSZXN1bHRzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgdGhlIGNhc2Ugd2hlcmUgb3VyIG1lc3NhZ2UgcmVjZWl2ZXIgaGFzIGJlZW4KKyAgICAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdGVkLiBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBsZWF2ZSB0aGUgYXBwbGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGl0IGZpbmlzaGVzIHJ1bm5pbmcgYWxsIG9mIHRoZSB1bml0IHRlc3RzLiAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgdm9pZCB3YWl0Rm9yTWVzc2FnZSgpIHsKKyAgICAgICAgd2hpbGUgKCFtc2dIYW5kbGVkKSB7CisgICAgICAgICAgICB5aWVsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SXRlbShTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MuSXRlbSBpdGVtKSB7CisgICAgICAgIG1JdGVtID0gaXRlbTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIC8qIFRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkIGZvciBlYWNoIHN1YmNsYXNzICovCisgICAgICAgIGlmIChtUlNUQyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlNUQy5yZWZyZXNoVGVzdFJlc3VsdHMoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L2ZwX21hZC5ycyBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9mcF9tYWQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZkNzdlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9mcF9tYWQucnMKQEAgLTAsMCArMSwxNzYgQEAKKyNpbmNsdWRlICJzaGFyZWQucnNoIgorCitjb25zdCBpbnQgVEVTVF9DT1VOVCA9IDE7CisKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihnX3Jlc3VsdHMpCisjcHJhZ21hIHJzIGV4cG9ydF9mdW5jKGZwX21hZF90ZXN0KQorCitzdGF0aWMgZmxvYXQgZGF0YV9mMVsxMDI1XTsKK3N0YXRpYyBmbG9hdDQgZGF0YV9mNFsxMDI1XTsKKworc3RhdGljIHZvaWQgdGVzdF9tYWQ0KHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MSBiaWxsaW9uIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqICgxMDAwIC8gODApOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2Y0W2ldID0gKGRhdGFfZjRbaV0gKiAwLjAyZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSsxXSAqIDAuMDRmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzJdICogMC4wNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krM10gKiAwLjFmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzRdICogMC4yZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSs1XSAqIDAuMmYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krNl0gKiAwLjFmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzddICogMC4wNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krOF0gKiAwLjA0ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSs5XSAqIDAuMDJmICsgMS5mKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX21hZDQgTSBvcHMiLCAxMDAwLmYgLyB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9tYWQodWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgZmxvYXQgdG90YWwgPSAwOworICAgIC8vIERvIH4xIGJpbGxpb24gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogKDEwMDAgLyAyMCk7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjFbaV0gPSAoZGF0YV9mMVtpXSAqIDAuMDJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzFdICogMC4wNGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krMl0gKiAwLjA1ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSszXSAqIDAuMWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krNF0gKiAwLjJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzVdICogMC4yZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSs2XSAqIDAuMWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krN10gKiAwLjA1ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSs4XSAqIDAuMDRmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzldICogMC4wMmYgKyAxLmYpOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfbWFkIE0gb3BzIiwgMTAwMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfbm9ybSh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICBmbG9hdCB0b3RhbCA9IDA7CisgICAgLy8gRG8gfjEwIE0gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogMTA7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjRbaV0gPSBub3JtYWxpemUoZGF0YV9mNFtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9ub3JtIE0gb3BzIiwgMTAuZiAvIHRpbWUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3NpbmNvczQodWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgZmxvYXQgdG90YWwgPSAwOworICAgIC8vIERvIH4xMCBNIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqIDEwIC8gNDsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mNFtpXSA9IHNpbihkYXRhX2Y0W2ldKSAqIGNvcyhkYXRhX2Y0W2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX3NpbmNvczQgTSBvcHMiLCAxMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2luY29zKHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MTAgTSBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAxMDsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mMVtpXSA9IHNpbihkYXRhX2YxW2ldKSAqIGNvcyhkYXRhX2YxW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX3NpbmNvcyBNIG9wcyIsIDEwLmYgLyB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9jbGFtcCh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICAvLyBEbyB+MTAwIE0gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogMTAwOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2YxW2ldID0gY2xhbXAoZGF0YV9mMVtpXSwgLTEuZiwgMS5mKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX2NsYW1wIE0gb3BzIiwgMTAwLmYgLyB0aW1lKTsKKworICAgIHN0YXJ0KCk7CisgICAgLy8gRG8gfjEwMCBNIG9wcworICAgIGZvciAoY3Q9MDsgY3QgPCAxMDAwICogMTAwOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZGF0YV9mMVtpXSA8IC0xLmYpIGRhdGFfZjFbaV0gPSAtMS5mOworICAgICAgICAgICAgaWYgKGRhdGFfZjFbaV0gPiAtMS5mKSBkYXRhX2YxW2ldID0gMS5mOworICAgICAgICB9CisgICAgfQorCisgICAgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfY2xhbXAgcmVmIE0gb3BzIiwgMTAwLmYgLyB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9jbGFtcDQodWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgZmxvYXQgdG90YWwgPSAwOworICAgIC8vIERvIH4xMDAgTSBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAxMDAgLzQ7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjRbaV0gPSBjbGFtcChkYXRhX2Y0W2ldLCAtMS5mLCAxLmYpOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfY2xhbXA0IE0gb3BzIiwgMTAwLmYgLyB0aW1lKTsKK30KKwordm9pZCBmcF9tYWRfdGVzdCh1aW50MzJfdCBpbmRleCwgaW50IHRlc3RfbnVtKSB7CisgICAgZm9yIChpbnQgeD0wOyB4IDwgMTAyNTsgeCsrKSB7CisgICAgICAgIGRhdGFfZjFbeF0gPSAoeCAmIDB4ZikgKiAwLjFmOworICAgICAgICBkYXRhX2Y0W3hdLnggPSAoeCAmIDB4ZikgKiAwLjFmOworICAgICAgICBkYXRhX2Y0W3hdLnkgPSAoeCAmIDB4ZjApICogMC4xZjsKKyAgICAgICAgZGF0YV9mNFt4XS56ID0gKHggJiAweDMzKSAqIDAuMWY7CisgICAgICAgIGRhdGFfZjRbeF0udyA9ICh4ICYgMHg3NykgKiAwLjFmOworICAgIH0KKworICAgIHRlc3RfbWFkNChpbmRleCk7CisgICAgdGVzdF9tYWQoaW5kZXgpOworCisgICAgZm9yICh4PTA7IHggPCAxMDI1OyB4KyspIHsKKyAgICAgICAgZGF0YV9mMVt4XSA9ICh4ICYgMHhmKSAqIDAuMWYgKyAxLmY7CisgICAgICAgIGRhdGFfZjRbeF0ueCA9ICh4ICYgMHhmKSAqIDAuMWYgKyAxLmY7CisgICAgICAgIGRhdGFfZjRbeF0ueSA9ICh4ICYgMHhmMCkgKiAwLjFmICsgMS5mOworICAgICAgICBkYXRhX2Y0W3hdLnogPSAoeCAmIDB4MzMpICogMC4xZiArIDEuZjsKKyAgICAgICAgZGF0YV9mNFt4XS53ID0gKHggJiAweDc3KSAqIDAuMWYgKyAxLmY7CisgICAgfQorCisgICAgdGVzdF9ub3JtKGluZGV4KTsKKyAgICB0ZXN0X3NpbmNvczQoaW5kZXgpOworICAgIHRlc3Rfc2luY29zKGluZGV4KTsKKyAgICB0ZXN0X2NsYW1wNChpbmRleCk7CisgICAgdGVzdF9jbGFtcChpbmRleCk7CisKKyAgICAvLyBUT0RPIEFjdHVhbGx5IHZlcmlmeSB0ZXN0IHJlc3VsdCBhY2N1cmFjeQorICAgIHJzRGVidWcoImZwX21hZF90ZXN0IFBBU1NFRCIsIDApOworICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfUEFTU0VEKTsKK30KKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcHJpbWl0aXZlcy5ycyBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9wcmltaXRpdmVzLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMTJiY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcHJpbWl0aXZlcy5ycwpAQCAtMCwwICsxLDUxIEBACisjaW5jbHVkZSAic2hhcmVkLnJzaCIKKworI3ByYWdtYSBycyBleHBvcnRfZnVuYyhwcmltaXRpdmVzX3Rlc3QpCisKKy8vIFRlc3RpbmcgcHJpbWl0aXZlIHR5cGVzCitzdGF0aWMgZmxvYXQgZmxvYXRUZXN0ID0gMS45OWY7CitzdGF0aWMgZG91YmxlIGRvdWJsZVRlc3QgPSAyLjA1Oworc3RhdGljIGNoYXIgY2hhclRlc3QgPSAtODsKK3N0YXRpYyBzaG9ydCBzaG9ydFRlc3QgPSAtMTY7CitzdGF0aWMgaW50IGludFRlc3QgPSAtMzI7CitzdGF0aWMgdWNoYXIgdWNoYXJUZXN0ID0gODsKK3N0YXRpYyB1c2hvcnQgdXNob3J0VGVzdCA9IDE2Oworc3RhdGljIHVpbnQgdWludFRlc3QgPSAzMjsKKworc3RhdGljIGJvb2wgdGVzdF9wcmltaXRpdmVfdHlwZXModWludDMyX3QgaW5kZXgpIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIHN0YXJ0KCk7CisKKyAgICBfUlNfQVNTRVJUKGZsb2F0VGVzdCA9PSAxLjk5Zik7CisgICAgX1JTX0FTU0VSVChkb3VibGVUZXN0ID09IDIuMDUpOworICAgIF9SU19BU1NFUlQoY2hhclRlc3QgPT0gLTgpOworICAgIF9SU19BU1NFUlQoc2hvcnRUZXN0ID09IC0xNik7CisgICAgX1JTX0FTU0VSVChpbnRUZXN0ID09IC0zMik7CisgICAgX1JTX0FTU0VSVCh1Y2hhclRlc3QgPT0gOCk7CisgICAgX1JTX0FTU0VSVCh1c2hvcnRUZXN0ID09IDE2KTsKKyAgICBfUlNfQVNTRVJUKHVpbnRUZXN0ID09IDMyKTsKKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X3ByaW1pdGl2ZXMgRkFJTEVEIiwgdGltZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X3ByaW1pdGl2ZXMgUEFTU0VEIiwgdGltZSk7CisgICAgfQorCisgICAgcmV0dXJuIGZhaWxlZDsKK30KKwordm9pZCBwcmltaXRpdmVzX3Rlc3QodWludDMyX3QgaW5kZXgsIGludCB0ZXN0X251bSkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgZmFpbGVkIHw9IHRlc3RfcHJpbWl0aXZlX3R5cGVzKGluZGV4KTsKKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhSU19NU0dfVEVTVF9GQUlMRUQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhSU19NU0dfVEVTVF9QQVNTRUQpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3JzbGlzdC5ycyBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc2xpc3QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVmMGY2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc2xpc3QucnMKQEAgLTAsMCArMSwxMDkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5ycy50ZXN0KQorCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorCitmbG9hdCBnRFk7CisKK3JzX2ZvbnQgZ0ZvbnQ7CisKK3R5cGVkZWYgc3RydWN0IExpc3RBbGxvY3NfcyB7CisgICAgcnNfYWxsb2NhdGlvbiB0ZXh0OworICAgIGludCByZXN1bHQ7Cit9IExpc3RBbGxvY3M7CisKK0xpc3RBbGxvY3MgKmdMaXN0OworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ0RZLCBnRm9udCwgZ0xpc3QpCisKK3ZvaWQgaW5pdCgpIHsKKyAgICBnRFkgPSAwLjBmOworfQorCitpbnQgdGV4dFBvcyA9IDA7CisKK2ludCByb290KGludCBsYXVuY2hJRCkgeworCisgICAgcnNnQ2xlYXJDb2xvcigwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKyAgICByc2dDbGVhckRlcHRoKDEuMGYpOworCisgICAgdGV4dFBvcyAtPSAoaW50KWdEWSoyOworICAgIGdEWSAqPSAwLjk1OworCisgICAgcnNnRm9udENvbG9yKDAuOWYsIDAuOWYsIDAuOWYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250KTsKKyAgICBjb2xvcigwLjIsIDAuMiwgMC4yLCAwKTsKKworICAgIHJzX2FsbG9jYXRpb24gbGlzdEFsbG9jID0gcnNHZXRBbGxvY2F0aW9uKGdMaXN0KTsKKyAgICBpbnQgYWxsb2NTaXplID0gcnNBbGxvY2F0aW9uR2V0RGltWChsaXN0QWxsb2MpOworCisgICAgaW50IHdpZHRoID0gcnNnR2V0V2lkdGgoKTsKKyAgICBpbnQgaGVpZ2h0ID0gcnNnR2V0SGVpZ2h0KCk7CisKKyAgICBpbnQgaXRlbUhlaWdodCA9IDgwOworICAgIGludCB0b3RhbEl0ZW1IZWlnaHQgPSBpdGVtSGVpZ2h0ICogYWxsb2NTaXplOworCisgICAgLyogUHJldmVudCBzY3JvbGxpbmcgYWJvdmUgdGhlIHRvcCBvZiB0aGUgbGlzdCAqLworICAgIGludCBmaXJzdEl0ZW0gPSBoZWlnaHQgLSB0b3RhbEl0ZW1IZWlnaHQ7CisgICAgaWYgKGZpcnN0SXRlbSA8IDApIHsKKyAgICAgICAgZmlyc3RJdGVtID0gMDsKKyAgICB9CisKKyAgICAvKiBQcmV2ZW50IHNjcm9sbGluZyBwYXN0IHRoZSBsYXN0IGxpbmUgb2YgdGhlIGxpc3QgKi8KKyAgICBpbnQgbGFzdEl0ZW0gPSAtMSAqICh0b3RhbEl0ZW1IZWlnaHQgLSBoZWlnaHQpOworICAgIGlmIChsYXN0SXRlbSA+IDApIHsKKyAgICAgICAgbGFzdEl0ZW0gPSAwOworICAgIH0KKworICAgIGlmICh0ZXh0UG9zID4gZmlyc3RJdGVtKSB7CisgICAgICAgIHRleHRQb3MgPSBmaXJzdEl0ZW07CisgICAgfQorICAgIGVsc2UgaWYgKHRleHRQb3MgPCBsYXN0SXRlbSkgeworICAgICAgICB0ZXh0UG9zID0gbGFzdEl0ZW07CisgICAgfQorCisgICAgaW50IGN1cnJlbnRZUG9zID0gaXRlbUhlaWdodCArIHRleHRQb3M7CisKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgYWxsb2NTaXplOyBpICsrKSB7CisgICAgICAgIGlmKGN1cnJlbnRZUG9zIC0gaXRlbUhlaWdodCA+IGhlaWdodCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZihjdXJyZW50WVBvcyA+IDApIHsKKyAgICAgICAgICAgIHN3aXRjaChnTGlzdFtpXS5yZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IC8qIFBhc3NlZCAqLworICAgICAgICAgICAgICAgICAgICByc2dGb250Q29sb3IoMC41ZiwgMC45ZiwgMC41ZiwgMS4wZik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgLTE6IC8qIEZhaWxlZCAqLworICAgICAgICAgICAgICAgICAgICByc2dGb250Q29sb3IoMC45ZiwgMC41ZiwgMC41ZiwgMS4wZik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMDogLyogU3RpbGwgVGVzdGluZyAqLworICAgICAgICAgICAgICAgICAgICByc2dGb250Q29sb3IoMC45ZiwgMC45ZiwgMC41ZiwgMS4wZik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8qIFVua25vd24gKi8KKyAgICAgICAgICAgICAgICAgICAgcnNnRm9udENvbG9yKDAuOWYsIDAuOWYsIDAuOWYsIDEuMGYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJzZ0RyYXdSZWN0KDAsIGN1cnJlbnRZUG9zIC0gMSwgd2lkdGgsIGN1cnJlbnRZUG9zLCAwKTsKKyAgICAgICAgICAgIHJzZ0RyYXdUZXh0KGdMaXN0W2ldLnRleHQsIDMwLCBjdXJyZW50WVBvcyAtIDMyKTsKKyAgICAgICAgfQorICAgICAgICBjdXJyZW50WVBvcyArPSBpdGVtSGVpZ2h0OworICAgIH0KKworICAgIHJldHVybiAxMDsKK30KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9zaGFyZWQucnNoIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3NoYXJlZC5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIwZmZmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9zaGFyZWQucnNoCkBAIC0wLDAgKzEsMzggQEAKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLnJzLnRlc3QpCisKK3R5cGVkZWYgc3RydWN0IFRlc3RSZXN1bHRfcyB7CisgICAgcnNfYWxsb2NhdGlvbiBuYW1lOworICAgIGJvb2wgcGFzczsKKyAgICBmbG9hdCBzY29yZTsKKyAgICBpbnQ2NF90IHRpbWU7Cit9IFRlc3RSZXN1bHQ7CitUZXN0UmVzdWx0ICpnX3Jlc3VsdHM7CisKK3N0YXRpYyBpbnQ2NF90IGdfdGltZTsKKworc3RhdGljIHZvaWQgc3RhcnQodm9pZCkgeworICAgIGdfdGltZSA9IHJzVXB0aW1lTWlsbGlzKCk7Cit9CisKK3N0YXRpYyBmbG9hdCBlbmQodWludDMyX3QgaWR4KSB7CisgICAgaW50NjRfdCB0ID0gcnNVcHRpbWVNaWxsaXMoKSAtIGdfdGltZTsKKyAgICAvL2dfcmVzdWx0c1tpZHhdLnRpbWUgPSB0OworICAgIC8vcnNEZWJ1ZygidGVzdCB0aW1lIiwgKGludCl0KTsKKyAgICByZXR1cm4gKChmbG9hdCl0KSAvIDEwMDAuZjsKK30KKworI2RlZmluZSBfUlNfQVNTRVJUKGIpIFwKK2RvIHsgXAorICAgIGlmICghKGIpKSB7IFwKKyAgICAgICAgZmFpbGVkID0gdHJ1ZTsgXAorICAgICAgICByc0RlYnVnKCNiICIgRkFJTEVEIiwgMCk7IFwKKyAgICB9IFwKK1wKK30gd2hpbGUgKDApCisKKy8qIFRoZXNlIGNvbnN0YW50cyBtdXN0IG1hdGNoIHRob3NlIGluIFVuaXRUZXN0LmphdmEgKi8KK3N0YXRpYyBjb25zdCBpbnQgUlNfTVNHX1RFU1RfUEFTU0VEID0gMTAwOworc3RhdGljIGNvbnN0IGludCBSU19NU0dfVEVTVF9GQUlMRUQgPSAxMDE7CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC90ZXN0X3Jvb3QucnMgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvdGVzdF9yb290LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYjM5MWRkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3Rlc3Rfcm9vdC5ycwpAQCAtMCwwICsxLDI2IEBACisvLyBGb3VudGFpbiB0ZXN0IHNjcmlwdAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQucnMudGVzdCkKKworI3ByYWdtYSBzdGF0ZUZyYWdtZW50KHBhcmVudCkKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKworCit0eXBlZGVmIHN0cnVjdCBUZXN0UmVzdWx0IHsKKyAgICByc19hbGxvY2F0aW9uIG5hbWU7CisgICAgYm9vbCBwYXNzOworICAgIGZsb2F0IHNjb3JlOworfSBUZXN0UmVzdWx0X3Q7CitUZXN0UmVzdWx0X3QgKnJlc3VsdHM7CisKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihyZXN1bHRzKQorLy8jcHJhZ21hIHJzIGV4cG9ydF9mdW5jKGFkZFBhcnRpY2xlcykKKworaW50IHJvb3QoKSB7CisKKyAgICByZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzLnNwZWMgYi9saWJzL3JzL3JzLnNwZWMKaW5kZXggNWFlOGQwMS4uMGRhNjM3ZSAxMDA2NDQKLS0tIGEvbGlicy9ycy9ycy5zcGVjCisrKyBiL2xpYnMvcnMvcnMuc3BlYwpAQCAtMSwxMSArMSwxNCBAQAogCitDb250ZXh0RmluaXNoIHsKKwloYW5kY29kZUFwaQorCX0KIAogQ29udGV4dEJpbmRSb290U2NyaXB0IHsKIAlwYXJhbSBSc1NjcmlwdCBzYW1wbGVyCiAJfQogCi1Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlIHsKLQlwYXJhbSBSc1Byb2dyYW1GcmFnbWVudFN0b3JlIHBnbQorQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUgeworCXBhcmFtIFJzUHJvZ3JhbVN0b3JlIHBnbQogCX0KIAogQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQgewpAQCAtMjAsNiArMjMsMTAgQEAKIAlwYXJhbSBSc1Byb2dyYW1SYXN0ZXIgcGdtCiAJfQogCitDb250ZXh0QmluZEZvbnQgeworCXBhcmFtIFJzRm9udCBwZ20KKwl9CisKIENvbnRleHRQYXVzZSB7CiAJfQogCkBAIC01MSw2ICs1OCwxMSBAQAogCXBhcmFtIHNpemVfdCBsZW4KIAl9CiAKK0dldE5hbWUgeworCXBhcmFtIHZvaWQgKm9iagorCXBhcmFtIGNvbnN0IGNoYXIgKipuYW1lCisJfQorCiBPYmpEZXN0cm95IHsKIAlwYXJhbSB2b2lkICpvYmoKIAl9CkBAIC02OCw5ICs4MCwyMyBAQAogCXBhcmFtIGNvbnN0IFJzRWxlbWVudCAqIGVsZW1lbnRzCiAJcGFyYW0gY29uc3QgY2hhciAqKiBuYW1lcwogCXBhcmFtIGNvbnN0IHNpemVfdCAqIG5hbWVMZW5ndGhzCisJcGFyYW0gY29uc3QgdWludDMyX3QgKiBhcnJheVNpemUKIAlyZXQgUnNFbGVtZW50CiAJfQogCitFbGVtZW50R2V0TmF0aXZlRGF0YSB7CisJcGFyYW0gUnNFbGVtZW50IGVsZW0KKwlwYXJhbSB1aW50MzJfdCAqZWxlbURhdGEKKwlwYXJhbSB1aW50MzJfdCBlbGVtRGF0YVNpemUKKwl9CisKK0VsZW1lbnRHZXRTdWJFbGVtZW50cyB7CisJcGFyYW0gUnNFbGVtZW50IGVsZW0KKwlwYXJhbSB1aW50MzJfdCAqaWRzCisJcGFyYW0gY29uc3QgY2hhciAqKm5hbWVzCisJcGFyYW0gdWludDMyX3QgZGF0YVNpemUKKwl9CisKIFR5cGVCZWdpbiB7CiAJcGFyYW0gUnNFbGVtZW50IHR5cGUKIAl9CkBAIC04NCw2ICsxMTAsMTIgQEAKIAlyZXQgUnNUeXBlCiAJfQogCitUeXBlR2V0TmF0aXZlRGF0YSB7CisJcGFyYW0gUnNUeXBlIHR5cGUKKwlwYXJhbSB1aW50MzJfdCAqIHR5cGVEYXRhCisJcGFyYW0gdWludDMyX3QgdHlwZURhdGFTaXplCisJfQorCiBBbGxvY2F0aW9uQ3JlYXRlVHlwZWQgewogCXBhcmFtIFJzVHlwZSB0eXBlCiAJcmV0IFJzQWxsb2NhdGlvbgpAQCAtMTUzLDYgKzE4NSwxNiBAQAogCXRvZ2dsZVBsYXkKIAl9CiAKK0FsbG9jYXRpb24xRFN1YkVsZW1lbnREYXRhIHsKKwlwYXJhbSBSc0FsbG9jYXRpb24gdmEKKwlwYXJhbSB1aW50MzJfdCB4CisJcGFyYW0gY29uc3Qgdm9pZCAqZGF0YQorCXBhcmFtIHVpbnQzMl90IGNvbXBfb2Zmc2V0CisJcGFyYW0gdWludDMyX3QgYnl0ZXMKKwloYW5kY29kZUFwaQorCXRvZ2dsZVBsYXkKKwl9CisKIEFsbG9jYXRpb24yRFN1YkRhdGEgewogCXBhcmFtIFJzQWxsb2NhdGlvbiB2YQogCXBhcmFtIHVpbnQzMl90IHhvZmYKQEAgLTE2Myw2ICsyMDUsMTUgQEAKIAlwYXJhbSB1aW50MzJfdCBieXRlcwogCX0KIAorQWxsb2NhdGlvbjJEU3ViRWxlbWVudERhdGEgeworCXBhcmFtIFJzQWxsb2NhdGlvbiB2YQorCXBhcmFtIHVpbnQzMl90IHgKKwlwYXJhbSB1aW50MzJfdCB5CisJcGFyYW0gY29uc3Qgdm9pZCAqZGF0YQorCXBhcmFtIHVpbnQzMl90IGVsZW1lbnRfb2Zmc2V0CisJcGFyYW0gdWludDMyX3QgYnl0ZXMKKwl9CisKIEFsbG9jYXRpb25SZWFkIHsKIAlwYXJhbSBSc0FsbG9jYXRpb24gdmEKIAlwYXJhbSB2b2lkICogZGF0YQpAQCAtMjI0LDYgKzI3NSwyMiBAQAogCXBhcmFtIGNvbnN0IHZvaWQgKmRhdGEKIAl9CiAKK0FsbG9jYXRpb25HZXRUeXBlIHsKKwlwYXJhbSBSc0FsbG9jYXRpb24gdmEKKwlyZXQgY29uc3Qgdm9pZCoKKwl9CisKK0FsbG9jYXRpb25SZXNpemUxRCB7CisJcGFyYW0gUnNBbGxvY2F0aW9uIHZhCisJcGFyYW0gdWludDMyX3QgZGltWAorCX0KKworQWxsb2NhdGlvblJlc2l6ZTJEIHsKKwlwYXJhbSBSc0FsbG9jYXRpb24gdmEKKwlwYXJhbSB1aW50MzJfdCBkaW1YCisJcGFyYW0gdWludDMyX3QgZGltWQorCX0KKwogU2FtcGxlckJlZ2luIHsKIAl9CiAKQEAgLTIzMiw2ICsyOTksMTEgQEAKIAlwYXJhbSBSc1NhbXBsZXJWYWx1ZSB2YWx1ZQogCX0KIAorU2FtcGxlclNldDIgeworCXBhcmFtIFJzU2FtcGxlclBhcmFtIHAKKwlwYXJhbSBmbG9hdCB2YWx1ZQorCX0KKwogU2FtcGxlckNyZWF0ZSB7CiAJcmV0IFJzU2FtcGxlcgogCX0KQEAgLTI0OCwxMyArMzIwLDYgQEAKIFNjcmlwdENCZWdpbiB7CiAJfQogCi1TY3JpcHRTZXRDbGVhckNvbG9yIHsKLQlwYXJhbSBSc1NjcmlwdCBzCi0JcGFyYW0gZmxvYXQgcgotCXBhcmFtIGZsb2F0IGcKLQlwYXJhbSBmbG9hdCBiCi0JcGFyYW0gZmxvYXQgYQotCX0KIAogU2NyaXB0U2V0VGltZVpvbmUgewogCXBhcmFtIFJzU2NyaXB0IHMKQEAgLTI2Miw0MyArMzI3LDQ5IEBACiAJcGFyYW0gdWludDMyX3QgbGVuZ3RoCiAJfQogCi1TY3JpcHRTZXRDbGVhckRlcHRoIHsKLQlwYXJhbSBSc1NjcmlwdCBzCi0JcGFyYW0gZmxvYXQgZGVwdGgKLQl9Ci0KLVNjcmlwdFNldENsZWFyU3RlbmNpbCB7Ci0JcGFyYW0gUnNTY3JpcHQgcwotCXBhcmFtIHVpbnQzMl90IHN0ZW5jaWwKLQl9Ci0KLVNjcmlwdFNldFR5cGUgewotCXBhcmFtIFJzVHlwZSB0eXBlCi0JcGFyYW0gdWludDMyX3Qgc2xvdAotCXBhcmFtIGJvb2wgaXNXcml0YWJsZQotCXBhcmFtIGNvbnN0IGNoYXIgKiBuYW1lCi0JfQotCi1TY3JpcHRTZXRJbnZva2UgewotCXBhcmFtIGNvbnN0IGNoYXIgKiBuYW1lCi0JcGFyYW0gdWludDMyX3Qgc2xvdAotCX0KIAogU2NyaXB0SW52b2tlIHsKIAlwYXJhbSBSc1NjcmlwdCBzCiAJcGFyYW0gdWludDMyX3Qgc2xvdAogCX0KIAotU2NyaXB0U2V0Um9vdCB7Ci0JcGFyYW0gYm9vbCBpc1Jvb3QKK1NjcmlwdEludm9rZVYgeworCXBhcmFtIFJzU2NyaXB0IHMKKwlwYXJhbSB1aW50MzJfdCBzbG90CisJcGFyYW0gY29uc3Qgdm9pZCAqIGRhdGEKKwlwYXJhbSB1aW50MzJfdCBkYXRhTGVuCisJaGFuZGNvZGVBcGkKKwl0b2dnbGVQbGF5CiAJfQogCi0KLQotU2NyaXB0Q1NldFNjcmlwdCB7Ci0JcGFyYW0gdm9pZCAqIGNvZGVQdHIKK1NjcmlwdFNldFZhckkgeworCXBhcmFtIFJzU2NyaXB0IHMKKwlwYXJhbSB1aW50MzJfdCBzbG90CisJcGFyYW0gaW50IHZhbHVlCiAJfQogCitTY3JpcHRTZXRWYXJGIHsKKwlwYXJhbSBSc1NjcmlwdCBzCisJcGFyYW0gdWludDMyX3Qgc2xvdAorCXBhcmFtIGZsb2F0IHZhbHVlCisJfQorCitTY3JpcHRTZXRWYXJEIHsKKwlwYXJhbSBSc1NjcmlwdCBzCisJcGFyYW0gdWludDMyX3Qgc2xvdAorCXBhcmFtIGRvdWJsZSB2YWx1ZQorCX0KKworU2NyaXB0U2V0VmFyViB7CisJcGFyYW0gUnNTY3JpcHQgcworCXBhcmFtIHVpbnQzMl90IHNsb3QKKwlwYXJhbSBjb25zdCB2b2lkICogZGF0YQorCXBhcmFtIHVpbnQzMl90IGRhdGFMZW4KKwloYW5kY29kZUFwaQorCXRvZ2dsZVBsYXkKKwl9CisKKwogU2NyaXB0Q1NldFRleHQgewogCXBhcmFtIGNvbnN0IGNoYXIgKiB0ZXh0CiAJcGFyYW0gdWludDMyX3QgbGVuZ3RoCkBAIC0zMDgsNTIgKzM3OSw0MSBAQAogCXJldCBSc1NjcmlwdAogCX0KIAotU2NyaXB0Q1NldERlZmluZUYgewotICAgIHBhcmFtIGNvbnN0IGNoYXIqIG5hbWUKLSAgICBwYXJhbSBmbG9hdCB2YWx1ZQotICAgIH0KIAotU2NyaXB0Q1NldERlZmluZUkzMiB7Ci0gICAgcGFyYW0gY29uc3QgY2hhciogbmFtZQotICAgIHBhcmFtIGludDMyX3QgdmFsdWUKLSAgICB9Ci0KLVByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4geworUHJvZ3JhbVN0b3JlQmVnaW4gewogCXBhcmFtIFJzRWxlbWVudCBpbgogCXBhcmFtIFJzRWxlbWVudCBvdXQKIAl9CiAKLVByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrIHsKK1Byb2dyYW1TdG9yZUNvbG9yTWFzayB7CiAJcGFyYW0gYm9vbCByCiAJcGFyYW0gYm9vbCBnCiAJcGFyYW0gYm9vbCBiCiAJcGFyYW0gYm9vbCBhCiAJfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyB7CitQcm9ncmFtU3RvcmVCbGVuZEZ1bmMgewogCXBhcmFtIFJzQmxlbmRTcmNGdW5jIHNyY0Z1bmMKIAlwYXJhbSBSc0JsZW5kRHN0RnVuYyBkZXN0RnVuYwogCX0KIAotUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2sgeworUHJvZ3JhbVN0b3JlRGVwdGhNYXNrIHsKIAlwYXJhbSBib29sIGVuYWJsZQogfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlciB7CitQcm9ncmFtU3RvcmVEaXRoZXIgewogCXBhcmFtIGJvb2wgZW5hYmxlCiB9CiAKLVByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jIHsKK1Byb2dyYW1TdG9yZURlcHRoRnVuYyB7CiAJcGFyYW0gUnNEZXB0aEZ1bmMgZnVuYwogfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZSB7Ci0JcmV0IFJzUHJvZ3JhbUZyYWdtZW50U3RvcmUKK1Byb2dyYW1TdG9yZUNyZWF0ZSB7CisJcmV0IFJzUHJvZ3JhbVN0b3JlCiAJfQogCiBQcm9ncmFtUmFzdGVyQ3JlYXRlIHsKLQlwYXJhbSBSc0VsZW1lbnQgaW4KLQlwYXJhbSBSc0VsZW1lbnQgb3V0CiAJcGFyYW0gYm9vbCBwb2ludFNtb290aAogCXBhcmFtIGJvb2wgbGluZVNtb290aAogCXBhcmFtIGJvb2wgcG9pbnRTcHJpdGUKQEAgLTM2NSwxMiArNDI1LDExIEBACiAJcGFyYW0gZmxvYXQgbHcKIH0KIAotUHJvZ3JhbVJhc3RlclNldFBvaW50U2l6ZXsKK1Byb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZSB7CiAJcGFyYW0gUnNQcm9ncmFtUmFzdGVyIHByCi0JcGFyYW0gZmxvYXQgcHMKKwlwYXJhbSBSc0N1bGxNb2RlIG1vZGUKIH0KIAotCiBQcm9ncmFtQmluZENvbnN0YW50cyB7CiAJcGFyYW0gUnNQcm9ncmFtIHZwCiAJcGFyYW0gdWludDMyX3Qgc2xvdApAQCAtMzkxLDEyICs0NTAsNiBAQAogCX0KIAogUHJvZ3JhbUZyYWdtZW50Q3JlYXRlIHsKLQlwYXJhbSBjb25zdCB1aW50MzJfdCAqIHBhcmFtcwotCXBhcmFtIHVpbnQzMl90IHBhcmFtTGVuZ3RoCi0JcmV0IFJzUHJvZ3JhbUZyYWdtZW50Ci0JfQotCi1Qcm9ncmFtRnJhZ21lbnRDcmVhdGUyIHsKIAlwYXJhbSBjb25zdCBjaGFyICogc2hhZGVyVGV4dAogCXBhcmFtIHVpbnQzMl90IHNoYWRlckxlbmd0aAogCXBhcmFtIGNvbnN0IHVpbnQzMl90ICogcGFyYW1zCkBAIC00MDUsMTEgKzQ1OCw2IEBACiAJfQogCiBQcm9ncmFtVmVydGV4Q3JlYXRlIHsKLQlwYXJhbSBib29sIHRleE1hdAotCXJldCBSc1Byb2dyYW1WZXJ0ZXgKLQl9Ci0KLVByb2dyYW1WZXJ0ZXhDcmVhdGUyIHsKIAlwYXJhbSBjb25zdCBjaGFyICogc2hhZGVyVGV4dAogCXBhcmFtIHVpbnQzMl90IHNoYWRlckxlbmd0aAogCXBhcmFtIGNvbnN0IHVpbnQzMl90ICogcGFyYW1zCkBAIC00MTcsMzQgKzQ2NSwxMCBAQAogCXJldCBSc1Byb2dyYW1WZXJ0ZXgKIAl9CiAKLUxpZ2h0QmVnaW4gewotCX0KLQotTGlnaHRTZXRMb2NhbCB7Ci0JcGFyYW0gYm9vbCBpc0xvY2FsCi0JfQotCi1MaWdodFNldE1vbm9jaHJvbWF0aWMgewotCXBhcmFtIGJvb2wgaXNNb25vCi0JfQotCi1MaWdodENyZWF0ZSB7Ci0JcmV0IFJzTGlnaHQgbGlnaHQKLQl9Ci0KLQotTGlnaHRTZXRQb3NpdGlvbiB7Ci0JcGFyYW0gUnNMaWdodCBsaWdodAotCXBhcmFtIGZsb2F0IHgKLQlwYXJhbSBmbG9hdCB5Ci0JcGFyYW0gZmxvYXQgegotCX0KLQotTGlnaHRTZXRDb2xvciB7Ci0JcGFyYW0gUnNMaWdodCBsaWdodAotCXBhcmFtIGZsb2F0IHIKLQlwYXJhbSBmbG9hdCBnCi0JcGFyYW0gZmxvYXQgYgorRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbSB7CisJcGFyYW0gY29uc3Qgdm9pZCAqIGRhdGEKKwlwYXJhbSBzaXplX3QgbGVuCisJcmV0IFJzRmlsZQogCX0KIAogRmlsZU9wZW4gewpAQCAtNDUzLDMwICs0NzcsNzkgQEAKIAlwYXJhbSBzaXplX3QgbGVuCiAJfQogCitGaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzIHsKKwlwYXJhbSBpbnQzMl90ICogbnVtRW50cmllcworCXBhcmFtIFJzRmlsZSBmaWxlCisJfQogCi1TaW1wbGVNZXNoQ3JlYXRlIHsKLQlyZXQgUnNTaW1wbGVNZXNoCi0JcGFyYW0gUnNBbGxvY2F0aW9uIHByaW0KLQlwYXJhbSBSc0FsbG9jYXRpb24gaW5kZXgKLQlwYXJhbSBSc0FsbG9jYXRpb24gKnZ0eAorRmlsZUEzREdldEluZGV4RW50cmllcyB7CisJcGFyYW0gUnNGaWxlSW5kZXhFbnRyeSAqIGZpbGVFbnRyaWVzCisJcGFyYW0gdWludDMyX3QgbnVtRW50cmllcworCXBhcmFtIFJzRmlsZSBmaWxlQTNECisJfQorCitGaWxlQTNER2V0RW50cnlCeUluZGV4IHsKKwlwYXJhbSB1aW50MzJfdCBpbmRleAorCXBhcmFtIFJzRmlsZSBmaWxlCisJcmV0IFJzT2JqZWN0QmFzZQorCX0KKworRm9udENyZWF0ZUZyb21GaWxlIHsKKwlwYXJhbSBjb25zdCBjaGFyICpuYW1lCisJcGFyYW0gdWludDMyX3QgZm9udFNpemUKKwlwYXJhbSB1aW50MzJfdCBkcGkKKwlyZXQgUnNGb250CisJfQorCitNZXNoQ3JlYXRlIHsKKwlyZXQgUnNNZXNoCiAJcGFyYW0gdWludDMyX3QgdnR4Q291bnQKLQlwYXJhbSB1aW50MzJfdCBwcmltVHlwZQorCXBhcmFtIHVpbnQzMl90IGlkeENvdW50CiAJfQogCi0KLVNpbXBsZU1lc2hCaW5kSW5kZXggewotCXBhcmFtIFJzU2ltcGxlTWVzaCBtZXNoCitNZXNoQmluZEluZGV4IHsKKwlwYXJhbSBSc01lc2ggbWVzaAogCXBhcmFtIFJzQWxsb2NhdGlvbiBpZHgKKwlwYXJhbSB1aW50MzJfdCBwcmltVHlwZQorCXBhcmFtIHVpbnQzMl90IHNsb3QKIAl9CiAKLVNpbXBsZU1lc2hCaW5kUHJpbWl0aXZlIHsKLQlwYXJhbSBSc1NpbXBsZU1lc2ggbWVzaAotCXBhcmFtIFJzQWxsb2NhdGlvbiBwcmltCi0JfQotCi1TaW1wbGVNZXNoQmluZFZlcnRleCB7Ci0JcGFyYW0gUnNTaW1wbGVNZXNoIG1lc2gKK01lc2hCaW5kVmVydGV4IHsKKwlwYXJhbSBSc01lc2ggbWVzaAogCXBhcmFtIFJzQWxsb2NhdGlvbiB2dHgKIAlwYXJhbSB1aW50MzJfdCBzbG90CiAJfQogCitNZXNoR2V0VmVydGV4QnVmZmVyQ291bnQgeworCXBhcmFtIFJzTWVzaCBtZXNoCisJcGFyYW0gaW50MzJfdCAqbnVtVnR4CisJfQorCitNZXNoR2V0SW5kZXhDb3VudCB7CisJcGFyYW0gUnNNZXNoIG1lc2gKKwlwYXJhbSBpbnQzMl90ICpudW1JZHgKKwl9CisKK01lc2hHZXRWZXJ0aWNlcyB7CisJcGFyYW0gUnNNZXNoIG12CisJcGFyYW0gUnNBbGxvY2F0aW9uICp2dHhEYXRhCisJcGFyYW0gdWludDMyX3QgdnR4RGF0YUNvdW50CisJfQorCitNZXNoR2V0SW5kaWNlcyB7CisJcGFyYW0gUnNNZXNoIG12CisJcGFyYW0gUnNBbGxvY2F0aW9uICp2YQorCXBhcmFtIHVpbnQzMl90ICpwcmltVHlwZQorCXBhcmFtIHVpbnQzMl90IGlkeERhdGFDb3VudAorCX0KKworQW5pbWF0aW9uQ3JlYXRlIHsKKwlwYXJhbSBjb25zdCBmbG9hdCAqaW5WYWx1ZXMKKwlwYXJhbSBjb25zdCBmbG9hdCAqb3V0VmFsdWVzCisJcGFyYW0gdWludDMyX3QgdmFsdWVDb3VudAorCXBhcmFtIFJzQW5pbWF0aW9uSW50ZXJwb2xhdGlvbiBpbnRlcnAKKwlwYXJhbSBSc0FuaW1hdGlvbkVkZ2UgcHJlCisJcGFyYW0gUnNBbmltYXRpb25FZGdlIHBvc3QKKwlyZXQgUnNBbmltYXRpb24KKwl9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNBZGFwdGVyLmNwcCBiL2xpYnMvcnMvcnNBZGFwdGVyLmNwcAppbmRleCAwZDMxZmFjLi5lZjY5Yjc1IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQWRhcHRlci5jcHAKKysrIGIvbGlicy9ycy9yc0FkYXB0ZXIuY3BwCkBAIC0xNSw3ICsxNSwxMSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtNzAsNiArNzQsMTYgQEAKICAgICAgICAgICAgbUFsbG9jYXRpb24uZ2V0KCktPmdldFR5cGUoKS0+Z2V0U2l6ZUJ5dGVzKCkpOwogfQogCit2b2lkIEFkYXB0ZXIxRDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAKK30KKworQWRhcHRlcjFEICpBZGFwdGVyMUQ6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCkBAIC0xNjksNyArMTgzLDYgQEAKIAogICAgIHVpbnQzMl90IGVTaXplID0gbUFsbG9jYXRpb24uZ2V0KCktPmdldFR5cGUoKS0+Z2V0RWxlbWVudFNpemVCeXRlcygpOwogICAgIHVpbnQzMl90IGxpbmVTaXplID0gZVNpemUgKiB3OwotICAgIHVpbnQzMl90IGRlc3RXID0gZ2V0RGltWCgpOwogCiAgICAgY29uc3QgdWludDhfdCAqc3JjID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCAqPihkYXRhKTsKICAgICBmb3IgKHVpbnQzMl90IGxpbmU9eW9mZjsgbGluZSA8ICh5b2ZmK2gpOyBsaW5lKyspIHsKQEAgLTE4NSw2ICsxOTgsMTUgQEAKICAgICAgICAgICAgbUFsbG9jYXRpb24uZ2V0KCktPmdldFR5cGUoKS0+Z2V0U2l6ZUJ5dGVzKCkpOwogfQogCit2b2lkIEFkYXB0ZXIyRDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAKK30KKworQWRhcHRlcjJEICpBZGFwdGVyMkQ6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CiAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0FkYXB0ZXIuaCBiL2xpYnMvcnMvcnNBZGFwdGVyLmgKaW5kZXggY2IyODcyZS4uNDQ5ZTdhZCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0FkYXB0ZXIuaAorKysgYi9saWJzL3JzL3JzQWRhcHRlci5oCkBAIC01MCw2ICs1MCwxMCBAQAogICAgIHZvaWQgc3ViRGF0YSh1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCBjb3VudCwgY29uc3Qgdm9pZCAqZGF0YSk7CiAgICAgdm9pZCBkYXRhKGNvbnN0IHZvaWQgKmRhdGEpOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfQURBUFRFUl8xRDsgfQorICAgIHN0YXRpYyBBZGFwdGVyMUQgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCiBwcm90ZWN0ZWQ6CiAgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKICAgICB1aW50MzJfdCBtWTsKQEAgLTgyLDYgKzg2LDEwIEBACiAgICAgdm9pZCBkYXRhKGNvbnN0IHZvaWQgKmRhdGEpOwogICAgIHZvaWQgc3ViRGF0YSh1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLCB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBjb25zdCB2b2lkICpkYXRhKTsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMkQ7IH0KKyAgICBzdGF0aWMgQWRhcHRlcjJEICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKKwogcHJvdGVjdGVkOgogICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbUFsbG9jYXRpb247CiAgICAgdWludDMyX3QgbVo7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQWxsb2NhdGlvbi5jcHAgYi9saWJzL3JzL3JzQWxsb2NhdGlvbi5jcHAKaW5kZXggNGU4Mjc4ZC4uMmU5ZTBiMyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0FsbG9jYXRpb24uY3BwCisrKyBiL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmNwcApAQCAtMTMsMTIgKzEzLDE4IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKIAogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0yOCw2ICszNCw5IEBACiAgICAgaW5pdChyc2MsIHR5cGUpOwogCiAgICAgbVB0ciA9IG1hbGxvYyhtVHlwZS0+Z2V0U2l6ZUJ5dGVzKCkpOworICAgIGlmIChtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRIYXNSZWZlcmVuY2VzKCkpIHsKKyAgICAgICAgbWVtc2V0KG1QdHIsIDAsIG1UeXBlLT5nZXRTaXplQnl0ZXMoKSk7CisgICAgfQogICAgIGlmICghbVB0cikgewogICAgICAgICBMT0dFKCJBbGxvY2F0aW9uOjpBbGxvY2F0aW9uLCBhbGxvYyBmYWlsdXJlIik7CiAgICAgfQpAQCAtMTY3LDkgKzE3NiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgMCwgZm9ybWF0LCB0eXBlLCBwdHIpOwogICAgIH0KICAgICBpZiAobVRleHR1cmVHZW5NaXBtYXApIHsKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogICAgICAgICBnbEdlbmVyYXRlTWlwbWFwKEdMX1RFWFRVUkVfMkQpOworI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogICAgIH0KIAorICAgIHJzYy0+Y2hlY2tFcnJvcigiQWxsb2NhdGlvbjo6dXBsb2FkVG9UZXh0dXJlIik7CiB9CiAKIHZvaWQgQWxsb2NhdGlvbjo6ZGVmZXJlZFVwbG9hZFRvQnVmZmVyT2JqZWN0KGNvbnN0IENvbnRleHQgKnJzYykKQEAgLTIwMSw2ICsyMTMsNyBAQAogICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1CdWZmZXJJRCk7CiAgICAgZ2xCdWZmZXJEYXRhKEdMX0FSUkFZX0JVRkZFUiwgbVR5cGUtPmdldFNpemVCeXRlcygpLCBnZXRQdHIoKSwgR0xfRFlOQU1JQ19EUkFXKTsKICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCAwKTsKKyAgICByc2MtPmNoZWNrRXJyb3IoIkFsbG9jYXRpb246OnVwbG9hZFRvQnVmZmVyT2JqZWN0Iik7CiB9CiAKIHZvaWQgQWxsb2NhdGlvbjo6dXBsb2FkQ2hlY2soY29uc3QgQ29udGV4dCAqcnNjKQpAQCAtMjE3LDEzICsyMzAsMTkgQEAKIH0KIAogCi12b2lkIEFsbG9jYXRpb246OmRhdGEoY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQordm9pZCBBbGxvY2F0aW9uOjpkYXRhKENvbnRleHQgKnJzYywgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQogewogICAgIHVpbnQzMl90IHNpemUgPSBtVHlwZS0+Z2V0U2l6ZUJ5dGVzKCk7CiAgICAgaWYgKHNpemUgIT0gc2l6ZUJ5dGVzKSB7CiAgICAgICAgIExPR0UoIkFsbG9jYXRpb246OmRhdGEgY2FsbGVkIHdpdGggbWlzbWF0Y2hlZCBzaXplIGV4cGVjdGVkICVpLCBnb3QgJWkiLCBzaXplLCBzaXplQnl0ZXMpOwogICAgICAgICByZXR1cm47CiAgICAgfQorCisgICAgaWYgKG1UeXBlLT5nZXRFbGVtZW50KCktPmdldEhhc1JlZmVyZW5jZXMoKSkgeworICAgICAgICBpbmNSZWZzKGRhdGEsIHNpemVCeXRlcyAvIG1UeXBlLT5nZXRFbGVtZW50KCktPmdldFNpemVCeXRlcygpKTsKKyAgICAgICAgZGVjUmVmcyhtUHRyLCBzaXplQnl0ZXMgLyBtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRTaXplQnl0ZXMoKSk7CisgICAgfQorCiAgICAgbWVtY3B5KG1QdHIsIGRhdGEsIHNpemUpOwogICAgIHNlbmREaXJ0eSgpOwogICAgIG1VcGxvYWREZWZlcmVkID0gdHJ1ZTsKQEAgLTIzNCw3ICsyNTMsNyBAQAogICAgIG1lbWNweShkYXRhLCBtUHRyLCBtVHlwZS0+Z2V0U2l6ZUJ5dGVzKCkpOwogfQogCi12b2lkIEFsbG9jYXRpb246OnN1YkRhdGEodWludDMyX3QgeG9mZiwgdWludDMyX3QgY291bnQsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKK3ZvaWQgQWxsb2NhdGlvbjo6c3ViRGF0YShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IGNvdW50LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpCiB7CiAgICAgdWludDMyX3QgZVNpemUgPSBtVHlwZS0+Z2V0RWxlbWVudFNpemVCeXRlcygpOwogICAgIHVpbnQ4X3QgKiBwdHIgPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+KG1QdHIpOwpAQCAtMjQ2LDEyICsyNjUsMTggQEAKICAgICAgICAgbVR5cGUtPmR1bXBMT0dWKCJ0eXBlIGluZm8iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIGlmIChtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRIYXNSZWZlcmVuY2VzKCkpIHsKKyAgICAgICAgaW5jUmVmcyhkYXRhLCBjb3VudCk7CisgICAgICAgIGRlY1JlZnMocHRyLCBjb3VudCk7CisgICAgfQorCiAgICAgbWVtY3B5KHB0ciwgZGF0YSwgc2l6ZSk7CiAgICAgc2VuZERpcnR5KCk7CiAgICAgbVVwbG9hZERlZmVyZWQgPSB0cnVlOwogfQogCi12b2lkIEFsbG9jYXRpb246OnN1YkRhdGEodWludDMyX3QgeG9mZiwgdWludDMyX3QgeW9mZiwKK3ZvaWQgQWxsb2NhdGlvbjo6c3ViRGF0YShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsCiAgICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQogewogICAgIHVpbnQzMl90IGVTaXplID0gbVR5cGUtPmdldEVsZW1lbnRTaXplQnl0ZXMoKTsKQEAgLTI2OCw3ICsyOTMsMTAgQEAKICAgICB9CiAKICAgICBmb3IgKHVpbnQzMl90IGxpbmU9eW9mZjsgbGluZSA8ICh5b2ZmK2gpOyBsaW5lKyspIHsKLSAgICAgICAgdWludDhfdCAqIHB0ciA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4obVB0cik7CisgICAgICAgIGlmIChtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRIYXNSZWZlcmVuY2VzKCkpIHsKKyAgICAgICAgICAgIGluY1JlZnMoc3JjLCB3KTsKKyAgICAgICAgICAgIGRlY1JlZnMoZHN0LCB3KTsKKyAgICAgICAgfQogICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIGxpbmVTaXplKTsKICAgICAgICAgc3JjICs9IGxpbmVTaXplOwogICAgICAgICBkc3QgKz0gZGVzdFcgKiBlU2l6ZTsKQEAgLTI3NywxNCArMzA1LDk2IEBACiAgICAgbVVwbG9hZERlZmVyZWQgPSB0cnVlOwogfQogCi12b2lkIEFsbG9jYXRpb246OnN1YkRhdGEodWludDMyX3QgeG9mZiwgdWludDMyX3QgeW9mZiwgdWludDMyX3Qgem9mZiwKK3ZvaWQgQWxsb2NhdGlvbjo6c3ViRGF0YShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsIHVpbnQzMl90IHpvZmYsCiAgICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgdWludDMyX3QgZCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQogewogfQogCit2b2lkIEFsbG9jYXRpb246OnN1YkVsZW1lbnREYXRhKENvbnRleHQgKnJzYywgdWludDMyX3QgeCwgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY0lkeCwgdWludDMyX3Qgc2l6ZUJ5dGVzKQoreworICAgIHVpbnQzMl90IGVTaXplID0gbVR5cGUtPmdldEVsZW1lbnRTaXplQnl0ZXMoKTsKKyAgICB1aW50OF90ICogcHRyID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPihtUHRyKTsKKyAgICBwdHIgKz0gZVNpemUgKiB4OworCisgICAgaWYgKGNJZHggPj0gbVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0RmllbGRDb3VudCgpKSB7CisgICAgICAgIExPR0UoIkVycm9yIEFsbG9jYXRpb246OnN1YkVsZW1lbnREYXRhIGNvbXBvbmVudCAlaSBvdXQgb2YgcmFuZ2UuIiwgY0lkeCk7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1ZBTFVFLCAic3ViRWxlbWVudERhdGEgY29tcG9uZW50IG91dCBvZiByYW5nZS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh4ID49IG1UeXBlLT5nZXREaW1YKCkpIHsKKyAgICAgICAgTE9HRSgiRXJyb3IgQWxsb2NhdGlvbjo6c3ViRWxlbWVudERhdGEgWCBvZmZzZXQgJWkgb3V0IG9mIHJhbmdlLiIsIHgpOworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9WQUxVRSwgInN1YkVsZW1lbnREYXRhIFggb2Zmc2V0IG91dCBvZiByYW5nZS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IEVsZW1lbnQgKiBlID0gbVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0RmllbGQoY0lkeCk7CisgICAgcHRyICs9IG1UeXBlLT5nZXRFbGVtZW50KCktPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY0lkeCk7CisKKyAgICBpZiAoc2l6ZUJ5dGVzICE9IGUtPmdldFNpemVCeXRlcygpKSB7CisgICAgICAgIExPR0UoIkVycm9yIEFsbG9jYXRpb246OnN1YkVsZW1lbnREYXRhIGRhdGEgc2l6ZSAlaSBkb2VzIG5vdCBtYXRjaCBmaWVsZCBzaXplICVpLiIsIHNpemVCeXRlcywgZS0+Z2V0U2l6ZUJ5dGVzKCkpOworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9WQUxVRSwgInN1YkVsZW1lbnREYXRhIGJhZCBzaXplLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGUtPmdldEhhc1JlZmVyZW5jZXMoKSkgeworICAgICAgICBlLT5pbmNSZWZzKGRhdGEpOworICAgICAgICBlLT5kZWNSZWZzKHB0cik7CisgICAgfQorCisgICAgbWVtY3B5KHB0ciwgZGF0YSwgc2l6ZUJ5dGVzKTsKKyAgICBzZW5kRGlydHkoKTsKKyAgICBtVXBsb2FkRGVmZXJlZCA9IHRydWU7Cit9CisKK3ZvaWQgQWxsb2NhdGlvbjo6c3ViRWxlbWVudERhdGEoQ29udGV4dCAqcnNjLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBjSWR4LCB1aW50MzJfdCBzaXplQnl0ZXMpCit7CisgICAgdWludDMyX3QgZVNpemUgPSBtVHlwZS0+Z2V0RWxlbWVudFNpemVCeXRlcygpOworICAgIHVpbnQ4X3QgKiBwdHIgPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+KG1QdHIpOworICAgIHB0ciArPSBlU2l6ZSAqICh4ICsgeSAqIG1UeXBlLT5nZXREaW1YKCkpOworCisgICAgaWYgKHggPj0gbVR5cGUtPmdldERpbVgoKSkgeworICAgICAgICBMT0dFKCJFcnJvciBBbGxvY2F0aW9uOjpzdWJFbGVtZW50RGF0YSBYIG9mZnNldCAlaSBvdXQgb2YgcmFuZ2UuIiwgeCk7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1ZBTFVFLCAic3ViRWxlbWVudERhdGEgWCBvZmZzZXQgb3V0IG9mIHJhbmdlLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHkgPj0gbVR5cGUtPmdldERpbVkoKSkgeworICAgICAgICBMT0dFKCJFcnJvciBBbGxvY2F0aW9uOjpzdWJFbGVtZW50RGF0YSBYIG9mZnNldCAlaSBvdXQgb2YgcmFuZ2UuIiwgeCk7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1ZBTFVFLCAic3ViRWxlbWVudERhdGEgWCBvZmZzZXQgb3V0IG9mIHJhbmdlLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGNJZHggPj0gbVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0RmllbGRDb3VudCgpKSB7CisgICAgICAgIExPR0UoIkVycm9yIEFsbG9jYXRpb246OnN1YkVsZW1lbnREYXRhIGNvbXBvbmVudCAlaSBvdXQgb2YgcmFuZ2UuIiwgY0lkeCk7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1ZBTFVFLCAic3ViRWxlbWVudERhdGEgY29tcG9uZW50IG91dCBvZiByYW5nZS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IEVsZW1lbnQgKiBlID0gbVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0RmllbGQoY0lkeCk7CisgICAgcHRyICs9IG1UeXBlLT5nZXRFbGVtZW50KCktPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY0lkeCk7CisKKyAgICBpZiAoc2l6ZUJ5dGVzICE9IGUtPmdldFNpemVCeXRlcygpKSB7CisgICAgICAgIExPR0UoIkVycm9yIEFsbG9jYXRpb246OnN1YkVsZW1lbnREYXRhIGRhdGEgc2l6ZSAlaSBkb2VzIG5vdCBtYXRjaCBmaWVsZCBzaXplICVpLiIsIHNpemVCeXRlcywgZS0+Z2V0U2l6ZUJ5dGVzKCkpOworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9WQUxVRSwgInN1YkVsZW1lbnREYXRhIGJhZCBzaXplLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGUtPmdldEhhc1JlZmVyZW5jZXMoKSkgeworICAgICAgICBlLT5pbmNSZWZzKGRhdGEpOworICAgICAgICBlLT5kZWNSZWZzKHB0cik7CisgICAgfQorCisgICAgbWVtY3B5KHB0ciwgZGF0YSwgc2l6ZUJ5dGVzKTsKKyAgICBzZW5kRGlydHkoKTsKKyAgICBtVXBsb2FkRGVmZXJlZCA9IHRydWU7Cit9CisKIHZvaWQgQWxsb2NhdGlvbjo6YWRkUHJvZ3JhbVRvRGlydHkoY29uc3QgUHJvZ3JhbSAqcCkKIHsKLSAgICBtVG9EaXJ0eUxpc3QuYWRkKHApOworICAgIG1Ub0RpcnR5TGlzdC5wdXNoKHApOwogfQogCiB2b2lkIEFsbG9jYXRpb246OnJlbW92ZVByb2dyYW1Ub0RpcnR5KGNvbnN0IFByb2dyYW0gKnApCkBAIC0zMTYsNiArNDI2LDYxIEBACiAKIH0KIAordm9pZCBBbGxvY2F0aW9uOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIC8vIE5lZWQgdG8gaWRlbnRpZnkgb3Vyc2VsdmVzCisgICAgc3RyZWFtLT5hZGRVMzIoKHVpbnQzMl90KWdldENsYXNzSWQoKSk7CisKKyAgICBTdHJpbmc4IG5hbWUoZ2V0TmFtZSgpKTsKKyAgICBzdHJlYW0tPmFkZFN0cmluZygmbmFtZSk7CisKKyAgICAvLyBGaXJzdCB0aGluZyB3ZSBuZWVkIHRvIHNlcmlhbGl6ZSBpcyB0aGUgdHlwZSBvYmplY3Qgc2luY2UgaXQgd2lsbCBiZSBuZWVkZWQKKyAgICAvLyB0byBpbml0aWFsaXplIHRoZSBjbGFzcworICAgIG1UeXBlLT5zZXJpYWxpemUoc3RyZWFtKTsKKworICAgIHVpbnQzMl90IGRhdGFTaXplID0gbVR5cGUtPmdldFNpemVCeXRlcygpOworICAgIC8vIFdyaXRlIGhvdyBtdWNoIGRhdGEgd2UgYXJlIHN0b3JpbmcKKyAgICBzdHJlYW0tPmFkZFUzMihkYXRhU2l6ZSk7CisgICAgLy8gTm93IHdyaXRlIHRoZSBkYXRhCisgICAgc3RyZWFtLT5hZGRCeXRlQXJyYXkobVB0ciwgZGF0YVNpemUpOworfQorCitBbGxvY2F0aW9uICpBbGxvY2F0aW9uOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIC8vIEZpcnN0IG1ha2Ugc3VyZSB3ZSBhcmUgcmVhZGluZyB0aGUgY29ycmVjdCBvYmplY3QKKyAgICBSc0EzRENsYXNzSUQgY2xhc3NJRCA9IChSc0EzRENsYXNzSUQpc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYoY2xhc3NJRCAhPSBSU19BM0RfQ0xBU1NfSURfQUxMT0NBVElPTikgeworICAgICAgICBMT0dFKCJhbGxvY2F0aW9uIGxvYWRpbmcgc2tpcHBlZCBkdWUgdG8gaW52YWxpZCBjbGFzcyBpZFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFN0cmluZzggbmFtZTsKKyAgICBzdHJlYW0tPmxvYWRTdHJpbmcoJm5hbWUpOworCisgICAgVHlwZSAqdHlwZSA9IFR5cGU6OmNyZWF0ZUZyb21TdHJlYW0ocnNjLCBzdHJlYW0pOworICAgIGlmKCF0eXBlKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB0eXBlLT5jb21wdXRlKCk7CisKKyAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgd2Ugd3JvdGUgb3V0IGZvciB0aGlzIGFsbG9jYXRpb24KKyAgICB1aW50MzJfdCBkYXRhU2l6ZSA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKGRhdGFTaXplICE9IHR5cGUtPmdldFNpemVCeXRlcygpKSB7CisgICAgICAgIExPR0UoImZhaWxlZCB0byByZWFkIGFsbG9jYXRpb24gYmVjYXVzZSBudW1ieXRlcyB3cml0dGVuIGlzIG5vdCB0aGUgc2FtZSBsb2FkZWQgdHlwZSB3YW50c1xuIik7CisgICAgICAgIGRlbGV0ZSB0eXBlOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBBbGxvY2F0aW9uICphbGxvYyA9IG5ldyBBbGxvY2F0aW9uKHJzYywgdHlwZSk7CisgICAgYWxsb2MtPnNldE5hbWUobmFtZS5zdHJpbmcoKSwgbmFtZS5zaXplKCkpOworCisgICAgLy8gUmVhZCBpbiBhbGwgb2Ygb3VyIGFsbG9jYXRpb24gZGF0YQorICAgIGFsbG9jLT5kYXRhKHJzYywgc3RyZWFtLT5nZXRQdHIoKSArIHN0cmVhbS0+Z2V0UG9zKCksIGRhdGFTaXplKTsKKyAgICBzdHJlYW0tPnJlc2V0KHN0cmVhbS0+Z2V0UG9zKCkgKyBkYXRhU2l6ZSk7CisKKyAgICByZXR1cm4gYWxsb2M7Cit9CisKIHZvaWQgQWxsb2NhdGlvbjo6c2VuZERpcnR5KCkgY29uc3QKIHsKICAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IG1Ub0RpcnR5TGlzdC5zaXplKCk7IGN0KyspIHsKQEAgLTMyMyw2ICs0ODgsNjUgQEAKICAgICB9CiB9CiAKK3ZvaWQgQWxsb2NhdGlvbjo6aW5jUmVmcyhjb25zdCB2b2lkICpwdHIsIHNpemVfdCBjdCwgc2l6ZV90IHN0YXJ0T2ZmKSBjb25zdAoreworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90ICo+KHB0cik7CisgICAgY29uc3QgRWxlbWVudCAqZSA9IG1UeXBlLT5nZXRFbGVtZW50KCk7CisgICAgdWludDMyX3Qgc3RyaWRlID0gZS0+Z2V0U2l6ZUJ5dGVzKCk7CisKKyAgICBwICs9IHN0cmlkZSAqIHN0YXJ0T2ZmOworICAgIHdoaWxlIChjdCA+IDApIHsKKyAgICAgICAgZS0+aW5jUmVmcyhwKTsKKyAgICAgICAgY3QgLS07CisgICAgICAgIHAgKz0gc3RyaWRlOworICAgIH0KK30KKwordm9pZCBBbGxvY2F0aW9uOjpkZWNSZWZzKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IGN0LCBzaXplX3Qgc3RhcnRPZmYpIGNvbnN0Cit7CisgICAgY29uc3QgdWludDhfdCAqcCA9IHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QgKj4ocHRyKTsKKyAgICBjb25zdCBFbGVtZW50ICplID0gbVR5cGUtPmdldEVsZW1lbnQoKTsKKyAgICB1aW50MzJfdCBzdHJpZGUgPSBlLT5nZXRTaXplQnl0ZXMoKTsKKworICAgIHAgKz0gc3RyaWRlICogc3RhcnRPZmY7CisgICAgd2hpbGUgKGN0ID4gMCkgeworICAgICAgICBlLT5kZWNSZWZzKHApOworICAgICAgICBjdCAtLTsKKyAgICAgICAgcCArPSBzdHJpZGU7CisgICAgfQorfQorCit2b2lkIEFsbG9jYXRpb246OmNvcHlSYW5nZTFEKENvbnRleHQgKnJzYywgY29uc3QgQWxsb2NhdGlvbiAqc3JjLCBpbnQzMl90IHNyY09mZiwgaW50MzJfdCBkZXN0T2ZmLCBpbnQzMl90IGxlbikKK3sKK30KKwordm9pZCBBbGxvY2F0aW9uOjpyZXNpemUxRChDb250ZXh0ICpyc2MsIHVpbnQzMl90IGRpbVgpCit7CisgICAgVHlwZSAqdCA9IG1UeXBlLT5jbG9uZUFuZFJlc2l6ZTFEKHJzYywgZGltWCk7CisKKyAgICB1aW50MzJfdCBvbGREaW1YID0gbVR5cGUtPmdldERpbVgoKTsKKyAgICBpZiAoZGltWCA9PSBvbGREaW1YKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZGltWCA8IG9sZERpbVgpIHsKKyAgICAgICAgZGVjUmVmcyhtUHRyLCBvbGREaW1YIC0gZGltWCwgZGltWCk7CisgICAgfQorICAgIG1QdHIgPSByZWFsbG9jKG1QdHIsIHQtPmdldFNpemVCeXRlcygpKTsKKworICAgIGlmIChkaW1YID4gb2xkRGltWCkgeworICAgICAgICBjb25zdCBFbGVtZW50ICplID0gbVR5cGUtPmdldEVsZW1lbnQoKTsKKyAgICAgICAgdWludDMyX3Qgc3RyaWRlID0gZS0+Z2V0U2l6ZUJ5dGVzKCk7CisgICAgICAgIG1lbXNldCgoKHVpbnQ4X3QgKiltUHRyKSArIHN0cmlkZSAqIG9sZERpbVgsIDAsIHN0cmlkZSAqIChkaW1YIC0gb2xkRGltWCkpOworICAgIH0KKyAgICBtVHlwZS5zZXQodCk7Cit9CisKK3ZvaWQgQWxsb2NhdGlvbjo6cmVzaXplMkQoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBkaW1YLCB1aW50MzJfdCBkaW1ZKQoreworICAgIExPR0UoIm5vdCBpbXBsZW1lbnRlZCIpOworfQorCiAvLy8vLy8vLy8vLy8vLy8vLwogLy8KIApAQCAtNDk1LDcgKzcxOSw3IEBACiAgICAgaWYgKHNyY0dMVHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFICYmCiAgICAgICAgIHNyY0dMRm10ID09IEdMX1JHQiAmJgogICAgICAgICBkc3RHTFR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfNV82XzUgJiYKLSAgICAgICAgZHN0R0xUeXBlID09IEdMX1JHQikgeworICAgICAgICBkc3RHTEZtdCA9PSBHTF9SR0IpIHsKIAogICAgICAgICByZXR1cm4gZWxlbWVudENvbnZlcnRlcl84ODhfdG9fNTY1OwogICAgIH0KQEAgLTUwMywxNSArNzI3LDIxIEBACiAgICAgaWYgKHNyY0dMVHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFICYmCiAgICAgICAgIHNyY0dMRm10ID09IEdMX1JHQkEgJiYKICAgICAgICAgZHN0R0xUeXBlID09IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICYmCi0gICAgICAgIGRzdEdMVHlwZSA9PSBHTF9SR0IpIHsKKyAgICAgICAgZHN0R0xGbXQgPT0gR0xfUkdCKSB7CiAKICAgICAgICAgcmV0dXJuIGVsZW1lbnRDb252ZXJ0ZXJfODg4OF90b181NjU7CiAgICAgfQogCiAgICAgTE9HRSgicGlja0NvbnZlcnRlciwgdW5zdXBvcnRlZCBjb21ibywgc3JjICVwLCAgZHN0ICVwIiwgc3JjLCBkc3QpOworICAgIExPR0UoInBpY2tDb252ZXJ0ZXIsIHNyY0dMVHlwZSA9ICV4LCAgc3JjR0xGbXQgPSAleCIsIHNyY0dMVHlwZSwgc3JjR0xGbXQpOworICAgIExPR0UoInBpY2tDb252ZXJ0ZXIsIGRzdEdMVHlwZSA9ICV4LCAgZHN0R0xGbXQgPSAleCIsIGRzdEdMVHlwZSwgZHN0R0xGbXQpOworICAgIHNyYy0+ZHVtcExPR1YoIlNSQyAiKTsKKyAgICBkc3QtPmR1bXBMT0dWKCJEU1QgIik7CiAgICAgcmV0dXJuIDA7CiB9CiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCiBSc0FsbG9jYXRpb24gcnNpX0FsbG9jYXRpb25DcmVhdGVCaXRtYXBSZWYoQ29udGV4dCAqcnNjLCBSc1R5cGUgdnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYm1wLCB2b2lkICpjYWxsYmFja0RhdGEsIFJzQml0bWFwQ2FsbGJhY2tfdCBjYWxsYmFjaykKIHsKQEAgLTUyNiwxMCArNzU2LDcgQEAKICAgICBjb25zdCBFbGVtZW50ICpzcmMgPSBzdGF0aWNfY2FzdDxjb25zdCBFbGVtZW50ICo+KF9zcmMpOwogICAgIGNvbnN0IEVsZW1lbnQgKmRzdCA9IHN0YXRpY19jYXN0PGNvbnN0IEVsZW1lbnQgKj4oX2RzdCk7CiAKLSAgICAvLyBDaGVjayBmb3IgcG93MiBvbiBwcmUgZXMgMi4wIHZlcnNpb25zLgotICAgIHJzQXNzZXJ0KHJzYy0+Y2hlY2tWZXJzaW9uMl8wKCkgfHwgKCEodyAmICh3LTEpKSAmJiAhKGggJiAoaC0xKSkpKTsKLQotICAgIC8vTE9HRSgicnNpX0FsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwICVpICVpICVpICVpICVpIiwgdywgaCwgZHN0Rm10LCBzcmNGbXQsIGdlbk1pcHMpOworICAgIC8vTE9HRSgiJXAgcnNpX0FsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwICVpICVpICVpIiwgcnNjLCB3LCBoLCBnZW5NaXBzKTsKICAgICByc2lfVHlwZUJlZ2luKHJzYywgX2RzdCk7CiAgICAgcnNpX1R5cGVBZGQocnNjLCBSU19ESU1FTlNJT05fWCwgdyk7CiAgICAgcnNpX1R5cGVBZGQocnNjLCBSU19ESU1FTlNJT05fWSwgaCk7CkBAIC01NDYsMTYgKzc3MywxOSBAQAogICAgIH0KIAogICAgIEVsZW1lbnRDb252ZXJ0ZXJfdCBjdnQgPSBwaWNrQ29udmVydGVyKGRzdCwgc3JjKTsKLSAgICBjdnQodGV4QWxsb2MtPmdldFB0cigpLCBkYXRhLCB3ICogaCk7Ci0KLSAgICBpZiAoZ2VuTWlwcykgewotICAgICAgICBBZGFwdGVyMkQgYWRhcHQocnNjLCB0ZXhBbGxvYyk7Ci0gICAgICAgIEFkYXB0ZXIyRCBhZGFwdDIocnNjLCB0ZXhBbGxvYyk7Ci0gICAgICAgIGZvcih1aW50MzJfdCBsb2Q9MDsgbG9kIDwgKHRleEFsbG9jLT5nZXRUeXBlKCktPmdldExPRENvdW50KCkgLTEpOyBsb2QrKykgewotICAgICAgICAgICAgYWRhcHQuc2V0TE9EKGxvZCk7Ci0gICAgICAgICAgICBhZGFwdDIuc2V0TE9EKGxvZCArIDEpOwotICAgICAgICAgICAgbWlwKGFkYXB0MiwgYWRhcHQpOworICAgIGlmIChjdnQpIHsKKyAgICAgICAgY3Z0KHRleEFsbG9jLT5nZXRQdHIoKSwgZGF0YSwgdyAqIGgpOworICAgICAgICBpZiAoZ2VuTWlwcykgeworICAgICAgICAgICAgQWRhcHRlcjJEIGFkYXB0KHJzYywgdGV4QWxsb2MpOworICAgICAgICAgICAgQWRhcHRlcjJEIGFkYXB0Mihyc2MsIHRleEFsbG9jKTsKKyAgICAgICAgICAgIGZvcih1aW50MzJfdCBsb2Q9MDsgbG9kIDwgKHRleEFsbG9jLT5nZXRUeXBlKCktPmdldExPRENvdW50KCkgLTEpOyBsb2QrKykgeworICAgICAgICAgICAgICAgIGFkYXB0LnNldExPRChsb2QpOworICAgICAgICAgICAgICAgIGFkYXB0Mi5zZXRMT0QobG9kICsgMSk7CisgICAgICAgICAgICAgICAgbWlwKGFkYXB0MiwgYWRhcHQpOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfVkFMVUUsICJVbnN1cHBvcnRlZCBiaXRtYXAgZm9ybWF0Iik7CiAgICAgfQogCiAgICAgcmV0dXJuIHRleEFsbG9jOwpAQCAtNTkyLDE5ICs4MjIsMzEgQEAKIHZvaWQgcnNpX0FsbG9jYXRpb25EYXRhKENvbnRleHQgKnJzYywgUnNBbGxvY2F0aW9uIHZhLCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpCiB7CiAgICAgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpOwotICAgIGEtPmRhdGEoZGF0YSwgc2l6ZUJ5dGVzKTsKKyAgICBhLT5kYXRhKHJzYywgZGF0YSwgc2l6ZUJ5dGVzKTsKIH0KIAogdm9pZCByc2lfQWxsb2NhdGlvbjFEU3ViRGF0YShDb250ZXh0ICpyc2MsIFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgeG9mZiwgdWludDMyX3QgY291bnQsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKIHsKICAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7Ci0gICAgYS0+c3ViRGF0YSh4b2ZmLCBjb3VudCwgZGF0YSwgc2l6ZUJ5dGVzKTsKKyAgICBhLT5zdWJEYXRhKHJzYywgeG9mZiwgY291bnQsIGRhdGEsIHNpemVCeXRlcyk7Cit9CisKK3ZvaWQgcnNpX0FsbG9jYXRpb24yRFN1YkVsZW1lbnREYXRhKENvbnRleHQgKnJzYywgUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBlb2ZmLCB1aW50MzJfdCBzaXplQnl0ZXMpCit7CisgICAgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpOworICAgIGEtPnN1YkVsZW1lbnREYXRhKHJzYywgeCwgeSwgZGF0YSwgZW9mZiwgc2l6ZUJ5dGVzKTsKK30KKwordm9pZCByc2lfQWxsb2NhdGlvbjFEU3ViRWxlbWVudERhdGEoQ29udGV4dCAqcnNjLCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHgsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGVvZmYsIHVpbnQzMl90IHNpemVCeXRlcykKK3sKKyAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7CisgICAgYS0+c3ViRWxlbWVudERhdGEocnNjLCB4LCBkYXRhLCBlb2ZmLCBzaXplQnl0ZXMpOwogfQogCiB2b2lkIHJzaV9BbGxvY2F0aW9uMkRTdWJEYXRhKENvbnRleHQgKnJzYywgUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLCB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpCiB7CiAgICAgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpOwotICAgIGEtPnN1YkRhdGEoeG9mZiwgeW9mZiwgdywgaCwgZGF0YSwgc2l6ZUJ5dGVzKTsKKyAgICBhLT5zdWJEYXRhKHJzYywgeG9mZiwgeW9mZiwgdywgaCwgZGF0YSwgc2l6ZUJ5dGVzKTsKIH0KIAogdm9pZCByc2lfQWxsb2NhdGlvblJlYWQoQ29udGV4dCAqcnNjLCBSc0FsbG9jYXRpb24gdmEsIHZvaWQgKmRhdGEpCkBAIC02MTMsNiArODU1LDI3IEBACiAgICAgYS0+cmVhZChkYXRhKTsKIH0KIAordm9pZCByc2lfQWxsb2NhdGlvblJlc2l6ZTFEKENvbnRleHQgKnJzYywgUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCBkaW1YKQoreworICAgIEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBhLT5yZXNpemUxRChyc2MsIGRpbVgpOworfQorCit2b2lkIHJzaV9BbGxvY2F0aW9uUmVzaXplMkQoQ29udGV4dCAqcnNjLCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpCit7CisgICAgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpOworICAgIGEtPnJlc2l6ZTJEKHJzYywgZGltWCwgZGltWSk7Cit9CisKK2NvbnN0IHZvaWQqIHJzaV9BbGxvY2F0aW9uR2V0VHlwZShDb250ZXh0ICpyc2MsIFJzQWxsb2NhdGlvbiB2YSkKK3sKKyAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7CisgICAgYS0+Z2V0VHlwZSgpLT5pbmNVc2VyUmVmKCk7CisKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpOworfQorCisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmggYi9saWJzL3JzL3JzQWxsb2NhdGlvbi5oCmluZGV4IDUxNmY4YjcuLjI0ZTI0NWYgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmgKKysrIGIvbGlicy9ycy9yc0FsbG9jYXRpb24uaApAQCAtNTUsMTQgKzU1LDIzIEBACiAgICAgdm9pZCB1cGxvYWRUb0J1ZmZlck9iamVjdChjb25zdCBDb250ZXh0ICpyc2MpOwogICAgIHVpbnQzMl90IGdldEJ1ZmZlck9iamVjdElEKCkgY29uc3Qge3JldHVybiBtQnVmZmVySUQ7fQogCisgICAgdm9pZCBjb3B5UmFuZ2UxRChDb250ZXh0ICpyc2MsIGNvbnN0IEFsbG9jYXRpb24gKnNyYywgaW50MzJfdCBzcmNPZmYsIGludDMyX3QgZGVzdE9mZiwgaW50MzJfdCBsZW4pOwogCi0gICAgdm9pZCBkYXRhKGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcyk7Ci0gICAgdm9pZCBzdWJEYXRhKHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IGNvdW50LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpOwotICAgIHZvaWQgc3ViRGF0YSh1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLAorICAgIHZvaWQgcmVzaXplMUQoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBkaW1YKTsKKyAgICB2b2lkIHJlc2l6ZTJEKENvbnRleHQgKnJzYywgdWludDMyX3QgZGltWCwgdWludDMyX3QgZGltWSk7CisKKyAgICB2b2lkIGRhdGEoQ29udGV4dCAqcnNjLCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpOworICAgIHZvaWQgc3ViRGF0YShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IGNvdW50LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpOworICAgIHZvaWQgc3ViRGF0YShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsCiAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcyk7Ci0gICAgdm9pZCBzdWJEYXRhKHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsIHVpbnQzMl90IHpvZmYsCisgICAgdm9pZCBzdWJEYXRhKENvbnRleHQgKnJzYywgdWludDMyX3QgeG9mZiwgdWludDMyX3QgeW9mZiwgdWludDMyX3Qgem9mZiwKICAgICAgICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgdWludDMyX3QgZCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKTsKIAorICAgIHZvaWQgc3ViRWxlbWVudERhdGEoQ29udGV4dCAqcnNjLCB1aW50MzJfdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgZWxlbWVudE9mZiwgdWludDMyX3Qgc2l6ZUJ5dGVzKTsKKyAgICB2b2lkIHN1YkVsZW1lbnREYXRhKENvbnRleHQgKnJzYywgdWludDMyX3QgeCwgdWludDMyX3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGVsZW1lbnRPZmYsIHVpbnQzMl90IHNpemVCeXRlcyk7CisKICAgICB2b2lkIHJlYWQodm9pZCAqZGF0YSk7CiAKICAgICB2b2lkIGVuYWJsZUdMVmVydGV4QnVmZmVycygpIGNvbnN0OwpAQCAtNzIsMTIgKzgxLDIyIEBACiAgICAgdm9pZCByZW1vdmVQcm9ncmFtVG9EaXJ0eShjb25zdCBQcm9ncmFtICopOwogCiAgICAgdmlydHVhbCB2b2lkIGR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfQUxMT0NBVElPTjsgfQorICAgIHN0YXRpYyBBbGxvY2F0aW9uICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKIAogICAgIHZpcnR1YWwgdm9pZCB1cGxvYWRDaGVjayhjb25zdCBDb250ZXh0ICpyc2MpOwogCi1wcm90ZWN0ZWQ6Ci0gICAgdm9pZCBzZW5kRGlydHkoKSBjb25zdDsKKyAgICBib29sIGdldElzVGV4dHVyZSgpIGNvbnN0IHtyZXR1cm4gbUlzVGV4dHVyZTt9CisgICAgYm9vbCBnZXRJc0J1ZmZlck9iamVjdCgpIGNvbnN0IHtyZXR1cm4gbUlzVmVydGV4QnVmZmVyO30KIAorICAgIHZvaWQgaW5jUmVmcyhjb25zdCB2b2lkICpwdHIsIHNpemVfdCBjdCwgc2l6ZV90IHN0YXJ0T2ZmID0gMCkgY29uc3Q7CisgICAgdm9pZCBkZWNSZWZzKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IGN0LCBzaXplX3Qgc3RhcnRPZmYgPSAwKSBjb25zdDsKKworICAgIHZvaWQgc2VuZERpcnR5KCkgY29uc3Q7CisgICAgYm9vbCBnZXRIYXNHcmFwaGljc01pcG1hcHMoKSBjb25zdCB7cmV0dXJuIG1UZXh0dXJlR2VuTWlwbWFwO30KKworcHJvdGVjdGVkOgogICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT4gbVR5cGU7CiAgICAgdm9pZCAqIG1QdHI7CiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNBbmltYXRpb24uY3BwIGIvbGlicy9ycy9yc0FuaW1hdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIwMDcxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNBbmltYXRpb24uY3BwCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisKKyNpbmNsdWRlICJyc0FuaW1hdGlvbi5oIgorCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKwordm9pZCBBbmltYXRpb246OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgCit9CisKK0FuaW1hdGlvbiAqQW5pbWF0aW9uOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIHJldHVybiBOVUxMOworfQorCisvKgorQW5pbWF0aW9uOjpBbmltYXRpb24oQ29udGV4dCAqcnNjKSA6IE9iamVjdEJhc2UocnNjKQoreworICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKKyAgICBtQWxsb2NMaW5lID0gX19MSU5FX187CisKKyAgICBtVmFsdWVzSW5wdXQgPSBOVUxMOworICAgIG1WYWx1ZXNPdXRwdXQgPSBOVUxMOworICAgIG1WYWx1ZUNvdW50ID0gMDsKKyAgICBtSW50ZXJwb2xhdGlvbiA9IFJTX0FOSU1BVElPTl9JTlRFUlBPTEFUSU9OX1NURVA7CisgICAgbUVkZ2VQcmUgPSBSU19BTklNQVRJT05fRURHRV9VTkRFRklORUQ7CisgICAgbUVkZ2VQb3N0ID0gUlNfQU5JTUFUSU9OX0VER0VfVU5ERUZJTkVEOworICAgIG1JbnB1dE1pbiA9IDA7CisgICAgbUlucHV0TWF4ID0gMDsKK30KKworQW5pbWF0aW9uICogQW5pbWF0aW9uOjpjcmVhdGUoQ29udGV4dCAqcnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmluVmFsdWVzLCBjb25zdCBmbG9hdCAqb3V0VmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWVDb3VudCwgUnNBbmltYXRpb25JbnRlcnBvbGF0aW9uIGludGVycCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJzQW5pbWF0aW9uRWRnZSBwcmUsIFJzQW5pbWF0aW9uRWRnZSBwb3N0KQoreworICAgIGlmICh2YWx1ZUNvdW50IDwgMikgeworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9WQUxVRSwgIkFuaW1hdGlvbnMgcmVxdWlyZSBtb3JlIHRoYW4gMiB2YWx1ZXMuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBBbmltYXRpb24gKmEgPSBuZXcgQW5pbWF0aW9uKHJzYyk7CisgICAgaWYgKCFhKSB7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfT1VUX09GX01FTU9SWSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZsb2F0ICp2aW4gPSAoZmxvYXQgKiltYWxsb2ModmFsdWVDb3VudCAqIHNpemVvZihmbG9hdCkpOworICAgIGZsb2F0ICp2b3V0ID0gKGZsb2F0ICopbWFsbG9jKHZhbHVlQ291bnQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBhLT5tVmFsdWVzSW5wdXQgPSB2aW47CisgICAgYS0+bVZhbHVlc091dHB1dCA9IHZvdXQ7CisgICAgaWYgKGEtPm1WYWx1ZXNJbnB1dCA9PSBOVUxMIHx8IGEtPm1WYWx1ZXNPdXRwdXQgPT0gTlVMTCkgeworICAgICAgICBkZWxldGUgYTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9PVVRfT0ZfTUVNT1JZKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgYS0+bUVkZ2VQcmUgPSBwcmU7CisgICAgYS0+bUVkZ2VQb3N0ID0gcG9zdDsKKyAgICBhLT5tSW50ZXJwb2xhdGlvbiA9IGludGVycDsKKyAgICBhLT5tVmFsdWVDb3VudCA9IHZhbHVlQ291bnQ7CisKKyAgICBtZW1jcHkodmluLCBpblZhbHVlcywgdmFsdWVDb3VudCAqIHNpemVvZihmbG9hdCkpOworICAgIG1lbWNweSh2b3V0LCBvdXRWYWx1ZXMsIHZhbHVlQ291bnQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBhLT5tSW5wdXRNaW4gPSBpblZhbHVlc1swXTsKKyAgICBhLT5tSW5wdXRNYXggPSBpblZhbHVlc1swXTsKKworICAgIGJvb2wgbmVlZFNvcnQgPSBmYWxzZTsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTE7IGN0IDwgdmFsdWVDb3VudDsgY3QrKykgeworICAgICAgICBpZiAoYS0+bUlucHV0TWluID4gdmluW2N0XSkgeworICAgICAgICAgICAgbmVlZFNvcnQgPSB0cnVlOworICAgICAgICAgICAgYS0+bUlucHV0TWluID0gdmluW2N0XTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYS0+bUlucHV0TWF4IDwgdmluW2N0XSkgeworICAgICAgICAgICAgYS0+bUlucHV0TWF4ID0gdmluW2N0XTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5lZWRTb3J0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTE7IGN0IDwgdmFsdWVDb3VudDsgY3QrKykgeworICAgICAgICAgICAgaWYgKHZpbltjdC0xXSA+IHZpbltjdF0pIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB0ID0gdmluW2N0LTFdOworICAgICAgICAgICAgICAgIHZpbltjdC0xXSA9IHZpbltjdF07CisgICAgICAgICAgICAgICAgdmluW2N0XSA9IHQ7CisgICAgICAgICAgICAgICAgdCA9IHZvdXRbY3QtMV07CisgICAgICAgICAgICAgICAgdm91dFtjdC0xXSA9IHZvdXRbY3RdOworICAgICAgICAgICAgICAgIHZvdXRbY3RdID0gdDsKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWNoYW5nZWQpIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBhOworfQorKi8KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK1JzQW5pbWF0aW9uIHJzaV9BbmltYXRpb25DcmVhdGUoQ29udGV4dCAqcnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqaW5WYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpvdXRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJzQW5pbWF0aW9uSW50ZXJwb2xhdGlvbiBpbnRlcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJzQW5pbWF0aW9uRWRnZSBwcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJzQW5pbWF0aW9uRWRnZSBwb3N0KQoreworICAgIC8vTE9HRSgicnNpX0VsZW1lbnRDcmVhdGUgJWkgJWkgJWkgJWkiLCBkdCwgZGssIG5vcm0sIHZlY1NpemUpOworICAgIEFuaW1hdGlvbiAqYSA9IE5VTEw7Ly9BbmltYXRpb246OmNyZWF0ZShyc2MsIGluVmFsdWVzLCBvdXRWYWx1ZXMsIHZhbHVlQ291bnQsIGludGVycCwgcHJlLCBwb3N0KTsKKyAgICBpZiAoYSAhPSBOVUxMKSB7CisgICAgICAgIGEtPmluY1VzZXJSZWYoKTsKKyAgICB9CisgICAgcmV0dXJuIChSc0FuaW1hdGlvbilhOworfQorCisKK30KK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0FuaW1hdGlvbi5oIGIvbGlicy9ycy9yc0FuaW1hdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MDMxNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzQW5pbWF0aW9uLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19BTklNQVRJT05fSAorI2RlZmluZSBBTkRST0lEX1JTX0FOSU1BVElPTl9ICisKKyNpbmNsdWRlICJyc1V0aWxzLmgiCisjaW5jbHVkZSAicnNPYmplY3RCYXNlLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKKworY2xhc3MgQW5pbWF0aW9uIDogcHVibGljIE9iamVjdEJhc2UKK3sKK3B1YmxpYzoKKyAgICB+QW5pbWF0aW9uKCk7CisKKyAgICBzdGF0aWMgQW5pbWF0aW9uICogY3JlYXRlKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICppblZhbHVlcywgY29uc3QgZmxvYXQgKm91dFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlQ291bnQsIFJzQW5pbWF0aW9uSW50ZXJwb2xhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJzQW5pbWF0aW9uRWRnZSBwcmUsIFJzQW5pbWF0aW9uRWRnZSBwb3N0KTsKKworICAgIGZsb2F0IGV2YWwoZmxvYXQpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfQU5JTUFUSU9OOyB9CisgICAgc3RhdGljIEFuaW1hdGlvbiAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CisKK3Byb3RlY3RlZDoKKyAgICBBbmltYXRpb24oQ29udGV4dCAqcnNjKTsKKworCisKKyAgICBmbG9hdCBldmFsSW5SYW5nZShmbG9hdCkgY29uc3Q7CisKKworCisgICAgY29uc3QgZmxvYXQgKm1WYWx1ZXNJbnB1dDsKKyAgICBjb25zdCBmbG9hdCAqbVZhbHVlc091dHB1dDsKKyAgICB1aW50MzJfdCBtVmFsdWVDb3VudDsKKyAgICBSc0FuaW1hdGlvbkludGVycG9sYXRpb24gbUludGVycG9sYXRpb247CisgICAgUnNBbmltYXRpb25FZGdlIG1FZGdlUHJlOworICAgIFJzQW5pbWF0aW9uRWRnZSBtRWRnZVBvc3Q7CisKKyAgICAvLyBkZXJpdmVkCisgICAgZmxvYXQgbUlucHV0TWluOworICAgIGZsb2F0IG1JbnB1dE1heDsKK307CisKKworCisKK30KK30KKyNlbmRpZiAvL0FORFJPSURfU1RSVUNUVVJFRF9FTEVNRU5UX0gKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0NvbXBvbmVudC5jcHAgYi9saWJzL3JzL3JzQ29tcG9uZW50LmNwcAppbmRleCAxNWE1NmY3Li5mNTFiMjNlIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQ29tcG9uZW50LmNwcAorKysgYi9saWJzL3JzL3JzQ29tcG9uZW50LmNwcApAQCAtMTYsNyArMTYsMTEgQEAKIAogI2luY2x1ZGUgInJzQ29tcG9uZW50LmgiCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNlbHNlCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtOTEsNiArOTUsMjYgQEAKICAgICAgICAgbU5vcm1hbGl6ZWQgPSB0cnVlOwogICAgICAgICByc0Fzc2VydChtS2luZCA9PSBSU19LSU5EX1BJWEVMX1JHQkEpOwogICAgICAgICByZXR1cm47CisKKyAgICBjYXNlIFJTX1RZUEVfTUFUUklYXzRYNDoKKyAgICAgICAgbVR5cGVCaXRzID0gMTYgKiAzMjsKKyAgICAgICAgcnNBc3NlcnQobVZlY3RvclNpemUgPT0gMSk7CisgICAgICAgIHJzQXNzZXJ0KG1Ob3JtYWxpemVkID09IGZhbHNlKTsKKyAgICAgICAgcnNBc3NlcnQobUtpbmQgPT0gUlNfS0lORF9VU0VSKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19UWVBFX01BVFJJWF8zWDM6CisgICAgICAgIG1UeXBlQml0cyA9IDkgKiAzMjsKKyAgICAgICAgcnNBc3NlcnQobVZlY3RvclNpemUgPT0gMSk7CisgICAgICAgIHJzQXNzZXJ0KG1Ob3JtYWxpemVkID09IGZhbHNlKTsKKyAgICAgICAgcnNBc3NlcnQobUtpbmQgPT0gUlNfS0lORF9VU0VSKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19UWVBFX01BVFJJWF8yWDI6CisgICAgICAgIG1UeXBlQml0cyA9IDQgKiAzMjsKKyAgICAgICAgcnNBc3NlcnQobVZlY3RvclNpemUgPT0gMSk7CisgICAgICAgIHJzQXNzZXJ0KG1Ob3JtYWxpemVkID09IGZhbHNlKTsKKyAgICAgICAgcnNBc3NlcnQobUtpbmQgPT0gUlNfS0lORF9VU0VSKTsKKyAgICAgICAgYnJlYWs7CisKICAgICBjYXNlIFJTX1RZUEVfRUxFTUVOVDoKICAgICBjYXNlIFJTX1RZUEVfVFlQRToKICAgICBjYXNlIFJTX1RZUEVfQUxMT0NBVElPTjoKQEAgLTE0OCwxMSArMTcyLDE5IEBACiAgICAgY2FzZSBSU19UWVBFX1VOU0lHTkVEXzY0OgogICAgICAgICBtVHlwZUJpdHMgPSA2NDsKICAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJTX1RZUEVfQk9PTEVBTjoKKyAgICAgICAgbVR5cGVCaXRzID0gODsKKyAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgbUJpdHMgPSBtVHlwZUJpdHMgKiBtVmVjdG9yU2l6ZTsKIH0KIAorYm9vbCBDb21wb25lbnQ6OmlzUmVmZXJlbmNlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKG1UeXBlID49IFJTX1RZUEVfRUxFTUVOVCk7Cit9CiAKIAogCkBAIC0xODgsODIgKzIyMCw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyICogZ0NUeXBlU3RyaW5nc1tdID0gewotICAgIDAsCi0gICAgMCwvLyJGMTYiLAotICAgICJmbG9hdCIsCi0gICAgImRvdWJsZSIsCi0gICAgImNoYXIiLAotICAgICJzaG9ydCIsCi0gICAgImludCIsCi0gICAgMCwvLyJTNjQiLAotICAgICJjaGFyIiwvL1U4IiwKLSAgICAic2hvcnQiLC8vVTE2IiwKLSAgICAiaW50IiwvL1UzMiIsCi0gICAgMCwvLyJVNjQiLAotICAgIDAsLy8iVVBfNTY1IiwKLSAgICAwLC8vIlVQXzU1NTEiLAotICAgIDAsLy8iVVBfNDQ0NCIsCi0gICAgMCwvLyJFTEVNRU5UIiwKLSAgICAwLC8vIlRZUEUiLAotICAgIDAsLy8iQUxMT0NBVElPTiIsCi0gICAgMCwvLyJTQU1QTEVSIiwKLSAgICAwLC8vIlNDUklQVCIsCi0gICAgMCwvLyJNRVNIIiwKLSAgICAwLC8vIlBST0dSQU1fRlJBR01FTlQiLAotICAgIDAsLy8iUFJPR1JBTV9WRVJURVgiLAotICAgIDAsLy8iUFJPR1JBTV9SQVNURVIiLAotICAgIDAsLy8iUFJPR1JBTV9TVE9SRSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGdDVmVjVHlwZVN0cmluZ3NbXSA9IHsKLSAgICAwLAotICAgIDAsLy8iRjE2IiwKLSAgICAidmVjRjMyIiwKLSAgICAidmVjRjY0IiwKLSAgICAidmVjSTgiLAotICAgICJ2ZWNJMTYiLAotICAgICJ2ZWNJMzIiLAotICAgIDAsLy8iUzY0IiwKLSAgICAidmVjVTgiLC8vVTgiLAotICAgICJ2ZWNVMTYiLC8vVTE2IiwKLSAgICAidmVjVTMyIiwvL1UzMiIsCi0gICAgMCwvLyJVNjQiLAotICAgIDAsLy8iVVBfNTY1IiwKLSAgICAwLC8vIlVQXzU1NTEiLAotICAgIDAsLy8iVVBfNDQ0NCIsCi0gICAgMCwvLyJFTEVNRU5UIiwKLSAgICAwLC8vIlRZUEUiLAotICAgIDAsLy8iQUxMT0NBVElPTiIsCi0gICAgMCwvLyJTQU1QTEVSIiwKLSAgICAwLC8vIlNDUklQVCIsCi0gICAgMCwvLyJNRVNIIiwKLSAgICAwLC8vIlBST0dSQU1fRlJBR01FTlQiLAotICAgIDAsLy8iUFJPR1JBTV9WRVJURVgiLAotICAgIDAsLy8iUFJPR1JBTV9SQVNURVIiLAotICAgIDAsLy8iUFJPR1JBTV9TVE9SRSIsCi19OwotCi1TdHJpbmc4IENvbXBvbmVudDo6Z2V0Q1R5cGUoKSBjb25zdAotewotICAgIGNoYXIgYnVmWzY0XTsKLSAgICBpZiAobVZlY3RvclNpemUgPT0gMSkgewotICAgICAgICByZXR1cm4gU3RyaW5nOChnQ1R5cGVTdHJpbmdzW21UeXBlXSk7Ci0gICAgfQotCi0gICAgLy8gWXVjaywgYWNjIFdBUgotICAgIC8vIEFwcGVhcnMgdG8gaGF2ZSBwcm9ibGVtcyBwYWNraW5nIGNoYXJzCi0gICAgaWYgKG1WZWN0b3JTaXplID09IDQgJiYgbVR5cGUgPT0gUlNfVFlQRV9VTlNJR05FRF84KSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4KCJpbnQiKTsKLSAgICB9Ci0KLQotICAgIFN0cmluZzggcyhnQ1ZlY1R5cGVTdHJpbmdzW21UeXBlXSk7Ci0gICAgc3ByaW50ZihidWYsICJfJWlfdCIsIG1WZWN0b3JTaXplKTsKLSAgICBzLmFwcGVuZChidWYpOwotICAgIHJldHVybiBzOwotfQotCiBTdHJpbmc4IENvbXBvbmVudDo6Z2V0R0xTTFR5cGUoKSBjb25zdAogewogICAgIGlmIChtVHlwZSA9PSBSU19UWVBFX1NJR05FRF8zMikgewpAQCAtMjgyLDEwICsyMzgsMTkgQEAKICAgICAgICAgY2FzZSA0OiByZXR1cm4gU3RyaW5nOCgidmVjNCIpOwogICAgICAgICB9CiAgICAgfQorICAgIGlmICgobVR5cGUgPT0gUlNfVFlQRV9NQVRSSVhfNFg0KSAmJiAobVZlY3RvclNpemUgPT0gMSkpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoIm1hdDQiKTsKKyAgICB9CisgICAgaWYgKChtVHlwZSA9PSBSU19UWVBFX01BVFJJWF8zWDMpICYmIChtVmVjdG9yU2l6ZSA9PSAxKSkgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgibWF0MyIpOworICAgIH0KKyAgICBpZiAoKG1UeXBlID09IFJTX1RZUEVfTUFUUklYXzJYMikgJiYgKG1WZWN0b3JTaXplID09IDEpKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJtYXQyIik7CisgICAgfQogICAgIHJldHVybiBTdHJpbmc4KCk7CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyICogZ1R5cGVTdHJpbmdzW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGdUeXBlQmFzaWNTdHJpbmdzW10gPSB7CiAgICAgIk5PTkUiLAogICAgICJGMTYiLAogICAgICJGMzIiLApAQCAtMjk4LDkgKzI2MywxNiBAQAogICAgICJVMTYiLAogICAgICJVMzIiLAogICAgICJVNjQiLAorICAgICJCT09MRUFOIiwKICAgICAiVVBfNTY1IiwKICAgICAiVVBfNTU1MSIsCiAgICAgIlVQXzQ0NDQiLAorICAgICJNQVRSSVhfNFg0IiwKKyAgICAiTUFUUklYXzNYMyIsCisgICAgIk1BVFJJWF8yWDIiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBnVHlwZU9ialN0cmluZ3NbXSA9IHsKICAgICAiRUxFTUVOVCIsCiAgICAgIlRZUEUiLAogICAgICJBTExPQ0FUSU9OIiwKQEAgLTMzMCw4ICszMDIsMzQgQEAKIAogdm9pZCBDb21wb25lbnQ6OmR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3QKIHsKLSAgICBMT0dWKCIlcyAgIENvbXBvbmVudDogJXMsICVzLCB2ZWN0b3JTaXplPSVpLCBiaXRzPSVpIiwKLSAgICAgICAgIHByZWZpeCwgZ1R5cGVTdHJpbmdzW21UeXBlXSwgZ0tpbmRTdHJpbmdzW21LaW5kXSwgbVZlY3RvclNpemUsIG1CaXRzKTsKKyAgICBpZiAobVR5cGUgPj0gUlNfVFlQRV9FTEVNRU5UKSB7CisgICAgICAgIExPR1YoIiVzICAgQ29tcG9uZW50OiAlcywgJXMsIHZlY3RvclNpemU9JWksIGJpdHM9JWkiLAorICAgICAgICAgICAgIHByZWZpeCwgZ1R5cGVPYmpTdHJpbmdzW21UeXBlIC0gUlNfVFlQRV9FTEVNRU5UXSwgZ0tpbmRTdHJpbmdzW21LaW5kXSwgbVZlY3RvclNpemUsIG1CaXRzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dWKCIlcyAgIENvbXBvbmVudDogJXMsICVzLCB2ZWN0b3JTaXplPSVpLCBiaXRzPSVpIiwKKyAgICAgICAgICAgICBwcmVmaXgsIGdUeXBlQmFzaWNTdHJpbmdzW21UeXBlXSwgZ0tpbmRTdHJpbmdzW21LaW5kXSwgbVZlY3RvclNpemUsIG1CaXRzKTsKKyAgICB9CiB9CiAKK3ZvaWQgQ29tcG9uZW50OjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIHN0cmVhbS0+YWRkVTgoKHVpbnQ4X3QpbVR5cGUpOworICAgIHN0cmVhbS0+YWRkVTgoKHVpbnQ4X3QpbUtpbmQpOworICAgIHN0cmVhbS0+YWRkVTgoKHVpbnQ4X3QpKG1Ob3JtYWxpemVkID8gMSA6IDApKTsKKyAgICBzdHJlYW0tPmFkZFUzMihtVmVjdG9yU2l6ZSk7Cit9CisKK3ZvaWQgQ29tcG9uZW50Ojpsb2FkRnJvbVN0cmVhbShJU3RyZWFtICpzdHJlYW0pCit7CisgICAgbVR5cGUgPSAoUnNEYXRhVHlwZSlzdHJlYW0tPmxvYWRVOCgpOworICAgIG1LaW5kID0gKFJzRGF0YUtpbmQpc3RyZWFtLT5sb2FkVTgoKTsKKyAgICB1aW50OF90IHRlbXAgPSBzdHJlYW0tPmxvYWRVOCgpOworICAgIG1Ob3JtYWxpemVkID0gdGVtcCAhPSAwOworICAgIG1WZWN0b3JTaXplID0gc3RyZWFtLT5sb2FkVTMyKCk7CisKKyAgICBzZXQobVR5cGUsIG1LaW5kLCBtTm9ybWFsaXplZCwgbVZlY3RvclNpemUpOworfQorCisKKwogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQ29tcG9uZW50LmggYi9saWJzL3JzL3JzQ29tcG9uZW50LmgKaW5kZXggNzFkZTMyNC4uYTc3NTA1MSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0NvbXBvbmVudC5oCisrKyBiL2xpYnMvcnMvcnNDb21wb25lbnQuaApAQCAtMzUsNyArMzUsNiBAQAogCiAgICAgdWludDMyX3QgZ2V0R0xUeXBlKCkgY29uc3Q7CiAgICAgdWludDMyX3QgZ2V0R0xGb3JtYXQoKSBjb25zdDsKLSAgICBTdHJpbmc4IGdldENUeXBlKCkgY29uc3Q7CiAgICAgU3RyaW5nOCBnZXRHTFNMVHlwZSgpIGNvbnN0OwogICAgIHZvaWQgZHVtcExPR1YoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdDsKIApAQCAtNDgsNiArNDcsMTIgQEAKICAgICBib29sIGdldElzU2lnbmVkKCkgY29uc3Qge3JldHVybiBtSXNTaWduZWQ7fQogICAgIHVpbnQzMl90IGdldEJpdHMoKSBjb25zdCB7cmV0dXJuIG1CaXRzO30KIAorICAgIC8vIEhlbHBlcnMgZm9yIHJlYWRpbmcgLyB3cml0aW5nIHRoaXMgY2xhc3Mgb3V0CisgICAgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2b2lkIGxvYWRGcm9tU3RyZWFtKElTdHJlYW0gKnN0cmVhbSk7CisKKyAgICBib29sIGlzUmVmZXJlbmNlKCkgY29uc3Q7CisKIHByb3RlY3RlZDoKICAgICBSc0RhdGFUeXBlIG1UeXBlOwogICAgIFJzRGF0YUtpbmQgbUtpbmQ7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQ29udGV4dC5jcHAgYi9saWJzL3JzL3JzQ29udGV4dC5jcHAKaW5kZXggNTk2ZjUzMy4uMzBhZGQ2MiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0NvbnRleHQuY3BwCisrKyBiL2xpYnMvcnMvcnNDb250ZXh0LmNwcApAQCAtMjMsNiArMjMsNyBAQAogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKQEAgLTMyLDYgKzMzLDggQEAKICNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KIAogI2luY2x1ZGUgPGN1dGlscy9zY2hlZF9wb2xpY3kuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC04Nyw3ICs5MCw3IEBACiAgICAgY29uZmlnQXR0cmlic1B0clswXSA9IEVHTF9OT05FOwogICAgIHJzQXNzZXJ0KGNvbmZpZ0F0dHJpYnNQdHIgPCAoY29uZmlnQXR0cmlicyArIChzaXplb2YoY29uZmlnQXR0cmlicykgLyBzaXplb2YoRUdMaW50KSkpKTsKIAotICAgIExPR1YoImluaXRFR0wgc3RhcnQiKTsKKyAgICBMT0dWKCIlcCBpbml0RUdMIHN0YXJ0IiwgdGhpcyk7CiAgICAgbUVHTC5tRGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7CiAgICAgY2hlY2tFZ2xFcnJvcigiZWdsR2V0RGlzcGxheSIpOwogCkBAIC05Niw3ICs5OSw3IEBACiAKICAgICBzdGF0dXNfdCBlcnIgPSBFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93KG1FR0wubURpc3BsYXksIGNvbmZpZ0F0dHJpYnMsIG1XbmRTdXJmYWNlLCAmbUVHTC5tQ29uZmlnKTsKICAgICBpZiAoZXJyKSB7Ci0gICAgICAgTE9HRSgiY291bGRuJ3QgZmluZCBhbiBFR0xDb25maWcgbWF0Y2hpbmcgdGhlIHNjcmVlbiBmb3JtYXRcbiIpOworICAgICAgIExPR0UoIiVwLCBjb3VsZG4ndCBmaW5kIGFuIEVHTENvbmZpZyBtYXRjaGluZyB0aGUgc2NyZWVuIGZvcm1hdFxuIiwgdGhpcyk7CiAgICAgfQogICAgIC8vZWdsQ2hvb3NlQ29uZmlnKG1FR0wubURpc3BsYXksIGNvbmZpZ0F0dHJpYnMsICZtRUdMLm1Db25maWcsIDEsICZtRUdMLm1OdW1Db25maWdzKTsKIApAQCAtMTA4LDE0ICsxMTEsMTQgQEAKICAgICB9CiAgICAgY2hlY2tFZ2xFcnJvcigiZWdsQ3JlYXRlQ29udGV4dCIpOwogICAgIGlmIChtRUdMLm1Db250ZXh0ID09IEVHTF9OT19DT05URVhUKSB7Ci0gICAgICAgIExPR0UoImVnbENyZWF0ZUNvbnRleHQgcmV0dXJuZWQgRUdMX05PX0NPTlRFWFQiKTsKKyAgICAgICAgTE9HRSgiJXAsIGVnbENyZWF0ZUNvbnRleHQgcmV0dXJuZWQgRUdMX05PX0NPTlRFWFQiLCB0aGlzKTsKICAgICB9CiAgICAgZ0dMQ29udGV4dENvdW50Kys7CiB9CiAKIHZvaWQgQ29udGV4dDo6ZGVpbml0RUdMKCkKIHsKLSAgICBMT0dWKCJkZWluaXRFR0wiKTsKKyAgICBMT0dWKCIlcCwgZGVpbml0RUdMIiwgdGhpcyk7CiAgICAgc2V0U3VyZmFjZSgwLCAwLCBOVUxMKTsKICAgICBlZ2xEZXN0cm95Q29udGV4dChtRUdMLm1EaXNwbGF5LCBtRUdMLm1Db250ZXh0KTsKICAgICBjaGVja0VnbEVycm9yKCJlZ2xEZXN0cm95Q29udGV4dCIpOwpAQCAtMTI3LDE5ICsxMzAsMjEgQEAKIH0KIAogCi11aW50MzJfdCBDb250ZXh0OjpydW5TY3JpcHQoU2NyaXB0ICpzLCB1aW50MzJfdCBsYXVuY2hJRCkKK3VpbnQzMl90IENvbnRleHQ6OnJ1blNjcmlwdChTY3JpcHQgKnMpCiB7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnQ+IGZyYWcobUZyYWdtZW50KTsKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1WZXJ0ZXg+IHZ0eChtVmVydGV4KTsKLSAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudFN0b3JlPiBzdG9yZShtRnJhZ21lbnRTdG9yZSk7CisgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtU3RvcmU+IHN0b3JlKG1GcmFnbWVudFN0b3JlKTsKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1SYXN0ZXI+IHJhc3RlcihtUmFzdGVyKTsKKyAgICBPYmplY3RCYXNlUmVmPEZvbnQ+IGZvbnQobUZvbnQpOwogCi0gICAgdWludDMyX3QgcmV0ID0gcy0+cnVuKHRoaXMsIGxhdW5jaElEKTsKKyAgICB1aW50MzJfdCByZXQgPSBzLT5ydW4odGhpcyk7CiAKICAgICBtRnJhZ21lbnQuc2V0KGZyYWcpOwogICAgIG1WZXJ0ZXguc2V0KHZ0eCk7CiAgICAgbUZyYWdtZW50U3RvcmUuc2V0KHN0b3JlKTsKICAgICBtUmFzdGVyLnNldChyYXN0ZXIpOworICAgIG1Gb250LnNldChmb250KTsKICAgICByZXR1cm4gcmV0OwogfQogCkBAIC0xNDcsNDIgKzE1MiwxOSBAQAogewogICAgIEdMZW51bSBlcnIgPSBnbEdldEVycm9yKCk7CiAgICAgaWYgKGVyciAhPSBHTF9OT19FUlJPUikgewotICAgICAgICBMT0dFKCJHTCBFcnJvciwgMHgleCwgZnJvbSAlcyIsIGVyciwgbXNnKTsKKyAgICAgICAgTE9HRSgiJXAsIEdMIEVycm9yLCAweCV4LCBmcm9tICVzIiwgdGhpcywgZXJyLCBtc2cpOwogICAgIH0KIH0KIAogdWludDMyX3QgQ29udGV4dDo6cnVuUm9vdFNjcmlwdCgpCiB7Ci0gICAgdGltZXJTZXQoUlNfVElNRVJfQ0xFQVJfU1dBUCk7Ci0gICAgcnNBc3NlcnQobVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1Jc1Jvb3QpOwotCi0gICAgZWdsUXVlcnlTdXJmYWNlKG1FR0wubURpc3BsYXksIG1FR0wubVN1cmZhY2UsIEVHTF9XSURUSCwgJm1FR0wubVdpZHRoKTsKLSAgICBlZ2xRdWVyeVN1cmZhY2UobUVHTC5tRGlzcGxheSwgbUVHTC5tU3VyZmFjZSwgRUdMX0hFSUdIVCwgJm1FR0wubUhlaWdodCk7Ci0gICAgZ2xWaWV3cG9ydCgwLCAwLCBtRUdMLm1XaWR0aCwgbUVHTC5tSGVpZ2h0KTsKLSAgICBnbENvbG9yTWFzayhHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFKTsKLQotICAgIGdsQ2xlYXJDb2xvcihtUm9vdFNjcmlwdC0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMF0sCi0gICAgICAgICAgICAgICAgIG1Sb290U2NyaXB0LT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsxXSwKLSAgICAgICAgICAgICAgICAgbVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzJdLAotICAgICAgICAgICAgICAgICBtUm9vdFNjcmlwdC0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbM10pOwotICAgIGlmIChtVXNlRGVwdGgpIHsKLSAgICAgICAgZ2xEZXB0aE1hc2soR0xfVFJVRSk7Ci0gICAgICAgIGdsQ2xlYXJEZXB0aGYobVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1DbGVhckRlcHRoKTsKLSAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICB9CisgICAgZ2xWaWV3cG9ydCgwLCAwLCBtV2lkdGgsIG1IZWlnaHQpOwogCiAgICAgdGltZXJTZXQoUlNfVElNRVJfU0NSSVBUKTsKICAgICBtU3RhdGVGcmFnbWVudFN0b3JlLm1MYXN0LmNsZWFyKCk7Ci0gICAgdWludDMyX3QgcmV0ID0gcnVuU2NyaXB0KG1Sb290U2NyaXB0LmdldCgpLCAwKTsKKyAgICB1aW50MzJfdCByZXQgPSBydW5TY3JpcHQobVJvb3RTY3JpcHQuZ2V0KCkpOwogCiAgICAgY2hlY2tFcnJvcigicnVuUm9vdFNjcmlwdCIpOwotICAgIGlmIChtRXJyb3IgIT0gUlNfRVJST1JfTk9ORSkgewotICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIGVycm9yIGNvbmRpdGlvbiB3ZSBzdG9wIHJlbmRlcmluZyB1bnRpbAotICAgICAgICAvLyBzb210aGluZyBjaGFuZ2VzIHRoYXQgbWlnaHQgZml4IGl0LgotICAgICAgICByZXQgPSAwOwotICAgIH0KICAgICByZXR1cm4gcmV0OwogfQogCkBAIC0yMDYsNiArMTg4LDkgQEAKICAgICBtVGltZUZyYW1lID0gbVRpbWVMYXN0OwogICAgIG1UaW1lTGFzdEZyYW1lID0gbVRpbWVMYXN0OwogICAgIG1UaW1lckFjdGl2ZSA9IFJTX1RJTUVSX0lOVEVSTkFMOworICAgIG1BdmVyYWdlRlBTRnJhbWVDb3VudCA9IDA7CisgICAgbUF2ZXJhZ2VGUFNTdGFydFRpbWUgPSBtVGltZUxhc3Q7CisgICAgbUF2ZXJhZ2VGUFMgPSAwOwogICAgIHRpbWVyUmVzZXQoKTsKIH0KIApAQCAtMjEzLDYgKzE5OCwxNiBAQAogewogICAgIG1UaW1lTGFzdEZyYW1lID0gbVRpbWVGcmFtZTsKICAgICBtVGltZUZyYW1lID0gZ2V0VGltZSgpOworICAgIC8vIFVwZGF0ZSBhdmVyYWdlIGZwcworICAgIGNvbnN0IHVpbnQ2NF90IGF2ZXJhZ2VGcmFtZXJhdGVJbnRlcnZhbCA9IDEwMDAgKiAxMDAwMDAwOworICAgIG1BdmVyYWdlRlBTRnJhbWVDb3VudCArKzsKKyAgICB1aW50NjRfdCBpbnZlcnZhbCA9IG1UaW1lRnJhbWUgLSBtQXZlcmFnZUZQU1N0YXJ0VGltZTsKKyAgICBpZihpbnZlcnZhbCA+PSBhdmVyYWdlRnJhbWVyYXRlSW50ZXJ2YWwpIHsKKyAgICAgICAgaW52ZXJ2YWwgPSBpbnZlcnZhbCAvIDEwMDAwMDA7CisgICAgICAgIG1BdmVyYWdlRlBTID0gKG1BdmVyYWdlRlBTRnJhbWVDb3VudCAqIDEwMDApIC8gaW52ZXJ2YWw7CisgICAgICAgIG1BdmVyYWdlRlBTRnJhbWVDb3VudCA9IDA7CisgICAgICAgIG1BdmVyYWdlRlBTU3RhcnRUaW1lID0gbVRpbWVGcmFtZTsKKyAgICB9CiB9CiAKIHZvaWQgQ29udGV4dDo6dGltZXJTZXQoVGltZXJzIHRtKQpAQCAtMjM2LDM3ICsyMzEsMzQgQEAKIAogCiAgICAgaWYgKHByb3BzLm1Mb2dUaW1lcykgewotICAgICAgICBMT0dWKCJSUzogRnJhbWUgKCVpKSwgICBTY3JpcHQgJTIuMWYgKCVpKSwgIENsZWFyICYgU3dhcCAlMi4xZiAoJWkpLCAgSWRsZSAlMi4xZiAoJWxsaSksICBJbnRlcm5hbCAlMi4xZiAoJWxsaSkiLAorICAgICAgICBMT0dWKCJSUzogRnJhbWUgKCVpKSwgICBTY3JpcHQgJTIuMWYgKCVpKSwgIENsZWFyICYgU3dhcCAlMi4xZiAoJWkpLCAgSWRsZSAlMi4xZiAoJWxsaSksICBJbnRlcm5hbCAlMi4xZiAoJWxsaSksIEF2ZyBmcHM6ICV1IiwKICAgICAgICAgICAgICBtVGltZU1TTGFzdEZyYW1lLAogICAgICAgICAgICAgIDEwMC4wICogbVRpbWVyc1tSU19USU1FUl9TQ1JJUFRdIC8gdG90YWwsIG1UaW1lTVNMYXN0U2NyaXB0LAogICAgICAgICAgICAgIDEwMC4wICogbVRpbWVyc1tSU19USU1FUl9DTEVBUl9TV0FQXSAvIHRvdGFsLCBtVGltZU1TTGFzdFN3YXAsCiAgICAgICAgICAgICAgMTAwLjAgKiBtVGltZXJzW1JTX1RJTUVSX0lETEVdIC8gdG90YWwsIG1UaW1lcnNbUlNfVElNRVJfSURMRV0gLyAxMDAwMDAwLAotICAgICAgICAgICAgIDEwMC4wICogbVRpbWVyc1tSU19USU1FUl9JTlRFUk5BTF0gLyB0b3RhbCwgbVRpbWVyc1tSU19USU1FUl9JTlRFUk5BTF0gLyAxMDAwMDAwKTsKKyAgICAgICAgICAgICAxMDAuMCAqIG1UaW1lcnNbUlNfVElNRVJfSU5URVJOQUxdIC8gdG90YWwsIG1UaW1lcnNbUlNfVElNRVJfSU5URVJOQUxdIC8gMTAwMDAwMCwKKyAgICAgICAgICAgICBtQXZlcmFnZUZQUyk7CiAgICAgfQogfQogCiBib29sIENvbnRleHQ6OnNldHVwQ2hlY2soKQogewotICAgIGlmIChjaGVja1ZlcnNpb24yXzAoKSkgewotICAgICAgICBpZiAoIW1TaGFkZXJDYWNoZS5sb29rdXAodGhpcywgbVZlcnRleC5nZXQoKSwgbUZyYWdtZW50LmdldCgpKSkgewotICAgICAgICAgICAgTE9HRSgiQ29udGV4dDo6c2V0dXBDaGVjaygpIDEgZmFpbCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbUZyYWdtZW50U3RvcmUtPnNldHVwR0wyKHRoaXMsICZtU3RhdGVGcmFnbWVudFN0b3JlKTsKLSAgICAgICAgbUZyYWdtZW50LT5zZXR1cEdMMih0aGlzLCAmbVN0YXRlRnJhZ21lbnQsICZtU2hhZGVyQ2FjaGUpOwotICAgICAgICBtUmFzdGVyLT5zZXR1cEdMMih0aGlzLCAmbVN0YXRlUmFzdGVyKTsKLSAgICAgICAgbVZlcnRleC0+c2V0dXBHTDIodGhpcywgJm1TdGF0ZVZlcnRleCwgJm1TaGFkZXJDYWNoZSk7Ci0KLSAgICB9IGVsc2UgewotICAgICAgICBtRnJhZ21lbnRTdG9yZS0+c2V0dXBHTCh0aGlzLCAmbVN0YXRlRnJhZ21lbnRTdG9yZSk7Ci0gICAgICAgIG1GcmFnbWVudC0+c2V0dXBHTCh0aGlzLCAmbVN0YXRlRnJhZ21lbnQpOwotICAgICAgICBtUmFzdGVyLT5zZXR1cEdMKHRoaXMsICZtU3RhdGVSYXN0ZXIpOwotICAgICAgICBtVmVydGV4LT5zZXR1cEdMKHRoaXMsICZtU3RhdGVWZXJ0ZXgpOworICAgIGlmICghbVNoYWRlckNhY2hlLmxvb2t1cCh0aGlzLCBtVmVydGV4LmdldCgpLCBtRnJhZ21lbnQuZ2V0KCkpKSB7CisgICAgICAgIExPR0UoIkNvbnRleHQ6OnNldHVwQ2hlY2soKSAxIGZhaWwiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKworICAgIG1GcmFnbWVudFN0b3JlLT5zZXR1cEdMMih0aGlzLCAmbVN0YXRlRnJhZ21lbnRTdG9yZSk7CisgICAgbUZyYWdtZW50LT5zZXR1cEdMMih0aGlzLCAmbVN0YXRlRnJhZ21lbnQsICZtU2hhZGVyQ2FjaGUpOworICAgIG1SYXN0ZXItPnNldHVwR0wyKHRoaXMsICZtU3RhdGVSYXN0ZXIpOworICAgIG1WZXJ0ZXgtPnNldHVwR0wyKHRoaXMsICZtU3RhdGVWZXJ0ZXgsICZtU2hhZGVyQ2FjaGUpOwogICAgIHJldHVybiB0cnVlOwogfQogCit2b2lkIENvbnRleHQ6OnNldHVwUHJvZ3JhbVN0b3JlKCkgeworICAgIG1GcmFnbWVudFN0b3JlLT5zZXR1cEdMMih0aGlzLCAmbVN0YXRlRnJhZ21lbnRTdG9yZSk7Cit9CisKIHN0YXRpYyBib29sIGdldFByb3AoY29uc3QgY2hhciAqc3RyKQogewogICAgIGNoYXIgYnVmW1BST1BFUlRZX1ZBTFVFX01BWF07CkBAIC0yNzQsNiArMjY2LDI0IEBACiAgICAgcmV0dXJuIDAgIT0gc3RyY21wKGJ1ZiwgIjAiKTsKIH0KIAordm9pZCBDb250ZXh0OjpkaXNwbGF5RGVidWdTdGF0cygpCit7CisgICAgY2hhciBidWZmZXJbMTI4XTsKKyAgICBzcHJpbnRmKGJ1ZmZlciwgIkF2ZyBmcHMgJXUsIEZyYW1lICVpIG1zLCBTY3JpcHQgJWkgbXMiLCBtQXZlcmFnZUZQUywgbVRpbWVNU0xhc3RGcmFtZSwgbVRpbWVNU0xhc3RTY3JpcHQpOworICAgIGZsb2F0IG9sZFIsIG9sZEcsIG9sZEIsIG9sZEE7CisgICAgbVN0YXRlRm9udC5nZXRGb250Q29sb3IoJm9sZFIsICZvbGRHLCAmb2xkQiwgJm9sZEEpOworICAgIHVpbnQzMl90IGJ1ZmZlckxlbiA9IHN0cmxlbihidWZmZXIpOworCisgICAgZmxvYXQgc2hhZG93Q29sID0gMC4xZjsKKyAgICBtU3RhdGVGb250LnNldEZvbnRDb2xvcihzaGFkb3dDb2wsIHNoYWRvd0NvbCwgc2hhZG93Q29sLCAxLjBmKTsKKyAgICBtU3RhdGVGb250LnJlbmRlclRleHQoYnVmZmVyLCBidWZmZXJMZW4sIDUsIGdldEhlaWdodCgpIC0gNik7CisKKyAgICBtU3RhdGVGb250LnNldEZvbnRDb2xvcigxLjBmLCAwLjdmLCAwLjBmLCAxLjBmKTsKKyAgICBtU3RhdGVGb250LnJlbmRlclRleHQoYnVmZmVyLCBidWZmZXJMZW4sIDQsIGdldEhlaWdodCgpIC0gNyk7CisKKyAgICBtU3RhdGVGb250LnNldEZvbnRDb2xvcihvbGRSLCBvbGRHLCBvbGRCLCBvbGRBKTsKK30KKwogdm9pZCAqIENvbnRleHQ6OnRocmVhZFByb2Modm9pZCAqdnJzYykKIHsKICAgICAgQ29udGV4dCAqcnNjID0gc3RhdGljX2Nhc3Q8Q29udGV4dCAqPih2cnNjKTsKQEAgLTI4NiwyOCArMjk2LDM0IEBACiAgICAgIHJzYy0+cHJvcHMubUxvZ1NjcmlwdHMgPSBnZXRQcm9wKCJkZWJ1Zy5ycy5zY3JpcHQiKTsKICAgICAgcnNjLT5wcm9wcy5tTG9nT2JqZWN0cyA9IGdldFByb3AoImRlYnVnLnJzLm9iamVjdCIpOwogICAgICByc2MtPnByb3BzLm1Mb2dTaGFkZXJzID0gZ2V0UHJvcCgiZGVidWcucnMuc2hhZGVyIik7CisgICAgIHJzYy0+cHJvcHMubUxvZ1NoYWRlcnNBdHRyID0gZ2V0UHJvcCgiZGVidWcucnMuc2hhZGVyLmF0dHJpYnV0ZXMiKTsKKyAgICAgcnNjLT5wcm9wcy5tTG9nU2hhZGVyc1VuaWZvcm1zID0gZ2V0UHJvcCgiZGVidWcucnMuc2hhZGVyLnVuaWZvcm1zIik7CisgICAgIHJzYy0+cHJvcHMubUxvZ1Zpc3VhbCA9IGdldFByb3AoImRlYnVnLnJzLnZpc3VhbCIpOwogCi0gICAgIFNjcmlwdFRMU1N0cnVjdCAqdGxzU3RydWN0ID0gbmV3IFNjcmlwdFRMU1N0cnVjdDsKLSAgICAgaWYgKCF0bHNTdHJ1Y3QpIHsKKyAgICAgcnNjLT5tVGxzU3RydWN0ID0gbmV3IFNjcmlwdFRMU1N0cnVjdDsKKyAgICAgaWYgKCFyc2MtPm1UbHNTdHJ1Y3QpIHsKICAgICAgICAgIExPR0UoIkVycm9yIGFsbG9jYXRpbmcgdGxzIHN0b3JhZ2UiKTsKICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICB9Ci0gICAgIHRsc1N0cnVjdC0+bUNvbnRleHQgPSByc2M7Ci0gICAgIHRsc1N0cnVjdC0+bVNjcmlwdCA9IE5VTEw7Ci0gICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX3NldHNwZWNpZmljKHJzYy0+Z1RocmVhZFRMU0tleSwgdGxzU3RydWN0KTsKKyAgICAgcnNjLT5tVGxzU3RydWN0LT5tQ29udGV4dCA9IHJzYzsKKyAgICAgcnNjLT5tVGxzU3RydWN0LT5tU2NyaXB0ID0gTlVMTDsKKyAgICAgaW50IHN0YXR1cyA9IHB0aHJlYWRfc2V0c3BlY2lmaWMocnNjLT5nVGhyZWFkVExTS2V5LCByc2MtPm1UbHNTdHJ1Y3QpOwogICAgICBpZiAoc3RhdHVzKSB7CiAgICAgICAgICBMT0dFKCJwdGhyZWFkX3NldHNwZWNpZmljICVpIiwgc3RhdHVzKTsKICAgICAgfQogCisgICAgIHJzYy0+bVNjcmlwdEMuaW5pdChyc2MpOwogICAgICBpZiAocnNjLT5tSXNHcmFwaGljc0NvbnRleHQpIHsKLSAgICAgICAgIHJzYy0+bVN0YXRlUmFzdGVyLmluaXQocnNjLCByc2MtPm1FR0wubVdpZHRoLCByc2MtPm1FR0wubUhlaWdodCk7CisgICAgICAgICByc2MtPm1TdGF0ZVJhc3Rlci5pbml0KHJzYyk7CiAgICAgICAgICByc2MtPnNldFJhc3RlcihOVUxMKTsKLSAgICAgICAgIHJzYy0+bVN0YXRlVmVydGV4LmluaXQocnNjLCByc2MtPm1FR0wubVdpZHRoLCByc2MtPm1FR0wubUhlaWdodCk7CisgICAgICAgICByc2MtPm1TdGF0ZVZlcnRleC5pbml0KHJzYyk7CiAgICAgICAgICByc2MtPnNldFZlcnRleChOVUxMKTsKLSAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnQuaW5pdChyc2MsIHJzYy0+bUVHTC5tV2lkdGgsIHJzYy0+bUVHTC5tSGVpZ2h0KTsKKyAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnQuaW5pdChyc2MpOwogICAgICAgICAgcnNjLT5zZXRGcmFnbWVudChOVUxMKTsKLSAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5pbml0KHJzYywgcnNjLT5tRUdMLm1XaWR0aCwgcnNjLT5tRUdMLm1IZWlnaHQpOworICAgICAgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLmluaXQocnNjKTsKICAgICAgICAgIHJzYy0+c2V0RnJhZ21lbnRTdG9yZShOVUxMKTsKKyAgICAgICAgIHJzYy0+bVN0YXRlRm9udC5pbml0KHJzYyk7CisgICAgICAgICByc2MtPnNldEZvbnQoTlVMTCk7CiAgICAgICAgICByc2MtPm1TdGF0ZVZlcnRleEFycmF5LmluaXQocnNjKTsKICAgICAgfQogCkBAIC0zMjEsNiArMzM3LDExIEBACiAgICAgICAgICB1aW50MzJfdCB0YXJnZXRUaW1lID0gMDsKICAgICAgICAgIGlmIChtRHJhdyAmJiByc2MtPm1Jc0dyYXBoaWNzQ29udGV4dCkgewogICAgICAgICAgICAgIHRhcmdldFRpbWUgPSByc2MtPnJ1blJvb3RTY3JpcHQoKTsKKworICAgICAgICAgICAgIGlmKHJzYy0+cHJvcHMubUxvZ1Zpc3VhbCkgeworICAgICAgICAgICAgICAgICByc2MtPmRpc3BsYXlEZWJ1Z1N0YXRzKCk7CisgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgbURyYXcgPSB0YXJnZXRUaW1lICYmICFyc2MtPm1QYXVzZWQ7CiAgICAgICAgICAgICAgcnNjLT50aW1lclNldChSU19USU1FUl9DTEVBUl9TV0FQKTsKICAgICAgICAgICAgICBlZ2xTd2FwQnVmZmVycyhyc2MtPm1FR0wubURpc3BsYXksIHJzYy0+bUVHTC5tU3VyZmFjZSk7CkBAIC0zMjksOSArMzUwLDYgQEAKICAgICAgICAgICAgICByc2MtPnRpbWVyUHJpbnQoKTsKICAgICAgICAgICAgICByc2MtPnRpbWVyUmVzZXQoKTsKICAgICAgICAgIH0KLSAgICAgICAgIGlmIChyc2MtPm1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSkgewotICAgICAgICAgICAgIHJzYy0+b2JqRGVzdHJveU9PQlJ1bigpOwotICAgICAgICAgfQogICAgICAgICAgaWYgKHJzYy0+bVRocmVhZFByaW9yaXR5ID4gMCAmJiB0YXJnZXRUaW1lKSB7CiAgICAgICAgICAgICAgaW50MzJfdCB0ID0gKHRhcmdldFRpbWUgLSAoaW50MzJfdCkocnNjLT5tVGltZU1TTGFzdFNjcmlwdCArIHJzYy0+bVRpbWVNU0xhc3RTd2FwKSkgKiAxMDAwOwogICAgICAgICAgICAgIGlmICh0ID4gMCkgewpAQCAtMzQwLDMzICszNTgsODUgQEAKICAgICAgICAgIH0KICAgICAgfQogCi0gICAgIExPR1YoIlJTIFRocmVhZCBleGl0aW5nIik7CisgICAgIExPR1YoIiVwLCBSUyBUaHJlYWQgZXhpdGluZyIsIHJzYyk7CiAgICAgIGlmIChyc2MtPm1Jc0dyYXBoaWNzQ29udGV4dCkgewogICAgICAgICAgcnNjLT5tUmFzdGVyLmNsZWFyKCk7CiAgICAgICAgICByc2MtPm1GcmFnbWVudC5jbGVhcigpOwogICAgICAgICAgcnNjLT5tVmVydGV4LmNsZWFyKCk7CiAgICAgICAgICByc2MtPm1GcmFnbWVudFN0b3JlLmNsZWFyKCk7CisgICAgICAgICByc2MtPm1Gb250LmNsZWFyKCk7CiAgICAgICAgICByc2MtPm1Sb290U2NyaXB0LmNsZWFyKCk7CiAgICAgICAgICByc2MtPm1TdGF0ZVJhc3Rlci5kZWluaXQocnNjKTsKICAgICAgICAgIHJzYy0+bVN0YXRlVmVydGV4LmRlaW5pdChyc2MpOwogICAgICAgICAgcnNjLT5tU3RhdGVGcmFnbWVudC5kZWluaXQocnNjKTsKICAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5kZWluaXQocnNjKTsKKyAgICAgICAgIHJzYy0+bVN0YXRlRm9udC5kZWluaXQocnNjKTsKICAgICAgfQogICAgICBPYmplY3RCYXNlOjp6ZXJvQWxsVXNlclJlZihyc2MpOwogCi0gICAgIHJzYy0+bU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5ID0gdHJ1ZTsKLSAgICAgcnNjLT5vYmpEZXN0cm95T09CUnVuKCk7Ci0KICAgICAgaWYgKHJzYy0+bUlzR3JhcGhpY3NDb250ZXh0KSB7CiAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmdJbml0TXV0ZXgpOwogICAgICAgICAgcnNjLT5kZWluaXRFR0woKTsKICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnSW5pdE11dGV4KTsKICAgICAgfQorICAgICBkZWxldGUgcnNjLT5tVGxzU3RydWN0OwogCi0gICAgIExPR1YoIlJTIFRocmVhZCBleGl0ZWQiKTsKKyAgICAgTE9HVigiJXAsIFJTIFRocmVhZCBleGl0ZWQiLCByc2MpOwogICAgICByZXR1cm4gTlVMTDsKIH0KIAordm9pZCAqIENvbnRleHQ6OmhlbHBlclRocmVhZFByb2Modm9pZCAqdnJzYykKK3sKKyAgICAgQ29udGV4dCAqcnNjID0gc3RhdGljX2Nhc3Q8Q29udGV4dCAqPih2cnNjKTsKKyAgICAgdWludDMyX3QgaWR4ID0gKHVpbnQzMl90KWFuZHJvaWRfYXRvbWljX2luYygmcnNjLT5tV29ya2Vycy5tTGF1bmNoQ291bnQpOworCisgICAgIExPR1YoIlJTIGhlbHBlclRocmVhZCBzdGFydGluZyAlcCBpZHg9JWkiLCByc2MsIGlkeCk7CisKKyAgICAgcnNjLT5tV29ya2Vycy5tTGF1bmNoU2lnbmFsc1tpZHhdLmluaXQoKTsKKyAgICAgcnNjLT5tV29ya2Vycy5tTmF0aXZlVGhyZWFkSWRbaWR4XSA9IGdldHRpZCgpOworCisjaWYgMAorICAgICB0eXBlZGVmIHN0cnVjdCB7dWludDY0X3QgYml0c1sxMDI0IC8gNjRdOyB9IGNwdV9zZXRfdDsKKyAgICAgY3B1X3NldF90IGNwdXNldDsKKyAgICAgbWVtc2V0KCZjcHVzZXQsIDAsIHNpemVvZihjcHVzZXQpKTsKKyAgICAgY3B1c2V0LmJpdHNbaWR4IC8gNjRdIHw9IDFVTEwgPDwgKGlkeCAlIDY0KTsKKyAgICAgaW50IHJldCA9IHN5c2NhbGwoMjQxLCByc2MtPm1Xb3JrZXJzLm1OYXRpdmVUaHJlYWRJZFtpZHhdLAorICAgICAgICAgICAgICAgc2l6ZW9mKGNwdXNldCksICZjcHVzZXQpOworICAgICBMT0dFKCJTRVRBRkZJTklUWSByZXQgPSAlaSAlcyIsIHJldCwgRUdMVXRpbHM6OnN0cmVycm9yKHJldCkpOworI2VuZGlmCisKKyAgICAgc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCByc2MtPm1Xb3JrZXJzLm1OYXRpdmVUaHJlYWRJZFtpZHhdLCByc2MtPm1UaHJlYWRQcmlvcml0eSk7CisgICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX3NldHNwZWNpZmljKHJzYy0+Z1RocmVhZFRMU0tleSwgcnNjLT5tVGxzU3RydWN0KTsKKyAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgTE9HRSgicHRocmVhZF9zZXRzcGVjaWZpYyAlaSIsIHN0YXR1cyk7CisgICAgIH0KKworICAgICB3aGlsZShyc2MtPm1SdW5uaW5nKSB7CisgICAgICAgICByc2MtPm1Xb3JrZXJzLm1MYXVuY2hTaWduYWxzW2lkeF0ud2FpdCgpOworICAgICAgICAgaWYgKHJzYy0+bVdvcmtlcnMubUxhdW5jaENhbGxiYWNrKSB7CisgICAgICAgICAgICByc2MtPm1Xb3JrZXJzLm1MYXVuY2hDYWxsYmFjayhyc2MtPm1Xb3JrZXJzLm1MYXVuY2hEYXRhLCBpZHgpOworICAgICAgICAgfQorICAgICAgICAgYW5kcm9pZF9hdG9taWNfZGVjKCZyc2MtPm1Xb3JrZXJzLm1SdW5uaW5nQ291bnQpOworICAgICAgICAgcnNjLT5tV29ya2Vycy5tQ29tcGxldGVTaWduYWwuc2V0KCk7CisgICAgIH0KKworICAgICBMT0dWKCJSUyBoZWxwZXJUaHJlYWQgZXhpdGluZyAlcCBpZHg9JWkiLCByc2MsIGlkeCk7CisgICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIENvbnRleHQ6OmxhdW5jaFRocmVhZHMoV29ya2VyQ2FsbGJhY2tfdCBjYmssIHZvaWQgKmRhdGEpCit7CisgICAgbVdvcmtlcnMubUxhdW5jaERhdGEgPSBkYXRhOworICAgIG1Xb3JrZXJzLm1MYXVuY2hDYWxsYmFjayA9IGNiazsKKyAgICBtV29ya2Vycy5tUnVubmluZ0NvdW50ID0gKGludCltV29ya2Vycy5tQ291bnQ7CisgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgbVdvcmtlcnMubUNvdW50OyBjdCsrKSB7CisgICAgICAgIG1Xb3JrZXJzLm1MYXVuY2hTaWduYWxzW2N0XS5zZXQoKTsKKyAgICB9CisgICAgd2hpbGUobVdvcmtlcnMubVJ1bm5pbmdDb3VudCkgeworICAgICAgICBtV29ya2Vycy5tQ29tcGxldGVTaWduYWwud2FpdCgpOworICAgIH0KK30KKwogdm9pZCBDb250ZXh0OjpzZXRQcmlvcml0eShpbnQzMl90IHApCiB7CiAgICAgLy8gTm90ZTogSWYgd2UgcHV0IHRoaXMgaW4gdGhlIHByb3BlciAiYmFja2dyb3VuZCIgcG9saWN5CkBAIC0zODMsNyArNDUzLDEwIEBACiAgICAgICAgIC8vIHN1Y2Nlc3M7IHJlc2V0IHRoZSBwcmlvcml0eSBhcyB3ZWxsCiAgICAgfQogI2Vsc2UKLSAgICAgICAgc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCBtTmF0aXZlVGhyZWFkSWQsIHApOworICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgbU5hdGl2ZVRocmVhZElkLCBwKTsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVdvcmtlcnMubUNvdW50OyBjdCsrKSB7CisgICAgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgbVdvcmtlcnMubU5hdGl2ZVRocmVhZElkW2N0XSwgcCk7CisgICAgfQogI2VuZGlmCiB9CiAKQEAgLTQyOSwyMCArNTAyLDQwIEBACiAKICAgICBtV25kU3VyZmFjZSA9IE5VTEw7CiAKLSAgICBvYmpEZXN0cm95T09CSW5pdCgpOwogICAgIHRpbWVySW5pdCgpOwogICAgIHRpbWVyU2V0KFJTX1RJTUVSX0lOVEVSTkFMKTsKIAotICAgIExPR1YoIlJTIExhdW5jaGluZyB0aHJlYWQiKTsKKyAgICBpbnQgY3B1ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisgICAgTE9HVigiUlMgTGF1bmNoaW5nIHRocmVhZChzKSwgcmVwb3J0ZWQgQ1BVIGNvdW50ICVpIiwgY3B1KTsKKyAgICBpZiAoY3B1IDwgMikgY3B1ID0gMDsKKworICAgIG1Xb3JrZXJzLm1Db3VudCA9ICh1aW50MzJfdCljcHU7CisgICAgbVdvcmtlcnMubVRocmVhZElkID0gKHB0aHJlYWRfdCAqKSBjYWxsb2MobVdvcmtlcnMubUNvdW50LCBzaXplb2YocHRocmVhZF90KSk7CisgICAgbVdvcmtlcnMubU5hdGl2ZVRocmVhZElkID0gKHBpZF90ICopIGNhbGxvYyhtV29ya2Vycy5tQ291bnQsIHNpemVvZihwaWRfdCkpOworICAgIG1Xb3JrZXJzLm1MYXVuY2hTaWduYWxzID0gbmV3IFNpZ25hbFttV29ya2Vycy5tQ291bnRdOworICAgIG1Xb3JrZXJzLm1MYXVuY2hDYWxsYmFjayA9IE5VTEw7CiAgICAgc3RhdHVzID0gcHRocmVhZF9jcmVhdGUoJm1UaHJlYWRJZCwgJnRocmVhZEF0dHIsIHRocmVhZFByb2MsIHRoaXMpOwogICAgIGlmIChzdGF0dXMpIHsKICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHN0YXJ0IHJzIGNvbnRleHQgdGhyZWFkLiIpOworICAgICAgICByZXR1cm47CiAgICAgfQotCiAgICAgd2hpbGUoIW1SdW5uaW5nKSB7CiAgICAgICAgIHVzbGVlcCgxMDApOwogICAgIH0KIAorICAgIG1Xb3JrZXJzLm1Db21wbGV0ZVNpZ25hbC5pbml0KCk7CisgICAgbVdvcmtlcnMubVJ1bm5pbmdDb3VudCA9IDA7CisgICAgbVdvcmtlcnMubUxhdW5jaENvdW50ID0gMDsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVdvcmtlcnMubUNvdW50OyBjdCsrKSB7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY3JlYXRlKCZtV29ya2Vycy5tVGhyZWFkSWRbY3RdLCAmdGhyZWFkQXR0ciwgaGVscGVyVGhyZWFkUHJvYywgdGhpcyk7CisgICAgICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgICAgIG1Xb3JrZXJzLm1Db3VudCA9IGN0OworICAgICAgICAgICAgTE9HRSgiQ3JlYXRlZCBmZXdlciB0aGFuIGV4cGVjdGVkIG51bWJlciBvZiBSUyB0aHJlYWRzLiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKwogICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZ0aHJlYWRBdHRyKTsKIH0KIApAQCAtNDU1LDggKzU0OCw2IEBACiAKICAgICBtSU8uc2h1dGRvd24oKTsKICAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9qb2luKG1UaHJlYWRJZCwgJnJlcyk7Ci0gICAgbU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5ID0gdHJ1ZTsKLSAgICBvYmpEZXN0cm95T09CUnVuKCk7CiAKICAgICAvLyBHbG9iYWwgc3RydWN0dXJlIGNsZWFudXAuCiAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnSW5pdE11dGV4KTsKQEAgLTQ2OSw4ICs1NjAsNiBAQAogICAgICAgICBtRGV2ID0gTlVMTDsKICAgICB9CiAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdJbml0TXV0ZXgpOwotCi0gICAgb2JqRGVzdHJveU9PQkRlc3Ryb3koKTsKIH0KIAogdm9pZCBDb250ZXh0OjpzZXRTdXJmYWNlKHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIEFOYXRpdmVXaW5kb3cgKnN1cikKQEAgLTQ4NiwxNCArNTc1LDE0IEBACiAgICAgICAgIGNoZWNrRWdsRXJyb3IoImVnbERlc3Ryb3lTdXJmYWNlIiwgcmV0KTsKIAogICAgICAgICBtRUdMLm1TdXJmYWNlID0gTlVMTDsKLSAgICAgICAgbUVHTC5tV2lkdGggPSAwOwotICAgICAgICBtRUdMLm1IZWlnaHQgPSAwOwogICAgICAgICBtV2lkdGggPSAwOwogICAgICAgICBtSGVpZ2h0ID0gMDsKICAgICB9CiAKICAgICBtV25kU3VyZmFjZSA9IHN1cjsKICAgICBpZiAobVduZFN1cmZhY2UgIT0gTlVMTCkgeworICAgICAgICBtV2lkdGggPSB3OworICAgICAgICBtSGVpZ2h0ID0gaDsKICAgICAgICAgYm9vbCBmaXJzdCA9IGZhbHNlOwogICAgICAgICBpZiAoIW1FR0wubUNvbnRleHQpIHsKICAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKQEAgLTUxMSwxNSArNjAwLDcgQEAKICAgICAgICAgcmV0ID0gZWdsTWFrZUN1cnJlbnQobUVHTC5tRGlzcGxheSwgbUVHTC5tU3VyZmFjZSwgbUVHTC5tU3VyZmFjZSwgbUVHTC5tQ29udGV4dCk7CiAgICAgICAgIGNoZWNrRWdsRXJyb3IoImVnbE1ha2VDdXJyZW50IiwgcmV0KTsKIAotICAgICAgICBlZ2xRdWVyeVN1cmZhY2UobUVHTC5tRGlzcGxheSwgbUVHTC5tU3VyZmFjZSwgRUdMX1dJRFRILCAmbUVHTC5tV2lkdGgpOwotICAgICAgICBlZ2xRdWVyeVN1cmZhY2UobUVHTC5tRGlzcGxheSwgbUVHTC5tU3VyZmFjZSwgRUdMX0hFSUdIVCwgJm1FR0wubUhlaWdodCk7Ci0gICAgICAgIG1XaWR0aCA9IHc7Ci0gICAgICAgIG1IZWlnaHQgPSBoOwotICAgICAgICBtU3RhdGVWZXJ0ZXgudXBkYXRlU2l6ZSh0aGlzLCB3LCBoKTsKLQotICAgICAgICBpZiAoKGludCltV2lkdGggIT0gbUVHTC5tV2lkdGggfHwgKGludCltSGVpZ2h0ICE9IG1FR0wubUhlaWdodCkgewotICAgICAgICAgICAgTE9HRSgiRUdML1N1cmZhY2UgbWlzbWF0Y2ggIEVHTCAoJWkgeCAlaSkgIFNGICglaSB4ICVpKSIsIG1FR0wubVdpZHRoLCBtRUdMLm1IZWlnaHQsIG1XaWR0aCwgbUhlaWdodCk7Ci0gICAgICAgIH0KKyAgICAgICAgbVN0YXRlVmVydGV4LnVwZGF0ZVNpemUodGhpcyk7CiAKICAgICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgICAgICBtR0wubVZlcnNpb24gPSBnbEdldFN0cmluZyhHTF9WRVJTSU9OKTsKQEAgLTU2MCw2ICs2NDEsMTEgQEAKICAgICAgICAgICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUywgJm1HTC5tTWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9ycyk7CiAKICAgICAgICAgICAgIG1HTC5PRVNfdGV4dHVyZV9ucG90ID0gTlVMTCAhPSBzdHJzdHIoKGNvbnN0IGNoYXIgKiltR0wubUV4dGVuc2lvbnMsICJHTF9PRVNfdGV4dHVyZV9ucG90Iik7CisgICAgICAgICAgICBtR0wuRVhUX3RleHR1cmVfbWF4X2FuaXNvID0gMS4wZjsKKyAgICAgICAgICAgIGJvb2wgaGFzQW5pc28gPSBOVUxMICE9IHN0cnN0cigoY29uc3QgY2hhciAqKW1HTC5tRXh0ZW5zaW9ucywgIkdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpOworICAgICAgICAgICAgaWYoaGFzQW5pc28pIHsKKyAgICAgICAgICAgICAgICBnbEdldEZsb2F0dihHTF9NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQsICZtR0wuRVhUX3RleHR1cmVfbWF4X2FuaXNvKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgfQpAQCAtNTgzLDcgKzY2OSw3IEBACiAgICAgbVJvb3RTY3JpcHQuc2V0KHMpOwogfQogCi12b2lkIENvbnRleHQ6OnNldEZyYWdtZW50U3RvcmUoUHJvZ3JhbUZyYWdtZW50U3RvcmUgKnBmcykKK3ZvaWQgQ29udGV4dDo6c2V0RnJhZ21lbnRTdG9yZShQcm9ncmFtU3RvcmUgKnBmcykKIHsKICAgICByc0Fzc2VydChtSXNHcmFwaGljc0NvbnRleHQpOwogICAgIGlmIChwZnMgPT0gTlVMTCkgewpAQCAtNjIzLDYgKzcwOSwxNiBAQAogICAgIH0KIH0KIAordm9pZCBDb250ZXh0OjpzZXRGb250KEZvbnQgKmYpCit7CisgICAgcnNBc3NlcnQobUlzR3JhcGhpY3NDb250ZXh0KTsKKyAgICBpZiAoZiA9PSBOVUxMKSB7CisgICAgICAgIG1Gb250LnNldChtU3RhdGVGb250Lm1EZWZhdWx0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRm9udC5zZXQoZik7CisgICAgfQorfQorCiB2b2lkIENvbnRleHQ6OmFzc2lnbk5hbWUoT2JqZWN0QmFzZSAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBsZW4pCiB7CiAgICAgcnNBc3NlcnQoIW9iai0+Z2V0TmFtZSgpKTsKQEAgLTY0MCw5MCArNzM2LDEzIEBACiAgICAgfQogfQogCi1PYmplY3RCYXNlICogQ29udGV4dDo6bG9va3VwTmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdAotewotICAgIGZvcihzaXplX3QgY3Q9MDsgY3QgPCBtTmFtZXMuc2l6ZSgpOyBjdCsrKSB7Ci0gICAgICAgIGlmICghc3RyY21wKG5hbWUsIG1OYW1lc1tjdF0tPmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBtTmFtZXNbY3RdOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIENvbnRleHQ6OmFwcGVuZE5hbWVEZWZpbmVzKFN0cmluZzggKnN0cikgY29uc3QKLXsKLSAgICBjaGFyIGJ1ZlsyNTZdOwotICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgbU5hbWVzLnNpemUoKTsgY3QrKykgewotICAgICAgICBzdHItPmFwcGVuZCgiI2RlZmluZSBOQU1FRF8iKTsKLSAgICAgICAgc3RyLT5hcHBlbmQobU5hbWVzW2N0XS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoIiAiKTsKLSAgICAgICAgc3ByaW50ZihidWYsICIlaVxuIiwgKGludCltTmFtZXNbY3RdKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoYnVmKTsKLSAgICB9Ci19Ci0KLWJvb2wgQ29udGV4dDo6b2JqRGVzdHJveU9PQkluaXQoKQotewotICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2luaXQoJm1PYmpEZXN0cm95Lm1NdXRleCwgTlVMTCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CSW5pdCBtdXRleCBpbml0IGZhaWx1cmUiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDb250ZXh0OjpvYmpEZXN0cm95T09CUnVuKCkKLXsKLSAgICBpZiAobU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5KSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1PYmpEZXN0cm95Lm1NdXRleCk7Ci0gICAgICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgICAgIExPR0UoIkNvbnRleHQ6Ok9iakRlc3Ryb3lPT0JSdW46IGVycm9yICVpIGxvY2tpbmcgZm9yIE9PQlJ1bi4iLCBzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChzaXplX3QgY3QgPSAwOyBjdCA8IG1PYmpEZXN0cm95Lm1EZXN0cm95TGlzdC5zaXplKCk7IGN0KyspIHsKLSAgICAgICAgICAgIG1PYmpEZXN0cm95Lm1EZXN0cm95TGlzdFtjdF0tPmRlY1VzZXJSZWYoKTsKLSAgICAgICAgfQotICAgICAgICBtT2JqRGVzdHJveS5tRGVzdHJveUxpc3QuY2xlYXIoKTsKLSAgICAgICAgbU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5ID0gZmFsc2U7Ci0KLSAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1PYmpEZXN0cm95Lm1NdXRleCk7Ci0gICAgICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgICAgIExPR0UoIkNvbnRleHQ6Ok9iakRlc3Ryb3lPT0JSdW46IGVycm9yICVpIHVubG9ja2luZyBmb3Igc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIENvbnRleHQ6Om9iakRlc3Ryb3lPT0JEZXN0cm95KCkKLXsKLSAgICByc0Fzc2VydCghbU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5KTsKLSAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1PYmpEZXN0cm95Lm1NdXRleCk7Ci19Ci0KLXZvaWQgQ29udGV4dDo6b2JqRGVzdHJveUFkZChPYmplY3RCYXNlICpvYmopCi17Ci0gICAgaW50IHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbU9iakRlc3Ryb3kubU11dGV4KTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkNvbnRleHQ6Ok9iakRlc3Ryb3lPT0JSdW46IGVycm9yICVpIGxvY2tpbmcgZm9yIE9PQlJ1bi4iLCBzdGF0dXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5ID0gdHJ1ZTsKLSAgICBtT2JqRGVzdHJveS5tRGVzdHJveUxpc3QuYWRkKG9iaik7Ci0KLSAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jaygmbU9iakRlc3Ryb3kubU11dGV4KTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkNvbnRleHQ6Ok9iakRlc3Ryb3lPT0JSdW46IGVycm9yICVpIHVubG9ja2luZyBmb3Igc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgIH0KLX0KLQogdWludDMyX3QgQ29udGV4dDo6Z2V0TWVzc2FnZVRvQ2xpZW50KHZvaWQgKmRhdGEsIHNpemVfdCAqcmVjZWl2ZUxlbiwgc2l6ZV90IGJ1ZmZlckxlbiwgYm9vbCB3YWl0KQogewogICAgIC8vTE9HRSgiZ2V0TWVzc2FnZVRvQ2xpZW50ICVpICVpIiwgYnVmZmVyTGVuLCB3YWl0KTsKKyAgICAqcmVjZWl2ZUxlbiA9IDA7CiAgICAgaWYgKCF3YWl0KSB7CiAgICAgICAgIGlmIChtSU8ubVRvQ2xpZW50LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgLy8gTm8gbWVzc2FnZSB0byBnZXQgYW5kIG5vdCBnb2luZyB0byB3YWl0IGZvciBvbmUuCi0gICAgICAgICAgICByZWNlaXZlTGVuID0gMDsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgfQpAQCAtNzUxLDE1ICs3NzAsMTkgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoIXdhaXRGb3JTcGFjZSkgewotICAgICAgICBpZiAobUlPLm1Ub0NsaWVudC5nZXRGcmVlU3BhY2UoKSA8IGxlbikgeworICAgICAgICBpZiAoIW1JTy5tVG9DbGllbnQubWFrZVNwYWNlTm9uQmxvY2tpbmcobGVuICsgOCkpIHsKICAgICAgICAgICAgIC8vIE5vdCBlbm91Z2ggcm9vbSwgYW5kIG5vdCB3YWl0aW5nLgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIC8vTE9HRSgic2VuZE1lc3NhZ2VUb0NsaWVudCAyIik7Ci0gICAgdm9pZCAqcCA9IG1JTy5tVG9DbGllbnQucmVzZXJ2ZShsZW4pOwotICAgIG1lbWNweShwLCBkYXRhLCBsZW4pOwotICAgIG1JTy5tVG9DbGllbnQuY29tbWl0KGNtZElELCBsZW4pOworICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgIHZvaWQgKnAgPSBtSU8ubVRvQ2xpZW50LnJlc2VydmUobGVuKTsKKyAgICAgICAgbWVtY3B5KHAsIGRhdGEsIGxlbik7CisgICAgICAgIG1JTy5tVG9DbGllbnQuY29tbWl0KGNtZElELCBsZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIG1JTy5tVG9DbGllbnQuY29tbWl0KGNtZElELCAwKTsKKyAgICB9CiAgICAgLy9MT0dFKCJzZW5kTWVzc2FnZVRvQ2xpZW50IDMiKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KQEAgLTc5OSw4ICs4MjIsNyBAQAogICAgIExPR0UoIlJTIENvbnRleHQgZGVidWciKTsKIAogICAgIExPR0UoIiBFR0wgdmVyICVpICVpIiwgbUVHTC5tTWFqb3JWZXJzaW9uLCBtRUdMLm1NaW5vclZlcnNpb24pOwotICAgIExPR0UoIiBFR0wgY29udGV4dCAlcCAgc3VyZmFjZSAlcCwgIHc9JWkgaD0laSAgRGlzcGxheT0lcCIsIG1FR0wubUNvbnRleHQsCi0gICAgICAgICBtRUdMLm1TdXJmYWNlLCBtRUdMLm1XaWR0aCwgbUVHTC5tSGVpZ2h0LCBtRUdMLm1EaXNwbGF5KTsKKyAgICBMT0dFKCIgRUdMIGNvbnRleHQgJXAgIHN1cmZhY2UgJXAsICBEaXNwbGF5PSVwIiwgbUVHTC5tQ29udGV4dCwgbUVHTC5tU3VyZmFjZSwgbUVHTC5tRGlzcGxheSk7CiAgICAgTE9HRSgiIEdMIHZlbmRvcjogJXMiLCBtR0wubVZlbmRvcik7CiAgICAgTE9HRSgiIEdMIHJlbmRlcmVyOiAlcyIsIG1HTC5tUmVuZGVyZXIpOwogICAgIExPR0UoIiBHTCBWZXJzaW9uOiAlcyIsIG1HTC5tVmVyc2lvbik7CkBAIC04MjIsNiArODQ0LDkgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCit2b2lkIHJzaV9Db250ZXh0RmluaXNoKENvbnRleHQgKnJzYykKK3sKK30KIAogdm9pZCByc2lfQ29udGV4dEJpbmRSb290U2NyaXB0KENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMpCiB7CkBAIC04NDEsOSArODY2LDkgQEAKICAgICBzLT5iaW5kVG9Db250ZXh0KCZyc2MtPm1TdGF0ZVNhbXBsZXIsIHNsb3QpOwogfQogCi12b2lkIHJzaV9Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlKENvbnRleHQgKnJzYywgUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSB2cGZzKQordm9pZCByc2lfQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUoQ29udGV4dCAqcnNjLCBSc1Byb2dyYW1TdG9yZSB2cGZzKQogewotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICpwZnMgPSBzdGF0aWNfY2FzdDxQcm9ncmFtRnJhZ21lbnRTdG9yZSAqPih2cGZzKTsKKyAgICBQcm9ncmFtU3RvcmUgKnBmcyA9IHN0YXRpY19jYXN0PFByb2dyYW1TdG9yZSAqPih2cGZzKTsKICAgICByc2MtPnNldEZyYWdtZW50U3RvcmUocGZzKTsKIH0KIApAQCAtODY1LDEyICs4OTAsMjQgQEAKICAgICByc2MtPnNldFZlcnRleChwdik7CiB9CiAKK3ZvaWQgcnNpX0NvbnRleHRCaW5kRm9udChDb250ZXh0ICpyc2MsIFJzRm9udCB2Zm9udCkKK3sKKyAgICBGb250ICpmb250ID0gc3RhdGljX2Nhc3Q8Rm9udCAqPih2Zm9udCk7CisgICAgcnNjLT5zZXRGb250KGZvbnQpOworfQorCiB2b2lkIHJzaV9Bc3NpZ25OYW1lKENvbnRleHQgKnJzYywgdm9pZCAqIG9iaiwgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgbGVuKQogewogICAgIE9iamVjdEJhc2UgKm9iID0gc3RhdGljX2Nhc3Q8T2JqZWN0QmFzZSAqPihvYmopOwogICAgIHJzYy0+YXNzaWduTmFtZShvYiwgbmFtZSwgbGVuKTsKIH0KIAordm9pZCByc2lfR2V0TmFtZShDb250ZXh0ICpyc2MsIHZvaWQgKiBvYmosIGNvbnN0IGNoYXIgKipuYW1lKQoreworICAgIE9iamVjdEJhc2UgKm9iID0gc3RhdGljX2Nhc3Q8T2JqZWN0QmFzZSAqPihvYmopOworICAgICgqbmFtZSkgPSBvYi0+Z2V0TmFtZSgpOworfQorCiB2b2lkIHJzaV9PYmpEZXN0cm95KENvbnRleHQgKnJzYywgdm9pZCAqb2JqKQogewogICAgIE9iamVjdEJhc2UgKm9iID0gc3RhdGljX2Nhc3Q8T2JqZWN0QmFzZSAqPihvYmopOwpAQCAtOTI5LDYgKzk2Niw3IEBACiAgICAgTE9HVigicnNDb250ZXh0Q3JlYXRlR0wgJXAsICVpIiwgdmRldiwgdXNlRGVwdGgpOwogICAgIERldmljZSAqIGRldiA9IHN0YXRpY19jYXN0PERldmljZSAqPih2ZGV2KTsKICAgICBDb250ZXh0ICpyc2MgPSBuZXcgQ29udGV4dChkZXYsIHRydWUsIHVzZURlcHRoKTsKKyAgICBMT0dWKCJyc0NvbnRleHRDcmVhdGVHTCByZXQgJXAgIiwgcnNjKTsKICAgICByZXR1cm4gcnNjOwogfQogCkBAIC05MzgsMTIgKzk3Niw2IEBACiAgICAgZGVsZXRlIHJzYzsKIH0KIAotdm9pZCByc09iakRlc3Ryb3lPT0IoUnNDb250ZXh0IHZyc2MsIHZvaWQgKm9iaikKLXsKLSAgICBDb250ZXh0ICogcnNjID0gc3RhdGljX2Nhc3Q8Q29udGV4dCAqPih2cnNjKTsKLSAgICByc2MtPm9iakRlc3Ryb3lBZGQoc3RhdGljX2Nhc3Q8T2JqZWN0QmFzZSAqPihvYmopKTsKLX0KLQogdWludDMyX3QgcnNDb250ZXh0R2V0TWVzc2FnZShSc0NvbnRleHQgdnJzYywgdm9pZCAqZGF0YSwgc2l6ZV90ICpyZWNlaXZlTGVuLCBzaXplX3QgYnVmZmVyTGVuLCBib29sIHdhaXQpCiB7CiAgICAgQ29udGV4dCAqIHJzYyA9IHN0YXRpY19jYXN0PENvbnRleHQgKj4odnJzYyk7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQ29udGV4dC5oIGIvbGlicy9ycy9yc0NvbnRleHQuaAppbmRleCA3MDk3MzBlLi44YThiOGE4IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQ29udGV4dC5oCisrKyBiL2xpYnMvcnMvcnNDb250ZXh0LmgKQEAgLTE4LDIxICsxOCwyMSBAQAogI2RlZmluZSBBTkRST0lEX1JTX0NPTlRFWFRfSAogCiAjaW5jbHVkZSAicnNVdGlscy5oIgorI2luY2x1ZGUgInJzTXV0ZXguaCIKIAogI2luY2x1ZGUgInJzVGhyZWFkSU8uaCIKICNpbmNsdWRlICJyc1R5cGUuaCIKICNpbmNsdWRlICJyc01hdHJpeC5oIgogI2luY2x1ZGUgInJzQWxsb2NhdGlvbi5oIgotI2luY2x1ZGUgInJzU2ltcGxlTWVzaC5oIgogI2luY2x1ZGUgInJzTWVzaC5oIgogI2luY2x1ZGUgInJzRGV2aWNlLmgiCiAjaW5jbHVkZSAicnNTY3JpcHRDLmgiCiAjaW5jbHVkZSAicnNBbGxvY2F0aW9uLmgiCiAjaW5jbHVkZSAicnNBZGFwdGVyLmgiCiAjaW5jbHVkZSAicnNTYW1wbGVyLmgiCi0jaW5jbHVkZSAicnNMaWdodC5oIgorI2luY2x1ZGUgInJzRm9udC5oIgogI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5oIgorI2luY2x1ZGUgInJzUHJvZ3JhbVN0b3JlLmgiCiAjaW5jbHVkZSAicnNQcm9ncmFtUmFzdGVyLmgiCiAjaW5jbHVkZSAicnNQcm9ncmFtVmVydGV4LmgiCiAjaW5jbHVkZSAicnNTaGFkZXJDYWNoZS5oIgpAQCAtNDgsNiArNDgsMjQgQEAKIAogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKKyNpZiAwCisjZGVmaW5lIENIRUNLX09CSihvKSB7IFwKKyAgICBHRVRfVExTKCk7IFwKKyAgICBpZighT2JqZWN0QmFzZTo6aXNWYWxpZChyc2MsIChjb25zdCBPYmplY3RCYXNlICopbykpIHsgIFwKKyAgICAgICAgTE9HRSgiQmFkIG9iamVjdCAlcCBhdCAlcywgJWkiLCBvLCBfX0ZJTEVfXywgX19MSU5FX18pOyAgXAorICAgIH0gXAorfQorI2RlZmluZSBDSEVDS19PQkpfT1JfTlVMTChvKSB7IFwKKyAgICBHRVRfVExTKCk7IFwKKyAgICBpZihvICYmICFPYmplY3RCYXNlOjppc1ZhbGlkKHJzYywgKGNvbnN0IE9iamVjdEJhc2UgKilvKSkgeyAgXAorICAgICAgICBMT0dFKCJCYWQgb2JqZWN0ICVwIGF0ICVzLCAlaSIsIG8sIF9fRklMRV9fLCBfX0xJTkVfXyk7ICBcCisgICAgfSBcCit9CisjZWxzZQorI2RlZmluZSBDSEVDS19PQkoobykKKyNkZWZpbmUgQ0hFQ0tfT0JKX09SX05VTEwobykKKyNlbmRpZgorCiBjbGFzcyBDb250ZXh0CiB7CiBwdWJsaWM6CkBAIC02MywxOCArODEsMjAgQEAKICAgICAgICAgQ29udGV4dCAqIG1Db250ZXh0OwogICAgICAgICBTY3JpcHQgKiBtU2NyaXB0OwogICAgIH07CisgICAgU2NyaXB0VExTU3RydWN0ICptVGxzU3RydWN0OwogCisgICAgdHlwZWRlZiB2b2lkICgqV29ya2VyQ2FsbGJhY2tfdCkodm9pZCAqdXNyLCB1aW50MzJfdCBpZHgpOwogCiAgICAgLy9TdHJ1Y3R1cmVkQWxsb2NhdGlvbkNvbnRleHQgbVN0YXRlQWxsb2NhdGlvbjsKICAgICBFbGVtZW50U3RhdGUgbVN0YXRlRWxlbWVudDsKICAgICBUeXBlU3RhdGUgbVN0YXRlVHlwZTsKICAgICBTYW1wbGVyU3RhdGUgbVN0YXRlU2FtcGxlcjsKICAgICBQcm9ncmFtRnJhZ21lbnRTdGF0ZSBtU3RhdGVGcmFnbWVudDsKLSAgICBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlIG1TdGF0ZUZyYWdtZW50U3RvcmU7CisgICAgUHJvZ3JhbVN0b3JlU3RhdGUgbVN0YXRlRnJhZ21lbnRTdG9yZTsKICAgICBQcm9ncmFtUmFzdGVyU3RhdGUgbVN0YXRlUmFzdGVyOwogICAgIFByb2dyYW1WZXJ0ZXhTdGF0ZSBtU3RhdGVWZXJ0ZXg7Ci0gICAgTGlnaHRTdGF0ZSBtU3RhdGVMaWdodDsKICAgICBWZXJ0ZXhBcnJheVN0YXRlIG1TdGF0ZVZlcnRleEFycmF5OworICAgIEZvbnRTdGF0ZSBtU3RhdGVGb250OwogCiAgICAgU2NyaXB0Q1N0YXRlIG1TY3JpcHRDOwogICAgIFNoYWRlckNhY2hlIG1TaGFkZXJDYWNoZTsKQEAgLTg0LDE2ICsxMDQsMTkgQEAKICAgICB2b2lkIHNldFJhc3RlcihQcm9ncmFtUmFzdGVyICopOwogICAgIHZvaWQgc2V0VmVydGV4KFByb2dyYW1WZXJ0ZXggKik7CiAgICAgdm9pZCBzZXRGcmFnbWVudChQcm9ncmFtRnJhZ21lbnQgKik7Ci0gICAgdm9pZCBzZXRGcmFnbWVudFN0b3JlKFByb2dyYW1GcmFnbWVudFN0b3JlICopOworICAgIHZvaWQgc2V0RnJhZ21lbnRTdG9yZShQcm9ncmFtU3RvcmUgKik7CisgICAgdm9pZCBzZXRGb250KEZvbnQgKik7CiAKICAgICB2b2lkIHVwZGF0ZVN1cmZhY2Uodm9pZCAqc3VyKTsKIAogICAgIGNvbnN0IFByb2dyYW1GcmFnbWVudCAqIGdldEZyYWdtZW50KCkge3JldHVybiBtRnJhZ21lbnQuZ2V0KCk7fQotICAgIGNvbnN0IFByb2dyYW1GcmFnbWVudFN0b3JlICogZ2V0RnJhZ21lbnRTdG9yZSgpIHtyZXR1cm4gbUZyYWdtZW50U3RvcmUuZ2V0KCk7fQorICAgIGNvbnN0IFByb2dyYW1TdG9yZSAqIGdldEZyYWdtZW50U3RvcmUoKSB7cmV0dXJuIG1GcmFnbWVudFN0b3JlLmdldCgpO30KICAgICBjb25zdCBQcm9ncmFtUmFzdGVyICogZ2V0UmFzdGVyKCkge3JldHVybiBtUmFzdGVyLmdldCgpO30KICAgICBjb25zdCBQcm9ncmFtVmVydGV4ICogZ2V0VmVydGV4KCkge3JldHVybiBtVmVydGV4LmdldCgpO30KKyAgICBGb250ICogZ2V0Rm9udCgpIHtyZXR1cm4gbUZvbnQuZ2V0KCk7fQogCiAgICAgYm9vbCBzZXR1cENoZWNrKCk7CisgICAgdm9pZCBzZXR1cFByb2dyYW1TdG9yZSgpOwogICAgIGJvb2wgY2hlY2tEcml2ZXIoKSBjb25zdCB7cmV0dXJuIG1FR0wubVN1cmZhY2UgIT0gMDt9CiAKICAgICB2b2lkIHBhdXNlKCk7CkBAIC0xMDMsMTIgKzEyNiwxMCBAQAogCiAgICAgdm9pZCBhc3NpZ25OYW1lKE9iamVjdEJhc2UgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgbGVuKTsKICAgICB2b2lkIHJlbW92ZU5hbWUoT2JqZWN0QmFzZSAqb2JqKTsKLSAgICBPYmplY3RCYXNlICogbG9va3VwTmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdDsKLSAgICB2b2lkIGFwcGVuZE5hbWVEZWZpbmVzKFN0cmluZzggKnN0cikgY29uc3Q7CiAKICAgICB1aW50MzJfdCBnZXRNZXNzYWdlVG9DbGllbnQodm9pZCAqZGF0YSwgc2l6ZV90ICpyZWNlaXZlTGVuLCBzaXplX3QgYnVmZmVyTGVuLCBib29sIHdhaXQpOwogICAgIGJvb2wgc2VuZE1lc3NhZ2VUb0NsaWVudCh2b2lkICpkYXRhLCB1aW50MzJfdCBjbWRJRCwgc2l6ZV90IGxlbiwgYm9vbCB3YWl0Rm9yU3BhY2UpOwotICAgIHVpbnQzMl90IHJ1blNjcmlwdChTY3JpcHQgKnMsIHVpbnQzMl90IGxhdW5jaElEKTsKKyAgICB1aW50MzJfdCBydW5TY3JpcHQoU2NyaXB0ICpzKTsKIAogICAgIHZvaWQgaW5pdFRvQ2xpZW50KCk7CiAgICAgdm9pZCBkZWluaXRUb0NsaWVudCgpOwpAQCAtMTE5LDE5ICsxNDAsMjEgQEAKICAgICBQcm9ncmFtVmVydGV4ICogZ2V0RGVmYXVsdFByb2dyYW1WZXJ0ZXgoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU3RhdGVWZXJ0ZXgubURlZmF1bHQuZ2V0KCk7CiAgICAgfQotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICogZ2V0RGVmYXVsdFByb2dyYW1GcmFnbWVudFN0b3JlKCkgY29uc3QgeworICAgIFByb2dyYW1TdG9yZSAqIGdldERlZmF1bHRQcm9ncmFtU3RvcmUoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU3RhdGVGcmFnbWVudFN0b3JlLm1EZWZhdWx0LmdldCgpOwogICAgIH0KICAgICBQcm9ncmFtUmFzdGVyICogZ2V0RGVmYXVsdFByb2dyYW1SYXN0ZXIoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU3RhdGVSYXN0ZXIubURlZmF1bHQuZ2V0KCk7CiAgICAgfQorICAgIEZvbnQqIGdldERlZmF1bHRGb250KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVN0YXRlRm9udC5tRGVmYXVsdC5nZXQoKTsKKyAgICB9CiAKLSAgICB1aW50MzJfdCBnZXRXaWR0aCgpIGNvbnN0IHtyZXR1cm4gbUVHTC5tV2lkdGg7fQotICAgIHVpbnQzMl90IGdldEhlaWdodCgpIGNvbnN0IHtyZXR1cm4gbUVHTC5tSGVpZ2h0O30KKyAgICB1aW50MzJfdCBnZXRXaWR0aCgpIGNvbnN0IHtyZXR1cm4gbVdpZHRoO30KKyAgICB1aW50MzJfdCBnZXRIZWlnaHQoKSBjb25zdCB7cmV0dXJuIG1IZWlnaHQ7fQogCiAKICAgICBUaHJlYWRJTyBtSU87Ci0gICAgdm9pZCBvYmpEZXN0cm95QWRkKE9iamVjdEJhc2UgKik7CiAKICAgICAvLyBUaW1lcnMKICAgICBlbnVtIFRpbWVycyB7CkBAIC0xNDgsMjQgKzE3MSwzMSBAQAogICAgIHZvaWQgdGltZXJQcmludCgpOwogICAgIHZvaWQgdGltZXJGcmFtZSgpOwogCi0gICAgYm9vbCBjaGVja1ZlcnNpb24xXzEoKSBjb25zdCB7cmV0dXJuIChtR0wubU1ham9yVmVyc2lvbiA+IDEpIHx8IChtR0wubU1pbm9yVmVyc2lvbiA+PSAxKTsgfQotICAgIGJvb2wgY2hlY2tWZXJzaW9uMl8wKCkgY29uc3Qge3JldHVybiBtR0wubU1ham9yVmVyc2lvbiA+PSAyOyB9Ci0KICAgICBzdHJ1Y3QgewogICAgICAgICBib29sIG1Mb2dUaW1lczsKICAgICAgICAgYm9vbCBtTG9nU2NyaXB0czsKICAgICAgICAgYm9vbCBtTG9nT2JqZWN0czsKICAgICAgICAgYm9vbCBtTG9nU2hhZGVyczsKKyAgICAgICAgYm9vbCBtTG9nU2hhZGVyc0F0dHI7CisgICAgICAgIGJvb2wgbUxvZ1NoYWRlcnNVbmlmb3JtczsKKyAgICAgICAgYm9vbCBtTG9nVmlzdWFsOwogICAgIH0gcHJvcHM7CiAKICAgICB2b2lkIGR1bXBEZWJ1ZygpIGNvbnN0OwogICAgIHZvaWQgY2hlY2tFcnJvcihjb25zdCBjaGFyICopIGNvbnN0OwogICAgIGNvbnN0IGNoYXIgKiBnZXRFcnJvcihSc0Vycm9yICopOwotICAgIHZvaWQgc2V0RXJyb3IoUnNFcnJvciBlLCBjb25zdCBjaGFyICptc2cpOworICAgIHZvaWQgc2V0RXJyb3IoUnNFcnJvciBlLCBjb25zdCBjaGFyICptc2cgPSBOVUxMKTsKIAogICAgIG11dGFibGUgY29uc3QgT2JqZWN0QmFzZSAqIG1PYmpIZWFkOwogCiAgICAgYm9vbCBleHRfT0VTX3RleHR1cmVfbnBvdCgpIGNvbnN0IHtyZXR1cm4gbUdMLk9FU190ZXh0dXJlX25wb3Q7fQorICAgIGZsb2F0IGV4dF90ZXh0dXJlX21heF9hbmlzbygpIGNvbnN0IHtyZXR1cm4gbUdMLkVYVF90ZXh0dXJlX21heF9hbmlzbzsgfQorICAgIHVpbnQzMl90IGdldE1heEZyYWdtZW50VGV4dHVyZXMoKSBjb25zdCB7cmV0dXJuIG1HTC5tTWF4RnJhZ21lbnRUZXh0dXJlSW1hZ2VVbml0czt9CisgICAgdWludDMyX3QgZ2V0TWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9ycygpIGNvbnN0IHtyZXR1cm4gbUdMLm1NYXhGcmFnbWVudFVuaWZvcm1WZWN0b3JzO30KKyAgICB1aW50MzJfdCBnZXRNYXhWZXJ0ZXhVbmlmb3JtVmVjdG9ycygpIGNvbnN0IHtyZXR1cm4gbUdMLm1NYXhWZXJ0ZXhVbmlmb3JtVmVjdG9yczt9CisKKyAgICB2b2lkIGxhdW5jaFRocmVhZHMoV29ya2VyQ2FsbGJhY2tfdCBjYmssIHZvaWQgKmRhdGEpOworICAgIHVpbnQzMl90IGdldFdvcmtlclBvb2xTaXplKCkgY29uc3Qge3JldHVybiAodWludDMyX3QpbVdvcmtlcnMubUNvdW50O30KIAogcHJvdGVjdGVkOgogICAgIERldmljZSAqbURldjsKQEAgLTE3Nyw4ICsyMDcsNiBAQAogICAgICAgICBFR0xDb25maWcgbUNvbmZpZzsKICAgICAgICAgRUdMQ29udGV4dCBtQ29udGV4dDsKICAgICAgICAgRUdMU3VyZmFjZSBtU3VyZmFjZTsKLSAgICAgICAgRUdMaW50IG1XaWR0aDsKLSAgICAgICAgRUdMaW50IG1IZWlnaHQ7CiAgICAgICAgIEVHTERpc3BsYXkgbURpc3BsYXk7CiAgICAgfSBtRUdMOwogCkBAIC0yMDIsNiArMjMwLDcgQEAKICAgICAgICAgaW50MzJfdCBtTWF4VmVydGV4VGV4dHVyZVVuaXRzOwogCiAgICAgICAgIGJvb2wgT0VTX3RleHR1cmVfbnBvdDsKKyAgICAgICAgZmxvYXQgRVhUX3RleHR1cmVfbWF4X2FuaXNvOwogICAgIH0gbUdMOwogCiAgICAgdWludDMyX3QgbVdpZHRoOwpAQCAtMjE5LDIyICsyNDgsMjggQEAKICAgICBwdGhyZWFkX3QgbVRocmVhZElkOwogICAgIHBpZF90IG1OYXRpdmVUaHJlYWRJZDsKIAorICAgIHN0cnVjdCBXb3JrZXJzIHsKKyAgICAgICAgdm9sYXRpbGUgaW50IG1SdW5uaW5nQ291bnQ7CisgICAgICAgIHZvbGF0aWxlIGludCBtTGF1bmNoQ291bnQ7CisgICAgICAgIHVpbnQzMl90IG1Db3VudDsKKyAgICAgICAgcHRocmVhZF90ICptVGhyZWFkSWQ7CisgICAgICAgIHBpZF90ICptTmF0aXZlVGhyZWFkSWQ7CisgICAgICAgIFNpZ25hbCBtQ29tcGxldGVTaWduYWw7CisKKyAgICAgICAgU2lnbmFsICptTGF1bmNoU2lnbmFsczsKKyAgICAgICAgV29ya2VyQ2FsbGJhY2tfdCBtTGF1bmNoQ2FsbGJhY2s7CisgICAgICAgIHZvaWQgKm1MYXVuY2hEYXRhOworICAgIH07CisgICAgV29ya2VycyBtV29ya2VyczsKKwogICAgIE9iamVjdEJhc2VSZWY8U2NyaXB0PiBtUm9vdFNjcmlwdDsKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudD4gbUZyYWdtZW50OwogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVZlcnRleD4gbVZlcnRleDsKLSAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudFN0b3JlPiBtRnJhZ21lbnRTdG9yZTsKKyAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1TdG9yZT4gbUZyYWdtZW50U3RvcmU7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtUmFzdGVyPiBtUmFzdGVyOworICAgIE9iamVjdEJhc2VSZWY8Rm9udD4gbUZvbnQ7CiAKLQotICAgIHN0cnVjdCBPYmpEZXN0cm95T09CIHsKLSAgICAgICAgcHRocmVhZF9tdXRleF90IG1NdXRleDsKLSAgICAgICAgVmVjdG9yPE9iamVjdEJhc2UgKj4gbURlc3Ryb3lMaXN0OwotICAgICAgICBib29sIG1OZWVkVG9FbXB0eTsKLSAgICB9OwotICAgIE9iakRlc3Ryb3lPT0IgbU9iakRlc3Ryb3k7Ci0gICAgYm9vbCBvYmpEZXN0cm95T09CSW5pdCgpOwotICAgIHZvaWQgb2JqRGVzdHJveU9PQlJ1bigpOwotICAgIHZvaWQgb2JqRGVzdHJveU9PQkRlc3Ryb3koKTsKKyAgICB2b2lkIGRpc3BsYXlEZWJ1Z1N0YXRzKCk7CiAKIHByaXZhdGU6CiAgICAgQ29udGV4dCgpOwpAQCAtMjQ1LDYgKzI4MCw3IEBACiAgICAgdWludDMyX3QgcnVuUm9vdFNjcmlwdCgpOwogCiAgICAgc3RhdGljIHZvaWQgKiB0aHJlYWRQcm9jKHZvaWQgKik7CisgICAgc3RhdGljIHZvaWQgKiBoZWxwZXJUaHJlYWRQcm9jKHZvaWQgKik7CiAKICAgICBBTmF0aXZlV2luZG93ICptV25kU3VyZmFjZTsKIApAQCAtMjU4LDYgKzI5NCw5IEBACiAgICAgdWludDMyX3QgbVRpbWVNU0xhc3RGcmFtZTsKICAgICB1aW50MzJfdCBtVGltZU1TTGFzdFNjcmlwdDsKICAgICB1aW50MzJfdCBtVGltZU1TTGFzdFN3YXA7CisgICAgdWludDMyX3QgbUF2ZXJhZ2VGUFNGcmFtZUNvdW50OworICAgIHVpbnQ2NF90IG1BdmVyYWdlRlBTU3RhcnRUaW1lOworICAgIHVpbnQzMl90IG1BdmVyYWdlRlBTOwogfTsKIAogfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0NvbnRleHRIb3N0U3R1Yi5oIGIvbGlicy9ycy9yc0NvbnRleHRIb3N0U3R1Yi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMDIwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzQ29udGV4dEhvc3RTdHViLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfQ09OVEVYVF9IT1NUX1NUVUJfSAorI2RlZmluZSBBTkRST0lEX1JTX0NPTlRFWFRfSE9TVF9TVFVCX0gKKworI2luY2x1ZGUgInJzVXRpbHMuaCIKKy8vI2luY2x1ZGUgInJzTXV0ZXguaCIKKworLy8jaW5jbHVkZSAicnNUaHJlYWRJTy5oIgorI2luY2x1ZGUgInJzVHlwZS5oIgorI2luY2x1ZGUgInJzTWF0cml4LmgiCisjaW5jbHVkZSAicnNBbGxvY2F0aW9uLmgiCisjaW5jbHVkZSAicnNNZXNoLmgiCisvLyNpbmNsdWRlICJyc0RldmljZS5oIgorI2luY2x1ZGUgInJzU2NyaXB0Qy5oIgorI2luY2x1ZGUgInJzQWxsb2NhdGlvbi5oIgorI2luY2x1ZGUgInJzQWRhcHRlci5oIgorI2luY2x1ZGUgInJzU2FtcGxlci5oIgorI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCisjaW5jbHVkZSAicnNQcm9ncmFtU3RvcmUuaCIKKyNpbmNsdWRlICJyc1Byb2dyYW1SYXN0ZXIuaCIKKyNpbmNsdWRlICJyc1Byb2dyYW1WZXJ0ZXguaCIKKyNpbmNsdWRlICJyc1NoYWRlckNhY2hlLmgiCisjaW5jbHVkZSAicnNWZXJ0ZXhBcnJheS5oIgorCisvLyNpbmNsdWRlICJyc2dBcGlTdHJ1Y3RzLmgiCisvLyNpbmNsdWRlICJyc0xvY2tsZXNzRmlmby5oIgorCisvLyNpbmNsdWRlIDx1aS9lZ2wvYW5kcm9pZF9uYXRpdmVzLmg+CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworY2xhc3MgRGV2aWNlOworCitjbGFzcyBDb250ZXh0Cit7CitwdWJsaWM6CisgICAgQ29udGV4dChEZXZpY2UgKiwgYm9vbCBpc0dyYXBoaWNzLCBib29sIHVzZURlcHRoKSB7CisgICAgICAgIG1PYmpIZWFkID0gTlVMTDsKKyAgICB9CisgICAgfkNvbnRleHQoKSB7CisgICAgfQorCisKKyAgICAvL1N0cnVjdHVyZWRBbGxvY2F0aW9uQ29udGV4dCBtU3RhdGVBbGxvY2F0aW9uOworICAgIEVsZW1lbnRTdGF0ZSBtU3RhdGVFbGVtZW50OworICAgIFR5cGVTdGF0ZSBtU3RhdGVUeXBlOworICAgIFNhbXBsZXJTdGF0ZSBtU3RhdGVTYW1wbGVyOworICAgIC8vUHJvZ3JhbUZyYWdtZW50U3RhdGUgbVN0YXRlRnJhZ21lbnQ7CisgICAgUHJvZ3JhbVN0b3JlU3RhdGUgbVN0YXRlRnJhZ21lbnRTdG9yZTsKKyAgICAvL1Byb2dyYW1SYXN0ZXJTdGF0ZSBtU3RhdGVSYXN0ZXI7CisgICAgLy9Qcm9ncmFtVmVydGV4U3RhdGUgbVN0YXRlVmVydGV4OworICAgIFZlcnRleEFycmF5U3RhdGUgbVN0YXRlVmVydGV4QXJyYXk7CisKKyAgICAvL1NjcmlwdENTdGF0ZSBtU2NyaXB0QzsKKyAgICBTaGFkZXJDYWNoZSBtU2hhZGVyQ2FjaGU7CisKKworICAgIC8vYm9vbCBzZXR1cENoZWNrKCk7CisgICAgYm9vbCBjaGVja0RyaXZlcigpIGNvbnN0IHtyZXR1cm4gZmFsc2U7fQorCisgICAgUHJvZ3JhbUZyYWdtZW50ICogZ2V0RGVmYXVsdFByb2dyYW1GcmFnbWVudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFByb2dyYW1WZXJ0ZXggKiBnZXREZWZhdWx0UHJvZ3JhbVZlcnRleCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFByb2dyYW1TdG9yZSAqIGdldERlZmF1bHRQcm9ncmFtU3RvcmUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQcm9ncmFtUmFzdGVyICogZ2V0RGVmYXVsdFByb2dyYW1SYXN0ZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHVpbnQzMl90IGdldFdpZHRoKCkgY29uc3Qge3JldHVybiAwO30KKyAgICB1aW50MzJfdCBnZXRIZWlnaHQoKSBjb25zdCB7cmV0dXJuIDA7fQorCisgICAgLy8gVGltZXJzCisgICAgZW51bSBUaW1lcnMgeworICAgICAgICBSU19USU1FUl9JRExFLAorICAgICAgICBSU19USU1FUl9JTlRFUk5BTCwKKyAgICAgICAgUlNfVElNRVJfU0NSSVBULAorICAgICAgICBSU19USU1FUl9DTEVBUl9TV0FQLAorICAgICAgICBfUlNfVElNRVJfVE9UQUwKKyAgICB9OworCisgICAgYm9vbCBjaGVja1ZlcnNpb24xXzEoKSBjb25zdCB7cmV0dXJuIGZhbHNlOyB9CisgICAgYm9vbCBjaGVja1ZlcnNpb24yXzAoKSBjb25zdCB7cmV0dXJuIGZhbHNlOyB9CisKKyAgICBzdHJ1Y3QgeworICAgICAgICBib29sIG1Mb2dUaW1lczsKKyAgICAgICAgYm9vbCBtTG9nU2NyaXB0czsKKyAgICAgICAgYm9vbCBtTG9nT2JqZWN0czsKKyAgICAgICAgYm9vbCBtTG9nU2hhZGVyczsKKyAgICAgICAgYm9vbCBtTG9nU2hhZGVyc0F0dHI7CisgICAgICAgIGJvb2wgbUxvZ1NoYWRlcnNVbmlmb3JtczsKKyAgICAgICAgYm9vbCBtTG9nVmlzdWFsOworICAgIH0gcHJvcHM7CisKKyAgICB2b2lkIGR1bXBEZWJ1ZygpIGNvbnN0IHsgICAgfQorICAgIHZvaWQgY2hlY2tFcnJvcihjb25zdCBjaGFyICopIGNvbnN0IHsgIH07CisgICAgdm9pZCBzZXRFcnJvcihSc0Vycm9yIGUsIGNvbnN0IGNoYXIgKm1zZyA9IE5VTEwpIHsgIH0KKworICAgIG11dGFibGUgY29uc3QgT2JqZWN0QmFzZSAqIG1PYmpIZWFkOworCisgICAgYm9vbCBleHRfT0VTX3RleHR1cmVfbnBvdCgpIGNvbnN0IHtyZXR1cm4gbUdMLk9FU190ZXh0dXJlX25wb3Q7fQorICAgIGZsb2F0IGV4dF90ZXh0dXJlX21heF9hbmlzbygpIGNvbnN0IHtyZXR1cm4gMS4wZjt9CisgICAgdWludDMyX3QgZ2V0TWF4RnJhZ21lbnRUZXh0dXJlcygpIGNvbnN0IHtyZXR1cm4gbUdMLm1NYXhGcmFnbWVudFRleHR1cmVJbWFnZVVuaXRzO30KKyAgICB1aW50MzJfdCBnZXRNYXhGcmFnbWVudFVuaWZvcm1WZWN0b3JzKCkgY29uc3Qge3JldHVybiBtR0wubU1heEZyYWdtZW50VW5pZm9ybVZlY3RvcnM7fQorICAgIHVpbnQzMl90IGdldE1heFZlcnRleFVuaWZvcm1WZWN0b3JzKCkgY29uc3Qge3JldHVybiBtR0wubU1heFZlcnRleFVuaWZvcm1WZWN0b3JzO30KKworcHJvdGVjdGVkOgorCisgICAgc3RydWN0IHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqIG1WZW5kb3I7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBtUmVuZGVyZXI7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBtVmVyc2lvbjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqIG1FeHRlbnNpb25zOworCisgICAgICAgIHVpbnQzMl90IG1NYWpvclZlcnNpb247CisgICAgICAgIHVpbnQzMl90IG1NaW5vclZlcnNpb247CisKKyAgICAgICAgaW50MzJfdCBtTWF4VmFyeWluZ1ZlY3RvcnM7CisgICAgICAgIGludDMyX3QgbU1heFRleHR1cmVJbWFnZVVuaXRzOworCisgICAgICAgIGludDMyX3QgbU1heEZyYWdtZW50VGV4dHVyZUltYWdlVW5pdHM7CisgICAgICAgIGludDMyX3QgbU1heEZyYWdtZW50VW5pZm9ybVZlY3RvcnM7CisKKyAgICAgICAgaW50MzJfdCBtTWF4VmVydGV4QXR0cmliczsKKyAgICAgICAgaW50MzJfdCBtTWF4VmVydGV4VW5pZm9ybVZlY3RvcnM7CisgICAgICAgIGludDMyX3QgbU1heFZlcnRleFRleHR1cmVVbml0czsKKworICAgICAgICBib29sIE9FU190ZXh0dXJlX25wb3Q7CisgICAgfSBtR0w7CisKK307CisKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0RldmljZS5jcHAgYi9saWJzL3JzL3JzRGV2aWNlLmNwcAppbmRleCBiNjcwYWQ0Li5hOTZiMTE0IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzRGV2aWNlLmNwcAorKysgYi9saWJzL3JzL3JzRGV2aWNlLmNwcApAQCAtMTUsNyArMTUsMTEgQEAKICAqLwogCiAjaW5jbHVkZSAicnNEZXZpY2UuaCIKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTMzLDcgKzM3LDcgQEAKIAogdm9pZCBEZXZpY2U6OmFkZENvbnRleHQoQ29udGV4dCAqcnNjKQogewotICAgIG1Db250ZXh0cy5hZGQocnNjKTsKKyAgICBtQ29udGV4dHMucHVzaChyc2MpOwogfQogCiB2b2lkIERldmljZTo6cmVtb3ZlQ29udGV4dChDb250ZXh0ICpyc2MpCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRWxlbWVudC5jcHAgYi9saWJzL3JzL3JzRWxlbWVudC5jcHAKaW5kZXggNjI4OGJjNC4uMGI5ZTI4YyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0VsZW1lbnQuY3BwCisrKyBiL2xpYnMvcnMvcnNFbGVtZW50LmNwcApAQCAtMTQsOSArMTQsMTQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJyc0NvbnRleHQuaCIKIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTI5LDYgKzM0LDcgQEAKICAgICBtQWxsb2NMaW5lID0gX19MSU5FX187CiAgICAgbUZpZWxkcyA9IE5VTEw7CiAgICAgbUZpZWxkQ291bnQgPSAwOworICAgIG1IYXNSZWZlcmVuY2UgPSBmYWxzZTsKIH0KIAogCkBAIC00OCw2ICs1NCw3IEBACiAgICAgZGVsZXRlIFtdIG1GaWVsZHM7CiAgICAgbUZpZWxkcyA9IE5VTEw7CiAgICAgbUZpZWxkQ291bnQgPSAwOworICAgIG1IYXNSZWZlcmVuY2UgPSBmYWxzZTsKIH0KIAogc2l6ZV90IEVsZW1lbnQ6OmdldFNpemVCaXRzKCkgY29uc3QKQEAgLTU4LDIwICs2NSwxMSBAQAogCiAgICAgc2l6ZV90IHRvdGFsID0gMDsKICAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IG1GaWVsZENvdW50OyBjdCsrKSB7Ci0gICAgICAgIHRvdGFsICs9IG1GaWVsZHNbY3RdLmUtPm1CaXRzOworICAgICAgICB0b3RhbCArPSBtRmllbGRzW2N0XS5lLT5tQml0cyAqIG1GaWVsZHNbY3RdLmFycmF5U2l6ZTs7CiAgICAgfQogICAgIHJldHVybiB0b3RhbDsKIH0KIAotc2l6ZV90IEVsZW1lbnQ6OmdldEZpZWxkT2Zmc2V0Qml0cyh1aW50MzJfdCBjb21wb25lbnROdW1iZXIpIGNvbnN0Ci17Ci0gICAgc2l6ZV90IG9mZnNldCA9IDA7Ci0gICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgY29tcG9uZW50TnVtYmVyOyBjdCsrKSB7Ci0gICAgICAgIG9mZnNldCArPSBtRmllbGRzW2N0XS5lLT5tQml0czsKLSAgICB9Ci0gICAgcmV0dXJuIG9mZnNldDsKLX0KLQogdm9pZCBFbGVtZW50OjpkdW1wTE9HVihjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0CiB7CiAgICAgT2JqZWN0QmFzZTo6ZHVtcExPR1YocHJlZml4KTsKQEAgLTgzLDYgKzgxLDEwMCBAQAogICAgIH0KIH0KIAordm9pZCBFbGVtZW50OjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIC8vIE5lZWQgdG8gaWRlbnRpZnkgb3Vyc2VsdmVzCisgICAgc3RyZWFtLT5hZGRVMzIoKHVpbnQzMl90KWdldENsYXNzSWQoKSk7CisKKyAgICBTdHJpbmc4IG5hbWUoZ2V0TmFtZSgpKTsKKyAgICBzdHJlYW0tPmFkZFN0cmluZygmbmFtZSk7CisKKyAgICBtQ29tcG9uZW50LnNlcmlhbGl6ZShzdHJlYW0pOworCisgICAgLy8gTm93IHNlcmlhbGl6ZSBhbGwgdGhlIGZpZWxkcworICAgIHN0cmVhbS0+YWRkVTMyKG1GaWVsZENvdW50KTsKKyAgICBmb3IodWludDMyX3QgY3QgPSAwOyBjdCA8IG1GaWVsZENvdW50OyBjdCsrKSB7CisgICAgICAgIHN0cmVhbS0+YWRkU3RyaW5nKCZtRmllbGRzW2N0XS5uYW1lKTsKKyAgICAgICAgc3RyZWFtLT5hZGRVMzIobUZpZWxkc1tjdF0uYXJyYXlTaXplKTsKKyAgICAgICAgbUZpZWxkc1tjdF0uZS0+c2VyaWFsaXplKHN0cmVhbSk7CisgICAgfQorfQorCitFbGVtZW50ICpFbGVtZW50OjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIC8vIEZpcnN0IG1ha2Ugc3VyZSB3ZSBhcmUgcmVhZGluZyB0aGUgY29ycmVjdCBvYmplY3QKKyAgICBSc0EzRENsYXNzSUQgY2xhc3NJRCA9IChSc0EzRENsYXNzSUQpc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYoY2xhc3NJRCAhPSBSU19BM0RfQ0xBU1NfSURfRUxFTUVOVCkgeworICAgICAgICBMT0dFKCJlbGVtZW50IGxvYWRpbmcgc2tpcHBlZCBkdWUgdG8gaW52YWxpZCBjbGFzcyBpZFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFN0cmluZzggbmFtZTsKKyAgICBzdHJlYW0tPmxvYWRTdHJpbmcoJm5hbWUpOworCisgICAgRWxlbWVudCAqZWxlbSA9IG5ldyBFbGVtZW50KHJzYyk7CisgICAgZWxlbS0+bUNvbXBvbmVudC5sb2FkRnJvbVN0cmVhbShzdHJlYW0pOworICAgIGVsZW0tPm1CaXRzID0gZWxlbS0+bUNvbXBvbmVudC5nZXRCaXRzKCk7CisgICAgZWxlbS0+bUhhc1JlZmVyZW5jZSA9IGVsZW0tPm1Db21wb25lbnQuaXNSZWZlcmVuY2UoKTsKKworICAgIGVsZW0tPm1GaWVsZENvdW50ID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYoZWxlbS0+bUZpZWxkQ291bnQpIHsKKyAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgZWxlbS0+bUZpZWxkcyA9IG5ldyBFbGVtZW50RmllbGRfdCBbZWxlbS0+bUZpZWxkQ291bnRdOworICAgICAgICBmb3IodWludDMyX3QgY3QgPSAwOyBjdCA8IGVsZW0tPm1GaWVsZENvdW50OyBjdCArKykgeworICAgICAgICAgICAgc3RyZWFtLT5sb2FkU3RyaW5nKCZlbGVtLT5tRmllbGRzW2N0XS5uYW1lKTsKKyAgICAgICAgICAgIGVsZW0tPm1GaWVsZHNbY3RdLmFycmF5U2l6ZSA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgICAgICAgICAgRWxlbWVudCAqZmllbGRFbGVtID0gRWxlbWVudDo6Y3JlYXRlRnJvbVN0cmVhbShyc2MsIHN0cmVhbSk7CisgICAgICAgICAgICBlbGVtLT5tRmllbGRzW2N0XS5lLnNldChmaWVsZEVsZW0pOworICAgICAgICAgICAgZWxlbS0+bUZpZWxkc1tjdF0ub2Zmc2V0Qml0cyA9IG9mZnNldDsKKyAgICAgICAgICAgIG9mZnNldCArPSBmaWVsZEVsZW0tPmdldFNpemVCaXRzKCk7CisgICAgICAgICAgICAvLyBDaGVjayBpZiBvdXIgc3ViLWVsZW1lbnRzIGhhdmUgcmVmZXJlbmNlcworICAgICAgICAgICAgaWYoZmllbGRFbGVtLT5tSGFzUmVmZXJlbmNlKSB7CisgICAgICAgICAgICAgICAgZWxlbS0+bUhhc1JlZmVyZW5jZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoaXMgYWxyZWFkeSBleGlzdHMKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgcnNjLT5tU3RhdGVFbGVtZW50Lm1FbGVtZW50cy5zaXplKCk7IGN0KyspIHsKKyAgICAgICAgRWxlbWVudCAqZWUgPSByc2MtPm1TdGF0ZUVsZW1lbnQubUVsZW1lbnRzW2N0XTsKKyAgICAgICAgaWYoZWUtPmlzRXF1YWwoZWxlbSkpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBlbGVtOworICAgICAgICAgICAgZWUtPmluY1VzZXJSZWYoKTsKKyAgICAgICAgICAgIHJldHVybiBlZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJzYy0+bVN0YXRlRWxlbWVudC5tRWxlbWVudHMucHVzaChlbGVtKTsKKyAgICByZXR1cm4gZWxlbTsKK30KKworYm9vbCBFbGVtZW50Ojppc0VxdWFsKGNvbnN0IEVsZW1lbnQgKm90aGVyKSBjb25zdCB7CisgICAgaWYob3RoZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghb3RoZXItPmdldEZpZWxkQ291bnQoKSAmJiAhbUZpZWxkQ291bnQpIHsKKyAgICAgICAgaWYoKG90aGVyLT5nZXRUeXBlKCkgPT0gZ2V0VHlwZSgpKSAmJgorICAgICAgICAgICAob3RoZXItPmdldEtpbmQoKSA9PSBnZXRLaW5kKCkpICYmCisgICAgICAgICAgIChvdGhlci0+Z2V0Q29tcG9uZW50KCkuZ2V0SXNOb3JtYWxpemVkKCkgPT0gZ2V0Q29tcG9uZW50KCkuZ2V0SXNOb3JtYWxpemVkKCkpICYmCisgICAgICAgICAgIChvdGhlci0+Z2V0Q29tcG9uZW50KCkuZ2V0VmVjdG9yU2l6ZSgpID09IGdldENvbXBvbmVudCgpLmdldFZlY3RvclNpemUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG90aGVyLT5nZXRGaWVsZENvdW50KCkgPT0gbUZpZWxkQ291bnQpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpPTA7IGkgPCBtRmllbGRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKCFvdGhlci0+bUZpZWxkc1tpXS5lLT5pc0VxdWFsKG1GaWVsZHNbaV0uZS5nZXQoKSkpIHx8CisgICAgICAgICAgICAgICAgKG90aGVyLT5tRmllbGRzW2ldLm5hbWUubGVuZ3RoKCkgIT0gbUZpZWxkc1tpXS5uYW1lLmxlbmd0aCgpKSB8fAorICAgICAgICAgICAgICAgIChvdGhlci0+bUZpZWxkc1tpXS5uYW1lICE9IG1GaWVsZHNbaV0ubmFtZSkgfHwKKyAgICAgICAgICAgICAgICAob3RoZXItPm1GaWVsZHNbaV0uYXJyYXlTaXplICE9IG1GaWVsZHNbaV0uYXJyYXlTaXplKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQogCiBjb25zdCBFbGVtZW50ICogRWxlbWVudDo6Y3JlYXRlKENvbnRleHQgKnJzYywgUnNEYXRhVHlwZSBkdCwgUnNEYXRhS2luZCBkaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTm9ybSwgdWludDMyX3QgdmVjU2l6ZSkKQEAgLTEwNCwxMiArMTk2LDEzIEBACiAgICAgRWxlbWVudCAqZSA9IG5ldyBFbGVtZW50KHJzYyk7CiAgICAgZS0+bUNvbXBvbmVudC5zZXQoZHQsIGRrLCBpc05vcm0sIHZlY1NpemUpOwogICAgIGUtPm1CaXRzID0gZS0+bUNvbXBvbmVudC5nZXRCaXRzKCk7CisgICAgZS0+bUhhc1JlZmVyZW5jZSA9IGUtPm1Db21wb25lbnQuaXNSZWZlcmVuY2UoKTsKICAgICByc2MtPm1TdGF0ZUVsZW1lbnQubUVsZW1lbnRzLnB1c2goZSk7CiAgICAgcmV0dXJuIGU7CiB9CiAKIGNvbnN0IEVsZW1lbnQgKiBFbGVtZW50OjpjcmVhdGUoQ29udGV4dCAqcnNjLCBzaXplX3QgY291bnQsIGNvbnN0IEVsZW1lbnQgKiplaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5pbiwgY29uc3Qgc2l6ZV90ICogbGVuZ3RocykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmluLCBjb25zdCBzaXplX3QgKiBsZW5ndGhzLCBjb25zdCB1aW50MzJfdCAqYXNpbikKIHsKICAgICAvLyBMb29rIGZvciBhbiBleGlzdGluZyBtYXRjaC4KICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgcnNjLT5tU3RhdGVFbGVtZW50Lm1FbGVtZW50cy5zaXplKCk7IGN0KyspIHsKQEAgLTExOSw3ICsyMTIsOCBAQAogICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpPTA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKChlZS0+bUZpZWxkc1tpXS5lLmdldCgpICE9IGVpbltpXSkgfHwKICAgICAgICAgICAgICAgICAgICAgKGVlLT5tRmllbGRzW2ldLm5hbWUubGVuZ3RoKCkgIT0gbGVuZ3Roc1tpXSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKGVlLT5tRmllbGRzW2ldLm5hbWUgIT0gbmluW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAoZWUtPm1GaWVsZHNbaV0ubmFtZSAhPSBuaW5baV0pIHx8CisgICAgICAgICAgICAgICAgICAgIChlZS0+bUZpZWxkc1tpXS5hcnJheVNpemUgIT0gYXNpbltpXSkpIHsKICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTM0LDU0ICsyMjgsMjMgQEAKICAgICBFbGVtZW50ICplID0gbmV3IEVsZW1lbnQocnNjKTsKICAgICBlLT5tRmllbGRzID0gbmV3IEVsZW1lbnRGaWVsZF90IFtjb3VudF07CiAgICAgZS0+bUZpZWxkQ291bnQgPSBjb3VudDsKKyAgICBzaXplX3QgYml0cyA9IDA7CiAgICAgZm9yIChzaXplX3QgY3Q9MDsgY3QgPCBjb3VudDsgY3QrKykgewogICAgICAgICBlLT5tRmllbGRzW2N0XS5lLnNldChlaW5bY3RdKTsKICAgICAgICAgZS0+bUZpZWxkc1tjdF0ubmFtZS5zZXRUbyhuaW5bY3RdLCBsZW5ndGhzW2N0XSk7CisgICAgICAgIGUtPm1GaWVsZHNbY3RdLm9mZnNldEJpdHMgPSBiaXRzOworICAgICAgICBlLT5tRmllbGRzW2N0XS5hcnJheVNpemUgPSBhc2luW2N0XTsKKyAgICAgICAgYml0cyArPSBlaW5bY3RdLT5nZXRTaXplQml0cygpOworCisgICAgICAgIGlmIChlaW5bY3RdLT5tSGFzUmVmZXJlbmNlKSB7CisgICAgICAgICAgICBlLT5tSGFzUmVmZXJlbmNlID0gdHJ1ZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJzYy0+bVN0YXRlRWxlbWVudC5tRWxlbWVudHMucHVzaChlKTsKICAgICByZXR1cm4gZTsKIH0KIAotU3RyaW5nOCBFbGVtZW50OjpnZXRDU3RydWN0Qm9keSh1aW50MzJfdCBpbmRlbnQpIGNvbnN0Ci17Ci0gICAgU3RyaW5nOCBzaTsKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgaW5kZW50OyBjdCsrKSB7Ci0gICAgICAgIHNpLmFwcGVuZCgiICIpOwotICAgIH0KLQotICAgIFN0cmluZzggcyhzaSk7Ci0gICAgcy5hcHBlbmQoIntcbiIpOwotICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IG1GaWVsZENvdW50OyBjdCsrKSB7Ci0gICAgICAgIHMuYXBwZW5kKHNpKTsKLSAgICAgICAgcy5hcHBlbmQobUZpZWxkc1tjdF0uZS0+Z2V0Q1R5cGUoaW5kZW50KzQpKTsKLSAgICAgICAgcy5hcHBlbmQoIiAiKTsKLSAgICAgICAgcy5hcHBlbmQobUZpZWxkc1tjdF0ubmFtZSk7Ci0gICAgICAgIHMuYXBwZW5kKCI7XG4iKTsKLSAgICB9Ci0gICAgcy5hcHBlbmQoc2kpOwotICAgIHMuYXBwZW5kKCJ9Iik7Ci0gICAgcmV0dXJuIHM7Ci19Ci0KLVN0cmluZzggRWxlbWVudDo6Z2V0Q1R5cGUodWludDMyX3QgaW5kZW50KSBjb25zdAotewotICAgIFN0cmluZzggczsKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgaW5kZW50OyBjdCsrKSB7Ci0gICAgICAgIHMuYXBwZW5kKCIgIik7Ci0gICAgfQotCi0gICAgaWYgKCFtRmllbGRDb3VudCkgewotICAgICAgICAvLyBCYXNpYyBjb21wb25lbnQuCi0gICAgICAgIHMuYXBwZW5kKG1Db21wb25lbnQuZ2V0Q1R5cGUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcy5hcHBlbmQoInN0cnVjdCAiKTsKLSAgICAgICAgcy5hcHBlbmQoZ2V0Q1N0cnVjdEJvZHkoaW5kZW50KSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHM7Ci19Ci0KIFN0cmluZzggRWxlbWVudDo6Z2V0R0xTTFR5cGUodWludDMyX3QgaW5kZW50KSBjb25zdAogewogICAgIFN0cmluZzggczsKQEAgLTIwMSwxMCArMjY0LDYwIEBACiAgICAgcmV0dXJuIHM7CiB9CiAKK3ZvaWQgRWxlbWVudDo6aW5jUmVmcyhjb25zdCB2b2lkICpwdHIpIGNvbnN0Cit7CisgICAgaWYgKCFtRmllbGRDb3VudCkgeworICAgICAgICBpZiAobUNvbXBvbmVudC5pc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICBPYmplY3RCYXNlICpjb25zdCpvYnAgPSBzdGF0aWNfY2FzdDxPYmplY3RCYXNlICpjb25zdCo+KHB0cik7CisgICAgICAgICAgICBPYmplY3RCYXNlICpvYiA9IG9icFswXTsKKyAgICAgICAgICAgIGlmIChvYikgb2ItPmluY1N5c1JlZigpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpwID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCAqPihwdHIpOworICAgIGZvciAodWludDMyX3QgaT0wOyBpIDwgbUZpZWxkQ291bnQ7IGkrKykgeworICAgICAgICBpZiAobUZpZWxkc1tpXS5lLT5tSGFzUmVmZXJlbmNlKSB7CisgICAgICAgICAgICBwID0gJnBbbUZpZWxkc1tpXS5vZmZzZXRCaXRzID4+IDNdOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1GaWVsZHNbaV0uYXJyYXlTaXplOyBjdCsrKSB7CisgICAgICAgICAgICAgICAgbUZpZWxkc1tpXS5lLT5pbmNSZWZzKHApOworICAgICAgICAgICAgICAgIHAgKz0gbUZpZWxkc1tpXS5lLT5nZXRTaXplQnl0ZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBFbGVtZW50OjpkZWNSZWZzKGNvbnN0IHZvaWQgKnB0cikgY29uc3QKK3sKKyAgICBpZiAoIW1GaWVsZENvdW50KSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50LmlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIE9iamVjdEJhc2UgKmNvbnN0Km9icCA9IHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKmNvbnN0Kj4ocHRyKTsKKyAgICAgICAgICAgIE9iamVjdEJhc2UgKm9iID0gb2JwWzBdOworICAgICAgICAgICAgaWYgKG9iKSBvYi0+ZGVjU3lzUmVmKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90ICo+KHB0cik7CisgICAgZm9yICh1aW50MzJfdCBpPTA7IGkgPCBtRmllbGRDb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChtRmllbGRzW2ldLmUtPm1IYXNSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIHAgPSAmcFttRmllbGRzW2ldLm9mZnNldEJpdHMgPj4gM107CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUZpZWxkc1tpXS5hcnJheVNpemU7IGN0KyspIHsKKyAgICAgICAgICAgICAgICBtRmllbGRzW2ldLmUtPmRlY1JlZnMocCk7CisgICAgICAgICAgICAgICAgcCArPSBtRmllbGRzW2ldLmUtPmdldFNpemVCeXRlcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQogCiAKIEVsZW1lbnRTdGF0ZTo6RWxlbWVudFN0YXRlKCkKIHsKKyAgICBjb25zdCB1aW50MzJfdCBpbml0aWFsQ2FwYWNpdHkgPSAzMjsKKyAgICBtQnVpbGRlckVsZW1lbnRzLnNldENhcGFjaXR5KGluaXRpYWxDYXBhY2l0eSk7CisgICAgbUJ1aWxkZXJOYW1lU3RyaW5ncy5zZXRDYXBhY2l0eShpbml0aWFsQ2FwYWNpdHkpOworICAgIG1CdWlsZGVyTmFtZUxlbmd0aHMuc2V0Q2FwYWNpdHkoaW5pdGlhbENhcGFjaXR5KTsKKyAgICBtQnVpbGRlckFycmF5cy5zZXRDYXBhY2l0eShpbml0aWFsQ2FwYWNpdHkpOwogfQogCiBFbGVtZW50U3RhdGU6On5FbGVtZW50U3RhdGUoKQpAQCAtMjEyLDYgKzMyNSwyOSBAQAogICAgIHJzQXNzZXJ0KCFtRWxlbWVudHMuc2l6ZSgpKTsKIH0KIAordm9pZCBFbGVtZW50U3RhdGU6OmVsZW1lbnRCdWlsZGVyQmVnaW4oKSB7CisgICAgbUJ1aWxkZXJFbGVtZW50cy5jbGVhcigpOworICAgIG1CdWlsZGVyTmFtZVN0cmluZ3MuY2xlYXIoKTsKKyAgICBtQnVpbGRlck5hbWVMZW5ndGhzLmNsZWFyKCk7CisgICAgbUJ1aWxkZXJBcnJheXMuY2xlYXIoKTsKK30KKwordm9pZCBFbGVtZW50U3RhdGU6OmVsZW1lbnRCdWlsZGVyQWRkKGNvbnN0IEVsZW1lbnQgKmUsIGNvbnN0IGNoYXIgKm5hbWVTdHIsIHVpbnQzMl90IGFycmF5U2l6ZSkgeworICAgIG1CdWlsZGVyRWxlbWVudHMucHVzaChlKTsKKyAgICBtQnVpbGRlck5hbWVTdHJpbmdzLnB1c2gobmFtZVN0cik7CisgICAgbUJ1aWxkZXJOYW1lTGVuZ3Rocy5wdXNoKHN0cmxlbihuYW1lU3RyKSk7CisgICAgbUJ1aWxkZXJBcnJheXMucHVzaChhcnJheVNpemUpOworCit9CisKK2NvbnN0IEVsZW1lbnQgKkVsZW1lbnRTdGF0ZTo6ZWxlbWVudEJ1aWxkZXJDcmVhdGUoQ29udGV4dCAqcnNjKSB7CisgICAgcmV0dXJuIEVsZW1lbnQ6OmNyZWF0ZShyc2MsIG1CdWlsZGVyRWxlbWVudHMuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKG1CdWlsZGVyRWxlbWVudHMuZWRpdEFycmF5KClbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKG1CdWlsZGVyTmFtZVN0cmluZ3MuZWRpdEFycmF5KClbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRlck5hbWVMZW5ndGhzLmVkaXRBcnJheSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRlckFycmF5cy5lZGl0QXJyYXkoKSk7Cit9CisKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vCkBAIC0yMzUsMTQgKzM3MSw0MSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJzRWxlbWVudCAqIGVpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKiBuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90ICogbmFtZUxlbmd0aHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCAqIG5hbWVMZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqIGFycmF5U2l6ZXMpCiB7CiAgICAgLy9MT0dFKCJyc2lfRWxlbWVudENyZWF0ZTIgJWkiLCBjb3VudCk7Ci0gICAgY29uc3QgRWxlbWVudCAqZSA9IEVsZW1lbnQ6OmNyZWF0ZShyc2MsIGNvdW50LCAoY29uc3QgRWxlbWVudCAqKillaW4sIG5hbWVzLCBuYW1lTGVuZ3Rocyk7CisgICAgY29uc3QgRWxlbWVudCAqZSA9IEVsZW1lbnQ6OmNyZWF0ZShyc2MsIGNvdW50LCAoY29uc3QgRWxlbWVudCAqKillaW4sIG5hbWVzLCBuYW1lTGVuZ3RocywgYXJyYXlTaXplcyk7CiAgICAgZS0+aW5jVXNlclJlZigpOwogICAgIHJldHVybiAoUnNFbGVtZW50KWU7CiB9CiAKK3ZvaWQgcnNpX0VsZW1lbnRHZXROYXRpdmVEYXRhKENvbnRleHQgKnJzYywgUnNFbGVtZW50IGVsZW0sIHVpbnQzMl90ICplbGVtRGF0YSwgdWludDMyX3QgZWxlbURhdGFTaXplKQoreworICAgIHJzQXNzZXJ0KGVsZW1EYXRhU2l6ZSA9PSA1KTsKKyAgICAvLyB3ZSB3aWxsIHBhY2sgbVR5cGU7IG1LaW5kOyBtTm9ybWFsaXplZDsgbVZlY3RvclNpemU7IE51bVN1YkVsZW1lbnRzCisgICAgRWxlbWVudCAqZSA9IHN0YXRpY19jYXN0PEVsZW1lbnQgKj4oZWxlbSk7CisKKyAgICAoKmVsZW1EYXRhKyspID0gKHVpbnQzMl90KWUtPmdldFR5cGUoKTsKKyAgICAoKmVsZW1EYXRhKyspID0gKHVpbnQzMl90KWUtPmdldEtpbmQoKTsKKyAgICAoKmVsZW1EYXRhKyspID0gZS0+Z2V0Q29tcG9uZW50KCkuZ2V0SXNOb3JtYWxpemVkKCkgPyAxIDogMDsKKyAgICAoKmVsZW1EYXRhKyspID0gZS0+Z2V0Q29tcG9uZW50KCkuZ2V0VmVjdG9yU2l6ZSgpOworICAgICgqZWxlbURhdGErKykgPSBlLT5nZXRGaWVsZENvdW50KCk7CisKK30KKwordm9pZCByc2lfRWxlbWVudEdldFN1YkVsZW1lbnRzKENvbnRleHQgKnJzYywgUnNFbGVtZW50IGVsZW0sIHVpbnQzMl90ICppZHMsIGNvbnN0IGNoYXIgKipuYW1lcywgdWludDMyX3QgZGF0YVNpemUpCit7CisgICAgRWxlbWVudCAqZSA9IHN0YXRpY19jYXN0PEVsZW1lbnQgKj4oZWxlbSk7CisgICAgcnNBc3NlcnQoZS0+Z2V0RmllbGRDb3VudCgpID09IGRhdGFTaXplKTsKKworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IGRhdGFTaXplOyBpICsrKSB7CisgICAgICAgIGlkc1tpXSA9ICh1aW50MzJfdCllLT5nZXRGaWVsZChpKTsKKyAgICAgICAgbmFtZXNbaV0gPSBlLT5nZXRGaWVsZE5hbWUoaSk7CisgICAgfQorCit9CisKIAogfQogfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0VsZW1lbnQuaCBiL2xpYnMvcnMvcnNFbGVtZW50LmgKaW5kZXggMDJhMWNhMi4uNTBiY2E4NSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0VsZW1lbnQuaAorKysgYi9saWJzL3JzL3JzRWxlbWVudC5oCkBAIC00MCw5ICs0MCwxMSBAQAogICAgICAgICByZXR1cm4gKGdldFNpemVCaXRzKCkgKyA3KSA+PiAzOwogICAgIH0KIAotICAgIHNpemVfdCBnZXRGaWVsZE9mZnNldEJpdHModWludDMyX3QgY29tcG9uZW50TnVtYmVyKSBjb25zdDsKKyAgICBzaXplX3QgZ2V0RmllbGRPZmZzZXRCaXRzKHVpbnQzMl90IGNvbXBvbmVudE51bWJlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbUZpZWxkc1tjb21wb25lbnROdW1iZXJdLm9mZnNldEJpdHM7CisgICAgfQogICAgIHNpemVfdCBnZXRGaWVsZE9mZnNldEJ5dGVzKHVpbnQzMl90IGNvbXBvbmVudE51bWJlcikgY29uc3QgewotICAgICAgICByZXR1cm4gKGdldEZpZWxkT2Zmc2V0Qml0cyhjb21wb25lbnROdW1iZXIpICsgNykgPj4gMzsKKyAgICAgICAgcmV0dXJuIG1GaWVsZHNbY29tcG9uZW50TnVtYmVyXS5vZmZzZXRCaXRzID4+IDM7CiAgICAgfQogCiAgICAgdWludDMyX3QgZ2V0RmllbGRDb3VudCgpIGNvbnN0IHtyZXR1cm4gbUZpZWxkQ291bnQ7fQpAQCAtNTQsMTYgKzU2LDIzIEBACiAgICAgUnNEYXRhS2luZCBnZXRLaW5kKCkgY29uc3Qge3JldHVybiBtQ29tcG9uZW50LmdldEtpbmQoKTt9CiAgICAgdWludDMyX3QgZ2V0Qml0cygpIGNvbnN0IHtyZXR1cm4gbUJpdHM7fQogCi0gICAgU3RyaW5nOCBnZXRDVHlwZSh1aW50MzJfdCBpbmRlbnQ9MCkgY29uc3Q7Ci0gICAgU3RyaW5nOCBnZXRDU3RydWN0Qm9keSh1aW50MzJfdCBpbmRlbnQ9MCkgY29uc3Q7CiAgICAgU3RyaW5nOCBnZXRHTFNMVHlwZSh1aW50MzJfdCBpbmRlbnQ9MCkgY29uc3Q7CiAKICAgICB2b2lkIGR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfRUxFTUVOVDsgfQorICAgIHN0YXRpYyBFbGVtZW50ICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKIAogICAgIHN0YXRpYyBjb25zdCBFbGVtZW50ICogY3JlYXRlKENvbnRleHQgKnJzYywgUnNEYXRhVHlwZSBkdCwgUnNEYXRhS2luZCBkaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTm9ybSwgdWludDMyX3QgdmVjU2l6ZSk7CiAgICAgc3RhdGljIGNvbnN0IEVsZW1lbnQgKiBjcmVhdGUoQ29udGV4dCAqcnNjLCBzaXplX3QgY291bnQsIGNvbnN0IEVsZW1lbnQgKiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKiwgY29uc3Qgc2l6ZV90ICogbGVuZ3Rocyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKiwgY29uc3Qgc2l6ZV90ICogbGVuZ3RocywgY29uc3QgdWludDMyX3QgKmFzaW4pOworCisgICAgdm9pZCBpbmNSZWZzKGNvbnN0IHZvaWQgKikgY29uc3Q7CisgICAgdm9pZCBkZWNSZWZzKGNvbnN0IHZvaWQgKikgY29uc3Q7CisgICAgYm9vbCBnZXRIYXNSZWZlcmVuY2VzKCkgY29uc3Qge3JldHVybiBtSGFzUmVmZXJlbmNlO30KKworICAgIGJvb2wgaXNFcXVhbChjb25zdCBFbGVtZW50ICpvdGhlcikgY29uc3Q7CiAKIHByb3RlY3RlZDoKICAgICAvLyBkZWFsbG9jYXRlIGFueSBjb21wb25lbnRzIHRoYXQgYXJlIHBhcnQgb2YgdGhpcyBlbGVtZW50LgpAQCAtNzIsOSArODEsMTIgQEAKICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgIFN0cmluZzggbmFtZTsKICAgICAgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBFbGVtZW50PiBlOworICAgICAgICB1aW50MzJfdCBvZmZzZXRCaXRzOworICAgICAgICB1aW50MzJfdCBhcnJheVNpemU7CiAgICAgfSBFbGVtZW50RmllbGRfdDsKICAgICBFbGVtZW50RmllbGRfdCAqbUZpZWxkczsKICAgICBzaXplX3QgbUZpZWxkQ291bnQ7CisgICAgYm9vbCBtSGFzUmVmZXJlbmNlOwogCiAKICAgICBFbGVtZW50KENvbnRleHQgKik7CkBAIC04OSw4ICsxMDEsMTcgQEAKICAgICBFbGVtZW50U3RhdGUoKTsKICAgICB+RWxlbWVudFN0YXRlKCk7CiAKKyAgICB2b2lkIGVsZW1lbnRCdWlsZGVyQmVnaW4oKTsKKyAgICB2b2lkIGVsZW1lbnRCdWlsZGVyQWRkKGNvbnN0IEVsZW1lbnQgKmUsIGNvbnN0IGNoYXIgKm5hbWVTdHIsIHVpbnQzMl90IGFycmF5U2l6ZSk7CisgICAgY29uc3QgRWxlbWVudCAqZWxlbWVudEJ1aWxkZXJDcmVhdGUoQ29udGV4dCAqcnNjKTsKKwogICAgIC8vIENhY2hlIG9mIGFsbCBleGlzdGluZyBlbGVtZW50cy4KLSAgICBWZWN0b3I8Y29uc3QgRWxlbWVudCAqPiBtRWxlbWVudHM7CisgICAgVmVjdG9yPEVsZW1lbnQgKj4gbUVsZW1lbnRzOworcHJpdmF0ZToKKyAgICBWZWN0b3I8Y29uc3QgRWxlbWVudCAqPiBtQnVpbGRlckVsZW1lbnRzOworICAgIFZlY3Rvcjxjb25zdCBjaGFyKj4gbUJ1aWxkZXJOYW1lU3RyaW5nczsKKyAgICBWZWN0b3I8c2l6ZV90PiBtQnVpbGRlck5hbWVMZW5ndGhzOworICAgIFZlY3Rvcjx1aW50MzJfdD4gbUJ1aWxkZXJBcnJheXM7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNGaWxlQTNELmNwcCBiL2xpYnMvcnMvcnNGaWxlQTNELmNwcAppbmRleCBlMzI3MmM1Li5jOTBlZGMyIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzRmlsZUEzRC5jcHAKKysrIGIvbGlicy9ycy9yc0ZpbGVBM0QuY3BwCkBAIC0xNSw4MSArMTUsMTkzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNlbmRpZgogCi0KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSAicnNGaWxlQTNELmgiCiAKICNpbmNsdWRlICJyc01lc2guaCIKKyNpbmNsdWRlICJyc0FuaW1hdGlvbi5oIgorCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKIAotCi0KLUZpbGVBM0Q6OkZpbGVBM0QoKQorRmlsZUEzRDo6RmlsZUEzRChDb250ZXh0ICpyc2MpIDogT2JqZWN0QmFzZShyc2MpCiB7Ci0gICAgbVJzYyA9IE5VTEw7CisgICAgbUFsbG9jID0gTlVMTDsKKyAgICBtRGF0YSA9IE5VTEw7CisgICAgbVdyaXRlU3RyZWFtID0gTlVMTDsKKyAgICBtUmVhZFN0cmVhbSA9IE5VTEw7CisKKyAgICBtTWFqb3JWZXJzaW9uID0gMDsKKyAgICBtTWlub3JWZXJzaW9uID0gMTsKKyAgICBtRGF0YVNpemUgPSAwOwogfQogCiBGaWxlQTNEOjp+RmlsZUEzRCgpCiB7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IG1JbmRleC5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgZGVsZXRlIG1JbmRleFtpXTsKKyAgICB9CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IG1Xcml0ZUluZGV4LnNpemUoKTsgaSArKykgeworICAgICAgICBkZWxldGUgbVdyaXRlSW5kZXhbaV07CisgICAgfQorICAgIGlmKG1Xcml0ZVN0cmVhbSkgeworICAgICAgICBkZWxldGUgbVdyaXRlU3RyZWFtOworICAgIH0KKyAgICBpZihtUmVhZFN0cmVhbSkgeworICAgICAgICBkZWxldGUgbVdyaXRlU3RyZWFtOworICAgIH0KKyAgICBpZihtQWxsb2MpIHsKKyAgICAgICAgZnJlZShtQWxsb2MpOworICAgIH0KIH0KIAotYm9vbCBGaWxlQTNEOjpsb2FkKENvbnRleHQgKnJzYywgRklMRSAqZikKK3ZvaWQgRmlsZUEzRDo6cGFyc2VIZWFkZXIoSVN0cmVhbSAqaGVhZGVyU3RyZWFtKQoreworICAgIG1NYWpvclZlcnNpb24gPSBoZWFkZXJTdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBtTWlub3JWZXJzaW9uID0gaGVhZGVyU3RyZWFtLT5sb2FkVTMyKCk7CisgICAgdWludDMyX3QgZmxhZ3MgPSBoZWFkZXJTdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBtVXNlNjRCaXRPZmZzZXRzID0gKGZsYWdzICYgMSkgIT0gMDsKKworICAgIHVpbnQzMl90IG51bUluZGV4RW50cmllcyA9IGhlYWRlclN0cmVhbS0+bG9hZFUzMigpOworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG51bUluZGV4RW50cmllczsgaSArKykgeworICAgICAgICBBM0RJbmRleEVudHJ5ICplbnRyeSA9IG5ldyBBM0RJbmRleEVudHJ5KCk7CisgICAgICAgIGhlYWRlclN0cmVhbS0+bG9hZFN0cmluZygmZW50cnktPm1PYmplY3ROYW1lKTsKKyAgICAgICAgTE9HVigiSGVhZGVyIGRhdGEsIGVudHJ5IG5hbWUgPSAlcyIsIGVudHJ5LT5tT2JqZWN0TmFtZS5zdHJpbmcoKSk7CisgICAgICAgIGVudHJ5LT5tVHlwZSA9IChSc0EzRENsYXNzSUQpaGVhZGVyU3RyZWFtLT5sb2FkVTMyKCk7CisgICAgICAgIGlmKG1Vc2U2NEJpdE9mZnNldHMpeworICAgICAgICAgICAgZW50cnktPm1PZmZzZXQgPSBoZWFkZXJTdHJlYW0tPmxvYWRPZmZzZXQoKTsKKyAgICAgICAgICAgIGVudHJ5LT5tTGVuZ3RoID0gaGVhZGVyU3RyZWFtLT5sb2FkT2Zmc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBlbnRyeS0+bU9mZnNldCA9IGhlYWRlclN0cmVhbS0+bG9hZFUzMigpOworICAgICAgICAgICAgZW50cnktPm1MZW5ndGggPSBoZWFkZXJTdHJlYW0tPmxvYWRVMzIoKTsKKyAgICAgICAgfQorICAgICAgICBlbnRyeS0+bVJzT2JqID0gTlVMTDsKKyAgICAgICAgbUluZGV4LnB1c2goZW50cnkpOworICAgIH0KK30KKworYm9vbCBGaWxlQTNEOjpsb2FkKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpCit7CisgICAgY29uc3QgdWludDhfdCAqbG9jYWxEYXRhID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworCisgICAgc2l6ZV90IGxlbmd0aFJlbWFpbmluZyA9IGxlbmd0aDsKKyAgICBzaXplX3QgbWFnaWNTdHJMZW4gPSAxMjsKKyAgICBpZiAoKGxlbmd0aCA8IG1hZ2ljU3RyTGVuKSB8fAorICAgICAgICBtZW1jbXAoZGF0YSwgIkFuZHJvaWQzRF9mZiIsIG1hZ2ljU3RyTGVuKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbG9jYWxEYXRhICs9IG1hZ2ljU3RyTGVuOworICAgIGxlbmd0aFJlbWFpbmluZyAtPSBtYWdpY1N0ckxlbjsKKworICAgIC8vIE5leHQgd2UgZ2V0IG91ciBoZWFkZXIgc2l6ZQorICAgIHVpbnQ2NF90IGhlYWRlclNpemUgPSAwOworICAgIGlmKGxlbmd0aFJlbWFpbmluZyA8IHNpemVvZihoZWFkZXJTaXplKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbWVtY3B5KCZoZWFkZXJTaXplLCBsb2NhbERhdGEsIHNpemVvZihoZWFkZXJTaXplKSk7CisgICAgbG9jYWxEYXRhICs9IHNpemVvZihoZWFkZXJTaXplKTsKKyAgICBsZW5ndGhSZW1haW5pbmcgLT0gc2l6ZW9mKGhlYWRlclNpemUpOworCisgICAgaWYobGVuZ3RoUmVtYWluaW5nIDwgaGVhZGVyU2l6ZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDhfdCAqaGVhZGVyRGF0YSA9ICh1aW50OF90ICopbWFsbG9jKGhlYWRlclNpemUpOworICAgIGlmKCFoZWFkZXJEYXRhKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtZW1jcHkoaGVhZGVyRGF0YSwgbG9jYWxEYXRhLCBoZWFkZXJTaXplKTsKKworICAgIC8vIE5vdyBvcGVuIHRoZSBzdHJlYW0gdG8gcGFyc2UgdGhlIGhlYWRlcgorICAgIElTdHJlYW0gaGVhZGVyU3RyZWFtKGhlYWRlckRhdGEsIGZhbHNlKTsKKyAgICBwYXJzZUhlYWRlcigmaGVhZGVyU3RyZWFtKTsKKworICAgIGZyZWUoaGVhZGVyRGF0YSk7CisKKyAgICBsb2NhbERhdGEgKz0gaGVhZGVyU2l6ZTsKKyAgICBsZW5ndGhSZW1haW5pbmcgLT0gaGVhZGVyU2l6ZTsKKworICAgIGlmKGxlbmd0aFJlbWFpbmluZyA8IHNpemVvZihtRGF0YVNpemUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBSZWFkIHRoZSBzaXplIG9mIHRoZSBkYXRhCisgICAgbWVtY3B5KCZtRGF0YVNpemUsIGxvY2FsRGF0YSwgc2l6ZW9mKG1EYXRhU2l6ZSkpOworICAgIGxvY2FsRGF0YSArPSBzaXplb2YobURhdGFTaXplKTsKKyAgICBsZW5ndGhSZW1haW5pbmcgLT0gc2l6ZW9mKG1EYXRhU2l6ZSk7CisKKyAgICBpZihsZW5ndGhSZW1haW5pbmcgPCBtRGF0YVNpemUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFdlIHNob3VsZCBrbm93IGVub3VnaCB0byByZWFkIHRoZSBmaWxlIGluIGF0IHRoaXMgcG9pbnQuCisgICAgbUFsbG9jID0gbWFsbG9jKG1EYXRhU2l6ZSk7CisgICAgaWYgKCFtQWxsb2MpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtRGF0YSA9ICh1aW50OF90ICopbUFsbG9jOworICAgIG1lbWNweShtQWxsb2MsIGxvY2FsRGF0YSwgbURhdGFTaXplKTsKKworICAgIG1SZWFkU3RyZWFtID0gbmV3IElTdHJlYW0obURhdGEsIG1Vc2U2NEJpdE9mZnNldHMpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRmlsZUEzRDo6bG9hZChGSUxFICpmKQogewogICAgIGNoYXIgbWFnaWNTdHJpbmdbMTJdOwogICAgIHNpemVfdCBsZW47CiAKLSAgICBMT0dFKCJmaWxlIG9wZW4gMSIpOworICAgIExPR1YoImZpbGUgb3BlbiAxIik7CiAgICAgbGVuID0gZnJlYWQobWFnaWNTdHJpbmcsIDEsIDEyLCBmKTsKICAgICBpZiAoKGxlbiAhPSAxMikgfHwKICAgICAgICAgbWVtY21wKG1hZ2ljU3RyaW5nLCAiQW5kcm9pZDNEX2ZmIiwgMTIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBMT0dFKCJmaWxlIG9wZW4gMiIpOwotICAgIGxlbiA9IGZyZWFkKCZtTWFqb3JWZXJzaW9uLCAxLCBzaXplb2YobU1ham9yVmVyc2lvbiksIGYpOwotICAgIGlmIChsZW4gIT0gc2l6ZW9mKG1NYWpvclZlcnNpb24pKSB7CisgICAgLy8gTmV4dCB0aGluZyBpcyB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyCisgICAgdWludDY0X3QgaGVhZGVyU2l6ZSA9IDA7CisgICAgbGVuID0gZnJlYWQoJmhlYWRlclNpemUsIDEsIHNpemVvZihoZWFkZXJTaXplKSwgZik7CisgICAgaWYgKGxlbiAhPSBzaXplb2YoaGVhZGVyU2l6ZSkgfHwgaGVhZGVyU2l6ZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBMT0dFKCJmaWxlIG9wZW4gMyIpOwotICAgIGxlbiA9IGZyZWFkKCZtTWlub3JWZXJzaW9uLCAxLCBzaXplb2YobU1pbm9yVmVyc2lvbiksIGYpOwotICAgIGlmIChsZW4gIT0gc2l6ZW9mKG1NaW5vclZlcnNpb24pKSB7CisgICAgdWludDhfdCAqaGVhZGVyRGF0YSA9ICh1aW50OF90ICopbWFsbG9jKGhlYWRlclNpemUpOworICAgIGlmKCFoZWFkZXJEYXRhKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBMT0dFKCJmaWxlIG9wZW4gNCIpOwotICAgIHVpbnQzMl90IGZsYWdzOwotICAgIGxlbiA9IGZyZWFkKCZmbGFncywgMSwgc2l6ZW9mKGZsYWdzKSwgZik7Ci0gICAgaWYgKGxlbiAhPSBzaXplb2YoZmxhZ3MpKSB7CisgICAgbGVuID0gZnJlYWQoaGVhZGVyRGF0YSwgMSwgaGVhZGVyU2l6ZSwgZik7CisgICAgaWYgKGxlbiAhPSBoZWFkZXJTaXplKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgbVVzZTY0Qml0T2Zmc2V0cyA9IChmbGFncyAmIDEpICE9IDA7CiAKLSAgICBMT0dFKCJmaWxlIG9wZW4gNjRiaXQgPSAlaSIsIG1Vc2U2NEJpdE9mZnNldHMpOworICAgIC8vIE5vdyBvcGVuIHRoZSBzdHJlYW0gdG8gcGFyc2UgdGhlIGhlYWRlcgorICAgIElTdHJlYW0gaGVhZGVyU3RyZWFtKGhlYWRlckRhdGEsIGZhbHNlKTsKKyAgICBwYXJzZUhlYWRlcigmaGVhZGVyU3RyZWFtKTsKIAotICAgIGlmIChtVXNlNjRCaXRPZmZzZXRzKSB7Ci0gICAgICAgIGxlbiA9IGZyZWFkKCZtRGF0YVNpemUsIDEsIHNpemVvZihtRGF0YVNpemUpLCBmKTsKLSAgICAgICAgaWYgKGxlbiAhPSBzaXplb2YobURhdGFTaXplKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdWludDMyX3QgdG1wOwotICAgICAgICBsZW4gPSBmcmVhZCgmdG1wLCAxLCBzaXplb2YodG1wKSwgZik7Ci0gICAgICAgIGlmIChsZW4gIT0gc2l6ZW9mKHRtcCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtRGF0YVNpemUgPSB0bXA7CisgICAgZnJlZShoZWFkZXJEYXRhKTsKKworICAgIC8vIE5leHQgdGhpbmcgaXMgdGhlIHNpemUgb2YgdGhlIGhlYWRlcgorICAgIGxlbiA9IGZyZWFkKCZtRGF0YVNpemUsIDEsIHNpemVvZihtRGF0YVNpemUpLCBmKTsKKyAgICBpZiAobGVuICE9IHNpemVvZihtRGF0YVNpemUpIHx8IG1EYXRhU2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBMT0dFKCJmaWxlIG9wZW4gc2l6ZSA9ICVsbGkiLCBtRGF0YVNpemUpOworICAgIExPR1YoImZpbGUgb3BlbiBzaXplID0gJWxsaSIsIG1EYXRhU2l6ZSk7CiAKICAgICAvLyBXZSBzaG91bGQga25vdyBlbm91Z2ggdG8gcmVhZCB0aGUgZmlsZSBpbiBhdCB0aGlzIHBvaW50LgotICAgIGZzZWVrKGYsIFNFRUtfU0VULCAwKTsKLSAgICBtQWxsb2M9IG1hbGxvYyhtRGF0YVNpemUpOworICAgIG1BbGxvYyA9IG1hbGxvYyhtRGF0YVNpemUpOwogICAgIGlmICghbUFsbG9jKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC05OSwyODIgKzIxMSwyNTIgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIExPR0UoImZpbGUgc3RhcnQgcHJvY2Vzc2luZyIpOwotICAgIHJldHVybiBwcm9jZXNzKHJzYyk7CisgICAgbVJlYWRTdHJlYW0gPSBuZXcgSVN0cmVhbShtRGF0YSwgbVVzZTY0Qml0T2Zmc2V0cyk7CisKKyAgICBMT0dWKCJIZWFkZXIgaXMgcmVhZCBhbiBzdHJlYW0gaW5pdGlhbGl6ZWQiKTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBGaWxlQTNEOjpwcm9jZXNzSW5kZXgoQ29udGV4dCAqcnNjLCBBM0RJbmRleEVudHJ5ICppZSkKLXsKLSAgICBib29sIHJldCA9IGZhbHNlOwotICAgIElPIGlvKG1EYXRhICsgaWUtPm1PZmZzZXQsIG1Vc2U2NEJpdE9mZnNldHMpOworc2l6ZV90IEZpbGVBM0Q6OmdldE51bUluZGV4RW50cmllcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluZGV4LnNpemUoKTsKK30KIAotICAgIExPR0UoInByb2Nlc3MgaW5kZXgsIHR5cGUgJWkiLCBpZS0+bVR5cGUpOwotCi0gICAgc3dpdGNoKGllLT5tVHlwZSkgewotICAgIGNhc2UgQ0hVTktfRUxFTUVOVDoKLSAgICAgICAgcHJvY2Vzc0NodW5rX0VsZW1lbnQocnNjLCAmaW8sIGllKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSFVOS19FTEVNRU5UX1NPVVJDRToKLSAgICAgICAgcHJvY2Vzc0NodW5rX0VsZW1lbnRTb3VyY2UocnNjLCAmaW8sIGllKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSFVOS19WRVJUSUNJRVM6Ci0gICAgICAgIHByb2Nlc3NDaHVua19WZXJ0aWNpZXMocnNjLCAmaW8sIGllKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSFVOS19NRVNIOgotICAgICAgICBwcm9jZXNzQ2h1bmtfTWVzaChyc2MsICZpbywgaWUpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIENIVU5LX1BSSU1JVElWRToKLSAgICAgICAgcHJvY2Vzc0NodW5rX1ByaW1pdGl2ZShyc2MsICZpbywgaWUpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBMT0dFKCJGaWxlQTNEIFVua25vd24gY2h1bmsgdHlwZSIpOwotICAgICAgICBicmVhazsKK2NvbnN0IEZpbGVBM0Q6OkEzREluZGV4RW50cnkgKkZpbGVBM0Q6OmdldEluZGV4RW50cnkoc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgaWYoaW5kZXggPCBtSW5kZXguc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBtSW5kZXhbaW5kZXhdOwogICAgIH0KLSAgICByZXR1cm4gKGllLT5tUnNPYmogIT0gTlVMTCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKLWJvb2wgRmlsZUEzRDo6cHJvY2VzcyhDb250ZXh0ICpyc2MpCi17Ci0gICAgTE9HRSgicHJvY2VzcyIpOwotICAgIElPIGlvKG1EYXRhICsgMTIsIG1Vc2U2NEJpdE9mZnNldHMpOwotICAgIGJvb2wgcmV0ID0gdHJ1ZTsKLQotICAgIC8vIEJ1aWxkIHRoZSBpbmRleCBmaXJzdAotICAgIExPR0UoInByb2Nlc3MgMSIpOwotICAgIGlvLmxvYWRVMzIoKTsgLy8gbWFqb3IgdmVyc2lvbiwgYWxyZWFkeSBsb2FkZWQKLSAgICBpby5sb2FkVTMyKCk7IC8vIG1pbm9yIHZlcnNpb24sIGFscmVhZHkgbG9hZGVkCi0gICAgTE9HRSgicHJvY2VzcyAyIik7Ci0KLSAgICBpby5sb2FkVTMyKCk7ICAvLyBmbGFncwotICAgIGlvLmxvYWRPZmZzZXQoKTsgLy8gZmlsZXNpemUsIGFscmVhZHkgbG9hZGVkLgotICAgIExPR0UoInByb2Nlc3MgNCIpOwotICAgIHVpbnQ2NF90IG1JbmRleE9mZnNldCA9IGlvLmxvYWRPZmZzZXQoKTsKLSAgICB1aW50NjRfdCBtU3RyaW5nT2Zmc2V0ID0gaW8ubG9hZE9mZnNldCgpOwotCi0gICAgTE9HRSgicHJvY2VzcyBtSW5kZXhPZmZzZXQ9IDB4JTAxNmxseCIsIG1JbmRleE9mZnNldCk7Ci0gICAgTE9HRSgicHJvY2VzcyBtU3RyaW5nT2Zmc2V0PSAweCUwMTZsbHgiLCBtU3RyaW5nT2Zmc2V0KTsKLQotICAgIElPIGluZGV4KG1EYXRhICsgbUluZGV4T2Zmc2V0LCBtVXNlNjRCaXRPZmZzZXRzKTsKLSAgICBJTyBzdHJpbmdUYWJsZShtRGF0YSArIG1TdHJpbmdPZmZzZXQsIG1Vc2U2NEJpdE9mZnNldHMpOwotCi0gICAgdWludDMyX3Qgc3RyaW5nRW50cnlDb3VudCA9IHN0cmluZ1RhYmxlLmxvYWRVMzIoKTsKLSAgICBMT0dFKCJzdHJpbmdFbnRyeUNvdW50ICVpIiwgc3RyaW5nRW50cnlDb3VudCk7Ci0gICAgbVN0cmluZ3Muc2V0Q2FwYWNpdHkoc3RyaW5nRW50cnlDb3VudCk7Ci0gICAgbVN0cmluZ0luZGV4VmFsdWVzLnNldENhcGFjaXR5KHN0cmluZ0VudHJ5Q291bnQpOwotICAgIGlmIChzdHJpbmdFbnRyeUNvdW50KSB7Ci0gICAgICAgIHVpbnQzMl90IHN0cmluZ1R5cGUgPSBzdHJpbmdUYWJsZS5sb2FkVTMyKCk7Ci0gICAgICAgIExPR0UoInN0cmluZ1R5cGUgJWkiLCBzdHJpbmdUeXBlKTsKLSAgICAgICAgcnNBc3NlcnQoc3RyaW5nVHlwZT09MCk7Ci0gICAgICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IHN0cmluZ0VudHJ5Q291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgIHVpbnQ2NF90IG9mZnNldCA9IHN0cmluZ1RhYmxlLmxvYWRPZmZzZXQoKTsKLSAgICAgICAgICAgIExPR0UoInN0cmluZyBvZmZzZXQgMHglMDE2bGx4Iiwgb2Zmc2V0KTsKLSAgICAgICAgICAgIElPIHRtcChtRGF0YSArIG9mZnNldCwgbVVzZTY0Qml0T2Zmc2V0cyk7Ci0gICAgICAgICAgICBTdHJpbmc4IHM7Ci0gICAgICAgICAgICB0bXAubG9hZFN0cmluZygmcyk7Ci0gICAgICAgICAgICBMT0dFKCJzdHJpbmcgJXMiLCBzLnN0cmluZygpKTsKLSAgICAgICAgICAgIG1TdHJpbmdzLnB1c2gocyk7Ci0gICAgICAgIH0KK09iamVjdEJhc2UgKkZpbGVBM0Q6OmluaXRpYWxpemVGcm9tRW50cnkoc2l6ZV90IGluZGV4KSB7CisgICAgaWYoaW5kZXggPj0gbUluZGV4LnNpemUoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBMT0dFKCJzdHJpbmdzIGRvbmUiKTsKLSAgICB1aW50MzJfdCBpbmRleEVudHJ5Q291bnQgPSBpbmRleC5sb2FkVTMyKCk7Ci0gICAgTE9HRSgiaW5kZXggY291bnQgJWkiLCBpbmRleEVudHJ5Q291bnQpOwotICAgIG1JbmRleC5zZXRDYXBhY2l0eShpbmRleEVudHJ5Q291bnQpOwotICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IGluZGV4RW50cnlDb3VudDsgY3QrKykgewotICAgICAgICBBM0RJbmRleEVudHJ5IGU7Ci0gICAgICAgIHVpbnQzMl90IHN0cmluZ0luZGV4ID0gaW5kZXgubG9hZFUzMigpOwotICAgICAgICBMT0dFKCJpbmRleCAlaSIsIGN0KTsKLSAgICAgICAgTE9HRSgiICBzdHJpbmcgaW5kZXggJWkiLCBzdHJpbmdJbmRleCk7Ci0gICAgICAgIGUubVR5cGUgPSAoQTNEQ2h1bmtUeXBlKWluZGV4LmxvYWRVMzIoKTsKLSAgICAgICAgTE9HRSgiICB0eXBlICVpIiwgZS5tVHlwZSk7Ci0gICAgICAgIGUubU9mZnNldCA9IGluZGV4LmxvYWRPZmZzZXQoKTsKLSAgICAgICAgTE9HRSgiICBvZmZzZXQgMHglMDE2bGx4IiwgZS5tT2Zmc2V0KTsKLQotICAgICAgICBpZiAoc3RyaW5nSW5kZXggJiYgKHN0cmluZ0luZGV4IDwgbVN0cmluZ3Muc2l6ZSgpKSkgewotICAgICAgICAgICAgZS5tSUQgPSBtU3RyaW5nc1tzdHJpbmdJbmRleF07Ci0gICAgICAgICAgICBtU3RyaW5nSW5kZXhWYWx1ZXMuZWRpdEl0ZW1BdChzdHJpbmdJbmRleCkgPSBjdDsKLSAgICAgICAgICAgIExPR0UoIiAgaWQgJXMiLCBlLm1JRC5zdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtSW5kZXgucHVzaChlKTsKLSAgICB9Ci0gICAgTE9HRSgiaW5kZXggZG9uZSIpOwotCi0gICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgaW5kZXggc2hvdWxkIGJlIGZ1bGx5IHBvcHVsYXRlZC4KLSAgICAvLyBXZSBjYW4gbm93IHdhbGsgdGhvdWdoIGl0IGFuZCBsb2FkIGFsbCB0aGUgb2JqZWN0cy4KLSAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBpbmRleEVudHJ5Q291bnQ7IGN0KyspIHsKLSAgICAgICAgTE9HRSgicHJvY2Vzc2luZyBpbmRleCBlbnRyeSAlaSIsIGN0KTsKLSAgICAgICAgcHJvY2Vzc0luZGV4KHJzYywgJm1JbmRleC5lZGl0SXRlbUF0KGN0KSk7CisgICAgRmlsZUEzRDo6QTNESW5kZXhFbnRyeSAqZW50cnkgPSBtSW5kZXhbaW5kZXhdOworICAgIGlmKCFlbnRyeSkgeworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICByZXR1cm4gcmV0OwotfQotCi0KLUZpbGVBM0Q6OklPOjpJTyhjb25zdCB1aW50OF90ICpidWYsIGJvb2wgdXNlNjQpCi17Ci0gICAgbURhdGEgPSBidWY7Ci0gICAgbVBvcyA9IDA7Ci0gICAgbVVzZTY0ID0gdXNlNjQ7Ci19Ci0KLXVpbnQ2NF90IEZpbGVBM0Q6OklPOjpsb2FkT2Zmc2V0KCkKLXsKLSAgICB1aW50NjRfdCB0bXA7Ci0gICAgaWYgKG1Vc2U2NCkgewotICAgICAgICBtUG9zID0gKG1Qb3MgKyA3KSAmICh+Nyk7Ci0gICAgICAgIHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKLSAgICAgICAgbVBvcyArPSBzaXplb2YodWludDY0X3QpOwotICAgICAgICByZXR1cm4gdG1wOworICAgIGlmKGVudHJ5LT5tUnNPYmopIHsKKyAgICAgICAgZW50cnktPm1Sc09iai0+aW5jVXNlclJlZigpOworICAgICAgICByZXR1cm4gZW50cnktPm1Sc09iajsKICAgICB9Ci0gICAgcmV0dXJuIGxvYWRVMzIoKTsKLX0KIAotdm9pZCBGaWxlQTNEOjpJTzo6bG9hZFN0cmluZyhTdHJpbmc4ICpzKQotewotICAgIExPR0UoImxvYWRTdHJpbmciKTsKLSAgICB1aW50MzJfdCBsZW4gPSBsb2FkVTMyKCk7Ci0gICAgTE9HRSgibG9hZFN0cmluZyBsZW4gJWkiLCBsZW4pOwotICAgIHMtPnNldFRvKChjb25zdCBjaGFyICopJm1EYXRhW21Qb3NdLCBsZW4pOwotICAgIG1Qb3MgKz0gbGVuOwotfQotCi0KLXZvaWQgRmlsZUEzRDo6cHJvY2Vzc0NodW5rX01lc2goQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKQotewotICAgIE1lc2ggKiBtID0gbmV3IE1lc2gocnNjKTsKLQotICAgIG0tPm1QcmltaXRpdmVzQ291bnQgPSBpby0+bG9hZFUzMigpOwotICAgIG0tPm1QcmltaXRpdmVzID0gbmV3IE1lc2g6OlByaW1pdGl2ZV90ICpbbS0+bVByaW1pdGl2ZXNDb3VudF07Ci0KLSAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtLT5tUHJpbWl0aXZlc0NvdW50OyBjdCsrKSB7Ci0gICAgICAgIHVpbnQzMl90IGluZGV4ID0gaW8tPmxvYWRVMzIoKTsKLQotICAgICAgICBtLT5tUHJpbWl0aXZlc1tjdF0gPSAoTWVzaDo6UHJpbWl0aXZlX3QgKiltSW5kZXhbaW5kZXhdLm1Sc09iajsKLSAgICB9Ci0gICAgaWUtPm1Sc09iaiA9IG07Ci19Ci0KLXZvaWQgRmlsZUEzRDo6cHJvY2Vzc0NodW5rX1ByaW1pdGl2ZShDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpCi17Ci0gICAgTWVzaDo6UHJpbWl0aXZlX3QgKiBwID0gbmV3IE1lc2g6OlByaW1pdGl2ZV90OwotCi0gICAgcC0+bUluZGV4Q291bnQgPSBpby0+bG9hZFUzMigpOwotICAgIHVpbnQzMl90IHZlcnRJZHggPSBpby0+bG9hZFUzMigpOwotICAgIHAtPm1SZXN0YXJ0Q291bnRzID0gaW8tPmxvYWRVMTYoKTsKLSAgICB1aW50MzJfdCBiaXRzID0gaW8tPmxvYWRVOCgpOwotICAgIHAtPm1UeXBlID0gKFJzUHJpbWl0aXZlKWlvLT5sb2FkVTgoKTsKLQotICAgIExPR0UoInByb2Nlc3NDaHVua19QcmltaXRpdmUgY291bnQgJWksIGJpdHMgJWkiLCBwLT5tSW5kZXhDb3VudCwgYml0cyk7Ci0KLSAgICBwLT5tVmVydGljaWVzID0gKE1lc2g6OlZlcnRpY2llc190ICopbUluZGV4W3ZlcnRJZHhdLm1Sc09iajsKLQotICAgIHAtPm1JbmRpY2llcyA9IG5ldyB1aW50MTZfdFtwLT5tSW5kZXhDb3VudF07Ci0gICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgcC0+bUluZGV4Q291bnQ7IGN0KyspIHsKLSAgICAgICAgc3dpdGNoKGJpdHMpIHsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgcC0+bUluZGljaWVzW2N0XSA9IGlvLT5sb2FkVTgoKTsKKyAgICAvLyBTZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2Ygb2JqZWN0CisgICAgbVJlYWRTdHJlYW0tPnJlc2V0KGVudHJ5LT5tT2Zmc2V0KTsKKyAgICBzd2l0Y2ggKGVudHJ5LT5tVHlwZSkgeworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9VTktOT1dOOgorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX01FU0g6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gTWVzaDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgIHAtPm1JbmRpY2llc1tjdF0gPSBpby0+bG9hZFUxNigpOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9UWVBFOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFR5cGU6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICBwLT5tSW5kaWNpZXNbY3RdID0gaW8tPmxvYWRVMzIoKTsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfRUxFTUVOVDoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBFbGVtZW50OjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9BTExPQ0FUSU9OOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IEFsbG9jYXRpb246OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fVkVSVEVYOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFByb2dyYW1WZXJ0ZXg6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fUkFTVEVSOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFByb2dyYW1SYXN0ZXI6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fRlJBR01FTlQ6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gUHJvZ3JhbUZyYWdtZW50OjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1NUT1JFOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFByb2dyYW1TdG9yZTo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfU0FNUExFUjoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBTYW1wbGVyOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9BTklNQVRJT046CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gQW5pbWF0aW9uOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9BREFQVEVSXzFEOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IEFkYXB0ZXIxRDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfQURBUFRFUl8yRDoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBBZGFwdGVyMkQ6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX1NDUklQVF9DOgorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmKGVudHJ5LT5tUnNPYmopIHsKKyAgICAgICAgZW50cnktPm1Sc09iai0+aW5jVXNlclJlZigpOworICAgIH0KKyAgICByZXR1cm4gZW50cnktPm1Sc09iajsKK30KKworYm9vbCBGaWxlQTNEOjp3cml0ZUZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgaWYoIW1Xcml0ZVN0cmVhbSkgeworICAgICAgICBMT0dFKCJObyBvYmplY3RzIHRvIHdyaXRlXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZihtV3JpdGVTdHJlYW0tPmdldFBvcygpID09IDApIHsKKyAgICAgICAgTE9HRSgiTm8gb2JqZWN0cyB0byB3cml0ZVxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBGSUxFICp3cml0ZUhhbmRsZSA9IGZvcGVuKGZpbGVuYW1lLCAid2IiKTsKKyAgICBpZighd3JpdGVIYW5kbGUpIHsKKyAgICAgICAgTE9HRSgiQ291bGRuJ3Qgb3BlbiB0aGUgZmlsZSBmb3Igd3JpdGluZ1xuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBPcGVuIGEgbmV3IHN0cmVhbSB0byBtYWtlIHdyaXRpbmcgdGhlIGhlYWRlciBlYXNpZXIKKyAgICBPU3RyZWFtIGhlYWRlclN0cmVhbSg1KjEwMjQsIGZhbHNlKTsKKyAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKG1NYWpvclZlcnNpb24pOworICAgIGhlYWRlclN0cmVhbS5hZGRVMzIobU1pbm9yVmVyc2lvbik7CisgICAgdWludDMyX3QgaXM2NEJpdCA9IDA7CisgICAgaGVhZGVyU3RyZWFtLmFkZFUzMihpczY0Qml0KTsKKworICAgIHVpbnQzMl90IHdyaXRlSW5kZXhTaXplID0gbVdyaXRlSW5kZXguc2l6ZSgpOworICAgIGhlYWRlclN0cmVhbS5hZGRVMzIod3JpdGVJbmRleFNpemUpOworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IHdyaXRlSW5kZXhTaXplOyBpICsrKSB7CisgICAgICAgIGhlYWRlclN0cmVhbS5hZGRTdHJpbmcoJm1Xcml0ZUluZGV4W2ldLT5tT2JqZWN0TmFtZSk7CisgICAgICAgIGhlYWRlclN0cmVhbS5hZGRVMzIoKHVpbnQzMl90KW1Xcml0ZUluZGV4W2ldLT5tVHlwZSk7CisgICAgICAgIGlmKG1Vc2U2NEJpdE9mZnNldHMpeworICAgICAgICAgICAgaGVhZGVyU3RyZWFtLmFkZE9mZnNldChtV3JpdGVJbmRleFtpXS0+bU9mZnNldCk7CisgICAgICAgICAgICBoZWFkZXJTdHJlYW0uYWRkT2Zmc2V0KG1Xcml0ZUluZGV4W2ldLT5tTGVuZ3RoKTsKICAgICAgICAgfQotICAgICAgICBMT0dFKCIgIGlkeCAlaSIsIHAtPm1JbmRpY2llc1tjdF0pOwotICAgIH0KLQotICAgIGlmIChwLT5tUmVzdGFydENvdW50cykgewotICAgICAgICBwLT5tUmVzdGFydHMgPSBuZXcgdWludDE2X3RbcC0+bVJlc3RhcnRDb3VudHNdOwotICAgICAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBwLT5tUmVzdGFydENvdW50czsgY3QrKykgewotICAgICAgICAgICAgc3dpdGNoKGJpdHMpIHsKLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgICBwLT5tUmVzdGFydHNbY3RdID0gaW8tPmxvYWRVOCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgICBwLT5tUmVzdGFydHNbY3RdID0gaW8tPmxvYWRVMTYoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICAgICAgcC0+bVJlc3RhcnRzW2N0XSA9IGlvLT5sb2FkVTMyKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMT0dFKCIgIGlkeCAlaSIsIHAtPm1SZXN0YXJ0c1tjdF0pOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCA9ICh1aW50MzJfdCltV3JpdGVJbmRleFtpXS0+bU9mZnNldDsKKyAgICAgICAgICAgIGhlYWRlclN0cmVhbS5hZGRVMzIob2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCA9ICh1aW50MzJfdCltV3JpdGVJbmRleFtpXS0+bUxlbmd0aDsKKyAgICAgICAgICAgIGhlYWRlclN0cmVhbS5hZGRVMzIob2Zmc2V0KTsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHAtPm1SZXN0YXJ0cyA9IE5VTEw7CiAgICAgfQogCi0gICAgaWUtPm1Sc09iaiA9IHA7CisgICAgLy8gV3JpdGUgb3VyIG1hZ2ljIHN0cmluZyBzbyB3ZSBrbm93IHdlIGFyZSByZWFkaW5nIHRoZSByaWdodCBmaWxlCisgICAgU3RyaW5nOCBtYWdpY1N0cmluZyhBM0RfTUFHSUNfS0VZKTsKKyAgICBmd3JpdGUobWFnaWNTdHJpbmcuc3RyaW5nKCksIHNpemVvZihjaGFyKSwgbWFnaWNTdHJpbmcuc2l6ZSgpLCB3cml0ZUhhbmRsZSk7CisKKyAgICAvLyBTdG9yZSB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHBhcnNlIHdoZW4gd2UgcmVhZCBpdAorICAgIHVpbnQ2NF90IGhlYWRlclNpemUgPSBoZWFkZXJTdHJlYW0uZ2V0UG9zKCk7CisgICAgZndyaXRlKCZoZWFkZXJTaXplLCBzaXplb2YoaGVhZGVyU2l6ZSksIDEsIHdyaXRlSGFuZGxlKTsKKworICAgIC8vIE5vdyB3cml0ZSBvdXIgaGVhZGVyCisgICAgZndyaXRlKGhlYWRlclN0cmVhbS5nZXRQdHIoKSwgc2l6ZW9mKHVpbnQ4X3QpLCBoZWFkZXJTdHJlYW0uZ2V0UG9zKCksIHdyaXRlSGFuZGxlKTsKKworICAgIC8vIE5vdyB3cml0ZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBwYXJ0IG9mIHRoZSBmaWxlIGZvciBlYXNpZXIgcGFyc2luZyBsYXRlcgorICAgIHVpbnQ2NF90IGZpbGVEYXRhU2l6ZSA9IG1Xcml0ZVN0cmVhbS0+Z2V0UG9zKCk7CisgICAgZndyaXRlKCZmaWxlRGF0YVNpemUsIHNpemVvZihmaWxlRGF0YVNpemUpLCAxLCB3cml0ZUhhbmRsZSk7CisKKyAgICBmd3JpdGUobVdyaXRlU3RyZWFtLT5nZXRQdHIoKSwgc2l6ZW9mKHVpbnQ4X3QpLCBtV3JpdGVTdHJlYW0tPmdldFBvcygpLCB3cml0ZUhhbmRsZSk7CisKKyAgICBpbnQgc3RhdHVzID0gZmNsb3NlKHdyaXRlSGFuZGxlKTsKKworICAgIGlmKHN0YXR1cyAhPSAwKSB7CisgICAgICAgIExPR0UoIkNvdWxkbid0IGNsb3NlIGZpbGVcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgRmlsZUEzRDo6cHJvY2Vzc0NodW5rX1ZlcnRpY2llcyhDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpCi17Ci0gICAgTWVzaDo6VmVydGljaWVzX3QgKmN2ID0gbmV3IE1lc2g6OlZlcnRpY2llc190OwotICAgIGN2LT5tQWxsb2NhdGlvbkNvdW50ID0gaW8tPmxvYWRVMzIoKTsKLSAgICBjdi0+bUFsbG9jYXRpb25zID0gbmV3IEFsbG9jYXRpb24gKltjdi0+bUFsbG9jYXRpb25Db3VudF07Ci0gICAgTE9HRSgicHJvY2Vzc0NodW5rX1ZlcnRpY2llcyBjb3VudCAlaSIsIGN2LT5tQWxsb2NhdGlvbkNvdW50KTsKLSAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBjdi0+bUFsbG9jYXRpb25Db3VudDsgY3QrKykgewotICAgICAgICB1aW50MzJfdCBpID0gaW8tPmxvYWRVMzIoKTsKLSAgICAgICAgY3YtPm1BbGxvY2F0aW9uc1tjdF0gPSAoQWxsb2NhdGlvbiAqKW1JbmRleFtpXS5tUnNPYmo7Ci0gICAgICAgIExPR0UoIiAgaWR4ICVpIiwgaSk7Cit2b2lkIEZpbGVBM0Q6OmFwcGVuZFRvRmlsZShPYmplY3RCYXNlICpvYmopIHsKKyAgICBpZighb2JqKSB7CisgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgaWUtPm1Sc09iaiA9IGN2OwotfQotCi12b2lkIEZpbGVBM0Q6OnByb2Nlc3NDaHVua19FbGVtZW50KENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSkKLXsKLSAgICAvKgotICAgIHJzaV9FbGVtZW50QmVnaW4ocnNjKTsKLQotICAgIHVpbnQzMl90IGNvdW50ID0gaW8tPmxvYWRVMzIoKTsKLSAgICBMT0dFKCJwcm9jZXNzQ2h1bmtfRWxlbWVudCBjb3VudCAlaSIsIGNvdW50KTsKLSAgICB3aGlsZSAoY291bnQtLSkgewotICAgICAgICBSc0RhdGFLaW5kIGRrID0gKFJzRGF0YUtpbmQpaW8tPmxvYWRVOCgpOwotICAgICAgICBSc0RhdGFUeXBlIGR0ID0gKFJzRGF0YVR5cGUpaW8tPmxvYWRVOCgpOwotICAgICAgICB1aW50MzJfdCBiaXRzID0gaW8tPmxvYWRVOCgpOwotICAgICAgICBib29sIGlzTm9ybSA9IGlvLT5sb2FkVTgoKSAhPSAwOwotICAgICAgICBMT0dFKCIgICVpICVpICVpICVpIiwgZGssIGR0LCBiaXRzLCBpc05vcm0pOwotICAgICAgICByc2lfRWxlbWVudEFkZChyc2MsIGRrLCBkdCwgaXNOb3JtLCBiaXRzLCAwKTsKKyAgICBpZighbVdyaXRlU3RyZWFtKSB7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IGluaXRpYWxTdHJlYW1TaXplID0gMjU2KjEwMjQ7CisgICAgICAgIG1Xcml0ZVN0cmVhbSA9IG5ldyBPU3RyZWFtKGluaXRpYWxTdHJlYW1TaXplLCBmYWxzZSk7CiAgICAgfQotICAgIExPR0UoInByb2Nlc3NDaHVua19FbGVtZW50IGNyZWF0ZSIpOwotICAgIGllLT5tUnNPYmogPSByc2lfRWxlbWVudENyZWF0ZShyc2MpOwotICAgICovCi19Ci0KLXZvaWQgRmlsZUEzRDo6cHJvY2Vzc0NodW5rX0VsZW1lbnRTb3VyY2UoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKQotewotICAgIHVpbnQzMl90IGluZGV4ID0gaW8tPmxvYWRVMzIoKTsKLSAgICB1aW50MzJfdCBjb3VudCA9IGlvLT5sb2FkVTMyKCk7Ci0KLSAgICBMT0dFKCJwcm9jZXNzQ2h1bmtfRWxlbWVudFNvdXJjZSBjb3VudCAlaSwgaW5kZXggJWkiLCBjb3VudCwgaW5kZXgpOwotCi0gICAgUnNFbGVtZW50IGUgPSAoUnNFbGVtZW50KW1JbmRleFtpbmRleF0ubVJzT2JqOwotCi0gICAgUnNBbGxvY2F0aW9uIGEgPSByc2lfQWxsb2NhdGlvbkNyZWF0ZVNpemVkKHJzYywgZSwgY291bnQpOwotICAgIEFsbG9jYXRpb24gKiBhbGxvYyA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4oYSk7Ci0KLSAgICBmbG9hdCAqIGRhdGEgPSAoZmxvYXQgKilhbGxvYy0+Z2V0UHRyKCk7Ci0gICAgd2hpbGUoY291bnQtLSkgewotICAgICAgICAqZGF0YSA9IGlvLT5sb2FkRigpOwotICAgICAgICBMT0dFKCIgICVmIiwgKmRhdGEpOwotICAgICAgICBkYXRhKys7Ci0gICAgfQotICAgIGllLT5tUnNPYmogPSBhbGxvYzsKKyAgICBBM0RJbmRleEVudHJ5ICppbmRleEVudHJ5ID0gbmV3IEEzREluZGV4RW50cnkoKTsKKyAgICBpbmRleEVudHJ5LT5tT2JqZWN0TmFtZS5zZXRUbyhvYmotPmdldE5hbWUoKSk7CisgICAgaW5kZXhFbnRyeS0+bVR5cGUgPSBvYmotPmdldENsYXNzSWQoKTsKKyAgICBpbmRleEVudHJ5LT5tT2Zmc2V0ID0gbVdyaXRlU3RyZWFtLT5nZXRQb3MoKTsKKyAgICBpbmRleEVudHJ5LT5tUnNPYmogPSBvYmo7CisgICAgbVdyaXRlSW5kZXgucHVzaChpbmRleEVudHJ5KTsKKyAgICBvYmotPnNlcmlhbGl6ZShtV3JpdGVTdHJlYW0pOworICAgIGluZGV4RW50cnktPm1MZW5ndGggPSBtV3JpdGVTdHJlYW0tPmdldFBvcygpIC0gaW5kZXhFbnRyeS0+bU9mZnNldDsKKyAgICBtV3JpdGVTdHJlYW0tPmFsaWduKDQpOwogfQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIAordm9pZCByc2lfRmlsZUEzREdldE51bUluZGV4RW50cmllcyhDb250ZXh0ICpyc2MsIGludDMyX3QgKm51bUVudHJpZXMsIFJzRmlsZSBmaWxlKQoreworICAgIEZpbGVBM0QgKmZhM2QgPSBzdGF0aWNfY2FzdDxGaWxlQTNEICo+KGZpbGUpOworCisgICAgaWYoZmEzZCkgeworICAgICAgICAqbnVtRW50cmllcyA9IGZhM2QtPmdldE51bUluZGV4RW50cmllcygpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgKm51bUVudHJpZXMgPSAwOworICAgIH0KK30KKwordm9pZCByc2lfRmlsZUEzREdldEluZGV4RW50cmllcyhDb250ZXh0ICpyc2MsIFJzRmlsZUluZGV4RW50cnkgKmZpbGVFbnRyaWVzLCB1aW50MzJfdCBudW1FbnRyaWVzLCBSc0ZpbGUgZmlsZSkKK3sKKyAgICBGaWxlQTNEICpmYTNkID0gc3RhdGljX2Nhc3Q8RmlsZUEzRCAqPihmaWxlKTsKKworICAgIGlmKCFmYTNkKSB7CisgICAgICAgIExPR0UoIkNhbid0IGxvYWQgaW5kZXggZW50cmllcy4gTm8gdmFsaWQgZmlsZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDMyX3QgbnVtRmlsZUVudHJpZXMgPSBmYTNkLT5nZXROdW1JbmRleEVudHJpZXMoKTsKKyAgICBpZihudW1GaWxlRW50cmllcyAhPSBudW1FbnRyaWVzIHx8IG51bUVudHJpZXMgPT0gMCB8fCBmaWxlRW50cmllcyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGxvYWQgaW5kZXggZW50cmllcy4gSW52YWxpZCBudW1iZXIgcmVxdWVzdGVkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBudW1GaWxlRW50cmllczsgaSArKykgeworICAgICAgICBjb25zdCBGaWxlQTNEOjpBM0RJbmRleEVudHJ5ICplbnRyeSA9IGZhM2QtPmdldEluZGV4RW50cnkoaSk7CisgICAgICAgIGZpbGVFbnRyaWVzW2ldLmNsYXNzSUQgPSBlbnRyeS0+Z2V0VHlwZSgpOworICAgICAgICBmaWxlRW50cmllc1tpXS5vYmplY3ROYW1lID0gZW50cnktPmdldE9iamVjdE5hbWUoKS5zdHJpbmcoKTsKKyAgICB9CisKK30KKworUnNPYmplY3RCYXNlIHJzaV9GaWxlQTNER2V0RW50cnlCeUluZGV4KENvbnRleHQgKnJzYywgdWludDMyX3QgaW5kZXgsIFJzRmlsZSBmaWxlKQoreworICAgIEZpbGVBM0QgKmZhM2QgPSBzdGF0aWNfY2FzdDxGaWxlQTNEICo+KGZpbGUpOworICAgIGlmKCFmYTNkKSB7CisgICAgICAgIExPR0UoIkNhbid0IGxvYWQgZW50cnkuIE5vIHZhbGlkIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgT2JqZWN0QmFzZSAqb2JqID0gZmEzZC0+aW5pdGlhbGl6ZUZyb21FbnRyeShpbmRleCk7CisgICAgTE9HVigiUmV0dXJuaW5nIG9iamVjdCB3aXRoIG5hbWUgJXMiLCBvYmotPmdldE5hbWUoKSk7CisKKyAgICByZXR1cm4gb2JqOworfQorCitSc0ZpbGUgcnNpX0ZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0oQ29udGV4dCAqcnNjLCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pCit7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJGaWxlIGxvYWQgZmFpbGVkLiBBc3NldCBzdHJlYW0gaXMgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBGaWxlQTNEICpmYTNkID0gbmV3IEZpbGVBM0QocnNjKTsKKworICAgIGZhM2QtPmxvYWQoZGF0YSwgbGVuKTsKKyAgICBmYTNkLT5pbmNVc2VyUmVmKCk7CisKKyAgICByZXR1cm4gZmEzZDsKK30KKwogCiBSc0ZpbGUgcnNpX0ZpbGVPcGVuKENvbnRleHQgKnJzYywgY2hhciBjb25zdCAqcGF0aCwgdW5zaWduZWQgaW50IGxlbikKIHsKLSAgICBGaWxlQTNEICpmYTNkID0gbmV3IEZpbGVBM0Q7CisgICAgRmlsZUEzRCAqZmEzZCA9IG5ldyBGaWxlQTNEKHJzYyk7CiAKICAgICBGSUxFICpmID0gZm9wZW4oIi9zZGNhcmQvdGVzdC5hM2QiLCAicmIiKTsKICAgICBpZiAoZikgewotICAgICAgICBmYTNkLT5sb2FkKHJzYywgZik7CisgICAgICAgIGZhM2QtPmxvYWQoZik7CiAgICAgICAgIGZjbG9zZShmKTsKKyAgICAgICAgZmEzZC0+aW5jVXNlclJlZigpOwogICAgICAgICByZXR1cm4gZmEzZDsKICAgICB9CiAgICAgZGVsZXRlIGZhM2Q7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRmlsZUEzRC5oIGIvbGlicy9ycy9yc0ZpbGVBM0QuaAppbmRleCA5ZWUwOGVjLi5iOTg1OTA3IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzRmlsZUEzRC5oCisrKyBiL2xpYnMvcnMvcnNGaWxlQTNELmgKQEAgLTE4LDIwICsxOCwyMyBAQAogI2RlZmluZSBBTkRST0lEX1JTX0ZJTEVfQTNEX0gKIAogI2luY2x1ZGUgIlJlbmRlclNjcmlwdC5oIgotI2luY2x1ZGUgInJzRmlsZUEzRERlY2xzLmgiCiAjaW5jbHVkZSAicnNNZXNoLmgiCiAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSAicnNTdHJlYW0uaCIKICNpbmNsdWRlIDxzdGRpby5oPgogCisjZGVmaW5lIEEzRF9NQUdJQ19LRVkgIkFuZHJvaWQzRF9mZiIKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBuYW1lc3BhY2UgYW5kcm9pZCB7CisKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCi1jbGFzcyBGaWxlQTNECitjbGFzcyBGaWxlQTNEIDogcHVibGljIE9iamVjdEJhc2UKIHsKIHB1YmxpYzoKLSAgICBGaWxlQTNEKCk7CisgICAgRmlsZUEzRChDb250ZXh0ICpyc2MpOwogICAgIH5GaWxlQTNEKCk7CiAKICAgICB1aW50MzJfdCBtTWFqb3JWZXJzaW9uOwpAQCAtNDAsNzggKzQzLDUzIEBACiAgICAgdWludDY0X3QgbVN0cmluZ1RhYmxlT2Zmc2V0OwogICAgIGJvb2wgbVVzZTY0Qml0T2Zmc2V0czsKIAotICAgIHN0cnVjdCBBM0RJbmRleEVudHJ5IHsKLSAgICAgICAgU3RyaW5nOCBtSUQ7Ci0gICAgICAgIEEzRENodW5rVHlwZSBtVHlwZTsKKyAgICBjbGFzcyBBM0RJbmRleEVudHJ5IHsKKyAgICAgICAgU3RyaW5nOCBtT2JqZWN0TmFtZTsKKyAgICAgICAgUnNBM0RDbGFzc0lEIG1UeXBlOwogICAgICAgICB1aW50NjRfdCBtT2Zmc2V0OwotICAgICAgICB2b2lkICogbVJzT2JqOworICAgICAgICB1aW50NjRfdCBtTGVuZ3RoOworICAgICAgICBPYmplY3RCYXNlICptUnNPYmo7CisgICAgcHVibGljOgorICAgICAgICBmcmllbmQgY2xhc3MgRmlsZUEzRDsKKyAgICAgICAgY29uc3QgU3RyaW5nOCAmZ2V0T2JqZWN0TmFtZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtT2JqZWN0TmFtZTsKKyAgICAgICAgfQorICAgICAgICBSc0EzRENsYXNzSUQgZ2V0VHlwZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtVHlwZTsKKyAgICAgICAgfQogICAgIH07CiAKLSAgICBib29sIGxvYWQoQ29udGV4dCAqcnNjLCBGSUxFICpmKTsKKyAgICBib29sIGxvYWQoRklMRSAqZik7CisgICAgYm9vbCBsb2FkKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpOworCisgICAgc2l6ZV90IGdldE51bUluZGV4RW50cmllcygpIGNvbnN0OworICAgIGNvbnN0IEEzREluZGV4RW50cnkqIGdldEluZGV4RW50cnkoc2l6ZV90IGluZGV4KSBjb25zdDsKKyAgICBPYmplY3RCYXNlICppbml0aWFsaXplRnJvbUVudHJ5KHNpemVfdCBpbmRleCk7CisKKyAgICB2b2lkIGFwcGVuZFRvRmlsZShPYmplY3RCYXNlICpvYmopOworICAgIGJvb2wgd3JpdGVGaWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKworICAgIC8vIEN1cnJlbnRseSBmaWxlcyBkbyBub3QgZ2V0IHNlcmlhbGl6ZWQsCisgICAgLy8gYnV0IHdlIG5lZWQgdG8gaW5oZXJpdCBmcm9tIE9iamVjdEJhc2UgZm9yIHJlZiB0cmFja2luZworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdCB7CisgICAgfQorICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBSU19BM0RfQ0xBU1NfSURfVU5LTk9XTjsKKyAgICB9CiAKIHByb3RlY3RlZDoKLSAgICBjbGFzcyBJTwotICAgIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIElPKGNvbnN0IHVpbnQ4X3QgKiwgYm9vbCB1c2U2NCk7Ci0gICAgCi0gICAgICAgIGZsb2F0IGxvYWRGKCkgewotICAgICAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOwotICAgICAgICAgICAgZmxvYXQgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCAqPigmbURhdGFbbVBvc10pWzBdOwotICAgICAgICAgICAgbVBvcyArPSBzaXplb2YoZmxvYXQpOwotICAgICAgICAgICAgcmV0dXJuIHRtcDsKLSAgICAgICAgfQotICAgICAgICBpbnQzMl90IGxvYWRJMzIoKSB7Ci0gICAgICAgICAgICBtUG9zID0gKG1Qb3MgKyAzKSAmICh+Myk7Ci0gICAgICAgICAgICBpbnQzMl90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MzJfdCAqPigmbURhdGFbbVBvc10pWzBdOwotICAgICAgICAgICAgbVBvcyArPSBzaXplb2YoaW50MzJfdCk7Ci0gICAgICAgICAgICByZXR1cm4gdG1wOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQzMl90IGxvYWRVMzIoKSB7Ci0gICAgICAgICAgICBtUG9zID0gKG1Qb3MgKyAzKSAmICh+Myk7Ci0gICAgICAgICAgICB1aW50MzJfdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KCZtRGF0YVttUG9zXSlbMF07Ci0gICAgICAgICAgICBtUG9zICs9IHNpemVvZih1aW50MzJfdCk7Ci0gICAgICAgICAgICByZXR1cm4gdG1wOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQxNl90IGxvYWRVMTYoKSB7Ci0gICAgICAgICAgICBtUG9zID0gKG1Qb3MgKyAxKSAmICh+MSk7Ci0gICAgICAgICAgICB1aW50MTZfdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQxNl90ICo+KCZtRGF0YVttUG9zXSlbMF07Ci0gICAgICAgICAgICBtUG9zICs9IHNpemVvZih1aW50MTZfdCk7Ci0gICAgICAgICAgICByZXR1cm4gdG1wOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQ4X3QgbG9hZFU4KCkgewotICAgICAgICAgICAgdWludDhfdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKLSAgICAgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQ4X3QpOwotICAgICAgICAgICAgcmV0dXJuIHRtcDsKLSAgICAgICAgfQotICAgICAgICB1aW50NjRfdCBsb2FkT2Zmc2V0KCk7Ci0gICAgICAgIHZvaWQgbG9hZFN0cmluZyhTdHJpbmc4ICpzKTsKLSAgICAgICAgdWludDY0X3QgZ2V0UG9zKCkgY29uc3Qge3JldHVybiBtUG9zO30KLSAgICAgICAgY29uc3QgdWludDhfdCAqIGdldFB0cigpIGNvbnN0OwotICAgIHByb3RlY3RlZDoKLSAgICAgICAgY29uc3QgdWludDhfdCAqIG1EYXRhOwotICAgICAgICB1aW50NjRfdCBtUG9zOwotICAgICAgICBib29sIG1Vc2U2NDsKLSAgICB9OwogCi0KLSAgICBib29sIHByb2Nlc3MoQ29udGV4dCAqcnNjKTsKLSAgICBib29sIHByb2Nlc3NJbmRleChDb250ZXh0ICpyc2MsIEEzREluZGV4RW50cnkgKik7Ci0gICAgdm9pZCBwcm9jZXNzQ2h1bmtfTWVzaChDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpOwotICAgIHZvaWQgcHJvY2Vzc0NodW5rX1ByaW1pdGl2ZShDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpOwotICAgIHZvaWQgcHJvY2Vzc0NodW5rX1ZlcnRpY2llcyhDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpOwotICAgIHZvaWQgcHJvY2Vzc0NodW5rX0VsZW1lbnQoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKTsKLSAgICB2b2lkIHByb2Nlc3NDaHVua19FbGVtZW50U291cmNlKENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSk7CisgICAgdm9pZCBwYXJzZUhlYWRlcihJU3RyZWFtICpoZWFkZXJTdHJlYW0pOwogCiAgICAgY29uc3QgdWludDhfdCAqIG1EYXRhOwogICAgIHZvaWQgKiBtQWxsb2M7CiAgICAgdWludDY0X3QgbURhdGFTaXplOwotICAgIENvbnRleHQgKiBtUnNjOwogCi0gICAgVmVjdG9yPEEzREluZGV4RW50cnk+IG1JbmRleDsKLSAgICBWZWN0b3I8U3RyaW5nOD4gbVN0cmluZ3M7Ci0gICAgVmVjdG9yPHVpbnQzMl90PiBtU3RyaW5nSW5kZXhWYWx1ZXM7CisgICAgT1N0cmVhbSAqbVdyaXRlU3RyZWFtOworICAgIFZlY3RvcjxBM0RJbmRleEVudHJ5Kj4gbVdyaXRlSW5kZXg7CiAKKyAgICBJU3RyZWFtICptUmVhZFN0cmVhbTsKKyAgICBWZWN0b3I8QTNESW5kZXhFbnRyeSo+IG1JbmRleDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0ZpbGVBM0REZWNscy5oIGIvbGlicy9ycy9yc0ZpbGVBM0REZWNscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTA4YmQzLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvcnNGaWxlQTNERGVjbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfUlNfRklMRV9BM0RfREVDTFNfSAotI2RlZmluZSBBTkRST0lEX1JTX0ZJTEVfQTNEX0RFQ0xTX0gKLQotCi0jZGVmaW5lIEEzRF9NQUdJQ19LRVkgIkFuZHJvaWQzRF9mZiIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7Ci0KLSAgICBlbnVtIEEzRENodW5rVHlwZSB7Ci0gICAgICAgIENIVU5LX0VNUFRZLAotCi0gICAgICAgIENIVU5LX0VMRU1FTlQsCi0gICAgICAgIENIVU5LX0VMRU1FTlRfU09VUkNFLAotICAgICAgICBDSFVOS19WRVJUSUNJRVMsCi0gICAgICAgIENIVU5LX01FU0gsCi0gICAgICAgIENIVU5LX1BSSU1JVElWRSwKLQotICAgICAgICBDSFVOS19MQVNUCi0gICAgfTsKLQotCi19Ci19Ci0jZW5kaWYgLy9BTkRST0lEX1JTX0ZJTEVfQTNEX0gKLQotCi0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNGb250LmNwcCBiL2xpYnMvcnMvcnNGb250LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTUxMDA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc0ZvbnQuY3BwCkBAIC0wLDAgKzEsODg5IEBACisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKyNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAicnNGb250LmgiCisjaW5jbHVkZSAicnNQcm9ncmFtRnJhZ21lbnQuaCIKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgRlRfQklUTUFQX0gKKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworRm9udDo6Rm9udChDb250ZXh0ICpyc2MpIDogT2JqZWN0QmFzZShyc2MpLCBtQ2FjaGVkR2x5cGhzKE5VTEwpCit7CisgICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOworICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKKyAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBtSGFzS2VybmluZyA9IGZhbHNlOworICAgIG1GYWNlID0gTlVMTDsKK30KKworYm9vbCBGb250Ojppbml0KGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGZvbnRTaXplLCB1aW50MzJfdCBkcGkpCit7CisgICAgaWYobUluaXRpYWxpemVkKSB7CisgICAgICAgIExPR0UoIlJlaW5pdGlhbGl6YXRpb24gb2YgZm9udHMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgU3RyaW5nOCBmb250c0RpcigiL2ZvbnRzLyIpOworICAgIFN0cmluZzggZnVsbFBhdGgoZ2V0ZW52KCJBTkRST0lEX1JPT1QiKSk7CisgICAgZnVsbFBhdGggKz0gZm9udHNEaXI7CisgICAgZnVsbFBhdGggKz0gbmFtZTsKKworICAgIEZUX0Vycm9yIGVycm9yID0gRlRfTmV3X0ZhY2UobVJTQy0+bVN0YXRlRm9udC5nZXRMaWIoKSwgZnVsbFBhdGguc3RyaW5nKCksIDAsICZtRmFjZSk7CisgICAgaWYoZXJyb3IpIHsKKyAgICAgICAgTE9HRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgZm9udCAlcyIsIGZ1bGxQYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1Gb250TmFtZSA9IG5hbWU7CisgICAgbUZvbnRTaXplID0gZm9udFNpemU7CisgICAgbURwaSA9IGRwaTsKKworICAgIGVycm9yID0gRlRfU2V0X0NoYXJfU2l6ZShtRmFjZSwgZm9udFNpemUgKiA2NCwgMCwgZHBpLCAwKTsKKyAgICBpZihlcnJvcikgeworICAgICAgICBMT0dFKCJVbmFibGUgdG8gc2V0IGZvbnQgc2l6ZSBvbiAlcyIsIGZ1bGxQYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1IYXNLZXJuaW5nID0gRlRfSEFTX0tFUk5JTkcobUZhY2UpOworCisgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGb250OjppbnZhbGlkYXRlVGV4dHVyZUNhY2hlKCkKK3sKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVkR2x5cGhzLnNpemUoKTsgaSArKykgeworICAgICAgICBtQ2FjaGVkR2x5cGhzLnZhbHVlQXQoaSktPm1Jc1ZhbGlkID0gZmFsc2U7CisgICAgfQorfQorCit2b2lkIEZvbnQ6OmRyYXdDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8gKmdseXBoLCBpbnQzMl90IHgsIGludDMyX3QgeSkKK3sKKyAgICBGb250U3RhdGUgKnN0YXRlID0gJm1SU0MtPm1TdGF0ZUZvbnQ7CisKKyAgICBpbnQzMl90IG5QZW5YID0geCArIGdseXBoLT5tQml0bWFwTGVmdDsKKyAgICBpbnQzMl90IG5QZW5ZID0geSAtIGdseXBoLT5tQml0bWFwVG9wICsgZ2x5cGgtPm1CaXRtYXBIZWlnaHQ7CisKKyAgICBmbG9hdCB1MSA9IGdseXBoLT5tQml0bWFwTWluVTsKKyAgICBmbG9hdCB1MiA9IGdseXBoLT5tQml0bWFwTWF4VTsKKyAgICBmbG9hdCB2MSA9IGdseXBoLT5tQml0bWFwTWluVjsKKyAgICBmbG9hdCB2MiA9IGdseXBoLT5tQml0bWFwTWF4VjsKKworICAgIGludDMyX3Qgd2lkdGggPSAoaW50MzJfdCkgZ2x5cGgtPm1CaXRtYXBXaWR0aDsKKyAgICBpbnQzMl90IGhlaWdodCA9IChpbnQzMl90KSBnbHlwaC0+bUJpdG1hcEhlaWdodDsKKworICAgIHN0YXRlLT5hcHBlbmRNZXNoUXVhZChuUGVuWCwgblBlblksIDAsIHUxLCB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgblBlblggKyB3aWR0aCwgblBlblksIDAsIHUyLCB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgblBlblggKyB3aWR0aCwgblBlblkgLSBoZWlnaHQsIDAsIHUyLCB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgblBlblgsIG5QZW5ZIC0gaGVpZ2h0LCAwLCB1MSwgdjEpOworfQorCit2b2lkIEZvbnQ6OmRyYXdDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8qIGdseXBoLCBpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJpdG1hcCwgdWludDMyX3QgYml0bWFwVywgdWludDMyX3QgYml0bWFwSCkgeworICAgIGludDMyX3QgblBlblggPSB4ICsgZ2x5cGgtPm1CaXRtYXBMZWZ0OworICAgIGludDMyX3QgblBlblkgPSB5ICsgZ2x5cGgtPm1CaXRtYXBUb3A7CisKKyAgICB1aW50MzJfdCBlbmRYID0gZ2x5cGgtPm1CaXRtYXBNaW5YICsgZ2x5cGgtPm1CaXRtYXBXaWR0aDsKKyAgICB1aW50MzJfdCBlbmRZID0gZ2x5cGgtPm1CaXRtYXBNaW5ZICsgZ2x5cGgtPm1CaXRtYXBIZWlnaHQ7CisKKyAgICBGb250U3RhdGUgKnN0YXRlID0gJm1SU0MtPm1TdGF0ZUZvbnQ7CisgICAgdWludDMyX3QgY2FjaGVXaWR0aCA9IHN0YXRlLT5nZXRDYWNoZVRleHR1cmVUeXBlKCktPmdldERpbVgoKTsKKyAgICBjb25zdCB1aW50OF90KiBjYWNoZUJ1ZmZlciA9IHN0YXRlLT5nZXRUZXh0VGV4dHVyZURhdGEoKTsKKworICAgIHVpbnQzMl90IGNhY2hlWCA9IDAsIGNhY2hlWSA9IDA7CisgICAgaW50MzJfdCBiWCA9IDAsIGJZID0gMDsKKyAgICBmb3IgKGNhY2hlWCA9IGdseXBoLT5tQml0bWFwTWluWCwgYlggPSBuUGVuWDsgY2FjaGVYIDwgZW5kWDsgY2FjaGVYKyssIGJYKyspIHsKKyAgICAgICAgZm9yIChjYWNoZVkgPSBnbHlwaC0+bUJpdG1hcE1pblksIGJZID0gblBlblk7IGNhY2hlWSA8IGVuZFk7IGNhY2hlWSsrLCBiWSsrKSB7CisgICAgICAgICAgICBpZiAoYlggPCAwIHx8IGJZIDwgMCB8fCBiWCA+PSAoaW50MzJfdCkgYml0bWFwVyB8fCBiWSA+PSAoaW50MzJfdCkgYml0bWFwSCkgeworICAgICAgICAgICAgICAgIExPR0UoIlNraXBwaW5nIGludmFsaWQgaW5kZXgiKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQ4X3QgdGVtcENvbCA9IGNhY2hlQnVmZmVyW2NhY2hlWSAqIGNhY2hlV2lkdGggKyBjYWNoZVhdOworICAgICAgICAgICAgYml0bWFwW2JZICogYml0bWFwVyArIGJYXSA9IHRlbXBDb2w7CisgICAgICAgIH0KKyAgICB9CisKK30KKwordm9pZCBGb250OjptZWFzdXJlQ2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50MzJfdCB4LCBpbnQzMl90IHksIFJlY3QgKmJvdW5kcykgeworICAgIGludDMyX3QgblBlblggPSB4ICsgZ2x5cGgtPm1CaXRtYXBMZWZ0OworICAgIGludDMyX3QgblBlblkgPSB5IC0gZ2x5cGgtPm1CaXRtYXBUb3AgKyBnbHlwaC0+bUJpdG1hcEhlaWdodDsKKworICAgIGludDMyX3Qgd2lkdGggPSAoaW50MzJfdCkgZ2x5cGgtPm1CaXRtYXBXaWR0aDsKKyAgICBpbnQzMl90IGhlaWdodCA9IChpbnQzMl90KSBnbHlwaC0+bUJpdG1hcEhlaWdodDsKKworICAgIGlmIChib3VuZHMtPmJvdHRvbSA+IG5QZW5ZKSB7CisgICAgICAgIGJvdW5kcy0+Ym90dG9tID0gblBlblk7CisgICAgfQorICAgIGlmIChib3VuZHMtPmxlZnQgPiBuUGVuWCkgeworICAgICAgICBib3VuZHMtPmxlZnQgPSBuUGVuWDsKKyAgICB9CisgICAgaWYgKGJvdW5kcy0+cmlnaHQgPCBuUGVuWCArIHdpZHRoKSB7CisgICAgICAgIGJvdW5kcy0+cmlnaHQgPSBuUGVuWCArIHdpZHRoOworICAgIH0KKyAgICBpZiAoYm91bmRzLT50b3AgPCBuUGVuWSArIGhlaWdodCkgeworICAgICAgICBib3VuZHMtPnRvcCA9IG5QZW5ZICsgaGVpZ2h0OworICAgIH0KK30KKwordm9pZCBGb250OjpyZW5kZXJVVEYoY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3QgbGVuLCBpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0LCBpbnQzMl90IG51bUdseXBocywKKyAgICAgICAgICAgICAgICAgICAgIFJlbmRlck1vZGUgbW9kZSwgUmVjdCAqYm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYml0bWFwLCB1aW50MzJfdCBiaXRtYXBXLCB1aW50MzJfdCBiaXRtYXBIKQoreworICAgIGlmKCFtSW5pdGlhbGl6ZWQgfHwgbnVtR2x5cGhzID09IDAgfHwgdGV4dCA9PSBOVUxMIHx8IGxlbiA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZihtb2RlID09IEZvbnQ6Ok1FQVNVUkUpIHsKKyAgICAgICAgaWYgKGJvdW5kcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBMT0dFKCJObyByZXR1cm4gcmVjdGFuZ2xlIHByb3ZpZGVkIHRvIG1lYXN1cmUgdGV4dCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIFJlc2V0IG1pbiBhbmQgbWF4IG9mIHRoZSBib3VuZGluZyBib3ggdG8gc29tZXRoaW5nIGxhcmdlCisgICAgICAgIGJvdW5kcy0+c2V0KDFlNiwgLTFlNiwgLTFlNiwgMWU2KTsKKyAgICB9CisKKyAgICBpbnQzMl90IHBlblggPSB4LCBwZW5ZID0geTsKKyAgICBpbnQzMl90IGdseXBoc0xlZnQgPSAxOworICAgIGlmKG51bUdseXBocyA+IDApIHsKKyAgICAgICAgZ2x5cGhzTGVmdCA9IG51bUdseXBoczsKKyAgICB9CisKKyAgICBzaXplX3QgaW5kZXggPSBzdGFydDsKKyAgICBzaXplX3QgbmV4dEluZGV4ID0gMDsKKworICAgIHdoaWxlIChnbHlwaHNMZWZ0ID4gMCkgeworCisgICAgICAgIGludDMyX3QgdXRmQ2hhciA9IHV0ZjMyX2F0KHRleHQsIGxlbiwgaW5kZXgsICZuZXh0SW5kZXgpOworCisgICAgICAgIC8vIFJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIG9yIGVuY291bnRlcmVkCisgICAgICAgIGlmKHV0ZkNoYXIgPCAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE1vdmUgdG8gdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSBhcnJheQorICAgICAgICBpbmRleCA9IG5leHRJbmRleDsKKworICAgICAgICBDYWNoZWRHbHlwaEluZm8gKmNhY2hlZEdseXBoID0gZ2V0Q2FjaGVkVVRGQ2hhcih1dGZDaGFyKTsKKworICAgICAgICAvLyBJZiBpdCdzIHN0aWxsIG5vdCB2YWxpZCwgd2UgY291bGRuJ3QgY2FjaGUgaXQsIHNvIHdlIHNob3VsZG4ndCBkcmF3IGdhcmJhZ2UKKyAgICAgICAgaWYoY2FjaGVkR2x5cGgtPm1Jc1ZhbGlkKSB7CisgICAgICAgICAgICBzd2l0Y2gobW9kZSkgeworICAgICAgICAgICAgY2FzZSBGUkFNRUJVRkZFUjoKKyAgICAgICAgICAgICAgICBkcmF3Q2FjaGVkR2x5cGgoY2FjaGVkR2x5cGgsIHBlblgsIHBlblkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCSVRNQVA6CisgICAgICAgICAgICAgICAgZHJhd0NhY2hlZEdseXBoKGNhY2hlZEdseXBoLCBwZW5YLCBwZW5ZLCBiaXRtYXAsIGJpdG1hcFcsIGJpdG1hcEgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNRUFTVVJFOgorICAgICAgICAgICAgICAgIG1lYXN1cmVDYWNoZWRHbHlwaChjYWNoZWRHbHlwaCwgcGVuWCwgcGVuWSwgYm91bmRzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBlblggKz0gKGNhY2hlZEdseXBoLT5tQWR2YW5jZS54ID4+IDYpOworCisgICAgICAgIC8vIElmIHdlIHdlcmUgZ2l2ZW4gYSBzcGVjaWZpYyBudW1iZXIgb2YgZ2x5cGhzLCBkZWNyZW1lbnQKKyAgICAgICAgaWYobnVtR2x5cGhzID4gMCkgeworICAgICAgICAgICAgZ2x5cGhzTGVmdCAtLTsKKyAgICAgICAgfQorICAgIH0KK30KKworRm9udDo6Q2FjaGVkR2x5cGhJbmZvKiBGb250OjpnZXRDYWNoZWRVVEZDaGFyKGludDMyX3QgdXRmQ2hhcikgeworCisgICAgQ2FjaGVkR2x5cGhJbmZvICpjYWNoZWRHbHlwaCA9IG1DYWNoZWRHbHlwaHMudmFsdWVGb3IoKHVpbnQzMl90KXV0ZkNoYXIpOworICAgIGlmKGNhY2hlZEdseXBoID09IE5VTEwpIHsKKyAgICAgICAgY2FjaGVkR2x5cGggPSBjYWNoZUdseXBoKCh1aW50MzJfdCl1dGZDaGFyKTsKKyAgICB9CisgICAgLy8gSXMgdGhlIGdseXBoIHN0aWxsIGluIHRleHR1cmUgY2FjaGU/CisgICAgaWYoIWNhY2hlZEdseXBoLT5tSXNWYWxpZCkgeworICAgICAgICB1cGRhdGVHbHlwaENhY2hlKGNhY2hlZEdseXBoKTsKKyAgICB9CisKKyAgICByZXR1cm4gY2FjaGVkR2x5cGg7Cit9CisKK3ZvaWQgRm9udDo6dXBkYXRlR2x5cGhDYWNoZShDYWNoZWRHbHlwaEluZm8gKmdseXBoKQoreworICAgIEZUX0Vycm9yIGVycm9yID0gRlRfTG9hZF9HbHlwaCggbUZhY2UsIGdseXBoLT5tR2x5cGhJbmRleCwgRlRfTE9BRF9SRU5ERVIgKTsKKyAgICBpZihlcnJvcikgeworICAgICAgICBMT0dFKCJDb3VsZG4ndCBsb2FkIGdseXBoLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2x5cGgtPm1BZHZhbmNlID0gbUZhY2UtPmdseXBoLT5hZHZhbmNlOworICAgIGdseXBoLT5tQml0bWFwTGVmdCA9IG1GYWNlLT5nbHlwaC0+Yml0bWFwX2xlZnQ7CisgICAgZ2x5cGgtPm1CaXRtYXBUb3AgPSBtRmFjZS0+Z2x5cGgtPmJpdG1hcF90b3A7CisKKyAgICBGVF9CaXRtYXAgKmJpdG1hcCA9ICZtRmFjZS0+Z2x5cGgtPmJpdG1hcDsKKworICAgIC8vIE5vdyBjb3B5IHRoZSBiaXRtYXAgaW50byB0aGUgY2FjaGUgdGV4dHVyZQorICAgIHVpbnQzMl90IHN0YXJ0WCA9IDA7CisgICAgdWludDMyX3Qgc3RhcnRZID0gMDsKKworICAgIC8vIExldCB0aGUgZm9udCBzdGF0ZSBmaWd1cmUgb3V0IHdoZXJlIHRvIHB1dCB0aGUgYml0bWFwCisgICAgRm9udFN0YXRlICpzdGF0ZSA9ICZtUlNDLT5tU3RhdGVGb250OworICAgIGdseXBoLT5tSXNWYWxpZCA9IHN0YXRlLT5jYWNoZUJpdG1hcChiaXRtYXAsICZzdGFydFgsICZzdGFydFkpOworCisgICAgaWYoIWdseXBoLT5tSXNWYWxpZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDMyX3QgZW5kWCA9IHN0YXJ0WCArIGJpdG1hcC0+d2lkdGg7CisgICAgdWludDMyX3QgZW5kWSA9IHN0YXJ0WSArIGJpdG1hcC0+cm93czsKKworICAgIGdseXBoLT5tQml0bWFwTWluWCA9IHN0YXJ0WDsKKyAgICBnbHlwaC0+bUJpdG1hcE1pblkgPSBzdGFydFk7CisgICAgZ2x5cGgtPm1CaXRtYXBXaWR0aCA9IGJpdG1hcC0+d2lkdGg7CisgICAgZ2x5cGgtPm1CaXRtYXBIZWlnaHQgPSBiaXRtYXAtPnJvd3M7CisKKyAgICB1aW50MzJfdCBjYWNoZVdpZHRoID0gc3RhdGUtPmdldENhY2hlVGV4dHVyZVR5cGUoKS0+Z2V0RGltWCgpOworICAgIHVpbnQzMl90IGNhY2hlSGVpZ2h0ID0gc3RhdGUtPmdldENhY2hlVGV4dHVyZVR5cGUoKS0+Z2V0RGltWSgpOworCisgICAgZ2x5cGgtPm1CaXRtYXBNaW5VID0gKGZsb2F0KXN0YXJ0WCAvIChmbG9hdCljYWNoZVdpZHRoOworICAgIGdseXBoLT5tQml0bWFwTWluViA9IChmbG9hdClzdGFydFkgLyAoZmxvYXQpY2FjaGVIZWlnaHQ7CisgICAgZ2x5cGgtPm1CaXRtYXBNYXhVID0gKGZsb2F0KWVuZFggLyAoZmxvYXQpY2FjaGVXaWR0aDsKKyAgICBnbHlwaC0+bUJpdG1hcE1heFYgPSAoZmxvYXQpZW5kWSAvIChmbG9hdCljYWNoZUhlaWdodDsKK30KKworRm9udDo6Q2FjaGVkR2x5cGhJbmZvICpGb250OjpjYWNoZUdseXBoKHVpbnQzMl90IGdseXBoKQoreworICAgIENhY2hlZEdseXBoSW5mbyAqbmV3R2x5cGggPSBuZXcgQ2FjaGVkR2x5cGhJbmZvKCk7CisgICAgbUNhY2hlZEdseXBocy5hZGQoZ2x5cGgsIG5ld0dseXBoKTsKKworICAgIG5ld0dseXBoLT5tR2x5cGhJbmRleCA9IEZUX0dldF9DaGFyX0luZGV4KG1GYWNlLCBnbHlwaCk7CisgICAgbmV3R2x5cGgtPm1Jc1ZhbGlkID0gZmFsc2U7CisKKyAgICB1cGRhdGVHbHlwaENhY2hlKG5ld0dseXBoKTsKKworICAgIHJldHVybiBuZXdHbHlwaDsKK30KKworRm9udCAqIEZvbnQ6OmNyZWF0ZShDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGZvbnRTaXplLCB1aW50MzJfdCBkcGkpCit7CisgICAgcnNjLT5tU3RhdGVGb250LmNoZWNrSW5pdCgpOworICAgIFZlY3RvcjxGb250Kj4gJmFjdGl2ZUZvbnRzID0gcnNjLT5tU3RhdGVGb250Lm1BY3RpdmVGb250czsKKworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IGFjdGl2ZUZvbnRzLnNpemUoKTsgaSArKykgeworICAgICAgICBGb250ICppdGhGb250ID0gYWN0aXZlRm9udHNbaV07CisgICAgICAgIGlmKGl0aEZvbnQtPm1Gb250TmFtZSA9PSBuYW1lICYmIGl0aEZvbnQtPm1Gb250U2l6ZSA9PSBmb250U2l6ZSAmJiBpdGhGb250LT5tRHBpID09IGRwaSkgeworICAgICAgICAgICAgcmV0dXJuIGl0aEZvbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBGb250ICpuZXdGb250ID0gbmV3IEZvbnQocnNjKTsKKyAgICBib29sIGlzSW5pdGlhbGl6ZWQgPSBuZXdGb250LT5pbml0KG5hbWUsIGZvbnRTaXplLCBkcGkpOworICAgIGlmKGlzSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgYWN0aXZlRm9udHMucHVzaChuZXdGb250KTsKKyAgICAgICAgcnNjLT5tU3RhdGVGb250LnByZWNhY2hlTGF0aW4obmV3Rm9udCk7CisgICAgICAgIHJldHVybiBuZXdGb250OworICAgIH0KKworICAgIGRlbGV0ZSBuZXdGb250OworICAgIHJldHVybiBOVUxMOworCit9CisKK0ZvbnQ6On5Gb250KCkKK3sKKyAgICBpZihtRmFjZSkgeworICAgICAgICBGVF9Eb25lX0ZhY2UobUZhY2UpOworICAgIH0KKworICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IG1SU0MtPm1TdGF0ZUZvbnQubUFjdGl2ZUZvbnRzLnNpemUoKTsgY3QrKykgeworICAgICAgICBpZiAobVJTQy0+bVN0YXRlRm9udC5tQWN0aXZlRm9udHNbY3RdID09IHRoaXMpIHsKKyAgICAgICAgICAgIG1SU0MtPm1TdGF0ZUZvbnQubUFjdGl2ZUZvbnRzLnJlbW92ZUF0KGN0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlZEdseXBocy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCA9IG1DYWNoZWRHbHlwaHMudmFsdWVBdChpKTsKKyAgICAgICAgZGVsZXRlIGdseXBoOworICAgIH0KK30KKworRm9udFN0YXRlOjpGb250U3RhdGUoKQoreworICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIG1NYXhOdW1iZXJPZlF1YWRzID0gMTAyNDsKKyAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgbVJTQyA9IE5VTEw7CisgICAgbUxpYnJhcnkgPSBOVUxMOworICAgIHNldEZvbnRDb2xvcigwLjFmLCAwLjFmLCAwLjFmLCAxLjBmKTsKKworICAgIC8vIEdldCB0aGUgcmVuZGVyZXIgcHJvcGVydGllcworICAgIGNoYXIgcHJvcGVydHlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKworICAgIC8vIEdldCB0aGUgZ2FtbWEKKyAgICBmbG9hdCBnYW1tYSA9IERFRkFVTFRfVEVYVF9HQU1NQTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX1RFWFRfR0FNTUEsIHByb3BlcnR5LCBOVUxMKSA+IDApIHsKKyAgICAgICAgTE9HRCgiICBTZXR0aW5nIHRleHQgZ2FtbWEgdG8gJXMiLCBwcm9wZXJ0eSk7CisgICAgICAgIGdhbW1hID0gYXRvZihwcm9wZXJ0eSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiICBVc2luZyBkZWZhdWx0IHRleHQgZ2FtbWEgb2YgJS4yZiIsIERFRkFVTFRfVEVYVF9HQU1NQSk7CisgICAgfQorCisgICAgLy8gR2V0IHRoZSBibGFjayBnYW1tYSB0aHJlc2hvbGQKKyAgICBpbnQzMl90IGJsYWNrVGhyZXNob2xkID0gREVGQVVMVF9URVhUX0JMQUNLX0dBTU1BX1RIUkVTSE9MRDsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX1RFWFRfQkxBQ0tfR0FNTUFfVEhSRVNIT0xELCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyB0ZXh0IGJsYWNrIGdhbW1hIHRocmVzaG9sZCB0byAlcyIsIHByb3BlcnR5KTsKKyAgICAgICAgYmxhY2tUaHJlc2hvbGQgPSBhdG9pKHByb3BlcnR5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCIgIFVzaW5nIGRlZmF1bHQgdGV4dCBibGFjayBnYW1tYSB0aHJlc2hvbGQgb2YgJWQiLAorICAgICAgICAgICAgICAgIERFRkFVTFRfVEVYVF9CTEFDS19HQU1NQV9USFJFU0hPTEQpOworICAgIH0KKyAgICBtQmxhY2tUaHJlc2hvbGQgPSAoZmxvYXQpKGJsYWNrVGhyZXNob2xkKSAvIDI1NS4wZjsKKworICAgIC8vIEdldCB0aGUgd2hpdGUgZ2FtbWEgdGhyZXNob2xkCisgICAgaW50MzJfdCB3aGl0ZVRocmVzaG9sZCA9IERFRkFVTFRfVEVYVF9XSElURV9HQU1NQV9USFJFU0hPTEQ7CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9URVhUX1dISVRFX0dBTU1BX1RIUkVTSE9MRCwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgdGV4dCB3aGl0ZSBnYW1tYSB0aHJlc2hvbGQgdG8gJXMiLCBwcm9wZXJ0eSk7CisgICAgICAgIHdoaXRlVGhyZXNob2xkID0gYXRvaShwcm9wZXJ0eSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiICBVc2luZyBkZWZhdWx0IHdoaXRlIGJsYWNrIGdhbW1hIHRocmVzaG9sZCBvZiAlZCIsCisgICAgICAgICAgICAgICAgREVGQVVMVF9URVhUX1dISVRFX0dBTU1BX1RIUkVTSE9MRCk7CisgICAgfQorICAgIG1XaGl0ZVRocmVzaG9sZCA9IChmbG9hdCkod2hpdGVUaHJlc2hvbGQpIC8gMjU1LjBmOworCisgICAgLy8gQ29tcHV0ZSB0aGUgZ2FtbWEgdGFibGVzCisgICAgbUJsYWNrR2FtbWEgPSBnYW1tYTsKKyAgICBtV2hpdGVHYW1tYSA9IDEuMGYgLyBnYW1tYTsKK30KKworRm9udFN0YXRlOjp+Rm9udFN0YXRlKCkKK3sKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgZGVsZXRlIG1DYWNoZUxpbmVzW2ldOworICAgIH0KKworICAgIHJzQXNzZXJ0KCFtQWN0aXZlRm9udHMuc2l6ZSgpKTsKK30KKworRlRfTGlicmFyeSBGb250U3RhdGU6OmdldExpYigpCit7CisgICAgaWYoIW1MaWJyYXJ5KSB7CisgICAgICAgIEZUX0Vycm9yIGVycm9yID0gRlRfSW5pdF9GcmVlVHlwZSgmbUxpYnJhcnkpOworICAgICAgICBpZihlcnJvcikgeworICAgICAgICAgICAgTE9HRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgZnJlZXR5cGUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1MaWJyYXJ5OworfQorCit2b2lkIEZvbnRTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MpCit7CisgICAgbVJTQyA9IHJzYzsKK30KKwordm9pZCBGb250U3RhdGU6OmZsdXNoQWxsQW5kSW52YWxpZGF0ZSgpCit7CisgICAgaWYobUN1cnJlbnRRdWFkSW5kZXggIT0gMCkgeworICAgICAgICBpc3N1ZURyYXdDb21tYW5kKCk7CisgICAgICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICB9CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUFjdGl2ZUZvbnRzLnNpemUoKTsgaSArKykgeworICAgICAgICBtQWN0aXZlRm9udHNbaV0tPmludmFsaWRhdGVUZXh0dXJlQ2FjaGUoKTsKKyAgICB9CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIG1DYWNoZUxpbmVzW2ldLT5tQ3VycmVudENvbCA9IDA7CisgICAgfQorfQorCitib29sIEZvbnRTdGF0ZTo6Y2FjaGVCaXRtYXAoRlRfQml0bWFwICpiaXRtYXAsIHVpbnQzMl90ICpyZXRPcmlnaW5YLCB1aW50MzJfdCAqcmV0T3JpZ2luWSkKK3sKKyAgICAvLyBJZiB0aGUgZ2x5cGggaXMgdG9vIHRhbGwsIGRvbid0IGNhY2hlIGl0CisgICAgaWYoKHVpbnQzMl90KWJpdG1hcC0+cm93cyA+IG1DYWNoZUxpbmVzW21DYWNoZUxpbmVzLnNpemUoKS0xXS0+bU1heEhlaWdodCkgeworICAgICAgICBMT0dFKCJGb250IHNpemUgdG8gbGFyZ2UgdG8gZml0IGluIGNhY2hlLiB3aWR0aCwgaGVpZ2h0ID0gJWksICVpIiwgKGludCliaXRtYXAtPndpZHRoLCAoaW50KWJpdG1hcC0+cm93cyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBOb3cgY29weSB0aGUgYml0bWFwIGludG8gdGhlIGNhY2hlIHRleHR1cmUKKyAgICB1aW50MzJfdCBzdGFydFggPSAwOworICAgIHVpbnQzMl90IHN0YXJ0WSA9IDA7CisKKyAgICBib29sIGJpdG1hcEZpdCA9IGZhbHNlOworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSArKykgeworICAgICAgICBiaXRtYXBGaXQgPSBtQ2FjaGVMaW5lc1tpXS0+Zml0Qml0bWFwKGJpdG1hcCwgJnN0YXJ0WCwgJnN0YXJ0WSk7CisgICAgICAgIGlmKGJpdG1hcEZpdCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0aGUgbmV3IGdseXBoIGRpZG4ndCBmaXQsIGZsdXNoIHRoZSBzdGF0ZSBzbyBmYXIgYW5kIGludmFsaWRhdGUgZXZlcnl0aGluZworICAgIGlmKCFiaXRtYXBGaXQpIHsKKyAgICAgICAgZmx1c2hBbGxBbmRJbnZhbGlkYXRlKCk7CisKKyAgICAgICAgLy8gVHJ5IHRvIGZpdCBpdCBhZ2FpbgorICAgICAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgICAgIGJpdG1hcEZpdCA9IG1DYWNoZUxpbmVzW2ldLT5maXRCaXRtYXAoYml0bWFwLCAmc3RhcnRYLCAmc3RhcnRZKTsKKyAgICAgICAgICAgIGlmKGJpdG1hcEZpdCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgd2Ugc3RpbGwgZG9uJ3QgZml0LCBzb21ldGhpbmcgaXMgd3JvbmcgYW5kIHdlIHNob3VsZG4ndCBkcmF3CisgICAgICAgIGlmKCFiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgIExPR0UoIkJpdG1hcCBkb2Vzbid0IGZpdCBpbiBjYWNoZS4gd2lkdGgsIGhlaWdodCA9ICVpLCAlaSIsIChpbnQpYml0bWFwLT53aWR0aCwgKGludCliaXRtYXAtPnJvd3MpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgKnJldE9yaWdpblggPSBzdGFydFg7CisgICAgKnJldE9yaWdpblkgPSBzdGFydFk7CisKKyAgICB1aW50MzJfdCBlbmRYID0gc3RhcnRYICsgYml0bWFwLT53aWR0aDsKKyAgICB1aW50MzJfdCBlbmRZID0gc3RhcnRZICsgYml0bWFwLT5yb3dzOworCisgICAgdWludDMyX3QgY2FjaGVXaWR0aCA9IGdldENhY2hlVGV4dHVyZVR5cGUoKS0+Z2V0RGltWCgpOworCisgICAgdWludDhfdCAqY2FjaGVCdWZmZXIgPSAodWludDhfdCopbVRleHRUZXh0dXJlLT5nZXRQdHIoKTsKKyAgICB1aW50OF90ICpiaXRtYXBCdWZmZXIgPSBiaXRtYXAtPmJ1ZmZlcjsKKworICAgIHVpbnQzMl90IGNhY2hlWCA9IDAsIGJYID0gMCwgY2FjaGVZID0gMCwgYlkgPSAwOworICAgIGZvcihjYWNoZVggPSBzdGFydFgsIGJYID0gMDsgY2FjaGVYIDwgZW5kWDsgY2FjaGVYICsrLCBiWCArKykgeworICAgICAgICBmb3IoY2FjaGVZID0gc3RhcnRZLCBiWSA9IDA7IGNhY2hlWSA8IGVuZFk7IGNhY2hlWSArKywgYlkgKyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdGVtcENvbCA9IGJpdG1hcEJ1ZmZlcltiWSAqIGJpdG1hcC0+d2lkdGggKyBiWF07CisgICAgICAgICAgICBjYWNoZUJ1ZmZlcltjYWNoZVkqY2FjaGVXaWR0aCArIGNhY2hlWF0gPSB0ZW1wQ29sOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyB3aWxsIGRpcnR5IHRoZSB0ZXh0dXJlIGFuZCB0aGUgc2hhZGVyIHNvIG5leHQgdGltZQorICAgIC8vIHdlIGRyYXcgaXQgd2lsbCB1cGxvYWQgdGhlIGRhdGEKKyAgICBtVGV4dFRleHR1cmUtPmRlZmVyZWRVcGxvYWRUb1RleHR1cmUobVJTQywgZmFsc2UsIDApOworICAgIG1Gb250U2hhZGVyRi0+YmluZFRleHR1cmUobVJTQywgMCwgbVRleHRUZXh0dXJlLmdldCgpKTsKKworICAgIC8vIFNvbWUgZGVidWcgY29kZQorICAgIC8qZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIExPR0UoIkNhY2hlIExpbmU6IEg6ICV1IEVtcHR5IFNwYWNlOiAlZiIsCisgICAgICAgICAgICAgbUNhY2hlTGluZXNbaV0tPm1NYXhIZWlnaHQsCisgICAgICAgICAgICAgICgxLjBmIC0gKGZsb2F0KW1DYWNoZUxpbmVzW2ldLT5tQ3VycmVudENvbC8oZmxvYXQpbUNhY2hlTGluZXNbaV0tPm1NYXhXaWR0aCkqMTAwLjBmKTsKKworICAgIH0qLworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjppbml0UmVuZGVyU3RhdGUoKQoreworICAgIFN0cmluZzggc2hhZGVyU3RyaW5nKCJ2YXJ5aW5nIHZlYzIgdmFyVGV4MDtcbiIpOworICAgIHNoYWRlclN0cmluZy5hcHBlbmQoInZvaWQgbWFpbigpIHtcbiIpOworICAgIHNoYWRlclN0cmluZy5hcHBlbmQoIiAgbG93cCB2ZWM0IGNvbCA9IFVOSV9Db2xvcjtcbiIpOworICAgIHNoYWRlclN0cmluZy5hcHBlbmQoIiAgY29sLmEgPSB0ZXh0dXJlMkQoVU5JX1RleDAsIHZhclRleDAueHkpLmE7XG4iKTsKKyAgICBzaGFkZXJTdHJpbmcuYXBwZW5kKCIgIGNvbC5hID0gcG93KGNvbC5hLCBVTklfR2FtbWEpO1xuIik7CisgICAgc2hhZGVyU3RyaW5nLmFwcGVuZCgiICBnbF9GcmFnQ29sb3IgPSBjb2w7XG4iKTsKKyAgICBzaGFkZXJTdHJpbmcuYXBwZW5kKCJ9XG4iKTsKKworICAgIGNvbnN0IEVsZW1lbnQgKmNvbG9yRWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShtUlNDLCBSU19UWVBFX0ZMT0FUXzMyLCBSU19LSU5EX1VTRVIsIGZhbHNlLCA0KTsKKyAgICBjb25zdCBFbGVtZW50ICpnYW1tYUVsZW0gPSBFbGVtZW50OjpjcmVhdGUobVJTQywgUlNfVFlQRV9GTE9BVF8zMiwgUlNfS0lORF9VU0VSLCBmYWxzZSwgMSk7CisgICAgbVJTQy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckJlZ2luKCk7CisgICAgbVJTQy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckFkZChjb2xvckVsZW0sICJDb2xvciIsIDEpOworICAgIG1SU0MtPm1TdGF0ZUVsZW1lbnQuZWxlbWVudEJ1aWxkZXJBZGQoZ2FtbWFFbGVtLCAiR2FtbWEiLCAxKTsKKyAgICBjb25zdCBFbGVtZW50ICpjb25zdElucHV0ID0gbVJTQy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckNyZWF0ZShtUlNDKTsKKworICAgIFR5cGUgKmlucHV0VHlwZSA9IG5ldyBUeXBlKG1SU0MpOworICAgIGlucHV0VHlwZS0+c2V0RWxlbWVudChjb25zdElucHV0KTsKKyAgICBpbnB1dFR5cGUtPnNldERpbVgoMSk7CisgICAgaW5wdXRUeXBlLT5jb21wdXRlKCk7CisKKyAgICB1aW50MzJfdCB0bXBbNF07CisgICAgdG1wWzBdID0gUlNfUFJPR1JBTV9QQVJBTV9DT05TVEFOVDsKKyAgICB0bXBbMV0gPSAodWludDMyX3QpaW5wdXRUeXBlOworICAgIHRtcFsyXSA9IFJTX1BST0dSQU1fUEFSQU1fVEVYVFVSRV9DT1VOVDsKKyAgICB0bXBbM10gPSAxOworCisgICAgbUZvbnRTaGFkZXJGQ29uc3RhbnQuc2V0KG5ldyBBbGxvY2F0aW9uKG1SU0MsIGlucHV0VHlwZSkpOworICAgIFByb2dyYW1GcmFnbWVudCAqcGYgPSBuZXcgUHJvZ3JhbUZyYWdtZW50KG1SU0MsIHNoYWRlclN0cmluZy5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJTdHJpbmcubGVuZ3RoKCksIHRtcCwgNCk7CisgICAgbUZvbnRTaGFkZXJGLnNldChwZik7CisgICAgbUZvbnRTaGFkZXJGLT5iaW5kQWxsb2NhdGlvbihtUlNDLCBtRm9udFNoYWRlckZDb25zdGFudC5nZXQoKSwgMCk7CisKKyAgICBTYW1wbGVyICpzYW1wbGVyID0gbmV3IFNhbXBsZXIobVJTQywgUlNfU0FNUExFUl9ORUFSRVNULCBSU19TQU1QTEVSX05FQVJFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTX1NBTVBMRVJfQ0xBTVAsIFJTX1NBTVBMRVJfQ0xBTVAsIFJTX1NBTVBMRVJfQ0xBTVApOworICAgIG1Gb250U2FtcGxlci5zZXQoc2FtcGxlcik7CisgICAgbUZvbnRTaGFkZXJGLT5iaW5kU2FtcGxlcihtUlNDLCAwLCBzYW1wbGVyKTsKKworICAgIFByb2dyYW1TdG9yZSAqZm9udFN0b3JlID0gbmV3IFByb2dyYW1TdG9yZShtUlNDKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS5zZXQoZm9udFN0b3JlKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS0+c2V0RGVwdGhGdW5jKFJTX0RFUFRIX0ZVTkNfQUxXQVlTKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS0+c2V0QmxlbmRGdW5jKFJTX0JMRU5EX1NSQ19TUkNfQUxQSEEsIFJTX0JMRU5EX0RTVF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS0+c2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICBtRm9udFByb2dyYW1TdG9yZS0+c2V0RGVwdGhNYXNrKGZhbHNlKTsKK30KKwordm9pZCBGb250U3RhdGU6OmluaXRUZXh0VGV4dHVyZSgpCit7CisgICAgY29uc3QgRWxlbWVudCAqYWxwaGFFbGVtID0gRWxlbWVudDo6Y3JlYXRlKG1SU0MsIFJTX1RZUEVfVU5TSUdORURfOCwgUlNfS0lORF9QSVhFTF9BLCB0cnVlLCAxKTsKKworICAgIC8vIFdlIHdpbGwgYWxsb2NhdGUgYSB0ZXh0dXJlIHRvIGluaXRpYWxseSBob2xkIDMyIGNoYXJhY3RlciBiaXRtYXBzCisgICAgVHlwZSAqdGV4VHlwZSA9IG5ldyBUeXBlKG1SU0MpOworICAgIHRleFR5cGUtPnNldEVsZW1lbnQoYWxwaGFFbGVtKTsKKyAgICB0ZXhUeXBlLT5zZXREaW1YKDEwMjQpOworICAgIHRleFR5cGUtPnNldERpbVkoMjU2KTsKKyAgICB0ZXhUeXBlLT5jb21wdXRlKCk7CisKKyAgICBBbGxvY2F0aW9uICpjYWNoZUFsbG9jID0gbmV3IEFsbG9jYXRpb24obVJTQywgdGV4VHlwZSk7CisgICAgbVRleHRUZXh0dXJlLnNldChjYWNoZUFsbG9jKTsKKyAgICBtVGV4dFRleHR1cmUtPmRlZmVyZWRVcGxvYWRUb1RleHR1cmUobVJTQywgZmFsc2UsIDApOworCisgICAgLy8gU3BsaXQgdXAgb3VyIGNhY2hlIHRleHR1cmUgaW50byBsaW5lcyBvZiBjZXJ0YWluIHdpZHRocworICAgIGludDMyX3QgbmV4dExpbmUgPSAwOworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUoMTYsIHRleFR5cGUtPmdldERpbVgoKSwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKDI0LCB0ZXhUeXBlLT5nZXREaW1YKCksIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZSgyNCwgdGV4VHlwZS0+Z2V0RGltWCgpLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUoMzIsIHRleFR5cGUtPmdldERpbVgoKSwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKDMyLCB0ZXhUeXBlLT5nZXREaW1YKCksIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZSg0MCwgdGV4VHlwZS0+Z2V0RGltWCgpLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUodGV4VHlwZS0+Z2V0RGltWSgpIC0gbmV4dExpbmUsIHRleFR5cGUtPmdldERpbVgoKSwgbmV4dExpbmUsIDApKTsKK30KKworLy8gQXZvaWQgaGF2aW5nIHRvIHJlYWxsb2NhdGUgbWVtb3J5IGFuZCByZW5kZXIgcXVhZCBieSBxdWFkCit2b2lkIEZvbnRTdGF0ZTo6aW5pdFZlcnRleEFycmF5QnVmZmVycygpCit7CisgICAgLy8gTm93IGxldHMgd3JpdGUgaW5kZXggZGF0YQorICAgIGNvbnN0IEVsZW1lbnQgKmluZGV4RWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShtUlNDLCBSU19UWVBFX1VOU0lHTkVEXzE2LCBSU19LSU5EX1VTRVIsIGZhbHNlLCAxKTsKKyAgICBUeXBlICppbmRleFR5cGUgPSBuZXcgVHlwZShtUlNDKTsKKyAgICB1aW50MzJfdCBudW1JbmRpY2llcyA9IG1NYXhOdW1iZXJPZlF1YWRzICogNjsKKyAgICBpbmRleFR5cGUtPnNldERpbVgobnVtSW5kaWNpZXMpOworICAgIGluZGV4VHlwZS0+c2V0RWxlbWVudChpbmRleEVsZW0pOworICAgIGluZGV4VHlwZS0+Y29tcHV0ZSgpOworCisgICAgQWxsb2NhdGlvbiAqaW5kZXhBbGxvYyA9IG5ldyBBbGxvY2F0aW9uKG1SU0MsIGluZGV4VHlwZSk7CisgICAgdWludDE2X3QgKmluZGV4UHRyID0gKHVpbnQxNl90KilpbmRleEFsbG9jLT5nZXRQdHIoKTsKKworICAgIC8vIEZvdXIgdmVydHMsIHR3byB0cmlhbmdsZXMgLCBzaXggaW5kaWNlcyBwZXIgcXVhZAorICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1NYXhOdW1iZXJPZlF1YWRzOyBpICsrKSB7CisgICAgICAgIGludDMyX3QgaTYgPSBpICogNjsKKyAgICAgICAgaW50MzJfdCBpNCA9IGkgKiA0OworCisgICAgICAgIGluZGV4UHRyW2k2ICsgMF0gPSBpNCArIDA7CisgICAgICAgIGluZGV4UHRyW2k2ICsgMV0gPSBpNCArIDE7CisgICAgICAgIGluZGV4UHRyW2k2ICsgMl0gPSBpNCArIDI7CisKKyAgICAgICAgaW5kZXhQdHJbaTYgKyAzXSA9IGk0ICsgMDsKKyAgICAgICAgaW5kZXhQdHJbaTYgKyA0XSA9IGk0ICsgMjsKKyAgICAgICAgaW5kZXhQdHJbaTYgKyA1XSA9IGk0ICsgMzsKKyAgICB9CisKKyAgICBpbmRleEFsbG9jLT5kZWZlcmVkVXBsb2FkVG9CdWZmZXJPYmplY3QobVJTQyk7CisgICAgbUluZGV4QnVmZmVyLnNldChpbmRleEFsbG9jKTsKKworICAgIGNvbnN0IEVsZW1lbnQgKnBvc0VsZW0gPSBFbGVtZW50OjpjcmVhdGUobVJTQywgUlNfVFlQRV9GTE9BVF8zMiwgUlNfS0lORF9VU0VSLCBmYWxzZSwgMyk7CisgICAgY29uc3QgRWxlbWVudCAqdGV4RWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShtUlNDLCBSU19UWVBFX0ZMT0FUXzMyLCBSU19LSU5EX1VTRVIsIGZhbHNlLCAyKTsKKworICAgIGNvbnN0IEVsZW1lbnQgKmVsZW1BcnJheVsyXTsKKyAgICBlbGVtQXJyYXlbMF0gPSBwb3NFbGVtOworICAgIGVsZW1BcnJheVsxXSA9IHRleEVsZW07CisKKyAgICBTdHJpbmc4IHBvc05hbWUoInBvc2l0aW9uIik7CisgICAgU3RyaW5nOCB0ZXhOYW1lKCJ0ZXh0dXJlMCIpOworCisgICAgY29uc3QgY2hhciAqbmFtZUFycmF5WzJdOworICAgIG5hbWVBcnJheVswXSA9IHBvc05hbWUuc3RyaW5nKCk7CisgICAgbmFtZUFycmF5WzFdID0gdGV4TmFtZS5zdHJpbmcoKTsKKyAgICBzaXplX3QgbGVuZ3Roc1syXTsKKyAgICBsZW5ndGhzWzBdID0gcG9zTmFtZS5zaXplKCk7CisgICAgbGVuZ3Roc1sxXSA9IHRleE5hbWUuc2l6ZSgpOworICAgIHVpbnQzMl90IGFycmF5U2l6ZXNbMl0gPSB7MSwgMX07CisKKyAgICBjb25zdCBFbGVtZW50ICp2ZXJ0ZXhEYXRhRWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShtUlNDLCAyLCBlbGVtQXJyYXksIG5hbWVBcnJheSwgbGVuZ3RocywgYXJyYXlTaXplcyk7CisKKyAgICBUeXBlICp2ZXJ0ZXhEYXRhVHlwZSA9IG5ldyBUeXBlKG1SU0MpOworICAgIHZlcnRleERhdGFUeXBlLT5zZXREaW1YKG1NYXhOdW1iZXJPZlF1YWRzICogNCk7CisgICAgdmVydGV4RGF0YVR5cGUtPnNldEVsZW1lbnQodmVydGV4RGF0YUVsZW0pOworICAgIHZlcnRleERhdGFUeXBlLT5jb21wdXRlKCk7CisKKyAgICBBbGxvY2F0aW9uICp2ZXJ0ZXhBbGxvYyA9IG5ldyBBbGxvY2F0aW9uKG1SU0MsIHZlcnRleERhdGFUeXBlKTsKKyAgICBtVGV4dE1lc2hQdHIgPSAoZmxvYXQqKXZlcnRleEFsbG9jLT5nZXRQdHIoKTsKKworICAgIG1WZXJ0ZXhBcnJheS5zZXQodmVydGV4QWxsb2MpOworfQorCisvLyBXZSBkb24ndCB3YW50IHRvIGFsbG9jYXRlIGFueXRoaW5nIHVubGVzcyB3ZSBhY3R1YWxseSBkcmF3IHRleHQKK3ZvaWQgRm9udFN0YXRlOjpjaGVja0luaXQoKQoreworICAgIGlmKG1Jbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW5pdFRleHRUZXh0dXJlKCk7CisgICAgaW5pdFJlbmRlclN0YXRlKCk7CisKKyAgICBpbml0VmVydGV4QXJyYXlCdWZmZXJzKCk7CisKKyAgICAvLyBXZSBzdG9yZSBhIHN0cmluZyB3aXRoIGxldHRlcnMgaW4gYSByb3VnaCBmcmVxdWVuY3kgb2Ygb2NjdXJyZW5jZQorICAgIG1MYXRpblByZWNhY2hlID0gU3RyaW5nOCgiIGVpc2FybnRvbGNkdWdwbWhieWZ2a3d6eGpxIik7CisgICAgbUxhdGluUHJlY2FjaGUgKz0gU3RyaW5nOCgiRUlTQVJOVE9MQ0RVR1BNSEJZRlZLV1pYSlEiKTsKKyAgICBtTGF0aW5QcmVjYWNoZSArPSBTdHJpbmc4KCIsLj8hKCktK0A7OmAnIik7CisgICAgbUxhdGluUHJlY2FjaGUgKz0gU3RyaW5nOCgiMDEyMzQ1Njc4OSIpOworCisgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKK30KKwordm9pZCBGb250U3RhdGU6Omlzc3VlRHJhd0NvbW1hbmQoKSB7CisKKyAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFByb2dyYW1WZXJ0ZXg+IHRtcFYobVJTQy0+Z2V0VmVydGV4KCkpOworICAgIG1SU0MtPnNldFZlcnRleChtUlNDLT5nZXREZWZhdWx0UHJvZ3JhbVZlcnRleCgpKTsKKworICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgUHJvZ3JhbVJhc3Rlcj4gdG1wUihtUlNDLT5nZXRSYXN0ZXIoKSk7CisgICAgbVJTQy0+c2V0UmFzdGVyKG1SU0MtPmdldERlZmF1bHRQcm9ncmFtUmFzdGVyKCkpOworCisgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBQcm9ncmFtRnJhZ21lbnQ+IHRtcEYobVJTQy0+Z2V0RnJhZ21lbnQoKSk7CisgICAgbVJTQy0+c2V0RnJhZ21lbnQobUZvbnRTaGFkZXJGLmdldCgpKTsKKworICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgUHJvZ3JhbVN0b3JlPiB0bXBQUyhtUlNDLT5nZXRGcmFnbWVudFN0b3JlKCkpOworICAgIG1SU0MtPnNldEZyYWdtZW50U3RvcmUobUZvbnRQcm9ncmFtU3RvcmUuZ2V0KCkpOworCisgICAgaWYobUNvbnN0YW50c0RpcnR5KSB7CisgICAgICAgIG1Gb250U2hhZGVyRkNvbnN0YW50LT5kYXRhKG1SU0MsICZtQ29uc3RhbnRzLCBzaXplb2YobUNvbnN0YW50cykpOworICAgICAgICBtQ29uc3RhbnRzRGlydHkgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIW1SU0MtPnNldHVwQ2hlY2soKSkgeworICAgICAgICBtUlNDLT5zZXRWZXJ0ZXgoKFByb2dyYW1WZXJ0ZXggKil0bXBWLmdldCgpKTsKKyAgICAgICAgbVJTQy0+c2V0UmFzdGVyKChQcm9ncmFtUmFzdGVyICopdG1wUi5nZXQoKSk7CisgICAgICAgIG1SU0MtPnNldEZyYWdtZW50KChQcm9ncmFtRnJhZ21lbnQgKil0bXBGLmdldCgpKTsKKyAgICAgICAgbVJTQy0+c2V0RnJhZ21lbnRTdG9yZSgoUHJvZ3JhbVN0b3JlICopdG1wUFMuZ2V0KCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZmxvYXQgKnZ0eCA9IChmbG9hdCopbVZlcnRleEFycmF5LT5nZXRQdHIoKTsKKyAgICBmbG9hdCAqdGV4ID0gdnR4ICsgMzsKKworICAgIFZlcnRleEFycmF5IHZhOworICAgIHZhLmFkZChHTF9GTE9BVCwgMywgMjAsIGZhbHNlLCAodWludDMyX3QpdnR4LCAiQVRUUklCX3Bvc2l0aW9uIik7CisgICAgdmEuYWRkKEdMX0ZMT0FULCAyLCAyMCwgZmFsc2UsICh1aW50MzJfdCl0ZXgsICJBVFRSSUJfdGV4dHVyZTAiKTsKKyAgICB2YS5zZXR1cEdMMihtUlNDLCAmbVJTQy0+bVN0YXRlVmVydGV4QXJyYXksICZtUlNDLT5tU2hhZGVyQ2FjaGUpOworCisgICAgbUluZGV4QnVmZmVyLT51cGxvYWRDaGVjayhtUlNDKTsKKyAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1JbmRleEJ1ZmZlci0+Z2V0QnVmZmVyT2JqZWN0SUQoKSk7CisgICAgZ2xEcmF3RWxlbWVudHMoR0xfVFJJQU5HTEVTLCBtQ3VycmVudFF1YWRJbmRleCAqIDYsIEdMX1VOU0lHTkVEX1NIT1JULCAodWludDE2X3QgKikoMCkpOworCisgICAgLy8gUmVzZXQgdGhlIHN0YXRlCisgICAgbVJTQy0+c2V0VmVydGV4KChQcm9ncmFtVmVydGV4ICopdG1wVi5nZXQoKSk7CisgICAgbVJTQy0+c2V0UmFzdGVyKChQcm9ncmFtUmFzdGVyICopdG1wUi5nZXQoKSk7CisgICAgbVJTQy0+c2V0RnJhZ21lbnQoKFByb2dyYW1GcmFnbWVudCAqKXRtcEYuZ2V0KCkpOworICAgIG1SU0MtPnNldEZyYWdtZW50U3RvcmUoKFByb2dyYW1TdG9yZSAqKXRtcFBTLmdldCgpKTsKK30KKwordm9pZCBGb250U3RhdGU6OmFwcGVuZE1lc2hRdWFkKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTEsIGZsb2F0IHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTIsIGZsb2F0IHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTMsIGZsb2F0IHYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTQsIGZsb2F0IHY0KQoreworICAgIGNvbnN0IHVpbnQzMl90IHZlcnRzUGVyUXVhZCA9IDQ7CisgICAgY29uc3QgdWludDMyX3QgZmxvYXRzUGVyVmVydCA9IDU7CisgICAgZmxvYXQgKmN1cnJlbnRQb3MgPSBtVGV4dE1lc2hQdHIgKyBtQ3VycmVudFF1YWRJbmRleCAqIHZlcnRzUGVyUXVhZCAqIGZsb2F0c1BlclZlcnQ7CisKKyAgICAvLyBDdWxsIHRoaW5ncyB0aGF0IGFyZSBvZmYgdGhlIHNjcmVlbgorICAgIGZsb2F0IHdpZHRoID0gKGZsb2F0KW1SU0MtPmdldFdpZHRoKCk7CisgICAgZmxvYXQgaGVpZ2h0ID0gKGZsb2F0KW1SU0MtPmdldEhlaWdodCgpOworCisgICAgaWYoeDEgPiB3aWR0aCB8fCB5MSA8IDAuMGYgfHwgeDIgPCAwIHx8IHk0ID4gaGVpZ2h0KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKkxPR0UoIlYwIHg6ICVmIHk6ICVmIHo6ICVmIiwgeDEsIHkxLCB6MSk7CisgICAgTE9HRSgiVjEgeDogJWYgeTogJWYgejogJWYiLCB4MiwgeTIsIHoyKTsKKyAgICBMT0dFKCJWMiB4OiAlZiB5OiAlZiB6OiAlZiIsIHgzLCB5MywgejMpOworICAgIExPR0UoIlYzIHg6ICVmIHk6ICVmIHo6ICVmIiwgeDQsIHk0LCB6NCk7Ki8KKworICAgICgqY3VycmVudFBvcysrKSA9IHgxOworICAgICgqY3VycmVudFBvcysrKSA9IHkxOworICAgICgqY3VycmVudFBvcysrKSA9IHoxOworICAgICgqY3VycmVudFBvcysrKSA9IHUxOworICAgICgqY3VycmVudFBvcysrKSA9IHYxOworCisgICAgKCpjdXJyZW50UG9zKyspID0geDI7CisgICAgKCpjdXJyZW50UG9zKyspID0geTI7CisgICAgKCpjdXJyZW50UG9zKyspID0gejI7CisgICAgKCpjdXJyZW50UG9zKyspID0gdTI7CisgICAgKCpjdXJyZW50UG9zKyspID0gdjI7CisKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB4MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB5MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB6MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB1MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB2MzsKKworICAgICgqY3VycmVudFBvcysrKSA9IHg0OworICAgICgqY3VycmVudFBvcysrKSA9IHk0OworICAgICgqY3VycmVudFBvcysrKSA9IHo0OworICAgICgqY3VycmVudFBvcysrKSA9IHU0OworICAgICgqY3VycmVudFBvcysrKSA9IHY0OworCisgICAgbUN1cnJlbnRRdWFkSW5kZXggKys7CisKKyAgICBpZihtQ3VycmVudFF1YWRJbmRleCA9PSBtTWF4TnVtYmVyT2ZRdWFkcykgeworICAgICAgICBpc3N1ZURyYXdDb21tYW5kKCk7CisgICAgICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICB9Cit9CisKK3VpbnQzMl90IEZvbnRTdGF0ZTo6Z2V0UmVtYWluaW5nQ2FjaGVDYXBhY2l0eSgpIHsKKyAgICB1aW50MzJfdCByZW1haW5pbmdDYXBhY2l0eSA9IDA7CisgICAgdWludDMyX3QgdG90YWxQaXhlbHMgPSAwOworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSArKykgeworICAgICAgICAgcmVtYWluaW5nQ2FwYWNpdHkgKz0gKG1DYWNoZUxpbmVzW2ldLT5tTWF4V2lkdGggLSBtQ2FjaGVMaW5lc1tpXS0+bUN1cnJlbnRDb2wpOworICAgICAgICAgdG90YWxQaXhlbHMgKz0gbUNhY2hlTGluZXNbaV0tPm1NYXhXaWR0aDsKKyAgICB9CisgICAgcmVtYWluaW5nQ2FwYWNpdHkgPSAocmVtYWluaW5nQ2FwYWNpdHkgKiAxMDApIC8gdG90YWxQaXhlbHM7CisgICAgcmV0dXJuIHJlbWFpbmluZ0NhcGFjaXR5OworfQorCit2b2lkIEZvbnRTdGF0ZTo6cHJlY2FjaGVMYXRpbihGb250ICpmb250KSB7CisgICAgLy8gUmVtYWluaW5nIGNhcGFjaXR5IGlzIG1lYXN1cmVkIGluICUKKyAgICB1aW50MzJfdCByZW1haW5pbmdDYXBhY2l0eSA9IGdldFJlbWFpbmluZ0NhY2hlQ2FwYWNpdHkoKTsKKyAgICB1aW50MzJfdCBwcmVjYWNoZUlkeCA9IDA7CisgICAgd2hpbGUocmVtYWluaW5nQ2FwYWNpdHkgPiAyNSAmJiBwcmVjYWNoZUlkeCA8IG1MYXRpblByZWNhY2hlLnNpemUoKSkgeworICAgICAgICBmb250LT5nZXRDYWNoZWRVVEZDaGFyKChpbnQzMl90KW1MYXRpblByZWNhY2hlW3ByZWNhY2hlSWR4XSk7CisgICAgICAgIHJlbWFpbmluZ0NhcGFjaXR5ID0gZ2V0UmVtYWluaW5nQ2FjaGVDYXBhY2l0eSgpOworICAgICAgICBwcmVjYWNoZUlkeCArKzsKKyAgICB9Cit9CisKKwordm9pZCBGb250U3RhdGU6OnJlbmRlclRleHQoY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3QgbGVuLCBpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0SW5kZXgsIGludDMyX3QgbnVtR2x5cGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9udDo6UmVuZGVyTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9udDo6UmVjdCAqYm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYml0bWFwLCB1aW50MzJfdCBiaXRtYXBXLCB1aW50MzJfdCBiaXRtYXBIKQoreworICAgIGNoZWNrSW5pdCgpOworCisgICAgLy8gUmVuZGVyIGNvZGUgaGVyZQorICAgIEZvbnQgKmN1cnJlbnRGb250ID0gbVJTQy0+Z2V0Rm9udCgpOworICAgIGlmKCFjdXJyZW50Rm9udCkgeworICAgICAgICBpZighbURlZmF1bHQuZ2V0KCkpIHsKKyAgICAgICAgICAgIG1EZWZhdWx0LnNldChGb250OjpjcmVhdGUobVJTQywgIkRyb2lkU2Fucy50dGYiLCAxNiwgOTYpKTsKKyAgICAgICAgfQorICAgICAgICBjdXJyZW50Rm9udCA9IG1EZWZhdWx0LmdldCgpOworICAgIH0KKyAgICBpZighY3VycmVudEZvbnQpIHsKKyAgICAgICAgTE9HRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgYW55IGZvbnRzIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjdXJyZW50Rm9udC0+cmVuZGVyVVRGKHRleHQsIGxlbiwgeCwgeSwgc3RhcnRJbmRleCwgbnVtR2x5cGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwgYm91bmRzLCBiaXRtYXAsIGJpdG1hcFcsIGJpdG1hcEgpOworCisgICAgaWYobUN1cnJlbnRRdWFkSW5kZXggIT0gMCkgeworICAgICAgICBpc3N1ZURyYXdDb21tYW5kKCk7CisgICAgICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgRm9udFN0YXRlOjptZWFzdXJlVGV4dChjb25zdCBjaGFyICp0ZXh0LCB1aW50MzJfdCBsZW4sIEZvbnQ6OlJlY3QgKmJvdW5kcykgeworICAgIHJlbmRlclRleHQodGV4dCwgbGVuLCAwLCAwLCAwLCAtMSwgRm9udDo6TUVBU1VSRSwgYm91bmRzKTsKK30KKwordm9pZCBGb250U3RhdGU6OnNldEZvbnRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKSB7CisgICAgbUNvbnN0YW50cy5tRm9udENvbG9yWzBdID0gcjsKKyAgICBtQ29uc3RhbnRzLm1Gb250Q29sb3JbMV0gPSBnOworICAgIG1Db25zdGFudHMubUZvbnRDb2xvclsyXSA9IGI7CisgICAgbUNvbnN0YW50cy5tRm9udENvbG9yWzNdID0gYTsKKworICAgIG1Db25zdGFudHMubUdhbW1hID0gMS4wZjsKKyAgICBjb25zdCBmbG9hdCBsdW1pbmFuY2UgPSAociAqIDIuMGYgKyBnICogNS4wZiArIGIpIC8gOC4wZjsKKyAgICBpZiAobHVtaW5hbmNlIDw9IG1CbGFja1RocmVzaG9sZCkgeworICAgICAgICBtQ29uc3RhbnRzLm1HYW1tYSA9IG1CbGFja0dhbW1hOworICAgIH0gZWxzZSBpZiAobHVtaW5hbmNlID49IG1XaGl0ZVRocmVzaG9sZCkgeworICAgICAgICBtQ29uc3RhbnRzLm1HYW1tYSA9IG1XaGl0ZUdhbW1hOworICAgIH0KKyAgICBtQ29uc3RhbnRzRGlydHkgPSB0cnVlOworfQorCit2b2lkIEZvbnRTdGF0ZTo6Z2V0Rm9udENvbG9yKGZsb2F0ICpyLCBmbG9hdCAqZywgZmxvYXQgKmIsIGZsb2F0ICphKSBjb25zdCB7CisgICAgKnIgPSBtQ29uc3RhbnRzLm1Gb250Q29sb3JbMF07CisgICAgKmcgPSBtQ29uc3RhbnRzLm1Gb250Q29sb3JbMV07CisgICAgKmIgPSBtQ29uc3RhbnRzLm1Gb250Q29sb3JbMl07CisgICAgKmEgPSBtQ29uc3RhbnRzLm1Gb250Q29sb3JbM107Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpkZWluaXQoQ29udGV4dCAqcnNjKQoreworICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgbUZvbnRTaGFkZXJGQ29uc3RhbnQuY2xlYXIoKTsKKworICAgIG1JbmRleEJ1ZmZlci5jbGVhcigpOworICAgIG1WZXJ0ZXhBcnJheS5jbGVhcigpOworCisgICAgbUZvbnRTaGFkZXJGLmNsZWFyKCk7CisgICAgbUZvbnRTYW1wbGVyLmNsZWFyKCk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUuY2xlYXIoKTsKKworICAgIG1UZXh0VGV4dHVyZS5jbGVhcigpOworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSArKykgeworICAgICAgICBkZWxldGUgbUNhY2hlTGluZXNbaV07CisgICAgfQorICAgIG1DYWNoZUxpbmVzLmNsZWFyKCk7CisKKyAgICBtRGVmYXVsdC5jbGVhcigpOworCisgICAgVmVjdG9yPEZvbnQqPiBmb250c1RvRGVyZWZlcmVuY2UgPSBtQWN0aXZlRm9udHM7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgZm9udHNUb0RlcmVmZXJlbmNlLnNpemUoKTsgaSArKykgeworICAgICAgICBmb250c1RvRGVyZWZlcmVuY2VbaV0tPnplcm9Vc2VyUmVmKCk7CisgICAgfQorCisgICAgaWYobUxpYnJhcnkpIHsKKyAgICAgICAgRlRfRG9uZV9GcmVlVHlwZSggbUxpYnJhcnkgKTsKKyAgICAgICAgbUxpYnJhcnkgPSBOVUxMOworICAgIH0KK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK1JzRm9udCByc2lfRm9udENyZWF0ZUZyb21GaWxlKENvbnRleHQgKnJzYywgY2hhciBjb25zdCAqbmFtZSwgdWludDMyX3QgZm9udFNpemUsIHVpbnQzMl90IGRwaSkKK3sKKyAgICBGb250ICpuZXdGb250ID0gRm9udDo6Y3JlYXRlKHJzYywgbmFtZSwgZm9udFNpemUsIGRwaSk7CisgICAgaWYobmV3Rm9udCkgeworICAgICAgICBuZXdGb250LT5pbmNVc2VyUmVmKCk7CisgICAgfQorICAgIHJldHVybiBuZXdGb250OworfQorCit9IC8vIHJlbmRlcnNjcmlwdAorfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRm9udC5oIGIvbGlicy9ycy9yc0ZvbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDEyYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc0ZvbnQuaApAQCAtMCwwICsxLDI3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19GT05UX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19GT05UX0gKKworI2luY2x1ZGUgIlJlbmRlclNjcmlwdC5oIgorI2luY2x1ZGUgInJzU3RyZWFtLmgiCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKKy8vIEdhbW1hICg+PSAxLjAsIDw9IDEwLjApCisjZGVmaW5lIFBST1BFUlRZX1RFWFRfR0FNTUEgInJvLnRleHRfZ2FtbWEiCisjZGVmaW5lIFBST1BFUlRZX1RFWFRfQkxBQ0tfR0FNTUFfVEhSRVNIT0xEICJyby50ZXh0X2dhbW1hLmJsYWNrX3RocmVzaG9sZCIKKyNkZWZpbmUgUFJPUEVSVFlfVEVYVF9XSElURV9HQU1NQV9USFJFU0hPTEQgInJvLnRleHRfZ2FtbWEud2hpdGVfdGhyZXNob2xkIgorCisjZGVmaW5lIERFRkFVTFRfVEVYVF9HQU1NQSAxLjRmCisjZGVmaW5lIERFRkFVTFRfVEVYVF9CTEFDS19HQU1NQV9USFJFU0hPTEQgNjQKKyNkZWZpbmUgREVGQVVMVF9URVhUX1dISVRFX0dBTU1BX1RIUkVTSE9MRCAxOTIKKworY2xhc3MgRm9udFN0YXRlOworCitjbGFzcyBGb250IDogcHVibGljIE9iamVjdEJhc2UKK3sKK3B1YmxpYzoKKyAgICBlbnVtIFJlbmRlck1vZGUgeworICAgICAgICBGUkFNRUJVRkZFUiwKKyAgICAgICAgQklUTUFQLAorICAgICAgICBNRUFTVVJFLAorICAgIH07CisKKyAgICBzdHJ1Y3QgUmVjdCB7CisgICAgICAgIGludDMyX3QgbGVmdDsKKyAgICAgICAgaW50MzJfdCB0b3A7CisgICAgICAgIGludDMyX3QgcmlnaHQ7CisgICAgICAgIGludDMyX3QgYm90dG9tOworICAgICAgICB2b2lkIHNldChpbnQzMl90IGwsIGludDMyX3QgciwgaW50MzJfdCB0LCBpbnQzMl90IGIpIHsKKyAgICAgICAgICAgIGxlZnQgPSBsOworICAgICAgICAgICAgcmlnaHQgPSByOworICAgICAgICAgICAgdG9wID0gdDsKKyAgICAgICAgICAgIGJvdHRvbSA9IGI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgfkZvbnQoKTsKKworICAgIC8vIEN1cnJlbnRseSBmaWxlcyBkbyBub3QgZ2V0IHNlcmlhbGl6ZWQsCisgICAgLy8gYnV0IHdlIG5lZWQgdG8gaW5oZXJpdCBmcm9tIE9iamVjdEJhc2UgZm9yIHJlZiB0cmFja2luZworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdCB7CisgICAgfQorICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBSU19BM0RfQ0xBU1NfSURfVU5LTk9XTjsKKyAgICB9CisKKyAgICBzdGF0aWMgRm9udCAqIGNyZWF0ZShDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGZvbnRTaXplLCB1aW50MzJfdCBkcGkpOworCitwcm90ZWN0ZWQ6CisKKyAgICBmcmllbmQgY2xhc3MgRm9udFN0YXRlOworCisgICAgLy8gUG9pbnRlciB0byB0aGUgdXRmIGRhdGEsIGxlbmd0aCBvZiBkYXRhLCB3aGVyZSB0byBzdGFydCwgbnVtYmVyIG9mIGdseXBocyBvdCByZWFkCisgICAgLy8gKGVhY2ggZ2x5cGggbWF5IGJlIGxvbmdlciB0aGFuIGEgY2hhciBiZWNhdXNlIHdlIGFyZSBkZWFsaW5nIHdpdGggdXRmIGRhdGEpCisgICAgLy8gTGFzdCB0d28gdmFyaWFibGVzIGFyZSB0aGUgaW5pdGlhbCBwZW4gcG9zaXRpb24KKyAgICB2b2lkIHJlbmRlclVURihjb25zdCBjaGFyICp0ZXh0LCB1aW50MzJfdCBsZW4sIGludDMyX3QgeCwgaW50MzJfdCB5LAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0LCBpbnQzMl90IG51bUdseXBocywKKyAgICAgICAgICAgICAgICAgICBSZW5kZXJNb2RlIG1vZGUgPSBGUkFNRUJVRkZFUiwgUmVjdCAqYm91bmRzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICB1aW50OF90ICpiaXRtYXAgPSBOVUxMLCB1aW50MzJfdCBiaXRtYXBXID0gMCwgdWludDMyX3QgYml0bWFwSCA9IDApOworCisgICAgdm9pZCBpbnZhbGlkYXRlVGV4dHVyZUNhY2hlKCk7CisgICAgc3RydWN0IENhY2hlZEdseXBoSW5mbworICAgIHsKKyAgICAgICAgLy8gSGFzIHRoZSBjYWNoZSBiZWVuIGludmFsaWRhdGVkPworICAgICAgICBib29sIG1Jc1ZhbGlkOworICAgICAgICAvLyBMb2NhdGlvbiBvZiB0aGUgY2FjaGVkIGdseXBoIGluIHRoZSBiaXRtYXAKKyAgICAgICAgLy8gaW4gY2FzZSB3ZSBuZWVkIHRvIHJlc2l6ZSB0aGUgdGV4dHVyZQorICAgICAgICB1aW50MzJfdCBtQml0bWFwTWluWDsKKyAgICAgICAgdWludDMyX3QgbUJpdG1hcE1pblk7CisgICAgICAgIHVpbnQzMl90IG1CaXRtYXBXaWR0aDsKKyAgICAgICAgdWludDMyX3QgbUJpdG1hcEhlaWdodDsKKyAgICAgICAgLy8gQWxzbyBjYWNoZSB0ZXh0dXJlIGNvb3JkcyBmb3IgdGhlIHF1YWQKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1pblU7CisgICAgICAgIGZsb2F0IG1CaXRtYXBNaW5WOworICAgICAgICBmbG9hdCBtQml0bWFwTWF4VTsKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1heFY7CisgICAgICAgIC8vIE1pbmltaXplIGhvdyBtdWNoIHdlIGNhbGwgZnJlZXR5cGUKKyAgICAgICAgRlRfVUludCBtR2x5cGhJbmRleDsKKyAgICAgICAgRlRfVmVjdG9yIG1BZHZhbmNlOworICAgICAgICAvLyBWYWx1ZXMgYmVsb3cgY29udGFpbiBhIGdseXBoJ3Mgb3JpZ2luIGluIHRoZSBiaXRtYXAKKyAgICAgICAgRlRfSW50IG1CaXRtYXBMZWZ0OworICAgICAgICBGVF9JbnQgbUJpdG1hcFRvcDsKKyAgICB9OworCisgICAgU3RyaW5nOCBtRm9udE5hbWU7CisgICAgdWludDMyX3QgbUZvbnRTaXplOworICAgIHVpbnQzMl90IG1EcGk7CisKKyAgICBGb250KENvbnRleHQgKnJzYyk7CisgICAgYm9vbCBpbml0KGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGZvbnRTaXplLCB1aW50MzJfdCBkcGkpOworCisgICAgRlRfRmFjZSBtRmFjZTsKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKyAgICBib29sIG1IYXNLZXJuaW5nOworCisgICAgRGVmYXVsdEtleWVkVmVjdG9yPHVpbnQzMl90LCBDYWNoZWRHbHlwaEluZm8qID4gbUNhY2hlZEdseXBoczsKKyAgICBDYWNoZWRHbHlwaEluZm8qIGdldENhY2hlZFVURkNoYXIoaW50MzJfdCB1dGZDaGFyKTsKKworICAgIENhY2hlZEdseXBoSW5mbyAqY2FjaGVHbHlwaCh1aW50MzJfdCBnbHlwaCk7CisgICAgdm9pZCB1cGRhdGVHbHlwaENhY2hlKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgpOworICAgIHZvaWQgbWVhc3VyZUNhY2hlZEdseXBoKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgsIGludDMyX3QgeCwgaW50MzJfdCB5LCBSZWN0ICpib3VuZHMpOworICAgIHZvaWQgZHJhd0NhY2hlZEdseXBoKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgsIGludDMyX3QgeCwgaW50MzJfdCB5KTsKKyAgICB2b2lkIGRyYXdDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8gKmdseXBoLCBpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpiaXRtYXAsIHVpbnQzMl90IGJpdG1hcFcsIHVpbnQzMl90IGJpdG1hcEgpOworfTsKKworY2xhc3MgRm9udFN0YXRlCit7CitwdWJsaWM6CisgICAgRm9udFN0YXRlKCk7CisgICAgfkZvbnRTdGF0ZSgpOworCisgICAgdm9pZCBpbml0KENvbnRleHQgKnJzYyk7CisgICAgdm9pZCBkZWluaXQoQ29udGV4dCAqcnNjKTsKKworICAgIE9iamVjdEJhc2VSZWY8Rm9udD4gbURlZmF1bHQ7CisgICAgT2JqZWN0QmFzZVJlZjxGb250PiBtTGFzdDsKKworICAgIHZvaWQgcmVuZGVyVGV4dChjb25zdCBjaGFyICp0ZXh0LCB1aW50MzJfdCBsZW4sIGludDMyX3QgeCwgaW50MzJfdCB5LAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdGFydEluZGV4ID0gMCwgaW50IG51bUdseXBocyA9IC0xLAorICAgICAgICAgICAgICAgICAgICBGb250OjpSZW5kZXJNb2RlIG1vZGUgPSBGb250OjpGUkFNRUJVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgRm9udDo6UmVjdCAqYm91bmRzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYml0bWFwID0gTlVMTCwgdWludDMyX3QgYml0bWFwVyA9IDAsIHVpbnQzMl90IGJpdG1hcEggPSAwKTsKKworICAgIHZvaWQgbWVhc3VyZVRleHQoY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3QgbGVuLCBGb250OjpSZWN0ICpib3VuZHMpOworCisgICAgdm9pZCBzZXRGb250Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSk7CisgICAgdm9pZCBnZXRGb250Q29sb3IoZmxvYXQgKnIsIGZsb2F0ICpnLCBmbG9hdCAqYiwgZmxvYXQgKmEpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisKKyAgICBmcmllbmQgY2xhc3MgRm9udDsKKworICAgIHN0cnVjdCBDYWNoZVRleHR1cmVMaW5lCisgICAgeworICAgICAgICB1aW50MzJfdCBtTWF4SGVpZ2h0OworICAgICAgICB1aW50MzJfdCBtTWF4V2lkdGg7CisgICAgICAgIHVpbnQzMl90IG1DdXJyZW50Um93OworICAgICAgICB1aW50MzJfdCBtQ3VycmVudENvbDsKKyAgICAgICAgYm9vbCBtRGlydHk7CisKKyAgICAgICAgQ2FjaGVUZXh0dXJlTGluZSh1aW50MzJfdCBtYXhIZWlnaHQsIHVpbnQzMl90IG1heFdpZHRoLCB1aW50MzJfdCBjdXJyZW50Um93LCB1aW50MzJfdCBjdXJyZW50Q29sKSA6CisgICAgICAgICAgICBtTWF4SGVpZ2h0KG1heEhlaWdodCksIG1NYXhXaWR0aChtYXhXaWR0aCksIG1DdXJyZW50Um93KGN1cnJlbnRSb3cpLCBtQ3VycmVudENvbChjdXJyZW50Q29sKSwKKyAgICAgICAgICAgIG1EaXJ0eShmYWxzZSkgIHsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgZml0Qml0bWFwKEZUX0JpdG1hcCAqYml0bWFwLCB1aW50MzJfdCAqcmV0T3JpZ2luWCwgdWludDMyX3QgKnJldE9yaWdpblkpIHsKKyAgICAgICAgICAgIGlmKCh1aW50MzJfdCliaXRtYXAtPnJvd3MgPiBtTWF4SGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihtQ3VycmVudENvbCArICh1aW50MzJfdCliaXRtYXAtPndpZHRoIDwgbU1heFdpZHRoKSB7CisgICAgICAgICAgICAgICAqcmV0T3JpZ2luWCA9IG1DdXJyZW50Q29sOworICAgICAgICAgICAgICAgKnJldE9yaWdpblkgPSBtQ3VycmVudFJvdzsKKyAgICAgICAgICAgICAgIG1DdXJyZW50Q29sICs9IGJpdG1hcC0+d2lkdGg7CisgICAgICAgICAgICAgICBtRGlydHkgPSB0cnVlOworICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBWZWN0b3I8Q2FjaGVUZXh0dXJlTGluZSo+IG1DYWNoZUxpbmVzOworICAgIHVpbnQzMl90IGdldFJlbWFpbmluZ0NhY2hlQ2FwYWNpdHkoKTsKKworICAgIHZvaWQgcHJlY2FjaGVMYXRpbihGb250ICpmb250KTsKKyAgICBTdHJpbmc4IG1MYXRpblByZWNhY2hlOworCisgICAgQ29udGV4dCAqbVJTQzsKKworICAgIHN0cnVjdCB7CisgICAgICAgIGZsb2F0IG1Gb250Q29sb3JbNF07CisgICAgICAgIGZsb2F0IG1HYW1tYTsKKyAgICB9IG1Db25zdGFudHM7CisgICAgYm9vbCBtQ29uc3RhbnRzRGlydHk7CisKKyAgICBmbG9hdCBtQmxhY2tHYW1tYTsKKyAgICBmbG9hdCBtV2hpdGVHYW1tYTsKKworICAgIGZsb2F0IG1CbGFja1RocmVzaG9sZDsKKyAgICBmbG9hdCBtV2hpdGVUaHJlc2hvbGQ7CisKKyAgICAvLyBGcmVlIHR5cGUgbGlicmFyeSwgd2Ugb25seSBuZWVkIG9uZSBjb3B5CisgICAgRlRfTGlicmFyeSBtTGlicmFyeTsKKyAgICBGVF9MaWJyYXJ5IGdldExpYigpOworICAgIFZlY3RvcjxGb250Kj4gbUFjdGl2ZUZvbnRzOworCisgICAgLy8gUmVuZGVyIHN0YXRlIGZvciB0aGUgZm9udAorICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbUZvbnRTaGFkZXJGQ29uc3RhbnQ7CisgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnQ+IG1Gb250U2hhZGVyRjsKKyAgICBPYmplY3RCYXNlUmVmPFNhbXBsZXI+IG1Gb250U2FtcGxlcjsKKyAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1TdG9yZT4gbUZvbnRQcm9ncmFtU3RvcmU7CisgICAgdm9pZCBpbml0UmVuZGVyU3RhdGUoKTsKKworICAgIC8vIFRleHR1cmUgdG8gY2FjaGUgZ2x5cGggYml0bWFwcworICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbVRleHRUZXh0dXJlOworICAgIHZvaWQgaW5pdFRleHRUZXh0dXJlKCk7CisgICAgY29uc3QgdWludDhfdCogZ2V0VGV4dFRleHR1cmVEYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKHVpbnQ4X3QqKW1UZXh0VGV4dHVyZS0+Z2V0UHRyKCk7CisgICAgfQorCisgICAgYm9vbCBjYWNoZUJpdG1hcChGVF9CaXRtYXAgKmJpdG1hcCwgdWludDMyX3QgKnJldE9yaWdpblgsIHVpbnQzMl90ICpyZXRPcmlnaW5ZKTsKKyAgICBjb25zdCBUeXBlKiBnZXRDYWNoZVRleHR1cmVUeXBlKCkgeworICAgICAgICByZXR1cm4gbVRleHRUZXh0dXJlLT5nZXRUeXBlKCk7CisgICAgfQorCisgICAgdm9pZCBmbHVzaEFsbEFuZEludmFsaWRhdGUoKTsKKworICAgIC8vIFBvaW50ZXIgdG8gdmVydGV4IGRhdGEgdG8gc3BlZWQgdXAgZnJhbWUgdG8gZnJhbWUgd29yaworICAgIGZsb2F0ICptVGV4dE1lc2hQdHI7CisgICAgdWludDMyX3QgbUN1cnJlbnRRdWFkSW5kZXg7CisgICAgdWludDMyX3QgbU1heE51bWJlck9mUXVhZHM7CisKKyAgICB2b2lkIGluaXRWZXJ0ZXhBcnJheUJ1ZmZlcnMoKTsKKyAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1JbmRleEJ1ZmZlcjsKKyAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1WZXJ0ZXhBcnJheTsKKworCisgICAgYm9vbCBtSW5pdGlhbGl6ZWQ7CisKKyAgICB2b2lkIGNoZWNrSW5pdCgpOworCisgICAgdm9pZCBpc3N1ZURyYXdDb21tYW5kKCk7CisKKyAgICB2b2lkIGFwcGVuZE1lc2hRdWFkKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUxLCBmbG9hdCB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTIsIGZsb2F0IHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MywgZmxvYXQgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHU0LCBmbG9hdCB2NCk7CisKK307CisKKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNIYW5kY29kZS5oIGIvbGlicy9ycy9yc0hhbmRjb2RlLmgKaW5kZXggODAwZWRkZC4uYzAyZmQ0MiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0hhbmRjb2RlLmgKKysrIGIvbGlicy9ycy9yc0hhbmRjb2RlLmgKQEAgLTEsNiArMSw1NyBAQAogCiAjZGVmaW5lIERBVEFfU1lOQ19TSVpFIDEwMjQKIAorc3RhdGljIGlubGluZSB2b2lkIHJzSENBUElfQ29udGV4dEZpbmlzaCAoUnNDb250ZXh0IHJzYykKK3sKKyAgICBUaHJlYWRJTyAqaW8gPSAmKChDb250ZXh0ICopcnNjKS0+bUlPOworICAgIHVpbnQzMl90IHNpemUgPSBzaXplb2YoUlNfQ01EX0NvbnRleHRGaW5pc2gpOworICAgIFJTX0NNRF9Db250ZXh0RmluaXNoICpjbWQgPSBzdGF0aWNfY2FzdDxSU19DTURfQ29udGV4dEZpbmlzaCAqPihpby0+bVRvQ29yZS5yZXNlcnZlKHNpemUpKTsKKyAgICBpby0+bVRvQ29yZS5jb21taXRTeW5jKFJTX0NNRF9JRF9Db250ZXh0RmluaXNoLCBzaXplKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJzSENBUElfU2NyaXB0SW52b2tlViAoUnNDb250ZXh0IHJzYywgUnNTY3JpcHQgdmEsIHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKiBkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpCit7CisgICAgVGhyZWFkSU8gKmlvID0gJigoQ29udGV4dCAqKXJzYyktPm1JTzsKKyAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKFJTX0NNRF9TY3JpcHRJbnZva2VWKTsKKyAgICBpZiAoc2l6ZUJ5dGVzIDwgREFUQV9TWU5DX1NJWkUpIHsKKyAgICAgICAgc2l6ZSArPSAoc2l6ZUJ5dGVzICsgMykgJiB+MzsKKyAgICB9CisgICAgUlNfQ01EX1NjcmlwdEludm9rZVYgKmNtZCA9IHN0YXRpY19jYXN0PFJTX0NNRF9TY3JpcHRJbnZva2VWICo+KGlvLT5tVG9Db3JlLnJlc2VydmUoc2l6ZSkpOworICAgIGNtZC0+cyA9IHZhOworICAgIGNtZC0+c2xvdCA9IHNsb3Q7CisgICAgY21kLT5kYXRhTGVuID0gc2l6ZUJ5dGVzOworICAgIGNtZC0+ZGF0YSA9IGRhdGE7CisgICAgaWYgKHNpemVCeXRlcyA8IERBVEFfU1lOQ19TSVpFKSB7CisgICAgICAgIGNtZC0+ZGF0YSA9ICh2b2lkICopKGNtZCsxKTsKKyAgICAgICAgbWVtY3B5KGNtZCsxLCBkYXRhLCBzaXplQnl0ZXMpOworICAgICAgICBpby0+bVRvQ29yZS5jb21taXQoUlNfQ01EX0lEX1NjcmlwdEludm9rZVYsIHNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlvLT5tVG9Db3JlLmNvbW1pdFN5bmMoUlNfQ01EX0lEX1NjcmlwdEludm9rZVYsIHNpemUpOworICAgIH0KK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgcnNIQ0FQSV9TY3JpcHRTZXRWYXJWIChSc0NvbnRleHQgcnNjLCBSc1NjcmlwdCB2YSwgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqIGRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKK3sKKyAgICBUaHJlYWRJTyAqaW8gPSAmKChDb250ZXh0ICopcnNjKS0+bUlPOworICAgIHVpbnQzMl90IHNpemUgPSBzaXplb2YoUlNfQ01EX1NjcmlwdFNldFZhclYpOworICAgIGlmIChzaXplQnl0ZXMgPCBEQVRBX1NZTkNfU0laRSkgeworICAgICAgICBzaXplICs9IChzaXplQnl0ZXMgKyAzKSAmIH4zOworICAgIH0KKyAgICBSU19DTURfU2NyaXB0U2V0VmFyViAqY21kID0gc3RhdGljX2Nhc3Q8UlNfQ01EX1NjcmlwdFNldFZhclYgKj4oaW8tPm1Ub0NvcmUucmVzZXJ2ZShzaXplKSk7CisgICAgY21kLT5zID0gdmE7CisgICAgY21kLT5zbG90ID0gc2xvdDsKKyAgICBjbWQtPmRhdGFMZW4gPSBzaXplQnl0ZXM7CisgICAgY21kLT5kYXRhID0gZGF0YTsKKyAgICBpZiAoc2l6ZUJ5dGVzIDwgREFUQV9TWU5DX1NJWkUpIHsKKyAgICAgICAgY21kLT5kYXRhID0gKHZvaWQgKikoY21kKzEpOworICAgICAgICBtZW1jcHkoY21kKzEsIGRhdGEsIHNpemVCeXRlcyk7CisgICAgICAgIGlvLT5tVG9Db3JlLmNvbW1pdChSU19DTURfSURfU2NyaXB0U2V0VmFyViwgc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW8tPm1Ub0NvcmUuY29tbWl0U3luYyhSU19DTURfSURfU2NyaXB0U2V0VmFyViwgc2l6ZSk7CisgICAgfQorfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgcnNIQ0FQSV9BbGxvY2F0aW9uRGF0YSAoUnNDb250ZXh0IHJzYywgUnNBbGxvY2F0aW9uIHZhLCBjb25zdCB2b2lkICogZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQogewogICAgIFRocmVhZElPICppbyA9ICYoKENvbnRleHQgKilyc2MpLT5tSU87CkBAIC00NSwzICs5NiwyNiBAQAogCiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCByc0hDQVBJX0FsbG9jYXRpb24xRFN1YkVsZW1lbnREYXRhIChSc0NvbnRleHQgcnNjLCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHgsIGNvbnN0IHZvaWQgKiBkYXRhLCB1aW50MzJfdCBjb21wX29mZnNldCwgdWludDMyX3Qgc2l6ZUJ5dGVzKQoreworICAgIFRocmVhZElPICppbyA9ICYoKENvbnRleHQgKilyc2MpLT5tSU87CisgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihSU19DTURfQWxsb2NhdGlvbjFEU3ViRWxlbWVudERhdGEpOworICAgIGlmIChzaXplQnl0ZXMgPCBEQVRBX1NZTkNfU0laRSkgeworICAgICAgICBzaXplICs9IChzaXplQnl0ZXMgKyAzKSAmIH4zOworICAgIH0KKyAgICBSU19DTURfQWxsb2NhdGlvbjFEU3ViRWxlbWVudERhdGEgKmNtZCA9IHN0YXRpY19jYXN0PFJTX0NNRF9BbGxvY2F0aW9uMURTdWJFbGVtZW50RGF0YSAqPihpby0+bVRvQ29yZS5yZXNlcnZlKHNpemUpKTsKKyAgICBjbWQtPnZhID0gdmE7CisgICAgY21kLT54ID0geDsKKyAgICBjbWQtPmRhdGEgPSBkYXRhOworICAgIGNtZC0+Y29tcF9vZmZzZXQgPSBjb21wX29mZnNldDsKKyAgICBjbWQtPmJ5dGVzID0gc2l6ZUJ5dGVzOworICAgIGlmIChzaXplQnl0ZXMgPCBEQVRBX1NZTkNfU0laRSkgeworICAgICAgICBjbWQtPmRhdGEgPSAodm9pZCAqKShjbWQrMSk7CisgICAgICAgIG1lbWNweShjbWQrMSwgZGF0YSwgc2l6ZUJ5dGVzKTsKKyAgICAgICAgaW8tPm1Ub0NvcmUuY29tbWl0KFJTX0NNRF9JRF9BbGxvY2F0aW9uMURTdWJFbGVtZW50RGF0YSwgc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW8tPm1Ub0NvcmUuY29tbWl0U3luYyhSU19DTURfSURfQWxsb2NhdGlvbjFEU3ViRWxlbWVudERhdGEsIHNpemUpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTGlnaHQuY3BwIGIvbGlicy9ycy9yc0xpZ2h0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyY2YzZS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzTGlnaHQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAicnNDb250ZXh0LmgiCi0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKLQotCi1MaWdodDo6TGlnaHQoQ29udGV4dCAqcnNjLCBib29sIGlzTG9jYWwsIGJvb2wgaXNNb25vKSA6IE9iamVjdEJhc2UocnNjKQotewotICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKLSAgICBtQWxsb2NMaW5lID0gX19MSU5FX187Ci0gICAgbUlzTG9jYWwgPSBpc0xvY2FsOwotICAgIG1Jc01vbm8gPSBpc01vbm87Ci0KLSAgICBtUG9zaXRpb25bMF0gPSAwOwotICAgIG1Qb3NpdGlvblsxXSA9IDA7Ci0gICAgbVBvc2l0aW9uWzJdID0gMTsKLSAgICBtUG9zaXRpb25bM10gPSAwOwotCi0gICAgbUNvbG9yWzBdID0gMS5mOwotICAgIG1Db2xvclsxXSA9IDEuZjsKLSAgICBtQ29sb3JbMl0gPSAxLmY7Ci0gICAgbUNvbG9yWzNdID0gMS5mOwotfQotCi1MaWdodDo6fkxpZ2h0KCkKLXsKLX0KLQotdm9pZCBMaWdodDo6c2V0UG9zaXRpb24oZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBtUG9zaXRpb25bMF0gPSB4OwotICAgIG1Qb3NpdGlvblsxXSA9IHk7Ci0gICAgbVBvc2l0aW9uWzJdID0gejsKLX0KLQotdm9pZCBMaWdodDo6c2V0Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYikKLXsKLSAgICBtQ29sb3JbMF0gPSByOwotICAgIG1Db2xvclsxXSA9IGc7Ci0gICAgbUNvbG9yWzJdID0gYjsKLX0KLQotdm9pZCBMaWdodDo6c2V0dXBHTCh1aW50MzJfdCBudW0pIGNvbnN0Ci17Ci0gICAgZ2xMaWdodGZ2KEdMX0xJR0hUMCArIG51bSwgR0xfRElGRlVTRSwgbUNvbG9yKTsKLSAgICBnbExpZ2h0ZnYoR0xfTElHSFQwICsgbnVtLCBHTF9TUEVDVUxBUiwgbUNvbG9yKTsKLSAgICBnbExpZ2h0ZnYoR0xfTElHSFQwICsgbnVtLCBHTF9QT1NJVElPTiwgbVBvc2l0aW9uKTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotTGlnaHRTdGF0ZTo6TGlnaHRTdGF0ZSgpCi17Ci0gICAgY2xlYXIoKTsKLX0KLQotTGlnaHRTdGF0ZTo6fkxpZ2h0U3RhdGUoKQotewotfQotCi12b2lkIExpZ2h0U3RhdGU6OmNsZWFyKCkKLXsKLSAgICBtSXNMb2NhbCA9IGZhbHNlOwotICAgIG1Jc01vbm8gPSBmYWxzZTsKLX0KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKLQotdm9pZCByc2lfTGlnaHRCZWdpbihDb250ZXh0ICpyc2MpCi17Ci0gICAgcnNjLT5tU3RhdGVMaWdodC5jbGVhcigpOwotfQotCi12b2lkIHJzaV9MaWdodFNldExvY2FsKENvbnRleHQgKnJzYywgYm9vbCBpc0xvY2FsKQotewotICAgIHJzYy0+bVN0YXRlTGlnaHQubUlzTG9jYWwgPSBpc0xvY2FsOwotfQotCi12b2lkIHJzaV9MaWdodFNldE1vbm9jaHJvbWF0aWMoQ29udGV4dCAqcnNjLCBib29sIGlzTW9ubykKLXsKLSAgICByc2MtPm1TdGF0ZUxpZ2h0Lm1Jc01vbm8gPSBpc01vbm87Ci19Ci0KLVJzTGlnaHQgcnNpX0xpZ2h0Q3JlYXRlKENvbnRleHQgKnJzYykKLXsKLSAgICBMaWdodCAqbCA9IG5ldyBMaWdodChyc2MsIHJzYy0+bVN0YXRlTGlnaHQubUlzTG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcnNjLT5tU3RhdGVMaWdodC5tSXNNb25vKTsKLSAgICBsLT5pbmNVc2VyUmVmKCk7Ci0gICAgcmV0dXJuIGw7Ci19Ci0KLXZvaWQgcnNpX0xpZ2h0U2V0Q29sb3IoQ29udGV4dCAqcnNjLCBSc0xpZ2h0IHZsLCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKQotewotICAgIExpZ2h0ICpsID0gc3RhdGljX2Nhc3Q8TGlnaHQgKj4odmwpOwotICAgIGwtPnNldENvbG9yKHIsIGcsIGIpOwotfQotCi12b2lkIHJzaV9MaWdodFNldFBvc2l0aW9uKENvbnRleHQgKnJzYywgUnNMaWdodCB2bCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBMaWdodCAqbCA9IHN0YXRpY19jYXN0PExpZ2h0ICo+KHZsKTsKLSAgICBsLT5zZXRQb3NpdGlvbih4LCB5LCB6KTsKLX0KLQotCi0KLX0KLX0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNMaWdodC5oIGIvbGlicy9ycy9yc0xpZ2h0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Nzk2ZTYuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9yc0xpZ2h0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0xJR0hUX0gKLSNkZWZpbmUgQU5EUk9JRF9MSUdIVF9ICi0KLQotI2luY2x1ZGUgInJzT2JqZWN0QmFzZS5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi0KLS8vIEFuIGVsZW1lbnQgaXMgYSBncm91cCBvZiBDb21wb25lbnRzIHRoYXQgb2NjdXBpZXMgb25lIGNlbGwgaW4gYSBzdHJ1Y3R1cmUuCi1jbGFzcyBMaWdodCA6IHB1YmxpYyBPYmplY3RCYXNlCi17Ci1wdWJsaWM6Ci0gICAgTGlnaHQoQ29udGV4dCAqLCBib29sIGlzTG9jYWwsIGJvb2wgaXNNb25vKTsKLSAgICB2aXJ0dWFsIH5MaWdodCgpOwotCi0gICAgLy8gVmFsdWVzLCBtdXRhYmxlIGFmdGVyIGNyZWF0aW9uLgotICAgIHZvaWQgc2V0UG9zaXRpb24oZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeik7Ci0gICAgdm9pZCBzZXRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKTsKLQotICAgIHZvaWQgc2V0dXBHTCh1aW50MzJfdCBudW0pIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gICAgZmxvYXQgbUNvbG9yWzRdOwotICAgIGZsb2F0IG1Qb3NpdGlvbls0XTsKLSAgICBib29sIG1Jc0xvY2FsOwotICAgIGJvb2wgbUlzTW9ubzsKLX07Ci0KLQotY2xhc3MgTGlnaHRTdGF0ZSB7Ci1wdWJsaWM6Ci0gICAgTGlnaHRTdGF0ZSgpOwotICAgIH5MaWdodFN0YXRlKCk7Ci0KLSAgICB2b2lkIGNsZWFyKCk7Ci0KLSAgICBib29sIG1Jc01vbm87Ci0gICAgYm9vbCBtSXNMb2NhbDsKLX07Ci0KLQotfQotfQotI2VuZGlmIC8vQU5EUk9JRF9MSUdIVF9ICi0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uY3BwIGIvbGlicy9ycy9yc0xvY2tsZXNzRmlmby5jcHAKaW5kZXggYzc5NjUyMC4uMDE5ZWE3MiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0xvY2tsZXNzRmlmby5jcHAKKysrIGIvbGlicy9ycy9yc0xvY2tsZXNzRmlmby5jcHAKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlICJyc0xvY2tsZXNzRmlmby5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKIAogTG9ja2xlc3NDb21tYW5kRmlmbzo6TG9ja2xlc3NDb21tYW5kRmlmbygpCiB7CkBAIC0xMjgsMTUgKzEyOCwxOSBAQAogICAgIC8vZHVtcFN0YXRlKCJmbHVzaCAyIik7CiB9CiAKK3ZvaWQgTG9ja2xlc3NDb21tYW5kRmlmbzo6d2FpdCgpCit7CisgICAgd2hpbGUoaXNFbXB0eSgpICYmICFtSW5TaHV0ZG93bikgeworICAgICAgICBtU2lnbmFsVG9Db250cm9sLnNldCgpOworICAgICAgICBtU2lnbmFsVG9Xb3JrZXIud2FpdCgpOworICAgIH0KK30KKwogY29uc3Qgdm9pZCAqIExvY2tsZXNzQ29tbWFuZEZpZm86OmdldCh1aW50MzJfdCAqY29tbWFuZCwgdWludDMyX3QgKmJ5dGVzRGF0YSkKIHsKICAgICB3aGlsZSgxKSB7CiAgICAgICAgIC8vZHVtcFN0YXRlKCJnZXQiKTsKLSAgICAgICAgd2hpbGUoaXNFbXB0eSgpICYmICFtSW5TaHV0ZG93bikgewotICAgICAgICAgICAgbVNpZ25hbFRvQ29udHJvbC5zZXQoKTsKLSAgICAgICAgICAgIG1TaWduYWxUb1dvcmtlci53YWl0KCk7Ci0gICAgICAgIH0KLQorICAgICAgICB3YWl0KCk7CiAgICAgICAgIGlmIChtSW5TaHV0ZG93bikgewogICAgICAgICAgICAgKmNvbW1hbmQgPSAwOwogICAgICAgICAgICAgKmJ5dGVzRGF0YSA9IDA7CkBAIC0xNjUsNiArMTY5LDMwIEBACiAgICAgLy9kdW1wU3RhdGUoIm5leHQiKTsKIH0KIAorYm9vbCBMb2NrbGVzc0NvbW1hbmRGaWZvOjptYWtlU3BhY2VOb25CbG9ja2luZyh1aW50MzJfdCBieXRlcykKK3sKKyAgICAvL2R1bXBTdGF0ZSgibWFrZSBzcGFjZSBub24tYmxvY2tpbmciKTsKKyAgICBpZiAoKG1QdXQrYnl0ZXMpID4gbUVuZCkgeworICAgICAgICAvLyBOZWVkIHRvIGxvb3AgcmVnYXJkbGVzcyBvZiB3aGVyZSBnZXQgaXMuCisgICAgICAgIGlmKChtR2V0ID4gbVB1dCkgJiYgKG1CdWZmZXIrNCA+PSBtR2V0KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gVG9zcyBpbiBhIHJlc2V0IHRoZW4gdGhlIG5vcm1hbCB3YWl0IGZvciBzcGFjZSB3aWxsIGRvIHRoZSByZXN0LgorICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQxNl90ICo+KG1QdXQpWzBdID0gMDsKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCAqPihtUHV0KVsxXSA9IDA7CisgICAgICAgIG1QdXQgPSBtQnVmZmVyOworICAgICAgICBtU2lnbmFsVG9Xb3JrZXIuc2V0KCk7CisgICAgfQorCisgICAgLy8gaXQgd2lsbCBmaXQgaGVyZSBzbyB3ZSBqdXN0IG5lZWQgdG8gd2FpdCBmb3Igc3BhY2UuCisgICAgaWYoZ2V0RnJlZVNwYWNlKCkgPCBieXRlcykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKIHZvaWQgTG9ja2xlc3NDb21tYW5kRmlmbzo6bWFrZVNwYWNlKHVpbnQzMl90IGJ5dGVzKQogewogICAgIC8vZHVtcFN0YXRlKCJtYWtlIHNwYWNlIik7CkBAIC0xNzgsNiArMjA2LDcgQEAKICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCAqPihtUHV0KVswXSA9IDA7CiAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QgKj4obVB1dClbMV0gPSAwOwogICAgICAgICBtUHV0ID0gbUJ1ZmZlcjsKKyAgICAgICAgbVNpZ25hbFRvV29ya2VyLnNldCgpOwogICAgIH0KIAogICAgIC8vIGl0IHdpbGwgZml0IGhlcmUgc28gd2UganVzdCBuZWVkIHRvIHdhaXQgZm9yIHNwYWNlLgpAQCAtMTg5LDgyICsyMTgsNiBAQAogCiB2b2lkIExvY2tsZXNzQ29tbWFuZEZpZm86OmR1bXBTdGF0ZShjb25zdCBjaGFyICpzKSBjb25zdAogewotICAgIExPR1YoIiVzICBwdXQgJXAsIGdldCAlcCwgIGJ1ZiAlcCwgIGVuZCAlcCIsIHMsIG1QdXQsIG1HZXQsIG1CdWZmZXIsIG1FbmQpOwotfQotCi1Mb2NrbGVzc0NvbW1hbmRGaWZvOjpTaWduYWw6OlNpZ25hbCgpCi17Ci0gICAgbVNldCA9IHRydWU7Ci19Ci0KLUxvY2tsZXNzQ29tbWFuZEZpZm86OlNpZ25hbDo6flNpZ25hbCgpCi17Ci0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtTXV0ZXgpOwotICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZtQ29uZGl0aW9uKTsKLX0KLQotYm9vbCBMb2NrbGVzc0NvbW1hbmRGaWZvOjpTaWduYWw6OmluaXQoKQotewotICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2luaXQoJm1NdXRleCwgTlVMTCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0ZpZm8gbXV0ZXggaW5pdCBmYWlsdXJlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfaW5pdCgmbUNvbmRpdGlvbiwgTlVMTCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0ZpZm8gY29uZGl0aW9uIGluaXQgZmFpbHVyZSIpOwotICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1NdXRleCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBMb2NrbGVzc0NvbW1hbmRGaWZvOjpTaWduYWw6OnNldCgpCi17Ci0gICAgaW50IHN0YXR1czsKLQotICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIGxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1TZXQgPSB0cnVlOwotCi0gICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3NpZ25hbCgmbUNvbmRpdGlvbik7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSBvbiBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7Ci0gICAgfQotCi0gICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSB1bmxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICB9Ci19Ci0KLXZvaWQgTG9ja2xlc3NDb21tYW5kRmlmbzo6U2lnbmFsOjp3YWl0KCkKLXsKLSAgICBpbnQgc3RhdHVzOwotCi0gICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgbG9ja2luZyBmb3IgY29uZGl0aW9uLiIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIW1TZXQpIHsKLSAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3dhaXQoJm1Db25kaXRpb24sICZtTXV0ZXgpOwotICAgICAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSB3YWl0aW5nIG9uIGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1TZXQgPSBmYWxzZTsKLQotICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgdW5sb2NraW5nIGZvciBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICB9CisgICAgTE9HVigiJXMgJXAgIHB1dCAlcCwgZ2V0ICVwLCAgYnVmICVwLCAgZW5kICVwIiwgcywgdGhpcywgbVB1dCwgbUdldCwgbUJ1ZmZlciwgbUVuZCk7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uaCBiL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uaAppbmRleCBkMGE0MzU2Li5iOGNlZWVkIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTG9ja2xlc3NGaWZvLmgKKysrIGIvbGlicy9ycy9yc0xvY2tsZXNzRmlmby5oCkBAIC0xOSw4ICsxOSwxMCBAQAogCiAKICNpbmNsdWRlICJyc1V0aWxzLmgiCisjaW5jbHVkZSAicnNTaWduYWwuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKIAogLy8gQSBzaW1wbGUgRklGTyB0byBiZSB1c2VkIGFzIGEgcHJvZHVjZXIgLyBjb25zdW1lciBiZXR3ZWVuIHR3bwpAQCAtMzcsMjQgKzM5LDcgQEAKICAgICBMb2NrbGVzc0NvbW1hbmRGaWZvKCk7CiAgICAgfkxvY2tsZXNzQ29tbWFuZEZpZm8oKTsKIAotCiBwcm90ZWN0ZWQ6Ci0gICAgY2xhc3MgU2lnbmFsIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFNpZ25hbCgpOwotICAgICAgICB+U2lnbmFsKCk7Ci0KLSAgICAgICAgYm9vbCBpbml0KCk7Ci0KLSAgICAgICAgdm9pZCBzZXQoKTsKLSAgICAgICAgdm9pZCB3YWl0KCk7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIGJvb2wgbVNldDsKLSAgICAgICAgcHRocmVhZF9tdXRleF90IG1NdXRleDsKLSAgICAgICAgcHRocmVhZF9jb25kX3QgbUNvbmRpdGlvbjsKLSAgICB9OwotCiAgICAgdWludDhfdCAqIHZvbGF0aWxlIG1QdXQ7CiAgICAgdWludDhfdCAqIHZvbGF0aWxlIG1HZXQ7CiAgICAgdWludDhfdCAqIG1CdWZmZXI7CkBAIC02NSwxOCArNTAsMTkgQEAKICAgICBTaWduYWwgbVNpZ25hbFRvV29ya2VyOwogICAgIFNpZ25hbCBtU2lnbmFsVG9Db250cm9sOwogCi0KLQogcHVibGljOgogICAgIHZvaWQgKiByZXNlcnZlKHVpbnQzMl90IGJ5dGVzKTsKICAgICB2b2lkIGNvbW1pdCh1aW50MzJfdCBjb21tYW5kLCB1aW50MzJfdCBieXRlcyk7CiAgICAgdm9pZCBjb21taXRTeW5jKHVpbnQzMl90IGNvbW1hbmQsIHVpbnQzMl90IGJ5dGVzKTsKIAogICAgIHZvaWQgZmx1c2goKTsKKyAgICB2b2lkIHdhaXQoKTsKKwogICAgIGNvbnN0IHZvaWQgKiBnZXQodWludDMyX3QgKmNvbW1hbmQsIHVpbnQzMl90ICpieXRlc0RhdGEpOwogICAgIHZvaWQgbmV4dCgpOwogCiAgICAgdm9pZCBtYWtlU3BhY2UodWludDMyX3QgYnl0ZXMpOworICAgIGJvb2wgbWFrZVNwYWNlTm9uQmxvY2tpbmcodWludDMyX3QgYnl0ZXMpOwogCiAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3Q7CiAgICAgdWludDMyX3QgZ2V0RnJlZVNwYWNlKCkgY29uc3Q7CkBAIC04OCw0ICs3NCw1IEBACiAKIAogfQorfQogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTWF0cml4LmNwcCBiL2xpYnMvcnMvcnNNYXRyaXguY3BwCmluZGV4IDJmMjE0MDUuLjk0ZWVmMTMgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNNYXRyaXguY3BwCisrKyBiL2xpYnMvcnMvcnNNYXRyaXguY3BwCkBAIC03Myw3ICs3Myw3IEBACiAgICAgcyA9IHNpbmYocm90KTsKIAogICAgIGNvbnN0IGZsb2F0IGxlbiA9IHNxcnRmKHgqeCArIHkqeSArIHoqeik7Ci0gICAgaWYgKCEobGVuICE9IDEpKSB7CisgICAgaWYgKGxlbiAhPSAxKSB7CiAgICAgICAgIGNvbnN0IGZsb2F0IHJlY2lwTGVuID0gMS5mIC8gbGVuOwogICAgICAgICB4ICo9IHJlY2lwTGVuOwogICAgICAgICB5ICo9IHJlY2lwTGVuOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc01lc2guY3BwIGIvbGlicy9ycy9yc01lc2guY3BwCmluZGV4IGQ1OTViNGUuLjhlNDNmMjQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNNZXNoLmNwcAorKysgYi9saWJzL3JzL3JzTWVzaC5jcHAKQEAgLTE0LDI4ICsxNCwyNTYgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgogCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKworI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgPE9wZW5HbC9nbGV4dC5oPgorI2VuZGlmCisKKwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwogCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLQogTWVzaDo6TWVzaChDb250ZXh0ICpyc2MpIDogT2JqZWN0QmFzZShyc2MpCiB7CiAgICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOwogICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKLSAgICBtVmVydGljaWVzID0gTlVMTDsKLSAgICBtVmVydGljaWVzQ291bnQgPSAwOwogICAgIG1QcmltaXRpdmVzID0gTlVMTDsKICAgICBtUHJpbWl0aXZlc0NvdW50ID0gMDsKKyAgICBtVmVydGV4QnVmZmVycyA9IE5VTEw7CisgICAgbVZlcnRleEJ1ZmZlckNvdW50ID0gMDsKIH0KIAogTWVzaDo6fk1lc2goKQogeworICAgIGlmKG1WZXJ0ZXhCdWZmZXJzKSB7CisgICAgICAgIGRlbGV0ZVtdIG1WZXJ0ZXhCdWZmZXJzOworICAgIH0KKworICAgIGlmKG1QcmltaXRpdmVzKSB7CisgICAgICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1QcmltaXRpdmVzQ291bnQ7IGkgKyspIHsKKyAgICAgICAgICAgIGRlbGV0ZSBtUHJpbWl0aXZlc1tpXTsKKyAgICAgICAgfQorICAgICAgICBkZWxldGVbXSBtUHJpbWl0aXZlczsKKyAgICB9CiB9CiAKK3ZvaWQgTWVzaDo6cmVuZGVyKENvbnRleHQgKnJzYykgY29uc3QKK3sKKyAgICBmb3IodWludDMyX3QgY3QgPSAwOyBjdCA8IG1QcmltaXRpdmVzQ291bnQ7IGN0ICsrKSB7CisgICAgICAgIHJlbmRlclByaW1pdGl2ZShyc2MsIGN0KTsKKyAgICB9Cit9CisKK3ZvaWQgTWVzaDo6cmVuZGVyUHJpbWl0aXZlKENvbnRleHQgKnJzYywgdWludDMyX3QgcHJpbUluZGV4KSBjb25zdCB7CisgICAgaWYgKHByaW1JbmRleCA+PSBtUHJpbWl0aXZlc0NvdW50KSB7CisgICAgICAgIExPR0UoIkludmFsaWQgcHJpbWl0aXZlIGluZGV4Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQcmltaXRpdmVfdCAqcHJpbSA9IG1QcmltaXRpdmVzW3ByaW1JbmRleF07CisKKyAgICBpZiAocHJpbS0+bUluZGV4QnVmZmVyLmdldCgpKSB7CisgICAgICAgIHJlbmRlclByaW1pdGl2ZVJhbmdlKHJzYywgcHJpbUluZGV4LCAwLCBwcmltLT5tSW5kZXhCdWZmZXItPmdldFR5cGUoKS0+Z2V0RGltWCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJlbmRlclByaW1pdGl2ZVJhbmdlKHJzYywgcHJpbUluZGV4LCAwLCBtVmVydGV4QnVmZmVyc1swXS0+Z2V0VHlwZSgpLT5nZXREaW1YKCkpOworfQorCit2b2lkIE1lc2g6OnJlbmRlclByaW1pdGl2ZVJhbmdlKENvbnRleHQgKnJzYywgdWludDMyX3QgcHJpbUluZGV4LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuKSBjb25zdAoreworICAgIGlmIChsZW4gPCAxIHx8IHByaW1JbmRleCA+PSBtUHJpbWl0aXZlc0NvdW50KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByc2MtPmNoZWNrRXJyb3IoIk1lc2g6OnJlbmRlclByaW1pdGl2ZVJhbmdlIDEiKTsKKyAgICBWZXJ0ZXhBcnJheSB2YTsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVZlcnRleEJ1ZmZlckNvdW50OyBjdCsrKSB7CisgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2N0XS0+dXBsb2FkQ2hlY2socnNjKTsKKyAgICAgICAgaWYgKG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0SXNCdWZmZXJPYmplY3QoKSkgeworICAgICAgICAgICAgdmEuc2V0QWN0aXZlQnVmZmVyKG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0QnVmZmVyT2JqZWN0SUQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YS5zZXRBY3RpdmVCdWZmZXIobVZlcnRleEJ1ZmZlcnNbY3RdLT5nZXRQdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgbVZlcnRleEJ1ZmZlcnNbY3RdLT5nZXRUeXBlKCktPmVuYWJsZUdMVmVydGV4QnVmZmVyKCZ2YSk7CisgICAgfQorICAgIHZhLnNldHVwR0wyKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXksICZyc2MtPm1TaGFkZXJDYWNoZSk7CisKKyAgICByc2MtPmNoZWNrRXJyb3IoIk1lc2g6OnJlbmRlclByaW1pdGl2ZVJhbmdlIDIiKTsKKyAgICBQcmltaXRpdmVfdCAqcHJpbSA9IG1QcmltaXRpdmVzW3ByaW1JbmRleF07CisgICAgaWYgKHByaW0tPm1JbmRleEJ1ZmZlci5nZXQoKSkgeworICAgICAgICBwcmltLT5tSW5kZXhCdWZmZXItPnVwbG9hZENoZWNrKHJzYyk7CisgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgcHJpbS0+bUluZGV4QnVmZmVyLT5nZXRCdWZmZXJPYmplY3RJRCgpKTsKKyAgICAgICAgZ2xEcmF3RWxlbWVudHMocHJpbS0+bUdMUHJpbWl0aXZlLCBsZW4sIEdMX1VOU0lHTkVEX1NIT1JULCAodWludDE2X3QgKikoc3RhcnQgKiAyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEcmF3QXJyYXlzKHByaW0tPm1HTFByaW1pdGl2ZSwgc3RhcnQsIGxlbik7CisgICAgfQorCisgICAgcnNjLT5jaGVja0Vycm9yKCJNZXNoOjpyZW5kZXJQcmltaXRpdmVSYW5nZSIpOworfQorCisKK3ZvaWQgTWVzaDo6dXBsb2FkQWxsKENvbnRleHQgKnJzYykKK3sKKyAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtVmVydGV4QnVmZmVyQ291bnQ7IGN0ICsrKSB7CisgICAgICAgIGlmIChtVmVydGV4QnVmZmVyc1tjdF0uZ2V0KCkpIHsKKyAgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2N0XS0+ZGVmZXJlZFVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtUHJpbWl0aXZlc0NvdW50OyBjdCArKykgeworICAgICAgICBpZiAobVByaW1pdGl2ZXNbY3RdLT5tSW5kZXhCdWZmZXIuZ2V0KCkpIHsKKyAgICAgICAgICAgIG1QcmltaXRpdmVzW2N0XS0+bUluZGV4QnVmZmVyLT5kZWZlcmVkVXBsb2FkVG9CdWZmZXJPYmplY3QocnNjKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNZXNoOjp1cGRhdGVHTFByaW1pdGl2ZXMoKQoreworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1QcmltaXRpdmVzQ291bnQ7IGkgKyspIHsKKyAgICAgICAgc3dpdGNoKG1QcmltaXRpdmVzW2ldLT5tUHJpbWl0aXZlKSB7CisgICAgICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9QT0lOVDogICAgICAgICAgbVByaW1pdGl2ZXNbaV0tPm1HTFByaW1pdGl2ZSA9IEdMX1BPSU5UUzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9MSU5FOiAgICAgICAgICAgbVByaW1pdGl2ZXNbaV0tPm1HTFByaW1pdGl2ZSA9IEdMX0xJTkVTOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlNfUFJJTUlUSVZFX0xJTkVfU1RSSVA6ICAgICBtUHJpbWl0aXZlc1tpXS0+bUdMUHJpbWl0aXZlID0gR0xfTElORV9TVFJJUDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9UUklBTkdMRTogICAgICAgbVByaW1pdGl2ZXNbaV0tPm1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFUzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJTX1BSSU1JVElWRV9UUklBTkdMRV9TVFJJUDogbVByaW1pdGl2ZXNbaV0tPm1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFX1NUUklQOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlNfUFJJTUlUSVZFX1RSSUFOR0xFX0ZBTjogICBtUHJpbWl0aXZlc1tpXS0+bUdMUHJpbWl0aXZlID0gR0xfVFJJQU5HTEVfRkFOOyBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNZXNoOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIC8vIE5lZWQgdG8gaWRlbnRpZnkgb3Vyc2VsdmVzCisgICAgc3RyZWFtLT5hZGRVMzIoKHVpbnQzMl90KWdldENsYXNzSWQoKSk7CisKKyAgICBTdHJpbmc4IG5hbWUoZ2V0TmFtZSgpKTsKKyAgICBzdHJlYW0tPmFkZFN0cmluZygmbmFtZSk7CisKKyAgICAvLyBTdG9yZSBudW1iZXIgb2YgdmVydGV4IHN0cmVhbXMKKyAgICBzdHJlYW0tPmFkZFUzMihtVmVydGV4QnVmZmVyQ291bnQpOworICAgIGZvcih1aW50MzJfdCB2Q291bnQgPSAwOyB2Q291bnQgPCBtVmVydGV4QnVmZmVyQ291bnQ7IHZDb3VudCArKykgeworICAgICAgICBtVmVydGV4QnVmZmVyc1t2Q291bnRdLT5zZXJpYWxpemUoc3RyZWFtKTsKKyAgICB9CisKKyAgICBzdHJlYW0tPmFkZFUzMihtUHJpbWl0aXZlc0NvdW50KTsKKyAgICAvLyBTdG9yZSB0aGUgcHJpbWl0aXZlcworICAgIGZvciAodWludDMyX3QgcENvdW50ID0gMDsgcENvdW50IDwgbVByaW1pdGl2ZXNDb3VudDsgcENvdW50ICsrKSB7CisgICAgICAgIFByaW1pdGl2ZV90ICogcHJpbSA9IG1QcmltaXRpdmVzW3BDb3VudF07CisKKyAgICAgICAgc3RyZWFtLT5hZGRVOCgodWludDhfdClwcmltLT5tUHJpbWl0aXZlKTsKKworICAgICAgICBpZihwcmltLT5tSW5kZXhCdWZmZXIuZ2V0KCkpIHsKKyAgICAgICAgICAgIHN0cmVhbS0+YWRkVTMyKDEpOworICAgICAgICAgICAgcHJpbS0+bUluZGV4QnVmZmVyLT5zZXJpYWxpemUoc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHN0cmVhbS0+YWRkVTMyKDApOworICAgICAgICB9CisgICAgfQorfQorCitNZXNoICpNZXNoOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIC8vIEZpcnN0IG1ha2Ugc3VyZSB3ZSBhcmUgcmVhZGluZyB0aGUgY29ycmVjdCBvYmplY3QKKyAgICBSc0EzRENsYXNzSUQgY2xhc3NJRCA9IChSc0EzRENsYXNzSUQpc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYoY2xhc3NJRCAhPSBSU19BM0RfQ0xBU1NfSURfTUVTSCkgeworICAgICAgICBMT0dFKCJtZXNoIGxvYWRpbmcgc2tpcHBlZCBkdWUgdG8gaW52YWxpZCBjbGFzcyBpZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBNZXNoICogbWVzaCA9IG5ldyBNZXNoKHJzYyk7CisKKyAgICBTdHJpbmc4IG5hbWU7CisgICAgc3RyZWFtLT5sb2FkU3RyaW5nKCZuYW1lKTsKKyAgICBtZXNoLT5zZXROYW1lKG5hbWUuc3RyaW5nKCksIG5hbWUuc2l6ZSgpKTsKKworICAgIG1lc2gtPm1WZXJ0ZXhCdWZmZXJDb3VudCA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKG1lc2gtPm1WZXJ0ZXhCdWZmZXJDb3VudCkgeworICAgICAgICBtZXNoLT5tVmVydGV4QnVmZmVycyA9IG5ldyBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+W21lc2gtPm1WZXJ0ZXhCdWZmZXJDb3VudF07CisKKyAgICAgICAgZm9yKHVpbnQzMl90IHZDb3VudCA9IDA7IHZDb3VudCA8IG1lc2gtPm1WZXJ0ZXhCdWZmZXJDb3VudDsgdkNvdW50ICsrKSB7CisgICAgICAgICAgICBBbGxvY2F0aW9uICp2ZXJ0ZXhBbGxvYyA9IEFsbG9jYXRpb246OmNyZWF0ZUZyb21TdHJlYW0ocnNjLCBzdHJlYW0pOworICAgICAgICAgICAgbWVzaC0+bVZlcnRleEJ1ZmZlcnNbdkNvdW50XS5zZXQodmVydGV4QWxsb2MpOworICAgICAgICB9CisgICAgfQorCisgICAgbWVzaC0+bVByaW1pdGl2ZXNDb3VudCA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgIGlmKG1lc2gtPm1QcmltaXRpdmVzQ291bnQpIHsKKyAgICAgICAgbWVzaC0+bVByaW1pdGl2ZXMgPSBuZXcgUHJpbWl0aXZlX3QgKlttZXNoLT5tUHJpbWl0aXZlc0NvdW50XTsKKworICAgICAgICAvLyBsb2FkIGFsbCBwcmltaXRpdmVzCisgICAgICAgIGZvciAodWludDMyX3QgcENvdW50ID0gMDsgcENvdW50IDwgbWVzaC0+bVByaW1pdGl2ZXNDb3VudDsgcENvdW50ICsrKSB7CisgICAgICAgICAgICBQcmltaXRpdmVfdCAqIHByaW0gPSBuZXcgUHJpbWl0aXZlX3Q7CisgICAgICAgICAgICBtZXNoLT5tUHJpbWl0aXZlc1twQ291bnRdID0gcHJpbTsKKworICAgICAgICAgICAgcHJpbS0+bVByaW1pdGl2ZSA9IChSc1ByaW1pdGl2ZSlzdHJlYW0tPmxvYWRVOCgpOworCisgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGluZGV4IGJ1ZmZlciB3YXMgc3RvcmVkCisgICAgICAgICAgICB1aW50MzJfdCBpc0luZGV4UHJlc2VudCA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgICAgICAgICAgaWYoaXNJbmRleFByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICBBbGxvY2F0aW9uICppbmRleEFsbG9jID0gQWxsb2NhdGlvbjo6Y3JlYXRlRnJvbVN0cmVhbShyc2MsIHN0cmVhbSk7CisgICAgICAgICAgICAgICAgcHJpbS0+bUluZGV4QnVmZmVyLnNldChpbmRleEFsbG9jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1lc2gtPnVwZGF0ZUdMUHJpbWl0aXZlcygpOworICAgIG1lc2gtPnVwbG9hZEFsbChyc2MpOworCisgICAgcmV0dXJuIG1lc2g7Cit9CisKK3ZvaWQgTWVzaDo6Y29tcHV0ZUJCb3goKSB7CisgICAgZmxvYXQgKnBvc1B0ciA9IE5VTEw7CisgICAgdWludDMyX3QgdmVjdG9yU2l6ZSA9IDA7CisgICAgdWludDMyX3Qgc3RyaWRlID0gMDsKKyAgICB1aW50MzJfdCBudW1WZXJ0cyA9IDA7CisgICAgLy8gRmlyc3Qgd2UgbmVlZCB0byBmaW5kIHRoZSBwb3NpdGlvbiBwdHIgYW5kIHN0cmlkZQorICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVmVydGV4QnVmZmVyQ291bnQ7IGN0KyspIHsKKyAgICAgICAgY29uc3QgVHlwZSAqYnVmZmVyVHlwZSA9IG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0VHlwZSgpOworICAgICAgICBjb25zdCBFbGVtZW50ICpidWZmZXJFbGVtID0gYnVmZmVyVHlwZS0+Z2V0RWxlbWVudCgpOworCisgICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBidWZmZXJFbGVtLT5nZXRGaWVsZENvdW50KCk7IGN0KyspIHsKKyAgICAgICAgICAgIGlmKHN0cmNtcChidWZmZXJFbGVtLT5nZXRGaWVsZE5hbWUoY3QpLCAicG9zaXRpb24iKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdmVjdG9yU2l6ZSA9IGJ1ZmZlckVsZW0tPmdldEZpZWxkKGN0KS0+Z2V0Q29tcG9uZW50KCkuZ2V0VmVjdG9yU2l6ZSgpOworICAgICAgICAgICAgICAgIHN0cmlkZSA9IGJ1ZmZlckVsZW0tPmdldFNpemVCeXRlcygpIC8gc2l6ZW9mKGZsb2F0KTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSBidWZmZXJFbGVtLT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKKyAgICAgICAgICAgICAgICBwb3NQdHIgPSAoZmxvYXQqKSgodWludDhfdCopbVZlcnRleEJ1ZmZlcnNbY3RdLT5nZXRQdHIoKSArIG9mZnNldCk7CisgICAgICAgICAgICAgICAgbnVtVmVydHMgPSBidWZmZXJUeXBlLT5nZXREaW1YKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYocG9zUHRyKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1CQm94TWluWzBdID0gbUJCb3hNaW5bMV0gPSBtQkJveE1pblsyXSA9IDFlNjsKKyAgICBtQkJveE1heFswXSA9IG1CQm94TWF4WzFdID0gbUJCb3hNYXhbMl0gPSAtMWU2OworICAgIGlmKCFwb3NQdHIpIHsKKyAgICAgICAgTE9HRSgiVW5hYmxlIHRvIGNvbXB1dGUgYm91bmRpbmcgYm94Iik7CisgICAgICAgIG1CQm94TWluWzBdID0gbUJCb3hNaW5bMV0gPSBtQkJveE1pblsyXSA9IDAuMGY7CisgICAgICAgIG1CQm94TWF4WzBdID0gbUJCb3hNYXhbMV0gPSBtQkJveE1heFsyXSA9IDAuMGY7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBudW1WZXJ0czsgaSArKykgeworICAgICAgICBmb3IodWludDMyX3QgdiA9IDA7IHYgPCB2ZWN0b3JTaXplOyB2ICsrKSB7CisgICAgICAgICAgICBtQkJveE1pblt2XSA9IHJzTWluKG1CQm94TWluW3ZdLCBwb3NQdHJbdl0pOworICAgICAgICAgICAgbUJCb3hNYXhbdl0gPSByc01heChtQkJveE1heFt2XSwgcG9zUHRyW3ZdKTsKKyAgICAgICAgfQorICAgICAgICBwb3NQdHIgKz0gc3RyaWRlOworICAgIH0KK30KIAogCiBNZXNoQ29udGV4dDo6TWVzaENvbnRleHQoKQpAQCAtNDYsMyArMjc0LDgzIEBACiB7CiB9CiAKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitSc01lc2ggcnNpX01lc2hDcmVhdGUoQ29udGV4dCAqcnNjLCB1aW50MzJfdCB2dHhDb3VudCwgdWludDMyX3QgaWR4Q291bnQpCit7CisgICAgTWVzaCAqc20gPSBuZXcgTWVzaChyc2MpOworICAgIHNtLT5pbmNVc2VyUmVmKCk7CisKKyAgICBzbS0+bVByaW1pdGl2ZXNDb3VudCA9IGlkeENvdW50OworICAgIHNtLT5tUHJpbWl0aXZlcyA9IG5ldyBNZXNoOjpQcmltaXRpdmVfdCAqW3NtLT5tUHJpbWl0aXZlc0NvdW50XTsKKyAgICBmb3IodWludDMyX3QgY3QgPSAwOyBjdCA8IGlkeENvdW50OyBjdCArKykgeworICAgICAgICBzbS0+bVByaW1pdGl2ZXNbY3RdID0gbmV3IE1lc2g6OlByaW1pdGl2ZV90OworICAgIH0KKworICAgIHNtLT5tVmVydGV4QnVmZmVyQ291bnQgPSB2dHhDb3VudDsKKyAgICBzbS0+bVZlcnRleEJ1ZmZlcnMgPSBuZXcgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPlt2dHhDb3VudF07CisKKyAgICByZXR1cm4gc207Cit9CisKK3ZvaWQgcnNpX01lc2hCaW5kVmVydGV4KENvbnRleHQgKnJzYywgUnNNZXNoIG12LCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHNsb3QpCit7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KG12KTsKKyAgICByc0Fzc2VydChzbG90IDwgc20tPm1WZXJ0ZXhCdWZmZXJDb3VudCk7CisKKyAgICBzbS0+bVZlcnRleEJ1ZmZlcnNbc2xvdF0uc2V0KChBbGxvY2F0aW9uICopdmEpOworfQorCit2b2lkIHJzaV9NZXNoQmluZEluZGV4KENvbnRleHQgKnJzYywgUnNNZXNoIG12LCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHByaW1UeXBlLCB1aW50MzJfdCBzbG90KQoreworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPihtdik7CisgICAgcnNBc3NlcnQoc2xvdCA8IHNtLT5tUHJpbWl0aXZlc0NvdW50KTsKKworICAgIHNtLT5tUHJpbWl0aXZlc1tzbG90XS0+bUluZGV4QnVmZmVyLnNldCgoQWxsb2NhdGlvbiAqKXZhKTsKKyAgICBzbS0+bVByaW1pdGl2ZXNbc2xvdF0tPm1QcmltaXRpdmUgPSAoUnNQcmltaXRpdmUpcHJpbVR5cGU7CisgICAgc20tPnVwZGF0ZUdMUHJpbWl0aXZlcygpOworfQorCit2b2lkIHJzaV9NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQoQ29udGV4dCAqcnNjLCBSc01lc2ggbXYsIGludDMyX3QgKm51bVZ0eCkKK3sKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4obXYpOworICAgICpudW1WdHggPSBzbS0+bVZlcnRleEJ1ZmZlckNvdW50OworfQorCit2b2lkIHJzaV9NZXNoR2V0SW5kZXhDb3VudChDb250ZXh0ICpyc2MsIFJzTWVzaCBtdiwgaW50MzJfdCAqbnVtSWR4KQoreworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPihtdik7CisgICAgKm51bUlkeCA9IHNtLT5tUHJpbWl0aXZlc0NvdW50OworfQorCit2b2lkIHJzaV9NZXNoR2V0VmVydGljZXMoQ29udGV4dCAqcnNjLCBSc01lc2ggbXYsIFJzQWxsb2NhdGlvbiAqdnR4RGF0YSwgdWludDMyX3QgdnR4RGF0YUNvdW50KQoreworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPihtdik7CisgICAgcnNBc3NlcnQodnR4RGF0YUNvdW50ID09IHNtLT5tVmVydGV4QnVmZmVyQ291bnQpOworCisgICAgZm9yKHVpbnQzMl90IGN0ID0gMDsgY3QgPCB2dHhEYXRhQ291bnQ7IGN0ICsrKSB7CisgICAgICAgIHZ0eERhdGFbY3RdID0gc20tPm1WZXJ0ZXhCdWZmZXJzW2N0XS5nZXQoKTsKKyAgICAgICAgc20tPm1WZXJ0ZXhCdWZmZXJzW2N0XS0+aW5jVXNlclJlZigpOworICAgIH0KK30KKwordm9pZCByc2lfTWVzaEdldEluZGljZXMoQ29udGV4dCAqcnNjLCBSc01lc2ggbXYsIFJzQWxsb2NhdGlvbiAqdmEsIHVpbnQzMl90ICpwcmltVHlwZSwgdWludDMyX3QgaWR4RGF0YUNvdW50KQoreworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPihtdik7CisgICAgcnNBc3NlcnQoaWR4RGF0YUNvdW50ID09IHNtLT5tUHJpbWl0aXZlc0NvdW50KTsKKworICAgIGZvcih1aW50MzJfdCBjdCA9IDA7IGN0IDwgaWR4RGF0YUNvdW50OyBjdCArKykgeworICAgICAgICB2YVtjdF0gPSBzbS0+bVByaW1pdGl2ZXNbY3RdLT5tSW5kZXhCdWZmZXIuZ2V0KCk7CisgICAgICAgIHByaW1UeXBlW2N0XSA9IHNtLT5tUHJpbWl0aXZlc1tjdF0tPm1QcmltaXRpdmU7CisgICAgICAgIGlmKHNtLT5tUHJpbWl0aXZlc1tjdF0tPm1JbmRleEJ1ZmZlci5nZXQoKSkgeworICAgICAgICAgICAgc20tPm1QcmltaXRpdmVzW2N0XS0+bUluZGV4QnVmZmVyLT5pbmNVc2VyUmVmKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KKworCisKKworfX0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNNZXNoLmggYi9saWJzL3JzL3JzTWVzaC5oCmluZGV4IDUyMDFhYmQuLmVkMDFjMzggMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNNZXNoLmgKKysrIGIvbGlicy9ycy9yc01lc2guaApAQCAtMzIsNDUgKzMyLDQwIEBACiAgICAgTWVzaChDb250ZXh0ICopOwogICAgIH5NZXNoKCk7CiAKLSAgICBzdHJ1Y3QgVmVydGljaWVzX3QKLSAgICB7Ci0gICAgICAgIEFsbG9jYXRpb24gKiogbUFsbG9jYXRpb25zOwotICAgICAgICB1aW50MzJfdCBtQWxsb2NhdGlvbkNvdW50OworICAgIC8vIENvbnRhaW5zIHZlcnRleCBkYXRhCisgICAgLy8gUG9zaXRpb24sIG5vcm1hbCwgdGV4Y29vcmQsIGV0YyBjb3VsZCBlaXRoZXIgYmUgc3RyaWRlZCBpbiBvbmUgYWxsb2NhdGlvbgorICAgIC8vIG9mIHByb3ZpZGVkIHNlcGFyZXRlbHkgaW4gbXVsdGlwbGUgb25lcworICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gKm1WZXJ0ZXhCdWZmZXJzOworICAgIHVpbnQzMl90IG1WZXJ0ZXhCdWZmZXJDb3VudDsKIAotICAgICAgICBzaXplX3QgbVZlcnRleERhdGFTaXplOwotCi0gICAgICAgIHNpemVfdCBtT2Zmc2V0Q29vcmQ7Ci0gICAgICAgIHNpemVfdCBtT2Zmc2V0VGV4OwotICAgICAgICBzaXplX3QgbU9mZnNldE5vcm07Ci0KLSAgICAgICAgc2l6ZV90IG1TaXplQ29vcmQ7Ci0gICAgICAgIHNpemVfdCBtU2l6ZVRleDsKLSAgICAgICAgc2l6ZV90IG1TaXplTm9ybTsKLQotICAgICAgICB1aW50MzJfdCBtQnVmZmVyT2JqZWN0OwotICAgIH07Ci0KKyAgICAvLyBFaXRoZXIgbUluZGV4QnVmZmVyLCBtUHJpbWl0aXZlQnVmZmVyIG9yIGJvdGggY291bGQgaGF2ZSBhIE5VTEwgcmVmZXJlbmNlCisgICAgLy8gSWYgYm90aCBhcmUgbnVsbCwgbVByaW1pdGl2ZSBvbmx5IHdvdWxkIGJlIHVzZWQgdG8gcmVuZGVyIHRoZSBtZXNoCiAgICAgc3RydWN0IFByaW1pdGl2ZV90CiAgICAgewotICAgICAgICBSc1ByaW1pdGl2ZSBtVHlwZTsKLSAgICAgICAgVmVydGljaWVzX3QgKm1WZXJ0aWNpZXM7CisgICAgICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbUluZGV4QnVmZmVyOwogCi0gICAgICAgIHVpbnQzMl90IG1JbmRleENvdW50OwotICAgICAgICB1aW50MTZfdCAqbUluZGljaWVzOwotCi0gICAgICAgIHVpbnQzMl90IG1SZXN0YXJ0Q291bnRzOwotICAgICAgICB1aW50MTZfdCAqbVJlc3RhcnRzOworICAgICAgICBSc1ByaW1pdGl2ZSBtUHJpbWl0aXZlOworICAgICAgICB1aW50MzJfdCBtR0xQcmltaXRpdmU7CiAgICAgfTsKIAotICAgIFZlcnRpY2llc190ICogbVZlcnRpY2llczsKLSAgICB1aW50MzJfdCBtVmVydGljaWVzQ291bnQ7Ci0KICAgICBQcmltaXRpdmVfdCAqKiBtUHJpbWl0aXZlczsKICAgICB1aW50MzJfdCBtUHJpbWl0aXZlc0NvdW50OwogCisgICAgdm9pZCByZW5kZXIoQ29udGV4dCAqKSBjb25zdDsKKyAgICB2b2lkIHJlbmRlclByaW1pdGl2ZShDb250ZXh0ICosIHVpbnQzMl90IHByaW1JbmRleCkgY29uc3Q7CisgICAgdm9pZCByZW5kZXJQcmltaXRpdmVSYW5nZShDb250ZXh0ICosIHVpbnQzMl90IHByaW1JbmRleCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbikgY29uc3Q7CisgICAgdm9pZCB1cGxvYWRBbGwoQ29udGV4dCAqKTsKKyAgICB2b2lkIHVwZGF0ZUdMUHJpbWl0aXZlcygpOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfTUVTSDsgfQorICAgIHN0YXRpYyBNZXNoICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKIAotICAgIHZvaWQgYW5hbHl6ZUVsZW1lbnQoKTsKKyAgICAvLyBCb3VuZGluZyB2b2x1bWVzCisgICAgZmxvYXQgbUJCb3hNaW5bM107CisgICAgZmxvYXQgbUJCb3hNYXhbM107CisgICAgdm9pZCBjb21wdXRlQkJveCgpOworCiBwcm90ZWN0ZWQ6CiB9OwogCkBAIC04OCwzICs4Myw0IEBACiAjZW5kaWYgLy9BTkRST0lEX1JTX1RSSUFOR0xFX01FU0hfSAogCiAKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc011dGV4LmNwcCBiL2xpYnMvcnMvcnNNdXRleC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3NTJmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNNdXRleC5jcHAKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJyc011dGV4LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworCitNdXRleDo6TXV0ZXgoKQoreworfQorCitNdXRleDo6fk11dGV4KCkKK3sKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1NdXRleCk7Cit9CisKK2Jvb2wgTXV0ZXg6OmluaXQoKQoreworICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2luaXQoJm1NdXRleCwgTlVMTCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJNdXRleDo6TXV0ZXggaW5pdCBmYWlsdXJlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTXV0ZXg6OmxvY2soKQoreworICAgIGludCBzdGF0dXM7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTXV0ZXg6IGVycm9yICVpIGxvY2tpbmcuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNdXRleDo6dW5sb2NrKCkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTXV0ZXggZXJyb3IgJWkgdW5sb2NraW5nLiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc011dGV4LmggYi9saWJzL3JzL3JzTXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzcyNWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc011dGV4LmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19NVVRFWF9ICisjZGVmaW5lIEFORFJPSURfUlNfTVVURVhfSAorCisKKyNpbmNsdWRlICJyc1V0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitjbGFzcyBNdXRleCB7CitwdWJsaWM6CisgICAgTXV0ZXgoKTsKKyAgICB+TXV0ZXgoKTsKKworICAgIGJvb2wgaW5pdCgpOworICAgIGJvb2wgbG9jaygpOworICAgIGJvb2wgdW5sb2NrKCk7CisKK3Byb3RlY3RlZDoKKyAgICBwdGhyZWFkX211dGV4X3QgbU11dGV4OworfTsKKworfQorfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc05vaXNlLmNwcCBiL2xpYnMvcnMvcnNOb2lzZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNjc1ODYuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9yc05vaXNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbm9pc2UgZnVuY3Rpb25zIHdhcyBwb3J0ZWQgZnJvbSB0aGUgSmF2YQotICogaW1wbGVtZW50YXRpb24gYnkgSmVycnkgSHV4dGFibGUgKGh0dHA6Ly93d3cuamhsYWJzLmNvbSkgdW5kZXIKLSAqIEFwYWNoZSBMaWNlbnNlIDIuMCAoc2VlIGh0dHA6Ly9qaGxhYnMuY29tL2lwL2ZpbHRlcnMvZG93bmxvYWQuaHRtbCkKLSAqCi0gKiBPcmlnaW5hbCBoZWFkZXI6Ci0gKgotICogQ29weXJpZ2h0IDIwMDYgSmVycnkgSHV4dGFibGUKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInJzTm9pc2UuaCIKLQotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi0jZGVmaW5lIEIgMHgxMDAKLSNkZWZpbmUgQk0gMHhmZgotI2RlZmluZSBOIDB4MTAwMAotCi1zdGF0aWMgaW50IHBbQiArIEIgKyAyXTsKLXN0YXRpYyBmbG9hdCBnM1tCICsgQiArIDJdWzNdOwotc3RhdGljIGZsb2F0IGcyW0IgKyBCICsgMl1bMl07Ci1zdGF0aWMgZmxvYXQgZzFbQiArIEIgKyAyXTsKLXN0YXRpYyBib29sIG5vaXNlX3N0YXJ0ID0gdHJ1ZTsKLQotI2RlZmluZSBsZXJwZihzdGFydCwgc3RvcCwgYW1vdW50KSBzdGFydCArIChzdG9wIC0gc3RhcnQpICogYW1vdW50Ci0KLXN0YXRpYyBpbmxpbmUgZmxvYXQgbm9pc2Vfc0N1cnZlKGZsb2F0IHQpCi17Ci0gICAgcmV0dXJuIHQgKiB0ICogKDMuMGYgLSAyLjBmICogdCk7Ci19Ci0KLWlubGluZSB2b2lkIFNDX25vcm1hbGl6ZWYyKGZsb2F0IHZbXSkKLXsKLSAgICBmbG9hdCBzID0gKGZsb2F0KXNxcnRmKHZbMF0gKiB2WzBdICsgdlsxXSAqIHZbMV0pOwotICAgIHZbMF0gPSB2WzBdIC8gczsKLSAgICB2WzFdID0gdlsxXSAvIHM7Ci19Ci0KLWlubGluZSB2b2lkIFNDX25vcm1hbGl6ZWYzKGZsb2F0IHZbXSkKLXsKLSAgICBmbG9hdCBzID0gKGZsb2F0KXNxcnRmKHZbMF0gKiB2WzBdICsgdlsxXSAqIHZbMV0gKyB2WzJdICogdlsyXSk7Ci0gICAgdlswXSA9IHZbMF0gLyBzOwotICAgIHZbMV0gPSB2WzFdIC8gczsKLSAgICB2WzJdID0gdlsyXSAvIHM7Ci19Ci0KLXN0YXRpYyB2b2lkIG5vaXNlX2luaXQoKQotewotICAgIGludCBpLCBqLCBrOwotICAgIAotICAgIGZvciAoaSA9IDA7IGkgPCBCOyBpKyspIHsKLSAgICAgICAgcFtpXSA9IGk7Ci0gICAgICAgIAotICAgICAgICBnMVtpXSA9IChmbG9hdCkoKHJhbmQoKSAlIChCICsgQikpIC0gQikgLyBCOwotICAgICAgICAKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLSAgICAgICAgICAgIGcyW2ldW2pdID0gKGZsb2F0KSgocmFuZCgpICUgKEIgKyBCKSkgLSBCKSAvIEI7Ci0gICAgICAgIFNDX25vcm1hbGl6ZWYyKGcyW2ldKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspCi0gICAgICAgICAgICBnM1tpXVtqXSA9IChmbG9hdCkoKHJhbmQoKSAlIChCICsgQikpIC0gQikgLyBCOwotICAgICAgICBTQ19ub3JtYWxpemVmMyhnM1tpXSk7Ci0gICAgfQotICAgIAotICAgIGZvciAoaSA9IEItMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgayA9IHBbaV07Ci0gICAgICAgIHBbaV0gPSBwW2ogPSByYW5kKCkgJSBCXTsKLSAgICAgICAgcFtqXSA9IGs7Ci0gICAgfQotICAgIAotICAgIGZvciAoaSA9IDA7IGkgPCBCICsgMjsgaSsrKSB7Ci0gICAgICAgIHBbQiArIGldID0gcFtpXTsKLSAgICAgICAgZzFbQiArIGldID0gZzFbaV07Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0gICAgICAgICAgICBnMltCICsgaV1bal0gPSBnMltpXVtqXTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykKLSAgICAgICAgICAgIGczW0IgKyBpXVtqXSA9IGczW2ldW2pdOwotICAgIH0KLX0KLQotZmxvYXQgU0Nfbm9pc2VmKGZsb2F0IHgpCi17Ci0gICAgc3JhbmQodGltZShOVUxMKSk7Ci0gICAgaW50IGJ4MCwgYngxOwotICAgIGZsb2F0IHJ4MCwgcngxLCBzeCwgdCwgdSwgdjsKLSAgICAKLSAgICBpZiAobm9pc2Vfc3RhcnQpIHsKLSAgICAgICAgbm9pc2Vfc3RhcnQgPSBmYWxzZTsKLSAgICAgICAgbm9pc2VfaW5pdCgpOwotICAgIH0KLSAgICAKLSAgICB0ID0geCArIE47Ci0gICAgYngwID0gKChpbnQpdCkgJiBCTTsKLSAgICBieDEgPSAoYngwKzEpICYgQk07Ci0gICAgcngwID0gdCAtIChpbnQpdDsKLSAgICByeDEgPSByeDAgLSAxLjBmOwotICAgIAotICAgIHN4ID0gbm9pc2Vfc0N1cnZlKHJ4MCk7Ci0gICAgCi0gICAgdSA9IHJ4MCAqIGcxW3BbYngwXV07Ci0gICAgdiA9IHJ4MSAqIGcxW3BbYngxXV07Ci0gICAgcmV0dXJuIDIuM2YgKiBsZXJwZih1LCB2LCBzeCk7Ci19Ci0KLWZsb2F0IFNDX25vaXNlZjIoZmxvYXQgeCwgZmxvYXQgeSkKLXsKLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgICBpbnQgYngwLCBieDEsIGJ5MCwgYnkxLCBiMDAsIGIxMCwgYjAxLCBiMTE7Ci0gICAgZmxvYXQgcngwLCByeDEsIHJ5MCwgcnkxLCBzeCwgc3ksIGEsIGIsIHQsIHUsIHY7Ci0gICAgZmxvYXQgKnE7Ci0gICAgaW50IGksIGo7Ci0gICAgCi0gICAgaWYgKG5vaXNlX3N0YXJ0KSB7Ci0gICAgICAgIG5vaXNlX3N0YXJ0ID0gZmFsc2U7Ci0gICAgICAgIG5vaXNlX2luaXQoKTsKLSAgICB9Ci0gICAgCi0gICAgdCA9IHggKyBOOwotICAgIGJ4MCA9ICgoaW50KXQpICYgQk07Ci0gICAgYngxID0gKGJ4MCsxKSAmIEJNOwotICAgIHJ4MCA9IHQgLSAoaW50KXQ7Ci0gICAgcngxID0gcngwIC0gMS4wZjsKLQkKLSAgICB0ID0geSArIE47Ci0gICAgYnkwID0gKChpbnQpdCkgJiBCTTsKLSAgICBieTEgPSAoYnkwKzEpICYgQk07Ci0gICAgcnkwID0gdCAtIChpbnQpdDsKLSAgICByeTEgPSByeTAgLSAxLjBmOwotCQotICAgIGkgPSBwW2J4MF07Ci0gICAgaiA9IHBbYngxXTsKLSAgICAKLSAgICBiMDAgPSBwW2kgKyBieTBdOwotICAgIGIxMCA9IHBbaiArIGJ5MF07Ci0gICAgYjAxID0gcFtpICsgYnkxXTsKLSAgICBiMTEgPSBwW2ogKyBieTFdOwotICAgIAotICAgIHN4ID0gbm9pc2Vfc0N1cnZlKHJ4MCk7Ci0gICAgc3kgPSBub2lzZV9zQ3VydmUocnkwKTsKLSAgICAKLSAgICBxID0gZzJbYjAwXTsgdSA9IHJ4MCAqIHFbMF0gKyByeTAgKiBxWzFdOwotICAgIHEgPSBnMltiMTBdOyB2ID0gcngxICogcVswXSArIHJ5MCAqIHFbMV07Ci0gICAgYSA9IGxlcnBmKHUsIHYsIHN4KTsKLSAgICAKLSAgICBxID0gZzJbYjAxXTsgdSA9IHJ4MCAqIHFbMF0gKyByeTEgKiBxWzFdOwotICAgIHEgPSBnMltiMTFdOyB2ID0gcngxICogcVswXSArIHJ5MSAqIHFbMV07Ci0gICAgYiA9IGxlcnBmKHUsIHYsIHN4KTsKLSAgICAKLSAgICByZXR1cm4gMS41ZipsZXJwZihhLCBiLCBzeSk7Ci19Ci0KLWZsb2F0IFNDX25vaXNlZjMoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgICBpbnQgYngwLCBieDEsIGJ5MCwgYnkxLCBiejAsIGJ6MSwgYjAwLCBiMTAsIGIwMSwgYjExOwotICAgIGZsb2F0IHJ4MCwgcngxLCByeTAsIHJ5MSwgcnowLCByejEsIHN5LCBzeiwgYSwgYiwgYywgZCwgdCwgdSwgdjsKLSAgICBmbG9hdCAqcTsKLSAgICBpbnQgaSwgajsKLSAgICAKLSAgICBpZiAobm9pc2Vfc3RhcnQpIHsKLSAgICAgICAgbm9pc2Vfc3RhcnQgPSBmYWxzZTsKLSAgICAgICAgbm9pc2VfaW5pdCgpOwotICAgIH0KLSAgICAKLSAgICB0ID0geCArIE47Ci0gICAgYngwID0gKChpbnQpdCkgJiBCTTsKLSAgICBieDEgPSAoYngwKzEpICYgQk07Ci0gICAgcngwID0gdCAtIChpbnQpdDsKLSAgICByeDEgPSByeDAgLSAxLjBmOwotICAgIAotICAgIHQgPSB5ICsgTjsKLSAgICBieTAgPSAoKGludCl0KSAmIEJNOwotICAgIGJ5MSA9IChieTArMSkgJiBCTTsKLSAgICByeTAgPSB0IC0gKGludCl0OwotICAgIHJ5MSA9IHJ5MCAtIDEuMGY7Ci0JCi0gICAgdCA9IHogKyBOOwotICAgIGJ6MCA9ICgoaW50KXQpICYgQk07Ci0gICAgYnoxID0gKGJ6MCsxKSAmIEJNOwotICAgIHJ6MCA9IHQgLSAoaW50KXQ7Ci0gICAgcnoxID0gcnowIC0gMS4wZjsKLQkKLSAgICBpID0gcFtieDBdOwotICAgIGogPSBwW2J4MV07Ci0gICAgCi0gICAgYjAwID0gcFtpICsgYnkwXTsKLSAgICBiMTAgPSBwW2ogKyBieTBdOwotICAgIGIwMSA9IHBbaSArIGJ5MV07Ci0gICAgYjExID0gcFtqICsgYnkxXTsKLSAgICAKLSAgICB0ICA9IG5vaXNlX3NDdXJ2ZShyeDApOwotICAgIHN5ID0gbm9pc2Vfc0N1cnZlKHJ5MCk7Ci0gICAgc3ogPSBub2lzZV9zQ3VydmUocnowKTsKLSAgICAKLSAgICBxID0gZzNbYjAwICsgYnowXTsgdSA9IHJ4MCAqIHFbMF0gKyByeTAgKiBxWzFdICsgcnowICogcVsyXTsKLSAgICBxID0gZzNbYjEwICsgYnowXTsgdiA9IHJ4MSAqIHFbMF0gKyByeTAgKiBxWzFdICsgcnowICogcVsyXTsKLSAgICBhID0gbGVycGYodSwgdiwgdCk7Ci0gICAgCi0gICAgcSA9IGczW2IwMSArIGJ6MF07IHUgPSByeDAgKiBxWzBdICsgcnkxICogcVsxXSArIHJ6MCAqIHFbMl07Ci0gICAgcSA9IGczW2IxMSArIGJ6MF07IHYgPSByeDEgKiBxWzBdICsgcnkxICogcVsxXSArIHJ6MCAqIHFbMl07Ci0gICAgYiA9IGxlcnBmKHUsIHYsIHQpOwotICAgIAotICAgIGMgPSBsZXJwZihhLCBiLCBzeSk7Ci0gICAgCi0gICAgcSA9IGczW2IwMCArIGJ6MV07IHUgPSByeDAgKiBxWzBdICsgcnkwICogcVsxXSArIHJ6MSAqIHFbMl07Ci0gICAgcSA9IGczW2IxMCArIGJ6MV07IHYgPSByeDEgKiBxWzBdICsgcnkwICogcVsxXSArIHJ6MSAqIHFbMl07Ci0gICAgYSA9IGxlcnBmKHUsIHYsIHQpOwotICAgIAotICAgIHEgPSBnM1tiMDEgKyBiejFdOyB1ID0gcngwICogcVswXSArIHJ5MSAqIHFbMV0gKyByejEgKiBxWzJdOwotICAgIHEgPSBnM1tiMTEgKyBiejFdOyB2ID0gcngxICogcVswXSArIHJ5MSAqIHFbMV0gKyByejEgKiBxWzJdOwotICAgIGIgPSBsZXJwZih1LCB2LCB0KTsKLSAgICAKLSAgICBkID0gbGVycGYoYSwgYiwgc3kpOwotICAgIAotICAgIHJldHVybiAxLjVmKmxlcnBmKGMsIGQsIHN6KTsKLX0KLQotZmxvYXQgU0NfdHVyYnVsZW5jZWYyKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IG9jdGF2ZXMpCi17Ci0gICAgc3JhbmQodGltZShOVUxMKSk7Ci0gICAgZmxvYXQgdCA9IDAuMGY7Ci0gICAgCi0gICAgZm9yIChmbG9hdCBmID0gMS4wZjsgZiA8PSBvY3RhdmVzOyBmICo9IDIpCi0gICAgICAgIHQgKz0gZmFicyhTQ19ub2lzZWYyKGYgKiB4LCBmICogeSkpIC8gZjsKLSAgICByZXR1cm4gdDsKLX0KLQotZmxvYXQgU0NfdHVyYnVsZW5jZWYzKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IG9jdGF2ZXMpCi17Ci0gICAgc3JhbmQodGltZShOVUxMKSk7Ci0gICAgZmxvYXQgdCA9IDAuMGY7Ci0gICAgCi0gICAgZm9yIChmbG9hdCBmID0gMS4wZjsgZiA8PSBvY3RhdmVzOyBmICo9IDIpCi0gICAgICAgIHQgKz0gZmFicyhTQ19ub2lzZWYzKGYgKiB4LCBmICogeSwgZiAqIHopKSAvIGY7Ci0gICAgcmV0dXJuIHQ7Ci19Ci0KLX0KLX0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNOb2lzZS5oIGIvbGlicy9ycy9yc05vaXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNDA3NTEuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9yc05vaXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1JTX05PSVNFX0gKLSNkZWZpbmUgQU5EUk9JRF9SU19OT0lTRV9ICi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7Ci0KLXZvaWQgU0Nfbm9ybWFsaXplZjIoZmxvYXQgdltdKTsKLXZvaWQgU0Nfbm9ybWFsaXplZjMoZmxvYXQgdltdKTsKLWZsb2F0IFNDX25vaXNlZihmbG9hdCB4KTsKLWZsb2F0IFNDX25vaXNlZjIoZmxvYXQgeCwgZmxvYXQgeSk7Ci1mbG9hdCBTQ19ub2lzZWYzKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopOwotZmxvYXQgU0NfdHVyYnVsZW5jZWYyKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IG9jdGF2ZXMpOwotZmxvYXQgU0NfdHVyYnVsZW5jZWYzKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IG9jdGF2ZXMpOwotCi19Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc09iamVjdEJhc2UuY3BwIGIvbGlicy9ycy9yc09iamVjdEJhc2UuY3BwCmluZGV4IDY3NzQxM2UuLmY2OWNiMTUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNPYmplY3RCYXNlLmNwcAorKysgYi9saWJzL3JzL3JzT2JqZWN0QmFzZS5jcHAKQEAgLTE1LDcgKzE1LDEyIEBACiAgKi8KIAogI2luY2x1ZGUgInJzT2JqZWN0QmFzZS5oIgorCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0yNCw3ICsyOSw2IEBACiB7CiAgICAgbVVzZXJSZWZDb3VudCA9IDA7CiAgICAgbVN5c1JlZkNvdW50ID0gMDsKLSAgICBtTmFtZSA9IE5VTEw7CiAgICAgbVJTQyA9IE5VTEw7CiAgICAgbU5leHQgPSBOVUxMOwogICAgIG1QcmV2ID0gTlVMTDsKQEAgLTM5LDE0ICs0MywxMyBAQAogICAgIHJzQXNzZXJ0KCFtVXNlclJlZkNvdW50KTsKICAgICByc0Fzc2VydCghbVN5c1JlZkNvdW50KTsKICAgICByZW1vdmUoKTsKLSAgICBkZWxldGVbXSBtTmFtZTsKIH0KIAogdm9pZCBPYmplY3RCYXNlOjpkdW1wTE9HVihjb25zdCBjaGFyICpvcCkgY29uc3QKIHsKLSAgICBpZiAobU5hbWUpIHsKKyAgICBpZiAobU5hbWUuc2l6ZSgpKSB7CiAgICAgICAgIExPR1YoIiVzIFJTb2JqICVwLCBuYW1lICVzLCByZWZzICVpLCVpICBmcm9tICVzLCVpIGxpbmtzICVwLCVwLCVwIiwKLSAgICAgICAgICAgICBvcCwgdGhpcywgbU5hbWUsIG1Vc2VyUmVmQ291bnQsIG1TeXNSZWZDb3VudCwgbUFsbG9jRmlsZSwgbUFsbG9jTGluZSwgbU5leHQsIG1QcmV2LCBtUlNDKTsKKyAgICAgICAgICAgICBvcCwgdGhpcywgbU5hbWUuc3RyaW5nKCksIG1Vc2VyUmVmQ291bnQsIG1TeXNSZWZDb3VudCwgbUFsbG9jRmlsZSwgbUFsbG9jTGluZSwgbU5leHQsIG1QcmV2LCBtUlNDKTsKICAgICB9IGVsc2UgewogICAgICAgICBMT0dWKCIlcyBSU29iaiAlcCwgbm8tbmFtZSwgcmVmcyAlaSwlaSAgZnJvbSAlcywlaSBsaW5rcyAlcCwlcCwlcCIsCiAgICAgICAgICAgICAgb3AsIHRoaXMsIG1Vc2VyUmVmQ291bnQsIG1TeXNSZWZDb3VudCwgbUFsbG9jRmlsZSwgbUFsbG9jTGluZSwgbU5leHQsIG1QcmV2LCBtUlNDKTsKQEAgLTU4LDYgKzYxLDcgQEAKICAgICBpZiAobVJTQykgewogICAgICAgICByZW1vdmUoKTsKICAgICB9CisgICAgcnNBc3NlcnQocnNjKTsKICAgICBtUlNDID0gcnNjOwogICAgIGlmIChyc2MpIHsKICAgICAgICAgYWRkKCk7CkBAIC0xMTMsMTggKzExNywxMiBAQAogCiB2b2lkIE9iamVjdEJhc2U6OnNldE5hbWUoY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgICBzZXROYW1lKG5hbWUsIHN0cmxlbihuYW1lKSk7CisgICAgbU5hbWUuc2V0VG8obmFtZSk7CiB9CiAKIHZvaWQgT2JqZWN0QmFzZTo6c2V0TmFtZShjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBsZW4pCiB7Ci0gICAgZGVsZXRlIG1OYW1lOwotICAgIG1OYW1lID0gTlVMTDsKLSAgICBpZiAobmFtZSkgewotICAgICAgICBtTmFtZSA9IG5ldyBjaGFyW2xlbiArIDFdOwotICAgICAgICBtZW1jcHkobU5hbWUsIG5hbWUsIGxlbik7Ci0gICAgICAgIG1OYW1lW2xlbl0gPSAwOwotICAgIH0KKyAgICBtTmFtZS5zZXRUbyhuYW1lLCBsZW4pOwogfQogCiB2b2lkIE9iamVjdEJhc2U6OmFkZCgpIGNvbnN0CkBAIC0xOTcsMyArMTk1LDE1IEBACiAgICAgfQogfQogCitib29sIE9iamVjdEJhc2U6OmlzVmFsaWQoY29uc3QgQ29udGV4dCAqcnNjLCBjb25zdCBPYmplY3RCYXNlICpvYmopCit7CisgICAgY29uc3QgT2JqZWN0QmFzZSAqIG8gPSByc2MtPm1PYmpIZWFkOworICAgIHdoaWxlIChvKSB7CisgICAgICAgIGlmIChvID09IG9iaikgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbyA9IG8tPm1OZXh0OworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNPYmplY3RCYXNlLmggYi9saWJzL3JzL3JzT2JqZWN0QmFzZS5oCmluZGV4IGJiMDNiODcuLjU5ZmI0YTYgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNPYmplY3RCYXNlLmgKKysrIGIvbGlicy9ycy9yc09iamVjdEJhc2UuaApAQCAtMjQsNiArMjQsNyBAQAogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKIGNsYXNzIENvbnRleHQ7CitjbGFzcyBPU3RyZWFtOwogCiAvLyBBbiBlbGVtZW50IGlzIGEgZ3JvdXAgb2YgQ29tcG9uZW50cyB0aGF0IG9jY3VwaWVzIG9uZSBjZWxsIGluIGEgc3RydWN0dXJlLgogY2xhc3MgT2JqZWN0QmFzZQpAQCAtNDAsNyArNDEsNyBAQAogICAgIGJvb2wgemVyb1VzZXJSZWYoKSBjb25zdDsKIAogICAgIGNvbnN0IGNoYXIgKiBnZXROYW1lKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgICAgIHJldHVybiBtTmFtZS5zdHJpbmcoKTsKICAgICB9CiAgICAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIgKik7CiAgICAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIgKiwgdWludDMyX3QgbGVuKTsKQEAgLTUyLDYgKzUzLDEwIEBACiAgICAgc3RhdGljIHZvaWQgZHVtcEFsbChDb250ZXh0ICpyc2MpOwogCiAgICAgdmlydHVhbCB2b2lkIGR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgPSAwOworCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDb250ZXh0ICpyc2MsIGNvbnN0IE9iamVjdEJhc2UgKm9iaik7CiAKIHByb3RlY3RlZDoKICAgICBjb25zdCBjaGFyICptQWxsb2NGaWxlOwpAQCAtNjQsNyArNjksNyBAQAogCiAgICAgYm9vbCBjaGVja0RlbGV0ZSgpIGNvbnN0OwogCi0gICAgY2hhciAqIG1OYW1lOworICAgIFN0cmluZzggbU5hbWU7CiAgICAgbXV0YWJsZSBpbnQzMl90IG1TeXNSZWZDb3VudDsKICAgICBtdXRhYmxlIGludDMyX3QgbVVzZXJSZWZDb3VudDsKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW0uY3BwIGIvbGlicy9ycy9yc1Byb2dyYW0uY3BwCmluZGV4IDcwZTI4NjguLjEwZTAwZTYgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtLmNwcAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbS5jcHAKQEAgLTE0LDE2ICsxNCwyMSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtLmgiCi0KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CiAKLQogUHJvZ3JhbTo6UHJvZ3JhbShDb250ZXh0ICpyc2MpIDogT2JqZWN0QmFzZShyc2MpCiB7CiAgICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOwpAQCAtMzIsNyArMzcsMTAgQEAKICAgICBtU2hhZGVySUQgPSAwOwogICAgIG1BdHRyaWJDb3VudCA9IDA7CiAgICAgbVVuaWZvcm1Db3VudCA9IDA7CisgICAgbVRleHR1cmVDb3VudCA9IDA7CiAKKyAgICBtVGV4dHVyZXMgPSBOVUxMOworICAgIG1TYW1wbGVycyA9IE5VTEw7CiAgICAgbUlucHV0RWxlbWVudHMgPSBOVUxMOwogICAgIG1PdXRwdXRFbGVtZW50cyA9IE5VTEw7CiAgICAgbUNvbnN0YW50VHlwZXMgPSBOVUxMOwpAQCAtNDAsNiArNDgsNyBAQAogICAgIG1PdXRwdXRDb3VudCA9IDA7CiAgICAgbUNvbnN0YW50Q291bnQgPSAwOwogICAgIG1Jc1ZhbGlkID0gZmFsc2U7CisgICAgbUlzSW50ZXJuYWwgPSBmYWxzZTsKIH0KIAogUHJvZ3JhbTo6UHJvZ3JhbShDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIgKiBzaGFkZXJUZXh0LCB1aW50MzJfdCBzaGFkZXJMZW5ndGgsCkBAIC03Myw2ICs4Miw4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBtVGV4dHVyZXMgPSBuZXcgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPlttVGV4dHVyZUNvdW50XTsKKyAgICBtU2FtcGxlcnMgPSBuZXcgT2JqZWN0QmFzZVJlZjxTYW1wbGVyPlttVGV4dHVyZUNvdW50XTsKICAgICBtSW5wdXRFbGVtZW50cyA9IG5ldyBPYmplY3RCYXNlUmVmPEVsZW1lbnQ+W21JbnB1dENvdW50XTsKICAgICBtT3V0cHV0RWxlbWVudHMgPSBuZXcgT2JqZWN0QmFzZVJlZjxFbGVtZW50PlttT3V0cHV0Q291bnRdOwogICAgIG1Db25zdGFudFR5cGVzID0gbmV3IE9iamVjdEJhc2VSZWY8VHlwZT5bbUNvbnN0YW50Q291bnRdOwpAQCAtOTEsMTUgKzEwMiwzNyBAQAogICAgICAgICAgICAgbUNvbnN0YW50VHlwZXNbY29uc3RhbnQrK10uc2V0KHJlaW50ZXJwcmV0X2Nhc3Q8VHlwZSAqPihwYXJhbXNbY3QrMV0pKTsKICAgICAgICAgfQogICAgIH0KKyAgICBtSXNJbnRlcm5hbCA9IGZhbHNlOworICAgIHVpbnQzMl90IGludGVybmFsVG9rZW5MZW4gPSBzdHJsZW4oUlNfU0hBREVSX0lOVEVSTkFMKTsKKyAgICBpZihzaGFkZXJMZW5ndGggPiBpbnRlcm5hbFRva2VuTGVuICYmCisgICAgICAgc3RybmNtcChSU19TSEFERVJfSU5URVJOQUwsIHNoYWRlclRleHQsIGludGVybmFsVG9rZW5MZW4pID09IDApIHsKKyAgICAgICAgbUlzSW50ZXJuYWwgPSB0cnVlOworICAgICAgICBzaGFkZXJUZXh0ICs9IGludGVybmFsVG9rZW5MZW47CisgICAgICAgIHNoYWRlckxlbmd0aCAtPSBpbnRlcm5hbFRva2VuTGVuOworICAgIH0KICAgICBtVXNlclNoYWRlci5zZXRUbyhzaGFkZXJUZXh0LCBzaGFkZXJMZW5ndGgpOwogfQogCiBQcm9ncmFtOjp+UHJvZ3JhbSgpCiB7Ci0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IE1BWF9VTklGT1JNUzsgY3QrKykgewotICAgICAgICBiaW5kQWxsb2NhdGlvbihOVUxMLCBjdCk7CisgICAgaWYobVJTQy0+cHJvcHMubUxvZ1NoYWRlcnMpIHsKKyAgICAgICAgTE9HVigiUHJvZ3JhbTo6flByb2dyYW0gd2l0aCBzaGFkZXIgaWQgJXUiLCBtU2hhZGVySUQpOwogICAgIH0KIAorICAgIGlmKG1TaGFkZXJJRCkgeworICAgICAgICBnbERlbGV0ZVNoYWRlcihtU2hhZGVySUQpOworICAgIH0KKworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBNQVhfVU5JRk9STVM7IGN0KyspIHsKKyAgICAgICAgYmluZEFsbG9jYXRpb24oTlVMTCwgTlVMTCwgY3QpOworICAgIH0KKworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVGV4dHVyZUNvdW50OyBjdCsrKSB7CisgICAgICAgIGJpbmRUZXh0dXJlKE5VTEwsIGN0LCBOVUxMKTsKKyAgICAgICAgYmluZFNhbXBsZXIoTlVMTCwgY3QsIE5VTEwpOworICAgIH0KKyAgICBkZWxldGVbXSBtVGV4dHVyZXM7CisgICAgZGVsZXRlW10gbVNhbXBsZXJzOwogICAgIGRlbGV0ZVtdIG1JbnB1dEVsZW1lbnRzOwogICAgIGRlbGV0ZVtdIG1PdXRwdXRFbGVtZW50czsKICAgICBkZWxldGVbXSBtQ29uc3RhbnRUeXBlczsKQEAgLTEwOSw4ICsxNDIsMjIgQEAKIH0KIAogCi12b2lkIFByb2dyYW06OmJpbmRBbGxvY2F0aW9uKEFsbG9jYXRpb24gKmFsbG9jLCB1aW50MzJfdCBzbG90KQordm9pZCBQcm9ncmFtOjpiaW5kQWxsb2NhdGlvbihDb250ZXh0ICpyc2MsIEFsbG9jYXRpb24gKmFsbG9jLCB1aW50MzJfdCBzbG90KQogeworICAgIGlmIChhbGxvYyAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzbG90ID49IG1Db25zdGFudENvdW50KSB7CisgICAgICAgICAgICBMT0dFKCJBdHRlbXB0IHRvIGJpbmQgYWxsb2MgYXQgc2xvdCAldSwgb24gc2hhZGVyIGlkICV1LCBidXQgY29uc3QgY291bnQgaXMgJXUiLAorICAgICAgICAgICAgICAgICBzbG90LCAodWludDMyX3QpdGhpcywgbUNvbnN0YW50Q291bnQpOworICAgICAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0hBREVSLCAiQ2Fubm90IGJpbmQgYWxsb2NhdGlvbiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghYWxsb2MtPmdldFR5cGUoKS0+aXNFcXVhbChtQ29uc3RhbnRUeXBlc1tzbG90XS5nZXQoKSkpIHsKKyAgICAgICAgICAgIExPR0UoIkF0dGVtcHQgdG8gYmluZCBhbGxvYyBhdCBzbG90ICV1LCBvbiBzaGFkZXIgaWQgJXUsIGJ1dCB0eXBlcyBtaXNtYXRjaCIsCisgICAgICAgICAgICAgICAgIHNsb3QsICh1aW50MzJfdCl0aGlzKTsKKyAgICAgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1NIQURFUiwgIkNhbm5vdCBiaW5kIGFsbG9jYXRpb24iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KICAgICBpZiAobUNvbnN0YW50c1tzbG90XS5nZXQoKSA9PSBhbGxvYykgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTI0LDEwICsxNzEsMTEgQEAKICAgICBtRGlydHkgPSB0cnVlOwogfQogCi12b2lkIFByb2dyYW06OmJpbmRUZXh0dXJlKHVpbnQzMl90IHNsb3QsIEFsbG9jYXRpb24gKmEpCit2b2lkIFByb2dyYW06OmJpbmRUZXh0dXJlKENvbnRleHQgKnJzYywgdWludDMyX3Qgc2xvdCwgQWxsb2NhdGlvbiAqYSkKIHsKLSAgICBpZiAoc2xvdCA+PSBNQVhfVEVYVFVSRSkgewotICAgICAgICBMT0dFKCJBdHRlbXB0IHRvIGJpbmQgYSB0ZXh0dXJlIHRvIGEgc2xvdCA+IE1BWF9URVhUVVJFIik7CisgICAgaWYgKHNsb3QgPj0gbVRleHR1cmVDb3VudCkgeworICAgICAgICBMT0dFKCJBdHRlbXB0IHRvIGJpbmQgdGV4dHVyZSB0byBzbG90ICV1IGJ1dCB0ZXggY291bnQgaXMgJXUiLCBzbG90LCBtVGV4dHVyZUNvdW50KTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0hBREVSLCAiQ2Fubm90IGJpbmQgdGV4dHVyZSIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0xMzYsMTAgKzE4NCwxMSBAQAogICAgIG1EaXJ0eSA9IHRydWU7CiB9CiAKLXZvaWQgUHJvZ3JhbTo6YmluZFNhbXBsZXIodWludDMyX3Qgc2xvdCwgU2FtcGxlciAqcykKK3ZvaWQgUHJvZ3JhbTo6YmluZFNhbXBsZXIoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBzbG90LCBTYW1wbGVyICpzKQogewotICAgIGlmIChzbG90ID49IE1BWF9URVhUVVJFKSB7Ci0gICAgICAgIExPR0UoIkF0dGVtcHQgdG8gYmluZCBhIFNhbXBsZXIgdG8gYSBzbG90ID4gTUFYX1RFWFRVUkUiKTsKKyAgICBpZiAoc2xvdCA+PSBtVGV4dHVyZUNvdW50KSB7CisgICAgICAgIExPR0UoIkF0dGVtcHQgdG8gYmluZCBzYW1wbGVyIHRvIHNsb3QgJXUgYnV0IHRleCBjb3VudCBpcyAldSIsIHNsb3QsIG1UZXh0dXJlQ291bnQpOworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TSEFERVIsICJDYW5ub3QgYmluZCBzYW1wbGVyIik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTIzNSw3ICsyODQsMTU5IEBACiAgICAgbVVzZXJTaGFkZXIuc2V0VG8odHh0LCBsZW4pOwogfQogCit2b2lkIFByb2dyYW06OmFwcGVuZFVzZXJDb25zdGFudHMoKSB7CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1Db25zdGFudENvdW50OyBjdCsrKSB7CisgICAgICAgIGNvbnN0IEVsZW1lbnQgKmUgPSBtQ29uc3RhbnRUeXBlc1tjdF0tPmdldEVsZW1lbnQoKTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBmaWVsZD0wOyBmaWVsZCA8IGUtPmdldEZpZWxkQ291bnQoKTsgZmllbGQrKykgeworICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZiA9IGUtPmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZuID0gZS0+Z2V0RmllbGROYW1lKGZpZWxkKTsKIAorICAgICAgICAgICAgaWYgKGZuWzBdID09ICcjJykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDYW5ub3QgYmUgY29tcGxleAorICAgICAgICAgICAgcnNBc3NlcnQoIWYtPmdldEZpZWxkQ291bnQoKSk7CisgICAgICAgICAgICBpZihmLT5nZXRUeXBlKCkgPT0gUlNfVFlQRV9NQVRSSVhfNFg0KSB7CisgICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoInVuaWZvcm0gbWF0NCBVTklfIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGYtPmdldFR5cGUoKSA9PSBSU19UWVBFX01BVFJJWF8zWDMpIHsKKyAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSBtYXQzIFVOSV8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoZi0+Z2V0VHlwZSgpID09IFJTX1RZUEVfTUFUUklYXzJYMikgeworICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIG1hdDIgVU5JXyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoKGYtPmdldENvbXBvbmVudCgpLmdldFZlY3RvclNpemUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgMTogbVNoYWRlci5hcHBlbmQoInVuaWZvcm0gZmxvYXQgVU5JXyIpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6IG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIHZlYzIgVU5JXyIpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6IG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIHZlYzMgVU5JXyIpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6IG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIHZlYzQgVU5JXyIpOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByc0Fzc2VydCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKGZuKTsKKyAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCI7XG4iKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBQcm9ncmFtOjpzZXR1cFVzZXJDb25zdGFudHMoQ29udGV4dCAqcnNjLCBTaGFkZXJDYWNoZSAqc2MsIGJvb2wgaXNGcmFnbWVudCkgeworICAgIHVpbnQzMl90IHVpZHggPSAwOworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ29uc3RhbnRDb3VudDsgY3QrKykgeworICAgICAgICBBbGxvY2F0aW9uICphbGxvYyA9IG1Db25zdGFudHNbY3RdLmdldCgpOworICAgICAgICBpZiAoIWFsbG9jKSB7CisgICAgICAgICAgICBMT0dFKCJBdHRlbXB0aW5nIHRvIHNldCBjb25zdGFudHMgb24gc2hhZGVyIGlkICV1LCBidXQgYWxsb2MgYXQgc2xvdCAldSBpcyBub3Qgc2V0IiwgKHVpbnQzMl90KXRoaXMsIGN0KTsKKyAgICAgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1NIQURFUiwgIk5vIGNvbnN0YW50IGFsbG9jYXRpb24gYm91bmQiKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oYWxsb2MtPmdldFB0cigpKTsKKyAgICAgICAgY29uc3QgRWxlbWVudCAqZSA9IG1Db25zdGFudFR5cGVzW2N0XS0+Z2V0RWxlbWVudCgpOworICAgICAgICBmb3IgKHVpbnQzMl90IGZpZWxkPTA7IGZpZWxkIDwgZS0+Z2V0RmllbGRDb3VudCgpOyBmaWVsZCsrKSB7CisgICAgICAgICAgICBjb25zdCBFbGVtZW50ICpmID0gZS0+Z2V0RmllbGQoZmllbGQpOworICAgICAgICAgICAgY29uc3QgY2hhciAqZmllbGROYW1lID0gZS0+Z2V0RmllbGROYW1lKGZpZWxkKTsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgZmllbGQgaXMgcGFkZGluZywgc2tpcCBpdAorICAgICAgICAgICAgaWYoZmllbGROYW1lWzBdID09ICcjJykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSBlLT5nZXRGaWVsZE9mZnNldEJ5dGVzKGZpZWxkKTsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpmZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKj4oJmRhdGFbb2Zmc2V0XSk7CisKKyAgICAgICAgICAgIGludDMyX3Qgc2xvdCA9IC0xOworICAgICAgICAgICAgaWYoIWlzRnJhZ21lbnQpIHsKKyAgICAgICAgICAgICAgICBzbG90ID0gc2MtPnZ0eFVuaWZvcm1TbG90KHVpZHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc2xvdCA9IHNjLT5mcmFnVW5pZm9ybVNsb3QodWlkeCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHJzYy0+cHJvcHMubUxvZ1NoYWRlcnNVbmlmb3JtcykgeworICAgICAgICAgICAgICAgIExPR1YoIlVuaWZvcm0gIHNsb3Q9JWksIG9mZnNldD0laSwgY29uc3RhbnQ9JWksIGZpZWxkPSVpLCB1aWR4PSVpLCBuYW1lPSVzIiwgc2xvdCwgb2Zmc2V0LCBjdCwgZmllbGQsIHVpZHgsIGZpZWxkTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2xvdCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYoZi0+Z2V0VHlwZSgpID09IFJTX1RZUEVfTUFUUklYXzRYNCkgeworICAgICAgICAgICAgICAgICAgICBpZihyc2MtPnByb3BzLm1Mb2dTaGFkZXJzVW5pZm9ybXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIk1hdHJpeDR4NCIpOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HVigieyVmLCAlZiwgJWYsICVmIiwgIGZkWzBdLCBmZFs0XSwgZmRbOF0sIGZkWzEyXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCIgJWYsICVmLCAlZiwgJWYiLCAgZmRbMV0sIGZkWzVdLCBmZFs5XSwgZmRbMTNdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIiAlZiwgJWYsICVmLCAlZiIsICBmZFsyXSwgZmRbNl0sIGZkWzEwXSwgZmRbMTRdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIiAlZiwgJWYsICVmLCAlZn0iLCBmZFszXSwgZmRbN10sIGZkWzExXSwgZmRbMTVdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBnbFVuaWZvcm1NYXRyaXg0ZnYoc2xvdCwgMSwgR0xfRkFMU0UsIGZkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihmLT5nZXRUeXBlKCkgPT0gUlNfVFlQRV9NQVRSSVhfM1gzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKHJzYy0+cHJvcHMubUxvZ1NoYWRlcnNVbmlmb3JtcykgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HVigiTWF0cml4M3gzIik7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCJ7JWYsICVmLCAlZiIsICBmZFswXSwgZmRbM10sIGZkWzZdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIiAlZiwgJWYsICVmIiwgIGZkWzFdLCBmZFs0XSwgZmRbN10pOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HVigiICVmLCAlZiwgJWZ9IiwgZmRbMl0sIGZkWzVdLCBmZFs4XSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtTWF0cml4M2Z2KHNsb3QsIDEsIEdMX0ZBTFNFLCBmZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoZi0+Z2V0VHlwZSgpID09IFJTX1RZUEVfTUFUUklYXzJYMikgeworICAgICAgICAgICAgICAgICAgICBpZihyc2MtPnByb3BzLm1Mb2dTaGFkZXJzVW5pZm9ybXMpeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HVigiTWF0cml4MngyIik7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCJ7JWYsICVmIiwgIGZkWzBdLCBmZFsyXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCIgJWYsICVmfSIsIGZkWzFdLCBmZFszXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtTWF0cml4MmZ2KHNsb3QsIDEsIEdMX0ZBTFNFLCBmZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2goZi0+Z2V0Q29tcG9uZW50KCkuZ2V0VmVjdG9yU2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJzYy0+cHJvcHMubUxvZ1NoYWRlcnNVbmlmb3JtcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIlVuaWZvcm0gMSA9ICVmIiwgZmRbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtMWZ2KHNsb3QsIDEsIGZkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBpZihyc2MtPnByb3BzLm1Mb2dTaGFkZXJzVW5pZm9ybXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCJVbmlmb3JtIDIgPSAlZiAlZiIsIGZkWzBdLCBmZFsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBnbFVuaWZvcm0yZnYoc2xvdCwgMSwgZmQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJzYy0+cHJvcHMubUxvZ1NoYWRlcnNVbmlmb3JtcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIlVuaWZvcm0gMyA9ICVmICVmICVmIiwgZmRbMF0sIGZkWzFdLCBmZFsyXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBnbFVuaWZvcm0zZnYoc2xvdCwgMSwgZmQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJzYy0+cHJvcHMubUxvZ1NoYWRlcnNVbmlmb3JtcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIlVuaWZvcm0gNCA9ICVmICVmICVmICVmIiwgZmRbMF0sIGZkWzFdLCBmZFsyXSwgZmRbM10pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtNGZ2KHNsb3QsIDEsIGZkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcnNBc3NlcnQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aWR4ICsrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFByb2dyYW06OmluaXRBZGRVc2VyRWxlbWVudChjb25zdCBFbGVtZW50ICplLCBTdHJpbmc4ICpuYW1lcywgdWludDMyX3QgKmNvdW50LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisgICAgcnNBc3NlcnQoZS0+Z2V0RmllbGRDb3VudCgpKTsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgZS0+Z2V0RmllbGRDb3VudCgpOyBjdCsrKSB7CisgICAgICAgIGNvbnN0IEVsZW1lbnQgKmNlID0gZS0+Z2V0RmllbGQoY3QpOworICAgICAgICBpZiAoY2UtPmdldEZpZWxkQ291bnQoKSkgeworICAgICAgICAgICAgaW5pdEFkZFVzZXJFbGVtZW50KGNlLCBuYW1lcywgY291bnQsIHByZWZpeCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihlLT5nZXRGaWVsZE5hbWUoY3QpWzBdICE9ICcjJykgeworICAgICAgICAgICAgU3RyaW5nOCB0bXAocHJlZml4KTsKKyAgICAgICAgICAgIHRtcC5hcHBlbmQoZS0+Z2V0RmllbGROYW1lKGN0KSk7CisgICAgICAgICAgICBuYW1lc1sqY291bnRdLnNldFRvKHRtcC5zdHJpbmcoKSk7CisgICAgICAgICAgICAoKmNvdW50KSsrOworICAgICAgICB9CisgICAgfQorfQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKQEAgLTI0NCwxOSArNDQ1LDE5IEBACiB2b2lkIHJzaV9Qcm9ncmFtQmluZENvbnN0YW50cyhDb250ZXh0ICpyc2MsIFJzUHJvZ3JhbSB2cCwgdWludDMyX3Qgc2xvdCwgUnNBbGxvY2F0aW9uIGNvbnN0YW50cykKIHsKICAgICBQcm9ncmFtICpwID0gc3RhdGljX2Nhc3Q8UHJvZ3JhbSAqPih2cCk7Ci0gICAgcC0+YmluZEFsbG9jYXRpb24oc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPihjb25zdGFudHMpLCBzbG90KTsKKyAgICBwLT5iaW5kQWxsb2NhdGlvbihyc2MsIHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4oY29uc3RhbnRzKSwgc2xvdCk7CiB9CiAKIHZvaWQgcnNpX1Byb2dyYW1CaW5kVGV4dHVyZShDb250ZXh0ICpyc2MsIFJzUHJvZ3JhbSB2cGYsIHVpbnQzMl90IHNsb3QsIFJzQWxsb2NhdGlvbiBhKQogewogICAgIFByb2dyYW0gKnAgPSBzdGF0aWNfY2FzdDxQcm9ncmFtICo+KHZwZik7Ci0gICAgcC0+YmluZFRleHR1cmUoc2xvdCwgc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPihhKSk7CisgICAgcC0+YmluZFRleHR1cmUocnNjLCBzbG90LCBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KGEpKTsKIH0KIAogdm9pZCByc2lfUHJvZ3JhbUJpbmRTYW1wbGVyKENvbnRleHQgKnJzYywgUnNQcm9ncmFtIHZwZiwgdWludDMyX3Qgc2xvdCwgUnNTYW1wbGVyIHMpCiB7CiAgICAgUHJvZ3JhbSAqcCA9IHN0YXRpY19jYXN0PFByb2dyYW0gKj4odnBmKTsKLSAgICBwLT5iaW5kU2FtcGxlcihzbG90LCBzdGF0aWNfY2FzdDxTYW1wbGVyICo+KHMpKTsKKyAgICBwLT5iaW5kU2FtcGxlcihyc2MsIHNsb3QsIHN0YXRpY19jYXN0PFNhbXBsZXIgKj4ocykpOwogfQogCiB9CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbS5oIGIvbGlicy9ycy9yc1Byb2dyYW0uaAppbmRleCA4NmY4NWZiLi5jOTMwMzNiIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbS5oCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtLmgKQEAgLTIzLDI5ICsyMywzMCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKLQotCiBjbGFzcyBTaGFkZXJDYWNoZTsKIAorI2RlZmluZSBSU19TSEFERVJfSU5URVJOQUwgIi8vcnNfc2hhZGVyX2ludGVybmFsXG4iCisjZGVmaW5lIFJTX1NIQURFUl9BVFRSICJBVFRSSUJfIgorI2RlZmluZSBSU19TSEFERVJfVU5JICJVTklfIgorCiBjbGFzcyBQcm9ncmFtIDogcHVibGljIE9iamVjdEJhc2UKIHsKIHB1YmxpYzoKICAgICBjb25zdCBzdGF0aWMgdWludDMyX3QgTUFYX0FUVFJJQlMgPSA4OwogICAgIGNvbnN0IHN0YXRpYyB1aW50MzJfdCBNQVhfVU5JRk9STVMgPSAxNjsKLSAgICBjb25zdCBzdGF0aWMgdWludDMyX3QgTUFYX1RFWFRVUkUgPSAyOwogCiAgICAgUHJvZ3JhbShDb250ZXh0ICopOwogICAgIFByb2dyYW0oQ29udGV4dCAqLCBjb25zdCBjaGFyICogc2hhZGVyVGV4dCwgdWludDMyX3Qgc2hhZGVyTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqIHBhcmFtcywgdWludDMyX3QgcGFyYW1MZW5ndGgpOwogICAgIHZpcnR1YWwgflByb2dyYW0oKTsKIAotICAgIHZvaWQgYmluZEFsbG9jYXRpb24oQWxsb2NhdGlvbiAqLCB1aW50MzJfdCBzbG90KTsKKyAgICB2b2lkIGJpbmRBbGxvY2F0aW9uKENvbnRleHQgKiwgQWxsb2NhdGlvbiAqLCB1aW50MzJfdCBzbG90KTsKICAgICB2aXJ0dWFsIHZvaWQgY3JlYXRlU2hhZGVyKCk7CiAKLSAgICBib29sIGlzVXNlclByb2dyYW0oKSBjb25zdCB7cmV0dXJuIG1Vc2VyU2hhZGVyLnNpemUoKSA+IDA7fQorICAgIGJvb2wgaXNVc2VyUHJvZ3JhbSgpIGNvbnN0IHtyZXR1cm4gIW1Jc0ludGVybmFsO30KIAotICAgIHZvaWQgYmluZFRleHR1cmUodWludDMyX3Qgc2xvdCwgQWxsb2NhdGlvbiAqKTsKLSAgICB2b2lkIGJpbmRTYW1wbGVyKHVpbnQzMl90IHNsb3QsIFNhbXBsZXIgKik7CisgICAgdm9pZCBiaW5kVGV4dHVyZShDb250ZXh0ICosIHVpbnQzMl90IHNsb3QsIEFsbG9jYXRpb24gKik7CisgICAgdm9pZCBiaW5kU2FtcGxlcihDb250ZXh0ICosIHVpbnQzMl90IHNsb3QsIFNhbXBsZXIgKik7CiAKICAgICB1aW50MzJfdCBnZXRTaGFkZXJJRCgpIGNvbnN0IHtyZXR1cm4gbVNoYWRlcklEO30KICAgICB2b2lkIHNldFNoYWRlcihjb25zdCBjaGFyICosIHVpbnQzMl90IGxlbik7CkBAIC03MSw2ICs3MiwxMiBAQAogICAgIHVpbnQzMl90IG1PdXRwdXRDb3VudDsKICAgICB1aW50MzJfdCBtQ29uc3RhbnRDb3VudDsKICAgICBib29sIG1Jc1ZhbGlkOworICAgIGJvb2wgbUlzSW50ZXJuYWw7CisKKyAgICAvLyBBcHBsaWVzIHRvIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVycyBvbmx5CisgICAgdm9pZCBhcHBlbmRVc2VyQ29uc3RhbnRzKCk7CisgICAgdm9pZCBzZXR1cFVzZXJDb25zdGFudHMoQ29udGV4dCAqcnNjLCBTaGFkZXJDYWNoZSAqc2MsIGJvb2wgaXNGcmFnbWVudCk7CisgICAgdm9pZCBpbml0QWRkVXNlckVsZW1lbnQoY29uc3QgRWxlbWVudCAqZSwgU3RyaW5nOCAqbmFtZXMsIHVpbnQzMl90ICpjb3VudCwgY29uc3QgY2hhciAqcHJlZml4KTsKIAogICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbUNvbnN0YW50c1tNQVhfVU5JRk9STVNdOwogCkBAIC05MSw4ICs5OCw4IEBACiAgICAgLy8gYW5kIGZpbHRlcmVkLgogICAgIC8vCiAgICAgLy8gQ29uc3RhbnRzIGFyZSBzdHJpY3RseSBhY2Nlc3NlZCBieSBwcm9ncmFtZXRpYyBsb2Fkcy4KLSAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1UZXh0dXJlc1tNQVhfVEVYVFVSRV07Ci0gICAgT2JqZWN0QmFzZVJlZjxTYW1wbGVyPiBtU2FtcGxlcnNbTUFYX1RFWFRVUkVdOworICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gKm1UZXh0dXJlczsKKyAgICBPYmplY3RCYXNlUmVmPFNhbXBsZXI+ICptU2FtcGxlcnM7CiAKICAgICBib29sIGxvYWRTaGFkZXIoQ29udGV4dCAqLCB1aW50MzJfdCB0eXBlKTsKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudC5jcHAgYi9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmNwcAppbmRleCBjMTdiOTRjLi44MWI0ZmE0IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmNwcAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmNwcApAQCAtMTQsNDIgKzE0LDIzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKLSNpbmNsdWRlICJyc1Byb2dyYW1GcmFnbWVudC5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKIAotCi1Qcm9ncmFtRnJhZ21lbnQ6OlByb2dyYW1GcmFnbWVudChDb250ZXh0ICpyc2MsIGNvbnN0IHVpbnQzMl90ICogcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFyYW1MZW5ndGgpIDoKLSAgICBQcm9ncmFtKHJzYykKLXsKLSAgICBtQWxsb2NGaWxlID0gX19GSUxFX187Ci0gICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwotICAgIHJzQXNzZXJ0KHBhcmFtTGVuZ3RoID0gNSk7Ci0KLSAgICBtRW52TW9kZXNbMF0gPSAoUnNUZXhFbnZNb2RlKXBhcmFtc1swXTsKLSAgICBtVGV4dHVyZUZvcm1hdHNbMF0gPSBwYXJhbXNbMV07Ci0gICAgbUVudk1vZGVzWzFdID0gKFJzVGV4RW52TW9kZSlwYXJhbXNbMl07Ci0gICAgbVRleHR1cmVGb3JtYXRzWzFdID0gcGFyYW1zWzNdOwotICAgIG1Qb2ludFNwcml0ZUVuYWJsZSA9IHBhcmFtc1s0XSAhPSAwOwotCi0gICAgbVRleHR1cmVFbmFibGVNYXNrID0gMDsKLSAgICBpZiAobUVudk1vZGVzWzBdKSB7Ci0gICAgICAgIG1UZXh0dXJlRW5hYmxlTWFzayB8PSAxOwotICAgIH0KLSAgICBpZiAobUVudk1vZGVzWzFdKSB7Ci0gICAgICAgIG1UZXh0dXJlRW5hYmxlTWFzayB8PSAyOwotICAgIH0KLSAgICBpbml0KHJzYyk7Ci19Ci0KIFByb2dyYW1GcmFnbWVudDo6UHJvZ3JhbUZyYWdtZW50KENvbnRleHQgKnJzYywgY29uc3QgY2hhciAqIHNoYWRlclRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaGFkZXJMZW5ndGgsIGNvbnN0IHVpbnQzMl90ICogcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFyYW1MZW5ndGgpIDoKQEAgLTU4LDEwMCArMzksNjggQEAKICAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CiAgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwogCi0gICAgaW5pdChyc2MpOwotICAgIG1UZXh0dXJlRW5hYmxlTWFzayA9ICgxIDw8IG1UZXh0dXJlQ291bnQpIC0xOwotfQorICAgIG1Db25zdGFudENvbG9yWzBdID0gMS5mOworICAgIG1Db25zdGFudENvbG9yWzFdID0gMS5mOworICAgIG1Db25zdGFudENvbG9yWzJdID0gMS5mOworICAgIG1Db25zdGFudENvbG9yWzNdID0gMS5mOwogCisgICAgaW5pdChyc2MpOworfQogCiBQcm9ncmFtRnJhZ21lbnQ6On5Qcm9ncmFtRnJhZ21lbnQoKQogeworICAgIGlmKG1TaGFkZXJJRCkgeworICAgICAgICBtUlNDLT5tU2hhZGVyQ2FjaGUuY2xlYW51cEZyYWdtZW50KG1TaGFkZXJJRCk7CisgICAgfQogfQogCi12b2lkIFByb2dyYW1GcmFnbWVudDo6c2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1GcmFnbWVudFN0YXRlICpzdGF0ZSkKK3ZvaWQgUHJvZ3JhbUZyYWdtZW50OjpzZXRDb25zdGFudENvbG9yKENvbnRleHQgKnJzYywgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKIHsKKyAgICBpZihpc1VzZXJQcm9ncmFtKCkpIHsKKyAgICAgICAgTE9HRSgiQXR0ZW1wdGluZyB0byBzZXQgZml4ZWQgZnVuY3Rpb24gZW11bGF0aW9uIGNvbG9yIG9uIHVzZXIgcHJvZ3JhbSIpOworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TSEFERVIsICJDYW5ub3QgIHNldCBmaXhlZCBmdW5jdGlvbiBlbXVsYXRpb24gY29sb3Igb24gdXNlciBwcm9ncmFtIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYobUNvbnN0YW50c1swXS5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlVuYWJsZSB0byBzZXQgZml4ZWQgZnVuY3Rpb24gZW11bGF0aW9uIGNvbG9yIGJlY2F1c2UgYWxsb2NhdGlvbiBpcyBtaXNzaW5nIik7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1NIQURFUiwgIlVuYWJsZSB0byBzZXQgZml4ZWQgZnVuY3Rpb24gZW11bGF0aW9uIGNvbG9yIGJlY2F1c2UgYWxsb2NhdGlvbiBpcyBtaXNzaW5nIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUNvbnN0YW50Q29sb3JbMF0gPSByOworICAgIG1Db25zdGFudENvbG9yWzFdID0gZzsKKyAgICBtQ29uc3RhbnRDb2xvclsyXSA9IGI7CisgICAgbUNvbnN0YW50Q29sb3JbM10gPSBhOworICAgIG1lbWNweShtQ29uc3RhbnRzWzBdLT5nZXRQdHIoKSwgbUNvbnN0YW50Q29sb3IsIDQqc2l6ZW9mKGZsb2F0KSk7CisgICAgbURpcnR5ID0gdHJ1ZTsKK30KKwordm9pZCBQcm9ncmFtRnJhZ21lbnQ6OnNldHVwR0wyKENvbnRleHQgKnJzYywgUHJvZ3JhbUZyYWdtZW50U3RhdGUgKnN0YXRlLCBTaGFkZXJDYWNoZSAqc2MpCit7CisgICAgLy9MT0dFKCJzZ2wyIGZyYWcxICV4IiwgZ2xHZXRFcnJvcigpKTsKICAgICBpZiAoKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSAmJiAhbURpcnR5KSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKIAotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBNQVhfVEVYVFVSRTsgY3QrKykgewotICAgICAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTAgKyBjdCk7Ci0gICAgICAgIGlmICghKG1UZXh0dXJlRW5hYmxlTWFzayAmICgxIDw8IGN0KSkgfHwgIW1UZXh0dXJlc1tjdF0uZ2V0KCkpIHsKLSAgICAgICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7Ci0gICAgICAgIGlmIChyc2MtPmNoZWNrVmVyc2lvbjFfMSgpKSB7Ci0gICAgICAgICAgICBpZiAobVBvaW50U3ByaXRlRW5hYmxlKSB7Ci0gICAgICAgICAgICAgICAgZ2xFbmFibGUoR0xfUE9JTlRfU1BSSVRFX09FUyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGdsRGlzYWJsZShHTF9QT0lOVF9TUFJJVEVfT0VTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9QT0lOVF9TUFJJVEVfT0VTLCBHTF9DT09SRF9SRVBMQUNFX09FUywgbVBvaW50U3ByaXRlRW5hYmxlKTsKLSAgICAgICAgfQotICAgICAgICBtVGV4dHVyZXNbY3RdLT51cGxvYWRDaGVjayhyc2MpOwotICAgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1UZXh0dXJlc1tjdF0tPmdldFRleHR1cmVJRCgpKTsKLQotICAgICAgICBzd2l0Y2gobUVudk1vZGVzW2N0XSkgewotICAgICAgICBjYXNlIFJTX1RFWF9FTlZfTU9ERV9OT05FOgotICAgICAgICAgICAgcnNBc3NlcnQoMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSU19URVhfRU5WX01PREVfUkVQTEFDRToKLSAgICAgICAgICAgIGdsVGV4RW52ZihHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSU19URVhfRU5WX01PREVfTU9EVUxBVEU6Ci0gICAgICAgICAgICBnbFRleEVudmYoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX01PRFVMQVRFKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJTX1RFWF9FTlZfTU9ERV9ERUNBTDoKLSAgICAgICAgICAgIGdsVGV4RW52ZihHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfREVDQUwpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVNhbXBsZXJzW2N0XS5nZXQoKSkgewotICAgICAgICAgICAgbVNhbXBsZXJzW2N0XS0+c2V0dXBHTChyc2MsIG1UZXh0dXJlc1tjdF0tPmdldFR5cGUoKS0+Z2V0SXNOcDIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKLSAgICAgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOwotICAgICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9SRVBFQVQpOwotICAgICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9SRVBFQVQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR3Jvc3MgaGFjay4KLSAgICAgICAgaWYgKGN0ID09IDIpIHsKLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfQ09NQklORSk7Ci0KLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfQ09NQklORV9SR0IsIEdMX0FERCk7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX1NSQzBfUkdCLCBHTF9QUkVWSU9VUyk7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX1NSQzFfUkdCLCBHTF9URVhUVVJFKTsKLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfT1BFUkFORDBfUkdCLCBHTF9TUkNfQ09MT1IpOwotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9PUEVSQU5EMV9SR0IsIEdMX1NSQ19DT0xPUik7Ci0KLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfQ09NQklORV9BTFBIQSwgR0xfQUREKTsKLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfU1JDMF9BTFBIQSwgR0xfUFJFVklPVVMpOwotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9TUkMxX0FMUEhBLCBHTF9URVhUVVJFKTsKLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfT1BFUkFORDBfQUxQSEEsIEdMX1NSQ19BTFBIQSk7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX09QRVJBTkQxX0FMUEhBLCBHTF9TUkNfQUxQSEEpOwotICAgICAgICB9Ci0gICAgfQotICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7Ci0gICAgbURpcnR5ID0gZmFsc2U7Ci0gICAgcnNjLT5jaGVja0Vycm9yKCJQcm9ncmFtRnJhZ21lbnQ6OnNldHVwR0wiKTsKLX0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnQ6OnNldHVwR0wyKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbUZyYWdtZW50U3RhdGUgKnN0YXRlLCBTaGFkZXJDYWNoZSAqc2MpCi17Ci0KLSAgICAvL0xPR0UoInNnbDIgZnJhZzEgJXgiLCBnbEdldEVycm9yKCkpOwotICAgIGlmICgoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpICYmICFtRGlydHkpIHsKLSAgICAgICAgLy9yZXR1cm47Ci0gICAgfQotICAgIHN0YXRlLT5tTGFzdC5zZXQodGhpcyk7Ci0KICAgICByc2MtPmNoZWNrRXJyb3IoIlByb2dyYW1GcmFnbWVudDo6c2V0dXBHTDIgc3RhcnQiKTsKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgTUFYX1RFWFRVUkU7IGN0KyspIHsKKworICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbUZyYWdtZW50OjpzZXR1cEdMMiBiZWdpbiB1bmlmb3JtcyIpOworICAgIHNldHVwVXNlckNvbnN0YW50cyhyc2MsIHNjLCB0cnVlKTsKKworICAgIHVpbnQzMl90IG51bVRleHR1cmVzVG9CaW5kID0gbVRleHR1cmVDb3VudDsKKyAgICB1aW50MzJfdCBudW1UZXh0dXJlc0F2YWlsYWJsZSA9IHJzYy0+Z2V0TWF4RnJhZ21lbnRUZXh0dXJlcygpOworICAgIGlmKG51bVRleHR1cmVzVG9CaW5kID49IG51bVRleHR1cmVzQXZhaWxhYmxlKSB7CisgICAgICAgIExPR0UoIkF0dGVtcHRpbmcgdG8gYmluZCAldSB0ZXh0dXJlcyBvbiBzaGFkZXIgaWQgJXUsIGJ1dCBvbmx5ICV1IGFyZSBhdmFpbGFibGUiLAorICAgICAgICAgICAgIG1UZXh0dXJlQ291bnQsICh1aW50MzJfdCl0aGlzLCBudW1UZXh0dXJlc0F2YWlsYWJsZSk7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1NIQURFUiwgIkNhbm5vdCBiaW5kIG1vcmUgdGV4dHVlcnMgdGhhbiBhdmFpbGFibGUiKTsKKyAgICAgICAgbnVtVGV4dHVyZXNUb0JpbmQgPSBudW1UZXh0dXJlc0F2YWlsYWJsZTsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbnVtVGV4dHVyZXNUb0JpbmQ7IGN0KyspIHsKICAgICAgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwICsgY3QpOwotICAgICAgICBpZiAoIShtVGV4dHVyZUVuYWJsZU1hc2sgJiAoMSA8PCBjdCkpIHx8ICFtVGV4dHVyZXNbY3RdLmdldCgpKSB7CisgICAgICAgIGlmICghbVRleHR1cmVzW2N0XS5nZXQoKSkgeworICAgICAgICAgICAgTE9HRSgiTm8gdGV4dHVyZSBib3VuZCBmb3Igc2hhZGVyIGlkICV1LCB0ZXh0dXJlIHVuaXQgJXUiLCAodWludCl0aGlzLCBjdCk7CisgICAgICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TSEFERVIsICJObyB0ZXh0dXJlIGJvdW5kIik7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCkBAIC0xNTksMTYgKzEwOCwxNiBAQAogICAgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1UZXh0dXJlc1tjdF0tPmdldFRleHR1cmVJRCgpKTsKICAgICAgICAgcnNjLT5jaGVja0Vycm9yKCJQcm9ncmFtRnJhZ21lbnQ6OnNldHVwR0wyIHRleCBiaW5kIik7CiAgICAgICAgIGlmIChtU2FtcGxlcnNbY3RdLmdldCgpKSB7Ci0gICAgICAgICAgICBtU2FtcGxlcnNbY3RdLT5zZXR1cEdMKHJzYywgbVRleHR1cmVzW2N0XS0+Z2V0VHlwZSgpLT5nZXRJc05wMigpKTsKKyAgICAgICAgICAgIG1TYW1wbGVyc1tjdF0tPnNldHVwR0wocnNjLCBtVGV4dHVyZXNbY3RdLmdldCgpKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOwogICAgICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX1JFUEVBVCk7Ci0gICAgICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX1JFUEVBVCk7CisgICAgICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKICAgICAgICAgICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbUZyYWdtZW50OjpzZXR1cEdMMiB0ZXggZW52Iik7CiAgICAgICAgIH0KIAotICAgICAgICBnbFVuaWZvcm0xaShzYy0+ZnJhZ1VuaWZvcm1TbG90KGN0KSwgY3QpOworICAgICAgICBnbFVuaWZvcm0xaShzYy0+ZnJhZ1VuaWZvcm1TbG90KG1UZXh0dXJlVW5pZm9ybUluZGV4U3RhcnQgKyBjdCksIGN0KTsKICAgICAgICAgcnNjLT5jaGVja0Vycm9yKCJQcm9ncmFtRnJhZ21lbnQ6OnNldHVwR0wyIHVuaWZvcm1zIik7CiAgICAgfQogCkBAIC0xODMsMTEyICsxMzIsNDkgQEAKIAogdm9pZCBQcm9ncmFtRnJhZ21lbnQ6OmNyZWF0ZVNoYWRlcigpCiB7Ci0gICAgbVNoYWRlci5zZXRUbygicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iKTsKLSAgICBtU2hhZGVyLmFwcGVuZCgidmFyeWluZyB2ZWM0IHZhckNvbG9yO1xuIik7Ci0gICAgbVNoYWRlci5hcHBlbmQoInZhcnlpbmcgdmVjNCB2YXJUZXgwO1xuIik7Ci0KICAgICBpZiAobVVzZXJTaGFkZXIubGVuZ3RoKCkgPiAxKSB7CisgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIpOworICAgICAgICBhcHBlbmRVc2VyQ29uc3RhbnRzKCk7CisgICAgICAgIGNoYXIgYnVmWzI1Nl07CiAgICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVGV4dHVyZUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICBjaGFyIGJ1ZlsyNTZdOwotICAgICAgICAgICAgc3ByaW50ZihidWYsICJ1bmlmb3JtIHNhbXBsZXIyRCB1bmlfVGV4JWk7XG4iLCBjdCk7CisgICAgICAgICAgICBzcHJpbnRmKGJ1ZiwgInVuaWZvcm0gc2FtcGxlcjJEIFVOSV9UZXglaTtcbiIsIGN0KTsKICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKGJ1Zik7CiAgICAgICAgIH0KLQogICAgICAgICBtU2hhZGVyLmFwcGVuZChtVXNlclNoYWRlcik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgdWludDMyX3QgbWFzayA9IG1UZXh0dXJlRW5hYmxlTWFzazsKLSAgICAgICAgdWludDMyX3QgdGV4TnVtID0gMDsKLSAgICAgICAgd2hpbGUgKG1hc2spIHsKLSAgICAgICAgICAgIGlmIChtYXNrICYgMSkgewotICAgICAgICAgICAgICAgIGNoYXIgYnVmWzY0XTsKLSAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSBzYW1wbGVyMkQgdW5pX1RleCIpOwotICAgICAgICAgICAgICAgIHNwcmludGYoYnVmLCAiJWkiLCB0ZXhOdW0pOwotICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKGJ1Zik7Ci0gICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIjtcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWFzayA+Pj0gMTsKLSAgICAgICAgICAgIHRleE51bSsrOwotICAgICAgICB9Ci0KLQotICAgICAgICBtU2hhZGVyLmFwcGVuZCgidm9pZCBtYWluKCkge1xuIik7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIHZlYzQgY29sID0gdmFyQ29sb3I7XG4iKTsKLQotICAgICAgICBpZiAobVRleHR1cmVFbmFibGVNYXNrKSB7Ci0gICAgICAgICAgICBpZiAobVBvaW50U3ByaXRlRW5hYmxlKSB7Ci0gICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgdmVjMiB0MCA9IGdsX1BvaW50Q29vcmQ7XG4iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgdmVjMiB0MCA9IHZhclRleDAueHk7XG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1hc2sgPSBtVGV4dHVyZUVuYWJsZU1hc2s7Ci0gICAgICAgIHRleE51bSA9IDA7Ci0gICAgICAgIHdoaWxlIChtYXNrKSB7Ci0gICAgICAgICAgICBpZiAobWFzayAmIDEpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2gobUVudk1vZGVzW3RleE51bV0pIHsKLSAgICAgICAgICAgICAgICBjYXNlIFJTX1RFWF9FTlZfTU9ERV9OT05FOgotICAgICAgICAgICAgICAgICAgICByc0Fzc2VydCgwKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSU19URVhfRU5WX01PREVfUkVQTEFDRToKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1UZXh0dXJlRm9ybWF0c1t0ZXhOdW1dKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGNvbC5hID0gdGV4dHVyZTJEKHVuaV9UZXgwLCB0MCkuYTtcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGNvbC5yZ2JhID0gdGV4dHVyZTJEKHVuaV9UZXgwLCB0MCkucmdiYTtcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGNvbC5yZ2IgPSB0ZXh0dXJlMkQodW5pX1RleDAsIHQwKS5yZ2I7XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBjb2wucmdiYSA9IHRleHR1cmUyRCh1bmlfVGV4MCwgdDApLnJnYmE7XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUlNfVEVYX0VOVl9NT0RFX01PRFVMQVRFOgotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobVRleHR1cmVGb3JtYXRzW3RleE51bV0pIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgY29sLmEgKj0gdGV4dHVyZTJEKHVuaV9UZXgwLCB0MCkuYTtcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGNvbC5yZ2JhICo9IHRleHR1cmUyRCh1bmlfVGV4MCwgdDApLnJnYmE7XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBjb2wucmdiICo9IHRleHR1cmUyRCh1bmlfVGV4MCwgdDApLnJnYjtcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGNvbC5yZ2JhICo9IHRleHR1cmUyRCh1bmlfVGV4MCwgdDApLnJnYmE7XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUlNfVEVYX0VOVl9NT0RFX0RFQ0FMOgotICAgICAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBjb2wgPSB0ZXh0dXJlMkQodW5pX1RleDAsIHQwKTtcbiIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hc2sgPj49IDE7Ci0gICAgICAgICAgICB0ZXhOdW0rKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vbVNoYWRlci5hcHBlbmQoIiAgY29sLmEgPSAxLjA7XG4iKTsKLSAgICAgICAgLy9tU2hhZGVyLmFwcGVuZCgiICBjb2wuciA9IDAuNTtcbiIpOwotCi0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGdsX0ZyYWdDb2xvciA9IGNvbDtcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgifVxuIik7CisgICAgICAgIExPR0UoIlByb2dyYW1GcmFnbWVudDo6Y3JlYXRlU2hhZGVyIGNhbm5vdCBjcmVhdGUgcHJvZ3JhbSwgc2hhZGVyIGNvZGUgbm90IGRlZmluZWQiKTsKKyAgICAgICAgcnNBc3NlcnQoMCk7CiAgICAgfQogfQogCiB2b2lkIFByb2dyYW1GcmFnbWVudDo6aW5pdChDb250ZXh0ICpyc2MpCiB7Ci0gICAgbVVuaWZvcm1Db3VudCA9IDI7Ci0gICAgbVVuaWZvcm1OYW1lc1swXS5zZXRUbygidW5pX1RleDAiKTsKLSAgICBtVW5pZm9ybU5hbWVzWzFdLnNldFRvKCJ1bmlfVGV4MSIpOworICAgIG1Vbmlmb3JtQ291bnQgPSAwOworICAgIGlmIChtVXNlclNoYWRlci5zaXplKCkgPiAwKSB7CisgICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ29uc3RhbnRDb3VudDsgY3QrKykgeworICAgICAgICAgICAgaW5pdEFkZFVzZXJFbGVtZW50KG1Db25zdGFudFR5cGVzW2N0XS0+Z2V0RWxlbWVudCgpLCBtVW5pZm9ybU5hbWVzLCAmbVVuaWZvcm1Db3VudCwgUlNfU0hBREVSX1VOSSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbVRleHR1cmVVbmlmb3JtSW5kZXhTdGFydCA9IG1Vbmlmb3JtQ291bnQ7CisgICAgY2hhciBidWZbMjU2XTsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVRleHR1cmVDb3VudDsgY3QrKykgeworICAgICAgICBzcHJpbnRmKGJ1ZiwgIlVOSV9UZXglaSIsIGN0KTsKKyAgICAgICAgbVVuaWZvcm1OYW1lc1ttVW5pZm9ybUNvdW50KytdLnNldFRvKGJ1Zik7CisgICAgfQogCiAgICAgY3JlYXRlU2hhZGVyKCk7CiB9CiAKK3ZvaWQgUHJvZ3JhbUZyYWdtZW50OjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworCit9CisKK1Byb2dyYW1GcmFnbWVudCAqUHJvZ3JhbUZyYWdtZW50OjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIHJldHVybiBOVUxMOworfQorCiBQcm9ncmFtRnJhZ21lbnRTdGF0ZTo6UHJvZ3JhbUZyYWdtZW50U3RhdGUoKQogewogICAgIG1QRiA9IE5VTEw7CkBAIC0zMDAsMTYgKzE4NiwzOSBAQAogCiB9CiAKLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RhdGU6OmluaXQoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCkKK3ZvaWQgUHJvZ3JhbUZyYWdtZW50U3RhdGU6OmluaXQoQ29udGV4dCAqcnNjKQogewotICAgIHVpbnQzMl90IHRtcFs1XSA9IHsKLSAgICAgICAgUlNfVEVYX0VOVl9NT0RFX05PTkUsIDAsCi0gICAgICAgIFJTX1RFWF9FTlZfTU9ERV9OT05FLCAwLAotICAgICAgICAwCi0gICAgfTsKLSAgICBQcm9ncmFtRnJhZ21lbnQgKnBmID0gbmV3IFByb2dyYW1GcmFnbWVudChyc2MsIHRtcCwgNSk7CisgICAgU3RyaW5nOCBzaGFkZXJTdHJpbmcoUlNfU0hBREVSX0lOVEVSTkFMKTsKKyAgICBzaGFkZXJTdHJpbmcuYXBwZW5kKCJ2YXJ5aW5nIGxvd3AgdmVjNCB2YXJDb2xvcjtcbiIpOworICAgIHNoYWRlclN0cmluZy5hcHBlbmQoInZhcnlpbmcgdmVjMiB2YXJUZXgwO1xuIik7CisgICAgc2hhZGVyU3RyaW5nLmFwcGVuZCgidm9pZCBtYWluKCkge1xuIik7CisgICAgc2hhZGVyU3RyaW5nLmFwcGVuZCgiICBsb3dwIHZlYzQgY29sID0gVU5JX0NvbG9yO1xuIik7CisgICAgc2hhZGVyU3RyaW5nLmFwcGVuZCgiICBnbF9GcmFnQ29sb3IgPSBjb2w7XG4iKTsKKyAgICBzaGFkZXJTdHJpbmcuYXBwZW5kKCJ9XG4iKTsKKworICAgIGNvbnN0IEVsZW1lbnQgKmNvbG9yRWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShyc2MsIFJTX1RZUEVfRkxPQVRfMzIsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDQpOworICAgIHJzYy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckJlZ2luKCk7CisgICAgcnNjLT5tU3RhdGVFbGVtZW50LmVsZW1lbnRCdWlsZGVyQWRkKGNvbG9yRWxlbSwgIkNvbG9yIiwgMSk7CisgICAgY29uc3QgRWxlbWVudCAqY29uc3RJbnB1dCA9IHJzYy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckNyZWF0ZShyc2MpOworCisgICAgVHlwZSAqaW5wdXRUeXBlID0gbmV3IFR5cGUocnNjKTsKKyAgICBpbnB1dFR5cGUtPnNldEVsZW1lbnQoY29uc3RJbnB1dCk7CisgICAgaW5wdXRUeXBlLT5zZXREaW1YKDEpOworICAgIGlucHV0VHlwZS0+Y29tcHV0ZSgpOworCisgICAgdWludDMyX3QgdG1wWzRdOworICAgIHRtcFswXSA9IFJTX1BST0dSQU1fUEFSQU1fQ09OU1RBTlQ7CisgICAgdG1wWzFdID0gKHVpbnQzMl90KWlucHV0VHlwZTsKKyAgICB0bXBbMl0gPSBSU19QUk9HUkFNX1BBUkFNX1RFWFRVUkVfQ09VTlQ7CisgICAgdG1wWzNdID0gMDsKKworICAgIEFsbG9jYXRpb24gKmNvbnN0QWxsb2MgPSBuZXcgQWxsb2NhdGlvbihyc2MsIGlucHV0VHlwZSk7CisgICAgUHJvZ3JhbUZyYWdtZW50ICpwZiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQocnNjLCBzaGFkZXJTdHJpbmcuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyU3RyaW5nLmxlbmd0aCgpLCB0bXAsIDQpOworICAgIHBmLT5iaW5kQWxsb2NhdGlvbihyc2MsIGNvbnN0QWxsb2MsIDApOworICAgIHBmLT5zZXRDb25zdGFudENvbG9yKHJzYywgMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisKICAgICBtRGVmYXVsdC5zZXQocGYpOwotICAgIHBmLT5pbml0KHJzYyk7CiB9CiAKIHZvaWQgUHJvZ3JhbUZyYWdtZW50U3RhdGU6OmRlaW5pdChDb250ZXh0ICpyc2MpCkBAIC0zMjIsMjEgKzIzMSwxMyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKLVJzUHJvZ3JhbUZyYWdtZW50IHJzaV9Qcm9ncmFtRnJhZ21lbnRDcmVhdGUoQ29udGV4dCAqcnNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFyYW1MZW5ndGgpCi17Ci0gICAgUHJvZ3JhbUZyYWdtZW50ICpwZiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQocnNjLCBwYXJhbXMsIHBhcmFtTGVuZ3RoKTsKLSAgICBwZi0+aW5jVXNlclJlZigpOwotICAgIHJldHVybiBwZjsKLX0KLQotUnNQcm9ncmFtRnJhZ21lbnQgcnNpX1Byb2dyYW1GcmFnbWVudENyZWF0ZTIoQ29udGV4dCAqcnNjLCBjb25zdCBjaGFyICogc2hhZGVyVGV4dCwKK1JzUHJvZ3JhbUZyYWdtZW50IHJzaV9Qcm9ncmFtRnJhZ21lbnRDcmVhdGUoQ29udGV4dCAqcnNjLCBjb25zdCBjaGFyICogc2hhZGVyVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2hhZGVyTGVuZ3RoLCBjb25zdCB1aW50MzJfdCAqIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFyYW1MZW5ndGgpCiB7CiAgICAgUHJvZ3JhbUZyYWdtZW50ICpwZiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQocnNjLCBzaGFkZXJUZXh0LCBzaGFkZXJMZW5ndGgsIHBhcmFtcywgcGFyYW1MZW5ndGgpOwogICAgIHBmLT5pbmNVc2VyUmVmKCk7CisgICAgLy9MT0dFKCJyc2lfUHJvZ3JhbUZyYWdtZW50Q3JlYXRlICVwIiwgcGYpOwogICAgIHJldHVybiBwZjsKIH0KIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudC5oIGIvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudC5oCmluZGV4IDlmYTU2NWQuLjFjZjljYTcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuaAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmgKQEAgLTI4LDI2ICsyOCwyNSBAQAogY2xhc3MgUHJvZ3JhbUZyYWdtZW50IDogcHVibGljIFByb2dyYW0KIHsKIHB1YmxpYzoKLSAgICBQcm9ncmFtRnJhZ21lbnQoQ29udGV4dCAqLCBjb25zdCB1aW50MzJfdCAqIHBhcmFtcywgdWludDMyX3QgcGFyYW1MZW5ndGgpOwogICAgIFByb2dyYW1GcmFnbWVudChDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIgKiBzaGFkZXJUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaGFkZXJMZW5ndGgsIGNvbnN0IHVpbnQzMl90ICogcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXJhbUxlbmd0aCk7CiAgICAgdmlydHVhbCB+UHJvZ3JhbUZyYWdtZW50KCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICosIFByb2dyYW1GcmFnbWVudFN0YXRlICopOwotICAgIHZpcnR1YWwgdm9pZCBzZXR1cEdMMihjb25zdCBDb250ZXh0ICosIFByb2dyYW1GcmFnbWVudFN0YXRlICosIFNoYWRlckNhY2hlICpzYyk7CisgICAgdmlydHVhbCB2b2lkIHNldHVwR0wyKENvbnRleHQgKiwgUHJvZ3JhbUZyYWdtZW50U3RhdGUgKiwgU2hhZGVyQ2FjaGUgKnNjKTsKIAogICAgIHZpcnR1YWwgdm9pZCBjcmVhdGVTaGFkZXIoKTsKICAgICB2aXJ0dWFsIHZvaWQgbG9hZFNoYWRlcihDb250ZXh0ICpyc2MpOwogICAgIHZpcnR1YWwgdm9pZCBpbml0KENvbnRleHQgKnJzYyk7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9GUkFHTUVOVDsgfQorICAgIHN0YXRpYyBQcm9ncmFtRnJhZ21lbnQgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCisgICAgdm9pZCBzZXRDb25zdGFudENvbG9yKENvbnRleHQgKiwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwogCiBwcm90ZWN0ZWQ6Ci0gICAgLy8gSGFja3MgdG8gY3JlYXRlIGEgcHJvZ3JhbSBmb3Igbm93Ci0gICAgdWludDMyX3QgbVRleHR1cmVGb3JtYXRzW01BWF9URVhUVVJFXTsKLSAgICB1aW50MzJfdCBtVGV4dHVyZURpbWVuc2lvbnNbTUFYX1RFWFRVUkVdOwotICAgIFJzVGV4RW52TW9kZSBtRW52TW9kZXNbTUFYX1RFWFRVUkVdOwotICAgIHVpbnQzMl90IG1UZXh0dXJlRW5hYmxlTWFzazsKLSAgICBib29sIG1Qb2ludFNwcml0ZUVuYWJsZTsKKyAgICBmbG9hdCBtQ29uc3RhbnRDb2xvcls0XTsKKyAgICBpbnQzMl90IG1UZXh0dXJlVW5pZm9ybUluZGV4U3RhcnQ7CiB9OwogCiBjbGFzcyBQcm9ncmFtRnJhZ21lbnRTdGF0ZQpAQCAtNTcsMTAgKzU2LDkgQEAKICAgICB+UHJvZ3JhbUZyYWdtZW50U3RhdGUoKTsKIAogICAgIFByb2dyYW1GcmFnbWVudCAqbVBGOwotICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKKyAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKICAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOwogCi0gICAgT2JqZWN0QmFzZVJlZjxUeXBlPiBtVGV4dHVyZVR5cGVzW1Byb2dyYW1GcmFnbWVudDo6TUFYX1RFWFRVUkVdOwogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50PiBtRGVmYXVsdDsKICAgICBWZWN0b3I8UHJvZ3JhbUZyYWdtZW50ICo+IG1Qcm9ncmFtczsKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudFN0b3JlLmNwcCBiL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMjE1N2YuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudFN0b3JlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInJzQ29udGV4dC5oIgotI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50U3RvcmUuaCIKLQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKLQotCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZTo6UHJvZ3JhbUZyYWdtZW50U3RvcmUoQ29udGV4dCAqcnNjKSA6Ci0gICAgUHJvZ3JhbShyc2MpCi17Ci0gICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOwotICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKLSAgICBtRGl0aGVyRW5hYmxlID0gdHJ1ZTsKLSAgICBtQmxlbmRFbmFibGUgPSBmYWxzZTsKLSAgICBtQ29sb3JSV3JpdGVFbmFibGUgPSB0cnVlOwotICAgIG1Db2xvckdXcml0ZUVuYWJsZSA9IHRydWU7Ci0gICAgbUNvbG9yQldyaXRlRW5hYmxlID0gdHJ1ZTsKLSAgICBtQ29sb3JBV3JpdGVFbmFibGUgPSB0cnVlOwotICAgIG1CbGVuZFNyYyA9IEdMX09ORTsKLSAgICBtQmxlbmREc3QgPSBHTF9aRVJPOwotCi0KLSAgICBtRGVwdGhUZXN0RW5hYmxlID0gZmFsc2U7Ci0gICAgbURlcHRoV3JpdGVFbmFibGUgPSB0cnVlOwotICAgIG1EZXB0aEZ1bmMgPSBHTF9MRVNTOwotCi0KLX0KLQotUHJvZ3JhbUZyYWdtZW50U3RvcmU6On5Qcm9ncmFtRnJhZ21lbnRTdG9yZSgpCi17Ci19Ci0KLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RvcmU6OnNldHVwR0woY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlICpzdGF0ZSkKLXsKLSAgICBpZiAoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOwotCi0gICAgZ2xDb2xvck1hc2sobUNvbG9yUldyaXRlRW5hYmxlLAotICAgICAgICAgICAgICAgIG1Db2xvckdXcml0ZUVuYWJsZSwKLSAgICAgICAgICAgICAgICBtQ29sb3JCV3JpdGVFbmFibGUsCi0gICAgICAgICAgICAgICAgbUNvbG9yQVdyaXRlRW5hYmxlKTsKLSAgICBpZiAobUJsZW5kRW5hYmxlKSB7Ci0gICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKLSAgICAgICAgZ2xCbGVuZEZ1bmMobUJsZW5kU3JjLCBtQmxlbmREc3QpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Ci0gICAgfQotCi0gICAgLy9MT0dFKCJwZnMgICVpLCAlaSwgJXgiLCBtRGVwdGhXcml0ZUVuYWJsZSwgbURlcHRoVGVzdEVuYWJsZSwgbURlcHRoRnVuYyk7Ci0KLSAgICBnbERlcHRoTWFzayhtRGVwdGhXcml0ZUVuYWJsZSk7Ci0gICAgaWYobURlcHRoVGVzdEVuYWJsZSB8fCBtRGVwdGhXcml0ZUVuYWJsZSkgewotICAgICAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKLSAgICAgICAgZ2xEZXB0aEZ1bmMobURlcHRoRnVuYyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOwotICAgIH0KLQotICAgIGlmIChtRGl0aGVyRW5hYmxlKSB7Ci0gICAgICAgIGdsRW5hYmxlKEdMX0RJVEhFUik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7Ci0gICAgfQotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXR1cEdMMihjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUgKnN0YXRlKQotewotICAgIGlmIChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN0YXRlLT5tTGFzdC5zZXQodGhpcyk7Ci0KLSAgICBnbENvbG9yTWFzayhtQ29sb3JSV3JpdGVFbmFibGUsCi0gICAgICAgICAgICAgICAgbUNvbG9yR1dyaXRlRW5hYmxlLAotICAgICAgICAgICAgICAgIG1Db2xvckJXcml0ZUVuYWJsZSwKLSAgICAgICAgICAgICAgICBtQ29sb3JBV3JpdGVFbmFibGUpOwotICAgIGlmIChtQmxlbmRFbmFibGUpIHsKLSAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOwotICAgICAgICBnbEJsZW5kRnVuYyhtQmxlbmRTcmMsIG1CbGVuZERzdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKLSAgICB9Ci0KLSAgICAvL0xPR0UoInBmcyAgJWksICVpLCAleCIsIG1EZXB0aFdyaXRlRW5hYmxlLCBtRGVwdGhUZXN0RW5hYmxlLCBtRGVwdGhGdW5jKTsKLQotICAgIGdsRGVwdGhNYXNrKG1EZXB0aFdyaXRlRW5hYmxlKTsKLSAgICBpZihtRGVwdGhUZXN0RW5hYmxlIHx8IG1EZXB0aFdyaXRlRW5hYmxlKSB7Ci0gICAgICAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOwotICAgICAgICBnbERlcHRoRnVuYyhtRGVwdGhGdW5jKTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbERpc2FibGUoR0xfREVQVEhfVEVTVCk7Ci0gICAgfQotCi0gICAgaWYgKG1EaXRoZXJFbmFibGUpIHsKLSAgICAgICAgZ2xFbmFibGUoR0xfRElUSEVSKTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbERpc2FibGUoR0xfRElUSEVSKTsKLSAgICB9Ci19Ci0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZTo6c2V0RGl0aGVyRW5hYmxlKGJvb2wgZW5hYmxlKQotewotICAgIG1EaXRoZXJFbmFibGUgPSBlbmFibGU7Ci19Ci0KLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RvcmU6OnNldERlcHRoRnVuYyhSc0RlcHRoRnVuYyBmdW5jKQotewotICAgIG1EZXB0aFRlc3RFbmFibGUgPSB0cnVlOwotCi0gICAgc3dpdGNoKGZ1bmMpIHsKLSAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfQUxXQVlTOgotICAgICAgICBtRGVwdGhUZXN0RW5hYmxlID0gZmFsc2U7Ci0gICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9BTFdBWVM7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfREVQVEhfRlVOQ19MRVNTOgotICAgICAgICBtRGVwdGhGdW5jID0gR0xfTEVTUzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19ERVBUSF9GVU5DX0xFUVVBTDoKLSAgICAgICAgbURlcHRoRnVuYyA9IEdMX0xFUVVBTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19ERVBUSF9GVU5DX0dSRUFURVI6Ci0gICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9HUkVBVEVSOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfR0VRVUFMOgotICAgICAgICBtRGVwdGhGdW5jID0gR0xfR0VRVUFMOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfRVFVQUw6Ci0gICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9FUVVBTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19ERVBUSF9GVU5DX05PVEVRVUFMOgotICAgICAgICBtRGVwdGhGdW5jID0gR0xfTk9URVFVQUw7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZTo6c2V0RGVwdGhNYXNrKGJvb2wgbWFzaykKLXsKLSAgICBtRGVwdGhXcml0ZUVuYWJsZSA9IG1hc2s7Ci19Ci0KLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RvcmU6OnNldEJsZW5kRnVuYyhSc0JsZW5kU3JjRnVuYyBzcmMsIFJzQmxlbmREc3RGdW5jIGRzdCkKLXsKLSAgICBtQmxlbmRFbmFibGUgPSB0cnVlOwotICAgIGlmICgoc3JjID09IFJTX0JMRU5EX1NSQ19PTkUpICYmCi0gICAgICAgIChkc3QgPT0gUlNfQkxFTkRfRFNUX1pFUk8pKSB7Ci0gICAgICAgIG1CbGVuZEVuYWJsZSA9IGZhbHNlOwotICAgIH0KLQotICAgIHN3aXRjaChzcmMpIHsKLSAgICBjYXNlIFJTX0JMRU5EX1NSQ19aRVJPOgotICAgICAgICBtQmxlbmRTcmMgPSBHTF9aRVJPOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX1NSQ19PTkU6Ci0gICAgICAgIG1CbGVuZFNyYyA9IEdMX09ORTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfRFNUX0NPTE9SOgotICAgICAgICBtQmxlbmRTcmMgPSBHTF9EU1RfQ09MT1I7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfU1JDX09ORV9NSU5VU19EU1RfQ09MT1I6Ci0gICAgICAgIG1CbGVuZFNyYyA9IEdMX09ORV9NSU5VU19EU1RfQ09MT1I7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfU1JDX1NSQ19BTFBIQToKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfU1JDX0FMUEhBOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX1NSQ19PTkVfTUlOVVNfU1JDX0FMUEhBOgotICAgICAgICBtQmxlbmRTcmMgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX1NSQ19EU1RfQUxQSEE6Ci0gICAgICAgIG1CbGVuZFNyYyA9IEdMX0RTVF9BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfT05FX01JTlVTX0RTVF9BTFBIQToKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfT05FX01JTlVTX0RTVF9BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfU1JDX0FMUEhBX1NBVFVSQVRFOgotICAgICAgICBtQmxlbmRTcmMgPSBHTF9TUkNfQUxQSEFfU0FUVVJBVEU7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHN3aXRjaChkc3QpIHsKLSAgICBjYXNlIFJTX0JMRU5EX0RTVF9aRVJPOgotICAgICAgICBtQmxlbmREc3QgPSBHTF9aRVJPOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX0RTVF9PTkU6Ci0gICAgICAgIG1CbGVuZERzdCA9IEdMX09ORTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfU1JDX0NPTE9SOgotICAgICAgICBtQmxlbmREc3QgPSBHTF9TUkNfQ09MT1I7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfRFNUX09ORV9NSU5VU19TUkNfQ09MT1I6Ci0gICAgICAgIG1CbGVuZERzdCA9IEdMX09ORV9NSU5VU19TUkNfQ09MT1I7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfRFNUX1NSQ19BTFBIQToKLSAgICAgICAgbUJsZW5kRHN0ID0gR0xfU1JDX0FMUEhBOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX0RTVF9PTkVfTUlOVVNfU1JDX0FMUEhBOgotICAgICAgICBtQmxlbmREc3QgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX0RTVF9EU1RfQUxQSEE6Ci0gICAgICAgIG1CbGVuZERzdCA9IEdMX0RTVF9BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfT05FX01JTlVTX0RTVF9BTFBIQToKLSAgICAgICAgbUJsZW5kRHN0ID0gR0xfT05FX01JTlVTX0RTVF9BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXRDb2xvck1hc2soYm9vbCByLCBib29sIGcsIGJvb2wgYiwgYm9vbCBhKQotewotICAgIG1Db2xvclJXcml0ZUVuYWJsZSA9IHI7Ci0gICAgbUNvbG9yR1dyaXRlRW5hYmxlID0gZzsKLSAgICBtQ29sb3JCV3JpdGVFbmFibGUgPSBiOwotICAgIG1Db2xvckFXcml0ZUVuYWJsZSA9IGE7Ci19Ci0KLQotUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZTo6UHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSgpCi17Ci0gICAgbVBGUyA9IE5VTEw7Ci19Ci0KLVByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGU6On5Qcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlKCkKLXsKLSAgICBkZWxldGUgbVBGUzsKLQotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGU6OmluaXQoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCkKLXsKLSAgICBQcm9ncmFtRnJhZ21lbnRTdG9yZSAqcGZzID0gbmV3IFByb2dyYW1GcmFnbWVudFN0b3JlKHJzYyk7Ci0gICAgbURlZmF1bHQuc2V0KHBmcyk7Ci19Ci0KLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZTo6ZGVpbml0KENvbnRleHQgKnJzYykKLXsKLSAgICBtRGVmYXVsdC5jbGVhcigpOwotICAgIG1MYXN0LmNsZWFyKCk7Ci19Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7Ci0KLXZvaWQgcnNpX1Byb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oQ29udGV4dCAqIHJzYywgUnNFbGVtZW50IGluLCBSc0VsZW1lbnQgb3V0KQotewotICAgIGRlbGV0ZSByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUzsKLSAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUyA9IG5ldyBQcm9ncmFtRnJhZ21lbnRTdG9yZShyc2MpOwotCi19Ci0KLXZvaWQgcnNpX1Byb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jKENvbnRleHQgKnJzYywgUnNEZXB0aEZ1bmMgZnVuYykKLXsKLSAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0RGVwdGhGdW5jKGZ1bmMpOwotfQotCi12b2lkIHJzaV9Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayhDb250ZXh0ICpyc2MsIGJvb2wgbWFzaykKLXsKLSAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0RGVwdGhNYXNrKG1hc2spOwotfQotCi12b2lkIHJzaV9Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzayhDb250ZXh0ICpyc2MsIGJvb2wgciwgYm9vbCBnLCBib29sIGIsIGJvb2wgYSkKLXsKLSAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0Q29sb3JNYXNrKHIsIGcsIGIsIGEpOwotfQotCi12b2lkIHJzaV9Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyhDb250ZXh0ICpyc2MsIFJzQmxlbmRTcmNGdW5jIHNyYywgUnNCbGVuZERzdEZ1bmMgZHN0KQotewotICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXRCbGVuZEZ1bmMoc3JjLCBkc3QpOwotfQotCi1Sc1Byb2dyYW1GcmFnbWVudFN0b3JlIHJzaV9Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZShDb250ZXh0ICpyc2MpCi17Ci0gICAgUHJvZ3JhbUZyYWdtZW50U3RvcmUgKnBmcyA9IHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTOwotICAgIHBmcy0+aW5jVXNlclJlZigpOwotICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTID0gMDsKLSAgICByZXR1cm4gcGZzOwotfQotCi12b2lkIHJzaV9Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlcihDb250ZXh0ICpyc2MsIGJvb2wgZW5hYmxlKQotewotICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXREaXRoZXJFbmFibGUoZW5hYmxlKTsKLX0KLQotCi19Ci19CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50U3RvcmUuaCBiL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDEyYzk5Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9SU19QUk9HUkFNX0ZSQUdNRU5UX1NUT1JFX0gKLSNkZWZpbmUgQU5EUk9JRF9SU19QUk9HUkFNX0ZSQUdNRU5UX1NUT1JFX0gKLQotI2luY2x1ZGUgInJzUHJvZ3JhbS5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi1jbGFzcyBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlOwotCi1jbGFzcyBQcm9ncmFtRnJhZ21lbnRTdG9yZSA6IHB1YmxpYyBQcm9ncmFtCi17Ci1wdWJsaWM6Ci0gICAgUHJvZ3JhbUZyYWdtZW50U3RvcmUoQ29udGV4dCAqKTsKLSAgICB2aXJ0dWFsIH5Qcm9ncmFtRnJhZ21lbnRTdG9yZSgpOwotCi0gICAgdmlydHVhbCB2b2lkIHNldHVwR0woY29uc3QgQ29udGV4dCAqLCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlICopOwotICAgIHZpcnR1YWwgdm9pZCBzZXR1cEdMMihjb25zdCBDb250ZXh0ICosIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUgKik7Ci0KLSAgICB2b2lkIHNldERlcHRoRnVuYyhSc0RlcHRoRnVuYyk7Ci0gICAgdm9pZCBzZXREZXB0aE1hc2soYm9vbCk7Ci0KLSAgICB2b2lkIHNldEJsZW5kRnVuYyhSc0JsZW5kU3JjRnVuYyBzcmMsIFJzQmxlbmREc3RGdW5jIGRzdCk7Ci0gICAgdm9pZCBzZXRDb2xvck1hc2soYm9vbCwgYm9vbCwgYm9vbCwgYm9vbCk7Ci0KLSAgICB2b2lkIHNldERpdGhlckVuYWJsZShib29sKTsKLQotcHJvdGVjdGVkOgotICAgIGJvb2wgbURpdGhlckVuYWJsZTsKLQotICAgIGJvb2wgbUJsZW5kRW5hYmxlOwotICAgIGJvb2wgbUNvbG9yUldyaXRlRW5hYmxlOwotICAgIGJvb2wgbUNvbG9yR1dyaXRlRW5hYmxlOwotICAgIGJvb2wgbUNvbG9yQldyaXRlRW5hYmxlOwotICAgIGJvb2wgbUNvbG9yQVdyaXRlRW5hYmxlOwotICAgIGludDMyX3QgbUJsZW5kU3JjOwotICAgIGludDMyX3QgbUJsZW5kRHN0OwotCi0gICAgYm9vbCBtRGVwdGhUZXN0RW5hYmxlOwotICAgIGJvb2wgbURlcHRoV3JpdGVFbmFibGU7Ci0gICAgaW50MzJfdCBtRGVwdGhGdW5jOwotCi0gICAgYm9vbCBtU3RlbmNpbFRlc3RFbmFibGU7Ci19OwotCi1jbGFzcyBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlCi17Ci1wdWJsaWM6Ci0gICAgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSgpOwotICAgIH5Qcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlKCk7Ci0gICAgdm9pZCBpbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpOwotICAgIHZvaWQgZGVpbml0KENvbnRleHQgKnJzYyk7Ci0KLSAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudFN0b3JlPiBtRGVmYXVsdDsKLSAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudFN0b3JlPiBtTGFzdDsKLQotCi0gICAgUHJvZ3JhbUZyYWdtZW50U3RvcmUgKm1QRlM7Ci19OwotCi0KLX0KLX0KLSNlbmRpZgotCi0KLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuY3BwIGIvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuY3BwCmluZGV4IDEzODg3ZDEuLjYyZDA2MGQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmNwcAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5jcHAKQEAgLTE0LDExICsxNCwxNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtUmFzdGVyLmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgPE9wZW5HbC9nbGV4dC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNQcm9ncmFtUmFzdGVyLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTM1LDkgKzQxLDggQEAKICAgICBtUG9pbnRTbW9vdGggPSBwb2ludFNtb290aDsKICAgICBtTGluZVNtb290aCA9IGxpbmVTbW9vdGg7CiAgICAgbVBvaW50U3ByaXRlID0gcG9pbnRTcHJpdGU7Ci0KLSAgICBtUG9pbnRTaXplID0gMS4wZjsKICAgICBtTGluZVdpZHRoID0gMS4wZjsKKyAgICBtQ3VsbCA9IFJTX0NVTExfQkFDSzsKIH0KIAogUHJvZ3JhbVJhc3Rlcjo6flByb2dyYW1SYXN0ZXIoKQpAQCAtNDcsNTIgKzUyLDQ3IEBACiB2b2lkIFByb2dyYW1SYXN0ZXI6OnNldExpbmVXaWR0aChmbG9hdCBzKQogewogICAgIG1MaW5lV2lkdGggPSBzOworICAgIG1EaXJ0eSA9IHRydWU7CiB9CiAKLXZvaWQgUHJvZ3JhbVJhc3Rlcjo6c2V0UG9pbnRTaXplKGZsb2F0IHMpCit2b2lkIFByb2dyYW1SYXN0ZXI6OnNldEN1bGxNb2RlKFJzQ3VsbE1vZGUgbW9kZSkKIHsKLSAgICBtUG9pbnRTaXplID0gczsKLX0KLQotdm9pZCBQcm9ncmFtUmFzdGVyOjpzZXR1cEdMKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbVJhc3RlclN0YXRlICpzdGF0ZSkKLXsKLSAgICBpZiAoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOwotCi0gICAgZ2xQb2ludFNpemUobVBvaW50U2l6ZSk7Ci0gICAgaWYgKG1Qb2ludFNtb290aCkgewotICAgICAgICBnbEVuYWJsZShHTF9QT0lOVF9TTU9PVEgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9QT0lOVF9TTU9PVEgpOwotICAgIH0KLQotICAgIGdsTGluZVdpZHRoKG1MaW5lV2lkdGgpOwotICAgIGlmIChtTGluZVNtb290aCkgewotICAgICAgICBnbEVuYWJsZShHTF9MSU5FX1NNT09USCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xEaXNhYmxlKEdMX0xJTkVfU01PT1RIKTsKLSAgICB9Ci0KLSAgICBpZiAocnNjLT5jaGVja1ZlcnNpb24xXzEoKSkgewotICAgICAgICBpZiAobVBvaW50U3ByaXRlKSB7Ci0gICAgICAgICAgICBnbEVuYWJsZShHTF9QT0lOVF9TUFJJVEVfT0VTKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdsRGlzYWJsZShHTF9QT0lOVF9TUFJJVEVfT0VTKTsKLSAgICAgICAgfQotICAgIH0KKyAgICBtQ3VsbCA9IG1vZGU7CisgICAgbURpcnR5ID0gdHJ1ZTsKIH0KIAogdm9pZCBQcm9ncmFtUmFzdGVyOjpzZXR1cEdMMihjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1SYXN0ZXJTdGF0ZSAqc3RhdGUpCiB7Ci0gICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSB7CisgICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzICYmICFtRGlydHkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOworICAgIG1EaXJ0eSA9IGZhbHNlOworCisgICAgc3dpdGNoKG1DdWxsKSB7CisgICAgICAgIGNhc2UgUlNfQ1VMTF9CQUNLOgorICAgICAgICAgICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICAgICAgICAgIGdsQ3VsbEZhY2UoR0xfQkFDSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19DVUxMX0ZST05UOgorICAgICAgICAgICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICAgICAgICAgIGdsQ3VsbEZhY2UoR0xfRlJPTlQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQ1VMTF9OT05FOgorICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CiB9CiAKK3ZvaWQgUHJvZ3JhbVJhc3Rlcjo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKIAorfQorCitQcm9ncmFtUmFzdGVyICpQcm9ncmFtUmFzdGVyOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIHJldHVybiBOVUxMOworfQogCiBQcm9ncmFtUmFzdGVyU3RhdGU6OlByb2dyYW1SYXN0ZXJTdGF0ZSgpCiB7CkBAIC0xMDIsNyArMTAyLDcgQEAKIHsKIH0KIAotdm9pZCBQcm9ncmFtUmFzdGVyU3RhdGU6OmluaXQoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCkKK3ZvaWQgUHJvZ3JhbVJhc3RlclN0YXRlOjppbml0KENvbnRleHQgKnJzYykKIHsKICAgICBQcm9ncmFtUmFzdGVyICpwciA9IG5ldyBQcm9ncmFtUmFzdGVyKHJzYywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CiAgICAgbURlZmF1bHQuc2V0KHByKTsKQEAgLTExOCw3ICsxMTgsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKLVJzUHJvZ3JhbVJhc3RlciByc2lfUHJvZ3JhbVJhc3RlckNyZWF0ZShDb250ZXh0ICogcnNjLCBSc0VsZW1lbnQgaW4sIFJzRWxlbWVudCBvdXQsCitSc1Byb2dyYW1SYXN0ZXIgcnNpX1Byb2dyYW1SYXN0ZXJDcmVhdGUoQ29udGV4dCAqIHJzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludFNtb290aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsaW5lU21vb3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50U3ByaXRlKQpAQCAtMTMxLDE4ICsxMzEsMTggQEAKICAgICByZXR1cm4gcHI7CiB9CiAKLXZvaWQgcnNpX1Byb2dyYW1SYXN0ZXJTZXRQb2ludFNpemUoQ29udGV4dCAqIHJzYywgUnNQcm9ncmFtUmFzdGVyIHZwciwgZmxvYXQgcykKLXsKLSAgICBQcm9ncmFtUmFzdGVyICpwciA9IHN0YXRpY19jYXN0PFByb2dyYW1SYXN0ZXIgKj4odnByKTsKLSAgICBwci0+c2V0UG9pbnRTaXplKHMpOwotfQotCiB2b2lkIHJzaV9Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoKENvbnRleHQgKiByc2MsIFJzUHJvZ3JhbVJhc3RlciB2cHIsIGZsb2F0IHMpCiB7CiAgICAgUHJvZ3JhbVJhc3RlciAqcHIgPSBzdGF0aWNfY2FzdDxQcm9ncmFtUmFzdGVyICo+KHZwcik7CiAgICAgcHItPnNldExpbmVXaWR0aChzKTsKIH0KIAordm9pZCByc2lfUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlKENvbnRleHQgKiByc2MsIFJzUHJvZ3JhbVJhc3RlciB2cHIsIFJzQ3VsbE1vZGUgbW9kZSkKK3sKKyAgICBQcm9ncmFtUmFzdGVyICpwciA9IHN0YXRpY19jYXN0PFByb2dyYW1SYXN0ZXIgKj4odnByKTsKKyAgICBwci0+c2V0Q3VsbE1vZGUobW9kZSk7Cit9CisKIAogfQogfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuaCBiL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmgKaW5kZXggYzNhOWM5MC4uZDVlZDY4NiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuaAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5oCkBAIC0zNCwyMSArMzQsMjAgQEAKICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRTcHJpdGUpOwogICAgIHZpcnR1YWwgflByb2dyYW1SYXN0ZXIoKTsKIAotICAgIHZpcnR1YWwgdm9pZCBzZXR1cEdMKGNvbnN0IENvbnRleHQgKiwgUHJvZ3JhbVJhc3RlclN0YXRlICopOwogICAgIHZpcnR1YWwgdm9pZCBzZXR1cEdMMihjb25zdCBDb250ZXh0ICosIFByb2dyYW1SYXN0ZXJTdGF0ZSAqKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1JBU1RFUjsgfQorICAgIHN0YXRpYyBQcm9ncmFtUmFzdGVyICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKIAogICAgIHZvaWQgc2V0TGluZVdpZHRoKGZsb2F0IHcpOwotICAgIHZvaWQgc2V0UG9pbnRTaXplKGZsb2F0IHMpOworICAgIHZvaWQgc2V0Q3VsbE1vZGUoUnNDdWxsTW9kZSBtb2RlKTsKIAogcHJvdGVjdGVkOgogICAgIGJvb2wgbVBvaW50U21vb3RoOwogICAgIGJvb2wgbUxpbmVTbW9vdGg7CiAgICAgYm9vbCBtUG9pbnRTcHJpdGU7Ci0KLSAgICBmbG9hdCBtUG9pbnRTaXplOwogICAgIGZsb2F0IG1MaW5lV2lkdGg7Ci0KLQorICAgIFJzQ3VsbE1vZGUgbUN1bGw7CiB9OwogCiBjbGFzcyBQcm9ncmFtUmFzdGVyU3RhdGUKQEAgLTU2LDcgKzU1LDcgQEAKIHB1YmxpYzoKICAgICBQcm9ncmFtUmFzdGVyU3RhdGUoKTsKICAgICB+UHJvZ3JhbVJhc3RlclN0YXRlKCk7Ci0gICAgdm9pZCBpbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpOworICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MpOwogICAgIHZvaWQgZGVpbml0KENvbnRleHQgKnJzYyk7CiAKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1SYXN0ZXI+IG1EZWZhdWx0OwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1TdG9yZS5jcHAgYi9saWJzL3JzL3JzUHJvZ3JhbVN0b3JlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjkwZDdhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1TdG9yZS5jcHAKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKyNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgPE9wZW5HbC9nbGV4dC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNQcm9ncmFtU3RvcmUuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OworCisKK1Byb2dyYW1TdG9yZTo6UHJvZ3JhbVN0b3JlKENvbnRleHQgKnJzYykgOgorICAgIFByb2dyYW0ocnNjKQoreworICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKKyAgICBtQWxsb2NMaW5lID0gX19MSU5FX187CisgICAgbURpdGhlckVuYWJsZSA9IHRydWU7CisgICAgbUJsZW5kRW5hYmxlID0gZmFsc2U7CisgICAgbUNvbG9yUldyaXRlRW5hYmxlID0gdHJ1ZTsKKyAgICBtQ29sb3JHV3JpdGVFbmFibGUgPSB0cnVlOworICAgIG1Db2xvckJXcml0ZUVuYWJsZSA9IHRydWU7CisgICAgbUNvbG9yQVdyaXRlRW5hYmxlID0gdHJ1ZTsKKyAgICBtQmxlbmRTcmMgPSBHTF9PTkU7CisgICAgbUJsZW5kRHN0ID0gR0xfWkVSTzsKKworCisgICAgbURlcHRoVGVzdEVuYWJsZSA9IGZhbHNlOworICAgIG1EZXB0aFdyaXRlRW5hYmxlID0gdHJ1ZTsKKyAgICBtRGVwdGhGdW5jID0gR0xfTEVTUzsKKworCit9CisKK1Byb2dyYW1TdG9yZTo6flByb2dyYW1TdG9yZSgpCit7Cit9CisKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXR1cEdMMihjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1TdG9yZVN0YXRlICpzdGF0ZSkKK3sKKyAgICBpZiAoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOworCisgICAgZ2xDb2xvck1hc2sobUNvbG9yUldyaXRlRW5hYmxlLAorICAgICAgICAgICAgICAgIG1Db2xvckdXcml0ZUVuYWJsZSwKKyAgICAgICAgICAgICAgICBtQ29sb3JCV3JpdGVFbmFibGUsCisgICAgICAgICAgICAgICAgbUNvbG9yQVdyaXRlRW5hYmxlKTsKKyAgICBpZiAobUJsZW5kRW5hYmxlKSB7CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgZ2xCbGVuZEZ1bmMobUJsZW5kU3JjLCBtQmxlbmREc3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgfQorCisgICAgLy9MT0dFKCJwZnMgICVpLCAlaSwgJXgiLCBtRGVwdGhXcml0ZUVuYWJsZSwgbURlcHRoVGVzdEVuYWJsZSwgbURlcHRoRnVuYyk7CisKKyAgICBnbERlcHRoTWFzayhtRGVwdGhXcml0ZUVuYWJsZSk7CisgICAgaWYobURlcHRoVGVzdEVuYWJsZSB8fCBtRGVwdGhXcml0ZUVuYWJsZSkgeworICAgICAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICAgICAgZ2xEZXB0aEZ1bmMobURlcHRoRnVuYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOworICAgIH0KKworICAgIGlmIChtRGl0aGVyRW5hYmxlKSB7CisgICAgICAgIGdsRW5hYmxlKEdMX0RJVEhFUik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7CisgICAgfQorfQorCisKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXREaXRoZXJFbmFibGUoYm9vbCBlbmFibGUpCit7CisgICAgbURpdGhlckVuYWJsZSA9IGVuYWJsZTsKK30KKwordm9pZCBQcm9ncmFtU3RvcmU6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisKK30KKworUHJvZ3JhbVN0b3JlICpQcm9ncmFtU3RvcmU6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKwordm9pZCBQcm9ncmFtU3RvcmU6OnNldERlcHRoRnVuYyhSc0RlcHRoRnVuYyBmdW5jKQoreworICAgIG1EZXB0aFRlc3RFbmFibGUgPSB0cnVlOworCisgICAgc3dpdGNoKGZ1bmMpIHsKKyAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfQUxXQVlTOgorICAgICAgICBtRGVwdGhUZXN0RW5hYmxlID0gZmFsc2U7CisgICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9BTFdBWVM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfREVQVEhfRlVOQ19MRVNTOgorICAgICAgICBtRGVwdGhGdW5jID0gR0xfTEVTUzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19ERVBUSF9GVU5DX0xFUVVBTDoKKyAgICAgICAgbURlcHRoRnVuYyA9IEdMX0xFUVVBTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19ERVBUSF9GVU5DX0dSRUFURVI6CisgICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9HUkVBVEVSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfR0VRVUFMOgorICAgICAgICBtRGVwdGhGdW5jID0gR0xfR0VRVUFMOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfRVFVQUw6CisgICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9FUVVBTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19ERVBUSF9GVU5DX05PVEVRVUFMOgorICAgICAgICBtRGVwdGhGdW5jID0gR0xfTk9URVFVQUw7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBQcm9ncmFtU3RvcmU6OnNldERlcHRoTWFzayhib29sIG1hc2spCit7CisgICAgbURlcHRoV3JpdGVFbmFibGUgPSBtYXNrOworfQorCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0QmxlbmRGdW5jKFJzQmxlbmRTcmNGdW5jIHNyYywgUnNCbGVuZERzdEZ1bmMgZHN0KQoreworICAgIG1CbGVuZEVuYWJsZSA9IHRydWU7CisgICAgaWYgKChzcmMgPT0gUlNfQkxFTkRfU1JDX09ORSkgJiYKKyAgICAgICAgKGRzdCA9PSBSU19CTEVORF9EU1RfWkVSTykpIHsKKyAgICAgICAgbUJsZW5kRW5hYmxlID0gZmFsc2U7CisgICAgfQorCisgICAgc3dpdGNoKHNyYykgeworICAgIGNhc2UgUlNfQkxFTkRfU1JDX1pFUk86CisgICAgICAgIG1CbGVuZFNyYyA9IEdMX1pFUk87CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfU1JDX09ORToKKyAgICAgICAgbUJsZW5kU3JjID0gR0xfT05FOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19EU1RfQ09MT1I6CisgICAgICAgIG1CbGVuZFNyYyA9IEdMX0RTVF9DT0xPUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9TUkNfT05FX01JTlVTX0RTVF9DT0xPUjoKKyAgICAgICAgbUJsZW5kU3JjID0gR0xfT05FX01JTlVTX0RTVF9DT0xPUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9TUkNfU1JDX0FMUEhBOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9TUkNfQUxQSEE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfU1JDX09ORV9NSU5VU19TUkNfQUxQSEE6CisgICAgICAgIG1CbGVuZFNyYyA9IEdMX09ORV9NSU5VU19TUkNfQUxQSEE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfU1JDX0RTVF9BTFBIQToKKyAgICAgICAgbUJsZW5kU3JjID0gR0xfRFNUX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19PTkVfTUlOVVNfRFNUX0FMUEhBOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19TUkNfQUxQSEFfU0FUVVJBVEU6CisgICAgICAgIG1CbGVuZFNyYyA9IEdMX1NSQ19BTFBIQV9TQVRVUkFURTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoKGRzdCkgeworICAgIGNhc2UgUlNfQkxFTkRfRFNUX1pFUk86CisgICAgICAgIG1CbGVuZERzdCA9IEdMX1pFUk87CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfRFNUX09ORToKKyAgICAgICAgbUJsZW5kRHN0ID0gR0xfT05FOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9TUkNfQ09MT1I6CisgICAgICAgIG1CbGVuZERzdCA9IEdMX1NSQ19DT0xPUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9EU1RfT05FX01JTlVTX1NSQ19DT0xPUjoKKyAgICAgICAgbUJsZW5kRHN0ID0gR0xfT05FX01JTlVTX1NSQ19DT0xPUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9EU1RfU1JDX0FMUEhBOgorICAgICAgICBtQmxlbmREc3QgPSBHTF9TUkNfQUxQSEE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfRFNUX09ORV9NSU5VU19TUkNfQUxQSEE6CisgICAgICAgIG1CbGVuZERzdCA9IEdMX09ORV9NSU5VU19TUkNfQUxQSEE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfRFNUX0RTVF9BTFBIQToKKyAgICAgICAgbUJsZW5kRHN0ID0gR0xfRFNUX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9PTkVfTUlOVVNfRFNUX0FMUEhBOgorICAgICAgICBtQmxlbmREc3QgPSBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXRDb2xvck1hc2soYm9vbCByLCBib29sIGcsIGJvb2wgYiwgYm9vbCBhKQoreworICAgIG1Db2xvclJXcml0ZUVuYWJsZSA9IHI7CisgICAgbUNvbG9yR1dyaXRlRW5hYmxlID0gZzsKKyAgICBtQ29sb3JCV3JpdGVFbmFibGUgPSBiOworICAgIG1Db2xvckFXcml0ZUVuYWJsZSA9IGE7Cit9CisKKworUHJvZ3JhbVN0b3JlU3RhdGU6OlByb2dyYW1TdG9yZVN0YXRlKCkKK3sKKyAgICBtUEZTID0gTlVMTDsKK30KKworUHJvZ3JhbVN0b3JlU3RhdGU6On5Qcm9ncmFtU3RvcmVTdGF0ZSgpCit7CisgICAgZGVsZXRlIG1QRlM7CisKK30KKwordm9pZCBQcm9ncmFtU3RvcmVTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MpCit7CisgICAgUHJvZ3JhbVN0b3JlICpwZnMgPSBuZXcgUHJvZ3JhbVN0b3JlKHJzYyk7CisgICAgbURlZmF1bHQuc2V0KHBmcyk7Cit9CisKK3ZvaWQgUHJvZ3JhbVN0b3JlU3RhdGU6OmRlaW5pdChDb250ZXh0ICpyc2MpCit7CisgICAgbURlZmF1bHQuY2xlYXIoKTsKKyAgICBtTGFzdC5jbGVhcigpOworfQorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCit2b2lkIHJzaV9Qcm9ncmFtU3RvcmVCZWdpbihDb250ZXh0ICogcnNjLCBSc0VsZW1lbnQgaW4sIFJzRWxlbWVudCBvdXQpCit7CisgICAgZGVsZXRlIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTOworICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTID0gbmV3IFByb2dyYW1TdG9yZShyc2MpOworCit9CisKK3ZvaWQgcnNpX1Byb2dyYW1TdG9yZURlcHRoRnVuYyhDb250ZXh0ICpyc2MsIFJzRGVwdGhGdW5jIGZ1bmMpCit7CisgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldERlcHRoRnVuYyhmdW5jKTsKK30KKwordm9pZCByc2lfUHJvZ3JhbVN0b3JlRGVwdGhNYXNrKENvbnRleHQgKnJzYywgYm9vbCBtYXNrKQoreworICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXREZXB0aE1hc2sobWFzayk7Cit9CisKK3ZvaWQgcnNpX1Byb2dyYW1TdG9yZUNvbG9yTWFzayhDb250ZXh0ICpyc2MsIGJvb2wgciwgYm9vbCBnLCBib29sIGIsIGJvb2wgYSkKK3sKKyAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0Q29sb3JNYXNrKHIsIGcsIGIsIGEpOworfQorCit2b2lkIHJzaV9Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMoQ29udGV4dCAqcnNjLCBSc0JsZW5kU3JjRnVuYyBzcmMsIFJzQmxlbmREc3RGdW5jIGRzdCkKK3sKKyAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0QmxlbmRGdW5jKHNyYywgZHN0KTsKK30KKworUnNQcm9ncmFtU3RvcmUgcnNpX1Byb2dyYW1TdG9yZUNyZWF0ZShDb250ZXh0ICpyc2MpCit7CisgICAgUHJvZ3JhbVN0b3JlICpwZnMgPSByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUzsKKyAgICBwZnMtPmluY1VzZXJSZWYoKTsKKyAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUyA9IDA7CisgICAgcmV0dXJuIHBmczsKK30KKwordm9pZCByc2lfUHJvZ3JhbVN0b3JlRGl0aGVyKENvbnRleHQgKnJzYywgYm9vbCBlbmFibGUpCit7CisgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldERpdGhlckVuYWJsZShlbmFibGUpOworfQorCisKK30KK30KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtU3RvcmUuaCBiL2xpYnMvcnMvcnNQcm9ncmFtU3RvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWJjZjNjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1TdG9yZS5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfUFJPR1JBTV9GUkFHTUVOVF9TVE9SRV9ICisjZGVmaW5lIEFORFJPSURfUlNfUFJPR1JBTV9GUkFHTUVOVF9TVE9SRV9ICisKKyNpbmNsdWRlICJyc1Byb2dyYW0uaCIKKyNpbmNsdWRlICJyc1N0cmVhbS5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitjbGFzcyBQcm9ncmFtU3RvcmVTdGF0ZTsKKworY2xhc3MgUHJvZ3JhbVN0b3JlIDogcHVibGljIFByb2dyYW0KK3sKK3B1YmxpYzoKKyAgICBQcm9ncmFtU3RvcmUoQ29udGV4dCAqKTsKKyAgICB2aXJ0dWFsIH5Qcm9ncmFtU3RvcmUoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXR1cEdMMihjb25zdCBDb250ZXh0ICosIFByb2dyYW1TdG9yZVN0YXRlICopOworCisgICAgdm9pZCBzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMpOworICAgIHZvaWQgc2V0RGVwdGhNYXNrKGJvb2wpOworCisgICAgdm9pZCBzZXRCbGVuZEZ1bmMoUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpOworICAgIHZvaWQgc2V0Q29sb3JNYXNrKGJvb2wsIGJvb2wsIGJvb2wsIGJvb2wpOworCisgICAgdm9pZCBzZXREaXRoZXJFbmFibGUoYm9vbCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1NUT1JFOyB9CisgICAgc3RhdGljIFByb2dyYW1TdG9yZSAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CisKK3Byb3RlY3RlZDoKKyAgICBib29sIG1EaXRoZXJFbmFibGU7CisKKyAgICBib29sIG1CbGVuZEVuYWJsZTsKKyAgICBib29sIG1Db2xvclJXcml0ZUVuYWJsZTsKKyAgICBib29sIG1Db2xvckdXcml0ZUVuYWJsZTsKKyAgICBib29sIG1Db2xvckJXcml0ZUVuYWJsZTsKKyAgICBib29sIG1Db2xvckFXcml0ZUVuYWJsZTsKKyAgICBpbnQzMl90IG1CbGVuZFNyYzsKKyAgICBpbnQzMl90IG1CbGVuZERzdDsKKworICAgIGJvb2wgbURlcHRoVGVzdEVuYWJsZTsKKyAgICBib29sIG1EZXB0aFdyaXRlRW5hYmxlOworICAgIGludDMyX3QgbURlcHRoRnVuYzsKKworICAgIGJvb2wgbVN0ZW5jaWxUZXN0RW5hYmxlOworfTsKKworY2xhc3MgUHJvZ3JhbVN0b3JlU3RhdGUKK3sKK3B1YmxpYzoKKyAgICBQcm9ncmFtU3RvcmVTdGF0ZSgpOworICAgIH5Qcm9ncmFtU3RvcmVTdGF0ZSgpOworICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MpOworICAgIHZvaWQgZGVpbml0KENvbnRleHQgKnJzYyk7CisKKyAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1TdG9yZT4gbURlZmF1bHQ7CisgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtU3RvcmU+IG1MYXN0OworCisKKyAgICBQcm9ncmFtU3RvcmUgKm1QRlM7Cit9OworCisKK30KK30KKyNlbmRpZgorCisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguY3BwIGIvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguY3BwCmluZGV4IGEyYjJkZjQuLmE3ODUyNjIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmNwcAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5jcHAKQEAgLTE0LDI4ICsxNCwyNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtVmVydGV4LmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgPE9wZW5HTC9nbGV4dC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNQcm9ncmFtVmVydGV4LmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKIAogCi1Qcm9ncmFtVmVydGV4OjpQcm9ncmFtVmVydGV4KENvbnRleHQgKnJzYywgYm9vbCB0ZXhNYXQpIDoKLSAgICBQcm9ncmFtKHJzYykKLXsKLSAgICBtQWxsb2NGaWxlID0gX19GSUxFX187Ci0gICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwotICAgIG1UZXh0dXJlTWF0cml4RW5hYmxlID0gdGV4TWF0OwotICAgIG1MaWdodENvdW50ID0gMDsKLSAgICBpbml0KHJzYyk7Ci19Ci0KIFByb2dyYW1WZXJ0ZXg6OlByb2dyYW1WZXJ0ZXgoQ29udGV4dCAqcnNjLCBjb25zdCBjaGFyICogc2hhZGVyVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2hhZGVyTGVuZ3RoLCBjb25zdCB1aW50MzJfdCAqIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFyYW1MZW5ndGgpIDoKQEAgLTQzLDY5ICszOSwxNSBAQAogewogICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKICAgICBtQWxsb2NMaW5lID0gX19MSU5FX187Ci0gICAgbVRleHR1cmVNYXRyaXhFbmFibGUgPSBmYWxzZTsKLSAgICBtTGlnaHRDb3VudCA9IDA7CiAKICAgICBpbml0KHJzYyk7CiB9CiAKIFByb2dyYW1WZXJ0ZXg6On5Qcm9ncmFtVmVydGV4KCkKIHsKLX0KLQotc3RhdGljIHZvaWQgbG9nTWF0cml4KGNvbnN0IGNoYXIgKnR4dCwgY29uc3QgZmxvYXQgKmYpCi17Ci0gICAgTE9HVigiTWF0cml4ICVzLCAlcCIsIHR4dCwgZik7Ci0gICAgTE9HVigiJTYuNGYsICU2LjRmLCAlNi40ZiwgJTYuNGYiLCBmWzBdLCBmWzRdLCBmWzhdLCBmWzEyXSk7Ci0gICAgTE9HVigiJTYuNGYsICU2LjRmLCAlNi40ZiwgJTYuNGYiLCBmWzFdLCBmWzVdLCBmWzldLCBmWzEzXSk7Ci0gICAgTE9HVigiJTYuNGYsICU2LjRmLCAlNi40ZiwgJTYuNGYiLCBmWzJdLCBmWzZdLCBmWzEwXSwgZlsxNF0pOwotICAgIExPR1YoIiU2LjRmLCAlNi40ZiwgJTYuNGYsICU2LjRmIiwgZlszXSwgZls3XSwgZlsxMV0sIGZbMTVdKTsKLX0KLQotdm9pZCBQcm9ncmFtVmVydGV4OjpzZXR1cEdMKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbVZlcnRleFN0YXRlICpzdGF0ZSkKLXsKLSAgICBpZiAoKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSAmJiAhbURpcnR5KSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZihtU2hhZGVySUQpIHsKKyAgICAgICAgbVJTQy0+bVNoYWRlckNhY2hlLmNsZWFudXBWZXJ0ZXgobVNoYWRlcklEKTsKICAgICB9Ci0gICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKLQotICAgIGNvbnN0IGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8Y29uc3QgZmxvYXQgKj4obUNvbnN0YW50c1swXS0+Z2V0UHRyKCkpOwotCi0gICAgZ2xNYXRyaXhNb2RlKEdMX1RFWFRVUkUpOwotICAgIGlmIChtVGV4dHVyZU1hdHJpeEVuYWJsZSkgewotICAgICAgICBnbExvYWRNYXRyaXhmKCZmW1JTX1BST0dSQU1fVkVSVEVYX1RFWFRVUkVfT0ZGU0VUXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICB9Ci0KLSAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKLSAgICBnbExvYWRJZGVudGl0eSgpOwotICAgIGlmIChtTGlnaHRDb3VudCkgewotICAgICAgICBpbnQgdiA9IDA7Ci0gICAgICAgIGdsRW5hYmxlKEdMX0xJR0hUSU5HKTsKLSAgICAgICAgZ2xMaWdodE1vZGVseHYoR0xfTElHSFRfTU9ERUxfVFdPX1NJREUsICZ2KTsKLSAgICAgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgbUxpZ2h0Q291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgIGNvbnN0IExpZ2h0ICpsID0gbUxpZ2h0c1tjdF0uZ2V0KCk7Ci0gICAgICAgICAgICBnbEVuYWJsZShHTF9MSUdIVDAgKyBjdCk7Ci0gICAgICAgICAgICBsLT5zZXR1cEdMKGN0KTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHVpbnQzMl90IGN0ID0gbUxpZ2h0Q291bnQ7IGN0IDwgTUFYX0xJR0hUUzsgY3QrKykgewotICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX0xJR0hUMCArIGN0KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9MSUdIVElORyk7Ci0gICAgfQotCi0gICAgaWYgKCFmKSB7Ci0gICAgICAgIExPR0UoIk11c3QgYmluZCBjb25zdGFudHMgdG8gdmVydGV4IHByb2dyYW0iKTsKLSAgICB9Ci0KLSAgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7Ci0gICAgZ2xMb2FkTWF0cml4ZigmZltSU19QUk9HUkFNX1ZFUlRFWF9QUk9KRUNUSU9OX09GRlNFVF0pOwotICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOwotICAgIGdsTG9hZE1hdHJpeGYoJmZbUlNfUFJPR1JBTV9WRVJURVhfTU9ERUxWSUVXX09GRlNFVF0pOwotCi0gICAgbURpcnR5ID0gZmFsc2U7CiB9CiAKIHZvaWQgUHJvZ3JhbVZlcnRleDo6bG9hZFNoYWRlcihDb250ZXh0ICpyc2MpIHsKQEAgLTExNCw0MiArNTYsMTkgQEAKIAogdm9pZCBQcm9ncmFtVmVydGV4OjpjcmVhdGVTaGFkZXIoKQogewotICAgIG1TaGFkZXIuc2V0VG8oIiIpOwotCi0gICAgbVNoYWRlci5hcHBlbmQoInZhcnlpbmcgdmVjNCB2YXJDb2xvcjtcbiIpOwotICAgIG1TaGFkZXIuYXBwZW5kKCJ2YXJ5aW5nIHZlYzQgdmFyVGV4MDtcbiIpOwotCiAgICAgaWYgKG1Vc2VyU2hhZGVyLmxlbmd0aCgpID4gMSkgewotICAgICAgICBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSBtYXQ0ICIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZChtVW5pZm9ybU5hbWVzWzBdKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoIjtcbiIpOwogCi0gICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ29uc3RhbnRDb3VudDsgY3QrKykgewotICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZSA9IG1Db25zdGFudFR5cGVzW2N0XS0+Z2V0RWxlbWVudCgpOwotICAgICAgICAgICAgZm9yICh1aW50MzJfdCBmaWVsZD0wOyBmaWVsZCA8IGUtPmdldEZpZWxkQ291bnQoKTsgZmllbGQrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IEVsZW1lbnQgKmYgPSBlLT5nZXRGaWVsZChmaWVsZCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBDYW5ub3QgYmUgY29tcGxleAotICAgICAgICAgICAgICAgIHJzQXNzZXJ0KCFmLT5nZXRGaWVsZENvdW50KCkpOwotICAgICAgICAgICAgICAgIHN3aXRjaChmLT5nZXRDb21wb25lbnQoKS5nZXRWZWN0b3JTaXplKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIGZsb2F0IFVOSV8iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSB2ZWMyIFVOSV8iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSB2ZWMzIFVOSV8iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OiBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSB2ZWM0IFVOSV8iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcnNBc3NlcnQoMCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoZS0+Z2V0RmllbGROYW1lKGZpZWxkKSk7Ci0gICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIjtcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KKyAgICAgICAgYXBwZW5kVXNlckNvbnN0YW50cygpOwogCiAgICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtSW5wdXRDb3VudDsgY3QrKykgewogICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZSA9IG1JbnB1dEVsZW1lbnRzW2N0XS5nZXQoKTsKICAgICAgICAgICAgIGZvciAodWludDMyX3QgZmllbGQ9MDsgZmllbGQgPCBlLT5nZXRGaWVsZENvdW50KCk7IGZpZWxkKyspIHsKICAgICAgICAgICAgICAgICBjb25zdCBFbGVtZW50ICpmID0gZS0+Z2V0RmllbGQoZmllbGQpOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZuID0gZS0+Z2V0RmllbGROYW1lKGZpZWxkKTsKKworICAgICAgICAgICAgICAgIGlmIChmblswXSA9PSAnIycpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gQ2Fubm90IGJlIGNvbXBsZXgKICAgICAgICAgICAgICAgICByc0Fzc2VydCghZi0+Z2V0RmllbGRDb3VudCgpKTsKQEAgLTE2MiwxNDkgKzgxLDEyMSBAQAogICAgICAgICAgICAgICAgICAgICByc0Fzc2VydCgwKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZChlLT5nZXRGaWVsZE5hbWUoZmllbGQpKTsKKyAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZChmbik7CiAgICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIjtcbiIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1TaGFkZXIuYXBwZW5kKG1Vc2VyU2hhZGVyKTsKICAgICB9IGVsc2UgewotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIHZlYzQgQVRUUklCX0xlZ2FjeVBvc2l0aW9uO1xuIik7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCJhdHRyaWJ1dGUgdmVjNCBBVFRSSUJfTGVnYWN5Q29sb3I7XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWMzIEFUVFJJQl9MZWdhY3lOb3JtYWw7XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSBmbG9hdCBBVFRSSUJfTGVnYWN5UG9pbnRTaXplO1xuIik7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCJhdHRyaWJ1dGUgdmVjNCBBVFRSSUJfTGVnYWN5VGV4dHVyZTtcbiIpOwotCi0gICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVW5pZm9ybUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSBtYXQ0ICIpOwotICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQobVVuaWZvcm1OYW1lc1tjdF0pOwotICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIjtcbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNoYWRlci5hcHBlbmQoInZvaWQgbWFpbigpIHtcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBnbF9Qb3NpdGlvbiA9IFVOSV9NVlAgKiBBVFRSSUJfTGVnYWN5UG9zaXRpb247XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgZ2xfUG9pbnRTaXplID0gQVRUUklCX0xlZ2FjeVBvaW50U2l6ZTtcbiIpOwotCi0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIHZhckNvbG9yID0gQVRUUklCX0xlZ2FjeUNvbG9yO1xuIik7Ci0gICAgICAgIGlmIChtVGV4dHVyZU1hdHJpeEVuYWJsZSkgewotICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgdmFyVGV4MCA9IFVOSV9UZXhNYXRyaXggKiBBVFRSSUJfTGVnYWN5VGV4dHVyZTtcbiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgdmFyVGV4MCA9IEFUVFJJQl9MZWdhY3lUZXh0dXJlO1xuIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy9tU2hhZGVyLmFwcGVuZCgiICBwb3MueCA9IHBvcy54IC8gNDgwLjA7XG4iKTsKLSAgICAgICAgLy9tU2hhZGVyLmFwcGVuZCgiICBwb3MueSA9IHBvcy55IC8gODAwLjA7XG4iKTsKLSAgICAgICAgLy9tU2hhZGVyLmFwcGVuZCgiICBnbF9Qb3NpdGlvbiA9IHBvcztcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgifVxuIik7CisgICAgICAgIExPR0UoIlByb2dyYW1GcmFnbWVudDo6Y3JlYXRlU2hhZGVyIGNhbm5vdCBjcmVhdGUgcHJvZ3JhbSwgc2hhZGVyIGNvZGUgbm90IGRlZmluZWQiKTsKKyAgICAgICAgcnNBc3NlcnQoMCk7CiAgICAgfQogfQogCi12b2lkIFByb2dyYW1WZXJ0ZXg6OnNldHVwR0wyKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbVZlcnRleFN0YXRlICpzdGF0ZSwgU2hhZGVyQ2FjaGUgKnNjKQordm9pZCBQcm9ncmFtVmVydGV4OjpzZXR1cEdMMihDb250ZXh0ICpyc2MsIFByb2dyYW1WZXJ0ZXhTdGF0ZSAqc3RhdGUsIFNoYWRlckNhY2hlICpzYykKIHsKICAgICAvL0xPR0UoInNnbDIgdnR4MSAleCIsIGdsR2V0RXJyb3IoKSk7CiAgICAgaWYgKChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgJiYgIW1EaXJ0eSkgewotICAgICAgICAvL3JldHVybjsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbVZlcnRleDo6c2V0dXBHTDIgc3RhcnQiKTsKLSAgICBnbFZlcnRleEF0dHJpYjRmKDEsIHN0YXRlLT5jb2xvclswXSwgc3RhdGUtPmNvbG9yWzFdLCBzdGF0ZS0+Y29sb3JbMl0sIHN0YXRlLT5jb2xvclszXSk7CiAKLSAgICBjb25zdCBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KG1Db25zdGFudHNbMF0tPmdldFB0cigpKTsKLQotICAgIE1hdHJpeCBtdnA7Ci0gICAgbXZwLmxvYWQoJmZbUlNfUFJPR1JBTV9WRVJURVhfUFJPSkVDVElPTl9PRkZTRVRdKTsKLSAgICBNYXRyaXggdDsKLSAgICB0LmxvYWQoJmZbUlNfUFJPR1JBTV9WRVJURVhfTU9ERUxWSUVXX09GRlNFVF0pOwotICAgIG12cC5tdWx0aXBseSgmdCk7Ci0KLSAgICBnbFVuaWZvcm1NYXRyaXg0ZnYoc2MtPnZ0eFVuaWZvcm1TbG90KDApLCAxLCBHTF9GQUxTRSwgbXZwLm0pOwotICAgIGlmIChtVGV4dHVyZU1hdHJpeEVuYWJsZSkgewotICAgICAgICBnbFVuaWZvcm1NYXRyaXg0ZnYoc2MtPnZ0eFVuaWZvcm1TbG90KDEpLCAxLCBHTF9GQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZmW1JTX1BST0dSQU1fVkVSVEVYX1RFWFRVUkVfT0ZGU0VUXSk7CisgICAgaWYoIWlzVXNlclByb2dyYW0oKSkgeworICAgICAgICBpZihtQ29uc3RhbnRzWzBdLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgICAgIExPR0UoIlVuYWJsZSB0byBzZXQgZml4ZWQgZnVuY3Rpb24gZW11bGF0aW9uIG1hdHJpY2VzIGJlY2F1c2UgYWxsb2NhdGlvbiBpcyBtaXNzaW5nIik7CisgICAgICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TSEFERVIsICJGaXhlZCBmdW5jdGlvbiBhbGxvY2F0aW9uIG1pc3NpbmciKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KG1Db25zdGFudHNbMF0tPmdldFB0cigpKTsKKyAgICAgICAgTWF0cml4IG12cDsKKyAgICAgICAgbXZwLmxvYWQoJmZbUlNfUFJPR1JBTV9WRVJURVhfUFJPSkVDVElPTl9PRkZTRVRdKTsKKyAgICAgICAgTWF0cml4IHQ7CisgICAgICAgIHQubG9hZCgmZltSU19QUk9HUkFNX1ZFUlRFWF9NT0RFTFZJRVdfT0ZGU0VUXSk7CisgICAgICAgIG12cC5tdWx0aXBseSgmdCk7CisgICAgICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IDE2OyBpICsrKSB7CisgICAgICAgICAgICBmW1JTX1BST0dSQU1fVkVSVEVYX01WUF9PRkZTRVQgKyBpXSA9IG12cC5tW2ldOworICAgICAgICB9CiAgICAgfQogCiAgICAgcnNjLT5jaGVja0Vycm9yKCJQcm9ncmFtVmVydGV4OjpzZXR1cEdMMiBiZWdpbiB1bmlmb3JtcyIpOwotICAgIHVpbnQzMl90IHVpZHggPSAxOwotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ29uc3RhbnRDb3VudDsgY3QrKykgewotICAgICAgICBBbGxvY2F0aW9uICphbGxvYyA9IG1Db25zdGFudHNbY3QrMV0uZ2V0KCk7Ci0gICAgICAgIGlmICghYWxsb2MpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oYWxsb2MtPmdldFB0cigpKTsKLSAgICAgICAgY29uc3QgRWxlbWVudCAqZSA9IG1Db25zdGFudFR5cGVzW2N0XS0+Z2V0RWxlbWVudCgpOwotICAgICAgICBmb3IgKHVpbnQzMl90IGZpZWxkPTA7IGZpZWxkIDwgZS0+Z2V0RmllbGRDb3VudCgpOyBmaWVsZCsrKSB7Ci0gICAgICAgICAgICBjb25zdCBFbGVtZW50ICpmID0gZS0+Z2V0RmllbGQoZmllbGQpOwotICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gZS0+Z2V0RmllbGRPZmZzZXRCeXRlcyhmaWVsZCk7Ci0gICAgICAgICAgICBpbnQzMl90IHNsb3QgPSBzYy0+dnR4VW5pZm9ybVNsb3QodWlkeCk7Ci0KLSAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpmZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKj4oJmRhdGFbb2Zmc2V0XSk7Ci0KLSAgICAgICAgICAgIC8vTE9HRSgiVW5pZm9ybSAgc2xvdD0laSwgb2Zmc2V0PSVpLCBjb25zdGFudD0laSwgZmllbGQ9JWksIHVpZHg9JWkiLCBzbG90LCBvZmZzZXQsIGN0LCBmaWVsZCwgdWlkeCk7Ci0gICAgICAgICAgICBpZiAoc2xvdCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKGYtPmdldENvbXBvbmVudCgpLmdldFZlY3RvclNpemUoKSkgewotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgLy9MT0dFKCJVbmlmb3JtIDEgPSAlZiIsIGZkWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtMWZ2KHNsb3QsIDEsIGZkKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAvL0xPR0UoIlVuaWZvcm0gMiA9ICVmICVmIiwgZmRbMF0sIGZkWzFdKTsKLSAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtMmZ2KHNsb3QsIDEsIGZkKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICAvL0xPR0UoIlVuaWZvcm0gMyA9ICVmICVmICVmIiwgZmRbMF0sIGZkWzFdLCBmZFsyXSk7Ci0gICAgICAgICAgICAgICAgICAgIGdsVW5pZm9ybTNmdihzbG90LCAxLCBmZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgLy9MT0dFKCJVbmlmb3JtIDQgPSAlZiAlZiAlZiAlZiIsIGZkWzBdLCBmZFsxXSwgZmRbMl0sIGZkWzNdKTsKLSAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtNGZ2KHNsb3QsIDEsIGZkKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcnNBc3NlcnQoMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWlkeCArKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ29uc3RhbnRDb3VudDsgY3QrKykgewotICAgICAgICB1aW50MzJfdCBnbFNsb3QgPSBzYy0+dnR4VW5pZm9ybVNsb3QoY3QgKyAxKTsKLQotICAgIH0KKyAgICBzZXR1cFVzZXJDb25zdGFudHMocnNjLCBzYywgZmFsc2UpOwogCiAgICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKICAgICByc2MtPmNoZWNrRXJyb3IoIlByb2dyYW1WZXJ0ZXg6OnNldHVwR0wyIik7CiB9CiAKLXZvaWQgUHJvZ3JhbVZlcnRleDo6YWRkTGlnaHQoY29uc3QgTGlnaHQgKmwpCit2b2lkIFByb2dyYW1WZXJ0ZXg6OnNldFByb2plY3Rpb25NYXRyaXgoQ29udGV4dCAqcnNjLCBjb25zdCByc2NfTWF0cml4ICptKSBjb25zdAogewotICAgIGlmIChtTGlnaHRDb3VudCA8IE1BWF9MSUdIVFMpIHsKLSAgICAgICAgbUxpZ2h0c1ttTGlnaHRDb3VudF0uc2V0KGwpOwotICAgICAgICBtTGlnaHRDb3VudCsrOworICAgIGlmKGlzVXNlclByb2dyYW0oKSkgeworICAgICAgICBMT0dFKCJBdHRlbXB0aW5nIHRvIHNldCBmaXhlZCBmdW5jdGlvbiBlbXVsYXRpb24gbWF0cml4IHByb2plY3Rpb24gb24gdXNlciBwcm9ncmFtIik7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1NIQURFUiwgIkNhbm5vdCBzZXQgZW11bGF0aW9uIG1hdHJpeCBvbiB1c2VyIHNoYWRlciIpOworICAgICAgICByZXR1cm47CiAgICAgfQotfQotCi12b2lkIFByb2dyYW1WZXJ0ZXg6OnNldFByb2plY3Rpb25NYXRyaXgoY29uc3QgcnNjX01hdHJpeCAqbSkgY29uc3QKLXsKKyAgICBpZihtQ29uc3RhbnRzWzBdLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiVW5hYmxlIHRvIHNldCBmaXhlZCBmdW5jdGlvbiBlbXVsYXRpb24gbWF0cml4IHByb2plY3Rpb24gYmVjYXVzZSBhbGxvY2F0aW9uIGlzIG1pc3NpbmciKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KG1Db25zdGFudHNbMF0tPmdldFB0cigpKTsKICAgICBtZW1jcHkoJmZbUlNfUFJPR1JBTV9WRVJURVhfUFJPSkVDVElPTl9PRkZTRVRdLCBtLCBzaXplb2YocnNjX01hdHJpeCkpOwogICAgIG1EaXJ0eSA9IHRydWU7CiB9CiAKLXZvaWQgUHJvZ3JhbVZlcnRleDo6c2V0TW9kZWx2aWV3TWF0cml4KGNvbnN0IHJzY19NYXRyaXggKm0pIGNvbnN0Cit2b2lkIFByb2dyYW1WZXJ0ZXg6OnNldE1vZGVsdmlld01hdHJpeChDb250ZXh0ICpyc2MsIGNvbnN0IHJzY19NYXRyaXggKm0pIGNvbnN0CiB7CisgICAgaWYoaXNVc2VyUHJvZ3JhbSgpKSB7CisgICAgICAgIExPR0UoIkF0dGVtcHRpbmcgdG8gc2V0IGZpeGVkIGZ1bmN0aW9uIGVtdWxhdGlvbiBtYXRyaXggbW9kZWx2aWV3IG9uIHVzZXIgcHJvZ3JhbSIpOworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TSEFERVIsICJDYW5ub3Qgc2V0IGVtdWxhdGlvbiBtYXRyaXggb24gdXNlciBzaGFkZXIiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZihtQ29uc3RhbnRzWzBdLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiVW5hYmxlIHRvIHNldCBmaXhlZCBmdW5jdGlvbiBlbXVsYXRpb24gbWF0cml4IG1vZGVsdmlldyBiZWNhdXNlIGFsbG9jYXRpb24gaXMgbWlzc2luZyIpOworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TSEFERVIsICJGaXhlZCBmdW5jdGlvbiBhbGxvY2F0aW9uIG1pc3NpbmciKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KG1Db25zdGFudHNbMF0tPmdldFB0cigpKTsKICAgICBtZW1jcHkoJmZbUlNfUFJPR1JBTV9WRVJURVhfTU9ERUxWSUVXX09GRlNFVF0sIG0sIHNpemVvZihyc2NfTWF0cml4KSk7CiAgICAgbURpcnR5ID0gdHJ1ZTsKIH0KIAotdm9pZCBQcm9ncmFtVmVydGV4OjpzZXRUZXh0dXJlTWF0cml4KGNvbnN0IHJzY19NYXRyaXggKm0pIGNvbnN0Cit2b2lkIFByb2dyYW1WZXJ0ZXg6OnNldFRleHR1cmVNYXRyaXgoQ29udGV4dCAqcnNjLCBjb25zdCByc2NfTWF0cml4ICptKSBjb25zdAogeworICAgIGlmKGlzVXNlclByb2dyYW0oKSkgeworICAgICAgICBMT0dFKCJBdHRlbXB0aW5nIHRvIHNldCBmaXhlZCBmdW5jdGlvbiBlbXVsYXRpb24gbWF0cml4IHRleHR1cmUgb24gdXNlciBwcm9ncmFtIik7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1NIQURFUiwgIkNhbm5vdCBzZXQgZW11bGF0aW9uIG1hdHJpeCBvbiB1c2VyIHNoYWRlciIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKG1Db25zdGFudHNbMF0uZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJVbmFibGUgdG8gc2V0IGZpeGVkIGZ1bmN0aW9uIGVtdWxhdGlvbiBtYXRyaXggdGV4dHVyZSBiZWNhdXNlIGFsbG9jYXRpb24gaXMgbWlzc2luZyIpOworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TSEFERVIsICJGaXhlZCBmdW5jdGlvbiBhbGxvY2F0aW9uIG1pc3NpbmciKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KG1Db25zdGFudHNbMF0tPmdldFB0cigpKTsKICAgICBtZW1jcHkoJmZbUlNfUFJPR1JBTV9WRVJURVhfVEVYVFVSRV9PRkZTRVRdLCBtLCBzaXplb2YocnNjX01hdHJpeCkpOwogICAgIG1EaXJ0eSA9IHRydWU7CiB9CiAKLXZvaWQgUHJvZ3JhbVZlcnRleDo6dHJhbnNmb3JtVG9TY3JlZW4oY29uc3QgQ29udGV4dCAqcnNjLCBmbG9hdCAqdjRvdXQsIGNvbnN0IGZsb2F0ICp2M2luKSBjb25zdAordm9pZCBQcm9ncmFtVmVydGV4OjpnZXRQcm9qZWN0aW9uTWF0cml4KENvbnRleHQgKnJzYywgcnNjX01hdHJpeCAqbSkgY29uc3QKIHsKKyAgICBpZihpc1VzZXJQcm9ncmFtKCkpIHsKKyAgICAgICAgTE9HRSgiQXR0ZW1wdGluZyB0byBnZXQgZml4ZWQgZnVuY3Rpb24gZW11bGF0aW9uIG1hdHJpeCBwcm9qZWN0aW9uIG9uIHVzZXIgcHJvZ3JhbSIpOworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TSEFERVIsICJDYW5ub3QgZ2V0IGVtdWxhdGlvbiBtYXRyaXggb24gdXNlciBzaGFkZXIiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZihtQ29uc3RhbnRzWzBdLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiVW5hYmxlIHRvIGdldCBmaXhlZCBmdW5jdGlvbiBlbXVsYXRpb24gbWF0cml4IHByb2plY3Rpb24gYmVjYXVzZSBhbGxvY2F0aW9uIGlzIG1pc3NpbmciKTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0hBREVSLCAiRml4ZWQgZnVuY3Rpb24gYWxsb2NhdGlvbiBtaXNzaW5nIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxmbG9hdCAqPihtQ29uc3RhbnRzWzBdLT5nZXRQdHIoKSk7CisgICAgbWVtY3B5KG0sICZmW1JTX1BST0dSQU1fVkVSVEVYX1BST0pFQ1RJT05fT0ZGU0VUXSwgc2l6ZW9mKHJzY19NYXRyaXgpKTsKK30KKwordm9pZCBQcm9ncmFtVmVydGV4Ojp0cmFuc2Zvcm1Ub1NjcmVlbihDb250ZXh0ICpyc2MsIGZsb2F0ICp2NG91dCwgY29uc3QgZmxvYXQgKnYzaW4pIGNvbnN0Cit7CisgICAgaWYoaXNVc2VyUHJvZ3JhbSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxmbG9hdCAqPihtQ29uc3RhbnRzWzBdLT5nZXRQdHIoKSk7CiAgICAgTWF0cml4IG12cDsKICAgICBtdnAubG9hZE11bHRpcGx5KChNYXRyaXggKikmZltSU19QUk9HUkFNX1ZFUlRFWF9NT0RFTFZJRVdfT0ZGU0VUXSwKQEAgLTMxMiw0NSArMjAzLDMxIEBACiAgICAgbXZwLnZlY3Rvck11bHRpcGx5KHY0b3V0LCB2M2luKTsKIH0KIAotdm9pZCBQcm9ncmFtVmVydGV4Ojppbml0QWRkVXNlckVsZW1lbnQoY29uc3QgRWxlbWVudCAqZSwgU3RyaW5nOCAqbmFtZXMsIHVpbnQzMl90ICpjb3VudCwgY29uc3QgY2hhciAqcHJlZml4KQotewotICAgIHJzQXNzZXJ0KGUtPmdldEZpZWxkQ291bnQoKSk7Ci0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IGUtPmdldEZpZWxkQ291bnQoKTsgY3QrKykgewotICAgICAgICBjb25zdCBFbGVtZW50ICpjZSA9IGUtPmdldEZpZWxkKGN0KTsKLSAgICAgICAgaWYgKGNlLT5nZXRGaWVsZENvdW50KCkpIHsKLSAgICAgICAgICAgIGluaXRBZGRVc2VyRWxlbWVudChjZSwgbmFtZXMsIGNvdW50LCBwcmVmaXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nOCB0bXAocHJlZml4KTsKLSAgICAgICAgICAgIHRtcC5hcHBlbmQoZS0+Z2V0RmllbGROYW1lKGN0KSk7Ci0gICAgICAgICAgICBuYW1lc1sqY291bnRdLnNldFRvKHRtcC5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAoKmNvdW50KSsrOwotICAgICAgICB9Ci0gICAgfQotfQotCi0KIHZvaWQgUHJvZ3JhbVZlcnRleDo6aW5pdChDb250ZXh0ICpyc2MpCiB7CiAgICAgbUF0dHJpYkNvdW50ID0gMDsKICAgICBpZiAobVVzZXJTaGFkZXIuc2l6ZSgpID4gMCkgewogICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUlucHV0Q291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgIGluaXRBZGRVc2VyRWxlbWVudChtSW5wdXRFbGVtZW50c1tjdF0uZ2V0KCksIG1BdHRyaWJOYW1lcywgJm1BdHRyaWJDb3VudCwgIkFUVFJJQl8iKTsKKyAgICAgICAgICAgIGluaXRBZGRVc2VyRWxlbWVudChtSW5wdXRFbGVtZW50c1tjdF0uZ2V0KCksIG1BdHRyaWJOYW1lcywgJm1BdHRyaWJDb3VudCwgUlNfU0hBREVSX0FUVFIpOwogICAgICAgICB9Ci0KLSAgICAgICAgbVVuaWZvcm1Db3VudCA9IDE7Ci0gICAgICAgIG1Vbmlmb3JtTmFtZXNbMF0uc2V0VG8oIlVOSV9NVlAiKTsKKyAgICAgICAgbVVuaWZvcm1Db3VudCA9IDA7CiAgICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ29uc3RhbnRDb3VudDsgY3QrKykgewotICAgICAgICAgICAgaW5pdEFkZFVzZXJFbGVtZW50KG1Db25zdGFudFR5cGVzW2N0XS0+Z2V0RWxlbWVudCgpLCBtVW5pZm9ybU5hbWVzLCAmbVVuaWZvcm1Db3VudCwgIlVOSV8iKTsKKyAgICAgICAgICAgIGluaXRBZGRVc2VyRWxlbWVudChtQ29uc3RhbnRUeXBlc1tjdF0tPmdldEVsZW1lbnQoKSwgbVVuaWZvcm1OYW1lcywgJm1Vbmlmb3JtQ291bnQsIFJTX1NIQURFUl9VTkkpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVVuaWZvcm1Db3VudCA9IDI7Ci0gICAgICAgIG1Vbmlmb3JtTmFtZXNbMF0uc2V0VG8oIlVOSV9NVlAiKTsKLSAgICAgICAgbVVuaWZvcm1OYW1lc1sxXS5zZXRUbygiVU5JX1RleE1hdHJpeCIpOwogICAgIH0KLQogICAgIGNyZWF0ZVNoYWRlcigpOwogfQogCit2b2lkIFByb2dyYW1WZXJ0ZXg6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisKK30KKworUHJvZ3JhbVZlcnRleCAqUHJvZ3JhbVZlcnRleDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCkBAIC0zNjIsNDQgKzIzOSw4MCBAQAogewogfQogCi12b2lkIFByb2dyYW1WZXJ0ZXhTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKQordm9pZCBQcm9ncmFtVmVydGV4U3RhdGU6OmluaXQoQ29udGV4dCAqcnNjKQogewotICAgIFJzRWxlbWVudCBlID0gKFJzRWxlbWVudCkgRWxlbWVudDo6Y3JlYXRlKHJzYywgUlNfVFlQRV9GTE9BVF8zMiwgUlNfS0lORF9VU0VSLCBmYWxzZSwgMSk7CisgICAgY29uc3QgRWxlbWVudCAqbWF0cml4RWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShyc2MsIFJTX1RZUEVfTUFUUklYXzRYNCwgUlNfS0lORF9VU0VSLCBmYWxzZSwgMSk7CisgICAgY29uc3QgRWxlbWVudCAqZjJFbGVtID0gRWxlbWVudDo6Y3JlYXRlKHJzYywgUlNfVFlQRV9GTE9BVF8zMiwgUlNfS0lORF9VU0VSLCBmYWxzZSwgMik7CisgICAgY29uc3QgRWxlbWVudCAqZjNFbGVtID0gRWxlbWVudDo6Y3JlYXRlKHJzYywgUlNfVFlQRV9GTE9BVF8zMiwgUlNfS0lORF9VU0VSLCBmYWxzZSwgMyk7CisgICAgY29uc3QgRWxlbWVudCAqZjRFbGVtID0gRWxlbWVudDo6Y3JlYXRlKHJzYywgUlNfVFlQRV9GTE9BVF8zMiwgUlNfS0lORF9VU0VSLCBmYWxzZSwgNCk7CiAKLSAgICByc2lfVHlwZUJlZ2luKHJzYywgZSk7Ci0gICAgcnNpX1R5cGVBZGQocnNjLCBSU19ESU1FTlNJT05fWCwgNDgpOwotICAgIG1BbGxvY1R5cGUuc2V0KChUeXBlICopcnNpX1R5cGVDcmVhdGUocnNjKSk7CisgICAgcnNjLT5tU3RhdGVFbGVtZW50LmVsZW1lbnRCdWlsZGVyQmVnaW4oKTsKKyAgICByc2MtPm1TdGF0ZUVsZW1lbnQuZWxlbWVudEJ1aWxkZXJBZGQobWF0cml4RWxlbSwgIk1WIiwgMSk7CisgICAgcnNjLT5tU3RhdGVFbGVtZW50LmVsZW1lbnRCdWlsZGVyQWRkKG1hdHJpeEVsZW0sICJQIiwgMSk7CisgICAgcnNjLT5tU3RhdGVFbGVtZW50LmVsZW1lbnRCdWlsZGVyQWRkKG1hdHJpeEVsZW0sICJUZXhNYXRyaXgiLCAxKTsKKyAgICByc2MtPm1TdGF0ZUVsZW1lbnQuZWxlbWVudEJ1aWxkZXJBZGQobWF0cml4RWxlbSwgIk1WUCIsIDEpOworICAgIGNvbnN0IEVsZW1lbnQgKmNvbnN0SW5wdXQgPSByc2MtPm1TdGF0ZUVsZW1lbnQuZWxlbWVudEJ1aWxkZXJDcmVhdGUocnNjKTsKIAotICAgIFByb2dyYW1WZXJ0ZXggKnB2ID0gbmV3IFByb2dyYW1WZXJ0ZXgocnNjLCBmYWxzZSk7Ci0gICAgQWxsb2NhdGlvbiAqYWxsb2MgPSAoQWxsb2NhdGlvbiAqKXJzaV9BbGxvY2F0aW9uQ3JlYXRlVHlwZWQocnNjLCBtQWxsb2NUeXBlLmdldCgpKTsKKyAgICByc2MtPm1TdGF0ZUVsZW1lbnQuZWxlbWVudEJ1aWxkZXJCZWdpbigpOworICAgIHJzYy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckFkZChmNEVsZW0sICJwb3NpdGlvbiIsIDEpOworICAgIHJzYy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckFkZChmNEVsZW0sICJjb2xvciIsIDEpOworICAgIHJzYy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckFkZChmM0VsZW0sICJub3JtYWwiLCAxKTsKKyAgICByc2MtPm1TdGF0ZUVsZW1lbnQuZWxlbWVudEJ1aWxkZXJBZGQoZjJFbGVtLCAidGV4dHVyZTAiLCAxKTsKKyAgICBjb25zdCBFbGVtZW50ICphdHRyRWxlbSA9IHJzYy0+bVN0YXRlRWxlbWVudC5lbGVtZW50QnVpbGRlckNyZWF0ZShyc2MpOworCisgICAgVHlwZSAqaW5wdXRUeXBlID0gbmV3IFR5cGUocnNjKTsKKyAgICBpbnB1dFR5cGUtPnNldEVsZW1lbnQoY29uc3RJbnB1dCk7CisgICAgaW5wdXRUeXBlLT5zZXREaW1YKDEpOworICAgIGlucHV0VHlwZS0+Y29tcHV0ZSgpOworCisgICAgU3RyaW5nOCBzaGFkZXJTdHJpbmcoUlNfU0hBREVSX0lOVEVSTkFMKTsKKyAgICBzaGFkZXJTdHJpbmcuYXBwZW5kKCJ2YXJ5aW5nIHZlYzQgdmFyQ29sb3I7XG4iKTsKKyAgICBzaGFkZXJTdHJpbmcuYXBwZW5kKCJ2YXJ5aW5nIHZlYzIgdmFyVGV4MDtcbiIpOworICAgIHNoYWRlclN0cmluZy5hcHBlbmQoInZvaWQgbWFpbigpIHtcbiIpOworICAgIHNoYWRlclN0cmluZy5hcHBlbmQoIiAgZ2xfUG9zaXRpb24gPSBVTklfTVZQICogQVRUUklCX3Bvc2l0aW9uO1xuIik7CisgICAgc2hhZGVyU3RyaW5nLmFwcGVuZCgiICBnbF9Qb2ludFNpemUgPSAxLjA7XG4iKTsKKyAgICBzaGFkZXJTdHJpbmcuYXBwZW5kKCIgIHZhckNvbG9yID0gQVRUUklCX2NvbG9yO1xuIik7CisgICAgc2hhZGVyU3RyaW5nLmFwcGVuZCgiICB2YXJUZXgwID0gQVRUUklCX3RleHR1cmUwO1xuIik7CisgICAgc2hhZGVyU3RyaW5nLmFwcGVuZCgifVxuIik7CisKKyAgICB1aW50MzJfdCB0bXBbNl07CisgICAgdG1wWzBdID0gUlNfUFJPR1JBTV9QQVJBTV9DT05TVEFOVDsKKyAgICB0bXBbMV0gPSAodWludDMyX3QpaW5wdXRUeXBlOworICAgIHRtcFsyXSA9IFJTX1BST0dSQU1fUEFSQU1fSU5QVVQ7CisgICAgdG1wWzNdID0gKHVpbnQzMl90KWF0dHJFbGVtOworICAgIHRtcFs0XSA9IFJTX1BST0dSQU1fUEFSQU1fVEVYVFVSRV9DT1VOVDsKKyAgICB0bXBbNV0gPSAwOworCisgICAgUHJvZ3JhbVZlcnRleCAqcHYgPSBuZXcgUHJvZ3JhbVZlcnRleChyc2MsIHNoYWRlclN0cmluZy5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlclN0cmluZy5sZW5ndGgoKSwgdG1wLCA2KTsKKyAgICBBbGxvY2F0aW9uICphbGxvYyA9IG5ldyBBbGxvY2F0aW9uKHJzYywgaW5wdXRUeXBlKTsKKyAgICBwdi0+YmluZEFsbG9jYXRpb24ocnNjLCBhbGxvYywgMCk7CisKICAgICBtRGVmYXVsdEFsbG9jLnNldChhbGxvYyk7CiAgICAgbURlZmF1bHQuc2V0KHB2KTsKLSAgICBwdi0+aW5pdChyc2MpOwotICAgIHB2LT5iaW5kQWxsb2NhdGlvbihhbGxvYywgMCk7CiAKLSAgICBjb2xvclswXSA9IDEuZjsKLSAgICBjb2xvclsxXSA9IDEuZjsKLSAgICBjb2xvclsyXSA9IDEuZjsKLSAgICBjb2xvclszXSA9IDEuZjsKKyAgICB1cGRhdGVTaXplKHJzYyk7CiAKLSAgICB1cGRhdGVTaXplKHJzYywgdywgaCk7CiB9CiAKLXZvaWQgUHJvZ3JhbVZlcnRleFN0YXRlOjp1cGRhdGVTaXplKENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpCit2b2lkIFByb2dyYW1WZXJ0ZXhTdGF0ZTo6dXBkYXRlU2l6ZShDb250ZXh0ICpyc2MpCiB7CisgICAgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxmbG9hdCAqPihtRGVmYXVsdEFsbG9jLT5nZXRQdHIoKSk7CisKICAgICBNYXRyaXggbTsKLSAgICBtLmxvYWRPcnRobygwLHcsIGgsMCwgLTEsMSk7Ci0gICAgbURlZmF1bHRBbGxvYy0+c3ViRGF0YShSU19QUk9HUkFNX1ZFUlRFWF9QUk9KRUNUSU9OX09GRlNFVCwgMTYsICZtLm1bMF0sIDE2KjQpOworICAgIG0ubG9hZE9ydGhvKDAscnNjLT5nZXRXaWR0aCgpLCByc2MtPmdldEhlaWdodCgpLDAsIC0xLDEpOworICAgIG1lbWNweSgmZltSU19QUk9HUkFNX1ZFUlRFWF9QUk9KRUNUSU9OX09GRlNFVF0sIG0ubSwgc2l6ZW9mKG0pKTsKKyAgICBtZW1jcHkoJmZbUlNfUFJPR1JBTV9WRVJURVhfTVZQX09GRlNFVF0sIG0ubSwgc2l6ZW9mKG0pKTsKIAogICAgIG0ubG9hZElkZW50aXR5KCk7Ci0gICAgbURlZmF1bHRBbGxvYy0+c3ViRGF0YShSU19QUk9HUkFNX1ZFUlRFWF9NT0RFTFZJRVdfT0ZGU0VULCAxNiwgJm0ubVswXSwgMTYqNCk7CisgICAgbWVtY3B5KCZmW1JTX1BST0dSQU1fVkVSVEVYX01PREVMVklFV19PRkZTRVRdLCBtLm0sIHNpemVvZihtKSk7CisgICAgbWVtY3B5KCZmW1JTX1BST0dSQU1fVkVSVEVYX1RFWFRVUkVfT0ZGU0VUXSwgbS5tLCBzaXplb2YobSkpOwogfQogCiB2b2lkIFByb2dyYW1WZXJ0ZXhTdGF0ZTo6ZGVpbml0KENvbnRleHQgKnJzYykKIHsKICAgICBtRGVmYXVsdEFsbG9jLmNsZWFyKCk7CiAgICAgbURlZmF1bHQuY2xlYXIoKTsKLSAgICBtQWxsb2NUeXBlLmNsZWFyKCk7CiAgICAgbUxhc3QuY2xlYXIoKTsKIH0KIApAQCAtNDA3LDE1ICszMjAsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKLQotUnNQcm9ncmFtVmVydGV4IHJzaV9Qcm9ncmFtVmVydGV4Q3JlYXRlKENvbnRleHQgKnJzYywgYm9vbCB0ZXhNYXQpCi17Ci0gICAgUHJvZ3JhbVZlcnRleCAqcHYgPSBuZXcgUHJvZ3JhbVZlcnRleChyc2MsIHRleE1hdCk7Ci0gICAgcHYtPmluY1VzZXJSZWYoKTsKLSAgICByZXR1cm4gcHY7Ci19Ci0KLVJzUHJvZ3JhbVZlcnRleCByc2lfUHJvZ3JhbVZlcnRleENyZWF0ZTIoQ29udGV4dCAqcnNjLCBjb25zdCBjaGFyICogc2hhZGVyVGV4dCwKK1JzUHJvZ3JhbVZlcnRleCByc2lfUHJvZ3JhbVZlcnRleENyZWF0ZShDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIgKiBzaGFkZXJUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaGFkZXJMZW5ndGgsIGNvbnN0IHVpbnQzMl90ICogcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXJhbUxlbmd0aCkKIHsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmggYi9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5oCmluZGV4IDI4NTU0Y2MuLjM1NWRmMmIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmgKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguaApAQCAtMjgsNDAgKzI4LDI2IEBACiBjbGFzcyBQcm9ncmFtVmVydGV4IDogcHVibGljIFByb2dyYW0KIHsKIHB1YmxpYzoKLSAgICBjb25zdCBzdGF0aWMgdWludDMyX3QgTUFYX0xJR0hUUyA9IDg7Ci0KICAgICBQcm9ncmFtVmVydGV4KENvbnRleHQgKixjb25zdCBjaGFyICogc2hhZGVyVGV4dCwgdWludDMyX3Qgc2hhZGVyTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgKiBwYXJhbXMsIHVpbnQzMl90IHBhcmFtTGVuZ3RoKTsKLSAgICBQcm9ncmFtVmVydGV4KENvbnRleHQgKiwgYm9vbCB0ZXhNYXQpOwogICAgIHZpcnR1YWwgflByb2dyYW1WZXJ0ZXgoKTsKIAotICAgIHZpcnR1YWwgdm9pZCBzZXR1cEdMKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbVZlcnRleFN0YXRlICpzdGF0ZSk7Ci0gICAgdmlydHVhbCB2b2lkIHNldHVwR0wyKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbVZlcnRleFN0YXRlICpzdGF0ZSwgU2hhZGVyQ2FjaGUgKnNjKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTDIoQ29udGV4dCAqcnNjLCBQcm9ncmFtVmVydGV4U3RhdGUgKnN0YXRlLCBTaGFkZXJDYWNoZSAqc2MpOwogCisgICAgdm9pZCBzZXRQcm9qZWN0aW9uTWF0cml4KENvbnRleHQgKiwgY29uc3QgcnNjX01hdHJpeCAqKSBjb25zdDsKKyAgICB2b2lkIGdldFByb2plY3Rpb25NYXRyaXgoQ29udGV4dCAqLCByc2NfTWF0cml4ICopIGNvbnN0OworICAgIHZvaWQgc2V0TW9kZWx2aWV3TWF0cml4KENvbnRleHQgKiwgY29uc3QgcnNjX01hdHJpeCAqKSBjb25zdDsKKyAgICB2b2lkIHNldFRleHR1cmVNYXRyaXgoQ29udGV4dCAqLCBjb25zdCByc2NfTWF0cml4ICopIGNvbnN0OwogCi0gICAgdm9pZCBzZXRUZXh0dXJlTWF0cml4RW5hYmxlKGJvb2wgZSkge21UZXh0dXJlTWF0cml4RW5hYmxlID0gZTt9Ci0gICAgdm9pZCBhZGRMaWdodChjb25zdCBMaWdodCAqKTsKLQotICAgIHZvaWQgc2V0UHJvamVjdGlvbk1hdHJpeChjb25zdCByc2NfTWF0cml4ICopIGNvbnN0OwotICAgIHZvaWQgc2V0TW9kZWx2aWV3TWF0cml4KGNvbnN0IHJzY19NYXRyaXggKikgY29uc3Q7Ci0gICAgdm9pZCBzZXRUZXh0dXJlTWF0cml4KGNvbnN0IHJzY19NYXRyaXggKikgY29uc3Q7Ci0KLSAgICB2b2lkIHRyYW5zZm9ybVRvU2NyZWVuKGNvbnN0IENvbnRleHQgKiwgZmxvYXQgKnY0b3V0LCBjb25zdCBmbG9hdCAqdjNpbikgY29uc3Q7CisgICAgdm9pZCB0cmFuc2Zvcm1Ub1NjcmVlbihDb250ZXh0ICosIGZsb2F0ICp2NG91dCwgY29uc3QgZmxvYXQgKnYzaW4pIGNvbnN0OwogCiAgICAgdmlydHVhbCB2b2lkIGNyZWF0ZVNoYWRlcigpOwogICAgIHZpcnR1YWwgdm9pZCBsb2FkU2hhZGVyKENvbnRleHQgKik7CiAgICAgdmlydHVhbCB2b2lkIGluaXQoQ29udGV4dCAqKTsKIAotCi1wcm90ZWN0ZWQ6Ci0gICAgdWludDMyX3QgbUxpZ2h0Q291bnQ7Ci0gICAgT2JqZWN0QmFzZVJlZjxjb25zdCBMaWdodD4gbUxpZ2h0c1tNQVhfTElHSFRTXTsKLQotICAgIC8vIEhhY2tzIHRvIGNyZWF0ZSBhIHByb2dyYW0gZm9yIG5vdwotICAgIGJvb2wgbVRleHR1cmVNYXRyaXhFbmFibGU7Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBpbml0QWRkVXNlckVsZW1lbnQoY29uc3QgRWxlbWVudCAqZSwgU3RyaW5nOCAqbmFtZXMsIHVpbnQzMl90ICpjb3VudCwgY29uc3QgY2hhciAqcHJlZml4KTsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1ZFUlRFWDsgfQorICAgIHN0YXRpYyBQcm9ncmFtVmVydGV4ICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKIH07CiAKIApAQCAtNzEsMTggKzU3LDEzIEBACiAgICAgUHJvZ3JhbVZlcnRleFN0YXRlKCk7CiAgICAgflByb2dyYW1WZXJ0ZXhTdGF0ZSgpOwogCi0gICAgdm9pZCBpbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpOworICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MpOwogICAgIHZvaWQgZGVpbml0KENvbnRleHQgKnJzYyk7Ci0gICAgdm9pZCB1cGRhdGVTaXplKENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpOworICAgIHZvaWQgdXBkYXRlU2l6ZShDb250ZXh0ICpyc2MpOwogCiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtVmVydGV4PiBtRGVmYXVsdDsKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1WZXJ0ZXg+IG1MYXN0OwogICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbURlZmF1bHRBbGxvYzsKLQotICAgIE9iamVjdEJhc2VSZWY8VHlwZT4gbUFsbG9jVHlwZTsKLQotCi0gICAgZmxvYXQgY29sb3JbNF07CiB9OwogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTYW1wbGVyLmNwcCBiL2xpYnMvcnMvcnNTYW1wbGVyLmNwcAppbmRleCA3MWY1MDhmLi4xODBkNzhlIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2FtcGxlci5jcHAKKysrIGIvbGlicy9ycy9yc1NhbXBsZXIuY3BwCkBAIC0xNCwxMCArMTQsMTYgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KICNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KICNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKwogI2luY2x1ZGUgInJzU2FtcGxlci5oIgogCiAKQEAgLTM4LDcgKzQ0LDggQEAKICAgICAgICAgICAgICAgICAgUnNTYW1wbGVyVmFsdWUgbWluRmlsdGVyLAogICAgICAgICAgICAgICAgICBSc1NhbXBsZXJWYWx1ZSB3cmFwUywKICAgICAgICAgICAgICAgICAgUnNTYW1wbGVyVmFsdWUgd3JhcFQsCi0gICAgICAgICAgICAgICAgIFJzU2FtcGxlclZhbHVlIHdyYXBSKSA6IE9iamVjdEJhc2UocnNjKQorICAgICAgICAgICAgICAgICBSc1NhbXBsZXJWYWx1ZSB3cmFwUiwKKyAgICAgICAgICAgICAgICAgZmxvYXQgYW5pc28pIDogT2JqZWN0QmFzZShyc2MpCiB7CiAgICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOwogICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKQEAgLTQ3LDEzICs1NCwxNCBAQAogICAgIG1XcmFwUyA9IHdyYXBTOwogICAgIG1XcmFwVCA9IHdyYXBUOwogICAgIG1XcmFwUiA9IHdyYXBSOworICAgIG1BbmlzbyA9IGFuaXNvOwogfQogCiBTYW1wbGVyOjp+U2FtcGxlcigpCiB7CiB9CiAKLXZvaWQgU2FtcGxlcjo6c2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIGJvb2wgbnBvdCkKK3ZvaWQgU2FtcGxlcjo6c2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIGNvbnN0IEFsbG9jYXRpb24gKnRleCkKIHsKICAgICBHTGVudW0gdHJhbnNbXSA9IHsKICAgICAgICAgR0xfTkVBUkVTVCwgLy9SU19TQU1QTEVSX05FQVJFU1QsCkBAIC02MSwyNSArNjksMzggQEAKICAgICAgICAgR0xfTElORUFSX01JUE1BUF9MSU5FQVIsIC8vUlNfU0FNUExFUl9MSU5FQVJfTUlQX0xJTkVBUiwKICAgICAgICAgR0xfUkVQRUFULCAvL1JTX1NBTVBMRVJfV1JBUCwKICAgICAgICAgR0xfQ0xBTVBfVE9fRURHRSwgLy9SU19TQU1QTEVSX0NMQU1QCi0KICAgICB9OwogCi0gICAgYm9vbCBmb3JjZU5vbk1pcCA9IGZhbHNlOwotICAgIGlmICghcnNjLT5leHRfT0VTX3RleHR1cmVfbnBvdCgpICYmIG5wb3QpIHsKLSAgICAgICAgZm9yY2VOb25NaXAgPSB0cnVlOwotICAgIH0KKyAgICBHTGVudW0gdHJhbnNOUFtdID0geworICAgICAgICBHTF9ORUFSRVNULCAvL1JTX1NBTVBMRVJfTkVBUkVTVCwKKyAgICAgICAgR0xfTElORUFSLCAvL1JTX1NBTVBMRVJfTElORUFSLAorICAgICAgICBHTF9MSU5FQVIsIC8vUlNfU0FNUExFUl9MSU5FQVJfTUlQX0xJTkVBUiwKKyAgICAgICAgR0xfQ0xBTVBfVE9fRURHRSwgLy9SU19TQU1QTEVSX1dSQVAsCisgICAgICAgIEdMX0NMQU1QX1RPX0VER0UsIC8vUlNfU0FNUExFUl9DTEFNUAorICAgIH07CiAKLSAgICBpZiAoKG1NaW5GaWx0ZXIgPT0gUlNfU0FNUExFUl9MSU5FQVJfTUlQX0xJTkVBUikgJiYgZm9yY2VOb25NaXApIHsKLSAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBpZiAoIXJzYy0+ZXh0X09FU190ZXh0dXJlX25wb3QoKSAmJiB0ZXgtPmdldFR5cGUoKS0+Z2V0SXNOcDIoKSkgeworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCB0cmFuc05QW21NaW5GaWx0ZXJdKTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgdHJhbnNOUFttTWFnRmlsdGVyXSk7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgdHJhbnNOUFttV3JhcFNdKTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCB0cmFuc05QW21XcmFwVF0pOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIHRyYW5zW21NaW5GaWx0ZXJdKTsKKyAgICAgICAgaWYgKHRleC0+Z2V0SGFzR3JhcGhpY3NNaXBtYXBzKCkpIHsKKyAgICAgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIHRyYW5zW21NaW5GaWx0ZXJdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIHRyYW5zTlBbbU1pbkZpbHRlcl0pOworICAgICAgICB9CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIHRyYW5zW21NYWdGaWx0ZXJdKTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCB0cmFuc1ttV3JhcFNdKTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCB0cmFuc1ttV3JhcFRdKTsKICAgICB9Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgdHJhbnNbbU1hZ0ZpbHRlcl0pOwotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgdHJhbnNbbVdyYXBTXSk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCB0cmFuc1ttV3JhcFRdKTsKIAorICAgIGZsb2F0IGFuaXNvVmFsdWUgPSByc01pbihyc2MtPmV4dF90ZXh0dXJlX21heF9hbmlzbygpLCBtQW5pc28pOworICAgIGlmKHJzYy0+ZXh0X3RleHR1cmVfbWF4X2FuaXNvKCkgPiAxLjBmKSB7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyZihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCwgYW5pc29WYWx1ZSk7CisgICAgfQogCi0gICAgcnNjLT5jaGVja0Vycm9yKCJQcm9ncmFtRnJhZ21lbnQ6OnNldHVwR0wyIHRleCBlbnYiKTsKKyAgICByc2MtPmNoZWNrRXJyb3IoIlNhbXBsZXI6OnNldHVwR0wyIHRleCBlbnYiKTsKIH0KIAogdm9pZCBTYW1wbGVyOjpiaW5kVG9Db250ZXh0KFNhbXBsZXJTdGF0ZSAqc3MsIHVpbnQzMl90IHNsb3QpCkBAIC05NCw2ICsxMTUsMTcgQEAKICAgICBtQm91bmRTbG90ID0gLTE7CiAgICAgc3MtPm1TYW1wbGVyc1tzbG90XS5jbGVhcigpOwogfQorCit2b2lkIFNhbXBsZXI6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisKK30KKworU2FtcGxlciAqU2FtcGxlcjo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKwogLyoKIHZvaWQgU2FtcGxlclN0YXRlOjpzZXR1cEdMKCkKIHsKQEAgLTEyMiw2ICsxNTQsNyBAQAogICAgIHNzLT5tV3JhcFMgPSBSU19TQU1QTEVSX1dSQVA7CiAgICAgc3MtPm1XcmFwVCA9IFJTX1NBTVBMRVJfV1JBUDsKICAgICBzcy0+bVdyYXBSID0gUlNfU0FNUExFUl9XUkFQOworICAgIHNzLT5tQW5pc28gPSAxLjBmOwogfQogCiB2b2lkIHJzaV9TYW1wbGVyU2V0KENvbnRleHQgKnJzYywgUnNTYW1wbGVyUGFyYW0gcGFyYW0sIFJzU2FtcGxlclZhbHVlIHZhbHVlKQpAQCAtMTQ0LDIxICsxNzcsMzcgQEAKICAgICBjYXNlIFJTX1NBTVBMRVJfV1JBUF9SOgogICAgICAgICBzcy0+bVdyYXBSID0gdmFsdWU7CiAgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR0UoIkF0dGVtcHRpbmcgdG8gc2V0IGludmFsaWQgdmFsdWUgb24gc2FtcGxlciIpOworICAgICAgICBicmVhazsKICAgICB9Cit9CiAKK3ZvaWQgcnNpX1NhbXBsZXJTZXQyKENvbnRleHQgKnJzYywgUnNTYW1wbGVyUGFyYW0gcGFyYW0sIGZsb2F0IHZhbHVlKQoreworICAgIFNhbXBsZXJTdGF0ZSAqIHNzID0gJnJzYy0+bVN0YXRlU2FtcGxlcjsKKworICAgIHN3aXRjaChwYXJhbSkgeworICAgIGNhc2UgUlNfU0FNUExFUl9BTklTTzoKKyAgICAgICAgc3MtPm1BbmlzbyA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dFKCJBdHRlbXB0aW5nIHRvIHNldCBpbnZhbGlkIHZhbHVlIG9uIHNhbXBsZXIiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQogfQogCiBSc1NhbXBsZXIgcnNpX1NhbXBsZXJDcmVhdGUoQ29udGV4dCAqcnNjKQogewogICAgIFNhbXBsZXJTdGF0ZSAqIHNzID0gJnJzYy0+bVN0YXRlU2FtcGxlcjsKIAotCiAgICAgU2FtcGxlciAqIHMgPSBuZXcgU2FtcGxlcihyc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcy0+bU1hZ0ZpbHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzLT5tTWluRmlsdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3MtPm1XcmFwUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzLT5tV3JhcFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcy0+bVdyYXBSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzLT5tV3JhcFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcy0+bUFuaXNvKTsKICAgICBzLT5pbmNVc2VyUmVmKCk7CiAgICAgcmV0dXJuIHM7CiB9CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2FtcGxlci5oIGIvbGlicy9ycy9yc1NhbXBsZXIuaAppbmRleCAwNTA2MDgxLi40OTQ2MzU1IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2FtcGxlci5oCisrKyBiL2xpYnMvcnMvcnNTYW1wbGVyLmgKQEAgLTM2LDIyICszNiwyOCBAQAogICAgICAgICAgICAgUnNTYW1wbGVyVmFsdWUgbWluRmlsdGVyLAogICAgICAgICAgICAgUnNTYW1wbGVyVmFsdWUgd3JhcFMsCiAgICAgICAgICAgICBSc1NhbXBsZXJWYWx1ZSB3cmFwVCwKLSAgICAgICAgICAgIFJzU2FtcGxlclZhbHVlIHdyYXBSKTsKKyAgICAgICAgICAgIFJzU2FtcGxlclZhbHVlIHdyYXBSLAorICAgICAgICAgICAgZmxvYXQgYW5pc28gPSAxLjBmKTsKIAogICAgIHZpcnR1YWwgflNhbXBsZXIoKTsKIAogICAgIHZvaWQgYmluZChBbGxvY2F0aW9uICopOwotICAgIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICosIGJvb2wgbnBvdCk7CisgICAgdm9pZCBzZXR1cEdMKGNvbnN0IENvbnRleHQgKiwgY29uc3QgQWxsb2NhdGlvbiAqKTsKIAogICAgIHZvaWQgYmluZFRvQ29udGV4dChTYW1wbGVyU3RhdGUgKiwgdWludDMyX3Qgc2xvdCk7CiAgICAgdm9pZCB1bmJpbmRGcm9tQ29udGV4dChTYW1wbGVyU3RhdGUgKik7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9TQU1QTEVSOyB9CisgICAgc3RhdGljIFNhbXBsZXIgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCiBwcm90ZWN0ZWQ6CiAgICAgUnNTYW1wbGVyVmFsdWUgbU1hZ0ZpbHRlcjsKICAgICBSc1NhbXBsZXJWYWx1ZSBtTWluRmlsdGVyOwogICAgIFJzU2FtcGxlclZhbHVlIG1XcmFwUzsKICAgICBSc1NhbXBsZXJWYWx1ZSBtV3JhcFQ7CiAgICAgUnNTYW1wbGVyVmFsdWUgbVdyYXBSOworICAgIGZsb2F0IG1BbmlzbzsKIAogICAgIGludDMyX3QgbUJvdW5kU2xvdDsKIApAQCAtNzAsNiArNzYsNyBAQAogICAgIFJzU2FtcGxlclZhbHVlIG1XcmFwUzsKICAgICBSc1NhbXBsZXJWYWx1ZSBtV3JhcFQ7CiAgICAgUnNTYW1wbGVyVmFsdWUgbVdyYXBSOworICAgIGZsb2F0IG1BbmlzbzsKIAogCiAgICAgT2JqZWN0QmFzZVJlZjxTYW1wbGVyPiBtU2FtcGxlcnNbUlNfTUFYX1NBTVBMRVJfU0xPVF07CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0LmNwcCBiL2xpYnMvcnMvcnNTY3JpcHQuY3BwCmluZGV4IGEzMzkzM2IuLjQzYmIwOWUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTY3JpcHQuY3BwCisrKyBiL2xpYnMvcnMvcnNTY3JpcHQuY3BwCkBAIC0yNCwxOSArMjQsMjUgQEAKICAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CiAgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwogICAgIG1lbXNldCgmbUVudmlyb21lbnQsIDAsIHNpemVvZihtRW52aXJvbWVudCkpOwotICAgIG1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzBdID0gMDsKLSAgICBtRW52aXJvbWVudC5tQ2xlYXJDb2xvclsxXSA9IDA7Ci0gICAgbUVudmlyb21lbnQubUNsZWFyQ29sb3JbMl0gPSAwOwotICAgIG1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzNdID0gMTsKLSAgICBtRW52aXJvbWVudC5tQ2xlYXJEZXB0aCA9IDE7Ci0gICAgbUVudmlyb21lbnQubUNsZWFyU3RlbmNpbCA9IDA7Ci0gICAgbUVudmlyb21lbnQubUlzUm9vdCA9IGZhbHNlOwogfQogCiBTY3JpcHQ6On5TY3JpcHQoKQogewogfQogCit2b2lkIFNjcmlwdDo6c2V0VmFyKHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKnZhbCwgdWludDMyX3QgbGVuKQoreworICAgIGludDMyX3QgKmRlc3RQdHIgPSAoKGludDMyX3QgKiopbUVudmlyb21lbnQubUZpZWxkQWRkcmVzcylbc2xvdF07CisgICAgaWYgKGRlc3RQdHIpIHsKKyAgICAgICAgLy9MT0dFKCJzZXRWYXIgZjEgICVmIiwgKChjb25zdCBmbG9hdCAqKWRlc3RQdHIpWzBdKTsKKyAgICAgICAgLy9MT0dFKCJzZXRWYXIgJXAgJWkiLCBkZXN0UHRyLCBsZW4pOworICAgICAgICBtZW1jcHkoZGVzdFB0ciwgdmFsLCBsZW4pOworICAgICAgICAvL0xPR0UoInNldFZhciBmMiAgJWYiLCAoKGNvbnN0IGZsb2F0ICopZGVzdFB0cilbMF0pOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIkNhbGxpbmcgc2V0VmFyIG9uIHNsb3QgPSAlaSB3aGljaCBpcyBudWxsIiwgc2xvdCk7CisgICAgfQorfQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIApAQCAtNDQsMTYgKzUwLDkgQEAKIHZvaWQgcnNpX1NjcmlwdEJpbmRBbGxvY2F0aW9uKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHNsb3QpCiB7CiAgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKLSAgICBzLT5tU2xvdHNbc2xvdF0uc2V0KHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpKTsKLX0KLQotdm9pZCByc2lfU2NyaXB0U2V0Q2xlYXJDb2xvcihDb250ZXh0ICogcnNjLCBSc1NjcmlwdCB2cywgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOwotICAgIHMtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzBdID0gcjsKLSAgICBzLT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsxXSA9IGc7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMl0gPSBiOwotICAgIHMtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzNdID0gYTsKKyAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7CisgICAgcy0+bVNsb3RzW3Nsb3RdLnNldChhKTsKKyAgICAvL0xPR0UoInJzaV9TY3JpcHRCaW5kQWxsb2NhdGlvbiAlaSAgJXAgICVwIiwgc2xvdCwgYSwgYS0+Z2V0UHRyKCkpOwogfQogCiB2b2lkIHJzaV9TY3JpcHRTZXRUaW1lWm9uZShDb250ZXh0ICogcnNjLCBSc1NjcmlwdCB2cywgY29uc3QgY2hhciAqIHRpbWVab25lLCB1aW50MzJfdCBsZW5ndGgpCkBAIC02Miw1MyArNjEsNTcgQEAKICAgICBzLT5tRW52aXJvbWVudC5tVGltZVpvbmUgPSB0aW1lWm9uZTsKIH0KIAotdm9pZCByc2lfU2NyaXB0U2V0Q2xlYXJEZXB0aChDb250ZXh0ICogcnNjLCBSc1NjcmlwdCB2cywgZmxvYXQgdikKLXsKLSAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOwotICAgIHMtPm1FbnZpcm9tZW50Lm1DbGVhckRlcHRoID0gdjsKLX0KLQotdm9pZCByc2lfU2NyaXB0U2V0Q2xlYXJTdGVuY2lsKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCB2KQotewotICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyU3RlbmNpbCA9IHY7Ci19Ci0KIHZvaWQgcnNpX1NjcmlwdFNldFR5cGUoQ29udGV4dCAqIHJzYywgUnNUeXBlIHZ0LCB1aW50MzJfdCBzbG90LCBib29sIHdyaXRhYmxlLCBjb25zdCBjaGFyICpuYW1lKQogewogICAgIFNjcmlwdENTdGF0ZSAqc3MgPSAmcnNjLT5tU2NyaXB0QzsKICAgICBjb25zdCBUeXBlICp0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgVHlwZSAqPih2dCk7CiAgICAgc3MtPm1Db25zdGFudEJ1ZmZlclR5cGVzW3Nsb3RdLnNldCh0KTsKICAgICBzcy0+bVNsb3RXcml0YWJsZVtzbG90XSA9IHdyaXRhYmxlOwotICAgIGlmIChuYW1lKSB7Ci0gICAgICAgIHNzLT5tU2xvdE5hbWVzW3Nsb3RdLnNldFRvKG5hbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNzLT5tU2xvdE5hbWVzW3Nsb3RdLnNldFRvKCIiKTsKLSAgICB9Ci19Ci0KLXZvaWQgcnNpX1NjcmlwdFNldEludm9rZShDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IHNsb3QpCi17Ci0gICAgU2NyaXB0Q1N0YXRlICpzcyA9ICZyc2MtPm1TY3JpcHRDOwotICAgIHNzLT5tSW52b2thYmxlTmFtZXNbc2xvdF0gPSBuYW1lOworICAgIExPR0UoInJzaV9TY3JpcHRTZXRUeXBlIik7CiB9CiAKIHZvaWQgcnNpX1NjcmlwdEludm9rZShDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90KQogewogICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7Ci0gICAgaWYgKHMtPm1FbnZpcm9tZW50Lm1JbnZva2FibGVzW3Nsb3RdID09IE5VTEwpIHsKLSAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAiQ2FsbGluZyBpbnZva2Ugb24gYmFkIHNjcmlwdCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHMtPnNldHVwU2NyaXB0KCk7Ci0gICAgcy0+bUVudmlyb21lbnQubUludm9rYWJsZXNbc2xvdF0oKTsKKyAgICBzLT5JbnZva2UocnNjLCBzbG90LCBOVUxMLCAwKTsKIH0KIAogCi12b2lkIHJzaV9TY3JpcHRTZXRSb290KENvbnRleHQgKiByc2MsIGJvb2wgaXNSb290KQordm9pZCByc2lfU2NyaXB0SW52b2tlRGF0YShDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90LCB2b2lkICpkYXRhKQogewotICAgIFNjcmlwdENTdGF0ZSAqc3MgPSAmcnNjLT5tU2NyaXB0QzsKLSAgICBzcy0+bVNjcmlwdC0+bUVudmlyb21lbnQubUlzUm9vdCA9IGlzUm9vdDsKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIHMtPkludm9rZShyc2MsIHNsb3QsIE5VTEwsIDApOworfQorCit2b2lkIHJzaV9TY3JpcHRJbnZva2VWKENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbikKK3sKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIHMtPkludm9rZShyc2MsIHNsb3QsIGRhdGEsIGxlbik7Cit9CisKK3ZvaWQgcnNpX1NjcmlwdFNldFZhckkoQ29udGV4dCAqcnNjLCBSc1NjcmlwdCB2cywgdWludDMyX3Qgc2xvdCwgaW50IHZhbHVlKQoreworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+c2V0VmFyKHNsb3QsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Cit9CisKK3ZvaWQgcnNpX1NjcmlwdFNldFZhckYoQ29udGV4dCAqcnNjLCBSc1NjcmlwdCB2cywgdWludDMyX3Qgc2xvdCwgZmxvYXQgdmFsdWUpCit7CisgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKKyAgICBzLT5zZXRWYXIoc2xvdCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKK30KKwordm9pZCByc2lfU2NyaXB0U2V0VmFyRChDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90LCBkb3VibGUgdmFsdWUpCit7CisgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKKyAgICBzLT5zZXRWYXIoc2xvdCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKK30KKwordm9pZCByc2lfU2NyaXB0U2V0VmFyVihDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pCit7CisgICAgY29uc3QgZmxvYXQgKmZwID0gKGNvbnN0IGZsb2F0ICopZGF0YTsKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIHMtPnNldFZhcihzbG90LCBkYXRhLCBsZW4pOwogfQogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTY3JpcHQuaCBiL2xpYnMvcnMvcnNTY3JpcHQuaAppbmRleCA1ZjRhNTM2Li4wYTIwMzQ0IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2NyaXB0LmgKKysrIGIvbGlicy9ycy9yc1NjcmlwdC5oCkBAIC0yNyw5ICsyNyw5IEBACiBjbGFzcyBQcm9ncmFtVmVydGV4OwogY2xhc3MgUHJvZ3JhbUZyYWdtZW50OwogY2xhc3MgUHJvZ3JhbVJhc3RlcjsKLWNsYXNzIFByb2dyYW1GcmFnbWVudFN0b3JlOworY2xhc3MgUHJvZ3JhbVN0b3JlOwogCi0jZGVmaW5lIE1BWF9TQ1JJUFRfQkFOS1MgMTYKKyNkZWZpbmUgTUFYX1NDUklQVF9CQU5LUyAzMgogCiBjbGFzcyBTY3JpcHQgOiBwdWJsaWMgT2JqZWN0QmFzZQogewpAQCAtMzksMzggKzM5LDQzIEBACiAgICAgU2NyaXB0KENvbnRleHQgKik7CiAgICAgdmlydHVhbCB+U2NyaXB0KCk7CiAKLQogICAgIHN0cnVjdCBFbnZpcm9tZW50X3QgewotICAgICAgICBib29sIG1Jc1Jvb3Q7Ci0gICAgICAgIGZsb2F0IG1DbGVhckNvbG9yWzRdOwotICAgICAgICBmbG9hdCBtQ2xlYXJEZXB0aDsKLSAgICAgICAgdWludDMyX3QgbUNsZWFyU3RlbmNpbDsKLQotICAgICAgICB1aW50MzJfdCBtU3RhcnRUaW1lTWlsbGlzOworICAgICAgICBpbnQ2NF90IG1TdGFydFRpbWVNaWxsaXM7CisgICAgICAgIGludDY0X3QgbUxhc3REdFRpbWU7CiAgICAgICAgIGNvbnN0IGNoYXIqIG1UaW1lWm9uZTsKIAogICAgICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1WZXJ0ZXg+IG1WZXJ0ZXg7CiAgICAgICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50PiBtRnJhZ21lbnQ7CiAgICAgICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVJhc3Rlcj4gbVJhc3RlcjsKLSAgICAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gbUZyYWdtZW50U3RvcmU7Ci0gICAgICAgIEludm9rZUZ1bmNfdCBtSW52b2thYmxlc1tNQVhfU0NSSVBUX0JBTktTXTsKKyAgICAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtU3RvcmU+IG1GcmFnbWVudFN0b3JlOworCisgICAgICAgIHVpbnQzMl90IG1JbnZva2VGdW5jdGlvbkNvdW50OworICAgICAgICBJbnZva2VGdW5jX3QgKm1JbnZva2VGdW5jdGlvbnM7CisgICAgICAgIHVpbnQzMl90IG1GaWVsZENvdW50OworICAgICAgICB2b2lkICoqIG1GaWVsZEFkZHJlc3M7CisKICAgICAgICAgY2hhciAqIG1TY3JpcHRUZXh0OwogICAgICAgICB1aW50MzJfdCBtU2NyaXB0VGV4dExlbmd0aDsKKworICAgICAgICBib29sIG1Jc1RocmVhZGFibGU7CiAgICAgfTsKICAgICBFbnZpcm9tZW50X3QgbUVudmlyb21lbnQ7CiAKLSAgICB1aW50MzJfdCBtQ291bnN0YW50QnVmZmVyQ291bnQ7Ci0KLQogICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbVNsb3RzW01BWF9TQ1JJUFRfQkFOS1NdOwogICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT4gbVR5cGVzW01BWF9TQ1JJUFRfQkFOS1NdOwotICAgIFN0cmluZzggbVNsb3ROYW1lc1tNQVhfU0NSSVBUX0JBTktTXTsKICAgICBib29sIG1TbG90V3JpdGFibGVbTUFYX1NDUklQVF9CQU5LU107CiAKKyAgICB2b2lkIHNldFZhcih1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICp2YWwsIHVpbnQzMl90IGxlbik7CiAKKyAgICB2aXJ0dWFsIHZvaWQgcnVuRm9yRWFjaChDb250ZXh0ICpyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxsb2NhdGlvbiAqIGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0aW9uICogYW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogdXNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJzU2NyaXB0Q2FsbCAqc2MgPSBOVUxMKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0dXBTY3JpcHQoKSA9IDA7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBydW4oQ29udGV4dCAqLCB1aW50MzJfdCBsYXVuY2hJRCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBJbnZva2UoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0dXBTY3JpcHQoQ29udGV4dCAqcnNjKSA9IDA7CisgICAgdmlydHVhbCB1aW50MzJfdCBydW4oQ29udGV4dCAqKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTY3JpcHRDLmNwcCBiL2xpYnMvcnMvcnNTY3JpcHRDLmNwcAppbmRleCBmNGQyNDUxLi5jNjQxOGJlIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2NyaXB0Qy5jcHAKKysrIGIvbGlicy9ycy9yc1NjcmlwdEMuY3BwCkBAIC0xNyw5ICsxNyw5IEBACiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCiAjaW5jbHVkZSAicnNTY3JpcHRDLmgiCiAjaW5jbHVkZSAicnNNYXRyaXguaCIKLQotI2luY2x1ZGUgImFjYy9hY2MuaCIKKyNpbmNsdWRlICIuLi8uLi9jb21waWxlL2xpYmJjYy9pbmNsdWRlL2JjYy9iY2MuaCIKICNpbmNsdWRlICJ1dGlscy9UaW1lcnMuaCIKKyNpbmNsdWRlICJ1dGlscy9TdG9wV2F0Y2guaCIKIAogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KICNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CkBAIC0zNyw0MCArMzcsODQgQEAKIHsKICAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CiAgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwotICAgIG1BY2NTY3JpcHQgPSBOVUxMOworICAgIG1CY2NTY3JpcHQgPSBOVUxMOwogICAgIG1lbXNldCgmbVByb2dyYW0sIDAsIHNpemVvZihtUHJvZ3JhbSkpOwogfQogCiBTY3JpcHRDOjp+U2NyaXB0QygpCiB7Ci0gICAgaWYgKG1BY2NTY3JpcHQpIHsKLSAgICAgICAgYWNjRGVsZXRlU2NyaXB0KG1BY2NTY3JpcHQpOworICAgIGlmIChtQmNjU2NyaXB0KSB7CisgICAgICAgIGJjY0RlbGV0ZVNjcmlwdChtQmNjU2NyaXB0KTsKICAgICB9CiAgICAgZnJlZShtRW52aXJvbWVudC5tU2NyaXB0VGV4dCk7CiAgICAgbUVudmlyb21lbnQubVNjcmlwdFRleHQgPSBOVUxMOwogfQogCi12b2lkIFNjcmlwdEM6OnNldHVwU2NyaXB0KCkKK3ZvaWQgU2NyaXB0Qzo6c2V0dXBTY3JpcHQoQ29udGV4dCAqcnNjKQogewotICAgIGZvciAoaW50IGN0PTA7IGN0IDwgTUFYX1NDUklQVF9CQU5LUzsgY3QrKykgewotICAgICAgICBpZiAobVByb2dyYW0ubVNsb3RQb2ludGVyc1tjdF0pIHsKLSAgICAgICAgICAgICptUHJvZ3JhbS5tU2xvdFBvaW50ZXJzW2N0XSA9IG1TbG90c1tjdF0tPmdldFB0cigpOworICAgIHNldHVwR0xTdGF0ZShyc2MpOworICAgIG1FbnZpcm9tZW50Lm1TdGFydFRpbWVNaWxsaXMKKyAgICAgICAgICAgICAgICA9IG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyhzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykpOworCisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1FbnZpcm9tZW50Lm1GaWVsZENvdW50OyBjdCsrKSB7CisgICAgICAgIGlmIChtU2xvdHNbY3RdLmdldCgpICYmICFtVHlwZXNbY3RdLmdldCgpKSB7CisgICAgICAgICAgICBtVHlwZXNbY3RdLnNldChtU2xvdHNbY3RdLT5nZXRUeXBlKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtVHlwZXNbY3RdLmdldCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHZvaWQgKnB0ciA9IE5VTEw7CisgICAgICAgIGlmIChtU2xvdHNbY3RdLmdldCgpKSB7CisgICAgICAgICAgICBwdHIgPSBtU2xvdHNbY3RdLT5nZXRQdHIoKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkICoqZGVzdCA9ICgodm9pZCAqKiopbUVudmlyb21lbnQubUZpZWxkQWRkcmVzcylbY3RdOworCisgICAgICAgIGlmIChyc2MtPnByb3BzLm1Mb2dTY3JpcHRzKSB7CisgICAgICAgICAgICBMT0dWKCIlcCBTY3JpcHRDOjpzZXR1cFNjcmlwdCBzbG90PSVpICBkc3Q9JXAgIHNyYz0lcCAgdHlwZT0lcCIsIHJzYywgY3QsIGRlc3QsIHB0ciwgbVNsb3RzW2N0XS0+Z2V0VHlwZSgpKTsKKworICAgICAgICAgICAgLy9jb25zdCB1aW50MzJfdCAqcDMyID0gKGNvbnN0IHVpbnQzMl90ICopcHRyOworICAgICAgICAgICAgLy9mb3IgKHVpbnQzMl90IGN0Mj0wOyBjdDIgPCBtU2xvdHNbY3RdLT5nZXRUeXBlKCktPmdldERpbVgoKTsgY3QyKyspIHsKKyAgICAgICAgICAgICAgICAvL0xPR0UoIiAgJWkgPSAweCUwOHggIiwgY3QyLCBwMzJbY3QyXSk7CisgICAgICAgICAgICAvL30KKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXN0KSB7CisgICAgICAgICAgICAqZGVzdCA9IHB0cjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIlNjcmlwdEM6OnNldHVwU2NyaXB0LCBOVUxMIHZhciBiaW5kaW5nIGFkZHJlc3MuIik7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLQotdWludDMyX3QgU2NyaXB0Qzo6cnVuKENvbnRleHQgKnJzYywgdWludDMyX3QgbGF1bmNoSW5kZXgpCitjb25zdCBBbGxvY2F0aW9uICpTY3JpcHRDOjpwdHJUb0FsbG9jYXRpb24oY29uc3Qgdm9pZCAqcHRyKSBjb25zdAogewotICAgIGlmIChtUHJvZ3JhbS5tU2NyaXB0ID09IE5VTEwpIHsKLSAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAiQXR0ZW1wdGVkIHRvIHJ1biBiYWQgc2NyaXB0Iik7Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmICghcHRyKSB7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUVudmlyb21lbnQubUZpZWxkQ291bnQ7IGN0KyspIHsKKyAgICAgICAgaWYgKCFtU2xvdHNbY3RdLmdldCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChtU2xvdHNbY3RdLT5nZXRQdHIoKSA9PSBwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBtU2xvdHNbY3RdLmdldCgpOworICAgICAgICB9CisgICAgfQorICAgIExPR0UoIlNjcmlwdEM6OnB0clRvQWxsb2NhdGlvbiwgZmFpbGVkIHRvIGZpbmQgJXAiLCBwdHIpOworICAgIHJldHVybiBOVUxMOworfQogCi0gICAgQ29udGV4dDo6U2NyaXB0VExTU3RydWN0ICogdGxzID0KLSAgICAoQ29udGV4dDo6U2NyaXB0VExTU3RydWN0ICopcHRocmVhZF9nZXRzcGVjaWZpYyhDb250ZXh0OjpnVGhyZWFkVExTS2V5KTsKK1NjcmlwdCAqIFNjcmlwdEM6OnNldFRMUyhTY3JpcHQgKnNjKQoreworICAgIENvbnRleHQ6OlNjcmlwdFRMU1N0cnVjdCAqIHRscyA9IChDb250ZXh0OjpTY3JpcHRUTFNTdHJ1Y3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2dldHNwZWNpZmljKENvbnRleHQ6OmdUaHJlYWRUTFNLZXkpOwogICAgIHJzQXNzZXJ0KHRscyk7CisgICAgU2NyaXB0ICpvbGQgPSB0bHMtPm1TY3JpcHQ7CisgICAgdGxzLT5tU2NyaXB0ID0gc2M7CisgICAgcmV0dXJuIG9sZDsKK30KIAorCit2b2lkIFNjcmlwdEM6OnNldHVwR0xTdGF0ZShDb250ZXh0ICpyc2MpCit7CiAgICAgaWYgKG1FbnZpcm9tZW50Lm1GcmFnbWVudFN0b3JlLmdldCgpKSB7CiAgICAgICAgIHJzYy0+c2V0RnJhZ21lbnRTdG9yZShtRW52aXJvbWVudC5tRnJhZ21lbnRTdG9yZS5nZXQoKSk7CiAgICAgfQpAQCAtODMsNTEgKzEyNywyNjcgQEAKICAgICBpZiAobUVudmlyb21lbnQubVJhc3Rlci5nZXQoKSkgewogICAgICAgICByc2MtPnNldFJhc3RlcihtRW52aXJvbWVudC5tUmFzdGVyLmdldCgpKTsKICAgICB9Cit9CiAKLSAgICBpZiAobGF1bmNoSW5kZXggPT0gMCkgewotICAgICAgICBtRW52aXJvbWVudC5tU3RhcnRUaW1lTWlsbGlzCi0gICAgICAgICAgICAgICAgPSBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMoc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpKTsKK3VpbnQzMl90IFNjcmlwdEM6OnJ1bihDb250ZXh0ICpyc2MpCit7CisgICAgaWYgKG1Qcm9ncmFtLm1Sb290ID09IE5VTEwpIHsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAiQXR0ZW1wdGVkIHRvIHJ1biBiYWQgc2NyaXB0Iik7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBzZXR1cFNjcmlwdCgpOworCisgICAgc2V0dXBTY3JpcHQocnNjKTsKIAogICAgIHVpbnQzMl90IHJldCA9IDA7Ci0gICAgdGxzLT5tU2NyaXB0ID0gdGhpczsKLSAgICByZXQgPSBtUHJvZ3JhbS5tU2NyaXB0KGxhdW5jaEluZGV4KTsKLSAgICB0bHMtPm1TY3JpcHQgPSBOVUxMOworICAgIFNjcmlwdCAqIG9sZFRMUyA9IHNldFRMUyh0aGlzKTsKKworICAgIGlmIChyc2MtPnByb3BzLm1Mb2dTY3JpcHRzKSB7CisgICAgICAgIExPR1YoIiVwIFNjcmlwdEM6OnJ1biBpbnZva2luZyByb290LCAgcHRyICVwIiwgcnNjLCBtUHJvZ3JhbS5tUm9vdCk7CisgICAgfQorCisgICAgcmV0ID0gbVByb2dyYW0ubVJvb3QoKTsKKworICAgIGlmIChyc2MtPnByb3BzLm1Mb2dTY3JpcHRzKSB7CisgICAgICAgIExPR1YoIiVwIFNjcmlwdEM6OnJ1biBpbnZva2luZyBjb21wbGV0ZSwgcmV0PSVpIiwgcnNjLCByZXQpOworICAgIH0KKworICAgIHNldFRMUyhvbGRUTFMpOwogICAgIHJldHVybiByZXQ7CiB9CiAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENvbnRleHQgKnJzYzsKKyAgICBTY3JpcHRDICpzY3JpcHQ7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqIGFpbjsKKyAgICBBbGxvY2F0aW9uICogYW91dDsKKyAgICBjb25zdCB2b2lkICogdXNyOworCisgICAgdWludDMyX3QgbVNsaWNlU2l6ZTsKKyAgICB2b2xhdGlsZSBpbnQgbVNsaWNlTnVtOworCisgICAgY29uc3QgdWludDhfdCAqcHRySW47CisgICAgdWludDMyX3QgZVN0cmlkZUluOworICAgIHVpbnQ4X3QgKnB0ck91dDsKKyAgICB1aW50MzJfdCBlU3RyaWRlT3V0OworCisgICAgdWludDMyX3QgeFN0YXJ0OworICAgIHVpbnQzMl90IHhFbmQ7CisgICAgdWludDMyX3QgeVN0YXJ0OworICAgIHVpbnQzMl90IHlFbmQ7CisgICAgdWludDMyX3QgelN0YXJ0OworICAgIHVpbnQzMl90IHpFbmQ7CisgICAgdWludDMyX3QgYXJyYXlTdGFydDsKKyAgICB1aW50MzJfdCBhcnJheUVuZDsKKworICAgIHVpbnQzMl90IGRpbVg7CisgICAgdWludDMyX3QgZGltWTsKKyAgICB1aW50MzJfdCBkaW1aOworICAgIHVpbnQzMl90IGRpbUFycmF5OworfSBNVExhdW5jaFN0cnVjdDsKK3R5cGVkZWYgaW50ICgqcnNfdCkoY29uc3Qgdm9pZCAqLCB2b2lkICosIGNvbnN0IHZvaWQgKiwgdWludDMyX3QsIHVpbnQzMl90LCB1aW50MzJfdCwgdWludDMyX3QpOworCitzdGF0aWMgdm9pZCB3Y194eSh2b2lkICp1c3IsIHVpbnQzMl90IGlkeCkKK3sKKyAgICBNVExhdW5jaFN0cnVjdCAqbXRscyA9IChNVExhdW5jaFN0cnVjdCAqKXVzcjsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHVpbnQzMl90IHNsaWNlID0gKHVpbnQzMl90KWFuZHJvaWRfYXRvbWljX2luYygmbXRscy0+bVNsaWNlTnVtKTsKKyAgICAgICAgdWludDMyX3QgeVN0YXJ0ID0gbXRscy0+eVN0YXJ0ICsgc2xpY2UgKiBtdGxzLT5tU2xpY2VTaXplOworICAgICAgICB1aW50MzJfdCB5RW5kID0geVN0YXJ0ICsgbXRscy0+bVNsaWNlU2l6ZTsKKyAgICAgICAgeUVuZCA9IHJzTWluKHlFbmQsIG10bHMtPnlFbmQpOworICAgICAgICBpZiAoeUVuZCA8PSB5U3RhcnQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vTE9HRSgidXNyIGlkeCAlaSwgeCAlaSwlaSAgeSAlaSwlaSIsIGlkeCwgbXRscy0+eFN0YXJ0LCBtdGxzLT54RW5kLCB5U3RhcnQsIHlFbmQpOworICAgICAgICAvL0xPR0UoInVzciBwdHIgaW4gJXAsICBvdXQgJXAiLCBtdGxzLT5wdHJJbiwgbXRscy0+cHRyT3V0KTsKKyAgICAgICAgZm9yICh1aW50MzJfdCB5ID0geVN0YXJ0OyB5IDwgeUVuZDsgeSsrKSB7CisgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSBtdGxzLT5kaW1YICogeTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnhQdHJPdXQgPSBtdGxzLT5wdHJPdXQgKyAobXRscy0+ZVN0cmlkZU91dCAqIG9mZnNldCk7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICp4UHRySW4gPSBtdGxzLT5wdHJJbiArIChtdGxzLT5lU3RyaWRlSW4gKiBvZmZzZXQpOworCisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHggPSBtdGxzLT54U3RhcnQ7IHggPCBtdGxzLT54RW5kOyB4KyspIHsKKyAgICAgICAgICAgICAgICAoKHJzX3QpbXRscy0+c2NyaXB0LT5tUHJvZ3JhbS5tUm9vdCkgKHhQdHJJbiwgeFB0ck91dCwgbXRscy0+dXNyLCB4LCB5LCAwLCAwKTsKKyAgICAgICAgICAgICAgICB4UHRySW4gKz0gbXRscy0+ZVN0cmlkZUluOworICAgICAgICAgICAgICAgIHhQdHJPdXQgKz0gbXRscy0+ZVN0cmlkZU91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQorCit2b2lkIFNjcmlwdEM6OnJ1bkZvckVhY2goQ29udGV4dCAqcnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFsbG9jYXRpb24gKiBhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhdGlvbiAqIGFvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIHVzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSc1NjcmlwdENhbGwgKnNjKQoreworICAgIE1UTGF1bmNoU3RydWN0IG10bHM7CisgICAgbWVtc2V0KCZtdGxzLCAwLCBzaXplb2YobXRscykpOworCisgICAgaWYgKGFpbikgeworICAgICAgICBtdGxzLmRpbVggPSBhaW4tPmdldFR5cGUoKS0+Z2V0RGltWCgpOworICAgICAgICBtdGxzLmRpbVkgPSBhaW4tPmdldFR5cGUoKS0+Z2V0RGltWSgpOworICAgICAgICBtdGxzLmRpbVogPSBhaW4tPmdldFR5cGUoKS0+Z2V0RGltWigpOworICAgICAgICAvL210bHMuZGltQXJyYXkgPSBhaW4tPmdldFR5cGUoKS0+Z2V0RGltQXJyYXkoKTsKKyAgICB9IGVsc2UgaWYgKGFvdXQpIHsKKyAgICAgICAgbXRscy5kaW1YID0gYW91dC0+Z2V0VHlwZSgpLT5nZXREaW1YKCk7CisgICAgICAgIG10bHMuZGltWSA9IGFvdXQtPmdldFR5cGUoKS0+Z2V0RGltWSgpOworICAgICAgICBtdGxzLmRpbVogPSBhb3V0LT5nZXRUeXBlKCktPmdldERpbVooKTsKKyAgICAgICAgLy9tdGxzLmRpbUFycmF5ID0gYW91dC0+Z2V0VHlwZSgpLT5nZXREaW1BcnJheSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1NDUklQVCwgInJzRm9yRWFjaCBjYWxsZWQgd2l0aCBudWxsIGFsbG9jYXRpb25zIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXNjIHx8IChzYy0+eEVuZCA9PSAwKSkgeworICAgICAgICBtdGxzLnhFbmQgPSBtdGxzLmRpbVg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcnNBc3NlcnQoc2MtPnhTdGFydCA8IG10bHMuZGltWCk7CisgICAgICAgIHJzQXNzZXJ0KHNjLT54RW5kIDw9IG10bHMuZGltWCk7CisgICAgICAgIHJzQXNzZXJ0KHNjLT54U3RhcnQgPCBzYy0+eEVuZCk7CisgICAgICAgIG10bHMueFN0YXJ0ID0gcnNNaW4obXRscy5kaW1YLCBzYy0+eFN0YXJ0KTsKKyAgICAgICAgbXRscy54RW5kID0gcnNNaW4obXRscy5kaW1YLCBzYy0+eEVuZCk7CisgICAgICAgIGlmIChtdGxzLnhTdGFydCA+PSBtdGxzLnhFbmQpIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXNjIHx8IChzYy0+eUVuZCA9PSAwKSkgeworICAgICAgICBtdGxzLnlFbmQgPSBtdGxzLmRpbVk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcnNBc3NlcnQoc2MtPnlTdGFydCA8IG10bHMuZGltWSk7CisgICAgICAgIHJzQXNzZXJ0KHNjLT55RW5kIDw9IG10bHMuZGltWSk7CisgICAgICAgIHJzQXNzZXJ0KHNjLT55U3RhcnQgPCBzYy0+eUVuZCk7CisgICAgICAgIG10bHMueVN0YXJ0ID0gcnNNaW4obXRscy5kaW1ZLCBzYy0+eVN0YXJ0KTsKKyAgICAgICAgbXRscy55RW5kID0gcnNNaW4obXRscy5kaW1ZLCBzYy0+eUVuZCk7CisgICAgICAgIGlmIChtdGxzLnlTdGFydCA+PSBtdGxzLnlFbmQpIHJldHVybjsKKyAgICB9CisKKyAgICBtdGxzLnhFbmQgPSByc01heCgodWludDMyX3QpMSwgbXRscy54RW5kKTsKKyAgICBtdGxzLnlFbmQgPSByc01heCgodWludDMyX3QpMSwgbXRscy55RW5kKTsKKyAgICBtdGxzLnpFbmQgPSByc01heCgodWludDMyX3QpMSwgbXRscy56RW5kKTsKKyAgICBtdGxzLmFycmF5RW5kID0gcnNNYXgoKHVpbnQzMl90KTEsIG10bHMuYXJyYXlFbmQpOworCisgICAgcnNBc3NlcnQoYWluLT5nZXRUeXBlKCktPmdldERpbVooKSA9PSAwKTsKKworICAgIHNldHVwU2NyaXB0KHJzYyk7CisgICAgU2NyaXB0ICogb2xkVExTID0gc2V0VExTKHRoaXMpOworCisKKyAgICBtdGxzLnJzYyA9IHJzYzsKKyAgICBtdGxzLmFpbiA9IGFpbjsKKyAgICBtdGxzLmFvdXQgPSBhb3V0OworICAgIG10bHMuc2NyaXB0ID0gdGhpczsKKyAgICBtdGxzLnVzciA9IHVzcjsKKyAgICBtdGxzLm1TbGljZVNpemUgPSAxMDsKKyAgICBtdGxzLm1TbGljZU51bSA9IDA7CisKKyAgICBtdGxzLnB0ckluID0gTlVMTDsKKyAgICBtdGxzLmVTdHJpZGVJbiA9IDA7CisgICAgaWYgKGFpbikgeworICAgICAgICBtdGxzLnB0ckluID0gKGNvbnN0IHVpbnQ4X3QgKilhaW4tPmdldFB0cigpOworICAgICAgICBtdGxzLmVTdHJpZGVJbiA9IGFpbi0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50U2l6ZUJ5dGVzKCk7CisgICAgfQorCisgICAgbXRscy5wdHJPdXQgPSBOVUxMOworICAgIG10bHMuZVN0cmlkZU91dCA9IDA7CisgICAgaWYgKGFvdXQpIHsKKyAgICAgICAgbXRscy5wdHJPdXQgPSAodWludDhfdCAqKWFvdXQtPmdldFB0cigpOworICAgICAgICBtdGxzLmVTdHJpZGVPdXQgPSBhb3V0LT5nZXRUeXBlKCktPmdldEVsZW1lbnRTaXplQnl0ZXMoKTsKKyAgICB9CisKKyAgICBpZiAoKHJzYy0+Z2V0V29ya2VyUG9vbFNpemUoKSA+IDEpICYmIG1FbnZpcm9tZW50Lm1Jc1RocmVhZGFibGUgJiYgKG10bHMuZGltWSA+IDEpKSB7CisKKyAgICAgICAgLy9MT0dFKCJsYXVuY2ggMSIpOworICAgICAgICByc2MtPmxhdW5jaFRocmVhZHMod2NfeHksICZtdGxzKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvL0xPR0UoImxhdW5jaCAzIik7CisgICAgICAgIGZvciAodWludDMyX3QgYXIgPSBtdGxzLmFycmF5U3RhcnQ7IGFyIDwgbXRscy5hcnJheUVuZDsgYXIrKykgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCB6ID0gbXRscy56U3RhcnQ7IHogPCBtdGxzLnpFbmQ7IHorKykgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgeSA9IG10bHMueVN0YXJ0OyB5IDwgbXRscy55RW5kOyB5KyspIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gbXRscy5kaW1YICogbXRscy5kaW1ZICogbXRscy5kaW1aICogYXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdGxzLmRpbVggKiBtdGxzLmRpbVkgKiB6ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXRscy5kaW1YICogeTsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqeFB0ck91dCA9IG10bHMucHRyT3V0ICsgKG10bHMuZVN0cmlkZU91dCAqIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnhQdHJJbiA9IG10bHMucHRySW4gKyAobXRscy5lU3RyaWRlSW4gKiBvZmZzZXQpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgeCA9IG10bHMueFN0YXJ0OyB4IDwgbXRscy54RW5kOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICgocnNfdCltUHJvZ3JhbS5tUm9vdCkgKHhQdHJJbiwgeFB0ck91dCwgdXNyLCB4LCB5LCB6LCBhcik7CisgICAgICAgICAgICAgICAgICAgICAgICB4UHRySW4gKz0gbXRscy5lU3RyaWRlSW47CisgICAgICAgICAgICAgICAgICAgICAgICB4UHRyT3V0ICs9IG10bHMuZVN0cmlkZU91dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHNldFRMUyhvbGRUTFMpOworfQorCit2b2lkIFNjcmlwdEM6Okludm9rZShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbikKK3sKKyAgICAvL0xPR0UoInJzaV9TY3JpcHRJbnZva2UgJWkiLCBzbG90KTsKKyAgICBpZiAoKHNsb3QgPj0gbUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uQ291bnQpIHx8CisgICAgICAgIChtRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25zW3Nsb3RdID09IE5VTEwpKSB7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1NDUklQVCwgIkNhbGxpbmcgaW52b2tlIG9uIGJhZCBzY3JpcHQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzZXR1cFNjcmlwdChyc2MpOworICAgIFNjcmlwdCAqIG9sZFRMUyA9IHNldFRMUyh0aGlzKTsKKworICAgIGlmIChyc2MtPnByb3BzLm1Mb2dTY3JpcHRzKSB7CisgICAgICAgIExPR1YoIiVwIFNjcmlwdEM6Okludm9rZSBpbnZva2luZyBzbG90ICVpLCAgcHRyICVwIiwgcnNjLCBzbG90LCBtRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25zW3Nsb3RdKTsKKyAgICB9CisgICAgKCh2b2lkICgqKShjb25zdCB2b2lkICosIHVpbnQzMl90KSkKKyAgICAgICAgbUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uc1tzbG90XSkoZGF0YSwgbGVuKTsKKyAgICBpZiAocnNjLT5wcm9wcy5tTG9nU2NyaXB0cykgeworICAgICAgICBMT0dWKCIlcCBTY3JpcHRDOjpJbnZva2UgY29tcGxldGUiLCByc2MpOworICAgIH0KKworICAgIHNldFRMUyhvbGRUTFMpOworfQorCiBTY3JpcHRDU3RhdGU6OlNjcmlwdENTdGF0ZSgpCiB7Ci0gICAgbVNjcmlwdCA9IE5VTEw7Ci0gICAgY2xlYXIoKTsKKyAgICBtU2NyaXB0LmNsZWFyKCk7CiB9CiAKIFNjcmlwdENTdGF0ZTo6flNjcmlwdENTdGF0ZSgpCiB7Ci0gICAgZGVsZXRlIG1TY3JpcHQ7Ci0gICAgbVNjcmlwdCA9IE5VTEw7CisgICAgbVNjcmlwdC5jbGVhcigpOwogfQogCi12b2lkIFNjcmlwdENTdGF0ZTo6Y2xlYXIoKQordm9pZCBTY3JpcHRDU3RhdGU6OmluaXQoQ29udGV4dCAqcnNjKQogeworICAgIGNsZWFyKHJzYyk7Cit9CisKK3ZvaWQgU2NyaXB0Q1N0YXRlOjpjbGVhcihDb250ZXh0ICpyc2MpCit7CisgICAgcnNBc3NlcnQocnNjKTsKICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgTUFYX1NDUklQVF9CQU5LUzsgY3QrKykgewogICAgICAgICBtQ29uc3RhbnRCdWZmZXJUeXBlc1tjdF0uY2xlYXIoKTsKLSAgICAgICAgbVNsb3ROYW1lc1tjdF0uc2V0VG8oIiIpOwotICAgICAgICBtSW52b2thYmxlTmFtZXNbY3RdLnNldFRvKCIiKTsKICAgICAgICAgbVNsb3RXcml0YWJsZVtjdF0gPSBmYWxzZTsKICAgICB9CiAKLSAgICBkZWxldGUgbVNjcmlwdDsKLSAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdEMoTlVMTCk7Ci0KLSAgICBtSW50MzJEZWZpbmVzLmNsZWFyKCk7Ci0gICAgbUZsb2F0RGVmaW5lcy5jbGVhcigpOworICAgIG1TY3JpcHQuY2xlYXIoKTsKKyAgICBtU2NyaXB0LnNldChuZXcgU2NyaXB0Qyhyc2MpKTsKIH0KIAotc3RhdGljIEFDQ3ZvaWQqIHN5bWJvbExvb2t1cChBQ0N2b2lkKiBwQ29udGV4dCwgY29uc3QgQUNDY2hhciogbmFtZSkKK3N0YXRpYyBCQ0N2b2lkKiBzeW1ib2xMb29rdXAoQkNDdm9pZCogcENvbnRleHQsIGNvbnN0IEJDQ2NoYXIqIG5hbWUpCiB7Ci0gICAgY29uc3QgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICpzeW0gPSBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbChuYW1lKTsKKyAgICBjb25zdCBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKnN5bTsKKyAgICBTY3JpcHRDICpzID0gKFNjcmlwdEMgKilwQ29udGV4dDsKKyAgICBzeW0gPSBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbChuYW1lKTsKKyAgICBpZiAoc3ltKSB7CisgICAgICAgIHJldHVybiBzeW0tPm1QdHI7CisgICAgfQorICAgIHN5bSA9IFNjcmlwdENTdGF0ZTo6bG9va3VwU3ltYm9sQ0wobmFtZSk7CisgICAgaWYgKHN5bSkgeworICAgICAgICByZXR1cm4gc3ltLT5tUHRyOworICAgIH0KKyAgICBzLT5tRW52aXJvbWVudC5tSXNUaHJlYWRhYmxlID0gZmFsc2U7CisgICAgc3ltID0gU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2xHTChuYW1lKTsKICAgICBpZiAoc3ltKSB7CiAgICAgICAgIHJldHVybiBzeW0tPm1QdHI7CiAgICAgfQpAQCAtMTM3LDY1ICszOTcsNTIgQEAKIAogdm9pZCBTY3JpcHRDU3RhdGU6OnJ1bkNvbXBpbGVyKENvbnRleHQgKnJzYywgU2NyaXB0QyAqcykKIHsKLSAgICBzLT5tQWNjU2NyaXB0ID0gYWNjQ3JlYXRlU2NyaXB0KCk7Ci0gICAgU3RyaW5nOCB0bXA7Ci0KLSAgICByc2MtPmFwcGVuZE5hbWVEZWZpbmVzKCZ0bXApOwotICAgIGFwcGVuZERlY2xzKCZ0bXApOwotICAgIGFwcGVuZFZhckRlZmluZXMocnNjLCAmdG1wKTsKLSAgICBhcHBlbmRUeXBlcyhyc2MsICZ0bXApOwotICAgIHRtcC5hcHBlbmQoIiNsaW5lIDFcbiIpOwotCi0gICAgY29uc3QgY2hhciogc2NyaXB0U291cmNlW10gPSB7dG1wLnN0cmluZygpLCBzLT5tRW52aXJvbWVudC5tU2NyaXB0VGV4dH07Ci0gICAgaW50IHNjcmlwdExlbmd0aFtdID0ge3RtcC5sZW5ndGgoKSwgcy0+bUVudmlyb21lbnQubVNjcmlwdFRleHRMZW5ndGh9IDsKLSAgICBhY2NTY3JpcHRTb3VyY2Uocy0+bUFjY1NjcmlwdCwgc2l6ZW9mKHNjcmlwdExlbmd0aCkgLyBzaXplb2YoaW50KSwgc2NyaXB0U291cmNlLCBzY3JpcHRMZW5ndGgpOwotICAgIGFjY1JlZ2lzdGVyU3ltYm9sQ2FsbGJhY2socy0+bUFjY1NjcmlwdCwgc3ltYm9sTG9va3VwLCBOVUxMKTsKLSAgICBhY2NDb21waWxlU2NyaXB0KHMtPm1BY2NTY3JpcHQpOwotICAgIGFjY0dldFNjcmlwdExhYmVsKHMtPm1BY2NTY3JpcHQsICJtYWluIiwgKEFDQ3ZvaWQqKikgJnMtPm1Qcm9ncmFtLm1TY3JpcHQpOwotICAgIGFjY0dldFNjcmlwdExhYmVsKHMtPm1BY2NTY3JpcHQsICJpbml0IiwgKEFDQ3ZvaWQqKikgJnMtPm1Qcm9ncmFtLm1Jbml0KTsKLSAgICByc0Fzc2VydChzLT5tUHJvZ3JhbS5tU2NyaXB0KTsKLQotICAgIGlmICghcy0+bVByb2dyYW0ubVNjcmlwdCkgewotICAgICAgICBBQ0NjaGFyIGJ1Zls0MDk2XTsKLSAgICAgICAgQUNDc2l6ZWkgbGVuOwotICAgICAgICBhY2NHZXRTY3JpcHRJbmZvTG9nKHMtPm1BY2NTY3JpcHQsIHNpemVvZihidWYpLCAmbGVuLCBidWYpOwotICAgICAgICBMT0dFKCIlcyIsIGJ1Zik7Ci0gICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1NDUklQVCwgIkVycm9yIGNvbXBpbGluZyB1c2VyIHNjcmlwdC4iKTsKLSAgICAgICAgcmV0dXJuOworICAgIExPR1YoIiVwIFNjcmlwdENTdGF0ZTo6cnVuQ29tcGlsZXIgIiwgcnNjKTsKKyAgICB7CisgICAgICAgIFN0b3BXYXRjaCBjb21waWxlVGltZXIoIlJlbmRlclNjcmlwdCBjb21waWxlIHRpbWUiKTsKKyAgICAgICAgcy0+bUJjY1NjcmlwdCA9IGJjY0NyZWF0ZVNjcmlwdCgpOworICAgICAgICBzLT5tRW52aXJvbWVudC5tSXNUaHJlYWRhYmxlID0gdHJ1ZTsKKyAgICAgICAgYmNjU2NyaXB0Qml0Y29kZShzLT5tQmNjU2NyaXB0LCBzLT5tRW52aXJvbWVudC5tU2NyaXB0VGV4dCwgcy0+bUVudmlyb21lbnQubVNjcmlwdFRleHRMZW5ndGgpOworICAgICAgICBiY2NSZWdpc3RlclN5bWJvbENhbGxiYWNrKHMtPm1CY2NTY3JpcHQsIHN5bWJvbExvb2t1cCwgcyk7CisgICAgICAgIGJjY0NvbXBpbGVTY3JpcHQocy0+bUJjY1NjcmlwdCk7CisgICAgICAgIGJjY0dldFNjcmlwdExhYmVsKHMtPm1CY2NTY3JpcHQsICJyb290IiwgKEJDQ3ZvaWQqKikgJnMtPm1Qcm9ncmFtLm1Sb290KTsKKyAgICAgICAgYmNjR2V0U2NyaXB0TGFiZWwocy0+bUJjY1NjcmlwdCwgImluaXQiLCAoQkNDdm9pZCoqKSAmcy0+bVByb2dyYW0ubUluaXQpOwogICAgIH0KKyAgICBMT0dWKCIlcCBTY3JpcHRDU3RhdGU6OnJ1bkNvbXBpbGVyIHJvb3QgJXAsICBpbml0ICVwIiwgcnNjLCBzLT5tUHJvZ3JhbS5tUm9vdCwgcy0+bVByb2dyYW0ubUluaXQpOwogCiAgICAgaWYgKHMtPm1Qcm9ncmFtLm1Jbml0KSB7CiAgICAgICAgIHMtPm1Qcm9ncmFtLm1Jbml0KCk7CiAgICAgfQogCi0gICAgZm9yIChpbnQgY3Q9MDsgY3QgPCBNQVhfU0NSSVBUX0JBTktTOyBjdCsrKSB7Ci0gICAgICAgIGlmIChtU2xvdE5hbWVzW2N0XS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGFjY0dldFNjcmlwdExhYmVsKHMtPm1BY2NTY3JpcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2xvdE5hbWVzW2N0XS5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBQ0N2b2lkKiopICZzLT5tUHJvZ3JhbS5tU2xvdFBvaW50ZXJzW2N0XSk7Ci0gICAgICAgIH0KKyAgICBiY2NHZXRFeHBvcnRGdW5jcyhzLT5tQmNjU2NyaXB0LCAoQkNDc2l6ZWkqKSAmcy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uQ291bnQsIDAsIE5VTEwpOworICAgIGlmKHMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbkNvdW50IDw9IDApCisgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbnMgPSBOVUxMOworICAgIGVsc2UgeworICAgICAgICBzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25zID0gKFNjcmlwdDo6SW52b2tlRnVuY190KikgY2FsbG9jKHMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbkNvdW50LCBzaXplb2YoU2NyaXB0OjpJbnZva2VGdW5jX3QpKTsKKyAgICAgICAgYmNjR2V0RXhwb3J0RnVuY3Mocy0+bUJjY1NjcmlwdCwgTlVMTCwgcy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uQ291bnQsIChCQ0N2b2lkICoqKSBzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25zKTsKICAgICB9CiAKLSAgICBmb3IgKGludCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKLSAgICAgICAgaWYgKG1JbnZva2FibGVOYW1lc1tjdF0ubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBhY2NHZXRTY3JpcHRMYWJlbChzLT5tQWNjU2NyaXB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUludm9rYWJsZU5hbWVzW2N0XS5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBQ0N2b2lkKiopICZzLT5tRW52aXJvbWVudC5tSW52b2thYmxlc1tjdF0pOwotICAgICAgICB9CisgICAgYmNjR2V0RXhwb3J0VmFycyhzLT5tQmNjU2NyaXB0LCAoQkNDc2l6ZWkqKSAmcy0+bUVudmlyb21lbnQubUZpZWxkQ291bnQsIDAsIE5VTEwpOworICAgIGlmKHMtPm1FbnZpcm9tZW50Lm1GaWVsZENvdW50IDw9IDApCisgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1GaWVsZEFkZHJlc3MgPSBOVUxMOworICAgIGVsc2UgeworICAgICAgICBzLT5tRW52aXJvbWVudC5tRmllbGRBZGRyZXNzID0gKHZvaWQgKiopIGNhbGxvYyhzLT5tRW52aXJvbWVudC5tRmllbGRDb3VudCwgc2l6ZW9mKHZvaWQgKikpOworICAgICAgICBiY2NHZXRFeHBvcnRWYXJzKHMtPm1CY2NTY3JpcHQsIE5VTEwsIHMtPm1FbnZpcm9tZW50Lm1GaWVsZENvdW50LCAoQkNDdm9pZCAqKikgcy0+bUVudmlyb21lbnQubUZpZWxkQWRkcmVzcyk7CiAgICAgfQogCiAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50LnNldChyc2MtPmdldERlZmF1bHRQcm9ncmFtRnJhZ21lbnQoKSk7CiAgICAgcy0+bUVudmlyb21lbnQubVZlcnRleC5zZXQocnNjLT5nZXREZWZhdWx0UHJvZ3JhbVZlcnRleCgpKTsKLSAgICBzLT5tRW52aXJvbWVudC5tRnJhZ21lbnRTdG9yZS5zZXQocnNjLT5nZXREZWZhdWx0UHJvZ3JhbUZyYWdtZW50U3RvcmUoKSk7CisgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuc2V0KHJzYy0+Z2V0RGVmYXVsdFByb2dyYW1TdG9yZSgpKTsKICAgICBzLT5tRW52aXJvbWVudC5tUmFzdGVyLnNldChyc2MtPmdldERlZmF1bHRQcm9ncmFtUmFzdGVyKCkpOwogCi0gICAgaWYgKHMtPm1Qcm9ncmFtLm1TY3JpcHQpIHsKKyAgICBpZiAocy0+bVByb2dyYW0ubVJvb3QpIHsKICAgICAgICAgY29uc3Qgc3RhdGljIGludCBwcmFnbWFNYXggPSAxNjsKLSAgICAgICAgQUNDc2l6ZWkgcHJhZ21hQ291bnQ7Ci0gICAgICAgIEFDQ2NoYXIgKiBzdHJbcHJhZ21hTWF4XTsKLSAgICAgICAgYWNjR2V0UHJhZ21hcyhzLT5tQWNjU2NyaXB0LCAmcHJhZ21hQ291bnQsIHByYWdtYU1heCwgJnN0clswXSk7CisgICAgICAgIEJDQ3NpemVpIHByYWdtYUNvdW50OworICAgICAgICBCQ0NjaGFyICogc3RyW3ByYWdtYU1heF07CisgICAgICAgIGJjY0dldFByYWdtYXMocy0+bUJjY1NjcmlwdCwgJnByYWdtYUNvdW50LCBwcmFnbWFNYXgsICZzdHJbMF0pOwogCiAgICAgICAgIGZvciAoaW50IGN0PTA7IGN0IDwgcHJhZ21hQ291bnQ7IGN0Kz0yKSB7CisgICAgICAgICAgICAvL0xPR0UoInByYWdtZSAlcyAlcyIsIHN0cltjdF0sIHN0cltjdCsxXSk7CiAgICAgICAgICAgICBpZiAoIXN0cmNtcChzdHJbY3RdLCAidmVyc2lvbiIpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CkBAIC0yMDgsMTEgKzQ1NSw2IEBACiAgICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1WZXJ0ZXguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFByb2dyYW1WZXJ0ZXggKiBwdiA9IChQcm9ncmFtVmVydGV4ICopcnNjLT5sb29rdXBOYW1lKHN0cltjdCsxXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHB2ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubVZlcnRleC5zZXQocHYpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgTE9HRSgiVW5yZWNvbml6ZWQgdmFsdWUgJXMgcGFzc2VkIHRvIHN0YXRlVmVydGV4Iiwgc3RyW2N0KzFdKTsKICAgICAgICAgICAgIH0KIApAQCAtMjI0LDExICs0NjYsNiBAQAogICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tUmFzdGVyLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQcm9ncmFtUmFzdGVyICogcHIgPSAoUHJvZ3JhbVJhc3RlciAqKXJzYy0+bG9va3VwTmFtZShzdHJbY3QrMV0pOwotICAgICAgICAgICAgICAgIGlmIChwciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1SYXN0ZXIuc2V0KHByKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIExPR0UoIlVucmVjb25pemVkIHZhbHVlICVzIHBhc3NlZCB0byBzdGF0ZVJhc3RlciIsIHN0cltjdCsxXSk7CiAgICAgICAgICAgICB9CiAKQEAgLTI0MCwxMSArNDc3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50LmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQcm9ncmFtRnJhZ21lbnQgKiBwZiA9IChQcm9ncmFtRnJhZ21lbnQgKilyc2MtPmxvb2t1cE5hbWUoc3RyW2N0KzFdKTsKLSAgICAgICAgICAgICAgICBpZiAocGYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tRnJhZ21lbnQuc2V0KHBmKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIExPR0UoIlVucmVjb25pemVkIHZhbHVlICVzIHBhc3NlZCB0byBzdGF0ZUZyYWdtZW50Iiwgc3RyW2N0KzFdKTsKICAgICAgICAgICAgIH0KIApAQCAtMjU2LDEyICs0ODgsNiBAQAogICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tRnJhZ21lbnRTdG9yZS5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50U3RvcmUgKiBwZnMgPQotICAgICAgICAgICAgICAgICAgICAoUHJvZ3JhbUZyYWdtZW50U3RvcmUgKilyc2MtPmxvb2t1cE5hbWUoc3RyW2N0KzFdKTsKLSAgICAgICAgICAgICAgICBpZiAocGZzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuc2V0KHBmcyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBMT0dFKCJVbnJlY29uaXplZCB2YWx1ZSAlcyBwYXNzZWQgdG8gc3RhdGVTdG9yZSIsIHN0cltjdCsxXSk7CiAgICAgICAgICAgICB9CiAKQEAgLTI3MywxMTEgKzQ5OSw2IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBhcHBlbmRFbGVtZW50Qm9keShTdHJpbmc4ICpzLCBjb25zdCBFbGVtZW50ICplKQotewotICAgIHMtPmFwcGVuZCgiIHtcbiIpOwotICAgIGZvciAoc2l6ZV90IGN0Mj0wOyBjdDIgPCBlLT5nZXRGaWVsZENvdW50KCk7IGN0MisrKSB7Ci0gICAgICAgIGNvbnN0IEVsZW1lbnQgKmMgPSBlLT5nZXRGaWVsZChjdDIpOwotICAgICAgICBzLT5hcHBlbmQoIiAgICAiKTsKLSAgICAgICAgcy0+YXBwZW5kKGMtPmdldENUeXBlKCkpOwotICAgICAgICBzLT5hcHBlbmQoIiAiKTsKLSAgICAgICAgcy0+YXBwZW5kKGUtPmdldEZpZWxkTmFtZShjdDIpKTsKLSAgICAgICAgcy0+YXBwZW5kKCI7XG4iKTsKLSAgICB9Ci0gICAgcy0+YXBwZW5kKCJ9Iik7Ci19Ci0KLXZvaWQgU2NyaXB0Q1N0YXRlOjphcHBlbmRWYXJEZWZpbmVzKGNvbnN0IENvbnRleHQgKnJzYywgU3RyaW5nOCAqc3RyKQotewotICAgIGNoYXIgYnVmWzI1Nl07Ci0gICAgaWYgKHJzYy0+cHJvcHMubUxvZ1NjcmlwdHMpIHsKLSAgICAgICAgTE9HRCgiYXBwZW5kVmFyRGVmaW5lcyBtSW50MzJEZWZpbmVzLnNpemUoKT0lZCBtRmxvYXREZWZpbmVzLnNpemUoKT0lZFxuIiwKLSAgICAgICAgICAgICAgICBtSW50MzJEZWZpbmVzLnNpemUoKSwgbUZsb2F0RGVmaW5lcy5zaXplKCkpOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IG1JbnQzMkRlZmluZXMuc2l6ZSgpOyBjdCsrKSB7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lICIpOwotICAgICAgICBzdHItPmFwcGVuZChtSW50MzJEZWZpbmVzLmtleUF0KGN0KSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIgIik7Ci0gICAgICAgIHNwcmludGYoYnVmLCAiJWlcbiIsIChpbnQpbUludDMyRGVmaW5lcy52YWx1ZUF0KGN0KSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKGJ1Zik7Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgbUZsb2F0RGVmaW5lcy5zaXplKCk7IGN0KyspIHsKLSAgICAgICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgIik7Ci0gICAgICAgIHN0ci0+YXBwZW5kKG1GbG9hdERlZmluZXMua2V5QXQoY3QpKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoIiAiKTsKLSAgICAgICAgc3ByaW50ZihidWYsICIlZmZcbiIsIG1GbG9hdERlZmluZXMudmFsdWVBdChjdCkpOwotICAgICAgICBzdHItPmFwcGVuZChidWYpOwotICAgIH0KLX0KLQotCi0KLXZvaWQgU2NyaXB0Q1N0YXRlOjphcHBlbmRUeXBlcyhjb25zdCBDb250ZXh0ICpyc2MsIFN0cmluZzggKnN0cikKLXsKLSAgICBjaGFyIGJ1ZlsyNTZdOwotICAgIFN0cmluZzggdG1wOwotCi0gICAgc3RyLT5hcHBlbmQoInN0cnVjdCB2ZWNGMzJfMl9zIHtmbG9hdCB4OyBmbG9hdCB5O307XG4iKTsKLSAgICBzdHItPmFwcGVuZCgic3RydWN0IHZlY0YzMl8zX3Mge2Zsb2F0IHg7IGZsb2F0IHk7IGZsb2F0IHo7fTtcbiIpOwotICAgIHN0ci0+YXBwZW5kKCJzdHJ1Y3QgdmVjRjMyXzRfcyB7ZmxvYXQgeDsgZmxvYXQgeTsgZmxvYXQgejsgZmxvYXQgdzt9O1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoInN0cnVjdCB2ZWNVOF80X3Mge2NoYXIgcjsgY2hhciBnOyBjaGFyIGI7IGNoYXIgYTt9O1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgdmVjRjMyXzJfdCBzdHJ1Y3QgdmVjRjMyXzJfc1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgdmVjRjMyXzNfdCBzdHJ1Y3QgdmVjRjMyXzNfc1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgdmVjRjMyXzRfdCBzdHJ1Y3QgdmVjRjMyXzRfc1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgdmVjVThfNF90IHN0cnVjdCB2ZWNVOF80X3NcbiIpOwotICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lIHZlY0k4XzRfdCBzdHJ1Y3QgdmVjVThfNF9zXG4iKTsKLQotICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgTUFYX1NDUklQVF9CQU5LUzsgY3QrKykgewotICAgICAgICBjb25zdCBUeXBlICp0ID0gbUNvbnN0YW50QnVmZmVyVHlwZXNbY3RdLmdldCgpOwotICAgICAgICBpZiAoIXQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IEVsZW1lbnQgKmUgPSB0LT5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChlLT5nZXROYW1lKCkgJiYgKGUtPmdldEZpZWxkQ291bnQoKSA+IDEpKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IHMoInN0cnVjdCBzdHJ1Y3RfIik7Ci0gICAgICAgICAgICBzLmFwcGVuZChlLT5nZXROYW1lKCkpOwotICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0Q1N0cnVjdEJvZHkoKSk7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiO1xuIik7Ci0KLSAgICAgICAgICAgIHMuYXBwZW5kKCIjZGVmaW5lICIpOwotICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKCJfdCBzdHJ1Y3Qgc3RydWN0XyIpOwotICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKCJcblxuIik7Ci0gICAgICAgICAgICBpZiAocnNjLT5wcm9wcy5tTG9nU2NyaXB0cykgewotICAgICAgICAgICAgICAgIExPR1YoIiVzIiwgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KHMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ci0+YXBwZW5kKHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TbG90TmFtZXNbY3RdLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgU3RyaW5nOCBzOwotICAgICAgICAgICAgaWYgKGUtPmdldE5hbWUoKSkgewotICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgbmFtZWQgc3RydWN0Ci0gICAgICAgICAgICAgICAgcy5zZXRUbyhlLT5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYW4gc3RydWN0IG5hbWVkIGZyb20gdGhlIHNsb3QuCi0gICAgICAgICAgICAgICAgcy5zZXRUbygic3RydWN0ICIpOwotICAgICAgICAgICAgICAgIHMuYXBwZW5kKG1TbG90TmFtZXNbY3RdKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZCgiX3MiKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZChlLT5nZXRDU3RydWN0Qm9keSgpKTsKLSAgICAgICAgICAgICAgICAvL2FwcGVuZEVsZW1lbnRCb2R5KCZzLCBlKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZCgiO1xuIik7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoInN0cnVjdCAiKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZChtU2xvdE5hbWVzW2N0XSk7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoIl9zIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHMuYXBwZW5kKCIgKiAiKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKG1TbG90TmFtZXNbY3RdKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKCI7XG4iKTsKLSAgICAgICAgICAgIGlmIChyc2MtPnByb3BzLm1Mb2dTY3JpcHRzKSB7Ci0gICAgICAgICAgICAgICAgTE9HVigiJXMiLCBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4ocykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RyLT5hcHBlbmQocyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CiAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzg2LDE0ICs1MDcsNyBAQAogdm9pZCByc2lfU2NyaXB0Q0JlZ2luKENvbnRleHQgKiByc2MpCiB7CiAgICAgU2NyaXB0Q1N0YXRlICpzcyA9ICZyc2MtPm1TY3JpcHRDOwotICAgIHNzLT5jbGVhcigpOwotfQotCi12b2lkIHJzaV9TY3JpcHRDU2V0U2NyaXB0KENvbnRleHQgKiByc2MsIHZvaWQgKnZwKQotewotICAgIHJzQXNzZXJ0KDApOwotICAgIC8vU2NyaXB0Q1N0YXRlICpzcyA9ICZyc2MtPm1TY3JpcHRDOwotICAgIC8vc3MtPm1Qcm9ncmFtLm1TY3JpcHQgPSByZWludGVycHJldF9jYXN0PFNjcmlwdEM6OlJ1blNjcmlwdF90Pih2cCk7CisgICAgc3MtPmNsZWFyKHJzYyk7CiB9CiAKIHZvaWQgcnNpX1NjcmlwdENTZXRUZXh0KENvbnRleHQgKnJzYywgY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3QgbGVuKQpAQCAtNDEyLDMyICs1MjYsMTkgQEAKIHsKICAgICBTY3JpcHRDU3RhdGUgKnNzID0gJnJzYy0+bVNjcmlwdEM7CiAKLSAgICBTY3JpcHRDICpzID0gc3MtPm1TY3JpcHQ7Ci0gICAgc3MtPm1TY3JpcHQgPSBOVUxMOworICAgIE9iamVjdEJhc2VSZWY8U2NyaXB0Qz4gcyA9IHNzLT5tU2NyaXB0LmdldCgpOworICAgIHNzLT5tU2NyaXB0LmNsZWFyKCk7CiAKLSAgICBzcy0+cnVuQ29tcGlsZXIocnNjLCBzKTsKKyAgICBzcy0+cnVuQ29tcGlsZXIocnNjLCBzLmdldCgpKTsKICAgICBzLT5pbmNVc2VyUmVmKCk7CiAgICAgcy0+c2V0Q29udGV4dChyc2MpOwogICAgIGZvciAoaW50IGN0PTA7IGN0IDwgTUFYX1NDUklQVF9CQU5LUzsgY3QrKykgewogICAgICAgICBzLT5tVHlwZXNbY3RdLnNldChzcy0+bUNvbnN0YW50QnVmZmVyVHlwZXNbY3RdLmdldCgpKTsKLSAgICAgICAgcy0+bVNsb3ROYW1lc1tjdF0gPSBzcy0+bVNsb3ROYW1lc1tjdF07CiAgICAgICAgIHMtPm1TbG90V3JpdGFibGVbY3RdID0gc3MtPm1TbG90V3JpdGFibGVbY3RdOwogICAgIH0KIAotICAgIHNzLT5jbGVhcigpOwotICAgIHJldHVybiBzOwotfQotCi12b2lkIHJzaV9TY3JpcHRDU2V0RGVmaW5lRihDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIqIG5hbWUsIGZsb2F0IHZhbHVlKQotewotICAgIFNjcmlwdENTdGF0ZSAqc3MgPSAmcnNjLT5tU2NyaXB0QzsKLSAgICBzcy0+bUZsb2F0RGVmaW5lcy5hZGQoU3RyaW5nOChuYW1lKSwgdmFsdWUpOwotfQotCi12b2lkIHJzaV9TY3JpcHRDU2V0RGVmaW5lSTMyKENvbnRleHQgKnJzYywgY29uc3QgY2hhciogbmFtZSwgaW50MzJfdCB2YWx1ZSkKLXsKLSAgICBTY3JpcHRDU3RhdGUgKnNzID0gJnJzYy0+bVNjcmlwdEM7Ci0gICAgc3MtPm1JbnQzMkRlZmluZXMuYWRkKFN0cmluZzgobmFtZSksIHZhbHVlKTsKKyAgICBzcy0+Y2xlYXIocnNjKTsKKyAgICByZXR1cm4gcy5nZXQoKTsKIH0KIAogfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdEMuaCBiL2xpYnMvcnMvcnNTY3JpcHRDLmgKaW5kZXggMzVhYmFkZi4uN2VjODBhYSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NjcmlwdEMuaAorKysgYi9saWJzL3JzL3JzU2NyaXB0Qy5oCkBAIC0yMSw5ICsyMSw3IEBACiAKICNpbmNsdWRlICJSZW5kZXJTY3JpcHRFbnYuaCIKIAotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0KLXN0cnVjdCBBQ0NzY3JpcHQ7CitzdHJ1Y3QgQkNDc2NyaXB0OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTM0LDcgKzMyLDcgQEAKIGNsYXNzIFNjcmlwdEMgOiBwdWJsaWMgU2NyaXB0CiB7CiBwdWJsaWM6Ci0gICAgdHlwZWRlZiBpbnQgKCpSdW5TY3JpcHRfdCkodWludDMyX3QgbGF1bmNoSW5kZXgpOworICAgIHR5cGVkZWYgaW50ICgqUnVuU2NyaXB0X3QpKCk7CiAgICAgdHlwZWRlZiB2b2lkICgqVm9pZEZ1bmNfdCkoKTsKIAogICAgIFNjcmlwdEMoQ29udGV4dCAqKTsKQEAgLTQ0LDE4ICs0MiwzNSBAQAogICAgICAgICBpbnQgbVZlcnNpb25NYWpvcjsKICAgICAgICAgaW50IG1WZXJzaW9uTWlub3I7CiAKLSAgICAgICAgUnVuU2NyaXB0X3QgbVNjcmlwdDsKKyAgICAgICAgUnVuU2NyaXB0X3QgbVJvb3Q7CiAgICAgICAgIFZvaWRGdW5jX3QgbUluaXQ7Ci0KLSAgICAgICAgdm9pZCAqKiBtU2xvdFBvaW50ZXJzW01BWF9TQ1JJUFRfQkFOS1NdOwogICAgIH07CiAKICAgICBQcm9ncmFtX3QgbVByb2dyYW07CiAKLSAgICBBQ0NzY3JpcHQqICAgIG1BY2NTY3JpcHQ7CisgICAgQkNDc2NyaXB0KiAgICBtQmNjU2NyaXB0OwogCi0gICAgdmlydHVhbCB2b2lkIHNldHVwU2NyaXB0KCk7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBydW4oQ29udGV4dCAqLCB1aW50MzJfdCBsYXVuY2hJRCk7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqcHRyVG9BbGxvY2F0aW9uKGNvbnN0IHZvaWQgKikgY29uc3Q7CisKKworICAgIHZpcnR1YWwgdm9pZCBJbnZva2UoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pOworCisgICAgdmlydHVhbCB1aW50MzJfdCBydW4oQ29udGV4dCAqKTsKKworICAgIHZpcnR1YWwgdm9pZCBydW5Gb3JFYWNoKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbGxvY2F0aW9uICogYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRpb24gKiBhb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKiB1c3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnNTY3JpcHRDYWxsICpzYyA9IE5VTEwpOworCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0IHsgICAgfQorICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfU0NSSVBUX0M7IH0KKyAgICBzdGF0aWMgVHlwZSAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkgeyByZXR1cm4gTlVMTDsgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBzZXR1cFNjcmlwdChDb250ZXh0ICopOworICAgIHZvaWQgc2V0dXBHTFN0YXRlKENvbnRleHQgKik7CisgICAgU2NyaXB0ICogc2V0VExTKFNjcmlwdCAqKTsKIH07CiAKIGNsYXNzIFNjcmlwdENTdGF0ZQpAQCAtNjQsMzAgKzc5LDI2IEBACiAgICAgU2NyaXB0Q1N0YXRlKCk7CiAgICAgflNjcmlwdENTdGF0ZSgpOwogCi0gICAgU2NyaXB0QyAqbVNjcmlwdDsKKyAgICBPYmplY3RCYXNlUmVmPFNjcmlwdEM+IG1TY3JpcHQ7CiAKICAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFR5cGU+IG1Db25zdGFudEJ1ZmZlclR5cGVzW01BWF9TQ1JJUFRfQkFOS1NdOwotICAgIFN0cmluZzggbVNsb3ROYW1lc1tNQVhfU0NSSVBUX0JBTktTXTsKKyAgICAvL1N0cmluZzggbVNsb3ROYW1lc1tNQVhfU0NSSVBUX0JBTktTXTsKICAgICBib29sIG1TbG90V3JpdGFibGVbTUFYX1NDUklQVF9CQU5LU107Ci0gICAgU3RyaW5nOCBtSW52b2thYmxlTmFtZXNbTUFYX1NDUklQVF9CQU5LU107CisgICAgLy9TdHJpbmc4IG1JbnZva2FibGVOYW1lc1tNQVhfU0NSSVBUX0JBTktTXTsKIAotICAgIHZvaWQgY2xlYXIoKTsKKyAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKKworICAgIHZvaWQgY2xlYXIoQ29udGV4dCAqcnNjKTsKICAgICB2b2lkIHJ1bkNvbXBpbGVyKENvbnRleHQgKnJzYywgU2NyaXB0QyAqcyk7Ci0gICAgdm9pZCBhcHBlbmRWYXJEZWZpbmVzKGNvbnN0IENvbnRleHQgKnJzYywgU3RyaW5nOCAqc3RyKTsKLSAgICB2b2lkIGFwcGVuZFR5cGVzKGNvbnN0IENvbnRleHQgKnJzYywgU3RyaW5nOCAqc3RyKTsKIAogICAgIHN0cnVjdCBTeW1ib2xUYWJsZV90IHsKICAgICAgICAgY29uc3QgY2hhciAqIG1OYW1lOwogICAgICAgICB2b2lkICogbVB0cjsKLSAgICAgICAgY29uc3QgY2hhciAqIG1SZXQ7Ci0gICAgICAgIGNvbnN0IGNoYXIgKiBtUGFyYW07CiAgICAgfTsKLSAgICBzdGF0aWMgU3ltYm9sVGFibGVfdCBnU3ltc1tdOworICAgIC8vc3RhdGljIFN5bWJvbFRhYmxlX3QgZ1N5bXNbXTsKICAgICBzdGF0aWMgY29uc3QgU3ltYm9sVGFibGVfdCAqIGxvb2t1cFN5bWJvbChjb25zdCBjaGFyICopOwotICAgIHN0YXRpYyB2b2lkIGFwcGVuZERlY2xzKFN0cmluZzggKnN0cik7Ci0KLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LGludD4gbUludDMyRGVmaW5lczsKLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LGZsb2F0PiBtRmxvYXREZWZpbmVzOworICAgIHN0YXRpYyBjb25zdCBTeW1ib2xUYWJsZV90ICogbG9va3VwU3ltYm9sQ0woY29uc3QgY2hhciAqKTsKKyAgICBzdGF0aWMgY29uc3QgU3ltYm9sVGFibGVfdCAqIGxvb2t1cFN5bWJvbEdMKGNvbnN0IGNoYXIgKik7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTY3JpcHRDX0xpYi5jcHAgYi9saWJzL3JzL3JzU2NyaXB0Q19MaWIuY3BwCmluZGV4IDIwMmNhM2QuLmUwZGU4NjcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTY3JpcHRDX0xpYi5jcHAKKysrIGIvbGlicy9ycy9yc1NjcmlwdENfTGliLmNwcApAQCAtMTcsMTggKzE3LDkgQEAKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKICNpbmNsdWRlICJyc1NjcmlwdEMuaCIKICNpbmNsdWRlICJyc01hdHJpeC5oIgotI2luY2x1ZGUgInJzTm9pc2UuaCIKIAotI2luY2x1ZGUgImFjYy9hY2MuaCIKICNpbmNsdWRlICJ1dGlscy9UaW1lcnMuaCIKIAotI2RlZmluZSBHTF9HTEVYVF9QUk9UT1RZUEVTCi0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgotCiAjaW5jbHVkZSA8dGltZS5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKQEAgLTM5LDI1MiArMzAsMTEgQEAKICAgICBDb250ZXh0ICogcnNjID0gdGxzLT5tQ29udGV4dDsgXAogICAgIFNjcmlwdEMgKiBzYyA9IChTY3JpcHRDICopIHRscy0+bVNjcmlwdAogCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgZmxvYXQgeDsKLSAgICBmbG9hdCB5OwotICAgIGZsb2F0IHo7Ci19IHZlYzNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGZsb2F0IHg7Ci0gICAgZmxvYXQgeTsKLSAgICBmbG9hdCB6OwotICAgIGZsb2F0IHc7Ci19IHZlYzRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGZsb2F0IHg7Ci0gICAgZmxvYXQgeTsKLX0gdmVjMl90OwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIElPIHJvdXRpbmVzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdGljIGZsb2F0IFNDX2xvYWRGKHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgY29uc3Qgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBjb25zdCBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KHZwKTsKLSAgICAvL0xPR0UoImxvYWRGICVpICVpID0gJWYgJXgiLCBiYW5rLCBvZmZzZXQsIGYsICgoaW50ICopJmYpWzBdKTsKLSAgICByZXR1cm4gZltvZmZzZXRdOwotfQotCi1zdGF0aWMgaW50MzJfdCBTQ19sb2FkSTMyKHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgY29uc3Qgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBjb25zdCBpbnQzMl90ICppID0gc3RhdGljX2Nhc3Q8Y29uc3QgaW50MzJfdCAqPih2cCk7Ci0gICAgLy9MT0dFKCJsb2FkSTMyICVpICVpID0gJWkiLCBiYW5rLCBvZmZzZXQsIHQpOwotICAgIHJldHVybiBpW29mZnNldF07Ci19Ci0KLXN0YXRpYyBmbG9hdCogU0NfbG9hZEFycmF5Rih1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxmbG9hdCAqPih2cCk7Ci0gICAgcmV0dXJuIGYgKyBvZmZzZXQ7Ci19Ci0KLXN0YXRpYyBpbnQzMl90KiBTQ19sb2FkQXJyYXlJMzIodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0KQotewotICAgIEdFVF9UTFMoKTsKLSAgICB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGludDMyX3QgKmkgPSBzdGF0aWNfY2FzdDxpbnQzMl90ICo+KHZwKTsKLSAgICByZXR1cm4gaSArIG9mZnNldDsKLX0KLQotc3RhdGljIGZsb2F0KiBTQ19sb2FkU2ltcGxlTWVzaFZlcnRpY2VzRihSc1NpbXBsZU1lc2ggbWVzaCwgdWludDMyX3QgaWR4KQotewotICAgIFNpbXBsZU1lc2ggKnRtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPihtZXNoKTsKLSAgICB2b2lkICp2cCA9IHRtLT5tVmVydGV4QnVmZmVyc1tpZHhdLT5nZXRQdHIoKTs7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0ICo+KHZwKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfdXBkYXRlU2ltcGxlTWVzaChSc1NpbXBsZU1lc2ggbWVzaCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgU2ltcGxlTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxTaW1wbGVNZXNoICo+KG1lc2gpOwotICAgIHNtLT51cGxvYWRBbGwocnNjKTsKLX0KLQotc3RhdGljIHVpbnQzMl90IFNDX2xvYWRVMzIodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0KQotewotICAgIEdFVF9UTFMoKTsKLSAgICBjb25zdCB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGNvbnN0IHVpbnQzMl90ICppID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4odnApOwotICAgIHJldHVybiBpW29mZnNldF07Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2xvYWRWZWM0KHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCwgcnNjX1ZlY3RvcjQgKnYpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGNvbnN0IHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgY29uc3QgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxjb25zdCBmbG9hdCAqPih2cCk7Ci0gICAgbWVtY3B5KHYsICZmW29mZnNldF0sIHNpemVvZihyc2NfVmVjdG9yNCkpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19sb2FkTWF0cml4KHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCwgcnNjX01hdHJpeCAqbSkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgY29uc3Qgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBjb25zdCBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KHZwKTsKLSAgICBtZW1jcHkobSwgJmZbb2Zmc2V0XSwgc2l6ZW9mKHJzY19NYXRyaXgpKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBTQ19zdG9yZUYodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0LCBmbG9hdCB2KQotewotICAgIC8vTE9HRSgic3RvcmVGICVpICVpICVmIiwgYmFuaywgb2Zmc2V0LCB2KTsKLSAgICBHRVRfVExTKCk7Ci0gICAgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KHZwKTsKLSAgICBmW29mZnNldF0gPSB2OwotfQotCi1zdGF0aWMgdm9pZCBTQ19zdG9yZUkzMih1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQsIGludDMyX3QgdikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBpbnQzMl90ICpmID0gc3RhdGljX2Nhc3Q8aW50MzJfdCAqPih2cCk7Ci0gICAgc3RhdGljX2Nhc3Q8aW50MzJfdCAqPihzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKSlbb2Zmc2V0XSA9IHY7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3N0b3JlVTMyKHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgdikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICB1aW50MzJfdCAqZiA9IHN0YXRpY19jYXN0PHVpbnQzMl90ICo+KHZwKTsKLSAgICBzdGF0aWNfY2FzdDx1aW50MzJfdCAqPihzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKSlbb2Zmc2V0XSA9IHY7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3N0b3JlVmVjNCh1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQsIGNvbnN0IHJzY19WZWN0b3I0ICp2KQotewotICAgIEdFVF9UTFMoKTsKLSAgICB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8ZmxvYXQgKj4odnApOwotICAgIG1lbWNweSgmZltvZmZzZXRdLCB2LCBzaXplb2YocnNjX1ZlY3RvcjQpKTsKLX0KLQotc3RhdGljIHZvaWQgU0Nfc3RvcmVNYXRyaXgodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0LCBjb25zdCByc2NfTWF0cml4ICptKQotewotICAgIEdFVF9UTFMoKTsKLSAgICB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8ZmxvYXQgKj4odnApOwotICAgIG1lbWNweSgmZltvZmZzZXRdLCBtLCBzaXplb2YocnNjX01hdHJpeCkpOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFZlYzMgcm91dGluZXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgdm9pZCBTQ192ZWMzTm9ybSh2ZWMzX3QgKnYpCi17Ci0gICAgZmxvYXQgbGVuID0gc3FydGYodi0+eCAqIHYtPnggKyB2LT55ICogdi0+eSArIHYtPnogKiB2LT56KTsKLSAgICBsZW4gPSAxIC8gbGVuOwotICAgIHYtPnggKj0gbGVuOwotICAgIHYtPnkgKj0gbGVuOwotICAgIHYtPnogKj0gbGVuOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfdmVjM0xlbmd0aChjb25zdCB2ZWMzX3QgKnYpCi17Ci0gICAgcmV0dXJuIHNxcnRmKHYtPnggKiB2LT54ICsgdi0+eSAqIHYtPnkgKyB2LT56ICogdi0+eik7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzNBZGQodmVjM190ICpkZXN0LCBjb25zdCB2ZWMzX3QgKmxocywgY29uc3QgdmVjM190ICpyaHMpCi17Ci0gICAgZGVzdC0+eCA9IGxocy0+eCArIHJocy0+eDsKLSAgICBkZXN0LT55ID0gbGhzLT55ICsgcmhzLT55OwotICAgIGRlc3QtPnogPSBsaHMtPnogKyByaHMtPno7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzNTdWIodmVjM190ICpkZXN0LCBjb25zdCB2ZWMzX3QgKmxocywgY29uc3QgdmVjM190ICpyaHMpCi17Ci0gICAgZGVzdC0+eCA9IGxocy0+eCAtIHJocy0+eDsKLSAgICBkZXN0LT55ID0gbGhzLT55IC0gcmhzLT55OwotICAgIGRlc3QtPnogPSBsaHMtPnogLSByaHMtPno7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzNDcm9zcyh2ZWMzX3QgKmRlc3QsIGNvbnN0IHZlYzNfdCAqbGhzLCBjb25zdCB2ZWMzX3QgKnJocykKLXsKLSAgICBmbG9hdCB4ID0gbGhzLT55ICogcmhzLT56ICAtIGxocy0+eiAqIHJocy0+eTsKLSAgICBmbG9hdCB5ID0gbGhzLT56ICogcmhzLT54ICAtIGxocy0+eCAqIHJocy0+ejsKLSAgICBmbG9hdCB6ID0gbGhzLT54ICogcmhzLT55ICAtIGxocy0+eSAqIHJocy0+eDsKLSAgICBkZXN0LT54ID0geDsKLSAgICBkZXN0LT55ID0geTsKLSAgICBkZXN0LT56ID0gejsKLX0KLQotc3RhdGljIGZsb2F0IFNDX3ZlYzNEb3QoY29uc3QgdmVjM190ICpsaHMsIGNvbnN0IHZlYzNfdCAqcmhzKQotewotICAgIHJldHVybiBsaHMtPnggKiByaHMtPnggKyBsaHMtPnkgKiByaHMtPnkgKyBsaHMtPnogKiByaHMtPno7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzNTY2FsZSh2ZWMzX3QgKmxocywgZmxvYXQgc2NhbGUpCi17Ci0gICAgbGhzLT54ICo9IHNjYWxlOwotICAgIGxocy0+eSAqPSBzY2FsZTsKLSAgICBsaHMtPnogKj0gc2NhbGU7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVmVjNCByb3V0aW5lcwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXN0YXRpYyB2b2lkIFNDX3ZlYzROb3JtKHZlYzRfdCAqdikKLXsKLSAgICBmbG9hdCBsZW4gPSBzcXJ0Zih2LT54ICogdi0+eCArIHYtPnkgKiB2LT55ICsgdi0+eiAqIHYtPnogKyB2LT53ICogdi0+dyk7Ci0gICAgbGVuID0gMSAvIGxlbjsKLSAgICB2LT54ICo9IGxlbjsKLSAgICB2LT55ICo9IGxlbjsKLSAgICB2LT56ICo9IGxlbjsKLSAgICB2LT53ICo9IGxlbjsKLX0KLQotc3RhdGljIGZsb2F0IFNDX3ZlYzRMZW5ndGgoY29uc3QgdmVjNF90ICp2KQotewotICAgIHJldHVybiBzcXJ0Zih2LT54ICogdi0+eCArIHYtPnkgKiB2LT55ICsgdi0+eiAqIHYtPnogKyB2LT53ICogdi0+dyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzRBZGQodmVjNF90ICpkZXN0LCBjb25zdCB2ZWM0X3QgKmxocywgY29uc3QgdmVjNF90ICpyaHMpCi17Ci0gICAgZGVzdC0+eCA9IGxocy0+eCArIHJocy0+eDsKLSAgICBkZXN0LT55ID0gbGhzLT55ICsgcmhzLT55OwotICAgIGRlc3QtPnogPSBsaHMtPnogKyByaHMtPno7Ci0gICAgZGVzdC0+dyA9IGxocy0+dyArIHJocy0+dzsKLX0KLQotc3RhdGljIHZvaWQgU0NfdmVjNFN1Yih2ZWM0X3QgKmRlc3QsIGNvbnN0IHZlYzRfdCAqbGhzLCBjb25zdCB2ZWM0X3QgKnJocykKLXsKLSAgICBkZXN0LT54ID0gbGhzLT54IC0gcmhzLT54OwotICAgIGRlc3QtPnkgPSBsaHMtPnkgLSByaHMtPnk7Ci0gICAgZGVzdC0+eiA9IGxocy0+eiAtIHJocy0+ejsKLSAgICBkZXN0LT53ID0gbGhzLT53IC0gcmhzLT53OwotfQotCi1zdGF0aWMgZmxvYXQgU0NfdmVjNERvdChjb25zdCB2ZWM0X3QgKmxocywgY29uc3QgdmVjNF90ICpyaHMpCi17Ci0gICAgcmV0dXJuIGxocy0+eCAqIHJocy0+eCArIGxocy0+eSAqIHJocy0+eSArIGxocy0+eiAqIHJocy0+eiArIGxocy0+dyAqIHJocy0+dzsKLX0KLQotc3RhdGljIHZvaWQgU0NfdmVjNFNjYWxlKHZlYzRfdCAqbGhzLCBmbG9hdCBzY2FsZSkKLXsKLSAgICBsaHMtPnggKj0gc2NhbGU7Ci0gICAgbGhzLT55ICo9IHNjYWxlOwotICAgIGxocy0+eiAqPSBzY2FsZTsKLSAgICBsaHMtPncgKj0gc2NhbGU7Ci19CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gTWF0aCByb3V0aW5lcwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLSNkZWZpbmUgUEkgMy4xNDE1OTI2ZgotI2RlZmluZSBERUdfVE9fUkFEIFBJIC8gMTgwLjBmCi0jZGVmaW5lIFJBRF9UT19ERUcgMTgwLjBmIC8gUEkKLQogc3RhdGljIGZsb2F0IFNDX3NpbmZfZmFzdChmbG9hdCB4KQogewogICAgIGNvbnN0IGZsb2F0IEEgPSAgIDEuMGYgLyAoMi4wZiAqIE1fUEkpOwpAQCAtMzIzLDYgKzczLDcgQEAKICAgICByZXR1cm4gMC4yMjE1ZiAqICh5ICogZmFic2YoeSkgLSB5KSArIHk7CiB9CiAKKwogc3RhdGljIGZsb2F0IFNDX3JhbmRmKGZsb2F0IG1heCkKIHsKICAgICBmbG9hdCByID0gKGZsb2F0KXJhbmQoKTsKQEAgLTMzNSwxMDQgKzg2LDIwIEBACiAgICAgcmV0dXJuIHIgLyBSQU5EX01BWCAqIChtYXggLSBtaW4pICsgbWluOwogfQogCi1zdGF0aWMgaW50IFNDX3NpZ24oaW50IHZhbHVlKQorc3RhdGljIGludCBTQ19yYW5kaShpbnQgbWF4KQogewotICAgIHJldHVybiAodmFsdWUgPiAwKSAtICh2YWx1ZSA8IDApOworICAgIHJldHVybiAoaW50KVNDX3JhbmRmKG1heCk7CiB9CiAKLXN0YXRpYyBmbG9hdCBTQ19zaWduZihmbG9hdCB2YWx1ZSkKK3N0YXRpYyBpbnQgU0NfcmFuZGkyKGludCBtaW4sIGludCBtYXgpCiB7Ci0gICAgcmV0dXJuICh2YWx1ZSA+IDApIC0gKHZhbHVlIDwgMCk7CisgICAgcmV0dXJuIChpbnQpU0NfcmFuZGYyKG1pbiwgbWF4KTsKIH0KIAotc3RhdGljIGZsb2F0IFNDX2NsYW1wZihmbG9hdCBhbW91bnQsIGZsb2F0IGxvdywgZmxvYXQgaGlnaCkKK3N0YXRpYyBmbG9hdCBTQ19mcmFjKGZsb2F0IHYpCiB7Ci0gICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Ci19Ci0KLXN0YXRpYyBpbnQgU0NfY2xhbXAoaW50IGFtb3VudCwgaW50IGxvdywgaW50IGhpZ2gpCi17Ci0gICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19tYXhmKGZsb2F0IGEsIGZsb2F0IGIpCi17Ci0gICAgcmV0dXJuIGEgPiBiID8gYSA6IGI7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19taW5mKGZsb2F0IGEsIGZsb2F0IGIpCi17Ci0gICAgcmV0dXJuIGEgPCBiID8gYSA6IGI7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19zcXJmKGZsb2F0IHYpCi17Ci0gICAgcmV0dXJuIHYgKiB2OwotfQotCi1zdGF0aWMgaW50IFNDX3NxcihpbnQgdikKLXsKLSAgICByZXR1cm4gdiAqIHY7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19mcmFjZihmbG9hdCB2KQotewotICAgIHJldHVybiB2IC0gZmxvb3JmKHYpOwotfQotCi1zdGF0aWMgZmxvYXQgU0Nfcm91bmRmKGZsb2F0IHYpCi17Ci0gICAgcmV0dXJuIGZsb29yZih2ICsgMC40OTk5OTk5OTk5KTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX2Rpc3RmMihmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MikKLXsKLSAgICBmbG9hdCB4ID0geDIgLSB4MTsKLSAgICBmbG9hdCB5ID0geTIgLSB5MTsKLSAgICByZXR1cm4gc3FydGYoeCAqIHggKyB5ICogeSk7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19kaXN0ZjMoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MikKLXsKLSAgICBmbG9hdCB4ID0geDIgLSB4MTsKLSAgICBmbG9hdCB5ID0geTIgLSB5MTsKLSAgICBmbG9hdCB6ID0gejIgLSB6MTsKLSAgICByZXR1cm4gc3FydGYoeCAqIHggKyB5ICogeSArIHogKiB6KTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX21hZ2YyKGZsb2F0IGEsIGZsb2F0IGIpCi17Ci0gICAgcmV0dXJuIHNxcnRmKGEgKiBhICsgYiAqIGIpOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfbWFnZjMoZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgYykKLXsKLSAgICByZXR1cm4gc3FydGYoYSAqIGEgKyBiICogYiArIGMgKiBjKTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX3JhZGYoZmxvYXQgZGVncmVlcykKLXsKLSAgICByZXR1cm4gZGVncmVlcyAqIERFR19UT19SQUQ7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19kZWdmKGZsb2F0IHJhZGlhbnMpCi17Ci0gICAgcmV0dXJuIHJhZGlhbnMgKiBSQURfVE9fREVHOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfbGVycGYoZmxvYXQgc3RhcnQsIGZsb2F0IHN0b3AsIGZsb2F0IGFtb3VudCkKLXsKLSAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKLX0KLQotc3RhdGljIGZsb2F0IFNDX25vcm1mKGZsb2F0IHN0YXJ0LCBmbG9hdCBzdG9wLCBmbG9hdCB2YWx1ZSkKLXsKLSAgICByZXR1cm4gKHZhbHVlIC0gc3RhcnQpIC8gKHN0b3AgLSBzdGFydCk7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19tYXBmKGZsb2F0IG1pblN0YXJ0LCBmbG9hdCBtaW5TdG9wLCBmbG9hdCBtYXhTdGFydCwgZmxvYXQgbWF4U3RvcCwgZmxvYXQgdmFsdWUpCi17Ci0gICAgcmV0dXJuIG1heFN0YXJ0ICsgKG1heFN0YXJ0IC0gbWF4U3RvcCkgKiAoKHZhbHVlIC0gbWluU3RhcnQpIC8gKG1pblN0b3AgLSBtaW5TdGFydCkpOworICAgIGludCBpID0gKGludClmbG9vcih2KTsKKyAgICByZXR1cm4gZm1pbih2IC0gaSwgMHgxLmZmZmZmZXAtMWYpOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTUxMSwzNDggKzE3OCwyMiBAQAogICAgIHJldHVybiB0aW1laW5mby0+dG1feWVhcjsKIH0KIAotc3RhdGljIGludDMyX3QgU0NfdXB0aW1lTWlsbGlzKCkKK3N0YXRpYyBpbnQ2NF90IFNDX3VwdGltZU1pbGxpcygpCiB7CiAgICAgcmV0dXJuIG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyhzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykpOwogfQogCi1zdGF0aWMgaW50MzJfdCBTQ19zdGFydFRpbWVNaWxsaXMoKQorc3RhdGljIGludDY0X3QgU0NfdXB0aW1lTmFub3MoKQoreworICAgIHJldHVybiBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19nZXREdCgpCiB7CiAgICAgR0VUX1RMUygpOwotICAgIHJldHVybiBzYy0+bUVudmlyb21lbnQubVN0YXJ0VGltZU1pbGxpczsKLX0KLQotc3RhdGljIGludDMyX3QgU0NfZWxhcHNlZFRpbWVNaWxsaXMoKQotewotICAgIEdFVF9UTFMoKTsKLSAgICByZXR1cm4gbmFub3NlY29uZHNfdG9fbWlsbGlzZWNvbmRzKHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKSkKLSAgICAgICAgICAgIC0gc2MtPm1FbnZpcm9tZW50Lm1TdGFydFRpbWVNaWxsaXM7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gTWF0cml4IHJvdXRpbmVzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCi1zdGF0aWMgdm9pZCBTQ19tYXRyaXhMb2FkSWRlbnRpdHkocnNjX01hdHJpeCAqbWF0KQotewotICAgIE1hdHJpeCAqbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWF0cml4ICo+KG1hdCk7Ci0gICAgbS0+bG9hZElkZW50aXR5KCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX21hdHJpeExvYWRGbG9hdChyc2NfTWF0cml4ICptYXQsIGNvbnN0IGZsb2F0ICpmKQotewotICAgIE1hdHJpeCAqbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWF0cml4ICo+KG1hdCk7Ci0gICAgbS0+bG9hZChmKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbWF0cml4TG9hZE1hdChyc2NfTWF0cml4ICptYXQsIGNvbnN0IHJzY19NYXRyaXggKm5ld21hdCkKLXsKLSAgICBNYXRyaXggKm0gPSByZWludGVycHJldF9jYXN0PE1hdHJpeCAqPihtYXQpOwotICAgIG0tPmxvYWQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNYXRyaXggKj4obmV3bWF0KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX21hdHJpeExvYWRSb3RhdGUocnNjX01hdHJpeCAqbWF0LCBmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopCi17Ci0gICAgTWF0cml4ICptID0gcmVpbnRlcnByZXRfY2FzdDxNYXRyaXggKj4obWF0KTsKLSAgICBtLT5sb2FkUm90YXRlKHJvdCwgeCwgeSwgeik7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX21hdHJpeExvYWRTY2FsZShyc2NfTWF0cml4ICptYXQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopCi17Ci0gICAgTWF0cml4ICptID0gcmVpbnRlcnByZXRfY2FzdDxNYXRyaXggKj4obWF0KTsKLSAgICBtLT5sb2FkU2NhbGUoeCwgeSwgeik7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX21hdHJpeExvYWRUcmFuc2xhdGUocnNjX01hdHJpeCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KQotewotICAgIE1hdHJpeCAqbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWF0cml4ICo+KG1hdCk7Ci0gICAgbS0+bG9hZFRyYW5zbGF0ZSh4LCB5LCB6KTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbWF0cml4TG9hZE11bHRpcGx5KHJzY19NYXRyaXggKm1hdCwgY29uc3QgcnNjX01hdHJpeCAqbGhzLCBjb25zdCByc2NfTWF0cml4ICpyaHMpCi17Ci0gICAgTWF0cml4ICptID0gcmVpbnRlcnByZXRfY2FzdDxNYXRyaXggKj4obWF0KTsKLSAgICBtLT5sb2FkTXVsdGlwbHkocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNYXRyaXggKj4obGhzKSwKLSAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNYXRyaXggKj4ocmhzKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX21hdHJpeE11bHRpcGx5KHJzY19NYXRyaXggKm1hdCwgY29uc3QgcnNjX01hdHJpeCAqcmhzKQotewotICAgIE1hdHJpeCAqbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWF0cml4ICo+KG1hdCk7Ci0gICAgbS0+bXVsdGlwbHkocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNYXRyaXggKj4ocmhzKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX21hdHJpeFJvdGF0ZShyc2NfTWF0cml4ICptYXQsIGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBNYXRyaXggKm0gPSByZWludGVycHJldF9jYXN0PE1hdHJpeCAqPihtYXQpOwotICAgIG0tPnJvdGF0ZShyb3QsIHgsIHksIHopOwotfQotCi1zdGF0aWMgdm9pZCBTQ19tYXRyaXhTY2FsZShyc2NfTWF0cml4ICptYXQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopCi17Ci0gICAgTWF0cml4ICptID0gcmVpbnRlcnByZXRfY2FzdDxNYXRyaXggKj4obWF0KTsKLSAgICBtLT5zY2FsZSh4LCB5LCB6KTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbWF0cml4VHJhbnNsYXRlKHJzY19NYXRyaXggKm1hdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBNYXRyaXggKm0gPSByZWludGVycHJldF9jYXN0PE1hdHJpeCAqPihtYXQpOwotICAgIG0tPnRyYW5zbGF0ZSh4LCB5LCB6KTsKLX0KLQotCi1zdGF0aWMgdm9pZCBTQ192ZWMyUmFuZChmbG9hdCAqdmVjLCBmbG9hdCBtYXhMZW4pCi17Ci0gICAgZmxvYXQgYW5nbGUgPSBTQ19yYW5kZihQSSAqIDIpOwotICAgIGZsb2F0IGxlbiA9IFNDX3JhbmRmKG1heExlbik7Ci0gICAgdmVjWzBdID0gbGVuICogc2luZihhbmdsZSk7Ci0gICAgdmVjWzFdID0gbGVuICogY29zZihhbmdsZSk7Ci19Ci0KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIENvbnRleHQKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgdm9pZCBTQ19iaW5kVGV4dHVyZShSc1Byb2dyYW1GcmFnbWVudCB2cGYsIHVpbnQzMl90IHNsb3QsIFJzQWxsb2NhdGlvbiB2YSkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgcnNpX1Byb2dyYW1CaW5kVGV4dHVyZShyc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxQcm9ncmFtRnJhZ21lbnQgKj4odnBmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKSk7Ci0KLX0KLQotc3RhdGljIHZvaWQgU0NfYmluZFNhbXBsZXIoUnNQcm9ncmFtRnJhZ21lbnQgdnBmLCB1aW50MzJfdCBzbG90LCBSc1NhbXBsZXIgdnMpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJzaV9Qcm9ncmFtQmluZFNhbXBsZXIocnNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UHJvZ3JhbUZyYWdtZW50ICo+KHZwZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U2FtcGxlciAqPih2cykpOwotCi19Ci0KLXN0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShSc1Byb2dyYW1GcmFnbWVudFN0b3JlIHBmcykKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgcnNpX0NvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUocnNjLCBwZnMpOwotCi19Ci0KLXN0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtRnJhZ21lbnQoUnNQcm9ncmFtRnJhZ21lbnQgcGYpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudChyc2MsIHBmKTsKLQotfQotCi1zdGF0aWMgdm9pZCBTQ19iaW5kUHJvZ3JhbVZlcnRleChSc1Byb2dyYW1WZXJ0ZXggcHYpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgocnNjLCBwdik7Ci0KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBWUAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXN0YXRpYyB2b2lkIFNDX3ZwTG9hZE1vZGVsTWF0cml4KGNvbnN0IHJzY19NYXRyaXggKm0pCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJzYy0+Z2V0VmVydGV4KCktPnNldE1vZGVsdmlld01hdHJpeChtKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfdnBMb2FkVGV4dHVyZU1hdHJpeChjb25zdCByc2NfTWF0cml4ICptKQotewotICAgIEdFVF9UTFMoKTsKLSAgICByc2MtPmdldFZlcnRleCgpLT5zZXRUZXh0dXJlTWF0cml4KG0pOwotfQotCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBEcmF3aW5nCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdGljIHZvaWQgU0NfZHJhd0xpbmUoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZsb2F0IHZ0eFtdID0geyB4MSwgeTEsIHoxLCB4MiwgeTIsIHoyIH07Ci0gICAgVmVydGV4QXJyYXkgdmE7Ci0gICAgdmEuYWRkTGVnYWN5KEdMX0ZMT0FULCAzLCAxMiwgUlNfS0lORF9QT1NJVElPTiwgZmFsc2UsICh1aW50MzJfdCl2dHgpOwotICAgIGlmIChyc2MtPmNoZWNrVmVyc2lvbjJfMCgpKSB7Ci0gICAgICAgIHZhLnNldHVwR0wyKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXksICZyc2MtPm1TaGFkZXJDYWNoZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmEuc2V0dXBHTChyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5KTsKLSAgICB9Ci0KLSAgICBnbERyYXdBcnJheXMoR0xfTElORVMsIDAsIDIpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3UG9pbnQoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZmxvYXQgdnR4W10gPSB7IHgsIHksIHogfTsKLQotICAgIFZlcnRleEFycmF5IHZhOwotICAgIHZhLmFkZExlZ2FjeShHTF9GTE9BVCwgMywgMTIsIFJTX0tJTkRfUE9TSVRJT04sIGZhbHNlLCAodWludDMyX3QpdnR4KTsKLSAgICBpZiAocnNjLT5jaGVja1ZlcnNpb24yXzAoKSkgewotICAgICAgICB2YS5zZXR1cEdMMihyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5LCAmcnNjLT5tU2hhZGVyQ2FjaGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhLnNldHVwR0wocnNjLCAmcnNjLT5tU3RhdGVWZXJ0ZXhBcnJheSk7Ci0gICAgfQotCi0gICAgZ2xEcmF3QXJyYXlzKEdMX1BPSU5UUywgMCwgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RyYXdRdWFkVGV4Q29vcmRzKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MSwgZmxvYXQgdjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTIsIGZsb2F0IHYyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUzLCBmbG9hdCB2MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1NCwgZmxvYXQgdjQpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vTE9HRSgiUXVhZCIpOwotICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgxLCB5MSwgejEpOwotICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgyLCB5MiwgejIpOwotICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHgzLCB5MywgejMpOwotICAgIC8vTE9HRSgiJTQuMmYsICU0LjJmLCAlNC4yZiIsIHg0LCB5NCwgejQpOwotCi0gICAgZmxvYXQgdnR4W10gPSB7eDEseTEsejEsIHgyLHkyLHoyLCB4Myx5Myx6MywgeDQseTQsejR9OwotICAgIGNvbnN0IGZsb2F0IHRleFtdID0ge3UxLHYxLCB1Mix2MiwgdTMsdjMsIHU0LHY0fTsKLQotICAgIFZlcnRleEFycmF5IHZhOwotICAgIHZhLmFkZExlZ2FjeShHTF9GTE9BVCwgMywgMTIsIFJTX0tJTkRfUE9TSVRJT04sIGZhbHNlLCAodWludDMyX3QpdnR4KTsKLSAgICB2YS5hZGRMZWdhY3koR0xfRkxPQVQsIDIsIDgsIFJTX0tJTkRfVEVYVFVSRSwgZmFsc2UsICh1aW50MzJfdCl0ZXgpOwotICAgIGlmIChyc2MtPmNoZWNrVmVyc2lvbjJfMCgpKSB7Ci0gICAgICAgIHZhLnNldHVwR0wyKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXksICZyc2MtPm1TaGFkZXJDYWNoZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmEuc2V0dXBHTChyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5KTsKLSAgICB9Ci0KLQotICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3UXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLAotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0KQotewotICAgIFNDX2RyYXdRdWFkVGV4Q29vcmRzKHgxLCB5MSwgejEsIDAsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeDIsIHkyLCB6MiwgMSwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4MywgeTMsIHozLCAxLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIHg0LCB5NCwgejQsIDAsIDApOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2UoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgT2JqZWN0QmFzZVJlZjxjb25zdCBQcm9ncmFtVmVydGV4PiB0bXAocnNjLT5nZXRWZXJ0ZXgoKSk7Ci0gICAgcnNjLT5zZXRWZXJ0ZXgocnNjLT5nZXREZWZhdWx0UHJvZ3JhbVZlcnRleCgpKTsKLSAgICAvL3JzYy0+c2V0dXBDaGVjaygpOwotCi0gICAgLy9HTGludCBjcm9wWzRdID0gezAsIGgsIHcsIC1ofTsKLQotICAgIGZsb2F0IHNoID0gcnNjLT5nZXRIZWlnaHQoKTsKLQotICAgIFNDX2RyYXdRdWFkKHgsICAgc2ggLSB5LCAgICAgeiwKLSAgICAgICAgICAgICAgICB4K3csIHNoIC0geSwgICAgIHosCi0gICAgICAgICAgICAgICAgeCt3LCBzaCAtICh5K2gpLCB6LAotICAgICAgICAgICAgICAgIHgsICAgc2ggLSAoeStoKSwgeik7Ci0gICAgcnNjLT5zZXRWZXJ0ZXgoKFByb2dyYW1WZXJ0ZXggKil0bXAuZ2V0KCkpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2VDcm9wcGVkKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgsCi0gICAgICAgIGZsb2F0IGN4MCwgZmxvYXQgY3kwLCBmbG9hdCBjeDEsIGZsb2F0IGN5MSkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgR0xpbnQgY3JvcFs0XSA9IHtjeDAsIGN5MCwgY3gxLCBjeTF9OwotICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKLSAgICBnbERyYXdUZXhmT0VTKHgsIHksIHosIHcsIGgpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3U3ByaXRlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGZsb2F0IHZpblszXSA9IHt4LCB5LCB6fTsKLSAgICBmbG9hdCB2b3V0WzRdOwotCi0gICAgLy9MT0dFKCJkcyAgaW4gJWYgJWYgJWYiLCB4LCB5LCB6KTsKLSAgICByc2MtPmdldFZlcnRleCgpLT50cmFuc2Zvcm1Ub1NjcmVlbihyc2MsIHZvdXQsIHZpbik7Ci0gICAgLy9MT0dFKCJkcyAgb3V0ICVmICVmICVmICVmIiwgdm91dFswXSwgdm91dFsxXSwgdm91dFsyXSwgdm91dFszXSk7Ci0gICAgdm91dFswXSAvPSB2b3V0WzNdOwotICAgIHZvdXRbMV0gLz0gdm91dFszXTsKLSAgICB2b3V0WzJdIC89IHZvdXRbM107Ci0KLSAgICB2b3V0WzBdICo9IHJzYy0+Z2V0V2lkdGgoKSAvIDI7Ci0gICAgdm91dFsxXSAqPSByc2MtPmdldEhlaWdodCgpIC8gMjsKLSAgICB2b3V0WzBdICs9IHJzYy0+Z2V0V2lkdGgoKSAvIDI7Ci0gICAgdm91dFsxXSArPSByc2MtPmdldEhlaWdodCgpIC8gMjsKLQotICAgIHZvdXRbMF0gLT0gdy8yOwotICAgIHZvdXRbMV0gLT0gaC8yOwotCi0gICAgLy9MT0dFKCJkcyAgb3V0MiAlZiAlZiAlZiIsIHZvdXRbMF0sIHZvdXRbMV0sIHZvdXRbMl0pOwotCi0gICAgLy8gVSwgViwgVywgSAotICAgIFNDX2RyYXdTcHJpdGVTY3JlZW5zcGFjZSh2b3V0WzBdLCB2b3V0WzFdLCB6LCBoLCB3KTsKLSAgICAvL3JzYy0+c2V0dXBDaGVjaygpOwotfQotCi0KLXN0YXRpYyB2b2lkIFNDX2RyYXdSZWN0KGZsb2F0IHgxLCBmbG9hdCB5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgeikKLXsKLSAgICBTQ19kcmF3UXVhZCh4MSwgeTIsIHosCi0gICAgICAgICAgICAgICAgeDIsIHkyLCB6LAotICAgICAgICAgICAgICAgIHgyLCB5MSwgeiwKLSAgICAgICAgICAgICAgICB4MSwgeTEsIHopOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3U2ltcGxlTWVzaChSc1NpbXBsZU1lc2ggdnNtKQotewotICAgIEdFVF9UTFMoKTsKLSAgICBTaW1wbGVNZXNoICpzbSA9IHN0YXRpY19jYXN0PFNpbXBsZU1lc2ggKj4odnNtKTsKLSAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc20tPnJlbmRlcihyc2MpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3U2ltcGxlTWVzaFJhbmdlKFJzU2ltcGxlTWVzaCB2c20sIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pCi17Ci0gICAgR0VUX1RMUygpOwotICAgIFNpbXBsZU1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPih2c20pOwotICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzbS0+cmVuZGVyUmFuZ2UocnNjLCBzdGFydCwgbGVuKTsKKyAgICBpbnQ2NF90IGwgPSBzYy0+bUVudmlyb21lbnQubUxhc3REdFRpbWU7CisgICAgc2MtPm1FbnZpcm9tZW50Lm1MYXN0RHRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgIHJldHVybiAoKGZsb2F0KShzYy0+bUVudmlyb21lbnQubUxhc3REdFRpbWUgLSBsKSkgLyAxLjBlOTsKIH0KIAogCkBAIC04NjAsNTMxICsyMDEsMzM4IEBACiAvLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXN0YXRpYyB2b2lkIFNDX2NvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCitzdGF0aWMgdWludDMyX3QgU0NfYWxsb2NHZXREaW1YKFJzQWxsb2NhdGlvbiB2YSkKIHsKLSAgICBHRVRfVExTKCk7Ci0gICAgcnNjLT5tU3RhdGVWZXJ0ZXguY29sb3JbMF0gPSByOwotICAgIHJzYy0+bVN0YXRlVmVydGV4LmNvbG9yWzFdID0gZzsKLSAgICByc2MtPm1TdGF0ZVZlcnRleC5jb2xvclsyXSA9IGI7Ci0gICAgcnNjLT5tU3RhdGVWZXJ0ZXguY29sb3JbM10gPSBhOwotICAgIGlmICghcnNjLT5jaGVja1ZlcnNpb24yXzAoKSkgewotICAgICAgICBnbENvbG9yNGYociwgZywgYiwgYSk7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmEpOworICAgIENIRUNLX09CSihhKTsKKyAgICAvL0xPR0UoIlNDX2FsbG9jR2V0RGltWCBhPSVwICB0eXBlPSVwIiwgYSwgYS0+Z2V0VHlwZSgpKTsKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpLT5nZXREaW1YKCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBTQ19hbGxvY0dldERpbVkoUnNBbGxvY2F0aW9uIHZhKQoreworICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBDSEVDS19PQkooYSk7CisgICAgcmV0dXJuIGEtPmdldFR5cGUoKS0+Z2V0RGltWSgpOworfQorCitzdGF0aWMgdWludDMyX3QgU0NfYWxsb2NHZXREaW1aKFJzQWxsb2NhdGlvbiB2YSkKK3sKKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgQ0hFQ0tfT0JKKGEpOworICAgIHJldHVybiBhLT5nZXRUeXBlKCktPmdldERpbVooKTsKK30KKworc3RhdGljIHVpbnQzMl90IFNDX2FsbG9jR2V0RGltTE9EKFJzQWxsb2NhdGlvbiB2YSkKK3sKKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgQ0hFQ0tfT0JKKGEpOworICAgIHJldHVybiBhLT5nZXRUeXBlKCktPmdldERpbUxPRCgpOworfQorCitzdGF0aWMgdWludDMyX3QgU0NfYWxsb2NHZXREaW1GYWNlcyhSc0FsbG9jYXRpb24gdmEpCit7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmEpOworICAgIENIRUNLX09CSihhKTsKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpLT5nZXREaW1GYWNlcygpOworfQorCitzdGF0aWMgY29uc3Qgdm9pZCAqIFNDX2dldEVsZW1lbnRBdFgoUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCB4KQoreworICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBDSEVDS19PQkooYSk7CisgICAgY29uc3QgVHlwZSAqdCA9IGEtPmdldFR5cGUoKTsKKyAgICBDSEVDS19PQkoodCk7CisgICAgY29uc3QgdWludDhfdCAqcCA9IChjb25zdCB1aW50OF90ICopYS0+Z2V0UHRyKCk7CisgICAgcmV0dXJuICZwW3QtPmdldEVsZW1lbnRTaXplQnl0ZXMoKSAqIHhdOworfQorCitzdGF0aWMgY29uc3Qgdm9pZCAqIFNDX2dldEVsZW1lbnRBdFhZKFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkKK3sKKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgQ0hFQ0tfT0JKKGEpOworICAgIGNvbnN0IFR5cGUgKnQgPSBhLT5nZXRUeXBlKCk7CisgICAgQ0hFQ0tfT0JKKHQpOworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSAoY29uc3QgdWludDhfdCAqKWEtPmdldFB0cigpOworICAgIHJldHVybiAmcFt0LT5nZXRFbGVtZW50U2l6ZUJ5dGVzKCkgKiAoeCArIHkqdC0+Z2V0RGltWCgpKV07Cit9CisKK3N0YXRpYyBjb25zdCB2b2lkICogU0NfZ2V0RWxlbWVudEF0WFlaKFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikKK3sKKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgQ0hFQ0tfT0JKKGEpOworICAgIGNvbnN0IFR5cGUgKnQgPSBhLT5nZXRUeXBlKCk7CisgICAgQ0hFQ0tfT0JKKHQpOworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSAoY29uc3QgdWludDhfdCAqKWEtPmdldFB0cigpOworICAgIHJldHVybiAmcFt0LT5nZXRFbGVtZW50U2l6ZUJ5dGVzKCkgKiAoeCArIHkqdC0+Z2V0RGltWCgpKV07Cit9CisKK3N0YXRpYyB2b2lkIFNDX3NldE9iamVjdCh2b2lkICoqdmRzdCwgdm9pZCAqIHZzcmMpIHsKKyAgICAvL0xPR0UoIlNDX3NldE9iamVjdCAgJXAsJXAgICVwIiwgdmRzdCwgKnZkc3QsIHZzcmMpOworICAgIGlmICh2c3JjKSB7CisgICAgICAgIENIRUNLX09CSih2c3JjKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8T2JqZWN0QmFzZSAqPih2c3JjKS0+aW5jU3lzUmVmKCk7CiAgICAgfQotfQotCi1zdGF0aWMgdm9pZCBTQ19hbWJpZW50KGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCi17Ci0gICAgR0xmbG9hdCBwYXJhbXNbXSA9IHsgciwgZywgYiwgYSB9OwotICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfQU1CSUVOVCwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfZGlmZnVzZShmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQotewotICAgIEdMZmxvYXQgcGFyYW1zW10gPSB7IHIsIGcsIGIsIGEgfTsKLSAgICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0RJRkZVU0UsIHBhcmFtcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3NwZWN1bGFyKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCi17Ci0gICAgR0xmbG9hdCBwYXJhbXNbXSA9IHsgciwgZywgYiwgYSB9OwotICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfU1BFQ1VMQVIsIHBhcmFtcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2VtaXNzaW9uKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCi17Ci0gICAgR0xmbG9hdCBwYXJhbXNbXSA9IHsgciwgZywgYiwgYSB9OwotICAgIGdsTWF0ZXJpYWxmdihHTF9GUk9OVF9BTkRfQkFDSywgR0xfRU1JU1NJT04sIHBhcmFtcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3NoaW5pbmVzcyhmbG9hdCBzKQotewotICAgIGdsTWF0ZXJpYWxmKEdMX0ZST05UX0FORF9CQUNLLCBHTF9TSElOSU5FU1MsIHMpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19wb2ludEF0dGVudWF0aW9uKGZsb2F0IGEsIGZsb2F0IGIsIGZsb2F0IGMpCi17Ci0gICAgR0xmbG9hdCBwYXJhbXNbXSA9IHsgYSwgYiwgYyB9OwotICAgIGdsUG9pbnRQYXJhbWV0ZXJmdihHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTiwgcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfaHNiVG9SZ2IoZmxvYXQgaCwgZmxvYXQgcywgZmxvYXQgYiwgZmxvYXQqIHJnYikKLXsKLSAgICBmbG9hdCByZWQgPSAwLjBmOwotICAgIGZsb2F0IGdyZWVuID0gMC4wZjsKLSAgICBmbG9hdCBibHVlID0gMC4wZjsKLQotICAgIGZsb2F0IHggPSBoOwotICAgIGZsb2F0IHkgPSBzOwotICAgIGZsb2F0IHogPSBiOwotCi0gICAgZmxvYXQgaGYgPSAoeCAtIChpbnQpIHgpICogNi4wZjsKLSAgICBpbnQgaWhmID0gKGludCkgaGY7Ci0gICAgZmxvYXQgZiA9IGhmIC0gaWhmOwotICAgIGZsb2F0IHB2ID0geiAqICgxLjBmIC0geSk7Ci0gICAgZmxvYXQgcXYgPSB6ICogKDEuMGYgLSB5ICogZik7Ci0gICAgZmxvYXQgdHYgPSB6ICogKDEuMGYgLSB5ICogKDEuMGYgLSBmKSk7Ci0KLSAgICBzd2l0Y2ggKGloZikgewotICAgICAgICBjYXNlIDA6ICAgICAgICAgLy8gUmVkIGlzIHRoZSBkb21pbmFudCBjb2xvcgotICAgICAgICAgICAgcmVkID0gejsKLSAgICAgICAgICAgIGdyZWVuID0gdHY7Ci0gICAgICAgICAgICBibHVlID0gcHY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOiAgICAgICAgIC8vIEdyZWVuIGlzIHRoZSBkb21pbmFudCBjb2xvcgotICAgICAgICAgICAgcmVkID0gcXY7Ci0gICAgICAgICAgICBncmVlbiA9IHo7Ci0gICAgICAgICAgICBibHVlID0gcHY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgcmVkID0gcHY7Ci0gICAgICAgICAgICBncmVlbiA9IHo7Ci0gICAgICAgICAgICBibHVlID0gdHY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOiAgICAgICAgIC8vIEJsdWUgaXMgdGhlIGRvbWluYW50IGNvbG9yCi0gICAgICAgICAgICByZWQgPSBwdjsKLSAgICAgICAgICAgIGdyZWVuID0gcXY7Ci0gICAgICAgICAgICBibHVlID0gejsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICByZWQgPSB0djsKLSAgICAgICAgICAgIGdyZWVuID0gcHY7Ci0gICAgICAgICAgICBibHVlID0gejsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU6ICAgICAgICAgLy8gUmVkIGlzIHRoZSBkb21pbmFudCBjb2xvcgotICAgICAgICAgICAgcmVkID0gejsKLSAgICAgICAgICAgIGdyZWVuID0gcHY7Ci0gICAgICAgICAgICBibHVlID0gcXY7Ci0gICAgICAgICAgICBicmVhazsKKyAgICBpZiAodmRzdFswXSkgeworICAgICAgICBDSEVDS19PQkoodmRzdFswXSk7CisgICAgICAgIHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKj4odmRzdFswXSktPmRlY1N5c1JlZigpOwogICAgIH0KLQotICAgIHJnYlswXSA9IHJlZDsKLSAgICByZ2JbMV0gPSBncmVlbjsKLSAgICByZ2JbMl0gPSBibHVlOworICAgICp2ZHN0ID0gdnNyYzsKKyAgICAvL0xPR0UoIlNDX3NldE9iamVjdCAqIik7CiB9Ci0KLXN0YXRpYyBpbnQgU0NfaHNiVG9BYmdyKGZsb2F0IGgsIGZsb2F0IHMsIGZsb2F0IGIsIGZsb2F0IGEpCi17Ci0gICAgZmxvYXQgcmdiWzNdOwotICAgIFNDX2hzYlRvUmdiKGgsIHMsIGIsIHJnYik7Ci0gICAgcmV0dXJuIGludChhICAgICAgKiAyNTUuMGYpIDw8IDI0IHwKLSAgICAgICAgICAgaW50KHJnYlsyXSAqIDI1NS4wZikgPDwgMTYgfAotICAgICAgICAgICBpbnQocmdiWzFdICogMjU1LjBmKSA8PCAgOCB8Ci0gICAgICAgICAgIGludChyZ2JbMF0gKiAyNTUuMGYpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19oc2IoZmxvYXQgaCwgZmxvYXQgcywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgZmxvYXQgcmdiWzNdOwotICAgIFNDX2hzYlRvUmdiKGgsIHMsIGIsIHJnYik7Ci0gICAgaWYgKHJzYy0+Y2hlY2tWZXJzaW9uMl8wKCkpIHsKLSAgICAgICAgZ2xWZXJ0ZXhBdHRyaWI0ZigxLCByZ2JbMF0sIHJnYlsxXSwgcmdiWzJdLCBhKTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbENvbG9yNGYocmdiWzBdLCByZ2JbMV0sIHJnYlsyXSwgYSk7CitzdGF0aWMgdm9pZCBTQ19jbGVhck9iamVjdCh2b2lkICoqdmRzdCkgeworICAgIC8vTE9HRSgiU0NfY2xlYXJPYmplY3QgICVwLCVwIiwgdmRzdCwgKnZkc3QpOworICAgIGlmICh2ZHN0WzBdKSB7CisgICAgICAgIENIRUNLX09CSih2ZHN0WzBdKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8T2JqZWN0QmFzZSAqPih2ZHN0WzBdKS0+ZGVjU3lzUmVmKCk7CiAgICAgfQorICAgICp2ZHN0ID0gTlVMTDsKKyAgICAvL0xPR0UoIlNDX2NsZWFyT2JqZWN0ICoiKTsKK30KK3N0YXRpYyBib29sIFNDX2lzT2JqZWN0KFJzQWxsb2NhdGlvbiB2c3JjKSB7CisgICAgcmV0dXJuIHZzcmMgIT0gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgU0NfdXBsb2FkVG9UZXh0dXJlKFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgYmFzZU1pcExldmVsKQorCisKK3N0YXRpYyB2b2lkIFNDX2RlYnVnRihjb25zdCBjaGFyICpzLCBmbG9hdCBmKSB7CisgICAgTE9HRSgiJXMgJWYsIDB4JTA4eCIsIHMsIGYsICooKGludCAqKSAoJmYpKSk7Cit9CitzdGF0aWMgdm9pZCBTQ19kZWJ1Z0Z2Mihjb25zdCBjaGFyICpzLCBmbG9hdCBmMSwgZmxvYXQgZjIpIHsKKyAgICBMT0dFKCIlcyB7JWYsICVmfSIsIHMsIGYxLCBmMik7Cit9CitzdGF0aWMgdm9pZCBTQ19kZWJ1Z0Z2Myhjb25zdCBjaGFyICpzLCBmbG9hdCBmMSwgZmxvYXQgZjIsIGZsb2F0IGYzKSB7CisgICAgTE9HRSgiJXMgeyVmLCAlZiwgJWZ9IiwgcywgZjEsIGYyLCBmMyk7Cit9CitzdGF0aWMgdm9pZCBTQ19kZWJ1Z0Z2NChjb25zdCBjaGFyICpzLCBmbG9hdCBmMSwgZmxvYXQgZjIsIGZsb2F0IGYzLCBmbG9hdCBmNCkgeworICAgIExPR0UoIiVzIHslZiwgJWYsICVmLCAlZn0iLCBzLCBmMSwgZjIsIGYzLCBmNCk7Cit9CitzdGF0aWMgdm9pZCBTQ19kZWJ1Z0ZNNHY0KGNvbnN0IGNoYXIgKnMsIGNvbnN0IGZsb2F0ICpmKSB7CisgICAgTE9HRSgiJXMgeyVmLCAlZiwgJWYsICVmIiwgcywgZlswXSwgZls0XSwgZls4XSwgZlsxMl0pOworICAgIExPR0UoIiVzICAlZiwgJWYsICVmLCAlZiIsIHMsIGZbMV0sIGZbNV0sIGZbOV0sIGZbMTNdKTsKKyAgICBMT0dFKCIlcyAgJWYsICVmLCAlZiwgJWYiLCBzLCBmWzJdLCBmWzZdLCBmWzEwXSwgZlsxNF0pOworICAgIExPR0UoIiVzICAlZiwgJWYsICVmLCAlZn0iLCBzLCBmWzNdLCBmWzddLCBmWzExXSwgZlsxNV0pOworfQorc3RhdGljIHZvaWQgU0NfZGVidWdGTTN2Myhjb25zdCBjaGFyICpzLCBjb25zdCBmbG9hdCAqZikgeworICAgIExPR0UoIiVzIHslZiwgJWYsICVmIiwgcywgZlswXSwgZlszXSwgZls2XSk7CisgICAgTE9HRSgiJXMgICVmLCAlZiwgJWYiLCBzLCBmWzFdLCBmWzRdLCBmWzddKTsKKyAgICBMT0dFKCIlcyAgJWYsICVmLCAlZn0iLHMsIGZbMl0sIGZbNV0sIGZbOF0pOworfQorc3RhdGljIHZvaWQgU0NfZGVidWdGTTJ2Mihjb25zdCBjaGFyICpzLCBjb25zdCBmbG9hdCAqZikgeworICAgIExPR0UoIiVzIHslZiwgJWYiLCBzLCBmWzBdLCBmWzJdKTsKKyAgICBMT0dFKCIlcyAgJWYsICVmfSIscywgZlsxXSwgZlszXSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2RlYnVnSTMyKGNvbnN0IGNoYXIgKnMsIGludDMyX3QgaSkgeworICAgIExPR0UoIiVzICVpICAweCV4IiwgcywgaSwgaSk7Cit9CitzdGF0aWMgdm9pZCBTQ19kZWJ1Z1UzMihjb25zdCBjaGFyICpzLCB1aW50MzJfdCBpKSB7CisgICAgTE9HRSgiJXMgJWkgIDB4JXgiLCBzLCBpLCBpKTsKK30KKworc3RhdGljIHZvaWQgU0NfZGVidWdQKGNvbnN0IGNoYXIgKnMsIGNvbnN0IHZvaWQgKnApIHsKKyAgICBMT0dFKCIlcyAlcCIsIHMsIHApOworfQorCitzdGF0aWMgdWludDMyX3QgU0NfdG9DbGllbnQyKGludCBjbWRJRCwgdm9pZCAqZGF0YSwgaW50IGxlbikKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgcnNpX0FsbG9jYXRpb25VcGxvYWRUb1RleHR1cmUocnNjLCB2YSwgZmFsc2UsIGJhc2VNaXBMZXZlbCk7CisgICAgLy9MT0dFKCJTQ190b0NsaWVudCAlaSAlaSAlaSIsIGNtZElELCBsZW4pOworICAgIHJldHVybiByc2MtPnNlbmRNZXNzYWdlVG9DbGllbnQoZGF0YSwgY21kSUQsIGxlbiwgZmFsc2UpOwogfQogCi1zdGF0aWMgdm9pZCBTQ191cGxvYWRUb0J1ZmZlck9iamVjdChSc0FsbG9jYXRpb24gdmEpCitzdGF0aWMgdWludDMyX3QgU0NfdG9DbGllbnQoaW50IGNtZElEKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYywgdmEpOworICAgIC8vTE9HRSgiU0NfdG9DbGllbnQgJWkiLCBjbWRJRCk7CisgICAgcmV0dXJuIHJzYy0+c2VuZE1lc3NhZ2VUb0NsaWVudChOVUxMLCBjbWRJRCwgMCwgZmFsc2UpOwogfQogCi1zdGF0aWMgdm9pZCBTQ19zeW5jVG9HTChSc0FsbG9jYXRpb24gdmEpCitzdGF0aWMgdWludDMyX3QgU0NfdG9DbGllbnRCbG9ja2luZzIoaW50IGNtZElELCB2b2lkICpkYXRhLCBpbnQgbGVuKQogewogICAgIEdFVF9UTFMoKTsKLSAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7Ci0KKyAgICAvL0xPR0UoIlNDX3RvQ2xpZW50QmxvY2tpbmcgJWkgJWkiLCBjbWRJRCwgbGVuKTsKKyAgICByZXR1cm4gcnNjLT5zZW5kTWVzc2FnZVRvQ2xpZW50KGRhdGEsIGNtZElELCBsZW4sIHRydWUpOwogfQogCi1zdGF0aWMgdm9pZCBTQ19DbGVhckNvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCi17Ci0gICAgLy9MT0dFKCJjICVmICVmICVmICVmIiwgciwgZywgYiwgYSk7Ci0gICAgR0VUX1RMUygpOwotICAgIHNjLT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclswXSA9IHI7Ci0gICAgc2MtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzFdID0gZzsKLSAgICBzYy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMl0gPSBiOwotICAgIHNjLT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclszXSA9IGE7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RlYnVnRihjb25zdCBjaGFyICpzLCBmbG9hdCBmKQotewotICAgIExPR0UoIiVzICVmIiwgcywgZik7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RlYnVnSGV4Rihjb25zdCBjaGFyICpzLCBmbG9hdCBmKQotewotICAgIExPR0UoIiVzIDB4JXgiLCBzLCAqKChpbnQgKikgKCZmKSkpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kZWJ1Z0kzMihjb25zdCBjaGFyICpzLCBpbnQzMl90IGkpCi17Ci0gICAgTE9HRSgiJXMgJWkiLCBzLCBpKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfZGVidWdIZXhJMzIoY29uc3QgY2hhciAqcywgaW50MzJfdCBpKQotewotICAgIExPR0UoIiVzIDB4JXgiLCBzLCBpKTsKLX0KLQotc3RhdGljIHVpbnQzMl90IFNDX2dldFdpZHRoKCkKK3N0YXRpYyB1aW50MzJfdCBTQ190b0NsaWVudEJsb2NraW5nKGludCBjbWRJRCkKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgcmV0dXJuIHJzYy0+Z2V0V2lkdGgoKTsKKyAgICAvL0xPR0UoIlNDX3RvQ2xpZW50QmxvY2tpbmcgJWkiLCBjbWRJRCk7CisgICAgcmV0dXJuIHJzYy0+c2VuZE1lc3NhZ2VUb0NsaWVudChOVUxMLCBjbWRJRCwgMCwgdHJ1ZSk7CiB9CiAKLXN0YXRpYyB1aW50MzJfdCBTQ19nZXRIZWlnaHQoKQoraW50IFNDX2RpdnNpMyhpbnQgYSwgaW50IGIpCit7CisgICAgcmV0dXJuIGEgLyBiOworfQorCitpbnQgU0NfZ2V0QWxsb2NhdGlvbihjb25zdCB2b2lkICpwdHIpCiB7CiAgICAgR0VUX1RMUygpOwotICAgIHJldHVybiByc2MtPmdldEhlaWdodCgpOworICAgIGNvbnN0IEFsbG9jYXRpb24gKmFsbG9jID0gc2MtPnB0clRvQWxsb2NhdGlvbihwdHIpOworICAgIHJldHVybiAoaW50KWFsbG9jOwogfQogCi1zdGF0aWMgdWludDMyX3QgU0NfY29sb3JGbG9hdFJHQkF0b1VOb3JtOChmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQordm9pZCBTQ19hbGxvY2F0aW9uTWFya0RpcnR5KFJzQWxsb2NhdGlvbiBhKQogewotICAgIHVpbnQzMl90IGMgPSAwOwotICAgIGMgfD0gKHVpbnQzMl90KShyICogMjU1LmYgKyAwLjVmKTsKLSAgICBjIHw9ICgodWludDMyX3QpKGcgKiAyNTUuZiArIDAuNWYpKSA8PCA4OwotICAgIGMgfD0gKCh1aW50MzJfdCkoYiAqIDI1NS5mICsgMC41ZikpIDw8IDE2OwotICAgIGMgfD0gKCh1aW50MzJfdCkoYSAqIDI1NS5mICsgMC41ZikpIDw8IDI0OwotICAgIHJldHVybiBjOworICAgIEFsbG9jYXRpb24gKmFsbG9jID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPihhKTsKKyAgICBhbGxvYy0+c2VuZERpcnR5KCk7CiB9CiAKLXN0YXRpYyB1aW50MzJfdCBTQ19jb2xvckZsb2F0UkdCQXRvNTY1KGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIpCi17Ci0gICAgdWludDMyX3QgaXIgPSAodWludDMyX3QpKHIgKiAyNTUuZiArIDAuNWYpOwotICAgIHVpbnQzMl90IGlnID0gKHVpbnQzMl90KShnICogMjU1LmYgKyAwLjVmKTsKLSAgICB1aW50MzJfdCBpYiA9ICh1aW50MzJfdCkoYiAqIDI1NS5mICsgMC41Zik7Ci0gICAgcmV0dXJuIHJzODg4dG81NjUoaXIsIGlnLCBpYik7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBTQ190b0NsaWVudCh2b2lkICpkYXRhLCBpbnQgY21kSUQsIGludCBsZW4sIGludCB3YWl0Rm9yU3BhY2UpCit2b2lkIFNDX0ZvckVhY2goUnNTY3JpcHQgdnMsCisgICAgICAgICAgICAgICAgUnNBbGxvY2F0aW9uIHZpbiwKKyAgICAgICAgICAgICAgICBSc0FsbG9jYXRpb24gdm91dCwKKyAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp1c3IpCiB7CiAgICAgR0VUX1RMUygpOwotICAgIHJldHVybiByc2MtPnNlbmRNZXNzYWdlVG9DbGllbnQoZGF0YSwgY21kSUQsIGxlbiwgd2FpdEZvclNwYWNlICE9IDApOworICAgIGNvbnN0IEFsbG9jYXRpb24gKmFpbiA9IHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmluKTsKKyAgICBBbGxvY2F0aW9uICphb3V0ID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2b3V0KTsKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIHMtPnJ1bkZvckVhY2gocnNjLCBhaW4sIGFvdXQsIHVzcik7CiB9CiAKLXN0YXRpYyB2b2lkIFNDX3NjcmlwdENhbGwoaW50IHNjcmlwdElEKQordm9pZCBTQ19Gb3JFYWNoMihSc1NjcmlwdCB2cywKKyAgICAgICAgICAgICAgICBSc0FsbG9jYXRpb24gdmluLAorICAgICAgICAgICAgICAgIFJzQWxsb2NhdGlvbiB2b3V0LAorICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnVzciwKKyAgICAgICAgICAgICAgICBjb25zdCBSc1NjcmlwdENhbGwgKmNhbGwpCiB7CiAgICAgR0VUX1RMUygpOwotICAgIHJzYy0+cnVuU2NyaXB0KChTY3JpcHQgKilzY3JpcHRJRCwgMCk7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYWluID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2aW4pOworICAgIEFsbG9jYXRpb24gKmFvdXQgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZvdXQpOworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+cnVuRm9yRWFjaChyc2MsIGFpbiwgYW91dCwgdXNyLCBjYWxsKTsKIH0KIAotCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIENsYXNzIGltcGxlbWVudGF0aW9uCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90IFNjcmlwdENTdGF0ZTo6Z1N5bXNbXSA9IHsKLSAgICAvLyBJTwotICAgIHsgImxvYWRJMzIiLCAodm9pZCAqKSZTQ19sb2FkSTMyLAotICAgICAgICAiaW50IiwgIihpbnQsIGludCkiIH0sCi0gICAgLy97ICJsb2FkVTMyIiwgKHZvaWQgKikmU0NfbG9hZFUzMiwgInVuc2lnbmVkIGludCIsICIoaW50LCBpbnQpIiB9LAotICAgIHsgImxvYWRGIiwgKHZvaWQgKikmU0NfbG9hZEYsCi0gICAgICAgICJmbG9hdCIsICIoaW50LCBpbnQpIiB9LAotICAgIHsgImxvYWRBcnJheUYiLCAodm9pZCAqKSZTQ19sb2FkQXJyYXlGLAotICAgICAgICAiZmxvYXQqIiwgIihpbnQsIGludCkiIH0sCi0gICAgeyAibG9hZEFycmF5STMyIiwgKHZvaWQgKikmU0NfbG9hZEFycmF5STMyLAotICAgICAgICAiaW50KiIsICIoaW50LCBpbnQpIiB9LAotICAgIHsgImxvYWRWZWM0IiwgKHZvaWQgKikmU0NfbG9hZFZlYzQsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgZmxvYXQgKikiIH0sCi0gICAgeyAibG9hZE1hdHJpeCIsICh2b2lkICopJlNDX2xvYWRNYXRyaXgsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgZmxvYXQgKikiIH0sCi0gICAgeyAic3RvcmVJMzIiLCAodm9pZCAqKSZTQ19zdG9yZUkzMiwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBpbnQpIiB9LAotICAgIC8veyAic3RvcmVVMzIiLCAodm9pZCAqKSZTQ19zdG9yZVUzMiwgInZvaWQiLCAiKGludCwgaW50LCB1bnNpZ25lZCBpbnQpIiB9LAotICAgIHsgInN0b3JlRiIsICh2b2lkICopJlNDX3N0b3JlRiwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBmbG9hdCkiIH0sCi0gICAgeyAic3RvcmVWZWM0IiwgKHZvaWQgKikmU0Nfc3RvcmVWZWM0LAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGZsb2F0ICopIiB9LAotICAgIHsgInN0b3JlTWF0cml4IiwgKHZvaWQgKikmU0Nfc3RvcmVNYXRyaXgsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgZmxvYXQgKikiIH0sCi0gICAgeyAibG9hZFNpbXBsZU1lc2hWZXJ0aWNlc0YiLCAodm9pZCAqKSZTQ19sb2FkU2ltcGxlTWVzaFZlcnRpY2VzRiwKLSAgICAgICAgImZsb2F0KiIsICIoaW50LCBpbnQpIiB9LAotICAgIHsgInVwZGF0ZVNpbXBsZU1lc2giLCAodm9pZCAqKSZTQ191cGRhdGVTaW1wbGVNZXNoLAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKKy8vIGxsdm0gbmFtZSBtYW5nbGluZyByZWYKKy8vICA8YnVpbHRpbi10eXBlPiA6Oj0gdiAgIyB2b2lkCisvLyAgICAgICAgICAgICAgICAgOjo9IGIgICMgYm9vbAorLy8gICAgICAgICAgICAgICAgIDo6PSBjICAjIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gYSAgIyBzaWduZWQgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBoICAjIHVuc2lnbmVkIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gcyAgIyBzaG9ydAorLy8gICAgICAgICAgICAgICAgIDo6PSB0ICAjIHVuc2lnbmVkIHNob3J0CisvLyAgICAgICAgICAgICAgICAgOjo9IGkgICMgaW50CisvLyAgICAgICAgICAgICAgICAgOjo9IGogICMgdW5zaWduZWQgaW50CisvLyAgICAgICAgICAgICAgICAgOjo9IGwgICMgbG9uZworLy8gICAgICAgICAgICAgICAgIDo6PSBtICAjIHVuc2lnbmVkIGxvbmcKKy8vICAgICAgICAgICAgICAgICA6Oj0geCAgIyBsb25nIGxvbmcsIF9faW50NjQKKy8vICAgICAgICAgICAgICAgICA6Oj0geSAgIyB1bnNpZ25lZCBsb25nIGxvbmcsIF9faW50NjQKKy8vICAgICAgICAgICAgICAgICA6Oj0gZiAgIyBmbG9hdAorLy8gICAgICAgICAgICAgICAgIDo6PSBkICAjIGRvdWJsZQogCi0gICAgLy8gbWF0aAotICAgIHsgIm1vZGYiLCAodm9pZCAqKSZmbW9kLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiYWJzIiwgKHZvaWQgKikmYWJzLAotICAgICAgICAiaW50IiwgIihpbnQpIiB9LAotICAgIHsgImFic2YiLCAodm9pZCAqKSZmYWJzZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAic2luZl9mYXN0IiwgKHZvaWQgKikmU0Nfc2luZl9mYXN0LAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJjb3NmX2Zhc3QiLCAodm9pZCAqKSZTQ19jb3NmX2Zhc3QsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgInNpbmYiLCAodm9pZCAqKSZzaW5mLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJjb3NmIiwgKHZvaWQgKikmY29zZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiYXNpbmYiLCAodm9pZCAqKSZhc2luZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiYWNvc2YiLCAodm9pZCAqKSZhY29zZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiYXRhbmYiLCAodm9pZCAqKSZhdGFuZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiYXRhbjJmIiwgKHZvaWQgKikmYXRhbjJmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiZmFic2YiLCAodm9pZCAqKSZmYWJzZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAicmFuZGYiLCAodm9pZCAqKSZTQ19yYW5kZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAicmFuZGYyIiwgKHZvaWQgKikmU0NfcmFuZGYyLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiZmxvb3JmIiwgKHZvaWQgKikmZmxvb3JmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJmcmFjZiIsICh2b2lkICopJlNDX2ZyYWNmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJjZWlsZiIsICh2b2lkICopJmNlaWxmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJyb3VuZGYiLCAodm9pZCAqKSZTQ19yb3VuZGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImV4cGYiLCAodm9pZCAqKSZleHBmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJsb2dmIiwgKHZvaWQgKikmbG9nZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAicG93ZiIsICh2b2lkICopJnBvd2YsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJtYXhmIiwgKHZvaWQgKikmU0NfbWF4ZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm1pbmYiLCAodm9pZCAqKSZTQ19taW5mLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAic3FydCIsICh2b2lkICopJnNxcnQsCi0gICAgICAgICJpbnQiLCAiKGludCkiIH0sCi0gICAgeyAic3FydGYiLCAodm9pZCAqKSZzcXJ0ZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAic3FyIiwgKHZvaWQgKikmU0Nfc3FyLAotICAgICAgICAiaW50IiwgIihpbnQpIiB9LAotICAgIHsgInNxcmYiLCAodm9pZCAqKSZTQ19zcXJmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJzaWduIiwgKHZvaWQgKikmU0Nfc2lnbiwKLSAgICAgICAgImludCIsICIoaW50KSIgfSwKLSAgICB7ICJzaWduZiIsICh2b2lkICopJlNDX3NpZ25mLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJjbGFtcCIsICh2b2lkICopJlNDX2NsYW1wLAotICAgICAgICAiaW50IiwgIihpbnQsIGludCwgaW50KSIgfSwKLSAgICB7ICJjbGFtcGYiLCAodm9pZCAqKSZTQ19jbGFtcGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiZGlzdGYyIiwgKHZvaWQgKikmU0NfZGlzdGYyLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJkaXN0ZjMiLCAodm9pZCAqKSZTQ19kaXN0ZjMsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibWFnZjIiLCAodm9pZCAqKSZTQ19tYWdmMiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm1hZ2YzIiwgKHZvaWQgKikmU0NfbWFnZjMsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAicmFkZiIsICh2b2lkICopJlNDX3JhZGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImRlZ2YiLCAodm9pZCAqKSZTQ19kZWdmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJsZXJwZiIsICh2b2lkICopJlNDX2xlcnBmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm5vcm1mIiwgKHZvaWQgKikmU0Nfbm9ybWYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibWFwZiIsICh2b2lkICopJlNDX21hcGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJub2lzZWYiLCAodm9pZCAqKSZTQ19ub2lzZWYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgIm5vaXNlZjIiLCAodm9pZCAqKSZTQ19ub2lzZWYyLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibm9pc2VmMyIsICh2b2lkICopJlNDX25vaXNlZjMsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAidHVyYnVsZW5jZWYyIiwgKHZvaWQgKikmU0NfdHVyYnVsZW5jZWYyLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgInR1cmJ1bGVuY2VmMyIsICh2b2lkICopJlNDX3R1cmJ1bGVuY2VmMywKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCitzdGF0aWMgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90IGdTeW1zW10gPSB7CisgICAgeyAiX19kaXZzaTMiLCAodm9pZCAqKSZTQ19kaXZzaTMgfSwKKworICAgIC8vIGFsbG9jYXRpb24KKyAgICB7ICJfWjE5cnNBbGxvY2F0aW9uR2V0RGltWDEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX2FsbG9jR2V0RGltWCB9LAorICAgIHsgIl9aMTlyc0FsbG9jYXRpb25HZXREaW1ZMTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfYWxsb2NHZXREaW1ZIH0sCisgICAgeyAiX1oxOXJzQWxsb2NhdGlvbkdldERpbVoxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19hbGxvY0dldERpbVogfSwKKyAgICB7ICJfWjIxcnNBbGxvY2F0aW9uR2V0RGltTE9EMTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfYWxsb2NHZXREaW1MT0QgfSwKKyAgICB7ICJfWjIzcnNBbGxvY2F0aW9uR2V0RGltRmFjZXMxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19hbGxvY0dldERpbUZhY2VzIH0sCisgICAgeyAiX1oxNXJzR2V0QWxsb2NhdGlvblBLdiIsICh2b2lkICopJlNDX2dldEFsbG9jYXRpb24gfSwKKworICAgIHsgIl9aMTRyc0dldEVsZW1lbnRBdDEzcnNfYWxsb2NhdGlvbmoiLCAodm9pZCAqKSZTQ19nZXRFbGVtZW50QXRYIH0sCisgICAgeyAiX1oxNHJzR2V0RWxlbWVudEF0MTNyc19hbGxvY2F0aW9uamoiLCAodm9pZCAqKSZTQ19nZXRFbGVtZW50QXRYWSB9LAorICAgIHsgIl9aMTRyc0dldEVsZW1lbnRBdDEzcnNfYWxsb2NhdGlvbmpqaiIsICh2b2lkICopJlNDX2dldEVsZW1lbnRBdFhZWiB9LAorCisgICAgeyAiX1oxMXJzU2V0T2JqZWN0UDEwcnNfZWxlbWVudFNfIiwgKHZvaWQgKikmU0Nfc2V0T2JqZWN0IH0sCisgICAgeyAiX1oxM3JzQ2xlYXJPYmplY3RQMTByc19lbGVtZW50IiwgKHZvaWQgKikmU0NfY2xlYXJPYmplY3QgfSwKKyAgICB7ICJfWjEwcnNJc09iamVjdDEwcnNfZWxlbWVudCIsICh2b2lkICopJlNDX2lzT2JqZWN0IH0sCisKKyAgICB7ICJfWjExcnNTZXRPYmplY3RQN3JzX3R5cGVTXyIsICh2b2lkICopJlNDX3NldE9iamVjdCB9LAorICAgIHsgIl9aMTNyc0NsZWFyT2JqZWN0UDdyc190eXBlIiwgKHZvaWQgKikmU0NfY2xlYXJPYmplY3QgfSwKKyAgICB7ICJfWjEwcnNJc09iamVjdDdyc190eXBlIiwgKHZvaWQgKikmU0NfaXNPYmplY3QgfSwKKworICAgIHsgIl9aMTFyc1NldE9iamVjdFAxM3JzX2FsbG9jYXRpb25TXyIsICh2b2lkICopJlNDX3NldE9iamVjdCB9LAorICAgIHsgIl9aMTNyc0NsZWFyT2JqZWN0UDEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX2NsZWFyT2JqZWN0IH0sCisgICAgeyAiX1oxMHJzSXNPYmplY3QxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19pc09iamVjdCB9LAorCisgICAgeyAiX1oxMXJzU2V0T2JqZWN0UDEwcnNfc2FtcGxlclNfIiwgKHZvaWQgKikmU0Nfc2V0T2JqZWN0IH0sCisgICAgeyAiX1oxM3JzQ2xlYXJPYmplY3RQMTByc19zYW1wbGVyIiwgKHZvaWQgKikmU0NfY2xlYXJPYmplY3QgfSwKKyAgICB7ICJfWjEwcnNJc09iamVjdDEwcnNfc2FtcGxlciIsICh2b2lkICopJlNDX2lzT2JqZWN0IH0sCisKKyAgICB7ICJfWjExcnNTZXRPYmplY3RQOXJzX3NjcmlwdFNfIiwgKHZvaWQgKikmU0Nfc2V0T2JqZWN0IH0sCisgICAgeyAiX1oxM3JzQ2xlYXJPYmplY3RQOXJzX3NjcmlwdCIsICh2b2lkICopJlNDX2NsZWFyT2JqZWN0IH0sCisgICAgeyAiX1oxMHJzSXNPYmplY3Q5cnNfc2NyaXB0IiwgKHZvaWQgKikmU0NfaXNPYmplY3QgfSwKKworICAgIHsgIl9aMTFyc1NldE9iamVjdFA3cnNfbWVzaFNfIiwgKHZvaWQgKikmU0Nfc2V0T2JqZWN0IH0sCisgICAgeyAiX1oxM3JzQ2xlYXJPYmplY3RQN3JzX21lc2giLCAodm9pZCAqKSZTQ19jbGVhck9iamVjdCB9LAorICAgIHsgIl9aMTByc0lzT2JqZWN0N3JzX21lc2giLCAodm9pZCAqKSZTQ19pc09iamVjdCB9LAorCisgICAgeyAiX1oxMXJzU2V0T2JqZWN0UDE5cnNfcHJvZ3JhbV9mcmFnbWVudFNfIiwgKHZvaWQgKikmU0Nfc2V0T2JqZWN0IH0sCisgICAgeyAiX1oxM3JzQ2xlYXJPYmplY3RQMTlyc19wcm9ncmFtX2ZyYWdtZW50IiwgKHZvaWQgKikmU0NfY2xlYXJPYmplY3QgfSwKKyAgICB7ICJfWjEwcnNJc09iamVjdDE5cnNfcHJvZ3JhbV9mcmFnbWVudCIsICh2b2lkICopJlNDX2lzT2JqZWN0IH0sCisKKyAgICB7ICJfWjExcnNTZXRPYmplY3RQMTdyc19wcm9ncmFtX3ZlcnRleFNfIiwgKHZvaWQgKikmU0Nfc2V0T2JqZWN0IH0sCisgICAgeyAiX1oxM3JzQ2xlYXJPYmplY3RQMTdyc19wcm9ncmFtX3ZlcnRleCIsICh2b2lkICopJlNDX2NsZWFyT2JqZWN0IH0sCisgICAgeyAiX1oxMHJzSXNPYmplY3QxN3JzX3Byb2dyYW1fdmVydGV4IiwgKHZvaWQgKikmU0NfaXNPYmplY3QgfSwKKworICAgIHsgIl9aMTFyc1NldE9iamVjdFAxN3JzX3Byb2dyYW1fcmFzdGVyU18iLCAodm9pZCAqKSZTQ19zZXRPYmplY3QgfSwKKyAgICB7ICJfWjEzcnNDbGVhck9iamVjdFAxN3JzX3Byb2dyYW1fcmFzdGVyIiwgKHZvaWQgKikmU0NfY2xlYXJPYmplY3QgfSwKKyAgICB7ICJfWjEwcnNJc09iamVjdDE3cnNfcHJvZ3JhbV9yYXN0ZXIiLCAodm9pZCAqKSZTQ19pc09iamVjdCB9LAorCisgICAgeyAiX1oxMXJzU2V0T2JqZWN0UDE2cnNfcHJvZ3JhbV9zdG9yZVNfIiwgKHZvaWQgKikmU0Nfc2V0T2JqZWN0IH0sCisgICAgeyAiX1oxM3JzQ2xlYXJPYmplY3RQMTZyc19wcm9ncmFtX3N0b3JlIiwgKHZvaWQgKikmU0NfY2xlYXJPYmplY3QgfSwKKyAgICB7ICJfWjEwcnNJc09iamVjdDE2cnNfcHJvZ3JhbV9zdG9yZSIsICh2b2lkICopJlNDX2lzT2JqZWN0IH0sCisKKyAgICB7ICJfWjExcnNTZXRPYmplY3RQN3JzX2ZvbnRTXyIsICh2b2lkICopJlNDX3NldE9iamVjdCB9LAorICAgIHsgIl9aMTNyc0NsZWFyT2JqZWN0UDdyc19mb250IiwgKHZvaWQgKikmU0NfY2xlYXJPYmplY3QgfSwKKyAgICB7ICJfWjEwcnNJc09iamVjdDdyc19mb250IiwgKHZvaWQgKikmU0NfaXNPYmplY3QgfSwKKworCisgICAgeyAiX1oyMXJzQWxsb2NhdGlvbk1hcmtEaXJ0eTEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX2FsbG9jYXRpb25NYXJrRGlydHkgfSwKKworCisgICAgLy8gRGVidWcKKyAgICB7ICJfWjdyc0RlYnVnUEtjZiIsICh2b2lkICopJlNDX2RlYnVnRiB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NmZiIsICh2b2lkICopJlNDX2RlYnVnRnYyIH0sCisgICAgeyAiX1o3cnNEZWJ1Z1BLY2ZmZiIsICh2b2lkICopJlNDX2RlYnVnRnYzIH0sCisgICAgeyAiX1o3cnNEZWJ1Z1BLY2ZmZmYiLCAodm9pZCAqKSZTQ19kZWJ1Z0Z2NCB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NQSzEycnNfbWF0cml4NHg0IiwgKHZvaWQgKikmU0NfZGVidWdGTTR2NCB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NQSzEycnNfbWF0cml4M3gzIiwgKHZvaWQgKikmU0NfZGVidWdGTTN2MyB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NQSzEycnNfbWF0cml4MngyIiwgKHZvaWQgKikmU0NfZGVidWdGTTJ2MiB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NpIiwgKHZvaWQgKikmU0NfZGVidWdJMzIgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjaiIsICh2b2lkICopJlNDX2RlYnVnVTMyIH0sCisgICAgeyAiX1o3cnNEZWJ1Z1BLY1BLdiIsICh2b2lkICopJlNDX2RlYnVnUCB9LAorCisgICAgLy8gUlMgTWF0aAorICAgIHsgIl9aNnJzUmFuZGkiLCAodm9pZCAqKSZTQ19yYW5kaSB9LAorICAgIHsgIl9aNnJzUmFuZGlpIiwgKHZvaWQgKikmU0NfcmFuZGkyIH0sCisgICAgeyAiX1o2cnNSYW5kZiIsICh2b2lkICopJlNDX3JhbmRmIH0sCisgICAgeyAiX1o2cnNSYW5kZmYiLCAodm9pZCAqKSZTQ19yYW5kZjIgfSwKKyAgICB7ICJfWjZyc0ZyYWNmIiwgKHZvaWQgKikmU0NfZnJhYyB9LAogCiAgICAgLy8gdGltZQotICAgIHsgInNlY29uZCIsICh2b2lkICopJlNDX3NlY29uZCwKLSAgICAgICAgImludCIsICIoKSIgfSwKLSAgICB7ICJtaW51dGUiLCAodm9pZCAqKSZTQ19taW51dGUsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sCi0gICAgeyAiaG91ciIsICh2b2lkICopJlNDX2hvdXIsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sCi0gICAgeyAiZGF5IiwgKHZvaWQgKikmU0NfZGF5LAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgIm1vbnRoIiwgKHZvaWQgKikmU0NfbW9udGgsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sCi0gICAgeyAieWVhciIsICh2b2lkICopJlNDX3llYXIsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sCi0gICAgeyAidXB0aW1lTWlsbGlzIiwgKHZvaWQqKSZTQ191cHRpbWVNaWxsaXMsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sICAgICAgLy8gVE9ETzogdXNlIGxvbmcgaW5zdGVhZAotICAgIHsgInN0YXJ0VGltZU1pbGxpcyIsICh2b2lkKikmU0Nfc3RhcnRUaW1lTWlsbGlzLAotICAgICAgICAiaW50IiwgIigpIiB9LCAgICAgIC8vIFRPRE86IHVzZSBsb25nIGluc3RlYWQKLSAgICB7ICJlbGFwc2VkVGltZU1pbGxpcyIsICh2b2lkKikmU0NfZWxhcHNlZFRpbWVNaWxsaXMsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sICAgICAgLy8gVE9ETzogdXNlIGxvbmcgaW5zdGVhZAorICAgIHsgIl9aOHJzU2Vjb25kdiIsICh2b2lkICopJlNDX3NlY29uZCB9LAorICAgIHsgIl9aOHJzTWludXRldiIsICh2b2lkICopJlNDX21pbnV0ZSB9LAorICAgIHsgIl9aNnJzSG91cnYiLCAodm9pZCAqKSZTQ19ob3VyIH0sCisgICAgeyAiX1o1cnNEYXl2IiwgKHZvaWQgKikmU0NfZGF5IH0sCisgICAgeyAiX1o3cnNNb250aHYiLCAodm9pZCAqKSZTQ19tb250aCB9LAorICAgIHsgIl9aNnJzWWVhcnYiLCAodm9pZCAqKSZTQ195ZWFyIH0sCisgICAgeyAiX1oxNHJzVXB0aW1lTWlsbGlzdiIsICh2b2lkKikmU0NfdXB0aW1lTWlsbGlzIH0sCisgICAgeyAiX1oxM3JzVXB0aW1lTmFub3N2IiwgKHZvaWQqKSZTQ191cHRpbWVOYW5vcyB9LAorICAgIHsgIl9aN3JzR2V0RHR2IiwgKHZvaWQqKSZTQ19nZXREdCB9LAogCi0gICAgLy8gbWF0cml4Ci0gICAgeyAibWF0cml4TG9hZElkZW50aXR5IiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZElkZW50aXR5LAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCkiIH0sCi0gICAgeyAibWF0cml4TG9hZEZsb2F0IiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZEZsb2F0LAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgKmYpIiB9LAotICAgIHsgIm1hdHJpeExvYWRNYXQiLCAodm9pZCAqKSZTQ19tYXRyaXhMb2FkTWF0LAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgKm5ld21hdCkiIH0sCi0gICAgeyAibWF0cml4TG9hZFJvdGF0ZSIsICh2b2lkICopJlNDX21hdHJpeExvYWRSb3RhdGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIiB9LAotICAgIHsgIm1hdHJpeExvYWRTY2FsZSIsICh2b2lkICopJlNDX21hdHJpeExvYWRTY2FsZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIiB9LAotICAgIHsgIm1hdHJpeExvYWRUcmFuc2xhdGUiLCAodm9pZCAqKSZTQ19tYXRyaXhMb2FkVHJhbnNsYXRlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikiIH0sCi0gICAgeyAibWF0cml4TG9hZE11bHRpcGx5IiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZE11bHRpcGx5LAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgKmxocywgZmxvYXQgKnJocykiIH0sCi0gICAgeyAibWF0cml4TXVsdGlwbHkiLCAodm9pZCAqKSZTQ19tYXRyaXhNdWx0aXBseSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0ICpyaHMpIiB9LAotICAgIHsgIm1hdHJpeFJvdGF0ZSIsICh2b2lkICopJlNDX21hdHJpeFJvdGF0ZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikiIH0sCi0gICAgeyAibWF0cml4U2NhbGUiLCAodm9pZCAqKSZTQ19tYXRyaXhTY2FsZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIiB9LAotICAgIHsgIm1hdHJpeFRyYW5zbGF0ZSIsICh2b2lkICopJlNDX21hdHJpeFRyYW5zbGF0ZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIiB9LAorICAgIHsgIl9aMTRyc1NlbmRUb0NsaWVudGkiLCAodm9pZCAqKSZTQ190b0NsaWVudCB9LAorICAgIHsgIl9aMTRyc1NlbmRUb0NsaWVudGlQS3ZqIiwgKHZvaWQgKikmU0NfdG9DbGllbnQyIH0sCisgICAgeyAiX1oyMnJzU2VuZFRvQ2xpZW50QmxvY2tpbmdpIiwgKHZvaWQgKikmU0NfdG9DbGllbnRCbG9ja2luZyB9LAorICAgIHsgIl9aMjJyc1NlbmRUb0NsaWVudEJsb2NraW5naVBLdmoiLCAodm9pZCAqKSZTQ190b0NsaWVudEJsb2NraW5nMiB9LAogCi0gICAgLy8gdmVjdG9yCi0gICAgeyAidmVjMlJhbmQiLCAodm9pZCAqKSZTQ192ZWMyUmFuZCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICp2ZWMsIGZsb2F0IG1heExlbikiIH0sCisgICAgeyAiX1o5cnNGb3JFYWNoOXJzX3NjcmlwdDEzcnNfYWxsb2NhdGlvblMwX1BLdiIsICh2b2lkICopJlNDX0ZvckVhY2ggfSwKKyAgICAvL3sgIl9aOXJzRm9yRWFjaDlyc19zY3JpcHQxM3JzX2FsbG9jYXRpb25TMF9QS3YiLCAodm9pZCAqKSZTQ19Gb3JFYWNoMiB9LAogCi0gICAgLy8gdmVjMwotICAgIHsgInZlYzNOb3JtIiwgKHZvaWQgKikmU0NfdmVjM05vcm0sCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqKSIgfSwKLSAgICB7ICJ2ZWMzTGVuZ3RoIiwgKHZvaWQgKikmU0NfdmVjM0xlbmd0aCwKLSAgICAgICAgImZsb2F0IiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqKSIgfSwKLSAgICB7ICJ2ZWMzQWRkIiwgKHZvaWQgKikmU0NfdmVjM0FkZCwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfM19zICpkZXN0LCBzdHJ1Y3QgdmVjRjMyXzNfcyAqbGhzLCBzdHJ1Y3QgdmVjRjMyXzNfcyAqcmhzKSIgfSwKLSAgICB7ICJ2ZWMzU3ViIiwgKHZvaWQgKikmU0NfdmVjM1N1YiwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfM19zICpkZXN0LCBzdHJ1Y3QgdmVjRjMyXzNfcyAqbGhzLCBzdHJ1Y3QgdmVjRjMyXzNfcyAqcmhzKSIgfSwKLSAgICB7ICJ2ZWMzQ3Jvc3MiLCAodm9pZCAqKSZTQ192ZWMzQ3Jvc3MsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqZGVzdCwgc3RydWN0IHZlY0YzMl8zX3MgKmxocywgc3RydWN0IHZlY0YzMl8zX3MgKnJocykiIH0sCi0gICAgeyAidmVjM0RvdCIsICh2b2lkICopJlNDX3ZlYzNEb3QsCi0gICAgICAgICJmbG9hdCIsICIoc3RydWN0IHZlY0YzMl8zX3MgKmxocywgc3RydWN0IHZlY0YzMl8zX3MgKnJocykiIH0sCi0gICAgeyAidmVjM1NjYWxlIiwgKHZvaWQgKikmU0NfdmVjM1NjYWxlLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl8zX3MgKmxocywgZmxvYXQgc2NhbGUpIiB9LAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotICAgIC8vIHZlYzQKLSAgICB7ICJ2ZWM0Tm9ybSIsICh2b2lkICopJlNDX3ZlYzROb3JtLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl80X3MgKikiIH0sCi0gICAgeyAidmVjNExlbmd0aCIsICh2b2lkICopJlNDX3ZlYzRMZW5ndGgsCi0gICAgICAgICJmbG9hdCIsICIoc3RydWN0IHZlY0YzMl80X3MgKikiIH0sCi0gICAgeyAidmVjNEFkZCIsICh2b2lkICopJlNDX3ZlYzRBZGQsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzRfcyAqZGVzdCwgc3RydWN0IHZlY0YzMl80X3MgKmxocywgc3RydWN0IHZlY0YzMl80X3MgKnJocykiIH0sCi0gICAgeyAidmVjNFN1YiIsICh2b2lkICopJlNDX3ZlYzRTdWIsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzRfcyAqZGVzdCwgc3RydWN0IHZlY0YzMl80X3MgKmxocywgc3RydWN0IHZlY0YzMl80X3MgKnJocykiIH0sCi0gICAgeyAidmVjNERvdCIsICh2b2lkICopJlNDX3ZlYzREb3QsCi0gICAgICAgICJmbG9hdCIsICIoc3RydWN0IHZlY0YzMl80X3MgKmxocywgc3RydWN0IHZlY0YzMl80X3MgKnJocykiIH0sCi0gICAgeyAidmVjNFNjYWxlIiwgKHZvaWQgKikmU0NfdmVjNFNjYWxlLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl80X3MgKmxocywgZmxvYXQgc2NhbGUpIiB9LAorICAgIC8veyAic2luZl9mYXN0IiwgKHZvaWQgKikmU0Nfc2luZl9mYXN0IH0sCisgICAgLy97ICJjb3NmX2Zhc3QiLCAodm9pZCAqKSZTQ19jb3NmX2Zhc3QgfSwKIAotICAgIC8vIGNvbnRleHQKLSAgICB7ICJiaW5kUHJvZ3JhbUZyYWdtZW50IiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1GcmFnbWVudCwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCi0gICAgeyAiYmluZFByb2dyYW1GcmFnbWVudFN0b3JlIiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1GcmFnbWVudFN0b3JlLAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLSAgICB7ICJiaW5kUHJvZ3JhbVN0b3JlIiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1GcmFnbWVudFN0b3JlLAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLSAgICB7ICJiaW5kUHJvZ3JhbVZlcnRleCIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtVmVydGV4LAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLSAgICB7ICJiaW5kU2FtcGxlciIsICh2b2lkICopJlNDX2JpbmRTYW1wbGVyLAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGludCkiIH0sCi0gICAgeyAiYmluZFRleHR1cmUiLCAodm9pZCAqKSZTQ19iaW5kVGV4dHVyZSwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBpbnQpIiB9LAotCi0gICAgLy8gdnAKLSAgICB7ICJ2cExvYWRNb2RlbE1hdHJpeCIsICh2b2lkICopJlNDX3ZwTG9hZE1vZGVsTWF0cml4LAotICAgICAgICAidm9pZCIsICIodm9pZCAqKSIgfSwKLSAgICB7ICJ2cExvYWRUZXh0dXJlTWF0cml4IiwgKHZvaWQgKikmU0NfdnBMb2FkVGV4dHVyZU1hdHJpeCwKLSAgICAgICAgInZvaWQiLCAiKHZvaWQgKikiIH0sCi0KLQotCi0gICAgLy8gZHJhd2luZwotICAgIHsgImRyYXdSZWN0IiwgKHZvaWQgKikmU0NfZHJhd1JlY3QsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgeikiIH0sCi0gICAgeyAiZHJhd1F1YWQiLCAodm9pZCAqKSZTQ19kcmF3UXVhZCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQpIiB9LAotICAgIHsgImRyYXdRdWFkVGV4Q29vcmRzIiwgKHZvaWQgKikmU0NfZHJhd1F1YWRUZXhDb29yZHMsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB1MSwgZmxvYXQgdjEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsIGZsb2F0IHUyLCBmbG9hdCB2MiwgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgdTMsIGZsb2F0IHYzLCBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LCBmbG9hdCB1NCwgZmxvYXQgdjQpIiB9LAotICAgIHsgImRyYXdTcHJpdGUiLCAodm9pZCAqKSZTQ19kcmF3U3ByaXRlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCkiIH0sCi0gICAgeyAiZHJhd1Nwcml0ZVNjcmVlbnNwYWNlIiwgKHZvaWQgKikmU0NfZHJhd1Nwcml0ZVNjcmVlbnNwYWNlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCkiIH0sCi0gICAgeyAiZHJhd1Nwcml0ZVNjcmVlbnNwYWNlQ3JvcHBlZCIsICh2b2lkICopJlNDX2RyYXdTcHJpdGVTY3JlZW5zcGFjZUNyb3BwZWQsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoLCBmbG9hdCBjeDAsIGZsb2F0IGN5MCwgZmxvYXQgY3gxLCBmbG9hdCBjeTEpIiB9LAotICAgIHsgImRyYXdMaW5lIiwgKHZvaWQgKikmU0NfZHJhd0xpbmUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyKSIgfSwKLSAgICB7ICJkcmF3UG9pbnQiLCAodm9pZCAqKSZTQ19kcmF3UG9pbnQsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxKSIgfSwKLSAgICB7ICJkcmF3U2ltcGxlTWVzaCIsICh2b2lkICopJlNDX2RyYXdTaW1wbGVNZXNoLAotICAgICAgICAidm9pZCIsICIoaW50IGlzbSkiIH0sCi0gICAgeyAiZHJhd1NpbXBsZU1lc2hSYW5nZSIsICh2b2lkICopJlNDX2RyYXdTaW1wbGVNZXNoUmFuZ2UsCi0gICAgICAgICJ2b2lkIiwgIihpbnQgaXNtLCBpbnQgc3RhcnQsIGludCBsZW4pIiB9LAotCi0KLSAgICAvLyBtaXNjCi0gICAgeyAicGZDbGVhckNvbG9yIiwgKHZvaWQgKikmU0NfQ2xlYXJDb2xvciwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJjb2xvciIsICh2b2lkICopJlNDX2NvbG9yLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImhzYiIsICh2b2lkICopJlNDX2hzYiwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJoc2JUb1JnYiIsICh2b2lkICopJlNDX2hzYlRvUmdiLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQqKSIgfSwKLSAgICB7ICJoc2JUb0FiZ3IiLCAodm9pZCAqKSZTQ19oc2JUb0FiZ3IsCi0gICAgICAgICJpbnQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJhbWJpZW50IiwgKHZvaWQgKikmU0NfYW1iaWVudCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJkaWZmdXNlIiwgKHZvaWQgKikmU0NfZGlmZnVzZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJzcGVjdWxhciIsICh2b2lkICopJlNDX3NwZWN1bGFyLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImVtaXNzaW9uIiwgKHZvaWQgKikmU0NfZW1pc3Npb24sCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAic2hpbmluZXNzIiwgKHZvaWQgKikmU0Nfc2hpbmluZXNzLAotICAgICAgICAidm9pZCIsICIoZmxvYXQpIiB9LAotICAgIHsgInBvaW50QXR0ZW51YXRpb24iLCAodm9pZCAqKSZTQ19wb2ludEF0dGVudWF0aW9uLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0KLSAgICB7ICJ1cGxvYWRUb1RleHR1cmUiLCAodm9pZCAqKSZTQ191cGxvYWRUb1RleHR1cmUsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCkiIH0sCi0gICAgeyAidXBsb2FkVG9CdWZmZXJPYmplY3QiLCAodm9pZCAqKSZTQ191cGxvYWRUb0J1ZmZlck9iamVjdCwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCi0KLSAgICB7ICJzeW5jVG9HTCIsICh2b2lkICopJlNDX3N5bmNUb0dMLAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLQotICAgIHsgImNvbG9yRmxvYXRSR0JBdG9VTm9ybTgiLCAodm9pZCAqKSZTQ19jb2xvckZsb2F0UkdCQXRvVU5vcm04LAotICAgICAgICAiaW50IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiY29sb3JGbG9hdFJHQnRvNTY1IiwgKHZvaWQgKikmU0NfY29sb3JGbG9hdFJHQkF0bzU2NSwKLSAgICAgICAgImludCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0KLQotICAgIHsgImdldFdpZHRoIiwgKHZvaWQgKikmU0NfZ2V0V2lkdGgsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sCi0gICAgeyAiZ2V0SGVpZ2h0IiwgKHZvaWQgKikmU0NfZ2V0SGVpZ2h0LAotICAgICAgICAiaW50IiwgIigpIiB9LAotCi0gICAgeyAic2VuZFRvQ2xpZW50IiwgKHZvaWQgKikmU0NfdG9DbGllbnQsCi0gICAgICAgICJpbnQiLCAiKHZvaWQgKmRhdGEsIGludCBjbWRJRCwgaW50IGxlbiwgaW50IHdhaXRGb3JTcGFjZSkiIH0sCi0KLQotICAgIHsgImRlYnVnRiIsICh2b2lkICopJlNDX2RlYnVnRiwKLSAgICAgICAgInZvaWQiLCAiKHZvaWQgKiwgZmxvYXQpIiB9LAotICAgIHsgImRlYnVnSTMyIiwgKHZvaWQgKikmU0NfZGVidWdJMzIsCi0gICAgICAgICJ2b2lkIiwgIih2b2lkICosIGludCkiIH0sCi0gICAgeyAiZGVidWdIZXhGIiwgKHZvaWQgKikmU0NfZGVidWdIZXhGLAotICAgICAgICAidm9pZCIsICIodm9pZCAqLCBmbG9hdCkiIH0sCi0gICAgeyAiZGVidWdIZXhJMzIiLCAodm9pZCAqKSZTQ19kZWJ1Z0hleEkzMiwKLSAgICAgICAgInZvaWQiLCAiKHZvaWQgKiwgaW50KSIgfSwKLQotICAgIHsgInNjcmlwdENhbGwiLCAodm9pZCAqKSZTQ19zY3JpcHRDYWxsLAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLQotCi0gICAgeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KKyAgICB7IE5VTEwsIE5VTEwgfQogfTsKIAogY29uc3QgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICogU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2woY29uc3QgY2hhciAqc3ltKQpAQCAtMTQwMCwxNyArNTQ4LDMgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBTY3JpcHRDU3RhdGU6OmFwcGVuZERlY2xzKFN0cmluZzggKnN0cikKLXsKLSAgICBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKnN5bXMgPSBnU3ltczsKLSAgICB3aGlsZSAoc3ltcy0+bVB0cikgewotICAgICAgICBzdHItPmFwcGVuZChzeW1zLT5tUmV0KTsKLSAgICAgICAgc3RyLT5hcHBlbmQoIiAiKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoc3ltcy0+bU5hbWUpOwotICAgICAgICBzdHItPmFwcGVuZChzeW1zLT5tUGFyYW0pOwotICAgICAgICBzdHItPmFwcGVuZCgiO1xuIik7Ci0gICAgICAgIHN5bXMrKzsKLSAgICB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdENfTGliQ0wuY3BwIGIvbGlicy9ycy9yc1NjcmlwdENfTGliQ0wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOGU3YjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzU2NyaXB0Q19MaWJDTC5jcHAKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjaW5jbHVkZSAicnNTY3JpcHRDLmgiCisKKy8vIEltcGxlbWVudHMgcnNfY2wucnNoCisKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OworCisKK3N0YXRpYyBmbG9hdCBTQ19hY29zcGkoZmxvYXQgdikgeworICAgIHJldHVybiBhY29zZih2KS8gTV9QSTsKK30KKworc3RhdGljIGZsb2F0IFNDX2FzaW5waShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGFzaW5mKHYpIC8gTV9QSTsKK30KKworc3RhdGljIGZsb2F0IFNDX2F0YW5waShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGF0YW5mKHYpIC8gTV9QSTsKK30KKworc3RhdGljIGZsb2F0IFNDX2F0YW4ycGkoZmxvYXQgeSwgZmxvYXQgeCkgeworICAgIHJldHVybiBhdGFuMmYoeSwgeCkgLyBNX1BJOworfQorCitzdGF0aWMgZmxvYXQgU0NfY29zcGkoZmxvYXQgdikgeworICAgIHJldHVybiBjb3NmKHYgKiBNX1BJKTsKK30KKworc3RhdGljIGZsb2F0IFNDX2V4cDEwKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gcG93KDEwLmYsIHYpOworCit9CisKK3N0YXRpYyBmbG9hdCBTQ19mcmFjdChmbG9hdCB2LCBpbnQgKmlwdHIpIHsKKyAgICBpbnQgaSA9IChpbnQpZmxvb3Iodik7CisgICAgaXB0clswXSA9IGk7CisgICAgcmV0dXJuIGZtaW4odiAtIGksIDB4MS5mZmZmZmVwLTFmKTsKK30KKworc3RhdGljIGZsb2F0IFNDX2xvZzIoZmxvYXQgdikgeworICAgIHJldHVybiBsb2cxMCh2KSAvIGxvZzEwKDIuZik7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19wb3duKGZsb2F0IHYsIGludCBwKSB7CisgICAgcmV0dXJuIHBvd2YodiwgKGZsb2F0KXApOworfQorCitzdGF0aWMgZmxvYXQgU0NfcG93cihmbG9hdCB2LCBmbG9hdCBwKSB7CisgICAgcmV0dXJuIHBvd2YodiwgcCk7Cit9CisKK2Zsb2F0IFNDX3Jvb3RuKGZsb2F0IHYsIGludCByKSB7CisgICAgcmV0dXJuIHBvdyh2LCAxLmYgLyByKTsKK30KKworZmxvYXQgU0NfcnNxcnQoZmxvYXQgdikgeworICAgIHJldHVybiAxLmYgLyBzcXJ0Zih2KTsKK30KKworZmxvYXQgU0Nfc2luY29zKGZsb2F0IHYsIGZsb2F0ICpjb3NwdHIpIHsKKyAgICAqY29zcHRyID0gY29zZih2KTsKKyAgICByZXR1cm4gc2luZih2KTsKK30KKworc3RhdGljIGZsb2F0IFNDX3NpbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gc2luZih2ICogTV9QSSk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ190YW5waShmbG9hdCB2KSB7CisgICAgcmV0dXJuIHRhbmYodiAqIE1fUEkpOworfQorCisgICAgLy97ICJsb2diIiwgKHZvaWQgKikmIH0sCisgICAgLy97ICJtYWQiLCAodm9pZCAqKSYgfSwKKyAgICAvL3sgIm5hbiIsICh2b2lkICopJiB9LAorICAgIC8veyAidGdhbW1hIiwgKHZvaWQgKikmIH0sCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSW50ZWdlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworc3RhdGljIHVpbnQzMl90IFNDX2Fic19pMzIoaW50MzJfdCB2KSB7cmV0dXJuIGFicyh2KTt9CitzdGF0aWMgdWludDE2X3QgU0NfYWJzX2kxNihpbnQxNl90IHYpIHtyZXR1cm4gKHVpbnQxNl90KWFicyh2KTt9CitzdGF0aWMgdWludDhfdCBTQ19hYnNfaTgoaW50OF90IHYpIHtyZXR1cm4gKHVpbnQ4X3QpYWJzKHYpO30KKworc3RhdGljIHVpbnQzMl90IFNDX2Nsel91MzIodWludDMyX3Qgdikge3JldHVybiBfX2J1aWx0aW5fY2x6KHYpO30KK3N0YXRpYyB1aW50MTZfdCBTQ19jbHpfdTE2KHVpbnQxNl90IHYpIHtyZXR1cm4gKHVpbnQxNl90KV9fYnVpbHRpbl9jbHoodik7fQorc3RhdGljIHVpbnQ4X3QgU0NfY2x6X3U4KHVpbnQ4X3Qgdikge3JldHVybiAodWludDhfdClfX2J1aWx0aW5fY2x6KHYpO30KK3N0YXRpYyBpbnQzMl90IFNDX2Nsel9pMzIoaW50MzJfdCB2KSB7cmV0dXJuIChpbnQzMl90KV9fYnVpbHRpbl9jbHooKHVpbnQzMl90KXYpO30KK3N0YXRpYyBpbnQxNl90IFNDX2Nsel9pMTYoaW50MTZfdCB2KSB7cmV0dXJuIChpbnQxNl90KV9fYnVpbHRpbl9jbHoodik7fQorc3RhdGljIGludDhfdCBTQ19jbHpfaTgoaW50OF90IHYpIHtyZXR1cm4gKGludDhfdClfX2J1aWx0aW5fY2x6KHYpO30KKworc3RhdGljIHVpbnQzMl90IFNDX21heF91MzIodWludDMyX3QgdiwgdWludDMyX3QgdjIpIHtyZXR1cm4gcnNNYXgodiwgdjIpO30KK3N0YXRpYyB1aW50MTZfdCBTQ19tYXhfdTE2KHVpbnQxNl90IHYsIHVpbnQxNl90IHYyKSB7cmV0dXJuIHJzTWF4KHYsIHYyKTt9CitzdGF0aWMgdWludDhfdCBTQ19tYXhfdTgodWludDhfdCB2LCB1aW50OF90IHYyKSB7cmV0dXJuIHJzTWF4KHYsIHYyKTt9CitzdGF0aWMgaW50MzJfdCBTQ19tYXhfaTMyKGludDMyX3QgdiwgaW50MzJfdCB2Mikge3JldHVybiByc01heCh2LCB2Mik7fQorc3RhdGljIGludDE2X3QgU0NfbWF4X2kxNihpbnQxNl90IHYsIGludDE2X3QgdjIpIHtyZXR1cm4gcnNNYXgodiwgdjIpO30KK3N0YXRpYyBpbnQ4X3QgU0NfbWF4X2k4KGludDhfdCB2LCBpbnQ4X3QgdjIpIHtyZXR1cm4gcnNNYXgodiwgdjIpO30KKworc3RhdGljIHVpbnQzMl90IFNDX21pbl91MzIodWludDMyX3QgdiwgdWludDMyX3QgdjIpIHtyZXR1cm4gcnNNaW4odiwgdjIpO30KK3N0YXRpYyB1aW50MTZfdCBTQ19taW5fdTE2KHVpbnQxNl90IHYsIHVpbnQxNl90IHYyKSB7cmV0dXJuIHJzTWluKHYsIHYyKTt9CitzdGF0aWMgdWludDhfdCBTQ19taW5fdTgodWludDhfdCB2LCB1aW50OF90IHYyKSB7cmV0dXJuIHJzTWluKHYsIHYyKTt9CitzdGF0aWMgaW50MzJfdCBTQ19taW5faTMyKGludDMyX3QgdiwgaW50MzJfdCB2Mikge3JldHVybiByc01pbih2LCB2Mik7fQorc3RhdGljIGludDE2X3QgU0NfbWluX2kxNihpbnQxNl90IHYsIGludDE2X3QgdjIpIHtyZXR1cm4gcnNNaW4odiwgdjIpO30KK3N0YXRpYyBpbnQ4X3QgU0NfbWluX2k4KGludDhfdCB2LCBpbnQ4X3QgdjIpIHtyZXR1cm4gcnNNaW4odiwgdjIpO30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGbG9hdCB1dGlsCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGZsb2F0IFNDX2NsYW1wX2YzMihmbG9hdCBhbW91bnQsIGZsb2F0IGxvdywgZmxvYXQgaGlnaCkKK3sKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KKworc3RhdGljIGZsb2F0IFNDX2RlZ3JlZXMoZmxvYXQgcmFkaWFucykKK3sKKyAgICByZXR1cm4gcmFkaWFucyAqICgxODAuZiAvIE1fUEkpOworfQorCitzdGF0aWMgZmxvYXQgU0NfbWF4X2YzMihmbG9hdCB2LCBmbG9hdCB2MikKK3sKKyAgICByZXR1cm4gcnNNYXgodiwgdjIpOworfQorCitzdGF0aWMgZmxvYXQgU0NfbWluX2YzMihmbG9hdCB2LCBmbG9hdCB2MikKK3sKKyAgICByZXR1cm4gcnNNaW4odiwgdjIpOworfQorCitzdGF0aWMgZmxvYXQgU0NfbWl4X2YzMihmbG9hdCBzdGFydCwgZmxvYXQgc3RvcCwgZmxvYXQgYW1vdW50KQoreworICAgIC8vTE9HRSgibGVycGYgJWYgICVmICAlZiIsIHN0YXJ0LCBzdG9wLCBhbW91bnQpOworICAgIHJldHVybiBzdGFydCArIChzdG9wIC0gc3RhcnQpICogYW1vdW50OworfQorCitzdGF0aWMgZmxvYXQgU0NfcmFkaWFucyhmbG9hdCBkZWdyZWVzKQoreworICAgIHJldHVybiBkZWdyZWVzICogKE1fUEkgLyAxODAuZik7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19zdGVwX2YzMihmbG9hdCBlZGdlLCBmbG9hdCB2KQoreworICAgIGlmICh2IDwgZWRnZSkgcmV0dXJuIDAuZjsKKyAgICByZXR1cm4gMS5mOworfQorCitzdGF0aWMgZmxvYXQgU0Nfc2lnbl9mMzIoZmxvYXQgdmFsdWUpCit7CisgICAgaWYgKHZhbHVlID4gMCkgcmV0dXJuIDEuZjsKKyAgICBpZiAodmFsdWUgPCAwKSByZXR1cm4gLTEuZjsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKKworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDbGFzcyBpbXBsZW1lbnRhdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIGxsdm0gbmFtZSBtYW5nbGluZyByZWYKKy8vICA8YnVpbHRpbi10eXBlPiA6Oj0gdiAgIyB2b2lkCisvLyAgICAgICAgICAgICAgICAgOjo9IGIgICMgYm9vbAorLy8gICAgICAgICAgICAgICAgIDo6PSBjICAjIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gYSAgIyBzaWduZWQgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBoICAjIHVuc2lnbmVkIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gcyAgIyBzaG9ydAorLy8gICAgICAgICAgICAgICAgIDo6PSB0ICAjIHVuc2lnbmVkIHNob3J0CisvLyAgICAgICAgICAgICAgICAgOjo9IGkgICMgaW50CisvLyAgICAgICAgICAgICAgICAgOjo9IGogICMgdW5zaWduZWQgaW50CisvLyAgICAgICAgICAgICAgICAgOjo9IGwgICMgbG9uZworLy8gICAgICAgICAgICAgICAgIDo6PSBtICAjIHVuc2lnbmVkIGxvbmcKKy8vICAgICAgICAgICAgICAgICA6Oj0geCAgIyBsb25nIGxvbmcsIF9faW50NjQKKy8vICAgICAgICAgICAgICAgICA6Oj0geSAgIyB1bnNpZ25lZCBsb25nIGxvbmcsIF9faW50NjQKKy8vICAgICAgICAgICAgICAgICA6Oj0gZiAgIyBmbG9hdAorLy8gICAgICAgICAgICAgICAgIDo6PSBkICAjIGRvdWJsZQorCitzdGF0aWMgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90IGdTeW1zW10gPSB7CisgICAgLy8gT3BlbkNMIG1hdGgKKyAgICB7ICJfWjRhY29zZiIsICh2b2lkICopJmFjb3NmIH0sCisgICAgeyAiX1o1YWNvc2hmIiwgKHZvaWQgKikmYWNvc2hmIH0sCisgICAgeyAiX1o2YWNvc3BpZiIsICh2b2lkICopJlNDX2Fjb3NwaSB9LAorICAgIHsgIl9aNGFzaW5mIiwgKHZvaWQgKikmYXNpbmYgfSwKKyAgICB7ICJfWjVhc2luaGYiLCAodm9pZCAqKSZhc2luaGYgfSwKKyAgICB7ICJfWjZhc2lucGlmIiwgKHZvaWQgKikmU0NfYXNpbnBpIH0sCisgICAgeyAiX1o0YXRhbmYiLCAodm9pZCAqKSZhdGFuZiB9LAorICAgIHsgIl9aNWF0YW4yZiIsICh2b2lkICopJmF0YW4yZiB9LAorICAgIHsgIl9aNmF0YW5waWYiLCAodm9pZCAqKSZTQ19hdGFucGkgfSwKKyAgICB7ICJfWjdhdGFuMnBpZiIsICh2b2lkICopJlNDX2F0YW4ycGkgfSwKKyAgICB7ICJfWjRjYnJ0ZiIsICh2b2lkICopJmNicnRmIH0sCisgICAgeyAiX1o0Y2VpbGYiLCAodm9pZCAqKSZjZWlsZiB9LAorICAgIHsgIl9aOGNvcHlzaWduZmYiLCAodm9pZCAqKSZjb3B5c2lnbmYgfSwKKyAgICB7ICJfWjNjb3NmIiwgKHZvaWQgKikmY29zZiB9LAorICAgIHsgIl9aNGNvc2hmIiwgKHZvaWQgKikmY29zaGYgfSwKKyAgICB7ICJfWjVjb3NwaWYiLCAodm9pZCAqKSZTQ19jb3NwaSB9LAorICAgIHsgIl9aNGVyZmNmIiwgKHZvaWQgKikmZXJmY2YgfSwKKyAgICB7ICJfWjNlcmZmIiwgKHZvaWQgKikmZXJmZiB9LAorICAgIHsgIl9aM2V4cGYiLCAodm9pZCAqKSZleHBmIH0sCisgICAgeyAiX1o0ZXhwMmYiLCAodm9pZCAqKSZleHAyZiB9LAorICAgIHsgIl9aNWV4cDEwZiIsICh2b2lkICopJlNDX2V4cDEwIH0sCisgICAgeyAiX1o1ZXhwbTFmIiwgKHZvaWQgKikmZXhwbTFmIH0sCisgICAgeyAiX1o0ZmFic2YiLCAodm9pZCAqKSZmYWJzZiB9LAorICAgIHsgIl9aNGZkaW1mZiIsICh2b2lkICopJmZkaW1mIH0sCisgICAgeyAiX1o1Zmxvb3JmIiwgKHZvaWQgKikmZmxvb3JmIH0sCisgICAgeyAiX1ozZm1hZmZmIiwgKHZvaWQgKikmZm1hZiB9LAorICAgIHsgIl9aNGZtYXhmZiIsICh2b2lkICopJmZtYXhmIH0sCisgICAgeyAiX1o0Zm1pbmZmIiwgKHZvaWQgKikmZm1pbmYgfSwgIC8vIGZsb2F0IGZtaW4oZmxvYXQsIGZsb2F0KQorICAgIHsgIl9aNGZtb2RmZiIsICh2b2lkICopJmZtb2RmIH0sCisgICAgeyAiX1o1ZnJhY3RmUGYiLCAodm9pZCAqKSZTQ19mcmFjdCB9LAorICAgIHsgIl9aNWZyZXhwZlBpIiwgKHZvaWQgKikmZnJleHBmIH0sCisgICAgeyAiX1o1aHlwb3RmZiIsICh2b2lkICopJmh5cG90ZiB9LAorICAgIHsgIl9aNWlsb2diZiIsICh2b2lkICopJmlsb2diZiB9LAorICAgIHsgIl9aNWxkZXhwZmkiLCAodm9pZCAqKSZsZGV4cGYgfSwKKyAgICB7ICJfWjZsZ2FtbWFmIiwgKHZvaWQgKikmbGdhbW1hZiB9LAorICAgIHsgIl9aM2xvZ2YiLCAodm9pZCAqKSZsb2dmIH0sCisgICAgeyAiX1o0bG9nMmYiLCAodm9pZCAqKSZTQ19sb2cyIH0sCisgICAgeyAiX1o1bG9nMTBmIiwgKHZvaWQgKikmbG9nMTBmIH0sCisgICAgeyAiX1o1bG9nMXBmIiwgKHZvaWQgKikmbG9nMXBmIH0sCisgICAgLy97ICJsb2diIiwgKHZvaWQgKikmIH0sCisgICAgLy97ICJtYWQiLCAodm9pZCAqKSYgfSwKKyAgICB7ICJtb2RmIiwgKHZvaWQgKikmbW9kZmYgfSwKKyAgICAvL3sgIm5hbiIsICh2b2lkICopJiB9LAorICAgIHsgIl9aOW5leHRhZnRlcmZmIiwgKHZvaWQgKikmbmV4dGFmdGVyZiB9LAorICAgIHsgIl9aM3Bvd2ZmIiwgKHZvaWQgKikmcG93ZiB9LAorICAgIHsgIl9aNHBvd25maSIsICh2b2lkICopJlNDX3Bvd24gfSwKKyAgICB7ICJfWjRwb3dyZmYiLCAodm9pZCAqKSZTQ19wb3dyIH0sCisgICAgeyAiX1o5cmVtYWluZGVyZmYiLCAodm9pZCAqKSZyZW1haW5kZXJmIH0sCisgICAgeyAicmVtcXVvIiwgKHZvaWQgKikmcmVtcXVvZiB9LAorICAgIHsgIl9aNHJpbnRmIiwgKHZvaWQgKikmcmludGYgfSwKKyAgICB7ICJfWjVyb290bmZpIiwgKHZvaWQgKikmU0Nfcm9vdG4gfSwKKyAgICB7ICJfWjVyb3VuZGYiLCAodm9pZCAqKSZyb3VuZGYgfSwKKyAgICB7ICJfWjVyc3FydGYiLCAodm9pZCAqKSZTQ19yc3FydCB9LAorICAgIHsgIl9aM3NpbmYiLCAodm9pZCAqKSZzaW5mIH0sCisgICAgeyAic2luY29zIiwgKHZvaWQgKikmU0Nfc2luY29zIH0sCisgICAgeyAiX1o0c2luaGYiLCAodm9pZCAqKSZzaW5oZiB9LAorICAgIHsgIl9aNXNpbnBpZiIsICh2b2lkICopJlNDX3NpbnBpIH0sCisgICAgeyAiX1o0c3FydGYiLCAodm9pZCAqKSZzcXJ0ZiB9LAorICAgIHsgIl9aM3RhbmYiLCAodm9pZCAqKSZ0YW5mIH0sCisgICAgeyAiX1o0dGFuaGYiLCAodm9pZCAqKSZ0YW5oZiB9LAorICAgIHsgIl9aNXRhbnBpZiIsICh2b2lkICopJlNDX3RhbnBpIH0sCisgICAgLy97ICJ0Z2FtbWEiLCAodm9pZCAqKSYgfSwKKyAgICB7ICJfWjV0cnVuY2YiLCAodm9pZCAqKSZ0cnVuY2YgfSwKKworICAgIC8vIE9wZW5DTCBJbnQKKyAgICB7ICJfWjNhYnNpIiwgKHZvaWQgKikmU0NfYWJzX2kzMiB9LAorICAgIHsgIl9aM2Fic3MiLCAodm9pZCAqKSZTQ19hYnNfaTE2IH0sCisgICAgeyAiX1ozYWJzYyIsICh2b2lkICopJlNDX2Fic19pOCB9LAorICAgIHsgIl9aM2NsemoiLCAodm9pZCAqKSZTQ19jbHpfdTMyIH0sCisgICAgeyAiX1ozY2x6dCIsICh2b2lkICopJlNDX2Nsel91MTYgfSwKKyAgICB7ICJfWjNjbHpoIiwgKHZvaWQgKikmU0NfY2x6X3U4IH0sCisgICAgeyAiX1ozY2x6aSIsICh2b2lkICopJlNDX2Nsel9pMzIgfSwKKyAgICB7ICJfWjNjbHpzIiwgKHZvaWQgKikmU0NfY2x6X2kxNiB9LAorICAgIHsgIl9aM2NsemMiLCAodm9pZCAqKSZTQ19jbHpfaTggfSwKKyAgICB7ICJfWjNtYXhqaiIsICh2b2lkICopJlNDX21heF91MzIgfSwKKyAgICB7ICJfWjNtYXh0dCIsICh2b2lkICopJlNDX21heF91MTYgfSwKKyAgICB7ICJfWjNtYXhoaCIsICh2b2lkICopJlNDX21heF91OCB9LAorICAgIHsgIl9aM21heGlpIiwgKHZvaWQgKikmU0NfbWF4X2kzMiB9LAorICAgIHsgIl9aM21heHNzIiwgKHZvaWQgKikmU0NfbWF4X2kxNiB9LAorICAgIHsgIl9aM21heGNjIiwgKHZvaWQgKikmU0NfbWF4X2k4IH0sCisgICAgeyAiX1ozbWluamoiLCAodm9pZCAqKSZTQ19taW5fdTMyIH0sCisgICAgeyAiX1ozbWludHQiLCAodm9pZCAqKSZTQ19taW5fdTE2IH0sCisgICAgeyAiX1ozbWluaGgiLCAodm9pZCAqKSZTQ19taW5fdTggfSwKKyAgICB7ICJfWjNtaW5paSIsICh2b2lkICopJlNDX21pbl9pMzIgfSwKKyAgICB7ICJfWjNtaW5zcyIsICh2b2lkICopJlNDX21pbl9pMTYgfSwKKyAgICB7ICJfWjNtaW5jYyIsICh2b2lkICopJlNDX21pbl9pOCB9LAorCisgICAgLy8gT3BlbkNMIDYuMTEuNAorICAgIHsgIl9aNWNsYW1wZmZmIiwgKHZvaWQgKikmU0NfY2xhbXBfZjMyIH0sCisgICAgeyAiX1o3ZGVncmVlc2YiLCAodm9pZCAqKSZTQ19kZWdyZWVzIH0sCisgICAgeyAiX1ozbWF4ZmYiLCAodm9pZCAqKSZTQ19tYXhfZjMyIH0sCisgICAgeyAiX1ozbWluZmYiLCAodm9pZCAqKSZTQ19taW5fZjMyIH0sCisgICAgeyAiX1ozbWl4ZmZmIiwgKHZvaWQgKikmU0NfbWl4X2YzMiB9LAorICAgIHsgIl9aN3JhZGlhbnNmIiwgKHZvaWQgKikmU0NfcmFkaWFucyB9LAorICAgIHsgIl9aNHN0ZXBmZiIsICh2b2lkICopJlNDX3N0ZXBfZjMyIH0sCisgICAgLy97ICJzbW9vdGhzdGVwIiwgKHZvaWQgKikmIH0sCisgICAgeyAiX1o0c2lnbmYiLCAodm9pZCAqKSZTQ19zaWduX2YzMiB9LAorCisgICAgeyBOVUxMLCBOVUxMIH0KK307CisKK2NvbnN0IFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqIFNjcmlwdENTdGF0ZTo6bG9va3VwU3ltYm9sQ0woY29uc3QgY2hhciAqc3ltKQoreworICAgIFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqc3ltcyA9IGdTeW1zOworCisgICAgd2hpbGUgKHN5bXMtPm1QdHIpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoc3ltcy0+bU5hbWUsIHN5bSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzeW1zOworICAgICAgICB9CisgICAgICAgIHN5bXMrKzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTY3JpcHRDX0xpYkdMLmNwcCBiL2xpYnMvcnMvcnNTY3JpcHRDX0xpYkdMLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTkxY2FiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc1NjcmlwdENfTGliR0wuY3BwCkBAIC0wLDAgKzEsNTA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2luY2x1ZGUgInJzU2NyaXB0Qy5oIgorI2luY2x1ZGUgInJzTWF0cml4LmgiCisKKyNpbmNsdWRlICJ1dGlscy9UaW1lcnMuaCIKKworI2RlZmluZSBHTF9HTEVYVF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCisjaW5jbHVkZSA8dGltZS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKKyNkZWZpbmUgR0VUX1RMUygpICBDb250ZXh0OjpTY3JpcHRUTFNTdHJ1Y3QgKiB0bHMgPSBcCisgICAgKENvbnRleHQ6OlNjcmlwdFRMU1N0cnVjdCAqKXB0aHJlYWRfZ2V0c3BlY2lmaWMoQ29udGV4dDo6Z1RocmVhZFRMU0tleSk7IFwKKyAgICBDb250ZXh0ICogcnNjID0gdGxzLT5tQ29udGV4dDsgXAorICAgIFNjcmlwdEMgKiBzYyA9IChTY3JpcHRDICopIHRscy0+bVNjcmlwdAorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29udGV4dAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIFNDX2JpbmRUZXh0dXJlKFJzUHJvZ3JhbUZyYWdtZW50IHZwZiwgdWludDMyX3Qgc2xvdCwgUnNBbGxvY2F0aW9uIHZhKQoreworICAgIENIRUNLX09CSl9PUl9OVUxMKHZhKTsKKyAgICBDSEVDS19PQkoodnBmKTsKKyAgICBHRVRfVExTKCk7CisgICAgcnNpX1Byb2dyYW1CaW5kVGV4dHVyZShyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxQcm9ncmFtRnJhZ21lbnQgKj4odnBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKSk7CisKK30KKworc3RhdGljIHZvaWQgU0NfYmluZFNhbXBsZXIoUnNQcm9ncmFtRnJhZ21lbnQgdnBmLCB1aW50MzJfdCBzbG90LCBSc1NhbXBsZXIgdnMpCit7CisgICAgQ0hFQ0tfT0JKX09SX05VTEwodnMpOworICAgIENIRUNLX09CSih2cGYpOworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfUHJvZ3JhbUJpbmRTYW1wbGVyKHJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFByb2dyYW1GcmFnbWVudCAqPih2cGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFNhbXBsZXIgKj4odnMpKTsKKworfQorCitzdGF0aWMgdm9pZCBTQ19iaW5kUHJvZ3JhbVN0b3JlKFJzUHJvZ3JhbVN0b3JlIHBmcykKK3sKKyAgICBDSEVDS19PQkpfT1JfTlVMTChwZnMpOworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUocnNjLCBwZnMpOworfQorCitzdGF0aWMgdm9pZCBTQ19iaW5kUHJvZ3JhbUZyYWdtZW50KFJzUHJvZ3JhbUZyYWdtZW50IHBmKQoreworICAgIENIRUNLX09CSl9PUl9OVUxMKHBmKTsKKyAgICBHRVRfVExTKCk7CisgICAgcnNpX0NvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KHJzYywgcGYpOworfQorCitzdGF0aWMgdm9pZCBTQ19iaW5kUHJvZ3JhbVZlcnRleChSc1Byb2dyYW1WZXJ0ZXggcHYpCit7CisgICAgQ0hFQ0tfT0JKX09SX05VTEwocHYpOworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4KHJzYywgcHYpOworfQorCitzdGF0aWMgdm9pZCBTQ19iaW5kUHJvZ3JhbVJhc3RlcihSc1Byb2dyYW1SYXN0ZXIgcHYpCit7CisgICAgQ0hFQ0tfT0JKX09SX05VTEwocHYpOworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKHJzYywgcHYpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFZQCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgU0NfdnBMb2FkUHJvamVjdGlvbk1hdHJpeChjb25zdCByc2NfTWF0cml4ICptKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2MtPmdldFZlcnRleCgpLT5zZXRQcm9qZWN0aW9uTWF0cml4KHJzYywgbSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX3ZwTG9hZE1vZGVsTWF0cml4KGNvbnN0IHJzY19NYXRyaXggKm0pCit7CisgICAgR0VUX1RMUygpOworICAgIHJzYy0+Z2V0VmVydGV4KCktPnNldE1vZGVsdmlld01hdHJpeChyc2MsIG0pOworfQorCitzdGF0aWMgdm9pZCBTQ192cExvYWRUZXh0dXJlTWF0cml4KGNvbnN0IHJzY19NYXRyaXggKm0pCit7CisgICAgR0VUX1RMUygpOworICAgIHJzYy0+Z2V0VmVydGV4KCktPnNldFRleHR1cmVNYXRyaXgocnNjLCBtKTsKK30KKworCitzdGF0aWMgdm9pZCBTQ19wZkNvbnN0YW50Q29sb3IoUnNQcm9ncmFtRnJhZ21lbnQgdnBmLCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBDSEVDS19PQkoodnBmKTsKKyAgICBQcm9ncmFtRnJhZ21lbnQgKnBmID0gc3RhdGljX2Nhc3Q8UHJvZ3JhbUZyYWdtZW50ICo+KHZwZik7CisgICAgcGYtPnNldENvbnN0YW50Q29sb3IocnNjLCByLCBnLCBiLCBhKTsKK30KKworc3RhdGljIHZvaWQgU0NfdnBHZXRQcm9qZWN0aW9uTWF0cml4KHJzY19NYXRyaXggKm0pCit7CisgICAgR0VUX1RMUygpOworICAgIHJzYy0+Z2V0VmVydGV4KCktPmdldFByb2plY3Rpb25NYXRyaXgocnNjLCBtKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERyYXdpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBTQ19kcmF3UXVhZFRleENvb3JkcyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTEsIGZsb2F0IHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUyLCBmbG9hdCB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MywgZmxvYXQgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTQsIGZsb2F0IHY0KQoreworICAgIEdFVF9UTFMoKTsKKyAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvL0xPR0UoIlF1YWQiKTsKKyAgICAvL0xPR0UoIiU0LjJmLCAlNC4yZiwgJTQuMmYiLCB4MSwgeTEsIHoxKTsKKyAgICAvL0xPR0UoIiU0LjJmLCAlNC4yZiwgJTQuMmYiLCB4MiwgeTIsIHoyKTsKKyAgICAvL0xPR0UoIiU0LjJmLCAlNC4yZiwgJTQuMmYiLCB4MywgeTMsIHozKTsKKyAgICAvL0xPR0UoIiU0LjJmLCAlNC4yZiwgJTQuMmYiLCB4NCwgeTQsIHo0KTsKKworICAgIGZsb2F0IHZ0eFtdID0ge3gxLHkxLHoxLCB4Mix5Mix6MiwgeDMseTMsejMsIHg0LHk0LHo0fTsKKyAgICBjb25zdCBmbG9hdCB0ZXhbXSA9IHt1MSx2MSwgdTIsdjIsIHUzLHYzLCB1NCx2NH07CisKKyAgICBWZXJ0ZXhBcnJheSB2YTsKKyAgICB2YS5hZGQoR0xfRkxPQVQsIDMsIDEyLCBmYWxzZSwgKHVpbnQzMl90KXZ0eCwgIkFUVFJJQl9wb3NpdGlvbiIpOworICAgIHZhLmFkZChHTF9GTE9BVCwgMiwgOCwgZmFsc2UsICh1aW50MzJfdCl0ZXgsICJBVFRSSUJfdGV4dHVyZTAiKTsKKyAgICB2YS5zZXR1cEdMMihyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5LCAmcnNjLT5tU2hhZGVyQ2FjaGUpOworCisgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2RyYXdRdWFkKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQpCit7CisgICAgU0NfZHJhd1F1YWRUZXhDb29yZHMoeDEsIHkxLCB6MSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB4MiwgeTIsIHoyLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHgzLCB5MywgejMsIDEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgeDQsIHk0LCB6NCwgMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2RyYXdTcHJpdGVTY3JlZW5zcGFjZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFByb2dyYW1WZXJ0ZXg+IHRtcChyc2MtPmdldFZlcnRleCgpKTsKKyAgICByc2MtPnNldFZlcnRleChyc2MtPmdldERlZmF1bHRQcm9ncmFtVmVydGV4KCkpOworICAgIC8vcnNjLT5zZXR1cENoZWNrKCk7CisKKyAgICAvL0dMaW50IGNyb3BbNF0gPSB7MCwgaCwgdywgLWh9OworCisgICAgZmxvYXQgc2ggPSByc2MtPmdldEhlaWdodCgpOworCisgICAgU0NfZHJhd1F1YWQoeCwgICBzaCAtIHksICAgICB6LAorICAgICAgICAgICAgICAgIHgrdywgc2ggLSB5LCAgICAgeiwKKyAgICAgICAgICAgICAgICB4K3csIHNoIC0gKHkraCksIHosCisgICAgICAgICAgICAgICAgeCwgICBzaCAtICh5K2gpLCB6KTsKKyAgICByc2MtPnNldFZlcnRleCgoUHJvZ3JhbVZlcnRleCAqKXRtcC5nZXQoKSk7Cit9CisvKgorc3RhdGljIHZvaWQgU0NfZHJhd1Nwcml0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBmbG9hdCB2aW5bM10gPSB7eCwgeSwgen07CisgICAgZmxvYXQgdm91dFs0XTsKKworICAgIC8vTE9HRSgiZHMgIGluICVmICVmICVmIiwgeCwgeSwgeik7CisgICAgcnNjLT5nZXRWZXJ0ZXgoKS0+dHJhbnNmb3JtVG9TY3JlZW4ocnNjLCB2b3V0LCB2aW4pOworICAgIC8vTE9HRSgiZHMgIG91dCAlZiAlZiAlZiAlZiIsIHZvdXRbMF0sIHZvdXRbMV0sIHZvdXRbMl0sIHZvdXRbM10pOworICAgIHZvdXRbMF0gLz0gdm91dFszXTsKKyAgICB2b3V0WzFdIC89IHZvdXRbM107CisgICAgdm91dFsyXSAvPSB2b3V0WzNdOworCisgICAgdm91dFswXSAqPSByc2MtPmdldFdpZHRoKCkgLyAyOworICAgIHZvdXRbMV0gKj0gcnNjLT5nZXRIZWlnaHQoKSAvIDI7CisgICAgdm91dFswXSArPSByc2MtPmdldFdpZHRoKCkgLyAyOworICAgIHZvdXRbMV0gKz0gcnNjLT5nZXRIZWlnaHQoKSAvIDI7CisKKyAgICB2b3V0WzBdIC09IHcvMjsKKyAgICB2b3V0WzFdIC09IGgvMjsKKworICAgIC8vTE9HRSgiZHMgIG91dDIgJWYgJWYgJWYiLCB2b3V0WzBdLCB2b3V0WzFdLCB2b3V0WzJdKTsKKworICAgIC8vIFUsIFYsIFcsIEgKKyAgICBTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2Uodm91dFswXSwgdm91dFsxXSwgeiwgaCwgdyk7CisgICAgLy9yc2MtPnNldHVwQ2hlY2soKTsKK30KKyovCisKK3N0YXRpYyB2b2lkIFNDX2RyYXdSZWN0KGZsb2F0IHgxLCBmbG9hdCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgeikKK3sKKyAgICAvL0xPR0UoIlNDX2RyYXdSZWN0ICVmLCVmICAlZiwlZiAgJWYiLCB4MSwgeTEsIHgyLCB5Miwgeik7CisgICAgU0NfZHJhd1F1YWQoeDEsIHkyLCB6LAorICAgICAgICAgICAgICAgIHgyLCB5MiwgeiwKKyAgICAgICAgICAgICAgICB4MiwgeTEsIHosCisgICAgICAgICAgICAgICAgeDEsIHkxLCB6KTsKK30KKworc3RhdGljIHZvaWQgU0NfZHJhd01lc2goUnNNZXNoIHZzbSkKK3sKKyAgICBDSEVDS19PQkoodnNtKTsKKyAgICBHRVRfVExTKCk7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KHZzbSk7CisgICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNtLT5yZW5kZXIocnNjKTsKK30KKworc3RhdGljIHZvaWQgU0NfZHJhd01lc2hQcmltaXRpdmUoUnNNZXNoIHZzbSwgdWludDMyX3QgcHJpbUluZGV4KQoreworICAgIENIRUNLX09CSih2c20pOworICAgIEdFVF9UTFMoKTsKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4odnNtKTsKKyAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc20tPnJlbmRlclByaW1pdGl2ZShyc2MsIHByaW1JbmRleCk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2RyYXdNZXNoUHJpbWl0aXZlUmFuZ2UoUnNNZXNoIHZzbSwgdWludDMyX3QgcHJpbUluZGV4LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuKQoreworICAgIENIRUNLX09CSih2c20pOworICAgIEdFVF9UTFMoKTsKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4odnNtKTsKKyAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc20tPnJlbmRlclByaW1pdGl2ZVJhbmdlKHJzYywgcHJpbUluZGV4LCBzdGFydCwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgU0NfbWVzaENvbXB1dGVCb3VuZGluZ0JveChSc01lc2ggdnNtLCBmbG9hdCAqbWluWCwgZmxvYXQgKm1pblksIGZsb2F0ICptaW5aLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqbWF4WCwgZmxvYXQgKm1heFksIGZsb2F0ICptYXhaKQoreworICAgIENIRUNLX09CSih2c20pOworICAgIEdFVF9UTFMoKTsKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4odnNtKTsKKyAgICBzbS0+Y29tcHV0ZUJCb3goKTsKKyAgICAqbWluWCA9IHNtLT5tQkJveE1pblswXTsKKyAgICAqbWluWSA9IHNtLT5tQkJveE1pblsxXTsKKyAgICAqbWluWiA9IHNtLT5tQkJveE1pblsyXTsKKyAgICAqbWF4WCA9IHNtLT5tQkJveE1heFswXTsKKyAgICAqbWF4WSA9IHNtLT5tQkJveE1heFsxXTsKKyAgICAqbWF4WiA9IHNtLT5tQkJveE1heFsyXTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCitzdGF0aWMgdm9pZCBTQ19jb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBQcm9ncmFtRnJhZ21lbnQgKnBmID0gKFByb2dyYW1GcmFnbWVudCAqKXJzYy0+Z2V0RnJhZ21lbnQoKTsKKyAgICBwZi0+c2V0Q29uc3RhbnRDb2xvcihyc2MsIHIsIGcsIGIsIGEpOworfQorCitzdGF0aWMgdm9pZCBTQ191cGxvYWRUb1RleHR1cmUyKFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgYmFzZU1pcExldmVsKQoreworICAgIENIRUNLX09CSih2YSk7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKHJzYywgdmEsIGZhbHNlLCBiYXNlTWlwTGV2ZWwpOworfQorc3RhdGljIHZvaWQgU0NfdXBsb2FkVG9UZXh0dXJlKFJzQWxsb2NhdGlvbiB2YSkKK3sKKyAgICBDSEVDS19PQkoodmEpOworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShyc2MsIHZhLCBmYWxzZSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX3VwbG9hZFRvQnVmZmVyT2JqZWN0KFJzQWxsb2NhdGlvbiB2YSkKK3sKKyAgICBDSEVDS19PQkoodmEpOworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYywgdmEpOworfQorCitzdGF0aWMgdm9pZCBTQ19DbGVhckNvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzYy0+c2V0dXBQcm9ncmFtU3RvcmUoKTsKKworICAgIGdsQ2xlYXJDb2xvcihyLCBnLCBiLCBhKTsKKyAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworfQorCitzdGF0aWMgdm9pZCBTQ19DbGVhckRlcHRoKGZsb2F0IHYpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzYy0+c2V0dXBQcm9ncmFtU3RvcmUoKTsKKworICAgIGdsQ2xlYXJEZXB0aGYodik7CisgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUKTsKK30KKworc3RhdGljIHVpbnQzMl90IFNDX2dldFdpZHRoKCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcmV0dXJuIHJzYy0+Z2V0V2lkdGgoKTsKK30KKworc3RhdGljIHVpbnQzMl90IFNDX2dldEhlaWdodCgpCit7CisgICAgR0VUX1RMUygpOworICAgIHJldHVybiByc2MtPmdldEhlaWdodCgpOworfQorCitzdGF0aWMgdm9pZCBTQ19EcmF3VGV4dEFsbG9jKFJzQWxsb2NhdGlvbiB2YSwgaW50IHgsIGludCB5KQoreworICAgIENIRUNLX09CSih2YSk7CisgICAgR0VUX1RMUygpOworICAgIEFsbG9jYXRpb24gKmFsbG9jID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7CisgICAgY29uc3QgY2hhciAqdGV4dCA9IChjb25zdCBjaGFyICopYWxsb2MtPmdldFB0cigpOworICAgIHNpemVfdCBhbGxvY1NpemUgPSBhbGxvYy0+Z2V0VHlwZSgpLT5nZXRTaXplQnl0ZXMoKTsKKyAgICByc2MtPm1TdGF0ZUZvbnQucmVuZGVyVGV4dCh0ZXh0LCBhbGxvY1NpemUsIHgsIHkpOworfQorCitzdGF0aWMgdm9pZCBTQ19EcmF3VGV4dChjb25zdCBjaGFyICp0ZXh0LCBpbnQgeCwgaW50IHkpCit7CisgICAgR0VUX1RMUygpOworICAgIHNpemVfdCB0ZXh0TGVuID0gc3RybGVuKHRleHQpOworICAgIHJzYy0+bVN0YXRlRm9udC5yZW5kZXJUZXh0KHRleHQsIHRleHRMZW4sIHgsIHkpOworfQorCitzdGF0aWMgdm9pZCBTQ19zZXRNZXRyaWNzKEZvbnQ6OlJlY3QgKm1ldHJpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmxlZnQsIGludDMyX3QgKnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICp0b3AsIGludDMyX3QgKmJvdHRvbSkKK3sKKyAgICBpZihsZWZ0KSB7CisgICAgICAgICpsZWZ0ID0gbWV0cmljcy0+bGVmdDsKKyAgICB9CisgICAgaWYocmlnaHQpIHsKKyAgICAgICAgKnJpZ2h0ID0gbWV0cmljcy0+cmlnaHQ7CisgICAgfQorICAgIGlmKHRvcCkgeworICAgICAgICAqdG9wID0gbWV0cmljcy0+dG9wOworICAgIH0KKyAgICBpZihib3R0b20pIHsKKyAgICAgICAgKmJvdHRvbSA9IG1ldHJpY3MtPmJvdHRvbTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIFNDX01lYXN1cmVUZXh0QWxsb2MoUnNBbGxvY2F0aW9uIHZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpsZWZ0LCBpbnQzMl90ICpyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqdG9wLCBpbnQzMl90ICpib3R0b20pCit7CisgICAgQ0hFQ0tfT0JKKHZhKTsKKyAgICBHRVRfVExTKCk7CisgICAgQWxsb2NhdGlvbiAqYWxsb2MgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBjb25zdCBjaGFyICp0ZXh0ID0gKGNvbnN0IGNoYXIgKilhbGxvYy0+Z2V0UHRyKCk7CisgICAgc2l6ZV90IHRleHRMZW4gPSBhbGxvYy0+Z2V0VHlwZSgpLT5nZXRTaXplQnl0ZXMoKTsKKyAgICBGb250OjpSZWN0IG1ldHJpY3M7CisgICAgcnNjLT5tU3RhdGVGb250Lm1lYXN1cmVUZXh0KHRleHQsIHRleHRMZW4sICZtZXRyaWNzKTsKKyAgICBTQ19zZXRNZXRyaWNzKCZtZXRyaWNzLCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20pOworfQorCitzdGF0aWMgdm9pZCBTQ19NZWFzdXJlVGV4dChjb25zdCBjaGFyICp0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqbGVmdCwgaW50MzJfdCAqcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICp0b3AsIGludDMyX3QgKmJvdHRvbSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgc2l6ZV90IHRleHRMZW4gPSBzdHJsZW4odGV4dCk7CisgICAgRm9udDo6UmVjdCBtZXRyaWNzOworICAgIHJzYy0+bVN0YXRlRm9udC5tZWFzdXJlVGV4dCh0ZXh0LCB0ZXh0TGVuLCAmbWV0cmljcyk7CisgICAgU0Nfc2V0TWV0cmljcygmbWV0cmljcywgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tKTsKK30KKworc3RhdGljIHZvaWQgU0NfQmluZEZvbnQoUnNGb250IGZvbnQpCit7CisgICAgQ0hFQ0tfT0JKKGZvbnQpOworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQ29udGV4dEJpbmRGb250KHJzYywgZm9udCk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX0ZvbnRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2MtPm1TdGF0ZUZvbnQuc2V0Rm9udENvbG9yKHIsIGcsIGIsIGEpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENsYXNzIGltcGxlbWVudGF0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gbGx2bSBuYW1lIG1hbmdsaW5nIHJlZgorLy8gIDxidWlsdGluLXR5cGU+IDo6PSB2ICAjIHZvaWQKKy8vICAgICAgICAgICAgICAgICA6Oj0gYiAgIyBib29sCisvLyAgICAgICAgICAgICAgICAgOjo9IGMgICMgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBhICAjIHNpZ25lZCBjaGFyCisvLyAgICAgICAgICAgICAgICAgOjo9IGggICMgdW5zaWduZWQgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBzICAjIHNob3J0CisvLyAgICAgICAgICAgICAgICAgOjo9IHQgICMgdW5zaWduZWQgc2hvcnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gaSAgIyBpbnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gaiAgIyB1bnNpZ25lZCBpbnQKKy8vICAgICAgICAgICAgICAgICA6Oj0gbCAgIyBsb25nCisvLyAgICAgICAgICAgICAgICAgOjo9IG0gICMgdW5zaWduZWQgbG9uZworLy8gICAgICAgICAgICAgICAgIDo6PSB4ICAjIGxvbmcgbG9uZywgX19pbnQ2NAorLy8gICAgICAgICAgICAgICAgIDo6PSB5ICAjIHVuc2lnbmVkIGxvbmcgbG9uZywgX19pbnQ2NAorLy8gICAgICAgICAgICAgICAgIDo6PSBmICAjIGZsb2F0CisvLyAgICAgICAgICAgICAgICAgOjo9IGQgICMgZG91YmxlCisKK3N0YXRpYyBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgZ1N5bXNbXSA9IHsKKyAgICB7ICJfWjIycnNnQmluZFByb2dyYW1GcmFnbWVudDE5cnNfcHJvZ3JhbV9mcmFnbWVudCIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtRnJhZ21lbnQgfSwKKyAgICB7ICJfWjE5cnNnQmluZFByb2dyYW1TdG9yZTE2cnNfcHJvZ3JhbV9zdG9yZSIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtU3RvcmUgfSwKKyAgICB7ICJfWjIwcnNnQmluZFByb2dyYW1WZXJ0ZXgxN3JzX3Byb2dyYW1fdmVydGV4IiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1WZXJ0ZXggfSwKKyAgICB7ICJfWjIwcnNnQmluZFByb2dyYW1SYXN0ZXIxN3JzX3Byb2dyYW1fcmFzdGVyIiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1SYXN0ZXIgfSwKKyAgICB7ICJfWjE0cnNnQmluZFNhbXBsZXIxOXJzX3Byb2dyYW1fZnJhZ21lbnRqMTByc19zYW1wbGVyIiwgKHZvaWQgKikmU0NfYmluZFNhbXBsZXIgfSwKKyAgICB7ICJfWjE0cnNnQmluZFRleHR1cmUxOXJzX3Byb2dyYW1fZnJhZ21lbnRqMTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfYmluZFRleHR1cmUgfSwKKworICAgIHsgIl9aMzZyc2dQcm9ncmFtVmVydGV4TG9hZFByb2plY3Rpb25NYXRyaXhQSzEycnNfbWF0cml4NHg0IiwgKHZvaWQgKikmU0NfdnBMb2FkUHJvamVjdGlvbk1hdHJpeCB9LAorICAgIHsgIl9aMzFyc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4UEsxMnJzX21hdHJpeDR4NCIsICh2b2lkICopJlNDX3ZwTG9hZE1vZGVsTWF0cml4IH0sCisgICAgeyAiX1ozM3JzZ1Byb2dyYW1WZXJ0ZXhMb2FkVGV4dHVyZU1hdHJpeFBLMTJyc19tYXRyaXg0eDQiLCAodm9pZCAqKSZTQ192cExvYWRUZXh0dXJlTWF0cml4IH0sCisKKyAgICB7ICJfWjM1cnNnUHJvZ3JhbVZlcnRleEdldFByb2plY3Rpb25NYXRyaXhQMTJyc19tYXRyaXg0eDQiLCAodm9pZCAqKSZTQ192cEdldFByb2plY3Rpb25NYXRyaXggfSwKKworICAgIHsgIl9aMzFyc2dQcm9ncmFtRnJhZ21lbnRDb25zdGFudENvbG9yMTlyc19wcm9ncmFtX2ZyYWdtZW50ZmZmZiIsICh2b2lkICopJlNDX3BmQ29uc3RhbnRDb2xvciB9LAorCisgICAgeyAiX1oxMXJzZ0dldFdpZHRodiIsICh2b2lkICopJlNDX2dldFdpZHRoIH0sCisgICAgeyAiX1oxMnJzZ0dldEhlaWdodHYiLCAodm9pZCAqKSZTQ19nZXRIZWlnaHQgfSwKKworICAgIHsgIl9aMThyc2dVcGxvYWRUb1RleHR1cmUxM3JzX2FsbG9jYXRpb25qIiwgKHZvaWQgKikmU0NfdXBsb2FkVG9UZXh0dXJlMiB9LAorICAgIHsgIl9aMThyc2dVcGxvYWRUb1RleHR1cmUxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ191cGxvYWRUb1RleHR1cmUgfSwKKyAgICB7ICJfWjIzcnNnVXBsb2FkVG9CdWZmZXJPYmplY3QxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ191cGxvYWRUb0J1ZmZlck9iamVjdCB9LAorCisgICAgeyAiX1oxMXJzZ0RyYXdSZWN0ZmZmZmYiLCAodm9pZCAqKSZTQ19kcmF3UmVjdCB9LAorICAgIHsgIl9aMTFyc2dEcmF3UXVhZGZmZmZmZmZmZmZmZiIsICh2b2lkICopJlNDX2RyYXdRdWFkIH0sCisgICAgeyAiX1oyMHJzZ0RyYXdRdWFkVGV4Q29vcmRzZmZmZmZmZmZmZmZmZmZmZmZmZmYiLCAodm9pZCAqKSZTQ19kcmF3UXVhZFRleENvb3JkcyB9LAorICAgIHsgIl9aMjRyc2dEcmF3U3ByaXRlU2NyZWVuc3BhY2VmZmZmZiIsICh2b2lkICopJlNDX2RyYXdTcHJpdGVTY3JlZW5zcGFjZSB9LAorCisgICAgeyAiX1oxMXJzZ0RyYXdNZXNoN3JzX21lc2giLCAodm9pZCAqKSZTQ19kcmF3TWVzaCB9LAorICAgIHsgIl9aMTFyc2dEcmF3TWVzaDdyc19tZXNoaiIsICh2b2lkICopJlNDX2RyYXdNZXNoUHJpbWl0aXZlIH0sCisgICAgeyAiX1oxMXJzZ0RyYXdNZXNoN3JzX21lc2hqamoiLCAodm9pZCAqKSZTQ19kcmF3TWVzaFByaW1pdGl2ZVJhbmdlIH0sCisgICAgeyAiX1oyNXJzZ01lc2hDb21wdXRlQm91bmRpbmdCb3g3cnNfbWVzaFBmUzBfUzBfUzBfUzBfUzBfIiwgKHZvaWQgKikmU0NfbWVzaENvbXB1dGVCb3VuZGluZ0JveCB9LAorCisgICAgeyAiX1oxM3JzZ0NsZWFyQ29sb3JmZmZmIiwgKHZvaWQgKikmU0NfQ2xlYXJDb2xvciB9LAorICAgIHsgIl9aMTNyc2dDbGVhckRlcHRoZiIsICh2b2lkICopJlNDX0NsZWFyRGVwdGggfSwKKworICAgIHsgIl9aMTFyc2dEcmF3VGV4dFBLY2lpIiwgKHZvaWQgKikmU0NfRHJhd1RleHQgfSwKKyAgICB7ICJfWjExcnNnRHJhd1RleHQxM3JzX2FsbG9jYXRpb25paSIsICh2b2lkICopJlNDX0RyYXdUZXh0QWxsb2MgfSwKKyAgICB7ICJfWjE0cnNnTWVhc3VyZVRleHRQS2NQaVMxX1MxX1MxXyIsICh2b2lkICopJlNDX01lYXN1cmVUZXh0IH0sCisgICAgeyAiX1oxNHJzZ01lYXN1cmVUZXh0MTNyc19hbGxvY2F0aW9uUGlTMF9TMF9TMF8iLCAodm9pZCAqKSZTQ19NZWFzdXJlVGV4dEFsbG9jIH0sCisKKyAgICB7ICJfWjExcnNnQmluZEZvbnQ3cnNfZm9udCIsICh2b2lkICopJlNDX0JpbmRGb250IH0sCisgICAgeyAiX1oxMnJzZ0ZvbnRDb2xvcmZmZmYiLCAodm9pZCAqKSZTQ19Gb250Q29sb3IgfSwKKworICAgIC8vIG1pc2MKKyAgICB7ICJfWjVjb2xvcmZmZmYiLCAodm9pZCAqKSZTQ19jb2xvciB9LAorCisgICAgeyBOVUxMLCBOVUxMIH0KK307CisKK2NvbnN0IFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqIFNjcmlwdENTdGF0ZTo6bG9va3VwU3ltYm9sR0woY29uc3QgY2hhciAqc3ltKQoreworICAgIFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqc3ltcyA9IGdTeW1zOworCisgICAgd2hpbGUgKHN5bXMtPm1QdHIpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoc3ltcy0+bU5hbWUsIHN5bSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzeW1zOworICAgICAgICB9CisgICAgICAgIHN5bXMrKzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTaGFkZXJDYWNoZS5jcHAgYi9saWJzL3JzL3JzU2hhZGVyQ2FjaGUuY3BwCmluZGV4IDQ3MTFkMWIuLjQ1ZjYyMDcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTaGFkZXJDYWNoZS5jcHAKKysrIGIvbGlicy9ycy9yc1NoYWRlckNhY2hlLmNwcApAQCAtMTQsMTAgKzE0LDE0IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKLQogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMjUsMjAgKzI5LDE1IEBACiAKIFNoYWRlckNhY2hlOjpTaGFkZXJDYWNoZSgpCiB7Ci0gICAgbUVudHJ5Q291bnQgPSAwOwotICAgIG1FbnRyeUFsbG9jYXRpb25Db3VudCA9IDE2OwotICAgIG1FbnRyaWVzID0gKGVudHJ5X3QgKiljYWxsb2MobUVudHJ5QWxsb2NhdGlvbkNvdW50LCBzaXplb2YoZW50cnlfdCkpOworICAgIG1FbnRyaWVzLnNldENhcGFjaXR5KDE2KTsKIH0KIAogU2hhZGVyQ2FjaGU6On5TaGFkZXJDYWNoZSgpCiB7Ci0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1FbnRyeUNvdW50OyBjdCsrKSB7Ci0gICAgICAgIGdsRGVsZXRlUHJvZ3JhbShtRW50cmllc1tjdF0ucHJvZ3JhbSk7CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1FbnRyaWVzLnNpemUoKTsgY3QrKykgeworICAgICAgICBnbERlbGV0ZVByb2dyYW0obUVudHJpZXNbY3RdLT5wcm9ncmFtKTsKKyAgICAgICAgZnJlZShtRW50cmllc1tjdF0pOwogICAgIH0KLQotICAgIG1FbnRyeUNvdW50ID0gMDsKLSAgICBtRW50cnlBbGxvY2F0aW9uQ291bnQgPSAwOwotICAgIGZyZWUobUVudHJpZXMpOwogfQogCiBib29sIFNoYWRlckNhY2hlOjpsb29rdXAoQ29udGV4dCAqcnNjLCBQcm9ncmFtVmVydGV4ICp2dHgsIFByb2dyYW1GcmFnbWVudCAqZnJhZykKQEAgLTQ5LDYxICs0OCw0NiBAQAogICAgIGlmICghZnJhZy0+Z2V0U2hhZGVySUQoKSkgewogICAgICAgICBmcmFnLT5sb2FkU2hhZGVyKHJzYyk7CiAgICAgfQorCisgICAgLy8gRG9uJ3QgdHJ5IHRvIGNhY2hlIGlmIHNoYWRlcnMgZmFpbGVkIHRvIGxvYWQKKyAgICBpZighdnR4LT5nZXRTaGFkZXJJRCgpIHx8ICFmcmFnLT5nZXRTaGFkZXJJRCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgLy9MT0dWKCJTaGFkZXJDYWNoZSBsb29rdXAgIHZ0eCAlaSwgZnJhZyAlaSIsIHZ0eC0+Z2V0U2hhZGVySUQoKSwgZnJhZy0+Z2V0U2hhZGVySUQoKSk7CisgICAgdWludDMyX3QgZW50cnlDb3VudCA9IG1FbnRyaWVzLnNpemUoKTsKKyAgICBmb3IodWludDMyX3QgY3QgPSAwOyBjdCA8IGVudHJ5Q291bnQ7IGN0ICsrKSB7CisgICAgICAgIGlmICgobUVudHJpZXNbY3RdLT52dHggPT0gdnR4LT5nZXRTaGFkZXJJRCgpKSAmJgorICAgICAgICAgICAgKG1FbnRyaWVzW2N0XS0+ZnJhZyA9PSBmcmFnLT5nZXRTaGFkZXJJRCgpKSkgewogCi0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1FbnRyeUNvdW50OyBjdCsrKSB7Ci0gICAgICAgIGlmICgobUVudHJpZXNbY3RdLnZ0eCA9PSB2dHgtPmdldFNoYWRlcklEKCkpICYmCi0gICAgICAgICAgICAobUVudHJpZXNbY3RdLmZyYWcgPT0gZnJhZy0+Z2V0U2hhZGVySUQoKSkpIHsKLQotICAgICAgICAgICAgLy9MT0dWKCJTQyB1c2luZyBwcm9ncmFtICVpIiwgbUVudHJpZXNbY3RdLnByb2dyYW0pOwotICAgICAgICAgICAgZ2xVc2VQcm9ncmFtKG1FbnRyaWVzW2N0XS5wcm9ncmFtKTsKLSAgICAgICAgICAgIG1DdXJyZW50ID0gJm1FbnRyaWVzW2N0XTsKKyAgICAgICAgICAgIC8vTE9HVigiU0MgdXNpbmcgcHJvZ3JhbSAlaSIsIG1FbnRyaWVzW2N0XS0+cHJvZ3JhbSk7CisgICAgICAgICAgICBnbFVzZVByb2dyYW0obUVudHJpZXNbY3RdLT5wcm9ncmFtKTsKKyAgICAgICAgICAgIG1DdXJyZW50ID0gbUVudHJpZXNbY3RdOwogICAgICAgICAgICAgLy9MT0dWKCJTaGFkZXJDYWNoZSBoaXQsIHVzaW5nICVpIiwgY3QpOwogICAgICAgICAgICAgcnNjLT5jaGVja0Vycm9yKCJTaGFkZXJDYWNoZTo6bG9va3VwIChoaXQpIik7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICAvLyBOb3QgaW4gY2FjaGUsIGFkZCBpdC4KIAotICAgIGlmIChtRW50cnlBbGxvY2F0aW9uQ291bnQgPT0gbUVudHJ5Q291bnQpIHsKLSAgICAgICAgLy8gT3V0IG9mIHNwYWNlLCBtYWtlIHNvbWUuCi0gICAgICAgIG1FbnRyeUFsbG9jYXRpb25Db3VudCAqPSAyOwotICAgICAgICBlbnRyeV90ICplID0gKGVudHJ5X3QgKiljYWxsb2MobUVudHJ5QWxsb2NhdGlvbkNvdW50LCBzaXplb2YoZW50cnlfdCkpOwotICAgICAgICBpZiAoIWUpIHsKLSAgICAgICAgICAgIExPR0UoIk91dCBvZiBtZW1vcnkgZm9yIFNoYWRlckNhY2hlOjpsb29rdXAiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoZSwgbUVudHJpZXMsIHNpemVvZihlbnRyeV90KSAqIG1FbnRyeUNvdW50KTsKLSAgICAgICAgZnJlZShtRW50cmllcyk7Ci0gICAgICAgIG1FbnRyaWVzID0gZTsKLSAgICB9Ci0KLSAgICAvL0xPR1YoIlNoYWRlckNhY2hlIG1pc3MsIHVzaW5nICVpIiwgbUVudHJ5Q291bnQpOworICAgIC8vTE9HVigiU2hhZGVyQ2FjaGUgbWlzcyIpOwogICAgIC8vTE9HRSgiZTAgJXgiLCBnbEdldEVycm9yKCkpOwotCi0gICAgZW50cnlfdCAqZSA9ICZtRW50cmllc1ttRW50cnlDb3VudF07CisgICAgZW50cnlfdCAqZSA9IChlbnRyeV90ICopbWFsbG9jKHNpemVvZihlbnRyeV90KSk7CisgICAgbUVudHJpZXMucHVzaChlKTsKICAgICBtQ3VycmVudCA9IGU7CiAgICAgZS0+dnR4ID0gdnR4LT5nZXRTaGFkZXJJRCgpOwogICAgIGUtPmZyYWcgPSBmcmFnLT5nZXRTaGFkZXJJRCgpOwogICAgIGUtPnByb2dyYW0gPSBnbENyZWF0ZVByb2dyYW0oKTsKLSAgICBlLT5tVXNlclZlcnRleFByb2dyYW0gPSB2dHgtPmlzVXNlclByb2dyYW0oKTsKLSAgICBpZiAobUVudHJpZXNbbUVudHJ5Q291bnRdLnByb2dyYW0pIHsKKyAgICBlLT52dHhBdHRyQ291bnQgPSB2dHgtPmdldEF0dHJpYkNvdW50KCk7CisgICAgaWYgKGUtPnByb2dyYW0pIHsKICAgICAgICAgR0x1aW50IHBnbSA9IGUtPnByb2dyYW07CiAgICAgICAgIGdsQXR0YWNoU2hhZGVyKHBnbSwgdnR4LT5nZXRTaGFkZXJJRCgpKTsKICAgICAgICAgLy9MT0dFKCJlMSAleCIsIGdsR2V0RXJyb3IoKSk7CiAgICAgICAgIGdsQXR0YWNoU2hhZGVyKHBnbSwgZnJhZy0+Z2V0U2hhZGVySUQoKSk7CiAKICAgICAgICAgaWYgKCF2dHgtPmlzVXNlclByb2dyYW0oKSkgewotICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAwLCAiQVRUUklCX0xlZ2FjeVBvc2l0aW9uIik7Ci0gICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDEsICJBVFRSSUJfTGVnYWN5Q29sb3IiKTsKLSAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMiwgIkFUVFJJQl9MZWdhY3lOb3JtYWwiKTsKLSAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMywgIkFUVFJJQl9MZWdhY3lQb2ludFNpemUiKTsKLSAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgNCwgIkFUVFJJQl9MZWdhY3lUZXh0dXJlIik7Ci0gICAgICAgICAgICBlLT5tVnR4QXR0cmliU2xvdHNbUlNfS0lORF9QT1NJVElPTl0gPSAwOwotICAgICAgICAgICAgZS0+bVZ0eEF0dHJpYlNsb3RzW1JTX0tJTkRfQ09MT1JdID0gMTsKLSAgICAgICAgICAgIGUtPm1WdHhBdHRyaWJTbG90c1tSU19LSU5EX05PUk1BTF0gPSAyOwotICAgICAgICAgICAgZS0+bVZ0eEF0dHJpYlNsb3RzW1JTX0tJTkRfUE9JTlRfU0laRV0gPSAzOwotICAgICAgICAgICAgZS0+bVZ0eEF0dHJpYlNsb3RzW1JTX0tJTkRfVEVYVFVSRV0gPSA0OworICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAwLCAiQVRUUklCX3Bvc2l0aW9uIik7CisgICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDEsICJBVFRSSUJfY29sb3IiKTsKKyAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMiwgIkFUVFJJQl9ub3JtYWwiKTsKKyAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMywgIkFUVFJJQl90ZXh0dXJlMCIpOwogICAgICAgICB9CiAKICAgICAgICAgLy9MT0dFKCJlMiAleCIsIGdsR2V0RXJyb3IoKSk7CkBAIC0xMjYsMTQgKzExMCwxNSBAQAogICAgICAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0hBREVSLCAiRXJyb3IgbGlua2luZyBHTCBQcm9ncmFtcyIpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIGlmICh2dHgtPmlzVXNlclByb2dyYW0oKSkgewotICAgICAgICAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IHZ0eC0+Z2V0QXR0cmliQ291bnQoKTsgY3QrKykgewotICAgICAgICAgICAgICAgIGUtPm1WdHhBdHRyaWJTbG90c1tjdF0gPSBnbEdldEF0dHJpYkxvY2F0aW9uKHBnbSwgdnR4LT5nZXRBdHRyaWJOYW1lKGN0KSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJzYy0+cHJvcHMubUxvZ1NoYWRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HVigidnR4IEEgJWksICVzID0gJWRcbiIsIGN0LCB2dHgtPmdldEF0dHJpYk5hbWUoY3QpLnN0cmluZygpLCBlLT5tVnR4QXR0cmliU2xvdHNbY3RdKTsKLSAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IGUtPnZ0eEF0dHJDb3VudDsgY3QrKykgeworICAgICAgICAgICAgZS0+bVZ0eEF0dHJpYlNsb3RzW2N0XSA9IGdsR2V0QXR0cmliTG9jYXRpb24ocGdtLCB2dHgtPmdldEF0dHJpYk5hbWUoY3QpKTsKKyAgICAgICAgICAgIGUtPm1WdHhBdHRyaWJOYW1lc1tjdF0gPSB2dHgtPmdldEF0dHJpYk5hbWUoY3QpLnN0cmluZygpOworICAgICAgICAgICAgaWYgKHJzYy0+cHJvcHMubUxvZ1NoYWRlcnMpIHsKKyAgICAgICAgICAgICAgICBMT0dWKCJ2dHggQSAlaSwgJXMgPSAlZFxuIiwgY3QsIHZ0eC0+Z2V0QXR0cmliTmFtZShjdCkuc3RyaW5nKCksIGUtPm1WdHhBdHRyaWJTbG90c1tjdF0pOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKICAgICAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IHZ0eC0+Z2V0VW5pZm9ybUNvdW50KCk7IGN0KyspIHsKICAgICAgICAgICAgIGUtPm1WdHhVbmlmb3JtU2xvdHNbY3RdID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocGdtLCB2dHgtPmdldFVuaWZvcm1OYW1lKGN0KSk7CiAgICAgICAgICAgICBpZiAocnNjLT5wcm9wcy5tTG9nU2hhZGVycykgewpAQCAtMTUxLDE3ICsxMzYsNDcgQEAKICAgICBlLT5tSXNWYWxpZCA9IHRydWU7CiAgICAgLy9MT0dWKCJTQyBtYWRlIHByb2dyYW0gJWkiLCBlLT5wcm9ncmFtKTsKICAgICBnbFVzZVByb2dyYW0oZS0+cHJvZ3JhbSk7Ci0gICAgbUVudHJ5Q291bnQrKzsKICAgICByc2MtPmNoZWNrRXJyb3IoIlNoYWRlckNhY2hlOjpsb29rdXAgKG1pc3MpIik7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2ludDMyX3QgU2hhZGVyQ2FjaGU6OnZ0eEF0dHJpYlNsb3QoY29uc3QgU3RyaW5nOCAmYXR0ck5hbWUpIGNvbnN0IHsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUN1cnJlbnQtPnZ0eEF0dHJDb3VudDsgY3QrKykgeworICAgICAgICBpZihhdHRyTmFtZSA9PSBtQ3VycmVudC0+bVZ0eEF0dHJpYk5hbWVzW2N0XSkgeworICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50LT5tVnR4QXR0cmliU2xvdHNbY3RdOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKwogdm9pZCBTaGFkZXJDYWNoZTo6Y2xlYW51cFZlcnRleCh1aW50MzJfdCBpZCkKIHsKKyAgICBpbnQzMl90IG51bUVudHJpZXMgPSAoaW50MzJfdCltRW50cmllcy5zaXplKCk7CisgICAgZm9yKGludDMyX3QgY3QgPSAwOyBjdCA8IG51bUVudHJpZXM7IGN0ICsrKSB7CisgICAgICAgIGlmIChtRW50cmllc1tjdF0tPnZ0eCA9PSBpZCkgeworICAgICAgICAgICAgZ2xEZWxldGVQcm9ncmFtKG1FbnRyaWVzW2N0XS0+cHJvZ3JhbSk7CisKKyAgICAgICAgICAgIGZyZWUobUVudHJpZXNbY3RdKTsKKyAgICAgICAgICAgIG1FbnRyaWVzLnJlbW92ZUF0KGN0KTsKKyAgICAgICAgICAgIG51bUVudHJpZXMgPSAoaW50MzJfdCltRW50cmllcy5zaXplKCk7CisgICAgICAgICAgICBjdCAtLTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogdm9pZCBTaGFkZXJDYWNoZTo6Y2xlYW51cEZyYWdtZW50KHVpbnQzMl90IGlkKQogeworICAgIGludDMyX3QgbnVtRW50cmllcyA9IChpbnQzMl90KW1FbnRyaWVzLnNpemUoKTsKKyAgICBmb3IoaW50MzJfdCBjdCA9IDA7IGN0IDwgbnVtRW50cmllczsgY3QgKyspIHsKKyAgICAgICAgaWYgKG1FbnRyaWVzW2N0XS0+ZnJhZyA9PSBpZCkgeworICAgICAgICAgICAgZ2xEZWxldGVQcm9ncmFtKG1FbnRyaWVzW2N0XS0+cHJvZ3JhbSk7CisKKyAgICAgICAgICAgIGZyZWUobUVudHJpZXNbY3RdKTsKKyAgICAgICAgICAgIG1FbnRyaWVzLnJlbW92ZUF0KGN0KTsKKyAgICAgICAgICAgIG51bUVudHJpZXMgPSAoaW50MzJfdCltRW50cmllcy5zaXplKCk7CisgICAgICAgICAgICBjdCAtLTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogdm9pZCBTaGFkZXJDYWNoZTo6Y2xlYW51cEFsbCgpCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2hhZGVyQ2FjaGUuaCBiL2xpYnMvcnMvcnNTaGFkZXJDYWNoZS5oCmluZGV4IGRmOTljY2MuLjM1ZmY5NWIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTaGFkZXJDYWNoZS5oCisrKyBiL2xpYnMvcnMvcnNTaGFkZXJDYWNoZS5oCkBAIC00MCwyOSArNDAsMzAgQEAKIAogICAgIHZvaWQgY2xlYW51cEFsbCgpOwogCi0gICAgaW50MzJfdCB2dHhBdHRyaWJTbG90KHVpbnQzMl90IGEpIGNvbnN0IHtyZXR1cm4gbUN1cnJlbnQtPm1WdHhBdHRyaWJTbG90c1thXTt9CisgICAgaW50MzJfdCB2dHhBdHRyaWJTbG90KGNvbnN0IFN0cmluZzggJmF0dHJOYW1lKSBjb25zdDsKICAgICBpbnQzMl90IHZ0eFVuaWZvcm1TbG90KHVpbnQzMl90IGEpIGNvbnN0IHtyZXR1cm4gbUN1cnJlbnQtPm1WdHhVbmlmb3JtU2xvdHNbYV07fQogICAgIGludDMyX3QgZnJhZ0F0dHJpYlNsb3QodWludDMyX3QgYSkgY29uc3Qge3JldHVybiBtQ3VycmVudC0+bUZyYWdBdHRyaWJTbG90c1thXTt9CiAgICAgaW50MzJfdCBmcmFnVW5pZm9ybVNsb3QodWludDMyX3QgYSkgY29uc3Qge3JldHVybiBtQ3VycmVudC0+bUZyYWdVbmlmb3JtU2xvdHNbYV07fQotICAgIGJvb2wgaXNVc2VyVmVydGV4UHJvZ3JhbSgpIGNvbnN0IHtyZXR1cm4gbUN1cnJlbnQtPm1Vc2VyVmVydGV4UHJvZ3JhbTt9CiAKIHByb3RlY3RlZDoKICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgIHVpbnQzMl90IHZ0eDsKICAgICAgICAgdWludDMyX3QgZnJhZzsKICAgICAgICAgdWludDMyX3QgcHJvZ3JhbTsKKyAgICAgICAgdWludDMyX3QgdnR4QXR0ckNvdW50OworICAgICAgICBjb25zdCBjaGFyKiBtVnR4QXR0cmliTmFtZXNbUHJvZ3JhbTo6TUFYX0FUVFJJQlNdOwogICAgICAgICBpbnQzMl90IG1WdHhBdHRyaWJTbG90c1tQcm9ncmFtOjpNQVhfQVRUUklCU107CiAgICAgICAgIGludDMyX3QgbVZ0eFVuaWZvcm1TbG90c1tQcm9ncmFtOjpNQVhfVU5JRk9STVNdOwogICAgICAgICBpbnQzMl90IG1GcmFnQXR0cmliU2xvdHNbUHJvZ3JhbTo6TUFYX0FUVFJJQlNdOwogICAgICAgICBpbnQzMl90IG1GcmFnVW5pZm9ybVNsb3RzW1Byb2dyYW06Ok1BWF9VTklGT1JNU107Ci0gICAgICAgIGJvb2wgbVVzZXJWZXJ0ZXhQcm9ncmFtOwogICAgICAgICBib29sIG1Jc1ZhbGlkOwogICAgIH0gZW50cnlfdDsKLSAgICBlbnRyeV90ICptRW50cmllczsKKyAgICAvL2VudHJ5X3QgKm1FbnRyaWVzOworICAgIFZlY3RvcjxlbnRyeV90Kj4gbUVudHJpZXM7CiAgICAgZW50cnlfdCAqbUN1cnJlbnQ7CiAKLSAgICB1aW50MzJfdCBtRW50cnlDb3VudDsKLSAgICB1aW50MzJfdCBtRW50cnlBbGxvY2F0aW9uQ291bnQ7CisgICAgLyp1aW50MzJfdCBtRW50cnlDb3VudDsKKyAgICB1aW50MzJfdCBtRW50cnlBbGxvY2F0aW9uQ291bnQ7Ki8KIAogfTsKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NpZ25hbC5jcHAgYi9saWJzL3JzL3JzU2lnbmFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjM5YmZkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc1NpZ25hbC5jcHAKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJyc1NpZ25hbC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKKworU2lnbmFsOjpTaWduYWwoKQoreworICAgIG1TZXQgPSB0cnVlOworfQorCitTaWduYWw6On5TaWduYWwoKQoreworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbU11dGV4KTsKKyAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmbUNvbmRpdGlvbik7Cit9CisKK2Jvb2wgU2lnbmFsOjppbml0KCkKK3sKKyAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCZtTXV0ZXgsIE5VTEwpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NGaWZvIG11dGV4IGluaXQgZmFpbHVyZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2luaXQoJm1Db25kaXRpb24sIE5VTEwpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NGaWZvIGNvbmRpdGlvbiBpbml0IGZhaWx1cmUiKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtTXV0ZXgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU2lnbmFsOjpzZXQoKQoreworICAgIGludCBzdGF0dXM7CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1NdXRleCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSBsb2NraW5nIGZvciBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtU2V0ID0gdHJ1ZTsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9zaWduYWwoJm1Db25kaXRpb24pOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgb24gc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOworICAgIH0KKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgdW5sb2NraW5nIGZvciBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgfQorfQorCit2b2lkIFNpZ25hbDo6d2FpdCgpCit7CisgICAgaW50IHN0YXR1czsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIGxvY2tpbmcgZm9yIGNvbmRpdGlvbi4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFtU2V0KSB7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF93YWl0KCZtQ29uZGl0aW9uLCAmbU11dGV4KTsKKyAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgd2FpdGluZyBvbiBjb25kaXRpb24uIiwgc3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtU2V0ID0gZmFsc2U7CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIHVubG9ja2luZyBmb3IgY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2lnbmFsLmggYi9saWJzL3JzL3JzU2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3NjBmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNTaWduYWwuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX1NJR05BTF9ICisjZGVmaW5lIEFORFJPSURfUlNfU0lHTkFMX0gKKworCisjaW5jbHVkZSAicnNVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworY2xhc3MgU2lnbmFsIHsKK3B1YmxpYzoKKyAgICBTaWduYWwoKTsKKyAgICB+U2lnbmFsKCk7CisKKyAgICBib29sIGluaXQoKTsKKworICAgIHZvaWQgc2V0KCk7CisgICAgdm9pZCB3YWl0KCk7CisKK3Byb3RlY3RlZDoKKyAgICBib29sIG1TZXQ7CisgICAgcHRocmVhZF9tdXRleF90IG1NdXRleDsKKyAgICBwdGhyZWFkX2NvbmRfdCBtQ29uZGl0aW9uOworfTsKKworfQorfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NpbXBsZU1lc2guY3BwIGIvbGlicy9ycy9yc1NpbXBsZU1lc2guY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2NlNWNkLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvcnNTaW1wbGVNZXNoLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInJzQ29udGV4dC5oIgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7Ci0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi1TaW1wbGVNZXNoOjpTaW1wbGVNZXNoKENvbnRleHQgKnJzYykgOiBPYmplY3RCYXNlKHJzYykKLXsKLSAgICBtQWxsb2NGaWxlID0gX19GSUxFX187Ci0gICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwotfQotCi1TaW1wbGVNZXNoOjp+U2ltcGxlTWVzaCgpCi17Ci0gICAgZGVsZXRlW10gbVZlcnRleFR5cGVzOwotICAgIGRlbGV0ZVtdIG1WZXJ0ZXhCdWZmZXJzOwotfQotCi12b2lkIFNpbXBsZU1lc2g6OnJlbmRlcihDb250ZXh0ICpyc2MpIGNvbnN0Ci17Ci0gICAgaWYgKG1QcmltaXRpdmVUeXBlLmdldCgpKSB7Ci0gICAgICAgIHJlbmRlclJhbmdlKHJzYywgMCwgbVByaW1pdGl2ZVR5cGUtPmdldERpbVgoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUluZGV4VHlwZS5nZXQoKSkgewotICAgICAgICByZW5kZXJSYW5nZShyc2MsIDAsIG1JbmRleFR5cGUtPmdldERpbVgoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICByZW5kZXJSYW5nZShyc2MsIDAsIG1WZXJ0ZXhUeXBlc1swXS0+Z2V0RGltWCgpKTsKLX0KLQotdm9pZCBTaW1wbGVNZXNoOjpyZW5kZXJSYW5nZShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pIGNvbnN0Ci17Ci0gICAgaWYgKGxlbiA8IDEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJzYy0+Y2hlY2tFcnJvcigiU2ltcGxlTWVzaDo6cmVuZGVyUmFuZ2UgMSIpOwotICAgIFZlcnRleEFycmF5IHZhOwotICAgIGlmIChyc2MtPmNoZWNrVmVyc2lvbjJfMCgpKSB7Ci0gICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVmVydGV4VHlwZUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICBtVmVydGV4QnVmZmVyc1tjdF0tPnVwbG9hZENoZWNrKHJzYyk7Ci0gICAgICAgICAgICB2YS5zZXRBY3RpdmVCdWZmZXIobVZlcnRleEJ1ZmZlcnNbY3RdLT5nZXRCdWZmZXJPYmplY3RJRCgpKTsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1tjdF0tPmVuYWJsZUdMVmVydGV4QnVmZmVyMigmdmEpOwotICAgICAgICB9Ci0gICAgICAgIHZhLnNldHVwR0wyKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXksICZyc2MtPm1TaGFkZXJDYWNoZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1WZXJ0ZXhUeXBlQ291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2N0XS0+dXBsb2FkQ2hlY2socnNjKTsKLSAgICAgICAgICAgIHZhLnNldEFjdGl2ZUJ1ZmZlcihtVmVydGV4QnVmZmVyc1tjdF0tPmdldEJ1ZmZlck9iamVjdElEKCkpOwotICAgICAgICAgICAgbVZlcnRleFR5cGVzW2N0XS0+ZW5hYmxlR0xWZXJ0ZXhCdWZmZXIoJnZhKTsKLSAgICAgICAgfQotICAgICAgICB2YS5zZXR1cEdMKHJzYywgMCk7Ci0gICAgfQotCi0gICAgcnNjLT5jaGVja0Vycm9yKCJTaW1wbGVNZXNoOjpyZW5kZXJSYW5nZSAyIik7Ci0gICAgaWYgKG1JbmRleFR5cGUuZ2V0KCkpIHsKLSAgICAgICAgbUluZGV4QnVmZmVyLT51cGxvYWRDaGVjayhyc2MpOwotICAgICAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1JbmRleEJ1ZmZlci0+Z2V0QnVmZmVyT2JqZWN0SUQoKSk7Ci0gICAgICAgIGdsRHJhd0VsZW1lbnRzKG1HTFByaW1pdGl2ZSwgbGVuLCBHTF9VTlNJR05FRF9TSE9SVCwgKHVpbnQxNl90ICopKHN0YXJ0ICogMikpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRHJhd0FycmF5cyhtR0xQcmltaXRpdmUsIHN0YXJ0LCBsZW4pOwotICAgIH0KLQotICAgIHJzYy0+Y2hlY2tFcnJvcigiU2ltcGxlTWVzaDo6cmVuZGVyUmFuZ2UiKTsKLX0KLQotdm9pZCBTaW1wbGVNZXNoOjp1cGxvYWRBbGwoQ29udGV4dCAqcnNjKQotewotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVmVydGV4VHlwZUNvdW50OyBjdCsrKSB7Ci0gICAgICAgIGlmIChtVmVydGV4QnVmZmVyc1tjdF0uZ2V0KCkpIHsKLSAgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2N0XS0+ZGVmZXJlZFVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1JbmRleEJ1ZmZlci5nZXQoKSkgewotICAgICAgICBtSW5kZXhCdWZmZXItPmRlZmVyZWRVcGxvYWRUb0J1ZmZlck9iamVjdChyc2MpOwotICAgIH0KLSAgICBpZiAobVByaW1pdGl2ZUJ1ZmZlci5nZXQoKSkgewotICAgICAgICBtUHJpbWl0aXZlQnVmZmVyLT5kZWZlcmVkVXBsb2FkVG9CdWZmZXJPYmplY3QocnNjKTsKLSAgICB9Ci0gICAgcnNjLT5jaGVja0Vycm9yKCJTaW1wbGVNZXNoOjp1cGxvYWRBbGwiKTsKLX0KLQotCi1TaW1wbGVNZXNoQ29udGV4dDo6U2ltcGxlTWVzaENvbnRleHQoKQotewotfQotCi1TaW1wbGVNZXNoQ29udGV4dDo6flNpbXBsZU1lc2hDb250ZXh0KCkKLXsKLX0KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKLQotCi1Sc1NpbXBsZU1lc2ggcnNpX1NpbXBsZU1lc2hDcmVhdGUoQ29udGV4dCAqcnNjLCBSc1R5cGUgcHJpbSwgUnNUeXBlIGlkeCwgUnNUeXBlICp2dHgsIHVpbnQzMl90IHZ0eENvdW50LCB1aW50MzJfdCBwcmltVHlwZSkKLXsKLSAgICBTaW1wbGVNZXNoICpzbSA9IG5ldyBTaW1wbGVNZXNoKHJzYyk7Ci0gICAgc20tPmluY1VzZXJSZWYoKTsKLQotICAgIHNtLT5tSW5kZXhUeXBlLnNldCgoY29uc3QgVHlwZSAqKWlkeCk7Ci0gICAgc20tPm1QcmltaXRpdmVUeXBlLnNldCgoY29uc3QgVHlwZSAqKXByaW0pOwotCi0gICAgc20tPm1WZXJ0ZXhUeXBlQ291bnQgPSB2dHhDb3VudDsKLSAgICBzbS0+bVZlcnRleFR5cGVzID0gbmV3IE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT5bdnR4Q291bnRdOwotICAgIHNtLT5tVmVydGV4QnVmZmVycyA9IG5ldyBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+W3Z0eENvdW50XTsKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgdnR4Q291bnQ7IGN0KyspIHsKLSAgICAgICAgc20tPm1WZXJ0ZXhUeXBlc1tjdF0uc2V0KChjb25zdCBUeXBlICopdnR4W2N0XSk7Ci0gICAgfQotCi0gICAgc20tPm1QcmltaXRpdmUgPSAoUnNQcmltaXRpdmUpcHJpbVR5cGU7Ci0gICAgc3dpdGNoKHNtLT5tUHJpbWl0aXZlKSB7Ci0gICAgY2FzZSBSU19QUklNSVRJVkVfUE9JTlQ6ICAgICAgICAgIHNtLT5tR0xQcmltaXRpdmUgPSBHTF9QT0lOVFM7IGJyZWFrOwotICAgIGNhc2UgUlNfUFJJTUlUSVZFX0xJTkU6ICAgICAgICAgICBzbS0+bUdMUHJpbWl0aXZlID0gR0xfTElORVM7IGJyZWFrOwotICAgIGNhc2UgUlNfUFJJTUlUSVZFX0xJTkVfU1RSSVA6ICAgICBzbS0+bUdMUHJpbWl0aXZlID0gR0xfTElORV9TVFJJUDsgYnJlYWs7Ci0gICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEU6ICAgICAgIHNtLT5tR0xQcmltaXRpdmUgPSBHTF9UUklBTkdMRVM7IGJyZWFrOwotICAgIGNhc2UgUlNfUFJJTUlUSVZFX1RSSUFOR0xFX1NUUklQOiBzbS0+bUdMUHJpbWl0aXZlID0gR0xfVFJJQU5HTEVfU1RSSVA7IGJyZWFrOwotICAgIGNhc2UgUlNfUFJJTUlUSVZFX1RSSUFOR0xFX0ZBTjogICBzbS0+bUdMUHJpbWl0aXZlID0gR0xfVFJJQU5HTEVfRkFOOyBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHNtOwotfQotCi12b2lkIHJzaV9TaW1wbGVNZXNoQmluZFZlcnRleChDb250ZXh0ICpyc2MsIFJzU2ltcGxlTWVzaCBtdiwgUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCBzbG90KQotewotICAgIFNpbXBsZU1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPihtdik7Ci0gICAgcnNBc3NlcnQoc2xvdCA8IHNtLT5tVmVydGV4VHlwZUNvdW50KTsKLQotICAgIHNtLT5tVmVydGV4QnVmZmVyc1tzbG90XS5zZXQoKEFsbG9jYXRpb24gKil2YSk7Ci19Ci0KLXZvaWQgcnNpX1NpbXBsZU1lc2hCaW5kSW5kZXgoQ29udGV4dCAqcnNjLCBSc1NpbXBsZU1lc2ggbXYsIFJzQWxsb2NhdGlvbiB2YSkKLXsKLSAgICBTaW1wbGVNZXNoICpzbSA9IHN0YXRpY19jYXN0PFNpbXBsZU1lc2ggKj4obXYpOwotICAgIHNtLT5tSW5kZXhCdWZmZXIuc2V0KChBbGxvY2F0aW9uICopdmEpOwotfQotCi12b2lkIHJzaV9TaW1wbGVNZXNoQmluZFByaW1pdGl2ZShDb250ZXh0ICpyc2MsIFJzU2ltcGxlTWVzaCBtdiwgUnNBbGxvY2F0aW9uIHZhKQotewotICAgIFNpbXBsZU1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPihtdik7Ci0gICAgc20tPm1QcmltaXRpdmVCdWZmZXIuc2V0KChBbGxvY2F0aW9uICopdmEpOwotfQotCi0KLQotCi19fQotCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2ltcGxlTWVzaC5oIGIvbGlicy9ycy9yc1NpbXBsZU1lc2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlZmJkYS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzU2ltcGxlTWVzaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9SU19TSU1QTEVfTUVTSF9ICi0jZGVmaW5lIEFORFJPSURfUlNfU0lNUExFX01FU0hfSAotCi0KLSNpbmNsdWRlICJSZW5kZXJTY3JpcHQuaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKLQotCi0vLyBBbiBlbGVtZW50IGlzIGEgZ3JvdXAgb2YgQ29tcG9uZW50cyB0aGF0IG9jY3VwaWVzIG9uZSBjZWxsIGluIGEgc3RydWN0dXJlLgotY2xhc3MgU2ltcGxlTWVzaCA6IHB1YmxpYyBPYmplY3RCYXNlCi17Ci1wdWJsaWM6Ci0gICAgU2ltcGxlTWVzaChDb250ZXh0ICopOwotICAgIH5TaW1wbGVNZXNoKCk7Ci0KLSAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFR5cGU+IG1JbmRleFR5cGU7Ci0gICAgT2JqZWN0QmFzZVJlZjxjb25zdCBUeXBlPiBtUHJpbWl0aXZlVHlwZTsKLSAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFR5cGU+ICptVmVydGV4VHlwZXM7Ci0gICAgdWludDMyX3QgbVZlcnRleFR5cGVDb3VudDsKLQotICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbUluZGV4QnVmZmVyOwotICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbVByaW1pdGl2ZUJ1ZmZlcjsKLSAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+ICptVmVydGV4QnVmZmVyczsKLQotICAgIFJzUHJpbWl0aXZlIG1QcmltaXRpdmU7Ci0gICAgdWludDMyX3QgbUdMUHJpbWl0aXZlOwotCi0KLSAgICB2b2lkIHJlbmRlcihDb250ZXh0ICopIGNvbnN0OwotICAgIHZvaWQgcmVuZGVyUmFuZ2UoQ29udGV4dCAqLCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuKSBjb25zdDsKLSAgICB2b2lkIHVwbG9hZEFsbChDb250ZXh0ICopOwotCi0KLXByb3RlY3RlZDoKLX07Ci0KLWNsYXNzIFNpbXBsZU1lc2hDb250ZXh0Ci17Ci1wdWJsaWM6Ci0gICAgU2ltcGxlTWVzaENvbnRleHQoKTsKLSAgICB+U2ltcGxlTWVzaENvbnRleHQoKTsKLQotCi19OwotCi0KLX0KLX0KLSNlbmRpZiAvL0FORFJPSURfUlNfU0lNUExFX01FU0hfSAotCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU3RyZWFtLmNwcCBiL2xpYnMvcnMvcnNTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MjQxZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzU3RyZWFtLmNwcApAQCAtMCwwICsxLDEzMSBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInJzU3RyZWFtLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworSVN0cmVhbTo6SVN0cmVhbShjb25zdCB1aW50OF90ICpidWYsIGJvb2wgdXNlNjQpCit7CisgICAgbURhdGEgPSBidWY7CisgICAgbVBvcyA9IDA7CisgICAgbVVzZTY0ID0gdXNlNjQ7Cit9CisKK3ZvaWQgSVN0cmVhbTo6bG9hZEJ5dGVBcnJheSh2b2lkICpkZXN0LCBzaXplX3QgbnVtQnl0ZXMpCit7CisgICAgbWVtY3B5KGRlc3QsIG1EYXRhICsgbVBvcywgbnVtQnl0ZXMpOworICAgIG1Qb3MgKz0gbnVtQnl0ZXM7Cit9CisKK3VpbnQ2NF90IElTdHJlYW06OmxvYWRPZmZzZXQoKQoreworICAgIHVpbnQ2NF90IHRtcDsKKyAgICBpZiAobVVzZTY0KSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDcpICYgKH43KTsKKyAgICAgICAgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCAqPigmbURhdGFbbVBvc10pWzBdOworICAgICAgICBtUG9zICs9IHNpemVvZih1aW50NjRfdCk7CisgICAgICAgIHJldHVybiB0bXA7CisgICAgfQorICAgIHJldHVybiBsb2FkVTMyKCk7Cit9CisKK3ZvaWQgSVN0cmVhbTo6bG9hZFN0cmluZyhTdHJpbmc4ICpzKQoreworICAgIHVpbnQzMl90IGxlbiA9IGxvYWRVMzIoKTsKKyAgICBzLT5zZXRUbygoY29uc3QgY2hhciAqKSZtRGF0YVttUG9zXSwgbGVuKTsKKyAgICBtUG9zICs9IGxlbjsKK30KKworCisvLyBPdXRwdXQgc3RyZWFtIGltcGxlbWVudGF0aW9uCisKK09TdHJlYW06Ok9TdHJlYW0odWludDY0X3QgbGVuLCBib29sIHVzZTY0KQoreworICAgIG1EYXRhID0gKHVpbnQ4X3QqKW1hbGxvYyhsZW4pOworICAgIG1MZW5ndGggPSBsZW47CisgICAgbVBvcyA9IDA7CisgICAgbVVzZTY0ID0gdXNlNjQ7Cit9CisKK09TdHJlYW06On5PU3RyZWFtKCkKK3sKKyAgICBmcmVlKG1EYXRhKTsKK30KKwordm9pZCBPU3RyZWFtOjphZGRCeXRlQXJyYXkoY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbnVtQnl0ZXMpCit7CisgICAgLy8gV2UgbmVlZCB0byBwb3RlbnRpYWxseSBncm93IG1vcmUgdGhhbiBvbmNlIGlmIHRoZSBudW1iZXIgb2YgYnllcyB3ZSB3cml0ZSBpcyBzdWJzdGFudGlhbAorICAgIHdoaWxlKG1Qb3MgKyBudW1CeXRlcyA+PSBtTGVuZ3RoKSB7CisgICAgICAgIGdyb3dTaXplKCk7CisgICAgfQorICAgIG1lbWNweShtRGF0YSArIG1Qb3MsIHNyYywgbnVtQnl0ZXMpOworICAgIG1Qb3MgKz0gbnVtQnl0ZXM7Cit9CisKK3ZvaWQgT1N0cmVhbTo6YWRkT2Zmc2V0KHVpbnQ2NF90IHYpCit7CisgICAgaWYgKG1Vc2U2NCkgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyA3KSAmICh+Nyk7CisgICAgICAgIGlmKG1Qb3MgKyBzaXplb2YodikgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKHYgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDE2KSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDI0KSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDMyKSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDQwKSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDQ4KSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDU2KSAmIDB4ZmYpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYWRkVTMyKHYpOworICAgIH0KK30KKwordm9pZCBPU3RyZWFtOjphZGRTdHJpbmcoU3RyaW5nOCAqcykKK3sKKyAgICB1aW50MzJfdCBsZW4gPSBzLT5zaXplKCk7CisgICAgYWRkVTMyKGxlbik7CisgICAgaWYobVBvcyArIGxlbipzaXplb2YoY2hhcikgPj0gbUxlbmd0aCkgeworICAgICAgICBncm93U2l6ZSgpOworICAgIH0KKyAgICBjaGFyICpzdHJpbmdEYXRhID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KCZtRGF0YVttUG9zXSk7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbGVuOyBpICsrKSB7CisgICAgICAgIHN0cmluZ0RhdGFbaV0gPSBzLT5zdHJpbmcoKVtpXTsKKyAgICB9CisgICAgbVBvcyArPSBsZW4qc2l6ZW9mKGNoYXIpOworfQorCit2b2lkIE9TdHJlYW06Omdyb3dTaXplKCkKK3sKKyAgICB1aW50OF90ICpuZXdEYXRhID0gKHVpbnQ4X3QqKW1hbGxvYyhtTGVuZ3RoKjIpOworICAgIG1lbWNweShuZXdEYXRhLCBtRGF0YSwgbUxlbmd0aCpzaXplb2YodWludDhfdCkpOworICAgIG1MZW5ndGggPSBtTGVuZ3RoICogMjsKKyAgICBmcmVlKG1EYXRhKTsKKyAgICBtRGF0YSA9IG5ld0RhdGE7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1N0cmVhbS5oIGIvbGlicy9ycy9yc1N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MDFjZDEyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc1N0cmVhbS5oCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX1NUUkVBTV9ICisjZGVmaW5lIEFORFJPSURfUlNfU1RSRUFNX0gKKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitjbGFzcyBJU3RyZWFtCit7CitwdWJsaWM6CisgICAgSVN0cmVhbShjb25zdCB1aW50OF90ICosIGJvb2wgdXNlNjQpOworCisgICAgZmxvYXQgbG9hZEYoKSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDMpICYgKH4zKTsKKyAgICAgICAgZmxvYXQgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCAqPigmbURhdGFbbVBvc10pWzBdOworICAgICAgICBtUG9zICs9IHNpemVvZihmbG9hdCk7CisgICAgICAgIHJldHVybiB0bXA7CisgICAgfQorICAgIGludDMyX3QgbG9hZEkzMigpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOworICAgICAgICBpbnQzMl90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MzJfdCAqPigmbURhdGFbbVBvc10pWzBdOworICAgICAgICBtUG9zICs9IHNpemVvZihpbnQzMl90KTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAgdWludDMyX3QgbG9hZFUzMigpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOworICAgICAgICB1aW50MzJfdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAgdWludDE2X3QgbG9hZFUxNigpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMSkgJiAofjEpOworICAgICAgICB1aW50MTZfdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQxNl90ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAgaW5saW5lIHVpbnQ4X3QgbG9hZFU4KCkgeworICAgICAgICB1aW50OF90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigmbURhdGFbbVBvc10pWzBdOworICAgICAgICBtUG9zICs9IHNpemVvZih1aW50OF90KTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAgdm9pZCBsb2FkQnl0ZUFycmF5KHZvaWQgKmRlc3QsIHNpemVfdCBudW1CeXRlcyk7CisgICAgdWludDY0X3QgbG9hZE9mZnNldCgpOworICAgIHZvaWQgbG9hZFN0cmluZyhTdHJpbmc4ICpzKTsKKyAgICB1aW50NjRfdCBnZXRQb3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUG9zOworICAgIH0KKyAgICB2b2lkIHJlc2V0KHVpbnQ2NF90IHBvcykgeworICAgICAgICBtUG9zID0gcG9zOworICAgIH0KKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICBtUG9zID0gMDsKKyAgICB9CisgICAgCisgICAgY29uc3QgdWludDhfdCAqIGdldFB0cigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KK3Byb3RlY3RlZDoKKyAgICBjb25zdCB1aW50OF90ICogbURhdGE7CisgICAgdWludDY0X3QgbVBvczsKKyAgICBib29sIG1Vc2U2NDsKK307CisKK2NsYXNzIE9TdHJlYW0KK3sKK3B1YmxpYzoKKyAgICBPU3RyZWFtKHVpbnQ2NF90IGxlbmd0aCwgYm9vbCB1c2U2NCk7CisgICAgfk9TdHJlYW0oKTsKKyAgICAKKyAgICB2b2lkIGFsaWduKHVpbnQzMl90IGJ5dGVzKSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIChieXRlcyAtIDEpKSAmICh+KGJ5dGVzIC0gMSkpOworICAgICAgICBpZihtUG9zID49IG1MZW5ndGgpIHsKKyAgICAgICAgICAgIGdyb3dTaXplKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBhZGRGKGZsb2F0IHYpIHsKKyAgICAgICAgdWludDMyX3QgdWludFYgPSAqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+ICgmdik7CisgICAgICAgIGFkZFUzMih1aW50Vik7CisgICAgfQorICAgIHZvaWQgYWRkSTMyKGludDMyX3QgdikgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAzKSAmICh+Myk7CisgICAgICAgIGlmKG1Qb3MgKyBzaXplb2YodikgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKHYgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiA4KSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDE2KSAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDI0KSAmIDB4ZmYpOworICAgIH0KKyAgICB2b2lkIGFkZFUzMih1aW50MzJfdCB2KSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDMpICYgKH4zKTsKKyAgICAgICAgaWYobVBvcyArIHNpemVvZih2KSA+PSBtTGVuZ3RoKSB7CisgICAgICAgICAgICBncm93U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkodiAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMTYpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMjQpICYgMHhmZik7CisgICAgfQorICAgIHZvaWQgYWRkVTE2KHVpbnQxNl90IHYpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMSkgJiAofjEpOworICAgICAgICBpZihtUG9zICsgc2l6ZW9mKHYpID49IG1MZW5ndGgpIHsKKyAgICAgICAgICAgIGdyb3dTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSh2ICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkodiA+PiA4KTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgYWRkVTgodWludDhfdCB2KSB7CisgICAgICAgIGlmKG1Qb3MgKyAxID49IG1MZW5ndGgpIHsKKyAgICAgICAgICAgIGdyb3dTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KCZtRGF0YVttUG9zXSlbMF0gPSB2OworICAgICAgICBtUG9zICsrOworICAgIH0KKyAgICB2b2lkIGFkZEJ5dGVBcnJheShjb25zdCB2b2lkICpzcmMsIHNpemVfdCBudW1CeXRlcyk7CisgICAgdm9pZCBhZGRPZmZzZXQodWludDY0X3Qgdik7CisgICAgdm9pZCBhZGRTdHJpbmcoU3RyaW5nOCAqcyk7CisgICAgdWludDY0X3QgZ2V0UG9zKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVBvczsKKyAgICB9CisgICAgdm9pZCByZXNldCh1aW50NjRfdCBwb3MpIHsKKyAgICAgICAgbVBvcyA9IHBvczsKKyAgICB9CisgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgbVBvcyA9IDA7CisgICAgfQorICAgIGNvbnN0IHVpbnQ4X3QgKiBnZXRQdHIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGF0YTsKKyAgICB9Citwcm90ZWN0ZWQ6CisgICAgdm9pZCBncm93U2l6ZSgpOworICAgIHVpbnQ4X3QgKiBtRGF0YTsKKyAgICB1aW50NjRfdCBtTGVuZ3RoOworICAgIHVpbnQ2NF90IG1Qb3M7CisgICAgYm9vbCBtVXNlNjQ7Cit9OworICAgIAorCit9IC8vIHJlbmRlcnNjcmlwdAorfSAvLyBhbmRyb2lkCisjZW5kaWYgLy9BTkRST0lEX1JTX1NUUkVBTV9ICisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1R5cGUuY3BwIGIvbGlicy9ycy9yc1R5cGUuY3BwCmluZGV4IGMwOWU5NzkuLjhjZGI0OGEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNUeXBlLmNwcAorKysgYi9saWJzL3JzL3JzVHlwZS5jcHAKQEAgLTE0LDggKzE0LDEzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKICNpbmNsdWRlIDxHTEVTL2dsLmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtODQsNyArODksOSBAQAogICAgICAgICBtTE9EQ291bnQgPSAxOwogICAgIH0KICAgICBpZiAobUxPRENvdW50ICE9IG9sZExPRENvdW50KSB7Ci0gICAgICAgIGRlbGV0ZSBbXSBtTE9EczsKKyAgICAgICAgaWYobUxPRHMpeworICAgICAgICAgICAgZGVsZXRlIFtdIG1MT0RzOworICAgICAgICB9CiAgICAgICAgIG1MT0RzID0gbmV3IExPRFttTE9EQ291bnRdOwogICAgIH0KIApAQCAtMTM5LDEzNSArMTQ2LDM1IEBACiB2b2lkIFR5cGU6Om1ha2VHTENvbXBvbmVudHMoKQogewogICAgIHVpbnQzMl90IHVzZXJOdW0gPSAwOwotCiAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IGdldEVsZW1lbnQoKS0+Z2V0RmllbGRDb3VudCgpOyBjdCsrKSB7CiAgICAgICAgIGNvbnN0IENvbXBvbmVudCAmYyA9IGdldEVsZW1lbnQoKS0+Z2V0RmllbGQoY3QpLT5nZXRDb21wb25lbnQoKTsKIAotICAgICAgICBzd2l0Y2goYy5nZXRLaW5kKCkpIHsKLSAgICAgICAgY2FzZSBSU19LSU5EX1VTRVI6Ci0gICAgICAgICAgICBtR0wubVVzZXJbdXNlck51bV0uc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOwotICAgICAgICAgICAgbUdMLm1Vc2VyW3VzZXJOdW1dLm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKLSAgICAgICAgICAgIG1HTC5tVXNlclt1c2VyTnVtXS50eXBlID0gYy5nZXRHTFR5cGUoKTsKLSAgICAgICAgICAgIG1HTC5tVXNlclt1c2VyTnVtXS5ub3JtYWxpemVkID0gYy5nZXRUeXBlKCkgIT0gUlNfVFlQRV9GTE9BVF8zMjsvL2MuZ2V0SXNOb3JtYWxpemVkKCk7Ci0gICAgICAgICAgICBtR0wubVVzZXJbdXNlck51bV0ubmFtZS5zZXRUbyhnZXRFbGVtZW50KCktPmdldEZpZWxkTmFtZShjdCkpOwotICAgICAgICAgICAgdXNlck51bSArKzsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZihnZXRFbGVtZW50KCktPmdldEZpZWxkTmFtZShjdClbMF0gPT0gJyMnKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0gICAgICAgIGNhc2UgUlNfS0lORF9QT1NJVElPTjoKLSAgICAgICAgICAgIHJzQXNzZXJ0KG1HTC5tVnR4LnNpemUgPT0gMCk7Ci0gICAgICAgICAgICBtR0wubVZ0eC5zaXplID0gYy5nZXRWZWN0b3JTaXplKCk7Ci0gICAgICAgICAgICBtR0wubVZ0eC5vZmZzZXQgPSBtRWxlbWVudC0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7Ci0gICAgICAgICAgICBtR0wubVZ0eC50eXBlID0gYy5nZXRHTFR5cGUoKTsKLSAgICAgICAgICAgIG1HTC5tVnR4Lm5vcm1hbGl6ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1HTC5tVnR4Lm5hbWUuc2V0VG8oIlBvc2l0aW9uIik7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgbUF0dHJpYnNbdXNlck51bV0uc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOworICAgICAgICBtQXR0cmlic1t1c2VyTnVtXS5vZmZzZXQgPSBtRWxlbWVudC0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7CisgICAgICAgIG1BdHRyaWJzW3VzZXJOdW1dLnR5cGUgPSBjLmdldEdMVHlwZSgpOworICAgICAgICBtQXR0cmlic1t1c2VyTnVtXS5ub3JtYWxpemVkID0gYy5nZXRUeXBlKCkgIT0gUlNfVFlQRV9GTE9BVF8zMjsvL2MuZ2V0SXNOb3JtYWxpemVkKCk7CisgICAgICAgIFN0cmluZzggdG1wKFJTX1NIQURFUl9BVFRSKTsKKyAgICAgICAgdG1wLmFwcGVuZChnZXRFbGVtZW50KCktPmdldEZpZWxkTmFtZShjdCkpOworICAgICAgICBtQXR0cmlic1t1c2VyTnVtXS5uYW1lLnNldFRvKHRtcC5zdHJpbmcoKSk7CisgICAgICAgIHVzZXJOdW0gKys7CiAKLSAgICAgICAgY2FzZSBSU19LSU5EX0NPTE9SOgotICAgICAgICAgICAgcnNBc3NlcnQobUdMLm1Db2xvci5zaXplID09IDApOwotICAgICAgICAgICAgbUdMLm1Db2xvci5zaXplID0gYy5nZXRWZWN0b3JTaXplKCk7Ci0gICAgICAgICAgICBtR0wubUNvbG9yLm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKLSAgICAgICAgICAgIG1HTC5tQ29sb3IudHlwZSA9IGMuZ2V0R0xUeXBlKCk7Ci0gICAgICAgICAgICBtR0wubUNvbG9yLm5vcm1hbGl6ZWQgPSBjLmdldFR5cGUoKSAhPSBSU19UWVBFX0ZMT0FUXzMyOwotICAgICAgICAgICAgbUdMLm1Db2xvci5uYW1lLnNldFRvKCJDb2xvciIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX05PUk1BTDoKLSAgICAgICAgICAgIHJzQXNzZXJ0KG1HTC5tTm9ybS5zaXplID09IDApOwotICAgICAgICAgICAgbUdMLm1Ob3JtLnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKLSAgICAgICAgICAgIG1HTC5tTm9ybS5vZmZzZXQgPSBtRWxlbWVudC0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7Ci0gICAgICAgICAgICBtR0wubU5vcm0udHlwZSA9IGMuZ2V0R0xUeXBlKCk7Ci0gICAgICAgICAgICBtR0wubU5vcm0ubm9ybWFsaXplZCA9IGZhbHNlOwotICAgICAgICAgICAgbUdMLm1Ob3JtLm5hbWUuc2V0VG8oIk5vcm1hbCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX1RFWFRVUkU6Ci0gICAgICAgICAgICByc0Fzc2VydChtR0wubVRleC5zaXplID09IDApOwotICAgICAgICAgICAgbUdMLm1UZXguc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOwotICAgICAgICAgICAgbUdMLm1UZXgub2Zmc2V0ID0gbUVsZW1lbnQtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOwotICAgICAgICAgICAgbUdMLm1UZXgudHlwZSA9IGMuZ2V0R0xUeXBlKCk7Ci0gICAgICAgICAgICBtR0wubVRleC5ub3JtYWxpemVkID0gZmFsc2U7Ci0gICAgICAgICAgICBtR0wubVRleC5uYW1lLnNldFRvKCJUZXh0dXJlIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfUE9JTlRfU0laRToKLSAgICAgICAgICAgIHJzQXNzZXJ0KCFtR0wubVBvaW50U2l6ZS5zaXplKTsKLSAgICAgICAgICAgIG1HTC5tUG9pbnRTaXplLnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKLSAgICAgICAgICAgIG1HTC5tUG9pbnRTaXplLm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKLSAgICAgICAgICAgIG1HTC5tUG9pbnRTaXplLnR5cGUgPSBjLmdldEdMVHlwZSgpOwotICAgICAgICAgICAgbUdMLm1Qb2ludFNpemUubm9ybWFsaXplZCA9IGZhbHNlOwotICAgICAgICAgICAgbUdMLm1Qb2ludFNpemUubmFtZS5zZXRUbygiUG9pbnRTaXplIik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYodXNlck51bSA9PSBSU19NQVhfQVRUUklCUykgeworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQogfQogCisKIHZvaWQgVHlwZTo6ZW5hYmxlR0xWZXJ0ZXhCdWZmZXIoVmVydGV4QXJyYXkgKnZhKSBjb25zdAogewotICAgIC8vIE5vdGU6IFdlIGFyZSBvbmx5IGdvaW5nIHRvIGVuYWJsZSBidWZmZXJzIGFuZCBuZXZlciBkaXNhYmxlIHRoZW0KLSAgICAvLyBoZXJlLiAgVGhlIHJlYXNvbiBpcyBtb3JlIHRoYW4gb25lIEFsbG9jYXRpb24gbWF5IGJlIHVzZWQgYXMgYSB2ZXJ0ZXgKLSAgICAvLyBzb3VyY2UuICBTbyB3ZSBjYW5ub3QgZGlzYWJsZSBhcnJheXMgdGhhdCBtYXkgaGF2ZSBiZWVuIGluIHVzZSBieQotICAgIC8vIGFub3RoZXIgYWxsb2NhdGlvbi4KLQotICAgIHVpbnQzMl90IHN0cmlkZSA9IG1FbGVtZW50LT5nZXRTaXplQnl0ZXMoKTsKLSAgICBpZiAobUdMLm1WdHguc2l6ZSkgewotICAgICAgICB2YS0+YWRkTGVnYWN5KG1HTC5tVnR4LnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgbUdMLm1WdHguc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgUlNfS0lORF9QT1NJVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICBtR0wubVZ0eC5vZmZzZXQpOwotICAgIH0KLQotICAgIGlmIChtR0wubU5vcm0uc2l6ZSkgewotICAgICAgICB2YS0+YWRkTGVnYWN5KG1HTC5tTm9ybS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgMywKLSAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIFJTX0tJTkRfTk9STUFMLAotICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICBtR0wubU5vcm0ub2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBpZiAobUdMLm1Db2xvci5zaXplKSB7Ci0gICAgICAgIHZhLT5hZGRMZWdhY3kobUdMLm1Db2xvci50eXBlLAotICAgICAgICAgICAgICAgICAgICAgbUdMLm1Db2xvci5zaXplLAotICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgUlNfS0lORF9DT0xPUiwKLSAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICBtR0wubUNvbG9yLm9mZnNldCk7Ci0gICAgfQotCi0gICAgaWYgKG1HTC5tVGV4LnNpemUpIHsKLSAgICAgICAgdmEtPmFkZExlZ2FjeShtR0wubVRleC50eXBlLAotICAgICAgICAgICAgICAgICAgICAgbUdMLm1UZXguc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIFJTX0tJTkRfVEVYVFVSRSwKLSAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgbUdMLm1UZXgub2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBpZiAobUdMLm1Qb2ludFNpemUuc2l6ZSkgewotICAgICAgICB2YS0+YWRkTGVnYWN5KG1HTC5tUG9pbnRTaXplLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgUlNfS0lORF9QT0lOVF9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICBtR0wubVBvaW50U2l6ZS5vZmZzZXQpOwotICAgIH0KLQotfQotCi12b2lkIFR5cGU6OmVuYWJsZUdMVmVydGV4QnVmZmVyMihWZXJ0ZXhBcnJheSAqdmEpIGNvbnN0Ci17Ci0gICAgLy8gRG8gbGVnYWN5IGJ1ZmZlcnMKLSAgICBlbmFibGVHTFZlcnRleEJ1ZmZlcih2YSk7Ci0KICAgICB1aW50MzJfdCBzdHJpZGUgPSBtRWxlbWVudC0+Z2V0U2l6ZUJ5dGVzKCk7CiAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IFJTX01BWF9BVFRSSUJTOyBjdCsrKSB7Ci0gICAgICAgIGlmIChtR0wubVVzZXJbY3RdLnNpemUpIHsKLSAgICAgICAgICAgIHZhLT5hZGRVc2VyKG1HTC5tVXNlcltjdF0sIHN0cmlkZSk7CisgICAgICAgIGlmIChtQXR0cmlic1tjdF0uc2l6ZSkgeworICAgICAgICAgICAgdmEtPmFkZChtQXR0cmlic1tjdF0sIHN0cmlkZSk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yODMsNiArMTkwLDU3IEBACiAgICAgbUVsZW1lbnQtPmR1bXBMT0dWKGJ1Zik7CiB9CiAKK3ZvaWQgVHlwZTo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAvLyBOZWVkIHRvIGlkZW50aWZ5IG91cnNlbHZlcworICAgIHN0cmVhbS0+YWRkVTMyKCh1aW50MzJfdClnZXRDbGFzc0lkKCkpOworCisgICAgU3RyaW5nOCBuYW1lKGdldE5hbWUoKSk7CisgICAgc3RyZWFtLT5hZGRTdHJpbmcoJm5hbWUpOworCisgICAgbUVsZW1lbnQtPnNlcmlhbGl6ZShzdHJlYW0pOworCisgICAgc3RyZWFtLT5hZGRVMzIobURpbVgpOworICAgIHN0cmVhbS0+YWRkVTMyKG1EaW1ZKTsKKyAgICBzdHJlYW0tPmFkZFUzMihtRGltWik7CisKKyAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KShtRGltTE9EID8gMSA6IDApKTsKKyAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KShtRmFjZXMgPyAxIDogMCkpOworfQorCitUeXBlICpUeXBlOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIC8vIEZpcnN0IG1ha2Ugc3VyZSB3ZSBhcmUgcmVhZGluZyB0aGUgY29ycmVjdCBvYmplY3QKKyAgICBSc0EzRENsYXNzSUQgY2xhc3NJRCA9IChSc0EzRENsYXNzSUQpc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYoY2xhc3NJRCAhPSBSU19BM0RfQ0xBU1NfSURfVFlQRSkgeworICAgICAgICBMT0dFKCJ0eXBlIGxvYWRpbmcgc2tpcHBlZCBkdWUgdG8gaW52YWxpZCBjbGFzcyBpZFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFN0cmluZzggbmFtZTsKKyAgICBzdHJlYW0tPmxvYWRTdHJpbmcoJm5hbWUpOworCisgICAgRWxlbWVudCAqZWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZUZyb21TdHJlYW0ocnNjLCBzdHJlYW0pOworICAgIGlmKCFlbGVtKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFR5cGUgKnR5cGUgPSBuZXcgVHlwZShyc2MpOworICAgIHR5cGUtPm1EaW1YID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgdHlwZS0+bURpbVkgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICB0eXBlLT5tRGltWiA9IHN0cmVhbS0+bG9hZFUzMigpOworCisgICAgdWludDhfdCB0ZW1wID0gc3RyZWFtLT5sb2FkVTgoKTsKKyAgICB0eXBlLT5tRGltTE9EID0gdGVtcCAhPSAwOworCisgICAgdGVtcCA9IHN0cmVhbS0+bG9hZFU4KCk7CisgICAgdHlwZS0+bUZhY2VzID0gdGVtcCAhPSAwOworCisgICAgdHlwZS0+c2V0RWxlbWVudChlbGVtKTsKKworICAgIHJldHVybiB0eXBlOworfQorCiBib29sIFR5cGU6OmdldElzTnAyKCkgY29uc3QKIHsKICAgICB1aW50MzJfdCB4ID0gZ2V0RGltWCgpOwpAQCAtMzAxLDYgKzI1OSw3MyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAorYm9vbCBUeXBlOjppc0VxdWFsKGNvbnN0IFR5cGUgKm90aGVyKSBjb25zdCB7CisgICAgaWYob3RoZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChvdGhlci0+Z2V0RWxlbWVudCgpLT5pc0VxdWFsKGdldEVsZW1lbnQoKSkgJiYKKyAgICAgICAgb3RoZXItPmdldERpbVgoKSA9PSBtRGltWCAmJgorICAgICAgICBvdGhlci0+Z2V0RGltWSgpID09IG1EaW1ZICYmCisgICAgICAgIG90aGVyLT5nZXREaW1aKCkgPT0gbURpbVogJiYKKyAgICAgICAgb3RoZXItPmdldERpbUxPRCgpID09IG1EaW1MT0QgJiYKKyAgICAgICAgb3RoZXItPmdldERpbUZhY2VzKCkgPT0gbUZhY2VzKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1R5cGUgKiBUeXBlOjpjbG9uZUFuZFJlc2l6ZTFEKENvbnRleHQgKnJzYywgdWludDMyX3QgZGltWCkgY29uc3QKK3sKKyAgICBUeXBlU3RhdGUgKiBzdGMgPSAmcnNjLT5tU3RhdGVUeXBlOworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBzdGMtPm1UeXBlcy5zaXplKCk7IGN0KyspIHsKKyAgICAgICAgVHlwZSAqdCA9IHN0Yy0+bVR5cGVzW2N0XTsKKyAgICAgICAgaWYgKHQtPmdldEVsZW1lbnQoKSAhPSBtRWxlbWVudC5nZXQoKSkgY29udGludWU7CisgICAgICAgIGlmICh0LT5nZXREaW1YKCkgIT0gZGltWCkgY29udGludWU7CisgICAgICAgIGlmICh0LT5nZXREaW1ZKCkgIT0gbURpbVkpIGNvbnRpbnVlOworICAgICAgICBpZiAodC0+Z2V0RGltWigpICE9IG1EaW1aKSBjb250aW51ZTsKKyAgICAgICAgaWYgKHQtPmdldERpbUxPRCgpICE9IG1EaW1MT0QpIGNvbnRpbnVlOworICAgICAgICBpZiAodC0+Z2V0RGltRmFjZXMoKSAhPSBtRmFjZXMpIGNvbnRpbnVlOworICAgICAgICB0LT5pbmNVc2VyUmVmKCk7CisgICAgICAgIHJldHVybiB0OworICAgIH0KKworICAgIFR5cGUgKm50ID0gbmV3IFR5cGUocnNjKTsKKyAgICBudC0+bUVsZW1lbnQuc2V0KG1FbGVtZW50KTsKKyAgICBudC0+bURpbVggPSBkaW1YOworICAgIG50LT5tRGltWSA9IG1EaW1ZOworICAgIG50LT5tRGltWiA9IG1EaW1aOworICAgIG50LT5tRGltTE9EID0gbURpbUxPRDsKKyAgICBudC0+bUZhY2VzID0gbUZhY2VzOworICAgIG50LT5jb21wdXRlKCk7CisgICAgcmV0dXJuIG50OworfQorCitUeXBlICogVHlwZTo6Y2xvbmVBbmRSZXNpemUyRChDb250ZXh0ICpyc2MsIHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpIGNvbnN0Cit7CisgICAgVHlwZVN0YXRlICogc3RjID0gJnJzYy0+bVN0YXRlVHlwZTsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgc3RjLT5tVHlwZXMuc2l6ZSgpOyBjdCsrKSB7CisgICAgICAgIFR5cGUgKnQgPSBzdGMtPm1UeXBlc1tjdF07CisgICAgICAgIGlmICh0LT5nZXRFbGVtZW50KCkgIT0gbUVsZW1lbnQuZ2V0KCkpIGNvbnRpbnVlOworICAgICAgICBpZiAodC0+Z2V0RGltWCgpICE9IGRpbVgpIGNvbnRpbnVlOworICAgICAgICBpZiAodC0+Z2V0RGltWSgpICE9IGRpbVkpIGNvbnRpbnVlOworICAgICAgICBpZiAodC0+Z2V0RGltWigpICE9IG1EaW1aKSBjb250aW51ZTsKKyAgICAgICAgaWYgKHQtPmdldERpbUxPRCgpICE9IG1EaW1MT0QpIGNvbnRpbnVlOworICAgICAgICBpZiAodC0+Z2V0RGltRmFjZXMoKSAhPSBtRmFjZXMpIGNvbnRpbnVlOworICAgICAgICB0LT5pbmNVc2VyUmVmKCk7CisgICAgICAgIHJldHVybiB0OworICAgIH0KKworICAgIFR5cGUgKm50ID0gbmV3IFR5cGUocnNjKTsKKyAgICBudC0+bUVsZW1lbnQuc2V0KG1FbGVtZW50KTsKKyAgICBudC0+bURpbVggPSBkaW1YOworICAgIG50LT5tRGltWSA9IGRpbVk7CisgICAgbnQtPm1EaW1aID0gbURpbVo7CisgICAgbnQtPm1EaW1MT0QgPSBtRGltTE9EOworICAgIG50LT5tRmFjZXMgPSBtRmFjZXM7CisgICAgbnQtPmNvbXB1dGUoKTsKKyAgICByZXR1cm4gbnQ7Cit9CisKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vCkBAIC0zNDksOCArMzc0LDYgQEAKICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0KLSAgICBpbnQzMl90IGFycmF5TnVtID0gZGltIC0gUlNfRElNRU5TSU9OX0FSUkFZXzA7CiAgICAgaWYgKChkaW0gPCAwKSB8fCAoZGltID4gUlNfRElNRU5TSU9OX01BWCkpIHsKICAgICAgICAgTE9HRSgicnNUeXBlQWRkOiBCYWQgZGltZW5zaW9uIik7CiAgICAgICAgIC8vZXJyb3IKQEAgLTM5MSw2ICs0MTQsMjIgQEAKICAgICByZXR1cm4gc3Q7CiB9CiAKK3ZvaWQgcnNpX1R5cGVHZXROYXRpdmVEYXRhKENvbnRleHQgKnJzYywgUnNUeXBlIHR5cGUsIHVpbnQzMl90ICp0eXBlRGF0YSwgdWludDMyX3QgdHlwZURhdGFTaXplKQoreworICAgIHJzQXNzZXJ0KHR5cGVEYXRhU2l6ZSA9PSA2KTsKKyAgICAvLyBQYWNrIHRoZSBkYXRhIGluIHRoZSBmb2xsb2Zpbmcgd2F5IG1EaW1YOyBtRGltWTsgbURpbVo7CisgICAgLy8gbURpbUxPRDsgbURpbUZhY2VzOyBtRWxlbWVudDsgaW50byB0eXBlRGF0YQorICAgIFR5cGUgKnQgPSBzdGF0aWNfY2FzdDxUeXBlICo+KHR5cGUpOworCisgICAgKCp0eXBlRGF0YSsrKSA9IHQtPmdldERpbVgoKTsKKyAgICAoKnR5cGVEYXRhKyspID0gdC0+Z2V0RGltWSgpOworICAgICgqdHlwZURhdGErKykgPSB0LT5nZXREaW1aKCk7CisgICAgKCp0eXBlRGF0YSsrKSA9IHQtPmdldERpbUxPRCgpOworICAgICgqdHlwZURhdGErKykgPSB0LT5nZXREaW1GYWNlcygpID8gMSA6IDA7CisgICAgKCp0eXBlRGF0YSsrKSA9ICh1aW50MzJfdCl0LT5nZXRFbGVtZW50KCk7CisKK30KKwogCiB9CiB9CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzVHlwZS5oIGIvbGlicy9ycy9yc1R5cGUuaAppbmRleCBjMjU1NzdjLi5iNTU0OGMwIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzVHlwZS5oCisrKyBiL2xpYnMvcnMvcnNUeXBlLmgKQEAgLTcxLDkgKzcxLDE2IEBACiAgICAgdm9pZCBjb21wdXRlKCk7CiAKICAgICB2b2lkIGVuYWJsZUdMVmVydGV4QnVmZmVyKGNsYXNzIFZlcnRleEFycmF5ICopIGNvbnN0OwotICAgIHZvaWQgZW5hYmxlR0xWZXJ0ZXhCdWZmZXIyKGNsYXNzIFZlcnRleEFycmF5ICopIGNvbnN0OwogCiAgICAgdm9pZCBkdW1wTE9HVihjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX1RZUEU7IH0KKyAgICBzdGF0aWMgVHlwZSAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CisKKyAgICBib29sIGlzRXF1YWwoY29uc3QgVHlwZSAqb3RoZXIpIGNvbnN0OworCisgICAgVHlwZSAqIGNsb25lQW5kUmVzaXplMUQoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBkaW1YKSBjb25zdDsKKyAgICBUeXBlICogY2xvbmVBbmRSZXNpemUyRChDb250ZXh0ICpyc2MsIHVpbnQzMl90IGRpbVgsIHVpbnQzMl90IGRpbVkpIGNvbnN0OwogCiBwcm90ZWN0ZWQ6CiAgICAgc3RydWN0IExPRCB7CkBAIC0xMTIsMTUgKzExOSw3IEBACiAgICAgTE9EICptTE9EczsKICAgICB1aW50MzJfdCBtTE9EQ291bnQ7CiAKLSAgICBzdHJ1Y3QgR0xTdGF0ZV90IHsKLSAgICAgICAgVmVydGV4QXJyYXk6OkF0dHJpYiBtVXNlcltSU19NQVhfQVRUUklCU107Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbVZ0eDsKLSAgICAgICAgVmVydGV4QXJyYXk6OkF0dHJpYiBtTm9ybTsKLSAgICAgICAgVmVydGV4QXJyYXk6OkF0dHJpYiBtQ29sb3I7Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbVRleDsKLSAgICAgICAgVmVydGV4QXJyYXk6OkF0dHJpYiBtUG9pbnRTaXplOwotICAgIH07Ci0gICAgR0xTdGF0ZV90IG1HTDsKKyAgICBWZXJ0ZXhBcnJheTo6QXR0cmliIG1BdHRyaWJzW1JTX01BWF9BVFRSSUJTXTsKICAgICB2b2lkIG1ha2VHTENvbXBvbmVudHMoKTsKIAogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNVdGlscy5oIGIvbGlicy9ycy9yc1V0aWxzLmgKaW5kZXggMDdmODkzMy4uMTdmZWIyMiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1V0aWxzLmgKKysrIGIvbGlicy9ycy9yc1V0aWxzLmgKQEAgLTE5LDE1ICsxOSwyMyBAQAogCiAjZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJSZW5kZXJTY3JpcHQiCisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorCisjaW5jbHVkZSAicnNTdHJlYW0uaCIKKwogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKwogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlIDxFR0wvZWdsLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPG1hdGguaD4KIAogI2luY2x1ZGUgIlJlbmRlclNjcmlwdC5oIgpAQCAtNDEsNiArNDksMjYgQEAKICNkZWZpbmUgcnNBc3NlcnQodikgd2hpbGUoMCkKICNlbmRpZgogCit0eXBlZGVmIGZsb2F0IHJzdkZfMiBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDgpKSk7Cit0eXBlZGVmIGZsb2F0IHJzdkZfNCBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDE2KSkpOwordHlwZWRlZiB1aW50OF90IHJzdlU4XzQgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICg0KSkpOworCit1bmlvbiBmbG9hdDIgeworICAgIHJzdkZfMiB2OworICAgIGZsb2F0IGZbMl07Cit9OworCit1bmlvbiBmbG9hdDQgeworICAgIHJzdkZfNCB2OworICAgIGZsb2F0IGZbNF07Cit9OworCit1bmlvbiB1Y2hhcjQgeworICAgIHJzdlU4XzQgdjsKKyAgICB1aW50OF90IGZbNF07CisgICAgdWludDMyX3QgcGFja2VkOworfTsKKwogdGVtcGxhdGU8dHlwZW5hbWUgVD4KIFQgcnNNaW4oVCBpbjEsIFQgaW4yKQogewpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1ZlcnRleEFycmF5LmNwcCBiL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5jcHAKaW5kZXggNmMyMDAyZC4uNGQ1MDEyNCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1ZlcnRleEFycmF5LmNwcAorKysgYi9saWJzL3JzL3JzVmVydGV4QXJyYXkuY3BwCkBAIC0xNCwxMCArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2VuZGlmCisKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMzksNiArNDQsNyBAQAogICAgICAgICBtQXR0cmlic1tjdF0uY2xlYXIoKTsKICAgICB9CiAgICAgbUFjdGl2ZUJ1ZmZlciA9IDA7CisgICAgbUFjdGl2ZVBvaW50ZXIgPSBOVUxMOwogICAgIG1Db3VudCA9IDA7CiB9CiAKQEAgLTUwLDEyICs1NiwxMiBAQAogdm9pZCBWZXJ0ZXhBcnJheTo6QXR0cmliOjpzZXQoY29uc3QgQXR0cmliICZhKQogewogICAgIGJ1ZmZlciA9IGEuYnVmZmVyOworICAgIHB0ciA9IGEucHRyOwogICAgIG9mZnNldCA9IGEub2Zmc2V0OwogICAgIHR5cGUgPSBhLnR5cGU7CiAgICAgc2l6ZSA9IGEuc2l6ZTsKICAgICBzdHJpZGUgPSBhLnN0cmlkZTsKICAgICBub3JtYWxpemVkID0gYS5ub3JtYWxpemVkOwotICAgIGtpbmQgPSBSU19LSU5EX1VTRVI7CiAgICAgbmFtZS5zZXRUbyhhLm5hbWUpOwogfQogCkBAIC02Niw2ICs3Miw3IEBACiAgICAgdHlwZSA9IDA7CiAgICAgc2l6ZSA9IDA7CiAgICAgc3RyaWRlID0gMDsKKyAgICBwdHIgPSBOVUxMOwogICAgIG5vcm1hbGl6ZWQgPSBmYWxzZTsKICAgICBuYW1lLnNldFRvKCIiKTsKIH0KQEAgLTc1LDEzOCArODIsNzIgQEAKICAgICBtQXR0cmlic1tuXS5jbGVhcigpOwogfQogCi12b2lkIFZlcnRleEFycmF5OjphZGRVc2VyKGNvbnN0IEF0dHJpYiAmYSwgdWludDMyX3Qgc3RyaWRlKQordm9pZCBWZXJ0ZXhBcnJheTo6YWRkKGNvbnN0IEF0dHJpYiAmYSwgdWludDMyX3Qgc3RyaWRlKQogewotICAgIGFzc2VydChtQ291bnQgPCBSU19NQVhfQVRUUklCUyk7CisgICAgcnNBc3NlcnQobUNvdW50IDwgUlNfTUFYX0FUVFJJQlMpOwogICAgIG1BdHRyaWJzW21Db3VudF0uc2V0KGEpOwogICAgIG1BdHRyaWJzW21Db3VudF0uYnVmZmVyID0gbUFjdGl2ZUJ1ZmZlcjsKKyAgICBtQXR0cmlic1ttQ291bnRdLnB0ciA9IG1BY3RpdmVQb2ludGVyOwogICAgIG1BdHRyaWJzW21Db3VudF0uc3RyaWRlID0gc3RyaWRlOwotICAgIG1BdHRyaWJzW21Db3VudF0ua2luZCA9IFJTX0tJTkRfVVNFUjsKICAgICBtQ291bnQgKys7CiB9CiAKLXZvaWQgVmVydGV4QXJyYXk6OmFkZExlZ2FjeSh1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBzdHJpZGUsIFJzRGF0YUtpbmQga2luZCwgYm9vbCBub3JtYWxpemVkLCB1aW50MzJfdCBvZmZzZXQpCit2b2lkIFZlcnRleEFycmF5OjphZGQodWludDMyX3QgdHlwZSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3Qgc3RyaWRlLCBib29sIG5vcm1hbGl6ZWQsIHVpbnQzMl90IG9mZnNldCwgY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgICBhc3NlcnQobUNvdW50IDwgUlNfTUFYX0FUVFJJQlMpOworICAgIHJzQXNzZXJ0KG1Db3VudCA8IFJTX01BWF9BVFRSSUJTKTsKICAgICBtQXR0cmlic1ttQ291bnRdLmNsZWFyKCk7CiAgICAgbUF0dHJpYnNbbUNvdW50XS50eXBlID0gdHlwZTsKICAgICBtQXR0cmlic1ttQ291bnRdLnNpemUgPSBzaXplOwogICAgIG1BdHRyaWJzW21Db3VudF0ub2Zmc2V0ID0gb2Zmc2V0OwogICAgIG1BdHRyaWJzW21Db3VudF0ubm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQ7Ci0gICAgbUF0dHJpYnNbbUNvdW50XS5idWZmZXIgPSBtQWN0aXZlQnVmZmVyOwogICAgIG1BdHRyaWJzW21Db3VudF0uc3RyaWRlID0gc3RyaWRlOwotICAgIG1BdHRyaWJzW21Db3VudF0ua2luZCA9IGtpbmQ7CisgICAgbUF0dHJpYnNbbUNvdW50XS5uYW1lLnNldFRvKG5hbWUpOworCisgICAgbUF0dHJpYnNbbUNvdW50XS5idWZmZXIgPSBtQWN0aXZlQnVmZmVyOworICAgIG1BdHRyaWJzW21Db3VudF0ucHRyID0gbUFjdGl2ZVBvaW50ZXI7CiAgICAgbUNvdW50ICsrOwogfQogCiB2b2lkIFZlcnRleEFycmF5Ojpsb2dBdHRyaWIodWludDMyX3QgaWR4LCB1aW50MzJfdCBzbG90KSBjb25zdCB7Ci0gICAgTE9HRSgidmEgJWk6IHNsb3Q9JWkgbmFtZT0lcyBidWY9JWkgIHNpemU9JWkgIHR5cGU9MHgleCAga2luZD0laSAgc3RyaWRlPTB4JXggIG5vcm09JWkgIG9mZnNldD0weCV4IiwgaWR4LCBzbG90LAorICAgIGlmKGlkeCA9PSAwKSB7CisgICAgICAgIExPR1YoIlN0YXJ0aW5nIHZlcnRleCBhdHRyaWJ1dGUgYmluZGluZyIpOworICAgIH0KKyAgICBMT0dWKCJ2YSAlaTogc2xvdD0laSBuYW1lPSVzIGJ1Zj0laSBwdHI9JXAgc2l6ZT0laSAgdHlwZT0weCV4ICBzdHJpZGU9MHgleCAgbm9ybT0laSAgb2Zmc2V0PTB4JXgiLAorICAgICAgICAgaWR4LCBzbG90LAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5uYW1lLnN0cmluZygpLAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5idWZmZXIsCisgICAgICAgICBtQXR0cmlic1tpZHhdLnB0ciwKICAgICAgICAgIG1BdHRyaWJzW2lkeF0uc2l6ZSwKICAgICAgICAgIG1BdHRyaWJzW2lkeF0udHlwZSwKLSAgICAgICAgIG1BdHRyaWJzW2lkeF0ua2luZCwKICAgICAgICAgIG1BdHRyaWJzW2lkeF0uc3RyaWRlLAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5ub3JtYWxpemVkLAogICAgICAgICAgbUF0dHJpYnNbaWR4XS5vZmZzZXQpOwogfQogCi12b2lkIFZlcnRleEFycmF5OjpzZXR1cEdMKGNvbnN0IENvbnRleHQgKnJzYywgY2xhc3MgVmVydGV4QXJyYXlTdGF0ZSAqc3RhdGUpIGNvbnN0Ci17Ci0gICAgZ2xDbGllbnRBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKLSAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpOwotICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX0NPTE9SX0FSUkFZKTsKLSAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKLSAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9QT0lOVF9TSVpFX0FSUkFZX09FUyk7Ci0KLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvdW50OyBjdCsrKSB7Ci0gICAgICAgIHN3aXRjaChtQXR0cmlic1tjdF0ua2luZCkgewotICAgICAgICBjYXNlIFJTX0tJTkRfUE9TSVRJT046Ci0gICAgICAgICAgICAvL2xvZ0F0dHJpYihQT1NJVElPTik7Ci0gICAgICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7Ci0gICAgICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLSAgICAgICAgICAgIGdsVmVydGV4UG9pbnRlcihtQXR0cmlic1tjdF0uc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0uc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbUF0dHJpYnNbY3RdLm9mZnNldCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfTk9STUFMOgotICAgICAgICAgICAgLy9sb2dBdHRyaWIoTk9STUFMKTsKLSAgICAgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKLSAgICAgICAgICAgIHJzQXNzZXJ0KG1BdHRyaWJzW2N0XS5zaXplID09IDMpOwotICAgICAgICAgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbUF0dHJpYnNbY3RdLmJ1ZmZlcik7Ci0gICAgICAgICAgICBnbE5vcm1hbFBvaW50ZXIobUF0dHJpYnNbY3RdLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1BdHRyaWJzW2N0XS5vZmZzZXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX0NPTE9SOgotICAgICAgICAgICAgLy9sb2dBdHRyaWIoQ09MT1IpOwotICAgICAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7Ci0gICAgICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLSAgICAgICAgICAgIGdsQ29sb3JQb2ludGVyKG1BdHRyaWJzW2N0XS5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0uc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltQXR0cmlic1tjdF0ub2Zmc2V0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9URVhUVVJFOgotICAgICAgICAgICAgLy9sb2dBdHRyaWIoVEVYVFVSRSk7Ci0gICAgICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwotICAgICAgICAgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbUF0dHJpYnNbY3RdLmJ1ZmZlcik7Ci0gICAgICAgICAgICBnbFRleENvb3JkUG9pbnRlcihtQXR0cmlic1tjdF0uc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbUF0dHJpYnNbY3RdLm9mZnNldCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfUE9JTlRfU0laRToKLSAgICAgICAgICAgIC8vbG9nQXR0cmliKFBPSU5UX1NJWkUpOwotICAgICAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9QT0lOVF9TSVpFX0FSUkFZX09FUyk7Ci0gICAgICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLSAgICAgICAgICAgIGdsUG9pbnRTaXplUG9pbnRlck9FUyhtQXR0cmlic1tjdF0udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0uc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbUF0dHJpYnNbY3RdLm9mZnNldCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcnNBc3NlcnQoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByc2MtPmNoZWNrRXJyb3IoIlZlcnRleEFycmF5OjpzZXR1cEdMIik7Ci19Ci0KIHZvaWQgVmVydGV4QXJyYXk6OnNldHVwR0wyKGNvbnN0IENvbnRleHQgKnJzYywgY2xhc3MgVmVydGV4QXJyYXlTdGF0ZSAqc3RhdGUsIFNoYWRlckNhY2hlICpzYykgY29uc3QKIHsKICAgICByc2MtPmNoZWNrRXJyb3IoIlZlcnRleEFycmF5OjpzZXR1cEdMMiBzdGFydCIpOwotICAgIGZvciAodWludDMyX3QgY3Q9MTsgY3QgPD0gc3RhdGUtPm1MYXN0RW5hYmxlQ291bnQ7IGN0KyspIHsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTE7IGN0IDw9IDB4Zi8qc3RhdGUtPm1MYXN0RW5hYmxlQ291bnQqLzsgY3QrKykgewogICAgICAgICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShjdCk7CiAgICAgfQogCiAgICAgcnNjLT5jaGVja0Vycm9yKCJWZXJ0ZXhBcnJheTo6c2V0dXBHTDIgZGlzYWJsZWQiKTsKICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvdW50OyBjdCsrKSB7Ci0gICAgICAgIHVpbnQzMl90IHNsb3QgPSAwOwotICAgICAgICBpZiAoc2MtPmlzVXNlclZlcnRleFByb2dyYW0oKSkgewotICAgICAgICAgICAgc2xvdCA9IHNjLT52dHhBdHRyaWJTbG90KGN0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtQXR0cmlic1tjdF0ua2luZCA9PSBSU19LSU5EX1VTRVIpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNsb3QgPSBzYy0+dnR4QXR0cmliU2xvdChtQXR0cmlic1tjdF0ua2luZCk7CisgICAgICAgIGludDMyX3Qgc2xvdCA9IHNjLT52dHhBdHRyaWJTbG90KG1BdHRyaWJzW2N0XS5uYW1lKTsKKyAgICAgICAgaWYocnNjLT5wcm9wcy5tTG9nU2hhZGVyc0F0dHIpIHsKKyAgICAgICAgICAgIGxvZ0F0dHJpYihjdCwgc2xvdCk7CiAgICAgICAgIH0KLQotICAgICAgICAvL2xvZ0F0dHJpYihjdCwgc2xvdCk7CisgICAgICAgIGlmKHNsb3QgPCAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogICAgICAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHNsb3QpOwogICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtQXR0cmlic1tjdF0uYnVmZmVyKTsKLQogICAgICAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoc2xvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0ubm9ybWFsaXplZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1BdHRyaWJzW2N0XS5vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnB0ciArIG1BdHRyaWJzW2N0XS5vZmZzZXQpOwogICAgIH0KICAgICBzdGF0ZS0+bUxhc3RFbmFibGVDb3VudCA9IG1Db3VudDsKICAgICByc2MtPmNoZWNrRXJyb3IoIlZlcnRleEFycmF5OjpzZXR1cEdMMiBkb25lIik7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzVmVydGV4QXJyYXkuaCBiL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5oCmluZGV4IDM5MDRjYjYuLmRlYTdkNDEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5oCisrKyBiL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5oCkBAIC0zNywxMyArMzcsMTMgQEAKICAgICBjbGFzcyBBdHRyaWIgewogICAgIHB1YmxpYzoKICAgICAgICAgdWludDMyX3QgYnVmZmVyOworICAgICAgICBjb25zdCB1aW50OF90ICogcHRyOwogICAgICAgICB1aW50MzJfdCBvZmZzZXQ7CiAgICAgICAgIHVpbnQzMl90IHR5cGU7CiAgICAgICAgIHVpbnQzMl90IHNpemU7CiAgICAgICAgIHVpbnQzMl90IHN0cmlkZTsKICAgICAgICAgYm9vbCBub3JtYWxpemVkOwogICAgICAgICBTdHJpbmc4IG5hbWU7Ci0gICAgICAgIFJzRGF0YUtpbmQga2luZDsKIAogICAgICAgICBBdHRyaWIoKTsKICAgICAgICAgdm9pZCBzZXQoY29uc3QgQXR0cmliICYpOwpAQCAtNTIsMTcgKzUyLDI1IEBACiAKIAogICAgIHZvaWQgY2xlYXJBbGwoKTsKLSAgICB2b2lkIHNldEFjdGl2ZUJ1ZmZlcih1aW50MzJfdCBpZCkge21BY3RpdmVCdWZmZXIgPSBpZDt9Ci0gICAgdm9pZCBhZGRVc2VyKGNvbnN0IEF0dHJpYiAmLCB1aW50MzJfdCBzdHJpZGUpOwotICAgIHZvaWQgYWRkTGVnYWN5KHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IHN0cmlkZSwgUnNEYXRhS2luZCBraW5kLCBib29sIG5vcm1hbGl6ZWQsIHVpbnQzMl90IG9mZnNldCk7CisgICAgdm9pZCBzZXRBY3RpdmVCdWZmZXIodWludDMyX3QgaWQpIHsKKyAgICAgICAgbUFjdGl2ZUJ1ZmZlciA9IGlkOworICAgICAgICBtQWN0aXZlUG9pbnRlciA9IE5VTEw7CisgICAgfQorICAgIHZvaWQgc2V0QWN0aXZlQnVmZmVyKGNvbnN0IHZvaWQgKnB0cikgeworICAgICAgICBtQWN0aXZlQnVmZmVyID0gMDsKKyAgICAgICAgbUFjdGl2ZVBvaW50ZXIgPSAoY29uc3QgdWludDhfdCAqKXB0cjsKKyAgICB9CiAKLSAgICB2b2lkIHNldHVwR0woY29uc3QgQ29udGV4dCAqcnNjLCBjbGFzcyBWZXJ0ZXhBcnJheVN0YXRlICopIGNvbnN0OworICAgIHZvaWQgYWRkKGNvbnN0IEF0dHJpYiAmLCB1aW50MzJfdCBzdHJpZGUpOworICAgIHZvaWQgYWRkKHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IHN0cmlkZSwgYm9vbCBub3JtYWxpemVkLCB1aW50MzJfdCBvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUpOworCiAgICAgdm9pZCBzZXR1cEdMMihjb25zdCBDb250ZXh0ICpyc2MsIGNsYXNzIFZlcnRleEFycmF5U3RhdGUgKiwgU2hhZGVyQ2FjaGUgKikgY29uc3Q7CiAgICAgdm9pZCBsb2dBdHRyaWIodWludDMyX3QgaWR4LCB1aW50MzJfdCBzbG90KSBjb25zdDsKIAogcHJvdGVjdGVkOgogICAgIHZvaWQgY2xlYXIodWludDMyX3QgaW5kZXgpOwogICAgIHVpbnQzMl90IG1BY3RpdmVCdWZmZXI7CisgICAgY29uc3QgdWludDhfdCAqIG1BY3RpdmVQb2ludGVyOwogICAgIHVpbnQzMl90IG1Db3VudDsKIAogICAgIEF0dHJpYiBtQXR0cmlic1tSU19NQVhfQVRUUklCU107CkBAIC04MCw3ICs4OCw3IEBACiAKIH0KIH0KLSNlbmRpZiAvL0FORFJPSURfTElHSFRfSAorI2VuZGlmIC8vQU5EUk9JRF9WRVJURVhfQVJSQVlfSAogCiAKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc2dfU2NyaXB0SmF2YUNsYXNzLmNwcCBiL2xpYnMvcnMvcnNnX1NjcmlwdEphdmFDbGFzcy5jcHAKaW5kZXggY2VlOWY1Mi4uMDE2OWI5OCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc2dfU2NyaXB0SmF2YUNsYXNzLmNwcAorKysgYi9saWJzL3JzL3JzZ19TY3JpcHRKYXZhQ2xhc3MuY3BwCkBAIC03LDggKzcsMTIgQEAKIHN0cnVjdCBFbGVtZW50OwogCiBzdHJ1Y3QgRWxlbWVudEZpZWxkIHsKKyAgICAvLyBBbiBFbGVtZW50IEZpZWxkIGlzIGEgY29tYmluYXRpb24gb2YgYW4gRWxlbWVudCB3aXRoIGEgbmFtZSBhc3NpZ25lZC4KKwogICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICAgRWxlbWVudCAqZTsKKworCiAgICAgRWxlbWVudEZpZWxkKGNvbnN0IGNoYXIgKm4sIEVsZW1lbnQgKl9lKSB7CiAgICAgICAgIG5hbWUgPSBuOwogICAgICAgICBlID0gX2U7CkBAIC0yMCwxMiArMjQsMjEgQEAKIH07CiAKIHN0cnVjdCBFbGVtZW50IHsKKyAgICAvLyBBbiBFbGVtZW50IGNhbiB0YWtlIG9uZSBvZiB0d28gZm9ybXMuCisgICAgLy8gMTogQmFzaWMuICBJdCBjb250YWlucyBhIHNpbmdsZSBiYXNpYyB0eXBlIGFuZCB2ZWN0b3Igc2l6ZS4KKyAgICAvLyAyOiBDb21wbGV4LiAgSXQgY29udGFpbnMgYSBsaXN0IG9mIGZpZWxkcyB3aXRoIG5hbWVzLiAgRWFjaCBmaWVsZAorICAgIC8vIHdpbGwgaW4gdHVybiBiZSBhbm90aGVyIGVsZW1lbnQuCisKICAgICBFbGVtZW50RmllbGQgKmZpZWxkczsKLSAgICBzaXplX3QgZmllbGRDb3VudDsKKyAgICBzaXplX3QgZmllbGRDb3VudDsgIC8vIElmIGZpZWxkIGNvdW50IGlzIDAsIHRoZSBlbGVtZW50IGlzIGEgQmFzaWMgdHlwZS4KICAgICBjb25zdCBjaGFyICpuYW1lOwogICAgIGJvb2wgZ2VuZXJhdGVkOwogCisgICAgLy8gVGhlIGJhc2ljIGRhdGEgdHlwZSBmcm9tIFJlbmRlclNjcmlwdC5oCiAgICAgUnNEYXRhVHlwZSBjb21wVHlwZTsKKworICAgIC8vIFRoZSB2ZWN0b3Igc2l6ZSBvZiB0aGUgZGF0YSB0eXBlIGZvciBmbG9hdDIsIGZsb2F0MywgLi4uLgorICAgIC8vIEFsbG93ZWQgc2l6ZXMgYXJlIDIsMyw0LDgsMTYKICAgICB1aW50MzJfdCBjb21wVmVjdG9yU2l6ZTsKIAogICAgIEVsZW1lbnQoKSB7CmRpZmYgLS1naXQgYS9saWJzL3JzL3NjcmlwdGMvcnNfY2wucnNoIGIvbGlicy9ycy9zY3JpcHRjL3JzX2NsLnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDg0NGE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9zY3JpcHRjL3JzX2NsLnJzaApAQCAtMCwwICsxLDc4NSBAQAorI2lmbmRlZiBfX1JTX0NMX1JTSF9fCisjZGVmaW5lIF9fUlNfQ0xfUlNIX18KKworI2RlZmluZSBNX1BJICAgICAgICAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUwMjg4ZiAgIC8qIHBpICovCisKKworLy8gQ29udmVyc2lvbnMKKyNkZWZpbmUgQ1ZUX0ZVTkNfMih0eXBlb3V0LCB0eXBlaW4pIFwKK3N0YXRpYyB0eXBlb3V0IyMyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvbnZlcnRfIyN0eXBlb3V0IyMyKHR5cGVpbiMjMiB2KSB7IFwKKyAgICB0eXBlb3V0IyMyIHIgPSB7KHR5cGVvdXQpdi54LCAodHlwZW91dCl2Lnl9OyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIHR5cGVvdXQjIzMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29udmVydF8jI3R5cGVvdXQjIzModHlwZWluIyMzIHYpIHsgXAorICAgIHR5cGVvdXQjIzMgciA9IHsodHlwZW91dCl2LngsICh0eXBlb3V0KXYueSwgKHR5cGVvdXQpdi56fTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyB0eXBlb3V0IyM0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvbnZlcnRfIyN0eXBlb3V0IyM0KHR5cGVpbiMjNCB2KSB7IFwKKyAgICB0eXBlb3V0IyM0IHIgPSB7KHR5cGVvdXQpdi54LCAodHlwZW91dCl2LnksICh0eXBlb3V0KXYueiwgKHR5cGVvdXQpdi53fTsgXAorICAgIHJldHVybiByOyBcCit9CisKKyNkZWZpbmUgQ1ZUX0ZVTkModHlwZSkgICAgICBDVlRfRlVOQ18yKHR5cGUsIHVjaGFyKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZUX0ZVTkNfMih0eXBlLCBjaGFyKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZUX0ZVTkNfMih0eXBlLCB1c2hvcnQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVlRfRlVOQ18yKHR5cGUsIHNob3J0KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZUX0ZVTkNfMih0eXBlLCBpbnQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVlRfRlVOQ18yKHR5cGUsIHVpbnQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVlRfRlVOQ18yKHR5cGUsIGZsb2F0KQorCitDVlRfRlVOQyhjaGFyKQorQ1ZUX0ZVTkModWNoYXIpCitDVlRfRlVOQyhzaG9ydCkKK0NWVF9GVU5DKHVzaG9ydCkKK0NWVF9GVU5DKGludCkKK0NWVF9GVU5DKHVpbnQpCitDVlRfRlVOQyhmbG9hdCkKKworCisKKy8vIEZsb2F0IG9wcywgNi4xMS4yCisKKyNkZWZpbmUgREVGX0ZVTkNfMShmbmMpIFwKK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0MiB2KSB7IFwKKyAgICBmbG9hdDIgcjsgXAorICAgIHIueCA9IGZuYyh2LngpOyBcCisgICAgci55ID0gZm5jKHYueSk7IFwKKyAgICByZXR1cm4gcjsgXAorfSBcCitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZuYyhmbG9hdDMgdikgeyBcCisgICAgZmxvYXQzIHI7IFwKKyAgICByLnggPSBmbmModi54KTsgXAorICAgIHIueSA9IGZuYyh2LnkpOyBcCisgICAgci56ID0gZm5jKHYueik7IFwKKyAgICByZXR1cm4gcjsgXAorfSBcCitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZuYyhmbG9hdDQgdikgeyBcCisgICAgZmxvYXQ0IHI7IFwKKyAgICByLnggPSBmbmModi54KTsgXAorICAgIHIueSA9IGZuYyh2LnkpOyBcCisgICAgci56ID0gZm5jKHYueik7IFwKKyAgICByLncgPSBmbmModi53KTsgXAorICAgIHJldHVybiByOyBcCit9CisKKyNkZWZpbmUgREVGX0ZVTkNfMihmbmMpIFwKK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0MiB2MSwgZmxvYXQyIHYyKSB7IFwKKyAgICBmbG9hdDIgcjsgXAorICAgIHIueCA9IGZuYyh2MS54LCB2Mi54KTsgXAorICAgIHIueSA9IGZuYyh2MS55LCB2Mi55KTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0MyB2MSwgZmxvYXQzIHYyKSB7IFwKKyAgICBmbG9hdDMgcjsgXAorICAgIHIueCA9IGZuYyh2MS54LCB2Mi54KTsgXAorICAgIHIueSA9IGZuYyh2MS55LCB2Mi55KTsgXAorICAgIHIueiA9IGZuYyh2MS56LCB2Mi56KTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0NCB2MSwgZmxvYXQ0IHYyKSB7IFwKKyAgICBmbG9hdDQgcjsgXAorICAgIHIueCA9IGZuYyh2MS54LCB2Mi54KTsgXAorICAgIHIueSA9IGZuYyh2MS55LCB2Mi55KTsgXAorICAgIHIueiA9IGZuYyh2MS56LCB2Mi56KTsgXAorICAgIHIudyA9IGZuYyh2MS53LCB2Mi56KTsgXAorICAgIHJldHVybiByOyBcCit9CisKKyNkZWZpbmUgREVGX0ZVTkNfMkYoZm5jKSBcCitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZuYyhmbG9hdDIgdjEsIGZsb2F0IHYyKSB7IFwKKyAgICBmbG9hdDIgcjsgXAorICAgIHIueCA9IGZuYyh2MS54LCB2Mik7IFwKKyAgICByLnkgPSBmbmModjEueSwgdjIpOyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQzIHYxLCBmbG9hdCB2MikgeyBcCisgICAgZmxvYXQzIHI7IFwKKyAgICByLnggPSBmbmModjEueCwgdjIpOyBcCisgICAgci55ID0gZm5jKHYxLnksIHYyKTsgXAorICAgIHIueiA9IGZuYyh2MS56LCB2Mik7IFwKKyAgICByZXR1cm4gcjsgXAorfSBcCitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZuYyhmbG9hdDQgdjEsIGZsb2F0IHYyKSB7IFwKKyAgICBmbG9hdDQgcjsgXAorICAgIHIueCA9IGZuYyh2MS54LCB2Mik7IFwKKyAgICByLnkgPSBmbmModjEueSwgdjIpOyBcCisgICAgci56ID0gZm5jKHYxLnosIHYyKTsgXAorICAgIHIudyA9IGZuYyh2MS53LCB2Mik7IFwKKyAgICByZXR1cm4gcjsgXAorfQorCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0KTsKK0RFRl9GVU5DXzEoYWNvcykKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3NoKGZsb2F0KTsKK0RFRl9GVU5DXzEoYWNvc2gpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zcGkoZmxvYXQgdikgeworICAgIHJldHVybiBhY29zKHYpIC8gTV9QSTsKK30KK0RFRl9GVU5DXzEoYWNvc3BpKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXNpbihmbG9hdCk7CitERUZfRlVOQ18xKGFzaW4pCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luaChmbG9hdCk7CitERUZfRlVOQ18xKGFzaW5oKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXNpbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gYXNpbih2KSAvIE1fUEk7Cit9CitERUZfRlVOQ18xKGFzaW5waSkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQpOworREVGX0ZVTkNfMShhdGFuKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQsIGZsb2F0KTsKK0RFRl9GVU5DXzIoYXRhbjIpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuaChmbG9hdCk7CitERUZfRlVOQ18xKGF0YW5oKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gYXRhbih2KSAvIE1fUEk7Cit9CitERUZfRlVOQ18xKGF0YW5waSkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4ycGkoZmxvYXQgeSwgZmxvYXQgeCkgeworICAgIHJldHVybiBhdGFuMih5LCB4KSAvIE1fUEk7Cit9CitERUZfRlVOQ18yKGF0YW4ycGkpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjYnJ0KGZsb2F0KTsKK0RFRl9GVU5DXzEoY2JydCkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNlaWwoZmxvYXQpOworREVGX0ZVTkNfMShjZWlsKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29weXNpZ24oZmxvYXQsIGZsb2F0KTsKK0RFRl9GVU5DXzIoY29weXNpZ24pCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3MoZmxvYXQpOworREVGX0ZVTkNfMShjb3MpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3NoKGZsb2F0KTsKK0RFRl9GVU5DXzEoY29zaCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvc3BpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gY29zKHYgKiBNX1BJKTsKK30KK0RFRl9GVU5DXzEoY29zcGkpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBlcmZjKGZsb2F0KTsKK0RFRl9GVU5DXzEoZXJmYykKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGVyZihmbG9hdCk7CitERUZfRlVOQ18xKGVyZikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cChmbG9hdCk7CitERUZfRlVOQ18xKGV4cCkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDIoZmxvYXQpOworREVGX0ZVTkNfMShleHAyKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93KGZsb2F0LCBmbG9hdCk7CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQgdikgeworICAgIHJldHVybiBwb3coMTAuZiwgdik7Cit9CitERUZfRlVOQ18xKGV4cDEwKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwbTEoZmxvYXQpOworREVGX0ZVTkNfMShleHBtMSkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZhYnMoZmxvYXQpOworREVGX0ZVTkNfMShmYWJzKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmRpbShmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihmZGltKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQpOworREVGX0ZVTkNfMShmbG9vcikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYShmbG9hdCwgZmxvYXQsIGZsb2F0KTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1hKGZsb2F0MiwgZmxvYXQyLCBmbG9hdDIpOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWEoZmxvYXQzLCBmbG9hdDMsIGZsb2F0Myk7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYShmbG9hdDQsIGZsb2F0NCwgZmxvYXQ0KTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQsIGZsb2F0KTsKK0RFRl9GVU5DXzIoZm1heCk7CitERUZfRlVOQ18yRihmbWF4KTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQsIGZsb2F0KTsKK0RFRl9GVU5DXzIoZm1pbik7CitERUZfRlVOQ18yRihmbWluKTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtb2QoZmxvYXQsIGZsb2F0KTsKK0RFRl9GVU5DXzIoZm1vZCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyYWN0KGZsb2F0IHYsIGZsb2F0ICppcHRyKSB7CisgICAgaW50IGkgPSAoaW50KWZsb29yKHYpOworICAgIGlwdHJbMF0gPSBpOworICAgIHJldHVybiBmbWluKHYgLSBpLCAweDEuZmZmZmZlcC0xZik7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyYWN0KGZsb2F0MiB2LCBmbG9hdDIgKmlwdHIpIHsKKyAgICBmbG9hdCB0WzJdOworICAgIGZsb2F0MiByOworICAgIHIueCA9IGZyYWN0KHYueCwgJnRbMF0pOworICAgIHIueSA9IGZyYWN0KHYueSwgJnRbMV0pOworICAgIGlwdHJbMF0gPSB0WzBdOworICAgIGlwdHJbMV0gPSB0WzFdOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmcmFjdChmbG9hdDMgdiwgZmxvYXQzICppcHRyKSB7CisgICAgZmxvYXQgdFszXTsKKyAgICBmbG9hdDMgcjsKKyAgICByLnggPSBmcmFjdCh2LngsICZ0WzBdKTsKKyAgICByLnkgPSBmcmFjdCh2LnksICZ0WzFdKTsKKyAgICByLnogPSBmcmFjdCh2LnosICZ0WzJdKTsKKyAgICBpcHRyWzBdID0gdFswXTsKKyAgICBpcHRyWzFdID0gdFsxXTsKKyAgICBpcHRyWzJdID0gdFsyXTsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJhY3QoZmxvYXQ0IHYsIGZsb2F0NCAqaXB0cikgeworICAgIGZsb2F0IHRbNF07CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gZnJhY3Qodi54LCAmdFswXSk7CisgICAgci55ID0gZnJhY3Qodi55LCAmdFsxXSk7CisgICAgci56ID0gZnJhY3Qodi56LCAmdFsyXSk7CisgICAgci53ID0gZnJhY3Qodi53LCAmdFszXSk7CisgICAgaXB0clswXSA9IHRbMF07CisgICAgaXB0clsxXSA9IHRbMV07CisgICAgaXB0clsyXSA9IHRbMl07CisgICAgaXB0clszXSA9IHRbM107CisgICAgcmV0dXJuIHI7Cit9CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmcmV4cChmbG9hdCwgZmxvYXQgKik7CitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyZXhwKGZsb2F0MiwgZmxvYXQyICopOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmcmV4cChmbG9hdDMsIGZsb2F0MyAqKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJleHAoZmxvYXQ0LCBmbG9hdDQgKik7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBoeXBvdChmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihoeXBvdCkKKworZXh0ZXJuIGludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBpbG9nYihmbG9hdCk7CitERUZfRlVOQ18xKGlsb2diKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQsIGludCk7CitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxkZXhwKGZsb2F0MiwgaW50Mik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxkZXhwKGZsb2F0MywgaW50Myk7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxkZXhwKGZsb2F0NCwgaW50NCk7CitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxkZXhwKGZsb2F0MiwgaW50KTsKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQzLCBpbnQpOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZGV4cChmbG9hdDQsIGludCk7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZ2FtbWEoZmxvYXQpOworREVGX0ZVTkNfMShsZ2FtbWEpCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGdhbW1hKGZsb2F0LCBmbG9hdCAqKTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGdhbW1hKGZsb2F0MiwgZmxvYXQyICopOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZ2FtbWEoZmxvYXQzLCBmbG9hdDMgKik7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxnYW1tYShmbG9hdDQsIGZsb2F0NCAqKTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdCk7CitERUZfRlVOQ18xKGxvZykKKworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMTAoZmxvYXQpOworREVGX0ZVTkNfMShsb2cxMCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQgdikgeworICAgIHJldHVybiBsb2cxMCh2KSAvIGxvZzEwKDIuZik7Cit9CitERUZfRlVOQ18xKGxvZzIpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxcChmbG9hdCk7CitERUZfRlVOQ18xKGxvZzFwKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nYihmbG9hdCk7CitERUZfRlVOQ18xKGxvZ2IpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYWQoZmxvYXQsIGZsb2F0LCBmbG9hdCk7CitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1hZChmbG9hdDIsIGZsb2F0MiwgZmxvYXQyKTsKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWFkKGZsb2F0MywgZmxvYXQzLCBmbG9hdDMpOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYWQoZmxvYXQ0LCBmbG9hdDQsIGZsb2F0NCk7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtb2RmKGZsb2F0LCBmbG9hdCAqKTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbW9kZihmbG9hdDIsIGZsb2F0MiAqKTsKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbW9kZihmbG9hdDMsIGZsb2F0MyAqKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbW9kZihmbG9hdDQsIGZsb2F0NCAqKTsKKworLy9leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbmFuKHVpbnQpOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbmV4dGFmdGVyKGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKG5leHRhZnRlcikKKworREVGX0ZVTkNfMihwb3cpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3duKGZsb2F0IHYsIGludCBwKSB7CisgICAgcmV0dXJuIHBvdyh2LCAoZmxvYXQpcCk7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd24oZmxvYXQyIHYsIGludDIgcCkgeworICAgIHJldHVybiBwb3codiwgKGZsb2F0MilwKTsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93bihmbG9hdDMgdiwgaW50MyBwKSB7CisgICAgcmV0dXJuIHBvdyh2LCAoZmxvYXQzKXApOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3duKGZsb2F0NCB2LCBpbnQ0IHApIHsKKyAgICByZXR1cm4gcG93KHYsIChmbG9hdDQpcCk7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3dyKGZsb2F0IHYsIGZsb2F0IHApIHsKKyAgICByZXR1cm4gcG93KHYsIHApOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3dyKGZsb2F0MiB2LCBmbG9hdDIgcCkgeworICAgIHJldHVybiBwb3codiwgcCk7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd3IoZmxvYXQzIHYsIGZsb2F0MyBwKSB7CisgICAgcmV0dXJuIHBvdyh2LCBwKTsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93cihmbG9hdDQgdiwgZmxvYXQ0IHApIHsKKyAgICByZXR1cm4gcG93KHYsIHApOworfQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmVtYWluZGVyKGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKHJlbWFpbmRlcikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJlbXF1byhmbG9hdCwgZmxvYXQsIGZsb2F0ICopOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByZW1xdW8oZmxvYXQyLCBmbG9hdDIsIGZsb2F0MiAqKTsKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmVtcXVvKGZsb2F0MywgZmxvYXQzLCBmbG9hdDMgKik7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJlbXF1byhmbG9hdDQsIGZsb2F0NCwgZmxvYXQ0ICopOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdCk7CitERUZfRlVOQ18xKHJpbnQpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByb290bihmbG9hdCB2LCBpbnQgcikgeworICAgIHJldHVybiBwb3codiwgMS5mIC8gcik7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvb3RuKGZsb2F0MiB2LCBpbnQyIHIpIHsKKyAgICBmbG9hdDIgdCA9IHsxLmYgLyByLngsIDEuZiAvIHIueX07CisgICAgcmV0dXJuIHBvdyh2LCB0KTsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm9vdG4oZmxvYXQzIHYsIGludDMgcikgeworICAgIGZsb2F0MyB0ID0gezEuZiAvIHIueCwgMS5mIC8gci55LCAxLmYgLyByLnp9OworICAgIHJldHVybiBwb3codiwgdCk7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvb3RuKGZsb2F0NCB2LCBpbnQ0IHIpIHsKKyAgICBmbG9hdDQgdCA9IHsxLmYgLyByLngsIDEuZiAvIHIueSwgMS5mIC8gci56LCAxLmYgLyByLnd9OworICAgIHJldHVybiBwb3codiwgdCk7Cit9CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByb3VuZChmbG9hdCk7CitERUZfRlVOQ18xKHJvdW5kKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3FydChmbG9hdCk7CisvKnN0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdCB2KSB7CisgICAgcmV0dXJuIDEuZiAvIHNxcnQodik7Cit9CitERUZfRlVOQ18xKHJzcXJ0KSovCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW4oZmxvYXQpOworREVGX0ZVTkNfMShzaW4pCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5jb3MoZmxvYXQgdiwgZmxvYXQgKmNvc3B0cikgeworICAgICpjb3NwdHIgPSBjb3Modik7CisgICAgcmV0dXJuIHNpbih2KTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luY29zKGZsb2F0MiB2LCBmbG9hdDIgKmNvc3B0cikgeworICAgICpjb3NwdHIgPSBjb3Modik7CisgICAgcmV0dXJuIHNpbih2KTsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luY29zKGZsb2F0MyB2LCBmbG9hdDMgKmNvc3B0cikgeworICAgICpjb3NwdHIgPSBjb3Modik7CisgICAgcmV0dXJuIHNpbih2KTsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luY29zKGZsb2F0NCB2LCBmbG9hdDQgKmNvc3B0cikgeworICAgICpjb3NwdHIgPSBjb3Modik7CisgICAgcmV0dXJuIHNpbih2KTsKK30KKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbmgoZmxvYXQpOworREVGX0ZVTkNfMShzaW5oKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lucGkoZmxvYXQgdikgeworICAgIHJldHVybiBzaW4odiAqIE1fUEkpOworfQorREVGX0ZVTkNfMShzaW5waSkKKworREVGX0ZVTkNfMShzcXJ0KQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGFuKGZsb2F0KTsKK0RFRl9GVU5DXzEodGFuKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGFuaChmbG9hdCk7CitERUZfRlVOQ18xKHRhbmgpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW5waShmbG9hdCB2KSB7CisgICAgcmV0dXJuIHRhbih2ICogTV9QSSk7Cit9CitERUZfRlVOQ18xKHRhbnBpKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGdhbW1hKGZsb2F0KTsKK0RFRl9GVU5DXzEodGdhbW1hKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQpOworREVGX0ZVTkNfMSh0cnVuYykKKworLy8gSW50IG9wcyAocGFydGlhbCksIDYuMTEuMworZXh0ZXJuIHVpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGludCk7CitleHRlcm4gdXNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhzaG9ydCk7CitleHRlcm4gdWNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGNoYXIpOworCitleHRlcm4gdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbHoodWludCk7CitleHRlcm4gaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseihpbnQpOworZXh0ZXJuIHVzaG9ydCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbHoodXNob3J0KTsKK2V4dGVybiBzaG9ydCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbHooc2hvcnQpOworZXh0ZXJuIHVjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNseih1Y2hhcik7CitleHRlcm4gY2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbHooY2hhcik7CisKK3N0YXRpYyB1aW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbih1aW50IHYxLCB1aW50IHYyKSB7CisgICAgcmV0dXJuIHYxIDwgdjIgPyB2MSA6IHYyOworfQorc3RhdGljIGludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oaW50IHYxLCBpbnQgdjIpIHsKKyAgICByZXR1cm4gdjEgPCB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgdXNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbih1c2hvcnQgdjEsIHVzaG9ydCB2MikgeworICAgIHJldHVybiB2MSA8IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyBzaG9ydCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oc2hvcnQgdjEsIHNob3J0IHYyKSB7CisgICAgcmV0dXJuIHYxIDwgdjIgPyB2MSA6IHYyOworfQorc3RhdGljIHVjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbih1Y2hhciB2MSwgdWNoYXIgdjIpIHsKKyAgICByZXR1cm4gdjEgPCB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgY2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oY2hhciB2MSwgY2hhciB2MikgeworICAgIHJldHVybiB2MSA8IHYyID8gdjEgOiB2MjsKK30KKworc3RhdGljIHVpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KHVpbnQgdjEsIHVpbnQgdjIpIHsKKyAgICByZXR1cm4gdjEgPiB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChpbnQgdjEsIGludCB2MikgeworICAgIHJldHVybiB2MSA+IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyB1c2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KHVzaG9ydCB2MSwgdXNob3J0IHYyKSB7CisgICAgcmV0dXJuIHYxID4gdjIgPyB2MSA6IHYyOworfQorc3RhdGljIHNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChzaG9ydCB2MSwgc2hvcnQgdjIpIHsKKyAgICByZXR1cm4gdjEgPiB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgdWNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KHVjaGFyIHYxLCB1Y2hhciB2MikgeworICAgIHJldHVybiB2MSA+IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyBjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChjaGFyIHYxLCBjaGFyIHYyKSB7CisgICAgcmV0dXJuIHYxID4gdjIgPyB2MSA6IHYyOworfQorCisKKworCisvLyA2LjExLjQKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0IGFtb3VudCwgZmxvYXQgbG93LCBmbG9hdCBoaWdoKSB7CisgICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MiBhbW91bnQsIGZsb2F0MiBsb3csIGZsb2F0MiBoaWdoKSB7CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gYW1vdW50LnggPCBsb3cueCA/IGxvdy54IDogKGFtb3VudC54ID4gaGlnaC54ID8gaGlnaC54IDogYW1vdW50LngpOworICAgIHIueSA9IGFtb3VudC55IDwgbG93LnkgPyBsb3cueSA6IChhbW91bnQueSA+IGhpZ2gueSA/IGhpZ2gueSA6IGFtb3VudC55KTsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQzIGFtb3VudCwgZmxvYXQzIGxvdywgZmxvYXQzIGhpZ2gpIHsKKyAgICBmbG9hdDMgcjsKKyAgICByLnggPSBhbW91bnQueCA8IGxvdy54ID8gbG93LnggOiAoYW1vdW50LnggPiBoaWdoLnggPyBoaWdoLnggOiBhbW91bnQueCk7CisgICAgci55ID0gYW1vdW50LnkgPCBsb3cueSA/IGxvdy55IDogKGFtb3VudC55ID4gaGlnaC55ID8gaGlnaC55IDogYW1vdW50LnkpOworICAgIHIueiA9IGFtb3VudC56IDwgbG93LnogPyBsb3cueiA6IChhbW91bnQueiA+IGhpZ2gueiA/IGhpZ2gueiA6IGFtb3VudC56KTsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQ0IGFtb3VudCwgZmxvYXQ0IGxvdywgZmxvYXQ0IGhpZ2gpIHsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSBhbW91bnQueCA8IGxvdy54ID8gbG93LnggOiAoYW1vdW50LnggPiBoaWdoLnggPyBoaWdoLnggOiBhbW91bnQueCk7CisgICAgci55ID0gYW1vdW50LnkgPCBsb3cueSA/IGxvdy55IDogKGFtb3VudC55ID4gaGlnaC55ID8gaGlnaC55IDogYW1vdW50LnkpOworICAgIHIueiA9IGFtb3VudC56IDwgbG93LnogPyBsb3cueiA6IChhbW91bnQueiA+IGhpZ2gueiA/IGhpZ2gueiA6IGFtb3VudC56KTsKKyAgICByLncgPSBhbW91bnQudyA8IGxvdy53ID8gbG93LncgOiAoYW1vdW50LncgPiBoaWdoLncgPyBoaWdoLncgOiBhbW91bnQudyk7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MiBhbW91bnQsIGZsb2F0IGxvdywgZmxvYXQgaGlnaCkgeworICAgIGZsb2F0MiByOworICAgIHIueCA9IGFtb3VudC54IDwgbG93ID8gbG93IDogKGFtb3VudC54ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQueCk7CisgICAgci55ID0gYW1vdW50LnkgPCBsb3cgPyBsb3cgOiAoYW1vdW50LnkgPiBoaWdoID8gaGlnaCA6IGFtb3VudC55KTsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQzIGFtb3VudCwgZmxvYXQgbG93LCBmbG9hdCBoaWdoKSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gYW1vdW50LnggPCBsb3cgPyBsb3cgOiAoYW1vdW50LnggPiBoaWdoID8gaGlnaCA6IGFtb3VudC54KTsKKyAgICByLnkgPSBhbW91bnQueSA8IGxvdyA/IGxvdyA6IChhbW91bnQueSA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LnkpOworICAgIHIueiA9IGFtb3VudC56IDwgbG93ID8gbG93IDogKGFtb3VudC56ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQueik7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0NCBhbW91bnQsIGZsb2F0IGxvdywgZmxvYXQgaGlnaCkgeworICAgIGZsb2F0NCByOworICAgIHIueCA9IGFtb3VudC54IDwgbG93ID8gbG93IDogKGFtb3VudC54ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQueCk7CisgICAgci55ID0gYW1vdW50LnkgPCBsb3cgPyBsb3cgOiAoYW1vdW50LnkgPiBoaWdoID8gaGlnaCA6IGFtb3VudC55KTsKKyAgICByLnogPSBhbW91bnQueiA8IGxvdyA/IGxvdyA6IChhbW91bnQueiA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LnopOworICAgIHIudyA9IGFtb3VudC53IDwgbG93ID8gbG93IDogKGFtb3VudC53ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQudyk7CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkZWdyZWVzKGZsb2F0IHJhZGlhbnMpIHsKKyAgICByZXR1cm4gcmFkaWFucyAqICgxODAuZiAvIE1fUEkpOworfQorREVGX0ZVTkNfMShkZWdyZWVzKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0IHYxLCBmbG9hdCB2MikgeworICAgIHJldHVybiB2MSA+IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0MiB2MSwgZmxvYXQyIHYyKSB7CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gdjEueCA+IHYyLnggPyB2MS54IDogdjIueDsKKyAgICByLnkgPSB2MS55ID4gdjIueSA/IHYxLnkgOiB2Mi55OworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQzIHYxLCBmbG9hdDMgdjIpIHsKKyAgICBmbG9hdDMgcjsKKyAgICByLnggPSB2MS54ID4gdjIueCA/IHYxLnggOiB2Mi54OworICAgIHIueSA9IHYxLnkgPiB2Mi55ID8gdjEueSA6IHYyLnk7CisgICAgci56ID0gdjEueiA+IHYyLnogPyB2MS56IDogdjIuejsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0NCB2MSwgZmxvYXQ0IHYyKSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gdjEueCA+IHYyLnggPyB2MS54IDogdjIueDsKKyAgICByLnkgPSB2MS55ID4gdjIueSA/IHYxLnkgOiB2Mi55OworICAgIHIueiA9IHYxLnogPiB2Mi56ID8gdjEueiA6IHYyLno7CisgICAgci53ID0gdjEudyA+IHYyLncgPyB2MS53IDogdjIudzsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0MiB2MSwgZmxvYXQgdjIpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSB2MS54ID4gdjIgPyB2MS54IDogdjI7CisgICAgci55ID0gdjEueSA+IHYyID8gdjEueSA6IHYyOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQzIHYxLCBmbG9hdCB2MikgeworICAgIGZsb2F0MyByOworICAgIHIueCA9IHYxLnggPiB2MiA/IHYxLnggOiB2MjsKKyAgICByLnkgPSB2MS55ID4gdjIgPyB2MS55IDogdjI7CisgICAgci56ID0gdjEueiA+IHYyID8gdjEueiA6IHYyOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQ0IHYxLCBmbG9hdCB2MikgeworICAgIGZsb2F0NCByOworICAgIHIueCA9IHYxLnggPiB2MiA/IHYxLnggOiB2MjsKKyAgICByLnkgPSB2MS55ID4gdjIgPyB2MS55IDogdjI7CisgICAgci56ID0gdjEueiA+IHYyID8gdjEueiA6IHYyOworICAgIHIudyA9IHYxLncgPiB2MiA/IHYxLncgOiB2MjsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdCB2MSwgZmxvYXQgdjIpIHsKKyAgICByZXR1cm4gdjEgPCB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDIgdjEsIGZsb2F0MiB2MikgeworICAgIGZsb2F0MiByOworICAgIHIueCA9IHYxLnggPCB2Mi54ID8gdjEueCA6IHYyLng7CisgICAgci55ID0gdjEueSA8IHYyLnkgPyB2MS55IDogdjIueTsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0MyB2MSwgZmxvYXQzIHYyKSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gdjEueCA8IHYyLnggPyB2MS54IDogdjIueDsKKyAgICByLnkgPSB2MS55IDwgdjIueSA/IHYxLnkgOiB2Mi55OworICAgIHIueiA9IHYxLnogPCB2Mi56ID8gdjEueiA6IHYyLno7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDQgdjEsIGZsb2F0NCB2MikgeworICAgIGZsb2F0NCByOworICAgIHIueCA9IHYxLnggPCB2Mi54ID8gdjEueCA6IHYyLng7CisgICAgci55ID0gdjEueSA8IHYyLnkgPyB2MS55IDogdjIueTsKKyAgICByLnogPSB2MS56IDwgdjIueiA/IHYxLnogOiB2Mi56OworICAgIHIudyA9IHYxLncgPCB2Mi53ID8gdjEudyA6IHYyLnc7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDIgdjEsIGZsb2F0IHYyKSB7CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gdjEueCA8IHYyID8gdjEueCA6IHYyOworICAgIHIueSA9IHYxLnkgPCB2MiA/IHYxLnkgOiB2MjsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0MyB2MSwgZmxvYXQgdjIpIHsKKyAgICBmbG9hdDMgcjsKKyAgICByLnggPSB2MS54IDwgdjIgPyB2MS54IDogdjI7CisgICAgci55ID0gdjEueSA8IHYyID8gdjEueSA6IHYyOworICAgIHIueiA9IHYxLnogPCB2MiA/IHYxLnogOiB2MjsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0NCB2MSwgZmxvYXQgdjIpIHsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSB2MS54IDwgdjIgPyB2MS54IDogdjI7CisgICAgci55ID0gdjEueSA8IHYyID8gdjEueSA6IHYyOworICAgIHIueiA9IHYxLnogPCB2MiA/IHYxLnogOiB2MjsKKyAgICByLncgPSB2MS53IDwgdjIgPyB2MS53IDogdjI7CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQgc3RhcnQsIGZsb2F0IHN0b3AsIGZsb2F0IGFtb3VudCkgeworICAgIHJldHVybiBzdGFydCArIChzdG9wIC0gc3RhcnQpICogYW1vdW50OworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQyIHN0YXJ0LCBmbG9hdDIgc3RvcCwgZmxvYXQyIGFtb3VudCkgeworICAgIHJldHVybiBzdGFydCArIChzdG9wIC0gc3RhcnQpICogYW1vdW50OworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQzIHN0YXJ0LCBmbG9hdDMgc3RvcCwgZmxvYXQzIGFtb3VudCkgeworICAgIHJldHVybiBzdGFydCArIChzdG9wIC0gc3RhcnQpICogYW1vdW50OworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQ0IHN0YXJ0LCBmbG9hdDQgc3RvcCwgZmxvYXQ0IGFtb3VudCkgeworICAgIHJldHVybiBzdGFydCArIChzdG9wIC0gc3RhcnQpICogYW1vdW50OworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQyIHN0YXJ0LCBmbG9hdDIgc3RvcCwgZmxvYXQgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDMgc3RhcnQsIGZsb2F0MyBzdG9wLCBmbG9hdCBhbW91bnQpIHsKKyAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0NCBzdGFydCwgZmxvYXQ0IHN0b3AsIGZsb2F0IGFtb3VudCkgeworICAgIHJldHVybiBzdGFydCArIChzdG9wIC0gc3RhcnQpICogYW1vdW50OworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmFkaWFucyhmbG9hdCBkZWdyZWVzKSB7CisgICAgcmV0dXJuIGRlZ3JlZXMgKiAoTV9QSSAvIDE4MC5mKTsKK30KK0RFRl9GVU5DXzEocmFkaWFucykKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQgZWRnZSwgZmxvYXQgdikgeworICAgIHJldHVybiAodiA8IGVkZ2UpID8gMC5mIDogMS5mOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzdGVwKGZsb2F0MiBlZGdlLCBmbG9hdDIgdikgeworICAgIGZsb2F0MiByOworICAgIHIueCA9ICh2LnggPCBlZGdlLngpID8gMC5mIDogMS5mOworICAgIHIueSA9ICh2LnkgPCBlZGdlLnkpID8gMC5mIDogMS5mOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzdGVwKGZsb2F0MyBlZGdlLCBmbG9hdDMgdikgeworICAgIGZsb2F0MyByOworICAgIHIueCA9ICh2LnggPCBlZGdlLngpID8gMC5mIDogMS5mOworICAgIHIueSA9ICh2LnkgPCBlZGdlLnkpID8gMC5mIDogMS5mOworICAgIHIueiA9ICh2LnogPCBlZGdlLnopID8gMC5mIDogMS5mOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzdGVwKGZsb2F0NCBlZGdlLCBmbG9hdDQgdikgeworICAgIGZsb2F0NCByOworICAgIHIueCA9ICh2LnggPCBlZGdlLngpID8gMC5mIDogMS5mOworICAgIHIueSA9ICh2LnkgPCBlZGdlLnkpID8gMC5mIDogMS5mOworICAgIHIueiA9ICh2LnogPCBlZGdlLnopID8gMC5mIDogMS5mOworICAgIHIudyA9ICh2LncgPCBlZGdlLncpID8gMC5mIDogMS5mOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzdGVwKGZsb2F0MiBlZGdlLCBmbG9hdCB2KSB7CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gKHYgPCBlZGdlLngpID8gMC5mIDogMS5mOworICAgIHIueSA9ICh2IDwgZWRnZS55KSA/IDAuZiA6IDEuZjsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3RlcChmbG9hdDMgZWRnZSwgZmxvYXQgdikgeworICAgIGZsb2F0MyByOworICAgIHIueCA9ICh2IDwgZWRnZS54KSA/IDAuZiA6IDEuZjsKKyAgICByLnkgPSAodiA8IGVkZ2UueSkgPyAwLmYgOiAxLmY7CisgICAgci56ID0gKHYgPCBlZGdlLnopID8gMC5mIDogMS5mOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzdGVwKGZsb2F0NCBlZGdlLCBmbG9hdCB2KSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gKHYgPCBlZGdlLngpID8gMC5mIDogMS5mOworICAgIHIueSA9ICh2IDwgZWRnZS55KSA/IDAuZiA6IDEuZjsKKyAgICByLnogPSAodiA8IGVkZ2UueikgPyAwLmYgOiAxLmY7CisgICAgci53ID0gKHYgPCBlZGdlLncpID8gMC5mIDogMS5mOworICAgIHJldHVybiByOworfQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc21vb3Roc3RlcChmbG9hdCwgZmxvYXQsIGZsb2F0KTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc21vb3Roc3RlcChmbG9hdDIsIGZsb2F0MiwgZmxvYXQyKTsKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc21vb3Roc3RlcChmbG9hdDMsIGZsb2F0MywgZmxvYXQzKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc21vb3Roc3RlcChmbG9hdDQsIGZsb2F0NCwgZmxvYXQ0KTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc21vb3Roc3RlcChmbG9hdCwgZmxvYXQsIGZsb2F0Mik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNtb290aHN0ZXAoZmxvYXQsIGZsb2F0LCBmbG9hdDMpOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0LCBmbG9hdCwgZmxvYXQ0KTsKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpZ24oZmxvYXQgdikgeworICAgIGlmICh2ID4gMCkgcmV0dXJuIDEuZjsKKyAgICBpZiAodiA8IDApIHJldHVybiAtMS5mOworICAgIHJldHVybiB2OworfQorREVGX0ZVTkNfMShzaWduKQorCisvLyA2LjExLjUKK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY3Jvc3MoZmxvYXQzIGxocywgZmxvYXQzIHJocykgeworICAgIGZsb2F0MyByOworICAgIHIueCA9IGxocy55ICogcmhzLnogIC0gbGhzLnogKiByaHMueTsKKyAgICByLnkgPSBsaHMueiAqIHJocy54ICAtIGxocy54ICogcmhzLno7CisgICAgci56ID0gbGhzLnggKiByaHMueSAgLSBsaHMueSAqIHJocy54OworICAgIHJldHVybiByOworfQorCitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNyb3NzKGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpIHsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSBsaHMueSAqIHJocy56ICAtIGxocy56ICogcmhzLnk7CisgICAgci55ID0gbGhzLnogKiByaHMueCAgLSBsaHMueCAqIHJocy56OworICAgIHIueiA9IGxocy54ICogcmhzLnkgIC0gbGhzLnkgKiByaHMueDsKKyAgICByLncgPSAwLmY7CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkb3QoZmxvYXQgbGhzLCBmbG9hdCByaHMpIHsKKyAgICByZXR1cm4gbGhzICogcmhzOworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRvdChmbG9hdDIgbGhzLCBmbG9hdDIgcmhzKSB7CisgICAgcmV0dXJuIGxocy54KnJocy54ICsgbGhzLnkqcmhzLnk7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZG90KGZsb2F0MyBsaHMsIGZsb2F0MyByaHMpIHsKKyAgICByZXR1cm4gbGhzLngqcmhzLnggKyBsaHMueSpyaHMueSArIGxocy56KnJocy56OworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRvdChmbG9hdDQgbGhzLCBmbG9hdDQgcmhzKSB7CisgICAgcmV0dXJuIGxocy54KnJocy54ICsgbGhzLnkqcmhzLnkgKyBsaHMueipyaHMueiArIGxocy53KnJocy53OworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGVuZ3RoKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gdjsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZW5ndGgoZmxvYXQyIHYpIHsKKyAgICByZXR1cm4gc3FydCh2Lngqdi54ICsgdi55KnYueSk7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGVuZ3RoKGZsb2F0MyB2KSB7CisgICAgcmV0dXJuIHNxcnQodi54KnYueCArIHYueSp2LnkgKyB2Lnoqdi56KTsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZW5ndGgoZmxvYXQ0IHYpIHsKKyAgICByZXR1cm4gc3FydCh2Lngqdi54ICsgdi55KnYueSArIHYueip2LnogKyB2Lncqdi53KTsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRpc3RhbmNlKGZsb2F0IGxocywgZmxvYXQgcmhzKSB7CisgICAgcmV0dXJuIGxlbmd0aChsaHMgLSByaHMpOworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRpc3RhbmNlKGZsb2F0MiBsaHMsIGZsb2F0MiByaHMpIHsKKyAgICByZXR1cm4gbGVuZ3RoKGxocyAtIHJocyk7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGlzdGFuY2UoZmxvYXQzIGxocywgZmxvYXQzIHJocykgeworICAgIHJldHVybiBsZW5ndGgobGhzIC0gcmhzKTsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkaXN0YW5jZShmbG9hdDQgbGhzLCBmbG9hdDQgcmhzKSB7CisgICAgcmV0dXJuIGxlbmd0aChsaHMgLSByaHMpOworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbm9ybWFsaXplKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gMS5mOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBub3JtYWxpemUoZmxvYXQyIHYpIHsKKyAgICByZXR1cm4gdiAvIGxlbmd0aCh2KTsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbm9ybWFsaXplKGZsb2F0MyB2KSB7CisgICAgcmV0dXJuIHYgLyBsZW5ndGgodik7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG5vcm1hbGl6ZShmbG9hdDQgdikgeworICAgIHJldHVybiB2IC8gbGVuZ3RoKHYpOworfQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9zY3JpcHRjL3JzX2NvcmUucnNoIGIvbGlicy9ycy9zY3JpcHRjL3JzX2NvcmUucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZmMxNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3NjcmlwdGMvcnNfY29yZS5yc2gKQEAgLTAsMCArMSw4OTIgQEAKKyNpZm5kZWYgX19SU19DT1JFX1JTSF9fCisjZGVmaW5lIF9fUlNfQ09SRV9SU0hfXworCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc0RlYnVnKGNvbnN0IGNoYXIgKnMsIGZsb2F0MiB2KSB7CisgICAgcnNEZWJ1ZyhzLCB2LngsIHYueSk7Cit9CitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc0RlYnVnKGNvbnN0IGNoYXIgKnMsIGZsb2F0MyB2KSB7CisgICAgcnNEZWJ1ZyhzLCB2LngsIHYueSwgdi56KTsKK30KK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzRGVidWcoY29uc3QgY2hhciAqcywgZmxvYXQ0IHYpIHsKKyAgICByc0RlYnVnKHMsIHYueCwgdi55LCB2LnosIHYudyk7Cit9CisKK3N0YXRpYyB1Y2hhcjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNQYWNrQ29sb3JUbzg4ODgoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYikKK3sKKyAgICB1Y2hhcjQgYzsKKyAgICBjLnggPSAodWNoYXIpKHIgKiAyNTUuZik7CisgICAgYy55ID0gKHVjaGFyKShnICogMjU1LmYpOworICAgIGMueiA9ICh1Y2hhcikoYiAqIDI1NS5mKTsKKyAgICBjLncgPSAyNTU7CisgICAgcmV0dXJuIGM7Cit9CisKK3N0YXRpYyB1Y2hhcjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNQYWNrQ29sb3JUbzg4ODgoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKK3sKKyAgICB1Y2hhcjQgYzsKKyAgICBjLnggPSAodWNoYXIpKHIgKiAyNTUuZik7CisgICAgYy55ID0gKHVjaGFyKShnICogMjU1LmYpOworICAgIGMueiA9ICh1Y2hhcikoYiAqIDI1NS5mKTsKKyAgICBjLncgPSAodWNoYXIpKGEgKiAyNTUuZik7CisgICAgcmV0dXJuIGM7Cit9CisKK3N0YXRpYyB1Y2hhcjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNQYWNrQ29sb3JUbzg4ODgoZmxvYXQzIGNvbG9yKQoreworICAgIGNvbG9yICo9IDI1NS5mOworICAgIHVjaGFyNCBjID0ge2NvbG9yLngsIGNvbG9yLnksIGNvbG9yLnosIDI1NX07CisgICAgcmV0dXJuIGM7Cit9CisKK3N0YXRpYyB1Y2hhcjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNQYWNrQ29sb3JUbzg4ODgoZmxvYXQ0IGNvbG9yKQoreworICAgIGNvbG9yICo9IDI1NS5mOworICAgIHVjaGFyNCBjID0ge2NvbG9yLngsIGNvbG9yLnksIGNvbG9yLnosIGNvbG9yLnd9OworICAgIHJldHVybiBjOworfQorCitzdGF0aWMgZmxvYXQ0IHJzVW5wYWNrQ29sb3I4ODg4KHVjaGFyNCBjKQoreworICAgIGZsb2F0NCByZXQgPSAoZmxvYXQ0KTAuMDAzOTE1Njg2Mjc0NWY7CisgICAgcmV0ICo9IGNvbnZlcnRfZmxvYXQ0KGMpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8vZXh0ZXJuIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1BhY2tDb2xvclRvNTY1KGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIpOworLy9leHRlcm4gdWNoYXI0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzUGFja0NvbG9yVG81NjUoZmxvYXQzKTsKKy8vZXh0ZXJuIGZsb2F0NCByc1VucGFja0NvbG9yNTY1KHVjaGFyNCk7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIE1hdHJpeCBvcHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFNldChyc19tYXRyaXg0eDQgKm0sIHVpbnQzMl90IHJvdywgdWludDMyX3QgY29sLCBmbG9hdCB2KSB7CisgICAgbS0+bVtyb3cgKiA0ICsgY29sXSA9IHY7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhHZXQoY29uc3QgcnNfbWF0cml4NHg0ICptLCB1aW50MzJfdCByb3csIHVpbnQzMl90IGNvbCkgeworICAgIHJldHVybiBtLT5tW3JvdyAqIDQgKyBjb2xdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhTZXQocnNfbWF0cml4M3gzICptLCB1aW50MzJfdCByb3csIHVpbnQzMl90IGNvbCwgZmxvYXQgdikgeworICAgIG0tPm1bcm93ICogMyArIGNvbF0gPSB2OworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4R2V0KGNvbnN0IHJzX21hdHJpeDN4MyAqbSwgdWludDMyX3Qgcm93LCB1aW50MzJfdCBjb2wpIHsKKyAgICByZXR1cm4gbS0+bVtyb3cgKiAzICsgY29sXTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4U2V0KHJzX21hdHJpeDJ4MiAqbSwgdWludDMyX3Qgcm93LCB1aW50MzJfdCBjb2wsIGZsb2F0IHYpIHsKKyAgICBtLT5tW3JvdyAqIDIgKyBjb2xdID0gdjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeEdldChjb25zdCByc19tYXRyaXgyeDIgKm0sIHVpbnQzMl90IHJvdywgdWludDMyX3QgY29sKSB7CisgICAgcmV0dXJuIG0tPm1bcm93ICogMiArIGNvbF07Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRJZGVudGl0eShyc19tYXRyaXg0eDQgKm0pIHsKKyAgICBtLT5tWzBdID0gMS5mOworICAgIG0tPm1bMV0gPSAwLmY7CisgICAgbS0+bVsyXSA9IDAuZjsKKyAgICBtLT5tWzNdID0gMC5mOworICAgIG0tPm1bNF0gPSAwLmY7CisgICAgbS0+bVs1XSA9IDEuZjsKKyAgICBtLT5tWzZdID0gMC5mOworICAgIG0tPm1bN10gPSAwLmY7CisgICAgbS0+bVs4XSA9IDAuZjsKKyAgICBtLT5tWzldID0gMC5mOworICAgIG0tPm1bMTBdID0gMS5mOworICAgIG0tPm1bMTFdID0gMC5mOworICAgIG0tPm1bMTJdID0gMC5mOworICAgIG0tPm1bMTNdID0gMC5mOworICAgIG0tPm1bMTRdID0gMC5mOworICAgIG0tPm1bMTVdID0gMS5mOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkSWRlbnRpdHkocnNfbWF0cml4M3gzICptKSB7CisgICAgbS0+bVswXSA9IDEuZjsKKyAgICBtLT5tWzFdID0gMC5mOworICAgIG0tPm1bMl0gPSAwLmY7CisgICAgbS0+bVszXSA9IDAuZjsKKyAgICBtLT5tWzRdID0gMS5mOworICAgIG0tPm1bNV0gPSAwLmY7CisgICAgbS0+bVs2XSA9IDAuZjsKKyAgICBtLT5tWzddID0gMC5mOworICAgIG0tPm1bOF0gPSAxLmY7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRJZGVudGl0eShyc19tYXRyaXgyeDIgKm0pIHsKKyAgICBtLT5tWzBdID0gMS5mOworICAgIG0tPm1bMV0gPSAwLmY7CisgICAgbS0+bVsyXSA9IDAuZjsKKyAgICBtLT5tWzNdID0gMS5mOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkKHJzX21hdHJpeDR4NCAqbSwgY29uc3QgZmxvYXQgKnYpIHsKKyAgICBtLT5tWzBdID0gdlswXTsKKyAgICBtLT5tWzFdID0gdlsxXTsKKyAgICBtLT5tWzJdID0gdlsyXTsKKyAgICBtLT5tWzNdID0gdlszXTsKKyAgICBtLT5tWzRdID0gdls0XTsKKyAgICBtLT5tWzVdID0gdls1XTsKKyAgICBtLT5tWzZdID0gdls2XTsKKyAgICBtLT5tWzddID0gdls3XTsKKyAgICBtLT5tWzhdID0gdls4XTsKKyAgICBtLT5tWzldID0gdls5XTsKKyAgICBtLT5tWzEwXSA9IHZbMTBdOworICAgIG0tPm1bMTFdID0gdlsxMV07CisgICAgbS0+bVsxMl0gPSB2WzEyXTsKKyAgICBtLT5tWzEzXSA9IHZbMTNdOworICAgIG0tPm1bMTRdID0gdlsxNF07CisgICAgbS0+bVsxNV0gPSB2WzE1XTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXgzeDMgKm0sIGNvbnN0IGZsb2F0ICp2KSB7CisgICAgbS0+bVswXSA9IHZbMF07CisgICAgbS0+bVsxXSA9IHZbMV07CisgICAgbS0+bVsyXSA9IHZbMl07CisgICAgbS0+bVszXSA9IHZbM107CisgICAgbS0+bVs0XSA9IHZbNF07CisgICAgbS0+bVs1XSA9IHZbNV07CisgICAgbS0+bVs2XSA9IHZbNl07CisgICAgbS0+bVs3XSA9IHZbN107CisgICAgbS0+bVs4XSA9IHZbOF07Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4MngyICptLCBjb25zdCBmbG9hdCAqdikgeworICAgIG0tPm1bMF0gPSB2WzBdOworICAgIG0tPm1bMV0gPSB2WzFdOworICAgIG0tPm1bMl0gPSB2WzJdOworICAgIG0tPm1bM10gPSB2WzNdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkKHJzX21hdHJpeDR4NCAqbSwgY29uc3QgcnNfbWF0cml4NHg0ICp2KSB7CisgICAgbS0+bVswXSA9IHYtPm1bMF07CisgICAgbS0+bVsxXSA9IHYtPm1bMV07CisgICAgbS0+bVsyXSA9IHYtPm1bMl07CisgICAgbS0+bVszXSA9IHYtPm1bM107CisgICAgbS0+bVs0XSA9IHYtPm1bNF07CisgICAgbS0+bVs1XSA9IHYtPm1bNV07CisgICAgbS0+bVs2XSA9IHYtPm1bNl07CisgICAgbS0+bVs3XSA9IHYtPm1bN107CisgICAgbS0+bVs4XSA9IHYtPm1bOF07CisgICAgbS0+bVs5XSA9IHYtPm1bOV07CisgICAgbS0+bVsxMF0gPSB2LT5tWzEwXTsKKyAgICBtLT5tWzExXSA9IHYtPm1bMTFdOworICAgIG0tPm1bMTJdID0gdi0+bVsxMl07CisgICAgbS0+bVsxM10gPSB2LT5tWzEzXTsKKyAgICBtLT5tWzE0XSA9IHYtPm1bMTRdOworICAgIG0tPm1bMTVdID0gdi0+bVsxNV07Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4NHg0ICptLCBjb25zdCByc19tYXRyaXgzeDMgKnYpIHsKKyAgICBtLT5tWzBdID0gdi0+bVswXTsKKyAgICBtLT5tWzFdID0gdi0+bVsxXTsKKyAgICBtLT5tWzJdID0gdi0+bVsyXTsKKyAgICBtLT5tWzNdID0gMC5mOworICAgIG0tPm1bNF0gPSB2LT5tWzNdOworICAgIG0tPm1bNV0gPSB2LT5tWzRdOworICAgIG0tPm1bNl0gPSB2LT5tWzVdOworICAgIG0tPm1bN10gPSAwLmY7CisgICAgbS0+bVs4XSA9IHYtPm1bNl07CisgICAgbS0+bVs5XSA9IHYtPm1bN107CisgICAgbS0+bVsxMF0gPSB2LT5tWzhdOworICAgIG0tPm1bMTFdID0gMC5mOworICAgIG0tPm1bMTJdID0gMC5mOworICAgIG0tPm1bMTNdID0gMC5mOworICAgIG0tPm1bMTRdID0gMC5mOworICAgIG0tPm1bMTVdID0gMS5mOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkKHJzX21hdHJpeDR4NCAqbSwgY29uc3QgcnNfbWF0cml4MngyICp2KSB7CisgICAgbS0+bVswXSA9IHYtPm1bMF07CisgICAgbS0+bVsxXSA9IHYtPm1bMV07CisgICAgbS0+bVsyXSA9IDAuZjsKKyAgICBtLT5tWzNdID0gMC5mOworICAgIG0tPm1bNF0gPSB2LT5tWzNdOworICAgIG0tPm1bNV0gPSB2LT5tWzRdOworICAgIG0tPm1bNl0gPSAwLmY7CisgICAgbS0+bVs3XSA9IDAuZjsKKyAgICBtLT5tWzhdID0gdi0+bVs2XTsKKyAgICBtLT5tWzldID0gdi0+bVs3XTsKKyAgICBtLT5tWzEwXSA9IDEuZjsKKyAgICBtLT5tWzExXSA9IDAuZjsKKyAgICBtLT5tWzEyXSA9IDAuZjsKKyAgICBtLT5tWzEzXSA9IDAuZjsKKyAgICBtLT5tWzE0XSA9IDAuZjsKKyAgICBtLT5tWzE1XSA9IDEuZjsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXgzeDMgKm0sIGNvbnN0IHJzX21hdHJpeDN4MyAqdikgeworICAgIG0tPm1bMF0gPSB2LT5tWzBdOworICAgIG0tPm1bMV0gPSB2LT5tWzFdOworICAgIG0tPm1bMl0gPSB2LT5tWzJdOworICAgIG0tPm1bM10gPSB2LT5tWzNdOworICAgIG0tPm1bNF0gPSB2LT5tWzRdOworICAgIG0tPm1bNV0gPSB2LT5tWzVdOworICAgIG0tPm1bNl0gPSB2LT5tWzZdOworICAgIG0tPm1bN10gPSB2LT5tWzddOworICAgIG0tPm1bOF0gPSB2LT5tWzhdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkKHJzX21hdHJpeDJ4MiAqbSwgY29uc3QgcnNfbWF0cml4MngyICp2KSB7CisgICAgbS0+bVswXSA9IHYtPm1bMF07CisgICAgbS0+bVsxXSA9IHYtPm1bMV07CisgICAgbS0+bVsyXSA9IHYtPm1bMl07CisgICAgbS0+bVszXSA9IHYtPm1bM107Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRSb3RhdGUocnNfbWF0cml4NHg0ICptLCBmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICBmbG9hdCBjLCBzOworICAgIG0tPm1bM10gPSAwOworICAgIG0tPm1bN10gPSAwOworICAgIG0tPm1bMTFdPSAwOworICAgIG0tPm1bMTJdPSAwOworICAgIG0tPm1bMTNdPSAwOworICAgIG0tPm1bMTRdPSAwOworICAgIG0tPm1bMTVdPSAxOworICAgIHJvdCAqPSAoZmxvYXQpKE1fUEkgLyAxODAuMGYpOworICAgIGMgPSBjb3Mocm90KTsKKyAgICBzID0gc2luKHJvdCk7CisKKyAgICBjb25zdCBmbG9hdCBsZW4gPSB4KnggKyB5KnkgKyB6Kno7CisgICAgaWYgKGxlbiAhPSAxKSB7CisgICAgICAgIGNvbnN0IGZsb2F0IHJlY2lwTGVuID0gMS5mIC8gc3FydChsZW4pOworICAgICAgICB4ICo9IHJlY2lwTGVuOworICAgICAgICB5ICo9IHJlY2lwTGVuOworICAgICAgICB6ICo9IHJlY2lwTGVuOworICAgIH0KKyAgICBjb25zdCBmbG9hdCBuYyA9IDEuMGYgLSBjOworICAgIGNvbnN0IGZsb2F0IHh5ID0geCAqIHk7CisgICAgY29uc3QgZmxvYXQgeXogPSB5ICogejsKKyAgICBjb25zdCBmbG9hdCB6eCA9IHogKiB4OworICAgIGNvbnN0IGZsb2F0IHhzID0geCAqIHM7CisgICAgY29uc3QgZmxvYXQgeXMgPSB5ICogczsKKyAgICBjb25zdCBmbG9hdCB6cyA9IHogKiBzOworICAgIG0tPm1bIDBdID0geCp4Km5jICsgIGM7CisgICAgbS0+bVsgNF0gPSAgeHkqbmMgLSB6czsKKyAgICBtLT5tWyA4XSA9ICB6eCpuYyArIHlzOworICAgIG0tPm1bIDFdID0gIHh5Km5jICsgenM7CisgICAgbS0+bVsgNV0gPSB5KnkqbmMgKyAgYzsKKyAgICBtLT5tWyA5XSA9ICB5eipuYyAtIHhzOworICAgIG0tPm1bIDJdID0gIHp4Km5jIC0geXM7CisgICAgbS0+bVsgNl0gPSAgeXoqbmMgKyB4czsKKyAgICBtLT5tWzEwXSA9IHoqeipuYyArICBjOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkU2NhbGUocnNfbWF0cml4NHg0ICptLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcnNNYXRyaXhMb2FkSWRlbnRpdHkobSk7CisgICAgbS0+bVswXSA9IHg7CisgICAgbS0+bVs1XSA9IHk7CisgICAgbS0+bVsxMF0gPSB6OworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkVHJhbnNsYXRlKHJzX21hdHJpeDR4NCAqbSwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KG0pOworICAgIG0tPm1bMTJdID0geDsKKyAgICBtLT5tWzEzXSA9IHk7CisgICAgbS0+bVsxNF0gPSB6OworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkTXVsdGlwbHkocnNfbWF0cml4NHg0ICptLCBjb25zdCByc19tYXRyaXg0eDQgKmxocywgY29uc3QgcnNfbWF0cml4NHg0ICpyaHMpIHsKKyAgICBmb3IgKGludCBpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgZmxvYXQgcmkwID0gMDsKKyAgICAgICAgZmxvYXQgcmkxID0gMDsKKyAgICAgICAgZmxvYXQgcmkyID0gMDsKKyAgICAgICAgZmxvYXQgcmkzID0gMDsKKyAgICAgICAgZm9yIChpbnQgaj0wIDsgajw0IDsgaisrKSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCByaHNfaWogPSByc01hdHJpeEdldChyaHMsIGksaik7CisgICAgICAgICAgICByaTAgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAwKSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMSArPSByc01hdHJpeEdldChsaHMsIGosIDEpICogcmhzX2lqOworICAgICAgICAgICAgcmkyICs9IHJzTWF0cml4R2V0KGxocywgaiwgMikgKiByaHNfaWo7CisgICAgICAgICAgICByaTMgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAzKSAqIHJoc19pajsKKyAgICAgICAgfQorICAgICAgICByc01hdHJpeFNldChtLCBpLCAwLCByaTApOworICAgICAgICByc01hdHJpeFNldChtLCBpLCAxLCByaTEpOworICAgICAgICByc01hdHJpeFNldChtLCBpLCAyLCByaTIpOworICAgICAgICByc01hdHJpeFNldChtLCBpLCAzLCByaTMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4NHg0ICptLCBjb25zdCByc19tYXRyaXg0eDQgKnJocykgeworICAgIHJzX21hdHJpeDR4NCBtdDsKKyAgICByc01hdHJpeExvYWRNdWx0aXBseSgmbXQsIG0sIHJocyk7CisgICAgcnNNYXRyaXhMb2FkKG0sICZtdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRNdWx0aXBseShyc19tYXRyaXgzeDMgKm0sIGNvbnN0IHJzX21hdHJpeDN4MyAqbGhzLCBjb25zdCByc19tYXRyaXgzeDMgKnJocykgeworICAgIGZvciAoaW50IGk9MCA7IGk8MyA7IGkrKykgeworICAgICAgICBmbG9hdCByaTAgPSAwOworICAgICAgICBmbG9hdCByaTEgPSAwOworICAgICAgICBmbG9hdCByaTIgPSAwOworICAgICAgICBmb3IgKGludCBqPTAgOyBqPDMgOyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHJoc19paiA9IHJzTWF0cml4R2V0KHJocywgaSxqKTsKKyAgICAgICAgICAgIHJpMCArPSByc01hdHJpeEdldChsaHMsIGosIDApICogcmhzX2lqOworICAgICAgICAgICAgcmkxICs9IHJzTWF0cml4R2V0KGxocywgaiwgMSkgKiByaHNfaWo7CisgICAgICAgICAgICByaTIgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAyKSAqIHJoc19pajsKKyAgICAgICAgfQorICAgICAgICByc01hdHJpeFNldChtLCBpLCAwLCByaTApOworICAgICAgICByc01hdHJpeFNldChtLCBpLCAxLCByaTEpOworICAgICAgICByc01hdHJpeFNldChtLCBpLCAyLCByaTIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4M3gzICptLCBjb25zdCByc19tYXRyaXgzeDMgKnJocykgeworICAgIHJzX21hdHJpeDN4MyBtdDsKKyAgICByc01hdHJpeExvYWRNdWx0aXBseSgmbXQsIG0sIHJocyk7CisgICAgcnNNYXRyaXhMb2FkKG0sICZtdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRNdWx0aXBseShyc19tYXRyaXgyeDIgKm0sIGNvbnN0IHJzX21hdHJpeDJ4MiAqbGhzLCBjb25zdCByc19tYXRyaXgyeDIgKnJocykgeworICAgIGZvciAoaW50IGk9MCA7IGk8MiA7IGkrKykgeworICAgICAgICBmbG9hdCByaTAgPSAwOworICAgICAgICBmbG9hdCByaTEgPSAwOworICAgICAgICBmb3IgKGludCBqPTAgOyBqPDIgOyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHJoc19paiA9IHJzTWF0cml4R2V0KHJocywgaSxqKTsKKyAgICAgICAgICAgIHJpMCArPSByc01hdHJpeEdldChsaHMsIGosIDApICogcmhzX2lqOworICAgICAgICAgICAgcmkxICs9IHJzTWF0cml4R2V0KGxocywgaiwgMSkgKiByaHNfaWo7CisgICAgICAgIH0KKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMCwgcmkwKTsKKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMSwgcmkxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDJ4MiAqbSwgY29uc3QgcnNfbWF0cml4MngyICpyaHMpIHsKKyAgICByc19tYXRyaXgyeDIgbXQ7CisgICAgcnNNYXRyaXhMb2FkTXVsdGlwbHkoJm10LCBtLCByaHMpOworICAgIHJzTWF0cml4TG9hZChtLCAmbXQpOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhSb3RhdGUocnNfbWF0cml4NHg0ICptLCBmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICByc19tYXRyaXg0eDQgbTE7CisgICAgcnNNYXRyaXhMb2FkUm90YXRlKCZtMSwgcm90LCB4LCB5LCB6KTsKKyAgICByc01hdHJpeE11bHRpcGx5KG0sICZtMSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFNjYWxlKHJzX21hdHJpeDR4NCAqbSwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIHJzX21hdHJpeDR4NCBtMTsKKyAgICByc01hdHJpeExvYWRTY2FsZSgmbTEsIHgsIHksIHopOworICAgIHJzTWF0cml4TXVsdGlwbHkobSwgJm0xKTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4VHJhbnNsYXRlKHJzX21hdHJpeDR4NCAqbSwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIHJzX21hdHJpeDR4NCBtMTsKKyAgICByc01hdHJpeExvYWRUcmFuc2xhdGUoJm0xLCB4LCB5LCB6KTsKKyAgICByc01hdHJpeE11bHRpcGx5KG0sICZtMSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWRPcnRobyhyc19tYXRyaXg0eDQgKm0sIGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGZsb2F0IHRvcCwgZmxvYXQgbmVhciwgZmxvYXQgZmFyKSB7CisgICAgcnNNYXRyaXhMb2FkSWRlbnRpdHkobSk7CisgICAgbS0+bVswXSA9IDIuZiAvIChyaWdodCAtIGxlZnQpOworICAgIG0tPm1bNV0gPSAyLmYgLyAodG9wIC0gYm90dG9tKTsKKyAgICBtLT5tWzEwXT0gLTIuZiAvIChmYXIgLSBuZWFyKTsKKyAgICBtLT5tWzEyXT0gLShyaWdodCArIGxlZnQpIC8gKHJpZ2h0IC0gbGVmdCk7CisgICAgbS0+bVsxM109IC0odG9wICsgYm90dG9tKSAvICh0b3AgLSBib3R0b20pOworICAgIG0tPm1bMTRdPSAtKGZhciArIG5lYXIpIC8gKGZhciAtIG5lYXIpOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkRnJ1c3R1bShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGZsb2F0IHRvcCwgZmxvYXQgbmVhciwgZmxvYXQgZmFyKSB7CisgICAgcnNNYXRyaXhMb2FkSWRlbnRpdHkobSk7CisgICAgbS0+bVswXSA9IDIuZiAqIG5lYXIgLyAocmlnaHQgLSBsZWZ0KTsKKyAgICBtLT5tWzVdID0gMi5mICogbmVhciAvICh0b3AgLSBib3R0b20pOworICAgIG0tPm1bOF0gPSAocmlnaHQgKyBsZWZ0KSAvIChyaWdodCAtIGxlZnQpOworICAgIG0tPm1bOV0gPSAodG9wICsgYm90dG9tKSAvICh0b3AgLSBib3R0b20pOworICAgIG0tPm1bMTBdPSAtKGZhciArIG5lYXIpIC8gKGZhciAtIG5lYXIpOworICAgIG0tPm1bMTFdPSAtMS5mOworICAgIG0tPm1bMTRdPSAtMi5mICogZmFyICogbmVhciAvIChmYXIgLSBuZWFyKTsKKyAgICBtLT5tWzE1XT0gMC5mOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkUGVyc3BlY3RpdmUocnNfbWF0cml4NHg0KiBtLCBmbG9hdCBmb3Z5LCBmbG9hdCBhc3BlY3QsIGZsb2F0IG5lYXIsIGZsb2F0IGZhcikgeworICAgIGZsb2F0IHRvcCA9IG5lYXIgKiB0YW4oKGZsb2F0KSAoZm92eSAqIE1fUEkgLyAzNjAuMGYpKTsKKyAgICBmbG9hdCBib3R0b20gPSAtdG9wOworICAgIGZsb2F0IGxlZnQgPSBib3R0b20gKiBhc3BlY3Q7CisgICAgZmxvYXQgcmlnaHQgPSB0b3AgKiBhc3BlY3Q7CisgICAgcnNNYXRyaXhMb2FkRnJ1c3R1bShtLCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcik7Cit9CisKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4NHg0ICptLCBmbG9hdDQgaW4pIHsKKyAgICBmbG9hdDQgcmV0OworICAgIHJldC54ID0gKG0tPm1bMF0gKiBpbi54KSArIChtLT5tWzRdICogaW4ueSkgKyAobS0+bVs4XSAqIGluLnopICsgKG0tPm1bMTJdICogaW4udyk7CisgICAgcmV0LnkgPSAobS0+bVsxXSAqIGluLngpICsgKG0tPm1bNV0gKiBpbi55KSArIChtLT5tWzldICogaW4ueikgKyAobS0+bVsxM10gKiBpbi53KTsKKyAgICByZXQueiA9IChtLT5tWzJdICogaW4ueCkgKyAobS0+bVs2XSAqIGluLnkpICsgKG0tPm1bMTBdICogaW4ueikgKyAobS0+bVsxNF0gKiBpbi53KTsKKyAgICByZXQudyA9IChtLT5tWzNdICogaW4ueCkgKyAobS0+bVs3XSAqIGluLnkpICsgKG0tPm1bMTFdICogaW4ueikgKyAobS0+bVsxNV0gKiBpbi53KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDR4NCAqbSwgZmxvYXQzIGluKSB7CisgICAgZmxvYXQ0IHJldDsKKyAgICByZXQueCA9IChtLT5tWzBdICogaW4ueCkgKyAobS0+bVs0XSAqIGluLnkpICsgKG0tPm1bOF0gKiBpbi56KSArIG0tPm1bMTJdOworICAgIHJldC55ID0gKG0tPm1bMV0gKiBpbi54KSArIChtLT5tWzVdICogaW4ueSkgKyAobS0+bVs5XSAqIGluLnopICsgbS0+bVsxM107CisgICAgcmV0LnogPSAobS0+bVsyXSAqIGluLngpICsgKG0tPm1bNl0gKiBpbi55KSArIChtLT5tWzEwXSAqIGluLnopICsgbS0+bVsxNF07CisgICAgcmV0LncgPSAobS0+bVszXSAqIGluLngpICsgKG0tPm1bN10gKiBpbi55KSArIChtLT5tWzExXSAqIGluLnopICsgbS0+bVsxNV07CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXg0eDQgKm0sIGZsb2F0MiBpbikgeworICAgIGZsb2F0NCByZXQ7CisgICAgcmV0LnggPSAobS0+bVswXSAqIGluLngpICsgKG0tPm1bNF0gKiBpbi55KSArIG0tPm1bMTJdOworICAgIHJldC55ID0gKG0tPm1bMV0gKiBpbi54KSArIChtLT5tWzVdICogaW4ueSkgKyBtLT5tWzEzXTsKKyAgICByZXQueiA9IChtLT5tWzJdICogaW4ueCkgKyAobS0+bVs2XSAqIGluLnkpICsgbS0+bVsxNF07CisgICAgcmV0LncgPSAobS0+bVszXSAqIGluLngpICsgKG0tPm1bN10gKiBpbi55KSArIG0tPm1bMTVdOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4M3gzICptLCBmbG9hdDMgaW4pIHsKKyAgICBmbG9hdDMgcmV0OworICAgIHJldC54ID0gKG0tPm1bMF0gKiBpbi54KSArIChtLT5tWzNdICogaW4ueSkgKyAobS0+bVs2XSAqIGluLnopOworICAgIHJldC55ID0gKG0tPm1bMV0gKiBpbi54KSArIChtLT5tWzRdICogaW4ueSkgKyAobS0+bVs3XSAqIGluLnopOworICAgIHJldC56ID0gKG0tPm1bMl0gKiBpbi54KSArIChtLT5tWzVdICogaW4ueSkgKyAobS0+bVs4XSAqIGluLnopOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4M3gzICptLCBmbG9hdDIgaW4pIHsKKyAgICBmbG9hdDMgcmV0OworICAgIHJldC54ID0gKG0tPm1bMF0gKiBpbi54KSArIChtLT5tWzNdICogaW4ueSk7CisgICAgcmV0LnkgPSAobS0+bVsxXSAqIGluLngpICsgKG0tPm1bNF0gKiBpbi55KTsKKyAgICByZXQueiA9IChtLT5tWzJdICogaW4ueCkgKyAobS0+bVs1XSAqIGluLnkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4MngyICptLCBmbG9hdDIgaW4pIHsKKyAgICBmbG9hdDIgcmV0OworICAgIHJldC54ID0gKG0tPm1bMF0gKiBpbi54KSArIChtLT5tWzJdICogaW4ueSk7CisgICAgcmV0LnkgPSAobS0+bVsxXSAqIGluLngpICsgKG0tPm1bM10gKiBpbi55KTsKKyAgICByZXR1cm4gcmV0OworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIG1hdHJpeCB3YXMgc3VjY2Vzc2Z1bGx5IGludmVyc2VkCitzdGF0aWMgYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhJbnZlcnNlKHJzX21hdHJpeDR4NCAqbSkgeworICAgIHJzX21hdHJpeDR4NCByZXN1bHQ7CisKKyAgICBpbnQgaSwgajsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyArK2opIHsKKyAgICAgICAgICAgIC8vIGNvbXB1dGVDb2ZhY3RvciBmb3IgaW50IGksIGludCBqCisgICAgICAgICAgICBpbnQgYzAgPSAoaSsxKSAlIDQ7CisgICAgICAgICAgICBpbnQgYzEgPSAoaSsyKSAlIDQ7CisgICAgICAgICAgICBpbnQgYzIgPSAoaSszKSAlIDQ7CisgICAgICAgICAgICBpbnQgcjAgPSAoaisxKSAlIDQ7CisgICAgICAgICAgICBpbnQgcjEgPSAoaisyKSAlIDQ7CisgICAgICAgICAgICBpbnQgcjIgPSAoaiszKSAlIDQ7CisKKyAgICAgICAgICAgIGZsb2F0IG1pbm9yID0gKG0tPm1bYzAgKyA0KnIwXSAqIChtLT5tW2MxICsgNCpyMV0gKiBtLT5tW2MyICsgNCpyMl0gLSBtLT5tW2MxICsgNCpyMl0gKiBtLT5tW2MyICsgNCpyMV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgIC0gKG0tPm1bYzAgKyA0KnIxXSAqIChtLT5tW2MxICsgNCpyMF0gKiBtLT5tW2MyICsgNCpyMl0gLSBtLT5tW2MxICsgNCpyMl0gKiBtLT5tW2MyICsgNCpyMF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgKG0tPm1bYzAgKyA0KnIyXSAqIChtLT5tW2MxICsgNCpyMF0gKiBtLT5tW2MyICsgNCpyMV0gLSBtLT5tW2MxICsgNCpyMV0gKiBtLT5tW2MyICsgNCpyMF0pKTsKKworICAgICAgICAgICAgZmxvYXQgY29mYWN0b3IgPSAoaStqKSAmIDEgPyAtbWlub3IgOiBtaW5vcjsKKworICAgICAgICAgICAgcmVzdWx0Lm1bNCppICsgal0gPSBjb2ZhY3RvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIERvdCBwcm9kdWN0IG9mIDB0aCBjb2x1bW4gb2Ygc291cmNlIGFuZCAwdGggcm93IG9mIHJlc3VsdAorICAgIGZsb2F0IGRldCA9IG0tPm1bMF0qcmVzdWx0Lm1bMF0gKyBtLT5tWzRdKnJlc3VsdC5tWzFdICsKKyAgICAgICAgICAgICAgICAgbS0+bVs4XSpyZXN1bHQubVsyXSArIG0tPm1bMTJdKnJlc3VsdC5tWzNdOworCisgICAgaWYgKGZhYnMoZGV0KSA8IDFlLTYpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGRldCA9IDEuMGYgLyBkZXQ7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICAgICAgbS0+bVtpXSA9IHJlc3VsdC5tW2ldICogZGV0OworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIG1hdHJpeCB3YXMgc3VjY2Vzc2Z1bGx5IGludmVyc2VkCitzdGF0aWMgYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhJbnZlcnNlVHJhbnNwb3NlKHJzX21hdHJpeDR4NCAqbSkgeworICAgIHJzX21hdHJpeDR4NCByZXN1bHQ7CisKKyAgICBpbnQgaSwgajsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyArK2opIHsKKyAgICAgICAgICAgIC8vIGNvbXB1dGVDb2ZhY3RvciBmb3IgaW50IGksIGludCBqCisgICAgICAgICAgICBpbnQgYzAgPSAoaSsxKSAlIDQ7CisgICAgICAgICAgICBpbnQgYzEgPSAoaSsyKSAlIDQ7CisgICAgICAgICAgICBpbnQgYzIgPSAoaSszKSAlIDQ7CisgICAgICAgICAgICBpbnQgcjAgPSAoaisxKSAlIDQ7CisgICAgICAgICAgICBpbnQgcjEgPSAoaisyKSAlIDQ7CisgICAgICAgICAgICBpbnQgcjIgPSAoaiszKSAlIDQ7CisKKyAgICAgICAgICAgIGZsb2F0IG1pbm9yID0gKG0tPm1bYzAgKyA0KnIwXSAqIChtLT5tW2MxICsgNCpyMV0gKiBtLT5tW2MyICsgNCpyMl0gLSBtLT5tW2MxICsgNCpyMl0gKiBtLT5tW2MyICsgNCpyMV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgIC0gKG0tPm1bYzAgKyA0KnIxXSAqIChtLT5tW2MxICsgNCpyMF0gKiBtLT5tW2MyICsgNCpyMl0gLSBtLT5tW2MxICsgNCpyMl0gKiBtLT5tW2MyICsgNCpyMF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgKG0tPm1bYzAgKyA0KnIyXSAqIChtLT5tW2MxICsgNCpyMF0gKiBtLT5tW2MyICsgNCpyMV0gLSBtLT5tW2MxICsgNCpyMV0gKiBtLT5tW2MyICsgNCpyMF0pKTsKKworICAgICAgICAgICAgZmxvYXQgY29mYWN0b3IgPSAoaStqKSAmIDEgPyAtbWlub3IgOiBtaW5vcjsKKworICAgICAgICAgICAgcmVzdWx0Lm1bNCpqICsgaV0gPSBjb2ZhY3RvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIERvdCBwcm9kdWN0IG9mIDB0aCBjb2x1bW4gb2Ygc291cmNlIGFuZCAwdGggY29sdW1uIG9mIHJlc3VsdAorICAgIGZsb2F0IGRldCA9IG0tPm1bMF0qcmVzdWx0Lm1bMF0gKyBtLT5tWzRdKnJlc3VsdC5tWzRdICsKKyAgICAgICAgICAgICAgICAgbS0+bVs4XSpyZXN1bHQubVs4XSArIG0tPm1bMTJdKnJlc3VsdC5tWzEyXTsKKworICAgIGlmIChmYWJzKGRldCkgPCAxZS02KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkZXQgPSAxLjBmIC8gZGV0OworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICAgIG0tPm1baV0gPSByZXN1bHQubVtpXSAqIGRldDsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4VHJhbnNwb3NlKHJzX21hdHJpeDR4NCAqbSkgeworICAgIGludCBpLCBqOworICAgIGZsb2F0IHRlbXA7CisgICAgZm9yIChpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICBmb3IgKGogPSBpICsgMTsgaiA8IDQ7ICsraikgeworICAgICAgICAgICAgdGVtcCA9IG0tPm1baSo0ICsgal07CisgICAgICAgICAgICBtLT5tW2kqNCArIGpdID0gbS0+bVtqKjQgKyBpXTsKKyAgICAgICAgICAgIG0tPm1baio0ICsgaV0gPSB0ZW1wOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhUcmFuc3Bvc2UocnNfbWF0cml4M3gzICptKSB7CisgICAgaW50IGksIGo7CisgICAgZmxvYXQgdGVtcDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgMzsgKytqKSB7CisgICAgICAgICAgICB0ZW1wID0gbS0+bVtpKjMgKyBqXTsKKyAgICAgICAgICAgIG0tPm1baSozICsgal0gPSBtLT5tW2oqNCArIGldOworICAgICAgICAgICAgbS0+bVtqKjMgKyBpXSA9IHRlbXA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFRyYW5zcG9zZShyc19tYXRyaXgyeDIgKm0pIHsKKyAgICBmbG9hdCB0ZW1wID0gbS0+bVsxXTsKKyAgICBtLT5tWzFdID0gbS0+bVsyXTsKKyAgICBtLT5tWzJdID0gdGVtcDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIHF1YXRlcm5pb24gb3BzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNRdWF0ZXJuaW9uU2V0KHJzX3F1YXRlcm5pb24gKnEsIGZsb2F0IHcsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICBxLT53ID0gdzsKKyAgICBxLT54ID0geDsKKyAgICBxLT55ID0geTsKKyAgICBxLT56ID0gejsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzUXVhdGVybmlvblNldChyc19xdWF0ZXJuaW9uICpxLCBjb25zdCByc19xdWF0ZXJuaW9uICpyaHMpIHsKKyAgICBxLT53ID0gcmhzLT53OworICAgIHEtPnggPSByaHMtPng7CisgICAgcS0+eSA9IHJocy0+eTsKKyAgICBxLT56ID0gcmhzLT56OworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNRdWF0ZXJuaW9uTXVsdGlwbHkocnNfcXVhdGVybmlvbiAqcSwgZmxvYXQgcykgeworICAgIHEtPncgKj0gczsKKyAgICBxLT54ICo9IHM7CisgICAgcS0+eSAqPSBzOworICAgIHEtPnogKj0gczsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzUXVhdGVybmlvbk11bHRpcGx5KHJzX3F1YXRlcm5pb24gKnEsIGNvbnN0IHJzX3F1YXRlcm5pb24gKnJocykgeworICAgIHEtPncgPSAtcS0+eCpyaHMtPnggLSBxLT55KnJocy0+eSAtIHEtPnoqcmhzLT56ICsgcS0+dypyaHMtPnc7CisgICAgcS0+eCA9ICBxLT54KnJocy0+dyArIHEtPnkqcmhzLT56IC0gcS0+eipyaHMtPnkgKyBxLT53KnJocy0+eDsKKyAgICBxLT55ID0gLXEtPngqcmhzLT56ICsgcS0+eSpyaHMtPncgKyBxLT56KnJocy0+eiArIHEtPncqcmhzLT55OworICAgIHEtPnogPSAgcS0+eCpyaHMtPnkgLSBxLT55KnJocy0+eCArIHEtPnoqcmhzLT53ICsgcS0+dypyaHMtPno7Cit9CisKK3N0YXRpYyB2b2lkCityc1F1YXRlcm5pb25BZGQocnNfcXVhdGVybmlvbiAqcSwgY29uc3QgcnNfcXVhdGVybmlvbiAqcmhzKSB7CisgICAgcS0+dyAqPSByaHMtPnc7CisgICAgcS0+eCAqPSByaHMtPng7CisgICAgcS0+eSAqPSByaHMtPnk7CisgICAgcS0+eiAqPSByaHMtPno7Cit9CisKK3N0YXRpYyB2b2lkCityc1F1YXRlcm5pb25Mb2FkUm90YXRlVW5pdChyc19xdWF0ZXJuaW9uICpxLCBmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICByb3QgKj0gKGZsb2F0KShNX1BJIC8gMTgwLjBmKSAqIDAuNWY7CisgICAgZmxvYXQgYyA9IGNvcyhyb3QpOworICAgIGZsb2F0IHMgPSBzaW4ocm90KTsKKworICAgIHEtPncgPSBjOworICAgIHEtPnggPSB4ICogczsKKyAgICBxLT55ID0geSAqIHM7CisgICAgcS0+eiA9IHogKiBzOworfQorCitzdGF0aWMgdm9pZAorcnNRdWF0ZXJuaW9uTG9hZFJvdGF0ZShyc19xdWF0ZXJuaW9uICpxLCBmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICBjb25zdCBmbG9hdCBsZW4gPSB4KnggKyB5KnkgKyB6Kno7CisgICAgaWYgKGxlbiAhPSAxKSB7CisgICAgICAgIGNvbnN0IGZsb2F0IHJlY2lwTGVuID0gMS5mIC8gc3FydChsZW4pOworICAgICAgICB4ICo9IHJlY2lwTGVuOworICAgICAgICB5ICo9IHJlY2lwTGVuOworICAgICAgICB6ICo9IHJlY2lwTGVuOworICAgIH0KKyAgICByc1F1YXRlcm5pb25Mb2FkUm90YXRlVW5pdChxLCByb3QsIHgsIHksIHopOworfQorCitzdGF0aWMgdm9pZAorcnNRdWF0ZXJuaW9uQ29uanVnYXRlKHJzX3F1YXRlcm5pb24gKnEpIHsKKyAgICBxLT54ID0gLXEtPng7CisgICAgcS0+eSA9IC1xLT55OworICAgIHEtPnogPSAtcS0+ejsKK30KKworc3RhdGljIGZsb2F0Cityc1F1YXRlcm5pb25Eb3QoY29uc3QgcnNfcXVhdGVybmlvbiAqcTAsIGNvbnN0IHJzX3F1YXRlcm5pb24gKnExKSB7CisgICAgcmV0dXJuIHEwLT53KnExLT53ICsgcTAtPngqcTEtPnggKyBxMC0+eSpxMS0+eSArIHEwLT56KnExLT56OworfQorCitzdGF0aWMgdm9pZAorcnNRdWF0ZXJuaW9uTm9ybWFsaXplKHJzX3F1YXRlcm5pb24gKnEpIHsKKyAgICBjb25zdCBmbG9hdCBsZW4gPSByc1F1YXRlcm5pb25Eb3QocSwgcSk7CisgICAgaWYgKGxlbiAhPSAxKSB7CisgICAgICAgIGNvbnN0IGZsb2F0IHJlY2lwTGVuID0gMS5mIC8gc3FydChsZW4pOworICAgICAgICByc1F1YXRlcm5pb25NdWx0aXBseShxLCByZWNpcExlbik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcnNRdWF0ZXJuaW9uU2xlcnAocnNfcXVhdGVybmlvbiAqcSwgY29uc3QgcnNfcXVhdGVybmlvbiAqcTAsIGNvbnN0IHJzX3F1YXRlcm5pb24gKnExLCBmbG9hdCB0KSB7CisgICAgaWYodCA8PSAwLjBmKSB7CisgICAgICAgIHJzUXVhdGVybmlvblNldChxLCBxMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYodCA+PSAxLjBmKSB7CisgICAgICAgIHJzUXVhdGVybmlvblNldChxLCBxMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByc19xdWF0ZXJuaW9uIHRlbXBxMCwgdGVtcHExOworICAgIHJzUXVhdGVybmlvblNldCgmdGVtcHEwLCBxMCk7CisgICAgcnNRdWF0ZXJuaW9uU2V0KCZ0ZW1wcTEsIHExKTsKKworICAgIGZsb2F0IGFuZ2xlID0gcnNRdWF0ZXJuaW9uRG90KHEwLCBxMSk7CisgICAgaWYoYW5nbGUgPCAwKSB7CisgICAgICAgIHJzUXVhdGVybmlvbk11bHRpcGx5KCZ0ZW1wcTAsIC0xLjBmKTsKKyAgICAgICAgYW5nbGUgKj0gLTEuMGY7CisgICAgfQorCisgICAgZmxvYXQgc2NhbGUsIGludlNjYWxlOworICAgIGlmIChhbmdsZSArIDEuMGYgPiAwLjA1ZikgeworICAgICAgICBpZiAoMS4wZiAtIGFuZ2xlID49IDAuMDVmKSB7CisgICAgICAgICAgICBmbG9hdCB0aGV0YSA9IGFjb3MoYW5nbGUpOworICAgICAgICAgICAgZmxvYXQgaW52U2luVGhldGEgPSAxLjBmIC8gc2luKHRoZXRhKTsKKyAgICAgICAgICAgIHNjYWxlID0gc2luKHRoZXRhICogKDEuMGYgLSB0KSkgKiBpbnZTaW5UaGV0YTsKKyAgICAgICAgICAgIGludlNjYWxlID0gc2luKHRoZXRhICogdCkgKiBpbnZTaW5UaGV0YTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNjYWxlID0gMS4wZiAtIHQ7CisgICAgICAgICAgICBpbnZTY2FsZSA9IHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzUXVhdGVybmlvblNldCgmdGVtcHExLCB0ZW1wcTAueiwgLXRlbXBxMC55LCB0ZW1wcTAueCwgLXRlbXBxMC53KTsKKyAgICAgICAgc2NhbGUgPSBzaW4oTV9QSSAqICgwLjVmIC0gdCkpOworICAgICAgICBpbnZTY2FsZSA9IHNpbihNX1BJICogdCk7CisgICAgfQorCisgICAgcnNRdWF0ZXJuaW9uU2V0KHEsIHRlbXBxMC53KnNjYWxlICsgdGVtcHExLncqaW52U2NhbGUsIHRlbXBxMC54KnNjYWxlICsgdGVtcHExLngqaW52U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wcTAueSpzY2FsZSArIHRlbXBxMS55KmludlNjYWxlLCB0ZW1wcTAueipzY2FsZSArIHRlbXBxMS56KmludlNjYWxlKTsKK30KKworc3RhdGljIHZvaWQgcnNRdWF0ZXJuaW9uR2V0TWF0cml4VW5pdChyc19tYXRyaXg0eDQgKm0sIGNvbnN0IHJzX3F1YXRlcm5pb24gKnEpIHsKKyAgICBmbG9hdCB4MiA9IDIuMGYgKiBxLT54ICogcS0+eDsKKyAgICBmbG9hdCB5MiA9IDIuMGYgKiBxLT55ICogcS0+eTsKKyAgICBmbG9hdCB6MiA9IDIuMGYgKiBxLT56ICogcS0+ejsKKyAgICBmbG9hdCB4eSA9IDIuMGYgKiBxLT54ICogcS0+eTsKKyAgICBmbG9hdCB3eiA9IDIuMGYgKiBxLT53ICogcS0+ejsKKyAgICBmbG9hdCB4eiA9IDIuMGYgKiBxLT54ICogcS0+ejsKKyAgICBmbG9hdCB3eSA9IDIuMGYgKiBxLT53ICogcS0+eTsKKyAgICBmbG9hdCB3eCA9IDIuMGYgKiBxLT53ICogcS0+eDsKKyAgICBmbG9hdCB5eiA9IDIuMGYgKiBxLT55ICogcS0+ejsKKworICAgIG0tPm1bMF0gPSAxLjBmIC0geTIgLSB6MjsKKyAgICBtLT5tWzFdID0geHkgLSB3ejsKKyAgICBtLT5tWzJdID0geHogKyB3eTsKKyAgICBtLT5tWzNdID0gMC4wZjsKKworICAgIG0tPm1bNF0gPSB4eSArIHd6OworICAgIG0tPm1bNV0gPSAxLjBmIC0geDIgLSB6MjsKKyAgICBtLT5tWzZdID0geXogLSB3eDsKKyAgICBtLT5tWzddID0gMC4wZjsKKworICAgIG0tPm1bOF0gPSB4eiAtIHd5OworICAgIG0tPm1bOV0gPSB5eiAtIHd4OworICAgIG0tPm1bMTBdID0gMS4wZiAtIHgyIC0geTI7CisgICAgbS0+bVsxMV0gPSAwLjBmOworCisgICAgbS0+bVsxMl0gPSAwLjBmOworICAgIG0tPm1bMTNdID0gMC4wZjsKKyAgICBtLT5tWzE0XSA9IDAuMGY7CisgICAgbS0+bVsxNV0gPSAxLjBmOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gdXRpbGl0eSBmdW5jcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3ZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzRXh0cmFjdEZydXN0dW1QbGFuZXMoY29uc3QgcnNfbWF0cml4NHg0ICptb2RlbFZpZXdQcm9qLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0NCAqbGVmdCwgZmxvYXQ0ICpyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdDQgKnRvcCwgZmxvYXQ0ICpib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQ0ICpuZWFyLCBmbG9hdDQgKmZhcikgeworICAgIC8vIHggeSB6IHcgPSBhIGIgYyBkIGluIHRoZSBwbGFuZSBlcXVhdGlvbgorICAgIGxlZnQtPnggPSBtb2RlbFZpZXdQcm9qLT5tWzNdICsgbW9kZWxWaWV3UHJvai0+bVswXTsKKyAgICBsZWZ0LT55ID0gbW9kZWxWaWV3UHJvai0+bVs3XSArIG1vZGVsVmlld1Byb2otPm1bNF07CisgICAgbGVmdC0+eiA9IG1vZGVsVmlld1Byb2otPm1bMTFdICsgbW9kZWxWaWV3UHJvai0+bVs4XTsKKyAgICBsZWZ0LT53ID0gbW9kZWxWaWV3UHJvai0+bVsxNV0gKyBtb2RlbFZpZXdQcm9qLT5tWzEyXTsKKworICAgIHJpZ2h0LT54ID0gbW9kZWxWaWV3UHJvai0+bVszXSAtIG1vZGVsVmlld1Byb2otPm1bMF07CisgICAgcmlnaHQtPnkgPSBtb2RlbFZpZXdQcm9qLT5tWzddIC0gbW9kZWxWaWV3UHJvai0+bVs0XTsKKyAgICByaWdodC0+eiA9IG1vZGVsVmlld1Byb2otPm1bMTFdIC0gbW9kZWxWaWV3UHJvai0+bVs4XTsKKyAgICByaWdodC0+dyA9IG1vZGVsVmlld1Byb2otPm1bMTVdIC0gbW9kZWxWaWV3UHJvai0+bVsxMl07CisKKyAgICB0b3AtPnggPSBtb2RlbFZpZXdQcm9qLT5tWzNdIC0gbW9kZWxWaWV3UHJvai0+bVsxXTsKKyAgICB0b3AtPnkgPSBtb2RlbFZpZXdQcm9qLT5tWzddIC0gbW9kZWxWaWV3UHJvai0+bVs1XTsKKyAgICB0b3AtPnogPSBtb2RlbFZpZXdQcm9qLT5tWzExXSAtIG1vZGVsVmlld1Byb2otPm1bOV07CisgICAgdG9wLT53ID0gbW9kZWxWaWV3UHJvai0+bVsxNV0gLSBtb2RlbFZpZXdQcm9qLT5tWzEzXTsKKworICAgIGJvdHRvbS0+eCA9IG1vZGVsVmlld1Byb2otPm1bM10gKyBtb2RlbFZpZXdQcm9qLT5tWzFdOworICAgIGJvdHRvbS0+eSA9IG1vZGVsVmlld1Byb2otPm1bN10gKyBtb2RlbFZpZXdQcm9qLT5tWzVdOworICAgIGJvdHRvbS0+eiA9IG1vZGVsVmlld1Byb2otPm1bMTFdICsgbW9kZWxWaWV3UHJvai0+bVs5XTsKKyAgICBib3R0b20tPncgPSBtb2RlbFZpZXdQcm9qLT5tWzE1XSArIG1vZGVsVmlld1Byb2otPm1bMTNdOworCisgICAgbmVhci0+eCA9IG1vZGVsVmlld1Byb2otPm1bM10gKyBtb2RlbFZpZXdQcm9qLT5tWzJdOworICAgIG5lYXItPnkgPSBtb2RlbFZpZXdQcm9qLT5tWzddICsgbW9kZWxWaWV3UHJvai0+bVs2XTsKKyAgICBuZWFyLT56ID0gbW9kZWxWaWV3UHJvai0+bVsxMV0gKyBtb2RlbFZpZXdQcm9qLT5tWzEwXTsKKyAgICBuZWFyLT53ID0gbW9kZWxWaWV3UHJvai0+bVsxNV0gKyBtb2RlbFZpZXdQcm9qLT5tWzE0XTsKKworICAgIGZhci0+eCA9IG1vZGVsVmlld1Byb2otPm1bM10gLSBtb2RlbFZpZXdQcm9qLT5tWzJdOworICAgIGZhci0+eSA9IG1vZGVsVmlld1Byb2otPm1bN10gLSBtb2RlbFZpZXdQcm9qLT5tWzZdOworICAgIGZhci0+eiA9IG1vZGVsVmlld1Byb2otPm1bMTFdIC0gbW9kZWxWaWV3UHJvai0+bVsxMF07CisgICAgZmFyLT53ID0gbW9kZWxWaWV3UHJvai0+bVsxNV0gLSBtb2RlbFZpZXdQcm9qLT5tWzE0XTsKKworICAgIGZsb2F0IGxlbiA9IGxlbmd0aChsZWZ0LT54eXopOworICAgICpsZWZ0IC89IGxlbjsKKyAgICBsZW4gPSBsZW5ndGgocmlnaHQtPnh5eik7CisgICAgKnJpZ2h0IC89IGxlbjsKKyAgICBsZW4gPSBsZW5ndGgodG9wLT54eXopOworICAgICp0b3AgLz0gbGVuOworICAgIGxlbiA9IGxlbmd0aChib3R0b20tPnh5eik7CisgICAgKmJvdHRvbSAvPSBsZW47CisgICAgbGVuID0gbGVuZ3RoKG5lYXItPnh5eik7CisgICAgKm5lYXIgLz0gbGVuOworICAgIGxlbiA9IGxlbmd0aChmYXItPnh5eik7CisgICAgKmZhciAvPSBsZW47Cit9CisKK2Jvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzSXNTcGhlcmVJbkZydXN0dW0oZmxvYXQ0ICpzcGhlcmUsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQ0ICpsZWZ0LCBmbG9hdDQgKnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0NCAqdG9wLCBmbG9hdDQgKmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdDQgKm5lYXIsIGZsb2F0NCAqZmFyKSB7CisKKyAgICBmbG9hdCBkaXN0VG9DZW50ZXIgPSBkb3QobGVmdC0+eHl6LCBzcGhlcmUtPnh5eikgKyBsZWZ0LT53OworICAgIGlmKGRpc3RUb0NlbnRlciA8IC1zcGhlcmUtPncpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkaXN0VG9DZW50ZXIgPSBkb3QocmlnaHQtPnh5eiwgc3BoZXJlLT54eXopICsgcmlnaHQtPnc7CisgICAgaWYoZGlzdFRvQ2VudGVyIDwgLXNwaGVyZS0+dykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGRpc3RUb0NlbnRlciA9IGRvdCh0b3AtPnh5eiwgc3BoZXJlLT54eXopICsgdG9wLT53OworICAgIGlmKGRpc3RUb0NlbnRlciA8IC1zcGhlcmUtPncpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkaXN0VG9DZW50ZXIgPSBkb3QoYm90dG9tLT54eXosIHNwaGVyZS0+eHl6KSArIGJvdHRvbS0+dzsKKyAgICBpZihkaXN0VG9DZW50ZXIgPCAtc3BoZXJlLT53KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZGlzdFRvQ2VudGVyID0gZG90KG5lYXItPnh5eiwgc3BoZXJlLT54eXopICsgbmVhci0+dzsKKyAgICBpZihkaXN0VG9DZW50ZXIgPCAtc3BoZXJlLT53KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZGlzdFRvQ2VudGVyID0gZG90KGZhci0+eHl6LCBzcGhlcmUtPnh5eikgKyBmYXItPnc7CisgICAgaWYoZGlzdFRvQ2VudGVyIDwgLXNwaGVyZS0+dykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBpbnQgb3BzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitfX2lubGluZV9fIHN0YXRpYyB1aW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSwgYWx3YXlzX2lubGluZSkpIHJzQ2xhbXAodWludCBhbW91bnQsIHVpbnQgbG93LCB1aW50IGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK19faW5saW5lX18gc3RhdGljIGludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUsIGFsd2F5c19pbmxpbmUpKSByc0NsYW1wKGludCBhbW91bnQsIGludCBsb3csIGludCBoaWdoKSB7CisgICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Cit9CitfX2lubGluZV9fIHN0YXRpYyB1c2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlLCBhbHdheXNfaW5saW5lKSkgcnNDbGFtcCh1c2hvcnQgYW1vdW50LCB1c2hvcnQgbG93LCB1c2hvcnQgaGlnaCkgeworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorX19pbmxpbmVfXyBzdGF0aWMgc2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlLCBhbHdheXNfaW5saW5lKSkgcnNDbGFtcChzaG9ydCBhbW91bnQsIHNob3J0IGxvdywgc2hvcnQgaGlnaCkgeworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorX19pbmxpbmVfXyBzdGF0aWMgdWNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlLCBhbHdheXNfaW5saW5lKSkgcnNDbGFtcCh1Y2hhciBhbW91bnQsIHVjaGFyIGxvdywgdWNoYXIgaGlnaCkgeworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorX19pbmxpbmVfXyBzdGF0aWMgY2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUsIGFsd2F5c19pbmxpbmUpKSByc0NsYW1wKGNoYXIgYW1vdW50LCBjaGFyIGxvdywgY2hhciBoaWdoKSB7CisgICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Cit9CisKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9zY3JpcHRjL3JzX2dyYXBoaWNzLnJzaCBiL2xpYnMvcnMvc2NyaXB0Yy9yc19ncmFwaGljcy5yc2gKaW5kZXggNzBjZDU2Mi4uYWM2ZjhjYyAxMDA2NDQKLS0tIGEvbGlicy9ycy9zY3JpcHRjL3JzX2dyYXBoaWNzLnJzaAorKysgYi9saWJzL3JzL3NjcmlwdGMvcnNfZ3JhcGhpY3MucnNoCkBAIC0xLDY1ICsxLDExMiBAQAorI2lmbmRlZiBfX1JTX0dSQVBISUNTX1JTSF9fCisjZGVmaW5lIF9fUlNfR1JBUEhJQ1NfUlNIX18KKworI2luY2x1ZGUgInJzX21hdGgucnNoIgogCiAKLWV4dGVybiBmbG9hdDIgdmVjMlJhbmQoZmxvYXQgbGVuKTsKKy8vIEJpbmQgYSBQcm9ncmFtRnJhZ21lbnQgdG8gdGhlIFJTIGNvbnRleHQuCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQocnNfcHJvZ3JhbV9mcmFnbWVudCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUocnNfcHJvZ3JhbV9zdG9yZSk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0JpbmRQcm9ncmFtVmVydGV4KHJzX3Byb2dyYW1fdmVydGV4KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnQmluZFByb2dyYW1SYXN0ZXIocnNfcHJvZ3JhbV9yYXN0ZXIpOwogCi1leHRlcm4gZmxvYXQzIGZsb2F0M05vcm0oZmxvYXQzKTsKLWV4dGVybiBmbG9hdCBmbG9hdDNMZW5ndGgoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDMgZmxvYXQzQWRkKGZsb2F0MyBsaHMsIGZsb2F0MyByaHMpOwotZXh0ZXJuIGZsb2F0MyBmbG9hdDNTdWIoZmxvYXQzIGxocywgZmxvYXQzIHJocyk7Ci1leHRlcm4gZmxvYXQzIGZsb2F0M0Nyb3NzKGZsb2F0MyBsaHMsIGZsb2F0MyByaHMpOwotZXh0ZXJuIGZsb2F0IGZsb2F0M0RvdChmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKTsKLWV4dGVybiBmbG9hdDMgZmxvYXQzU2NhbGUoZmxvYXQzIHYsIGZsb2F0IHNjYWxlKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnQmluZFNhbXBsZXIocnNfcHJvZ3JhbV9mcmFnbWVudCwgdWludCBzbG90LCByc19zYW1wbGVyKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnQmluZFRleHR1cmUocnNfcHJvZ3JhbV9mcmFnbWVudCwgdWludCBzbG90LCByc19hbGxvY2F0aW9uKTsKIAotZXh0ZXJuIGZsb2F0NCBmbG9hdDRBZGQoZmxvYXQ0IGxocywgZmxvYXQ0IHJocyk7Ci1leHRlcm4gZmxvYXQ0IGZsb2F0NFN1YihmbG9hdDQgbGhzLCBmbG9hdDQgcmhzKTsKLWV4dGVybiBmbG9hdDQgZmxvYXQ0Q3Jvc3MoZmxvYXQ0IGxocywgZmxvYXQ0IHJocyk7Ci1leHRlcm4gZmxvYXQgZmxvYXQ0RG90KGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpOwotZXh0ZXJuIGZsb2F0NCBmbG9hdDRTY2FsZShmbG9hdDQgdiwgZmxvYXQgc2NhbGUpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZFByb2plY3Rpb25NYXRyaXgoY29uc3QgcnNfbWF0cml4NHg0ICopOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KGNvbnN0IHJzX21hdHJpeDR4NCAqKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRUZXh0dXJlTWF0cml4KGNvbnN0IHJzX21hdHJpeDR4NCAqKTsKIAotICAgIC8vIGNvbnRleHQKLWV4dGVybiB2b2lkIGJpbmRQcm9ncmFtRnJhZ21lbnQocnNfcHJvZ3JhbV9mcmFnbWVudCk7Ci1leHRlcm4gdm9pZCBiaW5kUHJvZ3JhbVN0b3JlKHJzX3Byb2dyYW1fc3RvcmUpOwotZXh0ZXJuIHZvaWQgYmluZFByb2dyYW1WZXJ0ZXgocnNfcHJvZ3JhbV92ZXJ0ZXgpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dQcm9ncmFtVmVydGV4R2V0UHJvamVjdGlvbk1hdHJpeChyc19tYXRyaXg0eDQgKik7CiAKLWV4dGVybiB2b2lkIGJpbmRTYW1wbGVyKHJzX3Byb2dyYW1fZnJhZ21lbnQsIGludCBzbG90LCByc19zYW1wbGVyKTsKLWV4dGVybiB2b2lkIGJpbmRTYW1wbGVyKHJzX3Byb2dyYW1fZnJhZ21lbnQsIGludCBzbG90LCByc19hbGxvY2F0aW9uKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnUHJvZ3JhbUZyYWdtZW50Q29uc3RhbnRDb2xvcihyc19wcm9ncmFtX2ZyYWdtZW50LCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7CiAKLWV4dGVybiB2b2lkIHZwTG9hZE1vZGVsTWF0cml4KGNvbnN0IGZsb2F0ICopOwotZXh0ZXJuIHZvaWQgdnBMb2FkVGV4dHVyZU1hdHJpeChjb25zdCBmbG9hdCAqKTsKK2V4dGVybiB1aW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnR2V0V2lkdGgodm9pZCk7CitleHRlcm4gdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0dldEhlaWdodCh2b2lkKTsKIAorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dVcGxvYWRUb1RleHR1cmUocnNfYWxsb2NhdGlvbik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ1VwbG9hZFRvVGV4dHVyZShyc19hbGxvY2F0aW9uLCB1aW50IG1pcExldmVsKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnVXBsb2FkVG9CdWZmZXJPYmplY3QocnNfYWxsb2NhdGlvbik7CiAKLS8vIGRyYXdpbmcKLWV4dGVybiB2b2lkIGRyYXdSZWN0KGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6KTsKLWV4dGVybiB2b2lkIGRyYXdRdWFkKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQpOwotZXh0ZXJuIHZvaWQgZHJhd1F1YWRUZXhDb29yZHMoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgdTEsIGZsb2F0IHYxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLCBmbG9hdCB1MiwgZmxvYXQgdjIsIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsIGZsb2F0IHUzLCBmbG9hdCB2MywgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCwgZmxvYXQgdTQsIGZsb2F0IHY0KTsKLWV4dGVybiB2b2lkIGRyYXdTcHJpdGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCk7Ci1leHRlcm4gdm9pZCBkcmF3U3ByaXRlU2NyZWVuc3BhY2UoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCk7Ci1leHRlcm4gdm9pZCBkcmF3TGluZShmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyKTsKLWV4dGVybiB2b2lkIGRyYXdQb2ludChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxKTsKLWV4dGVybiB2b2lkIGRyYXdTaW1wbGVNZXNoKGludCBpc20pOwotZXh0ZXJuIHZvaWQgZHJhd1NpbXBsZU1lc2hSYW5nZShpbnQgaXNtLCBpbnQgc3RhcnQsIGludCBsZW4pOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dEcmF3UmVjdChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgeik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0RyYXdRdWFkKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCisgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwKKyAgICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLAorICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB1MSwgZmxvYXQgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwgZmxvYXQgdTIsIGZsb2F0IHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsIGZsb2F0IHUzLCBmbG9hdCB2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LCBmbG9hdCB1NCwgZmxvYXQgdjQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dEcmF3U3ByaXRlU2NyZWVuc3BhY2UoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCk7CiAKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnRHJhd01lc2gocnNfbWVzaCBpc20pOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dEcmF3TWVzaChyc19tZXNoIGlzbSwgdWludCBwcmltaXRpdmVJbmRleCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0RyYXdNZXNoKHJzX21lc2ggaXNtLCB1aW50IHByaW1pdGl2ZUluZGV4LCB1aW50IHN0YXJ0LCB1aW50IGxlbik7CisKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnQ2xlYXJDb2xvcihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0NsZWFyRGVwdGgoZmxvYXQpOworCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0RyYXdUZXh0KGNvbnN0IGNoYXIgKiwgaW50IHgsIGludCB5KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnRHJhd1RleHQocnNfYWxsb2NhdGlvbiwgaW50IHgsIGludCB5KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnQmluZEZvbnQocnNfZm9udCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0ZvbnRDb2xvcihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7CisvLyBSZXR1cm5zIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIHRleHQgcmVsYXRpdmUgdG8gKDAsIDApCisvLyBBbnkgb2YgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tIGNvdWxkIGJlIE5VTEwKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnTWVhc3VyZVRleHQoY29uc3QgY2hhciAqLCBpbnQgKmxlZnQsIGludCAqcmlnaHQsIGludCAqdG9wLCBpbnQgKmJvdHRvbSk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ01lYXN1cmVUZXh0KHJzX2FsbG9jYXRpb24sIGludCAqbGVmdCwgaW50ICpyaWdodCwgaW50ICp0b3AsIGludCAqYm90dG9tKTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dNZXNoQ29tcHV0ZUJvdW5kaW5nQm94KHJzX21lc2ggbWVzaCwgZmxvYXQgKm1pblgsIGZsb2F0ICptaW5ZLCBmbG9hdCAqbWluWiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICptYXhYLCBmbG9hdCAqbWF4WSwgZmxvYXQgKm1heFopOwordm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNnTWVzaENvbXB1dGVCb3VuZGluZ0JveChyc19tZXNoIG1lc2gsIGZsb2F0MyAqYkJveE1pbiwgZmxvYXQzICpiQm94TWF4KSB7CisgICAgZmxvYXQgeDEsIHkxLCB6MSwgeDIsIHkyLCB6MjsKKyAgICByc2dNZXNoQ29tcHV0ZUJvdW5kaW5nQm94KG1lc2gsICZ4MSwgJnkxLCAmejEsICZ4MiwgJnkyLCAmejIpOworICAgIGJCb3hNaW4tPnggPSB4MTsKKyAgICBiQm94TWluLT55ID0geTE7CisgICAgYkJveE1pbi0+eiA9IHoxOworICAgIGJCb3hNYXgtPnggPSB4MjsKKyAgICBiQm94TWF4LT55ID0geTI7CisgICAgYkJveE1heC0+eiA9IHoyOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBtaXNjCi1leHRlcm4gdm9pZCBwZkNsZWFyQ29sb3IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIHZvaWQgY29sb3IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIHZvaWQgaHNiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiB2b2lkIGhzYlRvUmdiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0Kik7Ci1leHRlcm4gaW50IGhzYlRvQWJncihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7CiAKLWV4dGVybiB2b2lkIHVwbG9hZFRvVGV4dHVyZShpbnQsIGludCk7Ci1leHRlcm4gdm9pZCB1cGxvYWRUb0J1ZmZlck9iamVjdChpbnQpOworLy8gRGVwcmljYXRlZAorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBjb2xvcihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7CiAKLWV4dGVybiBpbnQgY29sb3JGbG9hdFJHQkF0b1VOb3JtOChmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gaW50IGNvbG9yRmxvYXRSR0J0bzU2NShmbG9hdCwgZmxvYXQsIGZsb2F0KTsKLQotZXh0ZXJuIGludCBnZXRXaWR0aCgpOwotZXh0ZXJuIGludCBnZXRIZWlnaHQoKTsKLQotZXh0ZXJuIGludCBzZW5kVG9DbGllbnQodm9pZCAqZGF0YSwgaW50IGNtZElELCBpbnQgbGVuLCBpbnQgd2FpdEZvclNwYWNlKTsKLQotZXh0ZXJuIHZvaWQgZGVidWdGKGNvbnN0IGNoYXIgKiwgZmxvYXQpOwotZXh0ZXJuIHZvaWQgZGVidWdJMzIoY29uc3QgY2hhciAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgZGVidWdIZXhJMzIoY29uc3QgY2hhciAqLCBpbnQpOwotCi0KKyNlbmRpZgogCmRpZmYgLS1naXQgYS9saWJzL3JzL3NjcmlwdGMvcnNfbWF0aC5yc2ggYi9saWJzL3JzL3NjcmlwdGMvcnNfbWF0aC5yc2gKaW5kZXggNjEzYzdjYS4uNTcyMGIwNSAxMDA2NDQKLS0tIGEvbGlicy9ycy9zY3JpcHRjL3JzX21hdGgucnNoCisrKyBiL2xpYnMvcnMvc2NyaXB0Yy9yc19tYXRoLnJzaApAQCAtMSwyODcgKzEsMjIyIEBACi0vLyBGbG9hdCBvcHMKKyNpZm5kZWYgX19SU19NQVRIX1JTSF9fCisjZGVmaW5lIF9fUlNfTUFUSF9SU0hfXwogCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoZmxvYXQxNik7CisvLyBEZWJ1Z2dpbmcsIHByaW50IHRvIHRoZSBMT0cgYSBkZXNjcmlwdGlvbiBzdHJpbmcgYW5kIGEgdmFsdWUuCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCBmbG9hdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCBmbG9hdCwgZmxvYXQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIgKiwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCBjb25zdCByc19tYXRyaXg0eDQgKik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCBjb25zdCByc19tYXRyaXgzeDMgKik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCBjb25zdCByc19tYXRyaXgyeDIgKik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCBpbnQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0RlYnVnKGNvbnN0IGNoYXIgKiwgdWludCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCBjb25zdCB2b2lkICopOworI2RlZmluZSBSU19ERUJVRyhhKSByc0RlYnVnKCNhLCBhKQorI2RlZmluZSBSU19ERUJVR19NQVJLRVIgcnNEZWJ1ZyhfX0ZJTEVfXywgX19MSU5FX18pCiAKLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvcyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3MoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvcyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvcyhmbG9hdDE2KTsKIAotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXNpbihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0MTYpOworI2luY2x1ZGUgInJzX2NsLnJzaCIKKyNpbmNsdWRlICJyc19jb3JlLnJzaCIKIAotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuKGZsb2F0MTYpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19lbGVtZW50ICpkc3QsIHJzX2VsZW1lbnQgc3JjKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfdHlwZSAqZHN0LCByc190eXBlIHNyYyk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX2FsbG9jYXRpb24gKmRzdCwgcnNfYWxsb2NhdGlvbiBzcmMpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19zYW1wbGVyICpkc3QsIHJzX3NhbXBsZXIgc3JjKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfc2NyaXB0ICpkc3QsIHJzX3NjcmlwdCBzcmMpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19tZXNoICpkc3QsIHJzX21lc2ggc3JjKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfcHJvZ3JhbV9mcmFnbWVudCAqZHN0LCByc19wcm9ncmFtX2ZyYWdtZW50IHNyYyk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX3Byb2dyYW1fdmVydGV4ICpkc3QsIHJzX3Byb2dyYW1fdmVydGV4IHNyYyk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX3Byb2dyYW1fcmFzdGVyICpkc3QsIHJzX3Byb2dyYW1fcmFzdGVyIHNyYyk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX3Byb2dyYW1fc3RvcmUgKmRzdCwgcnNfcHJvZ3JhbV9zdG9yZSBzcmMpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19mb250ICpkc3QsIHJzX2ZvbnQgc3JjKTsKIAotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4yKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4yKGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4yKGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4yKGZsb2F0MTYsIGZsb2F0MTYpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX2VsZW1lbnQgKmRzdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfdHlwZSAqZHN0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19hbGxvY2F0aW9uICpkc3QpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX3NhbXBsZXIgKmRzdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfc2NyaXB0ICpkc3QpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX21lc2ggKmRzdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfcHJvZ3JhbV9mcmFnbWVudCAqZHN0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19wcm9ncmFtX3ZlcnRleCAqZHN0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19wcm9ncmFtX3Jhc3RlciAqZHN0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19wcm9ncmFtX3N0b3JlICpkc3QpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX2ZvbnQgKmRzdCk7CiAKLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2VpbChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNlaWwoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2VpbChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2VpbChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDIsIGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQzLCBmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDgsIGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MTYsIGZsb2F0MTYsIGZsb2F0MTYpOwotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDIsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MywgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQ0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDgsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDE2LCBmbG9hdCwgZmxvYXQpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29weXNpZ24oZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29weXNpZ24oZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcHlzaWduKGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29weXNpZ24oZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29weXNpZ24oZmxvYXQxNiwgZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3MoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3MoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3MoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkZWdyZWVzKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGVncmVlcyhmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkZWdyZWVzKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkZWdyZWVzKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMihmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDIoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMihmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDEwKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDEwKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZhYnMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmYWJzKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZhYnMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZhYnMoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbG9vcihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbG9vcihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0MTYsIGZsb2F0MTYpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0MiwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0MywgZmxvYXQpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0NCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0OCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdDE2LCBmbG9hdCk7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDE2LCBmbG9hdDE2KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDIsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDMsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDgsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQxNiwgZmxvYXQpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbW9kKGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtb2QoZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbW9kKGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtb2QoZmxvYXQxNiwgZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2coZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2coZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2coZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cyKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cyKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cyKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMTAoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMTAoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdDE2LCBmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0MTYsIGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQyLCBmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDMsIGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQ4LCBmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQxNiwgZmxvYXQxNiwgZmxvYXQxNik7Ci1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQyLCBmbG9hdDIsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MywgZmxvYXQzLCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDQsIGZsb2F0NCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQ4LCBmbG9hdDgsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDE2LCBmbG9hdDE2LCBmbG9hdCk7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93KGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93KGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93KGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93KGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvdyhmbG9hdDE2LCBmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByYWRpYW5zKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmFkaWFucyhmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByYWRpYW5zKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByYWRpYW5zKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJpbnQoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByaW50KGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJpbnQoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJpbnQoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByb3VuZChmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByb3VuZChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzcXJ0KGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzcXJ0KGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpZ24oZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaWduKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpZ24oZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpZ24oZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW4oZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW4oZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW4oZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzcXJ0KGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3FydChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzcXJ0KGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzcXJ0KGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGFuKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGFuKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbihmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGFuKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0cnVuYyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0cnVuYyhmbG9hdDE2KTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19lbGVtZW50KTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc190eXBlKTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19hbGxvY2F0aW9uKTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19zYW1wbGVyKTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19zY3JpcHQpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX21lc2gpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX3Byb2dyYW1fZnJhZ21lbnQpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX3Byb2dyYW1fdmVydGV4KTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19wcm9ncmFtX3Jhc3Rlcik7CitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSXNPYmplY3QocnNfcHJvZ3JhbV9zdG9yZSk7CitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSXNPYmplY3QocnNfZm9udCk7CiAKIAogCisvLyBBbGxvY2F0aW9ucworCisvLyBSZXR1cm4gdGhlIHJzX2FsbG9jYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgYm91bmQgZGF0YQorLy8gcG9pbnRlci4KK2V4dGVybiByc19hbGxvY2F0aW9uIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRBbGxvY2F0aW9uKGNvbnN0IHZvaWQgKik7CisKKy8vIE1hcmsgdGhlIGFsbG9jYXRpb24gZGlydHkgYW5kIG5vdGlmeSB0aG9zZSB1c2luZyBpdAorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25NYXJrRGlydHkocnNfYWxsb2NhdGlvbik7CisKKy8vIFJldHVybiB0aGUgZGltZW5zaW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gYWxsb2NhdGlvbi4KK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvbkdldERpbVgocnNfYWxsb2NhdGlvbik7CitleHRlcm4gdWludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25HZXREaW1ZKHJzX2FsbG9jYXRpb24pOworZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uR2V0RGltWihyc19hbGxvY2F0aW9uKTsKK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvbkdldERpbUxPRChyc19hbGxvY2F0aW9uKTsKK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvbkdldERpbUZhY2VzKHJzX2FsbG9jYXRpb24pOworCisvLyBFeHRyYWN0IGEgc2luZ2xlIGVsZW1lbnQgZnJvbSBhbiBhbGxvY2F0aW9uLgorZXh0ZXJuIGNvbnN0IHZvaWQgKiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0KHJzX2FsbG9jYXRpb24sIHVpbnQzMl90IHgpOworZXh0ZXJuIGNvbnN0IHZvaWQgKiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0KHJzX2FsbG9jYXRpb24sIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpOworZXh0ZXJuIGNvbnN0IHZvaWQgKiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RWxlbWVudEF0KHJzX2FsbG9jYXRpb24sIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopOworCisvLyBSZXR1cm4gYSByYW5kb20gdmFsdWUgYmV0d2VlbiAwIChvciBtaW5fdmFsdWUpIGFuZCBtYXhfbWFsdWUuCitleHRlcm4gaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNSYW5kKGludCBtYXhfdmFsdWUpOworZXh0ZXJuIGludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzUmFuZChpbnQgbWluX3ZhbHVlLCBpbnQgbWF4X3ZhbHVlKTsKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzUmFuZChmbG9hdCBtYXhfdmFsdWUpOworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNSYW5kKGZsb2F0IG1pbl92YWx1ZSwgZmxvYXQgbWF4X3ZhbHVlKTsKKworLy8gcmV0dXJuIHRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgYSBmbG9hdAorLy8gbWluKHYgLSAoKGludClmbG9vcih2KSksIDB4MS5mZmZmZmVwLTFmKTsKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRnJhYyhmbG9hdCk7CisKKy8vIHRpbWUKK2V4dGVybiBpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZWNvbmQodm9pZCk7CitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzTWludXRlKHZvaWQpOworZXh0ZXJuIGludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0hvdXIodm9pZCk7CitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGF5KHZvaWQpOworZXh0ZXJuIGludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc01vbnRoKHZvaWQpOworZXh0ZXJuIGludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1llYXIodm9pZCk7CisKKy8vIFJldHVybiB0aGUgY3VycmVudCBzeXN0ZW0gY2xvY2sgaW4gbWlsbGlzZWNvbmRzCitleHRlcm4gaW50NjRfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzVXB0aW1lTWlsbGlzKHZvaWQpOworCisvLyBSZXR1cm4gdGhlIGN1cnJlbnQgc3lzdGVtIGNsb2NrIGluIG5hbm9zZWNvbmRzCitleHRlcm4gaW50NjRfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzVXB0aW1lTmFub3Modm9pZCk7CisKKy8vIFJldHVybiB0aGUgdGltZSBpbiBzZWNvbmRzIHNpbmNlIGZ1bmN0aW9uIHdhcyBsYXN0IGNhbGxlZCBpbiB0aGlzIHNjcmlwdC4KK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzR2V0RHQodm9pZCk7CisKKy8vIFNlbmQgYSBtZXNzYWdlIGJhY2sgdG8gdGhlIGNsaWVudC4gIFdpbGwgbm90IGJsb2NrIGFuZCByZXR1cm5zIHRydWUKKy8vIGlmIHRoZSBtZXNzYWdlIHdhcyBzZW5kYWJsZSBhbmQgZmFsc2UgaWYgdGhlIGZpZm8gd2FzIGZ1bGwuCisvLyBBIG1lc3NhZ2UgSUQgaXMgcmVxdWlyZWQuICBEYXRhIHBheWxvYWQgaXMgb3B0aW9uYWwuCitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2VuZFRvQ2xpZW50KGludCBjbWRJRCk7CitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2VuZFRvQ2xpZW50KGludCBjbWRJRCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludCBsZW4pOworCisvLyBTZW5kIGEgbWVzc2FnZSBiYWNrIHRvIHRoZSBjbGllbnQsIGJsb2NraW5nIHVudGlsIHRoZSBtZXNzYWdlIGlzIHF1ZXVlZC4KKy8vIEEgbWVzc2FnZSBJRCBpcyByZXF1aXJlZC4gIERhdGEgcGF5bG9hZCBpcyBvcHRpb25hbC4KK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhpbnQgY21kSUQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKGludCBjbWRJRCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludCBsZW4pOwogCiAKKy8vIFNjcmlwdCB0byBTY3JpcHQKK2VudW0gcnNfZm9yX2VhY2hfc3RyYXRlZ3kgeworICAgIFJTX0ZPUl9FQUNIX1NUUkFURUdZX1NFUklBTCwKKyAgICBSU19GT1JfRUFDSF9TVFJBVEVHWV9ET05UX0NBUkUsCisgICAgUlNfRk9SX0VBQ0hfU1RSQVRFR1lfRFNUX0xJTkVBUiwKKyAgICBSU19GT1JfRUFDSF9TVFJBVEVHWV9USUxFX1NNQUxMLAorICAgIFJTX0ZPUl9FQUNIX1NUUkFURUdZX1RJTEVfTUVESVVNLAorICAgIFJTX0ZPUl9FQUNIX1NUUkFURUdZX1RJTEVfTEFSR0UKK307CiAKLS8vIEludCBvcHMKK3R5cGVkZWYgc3RydWN0IHJzX3NjcmlwdF9jYWxsIHsKKyAgICBlbnVtIHJzX2Zvcl9lYWNoX3N0cmF0ZWd5IHN0cmF0ZWd5OworICAgIHVpbnQzMl90IHhTdGFydDsKKyAgICB1aW50MzJfdCB4RW5kOworICAgIHVpbnQzMl90IHlTdGFydDsKKyAgICB1aW50MzJfdCB5RW5kOworICAgIHVpbnQzMl90IHpTdGFydDsKKyAgICB1aW50MzJfdCB6RW5kOworICAgIHVpbnQzMl90IGFycmF5U3RhcnQ7CisgICAgdWludDMyX3QgYXJyYXlFbmQ7Cit9IHJzX3NjcmlwdF9jYWxsX3Q7CiAKLWV4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGludCk7Ci1leHRlcm4gaW50MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50Mik7Ci1leHRlcm4gaW50MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50Myk7Ci1leHRlcm4gaW50NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50NCk7Ci1leHRlcm4gaW50OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50OCk7Ci1leHRlcm4gaW50MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGludDE2KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNGb3JFYWNoKHJzX3NjcmlwdCBzY3JpcHQsIHJzX2FsbG9jYXRpb24gaW5wdXQsCisgICAgICAgICAgICAgIHJzX2FsbG9jYXRpb24gb3V0cHV0LCBjb25zdCB2b2lkICogdXNyRGF0YSk7CiAKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNGb3JFYWNoKHJzX3NjcmlwdCBzY3JpcHQsIHJzX2FsbG9jYXRpb24gaW5wdXQsCisgICAgICAgICAgICAgIHJzX2FsbG9jYXRpb24gb3V0cHV0LCBjb25zdCB2b2lkICogdXNyRGF0YSwKKyAgICAgICAgICAgICAgY29uc3QgcnNfc2NyaXB0X2NhbGxfdCAqKTsKIAotCi0vKgotZXh0ZXJuIGZsb2F0IG1vZGYoZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdCByYW5kZihmbG9hdCk7Ci1leHRlcm4gZmxvYXQgcmFuZGYyKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQgZnJhY2YoZmxvYXQpOwotZXh0ZXJuIGZsb2F0IGxlcnBmKGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0IG1hcGYoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKLSovCi0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9zY3JpcHRjL3JzX3R5cGVzLnJzaCBiL2xpYnMvcnMvc2NyaXB0Yy9yc190eXBlcy5yc2gKaW5kZXggNDE5OGE3NC4uZGQ0Mjk3MiAxMDA2NDQKLS0tIGEvbGlicy9ycy9zY3JpcHRjL3JzX3R5cGVzLnJzaAorKysgYi9saWJzL3JzL3NjcmlwdGMvcnNfdHlwZXMucnNoCkBAIC0yLDcwICsyLDczIEBACiB0eXBlZGVmIGNoYXIgaW50OF90OwogdHlwZWRlZiBzaG9ydCBpbnQxNl90OwogdHlwZWRlZiBpbnQgaW50MzJfdDsKLS8vdHlwZWRlZiBsb25nIGludDY0X3Q7Cit0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NF90OwogCiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDhfdDsKIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2X3Q7CiB0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50MzJfdDsKLS8vdHlwZWRlZiBsb25nIHVpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7CiAKIHR5cGVkZWYgdWludDhfdCB1Y2hhcjsKIHR5cGVkZWYgdWludDE2X3QgdXNob3J0OwogdHlwZWRlZiB1aW50MzJfdCB1aW50OwotLy90eXBlZGVmIHVpbnQ2NF90IHVsb25nOwordHlwZWRlZiB1aW50NjRfdCB1bG9uZzsKIAotdHlwZWRlZiBpbnQgcnNfZWxlbWVudDsKLXR5cGVkZWYgaW50IHJzX3R5cGU7Ci10eXBlZGVmIGludCByc19hbGxvY2F0aW9uOwotdHlwZWRlZiBpbnQgcnNfc2FtcGxlcjsKLXR5cGVkZWYgaW50IHJzX3NjcmlwdDsKLXR5cGVkZWYgaW50IHJzX21lc2g7Ci10eXBlZGVmIGludCByc19wcm9ncmFtX2ZyYWdtZW50OwotdHlwZWRlZiBpbnQgcnNfcHJvZ3JhbV92ZXJ0ZXg7Ci10eXBlZGVmIGludCByc19wcm9ncmFtX3Jhc3RlcjsKLXR5cGVkZWYgaW50IHJzX3Byb2dyYW1fc3RvcmU7Cit0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGludCogY29uc3QgcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19lbGVtZW50OwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfdHlwZTsKK3R5cGVkZWYgc3RydWN0IHsgY29uc3QgaW50KiBjb25zdCBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX2FsbG9jYXRpb247Cit0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGludCogY29uc3QgcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19zYW1wbGVyOwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfc2NyaXB0OwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfbWVzaDsKK3R5cGVkZWYgc3RydWN0IHsgY29uc3QgaW50KiBjb25zdCBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX3Byb2dyYW1fZnJhZ21lbnQ7Cit0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGludCogY29uc3QgcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19wcm9ncmFtX3ZlcnRleDsKK3R5cGVkZWYgc3RydWN0IHsgY29uc3QgaW50KiBjb25zdCBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX3Byb2dyYW1fcmFzdGVyOwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfcHJvZ3JhbV9zdG9yZTsKK3R5cGVkZWYgc3RydWN0IHsgY29uc3QgaW50KiBjb25zdCBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX2ZvbnQ7CisKIAogdHlwZWRlZiBmbG9hdCBmbG9hdDIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIGZsb2F0IGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgZmxvYXQgZmxvYXQ0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwotdHlwZWRlZiBmbG9hdCBmbG9hdDggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIGZsb2F0IGZsb2F0MTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiB0eXBlZGVmIHVjaGFyIHVjaGFyMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgdWNoYXIgdWNoYXIzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiB1Y2hhciB1Y2hhcjQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIHVjaGFyIHVjaGFyOCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgdWNoYXIgdWNoYXIxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIHR5cGVkZWYgdXNob3J0IHVzaG9ydDIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIHVzaG9ydCB1c2hvcnQzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiB1c2hvcnQgdXNob3J0NCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKLXR5cGVkZWYgdXNob3J0IHVzaG9ydDggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIHVzaG9ydCB1c2hvcnQxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIHR5cGVkZWYgdWludCB1aW50MiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgdWludCB1aW50MyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgdWludCB1aW50NCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKLXR5cGVkZWYgdWludCB1aW50OCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgdWludCB1aW50MTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiB0eXBlZGVmIGNoYXIgY2hhcjIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIGNoYXIgY2hhcjMgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDMpKSk7CiB0eXBlZGVmIGNoYXIgY2hhcjQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIGNoYXIgY2hhcjggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIGNoYXIgY2hhcjE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsKIAogdHlwZWRlZiBzaG9ydCBzaG9ydDIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIHNob3J0IHNob3J0MyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgc2hvcnQgc2hvcnQ0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwotdHlwZWRlZiBzaG9ydCBzaG9ydDggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIHNob3J0IHNob3J0MTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiB0eXBlZGVmIGludCBpbnQyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwogdHlwZWRlZiBpbnQgaW50MyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgaW50IGludDQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIGludCBpbnQ4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwotdHlwZWRlZiBpbnQgaW50MTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiAKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBmbG9hdCBtWzE2XTsKK30gcnNfbWF0cml4NHg0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgbVs5XTsKK30gcnNfbWF0cml4M3gzOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgbVs0XTsKK30gcnNfbWF0cml4MngyOworCit0eXBlZGVmIGZsb2F0NCByc19xdWF0ZXJuaW9uOworCisjZGVmaW5lIFJTX1BBQ0tFRCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKQogCmRpZmYgLS1naXQgYS9saWJzL3N1cmZhY2VmbGluZ2VyX2NsaWVudC9TaGFyZWRCdWZmZXJTdGFjay5jcHAgYi9saWJzL3N1cmZhY2VmbGluZ2VyX2NsaWVudC9TaGFyZWRCdWZmZXJTdGFjay5jcHAKaW5kZXggNGJjNWQ5ZS4uOGY1ODNmMDYgMTAwNjQ0Ci0tLSBhL2xpYnMvc3VyZmFjZWZsaW5nZXJfY2xpZW50L1NoYXJlZEJ1ZmZlclN0YWNrLmNwcAorKysgYi9saWJzL3N1cmZhY2VmbGluZ2VyX2NsaWVudC9TaGFyZWRCdWZmZXJTdGFjay5jcHAKQEAgLTM4MCwxMSArMzgwLDYgQEAKIHsKICAgICBTaGFyZWRCdWZmZXJTdGFjayYgc3RhY2soICptU2hhcmVkU3RhY2sgKTsKIAotICAgIGlmIChzdGFjay5oZWFkID09IHRhaWwgJiYgc3RhY2suYXZhaWxhYmxlID09IG1OdW1CdWZmZXJzKSB7Ci0gICAgICAgIExPR1coImRlcXVldWU6IHRhaWw9JWQsIGhlYWQ9JWQsIGF2YWlsPSVkLCBxdWV1ZWQ9JWQiLAotICAgICAgICAgICAgICAgIHRhaWwsIHN0YWNrLmhlYWQsIHN0YWNrLmF2YWlsYWJsZSwgc3RhY2sucXVldWVkKTsKLSAgICB9Ci0KICAgICBSV0xvY2s6OkF1dG9STG9jayBfcmQobUxvY2spOwogCiAgICAgY29uc3QgbnNlY3NfdCBkZXF1ZXVlVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKZGlmZiAtLWdpdCBhL2xpYnMvc3VyZmFjZWZsaW5nZXJfY2xpZW50L1N1cmZhY2UuY3BwIGIvbGlicy9zdXJmYWNlZmxpbmdlcl9jbGllbnQvU3VyZmFjZS5jcHAKaW5kZXggZDQ0YWFiOS4uZWJiMGNjOSAxMDA2NDQKLS0tIGEvbGlicy9zdXJmYWNlZmxpbmdlcl9jbGllbnQvU3VyZmFjZS5jcHAKKysrIGIvbGlicy9zdXJmYWNlZmxpbmdlcl9jbGllbnQvU3VyZmFjZS5jcHAKQEAgLTM2NCw2ICszNjQsMTMgQEAKICAgICAgICAgaGVpZ2h0ICAgPSBzdXJmYWNlLT5tSGVpZ2h0OwogICAgICAgICBmb3JtYXQgICA9IHN1cmZhY2UtPm1Gb3JtYXQ7CiAgICAgICAgIGZsYWdzICAgID0gc3VyZmFjZS0+bUZsYWdzOworICAgIH0gZWxzZSBpZiAoc3VyZmFjZSAhPSAwICYmIHN1cmZhY2UtPm1TdXJmYWNlICE9IDApIHsKKyAgICAgICAgTE9HVygiUGFyY2VsaW5nIGludmFsaWQgc3VyZmFjZSB3aXRoIG5vbi1OVUxMIElTdXJmYWNlIGFzIE5VTEw6ICIKKyAgICAgICAgICAgICAibVN1cmZhY2UgPSAlcCwgbUlkZW50aXR5ID0gJWQsIG1XaWR0aCA9ICVkLCBtSGVpZ2h0ID0gJWQsICIKKyAgICAgICAgICAgICAibUZvcm1hdCA9ICVkLCBtRmxhZ3MgPSAweCUwOHgsIG1Jbml0Q2hlY2sgPSAlZCIsCisgICAgICAgICAgICAgc3VyZmFjZS0+bVN1cmZhY2UuZ2V0KCksIHN1cmZhY2UtPm1JZGVudGl0eSwgc3VyZmFjZS0+bVdpZHRoLAorICAgICAgICAgICAgIHN1cmZhY2UtPm1IZWlnaHQsIHN1cmZhY2UtPm1Gb3JtYXQsIHN1cmZhY2UtPm1GbGFncywKKyAgICAgICAgICAgICBzdXJmYWNlLT5tSW5pdENoZWNrKTsKICAgICB9CiAgICAgcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihzdXIhPTAgPyBzdXItPmFzQmluZGVyKCkgOiBOVUxMKTsKICAgICBwYXJjZWwtPndyaXRlSW50MzIoaWRlbnRpdHkpOwpAQCAtNDM4LDYgKzQ0NSw5IEBACiAgICAgICAgICAgICBtU2hhcmVkQnVmZmVyQ2xpZW50ID0gbmV3IFNoYXJlZEJ1ZmZlckNsaWVudCgKICAgICAgICAgICAgICAgICAgICAgbUNsaWVudC5nZXRTaGFyZWRDbGllbnQoKSwgdG9rZW4sIDIsIG1JZGVudGl0eSk7CiAgICAgICAgICAgICBtSW5pdENoZWNrID0gbUNsaWVudC5nZXRTaGFyZWRDbGllbnQoKS0+dmFsaWRhdGUodG9rZW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HVygiTm90IGluaXRpYWxpemluZyB0aGUgc2hhcmVkIGJ1ZmZlciBjbGllbnQgYmVjYXVzZSB0b2tlbiA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgdG9rZW4pOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGlicy91aS9JbnB1dERpc3BhdGNoZXIuY3BwIGIvbGlicy91aS9JbnB1dERpc3BhdGNoZXIuY3BwCmluZGV4IGFhNTRmODIuLmE2ZjVhMWIgMTAwNjQ0Ci0tLSBhL2xpYnMvdWkvSW5wdXREaXNwYXRjaGVyLmNwcAorKysgYi9saWJzL3VpL0lucHV0RGlzcGF0Y2hlci5jcHAKQEAgLTI0NzYsNiArMjQ3Niw3MCBAQAogICAgIH0KIH0KIAorYm9vbCBJbnB1dERpc3BhdGNoZXI6OnRyYW5zZmVyVG91Y2hGb2N1cyhjb25zdCBzcDxJbnB1dENoYW5uZWw+JiBmcm9tQ2hhbm5lbCwKKyAgICAgICAgY29uc3Qgc3A8SW5wdXRDaGFubmVsPiYgdG9DaGFubmVsKSB7CisjaWYgREVCVUdfRk9DVVMKKyAgICBMT0dEKCJ0cmFuc2ZlclRvdWNoRm9jdXM6IGZyb21DaGFubmVsPSVzLCB0b0NoYW5uZWw9JXMiLAorICAgICAgICAgICAgZnJvbUNoYW5uZWwtPmdldE5hbWUoKS5zdHJpbmcoKSwgdG9DaGFubmVsLT5nZXROYW1lKCkuc3RyaW5nKCkpOworI2VuZGlmCisgICAgeyAvLyBhY3F1aXJlIGxvY2sKKyAgICAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKKworICAgICAgICBjb25zdCBJbnB1dFdpbmRvdyogZnJvbVdpbmRvdyA9IGdldFdpbmRvd0xvY2tlZChmcm9tQ2hhbm5lbCk7CisgICAgICAgIGNvbnN0IElucHV0V2luZG93KiB0b1dpbmRvdyA9IGdldFdpbmRvd0xvY2tlZCh0b0NoYW5uZWwpOworICAgICAgICBpZiAoISBmcm9tV2luZG93IHx8ICEgdG9XaW5kb3cpIHsKKyNpZiBERUJVR19GT0NVUworICAgICAgICAgICAgTE9HRCgiQ2Fubm90IHRyYW5zZmVyIGZvY3VzIGJlY2F1c2UgZnJvbSBvciB0byB3aW5kb3cgbm90IGZvdW5kLiIpOworI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyb21XaW5kb3cgPT0gdG9XaW5kb3cpIHsKKyNpZiBERUJVR19GT0NVUworICAgICAgICAgICAgTE9HRCgiVHJpdmlhbCB0cmFuc2ZlciB0byBzYW1lIHdpbmRvdy4iKTsKKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRvdWNoU3RhdGUud2luZG93cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3QgVG91Y2hlZFdpbmRvdyYgdG91Y2hlZFdpbmRvdyA9IG1Ub3VjaFN0YXRlLndpbmRvd3NbaV07CisgICAgICAgICAgICBpZiAodG91Y2hlZFdpbmRvdy53aW5kb3cgPT0gZnJvbVdpbmRvdykgeworICAgICAgICAgICAgICAgIGludDMyX3Qgb2xkVGFyZ2V0RmxhZ3MgPSB0b3VjaGVkV2luZG93LnRhcmdldEZsYWdzOworICAgICAgICAgICAgICAgIEJpdFNldDMyIHBvaW50ZXJJZHMgPSB0b3VjaGVkV2luZG93LnBvaW50ZXJJZHM7CisKKyAgICAgICAgICAgICAgICBtVG91Y2hTdGF0ZS53aW5kb3dzLnJlbW92ZUF0KGkpOworCisgICAgICAgICAgICAgICAgaW50MzJfdCBuZXdUYXJnZXRGbGFncyA9IDA7CisgICAgICAgICAgICAgICAgaWYgKG9sZFRhcmdldEZsYWdzICYgSW5wdXRUYXJnZXQ6OkZMQUdfRk9SRUdST1VORCkgeworICAgICAgICAgICAgICAgICAgICBuZXdUYXJnZXRGbGFncyB8PSBJbnB1dFRhcmdldDo6RkxBR19GT1JFR1JPVU5EOworICAgICAgICAgICAgICAgICAgICBpZiAodG9XaW5kb3ctPmxheW91dFBhcmFtc0ZsYWdzICYgSW5wdXRXaW5kb3c6OkZMQUdfU1BMSVRfVE9VQ0gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhcmdldEZsYWdzIHw9IElucHV0VGFyZ2V0OjpGTEFHX1NQTElUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Ub3VjaFN0YXRlLmFkZE9yVXBkYXRlV2luZG93KHRvV2luZG93LCBuZXdUYXJnZXRGbGFncywgcG9pbnRlcklkcyk7CisKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoISBmb3VuZCkgeworI2lmIERFQlVHX0ZPQ1VTCisgICAgICAgICAgICBMT0dEKCJGb2N1cyB0cmFuc2ZlciBmYWlsZWQgYmVjYXVzZSBmcm9tIHdpbmRvdyBkaWQgbm90IGhhdmUgZm9jdXMuIik7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisjaWYgREVCVUdfRk9DVVMKKyAgICAgICAgbG9nRGlzcGF0Y2hTdGF0ZUxvY2tlZCgpOworI2VuZGlmCisgICAgfSAvLyByZWxlYXNlIGxvY2sKKworICAgIC8vIFdha2UgdXAgcG9sbCBsb29wIHNpbmNlIGl0IG1heSBuZWVkIHRvIG1ha2UgbmV3IGlucHV0IGRpc3BhdGNoaW5nIGNob2ljZXMuCisgICAgbUxvb3Blci0+d2FrZSgpOworICAgIHJldHVybiB0cnVlOworfQorCiB2b2lkIElucHV0RGlzcGF0Y2hlcjo6bG9nRGlzcGF0Y2hTdGF0ZUxvY2tlZCgpIHsKICAgICBTdHJpbmc4IGR1bXA7CiAgICAgZHVtcERpc3BhdGNoU3RhdGVMb2NrZWQoZHVtcCk7CmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1Jlc291cmNlVHlwZXMuY3BwIGIvbGlicy91dGlscy9SZXNvdXJjZVR5cGVzLmNwcAppbmRleCA4MzQ1Y2MzLi45MWU3ZGYzIDEwMDY0NAotLS0gYS9saWJzL3V0aWxzL1Jlc291cmNlVHlwZXMuY3BwCisrKyBiL2xpYnMvdXRpbHMvUmVzb3VyY2VUeXBlcy5jcHAKQEAgLTMxNyw2ICszMTcsMTIgQEAKICAgICAgICAgICAgIG1TdHJpbmdQb29sU2l6ZSA9CiAgICAgICAgICAgICAgICAgKG1IZWFkZXItPmhlYWRlci5zaXplLW1IZWFkZXItPnN0cmluZ3NTdGFydCkvY2hhclNpemU7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBjaGVjayBpbnZhcmlhbnQ6IHN0eWxlcyBzdGFydHMgYmVmb3JlIGVuZCBvZiBkYXRhCisgICAgICAgICAgICBpZiAobUhlYWRlci0+c3R5bGVzU3RhcnQgPj0gKG1IZWFkZXItPmhlYWRlci5zaXplLXNpemVvZih1aW50MTZfdCkpKSB7CisgICAgICAgICAgICAgICAgTE9HVygiQmFkIHN0eWxlIGJsb2NrOiBzdHlsZSBibG9jayBzdGFydHMgYXQgJWQgcGFzdCBkYXRhIHNpemUgb2YgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIChpbnQpbUhlYWRlci0+c3R5bGVzU3RhcnQsIChpbnQpbUhlYWRlci0+aGVhZGVyLnNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAobUVycm9yPUJBRF9UWVBFKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGNoZWNrIGludmFyaWFudDogc3R5bGVzIGZvbGxvdyB0aGUgc3RyaW5ncwogICAgICAgICAgICAgaWYgKG1IZWFkZXItPnN0eWxlc1N0YXJ0IDw9IG1IZWFkZXItPnN0cmluZ3NTdGFydCkgewogICAgICAgICAgICAgICAgIExPR1coIkJhZCBzdHlsZSBibG9jazogc3R5bGUgYmxvY2sgc3RhcnRzIGF0ICVkLCBiZWZvcmUgc3RyaW5ncyBhdCAlZFxuIiwKQEAgLTE4NzgsNiArMTg4NCwxMiBAQAogICAgICAgICBvdXROYW1lLT50eXBlID0gZ3JwLT5iYXNlUGFja2FnZS0+dHlwZVN0cmluZ3Muc3RyaW5nQXQodCwgJm91dE5hbWUtPnR5cGVMZW4pOwogICAgICAgICBvdXROYW1lLT5uYW1lID0gZ3JwLT5iYXNlUGFja2FnZS0+a2V5U3RyaW5ncy5zdHJpbmdBdCgKICAgICAgICAgICAgIGR0b2hsKGVudHJ5LT5rZXkuaW5kZXgpLCAmb3V0TmFtZS0+bmFtZUxlbik7CisKKyAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGJhZCBpbmRleCBmb3Igc29tZSByZWFzb24sIHdlIHNob3VsZCBhYm9ydC4KKyAgICAgICAgaWYgKG91dE5hbWUtPnR5cGUgPT0gTlVMTCB8fCBvdXROYW1lLT5uYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtMjYwOSw2ICsyNjIxLDI0IEBACiAgICAgICAgICpvdXRUeXBlID0gKmRlZlR5cGU7CiAgICAgfQogICAgICpvdXROYW1lID0gU3RyaW5nMTYocCwgZW5kLXApOworICAgIGlmKCoqb3V0UGFja2FnZSA9PSAwKSB7CisgICAgICAgIGlmKG91dEVycm9yTXNnKSB7CisgICAgICAgICAgICAqb3V0RXJyb3JNc2cgPSAiUmVzb3VyY2UgcGFja2FnZSBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmKCoqb3V0VHlwZSA9PSAwKSB7CisgICAgICAgIGlmKG91dEVycm9yTXNnKSB7CisgICAgICAgICAgICAqb3V0RXJyb3JNc2cgPSAiUmVzb3VyY2UgdHlwZSBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmKCoqb3V0TmFtZSA9PSAwKSB7CisgICAgICAgIGlmKG91dEVycm9yTXNnKSB7CisgICAgICAgICAgICAqb3V0RXJyb3JNc2cgPSAiUmVzb3VyY2UgaWQgY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZyI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtNDEyNywxMyArNDE1NywxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMHgwMGZmMDAwMCAmICgodHlwZUluZGV4KzEpPDwxNikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgweDAwMDBmZmZmICYgKGVudHJ5SW5kZXgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX25hbWUgcmVzTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmdldFJlc291cmNlTmFtZShyZXNJRCwgJnJlc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICBzcGVjIHJlc291cmNlIDB4JTA4eCAlczolcy8lczogZmxhZ3M9MHglMDh4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUucGFja2FnZSwgcmVzTmFtZS5wYWNrYWdlTGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnR5cGUsIHJlc05hbWUudHlwZUxlbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5uYW1lLCByZXNOYW1lLm5hbWVMZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0b2hsKHR5cGVDb25maWdzLT50eXBlU3BlY0ZsYWdzW2VudHJ5SW5kZXhdKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy0+Z2V0UmVzb3VyY2VOYW1lKHJlc0lELCAmcmVzTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgIHNwZWMgcmVzb3VyY2UgMHglMDh4ICVzOiVzLyVzOiBmbGFncz0weCUwOHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnBhY2thZ2UsIHJlc05hbWUucGFja2FnZUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUudHlwZSwgcmVzTmFtZS50eXBlTGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5uYW1lLCByZXNOYW1lLm5hbWVMZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdG9obCh0eXBlQ29uZmlncy0+dHlwZVNwZWNGbGFnc1tlbnRyeUluZGV4XSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgIElOVkFMSUQgVFlQRSBDT05GSUcgRk9SIFJFU09VUkNFIDB4JTA4eFxuIiwgcmVzSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGNvbmZpZ0luZGV4PTA7IGNvbmZpZ0luZGV4PE5UQzsgY29uZmlnSW5kZXgrKykgewpAQCAtNDM0MCwxMSArNDM3MywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMHgwMGZmMDAwMCAmICgodHlwZUluZGV4KzEpPDwxNikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgweDAwMDBmZmZmICYgKGVudHJ5SW5kZXgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX25hbWUgcmVzTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmdldFJlc291cmNlTmFtZShyZXNJRCwgJnJlc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgIHJlc291cmNlIDB4JTA4eCAlczolcy8lczogIiwgcmVzSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUucGFja2FnZSwgcmVzTmFtZS5wYWNrYWdlTGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS50eXBlLCByZXNOYW1lLnR5cGVMZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLm5hbWUsIHJlc05hbWUubmFtZUxlbikpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMtPmdldFJlc291cmNlTmFtZShyZXNJRCwgJnJlc05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgIHJlc291cmNlIDB4JTA4eCAlczolcy8lczogIiwgcmVzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnBhY2thZ2UsIHJlc05hbWUucGFja2FnZUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnR5cGUsIHJlc05hbWUudHlwZUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLm5hbWUsIHJlc05hbWUubmFtZUxlbikpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgICAgSU5WQUxJRCBSRVNPVVJDRSAweCUwOHg6ICIsIHJlc0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhpc09mZnNldCYweDMpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIk5PTi1JTlRFR0VSIE9GRlNFVDogJXBcbiIsICh2b2lkKil0aGlzT2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTQ0MDIsMTggKzQ0MzgsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdmFsdWUocGtnLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiYWdQdHIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgTiA9IGR0b2hsKGJhZ1B0ci0+Y291bnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXNUYWJsZV9tYXAqIG1hcFB0ciA9IChjb25zdCBSZXNUYWJsZV9tYXAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGNvbnN0IHVpbnQ4X3QqKWVudCkgKyBlc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGJhc2VNYXBQdHIgPSAoY29uc3QgdWludDhfdCopZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWFwT2Zmc2V0ID0gZXNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlc1RhYmxlX21hcCogbWFwUHRyID0gKFJlc1RhYmxlX21hcCopKGJhc2VNYXBQdHIrbWFwT2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgUGFyZW50PTB4JTA4eCwgQ291bnQ9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdG9obChiYWdQdHItPnBhcmVudC5pZGVudCksIE4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOICYmIG1hcE9mZnNldCA8ICh0eXBlU2l6ZS1zaXplb2YoUmVzVGFibGVfbWFwKSk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgIyVpIChLZXk9MHglMDh4KTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBkdG9obChtYXBQdHItPm5hbWUuaWRlbnQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNvcHlGcm9tX2R0b2gobWFwUHRyLT52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF92YWx1ZShwa2csIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gZHRvaHMobWFwUHRyLT52YWx1ZS5zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFB0ciA9IChSZXNUYWJsZV9tYXAqKSgoKGNvbnN0IHVpbnQ4X3QqKW1hcFB0cikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplICsgc2l6ZW9mKCptYXBQdHIpLXNpemVvZihtYXBQdHItPnZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBPZmZzZXQgKz0gc2l6ZSArIHNpemVvZigqbWFwUHRyKS1zaXplb2YobWFwUHRyLT52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBQdHIgPSAoUmVzVGFibGVfbWFwKikoYmFzZU1hcFB0cittYXBPZmZzZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnkuYWlkbCBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgzZDY0NQotLS0gL2Rldi9udWxsCisrKyBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5LmFpZGwKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5sb2NhdGlvbjsKKworcGFyY2VsYWJsZSBDb3VudHJ5OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5LmphdmEgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNjMDU0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeS5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQubG9jYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CisKKy8qKgorICogVGhpcyBjbGFzcyB3cmFwcyB0aGUgY291bnRyeSBpbmZvcm1hdGlvbi4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQ291bnRyeSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIC8qKgorICAgICAqIFRoZSBjb3VudHJ5IGNvZGUgY2FtZSBmcm9tIHRoZSBtb2JpbGUgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPVU5UUllfU09VUkNFX05FVFdPUksgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIGNvdW50cnkgY29kZSBjYW1lIGZyb20gdGhlIGxvY2F0aW9uIHNlcnZpY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT1VOVFJZX1NPVVJDRV9MT0NBVElPTiA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY291bnRyeSBjb2RlIHdhcyByZWFkIGZyb20gdGhlIFNJTSBjYXJkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlRSWV9TT1VSQ0VfU0lNID0gMjsKKworICAgIC8qKgorICAgICAqIFRoZSBjb3VudHJ5IGNvZGUgY2FtZSBmcm9tIHRoZSBzeXN0ZW0gbG9jYWxlIHNldHRpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT1VOVFJZX1NPVVJDRV9MT0NBTEUgPSAzOworCisgICAgLyoqCisgICAgICogVGhlIElTTyAzMTY2LTEgdHdvIGxldHRlcnMgY291bnRyeSBjb2RlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Db3VudHJ5SXNvOworCisgICAgLyoqCisgICAgICogV2hlcmUgdGhlIGNvdW50cnkgY29kZSBjYW1lIGZyb20uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVNvdXJjZTsKKworICAgIHByaXZhdGUgaW50IG1IYXNoQ29kZTsKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb3VudHJ5SXNvIHRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZS4KKyAgICAgKiBAcGFyYW0gc291cmNlIHdoZXJlIHRoZSBjb3VudHJ5SXNvIGNhbWUgZnJvbSwgY291bGQgYmUgb25lIG9mIGJlbG93CisgICAgICogICAgICAgIHZhbHVlcworICAgICAqICAgICAgICA8cD4KKyAgICAgKiAgICAgICAgPHVsPgorICAgICAqICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9ORVRXT1JLfTwvbGk+CisgICAgICogICAgICAgIDxsaT57QGxpbmsgI0NPVU5UUllfU09VUkNFX0xPQ0FUSU9OfTwvbGk+CisgICAgICogICAgICAgIDxsaT57QGxpbmsgI0NPVU5UUllfU09VUkNFX1NJTX08L2xpPgorICAgICAqICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9MT0NBTEV9PC9saT4KKyAgICAgKiAgICAgICAgPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ291bnRyeShmaW5hbCBTdHJpbmcgY291bnRyeUlzbywgZmluYWwgaW50IHNvdXJjZSkgeworICAgICAgICBpZiAoY291bnRyeUlzbyA9PSBudWxsIHx8IHNvdXJjZSA8IENPVU5UUllfU09VUkNFX05FVFdPUksKKyAgICAgICAgICAgICAgICB8fCBzb3VyY2UgPiBDT1VOVFJZX1NPVVJDRV9MT0NBTEUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBtQ291bnRyeUlzbyA9IGNvdW50cnlJc28udG9Mb3dlckNhc2UoKTsKKyAgICAgICAgbVNvdXJjZSA9IHNvdXJjZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ291bnRyeShDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgbUNvdW50cnlJc28gPSBjb3VudHJ5Lm1Db3VudHJ5SXNvOworICAgICAgICBtU291cmNlID0gY291bnRyeS5tU291cmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIElTTyAzMTY2LTEgdHdvIGxldHRlcnMgY291bnRyeSBjb2RlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRDb3VudHJ5SXNvKCkgeworICAgICAgICByZXR1cm4gbUNvdW50cnlJc287CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB3aGVyZSB0aGUgY291bnRyeSBjb2RlIGNhbWUgZnJvbSwgY291bGQgYmUgb25lIG9mIGJlbG93IHZhbHVlcworICAgICAqICAgICAgICAgPHA+CisgICAgICogICAgICAgICA8dWw+CisgICAgICogICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9ORVRXT1JLfTwvbGk+CisgICAgICogICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9MT0NBVElPTn08L2xpPgorICAgICAqICAgICAgICAgPGxpPntAbGluayAjQ09VTlRSWV9TT1VSQ0VfU0lNfTwvbGk+CisgICAgICogICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9MT0NBTEV9PC9saT4KKyAgICAgKiAgICAgICAgIDwvdWw+CisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXRTb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBtU291cmNlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPENvdW50cnk+IENSRUFUT1IgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPENvdW50cnk+KCkgeworICAgICAgICBwdWJsaWMgQ291bnRyeSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb3VudHJ5KGluLnJlYWRTdHJpbmcoKSwgaW4ucmVhZEludCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb3VudHJ5W10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ291bnRyeVtzaXplXTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIHBhcmNlbCwgaW50IGZsYWdzKSB7CisgICAgICAgIHBhcmNlbC53cml0ZVN0cmluZyhtQ291bnRyeUlzbyk7CisgICAgICAgIHBhcmNlbC53cml0ZUludChtU291cmNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworICAgICAgICBpZiAob2JqZWN0ID09IHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDb3VudHJ5KSB7CisgICAgICAgICAgICBDb3VudHJ5IGMgPSAoQ291bnRyeSkgb2JqZWN0OworICAgICAgICAgICAgcmV0dXJuIG1Db3VudHJ5SXNvLmVxdWFscyhjLmdldENvdW50cnlJc28oKSkgJiYgbVNvdXJjZSA9PSBjLmdldFNvdXJjZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IG1IYXNoQ29kZTsKKyAgICAgICAgaWYgKGhhc2ggPT0gMCkgeworICAgICAgICAgICAgaGFzaCA9IDE3OworICAgICAgICAgICAgaGFzaCA9IGhhc2ggKiAxMyArIG1Db3VudHJ5SXNvLmhhc2hDb2RlKCk7CisgICAgICAgICAgICBoYXNoID0gaGFzaCAqIDEzICsgbVNvdXJjZTsKKyAgICAgICAgICAgIG1IYXNoQ29kZSA9IGhhc2g7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1IYXNoQ29kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHRoZSBzcGVjaWZpZWQgY291bnRyeSB0byB0aGlzIGNvdW50cnkgb2JqZWN0IGlnbm9yaW5nIHRoZSBtU291cmNlCisgICAgICogZmllbGQsIHJldHVybiB0cnVlIGlmIHRoZSBjb3VudHJ5SXNvIGZpZWxkcyBhcmUgZXF1YWwKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb3VudHJ5IHRoZSBjb3VudHJ5IHRvIGNvbXBhcmUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjb3VudHJ5J3MgY291bnRyeUlzbyBmaWVsZCBpcyBlcXVhbCB0byB0aGlzCisgICAgICogICAgICAgICBjb3VudHJ5J3MsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNJZ25vcmVTb3VyY2UoQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgIHJldHVybiBjb3VudHJ5ICE9IG51bGwgJiYgbUNvdW50cnlJc28uZXF1YWxzKGNvdW50cnkuZ2V0Q291bnRyeUlzbygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeURldGVjdG9yLmphdmEgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeURldGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI3ODBjZQotLS0gL2Rldi9udWxsCisrKyBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5RGV0ZWN0b3IuamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubG9jYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBzeXN0ZW0gY291bnRyeSBkZXRlY3RvciBzZXJ2aWNlLiBUaGlzCisgKiBzZXJ2aWNlIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gb2J0YWluIHRoZSBjb3VudHJ5IHRoYXQgdGhlIHVzZXIgaXMgaW4uCisgKiA8cD4KKyAqIFRoZSBjb3VudHJ5IHdpbGwgYmUgZGV0ZWN0ZWQgaW4gb3JkZXIgb2YgcmVsaWFiaWxpdHksIGxpa2UKKyAqIDx1bD4KKyAqIDxsaT5Nb2JpbGUgbmV0d29yazwvbGk+CisgKiA8bGk+TG9jYXRpb248L2xpPgorICogPGxpPlNJTSdzIGNvdW50cnk8L2xpPgorICogPGxpPlBob25lJ3MgbG9jYWxlPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIENhbGwgdGhlIHtAbGluayAjZGV0ZWN0Q291bnRyeSgpfSB0byBnZXQgdGhlIGF2YWlsYWJsZSBjb3VudHJ5IGltbWVkaWF0ZWx5LgorICogPHA+CisgKiBUbyBiZSBub3RpZmllZCBvZiB0aGUgZnV0dXJlIGNvdW50cnkgY2hhbmdlLCB1c2UgdGhlCisgKiB7QGxpbmsgI2FkZENvdW50cnlMaXN0ZW5lcn0KKyAqIDxwPgorICogPHA+CisgKiBZb3UgZG8gbm90IGluc3RhbnRpYXRlIHRoaXMgY2xhc3MgZGlyZWN0bHk7IGluc3RlYWQsIHJldHJpZXZlIGl0IHRocm91Z2gKKyAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNnZXRTeXN0ZW1TZXJ2aWNlCisgKiBDb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT1VOVFJZX0RFVEVDVE9SKX0uCisgKiA8cD4KKyAqIEJvdGggQUNDRVNTX0ZJTkVfTE9DQVRJT04gYW5kIEFDQ0VTU19DT0FSU0VfTE9DQVRJT04gcGVybWlzc2lvbnMgYXJlIG5lZWRlZC4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQ291bnRyeURldGVjdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzcyB0byB3cmFwIHRoZSBJQ291bnRyeUxpc3RlbmVyLlN0dWIgYW5kIENvdW50cnlMaXN0ZW5lciBvYmplY3RzCisgICAgICogdG9nZXRoZXIuIFRoZSBDb3VudHJ5TGlzdGVuZXIgd2lsbCBiZSBub3RpZmllZCB0aHJvdWdoIHRoZSBzcGVjaWZpYworICAgICAqIGxvb3BlciBvbmNlIHRoZSBjb3VudHJ5IGNoYW5nZWQgYW5kIGRldGVjdGVkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIExpc3RlbmVyVHJhbnNwb3J0IGV4dGVuZHMgSUNvdW50cnlMaXN0ZW5lci5TdHViIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIENvdW50cnlMaXN0ZW5lciBtTGlzdGVuZXI7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOworCisgICAgICAgIHB1YmxpYyBMaXN0ZW5lclRyYW5zcG9ydChDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIsIExvb3BlciBsb29wZXIpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICAgICAgaWYgKGxvb3BlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihsb29wZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNvdW50cnlEZXRlY3RlZChmaW5hbCBDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uQ291bnRyeURldGVjdGVkKGNvdW50cnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJDb3VudHJ5RGV0ZWN0b3IiOworICAgIHByaXZhdGUgZmluYWwgSUNvdW50cnlEZXRlY3RvciBtU2VydmljZTsKKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8Q291bnRyeUxpc3RlbmVyLCBMaXN0ZW5lclRyYW5zcG9ydD4gbUxpc3RlbmVyczsKKworICAgIC8qKgorICAgICAqIEBoaWRlIC0gaGlkZSB0aGlzIGNvbnN0cnVjdG9yIGJlY2F1c2UgaXQgaGFzIGEgcGFyYW1ldGVyIG9mIHR5cGUKKyAgICAgKiAgICAgICBJQ291bnRyeURldGVjdG9yLCB3aGljaCBpcyBhIHN5c3RlbSBwcml2YXRlIGNsYXNzLiBUaGUgcmlnaHQgd2F5IHRvCisgICAgICogICAgICAgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgdXNpbmcgdGhlIGZhY3RvcnkKKyAgICAgKiAgICAgICBDb250ZXh0LmdldFN5c3RlbVNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIENvdW50cnlEZXRlY3RvcihJQ291bnRyeURldGVjdG9yIHNlcnZpY2UpIHsKKyAgICAgICAgbVNlcnZpY2UgPSBzZXJ2aWNlOworICAgICAgICBtTGlzdGVuZXJzID0gbmV3IEhhc2hNYXA8Q291bnRyeUxpc3RlbmVyLCBMaXN0ZW5lclRyYW5zcG9ydD4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBkZXRlY3RpbmcgdGhlIGNvdW50cnkgdGhhdCB0aGUgdXNlciBpcyBpbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvdW50cnkgaWYgaXQgaXMgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LCBvdGhlcndpc2UgbnVsbCB3aWxsCisgICAgICogICAgICAgICBiZSByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ291bnRyeSBkZXRlY3RDb3VudHJ5KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgImRldGVjdENvdW50cnk6IFJlbW90ZUV4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaXN0ZW5lciB0byByZWNlaXZlIHRoZSBub3RpZmljYXRpb24gd2hlbiB0aGUgY291bnRyeSBpcyBkZXRlY3RlZAorICAgICAqIG9yIGNoYW5nZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgY291bnRyeSBpcyBkZXRlY3RlZCBvciBjaGFuZ2VkLgorICAgICAqIEBwYXJhbSBsb29wZXIgYSBMb29wZXIgb2JqZWN0IHdob3NlIG1lc3NhZ2UgcXVldWUgd2lsbCBiZSB1c2VkIHRvCisgICAgICogICAgICAgIGltcGxlbWVudCB0aGUgY2FsbGJhY2sgbWVjaGFuaXNtLiBJZiBsb29wZXIgaXMgbnVsbCB0aGVuIHRoZQorICAgICAqICAgICAgICBjYWxsYmFja3Mgd2lsbCBiZSBjYWxsZWQgb24gdGhlIG1haW4gdGhyZWFkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvdW50cnlMaXN0ZW5lcihDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIsIExvb3BlciBsb29wZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBpZiAoIW1MaXN0ZW5lcnMuY29udGFpbnNLZXkobGlzdGVuZXIpKSB7CisgICAgICAgICAgICAgICAgTGlzdGVuZXJUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbmV3IExpc3RlbmVyVHJhbnNwb3J0KGxpc3RlbmVyLCBsb29wZXIpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLmFkZENvdW50cnlMaXN0ZW5lcih0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXJzLnB1dChsaXN0ZW5lciwgdHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJhZGRDb3VudHJ5TGlzdGVuZXI6IFJlbW90ZUV4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgbGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDb3VudHJ5TGlzdGVuZXIoQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxpc3RlbmVycykgeworICAgICAgICAgICAgTGlzdGVuZXJUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbUxpc3RlbmVycy5nZXQobGlzdGVuZXIpOworICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5yZW1vdmVDb3VudHJ5TGlzdGVuZXIodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJyZW1vdmVDb3VudHJ5TGlzdGVuZXI6IFJlbW90ZUV4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5TGlzdGVuZXIuamF2YSBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzZkYjQxCi0tLSAvZGV2L251bGwKKysrIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnlMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5sb2NhdGlvbjsKKworLyoqCisgKiBUaGUgbGlzdGVuZXIgZm9yIHJlY2VpdmluZyB0aGUgbm90aWZpY2F0aW9uIHdoZW4gdGhlIGNvdW50cnkgaXMgZGV0ZWN0ZWQgb3IKKyAqIGNoYW5nZWQKKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgaW50ZXJmYWNlIENvdW50cnlMaXN0ZW5lciB7CisgICAgLyoqCisgICAgICogQHBhcmFtIGNvdW50cnkgdGhlIGNoYW5nZWQgb3IgZGV0ZWN0ZWQgY291bnRyeS4KKyAgICAgKi8KKyAgICB2b2lkIG9uQ291bnRyeURldGVjdGVkKENvdW50cnkgY291bnRyeSk7Cit9CmRpZmYgLS1naXQgYS9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUNvdW50cnlEZXRlY3Rvci5haWRsIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5RGV0ZWN0b3IuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWFmMDdjCi0tLSAvZGV2L251bGwKKysrIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5RGV0ZWN0b3IuYWlkbApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmxvY2F0aW9uOworCitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uSUNvdW50cnlMaXN0ZW5lcjsKKworLyoqCisgKiBUaGUgQVBJIGZvciBkZXRlY3RpbmcgdGhlIGNvdW50cnkgd2hlcmUgdGhlIHVzZXIgaXMuCisgKgorICoge0BoaWRlfQorICovCitpbnRlcmZhY2UgSUNvdW50cnlEZXRlY3RvcgoreworICAgIC8qKgorICAgICAqIFN0YXJ0IGRldGVjdGluZyB0aGUgY291bnRyeSB0aGF0IHRoZSB1c2VyIGlzIGluLgorICAgICAqIEByZXR1cm4gdGhlIGNvdW50cnkgaWYgaXQgaXMgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LCBvdGhlcndpc2UgbnVsbCB3aWxsIGJlIHJldHVybmVkLgorICAgICAqLworICAgIENvdW50cnkgZGV0ZWN0Q291bnRyeSgpOworCisgICAgLyoqCisgICAgICogQWRkIGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSB0aGUgbm90aWZpY2F0aW9uIHdoZW4gdGhlIGNvdW50cnkgaXMgZGV0ZWN0ZWQgb3IgY2hhbmdlZC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZENvdW50cnlMaXN0ZW5lcihpbiBJQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgbGlzdGVuZXIKKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZUNvdW50cnlMaXN0ZW5lcihpbiBJQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUNvdW50cnlMaXN0ZW5lci5haWRsIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5TGlzdGVuZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmVjYjEzCi0tLSAvZGV2L251bGwKKysrIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5TGlzdGVuZXIuYWlkbApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmxvY2F0aW9uOworCitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworLyoqCisgKiB7QGhpZGV9CisgKi8KK29uZXdheSBpbnRlcmZhY2UgSUNvdW50cnlMaXN0ZW5lcgoreworICAgIHZvaWQgb25Db3VudHJ5RGV0ZWN0ZWQoaW4gQ291bnRyeSBjb3VudHJ5KTsKK30KZGlmZiAtLWdpdCBhL2xvY2F0aW9uL3Rlc3RzL2xvY2F0aW9udGVzdHMvc3JjL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeVRlc3Rlci5qYXZhIGIvbG9jYXRpb24vdGVzdHMvbG9jYXRpb250ZXN0cy9zcmMvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5VGVzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgwMmQ1YQotLS0gL2Rldi9udWxsCisrKyBiL2xvY2F0aW9uL3Rlc3RzL2xvY2F0aW9udGVzdHMvc3JjL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeVRlc3Rlci5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubG9jYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgQ291bnRyeVRlc3RlciBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHVibGljIHZvaWQgdGVzdENvdW50cnlFcXVhbHMoKSB7CisgICAgICAgIENvdW50cnkgY291bnRyeUEgPSBuZXcgQ291bnRyeSgiVVMiLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX05FVFdPUkspOworICAgICAgICBDb3VudHJ5IGNvdW50cnlCID0gbmV3IENvdW50cnkoIlVTIiwgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9MT0NBTEUpOworICAgICAgICBDb3VudHJ5IGNvdW50cnlDID0gbmV3IENvdW50cnkoIkNOIiwgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9MT0NBTEUpOworICAgICAgICBDb3VudHJ5IGNvdW50cnlEID0gbmV3IENvdW50cnkoInVzIiwgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9ORVRXT1JLKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5QS5lcXVhbHNJZ25vcmVTb3VyY2UoY291bnRyeUIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY291bnRyeUEuZXF1YWxzSWdub3JlU291cmNlKGNvdW50cnlDKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvdW50cnlBLmVxdWFscyhjb3VudHJ5QykpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlBLmVxdWFscyhjb3VudHJ5RCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlBLmhhc2hDb2RlKCkgPT0gY291bnRyeUQuaGFzaENvZGUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvRm9ybWF0LmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQuamF2YQppbmRleCBmMWZhMWU4Li4zMWU0NjMxIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQuamF2YQpAQCAtMzEsOSArMzEsOSBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQ09ESU5HX0lOVkFMSUQgPSAwOwogICAgIC8qKiBEZWZhdWx0IGF1ZGlvIGRhdGEgZm9ybWF0ICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfREVGQVVMVCA9IDE7Ci0gICAgLyoqIEF1ZGlvIGRhdGEgZm9ybWF0OiBQQ00gMTYgYml0IHBlciBzYW1wbGUgKi8KKyAgICAvKiogQXVkaW8gZGF0YSBmb3JtYXQ6IFBDTSAxNiBiaXQgcGVyIHNhbXBsZS4gR3VhcmFudGVlZCB0byBiZSBzdXBwb3J0ZWQgYnkgZGV2aWNlcy4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR19QQ01fMTZCSVQgPSAyOyAvLyBhY2Nlc3NlZCBieSBuYXRpdmUgY29kZQotICAgIC8qKiBBdWRpbyBkYXRhIGZvcm1hdDogUENNIDggYml0IHBlciBzYW1wbGUgKi8KKyAgICAvKiogQXVkaW8gZGF0YSBmb3JtYXQ6IFBDTSA4IGJpdCBwZXIgc2FtcGxlLiBOb3QgZ3VhcmFudGVlZCB0byBiZSBzdXBwb3J0ZWQgYnkgZGV2aWNlcy4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR19QQ01fOEJJVCA9IDM7ICAvLyBhY2Nlc3NlZCBieSBuYXRpdmUgY29kZQogCiAgICAgLyoqIEludmFsaWQgYXVkaW8gY2hhbm5lbCBjb25maWd1cmF0aW9uICovCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9NYW5hZ2VyLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9NYW5hZ2VyLmphdmEKaW5kZXggYmJiYmE3NC4uYjIzZGNkZSAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvTWFuYWdlci5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb01hbmFnZXIuamF2YQpAQCAtMTUyNSw0ICsxNTI1LDIyIEBACiAgICAgICAqIHtAaGlkZX0KICAgICAgICovCiAgICAgIHByaXZhdGUgSUJpbmRlciBtSUNhbGxCYWNrID0gbmV3IEJpbmRlcigpOworCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHBob25lIGlzIGluIHNpbGVudCBtb2RlLCB3aXRoIG9yIHdpdGhvdXQgdmlicmF0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBwaG9uZSBpcyBpbiBzaWxlbnQgbW9kZSwgd2l0aCBvciB3aXRob3V0IHZpYnJhdGUuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRSaW5nZXJNb2RlKCkKKyAgICAgKgorICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIENvdW5jaWwgYXBwcm92YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NpbGVudE1vZGUoKSB7CisgICAgICAgIGludCByaW5nZXJNb2RlID0gZ2V0UmluZ2VyTW9kZSgpOworICAgICAgICBib29sZWFuIHNpbGVudE1vZGUgPQorICAgICAgICAgICAgKHJpbmdlck1vZGUgPT0gUklOR0VSX01PREVfU0lMRU5UKSB8fAorICAgICAgICAgICAgKHJpbmdlck1vZGUgPT0gUklOR0VSX01PREVfVklCUkFURSk7CisgICAgICAgIHJldHVybiBzaWxlbnRNb2RlOworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvUmVjb3JkLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9SZWNvcmQuamF2YQppbmRleCBjNDhlYWFkLi5jNTY3YTZlIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9SZWNvcmQuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9SZWNvcmQuamF2YQpAQCAtMTk0LDExICsxOTQsMTMgQEAKICAgICAgKiBDbGFzcyBjb25zdHJ1Y3Rvci4KICAgICAgKiBAcGFyYW0gYXVkaW9Tb3VyY2UgdGhlIHJlY29yZGluZyBzb3VyY2UuIFNlZSB7QGxpbmsgTWVkaWFSZWNvcmRlci5BdWRpb1NvdXJjZX0gZm9yCiAgICAgICogICAgcmVjb3JkaW5nIHNvdXJjZSBkZWZpbml0aW9ucy4KLSAgICAgKiBAcGFyYW0gc2FtcGxlUmF0ZUluSHogdGhlIHNhbXBsZSByYXRlIGV4cHJlc3NlZCBpbiBIZXJ0ei4gRXhhbXBsZXMgb2YgcmF0ZXMgYXJlIChidXQKLSAgICAgKiAgIG5vdCBsaW1pdGVkIHRvKSA0NDEwMCwgMjIwNTAgYW5kIDExMDI1LgorICAgICAqIEBwYXJhbSBzYW1wbGVSYXRlSW5IeiB0aGUgc2FtcGxlIHJhdGUgZXhwcmVzc2VkIGluIEhlcnR6LiA0NDEwMEh6IGlzIGN1cnJlbnRseSB0aGUgb25seQorICAgICAqICAgcmF0ZSB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gd29yayBvbiBhbGwgZGV2aWNlcywgYnV0IG90aGVyIHJhdGVzIHN1Y2ggYXMgMjIwNTAsCisgICAgICogICAxNjAwMCwgYW5kIDExMDI1IG1heSB3b3JrIG9uIHNvbWUgZGV2aWNlcy4KICAgICAgKiBAcGFyYW0gY2hhbm5lbENvbmZpZyBkZXNjcmliZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGF1ZGlvIGNoYW5uZWxzLiAKICAgICAgKiAgIFNlZSB7QGxpbmsgQXVkaW9Gb3JtYXQjQ0hBTk5FTF9JTl9NT05PfSBhbmQKLSAgICAgKiAgIHtAbGluayBBdWRpb0Zvcm1hdCNDSEFOTkVMX0lOX1NURVJFT30KKyAgICAgKiAgIHtAbGluayBBdWRpb0Zvcm1hdCNDSEFOTkVMX0lOX1NURVJFT30uICB7QGxpbmsgQXVkaW9Gb3JtYXQjQ0hBTk5FTF9JTl9NT05PfSBpcyBndWFyYW50ZWVkCisgICAgICogICB0byB3b3JrIG9uIGFsbCBkZXZpY2VzLgogICAgICAqIEBwYXJhbSBhdWRpb0Zvcm1hdCB0aGUgZm9ybWF0IGluIHdoaWNoIHRoZSBhdWRpbyBkYXRhIGlzIHJlcHJlc2VudGVkLiAKICAgICAgKiAgIFNlZSB7QGxpbmsgQXVkaW9Gb3JtYXQjRU5DT0RJTkdfUENNXzE2QklUfSBhbmQgCiAgICAgICogICB7QGxpbmsgQXVkaW9Gb3JtYXQjRU5DT0RJTkdfUENNXzhCSVR9CkBAIC00NDQsNiArNDQ2LDggQEAKICAgICAgKiAgb3Ige0BsaW5rICNFUlJPUn0gaWYgdGhlIGltcGxlbWVudGF0aW9uIHdhcyB1bmFibGUgdG8gcXVlcnkgdGhlIGhhcmR3YXJlIGZvciBpdHMgCiAgICAgICogIG91dHB1dCBwcm9wZXJ0aWVzLCAKICAgICAgKiAgIG9yIHRoZSBtaW5pbXVtIGJ1ZmZlciBzaXplIGV4cHJlc3NlZCBpbiBieXRlcy4KKyAgICAgKiBAc2VlICNBdWRpb1JlY29yZChpbnQsIGludCwgaW50LCBpbnQsIGludCkgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdmFsaWQKKyAgICAgKiAgIGNvbmZpZ3VyYXRpb24gdmFsdWVzLgogICAgICAqLwogICAgIHN0YXRpYyBwdWJsaWMgaW50IGdldE1pbkJ1ZmZlclNpemUoaW50IHNhbXBsZVJhdGVJbkh6LCBpbnQgY2hhbm5lbENvbmZpZywgaW50IGF1ZGlvRm9ybWF0KSB7CiAgICAgICAgIGludCBjaGFubmVsQ291bnQgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvU2VydmljZS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvU2VydmljZS5qYXZhCmluZGV4IDQxZDJjYzUuLjZhYTFhZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1NlcnZpY2UuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9TZXJ2aWNlLmphdmEKQEAgLTE2LDE4ICsxNiwxOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJOYXRpdmU7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQTJkcDsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aENsYXNzOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIZWFkc2V0OworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEEyZHA7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQ2xhc3M7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEhlYWRzZXQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIuT25Db21wbGV0aW9uTGlzdGVuZXI7CkBAIC00MCw2ICs0MSw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TeXN0ZW07CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVTdGF0ZUxpc3RlbmVyOwpAQCAtNDcsNyArNDksNiBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5Wb2x1bWVQYW5lbDsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVRlbGVwaG9ueTsKIApAQCAtNTgsNiArNTksNyBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlN0YWNrOwogCkBAIC0yNTgsOCArMjYwLDggQEAKICAgICAvLyBCbHVldG9vdGhIZWFkc2V0IEFQSSB0byBjb250cm9sIFNDTyBjb25uZWN0aW9uCiAgICAgcHJpdmF0ZSBCbHVldG9vdGhIZWFkc2V0IG1CbHVldG9vdGhIZWFkc2V0OwogCi0gICAgLy8gQmx1ZXRvb3RoIGhlYWRzZXQgY29ubmVjdGlvbiBzdGF0ZQotICAgIHByaXZhdGUgYm9vbGVhbiBtQmx1ZXRvb3RoSGVhZHNldENvbm5lY3RlZDsKKyAgICAvLyBCbHVldG9vdGggaGVhZHNldCBkZXZpY2UKKyAgICBwcml2YXRlIEJsdWV0b290aERldmljZSBtQmx1ZXRvb3RoSGVhZHNldERldmljZTsKIAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIC8vIENvbnN0cnVjdGlvbgpAQCAtMjk0LDE3ICsyOTYsMjAgQEAKICAgICAgICAgQXVkaW9TeXN0ZW0uc2V0RXJyb3JDYWxsYmFjayhtQXVkaW9TeXN0ZW1DYWxsYmFjayk7CiAgICAgICAgIGxvYWRTb3VuZEVmZmVjdHMoKTsKIAotICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldENvbm5lY3RlZCA9IGZhbHNlOwotICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldCA9IG5ldyBCbHVldG9vdGhIZWFkc2V0KGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEhlYWRzZXRTZXJ2aWNlTGlzdGVuZXIpOworICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldERldmljZSA9IG51bGw7CisgICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKKyAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRhcHRlci5nZXRQcm9maWxlUHJveHkobUNvbnRleHQsIG1CbHVldG9vdGhQcm9maWxlU2VydmljZUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VUKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIFJlZ2lzdGVyIGZvciBkZXZpY2UgY29ubmVjdGlvbiBpbnRlbnQgYnJvYWRjYXN0cy4KICAgICAgICAgSW50ZW50RmlsdGVyIGludGVudEZpbHRlciA9CiAgICAgICAgICAgICAgICAgbmV3IEludGVudEZpbHRlcihJbnRlbnQuQUNUSU9OX0hFQURTRVRfUExVRyk7Ci0gICAgICAgIGludGVudEZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoQTJkcC5BQ1RJT05fU0lOS19TVEFURV9DSEFOR0VEKTsKLSAgICAgICAgaW50ZW50RmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhIZWFkc2V0LkFDVElPTl9TVEFURV9DSEFOR0VEKTsKLSAgICAgICAgaW50ZW50RmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX0RPQ0tfRVZFTlQpOworICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEEyZHAuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCk7CiAgICAgICAgIGludGVudEZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoSGVhZHNldC5BQ1RJT05fQVVESU9fU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgIGludGVudEZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoSGVhZHNldC5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKTsKKyAgICAgICAgaW50ZW50RmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX0RPQ0tfRVZFTlQpOwogICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyLCBpbnRlbnRGaWx0ZXIpOwogCiAgICAgICAgIC8vIFJlZ2lzdGVyIGZvciBtZWRpYSBidXR0b24gaW50ZW50IGJyb2FkY2FzdHMuCkBAIC0xMDAwLDcgKzEwMDUsNyBAQAogCiAgICAgICAgIHB1YmxpYyB2b2lkIGluY0NvdW50KCkgewogICAgICAgICAgICAgc3luY2hyb25pemVkKG1TY29DbGllbnRzKSB7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdFNjb1N0YXRlKEJsdWV0b290aEhlYWRzZXQuQVVESU9fU1RBVEVfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0U2NvU3RhdGUoQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9BVURJT19DT05ORUNURUQpOwogICAgICAgICAgICAgICAgIGlmIChtU3RhcnRjb3VudCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQ2IubGlua1RvRGVhdGgodGhpcywgMCk7CkBAIC0xMDI2LDcgKzEwMzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgImRlY0NvdW50KCkgZ29pbmcgdG8gMCBidXQgbm90IHJlZ2lzdGVyZWQgdG8gYmluZGVyIik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFNjb1N0YXRlKEJsdWV0b290aEhlYWRzZXQuQVVESU9fU1RBVEVfRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFNjb1N0YXRlKEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQVVESU9fRElTQ09OTkVDVEVEKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEwNDIsNyArMTA0Nyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1TdGFydGNvdW50ID0gMDsKICAgICAgICAgICAgICAgICBpZiAoc3RvcFNjbykgewotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U2NvU3RhdGUoQmx1ZXRvb3RoSGVhZHNldC5BVURJT19TVEFURV9ESVNDT05ORUNURUQpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U2NvU3RhdGUoQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9BVURJT19ESVNDT05ORUNURUQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTA2OCwxMiArMTA3MywxMiBAQAogCiAgICAgICAgIHByaXZhdGUgdm9pZCByZXF1ZXN0U2NvU3RhdGUoaW50IHN0YXRlKSB7CiAgICAgICAgICAgICBpZiAodG90YWxDb3VudCgpID09IDAgJiYKLSAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldENvbm5lY3RlZCAmJgorICAgICAgICAgICAgICAgIG1CbHVldG9vdGhIZWFkc2V0RGV2aWNlICE9IG51bGwgJiYKICAgICAgICAgICAgICAgICBBdWRpb1NlcnZpY2UudGhpcy5tTW9kZSA9PSBBdWRpb1N5c3RlbS5NT0RFX05PUk1BTCkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhIZWFkc2V0LkFVRElPX1NUQVRFX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldC5zdGFydFZvaWNlUmVjb2duaXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9BVURJT19DT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEhlYWRzZXQuc3RhcnRWb2ljZVJlY29nbml0aW9uKG1CbHVldG9vdGhIZWFkc2V0RGV2aWNlKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldC5zdG9wVm9pY2VSZWNvZ25pdGlvbigpOworICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldC5zdG9wVm9pY2VSZWNvZ25pdGlvbihtQmx1ZXRvb3RoSGVhZHNldERldmljZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMTAzLDIzICsxMTA4LDI3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIEJsdWV0b290aEhlYWRzZXQuU2VydmljZUxpc3RlbmVyIG1CbHVldG9vdGhIZWFkc2V0U2VydmljZUxpc3RlbmVyID0KLSAgICAgICAgbmV3IEJsdWV0b290aEhlYWRzZXQuU2VydmljZUxpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoKSB7Ci0gICAgICAgICAgICBpZiAobUJsdWV0b290aEhlYWRzZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQmx1ZXRvb3RoSGVhZHNldC5nZXRDdXJyZW50SGVhZHNldCgpOwotICAgICAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoSGVhZHNldC5nZXRTdGF0ZShkZXZpY2UpID09IEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhIZWFkc2V0Q29ubmVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9CisgICAgcHJpdmF0ZSBCbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lciBtQmx1ZXRvb3RoUHJvZmlsZVNlcnZpY2VMaXN0ZW5lciA9CisgICAgICAgIG5ldyBCbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKGludCBwcm9maWxlLCBCbHVldG9vdGhQcm9maWxlIHByb3h5KSB7CisgICAgICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldCA9IChCbHVldG9vdGhIZWFkc2V0KSBwcm94eTsKKyAgICAgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGRldmljZVNldCA9IG1CbHVldG9vdGhIZWFkc2V0LmdldENvbm5lY3RlZERldmljZXMoKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2VTZXQuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZVtdIGRldmljZXMgPQorICAgICAgICAgICAgICAgICAgICBkZXZpY2VTZXQudG9BcnJheShuZXcgQmx1ZXRvb3RoRGV2aWNlW2RldmljZVNldC5zaXplKCldKTsKKyAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldERldmljZSA9IGRldmljZXNbMF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1CbHVldG9vdGhIZWFkc2V0RGV2aWNlID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChpbnQgcHJvZmlsZSkgewogICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhIZWFkc2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUJsdWV0b290aEhlYWRzZXQuZ2V0Q3VycmVudEhlYWRzZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAobUJsdWV0b290aEhlYWRzZXQuZ2V0U3RhdGUoZGV2aWNlKSA9PSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldENvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMgPSBtQmx1ZXRvb3RoSGVhZHNldC5nZXRDb25uZWN0ZWREZXZpY2VzKCk7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEhlYWRzZXREZXZpY2UgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICBjbGVhckFsbFNjb0NsaWVudHMoKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUJsdWV0b290aEhlYWRzZXQgPSBudWxsOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfTsKQEAgLTE4MTMsMTggKzE4MjIsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IEF1ZGlvU3lzdGVtLkZPUkNFX05PTkU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtLnNldEZvcmNlVXNlKEF1ZGlvU3lzdGVtLkZPUl9ET0NLLCBjb25maWcpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aEEyZHAuQUNUSU9OX1NJTktfU1RBVEVfQ0hBTkdFRCkpIHsKLSAgICAgICAgICAgICAgICBpbnQgc3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoQTJkcC5FWFRSQV9TSU5LX1NUQVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoQTJkcC5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKSkgeworICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhQcm9maWxlLkVYVFJBX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCk7CiAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGJ0RGV2aWNlID0gaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IGJ0RGV2aWNlLmdldEFkZHJlc3MoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzQ29ubmVjdGVkID0gKG1Db25uZWN0ZWREZXZpY2VzLmNvbnRhaW5zS2V5KEF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZyltQ29ubmVjdGVkRGV2aWNlcy5nZXQoQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCkpLmVxdWFscyhhZGRyZXNzKSk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Nvbm5lY3RlZCA9CisgICAgICAgICAgICAgICAgICAgIChtQ29ubmVjdGVkRGV2aWNlcy5jb250YWluc0tleShBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQKSAmJgorICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RlZERldmljZXMuZ2V0KEF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFApLmVxdWFscyhhZGRyZXNzKSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoaXNDb25uZWN0ZWQgJiYKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgIT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNURUQgJiYgc3RhdGUgIT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGVkICYmIHN0YXRlICE9IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChidERldmljZS5pc0JsdWV0b290aERvY2soKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRyb2R1Y3Rpb24gb2YgYSBkZWxheSBmb3IgdHJhbnNpZW50IGRpc2Nvbm5lY3Rpb25zIG9mIGRvY2tzIHdoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3dlciBpcyByYXBpZGx5IHR1cm5lZCBvZmYvb24sIHRoaXMgbWVzc2FnZSB3aWxsIGJlIGNhbmNlbGVkIGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgcmVjb25uZWN0IHRoZSBkb2NrIHVuZGVyIGEgcHJlc2V0IGRlbGF5CkBAIC0xODM0LDkgKzE4NDMsNyBAQAogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgbWFrZUEyZHBEZXZpY2VVbmF2YWlsYWJsZU5vdyhhZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzQ29ubmVjdGVkICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0ZSA9PSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RFRCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HKSkgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzQ29ubmVjdGVkICYmIHN0YXRlID09IEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChidERldmljZS5pc0JsdWV0b290aERvY2soKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjb3VsZCBiZSBhIHJlY29ubmVjdGlvbiBhZnRlciBhIHRyYW5zaWVudCBkaXNjb25uZWN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxBMmRwRGV2aWNlVGltZW91dCgpOwpAQCAtMTg1MSw5ICsxODU4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtYWtlQTJkcERldmljZUF2YWlsYWJsZShhZGRyZXNzKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoSGVhZHNldC5BQ1RJT05fU1RBVEVfQ0hBTkdFRCkpIHsKLSAgICAgICAgICAgICAgICBpbnQgc3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoSGVhZHNldC5FWFRSQV9TVEFURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9FUlJPUik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoSGVhZHNldC5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKSkgeworICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhQcm9maWxlLkVYVFJBX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCk7CiAgICAgICAgICAgICAgICAgaW50IGRldmljZSA9IEF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDTzsKICAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgYnREZXZpY2UgPSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UpOwogICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzID0gbnVsbDsKQEAgLTE4NzQsMjEgKzE4ODEsMjEgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBib29sZWFuIGlzQ29ubmVjdGVkID0gKG1Db25uZWN0ZWREZXZpY2VzLmNvbnRhaW5zS2V5KGRldmljZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKW1Db25uZWN0ZWREZXZpY2VzLmdldChkZXZpY2UpKS5lcXVhbHMoYWRkcmVzcykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RlZERldmljZXMuZ2V0KGRldmljZSkuZXF1YWxzKGFkZHJlc3MpKTsKIAotICAgICAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RlZCAmJiBzdGF0ZSAhPSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RlZCAmJiBzdGF0ZSAhPSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RFRCkgewogICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbS5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW0uREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0ZWREZXZpY2VzLnJlbW92ZShkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldENvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldERldmljZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgIGNsZWFyQWxsU2NvQ2xpZW50cygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzQ29ubmVjdGVkICYmIHN0YXRlID09IEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaXNDb25uZWN0ZWQgJiYgc3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQpIHsKICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW0uc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtLkRFVklDRV9TVEFURV9BVkFJTEFCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RlZERldmljZXMucHV0KG5ldyBJbnRlZ2VyKGRldmljZSksIGFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldENvbm5lY3RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhIZWFkc2V0RGV2aWNlID0gYnREZXZpY2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEludGVudC5BQ1RJT05fSEVBRFNFVF9QTFVHKSkgewogICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYSgic3RhdGUiLCAwKTsKQEAgLTE5MjIsMTUgKzE5MjksMTQgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhCbHVldG9vdGhIZWFkc2V0LkFDVElPTl9BVURJT19TVEFURV9DSEFOR0VEKSkgewotICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhIZWFkc2V0LkVYVFJBX0FVRElPX1NUQVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0VSUk9SKTsKKyAgICAgICAgICAgICAgICBpbnQgc3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoUHJvZmlsZS5FWFRSQV9TVEFURSwgLTEpOwogICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVNjb0NsaWVudHMpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtU2NvQ2xpZW50cy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5BVURJT19TVEFURV9DT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQVVESU9fQ09OTkVDVEVEOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gQXVkaW9NYW5hZ2VyLlNDT19BVURJT19TVEFURV9DT05ORUNURUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuQVVESU9fU1RBVEVfRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0FVRElPX0RJU0NPTk5FQ1RFRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEF1ZGlvTWFuYWdlci5TQ09fQVVESU9fU1RBVEVfRElTQ09OTkVDVEVEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9DYW1jb3JkZXJQcm9maWxlLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5qYXZhCmluZGV4IGEyN2RmNTcuLjNlOTQyOWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9DYW1jb3JkZXJQcm9maWxlLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuamF2YQpAQCAtMzksMjIgKzM5LDgwIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBDYW1jb3JkZXJQcm9maWxlCiB7CisgICAgLy8gRG8gbm90IGNoYW5nZSB0aGVzZSB2YWx1ZXMvb3JkaW5hbHMgd2l0aG91dCB1cGRhdGluZyB0aGVpciBjb3VudGVycGFydAorICAgIC8vIGluIGluY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oIQorCiAgICAgLyoqCi0gICAgICogVGhlIG91dHB1dCBmcm9tIGNhbWNvcmRlciByZWNvcmRpbmcgc2Vzc2lvbnMgY2FuIGhhdmUgZGlmZmVyZW50IHF1YWxpdHkgbGV2ZWxzLgotICAgICAqCi0gICAgICogQ3VycmVudGx5LCB3ZSBkZWZpbmUgdHdvIHF1YWxpdHkgbGV2ZWxzOiBoaWdoIHF1YWxpdHkgYW5kIGxvdyBxdWFsaXR5LgotICAgICAqIEEgY2FtY29yZGVyIHJlY29yZGluZyBzZXNzaW9uIHdpdGggaGlnaCBxdWFsaXR5IGxldmVsIHVzdWFsbHkgaGFzIGhpZ2hlciBvdXRwdXQgYml0Ci0gICAgICogcmF0ZSwgYmV0dGVyIHZpZGVvIGFuZC9vciBhdWRpbyByZWNvcmRpbmcgcXVhbGl0eSwgbGFyZ2VyIHZpZGVvIGZyYW1lCi0gICAgICogcmVzb2x1dGlvbiBhbmQgaGlnaGVyIGF1ZGlvIHNhbXBsaW5nIHJhdGUsIGV0YywgdGhhbiB0aG9zZSB3aXRoIGxvdyBxdWFsaXR5Ci0gICAgICogbGV2ZWwuCi0gICAgICoKLSAgICAgKiBEbyBub3QgY2hhbmdlIHRoZXNlIHZhbHVlcy9vcmRpbmFscyB3aXRob3V0IHVwZGF0aW5nIHRoZWlyIGNvdW50ZXJwYXJ0Ci0gICAgICogaW4gaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmghCisgICAgICogUXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb3dlc3QgYXZhaWxhYmxlIHJlc29sdXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV9MT1cgID0gMDsKKworICAgIC8qKgorICAgICAqIFF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgaGlnaGVzdCBhdmFpbGFibGUgcmVzb2x1dGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSVRZX0hJR0ggPSAxOwogCiAgICAgLyoqCisgICAgICogUXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBxY2lmICgxNzYgeCAxNDQpIHJlc29sdXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV9RQ0lGID0gMjsKKworICAgIC8qKgorICAgICAqIFF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgY2lmICgzNTIgeCAyODgpIHJlc29sdXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV9DSUYgPSAzOworCisgICAgLyoqCisgICAgICogUXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSA0ODBwICg3MjAgeCA0ODApIHJlc29sdXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV80ODBQID0gNDsKKworICAgIC8qKgorICAgICAqIFF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgNzIwcCAoMTI4MCB4IDcyMCkgcmVzb2x1dGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSVRZXzcyMFAgPSA1OworCisgICAgLyoqCisgICAgICogUXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSAxMDgwcCAoMTkyMCB4IDEwODgpIHJlc29sdXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV8xMDgwUCA9IDY7CisKKyAgICAvKioKKyAgICAgKiBUaW1lIGxhcHNlIHF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgbG93ZXN0IGF2YWlsYWJsZSByZXNvbHV0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVQUxJVFlfVElNRV9MQVBTRV9MT1cgID0gMTAwMDsKKworICAgIC8qKgorICAgICAqIFRpbWUgbGFwc2UgcXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBoaWdoZXN0IGF2YWlsYWJsZSByZXNvbHV0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVQUxJVFlfVElNRV9MQVBTRV9ISUdIID0gMTAwMTsKKworICAgIC8qKgorICAgICAqIFRpbWUgbGFwc2UgcXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBxY2lmICgxNzYgeCAxNDQpIHJlc29sdXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV9USU1FX0xBUFNFX1FDSUYgPSAxMDAyOworCisgICAgLyoqCisgICAgICogVGltZSBsYXBzZSBxdWFsaXR5IGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNpZiAoMzUyIHggMjg4KSByZXNvbHV0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVQUxJVFlfVElNRV9MQVBTRV9DSUYgPSAxMDAzOworCisgICAgLyoqCisgICAgICogVGltZSBsYXBzZSBxdWFsaXR5IGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIDQ4MHAgKDcyMCB4IDQ4MCkgcmVzb2x1dGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSVRZX1RJTUVfTEFQU0VfNDgwUCA9IDEwMDQ7CisKKyAgICAvKioKKyAgICAgKiBUaW1lIGxhcHNlIHF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgNzIwcCAoMTI4MCB4IDcyMCkgcmVzb2x1dGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSVRZX1RJTUVfTEFQU0VfNzIwUCA9IDEwMDU7CisKKyAgICAvKioKKyAgICAgKiBUaW1lIGxhcHNlIHF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgMTA4MHAgKDE5MjAgeCAxMDg4KSByZXNvbHV0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVQUxJVFlfVElNRV9MQVBTRV8xMDgwUCA9IDEwMDY7CisKKyAgICAvKioKICAgICAgKiBEZWZhdWx0IHJlY29yZGluZyBkdXJhdGlvbiBpbiBzZWNvbmRzIGJlZm9yZSB0aGUgc2Vzc2lvbiBpcyB0ZXJtaW5hdGVkLgogICAgICAqIFRoaXMgaXMgdXNlZnVsIGZvciBhcHBsaWNhdGlvbnMgbGlrZSBNTVMgaGFzIGxpbWl0ZWQgZmlsZSBzaXplIHJlcXVpcmVtZW50LgogICAgICAqLwpAQCAtMTIyLDI1ICsxODAsNzkgQEAKICAgICAgKiBSZXR1cm5zIHRoZSBjYW1jb3JkZXIgcHJvZmlsZSBmb3IgdGhlIGRlZmF1bHQgY2FtZXJhIGF0IHRoZSBnaXZlbgogICAgICAqIHF1YWxpdHkgbGV2ZWwuCiAgICAgICogQHBhcmFtIHF1YWxpdHkgdGhlIHRhcmdldCBxdWFsaXR5IGxldmVsIGZvciB0aGUgY2FtY29yZGVyIHByb2ZpbGUKKyAgICAgKiBAc2VlICNnZXQoaW50LCBpbnQpCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDYW1jb3JkZXJQcm9maWxlIGdldChpbnQgcXVhbGl0eSkgewotICAgICAgICByZXR1cm4gZ2V0KDAsIHF1YWxpdHkpOworICAgICAgICByZXR1cm4gZ2V0KGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhLkNBTUVSQV9JRF9ERUZBVUxULCBxdWFsaXR5KTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBjYW1jb3JkZXIgcHJvZmlsZSBmb3IgdGhlIGdpdmVuIGNhbWVyYSBhdCB0aGUgZ2l2ZW4KICAgICAgKiBxdWFsaXR5IGxldmVsLgorICAgICAqCisgICAgICogUXVhbGl0eSBsZXZlbHMgUVVBTElUWV9MT1csIFFVQUxJVFlfSElHSCBhcmUgZ3VhcmFudGVlZCB0byBiZSBzdXBwb3J0ZWQsIHdoaWxlCisgICAgICogb3RoZXIgbGV2ZWxzIG1heSBvciBtYXkgbm90IGJlIHN1cHBvcnRlZC4gVGhlIHN1cHBvcnRlZCBsZXZlbHMgY2FuIGJlIGNoZWNrZWQgdXNpbmcKKyAgICAgKiB7QGxpbmsgI2hhc1Byb2ZpbGUoaW50LCBpbnQpfS4KKyAgICAgKiBRVUFMSVRZX0xPVyByZWZlcnMgdG8gdGhlIGxvd2VzdCBxdWFsaXR5IGF2YWlsYWJsZSwgd2hpbGUgUVVBTElUWV9ISUdIIHJlZmVycyB0bworICAgICAqIHRoZSBoaWdoZXN0IHF1YWxpdHkgYXZhaWxhYmxlLgorICAgICAqIFFVQUxJVFlfTE9XL1FVQUxJVFlfSElHSCBoYXZlIHRvIG1hdGNoIG9uZSBvZiBxY2lmLCBjaWYsIDQ4MHAsIDcyMHAsIG9yIDEwODBwLgorICAgICAqIEUuZy4gaWYgdGhlIGRldmljZSBzdXBwb3J0cyA0ODBwLCA3MjBwLCBhbmQgMTA4MHAsIHRoZW4gbG93IGlzIDQ4MHAgYW5kIGhpZ2ggaXMKKyAgICAgKiAxMDgwcC4KKyAgICAgKgorICAgICAqIFRoZSBzYW1lIGlzIHRydWUgZm9yIHRpbWUgbGFwc2UgcXVhbGl0eSBsZXZlbHMsIGkuZS4gUVVBTElUWV9USU1FX0xBUFNFX0xPVywKKyAgICAgKiBRVUFMSVRZX1RJTUVfTEFQU0VfSElHSCBhcmUgZ3VhcmFudGVlZCB0byBiZSBzdXBwb3J0ZWQgYW5kIGhhdmUgdG8gbWF0Y2ggb25lIG9mCisgICAgICogcWNpZiwgY2lmLCA0ODBwLCA3MjBwLCBvciAxMDgwcC4KKyAgICAgKgorICAgICAqIEEgY2FtY29yZGVyIHJlY29yZGluZyBzZXNzaW9uIHdpdGggaGlnaGVyIHF1YWxpdHkgbGV2ZWwgdXN1YWxseSBoYXMgaGlnaGVyIG91dHB1dAorICAgICAqIGJpdCByYXRlLCBiZXR0ZXIgdmlkZW8gYW5kL29yIGF1ZGlvIHJlY29yZGluZyBxdWFsaXR5LCBsYXJnZXIgdmlkZW8gZnJhbWUKKyAgICAgKiByZXNvbHV0aW9uIGFuZCBoaWdoZXIgYXVkaW8gc2FtcGxpbmcgcmF0ZSwgZXRjLCB0aGFuIHRob3NlIHdpdGggbG93ZXIgcXVhbGl0eQorICAgICAqIGxldmVsLgorICAgICAqCiAgICAgICogQHBhcmFtIGNhbWVyYUlkIHRoZSBpZCBmb3IgdGhlIGNhbWVyYQotICAgICAqIEBwYXJhbSBxdWFsaXR5IHRoZSB0YXJnZXQgcXVhbGl0eSBsZXZlbCBmb3IgdGhlIGNhbWNvcmRlciBwcm9maWxlCisgICAgICogQHBhcmFtIHF1YWxpdHkgdGhlIHRhcmdldCBxdWFsaXR5IGxldmVsIGZvciB0aGUgY2FtY29yZGVyIHByb2ZpbGUuCisgICAgICogQHNlZSAjUVVBTElUWV9MT1cKKyAgICAgKiBAc2VlICNRVUFMSVRZX0hJR0gKKyAgICAgKiBAc2VlICNRVUFMSVRZX1FDSUYKKyAgICAgKiBAc2VlICNRVUFMSVRZX0NJRgorICAgICAqIEBzZWUgI1FVQUxJVFlfNDgwUAorICAgICAqIEBzZWUgI1FVQUxJVFlfNzIwUAorICAgICAqIEBzZWUgI1FVQUxJVFlfMTA4MFAKKyAgICAgKiBAc2VlICNRVUFMSVRZX1RJTUVfTEFQU0VfTE9XCisgICAgICogQHNlZSAjUVVBTElUWV9USU1FX0xBUFNFX0hJR0gKKyAgICAgKiBAc2VlICNRVUFMSVRZX1RJTUVfTEFQU0VfUUNJRgorICAgICAqIEBzZWUgI1FVQUxJVFlfVElNRV9MQVBTRV9DSUYKKyAgICAgKiBAc2VlICNRVUFMSVRZX1RJTUVfTEFQU0VfNDgwUAorICAgICAqIEBzZWUgI1FVQUxJVFlfVElNRV9MQVBTRV83MjBQCisgICAgICogQHNlZSAjUVVBTElUWV9USU1FX0xBUFNFXzEwODBQCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDYW1jb3JkZXJQcm9maWxlIGdldChpbnQgY2FtZXJhSWQsIGludCBxdWFsaXR5KSB7Ci0gICAgICAgIGlmIChxdWFsaXR5IDwgUVVBTElUWV9MT1cgfHwgcXVhbGl0eSA+IFFVQUxJVFlfSElHSCkgeworICAgICAgICBpZiAoISgocXVhbGl0eSA+PSBRVUFMSVRZX0xPVyAmJiBxdWFsaXR5IDw9IFFVQUxJVFlfMTA4MFApIHx8CisgICAgICAgICAgICAgICAgKHF1YWxpdHkgPj0gUVVBTElUWV9USU1FX0xBUFNFX0xPVyAmJiBxdWFsaXR5IDw9IFFVQUxJVFlfVElNRV9MQVBTRV8xMDgwUCkpKSB7CiAgICAgICAgICAgICBTdHJpbmcgZXJyTWVzc2FnZSA9ICJVbnN1cHBvcnRlZCBxdWFsaXR5IGxldmVsOiAiICsgcXVhbGl0eTsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXJyTWVzc2FnZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRfY2FtY29yZGVyX3Byb2ZpbGUoY2FtZXJhSWQsIHF1YWxpdHkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBjYW1jb3JkZXIgcHJvZmlsZSBleGlzdHMgZm9yIHRoZSBkZWZhdWx0IGNhbWVyYSBhdAorICAgICAqIHRoZSBnaXZlbiBxdWFsaXR5IGxldmVsLgorICAgICAqIEBwYXJhbSBxdWFsaXR5IHRoZSB0YXJnZXQgcXVhbGl0eSBsZXZlbCBmb3IgdGhlIGNhbWNvcmRlciBwcm9maWxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1Byb2ZpbGUoaW50IHF1YWxpdHkpIHsKKyAgICAgICAgcmV0dXJuIGhhc1Byb2ZpbGUoYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEuQ0FNRVJBX0lEX0RFRkFVTFQsIHF1YWxpdHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBjYW1jb3JkZXIgcHJvZmlsZSBleGlzdHMgZm9yIHRoZSBnaXZlbiBjYW1lcmEgYXQKKyAgICAgKiB0aGUgZ2l2ZW4gcXVhbGl0eSBsZXZlbC4KKyAgICAgKiBAcGFyYW0gY2FtZXJhSWQgdGhlIGlkIGZvciB0aGUgY2FtZXJhCisgICAgICogQHBhcmFtIHF1YWxpdHkgdGhlIHRhcmdldCBxdWFsaXR5IGxldmVsIGZvciB0aGUgY2FtY29yZGVyIHByb2ZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUHJvZmlsZShpbnQgY2FtZXJhSWQsIGludCBxdWFsaXR5KSB7CisgICAgICAgIHJldHVybiBuYXRpdmVfaGFzX2NhbWNvcmRlcl9wcm9maWxlKGNhbWVyYUlkLCBxdWFsaXR5KTsKKyAgICB9CisKICAgICBzdGF0aWMgewogICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIm1lZGlhX2puaSIpOwogICAgICAgICBuYXRpdmVfaW5pdCgpOwpAQCAtMTc4LDQgKzI5MCw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX2luaXQoKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgZmluYWwgQ2FtY29yZGVyUHJvZmlsZSBuYXRpdmVfZ2V0X2NhbWNvcmRlcl9wcm9maWxlKAogICAgICAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgcXVhbGl0eSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGZpbmFsIGJvb2xlYW4gbmF0aXZlX2hhc19jYW1jb3JkZXJfcHJvZmlsZSgKKyAgICAgICAgICAgIGludCBjYW1lcmFJZCwgaW50IHF1YWxpdHkpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRmlsZS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRmlsZS5qYXZhCmluZGV4IDZlNTI3ZDkuLjY2YTkzZjA0IDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFGaWxlLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRmlsZS5qYXZhCkBAIC0zNCw4ICszNCw2IEBACiAgKiB7QGhpZGV9CiAgKi8KIHB1YmxpYyBjbGFzcyBNZWRpYUZpbGUgewotICAgIC8vIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGFsbCBmaWxlIGV4dGVuc2lvbnMgc3VwcG9ydGVkIGJ5IHRoZSBtZWRpYSBzY2FubmVyCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgc0ZpbGVFeHRlbnNpb25zOwogCiAgICAgLy8gQXVkaW8gZmlsZSB0eXBlcwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9NUDMgICAgID0gMTsKQEAgLTg0LDYgKzgyLDE3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX1dQTCAgICAgPSA0MzsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfUExBWUxJU1RfRklMRV9UWVBFID0gRklMRV9UWVBFX00zVTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9QTEFZTElTVF9GSUxFX1RZUEUgPSBGSUxFX1RZUEVfV1BMOworCisgICAgLy8gT3RoZXIgcG9wdWxhciBmaWxlIHR5cGVzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX1RFWFQgICAgICAgICAgPSAxMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX0hUTUwgICAgICAgICAgPSAxMDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX1BERiAgICAgICAgICAgPSAxMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX1hNTCAgICAgICAgICAgPSAxMDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX01TX1dPUkQgICAgICAgPSAxMDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX01TX0VYQ0VMICAgICAgPSAxMDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX01TX1BPV0VSUE9JTlQgPSAxMDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX0ZMQUMgICAgICAgICAgPSAxMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX1pJUCAgICAgICAgICAgPSAxMDg7CiAgICAgCiAgICAgc3RhdGljIGNsYXNzIE1lZGlhRmlsZVR5cGUgewogICAgIApAQCAtOTYsMTUgKzEwNSwzMiBAQAogICAgICAgICB9CiAgICAgfQogICAgIAotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBNZWRpYUZpbGVUeXBlPiBzRmlsZVR5cGVNYXAgCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIE1lZGlhRmlsZVR5cGU+IHNGaWxlVHlwZU1hcAogICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1lZGlhRmlsZVR5cGU+KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNNaW1lVHlwZU1hcCAKLSAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOyAgICAgICAgICAgIAorICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzTWltZVR5cGVNYXAKKyAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgIC8vIG1hcHMgZmlsZSBleHRlbnNpb24gdG8gTVRQIGZvcm1hdCBjb2RlCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNGaWxlVHlwZVRvRm9ybWF0TWFwCisgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAvLyBtYXBzIG1pbWUgdHlwZSB0byBNVFAgZm9ybWF0IGNvZGUKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gc01pbWVUeXBlVG9Gb3JtYXRNYXAKKyAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgIC8vIG1hcHMgTVRQIGZvcm1hdCBjb2RlIHRvIG1pbWUgdHlwZQorICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPiBzRm9ybWF0VG9NaW1lVHlwZU1hcAorICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7CisKICAgICBzdGF0aWMgdm9pZCBhZGRGaWxlVHlwZShTdHJpbmcgZXh0ZW5zaW9uLCBpbnQgZmlsZVR5cGUsIFN0cmluZyBtaW1lVHlwZSkgewogICAgICAgICBzRmlsZVR5cGVNYXAucHV0KGV4dGVuc2lvbiwgbmV3IE1lZGlhRmlsZVR5cGUoZmlsZVR5cGUsIG1pbWVUeXBlKSk7CiAgICAgICAgIHNNaW1lVHlwZU1hcC5wdXQobWltZVR5cGUsIEludGVnZXIudmFsdWVPZihmaWxlVHlwZSkpOwogICAgIH0KIAorICAgIHN0YXRpYyB2b2lkIGFkZEZpbGVUeXBlKFN0cmluZyBleHRlbnNpb24sIGludCBmaWxlVHlwZSwgU3RyaW5nIG1pbWVUeXBlLCBpbnQgbXRwRm9ybWF0Q29kZSkgeworICAgICAgICBhZGRGaWxlVHlwZShleHRlbnNpb24sIGZpbGVUeXBlLCBtaW1lVHlwZSk7CisgICAgICAgIHNGaWxlVHlwZVRvRm9ybWF0TWFwLnB1dChleHRlbnNpb24sIEludGVnZXIudmFsdWVPZihtdHBGb3JtYXRDb2RlKSk7CisgICAgICAgIHNNaW1lVHlwZVRvRm9ybWF0TWFwLnB1dChtaW1lVHlwZSwgSW50ZWdlci52YWx1ZU9mKG10cEZvcm1hdENvZGUpKTsKKyAgICAgICAgc0Zvcm1hdFRvTWltZVR5cGVNYXAucHV0KG10cEZvcm1hdENvZGUsIG1pbWVUeXBlKTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzV01BRW5hYmxlZCgpIHsKICAgICAgICAgTGlzdDxBdWRpb0RlY29kZXI+IGRlY29kZXJzID0gRGVjb2RlckNhcGFiaWxpdGllcy5nZXRBdWRpb0RlY29kZXJzKCk7CiAgICAgICAgIGZvciAoQXVkaW9EZWNvZGVyIGRlY29kZXI6IGRlY29kZXJzKSB7CkBAIC0xMTUsMjggKzE0MSwxOCBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1dNVkVuYWJsZWQoKSB7Ci0gICAgICAgIExpc3Q8VmlkZW9EZWNvZGVyPiBkZWNvZGVycyA9IERlY29kZXJDYXBhYmlsaXRpZXMuZ2V0VmlkZW9EZWNvZGVycygpOwotICAgICAgICBmb3IgKFZpZGVvRGVjb2RlciBkZWNvZGVyOiBkZWNvZGVycykgewotICAgICAgICAgICAgaWYgKGRlY29kZXIgPT0gVmlkZW9EZWNvZGVyLlZJREVPX0RFQ09ERVJfV01WKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQogICAgIHN0YXRpYyB7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJNUDMiLCBGSUxFX1RZUEVfTVAzLCAiYXVkaW8vbXBlZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiTTRBIiwgRklMRV9UWVBFX000QSwgImF1ZGlvL21wNCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiV0FWIiwgRklMRV9UWVBFX1dBViwgImF1ZGlvL3gtd2F2Iik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJNUDMiLCBGSUxFX1RZUEVfTVAzLCAiYXVkaW8vbXBlZyIsIE10cENvbnN0YW50cy5GT1JNQVRfTVAzKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk00QSIsIEZJTEVfVFlQRV9NNEEsICJhdWRpby9tcDQiLCBNdHBDb25zdGFudHMuRk9STUFUX01QRUcpOworICAgICAgICBhZGRGaWxlVHlwZSgiV0FWIiwgRklMRV9UWVBFX1dBViwgImF1ZGlvL3gtd2F2IiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9XQVYpOwogICAgICAgICBhZGRGaWxlVHlwZSgiQU1SIiwgRklMRV9UWVBFX0FNUiwgImF1ZGlvL2FtciIpOwogICAgICAgICBhZGRGaWxlVHlwZSgiQVdCIiwgRklMRV9UWVBFX0FXQiwgImF1ZGlvL2Ftci13YiIpOwogICAgICAgICBpZiAoaXNXTUFFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGFkZEZpbGVUeXBlKCJXTUEiLCBGSUxFX1RZUEVfV01BLCAiYXVkaW8veC1tcy13bWEiKTsKKyAgICAgICAgICAgIGFkZEZpbGVUeXBlKCJXTUEiLCBGSUxFX1RZUEVfV01BLCAiYXVkaW8veC1tcy13bWEiLCBNdHBDb25zdGFudHMuRk9STUFUX1dNQSk7CiAgICAgICAgIH0KLSAgICAgICAgYWRkRmlsZVR5cGUoIk9HRyIsIEZJTEVfVFlQRV9PR0csICJhcHBsaWNhdGlvbi9vZ2ciKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIk9HQSIsIEZJTEVfVFlQRV9PR0csICJhcHBsaWNhdGlvbi9vZ2ciKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIkFBQyIsIEZJTEVfVFlQRV9BQUMsICJhdWRpby9hYWMiKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk9HRyIsIEZJTEVfVFlQRV9PR0csICJhcHBsaWNhdGlvbi9vZ2ciLCBNdHBDb25zdGFudHMuRk9STUFUX09HRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJPR0EiLCBGSUxFX1RZUEVfT0dHLCAiYXBwbGljYXRpb24vb2dnIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9PR0cpOworICAgICAgICBhZGRGaWxlVHlwZSgiQUFDIiwgRklMRV9UWVBFX0FBQywgImF1ZGlvL2FhYyIsIE10cENvbnN0YW50cy5GT1JNQVRfQUFDKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIk1LQSIsIEZJTEVfVFlQRV9NS0EsICJhdWRpby94LW1hdHJvc2thIik7CiAgCiAgICAgICAgIGFkZEZpbGVUeXBlKCJNSUQiLCBGSUxFX1RZUEVfTUlELCAiYXVkaW8vbWlkaSIpOwpAQCAtMTQ4LDc4ICsxNjQsMTE4IEBACiAgICAgICAgIGFkZEZpbGVUeXBlKCJSVFgiLCBGSUxFX1RZUEVfTUlELCAiYXVkaW8vbWlkaSIpOwogICAgICAgICBhZGRGaWxlVHlwZSgiT1RBIiwgRklMRV9UWVBFX01JRCwgImF1ZGlvL21pZGkiKTsKICAgICAgICAgCi0gICAgICAgIGFkZEZpbGVUeXBlKCJNUEVHIiwgRklMRV9UWVBFX01QNCwgInZpZGVvL21wZWciKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIk1QNCIsIEZJTEVfVFlQRV9NUDQsICJ2aWRlby9tcDQiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIk00ViIsIEZJTEVfVFlQRV9NNFYsICJ2aWRlby9tcDQiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIjNHUCIsIEZJTEVfVFlQRV8zR1BQLCAidmlkZW8vM2dwcCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiM0dQUCIsIEZJTEVfVFlQRV8zR1BQLCAidmlkZW8vM2dwcCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiM0cyIiwgRklMRV9UWVBFXzNHUFAyLCAidmlkZW8vM2dwcDIiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIjNHUFAyIiwgRklMRV9UWVBFXzNHUFAyLCAidmlkZW8vM2dwcDIiKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk1QRUciLCBGSUxFX1RZUEVfTVA0LCAidmlkZW8vbXBlZyIsIE10cENvbnN0YW50cy5GT1JNQVRfTVBFRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJNUDQiLCBGSUxFX1RZUEVfTVA0LCAidmlkZW8vbXA0IiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9NUEVHKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk00ViIsIEZJTEVfVFlQRV9NNFYsICJ2aWRlby9tcDQiLCBNdHBDb25zdGFudHMuRk9STUFUX01QRUcpOworICAgICAgICBhZGRGaWxlVHlwZSgiM0dQIiwgRklMRV9UWVBFXzNHUFAsICJ2aWRlby8zZ3BwIiwgIE10cENvbnN0YW50cy5GT1JNQVRfM0dQX0NPTlRBSU5FUik7CisgICAgICAgIGFkZEZpbGVUeXBlKCIzR1BQIiwgRklMRV9UWVBFXzNHUFAsICJ2aWRlby8zZ3BwIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF8zR1BfQ09OVEFJTkVSKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIjNHMiIsIEZJTEVfVFlQRV8zR1BQMiwgInZpZGVvLzNncHAyIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF8zR1BfQ09OVEFJTkVSKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIjNHUFAyIiwgRklMRV9UWVBFXzNHUFAyLCAidmlkZW8vM2dwcDIiLCBNdHBDb25zdGFudHMuRk9STUFUXzNHUF9DT05UQUlORVIpOwogICAgICAgICBhZGRGaWxlVHlwZSgiTUtWIiwgRklMRV9UWVBFX01LViwgInZpZGVvL3gtbWF0cm9za2EiKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIldFQk0iLCBGSUxFX1RZUEVfTUtWLCAidmlkZW8veC1tYXRyb3NrYSIpOwogICAgICAgICBhZGRGaWxlVHlwZSgiVFMiLCBGSUxFX1RZUEVfTVAyVFMsICJ2aWRlby9tcDJ0cyIpOwogCi0gICAgICAgIGlmIChpc1dNVkVuYWJsZWQoKSkgewotICAgICAgICAgICAgYWRkRmlsZVR5cGUoIldNViIsIEZJTEVfVFlQRV9XTVYsICJ2aWRlby94LW1zLXdtdiIpOwotICAgICAgICAgICAgYWRkRmlsZVR5cGUoIkFTRiIsIEZJTEVfVFlQRV9BU0YsICJ2aWRlby94LW1zLWFzZiIpOwotICAgICAgICB9CisgICAgICAgIGFkZEZpbGVUeXBlKCJXTVYiLCBGSUxFX1RZUEVfV01WLCAidmlkZW8veC1tcy13bXYiLCBNdHBDb25zdGFudHMuRk9STUFUX1dNVik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJBU0YiLCBGSUxFX1RZUEVfQVNGLCAidmlkZW8veC1tcy1hc2YiKTsKIAotICAgICAgICBhZGRGaWxlVHlwZSgiSlBHIiwgRklMRV9UWVBFX0pQRUcsICJpbWFnZS9qcGVnIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJKUEVHIiwgRklMRV9UWVBFX0pQRUcsICJpbWFnZS9qcGVnIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJHSUYiLCBGSUxFX1RZUEVfR0lGLCAiaW1hZ2UvZ2lmIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJQTkciLCBGSUxFX1RZUEVfUE5HLCAiaW1hZ2UvcG5nIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJCTVAiLCBGSUxFX1RZUEVfQk1QLCAiaW1hZ2UveC1tcy1ibXAiKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIkpQRyIsIEZJTEVfVFlQRV9KUEVHLCAiaW1hZ2UvanBlZyIsIE10cENvbnN0YW50cy5GT1JNQVRfRVhJRl9KUEVHKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIkpQRUciLCBGSUxFX1RZUEVfSlBFRywgImltYWdlL2pwZWciLCBNdHBDb25zdGFudHMuRk9STUFUX0VYSUZfSlBFRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJHSUYiLCBGSUxFX1RZUEVfR0lGLCAiaW1hZ2UvZ2lmIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9HSUYpOworICAgICAgICBhZGRGaWxlVHlwZSgiUE5HIiwgRklMRV9UWVBFX1BORywgImltYWdlL3BuZyIsIE10cENvbnN0YW50cy5GT1JNQVRfUE5HKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIkJNUCIsIEZJTEVfVFlQRV9CTVAsICJpbWFnZS94LW1zLWJtcCIsIE10cENvbnN0YW50cy5GT1JNQVRfQk1QKTsKICAgICAgICAgYWRkRmlsZVR5cGUoIldCTVAiLCBGSUxFX1RZUEVfV0JNUCwgImltYWdlL3ZuZC53YXAud2JtcCIpOwogIAotICAgICAgICBhZGRGaWxlVHlwZSgiTTNVIiwgRklMRV9UWVBFX00zVSwgImF1ZGlvL3gtbXBlZ3VybCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiUExTIiwgRklMRV9UWVBFX1BMUywgImF1ZGlvL3gtc2NwbHMiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIldQTCIsIEZJTEVfVFlQRV9XUEwsICJhcHBsaWNhdGlvbi92bmQubXMtd3BsIik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJNM1UiLCBGSUxFX1RZUEVfTTNVLCAiYXVkaW8veC1tcGVndXJsIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9NM1VfUExBWUxJU1QpOworICAgICAgICBhZGRGaWxlVHlwZSgiUExTIiwgRklMRV9UWVBFX1BMUywgImF1ZGlvL3gtc2NwbHMiLCBNdHBDb25zdGFudHMuRk9STUFUX1BMU19QTEFZTElTVCk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJXUEwiLCBGSUxFX1RZUEVfV1BMLCAiYXBwbGljYXRpb24vdm5kLm1zLXdwbCIsIE10cENvbnN0YW50cy5GT1JNQVRfV1BMX1BMQVlMSVNUKTsKIAotICAgICAgICAvLyBjb21wdXRlIGZpbGUgZXh0ZW5zaW9ucyBsaXN0IGZvciBuYXRpdmUgTWVkaWEgU2Nhbm5lcgotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gc0ZpbGVUeXBlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIAotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnLCcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoaXRlcmF0b3IubmV4dCgpKTsKLSAgICAgICAgfSAKLSAgICAgICAgc0ZpbGVFeHRlbnNpb25zID0gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICBhZGRGaWxlVHlwZSgiVFhUIiwgRklMRV9UWVBFX1RFWFQsICJ0ZXh0L3BsYWluIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9URVhUKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIkhUTSIsIEZJTEVfVFlQRV9IVE1MLCAidGV4dC9odG1sIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9IVE1MKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIkhUTUwiLCBGSUxFX1RZUEVfSFRNTCwgInRleHQvaHRtbCIsIE10cENvbnN0YW50cy5GT1JNQVRfSFRNTCk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJQREYiLCBGSUxFX1RZUEVfUERGLCAiYXBwbGljYXRpb24vcGRmIik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJET0MiLCBGSUxFX1RZUEVfTVNfV09SRCwgImFwcGxpY2F0aW9uL21zd29yZCIsIE10cENvbnN0YW50cy5GT1JNQVRfTVNfV09SRF9ET0NVTUVOVCk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJYTFMiLCBGSUxFX1RZUEVfTVNfRVhDRUwsICJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwiLCBNdHBDb25zdGFudHMuRk9STUFUX01TX0VYQ0VMX1NQUkVBRFNIRUVUKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIlBQVCIsIEZJTEVfVFlQRV9NU19QT1dFUlBPSU5ULCAiYXBwbGljYXRpb24vbXNwb3dlcnBvaW50IiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9NU19QT1dFUlBPSU5UX1BSRVNFTlRBVElPTik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJGTEFDIiwgRklMRV9UWVBFX0ZMQUMsICJhdWRpby9mbGFjIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9GTEFDKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIlpJUCIsIEZJTEVfVFlQRV9aSVAsICJhcHBsaWNhdGlvbi96aXAiKTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdWRpb0ZpbGVUeXBlKGludCBmaWxlVHlwZSkgewogICAgICAgICByZXR1cm4gKChmaWxlVHlwZSA+PSBGSVJTVF9BVURJT19GSUxFX1RZUEUgJiYKICAgICAgICAgICAgICAgICBmaWxlVHlwZSA8PSBMQVNUX0FVRElPX0ZJTEVfVFlQRSkgfHwKICAgICAgICAgICAgICAgICAoZmlsZVR5cGUgPj0gRklSU1RfTUlESV9GSUxFX1RZUEUgJiYKICAgICAgICAgICAgICAgICBmaWxlVHlwZSA8PSBMQVNUX01JRElfRklMRV9UWVBFKSk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmlkZW9GaWxlVHlwZShpbnQgZmlsZVR5cGUpIHsKICAgICAgICAgcmV0dXJuIChmaWxlVHlwZSA+PSBGSVJTVF9WSURFT19GSUxFX1RZUEUgJiYKICAgICAgICAgICAgICAgICBmaWxlVHlwZSA8PSBMQVNUX1ZJREVPX0ZJTEVfVFlQRSk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW1hZ2VGaWxlVHlwZShpbnQgZmlsZVR5cGUpIHsKICAgICAgICAgcmV0dXJuIChmaWxlVHlwZSA+PSBGSVJTVF9JTUFHRV9GSUxFX1RZUEUgJiYKICAgICAgICAgICAgICAgICBmaWxlVHlwZSA8PSBMQVNUX0lNQUdFX0ZJTEVfVFlQRSk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGxheUxpc3RGaWxlVHlwZShpbnQgZmlsZVR5cGUpIHsKICAgICAgICAgcmV0dXJuIChmaWxlVHlwZSA+PSBGSVJTVF9QTEFZTElTVF9GSUxFX1RZUEUgJiYKICAgICAgICAgICAgICAgICBmaWxlVHlwZSA8PSBMQVNUX1BMQVlMSVNUX0ZJTEVfVFlQRSk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHN0YXRpYyBNZWRpYUZpbGVUeXBlIGdldEZpbGVUeXBlKFN0cmluZyBwYXRoKSB7CiAgICAgICAgIGludCBsYXN0RG90ID0gcGF0aC5sYXN0SW5kZXhPZigiLiIpOwogICAgICAgICBpZiAobGFzdERvdCA8IDApCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgcmV0dXJuIHNGaWxlVHlwZU1hcC5nZXQocGF0aC5zdWJzdHJpbmcobGFzdERvdCArIDEpLnRvVXBwZXJDYXNlKCkpOwogICAgIH0KLSAgICAKKworICAgIC8vIGdlbmVyYXRlcyBhIHRpdGxlIGJhc2VkIG9uIGZpbGUgbmFtZQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVUaXRsZShTdHJpbmcgcGF0aCkgeworICAgICAgICAvLyBleHRyYWN0IGZpbGUgbmFtZSBhZnRlciBsYXN0IHNsYXNoCisgICAgICAgIGludCBsYXN0U2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgIGlmIChsYXN0U2xhc2ggPj0gMCkgeworICAgICAgICAgICAgbGFzdFNsYXNoKys7CisgICAgICAgICAgICBpZiAobGFzdFNsYXNoIDwgcGF0aC5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyhsYXN0U2xhc2gpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHRydW5jYXRlIHRoZSBmaWxlIGV4dGVuc2lvbiAoaWYgYW55KQorICAgICAgICBpbnQgbGFzdERvdCA9IHBhdGgubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKGxhc3REb3QgPiAwKSB7CisgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgbGFzdERvdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RmlsZVR5cGVGb3JNaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpIHsKICAgICAgICAgSW50ZWdlciB2YWx1ZSA9IHNNaW1lVHlwZU1hcC5nZXQobWltZVR5cGUpOwogICAgICAgICByZXR1cm4gKHZhbHVlID09IG51bGwgPyAwIDogdmFsdWUuaW50VmFsdWUoKSk7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWltZVR5cGVGb3JGaWxlKFN0cmluZyBwYXRoKSB7CisgICAgICAgIE1lZGlhRmlsZVR5cGUgbWVkaWFGaWxlVHlwZSA9IGdldEZpbGVUeXBlKHBhdGgpOworICAgICAgICByZXR1cm4gKG1lZGlhRmlsZVR5cGUgPT0gbnVsbCA/IG51bGwgOiBtZWRpYUZpbGVUeXBlLm1pbWVUeXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRGb3JtYXRDb2RlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIGlmIChtaW1lVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICBJbnRlZ2VyIHZhbHVlID0gc01pbWVUeXBlVG9Gb3JtYXRNYXAuZ2V0KG1pbWVUeXBlKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmludFZhbHVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50IGxhc3REb3QgPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgICBpZiAobGFzdERvdCA+IDApIHsKKyAgICAgICAgICAgIFN0cmluZyBleHRlbnNpb24gPSBmaWxlTmFtZS5zdWJzdHJpbmcobGFzdERvdCArIDEpOworICAgICAgICAgICAgSW50ZWdlciB2YWx1ZSA9IHNGaWxlVHlwZVRvRm9ybWF0TWFwLmdldChleHRlbnNpb24pOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLkZPUk1BVF9VTkRFRklORUQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWltZVR5cGVGb3JGb3JtYXRDb2RlKGludCBmb3JtYXRDb2RlKSB7CisgICAgICAgIHJldHVybiBzRm9ybWF0VG9NaW1lVHlwZU1hcC5nZXQoZm9ybWF0Q29kZSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUmVjb3JkZXIuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyLmphdmEKaW5kZXggMzRhODZlYy4uZGQxOTQ1MCAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUmVjb3JkZXIuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFSZWNvcmRlci5qYXZhCkBAIC03Miw2ICs3Miw5IEBACiAKICAgICBwcml2YXRlIFN0cmluZyBtUGF0aDsKICAgICBwcml2YXRlIEZpbGVEZXNjcmlwdG9yIG1GZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVByZXBhcmVBdXhpbGlhcnlGaWxlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVBhdGhBdXg7CisgICAgcHJpdmF0ZSBGaWxlRGVzY3JpcHRvciBtRmRBdXg7CiAgICAgcHJpdmF0ZSBFdmVudEhhbmRsZXIgbUV2ZW50SGFuZGxlcjsKICAgICBwcml2YXRlIE9uRXJyb3JMaXN0ZW5lciBtT25FcnJvckxpc3RlbmVyOwogICAgIHByaXZhdGUgT25JbmZvTGlzdGVuZXIgbU9uSW5mb0xpc3RlbmVyOwpAQCAtMjc0LDExICsyNzcsMzcgQEAKICAgICAgICAgc2V0VmlkZW9GcmFtZVJhdGUocHJvZmlsZS52aWRlb0ZyYW1lUmF0ZSk7CiAgICAgICAgIHNldFZpZGVvU2l6ZShwcm9maWxlLnZpZGVvRnJhbWVXaWR0aCwgcHJvZmlsZS52aWRlb0ZyYW1lSGVpZ2h0KTsKICAgICAgICAgc2V0VmlkZW9FbmNvZGluZ0JpdFJhdGUocHJvZmlsZS52aWRlb0JpdFJhdGUpOwotICAgICAgICBzZXRBdWRpb0VuY29kaW5nQml0UmF0ZShwcm9maWxlLmF1ZGlvQml0UmF0ZSk7Ci0gICAgICAgIHNldEF1ZGlvQ2hhbm5lbHMocHJvZmlsZS5hdWRpb0NoYW5uZWxzKTsKLSAgICAgICAgc2V0QXVkaW9TYW1wbGluZ1JhdGUocHJvZmlsZS5hdWRpb1NhbXBsZVJhdGUpOwogICAgICAgICBzZXRWaWRlb0VuY29kZXIocHJvZmlsZS52aWRlb0NvZGVjKTsKLSAgICAgICAgc2V0QXVkaW9FbmNvZGVyKHByb2ZpbGUuYXVkaW9Db2RlYyk7CisgICAgICAgIGlmIChwcm9maWxlLnF1YWxpdHkgPj0gQ2FtY29yZGVyUHJvZmlsZS5RVUFMSVRZX1RJTUVfTEFQU0VfTE9XICYmCisgICAgICAgICAgICAgcHJvZmlsZS5xdWFsaXR5IDw9IENhbWNvcmRlclByb2ZpbGUuUVVBTElUWV9USU1FX0xBUFNFXzEwODBQKSB7CisgICAgICAgICAgICAvLyBFbmFibGUgdGltZSBsYXBzZS4gQWxzbyBkb24ndCBzZXQgYXVkaW8gZm9yIHRpbWUgbGFwc2UuCisgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoU3RyaW5nLmZvcm1hdCgidGltZS1sYXBzZS1lbmFibGU9MSIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldEF1ZGlvRW5jb2RpbmdCaXRSYXRlKHByb2ZpbGUuYXVkaW9CaXRSYXRlKTsKKyAgICAgICAgICAgIHNldEF1ZGlvQ2hhbm5lbHMocHJvZmlsZS5hdWRpb0NoYW5uZWxzKTsKKyAgICAgICAgICAgIHNldEF1ZGlvU2FtcGxpbmdSYXRlKHByb2ZpbGUuYXVkaW9TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIHNldEF1ZGlvRW5jb2Rlcihwcm9maWxlLmF1ZGlvQ29kZWMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHZpZGVvIGZyYW1lIGNhcHR1cmUgcmF0ZS4gVGhpcyBjYW4gYmUgdXNlZCB0byBzZXQgYSBkaWZmZXJlbnQgdmlkZW8gZnJhbWUgY2FwdHVyZQorICAgICAqIHJhdGUgdGhhbiB0aGUgcmVjb3JkZWQgdmlkZW8ncyBwbGF5YmFjayByYXRlLiBDdXJyZW50bHkgdGhpcyB3b3JrcyBvbmx5IGZvciB0aW1lIGxhcHNlIG1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnBzIFJhdGUgYXQgd2hpY2ggZnJhbWVzIHNob3VsZCBiZSBjYXB0dXJlZCBpbiBmcmFtZXMgcGVyIHNlY29uZC4KKyAgICAgKiBUaGUgZnBzIGNhbiBnbyBhcyBsb3cgYXMgZGVzaXJlZC4gSG93ZXZlciB0aGUgZmFzdGVzdCBmcHMgd2lsbCBiZSBsaW1pdGVkIGJ5IHRoZSBoYXJkd2FyZS4KKyAgICAgKiBGb3IgcmVzb2x1dGlvbnMgdGhhdCBjYW4gYmUgY2FwdHVyZWQgYnkgdGhlIHZpZGVvIGNhbWVyYSwgdGhlIGZhc3Rlc3QgZnBzIGNhbiBiZSBjb21wdXRlZCB1c2luZworICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYS5QYXJhbWV0ZXJzI2dldFByZXZpZXdGcHNSYW5nZShpbnRbXSl9LiBGb3IgaGlnaGVyCisgICAgICogcmVzb2x1dGlvbnMgdGhlIGZhc3Rlc3QgZnBzIG1heSBiZSBtb3JlIHJlc3RyaWN0aXZlLgorICAgICAqIE5vdGUgdGhhdCB0aGUgcmVjb3JkZXIgY2Fubm90IGd1YXJhbnRlZSB0aGF0IGZyYW1lcyB3aWxsIGJlIGNhcHR1cmVkIGF0IHRoZQorICAgICAqIGdpdmVuIHJhdGUgZHVlIHRvIGNhbWVyYS9lbmNvZGVyIGxpbWl0YXRpb25zLiBIb3dldmVyIGl0IHRyaWVzIHRvIGJlIGFzIGNsb3NlIGFzCisgICAgICogcG9zc2libGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FwdHVyZVJhdGUoZG91YmxlIGZwcykgeworICAgICAgICBkb3VibGUgdGltZUJldHdlZW5GcmFtZUNhcHR1cmUgPSAxIC8gZnBzOworICAgICAgICBpbnQgdGltZUJldHdlZW5GcmFtZUNhcHR1cmVNcyA9IChpbnQpICgxMDAwICogdGltZUJldHdlZW5GcmFtZUNhcHR1cmUpOworICAgICAgICBzZXRQYXJhbWV0ZXIoU3RyaW5nLmZvcm1hdCgidGltZS1iZXR3ZWVuLXRpbWUtbGFwc2UtZnJhbWUtY2FwdHVyZT0lZCIsCisgICAgICAgICAgICAgICAgICAgIHRpbWVCZXR3ZWVuRnJhbWVDYXB0dXJlTXMpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ0OCw2ICs0NzcsOTcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsZXZlbCBvZiB0aGUgZW5jb2Rlci4gQ2FsbCB0aGlzIGJlZm9yZSBwcmVwYXJlKCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5jb2RlckxldmVsIHRoZSB2aWRlbyBlbmNvZGVyIGxldmVsLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmlkZW9FbmNvZGVyTGV2ZWwoaW50IGVuY29kZXJMZXZlbCkgeworICAgICAgICBzZXRQYXJhbWV0ZXIoU3RyaW5nLmZvcm1hdCgidmlkZW8tcGFyYW0tZW5jb2Rlci1sZXZlbD0lZCIsIGVuY29kZXJMZXZlbCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGF1eGlsaWFyeSB0aW1lIGxhcHNlIHZpZGVvJ3MgcmVzb2x1dGlvbiBhbmQgYml0cmF0ZS4KKyAgICAgKgorICAgICAqIFRoZSBhdXhpbGlhcnkgdmlkZW8ncyByZXNvbHV0aW9uIGFuZCBiaXRyYXRlIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBDYW1jb3JkZXJQcm9maWxlCisgICAgICogcXVhbGl0eSBsZXZlbCB7QGxpbmsgYW5kcm9pZC5tZWRpYS5DYW1jb3JkZXJQcm9maWxlI1FVQUxJVFlfSElHSH0uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldEF1eFZpZGVvUGFyYW1ldGVycygpIHsKKyAgICAgICAgQ2FtY29yZGVyUHJvZmlsZSBwcm9maWxlID0gQ2FtY29yZGVyUHJvZmlsZS5nZXQoQ2FtY29yZGVyUHJvZmlsZS5RVUFMSVRZX0hJR0gpOworICAgICAgICBzZXRQYXJhbWV0ZXIoU3RyaW5nLmZvcm1hdCgidmlkZW8tYXV4LXBhcmFtLXdpZHRoPSVkIiwgcHJvZmlsZS52aWRlb0ZyYW1lV2lkdGgpKTsKKyAgICAgICAgc2V0UGFyYW1ldGVyKFN0cmluZy5mb3JtYXQoInZpZGVvLWF1eC1wYXJhbS1oZWlnaHQ9JWQiLCBwcm9maWxlLnZpZGVvRnJhbWVIZWlnaHQpKTsKKyAgICAgICAgc2V0UGFyYW1ldGVyKFN0cmluZy5mb3JtYXQoInZpZGVvLWF1eC1wYXJhbS1lbmNvZGluZy1iaXRyYXRlPSVkIiwgcHJvZmlsZS52aWRlb0JpdFJhdGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXNzIGluIHRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBhdXhpbGlhcnkgdGltZSBsYXBzZSB2aWRlby4gQ2FsbCB0aGlzIGJlZm9yZQorICAgICAqIHByZXBhcmUoKS4KKyAgICAgKgorICAgICAqIFNldHMgZmlsZSBkZXNjcmlwdG9yIGFuZCBwYXJhbWV0ZXJzIGZvciBhdXhpbGlhcnkgdGltZSBsYXBzZSB2aWRlby4gVGltZSBsYXBzZSBtb2RlCisgICAgICogY2FuIGNhcHR1cmUgdmlkZW8gKHVzaW5nIHRoZSBzdGlsbCBjYW1lcmEpIGF0IHJlc29sdXRpb25zIGhpZ2hlciB0aGFuIHRoYXQgY2FuIGJlCisgICAgICogcGxheWVkIGJhY2sgb24gdGhlIGRldmljZS4gVGhpcyBmdW5jdGlvbiBvcgorICAgICAqIHtAbGluayAjc2V0QXV4aWxpYXJ5T3V0cHV0RmlsZShTdHJpbmcpfSBlbmFibGUgY2FwdHVyZSBvZiBhIHNtYWxsZXIgdmlkZW8gaW4KKyAgICAgKiBwYXJhbGxlbCB3aXRoIHRoZSBtYWluIHRpbWUgbGFwc2UgdmlkZW8sIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHBsYXkgYmFjayBvbiB0aGUKKyAgICAgKiBkZXZpY2UuIFRoZSBzbWFsbGVyIHZpZGVvIGlzIGNyZWF0ZWQgYnkgZG93bnNhbXBsaW5nIHRoZSBtYWluIHZpZGVvLiBUaGlzIGNhbGwgaXMKKyAgICAgKiBvcHRpb25hbCBhbmQgZG9lcyBub3QgaGF2ZSB0byBiZSBjYWxsZWQgaWYgcGFyYWxsZWwgY2FwdHVyZSBvZiBhIGRvd25zYW1wbGVkIHZpZGVvCisgICAgICogaXMgbm90IGRlc2lyZWQuCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgd2hpbGUgdGhlIG1haW4gdmlkZW8gcmVzb2x1dGlvbiBhbmQgYml0cmF0ZSBpcyBkZXRlcm1pbmVkIGZyb20gdGhlCisgICAgICogQ2FtY29yZGVyUHJvZmlsZSBpbiB7QGxpbmsgI3NldFByb2ZpbGUoQ2FtY29yZGVyUHJvZmlsZSl9LCB0aGUgYXV4aWxpYXJ5IHZpZGVvJ3MKKyAgICAgKiByZXNvbHV0aW9uIGFuZCBiaXRyYXRlIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBDYW1jb3JkZXJQcm9maWxlIHF1YWxpdHkgbGV2ZWwKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5DYW1jb3JkZXJQcm9maWxlI1FVQUxJVFlfSElHSH0uIEFsbCBvdGhlciBlbmNvZGluZyBwYXJhbWV0ZXJzCisgICAgICogcmVtYWluIHRoZSBzYW1lIGZvciB0aGUgbWFpbiB2aWRlbyBhbmQgdGhlIGF1eGlsaWFyeSB2aWRlby4KKyAgICAgKgorICAgICAqIEUuZy4gaWYgdGhlIGRldmljZSBzdXBwb3J0cyB0aGUgdGltZSBsYXBzZSBwcm9maWxlIHF1YWxpdHkgbGV2ZWwKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5DYW1jb3JkZXJQcm9maWxlI1FVQUxJVFlfVElNRV9MQVBTRV8xMDgwUH0gYnV0IGNhbiBwbGF5YmFjayBhdAorICAgICAqIG1vc3QgNDgwcCwgdGhlIGFwcGxpY2F0aW9uIG1pZ2h0IHdhbnQgdG8gY2FwdHVyZSBhbiBhdXhpbGlhcnkgdmlkZW8gb2YgcmVzb2x1dGlvbgorICAgICAqIDQ4MHAgdXNpbmcgdGhpcyBjYWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGZkIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yIHRvIGJlIHdyaXR0ZW4gaW50by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXhpbGlhcnlPdXRwdXRGaWxlKEZpbGVEZXNjcmlwdG9yIGZkKQorICAgIHsKKyAgICAgICAgbVByZXBhcmVBdXhpbGlhcnlGaWxlID0gdHJ1ZTsKKyAgICAgICAgbVBhdGhBdXggPSBudWxsOworICAgICAgICBtRmRBdXggPSBmZDsKKyAgICAgICAgc2V0QXV4VmlkZW9QYXJhbWV0ZXJzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFzcyBpbiB0aGUgZmlsZSBwYXRoIGZvciB0aGUgYXV4aWxpYXJ5IHRpbWUgbGFwc2UgdmlkZW8uIENhbGwgdGhpcyBiZWZvcmUKKyAgICAgKiBwcmVwYXJlKCkuCisgICAgICoKKyAgICAgKiBTZXRzIGZpbGUgcGF0aCBhbmQgcGFyYW1ldGVycyBmb3IgYXV4aWxpYXJ5IHRpbWUgbGFwc2UgdmlkZW8uIFRpbWUgbGFwc2UgbW9kZSBjYW4KKyAgICAgKiBjYXB0dXJlIHZpZGVvICh1c2luZyB0aGUgc3RpbGwgY2FtZXJhKSBhdCByZXNvbHV0aW9ucyBoaWdoZXIgdGhhbiB0aGF0IGNhbiBiZQorICAgICAqIHBsYXllZCBiYWNrIG9uIHRoZSBkZXZpY2UuIFRoaXMgZnVuY3Rpb24gb3IKKyAgICAgKiB7QGxpbmsgI3NldEF1eGlsaWFyeU91dHB1dEZpbGUoRmlsZURlc2NyaXB0b3IpfSBlbmFibGUgY2FwdHVyZSBvZiBhIHNtYWxsZXIKKyAgICAgKiB2aWRlbyBpbiBwYXJhbGxlbCB3aXRoIHRoZSBtYWluIHRpbWUgbGFwc2UgdmlkZW8sIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHBsYXkgYmFjayBvbgorICAgICAqIHRoZSBkZXZpY2UuIFRoZSBzbWFsbGVyIHZpZGVvIGlzIGNyZWF0ZWQgYnkgZG93bnNhbXBsaW5nIHRoZSBtYWluIHZpZGVvLiBUaGlzIGNhbGwKKyAgICAgKiBpcyBvcHRpb25hbCBhbmQgZG9lcyBub3QgaGF2ZSB0byBiZSBjYWxsZWQgaWYgcGFyYWxsZWwgY2FwdHVyZSBvZiBhIGRvd25zYW1wbGVkCisgICAgICogdmlkZW8gaXMgbm90IGRlc2lyZWQuCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgd2hpbGUgdGhlIG1haW4gdmlkZW8gcmVzb2x1dGlvbiBhbmQgYml0cmF0ZSBpcyBkZXRlcm1pbmVkIGZyb20gdGhlCisgICAgICogQ2FtY29yZGVyUHJvZmlsZSBpbiB7QGxpbmsgI3NldFByb2ZpbGUoQ2FtY29yZGVyUHJvZmlsZSl9LCB0aGUgYXV4aWxpYXJ5IHZpZGVvJ3MKKyAgICAgKiByZXNvbHV0aW9uIGFuZCBiaXRyYXRlIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBDYW1jb3JkZXJQcm9maWxlIHF1YWxpdHkgbGV2ZWwKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5DYW1jb3JkZXJQcm9maWxlI1FVQUxJVFlfSElHSH0uIEFsbCBvdGhlciBlbmNvZGluZyBwYXJhbWV0ZXJzCisgICAgICogcmVtYWluIHRoZSBzYW1lIGZvciB0aGUgbWFpbiB2aWRlbyBhbmQgdGhlIGF1eGlsaWFyeSB2aWRlby4KKyAgICAgKgorICAgICAqIEUuZy4gaWYgdGhlIGRldmljZSBzdXBwb3J0cyB0aGUgdGltZSBsYXBzZSBwcm9maWxlIHF1YWxpdHkgbGV2ZWwKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5DYW1jb3JkZXJQcm9maWxlI1FVQUxJVFlfVElNRV9MQVBTRV8xMDgwUH0gYnV0IGNhbiBwbGF5YmFjayBhdAorICAgICAqIG1vc3QgNDgwcCwgdGhlIGFwcGxpY2F0aW9uIG1pZ2h0IHdhbnQgdG8gY2FwdHVyZSBhbiBhdXhpbGlhcnkgdmlkZW8gb2YgcmVzb2x1dGlvbgorICAgICAqIDQ4MHAgdXNpbmcgdGhpcyBjYWxsLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGhuYW1lIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXhpbGlhcnlPdXRwdXRGaWxlKFN0cmluZyBwYXRoKQorICAgIHsKKyAgICAgICAgbVByZXBhcmVBdXhpbGlhcnlGaWxlID0gdHJ1ZTsKKyAgICAgICAgbUZkQXV4ID0gbnVsbDsKKyAgICAgICAgbVBhdGhBdXggPSBwYXRoOworICAgICAgICBzZXRBdXhWaWRlb1BhcmFtZXRlcnMoKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBQYXNzIGluIHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGZpbGUgdG8gYmUgd3JpdHRlbi4gQ2FsbCB0aGlzIGFmdGVyCiAgICAgICogc2V0T3V0cHV0Rm9ybWF0KCkgYnV0IGJlZm9yZSBwcmVwYXJlKCkuCiAgICAgICoKQEAgLTQ3OCw2ICs1OTgsOCBAQAogICAgIC8vIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbgogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgX3NldE91dHB1dEZpbGUoRmlsZURlc2NyaXB0b3IgZmQsIGxvbmcgb2Zmc2V0LCBsb25nIGxlbmd0aCkKICAgICAgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb247CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBfc2V0T3V0cHV0RmlsZUF1eChGaWxlRGVzY3JpcHRvciBmZCkKKyAgICAgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb247CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBfcHJlcGFyZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCkBAIC01MDMsNiArNjI1LDIyIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk5vIHZhbGlkIG91dHB1dCBmaWxlIik7CiAgICAgICAgIH0KKworICAgICAgICBpZiAobVByZXBhcmVBdXhpbGlhcnlGaWxlKSB7CisgICAgICAgICAgICBpZiAobVBhdGhBdXggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obVBhdGhBdXgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIF9zZXRPdXRwdXRGaWxlQXV4KGZvcy5nZXRGRCgpKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1GZEF1eCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgX3NldE91dHB1dEZpbGVBdXgobUZkQXV4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJObyB2YWxpZCBvdXRwdXQgZmlsZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgX3ByZXBhcmUoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXIuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXIuamF2YQppbmRleCAzMzMzMjY4Li5iYzVmOWZhIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFTY2FubmVyLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lci5qYXZhCkBAIC0zNCw2ICszNCw3IEBACiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLkF1ZGlvOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5GaWxlczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuSW1hZ2VzOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5WaWRlbzsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuQXVkaW8uR2VucmVzOwpAQCAtMTA5LDQxICsxMTAsMjggQEAKIAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiTWVkaWFTY2FubmVyIjsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFVRElPX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgQXVkaW8uTWVkaWEuX0lELCAvLyAwCi0gICAgICAgICAgICBBdWRpby5NZWRpYS5EQVRBLCAvLyAxCi0gICAgICAgICAgICBBdWRpby5NZWRpYS5EQVRFX01PRElGSUVELCAvLyAyCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRklMRVNfUFJFU0NBTl9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgIEZpbGVzLkZpbGVDb2x1bW5zLl9JRCwgLy8gMAorICAgICAgICAgICAgRmlsZXMuRmlsZUNvbHVtbnMuREFUQSwgLy8gMQorICAgICAgICAgICAgRmlsZXMuRmlsZUNvbHVtbnMuRk9STUFULCAvLyAyCisgICAgICAgICAgICBGaWxlcy5GaWxlQ29sdW1ucy5EQVRFX01PRElGSUVELCAvLyAzCiAgICAgfTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9BVURJT19DT0xVTU5fSU5ERVggPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQVRIX0FVRElPX0NPTFVNTl9JTkRFWCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERBVEVfTU9ESUZJRURfQVVESU9fQ09MVU1OX0lOREVYID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRVNfUFJFU0NBTl9JRF9DT0xVTU5fSU5ERVggPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSUxFU19QUkVTQ0FOX1BBVEhfQ09MVU1OX0lOREVYID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRVNfUFJFU0NBTl9GT1JNQVRfQ09MVU1OX0lOREVYID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRVNfUFJFU0NBTl9EQVRFX01PRElGSUVEX0NPTFVNTl9JTkRFWCA9IDM7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWSURFT19QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgIFZpZGVvLk1lZGlhLl9JRCwgLy8gMAotICAgICAgICAgICAgVmlkZW8uTWVkaWEuREFUQSwgLy8gMQotICAgICAgICAgICAgVmlkZW8uTWVkaWEuREFURV9NT0RJRklFRCwgLy8gMgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE1FRElBX1BSRVNDQU5fUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICBNZWRpYVN0b3JlLk1lZGlhQ29sdW1ucy5fSUQsIC8vIDAKKyAgICAgICAgICAgIE1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLkRBVEEsIC8vIDEKKyAgICAgICAgICAgIE1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLkRBVEVfTU9ESUZJRUQsIC8vIDIKICAgICB9OwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX1ZJREVPX0NPTFVNTl9JTkRFWCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBVEhfVklERU9fQ09MVU1OX0lOREVYID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREFURV9NT0RJRklFRF9WSURFT19DT0xVTU5fSU5ERVggPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRURJQV9QUkVTQ0FOX0lEX0NPTFVNTl9JTkRFWCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FRElBX1BSRVNDQU5fUEFUSF9DT0xVTU5fSU5ERVggPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRURJQV9QUkVTQ0FOX0RBVEVfTU9ESUZJRURfQ09MVU1OX0lOREVYID0gMjsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIElNQUdFU19QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgIEltYWdlcy5NZWRpYS5fSUQsIC8vIDAKLSAgICAgICAgICAgIEltYWdlcy5NZWRpYS5EQVRBLCAvLyAxCi0gICAgICAgICAgICBJbWFnZXMuTWVkaWEuREFURV9NT0RJRklFRCwgLy8gMgotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfSU1BR0VTX0NPTFVNTl9JTkRFWCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBVEhfSU1BR0VTX0NPTFVNTl9JTkRFWCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERBVEVfTU9ESUZJRURfSU1BR0VTX0NPTFVNTl9JTkRFWCA9IDI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQTEFZTElTVFNfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICBBdWRpby5QbGF5bGlzdHMuX0lELCAvLyAwCi0gICAgICAgICAgICBBdWRpby5QbGF5bGlzdHMuREFUQSwgLy8gMQotICAgICAgICAgICAgQXVkaW8uUGxheWxpc3RzLkRBVEVfTU9ESUZJRUQsIC8vIDIKLSAgICB9OwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUExBWUxJU1RfTUVNQkVSU19QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgIEF1ZGlvLlBsYXlsaXN0cy5NZW1iZXJzLlBMQVlMSVNUX0lELCAvLyAwCkBAIC0zMDQsNyArMjkyLDkgQEAKICAgICBwcml2YXRlIFVyaSBtVGh1bWJzVXJpOwogICAgIHByaXZhdGUgVXJpIG1HZW5yZXNVcmk7CiAgICAgcHJpdmF0ZSBVcmkgbVBsYXlsaXN0c1VyaTsKKyAgICBwcml2YXRlIFVyaSBtRmlsZXNVcmk7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1Qcm9jZXNzUGxheWxpc3RzLCBtUHJvY2Vzc0dlbnJlczsKKyAgICBwcml2YXRlIGludCBtTXRwT2JqZWN0SGFuZGxlOwogCiAgICAgLy8gdXNlZCB3aGVuIHNjYW5uaW5nIHRoZSBpbWFnZSBkYXRhYmFzZSBzbyB3ZSBrbm93IHdoZXRoZXIgd2UgaGF2ZSB0byBwcnVuZQogICAgIC8vIG9sZCB0aHVtYm5haWwgZmlsZXMKQEAgLTMzOSwyMSArMzI5LDIzIEBACiAgICAgICAgIGxvbmcgbVJvd0lkOwogICAgICAgICBTdHJpbmcgbVBhdGg7CiAgICAgICAgIGxvbmcgbUxhc3RNb2RpZmllZDsKKyAgICAgICAgaW50IG1Gb3JtYXQ7CiAgICAgICAgIGJvb2xlYW4gbVNlZW5JbkZpbGVTeXN0ZW07CiAgICAgICAgIGJvb2xlYW4gbUxhc3RNb2RpZmllZENoYW5nZWQ7CiAKLSAgICAgICAgRmlsZUNhY2hlRW50cnkoVXJpIHRhYmxlVXJpLCBsb25nIHJvd0lkLCBTdHJpbmcgcGF0aCwgbG9uZyBsYXN0TW9kaWZpZWQpIHsKKyAgICAgICAgRmlsZUNhY2hlRW50cnkoVXJpIHRhYmxlVXJpLCBsb25nIHJvd0lkLCBTdHJpbmcgcGF0aCwgbG9uZyBsYXN0TW9kaWZpZWQsIGludCBmb3JtYXQpIHsKICAgICAgICAgICAgIG1UYWJsZVVyaSA9IHRhYmxlVXJpOwogICAgICAgICAgICAgbVJvd0lkID0gcm93SWQ7CiAgICAgICAgICAgICBtUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICBtTGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkOworICAgICAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKICAgICAgICAgICAgIG1TZWVuSW5GaWxlU3lzdGVtID0gZmFsc2U7CiAgICAgICAgICAgICBtTGFzdE1vZGlmaWVkQ2hhbmdlZCA9IGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBhdGg7CisgICAgICAgICAgICByZXR1cm4gbVBhdGggKyAiIG1UYWJsZVVyaTogIiArIG1UYWJsZVVyaSArICIgbVJvd0lkOiAiICsgbVJvd0lkOwogICAgICAgICB9CiAgICAgfQogCkBAIC00MzEsNiArNDIzLDkgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbU1pbWVUeXBlID0gbnVsbDsKKyAgICAgICAgICAgIG1GaWxlVHlwZSA9IDA7CisgICAgICAgICAgICBtRmlsZVNpemUgPSBmaWxlU2l6ZTsKKwogICAgICAgICAgICAgLy8gdHJ5IG1pbWVUeXBlIGZpcnN0LCBpZiBpdCBpcyBzcGVjaWZpZWQKICAgICAgICAgICAgIGlmIChtaW1lVHlwZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbUZpbGVUeXBlID0gTWVkaWFGaWxlLmdldEZpbGVUeXBlRm9yTWltZVR5cGUobWltZVR5cGUpOwpAQCAtNDM4LDcgKzQzMyw2IEBACiAgICAgICAgICAgICAgICAgICAgIG1NaW1lVHlwZSA9IG1pbWVUeXBlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1GaWxlU2l6ZSA9IGZpbGVTaXplOwogCiAgICAgICAgICAgICAvLyBpZiBtaW1lVHlwZSB3YXMgbm90IHNwZWNpZmllZCwgY29tcHV0ZSBmaWxlIHR5cGUgYmFzZWQgb24gZmlsZSBleHRlbnNpb24uCiAgICAgICAgICAgICBpZiAobU1pbWVUeXBlID09IG51bGwpIHsKQEAgLTQ1NSw3ICs0NDksMTcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEZpbGVDYWNoZUVudHJ5IGVudHJ5ID0gbUZpbGVDYWNoZS5nZXQoa2V5KTsKICAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZW50cnkgPSBuZXcgRmlsZUNhY2hlRW50cnkobnVsbCwgMCwgcGF0aCwgMCk7CisgICAgICAgICAgICAgICAgVXJpIHRhYmxlVXJpOworICAgICAgICAgICAgICAgIGlmIChNZWRpYUZpbGUuaXNWaWRlb0ZpbGVUeXBlKG1GaWxlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFibGVVcmkgPSBtVmlkZW9Vcmk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNZWRpYUZpbGUuaXNJbWFnZUZpbGVUeXBlKG1GaWxlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFibGVVcmkgPSBtSW1hZ2VzVXJpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTWVkaWFGaWxlLmlzQXVkaW9GaWxlVHlwZShtRmlsZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYmxlVXJpID0gbUF1ZGlvVXJpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRhYmxlVXJpID0gbUZpbGVzVXJpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbnRyeSA9IG5ldyBGaWxlQ2FjaGVFbnRyeSh0YWJsZVVyaSwgMCwgcGF0aCwgMCwgMCk7CiAgICAgICAgICAgICAgICAgbUZpbGVDYWNoZS5wdXQoa2V5LCBlbnRyeSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbnRyeS5tU2VlbkluRmlsZVN5c3RlbSA9IHRydWU7CkBAIC01MDAsNyArNTA0LDggQEAKICAgICAgICAgICAgIGRvU2NhbkZpbGUocGF0aCwgbWltZVR5cGUsIGxhc3RNb2RpZmllZCwgZmlsZVNpemUsIGZhbHNlKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBVcmkgZG9TY2FuRmlsZShTdHJpbmcgcGF0aCwgU3RyaW5nIG1pbWVUeXBlLCBsb25nIGxhc3RNb2RpZmllZCwgbG9uZyBmaWxlU2l6ZSwgYm9vbGVhbiBzY2FuQWx3YXlzKSB7CisgICAgICAgIHB1YmxpYyBVcmkgZG9TY2FuRmlsZShTdHJpbmcgcGF0aCwgU3RyaW5nIG1pbWVUeXBlLCBsb25nIGxhc3RNb2RpZmllZCwKKyAgICAgICAgICAgICAgICBsb25nIGZpbGVTaXplLCBib29sZWFuIHNjYW5BbHdheXMpIHsKICAgICAgICAgICAgIFVyaSByZXN1bHQgPSBudWxsOwogLy8gICAgICAgICAgICBsb25nIHQxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgICAgICB0cnkgewpAQCAtNTE1LDcgKzUyMCw5IEBACiAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbXVzaWMgPSAobG93cGF0aC5pbmRleE9mKE1VU0lDX0RJUikgPiAwKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgKCFyaW5ndG9uZXMgJiYgIW5vdGlmaWNhdGlvbnMgJiYgIWFsYXJtcyAmJiAhcG9kY2FzdHMpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICghTWVkaWFGaWxlLmlzSW1hZ2VGaWxlVHlwZShtRmlsZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgZXh0cmFjdCBtZXRhZGF0YSBmb3IgYXVkaW8gYW5kIHZpZGVvIGZpbGVzCisgICAgICAgICAgICAgICAgICAgIGlmIChNZWRpYUZpbGUuaXNBdWRpb0ZpbGVUeXBlKG1GaWxlVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBNZWRpYUZpbGUuaXNWaWRlb0ZpbGVUeXBlKG1GaWxlVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NGaWxlKHBhdGgsIG1pbWVUeXBlLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC01NTUsNyArNTYyLDggQEAKICAgICAgICAgICAgICAgICBtVGl0bGUgPSB2YWx1ZTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJhcnRpc3QiKSB8fCBuYW1lLnN0YXJ0c1dpdGgoImFydGlzdDsiKSkgewogICAgICAgICAgICAgICAgIG1BcnRpc3QgPSB2YWx1ZS50cmltKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYWxidW1hcnRpc3QiKSB8fCBuYW1lLnN0YXJ0c1dpdGgoImFsYnVtYXJ0aXN0OyIpKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYWxidW1hcnRpc3QiKSB8fCBuYW1lLnN0YXJ0c1dpdGgoImFsYnVtYXJ0aXN0OyIpCisgICAgICAgICAgICAgICAgICAgIHx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYmFuZCIpIHx8IG5hbWUuc3RhcnRzV2l0aCgiYmFuZDsiKSkgewogICAgICAgICAgICAgICAgIG1BbGJ1bUFydGlzdCA9IHZhbHVlLnRyaW0oKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJhbGJ1bSIpIHx8IG5hbWUuc3RhcnRzV2l0aCgiYWxidW07IikpIHsKICAgICAgICAgICAgICAgICBtQWxidW0gPSB2YWx1ZS50cmltKCk7CkBAIC02NTQsMjEgKzY2Miw2IEBACiAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbGFybXMsIGJvb2xlYW4gbXVzaWMsIGJvb2xlYW4gcG9kY2FzdHMpCiAgICAgICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAvLyB1cGRhdGUgZGF0YWJhc2UKLSAgICAgICAgICAgIFVyaSB0YWJsZVVyaTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNBdWRpbyA9IE1lZGlhRmlsZS5pc0F1ZGlvRmlsZVR5cGUobUZpbGVUeXBlKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNWaWRlbyA9IE1lZGlhRmlsZS5pc1ZpZGVvRmlsZVR5cGUobUZpbGVUeXBlKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNJbWFnZSA9IE1lZGlhRmlsZS5pc0ltYWdlRmlsZVR5cGUobUZpbGVUeXBlKTsKLSAgICAgICAgICAgIGlmIChpc1ZpZGVvKSB7Ci0gICAgICAgICAgICAgICAgdGFibGVVcmkgPSBtVmlkZW9Vcmk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzSW1hZ2UpIHsKLSAgICAgICAgICAgICAgICB0YWJsZVVyaSA9IG1JbWFnZXNVcmk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzQXVkaW8pIHsKLSAgICAgICAgICAgICAgICB0YWJsZVVyaSA9IG1BdWRpb1VyaTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZG9uJ3QgYWRkIGZpbGUgdG8gZGF0YWJhc2UgaWYgbm90IGF1ZGlvLCB2aWRlbyBvciBpbWFnZQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW50cnkubVRhYmxlVXJpID0gdGFibGVVcmk7CiAKICAgICAgICAgICAgICAvLyB1c2UgYWxidW0gYXJ0aXN0IGlmIGFydGlzdCBpcyBtaXNzaW5nCiAgICAgICAgICAgICBpZiAobUFydGlzdCA9PSBudWxsIHx8IG1BcnRpc3QubGVuZ3RoKCkgPT0gMCkgewpAQCAtNjc4LDIwICs2NzEsNyBAQAogICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSB0b1ZhbHVlcygpOwogICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gdmFsdWVzLmdldEFzU3RyaW5nKE1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLlRJVExFKTsKICAgICAgICAgICAgIGlmICh0aXRsZSA9PSBudWxsIHx8IFRleHRVdGlscy5pc0VtcHR5KHRpdGxlLnRyaW0oKSkpIHsKLSAgICAgICAgICAgICAgICB0aXRsZSA9IHZhbHVlcy5nZXRBc1N0cmluZyhNZWRpYVN0b3JlLk1lZGlhQ29sdW1ucy5EQVRBKTsKLSAgICAgICAgICAgICAgICAvLyBleHRyYWN0IGZpbGUgbmFtZSBhZnRlciBsYXN0IHNsYXNoCi0gICAgICAgICAgICAgICAgaW50IGxhc3RTbGFzaCA9IHRpdGxlLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3RTbGFzaCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RTbGFzaCsrOwotICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNsYXNoIDwgdGl0bGUubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUuc3Vic3RyaW5nKGxhc3RTbGFzaCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGhlIGZpbGUgZXh0ZW5zaW9uIChpZiBhbnkpCi0gICAgICAgICAgICAgICAgaW50IGxhc3REb3QgPSB0aXRsZS5sYXN0SW5kZXhPZignLicpOwotICAgICAgICAgICAgICAgIGlmIChsYXN0RG90ID4gMCkgewotICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnN1YnN0cmluZygwLCBsYXN0RG90KTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGl0bGUgPSBNZWRpYUZpbGUuZ2V0RmlsZVRpdGxlKHZhbHVlcy5nZXRBc1N0cmluZyhNZWRpYVN0b3JlLk1lZGlhQ29sdW1ucy5EQVRBKSk7CiAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChNZWRpYVN0b3JlLk1lZGlhQ29sdW1ucy5USVRMRSwgdGl0bGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgU3RyaW5nIGFsYnVtID0gdmFsdWVzLmdldEFzU3RyaW5nKEF1ZGlvLk1lZGlhLkFMQlVNKTsKQEAgLTcxNSw3ICs2OTUsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxvbmcgcm93SWQgPSBlbnRyeS5tUm93SWQ7Ci0gICAgICAgICAgICBpZiAoaXNBdWRpbyAmJiByb3dJZCA9PSAwKSB7CisgICAgICAgICAgICBpZiAoTWVkaWFGaWxlLmlzQXVkaW9GaWxlVHlwZShtRmlsZVR5cGUpICYmIChyb3dJZCA9PSAwIHx8IG1NdHBPYmplY3RIYW5kbGUgIT0gMCkpIHsKICAgICAgICAgICAgICAgICAvLyBPbmx5IHNldCB0aGVzZSBmb3IgbmV3IGVudHJpZXMuIEZvciBleGlzdGluZyBlbnRyaWVzLCB0aGV5CiAgICAgICAgICAgICAgICAgLy8gbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBsYXRlciwgYW5kIHdlIHdhbnQgdG8ga2VlcCB0aGUgY3VycmVudAogICAgICAgICAgICAgICAgIC8vIHZhbHVlcyBzbyB0aGF0IGN1c3RvbSByaW5ndG9uZXMgc3RpbGwgc2hvdyB1cCBpbiB0aGUgcmluZ3RvbmUKQEAgLTc2OCw4ICs3NDgsMTUgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIFVyaSB0YWJsZVVyaSA9IGVudHJ5Lm1UYWJsZVVyaTsKICAgICAgICAgICAgIFVyaSByZXN1bHQgPSBudWxsOwogICAgICAgICAgICAgaWYgKHJvd0lkID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobU10cE9iamVjdEhhbmRsZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuTUVESUFfU0NBTk5FUl9ORVdfT0JKRUNUX0lELCBtTXRwT2JqZWN0SGFuZGxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHRhYmxlVXJpID09IG1GaWxlc1VyaSkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEZpbGVzLkZpbGVDb2x1bW5zLkZPUk1BVCwgTWVkaWFGaWxlLmdldEZvcm1hdENvZGUoZW50cnkubVBhdGgsIG1NaW1lVHlwZSkpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBuZXcgZmlsZSwgaW5zZXJ0IGl0CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbU1lZGlhUHJvdmlkZXIuaW5zZXJ0KHRhYmxlVXJpLCB2YWx1ZXMpOwogICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewpAQCAtODg1LDcgKzg3Miw3IEBACiAKICAgICB9OyAvLyBlbmQgb2YgYW5vbnltb3VzIE1lZGlhU2Nhbm5lckNsaWVudCBpbnN0YW5jZQogCi0gICAgcHJpdmF0ZSB2b2lkIHByZXNjYW4oU3RyaW5nIGZpbGVQYXRoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHZvaWQgcHJlc2NhbihTdHJpbmcgZmlsZVBhdGgsIGJvb2xlYW4gcHJlc2NhbkZpbGVzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgQ3Vyc29yIGMgPSBudWxsOwogICAgICAgICBTdHJpbmcgd2hlcmUgPSBudWxsOwogICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzID0gbnVsbDsKQEAgLTkwMSwxMzggKzg4OCw0MyBAQAogICAgICAgICAgICAgbVBsYXlMaXN0cy5jbGVhcigpOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGZpbGVQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHF1ZXJ5IGZvciBvbmx5IG9uZSBmaWxlCisgICAgICAgICAgICB3aGVyZSA9IEZpbGVzLkZpbGVDb2x1bW5zLkRBVEEgKyAiPT8iOworICAgICAgICAgICAgc2VsZWN0aW9uQXJncyA9IG5ldyBTdHJpbmdbXSB7IGZpbGVQYXRoIH07CisgICAgICAgIH0KKwogICAgICAgICAvLyBCdWlsZCB0aGUgbGlzdCBvZiBmaWxlcyBmcm9tIHRoZSBjb250ZW50IHByb3ZpZGVyCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBSZWFkIGV4aXN0aW5nIGZpbGVzIGZyb20gdGhlIGF1ZGlvIHRhYmxlCi0gICAgICAgICAgICBpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdoZXJlID0gTWVkaWFTdG9yZS5BdWRpby5NZWRpYS5EQVRBICsgIj0/IjsKLSAgICAgICAgICAgICAgICBzZWxlY3Rpb25BcmdzID0gbmV3IFN0cmluZ1tdIHsgZmlsZVBhdGggfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtQXVkaW9VcmksIEFVRElPX1BST0pFQ1RJT04sIHdoZXJlLCBzZWxlY3Rpb25BcmdzLCBudWxsKTsKKyAgICAgICAgICAgIGlmIChwcmVzY2FuRmlsZXMpIHsKKyAgICAgICAgICAgICAgICAvLyBGaXJzdCByZWFkIGV4aXN0aW5nIGZpbGVzIGZyb20gdGhlIGZpbGVzIHRhYmxlCiAKLSAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcm93SWQgPSBjLmdldExvbmcoSURfQVVESU9fQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gYy5nZXRTdHJpbmcoUEFUSF9BVURJT19DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSBjLmdldExvbmcoREFURV9NT0RJRklFRF9BVURJT19DT0xVTU5fSU5ERVgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGNvbnNpZGVyIGVudHJpZXMgd2l0aCBhYnNvbHV0ZSBwYXRoIG5hbWVzLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3Mgc3RvcmluZyBVUklzIGluIHRoZSBkYXRhYmFzZSB3aXRob3V0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVkaWEgc2Nhbm5lciByZW1vdmluZyB0aGVtLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IHBhdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DYXNlSW5zZW5zaXRpdmVQYXRocykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBwYXRoLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaWxlQ2FjaGUucHV0KGtleSwgbmV3IEZpbGVDYWNoZUVudHJ5KG1BdWRpb1VyaSwgcm93SWQsIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZWFkIGV4aXN0aW5nIGZpbGVzIGZyb20gdGhlIHZpZGVvIHRhYmxlCi0gICAgICAgICAgICBpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdoZXJlID0gTWVkaWFTdG9yZS5WaWRlby5NZWRpYS5EQVRBICsgIj0/IjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgd2hlcmUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1WaWRlb1VyaSwgVklERU9fUFJPSkVDVElPTiwgd2hlcmUsIHNlbGVjdGlvbkFyZ3MsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb25nIHJvd0lkID0gYy5nZXRMb25nKElEX1ZJREVPX0NPTFVNTl9JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGMuZ2V0U3RyaW5nKFBBVEhfVklERU9fQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gYy5nZXRMb25nKERBVEVfTU9ESUZJRURfVklERU9fQ09MVU1OX0lOREVYKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjb25zaWRlciBlbnRyaWVzIHdpdGggYWJzb2x1dGUgcGF0aCBuYW1lcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHN0b3JpbmcgVVJJcyBpbiB0aGUgZGF0YWJhc2Ugd2l0aG91dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lZGlhIHNjYW5uZXIgcmVtb3ZpbmcgdGhlbS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBwYXRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2FzZUluc2Vuc2l0aXZlUGF0aHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcGF0aC50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlsZUNhY2hlLnB1dChrZXksIG5ldyBGaWxlQ2FjaGVFbnRyeShtVmlkZW9VcmksIHJvd0lkLCBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBjLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGMgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmVhZCBleGlzdGluZyBmaWxlcyBmcm9tIHRoZSBpbWFnZXMgdGFibGUKLSAgICAgICAgICAgIGlmIChmaWxlUGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd2hlcmUgPSBNZWRpYVN0b3JlLkltYWdlcy5NZWRpYS5EQVRBICsgIj0/IjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgd2hlcmUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU9yaWdpbmFsQ291bnQgPSAwOwotICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1JbWFnZXNVcmksIElNQUdFU19QUk9KRUNUSU9OLCB3aGVyZSwgc2VsZWN0aW9uQXJncywgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtT3JpZ2luYWxDb3VudCA9IGMuZ2V0Q291bnQoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb25nIHJvd0lkID0gYy5nZXRMb25nKElEX0lNQUdFU19DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjLmdldFN0cmluZyhQQVRIX0lNQUdFU19DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IGMuZ2V0TG9uZyhEQVRFX01PRElGSUVEX0lNQUdFU19DT0xVTU5fSU5ERVgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgY29uc2lkZXIgZW50cmllcyB3aXRoIGFic29sdXRlIHBhdGggbmFtZXMuCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHN0b3JpbmcgVVJJcyBpbiB0aGUgZGF0YWJhc2Ugd2l0aG91dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVkaWEgc2Nhbm5lciByZW1vdmluZyB0aGVtLgotICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBwYXRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DYXNlSW5zZW5zaXRpdmVQYXRocykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHBhdGgudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaWxlQ2FjaGUucHV0KGtleSwgbmV3IEZpbGVDYWNoZUVudHJ5KG1JbWFnZXNVcmksIHJvd0lkLCBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgYy5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICBjID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtUHJvY2Vzc1BsYXlsaXN0cykgewotICAgICAgICAgICAgICAgIC8vIFJlYWQgZXhpc3RpbmcgZmlsZXMgZnJvbSB0aGUgcGxheWxpc3RzIHRhYmxlCi0gICAgICAgICAgICAgICAgaWYgKGZpbGVQYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgd2hlcmUgPSBNZWRpYVN0b3JlLkF1ZGlvLlBsYXlsaXN0cy5EQVRBICsgIj0/IjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB3aGVyZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtUGxheWxpc3RzVXJpLCBQTEFZTElTVFNfUFJPSkVDVElPTiwgd2hlcmUsIHNlbGVjdGlvbkFyZ3MsIG51bGwpOworICAgICAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtRmlsZXNVcmksIEZJTEVTX1BSRVNDQU5fUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBzZWxlY3Rpb25BcmdzLCBudWxsKTsKIAogICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gYy5nZXRTdHJpbmcoUEFUSF9QTEFZTElTVFNfQ09MVU1OX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHJvd0lkID0gYy5nZXRMb25nKEZJTEVTX1BSRVNDQU5fSURfQ09MVU1OX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gYy5nZXRTdHJpbmcoRklMRVNfUFJFU0NBTl9QQVRIX0NPTFVNTl9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0ID0gYy5nZXRJbnQoRklMRVNfUFJFU0NBTl9GT1JNQVRfQ09MVU1OX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gYy5nZXRMb25nKEZJTEVTX1BSRVNDQU5fREFURV9NT0RJRklFRF9DT0xVTU5fSU5ERVgpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHJvd0lkID0gYy5nZXRMb25nKElEX1BMQVlMSVNUU19DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IGMuZ2V0TG9uZyhEQVRFX01PRElGSUVEX1BMQVlMSVNUU19DT0xVTU5fSU5ERVgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBwYXRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNhc2VJbnNlbnNpdGl2ZVBhdGhzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBwYXRoLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpbGVDYWNoZS5wdXQoa2V5LCBuZXcgRmlsZUNhY2hlRW50cnkobVBsYXlsaXN0c1VyaSwgcm93SWQsIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGNvbnNpZGVyIGVudHJpZXMgd2l0aCBhYnNvbHV0ZSBwYXRoIG5hbWVzLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3Mgc3RvcmluZyBVUklzIGluIHRoZSBkYXRhYmFzZSB3aXRob3V0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVkaWEgc2Nhbm5lciByZW1vdmluZyB0aGVtLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DYXNlSW5zZW5zaXRpdmVQYXRocykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBwYXRoLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUNhY2hlRW50cnkgZW50cnkgPSBuZXcgRmlsZUNhY2hlRW50cnkobUZpbGVzVXJpLCByb3dJZCwgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlsZUNhY2hlLnB1dChrZXksIGVudHJ5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYyA9IG51bGw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMTA3LDEyICs5OTksMTQgQEAKICAgICAgICAgICAgIC8vIHJlbW92ZSBkYXRhYmFzZSBlbnRyaWVzIGZvciBmaWxlcyB0aGF0IG5vIGxvbmdlciBleGlzdC4KICAgICAgICAgICAgIGJvb2xlYW4gZmlsZU1pc3NpbmcgPSBmYWxzZTsKIAotICAgICAgICAgICAgaWYgKCFlbnRyeS5tU2VlbkluRmlsZVN5c3RlbSkgewotICAgICAgICAgICAgICAgIGlmIChpblNjYW5EaXJlY3RvcnkocGF0aCwgZGlyZWN0b3JpZXMpKSB7CisgICAgICAgICAgICBpZiAoIWVudHJ5Lm1TZWVuSW5GaWxlU3lzdGVtICYmICFNdHBDb25zdGFudHMuaXNBYnN0cmFjdE9iamVjdChlbnRyeS5tRm9ybWF0KSkgeworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5tRm9ybWF0ICE9IE10cENvbnN0YW50cy5GT1JNQVRfQVNTT0NJQVRJT04gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGluU2NhbkRpcmVjdG9yeShwYXRoLCBkaXJlY3RvcmllcykpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZGlkbid0IHNlZSB0aGlzIGZpbGUgaW4gdGhlIHNjYW4gZGlyZWN0b3J5LgogICAgICAgICAgICAgICAgICAgICBmaWxlTWlzc2luZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZpbGUgaXMgb3V0c2lkZSBvZiBvdXIgc2NhbiBkaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaWxlIGFjdHVhbGx5IGEgZGlyZWN0b3J5IG9yIG90aGVyIGFic3RyYWN0IG9iamVjdAorICAgICAgICAgICAgICAgICAgICAvLyBvciBpcyBvdXRzaWRlIG9mIG91ciBzY2FuIGRpcmVjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBjaGVjayBmb3IgZmlsZSBleGlzdGVuY2UgaGVyZS4KICAgICAgICAgICAgICAgICAgICAgRmlsZSB0ZXN0RmlsZSA9IG5ldyBGaWxlKHBhdGgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIXRlc3RGaWxlLmV4aXN0cygpKSB7CkBAIC0xMTMyLDkgKzEwMjYsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KE1lZGlhU3RvcmUuQXVkaW8uUGxheWxpc3RzLkRBVEEsICIiKTsKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChNZWRpYVN0b3JlLkF1ZGlvLlBsYXlsaXN0cy5EQVRFX01PRElGSUVELCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhUHJvdmlkZXIudXBkYXRlKENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKG1QbGF5bGlzdHNVcmksIGVudHJ5Lm1Sb3dJZCksIHZhbHVlcywgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIG1NZWRpYVByb3ZpZGVyLnVwZGF0ZShDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChtUGxheWxpc3RzVXJpLCBlbnRyeS5tUm93SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhUHJvdmlkZXIuZGVsZXRlKENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKGVudHJ5Lm1UYWJsZVVyaSwgZW50cnkubVJvd0lkKSwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIG1NZWRpYVByb3ZpZGVyLmRlbGV0ZShDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChtRmlsZXNVcmksIGVudHJ5Lm1Sb3dJZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTExNjIsNiArMTA1OCw3IEBACiAgICAgICAgIG1WaWRlb1VyaSA9IFZpZGVvLk1lZGlhLmdldENvbnRlbnRVcmkodm9sdW1lTmFtZSk7CiAgICAgICAgIG1JbWFnZXNVcmkgPSBJbWFnZXMuTWVkaWEuZ2V0Q29udGVudFVyaSh2b2x1bWVOYW1lKTsKICAgICAgICAgbVRodW1ic1VyaSA9IEltYWdlcy5UaHVtYm5haWxzLmdldENvbnRlbnRVcmkodm9sdW1lTmFtZSk7CisgICAgICAgIG1GaWxlc1VyaSA9IEZpbGVzLmdldENvbnRlbnRVcmkodm9sdW1lTmFtZSk7CiAKICAgICAgICAgaWYgKCF2b2x1bWVOYW1lLmVxdWFscygiaW50ZXJuYWwiKSkgewogICAgICAgICAgICAgLy8gd2Ugb25seSBzdXBwb3J0IHBsYXlsaXN0cyBvbiBleHRlcm5hbCBtZWRpYQpAQCAtMTE3MCw5ICsxMDY3LDEyIEBACiAgICAgICAgICAgICBtR2VucmVDYWNoZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgVXJpPigpOwogICAgICAgICAgICAgbUdlbnJlc1VyaSA9IEdlbnJlcy5nZXRDb250ZW50VXJpKHZvbHVtZU5hbWUpOwogICAgICAgICAgICAgbVBsYXlsaXN0c1VyaSA9IFBsYXlsaXN0cy5nZXRDb250ZW50VXJpKHZvbHVtZU5hbWUpOwotICAgICAgICAgICAgLy8gYXNzdW1pbmcgZXh0ZXJuYWwgc3RvcmFnZSBpcyBGQVQgKGNhc2UgaW5zZW5zaXRpdmUpLCBleGNlcHQgb24gdGhlIHNpbXVsYXRvci4KLSAgICAgICAgICAgIGlmICggUHJvY2Vzcy5zdXBwb3J0c1Byb2Nlc3NlcygpKSB7Ci0gICAgICAgICAgICAgICAgbUNhc2VJbnNlbnNpdGl2ZVBhdGhzID0gdHJ1ZTsKKworICAgICAgICAgICAgbUNhc2VJbnNlbnNpdGl2ZVBhdGhzID0gIW1Db250ZXh0LmdldFJlc291cmNlcygpLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5ib29sLmNvbmZpZ19jYXNlU2Vuc2l0aXZlRXh0ZXJuYWxTdG9yYWdlKTsKKyAgICAgICAgICAgIGlmICghUHJvY2Vzcy5zdXBwb3J0c1Byb2Nlc3NlcygpKSB7CisgICAgICAgICAgICAgICAgLy8gU2ltdWxhdG9yIHVzZXMgaG9zdCBmaWxlIHN5c3RlbSwgc28gaXQgc2hvdWxkIGJlIGNhc2Ugc2Vuc2l0aXZlLgorICAgICAgICAgICAgICAgIG1DYXNlSW5zZW5zaXRpdmVQYXRocyA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTE4MSwxMSArMTA4MSwxMSBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICAgICAgaW5pdGlhbGl6ZSh2b2x1bWVOYW1lKTsKLSAgICAgICAgICAgIHByZXNjYW4obnVsbCk7CisgICAgICAgICAgICBwcmVzY2FuKG51bGwsIHRydWUpOwogICAgICAgICAgICAgbG9uZyBwcmVzY2FuID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlyZWN0b3JpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRGlyZWN0b3J5KGRpcmVjdG9yaWVzW2ldLCBNZWRpYUZpbGUuc0ZpbGVFeHRlbnNpb25zLCBtQ2xpZW50KTsKKyAgICAgICAgICAgICAgICBwcm9jZXNzRGlyZWN0b3J5KGRpcmVjdG9yaWVzW2ldLCBtQ2xpZW50KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxvbmcgc2NhbiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICAgICAgcG9zdHNjYW4oZGlyZWN0b3JpZXMpOwpAQCAtMTIxMiw3ICsxMTEyLDcgQEAKICAgICBwdWJsaWMgVXJpIHNjYW5TaW5nbGVGaWxlKFN0cmluZyBwYXRoLCBTdHJpbmcgdm9sdW1lTmFtZSwgU3RyaW5nIG1pbWVUeXBlKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpbml0aWFsaXplKHZvbHVtZU5hbWUpOwotICAgICAgICAgICAgcHJlc2NhbihwYXRoKTsKKyAgICAgICAgICAgIHByZXNjYW4ocGF0aCwgdHJ1ZSk7CiAKICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgpOwogCkBAIC0xMjI3LDYgKzExMjcsMzYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNjYW5NdHBGaWxlKFN0cmluZyBwYXRoLCBTdHJpbmcgdm9sdW1lTmFtZSwgaW50IG9iamVjdEhhbmRsZSwgaW50IGZvcm1hdCkgeworICAgICAgICBNZWRpYUZpbGUuTWVkaWFGaWxlVHlwZSBtZWRpYUZpbGVUeXBlID0gTWVkaWFGaWxlLmdldEZpbGVUeXBlKHBhdGgpOworICAgICAgICBpbnQgZmlsZVR5cGUgPSAobWVkaWFGaWxlVHlwZSA9PSBudWxsID8gMCA6IG1lZGlhRmlsZVR5cGUuZmlsZVR5cGUpOworCisgICAgICAgIGlmICghTWVkaWFGaWxlLmlzQXVkaW9GaWxlVHlwZShmaWxlVHlwZSkgJiYgIU1lZGlhRmlsZS5pc1ZpZGVvRmlsZVR5cGUoZmlsZVR5cGUpICYmCisgICAgICAgICAgICAhTWVkaWFGaWxlLmlzSW1hZ2VGaWxlVHlwZShmaWxlVHlwZSkgJiYgIU1lZGlhRmlsZS5pc1BsYXlMaXN0RmlsZVR5cGUoZmlsZVR5cGUpKSB7CisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtTXRwT2JqZWN0SGFuZGxlID0gb2JqZWN0SGFuZGxlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5pdGlhbGl6ZSh2b2x1bWVOYW1lKTsKKyAgICAgICAgICAgIC8vIE1UUCB3aWxsIGNyZWF0ZSBhIGZpbGUgZW50cnkgZm9yIHVzIHNvIHdlIGRvbid0IHdhbnQgdG8gZG8gaXQgaW4gcHJlc2NhbgorICAgICAgICAgICAgcHJlc2NhbihwYXRoLCBmYWxzZSk7CisKKyAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgpOworCisgICAgICAgICAgICAvLyBsYXN0TW9kaWZpZWQgaXMgaW4gbWlsbGlzZWNvbmRzIG9uIEZpbGVzLgorICAgICAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWRTZWNvbmRzID0gZmlsZS5sYXN0TW9kaWZpZWQoKSAvIDEwMDA7CisKKyAgICAgICAgICAgIC8vIGFsd2F5cyBzY2FuIHRoZSBmaWxlLCBzbyB3ZSBjYW4gcmV0dXJuIHRoZSBjb250ZW50Oi8vbWVkaWEgVXJpIGZvciBleGlzdGluZyBmaWxlcworICAgICAgICAgICAgbUNsaWVudC5kb1NjYW5GaWxlKHBhdGgsIG1lZGlhRmlsZVR5cGUubWltZVR5cGUsIGxhc3RNb2RpZmllZFNlY29uZHMsIGZpbGUubGVuZ3RoKCksIHRydWUpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIE1lZGlhU2Nhbm5lci5zY2FuRmlsZSgpIiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtTXRwT2JqZWN0SGFuZGxlID0gMDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIHJldHVybnMgdGhlIG51bWJlciBvZiBtYXRjaGluZyBmaWxlL2RpcmVjdG9yeSBuYW1lcywgc3RhcnRpbmcgZnJvbSB0aGUgcmlnaHQKICAgICBwcml2YXRlIGludCBtYXRjaFBhdGhzKFN0cmluZyBwYXRoMSwgU3RyaW5nIHBhdGgyKSB7CiAgICAgICAgIGludCByZXN1bHQgPSAwOwpAQCAtMTUwNiw3ICsxNDM2LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgcHJvY2Vzc0RpcmVjdG9yeShTdHJpbmcgcGF0aCwgU3RyaW5nIGV4dGVuc2lvbnMsIE1lZGlhU2Nhbm5lckNsaWVudCBjbGllbnQpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgcHJvY2Vzc0RpcmVjdG9yeShTdHJpbmcgcGF0aCwgTWVkaWFTY2FubmVyQ2xpZW50IGNsaWVudCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBwcm9jZXNzRmlsZShTdHJpbmcgcGF0aCwgU3RyaW5nIG1pbWVUeXBlLCBNZWRpYVNjYW5uZXJDbGllbnQgY2xpZW50KTsKICAgICBwdWJsaWMgbmF0aXZlIHZvaWQgc2V0TG9jYWxlKFN0cmluZyBsb2NhbGUpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ2xpZW50LmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThkYTFmNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3B1YmxpYyBjbGFzcyBNdHBDbGllbnQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNdHBDbGllbnQiOworCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0ZW5lciBtTGlzdGVuZXI7CisKKyAgICBzdGF0aWMgeworICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIm1lZGlhX2puaSIpOworICAgIH0KKworICAgIHB1YmxpYyBNdHBDbGllbnQoTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbmF0aXZlX3NldHVwKCk7CisgICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIk10cENsaWVudDogbGlzdGVuZXIgaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuYXRpdmVfZmluYWxpemUoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzdGFydCgpIHsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV9zdGFydCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIG5hdGl2ZV9zdG9wKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZGVsZXRlT2JqZWN0KGludCBkZXZpY2VJRCwgbG9uZyBvYmplY3RJRCkgeworICAgICAgICByZXR1cm4gbmF0aXZlX2RlbGV0ZV9vYmplY3QoZGV2aWNlSUQsIG9iamVjdElEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRQYXJlbnQoaW50IGRldmljZUlELCBsb25nIG9iamVjdElEKSB7CisgICAgICAgIHJldHVybiBuYXRpdmVfZ2V0X3BhcmVudChkZXZpY2VJRCwgb2JqZWN0SUQpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFN0b3JhZ2VJRChpbnQgZGV2aWNlSUQsIGxvbmcgb2JqZWN0SUQpIHsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRfc3RvcmFnZV9pZChkZXZpY2VJRCwgb2JqZWN0SUQpOworICAgIH0KKworICAgIC8vIGNyZWF0ZSBhIGZpbGUgZGVzY3JpcHRvciBmb3IgcmVhZGluZyB0aGUgY29udGVudHMgb2YgYW4gb2JqZWN0IG92ZXIgTVRQCisgICAgcHVibGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9wZW5GaWxlKGludCBkZXZpY2VJRCwgbG9uZyBvYmplY3RJRCkgeworICAgICAgICByZXR1cm4gbmF0aXZlX29wZW5fZmlsZShkZXZpY2VJRCwgb2JqZWN0SUQpOworICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgTGlzdGVuZXIgeworICAgICAgICAvLyBjYWxsZWQgd2hlbiBhIG5ldyBNVFAgZGV2aWNlIGhhcyBiZWVuIGRpc2NvdmVyZWQKKyAgICAgICAgdm9pZCBkZXZpY2VBZGRlZChpbnQgaWQpOworCisgICAgICAgIC8vIGNhbGxlZCB3aGVuIGFuIE1UUCBkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZAorICAgICAgICB2b2lkIGRldmljZVJlbW92ZWQoaW50IGlkKTsKKyAgICB9CisKKyAgICAvLyBjYWxsZWQgZnJvbSBuYXRpdmUgY29kZQorICAgIHByaXZhdGUgdm9pZCBkZXZpY2VBZGRlZChpbnQgaWQpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZGV2aWNlQWRkZWQgIiArIGlkKTsKKyAgICAgICAgbUxpc3RlbmVyLmRldmljZUFkZGVkKGlkKTsKKyAgICB9CisKKyAgICAvLyBjYWxsZWQgZnJvbSBuYXRpdmUgY29kZQorICAgIHByaXZhdGUgdm9pZCBkZXZpY2VSZW1vdmVkKGludCBpZCkgeworICAgICAgICBMb2cuZChUQUcsICJkZXZpY2VSZW1vdmVkICIgKyBpZCk7CisgICAgICAgIG1MaXN0ZW5lci5kZXZpY2VSZW1vdmVkKGlkKTsKKyAgICB9CisKKyAgICAvLyB1c2VkIGJ5IHRoZSBKTkkgY29kZQorICAgIHByaXZhdGUgaW50IG1OYXRpdmVDb250ZXh0OworCisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc2V0dXAoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlX3N0YXJ0KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVfc3RvcCgpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlX2RlbGV0ZV9vYmplY3QoaW50IGRldmljZUlELCBsb25nIG9iamVjdElEKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBsb25nIG5hdGl2ZV9nZXRfcGFyZW50KGludCBkZXZpY2VJRCwgbG9uZyBvYmplY3RJRCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgbG9uZyBuYXRpdmVfZ2V0X3N0b3JhZ2VfaWQoaW50IGRldmljZUlELCBsb25nIG9iamVjdElEKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBQYXJjZWxGaWxlRGVzY3JpcHRvciBuYXRpdmVfb3Blbl9maWxlKGludCBkZXZpY2VJRCwgbG9uZyBvYmplY3RJRCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ29uc3RhbnRzLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdkMzNjZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDQwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNdHBDb25zdGFudHMgeworCisvLyBNVFAgUmVzcG9uc2UgQ29kZXMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9VTkRFRklORUQgPSAweDIwMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfT0sgPSAweDIwMDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfR0VORVJBTF9FUlJPUiA9IDB4MjAwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOID0gMHgyMDAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOVkFMSURfVFJBTlNBQ1RJT05fSUQgPSAweDIwMDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfT1BFUkFUSU9OX05PVF9TVVBQT1JURUQgPSAweDIwMDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfUEFSQU1FVEVSX05PVF9TVVBQT1JURUQgPSAweDIwMDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5DT01QTEVURV9UUkFOU0ZFUiA9IDB4MjAwNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX1NUT1JBR0VfSUQgPSAweDIwMDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFID0gMHgyMDA5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0RFVklDRV9QUk9QX05PVF9TVVBQT1JURUQgPSAweDIwMEE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfRk9STUFUX0NPREUgPSAweDIwMEI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1RPUkFHRV9GVUxMID0gMHgyMDBDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX09CSkVDVF9XUklURV9QUk9URUNURUQgPSAweDIwMEQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1RPUkVfUkVBRF9PTkxZID0gMHgyMDBFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0FDQ0VTU19ERU5JRUQgPSAweDIwMEY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfTk9fVEhVTUJOQUlMX1BSRVNFTlQgPSAweDIwMTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU0VMRl9URVNUX0ZBSUxFRCA9IDB4MjAxMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9QQVJUSUFMX0RFTEVUSU9OID0gMHgyMDEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NUT1JFX05PVF9BVkFJTEFCTEUgPSAweDIwMTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1BFQ0lGSUNBVElPTl9CWV9GT1JNQVRfVU5TVVBQT1JURUQgPSAweDIwMTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfTk9fVkFMSURfT0JKRUNUX0lORk8gPSAweDIwMTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9DT0RFX0ZPUk1BVCA9IDB4MjAxNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9VTktOT1dOX1ZFTkRPUl9DT0RFID0gMHgyMDE3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0NBUFRVUkVfQUxSRUFEWV9URVJNSU5BVEVEID0gMHgyMDE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0RFVklDRV9CVVNZID0gMHgyMDE5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOVkFMSURfUEFSRU5UX09CSkVDVCA9IDB4MjAxQTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX0RFVklDRV9QUk9QX0ZPUk1BVCA9IDB4MjAxQjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX0RFVklDRV9QUk9QX1ZBTFVFID0gMHgyMDFDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOVkFMSURfUEFSQU1FVEVSID0gMHgyMDFEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NFU1NJT05fQUxSRUFEWV9PUEVOID0gMHgyMDFFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1RSQU5TQUNUSU9OX0NBTkNFTExFRCA9IDB4MjAxRjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TUEVDSUZJQ0FUSU9OX09GX0RFU1RJTkFUSU9OX1VOU1VQUE9SVEVEID0gMHgyMDIwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOVkFMSURfT0JKRUNUX1BST1BfQ09ERSA9IDB4QTgwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX0ZPUk1BVCA9IDB4QTgwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX1ZBTFVFID0gMHhBODAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOVkFMSURfT0JKRUNUX1JFRkVSRU5DRSA9IDB4QTgwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9HUk9VUF9OT1RfU1VQUE9SVEVEID0gMHhBODA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOVkFMSURfREFUQVNFVCA9IDB4QTgwNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TUEVDSUZJQ0FUSU9OX0JZX0dST1VQX1VOU1VQUE9SVEVEID0gMHhBODA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NQRUNJRklDQVRJT05fQllfREVQVEhfVU5TVVBQT1JURUQgPSAweEE4MDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfT0JKRUNUX1RPT19MQVJHRSA9IDB4QTgwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9PQkpFQ1RfUFJPUF9OT1RfU1VQUE9SVEVEID0gMHhBODBBOworCisgICAgLy8gTVRQIGZvcm1hdCBjb2RlcworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORUQgPSAweDMwMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FTU09DSUFUSU9OID0gMHgzMDAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9TQ1JJUFQgPSAweDMwMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0VYRUNVVEFCTEUgPSAweDMwMDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1RFWFQgPSAweDMwMDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0hUTUwgPSAweDMwMDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0RQT0YgPSAweDMwMDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FJRkYgPSAweDMwMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1dBViA9IDB4MzAwODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVAzID0gMHgzMDA5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BVkkgPSAweDMwMEE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01QRUcgPSAweDMwMEI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FTRiA9IDB4MzAwQzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfREVGSU5FRCA9IDB4MzgwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfRVhJRl9KUEVHID0gMHgzODAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9USUZGX0VQID0gMHgzODAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9GTEFTSFBJWCA9IDB4MzgwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQk1QID0gMHgzODA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9DSUZGID0gMHgzODA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9HSUYgPSAweDM4MDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0pGSUYgPSAweDM4MDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0NEID0gMHgzODA5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9QSUNUID0gMHgzODBBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9QTkcgPSAweDM4MEI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1RJRkYgPSAweDM4MEQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1RJRkZfSVQgPSAweDM4MEU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0pQMiA9IDB4MzgwRjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfSlBYID0gMHgzODEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfRklSTVdBUkUgPSAweEI4MDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1dJTkRPV1NfSU1BR0VfRk9STUFUID0gMHhCODgxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfQVVESU8gPSAweEI5MDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1dNQSA9IDB4QjkwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfT0dHID0gMHhCOTAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQUMgPSAweEI5MDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FVRElCTEUgPSAweEI5MDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0ZMQUMgPSAweEI5MDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1VOREVGSU5FRF9WSURFTyA9IDB4Qjk4MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfV01WID0gMHhCOTgxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NUDRfQ09OVEFJTkVSID0gMHhCOTgyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NUDIgPSAweEI5ODM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUXzNHUF9DT05UQUlORVIgPSAweEI5ODQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1VOREVGSU5FRF9DT0xMRUNUSU9OID0gMHhCQTAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9NVUxUSU1FRElBX0FMQlVNID0gMHhCQTAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9JTUFHRV9BTEJVTSA9IDB4QkEwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfQVVESU9fQUxCVU0gPSAweEJBMDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX1ZJREVPX0FMQlVNID0gMHhCQTA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9BVl9QTEFZTElTVCA9IDB4QkEwNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfQ09OVEFDVF9HUk9VUCA9IDB4QkEwNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfTUVTU0FHRV9GT0xERVIgPSAweEJBMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0NIQVBURVJFRF9QUk9EVUNUSU9OID0gMHhCQTA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9BVURJT19QTEFZTElTVCA9IDB4QkEwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfVklERU9fUExBWUxJU1QgPSAweEJBMEE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX01FRElBQ0FTVCA9IDB4QkEwQjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfV1BMX1BMQVlMSVNUID0gMHhCQTEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NM1VfUExBWUxJU1QgPSAweEJBMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01QTF9QTEFZTElTVCA9IDB4QkExMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQVNYX1BMQVlMSVNUID0gMHhCQTEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9QTFNfUExBWUxJU1QgPSAweEJBMTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1VOREVGSU5FRF9ET0NVTUVOVCA9IDB4QkE4MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfRE9DVU1FTlQgPSAweEJBODE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1hNTF9ET0NVTUVOVCA9IDB4QkE4MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVNfV09SRF9ET0NVTUVOVCA9IDB4QkE4MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTUhUX0NPTVBJTEVEX0hUTUxfRE9DVU1FTlQgPSAweEJBODQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01TX0VYQ0VMX1NQUkVBRFNIRUVUID0gMHhCQTg1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NU19QT1dFUlBPSU5UX1BSRVNFTlRBVElPTiA9IDB4QkE4NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX01FU1NBR0UgPSAweEJCMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX01FU1NTQUdFID0gMHhCQjAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfQ09OVEFDVCA9IDB4QkI4MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfQ09OVEFDVCA9IDB4QkI4MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVkNBUkRfMiA9IDB4QkI4MjsKKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fic3RyYWN0T2JqZWN0KGludCBmb3JtYXQpIHsKKyAgICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgICAgIGNhc2UgRk9STUFUX0FCU1RSQUNUX01VTFRJTUVESUFfQUxCVU06CisgICAgICAgICAgICBjYXNlIEZPUk1BVF9BQlNUUkFDVF9JTUFHRV9BTEJVTToKKyAgICAgICAgICAgIGNhc2UgRk9STUFUX0FCU1RSQUNUX0FVRElPX0FMQlVNOgorICAgICAgICAgICAgY2FzZSBGT1JNQVRfQUJTVFJBQ1RfVklERU9fQUxCVU06CisgICAgICAgICAgICBjYXNlIEZPUk1BVF9BQlNUUkFDVF9BVl9QTEFZTElTVDoKKyAgICAgICAgICAgIGNhc2UgRk9STUFUX0FCU1RSQUNUX0NPTlRBQ1RfR1JPVVA6CisgICAgICAgICAgICBjYXNlIEZPUk1BVF9BQlNUUkFDVF9NRVNTQUdFX0ZPTERFUjoKKyAgICAgICAgICAgIGNhc2UgRk9STUFUX0FCU1RSQUNUX0NIQVBURVJFRF9QUk9EVUNUSU9OOgorICAgICAgICAgICAgY2FzZSBGT1JNQVRfQUJTVFJBQ1RfQVVESU9fUExBWUxJU1Q6CisgICAgICAgICAgICBjYXNlIEZPUk1BVF9BQlNUUkFDVF9WSURFT19QTEFZTElTVDoKKyAgICAgICAgICAgIGNhc2UgRk9STUFUX0FCU1RSQUNUX01FRElBQ0FTVDoKKyAgICAgICAgICAgIGNhc2UgRk9STUFUX0FCU1RSQUNUX0RPQ1VNRU5UOgorICAgICAgICAgICAgY2FzZSBGT1JNQVRfQUJTVFJBQ1RfTUVTU1NBR0U6CisgICAgICAgICAgICBjYXNlIEZPUk1BVF9BQlNUUkFDVF9DT05UQUNUOgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBNVFAgb2JqZWN0IHByb3BlcnRpZXMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TVE9SQUdFX0lEID0gMHhEQzAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX09CSkVDVF9GT1JNQVQgPSAweERDMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUFJPVEVDVElPTl9TVEFUVVMgPSAweERDMDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfT0JKRUNUX1NJWkUgPSAweERDMDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQVNTT0NJQVRJT05fVFlQRSA9IDB4REMwNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BU1NPQ0lBVElPTl9ERVNDID0gMHhEQzA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX09CSkVDVF9GSUxFX05BTUUgPSAweERDMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfREFURV9DUkVBVEVEID0gMHhEQzA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0RBVEVfTU9ESUZJRUQgPSAweERDMDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfS0VZV09SRFMgPSAweERDMEE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEFSRU5UX09CSkVDVCA9IDB4REMwQjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BTExPV0VEX0ZPTERFUl9DT05URU5UUyA9IDB4REMwQzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9ISURERU4gPSAweERDMEQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU1lTVEVNX09CSkVDVCA9IDB4REMwRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QRVJTSVNURU5UX1VJRCA9IDB4REM0MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TWU5DX0lEID0gMHhEQzQyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BST1BFUlRZX0JBRyA9IDB4REM0MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9OQU1FID0gMHhEQzQ0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0NSRUFURURfQlkgPSAweERDNDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQVJUSVNUID0gMHhEQzQ2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0RBVEVfQVVUSE9SRUQgPSAweERDNDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfREVTQ1JJUFRJT04gPSAweERDNDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfVVJMX1JFRkVSRU5DRSA9IDB4REM0OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9MQU5HVUFHRV9MT0NBTEUgPSAweERDNEE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQ09QWVJJR0hUX0lORk9STUFUSU9OID0gMHhEQzRCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1NPVVJDRSA9IDB4REM0QzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9PUklHSU5fTE9DQVRJT04gPSAweERDNEQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfREFURV9BRERFRCA9IDB4REM0RTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9OT05fQ09OU1VNQUJMRSA9IDB4REM0RjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9DT1JSVVBUX1VOUExBWUFCTEUgPSAweERDNTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUFJPRFVDRVJfU0VSSUFMX05VTUJFUiA9IDB4REM1MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfRk9STUFUID0gMHhEQzgxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9TSVpFID0gMHhEQzgyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9IRUlHSFQgPSAweERDODM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX1dJRFRIID0gMHhEQzg0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9EVVJBVElPTiA9IDB4REM4NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfREFUQSA9IDB4REM4NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9XSURUSCA9IDB4REM4NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9IRUlHSFQgPSAweERDODg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRFVSQVRJT04gPSAweERDODk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUkFUSU5HID0gMHhEQzhBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1RSQUNLID0gMHhEQzhCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0dFTlJFID0gMHhEQzhDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0NSRURJVFMgPSAweERDOEQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTFlSSUNTID0gMHhEQzhFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1NVQlNDUklQVElPTl9DT05URU5UX0lEID0gMHhEQzhGOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BST0RVQ0VEX0JZID0gMHhEQzkwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1VTRV9DT1VOVCA9IDB4REM5MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TS0lQX0NPVU5UID0gMHhEQzkyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0xBU1RfQUNDRVNTRUQgPSAweERDOTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEFSRU5UQUxfUkFUSU5HID0gMHhEQzk0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX01FVEFfR0VOUkUgPSAweERDOTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQ09NUE9TRVIgPSAweERDOTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRUZGRUNUSVZFX1JBVElORyA9IDB4REM5NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TVUJUSVRMRSA9IDB4REM5ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9PUklHSU5BTF9SRUxFQVNFX0RBVEUgPSAweERDOTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUxCVU1fTkFNRSA9IDB4REM5QTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BTEJVTV9BUlRJU1QgPSAweERDOUI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTU9PRCA9IDB4REM5QzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9EUk1fU1RBVFVTID0gMHhEQzlEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1NVQl9ERVNDUklQVElPTiA9IDB4REM5RTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9JU19DUk9QUEVEID0gMHhEQ0QxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0lTX0NPTE9VUl9DT1JSRUNURUQgPSAweERDRDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfSU1BR0VfQklUX0RFUFRIID0gMHhEQ0QzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0ZfTlVNQkVSID0gMHhEQ0Q0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VYUE9TVVJFX1RJTUUgPSAweERDRDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRVhQT1NVUkVfSU5ERVggPSAweERDRDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfVE9UQUxfQklUUkFURSA9IDB4REU5MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9CSVRSQVRFX1RZUEUgPSAweERFOTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU0FNUExFX1JBVEUgPSAweERFOTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTlVNQkVSX09GX0NIQU5ORUxTID0gMHhERTk0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FVRElPX0JJVF9ERVBUSCA9IDB4REU5NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TQ0FOX1RZUEUgPSAweERFOTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQVVESU9fV0FWRV9DT0RFQyA9IDB4REU5OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BVURJT19CSVRSQVRFID0gMHhERTlBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1ZJREVPX0ZPVVJDQ19DT0RFQyA9IDB4REU5QjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9WSURFT19CSVRSQVRFID0gMHhERTlDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0ZSQU1FU19QRVJfVEhPVVNBTkRfU0VDT05EUyA9IDB4REU5RDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9LRVlGUkFNRV9ESVNUQU5DRSA9IDB4REU5RTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9CVUZGRVJfU0laRSA9IDB4REU5RjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9FTkNPRElOR19RVUFMSVRZID0gMHhERUEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VOQ09ESU5HX1BST0ZJTEUgPSAweERFQTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRElTUExBWV9OQU1FID0gMHhEQ0UwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0JPRFlfVEVYVCA9IDB4RENFMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TVUJKRUNUID0gMHhEQ0UyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BSSU9SSVRZID0gMHhEQ0UzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0dJVkVOX05BTUUgPSAweEREMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTUlERExFX05BTUVTID0gMHhERDAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0ZBTUlMWV9OQU1FID0gMHhERDAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BSRUZJWCA9IDB4REQwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TVUZGSVggPSAweEREMDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEhPTkVUSUNfR0lWRU5fTkFNRSA9IDB4REQwNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QSE9ORVRJQ19GQU1JTFlfTkFNRSA9IDB4REQwNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9FTUFJTF9QUklNQVJZID0gMHhERDA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VNQUlMX1BFUlNPTkFMXzEgPSAweEREMDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRU1BSUxfUEVSU09OQUxfMiA9IDB4REQwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9FTUFJTF9CVVNJTkVTU18xID0gMHhERDBBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VNQUlMX0JVU0lORVNTXzIgPSAweEREMEI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRU1BSUxfT1RIRVJTID0gMHhERDBDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BIT05FX05VTUJFUl9QUklNQVJZID0gMHhERDBEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BIT05FX05VTUJFUl9QRVJTT05BTCA9IDB4REQwRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QSE9ORV9OVU1CRVJfUEVSU09OQUxfMiA9IDB4REQwRjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QSE9ORV9OVU1CRVJfQlVTSU5FU1MgPSAweEREMTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEhPTkVfTlVNQkVSX0JVU0lORVNTXzIgPSAweEREMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEhPTkVfTlVNQkVSX01PQklMRT0gMHhERDEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BIT05FX05VTUJFUl9NT0JJTEVfMiA9IDB4REQxMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9GQVhfTlVNQkVSX1BSSU1BUlkgPSAweEREMTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRkFYX05VTUJFUl9QRVJTT05BTD0gMHhERDE1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0ZBWF9OVU1CRVJfQlVTSU5FU1M9IDB4REQxNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QQUdFUl9OVU1CRVIgPSAweEREMTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEhPTkVfTlVNQkVSX09USEVSUz0gMHhERDE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BSSU1BUllfV0VCX0FERFJFU1M9IDB4REQxOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QRVJTT05BTF9XRUJfQUREUkVTUyA9IDB4REQxQTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9CVVNJTkVTU19XRUJfQUREUkVTUyA9IDB4REQxQjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTID0gMHhERDFDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0lOU1RBTlRfTUVTU0FOR0VSX0FERFJFU1NfMiA9IDB4REQxRDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTXzMgPSAweEREMUU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfRlVMTCA9IDB4REQxRjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9MSU5FXzEgPSAweEREMjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfTElORV8yID0gMHhERDIxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0NJVFkgPSAweEREMjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfUkVHSU9OID0gMHhERDIzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX1BPU1RBTF9DT0RFID0gMHhERDI0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0NPVU5UUlkgPSAweEREMjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfRlVMTCA9IDB4REQyNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19MSU5FXzEgPSAweEREMjc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfTElORV8yID0gMHhERDI4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0NJVFkgPSAweEREMjk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfUkVHSU9OID0gMHhERDJBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX1BPU1RBTF9DT0RFID0gMHhERDJCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0NPVU5UUlkgPSAweEREMkM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfRlVMTCA9IDB4REQyRDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9MSU5FXzEgPSAweEREMkU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfTElORV8yID0gMHhERDJGOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0NJVFkgPSAweEREMzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfUkVHSU9OID0gMHhERDMxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX1BPU1RBTF9DT0RFID0gMHhERDMyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0NPVU5UUlkgPSAweEREMzM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfT1JHQU5JWkFUSU9OX05BTUUgPSAweEREMzQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEhPTkVUSUNfT1JHQU5JWkFUSU9OX05BTUUgPSAweEREMzU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUk9MRSA9IDB4REQzNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9CSVJUSERBVEUgPSAweEREMzc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTUVTU0FHRV9UTyA9IDB4REQ0MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9NRVNTQUdFX0NDID0gMHhERDQxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX01FU1NBR0VfQkNDID0gMHhERDQyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX01FU1NBR0VfUkVBRCA9IDB4REQ0MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9NRVNTQUdFX1JFQ0VJVkVEX1RJTUUgPSAweERENDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTUVTU0FHRV9TRU5ERVIgPSAweERENDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfQkVHSU5fVElNRSA9IDB4REQ1MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BQ1RJVklUWV9FTkRfVElNRSA9IDB4REQ1MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BQ1RJVklUWV9MT0NBVElPTiA9IDB4REQ1MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BQ1RJVklUWV9SRVFVSVJFRF9BVFRFTkRFRVMgPSAweERENTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfT1BUSU9OQUxfQVRURU5ERUVTID0gMHhERDU1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FDVElWSVRZX1JFU09VUkNFUyA9IDB4REQ1NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BQ1RJVklUWV9BQ0NFUFRFRCA9IDB4REQ1NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BQ1RJVklUWV9URU5UQVRJVkUgPSAweERENTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfREVDTElORUQgPSAweERENTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfUkVNQUlOREVSX1RJTUUgPSAweERENUE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfT1dORVIgPSAweERENUI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfU1RBVFVTID0gMHhERDVDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX09XTkVSID0gMHhERDVEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VESVRPUiA9IDB4REQ1RTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9XRUJNQVNURVIgPSAweERENUY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfVVJMX1NPVVJDRSA9IDB4REQ2MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9VUkxfREVTVElOQVRJT04gPSAweERENjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfVElNRV9CT09LTUFSSyA9IDB4REQ2MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9PQkpFQ1RfQk9PS01BUksgPSAweERENjM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQllURV9CT09LTUFSSyA9IDB4REQ2NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9MQVNUX0JVSUxEX0RBVEUgPSAweERENzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfVElNRV9UT19MSVZFID0gMHhERDcxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX01FRElBX0dVSUQgPSAweERENzI7CisKKyAgICAvLyBNVFAgZGV2aWNlIHByb3BlcnRpZXMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfVU5ERUZJTkVEID0gMHg1MDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9CQVRURVJZX0xFVkVMID0gMHg1MDAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9GVU5DVElPTkFMX01PREUgPSAweDUwMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0lNQUdFX1NJWkUgPSAweDUwMDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0NPTVBSRVNTSU9OX1NFVFRJTkcgPSAweDUwMDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1dISVRFX0JBTEFOQ0UgPSAweDUwMDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1JHQl9HQUlOID0gMHg1MDA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9GX05VTUJFUiA9IDB4NTAwNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRk9DQUxfTEVOR1RIID0gMHg1MDA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9GT0NVU19ESVNUQU5DRSA9IDB4NTAwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRk9DVVNfTU9ERSA9IDB4NTAwQTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfTUVURVJJTkdfTU9ERSA9IDB4NTAwQjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRkxBU0hfTU9ERSA9IDB4NTAwQzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfVElNRSA9IDB4NTAwRDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfUFJPR1JBTV9NT0RFID0gMHg1MDBFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9JTkRFWCA9IDB4NTAwRjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfQklBU19DT01QRU5TQVRJT04gPSAweDUwMTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0RBVEVUSU1FID0gMHg1MDExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9DQVBUVVJFX0RFTEFZID0gMHg1MDEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9TVElMTF9DQVBUVVJFX01PREUgPSAweDUwMTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0NPTlRSQVNUID0gMHg1MDE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9TSEFSUE5FU1MgPSAweDUwMTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0RJR0lUQUxfWk9PTSA9IDB4NTAxNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRUZGRUNUX01PREUgPSAweDUwMTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0JVUlNUX05VTUJFUj0gMHg1MDE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9CVVJTVF9JTlRFUlZBTCA9IDB4NTAxOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfVElNRUxBUFNFX05VTUJFUiA9IDB4NTAxQTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfVElNRUxBUFNFX0lOVEVSVkFMID0gMHg1MDFCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9GT0NVU19NRVRFUklOR19NT0RFID0gMHg1MDFDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9VUExPQURfVVJMID0gMHg1MDFEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9BUlRJU1QgPSAweDUwMUU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0NPUFlSSUdIVF9JTkZPID0gMHg1MDFGOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9TWU5DSFJPTklaQVRJT05fUEFSVE5FUiA9IDB4RDQwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0ZSSUVORExZX05BTUUgPSAweEQ0MDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1ZPTFVNRSA9IDB4RDQwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfU1VQUE9SVEVEX0ZPUk1BVFNfT1JERVJFRCA9IDB4RDQwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0lDT04gPSAweEQ0MDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX1JBVEUgPSAweEQ0MTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX09CSkVDVCA9IDB4RDQxMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfUExBWUJBQ0tfQ09OVEFJTkVSX0lOREVYID0gMHhENDEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9TRVNTSU9OX0lOSVRJQVRPUl9WRVJTSU9OX0lORk8gPSAweEQ0MDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1BFUkNFSVZFRF9ERVZJQ0VfVFlQRSA9IDB4RDQwNzsKKworCisgICAgLyoqCisgICAgICogT2JqZWN0IGlzIG5vdCBwcm90ZWN0ZWQuIEl0IG1heSBiZSBtb2RpZmllZCBhbmQgZGVsZXRlZCwgYW5kIGl0cyBwcm9wZXJ0aWVzCisgICAgICogbWF5IGJlIG1vZGlmaWVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1RFQ1RJT05fU1RBVFVTX05PTkUgPSAwOworCisgICAgLyoqCisgICAgICogT2JqZWN0IGNhbiBub3QgYmUgbW9kaWZpZWQgb3IgZGVsZXRlZCBhbmQgaXRzIHByb3BlcnRpZXMgY2FuIG5vdCBiZSBtb2RpZmllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNUSU9OX1NUQVRVU19SRUFEX09OTFkgPSAweDgwMDE7CisKKyAgICAvKioKKyAgICAgKiBPYmplY3QgY2FuIG5vdCBiZSBtb2RpZmllZCBvciBkZWxldGVkIGJ1dCBpdHMgcHJvcGVydGllcyBhcmUgbW9kaWZpYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNUSU9OX1NUQVRVU19SRUFEX09OTFlfREFUQSA9IDB4ODAwMjsKKworICAgIC8qKgorICAgICAqIE9iamVjdCdzIGNvbnRlbnRzIGNhbiBub3QgYmUgdHJhbnNmZXJlZCBmcm9tIHRoZSBkZXZpY2UsIGJ1dCB0aGUgb2JqZWN0CisgICAgICogbWF5IGJlIG1vdmVkIG9yIGRlbGV0ZWQgYW5kIGl0cyBwcm9wZXJ0aWVzIG1heSBiZSBtb2RpZmllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNUSU9OX1NUQVRVU19OT05fVFJBTlNGRVJBQkxFX0RBVEEgPSAweDgwMDM7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU1NPQ0lBVElPTl9UWVBFX0dFTkVSSUNfRk9MREVSID0gMHgwMDAxOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cEN1cnNvci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cEN1cnNvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmODc5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yLmphdmEKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkFic3RyYWN0V2luZG93ZWRDdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXaW5kb3c7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAgKiBDdXJzb3IgY2xhc3MgZm9yIE1UUCBjb250ZW50IHByb3ZpZGVyCisgICogQGhpZGUKKyAgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNdHBDdXJzb3IgZXh0ZW5kcyBBYnN0cmFjdFdpbmRvd2VkQ3Vyc29yIHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNdHBDdXJzb3IiOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fQ09VTlQgPSAtMTsKKworICAgIC8qIGNvbnN0YW50cyBmb3IgcXVlcnlUeXBlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFICAgICAgICAgICAgICA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX0lEICAgICAgICAgICA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkFHRSAgICAgICAgICAgICA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkFHRV9JRCAgICAgICAgICA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUICAgICAgICAgICAgICA9IDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0lEICAgICAgICAgICA9IDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkFHRV9DSElMRFJFTiAgICA9IDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0NISUxEUkVOICAgICA9IDg7CisKKyAgICAvKiogVGhlIG5hbWVzIG9mIHRoZSBjb2x1bW5zIGluIHRoZSBwcm9qZWN0aW9uICovCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBtQ29sdW1uczsKKworICAgIC8qKiBUaGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGN1cnNvciAqLworICAgIHByaXZhdGUgaW50IG1Db3VudCA9IE5PX0NPVU5UOworCisKKyAgICBwdWJsaWMgTXRwQ3Vyc29yKE10cENsaWVudCBjbGllbnQsIGludCBxdWVyeVR5cGUsIGludCBkZXZpY2VJRCwgbG9uZyBzdG9yYWdlSUQsIGxvbmcgb2JqZWN0SUQsCisgICAgICAgICAgICBTdHJpbmdbXSBwcm9qZWN0aW9uKSB7CisgICAgICAgIG1Db2x1bW5zID0gcHJvamVjdGlvbjsKKworICAgICAgICBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gbWFwOworICAgICAgICBzd2l0Y2ggKHF1ZXJ5VHlwZSkgeworICAgICAgICAgICAgY2FzZSBERVZJQ0U6CisgICAgICAgICAgICBjYXNlIERFVklDRV9JRDoKKyAgICAgICAgICAgICAgICBtYXAgPSBzRGV2aWNlUHJvamVjdGlvbk1hcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RPUkFHRToKKyAgICAgICAgICAgIGNhc2UgU1RPUkFHRV9JRDoKKyAgICAgICAgICAgICAgICBtYXAgPSBzU3RvcmFnZVByb2plY3Rpb25NYXA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVDoKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0lEOgorICAgICAgICAgICAgY2FzZSBTVE9SQUdFX0NISUxEUkVOOgorICAgICAgICAgICAgY2FzZSBPQkpFQ1RfQ0hJTERSRU46CisgICAgICAgICAgICAgICAgbWFwID0gc09iamVjdFByb2plY3Rpb25NYXA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gcXVlcnkgdHlwZSAiICArIHF1ZXJ5VHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBpbnRbXSBjb2x1bW5zID0gbmV3IGludFtwcm9qZWN0aW9uLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdGlvbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgSW50ZWdlciBpZCA9IG1hcC5nZXQocHJvamVjdGlvbltpXSk7CisgICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY29sdW1uICIgICsgcHJvamVjdGlvbltpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2x1bW5zW2ldID0gaWQuaW50VmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICBuYXRpdmVfc2V0dXAoY2xpZW50LCBxdWVyeVR5cGUsIGRldmljZUlELCBzdG9yYWdlSUQsIG9iamVjdElELCBjb2x1bW5zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5hdGl2ZV9maW5hbGl6ZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgIGlmIChtQ291bnQgPT0gTk9fQ09VTlQpIHsKKyAgICAgICAgICAgIGZpbGxXaW5kb3coMCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Db3VudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXJ5KCkgeworICAgICAgICBMb2cuZChUQUcsICJyZXF1ZXJ5Iik7CisgICAgICAgIG1Db3VudCA9IE5PX0NPVU5UOworICAgICAgICBpZiAobVdpbmRvdyAhPSBudWxsKSB7CisgICAgICAgICAgICBtV2luZG93LmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlcXVlcnkoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZmlsbFdpbmRvdyhpbnQgc3RhcnRQb3MpIHsKKyAgICAgICAgaWYgKG1XaW5kb3cgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXNuJ3QgYSB3aW5kb3cgc2V0IGFscmVhZHkgaXQgd2lsbCBvbmx5IGJlIGFjY2Vzc2VkIGxvY2FsbHkKKyAgICAgICAgICAgIG1XaW5kb3cgPSBuZXcgQ3Vyc29yV2luZG93KHRydWUgLyogdGhlIHdpbmRvdyBpcyBsb2NhbCBvbmx5ICovKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtV2luZG93LmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgbVdpbmRvdy5zZXRTdGFydFBvc2l0aW9uKHN0YXJ0UG9zKTsKKyAgICAgICAgbUNvdW50ID0gbmF0aXZlX2ZpbGxfd2luZG93KG1XaW5kb3csIHN0YXJ0UG9zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29sdW1uTmFtZXMoKSB7CisgICAgICAgIExvZy5kKFRBRywgImdldENvbHVtbk5hbWVzIHJldHVybmluZyAiICsgbUNvbHVtbnMpOworICAgICAgICByZXR1cm4gbUNvbHVtbnM7CisgICAgfQorCisgICAgLyogRGV2aWNlIENvbHVtbiBJRHMgKi8KKyAgICAgLyogVGhlc2UgbXVzdCBtYXRjaCB0aGUgdmFsdWVzIGluIE10cEN1cnNvci5jcHAgKi8KKyAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUk9XX0lEICAgICAgICAgID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX01BTlVGQUNUVVJFUiAgICA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFVklDRV9NT0RFTCAgICAgICAgICAgPSAzOworCisgICAgLyogU3RvcmFnZSBDb2x1bW4gSURzICovCisgICAgLyogVGhlc2UgbXVzdCBtYXRjaCB0aGUgdmFsdWVzIGluIE10cEN1cnNvci5jcHAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkFHRV9ST1dfSUQgICAgICAgICA9IDEwMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkFHRV9JREVOVElGSUVSICAgICA9IDEwMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RPUkFHRV9ERVNDUklQVElPTiAgICA9IDEwMzsKKworICAgIC8qIE9iamVjdCBDb2x1bW4gSURzICovCisgICAgLyogVGhlc2UgbXVzdCBtYXRjaCB0aGUgdmFsdWVzIGluIE10cEN1cnNvci5jcHAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1JPV19JRCAgICAgICAgICAgICAgPSAyMDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9TVE9SQUdFX0lEICAgICAgICAgID0gMjAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfRk9STUFUICAgICAgICAgICAgICA9IDIwMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1BST1RFQ1RJT05fU1RBVFVTICAgPSAyMDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9TSVpFICAgICAgICAgICAgICAgID0gMjA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfVEhVTUJfRk9STUFUICAgICAgICA9IDIwNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1RIVU1CX1NJWkUgICAgICAgICAgPSAyMDc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9USFVNQl9XSURUSCAgICAgICAgID0gMjA4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfVEhVTUJfSEVJR0hUICAgICAgICA9IDIwOTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0lNQUdFX1dJRFRIICAgICAgICAgPSAyMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9JTUFHRV9IRUlHSFQgICAgICAgID0gMjExOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfSU1BR0VfREVQVEggICAgICAgICA9IDIxMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1BBUkVOVCAgICAgICAgICAgICAgPSAyMTM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9BU1NPQ0lBVElPTl9UWVBFICAgID0gMjE0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfQVNTT0NJQVRJT05fREVTQyAgICA9IDIxNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1NFUVVFTkNFX05VTUJFUiAgICAgPSAyMTY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9OQU1FICAgICAgICAgICAgICAgID0gMjE3OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfREFURV9DUkVBVEVEICAgICAgICA9IDIxODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0RBVEVfTU9ESUZJRUQgICAgICAgPSAyMTk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9LRVlXT1JEUyAgICAgICAgICAgID0gMjIwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfVEhVTUIgICAgICAgICAgICAgICA9IDIyMTsKKworICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzRGV2aWNlUHJvamVjdGlvbk1hcDsKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gc1N0b3JhZ2VQcm9qZWN0aW9uTWFwOworICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzT2JqZWN0UHJvamVjdGlvbk1hcDsKKworICAgIHN0YXRpYyB7CisgICAgICAgIHNEZXZpY2VQcm9qZWN0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgICAgICBzRGV2aWNlUHJvamVjdGlvbk1hcC5wdXQoTXRwLkRldmljZS5fSUQsIG5ldyBJbnRlZ2VyKERFVklDRV9ST1dfSUQpKTsKKyAgICAgICAgc0RldmljZVByb2plY3Rpb25NYXAucHV0KE10cC5EZXZpY2UuTUFOVUZBQ1RVUkVSLCBuZXcgSW50ZWdlcihERVZJQ0VfTUFOVUZBQ1RVUkVSKSk7CisgICAgICAgIHNEZXZpY2VQcm9qZWN0aW9uTWFwLnB1dChNdHAuRGV2aWNlLk1PREVMLCBuZXcgSW50ZWdlcihERVZJQ0VfTU9ERUwpKTsKKworICAgICAgICBzU3RvcmFnZVByb2plY3Rpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisgICAgICAgIHNTdG9yYWdlUHJvamVjdGlvbk1hcC5wdXQoTXRwLlN0b3JhZ2UuX0lELCBuZXcgSW50ZWdlcihTVE9SQUdFX1JPV19JRCkpOworICAgICAgICBzU3RvcmFnZVByb2plY3Rpb25NYXAucHV0KE10cC5TdG9yYWdlLklERU5USUZJRVIsIG5ldyBJbnRlZ2VyKFNUT1JBR0VfSURFTlRJRklFUikpOworICAgICAgICBzU3RvcmFnZVByb2plY3Rpb25NYXAucHV0KE10cC5TdG9yYWdlLkRFU0NSSVBUSU9OLCBuZXcgSW50ZWdlcihTVE9SQUdFX0RFU0NSSVBUSU9OKSk7CisKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0Ll9JRCwgbmV3IEludGVnZXIoT0JKRUNUX1JPV19JRCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5TVE9SQUdFX0lELCBuZXcgSW50ZWdlcihPQkpFQ1RfU1RPUkFHRV9JRCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5GT1JNQVQsIG5ldyBJbnRlZ2VyKE9CSkVDVF9GT1JNQVQpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuUFJPVEVDVElPTl9TVEFUVVMsIG5ldyBJbnRlZ2VyKE9CSkVDVF9QUk9URUNUSU9OX1NUQVRVUykpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5TSVpFLCBuZXcgSW50ZWdlcihPQkpFQ1RfU0laRSkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5USFVNQl9GT1JNQVQsIG5ldyBJbnRlZ2VyKE9CSkVDVF9USFVNQl9GT1JNQVQpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuVEhVTUJfU0laRSwgbmV3IEludGVnZXIoT0JKRUNUX1RIVU1CX1NJWkUpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuVEhVTUJfV0lEVEgsIG5ldyBJbnRlZ2VyKE9CSkVDVF9USFVNQl9XSURUSCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5USFVNQl9IRUlHSFQsIG5ldyBJbnRlZ2VyKE9CSkVDVF9USFVNQl9IRUlHSFQpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuSU1BR0VfV0lEVEgsIG5ldyBJbnRlZ2VyKE9CSkVDVF9JTUFHRV9XSURUSCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5JTUFHRV9IRUlHSFQsIG5ldyBJbnRlZ2VyKE9CSkVDVF9JTUFHRV9IRUlHSFQpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuSU1BR0VfREVQVEgsIG5ldyBJbnRlZ2VyKE9CSkVDVF9JTUFHRV9ERVBUSCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5QQVJFTlQsIG5ldyBJbnRlZ2VyKE9CSkVDVF9QQVJFTlQpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuQVNTT0NJQVRJT05fVFlQRSwgbmV3IEludGVnZXIoT0JKRUNUX0FTU09DSUFUSU9OX1RZUEUpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuQVNTT0NJQVRJT05fREVTQywgbmV3IEludGVnZXIoT0JKRUNUX0FTU09DSUFUSU9OX0RFU0MpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuU0VRVUVOQ0VfTlVNQkVSLCBuZXcgSW50ZWdlcihPQkpFQ1RfU0VRVUVOQ0VfTlVNQkVSKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0Lk5BTUUsIG5ldyBJbnRlZ2VyKE9CSkVDVF9OQU1FKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LkRBVEVfQ1JFQVRFRCwgbmV3IEludGVnZXIoT0JKRUNUX0RBVEVfQ1JFQVRFRCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5EQVRFX01PRElGSUVELCBuZXcgSW50ZWdlcihPQkpFQ1RfREFURV9NT0RJRklFRCkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5LRVlXT1JEUywgbmV3IEludGVnZXIoT0JKRUNUX0tFWVdPUkRTKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlRIVU1CLCBuZXcgSW50ZWdlcihPQkpFQ1RfVEhVTUIpKTsKKworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5OQU1FLCBuZXcgSW50ZWdlcihPQkpFQ1RfTkFNRSkpOworICAgIH0KKworICAgIC8vIHVzZWQgYnkgdGhlIEpOSSBjb2RlCisgICAgcHJpdmF0ZSBpbnQgbU5hdGl2ZUNvbnRleHQ7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zZXR1cChNdHBDbGllbnQgY2xpZW50LCBpbnQgcXVlcnlUeXBlLAorICAgICAgICAgICAgaW50IGRldmljZUlELCBsb25nIHN0b3JhZ2VJRCwgbG9uZyBvYmplY3RJRCwgaW50W10gY29sdW1ucyk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfZmluYWxpemUoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZV93YWl0X2Zvcl9ldmVudCgpOworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVfZmlsbF93aW5kb3coQ3Vyc29yV2luZG93IHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBEYXRhYmFzZS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cERhdGFiYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMwZDcxMTJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cERhdGFiYXNlLmphdmEKQEAgLTAsMCArMSw4MjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuQXVkaW87CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLkZpbGVzOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5JbWFnZXM7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLk1lZGlhQ29sdW1uczsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk10cDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcHVibGljIGNsYXNzIE10cERhdGFiYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTXRwRGF0YWJhc2UiOworCisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgZmluYWwgSUNvbnRlbnRQcm92aWRlciBtTWVkaWFQcm92aWRlcjsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVm9sdW1lTmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFVyaSBtT2JqZWN0c1VyaTsKKworICAgIC8vIHRydWUgaWYgdGhlIGRhdGFiYXNlIGhhcyBiZWVuIG1vZGlmaWVkIGluIHRoZSBjdXJyZW50IE1UUCBzZXNzaW9uCisgICAgcHJpdmF0ZSBib29sZWFuIG1EYXRhYmFzZU1vZGlmaWVkOworCisgICAgLy8gZGF0YWJhc2UgZm9yIHdyaXRhYmxlIE1UUCBkZXZpY2UgcHJvcGVydGllcworICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgbURldmljZVByb3BEYjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRJRVNfREFUQUJBU0VfVkVSU0lPTiA9IDE7CisKKyAgICAvLyBGSVhNRSAtIHRoaXMgc2hvdWxkIGJlIHBhc3NlZCBpbiB2aWEgdGhlIGNvbnN0cnVjdG9yCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVN0b3JhZ2VJRCA9IDB4MDAwMTAwMDE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBJRF9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgIEZpbGVzLkZpbGVDb2x1bW5zLl9JRCwgLy8gMAorICAgIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUEFUSF9TSVpFX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgRmlsZXMuRmlsZUNvbHVtbnMuX0lELCAvLyAwCisgICAgICAgICAgICBGaWxlcy5GaWxlQ29sdW1ucy5EQVRBLCAvLyAxCisgICAgICAgICAgICBGaWxlcy5GaWxlQ29sdW1ucy5TSVpFLCAvLyAyCisgICAgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBPQkpFQ1RfSU5GT19QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgIEZpbGVzLkZpbGVDb2x1bW5zLl9JRCwgLy8gMAorICAgICAgICAgICAgRmlsZXMuRmlsZUNvbHVtbnMuREFUQSwgLy8gMQorICAgICAgICAgICAgRmlsZXMuRmlsZUNvbHVtbnMuRk9STUFULCAvLyAyCisgICAgICAgICAgICBGaWxlcy5GaWxlQ29sdW1ucy5QQVJFTlQsIC8vIDMKKyAgICAgICAgICAgIEZpbGVzLkZpbGVDb2x1bW5zLlNJWkUsIC8vIDQKKyAgICAgICAgICAgIEZpbGVzLkZpbGVDb2x1bW5zLkRBVEVfTU9ESUZJRUQsIC8vIDUKKyAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9XSEVSRSA9IEZpbGVzLkZpbGVDb2x1bW5zLl9JRCArICI9PyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfV0hFUkUgPSBGaWxlcy5GaWxlQ29sdW1ucy5EQVRBICsgIj0/IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX1dIRVJFID0gRmlsZXMuRmlsZUNvbHVtbnMuUEFSRU5UICsgIj0/IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX0ZPUk1BVF9XSEVSRSA9IFBBUkVOVF9XSEVSRSArICIgQU5EICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlcy5GaWxlQ29sdW1ucy5GT1JNQVQgKyAiPT8iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVWSUNFX1BST1BFUlRZX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10geyAiX2lkIiwgInZhbHVlIiB9OworICAgIHByaXZhdGUgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVWSUNFX1BST1BFUlRZX1dIRVJFID0gImNvZGU9PyI7CisKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Nhbm5lciBtTWVkaWFTY2FubmVyOworCisgICAgc3RhdGljIHsKKyAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJtZWRpYV9qbmkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTXRwRGF0YWJhc2UoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgdm9sdW1lTmFtZSkgeworICAgICAgICBuYXRpdmVfc2V0dXAoKTsKKworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1NZWRpYVByb3ZpZGVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5hY3F1aXJlUHJvdmlkZXIoIm1lZGlhIik7CisgICAgICAgIG1Wb2x1bWVOYW1lID0gdm9sdW1lTmFtZTsKKyAgICAgICAgbU9iamVjdHNVcmkgPSBGaWxlcy5nZXRNdHBPYmplY3RzVXJpKHZvbHVtZU5hbWUpOworICAgICAgICBtTWVkaWFTY2FubmVyID0gbmV3IE1lZGlhU2Nhbm5lcihjb250ZXh0KTsKKyAgICAgICAgb3BlbkRldmljZVByb3BlcnRpZXNEYXRhYmFzZShjb250ZXh0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmF0aXZlX2ZpbmFsaXplKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9wZW5EZXZpY2VQcm9wZXJ0aWVzRGF0YWJhc2UoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1EZXZpY2VQcm9wRGIgPSBjb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKCJkZXZpY2UtcHJvcGVydGllcyIsIENvbnRleHQuTU9ERV9QUklWQVRFLCBudWxsKTsKKyAgICAgICAgaW50IHZlcnNpb24gPSBtRGV2aWNlUHJvcERiLmdldFZlcnNpb24oKTsKKworICAgICAgICAvLyBpbml0aWFsaXplIGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAodmVyc2lvbiAhPSBERVZJQ0VfUFJPUEVSVElFU19EQVRBQkFTRV9WRVJTSU9OKSB7CisgICAgICAgICAgICBtRGV2aWNlUHJvcERiLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBwcm9wZXJ0aWVzICgiICsKKyAgICAgICAgICAgICAgICAgICAgIl9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsIiArCisgICAgICAgICAgICAgICAgICAgICJjb2RlIElOVEVHRVIgVU5JUVVFIE9OIENPTkZMSUNUIFJFUExBQ0UsIiArCisgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSBURVhUIiArCisgICAgICAgICAgICAgICAgICAgICIpOyIpOworICAgICAgICAgICAgbURldmljZVByb3BEYi5leGVjU1FMKCJDUkVBVEUgSU5ERVggcHJvcGVydHlfaW5kZXggT04gcHJvcGVydGllcyAoY29kZSk7Iik7CisgICAgICAgICAgICBtRGV2aWNlUHJvcERiLnNldFZlcnNpb24oREVWSUNFX1BST1BFUlRJRVNfREFUQUJBU0VfVkVSU0lPTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBiZWdpblNlbmRPYmplY3QoU3RyaW5nIHBhdGgsIGludCBmb3JtYXQsIGludCBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0b3JhZ2UsIGxvbmcgc2l6ZSwgbG9uZyBtb2RpZmllZCkgeworICAgICAgICBtRGF0YWJhc2VNb2RpZmllZCA9IHRydWU7CisgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgdmFsdWVzLnB1dChGaWxlcy5GaWxlQ29sdW1ucy5EQVRBLCBwYXRoKTsKKyAgICAgICAgdmFsdWVzLnB1dChGaWxlcy5GaWxlQ29sdW1ucy5GT1JNQVQsIGZvcm1hdCk7CisgICAgICAgIHZhbHVlcy5wdXQoRmlsZXMuRmlsZUNvbHVtbnMuUEFSRU5ULCBwYXJlbnQpOworICAgICAgICAvLyBzdG9yYWdlIGlzIGlnbm9yZWQgZm9yIG5vdworICAgICAgICB2YWx1ZXMucHV0KEZpbGVzLkZpbGVDb2x1bW5zLlNJWkUsIHNpemUpOworICAgICAgICB2YWx1ZXMucHV0KEZpbGVzLkZpbGVDb2x1bW5zLkRBVEVfTU9ESUZJRUQsIG1vZGlmaWVkKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVXJpIHVyaSA9IG1NZWRpYVByb3ZpZGVyLmluc2VydChtT2JqZWN0c1VyaSwgdmFsdWVzKTsKKyAgICAgICAgICAgIGlmICh1cmkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHVyaS5nZXRQYXRoU2VnbWVudHMoKS5nZXQoMikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gYmVnaW5TZW5kT2JqZWN0IiwgZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5kU2VuZE9iamVjdChTdHJpbmcgcGF0aCwgaW50IGhhbmRsZSwgaW50IGZvcm1hdCwgYm9vbGVhbiBzdWNjZWVkZWQpIHsKKyAgICAgICAgaWYgKHN1Y2NlZWRlZCkgeworICAgICAgICAgICAgLy8gaGFuZGxlIGFic3RyYWN0IHBsYXlsaXN0cyBzZXBhcmF0ZWx5CisgICAgICAgICAgICAvLyB0aGV5IGRvIG5vdCBleGlzdCBpbiB0aGUgZmlsZSBzeXN0ZW0gc28gZG9uJ3QgdXNlIHRoZSBtZWRpYSBzY2FubmVyIGhlcmUKKyAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gTXRwQ29uc3RhbnRzLkZPUk1BVF9BQlNUUkFDVF9BVl9QTEFZTElTVCkgeworICAgICAgICAgICAgICAgIC8vIFN0cmlwIFdpbmRvd3MgTWVkaWEgUGxheWVyIGZpbGUgZXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoIi5wbGEiKSkgeworICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGV4dHJhY3QgbmFtZSBmcm9tIHBhdGgKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhdGg7CisgICAgICAgICAgICAgICAgaW50IGxhc3RTbGFzaCA9IG5hbWUubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgICAgICBpZiAobGFzdFNsYXNoID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGxhc3RTbGFzaCArIDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoMSk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChBdWRpby5QbGF5bGlzdHMuREFUQSwgcGF0aCk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChBdWRpby5QbGF5bGlzdHMuTkFNRSwgbmFtZSk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChNZWRpYUNvbHVtbnMuTUVESUFfU0NBTk5FUl9ORVdfT0JKRUNUX0lELCBoYW5kbGUpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFVyaSB1cmkgPSBtTWVkaWFQcm92aWRlci5pbnNlcnQoQXVkaW8uUGxheWxpc3RzLkVYVEVSTkFMX0NPTlRFTlRfVVJJLCB2YWx1ZXMpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBlbmRTZW5kT2JqZWN0IiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtTWVkaWFTY2FubmVyLnNjYW5NdHBGaWxlKHBhdGgsIG1Wb2x1bWVOYW1lLCBoYW5kbGUsIGZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWxldGVGaWxlKGhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludFtdIGdldE9iamVjdExpc3QoaW50IHN0b3JhZ2VJRCwgaW50IGZvcm1hdCwgaW50IHBhcmVudCkgeworICAgICAgICAvLyB3ZSBjYW4gaWdub3JlIHN0b3JhZ2VJRCB1bnRpbCB3ZSBzdXBwb3J0IG11bHRpcGxlIHN0b3JhZ2VzCisgICAgICAgIExvZy5kKFRBRywgImdldE9iamVjdExpc3QgcGFyZW50OiAiICsgcGFyZW50KTsKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1PYmplY3RzVXJpLCBJRF9QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkVOVF9GT1JNQVRfV0hFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgSW50ZWdlci50b1N0cmluZyhwYXJlbnQpLCBJbnRlZ2VyLnRvU3RyaW5nKGZvcm1hdCkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtT2JqZWN0c1VyaSwgSURfUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJFTlRfV0hFUkUsIG5ldyBTdHJpbmdbXSB7IEludGVnZXIudG9TdHJpbmcocGFyZW50KSB9LCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJudWxsIGN1cnNvciIpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGNvdW50ID0gYy5nZXRDb3VudCgpOworICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIGludFtdIHJlc3VsdCA9IG5ldyBpbnRbY291bnRdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjLm1vdmVUb05leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gYy5nZXRJbnQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInJldHVybmluZyAiICsgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIGdldE9iamVjdExpc3QiLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0TnVtT2JqZWN0cyhpbnQgc3RvcmFnZUlELCBpbnQgZm9ybWF0LCBpbnQgcGFyZW50KSB7CisgICAgICAgIC8vIHdlIGNhbiBpZ25vcmUgc3RvcmFnZUlEIHVudGlsIHdlIHN1cHBvcnQgbXVsdGlwbGUgc3RvcmFnZXMKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0T2JqZWN0TGlzdCBwYXJlbnQ6ICIgKyBwYXJlbnQpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIElEX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSRU5UX0ZPUk1BVF9XSEVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBJbnRlZ2VyLnRvU3RyaW5nKHBhcmVudCksIEludGVnZXIudG9TdHJpbmcoZm9ybWF0KSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1PYmplY3RzVXJpLCBJRF9QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkVOVF9XSEVSRSwgbmV3IFN0cmluZ1tdIHsgSW50ZWdlci50b1N0cmluZyhwYXJlbnQpIH0sIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjLmdldENvdW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gZ2V0TnVtT2JqZWN0cyIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnRbXSBnZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMoKSB7CisgICAgICAgIHJldHVybiBuZXcgaW50W10geworICAgICAgICAgICAgLy8gYWxsb3cgdHJhbnNmZXJpbmcgYXJiaXRyYXJ5IGZpbGVzCisgICAgICAgICAgICBNdHBDb25zdGFudHMuRk9STUFUX1VOREVGSU5FRCwKKworICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9BU1NPQ0lBVElPTiwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfVEVYVCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfSFRNTCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfV0FWLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9NUDMsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuRk9STUFUX01QRUcsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuRk9STUFUX0VYSUZfSlBFRywKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfVElGRl9FUCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfR0lGLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9KRklGLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9QTkcsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuRk9STUFUX1RJRkYsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuRk9STUFUX1dNQSwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfT0dHLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9BQUMsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuRk9STUFUX01QNF9DT05UQUlORVIsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuRk9STUFUX01QMiwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfM0dQX0NPTlRBSU5FUiwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfQUJTVFJBQ1RfQVZfUExBWUxJU1QsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuRk9STUFUX1dQTF9QTEFZTElTVCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5GT1JNQVRfTTNVX1BMQVlMSVNULAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9QTFNfUExBWUxJU1QsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuRk9STUFUX1hNTF9ET0NVTUVOVCwKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludFtdIGdldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzKCkgeworICAgICAgICAvLyBubyBjYXB0dXJlIGZvcm1hdHMgeWV0CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBpbnRbXSBGSUxFX1BST1BFUlRJRVMgPSB7CisgICAgICAgICAgICAvLyBOT1RFIG11c3QgbWF0Y2ggYmVnaW5uaW5nIG9mIEFVRElPX1BST1BFUlRJRVMsIFZJREVPX1BST1BFUlRJRVMKKyAgICAgICAgICAgIC8vIGFuZCBJTUFHRV9QUk9QRVJUSUVTIGJlbG93CisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfU1RPUkFHRV9JRCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9PQkpFQ1RfRk9STUFULAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX1BST1RFQ1RJT05fU1RBVFVTLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX09CSkVDVF9TSVpFLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX09CSkVDVF9GSUxFX05BTUUsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfREFURV9NT0RJRklFRCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9QQVJFTlRfT0JKRUNULAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX1BFUlNJU1RFTlRfVUlELAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX05BTUUsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfREFURV9BRERFRCwKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIGludFtdIEFVRElPX1BST1BFUlRJRVMgPSB7CisgICAgICAgICAgICAvLyBOT1RFIG11c3QgbWF0Y2ggRklMRV9QUk9QRVJUSUVTIGFib3ZlCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfU1RPUkFHRV9JRCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9PQkpFQ1RfRk9STUFULAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX1BST1RFQ1RJT05fU1RBVFVTLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX09CSkVDVF9TSVpFLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX09CSkVDVF9GSUxFX05BTUUsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfREFURV9NT0RJRklFRCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9QQVJFTlRfT0JKRUNULAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX1BFUlNJU1RFTlRfVUlELAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX05BTUUsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfRElTUExBWV9OQU1FLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0RBVEVfQURERUQsCisKKyAgICAgICAgICAgIC8vIGF1ZGlvIHNwZWNpZmljIHByb3BlcnRpZXMKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9BUlRJU1QsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfQUxCVU1fTkFNRSwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9BTEJVTV9BUlRJU1QsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfVFJBQ0ssCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfT1JJR0lOQUxfUkVMRUFTRV9EQVRFLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0RVUkFUSU9OLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0dFTlJFLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0NPTVBPU0VSLAorICAgIH07CisKKyAgICBzdGF0aWMgZmluYWwgaW50W10gVklERU9fUFJPUEVSVElFUyA9IHsKKyAgICAgICAgICAgIC8vIE5PVEUgbXVzdCBtYXRjaCBGSUxFX1BST1BFUlRJRVMgYWJvdmUKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9TVE9SQUdFX0lELAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX09CSkVDVF9GT1JNQVQsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfUFJPVEVDVElPTl9TVEFUVVMsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfT0JKRUNUX1NJWkUsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfT0JKRUNUX0ZJTEVfTkFNRSwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9EQVRFX01PRElGSUVELAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX1BBUkVOVF9PQkpFQ1QsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfUEVSU0lTVEVOVF9VSUQsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfTkFNRSwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9ESVNQTEFZX05BTUUsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfREFURV9BRERFRCwKKworICAgICAgICAgICAgLy8gdmlkZW8gc3BlY2lmaWMgcHJvcGVydGllcworICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0FSVElTVCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9BTEJVTV9OQU1FLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0RVUkFUSU9OLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0RFU0NSSVBUSU9OLAorICAgIH07CisKKyAgICBzdGF0aWMgZmluYWwgaW50W10gSU1BR0VfUFJPUEVSVElFUyA9IHsKKyAgICAgICAgICAgIC8vIE5PVEUgbXVzdCBtYXRjaCBGSUxFX1BST1BFUlRJRVMgYWJvdmUKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9TVE9SQUdFX0lELAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX09CSkVDVF9GT1JNQVQsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfUFJPVEVDVElPTl9TVEFUVVMsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfT0JKRUNUX1NJWkUsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfT0JKRUNUX0ZJTEVfTkFNRSwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9EQVRFX01PRElGSUVELAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX1BBUkVOVF9PQkpFQ1QsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfUEVSU0lTVEVOVF9VSUQsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfTkFNRSwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9ESVNQTEFZX05BTUUsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfREFURV9BRERFRCwKKworICAgICAgICAgICAgLy8gaW1hZ2Ugc3BlY2lmaWMgcHJvcGVydGllcworICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0RFU0NSSVBUSU9OLAorICAgIH07CisKKyAgICBwcml2YXRlIGludFtdIGdldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMoaW50IGZvcm1hdCkgeworICAgICAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuRk9STUFUX01QMzoKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLkZPUk1BVF9XQVY6CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5GT1JNQVRfV01BOgorICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuRk9STUFUX09HRzoKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLkZPUk1BVF9BQUM6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BST1BFUlRJRVM7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5GT1JNQVRfTVBFRzoKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLkZPUk1BVF8zR1BfQ09OVEFJTkVSOgorICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuRk9STUFUX1dNVjoKKyAgICAgICAgICAgICAgICByZXR1cm4gVklERU9fUFJPUEVSVElFUzsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLkZPUk1BVF9FWElGX0pQRUc6CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5GT1JNQVRfR0lGOgorICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuRk9STUFUX1BORzoKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLkZPUk1BVF9CTVA6CisgICAgICAgICAgICAgICAgcmV0dXJuIElNQUdFX1BST1BFUlRJRVM7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBGSUxFX1BST1BFUlRJRVM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludFtdIGdldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgaW50W10geworICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkRFVklDRV9QUk9QRVJUWV9TWU5DSFJPTklaQVRJT05fUEFSVE5FUiwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5ERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0ZSSUVORExZX05BTUUsCisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgcXVlcnlTdHJpbmcoaW50IGlkLCBTdHJpbmcgY29sdW1uKSB7CisgICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGZvciBub3cgd2UgYXJlIG9ubHkgcmVhZGluZyBwcm9wZXJ0aWVzIGZyb20gdGhlICJvYmplY3RzIiB0YWJsZQorICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1PYmplY3RzVXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcgW10geyBGaWxlcy5GaWxlQ29sdW1ucy5fSUQsIGNvbHVtbiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEX1dIRVJFLCBuZXcgU3RyaW5nW10geyBJbnRlZ2VyLnRvU3RyaW5nKGlkKSB9LCBudWxsKTsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYy5nZXRTdHJpbmcoMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5R2VucmUoaW50IGlkKSB7CisgICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVyaSB1cmkgPSBBdWRpby5HZW5yZXMuZ2V0Q29udGVudFVyaUZvckF1ZGlvSWQobVZvbHVtZU5hbWUsIGlkKTsKKyAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeSh1cmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyBbXSB7IEZpbGVzLkZpbGVDb2x1bW5zLl9JRCwgQXVkaW8uR2VucmVzQ29sdW1ucy5OQU1FIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsICYmIGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMuZ2V0U3RyaW5nKDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJxdWVyeUdlbnJlIGV4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHF1ZXJ5SW50KGludCBpZCwgU3RyaW5nIGNvbHVtbiwgbG9uZ1tdIG91dFZhbHVlKSB7CisgICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGZvciBub3cgd2UgYXJlIG9ubHkgcmVhZGluZyBwcm9wZXJ0aWVzIGZyb20gdGhlICJvYmplY3RzIiB0YWJsZQorICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1PYmplY3RzVXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcgW10geyBGaWxlcy5GaWxlQ29sdW1ucy5fSUQsIGNvbHVtbiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEX1dIRVJFLCBuZXcgU3RyaW5nW10geyBJbnRlZ2VyLnRvU3RyaW5nKGlkKSB9LCBudWxsKTsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBvdXRWYWx1ZVswXSA9IGMuZ2V0TG9uZygxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lRnJvbVBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgLy8gZXh0cmFjdCBuYW1lIGZyb20gZnVsbCBwYXRoCisgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgIGludCBsYXN0U2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgIGlmIChsYXN0U2xhc2ggPj0gMCkgeworICAgICAgICAgICAgc3RhcnQgPSBsYXN0U2xhc2ggKyAxOworICAgICAgICB9CisgICAgICAgIGludCBlbmQgPSBwYXRoLmxlbmd0aCgpOworICAgICAgICBpZiAoZW5kIC0gc3RhcnQgPiAyNTUpIHsKKyAgICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgMjU1OworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXRoLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRPYmplY3RQcm9wZXJ0eShpbnQgaGFuZGxlLCBpbnQgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ1tdIG91dEludFZhbHVlLCBjaGFyW10gb3V0U3RyaW5nVmFsdWUpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0T2JqZWN0UHJvcGVydHk6ICIgKyBwcm9wZXJ0eSk7CisgICAgICAgIFN0cmluZyBjb2x1bW4gPSBudWxsOworICAgICAgICBib29sZWFuIGlzU3RyaW5nID0gZmFsc2U7CisKKyAgICAgICAgc3dpdGNoIChwcm9wZXJ0eSkgeworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfU1RPUkFHRV9JRDoKKyAgICAgICAgICAgICAgICBvdXRJbnRWYWx1ZVswXSA9IG1TdG9yYWdlSUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9PSzsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX09CSkVDVF9GT1JNQVQ6CisgICAgICAgICAgICAgICAgY29sdW1uID0gRmlsZXMuRmlsZUNvbHVtbnMuRk9STUFUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfUFJPVEVDVElPTl9TVEFUVVM6CisgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGlvbiBzdGF0dXMgaXMgYWx3YXlzIDAKKyAgICAgICAgICAgICAgICBvdXRJbnRWYWx1ZVswXSA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9PSzsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX09CSkVDVF9TSVpFOgorICAgICAgICAgICAgICAgIGNvbHVtbiA9IEZpbGVzLkZpbGVDb2x1bW5zLlNJWkU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FOgorICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSAtIG5lZWQgdG8gZXh0cmFjdCBmaWxlIG5hbWUgZnJvbSBmdWxsIHBhdGgKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBxdWVyeVN0cmluZyhoYW5kbGUsIEZpbGVzLkZpbGVDb2x1bW5zLkRBVEEpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmFtZUZyb21QYXRoKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUuZ2V0Q2hhcnMoMCwgdmFsdWUubGVuZ3RoKCksIG91dFN0cmluZ1ZhbHVlLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0U3RyaW5nVmFsdWVbdmFsdWUubGVuZ3RoKCldID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9PSzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5QUk9QRVJUWV9OQU1FOgorICAgICAgICAgICAgICAgIC8vIGZpcnN0IHRyeSB0aXRsZQorICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcXVlcnlTdHJpbmcoaGFuZGxlLCBNZWRpYUNvbHVtbnMuVElUTEUpOworICAgICAgICAgICAgICAgIC8vIHRoZW4gdHJ5IG5hbWUKKyAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBxdWVyeVN0cmluZyhoYW5kbGUsIEF1ZGlvLlBsYXlsaXN0c0NvbHVtbnMuTkFNRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGlmIHRpdGxlIGFuZCBuYW1lIGZhaWwsIGV4dHJhY3QgbmFtZSBmcm9tIGZ1bGwgcGF0aAorICAgICAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHF1ZXJ5U3RyaW5nKGhhbmRsZSwgRmlsZXMuRmlsZUNvbHVtbnMuREFUQSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lRnJvbVBhdGgobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBuYW1lLmdldENoYXJzKDAsIG5hbWUubGVuZ3RoKCksIG91dFN0cmluZ1ZhbHVlLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0U3RyaW5nVmFsdWVbbmFtZS5sZW5ndGgoKV0gPSAwOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09LOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0RBVEVfTU9ESUZJRUQ6CisgICAgICAgICAgICAgICAgY29sdW1uID0gRmlsZXMuRmlsZUNvbHVtbnMuREFURV9NT0RJRklFRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0RBVEVfQURERUQ6CisgICAgICAgICAgICAgICAgY29sdW1uID0gRmlsZXMuRmlsZUNvbHVtbnMuREFURV9BRERFRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX09SSUdJTkFMX1JFTEVBU0VfREFURToKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSBBdWRpby5BdWRpb0NvbHVtbnMuWUVBUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX1BBUkVOVF9PQkpFQ1Q6CisgICAgICAgICAgICAgICAgY29sdW1uID0gRmlsZXMuRmlsZUNvbHVtbnMuUEFSRU5UOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfUEVSU0lTVEVOVF9VSUQ6CisgICAgICAgICAgICAgICAgLy8gUFVJRCBpcyBjb25jYXRlbmF0aW9uIG9mIHN0b3JhZ2VJRCBhbmQgb2JqZWN0IGhhbmRsZQorICAgICAgICAgICAgICAgIGxvbmcgcHVpZCA9IG1TdG9yYWdlSUQ7CisgICAgICAgICAgICAgICAgcHVpZCA8PD0gMzI7CisgICAgICAgICAgICAgICAgcHVpZCArPSBoYW5kbGU7CisgICAgICAgICAgICAgICAgb3V0SW50VmFsdWVbMF0gPSBwdWlkOworICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0s7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5QUk9QRVJUWV9EVVJBVElPTjoKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSBBdWRpby5BdWRpb0NvbHVtbnMuRFVSQVRJT047CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5QUk9QRVJUWV9UUkFDSzoKKyAgICAgICAgICAgICAgICBpZiAocXVlcnlJbnQoaGFuZGxlLCBBdWRpby5BdWRpb0NvbHVtbnMuVFJBQ0ssIG91dEludFZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICAvLyB0cmFjayBpcyBzdG9yZWQgaW4gbG93ZXIgMyBkZWNpbWFsIGRpZ2l0cworICAgICAgICAgICAgICAgICAgICBvdXRJbnRWYWx1ZVswXSAlPSAxMDAwOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09LOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0RJU1BMQVlfTkFNRToKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSBNZWRpYUNvbHVtbnMuRElTUExBWV9OQU1FOworICAgICAgICAgICAgICAgIGlzU3RyaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0FSVElTVDoKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSBBdWRpby5BdWRpb0NvbHVtbnMuQVJUSVNUOworICAgICAgICAgICAgICAgIGlzU3RyaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0FMQlVNX05BTUU6CisgICAgICAgICAgICAgICAgY29sdW1uID0gQXVkaW8uQXVkaW9Db2x1bW5zLkFMQlVNOworICAgICAgICAgICAgICAgIGlzU3RyaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0FMQlVNX0FSVElTVDoKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSBBdWRpby5BdWRpb0NvbHVtbnMuQUxCVU1fQVJUSVNUOworICAgICAgICAgICAgICAgIGlzU3RyaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0dFTlJFOgorICAgICAgICAgICAgICAgIFN0cmluZyBnZW5yZSA9IHF1ZXJ5R2VucmUoaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoZ2VucmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBnZW5yZS5nZXRDaGFycygwLCBnZW5yZS5sZW5ndGgoKSwgb3V0U3RyaW5nVmFsdWUsIDApOworICAgICAgICAgICAgICAgICAgICBvdXRTdHJpbmdWYWx1ZVtnZW5yZS5sZW5ndGgoKV0gPSAwOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09LOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX0NPTVBPU0VSOgorICAgICAgICAgICAgICAgIGNvbHVtbiA9IEF1ZGlvLkF1ZGlvQ29sdW1ucy5DT01QT1NFUjsKKyAgICAgICAgICAgICAgICBpc1N0cmluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5QUk9QRVJUWV9ERVNDUklQVElPTjoKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSBJbWFnZXMuSW1hZ2VDb2x1bW5zLkRFU0NSSVBUSU9OOworICAgICAgICAgICAgICAgIGlzU3RyaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9PQkpFQ1RfUFJPUF9OT1RfU1VQUE9SVEVEOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzU3RyaW5nKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBxdWVyeVN0cmluZyhoYW5kbGUsIGNvbHVtbik7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZhbHVlLmdldENoYXJzKDAsIHZhbHVlLmxlbmd0aCgpLCBvdXRTdHJpbmdWYWx1ZSwgMCk7CisgICAgICAgICAgICAgICAgb3V0U3RyaW5nVmFsdWVbdmFsdWUubGVuZ3RoKCldID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09LOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHF1ZXJ5SW50KGhhbmRsZSwgY29sdW1uLCBvdXRJbnRWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHF1ZXJ5IGZhaWxlZCBpZiB3ZSBnZXQgaGVyZQorICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBzZXRPYmplY3RQcm9wZXJ0eShpbnQgaGFuZGxlLCBpbnQgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBpbnRWYWx1ZSwgU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisgICAgICAgIExvZy5kKFRBRywgInNldE9iamVjdFByb3BlcnR5OiAiICsgcHJvcGVydHkpOworICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09CSkVDVF9QUk9QX05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0RGV2aWNlUHJvcGVydHkoaW50IHByb3BlcnR5LCBsb25nW10gb3V0SW50VmFsdWUsIGNoYXJbXSBvdXRTdHJpbmdWYWx1ZSkgeworICAgICAgICBMb2cuZChUQUcsICJnZXREZXZpY2VQcm9wZXJ0eTogIiArIHByb3BlcnR5KTsKKworICAgICAgICBzd2l0Y2ggKHByb3BlcnR5KSB7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5ERVZJQ0VfUFJPUEVSVFlfU1lOQ0hST05JWkFUSU9OX1BBUlRORVI6CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5ERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0ZSSUVORExZX05BTUU6CisgICAgICAgICAgICAgICAgLy8gd3JpdGFibGUgc3RyaW5nIHByb3BlcnRpZXMga2VwdCBpbiBvdXIgZGV2aWNlIHByb3BlcnR5IGRhdGFiYXNlCisgICAgICAgICAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSBtRGV2aWNlUHJvcERiLnF1ZXJ5KCJwcm9wZXJ0aWVzIiwgREVWSUNFX1BST1BFUlRZX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICBERVZJQ0VfUFJPUEVSVFlfV0hFUkUsIG5ldyBTdHJpbmdbXSB7ICBJbnRlZ2VyLnRvU3RyaW5nKHByb3BlcnR5KSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYy5nZXRTdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gMjU1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gMjU1OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuZ2V0Q2hhcnMoMCwgbGVuZ3RoLCBvdXRTdHJpbmdWYWx1ZSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRTdHJpbmdWYWx1ZVtsZW5ndGhdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFN0cmluZ1ZhbHVlWzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09LOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfREVWSUNFX1BST1BfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBzZXREZXZpY2VQcm9wZXJ0eShpbnQgcHJvcGVydHksIGxvbmcgaW50VmFsdWUsIFN0cmluZyBzdHJpbmdWYWx1ZSkgeworICAgICAgICBMb2cuZChUQUcsICJzZXREZXZpY2VQcm9wZXJ0eTogIiArIHByb3BlcnR5ICsgIiA6ICIgKyBzdHJpbmdWYWx1ZSk7CisKKyAgICAgICAgc3dpdGNoIChwcm9wZXJ0eSkgeworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuREVWSUNFX1BST1BFUlRZX1NZTkNIUk9OSVpBVElPTl9QQVJUTkVSOgorICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuREVWSUNFX1BST1BFUlRZX0RFVklDRV9GUklFTkRMWV9OQU1FOgorICAgICAgICAgICAgICAgIC8vIHdyaXRhYmxlIHN0cmluZyBwcm9wZXJ0aWVzIGtlcHQgaW4gb3VyIGRldmljZSBwcm9wZXJ0eSBkYXRhYmFzZQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dCgiY29kZSIsIHByb3BlcnR5KTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dCgidmFsdWUiLCBzdHJpbmdWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VQcm9wRGIuaW5zZXJ0KCJwcm9wZXJ0aWVzIiwgImNvZGUiLCB2YWx1ZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09LOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX0RFVklDRV9QUk9QX05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGdldE9iamVjdEluZm8oaW50IGhhbmRsZSwgaW50W10gb3V0U3RvcmFnZUZvcm1hdFBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBvdXROYW1lLCBsb25nW10gb3V0U2l6ZU1vZGlmaWVkKSB7CisgICAgICAgIExvZy5kKFRBRywgImdldE9iamVjdEluZm86ICIgKyBoYW5kbGUpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIE9CSkVDVF9JTkZPX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURfV0hFUkUsIG5ldyBTdHJpbmdbXSB7ICBJbnRlZ2VyLnRvU3RyaW5nKGhhbmRsZSkgfSwgbnVsbCk7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsICYmIGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgb3V0U3RvcmFnZUZvcm1hdFBhcmVudFswXSA9IG1TdG9yYWdlSUQ7CisgICAgICAgICAgICAgICAgb3V0U3RvcmFnZUZvcm1hdFBhcmVudFsxXSA9IGMuZ2V0SW50KDIpOworICAgICAgICAgICAgICAgIG91dFN0b3JhZ2VGb3JtYXRQYXJlbnRbMl0gPSBjLmdldEludCgzKTsKKworICAgICAgICAgICAgICAgIC8vIGV4dHJhY3QgbmFtZSBmcm9tIHBhdGgKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGMuZ2V0U3RyaW5nKDEpOworICAgICAgICAgICAgICAgIGludCBsYXN0U2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gKGxhc3RTbGFzaCA+PSAwID8gbGFzdFNsYXNoICsgMSA6IDApOworICAgICAgICAgICAgICAgIGludCBlbmQgPSBwYXRoLmxlbmd0aCgpOworICAgICAgICAgICAgICAgIGlmIChlbmQgLSBzdGFydCA+IDI1NSkgeworICAgICAgICAgICAgICAgICAgICBlbmQgPSBzdGFydCArIDI1NTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGF0aC5nZXRDaGFycyhzdGFydCwgZW5kLCBvdXROYW1lLCAwKTsKKyAgICAgICAgICAgICAgICBvdXROYW1lW2VuZCAtIHN0YXJ0XSA9IDA7CisKKyAgICAgICAgICAgICAgICBvdXRTaXplTW9kaWZpZWRbMF0gPSBjLmdldExvbmcoNCk7CisgICAgICAgICAgICAgICAgb3V0U2l6ZU1vZGlmaWVkWzFdID0gYy5nZXRMb25nKDUpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIGdldE9iamVjdFByb3BlcnR5IiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRPYmplY3RGaWxlUGF0aChpbnQgaGFuZGxlLCBjaGFyW10gb3V0RmlsZVBhdGgsIGxvbmdbXSBvdXRGaWxlTGVuZ3RoKSB7CisgICAgICAgIExvZy5kKFRBRywgImdldE9iamVjdEZpbGVQYXRoOiAiICsgaGFuZGxlKTsKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1PYmplY3RzVXJpLCBQQVRIX1NJWkVfUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRF9XSEVSRSwgbmV3IFN0cmluZ1tdIHsgIEludGVnZXIudG9TdHJpbmcoaGFuZGxlKSB9LCBudWxsKTsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGMuZ2V0U3RyaW5nKDEpOworICAgICAgICAgICAgICAgIHBhdGguZ2V0Q2hhcnMoMCwgcGF0aC5sZW5ndGgoKSwgb3V0RmlsZVBhdGgsIDApOworICAgICAgICAgICAgICAgIG91dEZpbGVQYXRoW3BhdGgubGVuZ3RoKCldID0gMDsKKyAgICAgICAgICAgICAgICBvdXRGaWxlTGVuZ3RoWzBdID0gYy5nZXRMb25nKDIpOworICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0s7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIGdldE9iamVjdEZpbGVQYXRoIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZGVsZXRlUmVjdXJzaXZlKGludCBoYW5kbGUpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBpbnRbXSBjaGlsZHJlbiA9IGdldE9iamVjdExpc3QoMCAvKiBzdG9yYWdlSUQgKi8sIDAgLyogZm9ybWF0ICovLCBoYW5kbGUpOworICAgICAgICBVcmkgdXJpID0gRmlsZXMuZ2V0TXRwT2JqZWN0c1VyaShtVm9sdW1lTmFtZSwgaGFuZGxlKTsKKyAgICAgICAgLy8gZGVsZXRlIHBhcmVudCBmaXJzdCwgdG8gYXZvaWQgcG90ZW50aWFsIGluZmluaXRlIHJlY3Vyc2lvbgorICAgICAgICBpbnQgY291bnQgPSBtTWVkaWFQcm92aWRlci5kZWxldGUodXJpLCBudWxsLCBudWxsKTsKKyAgICAgICAgaWYgKGNvdW50ID09IDEpIHsKKyAgICAgICAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBkZWxldGVSZWN1cnNpdmUoY2hpbGRyZW5baV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZGVsZXRlRmlsZShpbnQgaGFuZGxlKSB7CisgICAgICAgIExvZy5kKFRBRywgImRlbGV0ZUZpbGU6ICIgKyBoYW5kbGUpOworICAgICAgICBtRGF0YWJhc2VNb2RpZmllZCA9IHRydWU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZGVsZXRlUmVjdXJzaXZlKGhhbmRsZSkgPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9PSzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gZGVsZXRlRmlsZSIsIGUpOworICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnRbXSBnZXRPYmplY3RSZWZlcmVuY2VzKGludCBoYW5kbGUpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0T2JqZWN0UmVmZXJlbmNlcyBmb3I6ICIgKyBoYW5kbGUpOworICAgICAgICBVcmkgdXJpID0gRmlsZXMuZ2V0TXRwUmVmZXJlbmNlc1VyaShtVm9sdW1lTmFtZSwgaGFuZGxlKTsKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KHVyaSwgSURfUFJPSkVDVElPTiwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBpZiAoYyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgY291bnQgPSBjLmdldENvdW50KCk7CisgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50W10gcmVzdWx0ID0gbmV3IGludFtjb3VudF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGMubW92ZVRvTmV4dCgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBjLmdldEludCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBnZXRPYmplY3RMaXN0IiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgaW50IHNldE9iamVjdFJlZmVyZW5jZXMoaW50IGhhbmRsZSwgaW50W10gcmVmZXJlbmNlcykgeworICAgICAgICBtRGF0YWJhc2VNb2RpZmllZCA9IHRydWU7CisgICAgICAgIFVyaSB1cmkgPSBGaWxlcy5nZXRNdHBSZWZlcmVuY2VzVXJpKG1Wb2x1bWVOYW1lLCBoYW5kbGUpOworICAgICAgICBpbnQgY291bnQgPSByZWZlcmVuY2VzLmxlbmd0aDsKKyAgICAgICAgQ29udGVudFZhbHVlc1tdIHZhbHVlc0xpc3QgPSBuZXcgQ29udGVudFZhbHVlc1tjb3VudF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAgICAgdmFsdWVzLnB1dChGaWxlcy5GaWxlQ29sdW1ucy5fSUQsIHJlZmVyZW5jZXNbaV0pOworICAgICAgICAgICAgdmFsdWVzTGlzdFtpXSA9IHZhbHVlczsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGNvdW50ID09IG1NZWRpYVByb3ZpZGVyLmJ1bGtJbnNlcnQodXJpLCB2YWx1ZXNMaXN0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gc2V0T2JqZWN0UmVmZXJlbmNlcyIsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2Vzc2lvblN0YXJ0ZWQoKSB7CisgICAgICAgIExvZy5kKFRBRywgInNlc3Npb25TdGFydGVkIik7CisgICAgICAgIG1EYXRhYmFzZU1vZGlmaWVkID0gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlc3Npb25FbmRlZCgpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAic2Vzc2lvbkVuZGVkIik7CisgICAgICAgIGlmIChtRGF0YWJhc2VNb2RpZmllZCkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAic2VuZGluZyBBQ1RJT05fTVRQX1NFU1NJT05fRU5EIik7CisgICAgICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoTXRwLkFDVElPTl9NVFBfU0VTU0lPTl9FTkQpKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZU1vZGlmaWVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1c2VkIGJ5IHRoZSBKTkkgY29kZQorICAgIHByaXZhdGUgaW50IG1OYXRpdmVDb250ZXh0OworCisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc2V0dXAoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cFNlcnZlci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cFNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMTUyNzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwU2VydmVyLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogSmF2YSB3cmFwcGVyIGZvciBNVFAvUFRQIHN1cHBvcnQgYXMgVVNCIHJlc3BvbmRlci4KKyAqIHtAaGlkZX0KKyAqLworcHVibGljIGNsYXNzIE10cFNlcnZlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk10cFNlcnZlciI7CisKKyAgICBzdGF0aWMgeworICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIm1lZGlhX2puaSIpOworICAgIH0KKworICAgIHB1YmxpYyBNdHBTZXJ2ZXIoTXRwRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyBzdG9yYWdlUGF0aCkgeworICAgICAgICBuYXRpdmVfc2V0dXAoZGF0YWJhc2UsIHN0b3JhZ2VQYXRoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmF0aXZlX2ZpbmFsaXplKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIG5hdGl2ZV9zdGFydCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIG5hdGl2ZV9zdG9wKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VuZE9iamVjdEFkZGVkKGludCBoYW5kbGUpIHsKKyAgICAgICAgbmF0aXZlX3NlbmRfb2JqZWN0X2FkZGVkKGhhbmRsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VuZE9iamVjdFJlbW92ZWQoaW50IGhhbmRsZSkgeworICAgICAgICBuYXRpdmVfc2VuZF9vYmplY3RfcmVtb3ZlZChoYW5kbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFB0cE1vZGUoYm9vbGVhbiB1c2VQdHApIHsKKyAgICAgICAgbmF0aXZlX3NldF9wdHBfbW9kZSh1c2VQdHApOworICAgIH0KKworICAgIC8vIHVzZWQgYnkgdGhlIEpOSSBjb2RlCisgICAgcHJpdmF0ZSBpbnQgbU5hdGl2ZUNvbnRleHQ7CisKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zZXR1cChNdHBEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHN0b3JhZ2VQYXRoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpOworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3N0YXJ0KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc3RvcCgpOworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NlbmRfb2JqZWN0X2FkZGVkKGludCBoYW5kbGUpOworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NlbmRfb2JqZWN0X3JlbW92ZWQoaW50IGhhbmRsZSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc2V0X3B0cF9tb2RlKGJvb2xlYW4gdXNlUHRwKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9BdWRpb1RyYWNrLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvQXVkaW9UcmFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNlYmFkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvQXVkaW9UcmFjay5qYXZhCkBAIC0wLDAgKzEsNjA3IEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS52aWRlb2VkaXRvcjsNCisNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCisNCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsNCisNCisvKioNCisgKiBUaGlzIGNsYXNzIGFsbG93cyB0byBoYW5kbGUgYW4gYXVkaW8gdHJhY2suIFRoaXMgYXVkaW8gZmlsZSBpcyBtaXhlZCB3aXRoIHRoZQ0KKyAqIGF1ZGlvIHNhbXBsZXMgb2YgdGhlIE1lZGlhSXRlbXMuDQorICoge0BoaWRlfQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBdWRpb1RyYWNrIHsNCisgICAgLy8gTG9nZ2luZw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkF1ZGlvVHJhY2siOw0KKw0KKyAgICAvLyBJbnN0YW5jZSB2YXJpYWJsZXMNCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVVuaXF1ZUlkOw0KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRmlsZW5hbWU7DQorICAgIHByaXZhdGUgbG9uZyBtU3RhcnRUaW1lTXM7DQorICAgIHByaXZhdGUgbG9uZyBtVGltZWxpbmVEdXJhdGlvbk1zOw0KKyAgICBwcml2YXRlIGludCBtVm9sdW1lUGVyY2VudDsNCisgICAgcHJpdmF0ZSBsb25nIG1CZWdpbkJvdW5kYXJ5VGltZU1zOw0KKyAgICBwcml2YXRlIGxvbmcgbUVuZEJvdW5kYXJ5VGltZU1zOw0KKyAgICBwcml2YXRlIGJvb2xlYW4gbUxvb3A7DQorICAgIHByaXZhdGUgYm9vbGVhbiBtTXV0ZWQ7DQorDQorICAgIHByaXZhdGUgZmluYWwgbG9uZyBtRHVyYXRpb25NczsNCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUF1ZGlvQ2hhbm5lbHM7DQorICAgIHByaXZhdGUgZmluYWwgaW50IG1BdWRpb1R5cGU7DQorICAgIHByaXZhdGUgZmluYWwgaW50IG1BdWRpb0JpdHJhdGU7DQorICAgIHByaXZhdGUgZmluYWwgaW50IG1BdWRpb1NhbXBsaW5nRnJlcXVlbmN5Ow0KKw0KKyAgICAvLyBEdWNraW5nIHZhcmlhYmxlcw0KKyAgICBwcml2YXRlIGludCBtRHVja2luZ1RocmVzaG9sZDsNCisgICAgcHJpdmF0ZSBpbnQgbUR1Y2tpbmdMb3dWb2x1bWU7DQorICAgIHByaXZhdGUgYm9vbGVhbiBtSXNEdWNraW5nRW5hYmxlZDsNCisNCisgICAgLy8gVGhlIGF1ZGlvIHdhdmVmb3JtIGZpbGVuYW1lDQorICAgIHByaXZhdGUgU3RyaW5nIG1BdWRpb1dhdmVmb3JtRmlsZW5hbWU7DQorICAgIHByaXZhdGUgUGxheWJhY2tUaHJlYWQgbVBsYXliYWNrVGhyZWFkOw0KKw0KKyAgICAvKioNCisgICAgICogVGhpcyBsaXN0ZW5lciBpbnRlcmZhY2UgaXMgdXNlZCBieSB0aGUgQXVkaW9UcmFjayB0byBlbWl0IHBsYXliYWNrDQorICAgICAqIHByb2dyZXNzIG5vdGlmaWNhdGlvbnMuDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFBsYXliYWNrUHJvZ3Jlc3NMaXN0ZW5lciB7DQorICAgICAgICAvKioNCisgICAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIHRoZSBsaXN0ZW5lciBvZiB0aGUgY3VycmVudCB0aW1lIHBvc2l0aW9uIHdoaWxlDQorICAgICAgICAgKiBwbGF5aW5nIGFuIGF1ZGlvIHRyYWNrDQorICAgICAgICAgKg0KKyAgICAgICAgICogQHBhcmFtIGF1ZGlvVHJhY2sgVGhlIGF1ZGlvIHRyYWNrDQorICAgICAgICAgKiBAcGFyYW0gdGltZU1zIFRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIChleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzDQorICAgICAgICAgKiAgICAgICAgICAgIHNpbmNlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGF1ZGlvIHRyYWNrKS4NCisgICAgICAgICAqIEBwYXJhbSBlbmQgdHJ1ZSBpZiB0aGUgZW5kIG9mIHRoZSBhdWRpbyB0cmFjayB3YXMgcmVhY2hlZA0KKyAgICAgICAgICovDQorICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzKEF1ZGlvVHJhY2sgYXVkaW9UcmFjaywgbG9uZyB0aW1lTXMsIGJvb2xlYW4gZW5kKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVGhlIHBsYXliYWNrIHRocmVhZA0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBjbGFzcyBQbGF5YmFja1RocmVhZCBleHRlbmRzIFRocmVhZCB7DQorICAgICAgICAvLyBJbnN0YW5jZSB2YXJpYWJsZXMNCisgICAgICAgIHByaXZhdGUgZmluYWwgUGxheWJhY2tQcm9ncmVzc0xpc3RlbmVyIG1MaXN0ZW5lcjsNCisgICAgICAgIHByaXZhdGUgZmluYWwgbG9uZyBtRnJvbU1zLCBtVG9NczsNCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtUnVuOw0KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Mb29wOw0KKyAgICAgICAgcHJpdmF0ZSBsb25nIG1Qb3NpdGlvbk1zOw0KKw0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBDb25zdHJ1Y3Rvcg0KKyAgICAgICAgICoNCisgICAgICAgICAqIEBwYXJhbSBmcm9tTXMgVGhlIHRpbWUgKHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGF1ZGlvIHRyYWNrKQ0KKyAgICAgICAgICogICAgICAgICAgICBhdCB3aGljaCB0aGUgcGxheWJhY2sgd2lsbCBzdGFydA0KKyAgICAgICAgICogQHBhcmFtIHRvTXMgVGhlIHRpbWUgKHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGF1ZGlvIHRyYWNrKSBhdA0KKyAgICAgICAgICogICAgICAgICAgICB3aGljaCB0aGUgcGxheWJhY2sgd2lsbCBzdG9wLiBVc2UgLTEgdG8gcGxheSB0byB0aGUgZW5kIG9mDQorICAgICAgICAgKiAgICAgICAgICAgIHRoZSBhdWRpbyB0cmFjaw0KKyAgICAgICAgICogQHBhcmFtIGxvb3AgdHJ1ZSBpZiB0aGUgcGxheWJhY2sgc2hvdWxkIGJlIGxvb3BlZCBvbmNlIGl0IHJlYWNoZXMgdGhlDQorICAgICAgICAgKiAgICAgICAgICAgIGVuZA0KKyAgICAgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB3aGljaCB3aWxsIGJlIG5vdGlmaWVkIG9mIHRoZSBwbGF5YmFjaw0KKyAgICAgICAgICogICAgICAgICAgICBwcm9ncmVzcw0KKyAgICAgICAgICovDQorICAgICAgICBwdWJsaWMgUGxheWJhY2tUaHJlYWQobG9uZyBmcm9tTXMsIGxvbmcgdG9NcywgYm9vbGVhbiBsb29wLA0KKyAgICAgICAgICAgICAgICBQbGF5YmFja1Byb2dyZXNzTGlzdGVuZXIgbGlzdGVuZXIpIHsNCisgICAgICAgICAgICBtUG9zaXRpb25NcyA9IG1Gcm9tTXMgPSBmcm9tTXM7DQorICAgICAgICAgICAgaWYgKHRvTXMgPCAwKSB7DQorICAgICAgICAgICAgICAgIG1Ub01zID0gbUR1cmF0aW9uTXM7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgbVRvTXMgPSB0b01zOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtTG9vcCA9IGxvb3A7DQorICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7DQorICAgICAgICAgICAgbVJ1biA9IHRydWU7DQorICAgICAgICB9DQorDQorICAgICAgICAvKg0KKyAgICAgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgICAgICovDQorICAgICAgICBAT3ZlcnJpZGUNCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsNCisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7DQorICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIj09PT4gUGxheWJhY2tUaHJlYWQucnVuIGVudGVyIik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHdoaWxlIChtUnVuKSB7DQorICAgICAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICAgICAgICBzbGVlcCgxMDApOw0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgbVBvc2l0aW9uTXMgKz0gMTAwOw0KKw0KKyAgICAgICAgICAgICAgICBpZiAobVBvc2l0aW9uTXMgPj0gbVRvTXMpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmICghbUxvb3ApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uUHJvZ3Jlc3MoQXVkaW9UcmFjay50aGlzLCBtUG9zaXRpb25NcywgdHJ1ZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUGxheWJhY2tUaHJlYWQucnVuIHBsYXliYWNrIGNvbXBsZXRlIik7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJlIGEgbm90aWZpY2F0aW9uIGZvciB0aGUgZW5kIG9mIHRoZSBjbGlwDQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vblByb2dyZXNzKEF1ZGlvVHJhY2sudGhpcywgbVRvTXMsIGZhbHNlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV3aW5kDQorICAgICAgICAgICAgICAgICAgICAgICAgbVBvc2l0aW9uTXMgPSBtRnJvbU1zOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25Qcm9ncmVzcyhBdWRpb1RyYWNrLnRoaXMsIG1Qb3NpdGlvbk1zLCBmYWxzZSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUGxheWJhY2tUaHJlYWQucnVuIHBsYXliYWNrIGNvbXBsZXRlIik7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uUHJvZ3Jlc3MoQXVkaW9UcmFjay50aGlzLCBtUG9zaXRpb25NcywgZmFsc2UpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsNCisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiPT09PiBQbGF5YmFja1RocmVhZC5ydW4gZXhpdCIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8qKg0KKyAgICAgICAgICogU3RvcCB0aGUgcGxheWJhY2sNCisgICAgICAgICAqDQorICAgICAgICAgKiBAcmV0dXJuIFRoZSBzdG9wIHBvc2l0aW9uDQorICAgICAgICAgKi8NCisgICAgICAgIHB1YmxpYyBsb25nIHN0b3BQbGF5YmFjaygpIHsNCisgICAgICAgICAgICBtUnVuID0gZmFsc2U7DQorICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgam9pbigpOw0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBtUG9zaXRpb25NczsNCisgICAgICAgIH0NCisgICAgfTsNCisNCisgICAgLyoqDQorICAgICAqIEFuIG9iamVjdCBvZiB0aGlzIHR5cGUgY2Fubm90IGJlIGluc3RhbnRpYXRlZCBieSB1c2luZyB0aGUgZGVmYXVsdA0KKyAgICAgKiBjb25zdHJ1Y3Rvcg0KKyAgICAgKi8NCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQorICAgIHByaXZhdGUgQXVkaW9UcmFjaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICB0aGlzKG51bGwsIG51bGwsIG51bGwpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDb25zdHJ1Y3Rvcg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gZWRpdG9yIFRoZSB2aWRlbyBlZGl0b3IgcmVmZXJlbmNlDQorICAgICAqIEBwYXJhbSBhdWRpb1RyYWNrSWQgVGhlIGF1ZGlvIHRyYWNrIGlkDQorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgYWJzb2x1dGUgZmlsZSBuYW1lDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgZmlsZSBpcyBub3QgZm91bmQNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZmlsZSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCBvciBpZg0KKyAgICAgKiAgICAgICAgICAgICB0aGUgY29kZWMgaXMgbm90IHN1cHBvcnRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIEF1ZGlvVHJhY2soVmlkZW9FZGl0b3IgZWRpdG9yLCBTdHJpbmcgYXVkaW9UcmFja0lkLCBTdHJpbmcgZmlsZW5hbWUpDQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIG1VbmlxdWVJZCA9IGF1ZGlvVHJhY2tJZDsNCisgICAgICAgIG1GaWxlbmFtZSA9IGZpbGVuYW1lOw0KKyAgICAgICAgbVN0YXJ0VGltZU1zID0gMDsNCisgICAgICAgIC8vIFRPRE86IFRoaXMgdmFsdWUgcmVwcmVzZW50cyB0byB0aGUgZHVyYXRpb24gb2YgdGhlIGF1ZGlvIGZpbGUNCisgICAgICAgIG1EdXJhdGlvbk1zID0gMzAwMDAwOw0KKyAgICAgICAgLy8gVE9ETzogVGhpcyB2YWx1ZSBuZWVkcyB0byBiZSByZWFkIGZyb20gdGhlIGF1ZGlvIHRyYWNrIG9mIHRoZSBzb3VyY2UNCisgICAgICAgIC8vIGZpbGUNCisgICAgICAgIG1BdWRpb0NoYW5uZWxzID0gMjsNCisgICAgICAgIG1BdWRpb1R5cGUgPSBNZWRpYVByb3BlcnRpZXMuQUNPREVDX0FBQ19MQzsNCisgICAgICAgIG1BdWRpb0JpdHJhdGUgPSAxMjgwMDA7DQorICAgICAgICBtQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9IDQ0MTAwOw0KKw0KKyAgICAgICAgbVRpbWVsaW5lRHVyYXRpb25NcyA9IG1EdXJhdGlvbk1zOw0KKyAgICAgICAgbVZvbHVtZVBlcmNlbnQgPSAxMDA7DQorDQorICAgICAgICAvLyBQbGF5IHRoZSBlbnRpcmUgYXVkaW8gdHJhY2sNCisgICAgICAgIG1CZWdpbkJvdW5kYXJ5VGltZU1zID0gMDsNCisgICAgICAgIG1FbmRCb3VuZGFyeVRpbWVNcyA9IG1EdXJhdGlvbk1zOw0KKw0KKyAgICAgICAgLy8gQnkgZGVmYXVsdCBsb29wIGlzIGRpc2FibGVkDQorICAgICAgICBtTG9vcCA9IGZhbHNlOw0KKw0KKyAgICAgICAgLy8gQnkgZGVmYXVsdCB0aGUgYXVkaW8gdHJhY2sgaXMgbm90IG11dGVkDQorICAgICAgICBtTXV0ZWQgPSBmYWxzZTsNCisNCisgICAgICAgIC8vIER1Y2tpbmcgaXMgZW5hYmxlZCBieSBkZWZhdWx0DQorICAgICAgICBtRHVja2luZ1RocmVzaG9sZCA9IDA7DQorICAgICAgICBtRHVja2luZ0xvd1ZvbHVtZSA9IDA7DQorICAgICAgICBtSXNEdWNraW5nRW5hYmxlZCA9IHRydWU7DQorDQorICAgICAgICAvLyBUaGUgYXVkaW8gd2F2ZWZvcm0gZmlsZSBpcyBnZW5lcmF0ZWQgbGF0ZXINCisgICAgICAgIG1BdWRpb1dhdmVmb3JtRmlsZW5hbWUgPSBudWxsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDb25zdHJ1Y3Rvcg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gZWRpdG9yIFRoZSB2aWRlbyBlZGl0b3IgcmVmZXJlbmNlDQorICAgICAqIEBwYXJhbSBhdWRpb1RyYWNrSWQgVGhlIGF1ZGlvIHRyYWNrIGlkDQorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgYXVkaW8gZmlsZW5hbWUNCisgICAgICogQHBhcmFtIHN0YXJ0VGltZU1zIHRoZSBzdGFydCB0aW1lIGluIG1pbGxpc2Vjb25kcyAocmVsYXRpdmUgdG8gdGhlDQorICAgICAqICAgICAgICAgICAgICB0aW1lbGluZSkNCisgICAgICogQHBhcmFtIGJlZ2luTXMgc3RhcnQgdGltZSBpbiB0aGUgYXVkaW8gdHJhY2sgaW4gbWlsbGlzZWNvbmRzIChyZWxhdGl2ZSB0bw0KKyAgICAgKiAgICAgICAgICAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGF1ZGlvIHRyYWNrKQ0KKyAgICAgKiBAcGFyYW0gZW5kTXMgZW5kIHRpbWUgaW4gdGhlIGF1ZGlvIHRyYWNrIGluIG1pbGxpc2Vjb25kcyAocmVsYXRpdmUgdG8gdGhlDQorICAgICAqICAgICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBhdWRpbyB0cmFjaykNCisgICAgICogQHBhcmFtIGxvb3AgdHJ1ZSB0byBsb29wIHRoZSBhdWRpbyB0cmFjaw0KKyAgICAgKiBAcGFyYW0gdm9sdW1lIFRoZSB2b2x1bWUgaW4gcGVyY2VudGFnZQ0KKyAgICAgKiBAcGFyYW0gbXV0ZWQgdHJ1ZSBpZiB0aGUgYXVkaW8gdHJhY2sgaXMgbXV0ZWQNCisgICAgICogQHBhcmFtIGF1ZGlvV2F2ZWZvcm1GaWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgd2F2ZWZvcm0gZmlsZQ0KKyAgICAgKg0KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGZpbGUgaXMgbm90IGZvdW5kDQorICAgICAqLw0KKyAgICBBdWRpb1RyYWNrKFZpZGVvRWRpdG9yIGVkaXRvciwgU3RyaW5nIGF1ZGlvVHJhY2tJZCwgU3RyaW5nIGZpbGVuYW1lLCBsb25nIHN0YXJ0VGltZU1zLA0KKyAgICAgICAgICAgIGxvbmcgYmVnaW5NcywgbG9uZyBlbmRNcywgYm9vbGVhbiBsb29wLCBpbnQgdm9sdW1lLCBib29sZWFuIG11dGVkLA0KKyAgICAgICAgICAgIFN0cmluZyBhdWRpb1dhdmVmb3JtRmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBtVW5pcXVlSWQgPSBhdWRpb1RyYWNrSWQ7DQorICAgICAgICBtRmlsZW5hbWUgPSBmaWxlbmFtZTsNCisgICAgICAgIG1TdGFydFRpbWVNcyA9IHN0YXJ0VGltZU1zOw0KKw0KKyAgICAgICAgLy8gVE9ETzogVGhpcyB2YWx1ZSByZXByZXNlbnRzIHRvIHRoZSBkdXJhdGlvbiBvZiB0aGUgYXVkaW8gZmlsZQ0KKyAgICAgICAgbUR1cmF0aW9uTXMgPSAzMDAwMDA7DQorDQorICAgICAgICAvLyBUT0RPOiBUaGlzIHZhbHVlIG5lZWRzIHRvIGJlIHJlYWQgZnJvbSB0aGUgYXVkaW8gdHJhY2sgb2YgdGhlIHNvdXJjZQ0KKyAgICAgICAgLy8gZmlsZQ0KKyAgICAgICAgbUF1ZGlvQ2hhbm5lbHMgPSAyOw0KKyAgICAgICAgbUF1ZGlvVHlwZSA9IE1lZGlhUHJvcGVydGllcy5BQ09ERUNfQUFDX0xDOw0KKyAgICAgICAgbUF1ZGlvQml0cmF0ZSA9IDEyODAwMDsNCisgICAgICAgIG1BdWRpb1NhbXBsaW5nRnJlcXVlbmN5ID0gNDQxMDA7DQorDQorICAgICAgICBtVGltZWxpbmVEdXJhdGlvbk1zID0gZW5kTXMgLSBiZWdpbk1zOw0KKyAgICAgICAgbVZvbHVtZVBlcmNlbnQgPSB2b2x1bWU7DQorDQorICAgICAgICBtQmVnaW5Cb3VuZGFyeVRpbWVNcyA9IGJlZ2luTXM7DQorICAgICAgICBtRW5kQm91bmRhcnlUaW1lTXMgPSBlbmRNczsNCisNCisgICAgICAgIG1Mb29wID0gbG9vcDsNCisgICAgICAgIG1NdXRlZCA9IG11dGVkOw0KKw0KKyAgICAgICAgbUF1ZGlvV2F2ZWZvcm1GaWxlbmFtZSA9IGF1ZGlvV2F2ZWZvcm1GaWxlbmFtZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgaWQgb2YgdGhlIGF1ZGlvIHRyYWNrDQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgew0KKyAgICAgICAgcmV0dXJuIG1VbmlxdWVJZDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogR2V0IHRoZSBmaWxlbmFtZSBzb3VyY2UgZm9yIHRoaXMgYXVkaW8gdHJhY2suDQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIGZpbGVuYW1lIGFzIGFuIGFic29sdXRlIGZpbGUgbmFtZQ0KKyAgICAgKi8NCisgICAgcHVibGljIFN0cmluZyBnZXRGaWxlbmFtZSgpIHsNCisgICAgICAgIHJldHVybiBtRmlsZW5hbWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyBpbiB0aGUgc291cmNlIG9mIHRoaXMgYXVkaW8gdHJhY2sNCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0QXVkaW9DaGFubmVscygpIHsNCisgICAgICAgIHJldHVybiBtQXVkaW9DaGFubmVsczsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgYXVkaW8gY29kZWMgb2YgdGhlIHNvdXJjZSBvZiB0aGlzIGF1ZGlvIHRyYWNrDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldEF1ZGlvVHlwZSgpIHsNCisgICAgICAgIHJldHVybiBtQXVkaW9UeXBlOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBhdWRpbyBzYW1wbGUgZnJlcXVlbmN5IG9mIHRoZSBhdWRpbyB0cmFjaw0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5KCkgew0KKyAgICAgICAgcmV0dXJuIG1BdWRpb1NhbXBsaW5nRnJlcXVlbmN5Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBhdWRpbyBiaXRyYXRlIG9mIHRoZSBhdWRpbyB0cmFjaw0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXRBdWRpb0JpdHJhdGUoKSB7DQorICAgICAgICByZXR1cm4gbUF1ZGlvQml0cmF0ZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2V0IHRoZSB2b2x1bWUgb2YgdGhpcyBhdWRpbyB0cmFjayBhcyBwZXJjZW50YWdlIG9mIHRoZSB2b2x1bWUgaW4gdGhlDQorICAgICAqIG9yaWdpbmFsIGF1ZGlvIHNvdXJjZSBmaWxlLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gdm9sdW1lUGVyY2VudCBQZXJjZW50YWdlIG9mIHRoZSB2b2x1bWUgdG8gYXBwbHkuIElmIGl0IGlzIHNldCB0bw0KKyAgICAgKiAgICAgICAgICAgIDAsIHRoZW4gdm9sdW1lIGJlY29tZXMgbXV0ZS4gSXQgaXQgaXMgc2V0IHRvIDEwMCwgdGhlbiB2b2x1bWUNCisgICAgICogICAgICAgICAgICBpcyBzYW1lIGFzIG9yaWdpbmFsIHZvbHVtZS4gSXQgaXQgaXMgc2V0IHRvIDIwMCwgdGhlbiB2b2x1bWUNCisgICAgICogICAgICAgICAgICBpcyBkb3VibGVkIChwcm92aWRlZCB0aGF0IHZvbHVtZSBhbXBsaWZpY2F0aW9uIGlzIHN1cHBvcnRlZCkNCisgICAgICoNCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB2b2x1bWUgYW1wbGlmaWNhdGlvbiBpcw0KKyAgICAgKiAgICAgICAgICAgICByZXF1ZXN0ZWQgYW5kIGlzIG5vdCBzdXBwb3J0ZWQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWUoaW50IHZvbHVtZVBlcmNlbnQpIHsNCisgICAgICAgIG1Wb2x1bWVQZXJjZW50ID0gdm9sdW1lUGVyY2VudDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogR2V0IHRoZSB2b2x1bWUgb2YgdGhlIGF1ZGlvIHRyYWNrIGFzIHBlcmNlbnRhZ2Ugb2YgdGhlIHZvbHVtZSBpbiB0aGUNCisgICAgICogb3JpZ2luYWwgYXVkaW8gc291cmNlIGZpbGUuDQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIHZvbHVtZSBpbiBwZXJjZW50YWdlDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldFZvbHVtZSgpIHsNCisgICAgICAgIHJldHVybiBtVm9sdW1lUGVyY2VudDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHBhcmFtIG11dGVkIHRydWUgdG8gbXV0ZSB0aGUgYXVkaW8gdHJhY2sNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHNldE11dGUoYm9vbGVhbiBtdXRlZCkgew0KKyAgICAgICAgbU11dGVkID0gbXV0ZWQ7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYXVkaW8gdHJhY2sgaXMgbXV0ZWQNCisgICAgICovDQorICAgIHB1YmxpYyBib29sZWFuIGlzTXV0ZWQoKSB7DQorICAgICAgICByZXR1cm4gbU11dGVkOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTZXQgdGhlIHN0YXJ0IHRpbWUgb2YgdGhpcyBhdWRpbyB0cmFjayByZWxhdGl2ZSB0byB0aGUgc3Rvcnlib2FyZA0KKyAgICAgKiB0aW1lbGluZS4gRGVmYXVsdCB2YWx1ZSBpcyAwLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gc3RhcnRUaW1lTXMgdGhlIHN0YXJ0IHRpbWUgaW4gbWlsbGlzZWNvbmRzDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydFRpbWUobG9uZyBzdGFydFRpbWVNcykgew0KKyAgICAgICAgbVN0YXJ0VGltZU1zID0gc3RhcnRUaW1lTXM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEdldCB0aGUgc3RhcnQgdGltZSBvZiB0aGlzIGF1ZGlvIHRyYWNrIHJlbGF0aXZlIHRvIHRoZSBzdG9yeWJvYXJkDQorICAgICAqIHRpbWVsaW5lLg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBzdGFydCB0aW1lIGluIG1pbGxpc2Vjb25kcw0KKyAgICAgKi8NCisgICAgcHVibGljIGxvbmcgZ2V0U3RhcnRUaW1lKCkgew0KKyAgICAgICAgcmV0dXJuIG1TdGFydFRpbWVNczsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHZhbHVlIHJlcHJlc2VudHMgdGhlIGF1ZGlvDQorICAgICAqICAgICAgICAgdHJhY2sgZHVyYXRpb24gKG5vdCBsb29wZWQpDQorICAgICAqLw0KKyAgICBwdWJsaWMgbG9uZyBnZXREdXJhdGlvbigpIHsNCisgICAgICAgIHJldHVybiBtRHVyYXRpb25NczsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgdGltZWxpbmUgZHVyYXRpb24uIElmIGxvb3BpbmcgaXMgZW5hYmxlZCB0aGlzIHZhbHVlDQorICAgICAqICAgICAgICAgcmVwcmVzZW50cyB0aGUgZHVyYXRpb24gb2YgdGhlIGxvb3BlZCBhdWRpbyB0cmFjaywgb3RoZXJ3aXNlIGl0DQorICAgICAqICAgICAgICAgaXMgdGhlIGR1cmF0aW9uIG9mIHRoZSBhdWRpbyB0cmFjayAobUR1cmF0aW9uTXMpLg0KKyAgICAgKi8NCisgICAgcHVibGljIGxvbmcgZ2V0VGltZWxpbmVEdXJhdGlvbigpIHsNCisgICAgICAgIHJldHVybiBtVGltZWxpbmVEdXJhdGlvbk1zOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTZXRzIHRoZSBzdGFydCBhbmQgZW5kIG1hcmtzIGZvciB0cmltbWluZyBhbiBhdWRpbyB0cmFjaw0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gYmVnaW5NcyBzdGFydCB0aW1lIGluIHRoZSBhdWRpbyB0cmFjayBpbiBtaWxsaXNlY29uZHMgKHJlbGF0aXZlIHRvDQorICAgICAqICAgICAgICAgICAgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXVkaW8gdHJhY2spDQorICAgICAqIEBwYXJhbSBlbmRNcyBlbmQgdGltZSBpbiB0aGUgYXVkaW8gdHJhY2sgaW4gbWlsbGlzZWNvbmRzIChyZWxhdGl2ZSB0byB0aGUNCisgICAgICogICAgICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIGF1ZGlvIHRyYWNrKQ0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0RXh0cmFjdEJvdW5kYXJpZXMobG9uZyBiZWdpbk1zLCBsb25nIGVuZE1zKSB7DQorICAgICAgICBpZiAoYmVnaW5NcyA+IG1EdXJhdGlvbk1zKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBzdGFydCB0aW1lIik7DQorICAgICAgICB9DQorICAgICAgICBpZiAoZW5kTXMgPiBtRHVyYXRpb25Ncykgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZW5kIHRpbWUiKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIG1CZWdpbkJvdW5kYXJ5VGltZU1zID0gYmVnaW5NczsNCisgICAgICAgIG1FbmRCb3VuZGFyeVRpbWVNcyA9IGVuZE1zOw0KKyAgICAgICAgaWYgKG1Mb29wKSB7DQorICAgICAgICAgICAgLy8gVE9ETzogQ29tcHV0ZSBtRHVyYXRpb25NcyAoZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsb29wIHVudGlsDQorICAgICAgICAgICAgLy8gdGhlIGVuZCBvZiBhbGwgdGhlIGxvb3BzLg0KKyAgICAgICAgICAgIG1UaW1lbGluZUR1cmF0aW9uTXMgPSBtRW5kQm91bmRhcnlUaW1lTXMgLSBtQmVnaW5Cb3VuZGFyeVRpbWVNczsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbVRpbWVsaW5lRHVyYXRpb25NcyA9IG1FbmRCb3VuZGFyeVRpbWVNcyAtIG1CZWdpbkJvdW5kYXJ5VGltZU1zOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBib3VuZGFyeSBiZWdpbiB0aW1lDQorICAgICAqLw0KKyAgICBwdWJsaWMgbG9uZyBnZXRCb3VuZGFyeUJlZ2luVGltZSgpIHsNCisgICAgICAgIHJldHVybiBtQmVnaW5Cb3VuZGFyeVRpbWVNczsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgYm91bmRhcnkgZW5kIHRpbWUNCisgICAgICovDQorICAgIHB1YmxpYyBsb25nIGdldEJvdW5kYXJ5RW5kVGltZSgpIHsNCisgICAgICAgIHJldHVybiBtRW5kQm91bmRhcnlUaW1lTXM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEVuYWJsZSB0aGUgbG9vcCBtb2RlIGZvciB0aGlzIGF1ZGlvIHRyYWNrLiBOb3RlIHRoYXQgb25seSBvbmUgb2YgdGhlDQorICAgICAqIGF1ZGlvIHRyYWNrcyBpbiB0aGUgdGltZWxpbmUgY2FuIGhhdmUgdGhlIGxvb3AgbW9kZSBlbmFibGVkLiBXaGVuIGxvb3BpbmcNCisgICAgICogaXMgZW5hYmxlZCB0aGUgc2FtcGxlcyBiZXR3ZWVuIG1CZWdpbkJvdW5kYXJ5VGltZU1zIGFuZA0KKyAgICAgKiBtRW5kQm91bmRhcnlUaW1lTXMgYXJlIGxvb3BlZC4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGVuYWJsZUxvb3AoKSB7DQorICAgICAgICBtTG9vcCA9IHRydWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIERpc2FibGUgdGhlIGxvb3AgbW9kZQ0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgZGlzYWJsZUxvb3AoKSB7DQorICAgICAgICBtTG9vcCA9IGZhbHNlOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgbG9vcGluZyBpcyBlbmFibGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xvb3BpbmcoKSB7DQorICAgICAgICByZXR1cm4gbUxvb3A7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIERpc2FibGUgdGhlIGF1ZGlvIGR1Y2sgZWZmZWN0DQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBkaXNhYmxlRHVja2luZygpIHsNCisgICAgICAgIG1Jc0R1Y2tpbmdFbmFibGVkID0gZmFsc2U7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRPRE8gREVGSU5FDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0aHJlc2hvbGQNCisgICAgICogQHBhcmFtIGxvd1ZvbHVtZQ0KKyAgICAgKiBAcGFyYW0gdm9sdW1lDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBlbmFibGVEdWNraW5nKGludCB0aHJlc2hvbGQsIGludCBsb3dWb2x1bWUsIGludCB2b2x1bWUpIHsNCisgICAgICAgIG1EdWNraW5nVGhyZXNob2xkID0gdGhyZXNob2xkOw0KKyAgICAgICAgbUR1Y2tpbmdMb3dWb2x1bWUgPSBsb3dWb2x1bWU7DQorICAgICAgICBtSXNEdWNraW5nRW5hYmxlZCA9IHRydWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBkdWNraW5nIGlzIGVuYWJsZWQNCisgICAgICovDQorICAgIHB1YmxpYyBib29sZWFuIGlzRHVja2luZ0VuYWJsZWQoKSB7DQorICAgICAgICByZXR1cm4gbUlzRHVja2luZ0VuYWJsZWQ7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIGR1Y2tpbmcgdGhyZXNob2xkDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldER1Y2tpbmdUaHJlc2hob2xkKCkgew0KKyAgICAgICAgcmV0dXJuIG1EdWNraW5nVGhyZXNob2xkOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBkdWNraW5nIGxvdyBsZXZlbA0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXREdWNraW5nTG93Vm9sdW1lKCkgew0KKyAgICAgICAgcmV0dXJuIG1EdWNraW5nTG93Vm9sdW1lOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTdGFydCB0aGUgcGxheWJhY2sgb2YgdGhpcyBhdWRpbyB0cmFjay4gVGhpcyBtZXRob2QgZG9lcyBub3QgYmxvY2sgKGRvZXMNCisgICAgICogbm90IHdhaXQgZm9yIHRoZSBwbGF5YmFjayB0byBjb21wbGV0ZSkuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBmcm9tTXMgVGhlIHRpbWUgKHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGF1ZGlvIHRyYWNrKSBhdA0KKyAgICAgKiAgICAgICAgICAgIHdoaWNoIHRoZSBwbGF5YmFjayB3aWxsIHN0YXJ0DQorICAgICAqIEBwYXJhbSB0b01zIFRoZSB0aW1lIChyZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhdWRpbyB0cmFjaykgYXQNCisgICAgICogICAgICAgICAgICB3aGljaCB0aGUgcGxheWJhY2sgd2lsbCBzdG9wLiBVc2UgLTEgdG8gcGxheSB0byB0aGUgZW5kIG9mIHRoZQ0KKyAgICAgKiAgICAgICAgICAgIGF1ZGlvIHRyYWNrDQorICAgICAqIEBwYXJhbSBsb29wIHRydWUgaWYgdGhlIHBsYXliYWNrIHNob3VsZCBiZSBsb29wZWQgb25jZSBpdCByZWFjaGVzIHRoZSBlbmQNCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB3aGljaCB3aWxsIGJlIG5vdGlmaWVkIG9mIHRoZSBwbGF5YmFjaw0KKyAgICAgKiAgICAgICAgICAgIHByb2dyZXNzDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGZyb21NcyBvciB0b01zIGlzIGJleW9uZCB0aGUgcGxheWJhY2sNCisgICAgICogICAgICAgICAgICAgZHVyYXRpb24NCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBwbGF5YmFjaywgcHJldmlldyBvciBhbiBleHBvcnQgaXMNCisgICAgICogICAgICAgICAgICAgYWxyZWFkeSBpbiBwcm9ncmVzcw0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc3RhcnRQbGF5YmFjayhsb25nIGZyb21NcywgbG9uZyB0b01zLCBib29sZWFuIGxvb3AsDQorICAgICAgICAgICAgUGxheWJhY2tQcm9ncmVzc0xpc3RlbmVyIGxpc3RlbmVyKSB7DQorICAgICAgICBpZiAoZnJvbU1zID49IG1EdXJhdGlvbk1zKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbVBsYXliYWNrVGhyZWFkID0gbmV3IFBsYXliYWNrVGhyZWFkKGZyb21NcywgdG9NcywgbG9vcCwgbGlzdGVuZXIpOw0KKyAgICAgICAgbVBsYXliYWNrVGhyZWFkLnN0YXJ0KCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFN0b3AgdGhlIGF1ZGlvIHRyYWNrIHBsYXliYWNrLiBUaGlzIG1ldGhvZCBibG9ja3MgdW50aWwgdGhlIG9uZ29pbmcNCisgICAgICogcGxheWJhY2sgaXMgc3RvcHBlZC4NCisgICAgICoNCisgICAgICogQHJldHVybiBUaGUgYWNjdXJhdGUgY3VycmVudCB0aW1lIHdoZW4gc3RvcCBpcyBlZmZlY3RpdmUgZXhwcmVzc2VkIGluDQorICAgICAqICAgICAgICAgbWlsbGlzZWNvbmRzDQorICAgICAqLw0KKyAgICBwdWJsaWMgbG9uZyBzdG9wUGxheWJhY2soKSB7DQorICAgICAgICBmaW5hbCBsb25nIHN0b3BUaW1lTXM7DQorICAgICAgICBpZiAobVBsYXliYWNrVGhyZWFkICE9IG51bGwpIHsNCisgICAgICAgICAgICBzdG9wVGltZU1zID0gbVBsYXliYWNrVGhyZWFkLnN0b3BQbGF5YmFjaygpOw0KKyAgICAgICAgICAgIG1QbGF5YmFja1RocmVhZCA9IG51bGw7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHN0b3BUaW1lTXMgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHN0b3BUaW1lTXM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRoaXMgQVBJIGFsbG93cyB0byBnZW5lcmF0ZSBhIGZpbGUgY29udGFpbmluZyB0aGUgc2FtcGxlIHZvbHVtZSBsZXZlbHMgb2YNCisgICAgICogdGhpcyBhdWRpbyB0cmFjayBvYmplY3QuIFRoaXMgZnVuY3Rpb24gbWF5IHRha2Ugc2lnbmlmaWNhbnQgdGltZSBhbmQgaXMNCisgICAgICogYmxvY2tpbmcuIFRoZSBmaWxlbmFtZSBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIGdldEF1ZGlvV2F2ZWZvcm1GaWxlbmFtZSgpLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIHByb2dyZXNzIGxpc3RlbmVyDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIG91dHB1dCBmaWxlIGNhbm5vdCBiZSBjcmVhdGVkDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBhdWRpbyBmaWxlIGRvZXMgbm90IGhhdmUgYSB2YWxpZA0KKyAgICAgKiAgICAgICAgICAgICBhdWRpbyB0cmFjaw0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgZXh0cmFjdEF1ZGlvV2F2ZWZvcm0oRXh0cmFjdEF1ZGlvV2F2ZWZvcm1Qcm9ncmVzc0xpc3RlbmVyIGxpc3RlbmVyKQ0KKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICAvLyBUT0RPOiBTZXQgbUF1ZGlvV2F2ZWZvcm1GaWxlbmFtZSBhdCB0aGUgZW5kIG9uY2UgdGhlIGV4dHJhY3QgaXMNCisgICAgICAgIC8vIGNvbXBsZXRlDQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEdldCB0aGUgYXVkaW8gd2F2ZWZvcm0gZmlsZSBuYW1lIGlmIGV4dHJhY3RBdWRpb1dhdmVmb3JtIHdhcyBzdWNjZXNzZnVsLg0KKyAgICAgKiBUaGUgZmlsZSBmb3JtYXQgaXMgYXMgZm9sbG93aW5nOg0KKyAgICAgKiA8dWw+DQorICAgICAqIDxsaT5maXJzdCA0IGJ5dGVzIHByb3ZpZGUgdGhlIG51bWJlciBvZiBzYW1wbGVzIGZvciBlYWNoIHZhbHVlLCBhcw0KKyAgICAgKiBiaWctZW5kaWFuIHNpZ25lZDwvbGk+DQorICAgICAqIDxsaT40IGZvbGxvd2luZyBieXRlcyBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGUgZmlsZSwgYXMNCisgICAgICogYmlnLWVuZGlhbiBzaWduZWQ8L2xpPg0KKyAgICAgKiA8bGk+dGhlbiwgYWxsIHZhbHVlcyBmb2xsb3cgYXMgYnl0ZXM8L2xpPg0KKyAgICAgKiA8L3VsPg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWxlLCBudWxsIGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0DQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEF1ZGlvV2F2ZWZvcm1GaWxlbmFtZSgpIHsNCisgICAgICAgIHJldHVybiBtQXVkaW9XYXZlZm9ybUZpbGVuYW1lOw0KKyAgICB9DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgew0KKyAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgQXVkaW9UcmFjaykpIHsNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbVVuaXF1ZUlkLmVxdWFscygoKEF1ZGlvVHJhY2spb2JqZWN0KS5tVW5pcXVlSWQpOw0KKyAgICB9DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgew0KKyAgICAgICAgcmV0dXJuIG1VbmlxdWVJZC5oYXNoQ29kZSgpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9FZmZlY3QuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9FZmZlY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNWU2YTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL0VmZmVjdC5qYXZhCkBAIC0wLDAgKzEsMTY4IEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS52aWRlb2VkaXRvcjsNCisNCisvKioNCisgKiBUaGlzIGlzIHRoZSBzdXBlciBjbGFzcyBmb3IgYWxsIGVmZmVjdHMuIEFuIGVmZmVjdCBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGENCisgKiBzaW5nbGUgbWVkaWEgaXRlbS4gSWYgb25lIHdhbnRzIHRvIGFwcGx5IHRoZSBzYW1lIGVmZmVjdCB0byBtdWx0aXBsZSBtZWRpYQ0KKyAqIGl0ZW1zLCBtdWx0aXBsZSBAe01lZGlhSXRlbS5hZGRFZmZlY3QoRWZmZWN0KX0gY2FsbCBtdXN0IGJlIGludm9rZWQgb24gZWFjaA0KKyAqIG9mIHRoZSBNZWRpYUl0ZW0gb2JqZWN0cy4NCisgKiB7QGhpZGV9DQorICovDQorcHVibGljIGFic3RyYWN0IGNsYXNzIEVmZmVjdCB7DQorICAgIC8vIEluc3RhbmNlIHZhcmlhYmxlcw0KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVW5pcXVlSWQ7DQorICAgIC8vIFRoZSBlZmZlY3Qgb3duZXINCisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUl0ZW0gbU1lZGlhSXRlbTsNCisgICAgcHJvdGVjdGVkIGxvbmcgbUR1cmF0aW9uTXM7DQorICAgIC8vIFRoZSBzdGFydCB0aW1lIG9mIHRoZSBlZmZlY3QgcmVsYXRpdmUgdG8gdGhlIG1lZGlhIGl0ZW0gdGltZWxpbmUNCisgICAgcHJvdGVjdGVkIGxvbmcgbVN0YXJ0VGltZU1zOw0KKw0KKyAgICAvKioNCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvcg0KKyAgICAgKi8NCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQorICAgIHByaXZhdGUgRWZmZWN0KCkgew0KKyAgICAgICAgbU1lZGlhSXRlbSA9IG51bGw7DQorICAgICAgICBtVW5pcXVlSWQgPSBudWxsOw0KKyAgICAgICAgbVN0YXJ0VGltZU1zID0gMDsNCisgICAgICAgIG1EdXJhdGlvbk1zID0gMDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29uc3RydWN0b3INCisgICAgICoNCisgICAgICogQHBhcmFtIG1lZGlhSXRlbSBUaGUgbWVkaWEgaXRlbSBvd25lcg0KKyAgICAgKiBAcGFyYW0gZWZmZWN0SWQgVGhlIGVmZmVjdCBpZA0KKyAgICAgKiBAcGFyYW0gc3RhcnRUaW1lTXMgVGhlIHN0YXJ0IHRpbWUgcmVsYXRpdmUgdG8gdGhlIG1lZGlhIGl0ZW0gdG8gd2hpY2ggaXQNCisgICAgICogICAgICAgICAgICBpcyBhcHBsaWVkDQorICAgICAqIEBwYXJhbSBkdXJhdGlvbk1zIFRoZSBlZmZlY3QgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzDQorICAgICAqLw0KKyAgICBwdWJsaWMgRWZmZWN0KE1lZGlhSXRlbSBtZWRpYUl0ZW0sIFN0cmluZyBlZmZlY3RJZCwgbG9uZyBzdGFydFRpbWVNcywgbG9uZyBkdXJhdGlvbk1zKSB7DQorICAgICAgICBpZiAobWVkaWFJdGVtID09IG51bGwpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNZWRpYSBpdGVtIGNhbm5vdCBiZSBudWxsIik7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoc3RhcnRUaW1lTXMgKyBkdXJhdGlvbk1zID4gbWVkaWFJdGVtLmdldFRpbWVsaW5lRHVyYXRpb24oKSkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc3RhcnQgdGltZSBhbmQgZHVyYXRpb24iKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIG1NZWRpYUl0ZW0gPSBtZWRpYUl0ZW07DQorICAgICAgICBtVW5pcXVlSWQgPSBlZmZlY3RJZDsNCisgICAgICAgIG1TdGFydFRpbWVNcyA9IHN0YXJ0VGltZU1zOw0KKyAgICAgICAgbUR1cmF0aW9uTXMgPSBkdXJhdGlvbk1zOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBpZCBvZiB0aGUgZWZmZWN0DQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgew0KKyAgICAgICAgcmV0dXJuIG1VbmlxdWVJZDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2V0IHRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0LiBJZiBhIHByZXZpZXcgb3IgZXhwb3J0IGlzIGluIHByb2dyZXNzLA0KKyAgICAgKiB0aGVuIHRoaXMgY2hhbmdlIGlzIGVmZmVjdGl2ZSBmb3IgbmV4dCBwcmV2aWV3IG9yIGV4cG9ydCBzZXNzaW9uLiBzDQorICAgICAqDQorICAgICAqIEBwYXJhbSBkdXJhdGlvbk1zIG9mIHRoZSBlZmZlY3QgaW4gbWlsbGlzZWNvbmRzDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXREdXJhdGlvbihsb25nIGR1cmF0aW9uTXMpIHsNCisgICAgICAgIGlmIChtU3RhcnRUaW1lTXMgKyBkdXJhdGlvbk1zID4gbU1lZGlhSXRlbS5nZXRUaW1lbGluZUR1cmF0aW9uKCkpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJEdXJhdGlvbiBpcyB0b28gbGFyZ2UiKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIG1EdXJhdGlvbk1zID0gZHVyYXRpb25NczsNCisNCisgICAgICAgIG1NZWRpYUl0ZW0uaW52YWxpZGF0ZVRyYW5zaXRpb25zKHRoaXMpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXQgdGhlIGR1cmF0aW9uIG9mIHRoZSBlZmZlY3QNCisgICAgICoNCisgICAgICogQHJldHVybiBUaGUgZHVyYXRpb24gb2YgdGhlIGVmZmVjdCBpbiBtaWxsaXNlY29uZHMNCisgICAgICovDQorICAgIHB1YmxpYyBsb25nIGdldER1cmF0aW9uKCkgew0KKyAgICAgICAgcmV0dXJuIG1EdXJhdGlvbk1zOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTZXQgc3RhcnQgdGltZSBvZiB0aGUgZWZmZWN0LiBJZiBhIHByZXZpZXcgb3IgZXhwb3J0IGlzIGluIHByb2dyZXNzLCB0aGVuDQorICAgICAqIHRoaXMgY2hhbmdlIGlzIGVmZmVjdGl2ZSBmb3IgbmV4dCBwcmV2aWV3IG9yIGV4cG9ydCBzZXNzaW9uLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gc3RhcnRUaW1lTXMgVGhlIHN0YXJ0IHRpbWUgb2YgdGhlIGVmZmVjdCByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nDQorICAgICAqICAgICAgICAgICAgb2YgdGhlIG1lZGlhIGl0ZW0gaW4gbWlsbGlzZWNvbmRzDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydFRpbWUobG9uZyBzdGFydFRpbWVNcykgew0KKyAgICAgICAgaWYgKHN0YXJ0VGltZU1zICsgbUR1cmF0aW9uTXMgPiBtTWVkaWFJdGVtLmdldFRpbWVsaW5lRHVyYXRpb24oKSkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0YXJ0IHRpbWUgaXMgdG9vIGxhcmdlIik7DQorICAgICAgICB9DQorDQorICAgICAgICBtU3RhcnRUaW1lTXMgPSBzdGFydFRpbWVNczsNCisNCisgICAgICAgIG1NZWRpYUl0ZW0uaW52YWxpZGF0ZVRyYW5zaXRpb25zKHRoaXMpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBzdGFydCB0aW1lIGluIG1pbGxpc2Vjb25kcw0KKyAgICAgKi8NCisgICAgcHVibGljIGxvbmcgZ2V0U3RhcnRUaW1lKCkgew0KKyAgICAgICAgcmV0dXJuIG1TdGFydFRpbWVNczsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2V0IHRoZSBzdGFydCB0aW1lIGFuZCBkdXJhdGlvbg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gc3RhcnRUaW1lTXMgc3RhcnQgdGltZSBpbiBtaWxsaXNlY29uZHMNCisgICAgICogQHBhcmFtIGR1cmF0aW9uTXMgVGhlIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcw0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0U3RhcnRUaW1lQW5kRHVyYXRpb24obG9uZyBzdGFydFRpbWVNcywgbG9uZyBkdXJhdGlvbk1zKSB7DQorICAgICAgICBpZiAoc3RhcnRUaW1lTXMgKyBkdXJhdGlvbk1zID4gbU1lZGlhSXRlbS5nZXRUaW1lbGluZUR1cmF0aW9uKCkpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHN0YXJ0IHRpbWUgb3IgZHVyYXRpb24iKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIG1TdGFydFRpbWVNcyA9IHN0YXJ0VGltZU1zOw0KKyAgICAgICAgbUR1cmF0aW9uTXMgPSBkdXJhdGlvbk1zOw0KKw0KKyAgICAgICAgbU1lZGlhSXRlbS5pbnZhbGlkYXRlVHJhbnNpdGlvbnModGhpcyk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIGl0ZW0gb3duZXINCisgICAgICovDQorICAgIHB1YmxpYyBNZWRpYUl0ZW0gZ2V0TWVkaWFJdGVtKCkgew0KKyAgICAgICAgcmV0dXJuIG1NZWRpYUl0ZW07DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7DQorICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBFZmZlY3QpKSB7DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIG1VbmlxdWVJZC5lcXVhbHMoKChFZmZlY3Qpb2JqZWN0KS5tVW5pcXVlSWQpOw0KKyAgICB9DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgew0KKyAgICAgICAgcmV0dXJuIG1VbmlxdWVJZC5oYXNoQ29kZSgpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9FZmZlY3RDb2xvci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL0VmZmVjdENvbG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjM4Y2Y3NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9FZmZlY3RDb2xvci5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS52aWRlb2VkaXRvcjsNCisNCisvKioNCisgKiBUaGlzIGNsYXNzIGFsbG93cyB0byBhcHBseSBjb2xvciBvbiBhIG1lZGlhIGl0ZW0uDQorICoge0BoaWRlfQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBFZmZlY3RDb2xvciBleHRlbmRzIEVmZmVjdCB7DQorDQorICAgIC8qKg0KKyAgICAgKiBDaGFuZ2UgdGhlIHZpZGVvIGZyYW1lIGNvbG9yIHRvIHRoZSBSR0IgY29sb3IgdmFsdWUgcHJvdmlkZWQNCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQ09MT1IgPSAxOyAvLyBjb2xvciBhcyA4ODggUkdCDQorICAgIC8qKg0KKyAgICAgKiBDaGFuZ2UgdGhlIHZpZGVvIGZyYW1lIGNvbG9yIHRvIGEgZ3JhZGF0aW9uIGZyb20gUkdCIGNvbG9yIChhdCB0aGUgdG9wIG9mDQorICAgICAqIHRoZSBmcmFtZSkgdG8gYmxhY2sgKGF0IHRoZSBib3R0b20gb2YgdGhlIGZyYW1lKS4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfR1JBRElFTlQgPSAyOw0KKyAgICAvKioNCisgICAgICogQ2hhbmdlIHRoZSB2aWRlbyBmcmFtZSBjb2xvciB0byBzZXBpYQ0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TRVBJQSA9IDM7DQorICAgIC8qKg0KKyAgICAgKiBJbnZlcnQgdGhlIHZpZGVvIGZyYW1lIGNvbG9yDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX05FR0FUSVZFID0gNDsNCisgICAgLyoqDQorICAgICAqIE1ha2UgdGhlIHZpZGVvIGxvb2sgbGlrZSBhcyBpZiBpdCB3YXMgcmVjb3JkZWQgaW4gNTAncw0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9GSUZUSUVTID0gNTsNCisNCisgICAgLy8gQ29sb3JzIGZvciB0aGUgY29sb3IgZWZmZWN0DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdSRUVOID0gMHgwMDAwZmYwMDsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUElOSyA9IDB4MDBmZjY2Y2M7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdSQVkgPSAweDAwN2Y3ZjdmOw0KKw0KKyAgICAvLyBUaGUgZWZmZWN0IHR5cGUNCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVR5cGU7DQorDQorICAgIC8vIFRoZSBlZmZlY3QgcGFyYW1ldGVyDQorICAgIHByaXZhdGUgZmluYWwgaW50IG1QYXJhbTsNCisNCisgICAgLyoqDQorICAgICAqIEFuIG9iamVjdCBvZiB0aGlzIHR5cGUgY2Fubm90IGJlIGluc3RhbnRpYXRlZCBieSB1c2luZyB0aGUgZGVmYXVsdA0KKyAgICAgKiBjb25zdHJ1Y3Rvcg0KKyAgICAgKi8NCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQorICAgIHByaXZhdGUgRWZmZWN0Q29sb3IoKSB7DQorICAgICAgICB0aGlzKG51bGwsIG51bGwsIDAsIDAsIDAsIDApOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDb25zdHJ1Y3Rvcg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gbWVkaWFJdGVtIFRoZSBtZWRpYSBpdGVtIG93bmVyDQorICAgICAqIEBwYXJhbSBlZmZlY3RJZCBUaGUgZWZmZWN0IGlkDQorICAgICAqIEBwYXJhbSBzdGFydFRpbWVNcyBUaGUgc3RhcnQgdGltZSByZWxhdGl2ZSB0byB0aGUgbWVkaWEgaXRlbSB0byB3aGljaCBpdA0KKyAgICAgKiAgICAgICAgICAgIGlzIGFwcGxpZWQNCisgICAgICogQHBhcmFtIGR1cmF0aW9uTXMgVGhlIGR1cmF0aW9uIG9mIHRoaXMgZWZmZWN0IGluIG1pbGxpc2Vjb25kcw0KKyAgICAgKiBAcGFyYW0gdHlwZSB0eXBlIG9mIHRoZSBlZmZlY3QuIHR5cGUgaXMgb25lIG9mOiBUWVBFX0NPTE9SLA0KKyAgICAgKiAgICAgICAgICAgIFRZUEVfR1JBRElFTlQsIFRZUEVfU0VQSUEsIFRZUEVfTkVHQVRJVkUsIFRZUEVfRklGVElFUy4gSWYNCisgICAgICogICAgICAgICAgICB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQsIHRoZSBhcmd1bWVudCBpcyBpZ25vcmVkDQorICAgICAqIEBwYXJhbSBwYXJhbSBpZiB0eXBlIGlzIFRZUEVfQ09MT1IsIHBhcmFtIGlzIHRoZSBSR0IgY29sb3IgYXMgODg4Lg0KKyAgICAgKiAgICAgICAgICAgIE90aGVyd2lzZSwgcGFyYW0gaXMgaWdub3JlZA0KKyAgICAgKi8NCisgICAgcHVibGljIEVmZmVjdENvbG9yKE1lZGlhSXRlbSBtZWRpYUl0ZW0sIFN0cmluZyBlZmZlY3RJZCwgbG9uZyBzdGFydFRpbWVNcywgbG9uZyBkdXJhdGlvbk1zLA0KKyAgICAgICAgICAgIGludCB0eXBlLCBpbnQgcGFyYW0pIHsNCisgICAgICAgIHN1cGVyKG1lZGlhSXRlbSwgZWZmZWN0SWQsIHN0YXJ0VGltZU1zLCBkdXJhdGlvbk1zKTsNCisgICAgICAgIG1UeXBlID0gdHlwZTsNCisgICAgICAgIG1QYXJhbSA9IHBhcmFtOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHRoaXMgZWZmZWN0DQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7DQorICAgICAgICByZXR1cm4gbVR5cGU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gdGhlIGNvbG9yIGFzIFJHQiA4ODggaWYgdHlwZSBpcyBUWVBFX0NPTE9SLiBPdGhlcndpc2UsIGlnbm9yZS4NCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0UGFyYW0oKSB7DQorICAgICAgICByZXR1cm4gbVBhcmFtOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9FZmZlY3RLZW5CdXJucy5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL0VmZmVjdEtlbkJ1cm5zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWUyZTcwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9FZmZlY3RLZW5CdXJucy5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBhbmRyb2lkLm1lZGlhLnZpZGVvZWRpdG9yOw0KKw0KK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7DQorDQorLyoqDQorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgS2VuIEJ1cm5zIGVmZmVjdC4NCisgKiB7QGhpZGV9DQorICovDQorcHVibGljIGNsYXNzIEVmZmVjdEtlbkJ1cm5zIGV4dGVuZHMgRWZmZWN0IHsNCisgICAgLy8gSW5zdGFuY2UgdmFyaWFibGVzDQorICAgIHByaXZhdGUgUmVjdCBtU3RhcnRSZWN0Ow0KKyAgICBwcml2YXRlIFJlY3QgbUVuZFJlY3Q7DQorDQorICAgIC8qKg0KKyAgICAgKiBPYmplY3RzIG9mIHRoaXMgdHlwZSBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGJ5IHVzaW5nIHRoZSBkZWZhdWx0DQorICAgICAqIGNvbnN0cnVjdG9yDQorICAgICAqLw0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCisgICAgcHJpdmF0ZSBFZmZlY3RLZW5CdXJucygpIHsNCisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgMCwgMCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvbnN0cnVjdG9yDQorICAgICAqDQorICAgICAqIEBwYXJhbSBtZWRpYUl0ZW0gVGhlIG1lZGlhIGl0ZW0gb3duZXINCisgICAgICogQHBhcmFtIGVmZmVjdElkIFRoZSBlZmZlY3QgaWQNCisgICAgICogQHBhcmFtIHN0YXJ0UmVjdCBUaGUgc3RhcnQgcmVjdGFuZ2xlDQorICAgICAqIEBwYXJhbSBlbmRSZWN0IFRoZSBlbmQgcmVjdGFuZ2xlDQorICAgICAqIEBwYXJhbSBzdGFydFRpbWVNcyBUaGUgc3RhcnQgdGltZQ0KKyAgICAgKiBAcGFyYW0gZHVyYXRpb25NcyBUaGUgZHVyYXRpb24gb2YgdGhlIEtlbiBCdXJucyBlZmZlY3QgaW4gbWlsbGlzZWNvbmRzDQorICAgICAqLw0KKyAgICBwdWJsaWMgRWZmZWN0S2VuQnVybnMoTWVkaWFJdGVtIG1lZGlhSXRlbSwgU3RyaW5nIGVmZmVjdElkLCBSZWN0IHN0YXJ0UmVjdCwgUmVjdCBlbmRSZWN0LA0KKyAgICAgICAgICAgIGxvbmcgc3RhcnRUaW1lTXMsIGxvbmcgZHVyYXRpb25Ncykgew0KKyAgICAgICAgc3VwZXIobWVkaWFJdGVtLCBlZmZlY3RJZCwgc3RhcnRUaW1lTXMsIGR1cmF0aW9uTXMpOw0KKw0KKyAgICAgICAgbVN0YXJ0UmVjdCA9IHN0YXJ0UmVjdDsNCisgICAgICAgIG1FbmRSZWN0ID0gZW5kUmVjdDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHBhcmFtIHN0YXJ0UmVjdCBUaGUgc3RhcnQgcmVjdGFuZ2xlDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHN0YXJ0IHJlY3RhbmdsZSBpcyBpbmNvcnJlY3RseSBzZXQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydFJlY3QoUmVjdCBzdGFydFJlY3QpIHsNCisgICAgICAgIG1TdGFydFJlY3QgPSBzdGFydFJlY3Q7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIHN0YXJ0IHJlY3RhbmdsZQ0KKyAgICAgKi8NCisgICAgcHVibGljIFJlY3QgZ2V0U3RhcnRSZWN0KCkgew0KKyAgICAgICAgcmV0dXJuIG1TdGFydFJlY3Q7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEBwYXJhbSBlbmRSZWN0IFRoZSBlbmQgcmVjdGFuZ2xlDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGVuZCByZWN0YW5nbGUgaXMgaW5jb3JyZWN0bHkgc2V0Lg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0RW5kUmVjdChSZWN0IGVuZFJlY3QpIHsNCisgICAgICAgIG1FbmRSZWN0ID0gZW5kUmVjdDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgZW5kIHJlY3RhbmdsZQ0KKyAgICAgKi8NCisgICAgcHVibGljIFJlY3QgZ2V0RW5kUmVjdCgpIHsNCisgICAgICAgIHJldHVybiBtRW5kUmVjdDsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvRXh0cmFjdEF1ZGlvV2F2ZWZvcm1Qcm9ncmVzc0xpc3RlbmVyLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvRXh0cmFjdEF1ZGlvV2F2ZWZvcm1Qcm9ncmVzc0xpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNjZTE0OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9FeHRyYWN0QXVkaW9XYXZlZm9ybVByb2dyZXNzTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnZpZGVvZWRpdG9yOworCisvKioKKyAqIFRoaXMgbGlzdGVuZXIgaW50ZXJmYWNlIGlzIHVzZWQgYnkKKyAqIHtAbGluayBNZWRpYVZpZGVvSXRlbSNleHRyYWN0QXVkaW9XYXZlZm9ybShFeHRyYWN0QXVkaW9XYXZlZm9ybVByb2dyZXNzTGlzdGVuZXIgbGlzdGVuZXIpfQorICogb3IKKyAqIHtAbGluayBBdWRpb1RyYWNrI2V4dHJhY3RBdWRpb1dhdmVmb3JtKEV4dHJhY3RBdWRpb1dhdmVmb3JtUHJvZ3Jlc3NMaXN0ZW5lciBsaXN0ZW5lcil9CisgKiB7QGhpZGV9CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXh0cmFjdEF1ZGlvV2F2ZWZvcm1Qcm9ncmVzc0xpc3RlbmVyIHsKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyB0aGUgbGlzdGVuZXIgb2YgdGhlIHByb2dyZXNzIHN0YXR1cyBvZgorICAgICAqIGFuIGV4dHJhY3RBdWRpb1dhdmVmb3JtIG9wZXJhdGlvbi4KKyAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG1heGltdW0gMTAwIHRpbWVzIGZvciBvbmUgb3BlcmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHByb2dyZXNzIFRoZSBwcm9ncmVzcyBpbiAlLiBBdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvcGVyYXRpb24sCisgICAgICogICAgICAgICAgdGhpcyB2YWx1ZSBpcyBzZXQgdG8gMDsgYXQgdGhlIGVuZCwgdGhlIHZhbHVlIGlzIHNldCB0byAxMDAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzcyhpbnQgcHJvZ3Jlc3MpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvTWVkaWFJbWFnZUl0ZW0uamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9NZWRpYUltYWdlSXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRmM2M1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvTWVkaWFJbWFnZUl0ZW0uamF2YQpAQCAtMCwwICsxLDI2MiBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudmlkZW9lZGl0b3I7DQorDQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQorDQoraW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOw0KK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7DQoraW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOw0KK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50Ow0KK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7DQoraW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7DQoraW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBpbWFnZSBpdGVtIG9uIHRoZSBzdG9yeWJvYXJkLiBOb3RlIHRoYXQgaW1hZ2VzIGFyZQ0KKyAqIHNjYWxlZCBkb3duIHRvIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCByZXNvbHV0aW9uIGJ5IHByZXNlcnZpbmcgdGhlIG5hdGl2ZQ0KKyAqIGFzcGVjdCByYXRpby4gVG8gbGVhcm4gdGhlIHNjYWxlZCBpbWFnZSBkaW1lbnNpb25zIHVzZQ0KKyAqIHtAbGluayAjZ2V0U2NhbGVkV2lkdGgoKX0gYW5kIHtAbGluayAjZ2V0U2NhbGVkSGVpZ2h0KCl9IHJlc3BlY3RpdmVseS4NCisgKg0KKyAqIHtAaGlkZX0NCisgKi8NCitwdWJsaWMgY2xhc3MgTWVkaWFJbWFnZUl0ZW0gZXh0ZW5kcyBNZWRpYUl0ZW0gew0KKyAgICAvLyBMb2dnaW5nDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFJbWFnZUl0ZW0iOw0KKw0KKyAgICAvLyBUaGUgcmVzaXplIHBhaW50DQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhaW50IHNSZXNpemVQYWludCA9IG5ldyBQYWludChQYWludC5GSUxURVJfQklUTUFQX0ZMQUcpOw0KKw0KKyAgICAvLyBJbnN0YW5jZSB2YXJpYWJsZXMNCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVdpZHRoOw0KKyAgICBwcml2YXRlIGZpbmFsIGludCBtSGVpZ2h0Ow0KKyAgICBwcml2YXRlIGZpbmFsIGludCBtQXNwZWN0UmF0aW87DQorICAgIHByaXZhdGUgbG9uZyBtRHVyYXRpb25NczsNCisgICAgcHJpdmF0ZSBpbnQgbVNjYWxlZFdpZHRoLCBtU2NhbGVkSGVpZ2h0Ow0KKw0KKyAgICAvKioNCisgICAgICogVGhpcyBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGJ5IHVzaW5nIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yDQorICAgICAqLw0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCisgICAgcHJpdmF0ZSBNZWRpYUltYWdlSXRlbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICB0aGlzKG51bGwsIG51bGwsIG51bGwsIDAsIFJFTkRFUklOR19NT0RFX0JMQUNLX0JPUkRFUik7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvbnN0cnVjdG9yDQorICAgICAqDQorICAgICAqIEBwYXJhbSBlZGl0b3IgVGhlIHZpZGVvIGVkaXRvciByZWZlcmVuY2UNCisgICAgICogQHBhcmFtIG1lZGlhSXRlbUlkIFRoZSBtZWRpYSBpdGVtIGlkDQorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgaW1hZ2UgZmlsZSBuYW1lDQorICAgICAqIEBwYXJhbSBkdXJhdGlvbk1zIFRoZSBkdXJhdGlvbiBvZiB0aGUgaW1hZ2Ugb24gdGhlIHN0b3J5Ym9hcmQNCisgICAgICogQHBhcmFtIHJlbmRlcmluZ01vZGUgVGhlIHJlbmRlcmluZyBtb2RlDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCisgICAgICovDQorICAgIHB1YmxpYyBNZWRpYUltYWdlSXRlbShWaWRlb0VkaXRvciBlZGl0b3IsIFN0cmluZyBtZWRpYUl0ZW1JZCwgU3RyaW5nIGZpbGVuYW1lLCBsb25nIGR1cmF0aW9uTXMsDQorICAgICAgICAgICAgaW50IHJlbmRlcmluZ01vZGUpDQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIHN1cGVyKGVkaXRvciwgbWVkaWFJdGVtSWQsIGZpbGVuYW1lLCByZW5kZXJpbmdNb2RlKTsNCisNCisgICAgICAgIC8vIERldGVybWluZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgaW1hZ2UNCisgICAgICAgIGZpbmFsIEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBkYm8gPSBuZXcgQml0bWFwRmFjdG9yeS5PcHRpb25zKCk7DQorICAgICAgICBkYm8uaW5KdXN0RGVjb2RlQm91bmRzID0gdHJ1ZTsNCisgICAgICAgIEJpdG1hcEZhY3RvcnkuZGVjb2RlRmlsZShmaWxlbmFtZSwgZGJvKTsNCisNCisgICAgICAgIG1XaWR0aCA9IGRiby5vdXRXaWR0aDsNCisgICAgICAgIG1IZWlnaHQgPSBkYm8ub3V0SGVpZ2h0Ow0KKyAgICAgICAgbUR1cmF0aW9uTXMgPSBkdXJhdGlvbk1zOw0KKw0KKyAgICAgICAgLy8gVE9ETzogRGV0ZXJtaW5lIHRoZSBhc3BlY3QgcmF0aW8gZnJvbSB0aGUgd2lkdGggYW5kIGhlaWdodA0KKyAgICAgICAgbUFzcGVjdFJhdGlvID0gTWVkaWFQcm9wZXJ0aWVzLkFTUEVDVF9SQVRJT180XzM7DQorDQorICAgICAgICAvLyBJbWFnZXMgYXJlIHN0b3JlZCBpbiBtZW1vcnkgc2NhbGVkIHRvIHRoZSBtYXhpbXVtIHJlc29sdXRpb24gdG8NCisgICAgICAgIC8vIHNhdmUgbWVtb3J5Lg0KKyAgICAgICAgZmluYWwgUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPltdIHJlc29sdXRpb25zID0NCisgICAgICAgICAgICBNZWRpYVByb3BlcnRpZXMuZ2V0U3VwcG9ydGVkUmVzb2x1dGlvbnMobUFzcGVjdFJhdGlvKTsNCisgICAgICAgIC8vIEdldCB0aGUgaGlnaGVzdCByZXNvbHV0aW9uDQorICAgICAgICBmaW5hbCBQYWlyPEludGVnZXIsIEludGVnZXI+IG1heFJlc29sdXRpb24gPSByZXNvbHV0aW9uc1tyZXNvbHV0aW9ucy5sZW5ndGggLSAxXTsNCisgICAgICAgIGlmIChtSGVpZ2h0ID4gbWF4UmVzb2x1dGlvbi5zZWNvbmQpIHsNCisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHNjYWxlIHRoZSBpbWFnZQ0KKyAgICAgICAgICAgIHNjYWxlSW1hZ2UoZmlsZW5hbWUsIG1heFJlc29sdXRpb24uZmlyc3QsIG1heFJlc29sdXRpb24uc2Vjb25kKTsNCisgICAgICAgICAgICBtU2NhbGVkV2lkdGggPSBtYXhSZXNvbHV0aW9uLmZpcnN0Ow0KKyAgICAgICAgICAgIG1TY2FsZWRIZWlnaHQgPSBtYXhSZXNvbHV0aW9uLnNlY29uZDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbVNjYWxlZFdpZHRoID0gbVdpZHRoOw0KKyAgICAgICAgICAgIG1TY2FsZWRIZWlnaHQgPSBtSGVpZ2h0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IGdldEZpbGVUeXBlKCkgew0KKyAgICAgICAgaWYgKG1GaWxlbmFtZS5lbmRzV2l0aCgiLmpwZyIpIHx8IG1GaWxlbmFtZS5lbmRzV2l0aCgiLmpwZWciKSkgew0KKyAgICAgICAgICAgIHJldHVybiBNZWRpYVByb3BlcnRpZXMuRklMRV9KUEVHOw0KKyAgICAgICAgfSBlbHNlIGlmIChtRmlsZW5hbWUuZW5kc1dpdGgoIi5wbmciKSkgew0KKyAgICAgICAgICAgIHJldHVybiBNZWRpYVByb3BlcnRpZXMuRklMRV9QTkc7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJldHVybiBNZWRpYVByb3BlcnRpZXMuRklMRV9VTlNVUFBPUlRFRDsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCBnZXRXaWR0aCgpIHsNCisgICAgICAgIHJldHVybiBtV2lkdGg7DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkgew0KKyAgICAgICAgcmV0dXJuIG1IZWlnaHQ7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIHNjYWxlZCB3aWR0aCBvZiB0aGUgaW1hZ2UuDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldFNjYWxlZFdpZHRoKCkgew0KKyAgICAgICAgcmV0dXJuIG1TY2FsZWRXaWR0aDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgc2NhbGVkIGhlaWdodCBvZiB0aGUgaW1hZ2UuDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldFNjYWxlZEhlaWdodCgpIHsNCisgICAgICAgIHJldHVybiBtU2NhbGVkSGVpZ2h0Ow0KKyAgICB9DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IGdldEFzcGVjdFJhdGlvKCkgew0KKyAgICAgICAgcmV0dXJuIG1Bc3BlY3RSYXRpbzsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBhZGp1c3QgdGhlIGR1cmF0aW9uIG9mIGJvdW5kaW5nIHRyYW5zaXRpb25zLCBlZmZlY3RzDQorICAgICAqIGFuZCBvdmVybGF5cyBpZiB0aGUgY3VycmVudCBkdXJhdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb25zIGJlY29tZSBncmVhdGVyDQorICAgICAqIHRoYW4gdGhlIG1heGltdW0gYWxsb3dhYmxlIGR1cmF0aW9uLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gZHVyYXRpb25NcyBUaGUgZHVyYXRpb24gb2YgdGhlIGltYWdlIGluIHRoZSBzdG9yeWJvYXJkIHRpbWVsaW5lDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXREdXJhdGlvbihsb25nIGR1cmF0aW9uTXMpIHsNCisgICAgICAgIG1EdXJhdGlvbk1zID0gZHVyYXRpb25NczsNCisNCisgICAgICAgIGFkanVzdEVsZW1lbnRzRHVyYXRpb24oKTsNCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGxvbmcgZ2V0VGltZWxpbmVEdXJhdGlvbigpIHsNCisgICAgICAgIHJldHVybiBtRHVyYXRpb25NczsNCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIEJpdG1hcCBnZXRUaHVtYm5haWwoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBsb25nIHRpbWVNcykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBzY2FsZUltYWdlKG1GaWxlbmFtZSwgd2lkdGgsIGhlaWdodCk7DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBCaXRtYXBbXSBnZXRUaHVtYm5haWxMaXN0KGludCB3aWR0aCwgaW50IGhlaWdodCwgbG9uZyBzdGFydE1zLCBsb25nIGVuZE1zLA0KKyAgICAgICAgICAgIGludCB0aHVtYm5haWxDb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIGZpbmFsIEJpdG1hcCB0aHVtYm5haWwgPSBzY2FsZUltYWdlKG1GaWxlbmFtZSwgd2lkdGgsIGhlaWdodCk7DQorICAgICAgICBmaW5hbCBCaXRtYXBbXSB0aHVtYm5haWxBcnJheSA9IG5ldyBCaXRtYXBbdGh1bWJuYWlsQ291bnRdOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aHVtYm5haWxDb3VudDsgaSsrKSB7DQorICAgICAgICAgICAgdGh1bWJuYWlsQXJyYXlbaV0gPSB0aHVtYm5haWw7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdGh1bWJuYWlsQXJyYXk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJlc2l6ZSBhIGJpdG1hcCB0byB0aGUgc3BlY2lmaWVkIHdpZHRoIGFuZCBoZWlnaHQNCisgICAgICoNCisgICAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBmaWxlbmFtZQ0KKyAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHRodW1ibmFpbCB3aWR0aA0KKyAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSB0aHVtYm5haWwgaGVpZ2h0DQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIHJlc2l6ZWQgYml0bWFwDQorICAgICAqLw0KKyAgICBwcml2YXRlIEJpdG1hcCBzY2FsZUltYWdlKFN0cmluZyBmaWxlbmFtZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQ0KKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBmaW5hbCBCaXRtYXBGYWN0b3J5Lk9wdGlvbnMgZGJvID0gbmV3IEJpdG1hcEZhY3RvcnkuT3B0aW9ucygpOw0KKyAgICAgICAgZGJvLmluSnVzdERlY29kZUJvdW5kcyA9IHRydWU7DQorICAgICAgICBCaXRtYXBGYWN0b3J5LmRlY29kZUZpbGUoZmlsZW5hbWUsIGRibyk7DQorDQorICAgICAgICBmaW5hbCBpbnQgbmF0aXZlV2lkdGggPSBkYm8ub3V0V2lkdGg7DQorICAgICAgICBmaW5hbCBpbnQgbmF0aXZlSGVpZ2h0ID0gZGJvLm91dEhlaWdodDsNCisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsNCisgICAgICAgICAgICBMb2cuZChUQUcsICJnZW5lcmF0ZVRodW1ibmFpbDogSW5wdXQ6ICIgKyBuYXRpdmVXaWR0aCArICJ4IiArIG5hdGl2ZUhlaWdodA0KKyAgICAgICAgICAgICAgICAgICAgKyAiLCByZXNpemUgdG86ICIgKyB3aWR0aCArICJ4IiArIGhlaWdodCk7DQorICAgICAgICB9DQorDQorICAgICAgICBmaW5hbCBCaXRtYXAgc3JjQml0bWFwOw0KKyAgICAgICAgZmxvYXQgYml0bWFwV2lkdGgsIGJpdG1hcEhlaWdodDsNCisgICAgICAgIGlmIChuYXRpdmVXaWR0aCA+IHdpZHRoIHx8IG5hdGl2ZUhlaWdodCA+IGhlaWdodCkgew0KKyAgICAgICAgICAgIGZsb2F0IGR4ID0gKChmbG9hdCluYXRpdmVXaWR0aCkgLyAoKGZsb2F0KXdpZHRoKTsNCisgICAgICAgICAgICBmbG9hdCBkeSA9ICgoZmxvYXQpbmF0aXZlSGVpZ2h0KSAvICgoZmxvYXQpaGVpZ2h0KTsNCisgICAgICAgICAgICBpZiAoZHggPiBkeSkgew0KKyAgICAgICAgICAgICAgICBiaXRtYXBXaWR0aCA9IHdpZHRoOw0KKyAgICAgICAgICAgICAgICBiaXRtYXBIZWlnaHQgPSBuYXRpdmVIZWlnaHQgLyBkeDsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBiaXRtYXBXaWR0aCA9IG5hdGl2ZVdpZHRoIC8gZHk7DQorICAgICAgICAgICAgICAgIGJpdG1hcEhlaWdodCA9IGhlaWdodDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBiaXRtYXAgZnJvbSBmaWxlDQorICAgICAgICAgICAgaWYgKG5hdGl2ZVdpZHRoIC8gYml0bWFwV2lkdGggPiAxKSB7DQorICAgICAgICAgICAgICAgIGZpbmFsIEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBvcHRpb25zID0gbmV3IEJpdG1hcEZhY3RvcnkuT3B0aW9ucygpOw0KKyAgICAgICAgICAgICAgICBvcHRpb25zLmluU2FtcGxlU2l6ZSA9IG5hdGl2ZVdpZHRoIC8gKGludCliaXRtYXBXaWR0aDsNCisgICAgICAgICAgICAgICAgc3JjQml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVGaWxlKGZpbGVuYW1lLCBvcHRpb25zKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBzcmNCaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUZpbGUoZmlsZW5hbWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgYml0bWFwV2lkdGggPSB3aWR0aDsNCisgICAgICAgICAgICBiaXRtYXBIZWlnaHQgPSBoZWlnaHQ7DQorICAgICAgICAgICAgc3JjQml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVGaWxlKGZpbGVuYW1lKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChzcmNCaXRtYXAgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIExvZy5lKFRBRywgImdlbmVyYXRlVGh1bWJuYWlsOiBDYW5ub3QgZGVjb2RlIGltYWdlIGJ5dGVzIik7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgZGVjb2RlIGZpbGU6ICIgKyBtRmlsZW5hbWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBjYW52YXMgYml0bWFwDQorICAgICAgICBmaW5hbCBCaXRtYXAgYml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcCgoaW50KWJpdG1hcFdpZHRoLCAoaW50KWJpdG1hcEhlaWdodCwNCisgICAgICAgICAgICAgICAgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOw0KKyAgICAgICAgZmluYWwgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoYml0bWFwKTsNCisgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKHNyY0JpdG1hcCwgbmV3IFJlY3QoMCwgMCwgc3JjQml0bWFwLmdldFdpZHRoKCksIHNyY0JpdG1hcC5nZXRIZWlnaHQoKSksDQorICAgICAgICAgICAgICAgIG5ldyBSZWN0KDAsIDAsIChpbnQpYml0bWFwV2lkdGgsIChpbnQpYml0bWFwSGVpZ2h0KSwgc1Jlc2l6ZVBhaW50KTsNCisgICAgICAgIC8vIFJlbGVhc2UgdGhlIHNvdXJjZSBiaXRtYXANCisgICAgICAgIHNyY0JpdG1hcC5yZWN5Y2xlKCk7DQorICAgICAgICByZXR1cm4gYml0bWFwOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9NZWRpYUl0ZW0uamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9NZWRpYUl0ZW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kOWMzOGFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL01lZGlhSXRlbS5qYXZhCkBAIC0wLDAgKzEsNTQ2IEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS52aWRlb2VkaXRvcjsNCisNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOw0KKw0KKy8qKg0KKyAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgZGVzY3JpYmVzIHRoZSBiYXNlIGNsYXNzIGZvciBhbnkgTWVkaWFJdGVtLiBPYmplY3RzIGFyZQ0KKyAqIGRlZmluZWQgd2l0aCBhIGZpbGUgcGF0aCBhcyBhIHNvdXJjZSBkYXRhLg0KKyAqIHtAaGlkZX0NCitzICovDQorcHVibGljIGFic3RyYWN0IGNsYXNzIE1lZGlhSXRlbSB7DQorICAgIC8vIEEgY29uc3RhbnQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZW5kIG9mIHRoZSBmaWxlIChpbnN0ZWFkIG9mDQorICAgIC8vIHByb3ZpZGluZyB0aGUgYWN0dWFsIGR1cmF0aW9uIG9mIHRoZSBtZWRpYSBpdGVtKS4NCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRU5EX09GX0ZJTEUgPSAtMTsNCisNCisgICAgLy8gUmVuZGVyaW5nIG1vZGVzDQorICAgIC8qKg0KKyAgICAgKiBXaGVuIHVzaW5nIHRoZSBSRU5ERVJJTkdfTU9ERV9CTEFDS19CT1JERVIgcmVuZGVyaW5nIG1vZGUgdmlkZW8gZnJhbWVzDQorICAgICAqIGFyZSByZXNpemVkIGJ5IHByZXNlcnZpbmcgdGhlIGFzcGVjdCByYXRpbyB1bnRpbCB0aGUgbW92aWUgbWF0Y2hlcyBvbmUgb2YNCisgICAgICogdGhlIGRpbWVuc2lvbnMgb2YgdGhlIG91dHB1dCBtb3ZpZS4gVGhlIGFyZWFzIG91dHNpZGUgdGhlIHJlc2l6ZWQgdmlkZW8NCisgICAgICogY2xpcCBhcmUgcmVuZGVyZWQgYmxhY2suDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU5ERVJJTkdfTU9ERV9CTEFDS19CT1JERVIgPSAwOw0KKyAgICAvKioNCisgICAgICogV2hlbiB1c2luZyB0aGUgUkVOREVSSU5HX01PREVfU1RSRVRDSCByZW5kZXJpbmcgbW9kZSB2aWRlbyBmcmFtZXMgYXJlDQorICAgICAqIHN0cmV0Y2hlZCBob3Jpem9udGFsbHkgb3IgdmVydGljYWxseSB0byBtYXRjaCB0aGUgY3VycmVudCBhc3BlY3QgcmF0aW8gb2YNCisgICAgICogdGhlIG1vdmllLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVOREVSSU5HX01PREVfU1RSRVRDSCA9IDE7DQorDQorDQorICAgIC8vIFRoZSB1bmlxdWUgaWQgb2YgdGhlIE1lZGlhSXRlbQ0KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVW5pcXVlSWQ7DQorDQorICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgTWVkaWFJdGVtDQorICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgbUZpbGVuYW1lOw0KKw0KKyAgICAvLyBMaXN0IG9mIGVmZmVjdHMNCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEVmZmVjdD4gbUVmZmVjdHM7DQorDQorICAgIC8vIExpc3Qgb2Ygb3ZlcmxheXMNCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE92ZXJsYXk+IG1PdmVybGF5czsNCisNCisgICAgLy8gVGhlIHJlbmRlcmluZyBtb2RlDQorICAgIHByaXZhdGUgaW50IG1SZW5kZXJpbmdNb2RlOw0KKw0KKyAgICAvLyBCZWdpbm5pbmcgYW5kIGVuZCB0cmFuc2l0aW9ucw0KKyAgICBwcm90ZWN0ZWQgVHJhbnNpdGlvbiBtQmVnaW5UcmFuc2l0aW9uOw0KKyAgICBwcm90ZWN0ZWQgVHJhbnNpdGlvbiBtRW5kVHJhbnNpdGlvbjsNCisNCisgICAgLyoqDQorICAgICAqIENvbnN0cnVjdG9yDQorICAgICAqDQorICAgICAqIEBwYXJhbSBlZGl0b3IgVGhlIHZpZGVvIGVkaXRvciByZWZlcmVuY2UNCisgICAgICogQHBhcmFtIG1lZGlhSXRlbUlkIFRoZSBNZWRpYUl0ZW0gaWQNCisgICAgICogQHBhcmFtIGZpbGVuYW1lIG5hbWUgb2YgdGhlIG1lZGlhIGZpbGUuDQorICAgICAqIEBwYXJhbSByZW5kZXJpbmdNb2RlIFRoZSByZW5kZXJpbmcgbW9kZQ0KKyAgICAgKg0KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGZpbGUgaXMgbm90IGZvdW5kDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGEgY2FwYWJpbGl0eSBzdWNoIGFzIGZpbGUgZm9ybWF0IGlzIG5vdA0KKyAgICAgKiAgICAgICAgICAgICBzdXBwb3J0ZWQgdGhlIGV4Y2VwdGlvbiBvYmplY3QgY29udGFpbnMgdGhlIHVuc3VwcG9ydGVkDQorICAgICAqICAgICAgICAgICAgIGNhcGFiaWxpdHkNCisgICAgICovDQorICAgIHByb3RlY3RlZCBNZWRpYUl0ZW0oVmlkZW9FZGl0b3IgZWRpdG9yLCBTdHJpbmcgbWVkaWFJdGVtSWQsIFN0cmluZyBmaWxlbmFtZSwNCisgICAgICAgICAgICBpbnQgcmVuZGVyaW5nTW9kZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIG1VbmlxdWVJZCA9IG1lZGlhSXRlbUlkOw0KKyAgICAgICAgbUZpbGVuYW1lID0gZmlsZW5hbWU7DQorICAgICAgICBtUmVuZGVyaW5nTW9kZSA9IHJlbmRlcmluZ01vZGU7DQorICAgICAgICBtRWZmZWN0cyA9IG5ldyBBcnJheUxpc3Q8RWZmZWN0PigpOw0KKyAgICAgICAgbU92ZXJsYXlzID0gbmV3IEFycmF5TGlzdDxPdmVybGF5PigpOw0KKyAgICAgICAgbUJlZ2luVHJhbnNpdGlvbiA9IG51bGw7DQorICAgICAgICBtRW5kVHJhbnNpdGlvbiA9IG51bGw7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIGlkIG9mIHRoZSBtZWRpYSBpdGVtDQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgew0KKyAgICAgICAgcmV0dXJuIG1VbmlxdWVJZDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgbWVkaWEgc291cmNlIGZpbGUgbmFtZQ0KKyAgICAgKi8NCisgICAgcHVibGljIFN0cmluZyBnZXRGaWxlbmFtZSgpIHsNCisgICAgICAgIHJldHVybiBtRmlsZW5hbWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIElmIGFzcGVjdCByYXRpbyBvZiB0aGUgTWVkaWFJdGVtIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBhc3BlY3QgcmF0aW8gb2YNCisgICAgICogdGhlIGVkaXRvciB0aGVuIHRoaXMgQVBJIGNvbnRyb2xzIHRoZSByZW5kZXJpbmcgbW9kZS4NCisgICAgICoNCisgICAgICogQHBhcmFtIHJlbmRlcmluZ01vZGUgcmVuZGVyaW5nIG1vZGUuIEl0IGlzIG9uZSBvZjoNCisgICAgICogICAgICAgICAgICB7QGxpbmsgI1JFTkRFUklOR19NT0RFX0JMQUNLX0JPUkRFUn0sDQorICAgICAqICAgICAgICAgICAge0BsaW5rICNSRU5ERVJJTkdfTU9ERV9TVFJFVENIfQ0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0UmVuZGVyaW5nTW9kZShpbnQgcmVuZGVyaW5nTW9kZSkgew0KKyAgICAgICAgbVJlbmRlcmluZ01vZGUgPSByZW5kZXJpbmdNb2RlOw0KKyAgICAgICAgaWYgKG1CZWdpblRyYW5zaXRpb24gIT0gbnVsbCkgew0KKyAgICAgICAgICAgIG1CZWdpblRyYW5zaXRpb24uaW52YWxpZGF0ZSgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKG1FbmRUcmFuc2l0aW9uICE9IG51bGwpIHsNCisgICAgICAgICAgICBtRW5kVHJhbnNpdGlvbi5pbnZhbGlkYXRlKCk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIHJlbmRlcmluZyBtb2RlDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldFJlbmRlcmluZ01vZGUoKSB7DQorICAgICAgICByZXR1cm4gbVJlbmRlcmluZ01vZGU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uIFRoZSBiZWdpbm5pbmcgdHJhbnNpdGlvbg0KKyAgICAgKi8NCisgICAgdm9pZCBzZXRCZWdpblRyYW5zaXRpb24oVHJhbnNpdGlvbiB0cmFuc2l0aW9uKSB7DQorICAgICAgICBtQmVnaW5UcmFuc2l0aW9uID0gdHJhbnNpdGlvbjsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgYmVnaW4gdHJhbnNpdGlvbg0KKyAgICAgKi8NCisgICAgcHVibGljIFRyYW5zaXRpb24gZ2V0QmVnaW5UcmFuc2l0aW9uKCkgew0KKyAgICAgICAgcmV0dXJuIG1CZWdpblRyYW5zaXRpb247DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uIFRoZSBlbmQgdHJhbnNpdGlvbg0KKyAgICAgKi8NCisgICAgdm9pZCBzZXRFbmRUcmFuc2l0aW9uKFRyYW5zaXRpb24gdHJhbnNpdGlvbikgew0KKyAgICAgICAgbUVuZFRyYW5zaXRpb24gPSB0cmFuc2l0aW9uOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBlbmQgdHJhbnNpdGlvbg0KKyAgICAgKi8NCisgICAgcHVibGljIFRyYW5zaXRpb24gZ2V0RW5kVHJhbnNpdGlvbigpIHsNCisgICAgICAgIHJldHVybiBtRW5kVHJhbnNpdGlvbjsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgdGltZWxpbmUgZHVyYXRpb24uIFRoaXMgaXMgdGhlIGFjdHVhbCBkdXJhdGlvbiBpbiB0aGUNCisgICAgICogICAgICB0aW1lbGluZSAodHJpbW1lZCBkdXJhdGlvbikNCisgICAgICovDQorICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIGdldFRpbWVsaW5lRHVyYXRpb24oKTsNCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIHNvdXJjZSBmaWxlIHR5cGUNCisgICAgICovDQorICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RmlsZVR5cGUoKTsNCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gR2V0IHRoZSBuYXRpdmUgd2lkdGggb2YgdGhlIG1lZGlhIGl0ZW0NCisgICAgICovDQorICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0V2lkdGgoKTsNCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gR2V0IHRoZSBuYXRpdmUgaGVpZ2h0IG9mIHRoZSBtZWRpYSBpdGVtDQorICAgICAqLw0KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEhlaWdodCgpOw0KKw0KKyAgICAvKioNCisgICAgICogR2V0IGFzcGVjdCByYXRpbyBvZiB0aGUgc291cmNlIG1lZGlhIGl0ZW0uDQorICAgICAqDQorICAgICAqIEByZXR1cm4gdGhlIGFzcGVjdCByYXRpbyBhcyBkZXNjcmliZWQgaW4gTWVkaWFQcm9wZXJ0aWVzLg0KKyAgICAgKiAgTWVkaWFQcm9wZXJ0aWVzLkFTUEVDVF9SQVRJT19VTkRFRklORUQgaWYgYXNwZWN0IHJhdGlvIGlzIG5vdA0KKyAgICAgKiAgc3VwcG9ydGVkIGFzIGluIE1lZGlhUHJvcGVydGllcw0KKyAgICAgKi8NCisgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRBc3BlY3RSYXRpbygpOw0KKw0KKyAgICAvKioNCisgICAgICogQWRkIHRoZSBzcGVjaWZpZWQgZWZmZWN0IHRvIHRoaXMgbWVkaWEgaXRlbS4NCisgICAgICoNCisgICAgICogTm90ZSB0aGF0IGNlcnRhaW4gdHlwZXMgb2YgZWZmZWN0cyBjYW5ub3QgYmUgYXBwbGllZCB0byB2aWRlbyBhbmQgdG8NCisgICAgICogaW1hZ2UgbWVkaWEgaXRlbXMuIEZvciBleGFtcGxlIGluIGNlcnRhaW4gaW1wbGVtZW50YXRpb24gYSBLZW4gQnVybnMNCisgICAgICogaW1wbGVtZW50YXRpb24gY2Fubm90IGJlIGFwcGxpZWQgdG8gdmlkZW8gbWVkaWEgaXRlbS4NCisgICAgICoNCisgICAgICogVGhpcyBtZXRob2QgaW52YWxpZGF0ZXMgdHJhbnNpdGlvbiB2aWRlbyBjbGlwcyBpZiB0aGUNCisgICAgICogZWZmZWN0IG92ZXJsYXBzIHdpdGggdGhlIGJlZ2lubmluZyBhbmQvb3IgdGhlIGVuZCB0cmFuc2l0aW9uLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gZWZmZWN0IFRoZSBlZmZlY3QgdG8gYXBwbHkNCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBwcmV2aWV3IG9yIGFuIGV4cG9ydCBpcyBpbiBwcm9ncmVzcw0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZWZmZWN0IHN0YXJ0IGFuZC9vciBkdXJhdGlvbiBhcmUNCisgICAgICogICAgICBpbnZhbGlkIG9yIGlmIHRoZSBlZmZlY3QgY2Fubm90IGJlIGFwcGxpZWQgdG8gdGhpcyB0eXBlIG9mIG1lZGlhDQorICAgICAqICAgICAgaXRlbSBvciBpZiB0aGUgZWZmZWN0IGlkIGlzIG5vdCB1bmlxdWUgYWNyb3NzIGFsbCB0aGUgRWZmZWN0cw0KKyAgICAgKiAgICAgIGFkZGVkLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgYWRkRWZmZWN0KEVmZmVjdCBlZmZlY3QpIHsNCisgICAgICAgIGlmIChlZmZlY3QuZ2V0TWVkaWFJdGVtKCkgIT0gdGhpcykgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1lZGlhIGl0ZW0gbWlzbWF0Y2giKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChtRWZmZWN0cy5jb250YWlucyhlZmZlY3QpKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRWZmZWN0IGFscmVhZHkgZXhpc3RzOiAiICsgZWZmZWN0LmdldElkKCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKGVmZmVjdC5nZXRTdGFydFRpbWUoKSArIGVmZmVjdC5nZXREdXJhdGlvbigpID4gZ2V0VGltZWxpbmVEdXJhdGlvbigpKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigNCisgICAgICAgICAgICAgICAgICAgICJFZmZlY3Qgc3RhcnQgdGltZSArIGVmZmVjdCBkdXJhdGlvbiA+IG1lZGlhIGNsaXAgZHVyYXRpb24iKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIG1FZmZlY3RzLmFkZChlZmZlY3QpOw0KKyAgICAgICAgaW52YWxpZGF0ZVRyYW5zaXRpb25zKGVmZmVjdCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJlbW92ZSB0aGUgZWZmZWN0IHdpdGggdGhlIHNwZWNpZmllZCBpZC4NCisgICAgICoNCisgICAgICogVGhpcyBtZXRob2QgaW52YWxpZGF0ZXMgYSB0cmFuc2l0aW9uIHZpZGVvIGNsaXAgaWYgdGhlIGVmZmVjdCBvdmVybGFwcw0KKyAgICAgKiB3aXRoIGEgdHJhbnNpdGlvbi4NCisgICAgICoNCisgICAgICogQHBhcmFtIGVmZmVjdElkIFRoZSBpZCBvZiB0aGUgZWZmZWN0IHRvIGJlIHJlbW92ZWQNCisgICAgICoNCisgICAgICogQHJldHVybiBUaGUgZWZmZWN0IHRoYXQgd2FzIHJlbW92ZWQNCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBwcmV2aWV3IG9yIGFuIGV4cG9ydCBpcyBpbiBwcm9ncmVzcw0KKyAgICAgKi8NCisgICAgcHVibGljIEVmZmVjdCByZW1vdmVFZmZlY3QoU3RyaW5nIGVmZmVjdElkKSB7DQorICAgICAgICBmb3IgKEVmZmVjdCBlZmZlY3QgOiBtRWZmZWN0cykgew0KKyAgICAgICAgICAgIGlmIChlZmZlY3QuZ2V0SWQoKS5lcXVhbHMoZWZmZWN0SWQpKSB7DQorICAgICAgICAgICAgICAgIG1FZmZlY3RzLnJlbW92ZShlZmZlY3QpOw0KKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlVHJhbnNpdGlvbnMoZWZmZWN0KTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGVmZmVjdDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogRmluZCB0aGUgZWZmZWN0IHdpdGggdGhlIHNwZWNpZmllZCBpZA0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gZWZmZWN0SWQgVGhlIGVmZmVjdCBpZA0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBlZmZlY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGlkIChudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0KQ0KKyAgICAgKi8NCisgICAgcHVibGljIEVmZmVjdCBnZXRFZmZlY3QoU3RyaW5nIGVmZmVjdElkKSB7DQorICAgICAgICBmb3IgKEVmZmVjdCBlZmZlY3QgOiBtRWZmZWN0cykgew0KKyAgICAgICAgICAgIGlmIChlZmZlY3QuZ2V0SWQoKS5lcXVhbHMoZWZmZWN0SWQpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBlZmZlY3Q7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEdldCB0aGUgbGlzdCBvZiBlZmZlY3RzLg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIHRoZSBlZmZlY3RzIGxpc3QuIElmIG5vIGVmZmVjdHMgZXhpc3QgYW4gZW1wdHkgbGlzdCB3aWxsIGJlIHJldHVybmVkLg0KKyAgICAgKi8NCisgICAgcHVibGljIExpc3Q8RWZmZWN0PiBnZXRBbGxFZmZlY3RzKCkgew0KKyAgICAgICAgcmV0dXJuIG1FZmZlY3RzOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBZGQgYW4gb3ZlcmxheSB0byB0aGUgc3Rvcnlib2FyZC4gVGhpcyBtZXRob2QgaW52YWxpZGF0ZXMgYSB0cmFuc2l0aW9uDQorICAgICAqIHZpZGVvIGNsaXAgaWYgdGhlIG92ZXJsYXkgb3ZlcmxhcHMgd2l0aCBhIHRyYW5zaXRpb24uDQorICAgICAqDQorICAgICAqIEBwYXJhbSBvdmVybGF5IFRoZSBvdmVybGF5IHRvIGFkZA0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIHByZXZpZXcgb3IgYW4gZXhwb3J0IGlzIGluIHByb2dyZXNzIG9yDQorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBvdmVybGF5IGlkIGlzIG5vdCB1bmlxdWUgYWNyb3NzIGFsbCB0aGUgb3ZlcmxheXMNCisgICAgICogICAgICAgICAgICAgYWRkZWQgb3IgaWYgdGhlIGJpdG1hcCBpcyBub3Qgc3BlY2lmaWVkIG9yIGlmIHRoZSBkaW1lbnNpb25zIG9mDQorICAgICAqICAgICAgICAgICAgIHRoZSBiaXRtYXAgZG8gbm90IG1hdGNoIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBtZWRpYSBpdGVtDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBhZGRPdmVybGF5KE92ZXJsYXkgb3ZlcmxheSkgew0KKyAgICAgICAgaWYgKG92ZXJsYXkuZ2V0TWVkaWFJdGVtKCkgIT0gdGhpcykgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1lZGlhIGl0ZW0gbWlzbWF0Y2giKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChtT3ZlcmxheXMuY29udGFpbnMob3ZlcmxheSkpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPdmVybGF5IGFscmVhZHkgZXhpc3RzOiAiICsgb3ZlcmxheS5nZXRJZCgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChvdmVybGF5LmdldFN0YXJ0VGltZSgpICsgb3ZlcmxheS5nZXREdXJhdGlvbigpID4gZ2V0VGltZWxpbmVEdXJhdGlvbigpKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigNCisgICAgICAgICAgICAgICAgICAgICJPdmVybGF5IHN0YXJ0IHRpbWUgKyBvdmVybGF5IGR1cmF0aW9uID4gbWVkaWEgY2xpcCBkdXJhdGlvbiIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKG92ZXJsYXkgaW5zdGFuY2VvZiBPdmVybGF5RnJhbWUpIHsNCisgICAgICAgICAgICBmaW5hbCBPdmVybGF5RnJhbWUgZnJhbWUgPSAoT3ZlcmxheUZyYW1lKW92ZXJsYXk7DQorICAgICAgICAgICAgZmluYWwgQml0bWFwIGJpdG1hcCA9IGZyYW1lLmdldEJpdG1hcCgpOw0KKyAgICAgICAgICAgIGlmIChiaXRtYXAgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPdmVybGF5IGJpdG1hcCBub3Qgc3BlY2lmaWVkIik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGZpbmFsIGludCBzY2FsZWRXaWR0aCwgc2NhbGVkSGVpZ2h0Ow0KKyAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgTWVkaWFWaWRlb0l0ZW0pIHsNCisgICAgICAgICAgICAgICAgc2NhbGVkV2lkdGggPSBnZXRXaWR0aCgpOw0KKyAgICAgICAgICAgICAgICBzY2FsZWRIZWlnaHQgPSBnZXRIZWlnaHQoKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBzY2FsZWRXaWR0aCA9ICgoTWVkaWFJbWFnZUl0ZW0pdGhpcykuZ2V0U2NhbGVkV2lkdGgoKTsNCisgICAgICAgICAgICAgICAgc2NhbGVkSGVpZ2h0ID0gKChNZWRpYUltYWdlSXRlbSl0aGlzKS5nZXRTY2FsZWRIZWlnaHQoKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8gVGhlIGRpbWVuc2lvbnMgb2YgdGhlIG92ZXJsYXkgYml0bWFwIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlDQorICAgICAgICAgICAgLy8gbWVkaWEgaXRlbSBkaW1lbnNpb25zDQorICAgICAgICAgICAgaWYgKGJpdG1hcC5nZXRXaWR0aCgpICE9IHNjYWxlZFdpZHRoIHx8IGJpdG1hcC5nZXRIZWlnaHQoKSAhPSBzY2FsZWRIZWlnaHQpIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigNCisgICAgICAgICAgICAgICAgICAgICAgICAiQml0bWFwIGRpbWVuc2lvbnMgbXVzdCBtYXRjaCBtZWRpYSBpdGVtIGRpbWVuc2lvbnMiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk92ZXJsYXkgbm90IHN1cHBvcnRlZCIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgbU92ZXJsYXlzLmFkZChvdmVybGF5KTsNCisgICAgICAgIGludmFsaWRhdGVUcmFuc2l0aW9ucyhvdmVybGF5KTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmVtb3ZlIHRoZSBvdmVybGF5IHdpdGggdGhlIHNwZWNpZmllZCBpZC4NCisgICAgICoNCisgICAgICogVGhpcyBtZXRob2QgaW52YWxpZGF0ZXMgYSB0cmFuc2l0aW9uIHZpZGVvIGNsaXAgaWYgdGhlIG92ZXJsYXkgb3ZlcmxhcHMNCisgICAgICogd2l0aCBhIHRyYW5zaXRpb24uDQorICAgICAqDQorICAgICAqIEBwYXJhbSBvdmVybGF5SWQgVGhlIGlkIG9mIHRoZSBvdmVybGF5IHRvIGJlIHJlbW92ZWQNCisgICAgICoNCisgICAgICogQHJldHVybiBUaGUgb3ZlcmxheSB0aGF0IHdhcyByZW1vdmVkDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGEgcHJldmlldyBvciBhbiBleHBvcnQgaXMgaW4gcHJvZ3Jlc3MNCisgICAgICovDQorICAgIHB1YmxpYyBPdmVybGF5IHJlbW92ZU92ZXJsYXkoU3RyaW5nIG92ZXJsYXlJZCkgew0KKyAgICAgICAgZm9yIChPdmVybGF5IG92ZXJsYXkgOiBtT3ZlcmxheXMpIHsNCisgICAgICAgICAgICBpZiAob3ZlcmxheS5nZXRJZCgpLmVxdWFscyhvdmVybGF5SWQpKSB7DQorICAgICAgICAgICAgICAgIG1PdmVybGF5cy5yZW1vdmUob3ZlcmxheSk7DQorICAgICAgICAgICAgICAgIGlmIChvdmVybGF5IGluc3RhbmNlb2YgT3ZlcmxheUZyYW1lKSB7DQorICAgICAgICAgICAgICAgICAgICAoKE92ZXJsYXlGcmFtZSlvdmVybGF5KS5pbnZhbGlkYXRlKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVRyYW5zaXRpb25zKG92ZXJsYXkpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gb3ZlcmxheTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogRmluZCB0aGUgb3ZlcmxheSB3aXRoIHRoZSBzcGVjaWZpZWQgaWQNCisgICAgICoNCisgICAgICogQHBhcmFtIG92ZXJsYXlJZCBUaGUgb3ZlcmxheSBpZA0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBvdmVybGF5IHdpdGggdGhlIHNwZWNpZmllZCBpZCAobnVsbCBpZiBpdCBkb2VzIG5vdCBleGlzdCkNCisgICAgICovDQorICAgIHB1YmxpYyBPdmVybGF5IGdldE92ZXJsYXkoU3RyaW5nIG92ZXJsYXlJZCkgew0KKyAgICAgICAgZm9yIChPdmVybGF5IG92ZXJsYXkgOiBtT3ZlcmxheXMpIHsNCisgICAgICAgICAgICBpZiAob3ZlcmxheS5nZXRJZCgpLmVxdWFscyhvdmVybGF5SWQpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBvdmVybGF5Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXQgdGhlIGxpc3Qgb2Ygb3ZlcmxheXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVkaWEgaXRlbQ0KKyAgICAgKg0KKyAgICAgKiBOb3RlIHRoYXQgaWYgYW55IG92ZXJsYXkgc291cmNlIGZpbGVzIGFyZSBub3QgYWNjZXNzaWJsZSBhbnltb3JlLA0KKyAgICAgKiB0aGlzIG1ldGhvZCB3aWxsIHN0aWxsIHByb3ZpZGUgdGhlIGZ1bGwgbGlzdCBvZiBvdmVybGF5cy4NCisgICAgICoNCisgICAgICogQHJldHVybiBUaGUgbGlzdCBvZiBvdmVybGF5cy4gSWYgbm8gb3ZlcmxheXMgZXhpc3QgYW4gZW1wdHkgbGlzdCB3aWxsDQorICAgICAqICBiZSByZXR1cm5lZC4NCisgICAgICovDQorICAgIHB1YmxpYyBMaXN0PE92ZXJsYXk+IGdldEFsbE92ZXJsYXlzKCkgew0KKyAgICAgICAgcmV0dXJuIG1PdmVybGF5czsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ3JlYXRlIGEgdGh1bWJuYWlsIGF0IHNwZWNpZmllZCB0aW1lIGluIGEgdmlkZW8gc3RyZWFtIGluIEJpdG1hcCBmb3JtYXQNCisgICAgICoNCisgICAgICogQHBhcmFtIHdpZHRoIHdpZHRoIG9mIHRoZSB0aHVtYm5haWwgaW4gcGl4ZWxzDQorICAgICAqIEBwYXJhbSBoZWlnaHQgaGVpZ2h0IG9mIHRoZSB0aHVtYm5haWwgaW4gcGl4ZWxzDQorICAgICAqIEBwYXJhbSB0aW1lTXMgVGhlIHRpbWUgaW4gdGhlIHNvdXJjZSB2aWRlbyBmaWxlIGF0IHdoaWNoIHRoZSB0aHVtYm5haWwgaXMNCisgICAgICogICAgICAgICAgICByZXF1ZXN0ZWQgKGV2ZW4gaWYgdHJpbW1lZCkuDQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIHRodW1ibmFpbCBhcyBhIEJpdG1hcC4NCisgICAgICoNCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhIGZpbGUgZXJyb3Igb2NjdXJzDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRpbWUgaXMgb3V0IG9mIHZpZGVvIGR1cmF0aW9uDQorICAgICAqLw0KKyAgICBwdWJsaWMgYWJzdHJhY3QgQml0bWFwIGdldFRodW1ibmFpbChpbnQgd2lkdGgsIGludCBoZWlnaHQsIGxvbmcgdGltZU1zKSB0aHJvd3MgSU9FeGNlcHRpb247DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXQgdGhlIGFycmF5IG9mIEJpdG1hcCB0aHVtYm5haWxzIGJldHdlZW4gc3RhcnQgYW5kIGVuZC4NCisgICAgICoNCisgICAgICogQHBhcmFtIHdpZHRoIHdpZHRoIG9mIHRoZSB0aHVtYm5haWwgaW4gcGl4ZWxzDQorICAgICAqIEBwYXJhbSBoZWlnaHQgaGVpZ2h0IG9mIHRoZSB0aHVtYm5haWwgaW4gcGl4ZWxzDQorICAgICAqIEBwYXJhbSBzdGFydE1zIFRoZSBzdGFydCBvZiB0aW1lIHJhbmdlIGluIG1pbGxpc2Vjb25kcw0KKyAgICAgKiBAcGFyYW0gZW5kTXMgVGhlIGVuZCBvZiB0aGUgdGltZSByYW5nZSBpbiBtaWxsaXNlY29uZHMNCisgICAgICogQHBhcmFtIHRodW1ibmFpbENvdW50IFRoZSB0aHVtYm5haWwgY291bnQNCisgICAgICoNCisgICAgICogQHJldHVybiBUaGUgYXJyYXkgb2YgQml0bWFwcw0KKyAgICAgKg0KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGEgZmlsZSBlcnJvciBvY2N1cnMNCisgICAgICovDQorICAgIHB1YmxpYyBhYnN0cmFjdCBCaXRtYXBbXSBnZXRUaHVtYm5haWxMaXN0KGludCB3aWR0aCwgaW50IGhlaWdodCwgbG9uZyBzdGFydE1zLCBsb25nIGVuZE1zLA0KKyAgICAgICAgICAgIGludCB0aHVtYm5haWxDb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uOw0KKw0KKyAgICAvKg0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsNCisgICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIE1lZGlhSXRlbSkpIHsNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbVVuaXF1ZUlkLmVxdWFscygoKE1lZGlhSXRlbSlvYmplY3QpLm1VbmlxdWVJZCk7DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7DQorICAgICAgICByZXR1cm4gbVVuaXF1ZUlkLmhhc2hDb2RlKCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEludmFsaWRhdGUgdGhlIHN0YXJ0IGFuZCBlbmQgdHJhbnNpdGlvbnMgaWYgbmVjZXNzYXJ5DQorICAgICAqDQorICAgICAqIEBwYXJhbSBlZmZlY3QgVGhlIGVmZmVjdCB0aGF0IHdhcyBhZGRlZCBvciByZW1vdmVkDQorICAgICAqLw0KKyAgICB2b2lkIGludmFsaWRhdGVUcmFuc2l0aW9ucyhFZmZlY3QgZWZmZWN0KSB7DQorICAgICAgICAvLyBDaGVjayBpZiB0aGUgZWZmZWN0IG92ZXJsYXBzIHdpdGggdGhlIGJlZ2lubmluZyBhbmQgZW5kIHRyYW5zaXRpb25zDQorICAgICAgICBpZiAobUJlZ2luVHJhbnNpdGlvbiAhPSBudWxsKSB7DQorICAgICAgICAgICAgaWYgKGVmZmVjdC5nZXRTdGFydFRpbWUoKSA8IG1CZWdpblRyYW5zaXRpb24uZ2V0RHVyYXRpb24oKSkgew0KKyAgICAgICAgICAgICAgICBtQmVnaW5UcmFuc2l0aW9uLmludmFsaWRhdGUoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAobUVuZFRyYW5zaXRpb24gIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGlmIChlZmZlY3QuZ2V0U3RhcnRUaW1lKCkgKyBlZmZlY3QuZ2V0RHVyYXRpb24oKSA+IGdldFRpbWVsaW5lRHVyYXRpb24oKQ0KKyAgICAgICAgICAgICAgICAgICAgLSBtRW5kVHJhbnNpdGlvbi5nZXREdXJhdGlvbigpKSB7DQorICAgICAgICAgICAgICAgIG1FbmRUcmFuc2l0aW9uLmludmFsaWRhdGUoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEludmFsaWRhdGUgdGhlIHN0YXJ0IGFuZCBlbmQgdHJhbnNpdGlvbnMgaWYgbmVjZXNzYXJ5DQorICAgICAqDQorICAgICAqIEBwYXJhbSBvdmVybGF5IFRoZSBlZmZlY3QgdGhhdCB3YXMgYWRkZWQgb3IgcmVtb3ZlZA0KKyAgICAgKi8NCisgICAgdm9pZCBpbnZhbGlkYXRlVHJhbnNpdGlvbnMoT3ZlcmxheSBvdmVybGF5KSB7DQorICAgICAgICAvLyBDaGVjayBpZiB0aGUgb3ZlcmxheSBvdmVybGFwcyB3aXRoIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCB0cmFuc2l0aW9ucw0KKyAgICAgICAgaWYgKG1CZWdpblRyYW5zaXRpb24gIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGlmIChvdmVybGF5LmdldFN0YXJ0VGltZSgpIDwgbUJlZ2luVHJhbnNpdGlvbi5nZXREdXJhdGlvbigpKSB7DQorICAgICAgICAgICAgICAgIG1CZWdpblRyYW5zaXRpb24uaW52YWxpZGF0ZSgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChtRW5kVHJhbnNpdGlvbiAhPSBudWxsKSB7DQorICAgICAgICAgICAgaWYgKG92ZXJsYXkuZ2V0U3RhcnRUaW1lKCkgKyBvdmVybGF5LmdldER1cmF0aW9uKCkgPiBnZXRUaW1lbGluZUR1cmF0aW9uKCkNCisgICAgICAgICAgICAgICAgICAgIC0gbUVuZFRyYW5zaXRpb24uZ2V0RHVyYXRpb24oKSkgew0KKyAgICAgICAgICAgICAgICBtRW5kVHJhbnNpdGlvbi5pbnZhbGlkYXRlKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBZGp1c3QgdGhlIGR1cmF0aW9uIG9mIGVmZmVjdHMsIG92ZXJsYXlzIGFuZCB0cmFuc2l0aW9ucy4NCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgYSBtZWRpYSBpdGVtIGR1cmF0aW9uIGlzIGNoYW5nZWQuDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGp1c3RFbGVtZW50c0R1cmF0aW9uKCkgew0KKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGR1cmF0aW9uIG9mIHRyYW5zaXRpb25zIG5lZWQgdG8gYmUgYWRqdXN0ZWQNCisgICAgICAgIGlmIChtQmVnaW5UcmFuc2l0aW9uICE9IG51bGwpIHsNCisgICAgICAgICAgICBmaW5hbCBsb25nIG1heER1cmF0aW9uTXMgPSBtQmVnaW5UcmFuc2l0aW9uLmdldE1heGltdW1EdXJhdGlvbigpOw0KKyAgICAgICAgICAgIGlmIChtQmVnaW5UcmFuc2l0aW9uLmdldER1cmF0aW9uKCkgPiBtYXhEdXJhdGlvbk1zKSB7DQorICAgICAgICAgICAgICAgIG1CZWdpblRyYW5zaXRpb24uc2V0RHVyYXRpb24obWF4RHVyYXRpb25Ncyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKG1FbmRUcmFuc2l0aW9uICE9IG51bGwpIHsNCisgICAgICAgICAgICBmaW5hbCBsb25nIG1heER1cmF0aW9uTXMgPSBtRW5kVHJhbnNpdGlvbi5nZXRNYXhpbXVtRHVyYXRpb24oKTsNCisgICAgICAgICAgICBpZiAobUVuZFRyYW5zaXRpb24uZ2V0RHVyYXRpb24oKSA+IG1heER1cmF0aW9uTXMpIHsNCisgICAgICAgICAgICAgICAgbUVuZFRyYW5zaXRpb24uc2V0RHVyYXRpb24obWF4RHVyYXRpb25Ncyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgZmluYWwgTGlzdDxPdmVybGF5PiBvdmVybGF5cyA9IGdldEFsbE92ZXJsYXlzKCk7DQorICAgICAgICBmb3IgKE92ZXJsYXkgb3ZlcmxheSA6IG92ZXJsYXlzKSB7DQorICAgICAgICAgICAgLy8gQWRqdXN0IHRoZSBzdGFydCB0aW1lIGlmIG5lY2Vzc2FyeQ0KKyAgICAgICAgICAgIGZpbmFsIGxvbmcgb3ZlcmxheVN0YXJ0VGltZU1zOw0KKyAgICAgICAgICAgIGlmIChvdmVybGF5LmdldFN0YXJ0VGltZSgpID4gZ2V0VGltZWxpbmVEdXJhdGlvbigpKSB7DQorICAgICAgICAgICAgICAgIG92ZXJsYXlTdGFydFRpbWVNcyA9IDA7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgb3ZlcmxheVN0YXJ0VGltZU1zID0gb3ZlcmxheS5nZXRTdGFydFRpbWUoKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy8gQWRqdXN0IHRoZSBkdXJhdGlvbiBpZiBuZWNlc3NhcnkNCisgICAgICAgICAgICBmaW5hbCBsb25nIG92ZXJsYXlEdXJhdGlvbk1zOw0KKyAgICAgICAgICAgIGlmIChvdmVybGF5U3RhcnRUaW1lTXMgKyBvdmVybGF5LmdldER1cmF0aW9uKCkgPiBnZXRUaW1lbGluZUR1cmF0aW9uKCkpIHsNCisgICAgICAgICAgICAgICAgb3ZlcmxheUR1cmF0aW9uTXMgPSBnZXRUaW1lbGluZUR1cmF0aW9uKCkgLSBvdmVybGF5U3RhcnRUaW1lTXM7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgb3ZlcmxheUR1cmF0aW9uTXMgPSBvdmVybGF5LmdldER1cmF0aW9uKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGlmIChvdmVybGF5U3RhcnRUaW1lTXMgIT0gb3ZlcmxheS5nZXRTdGFydFRpbWUoKSB8fA0KKyAgICAgICAgICAgICAgICAgICAgb3ZlcmxheUR1cmF0aW9uTXMgIT0gb3ZlcmxheS5nZXREdXJhdGlvbigpKSB7DQorICAgICAgICAgICAgICAgIG92ZXJsYXkuc2V0U3RhcnRUaW1lQW5kRHVyYXRpb24ob3ZlcmxheVN0YXJ0VGltZU1zLCBvdmVybGF5RHVyYXRpb25Ncyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgZmluYWwgTGlzdDxFZmZlY3Q+IGVmZmVjdHMgPSBnZXRBbGxFZmZlY3RzKCk7DQorICAgICAgICBmb3IgKEVmZmVjdCBlZmZlY3QgOiBlZmZlY3RzKSB7DQorICAgICAgICAgICAgLy8gQWRqdXN0IHRoZSBzdGFydCB0aW1lIGlmIG5lY2Vzc2FyeQ0KKyAgICAgICAgICAgIGZpbmFsIGxvbmcgZWZmZWN0U3RhcnRUaW1lTXM7DQorICAgICAgICAgICAgaWYgKGVmZmVjdC5nZXRTdGFydFRpbWUoKSA+IGdldFRpbWVsaW5lRHVyYXRpb24oKSkgew0KKyAgICAgICAgICAgICAgICBlZmZlY3RTdGFydFRpbWVNcyA9IDA7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgZWZmZWN0U3RhcnRUaW1lTXMgPSBlZmZlY3QuZ2V0U3RhcnRUaW1lKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8vIEFkanVzdCB0aGUgZHVyYXRpb24gaWYgbmVjZXNzYXJ5DQorICAgICAgICAgICAgZmluYWwgbG9uZyBlZmZlY3REdXJhdGlvbk1zOw0KKyAgICAgICAgICAgIGlmIChlZmZlY3RTdGFydFRpbWVNcyArIGVmZmVjdC5nZXREdXJhdGlvbigpID4gZ2V0VGltZWxpbmVEdXJhdGlvbigpKSB7DQorICAgICAgICAgICAgICAgIGVmZmVjdER1cmF0aW9uTXMgPSBnZXRUaW1lbGluZUR1cmF0aW9uKCkgLSBlZmZlY3RTdGFydFRpbWVNczsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBlZmZlY3REdXJhdGlvbk1zID0gZWZmZWN0LmdldER1cmF0aW9uKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGlmIChlZmZlY3RTdGFydFRpbWVNcyAhPSBlZmZlY3QuZ2V0U3RhcnRUaW1lKCkgfHwNCisgICAgICAgICAgICAgICAgICAgIGVmZmVjdER1cmF0aW9uTXMgIT0gZWZmZWN0LmdldER1cmF0aW9uKCkpIHsNCisgICAgICAgICAgICAgICAgZWZmZWN0LnNldFN0YXJ0VGltZUFuZER1cmF0aW9uKGVmZmVjdFN0YXJ0VGltZU1zLCBlZmZlY3REdXJhdGlvbk1zKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL01lZGlhUHJvcGVydGllcy5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL01lZGlhUHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM0MDg4ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvTWVkaWFQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwyNTcgQEAKKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBhbmRyb2lkLm1lZGlhLnZpZGVvZWRpdG9yOw0KKw0KK2ltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsNCisNCisvKioNCisgKiBUaGlzIGNsYXNzIGRlZmluZXMgYWxsIHByb3BlcnRpZXMgb2YgYSBtZWRpYSBmaWxlIHN1Y2ggYXMgc3VwcG9ydGVkIGhlaWdodCwgYXNwZWN0IHJhdGlvLA0KKyAqIGJpdHJhdGUgZm9yIGV4cG9ydCBmdW5jdGlvbi4NCisgKiB7QGhpZGV9DQorICovDQorcHVibGljIGNsYXNzIE1lZGlhUHJvcGVydGllcyB7DQorICAgIC8vIFN1cHBvcnRlZCBoZWlnaHRzDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFSUdIVF8xNDQgPSAxNDQ7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFSUdIVF8zNjAgPSAzNjA7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFSUdIVF80ODAgPSA0ODA7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFSUdIVF83MjAgPSA3MjA7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFSUdIVF8xMDgwID0gMTA4MDsNCisNCisgICAgLy8gU3VwcG9ydGVkIGFzcGVjdCByYXRpb3MNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNQRUNUX1JBVElPX1VOREVGSU5FRCA9IDA7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTUEVDVF9SQVRJT18zXzIgPSAxOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU1BFQ1RfUkFUSU9fMTZfOSA9IDI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTUEVDVF9SQVRJT180XzMgPSAzOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU1BFQ1RfUkFUSU9fNV8zID0gNDsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNQRUNUX1JBVElPXzExXzkgPSA1Ow0KKw0KKyAgICAvLyBUaGUgYXJyYXkgb2Ygc3VwcG9ydGVkIGFzcGVjdCByYXRpb3MNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQVNQRUNUX1JBVElPUyA9IG5ldyBpbnRbXSB7DQorICAgICAgICBBU1BFQ1RfUkFUSU9fM18yLA0KKyAgICAgICAgQVNQRUNUX1JBVElPXzE2XzksDQorICAgICAgICBBU1BFQ1RfUkFUSU9fNF8zLA0KKyAgICAgICAgQVNQRUNUX1JBVElPXzVfMywNCisgICAgICAgIEFTUEVDVF9SQVRJT18xMV85DQorICAgIH07DQorDQorICAgIC8vIFN1cHBvcnRlZCByZXNvbHV0aW9ucyBmb3Igc3BlY2lmaWMgYXNwZWN0IHJhdGlvcw0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYWlyPEludGVnZXIsIEludGVnZXI+W10gQVNQRUNUX1JBVElPXzNfMl9SRVNPTFVUSU9OUyA9DQorICAgICAgICBuZXcgUGFpcltdIHsNCisgICAgICAgIG5ldyBQYWlyPEludGVnZXIsIEludGVnZXI+KDcyMCwgSEVJR0hUXzQ4MCksDQorICAgICAgICBuZXcgUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPigxMDgwLCBIRUlHSFRfNzIwKQ0KKyAgICB9Ow0KKw0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYWlyPEludGVnZXIsIEludGVnZXI+W10gQVNQRUNUX1JBVElPXzRfM19SRVNPTFVUSU9OUyA9DQorICAgICAgICBuZXcgUGFpcltdIHsNCisgICAgICAgIG5ldyBQYWlyPEludGVnZXIsIEludGVnZXI+KDY0MCwgSEVJR0hUXzQ4MCksDQorICAgICAgICBuZXcgUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPig5NjAsIEhFSUdIVF83MjApDQorICAgIH07DQorDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhaXI8SW50ZWdlciwgSW50ZWdlcj5bXSBBU1BFQ1RfUkFUSU9fNV8zX1JFU09MVVRJT05TID0NCisgICAgICAgIG5ldyBQYWlyW10gew0KKyAgICAgICAgbmV3IFBhaXI8SW50ZWdlciwgSW50ZWdlcj4oODAwLCBIRUlHSFRfNDgwKQ0KKyAgICB9Ow0KKw0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQ0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYWlyPEludGVnZXIsIEludGVnZXI+W10gQVNQRUNUX1JBVElPXzExXzlfUkVTT0xVVElPTlMgPQ0KKyAgICAgICAgbmV3IFBhaXJbXSB7DQorICAgICAgICBuZXcgUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPigxNzYsIEhFSUdIVF8xNDQpDQorICAgIH07DQorDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhaXI8SW50ZWdlciwgSW50ZWdlcj5bXSBBU1BFQ1RfUkFUSU9fMTZfOV9SRVNPTFVUSU9OUyA9DQorICAgICAgICBuZXcgUGFpcltdIHsNCisgICAgICAgIG5ldyBQYWlyPEludGVnZXIsIEludGVnZXI+KDY0MCwgSEVJR0hUXzM2MCksDQorICAgICAgICBuZXcgUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPig4NTQsIEhFSUdIVF80ODApLA0KKyAgICAgICAgbmV3IFBhaXI8SW50ZWdlciwgSW50ZWdlcj4oMTI4MCwgSEVJR0hUXzcyMCksDQorICAgIH07DQorDQorDQorICAgIC8vIEJpdHJhdGUgdmFsdWVzIChpbiBiaXRzIHBlciBzZWNvbmQpDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJVFJBVEVfMjhLID0gMjgwMDA7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJVFJBVEVfNDBLID0gNDAwMDA7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJVFJBVEVfNjRLID0gNjQwMDA7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJVFJBVEVfOTZLID0gOTYwMDA7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJVFJBVEVfMTI4SyA9IDEyODAwMDsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklUUkFURV8xOTJLID0gMTkyMDAwOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSVRSQVRFXzI1NksgPSAyNTYwMDA7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJVFJBVEVfMzg0SyA9IDM4NDAwMDsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklUUkFURV81MTJLID0gNTEyMDAwOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSVRSQVRFXzgwMEsgPSA4MDAwMDA7DQorDQorICAgIC8vIFRoZSBhcnJheSBvZiBzdXBwb3J0ZWQgYml0cmF0ZXMNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gU1VQUE9SVEVEX0JJVFJBVEVTID0gbmV3IGludFtdIHsNCisgICAgICAgIEJJVFJBVEVfMjhLLA0KKyAgICAgICAgQklUUkFURV80MEssDQorICAgICAgICBCSVRSQVRFXzY0SywNCisgICAgICAgIEJJVFJBVEVfOTZLLA0KKyAgICAgICAgQklUUkFURV8xMjhLLA0KKyAgICAgICAgQklUUkFURV8xOTJLLA0KKyAgICAgICAgQklUUkFURV8yNTZLLA0KKyAgICAgICAgQklUUkFURV8zODRLLA0KKyAgICAgICAgQklUUkFURV81MTJLLA0KKyAgICAgICAgQklUUkFURV84MDBLDQorICAgIH07DQorDQorICAgIC8vIFZpZGVvIGNvZGVjIHR5cGVzDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDT0RFQ19IMjY0QlAgPSAxOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ09ERUNfSDI2NE1QID0gMjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNPREVDX0gyNjMgPSAzOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ09ERUNfTVBFRzQgPSA0Ow0KKw0KKyAgICAvLyBUaGUgYXJyYXkgb2Ygc3VwcG9ydGVkIHZpZGVvIGNvZGVjcw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBTVVBQT1JURURfVkNPREVDUyA9IG5ldyBpbnRbXSB7DQorICAgICAgICBWQ09ERUNfSDI2NEJQLA0KKyAgICAgICAgVkNPREVDX0gyNjMsDQorICAgICAgICBWQ09ERUNfTVBFRzQsDQorICAgIH07DQorDQorICAgIC8vIEF1ZGlvIGNvZGVjIHR5cGVzDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDT0RFQ19BQUNfTEMgPSAxOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ09ERUNfQU1STkIgPSAyOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ09ERUNfQU1SV0IgPSAzOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ09ERUNfTVAzID0gNDsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNPREVDX09HRyA9IDU7DQorDQorICAgIC8vIFRoZSBhcnJheSBvZiBzdXBwb3J0ZWQgdmlkZW8gY29kZWNzDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIFNVUFBPUlRFRF9BQ09ERUNTID0gbmV3IGludFtdIHsNCisgICAgICAgIEFDT0RFQ19BQUNfTEMsDQorICAgICAgICBBQ09ERUNfQU1STkIsDQorICAgICAgICBBQ09ERUNfQU1SV0INCisgICAgfTsNCisNCisgICAgLy8gRmlsZSBmb3JtYXQgdHlwZXMNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9VTlNVUFBPUlRFRCA9IDA7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfM0dQID0gMTsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9NUDQgPSAyOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX0pQRUcgPSAzOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1BORyA9IDQ7DQorDQorICAgIC8vIFRoZSBhcnJheSBvZiB0aGUgc3VwcG9ydGVkIGZpbGUgZm9ybWF0cw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBTVVBQT1JURURfVklERU9fRklMRV9GT1JNQVRTID0gbmV3IGludFtdIHsNCisgICAgICAgIEZJTEVfM0dQLA0KKyAgICAgICAgRklMRV9NUDQNCisgICAgfTsNCisNCisgICAgLy8gVGhlIG1heGltdW0gY291bnQgb2YgYXVkaW8gdHJhY2tzIHN1cHBvcnRlZA0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVURJT19NQVhfVFJBQ0tfQ09VTlQgPSAxOw0KKw0KKyAgICAvLyBUaGUgbWF4aW11bSB2b2x1bWUgc3VwcG9ydGVkICgxMDAgbWVhbnMgdGhhdCBubyBhbXBsaWZpY2F0aW9uIGlzDQorICAgIC8vIHN1cHBvcnRlZCwgaS5lLiBhdHRlbnVhdGlvbiBvbmx5KQ0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVURJT19NQVhfVk9MVU1FX1BFUkNFTlQgPSAxMDA7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGlzIGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQNCisgICAgICovDQorICAgIHByaXZhdGUgTWVkaWFQcm9wZXJ0aWVzKCkgew0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBhcnJheSBvZiBzdXBwb3J0ZWQgYXNwZWN0IHJhdGlvcw0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBpbnRbXSBnZXRBbGxTdXBwb3J0ZWRBc3BlY3RSYXRpb3MoKSB7DQorICAgICAgICByZXR1cm4gQVNQRUNUX1JBVElPUzsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogR2V0IHRoZSBzdXBwb3J0ZWQgcmVzb2x1dGlvbnMgZm9yIHRoZSBzcGVjaWZpZWQgYXNwZWN0IHJhdGlvLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gYXNwZWN0UmF0aW8gVGhlIGFzcGVjdCByYXRpbyBmb3Igd2hpY2ggdGhlIHJlc29sdXRpb25zIGFyZSByZXF1ZXN0ZWQNCisgICAgICoNCisgICAgICogQHJldHVybiBUaGUgYXJyYXkgb2Ygd2lkdGggYW5kIGhlaWdodCBwYWlycw0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBQYWlyPEludGVnZXIsIEludGVnZXI+W10gZ2V0U3VwcG9ydGVkUmVzb2x1dGlvbnMoaW50IGFzcGVjdFJhdGlvKSB7DQorICAgICAgICBmaW5hbCBQYWlyPEludGVnZXIsIEludGVnZXI+W10gcmVzb2x1dGlvbnM7DQorICAgICAgICBzd2l0Y2goYXNwZWN0UmF0aW8pIHsNCisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18zXzI6IHsNCisgICAgICAgICAgICAgICAgcmVzb2x1dGlvbnMgPSBBU1BFQ1RfUkFUSU9fM18yX1JFU09MVVRJT05TOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgY2FzZSBBU1BFQ1RfUkFUSU9fNF8zOiB7DQorICAgICAgICAgICAgICAgIHJlc29sdXRpb25zID0gQVNQRUNUX1JBVElPXzRfM19SRVNPTFVUSU9OUzsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGNhc2UgQVNQRUNUX1JBVElPXzVfMzogew0KKyAgICAgICAgICAgICAgICByZXNvbHV0aW9ucyA9IEFTUEVDVF9SQVRJT181XzNfUkVTT0xVVElPTlM7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xMV85OiB7DQorICAgICAgICAgICAgICAgIHJlc29sdXRpb25zID0gQVNQRUNUX1JBVElPXzExXzlfUkVTT0xVVElPTlM7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBjYXNlIEFTUEVDVF9SQVRJT18xNl85OiB7DQorICAgICAgICAgICAgICAgIHJlc29sdXRpb25zID0gQVNQRUNUX1JBVElPXzE2XzlfUkVTT0xVVElPTlM7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gYXNwZWN0IHJhdGlvOiAiICsgYXNwZWN0UmF0aW8pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiByZXNvbHV0aW9uczsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgYXJyYXkgb2Ygc3VwcG9ydGVkIHZpZGVvIGNvZGVjcw0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBpbnRbXSBnZXRTdXBwb3J0ZWRWaWRlb0NvZGVjcygpIHsNCisgICAgICAgIHJldHVybiBTVVBQT1JURURfVkNPREVDUzsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgYXJyYXkgb2Ygc3VwcG9ydGVkIGF1ZGlvIGNvZGVjcw0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBpbnRbXSBnZXRTdXBwb3J0ZWRBdWRpb0NvZGVjcygpIHsNCisgICAgICAgIHJldHVybiBTVVBQT1JURURfQUNPREVDUzsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgYXJyYXkgb2Ygc3VwcG9ydGVkIGZpbGUgZm9ybWF0cw0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBpbnRbXSBnZXRTdXBwb3J0ZWRWaWRlb0ZpbGVGb3JtYXQoKSB7DQorICAgICAgICByZXR1cm4gU1VQUE9SVEVEX1ZJREVPX0ZJTEVfRk9STUFUUzsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgYXJyYXkgb2Ygc3VwcG9ydGVkIHZpZGVvIGJpdHJhdGVzDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGludFtdIGdldFN1cHBvcnRlZFZpZGVvQml0cmF0ZXMoKSB7DQorICAgICAgICByZXR1cm4gU1VQUE9SVEVEX0JJVFJBVEVTOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBtYXhpbXVtIHZhbHVlIGZvciB0aGUgYXVkaW8gdm9sdW1lDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRTdXBwb3J0ZWRNYXhWb2x1bWUoKSB7DQorICAgICAgICByZXR1cm4gTWVkaWFQcm9wZXJ0aWVzLkFVRElPX01BWF9WT0xVTUVfUEVSQ0VOVDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gdHJhY2tzIHN1cHBvcnRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0U3VwcG9ydGVkQXVkaW9UcmFja0NvdW50KCkgew0KKyAgICAgICAgcmV0dXJuIE1lZGlhUHJvcGVydGllcy5BVURJT19NQVhfVFJBQ0tfQ09VTlQ7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL01lZGlhVmlkZW9JdGVtLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvTWVkaWFWaWRlb0l0ZW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZDEyMzM2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL01lZGlhVmlkZW9JdGVtLmphdmEKQEAgLTAsMCArMSw1ODMgQEAKKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBhbmRyb2lkLm1lZGlhLnZpZGVvZWRpdG9yOw0KKw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KKw0KK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsNCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsNCitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7DQorDQorLyoqDQorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgdmlkZW8gY2xpcCBpdGVtIG9uIHRoZSBzdG9yeWJvYXJkDQorICoge0BoaWRlfQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNZWRpYVZpZGVvSXRlbSBleHRlbmRzIE1lZGlhSXRlbSB7DQorICAgIC8vIExvZ2dpbmcNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVZpZGVvSXRlbSI7DQorDQorICAgIC8vIEluc3RhbmNlIHZhcmlhYmxlcw0KKyAgICBwcml2YXRlIGZpbmFsIGludCBtV2lkdGg7DQorICAgIHByaXZhdGUgZmluYWwgaW50IG1IZWlnaHQ7DQorICAgIHByaXZhdGUgZmluYWwgaW50IG1Bc3BlY3RSYXRpbzsNCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUZpbGVUeXBlOw0KKyAgICBwcml2YXRlIGZpbmFsIGludCBtVmlkZW9UeXBlOw0KKyAgICBwcml2YXRlIGZpbmFsIGludCBtVmlkZW9Qcm9maWxlOw0KKyAgICBwcml2YXRlIGZpbmFsIGludCBtVmlkZW9CaXRyYXRlOw0KKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgbUR1cmF0aW9uTXM7DQorICAgIHByaXZhdGUgZmluYWwgaW50IG1BdWRpb0JpdHJhdGU7DQorICAgIHByaXZhdGUgZmluYWwgaW50IG1GcHM7DQorICAgIHByaXZhdGUgZmluYWwgaW50IG1BdWRpb1R5cGU7DQorICAgIHByaXZhdGUgZmluYWwgaW50IG1BdWRpb0NoYW5uZWxzOw0KKyAgICBwcml2YXRlIGZpbmFsIGludCBtQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeTsNCisNCisgICAgcHJpdmF0ZSBsb25nIG1CZWdpbkJvdW5kYXJ5VGltZU1zOw0KKyAgICBwcml2YXRlIGxvbmcgbUVuZEJvdW5kYXJ5VGltZU1zOw0KKyAgICBwcml2YXRlIGludCBtVm9sdW1lUGVyY2VudGFnZTsNCisgICAgcHJpdmF0ZSBib29sZWFuIG1NdXRlZDsNCisgICAgcHJpdmF0ZSBTdHJpbmcgbUF1ZGlvV2F2ZWZvcm1GaWxlbmFtZTsNCisgICAgcHJpdmF0ZSBQbGF5YmFja1RocmVhZCBtUGxheWJhY2tUaHJlYWQ7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGlzIGxpc3RlbmVyIGludGVyZmFjZSBpcyB1c2VkIGJ5IHRoZSBNZWRpYVZpZGVvSXRlbSB0byBlbWl0IHBsYXliYWNrDQorICAgICAqIHByb2dyZXNzIG5vdGlmaWNhdGlvbnMuIFRoaXMgY2FsbGJhY2sgc2hvdWxkIGJlIGludm9rZWQgYWZ0ZXIgdGhlDQorICAgICAqIG51bWJlciBvZiBmcmFtZXMgc3BlY2lmaWVkIGJ5DQorICAgICAqIHtAbGluayAjc3RhcnRQbGF5YmFjayhTdXJmYWNlSG9sZGVyIHN1cmZhY2VIb2xkZXIsIGxvbmcgZnJvbU1zLA0KKyAgICAgKiAgICAgICAgICAgaW50IGNhbGxiYWNrQWZ0ZXJGcmFtZUNvdW50LCBQbGF5YmFja1Byb2dyZXNzTGlzdGVuZXIgbGlzdGVuZXIpfQ0KKyAgICAgKi8NCisgICAgcHVibGljIGludGVyZmFjZSBQbGF5YmFja1Byb2dyZXNzTGlzdGVuZXIgew0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyB0aGUgbGlzdGVuZXIgb2YgdGhlIGN1cnJlbnQgdGltZSBwb3NpdGlvbiB3aGlsZQ0KKyAgICAgICAgICogcGxheWluZyBhIG1lZGlhIGl0ZW0NCisgICAgICAgICAqDQorICAgICAgICAgKiBAcGFyYW0gbWVkaWFJdGVtIFRoZSBtZWRpYSBpdGVtDQorICAgICAgICAgKiBAcGFyYW0gdGltZU1zIFRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIChleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzDQorICAgICAgICAgKiAgICAgICAgICAgIHNpbmNlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lZGlhIGl0ZW0pLg0KKyAgICAgICAgICogQHBhcmFtIGVuZCB0cnVlIGlmIHRoZSBlbmQgb2YgdGhlIG1lZGlhIGl0ZW0gd2FzIHJlYWNoZWQNCisgICAgICAgICAqLw0KKyAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzcyhNZWRpYVZpZGVvSXRlbSBtZWRpYUl0ZW0sIGxvbmcgdGltZU1zLCBib29sZWFuIGVuZCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRoZSBwbGF5YmFjayB0aHJlYWQNCisgICAgICovDQorICAgIHByaXZhdGUgY2xhc3MgUGxheWJhY2tUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgew0KKyAgICAgICAgLy8gSW5zdGFuY2UgdmFyaWFibGVzDQorICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIEZSQU1FX0RVUkFUSU9OID0gMzM7DQorICAgICAgICBwcml2YXRlIGZpbmFsIFBsYXliYWNrUHJvZ3Jlc3NMaXN0ZW5lciBtTGlzdGVuZXI7DQorICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtQ2FsbGJhY2tBZnRlckZyYW1lQ291bnQ7DQorICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgbUZyb21NcywgbVRvTXM7DQorICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJ1bjsNCisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtTG9vcDsNCisgICAgICAgIHByaXZhdGUgbG9uZyBtUG9zaXRpb25NczsNCisNCisgICAgICAgIC8qKg0KKyAgICAgICAgICogQ29uc3RydWN0b3INCisgICAgICAgICAqDQorICAgICAgICAgKiBAcGFyYW0gZnJvbU1zIFRoZSB0aW1lIChyZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZWRpYSBpdGVtKQ0KKyAgICAgICAgICogICAgICAgICAgICBhdCB3aGljaCB0aGUgcGxheWJhY2sgd2lsbCBzdGFydA0KKyAgICAgICAgICogQHBhcmFtIHRvTXMgVGhlIHRpbWUgKHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lZGlhIGl0ZW0pIGF0DQorICAgICAgICAgKiAgICAgICAgICAgIHdoaWNoIHRoZSBwbGF5YmFjayB3aWxsIHN0b3AuIFVzZSAtMSB0byBwbGF5IHRvIHRoZSBlbmQgb2YNCisgICAgICAgICAqICAgICAgICAgICAgdGhlIG1lZGlhIGl0ZW0NCisgICAgICAgICAqIEBwYXJhbSBsb29wIHRydWUgaWYgdGhlIHBsYXliYWNrIHNob3VsZCBiZSBsb29wZWQgb25jZSBpdCByZWFjaGVzIHRoZQ0KKyAgICAgICAgICogICAgICAgICAgICBlbmQNCisgICAgICAgICAqIEBwYXJhbSBjYWxsYmFja0FmdGVyRnJhbWVDb3VudCBUaGUgbGlzdGVuZXIgaW50ZXJmYWNlIHNob3VsZCBiZQ0KKyAgICAgICAgICogICAgICAgICAgICBpbnZva2VkIGFmdGVyIHRoZSBudW1iZXIgb2YgZnJhbWVzIHNwZWNpZmllZCBieSB0aGlzDQorICAgICAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlci4NCisgICAgICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgd2hpY2ggd2lsbCBiZSBub3RpZmllZCBvZiB0aGUgcGxheWJhY2sNCisgICAgICAgICAqICAgICAgICAgICAgcHJvZ3Jlc3MNCisgICAgICAgICAqLw0KKyAgICAgICAgcHVibGljIFBsYXliYWNrVGhyZWFkKGxvbmcgZnJvbU1zLCBsb25nIHRvTXMsIGJvb2xlYW4gbG9vcCwgaW50IGNhbGxiYWNrQWZ0ZXJGcmFtZUNvdW50LA0KKyAgICAgICAgICAgICAgICBQbGF5YmFja1Byb2dyZXNzTGlzdGVuZXIgbGlzdGVuZXIpIHsNCisgICAgICAgICAgICBtUG9zaXRpb25NcyA9IG1Gcm9tTXMgPSBmcm9tTXM7DQorICAgICAgICAgICAgaWYgKHRvTXMgPCAwKSB7DQorICAgICAgICAgICAgICAgIG1Ub01zID0gbUR1cmF0aW9uTXM7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgbVRvTXMgPSB0b01zOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtTG9vcCA9IGxvb3A7DQorICAgICAgICAgICAgbUNhbGxiYWNrQWZ0ZXJGcmFtZUNvdW50ID0gY2FsbGJhY2tBZnRlckZyYW1lQ291bnQ7DQorICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7DQorICAgICAgICAgICAgbVJ1biA9IHRydWU7DQorICAgICAgICB9DQorDQorICAgICAgICAvKg0KKyAgICAgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgICAgICovDQorICAgICAgICBAT3ZlcnJpZGUNCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsNCisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7DQorICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIj09PT4gUGxheWJhY2tUaHJlYWQucnVuIGVudGVyIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGludCBmcmFtZUNvdW50ID0gMDsNCisgICAgICAgICAgICB3aGlsZSAobVJ1bikgew0KKyAgICAgICAgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgICAgICAgICAgc2xlZXAoRlJBTUVfRFVSQVRJT04pOw0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgew0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCsrOw0KKyAgICAgICAgICAgICAgICBtUG9zaXRpb25NcyArPSBGUkFNRV9EVVJBVElPTjsNCisNCisgICAgICAgICAgICAgICAgaWYgKG1Qb3NpdGlvbk1zID49IG1Ub01zKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAoIW1Mb29wKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vblByb2dyZXNzKE1lZGlhVmlkZW9JdGVtLnRoaXMsIG1Qb3NpdGlvbk1zLCB0cnVlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJQbGF5YmFja1RocmVhZC5ydW4gcGxheWJhY2sgY29tcGxldGUiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcmUgYSBub3RpZmljYXRpb24gZm9yIHRoZSBlbmQgb2YgdGhlIGNsaXANCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uUHJvZ3Jlc3MoTWVkaWFWaWRlb0l0ZW0udGhpcywgbVRvTXMsIGZhbHNlKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV3aW5kDQorICAgICAgICAgICAgICAgICAgICAgICAgbVBvc2l0aW9uTXMgPSBtRnJvbU1zOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25Qcm9ncmVzcyhNZWRpYVZpZGVvSXRlbS50aGlzLCBtUG9zaXRpb25NcywgZmFsc2UpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlBsYXliYWNrVGhyZWFkLnJ1biBwbGF5YmFjayBjb21wbGV0ZSIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50ID0gMDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZUNvdW50ID09IG1DYWxsYmFja0FmdGVyRnJhbWVDb3VudCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25Qcm9ncmVzcyhNZWRpYVZpZGVvSXRlbS50aGlzLCBtUG9zaXRpb25NcywgZmFsc2UpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50ID0gMDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7DQorICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIj09PT4gUGxheWJhY2tUaHJlYWQucnVuIGV4aXQiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvKioNCisgICAgICAgICAqIFN0b3AgdGhlIHBsYXliYWNrDQorICAgICAgICAgKg0KKyAgICAgICAgICogQHJldHVybiBUaGUgc3RvcCBwb3NpdGlvbg0KKyAgICAgICAgICovDQorICAgICAgICBwdWJsaWMgbG9uZyBzdG9wUGxheWJhY2soKSB7DQorICAgICAgICAgICAgbVJ1biA9IGZhbHNlOw0KKyAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICAgIGpvaW4oKTsNCisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgew0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gbVBvc2l0aW9uTXM7DQorICAgICAgICB9DQorICAgIH07DQorDQorICAgIC8qKg0KKyAgICAgKiBBbiBvYmplY3Qgb2YgdGhpcyB0eXBlIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRlZmF1bHQgY29uc3RydWN0b3INCisgICAgICovDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQ0KKyAgICBwcml2YXRlIE1lZGlhVmlkZW9JdGVtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgbnVsbCwgUkVOREVSSU5HX01PREVfQkxBQ0tfQk9SREVSKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29uc3RydWN0b3INCisgICAgICoNCisgICAgICogQHBhcmFtIGVkaXRvciBUaGUgdmlkZW8gZWRpdG9yIHJlZmVyZW5jZQ0KKyAgICAgKiBAcGFyYW0gbWVkaWFJdGVtSWQgVGhlIE1lZGlhSXRlbSBpZA0KKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIGltYWdlIGZpbGUgbmFtZQ0KKyAgICAgKiBAcGFyYW0gcmVuZGVyaW5nTW9kZSBUaGUgcmVuZGVyaW5nIG1vZGUNCisgICAgICoNCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSBjYW5ub3QgYmUgb3BlbmVkIGZvciByZWFkaW5nDQorICAgICAqLw0KKyAgICBwdWJsaWMgTWVkaWFWaWRlb0l0ZW0oVmlkZW9FZGl0b3IgZWRpdG9yLCBTdHJpbmcgbWVkaWFJdGVtSWQsIFN0cmluZyBmaWxlbmFtZSwNCisgICAgICAgICAgICBpbnQgcmVuZGVyaW5nTW9kZSkNCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICB0aGlzKGVkaXRvciwgbWVkaWFJdGVtSWQsIGZpbGVuYW1lLCByZW5kZXJpbmdNb2RlLCAwLCBFTkRfT0ZfRklMRSwgMTAwLCBmYWxzZSwgbnVsbCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvbnN0cnVjdG9yDQorICAgICAqDQorICAgICAqIEBwYXJhbSBlZGl0b3IgVGhlIHZpZGVvIGVkaXRvciByZWZlcmVuY2UNCisgICAgICogQHBhcmFtIG1lZGlhSXRlbUlkIFRoZSBNZWRpYUl0ZW0gaWQNCisgICAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBpbWFnZSBmaWxlIG5hbWUNCisgICAgICogQHBhcmFtIHJlbmRlcmluZ01vZGUgVGhlIHJlbmRlcmluZyBtb2RlDQorICAgICAqIEBwYXJhbSBiZWdpbk1zIFN0YXJ0IHRpbWUgaW4gbWlsbGlzZWNvbmRzLiBTZXQgdG8gMCB0byBleHRyYWN0IGZyb20gdGhlDQorICAgICAqICAgICAgICAgICBiZWdpbm5pbmcNCisgICAgICogQHBhcmFtIGVuZE1zIEVuZCB0aW1lIGluIG1pbGxpc2Vjb25kcy4gU2V0IHRvIHtAbGluayAjRU5EX09GX0ZJTEV9IHRvDQorICAgICAqICAgICAgICAgICBleHRyYWN0IHVudGlsIHRoZSBlbmQNCisgICAgICogQHBhcmFtIHZvbHVtZVBlcmNlbnQgaW4gJS8uIDEwMCUgbWVhbnMgbm8gY2hhbmdlOyA1MCUgbWVhbnMgaGFsZiB2YWx1ZSwgMjAwJQ0KKyAgICAgKiAgICAgICAgICAgIG1lYW5zIGRvdWJsZSwgMCUgbWVhbnMgc2lsZW50Lg0KKyAgICAgKiBAcGFyYW0gbXV0ZWQgdHJ1ZSBpZiB0aGUgYXVkaW8gaXMgbXV0ZWQNCisgICAgICogQHBhcmFtIGF1ZGlvV2F2ZWZvcm1GaWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXVkaW8gd2F2ZWZvcm0gZmlsZQ0KKyAgICAgKg0KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQgZm9yIHJlYWRpbmcNCisgICAgICovDQorICAgIE1lZGlhVmlkZW9JdGVtKFZpZGVvRWRpdG9yIGVkaXRvciwgU3RyaW5nIG1lZGlhSXRlbUlkLCBTdHJpbmcgZmlsZW5hbWUsIGludCByZW5kZXJpbmdNb2RlLA0KKyAgICAgICAgICAgIGxvbmcgYmVnaW5NcywgbG9uZyBlbmRNcywgaW50IHZvbHVtZVBlcmNlbnQsIGJvb2xlYW4gbXV0ZWQsDQorICAgICAgICAgICAgU3RyaW5nIGF1ZGlvV2F2ZWZvcm1GaWxlbmFtZSkgIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBzdXBlcihlZGl0b3IsIG1lZGlhSXRlbUlkLCBmaWxlbmFtZSwgcmVuZGVyaW5nTW9kZSk7DQorICAgICAgICAvLyBUT0RPOiBTZXQgdGhlc2UgdmFyaWFibGVzIGNvcnJlY3RseQ0KKyAgICAgICAgbVdpZHRoID0gMTA4MDsNCisgICAgICAgIG1IZWlnaHQgPSA3MjA7DQorICAgICAgICBtQXNwZWN0UmF0aW8gPSBNZWRpYVByb3BlcnRpZXMuQVNQRUNUX1JBVElPXzNfMjsNCisgICAgICAgIG1GaWxlVHlwZSA9IE1lZGlhUHJvcGVydGllcy5GSUxFX01QNDsNCisgICAgICAgIG1WaWRlb1R5cGUgPSBNZWRpYVByb3BlcnRpZXMuVkNPREVDX0gyNjRCUDsNCisgICAgICAgIC8vIERvIHdlIGhhdmUgcHJlZGVmaW5lZCB2YWx1ZXMgZm9yIHRoaXMgdmFyaWFibGU/DQorICAgICAgICBtVmlkZW9Qcm9maWxlID0gMDsNCisgICAgICAgIC8vIENhbiB2aWRlbyBhbmQgYXVkaW8gZHVyYXRpb24gYmUgZGlmZmVyZW50Pw0KKyAgICAgICAgbUR1cmF0aW9uTXMgPSAxMDAwMDsNCisgICAgICAgIG1WaWRlb0JpdHJhdGUgPSA4MDAwMDA7DQorICAgICAgICBtQXVkaW9CaXRyYXRlID0gMzAwMDA7DQorICAgICAgICBtRnBzID0gMzA7DQorICAgICAgICBtQXVkaW9UeXBlID0gTWVkaWFQcm9wZXJ0aWVzLkFDT0RFQ19BQUNfTEM7DQorICAgICAgICBtQXVkaW9DaGFubmVscyA9IDI7DQorICAgICAgICBtQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9IDE2MDAwOw0KKw0KKyAgICAgICAgbUJlZ2luQm91bmRhcnlUaW1lTXMgPSBiZWdpbk1zOw0KKyAgICAgICAgbUVuZEJvdW5kYXJ5VGltZU1zID0gZW5kTXMgPT0gRU5EX09GX0ZJTEUgPyBtRHVyYXRpb25NcyA6IGVuZE1zOw0KKyAgICAgICAgbVZvbHVtZVBlcmNlbnRhZ2UgPSB2b2x1bWVQZXJjZW50Ow0KKyAgICAgICAgbU11dGVkID0gbXV0ZWQ7DQorICAgICAgICBtQXVkaW9XYXZlZm9ybUZpbGVuYW1lID0gYXVkaW9XYXZlZm9ybUZpbGVuYW1lOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTZXRzIHRoZSBzdGFydCBhbmQgZW5kIG1hcmtzIGZvciB0cmltbWluZyBhIHZpZGVvIG1lZGlhIGl0ZW0uDQorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYWRqdXN0IHRoZSBkdXJhdGlvbiBvZiBib3VuZGluZyB0cmFuc2l0aW9ucywgZWZmZWN0cw0KKyAgICAgKiBhbmQgb3ZlcmxheXMgaWYgdGhlIGN1cnJlbnQgZHVyYXRpb24gb2YgdGhlIHRyYW5zYWN0aW9ucyBiZWNvbWUgZ3JlYXRlcg0KKyAgICAgKiB0aGFuIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBkdXJhdGlvbi4NCisgICAgICoNCisgICAgICogQHBhcmFtIGJlZ2luTXMgU3RhcnQgdGltZSBpbiBtaWxsaXNlY29uZHMuIFNldCB0byAwIHRvIGV4dHJhY3QgZnJvbSB0aGUNCisgICAgICogICAgICAgICAgIGJlZ2lubmluZw0KKyAgICAgKiBAcGFyYW0gZW5kTXMgRW5kIHRpbWUgaW4gbWlsbGlzZWNvbmRzLiBTZXQgdG8ge0BsaW5rICNFTkRfT0ZfRklMRX0gdG8NCisgICAgICogICAgICAgICAgIGV4dHJhY3QgdW50aWwgdGhlIGVuZA0KKyAgICAgKg0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3RhcnQgdGltZSBpcyBncmVhdGVyIG9yIGVxdWFsIHRoYW4NCisgICAgICogICAgICAgICAgIGVuZCB0aW1lLCB0aGUgZW5kIHRpbWUgaXMgYmV5b25kIHRoZSBmaWxlIGR1cmF0aW9uLCB0aGUgc3RhcnQgdGltZQ0KKyAgICAgKiAgICAgICAgICAgaXMgbmVnYXRpdmUNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHNldEV4dHJhY3RCb3VuZGFyaWVzKGxvbmcgYmVnaW5NcywgbG9uZyBlbmRNcykgew0KKyAgICAgICAgaWYgKGJlZ2luTXMgPiBtRHVyYXRpb25Ncykgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc3RhcnQgdGltZSIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGVuZE1zID4gbUR1cmF0aW9uTXMpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGVuZCB0aW1lIik7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoYmVnaW5NcyAhPSBtQmVnaW5Cb3VuZGFyeVRpbWVNcykgew0KKyAgICAgICAgICAgIGlmIChtQmVnaW5UcmFuc2l0aW9uICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgbUJlZ2luVHJhbnNpdGlvbi5pbnZhbGlkYXRlKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKGVuZE1zICE9IG1FbmRCb3VuZGFyeVRpbWVNcykgew0KKyAgICAgICAgICAgIGlmIChtRW5kVHJhbnNpdGlvbiAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIG1FbmRUcmFuc2l0aW9uLmludmFsaWRhdGUoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBtQmVnaW5Cb3VuZGFyeVRpbWVNcyA9IGJlZ2luTXM7DQorICAgICAgICBtRW5kQm91bmRhcnlUaW1lTXMgPSBlbmRNczsNCisNCisgICAgICAgIGFkanVzdEVsZW1lbnRzRHVyYXRpb24oKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgYm91bmRhcnkgYmVnaW4gdGltZQ0KKyAgICAgKi8NCisgICAgcHVibGljIGxvbmcgZ2V0Qm91bmRhcnlCZWdpblRpbWUoKSB7DQorICAgICAgICByZXR1cm4gbUJlZ2luQm91bmRhcnlUaW1lTXM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIGJvdW5kYXJ5IGVuZCB0aW1lDQorICAgICAqLw0KKyAgICBwdWJsaWMgbG9uZyBnZXRCb3VuZGFyeUVuZFRpbWUoKSB7DQorICAgICAgICByZXR1cm4gbUVuZEJvdW5kYXJ5VGltZU1zOw0KKyAgICB9DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgdm9pZCBhZGRFZmZlY3QoRWZmZWN0IGVmZmVjdCkgew0KKyAgICAgICAgaWYgKGVmZmVjdCBpbnN0YW5jZW9mIEVmZmVjdEtlbkJ1cm5zKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiS2VuIEJ1cm5zIGVmZmVjdHMgY2Fubm90IGJlIGFwcGxpZWQgdG8gTWVkaWFWaWRlb0l0ZW0iKTsNCisgICAgICAgIH0NCisgICAgICAgIHN1cGVyLmFkZEVmZmVjdChlZmZlY3QpOw0KKyAgICB9DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgQml0bWFwIGdldFRodW1ibmFpbChpbnQgd2lkdGgsIGludCBoZWlnaHQsIGxvbmcgdGltZU1zKSB7DQorICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIEJpdG1hcFtdIGdldFRodW1ibmFpbExpc3QoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBsb25nIHN0YXJ0TXMsIGxvbmcgZW5kTXMsDQorICAgICAgICAgICAgaW50IHRodW1ibmFpbENvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBpbnQgZ2V0QXNwZWN0UmF0aW8oKSB7DQorICAgICAgICByZXR1cm4gbUFzcGVjdFJhdGlvOw0KKyAgICB9DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IGdldEZpbGVUeXBlKCkgew0KKyAgICAgICAgcmV0dXJuIG1GaWxlVHlwZTsNCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCBnZXRXaWR0aCgpIHsNCisgICAgICAgIHJldHVybiBtV2lkdGg7DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBpbnQgZ2V0SGVpZ2h0KCkgew0KKyAgICAgICAgcmV0dXJuIG1IZWlnaHQ7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIGR1cmF0aW9uIG9mIHRoZSB2aWRlbyBjbGlwDQorICAgICAqLw0KKyAgICBwdWJsaWMgbG9uZyBnZXREdXJhdGlvbigpIHsNCisgICAgICAgIHJldHVybiBtRHVyYXRpb25NczsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgdGltZWxpbmUgZHVyYXRpb24uIFRoaXMgaXMgdGhlIGFjdHVhbCBkdXJhdGlvbiBpbiB0aGUNCisgICAgICogICAgICB0aW1lbGluZSAodHJpbW1lZCBkdXJhdGlvbikNCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgbG9uZyBnZXRUaW1lbGluZUR1cmF0aW9uKCkgew0KKyAgICAgICAgcmV0dXJuIG1FbmRCb3VuZGFyeVRpbWVNcyAtIG1CZWdpbkJvdW5kYXJ5VGltZU1zOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZW5kZXIgYSBmcmFtZSBhY2NvcmRpbmcgdG8gdGhlIHBsYXliYWNrIChpbiB0aGUgbmF0aXZlIGFzcGVjdCByYXRpbykgZm9yDQorICAgICAqIHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbS4gQWxsIGVmZmVjdHMgYW5kIG92ZXJsYXlzIGFwcGxpZWQgdG8gdGhlIG1lZGlhDQorICAgICAqIGl0ZW0gYXJlIGlnbm9yZWQuIFRoZSBleHRyYWN0IGJvdW5kYXJpZXMgYXJlIGFsc28gaWdub3JlZC4gVGhpcyBtZXRob2QNCisgICAgICogY2FuIGJlIHVzZWQgdG8gcGxheWJhY2sgZnJhbWVzIHdoZW4gaW1wbGVtZW50aW5nIHRyaW1taW5nIGZ1bmN0aW9uYWxpdHkuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBzdXJmYWNlSG9sZGVyIFN1cmZhY2VIb2xkZXIgdXNlZCBieSB0aGUgYXBwbGljYXRpb24NCisgICAgICogQHBhcmFtIHRpbWVNcyB0aW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZyYW1lIHRvIGRpc3BsYXkgKHJlbGF0aXZlIHRvIHRoZQ0KKyAgICAgKiAgICAgICAgICAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lZGlhIGl0ZW0pLg0KKyAgICAgKiBAcmV0dXJuIFRoZSBhY2N1cmF0ZSB0aW1lIHN0YW1wIG9mIHRoZSBmcmFtZSB0aGF0IGlzIHJlbmRlcmVkIC4NCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBwbGF5YmFjaywgcHJldmlldyBvciBhbiBleHBvcnQgaXMNCisgICAgICogICAgICAgICAgICAgYWxyZWFkeSBpbiBwcm9ncmVzcw0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aW1lIGlzIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiB0aGUNCisgICAgICogICAgICAgICAgICAgbWVkaWEgaXRlbSBkdXJhdGlvbg0KKyAgICAgKi8NCisgICAgcHVibGljIGxvbmcgcmVuZGVyRnJhbWUoU3VyZmFjZUhvbGRlciBzdXJmYWNlSG9sZGVyLCBsb25nIHRpbWVNcykgew0KKyAgICAgICAgcmV0dXJuIHRpbWVNczsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU3RhcnQgdGhlIHBsYXliYWNrIG9mIHRoaXMgbWVkaWEgaXRlbS4gVGhpcyBtZXRob2QgZG9lcyBub3QgYmxvY2sgKGRvZXMNCisgICAgICogbm90IHdhaXQgZm9yIHRoZSBwbGF5YmFjayB0byBjb21wbGV0ZSkuIFRoZSBQbGF5YmFja1Byb2dyZXNzTGlzdGVuZXINCisgICAgICogYWxsb3dzIHRvIHRyYWNrIHRoZSBwcm9ncmVzcyBhdCB0aGUgdGltZSBpbnRlcnZhbCBkZXRlcm1pbmVkIGJ5IHRoZQ0KKyAgICAgKiBjYWxsYmFja0FmdGVyRnJhbWVDb3VudCBwYXJhbWV0ZXIuIFRoZSBTdXJmYWNlSG9sZGVyIGhhcyB0byBiZSBjcmVhdGVkDQorICAgICAqIGFuZCByZWFkeSBmb3IgdXNlIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gc3VyZmFjZUhvbGRlciBTdXJmYWNlSG9sZGVyIHdoZXJlIHRoZSBmcmFtZXMgYXJlIHJlbmRlcmVkLg0KKyAgICAgKiBAcGFyYW0gZnJvbU1zIFRoZSB0aW1lIChyZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZWRpYSBpdGVtKSBhdA0KKyAgICAgKiAgICAgICAgICAgIHdoaWNoIHRoZSBwbGF5YmFjayB3aWxsIHN0YXJ0DQorICAgICAqIEBwYXJhbSB0b01zIFRoZSB0aW1lIChyZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZWRpYSBpdGVtKSBhdA0KKyAgICAgKiAgICAgICAgICAgIHdoaWNoIHRoZSBwbGF5YmFjayB3aWxsIHN0b3AuIFVzZSAtMSB0byBwbGF5IHRvIHRoZSBlbmQgb2YgdGhlDQorICAgICAqICAgICAgICAgICAgbWVkaWEgaXRlbQ0KKyAgICAgKiBAcGFyYW0gbG9vcCB0cnVlIGlmIHRoZSBwbGF5YmFjayBzaG91bGQgYmUgbG9vcGVkIG9uY2UgaXQgcmVhY2hlcyB0aGUgZW5kDQorICAgICAqIEBwYXJhbSBjYWxsYmFja0FmdGVyRnJhbWVDb3VudCBUaGUgbGlzdGVuZXIgaW50ZXJmYWNlIHNob3VsZCBiZSBpbnZva2VkDQorICAgICAqICAgICAgICAgICAgYWZ0ZXIgdGhlIG51bWJlciBvZiBmcmFtZXMgc3BlY2lmaWVkIGJ5IHRoaXMgcGFyYW1ldGVyLg0KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHdoaWNoIHdpbGwgYmUgbm90aWZpZWQgb2YgdGhlIHBsYXliYWNrDQorICAgICAqICAgICAgICAgICAgcHJvZ3Jlc3MNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZnJvbU1zIG9yIHRvTXMgaXMgYmV5b25kIHRoZSBwbGF5YmFjaw0KKyAgICAgKiAgICAgICAgICAgICBkdXJhdGlvbg0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIHBsYXliYWNrLCBwcmV2aWV3IG9yIGFuIGV4cG9ydCBpcw0KKyAgICAgKiAgICAgICAgICAgICBhbHJlYWR5IGluIHByb2dyZXNzDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzdGFydFBsYXliYWNrKFN1cmZhY2VIb2xkZXIgc3VyZmFjZUhvbGRlciwgbG9uZyBmcm9tTXMsIGxvbmcgdG9NcywgYm9vbGVhbiBsb29wLA0KKyAgICAgICAgICAgIGludCBjYWxsYmFja0FmdGVyRnJhbWVDb3VudCwgUGxheWJhY2tQcm9ncmVzc0xpc3RlbmVyIGxpc3RlbmVyKSB7DQorICAgICAgICBpZiAoZnJvbU1zID49IG1EdXJhdGlvbk1zKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbVBsYXliYWNrVGhyZWFkID0gbmV3IFBsYXliYWNrVGhyZWFkKGZyb21NcywgdG9NcywgbG9vcCwgY2FsbGJhY2tBZnRlckZyYW1lQ291bnQsDQorICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsNCisgICAgICAgIG1QbGF5YmFja1RocmVhZC5zdGFydCgpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTdG9wIHRoZSBtZWRpYSBpdGVtIHBsYXliYWNrLiBUaGlzIG1ldGhvZCBibG9ja3MgdW50aWwgdGhlIG9uZ29pbmcNCisgICAgICogcGxheWJhY2sgaXMgc3RvcHBlZC4NCisgICAgICoNCisgICAgICogQHJldHVybiBUaGUgYWNjdXJhdGUgY3VycmVudCB0aW1lIHdoZW4gc3RvcCBpcyBlZmZlY3RpdmUgZXhwcmVzc2VkIGluDQorICAgICAqICAgICAgICAgbWlsbGlzZWNvbmRzDQorICAgICAqLw0KKyAgICBwdWJsaWMgbG9uZyBzdG9wUGxheWJhY2soKSB7DQorICAgICAgICBmaW5hbCBsb25nIHN0b3BUaW1lTXM7DQorICAgICAgICBpZiAobVBsYXliYWNrVGhyZWFkICE9IG51bGwpIHsNCisgICAgICAgICAgICBzdG9wVGltZU1zID0gbVBsYXliYWNrVGhyZWFkLnN0b3BQbGF5YmFjaygpOw0KKyAgICAgICAgICAgIG1QbGF5YmFja1RocmVhZCA9IG51bGw7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHN0b3BUaW1lTXMgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHN0b3BUaW1lTXM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRoaXMgQVBJIGFsbG93cyB0byBnZW5lcmF0ZSBhIGZpbGUgY29udGFpbmluZyB0aGUgc2FtcGxlIHZvbHVtZSBsZXZlbHMgb2YNCisgICAgICogdGhlIEF1ZGlvIHRyYWNrIG9mIHRoaXMgbWVkaWEgaXRlbS4gVGhpcyBmdW5jdGlvbiBtYXkgdGFrZSBzaWduaWZpY2FudA0KKyAgICAgKiB0aW1lIGFuZCBpcyBibG9ja2luZy4gVGhlIGZpbGUgY2FuIGJlIHJldHJpZXZlZCB1c2luZw0KKyAgICAgKiBnZXRBdWRpb1dhdmVmb3JtRmlsZW5hbWUoKS4NCisgICAgICoNCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBwcm9ncmVzcyBsaXN0ZW5lcg0KKyAgICAgKg0KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBvdXRwdXQgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZA0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbWVkaWFJdGVtIGRvZXMgbm90IGhhdmUgYSB2YWxpZA0KKyAgICAgKiAgICAgICAgICAgICBBdWRpbyB0cmFjaw0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgZXh0cmFjdEF1ZGlvV2F2ZWZvcm0oRXh0cmFjdEF1ZGlvV2F2ZWZvcm1Qcm9ncmVzc0xpc3RlbmVyIGxpc3RlbmVyKQ0KKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICAvLyBUT0RPOiBTZXQgbUF1ZGlvV2F2ZWZvcm1GaWxlbmFtZSBhdCB0aGUgZW5kIG9uY2UgdGhlIGV4cG9ydCBpcyBjb21wbGV0ZQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXQgdGhlIGF1ZGlvIHdhdmVmb3JtIGZpbGUgbmFtZSBpZiB7QGxpbmsgI2V4dHJhY3RBdWRpb1dhdmVmb3JtKCl9IHdhcw0KKyAgICAgKiBzdWNjZXNzZnVsLiBUaGUgZmlsZSBmb3JtYXQgaXMgYXMgZm9sbG93aW5nOg0KKyAgICAgKiA8dWw+DQorICAgICAqICA8bGk+Zmlyc3QgNCBieXRlcyBwcm92aWRlIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBmb3IgZWFjaCB2YWx1ZSwgYXMgYmlnLWVuZGlhbiBzaWduZWQ8L2xpPg0KKyAgICAgKiAgPGxpPjQgZm9sbG93aW5nIGJ5dGVzIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgdmFsdWVzIGluIHRoZSBmaWxlLCBhcyBiaWctZW5kaWFuIHNpZ25lZDwvbGk+DQorICAgICAqICA8bGk+YWxsIHZhbHVlcyBmb2xsb3cgYXMgYnl0ZXMgTmFtZSBpcyB1bmlxdWUuPC9saT4NCisgICAgICo8L3VsPg0KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWxlLCBudWxsIGlmIHRoZSBmaWxlIGhhcyBub3QgYmVlbiBjb21wdXRlZCBvcg0KKyAgICAgKiAgICAgICAgIGlmIHRoZXJlIGlzIG5vIEF1ZGlvIHRyYWNrIGluIHRoZSBtZWRpYUl0ZW0NCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXVkaW9XYXZlZm9ybUZpbGVuYW1lKCkgew0KKyAgICAgICAgcmV0dXJuIG1BdWRpb1dhdmVmb3JtRmlsZW5hbWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFNldCB2b2x1bWUgb2YgdGhlIEF1ZGlvIHRyYWNrIG9mIHRoaXMgbWVkaWFJdGVtDQorICAgICAqDQorICAgICAqIEBwYXJhbSB2b2x1bWVQZXJjZW50IGluICUvLiAxMDAlIG1lYW5zIG5vIGNoYW5nZTsgNTAlIG1lYW5zIGhhbGYgdmFsdWUsIDIwMCUNCisgICAgICogICAgICAgICAgICBtZWFucyBkb3VibGUsIDAlIG1lYW5zIHNpbGVudC4NCisgICAgICogQHRocm93cyBVc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHZvbHVtZSB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWUoaW50IHZvbHVtZVBlcmNlbnQpIHsNCisgICAgICAgIG1Wb2x1bWVQZXJjZW50YWdlID0gdm9sdW1lUGVyY2VudDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogR2V0IHRoZSB2b2x1bWUgdmFsdWUgb2YgdGhlIGF1ZGlvIHRyYWNrIGFzIHBlcmNlbnRhZ2UuIENhbGwgb2YgdGhpcw0KKyAgICAgKiBtZXRob2QgYmVmb3JlIGNhbGxpbmcgc2V0Vm9sdW1lIHdpbGwgYWx3YXlzIHJldHVybiAxMDAlDQorICAgICAqDQorICAgICAqIEByZXR1cm4gdGhlIHZvbHVtZSBpbiBwZXJjZW50YWdlDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldFZvbHVtZSgpIHsNCisgICAgICAgIHJldHVybiBtVm9sdW1lUGVyY2VudGFnZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHBhcmFtIG11dGVkIHRydWUgdG8gbXV0ZSB0aGUgbWVkaWEgaXRlbQ0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0TXV0ZShib29sZWFuIG11dGVkKSB7DQorICAgICAgICBtTXV0ZWQgPSBtdXRlZDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtZWRpYSBpdGVtIGlzIG11dGVkDQorICAgICAqLw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc011dGVkKCkgew0KKyAgICAgICAgcmV0dXJuIG1NdXRlZDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgdmlkZW8gdHlwZQ0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXRWaWRlb1R5cGUoKSB7DQorICAgICAgICByZXR1cm4gbVZpZGVvVHlwZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgdmlkZW8gcHJvZmlsZQ0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXRWaWRlb1Byb2ZpbGUoKSB7DQorICAgICAgICByZXR1cm4gbVZpZGVvUHJvZmlsZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgdmlkZW8gYml0cmF0ZQ0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXRWaWRlb0JpdHJhdGUoKSB7DQorICAgICAgICByZXR1cm4gbVZpZGVvQml0cmF0ZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgYXVkaW8gYml0cmF0ZQ0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXRBdWRpb0JpdHJhdGUoKSB7DQorICAgICAgICByZXR1cm4gbUF1ZGlvQml0cmF0ZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGZyYW1lcyBwZXIgc2Vjb25kDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldEZwcygpIHsNCisgICAgICAgIHJldHVybiBtRnBzOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBhdWRpbyBjb2RlYw0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXRBdWRpb1R5cGUoKSB7DQorICAgICAgICByZXR1cm4gbUF1ZGlvVHlwZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldEF1ZGlvQ2hhbm5lbHMoKSB7DQorICAgICAgICByZXR1cm4gbUF1ZGlvQ2hhbm5lbHM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIGF1ZGlvIHNhbXBsZSBmcmVxdWVuY3kNCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSgpIHsNCisgICAgICAgIHJldHVybiBtQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvT3ZlcmxheS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL092ZXJsYXkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNThiNWNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL092ZXJsYXkuamF2YQpAQCAtMCwwICsxLDE4NyBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudmlkZW9lZGl0b3I7DQorDQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIHN1cGVyIGNsYXNzIGZvciBhbGwgT3ZlcmxheSBjbGFzc2VzLg0KKyAqIHtAaGlkZX0NCisgKi8NCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgT3ZlcmxheSB7DQorICAgIC8vIEluc3RhbmNlIHZhcmlhYmxlcw0KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVW5pcXVlSWQ7DQorICAgIC8vIFRoZSBvdmVybGF5IG93bmVyDQorICAgIHByaXZhdGUgZmluYWwgTWVkaWFJdGVtIG1NZWRpYUl0ZW07DQorICAgIC8vIHVzZXIgYXR0cmlidXRlcw0KKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbVVzZXJBdHRyaWJ1dGVzOw0KKw0KKyAgICBwcm90ZWN0ZWQgbG9uZyBtU3RhcnRUaW1lTXM7DQorICAgIHByb3RlY3RlZCBsb25nIG1EdXJhdGlvbk1zOw0KKw0KKw0KKyAgICAvKioNCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvcg0KKyAgICAgKi8NCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQorICAgIHByaXZhdGUgT3ZlcmxheSgpIHsNCisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgMCwgMCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvbnN0cnVjdG9yDQorICAgICAqDQorICAgICAqIEBwYXJhbSBtZWRpYUl0ZW0gVGhlIG1lZGlhIGl0ZW0gb3duZXINCisgICAgICogQHBhcmFtIG92ZXJsYXlJZCBUaGUgb3ZlcmxheSBpZA0KKyAgICAgKiBAcGFyYW0gc3RhcnRUaW1lTXMgVGhlIHN0YXJ0IHRpbWUgcmVsYXRpdmUgdG8gdGhlIG1lZGlhIGl0ZW0gc3RhcnQgdGltZQ0KKyAgICAgKiBAcGFyYW0gZHVyYXRpb25NcyBUaGUgZHVyYXRpb24NCisgICAgICoNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGZpbGUgdHlwZSBpcyBub3QgUE5HIG9yIHRoZQ0KKyAgICAgKiAgICAgIHN0YXJ0VGltZU1zIGFuZCBkdXJhdGlvbk1zIGFyZSBpbmNvcnJlY3QuDQorICAgICAqLw0KKyAgICBwdWJsaWMgT3ZlcmxheShNZWRpYUl0ZW0gbWVkaWFJdGVtLCBTdHJpbmcgb3ZlcmxheUlkLCBsb25nIHN0YXJ0VGltZU1zLCBsb25nIGR1cmF0aW9uTXMpIHsNCisgICAgICAgIGlmIChtZWRpYUl0ZW0gPT0gbnVsbCkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1lZGlhIGl0ZW0gY2Fubm90IGJlIG51bGwiKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChzdGFydFRpbWVNcyArIGR1cmF0aW9uTXMgPiBtZWRpYUl0ZW0uZ2V0VGltZWxpbmVEdXJhdGlvbigpKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBzdGFydCB0aW1lIGFuZCBkdXJhdGlvbiIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgbU1lZGlhSXRlbSA9IG1lZGlhSXRlbTsNCisgICAgICAgIG1VbmlxdWVJZCA9IG92ZXJsYXlJZDsNCisgICAgICAgIG1TdGFydFRpbWVNcyA9IHN0YXJ0VGltZU1zOw0KKyAgICAgICAgbUR1cmF0aW9uTXMgPSBkdXJhdGlvbk1zOw0KKyAgICAgICAgbVVzZXJBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIG9mIHRoZSBvdmVybGF5DQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgew0KKyAgICAgICAgcmV0dXJuIG1VbmlxdWVJZDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgZHVyYXRpb24gb2YgdGhlIG92ZXJsYXkgZWZmZWN0DQorICAgICAqLw0KKyAgICBwdWJsaWMgbG9uZyBnZXREdXJhdGlvbigpIHsNCisgICAgICAgIHJldHVybiBtRHVyYXRpb25NczsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogSWYgYSBwcmV2aWV3IG9yIGV4cG9ydCBpcyBpbiBwcm9ncmVzcywgdGhlbiB0aGlzIGNoYW5nZSBpcyBlZmZlY3RpdmUgZm9yDQorICAgICAqIG5leHQgcHJldmlldyBvciBleHBvcnQgc2Vzc2lvbi4NCisgICAgICoNCisgICAgICogQHBhcmFtIGR1cmF0aW9uTXMgVGhlIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcw0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0RHVyYXRpb24obG9uZyBkdXJhdGlvbk1zKSB7DQorICAgICAgICBpZiAobVN0YXJ0VGltZU1zICsgZHVyYXRpb25NcyA+IG1NZWRpYUl0ZW0uZ2V0VGltZWxpbmVEdXJhdGlvbigpKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRHVyYXRpb24gaXMgdG9vIGxhcmdlIik7DQorICAgICAgICB9DQorDQorICAgICAgICBtRHVyYXRpb25NcyA9IGR1cmF0aW9uTXM7DQorDQorICAgICAgICBtTWVkaWFJdGVtLmludmFsaWRhdGVUcmFuc2l0aW9ucyh0aGlzKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiB0aGUgc3RhcnQgdGltZSBvZiB0aGUgb3ZlcmxheQ0KKyAgICAgKi8NCisgICAgcHVibGljIGxvbmcgZ2V0U3RhcnRUaW1lKCkgew0KKyAgICAgICAgcmV0dXJuIG1TdGFydFRpbWVNczsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2V0IHRoZSBzdGFydCB0aW1lIGZvciB0aGUgb3ZlcmxheS4gSWYgYSBwcmV2aWV3IG9yIGV4cG9ydCBpcyBpbg0KKyAgICAgKiBwcm9ncmVzcywgdGhlbiB0aGlzIGNoYW5nZSBpcyBlZmZlY3RpdmUgZm9yIG5leHQgcHJldmlldyBvciBleHBvcnQNCisgICAgICogc2Vzc2lvbi4NCisgICAgICoNCisgICAgICogQHBhcmFtIHN0YXJ0VGltZU1zIHN0YXJ0IHRpbWUgaW4gbWlsbGlzZWNvbmRzDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydFRpbWUobG9uZyBzdGFydFRpbWVNcykgew0KKyAgICAgICAgaWYgKHN0YXJ0VGltZU1zICsgbUR1cmF0aW9uTXMgPiBtTWVkaWFJdGVtLmdldFRpbWVsaW5lRHVyYXRpb24oKSkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0YXJ0IHRpbWUgaXMgdG9vIGxhcmdlIik7DQorICAgICAgICB9DQorDQorICAgICAgICBtU3RhcnRUaW1lTXMgPSBzdGFydFRpbWVNczsNCisNCisgICAgICAgIG1NZWRpYUl0ZW0uaW52YWxpZGF0ZVRyYW5zaXRpb25zKHRoaXMpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTZXQgdGhlIHN0YXJ0IHRpbWUgYW5kIGR1cmF0aW9uDQorICAgICAqDQorICAgICAqIEBwYXJhbSBzdGFydFRpbWVNcyBzdGFydCB0aW1lIGluIG1pbGxpc2Vjb25kcw0KKyAgICAgKiBAcGFyYW0gZHVyYXRpb25NcyBUaGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydFRpbWVBbmREdXJhdGlvbihsb25nIHN0YXJ0VGltZU1zLCBsb25nIGR1cmF0aW9uTXMpIHsNCisgICAgICAgIGlmIChzdGFydFRpbWVNcyArIGR1cmF0aW9uTXMgPiBtTWVkaWFJdGVtLmdldFRpbWVsaW5lRHVyYXRpb24oKSkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc3RhcnQgdGltZSBvciBkdXJhdGlvbiIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgbVN0YXJ0VGltZU1zID0gc3RhcnRUaW1lTXM7DQorICAgICAgICBtRHVyYXRpb25NcyA9IGR1cmF0aW9uTXM7DQorDQorICAgICAgICBtTWVkaWFJdGVtLmludmFsaWRhdGVUcmFuc2l0aW9ucyh0aGlzKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgbWVkaWEgaXRlbSBvd25lcg0KKyAgICAgKi8NCisgICAgcHVibGljIE1lZGlhSXRlbSBnZXRNZWRpYUl0ZW0oKSB7DQorICAgICAgICByZXR1cm4gbU1lZGlhSXRlbTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2V0IGEgdXNlciBhdHRyaWJ1dGUNCisgICAgICoNCisgICAgICogQHBhcmFtIG5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lDQorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgYXR0cmlidXRlIHZhbHVlDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyQXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsNCisgICAgICAgIG1Vc2VyQXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSB1c2VyIGF0dHJpYnV0ZXMNCisgICAgICovDQorICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFVzZXJBdHRyaWJ1dGVzKCkgew0KKyAgICAgICAgcmV0dXJuIG1Vc2VyQXR0cmlidXRlczsNCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsNCisgICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIE92ZXJsYXkpKSB7DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIG1VbmlxdWVJZC5lcXVhbHMoKChPdmVybGF5KW9iamVjdCkubVVuaXF1ZUlkKTsNCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsNCisgICAgICAgIHJldHVybiBtVW5pcXVlSWQuaGFzaENvZGUoKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvT3ZlcmxheUZyYW1lLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvT3ZlcmxheUZyYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGNhYzRiYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9PdmVybGF5RnJhbWUuamF2YQpAQCAtMCwwICsxLDE0OSBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudmlkZW9lZGl0b3I7DQorDQoraW1wb3J0IGphdmEuaW8uRmlsZTsNCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247DQoraW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCisNCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7DQoraW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsNCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29tcHJlc3NGb3JtYXQ7DQorDQorDQorLyoqDQorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIG92ZXJsYXkgYW4gaW1hZ2Ugb24gdG9wIG9mIGEgbWVkaWEgaXRlbS4NCisgKiB7QGhpZGV9DQorICovDQorcHVibGljIGNsYXNzIE92ZXJsYXlGcmFtZSBleHRlbmRzIE92ZXJsYXkgew0KKyAgICAvLyBJbnN0YW5jZSB2YXJpYWJsZXMNCisgICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcDsNCisgICAgcHJpdmF0ZSBTdHJpbmcgbUZpbGVuYW1lOw0KKw0KKyAgICAvKioNCisgICAgICogQW4gb2JqZWN0IG9mIHRoaXMgdHlwZSBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGJ5IHVzaW5nIHRoZSBkZWZhdWx0DQorICAgICAqIGNvbnN0cnVjdG9yDQorICAgICAqLw0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCisgICAgcHJpdmF0ZSBPdmVybGF5RnJhbWUoKSB7DQorICAgICAgICB0aGlzKG51bGwsIG51bGwsIChTdHJpbmcpbnVsbCwgMCwgMCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvbnN0cnVjdG9yIGZvciBhbiBPdmVybGF5RnJhbWUNCisgICAgICoNCisgICAgICogQHBhcmFtIG1lZGlhSXRlbSBUaGUgbWVkaWEgaXRlbSBvd25lcg0KKyAgICAgKiBAcGFyYW0gb3ZlcmxheUlkIFRoZSBvdmVybGF5IGlkDQorICAgICAqIEBwYXJhbSBiaXRtYXAgVGhlIGJpdG1hcCB0byBiZSB1c2VkIGFzIGFuIG92ZXJsYXkuIFRoZSBzaXplIG9mIHRoZQ0KKyAgICAgKiAgICAgIGJpdG1hcCBtdXN0IGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBtZWRpYSBpdGVtIHRvIHdoaWNoIGl0IGlzDQorICAgICAqICAgICAgYWRkZWQuIFRoZSBiaXRtYXAgaXMgdHlwaWNhbGx5IGEgZGVjb2RlZCBQTkcgZmlsZS4NCisgICAgICogQHBhcmFtIHN0YXJ0VGltZU1zIFRoZSBvdmVybGF5IHN0YXJ0IHRpbWUgaW4gbWlsbGlzZWNvbmRzDQorICAgICAqIEBwYXJhbSBkdXJhdGlvbk1zIFRoZSBvdmVybGF5IGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcw0KKyAgICAgKg0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZmlsZSB0eXBlIGlzIG5vdCBQTkcgb3IgdGhlDQorICAgICAqICAgICAgc3RhcnRUaW1lTXMgYW5kIGR1cmF0aW9uTXMgYXJlIGluY29ycmVjdC4NCisgICAgICovDQorICAgIHB1YmxpYyBPdmVybGF5RnJhbWUoTWVkaWFJdGVtIG1lZGlhSXRlbSwgU3RyaW5nIG92ZXJsYXlJZCwgQml0bWFwIGJpdG1hcCwgbG9uZyBzdGFydFRpbWVNcywNCisgICAgICAgICAgICBsb25nIGR1cmF0aW9uTXMpIHsNCisgICAgICAgIHN1cGVyKG1lZGlhSXRlbSwgb3ZlcmxheUlkLCBzdGFydFRpbWVNcywgZHVyYXRpb25Ncyk7DQorICAgICAgICBtQml0bWFwID0gYml0bWFwOw0KKyAgICAgICAgbUZpbGVuYW1lID0gbnVsbDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29uc3RydWN0b3IgZm9yIGFuIE92ZXJsYXlGcmFtZS4gVGhpcyBjb25zdHJ1Y3RvciBjYW4gYmUgdXNlZCB0bw0KKyAgICAgKiByZXN0b3JlIHRoZSBvdmVybGF5IGFmdGVyIGl0IHdhcyBzYXZlZCBpbnRlcm5hbGx5IGJ5IHRoZSB2aWRlbyBlZGl0b3IuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBtZWRpYUl0ZW0gVGhlIG1lZGlhIGl0ZW0gb3duZXINCisgICAgICogQHBhcmFtIG92ZXJsYXlJZCBUaGUgb3ZlcmxheSBpZA0KKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIGZpbGUgbmFtZSB0aGF0IGNvbnRhaW5zIHRoZSBvdmVybGF5Lg0KKyAgICAgKiBAcGFyYW0gc3RhcnRUaW1lTXMgVGhlIG92ZXJsYXkgc3RhcnQgdGltZSBpbiBtaWxsaXNlY29uZHMNCisgICAgICogQHBhcmFtIGR1cmF0aW9uTXMgVGhlIG92ZXJsYXkgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBmaWxlIHR5cGUgaXMgbm90IFBORyBvciB0aGUNCisgICAgICogICAgICBzdGFydFRpbWVNcyBhbmQgZHVyYXRpb25NcyBhcmUgaW5jb3JyZWN0Lg0KKyAgICAgKi8NCisgICAgT3ZlcmxheUZyYW1lKE1lZGlhSXRlbSBtZWRpYUl0ZW0sIFN0cmluZyBvdmVybGF5SWQsIFN0cmluZyBmaWxlbmFtZSwgbG9uZyBzdGFydFRpbWVNcywNCisgICAgICAgICAgICBsb25nIGR1cmF0aW9uTXMpIHsNCisgICAgICAgIHN1cGVyKG1lZGlhSXRlbSwgb3ZlcmxheUlkLCBzdGFydFRpbWVNcywgZHVyYXRpb25Ncyk7DQorICAgICAgICBtRmlsZW5hbWUgPSBmaWxlbmFtZTsNCisgICAgICAgIG1CaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUZpbGUobUZpbGVuYW1lKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBHZXQgdGhlIG92ZXJsYXkgYml0bWFwDQorICAgICAqLw0KKyAgICBwdWJsaWMgQml0bWFwIGdldEJpdG1hcCgpIHsNCisgICAgICAgIHJldHVybiBtQml0bWFwOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcGFyYW0gYml0bWFwIFRoZSBvdmVybGF5IGJpdG1hcA0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0Qml0bWFwKEJpdG1hcCBiaXRtYXApIHsNCisgICAgICAgIG1CaXRtYXAgPSBiaXRtYXA7DQorICAgICAgICBpZiAobUZpbGVuYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICAvLyBEZWxldGUgdGhlIGZpbGUNCisgICAgICAgICAgICBuZXcgRmlsZShtRmlsZW5hbWUpLmRlbGV0ZSgpOw0KKyAgICAgICAgICAgIC8vIEludmFsaWRhdGUgdGhlIGZpbGVuYW1lDQorICAgICAgICAgICAgbUZpbGVuYW1lID0gbnVsbDsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIEludmFsaWRhdGUgdGhlIHRyYW5zaXRpb25zIGlmIG5lY2Vzc2FyeQ0KKyAgICAgICAgZ2V0TWVkaWFJdGVtKCkuaW52YWxpZGF0ZVRyYW5zaXRpb25zKHRoaXMpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXQgdGhlIGZpbGUgbmFtZSBvZiB0aGlzIG92ZXJsYXkNCisgICAgICovDQorICAgIFN0cmluZyBnZXRGaWxlbmFtZSgpIHsNCisgICAgICAgIHJldHVybiBtRmlsZW5hbWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFNhdmUgdGhlIG92ZXJsYXkgdG8gdGhlIHByb2plY3QgZm9sZGVyDQorICAgICAqDQorICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHdoZXJlIHRoZSBvdmVybGF5IHdpbGwgYmUgc2F2ZWQNCisgICAgICoNCisgICAgICogQHJldHVybiBUaGUgZmlsZW5hbWUNCisgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGJpdG1hcCBjYW5ub3QgYmUgc2F2ZWQNCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgYml0bWFwIGZpbGUgY2Fubm90IGJlIHNhdmVkDQorICAgICAqLw0KKyAgICBTdHJpbmcgc2F2ZShTdHJpbmcgcGF0aCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gew0KKyAgICAgICAgaWYgKG1GaWxlbmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgcmV0dXJuIG1GaWxlbmFtZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIG1GaWxlbmFtZSA9IHBhdGggKyAiLyIgKyBnZXRJZCgpICsgIi5wbmciOw0KKyAgICAgICAgLy8gU2F2ZSB0aGUgaW1hZ2UgdG8gYSBsb2NhbCBmaWxlDQorICAgICAgICBmaW5hbCBGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG1GaWxlbmFtZSk7DQorICAgICAgICBtQml0bWFwLmNvbXByZXNzKENvbXByZXNzRm9ybWF0LlBORywgMTAwLCBvdXQpOw0KKyAgICAgICAgb3V0LmZsdXNoKCk7DQorICAgICAgICBvdXQuY2xvc2UoKTsNCisgICAgICAgIHJldHVybiBtRmlsZW5hbWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIERlbGV0ZSB0aGUgb3ZlcmxheSBmaWxlDQorICAgICAqLw0KKyAgICB2b2lkIGludmFsaWRhdGUoKSB7DQorICAgICAgICBpZiAobUZpbGVuYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBuZXcgRmlsZShtRmlsZW5hbWUpLmRlbGV0ZSgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9UcmFuc2l0aW9uLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFjODI3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjEwIEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS52aWRlb2VkaXRvcjsNCisNCitpbXBvcnQgamF2YS5pby5GaWxlOw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MgaXMgc3VwZXIgY2xhc3MgZm9yIGFsbCB0cmFuc2l0aW9ucy4gVHJhbnNpdGlvbnMgKHdpdGggdGhlDQorICogZXhjZXB0aW9uIG9mIFRyYW5zaXRpb25BdFN0YXJ0IGFuZCBUcmFuc2l0aW9BdEVuZCkgY2FuIG9ubHkgYmUgaW5zZXJ0ZWQNCisgKiBiZXR3ZWVuIG1lZGlhIGl0ZW1zLg0KKyAqDQorICogQWRkaW5nIGEgdHJhbnNpdGlvbiBiZXR3ZWVuIE1lZGlhSXRlbXMgbWFrZXMgdGhlDQorICogZHVyYXRpb24gb2YgdGhlIHN0b3J5Ym9hcmQgc2hvcnRlciBieSB0aGUgZHVyYXRpb24gb2YgdGhlIFRyYW5zaXRpb24gaXRzZWxmLg0KKyAqIEFzIGEgcmVzdWx0LCBpZiB0aGUgZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24gaXMgbGFyZ2VyIHRoYW4gdGhlIHNtYWxsZXINCisgKiBkdXJhdGlvbiBvZiB0aGUgdHdvIE1lZGlhSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBUcmFuc2l0aW9uLCBhbiBleGNlcHRpb24NCisgKiB3aWxsIGJlIHRocm93bi4NCisgKg0KKyAqIER1cmluZyBhIHRyYW5zaXRpb24sIHRoZSBhdWRpbyB0cmFjayBhcmUgY3Jvc3MtZmFkaW5nDQorICogYXV0b21hdGljYWxseS4ge0BoaWRlfQ0KKyAqLw0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmFuc2l0aW9uIHsNCisgICAgLy8gVGhlIHRyYW5zaXRpb24gYmVoYXZpb3INCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJFSEFWSU9SX01JTl9WQUxVRSA9IDA7DQorICAgIC8qKiBUaGUgdHJhbnNpdGlvbiBzdGFydHMgc2xvd2x5IGFuZCBzcGVlZCB1cCAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCRUhBVklPUl9TUEVFRF9VUCA9IDA7DQorICAgIC8qKiBUaGUgdHJhbnNpdGlvbiBzdGFydCBmYXN0IGFuZCBzcGVlZCBkb3duICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFSEFWSU9SX1NQRUVEX0RPV04gPSAxOw0KKyAgICAvKiogVGhlIHRyYW5zaXRpb24gc3BlZWQgaXMgY29uc3RhbnQgKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkVIQVZJT1JfTElORUFSID0gMjsNCisgICAgLyoqIFRoZSB0cmFuc2l0aW9uIHN0YXJ0cyBmYXN0IGFuZCBlbmRzIGZhc3Qgd2l0aCBhIHNsb3cgbWlkZGxlICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFSEFWSU9SX01JRERMRV9TTE9XID0gMzsNCisgICAgLyoqIFRoZSB0cmFuc2l0aW9uIHN0YXJ0cyBzbG93bHkgYW5kIGVuZHMgc2xvd2x5IHdpdGggYSBmYXN0IG1pZGRsZSAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCRUhBVklPUl9NSURETEVfRkFTVCA9IDQ7DQorDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCRUhBVklPUl9NQVhfVkFMVUUgPSA0Ow0KKw0KKyAgICAvLyBUaGUgdW5pcXVlIGlkIG9mIHRoZSB0cmFuc2l0aW9uDQorICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1VbmlxdWVJZDsNCisNCisgICAgLy8gVGhlIHRyYW5zaXRpb24gaXMgYXBwbGllZCBhdCB0aGUgZW5kIG9mIHRoaXMgbWVkaWEgaXRlbQ0KKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhSXRlbSBtQWZ0ZXJNZWRpYUl0ZW07DQorICAgIC8vIFRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGlzIG1lZGlhIGl0ZW0NCisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUl0ZW0gbUJlZm9yZU1lZGlhSXRlbTsNCisNCisgICAgLy8gVGhlIHRyYW5zaXRpb24gYmVoYXZpb3INCisgICAgcHJvdGVjdGVkIGZpbmFsIGludCBtQmVoYXZpb3I7DQorDQorICAgIC8vIFRoZSB0cmFuc2l0aW9uIGR1cmF0aW9uDQorICAgIHByb3RlY3RlZCBsb25nIG1EdXJhdGlvbk1zOw0KKw0KKyAgICAvLyBUaGUgdHJhbnNpdGlvbiBmaWxlbmFtZQ0KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG1GaWxlbmFtZTsNCisNCisgICAgLyoqDQorICAgICAqIEFuIG9iamVjdCBvZiB0aGlzIHR5cGUgY2Fubm90IGJlIGluc3RhbnRpYXRlZCBieSB1c2luZyB0aGUgZGVmYXVsdA0KKyAgICAgKiBjb25zdHJ1Y3Rvcg0KKyAgICAgKi8NCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQorICAgIHByaXZhdGUgVHJhbnNpdGlvbigpIHsNCisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgbnVsbCwgMCwgMCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvbnN0cnVjdG9yDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uSWQgVGhlIHRyYW5zaXRpb24gaWQNCisgICAgICogQHBhcmFtIGFmdGVyTWVkaWFJdGVtIFRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGVuZCBvZiB0aGlzDQorICAgICAqICAgICAgbWVkaWEgaXRlbQ0KKyAgICAgKiBAcGFyYW0gYmVmb3JlTWVkaWFJdGVtIFRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGJlZ2lubmluZyBvZg0KKyAgICAgKiAgICAgIHRoaXMgbWVkaWEgaXRlbQ0KKyAgICAgKiBAcGFyYW0gZHVyYXRpb25NcyBUaGUgZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24gaW4gbWlsbGlzZWNvbmRzDQorICAgICAqIEBwYXJhbSBiZWhhdmlvciBUaGUgdHJhbnNpdGlvbiBiZWhhdmlvcg0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIFRyYW5zaXRpb24oU3RyaW5nIHRyYW5zaXRpb25JZCwgTWVkaWFJdGVtIGFmdGVyTWVkaWFJdGVtLCBNZWRpYUl0ZW0gYmVmb3JlTWVkaWFJdGVtLA0KKyAgICAgICAgICAgIGxvbmcgZHVyYXRpb25NcywgaW50IGJlaGF2aW9yKSB7DQorICAgICAgICBpZiAoYmVoYXZpb3IgPCBCRUhBVklPUl9NSU5fVkFMVUUgfHwgYmVoYXZpb3IgPiBCRUhBVklPUl9NQVhfVkFMVUUpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGJlaGF2aW9yOiAiICsgYmVoYXZpb3IpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbVVuaXF1ZUlkID0gdHJhbnNpdGlvbklkOw0KKyAgICAgICAgbUFmdGVyTWVkaWFJdGVtID0gYWZ0ZXJNZWRpYUl0ZW07DQorICAgICAgICBtQmVmb3JlTWVkaWFJdGVtID0gYmVmb3JlTWVkaWFJdGVtOw0KKyAgICAgICAgbUR1cmF0aW9uTXMgPSBkdXJhdGlvbk1zOw0KKyAgICAgICAgbUJlaGF2aW9yID0gYmVoYXZpb3I7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIG9mIHRoZSB0cmFuc2l0aW9uDQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgew0KKyAgICAgICAgcmV0dXJuIG1VbmlxdWVJZDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiBUaGUgbWVkaWEgaXRlbSBhdCB0aGUgZW5kIG9mIHdoaWNoIHRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQNCisgICAgICovDQorICAgIHB1YmxpYyBNZWRpYUl0ZW0gZ2V0QWZ0ZXJNZWRpYUl0ZW0oKSB7DQorICAgICAgICByZXR1cm4gbUFmdGVyTWVkaWFJdGVtOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSBpdGVtIGF0IHRoZSBiZWdpbm5pbmcgb2Ygd2hpY2ggdGhlIHRyYW5zaXRpb24gaXMgYXBwbGllZA0KKyAgICAgKi8NCisgICAgcHVibGljIE1lZGlhSXRlbSBnZXRCZWZvcmVNZWRpYUl0ZW0oKSB7DQorICAgICAgICByZXR1cm4gbUJlZm9yZU1lZGlhSXRlbTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2V0IHRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbi4NCisgICAgICoNCisgICAgICogQHBhcmFtIGR1cmF0aW9uTXMgdGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uIGluIG1pbGxpc2Vjb25kcw0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0RHVyYXRpb24obG9uZyBkdXJhdGlvbk1zKSB7DQorICAgICAgICBpZiAoZHVyYXRpb25NcyA+IGdldE1heGltdW1EdXJhdGlvbigpKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGR1cmF0aW9uIGlzIHRvbyBsYXJnZSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgbUR1cmF0aW9uTXMgPSBkdXJhdGlvbk1zOw0KKyAgICAgICAgaW52YWxpZGF0ZSgpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIHRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiBpbiBtaWxsaXNlY29uZHMNCisgICAgICovDQorICAgIHB1YmxpYyBsb25nIGdldER1cmF0aW9uKCkgew0KKyAgICAgICAgcmV0dXJuIG1EdXJhdGlvbk1zOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgZHVyYXRpb24gb2YgYSB0cmFuc2l0aW9uIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gaGFsZiBvZiB0aGUgbWluaW11bQ0KKyAgICAgKiBkdXJhdGlvbiBvZiB0aGUgYm91bmRpbmcgbWVkaWEgaXRlbXMuDQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIG1heGltdW0gZHVyYXRpb24gb2YgdGhpcyB0cmFuc2l0aW9uDQorICAgICAqLw0KKyAgICBwdWJsaWMgbG9uZyBnZXRNYXhpbXVtRHVyYXRpb24oKSB7DQorICAgICAgICBpZiAobUFmdGVyTWVkaWFJdGVtID09IG51bGwpIHsNCisgICAgICAgICAgICByZXR1cm4gbUJlZm9yZU1lZGlhSXRlbS5nZXRUaW1lbGluZUR1cmF0aW9uKCkgLyAyOw0KKyAgICAgICAgfSBlbHNlIGlmIChtQmVmb3JlTWVkaWFJdGVtID09IG51bGwpIHsNCisgICAgICAgICAgICByZXR1cm4gbUFmdGVyTWVkaWFJdGVtLmdldFRpbWVsaW5lRHVyYXRpb24oKSAvIDI7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJldHVybiAoTWF0aC5taW4obUFmdGVyTWVkaWFJdGVtLmdldFRpbWVsaW5lRHVyYXRpb24oKSwNCisgICAgICAgICAgICAgICAgICAgIG1CZWZvcmVNZWRpYUl0ZW0uZ2V0VGltZWxpbmVEdXJhdGlvbigpKSAvIDIpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBiZWhhdmlvcg0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXRCZWhhdmlvcigpIHsNCisgICAgICAgIHJldHVybiBtQmVoYXZpb3I7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEdlbmVyYXRlIHRoZSB2aWRlbyBjbGlwIGZvciB0aGUgc3BlY2lmaWVkIHRyYW5zaXRpb24uDQorICAgICAqIFRoaXMgbWV0aG9kIG1heSBibG9jayBmb3IgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgdGltZS4NCisgICAgICoNCisgICAgICogQmVmb3JlIHRoZSBtZXRob2QgY29tcGxldGVzIGV4ZWN1dGlvbiBpdCBzZXRzIHRoZSBtRmlsZW5hbWUgdG8NCisgICAgICogdGhlIG5hbWUgb2YgdGhlIG5ld2x5IGdlbmVyYXRlZCB0cmFuc2l0aW9uIHZpZGVvIGNsaXAgZmlsZS4NCisgICAgICovDQorICAgIGFic3RyYWN0IHZvaWQgZ2VuZXJhdGUoKTsNCisNCisgICAgLyoqDQorICAgICAqIFJlbW92ZSBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zaXRpb24NCisgICAgICovDQorICAgIHZvaWQgaW52YWxpZGF0ZSgpIHsNCisgICAgICAgIGlmIChtRmlsZW5hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIG5ldyBGaWxlKG1GaWxlbmFtZSkuZGVsZXRlKCk7DQorICAgICAgICAgICAgbUZpbGVuYW1lID0gbnVsbDsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0cmFuc2l0aW9uIGlzIGdlbmVyYXRlZA0KKyAgICAgKi8NCisgICAgYm9vbGVhbiBpc0dlbmVyYXRlZCgpIHsNCisgICAgICAgIHJldHVybiAobUZpbGVuYW1lICE9IG51bGwpOw0KKyAgICB9DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgew0KKyAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgVHJhbnNpdGlvbikpIHsNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbVVuaXF1ZUlkLmVxdWFscygoKFRyYW5zaXRpb24pb2JqZWN0KS5tVW5pcXVlSWQpOw0KKyAgICB9DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgew0KKyAgICAgICAgcmV0dXJuIG1VbmlxdWVJZC5oYXNoQ29kZSgpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9UcmFuc2l0aW9uQWxwaGEuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9UcmFuc2l0aW9uQWxwaGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMGU2NmZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL1RyYW5zaXRpb25BbHBoYS5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS52aWRlb2VkaXRvcjsNCisNCisNCisvKioNCisgKiBUaGlzIGNsYXNzIGFsbG93cyB0byByZW5kZXIgYW4gImFscGhhIGJsZW5kaW5nIiB0cmFuc2l0aW9uIGFjY29yZGluZyB0byBhDQorICogYml0bWFwIG1hc2suIFRoZSBtYXNrIHNob3dzIHRoZSBzaGFwZSBvZiB0aGUgdHJhbnNpdGlvbiBhbGwgYWxvbmcgdGhlDQorICogZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb246IGp1c3QgYmVmb3JlIHRoZSB0cmFuc2l0aW9uLCB2aWRlbyAxIGlzIGZ1bGx5DQorICogZGlzcGxheWVkLiBXaGVuIHRoZSB0cmFuc2l0aW9uIHN0YXJ0cywgYXMgdGhlIHRpbWUgZ29lcyBvbiwgcGl4ZWxzIG9mIHZpZGVvIDINCisgKiByZXBsYWNlIHBpeGVscyBvZiB2aWRlbyAxIGFjY29yZGluZyB0byB0aGUgZ3JheSBzY2FsZSBwaXhlbCB2YWx1ZSBvZiB0aGUNCisgKiBtYXNrLg0KKyAqIHtAaGlkZX0NCisgKi8NCitwdWJsaWMgY2xhc3MgVHJhbnNpdGlvbkFscGhhIGV4dGVuZHMgVHJhbnNpdGlvbiB7DQorICAgIC8qKiBUaGlzIGlzIHRoZSBpbnB1dCBKUEVHIGZpbGUgZm9yIHRoZSBtYXNrICovDQorICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1NYXNrRmlsZW5hbWU7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGlzIGlzIHBlcmNlbnRhZ2UgKGJldHdlZW4gMCBhbmQgMTAwKSBvZiBibGVuZGluZyBiZXR3ZWVuIHZpZGVvIDEgYW5kDQorICAgICAqIHZpZGVvIDIgaWYgdGhpcyB2YWx1ZSBlcXVhbHMgMCwgdGhlbiB0aGUgbWFzayBpcyBzdHJpY3RseSBhcHBsaWVkIGlmIHRoaXMNCisgICAgICogdmFsdWUgZXF1YWxzIDEwMCwgdGhlbiB0aGUgbWFzayBpcyBub3QgYXQgYWxsIGFwcGxpZWQgKG5vIHRyYW5zaXRpb24NCisgICAgICogZWZmZWN0KQ0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUJsZW5kaW5nUGVyY2VudDsNCisNCisgICAgLyoqDQorICAgICAqIElmIHRydWUsIHRoaXMgdmFsdWUgaW52ZXJ0cyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBtYXNrOiB3aGl0ZSBwaXhlbHMgb2YNCisgICAgICogdGhlIG1hc2sgc2hvdyB2aWRlbyAyIHBpeGVscyBmaXJzdCBibGFjayBwaXhlbHMgb2YgdGhlIG1hc2sgc2hvdyB2aWRlbyAyDQorICAgICAqIHBpeGVscyBsYXN0Lg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc0ludmVydDsNCisNCisgICAgLyoqDQorICAgICAqIEFuIG9iamVjdCBvZiB0aGlzIHR5cGUgY2Fubm90IGJlIGluc3RhbnRpYXRlZCBieSB1c2luZyB0aGUgZGVmYXVsdA0KKyAgICAgKiBjb25zdHJ1Y3Rvcg0KKyAgICAgKi8NCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQorICAgIHByaXZhdGUgVHJhbnNpdGlvbkFscGhhKCkgew0KKyAgICAgICAgdGhpcyhudWxsLCBudWxsLCBudWxsLCAwLCAwLCBudWxsLCAwLCBmYWxzZSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvbnN0cnVjdG9yDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uSWQgVGhlIHRyYW5zaXRpb24gaWQNCisgICAgICogQHBhcmFtIGFmdGVyTWVkaWFJdGVtIFRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGVuZCBvZiB0aGlzIG1lZGlhDQorICAgICAqICAgICAgICAgICAgaXRlbQ0KKyAgICAgKiBAcGFyYW0gYmVmb3JlTWVkaWFJdGVtIFRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGlzDQorICAgICAqICAgICAgICAgICAgbWVkaWEgaXRlbQ0KKyAgICAgKiBAcGFyYW0gZHVyYXRpb25NcyBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiBpbiBtaWxsaXNlY29uZHMNCisgICAgICogQHBhcmFtIGJlaGF2aW9yIGJlaGF2aW9yIGlzIG9uZSBvZiB0aGUgYmVoYXZpb3IgZGVmaW5lZCBpbiBUcmFuc2l0aW9uDQorICAgICAqICAgICAgICAgICAgY2xhc3MNCisgICAgICogQHBhcmFtIG1hc2tGaWxlbmFtZSBKUEVHIGZpbGUgbmFtZS4gVGhlIGRpbWVuc2lvbiBvZiB0aGUgaW1hZ2UNCisgICAgICogICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIDcyMHAgKDE2OjkgYXNwZWN0IHJhdGlvKS4gTWFzayBmaWxlcyBhcmUNCisgICAgICogICAgICAgICAgIHNoYXJlZCBiZXR3ZWVuIHZpZGVvIGVkaXRvcnMgYW5kIGNhbiBiZSBjcmVhdGVkIGluIHRoZQ0KKyAgICAgKiAgICAgICAgICAgcHJvamVjdHMgZm9sZGVyICh0aGUgcGFyZW50IGZvbGRlciBmb3IgYWxsIHByb2plY3RzKS4NCisgICAgICogQHBhcmFtIGJsZW5kaW5nUGVyY2VudCBUaGUgYmxlbmRpbmcgcGVyY2VudCBhcHBsaWVkDQorICAgICAqIEBwYXJhbSBpbnZlcnQgdHJ1ZSB0byBpbnZlcnQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgYWxwaGEgYmxlbmRpbmcNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYmVoYXZpb3IgaXMgbm90IHN1cHBvcnRlZCwgb3IgaWYNCisgICAgICogICAgICAgICAgICAgZGlyZWN0aW9uIGFyZSBub3Qgc3VwcG9ydGVkLg0KKyAgICAgKi8NCisgICAgcHVibGljIFRyYW5zaXRpb25BbHBoYShTdHJpbmcgdHJhbnNpdGlvbklkLCBNZWRpYUl0ZW0gYWZ0ZXJNZWRpYUl0ZW0sDQorICAgICAgICAgICAgTWVkaWFJdGVtIGJlZm9yZU1lZGlhSXRlbSwgbG9uZyBkdXJhdGlvbk1zLCBpbnQgYmVoYXZpb3IsIFN0cmluZyBtYXNrRmlsZW5hbWUsDQorICAgICAgICAgICAgaW50IGJsZW5kaW5nUGVyY2VudCwgYm9vbGVhbiBpbnZlcnQpIHsNCisgICAgICAgIHN1cGVyKHRyYW5zaXRpb25JZCwgYWZ0ZXJNZWRpYUl0ZW0sIGJlZm9yZU1lZGlhSXRlbSwgZHVyYXRpb25NcywgYmVoYXZpb3IpOw0KKw0KKyAgICAgICAgbU1hc2tGaWxlbmFtZSA9IG1hc2tGaWxlbmFtZTsNCisgICAgICAgIG1CbGVuZGluZ1BlcmNlbnQgPSBibGVuZGluZ1BlcmNlbnQ7DQorICAgICAgICBtSXNJbnZlcnQgPSBpbnZlcnQ7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIGJsZW5kaW5nIHBlcmNlbnRhZ2UNCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0QmxlbmRpbmdQZXJjZW50KCkgew0KKyAgICAgICAgcmV0dXJuIG1CbGVuZGluZ1BlcmNlbnQ7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIG1hc2sgZmlsZW5hbWUNCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFza0ZpbGVuYW1lKCkgew0KKyAgICAgICAgcmV0dXJuIG1NYXNrRmlsZW5hbWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBhbHBoYSBibGVuZGluZyBpcyBpbnZlcnRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIGJvb2xlYW4gaXNJbnZlcnQoKSB7DQorICAgICAgICByZXR1cm4gbUlzSW52ZXJ0Ow0KKyAgICB9DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZSgpIHsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvbkNyb3NzZmFkZS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL1RyYW5zaXRpb25Dcm9zc2ZhZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mODIyM2U4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL1RyYW5zaXRpb25Dcm9zc2ZhZGUuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS52aWRlb2VkaXRvcjsNCisNCisNCisvKioNCisgKiBUaGlzIGNsYXNzIGFsbG93cyB0byByZW5kZXIgYSBjcm9zc2ZhZGUgKGRpc3NvbHZlKSBlZmZlY3QgdHJhbnNpdGlvbiBiZXR3ZWVuDQorICogdHdvIHZpZGVvcw0KKyAqIHtAaGlkZX0NCisgKi8NCitwdWJsaWMgY2xhc3MgVHJhbnNpdGlvbkNyb3NzZmFkZSBleHRlbmRzIFRyYW5zaXRpb24gew0KKyAgICAvKioNCisgICAgICogQW4gb2JqZWN0IG9mIHRoaXMgdHlwZSBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGJ5IHVzaW5nIHRoZSBkZWZhdWx0DQorICAgICAqIGNvbnN0cnVjdG9yDQorICAgICAqLw0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCisgICAgcHJpdmF0ZSBUcmFuc2l0aW9uQ3Jvc3NmYWRlKCkgew0KKyAgICAgICAgdGhpcyhudWxsLCBudWxsLCBudWxsLCAwLCAwKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29uc3RydWN0b3INCisgICAgICoNCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25JZCBUaGUgdHJhbnNpdGlvbiBpZA0KKyAgICAgKiBAcGFyYW0gYWZ0ZXJNZWRpYUl0ZW0gVGhlIHRyYW5zaXRpb24gaXMgYXBwbGllZCB0byB0aGUgZW5kIG9mIHRoaXMNCisgICAgICogICAgICBtZWRpYSBpdGVtDQorICAgICAqIEBwYXJhbSBiZWZvcmVNZWRpYUl0ZW0gVGhlIHRyYW5zaXRpb24gaXMgYXBwbGllZCB0byB0aGUgYmVnaW5uaW5nIG9mDQorICAgICAqICAgICAgdGhpcyBtZWRpYSBpdGVtDQorICAgICAqIEBwYXJhbSBkdXJhdGlvbk1zIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uIGluIG1pbGxpc2Vjb25kcw0KKyAgICAgKiBAcGFyYW0gYmVoYXZpb3IgYmVoYXZpb3IgaXMgb25lIG9mIHRoZSBiZWhhdmlvciBkZWZpbmVkIGluIFRyYW5zaXRpb24NCisgICAgICogICAgICAgICAgICBjbGFzcw0KKyAgICAgKg0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBiZWhhdmlvciBpcyBub3Qgc3VwcG9ydGVkLg0KKyAgICAgKi8NCisgICAgcHVibGljIFRyYW5zaXRpb25Dcm9zc2ZhZGUoU3RyaW5nIHRyYW5zaXRpb25JZCwgTWVkaWFJdGVtIGFmdGVyTWVkaWFJdGVtLA0KKyAgICAgICAgICAgIE1lZGlhSXRlbSBiZWZvcmVNZWRpYUl0ZW0sIGxvbmcgZHVyYXRpb25NcywgaW50IGJlaGF2aW9yKSB7DQorICAgICAgICBzdXBlcih0cmFuc2l0aW9uSWQsIGFmdGVyTWVkaWFJdGVtLCBiZWZvcmVNZWRpYUl0ZW0sIGR1cmF0aW9uTXMsIGJlaGF2aW9yKTsNCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgdm9pZCBnZW5lcmF0ZSgpIHsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvbkVuZEN1cnRhaW5DbG9zaW5nLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvbkVuZEN1cnRhaW5DbG9zaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFjNmJiNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9UcmFuc2l0aW9uRW5kQ3VydGFpbkNsb3NpbmcuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS52aWRlb2VkaXRvcjsNCisNCisvKioNCisgKiBUaGlzIHRyYW5zaXRpb24gZmFkZXMgdG8gYmxhY2sgZnJhbWUgdXNpbmcgY3VydGFpbiBjbG9zaW5nOiBBIGJsYWNrIGltYWdlIGlzDQorICogbW92ZWQgZnJvbSB0b3AgdG8gYm90dG9tIHRvIGNvdmVyIHRoZSB2aWRlby4gVGhpcyB0cmFuc2l0aW9uIGlzIGFsd2F5cw0KKyAqIGFwcGxpZWQgYXQgdGhlIGVuZCBvZiB0aGUgbW92aWUuIHtAaGlkZX0NCisgKi8NCitwdWJsaWMgY2xhc3MgVHJhbnNpdGlvbkVuZEN1cnRhaW5DbG9zaW5nIGV4dGVuZHMgVHJhbnNpdGlvbiB7DQorICAgIC8qKg0KKyAgICAgKiBBbiBvYmplY3Qgb2YgdGhpcyB0eXBlIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgYnkgdXNpbmcgdGhlIGRlZmF1bHQNCisgICAgICogY29uc3RydWN0b3INCisgICAgICovDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQ0KKyAgICBwcml2YXRlIFRyYW5zaXRpb25FbmRDdXJ0YWluQ2xvc2luZygpIHsNCisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgMCwgQkVIQVZJT1JfTElORUFSKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29uc3RydWN0b3IuDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uSWQgVGhlIHRyYW5zaXRpb24gaWQNCisgICAgICogQHBhcmFtIGFmdGVyTWVkaWFJdGVtIFRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGVuZCBvZiB0aGlzDQorICAgICAqICAgICAgbWVkaWEgaXRlbQ0KKyAgICAgKiBAcGFyYW0gZHVyYXRpb25NcyBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiBpbiBtaWxsaXNlY29uZHMNCisgICAgICogQHBhcmFtIGJlaGF2aW9yIFRoZSB0cmFuc2l0aW9uIGJlaGF2aW9yDQorICAgICAqLw0KKyAgICBwdWJsaWMgVHJhbnNpdGlvbkVuZEN1cnRhaW5DbG9zaW5nKFN0cmluZyB0cmFuc2l0aW9uSWQsIE1lZGlhSXRlbSBhZnRlck1lZGlhSXRlbSwNCisgICAgICAgICAgICBsb25nIGR1cmF0aW9uLCBpbnQgYmVoYXZpb3IpIHsNCisgICAgICAgIHN1cGVyKHRyYW5zaXRpb25JZCwgYWZ0ZXJNZWRpYUl0ZW0sIG51bGwsIGR1cmF0aW9uLCBiZWhhdmlvcik7DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHZvaWQgZ2VuZXJhdGUoKSB7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL1RyYW5zaXRpb25FbmRGYWRlVG9CbGFjay5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL1RyYW5zaXRpb25FbmRGYWRlVG9CbGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVmOTEzZmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvbkVuZEZhZGVUb0JsYWNrLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudmlkZW9lZGl0b3I7DQorDQorLyoqDQorICogVGhpcyB0cmFuc2l0aW9uIGZhZGVzIHRvIGJsYWNrIGZyYW1lIHVzaW5nIGZhZGUgb3V0IGluIGEgY2VydGFpbiBwcm92aWRlZA0KKyAqIGR1cmF0aW9uLiBUaGlzIHRyYW5zaXRpb24gaXMgYWx3YXlzIGFwcGxpZWQgYXQgdGhlIGVuZCBvZiB0aGUgbW92aWUuIHtAaGlkZQ0KKyAqIH0NCisgKi8NCitwdWJsaWMgY2xhc3MgVHJhbnNpdGlvbkVuZEZhZGVUb0JsYWNrIGV4dGVuZHMgVHJhbnNpdGlvbiB7DQorICAgIC8qKg0KKyAgICAgKiBBbiBvYmplY3Qgb2YgdGhpcyB0eXBlIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgYnkgdXNpbmcgdGhlIGRlZmF1bHQNCisgICAgICogY29uc3RydWN0b3INCisgICAgICovDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQ0KKyAgICBwcml2YXRlIFRyYW5zaXRpb25FbmRGYWRlVG9CbGFjaygpIHsNCisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgMCwgQkVIQVZJT1JfTElORUFSKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29uc3RydWN0b3IuDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uSWQgVGhlIHRyYW5zaXRpb24gaWQNCisgICAgICogQHBhcmFtIGFmdGVyTWVkaWFJdGVtIFRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGVuZCBvZiB0aGlzDQorICAgICAqICAgICAgbWVkaWEgaXRlbQ0KKyAgICAgKiBAcGFyYW0gZHVyYXRpb25NcyBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiBpbiBtaWxsaXNlY29uZHMNCisgICAgICogQHBhcmFtIGJlaGF2aW9yIFRoZSB0cmFuc2l0aW9uIGJlaGF2aW9yDQorICAgICAqLw0KKyAgICBwdWJsaWMgVHJhbnNpdGlvbkVuZEZhZGVUb0JsYWNrKFN0cmluZyB0cmFuc2l0aW9uSWQsIE1lZGlhSXRlbSBhZnRlck1lZGlhSXRlbSwgbG9uZyBkdXJhdGlvbiwNCisgICAgICAgICAgICBpbnQgYmVoYXZpb3IpIHsNCisgICAgICAgIHN1cGVyKHRyYW5zaXRpb25JZCwgYWZ0ZXJNZWRpYUl0ZW0sIG51bGwsIGR1cmF0aW9uLCBiZWhhdmlvcik7DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHZvaWQgZ2VuZXJhdGUoKSB7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL1RyYW5zaXRpb25GYWRlVG9CbGFjay5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL1RyYW5zaXRpb25GYWRlVG9CbGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk1NjlhNjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvbkZhZGVUb0JsYWNrLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudmlkZW9lZGl0b3I7DQorDQorDQorLyoqDQorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlbmRlciBhIGZhZGUgdG8gYmxhY2sgdHJhbnNpdGlvbiBiZXR3ZWVuIHR3byB2aWRlb3MuDQorICoge0BoaWRlfQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBUcmFuc2l0aW9uRmFkZVRvQmxhY2sgZXh0ZW5kcyBUcmFuc2l0aW9uIHsNCisgICAgLyoqDQorICAgICAqIEFuIG9iamVjdCBvZiB0aGlzIHR5cGUgY2Fubm90IGJlIGluc3RhbnRpYXRlZCBieSB1c2luZyB0aGUgZGVmYXVsdA0KKyAgICAgKiBjb25zdHJ1Y3Rvcg0KKyAgICAgKi8NCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQorICAgIHByaXZhdGUgVHJhbnNpdGlvbkZhZGVUb0JsYWNrKCkgew0KKyAgICAgICAgdGhpcyhudWxsLCBudWxsLCBudWxsLCAwLCAwKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29uc3RydWN0b3INCisgICAgICoNCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25JZCBUaGUgdHJhbnNpdGlvbiBpZA0KKyAgICAgKiBAcGFyYW0gYWZ0ZXJNZWRpYUl0ZW0gVGhlIHRyYW5zaXRpb24gaXMgYXBwbGllZCB0byB0aGUgZW5kIG9mIHRoaXMNCisgICAgICogICAgICBtZWRpYSBpdGVtDQorICAgICAqIEBwYXJhbSBiZWZvcmVNZWRpYUl0ZW0gVGhlIHRyYW5zaXRpb24gaXMgYXBwbGllZCB0byB0aGUgYmVnaW5uaW5nIG9mDQorICAgICAqICAgICAgdGhpcyBtZWRpYSBpdGVtDQorICAgICAqIEBwYXJhbSBkdXJhdGlvbk1zIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uDQorICAgICAqIEBwYXJhbSBiZWhhdmlvciBiZWhhdmlvciBpcyBvbmUgb2YgdGhlIGJlaGF2aW9yIGRlZmluZWQgaW4gVHJhbnNpdGlvbg0KKyAgICAgKiAgICAgICAgICAgIGNsYXNzDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGJlaGF2aW9yIGlzIG5vdCBzdXBwb3J0ZWQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgVHJhbnNpdGlvbkZhZGVUb0JsYWNrKFN0cmluZyB0cmFuc2l0aW9uSWQsIE1lZGlhSXRlbSBhZnRlck1lZGlhSXRlbSwNCisgICAgICAgICAgICBNZWRpYUl0ZW0gYmVmb3JlTWVkaWFJdGVtLCBsb25nIGR1cmF0aW9uTXMsIGludCBiZWhhdmlvcikgew0KKyAgICAgICAgc3VwZXIodHJhbnNpdGlvbklkLCBhZnRlck1lZGlhSXRlbSwgYmVmb3JlTWVkaWFJdGVtLCBkdXJhdGlvbk1zLCBiZWhhdmlvcik7DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHZvaWQgZ2VuZXJhdGUoKSB7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL1RyYW5zaXRpb25TbGlkaW5nLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvblNsaWRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYzlmNGIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL1RyYW5zaXRpb25TbGlkaW5nLmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisNCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudmlkZW9lZGl0b3I7DQorDQorLyoqDQorICogVGhpcyBjbGFzcyBhbGxvd3MgdG8gY3JlYXRlIHNsaWRpbmcgdHJhbnNpdGlvbnMNCisgKiB7QGhpZGV9DQorICovDQorcHVibGljIGNsYXNzIFRyYW5zaXRpb25TbGlkaW5nIGV4dGVuZHMgVHJhbnNpdGlvbiB7DQorDQorICAgIC8qKiBWaWRlbyAxIGlzIHB1c2hlZCB0byB0aGUgcmlnaHQgd2hpbGUgdmlkZW8gMiBpcyBjb21pbmcgZnJvbSBsZWZ0ICovDQorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERJUkVDVElPTl9SSUdIVF9PVVRfTEVGVF9JTiA9IDA7DQorICAgIC8qKiBWaWRlbyAxIGlzIHB1c2hlZCB0byB0aGUgbGVmdCB3aGlsZSB2aWRlbyAyIGlzIGNvbWluZyBmcm9tIHJpZ2h0ICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9MRUZUX09VVF9SSUdIVF9JTiA9IDE7DQorICAgIC8qKiBWaWRlbyAxIGlzIHB1c2hlZCB0byB0aGUgdG9wIHdoaWxlIHZpZGVvIDIgaXMgY29taW5nIGZyb20gYm90dG9tICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9UT1BfT1VUX0JPVFRPTV9JTiA9IDI7DQorICAgIC8qKiBWaWRlbyAxIGlzIHB1c2hlZCB0byB0aGUgYm90dG9tIHdoaWxlIHZpZGVvIDIgaXMgY29taW5nIGZyb20gdG9wICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9CT1RUT01fT1VUX1RPUF9JTiA9IDM7DQorDQorICAgIC8vIFRoZSBzbGlkaW5nIHRyYW5zaXRpb25zDQorICAgIHByaXZhdGUgZmluYWwgaW50IG1TbGlkaW5nRGlyZWN0aW9uOw0KKw0KKyAgICAvKioNCisgICAgICogQW4gb2JqZWN0IG9mIHRoaXMgdHlwZSBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGJ5IHVzaW5nIHRoZSBkZWZhdWx0DQorICAgICAqIGNvbnN0cnVjdG9yDQorICAgICAqLw0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCisgICAgcHJpdmF0ZSBUcmFuc2l0aW9uU2xpZGluZygpIHsNCisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgbnVsbCwgMCwgMCwgMCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvbnN0cnVjdG9yDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uSWQgVGhlIHRyYW5zaXRpb24gaWQNCisgICAgICogQHBhcmFtIGFmdGVyTWVkaWFJdGVtIFRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGVuZCBvZiB0aGlzDQorICAgICAqICAgICAgbWVkaWEgaXRlbQ0KKyAgICAgKiBAcGFyYW0gYmVmb3JlTWVkaWFJdGVtIFRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGJlZ2lubmluZyBvZg0KKyAgICAgKiAgICAgIHRoaXMgbWVkaWEgaXRlbQ0KKyAgICAgKiBAcGFyYW0gZHVyYXRpb25NcyBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiBpbiBtaWxsaXNlY29uZHMNCisgICAgICogQHBhcmFtIGJlaGF2aW9yIGJlaGF2aW9yIGlzIG9uZSBvZiB0aGUgYmVoYXZpb3IgZGVmaW5lZCBpbiBUcmFuc2l0aW9uDQorICAgICAqICAgICAgICAgICAgY2xhc3MNCisgICAgICogQHBhcmFtIGRpcmVjdGlvbiBkaXJlY3Rpb24gc2hhbGwgYmUgb25lIG9mIHRoZSBzdXBwb3J0ZWQgZGlyZWN0aW9ucyBsaWtlDQorICAgICAqICAgICAgICAgICAgUklHSFRfT1VUX0xFRlRfSU4NCisgICAgICoNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYmVoYXZpb3IgaXMgbm90IHN1cHBvcnRlZC4NCisgICAgICovDQorICAgIHB1YmxpYyBUcmFuc2l0aW9uU2xpZGluZyhTdHJpbmcgdHJhbnNpdGlvbklkLCBNZWRpYUl0ZW0gYWZ0ZXJNZWRpYUl0ZW0sDQorICAgICAgICAgICAgTWVkaWFJdGVtIGJlZm9yZU1lZGlhSXRlbSwgbG9uZyBkdXJhdGlvbk1zLCBpbnQgYmVoYXZpb3IsIGludCBkaXJlY3Rpb24pIHsNCisgICAgICAgIHN1cGVyKHRyYW5zaXRpb25JZCwgYWZ0ZXJNZWRpYUl0ZW0sIGJlZm9yZU1lZGlhSXRlbSwgZHVyYXRpb25NcywgYmVoYXZpb3IpOw0KKyAgICAgICAgbVNsaWRpbmdEaXJlY3Rpb24gPSBkaXJlY3Rpb247DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEByZXR1cm4gVGhlIHNsaWRpbmcgZGlyZWN0aW9uDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldERpcmVjdGlvbigpIHsNCisgICAgICAgIHJldHVybiBtU2xpZGluZ0RpcmVjdGlvbjsNCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiB7QGluaGVyaXREb2N9DQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgdm9pZCBnZW5lcmF0ZSgpIHsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvblN0YXJ0Q3VydGFpbk9wZW5pbmcuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9UcmFuc2l0aW9uU3RhcnRDdXJ0YWluT3BlbmluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI3ODdiMzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvblN0YXJ0Q3VydGFpbk9wZW5pbmcuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS52aWRlb2VkaXRvcjsNCisNCisNCisvKioNCisgKiBUaGlzIHRyYW5zaXRpb24gZmFkZXMgZnJvbSBibGFjayBmcmFtZSB1c2luZyBjdXJ0YWluIG9wZW5pbmcuIEEgYmxhY2sNCisgKiBpbWFnZSBpcyBkaXNwbGF5ZWQgYW5kIG1vdmVzIGZyb20gYm90dG9tIHRvIHRvcCBtYWtpbmcgdGhlIHZpZGVvIHZpc2libGUuDQorICogVGhpcyB0cmFuc2l0aW9uIGlzIGFsd2F5cyBhcHBsaWVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1vdmllLg0KKyAqIHtAaGlkZX0NCisgKi8NCitwdWJsaWMgY2xhc3MgVHJhbnNpdGlvblN0YXJ0Q3VydGFpbk9wZW5pbmcgZXh0ZW5kcyBUcmFuc2l0aW9uIHsNCisgICAgLyoqDQorICAgICAqIEFuIG9iamVjdCBvZiB0aGlzIHR5cGUgY2Fubm90IGJlIGluc3RhbnRpYXRlZCBieSB1c2luZyB0aGUgZGVmYXVsdA0KKyAgICAgKiBjb25zdHJ1Y3Rvcg0KKyAgICAgKi8NCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQorICAgIHByaXZhdGUgVHJhbnNpdGlvblN0YXJ0Q3VydGFpbk9wZW5pbmcoKSB7DQorICAgICAgICB0aGlzKG51bGwsIG51bGwsIDAsIFRyYW5zaXRpb24uQkVIQVZJT1JfTElORUFSKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29uc3RydWN0b3INCisgICAgICoNCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25JZCBUaGUgdHJhbnNpdGlvbiBpZA0KKyAgICAgKiBAcGFyYW0gYmVmb3JlTWVkaWFJdGVtIFRoZSB0cmFuc2l0aW9uIGlzIGFwcGxpZWQgdG8gdGhlIGJlZ2lubmluZyBvZg0KKyAgICAgKiAgICAgIHRoaXMgbWVkaWEgaXRlbQ0KKyAgICAgKiBAcGFyYW0gZHVyYXRpb25NcyBUaGUgZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24gaW4gbWlsbGlzZWNvbmRzDQorICAgICAqIEBwYXJhbSBiZWhhdmlvciBUaGUgdHJhbnNpdGlvbiBiZWhhdmlvcg0KKyAgICAgKi8NCisgICAgcHVibGljIFRyYW5zaXRpb25TdGFydEN1cnRhaW5PcGVuaW5nKFN0cmluZyB0cmFuc2l0aW9uSWQsIE1lZGlhSXRlbSBiZWZvcmVNZWRpYUl0ZW0sDQorICAgICAgICAgICAgbG9uZyBkdXJhdGlvbk1zLCBpbnQgYmVoYXZpb3IpIHsNCisgICAgICAgIHN1cGVyKHRyYW5zaXRpb25JZCwgbnVsbCwgYmVmb3JlTWVkaWFJdGVtLCBkdXJhdGlvbk1zLCBiZWhhdmlvcik7DQorICAgIH0NCisNCisgICAgLyoNCisgICAgICoge0Bpbmhlcml0RG9jfQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlKCkgew0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9UcmFuc2l0aW9uU3RhcnRGYWRlRnJvbUJsYWNrLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvblN0YXJ0RmFkZUZyb21CbGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOTkzYTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVHJhbnNpdGlvblN0YXJ0RmFkZUZyb21CbGFjay5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBhbmRyb2lkLm1lZGlhLnZpZGVvZWRpdG9yOw0KKw0KKy8qKg0KKyAqIFRoaXMgdHJhbnNpdGlvbiBmYWRlcyBmcm9tIGJsYWNrIHVzaW5nIGZhZGUtaW4gaW4gYSBjZXJ0YWluIHByb3ZpZGVkDQorICogZHVyYXRpb24uIFRoaXMgdHJhbnNpdGlvbiBpcyBhbHdheXMgYXBwbGllZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtb3ZpZS4NCisgKiB7QGhpZGV9DQorICovDQorcHVibGljIGNsYXNzIFRyYW5zaXRpb25TdGFydEZhZGVGcm9tQmxhY2sgZXh0ZW5kcyBUcmFuc2l0aW9uIHsNCisgICAgLyoqDQorICAgICAqIEFuIG9iamVjdCBvZiB0aGlzIHR5cGUgY2Fubm90IGJlIGluc3RhbnRpYXRlZCBieSB1c2luZyB0aGUgZGVmYXVsdA0KKyAgICAgKiBjb25zdHJ1Y3Rvcg0KKyAgICAgKi8NCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQorICAgIHByaXZhdGUgVHJhbnNpdGlvblN0YXJ0RmFkZUZyb21CbGFjaygpIHsNCisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgMCwgVHJhbnNpdGlvbi5CRUhBVklPUl9MSU5FQVIpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDb25zdHJ1Y3Rvcg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gdHJhbnNpdGlvbklkIFRoZSB0cmFuc2l0aW9uIGlkDQorICAgICAqIEBwYXJhbSBiZWZvcmVNZWRpYUl0ZW0gVGhlIHRyYW5zaXRpb24gaXMgYXBwbGllZCB0byB0aGUgYmVnaW5uaW5nIG9mDQorICAgICAqICAgICAgdGhpcyBtZWRpYSBpdGVtDQorICAgICAqIEBwYXJhbSBkdXJhdGlvbk1zIFRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiBpbiBtaWxsaXNlY29uZHMNCisgICAgICogQHBhcmFtIGJlaGF2aW9yIFRoZSB0cmFuc2l0aW9uIGJlaGF2aW9yDQorICAgICAqLw0KKyAgICBwdWJsaWMgVHJhbnNpdGlvblN0YXJ0RmFkZUZyb21CbGFjayhTdHJpbmcgdHJhbnNpdGlvbklkLCBNZWRpYUl0ZW0gYmVmb3JlTWVkaWFJdGVtLA0KKyAgICAgICAgICAgIGxvbmcgZHVyYXRpb25NcywgaW50IGJlaGF2aW9yKSB7DQorICAgICAgICBzdXBlcih0cmFuc2l0aW9uSWQsIG51bGwsIGJlZm9yZU1lZGlhSXRlbSwgZHVyYXRpb25NcywgYmVoYXZpb3IpOw0KKyAgICB9DQorDQorICAgIC8qDQorICAgICAqIHtAaW5oZXJpdERvY30NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZSgpIHsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVmlkZW9FZGl0b3IuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9WaWRlb0VkaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFhOGYyY2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVmlkZW9FZGl0b3IuamF2YQpAQCAtMCwwICsxLDQ5MyBAQAorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudmlkZW9lZGl0b3I7DQorDQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYW5jZWxsYXRpb25FeGNlcHRpb247DQorDQoraW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOw0KKw0KKy8qKg0KKyAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHdoaWNoIHByb3ZpZGUgdmlkZW8gZWRpdGluZw0KKyAqIGZ1bmN0aW9uYWxpdHkuIFRoZSBWaWRlb0VkaXRvciBpbXBsZW1lbnRhdGlvbiBjbGFzcyBtYW5hZ2VzIGFsbCBpbnB1dCBhbmQNCisgKiBvdXRwdXQgZmlsZXMuIFVubGVzcyBzcGVjaWZpY2FsbHkgbWVudGlvbmVkLCBtZXRob2RzIGFyZSBibG9ja2luZy4gQQ0KKyAqIHR5cGljYWwgZWRpdGluZyBzZXNzaW9uIG1heSBjb25zaXN0IG9mIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9uczoNCisgKg0KKyAqIDx1bD4NCisgKiAgPGxpPkFkZCBhIHNldCBvZiBNZWRpYUl0ZW1zPC9saT4NCisgKiAgPGxpPkFwcGx5IGEgc2V0IG9mIFRyYW5zaXRpb25zIGJldHdlZW4gTWVkaWFJdGVtczwvbGk+DQorICogIDxsaT5BZGQgRWZmZWN0cyBhbmQgT3ZlcmxheXMgdG8gbWVkaWEgaXRlbXM8L2xpPg0KKyAqICA8bGk+UHJldmlldyB0aGUgbW92aWUgYXQgYW55IHRpbWU8L2xpPg0KKyAqICA8bGk+U2F2ZSB0aGUgVmlkZW9FZGl0b3IgaW1wbGVtZW50YXRpb24gY2xhc3MgaW50ZXJuYWwgc3RhdGU8L2xpPg0KKyAqICA8bGk+UmVsZWFzZSB0aGUgVmlkZW9FZGl0b3IgaW1wbGVtZW50YXRpb24gY2xhc3MgaW5zdGFuY2UgYnkgaW52b2tpbmcNCisgKiB7QGxpbmsgI3JlbGVhc2UoKX0NCisgKiA8L3VsPg0KKyAqIFRoZSBpbnRlcm5hbCBWaWRlb0VkaXRvciBzdGF0ZSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnRzOg0KKyAqIDx1bD4NCisgKiAgPGxpPk9yZGVyZWQgJiB0cmltbWVkIE1lZGlhSXRlbXM8L2xpPg0KKyAqICA8bGk+VHJhbnNpdGlvbiB2aWRlbyBjbGlwczwvbGk+DQorICogIDxsaT5PdmVybGF5czwvbGk+DQorICogIDxsaT5FZmZlY3RzPC9saT4NCisgKiAgPGxpPkF1ZGlvIHdhdmVmb3JtIGZvciB0aGUgYmFja2dyb3VuZCBhdWRpbyBhbmQgTWVkaWFJdGVtczwvbGk+DQorICogIDxsaT5Qcm9qZWN0IHRodW1ibmFpbDwvbGk+DQorICogIDxsaT5MYXN0IGV4cG9ydGVkIG1vdmllLjwvbGk+DQorICogIDxsaT5PdGhlciBwcm9qZWN0IHNwZWNpZmljIGRhdGEgc3VjaCBhcyB0aGUgY3VycmVudCBhc3BlY3QgcmF0aW8uPC9saT4NCisgKiA8L3VsPg0KKyAqIHtAaGlkZX0NCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIFZpZGVvRWRpdG9yIHsNCisgICAgLy8gVGhlIGZpbGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0aHVtYm5haWwNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhVTUJOQUlMX0ZJTEVOQU1FID0gInRodW1ibmFpbC5qcGciOw0KKw0KKyAgICAvLyBVc2UgdGhpcyB2YWx1ZSBpbnN0ZWFkIG9mIHRoZSBzcGVjaWZpYyBlbmQgb2YgdGhlIHN0b3J5Ym9hcmQgdGltZWxpbmUNCisgICAgLy8gdmFsdWUuDQorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERVUkFUSU9OX09GX1NUT1JZQk9BUkQgPSAtMTsNCisNCisgICAgLyoqDQorICAgICAqIFRoaXMgbGlzdGVuZXIgaW50ZXJmYWNlIGlzIHVzZWQgYnkgdGhlIFZpZGVvRWRpdG9yIHRvIGVtaXQgcHJldmlldw0KKyAgICAgKiBwcm9ncmVzcyBub3RpZmljYXRpb25zLiBUaGlzIGNhbGxiYWNrIHNob3VsZCBiZSBpbnZva2VkIGFmdGVyIHRoZQ0KKyAgICAgKiBudW1iZXIgb2YgZnJhbWVzIHNwZWNpZmllZCBieQ0KKyAgICAgKiB7QGxpbmsgI3N0YXJ0UHJldmlldyhTdXJmYWNlSG9sZGVyIHN1cmZhY2VIb2xkZXIsIGxvbmcgZnJvbU1zLA0KKyAgICAgKiAgICAgICAgICAgaW50IGNhbGxiYWNrQWZ0ZXJGcmFtZUNvdW50LCBQcmV2aWV3UHJvZ3Jlc3NMaXN0ZW5lciBsaXN0ZW5lcil9DQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFByZXZpZXdQcm9ncmVzc0xpc3RlbmVyIHsNCisgICAgICAgIC8qKg0KKyAgICAgICAgICogVGhpcyBtZXRob2Qgbm90aWZpZXMgdGhlIGxpc3RlbmVyIG9mIHRoZSBjdXJyZW50IHRpbWUgcG9zaXRpb24gd2hpbGUNCisgICAgICAgICAqIHByZXZpZXdpbmcgYSBwcm9qZWN0Lg0KKyAgICAgICAgICoNCisgICAgICAgICAqIEBwYXJhbSB2aWRlb0VkaXRvciBUaGUgVmlkZW9FZGl0b3IgaW5zdGFuY2UNCisgICAgICAgICAqIEBwYXJhbSB0aW1lTXMgVGhlIGN1cnJlbnQgcHJldmlldyBwb3NpdGlvbiAoZXhwcmVzc2VkIGluIG1pbGxpc2Vjb25kcw0KKyAgICAgICAgICogICAgICAgICAgICBzaW5jZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdG9yeWJvYXJkIHRpbWVsaW5lKS4NCisgICAgICAgICAqIEBwYXJhbSBlbmQgdHJ1ZSBpZiB0aGUgZW5kIG9mIHRoZSB0aW1lbGluZSB3YXMgcmVhY2hlZA0KKyAgICAgICAgICovDQorICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzKFZpZGVvRWRpdG9yIHZpZGVvRWRpdG9yLCBsb25nIHRpbWVNcywgYm9vbGVhbiBlbmQpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGlzIGxpc3RlbmVyIGludGVyZmFjZSBpcyB1c2VkIGJ5IHRoZSBWaWRlb0VkaXRvciB0byBlbWl0IGV4cG9ydCBzdGF0dXMNCisgICAgICogbm90aWZpY2F0aW9ucy4NCisgICAgICoge0BsaW5rICNleHBvcnQoU3RyaW5nIGZpbGVuYW1lLCBFeHBvcnRQcm9ncmVzc0xpc3RlbmVyIGxpc3RlbmVyLCBpbnQgaGVpZ2h0LCBpbnQgYml0cmF0ZSl9DQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIEV4cG9ydFByb2dyZXNzTGlzdGVuZXIgew0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyB0aGUgbGlzdGVuZXIgb2YgdGhlIHByb2dyZXNzIHN0YXR1cyBvZiBhIGV4cG9ydA0KKyAgICAgICAgICogb3BlcmF0aW9uLg0KKyAgICAgICAgICoNCisgICAgICAgICAqIEBwYXJhbSB2aWRlb0VkaXRvciBUaGUgVmlkZW9FZGl0b3IgaW5zdGFuY2UNCisgICAgICAgICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSB3aGljaCBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZw0KKyAgICAgICAgICogICAgICAgICAgICBleHBvcnRlZC4NCisgICAgICAgICAqIEBwYXJhbSBwcm9ncmVzcyBUaGUgcHJvZ3Jlc3MgaW4gJS4gQXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZXhwb3J0LCB0aGlzDQorICAgICAgICAgKiAgICAgICAgICAgIHZhbHVlIGlzIHNldCB0byAwOyBhdCB0aGUgZW5kLCB0aGUgdmFsdWUgaXMgc2V0IHRvIDEwMC4NCisgICAgICAgICAqLw0KKyAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzcyhWaWRlb0VkaXRvciB2aWRlb0VkaXRvciwgU3RyaW5nIGZpbGVuYW1lLCBpbnQgcHJvZ3Jlc3MpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBwYXRoIHdoZXJlIHRoZSBWaWRlb0VkaXRvciBzdG9yZXMgYWxsIGZpbGVzIHJlbGF0ZWQgdG8gdGhlDQorICAgICAqIHByb2plY3QNCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpOw0KKw0KKyAgICAvKioNCisgICAgICogVGhpcyBtZXRob2QgcmVsZWFzZXMgYWxsIGluLW1lbW9yeSByZXNvdXJjZXMgdXNlZCBieSB0aGUgVmlkZW9FZGl0b3INCisgICAgICogaW5zdGFuY2UuIEFsbCBwZW5kaW5nIG9wZXJhdGlvbnMgc3VjaCBhcyBwcmV2aWV3LCBleHBvcnQgYW5kIGV4dHJhY3QNCisgICAgICogYXVkaW8gd2F2ZWZvcm0gbXVzdCBiZSBjYW5jZWxlZC4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKTsNCisNCisgICAgLyoqDQorICAgICAqIFBlcnNpc3QgdGhlIGN1cnJlbnQgaW50ZXJuYWwgc3RhdGUgb2YgVmlkZW9FZGl0b3IgdG8gdGhlIHByb2plY3QgcGF0aC4NCisgICAgICogVGhlIFZpZGVvRWRpdG9yIHN0YXRlIG1heSBiZSByZXN0b3JlZCBieSBpbnZva2luZyB0aGUNCisgICAgICoge0BsaW5rIFZpZGVvRWRpdG9yRmFjdG9yeSNsb2FkKFN0cmluZyl9IG1ldGhvZC4gVGhpcyBtZXRob2QgZG9lcyBub3QNCisgICAgICogcmVsZWFzZSB0aGUgaW50ZXJuYWwgaW4tbWVtb3J5IHN0YXRlIG9mIHRoZSBWaWRlb0VkaXRvci4gVG8gcmVsZWFzZQ0KKyAgICAgKiB0aGUgaW4tbWVtb3J5IHN0YXRlIG9mIHRoZSBWaWRlb0VkaXRvciB0aGUge0BsaW5rICNyZWxlYXNlKCl9IG1ldGhvZA0KKyAgICAgKiBtdXN0IGJlIGludm9rZWQuDQorICAgICAqDQorICAgICAqIFBlbmRpbmcgdHJhbnNpdGlvbiBnZW5lcmF0aW9ucyBtdXN0IGJlIGFsbG93ZWQgdG8gY29tcGxldGUgYmVmb3JlIHRoZQ0KKyAgICAgKiBzdGF0ZSBpcyBzYXZlZC4NCisgICAgICogUGVuZGluZyBhdWRpbyB3YXZlZm9ybSBnZW5lcmF0aW9ucyBtdXN0IGJlIGFsbG93ZWQgdG8gY29tcGxldGUuDQorICAgICAqIFBlbmRpbmcgZXhwb3J0IG9wZXJhdGlvbnMgbXVzdCBiZSBhbGxvd2VkIHRvIGNvbnRpbnVlLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsNCisNCisgICAgLyoqDQorICAgICAqIENyZWF0ZSB0aGUgb3V0cHV0IG1vdmllIGJhc2VkIG9uIGFsbCBtZWRpYSBpdGVtcyBhZGRlZCBhbmQgdGhlIGFwcGxpZWQNCisgICAgICogc3Rvcnlib2FyZCBpdGVtcy4gVGhpcyBtZXRob2QgY2FuIHRha2UgYSBsb25nIHRpbWUgdG8gZXhlY3V0ZSBhbmQgaXMNCisgICAgICogYmxvY2tpbmcuIFRoZSBhcHBsaWNhdGlvbiB3aWxsIHJlY2VpdmUgcHJvZ3Jlc3Mgbm90aWZpY2F0aW9ucyB2aWEgdGhlDQorICAgICAqIEV4cG9ydFByb2dyZXNzTGlzdGVuZXIuIFNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBtYXkgbm90IHN1cHBvcnQgbXVsdGlwbGUNCisgICAgICogc2ltdWx0YW5lb3VzIGV4cG9ydCBvcGVyYXRpb25zLg0KKyAgICAgKg0KKyAgICAgKiBOb3RlIHRoYXQgaW52b2tpbmcgbWV0aG9kcyB3aGljaCB3b3VsZCBjaGFuZ2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBvdXRwdXQNCisgICAgICogbW92aWUgdGhyb3cgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdoaWxlIGFuIGV4cG9ydCBvcGVyYXRpb24gaXMNCisgICAgICogcGVuZGluZy4NCisgICAgICoNCisgICAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBvdXRwdXQgZmlsZSBuYW1lIChpbmNsdWRpbmcgdGhlIGZ1bGwgcGF0aCkNCisgICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBvdXRwdXQgdmlkZW8gZmlsZS4gVGhlIHN1cHBvcnRlZCB2YWx1ZXMNCisgICAgICogICAgICAgICAgICBmb3IgaGVpZ2h0IGFyZSBkZXNjcmliZWQgaW4gdGhlIE1lZGlhUHJvcGVydGllcyBjbGFzcywgZm9yDQorICAgICAqICAgICAgICAgICAgZXhhbXBsZTogSEVJR0hUXzQ4MC4gVGhlIHdpZHRoIHdpbGwgYmUgYXV0b21hdGljYWxseQ0KKyAgICAgKiAgICAgICAgICAgIGNvbXB1dGVkIGFjY29yZGluZyB0byB0aGUgYXNwZWN0IHJhdGlvIHByb3ZpZGVkIGJ5DQorICAgICAqICAgICAgICAgICAge0BsaW5rICNzZXRBc3BlY3RSYXRpbyhpbnQpfQ0KKyAgICAgKiBAcGFyYW0gYml0cmF0ZSBUaGUgYml0cmF0ZSBvZiB0aGUgb3V0cHV0IHZpZGVvIGZpbGUuIFRoaXMgaXMgYXBwcm94aW1hdGUNCisgICAgICogICAgICAgICAgICB2YWx1ZSBmb3IgdGhlIG91dHB1dCBtb3ZpZS4gU3VwcG9ydGVkIGJpdHJhdGUgdmFsdWVzIGFyZQ0KKyAgICAgKiAgICAgICAgICAgIGRlc2NyaWJlZCBpbiB0aGUgTWVkaWFQcm9wZXJ0aWVzIGNsYXNzIGZvciBleGFtcGxlOg0KKyAgICAgKiAgICAgICAgICAgIEJJVFJBVEVfMzg0Sw0KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIGZvciBwcm9ncmVzcyBub3RpZmljYXRpb25zLiBVc2UgbnVsbCBpZg0KKyAgICAgKiAgICAgICAgICAgIGV4cG9ydCBwcm9ncmVzcyBub3RpZmljYXRpb25zIGFyZSBub3QgbmVlZGVkLg0KKyAgICAgKg0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBoZWlnaHQgb3IgYml0cmF0ZSBhcmUgbm90IHN1cHBvcnRlZC4NCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBvdXRwdXQgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZA0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIHByZXZpZXcgb3IgYW4gZXhwb3J0IGlzIGluIHByb2dyZXNzIG9yDQorICAgICAqICAgICAgICAgICAgIGlmIG5vIE1lZGlhSXRlbSBoYXMgYmVlbiBhZGRlZA0KKyAgICAgKiBAdGhyb3dzIENhbmNlbGxhdGlvbkV4Y2VwdGlvbiBpZiBleHBvcnQgaXMgY2FuY2VsZWQgYnkgY2FsbGluZw0KKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgI2NhbmNlbEV4cG9ydCgpfQ0KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiBtdWx0aXBsZSBzaW11bHRhbmVvdXMgZXhwb3J0KCkNCisgICAgICogIGFyZSBub3QgYWxsb3dlZA0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgZXhwb3J0KFN0cmluZyBmaWxlbmFtZSwgaW50IGhlaWdodCwgaW50IGJpdHJhdGUsIEV4cG9ydFByb2dyZXNzTGlzdGVuZXIgbGlzdGVuZXIpDQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOw0KKw0KKyAgICAvKioNCisgICAgICogQ2FuY2VsIHRoZSBydW5uaW5nIGV4cG9ydCBvcGVyYXRpb24uIFRoaXMgbWV0aG9kIGJsb2NrcyB1bnRpbCB0aGUNCisgICAgICogZXhwb3J0IGlzIGNhbmNlbGVkIGFuZCB0aGUgZXhwb3J0ZWQgZmlsZSAoaWYgYW55KSBpcyBkZWxldGVkLiBJZiB0aGUNCisgICAgICogZXhwb3J0IGNvbXBsZXRlZCBieSB0aGUgdGltZSB0aGlzIG1ldGhvZCBpcyBpbnZva2VkLCB0aGUgZXhwb3J0IGZpbGUNCisgICAgICogd2lsbCBiZSBkZWxldGVkLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIGZpbGVuYW1lIHdoaWNoIGlkZW50aWZpZXMgdGhlIGV4cG9ydCBvcGVyYXRpb24gdG8gYmUNCisgICAgICogICAgICAgICAgICBjYW5jZWxlZC4NCisgICAgICoqLw0KKyAgICBwdWJsaWMgdm9pZCBjYW5jZWxFeHBvcnQoU3RyaW5nIGZpbGVuYW1lKTsNCisNCisgICAgLyoqDQorICAgICAqIEFkZCBhIG1lZGlhIGl0ZW0gYXQgdGhlIGVuZCBvZiB0aGUgc3Rvcnlib2FyZC4NCisgICAgICoNCisgICAgICogQHBhcmFtIG1lZGlhSXRlbSBUaGUgbWVkaWEgaXRlbSBvYmplY3QgdG8gYWRkDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGEgcHJldmlldyBvciBhbiBleHBvcnQgaXMgaW4gcHJvZ3Jlc3Mgb3INCisgICAgICogICAgICAgICAgICAgaWYgdGhlIG1lZGlhIGl0ZW0gaWQgaXMgbm90IHVuaXF1ZSBhY3Jvc3MgYWxsIHRoZSBtZWRpYSBpdGVtcw0KKyAgICAgKiAgICAgICAgICAgICBhZGRlZC4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGFkZE1lZGlhSXRlbShNZWRpYUl0ZW0gbWVkaWFJdGVtKTsNCisNCisgICAgLyoqDQorICAgICAqIEluc2VydCBhIG1lZGlhIGl0ZW0gYWZ0ZXIgdGhlIG1lZGlhIGl0ZW0gd2l0aCB0aGUgc3BlY2lmaWVkIGlkLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gbWVkaWFJdGVtIFRoZSBtZWRpYSBpdGVtIG9iamVjdCB0byBpbnNlcnQNCisgICAgICogQHBhcmFtIGFmdGVyTWVkaWFJdGVtSWQgSW5zZXJ0IHRoZSBtZWRpYUl0ZW0gYWZ0ZXIgdGhlIG1lZGlhIGl0ZW0NCisgICAgICogICAgICAgICAgICBpZGVudGlmaWVkIGJ5IHRoaXMgaWQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG51bGwsIHRoZSBtZWRpYQ0KKyAgICAgKiAgICAgICAgICAgIGl0ZW0gaXMgaW5zZXJ0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGltZWxpbmUuDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGEgcHJldmlldyBvciBhbiBleHBvcnQgaXMgaW4gcHJvZ3Jlc3MNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbWVkaWEgaXRlbSB3aXRoIHRoZSBzcGVjaWZpZWQgaWQgZG9lcw0KKyAgICAgKiAgICAgICAgICAgICBub3QgZXhpc3QgKG51bGwgaXMgYSB2YWxpZCB2YWx1ZSkgb3IgaWYgdGhlIG1lZGlhIGl0ZW0gaWQgaXMNCisgICAgICogICAgICAgICAgICAgbm90IHVuaXF1ZSBhY3Jvc3MgYWxsIHRoZSBtZWRpYSBpdGVtcyBhZGRlZC4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGluc2VydE1lZGlhSXRlbShNZWRpYUl0ZW0gbWVkaWFJdGVtLCBTdHJpbmcgYWZ0ZXJNZWRpYUl0ZW1JZCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBNb3ZlIGEgbWVkaWEgaXRlbSBhZnRlciB0aGUgbWVkaWEgaXRlbSB3aXRoIHRoZSBzcGVjaWZpZWQgaWQuDQorICAgICAqDQorICAgICAqIE5vdGU6IFRoZSBwcm9qZWN0IHRodW1ibmFpbCBpcyByZWdlbmVyYXRlZCBpZiB0aGUgbWVkaWEgaXRlbSBpcyBvcg0KKyAgICAgKiBiZWNvbWVzIHRoZSBmaXJzdCBtZWRpYSBpdGVtIGluIHRoZSBzdG9yeWJvYXJkIHRpbWVsaW5lLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gbWVkaWFJdGVtSWQgVGhlIGlkIG9mIHRoZSBtZWRpYSBpdGVtIHRvIG1vdmUNCisgICAgICogQHBhcmFtIGFmdGVyTWVkaWFJdGVtSWQgTW92ZSB0aGUgbWVkaWEgaXRlbSBpZGVudGlmaWVkIGJ5IG1lZGlhSXRlbUlkIGFmdGVyDQorICAgICAqICAgICAgICAgIHRoZSBtZWRpYSBpdGVtIGlkZW50aWZpZWQgYnkgdGhpcyBwYXJhbWV0ZXIuIElmIHRoaXMgcGFyYW1ldGVyDQorICAgICAqICAgICAgICAgIGlzIG51bGwsIHRoZSBtZWRpYSBpdGVtIGlzIG1vdmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlDQorICAgICAqICAgICAgICAgIHRpbWVsaW5lLg0KKyAgICAgKg0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIHByZXZpZXcgb3IgYW4gZXhwb3J0IGlzIGluIHByb2dyZXNzDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG9uZSBvZiBtZWRpYSBpdGVtIGlkcyBpcyBpbnZhbGlkDQorICAgICAqICAgICAgICAgIChudWxsIGlzIGEgdmFsaWQgdmFsdWUpDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBtb3ZlTWVkaWFJdGVtKFN0cmluZyBtZWRpYUl0ZW1JZCwgU3RyaW5nIGFmdGVyTWVkaWFJdGVtSWQpOw0KKw0KKyAgICAvKioNCisgICAgICogUmVtb3ZlIHRoZSBtZWRpYSBpdGVtIHdpdGggdGhlIHNwZWNpZmllZCBpZC4gSWYgdGhlcmUgYXJlIHRyYW5zaXRpb25zDQorICAgICAqIGJlZm9yZSBvciBhZnRlciB0aGlzIG1lZGlhIGl0ZW0sIHRoZW4gdGhpcy90aGVzZSB0cmFuc2l0aW9uKHMpIGFyZQ0KKyAgICAgKiByZW1vdmVkIGZyb20gdGhlIHN0b3J5Ym9hcmQuIElmIHRoZSBleHRyYWN0aW9uIG9mIHRoZSBhdWRpbyB3YXZlZm9ybSBpcw0KKyAgICAgKiBpbiBwcm9ncmVzcywgdGhlIGV4dHJhY3Rpb24gaXMgY2FuY2VsZWQgYW5kIHRoZSBmaWxlIGlzIGRlbGV0ZWQuDQorICAgICAqDQorICAgICAqIEVmZmVjdHMgYW5kIG92ZXJsYXlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVkaWEgaXRlbSB3aWxsIGFsc28gYmUNCisgICAgICogcmVtb3ZlZC4NCisgICAgICoNCisgICAgICogTm90ZTogVGhlIHByb2plY3QgdGh1bWJuYWlsIGlzIHJlZ2VuZXJhdGVkIGlmIHRoZSBtZWRpYSBpdGVtIHdoaWNoDQorICAgICAqIGlzIHJlbW92ZWQgaXMgdGhlIGZpcnN0IG1lZGlhIGl0ZW0gaW4gdGhlIHN0b3J5Ym9hcmQgb3IgaWYgdGhlDQorICAgICAqIG1lZGlhIGl0ZW0gaXMgdGhlIG9ubHkgb25lIGluIHRoZSBzdG9yeWJvYXJkLiBJZiB0aGUNCisgICAgICogbWVkaWEgaXRlbSBpcyB0aGUgb25seSBvbmUgaW4gdGhlIHN0b3J5Ym9hcmQsIHRoZSBwcm9qZWN0IHRodW1ibmFpbA0KKyAgICAgKiB3aWxsIGJlIHNldCB0byBhIGJsYWNrIGZyYW1lIGFuZCB0aGUgYXNwZWN0IHJhdGlvIHdpbGwgcmV2ZXJ0IHRvIHRoZQ0KKyAgICAgKiBkZWZhdWx0IGFzcGVjdCByYXRpbywgYW5kIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8NCisgICAgICogcmVtb3ZlQWxsTWVkaWFJdGVtcygpIGluIHRoaXMgY2FzZS4NCisgICAgICoNCisgICAgICogQHBhcmFtIG1lZGlhSXRlbUlkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIG1lZGlhIGl0ZW0gdG8gYmUgcmVtb3ZlZA0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSBpdGVtIHRoYXQgd2FzIHJlbW92ZWQNCisgICAgICoNCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBwcmV2aWV3IG9yIGFuIGV4cG9ydCBpcyBpbiBwcm9ncmVzcw0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtZWRpYSBpdGVtIHdpdGggdGhlIHNwZWNpZmllZCBpZA0KKyAgICAgKiAgICAgICAgICBkb2VzIG5vdCBleGlzdA0KKyAgICAgKi8NCisgICAgcHVibGljIE1lZGlhSXRlbSByZW1vdmVNZWRpYUl0ZW0oU3RyaW5nIG1lZGlhSXRlbUlkKTsNCisNCisgICAgLyoqDQorICAgICAqIFJlbW92ZSBhbGwgbWVkaWEgaXRlbXMgaW4gdGhlIHN0b3J5Ym9hcmQuIEFsbCBlZmZlY3RzLCBvdmVybGF5cyBhbmQgYWxsDQorICAgICAqIHRyYW5zaXRpb25zIGFyZSBhbHNvIHJlbW92ZWQuDQorICAgICAqDQorICAgICAqIE5vdGU6IFRoZSBwcm9qZWN0IHRodW1ibmFpbCB3aWxsIGJlIHNldCB0byBhIGJsYWNrIGZyYW1lIGFuZCB0aGUgYXNwZWN0DQorICAgICAqIHJhdGlvIHdpbGwgcmV2ZXJ0IHRvIHRoZSBkZWZhdWx0IGFzcGVjdCByYXRpby4NCisgICAgICoNCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBwcmV2aWV3IG9yIGFuIGV4cG9ydCBpcyBpbiBwcm9ncmVzcw0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVkaWFJdGVtcygpOw0KKw0KKyAgICAvKioNCisgICAgICogR2V0IHRoZSBsaXN0IG9mIG1lZGlhIGl0ZW1zIGluIHRoZSBvcmRlciBpbiB3aGljaCBpdCB0aGV5IGFwcGVhciBpbiB0aGUNCisgICAgICogc3Rvcnlib2FyZCB0aW1lbGluZS4NCisgICAgICoNCisgICAgICogTm90ZSB0aGF0IGlmIGFueSBtZWRpYSBpdGVtIHNvdXJjZSBmaWxlcyBhcmUgbm8gbG9uZ2VyDQorICAgICAqIGFjY2Vzc2libGUsIHRoaXMgbWV0aG9kIHdpbGwgc3RpbGwgcHJvdmlkZSB0aGUgZnVsbCBsaXN0IG9mIG1lZGlhIGl0ZW1zLg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIG1lZGlhIGl0ZW1zLiBJZiBubyBtZWRpYSBpdGVtIGV4aXN0IGFuIGVtcHR5IGxpc3QNCisgICAgICogICAgICAgICAgd2lsbCBiZSByZXR1cm5lZC4NCisgICAgICovDQorICAgIHB1YmxpYyBMaXN0PE1lZGlhSXRlbT4gZ2V0QWxsTWVkaWFJdGVtcygpOw0KKw0KKyAgICAvKioNCisgICAgICogRmluZCB0aGUgbWVkaWEgaXRlbSB3aXRoIHRoZSBzcGVjaWZpZWQgaWQNCisgICAgICoNCisgICAgICogQHBhcmFtIG1lZGlhSXRlbUlkIFRoZSBtZWRpYSBpdGVtIGlkDQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIGl0ZW0gd2l0aCB0aGUgc3BlY2lmaWVkIGlkIChudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0KQ0KKyAgICAgKi8NCisgICAgcHVibGljIE1lZGlhSXRlbSBnZXRNZWRpYUl0ZW0oU3RyaW5nIG1lZGlhSXRlbUlkKTsNCisNCisgICAgLyoqDQorICAgICAqIEFkZCBhIHRyYW5zaXRpb24gYmV0d2VlbiB0aGUgbWVkaWEgaXRlbXMgc3BlY2lmaWVkIGJ5IHRoZSB0cmFuc2l0aW9uLg0KKyAgICAgKiBJZiBhIHRyYW5zaXRpb24gZXhpc3RlZCBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpdCBpcyBpbnZhbGlkYXRlZCBhbmQgdGhlbg0KKyAgICAgKiB0aGUgdHJhbnNpdGlvbiBpcyByZXBsYWNlZC4gTm90ZSB0aGF0IHRoZSBuZXcgdHJhbnNpdGlvbiB2aWRlbyBjbGlwIGlzDQorICAgICAqIG5vdCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGlzIG1ldGhvZC4gVGhlDQorICAgICAqIHtAbGluayBUcmFuc2l0aW9uI2dlbmVyYXRlKCl9IG1ldGhvZCBtdXN0IGJlIGludm9rZWQgdG8gZ2VuZXJhdGUNCisgICAgICogdGhlIHRyYW5zaXRpb24gdmlkZW8gY2xpcC4NCisgICAgICoNCisgICAgICogTm90ZSB0aGF0IHRoZSBUcmFuc2l0aW9uQXRFbmQgYW5kIFRyYW5zaXRpb25BdFN0YXJ0IGFyZSBzcGVjaWFsIGtpbmRzDQorICAgICAqIHRoYXQgY2FuIG5vdCBiZSBhcHBsaWVkIGJldHdlZW4gdHdvIG1lZGlhIGl0ZW1zLg0KKyAgICAgKg0KKyAgICAgKiBBIGNyb3NzZmFkZSBhdWRpbyB0cmFuc2l0aW9uIHdpbGwgYmUgYXV0b21hdGljYWxseSBhcHBsaWVkIHJlZ2FyZGxlc3Mgb2YNCisgICAgICogdGhlIHZpZGVvIHRyYW5zaXRpb24uDQorICAgICAqDQorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uIFRoZSB0cmFuc2l0aW9uIHRvIGFwcGx5DQorICAgICAqDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGEgcHJldmlldyBvciBhbiBleHBvcnQgaXMgaW4gcHJvZ3Jlc3MNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHRyYW5zaXRpb24gZHVyYXRpb24gaXMgbGFyZ2VyDQorICAgICAqICAgICAgICAgICAgICB0aGFuIHRoZSBzbWFsbGVzdCBkdXJhdGlvbiBvZiB0aGUgdHdvIG1lZGlhIGl0ZW0gZmlsZXMgb3INCisgICAgICogICAgICAgICAgICAgIGlmIHRoZSB0d28gbWVkaWEgaXRlbXMgc3BlY2lmaWVkIGluIHRoZSB0cmFuc2l0aW9uIGFyZSBub3QNCisgICAgICogICAgICAgICAgICAgIGFkamFjZW50DQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBhZGRUcmFuc2l0aW9uKFRyYW5zaXRpb24gdHJhbnNpdGlvbik7DQorDQorICAgIC8qKg0KKyAgICAgKiBSZW1vdmUgdGhlIHRyYW5zaXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGlkLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gdHJhbnNpdGlvbklkIFRoZSBpZCBvZiB0aGUgdHJhbnNpdGlvbiB0byBiZSByZW1vdmVkDQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIHRyYW5zaXRpb24gdGhhdCB3YXMgcmVtb3ZlZA0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIHByZXZpZXcgb3IgYW4gZXhwb3J0IGlzIGluIHByb2dyZXNzDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRyYW5zaXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGlkIGRvZXMNCisgICAgICogICAgICAgICAgICAgbm90IGV4aXN0DQorICAgICAqLw0KKyAgICBwdWJsaWMgVHJhbnNpdGlvbiByZW1vdmVUcmFuc2l0aW9uKFN0cmluZyB0cmFuc2l0aW9uSWQpOw0KKw0KKyAgICAvKioNCisgICAgICogR2V0IHRoZSBsaXN0IG9mIHRyYW5zaXRpb25zDQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgdHJhbnNpdGlvbnMuIElmIG5vIHRyYW5zaXRpb25zIGV4aXN0IGFuIGVtcHR5IGxpc3QNCisgICAgICogIHdpbGwgYmUgcmV0dXJuZWQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgTGlzdDxUcmFuc2l0aW9uPiBnZXRBbGxUcmFuc2l0aW9ucygpOw0KKw0KKyAgICAvKioNCisgICAgICogRmluZCB0aGUgdHJhbnNpdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgdHJhbnNpdGlvbiBpZC4NCisgICAgICoNCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25JZCBUaGUgdHJhbnNpdGlvbiBpZA0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSB0cmFuc2l0aW9uDQorICAgICAqLw0KKyAgICBwdWJsaWMgVHJhbnNpdGlvbiBnZXRUcmFuc2l0aW9uKFN0cmluZyB0cmFuc2l0aW9uSWQpOw0KKw0KKyAgICAvKioNCisgICAgICogQWRkIHRoZSBzcGVjaWZpZWQgQXVkaW9UcmFjayB0byB0aGUgc3Rvcnlib2FyZC4gTm90ZTogU3BlY2lmaWMNCisgICAgICogaW1wbGVtZW50YXRpb25zIG1heSBzdXBwb3J0IGEgbGltaXRlZCBudW1iZXIgb2YgYXVkaW8gdHJhY2tzIChlLmcuIG9ubHkNCisgICAgICogb25lIGF1ZGlvIHRyYWNrKQ0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gYXVkaW9UcmFjayBUaGUgQXVkaW9UcmFjayB0byBhZGQNCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgYQ0KKyAgICAgKiAgICAgICAgICAgICBsaW1pdGVkIG51bWJlciBvZiBhdWRpbyB0cmFja3MuDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG1lZGlhIGl0ZW0gaXMgbm90IHVuaXF1ZSBhY3Jvc3MgYWxsDQorICAgICAqICAgICAgICAgICAgIHRoZSBhdWRpbyB0cmFja3MgYWxyZWFkeSBhZGRlZC4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGFkZEF1ZGlvVHJhY2soQXVkaW9UcmFjayBhdWRpb1RyYWNrKTsNCisNCisgICAgLyoqDQorICAgICAqIEluc2VydCBhbiBhdWRpbyB0cmFjayBhZnRlciB0aGUgYXVkaW8gdHJhY2sgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLiBVc2UNCisgICAgICogYWRkQXVkaW9UcmFjayB0byBhZGQgYW4gYXVkaW8gdHJhY2sgYXQgdGhlIGVuZCBvZiB0aGUgc3Rvcnlib2FyZA0KKyAgICAgKiB0aW1lbGluZS4NCisgICAgICoNCisgICAgICogQHBhcmFtIGF1ZGlvVHJhY2sgVGhlIGF1ZGlvIHRyYWNrIG9iamVjdCB0byBpbnNlcnQNCisgICAgICogQHBhcmFtIGFmdGVyQXVkaW9UcmFja0lkIEluc2VydCB0aGUgYXVkaW8gdHJhY2sgYWZ0ZXIgdGhlIGF1ZGlvIHRyYWNrDQorICAgICAqICAgICAgICAgICAgaWRlbnRpZmllZCBieSB0aGlzIHBhcmFtZXRlci4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgbnVsbCB0aGUNCisgICAgICogICAgICAgICAgICBhdWRpbyB0cmFjayBpcyBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0aW1lbGluZS4NCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBwcmV2aWV3IG9yIGFuIGV4cG9ydCBpcyBpbiBwcm9ncmVzcw0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtZWRpYSBpdGVtIHdpdGggdGhlIHNwZWNpZmllZCBpZCBkb2VzDQorICAgICAqICAgICAgICAgICAgIG5vdCBleGlzdCAobnVsbCBpcyBhIHZhbGlkIHZhbHVlKS4gaWYgbWVkaWEgaXRlbSBpcyBub3QNCisgICAgICogICAgICAgICAgICAgdW5pcXVlIGFjcm9zcyBhbGwgdGhlIGF1ZGlvIHRyYWNrcyBhbHJlYWR5IGFkZGVkLg0KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBhDQorICAgICAqICAgICAgICAgICAgIGxpbWl0ZWQgbnVtYmVyIG9mIGF1ZGlvIHRyYWNrcw0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgaW5zZXJ0QXVkaW9UcmFjayhBdWRpb1RyYWNrIGF1ZGlvVHJhY2ssIFN0cmluZyBhZnRlckF1ZGlvVHJhY2tJZCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBNb3ZlIGFuIEF1ZGlvVHJhY2sgYWZ0ZXIgdGhlIEF1ZGlvVHJhY2sgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gYXVkaW9UcmFja0lkIFRoZSBpZCBvZiB0aGUgQXVkaW9UcmFjayB0byBtb3ZlDQorICAgICAqIEBwYXJhbSBhZnRlckF1ZGlvVHJhY2tJZCBNb3ZlIHRoZSBBdWRpb1RyYWNrIGlkZW50aWZpZWQgYnkgYXVkaW9UcmFja0lkDQorICAgICAqICAgICAgICAgICAgYWZ0ZXIgdGhlIEF1ZGlvVHJhY2sgaWRlbnRpZmllZCBieSB0aGlzIHBhcmFtZXRlci4gSWYgdGhpcw0KKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciBpcyBudWxsIHRoZSBhdWRpbyB0cmFjayBpcyBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mDQorICAgICAqICAgICAgICAgICAgdGhlIHRpbWVsaW5lLg0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIHByZXZpZXcgb3IgYW4gZXhwb3J0IGlzIGluIHByb2dyZXNzDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG9uZSBvZiBtZWRpYSBpdGVtIGlkcyBpcyBpbnZhbGlkDQorICAgICAqICAgICAgICAgICAgIChudWxsIGlzIGEgdmFsaWQgdmFsdWUpDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBtb3ZlQXVkaW9UcmFjayhTdHJpbmcgYXVkaW9UcmFja0lkLCBTdHJpbmcgYWZ0ZXJBdWRpb1RyYWNrSWQpOw0KKw0KKyAgICAvKioNCisgICAgICogUmVtb3ZlIHRoZSBhdWRpbyB0cmFjayB3aXRoIHRoZSBzcGVjaWZpZWQgaWQuIElmIHRoZSBleHRyYWN0aW9uIG9mIHRoZQ0KKyAgICAgKiBhdWRpbyB3YXZlZm9ybSBpcyBpbiBwcm9ncmVzcywgdGhlIGV4dHJhY3Rpb24gaXMgY2FuY2VsZWQgYW5kIHRoZSBmaWxlIGlzDQorICAgICAqIGRlbGV0ZWQuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBhdWRpb1RyYWNrSWQgVGhlIGlkIG9mIHRoZSBhdWRpbyB0cmFjayB0byBiZSByZW1vdmVkDQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIGF1ZGlvIHRyYWNrIHRoYXQgd2FzIHJlbW92ZWQNCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBwcmV2aWV3IG9yIGFuIGV4cG9ydCBpcyBpbiBwcm9ncmVzcw0KKyAgICAgKi8NCisgICAgcHVibGljIEF1ZGlvVHJhY2sgcmVtb3ZlQXVkaW9UcmFjayhTdHJpbmcgYXVkaW9UcmFja0lkKTsNCisNCisgICAgLyoqDQorICAgICAqIEdldCB0aGUgbGlzdCBvZiBBdWRpb1RyYWNrcyBpbiBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUgc3Rvcnlib2FyZC4NCisgICAgICoNCisgICAgICogTm90ZSB0aGF0IGlmIGFueSBBdWRpb1RyYWNrIHNvdXJjZSBmaWxlcyBhcmUgbm90IGFjY2Vzc2libGUgYW55bW9yZSwNCisgICAgICogdGhpcyBtZXRob2Qgd2lsbCBzdGlsbCBwcm92aWRlIHRoZSBmdWxsIGxpc3Qgb2YgYXVkaW8gdHJhY2tzLg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEF1ZGlvVHJhY2tzLiBJZiBubyBhdWRpbyB0cmFja3MgZXhpc3QgYW4gZW1wdHkgbGlzdA0KKyAgICAgKiAgd2lsbCBiZSByZXR1cm5lZC4NCisgICAgICovDQorICAgIHB1YmxpYyBMaXN0PEF1ZGlvVHJhY2s+IGdldEFsbEF1ZGlvVHJhY2tzKCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBGaW5kIHRoZSBBdWRpb1RyYWNrIHdpdGggdGhlIHNwZWNpZmllZCBpZA0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gYXVkaW9UcmFja0lkIFRoZSBBdWRpb1RyYWNrIGlkDQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIEF1ZGlvVHJhY2sgd2l0aCB0aGUgc3BlY2lmaWVkIGlkIChudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0KQ0KKyAgICAgKi8NCisgICAgcHVibGljIEF1ZGlvVHJhY2sgZ2V0QXVkaW9UcmFjayhTdHJpbmcgYXVkaW9UcmFja0lkKTsNCisNCisgICAgLyoqDQorICAgICAqIFNldCB0aGUgYXNwZWN0IHJhdGlvIHVzZWQgaW4gdGhlIHByZXZpZXcgYW5kIHRoZSBleHBvcnQgbW92aWUuDQorICAgICAqDQorICAgICAqIFRoZSBkZWZhdWx0IGFzcGVjdCByYXRpbyBpcyBBU1BFQ1RSQVRJT18xNl85ICgxNjo5KS4NCisgICAgICoNCisgICAgICogQHBhcmFtIGFzcGVjdFJhdGlvIHRvIGFwcGx5LiBJZiBhc3BlY3RSYXRpbyBpcyB0aGUgc2FtZSBhcyB0aGUgY3VycmVudA0KKyAgICAgKiAgICAgICAgICAgIGFzcGVjdCByYXRpbywgdGhlbiB0aGlzIGZ1bmN0aW9uIGp1c3QgcmV0dXJucy4gVGhlIHN1cHBvcnRlZA0KKyAgICAgKiAgICAgICAgICAgIGFzcGVjdCByYXRpbyBhcmUgZGVmaW5lZCBpbiB0aGUgTWVkaWFQcm9wZXJ0aWVzIGNsYXNzIGZvcg0KKyAgICAgKiAgICAgICAgICAgIGV4YW1wbGU6IEFTUEVDVFJBVElPXzE2XzkNCisgICAgICoNCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBwcmV2aWV3IG9yIGFuIGV4cG9ydCBpcyBpbiBwcm9ncmVzcw0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhc3BlY3QgcmF0aW8gaXMgbm90IHN1cHBvcnRlZA0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0QXNwZWN0UmF0aW8oaW50IGFzcGVjdFJhdGlvKTsNCisNCisgICAgLyoqDQorICAgICAqIEdldCBjdXJyZW50IGFzcGVjdCByYXRpby4NCisgICAgICoNCisgICAgICogQHJldHVybiBUaGUgYXNwZWN0IHJhdGlvIGFzIGRlc2NyaWJlZCBpbiBNZWRpYVByb3BlcnRpZXMNCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0QXNwZWN0UmF0aW8oKTsNCisNCisgICAgLyoqDQorICAgICAqIEdldCB0aGUgcHJldmlldyAoYW5kIG91dHB1dCBtb3ZpZSkgZHVyYXRpb24uDQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIGR1cmF0aW9uIG9mIHRoZSBwcmV2aWV3IChhbmQgb3V0cHV0IG1vdmllKQ0KKyAgICAgKi8NCisgICAgcHVibGljIGxvbmcgZ2V0RHVyYXRpb24oKTsNCisNCisgICAgLyoqDQorICAgICAqIFJlbmRlciBhIGZyYW1lIGFjY29yZGluZyB0byB0aGUgcHJldmlldyBhc3BlY3QgcmF0aW8gYW5kIGFjdGl2YXRpbmcgYWxsDQorICAgICAqIHN0b3J5Ym9hcmQgaXRlbXMgcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCB0aW1lLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gc3VyZmFjZUhvbGRlciBTdXJmYWNlSG9sZGVyIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uDQorICAgICAqIEBwYXJhbSB0aW1lTXMgdGltZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBmcmFtZSB0byBkaXNwbGF5DQorICAgICAqDQorICAgICAqIEByZXR1cm4gVGhlIGFjY3VyYXRlIHRpbWUgc3RhbXAgb2YgdGhlIGZyYW1lIHRoYXQgaXMgcmVuZGVyZWQNCisgICAgICogLg0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIHByZXZpZXcgb3IgYW4gZXhwb3J0IGlzIGFscmVhZHkNCisgICAgICogICAgICAgICAgICAgaW4gcHJvZ3Jlc3MNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGltZSBpcyBuZWdhdGl2ZSBvciBiZXlvbmQgdGhlDQorICAgICAqICAgICAgICAgICAgIHByZXZpZXcgZHVyYXRpb24NCisgICAgICovDQorICAgIHB1YmxpYyBsb25nIHJlbmRlclByZXZpZXdGcmFtZShTdXJmYWNlSG9sZGVyIHN1cmZhY2VIb2xkZXIsIGxvbmcgdGltZU1zKTsNCisNCisgICAgLyoqDQorICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBhc3BlY3QgcmF0aW8gb2YgdGhlIHByb2plY3QgY2hhbmdlcw0KKyAgICAgKiBhbmQgYmVmb3JlIHN0YXJ0UHJldmlldyBpcyBjYWxsZWQuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBtYXkgYmxvY2sgZm9yDQorICAgICAqIGFuIGV4dGVuc2l2ZSBwZXJpb2Qgb2YgdGltZS4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlUHJldmlldygpOw0KKw0KKyAgICAvKioNCisgICAgICogU3RhcnQgdGhlIHByZXZpZXcgb2YgYWxsIHRoZSBzdG9yeWJvYXJkIGl0ZW1zIGFwcGxpZWQgb24gYWxsIE1lZGlhSXRlbXMNCisgICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgYmxvY2sgKGRvZXMgbm90IHdhaXQgZm9yIHRoZSBwcmV2aWV3IHRvIGNvbXBsZXRlKS4NCisgICAgICogVGhlIFByZXZpZXdQcm9ncmVzc0xpc3RlbmVyIGFsbG93cyB0byB0cmFjayB0aGUgcHJvZ3Jlc3MgYXQgdGhlIHRpbWUNCisgICAgICogaW50ZXJ2YWwgZGV0ZXJtaW5lZCBieSB0aGUgY2FsbGJhY2tBZnRlckZyYW1lQ291bnQgcGFyYW1ldGVyLiBUaGUNCisgICAgICogU3VyZmFjZUhvbGRlciBoYXMgdG8gYmUgY3JlYXRlZCBhbmQgcmVhZHkgZm9yIHVzZSBiZWZvcmUgY2FsbGluZyB0aGlzDQorICAgICAqIG1ldGhvZC4gVGhlIG1ldGhvZCBpcyBhIG5vLW9wIGlmIHRoZXJlIGFyZSBubyBNZWRpYUl0ZW1zIGluIHRoZQ0KKyAgICAgKiBzdG9yeWJvYXJkLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gc3VyZmFjZUhvbGRlciBTdXJmYWNlSG9sZGVyIHdoZXJlIHRoZSBwcmV2aWV3IGlzIHJlbmRlcmVkLg0KKyAgICAgKiBAcGFyYW0gZnJvbU1zIFRoZSB0aW1lIChyZWxhdGl2ZSB0byB0aGUgdGltZWxpbmUpIGF0IHdoaWNoIHRoZSBwcmV2aWV3DQorICAgICAqICAgICAgICAgICAgd2lsbCBzdGFydA0KKyAgICAgKiBAcGFyYW0gdG9NcyBUaGUgdGltZSAocmVsYXRpdmUgdG8gdGhlIHRpbWVsaW5lKSBhdCB3aGljaCB0aGUgcHJldmlldyB3aWxsDQorICAgICAqICAgICAgICAgICAgc3RvcC4gVXNlIC0xIHRvIHBsYXkgdG8gdGhlIGVuZCBvZiB0aGUgdGltZWxpbmUNCisgICAgICogQHBhcmFtIGxvb3AgdHJ1ZSBpZiB0aGUgcHJldmlldyBzaG91bGQgYmUgbG9vcGVkIG9uY2UgaXQgcmVhY2hlcyB0aGUgZW5kDQorICAgICAqIEBwYXJhbSBjYWxsYmFja0FmdGVyRnJhbWVDb3VudCBUaGUgbGlzdGVuZXIgaW50ZXJmYWNlIHNob3VsZCBiZSBpbnZva2VkDQorICAgICAqICAgICAgICAgICAgYWZ0ZXIgdGhlIG51bWJlciBvZiBmcmFtZXMgc3BlY2lmaWVkIGJ5IHRoaXMgcGFyYW1ldGVyLg0KKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHdoaWNoIHdpbGwgYmUgbm90aWZpZWQgb2YgdGhlIHByZXZpZXcNCisgICAgICogICAgICAgICAgICBwcm9ncmVzcw0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBmcm9tTXMgaXMgYmV5b25kIHRoZSBwcmV2aWV3IGR1cmF0aW9uDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGEgcHJldmlldyBvciBhbiBleHBvcnQgaXMgYWxyZWFkeSBpbg0KKyAgICAgKiAgICAgICAgICAgICBwcm9ncmVzcw0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc3RhcnRQcmV2aWV3KFN1cmZhY2VIb2xkZXIgc3VyZmFjZUhvbGRlciwgbG9uZyBmcm9tTXMsIGxvbmcgdG9NcywgYm9vbGVhbiBsb29wLA0KKyAgICAgICAgICAgIGludCBjYWxsYmFja0FmdGVyRnJhbWVDb3VudCwgUHJldmlld1Byb2dyZXNzTGlzdGVuZXIgbGlzdGVuZXIpOw0KKw0KKyAgICAvKioNCisgICAgICogU3RvcCB0aGUgY3VycmVudCBwcmV2aWV3LiBUaGlzIG1ldGhvZCBibG9ja3MgdW50aWwgb25nb2luZyBwcmV2aWV3IGlzDQorICAgICAqIHN0b3BwZWQuIElnbm9yZWQgaWYgdGhlcmUgaXMgbm8gcHJldmlldyBydW5uaW5nLg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIFRoZSBhY2N1cmF0ZSBjdXJyZW50IHRpbWUgd2hlbiBzdG9wIGlzIGVmZmVjdGl2ZSBleHByZXNzZWQgaW4NCisgICAgICogICAgICAgICAgbWlsbGlzZWNvbmRzDQorICAgICAqLw0KKyAgICBwdWJsaWMgbG9uZyBzdG9wUHJldmlldygpOw0KK30NCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVmlkZW9FZGl0b3JGYWN0b3J5LmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvdmlkZW9lZGl0b3IvVmlkZW9FZGl0b3JGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGEzNzdlMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9WaWRlb0VkaXRvckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS52aWRlb2VkaXRvcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CisKKworLyoqCisgKiBUaGUgVmlkZW9FZGl0b3JGYWN0b3J5IGNsYXNzIG11c3QgYmUgdXNlZCB0byBpbnN0YW50aWF0ZSBWaWRlb0VkaXRvciBvYmplY3RzCisgKiBieSBjcmVhdGluZyBhIG5ldyBwcm9qZWN0IHtAbGluayAjY3JlYXRlKFN0cmluZyl9IG9yIGJ5IGxvYWRpbmcgYW4KKyAqIGV4aXN0aW5nIHByb2plY3Qge0BsaW5rICNsb2FkKFN0cmluZyl9LgorICoge0BoaWRlfQorICovCitwdWJsaWMgY2xhc3MgVmlkZW9FZGl0b3JGYWN0b3J5IHsKKyAgICAvLyBWaWRlb0VkaXRvciBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DTEFTU19JTVBMRU1FTlRBVElPTgorICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS52aWRlb2VkaXRvci5WaWRlb0VkaXRvclRlc3RJbXBsIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NMQVNTX0lNUExFTUVOVEFUSU9OCisgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLnZpZGVvZWRpdG9yLlZpZGVvRWRpdG9ySW1wbCI7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBmYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBuZXcgVmlkZW9FZGl0b3IgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdFBhdGggVGhlIHBhdGggd2hlcmUgYWxsIFZpZGVvRWRpdG9yIGludGVybmFsCisgICAgICogICAgICAgICAgICBmaWxlcyBhcmUgc3RvcmVkLiBXaGVuIGEgcHJvamVjdCBpcyBkZWxldGVkIHRoZSBhcHBsaWNhdGlvbiBpcworICAgICAqICAgICAgICAgICAgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSBwYXRoIGFuZCBpdHMgY29udGVudHMuCisgICAgICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgaW1wbGVtZW50YXRpb24gY2xhc3MgbmFtZQorICAgICAqCisgICAgICogQHJldHVybiBUaGUgVmlkZW9FZGl0b3IgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgcGF0aCBkb2VzIG5vdCBleGlzdCBvciBpZiB0aGUgcGF0aCBjYW4KKyAgICAgKiAgICAgICAgICAgICBub3QgYmUgYWNjZXNzZWQgaW4gcmVhZC93cml0ZSBtb2RlCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBwcmV2aW91cyBWaWRlb0VkaXRvciBpbnN0YW5jZSBoYXMgbm90CisgICAgICogICAgICAgICAgICAgYmVlbiByZWxlYXNlZAorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLAorICAgICAqICAgICAgICAgICAgIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCisgICAgICogICAgICAgICAgICAgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgY2Fubm90CisgICAgICogICAgICAgICAgICAgYmUgaW5zdGFudGlhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVmlkZW9FZGl0b3IgY3JlYXRlKFN0cmluZyBwcm9qZWN0UGF0aCwgU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAorICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIC8vIElmIHRoZSBwcm9qZWN0IHBhdGggZG9lcyBub3QgZXhpc3QgY3JlYXRlIGl0CisgICAgICAgIGZpbmFsIEZpbGUgZGlyID0gbmV3IEZpbGUocHJvamVjdFBhdGgpOworICAgICAgICBpZiAoIWRpci5leGlzdHMoKSkgeworICAgICAgICAgICAgaWYgKCFkaXIubWtkaXJzKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIHByb2plY3QgcGF0aDogIiArIHByb2plY3RQYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIENsYXNzPD8+IGNscyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz4gcGFydHlwZXNbXSA9IG5ldyBDbGFzc1sxXTsKKyAgICAgICAgcGFydHlwZXNbMF0gPSBTdHJpbmcuY2xhc3M7CisgICAgICAgIGZpbmFsIENvbnN0cnVjdG9yPD8+IGN0ID0gY2xzLmdldENvbnN0cnVjdG9yKHBhcnR5cGVzKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IGFyZ2xpc3RbXSA9IG5ldyBPYmplY3RbMV07CisgICAgICAgIGFyZ2xpc3RbMF0gPSBwcm9qZWN0UGF0aDsKKworICAgICAgICByZXR1cm4gKFZpZGVvRWRpdG9yKWN0Lm5ld0luc3RhbmNlKGFyZ2xpc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgbWV0aG9kIGZvciBpbnN0YW50aWF0aW5nIGEgVmlkZW9FZGl0b3IgZnJvbSB0aGUKKyAgICAgKiBpbnRlcm5hbCBzdGF0ZSBwcmV2aW91c2x5IHNhdmVkIHdpdGggdGhlCisgICAgICoge0BsaW5rIFZpZGVvRWRpdG9yI3NhdmUoU3RyaW5nKX0gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHByb2plY3RQYXRoIFRoZSBwYXRoIHdoZXJlIGFsbCBWaWRlb0VkaXRvciBpbnRlcm5hbCBmaWxlcworICAgICAqICAgICAgICAgICAgYXJlIHN0b3JlZC4gV2hlbiBhIHByb2plY3QgaXMgZGVsZXRlZCB0aGUgYXBwbGljYXRpb24gaXMKKyAgICAgKiAgICAgICAgICAgIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgcGF0aCBhbmQgaXRzIGNvbnRlbnRzLgorICAgICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIG5hbWUKKyAgICAgKiBAcGFyYW0gZ2VuZXJhdGVQcmV2aWV3IGlmIHNldCB0byB0cnVlIHRoZQorICAgICAqICAgICAge0BsaW5rIE1lZGlhRWRpdG9yI2dlbmVyYXRlUHJldmlldygpfSB3aWxsIGJlIGNhbGxlZCBpbnRlcm5hbGx5IHRvCisgICAgICogICAgICBnZW5lcmF0ZSBhbnkgbmVlZGVkIHRyYW5zaXRpb25zLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgVmlkZW9FZGl0b3IgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgcGF0aCBkb2VzIG5vdCBleGlzdCBvciBpZiB0aGUgcGF0aCBjYW4KKyAgICAgKiAgICAgICAgICAgICBub3QgYmUgYWNjZXNzZWQgaW4gcmVhZC93cml0ZSBtb2RlIG9yIGlmIG9uZSBvZiB0aGUgcmVzb3VyY2UKKyAgICAgKiAgICAgICAgICAgICBtZWRpYSBmaWxlcyBjYW5ub3QgYmUgcmV0cmlldmVkCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBwcmV2aW91cyBWaWRlb0VkaXRvciBpbnN0YW5jZSBoYXMgbm90CisgICAgICogICAgICAgICAgICAgYmVlbiByZWxlYXNlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVmlkZW9FZGl0b3IgbG9hZChTdHJpbmcgcHJvamVjdFBhdGgsIFN0cmluZyBjbGFzc05hbWUsIGJvb2xlYW4gZ2VuZXJhdGVQcmV2aWV3KQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sCisgICAgICAgICAgICBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz4gY2xzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOworICAgICAgICBmaW5hbCBDbGFzczw/PiBwYXJ0eXBlc1tdID0gbmV3IENsYXNzWzFdOworICAgICAgICBwYXJ0eXBlc1swXSA9IFN0cmluZy5jbGFzczsKKyAgICAgICAgZmluYWwgQ29uc3RydWN0b3I8Pz4gY3QgPSBjbHMuZ2V0Q29uc3RydWN0b3IocGFydHlwZXMpOworICAgICAgICBmaW5hbCBPYmplY3QgYXJnbGlzdFtdID0gbmV3IE9iamVjdFsxXTsKKyAgICAgICAgYXJnbGlzdFswXSA9IHByb2plY3RQYXRoOworCisgICAgICAgIGZpbmFsIFZpZGVvRWRpdG9yIHZpZGVvRWRpdG9yID0gKFZpZGVvRWRpdG9yKWN0Lm5ld0luc3RhbmNlKGFyZ2xpc3QpOworICAgICAgICBpZiAoZ2VuZXJhdGVQcmV2aWV3KSB7CisgICAgICAgICAgICB2aWRlb0VkaXRvci5nZW5lcmF0ZVByZXZpZXcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmlkZW9FZGl0b3I7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL3ZpZGVvZWRpdG9yL1ZpZGVvRWRpdG9yVGVzdEltcGwuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9WaWRlb0VkaXRvclRlc3RJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNjYjgyYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS92aWRlb2VkaXRvci9WaWRlb0VkaXRvclRlc3RJbXBsLmphdmEKQEAgLTAsMCArMSwxMjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnZpZGVvZWRpdG9yOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sU2VyaWFsaXplcjsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CisKKy8qKgorICogVGhlIFZpZGVvRWRpdG9yIGltcGxlbWVudGF0aW9uIHtAaGlkZX0KKyAqLworcHVibGljIGNsYXNzIFZpZGVvRWRpdG9yVGVzdEltcGwgaW1wbGVtZW50cyBWaWRlb0VkaXRvciB7CisgICAgLy8gTG9nZ2luZworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlkZW9FZGl0b3JJbXBsIjsKKworICAgIC8vIFRoZSBwcm9qZWN0IGZpbGVuYW1lCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfRklMRU5BTUUgPSAidmlkZW9lZGl0b3IueG1sIjsKKworICAgIC8vIFhNTCB0YWdzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QUk9KRUNUID0gInByb2plY3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTUVESUFfSVRFTVMgPSAibWVkaWFfaXRlbXMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTUVESUFfSVRFTSA9ICJtZWRpYV9pdGVtIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1RSQU5TSVRJT05TID0gInRyYW5zaXRpb25zIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1RSQU5TSVRJT04gPSAidHJhbnNpdGlvbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19PVkVSTEFZUyA9ICJvdmVybGF5cyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19PVkVSTEFZID0gIm92ZXJsYXkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfT1ZFUkxBWV9VU0VSX0FUVFJJQlVURVMgPSAib3ZlcmxheV91c2VyX2F0dHJpYnV0ZXMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRUZGRUNUUyA9ICJlZmZlY3RzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0VGRkVDVCA9ICJlZmZlY3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVVESU9fVFJBQ0tTID0gImF1ZGlvX3RyYWNrcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVURJT19UUkFDSyA9ICJhdWRpb190cmFjayI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JRCA9ICJpZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRklMRU5BTUUgPSAiZmlsZW5hbWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FVRElPX1dBVkVGT1JNX0ZJTEVOQU1FID0gIndhdmVmb2VtIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9SRU5ERVJJTkdfTU9ERSA9ICJyZW5kZXJpbmdfbW9kZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQVNQRUNUX1JBVElPID0gImFzcGVjdF9yYXRpbyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVFlQRSA9ICJ0eXBlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9EVVJBVElPTiA9ICJkdXJhdGlvbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1RBUlRfVElNRSA9ICJzdGFydF90aW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9CRUdJTl9USU1FID0gImJlZ2luX3RpbWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0VORF9USU1FID0gImVuZF90aW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WT0xVTUUgPSAidm9sdW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9CRUhBVklPUiA9ICJiZWhhdmlvciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRElSRUNUSU9OID0gImRpcmVjdGlvbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQkxFTkRJTkcgPSAiYmxlbmRpbmciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lOVkVSVCA9ICJpbnZlcnQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX01BU0sgPSAibWFzayI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQkVGT1JFX01FRElBX0lURU1fSUQgPSAiYmVmb3JlX21lZGlhX2l0ZW0iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FGVEVSX01FRElBX0lURU1fSUQgPSAiYWZ0ZXJfbWVkaWFfaXRlbSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ09MT1JfRUZGRUNUX1RZUEUgPSAiY29sb3JfdHlwZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ09MT1JfRUZGRUNUX1ZBTFVFID0gImNvbG9yX3ZhbHVlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVEFSVF9SRUNUX0wgPSAic3RhcnRfbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1RBUlRfUkVDVF9UID0gInN0YXJ0X3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NUQVJUX1JFQ1RfUiA9ICJzdGFydF9yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVEFSVF9SRUNUX0IgPSAic3RhcnRfYiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRU5EX1JFQ1RfTCA9ICJlbmRfbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRU5EX1JFQ1RfVCA9ICJlbmRfdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRU5EX1JFQ1RfUiA9ICJlbmRfciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRU5EX1JFQ1RfQiA9ICJlbmRfYiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTE9PUCA9ICJsb29wIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NVVRFRCA9ICJtdXRlZCI7CisKKyAgICAvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKyAgICBwcml2YXRlIGxvbmcgbUR1cmF0aW9uTXM7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVByb2plY3RQYXRoOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxNZWRpYUl0ZW0+IG1NZWRpYUl0ZW1zID0gbmV3IEFycmF5TGlzdDxNZWRpYUl0ZW0+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEF1ZGlvVHJhY2s+IG1BdWRpb1RyYWNrcyA9IG5ldyBBcnJheUxpc3Q8QXVkaW9UcmFjaz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8VHJhbnNpdGlvbj4gbVRyYW5zaXRpb25zID0gbmV3IEFycmF5TGlzdDxUcmFuc2l0aW9uPigpOworICAgIHByaXZhdGUgUHJldmlld1RocmVhZCBtUHJldmlld1RocmVhZDsKKyAgICBwcml2YXRlIGludCBtQXNwZWN0UmF0aW87CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJldmlldyB0aHJlYWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFByZXZpZXdUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICAvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBGUkFNRV9EVVJBVElPTiA9IDMzOworCisgICAgICAgIC8vIEluc3RhbmNlIHZhcmlhYmxlcworICAgICAgICBwcml2YXRlIGZpbmFsIFByZXZpZXdQcm9ncmVzc0xpc3RlbmVyIG1MaXN0ZW5lcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUNhbGxiYWNrQWZ0ZXJGcmFtZUNvdW50OworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgbUZyb21NcywgbVRvTXM7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtUnVuLCBtTG9vcDsKKyAgICAgICAgcHJpdmF0ZSBsb25nIG1Qb3NpdGlvbk1zOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZnJvbU1zIFN0YXJ0IHByZXZpZXcgYXQgdGhpcyBwb3NpdGlvbgorICAgICAgICAgKiBAcGFyYW0gdG9NcyBUaGUgdGltZSAocmVsYXRpdmUgdG8gdGhlIHRpbWVsaW5lKSBhdCB3aGljaCB0aGUgcHJldmlldworICAgICAgICAgKiAgICAgICAgICAgIHdpbGwgc3RvcC4gVXNlIC0xIHRvIHBsYXkgdG8gdGhlIGVuZCBvZiB0aGUgdGltZWxpbmUKKyAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrQWZ0ZXJGcmFtZUNvdW50IFRoZSBsaXN0ZW5lciBpbnRlcmZhY2Ugc2hvdWxkIGJlCisgICAgICAgICAqICAgICAgICAgICAgaW52b2tlZCBhZnRlciB0aGUgbnVtYmVyIG9mIGZyYW1lcyBzcGVjaWZpZWQgYnkgdGhpcworICAgICAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlci4KKyAgICAgICAgICogQHBhcmFtIGxvb3AgdHJ1ZSBpZiB0aGUgcHJldmlldyBzaG91bGQgYmUgbG9vcGVkIG9uY2UgaXQgcmVhY2hlcyB0aGUKKyAgICAgICAgICogICAgICAgICAgICBlbmQKKyAgICAgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFByZXZpZXdUaHJlYWQobG9uZyBmcm9tTXMsIGxvbmcgdG9NcywgYm9vbGVhbiBsb29wLCBpbnQgY2FsbGJhY2tBZnRlckZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgUHJldmlld1Byb2dyZXNzTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIG1Qb3NpdGlvbk1zID0gbUZyb21NcyA9IGZyb21NczsKKyAgICAgICAgICAgIGlmICh0b01zIDwgMCkgeworICAgICAgICAgICAgICAgIG1Ub01zID0gbUR1cmF0aW9uTXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Ub01zID0gdG9NczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Mb29wID0gbG9vcDsKKyAgICAgICAgICAgIG1DYWxsYmFja0FmdGVyRnJhbWVDb3VudCA9IGNhbGxiYWNrQWZ0ZXJGcmFtZUNvdW50OworICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICBtUnVuID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiPT09PiBQcmV2aWV3VGhyZWFkLnJ1biBlbnRlciIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgPSAwOworICAgICAgICAgICAgd2hpbGUgKG1SdW4pIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzbGVlcChGUkFNRV9EVVJBVElPTik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQrKzsKKyAgICAgICAgICAgICAgICBtUG9zaXRpb25NcyArPSBGUkFNRV9EVVJBVElPTjsKKworICAgICAgICAgICAgICAgIGlmIChtUG9zaXRpb25NcyA+PSBtVG9NcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW1Mb29wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25Qcm9ncmVzcyhWaWRlb0VkaXRvclRlc3RJbXBsLnRoaXMsIG1Qb3NpdGlvbk1zLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJQcmV2aWV3VGhyZWFkLnJ1biBwbGF5YmFjayBjb21wbGV0ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJlIGEgbm90aWZpY2F0aW9uIGZvciB0aGUgZW5kIG9mIHRoZSBjbGlwCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25Qcm9ncmVzcyhWaWRlb0VkaXRvclRlc3RJbXBsLnRoaXMsIG1Ub01zLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJld2luZAorICAgICAgICAgICAgICAgICAgICAgICAgbVBvc2l0aW9uTXMgPSBtRnJvbU1zOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uUHJvZ3Jlc3MoVmlkZW9FZGl0b3JUZXN0SW1wbC50aGlzLCBtUG9zaXRpb25NcywgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlByZXZpZXdUaHJlYWQucnVuIHBsYXliYWNrIGNvbXBsZXRlIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZUNvdW50ID09IG1DYWxsYmFja0FmdGVyRnJhbWVDb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uUHJvZ3Jlc3MoVmlkZW9FZGl0b3JUZXN0SW1wbC50aGlzLCBtUG9zaXRpb25NcywgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICI9PT0+IFByZXZpZXdUaHJlYWQucnVuIGV4aXQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdG9wIHRoZSBwcmV2aWV3CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIHN0b3AgcG9zaXRpb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBsb25nIHN0b3BQcmV2aWV3KCkgeworICAgICAgICAgICAgbVJ1biA9IGZhbHNlOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBqb2luKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1Qb3NpdGlvbk1zOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdFBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgVmlkZW9FZGl0b3JUZXN0SW1wbChTdHJpbmcgcHJvamVjdFBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG1Qcm9qZWN0UGF0aCA9IHByb2plY3RQYXRoOworICAgICAgICBmaW5hbCBGaWxlIHByb2plY3RYbWwgPSBuZXcgRmlsZShwcm9qZWN0UGF0aCwgUFJPSkVDVF9GSUxFTkFNRSk7CisgICAgICAgIGlmIChwcm9qZWN0WG1sLmV4aXN0cygpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvYWQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQXNwZWN0UmF0aW8gPSBNZWRpYVByb3BlcnRpZXMuQVNQRUNUX1JBVElPXzE2Xzk7CisgICAgICAgICAgICBtRHVyYXRpb25NcyA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiBtUHJvamVjdFBhdGg7CisgICAgfQorCisgICAgLyoKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZE1lZGlhSXRlbShNZWRpYUl0ZW0gbWVkaWFJdGVtKSB7CisgICAgICAgIGlmIChtUHJldmlld1RocmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcmV2aWV3aW5nIGlzIGluIHByb2dyZXNzIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobU1lZGlhSXRlbXMuY29udGFpbnMobWVkaWFJdGVtKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWVkaWEgaXRlbSBhbHJlYWR5IGV4aXN0czogIiArIG1lZGlhSXRlbS5nZXRJZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEludmFsaWRhdGUgdGhlIGVuZCB0cmFuc2l0aW9uIGlmIG5lY2Vzc2FyeQorICAgICAgICBmaW5hbCBpbnQgbWVkaWFJdGVtc0NvdW50ID0gbU1lZGlhSXRlbXMuc2l6ZSgpOworICAgICAgICBpZiAoIG1lZGlhSXRlbXNDb3VudCA+IDApIHsKKyAgICAgICAgICAgIHJlbW92ZVRyYW5zaXRpb25BZnRlcihtZWRpYUl0ZW1zQ291bnQgLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCB0aGUgbmV3IG1lZGlhIGl0ZW0KKyAgICAgICAgbU1lZGlhSXRlbXMuYWRkKG1lZGlhSXRlbSk7CisKKyAgICAgICAgY29tcHV0ZVRpbWVsaW5lRHVyYXRpb24oKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5zZXJ0TWVkaWFJdGVtKE1lZGlhSXRlbSBtZWRpYUl0ZW0sIFN0cmluZyBhZnRlck1lZGlhSXRlbUlkKSB7CisgICAgICAgIGlmIChtUHJldmlld1RocmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcmV2aWV3aW5nIGlzIGluIHByb2dyZXNzIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobU1lZGlhSXRlbXMuY29udGFpbnMobWVkaWFJdGVtKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWVkaWEgaXRlbSBhbHJlYWR5IGV4aXN0czogIiArIG1lZGlhSXRlbS5nZXRJZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhZnRlck1lZGlhSXRlbUlkID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtTWVkaWFJdGVtcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSB0aGUgdHJhbnNpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0aW1lbGluZQorICAgICAgICAgICAgICAgIHJlbW92ZVRyYW5zaXRpb25CZWZvcmUoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWVkaWFJdGVtcy5hZGQoMCwgbWVkaWFJdGVtKTsKKyAgICAgICAgICAgIGNvbXB1dGVUaW1lbGluZUR1cmF0aW9uKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbWVkaWFJdGVtQ291bnQgPSBtTWVkaWFJdGVtcy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lZGlhSXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYUl0ZW0gbWkgPSBtTWVkaWFJdGVtcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKG1pLmdldElkKCkuZXF1YWxzKGFmdGVyTWVkaWFJdGVtSWQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEludmFsaWRhdGUgdGhlIHRyYW5zaXRpb24gYXQgdGhpcyBwb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICByZW1vdmVUcmFuc2l0aW9uQWZ0ZXIoaSk7CisgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbmV3IG1lZGlhIGl0ZW0KKyAgICAgICAgICAgICAgICAgICAgbU1lZGlhSXRlbXMuYWRkKGkgKyAxLCBtZWRpYUl0ZW0pOworICAgICAgICAgICAgICAgICAgICBjb21wdXRlVGltZWxpbmVEdXJhdGlvbigpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWVkaWFJdGVtIG5vdCBmb3VuZDogIiArIGFmdGVyTWVkaWFJdGVtSWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1vdmVNZWRpYUl0ZW0oU3RyaW5nIG1lZGlhSXRlbUlkLCBTdHJpbmcgYWZ0ZXJNZWRpYUl0ZW1JZCkgeworICAgICAgICBpZiAobVByZXZpZXdUaHJlYWQgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUHJldmlld2luZyBpcyBpbiBwcm9ncmVzcyIpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTWVkaWFJdGVtIG1vdmVNZWRpYUl0ZW0gPSByZW1vdmVNZWRpYUl0ZW0obWVkaWFJdGVtSWQpOworICAgICAgICBpZiAobW92ZU1lZGlhSXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUYXJnZXQgTWVkaWFJdGVtIG5vdCBmb3VuZDogIiArIG1lZGlhSXRlbUlkKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhZnRlck1lZGlhSXRlbUlkID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtTWVkaWFJdGVtcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSBhZGphY2VudCB0cmFuc2l0aW9ucyBhdCB0aGUgaW5zZXJ0aW9uIHBvaW50CisgICAgICAgICAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkJlZm9yZSgwKTsKKworICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbWVkaWEgaXRlbSBhdCB0aGUgbmV3IHBvc2l0aW9uCisgICAgICAgICAgICAgICAgbU1lZGlhSXRlbXMuYWRkKDAsIG1vdmVNZWRpYUl0ZW0pOworICAgICAgICAgICAgICAgIGNvbXB1dGVUaW1lbGluZUR1cmF0aW9uKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBtb3ZlIG1lZGlhIGl0ZW0gKGl0IGlzIHRoZSBvbmx5IGl0ZW0pIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbWVkaWFJdGVtQ291bnQgPSBtTWVkaWFJdGVtcy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lZGlhSXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYUl0ZW0gbWkgPSBtTWVkaWFJdGVtcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKG1pLmdldElkKCkuZXF1YWxzKGFmdGVyTWVkaWFJdGVtSWQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEludmFsaWRhdGUgYWRqYWNlbnQgdHJhbnNpdGlvbnMgYXQgdGhlIGluc2VydGlvbiBwb2ludAorICAgICAgICAgICAgICAgICAgICByZW1vdmVUcmFuc2l0aW9uQWZ0ZXIoaSk7CisgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbWVkaWEgaXRlbSBhdCB0aGUgbmV3IHBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgIG1NZWRpYUl0ZW1zLmFkZChpICsgMSwgbW92ZU1lZGlhSXRlbSk7CisgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVUaW1lbGluZUR1cmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1lZGlhSXRlbSBub3QgZm91bmQ6ICIgKyBhZnRlck1lZGlhSXRlbUlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTWVkaWFJdGVtIHJlbW92ZU1lZGlhSXRlbShTdHJpbmcgbWVkaWFJdGVtSWQpIHsKKyAgICAgICAgaWYgKG1QcmV2aWV3VGhyZWFkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByZXZpZXdpbmcgaXMgaW4gcHJvZ3Jlc3MiKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIE1lZGlhSXRlbSBtZWRpYUl0ZW0gPSBnZXRNZWRpYUl0ZW0obWVkaWFJdGVtSWQpOworICAgICAgICBpZiAobWVkaWFJdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgbWVkaWEgaXRlbQorICAgICAgICAgICAgbU1lZGlhSXRlbXMucmVtb3ZlKG1lZGlhSXRlbSk7CisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGFkamFjZW50IHRyYW5zaXRpb25zCisgICAgICAgICAgICByZW1vdmVBZGphY2VudFRyYW5zaXRpb25zKG1lZGlhSXRlbSk7CisgICAgICAgICAgICBjb21wdXRlVGltZWxpbmVEdXJhdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1lZGlhSXRlbTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIE1lZGlhSXRlbSBnZXRNZWRpYUl0ZW0oU3RyaW5nIG1lZGlhSXRlbUlkKSB7CisgICAgICAgIGZvciAoTWVkaWFJdGVtIG1lZGlhSXRlbSA6IG1NZWRpYUl0ZW1zKSB7CisgICAgICAgICAgICBpZiAobWVkaWFJdGVtLmdldElkKCkuZXF1YWxzKG1lZGlhSXRlbUlkKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtZWRpYUl0ZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8TWVkaWFJdGVtPiBnZXRBbGxNZWRpYUl0ZW1zKCkgeworICAgICAgICByZXR1cm4gbU1lZGlhSXRlbXM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUFsbE1lZGlhSXRlbXMoKSB7CisgICAgICAgIG1NZWRpYUl0ZW1zLmNsZWFyKCk7CisKKyAgICAgICAgLy8gSW52YWxpZGF0ZSBhbGwgdHJhbnNpdGlvbnMKKyAgICAgICAgZm9yIChUcmFuc2l0aW9uIHRyYW5zaXRpb24gOiBtVHJhbnNpdGlvbnMpIHsKKyAgICAgICAgICAgIHRyYW5zaXRpb24uaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgICAgIG1UcmFuc2l0aW9ucy5jbGVhcigpOworCisgICAgICAgIG1EdXJhdGlvbk1zID0gMDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkVHJhbnNpdGlvbihUcmFuc2l0aW9uIHRyYW5zaXRpb24pIHsKKyAgICAgICAgbVRyYW5zaXRpb25zLmFkZCh0cmFuc2l0aW9uKTsKKworICAgICAgICBmaW5hbCBNZWRpYUl0ZW0gYmVmb3JlTWVkaWFJdGVtID0gdHJhbnNpdGlvbi5nZXRCZWZvcmVNZWRpYUl0ZW0oKTsKKyAgICAgICAgZmluYWwgTWVkaWFJdGVtIGFmdGVyTWVkaWFJdGVtID0gdHJhbnNpdGlvbi5nZXRBZnRlck1lZGlhSXRlbSgpOworCisgICAgICAgIC8vIENyb3NzIHJlZmVyZW5jZSB0aGUgdHJhbnNpdGlvbnMKKyAgICAgICAgaWYgKGFmdGVyTWVkaWFJdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIElmIGEgdHJhbnNpdGlvbiBhbHJlYWR5IGV4aXN0cyBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRoZW4KKyAgICAgICAgICAgIC8vIGludmFsaWRhdGUgaXQuCisgICAgICAgICAgICBpZiAoYWZ0ZXJNZWRpYUl0ZW0uZ2V0RW5kVHJhbnNpdGlvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhZnRlck1lZGlhSXRlbS5nZXRFbmRUcmFuc2l0aW9uKCkuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWZ0ZXJNZWRpYUl0ZW0uc2V0RW5kVHJhbnNpdGlvbih0cmFuc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChiZWZvcmVNZWRpYUl0ZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gSWYgYSB0cmFuc2l0aW9uIGFscmVhZHkgZXhpc3RzIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdGhlbgorICAgICAgICAgICAgLy8gaW52YWxpZGF0ZSBpdC4KKyAgICAgICAgICAgIGlmIChiZWZvcmVNZWRpYUl0ZW0uZ2V0QmVnaW5UcmFuc2l0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJlZm9yZU1lZGlhSXRlbS5nZXRCZWdpblRyYW5zaXRpb24oKS5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiZWZvcmVNZWRpYUl0ZW0uc2V0QmVnaW5UcmFuc2l0aW9uKHRyYW5zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgY29tcHV0ZVRpbWVsaW5lRHVyYXRpb24oKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFRyYW5zaXRpb24gcmVtb3ZlVHJhbnNpdGlvbihTdHJpbmcgdHJhbnNpdGlvbklkKSB7CisgICAgICAgIGlmIChtUHJldmlld1RocmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcmV2aWV3aW5nIGlzIGluIHByb2dyZXNzIik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBUcmFuc2l0aW9uIHRyYW5zaXRpb24gPSBnZXRUcmFuc2l0aW9uKHRyYW5zaXRpb25JZCk7CisgICAgICAgIGlmICh0cmFuc2l0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRyYW5zaXRpb24gbm90IGZvdW5kOiAiICsgdHJhbnNpdGlvbklkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92ZSB0aGUgdHJhbnNpdGlvbiByZWZlcmVuY2VzCisgICAgICAgIGZpbmFsIE1lZGlhSXRlbSBhZnRlck1lZGlhSXRlbSA9IHRyYW5zaXRpb24uZ2V0QWZ0ZXJNZWRpYUl0ZW0oKTsKKyAgICAgICAgaWYgKGFmdGVyTWVkaWFJdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFmdGVyTWVkaWFJdGVtLnNldEVuZFRyYW5zaXRpb24obnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBNZWRpYUl0ZW0gYmVmb3JlTWVkaWFJdGVtID0gdHJhbnNpdGlvbi5nZXRCZWZvcmVNZWRpYUl0ZW0oKTsKKyAgICAgICAgaWYgKGJlZm9yZU1lZGlhSXRlbSAhPSBudWxsKSB7CisgICAgICAgICAgICBiZWZvcmVNZWRpYUl0ZW0uc2V0QmVnaW5UcmFuc2l0aW9uKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgbVRyYW5zaXRpb25zLnJlbW92ZSh0cmFuc2l0aW9uKTsKKyAgICAgICAgdHJhbnNpdGlvbi5pbnZhbGlkYXRlKCk7CisgICAgICAgIGNvbXB1dGVUaW1lbGluZUR1cmF0aW9uKCk7CisKKyAgICAgICAgcmV0dXJuIHRyYW5zaXRpb247CisgICAgfQorCisgICAgLyoKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIExpc3Q8VHJhbnNpdGlvbj4gZ2V0QWxsVHJhbnNpdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBtVHJhbnNpdGlvbnM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIFRyYW5zaXRpb24gZ2V0VHJhbnNpdGlvbihTdHJpbmcgdHJhbnNpdGlvbklkKSB7CisgICAgICAgIGZvciAoVHJhbnNpdGlvbiB0cmFuc2l0aW9uIDogbVRyYW5zaXRpb25zKSB7CisgICAgICAgICAgICBpZiAodHJhbnNpdGlvbi5nZXRJZCgpLmVxdWFscyh0cmFuc2l0aW9uSWQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zaXRpb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQXVkaW9UcmFjayhBdWRpb1RyYWNrIGF1ZGlvVHJhY2spIHsKKyAgICAgICAgaWYgKG1QcmV2aWV3VGhyZWFkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByZXZpZXdpbmcgaXMgaW4gcHJvZ3Jlc3MiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1BdWRpb1RyYWNrcy5hZGQoYXVkaW9UcmFjayk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGluc2VydEF1ZGlvVHJhY2soQXVkaW9UcmFjayBhdWRpb1RyYWNrLCBTdHJpbmcgYWZ0ZXJBdWRpb1RyYWNrSWQpIHsKKyAgICAgICAgaWYgKG1QcmV2aWV3VGhyZWFkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByZXZpZXdpbmcgaXMgaW4gcHJvZ3Jlc3MiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhZnRlckF1ZGlvVHJhY2tJZCA9PSBudWxsKSB7CisgICAgICAgICAgICBtQXVkaW9UcmFja3MuYWRkKDAsIGF1ZGlvVHJhY2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluYWwgaW50IGF1ZGlvVHJhY2tDb3VudCA9IG1BdWRpb1RyYWNrcy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF1ZGlvVHJhY2tDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgQXVkaW9UcmFjayBhdCA9IG1BdWRpb1RyYWNrcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGF0LmdldElkKCkuZXF1YWxzKGFmdGVyQXVkaW9UcmFja0lkKSkgeworICAgICAgICAgICAgICAgICAgICBtQXVkaW9UcmFja3MuYWRkKGkgKyAxLCBhdWRpb1RyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXVkaW9UcmFjayBub3QgZm91bmQ6ICIgKyBhZnRlckF1ZGlvVHJhY2tJZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbW92ZUF1ZGlvVHJhY2soU3RyaW5nIGF1ZGlvVHJhY2tJZCwgU3RyaW5nIGFmdGVyQXVkaW9UcmFja0lkKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIEF1ZGlvVHJhY2sgcmVtb3ZlQXVkaW9UcmFjayhTdHJpbmcgYXVkaW9UcmFja0lkKSB7CisgICAgICAgIGlmIChtUHJldmlld1RocmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcmV2aWV3aW5nIGlzIGluIHByb2dyZXNzIik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBBdWRpb1RyYWNrIGF1ZGlvVHJhY2sgPSBnZXRBdWRpb1RyYWNrKGF1ZGlvVHJhY2tJZCk7CisgICAgICAgIGlmIChhdWRpb1RyYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BdWRpb1RyYWNrcy5yZW1vdmUoYXVkaW9UcmFjayk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYXVkaW9UcmFjazsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgQXVkaW9UcmFjayBnZXRBdWRpb1RyYWNrKFN0cmluZyBhdWRpb1RyYWNrSWQpIHsKKyAgICAgICAgZm9yIChBdWRpb1RyYWNrIGF0IDogbUF1ZGlvVHJhY2tzKSB7CisgICAgICAgICAgICBpZiAoYXQuZ2V0SWQoKS5lcXVhbHMoYXVkaW9UcmFja0lkKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBhdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBMaXN0PEF1ZGlvVHJhY2s+IGdldEFsbEF1ZGlvVHJhY2tzKCkgeworICAgICAgICByZXR1cm4gbUF1ZGlvVHJhY2tzOworICAgIH0KKworICAgIC8qCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBYbWxTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBYbWwubmV3U2VyaWFsaXplcigpOworICAgICAgICBmaW5hbCBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBzZXJpYWxpemVyLnNldE91dHB1dCh3cml0ZXIpOworICAgICAgICBzZXJpYWxpemVyLnN0YXJ0RG9jdW1lbnQoIlVURi04IiwgdHJ1ZSk7CisgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoIiIsIFRBR19QUk9KRUNUKTsKKyAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfQVNQRUNUX1JBVElPLCBJbnRlZ2VyLnRvU3RyaW5nKG1Bc3BlY3RSYXRpbykpOworCisgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoIiIsIFRBR19NRURJQV9JVEVNUyk7CisgICAgICAgIGZvciAoTWVkaWFJdGVtIG1lZGlhSXRlbSA6IG1NZWRpYUl0ZW1zKSB7CisgICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0VGFnKCIiLCBUQUdfTUVESUFfSVRFTSk7CisgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9JRCwgbWVkaWFJdGVtLmdldElkKCkpOworICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfVFlQRSwgbWVkaWFJdGVtLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX0ZJTEVOQU1FLCBtZWRpYUl0ZW0uZ2V0RmlsZW5hbWUoKSk7CisgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9SRU5ERVJJTkdfTU9ERSwgSW50ZWdlci50b1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFJdGVtLmdldFJlbmRlcmluZ01vZGUoKSkpOworICAgICAgICAgICAgaWYgKG1lZGlhSXRlbSBpbnN0YW5jZW9mIE1lZGlhVmlkZW9JdGVtKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFWaWRlb0l0ZW0gbXZpID0gKE1lZGlhVmlkZW9JdGVtKW1lZGlhSXRlbTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyCisgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cmlidXRlKCIiLCBBVFRSX0JFR0lOX1RJTUUsIExvbmcudG9TdHJpbmcobXZpLmdldEJvdW5kYXJ5QmVnaW5UaW1lKCkpKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9FTkRfVElNRSwgTG9uZy50b1N0cmluZyhtdmkuZ2V0Qm91bmRhcnlFbmRUaW1lKCkpKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9WT0xVTUUsIEludGVnZXIudG9TdHJpbmcobXZpLmdldFZvbHVtZSgpKSk7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfTVVURUQsIEJvb2xlYW4udG9TdHJpbmcobXZpLmlzTXV0ZWQoKSkpOworICAgICAgICAgICAgICAgIGlmIChtdmkuZ2V0QXVkaW9XYXZlZm9ybUZpbGVuYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9BVURJT19XQVZFRk9STV9GSUxFTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdmkuZ2V0QXVkaW9XYXZlZm9ybUZpbGVuYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWVkaWFJdGVtIGluc3RhbmNlb2YgTWVkaWFJbWFnZUl0ZW0pIHsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9EVVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvbmcudG9TdHJpbmcobWVkaWFJdGVtLmdldFRpbWVsaW5lRHVyYXRpb24oKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBMaXN0PE92ZXJsYXk+IG92ZXJsYXlzID0gbWVkaWFJdGVtLmdldEFsbE92ZXJsYXlzKCk7CisgICAgICAgICAgICBpZiAob3ZlcmxheXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoIiIsIFRBR19PVkVSTEFZUyk7CisgICAgICAgICAgICAgICAgZm9yIChPdmVybGF5IG92ZXJsYXkgOiBvdmVybGF5cykgeworICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0VGFnKCIiLCBUQUdfT1ZFUkxBWSk7CisgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX0lELCBvdmVybGF5LmdldElkKCkpOworICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9UWVBFLCBvdmVybGF5LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfQkVHSU5fVElNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nLnRvU3RyaW5nKG92ZXJsYXkuZ2V0U3RhcnRUaW1lKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfRFVSQVRJT04sIExvbmcudG9TdHJpbmcob3ZlcmxheS5nZXREdXJhdGlvbigpKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdmVybGF5IGluc3RhbmNlb2YgT3ZlcmxheUZyYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdmVybGF5RnJhbWUgb3ZlcmxheUZyYW1lID0gKE92ZXJsYXlGcmFtZSlvdmVybGF5OworICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheUZyYW1lLnNhdmUoZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdmVybGF5RnJhbWUuZ2V0RmlsZW5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfRklMRU5BTUUsIG92ZXJsYXlGcmFtZS5nZXRGaWxlbmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIHVzZXIgYXR0cmlidXRlcworICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0VGFnKCIiLCBUQUdfT1ZFUkxBWV9VU0VSX0FUVFJJQlVURVMpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHVzZXJBdHRyaWJ1dGVzID0gb3ZlcmxheS5nZXRVc2VyQXR0cmlidXRlcygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogdXNlckF0dHJpYnV0ZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IHVzZXJBdHRyaWJ1dGVzLmdldChuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmVuZFRhZygiIiwgVEFHX09WRVJMQVlfVVNFUl9BVFRSSUJVVEVTKTsKKworICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmVuZFRhZygiIiwgVEFHX09WRVJMQVkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmVuZFRhZygiIiwgVEFHX09WRVJMQVlTKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgTGlzdDxFZmZlY3Q+IGVmZmVjdHMgPSBtZWRpYUl0ZW0uZ2V0QWxsRWZmZWN0cygpOworICAgICAgICAgICAgaWYgKGVmZmVjdHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoIiIsIFRBR19FRkZFQ1RTKTsKKyAgICAgICAgICAgICAgICBmb3IgKEVmZmVjdCBlZmZlY3QgOiBlZmZlY3RzKSB7CisgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoIiIsIFRBR19FRkZFQ1QpOworICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9JRCwgZWZmZWN0LmdldElkKCkpOworICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9UWVBFLCBlZmZlY3QuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9CRUdJTl9USU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmcudG9TdHJpbmcoZWZmZWN0LmdldFN0YXJ0VGltZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX0RVUkFUSU9OLCBMb25nLnRvU3RyaW5nKGVmZmVjdC5nZXREdXJhdGlvbigpKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlZmZlY3QgaW5zdGFuY2VvZiBFZmZlY3RDb2xvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRWZmZWN0Q29sb3IgY29sb3JFZmZlY3QgPSAoRWZmZWN0Q29sb3IpZWZmZWN0OworICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfQ09MT1JfRUZGRUNUX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoY29sb3JFZmZlY3QuZ2V0VHlwZSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3JFZmZlY3QuZ2V0VHlwZSgpID09IEVmZmVjdENvbG9yLlRZUEVfQ09MT1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9DT0xPUl9FRkZFQ1RfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGNvbG9yRWZmZWN0LmdldFBhcmFtKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlZmZlY3QgaW5zdGFuY2VvZiBFZmZlY3RLZW5CdXJucykgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVjdCBzdGFydFJlY3QgPSAoKEVmZmVjdEtlbkJ1cm5zKWVmZmVjdCkuZ2V0U3RhcnRSZWN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9TVEFSVF9SRUNUX0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoc3RhcnRSZWN0LmxlZnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX1NUQVJUX1JFQ1RfVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhzdGFydFJlY3QudG9wKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9TVEFSVF9SRUNUX1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoc3RhcnRSZWN0LnJpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9TVEFSVF9SRUNUX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoc3RhcnRSZWN0LmJvdHRvbSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IGVuZFJlY3QgPSAoKEVmZmVjdEtlbkJ1cm5zKWVmZmVjdCkuZ2V0RW5kUmVjdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfRU5EX1JFQ1RfTCwgSW50ZWdlci50b1N0cmluZyhlbmRSZWN0LmxlZnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX0VORF9SRUNUX1QsIEludGVnZXIudG9TdHJpbmcoZW5kUmVjdC50b3ApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX0VORF9SRUNUX1IsIEludGVnZXIudG9TdHJpbmcoZW5kUmVjdC5yaWdodCkpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfRU5EX1JFQ1RfQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhlbmRSZWN0LmJvdHRvbSkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5lbmRUYWcoIiIsIFRBR19FRkZFQ1QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmVuZFRhZygiIiwgVEFHX0VGRkVDVFMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXJpYWxpemVyLmVuZFRhZygiIiwgVEFHX01FRElBX0lURU0pOworICAgICAgICB9CisgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKCIiLCBUQUdfTUVESUFfSVRFTVMpOworCisgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoIiIsIFRBR19UUkFOU0lUSU9OUyk7CisKKyAgICAgICAgZm9yIChUcmFuc2l0aW9uIHRyYW5zaXRpb24gOiBtVHJhbnNpdGlvbnMpIHsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoIiIsIFRBR19UUkFOU0lUSU9OKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX0lELCB0cmFuc2l0aW9uLmdldElkKCkpOworICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfVFlQRSwgdHJhbnNpdGlvbi5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9EVVJBVElPTiwgTG9uZy50b1N0cmluZyh0cmFuc2l0aW9uLmdldER1cmF0aW9uKCkpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX0JFSEFWSU9SLCBJbnRlZ2VyLnRvU3RyaW5nKHRyYW5zaXRpb24uZ2V0QmVoYXZpb3IoKSkpOworICAgICAgICAgICAgZmluYWwgTWVkaWFJdGVtIGFmdGVyTWVkaWFJdGVtID0gdHJhbnNpdGlvbi5nZXRBZnRlck1lZGlhSXRlbSgpOworICAgICAgICAgICAgaWYgKGFmdGVyTWVkaWFJdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9BRlRFUl9NRURJQV9JVEVNX0lELCBhZnRlck1lZGlhSXRlbS5nZXRJZCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgTWVkaWFJdGVtIGJlZm9yZU1lZGlhSXRlbSA9IHRyYW5zaXRpb24uZ2V0QmVmb3JlTWVkaWFJdGVtKCk7CisgICAgICAgICAgICBpZiAoYmVmb3JlTWVkaWFJdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9CRUZPUkVfTUVESUFfSVRFTV9JRCwgYmVmb3JlTWVkaWFJdGVtLmdldElkKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodHJhbnNpdGlvbiBpbnN0YW5jZW9mIFRyYW5zaXRpb25TbGlkaW5nKSB7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfRElSRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZygoKFRyYW5zaXRpb25TbGlkaW5nKXRyYW5zaXRpb24pLmdldERpcmVjdGlvbigpKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRyYW5zaXRpb24gaW5zdGFuY2VvZiBUcmFuc2l0aW9uQWxwaGEpIHsKKyAgICAgICAgICAgICAgICBUcmFuc2l0aW9uQWxwaGEgdGEgPSAoVHJhbnNpdGlvbkFscGhhKXRyYW5zaXRpb247CisgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfQkxFTkRJTkcsIEludGVnZXIudG9TdHJpbmcodGEuZ2V0QmxlbmRpbmdQZXJjZW50KCkpKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9JTlZFUlQsIEJvb2xlYW4udG9TdHJpbmcodGEuaXNJbnZlcnQoKSkpOworICAgICAgICAgICAgICAgIGlmICh0YS5nZXRNYXNrRmlsZW5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX01BU0ssIHRhLmdldE1hc2tGaWxlbmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXJpYWxpemVyLmVuZFRhZygiIiwgVEFHX1RSQU5TSVRJT04pOworICAgICAgICB9CisgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKCIiLCBUQUdfVFJBTlNJVElPTlMpOworCisgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoIiIsIFRBR19BVURJT19UUkFDS1MpOworICAgICAgICBmb3IgKEF1ZGlvVHJhY2sgYXQgOiBtQXVkaW9UcmFja3MpIHsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcoIiIsIFRBR19BVURJT19UUkFDSyk7CisgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9JRCwgYXQuZ2V0SWQoKSk7CisgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9GSUxFTkFNRSwgYXQuZ2V0RmlsZW5hbWUoKSk7CisgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9TVEFSVF9USU1FLCBMb25nLnRvU3RyaW5nKGF0LmdldFN0YXJ0VGltZSgpKSk7CisgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9CRUdJTl9USU1FLCBMb25nLnRvU3RyaW5nKGF0LmdldEJvdW5kYXJ5QmVnaW5UaW1lKCkpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX0VORF9USU1FLCBMb25nLnRvU3RyaW5nKGF0LmdldEJvdW5kYXJ5RW5kVGltZSgpKSk7CisgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9WT0xVTUUsIEludGVnZXIudG9TdHJpbmcoYXQuZ2V0Vm9sdW1lKCkpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKCIiLCBBVFRSX01VVEVELCBCb29sZWFuLnRvU3RyaW5nKGF0LmlzTXV0ZWQoKSkpOworICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUoIiIsIEFUVFJfTE9PUCwgQm9vbGVhbi50b1N0cmluZyhhdC5pc0xvb3BpbmcoKSkpOworICAgICAgICAgICAgaWYgKGF0LmdldEF1ZGlvV2F2ZWZvcm1GaWxlbmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZSgiIiwgQVRUUl9BVURJT19XQVZFRk9STV9GSUxFTkFNRSwKKyAgICAgICAgICAgICAgICBhdC5nZXRBdWRpb1dhdmVmb3JtRmlsZW5hbWUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKCIiLCBUQUdfQVVESU9fVFJBQ0spOworICAgICAgICB9CisgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKCIiLCBUQUdfQVVESU9fVFJBQ0tTKTsKKworICAgICAgICBzZXJpYWxpemVyLmVuZFRhZygiIiwgVEFHX1BST0pFQ1QpOworICAgICAgICBzZXJpYWxpemVyLmVuZERvY3VtZW50KCk7CisKKyAgICAgICAgLy8gU2F2ZSB0aGUgbWV0YWRhdGEgWE1MIGZpbGUKKyAgICAgICAgZmluYWwgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShnZXRQYXRoKCksIFBST0pFQ1RfRklMRU5BTUUpKTsKKyAgICAgICAgb3V0LndyaXRlKHdyaXRlci50b1N0cmluZygpLmdldEJ5dGVzKCkpOworICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgcHJvamVjdCBmb3JtIFhNTAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2FkKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBGaWxlIGZpbGUgPSBuZXcgRmlsZShtUHJvamVjdFBhdGgsIFBST0pFQ1RfRklMRU5BTUUpOworICAgICAgICAvLyBMb2FkIHRoZSBtZXRhZGF0YQorICAgICAgICBmaW5hbCBYbWxQdWxsUGFyc2VyIHBhcnNlciA9IFhtbC5uZXdQdWxsUGFyc2VyKCk7CisgICAgICAgIHBhcnNlci5zZXRJbnB1dChuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpLCAiVVRGLTgiKTsKKyAgICAgICAgaW50IGV2ZW50VHlwZSA9IHBhcnNlci5nZXRFdmVudFR5cGUoKTsKKyAgICAgICAgU3RyaW5nIG5hbWU7CisgICAgICAgIE1lZGlhSXRlbSBjdXJyZW50TWVkaWFJdGVtID0gbnVsbDsKKyAgICAgICAgT3ZlcmxheSBjdXJyZW50T3ZlcmxheSA9IG51bGw7CisgICAgICAgIHdoaWxlIChldmVudFR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRzogeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFRBR19QUk9KRUNULmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUFzcGVjdFJhdGlvID0gSW50ZWdlci5wYXJzZUludChwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUVFJfQVNQRUNUX1JBVElPKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX01FRElBX0lURU0uZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVkaWFJdGVtSWQgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHR5cGUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfVFlQRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmlsZW5hbWUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfRklMRU5BTUUpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJlbmRlcmluZ01vZGUgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRUUl9SRU5ERVJJTkdfTU9ERSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWVkaWFJbWFnZUl0ZW0uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZHVyYXRpb25NcyA9IExvbmcucGFyc2VMb25nKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUVFJfRFVSQVRJT04pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWVkaWFJdGVtID0gbmV3IE1lZGlhSW1hZ2VJdGVtKHRoaXMsIG1lZGlhSXRlbUlkLCBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uTXMsIHJlbmRlcmluZ01vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNZWRpYVZpZGVvSXRlbS5jbGFzcy5nZXRTaW1wbGVOYW1lKCkuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBiZWdpbk1zID0gTG9uZy5wYXJzZUxvbmcocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRUUl9CRUdJTl9USU1FKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBlbmRNcyA9IExvbmcucGFyc2VMb25nKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUVFJfRU5EX1RJTUUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdm9sdW1lID0gSW50ZWdlci5wYXJzZUludChwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFRSX1ZPTFVNRSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbXV0ZWQgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFRSX01VVEVEKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGF1ZGlvV2F2ZWZvcm1GaWxlbmFtZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUVFJfQVVESU9fV0FWRUZPUk1fRklMRU5BTUUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNZWRpYUl0ZW0gPSBuZXcgTWVkaWFWaWRlb0l0ZW0odGhpcywgbWVkaWFJdGVtSWQsIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyaW5nTW9kZSwgYmVnaW5NcywgZW5kTXMsIHZvbHVtZSwgbXV0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1dhdmVmb3JtRmlsZW5hbWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBiZWdpblRpbWVNcyA9IExvbmcucGFyc2VMb25nKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUVFJfQkVHSU5fVElNRSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZW5kVGltZU1zID0gTG9uZy5wYXJzZUxvbmcocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRUUl9FTkRfVElNRSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTWVkaWFWaWRlb0l0ZW0pY3VycmVudE1lZGlhSXRlbSkuc2V0RXh0cmFjdEJvdW5kYXJpZXMoYmVnaW5UaW1lTXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRUaW1lTXMpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHZvbHVtZVBlcmNlbnQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUVFJfVk9MVU1FKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNZWRpYVZpZGVvSXRlbSljdXJyZW50TWVkaWFJdGVtKS5zZXRWb2x1bWUodm9sdW1lUGVyY2VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlVua25vd24gbWVkaWEgaXRlbSB0eXBlOiAiICsgdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1lZGlhSXRlbSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TWVkaWFJdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFJdGVtcy5hZGQoY3VycmVudE1lZGlhSXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX1RSQU5TSVRJT04uZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUcmFuc2l0aW9uIHRyYW5zaXRpb24gPSBwYXJzZVRyYW5zaXRpb24ocGFyc2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2l0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHJhbnNpdGlvbnMuYWRkKHRyYW5zaXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19PVkVSTEFZLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRNZWRpYUl0ZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRPdmVybGF5ID0gcGFyc2VPdmVybGF5KHBhcnNlciwgY3VycmVudE1lZGlhSXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRPdmVybGF5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1lZGlhSXRlbS5hZGRPdmVybGF5KGN1cnJlbnRPdmVybGF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX09WRVJMQVlfVVNFUl9BVFRSSUJVVEVTLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRPdmVybGF5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYXR0cmlidXRlc0NvdW50ID0gcGFyc2VyLmdldEF0dHJpYnV0ZUNvdW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T3ZlcmxheS5zZXRVc2VyQXR0cmlidXRlKHBhcnNlci5nZXRBdHRyaWJ1dGVOYW1lKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19FRkZFQ1QuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE1lZGlhSXRlbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRWZmZWN0IGVmZmVjdCA9IHBhcnNlRWZmZWN0KHBhcnNlciwgY3VycmVudE1lZGlhSXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVmZmVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNZWRpYUl0ZW0uYWRkRWZmZWN0KGVmZmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19BVURJT19UUkFDSy5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEF1ZGlvVHJhY2sgYXVkaW9UcmFjayA9IHBhcnNlQXVkaW9UcmFjayhwYXJzZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvVHJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvVHJhY2soYXVkaW9UcmFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBYbWxQdWxsUGFyc2VyLkVORF9UQUc6IHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChUQUdfTUVESUFfSVRFTS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNZWRpYUl0ZW0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19PVkVSTEFZLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE92ZXJsYXkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZXZlbnRUeXBlID0gcGFyc2VyLm5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbXB1dGVUaW1lbGluZUR1cmF0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgdGhlIHRyYW5zaXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJzZXIgVGhlIHBhcnNlcgorICAgICAqIEByZXR1cm4gVGhlIHRyYW5zaXRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIFRyYW5zaXRpb24gcGFyc2VUcmFuc2l0aW9uKFhtbFB1bGxQYXJzZXIgcGFyc2VyKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyB0cmFuc2l0aW9uSWQgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfSUQpOworICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9UWVBFKTsKKyAgICAgICAgZmluYWwgbG9uZyBkdXJhdGlvbk1zID0gTG9uZy5wYXJzZUxvbmcocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCBBVFRSX0RVUkFUSU9OKSk7CisgICAgICAgIGZpbmFsIGludCBiZWhhdmlvciA9IEludGVnZXIucGFyc2VJbnQocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCBBVFRSX0JFSEFWSU9SKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGJlZm9yZU1lZGlhSXRlbUlkID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCBBVFRSX0JFRk9SRV9NRURJQV9JVEVNX0lEKTsKKyAgICAgICAgZmluYWwgTWVkaWFJdGVtIGJlZm9yZU1lZGlhSXRlbTsKKyAgICAgICAgaWYgKGJlZm9yZU1lZGlhSXRlbUlkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJlZm9yZU1lZGlhSXRlbSA9IGdldE1lZGlhSXRlbShiZWZvcmVNZWRpYUl0ZW1JZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiZWZvcmVNZWRpYUl0ZW0gPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGFmdGVyTWVkaWFJdGVtSWQgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfQUZURVJfTUVESUFfSVRFTV9JRCk7CisgICAgICAgIGZpbmFsIE1lZGlhSXRlbSBhZnRlck1lZGlhSXRlbTsKKyAgICAgICAgaWYgKGFmdGVyTWVkaWFJdGVtSWQgIT0gbnVsbCkgeworICAgICAgICAgICAgYWZ0ZXJNZWRpYUl0ZW0gPSBnZXRNZWRpYUl0ZW0oYWZ0ZXJNZWRpYUl0ZW1JZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZnRlck1lZGlhSXRlbSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBUcmFuc2l0aW9uIHRyYW5zaXRpb247CisgICAgICAgIGlmIChUcmFuc2l0aW9uU3RhcnRDdXJ0YWluT3BlbmluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCkuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICB0cmFuc2l0aW9uID0gbmV3IFRyYW5zaXRpb25TdGFydEN1cnRhaW5PcGVuaW5nKHRyYW5zaXRpb25JZCwgYmVmb3JlTWVkaWFJdGVtLAorICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbk1zLCBiZWhhdmlvcik7CisgICAgICAgIH0gZWxzZSBpZiAoVHJhbnNpdGlvblN0YXJ0RmFkZUZyb21CbGFjay5jbGFzcy5nZXRTaW1wbGVOYW1lKCkuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICB0cmFuc2l0aW9uID0gbmV3IFRyYW5zaXRpb25TdGFydEZhZGVGcm9tQmxhY2sodHJhbnNpdGlvbklkLCBiZWZvcmVNZWRpYUl0ZW0sCisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uTXMsIGJlaGF2aW9yKTsKKyAgICAgICAgfSBlbHNlIGlmIChUcmFuc2l0aW9uQWxwaGEuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgZmluYWwgaW50IGJsZW5kaW5nID0gSW50ZWdlci5wYXJzZUludChwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfQkxFTkRJTkcpKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtYXNrRmlsZW5hbWUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfTUFTSyk7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGludmVydCA9IEJvb2xlYW4uZ2V0Qm9vbGVhbihwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfSU5WRVJUKSk7CisgICAgICAgICAgICB0cmFuc2l0aW9uID0gbmV3IFRyYW5zaXRpb25BbHBoYSh0cmFuc2l0aW9uSWQsIGFmdGVyTWVkaWFJdGVtLCBiZWZvcmVNZWRpYUl0ZW0sCisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uTXMsIGJlaGF2aW9yLCBtYXNrRmlsZW5hbWUsIGJsZW5kaW5nLCBpbnZlcnQpOworICAgICAgICB9IGVsc2UgaWYgKFRyYW5zaXRpb25Dcm9zc2ZhZGUuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgdHJhbnNpdGlvbiA9IG5ldyBUcmFuc2l0aW9uQ3Jvc3NmYWRlKHRyYW5zaXRpb25JZCwgYWZ0ZXJNZWRpYUl0ZW0sIGJlZm9yZU1lZGlhSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25NcywgYmVoYXZpb3IpOworICAgICAgICB9IGVsc2UgaWYgKFRyYW5zaXRpb25TbGlkaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKS5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBkaXJlY3Rpb24gPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9ESVJFQ1RJT04pKTsKKyAgICAgICAgICAgIHRyYW5zaXRpb24gPSBuZXcgVHJhbnNpdGlvblNsaWRpbmcodHJhbnNpdGlvbklkLCBhZnRlck1lZGlhSXRlbSwgYmVmb3JlTWVkaWFJdGVtLAorICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbk1zLCBiZWhhdmlvciwgZGlyZWN0aW9uKTsKKyAgICAgICAgfSBlbHNlIGlmIChUcmFuc2l0aW9uRmFkZVRvQmxhY2suY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgdHJhbnNpdGlvbiA9IG5ldyBUcmFuc2l0aW9uRmFkZVRvQmxhY2sodHJhbnNpdGlvbklkLCBhZnRlck1lZGlhSXRlbSwgYmVmb3JlTWVkaWFJdGVtLAorICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbk1zLCBiZWhhdmlvcik7CisgICAgICAgIH0gZWxzZSBpZiAoVHJhbnNpdGlvbkVuZEN1cnRhaW5DbG9zaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKS5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgIHRyYW5zaXRpb24gPSBuZXcgVHJhbnNpdGlvbkVuZEN1cnRhaW5DbG9zaW5nKHRyYW5zaXRpb25JZCwgYWZ0ZXJNZWRpYUl0ZW0sIGR1cmF0aW9uTXMsCisgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yKTsKKyAgICAgICAgfSBlbHNlIGlmIChUcmFuc2l0aW9uRW5kRmFkZVRvQmxhY2suY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgdHJhbnNpdGlvbiA9IG5ldyBUcmFuc2l0aW9uRW5kRmFkZVRvQmxhY2sodHJhbnNpdGlvbklkLCBhZnRlck1lZGlhSXRlbSwgZHVyYXRpb25NcywKKyAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJhbnNpdGlvbiA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmVmb3JlTWVkaWFJdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJlZm9yZU1lZGlhSXRlbS5zZXRCZWdpblRyYW5zaXRpb24odHJhbnNpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWZ0ZXJNZWRpYUl0ZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgYWZ0ZXJNZWRpYUl0ZW0uc2V0RW5kVHJhbnNpdGlvbih0cmFuc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cmFuc2l0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBvdmVybGF5CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyc2VyIFRoZSBwYXJzZXIKKyAgICAgKiBAcGFyYW0gbWVkaWFJdGVtIFRoZSBtZWRpYSBpdGVtIG93bmVyCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBvdmVybGF5CisgICAgICovCisgICAgcHJpdmF0ZSBPdmVybGF5IHBhcnNlT3ZlcmxheShYbWxQdWxsUGFyc2VyIHBhcnNlciwgTWVkaWFJdGVtIG1lZGlhSXRlbSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgb3ZlcmxheUlkID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCBBVFRSX0lEKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHR5cGUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfVFlQRSk7CisgICAgICAgIGZpbmFsIGxvbmcgZHVyYXRpb25NcyA9IExvbmcucGFyc2VMb25nKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9EVVJBVElPTikpOworICAgICAgICBmaW5hbCBsb25nIHN0YXJ0VGltZU1zID0gTG9uZy5wYXJzZUxvbmcocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCBBVFRSX0JFR0lOX1RJTUUpKTsKKworICAgICAgICBmaW5hbCBPdmVybGF5IG92ZXJsYXk7CisgICAgICAgIGlmIChPdmVybGF5RnJhbWUuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpbGVuYW1lID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCBBVFRSX0ZJTEVOQU1FKTsKKyAgICAgICAgICAgIG92ZXJsYXkgPSBuZXcgT3ZlcmxheUZyYW1lKG1lZGlhSXRlbSwgb3ZlcmxheUlkLCBmaWxlbmFtZSwgc3RhcnRUaW1lTXMsIGR1cmF0aW9uTXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3ZlcmxheSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gb3ZlcmxheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgZWZmZWN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyc2VyIFRoZSBwYXJzZXIKKyAgICAgKiBAcGFyYW0gbWVkaWFJdGVtIFRoZSBtZWRpYSBpdGVtIG93bmVyCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBlZmZlY3QKKyAgICAgKi8KKyAgICBwcml2YXRlIEVmZmVjdCBwYXJzZUVmZmVjdChYbWxQdWxsUGFyc2VyIHBhcnNlciwgTWVkaWFJdGVtIG1lZGlhSXRlbSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgZWZmZWN0SWQgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfSUQpOworICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9UWVBFKTsKKyAgICAgICAgZmluYWwgbG9uZyBkdXJhdGlvbk1zID0gTG9uZy5wYXJzZUxvbmcocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCBBVFRSX0RVUkFUSU9OKSk7CisgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRUaW1lTXMgPSBMb25nLnBhcnNlTG9uZyhwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfQkVHSU5fVElNRSkpOworCisgICAgICAgIGZpbmFsIEVmZmVjdCBlZmZlY3Q7CisgICAgICAgIGlmIChFZmZlY3RDb2xvci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgY29sb3JFZmZlY3RUeXBlID0KKyAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9DT0xPUl9FRkZFQ1RfVFlQRSkpOworICAgICAgICAgICAgZmluYWwgaW50IGNvbG9yOworICAgICAgICAgICAgaWYgKGNvbG9yRWZmZWN0VHlwZSA9PSBFZmZlY3RDb2xvci5UWVBFX0NPTE9SKSB7CisgICAgICAgICAgICAgICAgY29sb3IgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9DT0xPUl9FRkZFQ1RfVkFMVUUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29sb3IgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWZmZWN0ID0gbmV3IEVmZmVjdENvbG9yKG1lZGlhSXRlbSwgZWZmZWN0SWQsIHN0YXJ0VGltZU1zLCBkdXJhdGlvbk1zLAorICAgICAgICAgICAgICAgICAgICBjb2xvckVmZmVjdFR5cGUsIGNvbG9yKTsKKyAgICAgICAgfSBlbHNlIGlmIChFZmZlY3RLZW5CdXJucy5jbGFzcy5nZXRTaW1wbGVOYW1lKCkuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICBmaW5hbCBSZWN0IHN0YXJ0UmVjdCA9IG5ldyBSZWN0KAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9TVEFSVF9SRUNUX0wpKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfU1RBUlRfUkVDVF9UKSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCBBVFRSX1NUQVJUX1JFQ1RfUikpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9TVEFSVF9SRUNUX0IpKSk7CisgICAgICAgICAgICBmaW5hbCBSZWN0IGVuZFJlY3QgPSBuZXcgUmVjdCgKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfRU5EX1JFQ1RfTCkpLAorICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9FTkRfUkVDVF9UKSksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCBBVFRSX0VORF9SRUNUX1IpKSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfRU5EX1JFQ1RfQikpKTsKKyAgICAgICAgICAgIGVmZmVjdCA9IG5ldyBFZmZlY3RLZW5CdXJucyhtZWRpYUl0ZW0sIGVmZmVjdElkLCBzdGFydFJlY3QsIGVuZFJlY3QsIHN0YXJ0VGltZU1zLAorICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbk1zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVmZmVjdCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZWZmZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBhdWRpbyB0cmFjaworICAgICAqCisgICAgICogQHBhcmFtIHBhcnNlciBUaGUgcGFyc2VyCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBhdWRpbyB0cmFjaworICAgICAqLworICAgIHByaXZhdGUgQXVkaW9UcmFjayBwYXJzZUF1ZGlvVHJhY2soWG1sUHVsbFBhcnNlciBwYXJzZXIpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGF1ZGlvVHJhY2tJZCA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9JRCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBmaWxlbmFtZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9GSUxFTkFNRSk7CisgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRUaW1lTXMgPSBMb25nLnBhcnNlTG9uZyhwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfU1RBUlRfVElNRSkpOworICAgICAgICBmaW5hbCBsb25nIGJlZ2luTXMgPSBMb25nLnBhcnNlTG9uZyhwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfQkVHSU5fVElNRSkpOworICAgICAgICBmaW5hbCBsb25nIGVuZE1zID0gTG9uZy5wYXJzZUxvbmcocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCBBVFRSX0VORF9USU1FKSk7CisgICAgICAgIGZpbmFsIGludCB2b2x1bWUgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9WT0xVTUUpKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBtdXRlZCA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9NVVRFRCkpOworICAgICAgICBmaW5hbCBib29sZWFuIGxvb3AgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoIiIsIEFUVFJfTE9PUCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgd2F2ZWZvcm1GaWxlbmFtZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiIiwgQVRUUl9BVURJT19XQVZFRk9STV9GSUxFTkFNRSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBBdWRpb1RyYWNrIGF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjayh0aGlzLCBhdWRpb1RyYWNrSWQsIGZpbGVuYW1lLCBzdGFydFRpbWVNcywKKyAgICAgICAgICAgICAgICAgICAgYmVnaW5NcywgZW5kTXMsIGxvb3AsIHZvbHVtZSwgbXV0ZWQsIHdhdmVmb3JtRmlsZW5hbWUpOworCisgICAgICAgICAgICByZXR1cm4gYXVkaW9UcmFjazsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2FuY2VsRXhwb3J0KFN0cmluZyBmaWxlbmFtZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV4cG9ydChTdHJpbmcgZmlsZW5hbWUsIGludCBoZWlnaHQsIGludCBiaXRyYXRlLCBFeHBvcnRQcm9ncmVzc0xpc3RlbmVyIGxpc3RlbmVyKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVByZXZpZXcoKSB7CisgICAgICAgIC8vIEdlbmVyYXRlIGFsbCB0aGUgbmVlZGVkIHRyYW5zaXRpb25zCisgICAgICAgIGZvciAoVHJhbnNpdGlvbiB0cmFuc2l0aW9uIDogbVRyYW5zaXRpb25zKSB7CisgICAgICAgICAgICBpZiAoIXRyYW5zaXRpb24uaXNHZW5lcmF0ZWQoKSkgeworICAgICAgICAgICAgICAgIHRyYW5zaXRpb24uZ2VuZXJhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIHVzZXIgbWF5IGhhZCBjYWxsZWQgc2V0RHVyYXRpb24gb24KKyAgICAgICAgLy8gTWVkaWFJbWFnZUl0ZW1zCisgICAgICAgIGNvbXB1dGVUaW1lbGluZUR1cmF0aW9uKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgICAgc3RvcFByZXZpZXcoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXREdXJhdGlvbigpIHsKKyAgICAgICAgLy8gU2luY2UgTWVkaWFJbWFnZUl0ZW0gY2FuIGNoYW5nZSBkdXJhdGlvbiB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlCisgICAgICAgIC8vIGR1cmF0aW9uIGhlcmUKKyAgICAgICAgY29tcHV0ZVRpbWVsaW5lRHVyYXRpb24oKTsKKyAgICAgICAgcmV0dXJuIG1EdXJhdGlvbk1zOworICAgIH0KKworICAgIC8qCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QXNwZWN0UmF0aW8oKSB7CisgICAgICAgIHJldHVybiBtQXNwZWN0UmF0aW87CisgICAgfQorCisgICAgLyoKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXNwZWN0UmF0aW8oaW50IGFzcGVjdFJhdGlvKSB7CisgICAgICAgIG1Bc3BlY3RSYXRpbyA9IGFzcGVjdFJhdGlvOworICAgIH0KKworICAgIC8qCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBsb25nIHJlbmRlclByZXZpZXdGcmFtZShTdXJmYWNlSG9sZGVyIHN1cmZhY2VIb2xkZXIsIGxvbmcgdGltZU1zKSB7CisgICAgICAgIGlmIChtUHJldmlld1RocmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcmV2aWV3aW5nIGlzIGluIHByb2dyZXNzIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRpbWVNczsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnRQcmV2aWV3KFN1cmZhY2VIb2xkZXIgc3VyZmFjZUhvbGRlciwgbG9uZyBmcm9tTXMsIGxvbmcgdG9NcywKKyAgICAgICAgICAgIGJvb2xlYW4gbG9vcCwgaW50IGNhbGxiYWNrQWZ0ZXJGcmFtZUNvdW50LCBQcmV2aWV3UHJvZ3Jlc3NMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAoZnJvbU1zID49IG1EdXJhdGlvbk1zKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbVByZXZpZXdUaHJlYWQgPSBuZXcgUHJldmlld1RocmVhZChmcm9tTXMsIHRvTXMsIGxvb3AsIGNhbGxiYWNrQWZ0ZXJGcmFtZUNvdW50LCBsaXN0ZW5lcik7CisgICAgICAgIG1QcmV2aWV3VGhyZWFkLnN0YXJ0KCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIHN0b3BQcmV2aWV3KCkgeworICAgICAgICBmaW5hbCBsb25nIHN0b3BUaW1lTXM7CisgICAgICAgIGlmIChtUHJldmlld1RocmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICBzdG9wVGltZU1zID0gbVByZXZpZXdUaHJlYWQuc3RvcFByZXZpZXcoKTsKKyAgICAgICAgICAgIG1QcmV2aWV3VGhyZWFkID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0b3BUaW1lTXMgPSAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdG9wVGltZU1zOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXB1dGUgdGhlIGR1cmF0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNvbXB1dGVUaW1lbGluZUR1cmF0aW9uKCkgeworICAgICAgICBtRHVyYXRpb25NcyA9IDA7CisgICAgICAgIGZvciAoTWVkaWFJdGVtIG1lZGlhSXRlbSA6IG1NZWRpYUl0ZW1zKSB7CisgICAgICAgICAgICBtRHVyYXRpb25NcyArPSBtZWRpYUl0ZW0uZ2V0VGltZWxpbmVEdXJhdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3VidHJhY3QgdGhlIHRyYW5zaXRpb24gdGltZXMKKyAgICAgICAgZm9yIChUcmFuc2l0aW9uIHRyYW5zaXRpb24gOiBtVHJhbnNpdGlvbnMpIHsKKyAgICAgICAgICAgIGlmICghKHRyYW5zaXRpb24gaW5zdGFuY2VvZiBUcmFuc2l0aW9uU3RhcnRDdXJ0YWluT3BlbmluZykKKyAgICAgICAgICAgICAgICAgICAgJiYgISh0cmFuc2l0aW9uIGluc3RhbmNlb2YgVHJhbnNpdGlvblN0YXJ0RmFkZUZyb21CbGFjaykKKyAgICAgICAgICAgICAgICAgICAgJiYgISh0cmFuc2l0aW9uIGluc3RhbmNlb2YgVHJhbnNpdGlvbkVuZEZhZGVUb0JsYWNrKQorICAgICAgICAgICAgICAgICAgICAmJiAhKHRyYW5zaXRpb24gaW5zdGFuY2VvZiBUcmFuc2l0aW9uRW5kQ3VydGFpbkNsb3NpbmcpKSB7CisgICAgICAgICAgICAgICAgbUR1cmF0aW9uTXMgLT0gdHJhbnNpdGlvbi5nZXREdXJhdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRyYW5zaXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIG1lZGlhIGl0ZW0KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZWRpYUl0ZW0gVGhlIG1lZGlhIGl0ZW0KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlQWRqYWNlbnRUcmFuc2l0aW9ucyhNZWRpYUl0ZW0gbWVkaWFJdGVtKSB7CisgICAgICAgIGZpbmFsIEl0ZXJhdG9yPFRyYW5zaXRpb24+IGl0ID0gbVRyYW5zaXRpb25zLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFRyYW5zaXRpb24gdCA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIGlmICh0LmdldEFmdGVyTWVkaWFJdGVtKCkgPT0gbWVkaWFJdGVtIHx8IHQuZ2V0QmVmb3JlTWVkaWFJdGVtKCkgPT0gbWVkaWFJdGVtKSB7CisgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgdC5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgbWVkaWFJdGVtLnNldEJlZ2luVHJhbnNpdGlvbihudWxsKTsKKyAgICAgICAgICAgICAgICBtZWRpYUl0ZW0uc2V0RW5kVHJhbnNpdGlvbihudWxsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgdHJhbnNpdGlvbiBiZWZvcmUgdGhpcyBtZWRpYSBpdGVtCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5kZXggVGhlIG1lZGlhIGl0ZW0gaW5kZXgKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlVHJhbnNpdGlvbkJlZm9yZShpbnQgaW5kZXgpIHsKKyAgICAgICAgZmluYWwgTWVkaWFJdGVtIG1lZGlhSXRlbSA9IG1NZWRpYUl0ZW1zLmdldCgwKTsKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8VHJhbnNpdGlvbj4gaXQgPSBtVHJhbnNpdGlvbnMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgVHJhbnNpdGlvbiB0ID0gaXQubmV4dCgpOworICAgICAgICAgICAgaWYgKHQuZ2V0QmVmb3JlTWVkaWFJdGVtKCkgPT0gbWVkaWFJdGVtKSB7CisgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgdC5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgbWVkaWFJdGVtLnNldEJlZ2luVHJhbnNpdGlvbihudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1NZWRpYUl0ZW1zLmdldChpbmRleCAtIDEpLnNldEVuZFRyYW5zaXRpb24obnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSB0cmFuc2l0aW9uIGFmdGVyIHRoaXMgbWVkaWEgaXRlbQorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4IFRoZSBtZWRpYSBpdGVtIGluZGV4CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVRyYW5zaXRpb25BZnRlcihpbnQgaW5kZXgpIHsKKyAgICAgICAgZmluYWwgTWVkaWFJdGVtIG1lZGlhSXRlbSA9IG1NZWRpYUl0ZW1zLmdldChpbmRleCk7CisgICAgICAgIGZpbmFsIEl0ZXJhdG9yPFRyYW5zaXRpb24+IGl0ID0gbVRyYW5zaXRpb25zLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFRyYW5zaXRpb24gdCA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIGlmICh0LmdldEFmdGVyTWVkaWFJdGVtKCkgPT0gbWVkaWFJdGVtKSB7CisgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgdC5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgbWVkaWFJdGVtLnNldEVuZFRyYW5zaXRpb24obnVsbCk7CisgICAgICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSB0aGUgcmVmZXJlbmNlIGluIHRoZSBuZXh0IG1lZGlhIGl0ZW0KKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBtTWVkaWFJdGVtcy5zaXplKCkgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIG1NZWRpYUl0ZW1zLmdldChpbmRleCArIDEpLnNldEJlZ2luVHJhbnNpdGlvbihudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvQW5kcm9pZC5tayBiL21lZGlhL2puaS9BbmRyb2lkLm1rCmluZGV4IDcwZWQ2MDguLjI1ZDI0M2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2puaS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2puaS9BbmRyb2lkLm1rCkBAIC04LDcgKzgsMTEgQEAKICAgICBhbmRyb2lkX21lZGlhX01lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwIFwKICAgICBhbmRyb2lkX21lZGlhX1Jlc2FtcGxlSW5wdXRTdHJlYW0uY3BwIFwKICAgICBhbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXMuY3BwIFwKLSAgICBhbmRyb2lkX21lZGlhX0FtcklucHV0U3RyZWFtLmNwcAorICAgIGFuZHJvaWRfbWVkaWFfQW1ySW5wdXRTdHJlYW0uY3BwIFwKKwlhbmRyb2lkX21lZGlhX010cENsaWVudC5jcHAgXAorCWFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yLmNwcCBcCisJYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZS5jcHAgXAorCWFuZHJvaWRfbWVkaWFfTXRwU2VydmVyLmNwcCBcCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYmFuZHJvaWRfcnVudGltZSBcCkBAIC0yMSw5ICsyNSwxMiBAQAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlic3VyZmFjZWZsaW5nZXJfY2xpZW50IFwKICAgICBsaWJzdGFnZWZyaWdodCBcCi0gICAgbGliY2FtZXJhX2NsaWVudAorICAgIGxpYmNhbWVyYV9jbGllbnQgXAorCWxpYnNxbGl0ZQogCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9CitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJtdHAgbGlidXNiaG9zdAorZW5kaWYKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgZXh0ZXJuYWwvdHJlbW9yL1RyZW1vciBcCkBAIC0zMiw2ICszOSw3IEBACiAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjIFwKICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbiBcCiAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZSBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL210cCBcCiAgICAgJChQVl9JTkNMVURFUykgXAogICAgICQoSk5JX0hfSU5DTFVERSkgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBjb3JlY2cgZ3JhcGhpY3MpCmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllci5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllci5jcHAKaW5kZXggNmY5NGU4Yi4uZDRhYWNhZiAxMDA2NDQKLS0tIGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUGxheWVyLmNwcApAQCAtNzg4LDYgKzc4OCwxMCBAQAogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX01lZGlhU2Nhbm5lcihKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfUmVzYW1wbGVJbnB1dFN0cmVhbShKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTWVkaWFQcm9maWxlcyhKTklFbnYgKmVudik7CitleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50KEpOSUVudiAqZW52KTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3IoSk5JRW52ICplbnYpOworZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cERhdGFiYXNlKEpOSUVudiAqZW52KTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXIoSk5JRW52ICplbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX0FtcklucHV0U3RyZWFtKEpOSUVudiAqZW52KTsKIAogamludCBKTklfT25Mb2FkKEphdmFWTSogdm0sIHZvaWQqIHJlc2VydmVkKQpAQCAtODM2LDYgKzg0MCwyNiBAQAogICAgICAgICBnb3RvIGJhaWw7CiAgICAgfQogCisgICAgaWYgKHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50KGVudikgPCAwKSB7CisgICAgICAgIExPR0UoIkVSUk9SOiBNdHBDbGllbnQgbmF0aXZlIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cEN1cnNvcihlbnYpIDwgMCkgeworICAgICAgICBMT0dFKCJFUlJPUjogTXRwQ3Vyc29yIG5hdGl2ZSByZWdpc3RyYXRpb24gZmFpbGVkIik7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAocmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZShlbnYpIDwgMCkgeworICAgICAgICBMT0dFKCJFUlJPUjogTXRwRGF0YWJhc2UgbmF0aXZlIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cFNlcnZlcihlbnYpIDwgMCkgeworICAgICAgICBMT0dFKCJFUlJPUjogTXRwU2VydmVyIG5hdGl2ZSByZWdpc3RyYXRpb24gZmFpbGVkIik7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKICAgICAvKiBzdWNjZXNzIC0tIHJldHVybiB2YWxpZCB2ZXJzaW9uIG51bWJlciAqLwogICAgIHJlc3VsdCA9IEpOSV9WRVJTSU9OXzFfNDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFQcm9maWxlcy5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzLmNwcAppbmRleCBjY2U5ZmQwLi4wOGE2ZGUxIDEwMDY0NAotLS0gYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzLmNwcAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzLmNwcApAQCAtMTY1LDcgKzE2NSw5IEBACiBhbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXNfbmF0aXZlX2dldF9jYW1jb3JkZXJfcHJvZmlsZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGlkLCBqaW50IHF1YWxpdHkpCiB7CiAgICAgTE9HVigibmF0aXZlX2dldF9jYW1jb3JkZXJfcHJvZmlsZTogJWQgJWQiLCBpZCwgcXVhbGl0eSk7Ci0gICAgaWYgKHF1YWxpdHkgIT0gQ0FNQ09SREVSX1FVQUxJVFlfSElHSCAmJiBxdWFsaXR5ICE9IENBTUNPUkRFUl9RVUFMSVRZX0xPVykgeworICAgIGlmICghKChxdWFsaXR5ID49IENBTUNPUkRFUl9RVUFMSVRZX0xPVyAmJiBxdWFsaXR5IDw9IENBTUNPUkRFUl9RVUFMSVRZXzEwODBQKSB8fAorICAgICAgICAgICAgICAgIChxdWFsaXR5ID49IENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTE9XICYmCisgICAgICAgICAgICAgICAgcXVhbGl0eSA8PSBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzEwODBQKSkpIHsKICAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24iLCAiVW5rbm93biBjYW1jb3JkZXIgcHJvZmlsZSBxdWFsaXR5Iik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTIxMCw2ICsyMTIsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9DaGFubmVscyk7CiB9CiAKK3N0YXRpYyBqYm9vbGVhbgorYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzX25hdGl2ZV9oYXNfY2FtY29yZGVyX3Byb2ZpbGUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBpZCwgamludCBxdWFsaXR5KQoreworICAgIExPR1YoIm5hdGl2ZV9oYXNfY2FtY29yZGVyX3Byb2ZpbGU6ICVkICVkIiwgaWQsIHF1YWxpdHkpOworICAgIGlmICghKChxdWFsaXR5ID49IENBTUNPUkRFUl9RVUFMSVRZX0xPVyAmJiBxdWFsaXR5IDw9IENBTUNPUkRFUl9RVUFMSVRZXzEwODBQKSB8fAorICAgICAgICAgICAgICAgIChxdWFsaXR5ID49IENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTE9XICYmCisgICAgICAgICAgICAgICAgcXVhbGl0eSA8PSBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzEwODBQKSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNhbWNvcmRlcl9xdWFsaXR5IHEgPSBzdGF0aWNfY2FzdDxjYW1jb3JkZXJfcXVhbGl0eT4ocXVhbGl0eSk7CisgICAgcmV0dXJuIHNQcm9maWxlcy0+aGFzQ2FtY29yZGVyUHJvZmlsZShpZCwgcSk7Cit9CisKIHN0YXRpYyBqaW50CiBhbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXNfbmF0aXZlX2dldF9udW1fdmlkZW9fZGVjb2RlcnMoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKIHsKQEAgLTI4OSw2ICszMDUsOCBAQAogICAgIHsibmF0aXZlX2luaXQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKClWIiwgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzX25hdGl2ZV9pbml0fSwKICAgICB7Im5hdGl2ZV9nZXRfY2FtY29yZGVyX3Byb2ZpbGUiLCAgICAgICAgICAgIihJSSlMYW5kcm9pZC9tZWRpYS9DYW1jb3JkZXJQcm9maWxlOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXNfbmF0aXZlX2dldF9jYW1jb3JkZXJfcHJvZmlsZX0sCisgICAgeyJuYXRpdmVfaGFzX2NhbWNvcmRlcl9wcm9maWxlIiwgICAgICAgICAgICIoSUkpWiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXNfbmF0aXZlX2hhc19jYW1jb3JkZXJfcHJvZmlsZX0sCiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzRm9yRGVjb2RlckNhcGFiaWxpdGllc0NsYXNzW10gPSB7CmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVJlY29yZGVyLmNwcCBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXIuY3BwCmluZGV4IGVmYTA4MTMuLjgyYjRhYzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXIuY3BwCkBAIC0yNjAsNiArMjYwLDIwIEBACiB9CiAKIHN0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXJfc2V0T3V0cHV0RmlsZUF1eEZEKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpvYmplY3QgZmlsZURlc2NyaXB0b3IpCit7CisgICAgTE9HVigic2V0T3V0cHV0RmlsZSIpOworICAgIGlmIChmaWxlRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQgZmQgPSBnZXRQYXJjZWxGaWxlRGVzY3JpcHRvckZEKGVudiwgZmlsZURlc2NyaXB0b3IpOworICAgIHNwPE1lZGlhUmVjb3JkZXI+IG1yID0gZ2V0TWVkaWFSZWNvcmRlcihlbnYsIHRoaXopOworICAgIHN0YXR1c190IG9wU3RhdHVzID0gbXItPnNldE91dHB1dEZpbGVBdXhpbGlhcnkoZmQpOworICAgIHByb2Nlc3NfbWVkaWFfcmVjb3JkZXJfY2FsbChlbnYsIG9wU3RhdHVzLCAiamF2YS9pby9JT0V4Y2VwdGlvbiIsICJzZXRPdXRwdXRGaWxlIGZhaWxlZC4iKTsKK30KKworc3RhdGljIHZvaWQKIGFuZHJvaWRfbWVkaWFfTWVkaWFSZWNvcmRlcl9zZXRWaWRlb1NpemUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCB3aWR0aCwgamludCBoZWlnaHQpCiB7CiAgICAgTE9HVigic2V0VmlkZW9TaXplKCVkLCAlZCkiLCB3aWR0aCwgaGVpZ2h0KTsKQEAgLTQ2Niw2ICs0ODAsNyBAQAogICAgIHsic2V0QXVkaW9FbmNvZGVyIiwgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVJlY29yZGVyX3NldEF1ZGlvRW5jb2Rlcn0sCiAgICAgeyJzZXRQYXJhbWV0ZXIiLCAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXJfc2V0UGFyYW1ldGVyfSwKICAgICB7Il9zZXRPdXRwdXRGaWxlIiwgICAgICAgIihMamF2YS9pby9GaWxlRGVzY3JpcHRvcjtKSilWIiwgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFSZWNvcmRlcl9zZXRPdXRwdXRGaWxlRkR9LAorICAgIHsiX3NldE91dHB1dEZpbGVBdXgiLCAgICAiKExqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yOylWIiwgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVJlY29yZGVyX3NldE91dHB1dEZpbGVBdXhGRH0sCiAgICAgeyJzZXRWaWRlb1NpemUiLCAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXJfc2V0VmlkZW9TaXplfSwKICAgICB7InNldFZpZGVvRnJhbWVSYXRlIiwgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFSZWNvcmRlcl9zZXRWaWRlb0ZyYW1lUmF0ZX0sCiAgICAgeyJzZXRNYXhEdXJhdGlvbiIsICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXJfc2V0TWF4RHVyYXRpb259LApkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhU2Nhbm5lci5jcHAKaW5kZXggMjczZjFhZi4uZmQwYjIzMyAxMDA2NDQKLS0tIGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVNjYW5uZXIuY3BwCkBAIC0xNDYsNyArMTQ2LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWFuZHJvaWRfbWVkaWFfTWVkaWFTY2FubmVyX3Byb2Nlc3NEaXJlY3RvcnkoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwganN0cmluZyBwYXRoLCBqc3RyaW5nIGV4dGVuc2lvbnMsIGpvYmplY3QgY2xpZW50KQorYW5kcm9pZF9tZWRpYV9NZWRpYVNjYW5uZXJfcHJvY2Vzc0RpcmVjdG9yeShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqc3RyaW5nIHBhdGgsIGpvYmplY3QgY2xpZW50KQogewogICAgIE1lZGlhU2Nhbm5lciAqbXAgPSAoTWVkaWFTY2FubmVyICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZHMuY29udGV4dCk7CiAKQEAgLTE1NCwyNyArMTU0LDE2IEBACiAgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLCBOVUxMKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBpZiAoZXh0ZW5zaW9ucyA9PSBOVUxMKSB7Ci0gICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLCBOVUxMKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKKwogICAgIGNvbnN0IGNoYXIgKnBhdGhTdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHBhdGgsIE5VTEwpOwogICAgIGlmIChwYXRoU3RyID09IE5VTEwpIHsgIC8vIE91dCBvZiBtZW1vcnkKICAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24iLCAiT3V0IG9mIG1lbW9yeSIpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNTdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGV4dGVuc2lvbnMsIE5VTEwpOwotICAgIGlmIChleHRlbnNpb25zU3RyID09IE5VTEwpIHsgIC8vIE91dCBvZiBtZW1vcnkKLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMocGF0aCwgcGF0aFN0cik7Ci0gICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uIiwgIk91dCBvZiBtZW1vcnkiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KIAogICAgIE15TWVkaWFTY2FubmVyQ2xpZW50IG15Q2xpZW50KGVudiwgY2xpZW50KTsKLSAgICBtcC0+cHJvY2Vzc0RpcmVjdG9yeShwYXRoU3RyLCBleHRlbnNpb25zU3RyLCBteUNsaWVudCwgRXhjZXB0aW9uQ2hlY2ssIGVudik7CisgICAgbXAtPnByb2Nlc3NEaXJlY3RvcnkocGF0aFN0ciwgbXlDbGllbnQsIEV4Y2VwdGlvbkNoZWNrLCBlbnYpOwogICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHBhdGgsIHBhdGhTdHIpOwotICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGV4dGVuc2lvbnMsIGV4dGVuc2lvbnNTdHIpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMzA5LDkgKzI5OCw5IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKLSAgICB7InByb2Nlc3NEaXJlY3RvcnkiLCAgIihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztMYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQ7KVYiLCAgICAKKyAgICB7InByb2Nlc3NEaXJlY3RvcnkiLCAgIihMamF2YS9sYW5nL1N0cmluZztMYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQ7KVYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFTY2FubmVyX3Byb2Nlc3NEaXJlY3Rvcnl9LAotICAgIHsicHJvY2Vzc0ZpbGUiLCAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lckNsaWVudDspViIsICAgIAorICAgIHsicHJvY2Vzc0ZpbGUiLCAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lckNsaWVudDspViIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVNjYW5uZXJfcHJvY2Vzc0ZpbGV9LAogICAgIHsic2V0TG9jYWxlIiwgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFTY2FubmVyX3NldExvY2FsZX0sCiAgICAgeyJleHRyYWN0QWxidW1BcnQiLCAgICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7KVtCIiwgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVNjYW5uZXJfZXh0cmFjdEFsYnVtQXJ0fSwKZGlmZiAtLWdpdCBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cENsaWVudC5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMzE4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQuY3BwCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBDbGllbnRKTkkiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJKTklIZWxwLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCisKKyNpbmNsdWRlICJNdHBDbGllbnQuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2UuaCIKKyNpbmNsdWRlICJNdHBPYmplY3RJbmZvLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2RldmljZUFkZGVkOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZGV2aWNlUmVtb3ZlZDsKK3N0YXRpYyBqZmllbGRJRCBmaWVsZF9jb250ZXh0OworCitzdGF0aWMgc3RydWN0IGZpbGVfZGVzY3JpcHRvcl9vZmZzZXRzX3QKK3sKKyAgICBqY2xhc3MgbUNsYXNzOworICAgIGptZXRob2RJRCBtQ29uc3RydWN0b3I7CisgICAgamZpZWxkSUQgbURlc2NyaXB0b3I7Cit9IGdGaWxlRGVzY3JpcHRvck9mZnNldHM7CisKK3N0YXRpYyBzdHJ1Y3QgcGFyY2VsX2ZpbGVfZGVzY3JpcHRvcl9vZmZzZXRzX3QKK3sKKyAgICBqY2xhc3MgbUNsYXNzOworICAgIGptZXRob2RJRCBtQ29uc3RydWN0b3I7Cit9IGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHM7CisKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKworc3RhdGljIHZvaWQgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhKTklFbnYqIGVudiwgY29uc3QgY2hhciogbWV0aG9kTmFtZSkgeworICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgICAgTE9HRSgiQW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnkgY2FsbGJhY2sgJyVzJy4iLCBtZXRob2ROYW1lKTsKKyAgICAgICAgTE9HRV9FWChlbnYpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgfQorfQorCitjbGFzcyBNeUNsaWVudCA6IHB1YmxpYyBNdHBDbGllbnQgeworcHJpdmF0ZToKKyAgICB2aXJ0dWFsIHZvaWQgICAgZGV2aWNlQWRkZWQoTXRwRGV2aWNlICpkZXZpY2UpOworICAgIHZpcnR1YWwgdm9pZCAgICBkZXZpY2VSZW1vdmVkKE10cERldmljZSAqZGV2aWNlKTsKKworICAgIGpvYmplY3QgICAgICAgICBtQ2xpZW50OworICAgIE10cERldmljZSogICAgICBtRXZlbnREZXZpY2U7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgTXlDbGllbnQoSk5JRW52ICplbnYsIGpvYmplY3QgY2xpZW50KTsKKyAgICB2b2lkICAgICAgICAgICAgY2xlYW51cChKTklFbnYgKmVudik7Cit9OworCitNdHBDbGllbnQqIGdldF9jbGllbnRfZnJvbV9vYmplY3QoSk5JRW52KiBlbnYsIGpvYmplY3QgamF2YUNsaWVudCkKK3sKKyAgICByZXR1cm4gKE10cENsaWVudCopZW52LT5HZXRJbnRGaWVsZChqYXZhQ2xpZW50LCBmaWVsZF9jb250ZXh0KTsKK30KKworCitNeUNsaWVudDo6TXlDbGllbnQoSk5JRW52ICplbnYsIGpvYmplY3QgY2xpZW50KQorICAgIDogICBtQ2xpZW50KGVudi0+TmV3R2xvYmFsUmVmKGNsaWVudCkpCit7Cit9CisKK3ZvaWQgTXlDbGllbnQ6OmNsZWFudXAoSk5JRW52ICplbnYpIHsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQ2xpZW50KTsKK30KKwordm9pZCBNeUNsaWVudDo6ZGV2aWNlQWRkZWQoTXRwRGV2aWNlICpkZXZpY2UpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gZGV2aWNlLT5nZXREZXZpY2VOYW1lKCk7CisgICAgTE9HRCgiTXlDbGllbnQ6OmRldmljZUFkZGVkICVzXG4iLCBuYW1lKTsKKworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUNsaWVudCwgbWV0aG9kX2RldmljZUFkZGVkLCBkZXZpY2UtPmdldElEKCkpOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7Cit9CisKK3ZvaWQgTXlDbGllbnQ6OmRldmljZVJlbW92ZWQoTXRwRGV2aWNlICpkZXZpY2UpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gZGV2aWNlLT5nZXREZXZpY2VOYW1lKCk7CisgICAgTE9HRCgiTXlDbGllbnQ6OmRldmljZVJlbW92ZWQgJXNcbiIsIG5hbWUpOworCisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQ2xpZW50LCBtZXRob2RfZGV2aWNlUmVtb3ZlZCwgZGV2aWNlLT5nZXRJRCgpKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworfQorCisjZW5kaWYgLy8gSEFWRV9BTkRST0lEX09TCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3NldHVwKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic2V0dXBcbiIpOworICAgIE15Q2xpZW50KiBjbGllbnQgPSBuZXcgTXlDbGllbnQoZW52LCB0aGl6KTsKKyAgICBjbGllbnQtPnN0YXJ0KCk7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAoaW50KWNsaWVudCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2ZpbmFsaXplKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgiZmluYWxpemVcbiIpOworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGNsaWVudC0+Y2xlYW51cChlbnYpOworICAgIGRlbGV0ZSBjbGllbnQ7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAwKTsKKyNlbmRpZgorfQorCitzdGF0aWMgamJvb2xlYW4KK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3N0YXJ0KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic3RhcnRcbiIpOworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIHJldHVybiBjbGllbnQtPnN0YXJ0KCk7CisjZWxzZQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfc3RvcChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInN0b3BcbiIpOworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGNsaWVudC0+c3RvcCgpOworI2VuZGlmCit9CisKK3N0YXRpYyBqYm9vbGVhbgorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZGVsZXRlX29iamVjdChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LAorICAgICAgICBqaW50IGRldmljZV9pZCwgamxvbmcgb2JqZWN0X2lkKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIE10cERldmljZSogZGV2aWNlID0gY2xpZW50LT5nZXREZXZpY2UoZGV2aWNlX2lkKTsKKyAgICBpZiAoZGV2aWNlKQorICAgICAgICByZXR1cm4gZGV2aWNlLT5kZWxldGVPYmplY3Qob2JqZWN0X2lkKTsKKyAgICBlbHNlCisgI2VuZGlmCisgICAgICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgamxvbmcKK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2dldF9wYXJlbnQoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwKKyAgICAgICAgamludCBkZXZpY2VfaWQsIGpsb25nIG9iamVjdF9pZCkKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBNeUNsaWVudCAqY2xpZW50ID0gKE15Q2xpZW50ICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IGNsaWVudC0+Z2V0RGV2aWNlKGRldmljZV9pZCk7CisgICAgaWYgKGRldmljZSkKKyAgICAgICAgcmV0dXJuIGRldmljZS0+Z2V0UGFyZW50KG9iamVjdF9pZCk7CisgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGpsb25nCithbmRyb2lkX21lZGlhX010cENsaWVudF9nZXRfc3RvcmFnZV9pZChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LAorICAgICAgICBqaW50IGRldmljZV9pZCwgamxvbmcgb2JqZWN0X2lkKQoreworICNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBNeUNsaWVudCAqY2xpZW50ID0gKE15Q2xpZW50ICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IGNsaWVudC0+Z2V0RGV2aWNlKGRldmljZV9pZCk7CisgICAgaWYgKGRldmljZSkKKyAgICAgICAgcmV0dXJuIGRldmljZS0+Z2V0U3RvcmFnZUlEKG9iamVjdF9pZCk7CisgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGpvYmplY3QKK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X29wZW5fZmlsZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LAorICAgICAgICBqaW50IGRldmljZV9pZCwgamxvbmcgb2JqZWN0X2lkKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIE10cERldmljZSogZGV2aWNlID0gY2xpZW50LT5nZXREZXZpY2UoZGV2aWNlX2lkKTsKKyAgICBpZiAoIWRldmljZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gZGV2aWNlLT5nZXRPYmplY3RJbmZvKG9iamVjdF9pZCk7CisgICAgaWYgKCFpbmZvKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpbnQgb2JqZWN0X3NpemUgPSBpbmZvLT5tQ29tcHJlc3NlZFNpemU7CisgICAgZGVsZXRlIGluZm87CisgICAgaW50IGZkID0gZGV2aWNlLT5yZWFkT2JqZWN0KG9iamVjdF9pZCwgb2JqZWN0X3NpemUpOworICAgIGlmIChmZCA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgam9iamVjdCBmaWxlRGVzY3JpcHRvciA9IGVudi0+TmV3T2JqZWN0KGdGaWxlRGVzY3JpcHRvck9mZnNldHMubUNsYXNzLAorICAgICAgICBnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1Db25zdHJ1Y3Rvcik7CisgICAgaWYgKGZpbGVEZXNjcmlwdG9yICE9IE5VTEwpIHsKKyAgICAgICAgZW52LT5TZXRJbnRGaWVsZChmaWxlRGVzY3JpcHRvciwgZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tRGVzY3JpcHRvciwgZmQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZW52LT5OZXdPYmplY3QoZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ2xhc3MsCisgICAgICAgIGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yLCBmaWxlRGVzY3JpcHRvcik7CisjZW5kaWYKKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgICAgeyJuYXRpdmVfc2V0dXAiLCAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9zZXR1cH0sCisgICAgeyJuYXRpdmVfZmluYWxpemUiLCAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9maW5hbGl6ZX0sCisgICAgeyJuYXRpdmVfc3RhcnQiLCAgICAgICAgICAgICIoKVoiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9zdGFydH0sCisgICAgeyJuYXRpdmVfc3RvcCIsICAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9zdG9wfSwKKyAgICB7Im5hdGl2ZV9kZWxldGVfb2JqZWN0IiwgICAiKElKKVoiLCAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2RlbGV0ZV9vYmplY3R9LAorICAgIHsibmF0aXZlX2dldF9wYXJlbnQiLCAgICAgICIoSUopSiIsICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZ2V0X3BhcmVudH0sCisgICAgeyJuYXRpdmVfZ2V0X3N0b3JhZ2VfaWQiLCAgIihJSilKIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9nZXRfc3RvcmFnZV9pZH0sCisgICAgeyJuYXRpdmVfb3Blbl9maWxlIiwgICAgICAgIihJSilMYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvcjsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfb3Blbl9maWxlfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrQ2xhc3NQYXRoTmFtZSA9ICJhbmRyb2lkL21lZGlhL010cENsaWVudCI7CisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cENsaWVudChKTklFbnYgKmVudikKK3sKKyAgICBqY2xhc3MgY2xheno7CisKKyAgICBMT0dEKCJyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cENsaWVudFxuIik7CisKKyAgICBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL010cENsaWVudCIpOworICAgIGlmIChjbGF6eiA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZGV2aWNlQWRkZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZGV2aWNlQWRkZWQiLCAiKEkpViIpOworICAgIGlmIChtZXRob2RfZGV2aWNlQWRkZWQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGRldmljZUFkZGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2RldmljZVJlbW92ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZGV2aWNlUmVtb3ZlZCIsICIoSSlWIik7CisgICAgaWYgKG1ldGhvZF9kZXZpY2VSZW1vdmVkID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBkZXZpY2VSZW1vdmVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZmllbGRfY29udGV4dCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgIm1OYXRpdmVDb250ZXh0IiwgIkkiKTsKKyAgICBpZiAoZmllbGRfY29udGV4dCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgTXRwQ2xpZW50Lm1OYXRpdmVDb250ZXh0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImphdmEvaW8vRmlsZURlc2NyaXB0b3IiKTsKKyAgICBMT0dfRkFUQUxfSUYoY2xhenogPT0gTlVMTCwgIlVuYWJsZSB0byBmaW5kIGNsYXNzIGphdmEuaW8uRmlsZURlc2NyaXB0b3IiKTsKKyAgICBnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1DbGFzcyA9IChqY2xhc3MpIGVudi0+TmV3R2xvYmFsUmVmKGNsYXp6KTsKKyAgICBnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1Db25zdHJ1Y3RvciA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICI8aW5pdD4iLCAiKClWIik7CisgICAgZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tRGVzY3JpcHRvciA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgImRlc2NyaXB0b3IiLCAiSSIpOworICAgIExPR19GQVRBTF9JRihnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1EZXNjcmlwdG9yID09IE5VTEwsCisgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZmluZCBkZXNjcmlwdG9yIGZpZWxkIGluIGphdmEuaW8uRmlsZURlc2NyaXB0b3IiKTsKKworICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvciIpOworICAgIExPR19GQVRBTF9JRihjbGF6eiA9PSBOVUxMLCAiVW5hYmxlIHRvIGZpbmQgY2xhc3MgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIpOworICAgIGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNsYXNzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYoY2xhenopOworICAgIGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIjxpbml0PiIsICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7KVYiKTsKKyAgICBMT0dfRkFUQUxfSUYoZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ29uc3RydWN0b3IgPT0gTlVMTCwKKyAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBmaW5kIGNvbnN0cnVjdG9yIGZvciBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIik7CisKKyAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsCisgICAgICAgICAgICAgICAgImFuZHJvaWQvbWVkaWEvTXRwQ2xpZW50IiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3IuY3BwIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTBhZThhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yLmNwcApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwQ3Vyc29ySk5JIgorI2luY2x1ZGUgInV0aWxzL0xvZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAiSk5JSGVscC5oIgorI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgorI2luY2x1ZGUgImJpbmRlci9DdXJzb3JXaW5kb3cuaCIKKworI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cEN1cnNvci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgamZpZWxkSUQgZmllbGRfY29udGV4dDsKKworLy8gRnJvbSBhbmRyb2lkX21lZGlhX010cENsaWVudC5jcHAKK010cENsaWVudCAqIGdldF9jbGllbnRfZnJvbV9vYmplY3QoSk5JRW52ICogZW52LCBqb2JqZWN0IGphdmFDbGllbnQpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBib29sIEV4Y2VwdGlvbkNoZWNrKHZvaWQqIGVudikKK3sKKyAgICByZXR1cm4gKChKTklFbnYgKillbnYpLT5FeGNlcHRpb25DaGVjaygpOworfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3Jfc2V0dXAoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgam9iamVjdCBqYXZhQ2xpZW50LAorICAgICAgICBqaW50IHF1ZXJ5VHlwZSwgamludCBkZXZpY2VJRCwgamxvbmcgc3RvcmFnZUlELCBqbG9uZyBvYmplY3RJRCwgamludEFycmF5IGphdmFDb2x1bW5zKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoImFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX3NldHVwIHF1ZXJ5VHlwZTogJWQgZGV2aWNlSUQ6ICVkIHN0b3JhZ2VJRDogJWxsZCBvYmplY3RJRDogJWxsZFxuIiwKKyAgICAgICAgICAgICAgICBxdWVyeVR5cGUsIGRldmljZUlELCBzdG9yYWdlSUQsIG9iamVjdElEKTsKKworICAgIGludCogY29sdW1ucyA9IE5VTEw7CisgICAgaW50IGNvbHVtbkNvdW50ID0gMDsKKyAgICBpZiAoamF2YUNvbHVtbnMpIHsKKyAgICAgICAgY29sdW1ucyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhqYXZhQ29sdW1ucywgMCk7CisgICAgICAgIGNvbHVtbkNvdW50ID0gZW52LT5HZXRBcnJheUxlbmd0aChqYXZhQ29sdW1ucyk7CisgICAgfQorCisgICAgTXRwQ2xpZW50KiBjbGllbnQgPSBnZXRfY2xpZW50X2Zyb21fb2JqZWN0KGVudiwgamF2YUNsaWVudCk7CisgICAgTXRwQ3Vyc29yKiBjdXJzb3IgPSBuZXcgTXRwQ3Vyc29yKGNsaWVudCwgcXVlcnlUeXBlLAorICAgICAgICAgICAgZGV2aWNlSUQsIHN0b3JhZ2VJRCwgb2JqZWN0SUQsIGNvbHVtbkNvdW50LCBjb2x1bW5zKTsKKworICAgIGlmIChjb2x1bW5zKQorICAgICAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGphdmFDb2x1bW5zLCBjb2x1bW5zLCAwKTsKKyAgICBlbnYtPlNldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQsIChpbnQpY3Vyc29yKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3JfZmluYWxpemUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJmaW5hbGl6ZVxuIik7CisgICAgTXRwQ3Vyc29yICpjdXJzb3IgPSAoTXRwQ3Vyc29yICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBkZWxldGUgY3Vyc29yOworI2VuZGlmCit9CisKK3N0YXRpYyBqaW50CithbmRyb2lkX21lZGlhX010cEN1cnNvcl9maWxsX3dpbmRvdyhKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqb2JqZWN0IGphdmFXaW5kb3csIGppbnQgc3RhcnRQb3MpCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgQ3Vyc29yV2luZG93KiB3aW5kb3cgPSBnZXRfd2luZG93X2Zyb21fb2JqZWN0KGVudiwgamF2YVdpbmRvdyk7CisgICAgaWYgKCF3aW5kb3cpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBDdXJzb3JXaW5kb3ciKTsKKyAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgQ3Vyc29yV2luZG93Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBNdHBDdXJzb3IgKmN1cnNvciA9IChNdHBDdXJzb3IgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworCisgICAgcmV0dXJuIGN1cnNvci0+ZmlsbFdpbmRvdyh3aW5kb3csIHN0YXJ0UG9zKTsKKyNlbHNlCisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgICAgeyJuYXRpdmVfc2V0dXAiLCAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvTXRwQ2xpZW50O0lJSkpbSSlWIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX3NldHVwfSwKKyAgICB7Im5hdGl2ZV9maW5hbGl6ZSIsICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX2ZpbmFsaXplfSwKKyAgICB7Im5hdGl2ZV9maWxsX3dpbmRvdyIsICAgICAgIihMYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3c7SSlJIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX2ZpbGxfd2luZG93fSwKKworfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yIjsKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yKEpOSUVudiAqZW52KQoreworICAgIGpjbGFzcyBjbGF6ejsKKworICAgIExPR0QoInJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yXG4iKTsKKworICAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yIik7CisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBhbmRyb2lkL21lZGlhL010cEN1cnNvciIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZpZWxkX2NvbnRleHQgPSBlbnYtPkdldEZpZWxkSUQoY2xhenosICJtTmF0aXZlQ29udGV4dCIsICJJIik7CisgICAgaWYgKGZpZWxkX2NvbnRleHQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIE10cEN1cnNvci5tTmF0aXZlQ29udGV4dCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LAorICAgICAgICAgICAgICAgICJhbmRyb2lkL21lZGlhL010cEN1cnNvciIsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2UuY3BwIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YmY2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZS5jcHAKQEAgLTAsMCArMSwxMDE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBEYXRhYmFzZUpOSSIKKyNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgIkpOSUhlbHAuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKworI2luY2x1ZGUgIk10cERhdGFiYXNlLmgiCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFByb3BlcnR5LmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisjaW5jbHVkZSAiTXRwVXRpbHMuaCIKKyNpbmNsdWRlICJtdHAuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGptZXRob2RJRCBtZXRob2RfYmVnaW5TZW5kT2JqZWN0Oworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZW5kU2VuZE9iamVjdDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldE9iamVjdExpc3Q7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXROdW1PYmplY3RzOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHM7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllczsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldE9iamVjdFByb3BlcnR5Oworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfc2V0T2JqZWN0UHJvcGVydHk7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXREZXZpY2VQcm9wZXJ0eTsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX3NldERldmljZVByb3BlcnR5Oworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0T2JqZWN0SW5mbzsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldE9iamVjdEZpbGVQYXRoOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZGVsZXRlRmlsZTsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldE9iamVjdFJlZmVyZW5jZXM7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9zZXRPYmplY3RSZWZlcmVuY2VzOworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfc2Vzc2lvblN0YXJ0ZWQ7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9zZXNzaW9uRW5kZWQ7CisKK3N0YXRpYyBqZmllbGRJRCBmaWVsZF9jb250ZXh0OworCitNdHBEYXRhYmFzZSogZ2V0TXRwRGF0YWJhc2UoSk5JRW52ICplbnYsIGpvYmplY3QgZGF0YWJhc2UpIHsKKyAgICByZXR1cm4gKE10cERhdGFiYXNlICopZW52LT5HZXRJbnRGaWVsZChkYXRhYmFzZSwgZmllbGRfY29udGV4dCk7Cit9CisKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTXlNdHBEYXRhYmFzZSA6IHB1YmxpYyBNdHBEYXRhYmFzZSB7Citwcml2YXRlOgorICAgIGpvYmplY3QgICAgICAgICBtRGF0YWJhc2U7CisgICAgamludEFycmF5ICAgICAgIG1JbnRCdWZmZXI7CisgICAgamxvbmdBcnJheSAgICAgIG1Mb25nQnVmZmVyOworICAgIGpjaGFyQXJyYXkgICAgICBtU3RyaW5nQnVmZmVyOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNeU10cERhdGFiYXNlKEpOSUVudiAqZW52LCBqb2JqZWN0IGNsaWVudCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgICAgICAgICB+TXlNdHBEYXRhYmFzZSgpOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW51cChKTklFbnYgKmVudik7CisKKyAgICB2aXJ0dWFsIE10cE9iamVjdEhhbmRsZSAgICAgICAgIGJlZ2luU2VuZE9iamVjdChjb25zdCBjaGFyKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV90IG1vZGlmaWVkKTsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgZW5kU2VuZE9iamVjdChjb25zdCBjaGFyKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2NlZWRlZCk7CisKKyAgICB2aXJ0dWFsIE10cE9iamVjdEhhbmRsZUxpc3QqICAgIGdldE9iamVjdExpc3QoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KTsKKworICAgIHZpcnR1YWwgaW50ICAgICAgICAgICAgICAgICAgICAgZ2V0TnVtT2JqZWN0cyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KTsKKworICAgIC8vIGNhbGxlZSBzaG91bGQgZGVsZXRlW10gdGhlIHJlc3VsdHMgZnJvbSB0aGVzZQorICAgIC8vIHJlc3VsdHMgY2FuIGJlIE5VTEwKKyAgICB2aXJ0dWFsIE10cE9iamVjdEZvcm1hdExpc3QqICAgIGdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cygpOworICAgIHZpcnR1YWwgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMoKTsKKyAgICB2aXJ0dWFsIE10cE9iamVjdFByb3BlcnR5TGlzdCogIGdldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMoTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCk7CisgICAgdmlydHVhbCBNdHBEZXZpY2VQcm9wZXJ0eUxpc3QqICBnZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzKCk7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdFByb3BlcnR5VmFsdWUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIHNldE9iamVjdFByb3BlcnR5VmFsdWUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldERldmljZVByb3BlcnR5VmFsdWUoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIHNldERldmljZVByb3BlcnR5VmFsdWUoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIHJlc2V0RGV2aWNlUHJvcGVydHkoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdEZpbGVQYXRoKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZyYgZmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QmIGZpbGVMZW5ndGgpOworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZGVsZXRlRmlsZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T2JqZWN0UHJvcGVydHlJbmZvKE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LCBpbnQmIHR5cGUpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlUHJvcGVydHlJbmZvKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5LCBpbnQmIHR5cGUpOworCisgICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGVMaXN0KiAgICBnZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBzZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIHJlZmVyZW5jZXMpOworCisgICAgdmlydHVhbCBNdHBQcm9wZXJ0eSogICAgICAgICAgICBnZXRPYmplY3RQcm9wZXJ0eURlc2MoTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQpOworCisgICAgdmlydHVhbCBNdHBQcm9wZXJ0eSogICAgICAgICAgICBnZXREZXZpY2VQcm9wZXJ0eURlc2MoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpOworCisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBzZXNzaW9uU3RhcnRlZCgpOworCisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBzZXNzaW9uRW5kZWQoKTsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhKTklFbnYqIGVudiwgY29uc3QgY2hhciogbWV0aG9kTmFtZSkgeworICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgICAgTE9HRSgiQW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnkgY2FsbGJhY2sgJyVzJy4iLCBtZXRob2ROYW1lKTsKKyAgICAgICAgTE9HRV9FWChlbnYpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK015TXRwRGF0YWJhc2U6Ok15TXRwRGF0YWJhc2UoSk5JRW52ICplbnYsIGpvYmplY3QgY2xpZW50KQorICAgIDogICBtRGF0YWJhc2UoZW52LT5OZXdHbG9iYWxSZWYoY2xpZW50KSksCisgICAgICAgIG1JbnRCdWZmZXIoTlVMTCksCisgICAgICAgIG1Mb25nQnVmZmVyKE5VTEwpLAorICAgICAgICBtU3RyaW5nQnVmZmVyKE5VTEwpCit7CisgICAgamludEFycmF5IGludEFycmF5OworICAgIGpsb25nQXJyYXkgbG9uZ0FycmF5OworICAgIGpjaGFyQXJyYXkgY2hhckFycmF5OworCisgICAgLy8gY3JlYXRlIGJ1ZmZlcnMgZm9yIG91dCBhcmd1bWVudHMKKyAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGJlIHRocmVhZC1zYWZlIHNvIHRoaXMgaXMgT0sKKyAgICBpbnRBcnJheSA9IGVudi0+TmV3SW50QXJyYXkoMyk7CisgICAgaWYgKCFpbnRBcnJheSkKKyAgICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OworICAgIG1JbnRCdWZmZXIgPSAoamludEFycmF5KWVudi0+TmV3R2xvYmFsUmVmKGludEFycmF5KTsKKyAgICBsb25nQXJyYXkgPSBlbnYtPk5ld0xvbmdBcnJheSgyKTsKKyAgICBpZiAoIWxvbmdBcnJheSkKKyAgICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OworICAgIG1Mb25nQnVmZmVyID0gKGpsb25nQXJyYXkpZW52LT5OZXdHbG9iYWxSZWYobG9uZ0FycmF5KTsKKyAgICBjaGFyQXJyYXkgPSBlbnYtPk5ld0NoYXJBcnJheSgyNTYpOworICAgIGlmICghY2hhckFycmF5KQorICAgICAgICBnb3RvIG91dF9vZl9tZW1vcnk7CisgICAgbVN0cmluZ0J1ZmZlciA9IChqY2hhckFycmF5KWVudi0+TmV3R2xvYmFsUmVmKGNoYXJBcnJheSk7CisgICAgcmV0dXJuOworCitvdXRfb2ZfbWVtb3J5OgorICAgIGVudi0+VGhyb3dOZXcoZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9PdXRPZk1lbW9yeUVycm9yIiksIE5VTEwpOworfQorCit2b2lkIE15TXRwRGF0YWJhc2U6OmNsZWFudXAoSk5JRW52ICplbnYpIHsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtRGF0YWJhc2UpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1JbnRCdWZmZXIpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1Mb25nQnVmZmVyKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtU3RyaW5nQnVmZmVyKTsKK30KKworTXlNdHBEYXRhYmFzZTo6fk15TXRwRGF0YWJhc2UoKSB7Cit9CisKK010cE9iamVjdEhhbmRsZSBNeU10cERhdGFiYXNlOjpiZWdpblNlbmRPYmplY3QoY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBtb2RpZmllZCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGpzdHJpbmcgcGF0aFN0ciA9IGVudi0+TmV3U3RyaW5nVVRGKHBhdGgpOworICAgIE10cE9iamVjdEhhbmRsZSByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfYmVnaW5TZW5kT2JqZWN0LAorICAgICAgICAgICAgcGF0aFN0ciwgKGppbnQpZm9ybWF0LCAoamludClwYXJlbnQsIChqaW50KXN0b3JhZ2UsCisgICAgICAgICAgICAoamxvbmcpc2l6ZSwgKGpsb25nKW1vZGlmaWVkKTsKKworICAgIGlmIChwYXRoU3RyKQorICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKHBhdGhTdHIpOworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgTXlNdHBEYXRhYmFzZTo6ZW5kU2VuZE9iamVjdChjb25zdCBjaGFyKiBwYXRoLCBNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LCBib29sIHN1Y2NlZWRlZCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGpzdHJpbmcgcGF0aFN0ciA9IGVudi0+TmV3U3RyaW5nVVRGKHBhdGgpOworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZW5kU2VuZE9iamVjdCwgcGF0aFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSwgKGppbnQpZm9ybWF0LCAoamJvb2xlYW4pc3VjY2VlZGVkKTsKKworICAgIGlmIChwYXRoU3RyKQorICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKHBhdGhTdHIpOworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworfQorCitNdHBPYmplY3RIYW5kbGVMaXN0KiBNeU10cERhdGFiYXNlOjpnZXRPYmplY3RMaXN0KE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGppbnRBcnJheSBhcnJheSA9IChqaW50QXJyYXkpZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX2dldE9iamVjdExpc3QsCisgICAgICAgICAgICAgICAgKGppbnQpc3RvcmFnZUlELCAoamludClmb3JtYXQsIChqaW50KXBhcmVudCk7CisgICAgaWYgKCFhcnJheSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogbGlzdCA9IG5ldyBNdHBPYmplY3RIYW5kbGVMaXN0KCk7CisgICAgamludCogaGFuZGxlcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhhcnJheSwgMCk7CisgICAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnJheSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgbGlzdC0+cHVzaChoYW5kbGVzW2ldKTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBoYW5kbGVzLCAwKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGFycmF5KTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBsaXN0OworfQorCitpbnQgTXlNdHBEYXRhYmFzZTo6Z2V0TnVtT2JqZWN0cyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXROdW1PYmplY3RzLAorICAgICAgICAgICAgICAgIChqaW50KXN0b3JhZ2VJRCwgKGppbnQpZm9ybWF0LCAoamludClwYXJlbnQpOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworTXRwT2JqZWN0Rm9ybWF0TGlzdCogTXlNdHBEYXRhYmFzZTo6Z2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzKCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGppbnRBcnJheSBhcnJheSA9IChqaW50QXJyYXkpZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1EYXRhYmFzZSwKKyAgICAgICAgICAgIG1ldGhvZF9nZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMpOworICAgIGlmICghYXJyYXkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cE9iamVjdEZvcm1hdExpc3QqIGxpc3QgPSBuZXcgTXRwT2JqZWN0Rm9ybWF0TGlzdCgpOworICAgIGppbnQqIGZvcm1hdHMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoYXJyYXksIDApOworICAgIGpzaXplIGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoYXJyYXkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIGxpc3QtPnB1c2goZm9ybWF0c1tpXSk7CisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhhcnJheSwgZm9ybWF0cywgMCk7CisgICAgZW52LT5EZWxldGVMb2NhbFJlZihhcnJheSk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gbGlzdDsKK30KKworTXRwT2JqZWN0Rm9ybWF0TGlzdCogTXlNdHBEYXRhYmFzZTo6Z2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMoKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludEFycmF5IGFycmF5ID0gKGppbnRBcnJheSllbnYtPkNhbGxPYmplY3RNZXRob2QobURhdGFiYXNlLAorICAgICAgICAgICAgbWV0aG9kX2dldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzKTsKKyAgICBpZiAoIWFycmF5KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBPYmplY3RGb3JtYXRMaXN0KiBsaXN0ID0gbmV3IE10cE9iamVjdEZvcm1hdExpc3QoKTsKKyAgICBqaW50KiBmb3JtYXRzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGFycmF5LCAwKTsKKyAgICBqc2l6ZSBsZW5ndGggPSBlbnYtPkdldEFycmF5TGVuZ3RoKGFycmF5KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICBsaXN0LT5wdXNoKGZvcm1hdHNbaV0pOworICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoYXJyYXksIGZvcm1hdHMsIDApOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoYXJyYXkpOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIGxpc3Q7Cit9CisKK010cE9iamVjdFByb3BlcnR5TGlzdCogTXlNdHBEYXRhYmFzZTo6Z2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyhNdHBPYmplY3RGb3JtYXQgZm9ybWF0KSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludEFycmF5IGFycmF5ID0gKGppbnRBcnJheSllbnYtPkNhbGxPYmplY3RNZXRob2QobURhdGFiYXNlLAorICAgICAgICAgICAgbWV0aG9kX2dldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMsIChqaW50KWZvcm1hdCk7CisgICAgaWYgKCFhcnJheSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwT2JqZWN0UHJvcGVydHlMaXN0KiBsaXN0ID0gbmV3IE10cE9iamVjdFByb3BlcnR5TGlzdCgpOworICAgIGppbnQqIHByb3BlcnRpZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoYXJyYXksIDApOworICAgIGpzaXplIGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoYXJyYXkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIGxpc3QtPnB1c2gocHJvcGVydGllc1tpXSk7CisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhhcnJheSwgcHJvcGVydGllcywgMCk7CisgICAgZW52LT5EZWxldGVMb2NhbFJlZihhcnJheSk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gbGlzdDsKK30KKworTXRwRGV2aWNlUHJvcGVydHlMaXN0KiBNeU10cERhdGFiYXNlOjpnZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzKCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGppbnRBcnJheSBhcnJheSA9IChqaW50QXJyYXkpZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1EYXRhYmFzZSwKKyAgICAgICAgICAgIG1ldGhvZF9nZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzKTsKKyAgICBpZiAoIWFycmF5KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBEZXZpY2VQcm9wZXJ0eUxpc3QqIGxpc3QgPSBuZXcgTXRwRGV2aWNlUHJvcGVydHlMaXN0KCk7CisgICAgamludCogcHJvcGVydGllcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhhcnJheSwgMCk7CisgICAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnJheSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgbGlzdC0+cHVzaChwcm9wZXJ0aWVzW2ldKTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBwcm9wZXJ0aWVzLCAwKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGFycmF5KTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBsaXN0OworfQorCitNdHBSZXNwb25zZUNvZGUgTXlNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0UHJvcGVydHlWYWx1ZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgaW50ICAgICAgICAgdHlwZTsKKworICAgIGlmICghZ2V0T2JqZWN0UHJvcGVydHlJbmZvKHByb3BlcnR5LCB0eXBlKSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PQkpFQ1RfUFJPUF9OT1RfU1VQUE9SVEVEOworCisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZ2V0T2JqZWN0UHJvcGVydHksCisgICAgICAgICAgICAgICAgKGppbnQpaGFuZGxlLCAoamludClwcm9wZXJ0eSwgbUxvbmdCdWZmZXIsIG1TdHJpbmdCdWZmZXIpOworICAgIGlmIChyZXN1bHQgIT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGpsb25nKiBsb25nVmFsdWVzID0gZW52LT5HZXRMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgMCk7CisgICAgamxvbmcgbG9uZ1ZhbHVlID0gbG9uZ1ZhbHVlc1swXTsKKyAgICBlbnYtPlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgbG9uZ1ZhbHVlcywgMCk7CisKKyAgICAvLyBzcGVjaWFsIGNhc2UgZGF0ZSBwcm9wZXJ0aWVzLCB3aGljaCBhcmUgc3RyaW5ncyB0byBNVFAKKyAgICAvLyBidXQgc3RvcmVkIGludGVybmFsbHkgYXMgYSB1aW50NjQKKyAgICBpZiAocHJvcGVydHkgPT0gTVRQX1BST1BFUlRZX0RBVEVfTU9ESUZJRUQgfHwgcHJvcGVydHkgPT0gTVRQX1BST1BFUlRZX0RBVEVfQURERUQpIHsKKyAgICAgICAgY2hhciAgICBkYXRlWzIwXTsKKyAgICAgICAgZm9ybWF0RGF0ZVRpbWUobG9uZ1ZhbHVlLCBkYXRlLCBzaXplb2YoZGF0ZSkpOworICAgICAgICBwYWNrZXQucHV0U3RyaW5nKGRhdGUpOworICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworICAgIH0KKyAgICAvLyByZWxlYXNlIGRhdGUgaXMgc3RvcmVkIGludGVybmFsbHkgYXMganVzdCB0aGUgeWVhcgorICAgIGlmIChwcm9wZXJ0eSA9PSBNVFBfUFJPUEVSVFlfT1JJR0lOQUxfUkVMRUFTRV9EQVRFKSB7CisgICAgICAgIGNoYXIgICAgZGF0ZVsyMF07CisgICAgICAgIHNucHJpbnRmKGRhdGUsIHNpemVvZihkYXRlKSwgIiUwNGxsZDAxMDFUMDAwMDAwIiwgbG9uZ1ZhbHVlKTsKKyAgICAgICAgcGFja2V0LnB1dFN0cmluZyhkYXRlKTsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ4OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDgobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ4OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQ4KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxNjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQxNihsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDE2OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQxNihsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMzI6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MzIobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQzMjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50MzIobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDY0OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDY0KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UNjQ6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDY0KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxMjg6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MTI4KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTI4OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDEyOChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfU1RSOgorICAgICAgICB7CisgICAgICAgICAgICBqY2hhciogc3RyID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCAwKTsKKyAgICAgICAgICAgIHBhY2tldC5wdXRTdHJpbmcoc3RyKTsKKyAgICAgICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIHN0ciwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoInVuc3VwcG9ydGVkIHR5cGUgaW4gZ2V0T2JqZWN0UHJvcGVydHlWYWx1ZVxuIik7CisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX1BST1BfRk9STUFUOworICAgIH0KKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNeU10cERhdGFiYXNlOjpzZXRPYmplY3RQcm9wZXJ0eVZhbHVlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBpbnQgICAgICAgICB0eXBlOworCisgICAgaWYgKCFnZXRPYmplY3RQcm9wZXJ0eUluZm8ocHJvcGVydHksIHR5cGUpKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09CSkVDVF9QUk9QX05PVF9TVVBQT1JURUQ7CisKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqbG9uZyBsb25nVmFsdWUgPSAwOworICAgIGpzdHJpbmcgc3RyaW5nVmFsdWUgPSBOVUxMOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UODoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRJbnQ4KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UODoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRVSW50OCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTY6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0SW50MTYoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxNjoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDMyOgorICAgICAgICAgICAgbG9uZ1ZhbHVlID0gcGFja2V0LmdldEludDMyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMzI6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ2NDoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRJbnQ2NCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDY0OgorICAgICAgICAgICAgbG9uZ1ZhbHVlID0gcGFja2V0LmdldFVJbnQ2NCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfU1RSOgorICAgICAgICB7CisgICAgICAgICAgICBNdHBTdHJpbmdCdWZmZXIgYnVmZmVyOworICAgICAgICAgICAgcGFja2V0LmdldFN0cmluZyhidWZmZXIpOworICAgICAgICAgICAgc3RyaW5nVmFsdWUgPSBlbnYtPk5ld1N0cmluZ1VURigoY29uc3QgY2hhciAqKWJ1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoInVuc3VwcG9ydGVkIHR5cGUgaW4gZ2V0T2JqZWN0UHJvcGVydHlWYWx1ZVxuIik7CisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX1BST1BfRk9STUFUOworICAgIH0KKworICAgIGppbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX3NldE9iamVjdFByb3BlcnR5LAorICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSwgKGppbnQpcHJvcGVydHksIGxvbmdWYWx1ZSwgc3RyaW5nVmFsdWUpOworICAgIGlmIChzdHJpbmdWYWx1ZSkKKyAgICAgICAgZW52LT5EZWxldGVMb2NhbFJlZihzdHJpbmdWYWx1ZSk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitNdHBSZXNwb25zZUNvZGUgTXlNdHBEYXRhYmFzZTo6Z2V0RGV2aWNlUHJvcGVydHlWYWx1ZShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgaW50ICAgICAgICAgdHlwZTsKKworICAgIGlmICghZ2V0RGV2aWNlUHJvcGVydHlJbmZvKHByb3BlcnR5LCB0eXBlKSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9ERVZJQ0VfUFJPUF9OT1RfU1VQUE9SVEVEOworCisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZ2V0RGV2aWNlUHJvcGVydHksCisgICAgICAgICAgICAgICAgKGppbnQpcHJvcGVydHksIG1Mb25nQnVmZmVyLCBtU3RyaW5nQnVmZmVyKTsKKyAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBqbG9uZyogbG9uZ1ZhbHVlcyA9IGVudi0+R2V0TG9uZ0FycmF5RWxlbWVudHMobUxvbmdCdWZmZXIsIDApOworICAgIGpsb25nIGxvbmdWYWx1ZSA9IGxvbmdWYWx1ZXNbMF07CisgICAgZW52LT5SZWxlYXNlTG9uZ0FycmF5RWxlbWVudHMobUxvbmdCdWZmZXIsIGxvbmdWYWx1ZXMsIDApOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQ4KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50OChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTY6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MTYobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxNjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50MTYobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDMyOgorICAgICAgICAgICAgcGFja2V0LnB1dEludDMyKGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMzI6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDMyKGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ2NDoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQ2NChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDY0OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQ2NChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTI4OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDEyOChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDEyODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQxMjgobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1NUUjoKKyAgICAgICAgeworICAgICAgICAgICAgamNoYXIqIHN0ciA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHMobVN0cmluZ0J1ZmZlciwgMCk7CisgICAgICAgICAgICBwYWNrZXQucHV0U3RyaW5nKHN0cik7CisgICAgICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCBzdHIsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dFKCJ1bnN1cHBvcnRlZCB0eXBlIGluIGdldERldmljZVByb3BlcnR5VmFsdWVcbiIpOworICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX0RFVklDRV9QUk9QX0ZPUk1BVDsKKyAgICB9CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXlNdHBEYXRhYmFzZTo6c2V0RGV2aWNlUHJvcGVydHlWYWx1ZShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgaW50ICAgICAgICAgdHlwZTsKKworICAgIGlmICghZ2V0RGV2aWNlUHJvcGVydHlJbmZvKHByb3BlcnR5LCB0eXBlKSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9ERVZJQ0VfUFJPUF9OT1RfU1VQUE9SVEVEOworCisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamxvbmcgbG9uZ1ZhbHVlID0gMDsKKyAgICBqc3RyaW5nIHN0cmluZ1ZhbHVlID0gTlVMTDsKKworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDg6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0SW50OCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDg6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0VUludDgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDE2OgorICAgICAgICAgICAgbG9uZ1ZhbHVlID0gcGFja2V0LmdldEludDE2KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTY6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQzMjoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRJbnQzMigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDMyOgorICAgICAgICAgICAgbG9uZ1ZhbHVlID0gcGFja2V0LmdldFVJbnQzMigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UNjQ6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0SW50NjQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ2NDoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRVSW50NjQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1NUUjoKKyAgICAgICAgeworICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyIGJ1ZmZlcjsKKyAgICAgICAgICAgIHBhY2tldC5nZXRTdHJpbmcoYnVmZmVyKTsKKyAgICAgICAgICAgIHN0cmluZ1ZhbHVlID0gZW52LT5OZXdTdHJpbmdVVEYoKGNvbnN0IGNoYXIgKilidWZmZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dFKCJ1bnN1cHBvcnRlZCB0eXBlIGluIHNldERldmljZVByb3BlcnR5VmFsdWVcbiIpOworICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX0ZPUk1BVDsKKyAgICB9CisKKyAgICBqaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9zZXREZXZpY2VQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAoamludClwcm9wZXJ0eSwgbG9uZ1ZhbHVlLCBzdHJpbmdWYWx1ZSk7CisgICAgaWYgKHN0cmluZ1ZhbHVlKQorICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKHN0cmluZ1ZhbHVlKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNeU10cERhdGFiYXNlOjpyZXNldERldmljZVByb3BlcnR5KE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KSB7CisgICAgcmV0dXJuIC0xOworfQorCitNdHBSZXNwb25zZUNvZGUgTXlNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBjaGFyICAgIGRhdGVbMjBdOworCisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamJvb2xlYW4gcmVzdWx0ID0gZW52LT5DYWxsQm9vbGVhbk1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXRPYmplY3RJbmZvLAorICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSwgbUludEJ1ZmZlciwgbVN0cmluZ0J1ZmZlciwgbUxvbmdCdWZmZXIpOworICAgIGlmICghcmVzdWx0KQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKKworICAgIGppbnQqIGludFZhbHVlcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhtSW50QnVmZmVyLCAwKTsKKyAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gaW50VmFsdWVzWzBdOworICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBpbnRWYWx1ZXNbMV07CisgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCA9IGludFZhbHVlc1syXTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKG1JbnRCdWZmZXIsIGludFZhbHVlcywgMCk7CisKKyAgICBqbG9uZyogbG9uZ1ZhbHVlcyA9IGVudi0+R2V0TG9uZ0FycmF5RWxlbWVudHMobUxvbmdCdWZmZXIsIDApOworICAgIHVpbnQ2NF90IHNpemUgPSBsb25nVmFsdWVzWzBdOworICAgIHVpbnQ2NF90IG1vZGlmaWVkID0gbG9uZ1ZhbHVlc1sxXTsKKyAgICBlbnYtPlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgbG9uZ1ZhbHVlcywgMCk7CisKKy8vICAgIGludCBhc3NvY2lhdGlvblR5cGUgPSAoZm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04gPworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRQX0FTU09DSUFUSU9OX1RZUEVfR0VORVJJQ19GT0xERVIgOgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRQX0FTU09DSUFUSU9OX1RZUEVfVU5ERUZJTkVEKTsKKyAgICBpbnQgYXNzb2NpYXRpb25UeXBlID0gTVRQX0FTU09DSUFUSU9OX1RZUEVfVU5ERUZJTkVEOworCisgICAgcGFja2V0LnB1dFVJbnQzMihzdG9yYWdlSUQpOworICAgIHBhY2tldC5wdXRVSW50MTYoZm9ybWF0KTsKKyAgICBwYWNrZXQucHV0VUludDE2KDApOyAgIC8vIHByb3RlY3Rpb24gc3RhdHVzCisgICAgcGFja2V0LnB1dFVJbnQzMigoc2l6ZSA+IDB4RkZGRkZGRkZMTCA/IDB4RkZGRkZGRkYgOiBzaXplKSk7CisgICAgcGFja2V0LnB1dFVJbnQxNigwKTsgICAvLyB0aHVtYiBmb3JtYXQKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIHRodW1iIGNvbXByZXNzZWQgc2l6ZQorICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gdGh1bWIgcGl4IHdpZHRoCisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyB0aHVtYiBwaXggaGVpZ2h0CisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyBpbWFnZSBwaXggd2lkdGgKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIGltYWdlIHBpeCBoZWlnaHQKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIGltYWdlIGJpdCBkZXB0aAorICAgIHBhY2tldC5wdXRVSW50MzIocGFyZW50KTsKKyAgICBwYWNrZXQucHV0VUludDE2KGFzc29jaWF0aW9uVHlwZSk7CisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyBhc3NvY2lhdGlvbiBkZXNjCisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyBzZXF1ZW5jZSBudW1iZXIKKworICAgIGpjaGFyKiBzdHIgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIDApOworICAgIHBhY2tldC5wdXRTdHJpbmcoc3RyKTsgICAvLyBmaWxlIG5hbWUKKyAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCBzdHIsIDApOworCisgICAgcGFja2V0LnB1dEVtcHR5U3RyaW5nKCk7CisgICAgZm9ybWF0RGF0ZVRpbWUobW9kaWZpZWQsIGRhdGUsIHNpemVvZihkYXRlKSk7CisgICAgcGFja2V0LnB1dFN0cmluZyhkYXRlKTsgICAvLyBkYXRlIG1vZGlmaWVkCisgICAgcGFja2V0LnB1dEVtcHR5U3RyaW5nKCk7ICAgLy8ga2V5d29yZHMKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNeU10cERhdGFiYXNlOjpnZXRPYmplY3RGaWxlUGF0aChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmcmIGZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90JiBmaWxlTGVuZ3RoKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZ2V0T2JqZWN0RmlsZVBhdGgsCisgICAgICAgICAgICAgICAgKGppbnQpaGFuZGxlLCBtU3RyaW5nQnVmZmVyLCBtTG9uZ0J1ZmZlcik7CisgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgamNoYXIqIHN0ciA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHMobVN0cmluZ0J1ZmZlciwgMCk7CisgICAgZmlsZVBhdGguc2V0VG8oc3RyLCBzdHJsZW4xNihzdHIpKTsKKyAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCBzdHIsIDApOworCisgICAgamxvbmcqIGxvbmdWYWx1ZXMgPSBlbnYtPkdldExvbmdBcnJheUVsZW1lbnRzKG1Mb25nQnVmZmVyLCAwKTsKKyAgICBmaWxlTGVuZ3RoID0gbG9uZ1ZhbHVlc1swXTsKKyAgICBlbnYtPlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgbG9uZ1ZhbHVlcywgMCk7CisgICAgCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworTXRwUmVzcG9uc2VDb2RlIE15TXRwRGF0YWJhc2U6OmRlbGV0ZUZpbGUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIE10cFJlc3BvbnNlQ29kZSByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZGVsZXRlRmlsZSwgKGppbnQpaGFuZGxlKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cnVjdCBQcm9wZXJ0eVRhYmxlRW50cnkgeworICAgIE10cE9iamVjdFByb3BlcnR5ICAgcHJvcGVydHk7CisgICAgaW50ICAgICAgICAgICAgICAgICB0eXBlOworfTsKKworc3RhdGljIGNvbnN0IFByb3BlcnR5VGFibGVFbnRyeSAgIGtPYmplY3RQcm9wZXJ0eVRhYmxlW10gPSB7CisgICAgeyAgIE1UUF9QUk9QRVJUWV9TVE9SQUdFX0lELCAgICAgICAgTVRQX1RZUEVfVUlOVDMyICAgICB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZPUk1BVCwgICAgIE1UUF9UWVBFX1VJTlQxNiAgICAgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX1BST1RFQ1RJT05fU1RBVFVTLCBNVFBfVFlQRV9VSU5UMTYgICAgIH0sCisgICAgeyAgIE1UUF9QUk9QRVJUWV9PQkpFQ1RfU0laRSwgICAgICAgTVRQX1RZUEVfVUlOVDY0ICAgICB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZJTEVfTkFNRSwgIE1UUF9UWVBFX1NUUiAgICAgICAgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX0RBVEVfTU9ESUZJRUQsICAgICBNVFBfVFlQRV9TVFIgICAgICAgIH0sCisgICAgeyAgIE1UUF9QUk9QRVJUWV9QQVJFTlRfT0JKRUNULCAgICAgTVRQX1RZUEVfVUlOVDMyICAgICB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfUEVSU0lTVEVOVF9VSUQsICAgIE1UUF9UWVBFX1VJTlQxMjggICAgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX05BTUUsICAgICAgICAgICAgICBNVFBfVFlQRV9TVFIgICAgICAgIH0sCisgICAgeyAgIE1UUF9QUk9QRVJUWV9ESVNQTEFZX05BTUUsICAgICAgTVRQX1RZUEVfU1RSICAgICAgICB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfREFURV9BRERFRCwgICAgICAgIE1UUF9UWVBFX1NUUiAgICAgICAgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX0FSVElTVCwgICAgICAgICAgICBNVFBfVFlQRV9TVFIgICAgICAgIH0sCisgICAgeyAgIE1UUF9QUk9QRVJUWV9BTEJVTV9OQU1FLCAgICAgICAgTVRQX1RZUEVfU1RSICAgICAgICB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfQUxCVU1fQVJUSVNULCAgICAgIE1UUF9UWVBFX1NUUiAgICAgICAgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX1RSQUNLLCAgICAgICAgICAgICBNVFBfVFlQRV9VSU5UMTYgICAgIH0sCisgICAgeyAgIE1UUF9QUk9QRVJUWV9PUklHSU5BTF9SRUxFQVNFX0RBVEUsIE1UUF9UWVBFX1NUUiAgICB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfR0VOUkUsICAgICAgICAgICAgIE1UUF9UWVBFX1NUUiAgICAgICAgfSwKKyAgICB7ICAgTVRQX1BST1BFUlRZX0NPTVBPU0VSLCAgICAgICAgICBNVFBfVFlQRV9TVFIgICAgICAgIH0sCisgICAgeyAgIE1UUF9QUk9QRVJUWV9EVVJBVElPTiwgICAgICAgICAgTVRQX1RZUEVfVUlOVDMyICAgICB9LAorICAgIHsgICBNVFBfUFJPUEVSVFlfREVTQ1JJUFRJT04sICAgICAgIE1UUF9UWVBFX1NUUiAgICAgICAgfSwKK307CisKK3N0YXRpYyBjb25zdCBQcm9wZXJ0eVRhYmxlRW50cnkgICBrRGV2aWNlUHJvcGVydHlUYWJsZVtdID0geworICAgIHsgICBNVFBfREVWSUNFX1BST1BFUlRZX1NZTkNIUk9OSVpBVElPTl9QQVJUTkVSLCAgICAgTVRQX1RZUEVfU1RSIH0sCisgICAgeyAgIE1UUF9ERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0ZSSUVORExZX05BTUUsICAgICAgICBNVFBfVFlQRV9TVFIgfSwKK307CisKK2Jvb2wgTXlNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0UHJvcGVydHlJbmZvKE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LCBpbnQmIHR5cGUpIHsKKyAgICBpbnQgY291bnQgPSBzaXplb2Yoa09iamVjdFByb3BlcnR5VGFibGUpIC8gc2l6ZW9mKGtPYmplY3RQcm9wZXJ0eVRhYmxlWzBdKTsKKyAgICBjb25zdCBQcm9wZXJ0eVRhYmxlRW50cnkqIGVudHJ5ID0ga09iamVjdFByb3BlcnR5VGFibGU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBlbnRyeSsrKSB7CisgICAgICAgIGlmIChlbnRyeS0+cHJvcGVydHkgPT0gcHJvcGVydHkpIHsKKyAgICAgICAgICAgIHR5cGUgPSBlbnRyeS0+dHlwZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBNeU10cERhdGFiYXNlOjpnZXREZXZpY2VQcm9wZXJ0eUluZm8oTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHksIGludCYgdHlwZSkgeworICAgIGludCBjb3VudCA9IHNpemVvZihrRGV2aWNlUHJvcGVydHlUYWJsZSkgLyBzaXplb2Yoa0RldmljZVByb3BlcnR5VGFibGVbMF0pOworICAgIGNvbnN0IFByb3BlcnR5VGFibGVFbnRyeSogZW50cnkgPSBrRGV2aWNlUHJvcGVydHlUYWJsZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyssIGVudHJ5KyspIHsKKyAgICAgICAgaWYgKGVudHJ5LT5wcm9wZXJ0eSA9PSBwcm9wZXJ0eSkgeworICAgICAgICAgICAgdHlwZSA9IGVudHJ5LT50eXBlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitNdHBPYmplY3RIYW5kbGVMaXN0KiBNeU10cERhdGFiYXNlOjpnZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqaW50QXJyYXkgYXJyYXkgPSAoamludEFycmF5KWVudi0+Q2FsbE9iamVjdE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXRPYmplY3RSZWZlcmVuY2VzLAorICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSk7CisgICAgaWYgKCFhcnJheSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogbGlzdCA9IG5ldyBNdHBPYmplY3RIYW5kbGVMaXN0KCk7CisgICAgamludCogaGFuZGxlcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhhcnJheSwgMCk7CisgICAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnJheSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgbGlzdC0+cHVzaChoYW5kbGVzW2ldKTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBoYW5kbGVzLCAwKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGFycmF5KTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBsaXN0OworfQorCitNdHBSZXNwb25zZUNvZGUgTXlNdHBEYXRhYmFzZTo6c2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIHJlZmVyZW5jZXMpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBpbnQgY291bnQgPSByZWZlcmVuY2VzLT5zaXplKCk7CisgICAgamludEFycmF5IGFycmF5ID0gZW52LT5OZXdJbnRBcnJheShjb3VudCk7CisgICAgaWYgKCFhcnJheSkgeworICAgICAgICBMT0dFKCJvdXQgb2YgbWVtb3J5IGluIHNldE9iamVjdFJlZmVyZW5jZXMiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBqaW50KiBoYW5kbGVzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGFycmF5LCAwKTsKKyAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBoYW5kbGVzW2ldID0gKCpyZWZlcmVuY2VzKVtpXTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBoYW5kbGVzLCAwKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX3NldE9iamVjdFJlZmVyZW5jZXMsCisgICAgICAgICAgICAgICAgKGppbnQpaGFuZGxlLCBhcnJheSk7CisgICAgZW52LT5EZWxldGVMb2NhbFJlZihhcnJheSk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitNdHBQcm9wZXJ0eSogTXlNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0UHJvcGVydHlEZXNjKE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0KSB7CisgICAgTXRwUHJvcGVydHkqIHJlc3VsdCA9IE5VTEw7CisgICAgc3dpdGNoIChwcm9wZXJ0eSkgeworICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9PQkpFQ1RfRk9STUFUOgorICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9QUk9URUNUSU9OX1NUQVRVUzoKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfVFJBQ0s6CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgTXRwUHJvcGVydHkocHJvcGVydHksIE1UUF9UWVBFX1VJTlQxNik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfU1RPUkFHRV9JRDoKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfUEFSRU5UX09CSkVDVDoKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfRFVSQVRJT046CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgTXRwUHJvcGVydHkocHJvcGVydHksIE1UUF9UWVBFX1VJTlQzMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfT0JKRUNUX1NJWkU6CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgTXRwUHJvcGVydHkocHJvcGVydHksIE1UUF9UWVBFX1VJTlQ2NCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfUEVSU0lTVEVOVF9VSUQ6CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgTXRwUHJvcGVydHkocHJvcGVydHksIE1UUF9UWVBFX1VJTlQxMjgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1BST1BFUlRZX05BTUU6CisgICAgICAgIGNhc2UgTVRQX1BST1BFUlRZX09CSkVDVF9GSUxFX05BTUU6CisgICAgICAgIGNhc2UgTVRQX1BST1BFUlRZX0RBVEVfTU9ESUZJRUQ6CisgICAgICAgIGNhc2UgTVRQX1BST1BFUlRZX0RJU1BMQVlfTkFNRToKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfREFURV9BRERFRDoKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfQVJUSVNUOgorICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9BTEJVTV9OQU1FOgorICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9BTEJVTV9BUlRJU1Q6CisgICAgICAgIGNhc2UgTVRQX1BST1BFUlRZX09SSUdJTkFMX1JFTEVBU0VfREFURToKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfR0VOUkU6CisgICAgICAgIGNhc2UgTVRQX1BST1BFUlRZX0NPTVBPU0VSOgorICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9ERVNDUklQVElPTjoKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBNdHBQcm9wZXJ0eShwcm9wZXJ0eSwgTVRQX1RZUEVfU1RSKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK010cFByb3BlcnR5KiBNeU10cERhdGFiYXNlOjpnZXREZXZpY2VQcm9wZXJ0eURlc2MoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpIHsKKyAgICBNdHBQcm9wZXJ0eSogcmVzdWx0ID0gTlVMTDsKKyAgICBzd2l0Y2ggKHByb3BlcnR5KSB7CisgICAgICAgIGNhc2UgTVRQX0RFVklDRV9QUk9QRVJUWV9TWU5DSFJPTklaQVRJT05fUEFSVE5FUjoKKyAgICAgICAgY2FzZSBNVFBfREVWSUNFX1BST1BFUlRZX0RFVklDRV9GUklFTkRMWV9OQU1FOgorICAgICAgICB7CisgICAgICAgICAgICAvLyB3cml0ZWFibGUgc3RyaW5nIHByb3BlcnRpZXMKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBNdHBQcm9wZXJ0eShwcm9wZXJ0eSwgTVRQX1RZUEVfU1RSLCB0cnVlKTsKKworICAgICAgICAgICAgLy8gc2V0IGN1cnJlbnQgdmFsdWUKKyAgICAgICAgICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgICAgICAgICAgamludCByZXQgPSBlbnYtPkNhbGxJbnRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZ2V0RGV2aWNlUHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAoamludClwcm9wZXJ0eSwgbUxvbmdCdWZmZXIsIG1TdHJpbmdCdWZmZXIpOworICAgICAgICAgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgICAgICAgICBqY2hhciogc3RyID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnNldEN1cnJlbnRWYWx1ZShzdHIpOworICAgICAgICAgICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIHN0ciwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0UoInVuYWJsZSB0byByZWFkIGRldmljZSBwcm9wZXJ0eSwgcmVzcG9uc2U6ICUwNFgiLCByZXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBNeU10cERhdGFiYXNlOjpzZXNzaW9uU3RhcnRlZCgpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX3Nlc3Npb25TdGFydGVkKTsKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKK30KKwordm9pZCBNeU10cERhdGFiYXNlOjpzZXNzaW9uRW5kZWQoKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9zZXNzaW9uRW5kZWQpOworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworfQorCisjZW5kaWYgLy8gSEFWRV9BTkRST0lEX09TCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2Vfc2V0dXAoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJzZXR1cFxuIik7CisgICAgTXlNdHBEYXRhYmFzZSogZGF0YWJhc2UgPSBuZXcgTXlNdHBEYXRhYmFzZShlbnYsIHRoaXopOworICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCwgKGludClkYXRhYmFzZSk7CisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2VfZmluYWxpemUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJmaW5hbGl6ZVxuIik7CisgICAgTXlNdHBEYXRhYmFzZSogZGF0YWJhc2UgPSAoTXlNdHBEYXRhYmFzZSAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgZGF0YWJhc2UtPmNsZWFudXAoZW52KTsKKyAgICBkZWxldGUgZGF0YWJhc2U7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAwKTsKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyNlbmRpZgorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKKyAgICB7Im5hdGl2ZV9zZXR1cCIsICAgICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2Vfc2V0dXB9LAorICAgIHsibmF0aXZlX2ZpbmFsaXplIiwgICAgICAgICAiKClWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZV9maW5hbGl6ZX0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0NsYXNzUGF0aE5hbWUgPSAiYW5kcm9pZC9tZWRpYS9NdHBEYXRhYmFzZSI7CisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cERhdGFiYXNlKEpOSUVudiAqZW52KQoreworICAgIGpjbGFzcyBjbGF6ejsKKworICAgIExPR0QoInJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2VcbiIpOworCisgICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NdHBEYXRhYmFzZSIpOworICAgIGlmIChjbGF6eiA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgYW5kcm9pZC9tZWRpYS9NdHBEYXRhYmFzZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9iZWdpblNlbmRPYmplY3QgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiYmVnaW5TZW5kT2JqZWN0IiwgIihMamF2YS9sYW5nL1N0cmluZztJSUlKSilJIik7CisgICAgaWYgKG1ldGhvZF9iZWdpblNlbmRPYmplY3QgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGJlZ2luU2VuZE9iamVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9lbmRTZW5kT2JqZWN0ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImVuZFNlbmRPYmplY3QiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0lJWilWIik7CisgICAgaWYgKG1ldGhvZF9lbmRTZW5kT2JqZWN0ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBlbmRTZW5kT2JqZWN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldE9iamVjdExpc3QgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0T2JqZWN0TGlzdCIsICIoSUlJKVtJIik7CisgICAgaWYgKG1ldGhvZF9nZXRPYmplY3RMaXN0ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRPYmplY3RMaXN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldE51bU9iamVjdHMgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0TnVtT2JqZWN0cyIsICIoSUlJKUkiKTsKKyAgICBpZiAobWV0aG9kX2dldE51bU9iamVjdHMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldE51bU9iamVjdHMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cyIsICIoKVtJIik7CisgICAgaWYgKG1ldGhvZF9nZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cyIsICIoKVtJIik7CisgICAgaWYgKG1ldGhvZF9nZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzIiwgIihJKVtJIik7CisgICAgaWYgKG1ldGhvZF9nZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcyIsICIoKVtJIik7CisgICAgaWYgKG1ldGhvZF9nZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldE9iamVjdFByb3BlcnR5ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldE9iamVjdFByb3BlcnR5IiwgIihJSVtKW0MpSSIpOworICAgIGlmIChtZXRob2RfZ2V0T2JqZWN0UHJvcGVydHkgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldE9iamVjdFByb3BlcnR5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX3NldE9iamVjdFByb3BlcnR5ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgInNldE9iamVjdFByb3BlcnR5IiwgIihJSUpMamF2YS9sYW5nL1N0cmluZzspSSIpOworICAgIGlmIChtZXRob2Rfc2V0T2JqZWN0UHJvcGVydHkgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIHNldE9iamVjdFByb3BlcnR5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldERldmljZVByb3BlcnR5ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldERldmljZVByb3BlcnR5IiwgIihJW0pbQylJIik7CisgICAgaWYgKG1ldGhvZF9nZXREZXZpY2VQcm9wZXJ0eSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0RGV2aWNlUHJvcGVydHkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2Rfc2V0RGV2aWNlUHJvcGVydHkgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAic2V0RGV2aWNlUHJvcGVydHkiLCAiKElKTGphdmEvbGFuZy9TdHJpbmc7KUkiKTsKKyAgICBpZiAobWV0aG9kX3NldERldmljZVByb3BlcnR5ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBzZXREZXZpY2VQcm9wZXJ0eSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRPYmplY3RJbmZvID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldE9iamVjdEluZm8iLCAiKElbSVtDW0opWiIpOworICAgIGlmIChtZXRob2RfZ2V0T2JqZWN0SW5mbyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0T2JqZWN0SW5mbyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRPYmplY3RGaWxlUGF0aCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRPYmplY3RGaWxlUGF0aCIsICIoSVtDW0opSSIpOworICAgIGlmIChtZXRob2RfZ2V0T2JqZWN0RmlsZVBhdGggPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldE9iamVjdEZpbGVQYXRoIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2RlbGV0ZUZpbGUgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZGVsZXRlRmlsZSIsICIoSSlJIik7CisgICAgaWYgKG1ldGhvZF9kZWxldGVGaWxlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBkZWxldGVGaWxlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldE9iamVjdFJlZmVyZW5jZXMgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0T2JqZWN0UmVmZXJlbmNlcyIsICIoSSlbSSIpOworICAgIGlmIChtZXRob2RfZ2V0T2JqZWN0UmVmZXJlbmNlcyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0T2JqZWN0UmVmZXJlbmNlcyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9zZXRPYmplY3RSZWZlcmVuY2VzID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgInNldE9iamVjdFJlZmVyZW5jZXMiLCAiKElbSSlJIik7CisgICAgaWYgKG1ldGhvZF9zZXRPYmplY3RSZWZlcmVuY2VzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBzZXRPYmplY3RSZWZlcmVuY2VzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX3Nlc3Npb25TdGFydGVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgInNlc3Npb25TdGFydGVkIiwgIigpViIpOworICAgIGlmIChtZXRob2Rfc2Vzc2lvblN0YXJ0ZWQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIHNlc3Npb25TdGFydGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX3Nlc3Npb25FbmRlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJzZXNzaW9uRW5kZWQiLCAiKClWIik7CisgICAgaWYgKG1ldGhvZF9zZXNzaW9uRW5kZWQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIHNlc3Npb25FbmRlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZmllbGRfY29udGV4dCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgIm1OYXRpdmVDb250ZXh0IiwgIkkiKTsKKyAgICBpZiAoZmllbGRfY29udGV4dCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgTXRwRGF0YWJhc2UubU5hdGl2ZUNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC9tZWRpYS9NdHBEYXRhYmFzZSIsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyLmNwcCBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cFNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU2Nzk2NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cFNlcnZlci5jcHAKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cFNlcnZlckpOSSIKKyNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyNpbmNsdWRlIDxsaW51eC91c2IvZl9tdHAuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAiSk5JSGVscC5oIgorI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgorI2luY2x1ZGUgInByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiTXRwU2VydmVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBqZmllbGRJRCBmaWVsZF9jb250ZXh0Oworc3RhdGljIE11dGV4ICAgIHNNdXRleDsKKworLy8gaW4gYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZS5jcHAKK2V4dGVybiBNdHBEYXRhYmFzZSogZ2V0TXRwRGF0YWJhc2UoSk5JRW52ICplbnYsIGpvYmplY3QgZGF0YWJhc2UpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKworc3RhdGljIGJvb2wgRXhjZXB0aW9uQ2hlY2sodm9pZCogZW52KQoreworICAgIHJldHVybiAoKEpOSUVudiAqKWVudiktPkV4Y2VwdGlvbkNoZWNrKCk7Cit9CisKK2NsYXNzIE10cFRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworcHJpdmF0ZToKKyAgICBNdHBEYXRhYmFzZSogICAgbURhdGFiYXNlOworICAgIE10cFNlcnZlciogICAgICBtU2VydmVyOworICAgIFN0cmluZzggICAgICAgICBtU3RvcmFnZVBhdGg7CisgICAgam9iamVjdCAgICAgICAgIG1KYXZhU2VydmVyOworICAgIGludCAgICAgICAgICAgICBtRmQ7CisKK3B1YmxpYzoKKyAgICBNdHBUaHJlYWQoTXRwRGF0YWJhc2UqIGRhdGFiYXNlLCBjb25zdCBjaGFyKiBzdG9yYWdlUGF0aCwgam9iamVjdCBqYXZhU2VydmVyKQorICAgICAgICA6ICAgbURhdGFiYXNlKGRhdGFiYXNlKSwKKyAgICAgICAgICAgIG1TZXJ2ZXIoTlVMTCksCisgICAgICAgICAgICBtU3RvcmFnZVBhdGgoc3RvcmFnZVBhdGgpLAorICAgICAgICAgICAgbUphdmFTZXJ2ZXIoamF2YVNlcnZlciksCisgICAgICAgICAgICBtRmQoLTEpCisgICAgeworICAgIH0KKworICAgIHZvaWQgc2V0UHRwTW9kZShib29sIHVzZVB0cCkgeworICAgICAgICBzTXV0ZXgubG9jaygpOworICAgICAgICBpZiAobUZkID49IDApIHsKKyAgICAgICAgICAgIGlvY3RsKG1GZCwgTVRQX1NFVF9JTlRFUkZBQ0VfTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgKHVzZVB0cCA/IE1UUF9JTlRFUkZBQ0VfTU9ERV9QVFAgOiBNVFBfSU5URVJGQUNFX01PREVfTVRQKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgZmQgPSBvcGVuKCIvZGV2L210cF91c2IiLCBPX1JEV1IpOworICAgICAgICAgICAgaWYgKGZkID49IDApIHsKKyAgICAgICAgICAgICAgICBpb2N0bChmZCwgTVRQX1NFVF9JTlRFUkZBQ0VfTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1c2VQdHAgPyBNVFBfSU5URVJGQUNFX01PREVfUFRQIDogTVRQX0lOVEVSRkFDRV9NT0RFX01UUCkpOworICAgICAgICAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzTXV0ZXgudW5sb2NrKCk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKSB7CisgICAgICAgIHNNdXRleC5sb2NrKCk7CisgICAgICAgIG1GZCA9IG9wZW4oIi9kZXYvbXRwX3VzYiIsIE9fUkRXUik7CisgICAgICAgIHByaW50Zigib3BlbiByZXR1cm5lZCAlZFxuIiwgbUZkKTsKKyAgICAgICAgaWYgKG1GZCA8IDApIHsKKyAgICAgICAgICAgIExPR0UoImNvdWxkIG5vdCBvcGVuIE1UUCBkcml2ZXJcbiIpOworICAgICAgICAgICAgc011dGV4LnVubG9jaygpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbVNlcnZlciA9IG5ldyBNdHBTZXJ2ZXIobUZkLCBtRGF0YWJhc2UsIEFJRF9TRENBUkRfUlcsIDA2NjQsIDA3NzUpOworICAgICAgICBtU2VydmVyLT5hZGRTdG9yYWdlKG1TdG9yYWdlUGF0aCk7CisgICAgICAgIHNNdXRleC51bmxvY2soKTsKKworICAgICAgICBMT0dEKCJNdHBUaHJlYWQgbVNlcnZlci0+cnVuIik7CisgICAgICAgIG1TZXJ2ZXItPnJ1bigpOworCisgICAgICAgIHNNdXRleC5sb2NrKCk7CisgICAgICAgIGNsb3NlKG1GZCk7CisgICAgICAgIG1GZCA9IC0xOworICAgICAgICBkZWxldGUgbVNlcnZlcjsKKyAgICAgICAgbVNlcnZlciA9IE5VTEw7CisKKyAgICAgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgICAgIGVudi0+U2V0SW50RmllbGQobUphdmFTZXJ2ZXIsIGZpZWxkX2NvbnRleHQsIDApOworICAgICAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtSmF2YVNlcnZlcik7CisgICAgICAgIHNNdXRleC51bmxvY2soKTsKKworICAgICAgICBMT0dEKCJ0aHJlYWRMb29wIHJldHVybmluZyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBzZW5kT2JqZWN0QWRkZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgICAgICBzTXV0ZXgubG9jaygpOworICAgICAgICBpZiAobVNlcnZlcikKKyAgICAgICAgICAgIG1TZXJ2ZXItPnNlbmRPYmplY3RBZGRlZChoYW5kbGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBMT0dFKCJzZW5kT2JqZWN0QWRkZWQgY2FsbGVkIHdoaWxlIGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICAgIHNNdXRleC51bmxvY2soKTsKKyAgICB9CisKKyAgICB2b2lkIHNlbmRPYmplY3RSZW1vdmVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICAgICAgc011dGV4LmxvY2soKTsKKyAgICAgICAgaWYgKG1TZXJ2ZXIpCisgICAgICAgICAgICBtU2VydmVyLT5zZW5kT2JqZWN0UmVtb3ZlZChoYW5kbGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBMT0dFKCJzZW5kT2JqZWN0UmVtb3ZlZCBjYWxsZWQgd2hpbGUgZGlzY29ubmVjdGVkXG4iKTsKKyAgICAgICAgc011dGV4LnVubG9jaygpOworICAgIH0KK307CisKKyNlbmRpZiAvLyBIQVZFX0FORFJPSURfT1MKKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3NldHVwKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpvYmplY3QgamF2YURhdGFiYXNlLCBqc3RyaW5nIHN0b3JhZ2VQYXRoKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInNldHVwXG4iKTsKKworICAgIE10cERhdGFiYXNlKiBkYXRhYmFzZSA9IGdldE10cERhdGFiYXNlKGVudiwgamF2YURhdGFiYXNlKTsKKyAgICBjb25zdCBjaGFyICpzdG9yYWdlUGF0aFN0ciA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc3RvcmFnZVBhdGgsIE5VTEwpOworCisgICAgTXRwVGhyZWFkKiB0aHJlYWQgPSBuZXcgTXRwVGhyZWFkKGRhdGFiYXNlLCBzdG9yYWdlUGF0aFN0ciwgZW52LT5OZXdHbG9iYWxSZWYodGhpeikpOworICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCwgKGludCl0aHJlYWQpOworCisgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoc3RvcmFnZVBhdGgsIHN0b3JhZ2VQYXRoU3RyKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfZmluYWxpemUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyAgICBMT0dEKCJmaW5hbGl6ZVxuIik7Cit9CisKKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3N0YXJ0KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic3RhcnRcbiIpOworICAgIE10cFRocmVhZCAqdGhyZWFkID0gKE10cFRocmVhZCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgdGhyZWFkLT5ydW4oIk10cFRocmVhZCIpOworI2VuZGlmIC8vIEhBVkVfQU5EUk9JRF9PUworfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc3RvcChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInN0b3BcbiIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cFNlcnZlcl9zZW5kX29iamVjdF9hZGRlZChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGhhbmRsZSkKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJzZW5kX29iamVjdF9hZGRlZCAlZFxuIiwgaGFuZGxlKTsKKyAgICBNdHBUaHJlYWQgKnRocmVhZCA9IChNdHBUaHJlYWQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGlmICh0aHJlYWQpCisgICAgICAgIHRocmVhZC0+c2VuZE9iamVjdEFkZGVkKGhhbmRsZSk7CisgICAgZWxzZQorICAgICAgICBMT0dFKCJzZW5kT2JqZWN0QWRkZWQgY2FsbGVkIHdoaWxlIGRpc2Nvbm5lY3RlZFxuIik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3NlbmRfb2JqZWN0X3JlbW92ZWQoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBoYW5kbGUpCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic2VuZF9vYmplY3RfcmVtb3ZlZCAlZFxuIiwgaGFuZGxlKTsKKyAgICBNdHBUaHJlYWQgKnRocmVhZCA9IChNdHBUaHJlYWQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGlmICh0aHJlYWQpCisgICAgICAgIHRocmVhZC0+c2VuZE9iamVjdFJlbW92ZWQoaGFuZGxlKTsKKyAgICBlbHNlCisgICAgICAgIExPR0UoInNlbmRPYmplY3RSZW1vdmVkIGNhbGxlZCB3aGlsZSBkaXNjb25uZWN0ZWRcbiIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cFNlcnZlcl9zZXRfcHRwX21vZGUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamJvb2xlYW4gdXNlUHRwKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInNldF9wdHBfbW9kZVxuIik7CisgICAgTXRwVGhyZWFkICp0aHJlYWQgPSAoTXRwVGhyZWFkICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBpZiAodGhyZWFkKQorICAgICAgICB0aHJlYWQtPnNldFB0cE1vZGUodXNlUHRwKTsKKyAjZW5kaWYKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgICAgeyJuYXRpdmVfc2V0dXAiLCAgICAgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL010cERhdGFiYXNlO0xqYXZhL2xhbmcvU3RyaW5nOylWIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9zZXR1cH0sCisgICAgeyJuYXRpdmVfZmluYWxpemUiLCAgICAgICAgICAgICAiKClWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfZmluYWxpemV9LAorICAgIHsibmF0aXZlX3N0YXJ0IiwgICAgICAgICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3N0YXJ0fSwKKyAgICB7Im5hdGl2ZV9zdG9wIiwgICAgICAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9zdG9wfSwKKyAgICB7Im5hdGl2ZV9zZW5kX29iamVjdF9hZGRlZCIsICAgICIoSSlWIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9zZW5kX29iamVjdF9hZGRlZH0sCisgICAgeyJuYXRpdmVfc2VuZF9vYmplY3RfcmVtb3ZlZCIsICAiKEkpViIsICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2VuZF9vYmplY3RfcmVtb3ZlZH0sCisgICAgeyJuYXRpdmVfc2V0X3B0cF9tb2RlIiwgICAgICAgICAiKFopViIsICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2V0X3B0cF9tb2RlfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrQ2xhc3NQYXRoTmFtZSA9ICJhbmRyb2lkL21lZGlhL010cFNlcnZlciI7CisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cFNlcnZlcihKTklFbnYgKmVudikKK3sKKyAgICBqY2xhc3MgY2xheno7CisKKyAgICBMT0dEKCJyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cFNlcnZlclxuIik7CisKKyAgICBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL010cFNlcnZlciIpOworICAgIGlmIChjbGF6eiA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgYW5kcm9pZC9tZWRpYS9NdHBTZXJ2ZXIiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBmaWVsZF9jb250ZXh0ID0gZW52LT5HZXRGaWVsZElEKGNsYXp6LCAibU5hdGl2ZUNvbnRleHQiLCAiSSIpOworICAgIGlmIChmaWVsZF9jb250ZXh0ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBNdHBTZXJ2ZXIubU5hdGl2ZUNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC9tZWRpYS9NdHBTZXJ2ZXIiLCBnTWV0aG9kcywgTkVMRU0oZ01ldGhvZHMpKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKaW5kZXggNDhiNDVmZi4uZTZmZjY1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKQEAgLTI3LDQgKzI3LDQgQEAKIAogTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKIAotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcAppbmRleCA3ZTNiNzQzLi45YzJhOGJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCkBAIC03NjMsNyArNzYzLDggQEAKICAgICBpZiAoKHBvcENvdW50KGRldmljZSkgPT0gMSApICYmCiAgICAgICAgIChkZXZpY2UgJiAoQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDTyB8CiAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUIHwKLSAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCkpKSB7CisgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQgfAorICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSkpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKaW5kZXggMGY1NWIxOWQuLjlkZmRjYjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcApAQCAtMjIsMTIgKzIyLDE0IEBACiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXIuaD4KICNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZS5oPgorI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBlbnVtIHsKICAgICBESVNDT05ORUNUID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKICAgICBTRVRfVklERU9fU1VSRkFDRSwKKyAgICBTRVRfVklERU9fSVNVUkZBQ0UsCiAgICAgUFJFUEFSRV9BU1lOQywKICAgICBTVEFSVCwKICAgICBTVE9QLApAQCAtNjUsMTEgKzY3LDIwIEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChESVNDT05ORUNULCBkYXRhLCAmcmVwbHkpOwogICAgIH0KIAotICAgIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpCisgICAgc3RhdHVzX3Qgc2V0VmlkZW9JU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoc3VyZmFjZS0+YXNCaW5kZXIoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfVklERU9fSVNVUkZBQ0UsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIFN1cmZhY2U6OndyaXRlVG9QYXJjZWwoc3VyZmFjZSwgJmRhdGEpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1ZJREVPX1NVUkZBQ0UsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC0yNTYsOSArMjY3LDE1IEBACiAgICAgICAgICAgICBkaXNjb25uZWN0KCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX1ZJREVPX1NVUkZBQ0U6IHsKKyAgICAgICAgY2FzZSBTRVRfVklERU9fSVNVUkZBQ0U6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElTdXJmYWNlPiBzdXJmYWNlID0gaW50ZXJmYWNlX2Nhc3Q8SVN1cmZhY2U+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldFZpZGVvSVN1cmZhY2Uoc3VyZmFjZSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNFVF9WSURFT19TVVJGQUNFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gU3VyZmFjZTo6cmVhZEZyb21QYXJjZWwoZGF0YSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRWaWRlb1N1cmZhY2Uoc3VyZmFjZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCmluZGV4IDk0N2ZmMzQuLjU5Y2QxYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKQEAgLTE5LDcgKzE5LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiSU1lZGlhUmVjb3JkZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lTdXJmYWNlLmg+CisjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oPgogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXJDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlci5oPgpAQCAtNDMsNiArNDMsNyBAQAogICAgIFNFVF9BVURJT19FTkNPREVSLAogICAgIFNFVF9PVVRQVVRfRklMRV9QQVRILAogICAgIFNFVF9PVVRQVVRfRklMRV9GRCwKKyAgICBTRVRfT1VUUFVUX0ZJTEVfQVVYSUxJQVJZX0ZELAogICAgIFNFVF9WSURFT19TSVpFLAogICAgIFNFVF9WSURFT19GUkFNRVJBVEUsCiAgICAgU0VUX1BBUkFNRVRFUlMsCkBAIC02OSwxMiArNzAsMTIgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHN0YXR1c190IHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkKKyAgICBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkKICAgICB7CiAgICAgICAgIExPR1YoInNldFByZXZpZXdTdXJmYWNlKCVwKSIsIHN1cmZhY2UuZ2V0KCkpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZWNvcmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihzdXJmYWNlLT5hc0JpbmRlcigpKTsKKyAgICAgICAgU3VyZmFjZTo6d3JpdGVUb1BhcmNlbChzdXJmYWNlLCAmZGF0YSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfUFJFVklFV19TVVJGQUNFLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQpAQCAtMTU5LDYgKzE2MCwxNSBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZUF1eGlsaWFyeShpbnQgZmQpIHsKKyAgICAgICAgTE9HVigic2V0T3V0cHV0RmlsZUF1eGlsaWFyeSglZCkiLCBmZCk7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVJlY29yZGVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlRmlsZURlc2NyaXB0b3IoZmQpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX09VVFBVVF9GSUxFX0FVWElMSUFSWV9GRCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKwogICAgIHN0YXR1c190IHNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCiAgICAgewogICAgICAgICBMT0dWKCJzZXRWaWRlb1NpemUoJWR4JWQpIiwgd2lkdGgsIGhlaWdodCk7CkBAIC0zNzcsNiArMzg3LDEzIEBACiAgICAgICAgICAgICA6OmNsb3NlKGZkKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfT1VUUFVUX0ZJTEVfQVVYSUxJQVJZX0ZEOiB7CisgICAgICAgICAgICBMT0dWKCJTRVRfT1VUUFVUX0ZJTEVfQVVYSUxJQVJZX0ZEIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUmVjb3JkZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludCBmZCA9IGR1cChkYXRhLnJlYWRGaWxlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldE91dHB1dEZpbGVBdXhpbGlhcnkoZmQpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfVklERU9fU0laRTogewogICAgICAgICAgICAgTE9HVigiU0VUX1ZJREVPX1NJWkUiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOwpAQCAtNDA5LDcgKzQyNiw3IEBACiAgICAgICAgIGNhc2UgU0VUX1BSRVZJRVdfU1VSRkFDRTogewogICAgICAgICAgICAgTE9HVigiU0VUX1BSRVZJRVdfU1VSRkFDRSIpOwogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzcDxJU3VyZmFjZT4gc3VyZmFjZSA9IGludGVyZmFjZV9jYXN0PElTdXJmYWNlPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gU3VyZmFjZTo6cmVhZEZyb21QYXJjZWwoZGF0YSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRQcmV2aWV3U3VyZmFjZShzdXJmYWNlKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JT01YLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCmluZGV4IGYzODA0YjguLjQwODAxYTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCkBAIC0yMSw3ICsyMSw5IEBACiAgICAgU0VUX1BBUkFNRVRFUiwKICAgICBHRVRfQ09ORklHLAogICAgIFNFVF9DT05GSUcsCisgICAgRU5BQkxFX0dSQVBISUNfQlVGRkVSUywKICAgICBVU0VfQlVGRkVSLAorICAgIFVTRV9HUkFQSElDX0JVRkZFUiwKICAgICBBTExPQ19CVUZGRVIsCiAgICAgQUxMT0NfQlVGRkVSX1dJVEhfQkFDS1VQLAogICAgIEZSRUVfQlVGRkVSLApAQCAtMjE2LDYgKzIxOCwxOSBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVHcmFwaGljQnVmZmVycygKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0X2luZGV4KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKCh1aW50MzJfdCllbmFibGUpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRU5BQkxFX0dSQVBISUNfQlVGRkVSUywgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHVzZUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAogICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIpIHsKQEAgLTIzOCw2ICsyNTMsMjkgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdXNlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LAorICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsIGJ1ZmZlcl9pZCAqYnVmZmVyKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7CisgICAgICAgIGRhdGEud3JpdGUoKmdyYXBoaWNCdWZmZXIpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoVVNFX0dSQVBISUNfQlVGRkVSLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAqYnVmZmVyID0gMDsKKworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgICpidWZmZXIgPSAodm9pZCopcmVwbHkucmVhZEludFB0cigpOworCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBzaXplX3Qgc2l6ZSwKICAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCB2b2lkICoqYnVmZmVyX2RhdGEpIHsKQEAgLTU0MSw2ICs1NzksMjAgQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgRU5BQkxFX0dSQVBISUNfQlVGRkVSUzoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIE9NWF9CT09MIGVuYWJsZSA9IChPTVhfQk9PTClkYXRhLnJlYWRJbnQzMigpOworCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBlbmFibGVHcmFwaGljQnVmZmVycyhub2RlLCBwb3J0X2luZGV4LCBlbmFibGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKKworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBVU0VfQlVGRkVSOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwpAQCAtNTYxLDYgKzYxMywyNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBVU0VfR1JBUEhJQ19CVUZGRVI6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaGljQnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKKyAgICAgICAgICAgIGRhdGEucmVhZCgqZ3JhcGhpY0J1ZmZlcik7CisKKyAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXI7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSB1c2VHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBub2RlLCBwb3J0X2luZGV4LCBncmFwaGljQnVmZmVyLCAmYnVmZmVyKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnRQdHIoKGludHB0cl90KWJ1ZmZlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgQUxMT0NfQlVGRkVSOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcAppbmRleCAzODY5Mzg5Li45YWQ2M2YwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcApAQCAtNTksOCArNTksMjEgQEAKIH07CiAKIGNvbnN0IE1lZGlhUHJvZmlsZXM6Ok5hbWVUb1RhZ01hcCBNZWRpYVByb2ZpbGVzOjpzQ2FtY29yZGVyUXVhbGl0eU5hbWVNYXBbXSA9IHsKKyAgICB7ImxvdyIsIENBTUNPUkRFUl9RVUFMSVRZX0xPV30sCiAgICAgeyJoaWdoIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSH0sCi0gICAgeyJsb3ciLCAgQ0FNQ09SREVSX1FVQUxJVFlfTE9XfQorICAgIHsicWNpZiIsIENBTUNPUkRFUl9RVUFMSVRZX1FDSUZ9LAorICAgIHsiY2lmIiwgQ0FNQ09SREVSX1FVQUxJVFlfQ0lGfSwKKyAgICB7IjQ4MHAiLCBDQU1DT1JERVJfUVVBTElUWV80ODBQfSwKKyAgICB7IjcyMHAiLCBDQU1DT1JERVJfUVVBTElUWV83MjBQfSwKKyAgICB7IjEwODBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfMTA4MFB9LAorCisgICAgeyJ0aW1lbGFwc2Vsb3ciLCAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MT1d9LAorICAgIHsidGltZWxhcHNlaGlnaCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfSElHSH0sCisgICAgeyJ0aW1lbGFwc2VxY2lmIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9RQ0lGfSwKKyAgICB7InRpbWVsYXBzZWNpZiIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfQ0lGfSwKKyAgICB7InRpbWVsYXBzZTQ4MHAiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzQ4MFB9LAorICAgIHsidGltZWxhcHNlNzIwcCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfNzIwUH0sCisgICAgeyJ0aW1lbGFwc2UxMDgwcCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMTA4MFB9CiB9OwogCiAvKnN0YXRpYyovIHZvaWQKQEAgLTQxMSwxNiArNDI0LDE2IEBACiB9CiAKIC8qc3RhdGljKi8gTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSoKLU1lZGlhUHJvZmlsZXM6OmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJIaWdoUHJvZmlsZSgpCitNZWRpYVByb2ZpbGVzOjpjcmVhdGVEZWZhdWx0Q2FtY29yZGVyVGltZUxhcHNlUWNpZlByb2ZpbGUoY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkKIHsKICAgICBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjICp2aWRlb0NvZGVjID0KLSAgICAgICAgbmV3IE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMoVklERU9fRU5DT0RFUl9IMjYzLCAzNjAwMDAsIDM1MiwgMjg4LCAyMCk7CisgICAgICAgIG5ldyBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjKFZJREVPX0VOQ09ERVJfSDI2MywgMTAwMDAwMCwgMTc2LCAxNDQsIDIwKTsKIAogICAgIEF1ZGlvQ29kZWMgKmF1ZGlvQ29kZWMgPSBuZXcgQXVkaW9Db2RlYyhBVURJT19FTkNPREVSX0FNUl9OQiwgMTIyMDAsIDgwMDAsIDEpOwogICAgIENhbWNvcmRlclByb2ZpbGUgKnByb2ZpbGUgPSBuZXcgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZTsKICAgICBwcm9maWxlLT5tQ2FtZXJhSWQgPSAwOwogICAgIHByb2ZpbGUtPm1GaWxlRm9ybWF0ID0gT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFA7Ci0gICAgcHJvZmlsZS0+bVF1YWxpdHkgPSBDQU1DT1JERVJfUVVBTElUWV9ISUdIOworICAgIHByb2ZpbGUtPm1RdWFsaXR5ID0gcXVhbGl0eTsKICAgICBwcm9maWxlLT5tRHVyYXRpb24gPSA2MDsKICAgICBwcm9maWxlLT5tVmlkZW9Db2RlYyA9IHZpZGVvQ29kZWM7CiAgICAgcHJvZmlsZS0+bUF1ZGlvQ29kZWMgPSBhdWRpb0NvZGVjOwpAQCAtNDI4LDcgKzQ0MSw0MCBAQAogfQogCiAvKnN0YXRpYyovIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUqCi1NZWRpYVByb2ZpbGVzOjpjcmVhdGVEZWZhdWx0Q2FtY29yZGVyTG93UHJvZmlsZSgpCitNZWRpYVByb2ZpbGVzOjpjcmVhdGVEZWZhdWx0Q2FtY29yZGVyVGltZUxhcHNlNDgwcFByb2ZpbGUoY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkKK3sKKyAgICBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjICp2aWRlb0NvZGVjID0KKyAgICAgICAgbmV3IE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMoVklERU9fRU5DT0RFUl9IMjYzLCAyMDAwMDAwMCwgNzIwLCA0ODAsIDIwKTsKKworICAgIEF1ZGlvQ29kZWMgKmF1ZGlvQ29kZWMgPSBuZXcgQXVkaW9Db2RlYyhBVURJT19FTkNPREVSX0FNUl9OQiwgMTIyMDAsIDgwMDAsIDEpOworICAgIENhbWNvcmRlclByb2ZpbGUgKnByb2ZpbGUgPSBuZXcgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZTsKKyAgICBwcm9maWxlLT5tQ2FtZXJhSWQgPSAwOworICAgIHByb2ZpbGUtPm1GaWxlRm9ybWF0ID0gT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFA7CisgICAgcHJvZmlsZS0+bVF1YWxpdHkgPSBxdWFsaXR5OworICAgIHByb2ZpbGUtPm1EdXJhdGlvbiA9IDYwOworICAgIHByb2ZpbGUtPm1WaWRlb0NvZGVjID0gdmlkZW9Db2RlYzsKKyAgICBwcm9maWxlLT5tQXVkaW9Db2RlYyA9IGF1ZGlvQ29kZWM7CisgICAgcmV0dXJuIHByb2ZpbGU7Cit9CisKKy8qc3RhdGljKi8gdm9pZAorTWVkaWFQcm9maWxlczo6Y3JlYXRlRGVmYXVsdENhbWNvcmRlclRpbWVMYXBzZUxvd1Byb2ZpbGVzKAorICAgICAgICBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlICoqbG93VGltZUxhcHNlUHJvZmlsZSwKKyAgICAgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqKmxvd1NwZWNpZmljVGltZUxhcHNlUHJvZmlsZSkgeworICAgICpsb3dUaW1lTGFwc2VQcm9maWxlID0gY3JlYXRlRGVmYXVsdENhbWNvcmRlclRpbWVMYXBzZVFjaWZQcm9maWxlKENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTE9XKTsKKyAgICAqbG93U3BlY2lmaWNUaW1lTGFwc2VQcm9maWxlID0gY3JlYXRlRGVmYXVsdENhbWNvcmRlclRpbWVMYXBzZVFjaWZQcm9maWxlKENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfUUNJRik7Cit9CisKKy8qc3RhdGljKi8gdm9pZAorTWVkaWFQcm9maWxlczo6Y3JlYXRlRGVmYXVsdENhbWNvcmRlclRpbWVMYXBzZUhpZ2hQcm9maWxlcygKKyAgICAgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqKmhpZ2hUaW1lTGFwc2VQcm9maWxlLAorICAgICAgICBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlICoqaGlnaFNwZWNpZmljVGltZUxhcHNlUHJvZmlsZSkgeworICAgICpoaWdoVGltZUxhcHNlUHJvZmlsZSA9IGNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2U0ODBwUHJvZmlsZShDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0hJR0gpOworICAgICpoaWdoU3BlY2lmaWNUaW1lTGFwc2VQcm9maWxlID0gY3JlYXRlRGVmYXVsdENhbWNvcmRlclRpbWVMYXBzZTQ4MHBQcm9maWxlKENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfNDgwUCk7Cit9CisKKy8qc3RhdGljKi8gTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSoKK01lZGlhUHJvZmlsZXM6OmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJRY2lmUHJvZmlsZShjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KQogewogICAgIE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMgKnZpZGVvQ29kZWMgPQogICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6VmlkZW9Db2RlYyhWSURFT19FTkNPREVSX0gyNjMsIDE5MjAwMCwgMTc2LCAxNDQsIDIwKTsKQEAgLTQzOSwxOCArNDg1LDcyIEBACiAgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqcHJvZmlsZSA9IG5ldyBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlOwogICAgIHByb2ZpbGUtPm1DYW1lcmFJZCA9IDA7CiAgICAgcHJvZmlsZS0+bUZpbGVGb3JtYXQgPSBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUDsKLSAgICBwcm9maWxlLT5tUXVhbGl0eSA9IENBTUNPUkRFUl9RVUFMSVRZX0xPVzsKKyAgICBwcm9maWxlLT5tUXVhbGl0eSA9IHF1YWxpdHk7CiAgICAgcHJvZmlsZS0+bUR1cmF0aW9uID0gMzA7CiAgICAgcHJvZmlsZS0+bVZpZGVvQ29kZWMgPSB2aWRlb0NvZGVjOwogICAgIHByb2ZpbGUtPm1BdWRpb0NvZGVjID0gYXVkaW9Db2RlYzsKICAgICByZXR1cm4gcHJvZmlsZTsKIH0KIAorLypzdGF0aWMqLyBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlKgorTWVkaWFQcm9maWxlczo6Y3JlYXRlRGVmYXVsdENhbWNvcmRlckNpZlByb2ZpbGUoY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkKK3sKKyAgICBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjICp2aWRlb0NvZGVjID0KKyAgICAgICAgbmV3IE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMoVklERU9fRU5DT0RFUl9IMjYzLCAzNjAwMDAsIDM1MiwgMjg4LCAyMCk7CisKKyAgICBBdWRpb0NvZGVjICphdWRpb0NvZGVjID0gbmV3IEF1ZGlvQ29kZWMoQVVESU9fRU5DT0RFUl9BTVJfTkIsIDEyMjAwLCA4MDAwLCAxKTsKKyAgICBDYW1jb3JkZXJQcm9maWxlICpwcm9maWxlID0gbmV3IE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGU7CisgICAgcHJvZmlsZS0+bUNhbWVyYUlkID0gMDsKKyAgICBwcm9maWxlLT5tRmlsZUZvcm1hdCA9IE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQOworICAgIHByb2ZpbGUtPm1RdWFsaXR5ID0gcXVhbGl0eTsKKyAgICBwcm9maWxlLT5tRHVyYXRpb24gPSA2MDsKKyAgICBwcm9maWxlLT5tVmlkZW9Db2RlYyA9IHZpZGVvQ29kZWM7CisgICAgcHJvZmlsZS0+bUF1ZGlvQ29kZWMgPSBhdWRpb0NvZGVjOworICAgIHJldHVybiBwcm9maWxlOworfQorCisvKnN0YXRpYyovIHZvaWQKK01lZGlhUHJvZmlsZXM6OmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJMb3dQcm9maWxlcygKKyAgICAgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqKmxvd1Byb2ZpbGUsCisgICAgICAgIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUgKipsb3dTcGVjaWZpY1Byb2ZpbGUpIHsKKyAgICAqbG93UHJvZmlsZSA9IGNyZWF0ZURlZmF1bHRDYW1jb3JkZXJRY2lmUHJvZmlsZShDQU1DT1JERVJfUVVBTElUWV9MT1cpOworICAgICpsb3dTcGVjaWZpY1Byb2ZpbGUgPSBjcmVhdGVEZWZhdWx0Q2FtY29yZGVyUWNpZlByb2ZpbGUoQ0FNQ09SREVSX1FVQUxJVFlfUUNJRik7Cit9CisKKy8qc3RhdGljKi8gdm9pZAorTWVkaWFQcm9maWxlczo6Y3JlYXRlRGVmYXVsdENhbWNvcmRlckhpZ2hQcm9maWxlcygKKyAgICAgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqKmhpZ2hQcm9maWxlLAorICAgICAgICBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlICoqaGlnaFNwZWNpZmljUHJvZmlsZSkgeworICAgICpoaWdoUHJvZmlsZSA9IGNyZWF0ZURlZmF1bHRDYW1jb3JkZXJDaWZQcm9maWxlKENBTUNPUkRFUl9RVUFMSVRZX0hJR0gpOworICAgICpoaWdoU3BlY2lmaWNQcm9maWxlID0gY3JlYXRlRGVmYXVsdENhbWNvcmRlckNpZlByb2ZpbGUoQ0FNQ09SREVSX1FVQUxJVFlfQ0lGKTsKK30KKwogLypzdGF0aWMqLyB2b2lkCiBNZWRpYVByb2ZpbGVzOjpjcmVhdGVEZWZhdWx0Q2FtY29yZGVyUHJvZmlsZXMoTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpCiB7Ci0gICAgcHJvZmlsZXMtPm1DYW1jb3JkZXJQcm9maWxlcy5hZGQoY3JlYXRlRGVmYXVsdENhbWNvcmRlckhpZ2hQcm9maWxlKCkpOwotICAgIHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXMuYWRkKGNyZWF0ZURlZmF1bHRDYW1jb3JkZXJMb3dQcm9maWxlKCkpOworICAgIC8vIGxvdyBjYW1jb3JkZXIgcHJvZmlsZXMuCisgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqbG93UHJvZmlsZSwgKmxvd1NwZWNpZmljUHJvZmlsZTsKKyAgICBjcmVhdGVEZWZhdWx0Q2FtY29yZGVyTG93UHJvZmlsZXMoJmxvd1Byb2ZpbGUsICZsb3dTcGVjaWZpY1Byb2ZpbGUpOworICAgIHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXMuYWRkKGxvd1Byb2ZpbGUpOworICAgIHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXMuYWRkKGxvd1NwZWNpZmljUHJvZmlsZSk7CisKKyAgICAvLyBoaWdoIGNhbWNvcmRlciBwcm9maWxlcy4KKyAgICBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlKiBoaWdoUHJvZmlsZSwgKmhpZ2hTcGVjaWZpY1Byb2ZpbGU7CisgICAgY3JlYXRlRGVmYXVsdENhbWNvcmRlckhpZ2hQcm9maWxlcygmaGlnaFByb2ZpbGUsICZoaWdoU3BlY2lmaWNQcm9maWxlKTsKKyAgICBwcm9maWxlcy0+bUNhbWNvcmRlclByb2ZpbGVzLmFkZChoaWdoUHJvZmlsZSk7CisgICAgcHJvZmlsZXMtPm1DYW1jb3JkZXJQcm9maWxlcy5hZGQoaGlnaFNwZWNpZmljUHJvZmlsZSk7CisKKyAgICAvLyBsb3cgY2FtY29yZGVyIHRpbWUgbGFwc2UgcHJvZmlsZXMuCisgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqbG93VGltZUxhcHNlUHJvZmlsZSwgKmxvd1NwZWNpZmljVGltZUxhcHNlUHJvZmlsZTsKKyAgICBjcmVhdGVEZWZhdWx0Q2FtY29yZGVyVGltZUxhcHNlTG93UHJvZmlsZXMoJmxvd1RpbWVMYXBzZVByb2ZpbGUsICZsb3dTcGVjaWZpY1RpbWVMYXBzZVByb2ZpbGUpOworICAgIHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXMuYWRkKGxvd1RpbWVMYXBzZVByb2ZpbGUpOworICAgIHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXMuYWRkKGxvd1NwZWNpZmljVGltZUxhcHNlUHJvZmlsZSk7CisKKyAgICAvLyBoaWdoIGNhbWNvcmRlciB0aW1lIGxhcHNlIHByb2ZpbGVzLgorICAgIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUgKmhpZ2hUaW1lTGFwc2VQcm9maWxlLCAqaGlnaFNwZWNpZmljVGltZUxhcHNlUHJvZmlsZTsKKyAgICBjcmVhdGVEZWZhdWx0Q2FtY29yZGVyVGltZUxhcHNlSGlnaFByb2ZpbGVzKCZoaWdoVGltZUxhcHNlUHJvZmlsZSwgJmhpZ2hTcGVjaWZpY1RpbWVMYXBzZVByb2ZpbGUpOworICAgIHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXMuYWRkKGhpZ2hUaW1lTGFwc2VQcm9maWxlKTsKKyAgICBwcm9maWxlcy0+bUNhbWNvcmRlclByb2ZpbGVzLmFkZChoaWdoU3BlY2lmaWNUaW1lTGFwc2VQcm9maWxlKTsKIH0KIAogLypzdGF0aWMqLyB2b2lkCkBAIC02NjgsMTMgKzc2OCw4IEBACiAgICAgcmV0dXJuIGRlY29kZXJzOyAgLy8gY29weSBvdXQKIH0KIAotaW50IE1lZGlhUHJvZmlsZXM6OmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZShjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpIGNvbnN0CitpbnQgTWVkaWFQcm9maWxlczo6Z2V0Q2FtY29yZGVyUHJvZmlsZUluZGV4KGludCBjYW1lcmFJZCwgY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkgY29uc3QKIHsKLSAgICBMT0dWKCJnZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWU6ICVzIGZvciBjYW1lcmEgJWQsIHF1YWxpdHkgJWQiLAotICAgICAgICAgbmFtZSwgY2FtZXJhSWQsIHF1YWxpdHkpOwotCiAgICAgaW50IGluZGV4ID0gLTE7CiAgICAgZm9yIChzaXplX3QgaSA9IDAsIG4gPSBtQ2FtY29yZGVyUHJvZmlsZXMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7CiAgICAgICAgIGlmIChtQ2FtY29yZGVyUHJvZmlsZXNbaV0tPm1DYW1lcmFJZCA9PSBjYW1lcmFJZCAmJgpAQCAtNjgzLDYgKzc3OCwxNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIGluZGV4OworfQorCitpbnQgTWVkaWFQcm9maWxlczo6Z2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkgY29uc3QKK3sKKyAgICBMT0dWKCJnZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWU6ICVzIGZvciBjYW1lcmEgJWQsIHF1YWxpdHkgJWQiLAorICAgICAgICAgbmFtZSwgY2FtZXJhSWQsIHF1YWxpdHkpOworCisgICAgaW50IGluZGV4ID0gZ2V0Q2FtY29yZGVyUHJvZmlsZUluZGV4KGNhbWVyYUlkLCBxdWFsaXR5KTsKICAgICBpZiAoaW5kZXggPT0gLTEpIHsKICAgICAgICAgTE9HRSgiVGhlIGdpdmVuIGNhbWNvcmRlciBwcm9maWxlIGNhbWVyYSAlZCBxdWFsaXR5ICVkIGlzIG5vdCBmb3VuZCIsCiAgICAgICAgICAgICAgY2FtZXJhSWQsIHF1YWxpdHkpOwpAQCAtNzA1LDYgKzgxMSwxMSBAQAogICAgIHJldHVybiAtMTsKIH0KIAorYm9vbCBNZWRpYVByb2ZpbGVzOjpoYXNDYW1jb3JkZXJQcm9maWxlKGludCBjYW1lcmFJZCwgY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkgY29uc3QKK3sKKyAgICByZXR1cm4gKGdldENhbWNvcmRlclByb2ZpbGVJbmRleChjYW1lcmFJZCwgcXVhbGl0eSkgIT0gLTEpOworfQorCiBWZWN0b3I8aW50PiBNZWRpYVByb2ZpbGVzOjpnZXRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyhpbnQgY2FtZXJhSWQpIGNvbnN0CiB7CiAgICAgVmVjdG9yPGludD4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKaW5kZXggYzUxMTJhNS4uYzMxYjYyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwCkBAIC00OCw4ICs0OCw3IEBACiB9CiAKIHN0YXR1c190IE1lZGlhU2Nhbm5lcjo6cHJvY2Vzc0RpcmVjdG9yeSgKLSAgICAgICAgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqZXh0ZW5zaW9ucywKLSAgICAgICAgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQsCisgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIE1lZGlhU2Nhbm5lckNsaWVudCAmY2xpZW50LAogICAgICAgICBFeGNlcHRpb25DaGVjayBleGNlcHRpb25DaGVjaywgdm9pZCAqZXhjZXB0aW9uRW52KSB7CiAgICAgaW50IHBhdGhMZW5ndGggPSBzdHJsZW4ocGF0aCk7CiAgICAgaWYgKHBhdGhMZW5ndGggPj0gUEFUSF9NQVgpIHsKQEAgLTcyLDM1ICs3MSwxNiBAQAogCiAgICAgc3RhdHVzX3QgcmVzdWx0ID0KICAgICAgICAgZG9Qcm9jZXNzRGlyZWN0b3J5KAotICAgICAgICAgICAgICAgIHBhdGhCdWZmZXIsIHBhdGhSZW1haW5pbmcsIGV4dGVuc2lvbnMsIGNsaWVudCwKLSAgICAgICAgICAgICAgICBleGNlcHRpb25DaGVjaywgZXhjZXB0aW9uRW52KTsKKyAgICAgICAgICAgICAgICBwYXRoQnVmZmVyLCBwYXRoUmVtYWluaW5nLCBjbGllbnQsIGV4Y2VwdGlvbkNoZWNrLCBleGNlcHRpb25FbnYpOwogCiAgICAgZnJlZShwYXRoQnVmZmVyKTsKIAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBib29sIGZpbGVNYXRjaGVzRXh0ZW5zaW9uKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIGV4dGVuc2lvbnMpIHsKLSAgICBjb25zdCBjaGFyKiBleHRlbnNpb24gPSBzdHJyY2hyKHBhdGgsICcuJyk7Ci0gICAgaWYgKCFleHRlbnNpb24pIHJldHVybiBmYWxzZTsKLSAgICArK2V4dGVuc2lvbjsgICAgLy8gc2tpcCB0aGUgZG90Ci0gICAgaWYgKGV4dGVuc2lvblswXSA9PSAwKSByZXR1cm4gZmFsc2U7Ci0KLSAgICB3aGlsZSAoZXh0ZW5zaW9uc1swXSkgewotICAgICAgICBjb25zdCBjaGFyKiBjb21tYSA9IHN0cmNocihleHRlbnNpb25zLCAnLCcpOwotICAgICAgICBzaXplX3QgbGVuZ3RoID0gKGNvbW1hID8gY29tbWEgLSBleHRlbnNpb25zIDogc3RybGVuKGV4dGVuc2lvbnMpKTsKLSAgICAgICAgaWYgKGxlbmd0aCA9PSBzdHJsZW4oZXh0ZW5zaW9uKSAmJiBzdHJuY2FzZWNtcChleHRlbnNpb24sIGV4dGVuc2lvbnMsIGxlbmd0aCkgPT0gMCkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGV4dGVuc2lvbnMgKz0gbGVuZ3RoOwotICAgICAgICBpZiAoZXh0ZW5zaW9uc1swXSA9PSAnLCcpICsrZXh0ZW5zaW9uczsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KIHN0YXR1c190IE1lZGlhU2Nhbm5lcjo6ZG9Qcm9jZXNzRGlyZWN0b3J5KAotICAgICAgICBjaGFyICpwYXRoLCBpbnQgcGF0aFJlbWFpbmluZywgY29uc3QgY2hhciAqZXh0ZW5zaW9ucywKLSAgICAgICAgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQsIEV4Y2VwdGlvbkNoZWNrIGV4Y2VwdGlvbkNoZWNrLAotICAgICAgICB2b2lkICpleGNlcHRpb25FbnYpIHsKKyAgICAgICAgY2hhciAqcGF0aCwgaW50IHBhdGhSZW1haW5pbmcsIE1lZGlhU2Nhbm5lckNsaWVudCAmY2xpZW50LAorICAgICAgICBFeGNlcHRpb25DaGVjayBleGNlcHRpb25DaGVjaywgdm9pZCAqZXhjZXB0aW9uRW52KSB7CiAgICAgLy8gcGxhY2UgdG8gY29weSBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lCiAgICAgY2hhciogZmlsZVNwb3QgPSBwYXRoICsgc3RybGVuKHBhdGgpOwogICAgIHN0cnVjdCBkaXJlbnQqIGVudHJ5OwpAQCAtMTMzLDYgKzExMywxMyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAorICAgICAgICBpbnQgbmFtZUxlbmd0aCA9IHN0cmxlbihuYW1lKTsKKyAgICAgICAgaWYgKG5hbWVMZW5ndGggKyAxID4gcGF0aFJlbWFpbmluZykgeworICAgICAgICAgICAgLy8gcGF0aCB0b28gbG9uZyEKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0cmNweShmaWxlU3BvdCwgbmFtZSk7CisKICAgICAgICAgaW50IHR5cGUgPSBlbnRyeS0+ZF90eXBlOwogICAgICAgICBpZiAodHlwZSA9PSBEVF9VTktOT1dOKSB7CiAgICAgICAgICAgICAvLyBJZiB0aGUgdHlwZSBpcyB1bmtub3duLCBzdGF0KCkgdGhlIGZpbGUgaW5zdGVhZC4KQEAgLTE1MCwyOSArMTM3LDIwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKHR5cGUgPT0gRFRfUkVHIHx8IHR5cGUgPT0gRFRfRElSKSB7Ci0gICAgICAgICAgICBpbnQgbmFtZUxlbmd0aCA9IHN0cmxlbihuYW1lKTsKLSAgICAgICAgICAgIGJvb2wgaXNEaXJlY3RvcnkgPSAodHlwZSA9PSBEVF9ESVIpOwotCi0gICAgICAgICAgICBpZiAobmFtZUxlbmd0aCA+IHBhdGhSZW1haW5pbmcgfHwgKGlzRGlyZWN0b3J5ICYmIG5hbWVMZW5ndGggKyAxID4gcGF0aFJlbWFpbmluZykpIHsKLSAgICAgICAgICAgICAgICAvLyBwYXRoIHRvbyBsb25nIQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdHJjcHkoZmlsZVNwb3QsIG5hbWUpOwotICAgICAgICAgICAgaWYgKGlzRGlyZWN0b3J5KSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBEVF9ESVIpIHsKICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZGlyZWN0b3JpZXMgd2l0aCBhIG5hbWUgdGhhdCBzdGFydHMgd2l0aCAnLicKICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgdGhlIE1hYyAiLlRyYXNoZXMiIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgIGlmIChuYW1lWzBdID09ICcuJykgY29udGludWU7CiAKICAgICAgICAgICAgICAgICBzdHJjYXQoZmlsZVNwb3QsICIvIik7Ci0gICAgICAgICAgICAgICAgaW50IGVyciA9IGRvUHJvY2Vzc0RpcmVjdG9yeShwYXRoLCBwYXRoUmVtYWluaW5nIC0gbmFtZUxlbmd0aCAtIDEsIGV4dGVuc2lvbnMsIGNsaWVudCwgZXhjZXB0aW9uQ2hlY2ssIGV4Y2VwdGlvbkVudik7CisgICAgICAgICAgICAgICAgaW50IGVyciA9IGRvUHJvY2Vzc0RpcmVjdG9yeShwYXRoLCBwYXRoUmVtYWluaW5nIC0gbmFtZUxlbmd0aCAtIDEsIGNsaWVudCwgZXhjZXB0aW9uQ2hlY2ssIGV4Y2VwdGlvbkVudik7CiAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAvLyBwYXNzIGV4Y2VwdGlvbnMgdXAgLSBpZ25vcmUgb3RoZXIgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb25DaGVjayAmJiBleGNlcHRpb25DaGVjayhleGNlcHRpb25FbnYpKSBnb3RvIGZhaWx1cmU7CiAgICAgICAgICAgICAgICAgICAgIExPR0UoIkVycm9yIHByb2Nlc3NpbmcgJyVzJyAtIHNraXBwaW5nXG4iLCBwYXRoKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxlTWF0Y2hlc0V4dGVuc2lvbihwYXRoLCBleHRlbnNpb25zKSkgeworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwogICAgICAgICAgICAgICAgIHN0YXQocGF0aCwgJnN0YXRidWYpOwogICAgICAgICAgICAgICAgIGlmIChzdGF0YnVmLnN0X3NpemUgPiAwKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKaW5kZXggYzZiMmVmYi4uZGExZjdlNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcApAQCAtMjA2LDEwICsyMDYsMTUgQEAKICAgICBMT0dWKCJzZXRWaWRlb1N1cmZhY2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtUGxheWVyID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChzdXJmYWNlICE9IE5VTEwpCi0gICAgICAgIHJldHVybiAgbVBsYXllci0+c2V0VmlkZW9TdXJmYWNlKHN1cmZhY2UtPmdldElTdXJmYWNlKCkpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuICBtUGxheWVyLT5zZXRWaWRlb1N1cmZhY2UoTlVMTCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtUGxheWVyLT5zZXRWaWRlb0lTdXJmYWNlKAorICAgICAgICAgICAgc3VyZmFjZSA9PSBOVUxMID8gTlVMTCA6IHN1cmZhY2UtPmdldElTdXJmYWNlKCkpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBtUGxheWVyLT5zZXRWaWRlb1N1cmZhY2Uoc3VyZmFjZSk7CiB9CiAKIC8vIG11c3QgY2FsbCB3aXRoIGxvY2sgaGVsZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAppbmRleCA5ZDUzYzI1Li41MWQ5MWZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcApAQCAtNjUsNyArNjUsNyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3RhdHVzX3QgcmV0ID0gbU1lZGlhUmVjb3JkZXItPnNldFByZXZpZXdTdXJmYWNlKHN1cmZhY2UtPmdldElTdXJmYWNlKCkpOworICAgIHN0YXR1c190IHJldCA9IG1NZWRpYVJlY29yZGVyLT5zZXRQcmV2aWV3U3VyZmFjZShzdXJmYWNlKTsKICAgICBpZiAoT0sgIT0gcmV0KSB7CiAgICAgICAgIExPR1YoInNldFByZXZpZXdTdXJmYWNlIGZhaWxlZDogJWQiLCByZXQpOwogICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUkVDT1JERVJfRVJST1I7CkBAIC0zMDgsNiArMzA4LDMyIEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0T3V0cHV0RmlsZUF1eGlsaWFyeShpbnQgZmQpCit7CisgICAgTE9HVigic2V0T3V0cHV0RmlsZUF1eGlsaWFyeSglZCkiLCBmZCk7CisgICAgaWYobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJtZWRpYSByZWNvcmRlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKG1Jc0F1eGlsaWFyeU91dHB1dEZpbGVTZXQpIHsKKyAgICAgICAgTE9HRSgib3V0cHV0IGZpbGUgaGFzIGFscmVhZHkgYmVlbiBzZXQiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBpZiAoIShtQ3VycmVudFN0YXRlICYgTUVESUFfUkVDT1JERVJfREFUQVNPVVJDRV9DT05GSUdVUkVEKSkgeworICAgICAgICBMT0dFKCJzZXRPdXRwdXRGaWxlIGNhbGxlZCBpbiBhbiBpbnZhbGlkIHN0YXRlKCVkKSIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RhdHVzX3QgcmV0ID0gbU1lZGlhUmVjb3JkZXItPnNldE91dHB1dEZpbGVBdXhpbGlhcnkoZmQpOworICAgIGlmIChPSyAhPSByZXQpIHsKKyAgICAgICAgTE9HVigic2V0T3V0cHV0RmlsZUF1eGlsaWFyeSBmYWlsZWQ6ICVkIiwgcmV0KTsKKyAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1JFQ09SREVSX0VSUk9SOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBtSXNBdXhpbGlhcnlPdXRwdXRGaWxlU2V0ID0gdHJ1ZTsKKyAgICByZXR1cm4gcmV0OworfQorCiBzdGF0dXNfdCBNZWRpYVJlY29yZGVyOjpzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQogewogICAgIExPR1YoInNldFZpZGVvU2l6ZSglZCwgJWQpIiwgd2lkdGgsIGhlaWdodCk7CkBAIC01NzEsNiArNTk3LDcgQEAKICAgICBtSXNBdWRpb0VuY29kZXJTZXQgPSBmYWxzZTsKICAgICBtSXNWaWRlb0VuY29kZXJTZXQgPSBmYWxzZTsKICAgICBtSXNPdXRwdXRGaWxlU2V0ICAgPSBmYWxzZTsKKyAgICBtSXNBdXhpbGlhcnlPdXRwdXRGaWxlU2V0ID0gZmFsc2U7CiB9CiAKIC8vIFJlbGVhc2Ugc2hvdWxkIGJlIE9LIGluIGFueSBzdGF0ZQpAQCAtNjQzLDQgKzY3MCwzIEBACiB9CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggZDk3NWNiOS4uODc3ZTc4NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTg5MSw3ICs4OTEsMTUgQEAKICAgICByZXR1cm4gbVN0YXR1czsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6c2V0VmlkZW9JU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpCit7CisgICAgTE9HVigiWyVkXSBzZXRWaWRlb0lTdXJmYWNlKCVwKSIsIG1Db25uSWQsIHN1cmZhY2UuZ2V0KCkpOworICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gcCA9IGdldFBsYXllcigpOworICAgIGlmIChwID09IDApIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIHJldHVybiBwLT5zZXRWaWRlb0lTdXJmYWNlKHN1cmZhY2UpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6c2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKQogewogICAgIExPR1YoIlslZF0gc2V0VmlkZW9TdXJmYWNlKCVwKSIsIG1Db25uSWQsIHN1cmZhY2UuZ2V0KCkpOwogICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gcCA9IGdldFBsYXllcigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCmluZGV4IGE5NjdlZTIuLmRlYjQ1OGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKQEAgLTIwNCw3ICsyMDQsOCBAQAogCiAgICAgICAgIC8vIElNZWRpYVBsYXllciBpbnRlcmZhY2UKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9JU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBwcmVwYXJlQXN5bmMoKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RhcnQoKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RvcCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCmluZGV4IDE5OTE1ZjEuLmJlNmE4YmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKQEAgLTcwLDcgKzcwLDcgQEAKICAgICByZXR1cm4gbVJlY29yZGVyLT5zZXRDYW1lcmEoY2FtZXJhKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6c2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQorc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6c2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpCiB7CiAgICAgTE9HVigic2V0UHJldmlld1N1cmZhY2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CkBAIC0xNjQsNiArMTY0LDE3IEBACiAgICAgcmV0dXJuIG1SZWNvcmRlci0+c2V0T3V0cHV0RmlsZShmZCwgb2Zmc2V0LCBsZW5ndGgpOwogfQogCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGludCBmZCkKK3sKKyAgICBMT0dWKCJzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KCVkKSIsIGZkKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1SZWNvcmRlciA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoInJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1SZWNvcmRlci0+c2V0T3V0cHV0RmlsZUF1eGlsaWFyeShmZCk7Cit9CisKIHN0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCiB7CiAgICAgTE9HVigic2V0VmlkZW9TaXplKCVkeCVkKSIsIHdpZHRoLCBoZWlnaHQpOwpAQCAtMzM3LDQgKzM0OCwzIEBACiB9CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCmluZGV4IDFkMTkxM2QuLmZkZWQ5OGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaApAQCAtMjksNyArMjksNyBAQAogewogcHVibGljOgogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRDYW1lcmEoY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSk7Ci0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9Tb3VyY2UoaW50IHZzKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9Tb3VyY2UoaW50IGFzKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0T3V0cHV0Rm9ybWF0KGludCBvZik7CkBAIC0zNyw2ICszNyw3IEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvRW5jb2RlcihpbnQgYWUpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIqIHBhdGgpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0T3V0cHV0RmlsZUF1eGlsaWFyeShpbnQgZmQpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpOwpAQCAtNjYsNCArNjcsMyBAQAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfTUVESUFSRUNPUkRFUkNMSUVOVF9ICi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmgKaW5kZXggNGE2MGVjZS4uMDZlNGI3MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmgKQEAgLTM1LDcgKzM1LDggQEAKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSB7IHJldHVybiBVTktOT1dOX0VSUk9SOyB9CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkgeyByZXR1cm4gVU5LTk9XTl9FUlJPUjsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSB7IHJldHVybiBVTktOT1dOX0VSUk9SOyB9CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBwcmVwYXJlKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBwcmVwYXJlQXN5bmMoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YXJ0KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcAppbmRleCAyYzk2ZDZkLi42YjliZjg1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAKQEAgLTQ0LDEzICs0NCwyMCBAQAogICAgIHJldHVybiBtUGxheWVyLT5zZXREYXRhU291cmNlKGR1cChmZCksIG9mZnNldCwgbGVuZ3RoKTsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRQbGF5ZXI6OnNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UpIHsKLSAgICBMT0dWKCJzZXRWaWRlb1N1cmZhY2UiKTsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UGxheWVyOjpzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIExPR1YoInNldFZpZGVvSVN1cmZhY2UiKTsKIAogICAgIG1QbGF5ZXItPnNldElTdXJmYWNlKHN1cmZhY2UpOwogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRQbGF5ZXI6OnNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIExPR1YoInNldFZpZGVvU3VyZmFjZSIpOworCisgICAgbVBsYXllci0+c2V0U3VyZmFjZShzdXJmYWNlKTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IFN0YWdlZnJpZ2h0UGxheWVyOjpwcmVwYXJlKCkgewogICAgIHJldHVybiBtUGxheWVyLT5wcmVwYXJlKCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oCmluZGV4IDc4MWViNDQuLmRkMzcxMDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oCkBAIC0zNSw3ICszNSw4IEBACiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvSVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKaW5kZXggY2YwMWZmNi4uN2E3ODE4NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcApAQCAtMjQsNiArMjQsOSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9Tb3VyY2VEb3duU2FtcGxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlU3BsaXR0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTM0LDE5ICszNywxOSBAQAogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYS5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+Ci0jaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KKyNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgIkFSVFBXcml0ZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBTdGFnZWZyaWdodFJlY29yZGVyOjpTdGFnZWZyaWdodFJlY29yZGVyKCkKLSAgICA6IG1Xcml0ZXIoTlVMTCksCi0gICAgICBtT3V0cHV0RmQoLTEpIHsKKyAgICA6IG1Xcml0ZXIoTlVMTCksIG1Xcml0ZXJBdXgoTlVMTCksCisgICAgICBtT3V0cHV0RmQoLTEpLCBtT3V0cHV0RmRBdXgoLTEpIHsKIAogICAgIExPR1YoIkNvbnN0cnVjdG9yIik7CiAgICAgcmVzZXQoKTsKQEAgLTIwMCw3ICsyMDMsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgewogICAgIExPR1YoInNldFByZXZpZXdTdXJmYWNlOiAlcCIsIHN1cmZhY2UuZ2V0KCkpOwogICAgIG1QcmV2aWV3U3VyZmFjZSA9IHN1cmZhY2U7CiAKQEAgLTIzNCw2ICsyMzcsMjQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldE91dHB1dEZpbGVBdXhpbGlhcnkoaW50IGZkKSB7CisgICAgTE9HVigic2V0T3V0cHV0RmlsZUF1eGlsaWFyeTogJWQiLCBmZCk7CisKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgZmlsZSBkZXNjcmlwdG9yOiAlZCIsIGZkKTsKKyAgICAgICAgcmV0dXJuIC1FQkFERjsKKyAgICB9CisKKyAgICBtQ2FwdHVyZUF1eFZpZGVvID0gdHJ1ZTsKKworICAgIGlmIChtT3V0cHV0RmRBdXggPj0gMCkgeworICAgICAgICA6OmNsb3NlKG1PdXRwdXRGZEF1eCk7CisgICAgfQorICAgIG1PdXRwdXRGZEF1eCA9IGR1cChmZCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKIC8vIEF0dGVtcHQgdG8gcGFyc2UgYW4gaW50NjQgbGl0ZXJhbCBvcHRpb25hbGx5IHN1cnJvdW5kZWQgYnkgd2hpdGVzcGFjZSwKIC8vIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCiBzdGF0aWMgYm9vbCBzYWZlX3N0cnRvaTY0KGNvbnN0IGNoYXIgKnMsIGludDY0X3QgKnZhbCkgewpAQCAtNDczLDYgKzQ5NCw2OCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1UaW1lTGFwc2VFbmFibGUoaW50MzJfdCB0aW1lTGFwc2VFbmFibGUpIHsKKyAgICBMT0dWKCJzZXRQYXJhbVRpbWVMYXBzZUVuYWJsZTogJWQiLCB0aW1lTGFwc2VFbmFibGUpOworCisgICAgaWYodGltZUxhcHNlRW5hYmxlID09IDApIHsKKyAgICAgICAgbUNhcHR1cmVUaW1lTGFwc2UgPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHRpbWVMYXBzZUVuYWJsZSA9PSAxKSB7CisgICAgICAgIG1DYXB0dXJlVGltZUxhcHNlID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmUoaW50NjRfdCB0aW1lVXMpIHsKKyAgICBMT0dWKCJzZXRQYXJhbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlOiAlbGxkIHVzIiwgdGltZVVzKTsKKworICAgIC8vIE5vdCBhbGxvd2luZyB0aW1lIG1vcmUgdGhhbiBhIGRheQorICAgIGlmICh0aW1lVXMgPD0gMCB8fCB0aW1lVXMgPiA4NjQwMCoxRTYpIHsKKyAgICAgICAgTE9HRSgiVGltZSBiZXR3ZWVuIHRpbWUgbGFwc2UgZnJhbWUgY2FwdHVyZSAoJWxsZCkgaXMgb3V0IG9mIHJhbmdlIFswLCAxIERheV0iLCB0aW1lVXMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzID0gdGltZVVzOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1BdXhWaWRlb1dpZHRoKGludDMyX3Qgd2lkdGgpIHsKKyAgICBMT0dWKCJzZXRQYXJhbUF1eFZpZGVvV2lkdGggOiAlZCIsIHdpZHRoKTsKKworICAgIGlmICh3aWR0aCA8PSAwKSB7CisgICAgICAgIExPR0UoIldpZHRoICglZCkgaXMgbm90IHBvc2l0aXZlIiwgd2lkdGgpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1BdXhWaWRlb1dpZHRoID0gd2lkdGg7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbUF1eFZpZGVvSGVpZ2h0KGludDMyX3QgaGVpZ2h0KSB7CisgICAgTE9HVigic2V0UGFyYW1BdXhWaWRlb0hlaWdodCA6ICVkIiwgaGVpZ2h0KTsKKworICAgIGlmIChoZWlnaHQgPD0gMCkgeworICAgICAgICBMT0dFKCJIZWlnaHQgKCVkKSBpcyBub3QgcG9zaXRpdmUiLCBoZWlnaHQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1BdXhWaWRlb0hlaWdodCA9IGhlaWdodDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtQXV4VmlkZW9FbmNvZGluZ0JpdFJhdGUoaW50MzJfdCBiaXRSYXRlKSB7CisgICAgTE9HVigiU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1BdXhWaWRlb0VuY29kaW5nQml0UmF0ZTogJWQiLCBiaXRSYXRlKTsKKworICAgIGlmIChiaXRSYXRlIDw9IDApIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCB2aWRlbyBlbmNvZGluZyBiaXQgcmF0ZTogJWQiLCBiaXRSYXRlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtQXV4VmlkZW9CaXRSYXRlID0gYml0UmF0ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtZXRlcigKICAgICAgICAgY29uc3QgU3RyaW5nOCAma2V5LCBjb25zdCBTdHJpbmc4ICZ2YWx1ZSkgewogICAgIExPR1YoInNldFBhcmFtZXRlcjoga2V5ICglcykgPT4gdmFsdWUgKCVzKSIsIGtleS5zdHJpbmcoKSwgdmFsdWUuc3RyaW5nKCkpOwpAQCAtNTU2LDYgKzYzOSwzMiBAQAogICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJnRpbWVTY2FsZSkpIHsKICAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVZpZGVvVGltZVNjYWxlKHRpbWVTY2FsZSk7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidGltZS1sYXBzZS1lbmFibGUiKSB7CisgICAgICAgIGludDMyX3QgdGltZUxhcHNlRW5hYmxlOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJnRpbWVMYXBzZUVuYWJsZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVRpbWVMYXBzZUVuYWJsZSh0aW1lTGFwc2VFbmFibGUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInRpbWUtYmV0d2Vlbi10aW1lLWxhcHNlLWZyYW1lLWNhcHR1cmUiKSB7CisgICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVNczsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pNjQodmFsdWUuc3RyaW5nKCksICZ0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZU1zKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmUoCisgICAgICAgICAgICAgICAgICAgIDEwMDBMTCAqIHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlTXMpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInZpZGVvLWF1eC1wYXJhbS13aWR0aCIpIHsKKyAgICAgICAgaW50MzJfdCBhdXhXaWR0aDsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZhdXhXaWR0aCkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbUF1eFZpZGVvV2lkdGgoYXV4V2lkdGgpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInZpZGVvLWF1eC1wYXJhbS1oZWlnaHQiKSB7CisgICAgICAgIGludDMyX3QgYXV4SGVpZ2h0OworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJmF1eEhlaWdodCkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbUF1eFZpZGVvSGVpZ2h0KGF1eEhlaWdodCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidmlkZW8tYXV4LXBhcmFtLWVuY29kaW5nLWJpdHJhdGUiKSB7CisgICAgICAgIGludDMyX3QgYXV4VmlkZW9CaXRSYXRlOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJmF1eFZpZGVvQml0UmF0ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbUF1eFZpZGVvRW5jb2RpbmdCaXRSYXRlKGF1eFZpZGVvQml0UmF0ZSk7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBMT0dFKCJzZXRQYXJhbWV0ZXI6IGZhaWxlZCB0byBmaW5kIGtleSAlcyIsIGtleS5zdHJpbmcoKSk7CiAgICAgfQpAQCAtNzg2LDcgKzg5NSwxNCBAQAogICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0xJU1RfRU5EKSB7CiAgICAgICAgIHNvdXJjZSA9IGNyZWF0ZUF1ZGlvU291cmNlKCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIoJnNvdXJjZSk7CisKKyAgICAgICAgc3A8Q2FtZXJhU291cmNlPiBjYW1lcmFTb3VyY2U7CisgICAgICAgIHN0YXR1c190IGVyciA9IHNldHVwQ2FtZXJhU291cmNlKCZjYW1lcmFTb3VyY2UpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIoY2FtZXJhU291cmNlLCBtVmlkZW9CaXRSYXRlLCAmc291cmNlKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQpAQCAtODUwLDExICs5NjYsNzQgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQ2FtZXJhU291cmNlKCkgewotICAgIGNsaXBWaWRlb0JpdFJhdGUoKTsKLSAgICBjbGlwVmlkZW9GcmFtZVJhdGUoKTsKLSAgICBjbGlwVmlkZW9GcmFtZVdpZHRoKCk7Ci0gICAgY2xpcFZpZGVvRnJhbWVIZWlnaHQoKTsKKy8qCisgKiBDaGVjayB0byBzZWUgd2hldGhlciB0aGUgcmVxdWVzdGVkIHZpZGVvIHdpZHRoIGFuZCBoZWlnaHQgaXMgb25lCisgKiBvZiB0aGUgc3VwcG9ydGVkIHNpemVzLiBJdCByZXR1cm5zIHRydWUgaWYgc287IG90aGVyd2lzZSwgaXQKKyAqIHJldHVybnMgZmFsc2UuCisgKi8KK2Jvb2wgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6aXNWaWRlb1NpemVTdXBwb3J0ZWQoCisgICAgY29uc3QgVmVjdG9yPFNpemU+JiBzdXBwb3J0ZWRTaXplcykgY29uc3QgeworCisgICAgTE9HVigiaXNWaWRlb1NpemVTdXBwb3J0ZWQiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN1cHBvcnRlZFNpemVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChtVmlkZW9XaWR0aCAgPT0gc3VwcG9ydGVkU2l6ZXNbaV0ud2lkdGggJiYKKyAgICAgICAgICAgIG1WaWRlb0hlaWdodCA9PSBzdXBwb3J0ZWRTaXplc1tpXS5oZWlnaHQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIElmIHRoZSBwcmV2aWV3IGFuZCB2aWRlbyBvdXRwdXQgaXMgc2VwYXJhdGUsIHdlIG9ubHkgc2V0IHRoZQorICogdGhlIHZpZGVvIHNpemUsIGFuZCBhcHBsaWNhdGlvbnMgc2hvdWxkIHNldCB0aGUgcHJldmlldyBzaXplCisgKiB0byBzb21lIHByb3BlciB2YWx1ZSwgYW5kIHRoZSByZWNvcmRpbmcgZnJhbWV3b3JrIHdpbGwgbm90CisgKiBjaGFuZ2UgdGhlIHByZXZpZXcgc2l6ZTsgb3RoZXJ3aXNlLCBpZiB0aGUgdmlkZW8gYW5kIHByZXZpZXcKKyAqIG91dHB1dCBpcyB0aGUgc2FtZSwgd2UgbmVlZCB0byBzZXQgdGhlIHByZXZpZXcgdG8gYmUgdGhlIHNhbWUKKyAqIGFzIHRoZSByZXF1ZXN0ZWQgdmlkZW8gc2l6ZS4KKyAqCisgKiBPbiByZXR1cm4sIGl0IGFsc28gcmV0dXJucyB3aGV0aGVyIHRoZSBzZXRWaWRlb1NpemUoKSBpcworICogc3VwcG9ydGVkLgorICovCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRDYW1lcmFWaWRlb1NpemUoCisgICAgQ2FtZXJhUGFyYW1ldGVycyogcGFyYW1zLAorICAgIGJvb2wqIGlzU2V0VmlkZW9TaXplU3VwcG9ydGVkKSB7CisgICAgTE9HVigic2V0Q2FtZXJhVmlkZW9TaXplOiAlZHglZCIsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworCisgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgcmVxdWVzdGVkIHZpZGVvIHNpemUgaXMgc3VwcG9ydGVkCisgICAgVmVjdG9yPFNpemU+IHNpemVzOworICAgIHBhcmFtcy0+Z2V0U3VwcG9ydGVkVmlkZW9TaXplcyhzaXplcyk7CisgICAgKmlzU2V0VmlkZW9TaXplU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICBpZiAoc2l6ZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgTE9HRCgiQ2FtZXJhIGRvZXMgbm90IHN1cHBvcnQgc2V0VmlkZW9TaXplKCkiKTsKKyAgICAgICAgcGFyYW1zLT5nZXRTdXBwb3J0ZWRQcmV2aWV3U2l6ZXMoc2l6ZXMpOworICAgICAgICAqaXNTZXRWaWRlb1NpemVTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFpc1ZpZGVvU2l6ZVN1cHBvcnRlZChzaXplcykpIHsKKyAgICAgICAgTE9HRSgiQ2FtZXJhIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gc2l6ZSAoJWR4JWQpISIsCisgICAgICAgICAgICBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBBY3R1YWxseSBzZXQgdGhlIHZpZGVvIHNpemUKKyAgICBpZiAoaXNTZXRWaWRlb1NpemVTdXBwb3J0ZWQpIHsKKyAgICAgICAgcGFyYW1zLT5zZXRWaWRlb1NpemUobVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyYW1zLT5zZXRQcmV2aWV3U2l6ZShtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQ2FtZXJhKCkgeworICAgIGlmICghbUNhcHR1cmVUaW1lTGFwc2UpIHsKKyAgICAgICAgLy8gRG9udCBjbGlwIGZvciB0aW1lIGxhcHNlIGNhcHR1cmUgYXMgZW5jb2RlciB3aWxsIGhhdmUgZW5vdWdoCisgICAgICAgIC8vIHRpbWUgdG8gZW5jb2RlIGJlY2F1c2Ugb2Ygc2xvdyBjYXB0dXJlIHJhdGUgb2YgdGltZSBsYXBzZS4KKyAgICAgICAgY2xpcFZpZGVvQml0UmF0ZSgpOworICAgICAgICBjbGlwVmlkZW9GcmFtZVJhdGUoKTsKKyAgICAgICAgY2xpcFZpZGVvRnJhbWVXaWR0aCgpOworICAgICAgICBjbGlwVmlkZW9GcmFtZUhlaWdodCgpOworICAgIH0KIAogICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgIGlmIChtQ2FtZXJhID09IDApIHsKQEAgLTg2OSw3ICsxMDQ4LDE3IEBACiAKICAgICAvLyBTZXQgdGhlIGFjdHVhbCB2aWRlbyByZWNvcmRpbmcgZnJhbWUgc2l6ZQogICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKG1DYW1lcmEtPmdldFBhcmFtZXRlcnMoKSk7Ci0gICAgcGFyYW1zLnNldFByZXZpZXdTaXplKG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworCisgICAgLy8gZG9udCBjaGFuZ2UgdGhlIHByZXZpZXcgc2l6ZSBiZWNhdXNlIHRpbWUgbGFwc2UgbWF5IGJlIHVzaW5nIHN0aWxsIGNhbWVyYQorICAgIC8vIGFzIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQgbWF5IGNvcnJlc3BvbmQgdG8gSEQgcmVzb2x1dGlvbiBub3QKKyAgICAvLyBzdXBwb3J0ZWQgYnkgdGhlIHZpZGVvIGNhbWVyYS4KKyAgICBib29sIGlzU2V0VmlkZW9TaXplU3VwcG9ydGVkID0gZmFsc2U7CisgICAgaWYgKCFtQ2FwdHVyZVRpbWVMYXBzZSkgeworICAgICAgICBpZiAoT0sgIT0gc2V0Q2FtZXJhVmlkZW9TaXplKCZwYXJhbXMsICZpc1NldFZpZGVvU2l6ZVN1cHBvcnRlZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwYXJhbXMuc2V0UHJldmlld0ZyYW1lUmF0ZShtRnJhbWVSYXRlKTsKICAgICBTdHJpbmc4IHMgPSBwYXJhbXMuZmxhdHRlbigpOwogICAgIGlmIChPSyAhPSBtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKHMpKSB7CkBAIC04ODEsOSArMTA3MCwxNCBAQAogCiAgICAgLy8gQ2hlY2sgb24gdmlkZW8gZnJhbWUgc2l6ZQogICAgIGludCBmcmFtZVdpZHRoID0gMCwgZnJhbWVIZWlnaHQgPSAwOwotICAgIG5ld0NhbWVyYVBhcmFtcy5nZXRQcmV2aWV3U2l6ZSgmZnJhbWVXaWR0aCwgJmZyYW1lSGVpZ2h0KTsKLSAgICBpZiAoZnJhbWVXaWR0aCAgPCAwIHx8IGZyYW1lV2lkdGggICE9IG1WaWRlb1dpZHRoIHx8Ci0gICAgICAgIGZyYW1lSGVpZ2h0IDwgMCB8fCBmcmFtZUhlaWdodCAhPSBtVmlkZW9IZWlnaHQpIHsKKyAgICBpZiAoaXNTZXRWaWRlb1NpemVTdXBwb3J0ZWQpIHsKKyAgICAgICAgbmV3Q2FtZXJhUGFyYW1zLmdldFZpZGVvU2l6ZSgmZnJhbWVXaWR0aCwgJmZyYW1lSGVpZ2h0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBuZXdDYW1lcmFQYXJhbXMuZ2V0UHJldmlld1NpemUoJmZyYW1lV2lkdGgsICZmcmFtZUhlaWdodCk7CisgICAgfQorICAgIGlmICghbUNhcHR1cmVUaW1lTGFwc2UgJiYKKyAgICAgICAgKGZyYW1lV2lkdGggIDwgMCB8fCBmcmFtZVdpZHRoICAhPSBtVmlkZW9XaWR0aCB8fAorICAgICAgICBmcmFtZUhlaWdodCA8IDAgfHwgZnJhbWVIZWlnaHQgIT0gbVZpZGVvSGVpZ2h0KSkgewogICAgICAgICBMT0dFKCJGYWlsZWQgdG8gc2V0IHRoZSB2aWRlbyBmcmFtZSBzaXplIHRvICVkeCVkIiwKICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CkBAIC05MjEsMTcgKzExMTUsMzAgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwVmlkZW9FbmNvZGVyKHNwPE1lZGlhU291cmNlPiAqc291cmNlKSB7Ci0gICAgc291cmNlLT5jbGVhcigpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gc2V0dXBDYW1lcmFTb3VyY2UoKTsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQ2FtZXJhU291cmNlKHNwPENhbWVyYVNvdXJjZT4gKmNhbWVyYVNvdXJjZSkgeworICAgIHN0YXR1c190IGVyciA9IHNldHVwQ2FtZXJhKCk7CiAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKIAotICAgIHNwPENhbWVyYVNvdXJjZT4gY2FtZXJhU291cmNlID0gQ2FtZXJhU291cmNlOjpDcmVhdGVGcm9tQ2FtZXJhKG1DYW1lcmEpOwotICAgIENIRUNLKGNhbWVyYVNvdXJjZSAhPSBOVUxMKTsKKyAgICBpZiAobUNhcHR1cmVUaW1lTGFwc2UpIHsKKyAgICAgICAgbUNhbWVyYVNvdXJjZVRpbWVMYXBzZSA9IENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6Q3JlYXRlRnJvbUNhbWVyYShtQ2FtZXJhLAorICAgICAgICAgICAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0LCBtRnJhbWVSYXRlKTsKKyAgICAgICAgKmNhbWVyYVNvdXJjZSA9IG1DYW1lcmFTb3VyY2VUaW1lTGFwc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmNhbWVyYVNvdXJjZSA9IENhbWVyYVNvdXJjZTo6Q3JlYXRlRnJvbUNhbWVyYShtQ2FtZXJhKTsKKyAgICB9CisgICAgQ0hFQ0soKmNhbWVyYVNvdXJjZSAhPSBOVUxMKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBWaWRlb0VuY29kZXIoCisgICAgICAgIHNwPE1lZGlhU291cmNlPiBjYW1lcmFTb3VyY2UsCisgICAgICAgIGludDMyX3QgdmlkZW9CaXRSYXRlLAorICAgICAgICBzcDxNZWRpYVNvdXJjZT4gKnNvdXJjZSkgeworICAgIHNvdXJjZS0+Y2xlYXIoKTsKIAogICAgIHNwPE1ldGFEYXRhPiBlbmNfbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIG1WaWRlb0JpdFJhdGUpOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgdmlkZW9CaXRSYXRlKTsKICAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1GcmFtZVJhdGUpOwogCiAgICAgc3dpdGNoIChtVmlkZW9FbmNvZGVyKSB7CkBAIC05NzUsMTQgKzExODIsMjQgQEAKICAgICB9CiAgICAgaWYgKG1WaWRlb0VuY29kZXJMZXZlbCAhPSAtMSkgewogICAgICAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVZpZGVvTGV2ZWwsIG1WaWRlb0VuY29kZXJMZXZlbCk7CisgICAgfSBlbHNlIGlmIChtQ2FwdHVyZVRpbWVMYXBzZSkgeworICAgICAgICAvLyBDaGVjayBpZiB3ZSBhcmUgdXNpbmcgaGlnaCByZXNvbHV0aW9uIGFuZC9vciBoaWdoIGJpdHJhdGUgYW5kCisgICAgICAgIC8vIHNldCBhcHByb3ByaWF0ZSBsZXZlbCBmb3IgdGhlIHNvZnR3YXJlIEFWQ0VuY29kZXIuCisgICAgICAgIGlmICgod2lkdGggKiBoZWlnaHQgPj0gOTIxNjAwKSAvLyA3MjBwCisgICAgICAgICAgICAgICAgfHwgKHZpZGVvQml0UmF0ZSA+PSAyMDAwMDAwMCkpIHsKKyAgICAgICAgICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5VmlkZW9MZXZlbCwgNTApOworICAgICAgICB9CiAgICAgfQogCiAgICAgT01YQ2xpZW50IGNsaWVudDsKICAgICBDSEVDS19FUShjbGllbnQuY29ubmVjdCgpLCBPSyk7CiAKKyAgICAvLyBVc2Ugc29mdHdhcmUgY29kZWMgZm9yIHRpbWUgbGFwc2UKKyAgICB1aW50MzJfdCBlbmNvZGVyX2ZsYWdzID0gKG1DYXB0dXJlVGltZUxhcHNlKSA/IE9NWENvZGVjOjprUHJlZmVyU29mdHdhcmVDb2RlY3MgOiAwOwogICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKICAgICAgICAgICAgIGNsaWVudC5pbnRlcmZhY2UoKSwgZW5jX21ldGEsCi0gICAgICAgICAgICB0cnVlIC8qIGNyZWF0ZUVuY29kZXIgKi8sIGNhbWVyYVNvdXJjZSk7CisgICAgICAgICAgICB0cnVlIC8qIGNyZWF0ZUVuY29kZXIgKi8sIGNhbWVyYVNvdXJjZSwKKyAgICAgICAgICAgIE5VTEwsIGVuY29kZXJfZmxhZ3MpOwogICAgIGlmIChlbmNvZGVyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQpAQCAtMTAxMyw1MSArMTIzMCwxNDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0TVBFRzRSZWNvcmRpbmcoKSB7Ci0gICAgaW50MzJfdCB0b3RhbEJpdFJhdGUgPSAwOworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBNUEVHNFJlY29yZGluZygKKyAgICAgICAgYm9vbCB1c2VTcGxpdENhbWVyYVNvdXJjZSwKKyAgICAgICAgaW50IG91dHB1dEZkLAorICAgICAgICBpbnQzMl90IHZpZGVvV2lkdGgsIGludDMyX3QgdmlkZW9IZWlnaHQsCisgICAgICAgIGludDMyX3QgdmlkZW9CaXRSYXRlLAorICAgICAgICBpbnQzMl90ICp0b3RhbEJpdFJhdGUsCisgICAgICAgIHNwPE1lZGlhV3JpdGVyPiAqbWVkaWFXcml0ZXIpIHsKKyAgICBtZWRpYVdyaXRlci0+Y2xlYXIoKTsKKyAgICAqdG90YWxCaXRSYXRlID0gMDsKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBzcDxNZWRpYVdyaXRlcj4gd3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKGR1cChtT3V0cHV0RmQpKTsKKyAgICBzcDxNZWRpYVdyaXRlcj4gd3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKGR1cChvdXRwdXRGZCkpOwogCiAgICAgLy8gQWRkIGF1ZGlvIHNvdXJjZSBmaXJzdCBpZiBpdCBleGlzdHMKLSAgICBpZiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9MSVNUX0VORCkgeworICAgIGlmICghbUNhcHR1cmVUaW1lTGFwc2UgJiYgKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfTElTVF9FTkQpKSB7CiAgICAgICAgIGVyciA9IHNldHVwQXVkaW9FbmNvZGVyKHdyaXRlcik7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7Ci0gICAgICAgIHRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOworICAgICAgICAqdG90YWxCaXRSYXRlICs9IG1BdWRpb0JpdFJhdGU7CiAgICAgfQogICAgIGlmIChtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX0RFRkFVTFQKICAgICAgICAgICAgIHx8IG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfQ0FNRVJBKSB7CisKKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGNhbWVyYU1lZGlhU291cmNlOworICAgICAgICBpZiAodXNlU3BsaXRDYW1lcmFTb3VyY2UpIHsKKyAgICAgICAgICAgIExPR1YoIlVzaW5nIFNwbGl0IGNhbWVyYSBzb3VyY2UiKTsKKyAgICAgICAgICAgIGNhbWVyYU1lZGlhU291cmNlID0gbUNhbWVyYVNvdXJjZVNwbGl0dGVyLT5jcmVhdGVDbGllbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNwPENhbWVyYVNvdXJjZT4gY2FtZXJhU291cmNlOworICAgICAgICAgICAgZXJyID0gc2V0dXBDYW1lcmFTb3VyY2UoJmNhbWVyYVNvdXJjZSk7CisgICAgICAgICAgICBjYW1lcmFNZWRpYVNvdXJjZSA9IGNhbWVyYVNvdXJjZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHZpZGVvV2lkdGggIT0gbVZpZGVvV2lkdGgpIHx8ICh2aWRlb0hlaWdodCAhPSBtVmlkZW9IZWlnaHQpKSB7CisgICAgICAgICAgICAvLyBVc2UgZG93bnNhbXBsaW5nIGZyb20gdGhlIG9yaWdpbmFsIHNvdXJjZS4KKyAgICAgICAgICAgIGNhbWVyYU1lZGlhU291cmNlID0KKyAgICAgICAgICAgICAgICBuZXcgVmlkZW9Tb3VyY2VEb3duU2FtcGxlcihjYW1lcmFNZWRpYVNvdXJjZSwgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQpOworICAgICAgICB9CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKwogICAgICAgICBzcDxNZWRpYVNvdXJjZT4gZW5jb2RlcjsKLSAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIoJmVuY29kZXIpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworICAgICAgICBlcnIgPSBzZXR1cFZpZGVvRW5jb2RlcihjYW1lcmFNZWRpYVNvdXJjZSwgdmlkZW9CaXRSYXRlLCAmZW5jb2Rlcik7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKwogICAgICAgICB3cml0ZXItPmFkZFNvdXJjZShlbmNvZGVyKTsKLSAgICAgICAgdG90YWxCaXRSYXRlICs9IG1WaWRlb0JpdFJhdGU7CisgICAgICAgICp0b3RhbEJpdFJhdGUgKz0gdmlkZW9CaXRSYXRlOwogICAgIH0KIAogICAgIGlmIChtSW50ZXJsZWF2ZUR1cmF0aW9uVXMgPiAwKSB7CiAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TVBFRzRXcml0ZXIgKj4od3JpdGVyLmdldCgpKS0+CiAgICAgICAgICAgICBzZXRJbnRlcmxlYXZlRHVyYXRpb24obUludGVybGVhdmVEdXJhdGlvblVzKTsKICAgICB9Ci0KICAgICBpZiAobU1heEZpbGVEdXJhdGlvblVzICE9IDApIHsKICAgICAgICAgd3JpdGVyLT5zZXRNYXhGaWxlRHVyYXRpb24obU1heEZpbGVEdXJhdGlvblVzKTsKICAgICB9CiAgICAgaWYgKG1NYXhGaWxlU2l6ZUJ5dGVzICE9IDApIHsKICAgICAgICAgd3JpdGVyLT5zZXRNYXhGaWxlU2l6ZShtTWF4RmlsZVNpemVCeXRlcyk7CiAgICAgfQotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1ldGEtPnNldEludDY0KGtLZXlUaW1lLCBzeXN0ZW1UaW1lKCkgLyAxMDAwKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG1PdXRwdXRGb3JtYXQpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlCaXRSYXRlLCB0b3RhbEJpdFJhdGUpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXk2NEJpdEZpbGVPZmZzZXQsIG1Vc2U2NEJpdEZpbGVPZmZzZXQpOworCisgICAgd3JpdGVyLT5zZXRMaXN0ZW5lcihtTGlzdGVuZXIpOworICAgICptZWRpYVdyaXRlciA9IHdyaXRlcjsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBNUEVHNE1ldGFEYXRhKGludDY0X3Qgc3RhcnRUaW1lVXMsIGludDMyX3QgdG90YWxCaXRSYXRlLAorICAgICAgICBzcDxNZXRhRGF0YT4gKm1ldGEpIHsKKyAgICAoKm1ldGEpLT5zZXRJbnQ2NChrS2V5VGltZSwgc3RhcnRUaW1lVXMpOworICAgICgqbWV0YSktPnNldEludDMyKGtLZXlGaWxlVHlwZSwgbU91dHB1dEZvcm1hdCk7CisgICAgKCptZXRhKS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIHRvdGFsQml0UmF0ZSk7CisgICAgKCptZXRhKS0+c2V0SW50MzIoa0tleTY0Qml0RmlsZU9mZnNldCwgbVVzZTY0Qml0RmlsZU9mZnNldCk7CiAgICAgaWYgKG1Nb3ZpZVRpbWVTY2FsZSA+IDApIHsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRpbWVTY2FsZSwgbU1vdmllVGltZVNjYWxlKTsKKyAgICAgICAgKCptZXRhKS0+c2V0SW50MzIoa0tleVRpbWVTY2FsZSwgbU1vdmllVGltZVNjYWxlKTsKICAgICB9CiAgICAgaWYgKG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMgPiAwKSB7Ci0gICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlUcmFja1RpbWVTdGF0dXMsIG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMpOworICAgICAgICAoKm1ldGEpLT5zZXRJbnQ2NChrS2V5VHJhY2tUaW1lU3RhdHVzLCBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzKTsKICAgICB9Ci0gICAgd3JpdGVyLT5zZXRMaXN0ZW5lcihtTGlzdGVuZXIpOwotICAgIG1Xcml0ZXIgPSB3cml0ZXI7Ci0gICAgcmV0dXJuIG1Xcml0ZXItPnN0YXJ0KG1ldGEuZ2V0KCkpOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydE1QRUc0UmVjb3JkaW5nKCkgeworICAgIGlmIChtQ2FwdHVyZUF1eFZpZGVvKSB7CisgICAgICAgIGlmICghbUNhcHR1cmVUaW1lTGFwc2UpIHsKKyAgICAgICAgICAgIExPR0UoIkF1eGlsaWFyeSB2aWRlbyBjYW4gYmUgY2FwdHVyZWQgb25seSBpbiB0aW1lIGxhcHNlIG1vZGUiKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIExPR1YoIkNyZWF0aW5nIE1lZGlhU291cmNlU3BsaXR0ZXIiKTsKKyAgICAgICAgc3A8Q2FtZXJhU291cmNlPiBjYW1lcmFTb3VyY2U7CisgICAgICAgIHN0YXR1c190IGVyciA9IHNldHVwQ2FtZXJhU291cmNlKCZjYW1lcmFTb3VyY2UpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIG1DYW1lcmFTb3VyY2VTcGxpdHRlciA9IG5ldyBNZWRpYVNvdXJjZVNwbGl0dGVyKGNhbWVyYVNvdXJjZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNhbWVyYVNvdXJjZVNwbGl0dGVyID0gTlVMTDsKKyAgICB9CisKKyAgICBpbnQzMl90IHRvdGFsQml0UmF0ZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cE1QRUc0UmVjb3JkaW5nKG1DYXB0dXJlQXV4VmlkZW8sCisgICAgICAgICAgICBtT3V0cHV0RmQsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQsCisgICAgICAgICAgICBtVmlkZW9CaXRSYXRlLCAmdG90YWxCaXRSYXRlLCAmbVdyaXRlcik7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBzeXN0ZW1UaW1lKCkgLyAxMDAwOworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOworICAgIHNldHVwTVBFRzRNZXRhRGF0YShzdGFydFRpbWVVcywgdG90YWxCaXRSYXRlLCAmbWV0YSk7CisKKyAgICBlcnIgPSBtV3JpdGVyLT5zdGFydChtZXRhLmdldCgpKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKG1DYXB0dXJlQXV4VmlkZW8pIHsKKyAgICAgICAgQ0hFQ0sobU91dHB1dEZkQXV4ID49IDApOworICAgICAgICBpZiAobVdyaXRlckF1eCAhPSBOVUxMKSB7CisgICAgICAgICAgICBMT0dFKCJBdXhpbGlhcnkgRmlsZSB3cml0ZXIgaXMgbm90IGF2YWlhbGJsZSIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChtQXV4VmlkZW9XaWR0aCA+IG1WaWRlb1dpZHRoKSB8fCAobUF1eFZpZGVvSGVpZ2h0ID4gbVZpZGVvSGVpZ2h0KSB8fAorICAgICAgICAgICAgICAgICgobUF1eFZpZGVvV2lkdGggPT0gbVZpZGVvV2lkdGgpICYmIG1BdXhWaWRlb0hlaWdodCA9PSBtVmlkZW9IZWlnaHQpKSB7CisgICAgICAgICAgICBMT0dFKCJBdXhpbGlhcnkgdmlkZW8gc2l6ZSAoJWQgeCAlZCkgc2FtZSBvciBsYXJnZXIgdGhhbiB0aGUgbWFpbiB2aWRlbyBzaXplICglZCB4ICVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1BdXhWaWRlb1dpZHRoLCBtQXV4VmlkZW9IZWlnaHQsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHRvdGFsQml0cmF0ZUF1eDsKKyAgICAgICAgZXJyID0gc2V0dXBNUEVHNFJlY29yZGluZyhtQ2FwdHVyZUF1eFZpZGVvLAorICAgICAgICAgICAgICAgIG1PdXRwdXRGZEF1eCwgbUF1eFZpZGVvV2lkdGgsIG1BdXhWaWRlb0hlaWdodCwKKyAgICAgICAgICAgICAgICBtQXV4VmlkZW9CaXRSYXRlLCAmdG90YWxCaXRyYXRlQXV4LCAmbVdyaXRlckF1eCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YUF1eCA9IG5ldyBNZXRhRGF0YTsKKyAgICAgICAgc2V0dXBNUEVHNE1ldGFEYXRhKHN0YXJ0VGltZVVzLCB0b3RhbEJpdHJhdGVBdXgsICZtZXRhQXV4KTsKKworICAgICAgICByZXR1cm4gbVdyaXRlckF1eC0+c3RhcnQobWV0YUF1eC5nZXQoKSk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpwYXVzZSgpIHsKQEAgLTEwNjYsMTIgKzEzNzksMzMgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogICAgIG1Xcml0ZXItPnBhdXNlKCk7CisKKyAgICBpZiAobUNhcHR1cmVBdXhWaWRlbykgeworICAgICAgICBpZiAobVdyaXRlckF1eCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtV3JpdGVyQXV4LT5wYXVzZSgpOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RvcCgpIHsKICAgICBMT0dWKCJzdG9wIik7CiAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisKKyAgICBpZiAobUNhcHR1cmVUaW1lTGFwc2UgJiYgbUNhbWVyYVNvdXJjZVRpbWVMYXBzZSAhPSBOVUxMKSB7CisgICAgICAgIG1DYW1lcmFTb3VyY2VUaW1lTGFwc2UtPnN0YXJ0UXVpY2tSZWFkUmV0dXJucygpOworICAgICAgICBtQ2FtZXJhU291cmNlVGltZUxhcHNlID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobUNhcHR1cmVBdXhWaWRlbykgeworICAgICAgICBpZiAobVdyaXRlckF1eCAhPSBOVUxMKSB7CisgICAgICAgICAgICBtV3JpdGVyQXV4LT5zdG9wKCk7CisgICAgICAgICAgICBtV3JpdGVyQXV4LmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAobVdyaXRlciAhPSBOVUxMKSB7CiAgICAgICAgIGVyciA9IG1Xcml0ZXItPnN0b3AoKTsKICAgICAgICAgbVdyaXRlci5jbGVhcigpOwpAQCAtMTA5NSw2ICsxNDI5LDEzIEBACiAgICAgICAgIG1PdXRwdXRGZCA9IC0xOwogICAgIH0KIAorICAgIGlmIChtQ2FwdHVyZUF1eFZpZGVvKSB7CisgICAgICAgIGlmIChtT3V0cHV0RmRBdXggPj0gMCkgeworICAgICAgICAgICAgOjpjbG9zZShtT3V0cHV0RmRBdXgpOworICAgICAgICAgICAgbU91dHB1dEZkQXV4ID0gLTE7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gZXJyOwogfQogCkBAIC0xMTE5LDggKzE0NjAsMTEgQEAKICAgICBtVmlkZW9FbmNvZGVyICA9IFZJREVPX0VOQ09ERVJfSDI2MzsKICAgICBtVmlkZW9XaWR0aCAgICA9IDE3NjsKICAgICBtVmlkZW9IZWlnaHQgICA9IDE0NDsKKyAgICBtQXV4VmlkZW9XaWR0aCAgICA9IDE3NjsKKyAgICBtQXV4VmlkZW9IZWlnaHQgICA9IDE0NDsKICAgICBtRnJhbWVSYXRlICAgICA9IDIwOwogICAgIG1WaWRlb0JpdFJhdGUgID0gMTkyMDAwOworICAgIG1BdXhWaWRlb0JpdFJhdGUgPSAxOTIwMDA7CiAgICAgbVNhbXBsZVJhdGUgICAgPSA4MDAwOwogICAgIG1BdWRpb0NoYW5uZWxzID0gMTsKICAgICBtQXVkaW9CaXRSYXRlICA9IDEyMjAwOwpAQCAtMTEzNyw5ICsxNDgxLDE1IEBACiAgICAgbU1heEZpbGVEdXJhdGlvblVzID0gMDsKICAgICBtTWF4RmlsZVNpemVCeXRlcyA9IDA7CiAgICAgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VcyA9IDA7CisgICAgbUNhcHR1cmVUaW1lTGFwc2UgPSBmYWxzZTsKKyAgICBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyA9IC0xOworICAgIG1DYXB0dXJlQXV4VmlkZW8gPSBmYWxzZTsKKyAgICBtQ2FtZXJhU291cmNlU3BsaXR0ZXIgPSBOVUxMOworICAgIG1DYW1lcmFTb3VyY2VUaW1lTGFwc2UgPSBOVUxMOwogICAgIG1FbmNvZGVyUHJvZmlsZXMgPSBNZWRpYVByb2ZpbGVzOjpnZXRJbnN0YW5jZSgpOwogCiAgICAgbU91dHB1dEZkID0gLTE7CisgICAgbU91dHB1dEZkQXV4ID0gLTE7CiAgICAgbUZsYWdzID0gMDsKIAogICAgIHJldHVybiBPSzsKQEAgLTExNzcsNiArMTUyNyw4IEBACiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgUmVjb3JkZXI6ICVwXG4iLCB0aGlzKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICBPdXRwdXQgZmlsZSAoZmQgJWQpOlxuIiwgbU91dHB1dEZkKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgT3V0cHV0IGZpbGUgQXV4aWxpYXJ5IChmZCAlZCk6XG4iLCBtT3V0cHV0RmRBdXgpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEZpbGUgZm9ybWF0OiAlZFxuIiwgbU91dHB1dEZvcm1hdCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgTWF4IGZpbGUgc2l6ZSAoYnl0ZXMpOiAlbGxkXG4iLCBtTWF4RmlsZVNpemVCeXRlcyk7CkBAIC0xMjIxLDEwICsxNTczLDE0IEBACiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgRnJhbWUgc2l6ZSAocGl4ZWxzKTogJWR4JWRcbiIsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEF1eCBGcmFtZSBzaXplIChwaXhlbHMpOiAlZHglZFxuIiwgbUF1eFZpZGVvV2lkdGgsIG1BdXhWaWRlb0hlaWdodCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgRnJhbWUgcmF0ZSAoZnBzKTogJWRcbiIsIG1GcmFtZVJhdGUpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEJpdCByYXRlIChicHMpOiAlZFxuIiwgbVZpZGVvQml0UmF0ZSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgQXV4IEJpdCByYXRlIChicHMpOiAlZFxuIiwgbUF1eFZpZGVvQml0UmF0ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKaW5kZXggMjE2ZjZiYy4uZjE0YzcwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCkBAIC0xOSwxMyArMTksMTggQEAKICNkZWZpbmUgU1RBR0VGUklHSFRfUkVDT1JERVJfSF8KIAogI2luY2x1ZGUgPG1lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgQ2FtZXJhOworY2xhc3MgQ2FtZXJhU291cmNlOworY2xhc3MgQ2FtZXJhU291cmNlVGltZUxhcHNlOworY2xhc3MgTWVkaWFTb3VyY2VTcGxpdHRlcjsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKIHN0cnVjdCBNZWRpYVdyaXRlcjsKK2NsYXNzIE1ldGFEYXRhOwogc3RydWN0IEF1ZGlvU291cmNlOwogY2xhc3MgTWVkaWFQcm9maWxlczsKIApAQCAtNDIsOSArNDcsMTAgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIgKnBhdGgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGludCBmZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMaXN0ZW5lcihjb25zdCBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4mIGxpc3RlbmVyKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmUoKTsKQEAgLTYzLDkgKzY5LDkgQEAKICAgICB9OwogCiAgICAgc3A8Q2FtZXJhPiBtQ2FtZXJhOwotICAgIHNwPElTdXJmYWNlPiBtUHJldmlld1N1cmZhY2U7CisgICAgc3A8U3VyZmFjZT4gbVByZXZpZXdTdXJmYWNlOwogICAgIHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiBtTGlzdGVuZXI7Ci0gICAgc3A8TWVkaWFXcml0ZXI+IG1Xcml0ZXI7CisgICAgc3A8TWVkaWFXcml0ZXI+IG1Xcml0ZXIsIG1Xcml0ZXJBdXg7CiAgICAgc3A8QXVkaW9Tb3VyY2U+IG1BdWRpb1NvdXJjZU5vZGU7CiAKICAgICBhdWRpb19zb3VyY2UgbUF1ZGlvU291cmNlOwpAQCAtNzUsOCArODEsOSBAQAogICAgIHZpZGVvX2VuY29kZXIgbVZpZGVvRW5jb2RlcjsKICAgICBib29sIG1Vc2U2NEJpdEZpbGVPZmZzZXQ7CiAgICAgaW50MzJfdCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0OworICAgIGludDMyX3QgbUF1eFZpZGVvV2lkdGgsIG1BdXhWaWRlb0hlaWdodDsKICAgICBpbnQzMl90IG1GcmFtZVJhdGU7Ci0gICAgaW50MzJfdCBtVmlkZW9CaXRSYXRlOworICAgIGludDMyX3QgbVZpZGVvQml0UmF0ZSwgbUF1eFZpZGVvQml0UmF0ZTsKICAgICBpbnQzMl90IG1BdWRpb0JpdFJhdGU7CiAgICAgaW50MzJfdCBtQXVkaW9DaGFubmVsczsKICAgICBpbnQzMl90IG1TYW1wbGVSYXRlOwpAQCAtOTIsMjAgKzk5LDQyIEBACiAgICAgaW50NjRfdCBtTWF4RmlsZUR1cmF0aW9uVXM7CiAgICAgaW50NjRfdCBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzOwogCisgICAgYm9vbCBtQ2FwdHVyZVRpbWVMYXBzZTsKKyAgICBpbnQ2NF90IG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzOworICAgIGJvb2wgbUNhcHR1cmVBdXhWaWRlbzsKKyAgICBzcDxNZWRpYVNvdXJjZVNwbGl0dGVyPiBtQ2FtZXJhU291cmNlU3BsaXR0ZXI7CisgICAgc3A8Q2FtZXJhU291cmNlVGltZUxhcHNlPiBtQ2FtZXJhU291cmNlVGltZUxhcHNlOworCiAgICAgU3RyaW5nOCBtUGFyYW1zOwotICAgIGludCBtT3V0cHV0RmQ7CisgICAgaW50IG1PdXRwdXRGZCwgbU91dHB1dEZkQXV4OwogICAgIGludDMyX3QgbUZsYWdzOwogCiAgICAgTWVkaWFQcm9maWxlcyAqbUVuY29kZXJQcm9maWxlczsKIAorICAgIHN0YXR1c190IHNldHVwTVBFRzRSZWNvcmRpbmcoCisgICAgICAgIGJvb2wgdXNlU3BsaXRDYW1lcmFTb3VyY2UsCisgICAgICAgIGludCBvdXRwdXRGZCwKKyAgICAgICAgaW50MzJfdCB2aWRlb1dpZHRoLCBpbnQzMl90IHZpZGVvSGVpZ2h0LAorICAgICAgICBpbnQzMl90IHZpZGVvQml0UmF0ZSwKKyAgICAgICAgaW50MzJfdCAqdG90YWxCaXRSYXRlLAorICAgICAgICBzcDxNZWRpYVdyaXRlcj4gKm1lZGlhV3JpdGVyKTsKKyAgICB2b2lkIHNldHVwTVBFRzRNZXRhRGF0YShpbnQ2NF90IHN0YXJ0VGltZVVzLCBpbnQzMl90IHRvdGFsQml0UmF0ZSwKKyAgICAgICAgc3A8TWV0YURhdGE+ICptZXRhKTsKICAgICBzdGF0dXNfdCBzdGFydE1QRUc0UmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc3RhcnRBTVJSZWNvcmRpbmcoKTsKICAgICBzdGF0dXNfdCBzdGFydEFBQ1JlY29yZGluZygpOwogICAgIHN0YXR1c190IHN0YXJ0UlRQUmVjb3JkaW5nKCk7CiAgICAgc3A8TWVkaWFTb3VyY2U+IGNyZWF0ZUF1ZGlvU291cmNlKCk7Ci0gICAgc3RhdHVzX3Qgc2V0dXBDYW1lcmFTb3VyY2UoKTsKKyAgICBzdGF0dXNfdCBzZXR1cENhbWVyYSgpOworICAgIGJvb2wgICAgIGlzVmlkZW9TaXplU3VwcG9ydGVkKGNvbnN0IFZlY3RvcjxTaXplPiYgc3VwcG9ydGVkU2l6ZXMpIGNvbnN0OworICAgIHN0YXR1c190IHNldENhbWVyYVZpZGVvU2l6ZShDYW1lcmFQYXJhbWV0ZXJzKiBwYXJhbXMsCisgICAgICAgICAgICAgICAgYm9vbCAqaXNTZXRWaWRlb1NpemVTdXBwb3J0ZWQpOworICAgIHN0YXR1c190IHNldHVwQ2FtZXJhU291cmNlKHNwPENhbWVyYVNvdXJjZT4gKmNhbWVyYVNvdXJjZSk7CiAgICAgc3RhdHVzX3Qgc2V0dXBBdWRpb0VuY29kZXIoY29uc3Qgc3A8TWVkaWFXcml0ZXI+JiB3cml0ZXIpOwotICAgIHN0YXR1c190IHNldHVwVmlkZW9FbmNvZGVyKHNwPE1lZGlhU291cmNlPiAqc291cmNlKTsKKyAgICBzdGF0dXNfdCBzZXR1cFZpZGVvRW5jb2RlcigKKyAgICAgICAgICAgIHNwPE1lZGlhU291cmNlPiBjYW1lcmFTb3VyY2UsCisgICAgICAgICAgICBpbnQzMl90IHZpZGVvQml0UmF0ZSwKKyAgICAgICAgICAgIHNwPE1lZGlhU291cmNlPiAqc291cmNlKTsKIAogICAgIC8vIEVuY29kaW5nIHBhcmFtZXRlciBoYW5kbGluZyB1dGlsaXRpZXMKICAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoY29uc3QgU3RyaW5nOCAma2V5LCBjb25zdCBTdHJpbmc4ICZ2YWx1ZSk7CkBAIC0xMTMsNiArMTQyLDExIEBACiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdWRpb051bWJlck9mQ2hhbm5lbHMoaW50MzJfdCBjaGFubmxlcyk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdWRpb1NhbXBsaW5nUmF0ZShpbnQzMl90IHNhbXBsZVJhdGUpOwogICAgIHN0YXR1c190IHNldFBhcmFtQXVkaW9UaW1lU2NhbGUoaW50MzJfdCB0aW1lU2NhbGUpOworICAgIHN0YXR1c190IHNldFBhcmFtVGltZUxhcHNlRW5hYmxlKGludDMyX3QgdGltZUxhcHNlRW5hYmxlKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlKGludDY0X3QgdGltZVVzKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbUF1eFZpZGVvSGVpZ2h0KGludDMyX3QgaGVpZ2h0KTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbUF1eFZpZGVvV2lkdGgoaW50MzJfdCB3aWR0aCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdXhWaWRlb0VuY29kaW5nQml0UmF0ZShpbnQzMl90IGJpdFJhdGUpOwogICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9FbmNvZGluZ0JpdFJhdGUoaW50MzJfdCBiaXRSYXRlKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvSUZyYW1lc0ludGVydmFsKGludDMyX3Qgc2Vjb25kcyk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb0VuY29kZXJQcm9maWxlKGludDMyX3QgcHJvZmlsZSk7CkBAIC0xMzcsNCArMTcxLDMgQEAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gU1RBR0VGUklHSFRfUkVDT1JERVJfSF8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaAppbmRleCA2ZTZjM2NkLi41ZWFmNTkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaApAQCAtNzUsNyArNzUsMTAgQEAKIAogCiAgICAgLy8gQWxsIHRoZSBtZXRob2RzIGJlbG93IHdyYXAgdGhlIG1QbGF5ZXIgaW5zdGFuY2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2UoY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6SVN1cmZhY2U+JiBzKSAgeworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9JU3VyZmFjZShjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpJU3VyZmFjZT4mIHMpICB7CisgICAgICAgIHJldHVybiBtUGxheWVyLT5zZXRWaWRlb0lTdXJmYWNlKHMpOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZShjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpTdXJmYWNlPiYgcykgIHsKICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNldFZpZGVvU3VyZmFjZShzKTsKICAgICB9CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKCkge3JldHVybiBtUGxheWVyLT5wcmVwYXJlKCk7fQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKaW5kZXggM2UxN2E3ZS4uNDcyYmZjZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCkBAIC0xMCw2ICsxMCw4IEBACiAgICAgICAgIEF1ZGlvU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEF3ZXNvbWVQbGF5ZXIuY3BwICAgICAgICAgICAgICAgICBcCiAgICAgICAgIENhbWVyYVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAgICAgICAgICBcCisgICAgICAgIFZpZGVvU291cmNlRG93blNhbXBsZXIuY3BwICAgICAgICBcCiAgICAgICAgIERhdGFTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEVTRFMuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEZpbGVTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCkBAIC0yNCw2ICsyNiw3IEBACiAgICAgICAgIE1lZGlhRGVmcy5jcHAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1lZGlhU291cmNlU3BsaXR0ZXIuY3BwICAgICAgICAgICBcCiAgICAgICAgIE1ldGFEYXRhLmNwcCAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE51Q2FjaGVkU291cmNlMi5jcHAgICAgICAgICAgICAgICBcCiAgICAgICAgIE51SFRUUERhdGFTb3VyY2UuY3BwICAgICAgICAgICAgICBcCkBAIC02MCw2ICs2Myw3IEBACiAgICAgICAgIGxpYnNvbml2b3ggICAgICAgIFwKICAgICAgICAgbGlidm9yYmlzaWRlYyAgICAgXAogICAgICAgICBsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnQgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF95dXYgXAogICAgICAgICBsaWJjYW1lcmFfY2xpZW50CiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcAppbmRleCAwNDBlMjdkLi4zMWMwM2FkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcApAQCAtNDQsNyArNDQsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KIAotI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lTdXJmYWNlLmg+CisjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAKQEAgLTEwMCwxMyArMTAwLDE0IEBACiAgICAgICAgICAgICBib29sIHByZXZpZXdPbmx5LAogICAgICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwKICAgICAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0LAotICAgICAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlLAorICAgICAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2U+ICZpc3VyZmFjZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAogICAgICAgICAgICAgc2l6ZV90IGRpc3BsYXlXaWR0aCwgc2l6ZV90IGRpc3BsYXlIZWlnaHQsCiAgICAgICAgICAgICBzaXplX3QgZGVjb2RlZFdpZHRoLCBzaXplX3QgZGVjb2RlZEhlaWdodCkKICAgICAgICAgOiBtVGFyZ2V0KE5VTEwpLAogICAgICAgICAgIG1MaWJIYW5kbGUoTlVMTCkgewogICAgICAgICAgICAgaW5pdChwcmV2aWV3T25seSwgY29tcG9uZW50TmFtZSwKLSAgICAgICAgICAgICAgICAgY29sb3JGb3JtYXQsIHN1cmZhY2UsIGRpc3BsYXlXaWR0aCwKKyAgICAgICAgICAgICAgICAgY29sb3JGb3JtYXQsIGlzdXJmYWNlLCBzdXJmYWNlLCBkaXNwbGF5V2lkdGgsCiAgICAgICAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQsIGRlY29kZWRXaWR0aCwgZGVjb2RlZEhlaWdodCk7CiAgICAgfQogCkBAIC0xMzgsNyArMTM5LDggQEAKICAgICAgICAgICAgIGJvb2wgcHJldmlld09ubHksCiAgICAgICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLAogICAgICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQsCi0gICAgICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UsCisgICAgICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4gJmlzdXJmYWNlLAorICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgICAgICBzaXplX3QgZGlzcGxheVdpZHRoLCBzaXplX3QgZGlzcGxheUhlaWdodCwKICAgICAgICAgICAgIHNpemVfdCBkZWNvZGVkV2lkdGgsIHNpemVfdCBkZWNvZGVkSGVpZ2h0KTsKIApAQCAtMTUwLDcgKzE1Miw4IEBACiAgICAgICAgIGJvb2wgcHJldmlld09ubHksCiAgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsCiAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0LAotICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UsCisgICAgICAgIGNvbnN0IHNwPElTdXJmYWNlPiAmaXN1cmZhY2UsCisgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAogICAgICAgICBzaXplX3QgZGlzcGxheVdpZHRoLCBzaXplX3QgZGlzcGxheUhlaWdodCwKICAgICAgICAgc2l6ZV90IGRlY29kZWRXaWR0aCwgc2l6ZV90IGRlY29kZWRIZWlnaHQpIHsKICAgICBpZiAoIXByZXZpZXdPbmx5KSB7CkBAIC0xNzYsNyArMTc5LDcgQEAKIAogICAgICAgICAgICAgaWYgKGZ1bmMpIHsKICAgICAgICAgICAgICAgICBtVGFyZ2V0ID0KLSAgICAgICAgICAgICAgICAgICAgKCpmdW5jKShzdXJmYWNlLCBjb21wb25lbnROYW1lLCBjb2xvckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgKCpmdW5jKShpc3VyZmFjZSwgY29tcG9uZW50TmFtZSwgY29sb3JGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQpOwogICAgICAgICAgICAgfQpAQCAtNjg4LDggKzY5MSwxOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBBd2Vzb21lUGxheWVyOjpub3RpZnlWaWRlb1NpemVfbCgpIHsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1WaWRlb1NvdXJjZS0+Z2V0Rm9ybWF0KCk7CisKKyAgICBpbnQzMl90IGRlY29kZWRXaWR0aCwgZGVjb2RlZEhlaWdodDsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmZGVjb2RlZFdpZHRoKSk7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZkZWNvZGVkSGVpZ2h0KSk7CisKKyAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NFVF9WSURFT19TSVpFLCBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQpOworfQorCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6OmluaXRSZW5kZXJlcl9sKCkgewotICAgIGlmIChtSVN1cmZhY2UgIT0gTlVMTCkgeworICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMIHx8IG1JU3VyZmFjZSAhPSBOVUxMKSB7CiAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVZpZGVvU291cmNlLT5nZXRGb3JtYXQoKTsKIAogICAgICAgICBpbnQzMl90IGZvcm1hdDsKQEAgLTcwNiw3ICs3MTksMTggQEAKICAgICAgICAgLy8gYmVmb3JlIGNyZWF0aW5nIGEgbmV3IG9uZS4KICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogCi0gICAgICAgIGlmICghc3RybmNtcCgiT01YLiIsIGNvbXBvbmVudCwgNCkpIHsKKyAgICAgICAgaWYgKG1TdXJmYWNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIE90aGVyIGRlY29kZXJzIGFyZSBpbnN0YW50aWF0ZWQgbG9jYWxseSBhbmQgYXMgYSBjb25zZXF1ZW5jZQorICAgICAgICAgICAgLy8gYWxsb2NhdGUgdGhlaXIgYnVmZmVycyBpbiBsb2NhbCBhZGRyZXNzIHNwYWNlLgorICAgICAgICAgICAgbVZpZGVvUmVuZGVyZXIgPSBuZXcgQXdlc29tZUxvY2FsUmVuZGVyZXIoCisgICAgICAgICAgICAgICAgZmFsc2UsICAvLyBwcmV2aWV3T25seQorICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpZm9ybWF0LAorICAgICAgICAgICAgICAgIG1JU3VyZmFjZSwKKyAgICAgICAgICAgICAgICBtU3VyZmFjZSwKKyAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0LAorICAgICAgICAgICAgICAgIGRlY29kZWRXaWR0aCwgZGVjb2RlZEhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBPdXIgT01YIGNvZGVjcyBhbGxvY2F0ZSBidWZmZXJzIG9uIHRoZSBtZWRpYV9zZXJ2ZXIgc2lkZQogICAgICAgICAgICAgLy8gdGhlcmVmb3JlIHRoZXkgcmVxdWlyZSBhIHJlbW90ZSBJT01YUmVuZGVyZXIgdGhhdCBrbm93cyBob3cKICAgICAgICAgICAgIC8vIHRvIGRpc3BsYXkgdGhlbS4KQEAgLTcxNiwxNiArNzQwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfQ09MT1JfRk9STUFUVFlQRSlmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBPdGhlciBkZWNvZGVycyBhcmUgaW5zdGFudGlhdGVkIGxvY2FsbHkgYW5kIGFzIGEgY29uc2VxdWVuY2UKLSAgICAgICAgICAgIC8vIGFsbG9jYXRlIHRoZWlyIGJ1ZmZlcnMgaW4gbG9jYWwgYWRkcmVzcyBzcGFjZS4KLSAgICAgICAgICAgIG1WaWRlb1JlbmRlcmVyID0gbmV3IEF3ZXNvbWVMb2NhbFJlbmRlcmVyKAotICAgICAgICAgICAgICAgIGZhbHNlLCAgLy8gcHJldmlld09ubHkKLSAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgKE9NWF9DT0xPUl9GT1JNQVRUWVBFKWZvcm1hdCwKLSAgICAgICAgICAgICAgICBtSVN1cmZhY2UsCi0gICAgICAgICAgICAgICAgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCwKLSAgICAgICAgICAgICAgICBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtNzY0LDYgKzc3OCwxMiBAQAogICAgIG1JU3VyZmFjZSA9IGlzdXJmYWNlOwogfQogCit2b2lkIEF3ZXNvbWVQbGF5ZXI6OnNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgbVN1cmZhY2UgPSBzdXJmYWNlOworfQorCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6OnNldEF1ZGlvU2luaygKICAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZhdWRpb1NpbmspIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwpAQCAtMTAxNyw2ICsxMDM3LDggQEAKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKICAgICAgICAgICAgICAgICAgICAgTE9HVigiVmlkZW9Tb3VyY2Ugc2lnbmFsbGVkIGZvcm1hdCBjaGFuZ2UuIik7CiAKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplX2woKTsKKwogICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvUmVuZGVyZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvUmVuZGVyZXJJc1ByZXZpZXcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRSZW5kZXJlcl9sKCk7CkBAIC0xNTA2LDEwICsxNTI4LDEwIEBACiAKIHZvaWQgQXdlc29tZVBsYXllcjo6ZmluaXNoQXN5bmNQcmVwYXJlX2woKSB7CiAgICAgaWYgKG1Jc0FzeW5jUHJlcGFyZSkgewotICAgICAgICBpZiAobVZpZGVvV2lkdGggPCAwIHx8IG1WaWRlb0hlaWdodCA8IDApIHsKKyAgICAgICAgaWYgKG1WaWRlb1NvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NFVF9WSURFT19TSVpFLCAwLCAwKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU0VUX1ZJREVPX1NJWkUsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplX2woKTsKICAgICAgICAgfQogCiAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfUFJFUEFSRUQpOwpAQCAtMTYyMiwxMyArMTY0NCwxNCBAQAogCiAgICAgbUZsYWdzID0gc3RhdGUtPm1GbGFncyAmIChBVVRPX0xPT1BJTkcgfCBMT09QSU5HIHwgQVRfRU9TKTsKIAotICAgIGlmIChzdGF0ZS0+bUxhc3RWaWRlb0ZyYW1lICYmIG1JU3VyZmFjZSAhPSBOVUxMKSB7CisgICAgaWYgKHN0YXRlLT5tTGFzdFZpZGVvRnJhbWUgJiYgKG1TdXJmYWNlICE9IE5VTEwgfHwgbUlTdXJmYWNlICE9IE5VTEwpKSB7CiAgICAgICAgIG1WaWRlb1JlbmRlcmVyID0KICAgICAgICAgICAgIG5ldyBBd2Vzb21lTG9jYWxSZW5kZXJlcigKICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8vIHByZXZpZXdPbmx5CiAgICAgICAgICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgICAgICAgICAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpc3RhdGUtPm1Db2xvckZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgbUlTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1WaWRlb1dpZHRoLAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bVZpZGVvSGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bURlY29kZWRXaWR0aCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCmluZGV4IDg5Y2IxMzUuLjBjOWVlZjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcApAQCAtNjUsNiArNjUsMTEgQEAKIHZvaWQgQ2FtZXJhU291cmNlTGlzdGVuZXI6OnBvc3REYXRhKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGFQdHIpIHsKICAgICBMT0dWKCJwb3N0RGF0YSglZCwgcHRyOiVwLCBzaXplOiVkKSIsCiAgICAgICAgICBtc2dUeXBlLCBkYXRhUHRyLT5wb2ludGVyKCksIGRhdGFQdHItPnNpemUoKSk7CisKKyAgICBzcDxDYW1lcmFTb3VyY2U+IHNvdXJjZSA9IG1Tb3VyY2UucHJvbW90ZSgpOworICAgIGlmIChzb3VyY2UuZ2V0KCkgIT0gTlVMTCkgeworICAgICAgICBzb3VyY2UtPmRhdGFDYWxsYmFjayhtc2dUeXBlLCBkYXRhUHRyKTsKKyAgICB9CiB9CiAKIHZvaWQgQ2FtZXJhU291cmNlTGlzdGVuZXI6OnBvc3REYXRhVGltZXN0YW1wKApAQCAtNzcsNiArODIsMTAgQEAKIH0KIAogc3RhdGljIGludDMyX3QgZ2V0Q29sb3JGb3JtYXQoY29uc3QgY2hhciogY29sb3JGb3JtYXQpIHsKKyAgICBpZiAoIXN0cmNtcChjb2xvckZvcm1hdCwgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMFApKSB7CisgICAgICAgcmV0dXJuIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI7CisgICAgfQorCiAgICAgaWYgKCFzdHJjbXAoY29sb3JGb3JtYXQsIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9ZVVY0MjJTUCkpIHsKICAgICAgICByZXR1cm4gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMlNlbWlQbGFuYXI7CiAgICAgfQpAQCAtMTIxLDE1ICsxMzAsMTUgQEAKIAogQ2FtZXJhU291cmNlOjpDYW1lcmFTb3VyY2UoY29uc3Qgc3A8Q2FtZXJhPiAmY2FtZXJhKQogICAgIDogbUNhbWVyYShjYW1lcmEpLAotICAgICAgbUZpcnN0RnJhbWVUaW1lVXMoMCksCi0gICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMoMCksCiAgICAgICBtTnVtRnJhbWVzUmVjZWl2ZWQoMCksCisgICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMoMCksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtRmlyc3RGcmFtZVRpbWVVcygwKSwKICAgICAgIG1OdW1GcmFtZXNFbmNvZGVkKDApLAogICAgICAgbU51bUZyYW1lc0Ryb3BwZWQoMCksCiAgICAgICBtTnVtR2xpdGNoZXMoMCksCiAgICAgICBtR2xpdGNoRHVyYXRpb25UaHJlc2hvbGRVcygyMDAwMDApLAotICAgICAgbUNvbGxlY3RTdGF0cyhmYWxzZSksCi0gICAgICBtU3RhcnRlZChmYWxzZSkgeworICAgICAgbUNvbGxlY3RTdGF0cyhmYWxzZSkgewogCiAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgU3RyaW5nOCBzID0gbUNhbWVyYS0+Z2V0UGFyYW1ldGVycygpOwpAQCAtMTY0LDcgKzE3Myw2IEBACiAgICAgbU1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7CiAgICAgbU1ldGEtPnNldEludDMyKGtLZXlTdHJpZGUsIHN0cmlkZSk7CiAgICAgbU1ldGEtPnNldEludDMyKGtLZXlTbGljZUhlaWdodCwgc2xpY2VIZWlnaHQpOwotCiB9CiAKIENhbWVyYVNvdXJjZTo6fkNhbWVyYVNvdXJjZSgpIHsKQEAgLTE3Myw2ICsxODEsMTAgQEAKICAgICB9CiB9CiAKK3ZvaWQgQ2FtZXJhU291cmNlOjpzdGFydENhbWVyYVJlY29yZGluZygpIHsKKyAgICBDSEVDS19FUShPSywgbUNhbWVyYS0+c3RhcnRSZWNvcmRpbmcoKSk7Cit9CisKIHN0YXR1c190IENhbWVyYVNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKm1ldGEpIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCkBAIC0xOTAsMTMgKzIwMiwxOCBAQAogCiAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgbUNhbWVyYS0+c2V0TGlzdGVuZXIobmV3IENhbWVyYVNvdXJjZUxpc3RlbmVyKHRoaXMpKTsKLSAgICBDSEVDS19FUShPSywgbUNhbWVyYS0+c3RhcnRSZWNvcmRpbmcoKSk7CisgICAgc3RhcnRDYW1lcmFSZWNvcmRpbmcoKTsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKIAogICAgIG1TdGFydGVkID0gdHJ1ZTsKICAgICByZXR1cm4gT0s7CiB9CiAKK3ZvaWQgQ2FtZXJhU291cmNlOjpzdG9wQ2FtZXJhUmVjb3JkaW5nKCkgeworICAgIG1DYW1lcmEtPnNldExpc3RlbmVyKE5VTEwpOworICAgIG1DYW1lcmEtPnN0b3BSZWNvcmRpbmcoKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhU291cmNlOjpzdG9wKCkgewogICAgIExPR1YoInN0b3AiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwpAQCAtMjA0LDggKzIyMSw3IEBACiAgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOwogCiAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgbUNhbWVyYS0+c2V0TGlzdGVuZXIoTlVMTCk7Ci0gICAgbUNhbWVyYS0+c3RvcFJlY29yZGluZygpOworICAgIHN0b3BDYW1lcmFSZWNvcmRpbmcoKTsKICAgICByZWxlYXNlUXVldWVkRnJhbWVzKCk7CiAgICAgd2hpbGUgKCFtRnJhbWVzQmVpbmdFbmNvZGVkLmVtcHR5KCkpIHsKICAgICAgICAgTE9HSSgiV2FpdGluZyBmb3Igb3V0c3RhbmRpbmcgZnJhbWVzIGJlaW5nIGVuY29kZWQ6ICVkIiwKQEAgLTIyNSwxMSArMjQxLDE1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIENhbWVyYVNvdXJjZTo6cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSkgeworICAgIG1DYW1lcmEtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZShmcmFtZSk7Cit9CisKIHZvaWQgQ2FtZXJhU291cmNlOjpyZWxlYXNlUXVldWVkRnJhbWVzKCkgewogICAgIExpc3Q8c3A8SU1lbW9yeT4gPjo6aXRlcmF0b3IgaXQ7CiAgICAgd2hpbGUgKCFtRnJhbWVzUmVjZWl2ZWQuZW1wdHkoKSkgewogICAgICAgICBpdCA9IG1GcmFtZXNSZWNlaXZlZC5iZWdpbigpOwotICAgICAgICBtQ2FtZXJhLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWUoKml0KTsKKyAgICAgICAgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKCppdCk7CiAgICAgICAgIG1GcmFtZXNSZWNlaXZlZC5lcmFzZShpdCk7CiAgICAgICAgICsrbU51bUZyYW1lc0Ryb3BwZWQ7CiAgICAgfQpAQCAtMjQxLDcgKzI2MSw3IEBACiAKIHZvaWQgQ2FtZXJhU291cmNlOjpyZWxlYXNlT25lUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIGZyYW1lKSB7CiAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgbUNhbWVyYS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGZyYW1lKTsKKyAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWUoZnJhbWUpOwogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogfQogCkBAIC0yNTEsNyArMjcxLDYgQEAKICAgICBmb3IgKExpc3Q8c3A8SU1lbW9yeT4gPjo6aXRlcmF0b3IgaXQgPSBtRnJhbWVzQmVpbmdFbmNvZGVkLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBtRnJhbWVzQmVpbmdFbmNvZGVkLmVuZCgpOyArK2l0KSB7CiAgICAgICAgIGlmICgoKml0KS0+cG9pbnRlcigpID09ICBidWZmZXItPmRhdGEoKSkgewotCiAgICAgICAgICAgICByZWxlYXNlT25lUmVjb3JkaW5nRnJhbWUoKCppdCkpOwogICAgICAgICAgICAgbUZyYW1lc0JlaW5nRW5jb2RlZC5lcmFzZShpdCk7CiAgICAgICAgICAgICArK21OdW1GcmFtZXNFbmNvZGVkOwpAQCAtMzQzLDYgKzM2MiwxMyBAQAogICAgICAgICArK21OdW1HbGl0Y2hlczsKICAgICB9CiAKKyAgICAvLyBNYXkgbmVlZCB0byBza2lwIGZyYW1lIG9yIG1vZGlmeSB0aW1lc3RhbXAuIEN1cnJlbnRseSBpbXBsZW1lbnRlZAorICAgIC8vIGJ5IHRoZSBzdWJjbGFzcyBDYW1lcmFTb3VyY2VUaW1lTGFwc2UuCisgICAgaWYoc2tpcEN1cnJlbnRGcmFtZSh0aW1lc3RhbXBVcykpIHsKKyAgICAgICAgcmVsZWFzZU9uZVJlY29yZGluZ0ZyYW1lKGRhdGEpOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgbUxhc3RGcmFtZVRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CiAgICAgaWYgKG1OdW1GcmFtZXNSZWNlaXZlZCA9PSAwKSB7CiAgICAgICAgIG1GaXJzdEZyYW1lVGltZVVzID0gdGltZXN0YW1wVXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWJjNDMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcApAQCAtMCwwICsxLDUyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhU291cmNlVGltZUxhcHNlIgorCisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ZVVZJbWFnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1lVVkNhbnZhcy5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgorI2luY2x1ZGUgPHVpL1JlY3QuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSAiT01YX1ZpZGVvLmgiCisjaW5jbHVkZSA8bGltaXRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCitDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKkNhbWVyYVNvdXJjZVRpbWVMYXBzZTo6Q3JlYXRlKAorICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICBpbnQzMl90IHZpZGVvRnJhbWVSYXRlKSB7CisgICAgc3A8Q2FtZXJhPiBjYW1lcmEgPSBDYW1lcmE6OmNvbm5lY3QoMCk7CisKKyAgICBpZiAoY2FtZXJhLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBDYW1lcmFTb3VyY2VUaW1lTGFwc2UoY2FtZXJhLCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLAorICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgdmlkZW9GcmFtZVJhdGUpOworfQorCisvLyBzdGF0aWMKK0NhbWVyYVNvdXJjZVRpbWVMYXBzZSAqQ2FtZXJhU291cmNlVGltZUxhcHNlOjpDcmVhdGVGcm9tQ2FtZXJhKGNvbnN0IHNwPENhbWVyYT4gJmNhbWVyYSwKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgaW50MzJfdCB2aWRlb0ZyYW1lUmF0ZSkgeworICAgIGlmIChjYW1lcmEuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IENhbWVyYVNvdXJjZVRpbWVMYXBzZShjYW1lcmEsIHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMsCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCB2aWRlb0ZyYW1lUmF0ZSk7Cit9CisKK0NhbWVyYVNvdXJjZVRpbWVMYXBzZTo6Q2FtZXJhU291cmNlVGltZUxhcHNlKGNvbnN0IHNwPENhbWVyYT4gJmNhbWVyYSwKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgaW50MzJfdCB2aWRlb0ZyYW1lUmF0ZSkKKyAgICA6IENhbWVyYVNvdXJjZShjYW1lcmEpLAorICAgICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXModGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyksCisgICAgICBtVGltZUJldHdlZW5UaW1lTGFwc2VWaWRlb0ZyYW1lc1VzKDFFNi92aWRlb0ZyYW1lUmF0ZSksCisgICAgICBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzKDApLAorICAgICAgbVNraXBDdXJyZW50RnJhbWUoZmFsc2UpIHsKKworICAgIExPR1YoInN0YXJ0aW5nIHRpbWUgbGFwc2UgbW9kZSIpOworICAgIG1WaWRlb1dpZHRoID0gd2lkdGg7CisgICAgbVZpZGVvSGVpZ2h0ID0gaGVpZ2h0OworCisgICAgaWYgKHRyeVNldHRpbmdQcmV2aWV3U2l6ZSh3aWR0aCwgaGVpZ2h0KSkgeworICAgICAgICBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBUT0RPOiBBZGQgYSBjaGVjayB0byBzZWUgdGhhdCBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyBpcyBncmVhdGVyCisgICAgICAgIC8vIHRoYW4gdGhlIGZhc3Rlc3QgcmF0ZSBhdCB3aGljaCB0aGUgc3RpbGwgY2FtZXJhIGNhbiB0YWtlIHBpY3R1cmVzLgorICAgICAgICBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UgPSB0cnVlOworICAgICAgICBDSEVDSyhzZXRQaWN0dXJlU2l6ZVRvQ2xvc2VzdFN1cHBvcnRlZCh3aWR0aCwgaGVpZ2h0KSk7CisgICAgICAgIG1OZWVkQ3JvcHBpbmcgPSBjb21wdXRlQ3JvcFJlY3RhbmdsZU9mZnNldCgpOworICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7CisgICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOworICAgIH0KKworICAgIC8vIEluaXRpYWxpemUgcXVpY2sgc3RvcCB2YXJpYWJsZXMuCisgICAgbVF1aWNrU3RvcCA9IGZhbHNlOworICAgIG1Gb3JjZVJlYWQgPSBmYWxzZTsKKyAgICBtTGFzdFJlYWRCdWZmZXJDb3B5ID0gTlVMTDsKKyAgICBtU3RvcFdhaXRpbmdGb3JJZGxlQ2FtZXJhID0gZmFsc2U7Cit9CisKK0NhbWVyYVNvdXJjZVRpbWVMYXBzZTo6fkNhbWVyYVNvdXJjZVRpbWVMYXBzZSgpIHsKK30KKwordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnN0YXJ0UXVpY2tSZWFkUmV0dXJucygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVF1aWNrU3RvcExvY2spOworICAgIExPR1YoIkVuYWJsaW5nIHF1aWNrIHJlYWQgcmV0dXJucyIpOworCisgICAgLy8gRW5hYmxlIHF1aWNrIHN0b3AgbW9kZS4KKyAgICBtUXVpY2tTdG9wID0gdHJ1ZTsKKworICAgIGlmIChtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UpIHsKKyAgICAgICAgLy8gd2FrZSB1cCB0aGUgdGhyZWFkIHJpZ2h0IGF3YXkuCisgICAgICAgIG1UYWtlUGljdHVyZUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBGb3JjZSBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoKSBjb21pbmcgZnJvbSB0aGUgdmlkZW8gY2FtZXJhIHRvIG5vdCBza2lwIHRoZQorICAgICAgICAvLyBuZXh0IGZyYW1lIGFzIHdlIHdhbnQgcmVhZCgpIHRvIGdldCBhIGdldCBhIGZyYW1lIHJpZ2h0IGF3YXkuCisgICAgICAgIG1Gb3JjZVJlYWQgPSB0cnVlOworICAgIH0KK30KKworYm9vbCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnRyeVNldHRpbmdQcmV2aWV3U2l6ZShpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIFN0cmluZzggcyA9IG1DYW1lcmEtPmdldFBhcmFtZXRlcnMoKTsKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKworICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKHMpOworICAgIFZlY3RvcjxTaXplPiBzdXBwb3J0ZWRTaXplczsKKyAgICBwYXJhbXMuZ2V0U3VwcG9ydGVkUHJldmlld1NpemVzKHN1cHBvcnRlZFNpemVzKTsKKworICAgIGJvb2wgcHJldmlld1NpemVTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3VwcG9ydGVkU2l6ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaW50MzJfdCBwaWN0dXJlV2lkdGggPSBzdXBwb3J0ZWRTaXplc1tpXS53aWR0aDsKKyAgICAgICAgaW50MzJfdCBwaWN0dXJlSGVpZ2h0ID0gc3VwcG9ydGVkU2l6ZXNbaV0uaGVpZ2h0OworCisgICAgICAgIGlmICgocGljdHVyZVdpZHRoID09IHdpZHRoKSAmJiAocGljdHVyZUhlaWdodCA9PSBoZWlnaHQpKSB7CisgICAgICAgICAgICBwcmV2aWV3U2l6ZVN1cHBvcnRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHJldmlld1NpemVTdXBwb3J0ZWQpIHsKKyAgICAgICAgTE9HVigiVmlkZW8gc2l6ZSAoJWQsICVkKSBpcyBhIHN1cHBvcnRlZCBwcmV2aWV3IHNpemUiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgcGFyYW1zLnNldFByZXZpZXdTaXplKHdpZHRoLCBoZWlnaHQpOworICAgICAgICBDSEVDSyhtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcy5mbGF0dGVuKCkpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c2V0UGljdHVyZVNpemVUb0Nsb3Nlc3RTdXBwb3J0ZWQoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKyAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICBTdHJpbmc4IHMgPSBtQ2FtZXJhLT5nZXRQYXJhbWV0ZXJzKCk7CisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisKKyAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhzKTsKKyAgICBWZWN0b3I8U2l6ZT4gc3VwcG9ydGVkU2l6ZXM7CisgICAgcGFyYW1zLmdldFN1cHBvcnRlZFBpY3R1cmVTaXplcyhzdXBwb3J0ZWRTaXplcyk7CisKKyAgICBpbnQzMl90IG1pblBpY3R1cmVTaXplID0gSU5UX01BWDsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3VwcG9ydGVkU2l6ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaW50MzJfdCBwaWN0dXJlV2lkdGggPSBzdXBwb3J0ZWRTaXplc1tpXS53aWR0aDsKKyAgICAgICAgaW50MzJfdCBwaWN0dXJlSGVpZ2h0ID0gc3VwcG9ydGVkU2l6ZXNbaV0uaGVpZ2h0OworCisgICAgICAgIGlmICgocGljdHVyZVdpZHRoID49IHdpZHRoKSAmJiAocGljdHVyZUhlaWdodCA+PSBoZWlnaHQpKSB7CisgICAgICAgICAgICBpbnQzMl90IHBpY3R1cmVTaXplID0gcGljdHVyZVdpZHRoKnBpY3R1cmVIZWlnaHQ7CisgICAgICAgICAgICBpZiAocGljdHVyZVNpemUgPCBtaW5QaWN0dXJlU2l6ZSkgeworICAgICAgICAgICAgICAgIG1pblBpY3R1cmVTaXplID0gcGljdHVyZVNpemU7CisgICAgICAgICAgICAgICAgbVBpY3R1cmVXaWR0aCA9IHBpY3R1cmVXaWR0aDsKKyAgICAgICAgICAgICAgICBtUGljdHVyZUhlaWdodCA9IHBpY3R1cmVIZWlnaHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HVigiUGljdHVyZSBzaXplID0gKCVkLCAlZCkiLCBtUGljdHVyZVdpZHRoLCBtUGljdHVyZUhlaWdodCk7CisgICAgcmV0dXJuIChtaW5QaWN0dXJlU2l6ZSAhPSBJTlRfTUFYKTsKK30KKworYm9vbCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OmNvbXB1dGVDcm9wUmVjdGFuZ2xlT2Zmc2V0KCkgeworICAgIGlmICgobVBpY3R1cmVXaWR0aCA9PSBtVmlkZW9XaWR0aCkgJiYgKG1QaWN0dXJlSGVpZ2h0ID09IG1WaWRlb0hlaWdodCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIENIRUNLKChtUGljdHVyZVdpZHRoID4gbVZpZGVvV2lkdGgpICYmIChtUGljdHVyZUhlaWdodCA+IG1WaWRlb0hlaWdodCkpOworCisgICAgaW50MzJfdCB3aWR0aERpZmZlcmVuY2UgPSBtUGljdHVyZVdpZHRoIC0gbVZpZGVvV2lkdGg7CisgICAgaW50MzJfdCBoZWlnaHREaWZmZXJlbmNlID0gbVBpY3R1cmVIZWlnaHQgLSBtVmlkZW9IZWlnaHQ7CisKKyAgICBtQ3JvcFJlY3RTdGFydFggPSB3aWR0aERpZmZlcmVuY2UvMjsKKyAgICBtQ3JvcFJlY3RTdGFydFkgPSBoZWlnaHREaWZmZXJlbmNlLzI7CisKKyAgICBMT0dWKCJzZXR0aW5nIGNyb3AgcmVjdGFuZ2xlIG9mZnNldCB0byAoJWQsICVkKSIsIG1Dcm9wUmVjdFN0YXJ0WCwgbUNyb3BSZWN0U3RhcnRZKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIqIGJ1ZmZlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUXVpY2tTdG9wTG9jayk7CisgICAgaWYgKG1RdWlja1N0b3AgJiYgKGJ1ZmZlciA9PSBtTGFzdFJlYWRCdWZmZXJDb3B5KSkgeworICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKE5VTEwpOworICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQ2FtZXJhU291cmNlOjpzaWduYWxCdWZmZXJSZXR1cm5lZChidWZmZXIpOworICAgIH0KK30KKwordm9pZCBjcmVhdGVNZWRpYUJ1ZmZlckNvcHkoY29uc3QgTWVkaWFCdWZmZXImIHNvdXJjZUJ1ZmZlciwgaW50NjRfdCBmcmFtZVRpbWUsIE1lZGlhQnVmZmVyICoqbmV3QnVmZmVyKSB7CisgICAgc2l6ZV90IHNvdXJjZVNpemUgPSBzb3VyY2VCdWZmZXIuc2l6ZSgpOworICAgIHZvaWQqIHNvdXJjZVBvaW50ZXIgPSBzb3VyY2VCdWZmZXIuZGF0YSgpOworCisgICAgKCpuZXdCdWZmZXIpID0gbmV3IE1lZGlhQnVmZmVyKHNvdXJjZVNpemUpOworICAgIG1lbWNweSgoKm5ld0J1ZmZlciktPmRhdGEoKSwgc291cmNlUG9pbnRlciwgc291cmNlU2l6ZSk7CisKKyAgICAoKm5ld0J1ZmZlciktPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgZnJhbWVUaW1lKTsKK30KKwordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OmZpbGxMYXN0UmVhZEJ1ZmZlckNvcHkoTWVkaWFCdWZmZXImIHNvdXJjZUJ1ZmZlcikgeworICAgIGludDY0X3QgZnJhbWVUaW1lOworICAgIENIRUNLKHNvdXJjZUJ1ZmZlci5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmZnJhbWVUaW1lKSk7CisgICAgY3JlYXRlTWVkaWFCdWZmZXJDb3B5KHNvdXJjZUJ1ZmZlciwgZnJhbWVUaW1lLCAmbUxhc3RSZWFkQnVmZmVyQ29weSk7CisgICAgbUxhc3RSZWFkQnVmZmVyQ29weS0+YWRkX3JlZigpOworICAgIG1MYXN0UmVhZEJ1ZmZlckNvcHktPnNldE9ic2VydmVyKHRoaXMpOworfQorCitzdGF0dXNfdCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgIGlmIChtTGFzdFJlYWRCdWZmZXJDb3B5ID09IE5VTEwpIHsKKyAgICAgICAgbUxhc3RSZWFkU3RhdHVzID0gQ2FtZXJhU291cmNlOjpyZWFkKGJ1ZmZlciwgb3B0aW9ucyk7CisKKyAgICAgICAgLy8gbVF1aWNrU3RvcCBtYXkgaGF2ZSB0dXJuZWQgdG8gdHJ1ZSB3aGlsZSByZWFkIHdhcyBibG9ja2VkLiBNYWtlIGEgY29weSBvZgorICAgICAgICAvLyB0aGUgYnVmZmVyIGluIHRoYXQgY2FzZS4KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1RdWlja1N0b3BMb2NrKTsKKyAgICAgICAgaWYgKG1RdWlja1N0b3AgJiYgKmJ1ZmZlcikgeworICAgICAgICAgICAgZmlsbExhc3RSZWFkQnVmZmVyQ29weSgqKmJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1MYXN0UmVhZFN0YXR1czsKKyAgICB9IGVsc2UgeworICAgICAgICAoKmJ1ZmZlcikgPSBtTGFzdFJlYWRCdWZmZXJDb3B5OworICAgICAgICAoKmJ1ZmZlciktPmFkZF9yZWYoKTsKKyAgICAgICAgcmV0dXJuIG1MYXN0UmVhZFN0YXR1czsKKyAgICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCAqQ2FtZXJhU291cmNlVGltZUxhcHNlOjpUaHJlYWRUaW1lTGFwc2VXcmFwcGVyKHZvaWQgKm1lKSB7CisgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKj4obWUpOworICAgIHNvdXJjZS0+dGhyZWFkVGltZUxhcHNlRW50cnkoKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnRocmVhZFRpbWVMYXBzZUVudHJ5KCkgeworICAgIHdoaWxlIChtU3RhcnRlZCkgeworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUNhbWVyYUlkbGVMb2NrKTsKKyAgICAgICAgICAgIGlmICghbUNhbWVyYUlkbGUpIHsKKyAgICAgICAgICAgICAgICBtQ2FtZXJhSWRsZUNvbmRpdGlvbi53YWl0KG1DYW1lcmFJZGxlTG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDSEVDSyhtQ2FtZXJhSWRsZSk7CisgICAgICAgICAgICBtQ2FtZXJhSWRsZSA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gRXZlbiBpZiBtUXVpY2tTdG9wID09IHRydWUgd2UgbmVlZCB0byB0YWtlIG9uZSBtb3JlIHBpY3R1cmUKKyAgICAgICAgLy8gYXMgYSByZWFkKCkgbWF5IGJlIGJsb2NrZWQsIHdhaXRpbmcgZm9yIGEgZnJhbWUgdG8gZ2V0IGF2YWlsYWJsZS4KKyAgICAgICAgLy8gQWZ0ZXIgdGhpcyB0YWtlUGljdHVyZSwgaWYgbVF1aWNrU3RvcCA9PSB0cnVlLCB3ZSBjYW4gc2FmZWx5IGV4aXQKKyAgICAgICAgLy8gdGhpcyB0aHJlYWQgYXMgcmVhZCgpIHdpbGwgbWFrZSBhIGNvcHkgb2YgdGhpcyBsYXN0IGZyYW1lIGFuZCBrZWVwCisgICAgICAgIC8vIHJldHVybmluZyBpdCBpbiB0aGUgcXVpY2sgc3RvcCBtb2RlLgorICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVF1aWNrU3RvcExvY2spOworICAgICAgICBDSEVDS19FUShPSywgbUNhbWVyYS0+dGFrZVBpY3R1cmUoKSk7CisgICAgICAgIGlmIChtUXVpY2tTdG9wKSB7CisgICAgICAgICAgICBMT0dWKCJ0aHJlYWRUaW1lTGFwc2VFbnRyeTogRXhpdGluZyBkdWUgdG8gbVF1aWNrU3RvcCA9IHRydWUiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtVGFrZVBpY3R1cmVDb25kaXRpb24ud2FpdFJlbGF0aXZlKG1RdWlja1N0b3BMb2NrLAorICAgICAgICAgICAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzICogMTAwMCk7CisgICAgfQorICAgIExPR1YoInRocmVhZFRpbWVMYXBzZUVudHJ5OiBFeGl0aW5nIGR1ZSB0byBtU3RhcnRlZCA9IGZhbHNlIik7Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpzdGFydENhbWVyYVJlY29yZGluZygpIHsKKyAgICBpZiAobVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKSB7CisgICAgICAgIExPR1YoInN0YXJ0IHRpbWUgbGFwc2UgcmVjb3JkaW5nIHVzaW5nIHN0aWxsIGNhbWVyYSIpOworCisgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICBTdHJpbmc4IHMgPSBtQ2FtZXJhLT5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworCisgICAgICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKHMpOworICAgICAgICBwYXJhbXMuc2V0UGljdHVyZVNpemUobVBpY3R1cmVXaWR0aCwgbVBpY3R1cmVIZWlnaHQpOworICAgICAgICBtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcy5mbGF0dGVuKCkpOworICAgICAgICBtQ2FtZXJhSWRsZSA9IHRydWU7CisgICAgICAgIG1TdG9wV2FpdGluZ0ZvcklkbGVDYW1lcmEgPSBmYWxzZTsKKworICAgICAgICAvLyBkaXNhYmxlIHNodXR0ZXIgc291bmQgYW5kIHBsYXkgdGhlIHJlY29yZGluZyBzb3VuZC4KKyAgICAgICAgbUNhbWVyYS0+c2VuZENvbW1hbmQoQ0FNRVJBX0NNRF9FTkFCTEVfU0hVVFRFUl9TT1VORCwgMCwgMCk7CisgICAgICAgIG1DYW1lcmEtPnNlbmRDb21tYW5kKENBTUVSQV9DTURfUExBWV9SRUNPUkRJTkdfU09VTkQsIDAsIDApOworCisgICAgICAgIC8vIGNyZWF0ZSBhIHRocmVhZCB3aGljaCB0YWtlcyBwaWN0dXJlcyBpbiBhIGxvb3AKKyAgICAgICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKKyAgICAgICAgcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpOworICAgICAgICBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJmF0dHIsIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFKTsKKworICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmbVRocmVhZFRpbWVMYXBzZSwgJmF0dHIsIFRocmVhZFRpbWVMYXBzZVdyYXBwZXIsIHRoaXMpOworICAgICAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HVigic3RhcnQgdGltZSBsYXBzZSByZWNvcmRpbmcgdXNpbmcgdmlkZW8gY2FtZXJhIik7CisgICAgICAgIENIRUNLX0VRKE9LLCBtQ2FtZXJhLT5zdGFydFJlY29yZGluZygpKTsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpzdG9wQ2FtZXJhUmVjb3JkaW5nKCkgeworICAgIGlmIChtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UpIHsKKyAgICAgICAgdm9pZCAqZHVtbXk7CisgICAgICAgIHB0aHJlYWRfam9pbihtVGhyZWFkVGltZUxhcHNlLCAmZHVtbXkpOworCisgICAgICAgIC8vIExhc3QgdGFrZVBpY3R1cmUgbWF5IHN0aWxsIGJlIHVuZGVyd2F5LiBXYWl0IGZvciB0aGUgY2FtZXJhIHRvIGdldAorICAgICAgICAvLyBpZGxlLgorICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUNhbWVyYUlkbGVMb2NrKTsKKyAgICAgICAgbVN0b3BXYWl0aW5nRm9ySWRsZUNhbWVyYSA9IHRydWU7CisgICAgICAgIGlmICghbUNhbWVyYUlkbGUpIHsKKyAgICAgICAgICAgIG1DYW1lcmFJZGxlQ29uZGl0aW9uLndhaXQobUNhbWVyYUlkbGVMb2NrKTsKKyAgICAgICAgfQorICAgICAgICBDSEVDSyhtQ2FtZXJhSWRsZSk7CisgICAgICAgIG1DYW1lcmEtPnNldExpc3RlbmVyKE5VTEwpOworCisgICAgICAgIC8vIHBsYXkgdGhlIHJlY29yZGluZyBzb3VuZC4KKyAgICAgICAgbUNhbWVyYS0+c2VuZENvbW1hbmQoQ0FNRVJBX0NNRF9QTEFZX1JFQ09SRElOR19TT1VORCwgMCwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNhbWVyYS0+c2V0TGlzdGVuZXIoTlVMTCk7CisgICAgICAgIG1DYW1lcmEtPnN0b3BSZWNvcmRpbmcoKTsKKyAgICB9CisgICAgaWYgKG1MYXN0UmVhZEJ1ZmZlckNvcHkpIHsKKyAgICAgICAgbUxhc3RSZWFkQnVmZmVyQ29weS0+cmVsZWFzZSgpOworICAgICAgICBtTGFzdFJlYWRCdWZmZXJDb3B5ID0gTlVMTDsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpyZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIGZyYW1lKSB7CisgICAgaWYgKCFtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UpIHsKKyAgICAgICAgbUNhbWVyYS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGZyYW1lKTsKKyAgICB9Cit9CisKK3NwPElNZW1vcnk+IENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6Y3JlYXRlSU1lbW9yeUNvcHkoY29uc3Qgc3A8SU1lbW9yeT4gJnNvdXJjZV9kYXRhKSB7CisgICAgc2l6ZV90IHNvdXJjZV9zaXplID0gc291cmNlX2RhdGEtPnNpemUoKTsKKyAgICB2b2lkKiBzb3VyY2VfcG9pbnRlciA9IHNvdXJjZV9kYXRhLT5wb2ludGVyKCk7CisKKyAgICBzcDxNZW1vcnlIZWFwQmFzZT4gbmV3TWVtb3J5SGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZShzb3VyY2Vfc2l6ZSk7CisgICAgc3A8TWVtb3J5QmFzZT4gbmV3TWVtb3J5ID0gbmV3IE1lbW9yeUJhc2UobmV3TWVtb3J5SGVhcCwgMCwgc291cmNlX3NpemUpOworICAgIG1lbWNweShuZXdNZW1vcnktPnBvaW50ZXIoKSwgc291cmNlX3BvaW50ZXIsIHNvdXJjZV9zaXplKTsKKyAgICByZXR1cm4gbmV3TWVtb3J5OworfQorCisvLyBBbGxvY2F0ZXMgSU1lbW9yeSBvZiBmaW5hbCB0eXBlIE1lbW9yeUJhc2Ugd2l0aCB0aGUgZ2l2ZW4gc2l6ZS4KK3NwPElNZW1vcnk+IGFsbG9jYXRlSU1lbW9yeShzaXplX3Qgc2l6ZSkgeworICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBuZXdNZW1vcnlIZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKHNpemUpOworICAgIHNwPE1lbW9yeUJhc2U+IG5ld01lbW9yeSA9IG5ldyBNZW1vcnlCYXNlKG5ld01lbW9yeUhlYXAsIDAsIHNpemUpOworICAgIHJldHVybiBuZXdNZW1vcnk7Cit9CisKKy8vIHN0YXRpYwordm9pZCAqQ2FtZXJhU291cmNlVGltZUxhcHNlOjpUaHJlYWRTdGFydFByZXZpZXdXcmFwcGVyKHZvaWQgKm1lKSB7CisgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKj4obWUpOworICAgIHNvdXJjZS0+dGhyZWFkU3RhcnRQcmV2aWV3KCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjp0aHJlYWRTdGFydFByZXZpZXcoKSB7CisgICAgQ0hFQ0tfRVEoT0ssIG1DYW1lcmEtPnN0YXJ0UHJldmlldygpKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUNhbWVyYUlkbGVMb2NrKTsKKyAgICBtQ2FtZXJhSWRsZSA9IHRydWU7CisgICAgbUNhbWVyYUlkbGVDb25kaXRpb24uc2lnbmFsKCk7Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpyZXN0YXJ0UHJldmlldygpIHsKKyAgICAvLyBTdGFydCB0aGlzIGluIGEgZGlmZmVyZW50IHRocmVhZCwgc28gdGhhdCB0aGUgZGF0YUNhbGxiYWNrIGNhbiByZXR1cm4KKyAgICBMT0dWKCJyZXN0YXJ0UHJldmlldyIpOworICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpOworICAgIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0ciwgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpOworCisgICAgcHRocmVhZF90IHRocmVhZFByZXZpZXc7CisgICAgcHRocmVhZF9jcmVhdGUoJnRocmVhZFByZXZpZXcsICZhdHRyLCBUaHJlYWRTdGFydFByZXZpZXdXcmFwcGVyLCB0aGlzKTsKKyAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7Cit9CisKK3NwPElNZW1vcnk+IENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6Y3JvcFlVVkltYWdlKGNvbnN0IHNwPElNZW1vcnk+ICZzb3VyY2VfZGF0YSkgeworICAgIC8vIGZpbmQgdGhlIFlVViBmb3JtYXQKKyAgICBpbnQzMl90IHNyY0Zvcm1hdDsKKyAgICBDSEVDSyhtTWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJnNyY0Zvcm1hdCkpOworICAgIFlVVkltYWdlOjpZVVZGb3JtYXQgeXV2Rm9ybWF0OworICAgIGlmIChzcmNGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpIHsKKyAgICAgICAgeXV2Rm9ybWF0ID0gWVVWSW1hZ2U6OllVVjQyMFNlbWlQbGFuYXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0hFQ0tfRVEoc3JjRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKyAgICAgICAgeXV2Rm9ybWF0ID0gWVVWSW1hZ2U6OllVVjQyMFBsYW5hcjsKKyAgICB9CisKKyAgICAvLyBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNyb3BwZWQgaW1hZ2UgYW5kIHNldHVwIGEgY2FudmFzIHVzaW5nIGl0LgorICAgIHNwPElNZW1vcnk+IGNyb3BwZWRJbWFnZU1lbW9yeSA9IGFsbG9jYXRlSU1lbW9yeSgKKyAgICAgICAgICAgIFlVVkltYWdlOjpidWZmZXJTaXplKHl1dkZvcm1hdCwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCkpOworICAgIFlVVkltYWdlIHl1dkltYWdlQ3JvcHBlZCh5dXZGb3JtYXQsCisgICAgICAgICAgICBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0LAorICAgICAgICAgICAgKHVpbnQ4X3QgKiljcm9wcGVkSW1hZ2VNZW1vcnktPnBvaW50ZXIoKSk7CisgICAgWVVWQ2FudmFzIHl1dkNhbnZhc0Nyb3AoeXV2SW1hZ2VDcm9wcGVkKTsKKworICAgIFlVVkltYWdlIHl1dkltYWdlU291cmNlKHl1dkZvcm1hdCwKKyAgICAgICAgICAgIG1QaWN0dXJlV2lkdGgsIG1QaWN0dXJlSGVpZ2h0LAorICAgICAgICAgICAgKHVpbnQ4X3QgKilzb3VyY2VfZGF0YS0+cG9pbnRlcigpKTsKKyAgICB5dXZDYW52YXNDcm9wLkNvcHlJbWFnZVJlY3QoCisgICAgICAgICAgICBSZWN0KG1Dcm9wUmVjdFN0YXJ0WCwgbUNyb3BSZWN0U3RhcnRZLAorICAgICAgICAgICAgICAgIG1Dcm9wUmVjdFN0YXJ0WCArIG1WaWRlb1dpZHRoLAorICAgICAgICAgICAgICAgIG1Dcm9wUmVjdFN0YXJ0WSArIG1WaWRlb0hlaWdodCksCisgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgeXV2SW1hZ2VTb3VyY2UpOworCisgICAgcmV0dXJuIGNyb3BwZWRJbWFnZU1lbW9yeTsKK30KKwordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OmRhdGFDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKSB7CisgICAgaWYgKG1zZ1R5cGUgPT0gQ0FNRVJBX01TR19DT01QUkVTU0VEX0lNQUdFKSB7CisgICAgICAgIC8vIHRha2VQaWN0dXJlIHdpbGwgY29tcGxldGUgYWZ0ZXIgdGhpcyBjYWxsYmFjaywgc28gcmVzdGFydCBwcmV2aWV3LgorICAgICAgICByZXN0YXJ0UHJldmlldygpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtc2dUeXBlICE9IENBTUVSQV9NU0dfUkFXX0lNQUdFKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBMT0dWKCJkYXRhQ2FsbGJhY2sgZm9yIHRpbWVsYXBzZSBzdGlsbCBmcmFtZSIpOworICAgIENIRUNLX0VRKHRydWUsIG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSk7CisKKyAgICBpbnQ2NF90IHRpbWVzdGFtcFVzOworICAgIGlmIChtTnVtRnJhbWVzUmVjZWl2ZWQgPT0gMCkgeworICAgICAgICB0aW1lc3RhbXBVcyA9IG1TdGFydFRpbWVVczsKKyAgICB9IGVsc2UgeworICAgICAgICB0aW1lc3RhbXBVcyA9IG1MYXN0RnJhbWVUaW1lc3RhbXBVcyArIG1UaW1lQmV0d2VlblRpbWVMYXBzZVZpZGVvRnJhbWVzVXM7CisgICAgfQorCisgICAgaWYgKG1OZWVkQ3JvcHBpbmcpIHsKKyAgICAgICAgc3A8SU1lbW9yeT4gY3JvcHBlZEltYWdlRGF0YSA9IGNyb3BZVVZJbWFnZShkYXRhKTsKKyAgICAgICAgZGF0YUNhbGxiYWNrVGltZXN0YW1wKHRpbWVzdGFtcFVzLCBtc2dUeXBlLCBjcm9wcGVkSW1hZ2VEYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzcDxJTWVtb3J5PiBkYXRhQ29weSA9IGNyZWF0ZUlNZW1vcnlDb3B5KGRhdGEpOworICAgICAgICBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wVXMsIG1zZ1R5cGUsIGRhdGFDb3B5KTsKKyAgICB9Cit9CisKK2Jvb2wgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpza2lwQ3VycmVudEZyYW1lKGludDY0X3QgdGltZXN0YW1wVXMpIHsKKyAgICBpZiAobVNraXBDdXJyZW50RnJhbWUpIHsKKyAgICAgICAgbVNraXBDdXJyZW50RnJhbWUgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnNraXBGcmFtZUFuZE1vZGlmeVRpbWVTdGFtcChpbnQ2NF90ICp0aW1lc3RhbXBVcykgeworICAgIGlmICghbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKSB7CisgICAgICAgIGlmIChtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzID09IDApIHsKKyAgICAgICAgICAgIC8vIEZpcnN0IHRpbWUgbGFwc2UgZnJhbWUuIEluaXRpYWxpemUgbUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVcworICAgICAgICAgICAgLy8gdG8gY3VycmVudCB0aW1lICh0aW1lc3RhbXBVcykgYW5kIHNhdmUgZnJhbWUgZGF0YS4KKyAgICAgICAgICAgIExPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcCB0aW1lbGFwc2U6IGluaXRpYWwgZnJhbWUiKTsKKworICAgICAgICAgICAgbUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVcyA9ICp0aW1lc3RhbXBVczsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUXVpY2tTdG9wTG9jayk7CisKKyAgICAgICAgICAgIC8vIG1Gb3JjZVJlYWQgbWF5IGJlIHNldCB0byB0cnVlIGJ5IHN0YXJ0UXVpY2tSZWFkUmV0dXJucygpLiBJbiB0aGF0CisgICAgICAgICAgICAvLyBjYXNlIGRvbid0IHNraXAgdGhpcyBmcmFtZS4KKyAgICAgICAgICAgIGlmIChtRm9yY2VSZWFkKSB7CisgICAgICAgICAgICAgICAgTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wIHRpbWVsYXBzZTogZm9yY2VkIHJlYWQiKTsKKyAgICAgICAgICAgICAgICBtRm9yY2VSZWFkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgKnRpbWVzdGFtcFVzID0gbUxhc3RGcmFtZVRpbWVzdGFtcFVzOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgqdGltZXN0YW1wVXMgPAorICAgICAgICAgICAgICAgIChtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzICsgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpKSB7CisgICAgICAgICAgICAvLyBTa2lwIGFsbCBmcmFtZXMgZnJvbSBsYXN0IGVuY29kZWQgZnJhbWUgdW50aWwKKyAgICAgICAgICAgIC8vIHN1ZmZpY2llbnQgdGltZSAobVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpIGhhcyBwYXNzZWQuCisgICAgICAgICAgICAvLyBUZWxsIHRoZSBjYW1lcmEgdG8gcmVsZWFzZSBpdHMgcmVjb3JkaW5nIGZyYW1lIGFuZCByZXR1cm4uCisgICAgICAgICAgICBMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXAgdGltZWxhcHNlOiBza2lwcGluZyBpbnRlcm1lZGlhdGUgZnJhbWUiKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRGVzaXJlZCBmcmFtZSBoYXMgYXJyaXZlZCBhZnRlciBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyB0aW1lOgorICAgICAgICAgICAgLy8gLSBSZXNldCBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzIHRvIGN1cnJlbnQgdGltZS4KKyAgICAgICAgICAgIC8vIC0gQXJ0aWZpY2lhbGx5IG1vZGlmeSB0aW1lc3RhbXBVcyB0byBiZSBvbmUgZnJhbWUgdGltZSAoMS9mcmFtZXJhdGUpIGFoZWFkCisgICAgICAgICAgICAvLyBvZiB0aGUgbGFzdCBlbmNvZGVkIGZyYW1lJ3MgdGltZSBzdGFtcC4KKyAgICAgICAgICAgIExPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcCB0aW1lbGFwc2U6IGdvdCB0aW1lbGFwc2UgZnJhbWUiKTsKKworICAgICAgICAgICAgbUxhc3RUaW1lTGFwc2VGcmFtZVJlYWxUaW1lc3RhbXBVcyA9ICp0aW1lc3RhbXBVczsKKyAgICAgICAgICAgICp0aW1lc3RhbXBVcyA9IG1MYXN0RnJhbWVUaW1lc3RhbXBVcyArIG1UaW1lQmV0d2VlblRpbWVMYXBzZVZpZGVvRnJhbWVzVXM7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6ZGF0YUNhbGxiYWNrVGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wVXMsIGludDMyX3QgbXNnVHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKSB7CisgICAgaWYgKCFtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UpIHsKKyAgICAgICAgbVNraXBDdXJyZW50RnJhbWUgPSBza2lwRnJhbWVBbmRNb2RpZnlUaW1lU3RhbXAoJnRpbWVzdGFtcFVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUNhbWVyYUlkbGVMb2NrKTsKKyAgICAgICAgLy8gSWYgd2UgYXJlIHVzaW5nIHRoZSBzdGlsbCBjYW1lcmEgYW5kIHN0b3AoKSBoYXMgYmVlbiBjYWxsZWQsIGl0IG1heQorICAgICAgICAvLyBiZSB3YWl0aW5nIGZvciB0aGUgY2FtZXJhIHRvIGdldCBpZGxlLiBJbiB0aGF0IGNhc2UgcmV0dXJuCisgICAgICAgIC8vIGltbWVkaWF0ZWx5LiBDYWxsaW5nIENhbWVyYVNvdXJjZTo6ZGF0YUNhbGxiYWNrVGltZXN0YW1wKCkgd2lsbCBsZWFkCisgICAgICAgIC8vIHRvIGEgZGVhZGxvY2sgc2luY2UgaXQgdHJpZXMgdG8gYWNjZXNzIENhbWVyYVNvdXJjZTo6bUxvY2sgd2hpY2ggaW4KKyAgICAgICAgLy8gdGhpcyBjYXNlIGlzIGhlbGQgYnkgQ2FtZXJhU291cmNlOjpzdG9wKCkgY3VycmVudGx5IHdhaXRpbmcgZm9yIHRoZQorICAgICAgICAvLyBjYW1lcmEgdG8gZ2V0IGlkbGUuIEFuZCBjYW1lcmEgd2lsbCBub3QgZ2V0IGlkbGUgdW50aWwgdGhpcyBjYWxsCisgICAgICAgIC8vIHJldHVybnMuCisgICAgICAgIGlmIChtU3RvcFdhaXRpbmdGb3JJZGxlQ2FtZXJhKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgQ2FtZXJhU291cmNlOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wVXMsIG1zZ1R5cGUsIGRhdGEpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2VTcGxpdHRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVNvdXJjZVNwbGl0dGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmM3MDEyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2VTcGxpdHRlci5jcHAKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhU291cmNlU3BsaXR0ZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZVNwbGl0dGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNZWRpYVNvdXJjZVNwbGl0dGVyOjpNZWRpYVNvdXJjZVNwbGl0dGVyKHNwPE1lZGlhU291cmNlPiBtZWRpYVNvdXJjZSkgeworICAgIG1OdW1iZXJPZkNsaWVudHMgPSAwOworICAgIG1Tb3VyY2UgPSBtZWRpYVNvdXJjZTsKKyAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOworCisgICAgbU51bWJlck9mQ2xpZW50c1N0YXJ0ZWQgPSAwOworICAgIG1OdW1iZXJPZkN1cnJlbnRSZWFkcyA9IDA7CisgICAgbUN1cnJlbnRSZWFkQml0ID0gMDsKKyAgICBtTGFzdFJlYWRDb21wbGV0ZWQgPSB0cnVlOworfQorCitNZWRpYVNvdXJjZVNwbGl0dGVyOjp+TWVkaWFTb3VyY2VTcGxpdHRlcigpIHsKK30KKworc3A8TWVkaWFTb3VyY2U+IE1lZGlhU291cmNlU3BsaXR0ZXI6OmNyZWF0ZUNsaWVudCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgc3A8TWVkaWFTb3VyY2U+IGNsaWVudCA9IG5ldyBDbGllbnQodGhpcywgbU51bWJlck9mQ2xpZW50cysrKTsKKyAgICBtQ2xpZW50c1N0YXJ0ZWQucHVzaChmYWxzZSk7CisgICAgbUNsaWVudHNEZXNpcmVkUmVhZEJpdC5wdXNoKDApOworICAgIHJldHVybiBjbGllbnQ7Cit9CisKK3N0YXR1c190IE1lZGlhU291cmNlU3BsaXR0ZXI6OnN0YXJ0KGludCBjbGllbnRJZCwgTWV0YURhdGEgKnBhcmFtcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBMT0dWKCJzdGFydCBjbGllbnQgKCVkKSIsIGNsaWVudElkKTsKKyAgICBpZiAobUNsaWVudHNTdGFydGVkW2NsaWVudElkXSkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgbU51bWJlck9mQ2xpZW50c1N0YXJ0ZWQrKzsKKworICAgIGlmICghbVNvdXJjZVN0YXJ0ZWQpIHsKKyAgICAgICAgTE9HVigiU3RhcnRpbmcgcmVhbCBzb3VyY2UgZnJvbSBjbGllbnQgKCVkKSIsIGNsaWVudElkKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RhcnQocGFyYW1zKTsKKworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBtU291cmNlU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICBtQ2xpZW50c1N0YXJ0ZWQuZWRpdEl0ZW1BdChjbGllbnRJZCkgPSB0cnVlOworICAgICAgICAgICAgbUNsaWVudHNEZXNpcmVkUmVhZEJpdC5lZGl0SXRlbUF0KGNsaWVudElkKSA9ICFtQ3VycmVudFJlYWRCaXQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZXJyOworICAgIH0gZWxzZSB7CisgICAgICAgIG1DbGllbnRzU3RhcnRlZC5lZGl0SXRlbUF0KGNsaWVudElkKSA9IHRydWU7CisgICAgICAgIGlmIChtTGFzdFJlYWRDb21wbGV0ZWQpIHsKKyAgICAgICAgICAgIC8vIExhc3QgcmVhZCB3YXMgY29tcGxldGVkLiBTbyBqb2luIGluIHRoZSB0aHJlYWRzIGZvciB0aGUgbmV4dCByZWFkLgorICAgICAgICAgICAgbUNsaWVudHNEZXNpcmVkUmVhZEJpdC5lZGl0SXRlbUF0KGNsaWVudElkKSA9ICFtQ3VycmVudFJlYWRCaXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBMYXN0IHJlYWQgaXMgb25nb2luZy4gU28gam9pbiBpbiB0aGUgdGhyZWFkcyBmb3IgdGhlIGN1cnJlbnQgcmVhZC4KKyAgICAgICAgICAgIG1DbGllbnRzRGVzaXJlZFJlYWRCaXQuZWRpdEl0ZW1BdChjbGllbnRJZCkgPSBtQ3VycmVudFJlYWRCaXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KK30KKworc3RhdHVzX3QgTWVkaWFTb3VyY2VTcGxpdHRlcjo6c3RvcChpbnQgY2xpZW50SWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgTE9HVigic3RvcCBjbGllbnQgKCVkKSIsIGNsaWVudElkKTsKKyAgICBDSEVDSyhjbGllbnRJZCA+PSAwICYmIGNsaWVudElkIDwgbU51bWJlck9mQ2xpZW50cyk7CisgICAgQ0hFQ0sobUNsaWVudHNTdGFydGVkW2NsaWVudElkXSk7CisKKyAgICBpZiAoLS1tTnVtYmVyT2ZDbGllbnRzU3RhcnRlZCA9PSAwKSB7CisgICAgICAgIExPR1YoIlN0b3BwaW5nIHJlYWwgc291cmNlIGZyb20gY2xpZW50ICglZCkiLCBjbGllbnRJZCk7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgbUNsaWVudHNTdGFydGVkLmVkaXRJdGVtQXQoY2xpZW50SWQpID0gZmFsc2U7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNsaWVudHNTdGFydGVkLmVkaXRJdGVtQXQoY2xpZW50SWQpID0gZmFsc2U7CisgICAgICAgIGlmICghbUxhc3RSZWFkQ29tcGxldGVkICYmIChtQ2xpZW50c0Rlc2lyZWRSZWFkQml0W2NsaWVudElkXSA9PSBtQ3VycmVudFJlYWRCaXQpKSB7CisgICAgICAgICAgICAvLyAhbUxhc3RSZWFkQ29tcGxldGVkIGltcGxpZXMgdGhhdCBidWZmZXIgaGFzIGJlZW4gcmVhZCBmcm9tIHNvdXJjZSwgYnV0IGFsbAorICAgICAgICAgICAgLy8gY2xpZW50cyBoYXZlbid0IHJlYWQgaXQuCisgICAgICAgICAgICAvLyBtQ2xpZW50c0Rlc2lyZWRSZWFkQml0W2NsaWVudElkXSA9PSBtQ3VycmVudFJlYWRCaXQgaW1wbGllcyB0aGF0IHRoaXMKKyAgICAgICAgICAgIC8vIGNsaWVudCB3b3VsZCBoYXZlIHdhbnRlZCB0byByZWFkIGZyb20gdGhpcyBidWZmZXIuIChpLmUuIGl0IGhhcyBub3QgeWV0CisgICAgICAgICAgICAvLyBjYWxsZWQgcmVhZCgpIGZvciB0aGUgY3VycmVudCByZWFkIGJ1ZmZlci4pCisgICAgICAgICAgICAvLyBTaW5jZSBvdGhlciB0aHJlYWRzIG1heSBiZSB3YWl0aW5nIGZvciBhbGwgdGhlIGNsaWVudHMnIHJlYWRzIHRvIGNvbXBsZXRlLAorICAgICAgICAgICAgLy8gc2lnbmFsIHRoYXQgdGhpcyByZWFkIGhhcyBiZWVuIGFib3J0ZWQuCisgICAgICAgICAgICBzaWduYWxSZWFkQ29tcGxldGVfbG9jayh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorfQorCitzcDxNZXRhRGF0YT4gTWVkaWFTb3VyY2VTcGxpdHRlcjo6Z2V0Rm9ybWF0KGludCBjbGllbnRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBMT0dWKCJnZXRGb3JtYXQgY2xpZW50ICglZCkiLCBjbGllbnRJZCk7CisgICAgcmV0dXJuIG1Tb3VyY2UtPmdldEZvcm1hdCgpOworfQorCitzdGF0dXNfdCBNZWRpYVNvdXJjZVNwbGl0dGVyOjpyZWFkKGludCBjbGllbnRJZCwKKyAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBDSEVDSyhjbGllbnRJZCA+PSAwICYmIGNsaWVudElkIDwgbU51bWJlck9mQ2xpZW50cyk7CisKKyAgICBMT0dWKCJyZWFkIGNsaWVudCAoJWQpIiwgY2xpZW50SWQpOworICAgICpidWZmZXIgPSBOVUxMOworCisgICAgaWYgKCFtQ2xpZW50c1N0YXJ0ZWRbY2xpZW50SWRdKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpZiAobUN1cnJlbnRSZWFkQml0ICE9IG1DbGllbnRzRGVzaXJlZFJlYWRCaXRbY2xpZW50SWRdKSB7CisgICAgICAgIC8vIERlc2lyZWQgYnVmZmVyIGhhcyBub3QgYmVlbiByZWFkIGZyb20gc291cmNlIHlldC4KKworICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBjbGllbnQgaXMgdGhlIHNwZWNpYWwgY2xpZW50IHdpdGggY2xpZW50SWQgPSAwCisgICAgICAgIC8vIHRoZW4gcmVhZCBmcm9tIHNvdXJjZSwgZWxzZSB3YWl0IHVudGlsIHRoZSBjbGllbnQgMCBoYXMgZmluaXNoZWQKKyAgICAgICAgLy8gcmVhZGluZyBmcm9tIHNvdXJjZS4KKyAgICAgICAgaWYgKGNsaWVudElkID09IDApIHsKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIGFsbCBjbGllbnQncyBsYXN0IHJlYWQgdG8gY29tcGxldGUgZmlyc3Qgc28gYXMgdG8gbm90CisgICAgICAgICAgICAvLyBjb3JydXB0IHRoZSBidWZmZXIgYXQgbUxhc3RSZWFkTWVkaWFCdWZmZXIuCisgICAgICAgICAgICB3YWl0Rm9yQWxsQ2xpZW50c0xhc3RSZWFkX2xvY2soY2xpZW50SWQpOworCisgICAgICAgICAgICByZWFkRnJvbVNvdXJjZV9sb2NrKG9wdGlvbnMpOworICAgICAgICAgICAgKmJ1ZmZlciA9IG1MYXN0UmVhZE1lZGlhQnVmZmVyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2FpdEZvclJlYWRGcm9tU291cmNlX2xvY2soY2xpZW50SWQpOworCisgICAgICAgICAgICAqYnVmZmVyID0gbUxhc3RSZWFkTWVkaWFCdWZmZXI7CisgICAgICAgICAgICAoKmJ1ZmZlciktPmFkZF9yZWYoKTsKKyAgICAgICAgfQorICAgICAgICBDSEVDSyhtQ3VycmVudFJlYWRCaXQgPT0gbUNsaWVudHNEZXNpcmVkUmVhZEJpdFtjbGllbnRJZF0pOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERlc2lyZWQgYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gcmVhZCBmcm9tIHNvdXJjZS4gVXNlIHRoZSBjYWNoZWQgZGF0YS4KKyAgICAgICAgQ0hFQ0soY2xpZW50SWQgIT0gMCk7CisKKyAgICAgICAgKmJ1ZmZlciA9IG1MYXN0UmVhZE1lZGlhQnVmZmVyOworICAgICAgICAoKmJ1ZmZlciktPmFkZF9yZWYoKTsKKyAgICB9CisKKyAgICBtQ2xpZW50c0Rlc2lyZWRSZWFkQml0LmVkaXRJdGVtQXQoY2xpZW50SWQpID0gIW1DbGllbnRzRGVzaXJlZFJlYWRCaXRbY2xpZW50SWRdOworICAgIHNpZ25hbFJlYWRDb21wbGV0ZV9sb2NrKGZhbHNlKTsKKworICAgIHJldHVybiBtTGFzdFJlYWRTdGF0dXM7Cit9CisKK3ZvaWQgTWVkaWFTb3VyY2VTcGxpdHRlcjo6cmVhZEZyb21Tb3VyY2VfbG9jayhjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICBtTGFzdFJlYWRTdGF0dXMgPSBtU291cmNlLT5yZWFkKCZtTGFzdFJlYWRNZWRpYUJ1ZmZlciAsIG9wdGlvbnMpOworCisgICAgbUN1cnJlbnRSZWFkQml0ID0gIW1DdXJyZW50UmVhZEJpdDsKKyAgICBtTGFzdFJlYWRDb21wbGV0ZWQgPSBmYWxzZTsKKyAgICBtUmVhZEZyb21Tb3VyY2VDb25kaXRpb24uYnJvYWRjYXN0KCk7Cit9CisKK3ZvaWQgTWVkaWFTb3VyY2VTcGxpdHRlcjo6d2FpdEZvclJlYWRGcm9tU291cmNlX2xvY2soaW50MzJfdCBjbGllbnRJZCkgeworICAgIG1SZWFkRnJvbVNvdXJjZUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKK30KKwordm9pZCBNZWRpYVNvdXJjZVNwbGl0dGVyOjp3YWl0Rm9yQWxsQ2xpZW50c0xhc3RSZWFkX2xvY2soaW50MzJfdCBjbGllbnRJZCkgeworICAgIGlmIChtTGFzdFJlYWRDb21wbGV0ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQWxsUmVhZHNDb21wbGV0ZUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICBDSEVDSyhtTGFzdFJlYWRDb21wbGV0ZWQpOworfQorCit2b2lkIE1lZGlhU291cmNlU3BsaXR0ZXI6OnNpZ25hbFJlYWRDb21wbGV0ZV9sb2NrKGJvb2wgcmVhZEFib3J0ZWQpIHsKKyAgICBpZiAoIXJlYWRBYm9ydGVkKSB7CisgICAgICAgIG1OdW1iZXJPZkN1cnJlbnRSZWFkcysrOworICAgIH0KKworICAgIGlmIChtTnVtYmVyT2ZDdXJyZW50UmVhZHMgPT0gbU51bWJlck9mQ2xpZW50c1N0YXJ0ZWQpIHsKKyAgICAgICAgbUxhc3RSZWFkQ29tcGxldGVkID0gdHJ1ZTsKKyAgICAgICAgbU51bWJlck9mQ3VycmVudFJlYWRzID0gMDsKKyAgICAgICAgbUFsbFJlYWRzQ29tcGxldGVDb25kaXRpb24uYnJvYWRjYXN0KCk7CisgICAgfQorfQorCitzdGF0dXNfdCBNZWRpYVNvdXJjZVNwbGl0dGVyOjpwYXVzZShpbnQgY2xpZW50SWQpIHsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKKy8vIENsaWVudAorCitNZWRpYVNvdXJjZVNwbGl0dGVyOjpDbGllbnQ6OkNsaWVudCgKKyAgICAgICAgc3A8TWVkaWFTb3VyY2VTcGxpdHRlcj4gc3BsaXR0ZXIsCisgICAgICAgIGludDMyX3QgY2xpZW50SWQpIHsKKyAgICBtU3BsaXR0ZXIgPSBzcGxpdHRlcjsKKyAgICBtQ2xpZW50SWQgPSBjbGllbnRJZDsKK30KKworc3RhdHVzX3QgTWVkaWFTb3VyY2VTcGxpdHRlcjo6Q2xpZW50OjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgcmV0dXJuIG1TcGxpdHRlci0+c3RhcnQobUNsaWVudElkLCBwYXJhbXMpOworfQorCitzdGF0dXNfdCBNZWRpYVNvdXJjZVNwbGl0dGVyOjpDbGllbnQ6OnN0b3AoKSB7CisgICAgcmV0dXJuIG1TcGxpdHRlci0+c3RvcChtQ2xpZW50SWQpOworfQorCitzcDxNZXRhRGF0YT4gTWVkaWFTb3VyY2VTcGxpdHRlcjo6Q2xpZW50OjpnZXRGb3JtYXQoKSB7CisgICAgcmV0dXJuIG1TcGxpdHRlci0+Z2V0Rm9ybWF0KG1DbGllbnRJZCk7Cit9CisKK3N0YXR1c190IE1lZGlhU291cmNlU3BsaXR0ZXI6OkNsaWVudDo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgcmV0dXJuIG1TcGxpdHRlci0+cmVhZChtQ2xpZW50SWQsIGJ1ZmZlciwgb3B0aW9ucyk7Cit9CisKK3N0YXR1c190IE1lZGlhU291cmNlU3BsaXR0ZXI6OkNsaWVudDo6cGF1c2UoKSB7CisgICAgcmV0dXJuIG1TcGxpdHRlci0+cGF1c2UobUNsaWVudElkKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051SFRUUERhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAKaW5kZXggZmNiZmRhYy4uMjc0M2IyZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAKQEAgLTQyLDcgKzQyLDcgQEAKICAgICAgICAgcGF0aC0+c2V0VG8oc2xhc2hQb3MpOwogICAgIH0KIAotICAgIGNoYXIgKmNvbG9uUG9zID0gc3RyY2hyKGhvc3QtPnN0cmluZygpLCAnOicpOworICAgIGNvbnN0IGNoYXIgKmNvbG9uUG9zID0gc3RyY2hyKGhvc3QtPnN0cmluZygpLCAnOicpOwogCiAgICAgaWYgKGNvbG9uUG9zICE9IE5VTEwpIHsKICAgICAgICAgdW5zaWduZWQgbG9uZyB4OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCmluZGV4IDc2Yzg4NzAuLjRkNjlkZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKQEAgLTE1MiwzMSArMTUyLDM4IEBACiAKIHN0YXRpYyBjb25zdCBDb2RlY0luZm8ga0RlY29kZXJJbmZvW10gPSB7CiAgICAgeyBNRURJQV9NSU1FVFlQRV9JTUFHRV9KUEVHLCAiT01YLlRJLkpQRUcuZGVjb2RlIiB9LAorLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHLCAiT01YLk52aWRpYS5tcDMuZGVjb2RlciIgfSwKIC8vICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRywgIk9NWC5USS5NUDMuZGVjb2RlIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRywgIk1QM0RlY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcsICJPTVguUFYubXAzZGVjIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJPTVguVEkuQU1SLmRlY29kZSIgfSwKKy8vICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCAiT01YLk52aWRpYS5hbXIuZGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgIkFNUk5CRGVjb2RlciIgfSwKIC8vICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCAiT01YLlBWLmFtcmRlYyIgfSwKKy8vICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCAiT01YLk52aWRpYS5hbXJ3Yi5kZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCAiT01YLlRJLldCQU1SLmRlY29kZSIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgIkFNUldCRGVjb2RlciIgfSwKIC8vICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCAiT01YLlBWLmFtcmRlYyIgfSwKKy8vICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCAiT01YLk52aWRpYS5hYWMuZGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgIk9NWC5USS5BQUMuZGVjb2RlIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCAiQUFDRGVjb2RlciIgfSwKIC8vICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCAiT01YLlBWLmFhY2RlYyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVywgIkc3MTFEZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXLCAiRzcxMURlY29kZXIiIH0sCisvLyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLk52aWRpYS5tcDQuZGVjb2RlIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVgucWNvbS43eDMwLnZpZGVvLmRlY29kZXIubXBlZzQiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIubXBlZzQiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5USS5WaWRlby5EZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVguU0VDLk1QRUc0LkRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk00dkgyNjNEZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5QVi5tcGVnNGRlYyIgfSwKKy8vICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk9NWC5OdmlkaWEuaDI2My5kZWNvZGUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLnFjb20uN3gzMC52aWRlby5kZWNvZGVyLmgyNjMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5oMjYzIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk9NWC5TRUMuSDI2My5EZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk00dkgyNjNEZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLlBWLmgyNjNkZWMiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguTnZpZGlhLmgyNjQuZGVjb2RlIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLnFjb20uN3gzMC52aWRlby5kZWNvZGVyLmF2YyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuYXZjIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLlRJLlZpZGVvLkRlY29kZXIiIH0sCkBAIC0xOTgsMTggKzIwNSwyMSBAQAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVgucWNvbS43eDMwLnZpZGVvLmVuY29kZXIubXBlZzQiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIubXBlZzQiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5USS5WaWRlby5lbmNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVguTnZpZGlhLm1wNC5lbmNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVguU0VDLk1QRUc0LkVuY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk00dkgyNjNFbmNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5QVi5tcGVnNGVuYyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVgucWNvbS43eDMwLnZpZGVvLmVuY29kZXIuaDI2MyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmgyNjMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLlRJLlZpZGVvLmVuY29kZXIiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLk52aWRpYS5oMjYzLmVuY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLlNFQy5IMjYzLkVuY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiTTR2SDI2M0VuY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVguUFYuaDI2M2VuYyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5xY29tLjd4MzAudmlkZW8uZW5jb2Rlci5hdmMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2YyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5USS5WaWRlby5lbmNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLk52aWRpYS5oMjY0LmVuY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguU0VDLkFWQy5FbmNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiQVZDRW5jb2RlciIgfSwKIC8vICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLlBWLmF2Y2VuYyIgfSwKQEAgLTM0OSw2ICszNTksMTMgQEAKIHVpbnQzMl90IE9NWENvZGVjOjpnZXRDb21wb25lbnRRdWlya3MoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSkgewogICAgIHVpbnQzMl90IHF1aXJrcyA9IDA7CiAKKyAgICBpZiAoIXN0cmNtcChjb21wb25lbnROYW1lLCAiT01YLk52aWRpYS5hbXIuZGVjb2RlciIpIHx8CisgICAgICAgICAhc3RyY21wKGNvbXBvbmVudE5hbWUsICJPTVguTnZpZGlhLmFtcndiLmRlY29kZXIiKSB8fAorICAgICAgICAgIXN0cmNtcChjb21wb25lbnROYW1lLCAiT01YLk52aWRpYS5hYWMuZGVjb2RlciIpIHx8CisgICAgICAgICAhc3RyY21wKGNvbXBvbmVudE5hbWUsICJPTVguTnZpZGlhLm1wMy5kZWNvZGVyIikpIHsKKyAgICAgICAgcXVpcmtzIHw9IGtEZWNvZGVyTGllc0Fib3V0TnVtYmVyT2ZDaGFubmVsczsKKyAgICB9CisKICAgICBpZiAoIXN0cmNtcChjb21wb25lbnROYW1lLCAiT01YLlBWLmF2Y2RlYyIpKSB7CiAgICAgICAgIHF1aXJrcyB8PSBrV2FudHNOQUxGcmFnbWVudHM7CiAgICAgfQpAQCAtODc2LDYgKzg5MywxMCBAQAogICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0OwogICAgIENIRUNLX0VRKE9LLCBmaW5kVGFyZ2V0Q29sb3JGb3JtYXQobWV0YSwgJmNvbG9yRm9ybWF0KSk7CiAKKyAgICBpZiAoIXN0cmNhc2VjbXAoIk9NWC5OdmlkaWEuaDI2NC5lbmNvZGVyIiwgbUNvbXBvbmVudE5hbWUpKSB7CisgICAgICAgIGNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsKKyAgICB9CisKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7CiAgICAgT01YX1ZJREVPX1BPUlRERUZJTklUSU9OVFlQRSAqdmlkZW9fZGVmID0gJmRlZi5mb3JtYXQudmlkZW87CkBAIC0xMjI5LDYgKzEyNTAsMTAgQEAKICAgICBoMjY0dHlwZS5iTUJBRkYgPSBPTVhfRkFMU0U7CiAgICAgaDI2NHR5cGUuZUxvb3BGaWx0ZXJNb2RlID0gT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJFbmFibGU7CiAKKyAgICBpZiAoIXN0cmNhc2VjbXAoIk9NWC5OdmlkaWEuaDI2NC5lbmNvZGVyIiwgbUNvbXBvbmVudE5hbWUpKSB7CisgICAgICAgIGgyNjR0eXBlLmVMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbE1heDsKKyAgICB9CisKICAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1WaWRlb0F2YywgJmgyNjR0eXBlLCBzaXplb2YoaDI2NHR5cGUpKTsKICAgICBDSEVDS19FUShlcnIsIE9LKTsKQEAgLTE4MTMsNyArMTgzOCw5IEBACiAKICAgICAgICAgY2FzZSBPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkOgogICAgICAgICB7Ci0gICAgICAgICAgICBvblBvcnRTZXR0aW5nc0NoYW5nZWQoZGF0YTEpOworICAgICAgICAgICAgaWYgKGRhdGEyID09IDAgfHwgZGF0YTIgPT0gT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbikgeworICAgICAgICAgICAgICAgIG9uUG9ydFNldHRpbmdzQ2hhbmdlZChkYXRhMSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yMjAzLDYgKzIyMzAsNyBAQAogICAgIENIRUNLX0VRKG1Qb3J0U3RhdHVzW3BvcnRJbmRleF0sIEVOQUJMRUQpOwogICAgIG1Qb3J0U3RhdHVzW3BvcnRJbmRleF0gPSBESVNBQkxJTkc7CiAKKyAgICBDT0RFQ19MT0dWKCJzZW5kaW5nIE9NWF9Db21tYW5kUG9ydERpc2FibGUoJWxkKSIsIHBvcnRJbmRleCk7CiAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgbU9NWC0+c2VuZENvbW1hbmQobU5vZGUsIE9NWF9Db21tYW5kUG9ydERpc2FibGUsIHBvcnRJbmRleCk7CiAgICAgQ0hFQ0tfRVEoZXJyLCBPSyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb1NvdXJjZURvd25TYW1wbGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvU291cmNlRG93blNhbXBsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhN2IwOWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb1NvdXJjZURvd25TYW1wbGVyLmNwcApAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVmlkZW9Tb3VyY2VEb3duU2FtcGxlciIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvU291cmNlRG93blNhbXBsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1lVVkltYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvWVVWQ2FudmFzLmg+CisjaW5jbHVkZSAiT01YX1ZpZGVvLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6VmlkZW9Tb3VyY2VEb3duU2FtcGxlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnZpZGVvU291cmNlLAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgIExPR1YoIkNvbnN0cnVjdCBWaWRlb1NvdXJjZURvd25TYW1wbGVyIik7CisgICAgQ0hFQ0sod2lkdGggPiAwKTsKKyAgICBDSEVDSyhoZWlnaHQgPiAwKTsKKworICAgIG1SZWFsVmlkZW9Tb3VyY2UgPSB2aWRlb1NvdXJjZTsKKyAgICBtV2lkdGggPSB3aWR0aDsKKyAgICBtSGVpZ2h0ID0gaGVpZ2h0OworCisgICAgbU1ldGEgPSBuZXcgTWV0YURhdGEoKihtUmVhbFZpZGVvU291cmNlLT5nZXRGb3JtYXQoKSkpOworICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmbVJlYWxTb3VyY2VXaWR0aCkpOworICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJm1SZWFsU291cmNlSGVpZ2h0KSk7CisKKyAgICBpZiAoKG1XaWR0aCAhPSBtUmVhbFNvdXJjZVdpZHRoKSB8fCAobUhlaWdodCAhPSBtUmVhbFNvdXJjZUhlaWdodCkpIHsKKyAgICAgICAgLy8gQ2hhbmdlIG1ldGEgZGF0YSBmb3Igd2lkdGggYW5kIGhlaWdodC4KKyAgICAgICAgQ0hFQ0sobVdpZHRoIDw9IG1SZWFsU291cmNlV2lkdGgpOworICAgICAgICBDSEVDSyhtSGVpZ2h0IDw9IG1SZWFsU291cmNlSGVpZ2h0KTsKKworICAgICAgICBtTmVlZERvd25TYW1wbGluZyA9IHRydWU7CisgICAgICAgIGNvbXB1dGVEb3duU2FtcGxpbmdQYXJhbWV0ZXJzKCk7CisgICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIG1XaWR0aCk7CisgICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBtSGVpZ2h0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtTmVlZERvd25TYW1wbGluZyA9IGZhbHNlOworICAgIH0KK30KKworVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6flZpZGVvU291cmNlRG93blNhbXBsZXIoKSB7Cit9CisKK3ZvaWQgVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6Y29tcHV0ZURvd25TYW1wbGluZ1BhcmFtZXRlcnMoKSB7CisgICAgbURvd25TYW1wbGVTa2lwWCA9IG1SZWFsU291cmNlV2lkdGggLyBtV2lkdGg7CisgICAgbURvd25TYW1wbGVTa2lwWSA9IG1SZWFsU291cmNlSGVpZ2h0IC8gbUhlaWdodDsKKworICAgIG1Eb3duU2FtcGxlT2Zmc2V0WCA9IG1SZWFsU291cmNlV2lkdGggLSBtRG93blNhbXBsZVNraXBYICogbVdpZHRoOworICAgIG1Eb3duU2FtcGxlT2Zmc2V0WSA9IG1SZWFsU291cmNlSGVpZ2h0IC0gbURvd25TYW1wbGVTa2lwWSAqIG1IZWlnaHQ7Cit9CisKK3ZvaWQgVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6ZG93blNhbXBsZVlVVkltYWdlKAorICAgICAgICBjb25zdCBNZWRpYUJ1ZmZlciAmc291cmNlQnVmZmVyLCBNZWRpYUJ1ZmZlciAqKmJ1ZmZlcikgY29uc3QgeworICAgIC8vIGZpbmQgdGhlIFlVViBmb3JtYXQKKyAgICBpbnQzMl90IHNyY0Zvcm1hdDsKKyAgICBDSEVDSyhtTWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJnNyY0Zvcm1hdCkpOworICAgIFlVVkltYWdlOjpZVVZGb3JtYXQgeXV2Rm9ybWF0OworICAgIGlmIChzcmNGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpIHsKKyAgICAgICAgeXV2Rm9ybWF0ID0gWVVWSW1hZ2U6OllVVjQyMFNlbWlQbGFuYXI7CisgICAgfSBlbHNlIGlmIChzcmNGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgeworICAgICAgICB5dXZGb3JtYXQgPSBZVVZJbWFnZTo6WVVWNDIwUGxhbmFyOworICAgIH0KKworICAgIC8vIGFsbG9jYXRlIG1lZGlhQnVmZmVyIGZvciBkb3duIHNhbXBsZWQgaW1hZ2UgYW5kIHNldHVwIGEgY2FudmFzLgorICAgICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoWVVWSW1hZ2U6OmJ1ZmZlclNpemUoeXV2Rm9ybWF0LCBtV2lkdGgsIG1IZWlnaHQpKTsKKyAgICBZVVZJbWFnZSB5dXZEb3duU2FtcGxlZEltYWdlKHl1dkZvcm1hdCwKKyAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwKKyAgICAgICAgICAgICh1aW50OF90ICopKCpidWZmZXIpLT5kYXRhKCkpOworICAgIFlVVkNhbnZhcyB5dXZDYW52YXNEb3duU2FtcGxlKHl1dkRvd25TYW1wbGVkSW1hZ2UpOworCisgICAgWVVWSW1hZ2UgeXV2SW1hZ2VTb3VyY2UoeXV2Rm9ybWF0LAorICAgICAgICAgICAgbVJlYWxTb3VyY2VXaWR0aCwgbVJlYWxTb3VyY2VIZWlnaHQsCisgICAgICAgICAgICAodWludDhfdCAqKXNvdXJjZUJ1ZmZlci5kYXRhKCkpOworICAgIHl1dkNhbnZhc0Rvd25TYW1wbGUuZG93bnNhbXBsZShtRG93blNhbXBsZU9mZnNldFgsIG1Eb3duU2FtcGxlT2Zmc2V0WSwKKyAgICAgICAgICAgIG1Eb3duU2FtcGxlU2tpcFgsIG1Eb3duU2FtcGxlU2tpcFksCisgICAgICAgICAgICB5dXZJbWFnZVNvdXJjZSk7Cit9CisKK3N0YXR1c190IFZpZGVvU291cmNlRG93blNhbXBsZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICBMT0dWKCJzdGFydCIpOworICAgIHJldHVybiBtUmVhbFZpZGVvU291cmNlLT5zdGFydCgpOworfQorCitzdGF0dXNfdCBWaWRlb1NvdXJjZURvd25TYW1wbGVyOjpzdG9wKCkgeworICAgIExPR1YoInN0b3AiKTsKKyAgICByZXR1cm4gbVJlYWxWaWRlb1NvdXJjZS0+c3RvcCgpOworfQorCitzcDxNZXRhRGF0YT4gVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6Z2V0Rm9ybWF0KCkgeworICAgIExPR1YoImdldEZvcm1hdCIpOworICAgIHJldHVybiBtTWV0YTsKK30KKworc3RhdHVzX3QgVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgTE9HVigicmVhZCIpOworICAgIE1lZGlhQnVmZmVyICpyZWFsQnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1SZWFsVmlkZW9Tb3VyY2UtPnJlYWQoJnJlYWxCdWZmZXIsIG9wdGlvbnMpOworCisgICAgaWYgKG1OZWVkRG93blNhbXBsaW5nKSB7CisgICAgICAgIGRvd25TYW1wbGVZVVZJbWFnZSgqcmVhbEJ1ZmZlciwgYnVmZmVyKTsKKworICAgICAgICBpbnQ2NF90IGZyYW1lVGltZTsKKyAgICAgICAgcmVhbEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJmZyYW1lVGltZSk7CisgICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBmcmFtZVRpbWUpOworCisgICAgICAgIC8vIFdlIGp1c3Qgd2FudCB0aGlzIGJ1ZmZlciB0byBiZSBkZWxldGVkIHdoZW4gdGhlIGVuY29kZXIgcmVsZWFzZXMgaXQuCisgICAgICAgIC8vIFNvIGRvbid0IGFkZCBhIHJlZmVyZW5jZSB0byBpdCBhbmQgc2V0IHRoZSBvYnNlcnZlciB0byBOVUxMLgorICAgICAgICAoKmJ1ZmZlciktPnNldE9ic2VydmVyKE5VTEwpOworCisgICAgICAgIC8vIFRoZSBvcmlnaW5hbCBidWZmZXIgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLiBSZWxlYXNlIGl0LgorICAgICAgICByZWFsQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmJ1ZmZlciA9IHJlYWxCdWZmZXI7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6cGF1c2UoKSB7CisgICAgTE9HVigicGF1c2UiKTsKKyAgICByZXR1cm4gbVJlYWxWaWRlb1NvdXJjZS0+cGF1c2UoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKaW5kZXggYjliYTFiZS4uMmI2MzIzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKQEAgLTYsNyArNiw4IEBACiAgICAgICAgIFNvZnR3YXJlUmVuZGVyZXIuY3BwCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvb3BlbmNvcmUvZXh0ZXJuX2xpYnNfdjIva2hyb25vcy9vcGVubWF4L2luY2x1ZGUKKyAgICAgICAgJChUT1ApL2V4dGVybmFsL29wZW5jb3JlL2V4dGVybl9saWJzX3YyL2tocm9ub3Mvb3Blbm1heC9pbmNsdWRlIFwKKyAgICAgICAgJChUT1ApL2hhcmR3YXJlL21zbTdrCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gICAgICAgXAogICAgICAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICBcCkBAIC0xNyw2ICsxOCwxMSBAQAogICAgICAgICBsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnRcCiAgICAgICAgIGxpYmNhbWVyYV9jbGllbnQKIAorIyBpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksbXNtN2spCitpZmVxICgkKFRBUkdFVF9QUk9EVUNUKSxwYXNzaW9uKQorCUxPQ0FMX0NGTEFHUyArPSAtREhBU19ZQ0JDUjQyMF9TUF9BRFJFTk8KK2VuZGlmCisKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X2NvbG9yX2NvbnZlcnNpb24KIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCmluZGV4IGE2ZGJmNjkuLmMyMDRhOTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKQEAgLTIyLDY1ICsyMiwxNzkgQEAKICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcFBtZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+Ci0jaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KKyNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9TdXJmYWNlLmg+CisjaW5jbHVkZSA8dWkvYW5kcm9pZF9uYXRpdmVfYnVmZmVyLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oPgorCisvLyBYWFg6IFRlbXBvcmFyeSBoYWNrIHRvIGFsbG93IHJlZmVyZW5jaW5nIHRoZSBfQURSRU5PIHBpeGVsIGZvcm1hdCBoZXJlLgorI2luY2x1ZGUgPGxpYmdyYWxsb2MtcXNkOGsvZ3JhbGxvY19wcml2Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogU29mdHdhcmVSZW5kZXJlcjo6U29mdHdhcmVSZW5kZXJlcigKICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQsCi0gICAgICAgIGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSwKKyAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0LAogICAgICAgICBzaXplX3QgZGVjb2RlZFdpZHRoLCBzaXplX3QgZGVjb2RlZEhlaWdodCkKICAgICA6IG1Db2xvckZvcm1hdChjb2xvckZvcm1hdCksCi0gICAgICBtQ29udmVydGVyKGNvbG9yRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUpLAotICAgICAgbUlTdXJmYWNlKHN1cmZhY2UpLAorICAgICAgbUNvbnZlcnRlcihOVUxMKSwKKyAgICAgIG1ZVVZNb2RlKE5vbmUpLAorICAgICAgbVN1cmZhY2Uoc3VyZmFjZSksCiAgICAgICBtRGlzcGxheVdpZHRoKGRpc3BsYXlXaWR0aCksCiAgICAgICBtRGlzcGxheUhlaWdodChkaXNwbGF5SGVpZ2h0KSwKICAgICAgIG1EZWNvZGVkV2lkdGgoZGVjb2RlZFdpZHRoKSwKLSAgICAgIG1EZWNvZGVkSGVpZ2h0KGRlY29kZWRIZWlnaHQpLAotICAgICAgbUZyYW1lU2l6ZShtRGVjb2RlZFdpZHRoICogbURlY29kZWRIZWlnaHQgKiAyKSwgIC8vIFJHQjU2NQotICAgICAgbUluZGV4KDApIHsKLSAgICBtTWVtb3J5SGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZSgiL2Rldi9wbWVtX2Fkc3AiLCAyICogbUZyYW1lU2l6ZSk7Ci0gICAgaWYgKG1NZW1vcnlIZWFwLT5oZWFwSUQoKSA8IDApIHsKLSAgICAgICAgTE9HSSgiQ3JlYXRpbmcgcGh5c2ljYWwgbWVtb3J5IGhlYXAgZmFpbGVkLCByZXZlcnRpbmcgdG8gcmVndWxhciBoZWFwLiIpOwotICAgICAgICBtTWVtb3J5SGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZSgyICogbUZyYW1lU2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3A8TWVtb3J5SGVhcFBtZW0+IHBtZW1IZWFwID0gbmV3IE1lbW9yeUhlYXBQbWVtKG1NZW1vcnlIZWFwKTsKLSAgICAgICAgcG1lbUhlYXAtPnNsYXAoKTsKLSAgICAgICAgbU1lbW9yeUhlYXAgPSBwbWVtSGVhcDsKKyAgICAgIG1EZWNvZGVkSGVpZ2h0KGRlY29kZWRIZWlnaHQpIHsKKyAgICBMT0dJKCJpbnB1dCBmb3JtYXQgPSAlZCIsIG1Db2xvckZvcm1hdCk7CisgICAgTE9HSSgiZGlzcGxheSA9ICVkIHggJWQsIGRlY29kZWQgPSAlZCB4ICVkIiwKKyAgICAgICAgICAgIG1EaXNwbGF5V2lkdGgsIG1EaXNwbGF5SGVpZ2h0LCBtRGVjb2RlZFdpZHRoLCBtRGVjb2RlZEhlaWdodCk7CisKKyAgICBpbnQgaGFsRm9ybWF0OworICAgIHN3aXRjaCAobUNvbG9yRm9ybWF0KSB7CisjaWYgSEFTX1lDQkNSNDIwX1NQX0FEUkVOTworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQX0FEUkVOTzsKKyAgICAgICAgICAgIG1ZVVZNb2RlID0gWVVWNDIwVG9ZVVY0MjBzcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAweDdmYTMwYzAwOgorICAgICAgICB7CisgICAgICAgICAgICBoYWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUF9BRFJFTk87CisgICAgICAgICAgICBtWVVWTW9kZSA9IFlVVjQyMHNwVG9ZVVY0MjBzcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaGFsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OworCisgICAgICAgICAgICBtQ29udmVydGVyID0gbmV3IENvbG9yQ29udmVydGVyKAorICAgICAgICAgICAgICAgICAgICBtQ29sb3JGb3JtYXQsIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NSk7CisgICAgICAgICAgICBDSEVDSyhtQ29udmVydGVyLT5pc1ZhbGlkKCkpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgQ0hFQ0sobUlTdXJmYWNlLmdldCgpICE9IE5VTEwpOworICAgIENIRUNLKG1TdXJmYWNlLmdldCgpICE9IE5VTEwpOwogICAgIENIRUNLKG1EZWNvZGVkV2lkdGggPiAwKTsKICAgICBDSEVDSyhtRGVjb2RlZEhlaWdodCA+IDApOwotICAgIENIRUNLKG1NZW1vcnlIZWFwLT5oZWFwSUQoKSA+PSAwKTsKLSAgICBDSEVDSyhtQ29udmVydGVyLmlzVmFsaWQoKSk7CisgICAgQ0hFQ0sobUNvbnZlcnRlciA9PSBOVUxMIHx8IG1Db252ZXJ0ZXItPmlzVmFsaWQoKSk7CiAKLSAgICBJU3VyZmFjZTo6QnVmZmVySGVhcCBidWZmZXJIZWFwKAotICAgICAgICAgICAgbURpc3BsYXlXaWR0aCwgbURpc3BsYXlIZWlnaHQsCi0gICAgICAgICAgICBtRGVjb2RlZFdpZHRoLCBtRGVjb2RlZEhlaWdodCwKLSAgICAgICAgICAgIFBJWEVMX0ZPUk1BVF9SR0JfNTY1LAotICAgICAgICAgICAgbU1lbW9yeUhlYXApOworICAgIENIRUNLX0VRKDAsCisgICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF91c2FnZSgKKyAgICAgICAgICAgIG1TdXJmYWNlLmdldCgpLAorICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX05FVkVSIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTgorICAgICAgICAgICAgfCBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUpKTsKIAotICAgIHN0YXR1c190IGVyciA9IG1JU3VyZmFjZS0+cmVnaXN0ZXJCdWZmZXJzKGJ1ZmZlckhlYXApOwotICAgIENIRUNLX0VRKGVyciwgT0spOworICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChtU3VyZmFjZS5nZXQoKSwgMikpOworCisgICAgLy8gV2lkdGggbXVzdCBiZSBtdWx0aXBsZSBvZiAzMj8/PworICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoCisgICAgICAgICAgICAgICAgbVN1cmZhY2UuZ2V0KCksIG1EZWNvZGVkV2lkdGgsIG1EZWNvZGVkSGVpZ2h0LAorICAgICAgICAgICAgICAgIGhhbEZvcm1hdCkpOwogfQogCiBTb2Z0d2FyZVJlbmRlcmVyOjp+U29mdHdhcmVSZW5kZXJlcigpIHsKLSAgICBtSVN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7CisgICAgZGVsZXRlIG1Db252ZXJ0ZXI7CisgICAgbUNvbnZlcnRlciA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IEFMSUdOKHNpemVfdCB4LCBzaXplX3QgYWxpZ25tZW50KSB7CisgICAgcmV0dXJuICh4ICsgYWxpZ25tZW50IC0gMSkgJiB+KGFsaWdubWVudCAtIDEpOwogfQogCiB2b2lkIFNvZnR3YXJlUmVuZGVyZXI6OnJlbmRlcigKICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHZvaWQgKnBsYXRmb3JtUHJpdmF0ZSkgewotICAgIHNpemVfdCBvZmZzZXQgPSBtSW5kZXggKiBtRnJhbWVTaXplOwotICAgIHZvaWQgKmRzdCA9ICh1aW50OF90ICopbU1lbW9yeUhlYXAtPmdldEJhc2UoKSArIG9mZnNldDsKKyAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCAqYnVmOworICAgIGludCBlcnI7CisgICAgaWYgKChlcnIgPSBtU3VyZmFjZS0+ZGVxdWV1ZUJ1ZmZlcihtU3VyZmFjZS5nZXQoKSwgJmJ1ZikpICE9IDApIHsKKyAgICAgICAgTE9HVygiU3VyZmFjZTo6ZGVxdWV1ZUJ1ZmZlciByZXR1cm5lZCBlcnJvciAlZCIsIGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgICBtQ29udmVydGVyLmNvbnZlcnQoCi0gICAgICAgICAgICBtRGVjb2RlZFdpZHRoLCBtRGVjb2RlZEhlaWdodCwKLSAgICAgICAgICAgIGRhdGEsIDAsIGRzdCwgMiAqIG1EZWNvZGVkV2lkdGgpOworICAgIENIRUNLX0VRKDAsIG1TdXJmYWNlLT5sb2NrQnVmZmVyKG1TdXJmYWNlLmdldCgpLCBidWYpKTsKIAotICAgIG1JU3VyZmFjZS0+cG9zdEJ1ZmZlcihvZmZzZXQpOwotICAgIG1JbmRleCA9IDEgLSBtSW5kZXg7CisgICAgR3JhcGhpY0J1ZmZlck1hcHBlciAmbWFwcGVyID0gR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCk7CisKKyAgICBSZWN0IGJvdW5kcyhtRGVjb2RlZFdpZHRoLCBtRGVjb2RlZEhlaWdodCk7CisKKyAgICB2b2lkICpkc3Q7CisgICAgQ0hFQ0tfRVEoMCwgbWFwcGVyLmxvY2soCisgICAgICAgICAgICAgICAgYnVmLT5oYW5kbGUsIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sIGJvdW5kcywgJmRzdCkpOworCisgICAgaWYgKG1Db252ZXJ0ZXIpIHsKKyAgICAgICAgbUNvbnZlcnRlci0+Y29udmVydCgKKyAgICAgICAgICAgICAgICBtRGVjb2RlZFdpZHRoLCBtRGVjb2RlZEhlaWdodCwKKyAgICAgICAgICAgICAgICBkYXRhLCAwLCBkc3QsIGJ1Zi0+c3RyaWRlICogMik7CisgICAgfSBlbHNlIGlmIChtWVVWTW9kZSA9PSBZVVY0MjBzcFRvWVVWNDIwc3ApIHsKKyAgICAgICAgLy8gSW5wdXQgYW5kIG91dHB1dCBhcmUgYm90aCBZVVY0MjBzcCwgYnV0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzCisgICAgICAgIC8vIGFyZSBkaWZmZXJlbnQuCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlID0gbURlY29kZWRXaWR0aDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKyAgICAgICAgdWludDhfdCAqZHN0WSA9ICh1aW50OF90ICopZHN0OworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EZWNvZGVkSGVpZ2h0OyArK2kpIHsKKyAgICAgICAgICAgIG1lbWNweShkc3RZLCBzcmNZLCBtRGVjb2RlZFdpZHRoKTsKKyAgICAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgICAgIGRzdFkgKz0gYnVmLT5zdHJpZGU7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3Qgc3JjVVZTdHJpZGUgPSAobURlY29kZWRXaWR0aCArIDEpICYgfjE7CisgICAgICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IEFMSUdOKG1EZWNvZGVkV2lkdGggLyAyLCAzMikgKiAyOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1VWID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhCisgICAgICAgICAgICArIG1EZWNvZGVkSGVpZ2h0ICogbURlY29kZWRXaWR0aDsKKworICAgICAgICBzaXplX3QgZHN0VVZPZmZzZXQgPSBBTElHTihBTElHTihtRGVjb2RlZEhlaWdodCwgMzIpICogYnVmLT5zdHJpZGUsIDQwOTYpOworICAgICAgICB1aW50OF90ICpkc3RVViA9ICh1aW50OF90ICopZHN0ICsgZHN0VVZPZmZzZXQ7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAobURlY29kZWRIZWlnaHQgKyAxKSAvIDI7ICsraSkgeworICAgICAgICAgICAgbWVtY3B5KGRzdFVWLCBzcmNVViwgKG1EZWNvZGVkV2lkdGggKyAxKSAmIH4xKTsKKyAgICAgICAgICAgIHNyY1VWICs9IHNyY1VWU3RyaWRlOworICAgICAgICAgICAgZHN0VVYgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1ZVVZNb2RlID09IFlVVjQyMFRvWVVWNDIwc3ApIHsKKyAgICAgICAgLy8gSW5wdXQgaXMgWVVWNDIwIHBsYW5hciwgb3V0cHV0IGlzIFlVVjQyMHNwLCBhZGhlcmUgdG8gcHJvcGVyCisgICAgICAgIC8vIGFsaWdubWVudCByZXF1aXJlbWVudHMuCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlID0gbURlY29kZWRXaWR0aDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKyAgICAgICAgdWludDhfdCAqZHN0WSA9ICh1aW50OF90ICopZHN0OworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EZWNvZGVkSGVpZ2h0OyArK2kpIHsKKyAgICAgICAgICAgIG1lbWNweShkc3RZLCBzcmNZLCBtRGVjb2RlZFdpZHRoKTsKKyAgICAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgICAgIGRzdFkgKz0gYnVmLT5zdHJpZGU7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3Qgc3JjVVZTdHJpZGUgPSAobURlY29kZWRXaWR0aCArIDEpIC8gMjsKKyAgICAgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gQUxJR04obURlY29kZWRXaWR0aCAvIDIsIDMyKSAqIDI7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopZGF0YQorICAgICAgICAgICAgKyBtRGVjb2RlZEhlaWdodCAqIG1EZWNvZGVkV2lkdGg7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjViA9CisgICAgICAgICAgICBzcmNVICsgKChtRGVjb2RlZFdpZHRoICsgMSkgLyAyKSAqICgobURlY29kZWRIZWlnaHQgKyAxKSAvIDIpOworCisgICAgICAgIHNpemVfdCBkc3RVVk9mZnNldCA9IEFMSUdOKEFMSUdOKG1EZWNvZGVkSGVpZ2h0LCAzMikgKiBidWYtPnN0cmlkZSwgNDA5Nik7CisgICAgICAgIHVpbnQ4X3QgKmRzdFVWID0gKHVpbnQ4X3QgKilkc3QgKyBkc3RVVk9mZnNldDsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IChtRGVjb2RlZEhlaWdodCArIDEpIC8gMjsgKytpKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IChtRGVjb2RlZFdpZHRoICsgMSkgLyAyOyArK2opIHsKKyAgICAgICAgICAgICAgICBkc3RVVlsyICogaiArIDFdID0gc3JjVVtqXTsKKyAgICAgICAgICAgICAgICBkc3RVVlsyICogal0gPSBzcmNWW2pdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3JjVSArPSBzcmNVVlN0cmlkZTsKKyAgICAgICAgICAgIHNyY1YgKz0gc3JjVVZTdHJpZGU7CisgICAgICAgICAgICBkc3RVViArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShkc3QsIGRhdGEsIHNpemUpOworICAgIH0KKworICAgIENIRUNLX0VRKDAsIG1hcHBlci51bmxvY2soYnVmLT5oYW5kbGUpKTsKKworICAgIGlmICgoZXJyID0gbVN1cmZhY2UtPnF1ZXVlQnVmZmVyKG1TdXJmYWNlLmdldCgpLCBidWYpKSAhPSAwKSB7CisgICAgICAgIExPR1coIlN1cmZhY2U6OnF1ZXVlQnVmZmVyIHJldHVybmVkIGVycm9yICVkIiwgZXJyKTsKKyAgICB9CisgICAgYnVmID0gTlVMTDsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCmluZGV4IGVkZDg2NDguLjE3NzcxYzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcApAQCAtOTAsNyArOTAsNyBAQAogICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwpOwogICAgICAgICBvdXQtPmFwcGVuZCh1cmwpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGNoYXIgKnNsYXNoUG9zID0gc3RycmNocihiYXNlVVJMLCAnLycpOworICAgICAgICBjb25zdCBjaGFyICpzbGFzaFBvcyA9IHN0cnJjaHIoYmFzZVVSTCwgJy8nKTsKIAogICAgICAgICBpZiAoc2xhc2hQb3MgPiAmYmFzZVVSTFs2XSkgewogICAgICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMLCBzbGFzaFBvcyAtIGJhc2VVUkwpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaAppbmRleCA2MDBmYWNhLi5kYjk4MjUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaApAQCAtNzYsNiArNzYsNyBAQAogICAgIGJvb2wgaXNQbGF5aW5nKCkgY29uc3Q7CiAKICAgICB2b2lkIHNldElTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiAmaXN1cmZhY2UpOworICAgIHZvaWQgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CiAgICAgdm9pZCBzZXRBdWRpb1NpbmsoY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZhdWRpb1NpbmspOwogICAgIHN0YXR1c190IHNldExvb3BpbmcoYm9vbCBzaG91bGRMb29wKTsKIApAQCAtMTIxLDYgKzEyMiw3IEBACiAgICAgd3A8TWVkaWFQbGF5ZXJCYXNlPiBtTGlzdGVuZXI7CiAKICAgICBzcDxJU3VyZmFjZT4gbUlTdXJmYWNlOworICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOwogICAgIHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwogCiAgICAgU3lzdGVtVGltZVNvdXJjZSBtU3lzdGVtVGltZVNvdXJjZTsKQEAgLTIyMyw2ICsyMjUsNyBAQAogICAgIHN0YXR1c190IHNlZWtUb19sKGludDY0X3QgdGltZVVzKTsKICAgICBzdGF0dXNfdCBwYXVzZV9sKCk7CiAgICAgdm9pZCBpbml0UmVuZGVyZXJfbCgpOworICAgIHZvaWQgbm90aWZ5VmlkZW9TaXplX2woKTsKICAgICB2b2lkIHNlZWtBdWRpb0lmTmVjZXNzYXJ5X2woKTsKIAogICAgIHZvaWQgY2FuY2VsUGxheWVyRXZlbnRzKGJvb2wga2VlcEJ1ZmZlcmluZ0dvaW5nID0gZmFsc2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmgKaW5kZXggYzk5ZGE1OS4uODNiNzVhZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oCkBAIC01OSwxMCArNTksMTcgQEAKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX0lOREVYVFlQRSBpbmRleCwKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVHcmFwaGljQnVmZmVycygKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCB1c2VCdWZmZXIoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKICAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgdXNlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LAorICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsIGJ1ZmZlcl9pZCAqYnVmZmVyKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXIoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgc2l6ZV90IHNpemUsCiAgICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgdm9pZCAqKmJ1ZmZlcl9kYXRhKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oCmluZGV4IGI1YjMxYWMuLjhjN2M1NjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaApAQCAtNDksMTAgKzQ5LDE2IEBACiAgICAgc3RhdHVzX3QgZ2V0Q29uZmlnKE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpOwogICAgIHN0YXR1c190IHNldENvbmZpZyhPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKTsKIAorICAgIHN0YXR1c190IGVuYWJsZUdyYXBoaWNCdWZmZXJzKE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCBlbmFibGUpOworCiAgICAgc3RhdHVzX3QgdXNlQnVmZmVyKAogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCiAgICAgICAgICAgICBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyKTsKIAorICAgIHN0YXR1c190IHVzZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsCisgICAgICAgICAgICBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyKTsKKwogICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVyKAogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIHNpemVfdCBzaXplLCBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyLAogICAgICAgICAgICAgdm9pZCAqKmJ1ZmZlcl9kYXRhKTsKQEAgLTEyNSw0ICsxMzEsMyBAQAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBPTVhfTk9ERV9JTlNUQU5DRV9IXwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCmluZGV4IDllZWQwODkuLjhkNTgwNTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCkBAIC0yNCwxNCArMjQsMTQgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBJU3VyZmFjZTsKK2NsYXNzIFN1cmZhY2U7CiBjbGFzcyBNZW1vcnlIZWFwQmFzZTsKIAogY2xhc3MgU29mdHdhcmVSZW5kZXJlciA6IHB1YmxpYyBWaWRlb1JlbmRlcmVyIHsKIHB1YmxpYzoKICAgICBTb2Z0d2FyZVJlbmRlcmVyKAogICAgICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQsCi0gICAgICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UsCisgICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwKICAgICAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0LAogICAgICAgICAgICAgc2l6ZV90IGRlY29kZWRXaWR0aCwgc2l6ZV90IGRlY29kZWRIZWlnaHQpOwogCkBAIC00MSwxNCArNDEsMTggQEAKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCB2b2lkICpwbGF0Zm9ybVByaXZhdGUpOwogCiBwcml2YXRlOgorICAgIGVudW0gWVVWTW9kZSB7CisgICAgICAgIE5vbmUsCisgICAgICAgIFlVVjQyMFRvWVVWNDIwc3AsCisgICAgICAgIFlVVjQyMHNwVG9ZVVY0MjBzcCwKKyAgICB9OworCiAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgbUNvbG9yRm9ybWF0OwotICAgIENvbG9yQ29udmVydGVyIG1Db252ZXJ0ZXI7Ci0gICAgc3A8SVN1cmZhY2U+IG1JU3VyZmFjZTsKKyAgICBDb2xvckNvbnZlcnRlciAqbUNvbnZlcnRlcjsKKyAgICBZVVZNb2RlIG1ZVVZNb2RlOworICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOwogICAgIHNpemVfdCBtRGlzcGxheVdpZHRoLCBtRGlzcGxheUhlaWdodDsKICAgICBzaXplX3QgbURlY29kZWRXaWR0aCwgbURlY29kZWRIZWlnaHQ7Ci0gICAgc2l6ZV90IG1GcmFtZVNpemU7Ci0gICAgc3A8TWVtb3J5SGVhcEJhc2U+IG1NZW1vcnlIZWFwOwotICAgIGludCBtSW5kZXg7CiAKICAgICBTb2Z0d2FyZVJlbmRlcmVyKGNvbnN0IFNvZnR3YXJlUmVuZGVyZXIgJik7CiAgICAgU29mdHdhcmVSZW5kZXJlciAmb3BlcmF0b3I9KGNvbnN0IFNvZnR3YXJlUmVuZGVyZXIgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwCmluZGV4IGM5MjdkYTEuLmQ4OWY1NGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwCkBAIC0yODksNiArMjg5LDExIEBACiAgICAgICAgICAgICBpbmRleCwgcGFyYW1zLCBzaXplKTsKIH0KIAorc3RhdHVzX3QgT01YOjplbmFibGVHcmFwaGljQnVmZmVycygKKyAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSkgeworICAgIHJldHVybiBmaW5kSW5zdGFuY2Uobm9kZSktPmVuYWJsZUdyYXBoaWNCdWZmZXJzKHBvcnRfaW5kZXgsIGVuYWJsZSk7Cit9CisKIHN0YXR1c190IE9NWDo6dXNlQnVmZmVyKAogICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIpIHsKQEAgLTI5Niw2ICszMDEsMTMgQEAKICAgICAgICAgICAgIHBvcnRfaW5kZXgsIHBhcmFtcywgYnVmZmVyKTsKIH0KIAorc3RhdHVzX3QgT01YOjp1c2VHcmFwaGljQnVmZmVyKAorICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwKKyAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsIGJ1ZmZlcl9pZCAqYnVmZmVyKSB7CisgICAgcmV0dXJuIGZpbmRJbnN0YW5jZShub2RlKS0+dXNlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIHBvcnRfaW5kZXgsIGdyYXBoaWNCdWZmZXIsIGJ1ZmZlcik7Cit9CisKIHN0YXR1c190IE9NWDo6YWxsb2NhdGVCdWZmZXIoCiAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBzaXplX3Qgc2l6ZSwKICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIHZvaWQgKipidWZmZXJfZGF0YSkgewpAQCAtNDk3LDEyICs1MDksMTcgQEAKICAgICB9CiAKICAgICBpZiAoIWltcGwpIHsKKyNpZiAwCiAgICAgICAgIExPR1coIlVzaW5nIHNvZnR3YXJlIHJlbmRlcmVyLiIpOwogICAgICAgICBpbXBsID0gbmV3IFNvZnR3YXJlUmVuZGVyZXIoCiAgICAgICAgICAgICAgICAgY29sb3JGb3JtYXQsCiAgICAgICAgICAgICAgICAgc3VyZmFjZSwKICAgICAgICAgICAgICAgICBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQsCiAgICAgICAgICAgICAgICAgZW5jb2RlZFdpZHRoLCBlbmNvZGVkSGVpZ2h0KTsKKyNlbHNlCisgICAgICAgIENIRUNLKCEiU2hvdWxkIG5vdCBiZSBoZXJlLiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgogICAgIH0KIAogICAgIHJldHVybiBuZXcgT01YUmVuZGVyZXIoaW1wbCk7CkBAIC01MjcsNCArNTQ0LDMgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAppbmRleCA1ZGI1MTZlLi5iYTRkNzY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSGFyZHdhcmVBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KIApAQCAtNDAsNiArNDEsMTEgQEAKICAgICAgICAgICBtSXNCYWNrdXAoZmFsc2UpIHsKICAgICB9CiAKKyAgICBCdWZmZXJNZXRhKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZncmFwaGljQnVmZmVyKQorICAgICAgICA6IG1HcmFwaGljQnVmZmVyKGdyYXBoaWNCdWZmZXIpLAorICAgICAgICAgIG1Jc0JhY2t1cChmYWxzZSkgeworICAgIH0KKwogICAgIHZvaWQgQ29weUZyb21PTVgoY29uc3QgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlcikgewogICAgICAgICBpZiAoIW1Jc0JhY2t1cCkgewogICAgICAgICAgICAgcmV0dXJuOwpAQCAtNjEsNiArNjcsNyBAQAogICAgIH0KIAogcHJpdmF0ZToKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBtR3JhcGhpY0J1ZmZlcjsKICAgICBzcDxJTWVtb3J5PiBtTWVtOwogICAgIHNpemVfdCBtU2l6ZTsKICAgICBib29sIG1Jc0JhY2t1cDsKQEAgLTI0MCw2ICsyNDcsNDMgQEAKICAgICByZXR1cm4gU3RhdHVzRnJvbU9NWEVycm9yKGVycik7CiB9CiAKK3N0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6ZW5hYmxlR3JhcGhpY0J1ZmZlcnMoCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCBlbmFibGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgT01YX0lOREVYVFlQRSBpbmRleDsKKyAgICBPTVhfRVJST1JUWVBFIGVyciA9IE9NWF9HZXRFeHRlbnNpb25JbmRleCgKKyAgICAgICAgICAgIG1IYW5kbGUsCisgICAgICAgICAgICBjb25zdF9jYXN0PE9NWF9TVFJJTkc+KCJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnMiKSwKKyAgICAgICAgICAgICZpbmRleCk7CisKKyAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgTE9HRSgiT01YX0dldEV4dGVuc2lvbkluZGV4IGZhaWxlZCIpOworCisgICAgICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKKyAgICB9CisKKyAgICBPTVhfVkVSU0lPTlRZUEUgdmVyOworICAgIHZlci5zLm5WZXJzaW9uTWFqb3IgPSAxOworICAgIHZlci5zLm5WZXJzaW9uTWlub3IgPSAwOworICAgIHZlci5zLm5SZXZpc2lvbiA9IDA7CisgICAgdmVyLnMublN0ZXAgPSAwOworICAgIEVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzUGFyYW1zIHBhcmFtcyA9IHsKKyAgICAgICAgc2l6ZW9mKEVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzUGFyYW1zKSwgdmVyLCBwb3J0SW5kZXgsIGVuYWJsZSwKKyAgICB9OworCisgICAgZXJyID0gT01YX1NldFBhcmFtZXRlcihtSGFuZGxlLCBpbmRleCwgJnBhcmFtcyk7CisKKyAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgTE9HRSgiT01YX0VuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzIGZhaWxlZCB3aXRoIGVycm9yICVkICgweCUwOHgpIiwKKyAgICAgICAgICAgICAgICBlcnIsIGVycik7CisKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnVzZUJ1ZmZlcigKICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCiAgICAgICAgIE9NWDo6YnVmZmVyX2lkICpidWZmZXIpIHsKQEAgLTI3Myw2ICszMTcsNjAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6dXNlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBncmFwaGljQnVmZmVyLAorICAgICAgICBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIE9NWF9JTkRFWFRZUEUgaW5kZXg7CisgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfR2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgICAgICBtSGFuZGxlLAorICAgICAgICAgICAgY29uc3RfY2FzdDxPTVhfU1RSSU5HPigiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnVzZUFuZHJvaWROYXRpdmVCdWZmZXIiKSwKKyAgICAgICAgICAgICZpbmRleCk7CisKKyAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgTE9HRSgiT01YX0dldEV4dGVuc2lvbkluZGV4IGZhaWxlZCIpOworCisgICAgICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKKyAgICB9CisKKyAgICBCdWZmZXJNZXRhICpidWZmZXJNZXRhID0gbmV3IEJ1ZmZlck1ldGEoZ3JhcGhpY0J1ZmZlcik7CisKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyOworCisgICAgT01YX1ZFUlNJT05UWVBFIHZlcjsKKyAgICB2ZXIucy5uVmVyc2lvbk1ham9yID0gMTsKKyAgICB2ZXIucy5uVmVyc2lvbk1pbm9yID0gMDsKKyAgICB2ZXIucy5uUmV2aXNpb24gPSAwOworICAgIHZlci5zLm5TdGVwID0gMDsKKyAgICBVc2VBbmRyb2lkTmF0aXZlQnVmZmVyUGFyYW1zIHBhcmFtcyA9IHsKKyAgICAgICAgc2l6ZW9mKFVzZUFuZHJvaWROYXRpdmVCdWZmZXJQYXJhbXMpLCB2ZXIsIHBvcnRJbmRleCwgYnVmZmVyTWV0YSwKKyAgICAgICAgJmhlYWRlciwgZ3JhcGhpY0J1ZmZlciwKKyAgICB9OworCisgICAgZXJyID0gT01YX1NldFBhcmFtZXRlcihtSGFuZGxlLCBpbmRleCwgJnBhcmFtcyk7CisKKyAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgTE9HRSgiT01YX1VzZUFuZHJvaWROYXRpdmVCdWZmZXIgZmFpbGVkIHdpdGggZXJyb3IgJWQgKDB4JTA4eCkiLCBlcnIsCisgICAgICAgICAgICAgICAgZXJyKTsKKworICAgICAgICBkZWxldGUgYnVmZmVyTWV0YTsKKyAgICAgICAgYnVmZmVyTWV0YSA9IE5VTEw7CisKKyAgICAgICAgKmJ1ZmZlciA9IDA7CisKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgQ0hFQ0tfRVEoaGVhZGVyLT5wQXBwUHJpdmF0ZSwgYnVmZmVyTWV0YSk7CisKKyAgICAqYnVmZmVyID0gaGVhZGVyOworCisgICAgYWRkQWN0aXZlQnVmZmVyKHBvcnRJbmRleCwgKmJ1ZmZlcik7CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6YWxsb2NhdGVCdWZmZXIoCiAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBzaXplX3Qgc2l6ZSwgT01YOjpidWZmZXJfaWQgKmJ1ZmZlciwKICAgICAgICAgdm9pZCAqKmJ1ZmZlcl9kYXRhKSB7CkBAIC00OTgsNCArNTk2LDMgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCmluZGV4IDVlYzAzYjIuLmY5MjhjMDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgICAgICBwYXRoLT5zZXRUbyhzbGFzaFBvcyk7CiAgICAgfQogCi0gICAgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIoaG9zdC0+Y19zdHIoKSwgJzonKTsKKyAgICBjb25zdCBjaGFyICpjb2xvblBvcyA9IHN0cmNocihob3N0LT5jX3N0cigpLCAnOicpOwogCiAgICAgaWYgKGNvbG9uUG9zICE9IE5VTEwpIHsKICAgICAgICAgdW5zaWduZWQgbG9uZyB4OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKaW5kZXggMGRiMzU5NS4uNjEyY2FmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCkBAIC0xODcsNyArMTg3LDcgQEAKICAgICBBU3RyaW5nIGZvcm1hdDsKICAgICBnZXRGb3JtYXQoaW5kZXgsICZmb3JtYXQpOwogCi0gICAgY2hhciAqbGFzdFNwYWNlUG9zID0gc3RycmNocihmb3JtYXQuY19zdHIoKSwgJyAnKTsKKyAgICBjb25zdCBjaGFyICpsYXN0U3BhY2VQb3MgPSBzdHJyY2hyKGZvcm1hdC5jX3N0cigpLCAnICcpOwogICAgIENIRUNLKGxhc3RTcGFjZVBvcyAhPSBOVUxMKTsKIAogICAgIGNoYXIgKmVuZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCmluZGV4IGEzMWIyYjIuLjA5ZGMxNTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaApAQCAtODkwLDcgKzg5MCw3IEBACiAgICAgICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwpOwogICAgICAgICAgICAgb3V0LT5hcHBlbmQodXJsKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNoYXIgKnNsYXNoUG9zID0gc3RycmNocihiYXNlVVJMLCAnLycpOworICAgICAgICAgICAgY29uc3QgY2hhciAqc2xhc2hQb3MgPSBzdHJyY2hyKGJhc2VVUkwsICcvJyk7CiAKICAgICAgICAgICAgIGlmIChzbGFzaFBvcyA+ICZiYXNlVVJMWzZdKSB7CiAgICAgICAgICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMLCBzbGFzaFBvcyAtIGJhc2VVUkwpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzk0YWQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMyBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICBcCisgICAgICAgIFlVVkltYWdlLmNwcCAgICAgICAgICAgIFwKKyAgICAgICAgWVVWQ2FudmFzLmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICAgICAgIFwKKyAgICAgICAgbGliY3V0aWxzCisKK0xPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X3l1dgorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvWVVWQ2FudmFzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZDYW52YXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YWE3NzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvWVVWQ2FudmFzLmNwcApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIllVVkNhbnZhcyIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ZVVZDYW52YXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ZVVZJbWFnZS5oPgorI2luY2x1ZGUgPHVpL1JlY3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitZVVZDYW52YXM6OllVVkNhbnZhcyhZVVZJbWFnZSAmeXV2SW1hZ2UpCisgICAgOiBtWVVWSW1hZ2UoeXV2SW1hZ2UpIHsKK30KKworWVVWQ2FudmFzOjp+WVVWQ2FudmFzKCkgeworfQorCit2b2lkIFlVVkNhbnZhczo6RmlsbFlVVih1aW50OF90IHlWYWx1ZSwgdWludDhfdCB1VmFsdWUsIHVpbnQ4X3QgdlZhbHVlKSB7CisgICAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgbVlVVkltYWdlLmhlaWdodCgpOyArK3kpIHsKKyAgICAgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgbVlVVkltYWdlLndpZHRoKCk7ICsreCkgeworICAgICAgICAgICAgbVlVVkltYWdlLnNldFBpeGVsVmFsdWUoeCwgeSwgeVZhbHVlLCB1VmFsdWUsIHZWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgWVVWQ2FudmFzOjpGaWxsWVVWUmVjdGFuZ2xlKGNvbnN0IFJlY3QmIHJlY3QsCisgICAgICAgIHVpbnQ4X3QgeVZhbHVlLCB1aW50OF90IHVWYWx1ZSwgdWludDhfdCB2VmFsdWUpIHsKKyAgICBmb3IgKGludDMyX3QgeSA9IHJlY3QudG9wOyB5IDwgcmVjdC5ib3R0b207ICsreSkgeworICAgICAgICBmb3IgKGludDMyX3QgeCA9IHJlY3QubGVmdDsgeCA8IHJlY3QucmlnaHQ7ICsreCkgeworICAgICAgICAgICAgbVlVVkltYWdlLnNldFBpeGVsVmFsdWUoeCwgeSwgeVZhbHVlLCB1VmFsdWUsIHZWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgWVVWQ2FudmFzOjpDb3B5SW1hZ2VSZWN0KAorICAgICAgICBjb25zdCBSZWN0JiBzcmNSZWN0LAorICAgICAgICBpbnQzMl90IGRlc3RTdGFydFgsIGludDMyX3QgZGVzdFN0YXJ0WSwKKyAgICAgICAgY29uc3QgWVVWSW1hZ2UgJnNyY0ltYWdlKSB7CisKKyAgICAvLyBUcnkgZmFzdCBjb3B5IGZpcnN0CisgICAgaWYgKFlVVkltYWdlOjpmYXN0Q29weVJlY3RhbmdsZSgKKyAgICAgICAgICAgICAgICBzcmNSZWN0LAorICAgICAgICAgICAgICAgIGRlc3RTdGFydFgsIGRlc3RTdGFydFksCisgICAgICAgICAgICAgICAgc3JjSW1hZ2UsIG1ZVVZJbWFnZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3Qgc3JjU3RhcnRYID0gc3JjUmVjdC5sZWZ0OworICAgIGludDMyX3Qgc3JjU3RhcnRZID0gc3JjUmVjdC50b3A7CisgICAgZm9yIChpbnQzMl90IG9mZnNldFkgPSAwOyBvZmZzZXRZIDwgc3JjUmVjdC5oZWlnaHQoKTsgKytvZmZzZXRZKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBvZmZzZXRYID0gMDsgb2Zmc2V0WCA8IHNyY1JlY3Qud2lkdGgoKTsgKytvZmZzZXRYKSB7CisgICAgICAgICAgICBpbnQzMl90IHNyY1ggPSBzcmNTdGFydFggKyBvZmZzZXRYOworICAgICAgICAgICAgaW50MzJfdCBzcmNZID0gc3JjU3RhcnRZICsgb2Zmc2V0WTsKKworICAgICAgICAgICAgaW50MzJfdCBkZXN0WCA9IGRlc3RTdGFydFggKyBvZmZzZXRYOworICAgICAgICAgICAgaW50MzJfdCBkZXN0WSA9IGRlc3RTdGFydFkgKyBvZmZzZXRZOworCisgICAgICAgICAgICB1aW50OF90IHlWYWx1ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgdVZhbHVlOworICAgICAgICAgICAgdWludDhfdCB2VmFsdWU7CisKKyAgICAgICAgICAgIHNyY0ltYWdlLmdldFBpeGVsVmFsdWUoc3JjWCwgc3JjWSwgJnlWYWx1ZSwgJnVWYWx1ZSwgJnZWYWx1ZSk7CisgICAgICAgICAgICBtWVVWSW1hZ2Uuc2V0UGl4ZWxWYWx1ZShkZXN0WCwgZGVzdFksIHlWYWx1ZSwgdVZhbHVlLCB2VmFsdWUpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFlVVkNhbnZhczo6ZG93bnNhbXBsZSgKKyAgICAgICAgaW50MzJfdCBzcmNPZmZzZXRYLCBpbnQzMl90IHNyY09mZnNldFksCisgICAgICAgIGludDMyX3Qgc2tpcFgsIGludDMyX3Qgc2tpcFksCisgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSkgeworICAgIC8vIFRPRE86IEFkZCBhIGxvdyBwYXNzIGZpbHRlciBmb3IgZG93bnNhbXBsaW5nLgorCisgICAgLy8gQ2hlY2sgdGhhdCBzcmNJbWFnZSBpcyBiaWcgZW5vdWdoIHRvIGZpbGwgbVlVVkltYWdlLgorICAgIENIRUNLKChzcmNPZmZzZXRYICsgKG1ZVVZJbWFnZS53aWR0aCgpIC0gMSkgKiBza2lwWCkgPCBzcmNJbWFnZS53aWR0aCgpKTsKKyAgICBDSEVDSygoc3JjT2Zmc2V0WSArIChtWVVWSW1hZ2UuaGVpZ2h0KCkgLSAxKSAqIHNraXBZKSA8IHNyY0ltYWdlLmhlaWdodCgpKTsKKworICAgIHVpbnQ4X3QgeVZhbHVlOworICAgIHVpbnQ4X3QgdVZhbHVlOworICAgIHVpbnQ4X3QgdlZhbHVlOworCisgICAgaW50MzJfdCBzcmNZID0gc3JjT2Zmc2V0WTsKKyAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBtWVVWSW1hZ2UuaGVpZ2h0KCk7ICsreSkgeworICAgICAgICBpbnQzMl90IHNyY1ggPSBzcmNPZmZzZXRYOworICAgICAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBtWVVWSW1hZ2Uud2lkdGgoKTsgKyt4KSB7CisgICAgICAgICAgICBzcmNJbWFnZS5nZXRQaXhlbFZhbHVlKHNyY1gsIHNyY1ksICZ5VmFsdWUsICZ1VmFsdWUsICZ2VmFsdWUpOworICAgICAgICAgICAgbVlVVkltYWdlLnNldFBpeGVsVmFsdWUoeCwgeSwgeVZhbHVlLCB1VmFsdWUsIHZWYWx1ZSk7CisKKyAgICAgICAgICAgIHNyY1ggKz0gc2tpcFg7CisgICAgICAgIH0KKyAgICAgICAgc3JjWSArPSBza2lwWTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvWVVWSW1hZ2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L1lVVkltYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzEyMDYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L1lVVkltYWdlLmNwcApAQCAtMCwwICsxLDQxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIllVVkltYWdlIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvWVVWSW1hZ2UuaD4KKyNpbmNsdWRlIDx1aS9SZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1lVVkltYWdlOjpZVVZJbWFnZShZVVZGb3JtYXQgeXV2Rm9ybWF0LCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgIG1ZVVZGb3JtYXQgPSB5dXZGb3JtYXQ7CisgICAgbVdpZHRoID0gd2lkdGg7CisgICAgbUhlaWdodCA9IGhlaWdodDsKKworICAgIHNpemVfdCBudW1iZXJPZkJ5dGVzID0gYnVmZmVyU2l6ZSh5dXZGb3JtYXQsIHdpZHRoLCBoZWlnaHQpOworICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IG5ldyB1aW50OF90W251bWJlck9mQnl0ZXNdOworICAgIG1CdWZmZXIgPSBidWZmZXI7CisgICAgbU93bkJ1ZmZlciA9IHRydWU7CisKKyAgICBpbml0aWFsaXplWVVWUG9pbnRlcnMoKTsKK30KKworWVVWSW1hZ2U6OllVVkltYWdlKFlVVkZvcm1hdCB5dXZGb3JtYXQsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCB1aW50OF90ICpidWZmZXIpIHsKKyAgICBtWVVWRm9ybWF0ID0geXV2Rm9ybWF0OworICAgIG1XaWR0aCA9IHdpZHRoOworICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisgICAgbUJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICBtT3duQnVmZmVyID0gZmFsc2U7CisKKyAgICBpbml0aWFsaXplWVVWUG9pbnRlcnMoKTsKK30KKworLy9zdGF0aWMKK3NpemVfdCBZVVZJbWFnZTo6YnVmZmVyU2l6ZShZVVZGb3JtYXQgeXV2Rm9ybWF0LCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgIGludDMyX3QgbnVtYmVyT2ZQaXhlbHMgPSB3aWR0aCpoZWlnaHQ7CisgICAgc2l6ZV90IG51bWJlck9mQnl0ZXMgPSAwOworICAgIGlmICh5dXZGb3JtYXQgPT0gWVVWNDIwUGxhbmFyIHx8IHl1dkZvcm1hdCA9PSBZVVY0MjBTZW1pUGxhbmFyKSB7CisgICAgICAgIC8vIFkgdGFrZXMgbnVtYmVyT2ZQaXhlbHMgYnl0ZXMgYW5kIFUvViB0YWtlIG51bWJlck9mUGl4ZWxzLzQgYnl0ZXMgZWFjaC4KKyAgICAgICAgbnVtYmVyT2ZCeXRlcyA9IChzaXplX3QpKG51bWJlck9mUGl4ZWxzICsgKG51bWJlck9mUGl4ZWxzID4+IDEpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJGb3JtYXQgbm90IHN1cHBvcnRlZCIpOworICAgIH0KKyAgICByZXR1cm4gbnVtYmVyT2ZCeXRlczsKK30KKworYm9vbCBZVVZJbWFnZTo6aW5pdGlhbGl6ZVlVVlBvaW50ZXJzKCkgeworICAgIGludDMyX3QgbnVtYmVyT2ZQaXhlbHMgPSBtV2lkdGggKiBtSGVpZ2h0OworCisgICAgaWYgKG1ZVVZGb3JtYXQgPT0gWVVWNDIwUGxhbmFyKSB7CisgICAgICAgIG1ZZGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlcjsKKyAgICAgICAgbVVkYXRhID0gbVlkYXRhICsgbnVtYmVyT2ZQaXhlbHM7CisgICAgICAgIG1WZGF0YSA9IG1VZGF0YSArIChudW1iZXJPZlBpeGVscyA+PiAyKTsKKyAgICB9IGVsc2UgaWYgKG1ZVVZGb3JtYXQgPT0gWVVWNDIwU2VtaVBsYW5hcikgeworICAgICAgICAvLyBVIGFuZCBWIGNoYW5uZWxzIGFyZSBpbnRlcmxlYXZlZCBhcyBWVVZVVlUuCisgICAgICAgIC8vIFNvIFYgZGF0YSBzdGFydHMgYXQgdGhlIGVuZCBvZiBZIGNoYW5uZWwgYW5kCisgICAgICAgIC8vIFUgZGF0YSBzdGFydHMgcmlnaHQgYWZ0ZXIgVidzIHN0YXJ0LgorICAgICAgICBtWWRhdGEgPSAodWludDhfdCAqKW1CdWZmZXI7CisgICAgICAgIG1WZGF0YSA9IG1ZZGF0YSArIG51bWJlck9mUGl4ZWxzOworICAgICAgICBtVWRhdGEgPSBtVmRhdGEgKyAxOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIkZvcm1hdCBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK1lVVkltYWdlOjp+WVVWSW1hZ2UoKSB7CisgICAgaWYgKG1Pd25CdWZmZXIpIGRlbGV0ZVtdIG1CdWZmZXI7Cit9CisKK2Jvb2wgWVVWSW1hZ2U6OmdldE9mZnNldHMoaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgIGludDMyX3QgKnlPZmZzZXQsIGludDMyX3QgKnVPZmZzZXQsIGludDMyX3QgKnZPZmZzZXQpIGNvbnN0IHsKKyAgICAqeU9mZnNldCA9IHkqbVdpZHRoICsgeDsKKworICAgIGludDMyX3QgdXZPZmZzZXQgPSAoeSA+PiAxKSAqIChtV2lkdGggPj4gMSkgKyAoeCA+PiAxKTsKKyAgICBpZiAobVlVVkZvcm1hdCA9PSBZVVY0MjBQbGFuYXIpIHsKKyAgICAgICAgKnVPZmZzZXQgPSB1dk9mZnNldDsKKyAgICAgICAgKnZPZmZzZXQgPSB1dk9mZnNldDsKKyAgICB9IGVsc2UgaWYgKG1ZVVZGb3JtYXQgPT0gWVVWNDIwU2VtaVBsYW5hcikgeworICAgICAgICAvLyBTaW5jZSBVIGFuZCBWIGNoYW5uZWxzIGFyZSBpbnRlcmxlYXZlZCwgb2Zmc2V0cyBuZWVkCisgICAgICAgIC8vIHRvIGJlIGRvdWJsZWQuCisgICAgICAgICp1T2Zmc2V0ID0gMip1dk9mZnNldDsKKyAgICAgICAgKnZPZmZzZXQgPSAyKnV2T2Zmc2V0OworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIkZvcm1hdCBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBZVVZJbWFnZTo6Z2V0T2Zmc2V0SW5jcmVtZW50c1BlckRhdGFSb3coCisgICAgICAgIGludDMyX3QgKnlEYXRhT2Zmc2V0SW5jcmVtZW50LAorICAgICAgICBpbnQzMl90ICp1RGF0YU9mZnNldEluY3JlbWVudCwKKyAgICAgICAgaW50MzJfdCAqdkRhdGFPZmZzZXRJbmNyZW1lbnQpIGNvbnN0IHsKKyAgICAqeURhdGFPZmZzZXRJbmNyZW1lbnQgPSBtV2lkdGg7CisKKyAgICBpbnQzMl90IHV2RGF0YU9mZnNldEluY3JlbWVudCA9IG1XaWR0aCA+PiAxOworCisgICAgaWYgKG1ZVVZGb3JtYXQgPT0gWVVWNDIwUGxhbmFyKSB7CisgICAgICAgICp1RGF0YU9mZnNldEluY3JlbWVudCA9IHV2RGF0YU9mZnNldEluY3JlbWVudDsKKyAgICAgICAgKnZEYXRhT2Zmc2V0SW5jcmVtZW50ID0gdXZEYXRhT2Zmc2V0SW5jcmVtZW50OworICAgIH0gZWxzZSBpZiAobVlVVkZvcm1hdCA9PSBZVVY0MjBTZW1pUGxhbmFyKSB7CisgICAgICAgIC8vIFNpbmNlIFUgYW5kIFYgY2hhbm5lbHMgYXJlIGludGVybGVhdmVkLCBvZmZzZXRzIG5lZWQKKyAgICAgICAgLy8gdG8gYmUgZG91YmxlZC4KKyAgICAgICAgKnVEYXRhT2Zmc2V0SW5jcmVtZW50ID0gMip1dkRhdGFPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgICp2RGF0YU9mZnNldEluY3JlbWVudCA9IDIqdXZEYXRhT2Zmc2V0SW5jcmVtZW50OworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIkZvcm1hdCBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordWludDhfdCogWVVWSW1hZ2U6OmdldFlBZGRyZXNzKGludDMyX3Qgb2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuIG1ZZGF0YSArIG9mZnNldDsKK30KKwordWludDhfdCogWVVWSW1hZ2U6OmdldFVBZGRyZXNzKGludDMyX3Qgb2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuIG1VZGF0YSArIG9mZnNldDsKK30KKwordWludDhfdCogWVVWSW1hZ2U6OmdldFZBZGRyZXNzKGludDMyX3Qgb2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuIG1WZGF0YSArIG9mZnNldDsKK30KKworYm9vbCBZVVZJbWFnZTo6Z2V0WVVWQWRkcmVzc2VzKGludDMyX3QgeCwgaW50MzJfdCB5LAorICAgICAgICB1aW50OF90ICoqeUFkZHIsIHVpbnQ4X3QgKip1QWRkciwgdWludDhfdCAqKnZBZGRyKSBjb25zdCB7CisgICAgaW50MzJfdCB5T2Zmc2V0OworICAgIGludDMyX3QgdU9mZnNldDsKKyAgICBpbnQzMl90IHZPZmZzZXQ7CisgICAgaWYgKCFnZXRPZmZzZXRzKHgsIHksICZ5T2Zmc2V0LCAmdU9mZnNldCwgJnZPZmZzZXQpKSByZXR1cm4gZmFsc2U7CisKKyAgICAqeUFkZHIgPSBnZXRZQWRkcmVzcyh5T2Zmc2V0KTsKKyAgICAqdUFkZHIgPSBnZXRVQWRkcmVzcyh1T2Zmc2V0KTsKKyAgICAqdkFkZHIgPSBnZXRWQWRkcmVzcyh2T2Zmc2V0KTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFlVVkltYWdlOjp2YWxpZFBpeGVsKGludDMyX3QgeCwgaW50MzJfdCB5KSBjb25zdCB7CisgICAgcmV0dXJuICh4ID49IDAgJiYgeCA8IG1XaWR0aCAmJgorICAgICAgICAgICAgeSA+PSAwICYmIHkgPCBtSGVpZ2h0KTsKK30KKworYm9vbCBZVVZJbWFnZTo6Z2V0UGl4ZWxWYWx1ZShpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgdWludDhfdCAqeVB0ciwgdWludDhfdCAqdVB0ciwgdWludDhfdCAqdlB0cikgY29uc3QgeworICAgIENIRUNLKHZhbGlkUGl4ZWwoeCwgeSkpOworCisgICAgdWludDhfdCAqeUFkZHI7CisgICAgdWludDhfdCAqdUFkZHI7CisgICAgdWludDhfdCAqdkFkZHI7CisgICAgaWYgKCFnZXRZVVZBZGRyZXNzZXMoeCwgeSwgJnlBZGRyLCAmdUFkZHIsICZ2QWRkcikpIHJldHVybiBmYWxzZTsKKworICAgICp5UHRyID0gKnlBZGRyOworICAgICp1UHRyID0gKnVBZGRyOworICAgICp2UHRyID0gKnZBZGRyOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgWVVWSW1hZ2U6OnNldFBpeGVsVmFsdWUoaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgIHVpbnQ4X3QgeVZhbHVlLCB1aW50OF90IHVWYWx1ZSwgdWludDhfdCB2VmFsdWUpIHsKKyAgICBDSEVDSyh2YWxpZFBpeGVsKHgsIHkpKTsKKworICAgIHVpbnQ4X3QgKnlBZGRyOworICAgIHVpbnQ4X3QgKnVBZGRyOworICAgIHVpbnQ4X3QgKnZBZGRyOworICAgIGlmICghZ2V0WVVWQWRkcmVzc2VzKHgsIHksICZ5QWRkciwgJnVBZGRyLCAmdkFkZHIpKSByZXR1cm4gZmFsc2U7CisKKyAgICAqeUFkZHIgPSB5VmFsdWU7CisgICAgKnVBZGRyID0gdVZhbHVlOworICAgICp2QWRkciA9IHZWYWx1ZTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFlVVkltYWdlOjpmYXN0Q29weVJlY3RhbmdsZTQyMFBsYW5hcigKKyAgICAgICAgY29uc3QgUmVjdCYgc3JjUmVjdCwKKyAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSwgWVVWSW1hZ2UgJmRlc3RJbWFnZSkgeworICAgIENIRUNLKHNyY0ltYWdlLm1ZVVZGb3JtYXQgPT0gWVVWNDIwUGxhbmFyKTsKKyAgICBDSEVDSyhkZXN0SW1hZ2UubVlVVkZvcm1hdCA9PSBZVVY0MjBQbGFuYXIpOworCisgICAgaW50MzJfdCBzcmNTdGFydFggPSBzcmNSZWN0LmxlZnQ7CisgICAgaW50MzJfdCBzcmNTdGFydFkgPSBzcmNSZWN0LnRvcDsKKyAgICBpbnQzMl90IHdpZHRoID0gc3JjUmVjdC53aWR0aCgpOworICAgIGludDMyX3QgaGVpZ2h0ID0gc3JjUmVjdC5oZWlnaHQoKTsKKworICAgIC8vIEdldCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHN0YXJ0IGFkZHJlc3NlcworICAgIHVpbnQ4X3QgKnlTcmNBZGRyQmFzZTsKKyAgICB1aW50OF90ICp1U3JjQWRkckJhc2U7CisgICAgdWludDhfdCAqdlNyY0FkZHJCYXNlOworICAgIHNyY0ltYWdlLmdldFlVVkFkZHJlc3NlcyhzcmNTdGFydFgsIHNyY1N0YXJ0WSwKKyAgICAgICAgICAgICZ5U3JjQWRkckJhc2UsICZ1U3JjQWRkckJhc2UsICZ2U3JjQWRkckJhc2UpOworCisgICAgdWludDhfdCAqeURlc3RBZGRyQmFzZTsKKyAgICB1aW50OF90ICp1RGVzdEFkZHJCYXNlOworICAgIHVpbnQ4X3QgKnZEZXN0QWRkckJhc2U7CisgICAgZGVzdEltYWdlLmdldFlVVkFkZHJlc3NlcyhkZXN0U3RhcnRYLCBkZXN0U3RhcnRZLAorICAgICAgICAgICAgJnlEZXN0QWRkckJhc2UsICZ1RGVzdEFkZHJCYXNlLCAmdkRlc3RBZGRyQmFzZSk7CisKKyAgICAvLyBHZXQgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBvZmZzZXQgaW5jcmVtZW50cyBpbmN1cnJlZCBpbiBnb2luZworICAgIC8vIGZyb20gb25lIGRhdGEgcm93IHRvIG5leHQuCisgICAgaW50MzJfdCB5U3JjT2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdVNyY09mZnNldEluY3JlbWVudDsKKyAgICBpbnQzMl90IHZTcmNPZmZzZXRJbmNyZW1lbnQ7CisgICAgc3JjSW1hZ2UuZ2V0T2Zmc2V0SW5jcmVtZW50c1BlckRhdGFSb3coCisgICAgICAgICAgICAmeVNyY09mZnNldEluY3JlbWVudCwgJnVTcmNPZmZzZXRJbmNyZW1lbnQsICZ2U3JjT2Zmc2V0SW5jcmVtZW50KTsKKworICAgIGludDMyX3QgeURlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgaW50MzJfdCB1RGVzdE9mZnNldEluY3JlbWVudDsKKyAgICBpbnQzMl90IHZEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgIGRlc3RJbWFnZS5nZXRPZmZzZXRJbmNyZW1lbnRzUGVyRGF0YVJvdygKKyAgICAgICAgICAgICZ5RGVzdE9mZnNldEluY3JlbWVudCwgJnVEZXN0T2Zmc2V0SW5jcmVtZW50LCAmdkRlc3RPZmZzZXRJbmNyZW1lbnQpOworCisgICAgLy8gQ29weSBZCisgICAgeworICAgICAgICBzaXplX3QgbnVtYmVyT2ZZQnl0ZXNQZXJSb3cgPSAoc2l6ZV90KSB3aWR0aDsKKyAgICAgICAgdWludDhfdCAqeVNyY0FkZHIgPSB5U3JjQWRkckJhc2U7CisgICAgICAgIHVpbnQ4X3QgKnlEZXN0QWRkciA9IHlEZXN0QWRkckJhc2U7CisgICAgICAgIGZvciAoaW50MzJfdCBvZmZzZXRZID0gMDsgb2Zmc2V0WSA8IGhlaWdodDsgKytvZmZzZXRZKSB7CisgICAgICAgICAgICBtZW1jcHkoeURlc3RBZGRyLCB5U3JjQWRkciwgbnVtYmVyT2ZZQnl0ZXNQZXJSb3cpOworCisgICAgICAgICAgICB5U3JjQWRkciArPSB5U3JjT2Zmc2V0SW5jcmVtZW50OworICAgICAgICAgICAgeURlc3RBZGRyICs9IHlEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ29weSBVCisgICAgeworICAgICAgICBzaXplX3QgbnVtYmVyT2ZVQnl0ZXNQZXJSb3cgPSAoc2l6ZV90KSAod2lkdGggPj4gMSk7CisgICAgICAgIHVpbnQ4X3QgKnVTcmNBZGRyID0gdVNyY0FkZHJCYXNlOworICAgICAgICB1aW50OF90ICp1RGVzdEFkZHIgPSB1RGVzdEFkZHJCYXNlOworICAgICAgICAvLyBFdmVyeSBvdGhlciByb3cgaGFzIGFuIGVudHJ5IGZvciBVL1YgY2hhbm5lbCB2YWx1ZXMuIEhlbmNlIG9ubHkKKyAgICAgICAgLy8gZ28gaGFsZiB0aGUgaGVpZ2h0LgorICAgICAgICBmb3IgKGludDMyX3Qgb2Zmc2V0WSA9IDA7IG9mZnNldFkgPCAoaGVpZ2h0ID4+IDEpOyArK29mZnNldFkpIHsKKyAgICAgICAgICAgIG1lbWNweSh1RGVzdEFkZHIsIHVTcmNBZGRyLCBudW1iZXJPZlVCeXRlc1BlclJvdyk7CisKKyAgICAgICAgICAgIHVTcmNBZGRyICs9IHVTcmNPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgICAgICB1RGVzdEFkZHIgKz0gdURlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb3B5IFYKKyAgICB7CisgICAgICAgIHNpemVfdCBudW1iZXJPZlZCeXRlc1BlclJvdyA9IChzaXplX3QpICh3aWR0aCA+PiAxKTsKKyAgICAgICAgdWludDhfdCAqdlNyY0FkZHIgPSB2U3JjQWRkckJhc2U7CisgICAgICAgIHVpbnQ4X3QgKnZEZXN0QWRkciA9IHZEZXN0QWRkckJhc2U7CisgICAgICAgIC8vIEV2ZXJ5IG90aGVyIHBpeGVsIHJvdyBoYXMgYSBVL1YgZGF0YSByb3cuIEhlbmNlIG9ubHkgZ28gaGFsZiB0aGUgaGVpZ2h0LgorICAgICAgICBmb3IgKGludDMyX3Qgb2Zmc2V0WSA9IDA7IG9mZnNldFkgPCAoaGVpZ2h0ID4+IDEpOyArK29mZnNldFkpIHsKKyAgICAgICAgICAgIG1lbWNweSh2RGVzdEFkZHIsIHZTcmNBZGRyLCBudW1iZXJPZlZCeXRlc1BlclJvdyk7CisKKyAgICAgICAgICAgIHZTcmNBZGRyICs9IHZTcmNPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgICAgICB2RGVzdEFkZHIgKz0gdkRlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgWVVWSW1hZ2U6OmZhc3RDb3B5UmVjdGFuZ2xlNDIwU2VtaVBsYW5hcigKKyAgICAgICAgY29uc3QgUmVjdCYgc3JjUmVjdCwKKyAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSwgWVVWSW1hZ2UgJmRlc3RJbWFnZSkgeworICAgIENIRUNLKHNyY0ltYWdlLm1ZVVZGb3JtYXQgPT0gWVVWNDIwU2VtaVBsYW5hcik7CisgICAgQ0hFQ0soZGVzdEltYWdlLm1ZVVZGb3JtYXQgPT0gWVVWNDIwU2VtaVBsYW5hcik7CisKKyAgICBpbnQzMl90IHNyY1N0YXJ0WCA9IHNyY1JlY3QubGVmdDsKKyAgICBpbnQzMl90IHNyY1N0YXJ0WSA9IHNyY1JlY3QudG9wOworICAgIGludDMyX3Qgd2lkdGggPSBzcmNSZWN0LndpZHRoKCk7CisgICAgaW50MzJfdCBoZWlnaHQgPSBzcmNSZWN0LmhlaWdodCgpOworCisgICAgLy8gR2V0IHNvdXJjZSBhbmQgZGVzdGluYXRpb24gc3RhcnQgYWRkcmVzc2VzCisgICAgdWludDhfdCAqeVNyY0FkZHJCYXNlOworICAgIHVpbnQ4X3QgKnVTcmNBZGRyQmFzZTsKKyAgICB1aW50OF90ICp2U3JjQWRkckJhc2U7CisgICAgc3JjSW1hZ2UuZ2V0WVVWQWRkcmVzc2VzKHNyY1N0YXJ0WCwgc3JjU3RhcnRZLAorICAgICAgICAgICAgJnlTcmNBZGRyQmFzZSwgJnVTcmNBZGRyQmFzZSwgJnZTcmNBZGRyQmFzZSk7CisKKyAgICB1aW50OF90ICp5RGVzdEFkZHJCYXNlOworICAgIHVpbnQ4X3QgKnVEZXN0QWRkckJhc2U7CisgICAgdWludDhfdCAqdkRlc3RBZGRyQmFzZTsKKyAgICBkZXN0SW1hZ2UuZ2V0WVVWQWRkcmVzc2VzKGRlc3RTdGFydFgsIGRlc3RTdGFydFksCisgICAgICAgICAgICAmeURlc3RBZGRyQmFzZSwgJnVEZXN0QWRkckJhc2UsICZ2RGVzdEFkZHJCYXNlKTsKKworICAgIC8vIEdldCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG9mZnNldCBpbmNyZW1lbnRzIGluY3VycmVkIGluIGdvaW5nCisgICAgLy8gZnJvbSBvbmUgZGF0YSByb3cgdG8gbmV4dC4KKyAgICBpbnQzMl90IHlTcmNPZmZzZXRJbmNyZW1lbnQ7CisgICAgaW50MzJfdCB1U3JjT2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdlNyY09mZnNldEluY3JlbWVudDsKKyAgICBzcmNJbWFnZS5nZXRPZmZzZXRJbmNyZW1lbnRzUGVyRGF0YVJvdygKKyAgICAgICAgICAgICZ5U3JjT2Zmc2V0SW5jcmVtZW50LCAmdVNyY09mZnNldEluY3JlbWVudCwgJnZTcmNPZmZzZXRJbmNyZW1lbnQpOworCisgICAgaW50MzJfdCB5RGVzdE9mZnNldEluY3JlbWVudDsKKyAgICBpbnQzMl90IHVEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdkRlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgZGVzdEltYWdlLmdldE9mZnNldEluY3JlbWVudHNQZXJEYXRhUm93KAorICAgICAgICAgICAgJnlEZXN0T2Zmc2V0SW5jcmVtZW50LCAmdURlc3RPZmZzZXRJbmNyZW1lbnQsICZ2RGVzdE9mZnNldEluY3JlbWVudCk7CisKKyAgICAvLyBDb3B5IFkKKyAgICB7CisgICAgICAgIHNpemVfdCBudW1iZXJPZllCeXRlc1BlclJvdyA9IChzaXplX3QpIHdpZHRoOworICAgICAgICB1aW50OF90ICp5U3JjQWRkciA9IHlTcmNBZGRyQmFzZTsKKyAgICAgICAgdWludDhfdCAqeURlc3RBZGRyID0geURlc3RBZGRyQmFzZTsKKyAgICAgICAgZm9yIChpbnQzMl90IG9mZnNldFkgPSAwOyBvZmZzZXRZIDwgaGVpZ2h0OyArK29mZnNldFkpIHsKKyAgICAgICAgICAgIG1lbWNweSh5RGVzdEFkZHIsIHlTcmNBZGRyLCBudW1iZXJPZllCeXRlc1BlclJvdyk7CisKKyAgICAgICAgICAgIHlTcmNBZGRyID0geVNyY0FkZHIgKyB5U3JjT2Zmc2V0SW5jcmVtZW50OworICAgICAgICAgICAgeURlc3RBZGRyID0geURlc3RBZGRyICsgeURlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb3B5IFVWCisgICAgeworICAgICAgICAvLyBVViBhcmUgaW50ZXJsZWF2ZWQuIFNvIG51bWJlciBvZiBVViBieXRlcyBwZXIgcm93IGlzIDIqKHdpZHRoLzIpLgorICAgICAgICBzaXplX3QgbnVtYmVyT2ZVVkJ5dGVzUGVyUm93ID0gKHNpemVfdCkgd2lkdGg7CisgICAgICAgIHVpbnQ4X3QgKnZTcmNBZGRyID0gdlNyY0FkZHJCYXNlOworICAgICAgICB1aW50OF90ICp2RGVzdEFkZHIgPSB2RGVzdEFkZHJCYXNlOworICAgICAgICAvLyBFdmVyeSBvdGhlciBwaXhlbCByb3cgaGFzIGEgVS9WIGRhdGEgcm93LiBIZW5jZSBvbmx5IGdvIGhhbGYgdGhlIGhlaWdodC4KKyAgICAgICAgZm9yIChpbnQzMl90IG9mZnNldFkgPSAwOyBvZmZzZXRZIDwgKGhlaWdodCA+PiAxKTsgKytvZmZzZXRZKSB7CisgICAgICAgICAgICBtZW1jcHkodkRlc3RBZGRyLCB2U3JjQWRkciwgbnVtYmVyT2ZVVkJ5dGVzUGVyUm93KTsKKworICAgICAgICAgICAgdlNyY0FkZHIgKz0gdlNyY09mZnNldEluY3JlbWVudDsKKyAgICAgICAgICAgIHZEZXN0QWRkciArPSB2RGVzdE9mZnNldEluY3JlbWVudDsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gc3RhdGljCitib29sIFlVVkltYWdlOjpmYXN0Q29weVJlY3RhbmdsZSgKKyAgICAgICAgY29uc3QgUmVjdCYgc3JjUmVjdCwKKyAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSwgWVVWSW1hZ2UgJmRlc3RJbWFnZSkgeworICAgIGlmIChzcmNJbWFnZS5tWVVWRm9ybWF0ID09IGRlc3RJbWFnZS5tWVVWRm9ybWF0KSB7CisgICAgICAgIGlmIChzcmNJbWFnZS5tWVVWRm9ybWF0ID09IFlVVjQyMFBsYW5hcikgeworICAgICAgICAgICAgZmFzdENvcHlSZWN0YW5nbGU0MjBQbGFuYXIoCisgICAgICAgICAgICAgICAgICAgIHNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgIGRlc3RTdGFydFgsIGRlc3RTdGFydFksCisgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLCBkZXN0SW1hZ2UpOworICAgICAgICB9IGVsc2UgaWYgKHNyY0ltYWdlLm1ZVVZGb3JtYXQgPT0gWVVWNDIwU2VtaVBsYW5hcikgeworICAgICAgICAgICAgZmFzdENvcHlSZWN0YW5nbGU0MjBTZW1pUGxhbmFyKAorICAgICAgICAgICAgICAgICAgICBzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICBkZXN0U3RhcnRYLCBkZXN0U3RhcnRZLAorICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwgZGVzdEltYWdlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit1aW50OF90IGNsYW1wKHVpbnQ4X3QgdiwgdWludDhfdCBtaW5WYWx1ZSwgdWludDhfdCBtYXhWYWx1ZSkgeworICAgIENIRUNLKG1heFZhbHVlID49IG1pblZhbHVlKTsKKworICAgIGlmICh2IDwgbWluVmFsdWUpIHJldHVybiBtaW5WYWx1ZTsKKyAgICBlbHNlIGlmICh2ID4gbWF4VmFsdWUpIHJldHVybiBtYXhWYWx1ZTsKKyAgICBlbHNlIHJldHVybiB2OworfQorCit2b2lkIFlVVkltYWdlOjp5dXYycmdiKHVpbnQ4X3QgeVZhbHVlLCB1aW50OF90IHVWYWx1ZSwgdWludDhfdCB2VmFsdWUsCisgICAgICAgIHVpbnQ4X3QgKnIsIHVpbnQ4X3QgKmcsIHVpbnQ4X3QgKmIpIGNvbnN0IHsKKyAgICAqciA9IHlWYWx1ZSArICgxLjM3MDcwNSAqICh2VmFsdWUtMTI4KSk7CisgICAgKmcgPSB5VmFsdWUgLSAoMC42OTgwMDEgKiAodlZhbHVlLTEyOCkpIC0gKDAuMzM3NjMzICogKHVWYWx1ZS0xMjgpKTsKKyAgICAqYiA9IHlWYWx1ZSArICgxLjczMjQ0NiAqICh1VmFsdWUtMTI4KSk7CisKKyAgICAqciA9IGNsYW1wKCpyLCAwLCAyNTUpOworICAgICpnID0gY2xhbXAoKmcsIDAsIDI1NSk7CisgICAgKmIgPSBjbGFtcCgqYiwgMCwgMjU1KTsKK30KKworYm9vbCBZVVZJbWFnZTo6d3JpdGVUb1BQTShjb25zdCBjaGFyICpmaWxlbmFtZSkgY29uc3QgeworICAgIEZJTEUgKmZwID0gZm9wZW4oZmlsZW5hbWUsICJ3Iik7CisgICAgaWYgKGZwID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmcHJpbnRmKGZwLCAiUDNcbiIpOworICAgIGZwcmludGYoZnAsICIlZCAlZFxuIiwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICBmcHJpbnRmKGZwLCAiMjU1XG4iKTsKKyAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBtSGVpZ2h0OyArK3kpIHsKKyAgICAgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgbVdpZHRoOyArK3gpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgeVZhbHVlOworICAgICAgICAgICAgdWludDhfdCB1VmFsdWU7CisgICAgICAgICAgICB1aW50OF90IHZWYWx1ZTsKKyAgICAgICAgICAgIGdldFBpeGVsVmFsdWUoeCwgeSwgJnlWYWx1ZSwgJnVWYWx1ZSwgJiB2VmFsdWUpOworCisgICAgICAgICAgICB1aW50OF90IHJWYWx1ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgZ1ZhbHVlOworICAgICAgICAgICAgdWludDhfdCBiVmFsdWU7CisgICAgICAgICAgICB5dXYycmdiKHlWYWx1ZSwgdVZhbHVlLCB2VmFsdWUsICZyVmFsdWUsICZnVmFsdWUsICZiVmFsdWUpOworCisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiJWQgJWQgJWRcbiIsIChpbnQzMl90KXJWYWx1ZSwgKGludDMyX3QpZ1ZhbHVlLCAoaW50MzJfdCliVmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIGZjbG9zZShmcCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvQW5kcm9pZC5tayBiL21lZGlhL210cC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MDJmNmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDc4IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwQ2xpZW50LmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBDdXJzb3IuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQuY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRGVidWcuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBEZXZpY2UuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cEV2ZW50UGFja2V0LmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRGV2aWNlSW5mby5jcHAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBPYmplY3RJbmZvLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFBhY2tldC5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwUHJvcGVydHkuY3BwICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBSZXF1ZXN0UGFja2V0LmNwcCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFJlc3BvbnNlUGFja2V0LmNwcCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwU2VydmVyLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSW5mby5jcHAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFN0cmluZ0J1ZmZlci5jcHAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZS5jcHAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBVdGlscy5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworTE9DQUxfTU9EVUxFOj0gbGlibXRwCisKK0xPQ0FMX0NGTEFHUyA6PSAtRE1UUF9ERVZJQ0UgLURNVFBfSE9TVAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKK2VuZGlmCisKK2lmZXEgKCQoSE9TVF9PUyksbGludXgpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cENsaWVudC5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwQ3Vyc29yLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0LmNwcCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERlYnVnLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRGV2aWNlLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBFdmVudFBhY2tldC5jcHAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERldmljZUluZm8uY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SW5mby5jcHAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBQYWNrZXQuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFByb3BlcnR5LmNwcCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwUmVxdWVzdFBhY2tldC5jcHAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBSZXNwb25zZVBhY2tldC5jcHAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJbmZvLmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyLmNwcCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlLmNwcCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFV0aWxzLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitMT0NBTF9NT0RVTEU6PSBsaWJtdHAKKworTE9DQUxfQ0ZMQUdTIDo9IC1ETVRQX0hPU1QKKworaW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwQ2xpZW50LmNwcCBiL21lZGlhL210cC9NdHBDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYjZhNDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwQ2xpZW50LmNwcApAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwQ2xpZW50IgorCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKKyNpbmNsdWRlICJNdHBDbGllbnQuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2UuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDx1c2Job3N0L3VzYmhvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMjApCisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC91c2JfY2g5Lmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgYm9vbCBpc010cERldmljZSh1aW50MTZfdCB2ZW5kb3IsIHVpbnQxNl90IHByb2R1Y3QpIHsKKyAgICAvLyBTYW5kaXNrIFNhbnNhIEZ1emUKKyAgICBpZiAodmVuZG9yID09IDB4MDc4MSAmJiBwcm9kdWN0ID09IDB4NzRjMikKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gU2Ftc3VuZyBZUC1aNQorICAgIGlmICh2ZW5kb3IgPT0gMHgwNGU4ICYmIHByb2R1Y3QgPT0gMHg1MDNjKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2NsYXNzIE10cENsaWVudFRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworcHJpdmF0ZToKKyAgICBNdHBDbGllbnQqICAgbUNsaWVudDsKKworcHVibGljOgorICAgIE10cENsaWVudFRocmVhZChNdHBDbGllbnQqIGNsaWVudCkKKyAgICAgICAgOiBtQ2xpZW50KGNsaWVudCkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKSB7CisgICAgICAgIHJldHVybiBtQ2xpZW50LT50aHJlYWRMb29wKCk7CisgICAgfQorfTsKKworCitNdHBDbGllbnQ6Ok10cENsaWVudCgpCisgICAgOiAgIG1UaHJlYWQoTlVMTCksCisgICAgICAgIG1Vc2JIb3N0Q29udGV4dChOVUxMKSwKKyAgICAgICAgbURvbmUoZmFsc2UpCit7Cit9CisKK010cENsaWVudDo6fk10cENsaWVudCgpIHsKKyAgICB1c2JfaG9zdF9jbGVhbnVwKG1Vc2JIb3N0Q29udGV4dCk7Cit9CisKK2Jvb2wgTXRwQ2xpZW50OjpzdGFydCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIGlmIChtVGhyZWFkKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIG1Vc2JIb3N0Q29udGV4dCA9IHVzYl9ob3N0X2luaXQoKTsKKyAgICBpZiAoIW1Vc2JIb3N0Q29udGV4dCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgbVRocmVhZCA9IG5ldyBNdHBDbGllbnRUaHJlYWQodGhpcyk7CisgICAgbVRocmVhZC0+cnVuKCJNdHBDbGllbnRUaHJlYWQiKTsKKyAgICAvLyB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIGRvIGluaXRpYWwgZGV2aWNlIGRpc2NvdmVyeSBiZWZvcmUgcmV0dXJuaW5nCisgICAgbVRocmVhZFN0YXJ0Q29uZGl0aW9uLndhaXQobU11dGV4KTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE10cENsaWVudDo6c3RvcCgpIHsKKyAgICBtRG9uZSA9IHRydWU7Cit9CisKK010cERldmljZSogTXRwQ2xpZW50OjpnZXREZXZpY2UoaW50IGlkKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRGV2aWNlTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICBNdHBEZXZpY2UqIGRldmljZSA9IG1EZXZpY2VMaXN0W2ldOworICAgICAgICBpZiAoZGV2aWNlLT5nZXRJRCgpID09IGlkKQorICAgICAgICAgICAgcmV0dXJuIGRldmljZTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2Jvb2wgTXRwQ2xpZW50Ojp1c2JEZXZpY2VBZGRlZChjb25zdCBjaGFyICpkZXZuYW1lKSB7CisgICAgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciogZGVzYzsKKyAgICBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaXRlciBpdGVyOworCisgICAgc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSA9IHVzYl9kZXZpY2Vfb3BlbihkZXZuYW1lKTsKKyAgICBpZiAoIWRldmljZSkgeworICAgICAgICBMT0dFKCJ1c2JfZGV2aWNlX29wZW4gZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIG1Eb25lOworICAgIH0KKworICAgIHVzYl9kZXNjcmlwdG9yX2l0ZXJfaW5pdChkZXZpY2UsICZpdGVyKTsKKworICAgIHdoaWxlICgoZGVzYyA9IHVzYl9kZXNjcmlwdG9yX2l0ZXJfbmV4dCgmaXRlcikpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9PSBVU0JfRFRfSU5URVJGQUNFKSB7CisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICppbnRlcmZhY2UgPSAoc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqKWRlc2M7CisKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2UtPmJJbnRlcmZhY2VDbGFzcyA9PSBVU0JfQ0xBU1NfU1RJTExfSU1BR0UgJiYKKyAgICAgICAgICAgICAgICBpbnRlcmZhY2UtPmJJbnRlcmZhY2VTdWJDbGFzcyA9PSAxICYmIC8vIFN0aWxsIEltYWdlIENhcHR1cmUKKyAgICAgICAgICAgICAgICBpbnRlcmZhY2UtPmJJbnRlcmZhY2VQcm90b2NvbCA9PSAxKSAgICAgLy8gUGljdHVyZSBUcmFuc2ZlciBQcm90b2NvbCAoUElNQSAxNTQ3MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMT0dEKCJGb3VuZCBjYW1lcmE6IFwiJXNcIiBcIiVzXCJcbiIsIHVzYl9kZXZpY2VfZ2V0X21hbnVmYWN0dXJlcl9uYW1lKGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICB1c2JfZGV2aWNlX2dldF9wcm9kdWN0X25hbWUoZGV2aWNlKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGludGVyZmFjZS0+YkludGVyZmFjZUNsYXNzID09IDB4RkYgJiYKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLT5iSW50ZXJmYWNlU3ViQ2xhc3MgPT0gMHhGRiAmJgorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UtPmJJbnRlcmZhY2VQcm90b2NvbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgY2hhciogaW50ZXJmYWNlTmFtZSA9IHVzYl9kZXZpY2VfZ2V0X3N0cmluZyhkZXZpY2UsIGludGVyZmFjZS0+aUludGVyZmFjZSk7CisgICAgICAgICAgICAgICAgaWYgKCFpbnRlcmZhY2VOYW1lIHx8IHN0cmNtcChpbnRlcmZhY2VOYW1lLCAiTVRQIikpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIC8vIExvb2tzIGxpa2UgYW4gYW5kcm9pZCBzdHlsZSBNVFAgZGV2aWNlCisgICAgICAgICAgICAgICAgTE9HRCgiRm91bmQgTVRQIGRldmljZTogXCIlc1wiIFwiJXNcIlxuIiwgdXNiX2RldmljZV9nZXRfbWFudWZhY3R1cmVyX25hbWUoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9kZXZpY2VfZ2V0X3Byb2R1Y3RfbmFtZShkZXZpY2UpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gbG9vayBmb3Igc3BlY2lhbCBjYXNlZCBkZXZpY2VzIGJhc2VkIG9uIHZlbmRvci9wcm9kdWN0IElECisgICAgICAgICAgICAgICAgLy8gd2UgYXJlIGRvaW5nIHRoaXMgbWFpbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgICAgICAgICAgICAgdWludDE2X3QgdmVuZG9yID0gdXNiX2RldmljZV9nZXRfdmVuZG9yX2lkKGRldmljZSk7CisgICAgICAgICAgICAgICAgdWludDE2X3QgcHJvZHVjdCA9IHVzYl9kZXZpY2VfZ2V0X3Byb2R1Y3RfaWQoZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBpZiAoIWlzTXRwRGV2aWNlKHZlbmRvciwgcHJvZHVjdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90IGFuIE1UUCBvciBQVFAgZGV2aWNlCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IE1UUCBPUyBzdHJpbmcgYW5kIGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAvLyBzb21lIG11c2ljIHBsYXllcnMgbmVlZCB0byBzZWUgdGhpcyBiZWZvcmUgZW50ZXJpbmcgTVRQIG1vZGUuCisgICAgICAgICAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgICAgICAgICAgaW50IHJldCA9IHVzYl9kZXZpY2Vfc2VuZF9jb250cm9sKGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9ESVJfSU58VVNCX1JFQ0lQX0RFVklDRXxVU0JfVFlQRV9TVEFOREFSRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9SRVFfR0VUX0RFU0NSSVBUT1IsIChVU0JfRFRfU1RSSU5HIDw8IDgpIHwgMHhFRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIHNpemVvZihidWZmZXIpLCBidWZmZXIpOworICAgICAgICAgICAgICAgIHByaW50ZigidXNiX2RldmljZV9zZW5kX2NvbnRyb2wgcmV0dXJuZWQgJWQgZXJybm86ICVkXG4iLCByZXQsIGVycm5vKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoImdvdCBNVFAgc3RyaW5nICVzXG4iLCBidWZmZXIpOworICAgICAgICAgICAgICAgICAgICByZXQgPSB1c2JfZGV2aWNlX3NlbmRfY29udHJvbChkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCX0RJUl9JTnxVU0JfUkVDSVBfREVWSUNFfFVTQl9UWVBFX1ZFTkRPUiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCA0LCBzaXplb2YoYnVmZmVyKSwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJPUyBkZXNjcmlwdG9yIGdvdCAlZFxuIiwgcmV0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIm5vIE1UUCBzdHJpbmdcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgd2UgZ290IGhlcmUsIHRoZW4gd2UgaGF2ZSBhIGxpa2VseSBNVFAgb3IgUFRQIGRldmljZQorCisgICAgICAgICAgICAvLyBpbnRlcmZhY2Ugc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IHRocmVlIGVuZHBvaW50cworICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcDsKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfaW5fZGVzYyA9IE5VTEw7CisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX291dF9kZXNjID0gTlVMTDsKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfaW50cl9kZXNjID0gTlVMTDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICAgICAgZXAgPSAoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICopdXNiX2Rlc2NyaXB0b3JfaXRlcl9uZXh0KCZpdGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWVwIHx8IGVwLT5iRGVzY3JpcHRvclR5cGUgIT0gVVNCX0RUX0VORFBPSU5UKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoImVuZHBvaW50cyBub3QgZm91bmRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbURvbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChlcC0+Ym1BdHRyaWJ1dGVzID09IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgZXBfaW5fZGVzYyA9IGVwOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBlcF9vdXRfZGVzYyA9IGVwOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXAtPmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQgJiYKKyAgICAgICAgICAgICAgICAgICAgZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spIHsKKyAgICAgICAgICAgICAgICAgICAgZXBfaW50cl9kZXNjID0gZXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFlcF9pbl9kZXNjIHx8ICFlcF9vdXRfZGVzYyB8fCAhZXBfaW50cl9kZXNjKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiZW5kcG9pbnRzIG5vdCBmb3VuZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Eb25lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9pbiA9IHVzYl9lbmRwb2ludF9vcGVuKGRldmljZSwgZXBfaW5fZGVzYyk7CisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9vdXQgPSB1c2JfZW5kcG9pbnRfb3BlbihkZXZpY2UsIGVwX291dF9kZXNjKTsKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX2ludHIgPSB1c2JfZW5kcG9pbnRfb3BlbihkZXZpY2UsIGVwX2ludHJfZGVzYyk7CisKKyAgICAgICAgICAgIGlmICh1c2JfZGV2aWNlX2NsYWltX2ludGVyZmFjZShkZXZpY2UsIGludGVyZmFjZS0+YkludGVyZmFjZU51bWJlcikpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJ1c2JfZGV2aWNlX2NsYWltX2ludGVyZmFjZSBmYWlsZWQgZXJybm86ICVkXG4iLCBlcnJubyk7CisgICAgICAgICAgICAgICAgdXNiX2VuZHBvaW50X2Nsb3NlKGVwX2luKTsKKyAgICAgICAgICAgICAgICB1c2JfZW5kcG9pbnRfY2xvc2UoZXBfb3V0KTsKKyAgICAgICAgICAgICAgICB1c2JfZW5kcG9pbnRfY2xvc2UoZXBfaW50cik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Eb25lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNdHBEZXZpY2UqIG10cERldmljZSA9IG5ldyBNdHBEZXZpY2UoZGV2aWNlLCBpbnRlcmZhY2UtPmJJbnRlcmZhY2VOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBlcF9pbiwgZXBfb3V0LCBlcF9pbnRyKTsKKyAgICAgICAgICAgIG1EZXZpY2VMaXN0LmFkZChtdHBEZXZpY2UpOworICAgICAgICAgICAgbXRwRGV2aWNlLT5pbml0aWFsaXplKCk7CisgICAgICAgICAgICBkZXZpY2VBZGRlZChtdHBEZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIG1Eb25lOworICAgICAgICB9CisgICAgfQorCisgICAgdXNiX2RldmljZV9jbG9zZShkZXZpY2UpOworICAgIHJldHVybiBtRG9uZTsKK30KKworYm9vbCBNdHBDbGllbnQ6OnVzYkRldmljZVJlbW92ZWQoY29uc3QgY2hhciAqZGV2bmFtZSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURldmljZUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtRGV2aWNlTGlzdFtpXTsKKyAgICAgICAgaWYgKCFzdHJjbXAoZGV2bmFtZSwgZGV2aWNlLT5nZXREZXZpY2VOYW1lKCkpKSB7CisgICAgICAgICAgICBkZXZpY2VSZW1vdmVkKGRldmljZSk7CisgICAgICAgICAgICBtRGV2aWNlTGlzdC5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgIGRlbGV0ZSBkZXZpY2U7CisgICAgICAgICAgICBMT0dEKCJDYW1lcmEgcmVtb3ZlZCFcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1Eb25lOworfQorCitib29sIE10cENsaWVudDo6dXNiRGlzY292ZXJ5RG9uZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICBtVGhyZWFkU3RhcnRDb25kaXRpb24uc2lnbmFsKCk7CisgICAgcmV0dXJuIG1Eb25lOworfQorCitib29sIE10cENsaWVudDo6dGhyZWFkTG9vcCgpIHsKKyAgICB1c2JfaG9zdF9ydW4obVVzYkhvc3RDb250ZXh0LCB1c2JfZGV2aWNlX2FkZGVkLCB1c2JfZGV2aWNlX3JlbW92ZWQsIHVzYl9kaXNjb3ZlcnlfZG9uZSwgdGhpcyk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQgTXRwQ2xpZW50Ojp1c2JfZGV2aWNlX2FkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKSB7CisgICAgTE9HRCgidXNiX2RldmljZV9hZGRlZCAlc1xuIiwgZGV2bmFtZSk7CisgICAgcmV0dXJuICgoTXRwQ2xpZW50ICopY2xpZW50X2RhdGEpLT51c2JEZXZpY2VBZGRlZChkZXZuYW1lKTsKK30KKworaW50IE10cENsaWVudDo6dXNiX2RldmljZV9yZW1vdmVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKSB7CisgICAgTE9HRCgidXNiX2RldmljZV9yZW1vdmVkICVzXG4iLCBkZXZuYW1lKTsKKyAgICByZXR1cm4gKChNdHBDbGllbnQgKiljbGllbnRfZGF0YSktPnVzYkRldmljZVJlbW92ZWQoZGV2bmFtZSk7Cit9CisKK2ludCBNdHBDbGllbnQ6OnVzYl9kaXNjb3ZlcnlfZG9uZSh2b2lkKiBjbGllbnRfZGF0YSkgeworICAgIExPR0QoInVzYl9kaXNjb3ZlcnlfZG9uZVxuIik7CisgICAgcmV0dXJuICgoTXRwQ2xpZW50ICopY2xpZW50X2RhdGEpLT51c2JEaXNjb3ZlcnlEb25lKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwQ2xpZW50LmggYi9tZWRpYS9tdHAvTXRwQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE1YzUyNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBDbGllbnQuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0NMSUVOVF9ICisjZGVmaW5lIF9NVFBfQ0xJRU5UX0gKKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK3N0cnVjdCB1c2JfaG9zdF9jb250ZXh0OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cENsaWVudFRocmVhZDsKKworY2xhc3MgTXRwQ2xpZW50IHsKK3ByaXZhdGU6CisgICAgTXRwRGV2aWNlTGlzdCAgICAgICAgICAgICAgIG1EZXZpY2VMaXN0OworICAgIE10cENsaWVudFRocmVhZCogICAgICAgICAgICBtVGhyZWFkOworICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgICAgICBtVGhyZWFkU3RhcnRDb25kaXRpb247CisgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1NdXRleDsKKyAgICBzdHJ1Y3QgdXNiX2hvc3RfY29udGV4dCogICAgbVVzYkhvc3RDb250ZXh0OworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtRG9uZTsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cENsaWVudCgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NdHBDbGllbnQoKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHN0YXJ0KCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgc3RvcCgpOworCisgICAgaW5saW5lIE10cERldmljZUxpc3QmICAgZ2V0RGV2aWNlTGlzdCgpIHsgcmV0dXJuIG1EZXZpY2VMaXN0OyB9CisgICAgTXRwRGV2aWNlKiAgICAgICAgICAgICAgZ2V0RGV2aWNlKGludCBpZCk7CisKKworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRldmljZUFkZGVkKE10cERldmljZSAqZGV2aWNlKSA9IDA7CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGV2aWNlUmVtb3ZlZChNdHBEZXZpY2UgKmRldmljZSkgPSAwOworCitwcml2YXRlOgorICAgIC8vIHRoZXNlIHJldHVybiB0cnVlIGlmIHdlIHNob3VsZCBzdG9wIG1vbml0b3JpbmcgVVNCIGFuZCBjbGVhbiB1cAorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHVzYkRldmljZUFkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHVzYkRldmljZVJlbW92ZWQoY29uc3QgY2hhciAqZGV2bmFtZSk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgdXNiRGlzY292ZXJ5RG9uZSgpOworCisgICAgZnJpZW5kIGNsYXNzIE10cENsaWVudFRocmVhZDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICB0aHJlYWRMb29wKCk7CisgICAgc3RhdGljIGludCAgICAgICAgICAgICAgdXNiX2RldmljZV9hZGRlZChjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkKiBjbGllbnRfZGF0YSk7CisgICAgc3RhdGljIGludCAgICAgICAgICAgICAgdXNiX2RldmljZV9yZW1vdmVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKTsKKyAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICB1c2JfZGlzY292ZXJ5X2RvbmUodm9pZCogY2xpZW50X2RhdGEpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBDdXJzb3IuY3BwIGIvbWVkaWEvbXRwL010cEN1cnNvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVkOTBkYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBDdXJzb3IuY3BwCkBAIC0wLDAgKzEsNDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBDdXJzb3IiCisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cEN1cnNvci5oIgorI2luY2x1ZGUgIk10cERldmljZS5oIgorI2luY2x1ZGUgIk10cERldmljZUluZm8uaCIKKyNpbmNsdWRlICJNdHBPYmplY3RJbmZvLmgiCisjaW5jbHVkZSAiTXRwU3RvcmFnZUluZm8uaCIKKworCisjaW5jbHVkZSAiYmluZGVyL0N1cnNvcldpbmRvdy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIERldmljZSBDb2x1bW4gSURzICovCisvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmphdmEgKi8KKyNkZWZpbmUgREVWSUNFX1JPV19JRCAgICAgICAgICAgMQorI2RlZmluZSBERVZJQ0VfTUFOVUZBQ1RVUkVSICAgICAyCisjZGVmaW5lIERFVklDRV9NT0RFTCAgICAgICAgICAgIDMKKworLyogU3RvcmFnZSBDb2x1bW4gSURzICovCisvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmphdmEgKi8KKyNkZWZpbmUgU1RPUkFHRV9ST1dfSUQgICAgICAgICAgMTAxCisjZGVmaW5lIFNUT1JBR0VfSURFTlRJRklFUiAgICAgIDEwMgorI2RlZmluZSBTVE9SQUdFX0RFU0NSSVBUSU9OICAgICAxMDMKKworLyogT2JqZWN0IENvbHVtbiBJRHMgKi8KKy8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiBNdHBDdXJzb3IuamF2YSAqLworI2RlZmluZSBPQkpFQ1RfUk9XX0lEICAgICAgICAgICAgICAgMjAxCisjZGVmaW5lIE9CSkVDVF9TVE9SQUdFX0lEICAgICAgICAgICAyMDIKKyNkZWZpbmUgT0JKRUNUX0ZPUk1BVCAgICAgICAgICAgICAgIDIwMworI2RlZmluZSBPQkpFQ1RfUFJPVEVDVElPTl9TVEFUVVMgICAgMjA0CisjZGVmaW5lIE9CSkVDVF9TSVpFICAgICAgICAgICAgICAgICAyMDUKKyNkZWZpbmUgT0JKRUNUX1RIVU1CX0ZPUk1BVCAgICAgICAgIDIwNgorI2RlZmluZSBPQkpFQ1RfVEhVTUJfU0laRSAgICAgICAgICAgMjA3CisjZGVmaW5lIE9CSkVDVF9USFVNQl9XSURUSCAgICAgICAgICAyMDgKKyNkZWZpbmUgT0JKRUNUX1RIVU1CX0hFSUdIVCAgICAgICAgIDIwOQorI2RlZmluZSBPQkpFQ1RfSU1BR0VfV0lEVEggICAgICAgICAgMjEwCisjZGVmaW5lIE9CSkVDVF9JTUFHRV9IRUlHSFQgICAgICAgICAyMTEKKyNkZWZpbmUgT0JKRUNUX0lNQUdFX0RFUFRIICAgICAgICAgIDIxMgorI2RlZmluZSBPQkpFQ1RfUEFSRU5UICAgICAgICAgICAgICAgMjEzCisjZGVmaW5lIE9CSkVDVF9BU1NPQ0lBVElPTl9UWVBFICAgICAyMTQKKyNkZWZpbmUgT0JKRUNUX0FTU09DSUFUSU9OX0RFU0MgICAgIDIxNQorI2RlZmluZSBPQkpFQ1RfU0VRVUVOQ0VfTlVNQkVSICAgICAgMjE2CisjZGVmaW5lIE9CSkVDVF9OQU1FICAgICAgICAgICAgICAgICAyMTcKKyNkZWZpbmUgT0JKRUNUX0RBVEVfQ1JFQVRFRCAgICAgICAgIDIxOAorI2RlZmluZSBPQkpFQ1RfREFURV9NT0RJRklFRCAgICAgICAgMjE5CisjZGVmaW5lIE9CSkVDVF9LRVlXT1JEUyAgICAgICAgICAgICAyMjAKKyNkZWZpbmUgT0JKRUNUX1RIVU1CICAgICAgICAgICAgICAgIDIyMQorCitNdHBDdXJzb3I6Ok10cEN1cnNvcihNdHBDbGllbnQqIGNsaWVudCwgaW50IHF1ZXJ5VHlwZSwgaW50IGRldmljZUlELAorICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsIE10cE9iamVjdEhhbmRsZSBvYmplY3RJRCwKKyAgICAgICAgICAgICAgICBpbnQgY29sdW1uQ291bnQsIGludCogY29sdW1ucykKKyAgICAgICAgOiAgIG1DbGllbnQoY2xpZW50KSwKKyAgICAgICAgICAgIG1RdWVyeVR5cGUocXVlcnlUeXBlKSwKKyAgICAgICAgICAgIG1EZXZpY2VJRChkZXZpY2VJRCksCisgICAgICAgICAgICBtU3RvcmFnZUlEKHN0b3JhZ2VJRCksCisgICAgICAgICAgICBtUWJqZWN0SUQob2JqZWN0SUQpLAorICAgICAgICAgICAgbUNvbHVtbkNvdW50KGNvbHVtbkNvdW50KSwKKyAgICAgICAgICAgIG1Db2x1bW5zKE5VTEwpCit7CisgICAgaWYgKGNvbHVtbnMpIHsKKyAgICAgICAgbUNvbHVtbnMgPSBuZXcgaW50W2NvbHVtbkNvdW50XTsKKyAgICAgICAgbWVtY3B5KG1Db2x1bW5zLCBjb2x1bW5zLCBjb2x1bW5Db3VudCAqIHNpemVvZihpbnQpKTsKKyAgICB9Cit9CisKK010cEN1cnNvcjo6fk10cEN1cnNvcigpIHsKKyAgICBkZWxldGVbXSBtQ29sdW1uczsKK30KKworaW50IE10cEN1cnNvcjo6ZmlsbFdpbmRvdyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKSB7CisgICAgTE9HRCgiTXRwQ3Vyc29yOjpmaWxsV2luZG93IG1RdWVyeVR5cGU6ICVkXG4iLCBtUXVlcnlUeXBlKTsKKworICAgIHN3aXRjaCAobVF1ZXJ5VHlwZSkgeworICAgICAgICBjYXNlIERFVklDRToKKyAgICAgICAgICAgIHJldHVybiBmaWxsRGV2aWNlcyh3aW5kb3csIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBERVZJQ0VfSUQ6CisgICAgICAgICAgICByZXR1cm4gZmlsbERldmljZSh3aW5kb3csIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBTVE9SQUdFOgorICAgICAgICAgICAgcmV0dXJuIGZpbGxTdG9yYWdlcyh3aW5kb3csIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBTVE9SQUdFX0lEOgorICAgICAgICAgICAgcmV0dXJuIGZpbGxTdG9yYWdlKHdpbmRvdywgc3RhcnRQb3MpOworICAgICAgICBjYXNlIE9CSkVDVDoKKyAgICAgICAgICAgIHJldHVybiBmaWxsT2JqZWN0cyh3aW5kb3csIDAsIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBPQkpFQ1RfSUQ6CisgICAgICAgICAgICByZXR1cm4gZmlsbE9iamVjdCh3aW5kb3csIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBTVE9SQUdFX0NISUxEUkVOOgorICAgICAgICAgICAgcmV0dXJuIGZpbGxPYmplY3RzKHdpbmRvdywgLTEsIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBPQkpFQ1RfQ0hJTERSRU46CisgICAgICAgICAgICByZXR1cm4gZmlsbE9iamVjdHMod2luZG93LCBtUWJqZWN0SUQsIHN0YXJ0UG9zKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoIk10cEN1cnNvcjo6ZmlsbFdpbmRvdzogdW5rbm93biBxdWVyeSB0eXBlICVkXG4iLCBtUXVlcnlUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworaW50IE10cEN1cnNvcjo6ZmlsbERldmljZXMoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcykgeworICAgIGludCBjb3VudCA9IDA7CisgICAgTXRwRGV2aWNlTGlzdCYgZGV2aWNlTGlzdCA9IG1DbGllbnQtPmdldERldmljZUxpc3QoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRldmljZUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBkZXZpY2VMaXN0W2ldOworICAgICAgICBpZiAoZmlsbERldmljZSh3aW5kb3csIGRldmljZSwgc3RhcnRQb3MpKSB7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgc3RhcnRQb3MrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworaW50IE10cEN1cnNvcjo6ZmlsbERldmljZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKSB7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtQ2xpZW50LT5nZXREZXZpY2UobURldmljZUlEKTsKKyAgICBpZiAoZGV2aWNlICYmIGZpbGxEZXZpY2Uod2luZG93LCBkZXZpY2UsIHN0YXJ0UG9zKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworaW50IE10cEN1cnNvcjo6ZmlsbFN0b3JhZ2VzKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpIHsKKyAgICBpbnQgY291bnQgPSAwOworICAgIE10cERldmljZSogZGV2aWNlID0gbUNsaWVudC0+Z2V0RGV2aWNlKG1EZXZpY2VJRCk7CisgICAgaWYgKCFkZXZpY2UpCisgICAgICAgIHJldHVybiAwOworICAgIE10cFN0b3JhZ2VJRExpc3QqIHN0b3JhZ2VJRHMgPSBkZXZpY2UtPmdldFN0b3JhZ2VJRHMoKTsKKyAgICBpZiAoIXN0b3JhZ2VJRHMpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9yYWdlSURzLT5zaXplKCk7IGkrKykgeworICAgICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gKCpzdG9yYWdlSURzKVtpXTsKKyAgICAgICAgaWYgKGZpbGxTdG9yYWdlKHdpbmRvdywgZGV2aWNlLCBzdG9yYWdlSUQsIHN0YXJ0UG9zKSkgeworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIHN0YXJ0UG9zKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZWxldGUgc3RvcmFnZUlEczsKKyAgICByZXR1cm4gY291bnQ7Cit9CisKK2ludCBNdHBDdXJzb3I6OmZpbGxTdG9yYWdlKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpIHsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IG1DbGllbnQtPmdldERldmljZShtRGV2aWNlSUQpOworICAgIGlmIChkZXZpY2UgJiYgZmlsbFN0b3JhZ2Uod2luZG93LCBkZXZpY2UsIG1TdG9yYWdlSUQsIHN0YXJ0UG9zKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworaW50IE10cEN1cnNvcjo6ZmlsbE9iamVjdHMoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBwYXJlbnQsIGludCBzdGFydFBvcykgeworICAgIGludCBjb3VudCA9IDA7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtQ2xpZW50LT5nZXREZXZpY2UobURldmljZUlEKTsKKyAgICBpZiAoIWRldmljZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogaGFuZGxlcyA9IGRldmljZS0+Z2V0T2JqZWN0SGFuZGxlcyhtU3RvcmFnZUlELCAwLCBwYXJlbnQpOworICAgIGlmICghaGFuZGxlcykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXMtPnNpemUoKTsgaSsrKSB7CisgICAgICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSAoKmhhbmRsZXMpW2ldOworICAgICAgICBpZiAoZmlsbE9iamVjdCh3aW5kb3csIGRldmljZSwgaGFuZGxlLCBzdGFydFBvcykpIHsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICBzdGFydFBvcysrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZGVsZXRlIGhhbmRsZXM7CisgICAgcmV0dXJuIGNvdW50OworfQorCitpbnQgTXRwQ3Vyc29yOjpmaWxsT2JqZWN0KEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpIHsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IG1DbGllbnQtPmdldERldmljZShtRGV2aWNlSUQpOworICAgIGlmIChkZXZpY2UgJiYgZmlsbE9iamVjdCh3aW5kb3csIGRldmljZSwgbVFiamVjdElELCBzdGFydFBvcykpCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgTXRwQ3Vyc29yOjpmaWxsRGV2aWNlKEN1cnNvcldpbmRvdyogd2luZG93LCBNdHBEZXZpY2UqIGRldmljZSwgaW50IHJvdykgeworICAgIE10cERldmljZUluZm8qIGRldmljZUluZm8gPSBkZXZpY2UtPmdldERldmljZUluZm8oKTsKKyAgICBpZiAoIWRldmljZUluZm8pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIXByZXBhcmVSb3cod2luZG93KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ29sdW1uQ291bnQ7IGkrKykgeworICAgICAgICBzd2l0Y2ggKG1Db2x1bW5zW2ldKSB7CisgICAgICAgICAgICBjYXNlIERFVklDRV9ST1dfSUQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgZGV2aWNlLT5nZXRJRCgpLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBERVZJQ0VfTUFOVUZBQ1RVUkVSOgorICAgICAgICAgICAgICAgIGlmICghcHV0U3RyaW5nKHdpbmRvdywgZGV2aWNlSW5mby0+bU1hbnVmYWN0dXJlciwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgREVWSUNFX01PREVMOgorICAgICAgICAgICAgICAgIGlmICghcHV0U3RyaW5nKHdpbmRvdywgZGV2aWNlSW5mby0+bU1vZGVsLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dFKCJmaWxsRGV2aWNlOiB1bmtub3duIGNvbHVtbiAlZFxuIiwgbUNvbHVtbnNbaV0pOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE10cEN1cnNvcjo6ZmlsbFN0b3JhZ2UoQ3Vyc29yV2luZG93KiB3aW5kb3csIE10cERldmljZSogZGV2aWNlLAorICAgICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlELCBpbnQgcm93KSB7CisKK0xPR0QoImZpbGxTdG9yYWdlICVkXG4iLCBzdG9yYWdlSUQpOworCisgICAgTXRwU3RvcmFnZUluZm8qIHN0b3JhZ2VJbmZvID0gZGV2aWNlLT5nZXRTdG9yYWdlSW5mbyhzdG9yYWdlSUQpOworICAgIGlmICghc3RvcmFnZUluZm8pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIXByZXBhcmVSb3cod2luZG93KSkgeworICAgICAgICBkZWxldGUgc3RvcmFnZUluZm87CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyKiB0ZXh0OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNvbHVtbkNvdW50OyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChtQ29sdW1uc1tpXSkgeworICAgICAgICAgICAgY2FzZSBTVE9SQUdFX1JPV19JRDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBzdG9yYWdlSUQsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNUT1JBR0VfSURFTlRJRklFUjoKKyAgICAgICAgICAgICAgICB0ZXh0ID0gc3RvcmFnZUluZm8tPm1Wb2x1bWVJZGVudGlmaWVyOworICAgICAgICAgICAgICAgIGlmICghdGV4dCB8fCAhdGV4dFswXSkKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICJDYW1lcmEgU3RvcmFnZSI7CisgICAgICAgICAgICAgICAgaWYgKCFwdXRTdHJpbmcod2luZG93LCB0ZXh0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVE9SQUdFX0RFU0NSSVBUSU9OOgorICAgICAgICAgICAgICAgIHRleHQgPSBzdG9yYWdlSW5mby0+bVN0b3JhZ2VEZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICBpZiAoIXRleHQgfHwgIXRleHRbMF0pCisgICAgICAgICAgICAgICAgICAgIHRleHQgPSAiU3RvcmFnZSBEZXNjcmlwdGlvbiI7CisgICAgICAgICAgICAgICAgaWYgKCFwdXRTdHJpbmcod2luZG93LCB0ZXh0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dFKCJmaWxsU3RvcmFnZTogdW5rbm93biBjb2x1bW4gJWRcbiIsIG1Db2x1bW5zW2ldKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWxldGUgc3RvcmFnZUluZm87CisgICAgcmV0dXJuIHRydWU7CisKK2ZhaWw6CisgICAgZGVsZXRlIHN0b3JhZ2VJbmZvOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBNdHBDdXJzb3I6OmZpbGxPYmplY3QoQ3Vyc29yV2luZG93KiB3aW5kb3csIE10cERldmljZSogZGV2aWNlLAorICAgICAgICBNdHBPYmplY3RIYW5kbGUgb2JqZWN0SUQsIGludCByb3cpIHsKKworICAgIE10cE9iamVjdEluZm8qIG9iamVjdEluZm8gPSBkZXZpY2UtPmdldE9iamVjdEluZm8ob2JqZWN0SUQpOworICAgIGlmICghb2JqZWN0SW5mbykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIG9iamVjdEluZm8tPnByaW50KCk7CisgICAgaWYgKCFwcmVwYXJlUm93KHdpbmRvdykpIHsKKyAgICAgICAgZGVsZXRlIG9iamVjdEluZm87CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db2x1bW5Db3VudDsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAobUNvbHVtbnNbaV0pIHsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1JPV19JRDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJRCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1NUT1JBR0VfSUQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVN0b3JhZ2VJRCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0ZPUk1BVDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tRm9ybWF0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfUFJPVEVDVElPTl9TVEFUVVM6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVByb3RlY3Rpb25TdGF0dXMsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9TSVpFOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1Db21wcmVzc2VkU2l6ZSwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1RIVU1CX0ZPUk1BVDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tVGh1bWJGb3JtYXQsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9USFVNQl9TSVpFOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1UaHVtYkNvbXByZXNzZWRTaXplLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfVEhVTUJfV0lEVEg6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVRodW1iUGl4V2lkdGgsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9USFVNQl9IRUlHSFQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVRodW1iUGl4SGVpZ2h0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfSU1BR0VfV0lEVEg6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUltYWdlUGl4V2lkdGgsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9JTUFHRV9IRUlHSFQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUltYWdlUGl4SGVpZ2h0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfSU1BR0VfREVQVEg6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUltYWdlUGl4RGVwdGgsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9QQVJFTlQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVBhcmVudCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0FTU09DSUFUSU9OX1RZUEU6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUFzc29jaWF0aW9uVHlwZSwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0FTU09DSUFUSU9OX0RFU0M6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUFzc29jaWF0aW9uRGVzYywgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1NFUVVFTkNFX05VTUJFUjoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tU2VxdWVuY2VOdW1iZXIsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9OQU1FOgorICAgICAgICAgICAgICAgIGlmICghcHV0U3RyaW5nKHdpbmRvdywgb2JqZWN0SW5mby0+bU5hbWUsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9EQVRFX0NSRUFURUQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bURhdGVDcmVhdGVkLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfREFURV9NT0RJRklFRDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tRGF0ZU1vZGlmaWVkLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfS0VZV09SRFM6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRTdHJpbmcod2luZG93LCBvYmplY3RJbmZvLT5tS2V5d29yZHMsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9USFVNQjoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dFRodW1ibmFpbCh3aW5kb3csIG9iamVjdElELCBvYmplY3RJbmZvLT5tRm9ybWF0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR0UoImZpbGxPYmplY3Q6IHVua25vd24gY29sdW1uICVkXG4iLCBtQ29sdW1uc1tpXSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgZGVsZXRlIG9iamVjdEluZm87CisgICAgcmV0dXJuIHRydWU7CisKK2ZhaWw6CisgICAgZGVsZXRlIG9iamVjdEluZm87CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIE10cEN1cnNvcjo6cHJlcGFyZVJvdyhDdXJzb3JXaW5kb3cqIHdpbmRvdykgeworICAgIGlmICghd2luZG93LT5zZXROdW1Db2x1bW5zKG1Db2x1bW5Db3VudCkpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGNoYW5nZSBjb2x1bW4gY291bnQgZnJvbSAlZCB0byAlZCIsIHdpbmRvdy0+Z2V0TnVtQ29sdW1ucygpLCBtQ29sdW1uQ291bnQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkRGlyID0gd2luZG93LT5hbGxvY1JvdygpOworICAgIGlmICghZmllbGREaXIpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIGFsbG9jYXRpbmcgZmllbGREaXIiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitib29sIE10cEN1cnNvcjo6cHV0TG9uZyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50NjRfdCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbHVtbikgeworICAgIGlmICghd2luZG93LT5wdXRMb25nKHJvdywgY29sdW1uLCB2YWx1ZSkpIHsKKyAgICAgICAgd2luZG93LT5mcmVlTGFzdFJvdygpOworICAgICAgICBMT0dFKCJGYWlsZWQgYWxsb2NhdGluZyBzcGFjZSBmb3IgYSBsb25nIGluIGNvbHVtbiAlZCIsIGNvbHVtbik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTXRwQ3Vyc29yOjpwdXRTdHJpbmcoQ3Vyc29yV2luZG93KiB3aW5kb3csIGNvbnN0IGNoYXIqIHRleHQsIGludCByb3csIGludCBjb2x1bW4pIHsKKyAgICBpbnQgc2l6ZSA9IHN0cmxlbih0ZXh0KSArIDE7CisgICAgaW50IG9mZnNldCA9IHdpbmRvdy0+YWxsb2Moc2l6ZSk7CisgICAgaWYgKCFvZmZzZXQpIHsKKyAgICAgICAgd2luZG93LT5mcmVlTGFzdFJvdygpOworICAgICAgICBMT0dFKCJGYWlsZWQgYWxsb2NhdGluZyAldSBieXRlcyBmb3IgdGV4dC9ibG9iICVzIiwgc2l6ZSwgdGV4dCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgd2luZG93LT5jb3B5SW4ob2Zmc2V0LCAoY29uc3QgdWludDhfdCopdGV4dCwgc2l6ZSk7CisKKyAgICAvLyBUaGlzIG11c3QgYmUgdXBkYXRlZCBhZnRlciB0aGUgY2FsbCB0byBhbGxvYygpLCBzaW5jZSB0aGF0CisgICAgLy8gbWF5IG1vdmUgdGhlIGZpZWxkIGFyb3VuZCBpbiB0aGUgd2luZG93CisgICAgZmllbGRfc2xvdF90ICogZmllbGRTbG90ID0gd2luZG93LT5nZXRGaWVsZFNsb3Qocm93LCBjb2x1bW4pOworICAgIGZpZWxkU2xvdC0+dHlwZSA9IEZJRUxEX1RZUEVfU1RSSU5HOworICAgIGZpZWxkU2xvdC0+ZGF0YS5idWZmZXIub2Zmc2V0ID0gb2Zmc2V0OworICAgIGZpZWxkU2xvdC0+ZGF0YS5idWZmZXIuc2l6ZSA9IHNpemU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTXRwQ3Vyc29yOjpwdXRUaHVtYm5haWwoQ3Vyc29yV2luZG93KiB3aW5kb3csIE10cE9iamVjdEhhbmRsZSBvYmplY3RJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LCBpbnQgcm93LCBpbnQgY29sdW1uKSB7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtQ2xpZW50LT5nZXREZXZpY2UobURldmljZUlEKTsKKyAgICB2b2lkKiB0aHVtYm5haWw7CisgICAgaW50IHNpemUsIG9mZnNldDsKKyAgICBpZiAoZm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04pIHsKKyAgICAgICAgdGh1bWJuYWlsID0gTlVMTDsKKyAgICAgICAgc2l6ZSA9IG9mZnNldCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGh1bWJuYWlsID0gZGV2aWNlLT5nZXRUaHVtYm5haWwob2JqZWN0SUQsIHNpemUpOworCisgICAgICAgIExPR1YoInB1dFRodW1ibmFpbDogJXAsIHNpemU6ICVkXG4iLCB0aHVtYm5haWwsIHNpemUpOworICAgICAgICBvZmZzZXQgPSB3aW5kb3ctPmFsbG9jKHNpemUpOworICAgICAgICBpZiAoIW9mZnNldCkgeworICAgICAgICAgICAgd2luZG93LT5mcmVlTGFzdFJvdygpOworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIGFsbG9jYXRpbmcgJXUgYnl0ZXMgZm9yIHRodW1ibmFpbCIsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGlmICh0aHVtYm5haWwpCisgICAgICAgIHdpbmRvdy0+Y29weUluKG9mZnNldCwgKGNvbnN0IHVpbnQ4X3QqKXRodW1ibmFpbCwgc2l6ZSk7CisKKyAgICAvLyBUaGlzIG11c3QgYmUgdXBkYXRlZCBhZnRlciB0aGUgY2FsbCB0byBhbGxvYygpLCBzaW5jZSB0aGF0CisgICAgLy8gbWF5IG1vdmUgdGhlIGZpZWxkIGFyb3VuZCBpbiB0aGUgd2luZG93CisgICAgZmllbGRfc2xvdF90ICogZmllbGRTbG90ID0gd2luZG93LT5nZXRGaWVsZFNsb3Qocm93LCBjb2x1bW4pOworICAgIGZpZWxkU2xvdC0+dHlwZSA9IEZJRUxEX1RZUEVfQkxPQjsKKyAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCA9IG9mZnNldDsKKyAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLnNpemUgPSBzaXplOworICAgIHJldHVybiB0cnVlOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwQ3Vyc29yLmggYi9tZWRpYS9tdHAvTXRwQ3Vyc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUwM2MyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBDdXJzb3IuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0NVUlNPUl9ICisjZGVmaW5lIF9NVFBfQ1VSU09SX0gKKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ3Vyc29yV2luZG93OworCitjbGFzcyBNdHBDdXJzb3IgeworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAgREVWSUNFICAgICAgICAgICAgICA9IDEsCisgICAgICAgIERFVklDRV9JRCAgICAgICAgICAgPSAyLAorICAgICAgICBTVE9SQUdFICAgICAgICAgICAgID0gMywKKyAgICAgICAgU1RPUkFHRV9JRCAgICAgICAgICA9IDQsCisgICAgICAgIE9CSkVDVCAgICAgICAgICAgICAgPSA1LAorICAgICAgICBPQkpFQ1RfSUQgICAgICAgICAgID0gNiwKKyAgICAgICAgU1RPUkFHRV9DSElMRFJFTiAgICA9IDcsCisgICAgICAgIE9CSkVDVF9DSElMRFJFTiAgICAgPSA4LAorICAgIH07CisKKyAgICBNdHBDbGllbnQqICAgICAgbUNsaWVudDsKKyAgICBpbnQgICAgICAgICAgICAgbVF1ZXJ5VHlwZTsKKyAgICBpbnQgICAgICAgICAgICAgbURldmljZUlEOworICAgIE10cFN0b3JhZ2VJRCAgICBtU3RvcmFnZUlEOworICAgIE10cE9iamVjdEhhbmRsZSBtUWJqZWN0SUQ7CisgICAgaW50ICAgICAgICAgICAgIG1Db2x1bW5Db3VudDsKKyAgICBpbnQqICAgICAgICAgICAgbUNvbHVtbnM7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICBNdHBDdXJzb3IoTXRwQ2xpZW50KiBjbGllbnQsIGludCBxdWVyeVR5cGUsIGludCBkZXZpY2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsIE10cE9iamVjdEhhbmRsZSBvYmplY3RJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2x1bW5Db3VudCwgaW50KiBjb2x1bW5zKTsKKyAgICB2aXJ0dWFsICAgICB+TXRwQ3Vyc29yKCk7CisKKyAgICBpbnQgICAgICAgICBmaWxsV2luZG93KEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpOworCitwcml2YXRlOgorICAgIGludCAgICAgICAgIGZpbGxEZXZpY2VzKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpOworICAgIGludCAgICAgICAgIGZpbGxEZXZpY2UoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcyk7CisgICAgaW50ICAgICAgICAgZmlsbFN0b3JhZ2VzKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpOworICAgIGludCAgICAgICAgIGZpbGxTdG9yYWdlKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpOworICAgIGludCAgICAgICAgIGZpbGxPYmplY3RzKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgcGFyZW50LCBpbnQgc3RhcnRQb3MpOworICAgIGludCAgICAgICAgIGZpbGxPYmplY3QoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcyk7CisKKyAgICBib29sICAgICAgICBmaWxsRGV2aWNlKEN1cnNvcldpbmRvdyogd2luZG93LCBNdHBEZXZpY2UqIGRldmljZSwgaW50IHN0YXJ0UG9zKTsKKyAgICBib29sICAgICAgICBmaWxsU3RvcmFnZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgTXRwRGV2aWNlKiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlELCBpbnQgcm93KTsKKyAgICBib29sICAgICAgICBmaWxsT2JqZWN0KEN1cnNvcldpbmRvdyogd2luZG93LCBNdHBEZXZpY2UqIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBvYmplY3RJRCwgaW50IHJvdyk7CisKKyAgICBib29sICAgICAgICBwcmVwYXJlUm93KEN1cnNvcldpbmRvdyogd2luZG93KTsKKyAgICBib29sICAgICAgICBwdXRMb25nKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQ2NF90IHZhbHVlLCBpbnQgcm93LCBpbnQgY29sdW1uKTsKKyAgICBib29sICAgICAgICBwdXRTdHJpbmcoQ3Vyc29yV2luZG93KiB3aW5kb3csIGNvbnN0IGNoYXIqIHRleHQsIGludCByb3csIGludCBjb2x1bW4pOworICAgIGJvb2wgICAgICAgIHB1dFRodW1ibmFpbChDdXJzb3JXaW5kb3cqIHdpbmRvdywgTXRwT2JqZWN0SGFuZGxlIG9iamVjdElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsIGludCByb3csIGludCBjb2x1bW4pOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfQ1VSU09SX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmNwcCBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzc4ZmYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuY3BwCkBAIC0wLDAgKzEsNDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBEYXRhUGFja2V0IgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8dXNiaG9zdC91c2Job3N0Lmg+CisKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwRGF0YVBhY2tldDo6TXRwRGF0YVBhY2tldCgpCisgICAgOiAgIE10cFBhY2tldCg1MTIpLAorICAgICAgICBtT2Zmc2V0KE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpCit7Cit9CisKK010cERhdGFQYWNrZXQ6On5NdHBEYXRhUGFja2V0KCkgeworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnJlc2V0KCkgeworICAgIE10cFBhY2tldDo6cmVzZXQoKTsKKyAgICBtT2Zmc2V0ID0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpzZXRPcGVyYXRpb25Db2RlKE10cE9wZXJhdGlvbkNvZGUgY29kZSkgeworICAgIE10cFBhY2tldDo6cHV0VUludDE2KE1UUF9DT05UQUlORVJfQ09ERV9PRkZTRVQsIGNvZGUpOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnNldFRyYW5zYWN0aW9uSUQoTXRwVHJhbnNhY3Rpb25JRCBpZCkgeworICAgIE10cFBhY2tldDo6cHV0VUludDMyKE1UUF9DT05UQUlORVJfVFJBTlNBQ1RJT05fSURfT0ZGU0VULCBpZCk7Cit9CisKK3VpbnQxNl90IE10cERhdGFQYWNrZXQ6OmdldFVJbnQxNigpIHsKKyAgICBpbnQgb2Zmc2V0ID0gbU9mZnNldDsKKyAgICB1aW50MTZfdCByZXN1bHQgPSAodWludDE2X3QpbUJ1ZmZlcltvZmZzZXRdIHwgKCh1aW50MTZfdCltQnVmZmVyW29mZnNldCArIDFdIDw8IDgpOworICAgIG1PZmZzZXQgKz0gMjsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBNdHBEYXRhUGFja2V0OjpnZXRVSW50MzIoKSB7CisgICAgaW50IG9mZnNldCA9IG1PZmZzZXQ7CisgICAgdWludDMyX3QgcmVzdWx0ID0gKHVpbnQzMl90KW1CdWZmZXJbb2Zmc2V0XSB8ICgodWludDMyX3QpbUJ1ZmZlcltvZmZzZXQgKyAxXSA8PCA4KSB8CisgICAgICAgICAgICgodWludDMyX3QpbUJ1ZmZlcltvZmZzZXQgKyAyXSA8PCAxNikgIHwgKCh1aW50MzJfdCltQnVmZmVyW29mZnNldCArIDNdIDw8IDI0KTsKKyAgICBtT2Zmc2V0ICs9IDQ7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDY0X3QgTXRwRGF0YVBhY2tldDo6Z2V0VUludDY0KCkgeworICAgIGludCBvZmZzZXQgPSBtT2Zmc2V0OworICAgIHVpbnQ2NF90IHJlc3VsdCA9ICh1aW50NjRfdCltQnVmZmVyW29mZnNldF0gfCAoKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0ICsgMV0gPDwgOCkgfAorICAgICAgICAgICAoKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0ICsgMl0gPDwgMTYpIHwgKCh1aW50NjRfdCltQnVmZmVyW29mZnNldCArIDNdIDw8IDI0KSB8CisgICAgICAgICAgICgodWludDY0X3QpbUJ1ZmZlcltvZmZzZXQgKyA0XSA8PCAzMikgfCAoKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0ICsgNV0gPDwgNDApIHwKKyAgICAgICAgICAgKCh1aW50NjRfdCltQnVmZmVyW29mZnNldCArIDZdIDw8IDQ4KSAgfCAoKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0ICsgN10gPDwgNTYpOworICAgIG1PZmZzZXQgKz0gODsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OmdldFVJbnQxMjgodWludDEyOF90JiB2YWx1ZSkgeworICAgIHZhbHVlWzBdID0gZ2V0VUludDMyKCk7CisgICAgdmFsdWVbMV0gPSBnZXRVSW50MzIoKTsKKyAgICB2YWx1ZVsyXSA9IGdldFVJbnQzMigpOworICAgIHZhbHVlWzNdID0gZ2V0VUludDMyKCk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6Z2V0U3RyaW5nKE10cFN0cmluZ0J1ZmZlciYgc3RyaW5nKQoreworICAgIHN0cmluZy5yZWFkRnJvbVBhY2tldCh0aGlzKTsKK30KKworSW50OExpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFJbnQ4KCkgeworICAgIEludDhMaXN0KiByZXN1bHQgPSBuZXcgSW50OExpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0SW50OCgpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitVSW50OExpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFVSW50OCgpIHsKKyAgICBVSW50OExpc3QqIHJlc3VsdCA9IG5ldyBVSW50OExpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0VUludDgoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworSW50MTZMaXN0KiBNdHBEYXRhUGFja2V0OjpnZXRBSW50MTYoKSB7CisgICAgSW50MTZMaXN0KiByZXN1bHQgPSBuZXcgSW50MTZMaXN0OworICAgIGludCBjb3VudCA9IGdldFVJbnQzMigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcmVzdWx0LT5wdXNoKGdldEludDE2KCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1VJbnQxNkxpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFVSW50MTYoKSB7CisgICAgVUludDE2TGlzdCogcmVzdWx0ID0gbmV3IFVJbnQxNkxpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0VUludDE2KCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0ludDMyTGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QUludDMyKCkgeworICAgIEludDMyTGlzdCogcmVzdWx0ID0gbmV3IEludDMyTGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRJbnQzMigpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitVSW50MzJMaXN0KiBNdHBEYXRhUGFja2V0OjpnZXRBVUludDMyKCkgeworICAgIFVJbnQzMkxpc3QqIHJlc3VsdCA9IG5ldyBVSW50MzJMaXN0OworICAgIGludCBjb3VudCA9IGdldFVJbnQzMigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcmVzdWx0LT5wdXNoKGdldFVJbnQzMigpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitJbnQ2NExpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFJbnQ2NCgpIHsKKyAgICBJbnQ2NExpc3QqIHJlc3VsdCA9IG5ldyBJbnQ2NExpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0SW50NjQoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVUludDY0TGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QVVJbnQ2NCgpIHsKKyAgICBVSW50NjRMaXN0KiByZXN1bHQgPSBuZXcgVUludDY0TGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRVSW50NjQoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRJbnQ4KGludDhfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyAxKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCl2YWx1ZTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0VUludDgodWludDhfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyAxKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCl2YWx1ZTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0SW50MTYoaW50MTZfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyAyKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgbU9mZnNldCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBtT2Zmc2V0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFVJbnQxNih1aW50MTZfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyAyKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgbU9mZnNldCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBtT2Zmc2V0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEludDMyKGludDMyX3QgdmFsdWUpIHsKKyAgICBhbGxvY2F0ZShtT2Zmc2V0ICsgNCk7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMTYpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0VUludDMyKHVpbnQzMl90IHZhbHVlKSB7CisgICAgYWxsb2NhdGUobU9mZnNldCArIDQpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSh2YWx1ZSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDE2KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMjQpICYgMHhGRik7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgbU9mZnNldCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBtT2Zmc2V0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEludDY0KGludDY0X3QgdmFsdWUpIHsKKyAgICBhbGxvY2F0ZShtT2Zmc2V0ICsgOCk7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMTYpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDMyKSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gNDApICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA0OCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDU2KSAmIDB4RkYpOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG1PZmZzZXQpCisgICAgICAgIG1QYWNrZXRTaXplID0gbU9mZnNldDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRVSW50NjQodWludDY0X3QgdmFsdWUpIHsKKyAgICBhbGxvY2F0ZShtT2Zmc2V0ICsgOCk7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMTYpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDMyKSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gNDApICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA0OCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDU2KSAmIDB4RkYpOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG1PZmZzZXQpCisgICAgICAgIG1QYWNrZXRTaXplID0gbU9mZnNldDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRJbnQxMjgoY29uc3QgaW50MTI4X3QmIHZhbHVlKSB7CisgICAgcHV0SW50MzIodmFsdWVbMF0pOworICAgIHB1dEludDMyKHZhbHVlWzFdKTsKKyAgICBwdXRJbnQzMih2YWx1ZVsyXSk7CisgICAgcHV0SW50MzIodmFsdWVbM10pOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFVJbnQxMjgoY29uc3QgdWludDEyOF90JiB2YWx1ZSkgeworICAgIHB1dFVJbnQzMih2YWx1ZVswXSk7CisgICAgcHV0VUludDMyKHZhbHVlWzFdKTsKKyAgICBwdXRVSW50MzIodmFsdWVbMl0pOworICAgIHB1dFVJbnQzMih2YWx1ZVszXSk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0SW50MTI4KGludDY0X3QgdmFsdWUpIHsKKyAgICBwdXRJbnQ2NCh2YWx1ZSk7CisgICAgcHV0SW50NjQodmFsdWUgPCAwID8gLTEgOiAwKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRVSW50MTI4KHVpbnQ2NF90IHZhbHVlKSB7CisgICAgcHV0VUludDY0KHZhbHVlKTsKKyAgICBwdXRVSW50NjQoMCk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QUludDgoY29uc3QgaW50OF90KiB2YWx1ZXMsIGludCBjb3VudCkgeworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRJbnQ4KCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QVVJbnQ4KGNvbnN0IHVpbnQ4X3QqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dFVJbnQ4KCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QUludDE2KGNvbnN0IGludDE2X3QqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dEludDE2KCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QVVJbnQxNihjb25zdCB1aW50MTZfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0VUludDE2KCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QVVJbnQxNihjb25zdCBVSW50MTZMaXN0KiB2YWx1ZXMpIHsKKyAgICBzaXplX3QgY291bnQgPSAodmFsdWVzID8gdmFsdWVzLT5zaXplKCkgOiAwKTsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0VUludDE2KCgqdmFsdWVzKVtpXSk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QUludDMyKGNvbnN0IGludDMyX3QqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dEludDMyKCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QVVJbnQzMihjb25zdCB1aW50MzJfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0VUludDMyKCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QVVJbnQzMihjb25zdCBVSW50MzJMaXN0KiBsaXN0KSB7CisgICAgaWYgKCFsaXN0KSB7CisgICAgICAgIHB1dEVtcHR5QXJyYXkoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplX3Qgc2l6ZSA9IGxpc3QtPnNpemUoKTsKKyAgICAgICAgcHV0VUludDMyKHNpemUpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgIHB1dFVJbnQzMigoKmxpc3QpW2ldKTsKKyAgICB9Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QUludDY0KGNvbnN0IGludDY0X3QqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dEludDY0KCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0QVVJbnQ2NChjb25zdCB1aW50NjRfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0VUludDY0KCp2YWx1ZXMrKyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0U3RyaW5nKGNvbnN0IE10cFN0cmluZ0J1ZmZlciYgc3RyaW5nKSB7CisgICAgc3RyaW5nLndyaXRlVG9QYWNrZXQodGhpcyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0U3RyaW5nKGNvbnN0IGNoYXIqIHMpIHsKKyAgICBNdHBTdHJpbmdCdWZmZXIgc3RyaW5nKHMpOworICAgIHN0cmluZy53cml0ZVRvUGFja2V0KHRoaXMpOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFN0cmluZyhjb25zdCB1aW50MTZfdCogc3RyaW5nKSB7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIGlmIChzdHJpbmdbaV0pCisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcHV0VUludDgoY291bnQgPiAwID8gY291bnQgKyAxIDogMCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRVSW50MTYoc3RyaW5nW2ldKTsKKyAgICAvLyBvbmx5IHRlcm1pbmF0ZSB3aXRoIHplcm8gaWYgc3RyaW5nIGlzIG5vdCBlbXB0eQorICAgIGlmIChjb3VudCA+IDApCisgICAgICAgIHB1dFVJbnQxNigwKTsKK30KKworI2lmZGVmIE1UUF9ERVZJQ0UgCitpbnQgTXRwRGF0YVBhY2tldDo6cmVhZChpbnQgZmQpIHsKKyAgICAvLyBmaXJzdCByZWFkIHRoZSBoZWFkZXIKKyAgICBpbnQgcmV0ID0gOjpyZWFkKGZkLCBtQnVmZmVyLCBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKKyAgICBpZiAocmV0ICE9IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAvLyB0aGVuIHRoZSBmb2xsb3dpbmcgZGF0YQorICAgIGludCB0b3RhbCA9IE10cFBhY2tldDo6Z2V0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCk7CisgICAgaW50IHJlbWFpbmluZyA9IHRvdGFsIC0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRTsKKyAgICByZXQgPSA6OnJlYWQoZmQsICZtQnVmZmVyWzBdICsgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSwgcmVtYWluaW5nKTsKKyAgICBpZiAocmV0ICE9IHJlbWFpbmluZykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgbVBhY2tldFNpemUgPSB0b3RhbDsKKyAgICBtT2Zmc2V0ID0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRTsKKyAgICByZXR1cm4gdG90YWw7Cit9CisKK2ludCBNdHBEYXRhUGFja2V0OjpyZWFkRGF0YUhlYWRlcihpbnQgZmQpIHsKKyAgICBpbnQgcmV0ID0gOjpyZWFkKGZkLCBtQnVmZmVyLCBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKKyAgICBpZiAocmV0ID4gMCkKKyAgICAgICAgbVBhY2tldFNpemUgPSByZXQ7CisgICAgZWxzZQorICAgICAgICBtUGFja2V0U2l6ZSA9IDA7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IE10cERhdGFQYWNrZXQ6OndyaXRlKGludCBmZCkgeworICAgIE10cFBhY2tldDo6cHV0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCwgbVBhY2tldFNpemUpOworICAgIE10cFBhY2tldDo6cHV0VUludDE2KE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQsIE1UUF9DT05UQUlORVJfVFlQRV9EQVRBKTsKKyAgICBkdW1wKCk7CisgICAgLy8gc2VuZCBoZWFkZXIgc2VwYXJhdGVseSBmcm9tIGRhdGEKKyAgICBpbnQgcmV0ID0gOjp3cml0ZShmZCwgbUJ1ZmZlciwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgaWYgKHJldCA9PSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKQorICAgICAgICByZXQgPSA6OndyaXRlKGZkLCBtQnVmZmVyICsgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYWNrZXRTaXplIC0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgcmV0dXJuIChyZXQgPCAwID8gcmV0IDogMCk7Cit9CisKK2ludCBNdHBEYXRhUGFja2V0Ojp3cml0ZURhdGFIZWFkZXIoaW50IGZkLCB1aW50MzJfdCBsZW5ndGgpIHsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQsIGxlbmd0aCk7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX0RBVEEpOworICAgIGludCByZXQgPSA6OndyaXRlKGZkLCBtQnVmZmVyLCBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKKyAgICByZXR1cm4gKHJldCA8IDAgPyByZXQgOiAwKTsKK30KKyNlbmRpZiAvLyBNVFBfREVWSUNFCisKKyNpZmRlZiBNVFBfSE9TVAoraW50IE10cERhdGFQYWNrZXQ6OnJlYWQoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApIHsKKyAgICAvLyBmaXJzdCByZWFkIHRoZSBoZWFkZXIKKyAgICBpbnQgbGVuZ3RoID0gdHJhbnNmZXIoZXAsIG1CdWZmZXIsIG1CdWZmZXJTaXplKTsKKyAgICBpZiAobGVuZ3RoID49IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgLy8gbG9vayBhdCB0aGUgbGVuZ3RoIGZpZWxkIHRvIHNlZSBpZiB0aGUgZGF0YSBzcGFucyBtdWx0aXBsZSBwYWNrZXRzCisgICAgICAgIHVpbnQzMl90IHRvdGFsTGVuZ3RoID0gTXRwUGFja2V0OjpnZXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VUKTsKKyAgICAgICAgd2hpbGUgKHRvdGFsTGVuZ3RoID4gbGVuZ3RoKSB7CisgICAgICAgICAgICBhbGxvY2F0ZShsZW5ndGggKyBtQWxsb2NhdGlvbkluY3JlbWVudCk7CisgICAgICAgICAgICBpbnQgcmV0ID0gdHJhbnNmZXIoZXAsIG1CdWZmZXIgKyBsZW5ndGgsIG1BbGxvY2F0aW9uSW5jcmVtZW50KTsKKyAgICAgICAgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgICAgICAgICBsZW5ndGggKz0gcmV0OworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbGVuZ3RoID0gcmV0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChsZW5ndGggPj0gMCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBsZW5ndGg7CisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworaW50IE10cERhdGFQYWNrZXQ6OnJlYWREYXRhKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwLCB2b2lkKiBidWZmZXIsIGludCBsZW5ndGgpIHsKKyAgICBpbnQgcGFja2V0U2l6ZSA9IHVzYl9lbmRwb2ludF9tYXhfcGFja2V0KGVwKTsKKyAgICBpbnQgcmVhZCA9IDA7CisgICAgd2hpbGUgKHJlYWQgPCBsZW5ndGgpIHsKKyAgICAgICAgaW50IHJldCA9IHRyYW5zZmVyKGVwLCAoY2hhciAqKWJ1ZmZlciArIHJlYWQsIHBhY2tldFNpemUpOworICAgICAgICBpZiAocmV0IDwgMCkgeworcHJpbnRmKCJNdHBEYXRhUGFja2V0OjpyZWFkRGF0YSByZXR1cm5pbmcgJWRcbiIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJlYWQgKz0gcmV0OworICAgIH0KK3ByaW50ZigiTXRwRGF0YVBhY2tldDo6cmVhZERhdGEgcmV0dXJuaW5nICVkXG4iLCByZWFkKTsKKyAgICByZXR1cm4gcmVhZDsKK30KKworaW50IE10cERhdGFQYWNrZXQ6OnJlYWREYXRhSGVhZGVyKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKSB7CisgICAgaW50IGxlbmd0aCA9IHRyYW5zZmVyKGVwLCBtQnVmZmVyLCB1c2JfZW5kcG9pbnRfbWF4X3BhY2tldChlcCkpOworICAgIGlmIChsZW5ndGggPj0gMCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBsZW5ndGg7CisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworaW50IE10cERhdGFQYWNrZXQ6OndyaXRlRGF0YUhlYWRlcihzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCwgdWludDMyX3QgbGVuZ3RoKSB7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBsZW5ndGgpOworICAgIE10cFBhY2tldDo6cHV0VUludDE2KE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQsIE1UUF9DT05UQUlORVJfVFlQRV9EQVRBKTsKKyAgICBpbnQgcmV0ID0gdHJhbnNmZXIoZXAsIG1CdWZmZXIsIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOworfQorCitpbnQgTXRwRGF0YVBhY2tldDo6d3JpdGUoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApIHsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQsIG1QYWNrZXRTaXplKTsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX1RZUEVfT0ZGU0VULCBNVFBfQ09OVEFJTkVSX1RZUEVfREFUQSk7CisKKyAgICAvLyBzZW5kIGhlYWRlciBzZXBhcmF0ZWx5IGZyb20gZGF0YQorICAgIGludCByZXQgPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgaWYgKHJldCA9PSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKQorICAgICAgICByZXQgPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciArIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2V0U2l6ZSAtIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOworfQorCitpbnQgTXRwRGF0YVBhY2tldDo6d3JpdGUoc3RydWN0IHVzYl9lbmRwb2ludCAqZXAsIHZvaWQqIGJ1ZmZlciwgdWludDMyX3QgbGVuZ3RoKSB7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IHBhY2tldFNpemUgPSB1c2JfZW5kcG9pbnRfbWF4X3BhY2tldChlcCk7CisgICAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgaW50IHdyaXRlID0gKGxlbmd0aCA+IHBhY2tldFNpemUgPyBwYWNrZXRTaXplIDogbGVuZ3RoKTsKKyAgICAgICAgaW50IHJldCA9IHRyYW5zZmVyKGVwLCBidWZmZXIsIHdyaXRlKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbGVuZ3RoIC09IHJldDsKKyAgICB9CisgICAgcmV0dXJuIChyZXQgPCAwID8gcmV0IDogMCk7Cit9CisKKyNlbmRpZiAvLyBNVFBfSE9TVAorCit2b2lkKiBNdHBEYXRhUGFja2V0OjpnZXREYXRhKGludCYgb3V0TGVuZ3RoKSBjb25zdCB7CisgICAgaW50IGxlbmd0aCA9IG1QYWNrZXRTaXplIC0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRTsKKyAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgICB2b2lkKiByZXN1bHQgPSBtYWxsb2MobGVuZ3RoKTsKKyAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgbWVtY3B5KHJlc3VsdCwgbUJ1ZmZlciArIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUsIGxlbmd0aCk7CisgICAgICAgICAgICBvdXRMZW5ndGggPSBsZW5ndGg7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorICAgIG91dExlbmd0aCA9IDA7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5oIGIvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWI2YTA3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuaApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9EQVRBX1BBQ0tFVF9ICisjZGVmaW5lIF9NVFBfREFUQV9QQUNLRVRfSAorCisjaW5jbHVkZSAiTXRwUGFja2V0LmgiCisjaW5jbHVkZSAibXRwLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwU3RyaW5nQnVmZmVyOworCitjbGFzcyBNdHBEYXRhUGFja2V0IDogcHVibGljIE10cFBhY2tldCB7Citwcml2YXRlOgorICAgIC8vIGN1cnJlbnQgb2Zmc2V0IGZvciBnZXQvcHV0IG1ldGhvZHMKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1PZmZzZXQ7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQoKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBEYXRhUGFja2V0KCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlc2V0KCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNldE9wZXJhdGlvbkNvZGUoTXRwT3BlcmF0aW9uQ29kZSBjb2RlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNldFRyYW5zYWN0aW9uSUQoTXRwVHJhbnNhY3Rpb25JRCBpZCk7CisKKyAgICBpbmxpbmUgdWludDhfdCAgICAgIGdldFVJbnQ4KCkgeyByZXR1cm4gKHVpbnQ4X3QpbUJ1ZmZlclttT2Zmc2V0KytdOyB9CisgICAgaW5saW5lIGludDhfdCAgICAgICBnZXRJbnQ4KCkgeyByZXR1cm4gKGludDhfdCltQnVmZmVyW21PZmZzZXQrK107IH0KKyAgICB1aW50MTZfdCAgICAgICAgICAgIGdldFVJbnQxNigpOworICAgIGlubGluZSBpbnQxNl90ICAgICAgZ2V0SW50MTYoKSB7IHJldHVybiAoaW50MTZfdClnZXRVSW50MTYoKTsgfQorICAgIHVpbnQzMl90ICAgICAgICAgICAgZ2V0VUludDMyKCk7CisgICAgaW5saW5lIGludDMyX3QgICAgICBnZXRJbnQzMigpIHsgcmV0dXJuIChpbnQzMl90KWdldFVJbnQzMigpOyB9CisgICAgdWludDY0X3QgICAgICAgICAgICBnZXRVSW50NjQoKTsKKyAgICBpbmxpbmUgaW50NjRfdCAgICAgIGdldEludDY0KCkgeyByZXR1cm4gKGludDY0X3QpZ2V0VUludDY0KCk7IH0KKyAgICB2b2lkICAgICAgICAgICAgICAgIGdldFVJbnQxMjgodWludDEyOF90JiB2YWx1ZSk7CisgICAgaW5saW5lIHZvaWQgICAgICAgICBnZXRJbnQxMjgoaW50MTI4X3QmIHZhbHVlKSB7IGdldFVJbnQxMjgoKHVpbnQxMjhfdCYpdmFsdWUpOyB9CisgICAgdm9pZCAgICAgICAgICAgICAgICBnZXRTdHJpbmcoTXRwU3RyaW5nQnVmZmVyJiBzdHJpbmcpOworCisgICAgSW50OExpc3QqICAgICAgICAgICBnZXRBSW50OCgpOworICAgIFVJbnQ4TGlzdCogICAgICAgICAgZ2V0QVVJbnQ4KCk7CisgICAgSW50MTZMaXN0KiAgICAgICAgICBnZXRBSW50MTYoKTsKKyAgICBVSW50MTZMaXN0KiAgICAgICAgIGdldEFVSW50MTYoKTsKKyAgICBJbnQzMkxpc3QqICAgICAgICAgIGdldEFJbnQzMigpOworICAgIFVJbnQzMkxpc3QqICAgICAgICAgZ2V0QVVJbnQzMigpOworICAgIEludDY0TGlzdCogICAgICAgICAgZ2V0QUludDY0KCk7CisgICAgVUludDY0TGlzdCogICAgICAgICBnZXRBVUludDY0KCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEludDgoaW50OF90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFVJbnQ4KHVpbnQ4X3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0SW50MTYoaW50MTZfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRVSW50MTYodWludDE2X3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0SW50MzIoaW50MzJfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRVSW50MzIodWludDMyX3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0SW50NjQoaW50NjRfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRVSW50NjQodWludDY0X3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0SW50MTI4KGNvbnN0IGludDEyOF90JiB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRVSW50MTI4KGNvbnN0IHVpbnQxMjhfdCYgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0SW50MTI4KGludDY0X3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDEyOCh1aW50NjRfdCB2YWx1ZSk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFJbnQ4KGNvbnN0IGludDhfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QVVJbnQ4KGNvbnN0IHVpbnQ4X3QqIHZhbHVlcywgaW50IGNvdW50KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFJbnQxNihjb25zdCBpbnQxNl90KiB2YWx1ZXMsIGludCBjb3VudCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBVUludDE2KGNvbnN0IHVpbnQxNl90KiB2YWx1ZXMsIGludCBjb3VudCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBVUludDE2KGNvbnN0IFVJbnQxNkxpc3QqIHZhbHVlcyk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBSW50MzIoY29uc3QgaW50MzJfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QVVJbnQzMihjb25zdCB1aW50MzJfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QVVJbnQzMihjb25zdCBVSW50MzJMaXN0KiBsaXN0KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFJbnQ2NChjb25zdCBpbnQ2NF90KiB2YWx1ZXMsIGludCBjb3VudCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBVUludDY0KGNvbnN0IHVpbnQ2NF90KiB2YWx1ZXMsIGludCBjb3VudCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRTdHJpbmcoY29uc3QgTXRwU3RyaW5nQnVmZmVyJiBzdHJpbmcpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0U3RyaW5nKGNvbnN0IGNoYXIqIHN0cmluZyk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRTdHJpbmcoY29uc3QgdWludDE2X3QqIHN0cmluZyk7CisgICAgaW5saW5lIHZvaWQgICAgICAgICBwdXRFbXB0eVN0cmluZygpIHsgcHV0VUludDgoMCk7IH0KKyAgICBpbmxpbmUgdm9pZCAgICAgICAgIHB1dEVtcHR5QXJyYXkoKSB7IHB1dFVJbnQzMigwKTsgfQorCisKKyNpZmRlZiBNVFBfREVWSUNFCisgICAgLy8gZmlsbCBvdXIgYnVmZmVyIHdpdGggZGF0YSBmcm9tIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlYWQoaW50IGZkKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlYWREYXRhSGVhZGVyKGludCBmZCk7CisKKyAgICAvLyB3cml0ZSBvdXIgZGF0YSB0byB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZShpbnQgZmQpOworICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGVEYXRhSGVhZGVyKGludCBmZCwgdWludDMyX3QgbGVuZ3RoKTsKKyNlbmRpZgorCisjaWZkZWYgTVRQX0hPU1QKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlYWQoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApOworICAgIGludCAgICAgICAgICAgICAgICAgcmVhZERhdGEoc3RydWN0IHVzYl9lbmRwb2ludCAqZXAsIHZvaWQqIGJ1ZmZlciwgaW50IGxlbmd0aCk7CisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkRGF0YUhlYWRlcihzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCk7CisKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlRGF0YUhlYWRlcihzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCwgdWludDMyX3QgbGVuZ3RoKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwLCB2b2lkKiBidWZmZXIsIHVpbnQzMl90IGxlbmd0aCk7CisjZW5kaWYKKworICAgIGlubGluZSBib29sICAgICAgICAgaGFzRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1QYWNrZXRTaXplID4gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRTsgfQorICAgIHZvaWQqICAgICAgICAgICAgICAgZ2V0RGF0YShpbnQmIG91dExlbmd0aCkgY29uc3Q7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9EQVRBX1BBQ0tFVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuaCBiL21lZGlhL210cC9NdHBEYXRhYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4Y2IwMTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9EQVRBQkFTRV9ICisjZGVmaW5lIF9NVFBfREFUQUJBU0VfSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworY2xhc3MgTXRwUHJvcGVydHk7CisKK2NsYXNzIE10cERhdGFiYXNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5NdHBEYXRhYmFzZSgpIHt9CisKKyAgICAvLyBjYWxsZWQgZnJvbSBTZW5kT2JqZWN0SW5mbyB0byByZXNlcnZlIGEgZGF0YWJhc2UgZW50cnkgZm9yIHRoZSBpbmNvbWluZyBmaWxlCisgICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGUgICAgICAgICBiZWdpblNlbmRPYmplY3QoY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBtb2RpZmllZCkgPSAwOworCisgICAgLy8gY2FsbGVkIHRvIHJlcG9ydCBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgdGhlIFNlbmRPYmplY3QgZmlsZSB0cmFuc2ZlcgorICAgIC8vIHN1Y2Nlc3Mgc2hvdWxkIHNpZ25hbCBhIG5vdGlmaWNhdGlvbiBvZiB0aGUgbmV3IG9iamVjdCdzIGNyZWF0aW9uLAorICAgIC8vIGZhaWx1cmUgc2hvdWxkIHJlbW92ZSB0aGUgZGF0YWJhc2UgZW50cnkgY3JlYXRlZCBpbiBiZWdpblNlbmRPYmplY3QKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGVuZFNlbmRPYmplY3QoY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZWVkZWQpID0gMDsKKworICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlTGlzdCogICAgZ2V0T2JqZWN0TGlzdChNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KSA9IDA7CisKKyAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICAgICAgICAgIGdldE51bU9iamVjdHMoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgPSAwOworCisgICAgLy8gY2FsbGVlIHNob3VsZCBkZWxldGVbXSB0aGUgcmVzdWx0cyBmcm9tIHRoZXNlCisgICAgLy8gcmVzdWx0cyBjYW4gYmUgTlVMTAorICAgIHZpcnR1YWwgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzKCkgPSAwOworICAgIHZpcnR1YWwgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMoKSA9IDA7CisgICAgdmlydHVhbCBNdHBPYmplY3RQcm9wZXJ0eUxpc3QqICBnZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzKE10cE9iamVjdEZvcm1hdCBmb3JtYXQpID0gMDsKKyAgICB2aXJ0dWFsIE10cERldmljZVByb3BlcnR5TGlzdCogIGdldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMoKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdFByb3BlcnR5VmFsdWUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBzZXRPYmplY3RQcm9wZXJ0eVZhbHVlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0RGV2aWNlUHJvcGVydHlWYWx1ZShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIHNldERldmljZVByb3BlcnR5VmFsdWUoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICByZXNldERldmljZVByb3BlcnR5KE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdEZpbGVQYXRoKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZyYgZmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QmIGZpbGVMZW5ndGgpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZGVsZXRlRmlsZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cE9iamVjdEhhbmRsZUxpc3QqICAgIGdldE9iamVjdFJlZmVyZW5jZXMoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBzZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIHJlZmVyZW5jZXMpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUHJvcGVydHkqICAgICAgICAgICAgZ2V0T2JqZWN0UHJvcGVydHlEZXNjKE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0KSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFByb3BlcnR5KiAgICAgICAgICAgIGdldERldmljZVByb3BlcnR5RGVzYyhNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSkgPSAwOworCisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBzZXNzaW9uU3RhcnRlZCgpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbkVuZGVkKCkgPSAwOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfREFUQUJBU0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERlYnVnLmNwcCBiL21lZGlhL210cC9NdHBEZWJ1Zy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZiMTA3ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZWJ1Zy5jcHAKQEAgLTAsMCArMSwzODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQ29kZUVudHJ5IHsKKyAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIHVpbnQxNl90IGNvZGU7Cit9OworCitzdGF0aWMgY29uc3QgQ29kZUVudHJ5IHNPcGVyYXRpb25Db2Rlc1tdID0geworICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9JTkZPIiwgICAgICAgICAgICAgIDB4MTAwMSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fT1BFTl9TRVNTSU9OIiwgICAgICAgICAgICAgICAgIDB4MTAwMiB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fQ0xPU0VfU0VTU0lPTiIsICAgICAgICAgICAgICAgIDB4MTAwMyB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSURTIiwgICAgICAgICAgICAgIDB4MTAwNCB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSU5GTyIsICAgICAgICAgICAgIDB4MTAwNSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX05VTV9PQkpFQ1RTIiwgICAgICAgICAgICAgIDB4MTAwNiB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9IQU5ETEVTIiwgICAgICAgICAgIDB4MTAwNyB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9JTkZPIiwgICAgICAgICAgICAgIDB4MTAwOCB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX09CSkVDVCIsICAgICAgICAgICAgICAgICAgIDB4MTAwOSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX1RIVU1CIiwgICAgICAgICAgICAgICAgICAgIDB4MTAwQSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fREVMRVRFX09CSkVDVCIsICAgICAgICAgICAgICAgIDB4MTAwQiB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1RfSU5GTyIsICAgICAgICAgICAgIDB4MTAwQyB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1QiLCAgICAgICAgICAgICAgICAgIDB4MTAwRCB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fSU5JVElBVEVfQ0FQVFVSRSIsICAgICAgICAgICAgIDB4MTAwRSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fRk9STUFUX1NUT1JFIiwgICAgICAgICAgICAgICAgIDB4MTAwRiB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fUkVTRVRfREVWSUNFIiwgICAgICAgICAgICAgICAgIDB4MTAxMCB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fU0VMRl9URVNUIiwgICAgICAgICAgICAgICAgICAgIDB4MTAxMSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9QUk9URUNUSU9OIiwgICAgICAgIDB4MTAxMiB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fUE9XRVJfRE9XTiIsICAgICAgICAgICAgICAgICAgIDB4MTAxMyB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX0RFU0MiLCAgICAgICAgIDB4MTAxNCB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX1ZBTFVFIiwgICAgICAgIDB4MTAxNSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fU0VUX0RFVklDRV9QUk9QX1ZBTFVFIiwgICAgICAgIDB4MTAxNiB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fUkVTRVRfREVWSUNFX1BST1BfVkFMVUUiLCAgICAgIDB4MTAxNyB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fVEVSTUlOQVRFX09QRU5fQ0FQVFVSRSIsICAgICAgIDB4MTAxOCB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fTU9WRV9PQkpFQ1QiLCAgICAgICAgICAgICAgICAgIDB4MTAxOSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fQ09QWV9PQkpFQ1QiLCAgICAgICAgICAgICAgICAgIDB4MTAxQSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX1BBUlRJQUxfT0JKRUNUIiwgICAgICAgICAgIDB4MTAxQiB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fSU5JVElBVEVfT1BFTl9DQVBUVVJFIiwgICAgICAgIDB4MTAxQyB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QU19TVVBQT1JURUQiLCAgIDB4OTgwMSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX0RFU0MiLCAgICAgICAgIDB4OTgwMiB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX1ZBTFVFIiwgICAgICAgIDB4OTgwMyB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9QUk9QX1ZBTFVFIiwgICAgICAgIDB4OTgwNCB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9SRUZFUkVOQ0VTIiwgICAgICAgIDB4OTgxMCB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9SRUZFUkVOQ0VTIiwgICAgICAgIDB4OTgxMSB9LAorICAgIHsgIk1UUF9PUEVSQVRJT05fU0tJUCIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTgyMCB9LAorICAgIHsgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICB9LAorfTsKKworc3RhdGljIGNvbnN0IENvZGVFbnRyeSBzRm9ybWF0Q29kZXNbXSA9IHsKKyAgICB7ICJNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTyIsICAgICAgICAgICAgICAweDEwMDEgfSwKKyAgICB7ICJNVFBfRk9STUFUX1VOREVGSU5FRCIsICAgICAgICAgICAgICAgICAgICAgICAweDMwMDAgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FTU09DSUFUSU9OIiwgICAgICAgICAgICAgICAgICAgICAweDMwMDEgfSwKKyAgICB7ICJNVFBfRk9STUFUX1NDUklQVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDIgfSwKKyAgICB7ICJNVFBfRk9STUFUX0VYRUNVVEFCTEUiLCAgICAgICAgICAgICAgICAgICAgICAweDMwMDMgfSwKKyAgICB7ICJNVFBfRk9STUFUX1RFWFQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDQgfSwKKyAgICB7ICJNVFBfRk9STUFUX0hUTUwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDUgfSwKKyAgICB7ICJNVFBfRk9STUFUX0RQT0YiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDYgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FJRkYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDcgfSwKKyAgICB7ICJNVFBfRk9STUFUX1dBViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDggfSwKKyAgICB7ICJNVFBfRk9STUFUX01QMyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDkgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FWSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMEEgfSwKKyAgICB7ICJNVFBfRk9STUFUX01QRUciLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMEIgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FTRiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMEMgfSwKKyAgICB7ICJNVFBfRk9STUFUX0RFRklORUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDAgfSwKKyAgICB7ICJNVFBfRk9STUFUX0VYSUZfSlBFRyIsICAgICAgICAgICAgICAgICAgICAgICAweDM4MDEgfSwKKyAgICB7ICJNVFBfRk9STUFUX1RJRkZfRVAiLCAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDIgfSwKKyAgICB7ICJNVFBfRk9STUFUX0ZMQVNIUElYIiwgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDMgfSwKKyAgICB7ICJNVFBfRk9STUFUX0JNUCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDQgfSwKKyAgICB7ICJNVFBfRk9STUFUX0NJRkYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDUgfSwKKyAgICB7ICJNVFBfRk9STUFUX0dJRiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDcgfSwKKyAgICB7ICJNVFBfRk9STUFUX0pGSUYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDggfSwKKyAgICB7ICJNVFBfRk9STUFUX0NEIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDkgfSwKKyAgICB7ICJNVFBfRk9STUFUX1BJQ1QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEEgfSwKKyAgICB7ICJNVFBfRk9STUFUX1BORyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEIgfSwKKyAgICB7ICJNVFBfRk9STUFUX1RJRkYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEQgfSwKKyAgICB7ICJNVFBfRk9STUFUX1RJRkZfSVQiLCAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEUgfSwKKyAgICB7ICJNVFBfRk9STUFUX0pQMiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEYgfSwKKyAgICB7ICJNVFBfRk9STUFUX0pQWCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MTAgfSwKKyAgICB7ICJNVFBfRk9STUFUX1VOREVGSU5FRF9GSVJNV0FSRSIsICAgICAgICAgICAgICAweEI4MDIgfSwKKyAgICB7ICJNVFBfRk9STUFUX1dJTkRPV1NfSU1BR0VfRk9STUFUIiwgICAgICAgICAgICAweEI4ODEgfSwKKyAgICB7ICJNVFBfRk9STUFUX1VOREVGSU5FRF9BVURJTyIsICAgICAgICAgICAgICAgICAweEI5MDAgfSwKKyAgICB7ICJNVFBfRk9STUFUX1dNQSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDEgfSwKKyAgICB7ICJNVFBfRk9STUFUX09HRyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDIgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FBQyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDMgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FVRElCTEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDQgfSwKKyAgICB7ICJNVFBfRk9STUFUX0ZMQUMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDYgfSwKKyAgICB7ICJNVFBfRk9STUFUX1VOREVGSU5FRF9WSURFTyIsICAgICAgICAgICAgICAgICAweEI5ODAgfSwKKyAgICB7ICJNVFBfRk9STUFUX1dNViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5ODEgfSwKKyAgICB7ICJNVFBfRk9STUFUX01QNF9DT05UQUlORVIiLCAgICAgICAgICAgICAgICAgICAweEI5ODIgfSwKKyAgICB7ICJNVFBfRk9STUFUX01QMiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5ODMgfSwKKyAgICB7ICJNVFBfRk9STUFUXzNHUF9DT05UQUlORVIiLCAgICAgICAgICAgICAgICAgICAweEI5ODQgfSwKKyAgICB7ICJNVFBfRk9STUFUX1VOREVGSU5FRF9DT0xMRUNUSU9OIiwgICAgICAgICAgICAweEJBMDAgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX01VTFRJTUVESUFfQUxCVU0iLCAgICAgICAweEJBMDEgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX0lNQUdFX0FMQlVNIiwgICAgICAgICAgICAweEJBMDIgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX0FVRElPX0FMQlVNIiwgICAgICAgICAgICAweEJBMDMgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX1ZJREVPX0FMQlVNIiwgICAgICAgICAgICAweEJBMDQgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX0FWX1BMQVlMSVNUIiwgICAgICAgICAgICAweEJBMDUgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX0NPTlRBQ1RfR1JPVVAiLCAgICAgICAgICAweEJBMDYgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX01FU1NBR0VfRk9MREVSIiwgICAgICAgICAweEJBMDcgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX0NIQVBURVJFRF9QUk9EVUNUSU9OIiwgICAweEJBMDggfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX0FVRElPX1BMQVlMSVNUIiwgICAgICAgICAweEJBMDkgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX1ZJREVPX1BMQVlMSVNUIiwgICAgICAgICAweEJBMEEgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX01FRElBQ0FTVCIsICAgICAgICAgICAgICAweEJBMEIgfSwKKyAgICB7ICJNVFBfRk9STUFUX1dQTF9QTEFZTElTVCIsICAgICAgICAgICAgICAgICAgICAweEJBMTAgfSwKKyAgICB7ICJNVFBfRk9STUFUX00zVV9QTEFZTElTVCIsICAgICAgICAgICAgICAgICAgICAweEJBMTEgfSwKKyAgICB7ICJNVFBfRk9STUFUX01QTF9QTEFZTElTVCIsICAgICAgICAgICAgICAgICAgICAweEJBMTIgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FTWF9QTEFZTElTVCIsICAgICAgICAgICAgICAgICAgICAweEJBMTMgfSwKKyAgICB7ICJNVFBfRk9STUFUX1BMU19QTEFZTElTVCIsICAgICAgICAgICAgICAgICAgICAweEJBMTQgfSwKKyAgICB7ICJNVFBfRk9STUFUX1VOREVGSU5FRF9ET0NVTUVOVCIsICAgICAgICAgICAgICAweEJBODAgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX0RPQ1VNRU5UIiwgICAgICAgICAgICAgICAweEJBODEgfSwKKyAgICB7ICJNVFBfRk9STUFUX1hNTF9ET0NVTUVOVCIsICAgICAgICAgICAgICAgICAgICAweEJBODIgfSwKKyAgICB7ICJNVFBfRk9STUFUX01TX1dPUkRfRE9DVU1FTlQiLCAgICAgICAgICAgICAgICAweEJBODMgfSwKKyAgICB7ICJNVFBfRk9STUFUX01IVF9DT01QSUxFRF9IVE1MX0RPQ1VNRU5UIiwgICAgICAweEJBODQgfSwKKyAgICB7ICJNVFBfRk9STUFUX01TX0VYQ0VMX1NQUkVBRFNIRUVUIiwgICAgICAgICAgICAweEJBODUgfSwKKyAgICB7ICJNVFBfRk9STUFUX01TX1BPV0VSUE9JTlRfUFJFU0VOVEFUSU9OIiwgICAgICAweEJBODYgfSwKKyAgICB7ICJNVFBfRk9STUFUX1VOREVGSU5FRF9NRVNTQUdFIiwgICAgICAgICAgICAgICAweEJCMDAgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX01FU1NTQUdFIiwgICAgICAgICAgICAgICAweEJCMDEgfSwKKyAgICB7ICJNVFBfRk9STUFUX1VOREVGSU5FRF9DT05UQUNUIiwgICAgICAgICAgICAgICAweEJCODAgfSwKKyAgICB7ICJNVFBfRk9STUFUX0FCU1RSQUNUX0NPTlRBQ1QiLCAgICAgICAgICAgICAgICAweEJCODEgfSwKKyAgICB7ICJNVFBfRk9STUFUX1ZDQVJEXzIiLCAgICAgICAgICAgICAgICAgICAgICAgICAweEJCODIgfSwKKyAgICB7IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgfSwKK307CisKK3N0YXRpYyBjb25zdCBDb2RlRW50cnkgc09iamVjdFByb3BDb2Rlc1tdID0geworICAgIHsgIk1UUF9QUk9QRVJUWV9TVE9SQUdFX0lEIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwMSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9PQkpFQ1RfRk9STUFUIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwMiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QUk9URUNUSU9OX1NUQVRVUyIsICAgICAgICAgICAgICAgICAgICAgIDB4REMwMyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9PQkpFQ1RfU0laRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwNCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BU1NPQ0lBVElPTl9UWVBFIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REMwNSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BU1NPQ0lBVElPTl9ERVNDIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REMwNiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REMwNyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9EQVRFX0NSRUFURUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwOCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9EQVRFX01PRElGSUVEIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwOSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9LRVlXT1JEUyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwQSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QQVJFTlRfT0JKRUNUIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwQiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BTExPV0VEX0ZPTERFUl9DT05URU5UUyIsICAgICAgICAgICAgICAgIDB4REMwQyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9ISURERU4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwRCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TWVNURU1fT0JKRUNUIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwRSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QRVJTSVNURU5UX1VJRCIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0MSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TWU5DX0lEIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0MiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QUk9QRVJUWV9CQUciLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0MyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9OQU1FIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0NCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9DUkVBVEVEX0JZIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0NSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BUlRJU1QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0NiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9EQVRFX0FVVEhPUkVEIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0NyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9ERVNDUklQVElPTiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0OCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9VUkxfUkVGRVJFTkNFIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0OSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9MQU5HVUFHRV9MT0NBTEUiLCAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0QSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9DT1BZUklHSFRfSU5GT1JNQVRJT04iLCAgICAgICAgICAgICAgICAgIDB4REM0QiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TT1VSQ0UiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0QyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9PUklHSU5fTE9DQVRJT04iLCAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0RCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9EQVRFX0FEREVEIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0RSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9OT05fQ09OU1VNQUJMRSIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0RiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9DT1JSVVBUX1VOUExBWUFCTEUiLCAgICAgICAgICAgICAgICAgICAgIDB4REM1MCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QUk9EVUNFUl9TRVJJQUxfTlVNQkVSIiwgICAgICAgICAgICAgICAgIDB4REM1MSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfRk9STUFUIiwgICAgICAgICAgIDB4REM4MSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfU0laRSIsICAgICAgICAgICAgIDB4REM4MiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfSEVJR0hUIiwgICAgICAgICAgIDB4REM4MyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfV0lEVEgiLCAgICAgICAgICAgIDB4REM4NCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfRFVSQVRJT04iLCAgICAgICAgIDB4REM4NSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfREFUQSIsICAgICAgICAgICAgIDB4REM4NiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9XSURUSCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4NyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9IRUlHSFQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4OCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9EVVJBVElPTiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4OSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9SQVRJTkciLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4QSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9UUkFDSyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4QiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9HRU5SRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4QyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9DUkVESVRTIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4RCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9MWVJJQ1MiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4RSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TVUJTQ1JJUFRJT05fQ09OVEVOVF9JRCIsICAgICAgICAgICAgICAgIDB4REM4RiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QUk9EVUNFRF9CWSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5MCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9VU0VfQ09VTlQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5MSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TS0lQX0NPVU5UIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5MiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9MQVNUX0FDQ0VTU0VEIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5MyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QQVJFTlRBTF9SQVRJTkciLCAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5NCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9NRVRBX0dFTlJFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5NSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9DT01QT1NFUiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5NiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FRkZFQ1RJVkVfUkFUSU5HIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REM5NyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TVUJUSVRMRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5OCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9PUklHSU5BTF9SRUxFQVNFX0RBVEUiLCAgICAgICAgICAgICAgICAgIDB4REM5OSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BTEJVTV9OQU1FIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5QSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BTEJVTV9BUlRJU1QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5QiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9NT09EIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5QyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9EUk1fU1RBVFVTIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5RCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TVUJfREVTQ1JJUFRJT04iLCAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5RSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9JU19DUk9QUEVEIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENEMSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9JU19DT0xPVVJfQ09SUkVDVEVEIiwgICAgICAgICAgICAgICAgICAgIDB4RENEMiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9JTUFHRV9CSVRfREVQVEgiLCAgICAgICAgICAgICAgICAgICAgICAgIDB4RENEMyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9GX05VTUJFUiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENENCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FWFBPU1VSRV9USU1FIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENENSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FWFBPU1VSRV9JTkRFWCIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENENiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9UT1RBTF9CSVRSQVRFIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5MSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9CSVRSQVRFX1RZUEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5MiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TQU1QTEVfUkFURSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5MyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9OVU1CRVJfT0ZfQ0hBTk5FTFMiLCAgICAgICAgICAgICAgICAgICAgIDB4REU5NCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BVURJT19CSVRfREVQVEgiLCAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5NSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TQ0FOX1RZUEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5NyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BVURJT19XQVZFX0NPREVDIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REU5OSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BVURJT19CSVRSQVRFIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5QSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9WSURFT19GT1VSQ0NfQ09ERUMiLCAgICAgICAgICAgICAgICAgICAgIDB4REU5QiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9WSURFT19CSVRSQVRFIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5QyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9GUkFNRVNfUEVSX1RIT1VTQU5EX1NFQ09ORFMiLCAgICAgICAgICAgIDB4REU5RCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9LRVlGUkFNRV9ESVNUQU5DRSIsICAgICAgICAgICAgICAgICAgICAgIDB4REU5RSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9CVUZGRVJfU0laRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5RiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FTkNPRElOR19RVUFMSVRZIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REVBMCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FTkNPRElOR19QUk9GSUxFIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REVBMSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9ESVNQTEFZX05BTUUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENFMCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9CT0RZX1RFWFQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENFMSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TVUJKRUNUIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENFMiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QUklPUklUWSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENFMyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9HSVZFTl9OQU1FIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwMCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9NSURETEVfTkFNRVMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwMSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9GQU1JTFlfTkFNRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwMiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QUkVGSVgiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwMyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9TVUZGSVgiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwNCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORVRJQ19HSVZFTl9OQU1FIiwgICAgICAgICAgICAgICAgICAgIDB4REQwNSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORVRJQ19GQU1JTFlfTkFNRSIsICAgICAgICAgICAgICAgICAgIDB4REQwNiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FTUFJTF9QUklNQVJZIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwNyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FTUFJTF9QRVJTT05BTF8xIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REQwOCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FTUFJTF9QRVJTT05BTF8yIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REQwOSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FTUFJTF9CVVNJTkVTU18xIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REQwQSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FTUFJTF9CVVNJTkVTU18yIiwgICAgICAgICAgICAgICAgICAgICAgIDB4REQwQiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FTUFJTF9PVEhFUlMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwQyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfUFJJTUFSWSIsICAgICAgICAgICAgICAgICAgIDB4REQwRCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfUEVSU09OQUwiLCAgICAgICAgICAgICAgICAgIDB4REQwRSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfUEVSU09OQUxfMiIsICAgICAgICAgICAgICAgIDB4REQwRiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfQlVTSU5FU1MiLCAgICAgICAgICAgICAgICAgIDB4REQxMCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfQlVTSU5FU1NfMiIsICAgICAgICAgICAgICAgIDB4REQxMSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfTU9CSUxFIiwgICAgICAgICAgICAgICAgICAgIDB4REQxMiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfTU9CSUxFXzIiLCAgICAgICAgICAgICAgICAgIDB4REQxMyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9GQVhfTlVNQkVSX1BSSU1BUlkiLCAgICAgICAgICAgICAgICAgICAgIDB4REQxNCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9GQVhfTlVNQkVSX1BFUlNPTkFMIiwgICAgICAgICAgICAgICAgICAgIDB4REQxNSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9GQVhfTlVNQkVSX0JVU0lORVNTIiwgICAgICAgICAgICAgICAgICAgIDB4REQxNiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QQUdFUl9OVU1CRVIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQxNyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfT1RIRVJTIiwgICAgICAgICAgICAgICAgICAgIDB4REQxOCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QUklNQVJZX1dFQl9BRERSRVNTIiwgICAgICAgICAgICAgICAgICAgIDB4REQxOSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QRVJTT05BTF9XRUJfQUREUkVTUyIsICAgICAgICAgICAgICAgICAgIDB4REQxQSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9CVVNJTkVTU19XRUJfQUREUkVTUyIsICAgICAgICAgICAgICAgICAgIDB4REQxQiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTIiwgICAgICAgICAgICAgIDB4REQxQyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTXzIiLCAgICAgICAgICAgIDB4REQxRCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTXzMiLCAgICAgICAgICAgIDB4REQxRSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9GVUxMIiwgICAgICAgICAgIDB4REQxRiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9MSU5FXzEiLCAgICAgICAgIDB4REQyMCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9MSU5FXzIiLCAgICAgICAgIDB4REQyMSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9DSVRZIiwgICAgICAgICAgIDB4REQyMiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9SRUdJT04iLCAgICAgICAgIDB4REQyMyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9QT1NUQUxfQ09ERSIsICAgIDB4REQyNCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9DT1VOVFJZIiwgICAgICAgIDB4REQyNSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19GVUxMIiwgICAgICAgICAgIDB4REQyNiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19MSU5FXzEiLCAgICAgICAgIDB4REQyNyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19MSU5FXzIiLCAgICAgICAgIDB4REQyOCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19DSVRZIiwgICAgICAgICAgIDB4REQyOSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19SRUdJT04iLCAgICAgICAgIDB4REQyQSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19QT1NUQUxfQ09ERSIsICAgIDB4REQyQiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19DT1VOVFJZIiwgICAgICAgIDB4REQyQyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9GVUxMIiwgICAgICAgICAgICAgIDB4REQyRCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9MSU5FXzEiLCAgICAgICAgICAgIDB4REQyRSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9MSU5FXzIiLCAgICAgICAgICAgIDB4REQyRiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9DSVRZIiwgICAgICAgICAgICAgIDB4REQzMCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9SRUdJT04iLCAgICAgICAgICAgIDB4REQzMSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9QT1NUQUxfQ09ERSIsICAgICAgIDB4REQzMiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9DT1VOVFJZIiwgICAgICAgICAgIDB4REQzMyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9PUkdBTklaQVRJT05fTkFNRSIsICAgICAgICAgICAgICAgICAgICAgIDB4REQzNCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9QSE9ORVRJQ19PUkdBTklaQVRJT05fTkFNRSIsICAgICAgICAgICAgIDB4REQzNSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9ST0xFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQzNiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9CSVJUSERBVEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQzNyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9NRVNTQUdFX1RPIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0MCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9NRVNTQUdFX0NDIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0MSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9NRVNTQUdFX0JDQyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0MiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9NRVNTQUdFX1JFQUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0MyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9NRVNTQUdFX1JFQ0VJVkVEX1RJTUUiLCAgICAgICAgICAgICAgICAgIDB4REQ0NCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9NRVNTQUdFX1NFTkRFUiIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0NSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9CRUdJTl9USU1FIiwgICAgICAgICAgICAgICAgICAgIDB4REQ1MCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9FTkRfVElNRSIsICAgICAgICAgICAgICAgICAgICAgIDB4REQ1MSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9MT0NBVElPTiIsICAgICAgICAgICAgICAgICAgICAgIDB4REQ1MiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9SRVFVSVJFRF9BVFRFTkRFRVMiLCAgICAgICAgICAgIDB4REQ1NCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9PUFRJT05BTF9BVFRFTkRFRVMiLCAgICAgICAgICAgIDB4REQ1NSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9SRVNPVVJDRVMiLCAgICAgICAgICAgICAgICAgICAgIDB4REQ1NiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9BQ0NFUFRFRCIsICAgICAgICAgICAgICAgICAgICAgIDB4REQ1NyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9URU5UQVRJVkUiLCAgICAgICAgICAgICAgICAgICAgIDB4REQ1OCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9ERUNMSU5FRCIsICAgICAgICAgICAgICAgICAgICAgIDB4REQ1OSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9SRU1BSU5ERVJfVElNRSIsICAgICAgICAgICAgICAgIDB4REQ1QSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9PV05FUiIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1QiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9BQ1RJVklUWV9TVEFUVVMiLCAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1QyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9PV05FUiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1RCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9FRElUT1IiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1RSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9XRUJNQVNURVIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1RiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9VUkxfU09VUkNFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2MCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9VUkxfREVTVElOQVRJT04iLCAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2MSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9USU1FX0JPT0tNQVJLIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2MiB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9PQkpFQ1RfQk9PS01BUksiLCAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2MyB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9CWVRFX0JPT0tNQVJLIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2NCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9MQVNUX0JVSUxEX0RBVEUiLCAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ3MCB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9USU1FX1RPX0xJVkUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ3MSB9LAorICAgIHsgIk1UUF9QUk9QRVJUWV9NRURJQV9HVUlEIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ3MiB9LAorICAgIHsgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICB9LAorfTsKKworc3RhdGljIGNvbnN0IENvZGVFbnRyeSBzRGV2aWNlUHJvcENvZGVzW10gPSB7CisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9VTkRFRklORUQiLCAgICAgICAgICAgICAgICAgICAgICAgMHg1MDAwIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9CQVRURVJZX0xFVkVMIiwgICAgICAgICAgICAgICAgICAgMHg1MDAxIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9GVU5DVElPTkFMX01PREUiLCAgICAgICAgICAgICAgICAgMHg1MDAyIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9JTUFHRV9TSVpFIiwgICAgICAgICAgICAgICAgICAgICAgMHg1MDAzIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9DT01QUkVTU0lPTl9TRVRUSU5HIiwgICAgICAgICAgICAgMHg1MDA0IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9XSElURV9CQUxBTkNFIiwgICAgICAgICAgICAgICAgICAgMHg1MDA1IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9SR0JfR0FJTiIsICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDA2IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9GX05VTUJFUiIsICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDA3IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9GT0NBTF9MRU5HVEgiLCAgICAgICAgICAgICAgICAgICAgMHg1MDA4IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9GT0NVU19ESVNUQU5DRSIsICAgICAgICAgICAgICAgICAgMHg1MDA5IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9GT0NVU19NT0RFIiwgICAgICAgICAgICAgICAgICAgICAgMHg1MDBBIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9NRVRFUklOR19NT0RFIiwgICAgICAgICAgMHg1MDBCIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9GTEFTSF9NT0RFIiwgICAgICAgICAgICAgICAgICAgICAgMHg1MDBDIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9USU1FIiwgICAgICAgICAgICAgICAgICAgMHg1MDBEIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9QUk9HUkFNX01PREUiLCAgICAgICAgICAgMHg1MDBFIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9JTkRFWCIsICAgICAgICAgICAgICAgICAgMHg1MDBGIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9CSUFTX0NPTVBFTlNBVElPTiIsICAgICAgMHg1MDEwIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9EQVRFVElNRSIsICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDExIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9DQVBUVVJFX0RFTEFZIiwgICAgICAgICAgICAgICAgICAgMHg1MDEyIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9TVElMTF9DQVBUVVJFX01PREUiLCAgICAgICAgICAgICAgMHg1MDEzIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9DT05UUkFTVCIsICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDE0IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9TSEFSUE5FU1MiLCAgICAgICAgICAgICAgICAgICAgICAgMHg1MDE1IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9ESUdJVEFMX1pPT00iLCAgICAgICAgICAgICAgICAgICAgMHg1MDE2IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9FRkZFQ1RfTU9ERSIsICAgICAgICAgICAgICAgICAgICAgMHg1MDE3IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9CVVJTVF9OVU1CRVIiLCAgICAgICAgICAgICAgICAgICAgMHg1MDE4IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9CVVJTVF9JTlRFUlZBTCIsICAgICAgICAgICAgICAgICAgMHg1MDE5IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9USU1FTEFQU0VfTlVNQkVSIiwgICAgICAgICAgICAgICAgMHg1MDFBIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9USU1FTEFQU0VfSU5URVJWQUwiLCAgICAgICAgICAgICAgMHg1MDFCIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9GT0NVU19NRVRFUklOR19NT0RFIiwgICAgICAgICAgICAgMHg1MDFDIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9VUExPQURfVVJMIiwgICAgICAgICAgICAgICAgICAgICAgMHg1MDFEIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9BUlRJU1QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDFFIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9DT1BZUklHSFRfSU5GTyIsICAgICAgICAgICAgICAgICAgMHg1MDFGIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9TWU5DSFJPTklaQVRJT05fUEFSVE5FUiIsICAgICAgICAgMHhENDAxIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9ERVZJQ0VfRlJJRU5ETFlfTkFNRSIsICAgICAgICAgICAgMHhENDAyIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9WT0xVTUUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhENDAzIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9TVVBQT1JURURfRk9STUFUU19PUkRFUkVEIiwgICAgICAgMHhENDA0IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9ERVZJQ0VfSUNPTiIsICAgICAgICAgICAgICAgICAgICAgMHhENDA1IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9QTEFZQkFDS19SQVRFIiwgICAgICAgICAgICAgICAgICAgMHhENDEwIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9QTEFZQkFDS19PQkpFQ1QiLCAgICAgICAgICAgICAgICAgMHhENDExIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9QTEFZQkFDS19DT05UQUlORVJfSU5ERVgiLCAgICAgICAgMHhENDEyIH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9TRVNTSU9OX0lOSVRJQVRPUl9WRVJTSU9OX0lORk8iLCAgMHhENDA2IH0sCisgICAgeyAiTVRQX0RFVklDRV9QUk9QRVJUWV9QRVJDRUlWRURfREVWSUNFX1RZUEUiLCAgICAgICAgICAgMHhENDA3IH0sCisgICAgeyAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgIH0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciogZ2V0Q29kZU5hbWUodWludDE2X3QgY29kZSwgY29uc3QgQ29kZUVudHJ5KiB0YWJsZSkgeworICAgIGNvbnN0IENvZGVFbnRyeSogZW50cnkgPSB0YWJsZTsKKyAgICB3aGlsZSAoZW50cnktPm5hbWUpIHsKKyAgICAgICAgaWYgKGVudHJ5LT5jb2RlID09IGNvZGUpCisgICAgICAgICAgICByZXR1cm4gZW50cnktPm5hbWU7CisgICAgICAgIGVudHJ5Kys7CisgICAgfQorICAgIHJldHVybiAiVU5LTk9XTiI7Cit9CisKK2NvbnN0IGNoYXIqIE10cERlYnVnOjpnZXRPcGVyYXRpb25Db2RlTmFtZShNdHBPcGVyYXRpb25Db2RlIGNvZGUpIHsKKyAgICByZXR1cm4gZ2V0Q29kZU5hbWUoY29kZSwgc09wZXJhdGlvbkNvZGVzKTsKK30KKworY29uc3QgY2hhciogTXRwRGVidWc6OmdldEZvcm1hdENvZGVOYW1lKE10cE9wZXJhdGlvbkNvZGUgY29kZSkgeworICAgIHJldHVybiBnZXRDb2RlTmFtZShjb2RlLCBzRm9ybWF0Q29kZXMpOworfQorCitjb25zdCBjaGFyKiBNdHBEZWJ1Zzo6Z2V0T2JqZWN0UHJvcENvZGVOYW1lKE10cFByb3BlcnR5Q29kZSBjb2RlKSB7CisgICAgcmV0dXJuIGdldENvZGVOYW1lKGNvZGUsIHNPYmplY3RQcm9wQ29kZXMpOworfQorCitjb25zdCBjaGFyKiBNdHBEZWJ1Zzo6Z2V0RGV2aWNlUHJvcENvZGVOYW1lKE10cFByb3BlcnR5Q29kZSBjb2RlKSB7CisgICAgcmV0dXJuIGdldENvZGVOYW1lKGNvZGUsIHNEZXZpY2VQcm9wQ29kZXMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERlYnVnLmggYi9tZWRpYS9tdHAvTXRwRGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjUzZTMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERlYnVnLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9ERUJVR19ICisjZGVmaW5lIF9NVFBfREVCVUdfSAorCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEZWJ1ZyB7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE9wZXJhdGlvbkNvZGVOYW1lKE10cE9wZXJhdGlvbkNvZGUgY29kZSk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGdldEZvcm1hdENvZGVOYW1lKE10cE9iamVjdEZvcm1hdCBjb2RlKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZ2V0T2JqZWN0UHJvcENvZGVOYW1lKE10cFByb3BlcnR5Q29kZSBjb2RlKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZ2V0RGV2aWNlUHJvcENvZGVOYW1lKE10cFByb3BlcnR5Q29kZSBjb2RlKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0RFQlVHX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZXZpY2UuY3BwIGIvbWVkaWEvbXRwL010cERldmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhMDE0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZXZpY2UuY3BwCkBAIC0wLDAgKzEsNDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBEZXZpY2UiCisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorI2luY2x1ZGUgIk10cERldmljZS5oIgorI2luY2x1ZGUgIk10cERldmljZUluZm8uaCIKKyNpbmNsdWRlICJNdHBPYmplY3RJbmZvLmgiCisjaW5jbHVkZSAiTXRwUHJvcGVydHkuaCIKKyNpbmNsdWRlICJNdHBTdG9yYWdlSW5mby5oIgorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgorI2luY2x1ZGUgIk10cFV0aWxzLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgorCisjaW5jbHVkZSA8dXNiaG9zdC91c2Job3N0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwRGV2aWNlOjpNdHBEZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UqIGRldmljZSwgaW50IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX2luLCBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9vdXQsCisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9pbnRyKQorICAgIDogICBtRGV2aWNlKGRldmljZSksCisgICAgICAgIG1JbnRlcmZhY2UoaW50ZXJmYWNlKSwKKyAgICAgICAgbUVuZHBvaW50SW4oZXBfaW4pLAorICAgICAgICBtRW5kcG9pbnRPdXQoZXBfb3V0KSwKKyAgICAgICAgbUVuZHBvaW50SW50cihlcF9pbnRyKSwKKyAgICAgICAgbURldmljZUluZm8oTlVMTCksCisgICAgICAgIG1JRCh1c2JfZGV2aWNlX2dldF91bmlxdWVfaWQoZGV2aWNlKSksCisgICAgICAgIG1TZXNzaW9uSUQoMCksCisgICAgICAgIG1UcmFuc2FjdGlvbklEKDApCit7Cit9CisKK010cERldmljZTo6fk10cERldmljZSgpIHsKKyAgICBjbG9zZSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURldmljZVByb3BlcnRpZXMuc2l6ZSgpOyBpKyspCisgICAgICAgIGRlbGV0ZSBtRGV2aWNlUHJvcGVydGllc1tpXTsKK30KKwordm9pZCBNdHBEZXZpY2U6OmluaXRpYWxpemUoKSB7CisgICAgb3BlblNlc3Npb24oKTsKKyAgICBtRGV2aWNlSW5mbyA9IGdldERldmljZUluZm8oKTsKKyAgICBpZiAobURldmljZUluZm8pIHsKKyAgICAgICAgbURldmljZUluZm8tPnByaW50KCk7CisKKyAgICAgICAgaWYgKG1EZXZpY2VJbmZvLT5tRGV2aWNlUHJvcGVydGllcykgeworICAgICAgICAgICAgaW50IGNvdW50ID0gbURldmljZUluZm8tPm1EZXZpY2VQcm9wZXJ0aWVzLT5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wQ29kZSA9ICgqbURldmljZUluZm8tPm1EZXZpY2VQcm9wZXJ0aWVzKVtpXTsKKyAgICAgICAgICAgICAgICBNdHBQcm9wZXJ0eSogcHJvcGVydHkgPSBnZXREZXZpY2VQcm9wRGVzYyhwcm9wQ29kZSk7CisgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5KSB7CisgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LT5wcmludCgpOworICAgICAgICAgICAgICAgICAgICBtRGV2aWNlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTXRwRGV2aWNlOjpjbG9zZSgpIHsKKyAgICBpZiAobURldmljZSkgeworICAgICAgICB1c2JfZGV2aWNlX3JlbGVhc2VfaW50ZXJmYWNlKG1EZXZpY2UsIG1JbnRlcmZhY2UpOworICAgICAgICB1c2JfZGV2aWNlX2Nsb3NlKG1EZXZpY2UpOworICAgICAgICBtRGV2aWNlID0gTlVMTDsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIqIE10cERldmljZTo6Z2V0RGV2aWNlTmFtZSgpIHsKKyAgICBpZiAobURldmljZSkKKyAgICAgICAgcmV0dXJuIHVzYl9kZXZpY2VfZ2V0X25hbWUobURldmljZSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gIj8/PyI7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpvcGVuU2Vzc2lvbigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIG1TZXNzaW9uSUQgPSAwOworICAgIG1UcmFuc2FjdGlvbklEID0gMDsKKyAgICBNdHBTZXNzaW9uSUQgbmV3U2Vzc2lvbiA9IDE7CisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgbmV3U2Vzc2lvbik7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX09QRU5fU0VTU0lPTikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfU0VTU0lPTl9BTFJFQURZX09QRU4pCisgICAgICAgIG5ld1Nlc3Npb24gPSBtUmVzcG9uc2UuZ2V0UGFyYW1ldGVyKDEpOworICAgIGVsc2UgaWYgKHJldCAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIG1TZXNzaW9uSUQgPSBuZXdTZXNzaW9uOworICAgIG1UcmFuc2FjdGlvbklEID0gMTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNdHBEZXZpY2U6OmNsb3NlU2Vzc2lvbigpIHsKKyAgICAvLyBGSVhNRQorICAgIHJldHVybiB0cnVlOworfQorCitNdHBEZXZpY2VJbmZvKiBNdHBEZXZpY2U6OmdldERldmljZUluZm8oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIGlmICghc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX0lORk8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIXJlYWREYXRhKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICBNdHBEZXZpY2VJbmZvKiBpbmZvID0gbmV3IE10cERldmljZUluZm87CisgICAgICAgIGluZm8tPnJlYWQobURhdGEpOworICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK010cFN0b3JhZ2VJRExpc3QqIE10cERldmljZTo6Z2V0U3RvcmFnZUlEcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lEUykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIHJldHVybiBtRGF0YS5nZXRBVUludDMyKCk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitNdHBTdG9yYWdlSW5mbyogTXRwRGV2aWNlOjpnZXRTdG9yYWdlSW5mbyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlEKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBzdG9yYWdlSUQpOworICAgIGlmICghc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JTkZPKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFyZWFkRGF0YSgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgTXRwU3RvcmFnZUluZm8qIGluZm8gPSBuZXcgTXRwU3RvcmFnZUluZm8oc3RvcmFnZUlEKTsKKyAgICAgICAgaW5mby0+cmVhZChtRGF0YSk7CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworTXRwT2JqZWN0SGFuZGxlTGlzdCogTXRwRGV2aWNlOjpnZXRPYmplY3RIYW5kbGVzKE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsCisgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LCBNdHBPYmplY3RIYW5kbGUgcGFyZW50KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBzdG9yYWdlSUQpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigyLCBmb3JtYXQpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigzLCBwYXJlbnQpOworICAgIGlmICghc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0hBTkRMRVMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIXJlYWREYXRhKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICByZXR1cm4gbURhdGEuZ2V0QVVJbnQzMigpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworTXRwT2JqZWN0SW5mbyogTXRwRGV2aWNlOjpnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIC8vIEZJWE1FIC0gd2UgbWlnaHQgd2FudCB0byBhZGQgc29tZSBjYWNoaW5nIGhlcmUKKworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSU5GTykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIE10cE9iamVjdEluZm8qIGluZm8gPSBuZXcgTXRwT2JqZWN0SW5mbyhoYW5kbGUpOworICAgICAgICBpbmZvLT5yZWFkKG1EYXRhKTsKKyAgICAgICAgcmV0dXJuIGluZm87CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkKiBNdHBEZXZpY2U6OmdldFRodW1ibmFpbChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBpbnQmIG91dExlbmd0aCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgaGFuZGxlKTsKKyAgICBpZiAoc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9HRVRfVEhVTUIpICYmIHJlYWREYXRhKCkpIHsKKyAgICAgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgICAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICAgICAgcmV0dXJuIG1EYXRhLmdldERhdGEob3V0TGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBvdXRMZW5ndGggPSAwOworICAgIHJldHVybiBOVUxMOworfQorCitNdHBPYmplY3RIYW5kbGUgTXRwRGV2aWNlOjpzZW5kT2JqZWN0SW5mbyhNdHBPYmplY3RJbmZvKiBpbmZvKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQgPSBpbmZvLT5tUGFyZW50OworICAgIGlmIChwYXJlbnQgPT0gMCkKKyAgICAgICAgcGFyZW50ID0gTVRQX1BBUkVOVF9ST09UOworCisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGluZm8tPm1TdG9yYWdlSUQpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigyLCBpbmZvLT5tUGFyZW50KTsKKworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tU3RvcmFnZUlEKTsKKyAgICBtRGF0YS5wdXRVSW50MTYoaW5mby0+bUZvcm1hdCk7CisgICAgbURhdGEucHV0VUludDE2KGluZm8tPm1Qcm90ZWN0aW9uU3RhdHVzKTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bUNvbXByZXNzZWRTaXplKTsKKyAgICBtRGF0YS5wdXRVSW50MTYoaW5mby0+bVRodW1iRm9ybWF0KTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bVRodW1iQ29tcHJlc3NlZFNpemUpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tVGh1bWJQaXhXaWR0aCk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1UaHVtYlBpeEhlaWdodCk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1JbWFnZVBpeFdpZHRoKTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bUltYWdlUGl4SGVpZ2h0KTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bUltYWdlUGl4RGVwdGgpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tUGFyZW50KTsKKyAgICBtRGF0YS5wdXRVSW50MTYoaW5mby0+bUFzc29jaWF0aW9uVHlwZSk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1Bc3NvY2lhdGlvbkRlc2MpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tU2VxdWVuY2VOdW1iZXIpOworICAgIG1EYXRhLnB1dFN0cmluZyhpbmZvLT5tTmFtZSk7CisKKyAgICBjaGFyIGNyZWF0ZWRbMTAwXSwgbW9kaWZpZWRbMTAwXTsKKyAgICBmb3JtYXREYXRlVGltZShpbmZvLT5tRGF0ZUNyZWF0ZWQsIGNyZWF0ZWQsIHNpemVvZihjcmVhdGVkKSk7CisgICAgZm9ybWF0RGF0ZVRpbWUoaW5mby0+bURhdGVNb2RpZmllZCwgbW9kaWZpZWQsIHNpemVvZihtb2RpZmllZCkpOworCisgICAgbURhdGEucHV0U3RyaW5nKGNyZWF0ZWQpOworICAgIG1EYXRhLnB1dFN0cmluZyhtb2RpZmllZCk7CisgICAgaWYgKGluZm8tPm1LZXl3b3JkcykKKyAgICAgICAgbURhdGEucHV0U3RyaW5nKGluZm8tPm1LZXl3b3Jkcyk7CisgICAgZWxzZQorICAgICAgICBtRGF0YS5wdXRFbXB0eVN0cmluZygpOworCisgICBpZiAoc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVF9JTkZPKSAmJiBzZW5kRGF0YSgpKSB7CisgICAgICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICAgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgICAgIGluZm8tPm1TdG9yYWdlSUQgPSBtUmVzcG9uc2UuZ2V0UGFyYW1ldGVyKDEpOworICAgICAgICAgICAgaW5mby0+bVBhcmVudCA9IG1SZXNwb25zZS5nZXRQYXJhbWV0ZXIoMik7CisgICAgICAgICAgICBpbmZvLT5tSGFuZGxlID0gbVJlc3BvbnNlLmdldFBhcmFtZXRlcigzKTsKKyAgICAgICAgICAgIHJldHVybiBpbmZvLT5tSGFuZGxlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoTXRwT2JqZWN0SGFuZGxlKS0xOworfQorCitib29sIE10cERldmljZTo6c2VuZE9iamVjdChNdHBPYmplY3RJbmZvKiBpbmZvLCBpbnQgc3JjRkQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIGludCByZW1haW5pbmcgPSBpbmZvLT5tQ29tcHJlc3NlZFNpemU7CisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgaW5mby0+bUhhbmRsZSk7CisgICAgaWYgKHNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1QpKSB7CisgICAgICAgIC8vIHNlbmQgZGF0YSBoZWFkZXIKKyAgICAgICAgd3JpdGVEYXRhSGVhZGVyKE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1QsIHJlbWFpbmluZyk7CisKKyAgICAgICAgY2hhciBidWZmZXJbNjU1MzZdOworICAgICAgICB3aGlsZSAocmVtYWluaW5nID4gMCkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gcmVhZChzcmNGRCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50IHdyaXR0ZW4gPSBtRGF0YS53cml0ZShtRW5kcG9pbnRPdXQsIGJ1ZmZlciwgY291bnQpOworICAgICAgICAgICAgICAgIC8vIEZJWE1FIGNoZWNrIGVycm9yCisgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IGNvdW50OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgcmV0dXJuIChyZW1haW5pbmcgPT0gMCAmJiByZXQgPT0gTVRQX1JFU1BPTlNFX09LKTsKK30KKworYm9vbCBNdHBEZXZpY2U6OmRlbGV0ZU9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBoYW5kbGUpOworICAgIGlmIChzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0RFTEVURV9PQkpFQ1QpKSB7CisgICAgICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICAgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitNdHBPYmplY3RIYW5kbGUgTXRwRGV2aWNlOjpnZXRQYXJlbnQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIE10cE9iamVjdEluZm8qIGluZm8gPSBnZXRPYmplY3RJbmZvKGhhbmRsZSk7CisgICAgaWYgKGluZm8pCisgICAgICAgIHJldHVybiBpbmZvLT5tUGFyZW50OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIC0xOworfQorCitNdHBPYmplY3RIYW5kbGUgTXRwRGV2aWNlOjpnZXRTdG9yYWdlSUQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIE10cE9iamVjdEluZm8qIGluZm8gPSBnZXRPYmplY3RJbmZvKGhhbmRsZSk7CisgICAgaWYgKGluZm8pCisgICAgICAgIHJldHVybiBpbmZvLT5tU3RvcmFnZUlEOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIC0xOworfQorCitNdHBQcm9wZXJ0eSogTXRwRGV2aWNlOjpnZXREZXZpY2VQcm9wRGVzYyhNdHBEZXZpY2VQcm9wZXJ0eSBjb2RlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBjb2RlKTsKKyAgICBpZiAoIXNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX0RFU0MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIXJlYWREYXRhKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICBNdHBQcm9wZXJ0eSogcHJvcGVydHkgPSBuZXcgTXRwUHJvcGVydHk7CisgICAgICAgIHByb3BlcnR5LT5yZWFkKG1EYXRhKTsKKyAgICAgICAgcmV0dXJuIHByb3BlcnR5OworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworY2xhc3MgUmVhZE9iamVjdFRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworcHJpdmF0ZToKKyAgICBNdHBEZXZpY2UqICAgICAgICAgIG1EZXZpY2U7CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICBtSGFuZGxlOworICAgIGludCAgICAgICAgICAgICAgICAgbU9iamVjdFNpemU7CisgICAgdm9pZCogICAgICAgICAgICAgICBtSW5pdGlhbERhdGE7CisgICAgaW50ICAgICAgICAgICAgICAgICBtSW5pdGlhbERhdGFMZW5ndGg7CisgICAgaW50ICAgICAgICAgICAgICAgICBtRkQ7CisKK3B1YmxpYzoKKyAgICBSZWFkT2JqZWN0VGhyZWFkKE10cERldmljZSogZGV2aWNlLCBNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBpbnQgb2JqZWN0U2l6ZSkKKyAgICAgICAgOiBtRGV2aWNlKGRldmljZSksCisgICAgICAgICAgbUhhbmRsZShoYW5kbGUpLAorICAgICAgICAgIG1PYmplY3RTaXplKG9iamVjdFNpemUpLAorICAgICAgICAgIG1Jbml0aWFsRGF0YShOVUxMKSwKKyAgICAgICAgICBtSW5pdGlhbERhdGFMZW5ndGgoMCkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCB+UmVhZE9iamVjdFRocmVhZCgpIHsKKyAgICAgICAgaWYgKG1GRCA+PSAwKQorICAgICAgICAgICAgY2xvc2UobUZEKTsKKyAgICAgICAgZnJlZShtSW5pdGlhbERhdGEpOworICAgIH0KKworICAgIC8vIHJldHVybnMgZmlsZSBkZXNjcmlwdG9yCisgICAgaW50IGluaXQoKSB7CisgICAgICAgIG1EZXZpY2UtPm1SZXF1ZXN0LnJlc2V0KCk7CisgICAgICAgIG1EZXZpY2UtPm1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBtSGFuZGxlKTsKKyAgICAgICAgaWYgKG1EZXZpY2UtPnNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVCkKKyAgICAgICAgICAgICAgICAmJiBtRGV2aWNlLT5tRGF0YS5yZWFkRGF0YUhlYWRlcihtRGV2aWNlLT5tRW5kcG9pbnRJbikpIHsKKworICAgICAgICAgICAgLy8gbURhdGEgd2lsbCBjb250YWluIGhlYWRlciBhbmQgcG9zc2libHkgdGhlIGJlZ2lubmluZyBvZiB0aGUgb2JqZWN0IGRhdGEKKyAgICAgICAgICAgIG1Jbml0aWFsRGF0YSA9IG1EZXZpY2UtPm1EYXRhLmdldERhdGEobUluaXRpYWxEYXRhTGVuZ3RoKTsKKworICAgICAgICAgICAgLy8gY3JlYXRlIGEgcGlwZSBmb3IgdGhlIGNsaWVudCB0byByZWFkIGZyb20KKyAgICAgICAgICAgIGludCBwaXBlZmRbMl07CisgICAgICAgICAgICBpZiAocGlwZShwaXBlZmQpIDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoInBpcGUgZmFpbGVkICglcykiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUZEID0gcGlwZWZkWzFdOworICAgICAgICAgICAgcmV0dXJuIHBpcGVmZFswXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKSB7CisgICAgICAgIGludCByZW1haW5pbmcgPSBtT2JqZWN0U2l6ZTsKKyAgICAgICAgaWYgKG1Jbml0aWFsRGF0YSkgeworICAgICAgICAgICAgd3JpdGUobUZELCBtSW5pdGlhbERhdGEsIG1Jbml0aWFsRGF0YUxlbmd0aCk7CisgICAgICAgICAgICByZW1haW5pbmcgLT0gbUluaXRpYWxEYXRhTGVuZ3RoOworICAgICAgICAgICAgZnJlZShtSW5pdGlhbERhdGEpOworICAgICAgICAgICAgbUluaXRpYWxEYXRhID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGNoYXIgYnVmZmVyWzE2Mzg0XTsKKyAgICAgICAgd2hpbGUgKHJlbWFpbmluZyA+IDApIHsKKyAgICAgICAgICAgIGludCByZWFkU2l6ZSA9IChyZW1haW5pbmcgPiBzaXplb2YoYnVmZmVyKSA/IHNpemVvZihidWZmZXIpIDogcmVtYWluaW5nKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IG1EZXZpY2UtPm1EYXRhLnJlYWREYXRhKG1EZXZpY2UtPm1FbmRwb2ludEluLCBidWZmZXIsIHJlYWRTaXplKTsKKyAgICAgICAgICAgIGludCB3cml0dGVuOworICAgICAgICAgICAgaWYgKGNvdW50ID49IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgd3JpdHRlbiA9IHdyaXRlKG1GRCwgYnVmZmVyLCBjb3VudCk7CisgICAgICAgICAgICAgICAgLy8gRklYTUUgY2hlY2sgZXJyb3IKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gY291bnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IG1EZXZpY2UtPnJlYWRSZXNwb25zZSgpOworICAgICAgICBtRGV2aWNlLT5tTXV0ZXgudW5sb2NrKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9OworCisgICAgLy8gcmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciBhIHBpcGUgdG8gcmVhZCB0aGUgb2JqZWN0J3MgZGF0YQoraW50IE10cERldmljZTo6cmVhZE9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBpbnQgb2JqZWN0U2l6ZSkgeworICAgIG1NdXRleC5sb2NrKCk7CisKKyAgICBSZWFkT2JqZWN0VGhyZWFkKiB0aHJlYWQgPSBuZXcgUmVhZE9iamVjdFRocmVhZCh0aGlzLCBoYW5kbGUsIG9iamVjdFNpemUpOworICAgIGludCBmZCA9IHRocmVhZC0+aW5pdCgpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgZGVsZXRlIHRocmVhZDsKKyAgICAgICAgbU11dGV4LnVubG9jaygpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRocmVhZC0+cnVuKCJSZWFkT2JqZWN0VGhyZWFkIik7CisgICAgfQorICAgIHJldHVybiBmZDsKK30KKworYm9vbCBNdHBEZXZpY2U6OnNlbmRSZXF1ZXN0KE10cE9wZXJhdGlvbkNvZGUgb3BlcmF0aW9uKSB7CisgICAgTE9HVigic2VuZFJlcXVlc3Q6ICVzXG4iLCBNdHBEZWJ1Zzo6Z2V0T3BlcmF0aW9uQ29kZU5hbWUob3BlcmF0aW9uKSk7CisgICAgbVJlcXVlc3Quc2V0T3BlcmF0aW9uQ29kZShvcGVyYXRpb24pOworICAgIGlmIChtVHJhbnNhY3Rpb25JRCA+IDApCisgICAgICAgIG1SZXF1ZXN0LnNldFRyYW5zYWN0aW9uSUQobVRyYW5zYWN0aW9uSUQrKyk7CisgICAgaW50IHJldCA9IG1SZXF1ZXN0LndyaXRlKG1FbmRwb2ludE91dCk7CisgICAgbVJlcXVlc3QuZHVtcCgpOworICAgIHJldHVybiAocmV0ID4gMCk7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpzZW5kRGF0YSgpIHsKKyAgICBMT0dWKCJzZW5kRGF0YVxuIik7CisgICAgbURhdGEuc2V0T3BlcmF0aW9uQ29kZShtUmVxdWVzdC5nZXRPcGVyYXRpb25Db2RlKCkpOworICAgIG1EYXRhLnNldFRyYW5zYWN0aW9uSUQobVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpKTsKKyAgICBpbnQgcmV0ID0gbURhdGEud3JpdGUobUVuZHBvaW50T3V0KTsKKyAgICBtRGF0YS5kdW1wKCk7CisgICAgcmV0dXJuIChyZXQgPiAwKTsKK30KKworYm9vbCBNdHBEZXZpY2U6OnJlYWREYXRhKCkgeworICAgIG1EYXRhLnJlc2V0KCk7CisgICAgaW50IHJldCA9IG1EYXRhLnJlYWQobUVuZHBvaW50SW4pOworICAgIExPR1YoInJlYWREYXRhIHJldHVybmVkICVkXG4iLCByZXQpOworICAgIGlmIChyZXQgPj0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkgeworICAgICAgICBtRGF0YS5kdW1wKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgTE9HVigicmVhZFJlc3BvbnNlIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjp3cml0ZURhdGFIZWFkZXIoTXRwT3BlcmF0aW9uQ29kZSBvcGVyYXRpb24sIGludCBkYXRhTGVuZ3RoKSB7CisgICAgbURhdGEuc2V0T3BlcmF0aW9uQ29kZShvcGVyYXRpb24pOworICAgIG1EYXRhLnNldFRyYW5zYWN0aW9uSUQobVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpKTsKKyAgICByZXR1cm4gKCFtRGF0YS53cml0ZURhdGFIZWFkZXIobUVuZHBvaW50T3V0LCBkYXRhTGVuZ3RoKSk7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBEZXZpY2U6OnJlYWRSZXNwb25zZSgpIHsKKyAgICBMT0dWKCJyZWFkUmVzcG9uc2VcbiIpOworICAgIGludCByZXQgPSBtUmVzcG9uc2UucmVhZChtRW5kcG9pbnRJbik7CisgICAgaWYgKHJldCA+PSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKSB7CisgICAgICAgIG1SZXNwb25zZS5kdW1wKCk7CisgICAgICAgIHJldHVybiBtUmVzcG9uc2UuZ2V0UmVzcG9uc2VDb2RlKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBMT0dEKCJyZWFkUmVzcG9uc2UgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZXZpY2UuaCBiL21lZGlhL210cC9NdHBEZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2Y0OTJmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERldmljZS5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0RFVklDRV9ICisjZGVmaW5lIF9NVFBfREVWSUNFX0gKKworI2luY2x1ZGUgIk10cFJlcXVlc3RQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwUmVzcG9uc2VQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCitzdHJ1Y3QgdXNiX2RldmljZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEZXZpY2VJbmZvOworY2xhc3MgTXRwT2JqZWN0SW5mbzsKK2NsYXNzIE10cFN0b3JhZ2VJbmZvOworCitjbGFzcyBNdHBEZXZpY2UgeworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgdXNiX2RldmljZSogICAgICBtRGV2aWNlOworICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2U7CisgICAgc3RydWN0IHVzYl9lbmRwb2ludCogICAgbUVuZHBvaW50SW47CisgICAgc3RydWN0IHVzYl9lbmRwb2ludCogICAgbUVuZHBvaW50T3V0OworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQqICAgIG1FbmRwb2ludEludHI7CisgICAgTXRwRGV2aWNlSW5mbyogICAgICAgICAgbURldmljZUluZm87CisgICAgTXRwUHJvcGVydHlMaXN0ICAgICAgICAgbURldmljZVByb3BlcnRpZXM7CisKKyAgICAvLyBhIHVuaXF1ZSBJRCBmb3IgdGhlIGRldmljZQorICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1JRDsKKworICAgIC8vIGN1cnJlbnQgc2Vzc2lvbiBJRAorICAgIE10cFNlc3Npb25JRCAgICAgICAgICAgIG1TZXNzaW9uSUQ7CisgICAgLy8gY3VycmVudCB0cmFuc2FjdGlvbiBJRAorICAgIE10cFRyYW5zYWN0aW9uSUQgICAgICAgIG1UcmFuc2FjdGlvbklEOworCisgICAgTXRwUmVxdWVzdFBhY2tldCAgICAgICAgbVJlcXVlc3Q7CisgICAgTXRwRGF0YVBhY2tldCAgICAgICAgICAgbURhdGE7CisgICAgTXRwUmVzcG9uc2VQYWNrZXQgICAgICAgbVJlc3BvbnNlOworCisgICAgLy8gdG8gZW5zdXJlIG9ubHkgb25lIE1UUCB0cmFuc2FjdGlvbiBhdCBhIHRpbWUKKyAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtTXV0ZXg7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UqIGRldmljZSwgaW50IGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX2luLCBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9pbnRyKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+TXRwRGV2aWNlKCk7CisKKyAgICBpbmxpbmUgaW50ICAgICAgICAgICAgICBnZXRJRCgpIGNvbnN0IHsgcmV0dXJuIG1JRDsgfQorCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZSgpOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGNsb3NlKCk7CisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgZ2V0RGV2aWNlTmFtZSgpOworCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgb3BlblNlc3Npb24oKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBjbG9zZVNlc3Npb24oKTsKKworICAgIE10cERldmljZUluZm8qICAgICAgICAgIGdldERldmljZUluZm8oKTsKKyAgICBNdHBTdG9yYWdlSURMaXN0KiAgICAgICBnZXRTdG9yYWdlSURzKCk7CisgICAgTXRwU3RvcmFnZUluZm8qICAgICAgICAgZ2V0U3RvcmFnZUluZm8oTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCk7CisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogICAgZ2V0T2JqZWN0SGFuZGxlcyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlELCBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LCBNdHBPYmplY3RIYW5kbGUgcGFyZW50KTsKKyAgICBNdHBPYmplY3RJbmZvKiAgICAgICAgICBnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIGdldFRodW1ibmFpbChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBpbnQmIG91dExlbmd0aCk7CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICAgICAgc2VuZE9iamVjdEluZm8oTXRwT2JqZWN0SW5mbyogaW5mbyk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgc2VuZE9iamVjdChNdHBPYmplY3RJbmZvKiBpbmZvLCBpbnQgc3JjRkQpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIGRlbGV0ZU9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgICAgICAgICBnZXRQYXJlbnQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICAgICAgZ2V0U3RvcmFnZUlEKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworCisgICAgTXRwUHJvcGVydHkqICAgICAgICAgICAgZ2V0RGV2aWNlUHJvcERlc2MoTXRwRGV2aWNlUHJvcGVydHkgY29kZSk7CisKKyAgICAvLyByZXR1cm5zIHRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIGEgcGlwZSB0byByZWFkIHRoZSBvYmplY3QncyBkYXRhCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgcmVhZE9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBpbnQgb2JqZWN0U2l6ZSk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFJlYWRPYmplY3RUaHJlYWQ7CisKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBzZW5kUmVxdWVzdChNdHBPcGVyYXRpb25Db2RlIG9wZXJhdGlvbik7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgc2VuZERhdGEoKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICByZWFkRGF0YSgpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHdyaXRlRGF0YUhlYWRlcihNdHBPcGVyYXRpb25Db2RlIG9wZXJhdGlvbiwgaW50IGRhdGFMZW5ndGgpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIHJlYWRSZXNwb25zZSgpOworCit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9ERVZJQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERldmljZUluZm8uY3BwIGIvbWVkaWEvbXRwL010cERldmljZUluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOTMyMmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGV2aWNlSW5mby5jcHAKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwRGV2aWNlSW5mbyIKKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cERldmljZUluZm8uaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBEZXZpY2VJbmZvOjpNdHBEZXZpY2VJbmZvKCkKKyAgICA6ICAgbVN0YW5kYXJkVmVyc2lvbigwKSwKKyAgICAgICAgbVZlbmRvckV4dGVuc2lvbklEKDApLAorICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uVmVyc2lvbigwKSwKKyAgICAgICAgbVZlbmRvckV4dGVuc2lvbkRlc2MoTlVMTCksCisgICAgICAgIG1GdW5jdGlvbmFsQ29kZSgwKSwKKyAgICAgICAgbU9wZXJhdGlvbnMoTlVMTCksCisgICAgICAgIG1FdmVudHMoTlVMTCksCisgICAgICAgIG1EZXZpY2VQcm9wZXJ0aWVzKE5VTEwpLAorICAgICAgICBtQ2FwdHVyZUZvcm1hdHMoTlVMTCksCisgICAgICAgIG1QbGF5YmFja0Zvcm1hdHMoTlVMTCksCisgICAgICAgIG1NYW51ZmFjdHVyZXIoTlVMTCksCisgICAgICAgIG1Nb2RlbChOVUxMKSwKKyAgICAgICAgbVZlcnNpb24oTlVMTCksCisgICAgICAgIG1TZXJpYWwoTlVMTCkKK3sKK30KKworTXRwRGV2aWNlSW5mbzo6fk10cERldmljZUluZm8oKSB7CisgICAgaWYgKG1WZW5kb3JFeHRlbnNpb25EZXNjKQorICAgICAgICBmcmVlKG1WZW5kb3JFeHRlbnNpb25EZXNjKTsKKyAgICBkZWxldGUgbU9wZXJhdGlvbnM7CisgICAgZGVsZXRlIG1FdmVudHM7CisgICAgZGVsZXRlIG1EZXZpY2VQcm9wZXJ0aWVzOworICAgIGRlbGV0ZSBtQ2FwdHVyZUZvcm1hdHM7CisgICAgZGVsZXRlIG1QbGF5YmFja0Zvcm1hdHM7CisgICAgaWYgKG1NYW51ZmFjdHVyZXIpCisgICAgICAgIGZyZWUobU1hbnVmYWN0dXJlcik7CisgICAgaWYgKG1Nb2RlbCkKKyAgICAgICAgZnJlZShtTW9kZWwpOworICAgIGlmIChtVmVyc2lvbikKKyAgICAgICAgZnJlZShtVmVyc2lvbik7CisgICAgaWYgKG1TZXJpYWwpCisgICAgICAgIGZyZWUobVNlcmlhbCk7Cit9CisKK3ZvaWQgTXRwRGV2aWNlSW5mbzo6cmVhZChNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBNdHBTdHJpbmdCdWZmZXIgc3RyaW5nOworCisgICAgLy8gcmVhZCB0aGUgZGV2aWNlIGluZm8KKyAgICBtU3RhbmRhcmRWZXJzaW9uID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1WZW5kb3JFeHRlbnNpb25JRCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtVmVuZG9yRXh0ZW5zaW9uVmVyc2lvbiA9IHBhY2tldC5nZXRVSW50MTYoKTsKKworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtVmVuZG9yRXh0ZW5zaW9uRGVzYyA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7CisKKyAgICBtRnVuY3Rpb25hbENvZGUgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbU9wZXJhdGlvbnMgPSBwYWNrZXQuZ2V0QVVJbnQxNigpOworICAgIG1FdmVudHMgPSBwYWNrZXQuZ2V0QVVJbnQxNigpOworICAgIG1EZXZpY2VQcm9wZXJ0aWVzID0gcGFja2V0LmdldEFVSW50MTYoKTsKKyAgICBtQ2FwdHVyZUZvcm1hdHMgPSBwYWNrZXQuZ2V0QVVJbnQxNigpOworICAgIG1QbGF5YmFja0Zvcm1hdHMgPSBwYWNrZXQuZ2V0QVVJbnQxNigpOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1NYW51ZmFjdHVyZXIgPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtTW9kZWwgPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtVmVyc2lvbiA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7CisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1TZXJpYWwgPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworfQorCit2b2lkIE10cERldmljZUluZm86OnByaW50KCkgeworICAgIExPR1YoIkRldmljZSBJbmZvOlxuXHRtU3RhbmRhcmRWZXJzaW9uOiAlZFxuXHRtVmVuZG9yRXh0ZW5zaW9uSUQ6ICVkXG5cdG1WZW5kb3JFeHRlbnNpb25WZXJzaW9ueTogJWRcbiIsCisgICAgICAgICAgICBtU3RhbmRhcmRWZXJzaW9uLCBtVmVuZG9yRXh0ZW5zaW9uSUQsIG1WZW5kb3JFeHRlbnNpb25WZXJzaW9uKTsKKyAgICBMT0dWKCJcdG1WZW5kb3JFeHRlbnNpb25EZXNjOiAlc1xuXHRtRnVuY3Rpb25hbENvZGU6ICVkXG5cdG1NYW51ZmFjdHVyZXI6ICVzXG5cdG1Nb2RlbDogJXNcblx0bVZlcnNpb246ICVzXG5cdG1TZXJpYWw6ICVzXG4iLAorICAgICAgICAgICAgbVZlbmRvckV4dGVuc2lvbkRlc2MsIG1GdW5jdGlvbmFsQ29kZSwgbU1hbnVmYWN0dXJlciwgbU1vZGVsLCBtVmVyc2lvbiwgbVNlcmlhbCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2aWNlSW5mby5oIGIvbWVkaWEvbXRwL010cERldmljZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWJhYTEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERldmljZUluZm8uaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0RFVklDRV9JTkZPX0gKKyNkZWZpbmUgX01UUF9ERVZJQ0VfSU5GT19ICisKK3N0cnVjdCBzdGF0OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERhdGFQYWNrZXQ7CisKK2NsYXNzIE10cERldmljZUluZm8geworcHVibGljOgorICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgIG1TdGFuZGFyZFZlcnNpb247CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVZlbmRvckV4dGVuc2lvbklEOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgIG1WZW5kb3JFeHRlbnNpb25WZXJzaW9uOworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgIG1WZW5kb3JFeHRlbnNpb25EZXNjOworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgIG1GdW5jdGlvbmFsQ29kZTsKKyAgICBVSW50MTZMaXN0KiAgICAgICAgICAgICBtT3BlcmF0aW9uczsKKyAgICBVSW50MTZMaXN0KiAgICAgICAgICAgICBtRXZlbnRzOworICAgIE10cERldmljZVByb3BlcnR5TGlzdCogIG1EZXZpY2VQcm9wZXJ0aWVzOworICAgIE10cE9iamVjdEZvcm1hdExpc3QqICAgIG1DYXB0dXJlRm9ybWF0czsKKyAgICBNdHBPYmplY3RGb3JtYXRMaXN0KiAgICBtUGxheWJhY2tGb3JtYXRzOworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgIG1NYW51ZmFjdHVyZXI7CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgbU1vZGVsOworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgIG1WZXJzaW9uOworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgIG1TZXJpYWw7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEZXZpY2VJbmZvKCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfk10cERldmljZUluZm8oKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIHJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIHByaW50KCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9ERVZJQ0VfSU5GT19ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRXZlbnRQYWNrZXQuY3BwIGIvbWVkaWEvbXRwL010cEV2ZW50UGFja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzc0NTQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cEV2ZW50UGFja2V0LmNwcApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBFdmVudFBhY2tldCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworI2lmZGVmIE1UUF9ERVZJQ0UKKyNpbmNsdWRlIDxsaW51eC91c2IvZl9tdHAuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiTXRwRXZlbnRQYWNrZXQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBFdmVudFBhY2tldDo6TXRwRXZlbnRQYWNrZXQoKQorICAgIDogICBNdHBQYWNrZXQoNTEyKQoreworfQorCitNdHBFdmVudFBhY2tldDo6fk10cEV2ZW50UGFja2V0KCkgeworfQorCisjaWZkZWYgTVRQX0RFVklDRQoraW50IE10cEV2ZW50UGFja2V0Ojp3cml0ZShpbnQgZmQpIHsKKyAgICBzdHJ1Y3QgbXRwX2V2ZW50ICAgIGV2ZW50OworCisgICAgcHV0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCwgbVBhY2tldFNpemUpOworICAgIHB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX1RZUEVfT0ZGU0VULCBNVFBfQ09OVEFJTkVSX1RZUEVfRVZFTlQpOworCisgICAgZXZlbnQuZGF0YSA9IG1CdWZmZXI7CisgICAgZXZlbnQubGVuZ3RoID0gbVBhY2tldFNpemU7CisgICAgaW50IHJldCA9IDo6aW9jdGwoZmQsIE1UUF9TRU5EX0VWRU5ULCAodW5zaWduZWQgbG9uZykmZXZlbnQpOworICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOworfQorI2VuZGlmCisKKyNpZmRlZiBNVFBfSE9TVAorICAgIC8vIHJlYWQgb3VyIGJ1ZmZlciBmcm9tIHRoZSBnaXZlbiBlbmRwb2ludAoraW50IE10cEV2ZW50UGFja2V0OjpyZWFkKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKSB7CisgICAgaW50IHJldCA9IHRyYW5zZmVyKGVwLCBtQnVmZmVyLCBtQnVmZmVyU2l6ZSk7CisgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgbVBhY2tldFNpemUgPSByZXQ7CisgICAgZWxzZQorICAgICAgICBtUGFja2V0U2l6ZSA9IDA7CisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRXZlbnRQYWNrZXQuaCBiL21lZGlhL210cC9NdHBFdmVudFBhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYWU4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRXZlbnRQYWNrZXQuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0VWRU5UX1BBQ0tFVF9ICisjZGVmaW5lIF9NVFBfRVZFTlRfUEFDS0VUX0gKKworI2luY2x1ZGUgIk10cFBhY2tldC5oIgorI2luY2x1ZGUgIm10cC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cEV2ZW50UGFja2V0IDogcHVibGljIE10cFBhY2tldCB7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cEV2ZW50UGFja2V0KCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwRXZlbnRQYWNrZXQoKTsKKworI2lmZGVmIE1UUF9ERVZJQ0UKKyAgICAvLyB3cml0ZSBvdXIgZGF0YSB0byB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZShpbnQgZmQpOworI2VuZGlmCisKKyNpZmRlZiBNVFBfSE9TVAorICAgIC8vIHJlYWQgb3VyIGJ1ZmZlciBmcm9tIHRoZSBnaXZlbiBlbmRwb2ludAorICAgIGludCAgICAgICAgICAgICAgICAgcmVhZChzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCk7CisjZW5kaWYKKworICAgIGlubGluZSBNdHBFdmVudENvZGUgICAgIGdldEV2ZW50Q29kZSgpIGNvbnN0IHsgcmV0dXJuIGdldENvbnRhaW5lckNvZGUoKTsgfQorICAgIGlubGluZSB2b2lkICAgICAgICAgICAgIHNldEV2ZW50Q29kZShNdHBFdmVudENvZGUgY29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gc2V0Q29udGFpbmVyQ29kZShjb2RlKTsgfQorfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfRVZFTlRfUEFDS0VUX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBPYmplY3RJbmZvLmNwcCBiL21lZGlhL210cC9NdHBPYmplY3RJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTY4YzNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cE9iamVjdEluZm8uY3BwCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBPYmplY3RJbmZvIgorCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwT2JqZWN0SW5mby5oIgorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgorI2luY2x1ZGUgIk10cFV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwT2JqZWN0SW5mbzo6TXRwT2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKQorICAgIDogICBtSGFuZGxlKGhhbmRsZSksCisgICAgICAgIG1TdG9yYWdlSUQoMCksCisgICAgICAgIG1Gb3JtYXQoMCksCisgICAgICAgIG1Qcm90ZWN0aW9uU3RhdHVzKDApLAorICAgICAgICBtQ29tcHJlc3NlZFNpemUoMCksCisgICAgICAgIG1UaHVtYkZvcm1hdCgwKSwKKyAgICAgICAgbVRodW1iQ29tcHJlc3NlZFNpemUoMCksCisgICAgICAgIG1UaHVtYlBpeFdpZHRoKDApLAorICAgICAgICBtVGh1bWJQaXhIZWlnaHQoMCksCisgICAgICAgIG1JbWFnZVBpeFdpZHRoKDApLAorICAgICAgICBtSW1hZ2VQaXhIZWlnaHQoMCksCisgICAgICAgIG1JbWFnZVBpeERlcHRoKDApLAorICAgICAgICBtUGFyZW50KDApLAorICAgICAgICBtQXNzb2NpYXRpb25UeXBlKDApLAorICAgICAgICBtQXNzb2NpYXRpb25EZXNjKDApLAorICAgICAgICBtU2VxdWVuY2VOdW1iZXIoMCksCisgICAgICAgIG1OYW1lKE5VTEwpLAorICAgICAgICBtRGF0ZUNyZWF0ZWQoMCksCisgICAgICAgIG1EYXRlTW9kaWZpZWQoMCksCisgICAgICAgIG1LZXl3b3JkcyhOVUxMKQoreworfQorCitNdHBPYmplY3RJbmZvOjp+TXRwT2JqZWN0SW5mbygpIHsKKyAgICBpZiAobU5hbWUpCisgICAgICAgIGZyZWUobU5hbWUpOworICAgIGlmIChtS2V5d29yZHMpCisgICAgICAgIGZyZWUobUtleXdvcmRzKTsKK30KKwordm9pZCBNdHBPYmplY3RJbmZvOjpyZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworICAgIE10cFN0cmluZ0J1ZmZlciBzdHJpbmc7CisgICAgdGltZV90IHRpbWU7CisKKyAgICBtU3RvcmFnZUlEID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1Gb3JtYXQgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbVByb3RlY3Rpb25TdGF0dXMgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbUNvbXByZXNzZWRTaXplID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1UaHVtYkZvcm1hdCA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtVGh1bWJDb21wcmVzc2VkU2l6ZSA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtVGh1bWJQaXhXaWR0aCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtVGh1bWJQaXhIZWlnaHQgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbUltYWdlUGl4V2lkdGggPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbUltYWdlUGl4SGVpZ2h0ID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1JbWFnZVBpeERlcHRoID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1QYXJlbnQgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbUFzc29jaWF0aW9uVHlwZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtQXNzb2NpYXRpb25EZXNjID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1TZXF1ZW5jZU51bWJlciA9IHBhY2tldC5nZXRVSW50MzIoKTsKKworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtTmFtZSA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgaWYgKHBhcnNlRGF0ZVRpbWUoKGNvbnN0IGNoYXIqKXN0cmluZywgdGltZSkpCisgICAgICAgIG1EYXRlQ3JlYXRlZCA9IHRpbWU7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgaWYgKHBhcnNlRGF0ZVRpbWUoKGNvbnN0IGNoYXIqKXN0cmluZywgdGltZSkpCisgICAgICAgIG1EYXRlTW9kaWZpZWQgPSB0aW1lOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1LZXl3b3JkcyA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7Cit9CisKK3ZvaWQgTXRwT2JqZWN0SW5mbzo6cHJpbnQoKSB7CisgICAgTE9HRCgiTXRwT2JqZWN0IEluZm8gJTA4WDogJXNcbiIsIG1IYW5kbGUsIG1OYW1lKTsKKyAgICBMT0dEKCIgIG1TdG9yYWdlSUQ6ICUwOFggbUZvcm1hdDogJTA0WCBtUHJvdGVjdGlvblN0YXR1czogJWRcbiIsCisgICAgICAgICAgICBtU3RvcmFnZUlELCBtRm9ybWF0LCBtUHJvdGVjdGlvblN0YXR1cyk7CisgICAgTE9HRCgiICBtQ29tcHJlc3NlZFNpemU6ICVkIG1UaHVtYkZvcm1hdDogJTA0WCBtVGh1bWJDb21wcmVzc2VkU2l6ZTogJWRcbiIsCisgICAgICAgICAgICBtQ29tcHJlc3NlZFNpemUsIG1Gb3JtYXQsIG1UaHVtYkNvbXByZXNzZWRTaXplKTsKKyAgICBMT0dEKCIgIG1UaHVtYlBpeFdpZHRoOiAlZCBtVGh1bWJQaXhIZWlnaHQ6ICVkXG4iLCBtVGh1bWJQaXhXaWR0aCwgbVRodW1iUGl4SGVpZ2h0KTsKKyAgICBMT0dEKCIgIG1JbWFnZVBpeFdpZHRoOiAlZCBtSW1hZ2VQaXhIZWlnaHQ6ICVkIG1JbWFnZVBpeERlcHRoOiAlZFxuIiwKKyAgICAgICAgICAgIG1JbWFnZVBpeFdpZHRoLCBtSW1hZ2VQaXhIZWlnaHQsIG1JbWFnZVBpeERlcHRoKTsKKyAgICBMT0dEKCIgIG1QYXJlbnQ6ICUwOFggbUFzc29jaWF0aW9uVHlwZTogJTA0WCBtQXNzb2NpYXRpb25EZXNjOiAlMDRYXG4iLAorICAgICAgICAgICAgbVBhcmVudCwgbUFzc29jaWF0aW9uVHlwZSwgbUFzc29jaWF0aW9uRGVzYyk7CisgICAgTE9HRCgiICBtU2VxdWVuY2VOdW1iZXI6ICVkIG1EYXRlQ3JlYXRlZDogJWxkIG1EYXRlTW9kaWZpZWQ6ICVsZCBtS2V5d29yZHM6ICVzXG4iLAorICAgICAgICAgICAgbVNlcXVlbmNlTnVtYmVyLCBtRGF0ZUNyZWF0ZWQsIG1EYXRlTW9kaWZpZWQsIG1LZXl3b3Jkcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwT2JqZWN0SW5mby5oIGIvbWVkaWEvbXRwL010cE9iamVjdEluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2E0NDljYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBPYmplY3RJbmZvLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9PQkpFQ1RfSU5GT19ICisjZGVmaW5lIF9NVFBfT0JKRUNUX0lORk9fSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworCitjbGFzcyBNdHBPYmplY3RJbmZvIHsKK3B1YmxpYzoKKyAgICBNdHBPYmplY3RIYW5kbGUgICAgIG1IYW5kbGU7CisgICAgTXRwU3RvcmFnZUlEICAgICAgICBtU3RvcmFnZUlEOworICAgIE10cE9iamVjdEZvcm1hdCAgICAgbUZvcm1hdDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgIG1Qcm90ZWN0aW9uU3RhdHVzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbUNvbXByZXNzZWRTaXplOworICAgIE10cE9iamVjdEZvcm1hdCAgICAgbVRodW1iRm9ybWF0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgbVRodW1iQ29tcHJlc3NlZFNpemU7CisgICAgdWludDMyX3QgICAgICAgICAgICBtVGh1bWJQaXhXaWR0aDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1UaHVtYlBpeEhlaWdodDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1JbWFnZVBpeFdpZHRoOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbUltYWdlUGl4SGVpZ2h0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgbUltYWdlUGl4RGVwdGg7CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICBtUGFyZW50OworICAgIHVpbnQxNl90ICAgICAgICAgICAgbUFzc29jaWF0aW9uVHlwZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1Bc3NvY2lhdGlvbkRlc2M7CisgICAgdWludDMyX3QgICAgICAgICAgICBtU2VxdWVuY2VOdW1iZXI7CisgICAgY2hhciogICAgICAgICAgICAgICBtTmFtZTsKKyAgICB0aW1lX3QgICAgICAgICAgICAgIG1EYXRlQ3JlYXRlZDsKKyAgICB0aW1lX3QgICAgICAgICAgICAgIG1EYXRlTW9kaWZpZWQ7CisgICAgY2hhciogICAgICAgICAgICAgICBtS2V5d29yZHM7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwT2JqZWN0SW5mbygpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICByZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHByaW50KCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9PQkpFQ1RfSU5GT19ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUGFja2V0LmNwcCBiL21lZGlhL210cC9NdHBQYWNrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYmY4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUGFja2V0LmNwcApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwUGFja2V0IgorCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKKyNpbmNsdWRlICJNdHBQYWNrZXQuaCIKKyNpbmNsdWRlICJtdHAuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPHVzYmhvc3QvdXNiaG9zdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFBhY2tldDo6TXRwUGFja2V0KGludCBidWZmZXJTaXplKQorICAgIDogICBtQnVmZmVyKE5VTEwpLAorICAgICAgICBtQnVmZmVyU2l6ZShidWZmZXJTaXplKSwKKyAgICAgICAgbUFsbG9jYXRpb25JbmNyZW1lbnQoYnVmZmVyU2l6ZSksCisgICAgICAgIG1QYWNrZXRTaXplKDApCit7CisgICAgbUJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKGJ1ZmZlclNpemUpOworICAgIGlmICghbUJ1ZmZlcikgeworICAgICAgICBMT0dFKCJvdXQgb2YgbWVtb3J5ISIpOworICAgICAgICBhYm9ydCgpOworICAgIH0KK30KKworTXRwUGFja2V0Ojp+TXRwUGFja2V0KCkgeworICAgIGlmIChtQnVmZmVyKQorICAgICAgICBmcmVlKG1CdWZmZXIpOworfQorCit2b2lkIE10cFBhY2tldDo6cmVzZXQoKSB7CisgICAgYWxsb2NhdGUoTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgbVBhY2tldFNpemUgPSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFOworICAgIG1lbXNldChtQnVmZmVyLCAwLCBtQnVmZmVyU2l6ZSk7Cit9CisKK3ZvaWQgTXRwUGFja2V0OjphbGxvY2F0ZShpbnQgbGVuZ3RoKSB7CisgICAgaWYgKGxlbmd0aCA+IG1CdWZmZXJTaXplKSB7CisgICAgICAgIGludCBuZXdMZW5ndGggPSBsZW5ndGggKyBtQWxsb2NhdGlvbkluY3JlbWVudDsKKyAgICAgICAgbUJ1ZmZlciA9ICh1aW50OF90ICopcmVhbGxvYyhtQnVmZmVyLCBuZXdMZW5ndGgpOworICAgICAgICBpZiAoIW1CdWZmZXIpIHsKKyAgICAgICAgICAgIExPR0UoIm91dCBvZiBtZW1vcnkhIik7CisgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisgICAgICAgIG1CdWZmZXJTaXplID0gbmV3TGVuZ3RoOworICAgIH0KK30KKwordm9pZCBNdHBQYWNrZXQ6OmR1bXAoKSB7CisjZGVmaW5lIERVTVBfQllURVNfUEVSX1JPVyAgMTYKKyAgICBjaGFyIGJ1ZmZlcls1MDBdOworICAgIGNoYXIqIGJ1ZnB0ciA9IGJ1ZmZlcjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVBhY2tldFNpemU7IGkrKykgeworICAgICAgICBzcHJpbnRmKGJ1ZnB0ciwgIiUwMlggIiwgbUJ1ZmZlcltpXSk7CisgICAgICAgIGJ1ZnB0ciArPSBzdHJsZW4oYnVmcHRyKTsKKyAgICAgICAgaWYgKGkgJSBEVU1QX0JZVEVTX1BFUl9ST1cgPT0gKERVTVBfQllURVNfUEVSX1JPVyAtIDEpKSB7CisgICAgICAgICAgICBMT0dWKCIlcyIsIGJ1ZmZlcik7CisgICAgICAgICAgICBidWZwdHIgPSBidWZmZXI7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJ1ZnB0ciAhPSBidWZmZXIpIHsKKyAgICAgICAgLy8gcHJpbnQgbGFzdCBsaW5lCisgICAgICAgIExPR1YoIiVzIiwgYnVmZmVyKTsKKyAgICB9CisgICAgTE9HVigiXG4iKTsKK30KKwordWludDE2X3QgTXRwUGFja2V0OjpnZXRVSW50MTYoaW50IG9mZnNldCkgY29uc3QgeworICAgIHJldHVybiAoKHVpbnQxNl90KW1CdWZmZXJbb2Zmc2V0ICsgMV0gPDwgOCkgfCAodWludDE2X3QpbUJ1ZmZlcltvZmZzZXRdOworfQorCit1aW50MzJfdCBNdHBQYWNrZXQ6OmdldFVJbnQzMihpbnQgb2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuICgodWludDMyX3QpbUJ1ZmZlcltvZmZzZXQgKyAzXSA8PCAyNCkgfCAoKHVpbnQzMl90KW1CdWZmZXJbb2Zmc2V0ICsgMl0gPDwgMTYpIHwKKyAgICAgICAgICAgKCh1aW50MzJfdCltQnVmZmVyW29mZnNldCArIDFdIDw8IDgpICB8ICh1aW50MzJfdCltQnVmZmVyW29mZnNldF07Cit9CisKK3ZvaWQgTXRwUGFja2V0OjpwdXRVSW50MTYoaW50IG9mZnNldCwgdWludDE2X3QgdmFsdWUpIHsKKyAgICBtQnVmZmVyW29mZnNldCsrXSA9ICh1aW50OF90KSh2YWx1ZSAmIDB4RkYpOworICAgIG1CdWZmZXJbb2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworfQorCit2b2lkIE10cFBhY2tldDo6cHV0VUludDMyKGludCBvZmZzZXQsIHVpbnQzMl90IHZhbHVlKSB7CisgICAgbUJ1ZmZlcltvZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW29mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW29mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMTYpICYgMHhGRik7CisgICAgbUJ1ZmZlcltvZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDI0KSAmIDB4RkYpOworfQorCit1aW50MTZfdCBNdHBQYWNrZXQ6OmdldENvbnRhaW5lckNvZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFVJbnQxNihNVFBfQ09OVEFJTkVSX0NPREVfT0ZGU0VUKTsKK30KKwordm9pZCBNdHBQYWNrZXQ6OnNldENvbnRhaW5lckNvZGUodWludDE2X3QgY29kZSkgeworICAgIHB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX0NPREVfT0ZGU0VULCBjb2RlKTsKK30KKworTXRwVHJhbnNhY3Rpb25JRCBNdHBQYWNrZXQ6OmdldFRyYW5zYWN0aW9uSUQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFVJbnQzMihNVFBfQ09OVEFJTkVSX1RSQU5TQUNUSU9OX0lEX09GRlNFVCk7Cit9CisKK3ZvaWQgTXRwUGFja2V0OjpzZXRUcmFuc2FjdGlvbklEKE10cFRyYW5zYWN0aW9uSUQgaWQpIHsKKyAgICBwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9UUkFOU0FDVElPTl9JRF9PRkZTRVQsIGlkKTsKK30KKwordWludDMyX3QgTXRwUGFja2V0OjpnZXRQYXJhbWV0ZXIoaW50IGluZGV4KSBjb25zdCB7CisgICAgaWYgKGluZGV4IDwgMSB8fCBpbmRleCA+IDUpIHsKKyAgICAgICAgTE9HRSgiaW5kZXggJWQgb3V0IG9mIHJhbmdlIGluIE10cFJlcXVlc3RQYWNrZXQ6OmdldFBhcmFtZXRlciIsIGluZGV4KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBnZXRVSW50MzIoTVRQX0NPTlRBSU5FUl9QQVJBTUVURVJfT0ZGU0VUICsgKGluZGV4IC0gMSkgKiBzaXplb2YodWludDMyX3QpKTsKK30KKwordm9pZCBNdHBQYWNrZXQ6OnNldFBhcmFtZXRlcihpbnQgaW5kZXgsIHVpbnQzMl90IHZhbHVlKSB7CisgICAgaWYgKGluZGV4IDwgMSB8fCBpbmRleCA+IDUpIHsKKyAgICAgICAgTE9HRSgiaW5kZXggJWQgb3V0IG9mIHJhbmdlIGluIE10cFJlc3BvbnNlUGFja2V0OjpzZXRQYXJhbWV0ZXIiLCBpbmRleCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50IG9mZnNldCA9IE1UUF9DT05UQUlORVJfUEFSQU1FVEVSX09GRlNFVCArIChpbmRleCAtIDEpICogc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBvZmZzZXQgKyBzaXplb2YodWludDMyX3QpKQorICAgICAgICBtUGFja2V0U2l6ZSA9IG9mZnNldCArIHNpemVvZih1aW50MzJfdCk7CisgICAgcHV0VUludDMyKG9mZnNldCwgdmFsdWUpOworfQorCisjaWZkZWYgTVRQX0hPU1QKK2ludCBNdHBQYWNrZXQ6OnRyYW5zZmVyKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwLCB2b2lkKiBidWZmZXIsIGludCBsZW5ndGgpIHsKKyAgICBpZiAodXNiX2VuZHBvaW50X3F1ZXVlKGVwLCBidWZmZXIsIGxlbmd0aCkpIHsKKyAgICAgICAgTE9HRSgidXNiX2VuZHBvaW50X3F1ZXVlIGZhaWxlZCwgZXJybm86ICVkIiwgZXJybm8pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGludCBlcF9udW07CisgICAgcmV0dXJuIHVzYl9lbmRwb2ludF93YWl0KHVzYl9lbmRwb2ludF9nZXRfZGV2aWNlKGVwKSwgJmVwX251bSk7Cit9CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBQYWNrZXQuaCBiL21lZGlhL210cC9NdHBQYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzhkNmRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFBhY2tldC5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfUEFDS0VUX0gKKyNkZWZpbmUgX01UUF9QQUNLRVRfSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworc3RydWN0IHVzYl9lbmRwb2ludDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBQYWNrZXQgeworCitwcm90ZWN0ZWQ6CisgICAgdWludDhfdCogICAgICAgICAgICBtQnVmZmVyOworICAgIC8vIGN1cnJlbnQgc2l6ZSBvZiB0aGUgYnVmZmVyCisgICAgaW50ICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZTsKKyAgICAvLyBudW1iZXIgb2YgYnl0ZXMgdG8gYWRkIHdoZW4gcmVzaXppbmcgdGhlIGJ1ZmZlcgorICAgIGludCAgICAgICAgICAgICAgICAgbUFsbG9jYXRpb25JbmNyZW1lbnQ7CisgICAgLy8gc2l6ZSBvZiB0aGUgZGF0YSBpbiB0aGUgcGFja2V0CisgICAgaW50ICAgICAgICAgICAgICAgICBtUGFja2V0U2l6ZTsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwUGFja2V0KGludCBidWZmZXJTaXplKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBQYWNrZXQoKTsKKworICAgIC8vIHNldHMgcGFja2V0IHNpemUgdG8gdGhlIGRlZmF1bHQgY29udGFpbmVyIHNpemUgYW5kIHNldHMgYnVmZmVyIHRvIHplcm8KKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlc2V0KCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIGFsbG9jYXRlKGludCBsZW5ndGgpOworICAgIHZvaWQgICAgICAgICAgICAgICAgZHVtcCgpOworCisgICAgdWludDE2X3QgICAgICAgICAgICBnZXRDb250YWluZXJDb2RlKCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRDb250YWluZXJDb2RlKHVpbnQxNl90IGNvZGUpOworCisgICAgTXRwVHJhbnNhY3Rpb25JRCAgICBnZXRUcmFuc2FjdGlvbklEKCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRUcmFuc2FjdGlvbklEKE10cFRyYW5zYWN0aW9uSUQgaWQpOworCisgICAgdWludDMyX3QgICAgICAgICAgICBnZXRQYXJhbWV0ZXIoaW50IGluZGV4KSBjb25zdDsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlcihpbnQgaW5kZXgsIHVpbnQzMl90IHZhbHVlKTsKKworI2lmZGVmIE1UUF9IT1NUCisgICAgaW50ICAgICAgICAgICAgICAgICB0cmFuc2ZlcihzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCwgdm9pZCogYnVmZmVyLCBpbnQgbGVuZ3RoKTsKKyNlbmRpZgorCitwcm90ZWN0ZWQ6CisgICAgdWludDE2X3QgICAgICAgICAgICBnZXRVSW50MTYoaW50IG9mZnNldCkgY29uc3Q7CisgICAgdWludDMyX3QgICAgICAgICAgICBnZXRVSW50MzIoaW50IG9mZnNldCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRVSW50MTYoaW50IG9mZnNldCwgdWludDE2X3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDMyKGludCBvZmZzZXQsIHVpbnQzMl90IHZhbHVlKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1BBQ0tFVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUHJvcGVydHkuY3BwIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmQwMjM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcApAQCAtMCwwICsxLDM1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwUHJvcGVydHkiCisKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwUHJvcGVydHkuaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFByb3BlcnR5OjpNdHBQcm9wZXJ0eSgpCisgICAgOiAgIG1Db2RlKDApLAorICAgICAgICBtVHlwZSgwKSwKKyAgICAgICAgbVdyaXRlYWJsZShmYWxzZSksCisgICAgICAgIG1EZWZhdWx0QXJyYXlMZW5ndGgoMCksCisgICAgICAgIG1EZWZhdWx0QXJyYXlWYWx1ZXMoTlVMTCksCisgICAgICAgIG1DdXJyZW50QXJyYXlMZW5ndGgoMCksCisgICAgICAgIG1DdXJyZW50QXJyYXlWYWx1ZXMoTlVMTCksCisgICAgICAgIG1Hcm91cENvZGUoMCksCisgICAgICAgIG1Gb3JtRmxhZyhrRm9ybU5vbmUpLAorICAgICAgICBtRW51bUxlbmd0aCgwKSwKKyAgICAgICAgbUVudW1WYWx1ZXMoTlVMTCkKK3sKKyAgICBtZW1zZXQoJm1EZWZhdWx0VmFsdWUsIDAsIHNpemVvZihtRGVmYXVsdFZhbHVlKSk7CisgICAgbWVtc2V0KCZtQ3VycmVudFZhbHVlLCAwLCBzaXplb2YobUN1cnJlbnRWYWx1ZSkpOworICAgIG1lbXNldCgmbU1pbmltdW1WYWx1ZSwgMCwgc2l6ZW9mKG1NaW5pbXVtVmFsdWUpKTsKKyAgICBtZW1zZXQoJm1NYXhpbXVtVmFsdWUsIDAsIHNpemVvZihtTWF4aW11bVZhbHVlKSk7Cit9CisKK010cFByb3BlcnR5OjpNdHBQcm9wZXJ0eShNdHBQcm9wZXJ0eUNvZGUgcHJvcENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlKQorICAgIDogICBtQ29kZShwcm9wQ29kZSksCisgICAgICAgIG1UeXBlKHR5cGUpLAorICAgICAgICBtV3JpdGVhYmxlKHdyaXRlYWJsZSksCisgICAgICAgIG1EZWZhdWx0QXJyYXlMZW5ndGgoMCksCisgICAgICAgIG1EZWZhdWx0QXJyYXlWYWx1ZXMoTlVMTCksCisgICAgICAgIG1DdXJyZW50QXJyYXlMZW5ndGgoMCksCisgICAgICAgIG1DdXJyZW50QXJyYXlWYWx1ZXMoTlVMTCksCisgICAgICAgIG1Hcm91cENvZGUoMCksCisgICAgICAgIG1Gb3JtRmxhZyhrRm9ybU5vbmUpLAorICAgICAgICBtRW51bUxlbmd0aCgwKSwKKyAgICAgICAgbUVudW1WYWx1ZXMoTlVMTCkKK3sKKyAgICBtZW1zZXQoJm1EZWZhdWx0VmFsdWUsIDAsIHNpemVvZihtRGVmYXVsdFZhbHVlKSk7CisgICAgbWVtc2V0KCZtQ3VycmVudFZhbHVlLCAwLCBzaXplb2YobUN1cnJlbnRWYWx1ZSkpOworICAgIG1lbXNldCgmbU1pbmltdW1WYWx1ZSwgMCwgc2l6ZW9mKG1NaW5pbXVtVmFsdWUpKTsKKyAgICBtZW1zZXQoJm1NYXhpbXVtVmFsdWUsIDAsIHNpemVvZihtTWF4aW11bVZhbHVlKSk7CisKKyAgICBpZiAoZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ4OgorICAgICAgICAgICAgICAgIG1EZWZhdWx0VmFsdWUudS5pOCA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDg6CisgICAgICAgICAgICAgICAgbURlZmF1bHRWYWx1ZS51LnU4ID0gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxNjoKKyAgICAgICAgICAgICAgICBtRGVmYXVsdFZhbHVlLnUuaTE2ID0gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTY6CisgICAgICAgICAgICAgICAgbURlZmF1bHRWYWx1ZS51LnUxNiA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMzI6CisgICAgICAgICAgICAgICAgbURlZmF1bHRWYWx1ZS51LmkzMiA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDMyOgorICAgICAgICAgICAgICAgIG1EZWZhdWx0VmFsdWUudS51MzIgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDY0OgorICAgICAgICAgICAgICAgIG1EZWZhdWx0VmFsdWUudS5pNjQgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ2NDoKKyAgICAgICAgICAgICAgICBtRGVmYXVsdFZhbHVlLnUudTY0ID0gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dFKCJ1bmtub3duIHR5cGUgJTA0WCBpbiBNdHBQcm9wZXJ0eTo6TXRwUHJvcGVydHkiLCB0eXBlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworTXRwUHJvcGVydHk6On5NdHBQcm9wZXJ0eSgpIHsKKyAgICBpZiAobVR5cGUgPT0gTVRQX1RZUEVfU1RSKSB7CisgICAgICAgIC8vIGZyZWUgYWxsIHN0cmluZ3MKKyAgICAgICAgZnJlZShtRGVmYXVsdFZhbHVlLnN0cik7CisgICAgICAgIGZyZWUobUN1cnJlbnRWYWx1ZS5zdHIpOworICAgICAgICBmcmVlKG1NaW5pbXVtVmFsdWUuc3RyKTsKKyAgICAgICAgZnJlZShtTWF4aW11bVZhbHVlLnN0cik7CisgICAgICAgIGlmIChtRGVmYXVsdEFycmF5VmFsdWVzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1EZWZhdWx0QXJyYXlMZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBmcmVlKG1EZWZhdWx0QXJyYXlWYWx1ZXNbaV0uc3RyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUN1cnJlbnRBcnJheVZhbHVlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ3VycmVudEFycmF5TGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgZnJlZShtQ3VycmVudEFycmF5VmFsdWVzW2ldLnN0cik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1FbnVtVmFsdWVzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1FbnVtTGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgZnJlZShtRW51bVZhbHVlc1tpXS5zdHIpOworICAgICAgICB9CisgICAgfQorICAgIGRlbGV0ZVtdIG1EZWZhdWx0QXJyYXlWYWx1ZXM7CisgICAgZGVsZXRlW10gbUN1cnJlbnRBcnJheVZhbHVlczsKKyAgICBkZWxldGVbXSBtRW51bVZhbHVlczsKK30KKwordm9pZCBNdHBQcm9wZXJ0eTo6cmVhZChNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBib29sIGRldmljZVByb3AgPSBpc0RldmljZVByb3BlcnR5KCk7CisKKyAgICBtQ29kZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtVHlwZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtV3JpdGVhYmxlID0gKHBhY2tldC5nZXRVSW50OCgpID09IDEpOworICAgIHN3aXRjaCAobVR5cGUpIHsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMTY6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMzI6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDY0OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UNjQ6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDEyODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDEyODoKKyAgICAgICAgICAgIG1EZWZhdWx0QXJyYXlWYWx1ZXMgPSByZWFkQXJyYXlWYWx1ZXMocGFja2V0LCBtRGVmYXVsdEFycmF5TGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2VQcm9wKQorICAgICAgICAgICAgICAgIG1DdXJyZW50QXJyYXlWYWx1ZXMgPSByZWFkQXJyYXlWYWx1ZXMocGFja2V0LCBtQ3VycmVudEFycmF5TGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgbURlZmF1bHRWYWx1ZSk7CisgICAgICAgICAgICBpZiAoZGV2aWNlUHJvcCkKKyAgICAgICAgICAgICAgICByZWFkVmFsdWUocGFja2V0LCBtQ3VycmVudFZhbHVlKTsKKyAgICB9CisgICAgaWYgKCFkZXZpY2VQcm9wKQorICAgICAgICBtR3JvdXBDb2RlID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1Gb3JtRmxhZyA9IHBhY2tldC5nZXRVSW50OCgpOworCisgICAgaWYgKG1Gb3JtRmxhZyA9PSBrRm9ybVJhbmdlKSB7CisgICAgICAgICAgICByZWFkVmFsdWUocGFja2V0LCBtTWluaW11bVZhbHVlKTsKKyAgICAgICAgICAgIHJlYWRWYWx1ZShwYWNrZXQsIG1NYXhpbXVtVmFsdWUpOworICAgICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgbVN0ZXBTaXplKTsKKyAgICB9IGVsc2UgaWYgKG1Gb3JtRmxhZyA9PSBrRm9ybUVudW0pIHsKKyAgICAgICAgbUVudW1MZW5ndGggPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgICAgIG1FbnVtVmFsdWVzID0gbmV3IE10cFByb3BlcnR5VmFsdWVbbUVudW1MZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1FbnVtTGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZWFkVmFsdWUocGFja2V0LCBtRW51bVZhbHVlc1tpXSk7CisgICAgfQorfQorCit2b2lkIE10cFByb3BlcnR5Ojp3cml0ZShNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBib29sIGRldmljZVByb3AgPSBpc0RldmljZVByb3BlcnR5KCk7CisKKyAgICBwYWNrZXQucHV0VUludDE2KG1Db2RlKTsKKyAgICBwYWNrZXQucHV0VUludDE2KG1UeXBlKTsKKyAgICBwYWNrZXQucHV0VUludDgobVdyaXRlYWJsZSA/IDEgOiAwKTsKKworICAgIHN3aXRjaCAobVR5cGUpIHsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMTY6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMzI6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDY0OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UNjQ6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDEyODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDEyODoKKyAgICAgICAgICAgIHdyaXRlQXJyYXlWYWx1ZXMocGFja2V0LCBtRGVmYXVsdEFycmF5VmFsdWVzLCBtRGVmYXVsdEFycmF5TGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2VQcm9wKQorICAgICAgICAgICAgICAgIHdyaXRlQXJyYXlWYWx1ZXMocGFja2V0LCBtQ3VycmVudEFycmF5VmFsdWVzLCBtQ3VycmVudEFycmF5TGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1EZWZhdWx0VmFsdWUpOworICAgICAgICAgICAgaWYgKGRldmljZVByb3ApCisgICAgICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1DdXJyZW50VmFsdWUpOworICAgIH0KKyAgICBwYWNrZXQucHV0VUludDMyKG1Hcm91cENvZGUpOworICAgIGlmICghZGV2aWNlUHJvcCkKKyAgICAgICAgcGFja2V0LnB1dFVJbnQ4KG1Gb3JtRmxhZyk7CisgICAgaWYgKG1Gb3JtRmxhZyA9PSBrRm9ybVJhbmdlKSB7CisgICAgICAgICAgICB3cml0ZVZhbHVlKHBhY2tldCwgbU1pbmltdW1WYWx1ZSk7CisgICAgICAgICAgICB3cml0ZVZhbHVlKHBhY2tldCwgbU1heGltdW1WYWx1ZSk7CisgICAgICAgICAgICB3cml0ZVZhbHVlKHBhY2tldCwgbVN0ZXBTaXplKTsKKyAgICB9IGVsc2UgaWYgKG1Gb3JtRmxhZyA9PSBrRm9ybUVudW0pIHsKKyAgICAgICAgcGFja2V0LnB1dFVJbnQxNihtRW51bUxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUVudW1MZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHdyaXRlVmFsdWUocGFja2V0LCBtRW51bVZhbHVlc1tpXSk7CisgICAgfQorfQorCit2b2lkIE10cFByb3BlcnR5OjpzZXREZWZhdWx0VmFsdWUoY29uc3QgdWludDE2X3QqIHN0cmluZykgeworICAgIGZyZWUobURlZmF1bHRWYWx1ZS5zdHIpOworICAgIGlmIChzdHJpbmcpIHsKKyAgICAgICAgTXRwU3RyaW5nQnVmZmVyIGJ1ZmZlcihzdHJpbmcpOworICAgICAgICBtRGVmYXVsdFZhbHVlLnN0ciA9IHN0cmR1cChidWZmZXIpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIG1EZWZhdWx0VmFsdWUuc3RyID0gTlVMTDsKK30KKwordm9pZCBNdHBQcm9wZXJ0eTo6c2V0Q3VycmVudFZhbHVlKGNvbnN0IHVpbnQxNl90KiBzdHJpbmcpIHsKKyAgICBmcmVlKG1DdXJyZW50VmFsdWUuc3RyKTsKKyAgICBpZiAoc3RyaW5nKSB7CisgICAgICAgIE10cFN0cmluZ0J1ZmZlciBidWZmZXIoc3RyaW5nKTsKKyAgICAgICAgbUN1cnJlbnRWYWx1ZS5zdHIgPSBzdHJkdXAoYnVmZmVyKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBtQ3VycmVudFZhbHVlLnN0ciA9IE5VTEw7Cit9CisKK3ZvaWQgTXRwUHJvcGVydHk6OnByaW50KCkgeworICAgIExPR1YoIk10cFByb3BlcnR5ICUwNFhcbiIsIG1Db2RlKTsKKyAgICBMT0dWKCIgICAgdHlwZSAlMDRYXG4iLCBtVHlwZSk7CisgICAgTE9HVigiICAgIHdyaXRlYWJsZSAlc1xuIiwgKG1Xcml0ZWFibGUgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7Cit9CisKK3ZvaWQgTXRwUHJvcGVydHk6OnJlYWRWYWx1ZShNdHBEYXRhUGFja2V0JiBwYWNrZXQsIE10cFByb3BlcnR5VmFsdWUmIHZhbHVlKSB7CisgICAgTXRwU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlcjsKKworICAgIHN3aXRjaCAobVR5cGUpIHsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQ4OgorICAgICAgICAgICAgdmFsdWUudS5pOCA9IHBhY2tldC5nZXRJbnQ4KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDg6CisgICAgICAgICAgICB2YWx1ZS51LnU4ID0gcGFja2V0LmdldFVJbnQ4KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxNjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMTY6CisgICAgICAgICAgICB2YWx1ZS51LmkxNiA9IHBhY2tldC5nZXRJbnQxNigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMTY6CisgICAgICAgICAgICB2YWx1ZS51LnUxNiA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQzMjoKKyAgICAgICAgICAgIHZhbHVlLnUuaTMyID0gcGFja2V0LmdldEludDMyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMzI6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQzMjoKKyAgICAgICAgICAgIHZhbHVlLnUudTMyID0gcGFja2V0LmdldFVJbnQzMigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UNjQ6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDY0OgorICAgICAgICAgICAgdmFsdWUudS5pNjQgPSBwYWNrZXQuZ2V0SW50NjQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ2NDoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDY0OgorICAgICAgICAgICAgdmFsdWUudS51NjQgPSBwYWNrZXQuZ2V0VUludDY0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxMjg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDEyODoKKyAgICAgICAgICAgIHBhY2tldC5nZXRJbnQxMjgodmFsdWUudS5pMTI4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxMjg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQxMjg6CisgICAgICAgICAgICBwYWNrZXQuZ2V0VUludDEyOCh2YWx1ZS51LnUxMjgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfU1RSOgorICAgICAgICAgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmdCdWZmZXIpOworICAgICAgICAgICAgdmFsdWUuc3RyID0gc3RyZHVwKHN0cmluZ0J1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoInVua25vd24gdHlwZSAlMDRYIGluIE10cFByb3BlcnR5OjpyZWFkVmFsdWUiLCBtVHlwZSk7CisgICAgfQorfQorCit2b2lkIE10cFByb3BlcnR5Ojp3cml0ZVZhbHVlKE10cERhdGFQYWNrZXQmIHBhY2tldCwgTXRwUHJvcGVydHlWYWx1ZSYgdmFsdWUpIHsKKyAgICBNdHBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyOworCisgICAgc3dpdGNoIChtVHlwZSkgeworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDg6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50OCh2YWx1ZS51Lmk4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50OCh2YWx1ZS51LnU4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxNjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQxNih2YWx1ZS51LmkxNik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTY6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQxNjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50MTYodmFsdWUudS51MTYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMzI6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDMyOgorICAgICAgICAgICAgcGFja2V0LnB1dEludDMyKHZhbHVlLnUuaTMyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQzMjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDMyOgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQzMih2YWx1ZS51LnUzMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ2NDoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UNjQ6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50NjQodmFsdWUudS5pNjQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDY0OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UNjQ6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDY0KHZhbHVlLnUudTY0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDEyODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMTI4OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDEyOCh2YWx1ZS51LmkxMjgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDEyODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDEyODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50MTI4KHZhbHVlLnUudTEyOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9TVFI6CisgICAgICAgICAgICBpZiAodmFsdWUuc3RyKQorICAgICAgICAgICAgICAgIHBhY2tldC5wdXRTdHJpbmcodmFsdWUuc3RyKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwYWNrZXQucHV0RW1wdHlTdHJpbmcoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRSgidW5rbm93biB0eXBlICUwNFggaW4gTXRwUHJvcGVydHk6OndyaXRlVmFsdWUiLCBtVHlwZSk7CisgICAgfQorfQorCitNdHBQcm9wZXJ0eVZhbHVlKiBNdHBQcm9wZXJ0eTo6cmVhZEFycmF5VmFsdWVzKE10cERhdGFQYWNrZXQmIHBhY2tldCwgaW50JiBsZW5ndGgpIHsKKyAgICBsZW5ndGggPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlKiByZXN1bHQgPSBuZXcgTXRwUHJvcGVydHlWYWx1ZVtsZW5ndGhdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIHJlYWRWYWx1ZShwYWNrZXQsIHJlc3VsdFtpXSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBNdHBQcm9wZXJ0eTo6d3JpdGVBcnJheVZhbHVlcyhNdHBEYXRhUGFja2V0JiBwYWNrZXQsIE10cFByb3BlcnR5VmFsdWUqIHZhbHVlcywgaW50IGxlbmd0aCkgeworICAgIHBhY2tldC5wdXRVSW50MzIobGVuZ3RoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICB3cml0ZVZhbHVlKHBhY2tldCwgdmFsdWVzW2ldKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBQcm9wZXJ0eS5oIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThiNDY1YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBQcm9wZXJ0eS5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1BST1BFUlRZX0gKKyNkZWZpbmUgX01UUF9QUk9QRVJUWV9ICisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERhdGFQYWNrZXQ7CisKK3N0cnVjdCBNdHBQcm9wZXJ0eVZhbHVlIHsKKyAgICB1bmlvbiB7CisgICAgICAgIGludDhfdCAgICAgICAgICBpODsKKyAgICAgICAgdWludDhfdCAgICAgICAgIHU4OworICAgICAgICBpbnQxNl90ICAgICAgICAgaTE2OworICAgICAgICB1aW50MTZfdCAgICAgICAgdTE2OworICAgICAgICBpbnQzMl90ICAgICAgICAgaTMyOworICAgICAgICB1aW50MzJfdCAgICAgICAgdTMyOworICAgICAgICBpbnQ2NF90ICAgICAgICAgaTY0OworICAgICAgICB1aW50NjRfdCAgICAgICAgdTY0OworICAgICAgICBpbnQxMjhfdCAgICAgICAgaTEyODsKKyAgICAgICAgdWludDEyOF90ICAgICAgIHUxMjg7CisgICAgfSB1OworICAgIC8vIHN0cmluZyBpbiBVVEY4IGZvcm1hdAorICAgIGNoYXIqICAgICAgICAgICAgICAgc3RyOworfTsKKworY2xhc3MgTXRwUHJvcGVydHkgeworcHVibGljOgorICAgIE10cFByb3BlcnR5Q29kZSAgICAgbUNvZGU7CisgICAgTXRwRGF0YVR5cGUgICAgICAgICBtVHlwZTsKKyAgICBib29sICAgICAgICAgICAgICAgIG1Xcml0ZWFibGU7CisgICAgTXRwUHJvcGVydHlWYWx1ZSAgICBtRGVmYXVsdFZhbHVlOworICAgIE10cFByb3BlcnR5VmFsdWUgICAgbUN1cnJlbnRWYWx1ZTsKKworICAgIC8vIGZvciBhcnJheSB0eXBlcworICAgIGludCAgICAgICAgICAgICAgICAgbURlZmF1bHRBcnJheUxlbmd0aDsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlKiAgIG1EZWZhdWx0QXJyYXlWYWx1ZXM7CisgICAgaW50ICAgICAgICAgICAgICAgICBtQ3VycmVudEFycmF5TGVuZ3RoOworICAgIE10cFByb3BlcnR5VmFsdWUqICAgbUN1cnJlbnRBcnJheVZhbHVlczsKKworICAgIGVudW0geworICAgICAgICBrRm9ybU5vbmUgPSAwLAorICAgICAgICBrRm9ybVJhbmdlID0gMSwKKyAgICAgICAga0Zvcm1FbnVtID0gMiwKKyAgICB9OworCisgICAgdWludDMyX3QgICAgICAgICAgICBtR3JvdXBDb2RlOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgbUZvcm1GbGFnOworCisgICAgLy8gZm9yIHJhbmdlIGZvcm0KKyAgICBNdHBQcm9wZXJ0eVZhbHVlICAgIG1NaW5pbXVtVmFsdWU7CisgICAgTXRwUHJvcGVydHlWYWx1ZSAgICBtTWF4aW11bVZhbHVlOworICAgIE10cFByb3BlcnR5VmFsdWUgICAgbVN0ZXBTaXplOworCisgICAgLy8gZm9yIGVudW0gZm9ybQorICAgIGludCAgICAgICAgICAgICAgICAgbUVudW1MZW5ndGg7CisgICAgTXRwUHJvcGVydHlWYWx1ZSogICBtRW51bVZhbHVlczsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwUHJvcGVydHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFByb3BlcnR5KE10cFByb3BlcnR5Q29kZSBwcm9wQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGVhYmxlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSA9IDApOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cFByb3BlcnR5KCk7CisKKyAgICBpbmxpbmUgTXRwUHJvcGVydHlDb2RlIGdldFByb3BlcnR5Q29kZSgpIGNvbnN0IHsgcmV0dXJuIG1Db2RlOyB9CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHdyaXRlKE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNldERlZmF1bHRWYWx1ZShjb25zdCB1aW50MTZfdCogc3RyaW5nKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNldEN1cnJlbnRWYWx1ZShjb25zdCB1aW50MTZfdCogc3RyaW5nKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgcHJpbnQoKTsKKworICAgIGlubGluZSBib29sICAgICAgICAgaXNEZXZpY2VQcm9wZXJ0eSgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCAgICgobUNvZGUgJiAweEYwMDApID09IDB4NTAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgobUNvZGUgJiAweEY4MDApID09IDB4RDAwMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCitwcml2YXRlOgorICAgIHZvaWQgICAgICAgICAgICAgICAgcmVhZFZhbHVlKE10cERhdGFQYWNrZXQmIHBhY2tldCwgTXRwUHJvcGVydHlWYWx1ZSYgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgd3JpdGVWYWx1ZShNdHBEYXRhUGFja2V0JiBwYWNrZXQsIE10cFByb3BlcnR5VmFsdWUmIHZhbHVlKTsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlKiAgIHJlYWRBcnJheVZhbHVlcyhNdHBEYXRhUGFja2V0JiBwYWNrZXQsIGludCYgbGVuZ3RoKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHdyaXRlQXJyYXlWYWx1ZXMoTXRwRGF0YVBhY2tldCYgcGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBQcm9wZXJ0eVZhbHVlKiB2YWx1ZXMsIGludCBsZW5ndGgpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfUFJPUEVSVFlfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFJlcXVlc3RQYWNrZXQuY3BwIGIvbWVkaWEvbXRwL010cFJlcXVlc3RQYWNrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlY2U1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUmVxdWVzdFBhY2tldC5jcHAKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwUmVxdWVzdFBhY2tldCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgIk10cFJlcXVlc3RQYWNrZXQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBSZXF1ZXN0UGFja2V0OjpNdHBSZXF1ZXN0UGFja2V0KCkKKyAgICA6ICAgTXRwUGFja2V0KDUxMikKK3sKK30KKworTXRwUmVxdWVzdFBhY2tldDo6fk10cFJlcXVlc3RQYWNrZXQoKSB7Cit9CisKKyNpZmRlZiBNVFBfREVWSUNFCitpbnQgTXRwUmVxdWVzdFBhY2tldDo6cmVhZChpbnQgZmQpIHsKKyAgICBpbnQgcmV0ID0gOjpyZWFkKGZkLCBtQnVmZmVyLCBtQnVmZmVyU2l6ZSk7CisgICAgaWYgKHJldCA+PSAwKQorICAgICAgICBtUGFja2V0U2l6ZSA9IHJldDsKKyAgICBlbHNlCisgICAgICAgIG1QYWNrZXRTaXplID0gMDsKKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmCisKKyNpZmRlZiBNVFBfSE9TVAorICAgIC8vIHdyaXRlIG91ciBidWZmZXIgdG8gdGhlIGdpdmVuIGVuZHBvaW50IChob3N0IG1vZGUpCitpbnQgTXRwUmVxdWVzdFBhY2tldDo6d3JpdGUoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApCit7CisgICAgcHV0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCwgbVBhY2tldFNpemUpOworICAgIHB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX1RZUEVfT0ZGU0VULCBNVFBfQ09OVEFJTkVSX1RZUEVfQ09NTUFORCk7CisgICAgcmV0dXJuIHRyYW5zZmVyKGVwLCBtQnVmZmVyLCBtUGFja2V0U2l6ZSk7Cit9CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBSZXF1ZXN0UGFja2V0LmggYi9tZWRpYS9tdHAvTXRwUmVxdWVzdFBhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTE4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUmVxdWVzdFBhY2tldC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfUkVRVUVTVF9QQUNLRVRfSAorI2RlZmluZSBfTVRQX1JFUVVFU1RfUEFDS0VUX0gKKworI2luY2x1ZGUgIk10cFBhY2tldC5oIgorI2luY2x1ZGUgIm10cC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cFJlcXVlc3RQYWNrZXQgOiBwdWJsaWMgTXRwUGFja2V0IHsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwUmVxdWVzdFBhY2tldCgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cFJlcXVlc3RQYWNrZXQoKTsKKworI2lmZGVmIE1UUF9ERVZJQ0UKKyAgICAvLyBmaWxsIG91ciBidWZmZXIgd2l0aCBkYXRhIGZyb20gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvcgorICAgIGludCAgICAgICAgICAgICAgICAgcmVhZChpbnQgZmQpOworI2VuZGlmCisKKyNpZmRlZiBNVFBfSE9TVAorICAgIC8vIHdyaXRlIG91ciBidWZmZXIgdG8gdGhlIGdpdmVuIGVuZHBvaW50CisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZShzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCk7CisjZW5kaWYKKworICAgIGlubGluZSBNdHBPcGVyYXRpb25Db2RlICAgIGdldE9wZXJhdGlvbkNvZGUoKSBjb25zdCB7IHJldHVybiBnZXRDb250YWluZXJDb2RlKCk7IH0KKyAgICBpbmxpbmUgdm9pZCAgICAgICAgICAgICAgICBzZXRPcGVyYXRpb25Db2RlKE10cE9wZXJhdGlvbkNvZGUgY29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBzZXRDb250YWluZXJDb2RlKGNvZGUpOyB9Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9SRVFVRVNUX1BBQ0tFVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUmVzcG9uc2VQYWNrZXQuY3BwIGIvbWVkaWEvbXRwL010cFJlc3BvbnNlUGFja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWY3MTRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFJlc3BvbnNlUGFja2V0LmNwcApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBSZXNwb25zZVBhY2tldCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgIk10cFJlc3BvbnNlUGFja2V0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwUmVzcG9uc2VQYWNrZXQ6Ok10cFJlc3BvbnNlUGFja2V0KCkKKyAgICA6ICAgTXRwUGFja2V0KDUxMikKK3sKK30KKworTXRwUmVzcG9uc2VQYWNrZXQ6On5NdHBSZXNwb25zZVBhY2tldCgpIHsKK30KKworI2lmZGVmIE1UUF9ERVZJQ0UKK2ludCBNdHBSZXNwb25zZVBhY2tldDo6d3JpdGUoaW50IGZkKSB7CisgICAgcHV0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCwgbVBhY2tldFNpemUpOworICAgIHB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX1RZUEVfT0ZGU0VULCBNVFBfQ09OVEFJTkVSX1RZUEVfUkVTUE9OU0UpOworICAgIGludCByZXQgPSA6OndyaXRlKGZkLCBtQnVmZmVyLCBtUGFja2V0U2l6ZSk7CisgICAgcmV0dXJuIChyZXQgPCAwID8gcmV0IDogMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIE1UUF9IT1NUCisgICAgLy8gcmVhZCBvdXIgYnVmZmVyIGZyb20gdGhlIGdpdmVuIGVuZHBvaW50CitpbnQgTXRwUmVzcG9uc2VQYWNrZXQ6OnJlYWQoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApIHsKKyAgICBpbnQgcmV0ID0gdHJhbnNmZXIoZXAsIG1CdWZmZXIsIG1CdWZmZXJTaXplKTsKKyAgICAgaWYgKHJldCA+PSAwKQorICAgICAgICBtUGFja2V0U2l6ZSA9IHJldDsKKyAgICBlbHNlCisgICAgICAgIG1QYWNrZXRTaXplID0gMDsKKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBSZXNwb25zZVBhY2tldC5oIGIvbWVkaWEvbXRwL010cFJlc3BvbnNlUGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczZjhmOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBSZXNwb25zZVBhY2tldC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfUkVTUE9OU0VfUEFDS0VUX0gKKyNkZWZpbmUgX01UUF9SRVNQT05TRV9QQUNLRVRfSAorCisjaW5jbHVkZSAiTXRwUGFja2V0LmgiCisjaW5jbHVkZSAibXRwLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwUmVzcG9uc2VQYWNrZXQgOiBwdWJsaWMgTXRwUGFja2V0IHsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwUmVzcG9uc2VQYWNrZXQoKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBSZXNwb25zZVBhY2tldCgpOworCisjaWZkZWYgTVRQX0RFVklDRQorICAgIC8vIHdyaXRlIG91ciBkYXRhIHRvIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlKGludCBmZCk7CisjZW5kaWYKKworI2lmZGVmIE1UUF9IT1NUCisgICAgLy8gcmVhZCBvdXIgYnVmZmVyIGZyb20gdGhlIGdpdmVuIGVuZHBvaW50CisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKTsKKyNlbmRpZgorCisgICAgaW5saW5lIE10cFJlc3BvbnNlQ29kZSAgICAgIGdldFJlc3BvbnNlQ29kZSgpIGNvbnN0IHsgcmV0dXJuIGdldENvbnRhaW5lckNvZGUoKTsgfQorICAgIGlubGluZSB2b2lkICAgICAgICAgICAgICAgICBzZXRSZXNwb25zZUNvZGUoTXRwUmVzcG9uc2VDb2RlIGNvZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHNldENvbnRhaW5lckNvZGUoY29kZSk7IH0KK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1JFU1BPTlNFX1BBQ0tFVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcCBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YTNlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcApAQCAtMCwwICsxLDc5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjZGVmaW5lIExPR19UQUcgIk10cFNlcnZlciIKKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJNdHBQcm9wZXJ0eS5oIgorI2luY2x1ZGUgIk10cFNlcnZlci5oIgorI2luY2x1ZGUgIk10cFN0b3JhZ2UuaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKworI2luY2x1ZGUgPGxpbnV4L3VzYi9mX210cC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBNdHBPcGVyYXRpb25Db2RlIGtTdXBwb3J0ZWRPcGVyYXRpb25Db2Rlc1tdID0geworICAgIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9JTkZPLAorICAgIE1UUF9PUEVSQVRJT05fT1BFTl9TRVNTSU9OLAorICAgIE1UUF9PUEVSQVRJT05fQ0xPU0VfU0VTU0lPTiwKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lEUywKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lORk8sCisgICAgTVRQX09QRVJBVElPTl9HRVRfTlVNX09CSkVDVFMsCisgICAgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0hBTkRMRVMsCisgICAgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0lORk8sCisgICAgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNULAorLy8gICAgTVRQX09QRVJBVElPTl9HRVRfVEhVTUIsCisgICAgTVRQX09QRVJBVElPTl9ERUxFVEVfT0JKRUNULAorICAgIE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1RfSU5GTywKKyAgICBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNULAorLy8gICAgTVRQX09QRVJBVElPTl9JTklUSUFURV9DQVBUVVJFLAorLy8gICAgTVRQX09QRVJBVElPTl9GT1JNQVRfU1RPUkUsCisvLyAgICBNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRSwKKy8vICAgIE1UUF9PUEVSQVRJT05fU0VMRl9URVNULAorLy8gICAgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1RFQ1RJT04sCisvLyAgICBNVFBfT1BFUkFUSU9OX1BPV0VSX0RPV04sCisgICAgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfREVTQywKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9WQUxVRSwKKyAgICBNVFBfT1BFUkFUSU9OX1NFVF9ERVZJQ0VfUFJPUF9WQUxVRSwKKyAgICBNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRV9QUk9QX1ZBTFVFLAorLy8gICAgTVRQX09QRVJBVElPTl9URVJNSU5BVEVfT1BFTl9DQVBUVVJFLAorLy8gICAgTVRQX09QRVJBVElPTl9NT1ZFX09CSkVDVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fQ09QWV9PQkpFQ1QsCisvLyAgICBNVFBfT1BFUkFUSU9OX0dFVF9QQVJUSUFMX09CSkVDVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fSU5JVElBVEVfT1BFTl9DQVBUVVJFLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QU19TVVBQT1JURUQsCisgICAgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfREVTQywKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9WQUxVRSwKKyAgICBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPUF9WQUxVRSwKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUkVGRVJFTkNFUywKKyAgICBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUkVGRVJFTkNFUywKKy8vICAgIE1UUF9PUEVSQVRJT05fU0tJUCwKK307CisKK3N0YXRpYyBjb25zdCBNdHBFdmVudENvZGUga1N1cHBvcnRlZEV2ZW50Q29kZXNbXSA9IHsKKyAgICBNVFBfRVZFTlRfT0JKRUNUX0FEREVELAorICAgIE1UUF9FVkVOVF9PQkpFQ1RfUkVNT1ZFRCwKK307CisKK010cFNlcnZlcjo6TXRwU2VydmVyKGludCBmZCwgTXRwRGF0YWJhc2UqIGRhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICBpbnQgZmlsZUdyb3VwLCBpbnQgZmlsZVBlcm0sIGludCBkaXJlY3RvcnlQZXJtKQorICAgIDogICBtRkQoZmQpLAorICAgICAgICBtRGF0YWJhc2UoZGF0YWJhc2UpLAorICAgICAgICBtRmlsZUdyb3VwKGZpbGVHcm91cCksCisgICAgICAgIG1GaWxlUGVybWlzc2lvbihmaWxlUGVybSksCisgICAgICAgIG1EaXJlY3RvcnlQZXJtaXNzaW9uKGRpcmVjdG9yeVBlcm0pLAorICAgICAgICBtU2Vzc2lvbklEKDApLAorICAgICAgICBtU2Vzc2lvbk9wZW4oZmFsc2UpLAorICAgICAgICBtU2VuZE9iamVjdEhhbmRsZShrSW52YWxpZE9iamVjdEhhbmRsZSksCisgICAgICAgIG1TZW5kT2JqZWN0Rm9ybWF0KDApLAorICAgICAgICBtU2VuZE9iamVjdEZpbGVTaXplKDApCit7Cit9CisKK010cFNlcnZlcjo6fk10cFNlcnZlcigpIHsKK30KKwordm9pZCBNdHBTZXJ2ZXI6OmFkZFN0b3JhZ2UoY29uc3QgY2hhciogZmlsZVBhdGgpIHsKKyAgICBpbnQgaW5kZXggPSBtU3RvcmFnZXMuc2l6ZSgpICsgMTsKKyAgICBpbmRleCB8PSBpbmRleCA8PCAxNjsgICAvLyBzZXQgaGlnaCBhbmQgbG93IHBhcnQgdG8gb3VyIGluZGV4CisgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9IG5ldyBNdHBTdG9yYWdlKGluZGV4LCBmaWxlUGF0aCwgbURhdGFiYXNlKTsKKyAgICBhZGRTdG9yYWdlKHN0b3JhZ2UpOworfQorCitNdHBTdG9yYWdlKiBNdHBTZXJ2ZXI6OmdldFN0b3JhZ2UoTXRwU3RvcmFnZUlEIGlkKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU3RvcmFnZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9ICBtU3RvcmFnZXNbaV07CisgICAgICAgIGlmIChzdG9yYWdlLT5nZXRTdG9yYWdlSUQoKSA9PSBpZCkKKyAgICAgICAgICAgIHJldHVybiBzdG9yYWdlOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBNdHBTZXJ2ZXI6OnJ1bigpIHsKKyAgICBpbnQgZmQgPSBtRkQ7CisKKyAgICBMT0dWKCJNdHBTZXJ2ZXI6OnJ1biBmZDogJWRcbiIsIGZkKTsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGludCByZXQgPSBtUmVxdWVzdC5yZWFkKGZkKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIExPR0UoInJlcXVlc3QgcmVhZCByZXR1cm5lZCAlZCwgZXJybm86ICVkIiwgcmV0LCBlcnJubyk7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKSB7CisgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRvIHRvcCBvZiBsb29wIGFuZCB3YWl0IGZvciBuZXh0IGNvbW1hbmQKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIE10cE9wZXJhdGlvbkNvZGUgb3BlcmF0aW9uID0gbVJlcXVlc3QuZ2V0T3BlcmF0aW9uQ29kZSgpOworICAgICAgICBNdHBUcmFuc2FjdGlvbklEIHRyYW5zYWN0aW9uID0gbVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpOworCisgICAgICAgIExPR1YoIm9wZXJhdGlvbjogJXMiLCBNdHBEZWJ1Zzo6Z2V0T3BlcmF0aW9uQ29kZU5hbWUob3BlcmF0aW9uKSk7CisgICAgICAgIG1SZXF1ZXN0LmR1bXAoKTsKKworICAgICAgICAvLyBGSVhNRSBuZWVkIHRvIGdlbmVyYWxpemUgdGhpcworICAgICAgICBib29sIGRhdGFJbiA9IChvcGVyYXRpb24gPT0gTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVF9JTkZPCisgICAgICAgICAgICAgICAgICAgIHx8IG9wZXJhdGlvbiA9PSBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUkVGRVJFTkNFUworICAgICAgICAgICAgICAgICAgICB8fCBvcGVyYXRpb24gPT0gTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1BfVkFMVUUKKyAgICAgICAgICAgICAgICAgICAgfHwgb3BlcmF0aW9uID09IE1UUF9PUEVSQVRJT05fU0VUX0RFVklDRV9QUk9QX1ZBTFVFKTsKKyAgICAgICAgaWYgKGRhdGFJbikgeworICAgICAgICAgICAgaW50IHJldCA9IG1EYXRhLnJlYWQoZmQpOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJkYXRhIHJlYWQgcmV0dXJuZWQgJWQsIGVycm5vOiAlZCIsIHJldCwgZXJybm8pOworICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRvIHRvcCBvZiBsb29wIGFuZCB3YWl0IGZvciBuZXh0IGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTE9HVigicmVjZWl2ZWQgZGF0YToiKTsKKyAgICAgICAgICAgIG1EYXRhLmR1bXAoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1EYXRhLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGFuZGxlUmVxdWVzdCgpKSB7CisgICAgICAgICAgICBpZiAoIWRhdGFJbiAmJiBtRGF0YS5oYXNEYXRhKCkpIHsKKyAgICAgICAgICAgICAgICBtRGF0YS5zZXRPcGVyYXRpb25Db2RlKG9wZXJhdGlvbik7CisgICAgICAgICAgICAgICAgbURhdGEuc2V0VHJhbnNhY3Rpb25JRCh0cmFuc2FjdGlvbik7CisgICAgICAgICAgICAgICAgTE9HVigic2VuZGluZyBkYXRhOiIpOworICAgICAgICAgICAgICAgIHJldCA9IG1EYXRhLndyaXRlKGZkKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJyZXF1ZXN0IHdyaXRlIHJldHVybmVkICVkLCBlcnJubzogJWQiLCByZXQsIGVycm5vKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRvIHRvcCBvZiBsb29wIGFuZCB3YWl0IGZvciBuZXh0IGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVJlc3BvbnNlLnNldFRyYW5zYWN0aW9uSUQodHJhbnNhY3Rpb24pOworICAgICAgICAgICAgTE9HVigic2VuZGluZyByZXNwb25zZSAlMDRYIiwgbVJlc3BvbnNlLmdldFJlc3BvbnNlQ29kZSgpKTsKKyAgICAgICAgICAgIHJldCA9IG1SZXNwb25zZS53cml0ZShmZCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoInJlcXVlc3Qgd3JpdGUgcmV0dXJuZWQgJWQsIGVycm5vOiAlZCIsIHJldCwgZXJybm8pOworICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRvIHRvcCBvZiBsb29wIGFuZCB3YWl0IGZvciBuZXh0IGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HVigic2tpcHBpbmcgcmVzcG9uc2VcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1TZXNzaW9uT3BlbikKKyAgICAgICAgbURhdGFiYXNlLT5zZXNzaW9uRW5kZWQoKTsKK30KKwordm9pZCBNdHBTZXJ2ZXI6OnNlbmRPYmplY3RBZGRlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgaWYgKG1TZXNzaW9uT3BlbikgeworICAgICAgICBMT0dEKCJzZW5kT2JqZWN0QWRkZWQgJWRcbiIsIGhhbmRsZSk7CisgICAgICAgIG1FdmVudC5zZXRFdmVudENvZGUoTVRQX0VWRU5UX09CSkVDVF9BRERFRCk7CisgICAgICAgIG1FdmVudC5zZXRUcmFuc2FjdGlvbklEKG1SZXF1ZXN0LmdldFRyYW5zYWN0aW9uSUQoKSk7CisgICAgICAgIG1FdmVudC5zZXRQYXJhbWV0ZXIoMSwgaGFuZGxlKTsKKyAgICAgICAgaW50IHJldCA9IG1FdmVudC53cml0ZShtRkQpOworICAgICAgICBMT0dEKCJtRXZlbnQud3JpdGUgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisgICAgfQorfQorCit2b2lkIE10cFNlcnZlcjo6c2VuZE9iamVjdFJlbW92ZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIGlmIChtU2Vzc2lvbk9wZW4pIHsKKyAgICAgICAgTE9HRCgic2VuZE9iamVjdFJlbW92ZWQgJWRcbiIsIGhhbmRsZSk7CisgICAgICAgIG1FdmVudC5zZXRFdmVudENvZGUoTVRQX0VWRU5UX09CSkVDVF9SRU1PVkVEKTsKKyAgICAgICAgbUV2ZW50LnNldFRyYW5zYWN0aW9uSUQobVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpKTsKKyAgICAgICAgbUV2ZW50LnNldFBhcmFtZXRlcigxLCBoYW5kbGUpOworICAgICAgICBpbnQgcmV0ID0gbUV2ZW50LndyaXRlKG1GRCk7CisgICAgICAgIExPR0QoIm1FdmVudC53cml0ZSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKyAgICB9Cit9CisKK2Jvb2wgTXRwU2VydmVyOjpoYW5kbGVSZXF1ZXN0KCkgeworICAgIE10cE9wZXJhdGlvbkNvZGUgb3BlcmF0aW9uID0gbVJlcXVlc3QuZ2V0T3BlcmF0aW9uQ29kZSgpOworICAgIE10cFJlc3BvbnNlQ29kZSByZXNwb25zZTsKKworICAgIG1SZXNwb25zZS5yZXNldCgpOworCisgICAgaWYgKG1TZW5kT2JqZWN0SGFuZGxlICE9IGtJbnZhbGlkT2JqZWN0SGFuZGxlICYmIG9wZXJhdGlvbiAhPSBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUKSB7CisgICAgICAgIC8vIEZJWE1FIC0gbmVlZCB0byBkZWxldGUgbVNlbmRPYmplY3RIYW5kbGUgZnJvbSB0aGUgZGF0YWJhc2UKKyAgICAgICAgTE9HRSgiZXhwZWN0ZWQgU2VuZE9iamVjdCBhZnRlciBTZW5kT2JqZWN0SW5mbyIpOworICAgICAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGtJbnZhbGlkT2JqZWN0SGFuZGxlOworICAgIH0KKworICAgIHN3aXRjaCAob3BlcmF0aW9uKSB7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX0lORk86CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0RGV2aWNlSW5mbygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9PUEVOX1NFU1NJT046CisgICAgICAgICAgICByZXNwb25zZSA9IGRvT3BlblNlc3Npb24oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fQ0xPU0VfU0VTU0lPTjoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9DbG9zZVNlc3Npb24oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSURTOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldFN0b3JhZ2VJRHMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lORk86CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0U3RvcmFnZUluZm8oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QU19TVVBQT1JURUQ6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0UHJvcHNTdXBwb3J0ZWQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9IQU5ETEVTOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldE9iamVjdEhhbmRsZXMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX05VTV9PQkpFQ1RTOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldE51bU9iamVjdHMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9SRUZFUkVOQ0VTOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldE9iamVjdFJlZmVyZW5jZXMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9SRUZFUkVOQ0VTOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb1NldE9iamVjdFJlZmVyZW5jZXMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX1ZBTFVFOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldE9iamVjdFByb3BWYWx1ZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1BfVkFMVUU6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvU2V0T2JqZWN0UHJvcFZhbHVlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9WQUxVRToKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXREZXZpY2VQcm9wVmFsdWUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fU0VUX0RFVklDRV9QUk9QX1ZBTFVFOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb1NldERldmljZVByb3BWYWx1ZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9SRVNFVF9ERVZJQ0VfUFJPUF9WQUxVRToKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9SZXNldERldmljZVByb3BWYWx1ZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0lORk86CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0SW5mbygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldE9iamVjdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVF9JTkZPOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb1NlbmRPYmplY3RJbmZvKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb1NlbmRPYmplY3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fREVMRVRFX09CSkVDVDoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9EZWxldGVPYmplY3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX0RFU0M6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0UHJvcERlc2MoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX0RFU0M6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0RGV2aWNlUHJvcERlc2MoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRSgiZ290IHVuc3VwcG9ydGVkIGNvbW1hbmQgJXMiLCBNdHBEZWJ1Zzo6Z2V0T3BlcmF0aW9uQ29kZU5hbWUob3BlcmF0aW9uKSk7CisgICAgICAgICAgICByZXNwb25zZSA9IE1UUF9SRVNQT05TRV9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChyZXNwb25zZSA9PSBNVFBfUkVTUE9OU0VfVFJBTlNBQ1RJT05fQ0FOQ0VMTEVEKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgbVJlc3BvbnNlLnNldFJlc3BvbnNlQ29kZShyZXNwb25zZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0RGV2aWNlSW5mbygpIHsKKyAgICBNdHBTdHJpbmdCdWZmZXIgICBzdHJpbmc7CisgICAgY2hhciBwcm9wX3ZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisKKyAgICBNdHBPYmplY3RGb3JtYXRMaXN0KiBwbGF5YmFja0Zvcm1hdHMgPSBtRGF0YWJhc2UtPmdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cygpOworICAgIE10cE9iamVjdEZvcm1hdExpc3QqIGNhcHR1cmVGb3JtYXRzID0gbURhdGFiYXNlLT5nZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cygpOworICAgIE10cERldmljZVByb3BlcnR5TGlzdCogZGV2aWNlUHJvcGVydGllcyA9IG1EYXRhYmFzZS0+Z2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcygpOworCisgICAgLy8gZmlsbCBpbiBkZXZpY2UgaW5mbworICAgIG1EYXRhLnB1dFVJbnQxNihNVFBfU1RBTkRBUkRfVkVSU0lPTik7CisgICAgbURhdGEucHV0VUludDMyKDYpOyAvLyBNVFAgVmVuZG9yIEV4dGVuc2lvbiBJRAorICAgIG1EYXRhLnB1dFVJbnQxNihNVFBfU1RBTkRBUkRfVkVSU0lPTik7CisgICAgc3RyaW5nLnNldCgibWljcm9zb2Z0LmNvbTogMS4wOyIpOworICAgIG1EYXRhLnB1dFN0cmluZyhzdHJpbmcpOyAvLyBNVFAgRXh0ZW5zaW9ucworICAgIG1EYXRhLnB1dFVJbnQxNigwKTsgLy9GdW5jdGlvbmFsIE1vZGUKKyAgICBtRGF0YS5wdXRBVUludDE2KGtTdXBwb3J0ZWRPcGVyYXRpb25Db2RlcywKKyAgICAgICAgICAgIHNpemVvZihrU3VwcG9ydGVkT3BlcmF0aW9uQ29kZXMpIC8gc2l6ZW9mKHVpbnQxNl90KSk7IC8vIE9wZXJhdGlvbnMgU3VwcG9ydGVkCisgICAgbURhdGEucHV0QVVJbnQxNihrU3VwcG9ydGVkRXZlbnRDb2RlcywKKyAgICAgICAgICAgIHNpemVvZihrU3VwcG9ydGVkRXZlbnRDb2RlcykgLyBzaXplb2YodWludDE2X3QpKTsgLy8gRXZlbnRzIFN1cHBvcnRlZAorICAgIG1EYXRhLnB1dEFVSW50MTYoZGV2aWNlUHJvcGVydGllcyk7IC8vIERldmljZSBQcm9wZXJ0aWVzIFN1cHBvcnRlZAorICAgIG1EYXRhLnB1dEFVSW50MTYoY2FwdHVyZUZvcm1hdHMpOyAvLyBDYXB0dXJlIEZvcm1hdHMKKyAgICBtRGF0YS5wdXRBVUludDE2KHBsYXliYWNrRm9ybWF0cyk7ICAvLyBQbGF5YmFjayBGb3JtYXRzCisgICAgLy8gRklYTUUKKyAgICBzdHJpbmcuc2V0KCJHb29nbGUsIEluYy4iKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBNYW51ZmFjdHVyZXIKKworICAgIHByb3BlcnR5X2dldCgicm8ucHJvZHVjdC5tb2RlbCIsIHByb3BfdmFsdWUsICJNVFAgRGV2aWNlIik7CisgICAgc3RyaW5nLnNldChwcm9wX3ZhbHVlKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBNb2RlbAorICAgIHN0cmluZy5zZXQoIjEuMCIpOworICAgIG1EYXRhLnB1dFN0cmluZyhzdHJpbmcpOyAgIC8vIERldmljZSBWZXJzaW9uCisKKyAgICBwcm9wZXJ0eV9nZXQoInJvLnNlcmlhbG5vIiwgcHJvcF92YWx1ZSwgIj8/Pz8/Pz8/Iik7CisgICAgc3RyaW5nLnNldChwcm9wX3ZhbHVlKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBTZXJpYWwgTnVtYmVyCisKKyAgICBkZWxldGUgcGxheWJhY2tGb3JtYXRzOworICAgIGRlbGV0ZSBjYXB0dXJlRm9ybWF0czsKKyAgICBkZWxldGUgZGV2aWNlUHJvcGVydGllczsKKworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvT3BlblNlc3Npb24oKSB7CisgICAgaWYgKG1TZXNzaW9uT3BlbikgeworICAgICAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDEsIG1TZXNzaW9uSUQpOworICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fQUxSRUFEWV9PUEVOOworICAgIH0KKyAgICBtU2Vzc2lvbklEID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIG1TZXNzaW9uT3BlbiA9IHRydWU7CisKKyAgICBtRGF0YWJhc2UtPnNlc3Npb25TdGFydGVkKCk7CisKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0Nsb3NlU2Vzc2lvbigpIHsKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworICAgIG1TZXNzaW9uSUQgPSAwOworICAgIG1TZXNzaW9uT3BlbiA9IGZhbHNlOworICAgIG1EYXRhYmFzZS0+c2Vzc2lvbkVuZGVkKCk7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRTdG9yYWdlSURzKCkgeworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisKKyAgICBpbnQgY291bnQgPSBtU3RvcmFnZXMuc2l6ZSgpOworICAgIG1EYXRhLnB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBtRGF0YS5wdXRVSW50MzIobVN0b3JhZ2VzW2ldLT5nZXRTdG9yYWdlSUQoKSk7CisKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldFN0b3JhZ2VJbmZvKCkgeworICAgIE10cFN0cmluZ0J1ZmZlciAgIHN0cmluZzsKKworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisgICAgTXRwU3RvcmFnZUlEIGlkID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIE10cFN0b3JhZ2UqIHN0b3JhZ2UgPSBnZXRTdG9yYWdlKGlkKTsKKyAgICBpZiAoIXN0b3JhZ2UpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9TVE9SQUdFX0lEOworCisgICAgbURhdGEucHV0VUludDE2KHN0b3JhZ2UtPmdldFR5cGUoKSk7CisgICAgbURhdGEucHV0VUludDE2KHN0b3JhZ2UtPmdldEZpbGVTeXN0ZW1UeXBlKCkpOworICAgIG1EYXRhLnB1dFVJbnQxNihzdG9yYWdlLT5nZXRBY2Nlc3NDYXBhYmlsaXR5KCkpOworICAgIG1EYXRhLnB1dFVJbnQ2NChzdG9yYWdlLT5nZXRNYXhDYXBhY2l0eSgpKTsKKyAgICBtRGF0YS5wdXRVSW50NjQoc3RvcmFnZS0+Z2V0RnJlZVNwYWNlKCkpOworICAgIG1EYXRhLnB1dFVJbnQzMigxMDI0KjEwMjQqMTAyNCk7IC8vIEZyZWUgU3BhY2UgaW4gT2JqZWN0cworICAgIHN0cmluZy5zZXQoc3RvcmFnZS0+Z2V0RGVzY3JpcHRpb24oKSk7CisgICAgbURhdGEucHV0U3RyaW5nKHN0cmluZyk7CisgICAgbURhdGEucHV0RW1wdHlTdHJpbmcoKTsgICAvLyBWb2x1bWUgSWRlbnRpZmllcgorCisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RQcm9wc1N1cHBvcnRlZCgpIHsKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwRGV2aWNlUHJvcGVydHlMaXN0KiBwcm9wZXJ0aWVzID0gbURhdGFiYXNlLT5nZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzKGZvcm1hdCk7CisgICAgbURhdGEucHV0QVVJbnQxNihwcm9wZXJ0aWVzKTsKKyAgICBkZWxldGUgcHJvcGVydGllczsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldE9iamVjdEhhbmRsZXMoKSB7CisgICAgaWYgKCFtU2Vzc2lvbk9wZW4pCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTjsKKyAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOyAgICAgIC8vIDB4RkZGRkZGRkYgZm9yIGFsbCBzdG9yYWdlCisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsgICAgICAvLyAwIGZvciBhbGwgZm9ybWF0cworICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMyk7ICAgICAgLy8gMHhGRkZGRkZGRiBmb3Igb2JqZWN0cyB3aXRoIG5vIHBhcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwMDAwMDAwMCBmb3IgYWxsIG9iamVjdHM/CisgICAgaWYgKHBhcmVudCA9PSAweEZGRkZGRkZGKQorICAgICAgICBwYXJlbnQgPSAwOworCisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogaGFuZGxlcyA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0TGlzdChzdG9yYWdlSUQsIGZvcm1hdCwgcGFyZW50KTsKKyAgICBtRGF0YS5wdXRBVUludDMyKGhhbmRsZXMpOworICAgIGRlbGV0ZSBoYW5kbGVzOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0TnVtT2JqZWN0cygpIHsKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7ICAgICAgLy8gMHhGRkZGRkZGRiBmb3IgYWxsIHN0b3JhZ2UKKyAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOyAgICAgIC8vIDAgZm9yIGFsbCBmb3JtYXRzCisgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigzKTsgICAgICAvLyAweEZGRkZGRkZGIGZvciBvYmplY3RzIHdpdGggbm8gcGFyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDAwMDAwMDAwIGZvciBhbGwgb2JqZWN0cz8KKyAgICBpZiAocGFyZW50ID09IDB4RkZGRkZGRkYpCisgICAgICAgIHBhcmVudCA9IDA7CisKKyAgICBpbnQgY291bnQgPSBtRGF0YWJhc2UtPmdldE51bU9iamVjdHMoc3RvcmFnZUlELCBmb3JtYXQsIHBhcmVudCk7CisgICAgaWYgKGNvdW50ID49IDApIHsKKyAgICAgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigxLCBjb3VudCk7CisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigxLCAwKTsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CisgICAgfQorfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldE9iamVjdFJlZmVyZW5jZXMoKSB7CisgICAgaWYgKCFtU2Vzc2lvbk9wZW4pCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTjsKKyAgICBNdHBTdG9yYWdlSUQgaGFuZGxlID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworCisgICAgLy8gRklYTUUgLSBjaGVjayBmb3IgaW52YWxpZCBvYmplY3QgaGFuZGxlCisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogaGFuZGxlcyA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0UmVmZXJlbmNlcyhoYW5kbGUpOworICAgIGlmIChoYW5kbGVzKSB7CisgICAgICAgIG1EYXRhLnB1dEFVSW50MzIoaGFuZGxlcyk7CisgICAgICAgIGRlbGV0ZSBoYW5kbGVzOworICAgIH0gZWxzZSB7CisgICAgICAgIG1EYXRhLnB1dEVtcHR5QXJyYXkoKTsKKyAgICB9CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9TZXRPYmplY3RSZWZlcmVuY2VzKCkgeworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisgICAgTXRwU3RvcmFnZUlEIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiByZWZlcmVuY2VzID0gbURhdGEuZ2V0QVVJbnQzMigpOworICAgIE10cFJlc3BvbnNlQ29kZSByZXN1bHQgPSBtRGF0YWJhc2UtPnNldE9iamVjdFJlZmVyZW5jZXMoaGFuZGxlLCByZWZlcmVuY2VzKTsKKyAgICBkZWxldGUgcmVmZXJlbmNlczsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldE9iamVjdFByb3BWYWx1ZSgpIHsKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOworICAgIExPR0QoIkdldE9iamVjdFByb3BWYWx1ZSAlZCAlc1xuIiwgaGFuZGxlLAorICAgICAgICAgICAgTXRwRGVidWc6OmdldE9iamVjdFByb3BDb2RlTmFtZShwcm9wZXJ0eSkpOworCisgICAgcmV0dXJuIG1EYXRhYmFzZS0+Z2V0T2JqZWN0UHJvcGVydHlWYWx1ZShoYW5kbGUsIHByb3BlcnR5LCBtRGF0YSk7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvU2V0T2JqZWN0UHJvcFZhbHVlKCkgeworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHkgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMik7CisgICAgTE9HRCgiU2V0T2JqZWN0UHJvcFZhbHVlICVkICVzXG4iLCBoYW5kbGUsCisgICAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0T2JqZWN0UHJvcENvZGVOYW1lKHByb3BlcnR5KSk7CisKKyAgICByZXR1cm4gbURhdGFiYXNlLT5zZXRPYmplY3RQcm9wZXJ0eVZhbHVlKGhhbmRsZSwgcHJvcGVydHksIG1EYXRhKTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXREZXZpY2VQcm9wVmFsdWUoKSB7CisgICAgTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTE9HRCgiR2V0RGV2aWNlUHJvcFZhbHVlICVzXG4iLAorICAgICAgICAgICAgTXRwRGVidWc6OmdldERldmljZVByb3BDb2RlTmFtZShwcm9wZXJ0eSkpOworCisgICAgcmV0dXJuIG1EYXRhYmFzZS0+Z2V0RGV2aWNlUHJvcGVydHlWYWx1ZShwcm9wZXJ0eSwgbURhdGEpOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb1NldERldmljZVByb3BWYWx1ZSgpIHsKKyAgICBNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBMT0dEKCJTZXREZXZpY2VQcm9wVmFsdWUgJXNcbiIsCisgICAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0RGV2aWNlUHJvcENvZGVOYW1lKHByb3BlcnR5KSk7CisKKyAgICByZXR1cm4gbURhdGFiYXNlLT5zZXREZXZpY2VQcm9wZXJ0eVZhbHVlKHByb3BlcnR5LCBtRGF0YSk7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvUmVzZXREZXZpY2VQcm9wVmFsdWUoKSB7CisgICAgTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTE9HRCgiUmVzZXREZXZpY2VQcm9wVmFsdWUgJXNcbiIsCisgICAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0RGV2aWNlUHJvcENvZGVOYW1lKHByb3BlcnR5KSk7CisKKyAgICByZXR1cm4gbURhdGFiYXNlLT5yZXNldERldmljZVByb3BlcnR5KHByb3BlcnR5KTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RJbmZvKCkgeworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgcmV0dXJuIG1EYXRhYmFzZS0+Z2V0T2JqZWN0SW5mbyhoYW5kbGUsIG1EYXRhKTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3QoKSB7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBTdHJpbmcgcGF0aEJ1ZjsKKyAgICBpbnQ2NF90IGZpbGVMZW5ndGg7CisgICAgaW50IHJlc3VsdCA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0RmlsZVBhdGgoaGFuZGxlLCBwYXRoQnVmLCBmaWxlTGVuZ3RoKTsKKyAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIGNvbnN0IGNoYXIqIGZpbGVQYXRoID0gKGNvbnN0IGNoYXIgKilwYXRoQnVmOworICAgIG10cF9maWxlX3JhbmdlICBtZnI7CisgICAgbWZyLmZkID0gb3BlbihmaWxlUGF0aCwgT19SRE9OTFkpOworICAgIGlmIChtZnIuZmQgPCAwKSB7CisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICB9CisgICAgbWZyLm9mZnNldCA9IDA7CisgICAgbWZyLmxlbmd0aCA9IGZpbGVMZW5ndGg7CisKKyAgICAvLyBzZW5kIGRhdGEgaGVhZGVyCisgICAgbURhdGEuc2V0T3BlcmF0aW9uQ29kZShtUmVxdWVzdC5nZXRPcGVyYXRpb25Db2RlKCkpOworICAgIG1EYXRhLnNldFRyYW5zYWN0aW9uSUQobVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpKTsKKyAgICBtRGF0YS53cml0ZURhdGFIZWFkZXIobUZELCBmaWxlTGVuZ3RoKTsKKworICAgIC8vIHRoZW4gdHJhbnNmZXIgdGhlIGZpbGUKKyAgICBpbnQgcmV0ID0gaW9jdGwobUZELCBNVFBfU0VORF9GSUxFLCAodW5zaWduZWQgbG9uZykmbWZyKTsKKyAgICBjbG9zZShtZnIuZmQpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpCisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1RSQU5TQUNUSU9OX0NBTkNFTExFRDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb1NlbmRPYmplY3RJbmZvKCkgeworICAgIE10cFN0cmluZyBwYXRoOworICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9IGdldFN0b3JhZ2Uoc3RvcmFnZUlEKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOworICAgIGlmICghc3RvcmFnZSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1NUT1JBR0VfSUQ7CisKKyAgICAvLyBzcGVjaWFsIGNhc2UgdGhlIHJvb3QKKyAgICBpZiAocGFyZW50ID09IE1UUF9QQVJFTlRfUk9PVCkgeworICAgICAgICBwYXRoID0gc3RvcmFnZS0+Z2V0UGF0aCgpOworICAgICAgICBwYXJlbnQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3QgZHVtbXk7CisgICAgICAgIGludCByZXN1bHQgPSBtRGF0YWJhc2UtPmdldE9iamVjdEZpbGVQYXRoKHBhcmVudCwgcGF0aCwgZHVtbXkpOworICAgICAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gcmVhZCBvbmx5IHRoZSBmaWVsZHMgd2UgbmVlZAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gc3RvcmFnZSBJRAorICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBtRGF0YS5nZXRVSW50MTYoKTsKKyAgICBtRGF0YS5nZXRVSW50MTYoKTsgIC8vIHByb3RlY3Rpb24gc3RhdHVzCisgICAgbVNlbmRPYmplY3RGaWxlU2l6ZSA9IG1EYXRhLmdldFVJbnQzMigpOworICAgIG1EYXRhLmdldFVJbnQxNigpOyAgLy8gdGh1bWIgZm9ybWF0CisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyB0aHVtYiBjb21wcmVzc2VkIHNpemUKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIHRodW1iIHBpeCB3aWR0aAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gdGh1bWIgcGl4IGhlaWdodAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gaW1hZ2UgcGl4IHdpZHRoCisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyBpbWFnZSBwaXggaGVpZ2h0CisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyBpbWFnZSBiaXQgZGVwdGgKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIHBhcmVudAorICAgIHVpbnQxNl90IGFzc29jaWF0aW9uVHlwZSA9IG1EYXRhLmdldFVJbnQxNigpOworICAgIHVpbnQzMl90IGFzc29jaWF0aW9uRGVzYyA9IG1EYXRhLmdldFVJbnQzMigpOyAgIC8vIGFzc29jaWF0aW9uIGRlc2MKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIHNlcXVlbmNlIG51bWJlcgorICAgIE10cFN0cmluZ0J1ZmZlciBuYW1lLCBjcmVhdGVkLCBtb2RpZmllZDsKKyAgICBtRGF0YS5nZXRTdHJpbmcobmFtZSk7ICAgIC8vIGZpbGUgbmFtZQorICAgIG1EYXRhLmdldFN0cmluZyhjcmVhdGVkKTsgICAgICAvLyBkYXRlIGNyZWF0ZWQKKyAgICBtRGF0YS5nZXRTdHJpbmcobW9kaWZpZWQpOyAgICAgLy8gZGF0ZSBtb2RpZmllZAorICAgIC8vIGtleXdvcmRzIGZvbGxvdworCisgICAgdGltZV90IG1vZGlmaWVkVGltZTsKKyAgICBpZiAoIXBhcnNlRGF0ZVRpbWUobW9kaWZpZWQsIG1vZGlmaWVkVGltZSkpCisgICAgICAgIG1vZGlmaWVkVGltZSA9IDA7CisKKyAgICBpZiAocGF0aFtwYXRoLnNpemUoKSAtIDFdICE9ICcvJykKKyAgICAgICAgcGF0aCArPSAiLyI7CisgICAgcGF0aCArPSAoY29uc3QgY2hhciAqKW5hbWU7CisKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbURhdGFiYXNlLT5iZWdpblNlbmRPYmplY3QoKGNvbnN0IGNoYXIqKXBhdGgsCisgICAgICAgICAgICBmb3JtYXQsIHBhcmVudCwgc3RvcmFnZUlELCBtU2VuZE9iamVjdEZpbGVTaXplLCBtb2RpZmllZFRpbWUpOworICAgIGlmIChoYW5kbGUgPT0ga0ludmFsaWRPYmplY3RIYW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIH0KKworICBpZiAoZm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04pIHsKKyAgICAgICAgbW9kZV90IG1hc2sgPSB1bWFzaygwKTsKKyAgICAgICAgaW50IHJldCA9IG1rZGlyKChjb25zdCBjaGFyICopcGF0aCwgbURpcmVjdG9yeVBlcm1pc3Npb24pOworICAgICAgICB1bWFzayhtYXNrKTsKKyAgICAgICAgaWYgKHJldCAmJiByZXQgIT0gLUVFWElTVCkKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgY2hvd24oKGNvbnN0IGNoYXIgKilwYXRoLCBnZXR1aWQoKSwgbUZpbGVHcm91cCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlbmRPYmplY3RGaWxlUGF0aCA9IHBhdGg7CisgICAgICAgIC8vIHNhdmUgdGhlIGhhbmRsZSBmb3IgdGhlIFNlbmRPYmplY3QgY2FsbCwgd2hpY2ggc2hvdWxkIGZvbGxvdworICAgICAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGhhbmRsZTsKKyAgICAgICAgbVNlbmRPYmplY3RGb3JtYXQgPSBmb3JtYXQ7CisgICAgfQorCisgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigxLCBzdG9yYWdlSUQpOworICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMiwgcGFyZW50KTsKKyAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDMsIGhhbmRsZSk7CisKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb1NlbmRPYmplY3QoKSB7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9PSzsKKyAgICBtb2RlX3QgbWFzazsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKG1TZW5kT2JqZWN0SGFuZGxlID09IGtJbnZhbGlkT2JqZWN0SGFuZGxlKSB7CisgICAgICAgIExPR0UoIkV4cGVjdGVkIFNlbmRPYmplY3RJbmZvIGJlZm9yZSBTZW5kT2JqZWN0Iik7CisgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9OT19WQUxJRF9PQkpFQ1RfSU5GTzsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIC8vIHJlYWQgdGhlIGhlYWRlcgorICAgIHJldCA9IG1EYXRhLnJlYWREYXRhSGVhZGVyKG1GRCk7CisgICAgLy8gRklYTUUgLSBjaGVjayBmb3IgZXJyb3JzIGhlcmUuCisKKyAgICAvLyByZXNldCBzbyB3ZSBkb24ndCBhdHRlbXB0IHRvIHNlbmQgdGhpcyBiYWNrCisgICAgbURhdGEucmVzZXQoKTsKKworICAgIG10cF9maWxlX3JhbmdlICBtZnI7CisgICAgbWZyLmZkID0gb3BlbihtU2VuZE9iamVjdEZpbGVQYXRoLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQyk7CisgICAgaWYgKG1mci5mZCA8IDApIHsKKyAgICAgICAgcmVzdWx0ID0gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgICAgZmNob3duKG1mci5mZCwgZ2V0dWlkKCksIG1GaWxlR3JvdXApOworICAgIC8vIHNldCBwZXJtaXNzaW9ucworICAgIG1hc2sgPSB1bWFzaygwKTsKKyAgICBmY2htb2QobWZyLmZkLCBtRmlsZVBlcm1pc3Npb24pOworICAgIHVtYXNrKG1hc2spOworCisgICAgbWZyLm9mZnNldCA9IDA7CisgICAgbWZyLmxlbmd0aCA9IG1TZW5kT2JqZWN0RmlsZVNpemU7CisKKyAgICAvLyB0cmFuc2ZlciB0aGUgZmlsZQorICAgIHJldCA9IGlvY3RsKG1GRCwgTVRQX1JFQ0VJVkVfRklMRSwgKHVuc2lnbmVkIGxvbmcpJm1mcik7CisgICAgY2xvc2UobWZyLmZkKTsKKworICAgIExPR1YoIk1UUF9SRUNFSVZFX0ZJTEUgcmV0dXJuZWQgJWQiLCByZXQpOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgdW5saW5rKG1TZW5kT2JqZWN0RmlsZVBhdGgpOworICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKQorICAgICAgICAgICAgcmVzdWx0ID0gTVRQX1JFU1BPTlNFX1RSQU5TQUNUSU9OX0NBTkNFTExFRDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0ID0gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgfQorCitkb25lOgorICAgIG1EYXRhYmFzZS0+ZW5kU2VuZE9iamVjdChtU2VuZE9iamVjdEZpbGVQYXRoLCBtU2VuZE9iamVjdEhhbmRsZSwgbVNlbmRPYmplY3RGb3JtYXQsCisgICAgICAgICAgICByZXN1bHQgPT0gTVRQX1JFU1BPTlNFX09LKTsKKyAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGtJbnZhbGlkT2JqZWN0SGFuZGxlOworICAgIG1TZW5kT2JqZWN0Rm9ybWF0ID0gMDsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBkZWxldGVSZWN1cnNpdmUoY29uc3QgY2hhciogcGF0aCkgeworICAgIGNoYXIgcGF0aGJ1ZltQQVRIX01BWF07CisgICAgaW50IHBhdGhMZW5ndGggPSBzdHJsZW4ocGF0aCk7CisgICAgaWYgKHBhdGhMZW5ndGggPj0gc2l6ZW9mKHBhdGhidWYpIC0gMSkgeworICAgICAgICBMT0dFKCJwYXRoIHRvbyBsb25nOiAlc1xuIiwgcGF0aCk7CisgICAgfQorICAgIHN0cmNweShwYXRoYnVmLCBwYXRoKTsKKyAgICBpZiAocGF0aGJ1ZltwYXRoTGVuZ3RoIC0gMV0gIT0gJy8nKSB7CisgICAgICAgIHBhdGhidWZbcGF0aExlbmd0aCsrXSA9ICcvJzsKKyAgICB9CisgICAgY2hhciogZmlsZVNwb3QgPSBwYXRoYnVmICsgcGF0aExlbmd0aDsKKyAgICBpbnQgcGF0aFJlbWFpbmluZyA9IHNpemVvZihwYXRoYnVmKSAtIHBhdGhMZW5ndGggLSAxOworCisgICAgRElSKiBkaXIgPSBvcGVuZGlyKHBhdGgpOworICAgIGlmICghZGlyKSB7CisgICAgICAgIExPR0UoIm9wZW5kaXIgJXMgZmFpbGVkOiAlcyIsIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdHJ1Y3QgZGlyZW50KiBlbnRyeTsKKyAgICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIpKSkgeworICAgICAgICBjb25zdCBjaGFyKiBuYW1lID0gZW50cnktPmRfbmFtZTsKKworICAgICAgICAvLyBpZ25vcmUgIi4iIGFuZCAiLi4iCisgICAgICAgIGlmIChuYW1lWzBdID09ICcuJyAmJiAobmFtZVsxXSA9PSAwIHx8IChuYW1lWzFdID09ICcuJyAmJiBuYW1lWzJdID09IDApKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbmFtZUxlbmd0aCA9IHN0cmxlbihuYW1lKTsKKyAgICAgICAgaWYgKG5hbWVMZW5ndGggPiBwYXRoUmVtYWluaW5nKSB7CisgICAgICAgICAgICBMT0dFKCJwYXRoICVzLyVzIHRvbyBsb25nXG4iLCBwYXRoLCBuYW1lKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0cmNweShmaWxlU3BvdCwgbmFtZSk7CisKKyAgICAgICAgaW50IHR5cGUgPSBlbnRyeS0+ZF90eXBlOworICAgICAgICBpZiAoZW50cnktPmRfdHlwZSA9PSBEVF9ESVIpIHsKKyAgICAgICAgICAgIGRlbGV0ZVJlY3Vyc2l2ZShwYXRoYnVmKTsKKyAgICAgICAgICAgIHJtZGlyKHBhdGhidWYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdW5saW5rKHBhdGhidWYpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWxldGVQYXRoKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgIGlmIChzdGF0KHBhdGgsICZzdGF0YnVmKSA9PSAwKSB7CisgICAgICAgIGlmIChTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkpIHsKKyAgICAgICAgICAgIGRlbGV0ZVJlY3Vyc2l2ZShwYXRoKTsKKyAgICAgICAgICAgIHJtZGlyKHBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdW5saW5rKHBhdGgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiZGVsZXRlUGF0aCBzdGF0IGZhaWxlZCBmb3IgJXM6ICVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvRGVsZXRlT2JqZWN0KCkgeworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsKKyAgICAvLyBGSVhNRSAtIHN1cHBvcnQgZGVsZXRpbmcgYWxsIG9iamVjdHMgaWYgaGFuZGxlIGlzIDB4RkZGRkZGRkYKKyAgICAvLyBGSVhNRSAtIGltcGxlbWVudCBkZWxldGluZyBvYmplY3RzIGJ5IGZvcm1hdAorCisgICAgTXRwU3RyaW5nIGZpbGVQYXRoOworICAgIGludDY0X3QgZmlsZUxlbmd0aDsKKyAgICBpbnQgcmVzdWx0ID0gbURhdGFiYXNlLT5nZXRPYmplY3RGaWxlUGF0aChoYW5kbGUsIGZpbGVQYXRoLCBmaWxlTGVuZ3RoKTsKKyAgICBpZiAocmVzdWx0ID09IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICBMT0dWKCJkZWxldGluZyAlcyIsIChjb25zdCBjaGFyICopZmlsZVBhdGgpOworICAgICAgICBkZWxldGVQYXRoKChjb25zdCBjaGFyICopZmlsZVBhdGgpOworICAgICAgICByZXR1cm4gbURhdGFiYXNlLT5kZWxldGVGaWxlKGhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0T2JqZWN0UHJvcERlc2MoKSB7CisgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcENvZGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsKKyAgICBMT0dEKCJHZXRPYmplY3RQcm9wRGVzYyAlcyAlc1xuIiwgTXRwRGVidWc6OmdldE9iamVjdFByb3BDb2RlTmFtZShwcm9wQ29kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGVidWc6OmdldEZvcm1hdENvZGVOYW1lKGZvcm1hdCkpOworICAgIE10cFByb3BlcnR5KiBwcm9wZXJ0eSA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0UHJvcGVydHlEZXNjKHByb3BDb2RlLCBmb3JtYXQpOworICAgIGlmICghcHJvcGVydHkpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0JKRUNUX1BST1BfTk9UX1NVUFBPUlRFRDsKKyAgICBwcm9wZXJ0eS0+d3JpdGUobURhdGEpOworICAgIGRlbGV0ZSBwcm9wZXJ0eTsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldERldmljZVByb3BEZXNjKCkgeworICAgIE10cERldmljZVByb3BlcnR5IHByb3BDb2RlID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIExPR0QoIkdldERldmljZVByb3BEZXNjICVzXG4iLCBNdHBEZWJ1Zzo6Z2V0RGV2aWNlUHJvcENvZGVOYW1lKHByb3BDb2RlKSk7CisgICAgTXRwUHJvcGVydHkqIHByb3BlcnR5ID0gbURhdGFiYXNlLT5nZXREZXZpY2VQcm9wZXJ0eURlc2MocHJvcENvZGUpOworICAgIGlmICghcHJvcGVydHkpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfREVWSUNFX1BST1BfTk9UX1NVUFBPUlRFRDsKKyAgICBwcm9wZXJ0eS0+d3JpdGUobURhdGEpOworICAgIGRlbGV0ZSBwcm9wZXJ0eTsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5oIGIvbWVkaWEvbXRwL010cFNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YTY1NjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfU0VSVkVSX0gKKyNkZWZpbmUgX01UUF9TRVJWRVJfSAorCisjaW5jbHVkZSAiTXRwUmVxdWVzdFBhY2tldC5oIgorI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBSZXNwb25zZVBhY2tldC5oIgorI2luY2x1ZGUgIk10cEV2ZW50UGFja2V0LmgiCisjaW5jbHVkZSAibXRwLmgiCisKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERhdGFiYXNlOworY2xhc3MgTXRwU3RvcmFnZTsKKworY2xhc3MgTXRwU2VydmVyIHsKKworcHJpdmF0ZToKKyAgICAvLyBmaWxlIGRlc2NyaXB0b3IgZm9yIE1UUCBrZXJuZWwgZHJpdmVyCisgICAgaW50ICAgICAgICAgICAgICAgICBtRkQ7CisKKyAgICBNdHBEYXRhYmFzZSogICAgICAgIG1EYXRhYmFzZTsKKworICAgIC8vIGdyb3VwIHRvIG93biBuZXcgZmlsZXMgYW5kIGZvbGRlcnMKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1GaWxlR3JvdXA7CisgICAgLy8gcGVybWlzc2lvbnMgZm9yIG5ldyBmaWxlcyBhbmQgZGlyZWN0b3JpZXMKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1GaWxlUGVybWlzc2lvbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1EaXJlY3RvcnlQZXJtaXNzaW9uOworCisgICAgLy8gY3VycmVudCBzZXNzaW9uIElECisgICAgTXRwU2Vzc2lvbklEICAgICAgICBtU2Vzc2lvbklEOworICAgIC8vIHRydWUgaWYgd2UgaGF2ZSBhbiBvcGVuIHNlc3Npb24gYW5kIG1TZXNzaW9uSUQgaXMgdmFsaWQKKyAgICBib29sICAgICAgICAgICAgICAgIG1TZXNzaW9uT3BlbjsKKworICAgIE10cFJlcXVlc3RQYWNrZXQgICAgbVJlcXVlc3Q7CisgICAgTXRwRGF0YVBhY2tldCAgICAgICBtRGF0YTsKKyAgICBNdHBSZXNwb25zZVBhY2tldCAgIG1SZXNwb25zZTsKKyAgICBNdHBFdmVudFBhY2tldCAgICAgIG1FdmVudDsKKworICAgIE10cFN0b3JhZ2VMaXN0ICAgICAgbVN0b3JhZ2VzOworCisgICAgLy8gaGFuZGxlIGZvciBuZXcgb2JqZWN0LCBzZXQgYnkgU2VuZE9iamVjdEluZm8gYW5kIHVzZWQgYnkgU2VuZE9iamVjdAorICAgIE10cE9iamVjdEhhbmRsZSAgICAgbVNlbmRPYmplY3RIYW5kbGU7CisgICAgTXRwT2JqZWN0Rm9ybWF0ICAgICBtU2VuZE9iamVjdEZvcm1hdDsKKyAgICBNdHBTdHJpbmcgICAgICAgICAgIG1TZW5kT2JqZWN0RmlsZVBhdGg7CisgICAgc2l6ZV90ICAgICAgICAgICAgICBtU2VuZE9iamVjdEZpbGVTaXplOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBTZXJ2ZXIoaW50IGZkLCBNdHBEYXRhYmFzZSogZGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsZUdyb3VwLCBpbnQgZmlsZVBlcm0sIGludCBkaXJlY3RvcnlQZXJtKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBTZXJ2ZXIoKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgYWRkU3RvcmFnZShjb25zdCBjaGFyKiBmaWxlUGF0aCk7CisgICAgaW5saW5lIHZvaWQgICAgICAgICBhZGRTdG9yYWdlKE10cFN0b3JhZ2UqIHN0b3JhZ2UpIHsgbVN0b3JhZ2VzLnB1c2goc3RvcmFnZSk7IH0KKyAgICBNdHBTdG9yYWdlKiAgICAgICAgIGdldFN0b3JhZ2UoTXRwU3RvcmFnZUlEIGlkKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHJ1bigpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kT2JqZWN0QWRkZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kT2JqZWN0UmVtb3ZlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKworcHJpdmF0ZToKKyAgICBib29sICAgICAgICAgICAgICAgIGhhbmRsZVJlcXVlc3QoKTsKKworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXREZXZpY2VJbmZvKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb09wZW5TZXNzaW9uKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0Nsb3NlU2Vzc2lvbigpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXRTdG9yYWdlSURzKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldFN0b3JhZ2VJbmZvKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldE9iamVjdFByb3BzU3VwcG9ydGVkKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldE9iamVjdEhhbmRsZXMoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0TnVtT2JqZWN0cygpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXRPYmplY3RSZWZlcmVuY2VzKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb1NldE9iamVjdFJlZmVyZW5jZXMoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0UHJvcFZhbHVlKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb1NldE9iamVjdFByb3BWYWx1ZSgpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXREZXZpY2VQcm9wVmFsdWUoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvU2V0RGV2aWNlUHJvcFZhbHVlKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb1Jlc2V0RGV2aWNlUHJvcFZhbHVlKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldE9iamVjdEluZm8oKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0KCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb1NlbmRPYmplY3RJbmZvKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb1NlbmRPYmplY3QoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvRGVsZXRlT2JqZWN0KCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldE9iamVjdFByb3BEZXNjKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldERldmljZVByb3BEZXNjKCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9TRVJWRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0b3JhZ2UuY3BwIGIvbWVkaWEvbXRwL010cFN0b3JhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjY2YxODYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZS5jcHAKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwU3RvcmFnZSIKKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJNdHBTdG9yYWdlLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwU3RvcmFnZTo6TXRwU3RvcmFnZShNdHBTdG9yYWdlSUQgaWQsIGNvbnN0IGNoYXIqIGZpbGVQYXRoLCBNdHBEYXRhYmFzZSogZGIpCisgICAgOiAgIG1TdG9yYWdlSUQoaWQpLAorICAgICAgICBtRmlsZVBhdGgoZmlsZVBhdGgpLAorICAgICAgICBtRGF0YWJhc2UoZGIpLAorICAgICAgICBtTWF4Q2FwYWNpdHkoMCkKK3sKKyAgICBMT0dEKCJNdHBTdG9yYWdlIGlkOiAlZCBwYXRoOiAlc1xuIiwgaWQsIGZpbGVQYXRoKTsKK30KKworTXRwU3RvcmFnZTo6fk10cFN0b3JhZ2UoKSB7Cit9CisKK2ludCBNdHBTdG9yYWdlOjpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBNVFBfU1RPUkFHRV9GSVhFRF9SQU07Cit9CisKK2ludCBNdHBTdG9yYWdlOjpnZXRGaWxlU3lzdGVtVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTVRQX1NUT1JBR0VfRklMRVNZU1RFTV9ISUVSQVJDSElDQUw7Cit9CisKK2ludCBNdHBTdG9yYWdlOjpnZXRBY2Nlc3NDYXBhYmlsaXR5KCkgY29uc3QgeworICAgIHJldHVybiBNVFBfU1RPUkFHRV9SRUFEX1dSSVRFOworfQorCit1aW50NjRfdCBNdHBTdG9yYWdlOjpnZXRNYXhDYXBhY2l0eSgpIHsKKyAgICBpZiAobU1heENhcGFjaXR5ID09IDApIHsKKyAgICAgICAgc3RydWN0IHN0YXRmcyAgIHN0YXQ7CisgICAgICAgIGlmIChzdGF0ZnMobUZpbGVQYXRoLCAmc3RhdCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIG1NYXhDYXBhY2l0eSA9ICh1aW50NjRfdClzdGF0LmZfYmxvY2tzICogKHVpbnQ2NF90KXN0YXQuZl9ic2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIG1NYXhDYXBhY2l0eTsKK30KKwordWludDY0X3QgTXRwU3RvcmFnZTo6Z2V0RnJlZVNwYWNlKCkgeworICAgIHN0cnVjdCBzdGF0ZnMgICBzdGF0OworICAgIGlmIChzdGF0ZnMobUZpbGVQYXRoLCAmc3RhdCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gKHVpbnQ2NF90KXN0YXQuZl9iYXZhaWwgKiAodWludDY0X3Qpc3RhdC5mX2JzaXplOworfQorCitjb25zdCBjaGFyKiBNdHBTdG9yYWdlOjpnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gIkRldmljZSBTdG9yYWdlIjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTdG9yYWdlLmggYi9tZWRpYS9tdHAvTXRwU3RvcmFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxM2I5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfU1RPUkFHRV9ICisjZGVmaW5lIF9NVFBfU1RPUkFHRV9ICisKKyNpbmNsdWRlICJtdHAuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhYmFzZTsKKworY2xhc3MgTXRwU3RvcmFnZSB7CisKK3ByaXZhdGU6CisgICAgTXRwU3RvcmFnZUlEICAgICAgICAgICAgbVN0b3JhZ2VJRDsKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICBtRmlsZVBhdGg7CisgICAgTXRwRGF0YWJhc2UqICAgICAgICAgICAgbURhdGFiYXNlOworICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgIG1NYXhDYXBhY2l0eTsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2UoTXRwU3RvcmFnZUlEIGlkLCBjb25zdCBjaGFyKiBmaWxlUGF0aCwgTXRwRGF0YWJhc2UqIGRiKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+TXRwU3RvcmFnZSgpOworCisgICAgaW5saW5lIE10cFN0b3JhZ2VJRCAgICAgZ2V0U3RvcmFnZUlEKCkgY29uc3QgeyByZXR1cm4gbVN0b3JhZ2VJRDsgfQorICAgIGludCAgICAgICAgICAgICAgICAgICAgIGdldFR5cGUoKSBjb25zdDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBnZXRGaWxlU3lzdGVtVHlwZSgpIGNvbnN0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgIGdldEFjY2Vzc0NhcGFiaWxpdHkoKSBjb25zdDsKKyAgICB1aW50NjRfdCAgICAgICAgICAgICAgICBnZXRNYXhDYXBhY2l0eSgpOworICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgIGdldEZyZWVTcGFjZSgpOworICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgIGdldERlc2NyaXB0aW9uKCkgY29uc3Q7CisgICAgaW5saW5lIGNvbnN0IGNoYXIqICAgICAgZ2V0UGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1GaWxlUGF0aDsgfQorfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfU1RPUkFHRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RvcmFnZUluZm8uY3BwIGIvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTY0YWMwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmNwcApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBTdG9yYWdlSW5mbyIKKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFN0b3JhZ2VJbmZvLmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwU3RvcmFnZUluZm86Ok10cFN0b3JhZ2VJbmZvKE10cFN0b3JhZ2VJRCBpZCkKKyAgICA6ICAgbVN0b3JhZ2VJRChpZCksCisgICAgICAgIG1TdG9yYWdlVHlwZSgwKSwKKyAgICAgICAgbUZpbGVTeXN0ZW1UeXBlKDApLAorICAgICAgICBtQWNjZXNzQ2FwYWJpbGl0eSgwKSwKKyAgICAgICAgbU1heENhcGFjaXR5KDApLAorICAgICAgICBtRnJlZVNwYWNlQnl0ZXMoMCksCisgICAgICAgIG1GcmVlU3BhY2VPYmplY3RzKDApLAorICAgICAgICBtU3RvcmFnZURlc2NyaXB0aW9uKE5VTEwpLAorICAgICAgICBtVm9sdW1lSWRlbnRpZmllcihOVUxMKQoreworfQorCitNdHBTdG9yYWdlSW5mbzo6fk10cFN0b3JhZ2VJbmZvKCkgeworICAgIGlmIChtU3RvcmFnZURlc2NyaXB0aW9uKQorICAgICAgICBmcmVlKG1TdG9yYWdlRGVzY3JpcHRpb24pOworICAgIGlmIChtVm9sdW1lSWRlbnRpZmllcikKKyAgICAgICAgZnJlZShtVm9sdW1lSWRlbnRpZmllcik7Cit9CisKK3ZvaWQgTXRwU3RvcmFnZUluZm86OnJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgTXRwU3RyaW5nQnVmZmVyIHN0cmluZzsKKworICAgIC8vIHJlYWQgdGhlIGRldmljZSBpbmZvCisgICAgbVN0b3JhZ2VUeXBlID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1GaWxlU3lzdGVtVHlwZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtQWNjZXNzQ2FwYWJpbGl0eSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtTWF4Q2FwYWNpdHkgPSBwYWNrZXQuZ2V0VUludDY0KCk7CisgICAgbUZyZWVTcGFjZUJ5dGVzID0gcGFja2V0LmdldFVJbnQ2NCgpOworICAgIG1GcmVlU3BhY2VPYmplY3RzID0gcGFja2V0LmdldFVJbnQzMigpOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1TdG9yYWdlRGVzY3JpcHRpb24gPSBzdHJkdXAoKGNvbnN0IGNoYXIgKilzdHJpbmcpOworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBtVm9sdW1lSWRlbnRpZmllciA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7Cit9CisKK3ZvaWQgTXRwU3RvcmFnZUluZm86OnByaW50KCkgeworICAgIExPR0QoIlN0b3JhZ2UgSW5mbyAlMDhYOlxuXHRtU3RvcmFnZVR5cGU6ICVkXG5cdG1GaWxlU3lzdGVtVHlwZTogJWRcblx0bUFjY2Vzc0NhcGFiaWxpdHk6ICVkXG4iLAorICAgICAgICAgICAgbVN0b3JhZ2VJRCwgbVN0b3JhZ2VUeXBlLCBtRmlsZVN5c3RlbVR5cGUsIG1BY2Nlc3NDYXBhYmlsaXR5KTsKKyAgICBMT0dEKCJcdG1NYXhDYXBhY2l0eTogJWxsZFxuXHRtRnJlZVNwYWNlQnl0ZXM6ICVsbGRcblx0bUZyZWVTcGFjZU9iamVjdHM6ICVkXG4iLAorICAgICAgICAgICAgbU1heENhcGFjaXR5LCBtRnJlZVNwYWNlQnl0ZXMsIG1GcmVlU3BhY2VPYmplY3RzKTsKKyAgICBMT0dEKCJcdG1TdG9yYWdlRGVzY3JpcHRpb246ICVzXG5cdG1Wb2x1bWVJZGVudGlmaWVyOiAlc1xuIiwKKyAgICAgICAgICAgIG1TdG9yYWdlRGVzY3JpcHRpb24sIG1Wb2x1bWVJZGVudGlmaWVyKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5oIGIvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNiNjI2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfU1RPUkFHRV9JTkZPX0gKKyNkZWZpbmUgX01UUF9TVE9SQUdFX0lORk9fSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworCitjbGFzcyBNdHBTdG9yYWdlSW5mbyB7CitwdWJsaWM6CisgICAgTXRwU3RvcmFnZUlEICAgICAgICBtU3RvcmFnZUlEOworICAgIHVpbnQxNl90ICAgICAgICAgICAgbVN0b3JhZ2VUeXBlOworICAgIHVpbnQxNl90ICAgICAgICAgICAgbUZpbGVTeXN0ZW1UeXBlOworICAgIHVpbnQxNl90ICAgICAgICAgICAgbUFjY2Vzc0NhcGFiaWxpdHk7CisgICAgdWludDY0X3QgICAgICAgICAgICBtTWF4Q2FwYWNpdHk7CisgICAgdWludDY0X3QgICAgICAgICAgICBtRnJlZVNwYWNlQnl0ZXM7CisgICAgdWludDMyX3QgICAgICAgICAgICBtRnJlZVNwYWNlT2JqZWN0czsKKyAgICBjaGFyKiAgICAgICAgICAgICAgIG1TdG9yYWdlRGVzY3JpcHRpb247CisgICAgY2hhciogICAgICAgICAgICAgICBtVm9sdW1lSWRlbnRpZmllcjsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUluZm8oTXRwU3RvcmFnZUlEIGlkKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBTdG9yYWdlSW5mbygpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICByZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHByaW50KCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9TVE9SQUdFX0lORk9fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0cmluZ0J1ZmZlci5jcHAgYi9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZThjZjA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFN0cmluZ0J1ZmZlci5jcHAKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cFN0cmluZ0J1ZmZlciIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFN0cmluZ0J1ZmZlcjo6TXRwU3RyaW5nQnVmZmVyKCkKKyAgICA6ICAgbUNoYXJDb3VudCgwKSwKKyAgICAgICAgbUJ5dGVDb3VudCgxKQoreworICAgIG1CdWZmZXJbMF0gPSAwOworfQorCitNdHBTdHJpbmdCdWZmZXI6Ok10cFN0cmluZ0J1ZmZlcihjb25zdCBjaGFyKiBzcmMpCisgICAgOiAgIG1DaGFyQ291bnQoMCksCisgICAgICAgIG1CeXRlQ291bnQoMSkKK3sKKyAgICBzZXQoc3JjKTsKK30KKworTXRwU3RyaW5nQnVmZmVyOjpNdHBTdHJpbmdCdWZmZXIoY29uc3QgdWludDE2X3QqIHNyYykKKyAgICA6ICAgbUNoYXJDb3VudCgwKSwKKyAgICAgICAgbUJ5dGVDb3VudCgxKQoreworICAgIHNldChzcmMpOworfQorCitNdHBTdHJpbmdCdWZmZXI6Ok10cFN0cmluZ0J1ZmZlcihjb25zdCBNdHBTdHJpbmdCdWZmZXImIHNyYykKKyAgICA6ICAgbUNoYXJDb3VudChzcmMubUNoYXJDb3VudCksCisgICAgICAgIG1CeXRlQ291bnQoc3JjLm1CeXRlQ291bnQpCit7CisgICAgbWVtY3B5KG1CdWZmZXIsIHNyYy5tQnVmZmVyLCBtQnl0ZUNvdW50KTsKK30KKworCitNdHBTdHJpbmdCdWZmZXI6On5NdHBTdHJpbmdCdWZmZXIoKSB7Cit9CisKK3ZvaWQgTXRwU3RyaW5nQnVmZmVyOjpzZXQoY29uc3QgY2hhciogc3JjKSB7CisgICAgaW50IGxlbmd0aCA9IHN0cmxlbihzcmMpOworICAgIGlmIChsZW5ndGggPj0gc2l6ZW9mKG1CdWZmZXIpKQorICAgICAgICBsZW5ndGggPSBzaXplb2YobUJ1ZmZlcikgLSAxOworICAgIG1lbWNweShtQnVmZmVyLCBzcmMsIGxlbmd0aCk7CisKKyAgICAvLyBjb3VudCB0aGUgY2hhcmFjdGVycworICAgIGludCBjb3VudCA9IDA7CisgICAgY2hhciBjaDsKKyAgICB3aGlsZSAoKGNoID0gKnNyYysrKSAhPSAwKSB7CisgICAgICAgIGlmICgoY2ggJiAweDgwKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBzaW5nbGUgYnl0ZSBjaGFyYWN0ZXIKKyAgICAgICAgfSBlbHNlIGlmICgoY2ggJiAweEUwKSA9PSAweEMwKSB7CisgICAgICAgICAgICAvLyB0d28gYnl0ZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgIGlmICghICpzcmMrKykgeworICAgICAgICAgICAgICAgIC8vIGxhc3QgY2hhcmFjdGVyIHdhcyB0cnVuY2F0ZWQsIHNvIGlnbm9yZSBsYXN0IGJ5dGUKKyAgICAgICAgICAgICAgICBsZW5ndGgtLTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgoY2ggJiAweEYwKSA9PSAweEUwKSB7CisgICAgICAgICAgICAvLyAzIGJ5dGUgY2hhcgorICAgICAgICAgICAgaWYgKCEgKnNyYysrKSB7CisgICAgICAgICAgICAgICAgLy8gbGFzdCBjaGFyYWN0ZXIgd2FzIHRydW5jYXRlZCwgc28gaWdub3JlIGxhc3QgYnl0ZQorICAgICAgICAgICAgICAgIGxlbmd0aC0tOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEgKnNyYysrKSB7CisgICAgICAgICAgICAgICAgLy8gbGFzdCBjaGFyYWN0ZXIgd2FzIHRydW5jYXRlZCwgc28gaWdub3JlIGxhc3QgdHdvIGJ5dGVzCisgICAgICAgICAgICAgICAgbGVuZ3RoIC09IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY291bnQrKzsKKyAgICB9CisKKyAgICBtQnl0ZUNvdW50ID0gbGVuZ3RoICsgMTsKKyAgICBtQnVmZmVyW2xlbmd0aF0gPSAwOworICAgIG1DaGFyQ291bnQgPSBjb3VudDsKK30KKwordm9pZCBNdHBTdHJpbmdCdWZmZXI6OnNldChjb25zdCB1aW50MTZfdCogc3JjKSB7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICB1aW50MTZfdCBjaDsKKyAgICB1aW50OF90KiBkZXN0ID0gbUJ1ZmZlcjsKKworICAgIHdoaWxlICgoY2ggPSAqc3JjKyspICE9IDAgJiYgY291bnQgPCAyNTUpIHsKKyAgICAgICAgaWYgKGNoID49IDB4MDgwMCkgeworICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweEUwIHwgKGNoID4+IDEyKSk7CisgICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4ODAgfCAoKGNoID4+IDYpICYgMHgzRikpOworICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweDgwIHwgKGNoICYgMHgzRikpOworICAgICAgICB9IGVsc2UgaWYgKGNoID49IDB4ODApIHsKKyAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHhDMCB8IChjaCA+PiA2KSk7CisgICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4ODAgfCAoY2ggJiAweDNGKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZGVzdCsrID0gY2g7CisgICAgICAgIH0KKyAgICAgICAgY291bnQrKzsKKyAgICB9CisgICAgKmRlc3QrKyA9IDA7CisgICAgbUNoYXJDb3VudCA9IGNvdW50OworICAgIG1CeXRlQ291bnQgPSBkZXN0IC0gbUJ1ZmZlcjsKK30KKwordm9pZCBNdHBTdHJpbmdCdWZmZXI6OnJlYWRGcm9tUGFja2V0KE10cERhdGFQYWNrZXQqIHBhY2tldCkgeworICAgIGludCBjb3VudCA9IHBhY2tldC0+Z2V0VUludDgoKTsKKyAgICB1aW50OF90KiBkZXN0ID0gbUJ1ZmZlcjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgdWludDE2X3QgY2ggPSBwYWNrZXQtPmdldFVJbnQxNigpOworICAgICAgICBpZiAoY2ggPj0gMHgwODAwKSB7CisgICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4RTAgfCAoY2ggPj4gMTIpKTsKKyAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHg4MCB8ICgoY2ggPj4gNikgJiAweDNGKSk7CisgICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4ODAgfCAoY2ggJiAweDNGKSk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gMHg4MCkgeworICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweEMwIHwgKGNoID4+IDYpKTsKKyAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHg4MCB8IChjaCAmIDB4M0YpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkZXN0KysgPSBjaDsKKyAgICAgICAgfQorICAgIH0KKyAgICAqZGVzdCsrID0gMDsKKyAgICBtQ2hhckNvdW50ID0gY291bnQ7CisgICAgbUJ5dGVDb3VudCA9IGRlc3QgLSBtQnVmZmVyOworfQorCit2b2lkIE10cFN0cmluZ0J1ZmZlcjo6d3JpdGVUb1BhY2tldChNdHBEYXRhUGFja2V0KiBwYWNrZXQpIGNvbnN0IHsKKyAgICBpbnQgY291bnQgPSBtQ2hhckNvdW50OworICAgIGNvbnN0IHVpbnQ4X3QqIHNyYyA9IG1CdWZmZXI7CisgICAgcGFja2V0LT5wdXRVSW50OChjb3VudCA+IDAgPyBjb3VudCArIDEgOiAwKTsKKworICAgIC8vIGV4cGFuZCB1dGY4IHRvIDE2IGJpdCBjaGFycworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICB1aW50MTZfdCBjaDsKKyAgICAgICAgdWludDE2X3QgY2gxID0gKnNyYysrOworICAgICAgICBpZiAoKGNoMSAmIDB4ODApID09IDApIHsKKyAgICAgICAgICAgIC8vIHNpbmdsZSBieXRlIGNoYXJhY3RlcgorICAgICAgICAgICAgY2ggPSBjaDE7CisgICAgICAgIH0gZWxzZSBpZiAoKGNoMSAmIDB4RTApID09IDB4QzApIHsKKyAgICAgICAgICAgIC8vIHR3byBieXRlIGNoYXJhY3RlcgorICAgICAgICAgICAgdWludDE2X3QgY2gyID0gKnNyYysrOworICAgICAgICAgICAgY2ggPSAoKGNoMSAmIDB4MUYpIDw8IDYpIHwgKGNoMiAmIDB4M0YpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdGhyZWUgYnl0ZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgIHVpbnQxNl90IGNoMiA9ICpzcmMrKzsKKyAgICAgICAgICAgIHVpbnQxNl90IGNoMyA9ICpzcmMrKzsKKyAgICAgICAgICAgIGNoID0gKChjaDEgJiAweDBGKSA8PCAxMikgfCAoKGNoMiAmIDB4M0YpIDw8IDYpIHwgKGNoMyAmIDB4M0YpOworICAgICAgICB9CisgICAgICAgIHBhY2tldC0+cHV0VUludDE2KGNoKTsKKyAgICB9CisgICAgLy8gb25seSB0ZXJtaW5hdGUgd2l0aCB6ZXJvIGlmIHN0cmluZyBpcyBub3QgZW1wdHkKKyAgICBpZiAoY291bnQgPiAwKQorICAgICAgICBwYWNrZXQtPnB1dFVJbnQxNigwKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuaCBiL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmM4MzA3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFN0cmluZ0J1ZmZlci5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfU1RSSU5HX0JVRkZFUl9ICisjZGVmaW5lIF9NVFBfU1RSSU5HX0JVRkZFUl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworCisvLyBSZXByZXNlbnRzIGEgdXRmOCBzdHJpbmcsIHdpdGggYSBtYXhpbXVtIG9mIDI1NSBjaGFyYWN0ZXJzCitjbGFzcyBNdHBTdHJpbmdCdWZmZXIgeworCitwcml2YXRlOgorICAgIC8vIG1CdWZmZXIgY29udGFpbnMgc3RyaW5nIGluIFVURjggZm9ybWF0CisgICAgLy8gbWF4aW11bSAzIGJ5dGVzL2NoYXJhY3Rlciwgd2l0aCAxIGV4dHJhIGZvciB6ZXJvIHRlcm1pbmF0aW9uCisgICAgdWludDhfdCAgICAgICAgIG1CdWZmZXJbMjU1ICogMyArIDFdOworICAgIGludCAgICAgICAgICAgICBtQ2hhckNvdW50OworICAgIGludCAgICAgICAgICAgICBtQnl0ZUNvdW50OworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmdCdWZmZXIoY29uc3QgY2hhciogc3JjKTsKKyAgICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyKGNvbnN0IHVpbnQxNl90KiBzcmMpOworICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmdCdWZmZXIoY29uc3QgTXRwU3RyaW5nQnVmZmVyJiBzcmMpOworICAgIHZpcnR1YWwgICAgICAgICB+TXRwU3RyaW5nQnVmZmVyKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgc2V0KGNvbnN0IGNoYXIqIHNyYyk7CisgICAgdm9pZCAgICAgICAgICAgIHNldChjb25zdCB1aW50MTZfdCogc3JjKTsKKworICAgIHZvaWQgICAgICAgICAgICByZWFkRnJvbVBhY2tldChNdHBEYXRhUGFja2V0KiBwYWNrZXQpOworICAgIHZvaWQgICAgICAgICAgICB3cml0ZVRvUGFja2V0KE10cERhdGFQYWNrZXQqIHBhY2tldCkgY29uc3Q7CisKKyAgICBpbmxpbmUgaW50ICAgICAgZ2V0Q2hhckNvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYXJDb3VudDsgfQorICAgIGlubGluZSBpbnQgICAgICBnZXRCeXRlQ291bnQoKSBjb25zdCB7IHJldHVybiBtQnl0ZUNvdW50OyB9CisKKwlpbmxpbmUgb3BlcmF0b3IgY29uc3QgY2hhciooKSBjb25zdCB7IHJldHVybiAoY29uc3QgY2hhciAqKW1CdWZmZXI7IH0KK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1NUUklOR19CVUZGRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFR5cGVzLmggYi9tZWRpYS9tdHAvTXRwVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjBjODU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFR5cGVzLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9UWVBFU19ICisjZGVmaW5lIF9NVFBfVFlQRVNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAidXRpbHMvU3RyaW5nOC5oIgorI2luY2x1ZGUgInV0aWxzL1ZlY3Rvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3R5cGVkZWYgaW50MzJfdCBpbnQxMjhfdFs0XTsKK3R5cGVkZWYgdWludDMyX3QgdWludDEyOF90WzRdOworCit0eXBlZGVmIHVpbnQxNl90IE10cE9wZXJhdGlvbkNvZGU7Cit0eXBlZGVmIHVpbnQxNl90IE10cFJlc3BvbnNlQ29kZTsKK3R5cGVkZWYgdWludDE2X3QgTXRwRXZlbnRDb2RlOwordHlwZWRlZiB1aW50MzJfdCBNdHBTZXNzaW9uSUQ7Cit0eXBlZGVmIHVpbnQzMl90IE10cFN0b3JhZ2VJRDsKK3R5cGVkZWYgdWludDMyX3QgTXRwVHJhbnNhY3Rpb25JRDsKK3R5cGVkZWYgdWludDE2X3QgTXRwUHJvcGVydHlDb2RlOwordHlwZWRlZiB1aW50MTZfdCBNdHBEYXRhVHlwZTsKK3R5cGVkZWYgdWludDE2X3QgTXRwT2JqZWN0Rm9ybWF0OwordHlwZWRlZiBNdHBQcm9wZXJ0eUNvZGUgTXRwRGV2aWNlUHJvcGVydHk7Cit0eXBlZGVmIE10cFByb3BlcnR5Q29kZSBNdHBPYmplY3RQcm9wZXJ0eTsKKworLy8gb2JqZWN0IGhhbmRsZXMgYXJlIHVuaXF1ZSBhY3Jvc3MgYWxsIHN0b3JhZ2UgYnV0IG9ubHkgd2l0aGluIGEgc2luZ2xlIHNlc3Npb24uCisvLyBvYmplY3QgaGFuZGxlcyBjYW5ub3QgYmUgcmV1c2VkIGFmdGVyIGFuIG9iamVjdCBpcyBkZWxldGVkLgorLy8gdmFsdWVzIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYgYXJlIHJlc2VydmVkIGZvciBzcGVjaWFsIHB1cnBvc2VzLgordHlwZWRlZiB1aW50MzJfdCBNdHBPYmplY3RIYW5kbGU7CisKKy8vIFNwZWNpYWwgdmFsdWVzCisjZGVmaW5lIE1UUF9QQVJFTlRfUk9PVCAgICAgICAgIDB4RkZGRkZGRkYgICAgICAgLy8gcGFyZW50IGlzIHJvb3Qgb2YgdGhlIHN0b3JhZ2UKKyNkZWZpbmUga0ludmFsaWRPYmplY3RIYW5kbGUgICAgMHhGRkZGRkZGRgorCitjbGFzcyBNdHBTdG9yYWdlOworY2xhc3MgTXRwRGV2aWNlOworY2xhc3MgTXRwUHJvcGVydHk7CisKK3R5cGVkZWYgVmVjdG9yPE10cFN0b3JhZ2UgKj4gTXRwU3RvcmFnZUxpc3Q7Cit0eXBlZGVmIFZlY3RvcjxNdHBEZXZpY2UqPiBNdHBEZXZpY2VMaXN0OwordHlwZWRlZiBWZWN0b3I8TXRwUHJvcGVydHkqPiBNdHBQcm9wZXJ0eUxpc3Q7CisKK3R5cGVkZWYgVmVjdG9yPHVpbnQ4X3Q+IFVJbnQ4TGlzdDsKK3R5cGVkZWYgVmVjdG9yPHVpbnQxNl90PiBVSW50MTZMaXN0OwordHlwZWRlZiBWZWN0b3I8dWludDMyX3Q+IFVJbnQzMkxpc3Q7Cit0eXBlZGVmIFZlY3Rvcjx1aW50NjRfdD4gVUludDY0TGlzdDsKK3R5cGVkZWYgVmVjdG9yPGludDhfdD4gSW50OExpc3Q7Cit0eXBlZGVmIFZlY3RvcjxpbnQxNl90PiBJbnQxNkxpc3Q7Cit0eXBlZGVmIFZlY3RvcjxpbnQzMl90PiBJbnQzMkxpc3Q7Cit0eXBlZGVmIFZlY3RvcjxpbnQ2NF90PiBJbnQ2NExpc3Q7CisKK3R5cGVkZWYgVUludDE2TGlzdCBNdHBPYmplY3RQcm9wZXJ0eUxpc3Q7Cit0eXBlZGVmIFVJbnQxNkxpc3QgTXRwRGV2aWNlUHJvcGVydHlMaXN0OwordHlwZWRlZiBVSW50MTZMaXN0IE10cE9iamVjdEZvcm1hdExpc3Q7Cit0eXBlZGVmIFVJbnQzMkxpc3QgTXRwT2JqZWN0SGFuZGxlTGlzdDsKK3R5cGVkZWYgVUludDE2TGlzdCBNdHBPYmplY3RQcm9wZXJ0eUxpc3Q7Cit0eXBlZGVmIFVJbnQzMkxpc3QgTXRwU3RvcmFnZUlETGlzdDsKKwordHlwZWRlZiBTdHJpbmc4ICAgIE10cFN0cmluZzsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfVFlQRVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFV0aWxzLmNwcCBiL21lZGlhL210cC9NdHBVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwMWVmNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBVdGlscy5jcHAKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwVXRpbHMiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPGN1dGlscy90enRpbWUuaD4KKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qCitEYXRlVGltZSBzdHJpbmdzIGZvbGxvdyBhIGNvbXBhdGlibGUgc3Vic2V0IG9mIHRoZSBkZWZpbml0aW9uIGZvdW5kIGluIElTTyA4NjAxLCBhbmQKK3Rha2UgdGhlIGZvcm0gb2YgYSBVbmljb2RlIHN0cmluZyBmb3JtYXR0ZWQgYXM6ICJZWVlZTU1ERFRoaG1tc3MucyIuIEluIHRoaXMKK3JlcHJlc2VudGF0aW9uLCBZWVlZIHNoYWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB5ZWFyLCBNTSByZXBsYWNlZCBieSB0aGUgbW9udGggKDAxLTEyKSwKK0REIHJlcGxhY2VkIGJ5IHRoZSBkYXkgKDAxLTMxKSwgVCBpcyBhIGNvbnN0YW50IGNoYXJhY3RlciAnVCcgZGVsaW1pdGluZyB0aW1lIGZyb20gZGF0ZSwKK2hoIGlzIHJlcGxhY2VkIGJ5IHRoZSBob3VyICgwMC0yMyksIG1tIGlzIHJlcGxhY2VkIGJ5IHRoZSBtaW51dGUgKDAwLTU5KSwgYW5kIHNzIGJ5IHRoZQorc2Vjb25kICgwMC01OSkuIFRoZSAiLnMiIGlzIG9wdGlvbmFsLCBhbmQgcmVwcmVzZW50cyB0ZW50aHMgb2YgYSBzZWNvbmQuCisqLworCitib29sIHBhcnNlRGF0ZVRpbWUoY29uc3QgY2hhciogZGF0ZVRpbWUsIHRpbWVfdCYgb3V0U2Vjb25kcykgeworICAgIGludCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZDsKKyAgICBzdHJ1Y3QgdG0gdG07CisKKyAgICBpZiAoc3NjYW5mKGRhdGVUaW1lLCAiJTA0ZCUwMmQlMDJkVCUwMmQlMDJkJTAyZCIsCisgICAgICAgICAgICAmeWVhciwgJm1vbnRoLCAmZGF5LCAmaG91ciwgJm1pbnV0ZSwgJnNlY29uZCkgIT0gNikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNvbnN0IGNoYXIqIHRhaWwgPSBkYXRlVGltZSArIDE1OworICAgIC8vIHNraXAgb3B0aW9uYWwgdGVudGggb2Ygc2Vjb25kCisgICAgaWYgKHRhaWxbMF0gPT0gJy4nICYmIHRhaWxbMV0pCisgICAgICAgIHRhaWwgKz0gMjsKKyAgICAvL0ZJWE1FIC0gc3VwcG9ydCArLy1oaG1tCisgICAgYm9vbCB1c2VVVEMgPSAodGFpbFswXSA9PSAnWicpOworCisgICAgLy8gaGFjayB0byBjb21wdXRlIHRpbWV6b25lCisgICAgdGltZV90IGR1bW15OworICAgIGxvY2FsdGltZV9yKCZkdW1teSwgJnRtKTsKKworICAgIHRtLnRtX3NlYyA9IHNlY29uZDsKKyAgICB0bS50bV9taW4gPSBtaW51dGU7CisgICAgdG0udG1faG91ciA9IGhvdXI7CisgICAgdG0udG1fbWRheSA9IGRheTsKKyAgICB0bS50bV9tb24gPSBtb250aDsKKyAgICB0bS50bV95ZWFyID0geWVhciAtIDE5MDA7CisgICAgdG0udG1fd2RheSA9IDA7CisgICAgdG0udG1faXNkc3QgPSAtMTsKKyAgICBpZiAodXNlVVRDKQorICAgICAgICBvdXRTZWNvbmRzID0gbWt0aW1lKCZ0bSk7CisgICAgZWxzZQorICAgICAgICBvdXRTZWNvbmRzID0gbWt0aW1lX3R6KCZ0bSwgdG0udG1fem9uZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBmb3JtYXREYXRlVGltZSh0aW1lX3Qgc2Vjb25kcywgY2hhciogYnVmZmVyLCBpbnQgYnVmZmVyTGVuZ3RoKSB7CisgICAgc3RydWN0IHRtIHRtOworCisgICAgbG9jYWx0aW1lX3IoJnNlY29uZHMsICZ0bSk7CisgICAgc25wcmludGYoYnVmZmVyLCBidWZmZXJMZW5ndGgsICIlMDRkJTAyZCUwMmRUJTAyZCUwMmQlMDJkIiwKKyAgICAgICAgdG0udG1feWVhciArIDE5MDAsIHRtLnRtX21vbiwgdG0udG1fbWRheSwgdG0udG1faG91ciwgdG0udG1fbWluLCB0bS50bV9zZWMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFV0aWxzLmggYi9tZWRpYS9tdHAvTXRwVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWY5MDU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFV0aWxzLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9VVElMU19ICisjZGVmaW5lIF9NVFBfVVRJTFNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworYm9vbCBwYXJzZURhdGVUaW1lKGNvbnN0IGNoYXIqIGRhdGVUaW1lLCB0aW1lX3QmIG91dFNlY29uZHMpOwordm9pZCBmb3JtYXREYXRlVGltZSh0aW1lX3Qgc2Vjb25kcywgY2hhciogYnVmZmVyLCBpbnQgYnVmZmVyTGVuZ3RoKTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfVVRJTFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL210cC5oIGIvbWVkaWEvbXRwL210cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YWZhNjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvbXRwLmgKQEAgLTAsMCArMSw0NzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfSAorI2RlZmluZSBfTVRQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIE1UUF9TVEFOREFSRF9WRVJTSU9OICAgICAgICAgICAgMTAwCisKKy8vIENvbnRhaW5lciBUeXBlcworI2RlZmluZSBNVFBfQ09OVEFJTkVSX1RZUEVfVU5ERUZJTkVEICAgIDAKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9UWVBFX0NPTU1BTkQgICAgICAxCisjZGVmaW5lIE1UUF9DT05UQUlORVJfVFlQRV9EQVRBICAgICAgICAgMgorI2RlZmluZSBNVFBfQ09OVEFJTkVSX1RZUEVfUkVTUE9OU0UgICAgIDMKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9UWVBFX0VWRU5UICAgICAgICA0CisKKy8vIENvbnRhaW5lciBPZmZzZXRzCisjZGVmaW5lIE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCAgICAgICAgICAgICAwCisjZGVmaW5lIE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1UUF9DT05UQUlORVJfQ09ERV9PRkZTRVQgICAgICAgICAgICAgICA2CisjZGVmaW5lIE1UUF9DT05UQUlORVJfVFJBTlNBQ1RJT05fSURfT0ZGU0VUICAgICA4CisjZGVmaW5lIE1UUF9DT05UQUlORVJfUEFSQU1FVEVSX09GRlNFVCAgICAgICAgICAxMgorI2RlZmluZSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFICAgICAgICAgICAgICAgMTIKKworLy8gTVRQIFR5cGVzCisjZGVmaW5lIE1UUF9UWVBFX1VOREVGSU5FRCAgICAgIDB4MDAwMCAgICAgICAgICAvLyBVbmRlZmluZWQKKyNkZWZpbmUgTVRQX1RZUEVfSU5UOCAgICAgICAgICAgMHgwMDAxICAgICAgICAgIC8vIFNpZ25lZCA4LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX1VJTlQ4ICAgICAgICAgIDB4MDAwMiAgICAgICAgICAvLyBVbnNpZ25lZCA4LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX0lOVDE2ICAgICAgICAgIDB4MDAwMyAgICAgICAgICAvLyBTaWduZWQgMTYtYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfVUlOVDE2ICAgICAgICAgMHgwMDA0ICAgICAgICAgIC8vIFVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX0lOVDMyICAgICAgICAgIDB4MDAwNSAgICAgICAgICAvLyBTaWduZWQgMzItYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfVUlOVDMyICAgICAgICAgMHgwMDA2ICAgICAgICAgIC8vIFVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX0lOVDY0ICAgICAgICAgIDB4MDAwNyAgICAgICAgICAvLyBTaWduZWQgNjQtYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfVUlOVDY0ICAgICAgICAgMHgwMDA4ICAgICAgICAgIC8vIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX0lOVDEyOCAgICAgICAgIDB4MDAwOSAgICAgICAgICAvLyBTaWduZWQgMTI4LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX1VJTlQxMjggICAgICAgIDB4MDAwQSAgICAgICAgICAvLyBVbnNpZ25lZCAxMjgtYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfQUlOVDggICAgICAgICAgMHg0MDAxICAgICAgICAgIC8vIEFycmF5IG9mIHNpZ25lZCA4LWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BVUlOVDggICAgICAgICAweDQwMDIgICAgICAgICAgLy8gQXJyYXkgb2YgdW5zaWduZWQgOC1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQUlOVDE2ICAgICAgICAgMHg0MDAzICAgICAgICAgIC8vIEFycmF5IG9mIHNpZ25lZCAxNi1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQVVJTlQxNiAgICAgICAgMHg0MDA0ICAgICAgICAgIC8vIEFycmF5IG9mIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BSU5UMzIgICAgICAgICAweDQwMDUgICAgICAgICAgLy8gQXJyYXkgb2Ygc2lnbmVkIDMyLWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BVUlOVDMyICAgICAgICAweDQwMDYgICAgICAgICAgLy8gQXJyYXkgb2YgdW5zaWduZWQgMzItYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FJTlQ2NCAgICAgICAgIDB4NDAwNyAgICAgICAgICAvLyBBcnJheSBvZiBzaWduZWQgNjQtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FVSU5UNjQgICAgICAgIDB4NDAwOCAgICAgICAgICAvLyBBcnJheSBvZiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQUlOVDEyOCAgICAgICAgMHg0MDA5ICAgICAgICAgIC8vIEFycmF5IG9mIHNpZ25lZCAxMjgtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FVSU5UMTI4ICAgICAgIDB4NDAwQSAgICAgICAgICAvLyBBcnJheSBvZiB1bnNpZ25lZCAxMjgtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX1NUUiAgICAgICAgICAgIDB4RkZGRiAgICAgICAgICAvLyBWYXJpYWJsZS1sZW5ndGggVW5pY29kZSBzdHJpbmcKKworLy8gTVRQIEZvcm1hdCBDb2RlcworI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDAgICAvLyBVbmRlZmluZWQgb2JqZWN0CisjZGVmaW5lIE1UUF9GT1JNQVRfQVNTT0NJQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMSAgIC8vIEFzc29jaWF0aW9uIChmb3IgZXhhbXBsZSwgYSBmb2xkZXIpCisjZGVmaW5lIE1UUF9GT1JNQVRfU0NSSVBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMiAgIC8vIERldmljZSBtb2RlbC1zcGVjaWZpYyBzY3JpcHQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9FWEVDVVRBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAzICAgLy8gRGV2aWNlIG1vZGVsLXNwZWNpZmljIGJpbmFyeSBleGVjdXRhYmxlCisjZGVmaW5lIE1UUF9GT1JNQVRfVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwNCAgIC8vIFRleHQgZmlsZQorI2RlZmluZSBNVFBfRk9STUFUX0hUTUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDUgICAvLyBIeXBlcnRleHQgTWFya3VwIExhbmd1YWdlIGZpbGUgKHRleHQpCisjZGVmaW5lIE1UUF9GT1JNQVRfRFBPRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwNiAgIC8vIERpZ2l0YWwgUHJpbnQgT3JkZXIgRm9ybWF0IGZpbGUgKHRleHQpCisjZGVmaW5lIE1UUF9GT1JNQVRfQUlGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwNyAgIC8vIEF1ZGlvIGNsaXAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9XQVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA4ICAgLy8gQXVkaW8gY2xpcAorI2RlZmluZSBNVFBfRk9STUFUX01QMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDkgICAvLyBBdWRpbyBjbGlwCisjZGVmaW5lIE1UUF9GT1JNQVRfQVZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwQSAgIC8vIFZpZGVvIGNsaXAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NUEVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDBCICAgLy8gVmlkZW8gY2xpcAorI2RlZmluZSBNVFBfRk9STUFUX0FTRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMEMgICAvLyBNaWNyb3NvZnQgQWR2YW5jZWQgU3RyZWFtaW5nIEZvcm1hdCAodmlkZW8pCisjZGVmaW5lIE1UUF9GT1JNQVRfREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMCAgIC8vIFVua25vd24gaW1hZ2Ugb2JqZWN0CisjZGVmaW5lIE1UUF9GT1JNQVRfRVhJRl9KUEVHICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMSAgIC8vIEV4Y2hhbmdlYWJsZSBGaWxlIEZvcm1hdCwgSkVJREEgc3RhbmRhcmQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9USUZGX0VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODAyICAgLy8gVGFnIEltYWdlIEZpbGUgRm9ybWF0IGZvciBFbGVjdHJvbmljIFBob3RvZ3JhcGh5CisjZGVmaW5lIE1UUF9GT1JNQVRfRkxBU0hQSVggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMyAgIC8vIFN0cnVjdHVyZWQgU3RvcmFnZSBJbWFnZSBGb3JtYXQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9CTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA0ICAgLy8gTWljcm9zb2Z0IFdpbmRvd3MgQml0bWFwIGZpbGUKKyNkZWZpbmUgTVRQX0ZPUk1BVF9DSUZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA1ICAgLy8gQ2Fub24gQ2FtZXJhIEltYWdlIEZpbGUgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfR0lGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwNyAgIC8vIEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdAorI2RlZmluZSBNVFBfRk9STUFUX0pGSUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDggICAvLyBKUEVHIEZpbGUgSW50ZXJjaGFuZ2UgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfQ0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwOSAgIC8vIFBob3RvQ0QgSW1hZ2UgUGFjCisjZGVmaW5lIE1UUF9GT1JNQVRfUElDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwQSAgIC8vIFF1aWNrZHJhdyBJbWFnZSBGb3JtYXQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9QTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBCICAgLy8gUG9ydGFibGUgTmV0d29yayBHcmFwaGljcworI2RlZmluZSBNVFBfRk9STUFUX1RJRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEQgICAvLyBUYWcgSW1hZ2UgRmlsZSBGb3JtYXQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9USUZGX0lUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBFICAgLy8gVGFnIEltYWdlIEZpbGUgRm9ybWF0IGZvciBJbmZvcm1hdGlvbiBUZWNobm9sb2d5IChncmFwaGljIGFydHMpCisjZGVmaW5lIE1UUF9GT1JNQVRfSlAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwRiAgIC8vIEpQRUcyMDAwIEJhc2VsaW5lIEZpbGUgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfSlBYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgxMCAgIC8vIEpQRUcyMDAwIEV4dGVuZGVkIEZpbGUgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0ZJUk1XQVJFICAgICAgICAgICAgICAgICAgIDB4QjgwMgorI2RlZmluZSBNVFBfRk9STUFUX1dJTkRPV1NfSU1BR0VfRk9STUFUICAgICAgICAgICAgICAgICAweEI4ODEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8gICAgICAgICAgICAgICAgICAgICAgMHhCOTAwCisjZGVmaW5lIE1UUF9GT1JNQVRfV01BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwMQorI2RlZmluZSBNVFBfRk9STUFUX09HRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDIKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTAzCisjZGVmaW5lIE1UUF9GT1JNQVRfQVVESUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwNAorI2RlZmluZSBNVFBfRk9STUFUX0ZMQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDYKKyNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORURfVklERU8gICAgICAgICAgICAgICAgICAgICAgMHhCOTgwCisjZGVmaW5lIE1UUF9GT1JNQVRfV01WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Qjk4MQorI2RlZmluZSBNVFBfRk9STUFUX01QNF9DT05UQUlORVIgICAgICAgICAgICAgICAgICAgICAgICAweEI5ODIgIC8vIElTTyAxNDQ5Ni0xCisjZGVmaW5lIE1UUF9GT1JNQVRfTVAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Qjk4MworI2RlZmluZSBNVFBfRk9STUFUXzNHUF9DT05UQUlORVIgICAgICAgICAgICAgICAgICAgICAgICAweEI5ODQgIC8vIDNHUFAgZmlsZSBmb3JtYXQuIERldGFpbHM6IGh0dHA6Ly93d3cuM2dwcC5vcmcvZnRwL1NwZWNzL2h0bWwtaW5mby8yNjI0NC5odG0gKHBhZ2UgdGl0bGUgLSBcdTIwMWNUcmFuc3BhcmVudCBlbmQtdG8tZW5kIHBhY2tldCBzd2l0Y2hlZCBzdHJlYW1pbmcgc2VydmljZSwgM0dQUCBmaWxlIGZvcm1hdFx1MjAxZCkuCisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0NPTExFQ1RJT04gICAgICAgICAgICAgICAgIDB4QkEwMAorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX01VTFRJTUVESUFfQUxCVU0gICAgICAgICAgICAweEJBMDEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9JTUFHRV9BTEJVTSAgICAgICAgICAgICAgICAgMHhCQTAyCisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQVVESU9fQUxCVU0gICAgICAgICAgICAgICAgIDB4QkEwMworI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX1ZJREVPX0FMQlVNICAgICAgICAgICAgICAgICAweEJBMDQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9BVl9QTEFZTElTVCAgICAgICAgICAgICAgICAgMHhCQTA1CisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQ09OVEFDVF9HUk9VUCAgICAgICAgICAgICAgIDB4QkEwNgorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX01FU1NBR0VfRk9MREVSICAgICAgICAgICAgICAweEJBMDcKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9DSEFQVEVSRURfUFJPRFVDVElPTiAgICAgICAgMHhCQTA4CisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQVVESU9fUExBWUxJU1QgICAgICAgICAgICAgIDB4QkEwOQorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX1ZJREVPX1BMQVlMSVNUICAgICAgICAgICAgICAweEJBMEEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9NRURJQUNBU1QgICAgICAgICAgICAgICAgICAgMHhCQTBCIC8vIEZvciB1c2Ugd2l0aCBtZWRpYWNhc3RzOyByZWZlcmVuY2VzIG11bHRpbWVkaWEgZW5jbG9zdXJlcyBvZiBSU1MgZmVlZHMgb3IgZXBpc29kaWMgY29udGVudAorI2RlZmluZSBNVFBfRk9STUFUX1dQTF9QTEFZTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAweEJBMTAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NM1VfUExBWUxJU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQTExCisjZGVmaW5lIE1UUF9GT1JNQVRfTVBMX1BMQVlMSVNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkExMgorI2RlZmluZSBNVFBfRk9STUFUX0FTWF9QTEFZTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAweEJBMTMKKyNkZWZpbmUgTVRQX0ZPUk1BVF9QTFNfUExBWUxJU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQTE0CisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0RPQ1VNRU5UICAgICAgICAgICAgICAgICAgIDB4QkE4MAorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX0RPQ1VNRU5UICAgICAgICAgICAgICAgICAgICAweEJBODEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9YTUxfRE9DVU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQTgyCisjZGVmaW5lIE1UUF9GT1JNQVRfTVNfV09SRF9ET0NVTUVOVCAgICAgICAgICAgICAgICAgICAgIDB4QkE4MworI2RlZmluZSBNVFBfRk9STUFUX01IVF9DT01QSUxFRF9IVE1MX0RPQ1VNRU5UICAgICAgICAgICAweEJBODQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NU19FWENFTF9TUFJFQURTSEVFVCAgICAgICAgICAgICAgICAgMHhCQTg1CisjZGVmaW5lIE1UUF9GT1JNQVRfTVNfUE9XRVJQT0lOVF9QUkVTRU5UQVRJT04gICAgICAgICAgIDB4QkE4NgorI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRF9NRVNTQUdFICAgICAgICAgICAgICAgICAgICAweEJCMDAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9NRVNTU0FHRSAgICAgICAgICAgICAgICAgICAgMHhCQjAxCisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0NPTlRBQ1QgICAgICAgICAgICAgICAgICAgIDB4QkI4MAorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX0NPTlRBQ1QgICAgICAgICAgICAgICAgICAgICAweEJCODEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9WQ0FSRF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQjgyCisKKy8vIE1UUCBPYmplY3QgUHJvcGVydHkgQ29kZXMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NUT1JBR0VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzAyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QUk9URUNUSU9OX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAweERDMDMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09CSkVDVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwNAorI2RlZmluZSBNVFBfUFJPUEVSVFlfQVNTT0NJQVRJT05fVFlQRSAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BU1NPQ0lBVElPTl9ERVNDICAgICAgICAgICAgICAgICAgICAgICAweERDMDYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09CSkVDVF9GSUxFX05BTUUgICAgICAgICAgICAgICAgICAgICAgIDB4REMwNworI2RlZmluZSBNVFBfUFJPUEVSVFlfREFURV9DUkVBVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA4CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9EQVRFX01PRElGSUVEICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0tFWVdPUkRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwQQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEFSRU5UX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzBCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BTExPV0VEX0ZPTERFUl9DT05URU5UUyAgICAgICAgICAgICAgICAweERDMEMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0hJRERFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwRAorI2RlZmluZSBNVFBfUFJPUEVSVFlfU1lTVEVNX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzBFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QRVJTSVNURU5UX1VJRCAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NZTkNfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0MgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUFJPUEVSVFlfQkFHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0NSRUFURURfQlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0NQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQVJUSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9EQVRFX0FVVEhPUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0RFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0OAorI2RlZmluZSBNVFBfUFJPUEVSVFlfVVJMX1JFRkVSRU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9MQU5HVUFHRV9MT0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAweERDNEEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0NPUFlSSUdIVF9JTkZPUk1BVElPTiAgICAgICAgICAgICAgICAgIDB4REM0QgorI2RlZmluZSBNVFBfUFJPUEVSVFlfU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9PUklHSU5fTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAweERDNEQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0RBVEVfQURERUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0RQorI2RlZmluZSBNVFBfUFJPUEVSVFlfTk9OX0NPTlNVTUFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRGCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9DT1JSVVBUX1VOUExBWUFCTEUgICAgICAgICAgICAgICAgICAgICAweERDNTAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BST0RVQ0VSX1NFUklBTF9OVU1CRVIgICAgICAgICAgICAgICAgIDB4REM1MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0ZPUk1BVCAgICAgICAgICAgMHhEQzgxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfU0laRSAgICAgICAgICAgICAweERDODIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9IRUlHSFQgICAgICAgICAgIDB4REM4MworI2RlZmluZSBNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX1dJRFRIICAgICAgICAgICAgMHhEQzg0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfRFVSQVRJT04gICAgICAgICAweERDODUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9EQVRBICAgICAgICAgICAgIDB4REM4NgorI2RlZmluZSBNVFBfUFJPUEVSVFlfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzg3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9IRUlHSFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDODgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0RVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4OQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUkFUSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9UUkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0dFTlJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4QworI2RlZmluZSBNVFBfUFJPUEVSVFlfQ1JFRElUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9MWVJJQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NVQlNDUklQVElPTl9DT05URU5UX0lEICAgICAgICAgICAgICAgIDB4REM4RgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUFJPRFVDRURfQlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzkwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9VU0VfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NLSVBfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5MgorI2RlZmluZSBNVFBfUFJPUEVSVFlfTEFTVF9BQ0NFU1NFRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzkzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QQVJFTlRBTF9SQVRJTkcgICAgICAgICAgICAgICAgICAgICAgICAweERDOTQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01FVEFfR0VOUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5NQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQ09NUE9TRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FRkZFQ1RJVkVfUkFUSU5HICAgICAgICAgICAgICAgICAgICAgICAweERDOTcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NVQlRJVExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5OAorI2RlZmluZSBNVFBfUFJPUEVSVFlfT1JJR0lOQUxfUkVMRUFTRV9EQVRFICAgICAgICAgICAgICAgICAgMHhEQzk5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BTEJVTV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOUEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FMQlVNX0FSVElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5QgorI2RlZmluZSBNVFBfUFJPUEVSVFlfTU9PRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9EUk1fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOUQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NVQl9ERVNDUklQVElPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5RQorI2RlZmluZSBNVFBfUFJPUEVSVFlfSVNfQ1JPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0QxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9JU19DT0xPVVJfQ09SUkVDVEVEICAgICAgICAgICAgICAgICAgICAweERDRDIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0lNQUdFX0JJVF9ERVBUSCAgICAgICAgICAgICAgICAgICAgICAgIDB4RENEMworI2RlZmluZSBNVFBfUFJPUEVSVFlfRl9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0Q0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FWFBPU1VSRV9USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRDUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VYUE9TVVJFX0lOREVYICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENENgorI2RlZmluZSBNVFBfUFJPUEVSVFlfVE9UQUxfQklUUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTkxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9CSVRSQVRFX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOTIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NBTVBMRV9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5MworI2RlZmluZSBNVFBfUFJPUEVSVFlfTlVNQkVSX09GX0NIQU5ORUxTICAgICAgICAgICAgICAgICAgICAgMHhERTk0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BVURJT19CSVRfREVQVEggICAgICAgICAgICAgICAgICAgICAgICAweERFOTUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NDQU5fVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5NworI2RlZmluZSBNVFBfUFJPUEVSVFlfQVVESU9fV0FWRV9DT0RFQyAgICAgICAgICAgICAgICAgICAgICAgMHhERTk5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BVURJT19CSVRSQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOUEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1ZJREVPX0ZPVVJDQ19DT0RFQyAgICAgICAgICAgICAgICAgICAgIDB4REU5QgorI2RlZmluZSBNVFBfUFJPUEVSVFlfVklERU9fQklUUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTlDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9GUkFNRVNfUEVSX1RIT1VTQU5EX1NFQ09ORFMgICAgICAgICAgICAweERFOUQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0tFWUZSQU1FX0RJU1RBTkNFICAgICAgICAgICAgICAgICAgICAgIDB4REU5RQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTlGCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTkNPRElOR19RVUFMSVRZICAgICAgICAgICAgICAgICAgICAgICAweERFQTAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VOQ09ESU5HX1BST0ZJTEUgICAgICAgICAgICAgICAgICAgICAgIDB4REVBMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfRElTUExBWV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0UwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9CT0RZX1RFWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRTEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NVQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENFMgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUFJJT1JJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0UzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9HSVZFTl9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01JRERMRV9OQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfRkFNSUxZX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDAyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QUkVGSVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NVRkZJWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwNAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVUSUNfR0lWRU5fTkFNRSAgICAgICAgICAgICAgICAgICAgMHhERDA1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORVRJQ19GQU1JTFlfTkFNRSAgICAgICAgICAgICAgICAgICAweEREMDYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VNQUlMX1BSSU1BUlkgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwNworI2RlZmluZSBNVFBfUFJPUEVSVFlfRU1BSUxfUEVSU09OQUxfMSAgICAgICAgICAgICAgICAgICAgICAgMHhERDA4CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTUFJTF9QRVJTT05BTF8yICAgICAgICAgICAgICAgICAgICAgICAweEREMDkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VNQUlMX0JVU0lORVNTXzEgICAgICAgICAgICAgICAgICAgICAgIDB4REQwQQorI2RlZmluZSBNVFBfUFJPUEVSVFlfRU1BSUxfQlVTSU5FU1NfMiAgICAgICAgICAgICAgICAgICAgICAgMHhERDBCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTUFJTF9PVEhFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMEMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9QUklNQVJZICAgICAgICAgICAgICAgICAgIDB4REQwRAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX1BFUlNPTkFMICAgICAgICAgICAgICAgICAgMHhERDBFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfUEVSU09OQUxfMiAgICAgICAgICAgICAgICAweEREMEYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9CVVNJTkVTUyAgICAgICAgICAgICAgICAgIDB4REQxMAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX0JVU0lORVNTXzIgICAgICAgICAgICAgICAgMHhERDExCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfTU9CSUxFICAgICAgICAgICAgICAgICAgICAweEREMTIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9NT0JJTEVfMiAgICAgICAgICAgICAgICAgIDB4REQxMworI2RlZmluZSBNVFBfUFJPUEVSVFlfRkFYX05VTUJFUl9QUklNQVJZICAgICAgICAgICAgICAgICAgICAgMHhERDE0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9GQVhfTlVNQkVSX1BFUlNPTkFMICAgICAgICAgICAgICAgICAgICAweEREMTUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0ZBWF9OVU1CRVJfQlVTSU5FU1MgICAgICAgICAgICAgICAgICAgIDB4REQxNgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEFHRVJfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDE3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfT1RIRVJTICAgICAgICAgICAgICAgICAgICAweEREMTgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BSSU1BUllfV0VCX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4REQxOQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEVSU09OQUxfV0VCX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMHhERDFBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9CVVNJTkVTU19XRUJfQUREUkVTUyAgICAgICAgICAgICAgICAgICAweEREMUIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0lOU1RBTlRfTUVTU0FOR0VSX0FERFJFU1MgICAgICAgICAgICAgIDB4REQxQworI2RlZmluZSBNVFBfUFJPUEVSVFlfSU5TVEFOVF9NRVNTQU5HRVJfQUREUkVTU18yICAgICAgICAgICAgMHhERDFECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTXzMgICAgICAgICAgICAweEREMUUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0ZVTEwgICAgICAgICAgIDB4REQxRgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfTElORV8xICAgICAgICAgMHhERDIwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9MSU5FXzIgICAgICAgICAweEREMjEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0NJVFkgICAgICAgICAgIDB4REQyMgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfUkVHSU9OICAgICAgICAgMHhERDIzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9QT1NUQUxfQ09ERSAgICAweEREMjQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0NPVU5UUlkgICAgICAgIDB4REQyNQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfRlVMTCAgICAgICAgICAgMHhERDI2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19MSU5FXzEgICAgICAgICAweEREMjcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0xJTkVfMiAgICAgICAgIDB4REQyOAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfQ0lUWSAgICAgICAgICAgMHhERDI5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19SRUdJT04gICAgICAgICAweEREMkEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX1BPU1RBTF9DT0RFICAgIDB4REQyQgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfQ09VTlRSWSAgICAgICAgMHhERDJDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9GVUxMICAgICAgICAgICAgICAweEREMkQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0xJTkVfMSAgICAgICAgICAgIDB4REQyRQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfTElORV8yICAgICAgICAgICAgMHhERDJGCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9DSVRZICAgICAgICAgICAgICAweEREMzAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX1JFR0lPTiAgICAgICAgICAgIDB4REQzMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfUE9TVEFMX0NPREUgICAgICAgMHhERDMyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9DT1VOVFJZICAgICAgICAgICAweEREMzMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09SR0FOSVpBVElPTl9OQU1FICAgICAgICAgICAgICAgICAgICAgIDB4REQzNAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVUSUNfT1JHQU5JWkFUSU9OX05BTUUgICAgICAgICAgICAgMHhERDM1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9ST0xFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMzYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0JJUlRIREFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQzNworI2RlZmluZSBNVFBfUFJPUEVSVFlfTUVTU0FHRV9UTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRVNTQUdFX0NDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENDEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01FU1NBR0VfQkNDICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0MgorI2RlZmluZSBNVFBfUFJPUEVSVFlfTUVTU0FHRV9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRVNTQUdFX1JFQ0VJVkVEX1RJTUUgICAgICAgICAgICAgICAgICAweERENDQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01FU1NBR0VfU0VOREVSICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0NQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfQkVHSU5fVElNRSAgICAgICAgICAgICAgICAgICAgMHhERDUwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9FTkRfVElNRSAgICAgICAgICAgICAgICAgICAgICAweERENTEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX0xPQ0FUSU9OICAgICAgICAgICAgICAgICAgICAgIDB4REQ1MgorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfUkVRVUlSRURfQVRURU5ERUVTICAgICAgICAgICAgMHhERDU0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9PUFRJT05BTF9BVFRFTkRFRVMgICAgICAgICAgICAweERENTUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX1JFU09VUkNFUyAgICAgICAgICAgICAgICAgICAgIDB4REQ1NgorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfQUNDRVBURUQgICAgICAgICAgICAgICAgICAgICAgMHhERDU3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9URU5UQVRJVkUgICAgICAgICAgICAgICAgICAgICAweERENTgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX0RFQ0xJTkVEICAgICAgICAgICAgICAgICAgICAgIDB4REQ1OQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfUkVNQUlOREVSX1RJTUUgICAgICAgICAgICAgICAgMHhERDVBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9PV05FUiAgICAgICAgICAgICAgICAgICAgICAgICAweERENUIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1QworI2RlZmluZSBNVFBfUFJPUEVSVFlfT1dORVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FRElUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENUUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1dFQk1BU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1RgorI2RlZmluZSBNVFBfUFJPUEVSVFlfVVJMX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDYwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9VUkxfREVTVElOQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAweERENjEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1RJTUVfQk9PS01BUksgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2MgorI2RlZmluZSBNVFBfUFJPUEVSVFlfT0JKRUNUX0JPT0tNQVJLICAgICAgICAgICAgICAgICAgICAgICAgMHhERDYzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9CWVRFX0JPT0tNQVJLICAgICAgICAgICAgICAgICAgICAgICAgICAweERENjQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0xBU1RfQlVJTERfREFURSAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ3MAorI2RlZmluZSBNVFBfUFJPUEVSVFlfVElNRV9UT19MSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDcxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRURJQV9HVUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENzIKKworLy8gTVRQIERldmljZSBQcm9wZXJ0eSBDb2RlcworI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICAgMHg1MDAwCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfQkFUVEVSWV9MRVZFTCAgICAgICAgICAgICAgICAgICAweDUwMDEKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9GVU5DVElPTkFMX01PREUgICAgICAgICAgICAgICAgIDB4NTAwMgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0lNQUdFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgMHg1MDAzCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfQ09NUFJFU1NJT05fU0VUVElORyAgICAgICAgICAgICAweDUwMDQKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9XSElURV9CQUxBTkNFICAgICAgICAgICAgICAgICAgIDB4NTAwNQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1JHQl9HQUlOICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDA2CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRl9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAweDUwMDcKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9GT0NBTF9MRU5HVEggICAgICAgICAgICAgICAgICAgIDB4NTAwOAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0ZPQ1VTX0RJU1RBTkNFICAgICAgICAgICAgICAgICAgMHg1MDA5CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRk9DVVNfTU9ERSAgICAgICAgICAgICAgICAgICAgICAweDUwMEEKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9NRVRFUklOR19NT0RFICAgICAgICAgIDB4NTAwQgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0ZMQVNIX01PREUgICAgICAgICAgICAgICAgICAgICAgMHg1MDBDCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfVElNRSAgICAgICAgICAgICAgICAgICAweDUwMEQKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9QUk9HUkFNX01PREUgICAgICAgICAgIDB4NTAwRQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX0lOREVYICAgICAgICAgICAgICAgICAgMHg1MDBGCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfQklBU19DT01QRU5TQVRJT04gICAgICAweDUwMTAKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9EQVRFVElNRSAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxMQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0NBUFRVUkVfREVMQVkgICAgICAgICAgICAgICAgICAgMHg1MDEyCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfU1RJTExfQ0FQVFVSRV9NT0RFICAgICAgICAgICAgICAweDUwMTMKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9DT05UUkFTVCAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxNAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1NIQVJQTkVTUyAgICAgICAgICAgICAgICAgICAgICAgMHg1MDE1CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRElHSVRBTF9aT09NICAgICAgICAgICAgICAgICAgICAweDUwMTYKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9FRkZFQ1RfTU9ERSAgICAgICAgICAgICAgICAgICAgIDB4NTAxNworI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0JVUlNUX05VTUJFUiAgICAgICAgICAgICAgICAgICAgMHg1MDE4CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfQlVSU1RfSU5URVJWQUwgICAgICAgICAgICAgICAgICAweDUwMTkKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9USU1FTEFQU0VfTlVNQkVSICAgICAgICAgICAgICAgIDB4NTAxQQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1RJTUVMQVBTRV9JTlRFUlZBTCAgICAgICAgICAgICAgMHg1MDFCCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRk9DVVNfTUVURVJJTkdfTU9ERSAgICAgICAgICAgICAweDUwMUMKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9VUExPQURfVVJMICAgICAgICAgICAgICAgICAgICAgIDB4NTAxRAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0FSVElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDFFCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfQ09QWVJJR0hUX0lORk8gICAgICAgICAgICAgICAgICAweDUwMUYKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9TWU5DSFJPTklaQVRJT05fUEFSVE5FUiAgICAgICAgIDB4RDQwMQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0RFVklDRV9GUklFTkRMWV9OQU1FICAgICAgICAgICAgMHhENDAyCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfVk9MVU1FICAgICAgICAgICAgICAgICAgICAgICAgICAweEQ0MDMKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9TVVBQT1JURURfRk9STUFUU19PUkRFUkVEICAgICAgIDB4RDQwNAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0RFVklDRV9JQ09OICAgICAgICAgICAgICAgICAgICAgMHhENDA1CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfUExBWUJBQ0tfUkFURSAgICAgICAgICAgICAgICAgICAweEQ0MTAKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9QTEFZQkFDS19PQkpFQ1QgICAgICAgICAgICAgICAgIDB4RDQxMQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX0NPTlRBSU5FUl9JTkRFWCAgICAgICAgMHhENDEyCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfU0VTU0lPTl9JTklUSUFUT1JfVkVSU0lPTl9JTkZPICAweEQ0MDYKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9QRVJDRUlWRURfREVWSUNFX1RZUEUgICAgICAgICAgIDB4RDQwNworCisvLyBNVFAgT3BlcmF0aW9uIENvZGVzCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9JTkZPICAgICAgICAgICAgICAgICAgICAgICAweDEwMDEKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9PUEVOX1NFU1NJT04gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0NMT1NFX1NFU1NJT04gICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAzCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSURTICAgICAgICAgICAgICAgICAgICAgICAweDEwMDQKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JTkZPICAgICAgICAgICAgICAgICAgICAgIDB4MTAwNQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9OVU1fT0JKRUNUUyAgICAgICAgICAgICAgICAgICAgICAgMHgxMDA2CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9IQU5ETEVTICAgICAgICAgICAgICAgICAgICAweDEwMDcKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0lORk8gICAgICAgICAgICAgICAgICAgICAgIDB4MTAwOAorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDA5CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX1RIVU1CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMEEKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9ERUxFVEVfT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwQgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk8gICAgICAgICAgICAgICAgICAgICAgMHgxMDBDCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMEQKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9JTklUSUFURV9DQVBUVVJFICAgICAgICAgICAgICAgICAgICAgIDB4MTAwRQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0ZPUk1BVF9TVE9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDBGCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fUkVTRVRfREVWSUNFICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMTAKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9TRUxGX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAxMQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPVEVDVElPTiAgICAgICAgICAgICAgICAgMHgxMDEyCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fUE9XRVJfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMTMKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfREVTQyAgICAgICAgICAgICAgICAgIDB4MTAxNAorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9WQUxVRSAgICAgICAgICAgICAgICAgMHgxMDE1CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0VUX0RFVklDRV9QUk9QX1ZBTFVFICAgICAgICAgICAgICAgICAweDEwMTYKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9SRVNFVF9ERVZJQ0VfUFJPUF9WQUxVRSAgICAgICAgICAgICAgIDB4MTAxNworI2RlZmluZSBNVFBfT1BFUkFUSU9OX1RFUk1JTkFURV9PUEVOX0NBUFRVUkUgICAgICAgICAgICAgICAgMHgxMDE4CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fTU9WRV9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMTkKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9DT1BZX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAxQQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9QQVJUSUFMX09CSkVDVCAgICAgICAgICAgICAgICAgICAgMHgxMDFCCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fSU5JVElBVEVfT1BFTl9DQVBUVVJFICAgICAgICAgICAgICAgICAweDEwMUMKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BTX1NVUFBPUlRFRCAgICAgICAgICAgIDB4OTgwMQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9ERVNDICAgICAgICAgICAgICAgICAgMHg5ODAyCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX1ZBTFVFICAgICAgICAgICAgICAgICAweDk4MDMKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1BfVkFMVUUgICAgICAgICAgICAgICAgIDB4OTgwNAorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUkVGRVJFTkNFUyAgICAgICAgICAgICAgICAgMHg5ODEwCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9SRUZFUkVOQ0VTICAgICAgICAgICAgICAgICAweDk4MTEKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9TS0lQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTgyMAorCisvLyBNVFAgUmVzcG9uc2UgQ29kZXMKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDEKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDIKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDMKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfVFJBTlNBQ1RJT05fSUQgICAgICAgICAgICAgICAgICAgICAweDIwMDQKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAweDIwMDUKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1BBUkFNRVRFUl9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAweDIwMDYKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOQ09NUExFVEVfVFJBTlNGRVIgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDcKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfU1RPUkFHRV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDgKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgICAweDIwMDkKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0RFVklDRV9QUk9QX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAweDIwMEEKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0ZPUk1BVF9DT0RFICAgICAgICAgICAgICAgICAweDIwMEIKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NUT1JBR0VfRlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMEMKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX09CSkVDVF9XUklURV9QUk9URUNURUQgICAgICAgICAgICAgICAgICAgICAweDIwMEQKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NUT1JFX1JFQURfT05MWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMEUKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0FDQ0VTU19ERU5JRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMEYKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX05PX1RIVU1CTkFJTF9QUkVTRU5UICAgICAgICAgICAgICAgICAgICAgICAweDIwMTAKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NFTEZfVEVTVF9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMTEKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1BBUlRJQUxfREVMRVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMTIKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NUT1JFX05PVF9BVkFJTEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAweDIwMTMKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NQRUNJRklDQVRJT05fQllfRk9STUFUX1VOU1VQUE9SVEVEICAgICAgICAweDIwMTQKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX05PX1ZBTElEX09CSkVDVF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAweDIwMTUKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfQ09ERV9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgICAweDIwMTYKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1VOS05PV05fVkVORE9SX0NPREUgICAgICAgICAgICAgICAgICAgICAgICAweDIwMTcKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0NBUFRVUkVfQUxSRUFEWV9URVJNSU5BVEVEICAgICAgICAgICAgICAgICAweDIwMTgKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0RFVklDRV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMTkKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSRU5UX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAweDIwMUEKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfREVWSUNFX1BST1BfRk9STUFUICAgICAgICAgICAgICAgICAweDIwMUIKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfREVWSUNFX1BST1BfVkFMVUUgICAgICAgICAgICAgICAgICAweDIwMUMKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSQU1FVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMUQKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NFU1NJT05fQUxSRUFEWV9PUEVOICAgICAgICAgICAgICAgICAgICAgICAweDIwMUUKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1RSQU5TQUNUSU9OX0NBTkNFTExFRCAgICAgICAgICAgICAgICAgICAgICAweDIwMUYKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NQRUNJRklDQVRJT05fT0ZfREVTVElOQVRJT05fVU5TVVBQT1JURUQgICAweDIwMjAKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX1BST1BfQ09ERSAgICAgICAgICAgICAgICAgICAweEE4MDEKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX1BST1BfRk9STUFUICAgICAgICAgICAgICAgICAweEE4MDIKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX1BST1BfVkFMVUUgICAgICAgICAgICAgICAgICAweEE4MDMKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX1JFRkVSRU5DRSAgICAgICAgICAgICAgICAgICAweEE4MDQKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0dST1VQX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAweEE4MDUKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfREFUQVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEE4MDYKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NQRUNJRklDQVRJT05fQllfR1JPVVBfVU5TVVBQT1JURUQgICAgICAgICAweEE4MDcKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NQRUNJRklDQVRJT05fQllfREVQVEhfVU5TVVBQT1JURUQgICAgICAgICAweEE4MDgKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX09CSkVDVF9UT09fTEFSR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAweEE4MDkKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX09CSkVDVF9QUk9QX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAweEE4MEEKKworLy8gTVRQIEV2ZW50IENvZGVzCisjZGVmaW5lIE1UUF9FVkVOVF9VTkRFRklORUQgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIE1UUF9FVkVOVF9DQU5DRUxfVFJBTlNBQ1RJT04gICAgICAgICAgICAgICAgMHg0MDAxCisjZGVmaW5lIE1UUF9FVkVOVF9PQkpFQ1RfQURERUQgICAgICAgICAgICAgICAgICAgICAgMHg0MDAyCisjZGVmaW5lIE1UUF9FVkVOVF9PQkpFQ1RfUkVNT1ZFRCAgICAgICAgICAgICAgICAgICAgMHg0MDAzCisjZGVmaW5lIE1UUF9FVkVOVF9TVE9SRV9BRERFRCAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA0CisjZGVmaW5lIE1UUF9FVkVOVF9TVE9SRV9SRU1PVkVEICAgICAgICAgICAgICAgICAgICAgMHg0MDA1CisjZGVmaW5lIE1UUF9FVkVOVF9ERVZJQ0VfUFJPUF9DSEFOR0VEICAgICAgICAgICAgICAgMHg0MDA2CisjZGVmaW5lIE1UUF9FVkVOVF9PQkpFQ1RfSU5GT19DSEFOR0VEICAgICAgICAgICAgICAgMHg0MDA3CisjZGVmaW5lIE1UUF9FVkVOVF9ERVZJQ0VfSU5GT19DSEFOR0VEICAgICAgICAgICAgICAgMHg0MDA4CisjZGVmaW5lIE1UUF9FVkVOVF9SRVFVRVNUX09CSkVDVF9UUkFOU0ZFUiAgICAgICAgICAgMHg0MDA5CisjZGVmaW5lIE1UUF9FVkVOVF9TVE9SRV9GVUxMICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDBBCisjZGVmaW5lIE1UUF9FVkVOVF9ERVZJQ0VfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgMHg0MDBCCisjZGVmaW5lIE1UUF9FVkVOVF9TVE9SQUdFX0lORk9fQ0hBTkdFRCAgICAgICAgICAgICAgMHg0MDBDCisjZGVmaW5lIE1UUF9FVkVOVF9DQVBUVVJFX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgMHg0MDBECisjZGVmaW5lIE1UUF9FVkVOVF9VTlJFUE9SVEVEX1NUQVRVUyAgICAgICAgICAgICAgICAgMHg0MDBFCisjZGVmaW5lIE1UUF9FVkVOVF9PQkpFQ1RfUFJPUF9DSEFOR0VEICAgICAgICAgICAgICAgMHhDODAxCisjZGVmaW5lIE1UUF9FVkVOVF9PQkpFQ1RfUFJPUF9ERVNDX0NIQU5HRUQgICAgICAgICAgMHhDODAyCisjZGVmaW5lIE1UUF9FVkVOVF9PQkpFQ1RfUkVGRVJFTkNFU19DSEFOR0VEICAgICAgICAgMHhDODAzCisKKy8vIFN0b3JhZ2UgVHlwZQorI2RlZmluZSBNVFBfU1RPUkFHRV9GSVhFRF9ST00gICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBNVFBfU1RPUkFHRV9SRU1PVkFCTEVfUk9NICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBNVFBfU1RPUkFHRV9GSVhFRF9SQU0gICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBNVFBfU1RPUkFHRV9SRU1PVkFCTEVfUkFNICAgICAgICAgICAgICAgICAgIDB4MDAwNAorCisvLyBTdG9yYWdlIEZpbGUgU3lzdGVtCisjZGVmaW5lIE1UUF9TVE9SQUdFX0ZJTEVTWVNURU1fRkxBVCAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1UUF9TVE9SQUdFX0ZJTEVTWVNURU1fSElFUkFSQ0hJQ0FMICAgICAgICAgMHgwMDAyCisjZGVmaW5lIE1UUF9TVE9SQUdFX0ZJTEVTWVNURU1fRENGICAgICAgICAgICAgICAgICAgMHgwMDAzCisKKy8vIFN0b3JhZ2UgQWNjZXNzIENhcGFiaWxpdHkKKyNkZWZpbmUgTVRQX1NUT1JBR0VfUkVBRF9XUklURSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgTVRQX1NUT1JBR0VfUkVBRF9PTkxZX1dJVEhPVVRfREVMRVRFICAgICAgICAweDAwMDEKKyNkZWZpbmUgTVRQX1NUT1JBR0VfUkVBRF9PTkxZX1dJVEhfREVMRVRFICAgICAgICAgICAweDAwMDIKKworLy8gQXNzb2NpYXRpb24gVHlwZQorI2RlZmluZSBNVFBfQVNTT0NJQVRJT05fVFlQRV9VTkRFRklORUQgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBNVFBfQVNTT0NJQVRJT05fVFlQRV9HRU5FUklDX0ZPTERFUiAgICAgICAgIDB4MDAwMQorCisjZW5kaWYgLy8gX01UUF9ICmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL0FuZHJvaWQubWsgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4MTEyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDEwIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IENhbWVyYUJyb3dzZXIKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFlMGIwMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI4IEBACis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmNhbWVyYWJyb3dzZXIiPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIiAvPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX2xhYmVsIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iQ2FtZXJhQnJvd3NlciIgYW5kcm9pZDpsYWJlbD0iQ2FtZXJhIEJyb3dzZXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlN0b3JhZ2VCcm93c2VyIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJPYmplY3RCcm93c2VyIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJPYmplY3RWaWV3ZXIiIC8+CisKKyAgICAgICAgPHJlY2VpdmVyIGFuZHJvaWQ6bmFtZT0iVXNiUmVjZWl2ZXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuYWN0aW9uLlVTQl9DQU1FUkFfQVRUQUNIRUQiIC8+CisgICAgICAgICAgICAgICAgPGRhdGEgYW5kcm9pZDpzY2hlbWU9ImNvbnRlbnQiLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9yZWNlaXZlcj4KKworICAgIDwvYXBwbGljYXRpb24+CisKKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL2xheW91dC9vYmplY3RfaW5mby54bWwgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2luZm8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMjEwYjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2luZm8ueG1sCkBAIC0wLDAgKzEsMTU3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8VGFibGVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvb2JqZWN0X2luZm8iCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9uYW1lX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25hbWVfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL25hbWUiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3NpemVfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2l6ZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc2l6ZSIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvZm9ybWF0X2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2Zvcm1hdF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvZm9ybWF0IgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYl93aWR0aF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90aHVtYl93aWR0aF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGh1bWJfd2lkdGgiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RodW1iX2hlaWdodF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90aHVtYl9oZWlnaHRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RodW1iX2hlaWdodCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGh1bWJfc2l6ZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90aHVtYl9zaXplX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYl9zaXplIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC93aWR0aF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy93aWR0aF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvd2lkdGgiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2hlaWdodF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9oZWlnaHRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2hlaWdodCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvZGVwdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZGVwdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2RlcHRoIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zZXF1ZW5jZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zZXF1ZW5jZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc2VxdWVuY2UiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2NyZWF0ZWRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvY3JlYXRlZF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvY3JlYXRlZCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbW9kaWZpZWRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbW9kaWZpZWRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21vZGlmaWVkIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9rZXl3b3Jkc19sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9rZXl3b3Jkc19sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQva2V5d29yZHMiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYm5haWwiIC8+CisgICAgPC9UYWJsZVJvdz4KKzwvVGFibGVMYXlvdXQ+CisKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL2xheW91dC9vYmplY3RfbGlzdC54bWwgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2xpc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYzE4YmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2xpc3QueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIgCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCI+CisgICAgCisgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL3RodW1ibmFpbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9uYW1lIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL21lbnUvb2JqZWN0X21lbnUueG1sIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvbWVudS9vYmplY3RfbWVudS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4NjVmMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL21lbnUvb2JqZWN0X21lbnUueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtZW51IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL3NhdmUiCisgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvc2F2ZV9pdGVtIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvZGVsZXRlIgorICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2RlbGV0ZV9pdGVtIiAvPgorPC9tZW51PgpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNDc3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9sYWJlbCI+Q2FtZXJhIEJyb3dzZXI8L3N0cmluZz4KKworICAgIDwhLS0gZm9yIG9iamVjdCBpbmZvIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibmFtZV9sYWJlbCI+TmFtZTogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzaXplX2xhYmVsIj5TaXplOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZvcm1hdF9sYWJlbCI+Rm9ybWF0OiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRodW1iX3dpZHRoX2xhYmVsIj5UaHVtYiBXaWR0aDogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aHVtYl9oZWlnaHRfbGFiZWwiPlRodW1iIEhlaWdodDogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aHVtYl9zaXplX2xhYmVsIj5UaHVtYiBTaXplOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9IndpZHRoX2xhYmVsIj5XaWR0aDogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJoZWlnaHRfbGFiZWwiPkhlaWdodDogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZXB0aF9sYWJlbCI+RGVwdGg6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VxdWVuY2VfbGFiZWwiPlNlcXVlbmNlOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNyZWF0ZWRfbGFiZWwiPkNyZWF0ZWQ6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9kaWZpZWRfbGFiZWwiPk1vZGlmaWVkOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleXdvcmRzX2xhYmVsIj5LZXl3b3JkczogPC9zdHJpbmc+CisKKyAgICA8IS0tIG1lbnUgaXRlbXMgLS0+CisgICAgPHN0cmluZyBuYW1lPSJzYXZlX2l0ZW0iPlNhdmU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9pdGVtIj5EZWxldGU8L3N0cmluZz4KKworICAgIDwhLS0gdG9hc3RzIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ib2JqZWN0X3NhdmVkX21lc3NhZ2UiPk9iamVjdCBzYXZlZDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9mYWlsZWRfbWVzc2FnZSI+Q291bGQgbm90IHNhdmUgb2JqZWN0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJvYmplY3RfZGVsZXRlZF9tZXNzYWdlIj5PYmplY3QgZGVsZXRlZDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2ZhaWxlZF9tZXNzYWdlIj5Db3VsZCBub3QgZGVsZXRlIG9iamVjdDwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvdmFsdWVzL3N0eWxlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg2OTk4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPHN0eWxlIG5hbWU9ImluZm9fbGFiZWwiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTRzcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ1JpZ2h0Ij40ZGlwPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iaW5mb192YWx1ZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+d3JhcF9jb250ZW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+d3JhcF9jb250ZW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNHNwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL0NhbWVyYUJyb3dzZXIuamF2YSBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvQ2FtZXJhQnJvd3Nlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNDg3M2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL0NhbWVyYUJyb3dzZXIuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY2FtZXJhYnJvd3NlcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk10cDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNpbXBsZUN1cnNvckFkYXB0ZXI7CisKKyAvKioKKyAqIEEgbGlzdCB2aWV3IGRpc3BsYXlpbmcgYWxsIGNvbm5lY3RlZCBjYW1lcmFzLgorICovCitwdWJsaWMgY2xhc3MgQ2FtZXJhQnJvd3NlciBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNhbWVyYUJyb3dzZXIiOworCisgICAgcHJpdmF0ZSBMaXN0QWRhcHRlciBtQWRhcHRlcjsKKyAgICBwcml2YXRlIENvbnRlbnRSZXNvbHZlciBtUmVzb2x2ZXI7CisgICAgcHJpdmF0ZSBEZXZpY2VPYnNlcnZlciBtRGV2aWNlT2JzZXJ2ZXI7CisgICAgcHJpdmF0ZSBDdXJzb3IgbUN1cnNvcjsKKworICAgIHByaXZhdGUgY2xhc3MgRGV2aWNlT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgeworICAgICAgICBEZXZpY2VPYnNlcnZlcihIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKGhhbmRsZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKGJvb2xlYW4gc2VsZkNoYW5nZSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGV2aWNlT2JzZXJ2ZXIub25DaGFuZ2UiKTsKKyAgICAgICAgICAgIGlmIChtQ3Vyc29yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ3Vyc29yLnJlcXVlcnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFVklDRV9DT0xVTU5TID0KKyAgICAgICAgIG5ldyBTdHJpbmdbXSB7IE10cC5EZXZpY2UuX0lELCBNdHAuRGV2aWNlLk1BTlVGQUNUVVJFUiwgTXRwLkRldmljZS5NT0RFTCB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBtUmVzb2x2ZXIgPSBnZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgbURldmljZU9ic2VydmVyID0gbmV3IERldmljZU9ic2VydmVyKG5ldyBIYW5kbGVyKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworCisgICAgICAgIEN1cnNvciBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoTXRwLkRldmljZS5DT05URU5UX1VSSSwKKyAgICAgICAgICAgICAgICBERVZJQ0VfQ09MVU1OUywgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIExvZy5kKFRBRywgInF1ZXJ5IHJldHVybmVkICIgKyBjKTsKKyAgICAgICAgc3RhcnRNYW5hZ2luZ0N1cnNvcihjKTsKKyAgICAgICAgbUN1cnNvciA9IGM7CisKKyAgICAgICAgLy8gTWFwIEN1cnNvciBjb2x1bW5zIHRvIHZpZXdzIGRlZmluZWQgaW4gc2ltcGxlX2xpc3RfaXRlbV8yLnhtbAorICAgICAgICBtQWRhcHRlciA9IG5ldyBTaW1wbGVDdXJzb3JBZGFwdGVyKHRoaXMsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzIsIGMsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBNdHAuRGV2aWNlLk1BTlVGQUNUVVJFUiwgTXRwLkRldmljZS5NT0RFTCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGludFtdIHsgYW5kcm9pZC5SLmlkLnRleHQxLCBhbmRyb2lkLlIuaWQudGV4dDIgfSk7CisgICAgICAgIHNldExpc3RBZGFwdGVyKG1BZGFwdGVyKTsKKworICAgICAgICAvLyByZWdpc3RlciBmb3IgY2hhbmdlcyB0byB0aGUgZGV2aWNlIGxpc3QKKyAgICAgICAgbVJlc29sdmVyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKE10cC5EZXZpY2UuQ09OVEVOVF9VUkksIHRydWUsIG1EZXZpY2VPYnNlcnZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtUmVzb2x2ZXIudW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtRGV2aWNlT2JzZXJ2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGlzdEl0ZW1DbGljayhMaXN0VmlldyBsLCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBTdG9yYWdlQnJvd3Nlci5jbGFzcyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYSgiZGV2aWNlIiwgKGludCltQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKKyAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvT2JqZWN0QnJvd3Nlci5qYXZhIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9PYmplY3RCcm93c2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzNGZkNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvT2JqZWN0QnJvd3Nlci5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jYW1lcmFicm93c2VyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTXRwQ29uc3RhbnRzOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk10cDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZXNvdXJjZUN1cnNvckFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKKyAvKioKKyAqIEEgbGlzdCB2aWV3IGRpc3BsYXlpbmcgYWxsIG9iamVjdHMgd2l0aGluIGEgY29udGFpbmVyIChmb2xkZXIgb3Igc3RvcmFnZSB1bml0KS4KKyAqLworcHVibGljIGNsYXNzIE9iamVjdEJyb3dzZXIgZXh0ZW5kcyBMaXN0QWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJPYmplY3RCcm93c2VyIjsKKworICAgIHByaXZhdGUgQ3Vyc29yIG1DdXJzb3I7CisgICAgcHJpdmF0ZSBPYmplY3RDdXJzb3JBZGFwdGVyIG1BZGFwdGVyOworICAgIHByaXZhdGUgaW50IG1EZXZpY2VJRDsKKyAgICBwcml2YXRlIGxvbmcgbVN0b3JhZ2VJRDsKKyAgICBwcml2YXRlIGxvbmcgbU9iamVjdElEOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gT0JKRUNUX0NPTFVNTlMgPQorICAgICAgICBuZXcgU3RyaW5nW10geyBNdHAuT2JqZWN0Ll9JRCwgTXRwLk9iamVjdC5OQU1FLCBNdHAuT2JqZWN0LkZPUk1BVCwgTXRwLk9iamVjdC5USFVNQiB9OworCisgICAgc3RhdGljIGZpbmFsIGludCBJRF9DT0xVTU4gPSAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9DT0xVTU4gPSAxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0NPTFVNTiA9IDI7CisgICAgc3RhdGljIGZpbmFsIGludCBUSFVNQl9DT0xVTU4gPSAzOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworCisgICAgICAgIG1EZXZpY2VJRCA9IGdldEludGVudCgpLmdldEludEV4dHJhKCJkZXZpY2UiLCAwKTsKKyAgICAgICAgbVN0b3JhZ2VJRCA9IGdldEludGVudCgpLmdldExvbmdFeHRyYSgic3RvcmFnZSIsIDApOworICAgICAgICBtT2JqZWN0SUQgPSBnZXRJbnRlbnQoKS5nZXRMb25nRXh0cmEoIm9iamVjdCIsIDApOworICAgICAgICBpZiAobURldmljZUlEICE9IDAgJiYgbVN0b3JhZ2VJRCAhPSAwKSB7CisgICAgICAgICAgICBDdXJzb3IgYzsKKyAgICAgICAgICAgIFVyaSB1cmk7CisgICAgICAgICAgICBpZiAobU9iamVjdElEID09IDApIHsKKyAgICAgICAgICAgICAgICB1cmkgPSBNdHAuT2JqZWN0LmdldENvbnRlbnRVcmlGb3JTdG9yYWdlQ2hpbGRyZW4obURldmljZUlELCBtU3RvcmFnZUlEKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdXJpID0gTXRwLk9iamVjdC5nZXRDb250ZW50VXJpRm9yT2JqZWN0Q2hpbGRyZW4obURldmljZUlELCBtT2JqZWN0SUQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTG9nLmQoVEFHLCAicXVlcnkgIiArIHVyaSk7CisgICAgICAgICAgICBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkodXJpLCBPQkpFQ1RfQ09MVU1OUywgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBzdGFydE1hbmFnaW5nQ3Vyc29yKGMpOworICAgICAgICAgICAgbUN1cnNvciA9IGM7CisKKyAgICAgICAgICAgIC8vIE1hcCBDdXJzb3IgY29sdW1ucyB0byB2aWV3cyBkZWZpbmVkIGluIHNpbXBsZV9saXN0X2l0ZW1fMS54bWwKKyAgICAgICAgICAgIG1BZGFwdGVyID0gbmV3IE9iamVjdEN1cnNvckFkYXB0ZXIodGhpcywgYyk7CisgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgbG9uZyByb3dJRCA9IG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbik7CisgICAgICAgIEN1cnNvciBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LmdldENvbnRlbnRVcmkobURldmljZUlELCByb3dJRCksCisgICAgICAgICAgICAgICAgICAgICAgICBPQkpFQ1RfQ09MVU1OUywgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIExvZy5kKFRBRywgInF1ZXJ5IHJldHVybmVkICIgKyBjICsgIiBjb3VudDogIiArIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIGxvbmcgZm9ybWF0ID0gMDsKKyAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLmdldENvdW50KCkgPT0gMSkgeworICAgICAgICAgICAgYy5tb3ZlVG9GaXJzdCgpOworICAgICAgICAgICAgbG9uZyByb3dJZCA9IGMuZ2V0TG9uZyhJRF9DT0xVTU4pOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBjLmdldFN0cmluZyhOQU1FX0NPTFVNTik7CisgICAgICAgICAgICBmb3JtYXQgPSBjLmdldExvbmcoRk9STUFUX0NPTFVNTik7CisgICAgICAgICAgICBMb2cuZChUQUcsICJyb3dJZDogIiArIHJvd0lkICsgIiBuYW1lOiAiICsgbmFtZSArICIgZm9ybWF0OiAiICsgZm9ybWF0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0ID09IE10cENvbnN0YW50cy5GT1JNQVRfQVNTT0NJQVRJT04pIHsKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KHRoaXMsIE9iamVjdEJyb3dzZXIuY2xhc3MpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJkZXZpY2UiLCBtRGV2aWNlSUQpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJzdG9yYWdlIiwgbVN0b3JhZ2VJRCk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoIm9iamVjdCIsIHJvd0lEKTsKKyAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KHRoaXMsIE9iamVjdFZpZXdlci5jbGFzcyk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoImRldmljZSIsIG1EZXZpY2VJRCk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoInN0b3JhZ2UiLCBtU3RvcmFnZUlEKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgib2JqZWN0Iiwgcm93SUQpOworICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBPYmplY3RDdXJzb3JBZGFwdGVyIGV4dGVuZHMgUmVzb3VyY2VDdXJzb3JBZGFwdGVyIHsKKworICAgICAgICBwdWJsaWMgT2JqZWN0Q3Vyc29yQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvciBjKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBSLmxheW91dC5vYmplY3RfbGlzdCwgYyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYmluZFZpZXcoVmlldyB2aWV3LCBDb250ZXh0IGNvbnRleHQsIEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgICAgIEltYWdlVmlldyB0aHVtYlZpZXcgPSAoSW1hZ2VWaWV3KXZpZXcuZmluZFZpZXdCeUlkKFIuaWQudGh1bWJuYWlsKTsKKyAgICAgICAgICAgIFRleHRWaWV3IG5hbWVWaWV3ID0gKFRleHRWaWV3KXZpZXcuZmluZFZpZXdCeUlkKFIuaWQubmFtZSk7CisKKyAgICAgICAgICAgIC8vIGdldCB0aGUgdGh1bWJuYWlsCisgICAgICAgICAgICBieXRlW10gdGh1bWJuYWlsID0gY3Vyc29yLmdldEJsb2IoVEhVTUJfQ09MVU1OKTsKKyAgICAgICAgICAgIGlmICh0aHVtYm5haWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUJ5dGVBcnJheSh0aHVtYm5haWwsIDAsIHRodW1ibmFpbC5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHVtYlZpZXcuc2V0SW1hZ2VCaXRtYXAoYml0bWFwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGdldCB0aGUgbmFtZQorICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBjdXJzb3IuZ2V0U3RyaW5nKE5BTUVfQ09MVU1OKTsKKyAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYW1lVmlldy5zZXRUZXh0KG5hbWUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9PYmplY3RWaWV3ZXIuamF2YSBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvT2JqZWN0Vmlld2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYyZjk4ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvT2JqZWN0Vmlld2VyLmphdmEKQEAgLTAsMCArMSwyNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jYW1lcmFicm93c2VyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5GaWxlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCisvKioKKyAqIEEgdmlldyB0byBkaXNwbGF5IHRoZSBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdC4KKyAqLworcHVibGljIGNsYXNzIE9iamVjdFZpZXdlciBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiT2JqZWN0Vmlld2VyIjsKKworICAgIHByaXZhdGUgaW50IG1EZXZpY2VJRDsKKyAgICBwcml2YXRlIGxvbmcgbVN0b3JhZ2VJRDsKKyAgICBwcml2YXRlIGxvbmcgbU9iamVjdElEOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gT0JKRUNUX0NPTFVNTlMgPQorICAgICAgICBuZXcgU3RyaW5nW10geyAgTXRwLk9iamVjdC5fSUQsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0Lk5BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LlNJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LlRIVU1CX1dJRFRILAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5USFVNQl9IRUlHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LlRIVU1CX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LklNQUdFX1dJRFRILAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5JTUFHRV9IRUlHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LklNQUdFX0RFUFRILAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5TRVFVRU5DRV9OVU1CRVIsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LkRBVEVfQ1JFQVRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuREFURV9NT0RJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuS0VZV09SRFMsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LlRIVU1CLAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5GT1JNQVQsCisgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm9iamVjdF9pbmZvKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKworICAgICAgICBtRGV2aWNlSUQgPSBnZXRJbnRlbnQoKS5nZXRJbnRFeHRyYSgiZGV2aWNlIiwgMCk7CisgICAgICAgIG1TdG9yYWdlSUQgPSBnZXRJbnRlbnQoKS5nZXRMb25nRXh0cmEoInN0b3JhZ2UiLCAwKTsKKyAgICAgICAgbU9iamVjdElEID0gZ2V0SW50ZW50KCkuZ2V0TG9uZ0V4dHJhKCJvYmplY3QiLCAwKTsKKworICAgICAgICBpZiAobURldmljZUlEICE9IDAgJiYgbU9iamVjdElEICE9IDApIHsKKyAgICAgICAgQ3Vyc29yIGMgPSBnZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuZ2V0Q29udGVudFVyaShtRGV2aWNlSUQsIG1PYmplY3RJRCksCisgICAgICAgICAgICAgICAgICAgICAgICBPQkpFQ1RfQ09MVU1OUywgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBjLm1vdmVUb0ZpcnN0KCk7CisgICAgICAgICAgICBUZXh0VmlldyB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLm5hbWUpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KGMuZ2V0U3RyaW5nKDEpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc2l6ZSk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoTG9uZy50b1N0cmluZyhjLmdldExvbmcoMikpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQudGh1bWJfd2lkdGgpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDMpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnRodW1iX2hlaWdodCk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoTG9uZy50b1N0cmluZyhjLmdldExvbmcoNCkpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQudGh1bWJfc2l6ZSk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoTG9uZy50b1N0cmluZyhjLmdldExvbmcoNSkpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQud2lkdGgpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDYpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLmhlaWdodCk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoTG9uZy50b1N0cmluZyhjLmdldExvbmcoNykpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuZGVwdGgpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDgpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnNlcXVlbmNlKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZyg5KSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5jcmVhdGVkKTsKKyAgICAgICAgICAgIERhdGUgZGF0ZSA9IG5ldyBEYXRlKGMuZ2V0TG9uZygxMCkgKiAxMDAwKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChkYXRlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5tb2RpZmllZCk7CisgICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoYy5nZXRMb25nKDExKSAqIDEwMDApOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KGRhdGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLmtleXdvcmRzKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChjLmdldFN0cmluZygxMikpOworICAgICAgICAgICAgYnl0ZVtdIHRodW1ibmFpbCA9IGMuZ2V0QmxvYigxMyk7CisgICAgICAgICAgICBpZiAodGh1bWJuYWlsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBJbWFnZVZpZXcgdGh1bWJWaWV3ID0gKEltYWdlVmlldylmaW5kVmlld0J5SWQoUi5pZC50aHVtYm5haWwpOworICAgICAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUJ5dGVBcnJheSh0aHVtYm5haWwsIDAsIHRodW1ibmFpbC5sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHVtYlZpZXcuc2V0SW1hZ2VCaXRtYXAoYml0bWFwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLmZvcm1hdCk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoTG9uZy50b0hleFN0cmluZyhjLmdldExvbmcoMTQpKS50b1VwcGVyQ2FzZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgICAgICAgIE1lbnVJbmZsYXRlciBpbmZsYXRlciA9IGdldE1lbnVJbmZsYXRlcigpOworICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubWVudS5vYmplY3RfbWVudSwgbWVudSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworICAgICAgICBNZW51SXRlbSBpdGVtID0gbWVudS5maW5kSXRlbShSLmlkLnNhdmUpOworICAgICAgICBpdGVtLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIGl0ZW0gPSBtZW51LmZpbmRJdGVtKFIuaWQuZGVsZXRlKTsKKyAgICAgICAgaXRlbS5zZXRFbmFibGVkKHRydWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBzd2l0Y2ggKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKKyAgICAgICAgICAgIGNhc2UgUi5pZC5zYXZlOgorICAgICAgICAgICAgICAgIHNhdmUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgUi5pZC5kZWxldGU6CisgICAgICAgICAgICAgICAgZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUaW1lc3RhbXAoKSB7CisgICAgICAgIENhbGVuZGFyIGMgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworICAgICAgICBjLnNldFRpbWVJbk1pbGxpcyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIldFktJXRtLSV0ZC0ldEgtJXRNLSV0UyIsIGMsIGMsIGMsIGMsIGMsIGMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzYXZlKCkgeworICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgVXJpIHVyaSA9IE10cC5PYmplY3QuZ2V0Q29udGVudFVyaShtRGV2aWNlSUQsIG1PYmplY3RJRCk7CisgICAgICAgIEZpbGUgZGVzdEZpbGUgPSBudWxsOworICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQgPSBudWxsOworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwZmQgPSBnZXRDb250ZW50UmVzb2x2ZXIoKS5vcGVuRmlsZURlc2NyaXB0b3IodXJpLCAiciIpOworICAgICAgICAgICAgTG9nLmQoVEFHLCAic2F2ZSBnb3QgcGZkICIgKyBwZmQpOworICAgICAgICAgICAgaWYgKHBmZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic2F2ZSBnb3QgZmlzICIgKyBmaXMpOworICAgICAgICAgICAgICAgIEZpbGUgZGVzdERpciA9IEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZVB1YmxpY0RpcmVjdG9yeSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEVudmlyb25tZW50LkRJUkVDVE9SWV9EQ0lNKTsKKyAgICAgICAgICAgICAgICBkZXN0RGlyLm1rZGlycygpOworICAgICAgICAgICAgICAgIGRlc3RGaWxlID0gbmV3IEZpbGUoZGVzdERpciwgIkNhbWVyYUJyb3dzZXItIiArIGdldFRpbWVzdGFtcCgpICsgIi5qcGVnIik7CisKKworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInNhdmUgZ290IGRlc3RGaWxlICIgKyBkZXN0RmlsZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZGVzdEZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzdEZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RGaWxlKTsKKworICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs2NTUzNl07CisgICAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGJ5dGVzUmVhZCA9IGZpcy5yZWFkKGJ1ZmZlcikpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9zLndyaXRlKGJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCB1bnRpbCB3ZSBzdHJhaWdodGVuIG91dCBwZXJtaXNzaW9ucyBpbiAvZGF0YS9tZWRpYQorICAgICAgICAgICAgICAgIEZpbGVVdGlscy5zZXRQZXJtaXNzaW9ucyhkZXN0RGlyLmdldFBhdGgoKSwgMDc3NSwgUHJvY2Vzcy5teVVpZCgpLCBQcm9jZXNzLlNEQ0FSRF9SV19HSUQpOworICAgICAgICAgICAgICAgIEZpbGVVdGlscy5zZXRQZXJtaXNzaW9ucyhkZXN0RmlsZS5nZXRQYXRoKCksIDA2NjQsIFByb2Nlc3MubXlVaWQoKSwgUHJvY2Vzcy5TRENBUkRfUldfR0lEKTsKKworICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIGluIE9iamVjdFZpZXcuc2F2ZSIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGZpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZm9zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwZmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHBmZC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fTUVESUFfU0NBTk5FUl9TQ0FOX0ZJTEUpOworICAgICAgICAgICAgaW50ZW50LnNldERhdGEoVXJpLmZyb21GaWxlKGRlc3RGaWxlKSk7CisgICAgICAgICAgICBzZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dCh0aGlzLCBSLnN0cmluZy5vYmplY3Rfc2F2ZWRfbWVzc2FnZSwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dCh0aGlzLCBSLnN0cmluZy5zYXZlX2ZhaWxlZF9tZXNzYWdlLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWxldGUoKSB7CisgICAgICAgIFVyaSB1cmkgPSBNdHAuT2JqZWN0LmdldENvbnRlbnRVcmkobURldmljZUlELCBtT2JqZWN0SUQpOworCisgICAgICAgIExvZy5kKFRBRywgImRlbGV0aW5nICIgKyB1cmkpOworCisgICAgICAgIGludCByZXN1bHQgPSBnZXRDb250ZW50UmVzb2x2ZXIoKS5kZWxldGUodXJpLCBudWxsLCBudWxsKTsKKyAgICAgICAgaWYgKHJlc3VsdCA+IDApIHsKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsIFIuc3RyaW5nLm9iamVjdF9kZWxldGVkX21lc3NhZ2UsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dCh0aGlzLCBSLnN0cmluZy5kZWxldGVfZmFpbGVkX21lc3NhZ2UsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9TdG9yYWdlQnJvd3Nlci5qYXZhIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9TdG9yYWdlQnJvd3Nlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZTAzNmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL1N0b3JhZ2VCcm93c2VyLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY2FtZXJhYnJvd3NlcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk10cDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNpbXBsZUN1cnNvckFkYXB0ZXI7CisKKy8qKgorICogQSBsaXN0IHZpZXcgZGlzcGxheWluZyBhbGwgc3RvcmFnZSB1bml0cyBvbiBhIGRldmljZS4KKyAqLworcHVibGljIGNsYXNzIFN0b3JhZ2VCcm93c2VyIGV4dGVuZHMgTGlzdEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RvcmFnZUJyb3dzZXIiOworCisgICAgcHJpdmF0ZSBMaXN0QWRhcHRlciBtQWRhcHRlcjsKKyAgICBwcml2YXRlIGludCBtRGV2aWNlSUQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVE9SQUdFX0NPTFVNTlMgPQorICAgICAgICBuZXcgU3RyaW5nW10geyBNdHAuU3RvcmFnZS5fSUQsIE10cC5TdG9yYWdlLkRFU0NSSVBUSU9OIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisKKyAgICAgICAgbURldmljZUlEID0gZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoImRldmljZSIsIDApOworICAgICAgICBpZiAobURldmljZUlEICE9IDApIHsKKyAgICAgICAgICAgIEN1cnNvciBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoTXRwLlN0b3JhZ2UuZ2V0Q29udGVudFVyaShtRGV2aWNlSUQpLAorICAgICAgICAgICAgICAgICAgICBTVE9SQUdFX0NPTFVNTlMsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgTG9nLmQoVEFHLCAicXVlcnkgcmV0dXJuZWQgIiArIGMpOworICAgICAgICAgICAgc3RhcnRNYW5hZ2luZ0N1cnNvcihjKTsKKworICAgICAgICAgICAgLy8gTWFwIEN1cnNvciBjb2x1bW5zIHRvIHZpZXdzIGRlZmluZWQgaW4gc2ltcGxlX2xpc3RfaXRlbV8xLnhtbAorICAgICAgICAgICAgbUFkYXB0ZXIgPSBuZXcgU2ltcGxlQ3Vyc29yQWRhcHRlcih0aGlzLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9saXN0X2l0ZW1fMSwgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBNdHAuU3RvcmFnZS5ERVNDUklQVElPTiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7IGFuZHJvaWQuUi5pZC50ZXh0MSwgYW5kcm9pZC5SLmlkLnRleHQyIH0pOworICAgICAgICAgICAgc2V0TGlzdEFkYXB0ZXIobUFkYXB0ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MaXN0SXRlbUNsaWNrKExpc3RWaWV3IGwsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KHRoaXMsIE9iamVjdEJyb3dzZXIuY2xhc3MpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoImRldmljZSIsIG1EZXZpY2VJRCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYSgic3RvcmFnZSIsIG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbikpOworICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9Vc2JSZWNlaXZlci5qYXZhIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9Vc2JSZWNlaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNWIyMzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL1VzYlJlY2VpdmVyLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY2FtZXJhYnJvd3NlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuVXNiOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitwdWJsaWMgY2xhc3MgVXNiUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlcgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVXNiUmVjZWl2ZXIiOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICBMb2cuZChUQUcsICJvblJlY2VpdmUgIiArIGludGVudCk7CisgICAgICAgIGlmIChVc2IuQUNUSU9OX1VTQl9DQU1FUkFfQVRUQUNIRUQuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKKyAgICAgICAgICAgIFVyaSB1cmkgPSBpbnRlbnQuZ2V0RGF0YSgpOworICAgICAgICAgICAgaW50ZW50ID0gbmV3IEludGVudChjb250ZXh0LCBTdG9yYWdlQnJvd3Nlci5jbGFzcyk7CisgICAgICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIC0gYWRkIGEgd3JhcHBlciB0byBNdHAuRGV2aWNlIGZvciB0aGlzCisgICAgICAgICAgICAgICAgaW50IGlkID0gSW50ZWdlci5wYXJzZUludCh1cmkuZ2V0UGF0aFNlZ21lbnRzKCkuZ2V0KDEpKTsKKyAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoImRldmljZSIsIGlkKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiYmFkIGRldmljZSBVcmkgIiArIHVyaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9tdHAvQW5kcm9pZC5tayBiL21lZGlhL3Rlc3RzL210cC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MDc0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9tdHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDYxIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJbXRwLmNwcCBcCisJTXRwRmlsZS5jcHAgXAorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbXRwIFwKKworTE9DQUxfQ0ZMQUdTIDo9IC1ETVRQX0hPU1QKKworTE9DQUxfTU9EVUxFIDo9IG10cAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYm10cCBsaWJ1c2Job3N0IGxpYnV0aWxzIGxpYmN1dGlscworCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworZW5kaWYKKworaWZlcSAoJChIT1NUX09TKSxsaW51eCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJbXRwLmNwcCBcCisJTXRwRmlsZS5jcHAgXAorCS4uLy4uLy4uL2xpYnMvdXRpbHMvUmVmQmFzZS5jcHAgXAorCS4uLy4uLy4uL2xpYnMvdXRpbHMvU2hhcmVkQnVmZmVyLmNwcCBcCisJLi4vLi4vLi4vbGlicy91dGlscy9UaHJlYWRzLmNwcCBcCisJLi4vLi4vLi4vbGlicy91dGlscy9WZWN0b3JJbXBsLmNwcCBcCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9tdHAgXAorCitMT0NBTF9DRkxBR1MgOj0gLURNVFBfSE9TVCAtZyAtTzAKKworaGF2ZV9yZWFkbGluZSA6PSAkKHdpbGRjYXJkIC91c3IvaW5jbHVkZS9yZWFkbGluZS9yZWFkbGluZS5oKQoraGF2ZV9oaXN0b3J5IDo9ICQod2lsZGNhcmQgL3Vzci9saWIvbGliaGlzdG9yeSopCitpZm5lcSAoJChzdHJpcCAkKGhhdmVfcmVhZGxpbmUpKSwpCitMT0NBTF9DRkxBR1MgKz0gLURIQVZFX1JFQURMSU5FPTEKK2VuZGlmCisKK0xPQ0FMX0xETElCUyArPSAtbHB0aHJlYWQKK2lmbmVxICgkKHN0cmlwICQoaGF2ZV9yZWFkbGluZSkpLCkKK0xPQ0FMX0xETElCUyArPSAtbHJlYWRsaW5lIC1sbmN1cnNlcworZW5kaWYKK2lmbmVxICgkKHN0cmlwICQoaGF2ZV9oaXN0b3J5KSksKQorTE9DQUxfTERMSUJTICs9IC1saGlzdG9yeQorZW5kaWYKKworTE9DQUxfTU9EVUxFIDo9IG10cAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYm10cCBsaWJ1c2Job3N0IGxpYmN1dGlscworCitpbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvbXRwL010cEZpbGUuY3BwIGIvbWVkaWEvdGVzdHMvbXRwL010cEZpbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZDMyOGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9tdHAvTXRwRmlsZS5jcHAKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTXRwQ2xpZW50LmgiCisjaW5jbHVkZSAiTXRwRGV2aWNlLmgiCisjaW5jbHVkZSAiTXRwRGV2aWNlSW5mby5oIgorI2luY2x1ZGUgIk10cE9iamVjdEluZm8uaCIKKyNpbmNsdWRlICJNdHBTdG9yYWdlLmgiCisjaW5jbHVkZSAiTXRwVXRpbHMuaCIKKworI2luY2x1ZGUgIk10cEZpbGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBDbGllbnQqIE10cEZpbGU6OnNDbGllbnQgPSBOVUxMOworCitNdHBGaWxlOjpNdHBGaWxlKE10cERldmljZSogZGV2aWNlKQorICAgIDogICBtRGV2aWNlKGRldmljZSksCisgICAgICAgIG1TdG9yYWdlKDApLAorICAgICAgICBtSGFuZGxlKDApCit7Cit9CisKK010cEZpbGU6Ok10cEZpbGUoTXRwRGV2aWNlKiBkZXZpY2UsIE10cFN0b3JhZ2VJRCBzdG9yYWdlKQorICAgIDogICBtRGV2aWNlKGRldmljZSksCisgICAgICAgIG1TdG9yYWdlKHN0b3JhZ2UpLAorICAgICAgICBtSGFuZGxlKDApCit7Cit9CisKK010cEZpbGU6Ok10cEZpbGUoTXRwRGV2aWNlKiBkZXZpY2UsIE10cFN0b3JhZ2VJRCBzdG9yYWdlLCBNdHBPYmplY3RIYW5kbGUgaGFuZGxlKQorICAgIDogICBtRGV2aWNlKGRldmljZSksCisgICAgICAgIG1TdG9yYWdlKHN0b3JhZ2UpLAorICAgICAgICBtSGFuZGxlKGhhbmRsZSkKK3sKK30KKworTXRwRmlsZTo6TXRwRmlsZShNdHBGaWxlKiBmaWxlKQorICAgIDogICBtRGV2aWNlKGZpbGUtPm1EZXZpY2UpLAorICAgICAgICBtU3RvcmFnZShmaWxlLT5tU3RvcmFnZSksCisgICAgICAgIG1IYW5kbGUoZmlsZS0+bUhhbmRsZSkKK3sKK30KKworTXRwRmlsZTo6fk10cEZpbGUoKSB7Cit9CisKK3ZvaWQgTXRwRmlsZTo6cHJpbnQoKSB7CisgICAgaWYgKG1IYW5kbGUpIHsKKworICAgIH0gZWxzZSBpZiAobVN0b3JhZ2UpIHsKKyAgICAgICAgcHJpbnRmKCIleFxuIiwgbVN0b3JhZ2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpZCA9IG1EZXZpY2UtPmdldElEKCk7CisgICAgICAgIE10cERldmljZUluZm8qIGluZm8gPSBtRGV2aWNlLT5nZXREZXZpY2VJbmZvKCk7CisgICAgICAgIGlmIChpbmZvKQorICAgICAgICAgICAgcHJpbnRmKCIlZFx0JXMgJXMgJXNcbiIsIGlkLCBpbmZvLT5tTWFudWZhY3R1cmVyLCBpbmZvLT5tTW9kZWwsIGluZm8tPm1TZXJpYWwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYoIiVkXHQobm8gZGV2aWNlIGluZm8gYXZhaWxhYmxlKVxuIiwgaWQpOworICAgICAgICBkZWxldGUgaW5mbzsKKyAgICB9Cit9CisKK010cE9iamVjdEluZm8qIE10cEZpbGU6OmdldE9iamVjdEluZm8oKSB7CisgICAgcmV0dXJuIG1EZXZpY2UtPmdldE9iamVjdEluZm8obUhhbmRsZSk7Cit9CisKK3ZvaWQgTXRwRmlsZTo6bGlzdCgpIHsKKyAgICBpZiAobVN0b3JhZ2UpIHsKKyAgICAgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogaGFuZGxlcyA9IG1EZXZpY2UtPmdldE9iamVjdEhhbmRsZXMobVN0b3JhZ2UsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobUhhbmRsZSA/IG1IYW5kbGUgOiAtMSkpOworICAgICAgICBpZiAoaGFuZGxlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVzLT5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSAoKmhhbmRsZXMpW2ldOworICAgICAgICAgICAgICAgIE10cE9iamVjdEluZm8qIGluZm8gPSBtRGV2aWNlLT5nZXRPYmplY3RJbmZvKGhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKGluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBtb2RpZmllZFsxMDBdOworICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdG0gdG07CisKKyAgICAgICAgICAgICAgICAgICAgZ210aW1lX3IoJmluZm8tPm1EYXRlTW9kaWZpZWQsICZ0bSk7CisgICAgICAgICAgICAgICAgICAgIHN0cmZ0aW1lKG1vZGlmaWVkLCBzaXplb2YobW9kaWZpZWQpLCAiJWEgJWIgJWUgJUg6JU06JVMgR01UICVZIiwgJnRtKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyBIYW5kbGU6ICVkIEZvcm1hdDogJTA0WCBTaXplOiAlZCBNb2RpZmllZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+bU5hbWUsIGhhbmRsZSwgaW5mby0+bUZvcm1hdCwgaW5mby0+bUNvbXByZXNzZWRTaXplLCBtb2RpZmllZCk7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpbmZvOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGVzOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbGlzdCBzdG9yYWdlIHVuaXRzIGZvciBkZXZpY2UKKyAgICAgICAgTXRwU3RvcmFnZUlETGlzdCogc3RvcmFnZUxpc3QgPSBtRGV2aWNlLT5nZXRTdG9yYWdlSURzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RvcmFnZUxpc3QtPnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gKCpzdG9yYWdlTGlzdClbaV07CisgICAgICAgICAgICBwcmludGYoIiV4XG4iLCBzdG9yYWdlSUQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE10cEZpbGU6OmluaXQoTXRwQ2xpZW50KiBjbGllbnQpIHsKKyAgICBzQ2xpZW50ID0gY2xpZW50OworfQorCitNdHBGaWxlKiBNdHBGaWxlOjpwYXJzZVBhdGgoTXRwRmlsZSogYmFzZSwgY2hhciogcGF0aCkgeworICAgIE10cERldmljZSogZGV2aWNlID0gTlVMTDsKKyAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZSA9IDA7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IDA7CisKKyAgICBpZiAocGF0aFswXSAhPSAnLycgJiYgYmFzZSkgeworICAgICAgICBkZXZpY2UgPSBiYXNlLT5tRGV2aWNlOworICAgICAgICBzdG9yYWdlID0gYmFzZS0+bVN0b3JhZ2U7CisgICAgICAgIGhhbmRsZSA9IGJhc2UtPm1IYW5kbGU7CisgICAgfQorCisgICAgLy8gcGFyc2UgYW4gYWJzb2x1dGUgcGF0aAorICAgIGlmIChwYXRoWzBdID09ICcvJykKKyAgICAgICAgcGF0aCsrOworICAgIGNoYXIqIHRvayA9IHN0cnRvayhwYXRoLCAiLyIpOworICAgIHdoaWxlICh0b2spIHsKKyAgICAgICAgaWYgKHN0b3JhZ2UpIHsKKyAgICAgICAgICAgIC8vIGZpbmQgY2hpbGQgb2YgY3VycmVudCBoYW5kbGUKKyAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIGhhbmRsZXMgPSBkZXZpY2UtPmdldE9iamVjdEhhbmRsZXMoc3RvcmFnZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGFuZGxlID8gaGFuZGxlIDogLTEpKTsKKyAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBjaGlsZEhhbmRsZSA9IDA7CisKKyAgICAgICAgICAgIGlmIChoYW5kbGVzKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVzLT5zaXplKCkgJiYgIWNoaWxkSGFuZGxlOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9ICgqaGFuZGxlcylbaV07CisgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEluZm8qIGluZm8gPSBkZXZpY2UtPmdldE9iamVjdEluZm8oaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8gJiYgIXN0cmNtcCh0b2ssIGluZm8tPm1OYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkSGFuZGxlID0gaGFuZGxlOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgaW5mbzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVsZXRlIGhhbmRsZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2hpbGRIYW5kbGUpCisgICAgICAgICAgICAgICAgaGFuZGxlID0gY2hpbGRIYW5kbGU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaWQ7CisgICAgICAgICAgICAvLyBmaW5kIHN0b3JhZ2UgZm9yIHRoZSBkZXZpY2UKKyAgICAgICAgICAgIGlmIChzc2NhbmYodG9rLCAiJXgiLCAmaWQpID09IDEpIHsKKyAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSURMaXN0KiBzdG9yYWdlTGlzdCA9IGRldmljZS0+Z2V0U3RvcmFnZUlEcygpOworICAgICAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0b3JhZ2VMaXN0LT5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKCpzdG9yYWdlTGlzdClbaV0gPT0gaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmb3VuZCkKKyAgICAgICAgICAgICAgICAgICAgc3RvcmFnZSA9IGlkOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBmaW5kIGRldmljZQorICAgICAgICAgICAgdW5zaWduZWQgaW50IGlkOworICAgICAgICAgICAgaWYgKHNzY2FuZih0b2ssICIlZCIsICZpZCkgPT0gMSkKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBzQ2xpZW50LT5nZXREZXZpY2UoaWQpOworICAgICAgICAgICAgaWYgKCFkZXZpY2UpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICB0b2sgPSBzdHJ0b2soTlVMTCwgIi8iKTsKKyAgICB9CisKKyAgICBpZiAoZGV2aWNlKQorICAgICAgICByZXR1cm4gbmV3IE10cEZpbGUoZGV2aWNlLCBzdG9yYWdlLCBoYW5kbGUpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7Cit9CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL210cC9NdHBGaWxlLmggYi9tZWRpYS90ZXN0cy9tdHAvTXRwRmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiODc2MmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9tdHAvTXRwRmlsZS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfRklMRV9ICisjZGVmaW5lIF9NVFBfRklMRV9ICisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cENsaWVudDsKK2NsYXNzIE10cERldmljZTsKK2NsYXNzIE10cE9iamVjdEluZm87CisKKy8vIEZpbGUtbGlrZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGludGVyYWN0aXZlIHNoZWxsLgorLy8gVGhpcyBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgYW4gTVRQIGRldmljZSwgc3RvcmFnZSB1bml0IG9yIG9iamVjdAorLy8gKGVpdGhlciBmaWxlIG9yIGFzc29jaWF0aW9uKS4KK2NsYXNzIE10cEZpbGUgeworcHJpdmF0ZToKKyAgICBNdHBEZXZpY2UqICAgICAgICAgIG1EZXZpY2U7CisgICAgTXRwU3RvcmFnZUlEICAgICAgICBtU3RvcmFnZTsKKyAgICBNdHBPYmplY3RIYW5kbGUgICAgIG1IYW5kbGU7CisgICAgc3RhdGljIE10cENsaWVudCogICBzQ2xpZW50OworCitwdWJsaWM6CisgICAgTXRwRmlsZShNdHBEZXZpY2UqIGRldmljZSk7CisgICAgTXRwRmlsZShNdHBEZXZpY2UqIGRldmljZSwgTXRwU3RvcmFnZUlEIHN0b3JhZ2UpOworICAgIE10cEZpbGUoTXRwRGV2aWNlKiBkZXZpY2UsIE10cFN0b3JhZ2VJRCBzdG9yYWdlLCBNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKyAgICBNdHBGaWxlKE10cEZpbGUqIGZpbGUpOworICAgIHZpcnR1YWwgfk10cEZpbGUoKTsKKworICAgIE10cE9iamVjdEluZm8qIGdldE9iamVjdEluZm8oKTsKKyAgICB2b2lkIHByaW50KCk7CisgICAgdm9pZCBsaXN0KCk7CisKKyAgICBpbmxpbmUgTXRwRGV2aWNlKiBnZXREZXZpY2UoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlOyB9CisKKyAgICBzdGF0aWMgdm9pZCBpbml0KE10cENsaWVudCogY2xpZW50KTsKKyAgICBzdGF0aWMgTXRwRmlsZSogcGFyc2VQYXRoKE10cEZpbGUqIGJhc2UsIGNoYXIqIHBhdGgpOworfTsKKworfQorCisjZW5kaWYgLy8gX01UUF9ESVJFQ1RPUllfSApkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvbXRwL210cC5jcHAgYi9tZWRpYS90ZXN0cy9tdHAvbXRwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjAyY2FlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvbXRwL210cC5jcHAKQEAgLTAsMCArMSwzNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2lmIEhBVkVfUkVBRExJTkUKKyNpbmNsdWRlIDxyZWFkbGluZS9yZWFkbGluZS5oPgorI2luY2x1ZGUgPHJlYWRsaW5lL2hpc3RvcnkuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiTXRwQ2xpZW50LmgiCisjaW5jbHVkZSAiTXRwRGV2aWNlLmgiCisjaW5jbHVkZSAiTXRwT2JqZWN0SW5mby5oIgorCisjaW5jbHVkZSAiTXRwRmlsZS5oIgorCisjZGVmaW5lIFBST01QVCAgIm10cD4gIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdGljIE10cENsaWVudCogc0NsaWVudCA9IE5VTEw7CisKKy8vIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaW5mb3JtYXRpb24gZm9yIGludGVyYWN0aXZlIHNoZWxsCitzdGF0aWMgTXRwRmlsZSogc0N1cnJlbnREaXJlY3RvcnkgPSBOVUxMOworCitzdGF0aWMgTXRwRmlsZSogcGFyc2VfcGF0aChjaGFyKiBwYXRoKSB7CisgICAgcmV0dXJuIE10cEZpbGU6OnBhcnNlUGF0aChzQ3VycmVudERpcmVjdG9yeSwgcGF0aCk7Cit9CisKK2NsYXNzIE15Q2xpZW50IDogcHVibGljIE10cENsaWVudCB7Citwcml2YXRlOgorICAgIHZpcnR1YWwgdm9pZCBkZXZpY2VBZGRlZChNdHBEZXZpY2UgKmRldmljZSkgeworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBkZXZpY2VSZW1vdmVkKE10cERldmljZSAqZGV2aWNlKSB7CisgICAgfQorCitwdWJsaWM6Cit9OworCitzdGF0aWMgdm9pZCBpbml0KCkgeworICAgIHNDbGllbnQgPSBuZXcgTXlDbGllbnQ7CisgICAgc0NsaWVudC0+c3RhcnQoKTsKKyAgICBNdHBGaWxlOjppbml0KHNDbGllbnQpOworfQorCitzdGF0aWMgaW50IHNldF9jd2QoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGlmIChhcmdjICE9IDEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjZCBzaG91bGQgaGF2ZSBvbmUgYXJndW1lbnRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghc3RyY21wKGFyZ3ZbMF0sICIvIikpIHsKKyAgICAgICAgZGVsZXRlIHNDdXJyZW50RGlyZWN0b3J5OworICAgICAgICBzQ3VycmVudERpcmVjdG9yeSA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBNdHBGaWxlKiBmaWxlID0gcGFyc2VfcGF0aChhcmd2WzBdKTsKKyAgICAgICAgaWYgKGZpbGUpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBzQ3VycmVudERpcmVjdG9yeTsKKyAgICAgICAgICAgIHNDdXJyZW50RGlyZWN0b3J5ID0gZmlsZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGZpbmQgJXNcbiIsIGFyZ3ZbMF0pOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsaXN0X2RldmljZXMoKSB7CisgICAgLy8gVE9ETyAtIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBsaXN0IHdpbGwgbm90IGNoYW5nZSB3aGlsZSBpdGVyYXRpbmcKKyAgICBNdHBEZXZpY2VMaXN0JiBkZXZpY2VzID0gc0NsaWVudC0+Z2V0RGV2aWNlTGlzdCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBNdHBEZXZpY2UqIGRldmljZSA9IGRldmljZXNbaV07CisgICAgICAgIE10cEZpbGUqIGZpbGUgPSBuZXcgTXRwRmlsZShkZXZpY2UpOworICAgICAgICBmaWxlLT5wcmludCgpOworICAgICAgICBkZWxldGUgZmlsZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbGlzdChpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgaWYgKGFyZ2MgPT0gMCkgeworICAgICAgICAvLyBsaXN0IGN3ZAorICAgICAgICBpZiAoc0N1cnJlbnREaXJlY3RvcnkpIHsKKyAgICAgICAgICAgIHNDdXJyZW50RGlyZWN0b3J5LT5saXN0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsaXN0X2RldmljZXMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgIGNoYXIqIHBhdGggPSBhcmd2W2ldOworICAgICAgICBpZiAoIXN0cmNtcChwYXRoLCAiLyIpKSB7CisgICAgICAgICAgICBsaXN0X2RldmljZXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE10cEZpbGUqIGZpbGUgPSBwYXJzZV9wYXRoKHBhdGgpOworICAgICAgICAgICAgaWYgKCFmaWxlKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgZmluZCAlc1xuIiwgcGF0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlsZS0+bGlzdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ZpbGUoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGludCByZXQgPSAtMTsKKyAgICBpbnQgc3JjRkQgPSAtMTsKKyAgICBpbnQgZGVzdEZEID0gLTE7CisgICAgTXRwRmlsZSogc3JjRmlsZSA9IE5VTEw7CisgICAgTXRwT2JqZWN0SW5mbyogaW5mbyA9IE5VTEw7CisgICAgY2hhciogZGVzdDsKKworICAgIGlmIChhcmdjIDwgMSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm5vdCBlbm91Z2ggYXJndW1lbnRzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSBpZiAoYXJnYyA+IDIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ0b28gbWFueSBhcmd1bWVudHNcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gZmluZCBzb3VyY2Ugb2JqZWN0CisgICAgY2hhciogc3JjID0gYXJndlswXTsKKyAgICBzcmNGaWxlID0gcGFyc2VfcGF0aChzcmMpOworICAgIGlmICghc3JjRmlsZSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBmaW5kICVzXG4iLCBzcmMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGluZm8gPSBzcmNGaWxlLT5nZXRPYmplY3RJbmZvKCk7CisgICAgaWYgKCFpbmZvKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGZpbmQgb2JqZWN0IGluZm8gZm9yICVzXG4iLCBzcmMpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmIChpbmZvLT5tRm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3B5aW5nIGRpcmVjdG9yaWVzIG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZGVzdCA9IChhcmdjID4gMSA/IGFyZ3ZbMV0gOiBpbmZvLT5tTmFtZSk7CisgICAgZGVzdEZEID0gb3BlbihkZXN0LCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIKTsKKyAgICBpZiAoZGVzdEZEIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBjcmVhdGUgJXNcbiIsIGRlc3QpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIHNyY0ZEID0gc3JjRmlsZS0+Z2V0RGV2aWNlKCktPnJlYWRPYmplY3QoaW5mby0+bUhhbmRsZSwgaW5mby0+bUNvbXByZXNzZWRTaXplKTsKKyAgICBpZiAoc3JjRkQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBjaGFyIGJ1ZmZlcls2NTUzNl07CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaW50IGNvdW50ID0gcmVhZChzcmNGRCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgIGlmIChjb3VudCA8PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHdyaXRlKGRlc3RGRCwgYnVmZmVyLCBjb3VudCk7CisgICAgfQorICAgIC8vIEZJWE1FIC0gZXJyb3IgY2hlY2tpbmcgYW5kIHJlcG9ydGluZworICAgIHJldCA9IDA7CisKK2ZhaWw6CisgICAgZGVsZXRlIHNyY0ZpbGU7CisgICAgZGVsZXRlIGluZm87CisgICAgaWYgKHNyY0ZEID49IDApCisgICAgICAgIGNsb3NlKHNyY0ZEKTsKKyAgICBpZiAoZGVzdEZEID49IDApCisgICAgICAgIGNsb3NlKGRlc3RGRCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwdXRfZmlsZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgaW50IHJldCA9IC0xOworICAgIGludCBzcmNGRCA9IC0xOworICAgIE10cEZpbGUqIGRlc3RGaWxlID0gTlVMTDsKKyAgICBNdHBPYmplY3RJbmZvKiBzcmNJbmZvID0gTlVMTDsKKyAgICBNdHBPYmplY3RJbmZvKiBkZXN0SW5mbyA9IE5VTEw7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZTsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgIGNvbnN0IGNoYXIqIGxhc3RTbGFzaDsKKworICAgIGlmIChhcmdjIDwgMSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm5vdCBlbm91Z2ggYXJndW1lbnRzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSBpZiAoYXJnYyA+IDIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ0b28gbWFueSBhcmd1bWVudHNcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGNvbnN0IGNoYXIqIHNyYyA9IGFyZ3ZbMF07CisgICAgc3JjRkQgPSBvcGVuKHNyYywgT19SRE9OTFkpOworICAgIGlmIChzcmNGRCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3Qgb3BlbiAlc1xuIiwgc3JjKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoYXJnYyA9PSAyKSB7CisgICAgICAgICBjaGFyKiBkZXN0ID0gYXJndlsxXTsKKyAgICAgICAgZGVzdEZpbGUgPSBwYXJzZV9wYXRoKGRlc3QpOworICAgICAgICBpZiAoIWRlc3RGaWxlKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBmaW5kICVzXG4iLCBkZXN0KTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghc0N1cnJlbnREaXJlY3RvcnkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBkZXN0RmlsZSA9IG5ldyBNdHBGaWxlKHNDdXJyZW50RGlyZWN0b3J5KTsKKyAgICB9CisKKyAgICBkZXN0SW5mbyA9IGRlc3RGaWxlLT5nZXRPYmplY3RJbmZvKCk7CisgICAgaWYgKCFkZXN0SW5mbykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBmaW5kIG9iamVjdCBpbmZvIGRlc3RpbmF0aW9uIGRpcmVjdG9yeVxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKGRlc3RJbmZvLT5tRm9ybWF0ICE9IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJkZXN0aW5hdGlvbiBub3QgYSBkaXJlY3RvcnlcbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKGZzdGF0KHNyY0ZELCAmc3RhdGJ1ZikpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHNyY0luZm8gPSBuZXcgTXRwT2JqZWN0SW5mbygwKTsKKyAgICBzcmNJbmZvLT5tU3RvcmFnZUlEID0gZGVzdEluZm8tPm1TdG9yYWdlSUQ7CisgICAgc3JjSW5mby0+bUZvcm1hdCA9IE1UUF9GT1JNQVRfRVhJRl9KUEVHOyAgLy8gRklYTUUKKyAgICBzcmNJbmZvLT5tQ29tcHJlc3NlZFNpemUgPSBzdGF0YnVmLnN0X3NpemU7CisgICAgc3JjSW5mby0+bVBhcmVudCA9IGRlc3RJbmZvLT5tSGFuZGxlOworICAgIGxhc3RTbGFzaCA9IHN0cnJjaHIoc3JjLCAnLycpOworICAgIHNyY0luZm8tPm1OYW1lID0gc3RyZHVwKGxhc3RTbGFzaCA/IGxhc3RTbGFzaCArIDEgOiBzcmMpOworICAgIHNyY0luZm8tPm1EYXRlTW9kaWZpZWQgPSBzdGF0YnVmLnN0X210aW1lOworICAgIGhhbmRsZSA9IGRlc3RGaWxlLT5nZXREZXZpY2UoKS0+c2VuZE9iamVjdEluZm8oc3JjSW5mbyk7CisgICAgaWYgKGhhbmRsZSA8PSAwKSB7CisgICAgICAgIHByaW50Zigic2VuZE9iamVjdEluZm8gcmV0dXJuZWQgJTA0WFxuIiwgaGFuZGxlKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoZGVzdEZpbGUtPmdldERldmljZSgpLT5zZW5kT2JqZWN0KHNyY0luZm8sIHNyY0ZEKSkKKyAgICAgICAgcmV0ID0gMDsKKworZmFpbDoKKyAgICBkZWxldGUgZGVzdEZpbGU7CisgICAgZGVsZXRlIHNyY0luZm87CisgICAgZGVsZXRlIGRlc3RJbmZvOworICAgIGlmIChzcmNGRCA+PSAwKQorICAgICAgICBjbG9zZShzcmNGRCk7CisgICAgcHJpbnRmKCJyZXR1cm5pbmcgJWRcbiIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordHlwZWRlZiBpbnQgKCogY29tbWFuZF9mdW5jKShpbnQgYXJnYywgY2hhciogYXJndltdKTsKKworc3RydWN0IGNvbW1hbmRfdGFibGVfZW50cnkgeworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgY29tbWFuZF9mdW5jIGZ1bmM7Cit9OworCitjb25zdCBjb21tYW5kX3RhYmxlX2VudHJ5IGNvbW1hbmRfbGlzdFtdID0geworICAgIHsgICAiY2QiLCAgICAgICBzZXRfY3dkICAgICAgICAgfSwKKyAgICB7ICAgImxzIiwgICAgICAgbGlzdCAgICAgICAgICAgIH0sCisgICAgeyAgICJnZXQiLCAgICAgIGdldF9maWxlICAgICAgICB9LAorICAgIHsgICAicHV0IiwgICAgICBwdXRfZmlsZSAgICAgICAgfSwKKyAgICB7ICAgTlVMTCwgICAgICAgTlVMTCAgICAgICAgICAgIH0sCit9OworCisKK3N0YXRpYyBpbnQgZG9fY29tbWFuZChpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgY29uc3QgY29tbWFuZF90YWJsZV9lbnRyeSogY29tbWFuZCA9IGNvbW1hbmRfbGlzdDsKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gKmFyZ3YrKzsKKyAgICBhcmdjLS07CisKKyAgICB3aGlsZSAoY29tbWFuZC0+bmFtZSkgeworICAgICAgICBpZiAoIXN0cmNtcChjb21tYW5kLT5uYW1lLCBuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBjb21tYW5kLT5mdW5jKGFyZ2MsIGFyZ3YpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb21tYW5kKys7CisgICAgfQorICAgIGZwcmludGYoc3RkZXJyLCAidW5rbm93biBjb21tYW5kICVzXG4iLCBuYW1lKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgc2hlbGwoKSB7CisgICAgaW50IGFyZ2M7CisgICAgaW50IHJlc3VsdCA9IDA7CisjZGVmaW5lIE1BWF9BUkdTICAgIDEwMAorICAgIGNoYXIqIGFyZ3ZbTUFYX0FSR1NdOworCisjaWYgSEFWRV9SRUFETElORQorICAgIHVzaW5nX2hpc3RvcnkoKTsKKyNlbmRpZgorCisgICAgd2hpbGUgKDEpIHsKKyNpZiBIQVZFX1JFQURMSU5FCisgICAgICAgIGNoYXIqIGxpbmUgPSByZWFkbGluZShQUk9NUFQpOworICAgICAgICBpZiAoIWxpbmUpIHsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgICAgIGV4aXQoMCk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGNoYXIgICAgYnVmZmVyWzEwMDBdOworICAgICAgICBwcmludGYoIiVzIiwgUFJPTVBUKTsKKyAgICAgICAgY2hhciogbGluZSA9IE5VTEw7CisgICAgICAgIHNpemVfdCBsZW5ndGggPSAwOworCisgICAgICAgIGJ1ZmZlclswXSA9IDA7CisgICAgICAgIGZnZXRzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIHN0ZGluKTsKKyAgICAgICAgaW50IGNvdW50ID0gc3RybGVuKGJ1ZmZlcik7CisgICAgICAgIGlmIChjb3VudCA+IDAgJiYgYnVmZmVyWzBdID09IChjaGFyKUVPRikgeworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY291bnQgPiAwICYmIGxpbmVbY291bnQgLSAxXSA9PSAnXG4nKQorICAgICAgICAgICAgbGluZVtjb3VudCAtIDFdID09IDA7CisjZW5kaWYKKyAgICAgICAgY2hhciogdG9rID0gc3RydG9rKGxpbmUsICIgXHRcblxyIik7CisgICAgICAgIGlmICghdG9rKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICghc3RyY21wKHRvaywgInF1aXQiKSB8fCAhc3RyY21wKHRvaywgImV4aXQiKSkgeworICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgfQorI2lmIEhBVkVfUkVBRExJTkUKKyAgICAgICAgYWRkX2hpc3RvcnkobGluZSk7CisjZW5kaWYKKyAgICAgICAgYXJnYyA9IDA7CisgICAgICAgIHdoaWxlICh0b2spIHsKKyAgICAgICAgICAgIGlmIChhcmdjICsgMSA9PSBNQVhfQVJHUykgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidG9vIG1hbnkgYXJndW1lbnRzXG4iKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGJvdHRvbV9vZl9sb29wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhcmd2W2FyZ2MrK10gPSBzdHJkdXAodG9rKTsKKyAgICAgICAgICAgIHRvayA9IHN0cnRvayhOVUxMLCAiIFx0XG5cciIpOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ID0gZG9fY29tbWFuZChhcmdjLCBhcmd2KTsKKworYm90dG9tX29mX2xvb3A6CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnYzsgaSsrKQorICAgICAgICAgICAgZnJlZShhcmd2W2ldKTsKKyAgICAgICAgZnJlZShsaW5lKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgaW5pdCgpOworCisgICAgaWYgKGFyZ2MgPT0gMSkKKyAgICAgICAgcmV0dXJuIHNoZWxsKCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZG9fY29tbWFuZChhcmdjIC0gMSwgYXJndiArIDEpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvcGxheWVycy9pbnZva2VfbW9ja19tZWRpYV9wbGF5ZXIuY3BwIGIvbWVkaWEvdGVzdHMvcGxheWVycy9pbnZva2VfbW9ja19tZWRpYV9wbGF5ZXIuY3BwCmluZGV4IGIzY2M4YjYuLjUzMzA4YmUgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL3BsYXllcnMvaW52b2tlX21vY2tfbWVkaWFfcGxheWVyLmNwcAorKysgYi9tZWRpYS90ZXN0cy9wbGF5ZXJzL2ludm9rZV9tb2NrX21lZGlhX3BsYXllci5jcHAKQEAgLTI2LDYgKzI2LDcgQEAKIAogdXNpbmcgYW5kcm9pZDo6SU5WQUxJRF9PUEVSQVRJT047CiB1c2luZyBhbmRyb2lkOjpJU3VyZmFjZTsKK3VzaW5nIGFuZHJvaWQ6OlN1cmZhY2U7CiB1c2luZyBhbmRyb2lkOjpNZWRpYVBsYXllckJhc2U7CiB1c2luZyBhbmRyb2lkOjpPSzsKIHVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKQEAgLTY3LDcgKzY4LDggQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpIHtyZXR1cm4gT0s7fQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkge3JldHVybiBPSzt9CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkge3JldHVybiBPSzt9CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpIHtyZXR1cm4gT0s7fQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZSgpIHtyZXR1cm4gT0s7fQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZUFzeW5jKCkge3JldHVybiBPSzt9CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydCgpIHtyZXR1cm4gT0s7fQpkaWZmIC0tZ2l0IGEvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC90dHMuaCBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvdHRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIxNTEwOAotLS0gL2Rldi9udWxsCisrKyBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvdHRzLmgKQEAgLTAsMCArMSwzMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQU5EUk9JRF9UVFNfSAorI2RlZmluZSBBTkRST0lEX1RUU19IIAorCisvLyBUaGlzIGhlYWRlciBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdXNlZCBieSB0aGUgQW5kcm9pZCBwbGF0Zm9ybQorLy8gdG8gYWNjZXNzIFRleHQtVG8tU3BlZWNoIGZ1bmN0aW9uYWxpdHkgaW4gc2hhcmVkIGxpYnJhcmllcyB0aGF0IGltcGxlbWVudAorLy8gc3BlZWNoIHN5bnRoZXNpcyBhbmQgdGhlIG1hbmFnZW1lbnQgb2YgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKy8vIHN5bnRoZXNpcy4KKworLy8gVGhlIHNoYXJlZCBsaWJyYXJ5IG11c3QgY29udGFpbiBhIGZ1bmN0aW9uIG5hbWVkICJhbmRyb2lkX2dldFR0c0VuZ2luZSIKKy8vIHRoYXQgcmV0dXJucyBhbiAnYW5kcm9pZF90dHNfZW5naW5lX3QnIGluc3RhbmNlLgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgQU5EUk9JRF9UVFNfRU5HSU5FX1BST1BFUlRZX0NPTkZJRyAiZW5naW5lQ29uZmlnIgorI2RlZmluZSBBTkRST0lEX1RUU19FTkdJTkVfUFJPUEVSVFlfUElUQ0ggICJwaXRjaCIKKyNkZWZpbmUgQU5EUk9JRF9UVFNfRU5HSU5FX1BST1BFUlRZX1JBVEUgICAicmF0ZSIKKyNkZWZpbmUgQU5EUk9JRF9UVFNfRU5HSU5FX1BST1BFUlRZX1ZPTFVNRSAidm9sdW1lIgorCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfVFRTX1NVQ0NFU1MgICAgICAgICAgICAgICAgID0gMCwKKyAgICBBTkRST0lEX1RUU19GQUlMVVJFICAgICAgICAgICAgICAgICA9IC0xLAorICAgIEFORFJPSURfVFRTX0ZFQVRVUkVfVU5TVVBQT1JURUQgICAgID0gLTIsCisgICAgQU5EUk9JRF9UVFNfVkFMVUVfSU5WQUxJRCAgICAgICAgICAgPSAtMywKKyAgICBBTkRST0lEX1RUU19QUk9QRVJUWV9VTlNVUFBPUlRFRCAgICA9IC00LAorICAgIEFORFJPSURfVFRTX1BST1BFUlRZX1NJWkVfVE9PX1NNQUxMID0gLTUsCisgICAgQU5EUk9JRF9UVFNfTUlTU0lOR19SRVNPVVJDRVMgICAgICAgPSAtNgorfSBhbmRyb2lkX3R0c19yZXN1bHRfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTkRST0lEX1RUU19MQU5HX0NPVU5UUllfVkFSX0FWQUlMQUJMRSA9IDIsCisgICAgQU5EUk9JRF9UVFNfTEFOR19DT1VOVFJZX0FWQUlMQUJMRSAgICA9IDEsCisgICAgQU5EUk9JRF9UVFNfTEFOR19BVkFJTEFCTEUgICAgICAgICAgICA9IDAsCisgICAgQU5EUk9JRF9UVFNfTEFOR19NSVNTSU5HX0RBVEEgICAgICAgICA9IC0xLAorICAgIEFORFJPSURfVFRTX0xBTkdfTk9UX1NVUFBPUlRFRCAgICAgICAgPSAtMgorfSBhbmRyb2lkX3R0c19zdXBwb3J0X3Jlc3VsdF90OworCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfVFRTX1NZTlRIX0RPTkUgICAgICAgICAgICAgID0gMCwKKyAgICBBTkRST0lEX1RUU19TWU5USF9QRU5ESU5HICAgICAgICAgICA9IDEKK30gYW5kcm9pZF90dHNfc3ludGhfc3RhdHVzX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfSEFMVCAgICAgICAgICAgPSAwLAorICAgIEFORFJPSURfVFRTX0NBTExCQUNLX0NPTlRJTlVFICAgICAgID0gMQorfSBhbmRyb2lkX3R0c19jYWxsYmFja19zdGF0dXNfdDsKKworLy8gU3VwcG9ydGVkIGF1ZGlvIGZvcm1hdHMKK3R5cGVkZWYgZW51bSB7CisgICAgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX0lOVkFMSUQgICAgPSAtMSwKKyAgICBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfREVGQVVMVCAgICA9IDAsCisgICAgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgPSAxLAorICAgIEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9QQ01fOF9CSVQgID0gMiwKK30gYW5kcm9pZF90dHNfYXVkaW9fZm9ybWF0X3Q7CisKKworLyogQW4gYW5kcm9pZF90dHNfZW5naW5lX3Qgb2JqZWN0IGNhbiBiZSBhbnl0aGluZywgYnV0IG11c3QgaGF2ZSwKKyAqIGFzIGl0cyBmaXJzdCBmaWVsZCwgYSBwb2ludGVyIHRvIGEgdGFibGUgb2YgZnVuY3Rpb25zLgorICoKKyAqIFNlZSB0aGUgZnVsbCBkZWZpbml0aW9uIG9mIHN0cnVjdCBhbmRyb2lkX3R0c19lbmdpbmVfdF9mdW5jc190CisgKiBiZWxvdyBmb3IgZGV0YWlscy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYW5kcm9pZF90dHNfZW5naW5lX2Z1bmNzX3QgIGFuZHJvaWRfdHRzX2VuZ2luZV9mdW5jc190OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX2Z1bmNzX3QgKmZ1bmNzOworfSBhbmRyb2lkX3R0c19lbmdpbmVfdDsKKworLyogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGxvY2F0ZWQgaW4gdGhlIFRUUyBFbmdpbmUgc2hhcmVkIGxpYnJhcnkKKyAqIGFuZCBtdXN0IHJldHVybiB0aGUgYWRkcmVzcyBvZiBhbiBhbmRyb2lkX3R0c19lbmdpbmVfdCBsaWJyYXJ5LgorICovCitleHRlcm4gYW5kcm9pZF90dHNfZW5naW5lX3QgKmFuZHJvaWRfZ2V0VHRzRW5naW5lKCk7CisKKy8qIEluY2x1ZGluZyB0aGUgb2xkIHZlcnNpb24gZm9yIGxlZ2FjeSBzdXBwb3J0IChGcm95byBjb21wYXRpYmlsaXR5KS4KKyAqIFRoaXMgc2hvdWxkIHJldHVybiB0aGUgc2FtZSB0aGluZyBhcyBhbmRyb2lkX2dldFR0c0VuZ2luZS4KKyAqLworZXh0ZXJuICJDIiBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZ2V0VHRzRW5naW5lKCk7CisKKy8vIEEgY2FsbGJhY2sgdHlwZSB1c2VkIHRvIG5vdGlmeSB0aGUgZnJhbWV3b3JrIG9mIG5ldyBzeW50aGV0aXplZAorLy8gYXVkaW8gc2FtcGxlcywgc3RhdHVzIHdpbGwgYmUgU1lOVEhfRE9ORSBmb3IgdGhlIGxhc3Qgc2FtcGxlIG9mCisvLyB0aGUgbGFzdCByZXF1ZXN0LCBvZiBTWU5USF9QRU5ESU5HIG90aGVyd2lzZS4KKy8vCisvLyBUaGlzIGlzIHBhc3NlZCBieSB0aGUgZnJhbWV3b3JrIHRvIHRoZSBlbmdpbmUgdGhyb3VnaCB0aGUKKy8vICdlbmdpbmVfaW5pdCcgZnVuY3Rpb24gKHNlZSBiZWxvdykuCisvLworLy8gVGhlIGNhbGxiYWNrIGZvciBzeW50aGVzaXMgY29tcGxldGVkIHRha2VzOgorLy8gQHBhcmFtIFtpbm91dF0gdm9pZCAqJiAgICAgICAtIFRoZSB1c2VyZGF0YSBwb2ludGVyIHNldCBpbiB0aGUgb3JpZ2luYWwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGggY2FsbAorLy8gQHBhcmFtIFtpbl0gICAgdWludDMyX3QgICAgICAtIFRyYWNrIHNhbXBsaW5nIHJhdGUgaW4gSHoKKy8vIEBwYXJhbSBbaW5dICAgIHVpbnQzMl90ICAgICAgLSBUaGUgYXVkaW8gZm9ybWF0CisvLyBAcGFyYW0gW2luXSAgICBpbnQgICAgICAgICAgIC0gVGhlIG51bWJlciBvZiBjaGFubmVscworLy8gQHBhcmFtIFtpbm91dF0gaW50OF90IComICAgICAtIEEgYnVmZmVyIG9mIGF1ZGlvIGRhdGEgb25seSB2YWxpZCBkdXJpbmcgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uIG9mIHRoZSBjYWxsYmFjaworLy8gQHBhcmFtIFtpbm91dF0gc2l6ZV90ICAmICAgICAtIFRoZSBzaXplIG9mIHRoZSBidWZmZXIKKy8vIEBwYXJhbSBbaW5dIHR0c19zeW50aF9zdGF0dXMgLSBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBzeW50aGVzaXMgaXMgZG9uZSwgb3IKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbW9yZSBkYXRhIGlzIHRvIGJlIHN5bnRoZXNpemVkLgorLy8gQHJldHVybiBUVFNfQ0FMTEJBQ0tfSEFMVCB0byBpbmRpY2F0ZSB0aGUgc3ludGhlc2lzIG11c3Qgc3RvcCwKKy8vICAgICAgICAgVFRTX0NBTExCQUNLX0NPTlRJTlVFIHRvIGluZGljYXRlIHRoZSBzeW50aGVzaXMgbXVzdCBjb250aW51ZSBpZgorLy8gICAgICAgICAgICB0aGVyZSBpcyBtb3JlIGRhdGEgdG8gcHJvZHVjZS4KK3R5cGVkZWYgYW5kcm9pZF90dHNfY2FsbGJhY2tfc3RhdHVzX3QgKCphbmRyb2lkX3R0c19zeW50aF9jYl90KQorICAgICAgICAgICAgKHZvaWQgKipwVXNlckRhdGEsCisgICAgICAgICAgICAgdWludDMyX3QgdHJhY2tTYW1wbGluZ0h6LAorICAgICAgICAgICAgIGFuZHJvaWRfdHRzX2F1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LAorICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgaW50OF90ICoqcEF1ZGlvQnVmZmVyLAorICAgICAgICAgICAgIHNpemVfdCAqcEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgYW5kcm9pZF90dHNfc3ludGhfc3RhdHVzX3Qgc3RhdHVzKTsKKworCisvLyBUaGUgdGFibGUgb2YgZnVuY3Rpb24gcG9pbnRlcnMgdGhhdCB0aGUgYW5kcm9pZF90dHNfZW5naW5lX3QgbXVzdCBwb2ludCB0by4KKy8vIE5vdGUgdGhhdCBlYWNoIG9mIHRoZXNlIGZ1bmN0aW9ucyB3aWxsIHRha2UgYSBoYW5kbGUgdG8gdGhlIGVuZ2luZSBpdHNlbGYKKy8vIGFzIHRoZWlyIGZpcnN0IHBhcmFtZXRlci4KKy8vCisKK3N0cnVjdCBhbmRyb2lkX3R0c19lbmdpbmVfZnVuY3NfdCB7CisgICAgLy8gcmVzZXJ2ZWQgZmllbGRzLCBpZ25vcmVkIGJ5IHRoZSBmcmFtZXdvcmsKKyAgICAvLyB0aGV5IG11c3QgYmUgcGxhY2VkIGhlcmUgdG8gZW5zdXJlIGJpbmFyeSBjb21wYXRpYmlsaXR5CisgICAgLy8gb2YgbGVnYWN5IGJpbmFyeSBwbHVnaW5zLgorICAgIHZvaWQgKnJlc2VydmVkWzJdOworCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgVFRTIGVuZ2luZSBhbmQgcmV0dXJucyB3aGV0aGVyIGluaXRpYWxpemF0aW9uIHN1Y2NlZWRlZC4KKyAgICAvLyBAcGFyYW0gc3ludGhEb25lQ0JQdHIgc3ludGhlc2lzIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIKKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqaW5pdCkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgYW5kcm9pZF90dHNfc3ludGhfY2JfdCBzeW50aERvbmVQdHIsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5naW5lQ29uZmlnKTsKKworICAgIC8vIFNodXQgZG93biB0aGUgVFRTIGVuZ2luZSBhbmQgcmVsZWFzZXMgYWxsIGFzc29jaWF0ZWQgcmVzb3VyY2VzLgorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpzaHV0ZG93bikKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUpOworCisgICAgLy8gSW50ZXJydXB0IHN5bnRoZXNpcyBhbmQgZmx1c2hlcyBhbnkgc3ludGhlc2l6ZWQgZGF0YSB0aGF0IGhhc24ndCBiZWVuCisgICAgLy8gb3V0cHV0IHlldC4gVGhpcyB3aWxsIGJsb2NrIHVudGlsIGNhbGxiYWNrcyB1bmRlcndheSBhcmUgY29tcGxldGVkLgorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpzdG9wKQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBsZXZlbCBvZiBzdXBwb3J0IGZvciB0aGUgbGFuZ3VhZ2UsIGNvdW50cnkgYW5kIHZhcmlhbnQuCisgICAgLy8gQHJldHVybiBUVFNfTEFOR19DT1VOVFJZX1ZBUl9BVkFJTEFCTEUgaWYgdGhlIGxhbmd1YWdlLCBjb3VudHJ5IGFuZCB2YXJpYW50IGFyZSBzdXBwb3J0ZWQsCisgICAgLy8gICAgICAgICAgICBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2VzIGFyZSBjb3JyZWN0bHkgaW5zdGFsbGVkCisgICAgLy8gICAgICAgICBUVFNfTEFOR19DT1VOVFJZX0FWQUlMQUJMRSBpZiB0aGUgbGFuZ3VhZ2UgYW5kIGNvdW50cnkgYXJlIHN1cHBvcnRlZCBhbmQgdGhlCisgICAgLy8gICAgICAgICAgICAgY29ycmVzcG9uZGluZyByZXNvdXJjZXMgYXJlIGNvcnJlY3RseSBpbnN0YWxsZWQsIGJ1dCB0aGVyZSBpcyBubyBtYXRjaCBmb3IKKyAgICAvLyAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHZhcmlhbnQKKyAgICAvLyAgICAgICAgIFRUU19MQU5HX0FWQUlMQUJMRSBpZiB0aGUgbGFuZ3VhZ2UgaXMgc3VwcG9ydGVkIGFuZCB0aGUKKyAgICAvLyAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHJlc291cmNlcyBhcmUgY29ycmVjdGx5IGluc3RhbGxlZCwgYnV0IHRoZXJlIGlzIG5vIG1hdGNoIGZvcgorICAgIC8vICAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgY291bnRyeSBhbmQgdmFyaWFudAorICAgIC8vICAgICAgICAgVFRTX0xBTkdfTUlTU0lOR19EQVRBIGlmIHRoZSByZXF1aXJlZCByZXNvdXJjZXMgdG8gcHJvdmlkZSBhbnkgbGV2ZWwgb2Ygc3VwcG9ydAorICAgIC8vICAgICAgICAgICAgIGZvciB0aGUgbGFuZ3VhZ2UgYXJlIG5vdCBjb3JyZWN0bHkgaW5zdGFsbGVkCisgICAgLy8gICAgICAgICBUVFNfTEFOR19OT1RfU1VQUE9SVEVEIGlmIHRoZSBsYW5ndWFnZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBUVFMgZW5naW5lLgorICAgIGFuZHJvaWRfdHRzX3N1cHBvcnRfcmVzdWx0X3QgKCppc0xhbmd1YWdlQXZhaWxhYmxlKQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpsYW5nLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvdW50cnksCisgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFyaWFudCk7CisKKyAgICAvLyBMb2FkIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UuIFRoZSBsb2FkZWQKKyAgICAvLyBsYW5ndWFnZSB3aWxsIG9ubHkgYmUgdXNlZCBvbmNlIGEgY2FsbCB0byBzZXRMYW5ndWFnZSgpIHdpdGggdGhlIHNhbWUKKyAgICAvLyBsYW5ndWFnZSB2YWx1ZSBpcyBpc3N1ZWQuIExhbmd1YWdlIGFuZCBjb3VudHJ5IHZhbHVlcyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBJU08gdGhyZWUKKyAgICAvLyBsZXR0ZXIgY29kZXMgZm9yIGxhbmd1YWdlcyBhbmQgY291bnRyaWVzLCBhcyBjYW4gYmUgcmV0cmlldmVkIGZyb20gYSBqYXZhLnV0aWwuTG9jYWxlCisgICAgLy8gaW5zdGFuY2UuIFRoZSB2YXJpYW50IHZhbHVlIGlzIGVuY29kZWQgYXMgdGhlIHZhcmlhbnQgc3RyaW5nIHJldHJpZXZlZCBmcm9tIGEKKyAgICAvLyBqYXZhLnV0aWwuTG9jYWxlIGluc3RhbmNlIGJ1aWx0IHdpdGggdGhhdCB2YXJpYW50IGRhdGEuCisgICAgLy8gQHBhcmFtIGxhbmcgcG9pbnRlciB0byB0aGUgSVNPIHRocmVlIGxldHRlciBjb2RlIGZvciB0aGUgbGFuZ3VhZ2UKKyAgICAvLyBAcGFyYW0gY291bnRyeSBwb2ludGVyIHRvIHRoZSBJU08gdGhyZWUgbGV0dGVyIGNvZGUgZm9yIHRoZSBjb3VudHJ5CisgICAgLy8gQHBhcmFtIHZhcmlhbnQgcG9pbnRlciB0byB0aGUgdmFyaWFudCBjb2RlCisgICAgLy8gQHJldHVybiBUVFNfU1VDQ0VTUywgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKmxvYWRMYW5ndWFnZSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqbGFuZywKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpjb3VudHJ5LAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhcmlhbnQpOworCisgICAgLy8gTG9hZCB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlLCBjb3VudHJ5IGFuZCBMb2NhbGUgdmFyaWFudC4KKyAgICAvLyBUaGUgbG9hZGVkIGxhbmd1YWdlIHdpbGwgb25seSBiZSB1c2VkIG9uY2UgYSBjYWxsIHRvIHNldExhbmd1YWdlRnJvbUxvY2FsZSgpIHdpdGggdGhlIHNhbWUKKyAgICAvLyBsYW5ndWFnZSB2YWx1ZSBpcyBpc3N1ZWQuIExhbmd1YWdlIGFuZCBjb3VudHJ5IHZhbHVlcyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBJU08gdGhyZWUKKyAgICAvLyBsZXR0ZXIgY29kZXMgZm9yIGxhbmd1YWdlcyBhbmQgY291bnRyaWVzLCBhcyBjYW4gYmUgcmV0cmlldmVkIGZyb20gYSBqYXZhLnV0aWwuTG9jYWxlCisgICAgLy8gaW5zdGFuY2UuIFRoZSB2YXJpYW50IHZhbHVlIGlzIGVuY29kZWQgYXMgdGhlIHZhcmlhbnQgc3RyaW5nIHJldHJpZXZlZCBmcm9tIGEKKyAgICAvLyBqYXZhLnV0aWwuTG9jYWxlIGluc3RhbmNlIGJ1aWx0IHdpdGggdGhhdCB2YXJpYW50IGRhdGEuCisgICAgLy8gQHBhcmFtIGxhbmcgcG9pbnRlciB0byB0aGUgSVNPIHRocmVlIGxldHRlciBjb2RlIGZvciB0aGUgbGFuZ3VhZ2UKKyAgICAvLyBAcGFyYW0gY291bnRyeSBwb2ludGVyIHRvIHRoZSBJU08gdGhyZWUgbGV0dGVyIGNvZGUgZm9yIHRoZSBjb3VudHJ5CisgICAgLy8gQHBhcmFtIHZhcmlhbnQgcG9pbnRlciB0byB0aGUgdmFyaWFudCBjb2RlCisgICAgLy8gQHJldHVybiBUVFNfU1VDQ0VTUywgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKnNldExhbmd1YWdlKQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpsYW5nLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvdW50cnksCisgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFyaWFudCk7CisKKyAgICAvLyBSZXRyaWV2ZSB0aGUgY3VycmVudGx5IHNldCBsYW5ndWFnZSwgY291bnRyeSBhbmQgdmFyaWFudCwgb3IgZW1wdHkgc3RyaW5ncyBpZiBub25lIG9mCisgICAgLy8gcGFyYW1ldGVycyBoYXZlIGJlZW4gc2V0LiBMYW5ndWFnZSBhbmQgY291bnRyeSBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlaXIgMy1sZXR0ZXIgSVNPIGNvZGUKKyAgICAvLyBAcGFyYW1bb3V0XSAgIHBvaW50ZXIgdG8gdGhlIHJldHJpZXZlZCAzLWxldHRlciBjb2RlIGxhbmd1YWdlIHZhbHVlCisgICAgLy8gQHBhcmFtW291dF0gICBwb2ludGVyIHRvIHRoZSByZXRyaWV2ZWQgMy1sZXR0ZXIgY29kZSBjb3VudHJ5IHZhbHVlCisgICAgLy8gQHBhcmFtW291dF0gICBwb2ludGVyIHRvIHRoZSByZXRyaWV2ZWQgdmFyaWFudCB2YWx1ZQorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpnZXRMYW5ndWFnZSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY2hhciAqbGFuZ3VhZ2UsCisgICAgICAgICAgICAgY2hhciAqY291bnRyeSwKKyAgICAgICAgICAgICBjaGFyICp2YXJpYW50KTsKKworICAgIC8vIE5vdGlmaWVzIHRoZSBlbmdpbmUgd2hhdCBhdWRpbyBwYXJhbWV0ZXJzIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgc3ludGhlc2lzLgorICAgIC8vIFRoaXMgaXMgbWVhbnQgdG8gYmUgdXNlZCBhcyBhIGhpbnQsIHRoZSBlbmdpbmUgaW1wbGVtZW50YXRpb24gd2lsbCBzZXQgdGhlIG91dHB1dCB2YWx1ZXMKKyAgICAvLyB0byB0aG9zZSBvZiB0aGUgc3ludGhlc2lzIGZvcm1hdCwgYmFzZWQgb24gYSBnaXZlbiBoaW50LgorICAgIC8vIEBwYXJhbVtpbm91dF0gZW5jb2RpbmcgaW46IHRoZSBkZXNpcmVkIGF1ZGlvIHNhbXBsZSBmb3JtYXQKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBvdXQ6IHRoZSBmb3JtYXQgdXNlZCBieSB0aGUgVFRTIGVuZ2luZQorICAgIC8vIEBwYXJhbVtpbm91dF0gcmF0ZSBpbjogdGhlIGRlc2lyZWQgYXVkaW8gc2FtcGxlIHJhdGUKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBvdXQ6IHRoZSBzYW1wbGUgcmF0ZSB1c2VkIGJ5IHRoZSBUVFMgZW5naW5lCisgICAgLy8gQHBhcmFtW2lub3V0XSBjaGFubmVscyBpbjogdGhlIGRlc2lyZWQgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3V0OiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHVzZWQgYnkgdGhlIFRUUyBlbmdpbmUKKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqc2V0QXVkaW9Gb3JtYXQpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGFuZHJvaWRfdHRzX2F1ZGlvX2Zvcm1hdF90KiBwRW5jb2RpbmcsCisgICAgICAgICAgICAgdWludDMyX3QqIHBSYXRlLAorICAgICAgICAgICAgIGludCogcENoYW5uZWxzKTsKKworICAgIC8vIFNldCBhIHByb3BlcnR5IGZvciB0aGUgdGhlIFRUUyBlbmdpbmUKKyAgICAvLyAic2l6ZSIgaXMgdGhlIG1heGltdW0gc2l6ZSBvZiAidmFsdWUiIGZvciBwcm9wZXJ0aWVzICJwcm9wZXJ0eSIKKyAgICAvLyBAcGFyYW0gcHJvcGVydHkgcG9pbnRlciB0byB0aGUgcHJvcGVydHkgbmFtZQorICAgIC8vIEBwYXJhbSB2YWx1ZSAgICBwb2ludGVyIHRvIHRoZSBwcm9wZXJ0eSB2YWx1ZQorICAgIC8vIEBwYXJhbSBzaXplICAgICBtYXhpbXVtIHNpemUgcmVxdWlyZWQgdG8gc3RvcmUgdGhpcyB0eXBlIG9mIHByb3BlcnR5CisgICAgLy8gQHJldHVybiAgICAgICAgIFRUU19QUk9QRVJUWV9VTlNVUFBPUlRFRCwgb3IgVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFLAorICAgIC8vICAgICAgICAgICAgICAgICAgb3IgVFRTX1ZBTFVFX0lOVkFMSUQKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKnNldFByb3BlcnR5KQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSwKKyAgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSk7CisKKyAgICAvLyBSZXRyaWV2ZSBhIHByb3BlcnR5IGZyb20gdGhlIFRUUyBlbmdpbmUKKyAgICAvLyBAcGFyYW0gICAgICAgIHByb3BlcnR5IHBvaW50ZXIgdG8gdGhlIHByb3BlcnR5IG5hbWUKKyAgICAvLyBAcGFyYW1bb3V0XSAgIHZhbHVlICAgIHBvaW50ZXIgdG8gdGhlIHJldHJpZXZlZCBsYW5ndWFnZSB2YWx1ZQorICAgIC8vIEBwYXJhbVtpbm91dF0gaW9zaXplICAgaW46IHN0b3JlcyB0aGUgc2l6ZSBhdmFpbGFibGUgdG8gc3RvcmUgdGhlCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5IHZhbHVlLgorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgb3V0OiBzdG9yZXMgdGhlIHNpemUgcmVxdWlyZWQgdG8gaG9sZCB0aGUgbGFuZ3VhZ2UKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaWYgZ2V0TGFuZ3VhZ2UoKSByZXR1cm5lZAorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBUVFNfUFJPUEVSVFlfU0laRV9UT09fU01BTEwsIHVuY2hhbmdlZCBvdGhlcndpc2UKKyAgICAvLyBAcmV0dXJuIFRUU19QUk9QRVJUWV9VTlNVUFBPUlRFRCwgb3IgVFRTX1NVQ0NFU1MsCisgICAgLy8gICAgICAgICBvciBUVFNfUFJPUEVSVFlfU0laRV9UT09fU01BTEwKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKmdldFByb3BlcnR5KQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyAgICAgICAgICAgICBjaGFyICp2YWx1ZSwKKyAgICAgICAgICAgICBzaXplX3QgKmlvc2l6ZSk7CisKKyAgICAvLyBTeW50aGVzaXplIHRoZSB0ZXh0LgorICAgIC8vIEFzIHRoZSBzeW50aGVzaXMgaXMgcGVyZm9ybWVkLCB0aGUgZW5naW5lIGludm9rZXMgdGhlIGNhbGxiYWNrIHRvIG5vdGlmeQorICAgIC8vIHRoZSBUVFMgZnJhbWV3b3JrIHRoYXQgaXQgaGFzIGZpbGxlZCB0aGUgZ2l2ZW4gYnVmZmVyLCBhbmQgaW5kaWNhdGVzIGhvdworICAgIC8vIG1hbnkgYnl0ZXMgaXQgd3JvdGUuIFRoZSBjYWxsYmFjayBpcyBjYWxsZWQgcmVwZWF0ZWRseSB1bnRpbCB0aGUgZW5naW5lCisgICAgLy8gaGFzIGdlbmVyYXRlZCBhbGwgdGhlIGF1ZGlvIGRhdGEgY29ycmVzcG9uZGluZyB0byB0aGUgdGV4dC4KKyAgICAvLyBOb3RlIGFib3V0IHRoZSBmb3JtYXQgb2YgdGhlIGlucHV0OiB0aGUgdGV4dCBwYXJhbWV0ZXIgbWF5IHVzZSB0aGUKKyAgICAvLyBmb2xsb3dpbmcgZWxlbWVudHMKKyAgICAvLyBhbmQgdGhlaXIgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIFNTTUwgMS4wIHNwZWNpZmljYXRpb246CisgICAgLy8gICAgKiBsYW5nCisgICAgLy8gICAgKiBzYXktYXM6CisgICAgLy8gICAgICAgICAgbyBpbnRlcnByZXQtYXMKKyAgICAvLyAgICAqIHBob25lbWUKKyAgICAvLyAgICAqIHZvaWNlOgorICAgIC8vICAgICAgICAgIG8gZ2VuZGVyLAorICAgIC8vICAgICAgICAgIG8gYWdlLAorICAgIC8vICAgICAgICAgIG8gdmFyaWFudCwKKyAgICAvLyAgICAgICAgICBvIG5hbWUKKyAgICAvLyAgICAqIGVtcGhhc2lzCisgICAgLy8gICAgKiBicmVhazoKKyAgICAvLyAgICAgICAgICBvIHN0cmVuZ3RoLAorICAgIC8vICAgICAgICAgIG8gdGltZQorICAgIC8vICAgICogcHJvc29keToKKyAgICAvLyAgICAgICAgICBvIHBpdGNoLAorICAgIC8vICAgICAgICAgIG8gY29udG91ciwKKyAgICAvLyAgICAgICAgICBvIHJhbmdlLAorICAgIC8vICAgICAgICAgIG8gcmF0ZSwKKyAgICAvLyAgICAgICAgICBvIGR1cmF0aW9uLAorICAgIC8vICAgICAgICAgIG8gdm9sdW1lCisgICAgLy8gICAgKiBtYXJrCisgICAgLy8gRGlmZmVyZW5jZXMgYmV0d2VlbiB0aGlzIHRleHQgZm9ybWF0IGFuZCBTU01MIGFyZToKKyAgICAvLyAgICAqIGZ1bGwgU1NNTCBkb2N1bWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAvLyAgICAqIG5hbWVzcGFjZXMgYXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAvLyBUZXh0IGlzIGNvZGVkIGluIFVURi04LgorICAgIC8vIEBwYXJhbSB0ZXh0ICAgICAgdGhlIFVURi04IHRleHQgdG8gc3ludGhlc2l6ZQorICAgIC8vIEBwYXJhbSB1c2VyZGF0YSAgcG9pbnRlciB0byBiZSByZXR1cm5lZCB3aGVuIHRoZSBjYWxsIGlzIGludm9rZWQKKyAgICAvLyBAcGFyYW0gYnVmZmVyICAgIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgc3ludGhlc2l6ZWQgZGF0YSBtdXN0IGJlIHdyaXR0ZW4KKyAgICAvLyBAcGFyYW0gYnVmZmVyU2l6ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gaW4gYnVmZmVyCisgICAgLy8gQHJldHVybiAgICAgICAgICBUVFNfU1VDQ0VTUyBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqc3ludGhlc2l6ZVRleHQpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRleHQsCisgICAgICAgICAgICAgaW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCisgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEFORFJPSURfVFRTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvZWdsLmNwcCBiL29wZW5nbC9saWJhZ2wvZWdsLmNwcAppbmRleCA0NjBiNzRmLi4yMzlkYzA1IDEwMDY0NAotLS0gYS9vcGVuZ2wvbGliYWdsL2VnbC5jcHAKKysrIGIvb3BlbmdsL2xpYmFnbC9lZ2wuY3BwCkBAIC0xOTY5LDcgKzE5NjksNyBAQAogICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKICAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKICAgICAvLyBUT0RPOiBlZ2xTd2FwSW50ZXJ2YWwoKQotICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgRUdMX0ZBTFNFKTsKKyAgICByZXR1cm4gRUdMX1RSVUU7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0VHTC9lZ2wuY3BwIGIvb3BlbmdsL2xpYnMvRUdML2VnbC5jcHAKaW5kZXggMmQxYTI3OC4uYmM5NDRhMCAxMDA2NDQKLS0tIGEvb3BlbmdsL2xpYnMvRUdML2VnbC5jcHAKKysrIGIvb3BlbmdsL2xpYnMvRUdML2VnbC5jcHAKQEAgLTU5LDYgKzU5LDggQEAKICAgICAgICAgIkVHTF9LSFJfaW1hZ2UgIgogICAgICAgICAiRUdMX0tIUl9pbWFnZV9iYXNlICIKICAgICAgICAgIkVHTF9LSFJfaW1hZ2VfcGl4bWFwICIKKyAgICAgICAgIkVHTF9LSFJfZ2xfdGV4dHVyZV8yRF9pbWFnZSAiCisgICAgICAgICJFR0xfS0hSX2ZlbmNlX3N5bmMgIgogICAgICAgICAiRUdMX0FORFJPSURfaW1hZ2VfbmF0aXZlX2J1ZmZlciAiCiAgICAgICAgICJFR0xfQU5EUk9JRF9zd2FwX3JlY3RhbmdsZSAiCiAgICAgICAgIDsKQEAgLTI0Myw5ICsyNDUsMjMgQEAKICAgICBFR0xJbWFnZUtIUiBpbWFnZXNbSU1QTF9OVU1fSU1QTEVNRU5UQVRJT05TXTsKIH07CiAKK3N0cnVjdCBlZ2xfc3luY190IDogcHVibGljIGVnbF9vYmplY3RfdAoreworICAgIHR5cGVkZWYgZWdsX29iamVjdF90OjpMb2NhbFJlZjxlZ2xfc3luY190LCBFR0xTeW5jS0hSPiBSZWY7CisKKyAgICBlZ2xfc3luY190KEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGNvbnRleHQsIEVHTFN5bmNLSFIgc3luYykKKyAgICAgICAgOiBkcHkoZHB5KSwgY29udGV4dChjb250ZXh0KSwgc3luYyhzeW5jKQorICAgIHsKKyAgICB9CisgICAgRUdMRGlzcGxheSBkcHk7CisgICAgRUdMQ29udGV4dCBjb250ZXh0OworICAgIEVHTFN5bmNLSFIgc3luYzsKK307CisKIHR5cGVkZWYgZWdsX3N1cmZhY2VfdDo6UmVmICBTdXJmYWNlUmVmOwogdHlwZWRlZiBlZ2xfY29udGV4dF90OjpSZWYgIENvbnRleHRSZWY7CiB0eXBlZGVmIGVnbF9pbWFnZV90OjpSZWYgICAgSW1hZ2VSZWY7Cit0eXBlZGVmIGVnbF9zeW5jX3Q6OlJlZiAgICAgU3luY1JlZjsKIAogc3RydWN0IHRsc190CiB7CkBAIC00ODMsNiArNDk5LDExIEBACiAgICAgcmV0dXJuIGVnbF90b19uYXRpdmVfY2FzdDxlZ2xfaW1hZ2VfdD4oaW1hZ2UpOwogfQogCitzdGF0aWMgaW5saW5lCitlZ2xfc3luY190KiBnZXRfc3luYyhFR0xTeW5jS0hSIHN5bmMpIHsKKyAgICByZXR1cm4gZWdsX3RvX25hdGl2ZV9jYXN0PGVnbF9zeW5jX3Q+KHN5bmMpOworfQorCiBzdGF0aWMgZWdsX2Nvbm5lY3Rpb25fdCogdmFsaWRhdGVfZGlzcGxheV9jb25maWcoCiAgICAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAogICAgICAgICBlZ2xfZGlzcGxheV90IGNvbnN0KiYgZHApCkBAIC0xNzkwLDYgKzE4MTEsMTExIEBACiAgICAgIHJldHVybiBFR0xfVFJVRTsKIH0KIAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRUdMX0VHTEVYVF9WRVJTSU9OIDUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitFR0xTeW5jS0hSIGVnbENyZWF0ZVN5bmNLSFIoRUdMRGlzcGxheSBkcHksIEVHTGVudW0gdHlwZSwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICBFR0xDb250ZXh0IGN0eCA9IGVnbEdldEN1cnJlbnRDb250ZXh0KCk7CisgICAgQ29udGV4dFJlZiBfYyhjdHgpOworICAgIGlmICghX2MuZ2V0KCkpIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTlRFWFQsIEVHTF9OT19TWU5DX0tIUik7CisgICAgaWYgKCF2YWxpZGF0ZV9kaXNwbGF5X2NvbnRleHQoZHB5LCBjdHgpKQorICAgICAgICByZXR1cm4gRUdMX05PX1NZTkNfS0hSOworICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IGdldF9kaXNwbGF5KGRweSk7CisgICAgZWdsX2NvbnRleHRfdCAqIGNvbnN0IGMgPSBnZXRfY29udGV4dChjdHgpOworICAgIEVHTFN5bmNLSFIgcmVzdWx0ID0gRUdMX05PX1NZTkNfS0hSOworICAgIGlmIChjLT5jbngtPmVnbC5lZ2xDcmVhdGVTeW5jS0hSKSB7CisgICAgICAgIEVHTFN5bmNLSFIgc3luYyA9IGMtPmNueC0+ZWdsLmVnbENyZWF0ZVN5bmNLSFIoCisgICAgICAgICAgICAgICAgZHAtPmRpc3BbYy0+aW1wbF0uZHB5LCB0eXBlLCBhdHRyaWJfbGlzdCk7CisgICAgICAgIGlmIChzeW5jID09IEVHTF9OT19TWU5DX0tIUikKKyAgICAgICAgICAgIHJldHVybiBzeW5jOworICAgICAgICByZXN1bHQgPSAoZWdsX3N5bmNfdCopbmV3IGVnbF9zeW5jX3QoZHB5LCBjdHgsIHN5bmMpOworICAgIH0KKyAgICByZXR1cm4gKEVHTFN5bmNLSFIpcmVzdWx0OworfQorCitFR0xCb29sZWFuIGVnbERlc3Ryb3lTeW5jS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jS0hSIHN5bmMpCit7CisgICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKKyAgICBpZiAoZHAgPT0gMCkgeworICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgIH0KKworICAgIFN5bmNSZWYgX3Moc3luYyk7CisgICAgaWYgKCFfcy5nZXQoKSkgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfRkFMU0UpOworICAgIGVnbF9zeW5jX3QqIHN5bmNPYmplY3QgPSBnZXRfc3luYyhzeW5jKTsKKworICAgIEVHTENvbnRleHQgY3R4ID0gc3luY09iamVjdC0+Y29udGV4dDsKKyAgICBDb250ZXh0UmVmIF9jKGN0eCk7CisgICAgaWYgKCFfYy5nZXQoKSkgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQ09OVEVYVCwgRUdMX0ZBTFNFKTsKKyAgICBpZiAoIXZhbGlkYXRlX2Rpc3BsYXlfY29udGV4dChkcHksIGN0eCkpCisgICAgICAgIHJldHVybiBFR0xfRkFMU0U7CisKKyAgICBlZ2xfY29udGV4dF90ICogY29uc3QgYyA9IGdldF9jb250ZXh0KGN0eCk7CisKKyAgICBpZiAoYy0+Y254LT5lZ2wuZWdsRGVzdHJveVN5bmNLSFIpIHsKKyAgICAgICAgcmV0dXJuIGMtPmNueC0+ZWdsLmVnbERlc3Ryb3lTeW5jS0hSKAorICAgICAgICAgICAgICAgIGRwLT5kaXNwW2MtPmltcGxdLmRweSwgc3luY09iamVjdC0+c3luYyk7CisgICAgfQorCisgICAgcmV0dXJuIEVHTF9GQUxTRTsKK30KKworRUdMaW50IGVnbENsaWVudFdhaXRTeW5jS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jS0hSIHN5bmMsIEVHTGludCBmbGFncywgRUdMVGltZUtIUiB0aW1lb3V0KQoreworICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IGdldF9kaXNwbGF5KGRweSk7CisgICAgaWYgKGRwID09IDApIHsKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKKyAgICB9CisKKyAgICBTeW5jUmVmIF9zKHN5bmMpOworICAgIGlmICghX3MuZ2V0KCkpIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgRUdMX0ZBTFNFKTsKKyAgICBlZ2xfc3luY190KiBzeW5jT2JqZWN0ID0gZ2V0X3N5bmMoc3luYyk7CisKKyAgICBFR0xDb250ZXh0IGN0eCA9IHN5bmNPYmplY3QtPmNvbnRleHQ7CisgICAgQ29udGV4dFJlZiBfYyhjdHgpOworICAgIGlmICghX2MuZ2V0KCkpIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTlRFWFQsIEVHTF9GQUxTRSk7CisgICAgaWYgKCF2YWxpZGF0ZV9kaXNwbGF5X2NvbnRleHQoZHB5LCBjdHgpKQorICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOworCisgICAgZWdsX2NvbnRleHRfdCAqIGNvbnN0IGMgPSBnZXRfY29udGV4dChjdHgpOworCisgICAgaWYgKGMtPmNueC0+ZWdsLmVnbENsaWVudFdhaXRTeW5jS0hSKSB7CisgICAgICAgIHJldHVybiBjLT5jbngtPmVnbC5lZ2xDbGllbnRXYWl0U3luY0tIUigKKyAgICAgICAgICAgICAgICBkcC0+ZGlzcFtjLT5pbXBsXS5kcHksIHN5bmNPYmplY3QtPnN5bmMsIGZsYWdzLCB0aW1lb3V0KTsKKyAgICB9CisKKyAgICByZXR1cm4gRUdMX0ZBTFNFOworfQorCitFR0xCb29sZWFuIGVnbEdldFN5bmNBdHRyaWJLSFIoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYywgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSkKK3sKKyAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSBnZXRfZGlzcGxheShkcHkpOworICAgIGlmIChkcCA9PSAwKSB7CisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisgICAgfQorCisgICAgU3luY1JlZiBfcyhzeW5jKTsKKyAgICBpZiAoIV9zLmdldCgpKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9GQUxTRSk7CisgICAgZWdsX3N5bmNfdCogc3luY09iamVjdCA9IGdldF9zeW5jKHN5bmMpOworCisgICAgRUdMQ29udGV4dCBjdHggPSBzeW5jT2JqZWN0LT5jb250ZXh0OworICAgIENvbnRleHRSZWYgX2MoY3R4KTsKKyAgICBpZiAoIV9jLmdldCgpKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05URVhULCBFR0xfRkFMU0UpOworICAgIGlmICghdmFsaWRhdGVfZGlzcGxheV9jb250ZXh0KGRweSwgY3R4KSkKKyAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKKworICAgIGVnbF9jb250ZXh0X3QgKiBjb25zdCBjID0gZ2V0X2NvbnRleHQoY3R4KTsKKworICAgIGlmIChjLT5jbngtPmVnbC5lZ2xHZXRTeW5jQXR0cmliS0hSKSB7CisgICAgICAgIHJldHVybiBjLT5jbngtPmVnbC5lZ2xHZXRTeW5jQXR0cmliS0hSKAorICAgICAgICAgICAgICAgIGRwLT5kaXNwW2MtPmltcGxdLmRweSwgc3luY09iamVjdC0+c3luYywgYXR0cmlidXRlLCB2YWx1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIEVHTF9GQUxTRTsKK30KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQU5EUk9JRCBleHRlbnNpb25zCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9FR0wvZWdsX2VudHJpZXMuaW4gYi9vcGVuZ2wvbGlicy9FR0wvZWdsX2VudHJpZXMuaW4KaW5kZXggNWQ4OTI4Ny4uNjNjM2MxOSAxMDA2NDQKLS0tIGEvb3BlbmdsL2xpYnMvRUdML2VnbF9lbnRyaWVzLmluCisrKyBiL29wZW5nbC9saWJzL0VHTC9lZ2xfZW50cmllcy5pbgpAQCAtNTEsNiArNTEsMTMgQEAKIEVHTF9FTlRSWShFR0xJbWFnZUtIUiwgZWdsQ3JlYXRlSW1hZ2VLSFIsICAgRUdMRGlzcGxheSwgRUdMQ29udGV4dCwgRUdMZW51bSwgRUdMQ2xpZW50QnVmZmVyLCBjb25zdCBFR0xpbnQgKikKIEVHTF9FTlRSWShFR0xCb29sZWFuLCAgZWdsRGVzdHJveUltYWdlS0hSLCAgRUdMRGlzcGxheSwgRUdMSW1hZ2VLSFIpCiAKKy8qIEVHTF9FR0xFWFRfVkVSU0lPTiA1ICovCisKK0VHTF9FTlRSWShFR0xTeW5jS0hSLCAgIGVnbENyZWF0ZVN5bmNLSFIsICAgICAgIEVHTERpc3BsYXksIEVHTGVudW0sIGNvbnN0IEVHTGludCAqKQorRUdMX0VOVFJZKEVHTEJvb2xlYW4sICAgZWdsRGVzdHJveVN5bmNLSFIsICAgICAgRUdMRGlzcGxheSwgRUdMU3luY0tIUikKK0VHTF9FTlRSWShFR0xpbnQsICAgICAgIGVnbENsaWVudFdhaXRTeW5jS0hSLCAgIEVHTERpc3BsYXksIEVHTFN5bmNLSFIsIEVHTGludCwgRUdMVGltZUtIUikKK0VHTF9FTlRSWShFR0xCb29sZWFuLCAgIGVnbEdldFN5bmNBdHRyaWJLSFIsICAgIEVHTERpc3BsYXksIEVHTFN5bmNLSFIsIEVHTGludCwgRUdMaW50ICopCisKIC8qIEFORFJPSUQgZXh0ZW5zaW9ucyAqLwogCiBFR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsU2V0U3dhcFJlY3RhbmdsZUFORFJPSUQsIEVHTERpc3BsYXksIEVHTFN1cmZhY2UsIEVHTGludCwgRUdMaW50LCBFR0xpbnQsIEVHTGludCkKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVMyL2dsMi5jcHAgYi9vcGVuZ2wvbGlicy9HTEVTMi9nbDIuY3BwCmluZGV4IDE4ZGQ0ODMuLmZlZTQ2MDkgMTAwNjQ0Ci0tLSBhL29wZW5nbC9saWJzL0dMRVMyL2dsMi5jcHAKKysrIGIvb3BlbmdsL2xpYnMvR0xFUzIvZ2wyLmNwcApAQCAtMzksNiArMzksOCBAQAogI3VuZGVmIENBTExfR0xfQVBJCiAjdW5kZWYgQ0FMTF9HTF9BUElfUkVUVVJOCiAKKyNkZWZpbmUgREVCVUdfQ0FMTF9HTF9BUEkgMAorCiAjaWYgVVNFX0ZBU1RfVExTX0tFWQogCiAgICAgI2lmZGVmIEhBVkVfQVJNX1RMU19SRUdJU1RFUgpAQCAtNzQsMTAgKzc2LDI0IEBACiAKICAgICAjZGVmaW5lIEFQSV9FTlRSWShfYXBpKSBfYXBpCiAKKyNpZiBERUJVR19DQUxMX0dMX0FQSQorCiAgICAgI2RlZmluZSBDQUxMX0dMX0FQSShfYXBpLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBnbF9ob29rc190OjpnbF90IGNvbnN0ICogY29uc3QgX2MgPSAmZ2V0R2xUaHJlYWRTcGVjaWZpYygpLT5nbDsgIFwKLSAgICAgICAgX2MtPl9hcGkoX19WQV9BUkdTX18pCi0gICAgCisgICAgICAgIF9jLT5fYXBpKF9fVkFfQVJHU19fKTsgXAorICAgICAgICBHTGVudW0gc3RhdHVzID0gR0xfTk9fRVJST1I7IFwKKyAgICAgICAgd2hpbGUgKChzdGF0dXMgPSBnbEdldEVycm9yKCkpICE9IEdMX05PX0VSUk9SKSB7IFwKKyAgICAgICAgICAgIExPR0QoIlsiICNfYXBpICJdIDB4JXgiLCBzdGF0dXMpOyBcCisgICAgICAgIH0KKworI2Vsc2UKKworICAgICNkZWZpbmUgQ0FMTF9HTF9BUEkoX2FwaSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ2xfaG9va3NfdDo6Z2xfdCBjb25zdCAqIGNvbnN0IF9jID0gJmdldEdsVGhyZWFkU3BlY2lmaWMoKS0+Z2w7ICBcCisgICAgICAgIF9jLT5fYXBpKF9fVkFfQVJHU19fKTsKKworI2VuZGlmCisKICAgICAjZGVmaW5lIENBTExfR0xfQVBJX1JFVFVSTihfYXBpLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGdsX2hvb2tzX3Q6OmdsX3QgY29uc3QgKiBjb25zdCBfYyA9ICZnZXRHbFRocmVhZFNwZWNpZmljKCktPmdsOyAgXAogICAgICAgICByZXR1cm4gX2MtPl9hcGkoX19WQV9BUkdTX18pCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzY0N2NhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIwIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJZ2wyX3BlcmYuY3BwIFwKKwlmaWxsdGVzdC5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY3V0aWxzIFwKKyAgICBsaWJFR0wgXAorICAgIGxpYkdMRVN2MiBcCisgICAgbGlidWkKKworTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtZ2wyX3BlcmYKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfQ0ZMQUdTIDo9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUworCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZpbGxfY29tbW9uLmNwcCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZpbGxfY29tbW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDY5ZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZmlsbF9jb21tb24uY3BwCkBAIC0wLDAgKzEsMjk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImZyYWdtZW50X3NoYWRlcnMuY3BwIgorCitGSUxFICogZk91dCA9IE5VTEw7Cit2b2lkIHB0U3dhcCgpOworCitzdGF0aWMgY2hhciBnQ3VycmVudFRlc3ROYW1lWzEwMjRdOworc3RhdGljIHVpbnQzMl90IGdXaWR0aCA9IDA7CitzdGF0aWMgdWludDMyX3QgZ0hlaWdodCA9IDA7CisKK3N0YXRpYyB2b2lkIGNoZWNrR2xFcnJvcihjb25zdCBjaGFyKiBvcCkgeworICAgIGZvciAoR0xpbnQgZXJyb3IgPSBnbEdldEVycm9yKCk7IGVycm9yOyBlcnJvcgorICAgICAgICAgICAgPSBnbEdldEVycm9yKCkpIHsKKyAgICAgICAgTE9HRSgiYWZ0ZXIgJXMoKSBnbEVycm9yICgweCV4KVxuIiwgb3AsIGVycm9yKTsKKyAgICB9Cit9CisKK0dMdWludCBsb2FkU2hhZGVyKEdMZW51bSBzaGFkZXJUeXBlLCBjb25zdCBjaGFyKiBwU291cmNlKSB7CisgICAgR0x1aW50IHNoYWRlciA9IGdsQ3JlYXRlU2hhZGVyKHNoYWRlclR5cGUpOworICAgIGlmIChzaGFkZXIpIHsKKyAgICAgICAgZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmcFNvdXJjZSwgTlVMTCk7CisgICAgICAgIGdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOworICAgICAgICBHTGludCBjb21waWxlZCA9IDA7CisgICAgICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJmNvbXBpbGVkKTsKKyAgICAgICAgaWYgKCFjb21waWxlZCkgeworICAgICAgICAgICAgR0xpbnQgaW5mb0xlbiA9IDA7CisgICAgICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7CisgICAgICAgICAgICBpZiAoaW5mb0xlbikgeworICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGluZm9MZW4pOworICAgICAgICAgICAgICAgIGlmIChidWYpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgaW5mb0xlbiwgTlVMTCwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiQ291bGQgbm90IGNvbXBpbGUgc2hhZGVyICVkOlxuJXNcbiIsIHNoYWRlclR5cGUsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKKyAgICAgICAgICAgICAgICBzaGFkZXIgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzaGFkZXI7Cit9CisKK2VudW0geworICAgIEFfUE9TLAorICAgIEFfQ09MT1IsCisgICAgQV9URVgwLAorICAgIEFfVEVYMQorfTsKKworR0x1aW50IGNyZWF0ZVByb2dyYW0oY29uc3QgY2hhciogcFZlcnRleFNvdXJjZSwgY29uc3QgY2hhciogcEZyYWdtZW50U291cmNlKSB7CisgICAgR0x1aW50IHZlcnRleFNoYWRlciA9IGxvYWRTaGFkZXIoR0xfVkVSVEVYX1NIQURFUiwgcFZlcnRleFNvdXJjZSk7CisgICAgaWYgKCF2ZXJ0ZXhTaGFkZXIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgR0x1aW50IHBpeGVsU2hhZGVyID0gbG9hZFNoYWRlcihHTF9GUkFHTUVOVF9TSEFERVIsIHBGcmFnbWVudFNvdXJjZSk7CisgICAgaWYgKCFwaXhlbFNoYWRlcikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBHTHVpbnQgcHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbSgpOworICAgIGlmIChwcm9ncmFtKSB7CisgICAgICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHZlcnRleFNoYWRlcik7CisgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xBdHRhY2hTaGFkZXIgdiIpOworICAgICAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCBwaXhlbFNoYWRlcik7CisgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xBdHRhY2hTaGFkZXIgcCIpOworCisgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIEFfUE9TLCAiYV9wb3MiKTsKKyAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgQV9DT0xPUiwgImFfY29sb3IiKTsKKyAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgQV9URVgwLCAiYV90ZXgwIik7CisgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIEFfVEVYMSwgImFfdGV4MSIpOworICAgICAgICBnbExpbmtQcm9ncmFtKHByb2dyYW0pOworICAgICAgICBHTGludCBsaW5rU3RhdHVzID0gR0xfRkFMU0U7CisgICAgICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0xJTktfU1RBVFVTLCAmbGlua1N0YXR1cyk7CisgICAgICAgIGlmIChsaW5rU3RhdHVzICE9IEdMX1RSVUUpIHsKKyAgICAgICAgICAgIEdMaW50IGJ1Zkxlbmd0aCA9IDA7CisgICAgICAgICAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9JTkZPX0xPR19MRU5HVEgsICZidWZMZW5ndGgpOworICAgICAgICAgICAgaWYgKGJ1Zkxlbmd0aCkgeworICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGJ1Zkxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZikgeworICAgICAgICAgICAgICAgICAgICBnbEdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0sIGJ1Zkxlbmd0aCwgTlVMTCwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiQ291bGQgbm90IGxpbmsgcHJvZ3JhbTpcbiVzXG4iLCBidWYpOworICAgICAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOworICAgICAgICAgICAgcHJvZ3JhbSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgY2hlY2tHbEVycm9yKCJjcmVhdGVQcm9ncmFtIik7CisgICAgZ2xVc2VQcm9ncmFtKHByb2dyYW0pOworICAgIHJldHVybiBwcm9ncmFtOworfQorCit1aW50NjRfdCBnZXRUaW1lKCkgeworICAgIHN0cnVjdCB0aW1lc3BlYyB0OworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdCk7CisgICAgcmV0dXJuIHQudHZfbnNlYyArICgodWludDY0X3QpdC50dl9zZWMgKiAxMDAwICogMTAwMCAqIDEwMDApOworfQorCit1aW50NjRfdCBnVGltZTsKK3ZvaWQgc3RhcnRUaW1lcigpIHsKKyAgICBnVGltZSA9IGdldFRpbWUoKTsKK30KKworCitzdGF0aWMgdm9pZCBlbmRUaW1lcihpbnQgY291bnQpIHsKKyAgICB1aW50NjRfdCB0MiA9IGdldFRpbWUoKTsKKyAgICBkb3VibGUgZGVsdGEgPSAoKGRvdWJsZSkodDIgLSBnVGltZSkpIC8gMTAwMDAwMDAwMDsKKyAgICBkb3VibGUgcGl4ZWxzID0gKGdXaWR0aCAqIGdIZWlnaHQpICogY291bnQ7CisgICAgZG91YmxlIG1wcHMgPSBwaXhlbHMgLyBkZWx0YSAvIDEwMDAwMDA7CisgICAgZG91YmxlIGRjNjAgPSAoKGRvdWJsZSljb3VudCkgLyBkZWx0YSAvIDYwOworCisgICAgaWYgKGZPdXQpIHsKKyAgICAgICAgZnByaW50ZihmT3V0LCAiJXMsICVmLCAlZlxyXG4iLCBnQ3VycmVudFRlc3ROYW1lLCBtcHBzLCBkYzYwKTsKKyAgICAgICAgZmZsdXNoKGZPdXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXMsICVmLCAlZlxuIiwgZ0N1cnJlbnRUZXN0TmFtZSwgbXBwcywgZGM2MCk7CisgICAgfQorICAgIExPR0koIiVzLCAlZiwgJWZcclxuIiwgZ0N1cnJlbnRUZXN0TmFtZSwgbXBwcywgZGM2MCk7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgZ1ZlcnRleFNoYWRlcltdID0KKyAgICAiYXR0cmlidXRlIHZlYzQgYV9wb3M7XG4iCisgICAgImF0dHJpYnV0ZSB2ZWM0IGFfY29sb3I7XG4iCisgICAgImF0dHJpYnV0ZSB2ZWMyIGFfdGV4MDtcbiIKKyAgICAiYXR0cmlidXRlIHZlYzIgYV90ZXgxO1xuIgorICAgICJ2YXJ5aW5nIHZlYzQgdl9jb2xvcjtcbiIKKyAgICAidmFyeWluZyB2ZWMyIHZfdGV4MDtcbiIKKyAgICAidmFyeWluZyB2ZWMyIHZfdGV4MTtcbiIKKyAgICAidW5pZm9ybSB2ZWMyIHVfdGV4T2ZmO1xuIgorCisgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAiICAgIHZfY29sb3IgPSBhX2NvbG9yO1xuIgorICAgICIgICAgdl90ZXgwID0gYV90ZXgwO1xuIgorICAgICIgICAgdl90ZXgxID0gYV90ZXgxO1xuIgorICAgICIgICAgdl90ZXgwLnggKz0gdV90ZXhPZmYueDtcbiIKKyAgICAiICAgIHZfdGV4MS55ICs9IHVfdGV4T2ZmLnk7XG4iCisgICAgIiAgICBnbF9Qb3NpdGlvbiA9IGFfcG9zO1xuIgorICAgICJ9XG4iOworCitzdGF0aWMgdm9pZCBzZXR1cFZBKCkgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCB2dHhbXSA9IHsKKyAgICAgICAgLTEuMGYsLTEuMGYsCisgICAgICAgICAxLjBmLC0xLjBmLAorICAgICAgICAtMS4wZiwgMS4wZiwKKyAgICAgICAgIDEuMGYsIDEuMGYgfTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgY29sb3JbXSA9IHsKKyAgICAgICAgMS4wZiwwLjBmLDEuMGYsMS4wZiwKKyAgICAgICAgMC4wZiwwLjBmLDEuMGYsMS4wZiwKKyAgICAgICAgMS4wZiwxLjBmLDAuMGYsMS4wZiwKKyAgICAgICAgMS4wZiwxLjBmLDEuMGYsMS4wZiB9OworICAgIHN0YXRpYyBjb25zdCBmbG9hdCB0ZXgwW10gPSB7CisgICAgICAgIDAuMGYsMC4wZiwKKyAgICAgICAgMS4wZiwwLjBmLAorICAgICAgICAwLjBmLDEuMGYsCisgICAgICAgIDEuMGYsMS4wZiB9OworICAgIHN0YXRpYyBjb25zdCBmbG9hdCB0ZXgxW10gPSB7CisgICAgICAgIDEuMGYsMC4wZiwKKyAgICAgICAgMS4wZiwxLjBmLAorICAgICAgICAwLjBmLDEuMGYsCisgICAgICAgIDAuMGYsMC4wZiB9OworCisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShBX1BPUyk7CisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShBX0NPTE9SKTsKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KEFfVEVYMCk7CisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShBX1RFWDEpOworCisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKEFfUE9TLCAyLCBHTF9GTE9BVCwgZmFsc2UsIDgsIHZ0eCk7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKEFfQ09MT1IsIDQsIEdMX0ZMT0FULCBmYWxzZSwgMTYsIGNvbG9yKTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoQV9URVgwLCAyLCBHTF9GTE9BVCwgZmFsc2UsIDgsIHRleDApOworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihBX1RFWDEsIDIsIEdMX0ZMT0FULCBmYWxzZSwgOCwgdGV4MSk7Cit9CisKK3N0YXRpYyB2b2lkIHJhbmRVbmlmb3JtKGludCBwZ20sIGNvbnN0IGNoYXIgKnZhcikgeworICAgIGludCBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwZ20sIHZhcik7CisgICAgaWYgKGxvYyA+PSAwKSB7CisgICAgICAgIGZsb2F0IHggPSAoKGZsb2F0KXJhbmQoKSkgLyBSQU5EX01BWDsKKyAgICAgICAgZmxvYXQgeSA9ICgoZmxvYXQpcmFuZCgpKSAvIFJBTkRfTUFYOworICAgICAgICBmbG9hdCB6ID0gKChmbG9hdClyYW5kKCkpIC8gUkFORF9NQVg7CisgICAgICAgIGZsb2F0IHcgPSAoKGZsb2F0KXJhbmQoKSkgLyBSQU5EX01BWDsKKyAgICAgICAgZ2xVbmlmb3JtNGYobG9jLCB4LCB5LCB6LCB3KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRvTG9vcChib29sIHdhcm11cCwgaW50IHBnbSwgdWludDMyX3QgcGFzc0NvdW50KSB7CisgICAgaWYgKHdhcm11cCkgeworICAgICAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX1NUUklQLCAwLCA0KTsKKyAgICAgICAgcHRTd2FwKCk7CisgICAgICAgIGdsRmluaXNoKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGFydFRpbWVyKCk7CisgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IHBhc3NDb3VudDsgY3QrKykgeworICAgICAgICBpbnQgbG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocGdtLCAidV90ZXhPZmYiKTsKKyAgICAgICAgZ2xVbmlmb3JtMmYobG9jLCAoKGZsb2F0KWN0KSAvIHBhc3NDb3VudCwgKChmbG9hdCljdCkgLyAyLmYgLyBwYXNzQ291bnQpOworCisgICAgICAgIHJhbmRVbmlmb3JtKHBnbSwgInVfY29sb3IiKTsKKyAgICAgICAgcmFuZFVuaWZvcm0ocGdtLCAidV8wIik7CisgICAgICAgIHJhbmRVbmlmb3JtKHBnbSwgInVfMSIpOworICAgICAgICByYW5kVW5pZm9ybShwZ20sICJ1XzIiKTsKKyAgICAgICAgcmFuZFVuaWZvcm0ocGdtLCAidV8zIik7CisgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgNCk7CisgICAgfQorICAgIHB0U3dhcCgpOworICAgIGdsRmluaXNoKCk7CisgICAgZW5kVGltZXIocGFzc0NvdW50KTsKK30KKworCitzdGF0aWMgdWludDMyX3QgcmdiKHVpbnQzMl90IHIsIHVpbnQzMl90IGcsIHVpbnQzMl90IGIpCit7CisgICAgdWludDMyX3QgcmV0ID0gMHhmZjAwMDAwMDsKKyAgICByZXQgfD0gciAmIDB4ZmY7CisgICAgcmV0IHw9IChnICYgMHhmZikgPDwgODsKKyAgICByZXQgfD0gKGIgJiAweGZmKSA8PCAxNjsKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIGdlblRleHR1cmVzKCkgeworICAgIHVpbnQzMl90ICptID0gKHVpbnQzMl90ICopbWFsbG9jKDEwMjQqMTAyNCo0KTsKKyAgICBmb3IgKGludCB5PTA7IHkgPCAxMDI0OyB5KyspeworICAgICAgICBmb3IgKGludCB4PTA7IHggPCAxMDI0OyB4KyspeworICAgICAgICAgICAgbVt5KjEwMjQgKyB4XSA9IHJnYih4LCAoKCh4K3kpICYgMHhmZikgPT0gMHg3ZikgKiAweGZmLCB5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDEpOworICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCAxMDI0LCAxMDI0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBtKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9SRVBFQVQpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfUkVQRUFUKTsKKworICAgIGZvciAoaW50IHk9MDsgeSA8IDE2OyB5KyspeworICAgICAgICBmb3IgKGludCB4PTA7IHggPCAxNjsgeCsrKXsKKyAgICAgICAgICAgIG1beSoxNiArIHhdID0gcmdiKHggPDwgNCwgKCgoeCt5KSAmIDB4ZikgPT0gMHg3KSAqIDB4ZmYsIHkgPDwgNCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAyKTsKKyAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgMTYsIDE2LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBtKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9SRVBFQVQpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfUkVQRUFUKTsKKyAgICBmcmVlKG0pOworfQorCitzdGF0aWMgdm9pZCBkb1NpbmdsZVRlc3QodWludDMyX3QgcGdtTnVtLCBpbnQgdGV4KSB7CisgICAgY29uc3QgY2hhciAqcGdtVHh0ID0gZ0ZyYWdtZW50VGVzdHNbcGdtTnVtXS0+dHh0OworICAgIGludCBwZ20gPSBjcmVhdGVQcm9ncmFtKGdWZXJ0ZXhTaGFkZXIsIHBnbVR4dCk7CisgICAgaWYgKCFwZ20pIHsKKyAgICAgICAgcHJpbnRmKCJlcnJvciBydW5uaW5nIHRlc3RcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludCBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwZ20sICJ1X3RleDAiKTsKKyAgICBpZiAobG9jID49IDApIGdsVW5pZm9ybTFpKGxvYywgMCk7CisgICAgbG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocGdtLCAidV90ZXgxIik7CisgICAgaWYgKGxvYyA+PSAwKSBnbFVuaWZvcm0xaShsb2MsIDEpOworCisKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4KTsKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTEpOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4KTsKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworCisgICAgZ2xCbGVuZEZ1bmMoR0xfT05FLCBHTF9PTkUpOworICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgLy9zcHJpbnRmKHN0cjIsICIlaSwgJWksICVpLCAlaSwgJWksIDAiLAorICAgICAgICAgICAgLy91c2VWYXJDb2xvciwgdGV4Q291bnQsIG1vZHVsYXRlRmlyc3RUZXgsIGV4dHJhTWF0aCwgdGV4MCk7CisgICAgLy9kb0xvb3AodHJ1ZSwgcGdtLCB3LCBoLCBzdHIyKTsKKyAgICAvL2RvTG9vcChmYWxzZSwgcGdtLCB3LCBoLCBzdHIyKTsKKworICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICBzcHJpbnRmKGdDdXJyZW50VGVzdE5hbWUsICIlcywgJWksICVpLCAxIiwgZ0ZyYWdtZW50VGVzdHNbcGdtTnVtXS0+bmFtZSwgcGdtTnVtLCB0ZXgpOworICAgIGRvTG9vcCh0cnVlLCBwZ20sIDEwMCk7CisgICAgZG9Mb29wKGZhbHNlLCBwZ20sIDEwMCk7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZpbGx0ZXN0LmNwcCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZpbGx0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjhmYWNhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZmlsbHRlc3QuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworCisjaW5jbHVkZSAiZmlsbF9jb21tb24uY3BwIgorCisKK2Jvb2wgZG9UZXN0KHVpbnQzMl90IHcsIHVpbnQzMl90IGgpIHsKKyAgICBnV2lkdGggPSB3OworICAgIGdIZWlnaHQgPSBoOworICAgIHNldHVwVkEoKTsKKyAgICBnZW5UZXh0dXJlcygpOworCisgICAgcHJpbnRmKCJcbnZhckNvbG9yLCB0ZXhDb3VudCwgbW9kdWxhdGUsIGV4dHJhTWF0aCwgdGV4U2l6ZSwgYmxlbmQsIE1wcHMsIERDNjBcbiIpOworCisgICAgZm9yICh1aW50MzJfdCBudW0gPSAwOyBudW0gPCBnRnJhZ21lbnRUZXN0Q291bnQ7IG51bSsrKSB7CisgICAgICAgIGRvU2luZ2xlVGVzdChudW0sIDIpOworICAgICAgICBpZiAoZ0ZyYWdtZW50VGVzdHNbbnVtXS0+dGV4Q291bnQpIHsKKyAgICAgICAgICAgIGRvU2luZ2xlVGVzdChudW0sIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgZXhpdCgwKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZyYWdtZW50X3NoYWRlcnMuY3BwIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZnJhZ21lbnRfc2hhZGVycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkNWVhZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZyYWdtZW50X3NoYWRlcnMuY3BwCkBAIC0wLDAgKzEsMTM5IEBACisKK3R5cGVkZWYgc3RydWN0IEZyYWdtZW50VGVzdFJlYyB7CisJY29uc3QgY2hhciAqIG5hbWU7CisJdWludDMyX3QgdGV4Q291bnQ7CisJY29uc3QgY2hhciAqIHR4dDsKK30gRnJhZ21lbnRUZXN0OworCitzdGF0aWMgRnJhZ21lbnRUZXN0IGZwRmlsbCA9IHsKKwkiU29saWQgY29sb3IiLCAwLAorCisgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgorICAgICJ1bmlmb3JtIHZlYzQgdV9jb2xvcjtcbiIKKyAgICAidm9pZCBtYWluKCkge1xuIgorICAgICIgIGdsX0ZyYWdDb2xvciA9IHVfY29sb3I7XG4iCisgICAgIn1cbiIKK307CisKK3N0YXRpYyBGcmFnbWVudFRlc3QgZnBHcmFkaWVudCA9IHsKKwkiU29saWQgZ3JhZGllbnQiLCAwLAorCisgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgorICAgICJ2YXJ5aW5nIGxvd3AgdmVjNCB2X2NvbG9yO1xuIgorICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgIiAgZ2xfRnJhZ0NvbG9yID0gdl9jb2xvcjtcbiIKKyAgICAifVxuIgorfTsKKworc3RhdGljIEZyYWdtZW50VGVzdCBmcENvcHlUZXggPSB7CisJIlRleHR1cmUgY29weSIsIDEsCisKKyAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCisgICAgInZhcnlpbmcgdmVjMiB2X3RleDA7XG4iCisgICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4MDtcbiIKKyAgICAidm9pZCBtYWluKCkge1xuIgorICAgICIgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh1X3RleDAsIHZfdGV4MCk7XG4iCisgICAgIn1cbiIKK307CisKK3N0YXRpYyBGcmFnbWVudFRlc3QgZnBDb3B5VGV4R2FtbWEgPSB7CisJIlRleHR1cmUgY29weSB3aXRoIGdhbW1hIiwgMSwKKworICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKKyAgICAidmFyeWluZyB2ZWMyIHZfdGV4MDtcbiIKKyAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXgwO1xuIgorICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgIiAgdmVjNCB0ID0gdGV4dHVyZTJEKHVfdGV4MCwgdl90ZXgwKTtcbiIKKyAgICAiICB0LnJnYiA9IHBvdyh0LnJnYiwgdmVjMygxLjQsIDEuNCwgMS40KSk7XG4iCisgICAgIiAgZ2xfRnJhZ0NvbG9yID0gdDtcbiIKKyAgICAifVxuIgorfTsKKworc3RhdGljIEZyYWdtZW50VGVzdCBmcFRleFNwZWMgPSB7CisJIlRleHR1cmUgc3BlYyIsIDEsCisKKyAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCisgICAgInZhcnlpbmcgdmVjMiB2X3RleDA7XG4iCisgICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4MDtcbiIKKyAgICAidm9pZCBtYWluKCkge1xuIgorICAgICIgIHZlYzQgdCA9IHRleHR1cmUyRCh1X3RleDAsIHZfdGV4MCk7XG4iCisgICAgIiAgZmxvYXQgc2ltU3BlYyA9IGRvdChnbF9GcmFnQ29vcmQueHl6LCBnbF9GcmFnQ29vcmQueHl6KTtcbiIKKyAgICAiICBzaW1TcGVjID0gcG93KGNsYW1wKHNpbVNwZWMsIDAuMSwgMS4wKSwgNDAuMCk7XG4iCisgICAgIiAgZ2xfRnJhZ0NvbG9yID0gdCArIHZlYzQoc2ltU3BlYywgc2ltU3BlYywgc2ltU3BlYywgc2ltU3BlYyk7XG4iCisgICAgIn1cbiIKK307CisKK3N0YXRpYyBGcmFnbWVudFRlc3QgZnBEZXBUZXggPSB7CisJIkRlcGVuZGVudCBMb29rdXAiLCAxLAorCisgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgorICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgwO1xuIgorICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleDA7XG4iCisgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAiICB2ZWM0IHQgPSB0ZXh0dXJlMkQodV90ZXgwLCB2X3RleDApO1xuIgorICAgICIgIHQgKz0gdGV4dHVyZTJEKHVfdGV4MCwgdC54eSk7XG4iCisgICAgIiAgZ2xfRnJhZ0NvbG9yID0gdDtcbiIKKyAgICAifVxuIgorfTsKKworc3RhdGljIEZyYWdtZW50VGVzdCBmcE1vZHVsYXRlQ29uc3RhbnRUZXggPSB7CisJIlRleHR1cmUgbW9kdWxhdGUgY29uc3RhbnQiLCAxLAorCisgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgorICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgwO1xuIgorICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleDA7XG4iCisgICAgInVuaWZvcm0gdmVjNCB1X2NvbG9yO1xuIgorCisgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAiICBsb3dwIHZlYzQgYyA9IHRleHR1cmUyRCh1X3RleDAsIHZfdGV4MCk7XG4iCisJIiAgYyAqPSB1X2NvbG9yO1xuIgorICAgICIgIGdsX0ZyYWdDb2xvciA9IGM7XG4iCisgICAgIn1cbiIKK307CisKK3N0YXRpYyBGcmFnbWVudFRlc3QgZnBNb2R1bGF0ZVZhcnlpbmdUZXggPSB7CisJIlRleHR1cmUgbW9kdWxhdGUgZ3JhZGllbnQiLCAxLAorCisgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgorICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgwO1xuIgorICAgICJ2YXJ5aW5nIGxvd3AgdmVjNCB2X2NvbG9yO1xuIgorICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleDA7XG4iCisKKyAgICAidm9pZCBtYWluKCkge1xuIgorICAgICIgIGxvd3AgdmVjNCBjID0gdGV4dHVyZTJEKHVfdGV4MCwgdl90ZXgwKTtcbiIKKwkiICBjICo9IHZfY29sb3I7XG4iCisgICAgIiAgZ2xfRnJhZ0NvbG9yID0gYztcbiIKKyAgICAifVxuIgorfTsKKworc3RhdGljIEZyYWdtZW50VGVzdCBmcE1vZHVsYXRlVmFyeWluZ0NvbnN0YW50VGV4ID0geworCSJUZXh0dXJlIG1vZHVsYXRlIGdyYWRpZW50IGNvbnN0YW50IiwgMSwKKworICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKKyAgICAidmFyeWluZyB2ZWMyIHZfdGV4MDtcbiIKKyAgICAidmFyeWluZyBsb3dwIHZlYzQgdl9jb2xvcjtcbiIKKyAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXgwO1xuIgorICAgICJ1bmlmb3JtIHZlYzQgdV9jb2xvcjtcbiIKKworICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgIiAgbG93cCB2ZWM0IGMgPSB0ZXh0dXJlMkQodV90ZXgwLCB2X3RleDApO1xuIgorCSIgIGMgKj0gdl9jb2xvcjtcbiIKKwkiICBjICo9IHVfY29sb3I7XG4iCisgICAgIiAgZ2xfRnJhZ0NvbG9yID0gYztcbiIKKyAgICAifVxuIgorfTsKKworc3RhdGljIEZyYWdtZW50VGVzdCAqZ0ZyYWdtZW50VGVzdHNbXSA9IHsKKwkmZnBGaWxsLAorCSZmcEdyYWRpZW50LAorCSZmcENvcHlUZXgsCisJJmZwQ29weVRleEdhbW1hLAorICAgJmZwVGV4U3BlYywKKyAgICZmcERlcFRleCwKKwkmZnBNb2R1bGF0ZUNvbnN0YW50VGV4LAorCSZmcE1vZHVsYXRlVmFyeWluZ1RleCwKKwkmZnBNb2R1bGF0ZVZhcnlpbmdDb25zdGFudFRleCwKKworfTsKKworc3RhdGljIGNvbnN0IHNpemVfdCBnRnJhZ21lbnRUZXN0Q291bnQgPSBzaXplb2YoZ0ZyYWdtZW50VGVzdHMpIC8gc2l6ZW9mKGdGcmFnbWVudFRlc3RzWzBdKTsKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmL2dsMl9wZXJmLmNwcCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL2dsMl9wZXJmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGZjZjFjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZ2wyX3BlcmYuY3BwCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworI2luY2x1ZGUgPHVpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93Lmg+CisjaW5jbHVkZSA8dWkvRUdMVXRpbHMuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKworc3RhdGljIHZvaWQgY2hlY2tFZ2xFcnJvcihjb25zdCBjaGFyKiBvcCwgRUdMQm9vbGVhbiByZXR1cm5WYWwgPSBFR0xfVFJVRSkgeworICAgIGlmIChyZXR1cm5WYWwgIT0gRUdMX1RSVUUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcygpIHJldHVybmVkICVkXG4iLCBvcCwgcmV0dXJuVmFsKTsKKyAgICB9CisKKyAgICBmb3IgKEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7IGVycm9yICE9IEVHTF9TVUNDRVNTOyBlcnJvcgorICAgICAgICAgICAgPSBlZ2xHZXRFcnJvcigpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYWZ0ZXIgJXMoKSBlZ2xFcnJvciAlcyAoMHgleClcbiIsIG9wLCBFR0xVdGlsczo6c3RyZXJyb3IoZXJyb3IpLAorICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrR2xFcnJvcihjb25zdCBjaGFyKiBvcCkgeworICAgIGZvciAoR0xpbnQgZXJyb3IgPSBnbEdldEVycm9yKCk7IGVycm9yOyBlcnJvcgorICAgICAgICAgICAgPSBnbEdldEVycm9yKCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJhZnRlciAlcygpIGdsRXJyb3IgKDB4JXgpXG4iLCBvcCwgZXJyb3IpOworICAgIH0KK30KKworYm9vbCBkb1Rlc3QodWludDMyX3QgdywgdWludDMyX3QgaCk7CisKK3N0YXRpYyBFR0xEaXNwbGF5IGRweTsKK3N0YXRpYyBFR0xTdXJmYWNlIHN1cmZhY2U7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIEVHTEJvb2xlYW4gcmV0dXJuVmFsdWU7CisgICAgRUdMQ29uZmlnIG15Q29uZmlnID0gezB9OworCisgICAgRUdMaW50IGNvbnRleHRfYXR0cmlic1tdID0geyBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgMiwgRUdMX05PTkUgfTsKKyAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7CisgICAgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfV0lORE9XX0JJVCwKKyAgICAgICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKKyAgICAgICAgICAgIEVHTF9OT05FIH07CisgICAgRUdMaW50IG1ham9yVmVyc2lvbjsKKyAgICBFR0xpbnQgbWlub3JWZXJzaW9uOworICAgIEVHTENvbnRleHQgY29udGV4dDsKKyAgICBFR0xpbnQgdywgaDsKKworCisgICAgY2hlY2tFZ2xFcnJvcigiPGluaXQ+Iik7CisgICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICBjaGVja0VnbEVycm9yKCJlZ2xHZXREaXNwbGF5Iik7CisgICAgaWYgKGRweSA9PSBFR0xfTk9fRElTUExBWSkgeworICAgICAgICBwcmludGYoImVnbEdldERpc3BsYXkgcmV0dXJuZWQgRUdMX05PX0RJU1BMQVkuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuVmFsdWUgPSBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisgICAgY2hlY2tFZ2xFcnJvcigiZWdsSW5pdGlhbGl6ZSIsIHJldHVyblZhbHVlKTsKKyAgICBpZiAocmV0dXJuVmFsdWUgIT0gRUdMX1RSVUUpIHsKKyAgICAgICAgcHJpbnRmKCJlZ2xJbml0aWFsaXplIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93ID0gYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpOw0KKyAgICByZXR1cm5WYWx1ZSA9IEVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coZHB5LCBzX2NvbmZpZ0F0dHJpYnMsIHdpbmRvdywgJm15Q29uZmlnKTsKKyAgICBpZiAocmV0dXJuVmFsdWUpIHsKKyAgICAgICAgcHJpbnRmKCJFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93KCkgcmV0dXJuZWQgJWQiLCByZXR1cm5WYWx1ZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGNoZWNrRWdsRXJyb3IoIkVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3ciKTsKKworICAgIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgbXlDb25maWcsIHdpbmRvdywgTlVMTCk7CisgICAgY2hlY2tFZ2xFcnJvcigiZWdsQ3JlYXRlV2luZG93U3VyZmFjZSIpOworICAgIGlmIChzdXJmYWNlID09IEVHTF9OT19TVVJGQUNFKSB7CisgICAgICAgIHByaW50ZigiZ2VsQ3JlYXRlV2luZG93U3VyZmFjZSBmYWlsZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBteUNvbmZpZywgRUdMX05PX0NPTlRFWFQsIGNvbnRleHRfYXR0cmlicyk7CisgICAgY2hlY2tFZ2xFcnJvcigiZWdsQ3JlYXRlQ29udGV4dCIpOworICAgIGlmIChjb250ZXh0ID09IEVHTF9OT19DT05URVhUKSB7CisgICAgICAgIHByaW50ZigiZWdsQ3JlYXRlQ29udGV4dCBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuVmFsdWUgPSBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOworICAgIGNoZWNrRWdsRXJyb3IoImVnbE1ha2VDdXJyZW50IiwgcmV0dXJuVmFsdWUpOworICAgIGlmIChyZXR1cm5WYWx1ZSAhPSBFR0xfVFJVRSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX1dJRFRILCAmdyk7CisgICAgY2hlY2tFZ2xFcnJvcigiZWdsUXVlcnlTdXJmYWNlIik7CisgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJmgpOworICAgIGNoZWNrRWdsRXJyb3IoImVnbFF1ZXJ5U3VyZmFjZSIpOworICAgIEdMaW50IGRpbSA9IHcgPCBoID8gdyA6IGg7CisKKyAgICBnbFZpZXdwb3J0KDAsIDAsIHcsIGgpOworCisgICAgZm9yICg7OykgeworICAgICAgICBkb1Rlc3QodywgaCk7CisgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgICAgIGNoZWNrRWdsRXJyb3IoImVnbFN3YXBCdWZmZXJzIik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgcHRTd2FwKCkgeworICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNzVhNzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTQgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgT3BlbkdMIEVTIFBlcmYgQXBwCisjIFRoaXMgbWFrZWZpbGUgYnVpbGRzIGJvdGggYW4gYWN0aXZpdHkgYW5kIGEgc2hhcmVkIGxpYnJhcnkuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKSAjIG5vdCA2NCBiaXQgY2xlYW4KKworVE9QX0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCisjIEJ1aWxkIGFjdGl2aXR5CisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gR0xQZXJmCisKK0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmdscGVyZgorCisjIFJ1biBvbiBFY2xhaXIKK0xPQ0FMX1NES19WRVJTSU9OIDo9IDcKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQnVpbGQgSk5JIFNoYXJlZCBMaWJyYXJ5CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0xPQ0FMX1BBVEg6PSAkKExPQ0FMX1BBVEgpL2puaQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBPcHRpb25hbCB0YWcgd291bGQgbWVhbiBpdCBkb2Vzbid0IGdldCBpbnN0YWxsZWQgYnkgZGVmYXVsdAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfQ0ZMQUdTIDo9IC1XZXJyb3IKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICBnbF9jb2RlLmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJ1dGlscyBcCisJbGliRUdMIFwKKwlsaWJHTEVTdjIKKworTE9DQUxfTU9EVUxFIDo9IGxpYmdscGVyZgorCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKK2VuZGlmICMgVEFSR0VUX1NJTVVMQVRPUgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA1ZDk1ZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmdscGVyZiIKKyAgICBhbmRyb2lkOnZlcnNpb25OYW1lPSIxLjAuMCIgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMTAwMDAiID4KKyAgICA8dXNlcy1zZGsgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSI3IiBhbmRyb2lkOm1pblNka1ZlcnNpb249IjciIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIiAvPgorICAgIDxhcHBsaWNhdGlvbgorICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9nbHBlcmZfYWN0aXZpdHkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJHTFBlcmZBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyLkZ1bGxzY3JlZW4iCisgICAgICAgICAgICAJYW5kcm9pZDpsYXVuY2hNb2RlPSJzaW5nbGVUYXNrIgorICAgICAgICAgICAgCWFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258a2V5Ym9hcmRIaWRkZW4iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvam5pL2dsX2NvZGUuY3BwIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvam5pL2dsX2NvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OTMzNzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9qbmkvZ2xfY29kZS5jcHAKQEAgLTAsMCArMSwxMDMgQEAKKy8vIE9wZW5HTCBFUyAyLjAgY29kZQorCisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL2puaS5oPgorI2RlZmluZSBMT0dfVEFHICJHTFBlcmYgZ2xfY29kZS5jcHAiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIi4uLy4uL2dsX3BlcmYvZmlsbF9jb21tb24uY3BwIgorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHNjcmVlbgorCit1aW50MzJfdCB3OwordWludDMyX3QgaDsKKworLy8gVGhlIHN0YXRlQ2xvY2sgc3RhcnRzIGF0IHplcm8gYW5kIGluY3JlbWVudHMgYnkgMSBldmVyeSB0aW1lIHdlIGRyYXcgYSBmcmFtZS4gSXQgaXMgdXNlZCB0byBjb250cm9sIHdoaWNoIHBoYXNlIG9mIHRoZSB0ZXN0IHdlIGFyZSBpbi4KKworaW50IHN0YXRlQ2xvY2s7Citjb25zdCBpbnQgZG9Mb29wU3RhdGVzID0gMjsKK2NvbnN0IGludCBkb1NpbmdsZVRlc3RTdGF0ZXMgPSAyOworYm9vbCBkb25lOworCisvLyBTYXZlcyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgdGVzdCAoc28gd2UgY2FuIHByaW50IHRoZW0gb3V0IHdoZW4gd2UgZmluaXNoIHRoZSB0aW1pbmcuKQorCisKK2ludCBwZ207CisKK3ZvaWQgcHRTd2FwKCkgeworfQorCit2b2lkIGRvVGVzdCgpIHsKKyAgICB1aW50MzJfdCB0ZXN0TnVtID0gc3RhdGVDbG9jayA+PiAyOworICAgIGludCB0ZXhTaXplID0gKChzdGF0ZUNsb2NrID4+IDEpICYgMHgxKSArIDE7CisKKyAgICBpZiAodGVzdE51bSA+PSBnRnJhZ21lbnRUZXN0Q291bnQpIHsKKyAgICAgICBMT0dJKCJkb25lXG4iKTsKKyAgICAgICBpZiAoZk91dCkgeworICAgICAgICAgICBmY2xvc2UoZk91dCk7CisgICAgICAgICAgIGZPdXQgPSBOVUxMOworICAgICAgIH0KKyAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gTE9HSSgiZG9UZXN0ICVkICVkICVkXG4iLCB0ZXhDb3VudCwgZXh0cmFNYXRoLCB0ZXN0U3ViU3RhdGUpOworCisvLyAgICAgICAgZm9yICh1aW50MzJfdCBudW0gPSAwOyBudW0gPCBnRnJhZ21lbnRUZXN0Q291bnQ7IG51bSsrKSB7CisgICAgZG9TaW5nbGVUZXN0KHRlc3ROdW0sIHRleFNpemUpOworfQorCitleHRlcm4gIkMiIHsKKyAgICBKTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2xwZXJmX0dMUGVyZkxpYl9pbml0KEpOSUVudiAqIGVudiwgam9iamVjdCBvYmosICBqaW50IHdpZHRoLCBqaW50IGhlaWdodCk7CisgICAgSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX2dscGVyZl9HTFBlcmZMaWJfc3RlcChKTklFbnYgKiBlbnYsIGpvYmplY3Qgb2JqKTsKK307CisKK0pOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9nbHBlcmZfR0xQZXJmTGliX2luaXQoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iaiwgIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KQoreworICAgIGdXaWR0aCA9IHdpZHRoOworICAgIGdIZWlnaHQgPSBoZWlnaHQ7CisgICAgaWYgKCFkb25lKSB7CisgICAgICAgICAgICBzdGF0ZUNsb2NrID0gMDsKKyAgICAgICAgICAgIGRvbmUgPSBmYWxzZTsKKyAgICAgICAgICAgIHNldHVwVkEoKTsKKyAgICAgICAgICAgIGdlblRleHR1cmVzKCk7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlTmFtZSA9ICIvc2RjYXJkL2dscGVyZi5jc3YiOworICAgICAgICAgICAgaWYgKGZPdXQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICBMT0dJKCJDbG9zaW5nIHBhcnRpYWxseSB3cml0dGVuIG91dHB1dC5uIik7CisgICAgICAgICAgICAgICAgIGZjbG9zZShmT3V0KTsKKyAgICAgICAgICAgICAgICAgZk91dCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMT0dJKCJXcml0aW5nIHRvOiAlc1xuIixmaWxlTmFtZSk7CisgICAgICAgICAgICBmT3V0ID0gZm9wZW4oZmlsZU5hbWUsICJ3Iik7CisgICAgICAgICAgICBpZiAoZk91dCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiQ291bGQgbm90IG9wZW46ICVzXG4iLCBmaWxlTmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExPR0koIlxudmFyQ29sb3IsIHRleENvdW50LCBtb2R1bGF0ZSwgZXh0cmFNYXRoLCB0ZXhTaXplLCBibGVuZCwgTXBwcywgREM2MFxuIik7CisgICAgICAgICAgICBpZiAoZk91dCkgZnByaW50ZihmT3V0LCJ2YXJDb2xvciwgdGV4Q291bnQsIG1vZHVsYXRlLCBleHRyYU1hdGgsIHRleFNpemUsIGJsZW5kLCBNcHBzLCBEQzYwXHJcbiIpOworICAgIH0KK30KKworSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX2dscGVyZl9HTFBlcmZMaWJfc3RlcChKTklFbnYgKiBlbnYsIGpvYmplY3Qgb2JqKQoreworICAgIGlmICghIGRvbmUpIHsKKyAgICAgICAgaWYgKHN0YXRlQ2xvY2sgPiAwICYmICgoc3RhdGVDbG9jayAmIDEpID09IDApKSB7CisgICAgICAgICAgICAvL2VuZFRpbWVyKDEwMCk7CisgICAgICAgIH0KKyAgICAgICAgZG9UZXN0KCk7CisgICAgICAgIHN0YXRlQ2xvY2srKzsKKyAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMyMTA3NQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoaXMgZmlsZSBjb250YWlucyByZXNvdXJjZSBkZWZpbml0aW9ucyBmb3IgZGlzcGxheWVkIHN0cmluZ3MsIGFsbG93aW5nCisgICAgIHRoZW0gdG8gYmUgY2hhbmdlZCBiYXNlZCBvbiB0aGUgbG9jYWxlIGFuZCBvcHRpb25zLiAtLT4KKworPHJlc291cmNlcz4KKyAgICA8IS0tIFNpbXBsZSBzdHJpbmdzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImdscGVyZl9hY3Rpdml0eSI+R0xQZXJmPC9zdHJpbmc+CisKKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZkFjdGl2aXR5LmphdmEgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZkFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNmM2FiZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5nbHBlcmY7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCisKK3B1YmxpYyBjbGFzcyBHTFBlcmZBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEdMUGVyZlZpZXcgbVZpZXc7CisKKyAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworCWdldFdpbmRvdygpLnNldEZsYWdzKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfS0VFUF9TQ1JFRU5fT04sIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfS0VFUF9TQ1JFRU5fT04pOworICAgICAgICBtVmlldyA9IG5ldyBHTFBlcmZWaWV3KGdldEFwcGxpY2F0aW9uKCkpOworCXNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtVmlldy5vblBhdXNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtVmlldy5vblJlc3VtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmTGliLmphdmEgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZkxpYi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YTBlNTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZkxpYi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmdscGVyZjsKKworLy8gV3JhcHBlciBmb3IgbmF0aXZlIGxpYnJhcnkKKworcHVibGljIGNsYXNzIEdMUGVyZkxpYiB7CisKKyAgICAgc3RhdGljIHsKKyAgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiZ2xwZXJmIik7CisgICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgY3VycmVudCB2aWV3IHdpZHRoCisgICAgICogQHBhcmFtIGhlaWdodCB0aGUgY3VycmVudCB2aWV3IGhlaWdodAorICAgICAqLworICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGluaXQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzdGVwKCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZlZpZXcuamF2YSBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZTRhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZlZpZXcuamF2YQpAQCAtMCwwICsxLDI5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZ2xwZXJmOworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CisKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTA7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZzsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29udGV4dDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwOworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIFN1cmZhY2VWaWV3IHRoYXQgdXNlcyB0aGUgZGVkaWNhdGVkIHN1cmZhY2UgZm9yCisgKiBkaXNwbGF5aW5nIGFuIE9wZW5HTCBhbmltYXRpb24uICBUaGlzIGFsbG93cyB0aGUgYW5pbWF0aW9uIHRvIHJ1biBpbiBhCisgKiBzZXBhcmF0ZSB0aHJlYWQsIHdpdGhvdXQgcmVxdWlyaW5nIHRoYXQgaXQgYmUgZHJpdmVuIGJ5IHRoZSB1cGRhdGUgbWVjaGFuaXNtCisgKiBvZiB0aGUgdmlldyBoaWVyYXJjaHkuCisgKgorICogVGhlIGFwcGxpY2F0aW9uLXNwZWNpZmljIHJlbmRlcmluZyBjb2RlIGlzIGRlbGVnYXRlZCB0byBhIEdMVmlldy5SZW5kZXJlcgorICogaW5zdGFuY2UuCisgKi8KK2NsYXNzIEdMUGVyZlZpZXcgZXh0ZW5kcyBHTFN1cmZhY2VWaWV3IHsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVEFHID0gIkdMUGVyZlZpZXciOworCisgICAgcHVibGljIEdMUGVyZlZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBpbml0KGZhbHNlLCAwLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgR0xQZXJmVmlldyhDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gdHJhbnNsdWNlbnQsIGludCBkZXB0aCwgaW50IHN0ZW5jaWwpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIGluaXQodHJhbnNsdWNlbnQsIGRlcHRoLCBzdGVuY2lsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdChib29sZWFuIHRyYW5zbHVjZW50LCBpbnQgZGVwdGgsIGludCBzdGVuY2lsKSB7CisgICAgICAgIHNldEVHTENvbnRleHRGYWN0b3J5KG5ldyBDb250ZXh0RmFjdG9yeSgpKTsKKyAgICAgICAgc2V0RUdMQ29uZmlnQ2hvb3NlciggdHJhbnNsdWNlbnQgPworICAgICAgICAgICAgICBuZXcgQ29uZmlnQ2hvb3Nlcig4LDgsOCw4LCBkZXB0aCwgc3RlbmNpbCkgOgorICAgICAgICAgICAgICBuZXcgQ29uZmlnQ2hvb3Nlcig1LDYsNSwwLCBkZXB0aCwgc3RlbmNpbCkpOworICAgICAgICBzZXRSZW5kZXJlcihuZXcgUmVuZGVyZXIoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29udGV4dEZhY3RvcnkgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LkVHTENvbnRleHRGYWN0b3J5IHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OID0gMHgzMDk4OworICAgICAgICBwdWJsaWMgRUdMQ29udGV4dCBjcmVhdGVDb250ZXh0KEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgZWdsQ29uZmlnKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJjcmVhdGluZyBPcGVuR0wgRVMgMi4wIGNvbnRleHQiKTsKKyAgICAgICAgICAgIGNoZWNrRWdsRXJyb3IoIkJlZm9yZSBlZ2xDcmVhdGVDb250ZXh0IiwgZWdsKTsKKyAgICAgICAgICAgIGludFtdIGF0dHJpYl9saXN0ID0ge0VHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OLCAyLCBFR0wxMC5FR0xfTk9ORSB9OworICAgICAgICAgICAgRUdMQ29udGV4dCBjb250ZXh0ID0gZWdsLmVnbENyZWF0ZUNvbnRleHQoZGlzcGxheSwgZWdsQ29uZmlnLCBFR0wxMC5FR0xfTk9fQ09OVEVYVCwgYXR0cmliX2xpc3QpOworICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcigiQWZ0ZXIgZWdsQ3JlYXRlQ29udGV4dCIsIGVnbCk7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lDb250ZXh0KEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGVnbC5lZ2xEZXN0cm95Q29udGV4dChkaXNwbGF5LCBjb250ZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tFZ2xFcnJvcihTdHJpbmcgcHJvbXB0LCBFR0wxMCBlZ2wpIHsKKyAgICAgICAgaW50IGVycm9yOworICAgICAgICB3aGlsZSAoKGVycm9yID0gZWdsLmVnbEdldEVycm9yKCkpICE9IEVHTDEwLkVHTF9TVUNDRVNTKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsIFN0cmluZy5mb3JtYXQoIiVzOiBFR0wgZXJyb3I6IDB4JXgiLCBwcm9tcHQsIGVycm9yKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb25maWdDaG9vc2VyIGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5FR0xDb25maWdDaG9vc2VyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEVHTF9PUEVOR0xfRVMyX0JJVCA9IDQ7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGludFtdIHNfY29uZmlnQXR0cmliczIgPQorICAgICAgICB7CisgICAgICAgICAgICBFR0wxMC5FR0xfUkVEX1NJWkUsIDQsCisgICAgICAgICAgICBFR0wxMC5FR0xfR1JFRU5fU0laRSwgNCwKKyAgICAgICAgICAgIEVHTDEwLkVHTF9CTFVFX1NJWkUsIDQsCisgICAgICAgICAgICBFR0wxMC5FR0xfUkVOREVSQUJMRV9UWVBFLCBFR0xfT1BFTkdMX0VTMl9CSVQsCisgICAgICAgICAgICBFR0wxMC5FR0xfTk9ORQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBDb25maWdDaG9vc2VyKGludCByLCBpbnQgZywgaW50IGIsIGludCBhLCBpbnQgZGVwdGgsIGludCBzdGVuY2lsKSB7CisgICAgICAgICAgICBtUmVkU2l6ZSA9IHI7CisgICAgICAgICAgICBtR3JlZW5TaXplID0gZzsKKyAgICAgICAgICAgIG1CbHVlU2l6ZSA9IGI7CisgICAgICAgICAgICBtQWxwaGFTaXplID0gYTsKKyAgICAgICAgICAgIG1EZXB0aFNpemUgPSBkZXB0aDsKKyAgICAgICAgICAgIG1TdGVuY2lsU2l6ZSA9IHN0ZW5jaWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRUdMQ29uZmlnIGNob29zZUNvbmZpZyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSkgeworCisgICAgICAgICAgICBpbnRbXSBudW1fY29uZmlnID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgIGVnbC5lZ2xDaG9vc2VDb25maWcoZGlzcGxheSwgc19jb25maWdBdHRyaWJzMiwgbnVsbCwgMCwgbnVtX2NvbmZpZyk7CisKKyAgICAgICAgICAgIGludCBudW1Db25maWdzID0gbnVtX2NvbmZpZ1swXTsKKworICAgICAgICAgICAgaWYgKG51bUNvbmZpZ3MgPD0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIGNvbmZpZ3MgbWF0Y2ggY29uZmlnU3BlYyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRUdMQ29uZmlnW10gY29uZmlncyA9IG5ldyBFR0xDb25maWdbbnVtQ29uZmlnc107CisgICAgICAgICAgICBlZ2wuZWdsQ2hvb3NlQ29uZmlnKGRpc3BsYXksIHNfY29uZmlnQXR0cmliczIsIGNvbmZpZ3MsIG51bUNvbmZpZ3MsIG51bV9jb25maWcpOworICAgICAgICAgICAgLy8gcHJpbnRDb25maWdzKGVnbCwgZGlzcGxheSwgY29uZmlncyk7CisgICAgICAgICAgICByZXR1cm4gY2hvb3NlQ29uZmlnKGVnbCwgZGlzcGxheSwgY29uZmlncyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRUdMQ29uZmlnIGNob29zZUNvbmZpZyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwKKyAgICAgICAgICAgICAgICBFR0xDb25maWdbXSBjb25maWdzKSB7CisgICAgICAgICAgICBFR0xDb25maWcgY2xvc2VzdENvbmZpZyA9IG51bGw7CisgICAgICAgICAgICBpbnQgY2xvc2VzdERpc3RhbmNlID0gMTAwMDsKKyAgICAgICAgICAgIGZvcihFR0xDb25maWcgY29uZmlnIDogY29uZmlncykgeworICAgICAgICAgICAgICAgIGludCBkID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9ERVBUSF9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICBpbnQgcyA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU1RFTkNJTF9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAoZCA+PSBtRGVwdGhTaXplICYmIHM+PSBtU3RlbmNpbFNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHIgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9SRURfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGludCBnID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0dSRUVOX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICBpbnQgYiA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQkxVRV9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGEgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9BTFBIQV9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRpc3RhbmNlID0gTWF0aC5hYnMociAtIG1SZWRTaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1hdGguYWJzKGcgLSBtR3JlZW5TaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1hdGguYWJzKGIgLSBtQmx1ZVNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTWF0aC5hYnMoYSAtIG1BbHBoYVNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPCBjbG9zZXN0RGlzdGFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3REaXN0YW5jZSA9IGRpc3RhbmNlOworICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdENvbmZpZyA9IGNvbmZpZzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjbG9zZXN0Q29uZmlnOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgZmluZENvbmZpZ0F0dHJpYihFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwKKyAgICAgICAgICAgICAgICBFR0xDb25maWcgY29uZmlnLCBpbnQgYXR0cmlidXRlLCBpbnQgZGVmYXVsdFZhbHVlKSB7CisKKyAgICAgICAgICAgIGlmIChlZ2wuZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZywgYXR0cmlidXRlLCBtVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcHJpbnRDb25maWdzKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LAorICAgICAgICAgICAgRUdMQ29uZmlnW10gY29uZmlncykgeworICAgICAgICAgICAgaW50IG51bUNvbmZpZ3MgPSBjb25maWdzLmxlbmd0aDsKKyAgICAgICAgICAgIExvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiJWQgY29uZmlndXJhdGlvbnMiLCBudW1Db25maWdzKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbmZpZ3M7IGkrKykgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiQ29uZmlndXJhdGlvbiAlZDpcbiIsIGkpKTsKKyAgICAgICAgICAgICAgICBwcmludENvbmZpZyhlZ2wsIGRpc3BsYXksIGNvbmZpZ3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHByaW50Q29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LAorICAgICAgICAgICAgICAgIEVHTENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgICAgIGludFtdIGF0dHJpYnV0ZXMgPSB7CisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9CVUZGRVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0FMUEhBX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9CTFVFX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9HUkVFTl9TSVpFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVEX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9ERVBUSF9TSVpFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU1RFTkNJTF9TSVpFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQ09ORklHX0NBVkVBVCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0NPTkZJR19JRCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTUFYX1BCVUZGRVJfSEVJR0hULAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTUFYX1BCVUZGRVJfUElYRUxTLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTUFYX1BCVUZGRVJfV0lEVEgsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OQVRJVkVfUkVOREVSQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05BVElWRV9WSVNVQUxfSUQsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OQVRJVkVfVklTVUFMX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIDB4MzAzMCwgLy8gRUdMMTAuRUdMX1BSRVNFUlZFRF9SRVNPVVJDRVMsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TQU1QTEVTLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU0FNUExFX0JVRkZFUlMsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TVVJGQUNFX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9UUkFOU1BBUkVOVF9UWVBFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAweDMwMzksIC8vIEVHTDEwLkVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCLAorICAgICAgICAgICAgICAgICAgICAweDMwM0EsIC8vIEVHTDEwLkVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQSwKKyAgICAgICAgICAgICAgICAgICAgMHgzMDNCLCAvLyBFR0wxMC5FR0xfTUlOX1NXQVBfSU5URVJWQUwsCisgICAgICAgICAgICAgICAgICAgIDB4MzAzQywgLy8gRUdMMTAuRUdMX01BWF9TV0FQX0lOVEVSVkFMLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTFVNSU5BTkNFX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9BTFBIQV9NQVNLX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9DT0xPUl9CVUZGRVJfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1JFTkRFUkFCTEVfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgMHgzMDQyIC8vIEVHTDEwLkVHTF9DT05GT1JNQU5UCisgICAgICAgICAgICB9OworICAgICAgICAgICAgU3RyaW5nW10gbmFtZXMgPSB7CisgICAgICAgICAgICAgICAgICAgICJFR0xfQlVGRkVSX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0FMUEhBX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0JMVUVfU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfR1JFRU5fU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfUkVEX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0RFUFRIX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1NURU5DSUxfU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfQ09ORklHX0NBVkVBVCIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfQ09ORklHX0lEIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9MRVZFTCIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTUFYX1BCVUZGRVJfSEVJR0hUIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9NQVhfUEJVRkZFUl9QSVhFTFMiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX01BWF9QQlVGRkVSX1dJRFRIIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9OQVRJVkVfUkVOREVSQUJMRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTkFUSVZFX1ZJU1VBTF9JRCIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9QUkVTRVJWRURfUkVTT1VSQ0VTIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9TQU1QTEVTIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9TQU1QTEVfQlVGRkVSUyIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfU1VSRkFDRV9UWVBFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9UUkFOU1BBUkVOVF9UWVBFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTUlOX1NXQVBfSU5URVJWQUwiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX01BWF9TV0FQX0lOVEVSVkFMIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9MVU1JTkFOQ0VfU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfQUxQSEFfTUFTS19TSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9DT0xPUl9CVUZGRVJfVFlQRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfUkVOREVSQUJMRV9UWVBFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9DT05GT1JNQU5UIgorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGludFtdIHZhbHVlID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2ldOworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbmFtZXNbaV07CisgICAgICAgICAgICAgICAgaWYgKCBlZ2wuZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZywgYXR0cmlidXRlLCB2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCBTdHJpbmcuZm9ybWF0KCIgICVzOiAlZFxuIiwgbmFtZSwgdmFsdWVbMF0pKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBMb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIiAgJXM6IGZhaWxlZFxuIiwgbmFtZSkpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZWdsLmVnbEdldEVycm9yKCkgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFN1YmNsYXNzZXMgY2FuIGFkanVzdCB0aGVzZSB2YWx1ZXM6CisgICAgICAgIHByb3RlY3RlZCBpbnQgbVJlZFNpemU7CisgICAgICAgIHByb3RlY3RlZCBpbnQgbUdyZWVuU2l6ZTsKKyAgICAgICAgcHJvdGVjdGVkIGludCBtQmx1ZVNpemU7CisgICAgICAgIHByb3RlY3RlZCBpbnQgbUFscGhhU2l6ZTsKKyAgICAgICAgcHJvdGVjdGVkIGludCBtRGVwdGhTaXplOworICAgICAgICBwcm90ZWN0ZWQgaW50IG1TdGVuY2lsU2l6ZTsKKyAgICAgICAgcHJpdmF0ZSBpbnRbXSBtVmFsdWUgPSBuZXcgaW50WzFdOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlbmRlcmVyIGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5SZW5kZXJlciB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uRHJhd0ZyYW1lKEdMMTAgZ2wpIHsKKyAgICAgICAgICAgIEdMUGVyZkxpYi5zdGVwKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKEdMMTAgZ2wsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICAgICAgR0xQZXJmTGliLmluaXQod2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKEdMMTAgZ2wsIEVHTENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgICAgIC8vIERvIG5vdGhpbmcuCisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMGFiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTkgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGVzdCBmcmFtZXJhdGUgYW5kIGxvb2sgZm9yIGhpY2N1cHMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworVE9QX0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCisjIEJ1aWxkIGFjdGl2aXR5CisKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBUZXN0RnJhbWVyYXRlCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RGcmFtZXJhdGUvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA0MzQyYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC50ZXN0ZnJhbWVyYXRlIj4KKyAgICA8dXNlcy1zZGsgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSI4IiBhbmRyb2lkOm1pblNka1ZlcnNpb249IjgiIC8+CisKKyAgICA8YXBwbGljYXRpb24KKyAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvdGVzdEZyYW1lcmF0ZV9hY3Rpdml0eSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlRlc3RGcmFtZXJhdGVBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyLkZ1bGxzY3JlZW4iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXVuY2hNb2RlPSJzaW5nbGVUYXNrIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258a2V5Ym9hcmRIaWRkZW4iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RGcmFtZXJhdGUvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiMzA4OAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSBUaGlzIGZpbGUgY29udGFpbnMgcmVzb3VyY2UgZGVmaW5pdGlvbnMgZm9yIGRpc3BsYXllZCBzdHJpbmdzLCBhbGxvd2luZworICAgICB0aGVtIHRvIGJlIGNoYW5nZWQgYmFzZWQgb24gdGhlIGxvY2FsZSBhbmQgb3B0aW9ucy4gLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPCEtLSBTaW1wbGUgc3RyaW5ncy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXN0RnJhbWVyYXRlX2FjdGl2aXR5Ij5UZXN0RnJhbWVyYXRlPC9zdHJpbmc+CisKKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9zcmMvY29tL2FuZHJvaWQvdGVzdGZyYW1lcmF0ZS9UZXN0RnJhbWVyYXRlQWN0aXZpdHkuamF2YSBiL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL3NyYy9jb20vYW5kcm9pZC90ZXN0ZnJhbWVyYXRlL1Rlc3RGcmFtZXJhdGVBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZTI3OWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9zcmMvY29tL2FuZHJvaWQvdGVzdGZyYW1lcmF0ZS9UZXN0RnJhbWVyYXRlQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0ZnJhbWVyYXRlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworCitwdWJsaWMgY2xhc3MgVGVzdEZyYW1lcmF0ZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgVGVzdEZyYW1lcmF0ZVZpZXcgbVZpZXc7CisKKyAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworICAgICAgICBtVmlldyA9IG5ldyBUZXN0RnJhbWVyYXRlVmlldyhnZXRBcHBsaWNhdGlvbigpKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgICAgICBtVmlldy5zZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtVmlldy5vblBhdXNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtVmlldy5vblJlc3VtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL3NyYy9jb20vYW5kcm9pZC90ZXN0ZnJhbWVyYXRlL1Rlc3RGcmFtZXJhdGVWaWV3LmphdmEgYi9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9zcmMvY29tL2FuZHJvaWQvdGVzdGZyYW1lcmF0ZS9UZXN0RnJhbWVyYXRlVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZmI1ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9zcmMvY29tL2FuZHJvaWQvdGVzdGZyYW1lcmF0ZS9UZXN0RnJhbWVyYXRlVmlldy5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3RmcmFtZXJhdGU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOworaW1wb3J0IGphdmEubmlvLkZsb2F0QnVmZmVyOworCitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWc7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQ7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXk7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKKworaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMRVMyMDsKKworY2xhc3MgVGVzdEZyYW1lcmF0ZVZpZXcgZXh0ZW5kcyBHTFN1cmZhY2VWaWV3IHsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVEFHID0gIlRlc3RGcmFtZXJhdGVWaWV3IjsKKworICAgIHB1YmxpYyBUZXN0RnJhbWVyYXRlVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIHNldEVHTENvbnRleHRDbGllbnRWZXJzaW9uKDIpOworICAgICAgICBzZXRSZW5kZXJlcihuZXcgUmVuZGVyZXIoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIG1MYXN0VGltZV91cyA9IDA7CisgICAgcHJpdmF0ZSBsb25nIG1OdW1TaG9ydEZyYW1lc0VsYXBzZWQgPSAwOworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlclRpbWUobG9uZyBub3dfdXMpIHsKKyAgICAgICAgbG9uZyBsb25nRnJhbWVUaW1lX21zID0gSW50ZWdlci5wYXJzZUludChTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgiZGVidWcubG9uZ2ZyYW1lX21zIiwgIjE2IikpOworICAgICAgICBsb25nIGVsYXBzZWRUaW1lX3VzID0gbm93X3VzIC0gbUxhc3RUaW1lX3VzOworICAgICAgICBmbG9hdCBmcHMgPSAxMDAwMDAwLmYgLyBlbGFwc2VkVGltZV91czsKKyAgICAgICAgaWYgKG1MYXN0VGltZV91cyA+IDAgJiYgZWxhcHNlZFRpbWVfdXMgPiBsb25nRnJhbWVUaW1lX21zKjEwMDApIHsKKyAgICAgICAgICBMb2cudihUQUcsICJMb25nIGZyYW1lOiAiICsgZWxhcHNlZFRpbWVfdXMvMTAwMC5mICsgIiBtcyAoIiArIGZwcyArICIgZnBzKSIpOworICAgICAgICAgIGlmIChtTnVtU2hvcnRGcmFtZXNFbGFwc2VkID4gMCkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAiICBTaG9ydCBmcmFtZXMgc2luY2UgbGFzdCBsb25nIGZyYW1lOiAiICsgbU51bVNob3J0RnJhbWVzRWxhcHNlZCk7CisgICAgICAgICAgICBtTnVtU2hvcnRGcmFtZXNFbGFwc2VkID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICArK21OdW1TaG9ydEZyYW1lc0VsYXBzZWQ7CisgICAgICAgIH0KKworICAgICAgICBtTGFzdFRpbWVfdXMgPSBub3dfdXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBSZW5kZXJlciBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuUmVuZGVyZXIgeworICAgICAgICBwdWJsaWMgUmVuZGVyZXIoKSB7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRHJhd0ZyYW1lKEdMMTAgZ2wpIHsKKyAgICAgICAgICAgIGxvbmcgbm93X3VzID0gU3lzdGVtLm5hbm9UaW1lKCkgLyAxMDAwOworICAgICAgICAgICAgcmVnaXN0ZXJUaW1lKG5vd191cyk7CisKKyAgICAgICAgICAgIGZsb2F0IHJlZCA9IChub3dfdXMgJSAxMDAwMDAwKSAvIDEwMDAwMDAuZjsKKyAgICAgICAgICAgIGZsb2F0IGdyZWVuID0gKG5vd191cyAlIDIwMDAwMDApIC8gMjAwMDAwMC5mOworICAgICAgICAgICAgZmxvYXQgYmx1ZSA9IChub3dfdXMgJSAzMDAwMDAwKSAvIDMwMDAwMDAuZjsKKyAgICAgICAgICAgIEdMRVMyMC5nbENsZWFyQ29sb3IocmVkLCBncmVlbiwgYmx1ZSwgMS4wZik7CisgICAgICAgICAgICBHTEVTMjAuZ2xDbGVhcihHTEVTMjAuR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKEdMMTAgZ2wsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICAgICAgR0xFUzIwLmdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKEdMMTAgZ2wsIEVHTENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RMYXRlbmN5L0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvdGVzdExhdGVuY3kvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjQxN2M3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RMYXRlbmN5L0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUZXN0IGVuZC10by1lbmQgbGF0ZW5jeS4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworVE9QX0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCisjIEJ1aWxkIGFjdGl2aXR5CisKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU0RLX1ZFUlNJT04gOj0gOAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBUZXN0TGF0ZW5jeQorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0TGF0ZW5jeS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvb3BlbmdsL3Rlc3RzL3Rlc3RMYXRlbmN5L0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxMjY2ZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90ZXN0TGF0ZW5jeS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQudGVzdGxhdGVuY3kiPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjgiIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iOCIgLz4KKworICAgIDxhcHBsaWNhdGlvbgorICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy90ZXN0TGF0ZW5jeV9hY3Rpdml0eSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlRlc3RMYXRlbmN5QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhci5GdWxsc2NyZWVuIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVGFzayIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9ufGtleWJvYXJkSGlkZGVuIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0TGF0ZW5jeS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvb3BlbmdsL3Rlc3RzL3Rlc3RMYXRlbmN5L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwOTk5MQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90ZXN0TGF0ZW5jeS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gVGhpcyBmaWxlIGNvbnRhaW5zIHJlc291cmNlIGRlZmluaXRpb25zIGZvciBkaXNwbGF5ZWQgc3RyaW5ncywgYWxsb3dpbmcKKyAgICAgdGhlbSB0byBiZSBjaGFuZ2VkIGJhc2VkIG9uIHRoZSBsb2NhbGUgYW5kIG9wdGlvbnMuIC0tPgorCis8cmVzb3VyY2VzPgorICAgIDwhLS0gU2ltcGxlIHN0cmluZ3MuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0idGVzdExhdGVuY3lfYWN0aXZpdHkiPlRlc3RMYXRlbmN5PC9zdHJpbmc+CisKKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdExhdGVuY3kvc3JjL2NvbS9hbmRyb2lkL3Rlc3RsYXRlbmN5L1Rlc3RMYXRlbmN5QWN0aXZpdHkuamF2YSBiL29wZW5nbC90ZXN0cy90ZXN0TGF0ZW5jeS9zcmMvY29tL2FuZHJvaWQvdGVzdGxhdGVuY3kvVGVzdExhdGVuY3lBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOTkzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdExhdGVuY3kvc3JjL2NvbS9hbmRyb2lkL3Rlc3RsYXRlbmN5L1Rlc3RMYXRlbmN5QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0bGF0ZW5jeTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKworcHVibGljIGNsYXNzIFRlc3RMYXRlbmN5QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBUZXN0TGF0ZW5jeVZpZXcgbVZpZXc7CisKKyAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworICAgICAgICBtVmlldyA9IG5ldyBUZXN0TGF0ZW5jeVZpZXcoZ2V0QXBwbGljYXRpb24oKSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICAgICAgbVZpZXcuc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcub25QYXVzZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdExhdGVuY3kvc3JjL2NvbS9hbmRyb2lkL3Rlc3RsYXRlbmN5L1Rlc3RMYXRlbmN5Vmlldy5qYXZhIGIvb3BlbmdsL3Rlc3RzL3Rlc3RMYXRlbmN5L3NyYy9jb20vYW5kcm9pZC90ZXN0bGF0ZW5jeS9UZXN0TGF0ZW5jeVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjJiZjE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Rlc3RMYXRlbmN5L3NyYy9jb20vYW5kcm9pZC90ZXN0bGF0ZW5jeS9UZXN0TGF0ZW5jeVZpZXcuamF2YQpAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdGxhdGVuY3k7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7CitpbXBvcnQgamF2YS5uaW8uRmxvYXRCdWZmZXI7CisKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTA7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZzsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29udGV4dDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwOworCitpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xFUzIwOworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIFN1cmZhY2VWaWV3IHRoYXQgdXNlcyB0aGUgZGVkaWNhdGVkIHN1cmZhY2UgZm9yCisgKiBkaXNwbGF5aW5nIGFuIE9wZW5HTCBhbmltYXRpb24uICBUaGlzIGFsbG93cyB0aGUgYW5pbWF0aW9uIHRvIHJ1biBpbiBhCisgKiBzZXBhcmF0ZSB0aHJlYWQsIHdpdGhvdXQgcmVxdWlyaW5nIHRoYXQgaXQgYmUgZHJpdmVuIGJ5IHRoZSB1cGRhdGUgbWVjaGFuaXNtCisgKiBvZiB0aGUgdmlldyBoaWVyYXJjaHkuCisgKgorICogVGhlIGFwcGxpY2F0aW9uLXNwZWNpZmljIHJlbmRlcmluZyBjb2RlIGlzIGRlbGVnYXRlZCB0byBhIEdMVmlldy5SZW5kZXJlcgorICogaW5zdGFuY2UuCisgKi8KK2NsYXNzIFRlc3RMYXRlbmN5VmlldyBleHRlbmRzIEdMU3VyZmFjZVZpZXcgeworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBUQUcgPSAiVGVzdExhdGVuY3lpZXciOworICAgIHByaXZhdGUgZmxvYXQgbVg7CisgICAgcHJpdmF0ZSBmbG9hdCBtWTsKKyAgICBwcml2YXRlIGZsb2F0IG1EWDsKKyAgICBwcml2YXRlIGZsb2F0IG1EWTsKKyAgICBwcml2YXRlIGxvbmcgIG1UOworICAgIHByaXZhdGUgbG9uZyAgbURUOworCisgICAgcHVibGljIFRlc3RMYXRlbmN5VmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIHNldEVHTENvbnRleHRDbGllbnRWZXJzaW9uKDIpOworICAgICAgICBzZXRSZW5kZXJlcihuZXcgUmVuZGVyZXIoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0QWN0aW9uKCkpIHsKKyAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRToKKyAgICAgICAgICAgIGZsb2F0IHggPSBldmVudC5nZXRYKCk7CisgICAgICAgICAgICBmbG9hdCB5ID0gZXZlbnQuZ2V0WSgpOworICAgICAgICAgICAgbG9uZyAgdCA9IGV2ZW50LmdldEV2ZW50VGltZSgpOworICAgICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBtRFQgPSB0IC0gbVQ7CisgICAgICAgICAgICAgICAgbVQgPSB0OworICAgICAgICAgICAgICAgIG1EWCA9IHggLSBtWDsKKyAgICAgICAgICAgICAgICBtWCA9IHg7CisgICAgICAgICAgICAgICAgbURZID0geSAtIG1ZOworICAgICAgICAgICAgICAgIG1ZID0geTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBSZW5kZXJlciBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuUmVuZGVyZXIgeworICAgICAgICBwcml2YXRlIGZsb2F0IG1TY2FsZVgsIG1TY2FsZVksIG1PZmZzZXRYLCBtT2Zmc2V0WTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBNU19QRVJfRlJBTUUgPSAxMDAwIC8gNjA7CisgICAgICAgIHB1YmxpYyBSZW5kZXJlcigpIHsKKyAgICAgICAgICAgIG1UcmlhbmdsZVZlcnRpY2VzID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChtVHJpYW5nbGVWZXJ0aWNlc0RhdGEubGVuZ3RoICogNCkKKyAgICAgICAgICAgICAgICAub3JkZXIoQnl0ZU9yZGVyLm5hdGl2ZU9yZGVyKCkpLmFzRmxvYXRCdWZmZXIoKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIHZvaWQgb25EcmF3RnJhbWUoR0wxMCBnbCkgeworICAgICAgICAgICAgR0xFUzIwLmdsQ2xlYXJDb2xvcigwLjRmLCAwLjRmLCAwLjRmLCAxLjBmKTsKKyAgICAgICAgICAgIEdMRVMyMC5nbENsZWFyKCBHTEVTMjAuR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMRVMyMC5HTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgICAgICAgIEdMRVMyMC5nbFVzZVByb2dyYW0obVByb2dyYW0pOworICAgICAgICAgICAgY2hlY2tHbEVycm9yKCJnbFVzZVByb2dyYW0iKTsKKworICAgICAgICAgICAgZmxvYXQgeCwgeSwgZHgsIGR5OworICAgICAgICAgICAgbG9uZyB0LCBkdDsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZChUZXN0TGF0ZW5jeVZpZXcudGhpcykgeworICAgICAgICAgICAgICAgIHggPSBtWDsKKyAgICAgICAgICAgICAgICB5ID0gbVk7CisgICAgICAgICAgICAgICAgZHggPSBtRFg7CisgICAgICAgICAgICAgICAgZHkgPSBtRFk7CisgICAgICAgICAgICAgICAgZHQgPSBtRFQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkdCA+IDApIHsKKyAgICAgICAgICAgICAgICBkeCA9IGR4ICogTVNfUEVSX0ZSQU1FIC8gZHQ7CisgICAgICAgICAgICAgICAgZHkgPSBkeSAqIE1TX1BFUl9GUkFNRSAvIGR0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBHTEVTMjAuZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShtdlBvc2l0aW9uSGFuZGxlKTsKKyAgICAgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSIpOworICAgICAgICAgICAgR0xFUzIwLmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobXZDb2xvckhhbmRsZSk7CisgICAgICAgICAgICBjaGVja0dsRXJyb3IoImdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkiKTsKKyAgICAgICAgICAgIGZvcihpbnQgc3RlcCA9IDA7IHN0ZXAgPCA4OyBzdGVwKyspIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBzeCA9ICh4ICsgZHggKiBzdGVwKSAqIG1TY2FsZVggKyBtT2Zmc2V0WDsKKyAgICAgICAgICAgICAgICBmbG9hdCBzeSA9ICh5ICsgZHkgKiBzdGVwKSAqIG1TY2FsZVkgKyBtT2Zmc2V0WTsKKyAgICAgICAgICAgICAgICBpbnQgY2Jhc2UgPSBzdGVwICogNDsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVRyaWFuZ2xlVmVydGljZXNEYXRhLmxlbmd0aDsgaSArPSA2KSB7CisgICAgICAgICAgICAgICAgICAgIG1UcmlhbmdsZVZlcnRpY2VzRGF0YTJbaV0gPSBzeCArIG1UcmlhbmdsZVZlcnRpY2VzRGF0YVtpXTsKKyAgICAgICAgICAgICAgICAgICAgbVRyaWFuZ2xlVmVydGljZXNEYXRhMltpKzFdID0gLXN5ICsgbVRyaWFuZ2xlVmVydGljZXNEYXRhW2krMV07CisgICAgICAgICAgICAgICAgICAgIG1UcmlhbmdsZVZlcnRpY2VzRGF0YTJbaSsyXSA9IG1Db2xvcnNbY2Jhc2VdOworICAgICAgICAgICAgICAgICAgICBtVHJpYW5nbGVWZXJ0aWNlc0RhdGEyW2krM10gPSBtQ29sb3JzW2NiYXNlKzFdOworICAgICAgICAgICAgICAgICAgICBtVHJpYW5nbGVWZXJ0aWNlc0RhdGEyW2krNF0gPSBtQ29sb3JzW2NiYXNlKzJdOworICAgICAgICAgICAgICAgICAgICBtVHJpYW5nbGVWZXJ0aWNlc0RhdGEyW2krNV0gPSBtQ29sb3JzW2NiYXNlKzNdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVHJpYW5nbGVWZXJ0aWNlcy5wb3NpdGlvbigwKTsKKyAgICAgICAgICAgICAgICBtVHJpYW5nbGVWZXJ0aWNlcy5wdXQobVRyaWFuZ2xlVmVydGljZXNEYXRhMikucG9zaXRpb24oMCk7CisKKyAgICAgICAgICAgICAgICBHTEVTMjAuZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG12UG9zaXRpb25IYW5kbGUsIDIsIEdMRVMyMC5HTF9GTE9BVCwgZmFsc2UsIDYqNCwgbVRyaWFuZ2xlVmVydGljZXMpOworICAgICAgICAgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyIG12UG9zaXRpb24iKTsKKyAgICAgICAgICAgICAgICBtVHJpYW5nbGVWZXJ0aWNlcy5wdXQobVRyaWFuZ2xlVmVydGljZXNEYXRhMikucG9zaXRpb24oMik7CisgICAgICAgICAgICAgICAgR0xFUzIwLmdsVmVydGV4QXR0cmliUG9pbnRlcihtdkNvbG9ySGFuZGxlLCA0LCBHTEVTMjAuR0xfRkxPQVQsIGZhbHNlLCA2KjQsIG1UcmlhbmdsZVZlcnRpY2VzKTsKKyAgICAgICAgICAgICAgICBjaGVja0dsRXJyb3IoImdsVmVydGV4QXR0cmliUG9pbnRlciBtdkNvbG9yIik7CisgICAgICAgICAgICAgICAgR0xFUzIwLmdsRHJhd0FycmF5cyhHTEVTMjAuR0xfVFJJQU5HTEVTLCAwLCAzKTsKKyAgICAgICAgICAgICAgICBjaGVja0dsRXJyb3IoImdsRHJhd0FycmF5cyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ2hhbmdlZChHTDEwIGdsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgICAgIEdMRVMyMC5nbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgbVNjYWxlWCA9IDIuMGYgLyB3aWR0aDsKKyAgICAgICAgICAgIG1TY2FsZVkgPSAyLjBmIC8gaGVpZ2h0OworICAgICAgICAgICAgbU9mZnNldFggPSAtMWY7CisgICAgICAgICAgICBtT2Zmc2V0WSA9IC0xZjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNyZWF0ZWQoR0wxMCBnbCwgRUdMQ29uZmlnIGNvbmZpZykgeworICAgICAgICAgICAgbVByb2dyYW0gPSBjcmVhdGVQcm9ncmFtKG1WZXJ0ZXhTaGFkZXIsIG1GcmFnbWVudFNoYWRlcik7CisgICAgICAgICAgICBpZiAobVByb2dyYW0gPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG12UG9zaXRpb25IYW5kbGUgPSBHTEVTMjAuZ2xHZXRBdHRyaWJMb2NhdGlvbihtUHJvZ3JhbSwgImFQb3NpdGlvbiIpOworICAgICAgICAgICAgY2hlY2tHbEVycm9yKCJnbEdldEF0dHJpYkxvY2F0aW9uIik7CisgICAgICAgICAgICBpZiAobXZQb3NpdGlvbkhhbmRsZSA9PSAtMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgZ2V0IGF0dHJpYiBsb2NhdGlvbiBmb3IgdlBvc2l0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtdkNvbG9ySGFuZGxlID0gR0xFUzIwLmdsR2V0QXR0cmliTG9jYXRpb24obVByb2dyYW0sICJhQ29sb3IiKTsKKyAgICAgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xHZXRBdHRyaWJMb2NhdGlvbiIpOworICAgICAgICAgICAgaWYgKG12Q29sb3JIYW5kbGUgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGdldCBhdHRyaWIgbG9jYXRpb24gZm9yIHZDb2xvciIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgbG9hZFNoYWRlcihpbnQgc2hhZGVyVHlwZSwgU3RyaW5nIHNvdXJjZSkgeworICAgICAgICAgICAgaW50IHNoYWRlciA9IEdMRVMyMC5nbENyZWF0ZVNoYWRlcihzaGFkZXJUeXBlKTsKKyAgICAgICAgICAgIGlmIChzaGFkZXIgIT0gMCkgeworICAgICAgICAgICAgICAgIEdMRVMyMC5nbFNoYWRlclNvdXJjZShzaGFkZXIsIHNvdXJjZSk7CisgICAgICAgICAgICAgICAgR0xFUzIwLmdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOworICAgICAgICAgICAgICAgIGludFtdIGNvbXBpbGVkID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgICAgICBHTEVTMjAuZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMRVMyMC5HTF9DT01QSUxFX1NUQVRVUywgY29tcGlsZWQsIDApOworICAgICAgICAgICAgICAgIGlmIChjb21waWxlZFswXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBjb21waWxlIHNoYWRlciAiICsgc2hhZGVyVHlwZSArICI6Iik7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgR0xFUzIwLmdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgR0xFUzIwLmdsRGVsZXRlU2hhZGVyKHNoYWRlcik7CisgICAgICAgICAgICAgICAgICAgIHNoYWRlciA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNoYWRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IGNyZWF0ZVByb2dyYW0oU3RyaW5nIHZlcnRleFNvdXJjZSwgU3RyaW5nIGZyYWdtZW50U291cmNlKSB7CisgICAgICAgICAgICBpbnQgdmVydGV4U2hhZGVyID0gbG9hZFNoYWRlcihHTEVTMjAuR0xfVkVSVEVYX1NIQURFUiwgdmVydGV4U291cmNlKTsKKyAgICAgICAgICAgIGlmICh2ZXJ0ZXhTaGFkZXIgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgcGl4ZWxTaGFkZXIgPSBsb2FkU2hhZGVyKEdMRVMyMC5HTF9GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U291cmNlKTsKKyAgICAgICAgICAgIGlmIChwaXhlbFNoYWRlciA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBwcm9ncmFtID0gR0xFUzIwLmdsQ3JlYXRlUHJvZ3JhbSgpOworICAgICAgICAgICAgaWYgKHByb2dyYW0gIT0gMCkgeworICAgICAgICAgICAgICAgIEdMRVMyMC5nbEF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOworICAgICAgICAgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xBdHRhY2hTaGFkZXIgdmVydGV4U2hhZGVyIik7CisgICAgICAgICAgICAgICAgR0xFUzIwLmdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHBpeGVsU2hhZGVyKTsKKyAgICAgICAgICAgICAgICBjaGVja0dsRXJyb3IoImdsQXR0YWNoU2hhZGVyIHBpeGVsU2hhZGVyIik7CisgICAgICAgICAgICAgICAgR0xFUzIwLmdsTGlua1Byb2dyYW0ocHJvZ3JhbSk7CisgICAgICAgICAgICAgICAgaW50W10gbGlua1N0YXR1cyA9IG5ldyBpbnRbMV07CisgICAgICAgICAgICAgICAgR0xFUzIwLmdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMRVMyMC5HTF9MSU5LX1NUQVRVUywgbGlua1N0YXR1cywgMCk7CisgICAgICAgICAgICAgICAgaWYgKGxpbmtTdGF0dXNbMF0gIT0gR0xFUzIwLkdMX1RSVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IGxpbmsgcHJvZ3JhbTogIik7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgR0xFUzIwLmdsR2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSkpOworICAgICAgICAgICAgICAgICAgICBHTEVTMjAuZ2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOworICAgICAgICAgICAgICAgICAgICBwcm9ncmFtID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcHJvZ3JhbTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja0dsRXJyb3IoU3RyaW5nIG9wKSB7CisgICAgICAgICAgICBpbnQgZXJyb3I7CisgICAgICAgICAgICB3aGlsZSAoKGVycm9yID0gR0xFUzIwLmdsR2V0RXJyb3IoKSkgIT0gR0xFUzIwLkdMX05PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCBvcCArICI6IGdsRXJyb3IgIiArIGVycm9yKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihvcCArICI6IGdsRXJyb3IgIiArIGVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFgsIFksIFIgRyBCIEEKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1UcmlhbmdsZVZlcnRpY2VzRGF0YSA9IHsKKyAgICAgICAgICAgICAgICAtMC4wMjVmLCAwLjNmLCAwLjBmLCAxLjBmLCAwLjBmLCAxLjBmLAorICAgICAgICAgICAgICAgICAwLjBmICAsIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYsCisgICAgICAgICAgICAgICAgIDAuMDI1ZiwgMC4zZiwgMS4wZiwgMS4wZiwgMjU1LjBmLCAxLjBmCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAvLyBDb2xvciBjYXNjYWRlOgorICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0W10gbUNvbG9ycyA9IHsKKyAgICAgICAgICAgICAgICAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmLAorICAgICAgICAgICAgICAgIDAuNWYsIDAuMGYsIDAuMGYsIDEuMGYsCisgICAgICAgICAgICAgICAgMC4wZiwgMC41ZiwgMC4wZiwgMS4wZiwKKyAgICAgICAgICAgICAgICAwLjVmLCAwLjVmLCAwLjBmLCAxLjBmLAorCisgICAgICAgICAgICAgICAgMC4wZiwgMC4wZiwgMC41ZiwgMS4wZiwKKyAgICAgICAgICAgICAgICAxLjBmLCAwLjBmLCAwLjBmLCAxLjBmLAorICAgICAgICAgICAgICAgIDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYsCisgICAgICAgICAgICAgICAgMC4wZiwgMS4wZiwgMC4wZiwgMS4wZgorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgZmxvYXRbXSBtVHJpYW5nbGVWZXJ0aWNlc0RhdGEyID0gbmV3IGZsb2F0W21UcmlhbmdsZVZlcnRpY2VzRGF0YS5sZW5ndGhdOworICAgICAgICBwcml2YXRlIEZsb2F0QnVmZmVyIG1UcmlhbmdsZVZlcnRpY2VzOworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1WZXJ0ZXhTaGFkZXIgPSAiYXR0cmlidXRlIHZlYzQgYVBvc2l0aW9uO1xuIgorICAgICAgICAgICAgKyAiYXR0cmlidXRlIHZlYzQgYUNvbG9yO1xuIgorICAgICAgICAgICAgKyAidmFyeWluZyB2ZWM0IHZDb2xvcjtcbiIKKyAgICAgICAgICAgICsgInZvaWQgbWFpbigpIHtcbiIKKyAgICAgICAgICAgICsgIiAgZ2xfUG9zaXRpb24gPSBhUG9zaXRpb247XG4iCisgICAgICAgICAgICArICIgIHZDb2xvciA9IGFDb2xvcjtcbiIKKyAgICAgICAgICAgICsgIn1cbiI7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUZyYWdtZW50U2hhZGVyID0gInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgorICAgICAgICAgICAgKyAidmFyeWluZyB2ZWM0IHZDb2xvcjtcbiIKKyAgICAgICAgICAgICsgInZvaWQgbWFpbigpIHtcbiIKKyAgICAgICAgICAgICsgIiAgZ2xfRnJhZ0NvbG9yID0gdkNvbG9yO1xuIgorICAgICAgICAgICAgKyAifVxuIjsKKworICAgICAgICBwcml2YXRlIGludCBtUHJvZ3JhbTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbXZQb3NpdGlvbkhhbmRsZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbXZDb2xvckhhbmRsZTsKKworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMzc4MDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBPcGVuR0wgRVMgSk5JIHNhbXBsZQorIyBUaGlzIG1ha2VmaWxlIGJ1aWxkcyBib3RoIGFuIGFjdGl2aXR5IGFuZCBhIHNoYXJlZCBsaWJyYXJ5LgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkgIyBub3QgNjQgYml0IGNsZWFuCisKK1RPUF9MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIyBCdWlsZCBhY3Rpdml0eQorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFRlc3RWaWV3cG9ydAorCisjIFNldCBhIHNwZWNpZmljIFNESyB2ZXJzaW9uIHNvIHdlIGNhbiBydW4gb24gRnJveW8uCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IDgKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKK2VuZGlmICMgVEFSR0VUX1NJTVVMQVRPUgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYTlkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlc3QiPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjgiIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iOCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KKyAgICA8YXBwbGljYXRpb24KKyAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvdGVzdF9hY3Rpdml0eSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlRlc3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyLkZ1bGxzY3JlZW4iCisgICAgICAgICAgICAJYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxrZXlib2FyZEhpZGRlbiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L1JFQURNRSBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNmFiYzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L1JFQURNRQpAQCAtMCwwICsxLDI4IEBACitSZXBybyBzdGVwczoKKworYnVpbGQsIGluc3RhbGwgYW5kIHJ1biB0aGUgYXR0YWNoZWQgdGVzdCBwcm9ncmFtIFRlc3RWaWV3cG9ydC5hcGsKKworUnVuIG9uIFNhcHBoaXJlIHdpdGggRnJveW8uCisKK1RoZSBwcm9ncmFtIGNsZWFycyB0aGUgc2NyZWVuIHRvIGJsdWUsIHRoZW4gZHJhd3MgYSBmdWxsIHNjcmVlbiB3aGl0ZSBxdWFkIHRoYXQKK2lzIGFsbGlnbmVkIHRvIHRoZSBzY3JlZW4uCisoVGhlcmVmb3JlIHRoZSB3aG9sZSBzY3JlZW4gc2hvdWxkIGFwcGVhciB0byBiZSB3aGl0ZS4pCisKKworTm90ZSB0aGF0IHNjcmVlbiBpcyBhbGwgd2hpdGUuCisKK1JvdGF0ZSBzY3JlZW4gOTAgZGVncmVlcy4KKworRXhwZWN0ZWQ6IHNjcmVlbiBpcyBzdGlsbCBhbGwgd2hpdGUuCisKK0FjdHVhbDogc2NyZWVuIGlzIGJsdWUgd2l0aCBvZmZzZXQgd2hpdGUgcmVjdGFuZ2xlLgorCitUaGlzIGJ1ZyBvbmx5IGhhcHBlbnMgb24gU2FwcGhpcmUsIGl0IHdvcmtzIGNvcnJlY3RseSBvbiBQYXNzaW9uLgorCitXaGF0IGhhcHBlbnM6CisKK0kgdGhpbmsgdGhlIGJ1ZyBpcyB0aGF0IHRoZSBnbC5nbFZpZXdwb3J0KCkgY2FsbCBpbiBvblN1cmZhY2VDaGFuZ2VkKCkgaXMKK2JlaW5nIGlnbm9yZWQgYnkgdGhlIE9wZW5HTCBkcml2ZXIuCisKK05PVEU6IElmIGEgZ2wuZ2xWaWV3cG9ydCBjYWxsIGlzIGFkZGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9uRHJhd0ZyYW1lKCkKK2NhbGwgKHdoaWNoIG1lYW5zIGl0IGlzIGNhbGxlZCBiZWZvcmUgZXZlcnkgZHJhdyksIHRoZSBwcm9ncmFtIHJ1bnMgY29ycmVjdGx5LgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YjhiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoaXMgZmlsZSBjb250YWlucyByZXNvdXJjZSBkZWZpbml0aW9ucyBmb3IgZGlzcGxheWVkIHN0cmluZ3MsIGFsbG93aW5nCisgICAgIHRoZW0gdG8gYmUgY2hhbmdlZCBiYXNlZCBvbiB0aGUgbG9jYWxlIGFuZCBvcHRpb25zLiAtLT4KKworPHJlc291cmNlcz4KKyAgICA8IS0tIFNpbXBsZSBzdHJpbmdzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InRlc3RfYWN0aXZpdHkiPlRlc3QgVmlld3BvcnQ8L3N0cmluZz4KKworPC9yZXNvdXJjZXM+CisKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdEFjdGl2aXR5LmphdmEgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjN2U0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitwdWJsaWMgY2xhc3MgVGVzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiVGVzdEFjdGl2aXR5IjsKKyAgICBUZXN0VmlldyBtVmlldzsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKyAgICAgICAgbVZpZXcgPSBuZXcgVGVzdFZpZXcoZ2V0QXBwbGljYXRpb24oKSk7CisJICAgIG1WaWV3LnNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOworCSAgICBzZXRDb250ZW50VmlldyhtVmlldyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtVmlldy5vblBhdXNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0Vmlldy5qYXZhIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0Vmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzY2MzN2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RWaWV3LmphdmEKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3Q7CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOworaW1wb3J0IGphdmEubmlvLkNoYXJCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uRmxvYXRCdWZmZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworCitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWc7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0w7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDExOworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBTdXJmYWNlVmlldyB0aGF0IHVzZXMgdGhlIGRlZGljYXRlZCBzdXJmYWNlIGZvcgorICogZGlzcGxheWluZyBhbiBPcGVuR0wgYW5pbWF0aW9uLiAgVGhpcyBhbGxvd3MgdGhlIGFuaW1hdGlvbiB0byBydW4gaW4gYQorICogc2VwYXJhdGUgdGhyZWFkLCB3aXRob3V0IHJlcXVpcmluZyB0aGF0IGl0IGJlIGRyaXZlbiBieSB0aGUgdXBkYXRlIG1lY2hhbmlzbQorICogb2YgdGhlIHZpZXcgaGllcmFyY2h5LgorICoKKyAqIFRoZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyByZW5kZXJpbmcgY29kZSBpcyBkZWxlZ2F0ZWQgdG8gYSBHTFZpZXcuUmVuZGVyZXIKKyAqIGluc3RhbmNlLgorICovCitjbGFzcyBUZXN0VmlldyBleHRlbmRzIEdMU3VyZmFjZVZpZXcgeworICAgIFRlc3RWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgaW5pdCgpOworICAgIH0KKworICAgIHB1YmxpYyBUZXN0VmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIGluaXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgc2V0UmVuZGVyZXIobmV3IFJlbmRlcmVyKCkpOworICAgICAgICBzZXRSZW5kZXJNb2RlKFJFTkRFUk1PREVfV0hFTl9ESVJUWSk7CisgICAgfQorICAgIAorICAgICAgICAvKiogQSBncmlkIGlzIGEgdG9wb2xvZ2ljYWxseSByZWN0YW5ndWxhciBhcnJheSBvZiB2ZXJ0aWNlcy4KKyAgICAqCisgICAgKiBUaGUgdmVydGV4IGFuZCBpbmRleCBkYXRhIGFyZSBoZWxkIGluIFZCTyBvYmplY3RzIGJlY2F1c2Ugb24gbW9zdAorICAgICogR1BVcyBWQk8gb2JqZWN0cyBhcmUgdGhlIGZhc3Rlc3Qgd2F5IG9mIHJlbmRlcmluZyBzdGF0aWMgdmVydGV4CisgICAgKiBhbmQgaW5kZXggZGF0YS4KKyAgICAqCisgICAgKi8KKworICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgR3JpZCB7CisgICAgICAgLy8gU2l6ZSBvZiB2ZXJ0ZXggZGF0YSBlbGVtZW50cyBpbiBieXRlczoKKyAgICAgICBmaW5hbCBzdGF0aWMgaW50IEZMT0FUX1NJWkUgPSA0OworICAgICAgIGZpbmFsIHN0YXRpYyBpbnQgQ0hBUl9TSVpFID0gMjsKKworICAgICAgIC8vIFZlcnRleCBzdHJ1Y3R1cmU6CisgICAgICAgLy8gZmxvYXQgeCwgeSwgejsKKworICAgICAgIGZpbmFsIHN0YXRpYyBpbnQgVkVSVEVYX1NJWkUgPSAzICogRkxPQVRfU0laRTsKKworICAgICAgIHByaXZhdGUgaW50IG1WZXJ0ZXhCdWZmZXJPYmplY3RJZDsKKyAgICAgICBwcml2YXRlIGludCBtRWxlbWVudEJ1ZmZlck9iamVjdElkOworCisgICAgICAgLy8gVGhlc2UgYnVmZmVycyBhcmUgdXNlZCB0byBob2xkIHRoZSB2ZXJ0ZXggYW5kIGluZGV4IGRhdGEgd2hpbGUKKyAgICAgICAvLyBjb25zdHJ1Y3RpbmcgdGhlIGdyaWQuIE9uY2UgY3JlYXRlQnVmZmVyT2JqZWN0cygpIGlzIGNhbGxlZAorICAgICAgIC8vIHRoZSBidWZmZXJzIGFyZSBudWxsZWQgb3V0IHRvIHNhdmUgbWVtb3J5LgorCisgICAgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIG1WZXJ0ZXhCeXRlQnVmZmVyOworICAgICAgIHByaXZhdGUgRmxvYXRCdWZmZXIgbVZlcnRleEJ1ZmZlcjsKKyAgICAgICBwcml2YXRlIENoYXJCdWZmZXIgbUluZGV4QnVmZmVyOworCisgICAgICAgcHJpdmF0ZSBpbnQgbVc7CisgICAgICAgcHJpdmF0ZSBpbnQgbUg7CisgICAgICAgcHJpdmF0ZSBpbnQgbUluZGV4Q291bnQ7CisKKyAgICAgICBwdWJsaWMgR3JpZChpbnQgdywgaW50IGgpIHsKKyAgICAgICAgICAgaWYgKHcgPCAwIHx8IHcgPj0gNjU1MzYpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInciKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBpZiAoaCA8IDAgfHwgaCA+PSA2NTUzNikgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaCIpOworICAgICAgICAgICB9CisgICAgICAgICAgIGlmICh3ICogaCA+PSA2NTUzNikgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidyAqIGggPj0gNjU1MzYiKTsKKyAgICAgICAgICAgfQorCisgICAgICAgICAgIG1XID0gdzsKKyAgICAgICAgICAgbUggPSBoOworICAgICAgICAgICBpbnQgc2l6ZSA9IHcgKiBoOworCisgICAgICAgICAgIG1WZXJ0ZXhCeXRlQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChWRVJURVhfU0laRSAqIHNpemUpCisgICAgICAgICAgICAgICAub3JkZXIoQnl0ZU9yZGVyLm5hdGl2ZU9yZGVyKCkpOworICAgICAgICAgICBtVmVydGV4QnVmZmVyID0gbVZlcnRleEJ5dGVCdWZmZXIuYXNGbG9hdEJ1ZmZlcigpOworCisgICAgICAgICAgIGludCBxdWFkVyA9IG1XIC0gMTsKKyAgICAgICAgICAgaW50IHF1YWRIID0gbUggLSAxOworICAgICAgICAgICBpbnQgcXVhZENvdW50ID0gcXVhZFcgKiBxdWFkSDsKKyAgICAgICAgICAgaW50IGluZGV4Q291bnQgPSBxdWFkQ291bnQgKiA2OworICAgICAgICAgICBtSW5kZXhDb3VudCA9IGluZGV4Q291bnQ7CisgICAgICAgICAgIG1JbmRleEJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoQ0hBUl9TSVpFICogaW5kZXhDb3VudCkKKyAgICAgICAgICAgICAgIC5vcmRlcihCeXRlT3JkZXIubmF0aXZlT3JkZXIoKSkuYXNDaGFyQnVmZmVyKCk7CisKKyAgICAgICAgICAgLyoKKyAgICAgICAgICAgICogSW5pdGlhbGl6ZSB0cmlhbmdsZSBsaXN0IG1lc2guCisgICAgICAgICAgICAqCisgICAgICAgICAgICAqICAgICBbMF0tLS0tLVsgIDFdIC4uLgorICAgICAgICAgICAgKiAgICAgIHwgICAgLyAgIHwKKyAgICAgICAgICAgICogICAgICB8ICAgLyAgICB8CisgICAgICAgICAgICAqICAgICAgfCAgLyAgICAgfAorICAgICAgICAgICAgKiAgICAgW3ddLS0tLS1bdysxXSAuLi4KKyAgICAgICAgICAgICogICAgICB8ICAgICAgIHwKKyAgICAgICAgICAgICoKKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBxdWFkSDsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBxdWFkVzsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYSA9IChjaGFyKSAoeSAqIG1XICsgeCk7CisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYiA9IChjaGFyKSAoeSAqIG1XICsgeCArIDEpOworICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSAoY2hhcikgKCh5ICsgMSkgKiBtVyArIHgpOworICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGQgPSAoY2hhcikgKCh5ICsgMSkgKiBtVyArIHggKyAxKTsKKworICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgYSk7CisgICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGIpOworCisgICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGMpOworICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgZCk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisKKyAgICAgICB9CisKKyAgICAgICBwdWJsaWMgdm9pZCBzZXQoaW50IGksIGludCBqLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgICAgIGlmIChpIDwgMCB8fCBpID49IG1XKSB7CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpIik7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgaWYgKGogPCAwIHx8IGogPj0gbUgpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImoiKTsKKyAgICAgICAgICAgfQorCisgICAgICAgICAgIGludCBpbmRleCA9IG1XICogaiArIGk7CisKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlci5wb3NpdGlvbihpbmRleCAqIFZFUlRFWF9TSVpFIC8gRkxPQVRfU0laRSk7CisgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXIucHV0KHgpOworICAgICAgICAgICBtVmVydGV4QnVmZmVyLnB1dCh5KTsKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlci5wdXQoeik7CisgICAgICAgfQorCisgICAgICAgcHVibGljIHZvaWQgY3JlYXRlQnVmZmVyT2JqZWN0cyhHTCBnbCkgeworICAgICAgICAgICAvLyBHZW5lcmF0ZSBhIHRoZSB2ZXJ0ZXggYW5kIGVsZW1lbnQgYnVmZmVyIElEcworICAgICAgICAgICBpbnRbXSB2Ym9JZHMgPSBuZXcgaW50WzJdOworICAgICAgICAgICBHTDExIGdsMTEgPSAoR0wxMSkgZ2w7CisgICAgICAgICAgIGdsMTEuZ2xHZW5CdWZmZXJzKDIsIHZib0lkcywgMCk7CisgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXJPYmplY3RJZCA9IHZib0lkc1swXTsKKyAgICAgICAgICAgbUVsZW1lbnRCdWZmZXJPYmplY3RJZCA9IHZib0lkc1sxXTsKKworICAgICAgICAgICAvLyBVcGxvYWQgdGhlIHZlcnRleCBkYXRhCisgICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfQVJSQVlfQlVGRkVSLCBtVmVydGV4QnVmZmVyT2JqZWN0SWQpOworICAgICAgICAgICBtVmVydGV4Qnl0ZUJ1ZmZlci5wb3NpdGlvbigwKTsKKyAgICAgICAgICAgZ2wxMS5nbEJ1ZmZlckRhdGEoR0wxMS5HTF9BUlJBWV9CVUZGRVIsIG1WZXJ0ZXhCeXRlQnVmZmVyLmNhcGFjaXR5KCksIG1WZXJ0ZXhCeXRlQnVmZmVyLCBHTDExLkdMX1NUQVRJQ19EUkFXKTsKKworICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBtRWxlbWVudEJ1ZmZlck9iamVjdElkKTsKKyAgICAgICAgICAgbUluZGV4QnVmZmVyLnBvc2l0aW9uKDApOworICAgICAgICAgICBnbDExLmdsQnVmZmVyRGF0YShHTDExLkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBtSW5kZXhCdWZmZXIuY2FwYWNpdHkoKSAqIENIQVJfU0laRSwgbUluZGV4QnVmZmVyLCBHTDExLkdMX1NUQVRJQ19EUkFXKTsKKworICAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRoZSBpbi1tZW1vcnkgZGF0YSBhbnkgbW9yZQorICAgICAgICAgICBtVmVydGV4QnVmZmVyID0gbnVsbDsKKyAgICAgICAgICAgbVZlcnRleEJ5dGVCdWZmZXIgPSBudWxsOworICAgICAgICAgICBtSW5kZXhCdWZmZXIgPSBudWxsOworICAgICAgIH0KKworICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoR0wxMCBnbCkgeworICAgICAgICAgICBHTDExIGdsMTEgPSAoR0wxMSkgZ2w7CisKKyAgICAgICAgICAgZ2wuZ2xFbmFibGVDbGllbnRTdGF0ZShHTDEwLkdMX1ZFUlRFWF9BUlJBWSk7CisKKyAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9BUlJBWV9CVUZGRVIsIG1WZXJ0ZXhCdWZmZXJPYmplY3RJZCk7CisgICAgICAgICAgIGdsMTEuZ2xWZXJ0ZXhQb2ludGVyKDMsIEdMMTAuR0xfRkxPQVQsIFZFUlRFWF9TSVpFLCAwKTsKKyAgICAgICAgICAgCisgICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1FbGVtZW50QnVmZmVyT2JqZWN0SWQpOworICAgICAgICAgICBnbDExLmdsRHJhd0VsZW1lbnRzKEdMMTAuR0xfVFJJQU5HTEVTLCBtSW5kZXhDb3VudCwgR0wxMC5HTF9VTlNJR05FRF9TSE9SVCwgMCk7CisgICAgICAgICAgIGdsLmdsRGlzYWJsZUNsaWVudFN0YXRlKEdMMTAuR0xfVkVSVEVYX0FSUkFZKTsKKyAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9BUlJBWV9CVUZGRVIsIDApOworICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCAwKTsKKyAgICAgICB9CisgICB9CisKKworICAgIHByaXZhdGUgY2xhc3MgUmVuZGVyZXIgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LlJlbmRlcmVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSZW5kZXJlciI7CisgICAgICAgIHByaXZhdGUgR3JpZCBtR3JpZDsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRHJhd0ZyYW1lKEdMMTAgZ2wpIHsKKwkJCWdsLmdsQ2xlYXJDb2xvcigwLDAsMSwxKTsKKwkJCWdsLmdsQ2xlYXIoR0wxMC5HTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgICAgICAgIG1HcmlkLmRyYXcoZ2wpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ2hhbmdlZChHTDEwIGdsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgICAgIGdsLmdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisJCQlnbC5nbE1hdHJpeE1vZGUoR0wxMS5HTF9QUk9KRUNUSU9OKTsKKwkJCWdsLmdsTG9hZElkZW50aXR5KCk7CisJCQlnbC5nbE9ydGhvZigwLCB3aWR0aCwgaGVpZ2h0LCAwLCAtMSwgMSk7CisJCQlnbC5nbE1hdHJpeE1vZGUoR0wxMS5HTF9NT0RFTFZJRVcpOworICAgICAgICAgICAgY3JlYXRlR3JpZChnbCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKEdMMTAgZ2wsIEVHTENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUdyaWQoR0wxMCBnbCwgZmxvYXQgdywgZmxvYXQgaCkgeworICAgICAgICBtR3JpZCA9IG5ldyBHcmlkKDIsIDIpOworCQkJZm9yIChpbnQgaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworCQkJCQlmbG9hdCB4ID0gdyAqIGk7CisJCQkJCWZsb2F0IHkgPSBoICogajsKKwkJCQkJZmxvYXQgeiA9IDAuMGY7CisJCQkJCW1HcmlkLnNldChpLGosIHgsIHksIHopOworCQkJCX0KKwkJCX0KKwkJCW1HcmlkLmNyZWF0ZUJ1ZmZlck9iamVjdHMoZ2wpOworCQl9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCAzN2Y1YjYxLi5mZmQ2YjU5IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTE4LDYgKzE4LDYgQEAKICovCiAtLT4KIDxyZXNvdXJjZXMgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDwhLS0gc2VydmljZSBuYW1lICAtLT4KKyAgICA8IS0tIHNlcnZpY2UgbmFtZSBbQ0hBUiBMSU1JVD0yNV0gIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ic2VydmljZV9uYW1lIj5QYWNrYWdlIEFjY2VzcyBIZWxwZXI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9yZXMvdmFsdWVzLXJtL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9yZXMvdmFsdWVzLXJtL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MWU2MjUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Jlcy92YWx1ZXMtcm0vc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwX2xhYmVsIiBtc2dpZD0iNDU2NzU2NjA5ODUyODU4ODg2MyI+Ik1lbW9yaWEgZGFscyBwYXJhbWV0ZXJzIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Jlcy92YWx1ZXMvZGVmYXVsdHMueG1sIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9yZXMvdmFsdWVzL2RlZmF1bHRzLnhtbAppbmRleCA1MmUwNGQ3Li44ZGU1MDdlIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Jlcy92YWx1ZXMvZGVmYXVsdHMueG1sCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvcmVzL3ZhbHVlcy9kZWZhdWx0cy54bWwKQEAgLTMsMTYgKzMsMTYgQEAKIC8qKgogICogQ29weXJpZ2h0IChjKSAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIC0tPgpAQCAtMjQsNiArMjQsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZGVmX2FpcnBsYW5lX21vZGVfcmFkaW9zIiB0cmFuc2xhdGFibGU9ImZhbHNlIj5jZWxsLGJsdWV0b290aCx3aWZpPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhaXJwbGFuZV9tb2RlX3RvZ2dsZWFibGVfcmFkaW9zIiB0cmFuc2xhdGFibGU9ImZhbHNlIj5ibHVldG9vdGgsd2lmaTwvc3RyaW5nPgogICAgIDxib29sIG5hbWU9ImRlZl9hdXRvX3RpbWUiPnRydWU8L2Jvb2w+CisgICAgPGJvb2wgbmFtZT0iZGVmX2F1dG9fdGltZV96b25lIj50cnVlPC9ib29sPgogICAgIDxib29sIG5hbWU9ImRlZl9hY2NlbGVyb21ldGVyX3JvdGF0aW9uIj50cnVlPC9ib29sPgogICAgIDwhLS0gRGVmYXVsdCBzY3JlZW4gYnJpZ2h0bmVzcywgZnJvbSAwIHRvIDI1NS4gIDEwMiBpcyA0MCUuIC0tPgogICAgIDxpbnRlZ2VyIG5hbWU9ImRlZl9zY3JlZW5fYnJpZ2h0bmVzcyI+MTAyPC9pbnRlZ2VyPgpAQCAtMzEsMTIgKzMyLDEyIEBACiAgICAgPGZyYWN0aW9uIG5hbWU9ImRlZl93aW5kb3dfYW5pbWF0aW9uX3NjYWxlIj4xMDAlPC9mcmFjdGlvbj4KICAgICA8ZnJhY3Rpb24gbmFtZT0iZGVmX3dpbmRvd190cmFuc2l0aW9uX3NjYWxlIj4xMDAlPC9mcmFjdGlvbj4KICAgICA8Ym9vbCBuYW1lPSJkZWZfaGFwdGljX2ZlZWRiYWNrIj50cnVlPC9ib29sPgotICAgIAorCiAgICAgPGJvb2wgbmFtZT0iZGVmX2JsdWV0b290aF9vbiI+ZmFsc2U8L2Jvb2w+CiAgICAgPGJvb2wgbmFtZT0iZGVmX2luc3RhbGxfbm9uX21hcmtldF9hcHBzIj5mYWxzZTwvYm9vbD4KLSAgICA8IS0tIENvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGxvY2F0aW9uIHByb3ZpZGVycy4gCisgICAgPCEtLSBDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBsb2NhdGlvbiBwcm92aWRlcnMuCiAgICAgICAgICBOZXR3b3JrIGxvY2F0aW9uIGlzIG9mZiBieSBkZWZhdWx0IGJlY2F1c2UgaXQgcmVxdWlyZXMKLSAgICAgICAgIHVzZXIgb3B0LWluIHZpYSBTZXR1cCBXaXphcmQgb3IgU2V0dGluZ3MuICAKKyAgICAgICAgIHVzZXIgb3B0LWluIHZpYSBTZXR1cCBXaXphcmQgb3IgU2V0dGluZ3MuCiAgICAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJkZWZfbG9jYXRpb25fcHJvdmlkZXJzX2FsbG93ZWQiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPmdwczwvc3RyaW5nPgogICAgIDxib29sIG5hbWU9ImFzc2lzdGVkX2dwc19lbmFibGVkIj50cnVlPC9ib29sPgpAQCAtNDUsMTEgKzQ2LDExIEBACiAgICAgPGJvb2wgbmFtZT0iZGVmX3VzYl9tYXNzX3N0b3JhZ2VfZW5hYmxlZCI+dHJ1ZTwvYm9vbD4KICAgICA8Ym9vbCBuYW1lPSJkZWZfd2lmaV9vbiI+ZmFsc2U8L2Jvb2w+CiAgICAgPGJvb2wgbmFtZT0iZGVmX25ldHdvcmtzX2F2YWlsYWJsZV9ub3RpZmljYXRpb25fb24iPnRydWU8L2Jvb2w+Ci0gICAgCisKICAgICA8Ym9vbCBuYW1lPSJkZWZfYmFja3VwX2VuYWJsZWQiPmZhbHNlPC9ib29sPgogICAgIDxzdHJpbmcgbmFtZT0iZGVmX2JhY2t1cF90cmFuc3BvcnQiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPmFuZHJvaWQvY29tLmFuZHJvaWQuaW50ZXJuYWwuYmFja3VwLkxvY2FsVHJhbnNwb3J0PC9zdHJpbmc+CiAKLSAgICA8IS0tIERlZmF1bHQgdmFsdWUgZm9yIHdoZXRoZXIgb3Igbm90IHRvIHB1bHNlIHRoZSBub3RpZmljYXRpb24gTEVEIHdoZW4gdGhlcmUgaXMgYSAKKyAgICA8IS0tIERlZmF1bHQgdmFsdWUgZm9yIHdoZXRoZXIgb3Igbm90IHRvIHB1bHNlIHRoZSBub3RpZmljYXRpb24gTEVEIHdoZW4gdGhlcmUgaXMgYQogICAgICAgICAgcGVuZGluZyBub3RpZmljYXRpb24gLS0+CiAgICAgPGJvb2wgbmFtZT0iZGVmX25vdGlmaWNhdGlvbl9wdWxzZSI+dHJ1ZTwvYm9vbD4KIApAQCAtNzIsNCArNzMsMzQgQEAKIAogICAgIDwhLS0gRGVmYXVsdCBmb3IgU2V0dGluZ3MuU3lzdGVtLlZJQlJBVEVfSU5fU0lMRU5UIC0tPgogICAgIDxib29sIG5hbWU9ImRlZl92aWJyYXRlX2luX3NpbGVudCI+dHJ1ZTwvYm9vbD4KKworICAgIDxib29sIG5hbWU9ImRlZl91c2VfcHRwX2ludGVyZmFjZSI+ZmFsc2U8L2Jvb2w+CisKKyAgICA8IS0tIERlZmF1bHQgZm9yIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX1NDUklQVF9JTkpFQ1RJT04gLS0+CisgICAgPGJvb2wgbmFtZT0iZGVmX2FjY2Vzc2liaWxpdHlfc2NyaXB0X2luamVjdGlvbiI+ZmFsc2U8L2Jvb2w+CisKKyAgICA8IS0tIERlZmF1bHQgZm9yIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX1dFQl9DT05URU5UX0tFWV9CSU5ESU5HUyAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZl9hY2Nlc3NpYmlsaXR5X3dlYl9jb250ZW50X2tleV9iaW5kaW5ncyIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+CisgICAgICAgICAgICA8IS0tIERQQUQvVHJhY2tiYWxsIFVQIG1hcHMgdG8gdHJhdmVyc2UgcHJldmlvdXMgb24gY3VycmVudCBheGlzIGFuZCBzZW5kIGFuIGV2ZW50LiAtLT4KKyAgICAgICAgICAgIDB4MTM9MHgwMTAwMDEwMDsKKyAgICAgICAgICAgIDwhLS0gRFBBRC9UcmFja2JhbGwgRE9XTiBtYXBzIHRvIHRyYXZlcnNlIG5leHQgb24gY3VycmVudCBheGlzIGFuZCBzZW5kIGFuIGV2ZW50LiAtLT4KKyAgICAgICAgICAgIDB4MTQ9MHgwMTAxMDEwMDsKKyAgICAgICAgICAgIDwhLS0gRFBBRC9UcmFja2JhbGwgTEVGVCBtYXBzIHRvIGFjdGlvbiBpbiBub24tYW5kcm9pZCBkZWZhdWx0IG5hdmlnYXRpb24gYXhpcy4gLS0+CisgICAgICAgICAgICAweDE1PTB4MDQwMDAwMDA7CisgICAgICAgICAgICA8IS0tIERQQUQvVHJhY2tiYWxsIFJJR0hUIG1hcHMgdG8gbm8gYWN0aW9uIGluIG5vbi1hbmRyb2lkIGRlZmF1bHQgbmF2aWdhdGlvbiBheGlzLiAtLT4KKyAgICAgICAgICAgIDB4MTY9MHgwNDAwMDAwMDsKKyAgICAgICAgICAgIDwhLS0gTGVmdCBBbHQrRFBBRC9UcmFja2JhbGwgVVAgdHJhbnNpdGlvbnMgZnJvbSBhbiBheGlzIHRvIGFub3RoZXIgYW5kIHNlbmRzIGFuIGV2ZW50LiAtLT4KKyAgICAgICAgICAgIDwhLS0gQXhpcyB0cmFuc2l0aW9uczogIDIgLT4gNzsgMSAtPiAyOyAwIC0+IDE7IDMgLT4gMDsgNCAtPiAwOyA1IC0+IDA7IDYgLT4gMDsgLS0+CisgICAgICAgICAgICAweDEyMDAxMz0weDAzMDIwNzAxOjB4MDMwMTAyMDE6MHgwMzAwMDEwMToweDAzMDMwMDAxOjB4MDMwNDAwMDE6MHgwMzA1MDAwMToweDAzMDYwMDAxOworICAgICAgICAgICAgPCEtLSBMZWZ0IEFsdCtEUEFEL1RyYWNrYmFsbCBET1dOIHRyYW5zaXRpb25zIGZyb20gYW4gYXhpcyB0byBhbm90aGVyIGFuZCBzZW5kcyBhbiBldmVudC4gLS0+CisgICAgICAgICAgICA8IS0tIEF4aXMgdHJhbnNpdGlvbnM6IDEgLT4gMDsgMiAtPiAxOyA3IC0+IDI7IDMgLT4gNzsgNCAtPiA3OyA1IC0+IDc7IDYgLT4gNzsgLS0+CisgICAgICAgICAgICAweDEyMDAxND0weDAzMDEwMDAxOjB4MDMwMjAxMDE6MHgwMzA3MDIwMToweDAzMDMwNzAxOjB4MDMwNDA3MDE6MHgwMzA1MDcwMToweDAzMDYwNzAxOworICAgICAgICAgICAgPCEtLSBMZWZ0IEFsdCtEUEFEL1RyYWNrYmFsbCBMRUZUIHRyYW5zaXRpb25zIGZyb20gYW4gYXhpcyB0byBhbm90aGVyIGFuZCBzZW5kcyBhbiBldmVudC4gLS0+CisgICAgICAgICAgICA8IS0tIEF4aXMgdHJhbnNpdGlvbnM6IDQgLT4gMzsgNSAtPiA0OyA2IC0+IDU7IDAgLT4gNjsgMSAtPiA2OyAyIC0+IDY7IDcgLT4gNjsgLS0+CisgICAgICAgICAgICAweDEyMDAxNT0weDAzMDQwMzAxOjB4MDMwNTA0MDE6MHgwMzA2MDUwMToweDAzMDAwNjAxOjB4MDMwMTA2MDE6MHgwMzAyMDYwMToweDAzMDcwNjAxOworICAgICAgICAgICAgPCEtLSBMZWZ0IEFsdCtEUEFEL1RyYWNrYmFsbCBSSUdIVCB0cmFuc2l0aW9ucyBmcm9tIGFuIGF4aXMgdG8gYW5vdGhlciBhbmQgc2VuZHMgYW4gZXZlbnQuICAtLT4KKyAgICAgICAgICAgIDwhLS0gQXhpcyB0cmFuc2l0aW9uczogNSAtPiA2OyA0IC0+IDU7IDMgLT4gNDsgMiAtPiAzOyA3IC0+IDM7IDEgLT4gMzsgMCAtPiAzOyAtLT4KKyAgICAgICAgICAgIDB4MTIwMDE2PTB4MDMwNTA2MDE6MHgwMzA0MDUwMToweDAzMDMwNDAxOjB4MDMwMjAzMDE6MHgwMzA3MDMwMToweDAzMDEwMzAxOjB4MDMwMDAzMDE7CisgICAgPC9zdHJpbmc+CisKIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL0RhdGFiYXNlSGVscGVyLmphdmEgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvRGF0YWJhc2VIZWxwZXIuamF2YQppbmRleCBhZDA0YmI0Li45YWM4MzJiIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvRGF0YWJhc2VIZWxwZXIuamF2YQorKysgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvRGF0YWJhc2VIZWxwZXIuamF2YQpAQCAtMTYsMTIgKzE2LDIwIEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQucHJvdmlkZXJzLnNldHRpbmdzOwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuY29udGVudC5QYWNrYWdlSGVscGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5SSUxDb25zdGFudHM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5YbWxVdGlsczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5VdGlsczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3OworCitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKQEAgLTM1LDE4ICs0Myw3IEBACiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5jb250ZW50LlBhY2thZ2VIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlJJTENvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlhtbFV0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblV0aWxzOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblZpZXc7Ci1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKQEAgLTY0LDcgKzYxLDcgQEAKICAgICAvLyBkYXRhYmFzZSBnZXRzIHVwZ3JhZGVkIHByb3Blcmx5LiBBdCBhIG1pbmltdW0sIHBsZWFzZSBjb25maXJtIHRoYXQgJ3VwZ3JhZGVWZXJzaW9uJwogICAgIC8vIGlzIHByb3Blcmx5IHByb3BhZ2F0ZWQgdGhyb3VnaCB5b3VyIGNoYW5nZS4gIE5vdCBkb2luZyBzbyB3aWxsIHJlc3VsdCBpbiBhIGxvc3Mgb2YgdXNlcgogICAgIC8vIHNldHRpbmdzLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEQVRBQkFTRV9WRVJTSU9OID0gNTc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERBVEFCQVNFX1ZFUlNJT04gPSA1OTsKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKIApAQCAtNzM0LDYgKzczMSw1MCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgdXBncmFkZVZlcnNpb24gPSA1NzsKICAgICAgICAgfQorCisgICAgICAgIGlmICh1cGdyYWRlVmVyc2lvbiA9PSA1NykgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIE5ldyBzZXR0aW5ncyB0bzoKKyAgICAgICAgICAgICAqICAxLiBFbmFibGUgaW5qZWN0aW9uIG9mIGFjY2Vzc2liaWxpdHkgc2NyaXB0cyBpbiBXZWJWaWV3cy4KKyAgICAgICAgICAgICAqICAyLiBEZWZpbmUgdGhlIGtleSBiaW5kaW5ncyBmb3IgdHJhdmVyc2luZyB3ZWIgY29udGVudCBpbiBXZWJWaWV3cy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzdG10ID0gZGIuY29tcGlsZVN0YXRlbWVudCgiSU5TRVJUIElOVE8gc2VjdXJlKG5hbWUsdmFsdWUpIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFZBTFVFUyg/LD8pOyIpOworICAgICAgICAgICAgICAgIGxvYWRCb29sZWFuU2V0dGluZyhzdG10LCBTZXR0aW5ncy5TZWN1cmUuQUNDRVNTSUJJTElUWV9TQ1JJUFRfSU5KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgUi5ib29sLmRlZl9hY2Nlc3NpYmlsaXR5X3NjcmlwdF9pbmplY3Rpb24pOworICAgICAgICAgICAgICAgIHN0bXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBzdG10ID0gZGIuY29tcGlsZVN0YXRlbWVudCgiSU5TRVJUIElOVE8gc2VjdXJlKG5hbWUsdmFsdWUpIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFZBTFVFUyg/LD8pOyIpOworICAgICAgICAgICAgICAgIGxvYWRTdHJpbmdTZXR0aW5nKHN0bXQsIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX1dFQl9DT05URU5UX0tFWV9CSU5ESU5HUywKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRlZl9hY2Nlc3NpYmlsaXR5X3dlYl9jb250ZW50X2tleV9iaW5kaW5ncyk7CisgICAgICAgICAgICAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGRiLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0bXQgIT0gbnVsbCkgc3RtdC5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBncmFkZVZlcnNpb24gPSA1ODsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh1cGdyYWRlVmVyc2lvbiA9PSA1OCkgeworICAgICAgICAgICAgLyogQWRkIGRlZmF1bHQgZm9yIG5ldyBBdXRvIFRpbWUgWm9uZSAqLworICAgICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzdG10ID0gZGIuY29tcGlsZVN0YXRlbWVudCgiSU5TRVJUIElOVE8gc2VjdXJlKG5hbWUsdmFsdWUpIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFZBTFVFUyg/LD8pOyIpOworICAgICAgICAgICAgICAgIGxvYWRCb29sZWFuU2V0dGluZyhzdG10LCBTZXR0aW5ncy5TeXN0ZW0uQVVUT19USU1FX1pPTkUsCisgICAgICAgICAgICAgICAgICAgICAgICBSLmJvb2wuZGVmX2F1dG9fdGltZV96b25lKTsgLy8gU3luYyB0aW1lem9uZSB0byBOSVRaCisgICAgICAgICAgICAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGRiLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0bXQgIT0gbnVsbCkgc3RtdC5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBncmFkZVZlcnNpb24gPSA1OTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vICoqKiBSZW1lbWJlciB0byB1cGRhdGUgREFUQUJBU0VfVkVSU0lPTiBhYm92ZSEKIAogICAgICAgICBpZiAodXBncmFkZVZlcnNpb24gIT0gY3VycmVudFZlcnNpb24pIHsKQEAgLTg3Niw3ICs5MTcsNyBAQAogICAgICAgICAgICAgICAgIFN0cmluZyBjbHMgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgImNsYXNzIik7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHNob3J0Y3V0U3RyID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJzaG9ydGN1dCIpOwogCi0gICAgICAgICAgICAgICAgaW50IHNob3J0Y3V0VmFsdWUgPSAoaW50KSBzaG9ydGN1dFN0ci5jaGFyQXQoMCk7CisgICAgICAgICAgICAgICAgaW50IHNob3J0Y3V0VmFsdWUgPSBzaG9ydGN1dFN0ci5jaGFyQXQoMCk7CiAgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHNob3J0Y3V0U3RyKSkgewogICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gZ2V0IHNob3J0Y3V0IGZvcjogIiArIHBrZyArICIvIiArIGNscyk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTA0NCw3ICsxMDg1LDEwIEBACiAgICAgCiAgICAgICAgICAgICBsb2FkQm9vbGVhblNldHRpbmcoc3RtdCwgU2V0dGluZ3MuU3lzdGVtLkFVVE9fVElNRSwKICAgICAgICAgICAgICAgICAgICAgUi5ib29sLmRlZl9hdXRvX3RpbWUpOyAvLyBTeW5jIHRpbWUgdG8gTklUWgotICAgIAorCisgICAgICAgICAgICBsb2FkQm9vbGVhblNldHRpbmcoc3RtdCwgU2V0dGluZ3MuU3lzdGVtLkFVVE9fVElNRV9aT05FLAorICAgICAgICAgICAgICAgICAgICBSLmJvb2wuZGVmX2F1dG9fdGltZV96b25lKTsgLy8gU3luYyB0aW1lem9uZSB0byBOSVRaCisKICAgICAgICAgICAgIGxvYWRJbnRlZ2VyU2V0dGluZyhzdG10LCBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1MsCiAgICAgICAgICAgICAgICAgICAgIFIuaW50ZWdlci5kZWZfc2NyZWVuX2JyaWdodG5lc3MpOwogICAgIApAQCAtMTA2OCw2ICsxMTEyLDkgQEAKICAgICAKICAgICAgICAgICAgIGxvYWRCb29sZWFuU2V0dGluZyhzdG10LCBTZXR0aW5ncy5TeXN0ZW0uVklCUkFURV9JTl9TSUxFTlQsCiAgICAgICAgICAgICAgICAgICAgIFIuYm9vbC5kZWZfdmlicmF0ZV9pbl9zaWxlbnQpOworCisgICAgICAgICAgICBsb2FkQm9vbGVhblNldHRpbmcoc3RtdCwgU2V0dGluZ3MuU3lzdGVtLlVTRV9QVFBfSU5URVJGQUNFLAorICAgICAgICAgICAgICAgICAgICBSLmJvb2wuZGVmX3VzZV9wdHBfaW50ZXJmYWNlKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGlmIChzdG10ICE9IG51bGwpIHN0bXQuY2xvc2UoKTsKICAgICAgICAgfQpAQCAtMTE4NCw2ICsxMjMxLDEyIEBACiAgICAgCiAgICAgICAgICAgICBsb2FkQm9vbGVhblNldHRpbmcoc3RtdCwgU2V0dGluZ3MuU2VjdXJlLk1PVU5UX1VNU19OT1RJRllfRU5BQkxFRCwKICAgICAgICAgICAgICAgICAgICAgUi5ib29sLmRlZl9tb3VudF91bXNfbm90aWZ5X2VuYWJsZWQpOworCisgICAgICAgICAgICBsb2FkQm9vbGVhblNldHRpbmcoc3RtdCwgU2V0dGluZ3MuU2VjdXJlLkFDQ0VTU0lCSUxJVFlfU0NSSVBUX0lOSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgUi5ib29sLmRlZl9hY2Nlc3NpYmlsaXR5X3NjcmlwdF9pbmplY3Rpb24pOworCisgICAgICAgICAgICBsb2FkU3RyaW5nU2V0dGluZyhzdG10LCBTZXR0aW5ncy5TZWN1cmUuQUNDRVNTSUJJTElUWV9XRUJfQ09OVEVOVF9LRVlfQklORElOR1MsCisgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmRlZl9hY2Nlc3NpYmlsaXR5X3dlYl9jb250ZW50X2tleV9iaW5kaW5ncyk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBpZiAoc3RtdCAhPSBudWxsKSBzdG10LmNsb3NlKCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWQubWsgYi9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkLm1rCmluZGV4IDRjODM3NjguLjJjMTMwNjkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWQubWsKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZC5tawpAQCAtMywxMSArMywxNiBAQAogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKSBcCisgICAgLi4vLi4vLi4vZXgvY2Fyb3VzZWwvamF2YS9jb20vYW5kcm9pZC9leC9jYXJvdXNlbC9jYXJvdXNlbC5ycwogCiBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBzZXJ2aWNlcwogCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1jb21tb24tY2Fyb3VzZWwKKwogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFN5c3RlbVVJCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBwbGF0Zm9ybQogCitMT0NBTF9QUk9HVUFSRF9GTEFHX0ZJTEVTIDo9IHByb2d1YXJkLmZsYWdzCisKIGluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMGZjY2JlNy4uNjA1NzAyMyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC01LDYgKzUsOSBAQAogICAgICAgICA+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlNUQVRVU19CQVJfU0VSVklDRSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJMVUVUT09USCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJMVUVUT09USF9BRE1JTiIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkdFVF9UQVNLUyIgLz4KIAogICAgIDxhcHBsaWNhdGlvbgogICAgICAgICBhbmRyb2lkOnBlcnNpc3RlbnQ9InRydWUiCkBAIC0xMyw3ICsxNiwxMiBAQAogICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19sYXVuY2hlcl9zZXR0aW5ncyI+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICA8c2VydmljZQotICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSIuc3RhdHVzYmFyLlN0YXR1c0JhclNlcnZpY2UiCisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5zdGF0dXNiYXIuUGhvbmVTdGF0dXNCYXJTZXJ2aWNlIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDxzZXJ2aWNlCisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5zdGF0dXNiYXIudGFibGV0LlRhYmxldFN0YXR1c0JhclNlcnZpY2UiCiAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJmYWxzZSIKICAgICAgICAgICAgIC8+CiAKQEAgLTIxLDUgKzI5LDEyIEBACiAgICAgICAgICAgICAgICAgYW5kcm9pZDpleGNsdWRlRnJvbVJlY2VudHM9InRydWUiPgogICAgICAgICA8L2FjdGl2aXR5PgogCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5yZWNlbnQuUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyIgorICAgICAgICAgICAgYW5kcm9pZDpleGNsdWRlRnJvbVJlY2VudHM9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZUluc3RhbmNlIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKICAgICA8L2FwcGxpY2F0aW9uPgogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Byb2d1YXJkLmZsYWdzIGIvcGFja2FnZXMvU3lzdGVtVUkvcHJvZ3VhcmQuZmxhZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU0ODQ2MQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Byb2d1YXJkLmZsYWdzCkBAIC0wLDAgKzEsNiBAQAorLWtlZXAgY2xhc3MgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5UYWJsZXRTdGF0dXNCYXJTZXJ2aWNlIHsKKyAgcHVibGljIHZvaWQgbm90aWZpY2F0aW9uSWNvbnNDbGlja2VkKGFuZHJvaWQudmlldy5WaWV3KTsKKyAgcHVibGljIHZvaWQgc3lzdGVtSW5mb0NsaWNrZWQoYW5kcm9pZC52aWV3LlZpZXcpOworICBwdWJsaWMgdm9pZCByZWNlbnRCdXR0b25DbGlja2VkKGFuZHJvaWQudmlldy5WaWV3KTsKKyAgcHVibGljIHZvaWQgdG9nZ2xlTGlnaHRzT3V0KGFuZHJvaWQudmlldy5WaWV3KTsKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL2h5ZHJhdWxpY19icmFrZV9pbnRlcnBvbGF0b3IueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vaHlkcmF1bGljX2JyYWtlX2ludGVycG9sYXRvci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2Nzc4ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL2h5ZHJhdWxpY19icmFrZV9pbnRlcnBvbGF0b3IueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9yZXMvYW5pbS9lYXNlX291dF9pbnRlcnBvbGF0b3IueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8ZGVjZWxlcmF0ZUludGVycG9sYXRvciAKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpmYWN0b3I9IjEwLjAiIC8+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9saWdodHNfb3V0X2luLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL2xpZ2h0c19vdXRfaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNTRlYzAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9saWdodHNfb3V0X2luLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICA+CisgICAgPHRyYW5zbGF0ZSBhbmRyb2lkOmZyb21ZRGVsdGE9IjEwMCVwIiBhbmRyb2lkOnRvWURlbHRhPSIwIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIgCisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9oeWRyYXVsaWNfYnJha2VfaW50ZXJwb2xhdG9yIgorICAgICAgICAvPgorICAgIDxhbHBoYSBhbmRyb2lkOmZyb21BbHBoYT0iMC4wIiBhbmRyb2lkOnRvQWxwaGE9IjEuMCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbG9uZ0FuaW1UaW1lIiAKKyAgICAgICAgLz4KKzwvc2V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vbGlnaHRzX291dF9vdXQueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vbGlnaHRzX291dF9vdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmM1NWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9saWdodHNfb3V0X291dC54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgPgorICAgIDx0cmFuc2xhdGUgYW5kcm9pZDp0b1lEZWx0YT0iMTAwJXAiIGFuZHJvaWQ6ZnJvbVlEZWx0YT0iMCIgCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIiAKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2h5ZHJhdWxpY19icmFrZV9pbnRlcnBvbGF0b3IiCisgICAgICAgIC8+CisgICAgPGFscGhhIGFuZHJvaWQ6dG9BbHBoYT0iMC4wIiBhbmRyb2lkOmZyb21BbHBoYT0iMS4wIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiIAorICAgICAgICAvPgorPC9zZXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9uYXZpZ2F0aW9uX2luLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL25hdmlnYXRpb25faW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMGZkNzIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9uYXZpZ2F0aW9uX2luLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICA+CisgICAgPGFscGhhIGFuZHJvaWQ6ZnJvbUFscGhhPSIwLjAiIGFuZHJvaWQ6dG9BbHBoYT0iMS4wIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiIAorICAgICAgICAvPgorPC9zZXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9uYXZpZ2F0aW9uX291dC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9uYXZpZ2F0aW9uX291dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcxN2U0NwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL25hdmlnYXRpb25fb3V0LnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICA+CisgICAgPGFscGhhIGFuZHJvaWQ6dG9BbHBoYT0iMC4wIiBhbmRyb2lkOmZyb21BbHBoYT0iMS4wIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiIAorICAgICAgICAvPgorPC9zZXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9ub3RpZmljYXRpb25fYnV0dG9uc19pbi54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9ub3RpZmljYXRpb25fYnV0dG9uc19pbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMwZmQ3MgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL25vdGlmaWNhdGlvbl9idXR0b25zX2luLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICA+CisgICAgPGFscGhhIGFuZHJvaWQ6ZnJvbUFscGhhPSIwLjAiIGFuZHJvaWQ6dG9BbHBoYT0iMS4wIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiIAorICAgICAgICAvPgorPC9zZXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9ub3RpZmljYXRpb25fYnV0dG9uc19vdXQueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vbm90aWZpY2F0aW9uX2J1dHRvbnNfb3V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzE3ZTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vbm90aWZpY2F0aW9uX2J1dHRvbnNfb3V0LnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICA+CisgICAgPGFscGhhIGFuZHJvaWQ6dG9BbHBoYT0iMC4wIiBhbmRyb2lkOmZyb21BbHBoYT0iMS4wIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiIAorICAgICAgICAvPgorPC9zZXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9ub3RpZmljYXRpb25faWNvbnNfaW4ueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vbm90aWZpY2F0aW9uX2ljb25zX2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzBmZDcyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vbm90aWZpY2F0aW9uX2ljb25zX2luLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICA+CisgICAgPGFscGhhIGFuZHJvaWQ6ZnJvbUFscGhhPSIwLjAiIGFuZHJvaWQ6dG9BbHBoYT0iMS4wIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiIAorICAgICAgICAvPgorPC9zZXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9ub3RpZmljYXRpb25faWNvbnNfb3V0LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL25vdGlmaWNhdGlvbl9pY29uc19vdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MTdlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9ub3RpZmljYXRpb25faWNvbnNfb3V0LnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICA+CisgICAgPGFscGhhIGFuZHJvaWQ6dG9BbHBoYT0iMC4wIiBhbmRyb2lkOmZyb21BbHBoYT0iMS4wIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiIAorICAgICAgICAvPgorPC9zZXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9yZWNlbnRfYXBwX2VudGVyLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL3JlY2VudF9hcHBfZW50ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NDdlZWUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9yZWNlbnRfYXBwX2VudGVyLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSBTcGVjaWFsIHdpbmRvdyB6b29tIGFuaW1hdGlvbjogdGhpcyBpcyB0aGUgZWxlbWVudCB0aGF0IGVudGVycyB0aGUgc2NyZWVuLAorICAgICBpdCBzdGFydHMgYXQgMjAwJSBhbmQgc2NhbGVzIGRvd24uICBHb2VzIHdpdGggem9vbV9leGl0LnhtbC4gLS0+Cis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmRyb2lkOmFuaW0vZGVjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiPgorICAgIDxzY2FsZSBhbmRyb2lkOmZyb21YU2NhbGU9IjAuMjUiIGFuZHJvaWQ6dG9YU2NhbGU9IjEuMCIKKyAgICAgICAgICAgYW5kcm9pZDpmcm9tWVNjYWxlPSIwLjI1IiBhbmRyb2lkOnRvWVNjYWxlPSIxLjAiCisgICAgICAgICAgIGFuZHJvaWQ6cGl2b3RYPSIwJXAiIGFuZHJvaWQ6cGl2b3RZPSIwJXAiCisgICAgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IjUwMCIgLz4KKyAgICA8YWxwaGEgYW5kcm9pZDpmcm9tQWxwaGE9IjAuMCIgYW5kcm9pZDp0b0FscGhhPSIxLjAiCisgICAgICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSI1MDAiLz4KKzwvc2V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vcmVjZW50X2FwcF9sZWF2ZS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9yZWNlbnRfYXBwX2xlYXZlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDgzOTg4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vcmVjZW50X2FwcF9sZWF2ZS54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gU3BlY2lhbCB3aW5kb3cgem9vbSBhbmltYXRpb246IHRoaXMgaXMgdGhlIGVsZW1lbnQgdGhhdCBlbnRlcnMgdGhlIHNjcmVlbiwKKyAgICAgaXQgc3RhcnRzIGF0IDIwMCUgYW5kIHNjYWxlcyBkb3duLiAgR29lcyB3aXRoIHpvb21fZXhpdC54bWwuIC0tPgorPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5kcm9pZDphbmltL2RlY2VsZXJhdGVfaW50ZXJwb2xhdG9yIj4KKyAgICA8c2NhbGUgYW5kcm9pZDpmcm9tWFNjYWxlPSIxLjAiIGFuZHJvaWQ6dG9YU2NhbGU9IjAuMjUiCisgICAgICAgICAgIGFuZHJvaWQ6ZnJvbVlTY2FsZT0iMS4wIiBhbmRyb2lkOnRvWVNjYWxlPSIwLjI1IgorICAgICAgICAgICBhbmRyb2lkOnBpdm90WD0iMCVwIiBhbmRyb2lkOnBpdm90WT0iMCVwIgorICAgICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSI1MDAiIC8+CisgICAgPGFscGhhIGFuZHJvaWQ6ZnJvbUFscGhhPSIxLjAiIGFuZHJvaWQ6dG9BbHBoYT0iMC4wIgorICAgICAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iNTAwIi8+Cis8L3NldD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL3N0YXR1c19iYXJfaW4ueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vc3RhdHVzX2Jhcl9pbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwZmU1MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL3N0YXR1c19iYXJfaW4ueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgID4KKyAgICA8dHJhbnNsYXRlIGFuZHJvaWQ6ZnJvbVlEZWx0YT0iLTEwMCVwIiBhbmRyb2lkOnRvWURlbHRhPSIwIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiIAorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vaHlkcmF1bGljX2JyYWtlX2ludGVycG9sYXRvciIKKyAgICAgICAgLz4KKyAgICA8YWxwaGEgYW5kcm9pZDpmcm9tQWxwaGE9IjAuMCIgYW5kcm9pZDp0b0FscGhhPSIxLjAiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX2xvbmdBbmltVGltZSIgCisgICAgICAgIC8+Cis8L3NldD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL3N0YXR1c19iYXJfb3V0LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL3N0YXR1c19iYXJfb3V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTcyYWI0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vc3RhdHVzX2Jhcl9vdXQueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgID4KKyAgICA8dHJhbnNsYXRlIGFuZHJvaWQ6dG9ZRGVsdGE9Ii0xMDAlcCIgYW5kcm9pZDpmcm9tWURlbHRhPSIwIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiIAorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vaHlkcmF1bGljX2JyYWtlX2ludGVycG9sYXRvciIKKyAgICAgICAgLz4KKyAgICA8YWxwaGEgYW5kcm9pZDp0b0FscGhhPSIwLjAiIGFuZHJvaWQ6ZnJvbUFscGhhPSIxLjAiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX2xvbmdBbmltVGltZSIgCisgICAgICAgIC8+Cis8L3NldD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL3N5c3RlbV9pbi54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9zeXN0ZW1faW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMGZkNzIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9zeXN0ZW1faW4ueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgID4KKyAgICA8YWxwaGEgYW5kcm9pZDpmcm9tQWxwaGE9IjAuMCIgYW5kcm9pZDp0b0FscGhhPSIxLjAiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX2xvbmdBbmltVGltZSIgCisgICAgICAgIC8+Cis8L3NldD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL3N5c3RlbV9vdXQueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vc3lzdGVtX291dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcxN2U0NwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL3N5c3RlbV9vdXQueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgID4KKyAgICA8YWxwaGEgYW5kcm9pZDp0b0FscGhhPSIwLjAiIGFuZHJvaWQ6ZnJvbUFscGhhPSIxLjAiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX2xvbmdBbmltVGltZSIgCisgICAgICAgIC8+Cis8L3NldD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzEyN2JkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYWxlcnRfYmFyX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9hbGVydF9iYXJfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YWY4MDQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9hbGVydF9iYXJfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MTAzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfMTAwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfMTAwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjFjYmU1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV8xMDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfMjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV8yMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2NDAyNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfMjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfNDAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV80MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBkZTBlNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfNDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfNjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV82MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyYjhlZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfNjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfODAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV84MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUyMzFmMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfODAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2J1dHRvbl9mcmFtZV9kZWZhdWx0LjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYnV0dG9uX2ZyYW1lX2RlZmF1bHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwOWI4NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2J1dHRvbl9mcmFtZV9kZWZhdWx0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2J1dHRvbl9mcmFtZV9wcmVzc2VkLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYnV0dG9uX2ZyYW1lX3ByZXNzZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNjMDA3YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2J1dHRvbl9mcmFtZV9wcmVzc2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIxYWFkMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUuOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfbGlnaHRfb3BhcXVlLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2xpZ2h0X29wYXF1ZS45LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcwZjA3OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfbGlnaHRfb3BhcXVlLjkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvZG90c19lbXB0eS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kb3RzX2VtcHR5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWU3NjU0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvZG90c19lbXB0eS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvZG90c19mdWxsLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2RvdHNfZnVsbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1YzYwNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2RvdHNfZnVsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZTM2YzQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzEwMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfMTAwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmU1MmZmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzEwMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzIwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF8yMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmNjUyYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF8yMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzQwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF80MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1ZGQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF80MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzYwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF82MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlMzFiYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF82MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzgwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF84MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhNjU2ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF84MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfYWxhcm0ucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9ub3RpZnlfYWxhcm0ucG5nCmluZGV4IDJkM2ViMzAuLjg5ZGFlZTEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfbm90aWZ5X2FsYXJtLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X25vdGlmeV9hbGFybS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9ibHVldG9vdGgucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9ibHVldG9vdGgucG5nCmluZGV4IGU4ZmJjOWUuLjk2ZGMwODUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfYmx1ZXRvb3RoLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2JsdWV0b290aC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9ibHVldG9vdGhfY29ubmVjdGVkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfYmx1ZXRvb3RoX2Nvbm5lY3RlZC5wbmcKaW5kZXggMThjNzdkZi4uMWU0YmJmNSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9ibHVldG9vdGhfY29ubmVjdGVkLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2JsdWV0b290aF9jb25uZWN0ZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzF4LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzF4LnBuZwppbmRleCAzZmUwOGMyLi5iZGM4YzI3IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF8xeC5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzNnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzNnLnBuZwppbmRleCA5NTg2NmIxLi5kMGQxMzQ1IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF8zZy5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfM2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2UucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZS5wbmcKaW5kZXggMWE2OWQxMy4uNDIxMWI4YyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZS5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9nLnBuZwppbmRleCAwOTA5NGQxLi5kNWVjZTdhIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9nLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2gucG5nCmluZGV4IDBmNjRlMGYuLjY2ODdiNDAgMTAwNzU1Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2gucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkXzF4LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkXzF4LnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDkwNDU0YjAuLmJhMjQwODIKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfMXgucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkXzF4LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF8zZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF8zZy5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA1NTI0ZTI2Li41YWYyYjA1Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkXzNnLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF8zZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF9lLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGE0M2MyMzMuLjk5MDliMDkKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfZS5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF9nLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDAzYTA2YTAuLjBlMDJiOGQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfZy5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfaC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF9oLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGJlN2VlZDQuLmY4NGFkMzIKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfaC5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl8xeC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luXzF4LnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDJkNzc5NTYuLmQ4MGE4Y2UKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl8xeC5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl8xeC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl8zZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luXzNnLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGE4NDExZmM2Li4zMWM5NzZhCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fM2cucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fM2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luX2cucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggYjEzNWE4MS4uYTQ4N2YyOQotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luX2cucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5faC5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA5ZWY2N2QxZC4uODE2MDg1YgotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luX2gucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5faC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF8xeC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0XzF4LnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGM5MTk2YjIuLjAxMzIwMTkKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF8xeC5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF8xeC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF8zZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0XzNnLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGY3ZGRhNzMuLjM5MDM1NDUKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF8zZy5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF8zZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9lLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfZS5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBjZjE3ZWVhLi5lZDA5OWZmCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfZS5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0X2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9nLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDllMGQ3M2MuLmM5MzBlNGMKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF9nLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0X2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfaC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0X2gucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggYzUwNmY3NS4uNDA3YTA2YwotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0X2gucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfMXgucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfMXgucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggNjI1ODE2NC4uNjE0MWY3MgotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF8xeC5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzNnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzNnLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGViNTE1MGYuLmQ0NGE0Y2YKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfM2cucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzNnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9lLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2UucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMjQ5NjcxNC4uNTRlYmQ5YgotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9lLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9nLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2cucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggNGFiYTFiMS4uMmZlMGJiZgotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9nLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2gucG5nCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMzYyNGE4ZC4uZTU4ZTAxOQotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9oLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9oLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luXzF4LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5fMXgucG5nCmluZGV4IDcyMGY1NzguLjAwYTI5YTQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5fMXgucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5fMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5fM2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbl8zZy5wbmcKaW5kZXggMDdlYTQ5OS4uMTFlZTBmMiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbl8zZy5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbl8zZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbl9lLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5fZS5wbmcKaW5kZXggZjg3NzlhNi4uZmMxMzVmYyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbl9lLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luX2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5fZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luX2cucG5nCmluZGV4IGY2ZmU0YjIuLjNkMzNhNjIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5fZy5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbl9nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luX2gucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbl9oLnBuZwppbmRleCAzOTM5NjNmLi5mMzZlMWViIDEwMDc1NQotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luX2gucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5faC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbmFuZG91dF8xeC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luYW5kb3V0XzF4LnBuZwppbmRleCBhYmU5NjFhLi5lZjVkYmY0IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luYW5kb3V0XzF4LnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luYW5kb3V0XzF4LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luYW5kb3V0XzNnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5hbmRvdXRfM2cucG5nCmluZGV4IDk1YmIzY2QuLmRiYTk2NzUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5hbmRvdXRfM2cucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5hbmRvdXRfM2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5hbmRvdXRfZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luYW5kb3V0X2UucG5nCmluZGV4IGU2ZTlkZjQuLjJlNWQ4MmUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5hbmRvdXRfZS5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbmFuZG91dF9lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luYW5kb3V0X2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbmFuZG91dF9nLnBuZwppbmRleCBhMTRlOGQ2Li4wOTg1YTA5IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luYW5kb3V0X2cucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5hbmRvdXRfZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbmFuZG91dF9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfaW5hbmRvdXRfaC5wbmcKaW5kZXggNDA0YWZmZi4uN2EzMmM0MyAxMDA3NTUKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9pbmFuZG91dF9oLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX2luYW5kb3V0X2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfb3V0XzF4LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfb3V0XzF4LnBuZwppbmRleCBhNDdhNDgyLi5iNjIyNTU2IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX291dF8xeC5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9vdXRfMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfb3V0XzNnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfb3V0XzNnLnBuZwppbmRleCBjYWM3ODAyLi4wNGVjNTllIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX291dF8zZy5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9vdXRfM2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfb3V0X2UucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9vdXRfZS5wbmcKaW5kZXggNDFlODZjYy4uYTQ3Yjk4MiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9vdXRfZS5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9vdXRfZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZGF0YV9vdXRfZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX291dF9nLnBuZwppbmRleCA2YzQyMDNkLi45ZDkwZTcxIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX291dF9nLnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX291dF9nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19kYXRhX291dF9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfb3V0X2gucG5nCmluZGV4IDk5MjdkYmYuLjkyMGYyOTAgMTAwNzU1Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfb3V0X2gucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2RhdGFfb3V0X2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX2dwc19hY3F1aXJpbmcucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZ3BzX2FjcXVpcmluZy5wbmcKaW5kZXggNTY5NDNlYS4uOTAwM2Q2NyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZ3BzX2FjcXVpcmluZy5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfZ3BzX2FjcXVpcmluZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfMV9mdWxseS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8xX2Z1bGx5LnBuZwppbmRleCBlZWI3ZjY3Li5hZGY2NjhkIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8xX2Z1bGx5LnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8xX2Z1bGx5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF8yX2Z1bGx5LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzJfZnVsbHkucG5nCmluZGV4IGFlZTA5M2EuLjdiZjZiNTEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzJfZnVsbHkucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzJfZnVsbHkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jfc2lnbmFsXzNfZnVsbHkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfM19mdWxseS5wbmcKaW5kZXggYTQwMDE3Zi4uNzg3MzhhYyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfM19mdWxseS5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfM19mdWxseS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcl9zaWduYWxfNF9mdWxseS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF80X2Z1bGx5LnBuZwppbmRleCBjM2I0NGVlLi5hYzg4MTQzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF80X2Z1bGx5LnBuZworKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yX3NpZ25hbF80X2Z1bGx5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yaW5nZXJfc2lsZW50LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jpbmdlcl9zaWxlbnQucG5nCmluZGV4IDVhNzQxYmIuLmJkZDM3ZTEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jpbmdlcl9zaWxlbnQucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jpbmdlcl9zaWxlbnQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jpbmdlcl92aWJyYXRlLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3Jpbmdlcl92aWJyYXRlLnBuZwppbmRleCA3ZmYzNzVhLi4yMWMxYzA4IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19yaW5nZXJfdmlicmF0ZS5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfcmluZ2VyX3ZpYnJhdGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF9mbGlnaHRtb2RlLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF9mbGlnaHRtb2RlLnBuZwppbmRleCAwMWM3ZTJhLi43YTQxOWYxIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfZmxpZ2h0bW9kZS5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsX2ZsaWdodG1vZGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF9udWxsLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXRfc3lzX3NpZ25hbF9udWxsLnBuZwppbmRleCAwM2QyMTQ3Li4xYWRjMDVhIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0X3N5c19zaWduYWxfbnVsbC5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdF9zeXNfc2lnbmFsX251bGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfYmFja19kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfYmFja19kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWY5NTQwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9iYWNrX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfYmFja19wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfYmFja19wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGFhMTkwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9iYWNrX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfY2xvc2Vfb24uOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2Nsb3NlX29uLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2QxOTQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfY2xvc2Vfb24uOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfZXhwYW5kX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZmM3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfZXhwYW5kX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZjA5YWMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5NTFkZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaG9tZV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgzNWFkNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaG9tZV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2ljb25fdHJheS45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaWNvbl90cmF5LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZjA0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2ljb25fdHJheS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2l0ZW1fYXBwX2JhY2tncm91bmRfbm9ybWFsLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmJmYTRmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3NzljZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfbWVudV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzZDRjOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfbWVudV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fbm9ybWFsLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfdmV0b19ub3JtYWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTMyYjgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4YzAxYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfdmV0b19wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNiYXJfYmFja2dyb3VuZC45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c2Jhcl9iYWNrZ3JvdW5kLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGU1NDg3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c2Jhcl9iYWNrZ3JvdW5kLjkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX2FpcnBsYW5lX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX2FpcnBsYW5lX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNzVlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfYWlycGxhbmVfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX2JyaWdodG5lc3NfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfYnJpZ2h0bmVzc19kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjI1MDJiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX2JyaWdodG5lc3NfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ODdmYjgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2xvY2tlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fbG9ja2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODE1OWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2xvY2tlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX3NvdW5kX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3lzdGVtX3BhbmVsX3NvdW5kX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlODU3YjUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfc291bmRfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYWxlcnRfYmFyX2JhY2tncm91bmRfbm9ybWFsLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYWxlcnRfYmFyX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OGRlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9hbGVydF9iYXJfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYWxlcnRfYmFyX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4ZGUxMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYmF0dGVyeV9sb3dfYmF0dGVyeS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9iYXR0ZXJ5X2xvd19iYXR0ZXJ5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBiYmU2Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9iYXR0ZXJ5X2xvd19iYXR0ZXJ5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2J1dHRvbl9mcmFtZV9kZWZhdWx0LjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYnV0dG9uX2ZyYW1lX2RlZmF1bHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiMWYyNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2J1dHRvbl9mcmFtZV9kZWZhdWx0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2J1dHRvbl9mcmFtZV9wcmVzc2VkLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYnV0dG9uX2ZyYW1lX3ByZXNzZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmN2E0ZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2J1dHRvbl9mcmFtZV9wcmVzc2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0NGYwZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUuOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfbGlnaHRfb3BhcXVlLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2xpZ2h0X29wYXF1ZS45LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcwZjA3OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfbGlnaHRfb3BhcXVlLjkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvZG90c19lbXB0eS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9kb3RzX2VtcHR5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmFkYTQxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvZG90c19lbXB0eS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvZG90c19mdWxsLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RvdHNfZnVsbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEzNDZkNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RvdHNfZnVsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2FpcnBsYW5lX29mZi5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYWlycGxhbmVfb2ZmLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODk3YmE2MQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9haXJwbGFuZV9vZmYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9haXJwbGFuZV9vbi5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYWlycGxhbmVfb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOTZiNWIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYWlycGxhbmVfb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9iYWNrLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9iYWNrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzVhNzliCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2JhY2sucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9iYXR0ZXJ5X21pbmkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2JhdHRlcnlfbWluaS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFiYWJiNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9iYXR0ZXJ5X21pbmkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9iYXR0ZXJ5X29uLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9iYXR0ZXJ5X29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjhiNDcyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2JhdHRlcnlfb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ibHVldG9vdGhfb2ZmLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ibHVldG9vdGhfb2ZmLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDYzYmE0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2JsdWV0b290aF9vZmYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ibHVldG9vdGhfb24ucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2JsdWV0b290aF9vbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIzOWQ1MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ibHVldG9vdGhfb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9icmlnaHRuZXNzLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9icmlnaHRuZXNzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2ZhNWZjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2JyaWdodG5lc3MucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9icmlnaHRuZXNzX2F1dG8ucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2JyaWdodG5lc3NfYXV0by5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhMTUzMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9icmlnaHRuZXNzX2F1dG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9icmlnaHRuZXNzX2xvdy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYnJpZ2h0bmVzc19sb3cucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNTVlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYnJpZ2h0bmVzc19sb3cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9jbG9zZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfY2xvc2UucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYWJjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfY2xvc2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9kZWZhdWx0X2JnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9kZWZhdWx0X2JnLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTgyZDRlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2RlZmF1bHRfYmcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ncHNfb2ZmLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ncHNfb2ZmLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzJlZDM0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2dwc19vZmYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ncHNfb24ucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2dwc19vbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUzOWZkYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ncHNfb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ob21lLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ob21lLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDgxM2RjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2hvbWUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9saWdodHNvdXQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2xpZ2h0c291dC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwN2FjYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9saWdodHNvdXQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9tZW51LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9tZW51LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzc3NWYyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX21lbnUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9vcGVuLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9vcGVuLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2Q2MjRlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX29wZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9wcmVzc19iZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcHJlc3NfYmcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NTgzOTMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcHJlc3NfYmcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9yZWNlbnQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3JlY2VudC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc4YWY3MwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9yZWNlbnQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9yb3RhdGVfb2ZmX2xhbnNjYXBlLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9yb3RhdGVfb2ZmX2xhbnNjYXBlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGFhZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3JvdGF0ZV9vZmZfbGFuc2NhcGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9yb3RhdGVfb2ZmX3BvcnRyYWl0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9yb3RhdGVfb2ZmX3BvcnRyYWl0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGMwYWM3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3JvdGF0ZV9vZmZfcG9ydHJhaXQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9yb3RhdGVfb24ucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3JvdGF0ZV9vbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUxN2QxYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9yb3RhdGVfb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9zb3VuZF9vZmYucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3NvdW5kX29mZi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQxMWU4NgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9zb3VuZF9vZmYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9zb3VuZF9vbi5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfc291bmRfb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiM2JhMmYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfc291bmRfb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl93aWZpX21pbmkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3dpZmlfbWluaS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiZDJkMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl93aWZpX21pbmkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl93aWZpX29mZi5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfd2lmaV9vZmYucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YWNjMTQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfd2lmaV9vZmYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl93aWZpX29uLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl93aWZpX29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmIxYzc0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3dpZmlfb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfYmFja19kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfYmFja19kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzU3ODAyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9iYWNrX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfYmFja19wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfYmFja19wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjUyN2IzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9iYWNrX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfZXhwYW5kX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9leHBhbmRfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U2NDkyNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfZXhwYW5kX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfZXhwYW5kX3ByZXNzZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9leHBhbmRfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYzYzQyNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfZXhwYW5kX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaG9tZV9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaG9tZV9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjE5ZGVkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9ob21lX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaG9tZV9wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaG9tZV9wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTY0ZmU4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9ob21lX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaWNvbl90cmF5LjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9pY29uX3RyYXkuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAyYWNjZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaWNvbl90cmF5LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaXRlbV9hcHBfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2l0ZW1fYXBwX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNzk2MTUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2l0ZW1fYXBwX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfbWVudV9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfbWVudV9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjNhNzU1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9tZW51X2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfbWVudV9wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfbWVudV9wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWUyMWQ3MwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfbWVudV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3JlY2VudF9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfcmVjZW50X2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZDhkYzcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3JlY2VudF9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3JlY2VudF9wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfcmVjZW50X3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MGEzZTkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3JlY2VudF9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3ZldG9fbm9ybWFsLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfdmV0b19ub3JtYWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiN2M5YzcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3ZldG9fbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3ZldG9fcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3ZldG9fcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I3YzljNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfdmV0b19wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNiYXJfYmFja2dyb3VuZC45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c2Jhcl9iYWNrZ3JvdW5kLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjVkYmUzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c2Jhcl9iYWNrZ3JvdW5kLjkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV8wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjc1YTUxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMTAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMTAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YWI0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV8xMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMTAwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzEwMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1MDUwMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzEwMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMTkwNjUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV8yMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMzAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMzAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NmYxOWYyNmIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV8zMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNDAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYWFiMjMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV80MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNTAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNTAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZDI0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV81MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTkyN2EKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV82MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNzAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNzAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MTYwODgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV83MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfODAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfODAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZGQ5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV84MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfOTAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfOTAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMzZmNTMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV85MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnltaW5pXzEwMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeW1pbmlfMTAwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWIwZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnltaW5pXzEwMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnltaW5pX3JlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeW1pbmlfcmVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGNjNmI5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnltaW5pX3JlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2hpZGVub3RpZmljYXRpb25faGFuZGxlLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9oaWRlbm90aWZpY2F0aW9uX2hhbmRsZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQzZWRkNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9oaWRlbm90aWZpY2F0aW9uX2hhbmRsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX21pbmltZXRlcl9iZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfbWluaW1ldGVyX2JnLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDI2NWZjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX21pbmltZXRlcl9iZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3BhbmVsX2JnLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3BhbmVsX2JnLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZTAzNGIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfcGFuZWxfYmcuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8wLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ2OTM3MgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8xMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzEwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjI1ZDlhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8xMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8xMDAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8xMDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZTc2M2IKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzEwMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8yMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzIwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjY2MzYyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8yMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8zMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzMwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODdkOTRlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8zMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF80MC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzQwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTIyOWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF80MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF81MC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzUwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTk4OWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF81MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF82MC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzYwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWM1N2RjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF82MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF83MC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzcwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjgxOTY4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF83MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF84MC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzgwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTc3YWUxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF84MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF85MC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzkwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjYwNDgwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF85MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbG1pbmlfMTAwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxtaW5pXzEwMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVlYWE2MwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxtaW5pXzEwMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3RvZ2dsZV9iZ19vZmYuOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfdG9nZ2xlX2JnX29mZi45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDg0OWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3RvZ2dsZV9iZ19vZmYuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3RvZ2dsZV9iZ19vbi45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl90b2dnbGVfYmdfb24uOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjExMDU4YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl90b2dnbGVfYmdfb24uOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX2FpcnBsYW5lX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX2FpcnBsYW5lX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViODc1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXN0ZW1fcGFuZWxfYWlycGxhbmVfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX2JyaWdodG5lc3NfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXN0ZW1fcGFuZWxfYnJpZ2h0bmVzc19kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmZjODNlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX2JyaWdodG5lc3NfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkODQ3OWMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2xvY2tlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fbG9ja2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjFkMjZjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2xvY2tlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX3NvdW5kX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX3NvdW5kX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjM2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXN0ZW1fcGFuZWxfc291bmRfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9hbGVydF9iYXJfYmFja2dyb3VuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiNmFhMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9hbGVydF9iYXJfYmFja2dyb3VuZC54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiAKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX3ByZXNzZWQiIC8+CisgICAgPGl0ZW0KKyAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9hbGVydF9iYXJfYmFja2dyb3VuZF9ub3JtYWwiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvYnV0dG9uX2ZyYW1lLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9idXR0b25fZnJhbWUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYjM5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvYnV0dG9uX2ZyYW1lLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idXR0b25fZnJhbWVfcHJlc3NlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnV0dG9uX2ZyYW1lX2RlZmF1bHQiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvaWNfc3lzYmFyX2ljb25fYmcueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2ljX3N5c2Jhcl9pY29uX2JnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGJhMmE4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2ljX3N5c2Jhcl9pY29uX2JnLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19zeXNiYXJfcHJlc3NfYmciIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9kZWZhdWx0X2JnIiAvPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3JlY2VudF9vdmVybGF5LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9yZWNlbnRfb3ZlcmxheS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRmYTNkOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9yZWNlbnRfb3ZlcmxheS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3JlY2VudF9yZXpfYm9yZGVyLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9yZWNlbnRfcmV6X2JvcmRlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQwMjVmNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9yZWNlbnRfcmV6X2JvcmRlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfYmFjay54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmJmMTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfYmFjay54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrX3ByZXNzZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfYmFja19kZWZhdWx0IiAvPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfZXhwYW5kLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2V4cGFuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk2NjkyMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2V4cGFuZC54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9leHBhbmRfcHJlc3NlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9leHBhbmRfZGVmYXVsdCIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2hvbWUueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfaG9tZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxMTcxMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2hvbWUueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfaG9tZV9wcmVzc2VkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdCIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX21lbnUueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfbWVudS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3Mjg2ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX21lbnUueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfbWVudV9wcmVzc2VkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdCIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX3JlY2VudC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9yZWNlbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ3MDg0NTUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9yZWNlbnQueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfcmVjZW50X3ByZXNzZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfcmVjZW50X2RlZmF1bHQiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl92ZXRvLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX3ZldG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMWI2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl92ZXRvLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX3ZldG9fcHJlc3NlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl92ZXRvX25vcm1hbCIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfYmF0dGVyeS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX2JhdHRlcnkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NTFiZjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX2JhdHRlcnkueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9yZXMvZHJhd2FibGUvc3RhdF9zeXNfYmF0dGVyeS54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxsZXZlbC1saXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMDEiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeV8wIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjEwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX2JhdHRlcnlfMTAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMjAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeV8yMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIzMCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5XzMwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjQwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX2JhdHRlcnlfNDAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNTAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeV81MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI2MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5XzYwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjcwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX2JhdHRlcnlfNzAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iODAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeV84MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI5MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5XzkwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjEwMSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5XzEwMCIgLz4KKzwvbGV2ZWwtbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfYmF0dGVyeW1pbmkueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5bWluaS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczMDBlNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfYmF0dGVyeW1pbmkueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9yZXMvZHJhd2FibGUvc3RhdF9zeXNfYmF0dGVyeS54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxjbGlwIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpjbGlwT3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bWF4TGV2ZWw9IjEwMCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0Ij4KKyAgICA8bGV2ZWwtbGlzdD4KKyAgICAgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMTUwMCIgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeW1pbmlfcmVkIiAvPgorICAgICAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIxMDAwMCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5bWluaV8xMDAiIC8+CisgICAgPC9sZXZlbC1saXN0PgorPC9jbGlwPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N5c2Jhcl9zaWduYWwueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N5c2Jhcl9zaWduYWwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NjFjMzcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX3NpZ25hbC54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL3Jlcy9kcmF3YWJsZS9zdGF0X3N5c19iYXR0ZXJ5LnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPGxldmVsLWxpc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIwMSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIxMCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfMTAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMjAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzIwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjMwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF8zMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI0MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfNDAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNTAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzUwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjYwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF82MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI3MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfNzAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iODAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzgwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjkwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF85MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIxMDEiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzEwMCIgLz4KKzwvbGV2ZWwtbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfc2lnbmFsbWluaS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX3NpZ25hbG1pbmkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OGJmMTAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX3NpZ25hbG1pbmkueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9yZXMvZHJhd2FibGUvc3RhdF9zeXNfYmF0dGVyeS54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxjbGlwIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpjbGlwT3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiCisgICAgICAgIGFuZHJvaWQ6bWF4TGV2ZWw9IjEwMDAwIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbG1pbmlfMTAwIiAvPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N5c2Jhcl93aWZpLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfd2lmaS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU2MWMzNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfd2lmaS54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL3Jlcy9kcmF3YWJsZS9zdGF0X3N5c19iYXR0ZXJ5LnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPGxldmVsLWxpc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIwMSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIxMCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfMTAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMjAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzIwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjMwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF8zMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI0MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfNDAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNTAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzUwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjYwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF82MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI3MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfNzAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iODAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzgwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjkwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF85MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIxMDEiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzEwMCIgLz4KKzwvbGV2ZWwtbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfd2lmaW1pbmkueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N5c2Jhcl93aWZpbWluaS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E2YzllZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfd2lmaW1pbmkueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9yZXMvZHJhd2FibGUvc3RhdF9zeXNfYmF0dGVyeS54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxjbGlwIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpjbGlwT3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiCisgICAgICAgIGFuZHJvaWQ6bWF4TGV2ZWw9IjEwMCIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxtaW5pXzEwMCIgLz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXIueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3RhdHVzX2Jhci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFlZTAxMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXIueG1sCkBAIC0wLDAgKzEsMTgwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2Nsb3NlZF9kZWZhdWx0X2JhY2tncm91bmQiIC0tPgorPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuVGFibGV0U3RhdHVzQmFyVmlldworICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczpzeXN0ZW11aT0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9jb20uYW5kcm9pZC5zeXN0ZW11aSIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2tncm91bmQiCisgICAgPgorICAgIDxSZWxhdGl2ZUxheW91dAorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Jhcl9jb250ZW50cyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgID4KKworICAgICAgICA8SW1hZ2VWaWV3CisgICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5Ob3RpZmljYXRpb25JY29uQXJlYSRNb3JlVmlldyIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZXhwYW5kIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfb3BlbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9Im5vdGlmaWNhdGlvbkljb25zQ2xpY2tlZCIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ub3RpZmljYXRpb25CdXR0b25zIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAK2lkL2V4cGFuZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAK2lkL3N5c3RlbUluZm8iCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICA+CisKKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2RvX25vdF9kaXN0dXJiIgorICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHR8Y2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjFkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iNmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNHNwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zdGF0dXNfYmFyX2RvX25vdF9kaXN0dXJiX2J1dHRvbiIKKyAgICAgICAgICAgICAgICAvPgorCisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9jbGVhcl9hbGxfYnV0dG9uIgorICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHR8Y2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjFkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iNmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNHNwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zdGF0dXNfYmFyX2NsZWFyX2FsbF9idXR0b24iCisgICAgICAgICAgICAgICAgLz4KKworICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5Ob3RpZmljYXRpb25JY29uQXJlYQorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ub3RpZmljYXRpb25JY29ucyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQCtpZC9leHBhbmQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQCtpZC9zeXN0ZW1JbmZvIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgPgorICAgICAgICAgICAgPHZpZXcKKyAgICAgICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5Ob3RpZmljYXRpb25JY29uQXJlYSRJY29uTGF5b3V0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaWNvbnMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkAqYW5kcm9pZDpkaW1lbi9zdGF0dXNfYmFyX2ljb25fc2l6ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8dmlldworICAgICAgICAgICAgICAgIGNsYXNzPSJjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0Lk5vdGlmaWNhdGlvbkljb25BcmVhJERyYWdnZXJWaWV3IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaGFuZGxlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zeXNiYXJfaGlkZW5vdGlmaWNhdGlvbl9oYW5kbGUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L2NvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuTm90aWZpY2F0aW9uSWNvbkFyZWE+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpY2tlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAK2lkL3N5c3RlbUluZm8iCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI2ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmFuaW1hdGVMYXlvdXRDaGFuZ2VzPSJ0cnVlIgorICAgICAgICAgICAgLz4KKworICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvc3RhdHVzX2Jhcl9jZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjU2ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9uYXZpZ2F0aW9uQXJlYSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgPgorICAgICAgICAgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5LZXlCdXR0b25WaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbWVudSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfc3lzYmFyX21lbnUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvaWNfc3lzYmFyX2ljb25fYmciCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNGRpcCIKKyAgICAgICAgICAgICAgICBzeXN0ZW11aTprZXlDb2RlPSI4MiIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcmVjZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfcmVjZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9pY29uX2JnIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjRkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjRkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJyZWNlbnRCdXR0b25DbGlja2VkIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLktleUJ1dHRvblZpZXcgYW5kcm9pZDppZD0iQCtpZC9ob21lIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9ob21lIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9pY29uX2JnIgorICAgICAgICAgICAgICAgIHN5c3RlbXVpOmtleUNvZGU9IjMiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuS2V5QnV0dG9uVmlldyBhbmRyb2lkOmlkPSJAK2lkL2JhY2siCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI0ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI0ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfc3lzYmFyX2JhY2siCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvaWNfc3lzYmFyX2ljb25fYmciCisgICAgICAgICAgICAgICAgc3lzdGVtdWk6a2V5Q29kZT0iNCIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgPCEtLSBJdCdzIGN1cnRhaW5zIGZvciB5b3UuIC0tPgorICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9saWdodHNfb3V0IgorICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9saWdodHNvdXQiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iaW52aXNpYmxlIgorICAgICAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKKyAgICAgICAgLz4KKzwvY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5UYWJsZXRTdGF0dXNCYXJWaWV3PgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2NlbnRlci54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2NlbnRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3NDY3MgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfY2VudGVyLnhtbApAQCAtMCwwICsxLDczIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIENlbnRlciBvZiBzdGF0dXMgYmFyOiBTeXN0ZW0gaW5mbyBkaXNwbGF5LCBzeXN0ZW0gaW5mbyBwYW5lbCB0cmlnZ2VyIC0tPgorPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvc3lzdGVtSW5mbyIKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6c3lzdGVtdWk9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvY29tLmFuZHJvaWQuc3lzdGVtdWkiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKKyAgICBhbmRyb2lkOm9uQ2xpY2s9InN5c3RlbUluZm9DbGlja2VkIgorICAgID4KKyAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLkNsb2NrCisgICAgICAgIHN0eWxlPSJAKmFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkljb24iCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xvY2siCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI2NGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0OGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySW5QYXJlbnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE2c3AiCisgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjJkaXAiCisgICAgICAgIC8+CisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JhdHRlcnkiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI2NGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxNmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC9jbG9jayIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySW5QYXJlbnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N5c2Jhcl9taW5pbWV0ZXJfYmciIAorICAgICAgICAvPgorICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zaWduYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI2NGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxNmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvY2xvY2siCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlckluUGFyZW50PSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zeXNiYXJfbWluaW1ldGVyX2JnIiAKKyAgICAgICAgLz4KKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYmF0dGVyeV9pY29uIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjMwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAaWQvYmF0dGVyeSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySW5QYXJlbnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfc3lzYmFyX2JhdHRlcnlfbWluaSIKKyAgICAgICAgLz4KKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2lnbmFsX2ljb24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvc2lnbmFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfd2lmaV9taW5pIgorICAgICAgICAvPgorPC9SZWxhdGl2ZUxheW91dD4KKworCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5YTFjYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50LnhtbApAQCAtMCwwICsxLDM4IEBACis8UmVsYXRpdmVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI2NXNwIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvc3RhdHVzX2Jhcl9pdGVtX2JhY2tncm91bmQiCisgICAgPgorCisgICAgPEltYWdlQnV0dG9uCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdmV0byIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3N0YXR1c19iYXJfdmV0byIKKyAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAbnVsbCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTZkaXAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxNmRpcCIKKyAgICAgICAgLz4KKworICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuTGF0ZXN0SXRlbVZpZXcgYW5kcm9pZDppZD0iQCtpZC9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC92ZXRvIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjY0c3AiCisgICAgICAgIGFuZHJvaWQ6Zm9jdXNhYmxlPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjZzcCIKKyAgICAgICAgLz4KKworICAgIDxWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMXNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfZGFyayIKKyAgICAgICAgLz4KKworPC9SZWxhdGl2ZUxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N5c2Jhcl9wYW5lbF9ub3RpZmljYXRpb25zLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N5c2Jhcl9wYW5lbF9ub3RpZmljYXRpb25zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGM5YTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3lzYmFyX3BhbmVsX25vdGlmaWNhdGlvbnMueG1sCkBAIC0wLDAgKzEsNDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiBhcHBzL2NvbW1vbi9hc3NldHMvZGVmYXVsdC9kZWZhdWx0L3NraW5zL1N0YXR1c0Jhci54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9jbG9zZWRfZGVmYXVsdF9iYWNrZ3JvdW5kIiAtLT4KKzxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0Lk5vdGlmaWNhdGlvblBhbmVsCisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMDAwMDAiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgPgorCisgICAgPFNjcm9sbFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ub3RpZmljYXRpb25TY3JvbGxlciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgID4KKyAgICAgICAgPExpbmVhckxheW91dCAKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWx8Ym90dG9tIgorICAgICAgICAgICAgYW5kcm9pZDphbmltYXRpb25DYWNoZT0iZmFsc2UiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N0YXR1c19iYXJfYmFja2dyb3VuZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpmb2N1c2FibGU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmRlc2NlbmRhbnRGb2N1c2FiaWxpdHk9ImFmdGVyRGVzY2VuZGFudHMiCisgICAgICAgICAgICA+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgIDwvU2Nyb2xsVmlldz4KKzwvY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5Ob3RpZmljYXRpb25QYW5lbD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N5c2Jhcl9wYW5lbF9zeXN0ZW0ueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3lzYmFyX3BhbmVsX3N5c3RlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U0NjlmNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N5c2Jhcl9wYW5lbF9zeXN0ZW0ueG1sCkBAIC0wLDAgKzEsMjA4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogYXBwcy9jb21tb24vYXNzZXRzL2RlZmF1bHQvZGVmYXVsdC9za2lucy9TdGF0dXNCYXIueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5TeXN0ZW1QYW5lbAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N5c2Jhcl9wYW5lbF9iZyIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI3MGRpcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTIwZGlwIgorICAgID4KKworICAgIDwhLS0gdG9wIHJvdzogcXVpY2sgc2V0dGluZ3MgYnV0dG9ucyAtLT4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjRkaXAiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICA+CisgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2JyaWdodG5lc3MiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iOTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjY0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfYnJpZ2h0bmVzcyIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N5c2Jhcl90b2dnbGVfYmdfb2ZmIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvc291bmQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iOTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjY0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfc3lzYmFyX3NvdW5kX29uIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3lzYmFyX3RvZ2dsZV9iZ19vZmYiCisgICAgICAgICAgICAvPgorICAgICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9vcmllbnRhdGlvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI5MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfcm90YXRlX29uIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3lzYmFyX3RvZ2dsZV9iZ19vZmYiCisgICAgICAgICAgICAvPgorICAgICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9haXJwbGFuZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI5MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfYWlycGxhbmVfb24iCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zeXNiYXJfdG9nZ2xlX2JnX29mZiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2dwcyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI5MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfZ3BzX29uIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3lzYmFyX3RvZ2dsZV9iZ19vZmYiCisgICAgICAgICAgICAvPgorICAgICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9ibHVldG9vdGgiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iOTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjY0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfc3lzYmFyX2JsdWV0b290aF9vbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N5c2Jhcl90b2dnbGVfYmdfb2ZmIgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDwhLS0gbWFpbiByb3c6IG1ldGVycywgY2xvY2sgLS0+CisgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iOGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxOTJkaXAiCisgICAgICAgID4KKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjU2ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxOTJkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI0OGRpcCIKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9iYXR0ZXJ5X21ldGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNTZkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImNlbnRlckNyb3AiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeSIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYmF0dGVyeV9pbmZvIgorICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlN5c3RlbVBhbmVsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hYm92ZT0iQGlkL2JhdHRlcnlfbWV0ZXIiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLkNsb2NrCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5TeXN0ZW1QYW5lbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xvY2siCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSI1MHNwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9Im5vcm1hbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGRkYiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJIb3Jpem9udGFsPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDxSZWxhdGl2ZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI1NmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTkyZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI0OGRpcCIKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9zaWduYWxfbWV0ZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI1NmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iY2VudGVyQ3JvcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWwiCisgICAgICAgICAgICAgICAgLz4KKworICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc2lnbmFsX2luZm8iCisgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuU3lzdGVtUGFuZWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI0ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2Fib3ZlPSJAaWQvc2lnbmFsX21ldGVyIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICAgICAgPEltYWdlVmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfYmF0dGVyeV9vbiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxJbWFnZVZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfd2lmaV9vbiIKKyAgICAgICAgICAgIC8+CisgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgIDwhLS0gYm90dG9tIHJvdzogdHJhbnNpZW50IGluZGljYXRvcnMsIHNldHRpbmdzIGJ1dHRvbiAtLT4KKyAgICA8VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjFzcCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfZGFyayIKKyAgICAgICAgLz4KKyAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0OGRpcCIKKyAgICAgICAgPgorICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgPgorICAgICAgICAgICAgPCEtLSBUT0RPOiBhbGFybSAtLT4KKyAgICAgICAgICAgIDwhLS0gVE9ETzogc3luYyAtLT4KKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2RhdGUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zZXR0aW5nc19idXR0b24iCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UZXh0QnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjMyZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMzJkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyMHNwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3N5c3RlbV9wYW5lbF9zZXR0aW5nc19idXR0b24iCisgICAgICAgICAgICAvPgorICAgICAgICA8VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMXNwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC9zZXR0aW5nc19idXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkAqYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsiCisgICAgICAgICAgICAvPgorCisgICAgPC9SZWxhdGl2ZUxheW91dD4KKzwvY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5TeXN0ZW1QYW5lbD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3RpY2tlci54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS90aWNrZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZDg1NWYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS90aWNrZXIueG1sCkBAIC0wLDAgKzEsNTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNmZjAwMDAwMCIKKyAgICA+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTJkcCIKKyAgICAgICAgPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlIgorICAgICAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQCphbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaWNrZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bWF4TGluZXM9IjEiCisgICAgICAgICAgICAvPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zdWJ0aXRsZSIKKyAgICAgICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkAqYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuVGlja2VyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDptYXhMaW5lcz0iMSIKKyAgICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2UvdGlja2VyX2NvbXBhdC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS90aWNrZXJfY29tcGF0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWM3NTQzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2UvdGlja2VyX2NvbXBhdC54bWwKQEAgLTAsMCArMSwzNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI2ZmMDAwMDAwIgorICAgID4KKworICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RleHQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkAqYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuVGlja2VyIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMmRwIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDptYXhMaW5lcz0iMiIKKyAgICAgICAgLz4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS90aWNrZXJfaWNvbi54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS90aWNrZXJfaWNvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVmYTk4NwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3RpY2tlcl9pY29uLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEltYWdlVmlldworICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzBkcCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjMwZHAiCisgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgorICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjZkcCIKKyAgICAvPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L2ludHJ1ZGVyX2FsZXJ0LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvaW50cnVkZXJfYWxlcnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNGE3NzQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L2ludHJ1ZGVyX2FsZXJ0LnhtbApAQCAtMCwwICsxLDU4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogYXBwcy9jb21tb24vYXNzZXRzL2RlZmF1bHQvZGVmYXVsdC9za2lucy9TdGF0dXNCYXIueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N0YXR1c19iYXJfY2xvc2VkX2RlZmF1bHRfYmFja2dyb3VuZCIgLS0+Cis8RnJhbWVMYXlvdXQKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIzMmRpcCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjhkaXAiCisgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjhkaXAiCisgICAgPgorICAgICAgICAKKyAgICA8TGluZWFyTGF5b3V0IAorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ludHJ1ZGVyX2FsZXJ0X2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDphbmltYXRpb25DYWNoZT0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kIgorICAgICAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpmb2N1c2FibGU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZGVzY2VuZGFudEZvY3VzYWJpbGl0eT0iYWZ0ZXJEZXNjZW5kYW50cyIKKyAgICAgICAgPgorCisgICAgICAgIDxJbWFnZVZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWxlcnRJY29uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbGVydFRleHQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkludHJ1ZGVyQWxlcnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorPC9GcmFtZUxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvcmVjZW50X2FwcHNfYWN0aXZpdHkueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9yZWNlbnRfYXBwc19hY3Rpdml0eS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM2NjFlOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvcmVjZW50X2FwcHNfYWN0aXZpdHkueG1sCkBAIC0wLDAgKzEsNTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPExpbmVhckxheW91dAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKworICAgIDwhLS0gVGl0bGUgLS0+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iIzgwRkZGRkZGIgorICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvcmVjZW50X3Rhc2tzX3RpdGxlIgorICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiLz4KKworICAgIDwhLS0gVGhpcyBpcyBvbmx5IGludGVuZGVkIHRvIGJlIHZpc2libGUgd2hlbiBjYXJvdXNlbCBpcyBpbnZpc2libGUgLS0+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm9fYXBwbGljYXRpb25zX21lc3NhZ2UiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3JlY2VudF90YXNrc19lbXB0eSIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIi8+CisKKyAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkucmVjZW50LlJlY2VudEFwcGxpY2F0aW9uc0Nhcm91c2VsVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Nhcm91c2VsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSI+CisgICAgPC9jb20uYW5kcm9pZC5zeXN0ZW11aS5yZWNlbnQuUmVjZW50QXBwbGljYXRpb25zQ2Fyb3VzZWxWaWV3PgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvcmVjZW50c19kZXRhaWxfdmlldy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3JlY2VudHNfZGV0YWlsX3ZpZXcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OWQwZjIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3JlY2VudHNfZGV0YWlsX3ZpZXcueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPExpbmVhckxheW91dAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKworICAgIDwhLS0gQXBwbGljYXRpb24gVGl0bGUgLS0+CisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYXBwX3RpdGxlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIi8+CisKKyAgICA8IS0tIEFwcGxpY2F0aW9uIERldGFpbHMgLS0+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYXBwX2Rlc2NyaXB0aW9uIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIi8+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhci54bWwKaW5kZXggYTVkNjg4NS4uMmYxYjM2ZTggMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhci54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyLnhtbApAQCAtMjEsNyArMjEsOCBAQAogPCEtLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2Nsb3NlZF9kZWZhdWx0X2JhY2tncm91bmQiIC0tPgogPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5TdGF0dXNCYXJWaWV3CiAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N0YXR1c2Jhcl9iYWNrZ3JvdW5kIgorICAgIHhtbG5zOnN5c3RlbXVpPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2NvbS5hbmRyb2lkLnN5c3RlbXVpIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N0YXR1c19iYXJfYmFja2dyb3VuZCIKICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKICAgICBhbmRyb2lkOmRlc2NlbmRhbnRGb2N1c2FiaWxpdHk9ImFmdGVyRGVzY2VuZGFudHMiCkBAIC01NSw2ICs1Niw4IEBACiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI2ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTZzcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgogICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWx8bGVmdCIKICAgICAgICAgICAgIC8+CiAgICAgPC9MaW5lYXJMYXlvdXQ+CkBAIC0xMDgsNiArMTExLDYgQEAKICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWx8bGVmdCIKICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNnB4IgogICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNnB4IgotICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNiYXJfYmFja2dyb3VuZCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9iYWNrZ3JvdW5kIgogICAgICAgICAvPgogPC9jb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuU3RhdHVzQmFyVmlldz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhcl9leHBhbmRlZC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXJfZXhwYW5kZWQueG1sCmluZGV4IGMzZjQyMDUuLmI1YjFiNTAgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhcl9leHBhbmRlZC54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyX2V4cGFuZGVkLnhtbApAQCAtMzEsNyArMzEsNyBAQAogICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjNkcCIKICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI1ZHAiCiAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIzZHAiCi0gICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3RpdGxlX2Jhcl9wb3J0cmFpdCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc2hhZGVfaGVhZGVyX2JhY2tncm91bmQiCiAgICAgICAgID4KICAgICAgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5DYXJyaWVyTGFiZWwKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZHAiCkBAIC00Myw3ICs0Myw3IEBACiAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjFkcCIKICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjRkcCIKICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjZmZkZmRmZGYiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iP2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JTZWNvbmRhcnkiCiAgICAgICAgICAgICAvPgogICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9jbGVhcl9hbGxfYnV0dG9uIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2J1dHRvblN0eWxlIgogICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTVkcCIKICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxNWRwIgotICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9idG5fZGVmYXVsdF9zbWFsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2J0bl9kZWZhdWx0X3NtYWxsIgogICAgICAgICAgICAgLz4KICAgICA8L0xpbmVhckxheW91dD4KIApAQCAtNzEsNyArNzEsNiBAQAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgogICAgICAgICAgICAgYW5kcm9pZDpmYWRpbmdFZGdlPSJub25lIgotICAgICAgICAgICAgYW5kcm9pZDpvdmVyc2Nyb2xsTW9kZT0iaWZDb250ZW50U2Nyb2xscyIKICAgICAgICAgICAgID4KICAgICAgICAgICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0CiAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ub3RpZmljYXRpb25MaW5lYXJMYXlvdXQiCkBAIC04Myw3ICs4Miw3IEBACiAgICAgICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbm9Ob3RpZmljYXRpb25zVGl0bGUiCiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zaGFkZV9iZ2NvbG9yIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS90aXRsZV9iYXJfcG9ydHJhaXQiCiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjVkcCIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaXRsZSIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3N0YXR1c19iYXJfbm9fbm90aWZpY2F0aW9uc190aXRsZSIKQEAgLTkyLDcgKzkxLDcgQEAKICAgICAgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9vbmdvaW5nVGl0bGUiCiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zaGFkZV9iZ2NvbG9yIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS90aXRsZV9iYXJfcG9ydHJhaXQiCiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjVkcCIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaXRsZSIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3N0YXR1c19iYXJfb25nb2luZ19ldmVudHNfdGl0bGUiCkBAIC0xMDYsNyArMTA1LDcgQEAKICAgICAgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9sYXRlc3RUaXRsZSIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3NoYWRlX2JnY29sb3IiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3RpdGxlX2Jhcl9wb3J0cmFpdCIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNWRwIgogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRpdGxlIgogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnRzX3RpdGxlIgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50LnhtbAppbmRleCBiOGExY2JlLi44OGQ5NzM5IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50LnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50LnhtbApAQCAtMTYsOCArMTYsOCBAQAogCiAgICAgPFZpZXcKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9saWdodF9vcGFxdWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMXNwIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQiCiAgICAgICAgIC8+CiAKIDwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyX3RyYWNraW5nLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhcl90cmFja2luZy54bWwKaW5kZXggM2I5Yjc3NS4uYTJiNDBlNiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyX3RyYWNraW5nLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXJfdHJhY2tpbmcueG1sCkBAIC0yNiwxMiArMjYsMTEgQEAKICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMHB4IgogICAgID4KIAotICAgIDxWaWV3Ci0gICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNmZjIxMjEyMSIKLSAgICAgICAgIC8+CisgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5UcmFja2luZ1BhdHRlcm5WaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIC8+CiAKICAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLkNsb3NlRHJhZ0hhbmRsZSBhbmRyb2lkOmlkPSJAK2lkL2Nsb3NlIgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgpAQCAtNDMsNyArNDIsNyBAQAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCiAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0WFkiCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3N0YXR1c19iYXJfY2xvc2Vfb24iCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3NoYWRlX2hhbmRsZWJhciIKICAgICAgICAgICAgIC8+CiAKICAgICA8L2NvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5DbG9zZURyYWdIYW5kbGU+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9jb2xvcnMueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2UvY29sb3JzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDE2MWMzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2UvY29sb3JzLnhtbApAQCAtMCwwICsxLDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cmVzb3VyY2VzPgorICAgIDxkcmF3YWJsZSBuYW1lPSJzdGF0dXNfYmFyX2JhY2tncm91bmQiPiMwMDAwMDA8L2RyYXdhYmxlPgorPC9yZXNvdXJjZXM+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2NvbmZpZy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZjVkMThkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9jb25maWcueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoZXNlIHJlc291cmNlcyBhcmUgYXJvdW5kIGp1c3QgdG8gYWxsb3cgdGhlaXIgdmFsdWVzIHRvIGJlIGN1c3RvbWl6ZWQKKyAgICAgZm9yIGRpZmZlcmVudCBoYXJkd2FyZSBhbmQgcHJvZHVjdCBidWlsZHMuIC0tPgorPHJlc291cmNlcz4KKyAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfc3RhdHVzX2Jhcl9wb3NpdGlvbiI+MTwvaW50ZWdlcj4KKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNTljOTIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDc3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCistLT4KKzxyZXNvdXJjZXMgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gVGhlIHRleHQgZm9yIHRoZSBidXR0b24gaW4gdGhlIG5vdGlmaWNhdGlvbiB3aW5kb3ctc2hhZGUgdGhhdCBjbGVhcnMKKyAgICAgICAgIGFsbCBvZiB0aGUgY3VycmVudGx5IHZpc2libGUgbm90aWZpY2F0aW9ucy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX2NsZWFyX2FsbF9idXR0b24iPkNsZWFyIGFsbDwvc3RyaW5nPgorCisgICAgPCEtLSBTeXN0ZW0gcGFuZWwgKCJRdWljayBTZXR0aW5ncyIpIC0tPgorCisgICAgPCEtLSBUZXh0IHRvIGRpc3BsYXkgdW5kZXJuZWF0aCB0aGUgZ3JhcGhpY2FsIGJhdHRlcnkgbWV0ZXIuIFNob3VsZAorICAgICAgICAgaW5jbHVkZSB0aGUgd29yZCBmb3IgImJhdHRlcnkiIGFuZCBhIHBsYWNlIGZvciB0aGUgcGVyY2VudGFnZSBjaGFyZ2UKKyAgICAgICAgIGF2YWlsYWJsZS4gW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic3lzdGVtX3BhbmVsX2JhdHRlcnlfbWV0ZXJfZm9ybWF0Ij4KKyAgICAgICAgQmF0dGVyeTogPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9InBlcmNlbnQiPiUlPC94bGlmZjpnPgorICAgIDwvc3RyaW5nPgorCisgICAgPCEtLSBUZXh0IHRvIGRpc3BsYXkgdW5kZXJuZWF0aCB0aGUgZ3JhcGhpY2FsIHNpZ25hbCBzdHJlbmd0aCBtZXRlciB3aGVuCisgICAgICAgICBubyBjb25uZWN0aW9uIGlzIGF2YWlsYWJsZS4gW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl9kaXNjb25uZWN0ZWQiPgorICAgICAgICBubyBpbnRlcm5ldCBjb25uZWN0aW9uCisgICAgPC9zdHJpbmc+CisKKyAgICA8IS0tIFRleHQgdG8gZGlzcGxheSB1bmRlcm5lYXRoIHRoZSBncmFwaGljYWwgc2lnbmFsIHN0cmVuZ3RoIG1ldGVyIHdoZW4KKyAgICAgICAgIGl0IGlzIGRpc3BsYXlpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBjb25uZWN0ZWQsIG5hbWVkIFdpLUZpIG5ldHdvcmsuCisgICAgICAgICBTaG91bGQgaW5jbHVkZSB0aGUgd29yZCBmb3IgIldpLUZpIiBhbmQgYSBwbGFjZWhvbGRlciBmb3IgdGhlCisgICAgICAgICB3aXJlbGVzcyBuZXR3b3JrJ3MgU1NJRC4gW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl93aWZpX3NzaWRfZm9ybWF0Ij4KKyAgICAgICAgV2ktRmk6IDx4bGlmZjpnIGlkPSJzc2lkIj4lczwveGxpZmY6Zz4KKyAgICA8L3N0cmluZz4KKworICAgIDwhLS0gVGV4dCB0byBkaXNwbGF5IHVuZGVybmVhdGggdGhlIGdyYXBoaWNhbCBzaWduYWwgc3RyZW5ndGggbWV0ZXIgd2hlbgorICAgICAgICAgaXQgaXMgZGlzcGxheWluZyBXaS1GaSBzdGF0dXMgYW5kIFdpLUZpIGlzIGNvbm5lY3RlZCB0byBhIG5ldHdvcmsKKyAgICAgICAgIHdob3NlIFNTSUQgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgICAgIFtDSEFSIExJTUlUPTIwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InN5c3RlbV9wYW5lbF9zaWduYWxfbWV0ZXJfd2lmaV9ub3NzaWQiPgorICAgICAgICBXaS1GaTogY29ubmVjdGVkCisgICAgPC9zdHJpbmc+CisKKyAgICA8IS0tIFRleHQgdG8gZGlzcGxheSB1bmRlcm5lYXRoIHRoZSBncmFwaGljYWwgc2lnbmFsIHN0cmVuZ3RoIG1ldGVyIHdoZW4KKyAgICAgICAgIGl0IGlzIGRpc3BsYXlpbmcgV2ktRmkgc3RhdHVzIGFuZCBXaS1GaSBpcyBpbiB0aGUgcHJvY2VzcyBvZgorICAgICAgICAgY29ubmVjdGluZyB0byBhIG5ldHdvcmsuICBbQ0hBUiBMSU1JVD0yMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzeXN0ZW1fcGFuZWxfc2lnbmFsX21ldGVyX3dpZmlfY29ubmVjdGluZyI+CisgICAgICAgIFdpLUZpOiBjb25uZWN0aW5n4oCmCisgICAgPC9zdHJpbmc+CisgCisgICAgPCEtLSBUZXh0IHRvIGRpc3BsYXkgdW5kZXJuZWF0aCB0aGUgZ3JhcGhpY2FsIHNpZ25hbCBzdHJlbmd0aCBtZXRlciB3aGVuCisgICAgICAgICBpdCBpcyBkaXNwbGF5aW5nIG1vYmlsZSBkYXRhICgzRykgc3RhdHVzIGFuZCBhIG5ldHdvcmsgY29ubmVjdGlvbiBpcworICAgICAgICAgYXZhaWxhYmxlLgorICAgICAgICAgW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl9kYXRhX2Nvbm5lY3RlZCI+CisgICAgICAgIE1vYmlsZSBkYXRhOiBjb25uZWN0ZWQKKyAgICA8L3N0cmluZz4KKworICAgIDwhLS0gVGV4dCB0byBkaXNwbGF5IHVuZGVybmVhdGggdGhlIGdyYXBoaWNhbCBzaWduYWwgc3RyZW5ndGggbWV0ZXIgd2hlbgorICAgICAgICAgaXQgaXMgZGlzcGxheWluZyBtb2JpbGUgZGF0YSAoM0cpIHN0YXR1cyBhbmQgYSBuZXR3b3JrIGNvbm5lY3Rpb24gaXMKKyAgICAgICAgIHVuYXZhaWxhYmxlLgorICAgICAgICAgW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl9kYXRhX2Nvbm5lY3RpbmciPgorICAgICAgICBNb2JpbGUgZGF0YTogY29ubmVjdGluZ+KApgorICAgIDwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2F0dHJzLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvYXR0cnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYmNmMjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2F0dHJzLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJLZXlCdXR0b25WaWV3Ij4KKyAgICAgICAgPGF0dHIgbmFtZT0ia2V5Q29kZSIgZm9ybWF0PSJpbnRlZ2VyIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+Cis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9jb2xvcnMueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9jb2xvcnMueG1sCmluZGV4IDY1NTA0MzguLmEwZGVmNmIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvY29sb3JzLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2NvbG9ycy54bWwKQEAgLTE3LDcgKzE3LDUgQEAKICAqLwogLS0+CiA8cmVzb3VyY2VzPgotICAgIDxkcmF3YWJsZSBuYW1lPSJzaGFkZV9iZ2NvbG9yIj4jZmYyODI4Mjg8L2RyYXdhYmxlPgotICAgIDxkcmF3YWJsZSBuYW1lPSJub3RpZmljYXRpb25faGVhZGVyX3RleHRfY29sb3IiPiNmZjk2OTY5NjwvZHJhd2FibGU+CiAgICAgPGRyYXdhYmxlIG5hbWU9Im5vdGlmaWNhdGlvbl9udW1iZXJfdGV4dF9jb2xvciI+I2ZmZmZmZmZmPC9kcmF3YWJsZT4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9jb25maWcueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9jb25maWcueG1sCmluZGV4IDhlYTQ2ZTUuLmFjMDBjNjkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvY29uZmlnLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2NvbmZpZy54bWwKQEAgLTIwLDcgKzIwLDE2IEBACiA8IS0tIFRoZXNlIHJlc291cmNlcyBhcmUgYXJvdW5kIGp1c3QgdG8gYWxsb3cgdGhlaXIgdmFsdWVzIHRvIGJlIGN1c3RvbWl6ZWQKICAgICAgZm9yIGRpZmZlcmVudCBoYXJkd2FyZSBhbmQgcHJvZHVjdCBidWlsZHMuIC0tPgogPHJlc291cmNlcz4KLSAgICA8IS0tIENvbnRyb2wgd2hldGhlciBzdGF0dXMgYmFyIHNob3VsZCBkaXN0aW5ndWlzaCBIU1BBIGRhdGEgaWNvbiBmb3JtIFVNVFMgZGF0YSBpY29uIG9uIGRldmljZXMgLS0+CisKKyAgICA8IS0tIENvbnRyb2wgd2hldGhlciBzdGF0dXMgYmFyIHNob3VsZCBkaXN0aW5ndWlzaCBIU1BBIGRhdGEgaWNvbiBmb3JtIFVNVFMKKyAgICBkYXRhIGljb24gb24gZGV2aWNlcyAtLT4KICAgICA8Ym9vbCBuYW1lPSJjb25maWdfaHNwYV9kYXRhX2Rpc3Rpbmd1aXNoYWJsZSI+ZmFsc2U8L2Jvb2w+CisKKyAgICA8IS0tIFRoZSBsb2NhdGlvbiBvZiB0aGUgc3RhdHVzIGJhci4KKyAgICAgICAgMCAtIHRvcAorICAgICAgICAxIC0gYm90dG9tCisgICAgLS0+CisgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX3N0YXR1c19iYXJfcG9zaXRpb24iPjA8L2ludGVnZXI+CisKIDwvcmVzb3VyY2VzPgogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCBiYTNhM2QxLi4xZjI0YmE2IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTI0LDYgKzI0LDE4IEBACiAgICAgICAgICBhbGwgb2YgdGhlIGN1cnJlbnRseSB2aXNpYmxlIG5vdGlmaWNhdGlvbnMuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ic3RhdHVzX2Jhcl9jbGVhcl9hbGxfYnV0dG9uIj5DbGVhcjwvc3RyaW5nPgogCisgICAgPCEtLSBUaGUgdGV4dCBmb3IgdGhlIGJ1dHRvbiBpbiB0aGUgbm90aWZpY2F0aW9uIHdpbmRvdy1zaGFkZSB0aGF0IHR1cm5zCisgICAgICAgICBvbiBkbyBub3QgZGlzdHVyYiBtb2RlLCB3aGVyZSBub3RpZmljYXRpb25zIG5vIGxvbmdlciBzaG93IHRoZWlyIHRpY2tlciwKKyAgICAgICAgIG5vIHNvdW5kIHBsYXlzLCBhbmQgbm8gaWNvbnMgYXJlIHZpc2libGUuICBUaGUgd2luZG93c2hhZGUgY29udGludWVzIHRvIHNob3cKKyAgICAgICAgIHRoZSBub3RpZmljYXRpb25zLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InN0YXR1c19iYXJfZG9fbm90X2Rpc3R1cmJfYnV0dG9uIj5EbyBub3QgZGlzdHVyYjwvc3RyaW5nPgorCisgICAgPCEtLSBUaGUgdGV4dCBmb3IgdGhlIGJ1dHRvbiBpbiB0aGUgbm90aWZpY2F0aW9uIHdpbmRvdy1zaGFkZSB0aGF0IHR1cm5zCisgICAgICAgICBvZmYgZG8gbm90IGRpc3R1cmIgbW9kZS4gIEFmdGVyIGNsaWNraW5nIHRoaXMsIG5vdGlmaWNhdGlvbnMgd2lsbCBiZQorICAgICAgICAgc2hvd24gYWdhaW4uIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic3RhdHVzX2Jhcl9wbGVhc2VfZGlzdHVyYl9idXR0b24iPlNob3cgbm90aWZpY2F0aW9uczwvc3RyaW5nPgorCisKICAgICA8IS0tIFRoZSBsYWJlbCBpbiB0aGUgYmFyIGF0IHRoZSB0b3Agb2YgdGhlIHN0YXR1cyBiYXIgd2hlbiB0aGVyZSBhcmUgbm8gbm90aWZpY2F0aW9ucwogICAgICAgICAgc2hvd2luZy4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX25vX25vdGlmaWNhdGlvbnNfdGl0bGUiPk5vIG5vdGlmaWNhdGlvbnM8L3N0cmluZz4KQEAgLTUxLDQgKzYzLDIwIEBACiAgICAgICAgICBwb3dlciB1c2FnZSBhY3Rpdml0eSB0byBmaW5kIG91dCB3aGF0IGRyYWluZWQgdGhlIGJhdHRlcnkuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iYmF0dGVyeV9sb3dfd2h5Ij5CYXR0ZXJ5IHVzZTwvc3RyaW5nPgogCisgICAgPCEtLSBOYW1lIG9mIHRoZSBidXR0b24gdGhhdCBsaW5rcyB0byB0aGUgU2V0dGluZ3MgYXBwLiBbTUFYQ0hBUlM9Tk9ORV0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzeXN0ZW1fcGFuZWxfc2V0dGluZ3NfYnV0dG9uIj5TZXR0aW5nczwvc3RyaW5nPgorCisKKyAgICA8IS0tIFJlY2VudCBUYXNrcyBkaWFsb2c6IHRpdGxlCisgICAgIFRPRE86IHRoaXMgc2hvdWxkIG1vdmUgdG8gU3lzdGVtVUkuYXBrLCBidXQgdGhlIGNvZGUgZm9yIHRoZSBvbGQgCisgICAgICAgICAgICByZWNlbnQgZGlhbG9nIGlzIHN0aWxsIGluIHRoZSBmcmFtZXdvcmsKKyAgICAgLS0+CisgICAgPHN0cmluZyBuYW1lPSJyZWNlbnRfdGFza3NfdGl0bGUiPlJlY2VudDwvc3RyaW5nPgorICAgIDwhLS0gUmVjZW50IFRhc2tzIGRpYWxvZzogbWVzc2FnZSB3aGVuIHRoZXJlIGFyZSBubyByZWNlbnQgYXBwbGljYXRpb25zCisgICAgIFRPRE86IHRoaXMgc2hvdWxkIG1vdmUgdG8gU3lzdGVtVUkuYXBrLCBidXQgdGhlIGNvZGUgZm9yIHRoZSBvbGQgCisgICAgICAgICAgICByZWNlbnQgZGlhbG9nIGlzIHN0aWxsIGluIHRoZSBmcmFtZXdvcmsKKyAgICAgLS0+CisgICAgPHN0cmluZyBuYW1lPSJyZWNlbnRfdGFza3NfZW1wdHkiPk5vIHJlY2VudCBhcHBsaWNhdGlvbnMuPC9zdHJpbmc+CisKKyAgICAKIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCmluZGV4IDg2YmNmM2EuLmY1OTI3MDMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0eWxlcy54bWwKQEAgLTE5LDEwICsxOSwyNCBAQAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuVGl0bGUiIHBhcmVudD0iQGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+P2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+Ym9sZDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPkBkcmF3YWJsZS9ub3RpZmljYXRpb25faGVhZGVyX3RleHRfY29sb3I8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuSW50cnVkZXJBbGVydCIKICAgICAgICAgcGFyZW50PSJAYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIiPgogICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlN5c3RlbVBhbmVsIgorICAgICAgICBwYXJlbnQ9IkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0JhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ub3JtYWw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4jNTBGRkZGRkY8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuVGV4dEJ1dHRvbiIKKyAgICAgICAgcGFyZW50PSJAYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj4/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+I0ZGRkZGRkZGPC9pdGVtPgorICAgIDwvc3R5bGU+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9yZWNlbnQvUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHkuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9yZWNlbnQvUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmEzYzE3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudC9SZWNlbnRBcHBsaWNhdGlvbnNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnJlY2VudDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5leC5jYXJvdXNlbC5DYXJvdXNlbFZpZXc7CitpbXBvcnQgY29tLmFuZHJvaWQuZXguY2Fyb3VzZWwuQ2Fyb3VzZWxWaWV3SGVscGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmV4LmNhcm91c2VsLkNhcm91c2VsUlMuQ2Fyb3VzZWxDYWxsYmFjazsKK2ltcG9ydCBjb20uYW5kcm9pZC5leC5jYXJvdXNlbC5DYXJvdXNlbFZpZXdIZWxwZXIuRGV0YWlsVGV4dHVyZVBhcmFtZXRlcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLklUaHVtYm5haWxSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIuUnVubmluZ1Rhc2tJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50RmxhZ3NEcmF3RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZlhmZXJtb2RlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db25maWc7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk1lYXN1cmVTcGVjOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitwdWJsaWMgY2xhc3MgUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSZWNlbnRBcHBsaWNhdGlvbnNBY3Rpdml0eSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FSRF9TTE9UUyA9IDU2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWSVNJQkxFX1NMT1RTID0gNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1RBU0tTID0gVklTSUJMRV9TTE9UUyAqIDI7CisKKyAgICAvLyBUT0RPOiB0aGVzZSBzaG91bGQgYmUgY29uZmlndXJhYmxlCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFVEFJTF9URVhUVVJFX01BWF9XSURUSCA9IDIwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVUQUlMX1RFWFRVUkVfTUFYX0hFSUdIVCA9IDgwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUVVJFX1dJRFRIID0gMjU2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUVVJFX0hFSUdIVCA9IDI1NjsKKworICAgIHByaXZhdGUgQWN0aXZpdHlNYW5hZ2VyIG1BY3Rpdml0eU1hbmFnZXI7CisgICAgcHJpdmF0ZSBMaXN0PFJ1bm5pbmdUYXNrSW5mbz4gbVJ1bm5pbmdUYXNrTGlzdDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVBvcnRyYWl0TW9kZSA9IHRydWU7CisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8QWN0aXZpdHlEZXNjcmlwdGlvbj4gbUFjdGl2aXR5RGVzY3JpcHRpb25zCisgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHlEZXNjcmlwdGlvbj4oKTsKKyAgICBwcml2YXRlIENhcm91c2VsVmlldyBtQ2Fyb3VzZWxWaWV3OworICAgIHByaXZhdGUgTG9jYWxDYXJvdXNlbFZpZXdIZWxwZXIgbUhlbHBlcjsKKyAgICBwcml2YXRlIFZpZXcgbU5vUmVjZW50c1ZpZXc7CisgICAgcHJpdmF0ZSBCaXRtYXAgbUxvYWRpbmdCaXRtYXA7CisgICAgcHJpdmF0ZSBCaXRtYXAgbVJlY2VudE92ZXJsYXk7CisgICAgcHJpdmF0ZSBib29sZWFuIG1IaWRkZW4gPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhpZGluZyA9IGZhbHNlOworICAgIHByaXZhdGUgRGV0YWlsSW5mbyBtRGV0YWlsSW5mbzsKKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgaXMgYSBjb250YWluZXIgZm9yIGFsbCBpdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIERldGFpbFZpZXcgd2UnbGwKKyAgICAgKiBiZSBkcmF3aW5nIHRvIGEgYml0bWFwIGFuZCBzZW5kaW5nIHRvIENhcm91c2VsLgorICAgICAqCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIERldGFpbEluZm8geworICAgICAgICBwdWJsaWMgRGV0YWlsSW5mbyhWaWV3IF92aWV3LCBUZXh0VmlldyBfdGl0bGUsIFRleHRWaWV3IF9kZXNjKSB7CisgICAgICAgICAgICB2aWV3ID0gX3ZpZXc7CisgICAgICAgICAgICB0aXRsZSA9IF90aXRsZTsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gX2Rlc2M7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRHJhd3MgdmlldyBpbnRvIHRoZSBnaXZlbiBiaXRtYXAsIGlmIHByb3ZpZGVkCisgICAgICAgICAqIEBwYXJhbSBiaXRtYXAKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCaXRtYXAgZHJhdyhCaXRtYXAgYml0bWFwKSB7CisgICAgICAgICAgICByZXNpemVWaWV3KHZpZXcsIERFVEFJTF9URVhUVVJFX01BWF9XSURUSCwgREVUQUlMX1RFWFRVUkVfTUFYX0hFSUdIVCk7CisgICAgICAgICAgICBpbnQgZGVzaXJlZFdpZHRoID0gdmlldy5nZXRXaWR0aCgpOworICAgICAgICAgICAgaW50IGRlc2lyZWRIZWlnaHQgPSB2aWV3LmdldEhlaWdodCgpOworICAgICAgICAgICAgaWYgKGJpdG1hcCA9PSBudWxsIHx8IGRlc2lyZWRXaWR0aCAhPSBiaXRtYXAuZ2V0V2lkdGgoKQorICAgICAgICAgICAgICAgICAgICB8fCBkZXNpcmVkSGVpZ2h0ICE9IGJpdG1hcC5nZXRIZWlnaHQoKSkgeworICAgICAgICAgICAgICAgIGJpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoZGVzaXJlZFdpZHRoLCBkZXNpcmVkSGVpZ2h0LCBDb25maWcuQVJHQl84ODg4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKGJpdG1hcCk7CisgICAgICAgICAgICB2aWV3LmRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRm9yY2UgYSBsYXlvdXQgcGFzcyBvbiB0aGUgZ2l2ZW4gdmlldy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCByZXNpemVWaWV3KFZpZXcgdmlldywgaW50IG1heFdpZHRoLCBpbnQgbWF4SGVpZ2h0KSB7CisgICAgICAgICAgICBpbnQgd2lkdGhTcGVjID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShNZWFzdXJlU3BlYy5BVF9NT1NUKQorICAgICAgICAgICAgICAgICAgICB8IE1lYXN1cmVTcGVjLmdldFNpemUobWF4V2lkdGgpOworICAgICAgICAgICAgaW50IGhlaWdodFNwZWMgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKE1lYXN1cmVTcGVjLkFUX01PU1QpCisgICAgICAgICAgICAgICAgICAgIHwgTWVhc3VyZVNwZWMuZ2V0U2l6ZShtYXhIZWlnaHQpOworICAgICAgICAgICAgdmlldy5tZWFzdXJlKHdpZHRoU3BlYywgaGVpZ2h0U3BlYyk7CisgICAgICAgICAgICB2aWV3LmxheW91dCgwLCAwLCB2aWV3LmdldE1lYXN1cmVkV2lkdGgoKSwgdmlldy5nZXRNZWFzdXJlZEhlaWdodCgpKTsKKyAgICAgICAgICAgIExvZy52KFRBRywgIlJFU0laRUQgVklFVzogIiArIHZpZXcuZ2V0V2lkdGgoKSArICIsICIgKyB2aWV3LmdldEhlaWdodCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBWaWV3IHZpZXc7CisgICAgICAgIHB1YmxpYyBUZXh0VmlldyB0aXRsZTsKKyAgICAgICAgcHVibGljIFRleHRWaWV3IGRlc2NyaXB0aW9uOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBBY3Rpdml0eURlc2NyaXB0aW9uIHsKKyAgICAgICAgaW50IGlkOworICAgICAgICBCaXRtYXAgdGh1bWJuYWlsOyAvLyBnZW5lcmF0ZWQgYnkgQWN0aXZpdHkub25DcmVhdGVUaHVtYm5haWwoKQorICAgICAgICBEcmF3YWJsZSBpY29uOyAvLyBhcHBsaWNhdGlvbiBwYWNrYWdlIGljb24KKyAgICAgICAgU3RyaW5nIGxhYmVsOyAvLyBhcHBsaWNhdGlvbiBwYWNrYWdlIGxhYmVsCisgICAgICAgIENoYXJTZXF1ZW5jZSBkZXNjcmlwdGlvbjsgLy8gZ2VuZXJhdGVkIGJ5IEFjdGl2aXR5Lm9uQ3JlYXRlRGVzY3JpcHRpb24oKQorICAgICAgICBJbnRlbnQgaW50ZW50OyAvLyBsYXVuY2ggaW50ZW50IGZvciBhcHBsaWNhdGlvbgorICAgICAgICBNYXRyaXggbWF0cml4OyAvLyBhcmJpdHJhcnkgcm90YXRpb24gbWF0cml4IHRvIGNvcnJlY3Qgb3JpZW50YXRpb24KKyAgICAgICAgaW50IHBvc2l0aW9uOyAvLyBwb3NpdGlvbiBpbiBsaXN0CisKKyAgICAgICAgcHVibGljIEFjdGl2aXR5RGVzY3JpcHRpb24oQml0bWFwIF90aHVtYm5haWwsCisgICAgICAgICAgICAgICAgRHJhd2FibGUgX2ljb24sIFN0cmluZyBfbGFiZWwsIFN0cmluZyBfZGVzYywgaW50IF9pZCwgaW50IF9wb3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRodW1ibmFpbCA9IF90aHVtYm5haWw7CisgICAgICAgICAgICBpY29uID0gX2ljb247CisgICAgICAgICAgICBsYWJlbCA9IF9sYWJlbDsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gX2Rlc2M7CisgICAgICAgICAgICBpZCA9IF9pZDsKKyAgICAgICAgICAgIHBvc2l0aW9uID0gX3BvczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgaWNvbiA9IG51bGw7CisgICAgICAgICAgICB0aHVtYm5haWwgPSBudWxsOworICAgICAgICAgICAgbGFiZWwgPSBudWxsOworICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBudWxsOworICAgICAgICAgICAgaW50ZW50ID0gbnVsbDsKKyAgICAgICAgICAgIG1hdHJpeCA9IG51bGw7CisgICAgICAgICAgICBpZCA9IC0xOworICAgICAgICAgICAgcG9zaXRpb24gPSAtMTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIEFjdGl2aXR5RGVzY3JpcHRpb24gZmluZEFjdGl2aXR5RGVzY3JpcHRpb24oaW50IGlkKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUFjdGl2aXR5RGVzY3JpcHRpb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBBY3Rpdml0eURlc2NyaXB0aW9uIGl0ZW0gPSBtQWN0aXZpdHlEZXNjcmlwdGlvbnMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCAmJiBpdGVtLmlkID09IGlkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBMb2NhbENhcm91c2VsVmlld0hlbHBlciBleHRlbmRzIENhcm91c2VsVmlld0hlbHBlciB7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIHByaXZhdGUgRGV0YWlsVGV4dHVyZVBhcmFtZXRlcnMgbURldGFpbFBhcmFtcyA9IG5ldyBEZXRhaWxUZXh0dXJlUGFyYW1ldGVycygxMC4wZiwgMjAuMGYpOworCisgICAgICAgIHB1YmxpYyBMb2NhbENhcm91c2VsVmlld0hlbHBlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBEZXRhaWxUZXh0dXJlUGFyYW1ldGVycyBnZXREZXRhaWxUZXh0dXJlUGFyYW1ldGVycyhpbnQgaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGV0YWlsUGFyYW1zOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25DYXJkU2VsZWN0ZWQoaW50IG4pIHsKKyAgICAgICAgICAgIGlmIChuIDwgbUFjdGl2aXR5RGVzY3JpcHRpb25zLnNpemUoKSkgeworICAgICAgICAgICAgICAgIEFjdGl2aXR5RGVzY3JpcHRpb24gaXRlbSA9IG1BY3Rpdml0eURlc2NyaXB0aW9ucy5nZXQobik7CisgICAgICAgICAgICAgICAgLy8gcHJlcGFyZSBhIGxhdW5jaCBpbnRlbnQgYW5kIHNlbmQgaXQKKyAgICAgICAgICAgICAgICBpZiAoaXRlbS5pbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpdGVtLmludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9MQVVOQ0hFRF9GUk9NX0hJU1RPUlkpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiU3RhcnRpbmcgaW50ZW50ICIgKyBpdGVtLmludGVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KGl0ZW0uaW50ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlUGVuZGluZ1RyYW5zaXRpb24oUi5hbmltLnJlY2VudF9hcHBfZW50ZXIsIFIuYW5pbS5yZWNlbnRfYXBwX2xlYXZlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudygiUmVjZW50IiwgIlVuYWJsZSB0byBsYXVuY2ggcmVjZW50IHRhc2siLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJpdG1hcCBnZXRUZXh0dXJlKGZpbmFsIGludCBpZCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAib25SZXF1ZXN0VGV4dHVyZSgiICsgaWQgKyAiKSIpOworICAgICAgICAgICAgQWN0aXZpdHlEZXNjcmlwdGlvbiBpbmZvOworICAgICAgICAgICAgc3luY2hyb25pemVkKG1BY3Rpdml0eURlc2NyaXB0aW9ucykgeworICAgICAgICAgICAgICAgIGluZm8gPSBtQWN0aXZpdHlEZXNjcmlwdGlvbnMuZ2V0KGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBudWxsOworICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJpdG1hcCA9IGNvbXBvc2l0ZUJpdG1hcChpbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJpdG1hcCBnZXREZXRhaWxUZXh0dXJlKGludCBuKSB7CisgICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChuIDwgbUFjdGl2aXR5RGVzY3JpcHRpb25zLnNpemUoKSkgeworICAgICAgICAgICAgICAgIEFjdGl2aXR5RGVzY3JpcHRpb24gaXRlbSA9IG1BY3Rpdml0eURlc2NyaXB0aW9ucy5nZXQobik7CisgICAgICAgICAgICAgICAgbURldGFpbEluZm8udGl0bGUuc2V0VGV4dChpdGVtLmxhYmVsKTsKKyAgICAgICAgICAgICAgICBtRGV0YWlsSW5mby5kZXNjcmlwdGlvbi5zZXRUZXh0KGl0ZW0uZGVzY3JpcHRpb24pOworICAgICAgICAgICAgICAgIGJpdG1hcCA9IG1EZXRhaWxJbmZvLmRyYXcobnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYml0bWFwOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgQml0bWFwIGNvbXBvc2l0ZUJpdG1hcChBY3Rpdml0eURlc2NyaXB0aW9uIGluZm8pIHsKKyAgICAgICAgZmluYWwgaW50IHRhcmdldFdpZHRoID0gVEVYVFVSRV9XSURUSDsKKyAgICAgICAgZmluYWwgaW50IHRhcmdldEhlaWdodCA9IFRFWFRVUkVfSEVJR0hUOworICAgICAgICBmaW5hbCBpbnQgYm9yZGVyID0gMzsgLy8gaW5zZXQgYWxvbmcgdGhlIGVkZ2UgZm9yIHRodW1ubmFpbCBjb250ZW50CisgICAgICAgIGZpbmFsIGludCBvdmVybGFwID0gMTsgLy8gaG93IG1hbnkgcGl4ZWxzIG9mIG92ZXJsYXAgYmV0d2VlbiBib3JkZXIgYW5kIHRodW1ibmFpbAorICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIGlmIChtUmVjZW50T3ZlcmxheSA9PSBudWxsKSB7CisgICAgICAgICAgICBtUmVjZW50T3ZlcmxheSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UocmVzLCBSLmRyYXdhYmxlLnJlY2VudF9vdmVybGF5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBhIGJpdG1hcCBvZiB0aGUgcHJvcGVyIHNpemUvZm9ybWF0IGFuZCBzZXQgdGhlIGNhbnZhcyB0byBkcmF3IHRvIGl0CisgICAgICAgIGZpbmFsIEJpdG1hcCByZXN1bHQgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHRhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHQsIEJpdG1hcC5Db25maWcuQVJHQl84ODg4KTsKKyAgICAgICAgZmluYWwgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMocmVzdWx0KTsKKyAgICAgICAgY2FudmFzLnNldERyYXdGaWx0ZXIobmV3IFBhaW50RmxhZ3NEcmF3RmlsdGVyKFBhaW50LkRJVEhFUl9GTEFHLCBQYWludC5GSUxURVJfQklUTUFQX0ZMQUcpKTsKKyAgICAgICAgUGFpbnQgcGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgcGFpbnQuc2V0RmlsdGVyQml0bWFwKGZhbHNlKTsKKworICAgICAgICBwYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKFBvcnRlckR1ZmYuTW9kZS5TUkMpKTsKKyAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgaWYgKGluZm8udGh1bWJuYWlsICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIERyYXcgdGhlIHRodW1ibmFpbAorICAgICAgICAgICAgaW50IHNvdXJjZVdpZHRoID0gdGFyZ2V0V2lkdGggLSAyICogKGJvcmRlciAtIG92ZXJsYXApOworICAgICAgICAgICAgaW50IHNvdXJjZUhlaWdodCA9IHRhcmdldEhlaWdodCAtIDIgKiAoYm9yZGVyIC0gb3ZlcmxhcCk7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZVggPSAoZmxvYXQpIHNvdXJjZVdpZHRoIC8gaW5mby50aHVtYm5haWwuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IHNjYWxlWSA9IChmbG9hdCkgc291cmNlSGVpZ2h0IC8gaW5mby50aHVtYm5haWwuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKGJvcmRlciAqIDAuNWYsIGJvcmRlciAqIDAuNWYpOworICAgICAgICAgICAgY2FudmFzLnNjYWxlKHNjYWxlWCwgc2NhbGVZKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKGluZm8udGh1bWJuYWlsLCAwLCAwLCBwYWludCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBEcmF3IHRoZSBMb2FkaW5nIGJpdG1hcCBwbGFjZWhvbGRlciwgVE9ETzogUmVtb3ZlIHdoZW4gUlMgaGFuZGxlcyBibGVuZGluZworICAgICAgICAgICAgZmluYWwgZmxvYXQgc2NhbGVYID0gKGZsb2F0KSB0YXJnZXRXaWR0aCAvIG1Mb2FkaW5nQml0bWFwLmdldFdpZHRoKCk7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZVkgPSAoZmxvYXQpIHRhcmdldEhlaWdodCAvIG1Mb2FkaW5nQml0bWFwLmdldEhlaWdodCgpOworICAgICAgICAgICAgY2FudmFzLnNjYWxlKHNjYWxlWCwgc2NhbGVZKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1Mb2FkaW5nQml0bWFwLCAwLCAwLCBwYWludCk7CisgICAgICAgIH0KKyAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAvLyBEcmF3IG92ZXJsYXkKKyAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgZmluYWwgZmxvYXQgc2NhbGVPdmVybGF5WCA9IChmbG9hdCkgdGFyZ2V0V2lkdGggLyBtUmVjZW50T3ZlcmxheS5nZXRXaWR0aCgpOworICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZU92ZXJsYXlZID0gKGZsb2F0KSB0YXJnZXRIZWlnaHQgLyBtUmVjZW50T3ZlcmxheS5nZXRIZWlnaHQoKTsKKyAgICAgICAgY2FudmFzLnNjYWxlKHNjYWxlT3ZlcmxheVgsIHNjYWxlT3ZlcmxheVkpOworICAgICAgICBwYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKFBvcnRlckR1ZmYuTW9kZS5BREQpKTsKKyAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobVJlY2VudE92ZXJsYXksIDAsIDAsIHBhaW50KTsKKyAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAvLyBEcmF3IGljb24KKyAgICAgICAgaWYgKGluZm8uaWNvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgaW5mby5pY29uLmRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgSVRodW1ibmFpbFJlY2VpdmVyIG1UaHVtYm5haWxSZWNlaXZlciA9IG5ldyBJVGh1bWJuYWlsUmVjZWl2ZXIuU3R1YigpIHsKKworICAgICAgICBwdWJsaWMgdm9pZCBmaW5pc2hlZCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBuZXdUaHVtYm5haWwoZmluYWwgaW50IGlkLCBmaW5hbCBCaXRtYXAgYml0bWFwLCBDaGFyU2VxdWVuY2UgZGVzY3JpcHRpb24pCisgICAgICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnQgdyA9IGJpdG1hcC5nZXRXaWR0aCgpOworICAgICAgICAgICAgaW50IGggPSBiaXRtYXAuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJOZXcgdGh1bWJuYWlsIGZvciBpZD0iICsgaWQgKyAiLCBkaW1lbnNpb25zPSIgKyB3ICsgIngiICsgaAorICAgICAgICAgICAgICAgICAgICArICIgZGVzY3JpcHRpb24gJyIgKyBkZXNjcmlwdGlvbiArICInIik7CisgICAgICAgICAgICBBY3Rpdml0eURlc2NyaXB0aW9uIGluZm8gPSBmaW5kQWN0aXZpdHlEZXNjcmlwdGlvbihpZCk7CisgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5mby50aHVtYm5haWwgPSBiaXRtYXA7CisgICAgICAgICAgICAgICAgaW5mby5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgICAgICAgICAgICAgIGZpbmFsIGludCB0aHVtYldpZHRoID0gYml0bWFwLmdldFdpZHRoKCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHRodW1iSGVpZ2h0ID0gYml0bWFwLmdldEhlaWdodCgpOworICAgICAgICAgICAgICAgIGlmICgobVBvcnRyYWl0TW9kZSAmJiB0aHVtYldpZHRoID4gdGh1bWJIZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoIW1Qb3J0cmFpdE1vZGUgJiYgdGh1bWJXaWR0aCA8IHRodW1iSGVpZ2h0KSkgeworICAgICAgICAgICAgICAgICAgICBNYXRyaXggbWF0cml4ID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgICAgICAgICBtYXRyaXguc2V0Um90YXRlKDkwLjBmLCAoZmxvYXQpIHRodW1iV2lkdGggLyAyLCAoZmxvYXQpIHRodW1iSGVpZ2h0IC8gMik7CisgICAgICAgICAgICAgICAgICAgIGluZm8ubWF0cml4ID0gbWF0cml4OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGluZm8ubWF0cml4ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNhcm91c2VsVmlldy5zZXRUZXh0dXJlRm9ySXRlbShpbmZvLnBvc2l0aW9uLCBjb21wb3NpdGVCaXRtYXAoaW5mbykpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJDYW4ndCBmaW5kIHZpZXcgZm9yIGlkICIgKyBpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogV2UgbmV2ZXIgcmVhbGx5IGZpbmlzaCgpIFJlY2VudEFwcGxpY2F0aW9uc0FjdGl2aXR5LCBzaW5jZSB3ZSBkb24ndCB3YW50IHRvCisgICAgICogZ2V0IGRlc3Ryb3llZCBhbmQgcGF5IHRoZSBzdGFydC11cCBjb3N0IHRvIHJlc3RhcnQgaXQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgICAgICBtb3ZlVGFza1RvQmFjayh0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk5ld0ludGVudChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIG1IaWRkZW4gPSAhbUhpZGRlbjsKKyAgICAgICAgaWYgKG1IaWRkZW4pIHsKKyAgICAgICAgICAgIG1IaWRpbmcgPSB0cnVlOworICAgICAgICAgICAgbW92ZVRhc2tUb0JhY2sodHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSGlkaW5nID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIub25OZXdJbnRlbnQoaW50ZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOworICAgICAgICBmaW5hbCBWaWV3IGRlY29yVmlldyA9IGdldFdpbmRvdygpLmdldERlY29yVmlldygpOworCisgICAgICAgIGdldFdpbmRvdygpLmdldERlY29yVmlldygpLnNldEJhY2tncm91bmRDb2xvcigweDgwMDAwMDAwKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQucmVjZW50X2FwcHNfYWN0aXZpdHkpOworCisKKyAgICAgICAgaWYgKG1DYXJvdXNlbFZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgbUxvYWRpbmdCaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKHJlcywgUi5kcmF3YWJsZS5yZWNlbnRfcmV6X2JvcmRlcik7CisgICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3ID0gKENhcm91c2VsVmlldylmaW5kVmlld0J5SWQoUi5pZC5jYXJvdXNlbCk7CisgICAgICAgICAgICBtSGVscGVyID0gbmV3IExvY2FsQ2Fyb3VzZWxWaWV3SGVscGVyKHRoaXMpOworICAgICAgICAgICAgbUhlbHBlci5zZXRDYXJvdXNlbFZpZXcobUNhcm91c2VsVmlldyk7CisKKyAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0U2xvdENvdW50KENBUkRfU0xPVFMpOworICAgICAgICAgICAgbUNhcm91c2VsVmlldy5zZXRWaXNpYmxlU2xvdHMoVklTSUJMRV9TTE9UUyk7CisgICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3LmNyZWF0ZUNhcmRzKDApOworICAgICAgICAgICAgbUNhcm91c2VsVmlldy5zZXRTdGFydEFuZ2xlKChmbG9hdCkgLSgyLjBmKk1hdGguUEkgKiA1IC8gQ0FSRF9TTE9UUykpOworICAgICAgICAgICAgbUNhcm91c2VsVmlldy5zZXREZWZhdWx0Qml0bWFwKG1Mb2FkaW5nQml0bWFwKTsKKyAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0TG9hZGluZ0JpdG1hcChtTG9hZGluZ0JpdG1hcCk7CisgICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3LnNldFJlekluQ2FyZENvdW50KDMuMGYpOworICAgICAgICAgICAgbUNhcm91c2VsVmlldy5nZXRIb2xkZXIoKS5zZXRGb3JtYXQoUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQpOworCisgICAgICAgICAgICBtTm9SZWNlbnRzVmlldyA9IChWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5ub19hcHBsaWNhdGlvbnNfbWVzc2FnZSk7CisKKyAgICAgICAgICAgIG1BY3Rpdml0eU1hbmFnZXIgPSAoQWN0aXZpdHlNYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgICAgICBtUG9ydHJhaXRNb2RlID0gZGVjb3JWaWV3LmdldEhlaWdodCgpID4gZGVjb3JWaWV3LmdldFdpZHRoKCk7CisKKyAgICAgICAgICAgIC8vIExvYWQgZGV0YWlsIHZpZXcgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHJlbmRlciB0ZXh0CisgICAgICAgICAgICBWaWV3IGRldGFpbCA9IGdldExheW91dEluZmxhdGVyKCkuaW5mbGF0ZShSLmxheW91dC5yZWNlbnRzX2RldGFpbF92aWV3LCBudWxsKTsKKyAgICAgICAgICAgIFRleHRWaWV3IHRpdGxlID0gKFRleHRWaWV3KSBkZXRhaWwuZmluZFZpZXdCeUlkKFIuaWQuYXBwX3RpdGxlKTsKKyAgICAgICAgICAgIFRleHRWaWV3IGRlc2NyaXB0aW9uID0gKFRleHRWaWV3KSBkZXRhaWwuZmluZFZpZXdCeUlkKFIuaWQuYXBwX2Rlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIG1EZXRhaWxJbmZvID0gbmV3IERldGFpbEluZm8oZGV0YWlsLCB0aXRsZSwgZGVzY3JpcHRpb24pOworCisgICAgICAgICAgICByZWZyZXNoKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgcmVmcmVzaCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOworICAgICAgICBtUG9ydHJhaXRNb2RlID0gbmV3Q29uZmlnLm9yaWVudGF0aW9uID09IENvbmZpZ3VyYXRpb24uT1JJRU5UQVRJT05fUE9SVFJBSVQ7CisgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIkNPTkZJRyBDSEFOR0UsIG1Qb3J0cmFpdE1vZGUgPSAiICsgbVBvcnRyYWl0TW9kZSk7CisgICAgICAgIHJlZnJlc2goKTsKKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZVJ1bm5pbmdUYXNrcygpIHsKKyAgICAgICAgbVJ1bm5pbmdUYXNrTGlzdCA9IG1BY3Rpdml0eU1hbmFnZXIuZ2V0UnVubmluZ1Rhc2tzKE1BWF9UQVNLUywgMCwgbVRodW1ibmFpbFJlY2VpdmVyKTsKKyAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiUG9ydHJhaXQ6ICIgKyBtUG9ydHJhaXRNb2RlKTsKKyAgICAgICAgZm9yIChSdW5uaW5nVGFza0luZm8gciA6IG1SdW5uaW5nVGFza0xpc3QpIHsKKyAgICAgICAgICAgIGlmIChyLnRodW1ibmFpbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50IHRodW1iV2lkdGggPSByLnRodW1ibmFpbC5nZXRXaWR0aCgpOworICAgICAgICAgICAgICAgIGludCB0aHVtYkhlaWdodCA9IHIudGh1bWJuYWlsLmdldEhlaWdodCgpOworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIkdvdCB0aHVtYm5haWwgIiArIHRodW1iV2lkdGggKyAieCIgKyB0aHVtYkhlaWdodCk7CisgICAgICAgICAgICAgICAgQWN0aXZpdHlEZXNjcmlwdGlvbiBkZXNjID0gZmluZEFjdGl2aXR5RGVzY3JpcHRpb24oci5pZCk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBkZXNjLnRodW1ibmFpbCA9IHIudGh1bWJuYWlsOworICAgICAgICAgICAgICAgICAgICBkZXNjLmRlc2NyaXB0aW9uID0gci5kZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChtUG9ydHJhaXRNb2RlICYmIHRodW1iV2lkdGggPiB0aHVtYkhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoIW1Qb3J0cmFpdE1vZGUgJiYgdGh1bWJXaWR0aCA8IHRodW1iSGVpZ2h0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTWF0cml4IG1hdHJpeCA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC5zZXRSb3RhdGUoOTAuMGYsIChmbG9hdCkgdGh1bWJXaWR0aCAvIDIsIChmbG9hdCkgdGh1bWJIZWlnaHQgLyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MubWF0cml4ID0gbWF0cml4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiQ291bGRuJ3QgZmluZCBBY3Rpdml0eURlc2MgZm9yIGlkPSIgKyByLmlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIioqKiBSVU5OSU5HIFRIVU1CTkFJTCBXQVMgTlVMTCAqKioiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQ2Fyb3VzZWxWaWV3LmNyZWF0ZUNhcmRzKG1BY3Rpdml0eURlc2NyaXB0aW9ucy5zaXplKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSZWNlbnRUYXNrcygpIHsKKyAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXIgcG0gPSBnZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXIgYW0gPSAoQWN0aXZpdHlNYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUNUSVZJVFlfU0VSVklDRSk7CisKKyAgICAgICAgZmluYWwgTGlzdDxBY3Rpdml0eU1hbmFnZXIuUmVjZW50VGFza0luZm8+IHJlY2VudFRhc2tzID0KKyAgICAgICAgICAgICAgICBhbS5nZXRSZWNlbnRUYXNrcyhNQVhfVEFTS1MsIEFjdGl2aXR5TWFuYWdlci5SRUNFTlRfSUdOT1JFX1VOQVZBSUxBQkxFKTsKKworICAgICAgICBBY3Rpdml0eUluZm8gaG9tZUluZm8gPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fTUFJTikuYWRkQ2F0ZWdvcnkoSW50ZW50LkNBVEVHT1JZX0hPTUUpCisgICAgICAgICAgICAgICAgICAgIC5yZXNvbHZlQWN0aXZpdHlJbmZvKHBtLCAwKTsKKworICAgICAgICAvLyBJY29uVXRpbGl0aWVzIGljb25VdGlsaXRpZXMgPSBuZXcgSWNvblV0aWxpdGllcyh0aGlzKTsgLy8gRklYTUUKKworICAgICAgICBpbnQgbnVtVGFza3MgPSByZWNlbnRUYXNrcy5zaXplKCk7CisgICAgICAgIG1BY3Rpdml0eURlc2NyaXB0aW9ucy5jbGVhcigpOworICAgICAgICBmb3IgKGludCBpID0gMCwgaW5kZXggPSAwOyBpIDwgbnVtVGFza3MgJiYgKGluZGV4IDwgTUFYX1RBU0tTKTsgKytpKSB7CisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXIuUmVjZW50VGFza0luZm8gcmVjZW50SW5mbyA9IHJlY2VudFRhc2tzLmdldChpKTsKKworICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQocmVjZW50SW5mby5iYXNlSW50ZW50KTsKKyAgICAgICAgICAgIGlmIChyZWNlbnRJbmZvLm9yaWdBY3Rpdml0eSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChyZWNlbnRJbmZvLm9yaWdBY3Rpdml0eSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNraXAgdGhlIGN1cnJlbnQgaG9tZSBhY3Rpdml0eS4KKyAgICAgICAgICAgIGlmIChob21lSW5mbyAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIGhvbWVJbmZvLnBhY2thZ2VOYW1lLmVxdWFscyhpbnRlbnQuZ2V0Q29tcG9uZW50KCkuZ2V0UGFja2FnZU5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgaG9tZUluZm8ubmFtZS5lcXVhbHMoaW50ZW50LmdldENvbXBvbmVudCgpLmdldENsYXNzTmFtZSgpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoKGludGVudC5nZXRGbGFncygpJn5JbnRlbnQuRkxBR19BQ1RJVklUWV9SRVNFVF9UQVNLX0lGX05FRURFRCkKKyAgICAgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgICAgICBmaW5hbCBSZXNvbHZlSW5mbyByZXNvbHZlSW5mbyA9IHBtLnJlc29sdmVBY3Rpdml0eShpbnRlbnQsIDApOworICAgICAgICAgICAgaWYgKHJlc29sdmVJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eUluZm8gaW5mbyA9IHJlc29sdmVJbmZvLmFjdGl2aXR5SW5mbzsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGl0bGUgPSBpbmZvLmxvYWRMYWJlbChwbSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBEcmF3YWJsZSBpY29uID0gaW5mby5sb2FkSWNvbihwbSk7CisKKyAgICAgICAgICAgICAgICBpbnQgaWQgPSByZWNlbnRUYXNrcy5nZXQoaSkuaWQ7CisgICAgICAgICAgICAgICAgaWYgKGlkICE9IC0xICYmIHRpdGxlICE9IG51bGwgJiYgdGl0bGUubGVuZ3RoKCkgPiAwICYmIGljb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBpY29uID0gbnVsbDsgRklYTUU6IGljb25VdGlsaXRpZXMuY3JlYXRlSWNvbkRyYXdhYmxlKGljb24pOworICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURlc2NyaXB0aW9uIGl0ZW0gPSBuZXcgQWN0aXZpdHlEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBpY29uLCB0aXRsZSwgbnVsbCwgaWQsIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5pbnRlbnQgPSBpbnRlbnQ7CisgICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0eURlc2NyaXB0aW9ucy5hZGQoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIkFkZGVkIGl0ZW1bIiArIGluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSwgaWQ9IiArIGl0ZW0uaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHRpdGxlPSIgKyBpdGVtLmxhYmVsKTsKKyAgICAgICAgICAgICAgICAgICAgKytpbmRleDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJTS0lQUElORyBpdGVtICIgKyBpZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtUmVmcmVzaFJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB1cGRhdGVSZWNlbnRUYXNrcygpOworICAgICAgICAgICAgdXBkYXRlUnVubmluZ1Rhc2tzKCk7CisgICAgICAgICAgICBzaG93Q2Fyb3VzZWwobUFjdGl2aXR5RGVzY3JpcHRpb25zLnNpemUoKSA+IDApOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgdm9pZCBzaG93Q2Fyb3VzZWwoYm9vbGVhbiBzaG93KSB7CisgICAgICAgIGlmIChzaG93KSB7CisgICAgICAgICAgICAvLyBNYWtlIGNhcm91c2VsIHZpc2libGUKKyAgICAgICAgICAgIG1Ob1JlY2VudHNWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbUNhcm91c2VsVmlldy5jcmVhdGVDYXJkcyhtQWN0aXZpdHlEZXNjcmlwdGlvbnMuc2l6ZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHNob3cgIk5vIFJlY2VudCBUYXNrcyIKKyAgICAgICAgICAgIG1Ob1JlY2VudHNWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2goKSB7CisgICAgICAgIGlmICghbUhpZGluZyAmJiBtQ2Fyb3VzZWxWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIERvbid0IHVwZGF0ZSB0aGUgdmlldyBub3cuIEluc3RlYWQsIHBvc3QgYSByZXF1ZXN0IHNvIGl0IGhhcHBlbnMgbmV4dCB0aW1lCisgICAgICAgICAgICAvLyB3ZSByZWFjaCB0aGUgbG9vcGVyIGFmdGVyIGEgZGVsYXkuIFRoaXMgd2F5IHdlIGNhbiBmb2xkIG11bHRpcGxlIHJlZnJlc2hlcworICAgICAgICAgICAgLy8gaW50byBqdXN0IHRoZSBsYXRlc3QuCisgICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3LnJlbW92ZUNhbGxiYWNrcyhtUmVmcmVzaFJ1bm5hYmxlKTsKKyAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcucG9zdERlbGF5ZWQobVJlZnJlc2hSdW5uYWJsZSwgNTApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudC9SZWNlbnRBcHBsaWNhdGlvbnNDYXJvdXNlbFZpZXcuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9yZWNlbnQvUmVjZW50QXBwbGljYXRpb25zQ2Fyb3VzZWxWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM4ZWM5NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9yZWNlbnQvUmVjZW50QXBwbGljYXRpb25zQ2Fyb3VzZWxWaWV3LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkucmVjZW50OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmV4LmNhcm91c2VsLkNhcm91c2VsVmlldzsKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOworCitwdWJsaWMgY2xhc3MgUmVjZW50QXBwbGljYXRpb25zQ2Fyb3VzZWxWaWV3IGV4dGVuZHMgQ2Fyb3VzZWxWaWV3IHsKKworICAgIHB1YmxpYyBSZWNlbnRBcHBsaWNhdGlvbnNDYXJvdXNlbFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIFJlY2VudEFwcGxpY2F0aW9uc0Nhcm91c2VsVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgfQorCisgICAgcHVibGljIEluZm8gZ2V0UmVuZGVyU2NyaXB0SW5mbygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbmZvKFIucmF3LmNhcm91c2VsKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvQ2xvc2VEcmFnSGFuZGxlLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0Nsb3NlRHJhZ0hhbmRsZS5qYXZhCmluZGV4IGY0NWNhZjUxLi4wZjY3MjNlIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0Nsb3NlRHJhZ0hhbmRsZS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvQ2xvc2VEcmFnSGFuZGxlLmphdmEKQEAgLTIzLDcgKzIzLDcgQEAKIAogCiBwdWJsaWMgY2xhc3MgQ2xvc2VEcmFnSGFuZGxlIGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKLSAgICBTdGF0dXNCYXJTZXJ2aWNlIG1TZXJ2aWNlOworICAgIFBob25lU3RhdHVzQmFyU2VydmljZSBtU2VydmljZTsKIAogICAgIHB1YmxpYyBDbG9zZURyYWdIYW5kbGUoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Db21tYW5kUXVldWUuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvQ29tbWFuZFF1ZXVlLmphdmEKaW5kZXggNGYwODBkNS4uODEwOTFlMyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Db21tYW5kUXVldWUuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0NvbW1hbmRRdWV1ZS5qYXZhCkBAIC0zMiw3ICszMiw3IEBACiAgKiBjb2FsZXNjaW5nIHRoZXNlIGNhbGxzIHNvIHRoZXkgZG9uJ3Qgc3RhY2sgdXAuICBGb3IgdGhlIGNhbGxzCiAgKiBhcmUgY29hbGVzY2VkLCBub3RlIHRoYXQgdGhleSBhcmUgYWxsIGlkZW1wb3RlbnQuCiAgKi8KLWNsYXNzIENvbW1hbmRRdWV1ZSBleHRlbmRzIElTdGF0dXNCYXIuU3R1YiB7CitwdWJsaWMgY2xhc3MgQ29tbWFuZFF1ZXVlIGV4dGVuZHMgSVN0YXR1c0Jhci5TdHViIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN0YXR1c0Jhci5Db21tYW5kUXVldWUiOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19NQVNLID0gMHhmZmZmMDAwMDsKQEAgLTUyLDYgKzUyLDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1BfRVhQQU5EID0gMTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1BfQ09MTEFQU0UgPSAyOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TRVRfTElHSFRTX09OID0gMHgwMDA3MDAwMDsKKwogICAgIHByaXZhdGUgU3RhdHVzQmFySWNvbkxpc3QgbUxpc3Q7CiAgICAgcHJpdmF0ZSBDYWxsYmFja3MgbUNhbGxiYWNrczsKICAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSCgpOwpAQCAtNzUsNiArNzcsNyBAQAogICAgICAgICBwdWJsaWMgdm9pZCBkaXNhYmxlKGludCBzdGF0ZSk7CiAgICAgICAgIHB1YmxpYyB2b2lkIGFuaW1hdGVFeHBhbmQoKTsKICAgICAgICAgcHVibGljIHZvaWQgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgIHB1YmxpYyB2b2lkIHNldExpZ2h0c09uKGJvb2xlYW4gb24pOwogICAgIH0KIAogICAgIHB1YmxpYyBDb21tYW5kUXVldWUoQ2FsbGJhY2tzIGNhbGxiYWNrcywgU3RhdHVzQmFySWNvbkxpc3QgbGlzdCkgewpAQCAtMTQzLDYgKzE0NiwxMyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgc2V0TGlnaHRzT24oYm9vbGVhbiBvbikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1MaXN0KSB7CisgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfU0VUX0xJR0hUU19PTik7CisgICAgICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19TRVRfTElHSFRTX09OLCBvbiA/IDEgOiAwLCAwLCBudWxsKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgSCBleHRlbmRzIEhhbmRsZXIgewogICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQgd2hhdCA9IG1zZy53aGF0ICYgTVNHX01BU0s7CkBAIC0xOTYsNiArMjA2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLmFuaW1hdGVDb2xsYXBzZSgpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1NFVF9MSUdIVFNfT046CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja3Muc2V0TGlnaHRzT24obXNnLmFyZzEgIT0gMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9FeHBhbmRlZFZpZXcuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvRXhwYW5kZWRWaWV3LmphdmEKaW5kZXggM2Q4NWYyNy4uYTJkNGI5NSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9FeHBhbmRlZFZpZXcuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0V4cGFuZGVkVmlldy5qYXZhCkBAIC0yNyw3ICsyNyw3IEBACiAKIAogcHVibGljIGNsYXNzIEV4cGFuZGVkVmlldyBleHRlbmRzIExpbmVhckxheW91dCB7Ci0gICAgU3RhdHVzQmFyU2VydmljZSBtU2VydmljZTsKKyAgICBQaG9uZVN0YXR1c0JhclNlcnZpY2UgbVNlcnZpY2U7CiAgICAgaW50IG1QcmV2SGVpZ2h0ID0gLTE7CiAKICAgICBwdWJsaWMgRXhwYW5kZWRWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CkBAIC01Myw3ICs1Myw3IEBACiAgICAgICAgICAgICAgLy9TbG9nLmQoU3RhdHVzQmFyU2VydmljZS5UQUcsICJoZWlnaHQgY2hhbmdlZCBvbGQ9IiArIG1QcmV2SGVpZ2h0CiAgICAgICAgICAgICAgLy8gICAgICsgIiBuZXc9IiArIGhlaWdodCk7CiAgICAgICAgICAgICAgbVByZXZIZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgICAgICAgbVNlcnZpY2UudXBkYXRlRXhwYW5kZWRWaWV3UG9zKFN0YXR1c0JhclNlcnZpY2UuRVhQQU5ERURfTEVBVkVfQUxPTkUpOworICAgICAgICAgICAgIG1TZXJ2aWNlLnVwZGF0ZUV4cGFuZGVkVmlld1BvcyhQaG9uZVN0YXR1c0JhclNlcnZpY2UuRVhQQU5ERURfTEVBVkVfQUxPTkUpOwogICAgICAgICAgfQogICAgICB9CiB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0tleUJ1dHRvblZpZXcuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvS2V5QnV0dG9uVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMWM1ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0tleUJ1dHRvblZpZXcuamF2YQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0aW9uRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSGFwdGljRmVlZGJhY2tDb25zdGFudHM7CitpbXBvcnQgYW5kcm9pZC52aWV3LklXaW5kb3dNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5JbnB1dERldmljZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MuUmVtb3RlVmlldzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7CisKK3B1YmxpYyBjbGFzcyBLZXlCdXR0b25WaWV3IGV4dGVuZHMgSW1hZ2VWaWV3IHsKKyAgICBJV2luZG93TWFuYWdlciBtV2luZG93TWFuYWdlcjsKKyAgICBsb25nIG1Eb3duVGltZTsKKyAgICBib29sZWFuIG1TZW5kaW5nLCBtTG9uZ1ByZXNzZWQ7CisgICAgaW50IG1Db2RlOworICAgIGludCBtUmVwZWF0OworICAgIFJ1bm5hYmxlIG1DaGVja0xvbmdQcmVzcyA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgU2xvZy5kKCJLZXlCdXR0b25WaWV3IiwgImxvbmdwcmVzcyIpOworICAgICAgICAgICAgaWYgKGlzUHJlc3NlZCgpKSB7CisgICAgICAgICAgICAgICAgbUxvbmdQcmVzc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtUmVwZWF0Kys7CisgICAgICAgICAgICAgICAgc2VuZEV2ZW50KEtleUV2ZW50LkFDVElPTl9ET1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuRkxBR19GUk9NX1NZU1RFTQorICAgICAgICAgICAgICAgICAgICAgICAgfCBLZXlFdmVudC5GTEFHX1ZJUlRVQUxfSEFSRF9LRVkKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgS2V5RXZlbnQuRkxBR19MT05HX1BSRVNTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgS2V5QnV0dG9uVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgS2V5QnV0dG9uVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKworICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsIFIuc3R5bGVhYmxlLktleUJ1dHRvblZpZXcsCisgICAgICAgICAgICAgICAgZGVmU3R5bGUsIDApOworCisgICAgICAgIG1Db2RlID0gYS5nZXRJbnRlZ2VyKFIuc3R5bGVhYmxlLktleUJ1dHRvblZpZXdfa2V5Q29kZSwgMCk7CisgICAgICAgIGlmIChtQ29kZSA9PSAwKSB7CisgICAgICAgICAgICBTbG9nLncoU3RhdHVzQmFyU2VydmljZS5UQUcsICJLZXlCdXR0b25WaWV3IHdpdGhvdXQga2V5IGNvZGUgaWQ9MHgiCisgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhnZXRJZCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgIG1XaW5kb3dNYW5hZ2VyID0gSVdpbmRvd01hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZSgKKyAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBpbnQgeCwgeTsKKworICAgICAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjoKKyAgICAgICAgICAgICAgICAvL1Nsb2cuZCgiS2V5QnV0dG9uVmlldyIsICJwcmVzcyIpOworICAgICAgICAgICAgICAgIG1Eb3duVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIG1SZXBlYXQgPSAwOworICAgICAgICAgICAgICAgIG1TZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtTG9uZ1ByZXNzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzZW5kRXZlbnQoS2V5RXZlbnQuQUNUSU9OX0RPV04sCisgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNIHwgS2V5RXZlbnQuRkxBR19WSVJUVUFMX0hBUkRfS0VZLCBtRG93blRpbWUpOworICAgICAgICAgICAgICAgIHNldFByZXNzZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgcmVtb3ZlQ2FsbGJhY2tzKG1DaGVja0xvbmdQcmVzcyk7CisgICAgICAgICAgICAgICAgcG9zdERlbGF5ZWQobUNoZWNrTG9uZ1ByZXNzLCBWaWV3Q29uZmlndXJhdGlvbi5nZXRMb25nUHJlc3NUaW1lb3V0KCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRToKKyAgICAgICAgICAgICAgICBpZiAobVNlbmRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IChpbnQpZXYuZ2V0WCgpOworICAgICAgICAgICAgICAgICAgICB5ID0gKGludClldi5nZXRZKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh4IDwgMCB8fCB4ID49IGdldFdpZHRoKCkgfHwgeSA8IDAgfHwgeSA+PSBnZXRIZWlnaHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVNlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRFdmVudChLZXlFdmVudC5BQ1RJT05fVVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LkZMQUdfRlJPTV9TWVNURU0gfCBLZXlFdmVudC5GTEFHX1ZJUlRVQUxfSEFSRF9LRVkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEtleUV2ZW50LkZMQUdfQ0FOQ0VMRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJlc3NlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDYWxsYmFja3MobUNoZWNrTG9uZ1ByZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOgorICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOgorICAgICAgICAgICAgICAgIHNldFByZXNzZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChtU2VuZGluZyAmJiAhbUxvbmdQcmVzc2VkKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHNlbmRFdmVudChLZXlFdmVudC5BQ1RJT05fVVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuRkxBR19GUk9NX1NZU1RFTSB8IEtleUV2ZW50LkZMQUdfVklSVFVBTF9IQVJEX0tFWSk7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtQ2hlY2tMb25nUHJlc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZvaWQgc2VuZEV2ZW50KGludCBhY3Rpb24sIGludCBmbGFncykgeworICAgICAgICBzZW5kRXZlbnQoYWN0aW9uLCBmbGFncywgU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkpOworICAgIH0KKworICAgIHZvaWQgc2VuZEV2ZW50KGludCBhY3Rpb24sIGludCBmbGFncywgbG9uZyB3aGVuKSB7CisgICAgICAgIGZpbmFsIEtleUV2ZW50IGV2ID0gbmV3IEtleUV2ZW50KG1Eb3duVGltZSwgd2hlbiwgYWN0aW9uLCBtQ29kZSwgbVJlcGVhdCwKKyAgICAgICAgICAgICAgICAwLCAwLCAwLCBmbGFncywgSW5wdXREZXZpY2UuU09VUkNFX0tFWUJPQVJEKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vU2xvZy5kKFN0YXR1c0JhclNlcnZpY2UuVEFHLCAiaW5qZWN0aW5nIGV2ZW50ICIgKyBldik7CisgICAgICAgICAgICBtV2luZG93TWFuYWdlci5pbmplY3RJbnB1dEV2ZW50Tm9XYWl0KGV2KTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBTeXN0ZW0gcHJvY2VzcyBpcyBkZWFkCisgICAgICAgIH0KKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Ob3RpZmljYXRpb25EYXRhLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL05vdGlmaWNhdGlvbkRhdGEuamF2YQppbmRleCA3YTgyMjY3Li43ZThhNWMxIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL05vdGlmaWNhdGlvbkRhdGEuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL05vdGlmaWNhdGlvbkRhdGEuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLlN0YXR1c0Jhck5vdGlmaWNhdGlvbjsKIAoraW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKIC8qKgpAQCAtMzUsMjYgKzM2LDQ3IEBACiAgICAgICAgIHB1YmxpYyBWaWV3IHJvdzsgLy8gdGhlIG91dGVyIGV4cGFuZGVkIHZpZXcKICAgICAgICAgcHVibGljIFZpZXcgY29udGVudDsgLy8gdGFrZXMgdGhlIGNsaWNrIGV2ZW50cyBhbmQgc2VuZHMgdGhlIFBlbmRpbmdJbnRlbnQKICAgICAgICAgcHVibGljIFZpZXcgZXhwYW5kZWQ7IC8vIHRoZSBpbmZsYXRlZCBSZW1vdGVWaWV3cworICAgICAgICBwdWJsaWMgRW50cnkoKSB7fQorICAgICAgICBwdWJsaWMgRW50cnkoSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuLCBTdGF0dXNCYXJJY29uVmlldyBpYykgeworICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbiA9IG47CisgICAgICAgICAgICB0aGlzLmljb24gPSBpYzsKKyAgICAgICAgfQogICAgIH0KICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxFbnRyeT4gbUVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PEVudHJ5PigpOworICAgIHByaXZhdGUgZmluYWwgQ29tcGFyYXRvcjxFbnRyeT4gbUVudHJ5Q21wID0gbmV3IENvbXBhcmF0b3I8RW50cnk+KCkgeworICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoRW50cnkgYSwgRW50cnkgYikgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpKGEubm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuIC0gYi5ub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4pOworICAgICAgICB9CisgICAgfTsKIAogICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKICAgICAgICAgcmV0dXJuIG1FbnRyaWVzLnNpemUoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgRW50cnkgZ2V0RW50cnlBdChpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIG1FbnRyaWVzLmdldChpbmRleCk7CisgICAgcHVibGljIEVudHJ5IGdldChpbnQgaSkgeworICAgICAgICByZXR1cm4gbUVudHJpZXMuZ2V0KGkpOwogICAgIH0KIAotICAgIHB1YmxpYyBpbnQgZmluZEVudHJ5KElCaW5kZXIga2V5KSB7Ci0gICAgICAgIGZpbmFsIGludCBOID0gbUVudHJpZXMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICBFbnRyeSBlbnRyeSA9IG1FbnRyaWVzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChlbnRyeS5rZXkgPT0ga2V5KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgcHVibGljIEVudHJ5IGZpbmRCeUtleShJQmluZGVyIGtleSkgeworICAgICAgICBmb3IgKEVudHJ5IGUgOiBtRW50cmllcykgeworICAgICAgICAgICAgaWYgKGUua2V5ID09IGtleSkgeworICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGludCBhZGQoRW50cnkgZW50cnkpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBOID0gbUVudHJpZXMuc2l6ZSgpOworICAgICAgICBmb3IgKGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtRW50cnlDbXAuY29tcGFyZShtRW50cmllcy5nZXQoaSksIGVudHJ5KSA+IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRW50cmllcy5hZGQoaSwgZW50cnkpOworICAgICAgICByZXR1cm4gaTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGFkZChJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwgVmlldyByb3csIFZpZXcgY29udGVudCwKQEAgLTY2LDQyICs4OCwyMyBAQAogICAgICAgICBlbnRyeS5jb250ZW50ID0gY29udGVudDsKICAgICAgICAgZW50cnkuZXhwYW5kZWQgPSBleHBhbmRlZDsKICAgICAgICAgZW50cnkuaWNvbiA9IGljb247Ci0gICAgICAgIGZpbmFsIGludCBpbmRleCA9IGNob29zZUluZGV4KG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbik7Ci0gICAgICAgIG1FbnRyaWVzLmFkZChpbmRleCwgZW50cnkpOwotICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgIHJldHVybiBhZGQoZW50cnkpOwogICAgIH0KIAogICAgIHB1YmxpYyBFbnRyeSByZW1vdmUoSUJpbmRlciBrZXkpIHsKLSAgICAgICAgZmluYWwgaW50IE4gPSBtRW50cmllcy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gbUVudHJpZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGVudHJ5LmtleSA9PSBrZXkpIHsKLSAgICAgICAgICAgICAgICBtRW50cmllcy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgICAgICAgICAgfQorICAgICAgICBFbnRyeSBlID0gZmluZEJ5S2V5KGtleSk7CisgICAgICAgIGlmIChlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1FbnRyaWVzLnJlbW92ZShlKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBjaG9vc2VJbmRleChmaW5hbCBsb25nIHdoZW4pIHsKLSAgICAgICAgZmluYWwgaW50IE4gPSBtRW50cmllcy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gbUVudHJpZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGVudHJ5Lm5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbiA+IHdoZW4pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTjsKKyAgICAgICAgcmV0dXJuIGU7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSB2aXNpYmxlIGl0ZW1zIChpLmUuIGl0ZW1zIHdpdGhvdXQgYW4gZXJyb3IpLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc1Zpc2libGVJdGVtcygpIHsKLSAgICAgICAgZmluYWwgaW50IE4gPSBtRW50cmllcy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gbUVudHJpZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGVudHJ5LmV4cGFuZGVkICE9IG51bGwpIHsgLy8gdGhlIHZpZXcgc3VjY2Vzc2Z1bGx5IGluZmxhdGVkCisgICAgICAgIGZvciAoRW50cnkgZSA6IG1FbnRyaWVzKSB7CisgICAgICAgICAgICBpZiAoZS5leHBhbmRlZCAhPSBudWxsKSB7IC8vIHRoZSB2aWV3IHN1Y2Nlc3NmdWxseSBpbmZsYXRlZAogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMTIsMTEgKzExNSw5IEBACiAgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBjbGVhcmFibGUgaXRlbXMgKHRoYXQgYXJlbid0IGVycm9ycykuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2xlYXJhYmxlSXRlbXMoKSB7Ci0gICAgICAgIGZpbmFsIGludCBOID0gbUVudHJpZXMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICBFbnRyeSBlbnRyeSA9IG1FbnRyaWVzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChlbnRyeS5leHBhbmRlZCAhPSBudWxsKSB7IC8vIHRoZSB2aWV3IHN1Y2Nlc3NmdWxseSBpbmZsYXRlZAotICAgICAgICAgICAgICAgIGlmICgoZW50cnkubm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5mbGFncyAmIE5vdGlmaWNhdGlvbi5GTEFHX05PX0NMRUFSKSA9PSAwKSB7CisgICAgICAgIGZvciAoRW50cnkgZSA6IG1FbnRyaWVzKSB7CisgICAgICAgICAgICBpZiAoZS5leHBhbmRlZCAhPSBudWxsKSB7IC8vIHRoZSB2aWV3IHN1Y2Nlc3NmdWxseSBpbmZsYXRlZAorICAgICAgICAgICAgICAgIGlmIChlLm5vdGlmaWNhdGlvbi5pc0NsZWFyYWJsZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvUGhvbmVTdGF0dXNCYXJTZXJ2aWNlLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1Bob25lU3RhdHVzQmFyU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZWJkMjcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1Bob25lU3RhdHVzQmFyU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTU1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJOYXRpdmU7CitpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5hcHAuU3RhdHVzQmFyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmVsb2NpdHlUcmFja2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlckltcGw7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNjcm9sbFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLklTdGF0dXNCYXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLklTdGF0dXNCYXJTZXJ2aWNlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJJY29uOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJJY29uTGlzdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFyTm90aWZpY2F0aW9uOworCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucG9saWN5LlN0YXR1c0JhclBvbGljeTsKKworCisKK3B1YmxpYyBjbGFzcyBQaG9uZVN0YXR1c0JhclNlcnZpY2UgZXh0ZW5kcyBTdGF0dXNCYXJTZXJ2aWNlIHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJQaG9uZVN0YXR1c0JhclNlcnZpY2UiOworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIFNQRVcgPSBmYWxzZTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVEFUVVNCQVJfU1RBUlQKKyAgICAgICAgICAgID0gImNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5zdGF0dXNiYXIuU1RBUlQiOworCisgICAgc3RhdGljIGZpbmFsIGludCBFWFBBTkRFRF9MRUFWRV9BTE9ORSA9IC0xMDAwMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IEVYUEFOREVEX0ZVTExfT1BFTiA9IC0xMDAwMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQU5JTUFURSA9IDEwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19BTklNQVRFX1JFVkVBTCA9IDEwMDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TSE9XX0lOVFJVREVSID0gMTAwMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0hJREVfSU5UUlVERVIgPSAxMDAzOworCisgICAgLy8gd2lsbCBsaWtlbHkgbW92ZSB0byBhIHJlc291cmNlIG9yIG90aGVyIHR1bmFibGUgcGFyYW0gYXQgc29tZSBwb2ludAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlRSVURFUl9BTEVSVF9ERUNBWV9NUyA9IDEwMDAwOworCisgICAgU3RhdHVzQmFyUG9saWN5IG1JY29uUG9saWN5OworCisgICAgaW50IG1JY29uU2l6ZTsKKyAgICBEaXNwbGF5IG1EaXNwbGF5OworCisgICAgU3RhdHVzQmFyVmlldyBtU3RhdHVzQmFyVmlldzsKKyAgICBpbnQgbVBpeGVsRm9ybWF0OworICAgIEggbUhhbmRsZXIgPSBuZXcgSCgpOworICAgIE9iamVjdCBtUXVldWVMb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgLy8gaWNvbnMKKyAgICBMaW5lYXJMYXlvdXQgbUljb25zOworICAgIEljb25NZXJnZXIgbU5vdGlmaWNhdGlvbkljb25zOworICAgIExpbmVhckxheW91dCBtU3RhdHVzSWNvbnM7CisKKyAgICAvLyBleHBhbmRlZCBub3RpZmljYXRpb25zCisgICAgRGlhbG9nIG1FeHBhbmRlZERpYWxvZzsKKyAgICBFeHBhbmRlZFZpZXcgbUV4cGFuZGVkVmlldzsKKyAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBtRXhwYW5kZWRQYXJhbXM7CisgICAgU2Nyb2xsVmlldyBtU2Nyb2xsVmlldzsKKyAgICBWaWV3IG1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQ7CisgICAgVmlldyBtRXhwYW5kZWRDb250ZW50czsKKyAgICAvLyB0b3AgYmFyCisgICAgVGV4dFZpZXcgbU5vTm90aWZpY2F0aW9uc1RpdGxlOworICAgIFRleHRWaWV3IG1DbGVhckJ1dHRvbjsKKyAgICAvLyBkcmFnIGJhcgorICAgIENsb3NlRHJhZ0hhbmRsZSBtQ2xvc2VWaWV3OworICAgIC8vIG9uZ29pbmcKKyAgICBOb3RpZmljYXRpb25EYXRhIG1PbmdvaW5nID0gbmV3IE5vdGlmaWNhdGlvbkRhdGEoKTsKKyAgICBUZXh0VmlldyBtT25nb2luZ1RpdGxlOworICAgIExpbmVhckxheW91dCBtT25nb2luZ0l0ZW1zOworICAgIC8vIGxhdGVzdAorICAgIE5vdGlmaWNhdGlvbkRhdGEgbUxhdGVzdCA9IG5ldyBOb3RpZmljYXRpb25EYXRhKCk7CisgICAgVGV4dFZpZXcgbUxhdGVzdFRpdGxlOworICAgIExpbmVhckxheW91dCBtTGF0ZXN0SXRlbXM7CisgICAgLy8gcG9zaXRpb24KKyAgICBpbnRbXSBtUG9zaXRpb25UbXAgPSBuZXcgaW50WzJdOworICAgIGJvb2xlYW4gbUV4cGFuZGVkOworICAgIGJvb2xlYW4gbUV4cGFuZGVkVmlzaWJsZTsKKworICAgIC8vIHRoZSBkYXRlIHZpZXcKKyAgICBEYXRlVmlldyBtRGF0ZVZpZXc7CisKKyAgICAvLyBmb3IgaW1tZXJzaXZlIGFjdGl2aXRpZXMKKyAgICBwcml2YXRlIFZpZXcgbUludHJ1ZGVyQWxlcnRWaWV3OworCisgICAgLy8gdGhlIHRyYWNrZXIgdmlldworICAgIFRyYWNraW5nVmlldyBtVHJhY2tpbmdWaWV3OworICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIG1UcmFja2luZ1BhcmFtczsKKyAgICBpbnQgbVRyYWNraW5nUG9zaXRpb247IC8vIHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9wIG9mIHRoZSB0cmFja2luZyB2aWV3LgorICAgIHByaXZhdGUgYm9vbGVhbiBtUGFuZWxTbGlnaHRseVZpc2libGU7CisKKyAgICAvLyB0aWNrZXIKKyAgICBwcml2YXRlIFRpY2tlciBtVGlja2VyOworICAgIHByaXZhdGUgVmlldyBtVGlja2VyVmlldzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVRpY2tpbmc7CisKKyAgICAvLyBUcmFja2luZyBmaW5nZXIgZm9yIG9wZW5pbmcvY2xvc2luZy4KKyAgICBpbnQgbUVkZ2VCb3JkZXI7IC8vIGNvcnJlc3BvbmRzIHRvIFIuZGltZW4uc3RhdHVzX2Jhcl9lZGdlX2lnbm9yZQorICAgIGJvb2xlYW4gbVRyYWNraW5nOworICAgIFZlbG9jaXR5VHJhY2tlciBtVmVsb2NpdHlUcmFja2VyOworCisgICAgc3RhdGljIGZpbmFsIGludCBBTklNX0ZSQU1FX0RVUkFUSU9OID0gKDEwMDAvNjApOworCisgICAgYm9vbGVhbiBtQW5pbWF0aW5nOworICAgIGxvbmcgbUN1ckFuaW1hdGlvblRpbWU7CisgICAgZmxvYXQgbURpc3BsYXlIZWlnaHQ7CisgICAgZmxvYXQgbUFuaW1ZOworICAgIGZsb2F0IG1BbmltVmVsOworICAgIGZsb2F0IG1BbmltQWNjZWw7CisgICAgbG9uZyBtQW5pbUxhc3RUaW1lOworICAgIGJvb2xlYW4gbUFuaW1hdGluZ1JldmVhbCA9IGZhbHNlOworICAgIGludCBtVmlld0RlbHRhOworICAgIGludFtdIG1BYnNQb3MgPSBuZXcgaW50WzJdOworCisgICAgLy8gZm9yIGRpc2FibGluZyB0aGUgc3RhdHVzIGJhcgorICAgIGludCBtRGlzYWJsZWQgPSAwOworCisgICAgcHJpdmF0ZSBjbGFzcyBFeHBhbmRlZERpYWxvZyBleHRlbmRzIERpYWxvZyB7CisgICAgICAgIEV4cGFuZGVkRGlhbG9nKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9MaWdodF9Ob1RpdGxlQmFyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaEtleUV2ZW50KEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBib29sZWFuIGRvd24gPSBldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTjsKKyAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0S2V5Q29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfQkFDSzoKKyAgICAgICAgICAgICAgICBpZiAoIWRvd24pIHsKKyAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoS2V5RXZlbnQoZXZlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CisgICAgICAgIG1EaXNwbGF5ID0gKChXaW5kb3dNYW5hZ2VyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSkpLmdldERlZmF1bHREaXNwbGF5KCk7CisKKyAgICAgICAgc3VwZXIub25DcmVhdGUoKTsKKworICAgICAgICBhZGRJbnRydWRlclZpZXcoKTsKKworICAgICAgICAvLyBMYXN0bHksIGNhbGwgdG8gdGhlIGljb24gcG9saWN5IHRvIGluc3RhbGwvdXBkYXRlIGFsbCB0aGUgaWNvbnMuCisgICAgICAgIG1JY29uUG9saWN5ID0gbmV3IFN0YXR1c0JhclBvbGljeSh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIC8vIHdlJ3JlIG5ldmVyIGRlc3Ryb3llZAorICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gQ29uc3RydWN0aW5nIHRoZSB2aWV3CisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBwcm90ZWN0ZWQgVmlldyBtYWtlU3RhdHVzQmFyVmlldygpIHsKKyAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gdGhpczsKKworICAgICAgICBSZXNvdXJjZXMgcmVzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKworICAgICAgICBtSWNvblNpemUgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3RhdHVzX2Jhcl9pY29uX3NpemUpOworCisgICAgICAgIEV4cGFuZGVkVmlldyBleHBhbmRlZCA9IChFeHBhbmRlZFZpZXcpVmlldy5pbmZsYXRlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgUi5sYXlvdXQuc3RhdHVzX2Jhcl9leHBhbmRlZCwgbnVsbCk7CisgICAgICAgIGV4cGFuZGVkLm1TZXJ2aWNlID0gdGhpczsKKworICAgICAgICBtSW50cnVkZXJBbGVydFZpZXcgPSBWaWV3LmluZmxhdGUoY29udGV4dCwgUi5sYXlvdXQuaW50cnVkZXJfYWxlcnQsIG51bGwpOworICAgICAgICBtSW50cnVkZXJBbGVydFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICBtSW50cnVkZXJBbGVydFZpZXcuc2V0Q2xpY2thYmxlKHRydWUpOworCisgICAgICAgIFN0YXR1c0JhclZpZXcgc2IgPSAoU3RhdHVzQmFyVmlldylWaWV3LmluZmxhdGUoY29udGV4dCwgUi5sYXlvdXQuc3RhdHVzX2JhciwgbnVsbCk7CisgICAgICAgIHNiLm1TZXJ2aWNlID0gdGhpczsKKworICAgICAgICAvLyBmaWd1cmUgb3V0IHdoaWNoIHBpeGVsLWZvcm1hdCB0byB1c2UgZm9yIHRoZSBzdGF0dXMgYmFyLgorICAgICAgICBtUGl4ZWxGb3JtYXQgPSBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVDsKKyAgICAgICAgRHJhd2FibGUgYmcgPSBzYi5nZXRCYWNrZ3JvdW5kKCk7CisgICAgICAgIGlmIChiZyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUGl4ZWxGb3JtYXQgPSBiZy5nZXRPcGFjaXR5KCk7CisgICAgICAgIH0KKworICAgICAgICBtU3RhdHVzQmFyVmlldyA9IHNiOworICAgICAgICBtU3RhdHVzSWNvbnMgPSAoTGluZWFyTGF5b3V0KXNiLmZpbmRWaWV3QnlJZChSLmlkLnN0YXR1c0ljb25zKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zID0gKEljb25NZXJnZXIpc2IuZmluZFZpZXdCeUlkKFIuaWQubm90aWZpY2F0aW9uSWNvbnMpOworICAgICAgICBtSWNvbnMgPSAoTGluZWFyTGF5b3V0KXNiLmZpbmRWaWV3QnlJZChSLmlkLmljb25zKTsKKyAgICAgICAgbVRpY2tlclZpZXcgPSBzYi5maW5kVmlld0J5SWQoUi5pZC50aWNrZXIpOworICAgICAgICBtRGF0ZVZpZXcgPSAoRGF0ZVZpZXcpc2IuZmluZFZpZXdCeUlkKFIuaWQuZGF0ZSk7CisKKyAgICAgICAgbUV4cGFuZGVkRGlhbG9nID0gbmV3IEV4cGFuZGVkRGlhbG9nKGNvbnRleHQpOworICAgICAgICBtRXhwYW5kZWRWaWV3ID0gZXhwYW5kZWQ7CisgICAgICAgIG1FeHBhbmRlZENvbnRlbnRzID0gZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubm90aWZpY2F0aW9uTGluZWFyTGF5b3V0KTsKKyAgICAgICAgbU9uZ29pbmdUaXRsZSA9IChUZXh0VmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5vbmdvaW5nVGl0bGUpOworICAgICAgICBtT25nb2luZ0l0ZW1zID0gKExpbmVhckxheW91dClleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5vbmdvaW5nSXRlbXMpOworICAgICAgICBtTGF0ZXN0VGl0bGUgPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubGF0ZXN0VGl0bGUpOworICAgICAgICBtTGF0ZXN0SXRlbXMgPSAoTGluZWFyTGF5b3V0KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLmxhdGVzdEl0ZW1zKTsKKyAgICAgICAgbU5vTm90aWZpY2F0aW9uc1RpdGxlID0gKFRleHRWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm5vTm90aWZpY2F0aW9uc1RpdGxlKTsKKyAgICAgICAgbUNsZWFyQnV0dG9uID0gKFRleHRWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLmNsZWFyX2FsbF9idXR0b24pOworICAgICAgICBtQ2xlYXJCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1DbGVhckJ1dHRvbkxpc3RlbmVyKTsKKyAgICAgICAgbVNjcm9sbFZpZXcgPSAoU2Nyb2xsVmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5zY3JvbGwpOworICAgICAgICBtTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0ID0gZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubm90aWZpY2F0aW9uTGluZWFyTGF5b3V0KTsKKworICAgICAgICBtT25nb2luZ1RpdGxlLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgbUxhdGVzdFRpdGxlLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKworICAgICAgICBtVGlja2VyID0gbmV3IE15VGlja2VyKGNvbnRleHQsIHNiKTsKKworICAgICAgICBUaWNrZXJWaWV3IHRpY2tlclZpZXcgPSAoVGlja2VyVmlldylzYi5maW5kVmlld0J5SWQoUi5pZC50aWNrZXJUZXh0KTsKKyAgICAgICAgdGlja2VyVmlldy5tVGlja2VyID0gbVRpY2tlcjsKKworICAgICAgICBtVHJhY2tpbmdWaWV3ID0gKFRyYWNraW5nVmlldylWaWV3LmluZmxhdGUoY29udGV4dCwgUi5sYXlvdXQuc3RhdHVzX2Jhcl90cmFja2luZywgbnVsbCk7CisgICAgICAgIG1UcmFja2luZ1ZpZXcubVNlcnZpY2UgPSB0aGlzOworICAgICAgICBtQ2xvc2VWaWV3ID0gKENsb3NlRHJhZ0hhbmRsZSltVHJhY2tpbmdWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmNsb3NlKTsKKyAgICAgICAgbUNsb3NlVmlldy5tU2VydmljZSA9IHRoaXM7CisKKyAgICAgICAgbUVkZ2VCb3JkZXIgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4uc3RhdHVzX2Jhcl9lZGdlX2lnbm9yZSk7CisKKyAgICAgICAgLy8gc2V0IHRoZSBpbml0YWwgdmlldyB2aXNpYmlsaXR5CisgICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOworICAgICAgICBtRGF0ZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisKKyAgICAgICAgLy8gcmVjZWl2ZSBicm9hZGNhc3RzCisgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9DT05GSUdVUkFUSU9OX0NIQU5HRUQpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fQ0xPU0VfU1lTVEVNX0RJQUxPR1MpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fU0NSRUVOX09GRik7CisgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtQnJvYWRjYXN0UmVjZWl2ZXIsIGZpbHRlcik7CisKKyAgICAgICAgcmV0dXJuIHNiOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgZ2V0U3RhdHVzQmFyR3Jhdml0eSgpIHsKKyAgICAgICAgcmV0dXJuIEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZEludHJ1ZGVyVmlldygpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0PSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3RhdHVzX2Jhcl9oZWlnaHQpOworCisgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1RBVFVTX0JBUl9QQU5FTCwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU4KKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9OT19MSU1JVFMKKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9UT1VDSF9NT0RBTAorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRQorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTSwKKyAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVCk7CisgICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LlRPUCB8IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMOworICAgICAgICBscC55ICs9IGhlaWdodCAqIDEuNTsgLy8gRklYTUUKKyAgICAgICAgbHAuc2V0VGl0bGUoIkludHJ1ZGVyQWxlcnQiKTsKKyAgICAgICAgbHAud2luZG93QW5pbWF0aW9ucyA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuQW5pbWF0aW9uX1N0YXR1c0Jhcl9JbnRydWRlckFsZXJ0OworCisgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5hZGRWaWV3KG1JbnRydWRlckFsZXJ0VmlldywgbHApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwgU3RhdHVzQmFySWNvbiBpY29uKSB7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiYWRkSWNvbiBzbG90PSIgKyBzbG90ICsgIiBpbmRleD0iICsgaW5kZXggKyAiIHZpZXdJbmRleD0iICsgdmlld0luZGV4CisgICAgICAgICAgICAgICAgKyAiIGljb249IiArIGljb24pOworICAgICAgICBTdGF0dXNCYXJJY29uVmlldyB2aWV3ID0gbmV3IFN0YXR1c0Jhckljb25WaWV3KHRoaXMsIHNsb3QpOworICAgICAgICB2aWV3LnNldChpY29uKTsKKyAgICAgICAgbVN0YXR1c0ljb25zLmFkZFZpZXcodmlldywgdmlld0luZGV4LCBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyhtSWNvblNpemUsIG1JY29uU2l6ZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwKKyAgICAgICAgICAgIFN0YXR1c0Jhckljb24gb2xkLCBTdGF0dXNCYXJJY29uIGljb24pIHsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJ1cGRhdGVJY29uIHNsb3Q9IiArIHNsb3QgKyAiIGluZGV4PSIgKyBpbmRleCArICIgdmlld0luZGV4PSIgKyB2aWV3SW5kZXgKKyAgICAgICAgICAgICAgICArICIgb2xkPSIgKyBvbGQgKyAiIGljb249IiArIGljb24pOworICAgICAgICBTdGF0dXNCYXJJY29uVmlldyB2aWV3ID0gKFN0YXR1c0Jhckljb25WaWV3KW1TdGF0dXNJY29ucy5nZXRDaGlsZEF0KHZpZXdJbmRleCk7CisgICAgICAgIHZpZXcuc2V0KGljb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCkgeworICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInJlbW92ZUljb24gc2xvdD0iICsgc2xvdCArICIgaW5kZXg9IiArIGluZGV4ICsgIiB2aWV3SW5kZXg9IiArIHZpZXdJbmRleCk7CisgICAgICAgIG1TdGF0dXNJY29ucy5yZW1vdmVWaWV3QXQodmlld0luZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGROb3RpZmljYXRpb24oSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKyAgICAgICAgU3RhdHVzQmFySWNvblZpZXcgaWNvblZpZXcgPSBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7CisgICAgICAgIGlmIChpY29uVmlldyA9PSBudWxsKSByZXR1cm47CisKKyAgICAgICAgYm9vbGVhbiBpbW1lcnNpdmUgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGltbWVyc2l2ZSA9IEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkuaXNUb3BBY3Rpdml0eUltbWVyc2l2ZSgpOworICAgICAgICAgICAgU2xvZy5kKFRBRywgIlRvcCBhY3Rpdml0eSBpcyAiICsgKGltbWVyc2l2ZT8iaW1tZXJzaXZlIjoibm90IGltbWVyc2l2ZSIpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGltbWVyc2l2ZSkgeworICAgICAgICAgICAgaWYgKChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmZsYWdzICYgTm90aWZpY2F0aW9uLkZMQUdfSElHSF9QUklPUklUWSkgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJQcmVzZW50aW5nIGhpZ2gtcHJpb3JpdHkgbm90aWZpY2F0aW9uIGluIGltbWVyc2l2ZSBhY3Rpdml0eSIpOworICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgbmV3IHRyYW5zaWVudCB0aWNrZXIgbW9kZQorICAgICAgICAgICAgICAgIC8vIDEuIFBvcHVsYXRlIG1JbnRydWRlckFsZXJ0VmlldworCisgICAgICAgICAgICAgICAgSW1hZ2VWaWV3IGFsZXJ0SWNvbiA9IChJbWFnZVZpZXcpIG1JbnRydWRlckFsZXJ0Vmlldy5maW5kVmlld0J5SWQoUi5pZC5hbGVydEljb24pOworICAgICAgICAgICAgICAgIFRleHRWaWV3IGFsZXJ0VGV4dCA9IChUZXh0VmlldykgbUludHJ1ZGVyQWxlcnRWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmFsZXJ0VGV4dCk7CisgICAgICAgICAgICAgICAgYWxlcnRJY29uLnNldEltYWdlRHJhd2FibGUoU3RhdHVzQmFySWNvblZpZXcuZ2V0SWNvbigKKyAgICAgICAgICAgICAgICAgICAgYWxlcnRJY29uLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgaWNvblZpZXcuZ2V0U3RhdHVzQmFySWNvbigpKSk7CisgICAgICAgICAgICAgICAgYWxlcnRUZXh0LnNldFRleHQobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi50aWNrZXJUZXh0KTsKKworICAgICAgICAgICAgICAgIFZpZXcgYnV0dG9uID0gbUludHJ1ZGVyQWxlcnRWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmludHJ1ZGVyX2FsZXJ0X2NvbnRlbnQpOworICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgIG5ldyBMYXVuY2hlcihub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ucGtnLCBub3RpZmljYXRpb24udGFnLCBub3RpZmljYXRpb24uaWQpKTsKKworICAgICAgICAgICAgICAgIC8vIDIuIEFuaW1hdGUgbUludHJ1ZGVyQWxlcnRWaWV3IGluCisgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfU0hPV19JTlRSVURFUik7CisKKyAgICAgICAgICAgICAgICAvLyAzLiBTZXQgYWxhcm0gdG8gYWdlIHRoZSBub3RpZmljYXRpb24gb2ZmIChUT0RPKQorICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19ISURFX0lOVFJVREVSKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZChNU0dfSElERV9JTlRSVURFUiwgSU5UUlVERVJfQUxFUlRfREVDQVlfTVMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZnVsbFNjcmVlbkludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBub3QgaW1tZXJzaXZlICYgYSBmdWxsLXNjcmVlbiBhbGVydCBzaG91bGQgYmUgc2hvd24KKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJOb3RpZmljYXRpb24gaGFzIGZ1bGxTY3JlZW5JbnRlbnQgYW5kIGFjdGl2aXR5IGlzIG5vdCBpbW1lcnNpdmU7IgorICAgICAgICAgICAgICAgICAgICArICIgc2VuZGluZyBmdWxsU2NyZWVuSW50ZW50Iik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZnVsbFNjcmVlbkludGVudC5zZW5kKCk7CisgICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHVzdWFsIGNhc2U6IHN0YXR1cyBiYXIgdmlzaWJsZSAmIG5vdCBpbW1lcnNpdmUKKworICAgICAgICAgICAgLy8gc2hvdyB0aGUgdGlja2VyCisgICAgICAgICAgICB0aWNrKG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHNsaWRpbmcgd2luZG93cyBhbmQgdGhlIHRpdGxlcy4KKyAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7CisgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9MRUFWRV9BTE9ORSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlTm90aWZpY2F0aW9uKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisgICAgICAgIFNsb2cuZChUQUcsICJ1cGRhdGVOb3RpZmljYXRpb24ga2V5PSIgKyBrZXkgKyAiIG5vdGlmaWNhdGlvbj0iICsgbm90aWZpY2F0aW9uKTsKKworICAgICAgICBOb3RpZmljYXRpb25EYXRhIG9sZExpc3Q7CisgICAgICAgIE5vdGlmaWNhdGlvbkRhdGEuRW50cnkgb2xkRW50cnkgPSBtT25nb2luZy5maW5kQnlLZXkoa2V5KTsKKyAgICAgICAgaWYgKG9sZEVudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG9sZExpc3QgPSBtT25nb2luZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9sZEVudHJ5ID0gbUxhdGVzdC5maW5kQnlLZXkoa2V5KTsKKyAgICAgICAgICAgIGlmIChvbGRFbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInVwZGF0ZU5vdGlmaWNhdGlvbiBmb3IgdW5rbm93biBrZXk6ICIgKyBrZXkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9sZExpc3QgPSBtTGF0ZXN0OworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBvbGROb3RpZmljYXRpb24gPSBvbGRFbnRyeS5ub3RpZmljYXRpb247CisgICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzIG9sZENvbnRlbnRWaWV3ID0gb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50VmlldzsKKworICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBjb250ZW50VmlldyA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudFZpZXc7CisKKyAgICAgICAgaWYgKGZhbHNlKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAib2xkIG5vdGlmaWNhdGlvbjogd2hlbj0iICsgb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCisgICAgICAgICAgICAgICAgICAgICsgIiBvbmdvaW5nPSIgKyBvbGROb3RpZmljYXRpb24uaXNPbmdvaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGV4cGFuZGVkPSIgKyBvbGRFbnRyeS5leHBhbmRlZAorICAgICAgICAgICAgICAgICAgICArICIgY29udGVudFZpZXc9IiArIG9sZENvbnRlbnRWaWV3KTsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJuZXcgbm90aWZpY2F0aW9uOiB3aGVuPSIgKyBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KKyAgICAgICAgICAgICAgICAgICAgKyAiIG9uZ29pbmc9IiArIG9sZE5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKQorICAgICAgICAgICAgICAgICAgICArICIgY29udGVudFZpZXc9IiArIGNvbnRlbnRWaWV3KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhbiB3ZSBqdXN0IHJlYXBwbHkgdGhlIFJlbW90ZVZpZXdzIGluIHBsYWNlPyAgSWYgd2hlbiBkaWRuJ3QgY2hhbmdlLCB0aGUgb3JkZXIKKyAgICAgICAgLy8gZGlkbid0IGNoYW5nZS4KKyAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbiA9PSBvbGROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KKyAgICAgICAgICAgICAgICAmJiBub3RpZmljYXRpb24uaXNPbmdvaW5nKCkgPT0gb2xkTm90aWZpY2F0aW9uLmlzT25nb2luZygpCisgICAgICAgICAgICAgICAgJiYgb2xkRW50cnkuZXhwYW5kZWQgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRWaWV3ICE9IG51bGwgJiYgb2xkQ29udGVudFZpZXcgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcuZ2V0UGFja2FnZSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRQYWNrYWdlKCkuZXF1YWxzKGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSkKKyAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRMYXlvdXRJZCgpID09IGNvbnRlbnRWaWV3LmdldExheW91dElkKCkpIHsKKyAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicmV1c2luZyBub3RpZmljYXRpb24iKTsKKyAgICAgICAgICAgIG9sZEVudHJ5Lm5vdGlmaWNhdGlvbiA9IG5vdGlmaWNhdGlvbjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gUmVhcHBseSB0aGUgUmVtb3RlVmlld3MKKyAgICAgICAgICAgICAgICBjb250ZW50Vmlldy5yZWFwcGx5KHRoaXMsIG9sZEVudHJ5LmNvbnRlbnQpOworICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY29udGVudEludGVudAorICAgICAgICAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgY29udGVudEludGVudCA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudEludGVudDsKKyAgICAgICAgICAgICAgICBpZiAoY29udGVudEludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG9sZEVudHJ5LmNvbnRlbnQuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBMYXVuY2hlcihjb250ZW50SW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ucGtnLCBub3RpZmljYXRpb24udGFnLCBub3RpZmljYXRpb24uaWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBpY29uLgorICAgICAgICAgICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb24gaWMgPSBuZXcgU3RhdHVzQmFySWNvbihub3RpZmljYXRpb24ucGtnLAorICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uLCBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb25MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ubnVtYmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9sZEVudHJ5Lmljb24uc2V0KGljKSkgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkbid0IHVwZGF0ZSBpY29uOiAiICsgaWMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIEl0IGZhaWxlZCB0byBhZGQgY2xlYW5seS4gIExvZywgYW5kIHJlbW92ZSB0aGUgdmlldyBmcm9tIHRoZSBwYW5lbC4KKyAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiQ291bGRuJ3QgcmVhcHBseSB2aWV3cyBmb3IgcGFja2FnZSAiICsgY29udGVudFZpZXcuZ2V0UGFja2FnZSgpLCBlKTsKKyAgICAgICAgICAgICAgICByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOworICAgICAgICAgICAgICAgIGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAibm90IHJldXNpbmcgbm90aWZpY2F0aW9uIik7CisgICAgICAgICAgICByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOworICAgICAgICAgICAgYWRkTm90aWZpY2F0aW9uVmlld3Moa2V5LCBub3RpZmljYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzdGFydCB0aGUgdGlja2VyIGlmIGl0J3Mgc3RpbGwgcnVubmluZworICAgICAgICBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi50aWNrZXJUZXh0ICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiAhVGV4dFV0aWxzLmVxdWFscyhub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLnRpY2tlclRleHQsCisgICAgICAgICAgICAgICAgICAgIG9sZEVudHJ5Lm5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24udGlja2VyVGV4dCkpIHsKKyAgICAgICAgICAgIHRpY2sobm90aWZpY2F0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2xpZGluZyB3aW5kb3dzIGFuZCB0aGUgdGl0bGVzLgorICAgICAgICBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0xFQVZFX0FMT05FKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb3RpZmljYXRpb24oSUJpbmRlciBrZXkpIHsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJyZW1vdmVOb3RpZmljYXRpb24ga2V5PSIgKyBrZXkpOworICAgICAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gb2xkID0gcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKKworICAgICAgICBpZiAob2xkICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIENhbmNlbCB0aGUgdGlja2VyIGlmIGl0J3Mgc3RpbGwgcnVubmluZworICAgICAgICAgICAgbVRpY2tlci5yZW1vdmVFbnRyeShvbGQpOworCisgICAgICAgICAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHNsaWRpbmcgd2luZG93cyBhbmQgdGhlIHRpdGxlcy4KKyAgICAgICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOworICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0xFQVZFX0FMT05FKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGNob29zZUljb25JbmRleChib29sZWFuIGlzT25nb2luZywgaW50IHZpZXdJbmRleCkgeworICAgICAgICBmaW5hbCBpbnQgbGF0ZXN0U2l6ZSA9IG1MYXRlc3Quc2l6ZSgpOworICAgICAgICBpZiAoaXNPbmdvaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gbGF0ZXN0U2l6ZSArIChtT25nb2luZy5zaXplKCkgLSB2aWV3SW5kZXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGxhdGVzdFNpemUgLSB2aWV3SW5kZXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWaWV3W10gbWFrZU5vdGlmaWNhdGlvblZpZXcoU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICBOb3RpZmljYXRpb24gbiA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb247CisgICAgICAgIFJlbW90ZVZpZXdzIHJlbW90ZVZpZXdzID0gbi5jb250ZW50VmlldzsKKyAgICAgICAgaWYgKHJlbW90ZVZpZXdzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIHRoZSByb3cgdmlldworICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgICAgICBWaWV3IHJvdyA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnQsIHBhcmVudCwgZmFsc2UpOworCisgICAgICAgIC8vIGJpbmQgdGhlIGNsaWNrIGV2ZW50IHRvIHRoZSBjb250ZW50IGFyZWEKKyAgICAgICAgVmlld0dyb3VwIGNvbnRlbnQgPSAoVmlld0dyb3VwKXJvdy5maW5kVmlld0J5SWQoUi5pZC5jb250ZW50KTsKKyAgICAgICAgY29udGVudC5zZXREZXNjZW5kYW50Rm9jdXNhYmlsaXR5KFZpZXdHcm91cC5GT0NVU19CTE9DS19ERVNDRU5EQU5UUyk7CisgICAgICAgIGNvbnRlbnQuc2V0T25Gb2N1c0NoYW5nZUxpc3RlbmVyKG1Gb2N1c0NoYW5nZUxpc3RlbmVyKTsKKyAgICAgICAgUGVuZGluZ0ludGVudCBjb250ZW50SW50ZW50ID0gbi5jb250ZW50SW50ZW50OworICAgICAgICBpZiAoY29udGVudEludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250ZW50LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgTGF1bmNoZXIoY29udGVudEludGVudCwgbm90aWZpY2F0aW9uLnBrZywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi50YWcsIG5vdGlmaWNhdGlvbi5pZCkpOworICAgICAgICB9CisKKyAgICAgICAgVmlldyBleHBhbmRlZCA9IG51bGw7CisgICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXhwYW5kZWQgPSByZW1vdGVWaWV3cy5hcHBseSh0aGlzLCBjb250ZW50KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICB9CisgICAgICAgIGlmIChleHBhbmRlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgaWRlbnQgPSBub3RpZmljYXRpb24ucGtnICsgIi8weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG5vdGlmaWNhdGlvbi5pZCk7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiY291bGRuJ3QgaW5mbGF0ZSB2aWV3IGZvciBub3RpZmljYXRpb24gIiArIGlkZW50LCBleGNlcHRpb24pOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZW50LmFkZFZpZXcoZXhwYW5kZWQpOworICAgICAgICAgICAgcm93LnNldERyYXdpbmdDYWNoZUVuYWJsZWQodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFZpZXdbXSB7IHJvdywgY29udGVudCwgZXhwYW5kZWQgfTsKKyAgICB9CisKKyAgICBTdGF0dXNCYXJJY29uVmlldyBhZGROb3RpZmljYXRpb25WaWV3cyhJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworICAgICAgICBOb3RpZmljYXRpb25EYXRhIGxpc3Q7CisgICAgICAgIFZpZXdHcm91cCBwYXJlbnQ7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNPbmdvaW5nID0gbm90aWZpY2F0aW9uLmlzT25nb2luZygpOworICAgICAgICBpZiAoaXNPbmdvaW5nKSB7CisgICAgICAgICAgICBsaXN0ID0gbU9uZ29pbmc7CisgICAgICAgICAgICBwYXJlbnQgPSBtT25nb2luZ0l0ZW1zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGlzdCA9IG1MYXRlc3Q7CisgICAgICAgICAgICBwYXJlbnQgPSBtTGF0ZXN0SXRlbXM7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBleHBhbmRlZCB2aWV3LgorICAgICAgICBmaW5hbCBWaWV3W10gdmlld3MgPSBtYWtlTm90aWZpY2F0aW9uVmlldyhub3RpZmljYXRpb24sIHBhcmVudCk7CisgICAgICAgIGlmICh2aWV3cyA9PSBudWxsKSB7CisgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkbid0IGV4cGFuZCBSZW1vdGVWaWV3cyBmb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBub3RpZmljYXRpb24pOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgVmlldyByb3cgPSB2aWV3c1swXTsKKyAgICAgICAgZmluYWwgVmlldyBjb250ZW50ID0gdmlld3NbMV07CisgICAgICAgIGZpbmFsIFZpZXcgZXhwYW5kZWQgPSB2aWV3c1syXTsKKyAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBpY29uLgorICAgICAgICBmaW5hbCBTdGF0dXNCYXJJY29uVmlldyBpY29uVmlldyA9IG5ldyBTdGF0dXNCYXJJY29uVmlldyh0aGlzLAorICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5wa2cgKyAiLzB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobm90aWZpY2F0aW9uLmlkKSk7CisgICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb24gaWMgPSBuZXcgU3RhdHVzQmFySWNvbihub3RpZmljYXRpb24ucGtnLCBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb24sCisgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbkxldmVsLCBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLm51bWJlcik7CisgICAgICAgIGlmICghaWNvblZpZXcuc2V0KGljKSkgeworICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3Ioa2V5LCBub3RpZmljYXRpb24sICJDb3VsZGluZyBjcmVhdGUgaWNvbjogIiArIGljKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIC8vIEFkZCB0aGUgZXhwYW5kZWQgdmlldy4KKyAgICAgICAgZmluYWwgaW50IHZpZXdJbmRleCA9IGxpc3QuYWRkKGtleSwgbm90aWZpY2F0aW9uLCByb3csIGNvbnRlbnQsIGV4cGFuZGVkLCBpY29uVmlldyk7CisgICAgICAgIHBhcmVudC5hZGRWaWV3KHJvdywgdmlld0luZGV4KTsKKyAgICAgICAgLy8gQWRkIHRoZSBpY29uLgorICAgICAgICBmaW5hbCBpbnQgaWNvbkluZGV4ID0gY2hvb3NlSWNvbkluZGV4KGlzT25nb2luZywgdmlld0luZGV4KTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLmFkZFZpZXcoaWNvblZpZXcsIGljb25JbmRleCk7CisgICAgICAgIHJldHVybiBpY29uVmlldzsKKyAgICB9CisKKyAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gcmVtb3ZlTm90aWZpY2F0aW9uVmlld3MoSUJpbmRlciBrZXkpIHsKKyAgICAgICAgTm90aWZpY2F0aW9uRGF0YS5FbnRyeSBlbnRyeSA9IG1PbmdvaW5nLnJlbW92ZShrZXkpOworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgZW50cnkgPSBtTGF0ZXN0LnJlbW92ZShrZXkpOworICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVtb3ZlTm90aWZpY2F0aW9uIGZvciB1bmtub3duIGtleTogIiArIGtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBleHBhbmRlZCB2aWV3LgorICAgICAgICAoKFZpZXdHcm91cCllbnRyeS5yb3cuZ2V0UGFyZW50KCkpLnJlbW92ZVZpZXcoZW50cnkucm93KTsKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBpY29uLgorICAgICAgICAoKFZpZXdHcm91cCllbnRyeS5pY29uLmdldFBhcmVudCgpKS5yZW1vdmVWaWV3KGVudHJ5Lmljb24pOworCisgICAgICAgIHJldHVybiBlbnRyeS5ub3RpZmljYXRpb247CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpIHsKKyAgICAgICAgYm9vbGVhbiBvbmdvaW5nID0gbU9uZ29pbmcuaGFzVmlzaWJsZUl0ZW1zKCk7CisgICAgICAgIGJvb2xlYW4gbGF0ZXN0ID0gbUxhdGVzdC5oYXNWaXNpYmxlSXRlbXMoKTsKKworICAgICAgICAvLyAobm8gb25nb2luZyBub3RpZmljYXRpb25zIGFyZSBjbGVhcmFibGUpCisgICAgICAgIGlmIChtTGF0ZXN0Lmhhc0NsZWFyYWJsZUl0ZW1zKCkpIHsKKyAgICAgICAgICAgIG1DbGVhckJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ2xlYXJCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgIH0KKworICAgICAgICBtT25nb2luZ1RpdGxlLnNldFZpc2liaWxpdHkob25nb2luZyA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisgICAgICAgIG1MYXRlc3RUaXRsZS5zZXRWaXNpYmlsaXR5KGxhdGVzdCA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisKKyAgICAgICAgaWYgKG9uZ29pbmcgfHwgbGF0ZXN0KSB7CisgICAgICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU5vTm90aWZpY2F0aW9uc1RpdGxlLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RhdGUgaXMgb25lIG9yIG1vcmUgb2YgdGhlIERJU0FCTEUgY29uc3RhbnRzIGZyb20gU3RhdHVzQmFyTWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNhYmxlKGludCBzdGF0ZSkgeworICAgICAgICBmaW5hbCBpbnQgb2xkID0gbURpc2FibGVkOworICAgICAgICBmaW5hbCBpbnQgZGlmZiA9IHN0YXRlIF4gb2xkOworICAgICAgICBtRGlzYWJsZWQgPSBzdGF0ZTsKKworICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX0VYUEFORDogeWVzIik7CisgICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgeworICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IHllcyIpOworICAgICAgICAgICAgICAgIGlmIChtVGlja2luZykgeworICAgICAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogbm8iKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAobVRpY2tpbmcgJiYgKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSOiB5ZXMiKTsKKyAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbCBjaGFuZ2VzIHRvIHRoZSBzdGF0dXMgYmFyIGFuZCBub3RpZmljYXRpb25zIGZ1bm5lbCB0aHJvdWdoIGhlcmUgYW5kIGFyZSBiYXRjaGVkLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgSCBleHRlbmRzIEhhbmRsZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbSkgeworICAgICAgICAgICAgc3dpdGNoIChtLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19BTklNQVRFOgorICAgICAgICAgICAgICAgICAgICBkb0FuaW1hdGlvbigpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19BTklNQVRFX1JFVkVBTDoKKyAgICAgICAgICAgICAgICAgICAgZG9SZXZlYWxBbmltYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfU0hPV19JTlRSVURFUjoKKyAgICAgICAgICAgICAgICAgICAgc2V0SW50cnVkZXJBbGVydFZpc2liaWxpdHkodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0hJREVfSU5UUlVERVI6CisgICAgICAgICAgICAgICAgICAgIHNldEludHJ1ZGVyQWxlcnRWaXNpYmlsaXR5KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWaWV3Lk9uRm9jdXNDaGFuZ2VMaXN0ZW5lciBtRm9jdXNDaGFuZ2VMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uRm9jdXNDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25Gb2N1c0NoYW5nZShWaWV3IHYsIGJvb2xlYW4gaGFzRm9jdXMpIHsKKyAgICAgICAgICAgIC8vIEJlY2F1c2UgJ3YnIGlzIGEgVmlld0dyb3VwLCBhbGwgaXRzIGNoaWxkcmVuIHdpbGwgYmUgKHVuKXNlbGVjdGVkCisgICAgICAgICAgICAvLyB0b28sIHdoaWNoIGFsbG93cyBtYXJxdWVlaW5nIHRvIHdvcmsuCisgICAgICAgICAgICB2LnNldFNlbGVjdGVkKGhhc0ZvY3VzKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIHZvaWQgbWFrZUV4cGFuZGVkVmlzaWJsZSgpIHsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJNYWtlIGV4cGFuZGVkIHZpc2libGU6IGV4cGFuZGVkIHZpc2libGU9IiArIG1FeHBhbmRlZFZpc2libGUpOworICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1FeHBhbmRlZFZpc2libGUgPSB0cnVlOworICAgICAgICB2aXNpYmlsaXR5Q2hhbmdlZCh0cnVlKTsKKworICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfTEVBVkVfQUxPTkUpOworICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgJj0gfldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRTsKKyAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmZsYWdzIHw9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTTsKKyAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKKyAgICAgICAgbUV4cGFuZGVkVmlldy5yZXF1ZXN0Rm9jdXMoVmlldy5GT0NVU19GT1JXQVJEKTsKKyAgICAgICAgbVRyYWNraW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisKKyAgICAgICAgaWYgKCFtVGlja2luZykgeworICAgICAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFuaW1hdGVFeHBhbmQoKSB7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiQW5pbWF0ZSBleHBhbmQ6IGV4cGFuZGVkPSIgKyBtRXhwYW5kZWQpOworICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1FeHBhbmRlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcHJlcGFyZVRyYWNraW5nKDAsIHRydWUpOworICAgICAgICBwZXJmb3JtRmxpbmcoMCwgMjAwMC4wZiwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYW5pbWF0ZUNvbGxhcHNlKCkgeworICAgICAgICBpZiAoU1BFVykgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgImFuaW1hdGVDb2xsYXBzZSgpOiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZAorICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkVmlzaWJsZT0iICsgbUV4cGFuZGVkVmlzaWJsZQorICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltYXRpbmc9IiArIG1BbmltYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltWT0iICsgbUFuaW1ZCisgICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbVZlbD0iICsgbUFuaW1WZWwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQgeTsKKyAgICAgICAgaWYgKG1BbmltYXRpbmcpIHsKKyAgICAgICAgICAgIHkgPSAoaW50KW1BbmltWTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHkgPSBtRGlzcGxheS5nZXRIZWlnaHQoKS0xOworICAgICAgICB9CisgICAgICAgIC8vIExldCB0aGUgZmxpbmcgdGhpbmsgdGhhdCB3ZSdyZSBvcGVuIHNvIGl0IGdvZXMgaW4gdGhlIHJpZ2h0IGRpcmVjdGlvbgorICAgICAgICAvLyBhbmQgZG9lc24ndCB0cnkgdG8gcmUtb3BlbiB0aGUgd2luZG93c2hhZGUuCisgICAgICAgIG1FeHBhbmRlZCA9IHRydWU7CisgICAgICAgIHByZXBhcmVUcmFja2luZyh5LCBmYWxzZSk7CisgICAgICAgIHBlcmZvcm1GbGluZyh5LCAtMjAwMC4wZiwgdHJ1ZSk7CisgICAgfQorCisgICAgdm9pZCBwZXJmb3JtRXhwYW5kKCkgeworICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInBlcmZvcm1FeHBhbmQ6IG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkKTsKKyAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisgICAgICAgIGlmIChtRXhwYW5kZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1FeHBhbmRlZCA9IHRydWU7CisgICAgICAgIG1ha2VFeHBhbmRlZFZpc2libGUoKTsKKyAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0ZVTExfT1BFTik7CisKKyAgICAgICAgaWYgKGZhbHNlKSBwb3N0U3RhcnRUcmFjaW5nKCk7CisgICAgfQorCisgICAgdm9pZCBwZXJmb3JtQ29sbGFwc2UoKSB7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicGVyZm9ybUNvbGxhcHNlOiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZAorICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWRWaXNpYmxlPSIgKyBtRXhwYW5kZWRWaXNpYmxlKTsKKworICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtRXhwYW5kZWRWaXNpYmxlID0gZmFsc2U7CisgICAgICAgIHZpc2liaWxpdHlDaGFuZ2VkKGZhbHNlKTsKKyAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmZsYWdzIHw9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRTsKKyAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmZsYWdzICY9IH5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU07CisgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7CisgICAgICAgIG1UcmFja2luZ1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworCisgICAgICAgIGlmICgobURpc2FibGVkICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgPT0gMCkgeworICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOworICAgICAgICB9CisgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0KTsKKworICAgICAgICBpZiAoIW1FeHBhbmRlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1FeHBhbmRlZCA9IGZhbHNlOworICAgIH0KKworICAgIHZvaWQgZG9BbmltYXRpb24oKSB7CisgICAgICAgIGlmIChtQW5pbWF0aW5nKSB7CisgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgImRvQW5pbWF0aW9uIik7CisgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgImRvQW5pbWF0aW9uIGJlZm9yZSBtQW5pbVk9IiArIG1BbmltWSk7CisgICAgICAgICAgICBpbmNyZW1lbnRBbmltKCk7CisgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgImRvQW5pbWF0aW9uIGFmdGVyICBtQW5pbVk9IiArIG1BbmltWSk7CisgICAgICAgICAgICBpZiAobUFuaW1ZID49IG1EaXNwbGF5LmdldEhlaWdodCgpLTEpIHsKKyAgICAgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIkFuaW1hdGlvbiBjb21wbGV0ZWQgdG8gZXhwYW5kZWQgc3RhdGUuIik7CisgICAgICAgICAgICAgICAgbUFuaW1hdGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9GVUxMX09QRU4pOworICAgICAgICAgICAgICAgIHBlcmZvcm1FeHBhbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG1BbmltWSA8IG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJBbmltYXRpb24gY29tcGxldGVkIHRvIGNvbGxhcHNlZCBzdGF0ZS4iKTsKKyAgICAgICAgICAgICAgICBtQW5pbWF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKDApOworICAgICAgICAgICAgICAgIHBlcmZvcm1Db2xsYXBzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKChpbnQpbUFuaW1ZKTsKKyAgICAgICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSArPSBBTklNX0ZSQU1FX0RVUkFUSU9OOworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEUpLCBtQ3VyQW5pbWF0aW9uVGltZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHN0b3BUcmFja2luZygpIHsKKyAgICAgICAgbVRyYWNraW5nID0gZmFsc2U7CisgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOworICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKKyAgICB9CisKKyAgICB2b2lkIGluY3JlbWVudEFuaW0oKSB7CisgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgIGZsb2F0IHQgPSAoKGZsb2F0KShub3cgLSBtQW5pbUxhc3RUaW1lKSkgLyAxMDAwOyAgICAgICAgICAgIC8vIG1zIC0+IHMKKyAgICAgICAgZmluYWwgZmxvYXQgeSA9IG1BbmltWTsKKyAgICAgICAgZmluYWwgZmxvYXQgdiA9IG1BbmltVmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHgvcworICAgICAgICBmaW5hbCBmbG9hdCBhID0gbUFuaW1BY2NlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweC9zL3MKKyAgICAgICAgbUFuaW1ZID0geSArICh2KnQpICsgKDAuNWYqYSp0KnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHgKKyAgICAgICAgbUFuaW1WZWwgPSB2ICsgKGEqdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHgvcworICAgICAgICBtQW5pbUxhc3RUaW1lID0gbm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtcworICAgICAgICAvL1Nsb2cuZChUQUcsICJ5PSIgKyB5ICsgIiB2PSIgKyB2ICsgIiBhPSIgKyBhICsgIiB0PSIgKyB0ICsgIiBtQW5pbVk9IiArIG1BbmltWQorICAgICAgICAvLyAgICAgICAgKyAiIG1BbmltQWNjZWw9IiArIG1BbmltQWNjZWwpOworICAgIH0KKworICAgIHZvaWQgZG9SZXZlYWxBbmltYXRpb24oKSB7CisgICAgICAgIGZpbmFsIGludCBoID0gbUNsb3NlVmlldy5nZXRIZWlnaHQoKSArIG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpOworICAgICAgICBpZiAobUFuaW1hdGluZ1JldmVhbCAmJiBtQW5pbWF0aW5nICYmIG1BbmltWSA8IGgpIHsKKyAgICAgICAgICAgIGluY3JlbWVudEFuaW0oKTsKKyAgICAgICAgICAgIGlmIChtQW5pbVkgPj0gaCkgeworICAgICAgICAgICAgICAgIG1BbmltWSA9IGg7CisgICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKChpbnQpbUFuaW1ZKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKChpbnQpbUFuaW1ZKTsKKyAgICAgICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSArPSBBTklNX0ZSQU1FX0RVUkFUSU9OOworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEVfUkVWRUFMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcHJlcGFyZVRyYWNraW5nKGludCB5LCBib29sZWFuIG9wZW5pbmcpIHsKKyAgICAgICAgbVRyYWNraW5nID0gdHJ1ZTsKKyAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IFZlbG9jaXR5VHJhY2tlci5vYnRhaW4oKTsKKyAgICAgICAgaWYgKG9wZW5pbmcpIHsKKyAgICAgICAgICAgIG1BbmltQWNjZWwgPSAyMDAwLjBmOworICAgICAgICAgICAgbUFuaW1WZWwgPSAyMDA7CisgICAgICAgICAgICBtQW5pbVkgPSBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcygoaW50KW1BbmltWSk7CisgICAgICAgICAgICBtQW5pbWF0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIG1BbmltYXRpbmdSZXZlYWwgPSB0cnVlOworICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0FOSU1BVEUpOworICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0FOSU1BVEVfUkVWRUFMKTsKKyAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgICAgICBtQW5pbUxhc3RUaW1lID0gbm93OworICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUgPSBub3cgKyBBTklNX0ZSQU1FX0RVUkFUSU9OOworICAgICAgICAgICAgbUFuaW1hdGluZyA9IHRydWU7CisgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BTklNQVRFX1JFVkVBTCksCisgICAgICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lKTsKKyAgICAgICAgICAgIG1ha2VFeHBhbmRlZFZpc2libGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGl0J3Mgb3BlbiwgY2xvc2UgaXQ/CisgICAgICAgICAgICBpZiAobUFuaW1hdGluZykgeworICAgICAgICAgICAgICAgIG1BbmltYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoeSArIG1WaWV3RGVsdGEpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBwZXJmb3JtRmxpbmcoaW50IHksIGZsb2F0IHZlbCwgYm9vbGVhbiBhbHdheXMpIHsKKyAgICAgICAgbUFuaW1hdGluZ1JldmVhbCA9IGZhbHNlOworICAgICAgICBtRGlzcGxheUhlaWdodCA9IG1EaXNwbGF5LmdldEhlaWdodCgpOworCisgICAgICAgIG1BbmltWSA9IHk7CisgICAgICAgIG1BbmltVmVsID0gdmVsOworCisgICAgICAgIC8vU2xvZy5kKFRBRywgInN0YXJ0aW5nIHdpdGggbUFuaW1ZPSIgKyBtQW5pbVkgKyAiIG1BbmltVmVsPSIgKyBtQW5pbVZlbCk7CisKKyAgICAgICAgaWYgKG1FeHBhbmRlZCkgeworICAgICAgICAgICAgaWYgKCFhbHdheXMgJiYgKAorICAgICAgICAgICAgICAgICAgICB2ZWwgPiAyMDAuMGYKKyAgICAgICAgICAgICAgICAgICAgfHwgKHkgPiAobURpc3BsYXlIZWlnaHQtMjUpICYmIHZlbCA+IC0yMDAuMGYpKSkgeworICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBleHBhbmRlZCwgYnV0IHRoZXkgZGlkbid0IG1vdmUgc3VmZmljaWVudGx5IHRvIGNhdXNlCisgICAgICAgICAgICAgICAgLy8gdXMgdG8gcmV0cmFjdC4gIEFuaW1hdGUgYmFjayB0byB0aGUgZXhwYW5kZWQgcG9zaXRpb24uCisgICAgICAgICAgICAgICAgbUFuaW1BY2NlbCA9IDIwMDAuMGY7CisgICAgICAgICAgICAgICAgaWYgKHZlbCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUFuaW1WZWwgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBleHBhbmRlZCBhbmQgYXJlIG5vdyBnb2luZyB0byBhbmltYXRlIGF3YXkuCisgICAgICAgICAgICAgICAgbUFuaW1BY2NlbCA9IC0yMDAwLjBmOworICAgICAgICAgICAgICAgIGlmICh2ZWwgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1BbmltVmVsID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYWx3YXlzIHx8ICgKKyAgICAgICAgICAgICAgICAgICAgdmVsID4gMjAwLjBmCisgICAgICAgICAgICAgICAgICAgIHx8ICh5ID4gKG1EaXNwbGF5SGVpZ2h0LzIpICYmIHZlbCA+IC0yMDAuMGYpKSkgeworICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBjb2xsYXBzZWQsIGFuZCB0aGV5IG1vdmVkIGVub3VnaCB0byBhbGxvdyB1cyB0bworICAgICAgICAgICAgICAgIC8vIGV4cGFuZC4gIEFuaW1hdGUgaW4gdGhlIG5vdGlmaWNhdGlvbnMuCisgICAgICAgICAgICAgICAgbUFuaW1BY2NlbCA9IDIwMDAuMGY7CisgICAgICAgICAgICAgICAgaWYgKHZlbCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUFuaW1WZWwgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBjb2xsYXBzZWQsIGJ1dCB0aGV5IGRpZG4ndCBtb3ZlIHN1ZmZpY2llbnRseSB0byBjYXVzZQorICAgICAgICAgICAgICAgIC8vIHVzIHRvIHJldHJhY3QuICBBbmltYXRlIGJhY2sgdG8gdGhlIGNvbGxhcHNlZCBwb3NpdGlvbi4KKyAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gLTIwMDAuMGY7CisgICAgICAgICAgICAgICAgaWYgKHZlbCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUFuaW1WZWwgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL1Nsb2cuZChUQUcsICJtQW5pbVk9IiArIG1BbmltWSArICIgbUFuaW1WZWw9IiArIG1BbmltVmVsCisgICAgICAgIC8vICAgICAgICArICIgbUFuaW1BY2NlbD0iICsgbUFuaW1BY2NlbCk7CisKKyAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgbUFuaW1MYXN0VGltZSA9IG5vdzsKKyAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUgPSBub3cgKyBBTklNX0ZSQU1FX0RVUkFUSU9OOworICAgICAgICBtQW5pbWF0aW5nID0gdHJ1ZTsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0FOSU1BVEUpOworICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURV9SRVZFQUwpOworICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BTklNQVRFKSwgbUN1ckFuaW1hdGlvblRpbWUpOworICAgICAgICBzdG9wVHJhY2tpbmcoKTsKKyAgICB9CisKKyAgICBib29sZWFuIGludGVyY2VwdFRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKFNQRVcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJUb3VjaDogcmF3WT0iICsgZXZlbnQuZ2V0UmF3WSgpICsgIiBldmVudD0iICsgZXZlbnQgKyAiIG1EaXNhYmxlZD0iCisgICAgICAgICAgICAgICAgKyBtRGlzYWJsZWQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgc3RhdHVzQmFyU2l6ZSA9IG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpOworICAgICAgICBmaW5hbCBpbnQgaGl0U2l6ZSA9IHN0YXR1c0JhclNpemUqMjsKKyAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgeSA9IChpbnQpZXZlbnQuZ2V0UmF3WSgpOworCisgICAgICAgICAgICBpZiAoIW1FeHBhbmRlZCkgeworICAgICAgICAgICAgICAgIG1WaWV3RGVsdGEgPSBzdGF0dXNCYXJTaXplIC0geTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVRyYWNraW5nVmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKG1BYnNQb3MpOworICAgICAgICAgICAgICAgIG1WaWV3RGVsdGEgPSBtQWJzUG9zWzFdICsgbVRyYWNraW5nVmlldy5nZXRIZWlnaHQoKSAtIHk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKCFtRXhwYW5kZWQgJiYgeSA8IGhpdFNpemUpIHx8CisgICAgICAgICAgICAgICAgICAgIChtRXhwYW5kZWQgJiYgeSA+IChtRGlzcGxheS5nZXRIZWlnaHQoKS1oaXRTaXplKSkpIHsKKworICAgICAgICAgICAgICAgIC8vIFdlIGRyb3AgZXZlbnRzIGF0IHRoZSBlZGdlIG9mIHRoZSBzY3JlZW4gdG8gbWFrZSB0aGUgd2luZG93c2hhZGUgY29tZQorICAgICAgICAgICAgICAgIC8vIGRvd24gYnkgYWNjaWRlbnQgbGVzcywgZXNwZWNpYWxseSB3aGVuIHB1c2hpbmcgb3BlbiBhIGRldmljZSB3aXRoIGEga2V5Ym9hcmQKKyAgICAgICAgICAgICAgICAvLyB0aGF0IHJvdGF0ZXMgKGxpa2UgZzEgYW5kIGRyb2lkKQorICAgICAgICAgICAgICAgIGludCB4ID0gKGludClldmVudC5nZXRSYXdYKCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGVkZ2VCb3JkZXIgPSBtRWRnZUJvcmRlcjsKKyAgICAgICAgICAgICAgICBpZiAoeCA+PSBlZGdlQm9yZGVyICYmIHggPCBtRGlzcGxheS5nZXRXaWR0aCgpIC0gZWRnZUJvcmRlcikgeworICAgICAgICAgICAgICAgICAgICBwcmVwYXJlVHJhY2tpbmcoeSwgIW1FeHBhbmRlZCk7Ly8gb3BlbmluZyBpZiB3ZSdyZSBub3QgYWxyZWFkeSBmdWxseSB2aXNpYmxlCisgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuYWRkTW92ZW1lbnQoZXZlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtVHJhY2tpbmcpIHsKKyAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuYWRkTW92ZW1lbnQoZXZlbnQpOworICAgICAgICAgICAgZmluYWwgaW50IG1pblkgPSBzdGF0dXNCYXJTaXplICsgbUNsb3NlVmlldy5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSkgeworICAgICAgICAgICAgICAgIGludCB5ID0gKGludClldmVudC5nZXRSYXdZKCk7CisgICAgICAgICAgICAgICAgaWYgKG1BbmltYXRpbmdSZXZlYWwgJiYgeSA8IG1pblkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZworICAgICAgICAgICAgICAgIH0gZWxzZSAgeworICAgICAgICAgICAgICAgICAgICBtQW5pbWF0aW5nUmV2ZWFsID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1Bvcyh5ICsgbVZpZXdEZWx0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVApIHsKKyAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNvbXB1dGVDdXJyZW50VmVsb2NpdHkoMTAwMCk7CisKKyAgICAgICAgICAgICAgICBmbG9hdCB5VmVsID0gbVZlbG9jaXR5VHJhY2tlci5nZXRZVmVsb2NpdHkoKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIG5lZ2F0aXZlID0geVZlbCA8IDA7CisKKyAgICAgICAgICAgICAgICBmbG9hdCB4VmVsID0gbVZlbG9jaXR5VHJhY2tlci5nZXRYVmVsb2NpdHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoeFZlbCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgeFZlbCA9IC14VmVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoeFZlbCA+IDE1MC4wZikgeworICAgICAgICAgICAgICAgICAgICB4VmVsID0gMTUwLjBmOyAvLyBsaW1pdCBob3cgbXVjaCB3ZSBjYXJlIGFib3V0IHRoZSB4IGF4aXMKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmbG9hdCB2ZWwgPSAoZmxvYXQpTWF0aC5oeXBvdCh5VmVsLCB4VmVsKTsKKyAgICAgICAgICAgICAgICBpZiAobmVnYXRpdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgdmVsID0gLXZlbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwZXJmb3JtRmxpbmcoKGludClldmVudC5nZXRSYXdZKCksIHZlbCwgZmFsc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExpZ2h0c09uKGJvb2xlYW4gb24pIHsKKyAgICAgICAgaWYgKCFvbikgeworICAgICAgICAgICAgLy8gQWxsIHdlIGRvIGZvciAibGlnaHRzIG91dCIgbW9kZSBvbiBhIHBob25lIGlzIGhpZGUgdGhlIHN0YXR1cyBiYXIsCisgICAgICAgICAgICAvLyB3aGljaCB0aGUgd2luZG93IG1hbmFnZXIgZG9lcy4gIEJ1dCB3ZSBkbyBuZWVkIHRvIGhpZGUgdGhlIHdpbmRvd3NoYWRlCisgICAgICAgICAgICAvLyBvbiBvdXIgb3duLgorICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIExhdW5jaGVyIGltcGxlbWVudHMgVmlldy5PbkNsaWNrTGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIFBlbmRpbmdJbnRlbnQgbUludGVudDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVBrZzsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVRhZzsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUlkOworCisgICAgICAgIExhdW5jaGVyKFBlbmRpbmdJbnRlbnQgaW50ZW50LCBTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpIHsKKyAgICAgICAgICAgIG1JbnRlbnQgPSBpbnRlbnQ7CisgICAgICAgICAgICBtUGtnID0gcGtnOworICAgICAgICAgICAgbVRhZyA9IHRhZzsKKyAgICAgICAgICAgIG1JZCA9IGlkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGludGVudCB3ZSBhcmUgc2VuZGluZyBpcyBmb3IgdGhlIGFwcGxpY2F0aW9uLCB3aGljaAorICAgICAgICAgICAgICAgIC8vIHdvbid0IGhhdmUgcGVybWlzc2lvbiB0byBpbW1lZGlhdGVseSBzdGFydCBhbiBhY3Rpdml0eSBhZnRlcgorICAgICAgICAgICAgICAgIC8vIHRoZSB1c2VyIHN3aXRjaGVzIHRvIGhvbWUuICBXZSBrbm93IGl0IGlzIHNhZmUgdG8gZG8gYXQgdGhpcworICAgICAgICAgICAgICAgIC8vIHBvaW50LCBzbyBtYWtlIHN1cmUgbmV3IGFjdGl2aXR5IHN3aXRjaGVzIGFyZSBub3cgYWxsb3dlZC4KKyAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLnJlc3VtZUFwcFN3aXRjaGVzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50W10gcG9zID0gbmV3IGludFsyXTsKKyAgICAgICAgICAgICAgICB2LmdldExvY2F0aW9uT25TY3JlZW4ocG9zKTsKKyAgICAgICAgICAgICAgICBJbnRlbnQgb3ZlcmxheSA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgICAgICAgICBvdmVybGF5LnNldFNvdXJjZUJvdW5kcygKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWN0KHBvc1swXSwgcG9zWzFdLCBwb3NbMF0rdi5nZXRXaWR0aCgpLCBwb3NbMV0rdi5nZXRIZWlnaHQoKSkpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1JbnRlbnQuc2VuZChQaG9uZVN0YXR1c0JhclNlcnZpY2UudGhpcywgMCwgb3ZlcmxheSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGVuZGluZ0ludGVudC5DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFjayB0cmFjZSBpc24ndCB2ZXJ5IGhlbHBmdWwgaGVyZS4gIEp1c3QgbG9nIHRoZSBleGNlcHRpb24gbWVzc2FnZS4KKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlNlbmRpbmcgY29udGVudEludGVudCBmYWlsZWQ6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25Ob3RpZmljYXRpb25DbGljayhtUGtnLCBtVGFnLCBtSWQpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZCBpZiB3ZSdyZSBoZXJlLgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjbG9zZSB0aGUgc2hhZGUgaWYgaXQgd2FzIG9wZW4KKyAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworCisgICAgICAgICAgICAvLyBJZiB0aGlzIGNsaWNrIHdhcyBvbiB0aGUgaW50cnVkZXIgYWxlcnQsIGhpZGUgdGhhdCBpbnN0ZWFkCisgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19ISURFX0lOVFJVREVSKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0aWNrKFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuKSB7CisgICAgICAgIC8vIFNob3cgdGhlIHRpY2tlciBpZiBvbmUgaXMgcmVxdWVzdGVkLiBBbHNvIGRvbid0IGRvIHRoaXMKKyAgICAgICAgLy8gdW50aWwgc3RhdHVzIGJhciB3aW5kb3cgaXMgYXR0YWNoZWQgdG8gdGhlIHdpbmRvdyBtYW5hZ2VyLAorICAgICAgICAvLyBiZWNhdXNlLi4uICB3ZWxsLCB3aGF0J3MgdGhlIHBvaW50IG90aGVyd2lzZT8gIEFuZCB0cnlpbmcgdG8KKyAgICAgICAgLy8gcnVuIGEgdGlja2VyIHdpdGhvdXQgYmVpbmcgYXR0YWNoZWQgd2lsbCBjcmFzaCEKKyAgICAgICAgaWYgKG4ubm90aWZpY2F0aW9uLnRpY2tlclRleHQgIT0gbnVsbCAmJiBtU3RhdHVzQmFyVmlldy5nZXRXaW5kb3dUb2tlbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICgwID09IChtRGlzYWJsZWQgJiAoU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpKSkgeworICAgICAgICAgICAgICAgIG1UaWNrZXIuYWRkRW50cnkobik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgdGhpcyBub3RpZmljYXRpb24gYW5kIHRlbGwgdGhlIFN0YXR1c0Jhck1hbmFnZXJTZXJ2aWNlIC8gTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UKKyAgICAgKiBhYm91dCB0aGUgZmFpbHVyZS4KKyAgICAgKgorICAgICAqIFdBUk5JTkc6IHRoaXMgd2lsbCBjYWxsIGJhY2sgaW50byB1cy4gIERvbid0IGhvbGQgYW55IGxvY2tzLgorICAgICAqLworICAgIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3IoSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuLCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICByZW1vdmVOb3RpZmljYXRpb24oa2V5KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uTm90aWZpY2F0aW9uRXJyb3Iobi5wa2csIG4udGFnLCBuLmlkLCBuLnVpZCwgbi5pbml0aWFsUGlkLCBtZXNzYWdlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBUaGUgZW5kIGlzIG5pZ2guCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIE15VGlja2VyIGV4dGVuZHMgVGlja2VyIHsKKyAgICAgICAgTXlUaWNrZXIoQ29udGV4dCBjb250ZXh0LCBWaWV3IHNiKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBzYik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdGlja2VyU3RhcnRpbmcoKSB7CisgICAgICAgICAgICBtVGlja2luZyA9IHRydWU7CisgICAgICAgICAgICBtSWNvbnMuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbVRpY2tlclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVRpY2tlclZpZXcuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfdXBfaW4sIG51bGwpKTsKKyAgICAgICAgICAgIG1JY29ucy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF91cF9vdXQsIG51bGwpKTsKKyAgICAgICAgICAgIGlmIChtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KGZhbHNlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF91cF9vdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHRpY2tlckRvbmUoKSB7CisgICAgICAgICAgICBtSWNvbnMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVRpY2tlclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbUljb25zLnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX2Rvd25faW4sIG51bGwpKTsKKyAgICAgICAgICAgIG1UaWNrZXJWaWV3LnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX2Rvd25fb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgbVRpY2tpbmdEb25lTGlzdGVuZXIpKTsKKyAgICAgICAgICAgIGlmIChtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX2Rvd25faW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdGlja2VySGFsdGluZygpIHsKKyAgICAgICAgICAgIG1JY29ucy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtVGlja2VyVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtSWNvbnMuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4sIG51bGwpKTsKKyAgICAgICAgICAgIG1UaWNrZXJWaWV3LnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaWNraW5nRG9uZUxpc3RlbmVyKSk7CisgICAgICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIgbVRpY2tpbmdEb25lTGlzdGVuZXIgPSBuZXcgQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyKCkgezsKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeworICAgICAgICAgICAgbVRpY2tpbmcgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRpb24gYW5pbWF0aW9uKSB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydChBbmltYXRpb24gYW5pbWF0aW9uKSB7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBBbmltYXRpb24gbG9hZEFuaW0oaW50IGlkLCBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgQW5pbWF0aW9uIGFuaW0gPSBBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKFBob25lU3RhdHVzQmFyU2VydmljZS50aGlzLCBpZCk7CisgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBhbmltLnNldEFuaW1hdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5pbTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHZpZXdJbmZvKFZpZXcgdikgeworICAgICAgICByZXR1cm4gIigiICsgdi5nZXRMZWZ0KCkgKyAiLCIgKyB2LmdldFRvcCgpICsgIikoIiArIHYuZ2V0UmlnaHQoKSArICIsIiArIHYuZ2V0Qm90dG9tKCkKKyAgICAgICAgICAgICAgICArICIgIiArIHYuZ2V0V2lkdGgoKSArICJ4IiArIHYuZ2V0SGVpZ2h0KCkgKyAiKSI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZHVtcChGaWxlRGVzY3JpcHRvciBmZCwgUHJpbnRXcml0ZXIgcHcsIFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgaWYgKGNoZWNrQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkRVTVApCisgICAgICAgICAgICAgICAgIT0gUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEKSB7CisgICAgICAgICAgICBwdy5wcmludGxuKCJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBTdGF0dXNCYXIgZnJvbSBmcm9tIHBpZD0iCisgICAgICAgICAgICAgICAgICAgICsgQmluZGVyLmdldENhbGxpbmdQaWQoKQorICAgICAgICAgICAgICAgICAgICArICIsIHVpZD0iICsgQmluZGVyLmdldENhbGxpbmdVaWQoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1RdWV1ZUxvY2spIHsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIkN1cnJlbnQgU3RhdHVzIEJhciBzdGF0ZToiKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBtRXhwYW5kZWRWaXNpYmxlPSIgKyBtRXhwYW5kZWRWaXNpYmxlKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVRpY2tpbmc9IiArIG1UaWNraW5nKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVRyYWNraW5nPSIgKyBtVHJhY2tpbmcpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtQW5pbWF0aW5nPSIgKyBtQW5pbWF0aW5nCisgICAgICAgICAgICAgICAgICAgICsgIiwgbUFuaW1ZPSIgKyBtQW5pbVkgKyAiLCBtQW5pbVZlbD0iICsgbUFuaW1WZWwKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBtQW5pbUFjY2VsPSIgKyBtQW5pbUFjY2VsKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUN1ckFuaW1hdGlvblRpbWU9IiArIG1DdXJBbmltYXRpb25UaW1lCisgICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbUxhc3RUaW1lPSIgKyBtQW5pbUxhc3RUaW1lKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbURpc3BsYXlIZWlnaHQ9IiArIG1EaXNwbGF5SGVpZ2h0CisgICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbWF0aW5nUmV2ZWFsPSIgKyBtQW5pbWF0aW5nUmV2ZWFsCisgICAgICAgICAgICAgICAgICAgICsgIiBtVmlld0RlbHRhPSIgKyBtVmlld0RlbHRhKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbURpc3BsYXlIZWlnaHQ9IiArIG1EaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUV4cGFuZGVkUGFyYW1zOiAiICsgbUV4cGFuZGVkUGFyYW1zKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUV4cGFuZGVkVmlldzogIiArIHZpZXdJbmZvKG1FeHBhbmRlZFZpZXcpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUV4cGFuZGVkRGlhbG9nOiAiICsgbUV4cGFuZGVkRGlhbG9nKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVRyYWNraW5nUGFyYW1zOiAiICsgbVRyYWNraW5nUGFyYW1zKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVRyYWNraW5nVmlldzogIiArIHZpZXdJbmZvKG1UcmFja2luZ1ZpZXcpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbU9uZ29pbmdUaXRsZTogIiArIHZpZXdJbmZvKG1PbmdvaW5nVGl0bGUpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbU9uZ29pbmdJdGVtczogIiArIHZpZXdJbmZvKG1PbmdvaW5nSXRlbXMpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUxhdGVzdFRpdGxlOiAiICsgdmlld0luZm8obUxhdGVzdFRpdGxlKSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1MYXRlc3RJdGVtczogIiArIHZpZXdJbmZvKG1MYXRlc3RJdGVtcykpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtTm9Ob3RpZmljYXRpb25zVGl0bGU6ICIgKyB2aWV3SW5mbyhtTm9Ob3RpZmljYXRpb25zVGl0bGUpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUNsb3NlVmlldzogIiArIHZpZXdJbmZvKG1DbG9zZVZpZXcpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVRpY2tlclZpZXc6ICIgKyB2aWV3SW5mbyhtVGlja2VyVmlldykpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtU2Nyb2xsVmlldzogIiArIHZpZXdJbmZvKG1TY3JvbGxWaWV3KQorICAgICAgICAgICAgICAgICAgICArICIgc2Nyb2xsICIgKyBtU2Nyb2xsVmlldy5nZXRTY3JvbGxYKCkgKyAiLCIgKyBtU2Nyb2xsVmlldy5nZXRTY3JvbGxZKCkpOworICAgICAgICAgICAgcHcucHJpbnRsbigibU5vdGlmaWNhdGlvbkxpbmVhckxheW91dDogIiArIHZpZXdJbmZvKG1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQpKTsKKyAgICAgICAgfQorICAgICAgICAvKgorICAgICAgICBzeW5jaHJvbml6ZWQgKG1Ob3RpZmljYXRpb25EYXRhKSB7CisgICAgICAgICAgICBpbnQgTiA9IG1Ob3RpZmljYXRpb25EYXRhLm9uZ29pbmdDb3VudCgpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBvbmdvaW5nQ291bnQuc2l6ZT0iICsgTik7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4gPSBtTm90aWZpY2F0aW9uRGF0YS5nZXRPbmdvaW5nKGkpOworICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICBbIiArIGkgKyAiXSBrZXk9IiArIG4ua2V5ICsgIiB2aWV3PSIgKyBuLnZpZXcpOworICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICAgICAgICAgZGF0YT0iICsgbi5kYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE4gPSBtTm90aWZpY2F0aW9uRGF0YS5sYXRlc3RDb3VudCgpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBvbmdvaW5nQ291bnQuc2l6ZT0iICsgTik7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4gPSBtTm90aWZpY2F0aW9uRGF0YS5nZXRMYXRlc3QoaSk7CisgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAgIFsiICsgaSArICJdIGtleT0iICsgbi5rZXkgKyAiIHZpZXc9IiArIG4udmlldyk7CisgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAgICAgICAgICBkYXRhPSIgKyBuLmRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICovCisKKyAgICAgICAgaWYgKGZhbHNlKSB7CisgICAgICAgICAgICBwdy5wcmludGxuKCJzZWUgdGhlIGxvZ2NhdCBmb3IgYSBkdW1wIG9mIHRoZSB2aWV3cyB3ZSBoYXZlIGNyZWF0ZWQuIik7CisgICAgICAgICAgICAvLyBtdXN0IGhhcHBlbiBvbiB1aSB0aHJlYWQKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzQmFyVmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKG1BYnNQb3MpOworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm1TdGF0dXNCYXJWaWV3OiAtLS0tLSAoIiArIG1BYnNQb3NbMF0gKyAiLCIgKyBtQWJzUG9zWzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgIiArIG1TdGF0dXNCYXJWaWV3LmdldFdpZHRoKCkgKyAieCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzQmFyVmlldy5kZWJ1ZygpOworCisgICAgICAgICAgICAgICAgICAgICAgICBtRXhwYW5kZWRWaWV3LmdldExvY2F0aW9uT25TY3JlZW4obUFic1Bvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAibUV4cGFuZGVkVmlldzogLS0tLS0gKCIgKyBtQWJzUG9zWzBdICsgIiwiICsgbUFic1Bvc1sxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpICIgKyBtRXhwYW5kZWRWaWV3LmdldFdpZHRoKCkgKyAieCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRXhwYW5kZWRWaWV3LmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1FeHBhbmRlZFZpZXcuZGVidWcoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNraW5nVmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKG1BYnNQb3MpOworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm1UcmFja2luZ1ZpZXc6IC0tLS0tICgiICsgbUFic1Bvc1swXSArICIsIiArIG1BYnNQb3NbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSAiICsgbVRyYWNraW5nVmlldy5nZXRXaWR0aCgpICsgIngiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVRyYWNraW5nVmlldy5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tpbmdWaWV3LmRlYnVnKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgb25CYXJWaWV3QXR0YWNoZWQoKSB7CisgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwOworICAgICAgICBpbnQgcGl4ZWxGb3JtYXQ7CisgICAgICAgIERyYXdhYmxlIGJnOworCisgICAgICAgIC8vLyAtLS0tLS0tLS0tIFRyYWNraW5nIFZpZXcgLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBQaXhlbEZvcm1hdC5SR0JYXzg4ODg7CisgICAgICAgIGJnID0gbVRyYWNraW5nVmlldy5nZXRCYWNrZ3JvdW5kKCk7CisgICAgICAgIGlmIChiZyAhPSBudWxsKSB7CisgICAgICAgICAgICBwaXhlbEZvcm1hdCA9IGJnLmdldE9wYWNpdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIGxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1RBVFVTX0JBUl9QQU5FTCwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU4KKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX05PX0xJTUlUUworICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNLAorICAgICAgICAgICAgICAgIHBpeGVsRm9ybWF0KTsKKy8vICAgICAgICBscC50b2tlbiA9IG1TdGF0dXNCYXJWaWV3LmdldFdpbmRvd1Rva2VuKCk7CisgICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LlRPUCB8IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMOworICAgICAgICBscC5zZXRUaXRsZSgiVHJhY2tpbmdWaWV3Iik7CisgICAgICAgIGxwLnkgPSBtVHJhY2tpbmdQb3NpdGlvbjsKKyAgICAgICAgbVRyYWNraW5nUGFyYW1zID0gbHA7CisKKyAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLmFkZFZpZXcobVRyYWNraW5nVmlldywgbHApOworICAgIH0KKworICAgIHZvaWQgb25UcmFja2luZ1ZpZXdBdHRhY2hlZCgpIHsKKyAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHA7CisgICAgICAgIGludCBwaXhlbEZvcm1hdDsKKyAgICAgICAgRHJhd2FibGUgYmc7CisKKyAgICAgICAgLy8vIC0tLS0tLS0tLS0gRXhwYW5kZWQgVmlldyAtLS0tLS0tLS0tLS0tLQorICAgICAgICBwaXhlbEZvcm1hdCA9IFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UOworCisgICAgICAgIGZpbmFsIGludCBkaXNwaCA9IG1EaXNwbGF5LmdldEhlaWdodCgpOworICAgICAgICBscCA9IG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgIGxwLndpZHRoID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgICAgIGxwLmhlaWdodCA9IGdldEV4cGFuZGVkSGVpZ2h0KCk7CisgICAgICAgIGxwLnggPSAwOworICAgICAgICBtVHJhY2tpbmdQb3NpdGlvbiA9IGxwLnkgPSAtZGlzcGg7IC8vIHN1ZmZpY2llbnRseSBsYXJnZSBuZWdhdGl2ZQorICAgICAgICBscC50eXBlID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMOworICAgICAgICBscC5mbGFncyA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTgorICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfTk9fTElNSVRTCisgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9UT1VDSF9NT0RBTAorICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19ESVRIRVIKKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRTsKKyAgICAgICAgbHAuZm9ybWF0ID0gcGl4ZWxGb3JtYXQ7CisgICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LlRPUCB8IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMOworICAgICAgICBscC5zZXRUaXRsZSgiU3RhdHVzQmFyRXhwYW5kZWQiKTsKKyAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobHApOworICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0Rm9ybWF0KHBpeGVsRm9ybWF0KTsKKyAgICAgICAgbUV4cGFuZGVkUGFyYW1zID0gbHA7CisKKyAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnJlcXVlc3RGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX05PX1RJVExFKTsKKyAgICAgICAgbUV4cGFuZGVkRGlhbG9nLnNldENvbnRlbnRWaWV3KG1FeHBhbmRlZFZpZXcsCisgICAgICAgICAgICAgICAgbmV3IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMoVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpKTsKKyAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEJhY2tncm91bmREcmF3YWJsZShudWxsKTsKKyAgICAgICAgbUV4cGFuZGVkRGlhbG9nLnNob3coKTsKKyAgICAgICAgRnJhbWVMYXlvdXQgaGFjayA9IChGcmFtZUxheW91dCltRXhwYW5kZWRWaWV3LmdldFBhcmVudCgpOworICAgIH0KKworICAgIHZvaWQgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KGJvb2xlYW4gdmlzaWJsZSwgaW50IGFuaW0pIHsKKyAgICAgICAgbURhdGVWaWV3LnNldFVwZGF0ZXModmlzaWJsZSk7CisgICAgICAgIG1EYXRlVmlldy5zZXRWaXNpYmlsaXR5KHZpc2libGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LklOVklTSUJMRSk7CisgICAgICAgIG1EYXRlVmlldy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShhbmltLCBudWxsKSk7CisgICAgfQorCisgICAgdm9pZCBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eShib29sZWFuIHZpc2libGUsIGludCBhbmltKSB7CisgICAgICAgIGludCBvbGQgPSBtTm90aWZpY2F0aW9uSWNvbnMuZ2V0VmlzaWJpbGl0eSgpOworICAgICAgICBpbnQgdiA9IHZpc2libGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LklOVklTSUJMRTsKKyAgICAgICAgaWYgKG9sZCAhPSB2KSB7CisgICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuc2V0VmlzaWJpbGl0eSh2KTsKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29ucy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShhbmltLCBudWxsKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhpbnQgZXhwYW5kZWRQb3NpdGlvbikgeworICAgICAgICBpZiAoU1BFVykgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgInVwZGF0ZUV4cGFuZGVkVmlld1BvcyBiZWZvcmUgZXhwYW5kZWRQb3NpdGlvbj0iICsgZXhwYW5kZWRQb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICArICIgbVRyYWNraW5nUGFyYW1zLnk9IiArIG1UcmFja2luZ1BhcmFtcy55CisgICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tpbmdQb3NpdGlvbj0iICsgbVRyYWNraW5nUG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgaW50IGggPSBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKTsKKyAgICAgICAgaW50IGRpc3BoID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7CisKKyAgICAgICAgLy8gSWYgdGhlIGV4cGFuZGVkIHZpZXcgaXMgbm90IHZpc2libGUsIG1ha2Ugc3VyZSB0aGV5J3JlIHN0aWxsIG9mZiBzY3JlZW4uCisgICAgICAgIC8vIE1heWJlIHRoZSB2aWV3IHdhcyByZXNpemVkLgorICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgIGlmIChtVHJhY2tpbmdWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVHJhY2tpbmdQb3NpdGlvbiA9IC1kaXNwaDsKKyAgICAgICAgICAgICAgICBpZiAobVRyYWNraW5nUGFyYW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRyYWNraW5nUGFyYW1zLnkgPSBtVHJhY2tpbmdQb3NpdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLnVwZGF0ZVZpZXdMYXlvdXQobVRyYWNraW5nVmlldywgbVRyYWNraW5nUGFyYW1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUV4cGFuZGVkUGFyYW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IC1kaXNwaDsKKyAgICAgICAgICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gdHJhY2tpbmcgdmlldy4uLgorICAgICAgICBpbnQgcG9zOworICAgICAgICBpZiAoZXhwYW5kZWRQb3NpdGlvbiA9PSBFWFBBTkRFRF9GVUxMX09QRU4pIHsKKyAgICAgICAgICAgIHBvcyA9IGg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZXhwYW5kZWRQb3NpdGlvbiA9PSBFWFBBTkRFRF9MRUFWRV9BTE9ORSkgeworICAgICAgICAgICAgcG9zID0gbVRyYWNraW5nUG9zaXRpb247CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoZXhwYW5kZWRQb3NpdGlvbiA8PSBkaXNwaCkgeworICAgICAgICAgICAgICAgIHBvcyA9IGV4cGFuZGVkUG9zaXRpb247CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBvcyA9IGRpc3BoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9zIC09IGRpc3BoLWg7CisgICAgICAgIH0KKyAgICAgICAgbVRyYWNraW5nUG9zaXRpb24gPSBtVHJhY2tpbmdQYXJhbXMueSA9IHBvczsKKyAgICAgICAgbVRyYWNraW5nUGFyYW1zLmhlaWdodCA9IGRpc3BoLWg7CisgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS51cGRhdGVWaWV3TGF5b3V0KG1UcmFja2luZ1ZpZXcsIG1UcmFja2luZ1BhcmFtcyk7CisKKyAgICAgICAgaWYgKG1FeHBhbmRlZFBhcmFtcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2xvc2VWaWV3LmdldExvY2F0aW9uSW5XaW5kb3cobVBvc2l0aW9uVG1wKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBjbG9zZVBvcyA9IG1Qb3NpdGlvblRtcFsxXTsKKworICAgICAgICAgICAgbUV4cGFuZGVkQ29udGVudHMuZ2V0TG9jYXRpb25JbldpbmRvdyhtUG9zaXRpb25UbXApOworICAgICAgICAgICAgZmluYWwgaW50IGNvbnRlbnRzQm90dG9tID0gbVBvc2l0aW9uVG1wWzFdICsgbUV4cGFuZGVkQ29udGVudHMuZ2V0SGVpZ2h0KCk7CisKKyAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gcG9zICsgbVRyYWNraW5nVmlldy5nZXRIZWlnaHQoKQorICAgICAgICAgICAgICAgICAgICAtIChtVHJhY2tpbmdQYXJhbXMuaGVpZ2h0LWNsb3NlUG9zKSAtIGNvbnRlbnRzQm90dG9tOworICAgICAgICAgICAgaW50IG1heCA9IGg7CisgICAgICAgICAgICBpZiAobUV4cGFuZGVkUGFyYW1zLnkgPiBtYXgpIHsKKyAgICAgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IG1heDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBtaW4gPSBtVHJhY2tpbmdQb3NpdGlvbjsKKyAgICAgICAgICAgIGlmIChtRXhwYW5kZWRQYXJhbXMueSA8IG1pbikgeworICAgICAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gbWluOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sZWFuIHZpc2libGUgPSAobVRyYWNraW5nUG9zaXRpb24gKyBtVHJhY2tpbmdWaWV3LmdldEhlaWdodCgpKSA+IGg7CisgICAgICAgICAgICBpZiAoIXZpc2libGUpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY29udGVudHMgYXJlbid0IHZpc2libGUsIG1vdmUgdGhlIGV4cGFuZGVkIHZpZXcgd2F5IG9mZiBzY3JlZW4KKyAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSB3aW5kb3cgaXRzZWxmIGV4dGVuZHMgYmVsb3cgdGhlIGNvbnRlbnQgdmlldy4KKyAgICAgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IC1kaXNwaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7CisKKyAgICAgICAgICAgIC8vIEFzIGxvbmcgYXMgdGhpcyBpc24ndCBqdXN0IGEgcmVwb3NpdGlvbmluZyB0aGF0J3Mgbm90IHN1cHBvc2VkIHRvIGFmZmVjdAorICAgICAgICAgICAgLy8gdGhlIHVzZXIncyBwZXJjZXB0aW9uIG9mIHdoYXQncyBzaG93aW5nLCBjYWxsIHRvIHNheSB0aGF0IHRoZSB2aXNpYmlsaXR5CisgICAgICAgICAgICAvLyBoYXMgY2hhbmdlZC4gKE90aGVyd2lzZSwgc29tZW9uZSBlbHNlIHdpbGwgY2FsbCB0byBkbyB0aGF0KS4KKyAgICAgICAgICAgIGlmIChleHBhbmRlZFBvc2l0aW9uICE9IEVYUEFOREVEX0xFQVZFX0FMT05FKSB7CisgICAgICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJ1cGRhdGVFeHBhbmRlZFZpZXdQb3MgdmlzaWJpbGl0eUNoYW5nZWQoIiArIHZpc2libGUgKyAiKSIpOworICAgICAgICAgICAgICAgIHZpc2liaWxpdHlDaGFuZ2VkKHZpc2libGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKFNQRVcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJ1cGRhdGVFeHBhbmRlZFZpZXdQb3MgYWZ0ZXIgIGV4cGFuZGVkUG9zaXRpb249IiArIGV4cGFuZGVkUG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2luZ1BhcmFtcy55PSIgKyBtVHJhY2tpbmdQYXJhbXMueQorICAgICAgICAgICAgICAgICAgICArICIgbVRyYWNraW5nUG9zaXRpb249IiArIG1UcmFja2luZ1Bvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWRQYXJhbXMueT0iICsgbUV4cGFuZGVkUGFyYW1zLnkKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZFBhcmFtcy5oZWlnaHQ9IiArIG1FeHBhbmRlZFBhcmFtcy5oZWlnaHQpOworICAgICAgICB9CisgICAgfQorCisgICAgaW50IGdldEV4cGFuZGVkSGVpZ2h0KCkgeworICAgICAgICByZXR1cm4gbURpc3BsYXkuZ2V0SGVpZ2h0KCkgLSBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKSAtIG1DbG9zZVZpZXcuZ2V0SGVpZ2h0KCk7CisgICAgfQorCisgICAgdm9pZCB1cGRhdGVFeHBhbmRlZEhlaWdodCgpIHsKKyAgICAgICAgaWYgKG1FeHBhbmRlZFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmhlaWdodCA9IGdldEV4cGFuZGVkSGVpZ2h0KCk7CisgICAgICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIExFRHMgYXJlIHR1cm5lZCBvKWZmIHdoZW4gdGhlIG5vdGlmaWNhdGlvbiBwYW5lbCBpcyBzaG93biwgZXZlbiBqdXN0IGEgbGl0dGxlIGJpdC4KKyAgICAgKiBUaGlzIHdhcyBhZGRlZCBsYXN0LW1pbnV0ZSBhbmQgaXMgaW5jb25zaXN0ZW50IHdpdGggdGhlIHdheSB0aGUgcmVzdCBvZiB0aGUgbm90aWZpY2F0aW9ucworICAgICAqIGFyZSBoYW5kbGVkLCBiZWNhdXNlIHRoZSBub3RpZmljYXRpb24gaXNuJ3QgcmVhbGx5IGNhbmNlbGxlZC4gIFRoZSBsaWdodHMgYXJlIGp1c3QKKyAgICAgKiB0dXJuZWQgb2ZmLiAgSWYgYW55IG90aGVyIG5vdGlmaWNhdGlvbnMgaGFwcGVuLCB0aGUgbGlnaHRzIHdpbGwgdHVybiBiYWNrIG9uLiAgU3RldmUgc2F5cworICAgICAqIHRoaXMgaXMgd2hhdCBoZSB3YW50cy4gKHNlZSBidWcgMTEzMTQ2MSkKKyAgICAgKi8KKyAgICB2b2lkIHZpc2liaWxpdHlDaGFuZ2VkKGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBpZiAobVBhbmVsU2xpZ2h0bHlWaXNpYmxlICE9IHZpc2libGUpIHsKKyAgICAgICAgICAgIG1QYW5lbFNsaWdodGx5VmlzaWJsZSA9IHZpc2libGU7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uUGFuZWxSZXZlYWxlZCgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gV29uJ3QgZmFpbCB1bmxlc3MgdGhlIHdvcmxkIGhhcyBlbmRlZC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcGVyZm9ybURpc2FibGVBY3Rpb25zKGludCBuZXQpIHsKKyAgICAgICAgaW50IG9sZCA9IG1EaXNhYmxlZDsKKyAgICAgICAgaW50IGRpZmYgPSBuZXQgXiBvbGQ7CisgICAgICAgIG1EaXNhYmxlZCA9IG5ldDsKKworICAgICAgICAvLyBhY3QgYWNjb3JkaW5nbHkKKyAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKChuZXQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfRVhQQU5EOiB5ZXMiKTsKKyAgICAgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IHllcyIpOworICAgICAgICAgICAgICAgIGlmIChtVGlja2luZykgeworICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgIG1UaWNrZXIuaGFsdCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KGZhbHNlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9vdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiBubyIpOworICAgICAgICAgICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChtVGlja2luZyAmJiAobmV0ICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKKyAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUNsZWFyQnV0dG9uTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uQ2xlYXJBbGxOb3RpZmljYXRpb25zKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkIGlmIHdlJ3JlIGhlcmUuCisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1Ccm9hZGNhc3RSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgIGlmIChJbnRlbnQuQUNUSU9OX0NMT1NFX1NZU1RFTV9ESUFMT0dTLmVxdWFscyhhY3Rpb24pCisgICAgICAgICAgICAgICAgICAgIHx8IEludGVudC5BQ1RJT05fU0NSRUVOX09GRi5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoSW50ZW50LkFDVElPTl9DT05GSUdVUkFUSU9OX0NIQU5HRUQuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIHZvaWQgc2V0SW50cnVkZXJBbGVydFZpc2liaWxpdHkoYm9vbGVhbiB2aXMpIHsKKyAgICAgICAgbUludHJ1ZGVyQWxlcnRWaWV3LnNldFZpc2liaWxpdHkodmlzID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWxvYWQgc29tZSBvZiBvdXIgcmVzb3VyY2VzIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4KKyAgICAgKgorICAgICAqIFdlIGRvbid0IHJlbG9hZCBldmVyeXRoaW5nIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyAtLSB3ZSBwcm9iYWJseQorICAgICAqIHNob3VsZCwgYnV0IGdldHRpbmcgdGhhdCBzbW9vdGggaXMgdG91Z2guICBTb21lZGF5IHdlJ2xsIGZpeCB0aGF0LiAgSW4gdGhlCisgICAgICogbWVhbnRpbWUsIGp1c3QgdXBkYXRlIHRoZSB0aGluZ3MgdGhhdCB3ZSBrbm93IGNoYW5nZS4KKyAgICAgKi8KKyAgICB2b2lkIHVwZGF0ZVJlc291cmNlcygpIHsKKyAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOworCisgICAgICAgIG1DbGVhckJ1dHRvbi5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuc3RhdHVzX2Jhcl9jbGVhcl9hbGxfYnV0dG9uKSk7CisgICAgICAgIG1PbmdvaW5nVGl0bGUuc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfb25nb2luZ19ldmVudHNfdGl0bGUpKTsKKyAgICAgICAgbUxhdGVzdFRpdGxlLnNldFRleHQoZ2V0VGV4dChSLnN0cmluZy5zdGF0dXNfYmFyX2xhdGVzdF9ldmVudHNfdGl0bGUpKTsKKyAgICAgICAgbU5vTm90aWZpY2F0aW9uc1RpdGxlLnNldFRleHQoZ2V0VGV4dChSLnN0cmluZy5zdGF0dXNfYmFyX25vX25vdGlmaWNhdGlvbnNfdGl0bGUpKTsKKworICAgICAgICBtRWRnZUJvcmRlciA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5zdGF0dXNfYmFyX2VkZ2VfaWdub3JlKTsKKworICAgICAgICBpZiAoZmFsc2UpIFNsb2cudihUQUcsICJ1cGRhdGVSZXNvdXJjZXMiKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIHRyYWNpbmcKKyAgICAvLworCisgICAgdm9pZCBwb3N0U3RhcnRUcmFjaW5nKCkgeworICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChtU3RhcnRUcmFjaW5nLCAzMDAwKTsKKyAgICB9CisKKyAgICB2b2lkIHZpYnJhdGUoKSB7CisgICAgICAgIGFuZHJvaWQub3MuVmlicmF0b3IgdmliID0gKGFuZHJvaWQub3MuVmlicmF0b3IpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlZJQlJBVE9SX1NFUlZJQ0UpOworICAgICAgICB2aWIudmlicmF0ZSgyNTApOworICAgIH0KKworICAgIFJ1bm5hYmxlIG1TdGFydFRyYWNpbmcgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHZpYnJhdGUoKTsKKyAgICAgICAgICAgIFN5c3RlbUNsb2NrLnNsZWVwKDI1MCk7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAic3RhcnRUcmFjaW5nIik7CisgICAgICAgICAgICBhbmRyb2lkLm9zLkRlYnVnLnN0YXJ0TWV0aG9kVHJhY2luZygiL2RhdGEvc3RhdHVzYmFyLXRyYWNlcy90cmFjZSIpOworICAgICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobVN0b3BUcmFjaW5nLCAxMDAwMCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgUnVubmFibGUgbVN0b3BUcmFjaW5nID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBhbmRyb2lkLm9zLkRlYnVnLnN0b3BNZXRob2RUcmFjaW5nKCk7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAic3RvcFRyYWNpbmciKTsKKyAgICAgICAgICAgIHZpYnJhdGUoKTsKKyAgICAgICAgfQorICAgIH07Cit9CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyUG9saWN5LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclBvbGljeS5qYXZhCmluZGV4IDAzMDk0MzAuLmUwMDE5YjUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyUG9saWN5LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJQb2xpY3kuamF2YQpAQCAtMTgsOSArMTgsOCBAQAogCiBpbXBvcnQgYW5kcm9pZC5hcHAuU3RhdHVzQmFyTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZzsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBMmRwOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSGVhZHNldDsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQcm9maWxlOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFBiYXA7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CkBAIC0zMTksOSArMzE4LDYgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbVZvbHVtZVZpc2libGU7CiAKICAgICAvLyBibHVldG9vdGggZGV2aWNlIHN0YXR1cwotICAgIHByaXZhdGUgaW50IG1CbHVldG9vdGhIZWFkc2V0U3RhdGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1CbHVldG9vdGhBMmRwQ29ubmVjdGVkOwotICAgIHByaXZhdGUgaW50IG1CbHVldG9vdGhQYmFwU3RhdGU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1CbHVldG9vdGhFbmFibGVkOwogCiAgICAgLy8gd2lmaQpAQCAtMzY5LDkgKzM2NSw3IEBACiAgICAgICAgICAgICAgICAgb25CYXR0ZXJ5T2theShpbnRlbnQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhCbHVldG9vdGhBZGFwdGVyLkFDVElPTl9TVEFURV9DSEFOR0VEKSB8fAotICAgICAgICAgICAgICAgICAgICBhY3Rpb24uZXF1YWxzKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX1NUQVRFX0NIQU5HRUQpIHx8Ci0gICAgICAgICAgICAgICAgICAgIGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoQTJkcC5BQ1RJT05fU0lOS19TVEFURV9DSEFOR0VEKSB8fAotICAgICAgICAgICAgICAgICAgICBhY3Rpb24uZXF1YWxzKEJsdWV0b290aFBiYXAuUEJBUF9TVEFURV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uLmVxdWFscyhCbHVldG9vdGhBZGFwdGVyLkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpKSB7CiAgICAgICAgICAgICAgICAgdXBkYXRlQmx1ZXRvb3RoKGludGVudCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKFdpZmlNYW5hZ2VyLk5FVFdPUktfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pIHx8CkBAIC00NTQsOSArNDQ4LDYgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1CbHVldG9vdGhFbmFibGVkID0gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgbUJsdWV0b290aEEyZHBDb25uZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgbUJsdWV0b290aEhlYWRzZXRTdGF0ZSA9IEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICBtQmx1ZXRvb3RoUGJhcFN0YXRlID0gQmx1ZXRvb3RoUGJhcC5TVEFURV9ESVNDT05ORUNURUQ7CiAgICAgICAgIG1TZXJ2aWNlLnNldEljb25WaXNpYmlsaXR5KCJibHVldG9vdGgiLCBtQmx1ZXRvb3RoRW5hYmxlZCk7CiAKICAgICAgICAgLy8gR3BzIHN0YXR1cwpAQCAtNDkwLDkgKzQ4MSw3IEBACiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX0NIQU5HRURfQUNUSU9OKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihBdWRpb01hbmFnZXIuVklCUkFURV9TRVRUSU5HX0NIQU5HRURfQUNUSU9OKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhBZGFwdGVyLkFDVElPTl9TVEFURV9DSEFOR0VEKTsKLSAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhIZWFkc2V0LkFDVElPTl9TVEFURV9DSEFOR0VEKTsKLSAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhBMmRwLkFDVElPTl9TSU5LX1NUQVRFX0NIQU5HRUQpOwotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aFBiYXAuUEJBUF9TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5TVVBQTElDQU5UX0NPTk5FQ1RJT05fQ0hBTkdFX0FDVElPTik7CiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTik7CkBAIC0xMDY0LDI4ICsxMDUzLDE2IEBACiAgICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NUQVRFX0NIQU5HRUQpKSB7CiAgICAgICAgICAgICBpbnQgc3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoQWRhcHRlci5FWFRSQV9TVEFURSwgQmx1ZXRvb3RoQWRhcHRlci5FUlJPUik7CiAgICAgICAgICAgICBtQmx1ZXRvb3RoRW5hYmxlZCA9IHN0YXRlID09IEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT047Ci0gICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhCbHVldG9vdGhIZWFkc2V0LkFDVElPTl9TVEFURV9DSEFOR0VEKSkgewotICAgICAgICAgICAgbUJsdWV0b290aEhlYWRzZXRTdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhIZWFkc2V0LkVYVFJBX1NUQVRFLAotICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0VSUk9SKTsKLSAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aEEyZHAuQUNUSU9OX1NJTktfU1RBVEVfQ0hBTkdFRCkpIHsKLSAgICAgICAgICAgIEJsdWV0b290aEEyZHAgYTJkcCA9IG5ldyBCbHVldG9vdGhBMmRwKG1Db250ZXh0KTsKLSAgICAgICAgICAgIGlmIChhMmRwLmdldENvbm5lY3RlZFNpbmtzKCkuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoQTJkcENvbm5lY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1CbHVldG9vdGhBMmRwQ29ubmVjdGVkID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhCbHVldG9vdGhBZGFwdGVyLkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpKSB7CisgICAgICAgICAgICBpbnQgc3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoQWRhcHRlci5FWFRSQV9TVEFURSwKKyAgICAgICAgICAgICAgICBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX0RJU0NPTk5FQ1RFRCk7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICBpY29uSWQgPSBSLmRyYXdhYmxlLnN0YXRfc3lzX2RhdGFfYmx1ZXRvb3RoX2Nvbm5lY3RlZDsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aFBiYXAuUEJBUF9TVEFURV9DSEFOR0VEX0FDVElPTikpIHsKLSAgICAgICAgICAgIG1CbHVldG9vdGhQYmFwU3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoUGJhcC5QQkFQX1NUQVRFLAotICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQYmFwLlNUQVRFX0RJU0NPTk5FQ1RFRCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobUJsdWV0b290aEhlYWRzZXRTdGF0ZSA9PSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRCB8fCBtQmx1ZXRvb3RoQTJkcENvbm5lY3RlZCB8fAotICAgICAgICAgICAgICAgIG1CbHVldG9vdGhQYmFwU3RhdGUgPT0gQmx1ZXRvb3RoUGJhcC5TVEFURV9DT05ORUNURUQpIHsKLSAgICAgICAgICAgIGljb25JZCA9IFIuZHJhd2FibGUuc3RhdF9zeXNfZGF0YV9ibHVldG9vdGhfY29ubmVjdGVkOwotICAgICAgICB9Ci0KICAgICAgICAgbVNlcnZpY2Uuc2V0SWNvbigiYmx1ZXRvb3RoIiwgaWNvbklkLCAwKTsKICAgICAgICAgbVNlcnZpY2Uuc2V0SWNvblZpc2liaWxpdHkoImJsdWV0b290aCIsIG1CbHVldG9vdGhFbmFibGVkKTsKICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclNlcnZpY2UuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyU2VydmljZS5qYXZhCmluZGV4IGYzZGEyYTMuLjY5NWZkYmEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyU2VydmljZS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyU2VydmljZS5qYXZhCkBAIC0xNywxODUgKzE3LDUzIEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2JhcjsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlckltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLklTdGF0dXNCYXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLklTdGF0dXNCYXJTZXJ2aWNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJJY29uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJJY29uTGlzdDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFyTm90aWZpY2F0aW9uOwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOwotaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKLWltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQuYXBwLlN0YXR1c0Jhck1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmVsb2NpdHlUcmFja2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlckltcGw7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNjcm9sbFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucG9saWN5LlN0YXR1c0JhclBvbGljeTsKIAotCi0KLXB1YmxpYyBjbGFzcyBTdGF0dXNCYXJTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSBpbXBsZW1lbnRzIENvbW1hbmRRdWV1ZS5DYWxsYmFja3MgeworcHVibGljIGFic3RyYWN0IGNsYXNzIFN0YXR1c0JhclNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIGltcGxlbWVudHMgQ29tbWFuZFF1ZXVlLkNhbGxiYWNrcyB7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RhdHVzQmFyU2VydmljZSI7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1BFV19JQ09OUyA9IGZhbHNlOwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIFNQRVcgPSBmYWxzZTsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVEFUVVNCQVJfU1RBUlQKLSAgICAgICAgICAgID0gImNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5zdGF0dXNiYXIuU1RBUlQiOworICAgIHByb3RlY3RlZCBDb21tYW5kUXVldWUgbUNvbW1hbmRRdWV1ZTsKKyAgICBwcm90ZWN0ZWQgSVN0YXR1c0JhclNlcnZpY2UgbUJhclNlcnZpY2U7CiAKLSAgICBzdGF0aWMgZmluYWwgaW50IEVYUEFOREVEX0xFQVZFX0FMT05FID0gLTEwMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5ERURfRlVMTF9PUEVOID0gLTEwMDAxOworICAgIC8vIFVwLWNhbGwgbWV0aG9kcworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBWaWV3IG1ha2VTdGF0dXNCYXJWaWV3KCk7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRTdGF0dXNCYXJHcmF2aXR5KCk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FOSU1BVEUgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQU5JTUFURV9SRVZFQUwgPSAxMDAxOwotCi0gICAgU3RhdHVzQmFyUG9saWN5IG1JY29uUG9saWN5OwotCi0gICAgQ29tbWFuZFF1ZXVlIG1Db21tYW5kUXVldWU7Ci0gICAgSVN0YXR1c0JhclNlcnZpY2UgbUJhclNlcnZpY2U7Ci0KLSAgICBpbnQgbUljb25TaXplOwotICAgIERpc3BsYXkgbURpc3BsYXk7Ci0gICAgU3RhdHVzQmFyVmlldyBtU3RhdHVzQmFyVmlldzsKLSAgICBpbnQgbVBpeGVsRm9ybWF0OwotICAgIEggbUhhbmRsZXIgPSBuZXcgSCgpOwotICAgIE9iamVjdCBtUXVldWVMb2NrID0gbmV3IE9iamVjdCgpOwotCi0gICAgLy8gaWNvbnMKLSAgICBMaW5lYXJMYXlvdXQgbUljb25zOwotICAgIEljb25NZXJnZXIgbU5vdGlmaWNhdGlvbkljb25zOwotICAgIExpbmVhckxheW91dCBtU3RhdHVzSWNvbnM7Ci0KLSAgICAvLyBleHBhbmRlZCBub3RpZmljYXRpb25zCi0gICAgRGlhbG9nIG1FeHBhbmRlZERpYWxvZzsKLSAgICBFeHBhbmRlZFZpZXcgbUV4cGFuZGVkVmlldzsKLSAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBtRXhwYW5kZWRQYXJhbXM7Ci0gICAgU2Nyb2xsVmlldyBtU2Nyb2xsVmlldzsKLSAgICBWaWV3IG1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQ7Ci0gICAgVmlldyBtRXhwYW5kZWRDb250ZW50czsKLSAgICAvLyB0b3AgYmFyCi0gICAgVGV4dFZpZXcgbU5vTm90aWZpY2F0aW9uc1RpdGxlOwotICAgIFRleHRWaWV3IG1DbGVhckJ1dHRvbjsKLSAgICAvLyBkcmFnIGJhcgotICAgIENsb3NlRHJhZ0hhbmRsZSBtQ2xvc2VWaWV3OwotICAgIC8vIG9uZ29pbmcKLSAgICBOb3RpZmljYXRpb25EYXRhIG1PbmdvaW5nID0gbmV3IE5vdGlmaWNhdGlvbkRhdGEoKTsKLSAgICBUZXh0VmlldyBtT25nb2luZ1RpdGxlOwotICAgIExpbmVhckxheW91dCBtT25nb2luZ0l0ZW1zOwotICAgIC8vIGxhdGVzdAotICAgIE5vdGlmaWNhdGlvbkRhdGEgbUxhdGVzdCA9IG5ldyBOb3RpZmljYXRpb25EYXRhKCk7Ci0gICAgVGV4dFZpZXcgbUxhdGVzdFRpdGxlOwotICAgIExpbmVhckxheW91dCBtTGF0ZXN0SXRlbXM7Ci0gICAgLy8gcG9zaXRpb24KLSAgICBpbnRbXSBtUG9zaXRpb25UbXAgPSBuZXcgaW50WzJdOwotICAgIGJvb2xlYW4gbUV4cGFuZGVkOwotICAgIGJvb2xlYW4gbUV4cGFuZGVkVmlzaWJsZTsKLQotICAgIC8vIHRoZSBkYXRlIHZpZXcKLSAgICBEYXRlVmlldyBtRGF0ZVZpZXc7Ci0KLSAgICAvLyB0aGUgdHJhY2tlciB2aWV3Ci0gICAgVHJhY2tpbmdWaWV3IG1UcmFja2luZ1ZpZXc7Ci0gICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbVRyYWNraW5nUGFyYW1zOwotICAgIGludCBtVHJhY2tpbmdQb3NpdGlvbjsgLy8gdGhlIHBvc2l0aW9uIG9mIHRoZSB0b3Agb2YgdGhlIHRyYWNraW5nIHZpZXcuCi0gICAgcHJpdmF0ZSBib29sZWFuIG1QYW5lbFNsaWdodGx5VmlzaWJsZTsKLQotICAgIC8vIHRpY2tlcgotICAgIHByaXZhdGUgVGlja2VyIG1UaWNrZXI7Ci0gICAgcHJpdmF0ZSBWaWV3IG1UaWNrZXJWaWV3OwotICAgIHByaXZhdGUgYm9vbGVhbiBtVGlja2luZzsKLQotICAgIC8vIFRyYWNraW5nIGZpbmdlciBmb3Igb3BlbmluZy9jbG9zaW5nLgotICAgIGludCBtRWRnZUJvcmRlcjsgLy8gY29ycmVzcG9uZHMgdG8gUi5kaW1lbi5zdGF0dXNfYmFyX2VkZ2VfaWdub3JlCi0gICAgYm9vbGVhbiBtVHJhY2tpbmc7Ci0gICAgVmVsb2NpdHlUcmFja2VyIG1WZWxvY2l0eVRyYWNrZXI7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IEFOSU1fRlJBTUVfRFVSQVRJT04gPSAoMTAwMC82MCk7Ci0KLSAgICBib29sZWFuIG1BbmltYXRpbmc7Ci0gICAgbG9uZyBtQ3VyQW5pbWF0aW9uVGltZTsKLSAgICBmbG9hdCBtRGlzcGxheUhlaWdodDsKLSAgICBmbG9hdCBtQW5pbVk7Ci0gICAgZmxvYXQgbUFuaW1WZWw7Ci0gICAgZmxvYXQgbUFuaW1BY2NlbDsKLSAgICBsb25nIG1BbmltTGFzdFRpbWU7Ci0gICAgYm9vbGVhbiBtQW5pbWF0aW5nUmV2ZWFsID0gZmFsc2U7Ci0gICAgaW50IG1WaWV3RGVsdGE7Ci0gICAgaW50W10gbUFic1BvcyA9IG5ldyBpbnRbMl07Ci0KLSAgICAvLyBmb3IgZGlzYWJsaW5nIHRoZSBzdGF0dXMgYmFyCi0gICAgaW50IG1EaXNhYmxlZCA9IDA7Ci0KLSAgICBwcml2YXRlIGNsYXNzIEV4cGFuZGVkRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLSAgICAgICAgRXhwYW5kZWREaWFsb2coQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0xpZ2h0X05vVGl0bGVCYXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gZG93biA9IGV2ZW50LmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9ET1dOOwotICAgICAgICAgICAgc3dpdGNoIChldmVudC5nZXRLZXlDb2RlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9CQUNLOgotICAgICAgICAgICAgICAgIGlmICghZG93bikgewotICAgICAgICAgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hLZXlFdmVudChldmVudCk7Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBOb2JvZHkgYmluZHMgdG8gdXMuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKICAgICAgICAgLy8gRmlyc3Qgc2V0IHVwIG91ciB2aWV3cyBhbmQgc3R1ZmYuCi0gICAgICAgIG1EaXNwbGF5ID0gKChXaW5kb3dNYW5hZ2VyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSkpLmdldERlZmF1bHREaXNwbGF5KCk7Ci0gICAgICAgIG1ha2VTdGF0dXNCYXJWaWV3KHRoaXMpOworICAgICAgICBWaWV3IHNiID0gbWFrZVN0YXR1c0JhclZpZXcoKTsKIAogICAgICAgICAvLyBDb25uZWN0IGluIHRvIHRoZSBzdGF0dXMgYmFyIG1hbmFnZXIgc2VydmljZQogICAgICAgICBTdGF0dXNCYXJJY29uTGlzdCBpY29uTGlzdCA9IG5ldyBTdGF0dXNCYXJJY29uTGlzdCgpOwpAQCAtMjA0LDEyICs3MiwxNiBAQAogICAgICAgICBtQ29tbWFuZFF1ZXVlID0gbmV3IENvbW1hbmRRdWV1ZSh0aGlzLCBpY29uTGlzdCk7CiAgICAgICAgIG1CYXJTZXJ2aWNlID0gSVN0YXR1c0JhclNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZSgKICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuU1RBVFVTX0JBUl9TRVJWSUNFKSk7CisgICAgICAgIGJvb2xlYW5bXSBsaWdodHNPbiA9IG5ldyBib29sZWFuWzFdOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgbUJhclNlcnZpY2UucmVnaXN0ZXJTdGF0dXNCYXIobUNvbW1hbmRRdWV1ZSwgaWNvbkxpc3QsIG5vdGlmaWNhdGlvbktleXMsIG5vdGlmaWNhdGlvbnMpOworICAgICAgICAgICAgbUJhclNlcnZpY2UucmVnaXN0ZXJTdGF0dXNCYXIobUNvbW1hbmRRdWV1ZSwgaWNvbkxpc3QsIG5vdGlmaWNhdGlvbktleXMsIG5vdGlmaWNhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGxpZ2h0c09uKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAvLyBJZiB0aGUgc3lzdGVtIHByb2Nlc3MgaXNuJ3QgdGhlcmUgd2UncmUgZG9vbWVkIGFueXdheS4KICAgICAgICAgfQogCisgICAgICAgIHNldExpZ2h0c09uKGxpZ2h0c09uWzBdKTsKKwogICAgICAgICAvLyBTZXQgdXAgdGhlIGluaXRpYWwgaWNvbiBzdGF0ZQogICAgICAgICBpbnQgTiA9IGljb25MaXN0LnNpemUoKTsKICAgICAgICAgaW50IHZpZXdJbmRleCA9IDA7CkBAIC0yMzMsMTI3MSArMTA1LDIyIEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBQdXQgdXAgdGhlIHZpZXcKLSAgICAgICAgYWRkU3RhdHVzQmFyVmlldygpOwotCi0gICAgICAgIC8vIExhc3RseSwgY2FsbCB0byB0aGUgaWNvbiBwb2xpY3kgdG8gaW5zdGFsbC91cGRhdGUgYWxsIHRoZSBpY29ucy4KLSAgICAgICAgbUljb25Qb2xpY3kgPSBuZXcgU3RhdHVzQmFyUG9saWN5KHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKLSAgICAgICAgLy8gd2UncmUgbmV2ZXIgZGVzdHJveWVkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm9ib2R5IGJpbmRzIHRvIHVzLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gQ29uc3RydWN0aW5nIHRoZSB2aWV3Ci0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBwcml2YXRlIHZvaWQgbWFrZVN0YXR1c0JhclZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFJlc291cmNlcyByZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOwotCi0gICAgICAgIG1JY29uU2l6ZSA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdGF0dXNfYmFyX2ljb25fc2l6ZSk7Ci0KLSAgICAgICAgRXhwYW5kZWRWaWV3IGV4cGFuZGVkID0gKEV4cGFuZGVkVmlldylWaWV3LmluZmxhdGUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBSLmxheW91dC5zdGF0dXNfYmFyX2V4cGFuZGVkLCBudWxsKTsKLSAgICAgICAgZXhwYW5kZWQubVNlcnZpY2UgPSB0aGlzOwotCi0gICAgICAgIFN0YXR1c0JhclZpZXcgc2IgPSAoU3RhdHVzQmFyVmlldylWaWV3LmluZmxhdGUoY29udGV4dCwgUi5sYXlvdXQuc3RhdHVzX2JhciwgbnVsbCk7Ci0gICAgICAgIHNiLm1TZXJ2aWNlID0gdGhpczsKLQotICAgICAgICAvLyBmaWd1cmUgb3V0IHdoaWNoIHBpeGVsLWZvcm1hdCB0byB1c2UgZm9yIHRoZSBzdGF0dXMgYmFyLgotICAgICAgICBtUGl4ZWxGb3JtYXQgPSBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVDsKLSAgICAgICAgRHJhd2FibGUgYmcgPSBzYi5nZXRCYWNrZ3JvdW5kKCk7Ci0gICAgICAgIGlmIChiZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUGl4ZWxGb3JtYXQgPSBiZy5nZXRPcGFjaXR5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtU3RhdHVzQmFyVmlldyA9IHNiOwotICAgICAgICBtU3RhdHVzSWNvbnMgPSAoTGluZWFyTGF5b3V0KXNiLmZpbmRWaWV3QnlJZChSLmlkLnN0YXR1c0ljb25zKTsKLSAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zID0gKEljb25NZXJnZXIpc2IuZmluZFZpZXdCeUlkKFIuaWQubm90aWZpY2F0aW9uSWNvbnMpOwotICAgICAgICBtSWNvbnMgPSAoTGluZWFyTGF5b3V0KXNiLmZpbmRWaWV3QnlJZChSLmlkLmljb25zKTsKLSAgICAgICAgbVRpY2tlclZpZXcgPSBzYi5maW5kVmlld0J5SWQoUi5pZC50aWNrZXIpOwotICAgICAgICBtRGF0ZVZpZXcgPSAoRGF0ZVZpZXcpc2IuZmluZFZpZXdCeUlkKFIuaWQuZGF0ZSk7Ci0KLSAgICAgICAgbUV4cGFuZGVkRGlhbG9nID0gbmV3IEV4cGFuZGVkRGlhbG9nKGNvbnRleHQpOwotICAgICAgICBtRXhwYW5kZWRWaWV3ID0gZXhwYW5kZWQ7Ci0gICAgICAgIG1FeHBhbmRlZENvbnRlbnRzID0gZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubm90aWZpY2F0aW9uTGluZWFyTGF5b3V0KTsKLSAgICAgICAgbU9uZ29pbmdUaXRsZSA9IChUZXh0VmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5vbmdvaW5nVGl0bGUpOwotICAgICAgICBtT25nb2luZ0l0ZW1zID0gKExpbmVhckxheW91dClleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5vbmdvaW5nSXRlbXMpOwotICAgICAgICBtTGF0ZXN0VGl0bGUgPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubGF0ZXN0VGl0bGUpOwotICAgICAgICBtTGF0ZXN0SXRlbXMgPSAoTGluZWFyTGF5b3V0KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLmxhdGVzdEl0ZW1zKTsKLSAgICAgICAgbU5vTm90aWZpY2F0aW9uc1RpdGxlID0gKFRleHRWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm5vTm90aWZpY2F0aW9uc1RpdGxlKTsKLSAgICAgICAgbUNsZWFyQnV0dG9uID0gKFRleHRWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLmNsZWFyX2FsbF9idXR0b24pOwotICAgICAgICBtQ2xlYXJCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1DbGVhckJ1dHRvbkxpc3RlbmVyKTsKLSAgICAgICAgbVNjcm9sbFZpZXcgPSAoU2Nyb2xsVmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5zY3JvbGwpOwotICAgICAgICBtTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0ID0gZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubm90aWZpY2F0aW9uTGluZWFyTGF5b3V0KTsKLQotICAgICAgICBtT25nb2luZ1RpdGxlLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgbUxhdGVzdFRpdGxlLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICBtVGlja2VyID0gbmV3IE15VGlja2VyKGNvbnRleHQsIHNiKTsKLQotICAgICAgICBUaWNrZXJWaWV3IHRpY2tlclZpZXcgPSAoVGlja2VyVmlldylzYi5maW5kVmlld0J5SWQoUi5pZC50aWNrZXJUZXh0KTsKLSAgICAgICAgdGlja2VyVmlldy5tVGlja2VyID0gbVRpY2tlcjsKLQotICAgICAgICBtVHJhY2tpbmdWaWV3ID0gKFRyYWNraW5nVmlldylWaWV3LmluZmxhdGUoY29udGV4dCwgUi5sYXlvdXQuc3RhdHVzX2Jhcl90cmFja2luZywgbnVsbCk7Ci0gICAgICAgIG1UcmFja2luZ1ZpZXcubVNlcnZpY2UgPSB0aGlzOwotICAgICAgICBtQ2xvc2VWaWV3ID0gKENsb3NlRHJhZ0hhbmRsZSltVHJhY2tpbmdWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmNsb3NlKTsKLSAgICAgICAgbUNsb3NlVmlldy5tU2VydmljZSA9IHRoaXM7Ci0KLSAgICAgICAgbUVkZ2VCb3JkZXIgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4uc3RhdHVzX2Jhcl9lZGdlX2lnbm9yZSk7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSBpbml0YWwgdmlldyB2aXNpYmlsaXR5Ci0gICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOwotICAgICAgICBtRGF0ZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0KLSAgICAgICAgLy8gcmVjZWl2ZSBicm9hZGNhc3RzCi0gICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9DT05GSUdVUkFUSU9OX0NIQU5HRUQpOwotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fQ0xPU0VfU1lTVEVNX0RJQUxPR1MpOwotICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fU0NSRUVOX09GRik7Ci0gICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtQnJvYWRjYXN0UmVjZWl2ZXIsIGZpbHRlcik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkU3RhdHVzQmFyVmlldygpIHsKLSAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOworICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CiAgICAgICAgIGZpbmFsIGludCBoZWlnaHQ9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdGF0dXNfYmFyX2hlaWdodCk7CiAKLSAgICAgICAgZmluYWwgU3RhdHVzQmFyVmlldyB2aWV3ID0gbVN0YXR1c0JhclZpZXc7Ci0gICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAorICAgICAgICBmaW5hbCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBscCA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygKICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKICAgICAgICAgICAgICAgICBoZWlnaHQsCiAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSLAogICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRQogICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfVE9VQ0hBQkxFX1dIRU5fV0FLSU5HLAogICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0LlJHQlhfODg4OCk7Ci0gICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LlRPUCB8IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMOworICAgICAgICBscC5ncmF2aXR5ID0gZ2V0U3RhdHVzQmFyR3Jhdml0eSgpOwogICAgICAgICBscC5zZXRUaXRsZSgiU3RhdHVzQmFyIik7CiAgICAgICAgIC8vIFRPRE8gbHAud2luZG93QW5pbWF0aW9ucyA9IFIuc3R5bGUuQW5pbWF0aW9uX1N0YXR1c0JhcjsKKyAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLmFkZFZpZXcoc2IsIGxwKTsKIAotICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyh2aWV3LCBscCk7CisgICAgICAgIFNsb2cuZChUQUcsICJBZGRlZCBzdGF0dXMgYmFyIHZpZXcgdy8gZ3Jhdml0eSAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGxwLmdyYXZpdHkpKTsKICAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRJY29uKFN0cmluZyBzbG90LCBpbnQgaW5kZXgsIGludCB2aWV3SW5kZXgsIFN0YXR1c0Jhckljb24gaWNvbikgewotICAgICAgICBpZiAoU1BFV19JQ09OUykgewotICAgICAgICAgICAgU2xvZy5kKFRBRywgImFkZEljb24gc2xvdD0iICsgc2xvdCArICIgaW5kZXg9IiArIGluZGV4ICsgIiB2aWV3SW5kZXg9IiArIHZpZXdJbmRleAotICAgICAgICAgICAgICAgICAgICArICIgaWNvbj0iICsgaWNvbik7Ci0gICAgICAgIH0KLSAgICAgICAgU3RhdHVzQmFySWNvblZpZXcgdmlldyA9IG5ldyBTdGF0dXNCYXJJY29uVmlldyh0aGlzLCBzbG90KTsKLSAgICAgICAgdmlldy5zZXQoaWNvbik7Ci0gICAgICAgIG1TdGF0dXNJY29ucy5hZGRWaWV3KHZpZXcsIHZpZXdJbmRleCwgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMobUljb25TaXplLCBtSWNvblNpemUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVJY29uKFN0cmluZyBzbG90LCBpbnQgaW5kZXgsIGludCB2aWV3SW5kZXgsCi0gICAgICAgICAgICBTdGF0dXNCYXJJY29uIG9sZCwgU3RhdHVzQmFySWNvbiBpY29uKSB7Ci0gICAgICAgIGlmIChTUEVXX0lDT05TKSB7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlSWNvbiBzbG90PSIgKyBzbG90ICsgIiBpbmRleD0iICsgaW5kZXggKyAiIHZpZXdJbmRleD0iICsgdmlld0luZGV4Ci0gICAgICAgICAgICAgICAgICAgICsgIiBvbGQ9IiArIG9sZCArICIgaWNvbj0iICsgaWNvbik7Ci0gICAgICAgIH0KLSAgICAgICAgU3RhdHVzQmFySWNvblZpZXcgdmlldyA9IChTdGF0dXNCYXJJY29uVmlldyltU3RhdHVzSWNvbnMuZ2V0Q2hpbGRBdCh2aWV3SW5kZXgpOwotICAgICAgICB2aWV3LnNldChpY29uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVJY29uKFN0cmluZyBzbG90LCBpbnQgaW5kZXgsIGludCB2aWV3SW5kZXgpIHsKLSAgICAgICAgaWYgKFNQRVdfSUNPTlMpIHsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJyZW1vdmVJY29uIHNsb3Q9IiArIHNsb3QgKyAiIGluZGV4PSIgKyBpbmRleCArICIgdmlld0luZGV4PSIgKyB2aWV3SW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIG1TdGF0dXNJY29ucy5yZW1vdmVWaWV3QXQodmlld0luZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGROb3RpZmljYXRpb24oSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgYm9vbGVhbiBzaG91bGRUaWNrID0gdHJ1ZTsKLSAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZnVsbFNjcmVlbkludGVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzaG91bGRUaWNrID0gZmFsc2U7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAiTm90aWZpY2F0aW9uIGhhcyBmdWxsU2NyZWVuSW50ZW50OyBzZW5kaW5nIGZ1bGxTY3JlZW5JbnRlbnQiKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5mdWxsU2NyZWVuSW50ZW50LnNlbmQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9IAotCi0gICAgICAgIFN0YXR1c0Jhckljb25WaWV3IGljb25WaWV3ID0gYWRkTm90aWZpY2F0aW9uVmlld3Moa2V5LCBub3RpZmljYXRpb24pOwotICAgICAgICBpZiAoaWNvblZpZXcgPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgIGlmIChzaG91bGRUaWNrKSB7Ci0gICAgICAgICAgICB0aWNrKG5vdGlmaWNhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2xpZGluZyB3aW5kb3dzIGFuZCB0aGUgdGl0bGVzLgotICAgICAgICBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKTsKLSAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0xFQVZFX0FMT05FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVOb3RpZmljYXRpb24oSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgU2xvZy5kKFRBRywgInVwZGF0ZU5vdGlmaWNhdGlvbiBrZXk9IiArIGtleSArICIgbm90aWZpY2F0aW9uPSIgKyBub3RpZmljYXRpb24pOwotCi0gICAgICAgIE5vdGlmaWNhdGlvbkRhdGEgb2xkTGlzdDsKLSAgICAgICAgaW50IG9sZEluZGV4ID0gbU9uZ29pbmcuZmluZEVudHJ5KGtleSk7Ci0gICAgICAgIGlmIChvbGRJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBvbGRMaXN0ID0gbU9uZ29pbmc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvbGRJbmRleCA9IG1MYXRlc3QuZmluZEVudHJ5KGtleSk7Ci0gICAgICAgICAgICBpZiAob2xkSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInVwZGF0ZU5vdGlmaWNhdGlvbiBmb3IgdW5rbm93biBrZXk6ICIgKyBrZXkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9sZExpc3QgPSBtTGF0ZXN0OwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE5vdGlmaWNhdGlvbkRhdGEuRW50cnkgb2xkRW50cnkgPSBvbGRMaXN0LmdldEVudHJ5QXQob2xkSW5kZXgpOwotICAgICAgICBmaW5hbCBTdGF0dXNCYXJOb3RpZmljYXRpb24gb2xkTm90aWZpY2F0aW9uID0gb2xkRW50cnkubm90aWZpY2F0aW9uOwotICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBvbGRDb250ZW50VmlldyA9IG9sZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudFZpZXc7Ci0KLSAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgY29udGVudFZpZXcgPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRWaWV3OwotCi0gICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9sZCBub3RpZmljYXRpb246IHdoZW49IiArIG9sZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbgotICAgICAgICAgICAgICAgICAgICArICIgb25nb2luZz0iICsgb2xkTm90aWZpY2F0aW9uLmlzT25nb2luZygpCi0gICAgICAgICAgICAgICAgICAgICsgIiBleHBhbmRlZD0iICsgb2xkRW50cnkuZXhwYW5kZWQKLSAgICAgICAgICAgICAgICAgICAgKyAiIGNvbnRlbnRWaWV3PSIgKyBvbGRDb250ZW50Vmlldyk7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAibmV3IG5vdGlmaWNhdGlvbjogd2hlbj0iICsgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCi0gICAgICAgICAgICAgICAgICAgICsgIiBvbmdvaW5nPSIgKyBvbGROb3RpZmljYXRpb24uaXNPbmdvaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIGNvbnRlbnRWaWV3PSIgKyBjb250ZW50Vmlldyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDYW4gd2UganVzdCByZWFwcGx5IHRoZSBSZW1vdGVWaWV3cyBpbiBwbGFjZT8gIElmIHdoZW4gZGlkbid0IGNoYW5nZSwgdGhlIG9yZGVyCi0gICAgICAgIC8vIGRpZG4ndCBjaGFuZ2UuCi0gICAgICAgIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4gPT0gb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCi0gICAgICAgICAgICAgICAgJiYgbm90aWZpY2F0aW9uLmlzT25nb2luZygpID09IG9sZE5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKQotICAgICAgICAgICAgICAgICYmIG9sZEVudHJ5LmV4cGFuZGVkICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBjb250ZW50VmlldyAhPSBudWxsICYmIG9sZENvbnRlbnRWaWV3ICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBjb250ZW50Vmlldy5nZXRQYWNrYWdlKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcuZ2V0UGFja2FnZSgpLmVxdWFscyhjb250ZW50Vmlldy5nZXRQYWNrYWdlKCkpCi0gICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcuZ2V0TGF5b3V0SWQoKSA9PSBjb250ZW50Vmlldy5nZXRMYXlvdXRJZCgpKSB7Ci0gICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInJldXNpbmcgbm90aWZpY2F0aW9uIik7Ci0gICAgICAgICAgICBvbGRFbnRyeS5ub3RpZmljYXRpb24gPSBub3RpZmljYXRpb247Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIFJlYXBwbHkgdGhlIFJlbW90ZVZpZXdzCi0gICAgICAgICAgICAgICAgY29udGVudFZpZXcucmVhcHBseSh0aGlzLCBvbGRFbnRyeS5jb250ZW50KTsKLSAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGNvbnRlbnRJbnRlbnQKLSAgICAgICAgICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IGNvbnRlbnRJbnRlbnQgPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRJbnRlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBvbGRFbnRyeS5jb250ZW50LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgTGF1bmNoZXIoY29udGVudEludGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnBrZywgbm90aWZpY2F0aW9uLnRhZywgbm90aWZpY2F0aW9uLmlkKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgaWNvbi4KLSAgICAgICAgICAgICAgICBmaW5hbCBTdGF0dXNCYXJJY29uIGljID0gbmV3IFN0YXR1c0Jhckljb24obm90aWZpY2F0aW9uLnBrZywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbiwgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLm51bWJlcik7Ci0gICAgICAgICAgICAgICAgaWYgKCFvbGRFbnRyeS5pY29uLnNldChpYykpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3Ioa2V5LCBub3RpZmljYXRpb24sICJDb3VsZG4ndCB1cGRhdGUgaWNvbjogIiArIGljKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBJdCBmYWlsZWQgdG8gYWRkIGNsZWFubHkuICBMb2csIGFuZCByZW1vdmUgdGhlIHZpZXcgZnJvbSB0aGUgcGFuZWwuCi0gICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkNvdWxkbid0IHJlYXBwbHkgdmlld3MgZm9yIHBhY2thZ2UgIiArIGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSwgZSk7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKLSAgICAgICAgICAgICAgICBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIm5vdCByZXVzaW5nIG5vdGlmaWNhdGlvbiIpOwotICAgICAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKLSAgICAgICAgICAgIGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlc3RhcnQgdGhlIHRpY2tlciBpZiBpdCdzIHN0aWxsIHJ1bm5pbmcKLSAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24udGlja2VyVGV4dCAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgIVRleHRVdGlscy5lcXVhbHMobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi50aWNrZXJUZXh0LAotICAgICAgICAgICAgICAgICAgICBvbGRFbnRyeS5ub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLnRpY2tlclRleHQpKSB7Ci0gICAgICAgICAgICB0aWNrKG5vdGlmaWNhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHNsaWRpbmcgd2luZG93cyBhbmQgdGhlIHRpdGxlcy4KLSAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7Ci0gICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9MRUFWRV9BTE9ORSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTm90aWZpY2F0aW9uKElCaW5kZXIga2V5KSB7Ci0gICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicmVtb3ZlTm90aWZpY2F0aW9uIGtleT0iICsga2V5KTsKLSAgICAgICAgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG9sZCA9IHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKGtleSk7Ci0KLSAgICAgICAgaWYgKG9sZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDYW5jZWwgdGhlIHRpY2tlciBpZiBpdCdzIHN0aWxsIHJ1bm5pbmcKLSAgICAgICAgICAgIG1UaWNrZXIucmVtb3ZlRW50cnkob2xkKTsKLQotICAgICAgICAgICAgLy8gUmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBzbGlkaW5nIHdpbmRvd3MgYW5kIHRoZSB0aXRsZXMuCi0gICAgICAgICAgICBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKTsKLSAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9MRUFWRV9BTE9ORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBjaG9vc2VJY29uSW5kZXgoYm9vbGVhbiBpc09uZ29pbmcsIGludCB2aWV3SW5kZXgpIHsKLSAgICAgICAgZmluYWwgaW50IGxhdGVzdFNpemUgPSBtTGF0ZXN0LnNpemUoKTsKLSAgICAgICAgaWYgKGlzT25nb2luZykgewotICAgICAgICAgICAgcmV0dXJuIGxhdGVzdFNpemUgKyAobU9uZ29pbmcuc2l6ZSgpIC0gdmlld0luZGV4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBsYXRlc3RTaXplIC0gdmlld0luZGV4OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgVmlld1tdIG1ha2VOb3RpZmljYXRpb25WaWV3KFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgTm90aWZpY2F0aW9uIG4gPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uOwotICAgICAgICBSZW1vdGVWaWV3cyByZW1vdGVWaWV3cyA9IG4uY29udGVudFZpZXc7Ci0gICAgICAgIGlmIChyZW1vdGVWaWV3cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgcm93IHZpZXcKLSAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKLSAgICAgICAgVmlldyByb3cgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnN0YXR1c19iYXJfbGF0ZXN0X2V2ZW50LCBwYXJlbnQsIGZhbHNlKTsKLQotICAgICAgICAvLyBiaW5kIHRoZSBjbGljayBldmVudCB0byB0aGUgY29udGVudCBhcmVhCi0gICAgICAgIFZpZXdHcm91cCBjb250ZW50ID0gKFZpZXdHcm91cClyb3cuZmluZFZpZXdCeUlkKFIuaWQuY29udGVudCk7Ci0gICAgICAgIGNvbnRlbnQuc2V0RGVzY2VuZGFudEZvY3VzYWJpbGl0eShWaWV3R3JvdXAuRk9DVVNfQkxPQ0tfREVTQ0VOREFOVFMpOwotICAgICAgICBjb250ZW50LnNldE9uRm9jdXNDaGFuZ2VMaXN0ZW5lcihtRm9jdXNDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgIFBlbmRpbmdJbnRlbnQgY29udGVudEludGVudCA9IG4uY29udGVudEludGVudDsKLSAgICAgICAgaWYgKGNvbnRlbnRJbnRlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGVudC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IExhdW5jaGVyKGNvbnRlbnRJbnRlbnQsIG5vdGlmaWNhdGlvbi5wa2csCi0gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24udGFnLCBub3RpZmljYXRpb24uaWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFZpZXcgZXhwYW5kZWQgPSBudWxsOwotICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4cGFuZGVkID0gcmVtb3RlVmlld3MuYXBwbHkodGhpcywgY29udGVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXhwYW5kZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGlkZW50ID0gbm90aWZpY2F0aW9uLnBrZyArICIvMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhub3RpZmljYXRpb24uaWQpOwotICAgICAgICAgICAgU2xvZy5lKFRBRywgImNvdWxkbid0IGluZmxhdGUgdmlldyBmb3Igbm90aWZpY2F0aW9uICIgKyBpZGVudCwgZXhjZXB0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29udGVudC5hZGRWaWV3KGV4cGFuZGVkKTsKLSAgICAgICAgICAgIHJvdy5zZXREcmF3aW5nQ2FjaGVFbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBWaWV3W10geyByb3csIGNvbnRlbnQsIGV4cGFuZGVkIH07Ci0gICAgfQotCi0gICAgU3RhdHVzQmFySWNvblZpZXcgYWRkTm90aWZpY2F0aW9uVmlld3MoSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgTm90aWZpY2F0aW9uRGF0YSBsaXN0OwotICAgICAgICBWaWV3R3JvdXAgcGFyZW50OwotICAgICAgICBmaW5hbCBib29sZWFuIGlzT25nb2luZyA9IG5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKTsKLSAgICAgICAgaWYgKGlzT25nb2luZykgewotICAgICAgICAgICAgbGlzdCA9IG1PbmdvaW5nOwotICAgICAgICAgICAgcGFyZW50ID0gbU9uZ29pbmdJdGVtczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxpc3QgPSBtTGF0ZXN0OwotICAgICAgICAgICAgcGFyZW50ID0gbUxhdGVzdEl0ZW1zOwotICAgICAgICB9Ci0gICAgICAgIC8vIENvbnN0cnVjdCB0aGUgZXhwYW5kZWQgdmlldy4KLSAgICAgICAgZmluYWwgVmlld1tdIHZpZXdzID0gbWFrZU5vdGlmaWNhdGlvblZpZXcobm90aWZpY2F0aW9uLCBwYXJlbnQpOwotICAgICAgICBpZiAodmlld3MgPT0gbnVsbCkgewotICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3Ioa2V5LCBub3RpZmljYXRpb24sICJDb3VsZG4ndCBleHBhbmQgUmVtb3RlVmlld3MgZm9yOiAiCi0gICAgICAgICAgICAgICAgICAgICsgbm90aWZpY2F0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFZpZXcgcm93ID0gdmlld3NbMF07Ci0gICAgICAgIGZpbmFsIFZpZXcgY29udGVudCA9IHZpZXdzWzFdOwotICAgICAgICBmaW5hbCBWaWV3IGV4cGFuZGVkID0gdmlld3NbMl07Ci0gICAgICAgIC8vIENvbnN0cnVjdCB0aGUgaWNvbi4KLSAgICAgICAgZmluYWwgU3RhdHVzQmFySWNvblZpZXcgaWNvblZpZXcgPSBuZXcgU3RhdHVzQmFySWNvblZpZXcodGhpcywKLSAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ucGtnICsgIi8weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG5vdGlmaWNhdGlvbi5pZCkpOwotICAgICAgICBmaW5hbCBTdGF0dXNCYXJJY29uIGljID0gbmV3IFN0YXR1c0Jhckljb24obm90aWZpY2F0aW9uLnBrZywgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uLAotICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb25MZXZlbCwgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5udW1iZXIpOwotICAgICAgICBpZiAoIWljb25WaWV3LnNldChpYykpIHsKLSAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKGtleSwgbm90aWZpY2F0aW9uLCAiQ291bGRpbmcgY3JlYXRlIGljb246ICIgKyBpYyk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAvLyBBZGQgdGhlIGV4cGFuZGVkIHZpZXcuCi0gICAgICAgIGZpbmFsIGludCB2aWV3SW5kZXggPSBsaXN0LmFkZChrZXksIG5vdGlmaWNhdGlvbiwgcm93LCBjb250ZW50LCBleHBhbmRlZCwgaWNvblZpZXcpOwotICAgICAgICBwYXJlbnQuYWRkVmlldyhyb3csIHZpZXdJbmRleCk7Ci0gICAgICAgIC8vIEFkZCB0aGUgaWNvbi4KLSAgICAgICAgZmluYWwgaW50IGljb25JbmRleCA9IGNob29zZUljb25JbmRleChpc09uZ29pbmcsIHZpZXdJbmRleCk7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25JY29ucy5hZGRWaWV3KGljb25WaWV3LCBpY29uSW5kZXgpOwotICAgICAgICByZXR1cm4gaWNvblZpZXc7Ci0gICAgfQotCi0gICAgU3RhdHVzQmFyTm90aWZpY2F0aW9uIHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKElCaW5kZXIga2V5KSB7Ci0gICAgICAgIE5vdGlmaWNhdGlvbkRhdGEuRW50cnkgZW50cnkgPSBtT25nb2luZy5yZW1vdmUoa2V5KTsKLSAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgIGVudHJ5ID0gbUxhdGVzdC5yZW1vdmUoa2V5KTsKLSAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlbW92ZU5vdGlmaWNhdGlvbiBmb3IgdW5rbm93biBrZXk6ICIgKyBrZXkpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFJlbW92ZSB0aGUgZXhwYW5kZWQgdmlldy4KLSAgICAgICAgKChWaWV3R3JvdXApZW50cnkucm93LmdldFBhcmVudCgpKS5yZW1vdmVWaWV3KGVudHJ5LnJvdyk7Ci0gICAgICAgIC8vIFJlbW92ZSB0aGUgaWNvbi4KLSAgICAgICAgKChWaWV3R3JvdXApZW50cnkuaWNvbi5nZXRQYXJlbnQoKSkucmVtb3ZlVmlldyhlbnRyeS5pY29uKTsKLQotICAgICAgICByZXR1cm4gZW50cnkubm90aWZpY2F0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKSB7Ci0gICAgICAgIGJvb2xlYW4gb25nb2luZyA9IG1PbmdvaW5nLmhhc1Zpc2libGVJdGVtcygpOwotICAgICAgICBib29sZWFuIGxhdGVzdCA9IG1MYXRlc3QuaGFzVmlzaWJsZUl0ZW1zKCk7Ci0KLSAgICAgICAgLy8gKG5vIG9uZ29pbmcgbm90aWZpY2F0aW9ucyBhcmUgY2xlYXJhYmxlKQotICAgICAgICBpZiAobUxhdGVzdC5oYXNDbGVhcmFibGVJdGVtcygpKSB7Ci0gICAgICAgICAgICBtQ2xlYXJCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNsZWFyQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbU9uZ29pbmdUaXRsZS5zZXRWaXNpYmlsaXR5KG9uZ29pbmcgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgICAgICBtTGF0ZXN0VGl0bGUuc2V0VmlzaWJpbGl0eShsYXRlc3QgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotCi0gICAgICAgIGlmIChvbmdvaW5nIHx8IGxhdGVzdCkgewotICAgICAgICAgICAgbU5vTm90aWZpY2F0aW9uc1RpdGxlLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Ob05vdGlmaWNhdGlvbnNUaXRsZS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFN0YXRlIGlzIG9uZSBvciBtb3JlIG9mIHRoZSBESVNBQkxFIGNvbnN0YW50cyBmcm9tIFN0YXR1c0Jhck1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzYWJsZShpbnQgc3RhdGUpIHsKLSAgICAgICAgZmluYWwgaW50IG9sZCA9IG1EaXNhYmxlZDsKLSAgICAgICAgZmluYWwgaW50IGRpZmYgPSBzdGF0ZSBeIG9sZDsKLSAgICAgICAgbURpc2FibGVkID0gc3RhdGU7Ci0KLSAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgewotICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9FWFBBTkQ6IHllcyIpOwotICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKLSAgICAgICAgICAgIGlmICgoc3RhdGUgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiB5ZXMiKTsKLSAgICAgICAgICAgICAgICBpZiAobVRpY2tpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRpY2tlci5oYWx0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkoZmFsc2UsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX291dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IG5vIik7Ci0gICAgICAgICAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgewotICAgICAgICAgICAgaWYgKG1UaWNraW5nICYmIChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUjogeWVzIik7Ci0gICAgICAgICAgICAgICAgbVRpY2tlci5oYWx0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGwgY2hhbmdlcyB0byB0aGUgc3RhdHVzIGJhciBhbmQgbm90aWZpY2F0aW9ucyBmdW5uZWwgdGhyb3VnaCBoZXJlIGFuZCBhcmUgYmF0Y2hlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIEggZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG0pIHsKLSAgICAgICAgICAgIHN3aXRjaCAobS53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfQU5JTUFURToKLSAgICAgICAgICAgICAgICAgICAgZG9BbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfQU5JTUFURV9SRVZFQUw6Ci0gICAgICAgICAgICAgICAgICAgIGRvUmV2ZWFsQW5pbWF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgVmlldy5PbkZvY3VzQ2hhbmdlTGlzdGVuZXIgbUZvY3VzQ2hhbmdlTGlzdGVuZXIgPSBuZXcgVmlldy5PbkZvY3VzQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uRm9jdXNDaGFuZ2UoVmlldyB2LCBib29sZWFuIGhhc0ZvY3VzKSB7Ci0gICAgICAgICAgICAvLyBCZWNhdXNlICd2JyBpcyBhIFZpZXdHcm91cCwgYWxsIGl0cyBjaGlsZHJlbiB3aWxsIGJlICh1bilzZWxlY3RlZAotICAgICAgICAgICAgLy8gdG9vLCB3aGljaCBhbGxvd3MgbWFycXVlZWluZyB0byB3b3JrLgotICAgICAgICAgICAgdi5zZXRTZWxlY3RlZChoYXNGb2N1cyk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSB2b2lkIG1ha2VFeHBhbmRlZFZpc2libGUoKSB7Ci0gICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiTWFrZSBleHBhbmRlZCB2aXNpYmxlOiBleHBhbmRlZCB2aXNpYmxlPSIgKyBtRXhwYW5kZWRWaXNpYmxlKTsKLSAgICAgICAgaWYgKG1FeHBhbmRlZFZpc2libGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtRXhwYW5kZWRWaXNpYmxlID0gdHJ1ZTsKLSAgICAgICAgdmlzaWJpbGl0eUNoYW5nZWQodHJ1ZSk7Ci0KLSAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0xFQVZFX0FMT05FKTsKLSAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmZsYWdzICY9IH5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEU7Ci0gICAgICAgIG1FeHBhbmRlZFBhcmFtcy5mbGFncyB8PSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU07Ci0gICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7Ci0gICAgICAgIG1FeHBhbmRlZFZpZXcucmVxdWVzdEZvY3VzKFZpZXcuRk9DVVNfRk9SV0FSRCk7Ci0gICAgICAgIG1UcmFja2luZ1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgIGlmICghbVRpY2tpbmcpIHsKLSAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhbmltYXRlRXhwYW5kKCkgewotICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIkFuaW1hdGUgZXhwYW5kOiBleHBhbmRlZD0iICsgbUV4cGFuZGVkKTsKLSAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRXhwYW5kZWQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHByZXBhcmVUcmFja2luZygwLCB0cnVlKTsKLSAgICAgICAgcGVyZm9ybUZsaW5nKDAsIDIwMDAuMGYsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFuaW1hdGVDb2xsYXBzZSgpIHsKLSAgICAgICAgaWYgKFNQRVcpIHsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJhbmltYXRlQ29sbGFwc2UoKTogbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZFZpc2libGU9IiArIG1FeHBhbmRlZFZpc2libGUKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkCi0gICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbWF0aW5nPSIgKyBtQW5pbWF0aW5nCi0gICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbVk9IiArIG1BbmltWQotICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1WZWw9IiArIG1BbmltVmVsKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHk7Ci0gICAgICAgIGlmIChtQW5pbWF0aW5nKSB7Ci0gICAgICAgICAgICB5ID0gKGludCltQW5pbVk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB5ID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCktMTsKLSAgICAgICAgfQotICAgICAgICAvLyBMZXQgdGhlIGZsaW5nIHRoaW5rIHRoYXQgd2UncmUgb3BlbiBzbyBpdCBnb2VzIGluIHRoZSByaWdodCBkaXJlY3Rpb24KLSAgICAgICAgLy8gYW5kIGRvZXNuJ3QgdHJ5IHRvIHJlLW9wZW4gdGhlIHdpbmRvd3NoYWRlLgotICAgICAgICBtRXhwYW5kZWQgPSB0cnVlOwotICAgICAgICBwcmVwYXJlVHJhY2tpbmcoeSwgZmFsc2UpOwotICAgICAgICBwZXJmb3JtRmxpbmcoeSwgLTIwMDAuMGYsIHRydWUpOwotICAgIH0KLQotICAgIHZvaWQgcGVyZm9ybUV4cGFuZCgpIHsKLSAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJwZXJmb3JtRXhwYW5kOiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZCk7Ci0gICAgICAgIGlmICgobURpc2FibGVkICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDsKLSAgICAgICAgfQotICAgICAgICBpZiAobUV4cGFuZGVkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtRXhwYW5kZWQgPSB0cnVlOwotICAgICAgICBtYWtlRXhwYW5kZWRWaXNpYmxlKCk7Ci0gICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9GVUxMX09QRU4pOwotCi0gICAgICAgIGlmIChmYWxzZSkgcG9zdFN0YXJ0VHJhY2luZygpOwotICAgIH0KLQotICAgIHZvaWQgcGVyZm9ybUNvbGxhcHNlKCkgewotICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInBlcmZvcm1Db2xsYXBzZTogbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQKLSAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkVmlzaWJsZT0iICsgbUV4cGFuZGVkVmlzaWJsZQotICAgICAgICAgICAgICAgICsgIiBtVGlja2luZz0iICsgbVRpY2tpbmcpOwotCi0gICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1FeHBhbmRlZFZpc2libGUgPSBmYWxzZTsKLSAgICAgICAgdmlzaWJpbGl0eUNoYW5nZWQoZmFsc2UpOwotICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgfD0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFOwotICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgJj0gfldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTTsKLSAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKLSAgICAgICAgbVRyYWNraW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSA9PSAwKSB7Ci0gICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1EYXRlVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkoZmFsc2UsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX291dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1FeHBhbmRlZCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1FeHBhbmRlZCA9IGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQgZG9BbmltYXRpb24oKSB7Ci0gICAgICAgIGlmIChtQW5pbWF0aW5nKSB7Ci0gICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgImRvQW5pbWF0aW9uIik7Ci0gICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgImRvQW5pbWF0aW9uIGJlZm9yZSBtQW5pbVk9IiArIG1BbmltWSk7Ci0gICAgICAgICAgICBpbmNyZW1lbnRBbmltKCk7Ci0gICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgImRvQW5pbWF0aW9uIGFmdGVyICBtQW5pbVk9IiArIG1BbmltWSk7Ci0gICAgICAgICAgICBpZiAobUFuaW1ZID49IG1EaXNwbGF5LmdldEhlaWdodCgpLTEpIHsKLSAgICAgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIkFuaW1hdGlvbiBjb21wbGV0ZWQgdG8gZXhwYW5kZWQgc3RhdGUuIik7Ci0gICAgICAgICAgICAgICAgbUFuaW1hdGluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9GVUxMX09QRU4pOwotICAgICAgICAgICAgICAgIHBlcmZvcm1FeHBhbmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG1BbmltWSA8IG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJBbmltYXRpb24gY29tcGxldGVkIHRvIGNvbGxhcHNlZCBzdGF0ZS4iKTsKLSAgICAgICAgICAgICAgICBtQW5pbWF0aW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKDApOwotICAgICAgICAgICAgICAgIHBlcmZvcm1Db2xsYXBzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKChpbnQpbUFuaW1ZKTsKLSAgICAgICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSArPSBBTklNX0ZSQU1FX0RVUkFUSU9OOwotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEUpLCBtQ3VyQW5pbWF0aW9uVGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHN0b3BUcmFja2luZygpIHsKLSAgICAgICAgbVRyYWNraW5nID0gZmFsc2U7Ci0gICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOwotICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKLSAgICB9Ci0KLSAgICB2b2lkIGluY3JlbWVudEFuaW0oKSB7Ci0gICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgIGZsb2F0IHQgPSAoKGZsb2F0KShub3cgLSBtQW5pbUxhc3RUaW1lKSkgLyAxMDAwOyAgICAgICAgICAgIC8vIG1zIC0+IHMKLSAgICAgICAgZmluYWwgZmxvYXQgeSA9IG1BbmltWTsKLSAgICAgICAgZmluYWwgZmxvYXQgdiA9IG1BbmltVmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHgvcwotICAgICAgICBmaW5hbCBmbG9hdCBhID0gbUFuaW1BY2NlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBweC9zL3MKLSAgICAgICAgbUFuaW1ZID0geSArICh2KnQpICsgKDAuNWYqYSp0KnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHgKLSAgICAgICAgbUFuaW1WZWwgPSB2ICsgKGEqdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHgvcwotICAgICAgICBtQW5pbUxhc3RUaW1lID0gbm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtcwotICAgICAgICAvL1Nsb2cuZChUQUcsICJ5PSIgKyB5ICsgIiB2PSIgKyB2ICsgIiBhPSIgKyBhICsgIiB0PSIgKyB0ICsgIiBtQW5pbVk9IiArIG1BbmltWQotICAgICAgICAvLyAgICAgICAgKyAiIG1BbmltQWNjZWw9IiArIG1BbmltQWNjZWwpOwotICAgIH0KLQotICAgIHZvaWQgZG9SZXZlYWxBbmltYXRpb24oKSB7Ci0gICAgICAgIGZpbmFsIGludCBoID0gbUNsb3NlVmlldy5nZXRIZWlnaHQoKSArIG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpOwotICAgICAgICBpZiAobUFuaW1hdGluZ1JldmVhbCAmJiBtQW5pbWF0aW5nICYmIG1BbmltWSA8IGgpIHsKLSAgICAgICAgICAgIGluY3JlbWVudEFuaW0oKTsKLSAgICAgICAgICAgIGlmIChtQW5pbVkgPj0gaCkgewotICAgICAgICAgICAgICAgIG1BbmltWSA9IGg7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKChpbnQpbUFuaW1ZKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKChpbnQpbUFuaW1ZKTsKLSAgICAgICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSArPSBBTklNX0ZSQU1FX0RVUkFUSU9OOwotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRUaW1lKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FOSU1BVEVfUkVWRUFMKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcHJlcGFyZVRyYWNraW5nKGludCB5LCBib29sZWFuIG9wZW5pbmcpIHsKLSAgICAgICAgbVRyYWNraW5nID0gdHJ1ZTsKLSAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IFZlbG9jaXR5VHJhY2tlci5vYnRhaW4oKTsKLSAgICAgICAgaWYgKG9wZW5pbmcpIHsKLSAgICAgICAgICAgIG1BbmltQWNjZWwgPSAyMDAwLjBmOwotICAgICAgICAgICAgbUFuaW1WZWwgPSAyMDA7Ci0gICAgICAgICAgICBtQW5pbVkgPSBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKTsKLSAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcygoaW50KW1BbmltWSk7Ci0gICAgICAgICAgICBtQW5pbWF0aW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIG1BbmltYXRpbmdSZXZlYWwgPSB0cnVlOwotICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0FOSU1BVEUpOwotICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0FOSU1BVEVfUkVWRUFMKTsKLSAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtQW5pbUxhc3RUaW1lID0gbm93OwotICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUgPSBub3cgKyBBTklNX0ZSQU1FX0RVUkFUSU9OOwotICAgICAgICAgICAgbUFuaW1hdGluZyA9IHRydWU7Ci0gICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BTklNQVRFX1JFVkVBTCksCi0gICAgICAgICAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lKTsKLSAgICAgICAgICAgIG1ha2VFeHBhbmRlZFZpc2libGUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGl0J3Mgb3BlbiwgY2xvc2UgaXQ/Ci0gICAgICAgICAgICBpZiAobUFuaW1hdGluZykgewotICAgICAgICAgICAgICAgIG1BbmltYXRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoeSArIG1WaWV3RGVsdGEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwZXJmb3JtRmxpbmcoaW50IHksIGZsb2F0IHZlbCwgYm9vbGVhbiBhbHdheXMpIHsKLSAgICAgICAgbUFuaW1hdGluZ1JldmVhbCA9IGZhbHNlOwotICAgICAgICBtRGlzcGxheUhlaWdodCA9IG1EaXNwbGF5LmdldEhlaWdodCgpOwotCi0gICAgICAgIG1BbmltWSA9IHk7Ci0gICAgICAgIG1BbmltVmVsID0gdmVsOwotCi0gICAgICAgIC8vU2xvZy5kKFRBRywgInN0YXJ0aW5nIHdpdGggbUFuaW1ZPSIgKyBtQW5pbVkgKyAiIG1BbmltVmVsPSIgKyBtQW5pbVZlbCk7Ci0KLSAgICAgICAgaWYgKG1FeHBhbmRlZCkgewotICAgICAgICAgICAgaWYgKCFhbHdheXMgJiYgKAotICAgICAgICAgICAgICAgICAgICB2ZWwgPiAyMDAuMGYKLSAgICAgICAgICAgICAgICAgICAgfHwgKHkgPiAobURpc3BsYXlIZWlnaHQtMjUpICYmIHZlbCA+IC0yMDAuMGYpKSkgewotICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBleHBhbmRlZCwgYnV0IHRoZXkgZGlkbid0IG1vdmUgc3VmZmljaWVudGx5IHRvIGNhdXNlCi0gICAgICAgICAgICAgICAgLy8gdXMgdG8gcmV0cmFjdC4gIEFuaW1hdGUgYmFjayB0byB0aGUgZXhwYW5kZWQgcG9zaXRpb24uCi0gICAgICAgICAgICAgICAgbUFuaW1BY2NlbCA9IDIwMDAuMGY7Ci0gICAgICAgICAgICAgICAgaWYgKHZlbCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUFuaW1WZWwgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBleHBhbmRlZCBhbmQgYXJlIG5vdyBnb2luZyB0byBhbmltYXRlIGF3YXkuCi0gICAgICAgICAgICAgICAgbUFuaW1BY2NlbCA9IC0yMDAwLjBmOwotICAgICAgICAgICAgICAgIGlmICh2ZWwgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmltVmVsID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoYWx3YXlzIHx8ICgKLSAgICAgICAgICAgICAgICAgICAgdmVsID4gMjAwLjBmCi0gICAgICAgICAgICAgICAgICAgIHx8ICh5ID4gKG1EaXNwbGF5SGVpZ2h0LzIpICYmIHZlbCA+IC0yMDAuMGYpKSkgewotICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBjb2xsYXBzZWQsIGFuZCB0aGV5IG1vdmVkIGVub3VnaCB0byBhbGxvdyB1cyB0bwotICAgICAgICAgICAgICAgIC8vIGV4cGFuZC4gIEFuaW1hdGUgaW4gdGhlIG5vdGlmaWNhdGlvbnMuCi0gICAgICAgICAgICAgICAgbUFuaW1BY2NlbCA9IDIwMDAuMGY7Ci0gICAgICAgICAgICAgICAgaWYgKHZlbCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUFuaW1WZWwgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBjb2xsYXBzZWQsIGJ1dCB0aGV5IGRpZG4ndCBtb3ZlIHN1ZmZpY2llbnRseSB0byBjYXVzZQotICAgICAgICAgICAgICAgIC8vIHVzIHRvIHJldHJhY3QuICBBbmltYXRlIGJhY2sgdG8gdGhlIGNvbGxhcHNlZCBwb3NpdGlvbi4KLSAgICAgICAgICAgICAgICBtQW5pbUFjY2VsID0gLTIwMDAuMGY7Ci0gICAgICAgICAgICAgICAgaWYgKHZlbCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUFuaW1WZWwgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL1Nsb2cuZChUQUcsICJtQW5pbVk9IiArIG1BbmltWSArICIgbUFuaW1WZWw9IiArIG1BbmltVmVsCi0gICAgICAgIC8vICAgICAgICArICIgbUFuaW1BY2NlbD0iICsgbUFuaW1BY2NlbCk7Ci0KLSAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbUFuaW1MYXN0VGltZSA9IG5vdzsKLSAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUgPSBub3cgKyBBTklNX0ZSQU1FX0RVUkFUSU9OOwotICAgICAgICBtQW5pbWF0aW5nID0gdHJ1ZTsKLSAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0FOSU1BVEUpOwotICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQU5JTUFURV9SRVZFQUwpOwotICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BTklNQVRFKSwgbUN1ckFuaW1hdGlvblRpbWUpOwotICAgICAgICBzdG9wVHJhY2tpbmcoKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGludGVyY2VwdFRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKFNQRVcpIHsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJUb3VjaDogcmF3WT0iICsgZXZlbnQuZ2V0UmF3WSgpICsgIiBldmVudD0iICsgZXZlbnQgKyAiIG1EaXNhYmxlZD0iCi0gICAgICAgICAgICAgICAgKyBtRGlzYWJsZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBpbnQgc3RhdHVzQmFyU2l6ZSA9IG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpOwotICAgICAgICBmaW5hbCBpbnQgaGl0U2l6ZSA9IHN0YXR1c0JhclNpemUqMjsKLSAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgeSA9IChpbnQpZXZlbnQuZ2V0UmF3WSgpOwotCi0gICAgICAgICAgICBpZiAoIW1FeHBhbmRlZCkgewotICAgICAgICAgICAgICAgIG1WaWV3RGVsdGEgPSBzdGF0dXNCYXJTaXplIC0geTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVRyYWNraW5nVmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKG1BYnNQb3MpOwotICAgICAgICAgICAgICAgIG1WaWV3RGVsdGEgPSBtQWJzUG9zWzFdICsgbVRyYWNraW5nVmlldy5nZXRIZWlnaHQoKSAtIHk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKCFtRXhwYW5kZWQgJiYgeSA8IGhpdFNpemUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChtRXhwYW5kZWQgJiYgeSA+IChtRGlzcGxheS5nZXRIZWlnaHQoKS1oaXRTaXplKSkpIHsKLQotICAgICAgICAgICAgICAgIC8vIFdlIGRyb3AgZXZlbnRzIGF0IHRoZSBlZGdlIG9mIHRoZSBzY3JlZW4gdG8gbWFrZSB0aGUgd2luZG93c2hhZGUgY29tZQotICAgICAgICAgICAgICAgIC8vIGRvd24gYnkgYWNjaWRlbnQgbGVzcywgZXNwZWNpYWxseSB3aGVuIHB1c2hpbmcgb3BlbiBhIGRldmljZSB3aXRoIGEga2V5Ym9hcmQKLSAgICAgICAgICAgICAgICAvLyB0aGF0IHJvdGF0ZXMgKGxpa2UgZzEgYW5kIGRyb2lkKQotICAgICAgICAgICAgICAgIGludCB4ID0gKGludClldmVudC5nZXRSYXdYKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGVkZ2VCb3JkZXIgPSBtRWRnZUJvcmRlcjsKLSAgICAgICAgICAgICAgICBpZiAoeCA+PSBlZGdlQm9yZGVyICYmIHggPCBtRGlzcGxheS5nZXRXaWR0aCgpIC0gZWRnZUJvcmRlcikgewotICAgICAgICAgICAgICAgICAgICBwcmVwYXJlVHJhY2tpbmcoeSwgIW1FeHBhbmRlZCk7Ly8gb3BlbmluZyBpZiB3ZSdyZSBub3QgYWxyZWFkeSBmdWxseSB2aXNpYmxlCi0gICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuYWRkTW92ZW1lbnQoZXZlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtVHJhY2tpbmcpIHsKLSAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuYWRkTW92ZW1lbnQoZXZlbnQpOwotICAgICAgICAgICAgZmluYWwgaW50IG1pblkgPSBzdGF0dXNCYXJTaXplICsgbUNsb3NlVmlldy5nZXRIZWlnaHQoKTsKLSAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSkgewotICAgICAgICAgICAgICAgIGludCB5ID0gKGludClldmVudC5nZXRSYXdZKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1BbmltYXRpbmdSZXZlYWwgJiYgeSA8IG1pblkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZwotICAgICAgICAgICAgICAgIH0gZWxzZSAgewotICAgICAgICAgICAgICAgICAgICBtQW5pbWF0aW5nUmV2ZWFsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1Bvcyh5ICsgbVZpZXdEZWx0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVApIHsKLSAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNvbXB1dGVDdXJyZW50VmVsb2NpdHkoMTAwMCk7Ci0KLSAgICAgICAgICAgICAgICBmbG9hdCB5VmVsID0gbVZlbG9jaXR5VHJhY2tlci5nZXRZVmVsb2NpdHkoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIG5lZ2F0aXZlID0geVZlbCA8IDA7Ci0KLSAgICAgICAgICAgICAgICBmbG9hdCB4VmVsID0gbVZlbG9jaXR5VHJhY2tlci5nZXRYVmVsb2NpdHkoKTsKLSAgICAgICAgICAgICAgICBpZiAoeFZlbCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgeFZlbCA9IC14VmVsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoeFZlbCA+IDE1MC4wZikgewotICAgICAgICAgICAgICAgICAgICB4VmVsID0gMTUwLjBmOyAvLyBsaW1pdCBob3cgbXVjaCB3ZSBjYXJlIGFib3V0IHRoZSB4IGF4aXMKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmbG9hdCB2ZWwgPSAoZmxvYXQpTWF0aC5oeXBvdCh5VmVsLCB4VmVsKTsKLSAgICAgICAgICAgICAgICBpZiAobmVnYXRpdmUpIHsKLSAgICAgICAgICAgICAgICAgICAgdmVsID0gLXZlbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwZXJmb3JtRmxpbmcoKGludClldmVudC5nZXRSYXdZKCksIHZlbCwgZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgTGF1bmNoZXIgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7Ci0gICAgICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtSW50ZW50OwotICAgICAgICBwcml2YXRlIFN0cmluZyBtUGtnOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtVGFnOwotICAgICAgICBwcml2YXRlIGludCBtSWQ7Ci0KLSAgICAgICAgTGF1bmNoZXIoUGVuZGluZ0ludGVudCBpbnRlbnQsIFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCkgewotICAgICAgICAgICAgbUludGVudCA9IGludGVudDsKLSAgICAgICAgICAgIG1Qa2cgPSBwa2c7Ci0gICAgICAgICAgICBtVGFnID0gdGFnOwotICAgICAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgaW50ZW50IHdlIGFyZSBzZW5kaW5nIGlzIGZvciB0aGUgYXBwbGljYXRpb24sIHdoaWNoCi0gICAgICAgICAgICAgICAgLy8gd29uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGltbWVkaWF0ZWx5IHN0YXJ0IGFuIGFjdGl2aXR5IGFmdGVyCi0gICAgICAgICAgICAgICAgLy8gdGhlIHVzZXIgc3dpdGNoZXMgdG8gaG9tZS4gIFdlIGtub3cgaXQgaXMgc2FmZSB0byBkbyBhdCB0aGlzCi0gICAgICAgICAgICAgICAgLy8gcG9pbnQsIHNvIG1ha2Ugc3VyZSBuZXcgYWN0aXZpdHkgc3dpdGNoZXMgYXJlIG5vdyBhbGxvd2VkLgotICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkucmVzdW1lQXBwU3dpdGNoZXMoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtSW50ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnRbXSBwb3MgPSBuZXcgaW50WzJdOwotICAgICAgICAgICAgICAgIHYuZ2V0TG9jYXRpb25PblNjcmVlbihwb3MpOwotICAgICAgICAgICAgICAgIEludGVudCBvdmVybGF5ID0gbmV3IEludGVudCgpOwotICAgICAgICAgICAgICAgIG92ZXJsYXkuc2V0U291cmNlQm91bmRzKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3QocG9zWzBdLCBwb3NbMV0sIHBvc1swXSt2LmdldFdpZHRoKCksIHBvc1sxXSt2LmdldEhlaWdodCgpKSk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbUludGVudC5zZW5kKFN0YXR1c0JhclNlcnZpY2UudGhpcywgMCwgb3ZlcmxheSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUGVuZGluZ0ludGVudC5DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFjayB0cmFjZSBpc24ndCB2ZXJ5IGhlbHBmdWwgaGVyZS4gIEp1c3QgbG9nIHRoZSBleGNlcHRpb24gbWVzc2FnZS4KLSAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlNlbmRpbmcgY29udGVudEludGVudCBmYWlsZWQ6ICIgKyBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25Ob3RpZmljYXRpb25DbGljayhtUGtnLCBtVGFnLCBtSWQpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZCBpZiB3ZSdyZSBoZXJlLgotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjbG9zZSB0aGUgc2hhZGUgaWYgaXQgd2FzIG9wZW4KLSAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRpY2soU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4pIHsKLSAgICAgICAgLy8gU2hvdyB0aGUgdGlja2VyIGlmIG9uZSBpcyByZXF1ZXN0ZWQuIEFsc28gZG9uJ3QgZG8gdGhpcwotICAgICAgICAvLyB1bnRpbCBzdGF0dXMgYmFyIHdpbmRvdyBpcyBhdHRhY2hlZCB0byB0aGUgd2luZG93IG1hbmFnZXIsCi0gICAgICAgIC8vIGJlY2F1c2UuLi4gIHdlbGwsIHdoYXQncyB0aGUgcG9pbnQgb3RoZXJ3aXNlPyAgQW5kIHRyeWluZyB0bwotICAgICAgICAvLyBydW4gYSB0aWNrZXIgd2l0aG91dCBiZWluZyBhdHRhY2hlZCB3aWxsIGNyYXNoIQotICAgICAgICBpZiAobi5ub3RpZmljYXRpb24udGlja2VyVGV4dCAhPSBudWxsICYmIG1TdGF0dXNCYXJWaWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKDAgPT0gKG1EaXNhYmxlZCAmIChTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikpKSB7Ci0gICAgICAgICAgICAgICAgbVRpY2tlci5hZGRFbnRyeShuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbmNlbCB0aGlzIG5vdGlmaWNhdGlvbiBhbmQgdGVsbCB0aGUgU3RhdHVzQmFyTWFuYWdlclNlcnZpY2UgLyBOb3RpZmljYXRpb25NYW5hZ2VyU2VydmljZQotICAgICAqIGFib3V0IHRoZSBmYWlsdXJlLgotICAgICAqCi0gICAgICogV0FSTklORzogdGhpcyB3aWxsIGNhbGwgYmFjayBpbnRvIHVzLiAgRG9uJ3QgaG9sZCBhbnkgbG9ja3MuCi0gICAgICovCi0gICAgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4sIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvbihrZXkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbUJhclNlcnZpY2Uub25Ob3RpZmljYXRpb25FcnJvcihuLnBrZywgbi50YWcsIG4uaWQsIG4udWlkLCBuLmluaXRpYWxQaWQsIG1lc3NhZ2UpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIFRoZSBlbmQgaXMgbmlnaC4KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgTXlUaWNrZXIgZXh0ZW5kcyBUaWNrZXIgewotICAgICAgICBNeVRpY2tlcihDb250ZXh0IGNvbnRleHQsIFN0YXR1c0JhclZpZXcgc2IpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHNiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICB2b2lkIHRpY2tlclN0YXJ0aW5nKCkgewotICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJ0aWNrZXJTdGFydGluZyIpOwotICAgICAgICAgICAgbVRpY2tpbmcgPSB0cnVlOwotICAgICAgICAgICAgbUljb25zLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1UaWNrZXJWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1UaWNrZXJWaWV3LnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX3VwX2luLCBudWxsKSk7Ci0gICAgICAgICAgICBtSWNvbnMuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfdXBfb3V0LCBudWxsKSk7Ci0gICAgICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfdXBfb3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICB2b2lkIHRpY2tlckRvbmUoKSB7Ci0gICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInRpY2tlckRvbmUiKTsKLSAgICAgICAgICAgIG1UaWNraW5nID0gZmFsc2U7Ci0gICAgICAgICAgICBtSWNvbnMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVRpY2tlclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUljb25zLnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX2Rvd25faW4sIG51bGwpKTsKLSAgICAgICAgICAgIG1UaWNrZXJWaWV3LnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX2Rvd25fb3V0LCBudWxsKSk7Ci0gICAgICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF9kb3duX2luKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdGlja2VySGFsdGluZygpIHsKLSAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAidGlja2VySGFsdGluZyIpOwotICAgICAgICAgICAgbVRpY2tpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIG1JY29ucy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtVGlja2VyVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtSWNvbnMuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4sIG51bGwpKTsKLSAgICAgICAgICAgIG1UaWNrZXJWaWV3LnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX291dCwgbnVsbCkpOwotICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFZpc2libGUpIHsKLSAgICAgICAgICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBbmltYXRpb24gbG9hZEFuaW0oaW50IGlkLCBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgQW5pbWF0aW9uIGFuaW0gPSBBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKFN0YXR1c0JhclNlcnZpY2UudGhpcywgaWQpOwotICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgYW5pbS5zZXRBbmltYXRpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuaW07Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB2aWV3SW5mbyhWaWV3IHYpIHsKLSAgICAgICAgcmV0dXJuICIoIiArIHYuZ2V0TGVmdCgpICsgIiwiICsgdi5nZXRUb3AoKSArICIpKCIgKyB2LmdldFJpZ2h0KCkgKyAiLCIgKyB2LmdldEJvdHRvbSgpCi0gICAgICAgICAgICAgICAgKyAiICIgKyB2LmdldFdpZHRoKCkgKyAieCIgKyB2LmdldEhlaWdodCgpICsgIikiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3LCBTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIGlmIChjaGVja0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5EVU1QKQotICAgICAgICAgICAgICAgICE9IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgewotICAgICAgICAgICAgcHcucHJpbnRsbigiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgU3RhdHVzQmFyIGZyb20gZnJvbSBwaWQ9IgotICAgICAgICAgICAgICAgICAgICArIEJpbmRlci5nZXRDYWxsaW5nUGlkKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtUXVldWVMb2NrKSB7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCJDdXJyZW50IFN0YXR1cyBCYXIgc3RhdGU6Iik7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbUV4cGFuZGVkVmlzaWJsZT0iICsgbUV4cGFuZGVkVmlzaWJsZSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UaWNraW5nPSIgKyBtVGlja2luZyk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UcmFja2luZz0iICsgbVRyYWNraW5nKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUFuaW1hdGluZz0iICsgbUFuaW1hdGluZwotICAgICAgICAgICAgICAgICAgICArICIsIG1BbmltWT0iICsgbUFuaW1ZICsgIiwgbUFuaW1WZWw9IiArIG1BbmltVmVsCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbUFuaW1BY2NlbD0iICsgbUFuaW1BY2NlbCk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1DdXJBbmltYXRpb25UaW1lPSIgKyBtQ3VyQW5pbWF0aW9uVGltZQotICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1MYXN0VGltZT0iICsgbUFuaW1MYXN0VGltZSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EaXNwbGF5SGVpZ2h0PSIgKyBtRGlzcGxheUhlaWdodAotICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1hdGluZ1JldmVhbD0iICsgbUFuaW1hdGluZ1JldmVhbAotICAgICAgICAgICAgICAgICAgICArICIgbVZpZXdEZWx0YT0iICsgbVZpZXdEZWx0YSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EaXNwbGF5SGVpZ2h0PSIgKyBtRGlzcGxheUhlaWdodCk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZFBhcmFtczogIiArIG1FeHBhbmRlZFBhcmFtcyk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZFZpZXc6ICIgKyB2aWV3SW5mbyhtRXhwYW5kZWRWaWV3KSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZERpYWxvZzogIiArIG1FeHBhbmRlZERpYWxvZyk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UcmFja2luZ1BhcmFtczogIiArIG1UcmFja2luZ1BhcmFtcyk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UcmFja2luZ1ZpZXc6ICIgKyB2aWV3SW5mbyhtVHJhY2tpbmdWaWV3KSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1PbmdvaW5nVGl0bGU6ICIgKyB2aWV3SW5mbyhtT25nb2luZ1RpdGxlKSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1PbmdvaW5nSXRlbXM6ICIgKyB2aWV3SW5mbyhtT25nb2luZ0l0ZW1zKSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1MYXRlc3RUaXRsZTogIiArIHZpZXdJbmZvKG1MYXRlc3RUaXRsZSkpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtTGF0ZXN0SXRlbXM6ICIgKyB2aWV3SW5mbyhtTGF0ZXN0SXRlbXMpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbU5vTm90aWZpY2F0aW9uc1RpdGxlOiAiICsgdmlld0luZm8obU5vTm90aWZpY2F0aW9uc1RpdGxlKSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1DbG9zZVZpZXc6ICIgKyB2aWV3SW5mbyhtQ2xvc2VWaWV3KSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UaWNrZXJWaWV3OiAiICsgdmlld0luZm8obVRpY2tlclZpZXcpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVNjcm9sbFZpZXc6ICIgKyB2aWV3SW5mbyhtU2Nyb2xsVmlldykKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNjcm9sbCAiICsgbVNjcm9sbFZpZXcuZ2V0U2Nyb2xsWCgpICsgIiwiICsgbVNjcm9sbFZpZXcuZ2V0U2Nyb2xsWSgpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIm1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQ6ICIgKyB2aWV3SW5mbyhtTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHJ1ZSkgewotICAgICAgICAgICAgLy8gbXVzdCBoYXBwZW4gb24gdWkgdGhyZWFkCi0gICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm1TdGF0dXNJY29uczoiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNJY29ucy5kZWJ1ZygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHZvaWQgb25CYXJWaWV3QXR0YWNoZWQoKSB7Ci0gICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwOwotICAgICAgICBpbnQgcGl4ZWxGb3JtYXQ7Ci0gICAgICAgIERyYXdhYmxlIGJnOwotCi0gICAgICAgIC8vLyAtLS0tLS0tLS0tIFRyYWNraW5nIFZpZXcgLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgcGl4ZWxGb3JtYXQgPSBQaXhlbEZvcm1hdC5SR0JYXzg4ODg7Ci0gICAgICAgIGJnID0gbVRyYWNraW5nVmlldy5nZXRCYWNrZ3JvdW5kKCk7Ci0gICAgICAgIGlmIChiZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwaXhlbEZvcm1hdCA9IGJnLmdldE9wYWNpdHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAotICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1RBVFVTX0JBUl9QQU5FTCwKLSAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU4KLSAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX05PX0xJTUlUUwotICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNLAotICAgICAgICAgICAgICAgIHBpeGVsRm9ybWF0KTsKLS8vICAgICAgICBscC50b2tlbiA9IG1TdGF0dXNCYXJWaWV3LmdldFdpbmRvd1Rva2VuKCk7Ci0gICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LlRPUCB8IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMOwotICAgICAgICBscC5zZXRUaXRsZSgiVHJhY2tpbmdWaWV3Iik7Ci0gICAgICAgIGxwLnkgPSBtVHJhY2tpbmdQb3NpdGlvbjsKLSAgICAgICAgbVRyYWNraW5nUGFyYW1zID0gbHA7Ci0KLSAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLmFkZFZpZXcobVRyYWNraW5nVmlldywgbHApOwotICAgIH0KLQotICAgIHZvaWQgb25UcmFja2luZ1ZpZXdBdHRhY2hlZCgpIHsKLSAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHA7Ci0gICAgICAgIGludCBwaXhlbEZvcm1hdDsKLSAgICAgICAgRHJhd2FibGUgYmc7Ci0KLSAgICAgICAgLy8vIC0tLS0tLS0tLS0gRXhwYW5kZWQgVmlldyAtLS0tLS0tLS0tLS0tLQotICAgICAgICBwaXhlbEZvcm1hdCA9IFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UOwotCi0gICAgICAgIGZpbmFsIGludCBkaXNwaCA9IG1EaXNwbGF5LmdldEhlaWdodCgpOwotICAgICAgICBscCA9IG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGxwLndpZHRoID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7Ci0gICAgICAgIGxwLmhlaWdodCA9IGdldEV4cGFuZGVkSGVpZ2h0KCk7Ci0gICAgICAgIGxwLnggPSAwOwotICAgICAgICBtVHJhY2tpbmdQb3NpdGlvbiA9IGxwLnkgPSAtZGlzcGg7IC8vIHN1ZmZpY2llbnRseSBsYXJnZSBuZWdhdGl2ZQotICAgICAgICBscC50eXBlID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMOwotICAgICAgICBscC5mbGFncyA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTgotICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfTk9fTElNSVRTCi0gICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9UT1VDSF9NT0RBTAotICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19ESVRIRVIKLSAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRTsKLSAgICAgICAgbHAuZm9ybWF0ID0gcGl4ZWxGb3JtYXQ7Ci0gICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LlRPUCB8IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMOwotICAgICAgICBscC5zZXRUaXRsZSgiU3RhdHVzQmFyRXhwYW5kZWQiKTsKLSAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobHApOwotICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0Rm9ybWF0KHBpeGVsRm9ybWF0KTsKLSAgICAgICAgbUV4cGFuZGVkUGFyYW1zID0gbHA7Ci0KLSAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnJlcXVlc3RGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX05PX1RJVExFKTsKLSAgICAgICAgbUV4cGFuZGVkRGlhbG9nLnNldENvbnRlbnRWaWV3KG1FeHBhbmRlZFZpZXcsCi0gICAgICAgICAgICAgICAgbmV3IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMoVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpKTsKLSAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEJhY2tncm91bmREcmF3YWJsZShudWxsKTsKLSAgICAgICAgbUV4cGFuZGVkRGlhbG9nLnNob3coKTsKLSAgICAgICAgRnJhbWVMYXlvdXQgaGFjayA9IChGcmFtZUxheW91dCltRXhwYW5kZWRWaWV3LmdldFBhcmVudCgpOwotICAgIH0KLQotICAgIHZvaWQgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KGJvb2xlYW4gdmlzaWJsZSwgaW50IGFuaW0pIHsKLSAgICAgICAgbURhdGVWaWV3LnNldFVwZGF0ZXModmlzaWJsZSk7Ci0gICAgICAgIG1EYXRlVmlldy5zZXRWaXNpYmlsaXR5KHZpc2libGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LklOVklTSUJMRSk7Ci0gICAgICAgIG1EYXRlVmlldy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShhbmltLCBudWxsKSk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eShib29sZWFuIHZpc2libGUsIGludCBhbmltKSB7Ci0gICAgICAgIGludCBvbGQgPSBtTm90aWZpY2F0aW9uSWNvbnMuZ2V0VmlzaWJpbGl0eSgpOwotICAgICAgICBpbnQgdiA9IHZpc2libGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LklOVklTSUJMRTsKLSAgICAgICAgaWYgKG9sZCAhPSB2KSB7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuc2V0VmlzaWJpbGl0eSh2KTsKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29ucy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShhbmltLCBudWxsKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhpbnQgZXhwYW5kZWRQb3NpdGlvbikgewotICAgICAgICBpZiAoU1BFVykgewotICAgICAgICAgICAgU2xvZy5kKFRBRywgInVwZGF0ZUV4cGFuZGVkVmlld1BvcyBiZWZvcmUgZXhwYW5kZWRQb3NpdGlvbj0iICsgZXhwYW5kZWRQb3NpdGlvbgotICAgICAgICAgICAgICAgICAgICArICIgbVRyYWNraW5nUGFyYW1zLnk9IiAKLSAgICAgICAgICAgICAgICAgICAgKyAoKG1UcmFja2luZ1BhcmFtcyA9PSBudWxsKSA/ICI/Pz8iIDogbVRyYWNraW5nUGFyYW1zLnkpCi0gICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tpbmdQb3NpdGlvbj0iICsgbVRyYWNraW5nUG9zaXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGggPSBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKTsKLSAgICAgICAgaW50IGRpc3BoID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIGV4cGFuZGVkIHZpZXcgaXMgbm90IHZpc2libGUsIG1ha2Ugc3VyZSB0aGV5J3JlIHN0aWxsIG9mZiBzY3JlZW4uCi0gICAgICAgIC8vIE1heWJlIHRoZSB2aWV3IHdhcyByZXNpemVkLgotICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKLSAgICAgICAgICAgIGlmIChtVHJhY2tpbmdWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtVHJhY2tpbmdQb3NpdGlvbiA9IC1kaXNwaDsKLSAgICAgICAgICAgICAgICBpZiAobVRyYWNraW5nUGFyYW1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRyYWNraW5nUGFyYW1zLnkgPSBtVHJhY2tpbmdQb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLnVwZGF0ZVZpZXdMYXlvdXQobVRyYWNraW5nVmlldywgbVRyYWNraW5nUGFyYW1zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUV4cGFuZGVkUGFyYW1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IC1kaXNwaDsKLSAgICAgICAgICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdHJhY2tpbmcgdmlldy4uLgotICAgICAgICBpbnQgcG9zOwotICAgICAgICBpZiAoZXhwYW5kZWRQb3NpdGlvbiA9PSBFWFBBTkRFRF9GVUxMX09QRU4pIHsKLSAgICAgICAgICAgIHBvcyA9IGg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZXhwYW5kZWRQb3NpdGlvbiA9PSBFWFBBTkRFRF9MRUFWRV9BTE9ORSkgewotICAgICAgICAgICAgcG9zID0gbVRyYWNraW5nUG9zaXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZXhwYW5kZWRQb3NpdGlvbiA8PSBkaXNwaCkgewotICAgICAgICAgICAgICAgIHBvcyA9IGV4cGFuZGVkUG9zaXRpb247Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBvcyA9IGRpc3BoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcG9zIC09IGRpc3BoLWg7Ci0gICAgICAgIH0KLSAgICAgICAgbVRyYWNraW5nUG9zaXRpb24gPSBtVHJhY2tpbmdQYXJhbXMueSA9IHBvczsKLSAgICAgICAgbVRyYWNraW5nUGFyYW1zLmhlaWdodCA9IGRpc3BoLWg7Ci0gICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS51cGRhdGVWaWV3TGF5b3V0KG1UcmFja2luZ1ZpZXcsIG1UcmFja2luZ1BhcmFtcyk7Ci0KLSAgICAgICAgaWYgKG1FeHBhbmRlZFBhcmFtcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2xvc2VWaWV3LmdldExvY2F0aW9uSW5XaW5kb3cobVBvc2l0aW9uVG1wKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBjbG9zZVBvcyA9IG1Qb3NpdGlvblRtcFsxXTsKLQotICAgICAgICAgICAgbUV4cGFuZGVkQ29udGVudHMuZ2V0TG9jYXRpb25JbldpbmRvdyhtUG9zaXRpb25UbXApOwotICAgICAgICAgICAgZmluYWwgaW50IGNvbnRlbnRzQm90dG9tID0gbVBvc2l0aW9uVG1wWzFdICsgbUV4cGFuZGVkQ29udGVudHMuZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gcG9zICsgbVRyYWNraW5nVmlldy5nZXRIZWlnaHQoKQotICAgICAgICAgICAgICAgICAgICAtIChtVHJhY2tpbmdQYXJhbXMuaGVpZ2h0LWNsb3NlUG9zKSAtIGNvbnRlbnRzQm90dG9tOwotICAgICAgICAgICAgaW50IG1heCA9IGg7Ci0gICAgICAgICAgICBpZiAobUV4cGFuZGVkUGFyYW1zLnkgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IG1heDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBtaW4gPSBtVHJhY2tpbmdQb3NpdGlvbjsKLSAgICAgICAgICAgIGlmIChtRXhwYW5kZWRQYXJhbXMueSA8IG1pbikgewotICAgICAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gbWluOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29sZWFuIHZpc2libGUgPSAobVRyYWNraW5nUG9zaXRpb24gKyBtVHJhY2tpbmdWaWV3LmdldEhlaWdodCgpKSA+IGg7Ci0gICAgICAgICAgICBpZiAoIXZpc2libGUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY29udGVudHMgYXJlbid0IHZpc2libGUsIG1vdmUgdGhlIGV4cGFuZGVkIHZpZXcgd2F5IG9mZiBzY3JlZW4KLSAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSB3aW5kb3cgaXRzZWxmIGV4dGVuZHMgYmVsb3cgdGhlIGNvbnRlbnQgdmlldy4KLSAgICAgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IC1kaXNwaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7Ci0KLSAgICAgICAgICAgIC8vIEFzIGxvbmcgYXMgdGhpcyBpc24ndCBqdXN0IGEgcmVwb3NpdGlvbmluZyB0aGF0J3Mgbm90IHN1cHBvc2VkIHRvIGFmZmVjdAotICAgICAgICAgICAgLy8gdGhlIHVzZXIncyBwZXJjZXB0aW9uIG9mIHdoYXQncyBzaG93aW5nLCBjYWxsIHRvIHNheSB0aGF0IHRoZSB2aXNpYmlsaXR5Ci0gICAgICAgICAgICAvLyBoYXMgY2hhbmdlZC4gKE90aGVyd2lzZSwgc29tZW9uZSBlbHNlIHdpbGwgY2FsbCB0byBkbyB0aGF0KS4KLSAgICAgICAgICAgIGlmIChleHBhbmRlZFBvc2l0aW9uICE9IEVYUEFOREVEX0xFQVZFX0FMT05FKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJ1cGRhdGVFeHBhbmRlZFZpZXdQb3MgdmlzaWJpbGl0eUNoYW5nZWQoIiArIHZpc2libGUgKyAiKSIpOwotICAgICAgICAgICAgICAgIHZpc2liaWxpdHlDaGFuZ2VkKHZpc2libGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFNQRVcpIHsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJ1cGRhdGVFeHBhbmRlZFZpZXdQb3MgYWZ0ZXIgIGV4cGFuZGVkUG9zaXRpb249IiArIGV4cGFuZGVkUG9zaXRpb24KLSAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2luZ1BhcmFtcy55PSIgKyBtVHJhY2tpbmdQYXJhbXMueQotICAgICAgICAgICAgICAgICAgICArICIgbVRyYWNraW5nUG9zaXRpb249IiArIG1UcmFja2luZ1Bvc2l0aW9uCi0gICAgICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWRQYXJhbXMueT0iICsgbUV4cGFuZGVkUGFyYW1zLnkKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZFBhcmFtcy5oZWlnaHQ9IiArIG1FeHBhbmRlZFBhcmFtcy5oZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50IGdldEV4cGFuZGVkSGVpZ2h0KCkgewotICAgICAgICByZXR1cm4gbURpc3BsYXkuZ2V0SGVpZ2h0KCkgLSBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKSAtIG1DbG9zZVZpZXcuZ2V0SGVpZ2h0KCk7Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVFeHBhbmRlZEhlaWdodCgpIHsKLSAgICAgICAgaWYgKG1FeHBhbmRlZFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmhlaWdodCA9IGdldEV4cGFuZGVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIExFRHMgYXJlIHR1cm5lZCBvKWZmIHdoZW4gdGhlIG5vdGlmaWNhdGlvbiBwYW5lbCBpcyBzaG93biwgZXZlbiBqdXN0IGEgbGl0dGxlIGJpdC4KLSAgICAgKiBUaGlzIHdhcyBhZGRlZCBsYXN0LW1pbnV0ZSBhbmQgaXMgaW5jb25zaXN0ZW50IHdpdGggdGhlIHdheSB0aGUgcmVzdCBvZiB0aGUgbm90aWZpY2F0aW9ucwotICAgICAqIGFyZSBoYW5kbGVkLCBiZWNhdXNlIHRoZSBub3RpZmljYXRpb24gaXNuJ3QgcmVhbGx5IGNhbmNlbGxlZC4gIFRoZSBsaWdodHMgYXJlIGp1c3QKLSAgICAgKiB0dXJuZWQgb2ZmLiAgSWYgYW55IG90aGVyIG5vdGlmaWNhdGlvbnMgaGFwcGVuLCB0aGUgbGlnaHRzIHdpbGwgdHVybiBiYWNrIG9uLiAgU3RldmUgc2F5cwotICAgICAqIHRoaXMgaXMgd2hhdCBoZSB3YW50cy4gKHNlZSBidWcgMTEzMTQ2MSkKLSAgICAgKi8KLSAgICB2b2lkIHZpc2liaWxpdHlDaGFuZ2VkKGJvb2xlYW4gdmlzaWJsZSkgewotICAgICAgICBpZiAobVBhbmVsU2xpZ2h0bHlWaXNpYmxlICE9IHZpc2libGUpIHsKLSAgICAgICAgICAgIG1QYW5lbFNsaWdodGx5VmlzaWJsZSA9IHZpc2libGU7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uUGFuZWxSZXZlYWxlZCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gV29uJ3QgZmFpbCB1bmxlc3MgdGhlIHdvcmxkIGhhcyBlbmRlZC4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcGVyZm9ybURpc2FibGVBY3Rpb25zKGludCBuZXQpIHsKLSAgICAgICAgaW50IG9sZCA9IG1EaXNhYmxlZDsKLSAgICAgICAgaW50IGRpZmYgPSBuZXQgXiBvbGQ7Ci0gICAgICAgIG1EaXNhYmxlZCA9IG5ldDsKLQotICAgICAgICAvLyBhY3QgYWNjb3JkaW5nbHkKLSAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgewotICAgICAgICAgICAgaWYgKChuZXQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfRVhQQU5EOiB5ZXMiKTsKLSAgICAgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IHllcyIpOwotICAgICAgICAgICAgICAgIGlmIChtVGlja2luZykgewotICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIG1UaWNrZXIuaGFsdCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KGZhbHNlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9vdXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiBubyIpOwotICAgICAgICAgICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVI6ICIKLSAgICAgICAgICAgICAgICArICgoKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICA/ICJ5ZXMiIDogIm5vIikpOwotICAgICAgICAgICAgaWYgKG1UaWNraW5nICYmIChuZXQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgewotICAgICAgICAgICAgICAgIG1UaWNrZXIuaGFsdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtQ2xlYXJCdXR0b25MaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25DbGVhckFsbE5vdGlmaWNhdGlvbnMoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQgaWYgd2UncmUgaGVyZS4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbUJyb2FkY2FzdFJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOwotICAgICAgICAgICAgaWYgKEludGVudC5BQ1RJT05fQ0xPU0VfU1lTVEVNX0RJQUxPR1MuZXF1YWxzKGFjdGlvbikKLSAgICAgICAgICAgICAgICAgICAgfHwgSW50ZW50LkFDVElPTl9TQ1JFRU5fT0ZGLmVxdWFscyhhY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChJbnRlbnQuQUNUSU9OX0NPTkZJR1VSQVRJT05fQ0hBTkdFRC5lcXVhbHMoYWN0aW9uKSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVJlc291cmNlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIFJlbG9hZCBzb21lIG9mIG91ciByZXNvdXJjZXMgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzLgotICAgICAqCi0gICAgICogV2UgZG9uJ3QgcmVsb2FkIGV2ZXJ5dGhpbmcgd2hlbiB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIC0tIHdlIHByb2JhYmx5Ci0gICAgICogc2hvdWxkLCBidXQgZ2V0dGluZyB0aGF0IHNtb290aCBpcyB0b3VnaC4gIFNvbWVkYXkgd2UnbGwgZml4IHRoYXQuICBJbiB0aGUKLSAgICAgKiBtZWFudGltZSwganVzdCB1cGRhdGUgdGhlIHRoaW5ncyB0aGF0IHdlIGtub3cgY2hhbmdlLgotICAgICAqLwotICAgIHZvaWQgdXBkYXRlUmVzb3VyY2VzKCkgewotICAgICAgICBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7Ci0KLSAgICAgICAgbUNsZWFyQnV0dG9uLnNldFRleHQoZ2V0VGV4dChSLnN0cmluZy5zdGF0dXNfYmFyX2NsZWFyX2FsbF9idXR0b24pKTsKLSAgICAgICAgbU9uZ29pbmdUaXRsZS5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuc3RhdHVzX2Jhcl9vbmdvaW5nX2V2ZW50c190aXRsZSkpOwotICAgICAgICBtTGF0ZXN0VGl0bGUuc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfbGF0ZXN0X2V2ZW50c190aXRsZSkpOwotICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUuc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfbm9fbm90aWZpY2F0aW9uc190aXRsZSkpOwotCi0gICAgICAgIG1FZGdlQm9yZGVyID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLnN0YXR1c19iYXJfZWRnZV9pZ25vcmUpOwotCi0gICAgICAgIGlmIChmYWxzZSkgU2xvZy52KFRBRywgInVwZGF0ZVJlc291cmNlcyIpOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gdHJhY2luZwotICAgIC8vCi0KLSAgICB2b2lkIHBvc3RTdGFydFRyYWNpbmcoKSB7Ci0gICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG1TdGFydFRyYWNpbmcsIDMwMDApOwotICAgIH0KLQotICAgIHZvaWQgdmlicmF0ZSgpIHsKLSAgICAgICAgYW5kcm9pZC5vcy5WaWJyYXRvciB2aWIgPSAoYW5kcm9pZC5vcy5WaWJyYXRvcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVklCUkFUT1JfU0VSVklDRSk7Ci0gICAgICAgIHZpYi52aWJyYXRlKDI1MCk7Ci0gICAgfQotCi0gICAgUnVubmFibGUgbVN0YXJ0VHJhY2luZyA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgdmlicmF0ZSgpOwotICAgICAgICAgICAgU3lzdGVtQ2xvY2suc2xlZXAoMjUwKTsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJzdGFydFRyYWNpbmciKTsKLSAgICAgICAgICAgIGFuZHJvaWQub3MuRGVidWcuc3RhcnRNZXRob2RUcmFjaW5nKCIvZGF0YS9zdGF0dXNiYXItdHJhY2VzL3RyYWNlIik7Ci0gICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChtU3RvcFRyYWNpbmcsIDEwMDAwKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBSdW5uYWJsZSBtU3RvcFRyYWNpbmcgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGFuZHJvaWQub3MuRGVidWcuc3RvcE1ldGhvZFRyYWNpbmcoKTsKLSAgICAgICAgICAgIFNsb2cuZChUQUcsICJzdG9wVHJhY2luZyIpOwotICAgICAgICAgICAgdmlicmF0ZSgpOwotICAgICAgICB9Ci0gICAgfTsKIH0KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJWaWV3LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclZpZXcuamF2YQppbmRleCAxZTE0MGI5Li4yMGZjNDFmIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclZpZXcuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclZpZXcuamF2YQpAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKQEAgLTM0LDcgKzM1LDcgQEAKIAogICAgIHN0YXRpYyBmaW5hbCBpbnQgRElNX0FOSU1fVElNRSA9IDQwMDsKICAgICAKLSAgICBTdGF0dXNCYXJTZXJ2aWNlIG1TZXJ2aWNlOworICAgIFBob25lU3RhdHVzQmFyU2VydmljZSBtU2VydmljZTsKICAgICBib29sZWFuIG1UcmFja2luZzsKICAgICBpbnQgbVN0YXJ0WCwgbVN0YXJ0WTsKICAgICBWaWV3R3JvdXAgbU5vdGlmaWNhdGlvbkljb25zOwpAQCAtNDYsNiArNDcsOSBAQAogICAgIGludCBtU3RhcnRBbHBoYSA9IDAsIG1FbmRBbHBoYSA9IDA7CiAgICAgbG9uZyBtRW5kVGltZSA9IDA7CiAKKyAgICBSZWN0IG1CdXR0b25Cb3VuZHMgPSBuZXcgUmVjdCgpOworICAgIGJvb2xlYW4gbUNhcHR1cmluZ0V2ZW50cyA9IHRydWU7CisKICAgICBwdWJsaWMgU3RhdHVzQmFyVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewogICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CiAgICAgfQpAQCAtOTQsNyArOTgsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uU2l6ZUNoYW5nZWQoaW50IHcsIGludCBoLCBpbnQgb2xkdywgaW50IG9sZGgpIHsKICAgICAgICAgc3VwZXIub25TaXplQ2hhbmdlZCh3LCBoLCBvbGR3LCBvbGRoKTsKLSAgICAgICAgbVNlcnZpY2UudXBkYXRlRXhwYW5kZWRWaWV3UG9zKFN0YXR1c0JhclNlcnZpY2UuRVhQQU5ERURfTEVBVkVfQUxPTkUpOworICAgICAgICBtU2VydmljZS51cGRhdGVFeHBhbmRlZFZpZXdQb3MoUGhvbmVTdGF0dXNCYXJTZXJ2aWNlLkVYUEFOREVEX0xFQVZFX0FMT05FKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE3Nyw2ICsxODEsOSBAQAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICBpZiAoIW1DYXB0dXJpbmdFdmVudHMpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgIT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKICAgICAgICAgICAgIG1TZXJ2aWNlLmludGVyY2VwdFRvdWNoRXZlbnQoZXZlbnQpOwogICAgICAgICB9CkBAIC0xODUsNiArMTkyLDEzIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbkludGVyY2VwdFRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKSB7CisgICAgICAgICAgICBpZiAobUJ1dHRvbkJvdW5kcy5jb250YWlucygoaW50KWV2ZW50LmdldFgoKSwgKGludClldmVudC5nZXRZKCkpKSB7CisgICAgICAgICAgICAgICAgbUNhcHR1cmluZ0V2ZW50cyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQ2FwdHVyaW5nRXZlbnRzID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmludGVyY2VwdFRvdWNoRXZlbnQoZXZlbnQpCiAgICAgICAgICAgICAgICAgPyB0cnVlIDogc3VwZXIub25JbnRlcmNlcHRUb3VjaEV2ZW50KGV2ZW50KTsKICAgICB9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RpY2tlci5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UaWNrZXIuamF2YQppbmRleCAzYTY5N2E2Li5lN2IwNTA5IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RpY2tlci5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyLmphdmEKQEAgLTE0MSw3ICsxNDEsNyBAQAogICAgICAgICB9CiAgICAgfTsKIAotICAgIFRpY2tlcihDb250ZXh0IGNvbnRleHQsIFN0YXR1c0JhclZpZXcgc2IpIHsKKyAgICBwdWJsaWMgVGlja2VyKENvbnRleHQgY29udGV4dCwgVmlldyBzYikgewogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1UaWNrZXJWaWV3ID0gc2IuZmluZFZpZXdCeUlkKFIuaWQudGlja2VyKTsKIApAQCAtMTYzLDcgKzE2Myw3IEBACiAgICAgfQogCiAKLSAgICB2b2lkIGFkZEVudHJ5KFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuKSB7CisgICAgcHVibGljIHZvaWQgYWRkRW50cnkoU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4pIHsKICAgICAgICAgaW50IGluaXRpYWxDb3VudCA9IG1TZWdtZW50cy5zaXplKCk7CiAKICAgICAgICAgLy8gSWYgd2hhdCdzIGJlaW5nIGRpc3BsYXllZCBoYXMgdGhlIHNhbWUgdGV4dCBhbmQgaWNvbiwganVzdCBkcm9wIGl0CkBAIC0yMTIsNyArMjEyLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHZvaWQgcmVtb3ZlRW50cnkoU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4pIHsKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVFbnRyeShTdGF0dXNCYXJOb3RpZmljYXRpb24gbikgewogICAgICAgICBmb3IgKGludCBpPW1TZWdtZW50cy5zaXplKCktMTsgaT49MDsgaS0tKSB7CiAgICAgICAgICAgICBTZWdtZW50IHNlZyA9IG1TZWdtZW50cy5nZXQoaSk7CiAgICAgICAgICAgICBpZiAobi5pZCA9PSBzZWcubm90aWZpY2F0aW9uLmlkICYmIG4ucGtnLmVxdWFscyhzZWcubm90aWZpY2F0aW9uLnBrZykpIHsKQEAgLTIyMSwxMyArMjIxLDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICB2b2lkIGhhbHQoKSB7CisgICAgcHVibGljIHZvaWQgaGFsdCgpIHsKICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1BZHZhbmNlVGlja2VyKTsKICAgICAgICAgbVNlZ21lbnRzLmNsZWFyKCk7CiAgICAgICAgIHRpY2tlckhhbHRpbmcoKTsKICAgICB9CiAKLSAgICB2b2lkIHJlZmxvd1RleHQoKSB7CisgICAgcHVibGljIHZvaWQgcmVmbG93VGV4dCgpIHsKICAgICAgICAgaWYgKG1TZWdtZW50cy5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICBTZWdtZW50IHNlZyA9IG1TZWdtZW50cy5nZXQoMCk7CiAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IHNlZy5nZXRUZXh0KCk7CkBAIC0yNjYsOCArMjY2LDggQEAKICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobUFkdmFuY2VUaWNrZXIsIFRJQ0tFUl9TRUdNRU5UX0RFTEFZKTsKICAgICB9CiAKLSAgICBhYnN0cmFjdCB2b2lkIHRpY2tlclN0YXJ0aW5nKCk7Ci0gICAgYWJzdHJhY3Qgdm9pZCB0aWNrZXJEb25lKCk7Ci0gICAgYWJzdHJhY3Qgdm9pZCB0aWNrZXJIYWx0aW5nKCk7CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdGlja2VyU3RhcnRpbmcoKTsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0aWNrZXJEb25lKCk7CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdGlja2VySGFsdGluZygpOwogfQogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RpY2tlclZpZXcuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyVmlldy5qYXZhCmluZGV4IDk3NDlhZTQuLjgxNDA4MTEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyVmlldy5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyVmlldy5qYXZhCkBAIC0zNCw1ICszNCw5IEBACiAgICAgICAgIHN1cGVyLm9uU2l6ZUNoYW5nZWQodywgaCwgb2xkdywgb2xkaCk7CiAgICAgICAgIG1UaWNrZXIucmVmbG93VGV4dCgpOwogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpY2tlcihUaWNrZXIgdCkgeworICAgICAgICBtVGlja2VyID0gdDsKKyAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVHJhY2tpbmdWaWV3LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RyYWNraW5nVmlldy5qYXZhCmluZGV4IDkxMDhlZWUuLmM1OWViNmEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVHJhY2tpbmdWaWV3LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UcmFja2luZ1ZpZXcuamF2YQpAQCAtMjYsNyArMjYsNyBAQAogCiBwdWJsaWMgY2xhc3MgVHJhY2tpbmdWaWV3IGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKICAgICBmaW5hbCBEaXNwbGF5IG1EaXNwbGF5OwotICAgIFN0YXR1c0JhclNlcnZpY2UgbVNlcnZpY2U7CisgICAgUGhvbmVTdGF0dXNCYXJTZXJ2aWNlIG1TZXJ2aWNlOwogICAgIGJvb2xlYW4gbVRyYWNraW5nOwogICAgIGludCBtU3RhcnRYLCBtU3RhcnRZOwogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9Ob3RpZmljYXRpb25JY29uQXJlYS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvTm90aWZpY2F0aW9uSWNvbkFyZWEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzdkNzRjMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L05vdGlmaWNhdGlvbkljb25BcmVhLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOworCisKK3B1YmxpYyBjbGFzcyBOb3RpZmljYXRpb25JY29uQXJlYSBleHRlbmRzIExpbmVhckxheW91dCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOb3RpZmljYXRpb25JY29uQXJlYSI7CisKKyAgICBJY29uTGF5b3V0IG1JY29uTGF5b3V0OworICAgIERyYWdnZXJWaWV3IG1EcmFnZ2VyVmlldzsKKworICAgIHB1YmxpYyBOb3RpZmljYXRpb25JY29uQXJlYShDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisKKyAgICAgICAgbUljb25MYXlvdXQgPSAoSWNvbkxheW91dClmaW5kVmlld0J5SWQoUi5pZC5pY29ucyk7CisgICAgICAgIG1EcmFnZ2VyVmlldyA9IChEcmFnZ2VyVmlldykgZmluZFZpZXdCeUlkKFIuaWQuaGFuZGxlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgSWNvbkxheW91dCBleHRlbmRzIExpbmVhckxheW91dCB7CisgICAgICAgIHB1YmxpYyBJY29uTGF5b3V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgRHJhZ2dlclZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHVibGljIERyYWdnZXJWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L05vdGlmaWNhdGlvblBhbmVsLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9Ob3RpZmljYXRpb25QYW5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZTBhMTYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9Ob3RpZmljYXRpb25QYW5lbC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKKworcHVibGljIGNsYXNzIE5vdGlmaWNhdGlvblBhbmVsIGV4dGVuZHMgTGluZWFyTGF5b3V0IGltcGxlbWVudHMgU3RhdHVzQmFyUGFuZWwgeworCisgICAgcHVibGljIE5vdGlmaWNhdGlvblBhbmVsKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOworICAgIH0KKworICAgIHB1YmxpYyBOb3RpZmljYXRpb25QYW5lbChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNJbkNvbnRlbnRBcmVhKGludCB4LCBpbnQgeSkgeworICAgICAgICBmaW5hbCBpbnQgbCA9IGdldFBhZGRpbmdMZWZ0KCk7CisgICAgICAgIGZpbmFsIGludCByID0gZ2V0V2lkdGgoKSAtIGdldFBhZGRpbmdSaWdodCgpOworICAgICAgICBmaW5hbCBpbnQgdCA9IGdldFBhZGRpbmdUb3AoKTsKKyAgICAgICAgZmluYWwgaW50IGIgPSBnZXRIZWlnaHQoKSAtIGdldFBhZGRpbmdCb3R0b20oKTsKKyAgICAgICAgcmV0dXJuIHggPj0gbCAmJiB4IDwgciAmJiB5ID49IHQgJiYgeSA8IGI7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9TdGF0dXNCYXJQYW5lbC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvU3RhdHVzQmFyUGFuZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmEwMWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvU3RhdHVzQmFyUGFuZWwuamF2YQpAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0OworCitwdWJsaWMgaW50ZXJmYWNlIFN0YXR1c0JhclBhbmVsIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luQ29udGVudEFyZWEoaW50IHgsIGludCB5KTsKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1N5c3RlbVBhbmVsLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9TeXN0ZW1QYW5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZjViZTYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9TeXN0ZW1QYW5lbC5qYXZhCkBAIC0wLDAgKzEsNzEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TdGF0dXNCYXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaUNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JUG93ZXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVTdGF0ZUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TaWduYWxTdHJlbmd0aDsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXJJbXBsOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNjcm9sbFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFN3aXRjaGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ2FyZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255SW50ZW50czsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYS5FcmlJbmZvOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jZG1hLlR0eUludGVudDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci4qOworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7CisKK3B1YmxpYyBjbGFzcyBTeXN0ZW1QYW5lbCBleHRlbmRzIExpbmVhckxheW91dCBpbXBsZW1lbnRzIFN0YXR1c0JhclBhbmVsIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN5c3RlbVBhbmVsIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gVGFibGV0U3RhdHVzQmFyU2VydmljZS5ERUJVRzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1NJR05BTCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTklNVU1fQkFDS0xJR0hUID0gYW5kcm9pZC5vcy5Qb3dlci5CUklHSFRORVNTX0RJTSArIDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWElNVU1fQkFDS0xJR0hUID0gYW5kcm9pZC5vcy5Qb3dlci5CUklHSFRORVNTX09OOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JBQ0tMSUdIVCA9IChpbnQpIChhbmRyb2lkLm9zLlBvd2VyLkJSSUdIVE5FU1NfT04gKiAwLjRmKTsKKworICAgIHByaXZhdGUgVGFibGV0U3RhdHVzQmFyU2VydmljZSBtQmFyOworICAgIHByaXZhdGUgYm9vbGVhbiBtQWlycGxhbmVNb2RlOworCisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtQnJpZ2h0bmVzc0J1dHRvbjsKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1Tb3VuZEJ1dHRvbjsKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1PcmllbnRhdGlvbkJ1dHRvbjsKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1BaXJwbGFuZUJ1dHRvbjsKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1HcHNCdXR0b247CisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtQmx1ZXRvb3RoQnV0dG9uOworCisgICAgcHJpdmF0ZSBJbWFnZVZpZXcgbUJhdHRlcnlNZXRlcjsKKyAgICBwcml2YXRlIEltYWdlVmlldyBtU2lnbmFsTWV0ZXI7CisKKyAgICBwcml2YXRlIFRleHRWaWV3IG1CYXR0ZXJ5VGV4dDsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1TaWduYWxUZXh0OworCisgICAgcHJpdmF0ZSBmaW5hbCBBdWRpb01hbmFnZXIgbUF1ZGlvTWFuYWdlcjsKKyAgICBwcml2YXRlIGZpbmFsIFdpZmlNYW5hZ2VyIG1XaWZpTWFuYWdlcjsKKyAgICBwcml2YXRlIGZpbmFsIFRlbGVwaG9ueU1hbmFnZXIgbVBob25lOworICAgIHByaXZhdGUgZmluYWwgQmx1ZXRvb3RoQWRhcHRlciBtQmx1ZXRvb3RoQWRhcHRlcjsKKworICAgIC8vIHN0YXRlIHRyYWNrZXJzIGZvciB0ZWxlcGhvbnkgY29kZQorICAgIEljY0NhcmQuU3RhdGUgbVNpbVN0YXRlID0gSWNjQ2FyZC5TdGF0ZS5SRUFEWTsKKyAgICBpbnQgbVBob25lU3RhdGUgPSBUZWxlcGhvbnlNYW5hZ2VyLkNBTExfU1RBVEVfSURMRTsKKyAgICBpbnQgbURhdGFTdGF0ZSA9IFRlbGVwaG9ueU1hbmFnZXIuREFUQV9ESVNDT05ORUNURUQ7CisgICAgU2VydmljZVN0YXRlIG1TZXJ2aWNlU3RhdGU7CisgICAgU2lnbmFsU3RyZW5ndGggbVNpZ25hbFN0cmVuZ3RoOworCisgICAgLy8gc3RhdGUgZm9yIHRoZSBtZXRlcnMKKyAgICBib29sZWFuIG1XaWZpRW5hYmxlZCwgbVdpZmlDb25uZWN0ZWQ7CisgICAgaW50IG1XaWZpTGV2ZWw7CisgICAgU3RyaW5nIG1XaWZpU3NpZDsKKworICAgIGJvb2xlYW4gbURhdGFFbmFibGVkLCBtRGF0YUNvbm5lY3RlZCwgbURhdGFSb2FtaW5nOworICAgIGludCBtRGF0YUxldmVsOworCisgICAgcHVibGljIGJvb2xlYW4gaXNJbkNvbnRlbnRBcmVhKGludCB4LCBpbnQgeSkgeworICAgICAgICBmaW5hbCBpbnQgbCA9IGdldFBhZGRpbmdMZWZ0KCk7CisgICAgICAgIGZpbmFsIGludCByID0gZ2V0V2lkdGgoKSAtIGdldFBhZGRpbmdSaWdodCgpOworICAgICAgICBmaW5hbCBpbnQgdCA9IGdldFBhZGRpbmdUb3AoKTsKKyAgICAgICAgZmluYWwgaW50IGIgPSBnZXRIZWlnaHQoKSAtIGdldFBhZGRpbmdCb3R0b20oKTsKKyAgICAgICAgcmV0dXJuIHggPj0gbCAmJiB4IDwgciAmJiB5ID49IHQgJiYgeSA8IGI7CisgICAgfQorCisgICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOworICAgICAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgICAgIHJlZnJlc2hTb3VuZCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEludGVudC5BQ1RJT05fQkFUVEVSWV9DSEFOR0VEKSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZUJhdHRlcnkoaW50ZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhXaWZpTWFuYWdlci5SU1NJX0NIQU5HRURfQUNUSU9OKQorICAgICAgICAgICAgICAgICAgICB8fCBhY3Rpb24uZXF1YWxzKFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pCisgICAgICAgICAgICAgICAgICAgIHx8IGFjdGlvbi5lcXVhbHMoV2lmaU1hbmFnZXIuU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEX0FDVElPTikKKyAgICAgICAgICAgICAgICAgICAgfHwgYWN0aW9uLmVxdWFscyhXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZVdpZmlTdGF0ZShpbnRlbnQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKFRlbGVwaG9ueUludGVudHMuQUNUSU9OX1NJTV9TVEFURV9DSEFOR0VEKSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZVNpbVN0YXRlKGludGVudCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fU1RBVEVfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICByZWZyZXNoQmx1ZXRvb3RoKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHVwZGF0ZVNpbVN0YXRlKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgU3RyaW5nIHN0YXRlRXh0cmEgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoSWNjQ2FyZC5JTlRFTlRfS0VZX0lDQ19TVEFURSk7CisgICAgICAgIGlmIChJY2NDYXJkLklOVEVOVF9WQUxVRV9JQ0NfQUJTRU5ULmVxdWFscyhzdGF0ZUV4dHJhKSkgeworICAgICAgICAgICAgbVNpbVN0YXRlID0gSWNjQ2FyZC5TdGF0ZS5BQlNFTlQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoSWNjQ2FyZC5JTlRFTlRfVkFMVUVfSUNDX1JFQURZLmVxdWFscyhzdGF0ZUV4dHJhKSkgeworICAgICAgICAgICAgbVNpbVN0YXRlID0gSWNjQ2FyZC5TdGF0ZS5SRUFEWTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChJY2NDYXJkLklOVEVOVF9WQUxVRV9JQ0NfTE9DS0VELmVxdWFscyhzdGF0ZUV4dHJhKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvY2tlZFJlYXNvbiA9IGludGVudC5nZXRTdHJpbmdFeHRyYShJY2NDYXJkLklOVEVOVF9LRVlfTE9DS0VEX1JFQVNPTik7CisgICAgICAgICAgICBpZiAoSWNjQ2FyZC5JTlRFTlRfVkFMVUVfTE9DS0VEX09OX1BJTi5lcXVhbHMobG9ja2VkUmVhc29uKSkgeworICAgICAgICAgICAgICAgIG1TaW1TdGF0ZSA9IEljY0NhcmQuU3RhdGUuUElOX1JFUVVJUkVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoSWNjQ2FyZC5JTlRFTlRfVkFMVUVfTE9DS0VEX09OX1BVSy5lcXVhbHMobG9ja2VkUmVhc29uKSkgeworICAgICAgICAgICAgICAgIG1TaW1TdGF0ZSA9IEljY0NhcmQuU3RhdGUuUFVLX1JFUVVJUkVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbVNpbVN0YXRlID0gSWNjQ2FyZC5TdGF0ZS5ORVRXT1JLX0xPQ0tFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TaW1TdGF0ZSA9IEljY0NhcmQuU3RhdGUuVU5LTk9XTjsKKyAgICAgICAgfQorICAgICAgICB1cGRhdGVEYXRhU3RhdGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNDZG1hKCkgeworICAgICAgICByZXR1cm4gKG1TaWduYWxTdHJlbmd0aCAhPSBudWxsKSAmJiAhbVNpZ25hbFN0cmVuZ3RoLmlzR3NtKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzRXZkbygpIHsKKyAgICAgICAgcmV0dXJuICggKG1TZXJ2aWNlU3RhdGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgJiYgKChtU2VydmljZVN0YXRlLmdldFJhZGlvVGVjaG5vbG9neSgpCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9FVkRPXzApCisgICAgICAgICAgICAgICAgICAgICB8fCAobVNlcnZpY2VTdGF0ZS5nZXRSYWRpb1RlY2hub2xvZ3koKQorICAgICAgICAgICAgICAgICAgICAgICAgPT0gU2VydmljZVN0YXRlLlJBRElPX1RFQ0hOT0xPR1lfRVZET19BKQorICAgICAgICAgICAgICAgICAgICAgfHwgKG1TZXJ2aWNlU3RhdGUuZ2V0UmFkaW9UZWNobm9sb2d5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgID09IFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZX0VWRE9fQikpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzU2VydmljZSgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgc3dpdGNoIChtU2VydmljZVN0YXRlLmdldFN0YXRlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNlcnZpY2VTdGF0ZS5TVEFURV9PVVRfT0ZfU0VSVklDRToKKyAgICAgICAgICAgICAgICBjYXNlIFNlcnZpY2VTdGF0ZS5TVEFURV9QT1dFUl9PRkY6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldENkbWFMZXZlbCgpIHsKKyAgICAgICAgaWYgKG1TaWduYWxTdHJlbmd0aCA9PSBudWxsKSByZXR1cm4gMDsKKyAgICAgICAgZmluYWwgaW50IGNkbWFEYm0gPSBtU2lnbmFsU3RyZW5ndGguZ2V0Q2RtYURibSgpOworICAgICAgICBmaW5hbCBpbnQgY2RtYUVjaW8gPSBtU2lnbmFsU3RyZW5ndGguZ2V0Q2RtYUVjaW8oKTsKKyAgICAgICAgaW50IGxldmVsRGJtID0gMDsKKyAgICAgICAgaW50IGxldmVsRWNpbyA9IDA7CisKKyAgICAgICAgaWYgKGNkbWFEYm0gPj0gLTc1KSBsZXZlbERibSA9IDQ7CisgICAgICAgIGVsc2UgaWYgKGNkbWFEYm0gPj0gLTg1KSBsZXZlbERibSA9IDM7CisgICAgICAgIGVsc2UgaWYgKGNkbWFEYm0gPj0gLTk1KSBsZXZlbERibSA9IDI7CisgICAgICAgIGVsc2UgaWYgKGNkbWFEYm0gPj0gLTEwMCkgbGV2ZWxEYm0gPSAxOworICAgICAgICBlbHNlIGxldmVsRGJtID0gMDsKKworICAgICAgICAvLyBFYy9JbyBhcmUgaW4gZEIqMTAKKyAgICAgICAgaWYgKGNkbWFFY2lvID49IC05MCkgbGV2ZWxFY2lvID0gNDsKKyAgICAgICAgZWxzZSBpZiAoY2RtYUVjaW8gPj0gLTExMCkgbGV2ZWxFY2lvID0gMzsKKyAgICAgICAgZWxzZSBpZiAoY2RtYUVjaW8gPj0gLTEzMCkgbGV2ZWxFY2lvID0gMjsKKyAgICAgICAgZWxzZSBpZiAoY2RtYUVjaW8gPj0gLTE1MCkgbGV2ZWxFY2lvID0gMTsKKyAgICAgICAgZWxzZSBsZXZlbEVjaW8gPSAwOworCisgICAgICAgIHJldHVybiAobGV2ZWxEYm0gPCBsZXZlbEVjaW8pID8gbGV2ZWxEYm0gOiBsZXZlbEVjaW87CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0RXZkb0xldmVsKCkgeworICAgICAgICBpZiAobVNpZ25hbFN0cmVuZ3RoID09IG51bGwpIHJldHVybiAwOworICAgICAgICBpbnQgZXZkb0RibSA9IG1TaWduYWxTdHJlbmd0aC5nZXRFdmRvRGJtKCk7CisgICAgICAgIGludCBldmRvU25yID0gbVNpZ25hbFN0cmVuZ3RoLmdldEV2ZG9TbnIoKTsKKyAgICAgICAgaW50IGxldmVsRXZkb0RibSA9IDA7CisgICAgICAgIGludCBsZXZlbEV2ZG9TbnIgPSAwOworCisgICAgICAgIGlmIChldmRvRGJtID49IC02NSkgbGV2ZWxFdmRvRGJtID0gNDsKKyAgICAgICAgZWxzZSBpZiAoZXZkb0RibSA+PSAtNzUpIGxldmVsRXZkb0RibSA9IDM7CisgICAgICAgIGVsc2UgaWYgKGV2ZG9EYm0gPj0gLTkwKSBsZXZlbEV2ZG9EYm0gPSAyOworICAgICAgICBlbHNlIGlmIChldmRvRGJtID49IC0xMDUpIGxldmVsRXZkb0RibSA9IDE7CisgICAgICAgIGVsc2UgbGV2ZWxFdmRvRGJtID0gMDsKKworICAgICAgICBpZiAoZXZkb1NuciA+PSA3KSBsZXZlbEV2ZG9TbnIgPSA0OworICAgICAgICBlbHNlIGlmIChldmRvU25yID49IDUpIGxldmVsRXZkb1NuciA9IDM7CisgICAgICAgIGVsc2UgaWYgKGV2ZG9TbnIgPj0gMykgbGV2ZWxFdmRvU25yID0gMjsKKyAgICAgICAgZWxzZSBpZiAoZXZkb1NuciA+PSAxKSBsZXZlbEV2ZG9TbnIgPSAxOworICAgICAgICBlbHNlIGxldmVsRXZkb1NuciA9IDA7CisKKyAgICAgICAgcmV0dXJuIChsZXZlbEV2ZG9EYm0gPCBsZXZlbEV2ZG9TbnIpID8gbGV2ZWxFdmRvRGJtIDogbGV2ZWxFdmRvU25yOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVEYXRhU3RhdGUoKSB7CisgICAgICAgIG1EYXRhQ29ubmVjdGVkID0gaGFzU2VydmljZSgpICYmIChtRGF0YVN0YXRlID09IFRlbGVwaG9ueU1hbmFnZXIuREFUQV9DT05ORUNURUQpOworCisgICAgICAgIGlmIChpc0NkbWEoKSkgeworICAgICAgICAgICAgLy8gdGhlc2UgZnVuY3Rpb25zIHJldHVybiBhIHZhbHVlIGZyb20gMCB0byA0LCBpbmNsdXNpdmUKKyAgICAgICAgICAgIGlmICgobVBob25lU3RhdGUgPT0gVGVsZXBob255TWFuYWdlci5DQUxMX1NUQVRFX0lETEUpICYmIGlzRXZkbygpKXsKKyAgICAgICAgICAgICAgICBtRGF0YUxldmVsID0gZ2V0RXZkb0xldmVsKCkgKiAyNTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbURhdGFMZXZlbCA9IGdldENkbWFMZXZlbCgpICogMjU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBHU00KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IGFzdSA9IChtU2lnbmFsU3RyZW5ndGggPT0gbnVsbCkgPyAwIDogbVNpZ25hbFN0cmVuZ3RoLmdldEdzbVNpZ25hbFN0cmVuZ3RoKCk7CisKKyAgICAgICAgICAgIC8vIGFzdSBvbiBbMCwzMV07IDk5ID0gdW5rbm93bgorICAgICAgICAgICAgLy8gQW5kcm9pZCBoYXMgaGlzdG9yaWNhbGx5IHNob3duIGFueXRoaW5nID49MTIgYXMgImZ1bGwiCisgICAgICAgICAgICAvLyBYWFg6IHR1bmUgdGhpcyBiYXNlZCBvbiBJbmR1c3RyeSBCZXN0IFByYWN0aWNlcyhUTSkKKyAgICAgICAgICAgIGlmIChhc3UgPD0gMiB8fCBhc3UgPT0gOTkpIG1EYXRhTGV2ZWwgPSAwOworICAgICAgICAgICAgZWxzZSBtRGF0YUxldmVsID0gKGludCkoKChmbG9hdClNYXRoLm1heChhc3UsIDE1KSAvIDE1KSAqIDEwMCk7CisKKyAgICAgICAgICAgIG1EYXRhUm9hbWluZyA9IG1QaG9uZS5pc05ldHdvcmtSb2FtaW5nKCk7CisKKyAgICAgICAgICAgIG1EYXRhQ29ubmVjdGVkID0gbURhdGFDb25uZWN0ZWQKKyAgICAgICAgICAgICAgICAmJiAobVNpbVN0YXRlID09IEljY0NhcmQuU3RhdGUuUkVBRFkgfHwgbVNpbVN0YXRlID09IEljY0NhcmQuU3RhdGUuVU5LTk9XTik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoREVCVUdfU0lHTkFMIHx8IERFQlVHKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlRGF0YVN0YXRlOiBjb25uZWN0ZWQ9IiArIG1EYXRhQ29ubmVjdGVkIAorICAgICAgICAgICAgICAgICAgICArICIgbGV2ZWw9IiArIG1EYXRhTGV2ZWwKKyAgICAgICAgICAgICAgICAgICAgKyAiIGlzRXZkbz0iICsgaXNFdmRvKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGlzQ2RtYT0iICsgaXNDZG1hKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1QaG9uZVN0YXRlPSIgKyBtUGhvbmVTdGF0ZQorICAgICAgICAgICAgICAgICAgICArICIgbURhdGFTdGF0ZT0iICsgbURhdGFTdGF0ZQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgcmVmcmVzaFNpZ25hbE1ldGVycygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVXaWZpU3RhdGUoSW50ZW50IGludGVudCkgeworICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlV2lmaVN0YXRlOiAiICsgaW50ZW50KTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOworICAgICAgICBmaW5hbCBib29sZWFuIHdhc0Nvbm5lY3RlZCA9IG1XaWZpQ29ubmVjdGVkOworCisgICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pKSB7CisgICAgICAgICAgICBtV2lmaUVuYWJsZWQgPSBpbnRlbnQuZ2V0SW50RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfV0lGSV9TVEFURSwKKyAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9VTktOT1dOKSA9PSBXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMRUQ7CisgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgZmluYWwgTmV0d29ya0luZm8gbmV0d29ya0luZm8gPSAoTmV0d29ya0luZm8pCisgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfTkVUV09SS19JTkZPKTsKKyAgICAgICAgICAgIG1XaWZpQ29ubmVjdGVkID0gbmV0d29ya0luZm8gIT0gbnVsbCAmJiBuZXR3b3JrSW5mby5pc0Nvbm5lY3RlZCgpOworICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoV2lmaU1hbmFnZXIuU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgZGV0YWlsZWRTdGF0ZSA9IFdpZmlJbmZvLmdldERldGFpbGVkU3RhdGVPZigKKyAgICAgICAgICAgICAgICAgICAgKFN1cHBsaWNhbnRTdGF0ZSlpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX05FV19TVEFURSkpOworICAgICAgICAgICAgbVdpZmlDb25uZWN0ZWQgPSBkZXRhaWxlZFN0YXRlID09IE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUuQ09OTkVDVEVEOworICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoV2lmaU1hbmFnZXIuUlNTSV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBuZXdSc3NpID0gaW50ZW50LmdldEludEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX05FV19SU1NJLCAtMjAwKTsKKyAgICAgICAgICAgIGludCBuZXdTaWduYWxMZXZlbCA9IFdpZmlNYW5hZ2VyLmNhbGN1bGF0ZVNpZ25hbExldmVsKG5ld1Jzc2ksIDEwMSk7CisgICAgICAgICAgICBtV2lmaUxldmVsID0gbVdpZmlDb25uZWN0ZWQgPyBuZXdTaWduYWxMZXZlbCA6IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVdpZmlDb25uZWN0ZWQgJiYgIXdhc0Nvbm5lY3RlZCkgeworICAgICAgICAgICAgV2lmaUluZm8gaW5mbyA9IG1XaWZpTWFuYWdlci5nZXRDb25uZWN0aW9uSW5mbygpOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJ1cGRhdGVXaWZpU3RhdGU6IGp1c3QgY29ubmVjdGVkOiBpbmZvPSIgKyBpbmZvKTsKKworICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGdyYWIgdGhlIGluaXRpYWwgc2lnbmFsIHN0cmVuZ3RoCisgICAgICAgICAgICAgICAgbVdpZmlMZXZlbCA9IFdpZmlNYW5hZ2VyLmNhbGN1bGF0ZVNpZ25hbExldmVsKGluZm8uZ2V0UnNzaSgpLCAxMDEpOworCisgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgU1NJRAorICAgICAgICAgICAgICAgIG1XaWZpU3NpZCA9IGluZm8uZ2V0U1NJRCgpOworICAgICAgICAgICAgICAgIGlmIChtV2lmaVNzaWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBPSywgaXQncyBub3QgaW4gdGhlIGNvbm5lY3Rpb25JbmZvOyB3ZSBoYXZlIHRvIGdvIGh1bnRpbmcgZm9yIGl0CisgICAgICAgICAgICAgICAgICAgIExpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+IG5ldHdvcmtzID0gbVdpZmlNYW5hZ2VyLmdldENvbmZpZ3VyZWROZXR3b3JrcygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uIG5ldCA6IG5ldHdvcmtzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV0Lm5ldHdvcmtJZCA9PSBpbmZvLmdldE5ldHdvcmtJZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZmlTc2lkID0gbmV0LlNTSUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZWZyZXNoU2lnbmFsTWV0ZXJzKCk7CisgICAgfQorCisgICAgLy8gZmlndXJlIG91dCB3aGF0IHRvIHNob3c6IGZpcnN0IHdpZmksIHRoZW4gM0csIHRoZW4gbm90aGluZworICAgIHZvaWQgcmVmcmVzaFNpZ25hbE1ldGVycygpIHsKKyAgICAgICAgaWYgKG1TaWduYWxNZXRlciA9PSBudWxsKSByZXR1cm47IC8vIG5vIFVJIHlldAorCisgICAgICAgIENvbnRleHQgY3R4dCA9IGdldENvbnRleHQoKTsKKworICAgICAgICBTdHJpbmcgdGV4dCA9IG51bGw7CisgICAgICAgIGludCBsZXZlbCA9IDA7CisKKyAgICAgICAgaWYgKG1XaWZpQ29ubmVjdGVkKSB7CisgICAgICAgICAgICBpZiAobVdpZmlTc2lkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gY3R4dC5nZXRTdHJpbmcoUi5zdHJpbmcuc3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl93aWZpX25vc3NpZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRleHQgPSBjdHh0LmdldFN0cmluZyhSLnN0cmluZy5zeXN0ZW1fcGFuZWxfc2lnbmFsX21ldGVyX3dpZmlfc3NpZF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWZpU3NpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZXZlbCA9IG1XaWZpTGV2ZWw7CisgICAgICAgIH0gZWxzZSBpZiAobURhdGFDb25uZWN0ZWQpIHsKKyAgICAgICAgICAgIHRleHQgPSBjdHh0LmdldFN0cmluZyhSLnN0cmluZy5zeXN0ZW1fcGFuZWxfc2lnbmFsX21ldGVyX2RhdGFfY29ubmVjdGVkKTsKKyAgICAgICAgICAgIGxldmVsID0gbURhdGFMZXZlbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRleHQgPSBjdHh0LmdldFN0cmluZyhSLnN0cmluZy5zeXN0ZW1fcGFuZWxfc2lnbmFsX21ldGVyX2Rpc2Nvbm5lY3RlZCk7CisgICAgICAgICAgICBsZXZlbCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBtU2lnbmFsTWV0ZXIuc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLnN5c2Jhcl9zaWduYWwpOworICAgICAgICBtU2lnbmFsTWV0ZXIuc2V0SW1hZ2VMZXZlbChsZXZlbCk7CisgICAgICAgIG1TaWduYWxUZXh0LnNldFRleHQodGV4dCk7CisKKyAgICAgICAgLy8gaGFjayBmb3Igbm93CisgICAgICAgIG1CYXIuc2V0U2lnbmFsTWV0ZXIobGV2ZWwsIG1XaWZpQ29ubmVjdGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCYXIoVGFibGV0U3RhdHVzQmFyU2VydmljZSBiYXIpIHsKKyAgICAgICAgbUJhciA9IGJhcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVCYXR0ZXJ5KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgZmluYWwgaW50IGxldmVsID0gaW50ZW50LmdldEludEV4dHJhKCJsZXZlbCIsIDApOworICAgICAgICBmaW5hbCBib29sZWFuIHBsdWdnZWQgPSBpbnRlbnQuZ2V0SW50RXh0cmEoInBsdWdnZWQiLCAwKSAhPSAwOworCisgICAgICAgIG1CYXR0ZXJ5TWV0ZXIuc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLnN5c2Jhcl9iYXR0ZXJ5KTsKKyAgICAgICAgbUJhdHRlcnlNZXRlci5zZXRJbWFnZUxldmVsKGxldmVsKTsKKyAgICAgICAgbUJhdHRlcnlUZXh0LnNldFRleHQoZ2V0Q29udGV4dCgpCisgICAgICAgICAgICAgICAgLmdldFN0cmluZyhSLnN0cmluZy5zeXN0ZW1fcGFuZWxfYmF0dGVyeV9tZXRlcl9mb3JtYXQsIGxldmVsKSk7CisKKyAgICAgICAgLy8gaGFjayBmb3Igbm93CisgICAgICAgIG1CYXIuc2V0QmF0dGVyeU1ldGVyKGxldmVsLCBwbHVnZ2VkKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN5c3RlbVBhbmVsKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOworICAgIH0KKworICAgIHB1YmxpYyBTeXN0ZW1QYW5lbChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7CisKKyAgICAgICAgLy8gZ2V0IG5vdGlmaWVkIG9mIHBob25lIHN0YXRlIGNoYW5nZXMKKyAgICAgICAgVGVsZXBob255TWFuYWdlciB0ZWxlcGhvbnlNYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAoVGVsZXBob255TWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVEVMRVBIT05ZX1NFUlZJQ0UpOworICAgICAgICB0ZWxlcGhvbnlNYW5hZ2VyLmxpc3RlbihtUGhvbmVTdGF0ZUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX1NFUlZJQ0VfU1RBVEUKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9TSUdOQUxfU1RSRU5HVEhTCisgICAgICAgICAgICAgICAgICAgICAgICB8IFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fQ0FMTF9TVEFURQorICAgICAgICAgICAgICAgICAgICAgICAgfCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0RBVEFfQ09OTkVDVElPTl9TVEFURQorICAgICAgICAgICAgICAgICAgICAgICAgfCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0RBVEFfQUNUSVZJVFkpOworCisgICAgICAgIC8vIHdpZmkgc3RhdHVzIGluZm8KKyAgICAgICAgbVdpZmlNYW5hZ2VyID0gKFdpZmlNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSUZJX1NFUlZJQ0UpOworICAgICAgICAKKyAgICAgICAgLy8gYXVkaW8gc3RhdHVzIAorICAgICAgICBtQXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFVRElPX1NFUlZJQ0UpOworCisgICAgICAgIC8vIG1vYmlsZSBkYXRhIAorICAgICAgICBtUGhvbmUgPSAoVGVsZXBob255TWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5URUxFUEhPTllfU0VSVklDRSk7CisKKyAgICAgICAgLy8gQmx1ZXRvb3RoCisgICAgICAgIG1CbHVldG9vdGhBZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKKyAgICAgICAgVGV4dFZpZXcgc2V0dGluZ3NCdXR0b24gPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc2V0dGluZ3NfYnV0dG9uKTsKKyAgICAgICAgc2V0dGluZ3NCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkobmV3IEludGVudChhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLkFDVElPTl9TRVRUSU5HUykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSykpOworICAgICAgICAgICAgICAgIG1CYXIuYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgICAgICB9fSk7CisKKyAgICAgICAgbUJyaWdodG5lc3NCdXR0b24gPSAoSW1hZ2VCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuYnJpZ2h0bmVzcyk7CisgICAgICAgIG1CcmlnaHRuZXNzQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIHJvdGF0ZUJyaWdodG5lc3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgbVNvdW5kQnV0dG9uID0gKEltYWdlQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLnNvdW5kKTsKKyAgICAgICAgbVNvdW5kQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIHNldFNpbGVudE1vZGUoIWdldFNpbGVudE1vZGUoKSk7CisgICAgICAgICAgICAgICAgbVNvdW5kQnV0dG9uLnNldEFscGhhKGdldFNpbGVudE1vZGUoKSA/IDB4N0YgOiAweEZGKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIG1PcmllbnRhdGlvbkJ1dHRvbiA9IChJbWFnZUJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5vcmllbnRhdGlvbik7CisgICAgICAgIG1PcmllbnRhdGlvbkJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChnZXRDb250ZXh0KCksICJPcmllbnRhdGlvbiBjb250cm9sIG5vdCBpbXBsZW1lbnRlZDsgcGxlYXNlIGFkanVzdCBuZWNrIGFuZ2xlLiIsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBtQWlycGxhbmVCdXR0b24gPSAoSW1hZ2VCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuYWlycGxhbmUpOworICAgICAgICBtQWlycGxhbmVCdXR0b24uc2V0QWxwaGEobUFpcnBsYW5lTW9kZSA/IDB4RkYgOiAweDdGKTsKKyAgICAgICAgbUFpcnBsYW5lQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gbmV3TW9kZSA9ICFnZXRBaXJwbGFuZU1vZGUoKTsKKyAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChnZXRDb250ZXh0KCksICJBdHRlbXB0aW5nIHRvIHR1cm4gIgorICAgICAgICAgICAgICAgICAgICArIChuZXdNb2RlID8gIm9uIiA6ICJvZmYiKSArICIgYWlycGxhbmUgbW9kZSAoZmxha3kpLiIsCisgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgICAgIHNldEFpcnBsYW5lTW9kZShuZXdNb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgbUdwc0J1dHRvbiA9IChJbWFnZUJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5ncHMpOworICAgICAgICBtR3BzQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIHRvZ2dsZUdwcygpOworICAgICAgICAgICAgICAgIHJlZnJlc2hHcHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgbUJsdWV0b290aEJ1dHRvbiA9IChJbWFnZUJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5ibHVldG9vdGgpOworICAgICAgICBtQmx1ZXRvb3RoQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIHRvZ2dsZUJsdWV0b290aCgpOworICAgICAgICAgICAgICAgIHJlZnJlc2hCbHVldG9vdGgoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgZm9yIGJyb2FkY2FzdHMKKyAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihBdWRpb01hbmFnZXIuUklOR0VSX01PREVfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fQkFUVEVSWV9DSEFOR0VEKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5TVVBQTElDQU5UX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5SU1NJX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9TSU1fU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgIGdldENvbnRleHQoKS5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlciwgZmlsdGVyKTsKKyAgICAgICAgCisgICAgICAgIG1CYXR0ZXJ5TWV0ZXIgPSAoSW1hZ2VWaWV3KWZpbmRWaWV3QnlJZChSLmlkLmJhdHRlcnlfbWV0ZXIpOworICAgICAgICBtQmF0dGVyeU1ldGVyLnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS5zeXNiYXJfYmF0dGVyeSk7CisgICAgICAgIG1CYXR0ZXJ5TWV0ZXIuc2V0SW1hZ2VMZXZlbCgwKTsKKyAgICAgICAgbVNpZ25hbE1ldGVyID0gKEltYWdlVmlldylmaW5kVmlld0J5SWQoUi5pZC5zaWduYWxfbWV0ZXIpOworICAgICAgICBtQmF0dGVyeU1ldGVyLnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS5zeXNiYXJfc2lnbmFsKTsKKyAgICAgICAgbUJhdHRlcnlNZXRlci5zZXRJbWFnZUxldmVsKDApOworCisgICAgICAgIG1CYXR0ZXJ5VGV4dCA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5iYXR0ZXJ5X2luZm8pOworICAgICAgICBtU2lnbmFsVGV4dCA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5zaWduYWxfaW5mbyk7CisKKyAgICAgICAgcmVmcmVzaFNpZ25hbE1ldGVycygpOworICAgICAgICByZWZyZXNoQmx1ZXRvb3RoKCk7CisgICAgICAgIHJlZnJlc2hHcHMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgZ2V0Q29udGV4dCgpLnVucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gICAgcHJpdmF0ZSBib29sZWFuIGlzQXV0b0JyaWdodG5lc3MoKSB7CisvLyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOworLy8gICAgICAgIHRyeSB7CisvLyAgICAgICAgICAgIElQb3dlck1hbmFnZXIgcG93ZXIgPSBJUG93ZXJNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoCisvLyAgICAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgicG93ZXIiKSk7CisvLyAgICAgICAgICAgIGlmIChwb3dlciAhPSBudWxsKSB7CisvLyAgICAgICAgICAgICAgICBpbnQgYnJpZ2h0bmVzc01vZGUgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisvLyAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFKTsKKy8vICAgICAgICAgICAgICAgIHJldHVybiBicmlnaHRuZXNzTW9kZSA9PSBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERV9BVVRPTUFUSUM7CisvLyAgICAgICAgICAgIH0KKy8vICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworLy8gICAgICAgIH0gY2F0Y2ggKFNldHRpbmdzLlNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisvLyAgICAgICAgfQorLy8gICAgICAgIHJldHVybiBmYWxzZTsKKy8vICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByb3RhdGVCcmlnaHRuZXNzKCkgeworICAgICAgICBpbnQgaWNvbiA9IFIuZHJhd2FibGUuaWNfc3lzYmFyX2JyaWdodG5lc3M7CisgICAgICAgIGludCBiZyA9IFIuZHJhd2FibGUuc3lzYmFyX3RvZ2dsZV9iZ19vbjsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSVBvd2VyTWFuYWdlciBwb3dlciA9IElQb3dlck1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZSgKKyAgICAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgicG93ZXIiKSk7CisgICAgICAgICAgICBpZiAocG93ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgICAgICAgICAgaW50IGJyaWdodG5lc3MgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KGNyLAorICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTKTsKKyAgICAgICAgICAgICAgICBpbnQgYnJpZ2h0bmVzc01vZGUgPSBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERV9NQU5VQUw7CisgICAgICAgICAgICAgICAgLy9Pbmx5IGdldCBicmlnaHRuZXNzIHNldHRpbmcgaWYgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfYXV0b21hdGljX2JyaWdodG5lc3NfYXZhaWxhYmxlKSkgeworICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzTW9kZSA9IFNldHRpbmdzLlN5c3RlbS5nZXRJbnQoY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFJvdGF0ZSBBVVRPIC0+IE1JTklNVU0gLT4gREVGQVVMVCAtPiBNQVhJTVVNCisgICAgICAgICAgICAgICAgLy8gVGVjaG5pY2FsbHksIG5vdCBhIHRvZ2dsZS4uLgorICAgICAgICAgICAgICAgIGlmIChicmlnaHRuZXNzTW9kZSA9PSBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERV9BVVRPTUFUSUMpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzcyA9IE1JTklNVU1fQkFDS0xJR0hUOworICAgICAgICAgICAgICAgICAgICBpY29uID0gUi5kcmF3YWJsZS5pY19zeXNiYXJfYnJpZ2h0bmVzc19sb3c7CisgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3NNb2RlID0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfTUFOVUFMOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnJpZ2h0bmVzcyA8IERFRkFVTFRfQkFDS0xJR0hUKSB7CisgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MgPSBERUZBVUxUX0JBQ0tMSUdIVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJyaWdodG5lc3MgPCBNQVhJTVVNX0JBQ0tMSUdIVCkgeworICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzID0gTUFYSU1VTV9CQUNLTElHSFQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzc01vZGUgPSBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERV9BVVRPTUFUSUM7CisgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MgPSBNSU5JTVVNX0JBQ0tMSUdIVDsKKyAgICAgICAgICAgICAgICAgICAgaWNvbiA9IFIuZHJhd2FibGUuaWNfc3lzYmFyX2JyaWdodG5lc3NfYXV0bzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5ib29sLmNvbmZpZ19hdXRvbWF0aWNfYnJpZ2h0bmVzc19hdmFpbGFibGUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNldCBzY3JlZW4gYnJpZ2h0bmVzcyBtb2RlIChhdXRvbWF0aWMgb3IgbWFudWFsKQorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0ucHV0SW50KGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzc01vZGUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGJyaWdodG5lc3MgaWYgYXV0b21hdGljIG1vZGUgaXNuJ3QgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3NNb2RlID0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfTUFOVUFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYnJpZ2h0bmVzc01vZGUgPT0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfTUFOVUFMKSB7CisgICAgICAgICAgICAgICAgICAgIHBvd2VyLnNldEJhY2tsaWdodEJyaWdodG5lc3MoYnJpZ2h0bmVzcyk7CisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5wdXRJbnQoY3IsIFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTUywgYnJpZ2h0bmVzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChTZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgbUJyaWdodG5lc3NCdXR0b24uc2V0SW1hZ2VSZXNvdXJjZShpY29uKTsKKyAgICAgICAgbUJyaWdodG5lc3NCdXR0b24uc2V0QmFja2dyb3VuZFJlc291cmNlKGJnKTsKKyAgICB9CisKKyAgICBQaG9uZVN0YXRlTGlzdGVuZXIgbVBob25lU3RhdGVMaXN0ZW5lciA9IG5ldyBQaG9uZVN0YXRlTGlzdGVuZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VTdGF0ZUNoYW5nZWQoU2VydmljZVN0YXRlIHNlcnZpY2VTdGF0ZSkgeworICAgICAgICAgICAgaWYgKERFQlVHX1NJR05BTCB8fCBERUJVRykgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJwaG9uZSBzZXJ2aWNlIHN0YXRlIGNoYW5nZWQ6ICIgKyBzZXJ2aWNlU3RhdGUuZ2V0U3RhdGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU2VydmljZVN0YXRlID0gc2VydmljZVN0YXRlOworICAgICAgICAgICAgbUFpcnBsYW5lTW9kZSA9IHNlcnZpY2VTdGF0ZS5nZXRTdGF0ZSgpID09IFNlcnZpY2VTdGF0ZS5TVEFURV9QT1dFUl9PRkY7CisgICAgICAgICAgICBpZiAobUFpcnBsYW5lQnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQWlycGxhbmVCdXR0b24uc2V0SW1hZ2VSZXNvdXJjZShtQWlycGxhbmVNb2RlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUi5kcmF3YWJsZS5pY19zeXNiYXJfYWlycGxhbmVfb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuaWNfc3lzYmFyX2FpcnBsYW5lX29mZik7CisgICAgICAgICAgICAgICAgbUFpcnBsYW5lQnV0dG9uLnNldEJhY2tncm91bmRSZXNvdXJjZShtQWlycGxhbmVNb2RlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUi5kcmF3YWJsZS5zeXNiYXJfdG9nZ2xlX2JnX29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSLmRyYXdhYmxlLnN5c2Jhcl90b2dnbGVfYmdfb2ZmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZURhdGFTdGF0ZSgpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNpZ25hbFN0cmVuZ3Roc0NoYW5nZWQoU2lnbmFsU3RyZW5ndGggc2lnbmFsU3RyZW5ndGgpIHsKKyAgICAgICAgICAgIGlmIChERUJVR19TSUdOQUwgfHwgREVCVUcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAib25TaWduYWxTdHJlbmd0aHNDaGFuZ2VkOiAiICsgc2lnbmFsU3RyZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNpZ25hbFN0cmVuZ3RoID0gc2lnbmFsU3RyZW5ndGg7CisgICAgICAgICAgICB1cGRhdGVEYXRhU3RhdGUoKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DYWxsU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSwgU3RyaW5nIGluY29taW5nTnVtYmVyKSB7CisgICAgICAgICAgICBtUGhvbmVTdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgLy8gSW4gY2RtYSwgaWYgYSB2b2ljZSBjYWxsIGlzIG1hZGUsIFJTU0kgc2hvdWxkIHN3aXRjaCB0byAxeC4KKyAgICAgICAgICAgIGlmIChpc0NkbWEoKSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZURhdGFTdGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoaW50IHN0YXRlLCBpbnQgbmV0d29ya1R5cGUpIHsKKyAgICAgICAgICAgIGlmIChERUJVR19TSUdOQUwgfHwgREVCVUcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAib25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZDogc3RhdGU9IiArIHN0YXRlIAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHR5cGU9IiArIG5ldHdvcmtUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EYXRhU3RhdGUgPSBzdGF0ZTsKKy8vICAgICAgICAgICAgdXBkYXRlRGF0YU5ldFR5cGUobmV0d29ya1R5cGUpOworICAgICAgICAgICAgdXBkYXRlRGF0YVN0YXRlKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBib29sZWFuIGdldEFpcnBsYW5lTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BaXJwbGFuZU1vZGU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEFpcnBsYW5lTW9kZShib29sZWFuIG9uKSB7CisgICAgICAgIFNldHRpbmdzLlN5c3RlbS5wdXRJbnQoCisgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLkFJUlBMQU5FX01PREVfT04sCisgICAgICAgICAgICAgICAgb24gPyAxIDogMCk7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fQUlSUExBTkVfTU9ERV9DSEFOR0VEKTsKKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFUExBQ0VfUEVORElORyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYSgic3RhdGUiLCBvbik7CisgICAgICAgIGdldENvbnRleHQoKS5zZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgfQorCisgICAgYm9vbGVhbiBnZXRTaWxlbnRNb2RlKCkgeworICAgICAgICByZXR1cm4gbUF1ZGlvTWFuYWdlci5nZXRSaW5nZXJNb2RlKCkgIT0gQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX05PUk1BTDsKKyAgICB9CisKKyAgICB2b2lkIHNldFNpbGVudE1vZGUoYm9vbGVhbiBvbikgeworICAgICAgICBpZiAob24pIHsKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0UmluZ2VyTW9kZSgoU2V0dGluZ3MuU3lzdGVtLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uVklCUkFURV9JTl9TSUxFTlQsIDEpID09IDEpCisgICAgICAgICAgICAgICAgPyBBdWRpb01hbmFnZXIuUklOR0VSX01PREVfVklCUkFURQorICAgICAgICAgICAgICAgIDogQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX1NJTEVOVCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFJpbmdlck1vZGUoQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX05PUk1BTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJlZnJlc2hTb3VuZCgpIHsKKyAgICAgICAgYm9vbGVhbiBzaWxlbnQgPSBnZXRTaWxlbnRNb2RlKCk7CisgICAgICAgIG1Tb3VuZEJ1dHRvbi5zZXRJbWFnZVJlc291cmNlKCFzaWxlbnQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUi5kcmF3YWJsZS5pY19zeXNiYXJfc291bmRfb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSLmRyYXdhYmxlLmljX3N5c2Jhcl9zb3VuZF9vZmYpOworICAgICAgICBtU291bmRCdXR0b24uc2V0QmFja2dyb3VuZFJlc291cmNlKCFzaWxlbnQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUi5kcmF3YWJsZS5zeXNiYXJfdG9nZ2xlX2JnX29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5zeXNiYXJfdG9nZ2xlX2JnX29mZik7CisgICAgfQorCisgICAgdm9pZCB0b2dnbGVCbHVldG9vdGgoKSB7CisgICAgICAgIGlmIChtQmx1ZXRvb3RoQWRhcHRlciA9PSBudWxsKSByZXR1cm47CisgICAgICAgIGlmIChtQmx1ZXRvb3RoQWRhcHRlci5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbUJsdWV0b290aEFkYXB0ZXIuZGlzYWJsZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUJsdWV0b290aEFkYXB0ZXIuZW5hYmxlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJlZnJlc2hCbHVldG9vdGgoKSB7CisgICAgICAgIGJvb2xlYW4gb24gPSBtQmx1ZXRvb3RoQWRhcHRlciAhPSBudWxsICYmIG1CbHVldG9vdGhBZGFwdGVyLmlzRW5hYmxlZCgpOworICAgICAgICBtQmx1ZXRvb3RoQnV0dG9uLnNldEltYWdlUmVzb3VyY2Uob24gPyBSLmRyYXdhYmxlLmljX3N5c2Jhcl9ibHVldG9vdGhfb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5pY19zeXNiYXJfYmx1ZXRvb3RoX29mZik7CisgICAgICAgIG1CbHVldG9vdGhCdXR0b24uc2V0QmFja2dyb3VuZFJlc291cmNlKG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUi5kcmF3YWJsZS5zeXNiYXJfdG9nZ2xlX2JnX29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5zeXNiYXJfdG9nZ2xlX2JnX29mZik7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzR3BzRW5hYmxlZCgpIHsKKyAgICAgICAgQ29udGVudFJlc29sdmVyIHJlcyA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICByZXR1cm4gU2V0dGluZ3MuU2VjdXJlLmlzTG9jYXRpb25Qcm92aWRlckVuYWJsZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcywgTG9jYXRpb25NYW5hZ2VyLkdQU19QUk9WSURFUik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRvZ2dsZUdwcygpIHsKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnNldExvY2F0aW9uUHJvdmlkZXJFbmFibGVkKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIExvY2F0aW9uTWFuYWdlci5HUFNfUFJPVklERVIsICFpc0dwc0VuYWJsZWQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hHcHMoKSB7CisgICAgICAgIGJvb2xlYW4gb24gPSBpc0dwc0VuYWJsZWQoKTsKKyAgICAgICAgbUdwc0J1dHRvbi5zZXRJbWFnZVJlc291cmNlKG9uID8gUi5kcmF3YWJsZS5pY19zeXNiYXJfZ3BzX29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuaWNfc3lzYmFyX2dwc19vZmYpOworICAgICAgICBtR3BzQnV0dG9uLnNldEJhY2tncm91bmRSZXNvdXJjZShvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFIuZHJhd2FibGUuc3lzYmFyX3RvZ2dsZV9iZ19vbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuc3lzYmFyX3RvZ2dsZV9iZ19vZmYpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1RhYmxldFN0YXR1c0JhclNlcnZpY2UuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1RhYmxldFN0YXR1c0JhclNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTI2ZjUyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvVGFibGV0U3RhdHVzQmFyU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsODQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOworaW1wb3J0IGFuZHJvaWQuYXBwLlN0YXR1c0Jhck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VySW1wbDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNjcm9sbFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFN3aXRjaGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLlN0YXR1c0Jhckljb247CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLlN0YXR1c0Jhck5vdGlmaWNhdGlvbjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci4qOworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnJlY2VudC5SZWNlbnRBcHBsaWNhdGlvbnNBY3Rpdml0eTsKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOworCitwdWJsaWMgY2xhc3MgVGFibGV0U3RhdHVzQmFyU2VydmljZSBleHRlbmRzIFN0YXR1c0JhclNlcnZpY2UgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJUYWJsZXRTdGF0dXNCYXJTZXJ2aWNlIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19PUEVOX05PVElGSUNBVElPTl9QQU5FTCA9IDEwMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NMT1NFX05PVElGSUNBVElPTl9QQU5FTCA9IDEwMDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX09QRU5fU1lTVEVNX1BBTkVMID0gMTAxMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfQ0xPU0VfU1lTVEVNX1BBTkVMID0gMTAxMTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0lNQUdFX0xFVkVMID0gMTAwMDA7CisKKyAgICBpbnQgbUljb25TaXplOworCisgICAgSCBtSGFuZGxlciA9IG5ldyBIKCk7CisKKyAgICAvLyB0cmFja2luZyBhbGwgY3VycmVudCBub3RpZmljYXRpb25zCisgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25EYXRhIG1Ob3RucyA9IG5ldyBOb3RpZmljYXRpb25EYXRhKCk7CisgICAgCisgICAgVGFibGV0U3RhdHVzQmFyVmlldyBtU3RhdHVzQmFyVmlldzsKKyAgICBWaWV3IG1Ob3RpZmljYXRpb25UcmlnZ2VyOworICAgIE5vdGlmaWNhdGlvbkljb25BcmVhIG1Ob3RpZmljYXRpb25JY29uQXJlYTsKKyAgICBWaWV3IG1Ob3RpZmljYXRpb25CdXR0b25zOworICAgIFZpZXcgbVN5c3RlbUluZm87CisgICAgVmlldyBtTmF2aWdhdGlvbkFyZWE7CisKKyAgICBOb3RpZmljYXRpb25QYW5lbCBtTm90aWZpY2F0aW9uUGFuZWw7CisgICAgU3lzdGVtUGFuZWwgbVN5c3RlbVBhbmVsOworCisgICAgVmlld0dyb3VwIG1QaWxlOworICAgIFRleHRWaWV3IG1DbGVhckJ1dHRvbjsKKyAgICBUZXh0VmlldyBtRG9Ob3REaXN0dXJiQnV0dG9uOworCisgICAgSW1hZ2VWaWV3IG1CYXR0ZXJ5TWV0ZXI7CisgICAgSW1hZ2VWaWV3IG1TaWduYWxNZXRlcjsKKyAgICBJbWFnZVZpZXcgbVNpZ25hbEljb247CisKKyAgICBWaWV3IG1CYXJDb250ZW50czsKKyAgICBWaWV3IG1DdXJ0YWluczsKKworICAgIE5vdGlmaWNhdGlvbkljb25BcmVhLkljb25MYXlvdXQgbUljb25MYXlvdXQ7CisKKyAgICBUYWJsZXRUaWNrZXIgbVRpY2tlcjsKKyAgICBWaWV3IG1UaWNrZXJWaWV3OworICAgIGJvb2xlYW4gbVRpY2tpbmc7CisKKyAgICAvLyBmb3IgZGlzYWJsaW5nIHRoZSBzdGF0dXMgYmFyCisgICAgaW50IG1EaXNhYmxlZCA9IDA7CisKKyAgICBib29sZWFuIG1Ob3RpZmljYXRpb25zT24gPSB0cnVlOworCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkUGFuZWxXaW5kb3dzKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIGZpbmFsIGludCBiYXJIZWlnaHQ9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCisgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN0YXR1c19iYXJfaGVpZ2h0KTsKKworICAgICAgICBtTm90aWZpY2F0aW9uUGFuZWwgPSAoTm90aWZpY2F0aW9uUGFuZWwpVmlldy5pbmZsYXRlKHRoaXMsCisgICAgICAgICAgICAgICAgUi5sYXlvdXQuc3lzYmFyX3BhbmVsX25vdGlmaWNhdGlvbnMsIG51bGwpOworICAgICAgICBtTm90aWZpY2F0aW9uUGFuZWwuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICBtTm90aWZpY2F0aW9uUGFuZWwuc2V0T25Ub3VjaExpc3RlbmVyKAorICAgICAgICAgICAgICAgIG5ldyBUb3VjaE91dHNpZGVMaXN0ZW5lcihNU0dfQ0xPU0VfTk9USUZJQ0FUSU9OX1BBTkVMLCBtTm90aWZpY2F0aW9uUGFuZWwpKTsKKworICAgICAgICBtU3RhdHVzQmFyVmlldy5zZXRJZ25vcmVDaGlsZHJlbigwLCBtTm90aWZpY2F0aW9uVHJpZ2dlciwgbU5vdGlmaWNhdGlvblBhbmVsKTsKKworICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBscCA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICA0MDAsIC8vIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1RBVFVTX0JBUl9QQU5FTCwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU4KKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU0sCisgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQpOworICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5CT1RUT00gfCBHcmF2aXR5LkxFRlQ7CisgICAgICAgIGxwLnNldFRpdGxlKCJOb3RpZmljYXRpb25QYW5lbCIpOworICAgICAgICBscC53aW5kb3dBbmltYXRpb25zID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5BbmltYXRpb25fU2xpZGluZ0NhcmQ7CisKKyAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLmFkZFZpZXcobU5vdGlmaWNhdGlvblBhbmVsLCBscCk7CisKKyAgICAgICAgbVN5c3RlbVBhbmVsID0gKFN5c3RlbVBhbmVsKSBWaWV3LmluZmxhdGUodGhpcywgUi5sYXlvdXQuc3lzYmFyX3BhbmVsX3N5c3RlbSwgbnVsbCk7CisgICAgICAgIG1TeXN0ZW1QYW5lbC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIG1TeXN0ZW1QYW5lbC5zZXRPblRvdWNoTGlzdGVuZXIobmV3IFRvdWNoT3V0c2lkZUxpc3RlbmVyKE1TR19DTE9TRV9TWVNURU1fUEFORUwsCisgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1QYW5lbCkpOworCisgICAgICAgIG1TdGF0dXNCYXJWaWV3LnNldElnbm9yZUNoaWxkcmVuKDEsIG1TeXN0ZW1JbmZvLCBtU3lzdGVtUGFuZWwpOworCisgICAgICAgIGxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgIDgwMCwKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVJfUEFORUwsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNLAorICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UKTsKKyAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuQk9UVE9NIHwgR3Jhdml0eS5DRU5URVJfSE9SSVpPTlRBTDsKKyAgICAgICAgbHAuc2V0VGl0bGUoIlN5c3RlbVBhbmVsIik7CisgICAgICAgIGxwLndpbmRvd0FuaW1hdGlvbnMgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLkFuaW1hdGlvbl9TbGlkaW5nQ2FyZDsKKworICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyhtU3lzdGVtUGFuZWwsIGxwKTsKKyAgICAgICAgbVN5c3RlbVBhbmVsLnNldEJhcih0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoKTsgLy8gd2lsbCBhZGQgdGhlIG1haW4gYmFyIHZpZXcKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVmlldyBtYWtlU3RhdHVzQmFyVmlldygpIHsKKyAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOworCisgICAgICAgIG1JY29uU2l6ZSA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdGF0dXNfYmFyX2ljb25fc2l6ZSk7CisKKyAgICAgICAgZmluYWwgVGFibGV0U3RhdHVzQmFyVmlldyBzYiA9IChUYWJsZXRTdGF0dXNCYXJWaWV3KVZpZXcuaW5mbGF0ZSgKKyAgICAgICAgICAgICAgICB0aGlzLCBSLmxheW91dC5zdGF0dXNfYmFyLCBudWxsKTsKKyAgICAgICAgbVN0YXR1c0JhclZpZXcgPSBzYjsKKworICAgICAgICBzYi5zZXRIYW5kbGVyKG1IYW5kbGVyKTsKKworICAgICAgICBtQmFyQ29udGVudHMgPSBzYi5maW5kVmlld0J5SWQoUi5pZC5iYXJfY29udGVudHMpOworICAgICAgICBtQ3VydGFpbnMgPSBzYi5maW5kVmlld0J5SWQoUi5pZC5saWdodHNfb3V0KTsKKyAgICAgICAgbVN5c3RlbUluZm8gPSBzYi5maW5kVmlld0J5SWQoUi5pZC5zeXN0ZW1JbmZvKTsKKworICAgICAgICBtU3lzdGVtSW5mby5zZXRPbkxvbmdDbGlja0xpc3RlbmVyKG5ldyBTZXRMaWdodHNPbkxpc3RlbmVyKGZhbHNlKSk7CisKKyAgICAgICAgU2V0TGlnaHRzT25MaXN0ZW5lciBvbiA9IG5ldyBTZXRMaWdodHNPbkxpc3RlbmVyKHRydWUpOworICAgICAgICBtQ3VydGFpbnMuc2V0T25DbGlja0xpc3RlbmVyKG9uKTsKKyAgICAgICAgbUN1cnRhaW5zLnNldE9uTG9uZ0NsaWNrTGlzdGVuZXIob24pOworCisgICAgICAgIC8vIHRoZSBidXR0b24gdG8gb3BlbiB0aGUgbm90aWZpY2F0aW9uIGFyZWEKKyAgICAgICAgbU5vdGlmaWNhdGlvblRyaWdnZXIgPSBzYi5maW5kVmlld0J5SWQoUi5pZC5leHBhbmQpOworCisgICAgICAgIC8vIHRoZSBtb3JlIG5vdGlmaWNhdGlvbnMgaWNvbgorICAgICAgICBtTm90aWZpY2F0aW9uSWNvbkFyZWEgPSAoTm90aWZpY2F0aW9uSWNvbkFyZWEpc2IuZmluZFZpZXdCeUlkKFIuaWQubm90aWZpY2F0aW9uSWNvbnMpOworCisgICAgICAgIC8vIHRoZSBjbGVhciBhbmQgZG5kIGJ1dHRvbnMKKyAgICAgICAgbU5vdGlmaWNhdGlvbkJ1dHRvbnMgPSBzYi5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25CdXR0b25zKTsKKyAgICAgICAgbUNsZWFyQnV0dG9uID0gKFRleHRWaWV3KW1Ob3RpZmljYXRpb25CdXR0b25zLmZpbmRWaWV3QnlJZChSLmlkLmNsZWFyX2FsbF9idXR0b24pOworICAgICAgICBtQ2xlYXJCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1DbGVhckJ1dHRvbkxpc3RlbmVyKTsKKyAgICAgICAgbURvTm90RGlzdHVyYkJ1dHRvbiA9IChUZXh0VmlldyltTm90aWZpY2F0aW9uQnV0dG9ucy5maW5kVmlld0J5SWQoUi5pZC5kb19ub3RfZGlzdHVyYik7CisgICAgICAgIG1Eb05vdERpc3R1cmJCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1Eb05vdERpc3R1cmJCdXR0b25MaXN0ZW5lcik7CisKKworICAgICAgICAvLyB3aGVyZSB0aGUgaWNvbnMgZ28KKyAgICAgICAgbUljb25MYXlvdXQgPSAoTm90aWZpY2F0aW9uSWNvbkFyZWEuSWNvbkxheW91dCkgc2IuZmluZFZpZXdCeUlkKFIuaWQuaWNvbnMpOworCisgICAgICAgIG1UaWNrZXIgPSBuZXcgVGFibGV0VGlja2VyKChDb250ZXh0KXRoaXMsIChGcmFtZUxheW91dClzYi5maW5kVmlld0J5SWQoUi5pZC50aWNrZXIpKTsKKworICAgICAgICAvLyBTeXN0ZW0gaW5mbyAoY2VudGVyKQorICAgICAgICBtQmF0dGVyeU1ldGVyID0gKEltYWdlVmlldykgc2IuZmluZFZpZXdCeUlkKFIuaWQuYmF0dGVyeSk7CisgICAgICAgIG1TaWduYWxNZXRlciA9IChJbWFnZVZpZXcpIHNiLmZpbmRWaWV3QnlJZChSLmlkLnNpZ25hbCk7CisgICAgICAgIG1TaWduYWxJY29uID0gKEltYWdlVmlldykgc2IuZmluZFZpZXdCeUlkKFIuaWQuc2lnbmFsX2ljb24pOworCisgICAgICAgIC8vIFRoZSBuYXZpZ2F0aW9uIGJ1dHRvbnMKKyAgICAgICAgbU5hdmlnYXRpb25BcmVhID0gc2IuZmluZFZpZXdCeUlkKFIuaWQubmF2aWdhdGlvbkFyZWEpOworCisgICAgICAgIC8vIHNldCB0aGUgaW5pdGlhbCB2aWV3IHZpc2liaWxpdHkKKyAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7CisKKyAgICAgICAgLy8gQWRkIHRoZSB3aW5kb3dzCisgICAgICAgIGFkZFBhbmVsV2luZG93cygpOworCisgICAgICAgIG1QaWxlID0gKFZpZXdHcm91cCltTm90aWZpY2F0aW9uUGFuZWwuZmluZFZpZXdCeUlkKFIuaWQuY29udGVudCk7CisgICAgICAgIG1QaWxlLnJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgIAorICAgICAgICBTY3JvbGxWaWV3IHNjcm9sbGVyID0gKFNjcm9sbFZpZXcpbVBpbGUuZ2V0UGFyZW50KCk7CisgICAgICAgIHNjcm9sbGVyLnNldEZpbGxWaWV3cG9ydCh0cnVlKTsKKworICAgICAgICByZXR1cm4gc2I7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBnZXRTdGF0dXNCYXJHcmF2aXR5KCkgeworICAgICAgICByZXR1cm4gR3Jhdml0eS5CT1RUT00gfCBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTDsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEggZXh0ZW5kcyBIYW5kbGVyIHsKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG0pIHsKKyAgICAgICAgICAgIHN3aXRjaCAobS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfT1BFTl9OT1RJRklDQVRJT05fUEFORUw6CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIm9wZW5pbmcgbm90aWZpY2F0aW9ucyBwYW5lbCIpOworICAgICAgICAgICAgICAgICAgICBpZiAobU5vdGlmaWNhdGlvblBhbmVsLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Eb05vdERpc3R1cmJCdXR0b24uc2V0VGV4dChtTm90aWZpY2F0aW9uc09uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUi5zdHJpbmcuc3RhdHVzX2Jhcl9kb19ub3RfZGlzdHVyYl9idXR0b24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSLnN0cmluZy5zdGF0dXNfYmFyX3BsZWFzZV9kaXN0dXJiX2J1dHRvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uUGFuZWwuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0Vmlld1Zpc2liaWxpdHkobU5vdGlmaWNhdGlvbkljb25BcmVhLCBWaWV3LkdPTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuYW5pbS5ub3RpZmljYXRpb25faWNvbnNfb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFZpZXdWaXNpYmlsaXR5KG1Ob3RpZmljYXRpb25CdXR0b25zLCBWaWV3LlZJU0lCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuYW5pbS5ub3RpZmljYXRpb25fYnV0dG9uc19pbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQ0xPU0VfTk9USUZJQ0FUSU9OX1BBTkVMOgorICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJjbG9zaW5nIG5vdGlmaWNhdGlvbnMgcGFuZWwiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25QYW5lbC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uUGFuZWwuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0Vmlld1Zpc2liaWxpdHkobU5vdGlmaWNhdGlvbkljb25BcmVhLCBWaWV3LlZJU0lCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuYW5pbS5ub3RpZmljYXRpb25faWNvbnNfaW4pOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0Vmlld1Zpc2liaWxpdHkobU5vdGlmaWNhdGlvbkJ1dHRvbnMsIFZpZXcuR09ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5hbmltLm5vdGlmaWNhdGlvbl9idXR0b25zX291dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfT1BFTl9TWVNURU1fUEFORUw6CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIm9wZW5pbmcgc3lzdGVtIHBhbmVsIik7CisgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1QYW5lbC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0NMT1NFX1NZU1RFTV9QQU5FTDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiY2xvc2luZyBzeXN0ZW0gcGFuZWwiKTsKKyAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVBhbmVsLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0QmF0dGVyeU1ldGVyKGludCBsZXZlbCwgYm9vbGVhbiBwbHVnZ2VkKSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgImJhdHRlcnk9IiArIGxldmVsICsgKHBsdWdnZWQgPyAiIC0gcGx1Z2dlZCIgOiAiIC0gdW5wbHVnZ2VkIikpOworICAgICAgICBtQmF0dGVyeU1ldGVyLnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS5zeXNiYXJfYmF0dGVyeW1pbmkpOworICAgICAgICAvLyBhZGp1c3QgcGVyY2VudCB0byBwZXJteXJpYWQgZm9yIENsaXBEcmF3YWJsZSdzIHNha2UKKyAgICAgICAgbUJhdHRlcnlNZXRlci5zZXRJbWFnZUxldmVsKGxldmVsICogKE1BWF9JTUFHRV9MRVZFTCAvIDEwMCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNpZ25hbE1ldGVyKGludCBsZXZlbCwgYm9vbGVhbiBpc1dpZmkpIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAic2lnbmFsPSIgKyBsZXZlbCk7CisgICAgICAgIGlmIChsZXZlbCA8IDApIHsKKyAgICAgICAgICAgIG1TaWduYWxNZXRlci5zZXRJbWFnZURyYXdhYmxlKG51bGwpOworICAgICAgICAgICAgbVNpZ25hbE1ldGVyLnNldEltYWdlTGV2ZWwoMCk7CisgICAgICAgICAgICBtU2lnbmFsSWNvbi5zZXRJbWFnZURyYXdhYmxlKG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNpZ25hbE1ldGVyLnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS5zeXNiYXJfd2lmaW1pbmkpOworICAgICAgICAgICAgLy8gYWRqdXN0IHRvIHBlcm15cmlhZAorICAgICAgICAgICAgbVNpZ25hbE1ldGVyLnNldEltYWdlTGV2ZWwobGV2ZWwgKiAoTUFYX0lNQUdFX0xFVkVMIC8gMTAwKSk7CisgICAgICAgICAgICBtU2lnbmFsSWNvbi5zZXRJbWFnZVJlc291cmNlKGlzV2lmaSA/IFIuZHJhd2FibGUuaWNfc3lzYmFyX3dpZmlfbWluaSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5pY19zeXNiYXJfd2lmaV9taW5pKTsgLy8gWFhYCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJY29uKFN0cmluZyBzbG90LCBpbnQgaW5kZXgsIGludCB2aWV3SW5kZXgsIFN0YXR1c0Jhckljb24gaWNvbikgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJhZGRJY29uKCIgKyBzbG90ICsgIikgLT4gIiArIGljb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwKKyAgICAgICAgICAgIFN0YXR1c0Jhckljb24gb2xkLCBTdGF0dXNCYXJJY29uIGljb24pIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAidXBkYXRlSWNvbigiICsgc2xvdCArICIpIC0+ICIgKyBpY29uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVJY29uKFN0cmluZyBzbG90LCBpbnQgaW5kZXgsIGludCB2aWV3SW5kZXgpIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAicmVtb3ZlSWNvbigiICsgc2xvdCArICIpIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkTm90aWZpY2F0aW9uKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgImFkZE5vdGlmaWNhdGlvbigiICsga2V5ICsgIiAtPiAiICsgbm90aWZpY2F0aW9uICsgIikiKTsKKyAgICAgICAgYWRkTm90aWZpY2F0aW9uVmlld3Moa2V5LCBub3RpZmljYXRpb24pOworCisgICAgICAgIGJvb2xlYW4gaW1tZXJzaXZlID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbW1lcnNpdmUgPSBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLmlzVG9wQWN0aXZpdHlJbW1lcnNpdmUoKTsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJUb3AgYWN0aXZpdHkgaXMgIiArIChpbW1lcnNpdmU/ImltbWVyc2l2ZSI6Im5vdCBpbW1lcnNpdmUiKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICB9CisgICAgICAgIGlmIChpbW1lcnNpdmUpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGltbWVyc2l2ZSBtb2RlIHBvcHVwcyBmb3IgdGFibGV0CisgICAgICAgIH0gZWxzZSBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5mdWxsU2NyZWVuSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIG5vdCBpbW1lcnNpdmUgJiBhIGZ1bGwtc2NyZWVuIGFsZXJ0IHNob3VsZCBiZSBzaG93bgorICAgICAgICAgICAgU2xvZy5kKFRBRywgIk5vdGlmaWNhdGlvbiBoYXMgZnVsbFNjcmVlbkludGVudCBhbmQgYWN0aXZpdHkgaXMgbm90IGltbWVyc2l2ZTsiCisgICAgICAgICAgICAgICAgICAgICsgIiBzZW5kaW5nIGZ1bGxTY3JlZW5JbnRlbnQiKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5mdWxsU2NyZWVuSW50ZW50LnNlbmQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGljayhub3RpZmljYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlTm90aWZpY2F0aW9uKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgInVwZGF0ZU5vdGlmaWNhdGlvbigiICsga2V5ICsgIiAtPiAiICsgbm90aWZpY2F0aW9uICsgIikgLy8gVE9ETyIpOworICAgICAgICAKKyAgICAgICAgZmluYWwgTm90aWZpY2F0aW9uRGF0YS5FbnRyeSBvbGRFbnRyeSA9IG1Ob3Rucy5maW5kQnlLZXkoa2V5KTsKKyAgICAgICAgaWYgKG9sZEVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIFNsb2cudyhUQUcsICJ1cGRhdGVOb3RpZmljYXRpb24gZm9yIHVua25vd24ga2V5OiAiICsga2V5KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBvbGROb3RpZmljYXRpb24gPSBvbGRFbnRyeS5ub3RpZmljYXRpb247CisgICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzIG9sZENvbnRlbnRWaWV3ID0gb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50VmlldzsKKworICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBjb250ZW50VmlldyA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudFZpZXc7CisKKyAgICAgICAgaWYgKGZhbHNlKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAib2xkIG5vdGlmaWNhdGlvbjogd2hlbj0iICsgb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCisgICAgICAgICAgICAgICAgICAgICsgIiBvbmdvaW5nPSIgKyBvbGROb3RpZmljYXRpb24uaXNPbmdvaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGV4cGFuZGVkPSIgKyBvbGRFbnRyeS5leHBhbmRlZAorICAgICAgICAgICAgICAgICAgICArICIgY29udGVudFZpZXc9IiArIG9sZENvbnRlbnRWaWV3KTsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJuZXcgbm90aWZpY2F0aW9uOiB3aGVuPSIgKyBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KKyAgICAgICAgICAgICAgICAgICAgKyAiIG9uZ29pbmc9IiArIG9sZE5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKQorICAgICAgICAgICAgICAgICAgICArICIgY29udGVudFZpZXc9IiArIGNvbnRlbnRWaWV3KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhbiB3ZSBqdXN0IHJlYXBwbHkgdGhlIFJlbW90ZVZpZXdzIGluIHBsYWNlPyAgSWYgd2hlbiBkaWRuJ3QgY2hhbmdlLCB0aGUgb3JkZXIKKyAgICAgICAgLy8gZGlkbid0IGNoYW5nZS4KKyAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbiA9PSBvbGROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KKyAgICAgICAgICAgICAgICAmJiBub3RpZmljYXRpb24uaXNPbmdvaW5nKCkgPT0gb2xkTm90aWZpY2F0aW9uLmlzT25nb2luZygpCisgICAgICAgICAgICAgICAgJiYgb2xkRW50cnkuZXhwYW5kZWQgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRWaWV3ICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50VmlldyAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgY29udGVudFZpZXcuZ2V0UGFja2FnZSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRQYWNrYWdlKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldFBhY2thZ2UoKS5lcXVhbHMoY29udGVudFZpZXcuZ2V0UGFja2FnZSgpKQorICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldExheW91dElkKCkgPT0gY29udGVudFZpZXcuZ2V0TGF5b3V0SWQoKSkgeworICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAicmV1c2luZyBub3RpZmljYXRpb24gZm9yIGtleTogIiArIGtleSk7CisgICAgICAgICAgICBvbGRFbnRyeS5ub3RpZmljYXRpb24gPSBub3RpZmljYXRpb247CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIFJlYXBwbHkgdGhlIFJlbW90ZVZpZXdzCisgICAgICAgICAgICAgICAgY29udGVudFZpZXcucmVhcHBseSh0aGlzLCBvbGRFbnRyeS5jb250ZW50KTsKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGNvbnRlbnRJbnRlbnQKKyAgICAgICAgICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IGNvbnRlbnRJbnRlbnQgPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQ7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRJbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvbGRFbnRyeS5jb250ZW50LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgTm90aWZpY2F0aW9uQ2xpY2tlcihjb250ZW50SW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ucGtnLCBub3RpZmljYXRpb24udGFnLCBub3RpZmljYXRpb24uaWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBpY29uLgorICAgICAgICAgICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb24gaWMgPSBuZXcgU3RhdHVzQmFySWNvbihub3RpZmljYXRpb24ucGtnLAorICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uLCBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb25MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ubnVtYmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9sZEVudHJ5Lmljb24uc2V0KGljKSkgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkbid0IHVwZGF0ZSBpY29uOiAiICsgaWMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIEl0IGZhaWxlZCB0byBhZGQgY2xlYW5seS4gIExvZywgYW5kIHJlbW92ZSB0aGUgdmlldyBmcm9tIHRoZSBwYW5lbC4KKyAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiQ291bGRuJ3QgcmVhcHBseSB2aWV3cyBmb3IgcGFja2FnZSAiICsgY29udGVudFZpZXcuZ2V0UGFja2FnZSgpLCBlKTsKKyAgICAgICAgICAgICAgICByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOworICAgICAgICAgICAgICAgIGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIm5vdCByZXVzaW5nIG5vdGlmaWNhdGlvbiBmb3Iga2V5OiAiICsga2V5KTsKKyAgICAgICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKGtleSk7CisgICAgICAgICAgICBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogdGlja2VyOyBpbW1lcnNpdmUgbW9kZQorCisgICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbihJQmluZGVyIGtleSkgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJyZW1vdmVOb3RpZmljYXRpb24oIiArIGtleSArICIpIC8vIFRPRE8iKTsKKyAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKKyAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGlzYWJsZShpbnQgc3RhdGUpIHsKKyAgICAgICAgaW50IG9sZCA9IG1EaXNhYmxlZDsKKyAgICAgICAgaW50IGRpZmYgPSBzdGF0ZSBeIG9sZDsKKyAgICAgICAgU2xvZy5kKFRBRywgImRpc2FibGUuLi4gb2xkPTB4IiArIEludGVnZXIudG9IZXhTdHJpbmcob2xkKQorICAgICAgICAgICAgICAgICsgIiBkaWZmPTB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoZGlmZikKKyAgICAgICAgICAgICAgICArICIgc3RhdGU9MHgiICsgSW50ZWdlci50b0hleFN0cmluZyhzdGF0ZSkpOworICAgICAgICBtRGlzYWJsZWQgPSBzdGF0ZTsKKworICAgICAgICAvLyBhY3QgYWNjb3JkaW5nbHkKKyAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9FWFBBTkQ6IHllcyIpOworICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgoc3RhdGUgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiB5ZXMiKTsKKyAgICAgICAgICAgICAgICBzZXRWaWV3VmlzaWJpbGl0eShtTm90aWZpY2F0aW9uVHJpZ2dlciwgVmlldy5HT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgUi5hbmltLm5vdGlmaWNhdGlvbl9pY29uc19vdXQpOworICAgICAgICAgICAgICAgIHNldFZpZXdWaXNpYmlsaXR5KG1Ob3RpZmljYXRpb25JY29uQXJlYSwgVmlldy5HT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgUi5hbmltLm5vdGlmaWNhdGlvbl9pY29uc19vdXQpOworICAgICAgICAgICAgICAgIG1UaWNrZXIuaGFsdCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IG5vIik7CisgICAgICAgICAgICAgICAgc2V0Vmlld1Zpc2liaWxpdHkobU5vdGlmaWNhdGlvblRyaWdnZXIsIFZpZXcuVklTSUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuYW5pbS5ub3RpZmljYXRpb25faWNvbnNfaW4pOworICAgICAgICAgICAgICAgIHNldFZpZXdWaXNpYmlsaXR5KG1Ob3RpZmljYXRpb25JY29uQXJlYSwgVmlldy5WSVNJQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgUi5hbmltLm5vdGlmaWNhdGlvbl9pY29uc19pbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgeworICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbVRpY2tlci5oYWx0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX1NZU1RFTV9JTkZPKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX1NZU1RFTV9JTkZPKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfU1lTVEVNX0lORk86IHllcyIpOworICAgICAgICAgICAgICAgIHNldFZpZXdWaXNpYmlsaXR5KG1TeXN0ZW1JbmZvLCBWaWV3LkdPTkUsIFIuYW5pbS5uYXZpZ2F0aW9uX291dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX1NZU1RFTV9JTkZPOiBubyIpOworICAgICAgICAgICAgICAgIHNldFZpZXdWaXNpYmlsaXR5KG1TeXN0ZW1JbmZvLCBWaWV3LlZJU0lCTEUsIFIuYW5pbS5uYXZpZ2F0aW9uX2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTkFWSUdBVElPTikgIT0gMCkgeworICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OQVZJR0FUSU9OKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTkFWSUdBVElPTjogeWVzIik7CisgICAgICAgICAgICAgICAgc2V0Vmlld1Zpc2liaWxpdHkobU5hdmlnYXRpb25BcmVhLCBWaWV3LkdPTkUsIFIuYW5pbS5uYXZpZ2F0aW9uX291dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05BVklHQVRJT046IG5vIik7CisgICAgICAgICAgICAgICAgc2V0Vmlld1Zpc2liaWxpdHkobU5hdmlnYXRpb25BcmVhLCBWaWV3LlZJU0lCTEUsIFIuYW5pbS5uYXZpZ2F0aW9uX2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNUaWNrZXIoTm90aWZpY2F0aW9uIG4pIHsKKyAgICAgICAgcmV0dXJuICFUZXh0VXRpbHMuaXNFbXB0eShuLnRpY2tlclRleHQpCisgICAgICAgICAgICAgICAgfHwgIVRleHRVdGlscy5pc0VtcHR5KG4udGlja2VyVGl0bGUpCisgICAgICAgICAgICAgICAgfHwgIVRleHRVdGlscy5pc0VtcHR5KG4udGlja2VyU3VidGl0bGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0aWNrKFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuKSB7CisgICAgICAgIC8vIERvbid0IHNob3cgdGhlIHRpY2tlciB3aGVuIHRoZSB3aW5kb3dzaGFkZSBpcyBvcGVuLgorICAgICAgICBpZiAobU5vdGlmaWNhdGlvblBhbmVsLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBTaG93IHRoZSB0aWNrZXIgaWYgb25lIGlzIHJlcXVlc3RlZC4gQWxzbyBkb24ndCBkbyB0aGlzCisgICAgICAgIC8vIHVudGlsIHN0YXR1cyBiYXIgd2luZG93IGlzIGF0dGFjaGVkIHRvIHRoZSB3aW5kb3cgbWFuYWdlciwKKyAgICAgICAgLy8gYmVjYXVzZS4uLiAgd2VsbCwgd2hhdCdzIHRoZSBwb2ludCBvdGhlcndpc2U/ICBBbmQgdHJ5aW5nIHRvCisgICAgICAgIC8vIHJ1biBhIHRpY2tlciB3aXRob3V0IGJlaW5nIGF0dGFjaGVkIHdpbGwgY3Jhc2ghCisgICAgICAgIGlmIChoYXNUaWNrZXIobi5ub3RpZmljYXRpb24pICYmIG1TdGF0dXNCYXJWaWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKDAgPT0gKG1EaXNhYmxlZCAmIChTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikpKSB7CisgICAgICAgICAgICAgICAgbVRpY2tlci5hZGQobik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhbmltYXRlRXhwYW5kKCkgeworICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfT1BFTl9OT1RJRklDQVRJT05fUEFORUwpOworICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19PUEVOX05PVElGSUNBVElPTl9QQU5FTCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYW5pbWF0ZUNvbGxhcHNlKCkgeworICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQ0xPU0VfTk9USUZJQ0FUSU9OX1BBTkVMKTsKKyAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfQ0xPU0VfTk9USUZJQ0FUSU9OX1BBTkVMKTsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0NMT1NFX1NZU1RFTV9QQU5FTCk7CisgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0NMT1NFX1NZU1RFTV9QQU5FTCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGlnaHRzT24oYm9vbGVhbiBvbikgeworICAgICAgICBpZiAob24pIHsKKyAgICAgICAgICAgIHNldFZpZXdWaXNpYmlsaXR5KG1DdXJ0YWlucywgVmlldy5HT05FLCBSLmFuaW0ubGlnaHRzX291dF9vdXQpOworICAgICAgICAgICAgc2V0Vmlld1Zpc2liaWxpdHkobUJhckNvbnRlbnRzLCBWaWV3LlZJU0lCTEUsIFIuYW5pbS5zdGF0dXNfYmFyX2luKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICAgICAgc2V0Vmlld1Zpc2liaWxpdHkobUN1cnRhaW5zLCBWaWV3LlZJU0lCTEUsIFIuYW5pbS5saWdodHNfb3V0X2luKTsKKyAgICAgICAgICAgIHNldFZpZXdWaXNpYmlsaXR5KG1CYXJDb250ZW50cywgVmlldy5HT05FLCBSLmFuaW0uc3RhdHVzX2Jhcl9vdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNDbGVhcmFibGUgPSBtTm90bnMuaGFzQ2xlYXJhYmxlSXRlbXMoKTsKKworICAgICAgICAvL1Nsb2cuZChUQUcsICJzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMgaGFzQ2xlcmFibGU9IiArIGhhc0NsZWFyYWJsZSk7CisKKyAgICAgICAgLy8gU2hvdyBvciBoaWRlIHRoZSAiQ2xlYXIgYWxsIiBidXR0b24uICBOb3RlIHRoYXQgd2UgZG9uJ3QgZG8gYW4gYW5pbWF0aW9uCisgICAgICAgIC8vIGlmIGl0J3Mgbm90IG9uIHNjcmVlbiwgc28gdGhhdCBpZiBzb21lb25lIG9wZW5zIHRoZSBiYXIgcmlnaHQgdGhlbiB0aGV5CisgICAgICAgIC8vIGRvbid0IHNlZSB0aGUgYW5pbWF0aW9uIGluIHByb2dyZXNzLgorICAgICAgICAvLyAobm8gb25nb2luZyBub3RpZmljYXRpb25zIGFyZSBjbGVhcmFibGUpCisgICAgICAgIGlmIChoYXNDbGVhcmFibGUpIHsKKyAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uQnV0dG9ucy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7CisgICAgICAgICAgICAgICAgc2V0Vmlld1Zpc2liaWxpdHkobUNsZWFyQnV0dG9uLCBWaWV3LlZJU0lCTEUsIFIuYW5pbS5ub3RpZmljYXRpb25fYnV0dG9uc19pbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1DbGVhckJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkJ1dHRvbnMuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgeworICAgICAgICAgICAgICAgIHNldFZpZXdWaXNpYmlsaXR5KG1DbGVhckJ1dHRvbiwgVmlldy5HT05FLCBSLmFuaW0ubm90aWZpY2F0aW9uX2J1dHRvbnNfb3V0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUNsZWFyQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgIG1PbmdvaW5nVGl0bGUuc2V0VmlzaWJpbGl0eShvbmdvaW5nID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKKyAgICAgICAgbUxhdGVzdFRpdGxlLnNldFZpc2liaWxpdHkobGF0ZXN0ID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKKworICAgICAgICBpZiAob25nb2luZyB8fCBsYXRlc3QpIHsKKyAgICAgICAgICAgIG1Ob05vdGlmaWNhdGlvbnNUaXRsZS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9CisgICAgICAgICovCisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZpY2F0aW9uSWNvbnNDbGlja2VkKFZpZXcgdikgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJjbGlja2VkIG5vdGlmaWNhdGlvbiBpY29ucyIpOworICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpID09IDApIHsKKyAgICAgICAgICAgIGludCBtc2cgPSAobU5vdGlmaWNhdGlvblBhbmVsLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUpIAorICAgICAgICAgICAgICAgID8gTVNHX09QRU5fTk9USUZJQ0FUSU9OX1BBTkVMCisgICAgICAgICAgICAgICAgOiBNU0dfQ0xPU0VfTk9USUZJQ0FUSU9OX1BBTkVMOworICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMobXNnKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UobXNnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN5c3RlbUluZm9DbGlja2VkKFZpZXcgdikgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJjbGlja2VkIHN5c3RlbSBpbmZvIik7CisgICAgICAgIGlmICgobURpc2FibGVkICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgPT0gMCkgeworICAgICAgICAgICAgaW50IG1zZyA9IChtU3lzdGVtUGFuZWwuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuR09ORSkgCisgICAgICAgICAgICAgICAgPyBNU0dfT1BFTl9TWVNURU1fUEFORUwKKyAgICAgICAgICAgICAgICA6IE1TR19DTE9TRV9TWVNURU1fUEFORUw7CisgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhtc2cpOworICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShtc2cpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVjZW50QnV0dG9uQ2xpY2tlZChWaWV3IHYpIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiY2xpY2tlZCByZWNlbnQgYXBwcyIpOworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3ModGhpcywgUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHkuY2xhc3MpOworICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0sKKyAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0FDVElWSVRZX0VYQ0xVREVfRlJPTV9SRUNFTlRTKTsKKyAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbmNlbCB0aGlzIG5vdGlmaWNhdGlvbiBhbmQgdGVsbCB0aGUgc3RhdHVzIGJhciBzZXJ2aWNlIGFib3V0IHRoZSBmYWlsdXJlLiBIb2xkIG5vIGxvY2tzLgorICAgICAqLworICAgIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3IoSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuLCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICByZW1vdmVOb3RpZmljYXRpb24oa2V5KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uTm90aWZpY2F0aW9uRXJyb3Iobi5wa2csIG4udGFnLCBuLmlkLCBuLnVpZCwgbi5pbml0aWFsUGlkLCBtZXNzYWdlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBUaGUgZW5kIGlzIG5pZ2guCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFZpZXcuT25DbGlja0xpc3RlbmVyIG1DbGVhckJ1dHRvbkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5vbkNsZWFyQWxsTm90aWZpY2F0aW9ucygpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZCBpZiB3ZSdyZSBoZXJlLgorICAgICAgICAgICAgfQorICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtRG9Ob3REaXN0dXJiQnV0dG9uTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICBtTm90aWZpY2F0aW9uc09uID0gIW1Ob3RpZmljYXRpb25zT247CisgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGNsYXNzIE5vdGlmaWNhdGlvbkNsaWNrZXIgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtSW50ZW50OworICAgICAgICBwcml2YXRlIFN0cmluZyBtUGtnOworICAgICAgICBwcml2YXRlIFN0cmluZyBtVGFnOworICAgICAgICBwcml2YXRlIGludCBtSWQ7CisKKyAgICAgICAgTm90aWZpY2F0aW9uQ2xpY2tlcihQZW5kaW5nSW50ZW50IGludGVudCwgU3RyaW5nIHBrZywgU3RyaW5nIHRhZywgaW50IGlkKSB7CisgICAgICAgICAgICBtSW50ZW50ID0gaW50ZW50OworICAgICAgICAgICAgbVBrZyA9IHBrZzsKKyAgICAgICAgICAgIG1UYWcgPSB0YWc7CisgICAgICAgICAgICBtSWQgPSBpZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBpbnRlbnQgd2UgYXJlIHNlbmRpbmcgaXMgZm9yIHRoZSBhcHBsaWNhdGlvbiwgd2hpY2gKKyAgICAgICAgICAgICAgICAvLyB3b24ndCBoYXZlIHBlcm1pc3Npb24gdG8gaW1tZWRpYXRlbHkgc3RhcnQgYW4gYWN0aXZpdHkgYWZ0ZXIKKyAgICAgICAgICAgICAgICAvLyB0aGUgdXNlciBzd2l0Y2hlcyB0byBob21lLiAgV2Uga25vdyBpdCBpcyBzYWZlIHRvIGRvIGF0IHRoaXMKKyAgICAgICAgICAgICAgICAvLyBwb2ludCwgc28gbWFrZSBzdXJlIG5ldyBhY3Rpdml0eSBzd2l0Y2hlcyBhcmUgbm93IGFsbG93ZWQuCisgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKS5yZXN1bWVBcHBTd2l0Y2hlcygpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1JbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludFtdIHBvcyA9IG5ldyBpbnRbMl07CisgICAgICAgICAgICAgICAgdi5nZXRMb2NhdGlvbk9uU2NyZWVuKHBvcyk7CisgICAgICAgICAgICAgICAgSW50ZW50IG92ZXJsYXkgPSBuZXcgSW50ZW50KCk7CisgICAgICAgICAgICAgICAgb3ZlcmxheS5zZXRTb3VyY2VCb3VuZHMoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVjdChwb3NbMF0sIHBvc1sxXSwgcG9zWzBdK3YuZ2V0V2lkdGgoKSwgcG9zWzFdK3YuZ2V0SGVpZ2h0KCkpKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtSW50ZW50LnNlbmQoVGFibGV0U3RhdHVzQmFyU2VydmljZS50aGlzLCAwLCBvdmVybGF5KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YWNrIHRyYWNlIGlzbid0IHZlcnkgaGVscGZ1bCBoZXJlLiAgSnVzdCBsb2cgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlLgorICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiU2VuZGluZyBjb250ZW50SW50ZW50IGZhaWxlZDogIiArIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5vbk5vdGlmaWNhdGlvbkNsaWNrKG1Qa2csIG1UYWcsIG1JZCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkIGlmIHdlJ3JlIGhlcmUuCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBzaGFkZSBpZiBpdCB3YXMgb3BlbgorICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisKKyAgICAgICAgICAgIC8vIElmIHRoaXMgY2xpY2sgd2FzIG9uIHRoZSBpbnRydWRlciBhbGVydCwgaGlkZSB0aGF0IGluc3RlYWQKKy8vICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfSElERV9JTlRSVURFUik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gcmVtb3ZlTm90aWZpY2F0aW9uVmlld3MoSUJpbmRlciBrZXkpIHsKKyAgICAgICAgTm90aWZpY2F0aW9uRGF0YS5FbnRyeSBlbnRyeSA9IG1Ob3Rucy5yZW1vdmUoa2V5KTsKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZW1vdmVOb3RpZmljYXRpb24gZm9yIHVua25vd24ga2V5OiAiICsga2V5KTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIC8vIFJlbW92ZSB0aGUgZXhwYW5kZWQgdmlldy4KKyAgICAgICAgVmlld0dyb3VwIHJvd1BhcmVudCA9IChWaWV3R3JvdXApZW50cnkucm93LmdldFBhcmVudCgpOworICAgICAgICBpZiAocm93UGFyZW50ICE9IG51bGwpIHJvd1BhcmVudC5yZW1vdmVWaWV3KGVudHJ5LnJvdyk7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgaWNvbi4KKy8vICAgICAgICBWaWV3R3JvdXAgaWNvblBhcmVudCA9IChWaWV3R3JvdXApZW50cnkuaWNvbi5nZXRQYXJlbnQoKTsKKy8vICAgICAgICBpZiAoaWNvblBhcmVudCAhPSBudWxsKSBpY29uUGFyZW50LnJlbW92ZVZpZXcoZW50cnkuaWNvbik7CisgICAgICAgIHJlZnJlc2hJY29ucygpOworCisgICAgICAgIHJldHVybiBlbnRyeS5ub3RpZmljYXRpb247CisgICAgfQorCisgICAgU3RhdHVzQmFySWNvblZpZXcgYWRkTm90aWZpY2F0aW9uVmlld3MoSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYWRkTm90aWZpY2F0aW9uVmlld3Moa2V5PSIgKyBrZXkgKyAiLCBub3RpZmljYXRpb249IiArIG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBpY29uLgorICAgICAgICBmaW5hbCBTdGF0dXNCYXJJY29uVmlldyBpY29uVmlldyA9IG5ldyBTdGF0dXNCYXJJY29uVmlldyh0aGlzLAorICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5wa2cgKyAiLzB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobm90aWZpY2F0aW9uLmlkKSk7CisgICAgICAgIGljb25WaWV3LnNldFNjYWxlVHlwZShJbWFnZVZpZXcuU2NhbGVUeXBlLkNFTlRFUl9JTlNJREUpOworCisgICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb24gaWMgPSBuZXcgU3RhdHVzQmFySWNvbihub3RpZmljYXRpb24ucGtnLAorICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb24sCisgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbkxldmVsLAorICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLm51bWJlcik7CisgICAgICAgIGlmICghaWNvblZpZXcuc2V0KGljKSkgeworICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3Ioa2V5LCBub3RpZmljYXRpb24sICJDb3VsZG4ndCBhdHRhY2ggU3RhdHVzQmFySWNvbjogIiArIGljKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgZXhwYW5kZWQgdmlldy4KKyAgICAgICAgTm90aWZpY2F0aW9uRGF0YS5FbnRyeSBlbnRyeSA9IG5ldyBOb3RpZmljYXRpb25EYXRhLkVudHJ5KGtleSwgbm90aWZpY2F0aW9uLCBpY29uVmlldyk7CisgICAgICAgIGlmICghaW5mbGF0ZVZpZXdzKGVudHJ5LCBtUGlsZSkpIHsKKyAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKGtleSwgbm90aWZpY2F0aW9uLCAiQ291bGRuJ3QgZXhwYW5kIFJlbW90ZVZpZXdzIGZvcjogIgorICAgICAgICAgICAgICAgICAgICArIG5vdGlmaWNhdGlvbik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvLyBBZGQgdGhlIGljb24uCisgICAgICAgIG1Ob3Rucy5hZGQoZW50cnkpOworICAgICAgICByZWZyZXNoSWNvbnMoKTsKKworICAgICAgICByZXR1cm4gaWNvblZpZXc7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hJY29ucygpIHsKKyAgICAgICAgLy8gWFhYOiBuZWVkIHRvIGltcGxlbWVudCBhIG5ldyBsaW1pdGVkIGxpbmVhciBsYXlvdXQgY2xhc3MKKyAgICAgICAgLy8gdG8gYXZvaWQgcmVtb3ZpbmcgJiByZWFkZGluZyBldmVyeXRoaW5nCisKKyAgICAgICAgaW50IE4gPSBtTm90bnMuc2l6ZSgpOworICAgICAgICBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKG1JY29uU2l6ZSwgbUljb25TaXplKTsKKworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJyZWZyZXNoaW5nIGljb25zICgiICsgTiArICIgbm90aWZpY2F0aW9ucywgbUljb25MYXlvdXQ9IgorICAgICAgICAgICAgICAgICAgICArIG1JY29uTGF5b3V0ICsgIiwgbVBpbGU9IiArIG1QaWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1JY29uTGF5b3V0LnJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTw0OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpPj1OKSBicmVhazsKKyAgICAgICAgICAgIG1JY29uTGF5b3V0LmFkZFZpZXcobU5vdG5zLmdldChOLWktMSkuaWNvbiwgaSwgcGFyYW1zKTsKKyAgICAgICAgfQorCisgICAgICAgIG1QaWxlLnJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgIG1QaWxlLmFkZFZpZXcobU5vdG5zLmdldChOLWktMSkucm93KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpbmZsYXRlVmlld3MoTm90aWZpY2F0aW9uRGF0YS5FbnRyeSBlbnRyeSwgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gc2JuID0gZW50cnkubm90aWZpY2F0aW9uOworICAgICAgICBSZW1vdGVWaWV3cyByZW1vdGVWaWV3cyA9IHNibi5ub3RpZmljYXRpb24uY29udGVudFZpZXc7CisgICAgICAgIGlmIChyZW1vdGVWaWV3cyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgdGhlIHJvdyB2aWV3CisgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gKExheW91dEluZmxhdGVyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7CisgICAgICAgIFZpZXcgcm93ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5zdGF0dXNfYmFyX2xhdGVzdF9ldmVudCwgcGFyZW50LCBmYWxzZSk7CisgICAgICAgIFZpZXcgdmV0b0J1dHRvbiA9IHJvdy5maW5kVmlld0J5SWQoUi5pZC52ZXRvKTsKKyAgICAgICAgaWYgKGVudHJ5Lm5vdGlmaWNhdGlvbi5pc0NsZWFyYWJsZSgpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgX3BrZyA9IHNibi5wa2c7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgX3RhZyA9IHNibi50YWc7CisgICAgICAgICAgICBmaW5hbCBpbnQgX2lkID0gc2JuLmlkOworICAgICAgICAgICAgdmV0b0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeyAKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25Ob3RpZmljYXRpb25DbGVhcihfcGtnLCBfdGFnLCBfaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZCBpZiB3ZSdyZSBoZXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIC8vICAgICAgICAgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmV0b0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGJpbmQgdGhlIGNsaWNrIGV2ZW50IHRvIHRoZSBjb250ZW50IGFyZWEKKyAgICAgICAgVmlld0dyb3VwIGNvbnRlbnQgPSAoVmlld0dyb3VwKXJvdy5maW5kVmlld0J5SWQoUi5pZC5jb250ZW50KTsKKyAgICAgICAgLy8gWFhYOiB1cGRhdGUgdG8gYWxsb3cgY29udHJvbHMgd2l0aGluIG5vdGlmaWNhdGlvbiB2aWV3cworICAgICAgICBjb250ZW50LnNldERlc2NlbmRhbnRGb2N1c2FiaWxpdHkoVmlld0dyb3VwLkZPQ1VTX0JMT0NLX0RFU0NFTkRBTlRTKTsKKy8vICAgICAgICBjb250ZW50LnNldE9uRm9jdXNDaGFuZ2VMaXN0ZW5lcihtRm9jdXNDaGFuZ2VMaXN0ZW5lcik7CisgICAgICAgIFBlbmRpbmdJbnRlbnQgY29udGVudEludGVudCA9IHNibi5ub3RpZmljYXRpb24uY29udGVudEludGVudDsKKyAgICAgICAgaWYgKGNvbnRlbnRJbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgY29udGVudC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE5vdGlmaWNhdGlvbkNsaWNrZXIoY29udGVudEludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNibi5wa2csIHNibi50YWcsIHNibi5pZCkpOworICAgICAgICB9CisKKyAgICAgICAgVmlldyBleHBhbmRlZCA9IG51bGw7CisgICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXhwYW5kZWQgPSByZW1vdGVWaWV3cy5hcHBseSh0aGlzLCBjb250ZW50KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICB9CisgICAgICAgIGlmIChleHBhbmRlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgaWRlbnQgPSBzYm4ucGtnICsgIi8weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHNibi5pZCk7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiY291bGRuJ3QgaW5mbGF0ZSB2aWV3IGZvciBub3RpZmljYXRpb24gIiArIGlkZW50LCBleGNlcHRpb24pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGVudC5hZGRWaWV3KGV4cGFuZGVkKTsKKyAgICAgICAgICAgIHJvdy5zZXREcmF3aW5nQ2FjaGVFbmFibGVkKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgZW50cnkucm93ID0gcm93OworICAgICAgICBlbnRyeS5jb250ZW50ID0gY29udGVudDsKKyAgICAgICAgZW50cnkuZXhwYW5kZWQgPSBleHBhbmRlZDsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgU2V0TGlnaHRzT25MaXN0ZW5lciBpbXBsZW1lbnRzIFZpZXcuT25Mb25nQ2xpY2tMaXN0ZW5lciwKKyAgICAgICAgICAgVmlldy5PbkNsaWNrTGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU9uOworCisgICAgICAgIFNldExpZ2h0c09uTGlzdGVuZXIoYm9vbGVhbiBvbikgeworICAgICAgICAgICAgbU9uID0gb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5zZXRMaWdodHNPbihtT24pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTG9uZ0NsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5zZXRMaWdodHNPbihtT24pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgVG91Y2hPdXRzaWRlTGlzdGVuZXIgaW1wbGVtZW50cyBWaWV3Lk9uVG91Y2hMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgaW50IG1Nc2c7CisgICAgICAgIHByaXZhdGUgU3RhdHVzQmFyUGFuZWwgbVBhbmVsOworCisgICAgICAgIHB1YmxpYyBUb3VjaE91dHNpZGVMaXN0ZW5lcihpbnQgbXNnLCBTdGF0dXNCYXJQYW5lbCBwYW5lbCkgeworICAgICAgICAgICAgbU1zZyA9IG1zZzsKKyAgICAgICAgICAgIG1QYW5lbCA9IHBhbmVsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaChWaWV3IHYsIE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgICAgICBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9PVVRTSURFCisgICAgICAgICAgICAgICAgICAgIHx8IChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04KKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFtUGFuZWwuaXNJbkNvbnRlbnRBcmVhKChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSkpKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMobU1zZyk7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShtTXNnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRWaWV3VmlzaWJpbGl0eShWaWV3IHYsIGludCB2aXMsIGludCBhbmltKSB7CisgICAgICAgIGlmICh2LmdldFZpc2liaWxpdHkoKSAhPSB2aXMpIHsKKyAgICAgICAgICAgIC8vU2xvZy5kKFRBRywgInNldFZpZXdWaXNpYmlsaXR5IHZpcz0iICsgKHZpcyA9PSBWaWV3LlZJU0lCTEUpICsgIiB2PSIgKyB2KTsKKyAgICAgICAgICAgIHYuc2V0QW5pbWF0aW9uKEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oKENvbnRleHQpdGhpcywgYW5pbSkpOworICAgICAgICAgICAgdi5zZXRWaXNpYmlsaXR5KHZpcyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvVGFibGV0U3RhdHVzQmFyVmlldy5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvVGFibGV0U3RhdHVzQmFyVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MzZlNGEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9UYWJsZXRTdGF0dXNCYXJWaWV3LmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKKworcHVibGljIGNsYXNzIFRhYmxldFN0YXR1c0JhclZpZXcgZXh0ZW5kcyBGcmFtZUxheW91dCB7CisgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOworCisgICAgcHJpdmF0ZSBWaWV3W10gbUlnbm9yZUNoaWxkcmVuID0gbmV3IFZpZXdbMl07CisgICAgcHJpdmF0ZSBWaWV3W10gbVBhbmVscyA9IG5ldyBWaWV3WzJdOworICAgIHByaXZhdGUgaW50W10gbVBvcyA9IG5ldyBpbnRbMl07CisKKyAgICBwdWJsaWMgVGFibGV0U3RhdHVzQmFyVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgfQorCisgICAgcHVibGljIFRhYmxldFN0YXR1c0JhclZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9uSW50ZXJjZXB0VG91Y2hFdmVudChNb3Rpb25FdmVudCBldikgeworICAgICAgICBpZiAoZXYuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKKyAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKFRhYmxldFN0YXR1c0JhclNlcnZpY2UuTVNHX0NMT1NFX05PVElGSUNBVElPTl9QQU5FTCk7CisgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKFRhYmxldFN0YXR1c0JhclNlcnZpY2UuTVNHX0NMT1NFX05PVElGSUNBVElPTl9QQU5FTCk7CisgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhUYWJsZXRTdGF0dXNCYXJTZXJ2aWNlLk1TR19DTE9TRV9TWVNURU1fUEFORUwpOworICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShUYWJsZXRTdGF0dXNCYXJTZXJ2aWNlLk1TR19DTE9TRV9TWVNURU1fUEFORUwpOworCisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bVBhbmVscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtUGFuZWxzW2ldLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50SW5zaWRlKG1JZ25vcmVDaGlsZHJlbltpXSwgZXYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIub25JbnRlcmNlcHRUb3VjaEV2ZW50KGV2KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZXZlbnRJbnNpZGUoVmlldyB2LCBNb3Rpb25FdmVudCBldikgeworICAgICAgICAvLyBhc3N1bWUgdGhhdCB4IGFuZCB5IGFyZSB3aW5kb3cgY29vcmRzIGJlY2F1c2Ugd2UgYXJlLgorICAgICAgICBmaW5hbCBpbnQgeCA9IChpbnQpZXYuZ2V0WCgpOworICAgICAgICBmaW5hbCBpbnQgeSA9IChpbnQpZXYuZ2V0WSgpOworCisgICAgICAgIGZpbmFsIGludFtdIHAgPSBtUG9zOworICAgICAgICB2LmdldExvY2F0aW9uSW5XaW5kb3cocCk7CisKKyAgICAgICAgZmluYWwgaW50IGwgPSBwWzBdOworICAgICAgICBmaW5hbCBpbnQgdCA9IHBbMV07CisgICAgICAgIGZpbmFsIGludCByID0gcFswXSArIHYuZ2V0V2lkdGgoKTsKKyAgICAgICAgZmluYWwgaW50IGIgPSBwWzFdICsgdi5nZXRIZWlnaHQoKTsKKworICAgICAgICByZXR1cm4geCA+PSBsICYmIHggPCByICYmIHkgPj0gdCAmJiB5IDwgYjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyKEhhbmRsZXIgaCkgeworICAgICAgICBtSGFuZGxlciA9IGg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWdub3JlQ2hpbGRyZW4oaW50IGluZGV4LCBWaWV3IGlnbm9yZSwgVmlldyBwYW5lbCkgeworICAgICAgICBtSWdub3JlQ2hpbGRyZW5baW5kZXhdID0gaWdub3JlOworICAgICAgICBtUGFuZWxzW2luZGV4XSA9IHBhbmVsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1RhYmxldFRpY2tlci5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvVGFibGV0VGlja2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzMTM5ZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1RhYmxldFRpY2tlci5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJOb3RpZmljYXRpb247CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworcHVibGljIGNsYXNzIFRhYmxldFRpY2tlciBleHRlbmRzIEhhbmRsZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RhdHVzQmFyLlRhYmxldFRpY2tlciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FEVkFOQ0UgPSAxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFEVkFOQ0VfREVMQVkgPSA1MDAwOyAvLyA1IHNlY29uZHMKKworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIEZyYW1lTGF5b3V0IG1QYXJlbnQ7CisKKyAgICBwcml2YXRlIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBtQ3VycmVudE5vdGlmaWNhdGlvbjsKKyAgICBwcml2YXRlIFZpZXcgbUN1cnJlbnRWaWV3OworCisgICAgcHJpdmF0ZSBTdGF0dXNCYXJOb3RpZmljYXRpb25bXSBtUXVldWU7CisgICAgcHJpdmF0ZSBpbnQgbVF1ZXVlUG9zOworCisgICAgcHVibGljIFRhYmxldFRpY2tlcihDb250ZXh0IGNvbnRleHQsIEZyYW1lTGF5b3V0IHBhcmVudCkgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1QYXJlbnQgPSBwYXJlbnQ7CisKKyAgICAgICAgLy8gVE9ETzogTWFrZSB0aGlzIGEgY29uZmlndXJhdGlvbiB2YWx1ZS4KKyAgICAgICAgLy8gMyBpcyBlbm91Z2ggdG8gbGV0IHVzIHNlZSBtb3N0IGNhc2VzLCBidXQgbm90IGdldCBzbyBmYXIgYmVoaW5kIHRoYXQgaXQncyBhbm5veWluZy4KKyAgICAgICAgbVF1ZXVlID0gbmV3IFN0YXR1c0Jhck5vdGlmaWNhdGlvblszXTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGQoU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworICAgICAgICBpZiAoZmFsc2UpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJhZGQgbUN1cnJlbnROb3RpZmljYXRpb249IiArIG1DdXJyZW50Tm90aWZpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICsgIiBtUXVldWVQb3M9IiArIG1RdWV1ZVBvcyArICIgbVF1ZXVlPSIgKyBBcnJheXMudG9TdHJpbmcobVF1ZXVlKSk7CisgICAgICAgIH0KKyAgICAgICAgbVF1ZXVlW21RdWV1ZVBvc10gPSBub3RpZmljYXRpb247CisKKyAgICAgICAgLy8gSWYgbm90aGluZyBpcyBydW5uaW5nIG5vdywgc3RhcnQgdGhlIG5leHQgb25lCisgICAgICAgIGlmIChtQ3VycmVudE5vdGlmaWNhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBzZW5kRW1wdHlNZXNzYWdlKE1TR19BRFZBTkNFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtUXVldWVQb3MgPCBtUXVldWUubGVuZ3RoIC0gMSkgeworICAgICAgICAgICAgbVF1ZXVlUG9zKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBoYWx0KCkgeworICAgICAgICByZW1vdmVNZXNzYWdlcyhNU0dfQURWQU5DRSk7CisgICAgICAgIGlmIChtQ3VycmVudFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtUXVldWUubGVuZ3RoOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIG1RdWV1ZVtpXSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUXVldWVQb3MgPSAwOworICAgICAgICAgICAgc2VuZEVtcHR5TWVzc2FnZShNU0dfQURWQU5DRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgIGNhc2UgTVNHX0FEVkFOQ0U6CisgICAgICAgICAgICAgICAgYWR2YW5jZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkdmFuY2UoKSB7CisgICAgICAgIC8vIE91dCB3aXRoIHRoZSBvbGQuLi4KKyAgICAgICAgaWYgKG1DdXJyZW50VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUGFyZW50LnJlbW92ZVZpZXcobUN1cnJlbnRWaWV3KTsKKyAgICAgICAgICAgIG1DdXJyZW50VmlldyA9IG51bGw7CisgICAgICAgICAgICBtQ3VycmVudE5vdGlmaWNhdGlvbiA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbiB3aXRoIHRoZSBuZXcuLi4KKyAgICAgICAgZmluYWwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5leHQgPSBkZXF1ZXVlKCk7CisgICAgICAgIGlmIChuZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DdXJyZW50Tm90aWZpY2F0aW9uID0gbmV4dDsKKyAgICAgICAgICAgIG1DdXJyZW50VmlldyA9IG1ha2VUaWNrZXJWaWV3KG5leHQpOworICAgICAgICAgICAgbVBhcmVudC5hZGRWaWV3KG1DdXJyZW50Vmlldyk7CisgICAgICAgICAgICBzZW5kRW1wdHlNZXNzYWdlRGVsYXllZChNU0dfQURWQU5DRSwgQURWQU5DRV9ERUxBWSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBkZXF1ZXVlKCkgeworICAgICAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gbVF1ZXVlWzBdOworICAgICAgICBpZiAoZmFsc2UpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJkZXF1ZXVlIG1RdWV1ZVBvcz0iICsgbVF1ZXVlUG9zICsgIiBtUXVldWU9IiArIEFycmF5cy50b1N0cmluZyhtUXVldWUpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgTiA9IG1RdWV1ZVBvczsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgbVF1ZXVlW2ldID0gbVF1ZXVlW2krMV07CisgICAgICAgIH0KKyAgICAgICAgbVF1ZXVlW05dID0gbnVsbDsKKyAgICAgICAgaWYgKG1RdWV1ZVBvcyA+IDApIHsKKyAgICAgICAgICAgIG1RdWV1ZVBvcy0tOworICAgICAgICB9CisgICAgICAgIHJldHVybiBub3RpZmljYXRpb247CisgICAgfQorCisgICAgcHJpdmF0ZSBWaWV3IG1ha2VUaWNrZXJWaWV3KFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKyAgICAgICAgZmluYWwgTm90aWZpY2F0aW9uIG4gPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uOworCisgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gKExheW91dEluZmxhdGVyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoCisgICAgICAgICAgICAgICAgQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7CisKKyAgICAgICAgaW50IGxheW91dElkOworICAgICAgICBWaWV3R3JvdXAgZ3JvdXA7CisgICAgICAgIGlmIChuLnRpY2tlclRpdGxlICE9IG51bGwgfHwgbi50aWNrZXJTdWJ0aXRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBncm91cCA9IChWaWV3R3JvdXApaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC50aWNrZXIsIG1QYXJlbnQsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChuLnRpY2tlclRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUZXh0VmlldyB0aXRsZSA9IChUZXh0Vmlldylncm91cC5maW5kVmlld0J5SWQoUi5pZC50aXRsZSk7CisgICAgICAgICAgICAgICAgdGl0bGUuc2V0VGV4dChuLnRpY2tlclRpdGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuLnRpY2tlclN1YnRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUZXh0VmlldyBzdWJ0aXRsZSA9IChUZXh0Vmlldylncm91cC5maW5kVmlld0J5SWQoUi5pZC5zdWJ0aXRsZSk7CisgICAgICAgICAgICAgICAgc3VidGl0bGUuc2V0VGV4dChuLnRpY2tlclN1YnRpdGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdyb3VwID0gKFZpZXdHcm91cClpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnRpY2tlcl9jb21wYXQsIG1QYXJlbnQsIGZhbHNlKTsKKyAgICAgICAgICAgIFRleHRWaWV3IHR2ID0gKFRleHRWaWV3KWdyb3VwLmZpbmRWaWV3QnlJZChSLmlkLnRleHQpOworICAgICAgICAgICAgdHYuc2V0VGV4dChuLnRpY2tlclRleHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm8gbW9yZSB0aGFuIDIgaWNvbnMuCisgICAgICAgIGlmIChuLnRpY2tlckljb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBOID0gbi50aWNrZXJJY29ucy5sZW5ndGg7CisgICAgICAgICAgICBpZiAoTiA+IDIpIHsKKyAgICAgICAgICAgICAgICBOID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGk9Ti0xOyBpPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgQml0bWFwIGIgPSBuLnRpY2tlckljb25zW2ldOworICAgICAgICAgICAgICAgIGlmIChiICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgSW1hZ2VWaWV3IGl2ID0gKEltYWdlVmlldylpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnRpY2tlcl9pY29uLCBncm91cCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBpdi5zZXRJbWFnZUJpdG1hcChiKTsKKyAgICAgICAgICAgICAgICAgICAgZ3JvdXAuYWRkVmlldyhpdiwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGdyb3VwOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvQW5kcm9pZC5tayBiL3BhY2thZ2VzL1R0c1NlcnZpY2Uvam5pL0FuZHJvaWQubWsKaW5kZXggYjQxNzU5YS4uNWRjMGMzMCAxMDA3NTUKLS0tIGEvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvQW5kcm9pZC5taworKysgYi9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9BbmRyb2lkLm1rCkBAIC01LDYgKzUsNyBAQAogCWFuZHJvaWRfdHRzX1N5bnRoUHJveHkuY3BwCiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAorCWZyYW1ld29ya3MvYmFzZS9uYXRpdmUvaW5jbHVkZSBcCiAJJChKTklfSF9JTkNMVURFKQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1R0c1NlcnZpY2Uvam5pL2FuZHJvaWRfdHRzX1N5bnRoUHJveHkuY3BwIGIvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvYW5kcm9pZF90dHNfU3ludGhQcm94eS5jcHAKaW5kZXggMWQ2OTM2MS4uOGRjODhkYiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvYW5kcm9pZF90dHNfU3ludGhQcm94eS5jcHAKKysrIGIvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvYW5kcm9pZF90dHNfU3ludGhQcm94eS5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBHb29nbGUgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9qbmkuaD4KICNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvSk5JSGVscC5oPgogI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgotI2luY2x1ZGUgPHR0cy9UdHNFbmdpbmUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL3R0cy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAKQEAgLTE1NCw3ICsxNTQsNyBAQAogY2xhc3MgU3ludGhQcm94eUpuaVN0b3JhZ2UgewogICAgIHB1YmxpYyA6CiAgICAgICAgIGpvYmplY3QgICAgICAgICAgICAgICAgICAgdHRzX3JlZjsKLSAgICAgICAgVHRzRW5naW5lKiAgICAgICAgICAgICAgICBtTmF0aXZlU3ludGhJbnRlcmZhY2U7CisgICAgICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90KiAgICAgICBtRW5naW5lOwogICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgIG1FbmdpbmVMaWJIYW5kbGU7CiAgICAgICAgIEF1ZGlvVHJhY2sqICAgICAgICAgICAgICAgbUF1ZGlvT3V0OwogICAgICAgICBpbnQ4X3QgICAgICAgICAgICAgICAgICAgIG1QbGF5U3RhdGU7CkBAIC0xNjgsNyArMTY4LDcgQEAKIAogICAgICAgICBTeW50aFByb3h5Sm5pU3RvcmFnZSgpIHsKICAgICAgICAgICAgIHR0c19yZWYgPSBOVUxMOwotICAgICAgICAgICAgbU5hdGl2ZVN5bnRoSW50ZXJmYWNlID0gTlVMTDsKKyAgICAgICAgICAgIG1FbmdpbmUgPSBOVUxMOwogICAgICAgICAgICAgbUVuZ2luZUxpYkhhbmRsZSA9IE5VTEw7CiAgICAgICAgICAgICBtQXVkaW9PdXQgPSBOVUxMOwogICAgICAgICAgICAgbVBsYXlTdGF0ZSA9ICBTWU5USFBMQVlTVEFURV9JU19TVE9QUEVEOwpAQCAtMTg0LDkgKzE4NCw5IEBACiAgICAgICAgIH5TeW50aFByb3h5Sm5pU3RvcmFnZSgpIHsKICAgICAgICAgICAgIC8vTE9HVigiZW50ZXJpbmcgflN5bnRoUHJveHlKbmlTdG9yYWdlKCkiKTsKICAgICAgICAgICAgIGtpbGxBdWRpbygpOwotICAgICAgICAgICAgaWYgKG1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICAgICAgICAgIG1OYXRpdmVTeW50aEludGVyZmFjZS0+c2h1dGRvd24oKTsKLSAgICAgICAgICAgICAgICBtTmF0aXZlU3ludGhJbnRlcmZhY2UgPSBOVUxMOworICAgICAgICAgICAgaWYgKG1FbmdpbmUpIHsKKyAgICAgICAgICAgICAgICBtRW5naW5lLT5mdW5jcy0+c2h1dGRvd24obUVuZ2luZSk7CisgICAgICAgICAgICAgICAgbUVuZ2luZSA9IE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobUVuZ2luZUxpYkhhbmRsZSkgewogICAgICAgICAgICAgICAgIC8vTE9HRSgiflN5bnRoUHJveHlKbmlTdG9yYWdlKCk6IGJlZm9yZSBjbG9zZSBsaWJyYXJ5Iik7CkBAIC0yNzMsMjggKzI3Myw0NSBAQAogICogQ2FsbGJhY2sgZnJvbSBUVFMgZW5naW5lLgogICogRGlyZWN0bHkgc3BlYWtzIHVzaW5nIEF1ZGlvVHJhY2sgb3Igd3JpdGUgdG8gZmlsZQogICovCi1zdGF0aWMgdHRzX2NhbGxiYWNrX3N0YXR1cyB0dHNTeW50aERvbmVDQih2b2lkIComIHVzZXJkYXRhLCB1aW50MzJfdCByYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LCBpbnQgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCAqJndhdiwgc2l6ZV90ICZidWZmZXJTaXplLCB0dHNfc3ludGhfc3RhdHVzIHN0YXR1cykgeworZXh0ZXJuICJDIiBhbmRyb2lkX3R0c19jYWxsYmFja19zdGF0dXNfdAorX190dHNTeW50aERvbmVDQih2b2lkICoqIHBVc2VyZGF0YSwgdWludDMyX3QgcmF0ZSwKKyAgICAgICAgICAgICAgIGFuZHJvaWRfdHRzX2F1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGNoYW5uZWwsCisgICAgICAgICAgICAgICBpbnQ4X3QgKipwV2F2LCBzaXplX3QgKnBCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgYW5kcm9pZF90dHNfc3ludGhfc3RhdHVzX3Qgc3RhdHVzKSAKK3sKICAgICAvL0xPR1YoInR0c1N5bnRoRG9uZUNhbGxiYWNrOiAlZCBieXRlcyIsIGJ1ZmZlclNpemUpOworICAgIEF1ZGlvU3lzdGVtOjphdWRpb19mb3JtYXQgIGVuY29kaW5nOwogCi0gICAgaWYgKHVzZXJkYXRhID09IE5VTEwpeworICAgIGlmICgqcFVzZXJkYXRhID09IE5VTEwpewogICAgICAgICBMT0dFKCJ1c2VyZGF0YSA9PSBOVUxMIik7Ci0gICAgICAgIHJldHVybiBUVFNfQ0FMTEJBQ0tfSEFMVDsKKyAgICAgICAgcmV0dXJuIEFORFJPSURfVFRTX0NBTExCQUNLX0hBTFQ7CiAgICAgfQotICAgIGFmdGVyU3ludGhEYXRhX3QqIHBGb3JBZnRlciA9IChhZnRlclN5bnRoRGF0YV90Kil1c2VyZGF0YTsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX1BDTV84X0JJVDoKKyAgICAgICAgZW5jb2RpbmcgPSBBdWRpb1N5c3RlbTo6UENNXzhfQklUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICBlbmNvZGluZyA9IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dFKCJDYW4ndCBwbGF5LCBiYWQgZm9ybWF0Iik7CisgICAgICAgIHJldHVybiBBTkRST0lEX1RUU19DQUxMQkFDS19IQUxUOworICAgIH0KKyAgICBhZnRlclN5bnRoRGF0YV90KiBwRm9yQWZ0ZXIgPSAoYWZ0ZXJTeW50aERhdGFfdCopICpwVXNlcmRhdGE7CiAgICAgU3ludGhQcm94eUpuaVN0b3JhZ2UqIHBKbmlEYXRhID0gKFN5bnRoUHJveHlKbmlTdG9yYWdlKikocEZvckFmdGVyLT5qbmlTdG9yYWdlKTsKIAogICAgIGlmIChwRm9yQWZ0ZXItPnVzYWdlTW9kZSA9PSBVU0FHRU1PREVfUExBWV9JTU1FRElBVEVMWSl7CiAgICAgICAgIC8vTE9HVigiRGlyZWN0IHNwZWVjaCIpOwogCi0gICAgICAgIGlmICh3YXYgPT0gTlVMTCkgeworICAgICAgICBpZiAoKnBXYXYgPT0gTlVMTCkgewogICAgICAgICAgICAgZGVsZXRlIHBGb3JBZnRlcjsKKyAgICAgICAgICAgIHBGb3JBZnRlciA9IE5VTEw7CiAgICAgICAgICAgICBMT0dWKCJOdWxsOiBzcGVlY2ggaGFzIGNvbXBsZXRlZCIpOworICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfVFRTX0NBTExCQUNLX0hBTFQ7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoYnVmZmVyU2l6ZSA+IDApIHsKLSAgICAgICAgICAgIHByZXBBdWRpb1RyYWNrKHBKbmlEYXRhLCBwRm9yQWZ0ZXItPnN0cmVhbVR5cGUsIHJhdGUsIChBdWRpb1N5c3RlbTo6YXVkaW9fZm9ybWF0KWZvcm1hdCwgY2hhbm5lbCk7CisgICAgICAgIGlmICgqcEJ1ZmZlclNpemUgPiAwKSB7CisgICAgICAgICAgICBwcmVwQXVkaW9UcmFjayhwSm5pRGF0YSwgcEZvckFmdGVyLT5zdHJlYW1UeXBlLCByYXRlLCBlbmNvZGluZywgY2hhbm5lbCk7CiAgICAgICAgICAgICBpZiAocEpuaURhdGEtPm1BdWRpb091dCkgewogICAgICAgICAgICAgICAgIHBKbmlEYXRhLT5tUGxheUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgIGlmKHBKbmlEYXRhLT5tQXVkaW9PdXQtPnN0b3BwZWQoKQpAQCAtMzAzLDI4ICszMjAsMzEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcEpuaURhdGEtPm1QbGF5TG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICBpZiAoYlVzZUZpbHRlcikgewotICAgICAgICAgICAgICAgICAgICBhcHBseUZpbHRlcigoaW50MTZfdCopd2F2LCBidWZmZXJTaXplLzIpOworICAgICAgICAgICAgICAgICAgICBhcHBseUZpbHRlcigoaW50MTZfdCopKnBXYXYsICpwQnVmZmVyU2l6ZS8yKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEpuaURhdGEtPm1BdWRpb091dC0+d3JpdGUod2F2LCBidWZmZXJTaXplKTsKLSAgICAgICAgICAgICAgICBtZW1zZXQod2F2LCAwLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICBwSm5pRGF0YS0+bUF1ZGlvT3V0LT53cml0ZSgqcFdhdiwgKnBCdWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoKnBXYXYsIDAsICpwQnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICAgICAgLy9MT0dWKCJBdWRpb1RyYWNrIHdyb3RlOiAlZCBieXRlcyIsIGJ1ZmZlclNpemUpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBMT0dFKCJDYW4ndCBwbGF5LCBudWxsIGF1ZGlvdHJhY2siKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgcEZvckFmdGVyOworICAgICAgICAgICAgICAgIHBGb3JBZnRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfVFRTX0NBTExCQUNLX0hBTFQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgIGlmIChwRm9yQWZ0ZXItPnVzYWdlTW9kZSA9PSBVU0FHRU1PREVfV1JJVEVfVE9fRklMRSkgewogICAgICAgICAvL0xPR1YoIlNhdmUgdG8gZmlsZSIpOwotICAgICAgICBpZiAod2F2ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCpwV2F2ID09IE5VTEwpIHsKICAgICAgICAgICAgIGRlbGV0ZSBwRm9yQWZ0ZXI7CiAgICAgICAgICAgICBMT0dWKCJOdWxsOiBzcGVlY2ggaGFzIGNvbXBsZXRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIFRUU19DQUxMQkFDS19IQUxUOworICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfVFRTX0NBTExCQUNLX0hBTFQ7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGJ1ZmZlclNpemUgPiAwKXsKKyAgICAgICAgaWYgKCpwQnVmZmVyU2l6ZSA+IDApewogICAgICAgICAgICAgaWYgKGJVc2VGaWx0ZXIpIHsKLSAgICAgICAgICAgICAgICBhcHBseUZpbHRlcigoaW50MTZfdCopd2F2LCBidWZmZXJTaXplLzIpOworICAgICAgICAgICAgICAgIGFwcGx5RmlsdGVyKChpbnQxNl90KikqcFdhdiwgKnBCdWZmZXJTaXplLzIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZndyaXRlKHdhdiwgMSwgYnVmZmVyU2l6ZSwgcEZvckFmdGVyLT5vdXRwdXRGaWxlKTsKLSAgICAgICAgICAgIG1lbXNldCh3YXYsIDAsIGJ1ZmZlclNpemUpOworICAgICAgICAgICAgZndyaXRlKCpwV2F2LCAxLCAqcEJ1ZmZlclNpemUsIHBGb3JBZnRlci0+b3V0cHV0RmlsZSk7CisgICAgICAgICAgICBtZW1zZXQoKnBXYXYsIDAsICpwQnVmZmVyU2l6ZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgLy8gRnV0dXJlIHVwZGF0ZToKQEAgLTMzMiw3ICszNTIsNyBAQAogICAgIC8vICAgICAgamF2YVRUU0ZpZWxkcy5zeW50aFByb3h5TWV0aG9kUG9zdCBtZXRob2RlIHRvIG5vdGlmeQogICAgIC8vICAgICAgcGxheWJhY2sgaGFzIGNvbXBsZXRlZCBpZiB0aGUgc3ludGhlc2lzIGlzIGRvbmUgb3IgaWYgYSBtYXJrZXIgaGFzIGJlZW4gcmVhY2hlZC4KIAotICAgIGlmIChzdGF0dXMgPT0gVFRTX1NZTlRIX0RPTkUpIHsKKyAgICBpZiAoc3RhdHVzID09IEFORFJPSURfVFRTX1NZTlRIX0RPTkUpIHsKICAgICAgICAgLy8gdGhpcyBzdHJ1Y3Qgd2FzIGFsbG9jYXRlZCBpbiB0aGUgb3JpZ2luYWwgYW5kcm9pZF90dHNfU3ludGhQcm94eV9zcGVhayBjYWxsLAogICAgICAgICAvLyBhbGwgcHJvY2Vzc2luZyBtYXRjaGluZyB0aGlzIGNhbGwgaXMgbm93IGRvbmUuCiAgICAgICAgIExPR1YoIlNwZWVjaCBzeW50aGVzaXMgZG9uZS4iKTsKQEAgLTM0MiwxNiArMzYyLDE2IEBACiAgICAgICAgICAgICBkZWxldGUgcEZvckFmdGVyOwogICAgICAgICAgICAgcEZvckFmdGVyID0gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFRTX0NBTExCQUNLX0hBTFQ7CisgICAgICAgIHJldHVybiBBTkRST0lEX1RUU19DQUxMQkFDS19IQUxUOwogICAgIH0KIAogICAgIC8vIHdlIGRvbid0IHVwZGF0ZSB0aGUgd2F2IChvdXRwdXQpIHBhcmFtZXRlciBhcyB3ZSdsbCBsZXQgdGhlIG5leHQgY2FsbGJhY2sKICAgICAvLyB3cml0ZSBhdCB0aGUgc2FtZSBsb2NhdGlvbiwgd2UndmUgY29uc3VtZWQgdGhlIGRhdGEgYWxyZWFkeSwgYnV0IHdlIG5lZWQKICAgICAvLyB0byB1cGRhdGUgYnVmZmVyU2l6ZSB0byBsZXQgdGhlIFRUUyBlbmdpbmUga25vdyBob3cgbXVjaCBpdCBjYW4gd3JpdGUgdGhlCiAgICAgLy8gbmV4dCB0aW1lIGl0IGNhbGxzIHRoaXMgZnVuY3Rpb24uCi0gICAgYnVmZmVyU2l6ZSA9IHBKbmlEYXRhLT5tQnVmZmVyU2l6ZTsKKyAgICAqcEJ1ZmZlclNpemUgPSBwSm5pRGF0YS0+bUJ1ZmZlclNpemU7CiAKLSAgICByZXR1cm4gVFRTX0NBTExCQUNLX0NPTlRJTlVFOworICAgIHJldHVybiBBTkRST0lEX1RUU19DQUxMQkFDS19DT05USU5VRTsKIH0KIAogCkBAIC0zNjAsNyArMzgwLDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0TG93U2hlbGYoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamJvb2xlYW4gYXBwbHlGaWx0ZXIsCiAgICAgICAgIGpmbG9hdCBmaWx0ZXJHYWluLCBqZmxvYXQgYXR0ZW51YXRpb25JbkRiLCBqZmxvYXQgZnJlcUluSHosIGpmbG9hdCBzbG9wZSkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX1NVQ0NFU1M7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX1NVQ0NFU1M7CiAKICAgICBiVXNlRmlsdGVyID0gYXBwbHlGaWx0ZXI7CiAgICAgaWYgKGFwcGx5RmlsdGVyKSB7CkBAIC0zNzMsNyArMzkzLDcgQEAKICAgICAgICAgICAgIGluaXRpYWxpemVFUSgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBzbG9wZSwgY2FuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgICAgICAgICByZXN1bHQgPSBBTkRST0lEX1RUU19GQUlMVVJFOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zODUsNyArNDA1LDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfbmF0aXZlX3NldHVwKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosCiAgICAgICAgIGpvYmplY3Qgd2Vha190aGlzLCBqc3RyaW5nIG5hdGl2ZVNvTGliLCBqc3RyaW5nIGVuZ0NvbmZpZykKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAKICAgICBiVXNlRmlsdGVyID0gZmFsc2U7CiAKQEAgLTQwMiwxOCArNDIyLDI4IEBACiAgICAgaWYgKGVuZ2luZV9saWJfaGFuZGxlID09IE5VTEwpIHsKICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X25hdGl2ZV9zZXR1cCgpOiBlbmdpbmVfbGliX2hhbmRsZSA9PSBOVUxMIik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgVHRzRW5naW5lICooKmdldF9UdHNFbmdpbmUpKCkgPQotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxUdHNFbmdpbmUqICgqKSgpPihkbHN5bShlbmdpbmVfbGliX2hhbmRsZSwgImdldFR0c0VuZ2luZSIpKTsKKyAgICAgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKiAoKmdldF9UdHNFbmdpbmUpKCkgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxhbmRyb2lkX3R0c19lbmdpbmVfdCogKCopKCk+KGRsc3ltKGVuZ2luZV9saWJfaGFuZGxlLCAiYW5kcm9pZF9nZXRUdHNFbmdpbmUiKSk7CiAKLSAgICAgICAgcEpuaVN0b3JhZ2UtPm1OYXRpdmVTeW50aEludGVyZmFjZSA9ICgqZ2V0X1R0c0VuZ2luZSkoKTsKLSAgICAgICAgcEpuaVN0b3JhZ2UtPm1FbmdpbmVMaWJIYW5kbGUgPSBlbmdpbmVfbGliX2hhbmRsZTsKLQotICAgICAgICBpZiAocEpuaVN0b3JhZ2UtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwoZW5naW5lTXV0ZXgpOwotICAgICAgICAgICAgcEpuaVN0b3JhZ2UtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+aW5pdCh0dHNTeW50aERvbmVDQiwgZW5nQ29uZmlnU3RyaW5nKTsKKyAgICAgICAgLy8gU3VwcG9ydCBvYnNvbGV0ZS9sZWdhY3kgYmluYXJ5IG1vZHVsZXMKKyAgICAgICAgaWYgKGdldF9UdHNFbmdpbmUgPT0gTlVMTCkgeworICAgICAgICAgICAgZ2V0X1R0c0VuZ2luZSA9CisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxhbmRyb2lkX3R0c19lbmdpbmVfdCogKCopKCk+KGRsc3ltKGVuZ2luZV9saWJfaGFuZGxlLCAiZ2V0VHRzRW5naW5lIikpOwogICAgICAgICB9CiAKLSAgICAgICAgcmVzdWx0ID0gVFRTX1NVQ0NFU1M7CisgICAgICAgIHBKbmlTdG9yYWdlLT5tRW5naW5lID0gKCpnZXRfVHRzRW5naW5lKSgpOworICAgICAgICBwSm5pU3RvcmFnZS0+bUVuZ2luZUxpYkhhbmRsZSA9IGVuZ2luZV9saWJfaGFuZGxlOworCisgICAgICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwSm5pU3RvcmFnZS0+bUVuZ2luZTsKKyAgICAgICAgaWYgKGVuZ2luZSkgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwoZW5naW5lTXV0ZXgpOworICAgICAgICAgICAgZW5naW5lLT5mdW5jcy0+aW5pdCgKKyAgICAgICAgICAgICAgICBlbmdpbmUsCisgICAgICAgICAgICAgICAgX190dHNTeW50aERvbmVDQiwKKyAgICAgICAgICAgICAgICBlbmdDb25maWdTdHJpbmcpOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ID0gQU5EUk9JRF9UVFNfU1VDQ0VTUzsKICAgICB9CiAKICAgICAvLyB3ZSB1c2UgYSB3ZWFrIHJlZmVyZW5jZSBzbyB0aGUgU3ludGhQcm94eSBvYmplY3QgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkLgpAQCAtNDYyLDcgKzQ5Miw3IEBACiBhbmRyb2lkX3R0c19TeW50aFByb3h5X2lzTGFuZ3VhZ2VBdmFpbGFibGUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhLAogICAgICAgICBqc3RyaW5nIGxhbmd1YWdlLCBqc3RyaW5nIGNvdW50cnksIGpzdHJpbmcgdmFyaWFudCkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0xBTkdfTk9UX1NVUFBPUlRFRDsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfTEFOR19OT1RfU1VQUE9SVEVEOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X2lzTGFuZ3VhZ2VBdmFpbGFibGUoKTogaW52YWxpZCBKTkkgZGF0YSIpOwpAQCAtNDc0LDggKzUwNCwxMCBAQAogICAgIGNvbnN0IGNoYXIgKmNvdW50cnlOYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGNvdW50cnksIDApOwogICAgIGNvbnN0IGNoYXIgKnZhcmlhbnROYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHZhcmlhbnQsIDApOwogCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICByZXN1bHQgPSBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPmlzTGFuZ3VhZ2VBdmFpbGFibGUobGFuZ05hdGl2ZVN0cmluZywKKyAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKKworICAgIGlmIChlbmdpbmUpIHsKKyAgICAgICAgcmVzdWx0ID0gZW5naW5lLT5mdW5jcy0+aXNMYW5ndWFnZUF2YWlsYWJsZShlbmdpbmUsbGFuZ05hdGl2ZVN0cmluZywKICAgICAgICAgICAgICAgICBjb3VudHJ5TmF0aXZlU3RyaW5nLCB2YXJpYW50TmF0aXZlU3RyaW5nKTsKICAgICB9CiAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMobGFuZ3VhZ2UsIGxhbmdOYXRpdmVTdHJpbmcpOwpAQCAtNDg3LDcgKzUxOSw3IEBACiBzdGF0aWMgaW50CiBhbmRyb2lkX3R0c19TeW50aFByb3h5X3NldENvbmZpZyhKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEsIGpzdHJpbmcgZW5naW5lQ29uZmlnKQogewotICAgIGludCByZXN1bHQgPSBUVFNfRkFJTFVSRTsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfRkFJTFVSRTsKIAogICAgIGlmIChqbmlEYXRhID09IDApIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9zZXRDb25maWcoKTogaW52YWxpZCBKTkkgZGF0YSIpOwpAQCAtNDk4LDkgKzUzMCwxMCBAQAogCiAgICAgU3ludGhQcm94eUpuaVN0b3JhZ2UqIHBTeW50aERhdGEgPSAoU3ludGhQcm94eUpuaVN0b3JhZ2UqKWpuaURhdGE7CiAgICAgY29uc3QgY2hhciAqZW5naW5lQ29uZmlnTmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhlbmdpbmVDb25maWcsIDApOworICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOwogCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICByZXN1bHQgPSBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPnNldFByb3BlcnR5KEFORFJPSURfVFRTX0VOR0lORV9QUk9QRVJUWV9DT05GSUcsCisgICAgaWYgKGVuZ2luZSkgeworICAgICAgICByZXN1bHQgPSBlbmdpbmUtPmZ1bmNzLT5zZXRQcm9wZXJ0eShlbmdpbmUsQU5EUk9JRF9UVFNfRU5HSU5FX1BST1BFUlRZX0NPTkZJRywKICAgICAgICAgICAgICAgICBlbmdpbmVDb25maWdOYXRpdmVTdHJpbmcsIHN0cmxlbihlbmdpbmVDb25maWdOYXRpdmVTdHJpbmcpKTsKICAgICB9CiAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoZW5naW5lQ29uZmlnLCBlbmdpbmVDb25maWdOYXRpdmVTdHJpbmcpOwpAQCAtNTEyLDcgKzU0NSw3IEBACiBhbmRyb2lkX3R0c19TeW50aFByb3h5X3NldExhbmd1YWdlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSwKICAgICAgICAganN0cmluZyBsYW5ndWFnZSwganN0cmluZyBjb3VudHJ5LCBqc3RyaW5nIHZhcmlhbnQpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19MQU5HX05PVF9TVVBQT1JURUQ7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0xBTkdfTk9UX1NVUFBPUlRFRDsKIAogICAgIGlmIChqbmlEYXRhID09IDApIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9zZXRMYW5ndWFnZSgpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC01MjUsOSArNTU4LDEwIEBACiAgICAgY29uc3QgY2hhciAqbGFuZ05hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMobGFuZ3VhZ2UsIDApOwogICAgIGNvbnN0IGNoYXIgKmNvdW50cnlOYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGNvdW50cnksIDApOwogICAgIGNvbnN0IGNoYXIgKnZhcmlhbnROYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHZhcmlhbnQsIDApOworICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOwogCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICByZXN1bHQgPSBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPnNldExhbmd1YWdlKGxhbmdOYXRpdmVTdHJpbmcsCisgICAgaWYgKGVuZ2luZSkgeworICAgICAgICByZXN1bHQgPSBlbmdpbmUtPmZ1bmNzLT5zZXRMYW5ndWFnZShlbmdpbmUsIGxhbmdOYXRpdmVTdHJpbmcsCiAgICAgICAgICAgICAgICAgY291bnRyeU5hdGl2ZVN0cmluZywgdmFyaWFudE5hdGl2ZVN0cmluZyk7CiAgICAgfQogICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGxhbmd1YWdlLCBsYW5nTmF0aXZlU3RyaW5nKTsKQEAgLTU0MSw3ICs1NzUsNyBAQAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9sb2FkTGFuZ3VhZ2UoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhLAogICAgICAgICBqc3RyaW5nIGxhbmd1YWdlLCBqc3RyaW5nIGNvdW50cnksIGpzdHJpbmcgdmFyaWFudCkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0xBTkdfTk9UX1NVUFBPUlRFRDsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfTEFOR19OT1RfU1VQUE9SVEVEOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X2xvYWRMYW5ndWFnZSgpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC01NTIsOSArNTg2LDEwIEBACiAgICAgY29uc3QgY2hhciAqbGFuZ05hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMobGFuZ3VhZ2UsIDApOwogICAgIGNvbnN0IGNoYXIgKmNvdW50cnlOYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGNvdW50cnksIDApOwogICAgIGNvbnN0IGNoYXIgKnZhcmlhbnROYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHZhcmlhbnQsIDApOworICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOwogCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICByZXN1bHQgPSBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPmxvYWRMYW5ndWFnZShsYW5nTmF0aXZlU3RyaW5nLAorICAgIGlmIChlbmdpbmUpIHsKKyAgICAgICAgcmVzdWx0ID0gZW5naW5lLT5mdW5jcy0+bG9hZExhbmd1YWdlKGVuZ2luZSwgbGFuZ05hdGl2ZVN0cmluZywKICAgICAgICAgICAgICAgICBjb3VudHJ5TmF0aXZlU3RyaW5nLCB2YXJpYW50TmF0aXZlU3RyaW5nKTsKICAgICB9CiAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMobGFuZ3VhZ2UsIGxhbmdOYXRpdmVTdHJpbmcpOwpAQCAtNTY5LDcgKzYwNCw3IEBACiBhbmRyb2lkX3R0c19TeW50aFByb3h5X3NldFNwZWVjaFJhdGUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhLAogICAgICAgICBqaW50IHNwZWVjaFJhdGUpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19GQUlMVVJFOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19GQUlMVVJFOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3NldFNwZWVjaFJhdGUoKTogaW52YWxpZCBKTkkgZGF0YSIpOwpAQCAtNTg0LDkgKzYxOSwxMCBAQAogCiAgICAgU3ludGhQcm94eUpuaVN0b3JhZ2UqIHBTeW50aERhdGEgPSAoU3ludGhQcm94eUpuaVN0b3JhZ2UqKWpuaURhdGE7CiAgICAgTE9HSSgic2V0dGluZyBzcGVlY2ggcmF0ZSB0byAlZCIsIHNwZWVjaFJhdGUpOworICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOwogCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICByZXN1bHQgPSBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPnNldFByb3BlcnR5KCJyYXRlIiwgYnVmZmVyLCBidWZTaXplKTsKKyAgICBpZiAoZW5naW5lKSB7CisgICAgICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPnNldFByb3BlcnR5KGVuZ2luZSwgInJhdGUiLCBidWZmZXIsIGJ1ZlNpemUpOwogICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CkBAIC01OTcsNyArNjMzLDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0UGl0Y2goSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhLAogICAgICAgICBqaW50IHBpdGNoKQogewotICAgIGludCByZXN1bHQgPSBUVFNfRkFJTFVSRTsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfRkFJTFVSRTsKIAogICAgIGlmIChqbmlEYXRhID09IDApIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9zZXRQaXRjaCgpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC02MTIsOSArNjQ4LDEwIEBACiAKICAgICBTeW50aFByb3h5Sm5pU3RvcmFnZSogcFN5bnRoRGF0YSA9IChTeW50aFByb3h5Sm5pU3RvcmFnZSopam5pRGF0YTsKICAgICBMT0dJKCJzZXR0aW5nIHBpdGNoIHRvICVkIiwgcGl0Y2gpOworICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOwogCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICByZXN1bHQgPSBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPnNldFByb3BlcnR5KCJwaXRjaCIsIGJ1ZmZlciwgYnVmU2l6ZSk7CisgICAgaWYgKGVuZ2luZSkgeworICAgICAgICByZXN1bHQgPSBlbmdpbmUtPmZ1bmNzLT5zZXRQcm9wZXJ0eShlbmdpbmUsICJwaXRjaCIsIGJ1ZmZlciwgYnVmU2l6ZSk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTYyNSw3ICs2NjIsNyBAQAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9zeW50aGVzaXplVG9GaWxlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSwKICAgICAgICAganN0cmluZyB0ZXh0SmF2YVN0cmluZywganN0cmluZyBmaWxlbmFtZUphdmFTdHJpbmcpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19GQUlMVVJFOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19GQUlMVVJFOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3N5bnRoZXNpemVUb0ZpbGUoKTogaW52YWxpZCBKTkkgZGF0YSIpOwpAQCAtNjMzLDcgKzY3MCw3IEBACiAgICAgfQogCiAgICAgU3ludGhQcm94eUpuaVN0b3JhZ2UqIHBTeW50aERhdGEgPSAoU3ludGhQcm94eUpuaVN0b3JhZ2UqKWpuaURhdGE7Ci0gICAgaWYgKCFwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKKyAgICBpZiAoIXBTeW50aERhdGEtPm1FbmdpbmUpIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9zeW50aGVzaXplVG9GaWxlKCk6IGludmFsaWQgZW5naW5lIGhhbmRsZSIpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTY0MywxMiArNjgwLDIyIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwoZW5naW5lTXV0ZXgpOwogCiAgICAgLy8gUmV0cmlldmUgYXVkaW8gcGFyYW1ldGVycyBiZWZvcmUgd3JpdGluZyB0aGUgZmlsZSBoZWFkZXIKLSAgICBBdWRpb1N5c3RlbTo6YXVkaW9fZm9ybWF0IGVuY29kaW5nID0gREVGQVVMVF9UVFNfRk9STUFUOworICAgIEF1ZGlvU3lzdGVtOjphdWRpb19mb3JtYXQgZW5jb2Rpbmc7CiAgICAgdWludDMyX3QgcmF0ZSA9IERFRkFVTFRfVFRTX1JBVEU7CiAgICAgaW50IGNoYW5uZWxzID0gREVGQVVMVF9UVFNfTkJfQ0hBTk5FTFM7Ci0gICAgcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5zZXRBdWRpb0Zvcm1hdChlbmNvZGluZywgcmF0ZSwgY2hhbm5lbHMpOworICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOworICAgIGFuZHJvaWRfdHRzX2F1ZGlvX2Zvcm1hdF90ICBmb3JtYXQgPSBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfREVGQVVMVDsKIAotICAgIGlmICgoZW5jb2RpbmcgIT0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQpICYmIChlbmNvZGluZyAhPSBBdWRpb1N5c3RlbTo6UENNXzhfQklUKSkgeworICAgIGVuZ2luZS0+ZnVuY3MtPnNldEF1ZGlvRm9ybWF0KGVuZ2luZSwgJmZvcm1hdCwgJnJhdGUsICZjaGFubmVscyk7CisKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgIGVuY29kaW5nID0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX1BDTV84X0JJVDoKKyAgICAgICAgZW5jb2RpbmcgPSBBdWRpb1N5c3RlbTo6UENNXzhfQklUOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3N5bnRoZXNpemVUb0ZpbGUoKTogZW5naW5lIHVzZXMgaW52YWxpZCBmb3JtYXQiKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CkBAIC02NzcsNyArNzI0LDggQEAKICAgICB1bnNpZ25lZCBpbnQgdW5pcXVlX2lkZW50aWZpZXI7CiAKICAgICBtZW1zZXQocFN5bnRoRGF0YS0+bUJ1ZmZlciwgMCwgcFN5bnRoRGF0YS0+bUJ1ZmZlclNpemUpOwotICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+c3ludGhlc2l6ZVRleHQodGV4dE5hdGl2ZVN0cmluZywKKworICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPnN5bnRoZXNpemVUZXh0KGVuZ2luZSwgdGV4dE5hdGl2ZVN0cmluZywKICAgICAgICAgICAgIHBTeW50aERhdGEtPm1CdWZmZXIsIHBTeW50aERhdGEtPm1CdWZmZXJTaXplLCAodm9pZCAqKXBGb3JBZnRlcik7CiAKICAgICBsb25nIGZpbGVsZW4gPSBmdGVsbChwRm9yQWZ0ZXItPm91dHB1dEZpbGUpOwpAQCAtNzM3LDcgKzc4NSw3IEBACiBhbmRyb2lkX3R0c19TeW50aFByb3h5X3NwZWFrKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSwKICAgICAgICAganN0cmluZyB0ZXh0SmF2YVN0cmluZywgamludCBqYXZhU3RyZWFtVHlwZSkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3BlYWsoKTogaW52YWxpZCBKTkkgZGF0YSIpOwpAQCAtNzU5LDEwICs4MDcsMTIgQEAKICAgICBwRm9yQWZ0ZXItPnVzYWdlTW9kZSAgPSBVU0FHRU1PREVfUExBWV9JTU1FRElBVEVMWTsKICAgICBwRm9yQWZ0ZXItPnN0cmVhbVR5cGUgPSAoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKSBqYXZhU3RyZWFtVHlwZTsKIAotICAgIGlmIChwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKKyAgICBpZiAocFN5bnRoRGF0YS0+bUVuZ2luZSkgewogICAgICAgICBjb25zdCBjaGFyICp0ZXh0TmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyh0ZXh0SmF2YVN0cmluZywgMCk7CiAgICAgICAgIG1lbXNldChwU3ludGhEYXRhLT5tQnVmZmVyLCAwLCBwU3ludGhEYXRhLT5tQnVmZmVyU2l6ZSk7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+c3ludGhlc2l6ZVRleHQodGV4dE5hdGl2ZVN0cmluZywKKyAgICAgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CisKKyAgICAgICAgcmVzdWx0ID0gZW5naW5lLT5mdW5jcy0+c3ludGhlc2l6ZVRleHQoZW5naW5lLCB0ZXh0TmF0aXZlU3RyaW5nLAogICAgICAgICAgICAgICAgIHBTeW50aERhdGEtPm1CdWZmZXIsIHBTeW50aERhdGEtPm1CdWZmZXJTaXplLCAodm9pZCAqKXBGb3JBZnRlcik7CiAgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHRleHRKYXZhU3RyaW5nLCB0ZXh0TmF0aXZlU3RyaW5nKTsKICAgICB9CkBAIC03NzQsNyArODI0LDcgQEAKIHN0YXRpYyBpbnQKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3RvcChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19GQUlMVVJFOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19GQUlMVVJFOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3N0b3AoKTogaW52YWxpZCBKTkkgZGF0YSIpOwpAQCAtNzkwLDggKzg0MCw5IEBACiAgICAgfQogICAgIHBTeW50aERhdGEtPm1QbGF5TG9jay51bmxvY2soKTsKIAotICAgIGlmIChwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKLSAgICAgICAgcmVzdWx0ID0gcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5zdG9wKCk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CisgICAgaWYgKGVuZ2luZSkgeworICAgICAgICByZXN1bHQgPSBlbmdpbmUtPmZ1bmNzLT5zdG9wKGVuZ2luZSk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTgwMSw3ICs4NTIsNyBAQAogc3RhdGljIGludAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9zdG9wU3luYyhKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19GQUlMVVJFOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19GQUlMVVJFOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3N0b3AoKTogaW52YWxpZCBKTkkgZGF0YSIpOwpAQCAtODI5LDcgKzg4MCw3IEBACiAKICAgICBTeW50aFByb3h5Sm5pU3RvcmFnZSogcFN5bnRoRGF0YSA9IChTeW50aFByb3h5Sm5pU3RvcmFnZSopam5pRGF0YTsKIAotICAgIGlmIChwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UpIHsKKyAgICBpZiAocFN5bnRoRGF0YS0+bUVuZ2luZSkgewogICAgICAgICBzaXplX3QgYnVmU2l6ZSA9IDEwMDsKICAgICAgICAgY2hhciBsYW5nW2J1ZlNpemVdOwogICAgICAgICBjaGFyIGNvdW50cnlbYnVmU2l6ZV07CkBAIC04MzksNyArODkwLDkgQEAKICAgICAgICAgbWVtc2V0KHZhcmlhbnQsIDAsIGJ1ZlNpemUpOwogICAgICAgICBqb2JqZWN0QXJyYXkgcmV0TG9jYWxlID0gKGpvYmplY3RBcnJheSllbnYtPk5ld09iamVjdEFycmF5KDMsCiAgICAgICAgICAgICAgICAgZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9TdHJpbmciKSwgZW52LT5OZXdTdHJpbmdVVEYoIiIpKTsKLSAgICAgICAgcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5nZXRMYW5ndWFnZShsYW5nLCBjb3VudHJ5LCB2YXJpYW50KTsKKworICAgICAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKKyAgICAgICAgZW5naW5lLT5mdW5jcy0+Z2V0TGFuZ3VhZ2UoZW5naW5lLCBsYW5nLCBjb3VudHJ5LCB2YXJpYW50KTsKICAgICAgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQocmV0TG9jYWxlLCAwLCBlbnYtPk5ld1N0cmluZ1VURihsYW5nKSk7CiAgICAgICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KHJldExvY2FsZSwgMSwgZW52LT5OZXdTdHJpbmdVVEYoY291bnRyeSkpOwogICAgICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChyZXRMb2NhbGUsIDIsIGVudi0+TmV3U3RyaW5nVVRGKHZhcmlhbnQpKTsKQEAgLTg2NCw4ICs5MTcsOSBAQAogICAgIGNoYXIgYnVmW2J1ZlNpemVdOwogICAgIG1lbXNldChidWYsIDAsIGJ1ZlNpemUpOwogICAgIC8vIFRPRE8gY2hlY2sgcmV0dXJuIGNvZGVzCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPmdldFByb3BlcnR5KCJyYXRlIiwgYnVmLCAmYnVmU2l6ZSk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CisgICAgaWYgKGVuZ2luZSkgeworICAgICAgICBlbmdpbmUtPmZ1bmNzLT5nZXRQcm9wZXJ0eShlbmdpbmUsInJhdGUiLCBidWYsICZidWZTaXplKTsKICAgICB9CiAgICAgcmV0dXJuIGF0b2koYnVmKTsKIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1ZwblNlcnZpY2VzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9WcG5TZXJ2aWNlcy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCmluZGV4IDRhOTNlMGEuLjgwZmVmYTQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1ZwblNlcnZpY2VzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKKysrIGIvcGFja2FnZXMvVnBuU2VydmljZXMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KICAgICA8c3RyaW5nIG5hbWU9ImFwcF9sYWJlbCIgbXNnaWQ9IjQ1ODk1OTI4MjkzMDI0OTgxMDIiPiJTZXJ2aWNlcyBWUE4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ2cG5fbm90aWZpY2F0aW9uX3RpdGxlX2Nvbm5lY3RlZCIgbXNnaWQ9Ijg1OTg2NTQ0ODY5NTYxMzM1ODAiPiJWUE4gPHhsaWZmOmcgaWQ9IlBST0ZJTEVOQU1FIj4lczwveGxpZmY6Zz4gY29ubmVjdMOpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idnBuX25vdGlmaWNhdGlvbl90aXRsZV9jb25uZWN0ZWQiIG1zZ2lkPSI4NTk4NjU0NDg2OTU2MTMzNTgwIj4iVlBOIFxuPHhsaWZmOmcgaWQ9IlBST0ZJTEVOQU1FIj4lczwveGxpZmY6Zz4gY29ubmVjdMOpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idnBuX25vdGlmaWNhdGlvbl90aXRsZV9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI2MjE2NTcyMjY0MzgyMTkyMDI3Ij4iVlBOIDx4bGlmZjpnIGlkPSJQUk9GSUxFTkFNRSI+JXM8L3hsaWZmOmc+IGTDqWNvbm5lY3TDqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InZwbl9ub3RpZmljYXRpb25faGludF9kaXNjb25uZWN0ZWQiIG1zZ2lkPSIxOTUyMjA5ODY3MDgyMjY5NDI5Ij4iVG91Y2hleiBsXCfDqWNyYW4gcG91ciB2b3VzIHJlY29ubmVjdGVyIMOgIHVuIFZQTi4iPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvS2V5Z3VhcmRWaWV3TWFuYWdlci5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEKaW5kZXggYmExZDdmNS4uNzBhNGIyMCAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEKQEAgLTExMyw3ICsxMTMsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UKTsKICAgICAgICAgICAgIGxwLnNvZnRJbnB1dE1vZGUgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX0FESlVTVF9QQU47CiAgICAgICAgICAgICBscC53aW5kb3dBbmltYXRpb25zID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5BbmltYXRpb25fTG9ja1NjcmVlbjsKLSAgICAgICAgICAgIGxwLnNjcmVlbk9yaWVudGF0aW9uID0gQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9OT1NFTlNPUjsKKworICAgICAgICAgICAgaWYgKG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldEJvb2xlYW4oUi5ib29sLmNvbmZpZ19lbmFibGVMb2NrU2NyZWVuUm90YXRpb24pKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm90YXRpb24gc2Vuc29yIGZvciBsb2NrIHNjcmVlbiBPbiEiKTsKKyAgICAgICAgICAgICAgICBscC5zY3JlZW5PcmllbnRhdGlvbiA9IEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fU0VOU09SOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3RhdGlvbiBzZW5zb3IgZm9yIGxvY2sgc2NyZWVuIE9mZiEiKTsKKyAgICAgICAgICAgICAgICBscC5zY3JlZW5PcmllbnRhdGlvbiA9IEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fTk9TRU5TT1I7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGxwLnNldFRpdGxlKCJLZXlndWFyZCIpOwogICAgICAgICAgICAgbVdpbmRvd0xheW91dFBhcmFtcyA9IGxwOwogCmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0tleWd1YXJkVmlld01lZGlhdG9yLmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0tleWd1YXJkVmlld01lZGlhdG9yLmphdmEKaW5kZXggODgyMDNjMy4uZDE5ZjMxOCAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNZWRpYXRvci5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvS2V5Z3VhcmRWaWV3TWVkaWF0b3IuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5pbXBsOwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9PRkZfVElNRU9VVDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NDYXJkOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblV0aWxzOwogCkBAIC00MSw2ICs0Myw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwpAQCAtOTMsNiArOTYsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgS2V5Z3VhcmRWaWV3TWVkaWF0b3IgaW1wbGVtZW50cyBLZXlndWFyZFZpZXdDYWxsYmFjaywKICAgICAgICAgS2V5Z3VhcmRVcGRhdGVNb25pdG9yLlNpbVN0YXRlQ2FsbGJhY2sgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLRVlHVUFSRF9ESVNQTEFZX1RJTUVPVVRfREVMQVlfREVGQVVMVCA9IDMwMDAwOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZSAmJiBDb25maWcuTE9HRDsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIERCR19XQUtFID0gREVCVUcgfHwgdHJ1ZTsKIApAQCAtMTMzLDcgKzEzNyw3IEBACiAgICAgICogdHVybmluZyBvbiB0aGUga2V5Z3VhcmQgKGkuZSwgdGhlIHVzZXIgaGFzIHRoaXMgbXVjaCB0aW1lIHRvIHR1cm4KICAgICAgKiB0aGUgc2NyZWVuIGJhY2sgb24gd2l0aG91dCBoYXZpbmcgdG8gZmFjZSB0aGUga2V5Z3VhcmQpLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLRVlHVUFSRF9ERUxBWV9NUyA9IDUwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtFWUdVQVJEX0xPQ0tfQUZURVJfREVMQVlfREVGQVVMVCA9IDUwMDA7CiAKICAgICAvKioKICAgICAgKiBIb3cgbG9uZyB3ZSdsbCB3YWl0IGZvciB0aGUge0BsaW5rIEtleWd1YXJkVmlld0NhbGxiYWNrI2tleWd1YXJkRG9uZURyYXdpbmcoKX0KQEAgLTI0NCw2ICsyNDgsNyBAQAogICAgICAqIHRoZSBrZXlndWFyZC4KICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gbVdhaXRpbmdVbnRpbEtleWd1YXJkVmlzaWJsZSA9IGZhbHNlOworICAgIHByaXZhdGUgTG9ja1BhdHRlcm5VdGlscyBtTG9ja1BhdHRlcm5VdGlsczsKIAogICAgIHB1YmxpYyBLZXlndWFyZFZpZXdNZWRpYXRvcihDb250ZXh0IGNvbnRleHQsIFBob25lV2luZG93TWFuYWdlciBjYWxsYmFjaywKICAgICAgICAgICAgIExvY2FsUG93ZXJNYW5hZ2VyIHBvd2VyTWFuYWdlcikgewpAQCAtMjc1LDggKzI4MCw5IEBACiAKICAgICAgICAgbVVwZGF0ZU1vbml0b3IucmVnaXN0ZXJTaW1TdGF0ZUNhbGxiYWNrKHRoaXMpOwogCi0gICAgICAgIG1LZXlndWFyZFZpZXdQcm9wZXJ0aWVzID0gbmV3IExvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3UHJvcGVydGllcygKLSAgICAgICAgICAgICAgICBuZXcgTG9ja1BhdHRlcm5VdGlscyhtQ29udGV4dCksIG1VcGRhdGVNb25pdG9yKTsKKyAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMgPSBuZXcgTG9ja1BhdHRlcm5VdGlscyhtQ29udGV4dCk7CisgICAgICAgIG1LZXlndWFyZFZpZXdQcm9wZXJ0aWVzIAorICAgICAgICAgICAgICAgID0gbmV3IExvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3UHJvcGVydGllcyhtTG9ja1BhdHRlcm5VdGlscywgbVVwZGF0ZU1vbml0b3IpOwogCiAgICAgICAgIG1LZXlndWFyZFZpZXdNYW5hZ2VyID0gbmV3IEtleWd1YXJkVmlld01hbmFnZXIoCiAgICAgICAgICAgICAgICAgY29udGV4dCwgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLCB0aGlzLApAQCAtMzI2LDE1ICszMzIsNDYgQEAKICAgICAgICAgICAgICAgICAvLyB0byBlbmFibGUgaXQgYSBsaXR0bGUgYml0IGxhdGVyIChpLmUsIGdpdmUgdGhlIHVzZXIgYSBjaGFuY2UKICAgICAgICAgICAgICAgICAvLyB0byB0dXJuIHRoZSBzY3JlZW4gYmFjayBvbiB3aXRoaW4gYSBjZXJ0YWluIHdpbmRvdyB3aXRob3V0CiAgICAgICAgICAgICAgICAgLy8gaGF2aW5nIHRvIHVubG9jayB0aGUgc2NyZWVuKQotICAgICAgICAgICAgICAgIGxvbmcgd2hlbiA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpICsgS0VZR1VBUkRfREVMQVlfTVM7Ci0gICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoREVMQVlFRF9LRVlHVUFSRF9BQ1RJT04pOwotICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgic2VxIiwgbURlbGF5ZWRTaG93aW5nU2VxdWVuY2UpOwotICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgc2VuZGVyID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAwLCBpbnRlbnQsIFBlbmRpbmdJbnRlbnQuRkxBR19DQU5DRUxfQ1VSUkVOVCk7Ci0gICAgICAgICAgICAgICAgbUFsYXJtTWFuYWdlci5zZXQoQWxhcm1NYW5hZ2VyLkVMQVBTRURfUkVBTFRJTUVfV0FLRVVQLCB3aGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgInNldHRpbmcgYWxhcm0gdG8gdHVybiBvZmYga2V5Z3VhcmQsIHNlcSA9ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbURlbGF5ZWRTaG93aW5nU2VxdWVuY2UpOworICAgICAgICAgICAgICAgIGZpbmFsIENvbnRlbnRSZXNvbHZlciBjciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworCisgICAgICAgICAgICAgICAgLy8gRnJvbSBEaXNwbGF5U2V0dGluZ3MKKyAgICAgICAgICAgICAgICBsb25nIGRpc3BsYXlUaW1lb3V0ID0gU2V0dGluZ3MuU3lzdGVtLmdldEludChjciwgU0NSRUVOX09GRl9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgS0VZR1VBUkRfRElTUExBWV9USU1FT1VUX0RFTEFZX0RFRkFVTFQpOworCisgICAgICAgICAgICAgICAgLy8gRnJvbSBTZWN1cml0eVNldHRpbmdzCisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBsb2NrQWZ0ZXJUaW1lb3V0ID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChjciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5MT0NLX1NDUkVFTl9MT0NLX0FGVEVSX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICBLRVlHVUFSRF9MT0NLX0FGVEVSX0RFTEFZX0RFRkFVTFQpOworCisgICAgICAgICAgICAgICAgLy8gRnJvbSBEZXZpY2VQb2xpY3lBZG1pbgorICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcG9saWN5VGltZW91dCA9IG1Mb2NrUGF0dGVyblV0aWxzLmdldERldmljZVBvbGljeU1hbmFnZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1heGltdW1UaW1lVG9Mb2NrKG51bGwpOworCisgICAgICAgICAgICAgICAgbG9uZyB0aW1lb3V0OworICAgICAgICAgICAgICAgIGlmIChwb2xpY3lUaW1lb3V0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBwb2xpY3kgaW4gZWZmZWN0LiBNYWtlIHN1cmUgd2UgZG9uJ3QgZ28gYmV5b25kIHBvbGljeSBsaW1pdC4KKyAgICAgICAgICAgICAgICAgICAgZGlzcGxheVRpbWVvdXQgPSBNYXRoLm1heChkaXNwbGF5VGltZW91dCwgMCk7IC8vIGlnbm9yZSBuZWdhdGl2ZSB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IE1hdGgubWluKHBvbGljeVRpbWVvdXQgLSBkaXNwbGF5VGltZW91dCwgbG9ja0FmdGVyVGltZW91dCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IGxvY2tBZnRlclRpbWVvdXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRpbWVvdXQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBMb2NrIG5vdworICAgICAgICAgICAgICAgICAgICBtU3VwcHJlc3NOZXh0TG9ja1NvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZG9LZXlndWFyZCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIExvY2sgaW4gdGhlIGZ1dHVyZQorICAgICAgICAgICAgICAgICAgICBsb25nIHdoZW4gPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSArIHRpbWVvdXQ7CisgICAgICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KERFTEFZRURfS0VZR1VBUkRfQUNUSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJzZXEiLCBtRGVsYXllZFNob3dpbmdTZXF1ZW5jZSk7CisgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgc2VuZGVyID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QobUNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgaW50ZW50LCBQZW5kaW5nSW50ZW50LkZMQUdfQ0FOQ0VMX0NVUlJFTlQpOworICAgICAgICAgICAgICAgICAgICBtQWxhcm1NYW5hZ2VyLnNldChBbGFybU1hbmFnZXIuRUxBUFNFRF9SRUFMVElNRV9XQUtFVVAsIHdoZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJzZXR0aW5nIGFsYXJtIHRvIHR1cm4gb2ZmIGtleWd1YXJkLCBzZXEgPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRGVsYXllZFNob3dpbmdTZXF1ZW5jZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmICh3aHkgPT0gV2luZG93TWFuYWdlclBvbGljeS5PRkZfQkVDQVVTRV9PRl9QUk9YX1NFTlNPUikgewogICAgICAgICAgICAgICAgIC8vIERvIG5vdCBlbmFibGUgdGhlIGtleWd1YXJkIGlmIHRoZSBwcm94IHNlbnNvciBmb3JjZWQgdGhlIHNjcmVlbiBvZmYuCiAgICAgICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhCmluZGV4IDI3NzA2ZWYuLjgyMmJlNDYgMTAwNjQ0Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1BhdHRlcm5LZXlndWFyZFZpZXcuamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3LmphdmEKQEAgLTY0NSw3ICs2NDUsOSBAQAogICAgICAgICAgICAgLy8gU2hvdyBMb2NrU2NyZWVuIGZpcnN0IGZvciBhbnkgc2NyZWVuIG90aGVyIHRoYW4gUGF0dGVybiB1bmxvY2suCiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHVzaW5nTG9ja1BhdHRlcm4gPSBtTG9ja1BhdHRlcm5VdGlscy5nZXRLZXlndWFyZFN0b3JlZFBhc3N3b3JkUXVhbGl0eSgpCiAgICAgICAgICAgICAgICAgICAgID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkc7Ci0gICAgICAgICAgICBpZiAoaXNTZWN1cmUoKSAmJiB1c2luZ0xvY2tQYXR0ZXJuKSB7CisKKyAgICAgICAgICAgIGJvb2xlYW4gc2hvd1NsaWRpbmdUYWIgPSBnZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKFIuYm9vbC5jb25maWdfZW5hYmxlU2xpZGluZ1RhYkZpcnN0KTsKKyAgICAgICAgICAgIGlmIChpc1NlY3VyZSgpICYmICh1c2luZ0xvY2tQYXR0ZXJuIHx8ICFzaG93U2xpZGluZ1RhYikpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTW9kZS5VbmxvY2tTY3JlZW47CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJldHVybiBNb2RlLkxvY2tTY3JlZW47CkBAIC02NjcsNiArNjY5LDcgQEAKICAgICAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDOgogICAgICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUM6CiAgICAgICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDOgorICAgICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVg6CiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNb2RlID0gVW5sb2NrTW9kZS5QYXNzd29yZDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HOgpAQCAtNjg3LDggKzY5MCwxNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHNob3dUaW1lb3V0RGlhbG9nKCkgewogICAgICAgICBpbnQgdGltZW91dEluU2Vjb25kcyA9IChpbnQpIExvY2tQYXR0ZXJuVXRpbHMuRkFJTEVEX0FUVEVNUFRfVElNRU9VVF9NUyAvIDEwMDA7CisgICAgICAgIGludCBtZXNzYWdlSWQgPSBSLnN0cmluZy5sb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZTsKKyAgICAgICAgaWYoZ2V0VW5sb2NrTW9kZSgpID09IFVubG9ja01vZGUuUGFzc3dvcmQpIHsKKyAgICAgICAgICAgIGlmKG1Mb2NrUGF0dGVyblV0aWxzLmdldEtleWd1YXJkU3RvcmVkUGFzc3dvcmRRdWFsaXR5KCkgPT0KKyAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQykgeworICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCA9IFIuc3RyaW5nLmxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZUlkID0gUi5zdHJpbmcubG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBtQ29udGV4dC5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgUi5zdHJpbmcubG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgbWVzc2FnZUlkLAogICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldEZhaWxlZEF0dGVtcHRzKCksCiAgICAgICAgICAgICAgICAgdGltZW91dEluU2Vjb25kcyk7CiAgICAgICAgIGZpbmFsIEFsZXJ0RGlhbG9nIGRpYWxvZyA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKG1Db250ZXh0KQpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrU2NyZWVuLmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tTY3JlZW4uamF2YQppbmRleCBhNWVmMWZhLi4zNTgzYWI5IDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tTY3JlZW4uamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tTY3JlZW4uamF2YQpAQCAtMjAsNiArMjAsOCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NDYXJkOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblV0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5TbGlkaW5nVGFiOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5XYXZlVmlldzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuV2F2ZVZpZXcuT25UcmlnZ2VyTGlzdGVuZXI7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CkBAIC00Niw4ICs0OCw5IEBACiAgKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlIGRlcGVuZGluZyBvbiBpdHMgc3RhdGUsIGFuZCBob3cgdG8gZ2V0CiAgKiBwYXN0IGl0LCBhcyBhcHBsaWNhYmxlLgogICovCi1jbGFzcyBMb2NrU2NyZWVuIGV4dGVuZHMgTGluZWFyTGF5b3V0IGltcGxlbWVudHMgS2V5Z3VhcmRTY3JlZW4sIEtleWd1YXJkVXBkYXRlTW9uaXRvci5JbmZvQ2FsbGJhY2ssCi0gICAgICAgIEtleWd1YXJkVXBkYXRlTW9uaXRvci5TaW1TdGF0ZUNhbGxiYWNrLCBTbGlkaW5nVGFiLk9uVHJpZ2dlckxpc3RlbmVyIHsKK2NsYXNzIExvY2tTY3JlZW4gZXh0ZW5kcyBMaW5lYXJMYXlvdXQgaW1wbGVtZW50cyBLZXlndWFyZFNjcmVlbiwKKyAgICAgICAgS2V5Z3VhcmRVcGRhdGVNb25pdG9yLkluZm9DYWxsYmFjaywKKyAgICAgICAgS2V5Z3VhcmRVcGRhdGVNb25pdG9yLlNpbVN0YXRlQ2FsbGJhY2sgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkxvY2tTY3JlZW4iOwpAQCAtNTksMTIgKzYyLDcgQEAKICAgICBwcml2YXRlIGZpbmFsIEtleWd1YXJkVXBkYXRlTW9uaXRvciBtVXBkYXRlTW9uaXRvcjsKICAgICBwcml2YXRlIGZpbmFsIEtleWd1YXJkU2NyZWVuQ2FsbGJhY2sgbUNhbGxiYWNrOwogCi0gICAgcHJpdmF0ZSBUZXh0VmlldyBtQ2FycmllcjsKLSAgICBwcml2YXRlIFNsaWRpbmdUYWIgbVNlbGVjdG9yOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpbWU7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtRGF0ZTsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1TdGF0dXMxOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1czI7CisgICAgcHJpdmF0ZSBTbGlkaW5nVGFiIG1TbGlkaW5nVGFiOwogICAgIHByaXZhdGUgVGV4dFZpZXcgbVNjcmVlbkxvY2tlZDsKICAgICBwcml2YXRlIFRleHRWaWV3IG1FbWVyZ2VuY3lDYWxsVGV4dDsKICAgICBwcml2YXRlIEJ1dHRvbiBtRW1lcmdlbmN5Q2FsbEJ1dHRvbjsKQEAgLTkzLDYgKzkxLDExIEBACiAgICAgcHJpdmF0ZSBqYXZhLnRleHQuRGF0ZUZvcm1hdCBtVGltZUZvcm1hdDsKICAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZU1lbnVLZXlJbkxvY2tTY3JlZW47CiAKKyAgICBwcml2YXRlIFN0YXR1c1ZpZXcgbVN0YXR1c1ZpZXc7CisgICAgcHJpdmF0ZSBXYXZlVmlldyBtRW5lcmd5V2F2ZTsKKyAgICBwcml2YXRlIFNsaWRpbmdUYWJNZXRob2RzIG1TbGlkaW5nVGFiTWV0aG9kczsKKyAgICBwcml2YXRlIFdhdmVWaWV3TWV0aG9kcyBtV2F2ZVZpZXdNZXRob2RzOworCiAgICAgLyoqCiAgICAgICogVGhlIHN0YXR1cyBvZiB0aGlzIGxvY2sgc2NyZWVuLgogICAgICAqLwpAQCAtMTQ0LDYgKzE0Nyw5MSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgY2xhc3MgU2xpZGluZ1RhYk1ldGhvZHMgaW1wbGVtZW50cyBTbGlkaW5nVGFiLk9uVHJpZ2dlckxpc3RlbmVyIHsKKworICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlUmlnaHRUYWJSZXNvdXJjZXMoKSB7CisgICAgICAgICAgICBib29sZWFuIHZpYmUgPSBtU2lsZW50TW9kZQorICAgICAgICAgICAgICAgICYmIChtQXVkaW9NYW5hZ2VyLmdldFJpbmdlck1vZGUoKSA9PSBBdWRpb01hbmFnZXIuUklOR0VSX01PREVfVklCUkFURSk7CisKKyAgICAgICAgICAgIG1TbGlkaW5nVGFiLnNldFJpZ2h0VGFiUmVzb3VyY2VzKAorICAgICAgICAgICAgICAgICAgICBtU2lsZW50TW9kZSA/ICggdmliZSA/IFIuZHJhd2FibGUuaWNfam9nX2RpYWxfdmlicmF0ZV9vbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuaWNfam9nX2RpYWxfc291bmRfb2ZmICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSLmRyYXdhYmxlLmljX2pvZ19kaWFsX3NvdW5kX29uLAorICAgICAgICAgICAgICAgICAgICBtU2lsZW50TW9kZSA/IFIuZHJhd2FibGUuam9nX3RhYl90YXJnZXRfeWVsbG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5qb2dfdGFiX3RhcmdldF9ncmF5LAorICAgICAgICAgICAgICAgICAgICBtU2lsZW50TW9kZSA/IFIuZHJhd2FibGUuam9nX3RhYl9iYXJfcmlnaHRfc291bmRfb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSLmRyYXdhYmxlLmpvZ190YWJfYmFyX3JpZ2h0X3NvdW5kX29mZiwKKyAgICAgICAgICAgICAgICAgICAgbVNpbGVudE1vZGUgPyBSLmRyYXdhYmxlLmpvZ190YWJfcmlnaHRfc291bmRfb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSLmRyYXdhYmxlLmpvZ190YWJfcmlnaHRfc291bmRfb2ZmKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVHJpZ2dlcihWaWV3IHYsIGludCB3aGljaEhhbmRsZSkgeworICAgICAgICAgICAgaWYgKHdoaWNoSGFuZGxlID09IFNsaWRpbmdUYWIuT25UcmlnZ2VyTGlzdGVuZXIuTEVGVF9IQU5ETEUpIHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2suZ29Ub1VubG9ja1NjcmVlbigpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGljaEhhbmRsZSA9PSBTbGlkaW5nVGFiLk9uVHJpZ2dlckxpc3RlbmVyLlJJR0hUX0hBTkRMRSkgeworICAgICAgICAgICAgICAgIC8vIHRvZ2dsZSBzaWxlbnQgbW9kZQorICAgICAgICAgICAgICAgIG1TaWxlbnRNb2RlID0gIW1TaWxlbnRNb2RlOworICAgICAgICAgICAgICAgIGlmIChtU2lsZW50TW9kZSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHZpYmUgPSAoU2V0dGluZ3MuU3lzdGVtLmdldEludCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5WSUJSQVRFX0lOX1NJTEVOVCwgMSkgPT0gMSk7CisKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRSaW5nZXJNb2RlKHZpYmUKKyAgICAgICAgICAgICAgICAgICAgICAgID8gQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX1ZJQlJBVEUKKyAgICAgICAgICAgICAgICAgICAgICAgIDogQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX1NJTEVOVCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRSaW5nZXJNb2RlKEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9OT1JNQUwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHVwZGF0ZVJpZ2h0VGFiUmVzb3VyY2VzKCk7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IG1TaWxlbnRNb2RlID8KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcuZ2xvYmFsX2FjdGlvbl9zaWxlbnRfbW9kZV9vbl9zdGF0dXMpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcuZ2xvYmFsX2FjdGlvbl9zaWxlbnRfbW9kZV9vZmZfc3RhdHVzKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIGludCB0b2FzdEljb24gPSBtU2lsZW50TW9kZQorICAgICAgICAgICAgICAgICAgICA/IFIuZHJhd2FibGUuaWNfbG9ja19yaW5nZXJfb2ZmCisgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5pY19sb2NrX3Jpbmdlcl9vbjsKKworICAgICAgICAgICAgICAgIGZpbmFsIGludCB0b2FzdENvbG9yID0gbVNpbGVudE1vZGUKKyAgICAgICAgICAgICAgICAgICAgPyBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29sb3IoUi5jb2xvci5rZXlndWFyZF90ZXh0X2NvbG9yX3NvdW5kb2ZmKQorICAgICAgICAgICAgICAgICAgICA6IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXRDb2xvcihSLmNvbG9yLmtleWd1YXJkX3RleHRfY29sb3Jfc291bmRvbik7CisgICAgICAgICAgICAgICAgdG9hc3RNZXNzYWdlKG1TY3JlZW5Mb2NrZWQsIG1lc3NhZ2UsIHRvYXN0Q29sb3IsIHRvYXN0SWNvbik7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLnBva2VXYWtlbG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25HcmFiYmVkU3RhdGVDaGFuZ2UoVmlldyB2LCBpbnQgZ3JhYmJlZFN0YXRlKSB7CisgICAgICAgICAgICBpZiAoZ3JhYmJlZFN0YXRlID09IFNsaWRpbmdUYWIuT25UcmlnZ2VyTGlzdGVuZXIuUklHSFRfSEFORExFKSB7CisgICAgICAgICAgICAgICAgbVNpbGVudE1vZGUgPSBpc1NpbGVudE1vZGUoKTsKKyAgICAgICAgICAgICAgICBtU2xpZGluZ1RhYi5zZXRSaWdodEhpbnRUZXh0KG1TaWxlbnRNb2RlID8gUi5zdHJpbmcubG9ja3NjcmVlbl9zb3VuZF9vbl9sYWJlbAorICAgICAgICAgICAgICAgICAgICAgICAgOiBSLnN0cmluZy5sb2Nrc2NyZWVuX3NvdW5kX29mZl9sYWJlbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FsbGJhY2sucG9rZVdha2Vsb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBXYXZlVmlld01ldGhvZHMgaW1wbGVtZW50cyBXYXZlVmlldy5PblRyaWdnZXJMaXN0ZW5lciB7CisgICAgICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVHJpZ2dlcihWaWV3IHYsIGludCB3aGljaEhhbmRsZSkgeworICAgICAgICAgICAgaWYgKHdoaWNoSGFuZGxlID09IFdhdmVWaWV3Lk9uVHJpZ2dlckxpc3RlbmVyLkNFTlRFUl9IQU5ETEUpIHsKKyAgICAgICAgICAgICAgICAvLyBEZWxheSBoaWRpbmcgbG9jayBzY3JlZW4gbG9uZyBlbm91Z2ggZm9yIGFuaW1hdGlvbiB0byBmaW5pc2gKKyAgICAgICAgICAgICAgICBwb3N0RGVsYXllZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5nb1RvVW5sb2NrU2NyZWVuKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LCA1MDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25HcmFiYmVkU3RhdGVDaGFuZ2UoVmlldyB2LCBpbnQgZ3JhYmJlZFN0YXRlKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sucG9rZVdha2Vsb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBJbiBnZW5lcmFsLCB3ZSBlbmFibGUgdW5sb2NraW5nIHRoZSBpbnNlY3VyZSBrZXkgZ3VhcmQgd2l0aCB0aGUgbWVudSBrZXkuIEhvd2V2ZXIsIHRoZXJlIGFyZQogICAgICAqIHNvbWUgY2FzZXMgd2hlcmUgd2Ugd2lzaCB0byBkaXNhYmxlIGl0LCBub3RhYmx5IHdoZW4gdGhlIG1lbnUgYnV0dG9uIHBsYWNlbWVudCBvciB0ZWNobm9sb2d5CkBAIC0xOTUsMTkgKzI4Myw5IEBACiAgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmtleWd1YXJkX3NjcmVlbl90YWJfdW5sb2NrX2xhbmQsIHRoaXMsIHRydWUpOwogICAgICAgICB9CiAKLSAgICAgICAgbUNhcnJpZXIgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmNhcnJpZXIpOwotICAgICAgICAvLyBSZXF1aXJlZCBmb3IgTWFycXVlZSB0byB3b3JrCi0gICAgICAgIG1DYXJyaWVyLnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICBtQ2Fycmllci5zZXRUZXh0Q29sb3IoMHhmZmZmZmZmZik7Ci0KLSAgICAgICAgbURhdGUgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmRhdGUpOwotICAgICAgICBtU3RhdHVzMSA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzMSk7Ci0gICAgICAgIG1TdGF0dXMyID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdGF0dXMyKTsKKyAgICAgICAgbVN0YXR1c1ZpZXcgPSBuZXcgU3RhdHVzVmlldyh0aGlzLCBtVXBkYXRlTW9uaXRvciwgbUxvY2tQYXR0ZXJuVXRpbHMpOwogCiAgICAgICAgIG1TY3JlZW5Mb2NrZWQgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnNjcmVlbkxvY2tlZCk7Ci0gICAgICAgIG1TZWxlY3RvciA9IChTbGlkaW5nVGFiKSBmaW5kVmlld0J5SWQoUi5pZC50YWJfc2VsZWN0b3IpOwotICAgICAgICBtU2VsZWN0b3Iuc2V0SG9sZEFmdGVyVHJpZ2dlcih0cnVlLCBmYWxzZSk7Ci0gICAgICAgIG1TZWxlY3Rvci5zZXRMZWZ0SGludFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl91bmxvY2tfbGFiZWwpOwogCiAgICAgICAgIG1FbWVyZ2VuY3lDYWxsVGV4dCA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuZW1lcmdlbmN5Q2FsbFRleHQpOwogICAgICAgICBtRW1lcmdlbmN5Q2FsbEJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLmVtZXJnZW5jeUNhbGxCdXR0b24pOwpAQCAtMjIwLDcgKzI5OCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogCi0KICAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOwogICAgICAgICBzZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKICAgICAgICAgc2V0RGVzY2VuZGFudEZvY3VzYWJpbGl0eShWaWV3R3JvdXAuRk9DVVNfQkxPQ0tfREVTQ0VOREFOVFMpOwpAQCAtMjMxLDE1ICszMDgsMjUgQEAKICAgICAgICAgbUF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpIGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQVVESU9fU0VSVklDRSk7CiAgICAgICAgIG1TaWxlbnRNb2RlID0gaXNTaWxlbnRNb2RlKCk7CiAKLSAgICAgICAgbVNlbGVjdG9yLnNldExlZnRUYWJSZXNvdXJjZXMoCi0gICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5pY19qb2dfZGlhbF91bmxvY2ssCi0gICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5qb2dfdGFiX3RhcmdldF9ncmVlbiwKLSAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLmpvZ190YWJfYmFyX2xlZnRfdW5sb2NrLAotICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuam9nX3RhYl9sZWZ0X3VubG9jayk7Ci0KLSAgICAgICAgdXBkYXRlUmlnaHRUYWJSZXNvdXJjZXMoKTsKLQotICAgICAgICBtU2VsZWN0b3Iuc2V0T25UcmlnZ2VyTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1TbGlkaW5nVGFiID0gKFNsaWRpbmdUYWIpIGZpbmRWaWV3QnlJZChSLmlkLnRhYl9zZWxlY3Rvcik7CisgICAgICAgIG1FbmVyZ3lXYXZlID0gKFdhdmVWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC53YXZlX3ZpZXcpOworICAgICAgICBpZiAobVNsaWRpbmdUYWIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNsaWRpbmdUYWIuc2V0SG9sZEFmdGVyVHJpZ2dlcih0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICBtU2xpZGluZ1RhYi5zZXRMZWZ0SGludFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl91bmxvY2tfbGFiZWwpOworICAgICAgICAgICAgbVNsaWRpbmdUYWIuc2V0TGVmdFRhYlJlc291cmNlcygKKyAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5pY19qb2dfZGlhbF91bmxvY2ssCisgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuam9nX3RhYl90YXJnZXRfZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuam9nX3RhYl9iYXJfbGVmdF91bmxvY2ssCisgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuam9nX3RhYl9sZWZ0X3VubG9jayk7CisgICAgICAgICAgICBtU2xpZGluZ1RhYk1ldGhvZHMgPSBuZXcgU2xpZGluZ1RhYk1ldGhvZHMoKTsKKyAgICAgICAgICAgIG1TbGlkaW5nVGFiLnNldE9uVHJpZ2dlckxpc3RlbmVyKG1TbGlkaW5nVGFiTWV0aG9kcyk7CisgICAgICAgICAgICBtU2xpZGluZ1RhYk1ldGhvZHMudXBkYXRlUmlnaHRUYWJSZXNvdXJjZXMoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtRW5lcmd5V2F2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtV2F2ZVZpZXdNZXRob2RzID0gbmV3IFdhdmVWaWV3TWV0aG9kcygpOworICAgICAgICAgICAgbUVuZXJneVdhdmUuc2V0T25UcmlnZ2VyTGlzdGVuZXIobVdhdmVWaWV3TWV0aG9kcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNdXN0IGhhdmUgZWl0aGVyIFNsaWRpbmdUYWIgb3IgV2F2ZVZpZXcgZGVmaW5lZCIpOworICAgICAgICB9CiAKICAgICAgICAgcmVzZXRTdGF0dXNJbmZvKHVwZGF0ZU1vbml0b3IpOwogICAgIH0KQEAgLTI0OCwyMiArMzM1LDYgQEAKICAgICAgICAgcmV0dXJuIG1BdWRpb01hbmFnZXIuZ2V0UmluZ2VyTW9kZSgpICE9IEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9OT1JNQUw7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJpZ2h0VGFiUmVzb3VyY2VzKCkgewotICAgICAgICBib29sZWFuIHZpYmUgPSBtU2lsZW50TW9kZQotICAgICAgICAgICAgJiYgKG1BdWRpb01hbmFnZXIuZ2V0UmluZ2VyTW9kZSgpID09IEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9WSUJSQVRFKTsKLQotICAgICAgICBtU2VsZWN0b3Iuc2V0UmlnaHRUYWJSZXNvdXJjZXMoCi0gICAgICAgICAgICAgICAgbVNpbGVudE1vZGUgPyAoIHZpYmUgPyBSLmRyYXdhYmxlLmljX2pvZ19kaWFsX3ZpYnJhdGVfb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuaWNfam9nX2RpYWxfc291bmRfb2ZmICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuaWNfam9nX2RpYWxfc291bmRfb24sCi0gICAgICAgICAgICAgICAgbVNpbGVudE1vZGUgPyBSLmRyYXdhYmxlLmpvZ190YWJfdGFyZ2V0X3llbGxvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5qb2dfdGFiX3RhcmdldF9ncmF5LAotICAgICAgICAgICAgICAgIG1TaWxlbnRNb2RlID8gUi5kcmF3YWJsZS5qb2dfdGFiX2Jhcl9yaWdodF9zb3VuZF9vbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5qb2dfdGFiX2Jhcl9yaWdodF9zb3VuZF9vZmYsCi0gICAgICAgICAgICAgICAgbVNpbGVudE1vZGUgPyBSLmRyYXdhYmxlLmpvZ190YWJfcmlnaHRfc291bmRfb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuam9nX3RhYl9yaWdodF9zb3VuZF9vZmYpOwotICAgIH0KLQogICAgIHByaXZhdGUgdm9pZCByZXNldFN0YXR1c0luZm8oS2V5Z3VhcmRVcGRhdGVNb25pdG9yIHVwZGF0ZU1vbml0b3IpIHsKICAgICAgICAgbVNob3dpbmdCYXR0ZXJ5SW5mbyA9IHVwZGF0ZU1vbml0b3Iuc2hvdWxkU2hvd0JhdHRlcnlJbmZvKCk7CiAgICAgICAgIG1QbHVnZ2VkSW4gPSB1cGRhdGVNb25pdG9yLmlzRGV2aWNlUGx1Z2dlZEluKCk7CkBAIC0yODksNTMgKzM2MCw2IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICAvKioge0Bpbmhlcml0RG9jfSAqLwotICAgIHB1YmxpYyB2b2lkIG9uVHJpZ2dlcihWaWV3IHYsIGludCB3aGljaEhhbmRsZSkgewotICAgICAgICBpZiAod2hpY2hIYW5kbGUgPT0gU2xpZGluZ1RhYi5PblRyaWdnZXJMaXN0ZW5lci5MRUZUX0hBTkRMRSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLmdvVG9VbmxvY2tTY3JlZW4oKTsKLSAgICAgICAgfSBlbHNlIGlmICh3aGljaEhhbmRsZSA9PSBTbGlkaW5nVGFiLk9uVHJpZ2dlckxpc3RlbmVyLlJJR0hUX0hBTkRMRSkgewotICAgICAgICAgICAgLy8gdG9nZ2xlIHNpbGVudCBtb2RlCi0gICAgICAgICAgICBtU2lsZW50TW9kZSA9ICFtU2lsZW50TW9kZTsKLSAgICAgICAgICAgIGlmIChtU2lsZW50TW9kZSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdmliZSA9IChTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KAotICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5WSUJSQVRFX0lOX1NJTEVOVCwgMSkgPT0gMSk7Ci0KLSAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFJpbmdlck1vZGUodmliZQotICAgICAgICAgICAgICAgICAgICA/IEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9WSUJSQVRFCi0gICAgICAgICAgICAgICAgICAgIDogQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX1NJTEVOVCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0UmluZ2VyTW9kZShBdWRpb01hbmFnZXIuUklOR0VSX01PREVfTk9STUFMKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXBkYXRlUmlnaHRUYWJSZXNvdXJjZXMoKTsKLQotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBtU2lsZW50TW9kZSA/Ci0gICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcuZ2xvYmFsX2FjdGlvbl9zaWxlbnRfbW9kZV9vbl9zdGF0dXMpIDoKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5nbG9iYWxfYWN0aW9uX3NpbGVudF9tb2RlX29mZl9zdGF0dXMpOwotCi0gICAgICAgICAgICBmaW5hbCBpbnQgdG9hc3RJY29uID0gbVNpbGVudE1vZGUKLSAgICAgICAgICAgICAgICA/IFIuZHJhd2FibGUuaWNfbG9ja19yaW5nZXJfb2ZmCi0gICAgICAgICAgICAgICAgOiBSLmRyYXdhYmxlLmljX2xvY2tfcmluZ2VyX29uOwotCi0gICAgICAgICAgICBmaW5hbCBpbnQgdG9hc3RDb2xvciA9IG1TaWxlbnRNb2RlCi0gICAgICAgICAgICAgICAgPyBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29sb3IoUi5jb2xvci5rZXlndWFyZF90ZXh0X2NvbG9yX3NvdW5kb2ZmKQotICAgICAgICAgICAgICAgIDogZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldENvbG9yKFIuY29sb3Iua2V5Z3VhcmRfdGV4dF9jb2xvcl9zb3VuZG9uKTsKLSAgICAgICAgICAgIHRvYXN0TWVzc2FnZShtU2NyZWVuTG9ja2VkLCBtZXNzYWdlLCB0b2FzdENvbG9yLCB0b2FzdEljb24pOwotICAgICAgICAgICAgbUNhbGxiYWNrLnBva2VXYWtlbG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIHtAaW5oZXJpdERvY30gKi8KLSAgICBwdWJsaWMgdm9pZCBvbkdyYWJiZWRTdGF0ZUNoYW5nZShWaWV3IHYsIGludCBncmFiYmVkU3RhdGUpIHsKLSAgICAgICAgaWYgKGdyYWJiZWRTdGF0ZSA9PSBTbGlkaW5nVGFiLk9uVHJpZ2dlckxpc3RlbmVyLlJJR0hUX0hBTkRMRSkgewotICAgICAgICAgICAgbVNpbGVudE1vZGUgPSBpc1NpbGVudE1vZGUoKTsKLSAgICAgICAgICAgIG1TZWxlY3Rvci5zZXRSaWdodEhpbnRUZXh0KG1TaWxlbnRNb2RlID8gUi5zdHJpbmcubG9ja3NjcmVlbl9zb3VuZF9vbl9sYWJlbAotICAgICAgICAgICAgICAgICAgICA6IFIuc3RyaW5nLmxvY2tzY3JlZW5fc291bmRfb2ZmX2xhYmVsKTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2sucG9rZVdha2Vsb2NrKCk7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogRGlzcGxheXMgYSBtZXNzYWdlIGluIGEgdGV4dCB2aWV3IGFuZCB0aGVuIHJlc3RvcmVzIHRoZSBwcmV2aW91cyB0ZXh0LgogICAgICAqIEBwYXJhbSB0ZXh0VmlldyBUaGUgdGV4dCB2aWV3LgpAQCAtNDI4LDM4ICs0NTIsMTEgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVmcmVzaFRpbWVBbmREYXRlRGlzcGxheSgpIHsKLSAgICAgICAgbURhdGUuc2V0VGV4dChEYXRlRm9ybWF0LmZvcm1hdChtRGF0ZUZvcm1hdFN0cmluZywgbmV3IERhdGUoKSkpOworICAgICAgICBtU3RhdHVzVmlldy5yZWZyZXNoVGltZUFuZERhdGVEaXNwbGF5KCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0YXR1c0xpbmVzKCkgewotICAgICAgICBpZiAoIW1TdGF0dXMuc2hvd1N0YXR1c0xpbmVzKCkKLSAgICAgICAgICAgICAgICB8fCAobUNoYXJnaW5nID09IG51bGwgJiYgbU5leHRBbGFybSA9PSBudWxsKSkgewotICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIGlmIChtQ2hhcmdpbmcgIT0gbnVsbCAmJiBtTmV4dEFsYXJtID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGNoYXJnaW5nIG9ubHkKLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1DaGFyZ2luZyk7Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMobUNoYXJnaW5nSWNvbiwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobU5leHRBbGFybSAhPSBudWxsICYmIG1DaGFyZ2luZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBuZXh0IGFsYXJtIG9ubHkKLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1OZXh0QWxhcm0pOwotICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKG1BbGFybUljb24sIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICB9IGVsc2UgaWYgKG1DaGFyZ2luZyAhPSBudWxsICYmIG1OZXh0QWxhcm0gIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gYm90aCBjaGFyZ2luZyBhbmQgbmV4dCBhbGFybQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1DaGFyZ2luZyk7Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMobUNoYXJnaW5nSWNvbiwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBtU3RhdHVzMi5zZXRUZXh0KG1OZXh0QWxhcm0pOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKG1BbGFybUljb24sIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICB9CisgICAgICAgIG1TdGF0dXNWaWV3LnVwZGF0ZVN0YXR1c0xpbmVzKG1TdGF0dXMuc2hvd1N0YXR1c0xpbmVzKCksIG1DaGFyZ2luZywgbUNoYXJnaW5nSWNvbiwgbUFsYXJtSWNvbik7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KQEAgLTQ5OCw2ICs0OTUsMjIgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFbmFibGVzIHVubG9ja2luZyBvZiB0aGlzIHNjcmVlbi4gVHlwaWNhbGx5IGp1c3Qgc2hvd3MgdGhlIHVubG9jayB3aWRnZXQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuYWJsZVVubG9jaygpIHsKKyAgICAgICAgaWYgKG1FbmVyZ3lXYXZlICE9IG51bGwpIG1FbmVyZ3lXYXZlLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgaWYgKG1TbGlkaW5nVGFiICE9IG51bGwpIG1TbGlkaW5nVGFiLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNhYmxlIHVubG9ja2luZyBvZiB0aGlzIHNjcmVlbi4gVHlwaWNhbGx5IGp1c3QgaGlkZXMgdGhlIHVubG9jayB3aWRnZXQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRpc2FibGVVbmxvY2soKSB7CisgICAgICAgIGlmIChtRW5lcmd5V2F2ZSAhPSBudWxsKSBtRW5lcmd5V2F2ZS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIGlmIChtU2xpZGluZ1RhYiAhPSBudWxsKSBtU2xpZGluZ1RhYi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogVXBkYXRlIHRoZSBsYXlvdXQgdG8gbWF0Y2ggdGhlIGN1cnJlbnQgc3RhdHVzLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVMYXlvdXQoU3RhdHVzIHN0YXR1cykgewpAQCAtNTA5LDcgKzUyMiw3IEBACiAgICAgICAgIHN3aXRjaCAoc3RhdHVzKSB7CiAgICAgICAgICAgICBjYXNlIE5vcm1hbDoKICAgICAgICAgICAgICAgICAvLyB0ZXh0Ci0gICAgICAgICAgICAgICAgbUNhcnJpZXIuc2V0VGV4dCgKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRDYXJyaWVyVGV4dCgKICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhcnJpZXJTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVBsbW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IuZ2V0VGVsZXBob255U3BuKCkpKTsKQEAgLTUxOCwxNCArNTMxLDE1IEBACiAgICAgICAgICAgICAgICAgbVNjcmVlbkxvY2tlZC5zZXRUZXh0KCIiKTsKIAogICAgICAgICAgICAgICAgIC8vIGxheW91dAotICAgICAgICAgICAgICAgIG1TY3JlZW5Mb2NrZWQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1TZWxlY3Rvci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgbVNjcmVlbkxvY2tlZC5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKICAgICAgICAgICAgICAgICBtRW1lcmdlbmN5Q2FsbFRleHQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgIGVuYWJsZVVubG9jaygpOwogICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBjYXNlIE5ldHdvcmtMb2NrZWQ6CiAgICAgICAgICAgICAgICAgLy8gVGhlIGNhcnJpZXIgc3RyaW5nIHNob3dzIGJvdGggc2ltIGNhcmQgc3RhdHVzIChpLmUuIE5vIFNpbSBDYXJkKSBhbmQKICAgICAgICAgICAgICAgICAvLyBjYXJyaWVyJ3MgbmFtZSBhbmQvb3IgIkVtZXJnZW5jeSBDYWxscyBPbmx5IiBzdGF0dXMKLSAgICAgICAgICAgICAgICBtQ2Fycmllci5zZXRUZXh0KAorICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldENhcnJpZXJUZXh0KAogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FycmllclN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IuZ2V0VGVsZXBob255UGxtbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0VGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX25ldHdvcmtfbG9ja2VkX21lc3NhZ2UpKSk7CkBAIC01MzMsMjMgKzU0NywyNCBAQAogCiAgICAgICAgICAgICAgICAgLy8gbGF5b3V0CiAgICAgICAgICAgICAgICAgbVNjcmVlbkxvY2tlZC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdG9yLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKICAgICAgICAgICAgICAgICBtRW1lcmdlbmN5Q2FsbFRleHQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgIGVuYWJsZVVubG9jaygpOwogICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBjYXNlIFNpbU1pc3Npbmc6CiAgICAgICAgICAgICAgICAgLy8gdGV4dAotICAgICAgICAgICAgICAgIG1DYXJyaWVyLnNldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9taXNzaW5nX3NpbV9tZXNzYWdlX3Nob3J0KTsKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRDYXJyaWVyVGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX21pc3Npbmdfc2ltX21lc3NhZ2Vfc2hvcnQpOwogICAgICAgICAgICAgICAgIG1TY3JlZW5Mb2NrZWQuc2V0VGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX21pc3Npbmdfc2ltX2luc3RydWN0aW9ucyk7CiAKICAgICAgICAgICAgICAgICAvLyBsYXlvdXQKICAgICAgICAgICAgICAgICBtU2NyZWVuTG9ja2VkLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3Iuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwogICAgICAgICAgICAgICAgIG1FbWVyZ2VuY3lDYWxsVGV4dC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90IG5lZWQgdG8gc2hvdyB0aGUgZS1jYWxsIGJ1dHRvbjsgdXNlciBtYXkgdW5sb2NrCisgICAgICAgICAgICAgICAgZW5hYmxlVW5sb2NrKCk7IC8vIGRvIG5vdCBuZWVkIHRvIHNob3cgdGhlIGUtY2FsbCBidXR0b247IHVzZXIgbWF5IHVubG9jawogICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBjYXNlIFNpbU1pc3NpbmdMb2NrZWQ6CiAgICAgICAgICAgICAgICAgLy8gdGV4dAotICAgICAgICAgICAgICAgIG1DYXJyaWVyLnNldFRleHQoCisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0Q2FycmllclRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDYXJyaWVyU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVXBkYXRlTW9uaXRvci5nZXRUZWxlcGhvbnlQbG1uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRUZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fbWlzc2luZ19zaW1fbWVzc2FnZV9zaG9ydCkpKTsKQEAgLTU1NywyNSArNTcyLDI3IEBACiAKICAgICAgICAgICAgICAgICAvLyBsYXlvdXQKICAgICAgICAgICAgICAgICBtU2NyZWVuTG9ja2VkLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3Iuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOyAvLyBjYW5ub3QgdW5sb2NrCiAgICAgICAgICAgICAgICAgbUVtZXJnZW5jeUNhbGxUZXh0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKICAgICAgICAgICAgICAgICBtRW1lcmdlbmN5Q2FsbEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgZGlzYWJsZVVubG9jaygpOwogICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBjYXNlIFNpbUxvY2tlZDoKICAgICAgICAgICAgICAgICAvLyB0ZXh0Ci0gICAgICAgICAgICAgICAgbUNhcnJpZXIuc2V0VGV4dCgKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRDYXJyaWVyVGV4dCgKICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhcnJpZXJTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVBsbW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UpKSk7CiAKICAgICAgICAgICAgICAgICAvLyBsYXlvdXQKICAgICAgICAgICAgICAgICBtU2NyZWVuTG9ja2VkLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1TZWxlY3Rvci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CiAgICAgICAgICAgICAgICAgbUVtZXJnZW5jeUNhbGxUZXh0LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICBlbmFibGVVbmxvY2soKTsKICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgY2FzZSBTaW1QdWtMb2NrZWQ6CiAgICAgICAgICAgICAgICAgLy8gdGV4dAotICAgICAgICAgICAgICAgIG1DYXJyaWVyLnNldFRleHQoCisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0Q2FycmllclRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDYXJyaWVyU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVXBkYXRlTW9uaXRvci5nZXRUZWxlcGhvbnlQbG1uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRUZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fc2ltX3B1a19sb2NrZWRfbWVzc2FnZSkpKTsKQEAgLTU4Myw5ICs2MDAsOSBAQAogCiAgICAgICAgICAgICAgICAgLy8gbGF5b3V0CiAgICAgICAgICAgICAgICAgbVNjcmVlbkxvY2tlZC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdG9yLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsgLy8gY2Fubm90IHVubG9jawogICAgICAgICAgICAgICAgIG1FbWVyZ2VuY3lDYWxsVGV4dC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CiAgICAgICAgICAgICAgICAgbUVtZXJnZW5jeUNhbGxCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgIGRpc2FibGVVbmxvY2soKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTY1MiwxMyArNjY5LDE0IEBACiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uUGF1c2UoKSB7Ci0KKyAgICAgICAgaWYgKG1FbmVyZ3lXYXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1FbmVyZ3lXYXZlLnJlc2V0KCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgewogICAgICAgICByZXNldFN0YXR1c0luZm8obVVwZGF0ZU1vbml0b3IpOwotICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCkBAIC02NzEsMTEgKzY4OSwxMCBAQAogICAgICAgICBib29sZWFuIHNpbGVudCA9IEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9OT1JNQUwgIT0gc3RhdGU7CiAgICAgICAgIGlmIChzaWxlbnQgIT0gbVNpbGVudE1vZGUpIHsKICAgICAgICAgICAgIG1TaWxlbnRNb2RlID0gc2lsZW50OwotICAgICAgICAgICAgdXBkYXRlUmlnaHRUYWJSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIGlmIChtU2xpZGluZ1RhYk1ldGhvZHMgIT0gbnVsbCkgbVNsaWRpbmdUYWJNZXRob2RzLnVwZGF0ZVJpZ2h0VGFiUmVzb3VyY2VzKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvblBob25lU3RhdGVDaGFuZ2VkKFN0cmluZyBuZXdTdGF0ZSkgewotICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGFzc3dvcmRVbmxvY2tTY3JlZW4uamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGFzc3dvcmRVbmxvY2tTY3JlZW4uamF2YQppbmRleCAzOWYyOTE3Li45ZGI4NmFhIDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bhc3N3b3JkVW5sb2NrU2NyZWVuLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXNzd29yZFVubG9ja1NjcmVlbi5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLkRpZ2l0c0tleUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKQEAgLTUwLDE5ICs1MSwyNSBAQAogcHVibGljIGNsYXNzIFBhc3N3b3JkVW5sb2NrU2NyZWVuIGV4dGVuZHMgTGluZWFyTGF5b3V0IGltcGxlbWVudHMgS2V5Z3VhcmRTY3JlZW4sCiAgICAgICAgIFZpZXcuT25DbGlja0xpc3RlbmVyLCBLZXlndWFyZFVwZGF0ZU1vbml0b3IuSW5mb0NhbGxiYWNrLCBPbkVkaXRvckFjdGlvbkxpc3RlbmVyIHsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUGFzc3dvcmRVbmxvY2tTY3JlZW4iOwogICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRVcGRhdGVNb25pdG9yIG1VcGRhdGVNb25pdG9yOwogICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRTY3JlZW5DYWxsYmFjayBtQ2FsbGJhY2s7CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzQWxwaGE7CisKICAgICBwcml2YXRlIEVkaXRUZXh0IG1QYXNzd29yZEVudHJ5OwogICAgIHByaXZhdGUgQnV0dG9uIG1FbWVyZ2VuY3lDYWxsQnV0dG9uOwogICAgIHByaXZhdGUgTG9ja1BhdHRlcm5VdGlscyBtTG9ja1BhdHRlcm5VdGlsczsKICAgICBwcml2YXRlIFBhc3N3b3JkRW50cnlLZXlib2FyZFZpZXcgbUtleWJvYXJkVmlldzsKKyAgICBwcml2YXRlIFBhc3N3b3JkRW50cnlLZXlib2FyZFZpZXcgbUtleWJvYXJkVmlld0FscGhhOwogICAgIHByaXZhdGUgUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyIG1LZXlib2FyZEhlbHBlcjsKKyAgICBwcml2YXRlIFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlciBtS2V5Ym9hcmRIZWxwZXJBbHBoYTsKIAogICAgIHByaXZhdGUgaW50IG1DcmVhdGlvbk9yaWVudGF0aW9uOwogICAgIHByaXZhdGUgaW50IG1DcmVhdGlvbkhhcmRLZXlib2FyZEhpZGRlbjsKICAgICBwcml2YXRlIENvdW50RG93blRpbWVyIG1Db3VudGRvd25UaW1lcjsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZTsKKworICAgIHByaXZhdGUgU3RhdHVzVmlldyBtU3RhdHVzVmlldzsKIAogICAgIC8vIFRvIGF2b2lkIGFjY2lkZW50YWwgbG9ja291dCBkdWUgdG8gZXZlbnRzIHdoaWxlIHRoZSBkZXZpY2UgaW4gaW4gdGhlIHBvY2tldCwgaWdub3JlCiAgICAgLy8gYW55IHBhc3N3b3JkcyB3aXRoIGxlbmd0aCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhpcyBsZW5ndGguCkBAIC04NiwzNiArOTMsNjUgQEAKICAgICAgICAgICAgIGxheW91dEluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQua2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX2xhbmRzY2FwZSwgdGhpcywgdHJ1ZSk7CiAgICAgICAgIH0KIAorICAgICAgICBtU3RhdHVzVmlldyA9IG5ldyBTdGF0dXNWaWV3KHRoaXMsIG1VcGRhdGVNb25pdG9yLCBtTG9ja1BhdHRlcm5VdGlscyk7CisKICAgICAgICAgZmluYWwgaW50IHF1YWxpdHkgPSBsb2NrUGF0dGVyblV0aWxzLmdldEtleWd1YXJkU3RvcmVkUGFzc3dvcmRRdWFsaXR5KCk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gaXNBbHBoYSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDID09IHF1YWxpdHkKLSAgICAgICAgICAgICAgICB8fCBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDID09IHF1YWxpdHk7CisgICAgICAgIG1Jc0FscGhhID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUMgPT0gcXVhbGl0eQorICAgICAgICAgICAgICAgIHx8IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMgPT0gcXVhbGl0eQorICAgICAgICAgICAgICAgIHx8IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYID09IHF1YWxpdHk7CiAKICAgICAgICAgbUtleWJvYXJkVmlldyA9IChQYXNzd29yZEVudHJ5S2V5Ym9hcmRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5rZXlib2FyZCk7CisgICAgICAgIG1LZXlib2FyZFZpZXdBbHBoYSA9IChQYXNzd29yZEVudHJ5S2V5Ym9hcmRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5rZXlib2FyZEFscGhhKTsKICAgICAgICAgbVBhc3N3b3JkRW50cnkgPSAoRWRpdFRleHQpIGZpbmRWaWV3QnlJZChSLmlkLnBhc3N3b3JkRW50cnkpOwogICAgICAgICBtUGFzc3dvcmRFbnRyeS5zZXRPbkVkaXRvckFjdGlvbkxpc3RlbmVyKHRoaXMpOwogICAgICAgICBtRW1lcmdlbmN5Q2FsbEJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLmVtZXJnZW5jeUNhbGwpOwogICAgICAgICBtRW1lcmdlbmN5Q2FsbEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIG1Mb2NrUGF0dGVyblV0aWxzLnVwZGF0ZUVtZXJnZW5jeUNhbGxCdXR0b25TdGF0ZShtRW1lcmdlbmN5Q2FsbEJ1dHRvbik7Ci0gICAgICAgIG1UaXRsZSA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuZW50ZXJfcGFzc3dvcmRfbGFiZWwpOwogCi0gICAgICAgIG1LZXlib2FyZEhlbHBlciA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIoY29udGV4dCwgbUtleWJvYXJkVmlldywgdGhpcyk7Ci0gICAgICAgIG1LZXlib2FyZEhlbHBlci5zZXRLZXlib2FyZE1vZGUoaXNBbHBoYSA/IFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5LRVlCT0FSRF9NT0RFX0FMUEhBCi0gICAgICAgICAgICAgICAgOiBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuS0VZQk9BUkRfTU9ERV9OVU1FUklDKTsKKyAgICAgICAgbUtleWJvYXJkSGVscGVyID0gbmV3IFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlcihjb250ZXh0LCBtS2V5Ym9hcmRWaWV3LCB0aGlzLCBmYWxzZSk7CisgICAgICAgIGlmIChtS2V5Ym9hcmRWaWV3QWxwaGEgPT0gbnVsbCB8fCAhbUlzQWxwaGEpIHsKKyAgICAgICAgICAgIG1LZXlib2FyZEhlbHBlci5zZXRLZXlib2FyZE1vZGUobUlzQWxwaGEgPworICAgICAgICAgICAgICAgICAgICBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuS0VZQk9BUkRfTU9ERV9BTFBIQQorICAgICAgICAgICAgICAgICAgICA6IFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5LRVlCT0FSRF9NT0RFX05VTUVSSUMpOworICAgICAgICAgICAgbUtleWJvYXJkVmlldy5zZXRWaXNpYmlsaXR5KAorICAgICAgICAgICAgICAgICAgICBtQ3JlYXRpb25IYXJkS2V5Ym9hcmRIaWRkZW4gPT0gQ29uZmlndXJhdGlvbi5IQVJES0VZQk9BUkRISURERU5fTk8KKyAgICAgICAgICAgICAgICAgICAgPyBWaWV3LklOVklTSUJMRSA6IFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtS2V5Ym9hcmRIZWxwZXJBbHBoYSA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIoY29udGV4dCwgbUtleWJvYXJkVmlld0FscGhhLAorICAgICAgICAgICAgICAgICAgICB0aGlzLCBmYWxzZSk7CisgICAgICAgICAgICBtS2V5Ym9hcmRIZWxwZXIuc2V0S2V5Ym9hcmRNb2RlKFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5LRVlCT0FSRF9NT0RFX05VTUVSSUMpOworICAgICAgICAgICAgbUtleWJvYXJkSGVscGVyQWxwaGEuc2V0S2V5Ym9hcmRNb2RlKFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5LRVlCT0FSRF9NT0RFX0FMUEhBKTsKKyAgICAgICAgICAgIG1LZXlib2FyZFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbUtleWJvYXJkVmlld0FscGhhLnNldFZpc2liaWxpdHkoCisgICAgICAgICAgICAgICAgICAgIG1DcmVhdGlvbkhhcmRLZXlib2FyZEhpZGRlbiA9PSBDb25maWd1cmF0aW9uLkhBUkRLRVlCT0FSREhJRERFTl9OTworICAgICAgICAgICAgICAgICAgICA/IFZpZXcuSU5WSVNJQkxFIDogVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldFdpZHRoKG1LZXlib2FyZFZpZXdBbHBoYS5nZXRMYXlvdXRQYXJhbXMoKS53aWR0aCk7CisgICAgICAgIH0KIAotICAgICAgICBtS2V5Ym9hcmRWaWV3LnNldFZpc2liaWxpdHkobUNyZWF0aW9uSGFyZEtleWJvYXJkSGlkZGVuID09IENvbmZpZ3VyYXRpb24uSEFSREtFWUJPQVJESElEREVOX05PCi0gICAgICAgICAgICAgICAgPyBWaWV3LklOVklTSUJMRSA6IFZpZXcuVklTSUJMRSk7CisgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9sb2NrLCAwLAorICAgICAgICAgICAgICAgIDAsIDApOwogICAgICAgICBtUGFzc3dvcmRFbnRyeS5yZXF1ZXN0Rm9jdXMoKTsKIAogICAgICAgICAvLyBUaGlzIGFsbG93cyBrZXlib2FyZHMgd2l0aCBvdmVybGFwcGluZyBxd2VydHkvbnVtZXJpYyBrZXlzIHRvIGNob29zZSBqdXN0IHRoZQogICAgICAgICAvLyBudW1lcmljIGtleXMuCi0gICAgICAgIGlmIChpc0FscGhhKSB7CisgICAgICAgIGlmIChtSXNBbHBoYSkgewogICAgICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0S2V5TGlzdGVuZXIoVGV4dEtleUxpc3RlbmVyLmdldEluc3RhbmNlKCkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0S2V5TGlzdGVuZXIoRGlnaXRzS2V5TGlzdGVuZXIuZ2V0SW5zdGFuY2UoKSk7CisgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvblRleHQoUi5zdHJpbmcua2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUpOwogICAgICAgICB9CiAKICAgICAgICAgbUtleWJvYXJkSGVscGVyLnNldFZpYnJhdGVQYXR0ZXJuKG1Mb2NrUGF0dGVyblV0aWxzLmlzVGFjdGlsZUZlZWRiYWNrRW5hYmxlZCgpID8KICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFycmF5LmNvbmZpZ192aXJ0dWFsS2V5VmliZVBhdHRlcm4gOiAwKTsKKyAgICAgICAgaWYgKG1LZXlib2FyZEhlbHBlckFscGhhICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1LZXlib2FyZEhlbHBlckFscGhhLnNldFZpYnJhdGVQYXR0ZXJuKG1Mb2NrUGF0dGVyblV0aWxzLmlzVGFjdGlsZUZlZWRiYWNrRW5hYmxlZCgpID8KKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfdmlydHVhbEtleVZpYmVQYXR0ZXJuIDogMCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB1bnRpbCB3ZSBnZXQgYW4gdXBkYXRlLi4uCisgICAgICAgIG1TdGF0dXNWaWV3LnNldENhcnJpZXJUZXh0KExvY2tTY3JlZW4uZ2V0Q2FycmllclN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVBsbW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVNwbigpKSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMzYsOCArMTcyLDEyIEBACiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICAvLyByZXNldCBzdGF0dXMKKyAgICAgICAgbVN0YXR1c1ZpZXcucmVzZXRTdGF0dXNJbmZvKG1VcGRhdGVNb25pdG9yLCBtTG9ja1BhdHRlcm5VdGlscyk7CisKICAgICAgICAgLy8gc3RhcnQgZnJlc2gKICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0VGV4dCgiIik7CisgICAgICAgIHJlc2V0U3RhdHVzSW5mbygpOwogICAgICAgICBtUGFzc3dvcmRFbnRyeS5yZXF1ZXN0Rm9jdXMoKTsKICAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMudXBkYXRlRW1lcmdlbmN5Q2FsbEJ1dHRvblN0YXRlKG1FbWVyZ2VuY3lDYWxsQnV0dG9uKTsKIApAQCAtMTc0LDYgKzIxNCw5IEBACiAgICAgICAgICAgICAgICAgbG9uZyBkZWFkbGluZSA9IG1Mb2NrUGF0dGVyblV0aWxzLnNldExvY2tvdXRBdHRlbXB0RGVhZGxpbmUoKTsKICAgICAgICAgICAgICAgICBoYW5kbGVBdHRlbXB0TG9ja291dChkZWFkbGluZSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvblRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyk7CisgICAgICAgIH0gZWxzZSBpZiAoZW50cnkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvblRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyk7CiAgICAgICAgIH0KICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0VGV4dCgiIik7CiAgICAgfQpAQCAtMTkxLDE0ICsyMzQsMTQgQEAKICAgICAgICAgICAgICAgICBTdHJpbmcgaW5zdHJ1Y3Rpb25zID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biwKICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHNSZW1haW5pbmcpOwotICAgICAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KGluc3RydWN0aW9ucyk7CisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0SW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9ucyk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgb25GaW5pc2goKSB7CiAgICAgICAgICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBtVGl0bGUuc2V0VGV4dChSLnN0cmluZy5rZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlKTsKICAgICAgICAgICAgICAgICBtS2V5Ym9hcmRWaWV3LnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgcmVzZXRTdGF0dXNJbmZvKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0uc3RhcnQoKTsKICAgICB9CkBAIC0yNDQsMjQgKzI4Nyw0MSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgLy8gLS0tLS0tLS0tLSBJbmZvQ2FsbGJhY2sKKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIHZvaWQgb25SZWZyZXNoQmF0dGVyeUluZm8oYm9vbGVhbiBzaG93QmF0dGVyeUluZm8sIGJvb2xlYW4gcGx1Z2dlZEluLCBpbnQgYmF0dGVyeUxldmVsKSB7CisgICAgICAgIG1TdGF0dXNWaWV3Lm9uUmVmcmVzaEJhdHRlcnlJbmZvKHNob3dCYXR0ZXJ5SW5mbywgcGx1Z2dlZEluLCBiYXR0ZXJ5TGV2ZWwpOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIHZvaWQgb25UaW1lQ2hhbmdlZCgpIHsKKyAgICAgICAgbVN0YXR1c1ZpZXcub25UaW1lQ2hhbmdlZCgpOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIHZvaWQgb25SZWZyZXNoQ2FycmllckluZm8oQ2hhclNlcXVlbmNlIHBsbW4sIENoYXJTZXF1ZW5jZSBzcG4pIHsKKyAgICAgICAgbVN0YXR1c1ZpZXcub25SZWZyZXNoQ2FycmllckluZm8ocGxtbiwgc3BuKTsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIHB1YmxpYyB2b2lkIG9uUmluZ2VyTW9kZUNoYW5nZWQoaW50IHN0YXRlKSB7CisgICAgICAgIC8vIG5vdCBjdXJyZW50bHkgdXNlZAorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0gU2ltU3RhdGVDYWxsYmFjaworCisgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBvblBob25lU3RhdGVDaGFuZ2VkKFN0cmluZyBuZXdTdGF0ZSkgewogICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG9uUmVmcmVzaEJhdHRlcnlJbmZvKGJvb2xlYW4gc2hvd0JhdHRlcnlJbmZvLCBib29sZWFuIHBsdWdnZWRJbiwgaW50IGJhdHRlcnlMZXZlbCkgewotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25SZWZyZXNoQ2FycmllckluZm8oQ2hhclNlcXVlbmNlIHBsbW4sIENoYXJTZXF1ZW5jZSBzcG4pIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uUmluZ2VyTW9kZUNoYW5nZWQoaW50IHN0YXRlKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblRpbWVDaGFuZ2VkKCkgewotCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0U3RhdHVzSW5mbygpIHsKKyAgICAgICAgaWYobUlzQWxwaGEpIHsKKyAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldEluc3RydWN0aW9uVGV4dChSLnN0cmluZy5rZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldEluc3RydWN0aW9uVGV4dChSLnN0cmluZy5rZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSk7CisgICAgICAgIH0KICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGF0dGVyblVubG9ja1NjcmVlbi5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXR0ZXJuVW5sb2NrU2NyZWVuLmphdmEKaW5kZXggNDE4ZTI0My4uMzVmYTNlNSAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXR0ZXJuVW5sb2NrU2NyZWVuLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXR0ZXJuVW5sb2NrU2NyZWVuLmphdmEKQEAgLTI1LDkgKzI1LDYgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NDYXJkOwpAQCAtMzcsNyArMzQsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblZpZXcuQ2VsbDsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwogCiAvKioKICAqIFRoaXMgaXMgdGhlIHNjcmVlbiB0aGF0IHNob3dzIHRoZSA5IGNpcmNsZSB1bmxvY2sgd2lkZ2V0IGFuZCBpbnN0cnVjdHMKQEAgLTc1LDI3ICs3MSw3IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVGYWxsYmFjazsKIAotICAgIHByaXZhdGUgU3RyaW5nIG1EYXRlRm9ybWF0U3RyaW5nOwotCi0gICAgcHJpdmF0ZSBUZXh0VmlldyBtQ2FycmllcjsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1EYXRlOwotCi0gICAgLy8gYXJlIHdlIHNob3dpbmcgYmF0dGVyeSBpbmZvcm1hdGlvbj8KLSAgICBwcml2YXRlIGJvb2xlYW4gbVNob3dpbmdCYXR0ZXJ5SW5mbyA9IGZhbHNlOwotCi0gICAgLy8gbGFzdCBrbm93biBwbHVnZ2VkIGluIHN0YXRlCi0gICAgcHJpdmF0ZSBib29sZWFuIG1QbHVnZ2VkSW4gPSBmYWxzZTsKLQotICAgIC8vIGxhc3Qga25vd24gYmF0dGVyeSBsZXZlbAotICAgIHByaXZhdGUgaW50IG1CYXR0ZXJ5TGV2ZWwgPSAxMDA7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtTmV4dEFsYXJtID0gbnVsbDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1JbnN0cnVjdGlvbnMgPSBudWxsOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1czE7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtU3RhdHVzU2VwOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1czI7Ci0KKyAgICBwcml2YXRlIFN0YXR1c1ZpZXcgbVN0YXR1c1ZpZXc7CiAKICAgICBwcml2YXRlIExvY2tQYXR0ZXJuVmlldyBtTG9ja1BhdHRlcm5WaWV3OwogCkBAIC0xMzMsMTUgKzEwOSwxOCBAQAogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVGb290ZXIoRm9vdGVyTW9kZSBtb2RlKSB7CiAgICAgICAgIHN3aXRjaCAobW9kZSkgewogICAgICAgICAgICAgY2FzZSBOb3JtYWw6CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibW9kZSBub3JtYWwiKTsKICAgICAgICAgICAgICAgICBtRm9vdGVyTm9ybWFsLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKICAgICAgICAgICAgICAgICBtRm9vdGVyRm9yZ290UGF0dGVybi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEZvcmdvdExvY2tQYXR0ZXJuOgorICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm1vZGUgRm9yZ290TG9ja1BhdHRlcm4iKTsKICAgICAgICAgICAgICAgICBtRm9vdGVyTm9ybWFsLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKICAgICAgICAgICAgICAgICBtRm9vdGVyRm9yZ290UGF0dGVybi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CiAgICAgICAgICAgICAgICAgbUZvcmdvdFBhdHRlcm5CdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBWZXJpZnlVbmxvY2tlZDoKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJtb2RlIFZlcmlmeVVubG9ja2VkIik7CiAgICAgICAgICAgICAgICAgbUZvb3Rlck5vcm1hbC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CiAgICAgICAgICAgICAgICAgbUZvb3RlckZvcmdvdFBhdHRlcm4uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwogICAgICAgICB9CkBAIC0xODAsMjQgKzE1OSwxNiBAQAogICAgICAgICBtQ3JlYXRpb25PcmllbnRhdGlvbiA9IGNvbmZpZ3VyYXRpb24ub3JpZW50YXRpb247CiAKICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKGNvbnRleHQpOworCiAgICAgICAgIGlmIChtQ3JlYXRpb25PcmllbnRhdGlvbiAhPSBDb25maWd1cmF0aW9uLk9SSUVOVEFUSU9OX0xBTkRTQ0FQRSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAicG9ydHJhaXQgbW9kZSIpOwogICAgICAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5rZXlndWFyZF9zY3JlZW5fdW5sb2NrX3BvcnRyYWl0LCB0aGlzLCB0cnVlKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgImxhbmRzY2FwZSBtb2RlIik7CiAgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmtleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLCB0aGlzLCB0cnVlKTsKICAgICAgICAgfQogCi0gICAgICAgIG1DYXJyaWVyID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5jYXJyaWVyKTsKLSAgICAgICAgbURhdGUgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmRhdGUpOwotCi0gICAgICAgIG1EYXRlRm9ybWF0U3RyaW5nID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5mdWxsX3dkYXlfbW9udGhfZGF5X25vX3llYXIpOwotICAgICAgICByZWZyZXNoVGltZUFuZERhdGVEaXNwbGF5KCk7Ci0KLSAgICAgICAgbVN0YXR1czEgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN0YXR1czEpOwotICAgICAgICBtU3RhdHVzU2VwID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdGF0dXNTZXApOwotICAgICAgICBtU3RhdHVzMiA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzMik7Ci0KLSAgICAgICAgcmVzZXRTdGF0dXNJbmZvKCk7Ci0KKyAgICAgICAgbVN0YXR1c1ZpZXcgPSBuZXcgU3RhdHVzVmlldyh0aGlzLCBtVXBkYXRlTW9uaXRvciwgbUxvY2tQYXR0ZXJuVXRpbHMpOwogCiAgICAgICAgIG1Mb2NrUGF0dGVyblZpZXcgPSAoTG9ja1BhdHRlcm5WaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5sb2NrUGF0dGVybik7CiAKQEAgLTI0OSwxNSArMjIwLDExIEBACiAgICAgICAgIHVwZGF0ZU1vbml0b3IucmVnaXN0ZXJTaW1TdGF0ZUNhbGxiYWNrKHRoaXMpOwogICAgICAgICBzZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKIAotICAgICAgICAvLyBSZXF1aXJlZCB0byBnZXQgTWFycXVlZSB0byB3b3JrLgotICAgICAgICBtQ2Fycmllci5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgbUNhcnJpZXIuc2V0VGV4dENvbG9yKDB4ZmZmZmZmZmYpOwotCiAgICAgICAgIC8vIHVudGlsIHdlIGdldCBhbiB1cGRhdGUuLi4KLSAgICAgICAgbUNhcnJpZXIuc2V0VGV4dCgKLSAgICAgICAgICAgICAgICBMb2NrU2NyZWVuLmdldENhcnJpZXJTdHJpbmcoCisgICAgICAgIG1TdGF0dXNWaWV3LnNldENhcnJpZXJUZXh0KExvY2tTY3JlZW4uZ2V0Q2FycmllclN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVBsbW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVNwbigpKSk7CisKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVmcmVzaEVtZXJnZW5jeUJ1dHRvblRleHQoKSB7CkBAIC0yNzAsODggKzIzNyw2IEBACiAgICAgICAgIG1FbmFibGVGYWxsYmFjayA9IHN0YXRlOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCByZXNldFN0YXR1c0luZm8oKSB7Ci0gICAgICAgIG1JbnN0cnVjdGlvbnMgPSBudWxsOwotICAgICAgICBtU2hvd2luZ0JhdHRlcnlJbmZvID0gbVVwZGF0ZU1vbml0b3Iuc2hvdWxkU2hvd0JhdHRlcnlJbmZvKCk7Ci0gICAgICAgIG1QbHVnZ2VkSW4gPSBtVXBkYXRlTW9uaXRvci5pc0RldmljZVBsdWdnZWRJbigpOwotICAgICAgICBtQmF0dGVyeUxldmVsID0gbVVwZGF0ZU1vbml0b3IuZ2V0QmF0dGVyeUxldmVsKCk7Ci0gICAgICAgIG1OZXh0QWxhcm0gPSBtTG9ja1BhdHRlcm5VdGlscy5nZXROZXh0QWxhcm0oKTsKLSAgICAgICAgdXBkYXRlU3RhdHVzTGluZXMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3RhdHVzTGluZXMoKSB7Ci0gICAgICAgIGlmIChtSW5zdHJ1Y3Rpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGluc3RydWN0aW9ucyBvbmx5Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1JbnN0cnVjdGlvbnMpOwotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KG1JbnN0cnVjdGlvbnMpKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKDAsIDAsIDAsIDApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9sb2NrLCAwLCAwLCAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVN0YXR1c1NlcC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVNob3dpbmdCYXR0ZXJ5SW5mbyAmJiBtTmV4dEFsYXJtID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGJhdHRlcnkgb25seQotICAgICAgICAgICAgaWYgKG1QbHVnZ2VkSW4pIHsKLSAgICAgICAgICAgICAgaWYgKG1CYXR0ZXJ5TGV2ZWwgPj0gMTAwKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmxvY2tzY3JlZW5fY2hhcmdlZCkpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmxvY2tzY3JlZW5fcGx1Z2dlZF9pbiwgbUJhdHRlcnlMZXZlbCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQoZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5sb2Nrc2NyZWVuX2xvd19iYXR0ZXJ5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfY2hhcmdpbmcsIDAsIDAsIDApOwotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3RhdHVzU2VwLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICB9IGVsc2UgaWYgKG1OZXh0QWxhcm0gIT0gbnVsbCAmJiAhbVNob3dpbmdCYXR0ZXJ5SW5mbykgewotICAgICAgICAgICAgLy8gYWxhcm0gb25seQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChtTmV4dEFsYXJtKTsKLSAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9hbGFybSwgMCwgMCwgMCk7Ci0KLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXNTZXAuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9IGVsc2UgaWYgKG1OZXh0QWxhcm0gIT0gbnVsbCAmJiBtU2hvd2luZ0JhdHRlcnlJbmZvKSB7Ci0gICAgICAgICAgICAvLyBib3RoIGJhdHRlcnkgYW5kIG5leHQgYWxhcm0KLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQobU5leHRBbGFybSk7Ci0gICAgICAgICAgICBtU3RhdHVzU2VwLnNldFRleHQoInwiKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFRleHQoZ2V0Q29udGV4dCgpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcubG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0LAotICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbigxMDAsIG1CYXR0ZXJ5TGV2ZWwpKSk7Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfYWxhcm0sIDAsIDAsIDApOwotICAgICAgICAgICAgaWYgKG1QbHVnZ2VkSW4pIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzMi5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfY2hhcmdpbmcsIDAsIDAsIDApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzMi5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXNTZXAuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbm90aGluZyBzcGVjaWZpYyB0byBzaG93OyBzaG93IGdlbmVyYWwgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fcGF0dGVybl9pbnN0cnVjdGlvbnMpOwotICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2xvY2ssIDAsIDAsIDApOwotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3RhdHVzU2VwLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hUaW1lQW5kRGF0ZURpc3BsYXkoKSB7Ci0gICAgICAgIG1EYXRlLnNldFRleHQoRGF0ZUZvcm1hdC5mb3JtYXQobURhdGVGb3JtYXRTdHJpbmcsIG5ldyBEYXRlKCkpKTsKLSAgICB9Ci0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikgewogICAgICAgICAvLyBhcyBsb25nIGFzIHRoZSB1c2VyIGlzIGVudGVyaW5nIGEgcGF0dGVybiAoaS5lIHNlbmRpbmcgYSB0b3VjaApAQCAtMzY2LDI1ICsyNTEsMjEgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKLQogICAgIC8vIC0tLS0tLS0tLS0gSW5mb0NhbGxiYWNrCiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uUmVmcmVzaEJhdHRlcnlJbmZvKGJvb2xlYW4gc2hvd0JhdHRlcnlJbmZvLCBib29sZWFuIHBsdWdnZWRJbiwgaW50IGJhdHRlcnlMZXZlbCkgewotICAgICAgICBtU2hvd2luZ0JhdHRlcnlJbmZvID0gc2hvd0JhdHRlcnlJbmZvOwotICAgICAgICBtUGx1Z2dlZEluID0gcGx1Z2dlZEluOwotICAgICAgICBtQmF0dGVyeUxldmVsID0gYmF0dGVyeUxldmVsOwotICAgICAgICB1cGRhdGVTdGF0dXNMaW5lcygpOworICAgICAgICBtU3RhdHVzVmlldy5vblJlZnJlc2hCYXR0ZXJ5SW5mbyhzaG93QmF0dGVyeUluZm8sIHBsdWdnZWRJbiwgYmF0dGVyeUxldmVsKTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uVGltZUNoYW5nZWQoKSB7Ci0gICAgICAgIHJlZnJlc2hUaW1lQW5kRGF0ZURpc3BsYXkoKTsKKyAgICAgICAgbVN0YXR1c1ZpZXcub25UaW1lQ2hhbmdlZCgpOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCiAgICAgcHVibGljIHZvaWQgb25SZWZyZXNoQ2FycmllckluZm8oQ2hhclNlcXVlbmNlIHBsbW4sIENoYXJTZXF1ZW5jZSBzcG4pIHsKLSAgICAgICAgbUNhcnJpZXIuc2V0VGV4dChMb2NrU2NyZWVuLmdldENhcnJpZXJTdHJpbmcocGxtbiwgc3BuKSk7CisgICAgICAgIG1TdGF0dXNWaWV3Lm9uUmVmcmVzaENhcnJpZXJJbmZvKHBsbW4sIHNwbik7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KQEAgLTQ0NCw4ICszMjUsOCBAQAogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgLy8gcmVzZXQgaGVhZGVyCi0gICAgICAgIHJlc2V0U3RhdHVzSW5mbygpOworICAgICAgICAvLyByZXNldCBzdGF0dXMKKyAgICAgICAgbVN0YXR1c1ZpZXcucmVzZXRTdGF0dXNJbmZvKG1VcGRhdGVNb25pdG9yLCBtTG9ja1BhdHRlcm5VdGlscyk7CiAKICAgICAgICAgLy8gcmVzZXQgbG9jayBwYXR0ZXJuCiAgICAgICAgIG1Mb2NrUGF0dGVyblZpZXcuZW5hYmxlSW5wdXQoKTsKQEAgLTUxNCw4ICszOTUsOCBAQAogICAgICAgICAgICAgaWYgKG1Mb2NrUGF0dGVyblV0aWxzLmNoZWNrUGF0dGVybihwYXR0ZXJuKSkgewogICAgICAgICAgICAgICAgIG1Mb2NrUGF0dGVyblZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREaXNwbGF5TW9kZShMb2NrUGF0dGVyblZpZXcuRGlzcGxheU1vZGUuQ29ycmVjdCk7Ci0gICAgICAgICAgICAgICAgbUluc3RydWN0aW9ucyA9ICIiOwotICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1c0xpbmVzKCk7CisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0SW5zdHJ1Y3Rpb25zKCIiKTsKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy51cGRhdGVTdGF0dXNMaW5lcygpOwogICAgICAgICAgICAgICAgIG1DYWxsYmFjay5rZXlndWFyZERvbmUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLnJlcG9ydFN1Y2Nlc3NmdWxVbmxvY2tBdHRlbXB0KCk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNTMzLDggKzQxNCw5IEBACiAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUF0dGVtcHRMb2Nrb3V0KGRlYWRsaW5lKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIG1VbmxvY2tJY29uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgbUluc3RydWN0aW9ucyA9IGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzTGluZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0SW5zdHJ1Y3Rpb25zKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nKSk7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnVwZGF0ZVN0YXR1c0xpbmVzKCk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrUGF0dGVyblZpZXcucG9zdERlbGF5ZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbmNlbFBhdHRlcm5SdW5uYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVRURVJOX0NMRUFSX1RJTUVPVVRfTVMpOwpAQCAtNTUyLDE3ICs0MzQsMTggQEAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgb25UaWNrKGxvbmcgbWlsbGlzVW50aWxGaW5pc2hlZCkgewogICAgICAgICAgICAgICAgIGludCBzZWNvbmRzUmVtYWluaW5nID0gKGludCkgKG1pbGxpc1VudGlsRmluaXNoZWQgLyAxMDAwKTsKLSAgICAgICAgICAgICAgICBtSW5zdHJ1Y3Rpb25zID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvbnMoZ2V0Q29udGV4dCgpLmdldFN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHNSZW1haW5pbmcpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1c0xpbmVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzUmVtYWluaW5nKSk7CisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcudXBkYXRlU3RhdHVzTGluZXMoKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaCgpIHsKICAgICAgICAgICAgICAgICBtTG9ja1BhdHRlcm5WaWV3LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbUluc3RydWN0aW9ucyA9IGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXR0ZXJuX2luc3RydWN0aW9ucyk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzTGluZXMoKTsKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvbnMoZ2V0Q29udGV4dCgpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmxvY2tzY3JlZW5fcGF0dGVybl9pbnN0cnVjdGlvbnMpKTsKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy51cGRhdGVTdGF0dXNMaW5lcygpOwogICAgICAgICAgICAgICAgIC8vIFRPRE8gbVVubG9ja0ljb24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwogICAgICAgICAgICAgICAgIG1GYWlsZWRQYXR0ZXJuQXR0ZW1wdHNTaW5jZUxhc3RUaW1lb3V0ID0gMDsKICAgICAgICAgICAgICAgICBpZiAobUVuYWJsZUZhbGxiYWNrKSB7CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93LmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93LmphdmEKaW5kZXggZGZmY2NmOC4uYzI1ZGYxZCAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvdy5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3cuamF2YQpAQCAtMjQsMTEgKzI0LDE1IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LkJhc2VTdXJmYWNlSG9sZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuUm9vdFZpZXdTdXJmYWNlVGFrZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5TdGFuZGFsb25lQWN0aW9uTW9kZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQ29udGV4dE1lbnVCdWlsZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudURpYWxvZ0hlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudVBvcHVwSGVscGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51VmlldzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhckNvbnRleHRWaWV3OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJWaWV3OwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLlNlYXJjaE1hbmFnZXI7CkBAIC01Myw2ICs1Nyw3IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwogaW1wb3J0IGFuZHJvaWQudmlldy5IYXB0aWNGZWVkYmFja0NvbnN0YW50czsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRRdWV1ZTsKQEAgLTY2LDYgKzcxLDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1N0dWI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZvbHVtZVBhbmVsOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CkBAIC05NSw3ICsxMDEsNyBAQAogICAgICAqIFNpbXBsZSBjYWxsYmFjayB1c2VkIGJ5IHRoZSBjb250ZXh0IG1lbnUgYW5kIGl0cyBzdWJtZW51cy4gVGhlIG9wdGlvbnMKICAgICAgKiBtZW51IHN1Ym1lbnVzIGRvIG5vdCB1c2UgdGhpcyAodGhlaXIgYmVoYXZpb3IgaXMgbW9yZSBjb21wbGV4KS4KICAgICAgKi8KLSAgICBDb250ZXh0TWVudUNhbGxiYWNrIG1Db250ZXh0TWVudUNhbGxiYWNrID0gbmV3IENvbnRleHRNZW51Q2FsbGJhY2soRkVBVFVSRV9DT05URVhUX01FTlUpOworICAgIERpYWxvZ01lbnVDYWxsYmFjayBtQ29udGV4dE1lbnVDYWxsYmFjayA9IG5ldyBEaWFsb2dNZW51Q2FsbGJhY2soRkVBVFVSRV9DT05URVhUX01FTlUpOwogCiAgICAgLy8gVGhpcyBpcyB0aGUgdG9wLWxldmVsIHZpZXcgb2YgdGhlIHdpbmRvdywgY29udGFpbmluZyB0aGUgd2luZG93IGRlY29yLgogICAgIHByaXZhdGUgRGVjb3JWaWV3IG1EZWNvcjsKQEAgLTExNCw2ICsxMjAsOCBAQAogICAgIHByaXZhdGUgTGF5b3V0SW5mbGF0ZXIgbUxheW91dEluZmxhdGVyOwogCiAgICAgcHJpdmF0ZSBUZXh0VmlldyBtVGl0bGVWaWV3OworICAgIAorICAgIHByaXZhdGUgQWN0aW9uQmFyVmlldyBtQWN0aW9uQmFyOwogCiAgICAgcHJpdmF0ZSBEcmF3YWJsZUZlYXR1cmVTdGF0ZVtdIG1EcmF3YWJsZXM7CiAKQEAgLTE5MSw4ICsxOTksMTIgQEAKICAgICAgICAgICAgIC8qIEN1c3RvbSB0aXRsZSBmZWF0dXJlIGlzIGVuYWJsZWQgYW5kIHRoZSB1c2VyIGlzIHRyeWluZyB0byBlbmFibGUgYW5vdGhlciBmZWF0dXJlICovCiAgICAgICAgICAgICB0aHJvdyBuZXcgQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24oIllvdSBjYW5ub3QgY29tYmluZSBjdXN0b20gdGl0bGVzIHdpdGggb3RoZXIgdGl0bGUgZmVhdHVyZXMiKTsKICAgICAgICAgfQotICAgICAgICBpZiAoZmVhdHVyZUlkID09IEZFQVRVUkVfT1BFTkdMKSB7Ci0gICAgICAgICAgICBnZXRBdHRyaWJ1dGVzKCkubWVtb3J5VHlwZSA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLk1FTU9SWV9UWVBFX0dQVTsKKyAgICAgICAgaWYgKChmZWF0dXJlcyAmICgxIDw8IEZFQVRVUkVfTk9fVElUTEUpKSAhPSAwICYmIGZlYXR1cmVJZCA9PSBGRUFUVVJFX0FDVElPTl9CQVIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gSWdub3JlLiBObyB0aXRsZSBkb21pbmF0ZXMuCisgICAgICAgIH0KKyAgICAgICAgaWYgKChmZWF0dXJlcyAmICgxIDw8IEZFQVRVUkVfQUNUSU9OX0JBUikpICE9IDAgJiYgZmVhdHVyZUlkID09IEZFQVRVUkVfTk9fVElUTEUpIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYWN0aW9uIGJhciBmZWF0dXJlIGlmIHdlIGhhdmUgbm8gdGl0bGUuIE5vIHRpdGxlIGRvbWluYXRlcy4KKyAgICAgICAgICAgIHJlbW92ZUZlYXR1cmUoRkVBVFVSRV9BQ1RJT05fQkFSKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3VwZXIucmVxdWVzdEZlYXR1cmUoZmVhdHVyZUlkKTsKICAgICB9CkBAIC0yNzYsNiArMjg4LDggQEAKICAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKICAgICAgICAgaWYgKG1UaXRsZVZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KHRpdGxlKTsKKyAgICAgICAgfSBlbHNlIGlmIChtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BY3Rpb25CYXIuc2V0V2luZG93VGl0bGUodGl0bGUpOwogICAgICAgICB9CiAgICAgICAgIG1UaXRsZSA9IHRpdGxlOwogICAgIH0KQEAgLTMwMSw3ICszMTUsNyBAQAogICAgICAgICAvLyBBbHJlYWR5IHByZXBhcmVkIChpc1ByZXBhcmVkIHdpbGwgYmUgcmVzZXQgdG8gZmFsc2UgbGF0ZXIpCiAgICAgICAgIGlmIChzdC5pc1ByZXBhcmVkKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KKyAgICAgICAgCiAgICAgICAgIGlmICgobVByZXBhcmVkUGFuZWwgIT0gbnVsbCkgJiYgKG1QcmVwYXJlZFBhbmVsICE9IHN0KSkgewogICAgICAgICAgICAgLy8gQW5vdGhlciBQYW5lbCBpcyBwcmVwYXJlZCBhbmQgcG9zc2libHkgb3Blbiwgc28gY2xvc2UgaXQKICAgICAgICAgICAgIGNsb3NlUGFuZWwobVByZXBhcmVkUGFuZWwsIGZhbHNlKTsKQEAgLTMxNSw5ICszMjksMTEgQEAKIAogICAgICAgICBpZiAoc3QuY3JlYXRlZFBhbmVsVmlldyA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBJbml0IHRoZSBwYW5lbCBzdGF0ZSdzIG1lbnUtLXJldHVybiBmYWxzZSBpZiBpbml0IGZhaWxlZAotICAgICAgICAgICAgaWYgKHN0Lm1lbnUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZVBhbmVsTWVudShzdCkgfHwgKHN0Lm1lbnUgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKHN0Lm1lbnUgPT0gbnVsbCB8fCBzdC5yZWZyZXNoTWVudUNvbnRlbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3QubWVudSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZVBhbmVsTWVudShzdCkgfHwgKHN0Lm1lbnUgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBDYWxsIGNhbGxiYWNrLCBhbmQgcmV0dXJuIGlmIGl0IGRvZXNuJ3Qgd2FudCB0byBkaXNwbGF5IG1lbnUKICAgICAgICAgICAgICAgICBpZiAoKGNiID09IG51bGwpIHx8ICFjYi5vbkNyZWF0ZVBhbmVsTWVudShzdC5mZWF0dXJlSWQsIHN0Lm1lbnUpKSB7CkBAIC0zMjYsNiArMzQyLDEyIEBACiAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdC5yZWZyZXNoTWVudUNvbnRlbnQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIGlmIChtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5zZXRNZW51KHN0Lm1lbnUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gQ2FsbGJhY2sgYW5kIHJldHVybiBpZiB0aGUgY2FsbGJhY2sgZG9lcyBub3Qgd2FudCB0byBzaG93IHRoZSBtZW51CkBAIC0zNDksMzYgKzM3MSwzNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotICAgICAgICBQYW5lbEZlYXR1cmVTdGF0ZSBzdCA9IGdldFBhbmVsU3RhdGUoRkVBVFVSRV9PUFRJT05TX1BBTkVMLCBmYWxzZSk7Ci0gICAgICAgIGlmICgoc3QgIT0gbnVsbCkgJiYgKHN0Lm1lbnUgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lbnVCdWlsZGVyIG1lbnVCdWlsZGVyID0gKE1lbnVCdWlsZGVyKSBzdC5tZW51OworICAgICAgICAvLyBBY3Rpb24gYmFycyBoYW5kbGUgdGhlaXIgb3duIG1lbnUgc3RhdGUKKyAgICAgICAgaWYgKG1BY3Rpb25CYXIgPT0gbnVsbCkgeworICAgICAgICAgICAgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKEZFQVRVUkVfT1BUSU9OU19QQU5FTCwgZmFsc2UpOworICAgICAgICAgICAgaWYgKChzdCAhPSBudWxsKSAmJiAoc3QubWVudSAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIE1lbnVCdWlsZGVyIG1lbnVCdWlsZGVyID0gKE1lbnVCdWlsZGVyKSBzdC5tZW51OwogCi0gICAgICAgICAgICBpZiAoc3QuaXNPcGVuKSB7Ci0gICAgICAgICAgICAgICAgLy8gRnJlZXplIHN0YXRlCi0gICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIHN0YXRlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgICAgIG1lbnVCdWlsZGVyLnNhdmVIaWVyYXJjaHlTdGF0ZShzdGF0ZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0LmlzT3BlbikgeworICAgICAgICAgICAgICAgICAgICAvLyBGcmVlemUgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIHN0YXRlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgICAgICBtZW51QnVpbGRlci5zYXZlSGllcmFyY2h5U3RhdGUoc3RhdGUpOwogCi0gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBtZW51IHZpZXdzIHNpbmNlIHRoZXkgbmVlZCB0byBiZSByZWNyZWF0ZWQKLSAgICAgICAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIG5ldyBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICAgY2xlYXJNZW51Vmlld3Moc3QpOworICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG1lbnUgdmlld3Mgc2luY2UgdGhleSBuZWVkIHRvIGJlIHJlY3JlYXRlZAorICAgICAgICAgICAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIG5ldyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgICAgIGNsZWFyTWVudVZpZXdzKHN0KTsKIAotICAgICAgICAgICAgICAgIC8vIFJlLW9wZW4gdGhlIHNhbWUgbWVudQotICAgICAgICAgICAgICAgIHJlb3Blbk1lbnUoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAvLyBSZS1vcGVuIHRoZSBzYW1lIG1lbnUKKyAgICAgICAgICAgICAgICAgICAgcmVvcGVuTWVudShmYWxzZSk7CiAKLSAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHN0YXRlCi0gICAgICAgICAgICAgICAgbWVudUJ1aWxkZXIucmVzdG9yZUhpZXJhcmNoeVN0YXRlKHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICBtZW51QnVpbGRlci5yZXN0b3JlSGllcmFyY2h5U3RhdGUoc3RhdGUpOwogCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIENsZWFyIG1lbnUgdmlld3Mgc28gb24gbmV4dCBtZW51IG9wZW5pbmcsIGl0IHdpbGwgdXNlCi0gICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlciBsYXlvdXQKLSAgICAgICAgICAgICAgICBjbGVhck1lbnVWaWV3cyhzdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgbWVudSB2aWV3cyBzbyBvbiBuZXh0IG1lbnUgb3BlbmluZywgaXQgd2lsbCB1c2UKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlciBsYXlvdXQKKyAgICAgICAgICAgICAgICAgICAgY2xlYXJNZW51Vmlld3Moc3QpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotCiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbGVhck1lbnVWaWV3cyhQYW5lbEZlYXR1cmVTdGF0ZSBzdCkgewotCiAgICAgICAgIC8vIFRoaXMgY2FuIGJlIGNhbGxlZCBvbiBjb25maWcgY2hhbmdlcywgc28gd2Ugc2hvdWxkIG1ha2Ugc3VyZQogICAgICAgICAvLyB0aGUgdmlld3Mgd2lsbCBiZSByZWNvbnN0cnVjdGVkIGJhc2VkIG9uIHRoZSBuZXcgb3JpZW50YXRpb24sIGV0Yy4KIApAQCAtMzkzLDcgKzQxNiwxMiBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIHZvaWQgb3BlblBhbmVsKGludCBmZWF0dXJlSWQsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIG9wZW5QYW5lbChnZXRQYW5lbFN0YXRlKGZlYXR1cmVJZCwgdHJ1ZSksIGV2ZW50KTsKKyAgICAgICAgaWYgKGZlYXR1cmVJZCA9PSBGRUFUVVJFX09QVElPTlNfUEFORUwgJiYgbUFjdGlvbkJhciAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5pc092ZXJmbG93UmVzZXJ2ZWQoKSkgeworICAgICAgICAgICAgbUFjdGlvbkJhci5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcGVuUGFuZWwoZ2V0UGFuZWxTdGF0ZShmZWF0dXJlSWQsIHRydWUpLCBldmVudCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgb3BlblBhbmVsKFBhbmVsRmVhdHVyZVN0YXRlIHN0LCBLZXlFdmVudCBldmVudCkgewpAQCAtNDg0LDcgKzUxMiwxMCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIHZvaWQgY2xvc2VQYW5lbChpbnQgZmVhdHVyZUlkKSB7Ci0gICAgICAgIGlmIChmZWF0dXJlSWQgPT0gRkVBVFVSRV9DT05URVhUX01FTlUpIHsKKyAgICAgICAgaWYgKGZlYXR1cmVJZCA9PSBGRUFUVVJFX09QVElPTlNfUEFORUwgJiYgbUFjdGlvbkJhciAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5pc092ZXJmbG93UmVzZXJ2ZWQoKSkgeworICAgICAgICAgICAgbUFjdGlvbkJhci5oaWRlT3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0gZWxzZSBpZiAoZmVhdHVyZUlkID09IEZFQVRVUkVfQ09OVEVYVF9NRU5VKSB7CiAgICAgICAgICAgICBjbG9zZUNvbnRleHRNZW51KCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjbG9zZVBhbmVsKGdldFBhbmVsU3RhdGUoZmVhdHVyZUlkLCB0cnVlKSwgdHJ1ZSk7CkBAIC01NDUsNiArNTc2LDI2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlUGFuZWxNZW51KGludCBmZWF0dXJlSWQpIHsKKyAgICAgICAgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKGZlYXR1cmVJZCwgdHJ1ZSk7CisgICAgICAgIGlmIChzdC5tZW51ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0Lm1lbnUuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBzdC5yZWZyZXNoTWVudUNvbnRlbnQgPSB0cnVlOworICAgICAgICBzdC5yZWZyZXNoRGVjb3JWaWV3ID0gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIC8vIFByZXBhcmUgdGhlIG9wdGlvbnMgcGFuZWwgaWYgd2UgaGF2ZSBhbiBhY3Rpb24gYmFyCisgICAgICAgIGlmICgoZmVhdHVyZUlkID09IEZFQVRVUkVfQUNUSU9OX0JBUiB8fCBmZWF0dXJlSWQgPT0gRkVBVFVSRV9PUFRJT05TX1BBTkVMKQorICAgICAgICAgICAgICAgICYmIG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc3QgPSBnZXRQYW5lbFN0YXRlKFdpbmRvdy5GRUFUVVJFX09QVElPTlNfUEFORUwsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3QuaXNQcmVwYXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHByZXBhcmVQYW5lbChzdCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHBhbmVsIGtleSBpcyBwdXNoZWQgZG93bi4KICAgICAgKiBAcGFyYW0gZmVhdHVyZUlkIFRoZSBmZWF0dXJlIElEIG9mIHRoZSByZWxldmFudCBwYW5lbCAoZGVmYXVsdHMgdG8gRkVBVFVSRV9PUFRJT05TX1BBTkVMfS4KQEAgLTU1OCw3ICs2MDksNyBAQAogICAgICAgICAgICAgLy8gVGhlIHBhbmVsIGtleSB3YXMgcHVzaGVkLCBzbyBzZXQgdGhlIGNob3JkaW5nIGtleQogICAgICAgICAgICAgbVBhbmVsQ2hvcmRpbmdLZXkgPSBrZXlDb2RlOwogICAgICAgICAgICAgbVBhbmVsTWF5TG9uZ1ByZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKGZlYXR1cmVJZCwgdHJ1ZSk7CiAgICAgICAgICAgICBpZiAoIXN0LmlzT3BlbikgewogICAgICAgICAgICAgICAgIGlmIChnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLmtleWJvYXJkCkBAIC01NjcsNyArNjE4LDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXBhcmVQYW5lbChzdCwgZXZlbnQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCiAgICAgICAgIH0gZWxzZSBpZiAobVBhbmVsTWF5TG9uZ1ByZXNzICYmIG1QYW5lbENob3JkaW5nS2V5ID09IGtleUNvZGUKICAgICAgICAgICAgICAgICAmJiAoZXZlbnQuZ2V0RmxhZ3MoKSZLZXlFdmVudC5GTEFHX0xPTkdfUFJFU1MpICE9IDApIHsKICAgICAgICAgICAgIC8vIFdlIGhhdmUgaGFkIGEgbG9uZyBwcmVzcyB3aGlsZSBpbiBhIHN0YXRlIHdoZXJlIHRoaXMKQEAgLTYwMiwyNSArNjUyLDM4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGJvb2xlYW4gcGxheVNvdW5kRWZmZWN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBQYW5lbEZlYXR1cmVTdGF0ZSBzdCA9IGdldFBhbmVsU3RhdGUoZmVhdHVyZUlkLCB0cnVlKTsKLSAgICAgICAgICAgIGlmIChzdC5pc09wZW4gfHwgc3QuaXNIYW5kbGVkKSB7CisgICAgICAgICAgICBmaW5hbCBQYW5lbEZlYXR1cmVTdGF0ZSBzdCA9IGdldFBhbmVsU3RhdGUoZmVhdHVyZUlkLCB0cnVlKTsKKyAgICAgICAgICAgIGlmIChmZWF0dXJlSWQgPT0gRkVBVFVSRV9PUFRJT05TX1BBTkVMICYmIG1BY3Rpb25CYXIgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICBtQWN0aW9uQmFyLmlzT3ZlcmZsb3dSZXNlcnZlZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtQWN0aW9uQmFyLmlzT3ZlcmZsb3dNZW51U2hvd2luZygpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENhbGxiYWNrIGNiID0gZ2V0Q2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNiICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYi5vblByZXBhcmVQYW5lbChmZWF0dXJlSWQsIHN0LmNyZWF0ZWRQYW5lbFZpZXcsIHN0Lm1lbnUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGF5U291bmRFZmZlY3QgPSBtQWN0aW9uQmFyLnNob3dPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdCA9IG1BY3Rpb25CYXIuaGlkZU92ZXJmbG93TWVudSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHN0LmlzT3BlbiB8fCBzdC5pc0hhbmRsZWQpIHsKIAotICAgICAgICAgICAgICAgIC8vIFBsYXkgdGhlIHNvdW5kIGVmZmVjdCBpZiB0aGUgdXNlciBjbG9zZWQgYW4gb3BlbiBtZW51IChhbmQgbm90IGlmCi0gICAgICAgICAgICAgICAgLy8gdGhleSBqdXN0IHJlbGVhc2VkIGEgbWVudSBzaG9ydGN1dCkKLSAgICAgICAgICAgICAgICBwbGF5U291bmRFZmZlY3QgPSBzdC5pc09wZW47CisgICAgICAgICAgICAgICAgICAgIC8vIFBsYXkgdGhlIHNvdW5kIGVmZmVjdCBpZiB0aGUgdXNlciBjbG9zZWQgYW4gb3BlbiBtZW51IChhbmQgbm90IGlmCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZXkganVzdCByZWxlYXNlZCBhIG1lbnUgc2hvcnRjdXQpCisgICAgICAgICAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdCA9IHN0LmlzT3BlbjsKIAotICAgICAgICAgICAgICAgIC8vIENsb3NlIG1lbnUKLSAgICAgICAgICAgICAgICBjbG9zZVBhbmVsKHN0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgbWVudQorICAgICAgICAgICAgICAgICAgICBjbG9zZVBhbmVsKHN0LCB0cnVlKTsKIAotICAgICAgICAgICAgfSBlbHNlIGlmIChzdC5pc1ByZXBhcmVkKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdC5pc1ByZXBhcmVkKSB7CiAKLSAgICAgICAgICAgICAgICAvLyBXcml0ZSAnbWVudSBvcGVuZWQnIHRvIGV2ZW50IGxvZwotICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoNTAwMDEsIDApOworICAgICAgICAgICAgICAgICAgICAvLyBXcml0ZSAnbWVudSBvcGVuZWQnIHRvIGV2ZW50IGxvZworICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KDUwMDAxLCAwKTsKIAotICAgICAgICAgICAgICAgIC8vIFNob3cgbWVudQotICAgICAgICAgICAgICAgIG9wZW5QYW5lbChzdCwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAvLyBTaG93IG1lbnUKKyAgICAgICAgICAgICAgICAgICAgb3BlblBhbmVsKHN0LCBldmVudCk7CiAKLSAgICAgICAgICAgICAgICBwbGF5U291bmRFZmZlY3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBwbGF5U291bmRFZmZlY3QgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHBsYXlTb3VuZEVmZmVjdCkgewpAQCAtNzc3LDggKzg0MCwyMCBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBUaGUgd2luZG93IG1hbmFnZXIgd2lsbCBnaXZlIHVzIGEgdmFsaWQgd2luZG93IHRva2VuCi0gICAgICAgIG5ldyBNZW51RGlhbG9nSGVscGVyKHN1Yk1lbnUpLnNob3cobnVsbCk7CisgICAgICAgIGZpbmFsIE1lbnUgcGFyZW50TWVudSA9IHN1Yk1lbnUuZ2V0Um9vdE1lbnUoKTsKKyAgICAgICAgZmluYWwgUGFuZWxGZWF0dXJlU3RhdGUgcGFuZWwgPSBmaW5kTWVudVBhbmVsKHBhcmVudE1lbnUpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFVzZSB0aGUgcGFuZWwgb3BlbiBzdGF0ZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGNvbWluZyBmcm9tIGFuIG9wZW4gcGFuZWwKKyAgICAgICAgICogb3IgYW4gYWN0aW9uIGJ1dHRvbi4gSWYgaXQncyBhbiBvcGVuIHBhbmVsIHdlIHdhbnQgdG8gdXNlIE1lbnVEaWFsb2dIZWxwZXIuCisgICAgICAgICAqIElmIGl0J3MgY2xvc2VkIHdlIHdhbnQgdG8gZ3JhYiB0aGUgcmVsZXZhbnQgdmlldyBhbmQgY3JlYXRlIGEgcG9wdXAgYW5jaG9yZWQgdG8gaXQuCisgICAgICAgICAqLworICAgICAgICBpZiAocGFuZWwuaXNPcGVuKSB7CisgICAgICAgICAgICAvLyBUaGUgd2luZG93IG1hbmFnZXIgd2lsbCBnaXZlIHVzIGEgdmFsaWQgd2luZG93IHRva2VuCisgICAgICAgICAgICBuZXcgTWVudURpYWxvZ0hlbHBlcihzdWJNZW51KS5zaG93KG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmV3IE1lbnVQb3B1cEhlbHBlcihnZXRDb250ZXh0KCksIHN1Yk1lbnUpLnNob3coKTsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTc4OCw2ICs4NjMsMjEgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVvcGVuTWVudShib29sZWFuIHRvZ2dsZU1lbnVNb2RlKSB7CisgICAgICAgIGlmIChtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghbUFjdGlvbkJhci5pc092ZXJmbG93TWVudVNob3dpbmcoKSB8fCAhdG9nZ2xlTWVudU1vZGUpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDYWxsYmFjayBjYiA9IGdldENhbGxiYWNrKCk7CisgICAgICAgICAgICAgICAgaWYgKGNiICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKEZFQVRVUkVfT1BUSU9OU19QQU5FTCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYi5vblByZXBhcmVQYW5lbChGRUFUVVJFX09QVElPTlNfUEFORUwsIHN0LmNyZWF0ZWRQYW5lbFZpZXcsIHN0Lm1lbnUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aW9uQmFyLnNob3dPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5oaWRlT3ZlcmZsb3dNZW51KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICBQYW5lbEZlYXR1cmVTdGF0ZSBzdCA9IGdldFBhbmVsU3RhdGUoRkVBVFVSRV9PUFRJT05TX1BBTkVMLCB0cnVlKTsKIAogICAgICAgICAvLyBTYXZlIHRoZSBmdXR1cmUgZXhwYW5kZWQgbW9kZSBzdGF0ZSBzaW5jZSBjbG9zZVBhbmVsIHdpbGwgcmVzZXQgaXQKQEAgLTE0MzcsNiArMTUyNyw3IEBACiAgICAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIEZPQ1VTRURfSURfVEFHID0gImFuZHJvaWQ6Zm9jdXNlZFZpZXdJZCI7CiAgICAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFZJRVdTX1RBRyA9ICJhbmRyb2lkOnZpZXdzIjsKICAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUEFORUxTX1RBRyA9ICJhbmRyb2lkOlBhbmVscyI7CisgICAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIEFDVElPTl9CQVJfVEFHID0gImFuZHJvaWQ6QWN0aW9uQmFyIjsKIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCiAgICAgQE92ZXJyaWRlCkBAIC0xNDcwLDYgKzE1NjEsMTAgQEAKICAgICAgICAgICAgIG91dFN0YXRlLnB1dFNwYXJzZVBhcmNlbGFibGVBcnJheShQQU5FTFNfVEFHLCBwYW5lbFN0YXRlcyk7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRCb29sZWFuKEFDVElPTl9CQVJfVEFHLCBtQWN0aW9uQmFyLmlzT3ZlcmZsb3dNZW51U2hvd2luZygpKTsKKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiBvdXRTdGF0ZTsKICAgICB9CiAKQEAgLTE1MDQsNiArMTU5OSwxMCBAQAogICAgICAgICBpZiAocGFuZWxTdGF0ZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgcmVzdG9yZVBhbmVsU3RhdGUocGFuZWxTdGF0ZXMpOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKG1BY3Rpb25CYXIgIT0gbnVsbCAmJiBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0Qm9vbGVhbihBQ1RJT05fQkFSX1RBRykpIHsKKyAgICAgICAgICAgIG1BY3Rpb25CYXIucG9zdFNob3dPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTU5NCw2ICsxNjkzLDkgQEAKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1XYXRjaGluZ0Zvck1lbnU7CiAgICAgICAgIHByaXZhdGUgaW50IG1Eb3duWTsKIAorICAgICAgICBwcml2YXRlIEFjdGlvbk1vZGUgbUFjdGlvbk1vZGU7CisgICAgICAgIHByaXZhdGUgQWN0aW9uQmFyQ29udGV4dFZpZXcgbUFjdGlvbk1vZGVWaWV3OworCiAgICAgICAgIHB1YmxpYyBEZWNvclZpZXcoQ29udGV4dCBjb250ZXh0LCBpbnQgZmVhdHVyZUlkKSB7CiAgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKICAgICAgICAgICAgIG1GZWF0dXJlSWQgPSBmZWF0dXJlSWQ7CkBAIC0xNjAyLDcgKzE3MDQsOCBAQAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hLZXlFdmVudChLZXlFdmVudCBldmVudCkgewogICAgICAgICAgICAgZmluYWwgaW50IGtleUNvZGUgPSBldmVudC5nZXRLZXlDb2RlKCk7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzRG93biA9IGV2ZW50LmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9ET1dOOworICAgICAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2ZW50LmdldEFjdGlvbigpOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0Rvd24gPSBhY3Rpb24gPT0gS2V5RXZlbnQuQUNUSU9OX0RPV047CiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBJZiB0aGUgdXNlciBoaXRzIGFub3RoZXIga2V5IHdpdGhpbiB0aGUgcGxheSBzb3VuZCBkZWxheSwgdGhlbgpAQCAtMTY1OSw2ICsxNzYyLDE0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBCYWNrIGNhbmNlbHMgYWN0aW9uIG1vZGVzIGZpcnN0LgorICAgICAgICAgICAgaWYgKG1BY3Rpb25Nb2RlICE9IG51bGwgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0JBQ0spIHsKKyAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IEtleUV2ZW50LkFDVElPTl9VUCkgeworICAgICAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZS5maW5pc2goKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGZpbmFsIENhbGxiYWNrIGNiID0gZ2V0Q2FsbGJhY2soKTsKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFuZGxlZCA9IGNiICE9IG51bGwgJiYgbUZlYXR1cmVJZCA8IDAgPyBjYi5kaXNwYXRjaEtleUV2ZW50KGV2ZW50KQogICAgICAgICAgICAgICAgICAgICA6IHN1cGVyLmRpc3BhdGNoS2V5RXZlbnQoZXZlbnQpOwpAQCAtMTg4MSw2ICsxOTkyLDU1IEBACiAgICAgICAgICAgICByZXR1cm4gbUNvbnRleHRNZW51SGVscGVyICE9IG51bGw7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQoVmlldyBvcmlnaW5hbFZpZXcsCisgICAgICAgICAgICAgICAgQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgLy8gb3JpZ2luYWxWaWV3IGNhbiBiZSB1c2VkIGhlcmUgdG8gYmUgc3VyZSB0aGF0IHdlIGRvbid0IG9ic2N1cmUKKyAgICAgICAgICAgIC8vIHJlbGV2YW50IGNvbnRlbnQgd2l0aCB0aGUgY29udGV4dCBtb2RlIFVJLgorICAgICAgICAgICAgcmV0dXJuIHN0YXJ0QWN0aW9uTW9kZShjYWxsYmFjayk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlKEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGlmIChtQWN0aW9uTW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGUuZmluaXNoKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIEFjdGlvbk1vZGUuQ2FsbGJhY2sgd3JhcHBlZENhbGxiYWNrID0gbmV3IEFjdGlvbk1vZGVDYWxsYmFja1dyYXBwZXIoY2FsbGJhY2spOworICAgICAgICAgICAgQWN0aW9uTW9kZSBtb2RlID0gZ2V0Q2FsbGJhY2soKS5vblN0YXJ0QWN0aW9uTW9kZSh3cmFwcGVkQ2FsbGJhY2spOworICAgICAgICAgICAgaWYgKG1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlID0gbW9kZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1BY3Rpb25Nb2RlVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYXNGZWF0dXJlKEZFQVRVUkVfQUNUSU9OX01PREVfT1ZFUkxBWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlVmlldyA9IG5ldyBBY3Rpb25CYXJDb250ZXh0VmlldyhtQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMgcGFyYW1zID0gbmV3IEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFUQ0hfUEFSRU5ULCBXUkFQX0NPTlRFTlQpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkVmlldyhtQWN0aW9uTW9kZVZpZXcsIHBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBWaWV3U3R1YiBzdHViID0gKFZpZXdTdHViKSBmaW5kVmlld0J5SWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuYWN0aW9uX21vZGVfYmFyX3N0dWIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0dWIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlVmlldyA9IChBY3Rpb25CYXJDb250ZXh0Vmlldykgc3R1Yi5pbmZsYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobUFjdGlvbk1vZGVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbW9kZSA9IG5ldyBTdGFuZGFsb25lQWN0aW9uTW9kZShnZXRDb250ZXh0KCksIG1BY3Rpb25Nb2RlVmlldywgd3JhcHBlZENhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrLm9uQ3JlYXRlQWN0aW9uTW9kZShtb2RlLCBtb2RlLmdldE1lbnUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGVWaWV3LmluaXRGb3JNb2RlKG1vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlID0gbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtQWN0aW9uTW9kZTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q2hhbmdpbmcoKSB7CiAgICAgICAgICAgICBtQ2hhbmdpbmcgPSB0cnVlOwogICAgICAgICB9CkBAIC0yMDYwLDYgKzIyMjAsMzcgQEAKICAgICAgICAgICAgIGlmIChrZWVwT24pIFBob25lV2luZG93LnRoaXMuYWRkRmxhZ3MoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19LRUVQX1NDUkVFTl9PTik7CiAgICAgICAgICAgICBlbHNlIFBob25lV2luZG93LnRoaXMuY2xlYXJGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0tFRVBfU0NSRUVOX09OKTsKICAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbGVhcnMgb3V0IGludGVybmFsIHJlZmVyZW5jZSB3aGVuIHRoZSBhY3Rpb24gbW9kZSBpcyBkZXN0cm95ZWQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGNsYXNzIEFjdGlvbk1vZGVDYWxsYmFja1dyYXBwZXIgaW1wbGVtZW50cyBBY3Rpb25Nb2RlLkNhbGxiYWNrIHsKKyAgICAgICAgICAgIHByaXZhdGUgQWN0aW9uTW9kZS5DYWxsYmFjayBtV3JhcHBlZDsKKworICAgICAgICAgICAgcHVibGljIEFjdGlvbk1vZGVDYWxsYmFja1dyYXBwZXIoQWN0aW9uTW9kZS5DYWxsYmFjayB3cmFwcGVkKSB7CisgICAgICAgICAgICAgICAgbVdyYXBwZWQgPSB3cmFwcGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVdyYXBwZWQub25DcmVhdGVBY3Rpb25Nb2RlKG1vZGUsIG1lbnUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1XcmFwcGVkLm9uUHJlcGFyZUFjdGlvbk1vZGUobW9kZSwgbWVudSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQWN0aW9uSXRlbUNsaWNrZWQoQWN0aW9uTW9kZSBtb2RlLCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1XcmFwcGVkLm9uQWN0aW9uSXRlbUNsaWNrZWQobW9kZSwgaXRlbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgICAgICAgICAgbVdyYXBwZWQub25EZXN0cm95QWN0aW9uTW9kZShtb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAobUFjdGlvbk1vZGVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGVWaWV3LnJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHByb3RlY3RlZCBEZWNvclZpZXcgZ2VuZXJhdGVEZWNvcigpIHsKQEAgLTIxMDgsNiArMjI5OSwxNyBAQAogCiAgICAgICAgIGlmIChhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93X3dpbmRvd05vVGl0bGUsIGZhbHNlKSkgewogICAgICAgICAgICAgcmVxdWVzdEZlYXR1cmUoRkVBVFVSRV9OT19USVRMRSk7CisgICAgICAgIH0gZWxzZSBpZiAoYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd193aW5kb3dBY3Rpb25CYXIsIGZhbHNlKSkgeworICAgICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgYW4gYWN0aW9uIGJhciBpZiB0aGVyZSBpcyBubyB0aXRsZS4KKyAgICAgICAgICAgIHJlcXVlc3RGZWF0dXJlKEZFQVRVUkVfQUNUSU9OX0JBUik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd193aW5kb3dBY3Rpb25CYXJPdmVybGF5LCBmYWxzZSkpIHsKKyAgICAgICAgICAgIHJlcXVlc3RGZWF0dXJlKEZFQVRVUkVfQUNUSU9OX0JBUl9PVkVSTEFZKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93X3dpbmRvd0FjdGlvbk1vZGVPdmVybGF5LCBmYWxzZSkpIHsKKyAgICAgICAgICAgIHJlcXVlc3RGZWF0dXJlKEZFQVRVUkVfQUNUSU9OX01PREVfT1ZFUkxBWSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd193aW5kb3dGdWxsc2NyZWVuLCBmYWxzZSkpIHsKQEAgLTIxNzIsMTEgKzIzNzQsMTUgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbGF5b3V0UmVzb3VyY2UgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5zY3JlZW5fdGl0bGVfaWNvbnM7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBYWFggUmVtb3ZlIHRoaXMgb25jZSBhY3Rpb24gYmFyIHN1cHBvcnRzIHRoZXNlIGZlYXR1cmVzLgorICAgICAgICAgICAgcmVtb3ZlRmVhdHVyZShGRUFUVVJFX0FDVElPTl9CQVIpOwogICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJUaXRsZSBJY29ucyEiKTsKICAgICAgICAgfSBlbHNlIGlmICgoZmVhdHVyZXMgJiAoKDEgPDwgRkVBVFVSRV9QUk9HUkVTUykgfCAoMSA8PCBGRUFUVVJFX0lOREVURVJNSU5BVEVfUFJPR1JFU1MpKSkgIT0gMCkgewogICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBhIHdpbmRvdyB3aXRoIG9ubHkgYSBwcm9ncmVzcyBiYXIgKGFuZCB0aXRsZSkuCiAgICAgICAgICAgICAvLyBYWFggTmVlZCB0byBoYXZlIGEgbm8tdGl0bGUgdmVyc2lvbiBvZiBlbWJlZGRlZCB3aW5kb3dzLgogICAgICAgICAgICAgbGF5b3V0UmVzb3VyY2UgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5zY3JlZW5fcHJvZ3Jlc3M7CisgICAgICAgICAgICAvLyBYWFggUmVtb3ZlIHRoaXMgb25jZSBhY3Rpb24gYmFyIHN1cHBvcnRzIHRoZXNlIGZlYXR1cmVzLgorICAgICAgICAgICAgcmVtb3ZlRmVhdHVyZShGRUFUVVJFX0FDVElPTl9CQVIpOwogICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcm9ncmVzcyEiKTsKICAgICAgICAgfSBlbHNlIGlmICgoZmVhdHVyZXMgJiAoMSA8PCBGRUFUVVJFX0NVU1RPTV9USVRMRSkpICE9IDApIHsKICAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgYSB3aW5kb3cgd2l0aCBhIGN1c3RvbSB0aXRsZS4KQEAgLTIxODYsMTEgKzIzOTIsMTkgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbGF5b3V0UmVzb3VyY2UgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5zY3JlZW5fY3VzdG9tX3RpdGxlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gWFhYIFJlbW92ZSB0aGlzIG9uY2UgYWN0aW9uIGJhciBzdXBwb3J0cyB0aGVzZSBmZWF0dXJlcy4KKyAgICAgICAgICAgIHJlbW92ZUZlYXR1cmUoRkVBVFVSRV9BQ1RJT05fQkFSKTsKICAgICAgICAgfSBlbHNlIGlmICgoZmVhdHVyZXMgJiAoMSA8PCBGRUFUVVJFX05PX1RJVExFKSkgPT0gMCkgewogICAgICAgICAgICAgLy8gSWYgbm8gb3RoZXIgZmVhdHVyZXMgYW5kIG5vdCBlbWJlZGRlZCwgb25seSBuZWVkIGEgdGl0bGUuCiAgICAgICAgICAgICAvLyBJZiB0aGUgd2luZG93IGlzIGZsb2F0aW5nLCB3ZSBuZWVkIGEgZGlhbG9nIGxheW91dAogICAgICAgICAgICAgaWYgKG1Jc0Zsb2F0aW5nKSB7CiAgICAgICAgICAgICAgICAgbGF5b3V0UmVzb3VyY2UgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5kaWFsb2dfdGl0bGU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChmZWF0dXJlcyAmICgxIDw8IEZFQVRVUkVfQUNUSU9OX0JBUikpICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKGZlYXR1cmVzICYgKDEgPDwgRkVBVFVSRV9BQ1RJT05fQkFSX09WRVJMQVkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxheW91dFJlc291cmNlID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuc2NyZWVuX2FjdGlvbl9iYXJfb3ZlcmxheTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsYXlvdXRSZXNvdXJjZSA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnNjcmVlbl9hY3Rpb25fYmFyOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbGF5b3V0UmVzb3VyY2UgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5zY3JlZW5fdGl0bGU7CiAgICAgICAgICAgICB9CkBAIC0yMjc1LDYgKzI0ODksMjIgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQobVRpdGxlKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1BY3Rpb25CYXIgPSAoQWN0aW9uQmFyVmlldykgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuYWN0aW9uX2Jhcik7CisgICAgICAgICAgICAgICAgaWYgKG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobUFjdGlvbkJhci5nZXRUaXRsZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25CYXIuc2V0V2luZG93VGl0bGUobVRpdGxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBQb3N0IHRoZSBwYW5lbCBpbnZhbGlkYXRlIGZvciBsYXRlcjsgYXZvaWQgYXBwbGljYXRpb24gb25DcmVhdGVPcHRpb25zTWVudQorICAgICAgICAgICAgICAgICAgICAvLyBiZWluZyBjYWxsZWQgaW4gdGhlIG1pZGRsZSBvZiBvbkNyZWF0ZSBvciBzaW1pbGFyLgorICAgICAgICAgICAgICAgICAgICBtRGVjb3IucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Rlc3Ryb3llZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVQYW5lbE1lbnUoRkVBVFVSRV9BQ1RJT05fQkFSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI2MjgsNiArMjg1OCw4IEBACiAKICAgICAgICAgYm9vbGVhbiByZWZyZXNoRGVjb3JWaWV3OwogCisgICAgICAgIGJvb2xlYW4gcmVmcmVzaE1lbnVDb250ZW50OworICAgICAgICAKICAgICAgICAgYm9vbGVhbiB3YXNMYXN0T3BlbjsKICAgICAgICAgCiAgICAgICAgIGJvb2xlYW4gd2FzTGFzdEV4cGFuZGVkOwpAQCAtMjc1MCwxMSArMjk4MiwxMSBAQAogICAgICAqIDxsaT4gQ2FsbHMgYmFjayB0byB0aGUgY2FsbGJhY2sncyBvbk1lbnVJdGVtU2VsZWN0ZWQgd2hlbiBhbiBpdGVtIGlzCiAgICAgICogc2VsZWN0ZWQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDb250ZXh0TWVudUNhbGxiYWNrIGltcGxlbWVudHMgTWVudUJ1aWxkZXIuQ2FsbGJhY2sgeworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgRGlhbG9nTWVudUNhbGxiYWNrIGltcGxlbWVudHMgTWVudUJ1aWxkZXIuQ2FsbGJhY2sgewogICAgICAgICBwcml2YXRlIGludCBtRmVhdHVyZUlkOwogICAgICAgICBwcml2YXRlIE1lbnVEaWFsb2dIZWxwZXIgbVN1Yk1lbnVIZWxwZXI7CiAKLSAgICAgICAgcHVibGljIENvbnRleHRNZW51Q2FsbGJhY2soaW50IGZlYXR1cmVJZCkgeworICAgICAgICBwdWJsaWMgRGlhbG9nTWVudUNhbGxiYWNrKGludCBmZWF0dXJlSWQpIHsKICAgICAgICAgICAgIG1GZWF0dXJlSWQgPSBmZWF0dXJlSWQ7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvd01hbmFnZXIuamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3dNYW5hZ2VyLmphdmEKaW5kZXggZjIxZDM1Ny4uMzM2ODViYSAxMDA3NTUKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvd01hbmFnZXIuamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93TWFuYWdlci5qYXZhCkBAIC00Niw2ICs0Niw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5WaWJyYXRvcjsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuUG9saWN5TWFuYWdlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuSVN0YXR1c0JhclNlcnZpY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklUZWxlcGhvbnk7CkBAIC04OCw2ICs4OSw3IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX0FQUExJQ0FUSU9OX1BBTkVMOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9BUFBMSUNBVElPTl9TVUJfUEFORUw7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX0FQUExJQ0FUSU9OX0FUVEFDSEVEX0RJQUxPRzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfRFJBRzsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfS0VZR1VBUkQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX0tFWUdVQVJEX0RJQUxPRzsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfUEhPTkU7CkBAIC0xNTEsOCArMTUzLDExIEBACiAgICAgLy8gcmVzcG9uc2libGUgZm9yIHBvd2VyIG1hbmFnZW1lbnQgd2hlbiBkaXNwbGF5ZWQuCiAgICAgc3RhdGljIGZpbmFsIGludCBLRVlHVUFSRF9MQVlFUiA9IDE0OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgS0VZR1VBUkRfRElBTE9HX0xBWUVSID0gMTU7CisgICAgLy8gdGhlIGRyYWcgbGF5ZXI6IGlucHV0IGZvciBkcmFnLWFuZC1kcm9wIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdpbmRvdywKKyAgICAvLyB3aGljaCBzaXRzIGFib3ZlIGFsbCBvdGhlciBmb2N1c2FibGUgd2luZG93cworICAgIHN0YXRpYyBmaW5hbCBpbnQgRFJBR19MQVlFUiA9IDE2OwogICAgIC8vIHRoaW5ncyBpbiBoZXJlIENBTiBOT1QgdGFrZSBmb2N1cywgYnV0IGFyZSBzaG93biBvbiB0b3Agb2YgZXZlcnl0aGluZyBlbHNlLgotICAgIHN0YXRpYyBmaW5hbCBpbnQgU1lTVEVNX09WRVJMQVlfTEFZRVIgPSAxNjsKKyAgICBzdGF0aWMgZmluYWwgaW50IFNZU1RFTV9PVkVSTEFZX0xBWUVSID0gMTc7CiAKICAgICBzdGF0aWMgZmluYWwgaW50IEFQUExJQ0FUSU9OX01FRElBX1NVQkxBWUVSID0gLTI7CiAgICAgc3RhdGljIGZpbmFsIGludCBBUFBMSUNBVElPTl9NRURJQV9PVkVSTEFZX1NVQkxBWUVSID0gLTE7CkBAIC0xNzYsNiArMTgxLDcgQEAKICAgICBDb250ZXh0IG1Db250ZXh0OwogICAgIElXaW5kb3dNYW5hZ2VyIG1XaW5kb3dNYW5hZ2VyOwogICAgIExvY2FsUG93ZXJNYW5hZ2VyIG1Qb3dlck1hbmFnZXI7CisgICAgSVN0YXR1c0JhclNlcnZpY2UgbVN0YXR1c0JhclNlcnZpY2U7CiAgICAgVmlicmF0b3IgbVZpYnJhdG9yOyAvLyBWaWJyYXRvciBmb3IgZ2l2aW5nIGZlZWRiYWNrIG9mIG9yaWVudGF0aW9uIGNoYW5nZXMKIAogICAgIC8vIFZpYnJhdG9yIHBhdHRlcm4gZm9yIGhhcHRpYyBmZWVkYmFjayBvZiBhIGxvbmcgcHJlc3MuCkBAIC0xOTgsNiArMjA0LDcgQEAKICAgICAKICAgICBib29sZWFuIG1TYWZlTW9kZTsKICAgICBXaW5kb3dTdGF0ZSBtU3RhdHVzQmFyID0gbnVsbDsKKyAgICBib29sZWFuIG1TdGF0dXNCYXJDYW5IaWRlOwogICAgIGZpbmFsIEFycmF5TGlzdDxXaW5kb3dTdGF0ZT4gbVN0YXR1c0JhclBhbmVscyA9IG5ldyBBcnJheUxpc3Q8V2luZG93U3RhdGU+KCk7CiAgICAgV2luZG93U3RhdGUgbUtleWd1YXJkID0gbnVsbDsKICAgICBLZXlndWFyZFZpZXdNZWRpYXRvciBtS2V5Z3VhcmRNZWRpYXRvcjsKQEAgLTI2NCw2ICsyNzEsNyBAQAogICAgIHN0YXRpYyBmaW5hbCBSZWN0IG1UbXBWaXNpYmxlRnJhbWUgPSBuZXcgUmVjdCgpOwogICAgIAogICAgIFdpbmRvd1N0YXRlIG1Ub3BGdWxsc2NyZWVuT3BhcXVlV2luZG93U3RhdGU7CisgICAgYm9vbGVhbiBtVG9wSXNGdWxsc2NyZWVuOwogICAgIGJvb2xlYW4gbUZvcmNlU3RhdHVzQmFyOwogICAgIGJvb2xlYW4gbUhpZGVMb2NrU2NyZWVuOwogICAgIGJvb2xlYW4gbURpc21pc3NLZXlndWFyZDsKQEAgLTI5Myw2ICszMDEsOSBAQAogCiAgICAgLy8gTm90aGluZyB0byBzZWUgaGVyZSwgbW92ZSBhbG9uZy4uLgogICAgIGludCBtRmFuY3lSb3RhdGlvbkFuaW1hdGlvbjsKKyAgICAKKyAgICAvLyBFbmFibGUgM0QgcmVjZW50cyBiYXNlZCBvbiBjb25maWcgc2V0dGluZ3MuCisgICAgcHJpdmF0ZSBCb29sZWFuIG1Vc2UzZFJlY2VudHM7CiAKICAgICBTaG9ydGN1dE1hbmFnZXIgbVNob3J0Y3V0TWFuYWdlcjsKICAgICBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbUJyb2FkY2FzdFdha2VMb2NrOwpAQCAtNTAxLDYgKzUxMiwyNyBAQAogICAgICAqIENyZWF0ZSAoaWYgbmVjZXNzYXJ5KSBhbmQgbGF1bmNoIHRoZSByZWNlbnQgYXBwcyBkaWFsb2cKICAgICAgKi8KICAgICB2b2lkIHNob3dSZWNlbnRBcHBzRGlhbG9nKCkgeworICAgICAgICAvLyBXZSBjYW4ndCBpbml0aWFsaXplIHRoaXMgaW4gaW5pdCgpIHNpbmNlIHRoZSBjb25maWd1cmF0aW9uIGhhc24ndCBiZWVuIGxvYWRlZCB5ZXQuCisgICAgICAgIGlmIChtVXNlM2RSZWNlbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Vc2UzZFJlY2VudHMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKFIuYm9vbC5jb25maWdfZW5hYmxlUmVjZW50QXBwczNEKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gVXNlIDNkIFJlY2VudHMgZGlhbG9nCisgICAgICAgIGlmIChtVXNlM2RSZWNlbnRzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgICAgICAgICAgaW50ZW50LnNldENsYXNzTmFtZSgiY29tLmFuZHJvaWQuc3lzdGVtdWkiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHkiKTsKKyAgICAgICAgICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgCisgICAgICAgICAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0FDVElWSVRZX0VYQ0xVREVfRlJPTV9SRUNFTlRTKTsKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBjYXRjaCAoQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGxhdW5jaCBSZWNlbnRBcHBzSW50ZW50IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBGYWxsYmFjayB0byBkaWFsb2cgaWYgd2UgZmFpbCB0byBsYXVuY2ggdGhlIGFib3ZlLgogICAgICAgICBpZiAobVJlY2VudEFwcHNEaWFsb2cgPT0gbnVsbCkgewogICAgICAgICAgICAgbVJlY2VudEFwcHNEaWFsb2cgPSBuZXcgUmVjZW50QXBwbGljYXRpb25zRGlhbG9nKG1Db250ZXh0KTsKICAgICAgICAgfQpAQCAtNTMyLDYgKzU2NCw3IEBACiAgICAgICAgIG1EZXNrRG9ja0ludGVudC5hZGRDYXRlZ29yeShJbnRlbnQuQ0FURUdPUllfREVTS19ET0NLKTsKICAgICAgICAgbURlc2tEb2NrSW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLCiAgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9SRVNFVF9UQVNLX0lGX05FRURFRCk7CisKICAgICAgICAgUG93ZXJNYW5hZ2VyIHBtID0gKFBvd2VyTWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKICAgICAgICAgbUJyb2FkY2FzdFdha2VMb2NrID0gcG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLAogICAgICAgICAgICAgICAgICJQaG9uZVdpbmRvd01hbmFnZXIubUJyb2FkY2FzdFdha2VMb2NrIik7CkBAIC01NzQsNiArNjA3LDkgQEAKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFycmF5LmNvbmZpZ19zYWZlTW9kZURpc2FibGVkVmliZVBhdHRlcm4pOwogICAgICAgICBtU2FmZU1vZGVFbmFibGVkVmliZVBhdHRlcm4gPSBnZXRMb25nSW50QXJyYXkobUNvbnRleHQuZ2V0UmVzb3VyY2VzKCksCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfc2FmZU1vZGVFbmFibGVkVmliZVBhdHRlcm4pOworCisgICAgICAgIC8vIE5vdGU6IHRoZSBDb25maWd1cmF0aW9uIGlzIG5vdCBzdGFibGUgaGVyZSwgc28gd2UgY2Fubm90IGxvYWQgbVN0YXR1c0JhckNhbkhpZGUgZnJvbQorICAgICAgICAvLyBjb25maWdfc3RhdHVzQmFyQ2FuSGlkZSBiZWNhdXNlIHRoZSBsYXR0ZXIgZGVwZW5kcyBvbiB0aGUgc2NyZWVuIHNpemUKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB1cGRhdGVTZXR0aW5ncygpIHsKQEAgLTgxMCw2ICs4NDYsOCBAQAogICAgICAgICAgICAgcmV0dXJuIFRPQVNUX0xBWUVSOwogICAgICAgICBjYXNlIFRZUEVfV0FMTFBBUEVSOgogICAgICAgICAgICAgcmV0dXJuIFdBTExQQVBFUl9MQVlFUjsKKyAgICAgICAgY2FzZSBUWVBFX0RSQUc6CisgICAgICAgICAgICByZXR1cm4gRFJBR19MQVlFUjsKICAgICAgICAgfQogICAgICAgICBMb2cuZShUQUcsICJVbmtub3duIHdpbmRvdyB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgIHJldHVybiBBUFBMSUNBVElPTl9MQVlFUjsKQEAgLTk4Niw2ICsxMDI0LDExIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXaW5kb3dNYW5hZ2VySW1wbC5BRERfTVVMVElQTEVfU0lOR0xFVE9OOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtU3RhdHVzQmFyID0gd2luOworCisgICAgICAgICAgICAgICAgLy8gVGhlIENvbmZpZ3VyYXRpb24gd2lsbCBiZSBzdGFibGUgYnkgbm93LCBzbyB3ZSBjYW4gbG9hZCB0aGlzCisgICAgICAgICAgICAgICAgbVN0YXR1c0JhckNhbkhpZGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5ib29sLmNvbmZpZ19zdGF0dXNCYXJDYW5IaWRlKTsKKwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBUWVBFX1NUQVRVU19CQVJfUEFORUw6CiAgICAgICAgICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKApAQCAtMTI0NCw3ICsxMjg3LDcgQEAKICAgICBwdWJsaWMgdm9pZCBnZXRDb250ZW50SW5zZXRIaW50THcoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgYXR0cnMsIFJlY3QgY29udGVudEluc2V0KSB7CiAgICAgICAgIGZpbmFsIGludCBmbCA9IGF0dHJzLmZsYWdzOwogICAgICAgICAKLSAgICAgICAgaWYgKChmbCAmCisgICAgICAgIGlmIChtU3RhdHVzQmFyQ2FuSGlkZSAmJiAoZmwgJgogICAgICAgICAgICAgICAgIChGTEFHX0xBWU9VVF9JTl9TQ1JFRU4gfCBGTEFHX0ZVTExTQ1JFRU4gfCBGTEFHX0xBWU9VVF9JTlNFVF9ERUNPUikpCiAgICAgICAgICAgICAgICAgPT0gKEZMQUdfTEFZT1VUX0lOX1NDUkVFTiB8IEZMQUdfTEFZT1VUX0lOU0VUX0RFQ09SKSkgewogICAgICAgICAgICAgY29udGVudEluc2V0LnNldChtQ3VyTGVmdCwgbUN1clRvcCwgbVcgLSBtQ3VyUmlnaHQsIG1IIC0gbUN1ckJvdHRvbSk7CkBAIC0xMjc3LDEwICsxMzIwLDE3IEBACiAgICAgICAgICAgICBpZiAobVN0YXR1c0Jhci5pc1Zpc2libGVMdygpKSB7CiAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHN0YXR1cyBiYXIgaXMgaGlkZGVuLCB3ZSBkb24ndCB3YW50IHRvIGNhdXNlCiAgICAgICAgICAgICAgICAgLy8gd2luZG93cyBiZWhpbmQgaXQgdG8gc2Nyb2xsLgotICAgICAgICAgICAgICAgIG1Eb2NrVG9wID0gbUNvbnRlbnRUb3AgPSBtQ3VyVG9wID0gbVN0YXR1c0Jhci5nZXRGcmFtZUx3KCkuYm90dG9tOwotICAgICAgICAgICAgICAgIGlmIChERUJVR19MQVlPVVQpIExvZy52KFRBRywgIlN0YXR1cyBiYXI6IG1Eb2NrQm90dG9tPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbURvY2tCb3R0b20gKyAiIG1Db250ZW50Qm90dG9tPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbUNvbnRlbnRCb3R0b20gKyAiIG1DdXJCb3R0b209IiArIG1DdXJCb3R0b20pOworICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgciA9IG1TdGF0dXNCYXIuZ2V0RnJhbWVMdygpOworICAgICAgICAgICAgICAgIGlmIChtRG9ja1RvcCA9PSByLnRvcCkgbURvY2tUb3AgPSByLmJvdHRvbTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtRG9ja0JvdHRvbSA9PSByLmJvdHRvbSkgbURvY2tCb3R0b20gPSByLnRvcDsKKyAgICAgICAgICAgICAgICBtQ29udGVudFRvcCA9IG1DdXJUb3AgPSBtRG9ja1RvcDsKKyAgICAgICAgICAgICAgICBtQ29udGVudEJvdHRvbSA9IG1DdXJCb3R0b20gPSBtRG9ja0JvdHRvbTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUdfTEFZT1VUKSBMb2cudihUQUcsICJTdGF0dXMgYmFyOiBtRG9ja1RvcD0iICsgbURvY2tUb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtQ29udGVudFRvcD0iICsgbUNvbnRlbnRUb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtQ3VyVG9wPSIgKyBtQ3VyVG9wCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbURvY2tCb3R0b209IiArIG1Eb2NrQm90dG9tCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbUNvbnRlbnRCb3R0b209IiArIG1Db250ZW50Qm90dG9tCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbUN1ckJvdHRvbT0iICsgbUN1ckJvdHRvbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xMzY1LDcgKzE0MTUsNyBAQAogICAgICAgICAgICAgYXR0cnMuZ3Jhdml0eSA9IEdyYXZpdHkuQk9UVE9NOwogICAgICAgICAgICAgbURvY2tMYXllciA9IHdpbi5nZXRTdXJmYWNlTGF5ZXIoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICgoZmwgJgorICAgICAgICAgICAgaWYgKG1TdGF0dXNCYXJDYW5IaWRlICYmIChmbCAmCiAgICAgICAgICAgICAgICAgICAgIChGTEFHX0xBWU9VVF9JTl9TQ1JFRU4gfCBGTEFHX0ZVTExTQ1JFRU4gfCBGTEFHX0xBWU9VVF9JTlNFVF9ERUNPUikpCiAgICAgICAgICAgICAgICAgICAgID09IChGTEFHX0xBWU9VVF9JTl9TQ1JFRU4gfCBGTEFHX0xBWU9VVF9JTlNFVF9ERUNPUikpIHsKICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBjYXNlIGZvciBhIG5vcm1hbCBhY3Rpdml0eSB3aW5kb3c6IHdlIHdhbnQgaXQKQEAgLTEzOTcsNyArMTQ0Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIHZmLnJpZ2h0ID0gbUN1clJpZ2h0OwogICAgICAgICAgICAgICAgICAgICB2Zi5ib3R0b20gPSBtQ3VyQm90dG9tOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsICYgRkxBR19MQVlPVVRfSU5fU0NSRUVOKSAhPSAwKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0dXNCYXJDYW5IaWRlICYmIChmbCAmIEZMQUdfTEFZT1VUX0lOX1NDUkVFTikgIT0gMCkgewogICAgICAgICAgICAgICAgIC8vIEEgd2luZG93IHRoYXQgaGFzIHJlcXVlc3RlZCB0byBmaWxsIHRoZSBlbnRpcmUgc2NyZWVuIGp1c3QKICAgICAgICAgICAgICAgICAvLyBnZXRzIGV2ZXJ5dGhpbmcsIHBlcmlvZC4KICAgICAgICAgICAgICAgICBwZi5sZWZ0ID0gZGYubGVmdCA9IGNmLmxlZnQgPSAwOwpAQCAtMTUyNiw4ICsxNTc2LDggQEAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyBpbnQgZmluaXNoQW5pbWF0aW9uTHcoKSB7CiAgICAgICAgIGludCBjaGFuZ2VzID0gMDsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gaGlkaW5nID0gZmFsc2U7CisKKyAgICAgICAgYm9vbGVhbiB0b3BJc0Z1bGxzY3JlZW4gPSBmYWxzZTsKICAgICAgICAgaWYgKG1TdGF0dXNCYXIgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKGxvY2FsTE9HVikgTG9nLmkoVEFHLCAiZm9yY2U9IiArIG1Gb3JjZVN0YXR1c0JhcgogICAgICAgICAgICAgICAgICAgICArICIgdG9wPSIgKyBtVG9wRnVsbHNjcmVlbk9wYXF1ZVdpbmRvd1N0YXRlKTsKQEAgLTE1MzUsMTcgKzE1ODUsMjUgQEAKICAgICAgICAgICAgICAgICBpZiAoREVCVUdfTEFZT1VUKSBMb2cudihUQUcsICJTaG93aW5nIHN0YXR1cyBiYXIiKTsKICAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0Jhci5zaG93THcodHJ1ZSkpIGNoYW5nZXMgfD0gRklOSVNIX0xBWU9VVF9SRURPX0xBWU9VVDsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRvcEZ1bGxzY3JlZW5PcGFxdWVXaW5kb3dTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy9Mb2cuaShUQUcsICJmcmFtZTogIiArIG1Ub3BGdWxsc2NyZWVuT3BhcXVlV2luZG93U3RhdGUuZ2V0RnJhbWVMdygpCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICsgIiBzaG93biBmcmFtZTogIiArIG1Ub3BGdWxsc2NyZWVuT3BhcXVlV2luZG93U3RhdGUuZ2V0U2hvd25GcmFtZUx3KCkpOwotICAgICAgICAgICAgICAgIC8vTG9nLmkoVEFHLCAiYXR0cjogIiArIG1Ub3BGdWxsc2NyZWVuT3BhcXVlV2luZG93U3RhdGUuZ2V0QXR0cnMoKSk7Ci0gICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHAgPQotICAgICAgICAgICAgICAgICAgICBtVG9wRnVsbHNjcmVlbk9wYXF1ZVdpbmRvd1N0YXRlLmdldEF0dHJzKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBoaWRlU3RhdHVzQmFyID0KLSAgICAgICAgICAgICAgICAgICAgKGxwLmZsYWdzICYgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19GVUxMU0NSRUVOKSAhPSAwOwotICAgICAgICAgICAgICAgIGlmIChoaWRlU3RhdHVzQmFyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19MQVlPVVQpIExvZy52KFRBRywgIkhpZGluZyBzdGF0dXMgYmFyIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzQmFyLmhpZGVMdyh0cnVlKSkgY2hhbmdlcyB8PSBGSU5JU0hfTEFZT1VUX1JFRE9fTEFZT1VUOwotICAgICAgICAgICAgICAgICAgICBoaWRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwID0gbVRvcEZ1bGxzY3JlZW5PcGFxdWVXaW5kb3dTdGF0ZS5nZXRBdHRycygpOworICAgICAgICAgICAgICAgIGlmIChsb2NhbExPR1YpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZnJhbWU6ICIgKyBtVG9wRnVsbHNjcmVlbk9wYXF1ZVdpbmRvd1N0YXRlLmdldEZyYW1lTHcoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzaG93biBmcmFtZTogIiArIG1Ub3BGdWxsc2NyZWVuT3BhcXVlV2luZG93U3RhdGUuZ2V0U2hvd25GcmFtZUx3KCkpOworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhdHRyOiAiICsgbVRvcEZ1bGxzY3JlZW5PcGFxdWVXaW5kb3dTdGF0ZS5nZXRBdHRycygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGxwLmZsYWdzPTB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobHAuZmxhZ3MpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG9wSXNGdWxsc2NyZWVuID0gKGxwLmZsYWdzICYgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19GVUxMU0NSRUVOKSAhPSAwOworICAgICAgICAgICAgICAgIC8vIFRoZSBzdWJ0bGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB3aW5kb3cgZm9yIG1Ub3BGdWxsc2NyZWVuT3BhcXVlV2luZG93U3RhdGUKKyAgICAgICAgICAgICAgICAvLyBhbmQgbVRvcElzRnVsbHNjcmVlbiBpcyB0aGF0IHRoYXQgbVRvcElzRnVsbHNjcmVlbiBpcyBzZXQgb25seSBpZiB0aGUgd2luZG93CisgICAgICAgICAgICAgICAgLy8gaGFzIHRoZSBGTEFHX0ZVTExTQ1JFRU4gc2V0LiAgTm90IHN1cmUgaWYgdGhlcmUgaXMgYW5vdGhlciB3YXkgdGhhdCB0byBiZSB0aGUKKyAgICAgICAgICAgICAgICAvLyBjYXNlIHRob3VnaC4KKyAgICAgICAgICAgICAgICBpZiAodG9wSXNGdWxsc2NyZWVuKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzQmFyQ2FuSGlkZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0xBWU9VVCkgTG9nLnYoVEFHLCAiSGlkaW5nIHN0YXR1cyBiYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzQmFyLmhpZGVMdyh0cnVlKSkgY2hhbmdlcyB8PSBGSU5JU0hfTEFZT1VUX1JFRE9fTEFZT1VUOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTE9HVikgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiUHJldmVudGluZyBzdGF0dXMgYmFyIGZyb20gaGlkaW5nIGJ5IHBvbGljeSIpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0xBWU9VVCkgTG9nLnYoVEFHLCAiU2hvd2luZyBzdGF0dXMgYmFyIik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzQmFyLnNob3dMdyh0cnVlKSkgY2hhbmdlcyB8PSBGSU5JU0hfTEFZT1VUX1JFRE9fTEFZT1VUOwpAQCAtMTU1MywyMSArMTYxMSwzNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIAotICAgICAgICBpZiAoY2hhbmdlcyAhPSAwICYmIGhpZGluZykgewotICAgICAgICAgICAgSVN0YXR1c0JhclNlcnZpY2Ugc2JzID0gSVN0YXR1c0JhclNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZShTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKCJzdGF0dXNiYXIiKSk7Ci0gICAgICAgICAgICBpZiAoc2JzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHdpbmRvdyBzaGFkZSBpcyBoaWRkZW4uCi0gICAgICAgICAgICAgICAgICAgIHNicy5jb2xsYXBzZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICBpZiAodG9wSXNGdWxsc2NyZWVuICE9IG1Ub3BJc0Z1bGxzY3JlZW4pIHsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdG9wSXNGdWxsc2NyZWVuRiA9IHRvcElzRnVsbHNjcmVlbjsKKyAgICAgICAgICAgIG1Ub3BJc0Z1bGxzY3JlZW4gPSB0b3BJc0Z1bGxzY3JlZW47CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXNCYXJTZXJ2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBvbmUgdGhhdCBjYW4gbm90IGdvIGF3YXksIGJ1dCBpdCBkb2Vzbid0IGNvbWUgdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHdpbmRvdyBtYW5hZ2VyIGRvZXMsIHNvIGRvbid0IGZhaWwgaWYgaXQgZG9lc24ndAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0LiBUaGlzIHdvcmtzIGFzIGxvbmcgYXMgbm8gZnVsbHNjcmVlbiB3aW5kb3dzIGNvbWUgdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHN0YXR1cyBiYXIgc2VydmljZSBkb2VzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJTZXJ2aWNlID0gSVN0YXR1c0JhclNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoInN0YXR1c2JhciIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElTdGF0dXNCYXJTZXJ2aWNlIHNicyA9IG1TdGF0dXNCYXJTZXJ2aWNlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXNCYXJTZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnMuc2V0QWN0aXZlV2luZG93SXNGdWxsc2NyZWVuKHRvcElzRnVsbHNjcmVlbkYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIGltcG9zc2libGUgYmVjYXVzZSB3ZSdyZSBpbiB0aGUgc2FtZSBwcm9jZXNzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzQmFyU2VydmljZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBIaWRlIHRoZSBrZXkgZ3VhcmQgaWYgYSB2aXNpYmxlIHdpbmRvdyBleHBsaWNpdGx5IHNwZWNpZmllcyB0aGF0IGl0IHdhbnRzIHRvIGJlIGRpc3BsYXllZAogICAgICAgICAvLyB3aGVuIHRoZSBzY3JlZW4gaXMgbG9ja2VkCiAgICAgICAgIGlmIChtS2V5Z3VhcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvY2FsTE9HVikgTG9nLnYoVEFHLCAiZmluaXNoTGF5b3V0THc6Om1IaWRlS2V5Z3VhcmQ9IittSGlkZUxvY2tTY3JlZW4pOworICAgICAgICAgICAgaWYgKGxvY2FsTE9HVikgTG9nLnYoVEFHLCAiZmluaXNoQW5pbWF0aW9uTHc6Om1IaWRlS2V5Z3VhcmQ9IittSGlkZUxvY2tTY3JlZW4pOwogICAgICAgICAgICAgaWYgKG1EaXNtaXNzS2V5Z3VhcmQgJiYgIW1LZXlndWFyZE1lZGlhdG9yLmlzU2VjdXJlKCkpIHsKICAgICAgICAgICAgICAgICBpZiAobUtleWd1YXJkLmhpZGVMdyh0cnVlKSkgewogICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IEZJTklTSF9MQVlPVVRfUkVET19MQVlPVVQKZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvU3RhdHVzVmlldy5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9TdGF0dXNWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YwOGNmZAotLS0gL2Rldi9udWxsCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvU3RhdHVzVmlldy5qYXZhCkBAIC0wLDAgKzEsMjU1IEBACisvLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5pbXBsOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5VdGlsczsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitjbGFzcyBTdGF0dXNWaWV3IHsKKyAgICBwcml2YXRlIFN0cmluZyBtRGF0ZUZvcm1hdFN0cmluZzsKKworICAgIHByaXZhdGUgVGV4dFZpZXcgbUNhcnJpZXI7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtRGF0ZTsKKworICAgIC8vIGFyZSB3ZSBzaG93aW5nIGJhdHRlcnkgaW5mb3JtYXRpb24/CisgICAgcHJpdmF0ZSBib29sZWFuIG1TaG93aW5nQmF0dGVyeUluZm8gPSBmYWxzZTsKKworICAgIC8vIGxhc3Qga25vd24gcGx1Z2dlZCBpbiBzdGF0ZQorICAgIHByaXZhdGUgYm9vbGVhbiBtUGx1Z2dlZEluID0gZmFsc2U7CisKKyAgICAvLyBsYXN0IGtub3duIGJhdHRlcnkgbGV2ZWwKKyAgICBwcml2YXRlIGludCBtQmF0dGVyeUxldmVsID0gMTAwOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbU5leHRBbGFybSA9IG51bGw7CisKKyAgICBwcml2YXRlIFN0cmluZyBtSW5zdHJ1Y3Rpb25zID0gbnVsbDsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1TdGF0dXMxOworICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1czI7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtUHJvcGVydHlPZjsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzU3RhdHVzMjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhc0NhcnJpZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNEYXRlOworICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzUHJvcGVydHk7CisKKyAgICBwcml2YXRlIFZpZXcgbVZpZXc7CisKKyAgICBwcml2YXRlIFZpZXcgZmluZFZpZXdCeUlkKGludCBpZCkgeworICAgICAgICByZXR1cm4gbVZpZXcuZmluZFZpZXdCeUlkKGlkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIG1WaWV3LmdldENvbnRleHQoKTsKKyAgICB9CisKKyAgICB2b2lkIHNldEluc3RydWN0aW9ucyhTdHJpbmcgaW5zdHJ1Y3Rpb25zKSB7CisgICAgICAgIG1JbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvbnM7CisgICAgfQorCisgICAgdm9pZCBzZXRDYXJyaWVyVGV4dChDaGFyU2VxdWVuY2UgY2FycmllclRleHQpIHsKKyAgICAgICAgaWYgKG1DYXJyaWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DYXJyaWVyLnNldFRleHQoY2FycmllclRleHQpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBvblJlZnJlc2hCYXR0ZXJ5SW5mbyhib29sZWFuIHNob3dCYXR0ZXJ5SW5mbywgYm9vbGVhbiBwbHVnZ2VkSW4sIGludCBiYXR0ZXJ5TGV2ZWwpIHsKKyAgICAgICAgbVNob3dpbmdCYXR0ZXJ5SW5mbyA9IHNob3dCYXR0ZXJ5SW5mbzsKKyAgICAgICAgbVBsdWdnZWRJbiA9IHBsdWdnZWRJbjsKKyAgICAgICAgbUJhdHRlcnlMZXZlbCA9IGJhdHRlcnlMZXZlbDsKKyAgICAgICAgdXBkYXRlU3RhdHVzTGluZXMoKTsKKyAgICB9CisKKyAgICB2b2lkIG9uVGltZUNoYW5nZWQoKSB7CisgICAgICAgIHJlZnJlc2hUaW1lQW5kRGF0ZURpc3BsYXkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblJpbmdlck1vZGVDaGFuZ2VkKGludCBzdGF0ZSkgeworICAgIH0KKworICAgIHZvaWQgb25SZWZyZXNoQ2FycmllckluZm8oQ2hhclNlcXVlbmNlIHBsbW4sIENoYXJTZXF1ZW5jZSBzcG4pIHsKKyAgICAgICAgc2V0Q2FycmllclRleHQoTG9ja1NjcmVlbi5nZXRDYXJyaWVyU3RyaW5nKHBsbW4sIHNwbikpOworICAgIH0KKworICAgIHB1YmxpYyBTdGF0dXNWaWV3KFZpZXcgdmlldywgS2V5Z3VhcmRVcGRhdGVNb25pdG9yIHVwZGF0ZU1vbml0b3IsCisgICAgICAgICAgICAgICAgICBMb2NrUGF0dGVyblV0aWxzIGxvY2tQYXR0ZXJuVXRpbHMpIHsKKyAgICAgICAgbVZpZXcgPSB2aWV3OworICAgICAgICBtQ2FycmllciA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuY2Fycmllcik7CisgICAgICAgIG1IYXNDYXJyaWVyID0gKG1DYXJyaWVyICE9IG51bGwpOworICAgICAgICBtRGF0ZSA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuZGF0ZSk7CisgICAgICAgIG1IYXNEYXRlID0gKG1EYXRlICE9IG51bGwpOworICAgICAgICBtRGF0ZUZvcm1hdFN0cmluZyA9IGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcuZnVsbF93ZGF5X21vbnRoX2RheV9ub195ZWFyKTsKKworICAgICAgICByZWZyZXNoVGltZUFuZERhdGVEaXNwbGF5KCk7CisKKyAgICAgICAgbVN0YXR1czEgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN0YXR1czEpOworICAgICAgICBtU3RhdHVzMiA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzMik7CisgICAgICAgIG1IYXNTdGF0dXMyID0gKG1TdGF0dXMyICE9IG51bGwpOworICAgICAgICBtUHJvcGVydHlPZiA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQucHJvcGVydHlPZik7CisgICAgICAgIG1IYXNQcm9wZXJ0eSA9IChtUHJvcGVydHlPZiAhPSBudWxsKTsKKworICAgICAgICByZXNldFN0YXR1c0luZm8odXBkYXRlTW9uaXRvciwgbG9ja1BhdHRlcm5VdGlscyk7CisKKyAgICAgICAgLy8gUmVxdWlyZWQgdG8gZ2V0IE1hcnF1ZWUgdG8gd29yay4KKyAgICAgICAgaWYgKG1IYXNDYXJyaWVyKSB7CisgICAgICAgICAgICBtQ2Fycmllci5zZXRTZWxlY3RlZCh0cnVlKTsKKyAgICAgICAgICAgIG1DYXJyaWVyLnNldFRleHRDb2xvcigweGZmZmZmZmZmKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgdm9pZCByZXNldFN0YXR1c0luZm8oS2V5Z3VhcmRVcGRhdGVNb25pdG9yIHVwZGF0ZU1vbml0b3IsIExvY2tQYXR0ZXJuVXRpbHMgbG9ja1BhdHRlcm5VdGlscykgeworICAgICAgICBtSW5zdHJ1Y3Rpb25zID0gbnVsbDsKKyAgICAgICAgbVNob3dpbmdCYXR0ZXJ5SW5mbyA9IHVwZGF0ZU1vbml0b3Iuc2hvdWxkU2hvd0JhdHRlcnlJbmZvKCk7CisgICAgICAgIG1QbHVnZ2VkSW4gPSB1cGRhdGVNb25pdG9yLmlzRGV2aWNlUGx1Z2dlZEluKCk7CisgICAgICAgIG1CYXR0ZXJ5TGV2ZWwgPSB1cGRhdGVNb25pdG9yLmdldEJhdHRlcnlMZXZlbCgpOworICAgICAgICBtTmV4dEFsYXJtID0gbG9ja1BhdHRlcm5VdGlscy5nZXROZXh0QWxhcm0oKTsKKyAgICAgICAgdXBkYXRlU3RhdHVzTGluZXMoKTsKKyAgICB9CisKKyAgICB2b2lkIHNldEluc3RydWN0aW9uVGV4dChpbnQgc3RyaW5nSWQpIHsKKyAgICAgICAgbVN0YXR1czEuc2V0VGV4dChzdHJpbmdJZCk7CisgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9sb2NrLCAwLCAwLCAwKTsKKyAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgIH0KKworICAgIHZvaWQgc2V0SW5zdHJ1Y3Rpb25UZXh0KFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgbVN0YXR1czEuc2V0VGV4dChzdHJpbmcpOworICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfbG9jaywgMCwgMCwgMCk7CisgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICB9CisKKyAgICB2b2lkIHNldENhcnJpZXJUZXh0KGludCBzdHJpbmdJZCkgeworICAgICAgICBtQ2Fycmllci5zZXRUZXh0KHN0cmluZ0lkKTsKKyAgICB9CisgICAgdm9pZCBzZXRDYXJyaWVyVGV4dChTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIG1DYXJyaWVyLnNldFRleHQoc3RyaW5nKTsKKyAgICB9CisKKyAgICAvKiogT3JpZ2luYXRlZCBmcm9tIFBhdHRlcm5VbmxvY2tTY3JlZW4gKiovCisgICAgdm9pZCB1cGRhdGVTdGF0dXNMaW5lcygpIHsKKyAgICAgICAgaWYgKG1IYXNQcm9wZXJ0eSkgeworICAgICAgICAgICAgLy8gVE9ETyBHZXQgYWN0dWFsIG5hbWUgJiBlbWFpbAorICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAiSm9obiBTbWl0aCI7CisgICAgICAgICAgICBTdHJpbmcgZW1haWwgPSAianNtaXRoQGdtYWlsLmNvbSI7CisgICAgICAgICAgICBtUHJvcGVydHlPZi5zZXRUZXh0KCJQcm9wZXJ0eSBvZjpcbiIgKyBuYW1lICsgIlxuIiArIGVtYWlsKTsKKyAgICAgICAgICAgIG1Qcm9wZXJ0eU9mLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUhhc1N0YXR1czIpIHJldHVybjsKKworICAgICAgICBpZiAobUluc3RydWN0aW9ucyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBpbnN0cnVjdGlvbnMgb25seQorICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChtSW5zdHJ1Y3Rpb25zKTsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShtSW5zdHJ1Y3Rpb25zKSkgeworICAgICAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcygwLCAwLCAwLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKAorICAgICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfbG9jaywgMCwgMCwgMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICB9IGVsc2UgaWYgKG1TaG93aW5nQmF0dGVyeUluZm8gJiYgbU5leHRBbGFybSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBiYXR0ZXJ5IG9ubHkKKyAgICAgICAgICAgIGlmIChtUGx1Z2dlZEluKSB7CisgICAgICAgICAgICAgIGlmIChtQmF0dGVyeUxldmVsID49IDEwMCkgeworICAgICAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQoZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5sb2Nrc2NyZWVuX2NoYXJnZWQpKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQoZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5sb2Nrc2NyZWVuX3BsdWdnZWRfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1CYXR0ZXJ5TGV2ZWwpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9sb3dfYmF0dGVyeSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2NoYXJnaW5nLCAwLAorICAgICAgICAgICAgICAgICAgICAwLCAwKTsKKworICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisKKyAgICAgICAgfSBlbHNlIGlmIChtTmV4dEFsYXJtICE9IG51bGwgJiYgIW1TaG93aW5nQmF0dGVyeUluZm8pIHsKKyAgICAgICAgICAgIC8vIGFsYXJtIG9ubHkKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQobU5leHRBbGFybSk7CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfYWxhcm0sIDAsCisgICAgICAgICAgICAgICAgICAgIDAsIDApOworCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgfSBlbHNlIGlmIChtTmV4dEFsYXJtICE9IG51bGwgJiYgbVNob3dpbmdCYXR0ZXJ5SW5mbykgeworICAgICAgICAgICAgLy8gYm90aCBiYXR0ZXJ5IGFuZCBuZXh0IGFsYXJtCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1OZXh0QWxhcm0pOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VGV4dChnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5sb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQsCisgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKDEwMCwgbUJhdHRlcnlMZXZlbCkpKTsKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9hbGFybSwgMCwKKyAgICAgICAgICAgICAgICAgICAgMCwgMCk7CisgICAgICAgICAgICBpZiAobVBsdWdnZWRJbikgeworICAgICAgICAgICAgICAgIG1TdGF0dXMyLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9jaGFyZ2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU3RhdHVzMi5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoMCwgMCwgMCwgMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgc3BlY2lmaWMgdG8gc2hvdzsgc2hvdyBnZW5lcmFsIGluc3RydWN0aW9ucworICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX3BhdHRlcm5faW5zdHJ1Y3Rpb25zKTsKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9sb2NrLCAwLAorICAgICAgICAgICAgICAgICAgICAwLCAwKTsKKworICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogT3JpZ2luYXRlZCBmcm9tIExvY2tTY3JlZW4gKiovCisgICAgLy8gVE9ETyBNZXJnZSB3aXRoIGZ1bmN0aW9uIGFib3ZlCisgICAgdm9pZCB1cGRhdGVTdGF0dXNMaW5lcyhib29sZWFuIHNob3dTdGF0dXNMaW5lcywgU3RyaW5nIGNoYXJnaW5nLCBEcmF3YWJsZSBjaGFyZ2luZ0ljb24sCisgICAgICAgICAgICBEcmF3YWJsZSBhbGFybUljb24pIHsKKyAgICAgICAgaWYgKCFzaG93U3RhdHVzTGluZXMgfHwgKGNoYXJnaW5nID09IG51bGwgJiYgbU5leHRBbGFybSA9PSBudWxsKSkgeworICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaGFyZ2luZyAhPSBudWxsICYmIG1OZXh0QWxhcm0gPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gY2hhcmdpbmcgb25seQorICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQoY2hhcmdpbmcpOworICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKGNoYXJnaW5nSWNvbiwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0gZWxzZSBpZiAobU5leHRBbGFybSAhPSBudWxsICYmIGNoYXJnaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIG5leHQgYWxhcm0gb25seQorICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQobU5leHRBbGFybSk7CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoYWxhcm1JY29uLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaGFyZ2luZyAhPSBudWxsICYmIG1OZXh0QWxhcm0gIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gYm90aCBjaGFyZ2luZyBhbmQgbmV4dCBhbGFybQorICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KGNoYXJnaW5nKTsKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhjaGFyZ2luZ0ljb24sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VGV4dChtTmV4dEFsYXJtKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhhbGFybUljb24sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCByZWZyZXNoVGltZUFuZERhdGVEaXNwbGF5KCkgeworICAgICAgICBpZiAobUhhc0RhdGUpIHsKKyAgICAgICAgICAgIG1EYXRlLnNldFRleHQoRGF0ZUZvcm1hdC5mb3JtYXQobURhdGVGb3JtYXRTdHJpbmcsIG5ldyBEYXRlKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvcHJlbG9hZGVkLWNsYXNzZXMgYi9wcmVsb2FkZWQtY2xhc3NlcwppbmRleCAxZDVmYmMwOC4uMzMxNzI4NiAxMDA2NDQKLS0tIGEvcHJlbG9hZGVkLWNsYXNzZXMKKysrIGIvcHJlbG9hZGVkLWNsYXNzZXMKQEAgLTEzOCw3ICsxMzgsNiBAQAogYW5kcm9pZC5kYXRhYmFzZS5NYXRyaXhDdXJzb3IKIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNsb3NhYmxlCiBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDb21waWxlZFNxbAotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ29udGVudEhlbHBlcgogYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ3Vyc29yCiBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZQogYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGVidWcKQEAgLTU2Myw4ICs1NjIsNiBAQAogYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcKIGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcgogYW5kcm9pZC53aWRnZXQuQXV0b0NvbXBsZXRlVGV4dFZpZXcKLWFuZHJvaWQud2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3JERyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIKLWFuZHJvaWQud2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3JERyb3BEb3duTGlzdFZpZXcKIGFuZHJvaWQud2lkZ2V0LkJhc2VBZGFwdGVyCiBhbmRyb2lkLndpZGdldC5CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyCiBhbmRyb2lkLndpZGdldC5DaGVja0JveApAQCAtNTgyLDYgKzU3OSw3IEBACiBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcKIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldyRTY2FsZVR5cGUKIGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dAorYW5kcm9pZC53aWRnZXQuTGlzdFBvcHVwV2luZG93CiBhbmRyb2lkLndpZGdldC5MaXN0VmlldwogYW5kcm9pZC53aWRnZXQuTGlzdFZpZXckU2F2ZWRTdGF0ZQogYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sbGVyCkBAIC02ODUsNyArNjgzLDYgQEAKIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcgogY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVJdGVtSW1wbAogY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LlN1Yk1lbnVCdWlsZGVyCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQ29udGFjdEhlYWRlcldpZGdldAogY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkRpYWxvZ1RpdGxlCiBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuRWRpdGFibGVJbnB1dENvbm5lY3Rpb24KIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5MaW5lYXJMYXlvdXRXaXRoRGVmYXVsdFRvdWNoUmVjZXBpZW50CkBAIC03MjcsNyArNzI0LDYgQEAKIGphdmEuaW8uRmlsZQogamF2YS5pby5GaWxlRGVzY3JpcHRvcgogamF2YS5pby5GaWxlSW5wdXRTdHJlYW0KLWphdmEuaW8uRmlsZUlucHV0U3RyZWFtJFJlcG9zaXRpb25pbmdMb2NrCiBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbgogamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtCiBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtCkBAIC0xMTMxLDcgKzExMjcsNiBAQAogb3JnLmFwYWNoZS5oYXJtb255Lm5pby5GaWxlQ2hhbm5lbEZhY3RvcnkKIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuRGlyZWN0QnVmZmVyCiBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkZpbGVDaGFubmVsSW1wbAotb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5GaWxlQ2hhbm5lbEltcGwkUmVwb3NpdGlvbmluZ0xvY2sKIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuRmlsZUxvY2tJbXBsCiBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkxvY2tNYW5hZ2VyCiBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkxvY2tNYW5hZ2VyJDEKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeU1hbmFnZXJCYXNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeU1hbmFnZXJCYXNlLmNwcAppbmRleCA0MjVjYTMxLi42NWQ5ZWY3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5TWFuYWdlckJhc2UuY3BwCkBAIC0xMDE3LDggKzEwMTcsOCBAQAogI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCiAgICAgVGhyZWFkKGZhbHNlKSwKICNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCi0gICAgbVBob25lU3RhdGUoQXVkaW9TeXN0ZW06Ok1PREVfTk9STUFMKSwgbVJpbmdlck1vZGUoMCksIG1NdXNpY1N0b3BUaW1lKDApLAotICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lKGZhbHNlKSwgbVRvdGFsRWZmZWN0c0NwdUxvYWQoMCksIG1Ub3RhbEVmZmVjdHNNZW1vcnkoMCkKKyAgICBtUGhvbmVTdGF0ZShBdWRpb1N5c3RlbTo6TU9ERV9OT1JNQUwpLCBtUmluZ2VyTW9kZSgwKSwgbU11c2ljU3RvcFRpbWUoMCksIG1MaW1pdFJpbmd0b25lVm9sdW1lKGZhbHNlKSwKKyAgICBtTGFzdFZvaWNlVm9sdW1lKC0xLjBmKSwgbVRvdGFsRWZmZWN0c0NwdUxvYWQoMCksIG1Ub3RhbEVmZmVjdHNNZW1vcnkoMCkKIHsKICAgICBtcENsaWVudEludGVyZmFjZSA9IGNsaWVudEludGVyZmFjZTsKIApAQCAtMTgzNSwyOSArMTgzNSwzOCBAQAogICAgIH0KIAogICAgIGZsb2F0IHZvbHVtZSA9IGNvbXB1dGVWb2x1bWUoc3RyZWFtLCBpbmRleCwgb3V0cHV0LCBkZXZpY2UpOwotICAgIC8vIGRvIG5vdCBzZXQgdm9sdW1lIGlmIHRoZSBmbG9hdCB2YWx1ZSBkaWQgbm90IGNoYW5nZQotICAgIGlmICh2b2x1bWUgIT0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bUN1clZvbHVtZVtzdHJlYW1dIHx8IGZvcmNlKSB7CisgICAgLy8gV2UgYWN0dWFsbHkgY2hhbmdlIHRoZSB2b2x1bWUgaWY6CisgICAgLy8gLSB0aGUgZmxvYXQgdmFsdWUgcmV0dXJuZWQgYnkgY29tcHV0ZVZvbHVtZSgpIGNoYW5nZWQKKyAgICAvLyAtIHRoZSBmb3JjZSBmbGFnIGlzIHNldAorICAgIGlmICh2b2x1bWUgIT0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bUN1clZvbHVtZVtzdHJlYW1dIHx8CisgICAgICAgICAgICBmb3JjZSkgewogICAgICAgICBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tQ3VyVm9sdW1lW3N0cmVhbV0gPSB2b2x1bWU7CiAgICAgICAgIExPR1YoInNldFN0cmVhbVZvbHVtZSgpIGZvciBvdXRwdXQgJWQgc3RyZWFtICVkLCB2b2x1bWUgJWYsIGRlbGF5ICVkIiwgb3V0cHV0LCBzdHJlYW0sIHZvbHVtZSwgZGVsYXlNcyk7CiAgICAgICAgIGlmIChzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OlZPSUNFX0NBTEwgfHwKICAgICAgICAgICAgIHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6RFRNRiB8fAogICAgICAgICAgICAgc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpCTFVFVE9PVEhfU0NPKSB7Ci0gICAgICAgICAgICBmbG9hdCB2b2ljZVZvbHVtZSA9IC0xLjA7CiAgICAgICAgICAgICAvLyBvZmZzZXQgdmFsdWUgdG8gcmVmbGVjdCBhY3R1YWwgaGFyZHdhcmUgdm9sdW1lIHRoYXQgbmV2ZXIgcmVhY2hlcyAwCiAgICAgICAgICAgICAvLyAxJSBjb3JyZXNwb25kcyByb3VnaGx5IHRvIGZpcnN0IHN0ZXAgaW4gVk9JQ0VfQ0FMTCBzdHJlYW0gdm9sdW1lIHNldHRpbmcgKHNlZSBBdWRpb1NlcnZpY2UuamF2YSkKICAgICAgICAgICAgIHZvbHVtZSA9IDAuMDEgKyAwLjk5ICogdm9sdW1lOwotICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6Vk9JQ0VfQ0FMTCkgewotICAgICAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gKGZsb2F0KWluZGV4LyhmbG9hdCltU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1heDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpCTFVFVE9PVEhfU0NPKSB7Ci0gICAgICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAxLjA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodm9pY2VWb2x1bWUgPj0gMCAmJiBvdXRwdXQgPT0gbUhhcmR3YXJlT3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFZvaWNlVm9sdW1lKHZvaWNlVm9sdW1lLCBkZWxheU1zKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpc3RyZWFtLCB2b2x1bWUsIG91dHB1dCwgZGVsYXlNcyk7CiAgICAgfQogCisgICAgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6Vk9JQ0VfQ0FMTCB8fAorICAgICAgICBzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OkJMVUVUT09USF9TQ08pIHsKKyAgICAgICAgZmxvYXQgdm9pY2VWb2x1bWU7CisgICAgICAgIC8vIEZvcmNlIHZvaWNlIHZvbHVtZSB0byBtYXggZm9yIGJsdWV0b290aCBTQ08gYXMgdm9sdW1lIGlzIG1hbmFnZWQgYnkgdGhlIGhlYWRzZXQKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6Vk9JQ0VfQ0FMTCkgeworICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAoZmxvYXQpaW5kZXgvKGZsb2F0KW1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAxLjA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZvaWNlVm9sdW1lICE9IG1MYXN0Vm9pY2VWb2x1bWUgJiYgb3V0cHV0ID09IG1IYXJkd2FyZU91dHB1dCkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFZvaWNlVm9sdW1lKHZvaWNlVm9sdW1lLCBkZWxheU1zKTsKKyAgICAgICAgICAgIG1MYXN0Vm9pY2VWb2x1bWUgPSB2b2ljZVZvbHVtZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5jcHAKaW5kZXggYjNlMGVlNi4uMDdiNWEzNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZVN0dWIuY3BwCkBAIC0xMDEsOSArMTAxLDkgQEAKICAgICBtRmFrZUNhbWVyYSA9IDA7IC8vIHBhcmFub2lhCiB9CiAKLXNwPElNZW1vcnlIZWFwPiBDYW1lcmFIYXJkd2FyZVN0dWI6OmdldFByZXZpZXdIZWFwKCkgY29uc3QKK3N0YXR1c190IENhbWVyYUhhcmR3YXJlU3R1Yjo6c2V0UHJldmlld1dpbmRvdyhjb25zdCBzcDxBTmF0aXZlV2luZG93PiYgYnVmKQogewotICAgIHJldHVybiBtUHJldmlld0hlYXA7CisgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzcDxJTWVtb3J5SGVhcD4gQ2FtZXJhSGFyZHdhcmVTdHViOjpnZXRSYXdIZWFwKCkgY29uc3QKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmgKaW5kZXggZDM0MjdiYS4uOWI2NmE3NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmgKQEAgLTI5LDcgKzI5LDcgQEAKIAogY2xhc3MgQ2FtZXJhSGFyZHdhcmVTdHViIDogcHVibGljIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlIHsKIHB1YmxpYzoKLSAgICB2aXJ0dWFsIHNwPElNZW1vcnlIZWFwPiBnZXRQcmV2aWV3SGVhcCgpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJldmlld1dpbmRvdyhjb25zdCBzcDxBTmF0aXZlV2luZG93PiYgYnVmKTsKICAgICB2aXJ0dWFsIHNwPElNZW1vcnlIZWFwPiBnZXRSYXdIZWFwKCkgY29uc3Q7CiAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHNldENhbGxiYWNrcyhub3RpZnlfY2FsbGJhY2sgbm90aWZ5X2NiLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAppbmRleCA1ODIwOWZkLi44MDhjNjc5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CkBAIC0zMjAsNiArMzIxLDcgQEAKICAgICBtUHJldmlld0NhbGxiYWNrRmxhZyA9IEZSQU1FX0NBTExCQUNLX0ZMQUdfTk9PUDsKICAgICBtT3JpZW50YXRpb24gPSAwOwogICAgIG1PcmllbnRhdGlvbkNoYW5nZWQgPSBmYWxzZTsKKyAgICBtUGxheVNodXR0ZXJTb3VuZCA9IHRydWU7CiAgICAgY2FtZXJhU2VydmljZS0+c2V0Q2FtZXJhQnVzeShjYW1lcmFJZCk7CiAgICAgY2FtZXJhU2VydmljZS0+bG9hZFNvdW5kKCk7CiAgICAgTE9HMSgiQ2xpZW50OjpDbGllbnQgWCAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwpAQCAtMzM3LDE4ICszMzksNiBAQAogICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoIkNsaWVudDo6fkNsaWVudCBFIChwaWQgJWQsIHRoaXMgJXApIiwgY2FsbGluZ1BpZCwgdGhpcyk7CiAKLSAgICBpZiAobVN1cmZhY2UgIT0gMCAmJiAhbVVzZU92ZXJsYXkpIHsKLSAgICAgICAgcHRocmVhZF90IHRocjsKLSAgICAgICAgLy8gV2UgdW5yZWdpc3RlciB0aGUgYnVmZmVycyBpbiBhIGRpZmZlcmVudCB0aHJlYWQgYmVjYXVzZSBiaW5kZXIgZG9lcwotICAgICAgICAvLyBub3QgbGV0IHVzIG1ha2Ugc3ljaHJvbm91cyB0cmFuc2FjdGlvbnMgaW4gYSBiaW5kZXIgZGVzdHJ1Y3RvciAodGhhdAotICAgICAgICAvLyBpcywgdXBvbiBvdXIgcmVhY2hpbmcgYSByZWZjb3VudCBvZiB6ZXJvLikKLSAgICAgICAgcHRocmVhZF9jcmVhdGUoJnRociwKLSAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgIC8vIGF0dHIKLSAgICAgICAgICAgICAgICAgICAgICAgdW5yZWdpc3Rlcl9zdXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZS5nZXQoKSk7Ci0gICAgICAgIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpOwotICAgIH0KLQogICAgIC8vIHNldCBtQ2xpZW50UGlkIHRvIGxldCBkaXNjb25uZXQoKSB0ZWFyIGRvd24gdGhlIGhhcmR3YXJlCiAgICAgbUNsaWVudFBpZCA9IGNhbGxpbmdQaWQ7CiAgICAgZGlzY29ubmVjdCgpOwpAQCAtNDY2LDYgKzQ1NiwxMSBAQAogICAgIGlmIChtVXNlT3ZlcmxheSkgewogICAgICAgICBtT3ZlcmxheVJlZiA9IDA7CiAgICAgfQorICAgIC8vIFJlbGVhc2UgdGhlIGhlbGQgQU5hdGl2ZVdpbmRvdyByZXNvdXJjZXMuCisgICAgaWYgKG1QcmV2aWV3V2luZG93ICE9IDApIHsKKyAgICAgICAgbVByZXZpZXdXaW5kb3cgPSAwOworICAgICAgICBtSGFyZHdhcmUtPnNldFByZXZpZXdXaW5kb3cobVByZXZpZXdXaW5kb3cpOworICAgIH0KICAgICBtSGFyZHdhcmUuY2xlYXIoKTsKIAogICAgIG1DYW1lcmFTZXJ2aWNlLT5yZW1vdmVDbGllbnQobUNhbWVyYUNsaWVudCk7CkBAIC00NzYsOCArNDcxLDggQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0vLyBzZXQgdGhlIElTdXJmYWNlIHRoYXQgdGhlIHByZXZpZXcgd2lsbCB1c2UKLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSB7CisvLyBzZXQgdGhlIFN1cmZhY2UgdGhhdCB0aGUgcHJldmlldyB3aWxsIHVzZQorc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgewogICAgIExPRzEoInNldFByZXZpZXdEaXNwbGF5KCVwKSAocGlkICVkKSIsIHN1cmZhY2UuZ2V0KCksIGdldENhbGxpbmdQaWQoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKQEAgLTQ4Nyw3ICs0ODIsNyBAQAogCiAgICAgLy8gcmV0dXJuIGlmIG5vIGNoYW5nZSBpbiBzdXJmYWNlLgogICAgIC8vIGFzQmluZGVyKCkgaXMgc2FmZSBvbiBOVUxMIChyZXR1cm5zIE5VTEwpCi0gICAgaWYgKHN1cmZhY2UtPmFzQmluZGVyKCkgPT0gbVN1cmZhY2UtPmFzQmluZGVyKCkpIHsKKyAgICBpZiAoZ2V0SVN1cmZhY2Uoc3VyZmFjZSktPmFzQmluZGVyKCkgPT0gbVN1cmZhY2UtPmFzQmluZGVyKCkpIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKQEAgLTQ5OCw0NCArNDkzLDI4IEBACiAgICAgICAgICAgICBzcDxPdmVybGF5PiBkdW1teTsKICAgICAgICAgICAgIG1IYXJkd2FyZS0+c2V0T3ZlcmxheShkdW1teSk7CiAgICAgICAgICAgICBtT3ZlcmxheVJlZiA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3VyZmFjZS0+dW5yZWdpc3RlckJ1ZmZlcnMoKTsKICAgICAgICAgfQogICAgIH0KLSAgICBtU3VyZmFjZSA9IHN1cmZhY2U7CisgICAgaWYgKHN1cmZhY2UgIT0gMCkgeworICAgICAgICBtU3VyZmFjZSA9IGdldElTdXJmYWNlKHN1cmZhY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TdXJmYWNlID0gMDsKKyAgICB9CisgICAgbVByZXZpZXdXaW5kb3cgPSBzdXJmYWNlOwogICAgIG1PdmVybGF5UmVmID0gMDsKICAgICAvLyBJZiBwcmV2aWV3IGhhcyBiZWVuIGFscmVhZHkgc3RhcnRlZCwgc2V0IG92ZXJsYXkgb3IgcmVnaXN0ZXIgcHJldmlldwogICAgIC8vIGJ1ZmZlcnMgbm93LgogICAgIGlmIChtSGFyZHdhcmUtPnByZXZpZXdFbmFibGVkKCkpIHsKICAgICAgICAgaWYgKG1Vc2VPdmVybGF5KSB7CiAgICAgICAgICAgICByZXN1bHQgPSBzZXRPdmVybGF5KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVN1cmZhY2UgIT0gMCkgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVnaXN0ZXJQcmV2aWV3QnVmZmVycygpOworICAgICAgICB9IGVsc2UgaWYgKG1QcmV2aWV3V2luZG93ICE9IDApIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG1IYXJkd2FyZS0+c2V0UHJldmlld1dpbmRvdyhtUHJldmlld1dpbmRvdyk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnJlZ2lzdGVyUHJldmlld0J1ZmZlcnMoKSB7Ci0gICAgaW50IHcsIGg7Ci0gICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMobUhhcmR3YXJlLT5nZXRQYXJhbWV0ZXJzKCkpOwotICAgIHBhcmFtcy5nZXRQcmV2aWV3U2l6ZSgmdywgJmgpOwotCi0gICAgLy8gRklYTUU6IGRvbid0IHVzZSBhIGhhcmRjb2RlZCBmb3JtYXQgaGVyZS4KLSAgICBJU3VyZmFjZTo6QnVmZmVySGVhcCBidWZmZXJzKHcsIGgsIHcsIGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PcmllbnRhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFyZHdhcmUtPmdldFByZXZpZXdIZWFwKCkpOwotCi0gICAgc3RhdHVzX3QgcmVzdWx0ID0gbVN1cmZhY2UtPnJlZ2lzdGVyQnVmZmVycyhidWZmZXJzKTsKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIExPR0UoInJlZ2lzdGVyQnVmZmVycyBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCByZXN1bHQpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnNldE92ZXJsYXkoKSB7CiAgICAgaW50IHcsIGg7CiAgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMobUhhcmR3YXJlLT5nZXRQYXJhbWV0ZXJzKCkpOwpAQCAtNTkzLDE2ICs1NzIsMTAgQEAKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47CiAKICAgICBtUHJldmlld0NhbGxiYWNrRmxhZyA9IGNhbGxiYWNrX2ZsYWc7Ci0KLSAgICAvLyBJZiB3ZSBkb24ndCB1c2Ugb3ZlcmxheSwgd2UgYWx3YXlzIG5lZWQgdGhlIHByZXZpZXcgZnJhbWUgZm9yIGRpc3BsYXkuCi0gICAgLy8gSWYgd2UgZG8gdXNlIG92ZXJsYXksIHdlIG9ubHkgbmVlZCB0aGUgcHJldmlldyBmcmFtZSBpZiB0aGUgdXNlcgotICAgIC8vIHdhbnRzIHRoZSBkYXRhLgotICAgIGlmIChtVXNlT3ZlcmxheSkgewotICAgICAgICBpZihtUHJldmlld0NhbGxiYWNrRmxhZyAmIEZSQU1FX0NBTExCQUNLX0ZMQUdfRU5BQkxFX01BU0spIHsKLSAgICAgICAgICAgIGVuYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7Ci0gICAgICAgIH0KKyAgICBpZiAobVByZXZpZXdDYWxsYmFja0ZsYWcgJiBGUkFNRV9DQUxMQkFDS19GTEFHX0VOQUJMRV9NQVNLKSB7CisgICAgICAgIGVuYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOwogICAgIH0KIH0KIApAQCAtNjI3LDE0ICs2MDAsMTQgQEAKIAogICAgIHN3aXRjaChtb2RlKSB7CiAgICAgICAgIGNhc2UgQ0FNRVJBX1BSRVZJRVdfTU9ERToKLSAgICAgICAgICAgIGlmIChtU3VyZmFjZSA9PSAwKSB7CisgICAgICAgICAgICBpZiAobVN1cmZhY2UgPT0gMCAmJiBtUHJldmlld1dpbmRvdyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgTE9HMSgibVN1cmZhY2UgaXMgbm90IHNldCB5ZXQuIik7CiAgICAgICAgICAgICAgICAgLy8gc3RpbGwgYWJsZSB0byBzdGFydCBwcmV2aWV3IGluIHRoaXMgY2FzZS4KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBzdGFydFByZXZpZXdNb2RlKCk7CiAgICAgICAgIGNhc2UgQ0FNRVJBX1JFQ09SRElOR19NT0RFOgotICAgICAgICAgICAgaWYgKG1TdXJmYWNlID09IDApIHsKLSAgICAgICAgICAgICAgICBMT0dFKCJtU3VyZmFjZSBtdXN0IGJlIHNldCBiZWZvcmUgc3RhcnRSZWNvcmRpbmdNb2RlLiIpOworICAgICAgICAgICAgaWYgKG1TdXJmYWNlID09IDAgJiYgbVByZXZpZXdXaW5kb3cgPT0gMCkgeworICAgICAgICAgICAgICAgIExPR0UoIm1TdXJmYWNlIG9yIG1QcmV2aWV3V2luZG93IG11c3QgYmUgc2V0IGJlZm9yZSBzdGFydFJlY29yZGluZ01vZGUuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHN0YXJ0UmVjb3JkaW5nTW9kZSgpOwpAQCAtNjYwLDE2ICs2MzMsOSBAQAogICAgICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OwogICAgICAgICByZXN1bHQgPSBtSGFyZHdhcmUtPnN0YXJ0UHJldmlldygpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGVuYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKKyAgICAgICAgLy8gWFhYOiBTZXQgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBBTmF0aXZlV2luZG93LgorICAgICAgICBtSGFyZHdhcmUtPnNldFByZXZpZXdXaW5kb3cobVByZXZpZXdXaW5kb3cpOwogICAgICAgICByZXN1bHQgPSBtSGFyZHdhcmUtPnN0YXJ0UHJldmlldygpOwotICAgICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OwotICAgICAgICAvLyBJZiBwcmV2aWV3IGRpc3BsYXkgaGFzIGJlZW4gc2V0LCByZWdpc3RlciBwcmV2aWV3IGJ1ZmZlcnMgbm93LgotICAgICAgICBpZiAobVN1cmZhY2UgIT0gMCkgewotICAgICAgICAgICAvLyBVbnJlZ2lzdGVyIGhlcmUgYmVjYXVzZSB0aGUgc3VyZmFjZSBtYXkgYmUgcHJldmlvdXNseSByZWdpc3RlcmVkCi0gICAgICAgICAgIC8vIHdpdGggdGhlIHJhdyAoc25hcHNob3QpIGhlYXAuCi0gICAgICAgICAgIG1TdXJmYWNlLT51bnJlZ2lzdGVyQnVmZmVycygpOwotICAgICAgICAgICByZXN1bHQgPSByZWdpc3RlclByZXZpZXdCdWZmZXJzKCk7Ci0gICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTcwNywxMyArNjczLDEwIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKIAorCiAgICAgZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKICAgICBtSGFyZHdhcmUtPnN0b3BQcmV2aWV3KCk7CiAKLSAgICBpZiAobVN1cmZhY2UgIT0gMCAmJiAhbVVzZU92ZXJsYXkpIHsKLSAgICAgICAgbVN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7Ci0gICAgfQotCiAgICAgbVByZXZpZXdCdWZmZXIuY2xlYXIoKTsKIH0KIApAQCAtODExLDYgKzc3NCwzNSBAQAogICAgIHJldHVybiBwYXJhbXM7CiB9CiAKKy8vIGVuYWJsZSBzaHV0dGVyIHNvdW5kCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmVuYWJsZVNodXR0ZXJTb3VuZChib29sIGVuYWJsZSkgeworICAgIExPRzEoImVuYWJsZVNodXR0ZXJTb3VuZCAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CisgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgcmV0dXJuIHJlc3VsdDsKKworICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgbVBsYXlTaHV0dGVyU291bmQgPSB0cnVlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gRGlzYWJsaW5nIHNodXR0ZXIgc291bmQgbWF5IG5vdCBiZSBhbGxvd2VkLiBJbiB0aGF0IGNhc2Ugb25seQorICAgIC8vIGFsbG93IHRoZSBtZWRpYXNlcnZlciBwcm9jZXNzIHRvIGRpc2FibGUgdGhlIHNvdW5kLgorICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBwcm9wZXJ0eV9nZXQoInJvLmNhbWVyYS5zb3VuZC5mb3JjZWQiLCB2YWx1ZSwgIjAiKTsKKyAgICBpZiAoc3RyY21wKHZhbHVlLCAiMCIpICE9IDApIHsKKyAgICAgICAgLy8gRGlzYWJsaW5nIHNodXR0ZXIgc291bmQgaXMgbm90IGFsbG93ZWQuIERlbnkgaWYgdGhlIGN1cnJlbnQKKyAgICAgICAgLy8gcHJvY2VzcyBpcyBub3QgbWVkaWFzZXJ2ZXIuCisgICAgICAgIGlmIChnZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCkpIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBkaXNhYmxlIHNodXR0ZXIgc291bmQuIFBlcm1pc3Npb24gZGVuaWVkIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1QbGF5U2h1dHRlclNvdW5kID0gZmFsc2U7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnNlbmRDb21tYW5kKGludDMyX3QgY21kLCBpbnQzMl90IGFyZzEsIGludDMyX3QgYXJnMikgewogICAgIExPRzEoInNlbmRDb21tYW5kIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKICAgICBpbnQgb3JpZW50YXRpb247CkBAIC04NDQsNiArODM2LDIwIEBACiAgICAgICAgICAgICBpZiAobU92ZXJsYXlSZWYgIT0gMCkgbU9yaWVudGF0aW9uQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZiAoY21kID09IENBTUVSQV9DTURfRU5BQkxFX1NIVVRURVJfU09VTkQpIHsKKyAgICAgICAgc3dpdGNoIChhcmcxKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgZW5hYmxlU2h1dHRlclNvdW5kKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBlbmFibGVTaHV0dGVyU291bmQodHJ1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZiAoY21kID09IENBTUVSQV9DTURfUExBWV9SRUNPUkRJTkdfU09VTkQpIHsKKyAgICAgICAgbUNhbWVyYVNlcnZpY2UtPnBsYXlTb3VuZChTT1VORF9SRUNPUkRJTkcpOwogICAgIH0KIAogICAgIHJldHVybiBtSGFyZHdhcmUtPnNlbmRDb21tYW5kKGNtZCwgYXJnMSwgYXJnMik7CkBAIC0xMDA0LDExICsxMDEwLDggQEAKIC8vICJzaXplIiBpcyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB5dXYgcGljdHVyZSBmb3IgcmVnaXN0ZXJCdWZmZXIuCiAvLyBJZiBpdCBpcyBOVUxMLCB1c2UgdGhlIHBpY3R1cmUgc2l6ZSBmcm9tIHBhcmFtZXRlcnMuCiB2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6aGFuZGxlU2h1dHRlcihpbWFnZV9yZWN0X3R5cGUgKnNpemUpIHsKLSAgICBtQ2FtZXJhU2VydmljZS0+cGxheVNvdW5kKFNPVU5EX1NIVVRURVIpOwotCi0gICAgLy8gU2NyZWVuIGdvZXMgYmxhY2sgYWZ0ZXIgdGhlIGJ1ZmZlciBpcyB1bnJlZ2lzdGVyZWQuCi0gICAgaWYgKG1TdXJmYWNlICE9IDAgJiYgIW1Vc2VPdmVybGF5KSB7Ci0gICAgICAgIG1TdXJmYWNlLT51bnJlZ2lzdGVyQnVmZmVycygpOworICAgIGlmIChtUGxheVNodXR0ZXJTb3VuZCkgeworICAgICAgICBtQ2FtZXJhU2VydmljZS0+cGxheVNvdW5kKFNPVU5EX1NIVVRURVIpOwogICAgIH0KIAogICAgIHNwPElDYW1lcmFDbGllbnQ+IGMgPSBtQ2FtZXJhQ2xpZW50OwpAQCAtMTAzOCw3ICsxMDQxLDYgQEAKICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQLCBtT3JpZW50YXRpb24sIDAsCiAgICAgICAgICAgICBtSGFyZHdhcmUtPmdldFJhd0hlYXAoKSk7CiAKLSAgICAgICAgbVN1cmZhY2UtPnJlZ2lzdGVyQnVmZmVycyhidWZmZXJzKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogICAgIH0KIApAQCAtMTA1MSwxMiArMTA1Myw2IEBACiAgICAgc2l6ZV90IHNpemU7CiAgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBtZW0tPmdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSk7CiAKLSAgICBpZiAoIW1Vc2VPdmVybGF5KSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZSAhPSAwKSB7Ci0gICAgICAgICAgICBtU3VyZmFjZS0+cG9zdEJ1ZmZlcihvZmZzZXQpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLy8gbG9jYWwgY29weSBvZiB0aGUgY2FsbGJhY2sgZmxhZ3MKICAgICBpbnQgZmxhZ3MgPSBtUHJldmlld0NhbGxiYWNrRmxhZzsKIApAQCAtMTA3Nyw5ICsxMDczLDcgQEAKICAgICAgICAgbVByZXZpZXdDYWxsYmFja0ZsYWcgJj0gfihGUkFNRV9DQUxMQkFDS19GTEFHX09ORV9TSE9UX01BU0sgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0NBTExCQUNLX0ZMQUdfQ09QWV9PVVRfTUFTSyB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSyk7Ci0gICAgICAgIGlmIChtVXNlT3ZlcmxheSkgewotICAgICAgICAgICAgZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKLSAgICAgICAgfQorICAgICAgICBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOwogICAgIH0KIAogICAgIGlmIChjICE9IDApIHsKQEAgLTExMTYsMTEgKzExMTAsNiBAQAogICAgIHNpemVfdCBzaXplOwogICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gbWVtLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOwogCi0gICAgLy8gUHV0IHRoZSBZVVYgdmVyc2lvbiBvZiB0aGUgc25hcHNob3QgaW4gdGhlIHByZXZpZXcgZGlzcGxheS4KLSAgICBpZiAobVN1cmZhY2UgIT0gMCAmJiAhbVVzZU92ZXJsYXkpIHsKLSAgICAgICAgbVN1cmZhY2UtPnBvc3RCdWZmZXIob2Zmc2V0KTsKLSAgICB9Ci0KICAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjID0gbUNhbWVyYUNsaWVudDsKICAgICBtTG9jay51bmxvY2soKTsKICAgICBpZiAoYyAhPSAwKSB7CkBAIC0xMjc4LDQgKzEyNjcsMTIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3NwPElTdXJmYWNlPiBDYW1lcmFTZXJ2aWNlOjpnZXRJU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgeworICAgIGlmIChzdXJmYWNlICE9IDApIHsKKyAgICAgICAgcmV0dXJuIHN1cmZhY2UtPmdldElTdXJmYWNlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHNwPElTdXJmYWNlPigwKTsKKyAgICB9Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKaW5kZXggOGYwZWQ3NS4uZDU3MzY0YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaApAQCAtNzksNiArNzksMTIgQEAKICAgICBzcDxNZWRpYVBsYXllcj4gICAgIG1Tb3VuZFBsYXllcltOVU1fU09VTkRTXTsKICAgICBpbnQgICAgICAgICAgICAgICAgIG1Tb3VuZFJlZjsgIC8vIHJlZmVyZW5jZSBjb3VudCAocmVsZWFzZSBhbGwgTWVkaWFQbGF5ZXIgd2hlbiAwKQogCisgICAgLy8gVXNlZCBieSBDbGllbnQgb2JqZWN0cyB0byBleHRyYWN0IHRoZSBJU3VyZmFjZSBmcm9tIGEgU3VyZmFjZSBvYmplY3QuCisgICAgLy8gVGhpcyBpcyB1c2VkIGJlY2F1c2UgbWFraW5nIENsaWVudCBhIGZyaWVuZCBjbGFzcyBvZiBTdXJmYWNlIHdvdWxkCisgICAgLy8gcmVxdWlyZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgaW4gU3VyZmFjZS5oIHNpbmNlIENsaWVudCBpcyBhIG5lc3RlZAorICAgIC8vIGNsYXNzLgorICAgIHN0YXRpYyBzcDxJU3VyZmFjZT4gZ2V0SVN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOworCiAgICAgY2xhc3MgQ2xpZW50IDogcHVibGljIEJuQ2FtZXJhCiAgICAgewogICAgIHB1YmxpYzoKQEAgLTg3LDcgKzkzLDcgQEAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgY29ubmVjdChjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2xpZW50KTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgbG9jaygpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBzZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKGludCBmbGFnKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RhcnRQcmV2aWV3KCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHN0b3BQcmV2aWV3KCk7CkBAIC0xMzIsNiArMTM4LDkgQEAKICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgc3RhcnRQcmV2aWV3TW9kZSgpOwogICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBzdGFydFJlY29yZGluZ01vZGUoKTsKIAorICAgICAgICAvLyBpbnRlcm5hbCBmdW5jdGlvbiB1c2VkIGJ5IHNlbmRDb21tYW5kIHRvIGVuYWJsZS9kaXNhYmxlIHNodXR0ZXIgc291bmQuCisgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIGVuYWJsZVNodXR0ZXJTb3VuZChib29sIGVuYWJsZSk7CisKICAgICAgICAgLy8gdGhlc2UgYXJlIHN0YXRpYyBjYWxsYmFjayBmdW5jdGlvbnMKICAgICAgICAgc3RhdGljIHZvaWQgICAgICAgICAgICAgbm90aWZ5Q2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0Miwgdm9pZCogdXNlcik7CiAgICAgICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgIGRhdGFDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyLCB2b2lkKiB1c2VyKTsKQEAgLTE2NywxMCArMTc2LDEyIEBACiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9yaWVudGF0aW9uOyAgICAgLy8gQ3VycmVudCBkaXNwbGF5IG9yaWVudGF0aW9uCiAgICAgICAgIC8vIFRydWUgaWYgZGlzcGxheSBvcmllbnRhdGlvbiBoYXMgYmVlbiBjaGFuZ2VkLiBUaGlzIGlzIG9ubHkgdXNlZCBpbiBvdmVybGF5LgogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PcmllbnRhdGlvbkNoYW5nZWQ7CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlTaHV0dGVyU291bmQ7CiAKICAgICAgICAgLy8gRW5zdXJlcyBhdG9taWNpdHkgYW1vbmcgdGhlIHB1YmxpYyBtZXRob2RzCiAgICAgICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7CiAgICAgICAgIHNwPElTdXJmYWNlPiAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2U7CisgICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+ICAgICAgICAgICAgICAgbVByZXZpZXdXaW5kb3c7CiAKICAgICAgICAgLy8gSWYgdGhlIHVzZXIgd2FudCB1cyB0byByZXR1cm4gYSBjb3B5IG9mIHRoZSBwcmV2aWV3IGZyYW1lIChpbnN0ZWFkCiAgICAgICAgIC8vIG9mIHRoZSBvcmlnaW5hbCBvbmUpLCB3ZSBhbGxvY2F0ZSBtUHJldmlld0J1ZmZlciBhbmQgcmV1c2UgaXQgaWYgcG9zc2libGUuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDg3ZGU3OWEuLjgzY2UzZTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yNjksMTQgKzI2OSwxMCBAQAogICAgICAgICAgICAgfSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkQ2xpZW50KElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBjbGllbnQpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRDbGllbnQoSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGNsaWVudCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNsaWVudC5zZXRFbmFibGVkKG1Jc0VuYWJsZWQpOwotICAgICAgICAgICAgICAgIG1DbGllbnRzLmFkZChjbGllbnQpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy53KExPR19UQUcsICJEZWFkIEFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50OiAiICsgY2xpZW50LCByZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2xpZW50cy5hZGQoY2xpZW50KTsKKyAgICAgICAgICAgIHJldHVybiBtSXNFbmFibGVkOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BcHBXaWRnZXRTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BcHBXaWRnZXRTZXJ2aWNlLmphdmEKaW5kZXggNzMxZmIyMi4uNWVmM2QzNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQXBwV2lkZ2V0U2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FwcFdpZGdldFNlcnZpY2UuamF2YQpAQCAtNDI2LDYgKzQyNiw0MCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgcGFydGlhbGx5VXBkYXRlQXBwV2lkZ2V0SWRzKGludFtdIGFwcFdpZGdldElkcywgUmVtb3RlVmlld3Mgdmlld3MpIHsKKyAgICAgICAgaWYgKGFwcFdpZGdldElkcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFwcFdpZGdldElkcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBOID0gYXBwV2lkZ2V0SWRzLmxlbmd0aDsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1BcHBXaWRnZXRJZHMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBcHBXaWRnZXRJZCBpZCA9IGxvb2t1cEFwcFdpZGdldElkTG9ja2VkKGFwcFdpZGdldElkc1tpXSk7CisgICAgICAgICAgICAgICAgdXBkYXRlQXBwV2lkZ2V0SW5zdGFuY2VMb2NrZWQoaWQsIHZpZXdzLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChpbnRbXSBhcHBXaWRnZXRJZHMsIGludCB2aWV3SWQpIHsKKyAgICAgICAgaWYgKGFwcFdpZGdldElkcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFwcFdpZGdldElkcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBOID0gYXBwV2lkZ2V0SWRzLmxlbmd0aDsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1BcHBXaWRnZXRJZHMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBcHBXaWRnZXRJZCBpZCA9IGxvb2t1cEFwcFdpZGdldElkTG9ja2VkKGFwcFdpZGdldElkc1tpXSk7CisgICAgICAgICAgICAgICAgbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkSW5zdGFuY2VMb2NrZWQoaWQsIHZpZXdJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB1cGRhdGVBcHBXaWRnZXRQcm92aWRlcihDb21wb25lbnROYW1lIHByb3ZpZGVyLCBSZW1vdGVWaWV3cyB2aWV3cykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1BcHBXaWRnZXRJZHMpIHsKICAgICAgICAgICAgIFByb3ZpZGVyIHAgPSBsb29rdXBQcm92aWRlckxvY2tlZChwcm92aWRlcik7CkBAIC00NDMsMTEgKzQ3NywxNyBAQAogICAgIH0KIAogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0SW5zdGFuY2VMb2NrZWQoQXBwV2lkZ2V0SWQgaWQsIFJlbW90ZVZpZXdzIHZpZXdzKSB7CisgICAgICAgIHVwZGF0ZUFwcFdpZGdldEluc3RhbmNlTG9ja2VkKGlkLCB2aWV3cywgZmFsc2UpOworICAgIH0KKworICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0SW5zdGFuY2VMb2NrZWQoQXBwV2lkZ2V0SWQgaWQsIFJlbW90ZVZpZXdzIHZpZXdzLCBib29sZWFuIGlzUGFydGlhbFVwZGF0ZSkgewogICAgICAgICAvLyBhbGxvdyBmb3Igc3RhbGUgYXBwV2lkZ2V0SWRzIGFuZCBvdGhlciBiYWRuZXNzCiAgICAgICAgIC8vIGxvb2t1cCBhbHNvIGNoZWNrcyB0aGF0IHRoZSBjYWxsaW5nIHByb2Nlc3MgY2FuIGFjY2VzcyB0aGUgYXBwV2lkZ2V0SWQKICAgICAgICAgLy8gZHJvcCB1bmJvdW5kIGFwcFdpZGdldElkcyAoc2hvdWxkbid0IGJlIHBvc3NpYmxlIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzKQogICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiBpZC5wcm92aWRlciAhPSBudWxsICYmICFpZC5wcm92aWRlci56b21iaWUgJiYgIWlkLmhvc3Quem9tYmllKSB7Ci0gICAgICAgICAgICBpZC52aWV3cyA9IHZpZXdzOworCisgICAgICAgICAgICAvLyBXZSBkbyBub3Qgd2FudCB0byBzYXZlIHRoaXMgUmVtb3RlVmlld3MKKyAgICAgICAgICAgIGlmICghaXNQYXJ0aWFsVXBkYXRlKSBpZC52aWV3cyA9IHZpZXdzOwogCiAgICAgICAgICAgICAvLyBpcyBhbnlvbmUgbGlzdGVuaW5nPwogICAgICAgICAgICAgaWYgKGlkLmhvc3QuY2FsbGJhY2tzICE9IG51bGwpIHsKQEAgLTQ2Myw2ICs1MDMsMjUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHZvaWQgbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkSW5zdGFuY2VMb2NrZWQoQXBwV2lkZ2V0SWQgaWQsIGludCB2aWV3SWQpIHsKKyAgICAgICAgLy8gYWxsb3cgZm9yIHN0YWxlIGFwcFdpZGdldElkcyBhbmQgb3RoZXIgYmFkbmVzcworICAgICAgICAvLyBsb29rdXAgYWxzbyBjaGVja3MgdGhhdCB0aGUgY2FsbGluZyBwcm9jZXNzIGNhbiBhY2Nlc3MgdGhlIGFwcFdpZGdldElkCisgICAgICAgIC8vIGRyb3AgdW5ib3VuZCBhcHBXaWRnZXRJZHMgKHNob3VsZG4ndCBiZSBwb3NzaWJsZSB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcykKKyAgICAgICAgaWYgKGlkICE9IG51bGwgJiYgaWQucHJvdmlkZXIgIT0gbnVsbCAmJiAhaWQucHJvdmlkZXIuem9tYmllICYmICFpZC5ob3N0LnpvbWJpZSkgeworICAgICAgICAgICAgLy8gaXMgYW55b25lIGxpc3RlbmluZz8KKyAgICAgICAgICAgIGlmIChpZC5ob3N0LmNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxvY2sgaXMgaGVsZCwgYnV0IHRoaXMgaXMgYSBvbmV3YXkgY2FsbAorICAgICAgICAgICAgICAgICAgICBpZC5ob3N0LmNhbGxiYWNrcy52aWV3RGF0YUNoYW5nZWQoaWQuYXBwV2lkZ2V0SWQsIHZpZXdJZCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSXQgZmFpbGVkOyByZW1vdmUgdGhlIGNhbGxiYWNrLiBObyBuZWVkIHRvIHBydW5lIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgLy8gd2Uga25vdyB0aGF0IHRoaXMgaG9zdCBpcyBzdGlsbCByZWZlcmVuY2VkIGJ5IHRoaXMgaW5zdGFuY2UuCisgICAgICAgICAgICAgICAgICAgIGlkLmhvc3QuY2FsbGJhY2tzID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgaW50W10gc3RhcnRMaXN0ZW5pbmcoSUFwcFdpZGdldEhvc3QgY2FsbGJhY2tzLCBTdHJpbmcgcGFja2FnZU5hbWUsIGludCBob3N0SWQsCiAgICAgICAgICAgICBMaXN0PFJlbW90ZVZpZXdzPiB1cGRhdGVkVmlld3MpIHsKICAgICAgICAgaW50IGNhbGxpbmdVaWQgPSBlbmZvcmNlQ2FsbGluZ1VpZChwYWNrYWdlTmFtZSk7CkBAIC03NDIsNiArODAxLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGluZm8ubGFiZWwgPSBhY3Rpdml0eUluZm8ubG9hZExhYmVsKG1QYWNrYWdlTWFuYWdlcikudG9TdHJpbmcoKTsKICAgICAgICAgICAgIGluZm8uaWNvbiA9IHJpLmdldEljb25SZXNvdXJjZSgpOworICAgICAgICAgICAgaW5mby5wcmV2aWV3SW1hZ2UgPSBzYS5nZXRSZXNvdXJjZUlkKAorICAgICAgICAgICAgCQljb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BcHBXaWRnZXRQcm92aWRlckluZm9fcHJldmlld0ltYWdlLCAwKTsKKwogICAgICAgICAgICAgc2EucmVjeWNsZSgpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gT2sgdG8gY2F0Y2ggRXhjZXB0aW9uIGhlcmUsIGJlY2F1c2UgYW55dGhpbmcgZ29pbmcgd3JvbmcgYmVjYXVzZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ2xpcGJvYXJkU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ2xpcGJvYXJkU2VydmljZS5qYXZhCmluZGV4IGFhOGNkZWQuLmJkZjMxM2MgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0NsaXBib2FyZFNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9DbGlwYm9hcmRTZXJ2aWNlLmphdmEKQEAgLTE2LDQyICsxNiwyNDAgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CiAKLWltcG9ydCBhbmRyb2lkLnRleHQuSUNsaXBib2FyZDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJOYXRpdmU7CitpbXBvcnQgYW5kcm9pZC5hcHAuSUFjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGE7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSUNsaXBib2FyZDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVDYWxsYmFja0xpc3Q7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIAogLyoqCiAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2xpcGJvYXJkIGZvciBjb3B5IGFuZCBwYXN0ZS4KICAqLwogcHVibGljIGNsYXNzIENsaXBib2FyZFNlcnZpY2UgZXh0ZW5kcyBJQ2xpcGJvYXJkLlN0dWIgewotICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1DbGlwYm9hcmQgPSAiIjsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBJQWN0aXZpdHlNYW5hZ2VyIG1BbTsKKyAgICBwcml2YXRlIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIG1QbTsKKyAgICBwcml2YXRlIGZpbmFsIElCaW5kZXIgbVBlcm1pc3Npb25Pd25lcjsKKworICAgIHByaXZhdGUgZmluYWwgUmVtb3RlQ2FsbGJhY2tMaXN0PElPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyPiBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMKKyAgICAgICAgICAgID0gbmV3IFJlbW90ZUNhbGxiYWNrTGlzdDxJT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcj4oKTsKKworICAgIHByaXZhdGUgQ2xpcERhdGEgbVByaW1hcnlDbGlwOworCisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoU2V0PFN0cmluZz4gbUFjdGl2ZVBlcm1pc3Npb25Pd25lcnMKKyAgICAgICAgICAgID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwogCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIHRoZSBjbGlwYm9hcmQuCiAgICAgICovCi0gICAgcHVibGljIENsaXBib2FyZFNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7IH0KKyAgICBwdWJsaWMgQ2xpcGJvYXJkU2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtQW0gPSBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpOworICAgICAgICBtUG0gPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIElCaW5kZXIgcGVybU93bmVyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBlcm1Pd25lciA9IG1BbS5uZXdVcmlQZXJtaXNzaW9uT3duZXIoImNsaXBib2FyZCIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2xvZy53KCJjbGlwYm9hcmQiLCAiQU0gZGVhZCIsIGUpOworICAgICAgICB9CisgICAgICAgIG1QZXJtaXNzaW9uT3duZXIgPSBwZXJtT3duZXI7CisgICAgfQogCi0gICAgLy8gamF2YWRvYyBmcm9tIGludGVyZmFjZQotICAgIHB1YmxpYyB2b2lkIHNldENsaXBib2FyZFRleHQoQ2hhclNlcXVlbmNlIHRleHQpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRyYW5zYWN0KGludCBjb2RlLCBQYXJjZWwgZGF0YSwgUGFyY2VsIHJlcGx5LCBpbnQgZmxhZ3MpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2xvZy53KCJjbGlwYm9hcmQiLCAiRXhjZXB0aW9uOiAiLCBlKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeUNsaXAoQ2xpcERhdGEgY2xpcCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0ZXh0ID0gIiI7CisgICAgICAgICAgICBpZiAoY2xpcCAhPSBudWxsICYmIGNsaXAuZ2V0SXRlbUNvdW50KCkgPD0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIGl0ZW1zIik7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGVja0RhdGFPd25lckxvY2tlZChjbGlwLCBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgICAgIGNsZWFyQWN0aXZlT3duZXJzTG9ja2VkKCk7CisgICAgICAgICAgICBtUHJpbWFyeUNsaXAgPSBjbGlwOworICAgICAgICAgICAgZmluYWwgaW50IG4gPSBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMuYmVnaW5Ccm9hZGNhc3QoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlDbGlwTGlzdGVuZXJzLmdldEJyb2FkY2FzdEl0ZW0oaSkuZGlzcGF0Y2hQcmltYXJ5Q2xpcENoYW5nZWQoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBSZW1vdGVDYWxsYmFja0xpc3Qgd2lsbCB0YWtlIGNhcmUgb2YgcmVtb3ZpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRlYWQgb2JqZWN0IGZvciB1cy4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMuZmluaXNoQnJvYWRjYXN0KCk7CisgICAgICAgIH0KKyAgICB9CiAgICAgCi0gICAgICAgICAgICBtQ2xpcGJvYXJkID0gdGV4dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGphdmFkb2MgZnJvbSBpbnRlcmZhY2UKLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldENsaXBib2FyZFRleHQoKSB7CisgICAgcHVibGljIENsaXBEYXRhIGdldFByaW1hcnlDbGlwKFN0cmluZyBwa2cpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNsaXBib2FyZDsKKyAgICAgICAgICAgIGFkZEFjdGl2ZU93bmVyTG9ja2VkKEJpbmRlci5nZXRDYWxsaW5nVWlkKCksIHBrZyk7CisgICAgICAgICAgICByZXR1cm4gbVByaW1hcnlDbGlwOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gamF2YWRvYyBmcm9tIGludGVyZmFjZQorICAgIHB1YmxpYyBDbGlwRGVzY3JpcHRpb24gZ2V0UHJpbWFyeUNsaXBEZXNjcmlwdGlvbigpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENsaXBEZXNjcmlwdGlvbihtUHJpbWFyeUNsaXApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzUHJpbWFyeUNsaXAoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1QcmltYXJ5Q2xpcCAhPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMucmVnaXN0ZXIobGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMudW5yZWdpc3RlcihsaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDbGlwYm9hcmRUZXh0KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ2xpcGJvYXJkLmxlbmd0aCgpID4gMDsKKyAgICAgICAgICAgIGlmIChtUHJpbWFyeUNsaXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gbVByaW1hcnlDbGlwLmdldEl0ZW0oMCkuZ2V0VGV4dCgpOworICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgY2hlY2tVcmlPd25lckxvY2tlZChVcmkgdXJpLCBpbnQgdWlkKSB7CisgICAgICAgIGlmICghImNvbnRlbnQiLmVxdWFscyh1cmkuZ2V0U2NoZW1lKCkpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICBib29sZWFuIGFsbG93ZWQgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBTZWN1cml0eUV4Y2VwdGlvbiBmb3IgdXMuCisgICAgICAgICAgICBtQW0uY2hlY2tHcmFudFVyaVBlcm1pc3Npb24odWlkLCBudWxsLCB1cmksIEludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04pOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNoZWNrSXRlbU93bmVyTG9ja2VkKENsaXBEYXRhLkl0ZW0gaXRlbSwgaW50IHVpZCkgeworICAgICAgICBpZiAoaXRlbS5nZXRVcmkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBjaGVja1VyaU93bmVyTG9ja2VkKGl0ZW0uZ2V0VXJpKCksIHVpZCk7CisgICAgICAgIH0KKyAgICAgICAgSW50ZW50IGludGVudCA9IGl0ZW0uZ2V0SW50ZW50KCk7CisgICAgICAgIGlmIChpbnRlbnQgIT0gbnVsbCAmJiBpbnRlbnQuZ2V0RGF0YSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNoZWNrVXJpT3duZXJMb2NrZWQoaW50ZW50LmdldERhdGEoKSwgdWlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgdm9pZCBjaGVja0RhdGFPd25lckxvY2tlZChDbGlwRGF0YSBkYXRhLCBpbnQgdWlkKSB7CisgICAgICAgIGZpbmFsIGludCBOID0gZGF0YS5nZXRJdGVtQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgY2hlY2tJdGVtT3duZXJMb2NrZWQoZGF0YS5nZXRJdGVtKGkpLCB1aWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGdyYW50VXJpTG9ja2VkKFVyaSB1cmksIFN0cmluZyBwa2cpIHsKKyAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUFtLmdyYW50VXJpUGVybWlzc2lvbkZyb21Pd25lcihtUGVybWlzc2lvbk93bmVyLCBQcm9jZXNzLm15VWlkKCksIHBrZywgdXJpLAorICAgICAgICAgICAgICAgICAgICBJbnRlbnQuRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgdm9pZCBncmFudEl0ZW1Mb2NrZWQoQ2xpcERhdGEuSXRlbSBpdGVtLCBTdHJpbmcgcGtnKSB7CisgICAgICAgIGlmIChpdGVtLmdldFVyaSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGdyYW50VXJpTG9ja2VkKGl0ZW0uZ2V0VXJpKCksIHBrZyk7CisgICAgICAgIH0KKyAgICAgICAgSW50ZW50IGludGVudCA9IGl0ZW0uZ2V0SW50ZW50KCk7CisgICAgICAgIGlmIChpbnRlbnQgIT0gbnVsbCAmJiBpbnRlbnQuZ2V0RGF0YSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGdyYW50VXJpTG9ja2VkKGludGVudC5nZXREYXRhKCksIHBrZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgYWRkQWN0aXZlT3duZXJMb2NrZWQoaW50IHVpZCwgU3RyaW5nIHBrZykgeworICAgICAgICBQYWNrYWdlSW5mbyBwaTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBpID0gbVBtLmdldFBhY2thZ2VJbmZvKHBrZywgMCk7CisgICAgICAgICAgICBpZiAocGkuYXBwbGljYXRpb25JbmZvLnVpZCAhPSB1aWQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIkNhbGxpbmcgdWlkICIgKyB1aWQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBvd24gcGFja2FnZSAiICsgcGtnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gcGFja2FnZSAiICsgcGtnLCBlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1BY3RpdmVQZXJtaXNzaW9uT3duZXJzLmNvbnRhaW5zKHBrZykpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbVByaW1hcnlDbGlwLmdldEl0ZW1Db3VudCgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIGdyYW50SXRlbUxvY2tlZChtUHJpbWFyeUNsaXAuZ2V0SXRlbShpKSwgcGtnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1BY3RpdmVQZXJtaXNzaW9uT3duZXJzLmFkZChwa2cpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHJldm9rZVVyaUxvY2tlZChVcmkgdXJpKSB7CisgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1BbS5yZXZva2VVcmlQZXJtaXNzaW9uRnJvbU93bmVyKG1QZXJtaXNzaW9uT3duZXIsIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgSW50ZW50LkZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTgorICAgICAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgdm9pZCByZXZva2VJdGVtTG9ja2VkKENsaXBEYXRhLkl0ZW0gaXRlbSkgeworICAgICAgICBpZiAoaXRlbS5nZXRVcmkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXZva2VVcmlMb2NrZWQoaXRlbS5nZXRVcmkoKSk7CisgICAgICAgIH0KKyAgICAgICAgSW50ZW50IGludGVudCA9IGl0ZW0uZ2V0SW50ZW50KCk7CisgICAgICAgIGlmIChpbnRlbnQgIT0gbnVsbCAmJiBpbnRlbnQuZ2V0RGF0YSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldm9rZVVyaUxvY2tlZChpbnRlbnQuZ2V0RGF0YSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgdm9pZCBjbGVhckFjdGl2ZU93bmVyc0xvY2tlZCgpIHsKKyAgICAgICAgbUFjdGl2ZVBlcm1pc3Npb25Pd25lcnMuY2xlYXIoKTsKKyAgICAgICAgaWYgKG1QcmltYXJ5Q2xpcCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IE4gPSBtUHJpbWFyeUNsaXAuZ2V0SXRlbUNvdW50KCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgIHJldm9rZUl0ZW1Mb2NrZWQobVByaW1hcnlDbGlwLmdldEl0ZW0oaSkpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ29ubmVjdGl2aXR5U2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ29ubmVjdGl2aXR5U2VydmljZS5qYXZhCmluZGV4IGZjOGI0YTkuLjYwOTUxMTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Nvbm5lY3Rpdml0eVNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db25uZWN0aXZpdHlTZXJ2aWNlLmphdmEKQEAgLTI2LDE0ICsyNiwxOCBAQAogaW1wb3J0IGFuZHJvaWQubmV0LklDb25uZWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0Lk1vYmlsZURhdGFTdGF0ZVRyYWNrZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRlVHJhY2tlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpU3RhdGVUcmFja2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtVdGlsczsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CkBAIC00Nyw4ICs1MSwxMyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5jb25uZWN0aXZpdHkuVGV0aGVyaW5nOwogCiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwpAQCAtNTksNyArNjgsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgQ29ubmVjdGl2aXR5U2VydmljZSBleHRlbmRzIElDb25uZWN0aXZpdHlNYW5hZ2VyLlN0dWIgewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDb25uZWN0aXZpdHlTZXJ2aWNlIjsKIAogICAgIC8vIGhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIHN3aXRjaGluZyBiYWNrIHRvIGEgcmFkaW8ncyBkZWZhdWx0IG5ldHdvcmsKQEAgLTY4LDcgKzc3LDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS19SRVNUT1JFX0RFTEFZX1BST1BfTkFNRSA9CiAgICAgICAgICAgICAiYW5kcm9pZC50ZWxlcGhvbnkuYXBuLXJlc3RvcmUiOwogCi0KICAgICBwcml2YXRlIFRldGhlcmluZyBtVGV0aGVyaW5nOwogICAgIHByaXZhdGUgYm9vbGVhbiBtVGV0aGVyaW5nQ29uZmlnVmFsaWQgPSBmYWxzZTsKIApAQCAtODUsNiArOTMsOCBAQAogICAgICAqLwogICAgIHByaXZhdGUgTGlzdCBtTmV0UmVxdWVzdGVyc1BpZHNbXTsKIAorICAgIHByaXZhdGUgV2lmaVdhdGNoZG9nU2VydmljZSBtV2lmaVdhdGNoZG9nU2VydmljZTsKKwogICAgIC8vIHByaW9yaXR5IG9yZGVyIG9mIHRoZSBuZXR0cmFja2VycwogICAgIC8vIChleGNsdWRpbmcgZHluYW1pY2FsbHkgc2V0IG1OZXR3b3JrUHJlZmVyZW5jZSkKICAgICAvLyBUT0RPIC0gbW92ZSBtTmV0d29ya1R5cGVQcmVmZXJlbmNlIGludG8gdGhpcwpAQCAtMTYyLDYgKzE3MiwxMyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TRVRfTU9CSUxFX0RBVEEgPQogICAgICAgICAgICAgTUFYX05FVFdPUktfU1RBVEVfVFJBQ0tFUl9FVkVOVCArIDc7CiAKKyAgICAvKioKKyAgICAgKiB1c2VkIGludGVybmFsbHkgdG8gY2xlYXIgYSB3YWtlbG9jayB3aGVuIHRyYW5zaXRpb25pbmcKKyAgICAgKiBmcm9tIG9uZSBuZXQgdG8gYW5vdGhlcgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9DTEVBUl9ORVRfVFJBTlNJVElPTl9XQUtFTE9DSyA9CisgICAgICAgICAgICBNQVhfTkVUV09SS19TVEFURV9UUkFDS0VSX0VWRU5UICsgODsKKwogICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKIAogICAgIC8vIGxpc3Qgb2YgRGVhdGhSZWNpcGllbnRzIHVzZWQgdG8gbWFrZSBzdXJlIGZlYXR1cmVzIGFyZSB0dXJuZWQgb2ZmIHdoZW4KQEAgLTE3MSw2ICsxODgsMTMgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbVN5c3RlbVJlYWR5OwogICAgIHByaXZhdGUgSW50ZW50IG1Jbml0aWFsQnJvYWRjYXN0OwogCisgICAgcHJpdmF0ZSBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbU5ldFRyYW5zaXRpb25XYWtlTG9jazsKKyAgICBwcml2YXRlIFN0cmluZyBtTmV0VHJhbnNpdGlvbldha2VMb2NrQ2F1c2VkQnkgPSAiIjsKKyAgICBwcml2YXRlIGludCBtTmV0VHJhbnNpdGlvbldha2VMb2NrU2VyaWFsTnVtYmVyOworICAgIHByaXZhdGUgaW50IG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tUaW1lb3V0OworCisgICAgcHJpdmF0ZSBJbmV0QWRkcmVzcyBtRGVmYXVsdERuczsKKwogICAgIC8vIHVzZWQgaW4gREJHIG1vZGUgdG8gdHJhY2sgaW5ldCBjb25kaXRpb24gcmVwb3J0cwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkVUX0NPTkRJVElPTl9MT0dfTUFYX1NJWkUgPSAxNTsKICAgICBwcml2YXRlIEFycmF5TGlzdCBtSW5ldExvZzsKQEAgLTIxMCw1MiArMjM0LDIwIEBACiAgICAgfQogICAgIFJhZGlvQXR0cmlidXRlc1tdIG1SYWRpb0F0dHJpYnV0ZXM7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb25uZWN0aXZpdHlUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotICAgICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBDb25uZWN0aXZpdHlUaHJlYWQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcigiQ29ubmVjdGl2aXR5VGhyZWFkIik7Ci0gICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgQ29ubmVjdGl2aXR5U2VydmljZSBnZXRJbnN0YW5jZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKHNTZXJ2aWNlSW5zdGFuY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgc1NlcnZpY2VJbnN0YW5jZSA9IG5ldyBDb25uZWN0aXZpdHlTZXJ2aWNlKGNvbnRleHQpOwogICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIExvb3Blci5wcmVwYXJlKCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBzU2VydmljZUluc3RhbmNlID0gbmV3IENvbm5lY3Rpdml0eVNlcnZpY2UobUNvbnRleHQpOwotICAgICAgICAgICAgICAgIG5vdGlmeUFsbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTG9vcGVyLmxvb3AoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ29ubmVjdGl2aXR5U2VydmljZSBnZXRTZXJ2aWNlSW5zdGFuY2UoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBDb25uZWN0aXZpdHlUaHJlYWQgdGhyZWFkID0gbmV3IENvbm5lY3Rpdml0eVRocmVhZChjb250ZXh0KTsKLSAgICAgICAgICAgIHRocmVhZC5zdGFydCgpOwotCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRocmVhZCkgewotICAgICAgICAgICAgICAgIHdoaWxlIChzU2VydmljZUluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgc1NlcnZpY2VJbnN0YW5jZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC53YWl0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB3aGlsZSB3YWl0aW5nIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvciBDb25uZWN0aXZpdHlTZXJ2aWNlIHRocmVhZCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc1NlcnZpY2VJbnN0YW5jZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29ubmVjdGl2aXR5U2VydmljZSBnZXRJbnN0YW5jZShDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIENvbm5lY3Rpdml0eVRocmVhZC5nZXRTZXJ2aWNlSW5zdGFuY2UoY29udGV4dCk7CisgICAgICAgIHJldHVybiBzU2VydmljZUluc3RhbmNlOwogICAgIH0KIAogICAgIHByaXZhdGUgQ29ubmVjdGl2aXR5U2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgaWYgKERCRykgU2xvZy52KFRBRywgIkNvbm5lY3Rpdml0eVNlcnZpY2Ugc3RhcnRpbmcgdXAiKTsKIAorICAgICAgICBIYW5kbGVyVGhyZWFkIGhhbmRsZXJUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiQ29ubmVjdGl2aXR5U2VydmljZVRocmVhZCIpOworICAgICAgICBoYW5kbGVyVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcihoYW5kbGVyVGhyZWFkLmdldExvb3BlcigpKTsKKwogICAgICAgICAvLyBzZXR1cCBvdXIgdW5pcXVlIGRldmljZSBuYW1lCiAgICAgICAgIFN0cmluZyBpZCA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuQU5EUk9JRF9JRCk7CkBAIC0yNjQsMTAgKzI1NiwyOCBAQAogICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoIm5ldC5ob3N0bmFtZSIsIG5hbWUpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gcmVhZCBvdXIgZGVmYXVsdCBkbnMgc2VydmVyIGlwCisgICAgICAgIFN0cmluZyBkbnMgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfRE5TX1NFUlZFUik7CisgICAgICAgIGlmIChkbnMgPT0gbnVsbCB8fCBkbnMubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgZG5zID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmNvbmZpZ19kZWZhdWx0X2Ruc19zZXJ2ZXIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGVmYXVsdERucyA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZShkbnMpOworICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3Igc2V0dGluZyBkZWZhdWx0RG5zIHVzaW5nICIgKyBkbnMpOworICAgICAgICB9CisKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworCisgICAgICAgIFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIgPSAoUG93ZXJNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKKyAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9jayA9IHBvd2VyTWFuYWdlci5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIFRBRyk7CisgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tUaW1lb3V0ID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmludGVnZXIuY29uZmlnX25ldHdvcmtUcmFuc2l0aW9uVGltZW91dCk7CisKICAgICAgICAgbU5ldFRyYWNrZXJzID0gbmV3IE5ldHdvcmtTdGF0ZVRyYWNrZXJbCiAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5NQVhfTkVUV09SS19UWVBFKzFdOwotICAgICAgICBtSGFuZGxlciA9IG5ldyBNeUhhbmRsZXIoKTsKIAogICAgICAgICBtTmV0d29ya1ByZWZlcmVuY2UgPSBnZXRQZXJzaXN0ZWROZXR3b3JrUHJlZmVyZW5jZSgpOwogCkBAIC0zNjQsMTggKzM3NCwyMSBAQAogICAgICAgICAgICAgc3dpdGNoIChtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5tUmFkaW8pIHsKICAgICAgICAgICAgIGNhc2UgQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkk6CiAgICAgICAgICAgICAgICAgaWYgKERCRykgU2xvZy52KFRBRywgIlN0YXJ0aW5nIFdpZmkgU2VydmljZS4iKTsKLSAgICAgICAgICAgICAgICBXaWZpU3RhdGVUcmFja2VyIHdzdCA9IG5ldyBXaWZpU3RhdGVUcmFja2VyKGNvbnRleHQsIG1IYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBXaWZpU2VydmljZSB3aWZpU2VydmljZSA9IG5ldyBXaWZpU2VydmljZShjb250ZXh0LCB3c3QpOworICAgICAgICAgICAgICAgIFdpZmlTdGF0ZVRyYWNrZXIgd3N0ID0gbmV3IFdpZmlTdGF0ZVRyYWNrZXIoKTsKKyAgICAgICAgICAgICAgICBXaWZpU2VydmljZSB3aWZpU2VydmljZSA9IG5ldyBXaWZpU2VydmljZShjb250ZXh0KTsKICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKENvbnRleHQuV0lGSV9TRVJWSUNFLCB3aWZpU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgd2lmaVNlcnZpY2Uuc3RhcnRXaWZpKCk7CisgICAgICAgICAgICAgICAgd2lmaVNlcnZpY2UuY2hlY2tBbmRTdGFydFdpZmkoKTsKICAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkldID0gd3N0OwotICAgICAgICAgICAgICAgIHdzdC5zdGFydE1vbml0b3JpbmcoKTsKKyAgICAgICAgICAgICAgICB3c3Quc3RhcnRNb25pdG9yaW5nKGNvbnRleHQsIG1IYW5kbGVyKTsKKworICAgICAgICAgICAgICAgIC8vVE9ETzogYXMgcGFydCBvZiBXV1MgcmVmYWN0b3IsIGNyZWF0ZSBvbmx5IHdoZW4gbmVlZGVkCisgICAgICAgICAgICAgICAgbVdpZmlXYXRjaGRvZ1NlcnZpY2UgPSBuZXcgV2lmaVdhdGNoZG9nU2VydmljZShjb250ZXh0KTsKIAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFOgotICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXSA9IG5ldyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyKGNvbnRleHQsIG1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICBuZXRUeXBlLCBtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5tTmFtZSk7Ci0gICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLnN0YXJ0TW9uaXRvcmluZygpOworICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXSA9IG5ldyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyKG5ldFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5tTmFtZSk7CisgICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLnN0YXJ0TW9uaXRvcmluZyhjb250ZXh0LCBtSGFuZGxlcik7CiAgICAgICAgICAgICAgICAgaWYgKG5vTW9iaWxlRGF0YSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBTbG9nLmQoVEFHLCAidGVhcmluZyBkb3duIE1vYmlsZSBuZXR3b3JrcyBkdWUgdG8gc2V0dGluZyIpOwogICAgICAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbbmV0VHlwZV0udGVhcmRvd24oKTsKQEAgLTM5Miw3ICs0MDUsOCBAQAogICAgICAgICBtVGV0aGVyaW5nQ29uZmlnVmFsaWQgPSAoKChtTmV0VHJhY2tlcnNbQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRV9EVU5dICE9IG51bGwpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1UZXRoZXJpbmcuaXNEdW5SZXF1aXJlZCgpKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1UZXRoZXJpbmcuZ2V0VGV0aGVyYWJsZVVzYlJlZ2V4cygpLmxlbmd0aCAhPSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRldGhlcmluZy5nZXRUZXRoZXJhYmxlV2lmaVJlZ2V4cygpLmxlbmd0aCAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXRoZXJpbmcuZ2V0VGV0aGVyYWJsZVdpZmlSZWdleHMoKS5sZW5ndGggIT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXRoZXJpbmcuZ2V0VGV0aGVyYWJsZUJsdWV0b290aFJlZ2V4cygpLmxlbmd0aCAhPSAwKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRldGhlcmluZy5nZXRVcHN0cmVhbUlmYWNlUmVnZXhzKCkubGVuZ3RoICE9IDApOwogCiAgICAgICAgIGlmIChEQkcpIHsKQEAgLTUyOCw2ICs1NDIsMzggQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gTGlua1Byb3BlcnRpZXMgZm9yIHRoZSBhY3RpdmUgKGkuZS4sIGNvbm5lY3RlZCkgZGVmYXVsdAorICAgICAqIG5ldHdvcmsgaW50ZXJmYWNlLiAgSXQgaXMgYXNzdW1lZCB0aGF0IGF0IG1vc3Qgb25lIGRlZmF1bHQgbmV0d29yaworICAgICAqIGlzIGFjdGl2ZSBhdCBhIHRpbWUuIElmIG1vcmUgdGhhbiBvbmUgaXMgYWN0aXZlLCBpdCBpcyBpbmRldGVybWluYXRlCisgICAgICogd2hpY2ggd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpcCBwcm9wZXJ0aWVzIGZvciB0aGUgYWN0aXZlIG5ldHdvcmssIG9yIHtAY29kZSBudWxsfSBpZgorICAgICAqIG5vbmUgaXMgYWN0aXZlCisgICAgICovCisgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzIGdldEFjdGl2ZUxpbmtQcm9wZXJ0aWVzKCkgeworICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOworICAgICAgICBmb3IgKGludCB0eXBlPTA7IHR5cGUgPD0gQ29ubmVjdGl2aXR5TWFuYWdlci5NQVhfTkVUV09SS19UWVBFOyB0eXBlKyspIHsKKyAgICAgICAgICAgIGlmIChtTmV0QXR0cmlidXRlc1t0eXBlXSA9PSBudWxsIHx8ICFtTmV0QXR0cmlidXRlc1t0eXBlXS5pc0RlZmF1bHQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTmV0d29ya1N0YXRlVHJhY2tlciB0ID0gbU5ldFRyYWNrZXJzW3R5cGVdOworICAgICAgICAgICAgTmV0d29ya0luZm8gaW5mbyA9IHQuZ2V0TmV0d29ya0luZm8oKTsKKyAgICAgICAgICAgIGlmIChpbmZvLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdC5nZXRMaW5rUHJvcGVydGllcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcyBnZXRMaW5rUHJvcGVydGllcyhpbnQgbmV0d29ya1R5cGUpIHsKKyAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKKyAgICAgICAgaWYgKENvbm5lY3Rpdml0eU1hbmFnZXIuaXNOZXR3b3JrVHlwZVZhbGlkKG5ldHdvcmtUeXBlKSkgeworICAgICAgICAgICAgTmV0d29ya1N0YXRlVHJhY2tlciB0ID0gbU5ldFRyYWNrZXJzW25ldHdvcmtUeXBlXTsKKyAgICAgICAgICAgIGlmICh0ICE9IG51bGwpIHJldHVybiB0LmdldExpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gc2V0UmFkaW9zKGJvb2xlYW4gdHVybk9uKSB7CiAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKQEAgLTY3NiwxNCArNzIyLDcgQEAKICAgICAgICAgICAgICAgICBuZXR3b3JrLnJlY29ubmVjdCgpOwogICAgICAgICAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fUkVRVUVTVF9TVEFSVEVEOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewotICAgICAgICAgICAgICAgICAgICBtRmVhdHVyZVVzZXJzLmFkZChmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfUkVTVE9SRV9ERUZBVUxUX05FVFdPUkssCi0gICAgICAgICAgICAgICAgICAgICAgICBmKSwgZ2V0UmVzdG9yZURlZmF1bHROZXR3b3JrRGVsYXkoKSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV0d29yay5zdGFydFVzaW5nTmV0d29ya0ZlYXR1cmUoZmVhdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldENhbGxpbmdQaWQoKSwgZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9UWVBFX05PVF9BVkFJTEFCTEU7CkBAIC04MDIsOCArODQxLDcgQEAKICAgICAgICAgICAgIHRyYWNrZXIudGVhcmRvd24oKTsKICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gZG8gaXQgdGhlIG9sZCBmYXNoaW9uZWQgd2F5Ci0gICAgICAgICAgICByZXR1cm4gdHJhY2tlci5zdG9wVXNpbmdOZXR3b3JrRmVhdHVyZShmZWF0dXJlLCBwaWQsIHVpZCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTg1MiwxMSArODkwLDM3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLQogICAgICAgICB0cnkgewotICAgICAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoaG9zdEFkZHJlc3MpOwotICAgICAgICAgICAgcmV0dXJuIHRyYWNrZXIucmVxdWVzdFJvdXRlVG9Ib3N0KGluZXRBZGRyZXNzKTsKLSAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgSW5ldEFkZHJlc3MgYWRkciA9IEluZXRBZGRyZXNzLmdldEJ5QWRkcmVzcyhob3N0QWRkcmVzcyk7CisgICAgICAgICAgICByZXR1cm4gYWRkSG9zdFJvdXRlKHRyYWNrZXIsIGFkZHIpOworICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlIHRoYXQgYSBuZXR3b3JrIHJvdXRlIGV4aXN0cyB0byBkZWxpdmVyIHRyYWZmaWMgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIGhvc3QgdmlhIHRoZSBtb2JpbGUgZGF0YSBuZXR3b3JrLgorICAgICAqIEBwYXJhbSBob3N0QWRkcmVzcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgcm91dGUgaXMgZGVzaXJlZCwKKyAgICAgKiBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgICAgICogVE9ETyAtIGRlcHJlY2F0ZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9uIHN1Y2Nlc3MsIHtAY29kZSBmYWxzZX0gb24gZmFpbHVyZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBhZGRIb3N0Um91dGUoTmV0d29ya1N0YXRlVHJhY2tlciBudCwgSW5ldEFkZHJlc3MgaG9zdEFkZHJlc3MpIHsKKyAgICAgICAgaWYgKG50LmdldE5ldHdvcmtJbmZvKCkuZ2V0VHlwZSgpID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBMaW5rUHJvcGVydGllcyBwID0gbnQuZ2V0TGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHAuZ2V0SW50ZXJmYWNlTmFtZSgpOworCisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJSZXF1ZXN0ZWQgaG9zdCByb3V0ZSB0byAiICsgaG9zdEFkZHJlc3MgKyAiKCIgKyBpbnRlcmZhY2VOYW1lICsgIikiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW50ZXJmYWNlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gTmV0d29ya1V0aWxzLmFkZEhvc3RSb3V0ZShpbnRlcmZhY2VOYW1lLCBob3N0QWRkcmVzcywgbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoREJHKSBTbG9nLmUoVEFHLCAiYWRkSG9zdFJvdXRlIGZhaWxlZCBkdWUgdG8gbnVsbCBpbnRlcmZhY2UgbmFtZSIpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtOTc1LDYgKzEwMzksMTIgQEAKICAgICAgICAgICAgICAgICAiQ29ubmVjdGl2aXR5U2VydmljZSIpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBlbmZvcmNlQ29ubmVjdGl2aXR5SW50ZXJuYWxQZXJtaXNzaW9uKCkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCisgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkNPTk5FQ1RJVklUWV9JTlRFUk5BTCwKKyAgICAgICAgICAgICAgICAiQ29ubmVjdGl2aXR5U2VydmljZSIpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEhhbmRsZSBhIHtAY29kZSBESVNDT05ORUNURUR9IGV2ZW50LiBJZiB0aGlzIHBlcnRhaW5zIHRvIHRoZSBub24tYWN0aXZlCiAgICAgICogbmV0d29yaywgd2UgaWdub3JlIGl0LiBJZiBpdCBpcyBmb3IgdGhlIGFjdGl2ZSBuZXR3b3JrLCB3ZSBzZW5kIG91dCBhCkBAIC0xMjY5LDkgKzEzMzksMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJOZXR3b3JrIGRlY2xpbmVkIHRlYXJkb3duIHJlcXVlc3QiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNGYWlsb3ZlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJOZXQucmVsZWFzZVdha2VMb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKENvbm5lY3Rpdml0eVNlcnZpY2UudGhpcykgeworICAgICAgICAgICAgICAgIC8vIGhhdmUgYSBuZXcgZGVmYXVsdCBuZXR3b3JrLCByZWxlYXNlIHRoZSB0cmFuc2l0aW9uIHdha2Vsb2NrIGluIGEgc2Vjb25kCisgICAgICAgICAgICAgICAgLy8gaWYgaXQncyBoZWxkLiAgVGhlIHNlY29uZCBwYXVzZSBpcyB0byBhbGxvdyBhcHBzIHRvIHJlY29ubmVjdCBvdmVyIHRoZQorICAgICAgICAgICAgICAgIC8vIG5ldyBuZXR3b3JrCisgICAgICAgICAgICAgICAgaWYgKG1OZXRUcmFuc2l0aW9uV2FrZUxvY2suaXNIZWxkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZFTlRfQ0xFQVJfTkVUX1RSQU5TSVRJT05fV0FLRUxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1NlcmlhbE51bWJlciwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUFjdGl2ZURlZmF1bHROZXR3b3JrID0gdHlwZTsKQEAgLTEyODUsMzYgKzEzNjMsMTQgQEAKICAgICAgICAgICAgIC8vcmVwb3J0TmV0d29ya0NvbmRpdGlvbihtQWN0aXZlRGVmYXVsdE5ldHdvcmssIDEwMCk7CiAgICAgICAgIH0KICAgICAgICAgdGhpc05ldC5zZXRUZWFyZG93blJlcXVlc3RlZChmYWxzZSk7Ci0gICAgICAgIHRoaXNOZXQudXBkYXRlTmV0d29ya1NldHRpbmdzKCk7CisgICAgICAgIHVwZGF0ZU5ldHdvcmtTZXR0aW5ncyh0aGlzTmV0KTsKICAgICAgICAgaGFuZGxlQ29ubmVjdGl2aXR5Q2hhbmdlKHR5cGUpOwogICAgICAgICBzZW5kQ29ubmVjdGVkQnJvYWRjYXN0KGluZm8pOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTY2FuUmVzdWx0c0F2YWlsYWJsZShOZXR3b3JrSW5mbyBpbmZvKSB7Ci0gICAgICAgIGludCBuZXR3b3JrVHlwZSA9IGluZm8uZ2V0VHlwZSgpOwotICAgICAgICBpZiAobmV0d29ya1R5cGUgIT0gQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkkpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIFNsb2cudihUQUcsICJHb3QgU2NhblJlc3VsdHNBdmFpbGFibGUgZm9yICIgKwotICAgICAgICAgICAgICAgICAgICBpbmZvLmdldFR5cGVOYW1lKCkgKyAiIG5ldHdvcmsuIERvbid0IGtub3cgaG93IHRvIGhhbmRsZS4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1OZXRUcmFja2Vyc1tuZXR3b3JrVHlwZV0uaW50ZXJwcmV0U2NhblJlc3VsdHNBdmFpbGFibGUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uQ2hhbmdlKGJvb2xlYW4gdmlzaWJsZSwgaW50IGlkLAotICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyIG5vdGlmaWNhdGlvbk1hbmFnZXIgPSAoTm90aWZpY2F0aW9uTWFuYWdlcikgbUNvbnRleHQKLSAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk5PVElGSUNBVElPTl9TRVJWSUNFKTsKLQotICAgICAgICBpZiAodmlzaWJsZSkgewotICAgICAgICAgICAgbm90aWZpY2F0aW9uTWFuYWdlci5ub3RpZnkoaWQsIG5vdGlmaWNhdGlvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBub3RpZmljYXRpb25NYW5hZ2VyLmNhbmNlbChpZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKioKLSAgICAgKiBBZnRlciBhIGNoYW5nZSBpbiB0aGUgY29ubmVjdGl2aXR5IHN0YXRlIG9mIGFueSBuZXR3b3JrLCBXZSdyZSBtYWlubHkKLSAgICAgKiBjb25jZXJuZWQgd2l0aCBtYWtpbmcgc3VyZSB0aGF0IHRoZSBsaXN0IG9mIEROUyBzZXJ2ZXJzIGlzIHNldHVwdXAKKyAgICAgKiBBZnRlciBhIGNoYW5nZSBpbiB0aGUgY29ubmVjdGl2aXR5IHN0YXRlIG9mIGEgbmV0d29yay4gV2UncmUgbWFpbmx5CisgICAgICogY29uY2VybmVkIHdpdGggbWFraW5nIHN1cmUgdGhhdCB0aGUgbGlzdCBvZiBETlMgc2VydmVycyBpcyBzZXQgdXAKICAgICAgKiBhY2NvcmRpbmcgdG8gd2hpY2ggbmV0d29ya3MgYXJlIGNvbm5lY3RlZCwgYW5kIGVuc3VyaW5nIHRoYXQgdGhlCiAgICAgICogcmlnaHQgcm91dGluZyB0YWJsZSBlbnRyaWVzIGV4aXN0LgogICAgICAqLwpAQCAtMTMyNywxOSArMTM4MywxNTggQEAKIAogICAgICAgICBpZiAobU5ldFRyYWNrZXJzW25ldFR5cGVdLmdldE5ldHdvcmtJbmZvKCkuaXNDb25uZWN0ZWQoKSkgewogICAgICAgICAgICAgaWYgKG1OZXRBdHRyaWJ1dGVzW25ldFR5cGVdLmlzRGVmYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLmFkZERlZmF1bHRSb3V0ZSgpOworICAgICAgICAgICAgICAgIGFkZERlZmF1bHRSb3V0ZShtTmV0VHJhY2tlcnNbbmV0VHlwZV0pOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbbmV0VHlwZV0uYWRkUHJpdmF0ZURuc1JvdXRlcygpOworICAgICAgICAgICAgICAgIGFkZFByaXZhdGVEbnNSb3V0ZXMobU5ldFRyYWNrZXJzW25ldFR5cGVdKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5pc0RlZmF1bHQoKSkgewotICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXS5yZW1vdmVEZWZhdWx0Um91dGUoKTsKKyAgICAgICAgICAgICAgICByZW1vdmVEZWZhdWx0Um91dGUobU5ldFRyYWNrZXJzW25ldFR5cGVdKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLnJlbW92ZVByaXZhdGVEbnNSb3V0ZXMoKTsKKyAgICAgICAgICAgICAgICByZW1vdmVQcml2YXRlRG5zUm91dGVzKG1OZXRUcmFja2Vyc1tuZXRUeXBlXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgYWRkUHJpdmF0ZURuc1JvdXRlcyhOZXR3b3JrU3RhdGVUcmFja2VyIG50KSB7CisgICAgICAgIGJvb2xlYW4gcHJpdmF0ZURuc1JvdXRlU2V0ID0gbnQuaXNQcml2YXRlRG5zUm91dGVTZXQoKTsKKyAgICAgICAgTGlua1Byb3BlcnRpZXMgcCA9IG50LmdldExpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgIGlmIChwID09IG51bGwpIHJldHVybjsKKyAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUgPSBwLmdldEludGVyZmFjZU5hbWUoKTsKKworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYWRkUHJpdmF0ZURuc1JvdXRlcyBmb3IgIiArIG50ICsKKyAgICAgICAgICAgICAgICAgICAgIigiICsgaW50ZXJmYWNlTmFtZSArICIpIC0gbVByaXZhdGVEbnNSb3V0ZVNldCA9ICIgKyBwcml2YXRlRG5zUm91dGVTZXQpOworICAgICAgICB9CisgICAgICAgIGlmIChpbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgIXByaXZhdGVEbnNSb3V0ZVNldCkgeworICAgICAgICAgICAgQ29sbGVjdGlvbjxJbmV0QWRkcmVzcz4gZG5zTGlzdCA9IHAuZ2V0RG5zZXMoKTsKKyAgICAgICAgICAgIGZvciAoSW5ldEFkZHJlc3MgZG5zIDogZG5zTGlzdCkgeworICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICIgIGFkZGluZyAiICsgZG5zKTsKKyAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMuYWRkSG9zdFJvdXRlKGludGVyZmFjZU5hbWUsIGRucywgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudC5wcml2YXRlRG5zUm91dGVTZXQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlUHJpdmF0ZURuc1JvdXRlcyhOZXR3b3JrU3RhdGVUcmFja2VyIG50KSB7CisgICAgICAgIC8vIFRPRE8gLSB3ZSBzaG91bGQgZG8gdGhpcyBleHBsaWNpdGx5IGJ1dCB0aGUgTmV0VXRpbHMgYXBpIGRvZXNudAorICAgICAgICAvLyBzdXBwb3J0IHRoaXMgeWV0IC0gbXVzdCByZW1vdmUgYWxsLiAgTm8gd29yc2UgdGhhbiBiZWZvcmUKKyAgICAgICAgTGlua1Byb3BlcnRpZXMgcCA9IG50LmdldExpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgIGlmIChwID09IG51bGwpIHJldHVybjsKKyAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUgPSBwLmdldEludGVyZmFjZU5hbWUoKTsKKyAgICAgICAgYm9vbGVhbiBwcml2YXRlRG5zUm91dGVTZXQgPSBudC5pc1ByaXZhdGVEbnNSb3V0ZVNldCgpOworICAgICAgICBpZiAoaW50ZXJmYWNlTmFtZSAhPSBudWxsICYmIHByaXZhdGVEbnNSb3V0ZVNldCkgeworICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJyZW1vdmVQcml2YXRlRG5zUm91dGVzIGZvciAiICsgbnQuZ2V0TmV0d29ya0luZm8oKS5nZXRUeXBlTmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgKCIgKyBpbnRlcmZhY2VOYW1lICsgIikiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5ldHdvcmtVdGlscy5yZW1vdmVIb3N0Um91dGVzKGludGVyZmFjZU5hbWUpOworICAgICAgICAgICAgbnQucHJpdmF0ZURuc1JvdXRlU2V0KGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIGFkZERlZmF1bHRSb3V0ZShOZXR3b3JrU3RhdGVUcmFja2VyIG50KSB7CisgICAgICAgIExpbmtQcm9wZXJ0aWVzIHAgPSBudC5nZXRMaW5rUHJvcGVydGllcygpOworICAgICAgICBpZiAocCA9PSBudWxsKSByZXR1cm47CisgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lID0gcC5nZXRJbnRlcmZhY2VOYW1lKCk7CisgICAgICAgIEluZXRBZGRyZXNzIGRlZmF1bHRHYXRld2F5QWRkciA9IHAuZ2V0R2F0ZXdheSgpOworCisgICAgICAgIGlmICgoaW50ZXJmYWNlTmFtZSAhPSBudWxsKSAmJiAoZGVmYXVsdEdhdGV3YXlBZGRyICE9IG51bGwgKSkgeworICAgICAgICAgICAgaWYgKCFOZXR3b3JrVXRpbHMuYWRkRGVmYXVsdFJvdXRlKGludGVyZmFjZU5hbWUsIGRlZmF1bHRHYXRld2F5QWRkcikgJiYgREJHKSB7CisgICAgICAgICAgICAgICAgTmV0d29ya0luZm8gbmV0d29ya0luZm8gPSBudC5nZXROZXR3b3JrSW5mbygpOworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJhZGREZWZhdWx0Um91dGUgZm9yICIgKyBuZXR3b3JrSW5mby5nZXRUeXBlTmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgKCIgKyBpbnRlcmZhY2VOYW1lICsgIiksIEdhdGV3YXlBZGRyPSIgKyBkZWZhdWx0R2F0ZXdheUFkZHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVEZWZhdWx0Um91dGUoTmV0d29ya1N0YXRlVHJhY2tlciBudCkgeworICAgICAgICBMaW5rUHJvcGVydGllcyBwID0gbnQuZ2V0TGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHAuZ2V0SW50ZXJmYWNlTmFtZSgpOworCisgICAgICAgIGlmIChpbnRlcmZhY2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICgoTmV0d29ya1V0aWxzLnJlbW92ZURlZmF1bHRSb3V0ZShpbnRlcmZhY2VOYW1lKSA+PSAwKSAmJiBEQkcpIHsKKyAgICAgICAgICAgICAgICBOZXR3b3JrSW5mbyBuZXR3b3JrSW5mbyA9IG50LmdldE5ldHdvcmtJbmZvKCk7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgInJlbW92ZURlZmF1bHRSb3V0ZSBmb3IgIiArIG5ldHdvcmtJbmZvLmdldFR5cGVOYW1lKCkgKyAiICgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU5hbWUgKyAiKSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgbmV0d29yayBzcGVjaWZpYyBUQ1AgYnVmZmVyIHNpemVzIGZyb20gU3lzdGVtUHJvcGVydGllcworICAgICAqIG5ldC50Y3AuYnVmZmVyc2l6ZS5bZGVmYXVsdHx3aWZpfHVtdHN8ZWRnZXxncHJzXSBhbmQgc2V0IHRoZW0gZm9yIHN5c3RlbQorICAgICAqIHdpZGUgdXNlCisgICAgICovCisgICBwdWJsaWMgdm9pZCB1cGRhdGVOZXR3b3JrU2V0dGluZ3MoTmV0d29ya1N0YXRlVHJhY2tlciBudCkgeworICAgICAgICBTdHJpbmcga2V5ID0gbnQuZ2V0VGNwQnVmZmVyU2l6ZXNQcm9wTmFtZSgpOworICAgICAgICBTdHJpbmcgYnVmZmVyU2l6ZXMgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChrZXkpOworCisgICAgICAgIGlmIChidWZmZXJTaXplcy5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCBrZXkgKyAiIG5vdCBmb3VuZCBpbiBzeXN0ZW0gcHJvcGVydGllcy4gVXNpbmcgZGVmYXVsdHMiKTsKKworICAgICAgICAgICAgLy8gU2V0dGluZyB0byBkZWZhdWx0IHZhbHVlcyBzbyB3ZSB3b24ndCBiZSBzdHVjayB0byBwcmV2aW91cyB2YWx1ZXMKKyAgICAgICAgICAgIGtleSA9ICJuZXQudGNwLmJ1ZmZlcnNpemUuZGVmYXVsdCI7CisgICAgICAgICAgICBidWZmZXJTaXplcyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KGtleSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgdmFsdWVzIGluIGtlcm5lbAorICAgICAgICBpZiAoYnVmZmVyU2l6ZXMubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgIFNsb2cudihUQUcsICJTZXR0aW5nIFRDUCB2YWx1ZXM6IFsiICsgYnVmZmVyU2l6ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gd2hpY2ggY29tZXMgZnJvbSBbIiArIGtleSArICJdIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRCdWZmZXJTaXplKGJ1ZmZlclNpemVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgLyoqCisgICAgICogV3JpdGVzIFRDUCBidWZmZXIgc2l6ZXMgdG8gL3N5cy9rZXJuZWwvaXB2NC90Y3BfW3Ivd11tZW1fW21pbi9kZWYvbWF4XQorICAgICAqIHdoaWNoIG1hcHMgdG8gL3Byb2Mvc3lzL25ldC9pcHY0L3RjcF9ybWVtIGFuZCB0Y3B3bWVtCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmZmVyU2l6ZXMgaW4gdGhlIGZvcm1hdCBvZiAicmVhZE1pbiwgcmVhZEluaXRpYWwsIHJlYWRNYXgsCisgICAgICogICAgICAgIHdyaXRlTWluLCB3cml0ZUluaXRpYWwsIHdyaXRlTWF4IgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRCdWZmZXJTaXplKFN0cmluZyBidWZmZXJTaXplcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gYnVmZmVyU2l6ZXMuc3BsaXQoIiwiKTsKKworICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT0gNikgeworICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gIi9zeXMva2VybmVsL2lwdjQvdGNwXyI7CisgICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJybWVtX21pbiIsIHZhbHVlc1swXSk7CisgICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJybWVtX2RlZiIsIHZhbHVlc1sxXSk7CisgICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJybWVtX21heCIsIHZhbHVlc1syXSk7CisgICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJ3bWVtX21pbiIsIHZhbHVlc1szXSk7CisgICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJ3bWVtX2RlZiIsIHZhbHVlc1s0XSk7CisgICAgICAgICAgICAgICAgc3RyaW5nVG9GaWxlKHByZWZpeCArICJ3bWVtX21heCIsIHZhbHVlc1s1XSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJJbnZhbGlkIGJ1ZmZlcnNpemUgc3RyaW5nOiAiICsgYnVmZmVyU2l6ZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiQ2FuJ3Qgc2V0IHRjcCBidWZmZXIgc2l6ZXM6IiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAvKioKKyAgICAgKiBXcml0ZXMgc3RyaW5nIHRvIGZpbGUuIEJhc2ljYWxseSBzYW1lIGFzICJlY2hvIC1uICRzdHJpbmcgPiAkZmlsZW5hbWUiCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUKKyAgICAgKiBAcGFyYW0gc3RyaW5nCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzdHJpbmdUb0ZpbGUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlV3JpdGVyIG91dCA9IG5ldyBGaWxlV3JpdGVyKGZpbGVuYW1lKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dC53cml0ZShzdHJpbmcpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKwogICAgIC8qKgogICAgICAqIEFkanVzdCB0aGUgcGVyLXByb2Nlc3MgZG5zIGVudHJpZXMgKG5ldC5kbnM8eD4uPHBpZD4pIGJhc2VkCiAgICAgICogb24gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgYWN0aXZlIG5ldCB3aGljaCB0aGlzIHByb2Nlc3MgcmVxdWVzdGVkLgpAQCAtMTM1NSwxMiArMTU1MCwxNCBAQAogICAgICAgICAgICAgTmV0d29ya1N0YXRlVHJhY2tlciBudCA9IG1OZXRUcmFja2Vyc1tpXTsKICAgICAgICAgICAgIGlmIChudC5nZXROZXR3b3JrSW5mbygpLmlzQ29ubmVjdGVkKCkgJiYKICAgICAgICAgICAgICAgICAgICAgIW50LmlzVGVhcmRvd25SZXF1ZXN0ZWQoKSkgeworICAgICAgICAgICAgICAgIExpbmtQcm9wZXJ0aWVzIHAgPSBudC5nZXRMaW5rUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIGlmIChwID09IG51bGwpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIExpc3QgcGlkcyA9IG1OZXRSZXF1ZXN0ZXJzUGlkc1tpXTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBqPTA7IGo8cGlkcy5zaXplKCk7IGorKykgewogICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIHBpZCA9IChJbnRlZ2VyKXBpZHMuZ2V0KGopOwogICAgICAgICAgICAgICAgICAgICBpZiAocGlkLmludFZhbHVlKCkgPT0gbXlQaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGRuc0xpc3QgPSBudC5nZXROYW1lU2VydmVycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVQaWREbnMoZG5zTGlzdCwgbXlQaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxJbmV0QWRkcmVzcz4gZG5zZXMgPSBwLmdldERuc2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVBpZERucyhkbnNlcywgbXlQaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvQnVtcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bXBEbnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEzODIsMTIgKzE1NzksMTAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCB3cml0ZVBpZERucyhTdHJpbmdbXSBkbnNMaXN0LCBpbnQgcGlkKSB7CisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUGlkRG5zKENvbGxlY3Rpb24gPEluZXRBZGRyZXNzPiBkbnNlcywgaW50IHBpZCkgewogICAgICAgICBpbnQgaiA9IDE7Ci0gICAgICAgIGZvciAoU3RyaW5nIGRucyA6IGRuc0xpc3QpIHsKLSAgICAgICAgICAgIGlmIChkbnMgIT0gbnVsbCAmJiAhVGV4dFV0aWxzLmVxdWFscyhkbnMsICIwLjAuMC4wIikpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldCgibmV0LmRucyIgKyBqKysgKyAiLiIgKyBwaWQsIGRucyk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGZvciAoSW5ldEFkZHJlc3MgZG5zIDogZG5zZXMpIHsKKyAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJuZXQuZG5zIiArIGorKyArICIuIiArIHBpZCwgZG5zLmdldEhvc3RBZGRyZXNzKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNDEwLDE2ICsxNjA1LDI0IEBACiAgICAgICAgIC8vIGFkZCBkZWZhdWx0IG5ldCdzIGRucyBlbnRyaWVzCiAgICAgICAgIE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQgPSBtTmV0VHJhY2tlcnNbbmV0VHlwZV07CiAgICAgICAgIGlmIChudCAhPSBudWxsICYmIG50LmdldE5ldHdvcmtJbmZvKCkuaXNDb25uZWN0ZWQoKSAmJiAhbnQuaXNUZWFyZG93blJlcXVlc3RlZCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBkbnNMaXN0ID0gbnQuZ2V0TmFtZVNlcnZlcnMoKTsKKyAgICAgICAgICAgIExpbmtQcm9wZXJ0aWVzIHAgPSBudC5nZXRMaW5rUHJvcGVydGllcygpOworICAgICAgICAgICAgaWYgKHAgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICAgICAgQ29sbGVjdGlvbjxJbmV0QWRkcmVzcz4gZG5zZXMgPSBwLmdldERuc2VzKCk7CiAgICAgICAgICAgICBpZiAobU5ldEF0dHJpYnV0ZXNbbmV0VHlwZV0uaXNEZWZhdWx0KCkpIHsKICAgICAgICAgICAgICAgICBpbnQgaiA9IDE7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZG5zIDogZG5zTGlzdCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZG5zICE9IG51bGwgJiYgIVRleHRVdGlscy5lcXVhbHMoZG5zLCAiMC4wLjAuMCIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGRuc2VzLnNpemUoKSA9PSAwICYmIG1EZWZhdWx0RG5zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm5vIGRucyBwcm92aWRlZCAtIHVzaW5nICIgKyBtRGVmYXVsdERucy5nZXRIb3N0QWRkcmVzcygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldCgibmV0LmRuczEiLCBtRGVmYXVsdERucy5nZXRIb3N0QWRkcmVzcygpKTsKKyAgICAgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoSW5ldEFkZHJlc3MgZG5zIDogZG5zZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYWRkaW5nIGRucyAiICsgZG5zICsgIiBmb3IgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudC5nZXROZXR3b3JrSW5mbygpLmdldFR5cGVOYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoIm5ldC5kbnMiICsgaisrLCBkbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoIm5ldC5kbnMiICsgaisrLCBkbnMuZ2V0SG9zdEFkZHJlc3MoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaz1qIDsgazxtTnVtRG5zRW50cmllczsgaysrKSB7CkBAIC0xNDMyLDExICsxNjM1LDExIEBACiAgICAgICAgICAgICAgICAgTGlzdCBwaWRzID0gbU5ldFJlcXVlc3RlcnNQaWRzW25ldFR5cGVdOwogICAgICAgICAgICAgICAgIGZvciAoaW50IHk9MDsgeTwgcGlkcy5zaXplKCk7IHkrKykgewogICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIHBpZCA9IChJbnRlZ2VyKXBpZHMuZ2V0KHkpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZVBpZERucyhkbnNMaXN0LCBwaWQuaW50VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlUGlkRG5zKGRuc2VzLCBwaWQuaW50VmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVtcERucygpOwogICAgICAgICB9Ci0gICAgICAgIGJ1bXBEbnMoKTsKICAgICB9CiAKICAgICBwcml2YXRlIGludCBnZXRSZXN0b3JlRGVmYXVsdE5ldHdvcmtEZWxheSgpIHsKQEAgLTE0OTEsNiArMTY5NCwxMyBAQAogICAgICAgICB9CiAgICAgICAgIHB3LnByaW50bG4oKTsKIAorICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIk5ldHdvcmtUcmFuc3Rpb25XYWtlTG9jayBpcyBjdXJyZW50bHkgIiArCisgICAgICAgICAgICAgICAgICAgIChtTmV0VHJhbnNpdGlvbldha2VMb2NrLmlzSGVsZCgpID8gIiIgOiAibm90ICIpICsgImhlbGQuIik7CisgICAgICAgICAgICBwdy5wcmludGxuKCJJdCB3YXMgbGFzdCByZXF1ZXN0ZWQgZm9yICIrbU5ldFRyYW5zaXRpb25XYWtlTG9ja0NhdXNlZEJ5KTsKKyAgICAgICAgfQorICAgICAgICBwdy5wcmludGxuKCk7CisKICAgICAgICAgbVRldGhlcmluZy5kdW1wKGZkLCBwdywgYXJncyk7CiAKICAgICAgICAgaWYgKG1JbmV0TG9nICE9IG51bGwpIHsKQEAgLTE1MDQsNiArMTcxNCwxMCBAQAogCiAgICAgLy8gbXVzdCBiZSBzdGF0ZWxlc3MgLSB0aGluZ3MgY2hhbmdlIHVuZGVyIHVzLgogICAgIHByaXZhdGUgY2xhc3MgTXlIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgIHB1YmxpYyBNeUhhbmRsZXIoTG9vcGVyIGxvb3BlcikgeworICAgICAgICAgICAgc3VwZXIobG9vcGVyKTsKKyAgICAgICAgfQorCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CiAgICAgICAgICAgICBOZXR3b3JrSW5mbyBpbmZvOwpAQCAtMTU2NSwyOSArMTc3OSwyNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ29ubmVjdChpbmZvKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTmV0d29ya1N0YXRlVHJhY2tlci5FVkVOVF9TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFOgotICAgICAgICAgICAgICAgICAgICBpbmZvID0gKE5ldHdvcmtJbmZvKSBtc2cub2JqOwotICAgICAgICAgICAgICAgICAgICBoYW5kbGVTY2FuUmVzdWx0c0F2YWlsYWJsZShpbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfTk9USUZJQ0FUSU9OX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbkNoYW5nZShtc2cuYXJnMSA9PSAxLCBtc2cuYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTm90aWZpY2F0aW9uKSBtc2cub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KICAgICAgICAgICAgICAgICBjYXNlIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfQ09ORklHVVJBVElPTl9DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIC0gbWFrZSB0aGlzIGhhbmRsZSBpcC9wcm94eS9nYXRld2F5L2RucyBjaGFuZ2VzCiAgICAgICAgICAgICAgICAgICAgIGluZm8gPSAoTmV0d29ya0luZm8pIG1zZy5vYmo7CiAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBpbmZvLmdldFR5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRG5zQ29uZmlndXJhdGlvbkNoYW5nZSh0eXBlKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfUk9BTUlOR19DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAvLyBmaWxsIG1lIGluCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX05FVFdPUktfU1VCVFlQRV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAvLyBmaWxsIG1lIGluCisgICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9DTEVBUl9ORVRfVFJBTlNJVElPTl9XQUtFTE9DSzoKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNhdXNlZEJ5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChDb25uZWN0aXZpdHlTZXJ2aWNlLnRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuYXJnMSA9PSBtTmV0VHJhbnNpdGlvbldha2VMb2NrU2VyaWFsTnVtYmVyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2suaXNIZWxkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZWRCeSA9IG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tDYXVzZWRCeTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY2F1c2VkQnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIk5ldFRyYW5zaXRpb24gV2FrZWxvY2sgZm9yICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZWRCeSArICIgcmVsZWFzZWQgYnkgdGltZW91dCIpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgRVZFTlRfUkVTVE9SRV9ERUZBVUxUX05FVFdPUks6CiAgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVVc2VyIHUgPSAoRmVhdHVyZVVzZXIpbXNnLm9iajsKQEAgLTE2ODEsNiArMTg5MSwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIFN0cmluZ1tdIGdldFRldGhlcmFibGVCbHVldG9vdGhSZWdleHMoKSB7CisgICAgICAgIGVuZm9yY2VUZXRoZXJBY2Nlc3NQZXJtaXNzaW9uKCk7CisgICAgICAgIGlmIChpc1RldGhlcmluZ1N1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbVRldGhlcmluZy5nZXRUZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIFRPRE8gLSBtb3ZlIGlmYWNlIGxpc3RpbmcsIHF1ZXJpZXMsIGV0YyB0byBuZXcgbW9kdWxlCiAgICAgLy8gamF2YWRvYyBmcm9tIGludGVyZmFjZQogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRUZXRoZXJhYmxlSWZhY2VzKCkgewpAQCAtMTcwOSw2ICsxOTI4LDI1IEBACiAgICAgICAgIHJldHVybiB0ZXRoZXJFbmFibGVkSW5TZXR0aW5ncyAmJiBtVGV0aGVyaW5nQ29uZmlnVmFsaWQ7CiAgICAgfQogCisgICAgLy8gQW4gQVBJIE5ldHdvcmtTdGF0ZVRyYWNrZXJzIGNhbiBjYWxsIHdoZW4gdGhleSBsb3NlIHRoZWlyIG5ldHdvcmsuCisgICAgLy8gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2xlYXJlZCBhZnRlciBYIHNlY29uZHMgb3IgYSBuZXR3b3JrIGJlY29tZXMgQ09OTkVDVEVELAorICAgIC8vIHdoaWNoZXZlciBoYXBwZW5zIGZpcnN0LiAgVGhlIHRpbWVyIGlzIHN0YXJ0ZWQgYnkgdGhlIGZpcnN0IGNhbGxlciBhbmQgbm90CisgICAgLy8gcmVzdGFydGVkIGJ5IHN1YnNlcXVlbnQgY2FsbGVycy4KKyAgICBwdWJsaWMgdm9pZCByZXF1ZXN0TmV0d29ya1RyYW5zaXRpb25XYWtlbG9jayhTdHJpbmcgZm9yV2hvbSkgeworICAgICAgICBlbmZvcmNlQ29ubmVjdGl2aXR5SW50ZXJuYWxQZXJtaXNzaW9uKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKG1OZXRUcmFuc2l0aW9uV2FrZUxvY2suaXNIZWxkKCkpIHJldHVybjsKKyAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tTZXJpYWxOdW1iZXIrKzsKKyAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja0NhdXNlZEJ5ID0gZm9yV2hvbTsKKyAgICAgICAgfQorICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBFVkVOVF9DTEVBUl9ORVRfVFJBTlNJVElPTl9XQUtFTE9DSywKKyAgICAgICAgICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrU2VyaWFsTnVtYmVyLCAwKSwKKyAgICAgICAgICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrVGltZW91dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICAvLyAxMDAgcGVyY2VudCBpcyBmdWxsIGdvb2QsIDAgaXMgZnVsbCBiYWQuCiAgICAgcHVibGljIHZvaWQgcmVwb3J0SW5ldENvbmRpdGlvbihpbnQgbmV0d29ya1R5cGUsIGludCBwZXJjZW50YWdlKSB7CiAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJyZXBvcnROZXR3b3JrQ29uZGl0aW9uKCIgKyBuZXR3b3JrVHlwZSArICIsICIgKyBwZXJjZW50YWdlICsgIikiKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0NvdW50cnlEZXRlY3RvclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0NvdW50cnlEZXRlY3RvclNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDgxZWJlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ291bnRyeURldGVjdG9yU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIubG9jYXRpb24uQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeTsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLklDb3VudHJ5RGV0ZWN0b3I7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5JQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworCisvKioKKyAqIFRoaXMgY2xhc3MgZGV0ZWN0cyB0aGUgY291bnRyeSB0aGF0IHRoZSB1c2VyIGlzIGluIHRocm91Z2gKKyAqIHtAbGluayBDb21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yfS4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQ291bnRyeURldGVjdG9yU2VydmljZSBleHRlbmRzIElDb3VudHJ5RGV0ZWN0b3IuU3R1YiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzcyByZXByZXNlbnRzIHRoZSByZW1vdGUgbGlzdGVuZXIsIGl0IHdpbGwgYWxzbyByZW1vdmVzIGl0c2VsZgorICAgICAqIGZyb20gbGlzdGVuZXIgbGlzdCB3aGVuIHRoZSByZW1vdGUgcHJvY2VzcyB3YXMgZGllZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFJlY2VpdmVyIGltcGxlbWVudHMgSUJpbmRlci5EZWF0aFJlY2lwaWVudCB7CisgICAgICAgIHByaXZhdGUgZmluYWwgSUNvdW50cnlMaXN0ZW5lciBtTGlzdGVuZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgSUJpbmRlciBtS2V5OworCisgICAgICAgIHB1YmxpYyBSZWNlaXZlcihJQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgICAgIG1LZXkgPSBsaXN0ZW5lci5hc0JpbmRlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYmluZGVyRGllZCgpIHsKKyAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKG1LZXkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXJPYmopIHsKKyAgICAgICAgICAgIGlmIChvdGhlck9iaiBpbnN0YW5jZW9mIFJlY2VpdmVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1LZXkuZXF1YWxzKCgoUmVjZWl2ZXIpIG90aGVyT2JqKS5tS2V5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1LZXkuaGFzaENvZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJQ291bnRyeUxpc3RlbmVyIGdldExpc3RlbmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1MaXN0ZW5lcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiQ291bnRyeURldGVjdG9yU2VydmljZSI7CisKKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8SUJpbmRlciwgUmVjZWl2ZXI+IG1SZWNlaXZlcnM7CisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvciBtQ291bnRyeURldGVjdG9yOworICAgIHByaXZhdGUgYm9vbGVhbiBtU3lzdGVtUmVhZHk7CisgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOworICAgIHByaXZhdGUgQ291bnRyeUxpc3RlbmVyIG1Mb2NhdGlvbkJhc2VkRGV0ZWN0b3JMaXN0ZW5lcjsKKworICAgIHB1YmxpYyBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBtUmVjZWl2ZXJzID0gbmV3IEhhc2hNYXA8SUJpbmRlciwgUmVjZWl2ZXI+KCk7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ291bnRyeSBkZXRlY3RDb3VudHJ5KCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbVN5c3RlbVJlYWR5KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUmVtb3RlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Db3VudHJ5RGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgSUNvdW50cnlMaXN0ZW5lciBpbnRvIHRoZSBsaXN0ZW5lciBsaXN0LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZENvdW50cnlMaXN0ZW5lcihJQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtU3lzdGVtUmVhZHkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBhZGRMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBJQ291bnRyeUxpc3RlbmVyIGZyb20gdGhlIGxpc3RlbmVyIGxpc3QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQ291bnRyeUxpc3RlbmVyKElDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBpZiAoIW1TeXN0ZW1SZWFkeSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlbW90ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyLmFzQmluZGVyKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcihJQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobVJlY2VpdmVycykgeworICAgICAgICAgICAgUmVjZWl2ZXIgciA9IG5ldyBSZWNlaXZlcihsaXN0ZW5lcik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLmFzQmluZGVyKCkubGlua1RvRGVhdGgociwgMCk7CisgICAgICAgICAgICAgICAgbVJlY2VpdmVycy5wdXQobGlzdGVuZXIuYXNCaW5kZXIoKSwgcik7CisgICAgICAgICAgICAgICAgaWYgKG1SZWNlaXZlcnMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIlRoZSBmaXJzdCBsaXN0ZW5lciBpcyBhZGRlZCIpOworICAgICAgICAgICAgICAgICAgICBzZXRDb3VudHJ5TGlzdGVuZXIobUxvY2F0aW9uQmFzZWREZXRlY3Rvckxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJsaW5rVG9EZWF0aCBmYWlsZWQ6IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUJpbmRlciBrZXkpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtUmVjZWl2ZXJzKSB7CisgICAgICAgICAgICBtUmVjZWl2ZXJzLnJlbW92ZShrZXkpOworICAgICAgICAgICAgaWYgKG1SZWNlaXZlcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgc2V0Q291bnRyeUxpc3RlbmVyKG51bGwpOworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJObyBsaXN0ZW5lciBpcyBsZWZ0Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeVJlY2VpdmVycyhDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1SZWNlaXZlcnMpIHsKKyAgICAgICAgICAgIGZvciAoUmVjZWl2ZXIgcmVjZWl2ZXIgOiBtUmVjZWl2ZXJzLnZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXIuZ2V0TGlzdGVuZXIoKS5vbkNvdW50cnlEZXRlY3RlZChjb3VudHJ5KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBTaGFsbCB3ZSByZW1vdmUgdGhlIHJlY2VpdmVyPworICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAibm90aWZ5UmVjZWl2ZXJzIGZhaWxlZDoiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHN5c3RlbVJlYWR5KCkgeworICAgICAgICAvLyBTaGFsbCB3ZSB3YWl0IGZvciB0aGUgaW5pdGlhbGl6YXRpb24gZmluaXNoLgorICAgICAgICBUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCh0aGlzLCAiQ291bnRyeURldGVjdG9yU2VydmljZSIpOworICAgICAgICB0aHJlYWQuc3RhcnQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgbUNvdW50cnlEZXRlY3RvciA9IG5ldyBDb21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yKG1Db250ZXh0KTsKKyAgICAgICAgbUxvY2F0aW9uQmFzZWREZXRlY3Rvckxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ291bnRyeURldGVjdGVkKGZpbmFsIENvdW50cnkgY291bnRyeSkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlSZWNlaXZlcnMoY291bnRyeSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIFByb2Nlc3Muc2V0VGhyZWFkUHJpb3JpdHkoUHJvY2Vzcy5USFJFQURfUFJJT1JJVFlfQkFDS0dST1VORCk7CisgICAgICAgIExvb3Blci5wcmVwYXJlKCk7CisgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICAgICAgaW5pdGlhbGl6ZSgpOworICAgICAgICBtU3lzdGVtUmVhZHkgPSB0cnVlOworICAgICAgICBMb29wZXIubG9vcCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldENvdW50cnlMaXN0ZW5lcihmaW5hbCBDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtQ291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8vIEZvciB0ZXN0aW5nCisgICAgYm9vbGVhbiBpc1N5c3RlbVJlYWR5KCkgeworICAgICAgICByZXR1cm4gbVN5c3RlbVJlYWR5OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RlbW9EYXRhU2V0LmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZW1vRGF0YVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzc5ODVmLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RlbW9EYXRhU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuSW1hZ2VzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIERlbW9EYXRhU2V0Ci17Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExPR19UQUcgPSAiRGVtb0RhdGFTZXQiOwotCi0gICAgcHJpdmF0ZSBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKLQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFkZChDb250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBtQ29udGVudFJlc29sdmVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLQotICAgICAgICAvLyBSZW1vdmUgYWxsIHRoZSBvbGQgZGF0YQotICAgICAgICBtQ29udGVudFJlc29sdmVyLmRlbGV0ZShDb250YWN0cy5QZW9wbGUuQ09OVEVOVF9VUkksIG51bGwsIG51bGwpOwotCi0gICAgICAgIC8vIEFkZCB0aGUgbmV3IGRhdGEKLSAgICAgICAgYWRkRGVmYXVsdERhdGEoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFkZCBpbWFnZXMgZnJvbSAvYW5kcm9pZC9pbWFnZXMKLSAgICAgICAgYWRkRGVmYXVsdEltYWdlcygpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgdm9pZCBhZGREZWZhdWx0SW1hZ2VzKCkKLSAgICB7Ci0gICAgICAgIEZpbGUgcm9vdERpcmVjdG9yeSA9IEVudmlyb25tZW50LmdldFJvb3REaXJlY3RvcnkoKTsKLSAgICAgICAgU3RyaW5nIFtdIGZpbGVzCi0gICAgICAgICAgICA9IG5ldyBGaWxlKHJvb3REaXJlY3RvcnksICJpbWFnZXMiKS5saXN0KCk7Ci0gICAgICAgIGludCBjb3VudCA9IGZpbGVzLmxlbmd0aDsKLQotICAgICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAgICAgU2xvZy5pKExPR19UQUcsICJhZGREZWZhdWx0SW1hZ2VzOiBubyBpbWFnZXMgZm91bmQhIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZmlsZXNbaV07Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHJvb3REaXJlY3RvcnkgKyAiLyIgKyBuYW1lOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEltYWdlcy5NZWRpYS5pbnNlcnRJbWFnZShtQ29udGVudFJlc29sdmVyLCBwYXRoLCBuYW1lLCBudWxsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKExPR19UQUcsICJGYWlsZWQgdG8gaW1wb3J0IGltYWdlICIgKyBwYXRoLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgYWRkRGVmYXVsdERhdGEoKQotICAgIHsKLSAgICAgICAgU2xvZy5pKExPR19UQUcsICJBZGRpbmcgZGVmYXVsdCBkYXRhLi4uIik7Ci0KLS8vICAgICAgIGFkZEltYWdlKCJWaW9sZXQiLCAiaW1hZ2VzL3Zpb2xldC5wbmciKTsKLS8vICAgICAgIGFkZEltYWdlKCJDb3JreSIsICJpbWFnZXMvY29ya3kucG5nIik7Ci0KLSAgICAgICAgLy8gUEVORElORzogc2hvdWxkIHRoaXMgYmUgZG9uZSBoZXJlPyE/IQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgKLSAgICAgICAgICAgICAgICBJbnRlbnQuQUNUSU9OX0NBTEwsIFVyaS5mcm9tUGFydHMoInZvaWNlbWFpbCIsICIiLCBudWxsKSk7Ci0gICAgICAgIGFkZFNob3J0Y3V0KCIxIiwgaW50ZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFVyaSBhZGRJbWFnZShTdHJpbmcgbmFtZSwgVXJpIGZpbGUpCi0gICAgewotICAgICAgICBDb250ZW50VmFsdWVzIGltYWdldiA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIGltYWdldi5wdXQoIm5hbWUiLCBuYW1lKTsKLQotICAgICAgICBVcmkgdXJsID0gbnVsbDsKLQotICAgICAgICBBc3NldE1hbmFnZXIgYXNzID0gQXNzZXRNYW5hZ2VyLmdldFN5c3RlbSgpOwotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGluID0gYXNzLm9wZW4oZmlsZS50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgdXJsID0gbUNvbnRlbnRSZXNvbHZlci5pbnNlcnQoSW1hZ2VzLk1lZGlhLklOVEVSTkFMX0NPTlRFTlRfVVJJLCBpbWFnZXYpOwotICAgICAgICAgICAgb3V0ID0gbUNvbnRlbnRSZXNvbHZlci5vcGVuT3V0cHV0U3RyZWFtKHVybCk7Ci0KLSAgICAgICAgICAgIGZpbmFsIGludCBzaXplID0gOCAqIDEwMjQ7Ci0gICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07Ci0KLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvdW50ID0gaW4ucmVhZChidWYsIDAsIHNpemUpOwotICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgY291bnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gd2hpbGUgKGNvdW50ID4gMCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTbG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBpbnNlcnQgaW1hZ2UgJyIgKyBmaWxlICsgIiciLCBlKTsKLSAgICAgICAgICAgIHVybCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdXJsOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgVXJpIGFkZFNob3J0Y3V0KFN0cmluZyBzaG9ydGN1dCwgSW50ZW50IGludGVudCkKLSAgICB7Ci0gICAgICAgIGlmIChDb25maWcuTE9HVikgU2xvZy52KExPR19UQUcsICJhZGRTaG9ydGN1dDogc2hvcnRjdXQ9IiArIHNob3J0Y3V0ICsgIiwgaW50ZW50PSIgKyBpbnRlbnQpOwotICAgICAgICByZXR1cm4gU2V0dGluZ3MuQm9va21hcmtzLmFkZChtQ29udGVudFJlc29sdmVyLCBpbnRlbnQsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0Y3V0ICE9IG51bGwgPyBzaG9ydGN1dC5jaGFyQXQoMCkgOiAwLCAwKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCAyMTI3M2NjLi4yODEyNmI5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTMzLDYgKzMzLDcgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5hZG1pbi5JRGV2aWNlUG9saWN5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKQEAgLTQ2LDYgKzQ3LDggQEAKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5uZXQuUHJveHk7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUHJpbnRXcml0ZXJQcmludGVyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QcmludGVyOwpAQCAtNTksNDYgKzYyLDY2IEBACiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKgogICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRldmljZSBwb2xpY3kgQVBJcy4KICAqLwogcHVibGljIGNsYXNzIERldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlIGV4dGVuZHMgSURldmljZVBvbGljeU1hbmFnZXIuU3R1YiB7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UiOwotICAgIAorCiAgICAgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKICAgICBmaW5hbCBNeVBhY2thZ2VNb25pdG9yIG1Nb25pdG9yOwogCiAgICAgSVBvd2VyTWFuYWdlciBtSVBvd2VyTWFuYWdlcjsKLSAgICAKKwogICAgIGludCBtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEOwogICAgIGludCBtQWN0aXZlUGFzc3dvcmRMZW5ndGggPSAwOworICAgIGludCBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgPSAwOworICAgIGludCBtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UgPSAwOworICAgIGludCBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzID0gMDsKKyAgICBpbnQgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZFN5bWJvbHMgPSAwOworICAgIGludCBtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIgPSAwOwogICAgIGludCBtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyA9IDA7Ci0gICAgCisKICAgICBpbnQgbVBhc3N3b3JkT3duZXIgPSAtMTsKLSAgICAKKwogICAgIGZpbmFsIEhhc2hNYXA8Q29tcG9uZW50TmFtZSwgQWN0aXZlQWRtaW4+IG1BZG1pbk1hcAogICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxDb21wb25lbnROYW1lLCBBY3RpdmVBZG1pbj4oKTsKICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aXZlQWRtaW4+IG1BZG1pbkxpc3QKICAgICAgICAgICAgID0gbmV3IEFycmF5TGlzdDxBY3RpdmVBZG1pbj4oKTsKLSAgICAKKwogICAgIHN0YXRpYyBjbGFzcyBBY3RpdmVBZG1pbiB7CiAgICAgICAgIGZpbmFsIERldmljZUFkbWluSW5mbyBpbmZvOwotICAgICAgICAKKwogICAgICAgICBpbnQgcGFzc3dvcmRRdWFsaXR5ID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEOwogICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTGVuZ3RoID0gMDsKKyAgICAgICAgaW50IHBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9IDA7CisgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmRVcHBlckNhc2UgPSAwOworICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTG93ZXJDYXNlID0gMDsKKyAgICAgICAgaW50IG1pbmltdW1QYXNzd29yZExldHRlcnMgPSAxOworICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTnVtZXJpYyA9IDE7CisgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmRTeW1ib2xzID0gMTsKKyAgICAgICAgaW50IG1pbmltdW1QYXNzd29yZE5vbkxldHRlciA9IDA7CiAgICAgICAgIGxvbmcgbWF4aW11bVRpbWVUb1VubG9jayA9IDA7CiAgICAgICAgIGludCBtYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSA9IDA7Ci0gICAgICAgIAorCisgICAgICAgIC8vIFRPRE86IHJldmlldyBpbXBsZW1lbnRhdGlvbiBkZWNpc2lvbnMgd2l0aCBmcmFtZXdvcmtzIHRlYW0KKyAgICAgICAgYm9vbGVhbiBzcGVjaWZpZXNHbG9iYWxQcm94eSA9IGZhbHNlOworICAgICAgICBTdHJpbmcgZ2xvYmFsUHJveHlTcGVjID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCA9IG51bGw7CisKICAgICAgICAgQWN0aXZlQWRtaW4oRGV2aWNlQWRtaW5JbmZvIF9pbmZvKSB7CiAgICAgICAgICAgICBpbmZvID0gX2luZm87CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgaW50IGdldFVpZCgpIHsgcmV0dXJuIGluZm8uZ2V0QWN0aXZpdHlJbmZvKCkuYXBwbGljYXRpb25JbmZvLnVpZDsgfQotICAgICAgICAKKwogICAgICAgICB2b2lkIHdyaXRlVG9YbWwoWG1sU2VyaWFsaXplciBvdXQpCiAgICAgICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgInBvbGljaWVzIik7CkBAIC0xMTEsNyArMTM0LDQyIEBACiAgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZExlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJtaW4tcGFzc3dvcmQtbGVuZ3RoIik7CiAgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtaW5pbXVtUGFzc3dvcmRMZW5ndGgpKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibW4tcGFzc3dvcmQtbGVuZ3RoIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1sZW5ndGgiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYocGFzc3dvcmRIaXN0b3J5TGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgInBhc3N3b3JkLWhpc3RvcnktbGVuZ3RoIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhwYXNzd29yZEhpc3RvcnlMZW5ndGgpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAicGFzc3dvcmQtaGlzdG9yeS1sZW5ndGgiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJtaW4tcGFzc3dvcmQtdXBwZXJjYXNlIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtaW5pbXVtUGFzc3dvcmRVcHBlckNhc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLXVwcGVyY2FzZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWluaW11bVBhc3N3b3JkTG93ZXJDYXNlID4gMCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1sb3dlcmNhc2UiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZExvd2VyQ2FzZSkpOworICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtaW4tcGFzc3dvcmQtbG93ZXJjYXNlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtaW5pbXVtUGFzc3dvcmRMZXR0ZXJzID4gMCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1sZXR0ZXJzIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtaW5pbXVtUGFzc3dvcmRMZXR0ZXJzKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1sZXR0ZXJzIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtaW5pbXVtUGFzc3dvcmROdW1lcmljID4gMCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1udW1lcmljIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtaW5pbXVtUGFzc3dvcmROdW1lcmljKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1udW1lcmljIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtaW5pbXVtUGFzc3dvcmRTeW1ib2xzID4gMCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1zeW1ib2xzIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtaW5pbXVtUGFzc3dvcmRTeW1ib2xzKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1zeW1ib2xzIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtaW5pbXVtUGFzc3dvcmROb25MZXR0ZXIgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLW5vbmxldHRlciIpOworICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcobWluaW11bVBhc3N3b3JkTm9uTGV0dGVyKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1ub25sZXR0ZXIiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobWF4aW11bVRpbWVUb1VubG9jayAhPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQpIHsKQEAgLTEyNCw4ICsxODIsMjMgQEAKICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcobWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUpKTsKICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtYXgtZmFpbGVkLXBhc3N3b3JkLXdpcGUiKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzcGVjaWZpZXNHbG9iYWxQcm94eSkgeworICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAic3BlY2lmaWVzLWdsb2JhbC1wcm94eSIpOworICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgQm9vbGVhbi50b1N0cmluZyhzcGVjaWZpZXNHbG9iYWxQcm94eSkpOworICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgInNwZWNpZmllc19nbG9iYWxfcHJveHkiKTsKKyAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsUHJveHlTcGVjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJnbG9iYWwtcHJveHktc3BlYyIpOworICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIGdsb2JhbFByb3h5U3BlYyk7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgImdsb2JhbC1wcm94eS1zcGVjIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChnbG9iYWxQcm94eUV4Y2x1c2lvbkxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgImdsb2JhbC1wcm94eS1leGNsdXNpb24tbGlzdCIpOworICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIGdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCk7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgImdsb2JhbC1wcm94eS1leGNsdXNpb24tbGlzdCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICB2b2lkIHJlYWRGcm9tWG1sKFhtbFB1bGxQYXJzZXIgcGFyc2VyKQogICAgICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgICAgICBpbnQgb3V0ZXJEZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOwpAQCAtMTQ0LDE5ICsyMTcsNDkgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJtaW4tcGFzc3dvcmQtbGVuZ3RoIi5lcXVhbHModGFnKSkgewogICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUGFzc3dvcmRMZW5ndGggPSBJbnRlZ2VyLnBhcnNlSW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgicGFzc3dvcmQtaGlzdG9yeS1sZW5ndGgiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJtaW4tcGFzc3dvcmQtdXBwZXJjYXNlIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUGFzc3dvcmRVcHBlckNhc2UgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLWxvd2VyY2FzZSIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgbWluaW11bVBhc3N3b3JkTG93ZXJDYXNlID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC1sZXR0ZXJzIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUGFzc3dvcmRMZXR0ZXJzID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC1udW1lcmljIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUGFzc3dvcmROdW1lcmljID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC1zeW1ib2xzIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUGFzc3dvcmRTeW1ib2xzID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC1ub25sZXR0ZXIiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZE5vbkxldHRlciA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJtYXgtdGltZS10by11bmxvY2siLmVxdWFscyh0YWcpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1heGltdW1UaW1lVG9VbmxvY2sgPSBMb25nLnBhcnNlTG9uZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1heC1mYWlsZWQtcGFzc3dvcmQtd2lwZSIuZXF1YWxzKHRhZykpIHsKICAgICAgICAgICAgICAgICAgICAgbWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUgPSBJbnRlZ2VyLnBhcnNlSW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgic3BlY2lmaWVzLWdsb2JhbC1wcm94eSIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzR2xvYmFsUHJveHkgPSBCb29sZWFuLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJnbG9iYWwtcHJveHktc3BlYyIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xvYmFsUHJveHlTcGVjID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJnbG9iYWwtcHJveHktZXhjbHVzaW9uLWxpc3QiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIGdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlVua25vd24gYWRtaW4gdGFnOiAiICsgdGFnKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgWG1sVXRpbHMuc2tpcEN1cnJlbnRUYWcocGFyc2VyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICB2b2lkIGR1bXAoU3RyaW5nIHByZWZpeCwgUHJpbnRXcml0ZXIgcHcpIHsKICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJ1aWQ9Iik7IHB3LnByaW50bG4oZ2V0VWlkKCkpOwogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnRsbigicG9saWNpZXM6Iik7CkBAIC0xNjcsMjMgKzI3MCw0NyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJwYXNzd29yZFF1YWxpdHk9MHgiKTsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoSW50ZWdlci50b0hleFN0cmluZyhwYXNzd29yZFF1YWxpdHkpKTsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBtaW5pbXVtUGFzc3dvcmRMZW5ndGg9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oSW50ZWdlci50b0hleFN0cmluZyhwYXNzd29yZFF1YWxpdHkpKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtaW5pbXVtUGFzc3dvcmRMZW5ndGg9Iik7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWluaW11bVBhc3N3b3JkTGVuZ3RoKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJwYXNzd29yZEhpc3RvcnlMZW5ndGg9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4ocGFzc3dvcmRIaXN0b3J5TGVuZ3RoKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtaW5pbXVtUGFzc3dvcmRVcHBlckNhc2U9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWluaW11bVBhc3N3b3JkVXBwZXJDYXNlKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2U9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWluaW11bVBhc3N3b3JkTG93ZXJDYXNlKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtaW5pbXVtUGFzc3dvcmRMZXR0ZXJzPSIpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKG1pbmltdW1QYXNzd29yZExldHRlcnMpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZE51bWVyaWM9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWluaW11bVBhc3N3b3JkTnVtZXJpYyk7CisgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgibWluaW11bVBhc3N3b3JkU3ltYm9scz0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmRTeW1ib2xzKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtaW5pbXVtUGFzc3dvcmROb25MZXR0ZXI9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWluaW11bVBhc3N3b3JkTm9uTGV0dGVyKTsKICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtYXhpbXVtVGltZVRvVW5sb2NrPSIpOwogICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKG1heGltdW1UaW1lVG9VbmxvY2spOwogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlPSIpOwogICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKG1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJzcGVjaWZpZXNHbG9iYWxQcm94eT0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihzcGVjaWZpZXNHbG9iYWxQcm94eSk7CisgICAgICAgICAgICBpZiAoZ2xvYmFsUHJveHlTcGVjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiZ2xvYmFsUHJveHlTcGVjPSIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihnbG9iYWxQcm94eVNwZWMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoImdsb2JhbFByb3h5RWNsdXNpb25MaXN0PSIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihnbG9iYWxQcm94eUV4Y2x1c2lvbkxpc3QpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgY2xhc3MgTXlQYWNrYWdlTW9uaXRvciBleHRlbmRzIFBhY2thZ2VNb25pdG9yIHsKICAgICAgICAgcHVibGljIHZvaWQgb25Tb21lUGFja2FnZXNDaGFuZ2VkKCkgewogICAgICAgICAgICAgc3luY2hyb25pemVkIChEZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZS50aGlzKSB7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiByZW1vdmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT1tQWRtaW5MaXN0LnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKICAgICAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWEgPSBtQWRtaW5MaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5nZSA9IGlzUGFja2FnZURpc2FwcGVhcmluZyhhYS5pbmZvLmdldFBhY2thZ2VOYW1lKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5nZSA9IGlzUGFja2FnZURpc2FwcGVhcmluZyhhYS5pbmZvLmdldFBhY2thZ2VOYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlID09IFBBQ0tBR0VfUEVSTUFORU5UX0NIQU5HRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNoYW5nZSA9PSBQQUNLQUdFX1RFTVBPUkFSWV9DSEFOR0UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJBZG1pbiB1bmV4cGVjdGVkbHkgdW5pbnN0YWxsZWQ6ICIKQEAgLTIwOCw3ICszMzUsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogSW5zdGFudGlhdGVzIHRoZSBzZXJ2aWNlLgogICAgICAqLwpAQCAtMjI1LDcgKzM1Miw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG1JUG93ZXJNYW5hZ2VyOwogICAgIH0KLSAgICAKKwogICAgIEFjdGl2ZUFkbWluIGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKENvbXBvbmVudE5hbWUgd2hvKSB7CiAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTWFwLmdldCh3aG8pOwogICAgICAgICBpZiAoYWRtaW4gIT0gbnVsbApAQCAtMjM1LDcgKzM2Miw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQotICAgIAorCiAgICAgQWN0aXZlQWRtaW4gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQoQ29tcG9uZW50TmFtZSB3aG8sIGludCByZXFQb2xpY3kpCiAgICAgICAgICAgICB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBpbnQgY2FsbGluZ1VpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7CkBAIC0yNjYsMTMgKzM5MywxMyBAQAogICAgICAgICAgICAgICAgICAgICArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkgKyAiIGZvciBwb2xpY3kgIyIgKyByZXFQb2xpY3kpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgdm9pZCBzZW5kQWRtaW5Db21tYW5kTG9ja2VkKEFjdGl2ZUFkbWluIGFkbWluLCBTdHJpbmcgYWN0aW9uKSB7CiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGFjdGlvbik7CiAgICAgICAgIGludGVudC5zZXRDb21wb25lbnQoYWRtaW4uaW5mby5nZXRDb21wb25lbnQoKSk7CiAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKICAgICB9Ci0gICAgCisKICAgICB2b2lkIHNlbmRBZG1pbkNvbW1hbmRMb2NrZWQoU3RyaW5nIGFjdGlvbiwgaW50IHJlcVBvbGljeSkgewogICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwogICAgICAgICBpZiAoTiA+IDApIHsKQEAgLTI4NCwxOSArNDExLDI0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICB2b2lkIHJlbW92ZUFjdGl2ZUFkbWluTG9ja2VkKENvbXBvbmVudE5hbWUgYWRtaW5SZWNlaXZlcikgewogICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKGFkbWluUmVjZWl2ZXIpOwogICAgICAgICBpZiAoYWRtaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgYm9vbGVhbiBkb1Byb3h5Q2xlYW51cCA9CisgICAgICAgICAgICAgICAgYWRtaW4uaW5mby51c2VzUG9saWN5KERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9TRVRTX0dMT0JBTF9QUk9YWSk7CiAgICAgICAgICAgICBzZW5kQWRtaW5Db21tYW5kTG9ja2VkKGFkbWluLAogICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pblJlY2VpdmVyLkFDVElPTl9ERVZJQ0VfQURNSU5fRElTQUJMRUQpOwogICAgICAgICAgICAgLy8gWFhYIG5lZWQgdG8gd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuCiAgICAgICAgICAgICBtQWRtaW5MaXN0LnJlbW92ZShhZG1pbik7CiAgICAgICAgICAgICBtQWRtaW5NYXAucmVtb3ZlKGFkbWluUmVjZWl2ZXIpOwogICAgICAgICAgICAgdmFsaWRhdGVQYXNzd29yZE93bmVyTG9ja2VkKCk7CisgICAgICAgICAgICBpZiAoZG9Qcm94eUNsZWFudXApIHsKKyAgICAgICAgICAgICAgICByZXNldEdsb2JhbFByb3h5KCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgRGV2aWNlQWRtaW5JbmZvIGZpbmRBZG1pbihDb21wb25lbnROYW1lIGFkbWluTmFtZSkgewogICAgICAgICBJbnRlbnQgcmVzb2x2ZUludGVudCA9IG5ldyBJbnRlbnQoKTsKICAgICAgICAgcmVzb2x2ZUludGVudC5zZXRDb21wb25lbnQoYWRtaW5OYW1lKTsKQEAgLTMwNSw3ICs0MzcsNyBAQAogICAgICAgICBpZiAoaW5mb3MgPT0gbnVsbCB8fCBpbmZvcy5zaXplKCkgPD0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBhZG1pbjogIiArIGFkbWluTmFtZSk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldHVybiBuZXcgRGV2aWNlQWRtaW5JbmZvKG1Db250ZXh0LCBpbmZvcy5nZXQoMCkpOwogICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpIHsKQEAgLTMxNiw3ICs0NDgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIHN0YXRpYyBKb3VybmFsZWRGaWxlIG1ha2VKb3VybmFsZWRGaWxlKCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgYmFzZSA9ICIvZGF0YS9zeXN0ZW0vZGV2aWNlX3BvbGljaWVzLnhtbCI7CiAgICAgICAgIHJldHVybiBuZXcgSm91cm5hbGVkRmlsZShuZXcgRmlsZShiYXNlKSwgbmV3IEZpbGUoYmFzZSArICIudG1wIikpOwpAQCAtMzMyLDcgKzQ2NCw3IEBACiAgICAgICAgICAgICBvdXQuc3RhcnREb2N1bWVudChudWxsLCB0cnVlKTsKIAogICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJwb2xpY2llcyIpOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBtQWRtaW5MaXN0LmdldChpKTsKQEAgLTM0MywyNiArNDc1LDM2IEBACiAgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgImFkbWluIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmIChtUGFzc3dvcmRPd25lciA+PSAwKSB7CiAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJwYXNzd29yZC1vd25lciIpOwogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtUGFzc3dvcmRPd25lcikpOwogICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgInBhc3N3b3JkLW93bmVyIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzICE9IDApIHsKICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgImZhaWxlZC1wYXNzd29yZC1hdHRlbXB0cyIpOwogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cykpOwogICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgImZhaWxlZC1wYXNzd29yZC1hdHRlbXB0cyIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSAhPSAwIHx8IG1BY3RpdmVQYXNzd29yZExlbmd0aCAhPSAwKSB7CisKKyAgICAgICAgICAgIGlmIChtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoICE9IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgbUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlICE9IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycyAhPSAwIHx8IG1BY3RpdmVQYXNzd29yZE51bWVyaWMgIT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyICE9IDApIHsKICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgImFjdGl2ZS1wYXNzd29yZCIpOwogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInF1YWxpdHkiLCBJbnRlZ2VyLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZFF1YWxpdHkpKTsKICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJsZW5ndGgiLCBJbnRlZ2VyLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZExlbmd0aCkpOworICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInVwcGVyY2FzZSIsIEludGVnZXIudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlKSk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAibG93ZXJjYXNlIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJsZXR0ZXJzIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzKSk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAibnVtZXJpYyIsIEludGVnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmROdW1lcmljKSk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAic3ltYm9scyIsIEludGVnZXIudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkU3ltYm9scykpOworICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgIm5vbmxldHRlciIsIEludGVnZXIudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyKSk7CiAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiYWN0aXZlLXBhc3N3b3JkIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAicG9saWNpZXMiKTsKIAogICAgICAgICAgICAgb3V0LmVuZERvY3VtZW50KCk7CkBAIC00NDAsNiArNTgyLDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJxdWFsaXR5IikpOwogICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMZW5ndGggPSBJbnRlZ2VyLnBhcnNlSW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAibGVuZ3RoIikpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidXBwZXJjYXNlIikpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAibG93ZXJjYXNlIikpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgImxldHRlcnMiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE51bWVyaWMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAibnVtZXJpYyIpKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkU3ltYm9scyA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJzeW1ib2xzIikpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAibm9ubGV0dGVyIikpOwogICAgICAgICAgICAgICAgICAgICBYbWxVdGlscy5za2lwQ3VycmVudFRhZyhwYXJzZXIpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJVbmtub3duIHRhZzogIiArIHRhZyk7CkBAIC00NzksMTAgKzYzMywxNiBAQAogICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcodXRpbHMuZ2V0QWN0aXZlUGFzc3dvcmRRdWFsaXR5KCkpKTsKICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQ7CiAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMZW5ndGggPSAwOworICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlID0gMDsKKyAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSA9IDA7CisgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzID0gMDsKKyAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE51bWVyaWMgPSAwOworICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkU3ltYm9scyA9IDA7CisgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIgPSAwOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHZhbGlkYXRlUGFzc3dvcmRPd25lckxvY2tlZCgpOwotICAgICAgICAKKwogICAgICAgICBsb25nIHRpbWVNcyA9IGdldE1heGltdW1UaW1lVG9Mb2NrKG51bGwpOwogICAgICAgICBpZiAodGltZU1zIDw9IDApIHsKICAgICAgICAgICAgIHRpbWVNcyA9IEludGVnZXIuTUFYX1ZBTFVFOwpAQCAtNTAxLDEyICs2NjEsMTMgQEAKICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX05VTUVSSUM6CiAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDOgogICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDOgorICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWDoKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBxdWFsaXR5IGNvbnN0YW50OiAweCIKICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcocXVhbGl0eSkpOwogICAgIH0KLSAgICAKKwogICAgIHZvaWQgdmFsaWRhdGVQYXNzd29yZE93bmVyTG9ja2VkKCkgewogICAgICAgICBpZiAobVBhc3N3b3JkT3duZXIgPj0gMCkgewogICAgICAgICAgICAgYm9vbGVhbiBoYXZlT3duZXIgPSBmYWxzZTsKQEAgLTUyMywxNyArNjg0LDE3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzeXN0ZW1SZWFkeSgpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBsb2FkU2V0dGluZ3NMb2NrZWQoKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZUFkbWluKENvbXBvbmVudE5hbWUgYWRtaW5SZWNlaXZlcikgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJJTkRfREVWSUNFX0FETUlOLCBudWxsKTsKLSAgICAgICAgCisKICAgICAgICAgRGV2aWNlQWRtaW5JbmZvIGluZm8gPSBmaW5kQWRtaW4oYWRtaW5SZWNlaXZlcik7CiAgICAgICAgIGlmIChpbmZvID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBhZG1pbjogIiArIGFkbWluUmVjZWl2ZXIpOwpAQCAtNTU1LDEzICs3MTYsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBib29sZWFuIGlzQWRtaW5BY3RpdmUoQ29tcG9uZW50TmFtZSBhZG1pblJlY2VpdmVyKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgcmV0dXJuIGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKGFkbWluUmVjZWl2ZXIpICE9IG51bGw7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgTGlzdDxDb21wb25lbnROYW1lPiBnZXRBY3RpdmVBZG1pbnMoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKQEAgLTU3NSw3ICs3MzYsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBib29sZWFuIHBhY2thZ2VIYXNBY3RpdmVBZG1pbnMoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKQEAgLTU4Nyw3ICs3NDgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlQWN0aXZlQWRtaW4oQ29tcG9uZW50TmFtZSBhZG1pblJlY2VpdmVyKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZChhZG1pblJlY2VpdmVyKTsKQEAgLTYwNiwxMCArNzY3LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZFF1YWxpdHkoQ29tcG9uZW50TmFtZSB3aG8sIGludCBxdWFsaXR5KSB7CiAgICAgICAgIHZhbGlkYXRlUXVhbGl0eUNvbnN0YW50KHF1YWxpdHkpOwotICAgICAgICAKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CkBAIC02MjIsMTYgKzc4MywxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGludCBnZXRQYXNzd29yZFF1YWxpdHkoQ29tcG9uZW50TmFtZSB3aG8pIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpbnQgbW9kZSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRDsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5wYXNzd29yZFF1YWxpdHkgOiBtb2RlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgICAgICBmb3IgIChpbnQgaT0wOyBpPE47IGkrKykgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CkBAIC02NDIsNyArODAzLDcgQEAKICAgICAgICAgICAgIHJldHVybiBtb2RlOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CkBAIC02NTYsMTYgKzgxNywxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1MZW5ndGgoQ29tcG9uZW50TmFtZSB3aG8pIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5taW5pbXVtUGFzc3dvcmRMZW5ndGggOiBsZW5ndGg7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKICAgICAgICAgICAgIGZvciAgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKQEAgLTY3NiwxOCArODM3LDI2NyBAQAogICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGlmIChhcC5wYXNzd29yZEhpc3RvcnlMZW5ndGggIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAucGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgoQ29tcG9uZW50TmFtZSB3aG8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ucGFzc3dvcmRIaXN0b3J5TGVuZ3RoIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCBhZG1pbi5wYXNzd29yZEhpc3RvcnlMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gYWRtaW4ucGFzc3dvcmRIaXN0b3J5TGVuZ3RoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7CisgICAgICAgICAgICBpZiAoYXAubWluaW11bVBhc3N3b3JkVXBwZXJDYXNlICE9IGxlbmd0aCkgeworICAgICAgICAgICAgICAgIGFwLm1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKENvbXBvbmVudE5hbWUgd2hvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSA6IGxlbmd0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCBhZG1pbi5taW5pbXVtUGFzc3dvcmRVcHBlckNhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gYWRtaW4ubWluaW11bVBhc3N3b3JkVXBwZXJDYXNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7CisgICAgICAgICAgICBpZiAoYXAubWluaW11bVBhc3N3b3JkTG93ZXJDYXNlICE9IGxlbmd0aCkgeworICAgICAgICAgICAgICAgIGFwLm1pbmltdW1QYXNzd29yZExvd2VyQ2FzZSA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUgd2hvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZExvd2VyQ2FzZSA6IGxlbmd0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCBhZG1pbi5taW5pbXVtUGFzc3dvcmRMb3dlckNhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gYWRtaW4ubWluaW11bVBhc3N3b3JkTG93ZXJDYXNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLm1pbmltdW1QYXNzd29yZExldHRlcnMgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkTGV0dGVycyA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5taW5pbXVtUGFzc3dvcmRMZXR0ZXJzIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZExldHRlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gYWRtaW4ubWluaW11bVBhc3N3b3JkTGV0dGVyczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGlmIChhcC5taW5pbXVtUGFzc3dvcmROdW1lcmljICE9IGxlbmd0aCkgeworICAgICAgICAgICAgICAgIGFwLm1pbmltdW1QYXNzd29yZE51bWVyaWMgPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bU51bWVyaWMoQ29tcG9uZW50TmFtZSB3aG8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWluaW11bVBhc3N3b3JkTnVtZXJpYyA6IGxlbmd0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgYWRtaW4ubWluaW11bVBhc3N3b3JkTnVtZXJpYykgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmROdW1lcmljOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLm1pbmltdW1QYXNzd29yZFN5bWJvbHMgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkU3ltYm9scyA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5taW5pbXVtUGFzc3dvcmRTeW1ib2xzIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yICAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCBhZG1pbi5taW5pbXVtUGFzc3dvcmRTeW1ib2xzKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGFkbWluLm1pbmltdW1QYXNzd29yZFN5bWJvbHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGlmIChhcC5taW5pbXVtUGFzc3dvcmROb25MZXR0ZXIgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkTm9uTGV0dGVyID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoQ29tcG9uZW50TmFtZSB3aG8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWluaW11bVBhc3N3b3JkTm9uTGV0dGVyIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZE5vbkxldHRlcikgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmROb25MZXR0ZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIC8vIFRoaXMgQVBJIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBhbiBhY3RpdmUgZGV2aWNlIGFkbWluLAogICAgICAgICAgICAgLy8gc28gdHJ5IHRvIHJldHJpZXZlIGl0IHRvIGNoZWNrIHRoYXQgdGhlIGNhbGxlciBpcyBvbmUuCiAgICAgICAgICAgICBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZChudWxsLAogICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOwotICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgPj0gZ2V0UGFzc3dvcmRRdWFsaXR5KG51bGwpCi0gICAgICAgICAgICAgICAgICAgICYmIG1BY3RpdmVQYXNzd29yZExlbmd0aCA+PSBnZXRQYXNzd29yZE1pbmltdW1MZW5ndGgobnVsbCk7CisgICAgICAgICAgICBpZiAobUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA8IGdldFBhc3N3b3JkUXVhbGl0eShudWxsKQorICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRMZW5ndGggPCBnZXRQYXNzd29yZE1pbmltdW1MZW5ndGgobnVsbCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ICE9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlID49IGdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShudWxsKQorICAgICAgICAgICAgICAgICAgICAmJiBtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UgPj0gZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmIG1BY3RpdmVQYXNzd29yZExldHRlcnMgPj0gZ2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhudWxsKQorICAgICAgICAgICAgICAgICAgICAmJiBtQWN0aXZlUGFzc3dvcmROdW1lcmljID49IGdldFBhc3N3b3JkTWluaW11bU51bWVyaWMobnVsbCkKKyAgICAgICAgICAgICAgICAgICAgJiYgbUFjdGl2ZVBhc3N3b3JkU3ltYm9scyA+PSBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmIG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciA+PSBnZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIobnVsbCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRGYWlsZWRQYXNzd29yZEF0dGVtcHRzKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIC8vIFRoaXMgQVBJIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBhbiBhY3RpdmUgZGV2aWNlIGFkbWluLApAQCAtNjk3LDcgKzExMDcsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgc2V0TWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUoQ29tcG9uZW50TmFtZSB3aG8sIGludCBudW0pIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICAvLyBUaGlzIEFQSSBjYW4gb25seSBiZSBjYWxsZWQgYnkgYW4gYWN0aXZlIGRldmljZSBhZG1pbiwKQEAgLTcxMiwxNiArMTEyMiwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGludCBnZXRNYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZShDb21wb25lbnROYW1lIHdobykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOwogICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUgOiBjb3VudDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwogICAgICAgICAgICAgZm9yICAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOwpAQCAtNzM1LDcgKzExNDUsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGJvb2xlYW4gcmVzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQsIGludCBmbGFncykgewogICAgICAgICBpbnQgcXVhbGl0eTsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CkBAIC03NDYsMTQgKzExNTYsMTUgQEAKICAgICAgICAgICAgIHF1YWxpdHkgPSBnZXRQYXNzd29yZFF1YWxpdHkobnVsbCk7CiAgICAgICAgICAgICBpZiAocXVhbGl0eSAhPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQpIHsKICAgICAgICAgICAgICAgICBpbnQgcmVhbFF1YWxpdHkgPSBMb2NrUGF0dGVyblV0aWxzLmNvbXB1dGVQYXNzd29yZFF1YWxpdHkocGFzc3dvcmQpOwotICAgICAgICAgICAgICAgIGlmIChyZWFsUXVhbGl0eSA8IHF1YWxpdHkpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVhbFF1YWxpdHkgPCBxdWFsaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAmJiBxdWFsaXR5ICE9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYKSB7CiAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZXNldFBhc3N3b3JkOiBwYXNzd29yZCBxdWFsaXR5IDB4IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhxdWFsaXR5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBtZWV0IHJlcXVpcmVkIHF1YWxpdHkgMHgiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHF1YWxpdHkpKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBxdWFsaXR5ID0gcmVhbFF1YWxpdHk7CisgICAgICAgICAgICAgICAgcXVhbGl0eSA9IE1hdGgubWF4KHJlYWxRdWFsaXR5LCBxdWFsaXR5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGludCBsZW5ndGggPSBnZXRQYXNzd29yZE1pbmltdW1MZW5ndGgobnVsbCk7CiAgICAgICAgICAgICBpZiAocGFzc3dvcmQubGVuZ3RoKCkgPCBsZW5ndGgpIHsKQEAgLTc2MSwxNCArMTE3Miw4NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbGVuZ3RoICIgKyBsZW5ndGgpOwogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChxdWFsaXR5ID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYKSB7CisgICAgICAgICAgICAgICAgaW50IGxldHRlcnMgPSAwOworICAgICAgICAgICAgICAgIGludCB1cHBlcmNhc2UgPSAwOworICAgICAgICAgICAgICAgIGludCBsb3dlcmNhc2UgPSAwOworICAgICAgICAgICAgICAgIGludCBudW1iZXJzID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgc3ltYm9scyA9IDA7CisgICAgICAgICAgICAgICAgaW50IG5vbmxldHRlciA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXNzd29yZC5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgYyA9IHBhc3N3b3JkLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXR0ZXJzKys7CisgICAgICAgICAgICAgICAgICAgICAgICB1cHBlcmNhc2UrKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgeworICAgICAgICAgICAgICAgICAgICAgICAgbGV0dGVycysrOworICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJjYXNlKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vbmxldHRlcisrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9scysrOworICAgICAgICAgICAgICAgICAgICAgICAgbm9ubGV0dGVyKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG5lZWRlZExldHRlcnMgPSBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKG51bGwpOworICAgICAgICAgICAgICAgIGlmKGxldHRlcnMgPCBuZWVkZWRMZXR0ZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZXNldFBhc3N3b3JkOiBudW1iZXIgb2YgbGV0dGVycyAiICsgbGV0dGVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBtZWV0IHJlcXVpcmVkIG51bWJlciBvZiBsZXR0ZXJzICIgKyBuZWVkZWRMZXR0ZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbmVlZGVkTnVtYmVycyA9IGdldFBhc3N3b3JkTWluaW11bU51bWVyaWMobnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKG51bWJlcnMgPCBuZWVkZWROdW1iZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudyhUQUcsICJyZXNldFBhc3N3b3JkOiBudW1iZXIgb2YgbnVtZXJpY2FsIGRpZ2l0cyAiICsgbnVtYmVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZWVkZWROdW1iZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbmVlZGVkTG93ZXJDYXNlID0gZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKG51bGwpOworICAgICAgICAgICAgICAgIGlmIChsb3dlcmNhc2UgPCBuZWVkZWRMb3dlckNhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiBsb3dlcmNhc2UgbGV0dGVycyAiICsgbG93ZXJjYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIGxvd2VyY2FzZSBsZXR0ZXJzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5lZWRlZExvd2VyQ2FzZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG5lZWRlZFVwcGVyQ2FzZSA9IGdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAodXBwZXJjYXNlIDwgbmVlZGVkVXBwZXJDYXNlKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZXNldFBhc3N3b3JkOiBudW1iZXIgb2YgdXBwZXJjYXNlIGxldHRlcnMgIiArIHVwcGVyY2FzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBtZWV0IHJlcXVpcmVkIG51bWJlciBvZiB1cHBlcmNhc2UgbGV0dGVycyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZWVkZWRVcHBlckNhc2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuZWVkZWRTeW1ib2xzID0gZ2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAoc3ltYm9scyA8IG5lZWRlZFN5bWJvbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiBzcGVjaWFsIHN5bWJvbHMgIiArIHN5bWJvbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBudW1iZXIgb2Ygc3BlY2lhbCBzeW1ib2xzICIgKyBuZWVkZWRTeW1ib2xzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbmVlZGVkTm9uTGV0dGVyID0gZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKG51bGwpOworICAgICAgICAgICAgICAgIGlmIChub25sZXR0ZXIgPCBuZWVkZWROb25MZXR0ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiBub24tbGV0dGVyIGNoYXJhY3RlcnMgIiArIG5vbmxldHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBtZWV0IHJlcXVpcmVkIG51bWJlciBvZiBub24tbGV0dGVyIGNoYXJhY3RlcnMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmVlZGVkTm9uTGV0dGVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTG9ja1BhdHRlcm5VdGlscyB1dGlscyA9IG5ldyBMb2NrUGF0dGVyblV0aWxzKG1Db250ZXh0KTsKKyAgICAgICAgICAgIGlmKHV0aWxzLmNoZWNrUGFzc3dvcmRIaXN0b3J5KHBhc3N3b3JkKSkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZXNldFBhc3N3b3JkOiBwYXNzd29yZCBpcyB0aGUgc2FtZSBhcyBvbmUgb2YgdGhlIGxhc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgobnVsbCkgKyAiIHBhc3N3b3JkcyIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBpbnQgY2FsbGluZ1VpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7CiAgICAgICAgIGlmIChtUGFzc3dvcmRPd25lciA+PSAwICYmIG1QYXNzd29yZE93bmVyICE9IGNhbGxpbmdVaWQpIHsKICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZXNldFBhc3N3b3JkOiBhbHJlYWR5IHNldCBieSBhbm90aGVyIHVpZCBhbmQgbm90IGVudGVyZWQgYnkgdXNlciIpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIC8vIERvbid0IGRvIHRoaXMgd2l0aCB0aGUgbG9jayBoZWxkLCBiZWNhdXNlIGl0IGlzIGdvaW5nIHRvIGNhbGwKICAgICAgICAgLy8gYmFjayBpbiB0byB0aGUgc2VydmljZS4KICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwpAQCAtNzg2LDEwICsxMjY5LDEwIEBACiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgc2V0TWF4aW11bVRpbWVUb0xvY2soQ29tcG9uZW50TmFtZSB3aG8sIGxvbmcgdGltZU1zKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CkBAIC03OTksMTYgKzEyODIsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0ZPUkNFX0xPQ0spOwogICAgICAgICAgICAgaWYgKGFwLm1heGltdW1UaW1lVG9VbmxvY2sgIT0gdGltZU1zKSB7CiAgICAgICAgICAgICAgICAgYXAubWF4aW11bVRpbWVUb1VubG9jayA9IHRpbWVNczsKLSAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICAgICAgdGltZU1zID0gZ2V0TWF4aW11bVRpbWVUb0xvY2sobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lTXMgPD0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgdGltZU1zID0gSW50ZWdlci5NQVhfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGdldElQb3dlck1hbmFnZXIoKS5zZXRNYXhpbXVtU2NyZWVuT2ZmVGltZW91bnQoKGludCl0aW1lTXMpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewpAQCAtODIwLDE2ICsxMzAzLDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgbG9uZyBnZXRNYXhpbXVtVGltZVRvTG9jayhDb21wb25lbnROYW1lIHdobykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGxvbmcgdGltZSA9IDA7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOwogICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWF4aW11bVRpbWVUb1VubG9jayA6IHRpbWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKICAgICAgICAgICAgIGZvciAgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKQEAgLTg0Myw3ICsxMzI2LDcgQEAKICAgICAgICAgICAgIHJldHVybiB0aW1lOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgbG9ja05vdygpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICAvLyBUaGlzIEFQSSBjYW4gb25seSBiZSBjYWxsZWQgYnkgYW4gYWN0aXZlIGRldmljZSBhZG1pbiwKQEAgLTg2MCw3ICsxMzQzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHZvaWQgd2lwZURhdGFMb2NrZWQoaW50IGZsYWdzKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBSZWNvdmVyeVN5c3RlbS5yZWJvb3RXaXBlVXNlckRhdGEobUNvbnRleHQpOwpAQCAtODY4LDcgKzEzNTEsNyBAQAogICAgICAgICAgICAgU2xvZy53KFRBRywgIkZhaWxlZCByZXF1ZXN0aW5nIGRhdGEgd2lwZSIsIGUpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgd2lwZURhdGEoaW50IGZsYWdzKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgLy8gVGhpcyBBUEkgY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IGFuIGFjdGl2ZSBkZXZpY2UgYWRtaW4sCkBAIC04ODMsMTEgKzEzNjYsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIGdldFJlbW92ZVdhcm5pbmcoQ29tcG9uZW50TmFtZSBjb21wLCBmaW5hbCBSZW1vdGVDYWxsYmFjayByZXN1bHQpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CSU5EX0RFVklDRV9BRE1JTiwgbnVsbCk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZChjb21wKTsKICAgICAgICAgICAgIGlmIChhZG1pbiA9PSBudWxsKSB7CkBAIC05MTAsMjAgKzEzOTMsMzAgQEAKICAgICAgICAgICAgIH0sIG51bGwsIEFjdGl2aXR5LlJFU1VMVF9PSywgbnVsbCwgbnVsbCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShpbnQgcXVhbGl0eSwgaW50IGxlbmd0aCkgeworCisgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShpbnQgcXVhbGl0eSwgaW50IGxlbmd0aCwgaW50IGxldHRlcnMsIGludCB1cHBlcmNhc2UsCisgICAgICAgICAgICBpbnQgbG93ZXJjYXNlLCBpbnQgbnVtYmVycywgaW50IHN5bWJvbHMsIGludCBub25sZXR0ZXIpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CSU5EX0RFVklDRV9BRE1JTiwgbnVsbCk7Ci0gICAgICAgIAorCiAgICAgICAgIHZhbGlkYXRlUXVhbGl0eUNvbnN0YW50KHF1YWxpdHkpOwotICAgICAgICAKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmIChtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ICE9IHF1YWxpdHkgfHwgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoICE9IGxlbmd0aAotICAgICAgICAgICAgICAgICAgICB8fCBtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHx8IG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycyAhPSBsZXR0ZXJzCisgICAgICAgICAgICAgICAgICAgIHx8IG1BY3RpdmVQYXNzd29yZFVwcGVyQ2FzZSAhPSB1cHBlcmNhc2UKKyAgICAgICAgICAgICAgICAgICAgfHwgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlICE9IGxvd2VyY2FzZSB8fCBtQWN0aXZlUGFzc3dvcmROdW1lcmljICE9IG51bWJlcnMKKyAgICAgICAgICAgICAgICAgICAgfHwgbUFjdGl2ZVBhc3N3b3JkU3ltYm9scyAhPSBzeW1ib2xzIHx8IG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciAhPSBub25sZXR0ZXIpIHsKICAgICAgICAgICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA9IHF1YWxpdHk7CiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExlbmd0aCA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycyA9IGxldHRlcnM7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSA9IGxvd2VyY2FzZTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlID0gdXBwZXJjYXNlOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmROdW1lcmljID0gbnVtYmVyczsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkU3ltYm9scyA9IHN5bWJvbHM7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciA9IG5vbmxldHRlcjsKICAgICAgICAgICAgICAgICAgICAgbUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMgPSAwOwogICAgICAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKICAgICAgICAgICAgICAgICAgICAgc2VuZEFkbWluQ29tbWFuZExvY2tlZChEZXZpY2VBZG1pblJlY2VpdmVyLkFDVElPTl9QQVNTV09SRF9DSEFOR0VELApAQCAtOTM0LDExICsxNDI3LDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCByZXBvcnRGYWlsZWRQYXNzd29yZEF0dGVtcHQoKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQklORF9ERVZJQ0VfQURNSU4sIG51bGwpOwotICAgICAgICAKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgICAgIHRyeSB7CkBAIC05NTUsMTEgKzE0NDgsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHJlcG9ydFN1Y2Nlc3NmdWxQYXNzd29yZEF0dGVtcHQoKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQklORF9ERVZJQ0VfQURNSU4sIG51bGwpOwotICAgICAgICAKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmIChtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyAhPSAwIHx8IG1QYXNzd29yZE93bmVyID49IDApIHsKICAgICAgICAgICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CkBAIC05NzUsNyArMTQ2OCw5NSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCisgICAgcHVibGljIENvbXBvbmVudE5hbWUgc2V0R2xvYmFsUHJveHkoQ29tcG9uZW50TmFtZSB3aG8sIFN0cmluZyBwcm94eVNwZWMsCisgICAgICAgICAgICBTdHJpbmcgZXhjbHVzaW9uTGlzdCkgeworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9TRVRTX0dMT0JBTF9QUk9YWSk7CisKKyAgICAgICAgICAgIC8vIFNjYW4gdGhyb3VnaCBhY3RpdmUgYWRtaW5zIGFuZCBmaW5kIGlmIGFueW9uZSBoYXMgYWxyZWFkeQorICAgICAgICAgICAgLy8gc2V0IHRoZSBnbG9iYWwgcHJveHkuCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgU2V0PENvbXBvbmVudE5hbWU+IGNvbXBTZXQgPSBtQWRtaW5NYXAua2V5U2V0KCk7CisgICAgICAgICAgICBmb3IgIChDb21wb25lbnROYW1lIGNvbXBvbmVudCA6IGNvbXBTZXQpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IG1BZG1pbk1hcC5nZXQoY29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoKGFwLnNwZWNpZmllc0dsb2JhbFByb3h5KSAmJiAoIWNvbXBvbmVudC5lcXVhbHMod2hvKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQW5vdGhlciBhZG1pbiBhbHJlYWR5IHNldHMgdGhlIGdsb2JhbCBwcm94eQorICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gaXQgdG8gdGhlIGNhbGxlci4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHJveHlTcGVjID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhZG1pbi5zcGVjaWZpZXNHbG9iYWxQcm94eSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGFkbWluLmdsb2JhbFByb3h5U3BlYyA9IG51bGw7CisgICAgICAgICAgICAgICAgYWRtaW4uZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ID0gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICBhZG1pbi5zcGVjaWZpZXNHbG9iYWxQcm94eSA9IHRydWU7CisgICAgICAgICAgICAgICAgYWRtaW4uZ2xvYmFsUHJveHlTcGVjID0gcHJveHlTcGVjOworICAgICAgICAgICAgICAgIGFkbWluLmdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCA9IGV4Y2x1c2lvbkxpc3Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBnbG9iYWwgcHJveHkgYWNjb3JkaW5nbHkKKyAgICAgICAgICAgIC8vIERvIHRoaXMgdXNpbmcgc3lzdGVtIHBlcm1pc3Npb25zLCBhcyBhcHBzIGNhbm5vdCB3cml0ZSB0byBzZWN1cmUgc2V0dGluZ3MKKyAgICAgICAgICAgIGxvbmcgb3JpZ0lkID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICByZXNldEdsb2JhbFByb3h5KCk7CisgICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShvcmlnSWQpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ29tcG9uZW50TmFtZSBnZXRHbG9iYWxQcm94eUFkbWluKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgLy8gU2NhbiB0aHJvdWdoIGFjdGl2ZSBhZG1pbnMgYW5kIGZpbmQgaWYgYW55b25lIGhhcyBhbHJlYWR5CisgICAgICAgICAgICAvLyBzZXQgdGhlIGdsb2JhbCBwcm94eS4KKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGFwLnNwZWNpZmllc0dsb2JhbFByb3h5KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIERldmljZSBhZG1pbiBzZXRzIHRoZSBnbG9iYWwgcHJveHkKKyAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGl0IHRvIHRoZSBjYWxsZXIuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcC5pbmZvLmdldENvbXBvbmVudCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBObyBkZXZpY2UgYWRtaW4gc2V0cyB0aGUgZ2xvYmFsIHByb3h5LgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRHbG9iYWxQcm94eSgpIHsKKyAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICBpZiAoYXAuc3BlY2lmaWVzR2xvYmFsUHJveHkpIHsKKyAgICAgICAgICAgICAgICBzYXZlR2xvYmFsUHJveHkoYXAuZ2xvYmFsUHJveHlTcGVjLCBhcC5nbG9iYWxQcm94eUV4Y2x1c2lvbkxpc3QpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBObyBkZXZpY2UgYWRtaW5zIGRlZmluaW5nIGdsb2JhbCBwcm94aWVzIC0gcmVzZXQgZ2xvYmFsIHByb3h5IHNldHRpbmdzIHRvIG5vbmUKKyAgICAgICAgc2F2ZUdsb2JhbFByb3h5KG51bGwsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzYXZlR2xvYmFsUHJveHkoU3RyaW5nIHByb3h5U3BlYywgU3RyaW5nIGV4Y2x1c2lvbkxpc3QpIHsKKyAgICAgICAgaWYgKGV4Y2x1c2lvbkxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgZXhjbHVzaW9uTGlzdCA9ICIiOworICAgICAgICB9CisgICAgICAgIGlmIChwcm94eVNwZWMgPT0gbnVsbCkgeworICAgICAgICAgICAgcHJveHlTcGVjID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVtb3ZlIHdoaXRlIHNwYWNlcworICAgICAgICBwcm94eVNwZWMgPSBwcm94eVNwZWMudHJpbSgpOworICAgICAgICBleGNsdXNpb25MaXN0ID0gZXhjbHVzaW9uTGlzdC50cmltKCk7CisgICAgICAgIENvbnRlbnRSZXNvbHZlciByZXMgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyZXMsIFNldHRpbmdzLlNlY3VyZS5IVFRQX1BST1hZLCBwcm94eVNwZWMpOworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHJlcywgU2V0dGluZ3MuU2VjdXJlLkhUVFBfUFJPWFlfRVhDTFVTSU9OX0xJU1QsIGV4Y2x1c2lvbkxpc3QpOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3LCBTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgIGlmIChtQ29udGV4dC5jaGVja0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5EVU1QKQpAQCAtOTg2LDEyICsxNTY3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICsgIiwgdWlkPSIgKyBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBmaW5hbCBQcmludGVyIHAgPSBuZXcgUHJpbnRXcml0ZXJQcmludGVyKHB3KTsKLSAgICAgICAgCisKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBwLnByaW50bG4oIkN1cnJlbnQgRGV2aWNlIFBvbGljeSBNYW5hZ2VyIHN0YXRlOiIpOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIHAucHJpbnRsbigiICBFbmFibGVkIERldmljZSBBZG1pbnM6Iik7CiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwogICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewpAQCAtMTAwMiwxMSArMTU4MywxNyBAQAogICAgICAgICAgICAgICAgICAgICBhcC5kdW1wKCIgICAgIiwgcHcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBwdy5wcmludGxuKCIgIik7CiAgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmRRdWFsaXR5PTB4Iik7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oSW50ZWdlci50b0hleFN0cmluZyhtQWN0aXZlUGFzc3dvcmRRdWFsaXR5KSk7CiAgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmRMZW5ndGg9Iik7IHB3LnByaW50bG4obUFjdGl2ZVBhc3N3b3JkTGVuZ3RoKTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIG1BY3RpdmVQYXNzd29yZFVwcGVyQ2FzZT0iKTsgcHcucHJpbnRsbihtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UpOworICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSk7CisgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZExldHRlcnMpOworICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYz0iKTsgcHcucHJpbnRsbihtQWN0aXZlUGFzc3dvcmROdW1lcmljKTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIG1BY3RpdmVQYXNzd29yZFN5bWJvbHM9Iik7IHB3LnByaW50bG4obUFjdGl2ZVBhc3N3b3JkU3ltYm9scyk7CisgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXI9Iik7IHB3LnByaW50bG4obUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyKTsKICAgICAgICAgICAgIHB3LnByaW50KCIgIG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzPSIpOyBwdy5wcmludGxuKG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzKTsKICAgICAgICAgICAgIHB3LnByaW50KCIgIG1QYXNzd29yZE93bmVyPSIpOyBwdy5wcmludGxuKG1QYXNzd29yZE93bmVyKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvSW5wdXRNYW5hZ2VyLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9JbnB1dE1hbmFnZXIuamF2YQppbmRleCAyOWNhOWE0Li5mZTMwNmIzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9JbnB1dE1hbmFnZXIuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9JbnB1dE1hbmFnZXIuamF2YQpAQCAtNzcsNiArNzcsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBJbnB1dERldmljZSBuYXRpdmVHZXRJbnB1dERldmljZShpbnQgZGV2aWNlSWQpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUdldElucHV0Q29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnRbXSBuYXRpdmVHZXRJbnB1dERldmljZUlkcygpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZVRyYW5zZmVyVG91Y2hGb2N1cyhJbnB1dENoYW5uZWwgZnJvbUNoYW5uZWwsCisgICAgICAgICAgICBJbnB1dENoYW5uZWwgdG9DaGFubmVsKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgU3RyaW5nIG5hdGl2ZUR1bXAoKTsKICAgICAKICAgICAvLyBJbnB1dCBldmVudCBpbmplY3Rpb24gY29uc3RhbnRzIGRlZmluZWQgaW4gSW5wdXREaXNwYXRjaGVyLmguCkBAIC0zMjAsNiArMzIyLDI5IEBACiAgICAgICAgIG5hdGl2ZVNldElucHV0RGlzcGF0Y2hNb2RlKGVuYWJsZWQsIGZyb3plbik7CiAgICAgfQogICAgIAorICAgIC8qKgorICAgICAqIEF0b21pY2FsbHkgdHJhbnNmZXJzIHRvdWNoIGZvY3VzIGZyb20gb25lIHdpbmRvdyB0byBhbm90aGVyIGFzIGlkZW50aWZpZWQgYnkKKyAgICAgKiB0aGVpciBpbnB1dCBjaGFubmVscy4gIEl0IGlzIHBvc3NpYmxlIGZvciBtdWx0aXBsZSB3aW5kb3dzIHRvIGhhdmUKKyAgICAgKiB0b3VjaCBmb2N1cyBpZiB0aGV5IHN1cHBvcnQgc3BsaXQgdG91Y2ggZGlzcGF0Y2gKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zI0ZMQUdfU1BMSVRfVE9VQ0h9IGJ1dCB0aGlzCisgICAgICogbWV0aG9kIG9ubHkgdHJhbnNmZXJzIHRvdWNoIGZvY3VzIG9mIHRoZSBzcGVjaWZpZWQgd2luZG93IHdpdGhvdXQgYWZmZWN0aW5nCisgICAgICogb3RoZXIgd2luZG93cyB0aGF0IG1heSBhbHNvIGhhdmUgdG91Y2ggZm9jdXMgYXQgdGhlIHNhbWUgdGltZS4KKyAgICAgKiBAcGFyYW0gZnJvbUNoYW5uZWwgVGhlIGNoYW5uZWwgb2YgYSB3aW5kb3cgdGhhdCBjdXJyZW50bHkgaGFzIHRvdWNoIGZvY3VzLgorICAgICAqIEBwYXJhbSB0b0NoYW5uZWwgVGhlIGNoYW5uZWwgb2YgdGhlIHdpbmRvdyB0aGF0IHNob3VsZCByZWNlaXZlIHRvdWNoIGZvY3VzIGluCisgICAgICogcGxhY2Ugb2YgdGhlIGZpcnN0LgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWwuICBGYWxzZSBpZiB0aGUgd2luZG93IHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIGNoYW5uZWwgZGlkIG5vdCBhY3R1YWxseSBoYXZlIHRvdWNoIGZvY3VzIGF0IHRoZSB0aW1lIG9mIHRoZSByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHRyYW5zZmVyVG91Y2hGb2N1cyhJbnB1dENoYW5uZWwgZnJvbUNoYW5uZWwsIElucHV0Q2hhbm5lbCB0b0NoYW5uZWwpIHsKKyAgICAgICAgaWYgKGZyb21DaGFubmVsID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZyb21DaGFubmVsIG11c3Qgbm90IGJlIG51bGwuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRvQ2hhbm5lbCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0b0NoYW5uZWwgbXVzdCBub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmF0aXZlVHJhbnNmZXJUb3VjaEZvY3VzKGZyb21DaGFubmVsLCB0b0NoYW5uZWwpOworICAgIH0KKyAgICAKICAgICBwdWJsaWMgdm9pZCBkdW1wKFByaW50V3JpdGVyIHB3KSB7CiAgICAgICAgIFN0cmluZyBkdW1wU3RyID0gbmF0aXZlRHVtcCgpOwogICAgICAgICBpZiAoZHVtcFN0ciAhPSBudWxsKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9JbnB1dE1ldGhvZE1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9JbnB1dE1ldGhvZE1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggZWNhZDNjYy4uOWE1NDIzYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0lucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtNjEsMTggKzYxLDIxIEBACiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QcmludFdyaXRlclByaW50ZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlByaW50ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LklXaW5kb3dNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5FZGl0b3JJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dEJpbmRpbmc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZEluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RTdWJ0eXBlOwogCiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtOTMsNiArOTYsNyBAQAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIklucHV0TWFuYWdlclNlcnZpY2UiOwogCiAgICAgc3RhdGljIGZpbmFsIGludCBNU0dfU0hPV19JTV9QSUNLRVIgPSAxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NIT1dfSU1fU1VCVFlQRV9QSUNLRVIgPSAyOwogCiAgICAgc3RhdGljIGZpbmFsIGludCBNU0dfVU5CSU5EX0lOUFVUID0gMTAwMDsKICAgICBzdGF0aWMgZmluYWwgaW50IE1TR19CSU5EX0lOUFVUID0gMTAxMDsKQEAgLTEwOSw4ICsxMTMsMTEgQEAKIAogICAgIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVfVE9fUkVDT05ORUNUID0gMTAqMTAwMDsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RfQV9TVUJUWVBFX0lEID0gLTE7CisKICAgICBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwogICAgIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgZmluYWwgSW5wdXRNZXRob2RTZXR0aW5ncyBtU2V0dGluZ3M7CiAgICAgZmluYWwgU2V0dGluZ3NPYnNlcnZlciBtU2V0dGluZ3NPYnNlcnZlcjsKICAgICBmaW5hbCBTdGF0dXNCYXJNYW5hZ2VyU2VydmljZSBtU3RhdHVzQmFyOwogICAgIGZpbmFsIElXaW5kb3dNYW5hZ2VyIG1JV2luZG93TWFuYWdlcjsKQEAgLTEyMCwxMyArMTI3LDggQEAKIAogICAgIC8vIEFsbCBrbm93biBpbnB1dCBtZXRob2RzLiAgbU1ldGhvZE1hcCBhbHNvIHNlcnZlcyBhcyB0aGUgZ2xvYmFsCiAgICAgLy8gbG9jayBmb3IgdGhpcyBjbGFzcy4KLSAgICBmaW5hbCBBcnJheUxpc3Q8SW5wdXRNZXRob2RJbmZvPiBtTWV0aG9kTGlzdAotICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PElucHV0TWV0aG9kSW5mbz4oKTsKLSAgICBmaW5hbCBIYXNoTWFwPFN0cmluZywgSW5wdXRNZXRob2RJbmZvPiBtTWV0aG9kTWFwCi0gICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW5wdXRNZXRob2RJbmZvPigpOwotCi0gICAgZmluYWwgVGV4dFV0aWxzLlNpbXBsZVN0cmluZ1NwbGl0dGVyIG1TdHJpbmdDb2xvblNwbGl0dGVyCi0gICAgICAgICAgICA9IG5ldyBUZXh0VXRpbHMuU2ltcGxlU3RyaW5nU3BsaXR0ZXIoJzonKTsKKyAgICBmaW5hbCBBcnJheUxpc3Q8SW5wdXRNZXRob2RJbmZvPiBtTWV0aG9kTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW5wdXRNZXRob2RJbmZvPigpOworICAgIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBJbnB1dE1ldGhvZEluZm8+IG1NZXRob2RNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElucHV0TWV0aG9kSW5mbz4oKTsKIAogICAgIGNsYXNzIFNlc3Npb25TdGF0ZSB7CiAgICAgICAgIGZpbmFsIENsaWVudFN0YXRlIGNsaWVudDsKQEAgLTIyNCw2ICsyMjYsMTIgQEAKICAgICBTdHJpbmcgbUN1cklkOwogCiAgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgc3VidHlwZSBvZiB0aGUgY3VycmVudCBpbnB1dCBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSBJbnB1dE1ldGhvZFN1YnR5cGUgbUN1cnJlbnRTdWJ0eXBlOworCisKKyAgICAvKioKICAgICAgKiBTZXQgdG8gdHJ1ZSBpZiBvdXIgU2VydmljZUNvbm5lY3Rpb24gaXMgY3VycmVudGx5IGFjdGl2ZWx5IGJvdW5kIHRvCiAgICAgICogYSBzZXJ2aWNlICh3aGV0aGVyIG9yIG5vdCB3ZSBoYXZlIGdvdHRlbiBpdHMgSUJpbmRlciBiYWNrIHlldCkuCiAgICAgICovCkBAIC0yOTIsNiArMzAwLDcgQEAKICAgICBBbGVydERpYWxvZyBtU3dpdGNoaW5nRGlhbG9nOwogICAgIElucHV0TWV0aG9kSW5mb1tdIG1JbXM7CiAgICAgQ2hhclNlcXVlbmNlW10gbUl0ZW1zOworICAgIGludFtdIG1TdWJ0eXBlSWRzOwogCiAgICAgY2xhc3MgU2V0dGluZ3NPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CiAgICAgICAgIFNldHRpbmdzT2JzZXJ2ZXIoSGFuZGxlciBoYW5kbGVyKSB7CkBAIC0yOTksNiArMzA4LDggQEAKICAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciByZXNvbHZlciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwogICAgICAgICAgICAgcmVzb2x2ZXIucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU2VjdXJlLmdldFVyaUZvcigKICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfSU5QVVRfTUVUSE9EKSwgZmFsc2UsIHRoaXMpOworICAgICAgICAgICAgcmVzb2x2ZXIucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU2VjdXJlLmdldFVyaUZvcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlNFTEVDVEVEX0lOUFVUX01FVEhPRF9TVUJUWVBFKSwgZmFsc2UsIHRoaXMpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKGJvb2xlYW4gc2VsZkNoYW5nZSkgewpAQCAtMzUxLDkgKzM2Miw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRvaXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfSU5QVVRfTUVUSE9ELCAiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldFNlbGVjdGVkSW5wdXRNZXRob2RTdWJ0eXBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VOZXdEZWZhdWx0SU1FTG9ja2VkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNDA5LDE2ICs0MjAsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNob29zZU5ld0RlZmF1bHRJTUVMb2NrZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VySW0gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJJbnB1dE1ldGhvZElkID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJVbnNldHRpbmcgY3VycmVudCBpbnB1dCBtZXRob2QiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuREVGQVVMVF9JTlBVVF9NRVRIT0QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VySW5wdXRNZXRob2RJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfSU5QVVRfTUVUSE9ELCAiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0U2VsZWN0ZWRJbnB1dE1ldGhvZFN1YnR5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICBpZiAoY3VySW0gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAvLyBXZSBjdXJyZW50bHkgZG9uJ3QgaGF2ZSBhIGRlZmF1bHQgaW5wdXQgbWV0aG9kLi4uIGlzCiAgICAgICAgICAgICAgICAgICAgIC8vIG9uZSBub3cgYXZhaWxhYmxlPwpAQCAtNDY5LDI3ICs0NzksMTggQEAKICAgICAgICAgbVN0YXR1c0JhciA9IHN0YXR1c0JhcjsKICAgICAgICAgc3RhdHVzQmFyLnNldEljb25WaXNpYmlsaXR5KCJpbWUiLCBmYWxzZSk7CiAKKyAgICAgICAgLy8gbVNldHRpbmdzIHNob3VsZCBiZSBjcmVhdGVkIGJlZm9yZSBidWlsZElucHV0TWV0aG9kTGlzdExvY2tlZAorICAgICAgICBtU2V0dGluZ3MgPSBuZXcgSW5wdXRNZXRob2RTZXR0aW5ncyhjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLCBtTWV0aG9kTWFwLCBtTWV0aG9kTGlzdCk7CiAgICAgICAgIGJ1aWxkSW5wdXRNZXRob2RMaXN0TG9ja2VkKG1NZXRob2RMaXN0LCBtTWV0aG9kTWFwKTsKKyAgICAgICAgbVNldHRpbmdzLmVuYWJsZUFsbElNRXNJZlRoZXJlSXNOb0VuYWJsZWRJTUUoKTsKIAotICAgICAgICBmaW5hbCBTdHJpbmcgZW5hYmxlZFN0ciA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfSU5QVVRfTUVUSE9EUyk7Ci0gICAgICAgIFNsb2cuaShUQUcsICJFbmFibGVkIGlucHV0IG1ldGhvZHM6ICIgKyBlbmFibGVkU3RyKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGRlZmF1bHRJbWUgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKG1Db250ZXh0Ci0gICAgICAgICAgICAgICAgLmdldENvbnRlbnRSZXNvbHZlcigpLCBTZXR0aW5ncy5TZWN1cmUuREVGQVVMVF9JTlBVVF9NRVRIT0QpOwotICAgICAgICBpZiAoZW5hYmxlZFN0ciA9PSBudWxsIHx8IFRleHRVdGlscy5pc0VtcHR5KGRlZmF1bHRJbWUpKSB7Ci0gICAgICAgICAgICBTbG9nLmkoVEFHLCAiRW5hYmxlZCBpbnB1dCBtZXRob2RzIG9yIGRlZmF1bHQgSU1FIGhhcyBub3QgYmVlbiBzZXQsIGVuYWJsaW5nIGFsbCIpOworICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfSU5QVVRfTUVUSE9EKSkpIHsKICAgICAgICAgICAgIElucHV0TWV0aG9kSW5mbyBkZWZJbSA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjU2KTsKLSAgICAgICAgICAgIGZpbmFsIGludCBOID0gbU1ldGhvZExpc3Quc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgICAgIElucHV0TWV0aG9kSW5mbyBpbWkgPSBtTWV0aG9kTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIkFkZGluZzogIiArIGltaS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHNiLmFwcGVuZCgnOicpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChpbWkuZ2V0SWQoKSk7CisgICAgICAgICAgICBmb3IgKElucHV0TWV0aG9kSW5mbyBpbWk6IG1NZXRob2RMaXN0KSB7CiAgICAgICAgICAgICAgICAgaWYgKGRlZkltID09IG51bGwgJiYgaW1pLmdldElzRGVmYXVsdFJlc291cmNlSWQoKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMgcmVzID0gbUNvbnRleHQuY3JlYXRlUGFja2FnZUNvbnRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMgcmVzID0gY29udGV4dC5jcmVhdGVQYWNrYWdlQ29udGV4dCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1pLmdldFBhY2thZ2VOYW1lKCksIDApLmdldFJlc291cmNlcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5nZXRCb29sZWFuKGltaS5nZXRJc0RlZmF1bHRSZXNvdXJjZUlkKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmSW0gPSBpbWk7CkBAIC01MDAsMTUgKzUwMSwxNCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRlZkltID09IG51bGwgJiYgTiA+IDApIHsKKyAgICAgICAgICAgIGlmIChkZWZJbSA9PSBudWxsICYmIG1NZXRob2RMaXN0LnNpemUoKSA+IDApIHsKICAgICAgICAgICAgICAgICBkZWZJbSA9IG1NZXRob2RMaXN0LmdldCgwKTsKICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiTm8gZGVmYXVsdCBmb3VuZCwgdXNpbmcgIiArIGRlZkltLmdldElkKCkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfSU5QVVRfTUVUSE9EUywgc2IudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICBpZiAoZGVmSW0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuREVGQVVMVF9JTlBVVF9NRVRIT0QsIGRlZkltLmdldElkKCkpOworICAgICAgICAgICAgICAgIHB1dFNlbGVjdGVkSW5wdXRNZXRob2RTdWJ0eXBlKGRlZkltLCBOT1RfQV9TVUJUWVBFX0lEKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC01NTIsMzEgKzU1MiwxMCBAQAogCiAgICAgcHVibGljIExpc3Q8SW5wdXRNZXRob2RJbmZvPiBnZXRFbmFibGVkSW5wdXRNZXRob2RMaXN0KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1NZXRob2RNYXApIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRFbmFibGVkSW5wdXRNZXRob2RMaXN0TG9ja2VkKCk7CisgICAgICAgICAgICByZXR1cm4gbVNldHRpbmdzLmdldEVuYWJsZWRJbnB1dE1ldGhvZExpc3RMb2NrZWQoKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIExpc3Q8SW5wdXRNZXRob2RJbmZvPiBnZXRFbmFibGVkSW5wdXRNZXRob2RMaXN0TG9ja2VkKCkgewotICAgICAgICBmaW5hbCBBcnJheUxpc3Q8SW5wdXRNZXRob2RJbmZvPiByZXMgPSBuZXcgQXJyYXlMaXN0PElucHV0TWV0aG9kSW5mbz4oKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgZW5hYmxlZFN0ciA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfSU5QVVRfTUVUSE9EUyk7Ci0gICAgICAgIGlmIChlbmFibGVkU3RyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIFRleHRVdGlscy5TaW1wbGVTdHJpbmdTcGxpdHRlciBzcGxpdHRlciA9IG1TdHJpbmdDb2xvblNwbGl0dGVyOwotICAgICAgICAgICAgc3BsaXR0ZXIuc2V0U3RyaW5nKGVuYWJsZWRTdHIpOwotCi0gICAgICAgICAgICB3aGlsZSAoc3BsaXR0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRNZXRob2RJbmZvIGluZm8gPSBtTWV0aG9kTWFwLmdldChzcGxpdHRlci5uZXh0KCkpOwotICAgICAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzLmFkZChpbmZvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQogICAgIHB1YmxpYyB2b2lkIGFkZENsaWVudChJSW5wdXRNZXRob2RDbGllbnQgY2xpZW50LAogICAgICAgICAgICAgSUlucHV0Q29udGV4dCBpbnB1dENvbnRleHQsIGludCB1aWQsIGludCBwaWQpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtTWV0aG9kTWFwKSB7CkBAIC05NjUsMTAgKzk0NCwxMCBAQAogICAgICAgICAvLyBzeW5jLCBzbyB3ZSB3aWxsIG5ldmVyIGhhdmUgYSBERUZBVUxUX0lOUFVUX01FVEhPRCB0aGF0IGlzIG5vdAogICAgICAgICAvLyBlbmFibGVkLgogICAgICAgICBTdHJpbmcgaWQgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfSU5QVVRfTUVUSE9EKTsKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuREVGQVVMVF9JTlBVVF9NRVRIT0QpOwogICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiBpZC5sZW5ndGgoKSA+IDApIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2V0SW5wdXRNZXRob2RMb2NrZWQoaWQpOworICAgICAgICAgICAgICAgIHNldElucHV0TWV0aG9kTG9ja2VkKGlkLCBnZXRTZWxlY3RlZElucHV0TWV0aG9kU3VidHlwZUlkKGlkKSk7CiAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJVbmtub3duIGlucHV0IG1ldGhvZCBmcm9tIHByZWZzOiAiICsgaWQsIGUpOwogICAgICAgICAgICAgICAgIG1DdXJNZXRob2RJZCA9IG51bGw7CkBAIC05ODEsMjEgKzk2MCw0NCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCBzZXRJbnB1dE1ldGhvZExvY2tlZChTdHJpbmcgaWQpIHsKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgc2V0SW5wdXRNZXRob2RMb2NrZWQoU3RyaW5nIGlkLCBpbnQgc3VidHlwZUlkKSB7CiAgICAgICAgIElucHV0TWV0aG9kSW5mbyBpbmZvID0gbU1ldGhvZE1hcC5nZXQoaWQpOwogICAgICAgICBpZiAoaW5mbyA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGlkOiAiICsgaWQpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGlkLmVxdWFscyhtQ3VyTWV0aG9kSWQpKSB7CisgICAgICAgICAgICBpZiAoc3VidHlwZUlkICE9IE5PVF9BX1NVQlRZUEVfSUQpIHsKKyAgICAgICAgICAgICAgICBJbnB1dE1ldGhvZFN1YnR5cGUgc3VidHlwZSA9IGluZm8uZ2V0U3VidHlwZXMoKS5nZXQoc3VidHlwZUlkKTsKKyAgICAgICAgICAgICAgICBpZiAoc3VidHlwZSAhPSBtQ3VycmVudFN1YnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTWV0aG9kTWFwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUN1ck1ldGhvZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0U2VsZWN0ZWRJbnB1dE1ldGhvZFN1YnR5cGUoaW5mbywgc3VidHlwZUlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1ck1ldGhvZC5jaGFuZ2VJbnB1dE1ldGhvZFN1YnR5cGUoc3VidHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1DdXJNZXRob2RJZCA9IGlkOworICAgICAgICAgICAgLy8gU2V0IGEgc3VidHlwZSB0byB0aGlzIGlucHV0IG1ldGhvZC4KKyAgICAgICAgICAgIC8vIHN1YnR5cGVJZCB0aGUgbmFtZSBvZiBhIHN1YnR5cGUgd2hpY2ggd2lsbCBiZSBzZXQuCisgICAgICAgICAgICBpZiAocHV0U2VsZWN0ZWRJbnB1dE1ldGhvZFN1YnR5cGUoaW5mbywgc3VidHlwZUlkKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50U3VidHlwZSA9IGluZm8uZ2V0U3VidHlwZXMoKS5nZXQoc3VidHlwZUlkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTdWJ0eXBlID0gbnVsbDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuREVGQVVMVF9JTlBVVF9NRVRIT0QsIGlkKTsKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfSU5QVVRfTUVUSE9ELCBpZCk7CiAKICAgICAgICAgICAgIGlmIChBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSB7CiAgICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9JTlBVVF9NRVRIT0RfQ0hBTkdFRCk7CkBAIC0xMjMxLDcgKzEyMzMsMjIgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNob3dJbnB1dE1ldGhvZFN1YnR5cGVQaWNrZXJGcm9tQ2xpZW50KElJbnB1dE1ldGhvZENsaWVudCBjbGllbnQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTWV0aG9kTWFwKSB7CisgICAgICAgICAgICBpZiAobUN1ckNsaWVudCA9PSBudWxsIHx8IGNsaWVudCA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgIHx8IG1DdXJDbGllbnQuY2xpZW50LmFzQmluZGVyKCkgIT0gY2xpZW50LmFzQmluZGVyKCkpIHsKKyAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiSWdub3Jpbmcgc2hvd0lucHV0U3VidHlwZU1ldGhvZERpYWxvZ0Zyb21DbGllbnQgb2Y6ICIgKyBjbGllbnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19TSE9XX0lNX1NVQlRZUEVfUElDS0VSKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHNldElucHV0TWV0aG9kKElCaW5kZXIgdG9rZW4sIFN0cmluZyBpZCkgeworICAgICAgICBzZXRJbnB1dE1ldGhvZFdpdGhTdWJ0eXBlKHRva2VuLCBpZCwgTk9UX0FfU1VCVFlQRV9JRCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldElucHV0TWV0aG9kV2l0aFN1YnR5cGUoSUJpbmRlciB0b2tlbiwgU3RyaW5nIGlkLCBpbnQgc3VidHlwZUlkKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobU1ldGhvZE1hcCkgewogICAgICAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBpZiAobUNvbnRleHQuY2hlY2tDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKQEAgLTEyNDksNyArMTI2Niw3IEBACiAKICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2V0SW5wdXRNZXRob2RMb2NrZWQoaWQpOworICAgICAgICAgICAgICAgIHNldElucHV0TWV0aG9kTG9ja2VkKGlkLCBzdWJ0eXBlSWQpOwogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7CiAgICAgICAgICAgICB9CkBAIC0xMzE1LDYgKzEzMzIsMTAgQEAKICAgICAgICAgICAgICAgICBzaG93SW5wdXRNZXRob2RNZW51KCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKKyAgICAgICAgICAgIGNhc2UgTVNHX1NIT1dfSU1fU1VCVFlQRV9QSUNLRVI6CisgICAgICAgICAgICAgICAgc2hvd0lucHV0TWV0aG9kU3VidHlwZU1lbnUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKwogICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgICAgICAgICAgIGNhc2UgTVNHX1VOQklORF9JTlBVVDoKQEAgLTE0MTQsNyArMTQzNSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIGNob29zZU5ld0RlZmF1bHRJTUVMb2NrZWQoKSB7Ci0gICAgICAgIExpc3Q8SW5wdXRNZXRob2RJbmZvPiBlbmFibGVkID0gZ2V0RW5hYmxlZElucHV0TWV0aG9kTGlzdExvY2tlZCgpOworICAgICAgICBMaXN0PElucHV0TWV0aG9kSW5mbz4gZW5hYmxlZCA9IG1TZXR0aW5ncy5nZXRFbmFibGVkSW5wdXRNZXRob2RMaXN0TG9ja2VkKCk7CiAgICAgICAgIGlmIChlbmFibGVkICE9IG51bGwgJiYgZW5hYmxlZC5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICAvLyBXZSdkIHByZWZlciB0byBmYWxsIGJhY2sgb24gYSBzeXN0ZW0gSU1FLCBzaW5jZSB0aGF0IGlzIHNhZmVyLgogICAgICAgICAgICAgaW50IGk9ZW5hYmxlZC5zaXplKCk7CkBAIC0xNDI1LDkgKzE0NDYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgSW5wdXRNZXRob2RJbmZvIGltaSA9IGVuYWJsZWQuZ2V0KGkpOwogICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfSU5QVVRfTUVUSE9ELAotICAgICAgICAgICAgICAgICAgICBlbmFibGVkLmdldChpKS5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfSU5QVVRfTUVUSE9ELCBpbWkuZ2V0SWQoKSk7CisgICAgICAgICAgICBwdXRTZWxlY3RlZElucHV0TWV0aG9kU3VidHlwZShpbWksIE5PVF9BX1NVQlRZUEVfSUQpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIApAQCAtMTQ5OCw3ICsxNTIwLDE1IEBACiAKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgICB2b2lkIHNob3dJbnB1dE1ldGhvZE1lbnUoKSB7CisgICAgcHJpdmF0ZSB2b2lkIHNob3dJbnB1dE1ldGhvZE1lbnUoKSB7CisgICAgICAgIHNob3dJbnB1dE1ldGhvZE1lbnVJbnRlcm5hbChmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNob3dJbnB1dE1ldGhvZFN1YnR5cGVNZW51KCkgeworICAgICAgICBzaG93SW5wdXRNZXRob2RNZW51SW50ZXJuYWwodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNob3dJbnB1dE1ldGhvZE1lbnVJbnRlcm5hbChib29sZWFuIHNob3dTdWJ0eXBlcykgewogICAgICAgICBpZiAoREVCVUcpIFNsb2cudihUQUcsICJTaG93IHN3aXRjaGluZyBtZW51Iik7CiAKICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gbUNvbnRleHQ7CkBAIC0xNTA3LDQ4ICsxNTM3LDg0IEBACiAKICAgICAgICAgU3RyaW5nIGxhc3RJbnB1dE1ldGhvZElkID0gU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhjb250ZXh0CiAgICAgICAgICAgICAgICAgLmdldENvbnRlbnRSZXNvbHZlcigpLCBTZXR0aW5ncy5TZWN1cmUuREVGQVVMVF9JTlBVVF9NRVRIT0QpOworICAgICAgICBpbnQgbGFzdElucHV0TWV0aG9kU3VidHlwZUlkID0gZ2V0U2VsZWN0ZWRJbnB1dE1ldGhvZFN1YnR5cGVJZChsYXN0SW5wdXRNZXRob2RJZCk7CiAgICAgICAgIGlmIChERUJVRykgU2xvZy52KFRBRywgIkN1cnJlbnQgSU1FOiAiICsgbGFzdElucHV0TWV0aG9kSWQpOwogCiAgICAgICAgIGZpbmFsIExpc3Q8SW5wdXRNZXRob2RJbmZvPiBpbW1pcyA9IGdldEVuYWJsZWRJbnB1dE1ldGhvZExpc3QoKTsKKyAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IHN1YnR5cGVJZHMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CiAKICAgICAgICAgaWYgKGltbWlzID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1NZXRob2RNYXApIHsKICAgICAgICAgICAgIGhpZGVJbnB1dE1ldGhvZE1lbnVMb2NrZWQoKTsKIAogICAgICAgICAgICAgaW50IE4gPSBpbW1pcy5zaXplKCk7CiAKLSAgICAgICAgICAgIGZpbmFsIE1hcDxDaGFyU2VxdWVuY2UsIElucHV0TWV0aG9kSW5mbz4gaW1NYXAgPQotICAgICAgICAgICAgICAgIG5ldyBUcmVlTWFwPENoYXJTZXF1ZW5jZSwgSW5wdXRNZXRob2RJbmZvPihDb2xsYXRvci5nZXRJbnN0YW5jZSgpKTsKKyAgICAgICAgICAgIGZpbmFsIE1hcDxDaGFyU2VxdWVuY2UsIFBhaXI8SW5wdXRNZXRob2RJbmZvLCBJbnRlZ2VyPj4gaW1NYXAgPQorICAgICAgICAgICAgICAgIG5ldyBUcmVlTWFwPENoYXJTZXF1ZW5jZSwgUGFpcjxJbnB1dE1ldGhvZEluZm8sIEludGVnZXI+PihDb2xsYXRvci5nZXRJbnN0YW5jZSgpKTsKIAogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyArK2kpIHsKICAgICAgICAgICAgICAgICBJbnB1dE1ldGhvZEluZm8gcHJvcGVydHkgPSBpbW1pcy5nZXQoaSk7CiAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGltTWFwLnB1dChwcm9wZXJ0eS5sb2FkTGFiZWwocG0pLCBwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogU2hvdyBvbmx5IGVuYWJsZWQgc3VidHlwZXMKKyAgICAgICAgICAgICAgICBBcnJheUxpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPiBzdWJ0eXBlcyA9IHByb3BlcnR5LmdldFN1YnR5cGVzKCk7CisgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIGxhYmVsID0gcHJvcGVydHkubG9hZExhYmVsKHBtKTsKKyAgICAgICAgICAgICAgICBpZiAoc2hvd1N1YnR5cGVzICYmIHN1YnR5cGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzdWJ0eXBlcy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRNZXRob2RTdWJ0eXBlIHN1YnR5cGUgPSBzdWJ0eXBlcy5nZXQoaik7CisgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGU7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmFtZVJlc0lkID0gc3VidHlwZS5nZXROYW1lUmVzSWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlUmVzSWQgPSBzdWJ0eXBlLmdldE1vZGVSZXNJZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVSZXNJZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBwbS5nZXRUZXh0KHByb3BlcnR5LmdldFBhY2thZ2VOYW1lKCksIG5hbWVSZXNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmdldFNlcnZpY2VJbmZvKCkuYXBwbGljYXRpb25JbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIGxhbmd1YWdlID0gc3VidHlwZS5nZXRMb2NhbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgbW9kZSA9IG1vZGVSZXNJZCA9PSAwID8gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwbS5nZXRUZXh0KHByb3BlcnR5LmdldFBhY2thZ2VOYW1lKCksIG1vZGVSZXNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZ2V0U2VydmljZUluZm8oKS5hcHBsaWNhdGlvbkluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFVzZSBtb3JlIGZyaWVuZGx5IFRpdGxlIGFuZCBVSQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gbGFiZWwgKyAiLCIgKyAobW9kZSA9PSBudWxsID8gIiIgOiBtb2RlKSArICIsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAobGFuZ3VhZ2UgPT0gbnVsbCA/ICIiIDogbGFuZ3VhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaW1NYXAucHV0KHRpdGxlLCBuZXcgUGFpcjxJbnB1dE1ldGhvZEluZm8sIEludGVnZXI+KHByb3BlcnR5LCBqKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbU1hcC5wdXQobGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBhaXI8SW5wdXRNZXRob2RJbmZvLCBJbnRlZ2VyPihwcm9wZXJ0eSwgTk9UX0FfU1VCVFlQRV9JRCkpOworICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlSWRzLmFkZCgwKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIE4gPSBpbU1hcC5zaXplKCk7CiAgICAgICAgICAgICBtSXRlbXMgPSBpbU1hcC5rZXlTZXQoKS50b0FycmF5KG5ldyBDaGFyU2VxdWVuY2VbTl0pOwotICAgICAgICAgICAgbUltcyA9IGltTWFwLnZhbHVlcygpLnRvQXJyYXkobmV3IElucHV0TWV0aG9kSW5mb1tOXSk7Ci0KKyAgICAgICAgICAgIG1JbXMgPSBuZXcgSW5wdXRNZXRob2RJbmZvW05dOworICAgICAgICAgICAgbVN1YnR5cGVJZHMgPSBuZXcgaW50W05dOwogICAgICAgICAgICAgaW50IGNoZWNrZWRJdGVtID0gMDsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgKytpKSB7CisgICAgICAgICAgICAgICAgUGFpcjxJbnB1dE1ldGhvZEluZm8sIEludGVnZXI+IHZhbHVlID0gaW1NYXAuZ2V0KG1JdGVtc1tpXSk7CisgICAgICAgICAgICAgICAgbUltc1tpXSA9IHZhbHVlLmZpcnN0OworICAgICAgICAgICAgICAgIG1TdWJ0eXBlSWRzW2ldID0gdmFsdWUuc2Vjb25kOwogICAgICAgICAgICAgICAgIGlmIChtSW1zW2ldLmdldElkKCkuZXF1YWxzKGxhc3RJbnB1dE1ldGhvZElkKSkgewotICAgICAgICAgICAgICAgICAgICBjaGVja2VkSXRlbSA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpbnQgc3VidHlwZUlkID0gbVN1YnR5cGVJZHNbaV07CisgICAgICAgICAgICAgICAgICAgIGlmICgoc3VidHlwZUlkID09IE5PVF9BX1NVQlRZUEVfSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGxhc3RJbnB1dE1ldGhvZFN1YnR5cGVJZCA9PSBOT1RfQV9TVUJUWVBFX0lEICYmIHN1YnR5cGVJZCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzdWJ0eXBlSWQgPT0gbGFzdElucHV0TWV0aG9kU3VidHlwZUlkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZEl0ZW0gPSBpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgIAorCiAgICAgICAgICAgICBBbGVydERpYWxvZy5PbkNsaWNrTGlzdGVuZXIgYWRvY2wgPSBuZXcgQWxlcnREaWFsb2cuT25DbGlja0xpc3RlbmVyKCkgewogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7CiAgICAgICAgICAgICAgICAgICAgIGhpZGVJbnB1dE1ldGhvZE1lbnUoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9OwotICAgIAorCiAgICAgICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMobnVsbCwKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRGlhbG9nUHJlZmVyZW5jZSwKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmFsZXJ0RGlhbG9nU3R5bGUsIDApOwpAQCAtMTU2MiwxOCArMTYyOCwyNCBAQAogICAgICAgICAgICAgICAgICAgICAuc2V0SWNvbihhLmdldERyYXdhYmxlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkRpYWxvZ1ByZWZlcmVuY2VfZGlhbG9nVGl0bGUpKTsKICAgICAgICAgICAgIGEucmVjeWNsZSgpOwotICAgIAorCiAgICAgICAgICAgICBtRGlhbG9nQnVpbGRlci5zZXRTaW5nbGVDaG9pY2VJdGVtcyhtSXRlbXMsIGNoZWNrZWRJdGVtLAogICAgICAgICAgICAgICAgICAgICBuZXcgQWxlcnREaWFsb2cuT25DbGlja0xpc3RlbmVyKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1NZXRob2RNYXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1JbXMgPT0gbnVsbCB8fCBtSW1zLmxlbmd0aCA8PSB3aGljaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUltcyA9PSBudWxsIHx8IG1JbXMubGVuZ3RoIDw9IHdoaWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbVN1YnR5cGVJZHMgPT0gbnVsbCB8fCBtU3VidHlwZUlkcy5sZW5ndGggPD0gd2hpY2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dE1ldGhvZEluZm8gaW0gPSBtSW1zW3doaWNoXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YnR5cGVJZCA9IG1TdWJ0eXBlSWRzW3doaWNoXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZUlucHV0TWV0aG9kTWVudSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5wdXRNZXRob2RMb2NrZWQoaW0uZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHN1YnR5cGVJZCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzdWJ0eXBlSWQgPj0gaW0uZ2V0U3VidHlwZXMoKS5zaXplKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZUlkID0gTk9UX0FfU1VCVFlQRV9JRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElucHV0TWV0aG9kTG9ja2VkKGltLmdldElkKCksIHN1YnR5cGVJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0xNjMwLDgwICsxNzAyLDI0NyBAQAogICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyBpcyBhIHZhbGlkIGlucHV0IG1ldGhvZC4KICAgICAgICAgSW5wdXRNZXRob2RJbmZvIGltbSA9IG1NZXRob2RNYXAuZ2V0KGlkKTsKICAgICAgICAgaWYgKGltbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoaW1tID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGlkOiAiICsgbUN1ck1ldGhvZElkKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gaWQ6ICIgKyBtQ3VyTWV0aG9kSWQpOwogICAgICAgICB9CiAKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoMjU2KTsKKyAgICAgICAgTGlzdDxQYWlyPFN0cmluZywgQXJyYXlMaXN0PFN0cmluZz4+PiBlbmFibGVkSW5wdXRNZXRob2RzTGlzdCA9IG1TZXR0aW5ncworICAgICAgICAgICAgICAgIC5nZXRFbmFibGVkSW5wdXRNZXRob2RzQW5kU3VidHlwZUxpc3RMb2NrZWQoKTsKIAotICAgICAgICBib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIGZpcnN0SWQgPSBudWxsOworICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgZm9yIChQYWlyPFN0cmluZywgQXJyYXlMaXN0PFN0cmluZz4+IHBhaXI6IGVuYWJsZWRJbnB1dE1ldGhvZHNMaXN0KSB7CisgICAgICAgICAgICAgICAgaWYgKHBhaXIuZmlyc3QuZXF1YWxzKGlkKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgZW5hYmxpbmcgdGhpcyBpbnB1dCBtZXRob2QsIGJ1dCBpdCBpcyBhbHJlYWR5IGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8uIFRoZSBwcmV2aW91cyBzdGF0ZSB3YXMgZW5hYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNldHRpbmdzLmFwcGVuZEFuZFB1dEVuYWJsZWRJbnB1dE1ldGhvZExvY2tlZChpZCwgZmFsc2UpOworICAgICAgICAgICAgLy8gUHJldmlvdXMgc3RhdGUgd2FzIGRpc2FibGVkLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGlmIChtU2V0dGluZ3MuYnVpbGRBbmRQdXRFbmFibGVkSW5wdXRNZXRob2RzU3RyUmVtb3ZpbmdJZExvY2tlZCgKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlciwgZW5hYmxlZElucHV0TWV0aG9kc0xpc3QsIGlkKSkgeworICAgICAgICAgICAgICAgIC8vIERpc2FibGVkIGlucHV0IG1ldGhvZCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQsIHN3aXRjaCB0byBhbm90aGVyIG9uZS4KKyAgICAgICAgICAgICAgICBTdHJpbmcgc2VsSWQgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfSU5QVVRfTUVUSE9EKTsKKyAgICAgICAgICAgICAgICBpZiAoaWQuZXF1YWxzKHNlbElkKSkgeworICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLCBTZXR0aW5ncy5TZWN1cmUuREVGQVVMVF9JTlBVVF9NRVRIT0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZElucHV0TWV0aG9kc0xpc3Quc2l6ZSgpID4gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBlbmFibGVkSW5wdXRNZXRob2RzTGlzdC5nZXQoMCkuZmlyc3QgOiAiIik7CisgICAgICAgICAgICAgICAgICAgIHJlc2V0U2VsZWN0ZWRJbnB1dE1ldGhvZFN1YnR5cGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gUHJldmlvdXMgc3RhdGUgd2FzIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBkaXNhYmxpbmcgdGhlIGlucHV0IG1ldGhvZCBidXQgaXQgaXMgYWxyZWFkeSBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRvLiAgVGhlIHByZXZpb3VzIHN0YXRlIHdhcyBkaXNhYmxlZC4KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgLy8gTG9vayB0aHJvdWdoIHRoZSBjdXJyZW50bHkgZW5hYmxlZCBpbnB1dCBtZXRob2RzLgotICAgICAgICBTdHJpbmcgZW5hYmxlZFN0ciA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfSU5QVVRfTUVUSE9EUyk7Ci0gICAgICAgIGlmIChlbmFibGVkU3RyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIFRleHRVdGlscy5TaW1wbGVTdHJpbmdTcGxpdHRlciBzcGxpdHRlciA9IG1TdHJpbmdDb2xvblNwbGl0dGVyOwotICAgICAgICAgICAgc3BsaXR0ZXIuc2V0U3RyaW5nKGVuYWJsZWRTdHIpOwotICAgICAgICAgICAgd2hpbGUgKHNwbGl0dGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBjdXJJZCA9IHNwbGl0dGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VySWQuZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGVuYWJsaW5nIHRoaXMgaW5wdXQgbWV0aG9kLCBidXQgaXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZW5hYmxlZC4gIE5vdGhpbmcgdG8gZG8uICBUaGUgcHJldmlvdXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXRlIHdhcyBlbmFibGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGRpc2FibGluZyB0aGlzIGlucHV0IG1ldGhvZCwgYW5kIGl0IGlzCi0gICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRseSBlbmFibGVkLiAgU2tpcCBpdCB0byByZW1vdmUgZnJvbSB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gbmV3IGxpc3QuCi0gICAgICAgICAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGJ1aWxkaW5nIGEgbmV3IGxpc3Qgb2YgaW5wdXQgbWV0aG9kcyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgY29udGFpbiB0aGUgZ2l2ZW4gb25lLgotICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RJZCA9PSBudWxsKSBmaXJzdElkID0gY3VySWQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWlsZGVyLmxlbmd0aCgpID4gMCkgYnVpbGRlci5hcHBlbmQoJzonKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY3VySWQpOworICAgIHByaXZhdGUgdm9pZCByZXNldFNlbGVjdGVkSW5wdXRNZXRob2RTdWJ0eXBlKCkgeworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5TRUxFQ1RFRF9JTlBVVF9NRVRIT0RfU1VCVFlQRSwgTk9UX0FfU1VCVFlQRV9JRCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHB1dFNlbGVjdGVkSW5wdXRNZXRob2RTdWJ0eXBlKElucHV0TWV0aG9kSW5mbyBpbWksIGludCBzdWJ0eXBlSWQpIHsKKyAgICAgICAgQXJyYXlMaXN0PElucHV0TWV0aG9kU3VidHlwZT4gc3VidHlwZXMgPSBpbWkuZ2V0U3VidHlwZXMoKTsKKyAgICAgICAgaWYgKHN1YnR5cGVJZCA+PSAwICYmIHN1YnR5cGVJZCA8IHN1YnR5cGVzLnNpemUoKSkgeworICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlNFTEVDVEVEX0lOUFVUX01FVEhPRF9TVUJUWVBFLAorICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlcy5nZXQoc3VidHlwZUlkKS5oYXNoQ29kZSgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzZXRTZWxlY3RlZElucHV0TWV0aG9kU3VidHlwZSgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0U2VsZWN0ZWRJbnB1dE1ldGhvZFN1YnR5cGVJZChTdHJpbmcgaWQpIHsKKyAgICAgICAgSW5wdXRNZXRob2RJbmZvIGltaSA9IG1NZXRob2RNYXAuZ2V0KGlkKTsKKyAgICAgICAgaWYgKGltaSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gTk9UX0FfU1VCVFlQRV9JRDsKKyAgICAgICAgfQorICAgICAgICBBcnJheUxpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPiBzdWJ0eXBlcyA9IGltaS5nZXRTdWJ0eXBlcygpOworICAgICAgICBpbnQgc3VidHlwZUlkOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VidHlwZUlkID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlNFTEVDVEVEX0lOUFVUX01FVEhPRF9TVUJUWVBFKTsKKyAgICAgICAgfSBjYXRjaCAoU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBOT1RfQV9TVUJUWVBFX0lEOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VidHlwZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIElucHV0TWV0aG9kU3VidHlwZSBpbXMgPSBzdWJ0eXBlcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoc3VidHlwZUlkID09IGltcy5oYXNoQ29kZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PVF9BX1NVQlRZUEVfSUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm4gdGhlIGN1cnJlbnQgc3VidHlwZSBvZiB0aGlzIGlucHV0IG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXRNZXRob2RTdWJ0eXBlIGdldEN1cnJlbnRJbnB1dE1ldGhvZFN1YnR5cGUoKSB7CisgICAgICAgIHJldHVybiBtQ3VycmVudFN1YnR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBjbGFzcyBmb3IgcHV0dGluZyBhbmQgZ2V0dGluZyBzZXR0aW5ncyBmb3IgSW5wdXRNZXRob2QKKyAgICAgKiBUT0RPOiBNb3ZlIGFsbCBwdXR0ZXJzIGFuZCBnZXR0ZXJzIG9mIHNldHRpbmdzIHRvIHRoaXMgY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5wdXRNZXRob2RTZXR0aW5ncyB7CisgICAgICAgIC8vIFRoZSBzdHJpbmcgZm9yIGVuYWJsZWQgaW5wdXQgbWV0aG9kIGlzIHNhdmVkIGFzIGZvbGxvd3M6CisgICAgICAgIC8vIGV4YW1wbGU6ICgiaW1lMDtzdWJ0eXBlMDtzdWJ0eXBlMTtzdWJ0eXBlMjppbWUxOmltZTI7c3VidHlwZTAiKQorICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIElOUFVUX01FVEhPRF9TRVBBUkFURVIgPSAnOic7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgSU5QVVRfTUVUSE9EX1NVQlRZUEVfU0VQQVJBVEVSID0gJzsnOworICAgICAgICBwcml2YXRlIGZpbmFsIFRleHRVdGlscy5TaW1wbGVTdHJpbmdTcGxpdHRlciBtU3RyaW5nQ29sb25TcGxpdHRlciA9CisgICAgICAgICAgICAgICAgbmV3IFRleHRVdGlscy5TaW1wbGVTdHJpbmdTcGxpdHRlcihJTlBVVF9NRVRIT0RfU0VQQVJBVEVSKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFRleHRVdGlscy5TaW1wbGVTdHJpbmdTcGxpdHRlciBtU3RyaW5nU2VtaUNvbG9uU3BsaXR0ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBUZXh0VXRpbHMuU2ltcGxlU3RyaW5nU3BsaXR0ZXIoSU5QVVRfTUVUSE9EX1NVQlRZUEVfU0VQQVJBVEVSKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtUmVzb2x2ZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIElucHV0TWV0aG9kSW5mbz4gbU1ldGhvZE1hcDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW5wdXRNZXRob2RJbmZvPiBtTWV0aG9kTGlzdDsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBtRW5hYmxlZElucHV0TWV0aG9kc1N0ckNhY2hlOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYnVpbGRFbmFibGVkSW5wdXRNZXRob2RzU2V0dGluZ1N0cmluZygKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIsIFBhaXI8U3RyaW5nLCBBcnJheUxpc3Q8U3RyaW5nPj4gcGFpcikgeworICAgICAgICAgICAgU3RyaW5nIGlkID0gcGFpci5maXJzdDsKKyAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHN1YnR5cGVzID0gcGFpci5zZWNvbmQ7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChpZCk7CisgICAgICAgICAgICBpZiAoc3VidHlwZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHN1YnR5cGVzLmdldCgwKSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzdWJ0eXBlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChJTlBVVF9NRVRIT0RfU1VCVFlQRV9TRVBBUkFURVIpLmFwcGVuZChzdWJ0eXBlcy5nZXQoaSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmICghZW5hYmxlZCkgewotICAgICAgICAgICAgaWYgKCFyZW1vdmVkKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgYXJlIGRpc2FibGluZyB0aGUgaW5wdXQgbWV0aG9kIGJ1dCBpdCBpcyBhbHJlYWR5Ci0gICAgICAgICAgICAgICAgLy8gZGlzYWJsZWQuICBOb3RoaW5nIHRvIGRvLiAgVGhlIHByZXZpb3VzIHN0YXRlIHdhcwotICAgICAgICAgICAgICAgIC8vIGRpc2FibGVkLgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2V0dGluZyB3aXRoIHRoZSBuZXcgbGlzdCBvZiBpbnB1dCBtZXRob2RzLgotICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfSU5QVVRfTUVUSE9EUywgYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgIC8vIFdlIHRoZSBkaXNhYmxlZCBpbnB1dCBtZXRob2QgaXMgY3VycmVudGx5IHNlbGVjdGVkLCBzd2l0Y2gKLSAgICAgICAgICAgIC8vIHRvIGFub3RoZXIgb25lLgotICAgICAgICAgICAgU3RyaW5nIHNlbElkID0gU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfSU5QVVRfTUVUSE9EKTsKLSAgICAgICAgICAgIGlmIChpZC5lcXVhbHMoc2VsSWQpKSB7Ci0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5ERUZBVUxUX0lOUFVUX01FVEhPRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SWQgIT0gbnVsbCA/IGZpcnN0SWQgOiAiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBQcmV2aW91cyBzdGF0ZSB3YXMgZW5hYmxlZC4KLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBwdWJsaWMgSW5wdXRNZXRob2RTZXR0aW5ncygKKyAgICAgICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIsIEhhc2hNYXA8U3RyaW5nLCBJbnB1dE1ldGhvZEluZm8+IG1ldGhvZE1hcCwKKyAgICAgICAgICAgICAgICBBcnJheUxpc3Q8SW5wdXRNZXRob2RJbmZvPiBtZXRob2RMaXN0KSB7CisgICAgICAgICAgICBtUmVzb2x2ZXIgPSByZXNvbHZlcjsKKyAgICAgICAgICAgIG1NZXRob2RNYXAgPSBtZXRob2RNYXA7CisgICAgICAgICAgICBtTWV0aG9kTGlzdCA9IG1ldGhvZExpc3Q7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBBZGQgaW4gdGhlIG5ld2x5IGVuYWJsZWQgaW5wdXQgbWV0aG9kLgotICAgICAgICBpZiAoZW5hYmxlZFN0ciA9PSBudWxsIHx8IGVuYWJsZWRTdHIubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgZW5hYmxlZFN0ciA9IGlkOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZW5hYmxlZFN0ciA9IGVuYWJsZWRTdHIgKyAnOicgKyBpZDsKKyAgICAgICAgcHVibGljIExpc3Q8SW5wdXRNZXRob2RJbmZvPiBnZXRFbmFibGVkSW5wdXRNZXRob2RMaXN0TG9ja2VkKCkgeworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVuYWJsZWRJbnB1dE1ldGhvZExpc3RMb2NrZWQoCisgICAgICAgICAgICAgICAgICAgIGdldEVuYWJsZWRJbnB1dE1ldGhvZHNBbmRTdWJ0eXBlTGlzdExvY2tlZCgpKTsKICAgICAgICAgfQogCi0gICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfSU5QVVRfTUVUSE9EUywgZW5hYmxlZFN0cik7CisgICAgICAgIC8vIEF0IHRoZSBpbml0aWFsIGJvb3QsIHRoZSBzZXR0aW5ncyBmb3IgaW5wdXQgbWV0aG9kcyBhcmUgbm90IHNldCwKKyAgICAgICAgLy8gc28gd2UgbmVlZCB0byBlbmFibGUgSU1FIGluIHRoYXQgY2FzZS4KKyAgICAgICAgcHVibGljIHZvaWQgZW5hYmxlQWxsSU1Fc0lmVGhlcmVJc05vRW5hYmxlZElNRSgpIHsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShnZXRFbmFibGVkSW5wdXRNZXRob2RzU3RyKCkpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtTWV0aG9kTGlzdC5zaXplKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRNZXRob2RJbmZvIGltaSA9IG1NZXRob2RMaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIkFkZGluZzogIiArIGltaS5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSBzYi5hcHBlbmQoJzonKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGltaS5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHV0RW5hYmxlZElucHV0TWV0aG9kc1N0cihzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0gICAgICAgIC8vIFByZXZpb3VzIHN0YXRlIHdhcyBkaXNhYmxlZC4KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBwdWJsaWMgTGlzdDxQYWlyPFN0cmluZywgQXJyYXlMaXN0PFN0cmluZz4+PiBnZXRFbmFibGVkSW5wdXRNZXRob2RzQW5kU3VidHlwZUxpc3RMb2NrZWQoKSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIEFycmF5TGlzdDxTdHJpbmc+Pj4gaW1zTGlzdAorICAgICAgICAgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIEFycmF5TGlzdDxTdHJpbmc+Pj4oKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmFibGVkSW5wdXRNZXRob2RzU3RyID0gZ2V0RW5hYmxlZElucHV0TWV0aG9kc1N0cigpOworICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGVuYWJsZWRJbnB1dE1ldGhvZHNTdHIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGltc0xpc3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RyaW5nQ29sb25TcGxpdHRlci5zZXRTdHJpbmcoZW5hYmxlZElucHV0TWV0aG9kc1N0cik7CisgICAgICAgICAgICB3aGlsZSAobVN0cmluZ0NvbG9uU3BsaXR0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5leHRJbXNTdHIgPSBtU3RyaW5nQ29sb25TcGxpdHRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgbVN0cmluZ1NlbWlDb2xvblNwbGl0dGVyLnNldFN0cmluZyhuZXh0SW1zU3RyKTsKKyAgICAgICAgICAgICAgICBpZiAobVN0cmluZ1NlbWlDb2xvblNwbGl0dGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBzdWJ0eXBlSGFzaGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBlbGVtZW50IGlzIGltZSBpZC4KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGltZUlkID0gbVN0cmluZ1NlbWlDb2xvblNwbGl0dGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG1TdHJpbmdTZW1pQ29sb25TcGxpdHRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGVIYXNoZXMuYWRkKG1TdHJpbmdTZW1pQ29sb25TcGxpdHRlci5uZXh0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGltc0xpc3QuYWRkKG5ldyBQYWlyPFN0cmluZywgQXJyYXlMaXN0PFN0cmluZz4+KGltZUlkLCBzdWJ0eXBlSGFzaGVzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGltc0xpc3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhcHBlbmRBbmRQdXRFbmFibGVkSW5wdXRNZXRob2RMb2NrZWQoU3RyaW5nIGlkLCBib29sZWFuIHJlbG9hZElucHV0TWV0aG9kU3RyKSB7CisgICAgICAgICAgICBpZiAocmVsb2FkSW5wdXRNZXRob2RTdHIpIHsKKyAgICAgICAgICAgICAgICBnZXRFbmFibGVkSW5wdXRNZXRob2RzU3RyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobUVuYWJsZWRJbnB1dE1ldGhvZHNTdHJDYWNoZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBBZGQgaW4gdGhlIG5ld2x5IGVuYWJsZWQgaW5wdXQgbWV0aG9kLgorICAgICAgICAgICAgICAgIHB1dEVuYWJsZWRJbnB1dE1ldGhvZHNTdHIoaWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwdXRFbmFibGVkSW5wdXRNZXRob2RzU3RyKAorICAgICAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWRJbnB1dE1ldGhvZHNTdHJDYWNoZSArIElOUFVUX01FVEhPRF9TRVBBUkFURVIgKyBpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGQgYW5kIHB1dCBhIHN0cmluZyBvZiBFbmFibGVkSW5wdXRNZXRob2RzIHdpdGggcmVtb3Zpbmcgc3BlY2lmaWVkIElkLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBzcGVjaWZpZWQgaWQgd2FzIHJlbW92ZWQgb3Igbm90LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gYnVpbGRBbmRQdXRFbmFibGVkSW5wdXRNZXRob2RzU3RyUmVtb3ZpbmdJZExvY2tlZCgKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIsIExpc3Q8UGFpcjxTdHJpbmcsIEFycmF5TGlzdDxTdHJpbmc+Pj4gaW1zTGlzdCwgU3RyaW5nIGlkKSB7CisgICAgICAgICAgICBib29sZWFuIGlzUmVtb3ZlZCA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBuZWVkc0FwcGVuZFNlcGFyYXRvciA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChQYWlyPFN0cmluZywgQXJyYXlMaXN0PFN0cmluZz4+IGltczogaW1zTGlzdCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBjdXJJZCA9IGltcy5maXJzdDsKKyAgICAgICAgICAgICAgICBpZiAoY3VySWQuZXF1YWxzKGlkKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgZGlzYWJsaW5nIHRoaXMgaW5wdXQgbWV0aG9kLCBhbmQgaXQgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudGx5IGVuYWJsZWQuICBTa2lwIGl0IHRvIHJlbW92ZSBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBuZXcgbGlzdC4KKyAgICAgICAgICAgICAgICAgICAgaXNSZW1vdmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAobmVlZHNBcHBlbmRTZXBhcmF0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKElOUFVUX01FVEhPRF9TRVBBUkFURVIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbmVlZHNBcHBlbmRTZXBhcmF0b3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkRW5hYmxlZElucHV0TWV0aG9kc1NldHRpbmdTdHJpbmcoYnVpbGRlciwgaW1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXNSZW1vdmVkKSB7CisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzZXR0aW5nIHdpdGggdGhlIG5ldyBsaXN0IG9mIGlucHV0IG1ldGhvZHMuCisgICAgICAgICAgICAgICAgcHV0RW5hYmxlZElucHV0TWV0aG9kc1N0cihidWlsZGVyLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGlzUmVtb3ZlZDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgTGlzdDxJbnB1dE1ldGhvZEluZm8+IGNyZWF0ZUVuYWJsZWRJbnB1dE1ldGhvZExpc3RMb2NrZWQoCisgICAgICAgICAgICAgICAgTGlzdDxQYWlyPFN0cmluZywgQXJyYXlMaXN0PFN0cmluZz4+PiBpbXNMaXN0KSB7CisgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8SW5wdXRNZXRob2RJbmZvPiByZXMgPSBuZXcgQXJyYXlMaXN0PElucHV0TWV0aG9kSW5mbz4oKTsKKyAgICAgICAgICAgIGZvciAoUGFpcjxTdHJpbmcsIEFycmF5TGlzdDxTdHJpbmc+PiBpbXM6IGltc0xpc3QpIHsKKyAgICAgICAgICAgICAgICBJbnB1dE1ldGhvZEluZm8gaW5mbyA9IG1NZXRob2RNYXAuZ2V0KGltcy5maXJzdCk7CisgICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXMuYWRkKGluZm8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcHV0RW5hYmxlZElucHV0TWV0aG9kc1N0cihTdHJpbmcgc3RyKSB7CisgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKG1SZXNvbHZlciwgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfSU5QVVRfTUVUSE9EUywgc3RyKTsKKyAgICAgICAgICAgIG1FbmFibGVkSW5wdXRNZXRob2RzU3RyQ2FjaGUgPSBzdHI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRFbmFibGVkSW5wdXRNZXRob2RzU3RyKCkgeworICAgICAgICAgICAgbUVuYWJsZWRJbnB1dE1ldGhvZHNTdHJDYWNoZSA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIG1SZXNvbHZlciwgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfSU5QVVRfTUVUSE9EUyk7CisgICAgICAgICAgICByZXR1cm4gbUVuYWJsZWRJbnB1dE1ldGhvZHNTdHJDYWNoZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0xvY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0xvY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCAzNjFjZDNiLi4xOWVhNGUxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Mb2NhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTG9jYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhCkBAIC00NzUsMTQgKzQ3NSwxNyBAQAogICAgICAgICBtRW5hYmxlZFByb3ZpZGVycy5hZGQocGFzc2l2ZVByb3ZpZGVyLmdldE5hbWUoKSk7CiAKICAgICAgICAgLy8gaW5pdGlhbGl6ZSBleHRlcm5hbCBuZXR3b3JrIGxvY2F0aW9uIGFuZCBnZW9jb2RlciBzZXJ2aWNlcwotICAgICAgICBpZiAobU5ldHdvcmtMb2NhdGlvblByb3ZpZGVyUGFja2FnZU5hbWUgIT0gbnVsbCkgeworICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGlmIChtTmV0d29ya0xvY2F0aW9uUHJvdmlkZXJQYWNrYWdlTmFtZSAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgcG0ucmVzb2x2ZVNlcnZpY2UobmV3IEludGVudChtTmV0d29ya0xvY2F0aW9uUHJvdmlkZXJQYWNrYWdlTmFtZSksIDApICE9IG51bGwpIHsKICAgICAgICAgICAgIG1OZXR3b3JrTG9jYXRpb25Qcm92aWRlciA9CiAgICAgICAgICAgICAgICAgbmV3IExvY2F0aW9uUHJvdmlkZXJQcm94eShtQ29udGV4dCwgTG9jYXRpb25NYW5hZ2VyLk5FVFdPUktfUFJPVklERVIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtTmV0d29ya0xvY2F0aW9uUHJvdmlkZXJQYWNrYWdlTmFtZSwgbUxvY2F0aW9uSGFuZGxlcik7CiAgICAgICAgICAgICBhZGRQcm92aWRlcihtTmV0d29ya0xvY2F0aW9uUHJvdmlkZXIpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1HZW9jb2RlUHJvdmlkZXJQYWNrYWdlTmFtZSAhPSBudWxsKSB7CisgICAgICAgIGlmIChtR2VvY29kZVByb3ZpZGVyUGFja2FnZU5hbWUgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgIHBtLnJlc29sdmVTZXJ2aWNlKG5ldyBJbnRlbnQobUdlb2NvZGVQcm92aWRlclBhY2thZ2VOYW1lKSwgMCkgIT0gbnVsbCkgewogICAgICAgICAgICAgbUdlb2NvZGVQcm92aWRlciA9IG5ldyBHZW9jb2RlclByb3h5KG1Db250ZXh0LCBtR2VvY29kZVByb3ZpZGVyUGFja2FnZU5hbWUpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL01vdW50U2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEKaW5kZXggNWJmMmE0Mi4uNzg3MGIwNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEKQEAgLTE0OCw2ICsxNDgsOCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQm9vdGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWFkeSA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VuZFVtc0Nvbm5lY3RlZE9uQm9vdCA9IGZhbHNlOworICAgIC8vIHRydWUgaWYgd2Ugc2hvdWxkIGZha2UgTUVESUFfTU9VTlRFRCBzdGF0ZSBmb3IgZXh0ZXJuYWwgc3RvcmFnZQorICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW11bGF0ZUV4dGVybmFsU3RvcmFnZSA9IGZhbHNlOwogCiAgICAgLyoqCiAgICAgICogUHJpdmF0ZSBoYXNoIG9mIGN1cnJlbnRseSBtb3VudGVkIHNlY3VyZSBjb250YWluZXJzLgpAQCAtNDMxLDcgKzQzMyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKS5nZXRQYXRoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0YXRlID0gZ2V0Vm9sdW1lU3RhdGUocGF0aCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZXF1YWxzKEVudmlyb25tZW50Lk1FRElBX1VOTU9VTlRFRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUVtdWxhdGVFeHRlcm5hbFN0b3JhZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5Vm9sdW1lU3RhdGVDaGFuZ2UobnVsbCwgcGF0aCwgVm9sdW1lU3RhdGUuTm9NZWRpYSwgVm9sdW1lU3RhdGUuTW91bnRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lcXVhbHMoRW52aXJvbm1lbnQuTUVESUFfVU5NT1VOVEVEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmMgPSBkb01vdW50Vm9sdW1lKHBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmMgIT0gU3RvcmFnZVJlc3VsdENvZGUuT3BlcmF0aW9uU3VjY2VlZGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCBTdHJpbmcuZm9ybWF0KCJCb290LXRpbWUgbW91bnQgZmFpbGVkICglZCkiLCByYykpOwpAQCAtNTAyLDExICs1MDYsMTMgQEAKICAgICAgICAgICAgIFNsb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIkR1cGxpY2F0ZSBzdGF0ZSB0cmFuc2l0aW9uICglcyAtPiAlcykiLCBtTGVnYWN5U3RhdGUsIHN0YXRlKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgLy8gVXBkYXRlIHN0YXRlIG9uIFBhY2thZ2VNYW5hZ2VyCi0gICAgICAgIGlmIChFbnZpcm9ubWVudC5NRURJQV9VTk1PVU5URUQuZXF1YWxzKHN0YXRlKSkgewotICAgICAgICAgICAgbVBtcy51cGRhdGVFeHRlcm5hbE1lZGlhU3RhdHVzKGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoRW52aXJvbm1lbnQuTUVESUFfTU9VTlRFRC5lcXVhbHMoc3RhdGUpKSB7Ci0gICAgICAgICAgICBtUG1zLnVwZGF0ZUV4dGVybmFsTWVkaWFTdGF0dXModHJ1ZSwgZmFsc2UpOworICAgICAgICAvLyBVcGRhdGUgc3RhdGUgb24gUGFja2FnZU1hbmFnZXIsIGJ1dCBvbmx5IG9mIHJlYWwgZXZlbnRzCisgICAgICAgIGlmICghbUVtdWxhdGVFeHRlcm5hbFN0b3JhZ2UpIHsKKyAgICAgICAgICAgIGlmIChFbnZpcm9ubWVudC5NRURJQV9VTk1PVU5URUQuZXF1YWxzKHN0YXRlKSkgeworICAgICAgICAgICAgICAgIG1QbXMudXBkYXRlRXh0ZXJuYWxNZWRpYVN0YXR1cyhmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgfSBlbHNlIGlmIChFbnZpcm9ubWVudC5NRURJQV9NT1VOVEVELmVxdWFscyhzdGF0ZSkpIHsKKyAgICAgICAgICAgICAgICBtUG1zLnVwZGF0ZUV4dGVybmFsTWVkaWFTdGF0dXModHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gUmVtb3ZlIGFsbCBPQkIgbWFwcGluZ3MgYW5kIGxpc3RlbmVycyBmcm9tIHRoaXMgcGF0aApAQCAtMTA0Myw2ICsxMDQ5LDEzIEBACiAgICAgcHVibGljIE1vdW50U2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogCisgICAgICAgIG1FbXVsYXRlRXh0ZXJuYWxTdG9yYWdlID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfZW11bGF0ZUV4dGVybmFsU3RvcmFnZSk7CisgICAgICAgIGlmIChtRW11bGF0ZUV4dGVybmFsU3RvcmFnZSkgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgInVzaW5nIGVtdWxhdGVkIGV4dGVybmFsIHN0b3JhZ2UiKTsKKyAgICAgICAgICAgIG1MZWdhY3lTdGF0ZSA9IEVudmlyb25tZW50Lk1FRElBX01PVU5URUQ7CisgICAgICAgIH0KKwogICAgICAgICAvLyBYWFg6IFRoaXMgd2lsbCBnbyBhd2F5IHNvb24gaW4gZmF2b3Igb2YgSU1vdW50U2VydmljZU9ic2VydmVyCiAgICAgICAgIG1QbXMgPSAoUGFja2FnZU1hbmFnZXJTZXJ2aWNlKSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKCJwYWNrYWdlIik7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05hdGl2ZURhZW1vbkNvbm5lY3Rvci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEKaW5kZXggN2I2OGQ2OC4uY2Y4N2E5ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEKQEAgLTEzMiwxMSArMTMyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCBTdHJpbmcuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgaGFuZGxpbmcgJyVzJyIsIGV2ZW50KSwgZXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNwb25zZVF1ZXVlLnB1dChldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byBwdXQgcmVzcG9uc2Ugb250byBxdWV1ZSIsIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc3BvbnNlUXVldWUucHV0KGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsZWQgdG8gcHV0IHJlc3BvbnNlIG9udG8gcXVldWUiLCBleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiQmFkIG1zZyAoJXMpIiwgZXZlbnQpKTsKQEAgLTIxOSw2ICsyMjAsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQXJyYXlMaXN0PFN0cmluZz4gZG9Db21tYW5kKFN0cmluZyBjbWQpCiAgICAgICAgICAgICB0aHJvd3MgTmF0aXZlRGFlbW9uQ29ubmVjdG9yRXhjZXB0aW9uICB7CisgICAgICAgIG1SZXNwb25zZVF1ZXVlLmNsZWFyKCk7CiAgICAgICAgIHNlbmRDb21tYW5kKGNtZCk7CiAKICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcmVzcG9uc2UgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmphdmEKaW5kZXggZjBhY2RjMC4uOGRiZDNlNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmphdmEKQEAgLTIyNiwxMCArMjI2LDEwIEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVua25vd25Ib3N0RXhjZXB0aW9uKGFkZHJTdHJpbmcpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbnQgYSA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMF0pICAgICAgOwotICAgICAgICAgICAgaW50IGIgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzFdKSA8PCAgODsKLSAgICAgICAgICAgIGludCBjID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1syXSkgPDwgMTY7Ci0gICAgICAgICAgICBpbnQgZCA9IEludGVnZXIucGFyc2VJbnQocGFydHNbM10pIDw8IDI0OworICAgICAgICAgICAgaW50IGEgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzBdKSA8PCAyNDsKKyAgICAgICAgICAgIGludCBiID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1sxXSkgPDwgMTY7CisgICAgICAgICAgICBpbnQgYyA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMl0pIDw8ICA4OworICAgICAgICAgICAgaW50IGQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzNdKSAgICAgIDsKIAogICAgICAgICAgICAgcmV0dXJuIGEgfCBiIHwgYyB8IGQ7CiAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya1RpbWVVcGRhdGVTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9OZXR3b3JrVGltZVVwZGF0ZVNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmY4NGViCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya1RpbWVVcGRhdGVTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlJbnRlbnRzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQubmV0LlNudHBDbGllbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLyoqCisgKiBNb25pdG9ycyB0aGUgbmV0d29yayB0aW1lIGFuZCB1cGRhdGVzIHRoZSBzeXN0ZW0gdGltZSBpZiBpdCBpcyBvdXQgb2Ygc3luYworICogYW5kIHRoZXJlIGhhc24ndCBiZWVuIGFueSBOSVRaIHVwZGF0ZSBmcm9tIHRoZSBjYXJyaWVyIHJlY2VudGx5LgorICogSWYgbG9va2luZyB1cCB0aGUgbmV0d29yayB0aW1lIGZhaWxzIGZvciBzb21lIHJlYXNvbiwgaXQgdHJpZXMgYSBmZXcgdGltZXMgd2l0aCBhIHNob3J0CisgKiBpbnRlcnZhbCBhbmQgdGhlbiByZXNldHMgdG8gY2hlY2tpbmcgb24gbG9uZ2VyIGludGVydmFscy4KKyAqIDxwPgorICogSWYgdGhlIHVzZXIgZW5hYmxlcyBBVVRPX1RJTUUsIGl0IHdpbGwgY2hlY2sgaW1tZWRpYXRlbHkgZm9yIHRoZSBuZXR3b3JrIHRpbWUsIGlmIE5JVFogd2Fzbid0CisgKiBhdmFpbGFibGUuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBOZXR3b3JrVGltZVVwZGF0ZVNlcnZpY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOZXR3b3JrVGltZVVwZGF0ZVNlcnZpY2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfQVVUT19USU1FX0NIQU5HRUQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9QT0xMX05FVFdPUktfVElNRSA9IDI7CisKKyAgICAvKiogTm9ybWFsIHBvbGxpbmcgZnJlcXVlbmN5ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQT0xMSU5HX0lOVEVSVkFMX01TID0gMjRMICogNjAgKiA2MCAqIDEwMDA7IC8vIDI0IGhycworICAgIC8qKiBUcnktYWdhaW4gcG9sbGluZyBpbnRlcnZhbCwgaW4gY2FzZSB0aGUgbmV0d29yayByZXF1ZXN0IGZhaWxlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUE9MTElOR19JTlRFUlZBTF9TSE9SVEVSX01TID0gNjAgKiAxMDAwTDsgLy8gNjAgc2Vjb25kcworICAgIC8qKiBOdW1iZXIgb2YgdGltZXMgdG8gdHJ5IGFnYWluICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSWV9BR0FJTl9USU1FU19NQVggPSAzOworICAgIC8qKiBIb3cgbG9uZyB0byB3YWl0IGZvciB0aGUgTlRQIHNlcnZlciB0byByZXNwb25kLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlRQX0ZFVENIX1dBSVRfTVMgPSAyMCAqIDEwMDA7CisgICAgLyoqIElmIHRoZSB0aW1lIGRpZmZlcmVuY2UgaXMgZ3JlYXRlciB0aGFuIHRoaXMgdGhyZXNob2xkLCB0aGVuIHVwZGF0ZSB0aGUgdGltZS4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRV9FUlJPUl9USFJFU0hPTERfTVMgPSA1ICogMTAwMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUE9MTCA9CisgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLk5ldHdvcmtUaW1lVXBkYXRlU2VydmljZS5hY3Rpb24uUE9MTCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfRklMRSA9ICIvZXRjL2dwcy5jb25mIjsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgUE9MTF9SRVFVRVNUID0gMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTk9UX1NFVCA9IC0xOworICAgIHByaXZhdGUgbG9uZyBtTml0elRpbWVTZXRUaW1lID0gTk9UX1NFVDsKKyAgICAvLyBUT0RPOiBIYXZlIGEgd2F5IHRvIGxvb2sgdXAgdGhlIHRpbWV6b25lIHdlIGFyZSBpbgorICAgIHByaXZhdGUgbG9uZyBtTml0elpvbmVTZXRUaW1lID0gTk9UX1NFVDsKKworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICAvLyBOVFAgbG9va3VwIGlzIGRvbmUgb24gdGhpcyB0aHJlYWQgYW5kIGhhbmRsZXIKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgcHJpdmF0ZSBIYW5kbGVyVGhyZWFkIG1UaHJlYWQ7CisgICAgcHJpdmF0ZSBBbGFybU1hbmFnZXIgbUFsYXJtTWFuYWdlcjsKKyAgICBwcml2YXRlIFBlbmRpbmdJbnRlbnQgbVBlbmRpbmdQb2xsSW50ZW50OworICAgIHByaXZhdGUgU2V0dGluZ3NPYnNlcnZlciBtU2V0dGluZ3NPYnNlcnZlcjsKKyAgICAvLyBBZGRyZXNzIG9mIHRoZSBOVFAgc2VydmVyCisgICAgcHJpdmF0ZSBTdHJpbmcgbU50cFNlcnZlcjsKKyAgICAvLyBUaGUgbGFzdCB0aW1lIHRoYXQgd2Ugc3VjY2Vzc2Z1bGx5IGZldGNoZWQgdGhlIE5UUCB0aW1lLgorICAgIHByaXZhdGUgbG9uZyBtTGFzdE50cEZldGNoVGltZSA9IE5PVF9TRVQ7CisgICAgLy8gS2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgcXVpY2sgYXR0ZW1wdHMgd2VyZSBtYWRlIHRvIGZldGNoIE5UUCB0aW1lLgorICAgIC8vIER1cmluZyBib290dXAsIHRoZSBuZXR3b3JrIG1heSBub3QgaGF2ZSBiZWVuIHVwIHlldCwgb3IgaXQncyB0YWtpbmcgdGltZSBmb3IgdGhlCisgICAgLy8gY29ubmVjdGlvbiB0byBoYXBwZW4uCisgICAgcHJpdmF0ZSBpbnQgbVRyeUFnYWluQ291bnRlcjsKKworICAgIHB1YmxpYyBOZXR3b3JrVGltZVVwZGF0ZVNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbUFsYXJtTWFuYWdlciA9IChBbGFybU1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BTEFSTV9TRVJWSUNFKTsKKyAgICAgICAgSW50ZW50IHBvbGxJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9QT0xMLCBudWxsKTsKKyAgICAgICAgbVBlbmRpbmdQb2xsSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QobUNvbnRleHQsIFBPTExfUkVRVUVTVCwgcG9sbEludGVudCwgMCk7CisgICAgfQorCisgICAgLyoqIEluaXRpYWxpemUgdGhlIHJlY2VpdmVycyBhbmQgaW5pdGlhdGUgdGhlIGZpcnN0IE5UUCByZXF1ZXN0ICovCisgICAgcHVibGljIHZvaWQgc3lzdGVtUmVhZHkoKSB7CisgICAgICAgIG1OdHBTZXJ2ZXIgPSBnZXROdHBTZXJ2ZXJBZGRyZXNzKCk7CisgICAgICAgIGlmIChtTnRwU2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJOVFAgc2VydmVyIGFkZHJlc3Mgbm90IGZvdW5kLCBub3Qgc3luY2luZyB0byBOVFAgdGltZSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcmVnaXN0ZXJGb3JUZWxlcGhvbnlJbnRlbnRzKCk7CisgICAgICAgIHJlZ2lzdGVyRm9yQWxhcm1zKCk7CisKKyAgICAgICAgbVRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKFRBRyk7CisgICAgICAgIG1UaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbUhhbmRsZXIgPSBuZXcgTXlIYW5kbGVyKG1UaHJlYWQuZ2V0TG9vcGVyKCkpOworICAgICAgICAvLyBDaGVjayB0aGUgbmV0d29yayB0aW1lIG9uIHRoZSBuZXcgdGhyZWFkCisgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfUE9MTF9ORVRXT1JLX1RJTUUpLnNlbmRUb1RhcmdldCgpOworCisgICAgICAgIG1TZXR0aW5nc09ic2VydmVyID0gbmV3IFNldHRpbmdzT2JzZXJ2ZXIobUhhbmRsZXIsIEVWRU5UX0FVVE9fVElNRV9DSEFOR0VEKTsKKyAgICAgICAgbVNldHRpbmdzT2JzZXJ2ZXIub2JzZXJ2ZShtQ29udGV4dCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TnRwU2VydmVyQWRkcmVzcygpIHsKKyAgICAgICAgU3RyaW5nIHNlcnZlckFkZHJlc3MgPSBudWxsOworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShQUk9QRVJUSUVTX0ZJTEUpOworICAgICAgICAgICAgc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgICAgIHByb3BlcnRpZXMubG9hZChzdHJlYW0pOworICAgICAgICAgICAgc2VydmVyQWRkcmVzcyA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIk5UUF9TRVJWRVIiLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNvdWxkIG5vdCBvcGVuIEdQUyBjb25maWd1cmF0aW9uIGZpbGUgIiArIFBST1BFUlRJRVNfRklMRSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2VydmVyQWRkcmVzczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJGb3JUZWxlcGhvbnlJbnRlbnRzKCkgeworICAgICAgICBJbnRlbnRGaWx0ZXIgaW50ZW50RmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKFRlbGVwaG9ueUludGVudHMuQUNUSU9OX05FVFdPUktfU0VUX1RJTUUpOworICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKFRlbGVwaG9ueUludGVudHMuQUNUSU9OX05FVFdPUktfU0VUX1RJTUVaT05FKTsKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtTml0elJlY2VpdmVyLCBpbnRlbnRGaWx0ZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckZvckFsYXJtcygpIHsKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcigKKyAgICAgICAgICAgIG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfUE9MTF9ORVRXT1JLX1RJTUUpLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIG5ldyBJbnRlbnRGaWx0ZXIoQUNUSU9OX1BPTEwpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25Qb2xsTmV0d29ya1RpbWUoaW50IGV2ZW50KSB7CisgICAgICAgIC8vIElmIEF1dG9tYXRpYyB0aW1lIGlzIG5vdCBzZXQsIGRvbid0IGJvdGhlci4KKyAgICAgICAgaWYgKCFpc0F1dG9tYXRpY1RpbWVSZXF1ZXN0ZWQoKSkgcmV0dXJuOworCisgICAgICAgIGZpbmFsIGxvbmcgcmVmVGltZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOworICAgICAgICAvLyBJZiBOSVRaIHRpbWUgd2FzIHJlY2VpdmVkIGxlc3MgdGhhbiBQT0xMSU5HX0lOVEVSVkFMX01TIHRpbWUgYWdvLAorICAgICAgICAvLyBubyBuZWVkIHRvIHN5bmMgdG8gTlRQLgorICAgICAgICBpZiAobU5pdHpUaW1lU2V0VGltZSAhPSBOT1RfU0VUICYmIHJlZlRpbWUgLSBtTml0elRpbWVTZXRUaW1lIDwgUE9MTElOR19JTlRFUlZBTF9NUykgeworICAgICAgICAgICAgcmVzZXRBbGFybShQT0xMSU5HX0lOVEVSVkFMX01TKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBsb25nIGN1cnJlbnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIlN5c3RlbSB0aW1lID0gIiArIGN1cnJlbnRUaW1lKTsKKyAgICAgICAgLy8gR2V0IHRoZSBOVFAgdGltZQorICAgICAgICBpZiAobUxhc3ROdHBGZXRjaFRpbWUgPT0gTk9UX1NFVCB8fCByZWZUaW1lID49IG1MYXN0TnRwRmV0Y2hUaW1lICsgUE9MTElOR19JTlRFUlZBTF9NUworICAgICAgICAgICAgICAgIHx8IGV2ZW50ID09IEVWRU5UX0FVVE9fVElNRV9DSEFOR0VEKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJCZWZvcmUgTnRwIGZldGNoIik7CisgICAgICAgICAgICBsb25nIG50cCA9IGdldE50cFRpbWUoKTsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIk50cCA9ICIgKyBudHApOworICAgICAgICAgICAgaWYgKG50cCA+IDApIHsKKyAgICAgICAgICAgICAgICBtVHJ5QWdhaW5Db3VudGVyID0gMDsKKyAgICAgICAgICAgICAgICBtTGFzdE50cEZldGNoVGltZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOworICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhudHAgLSBjdXJyZW50VGltZSkgPiBUSU1FX0VSUk9SX1RIUkVTSE9MRF9NUykgeworICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHN5c3RlbSB0aW1lCisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIk50cCB0aW1lIHRvIGJlIHNldCA9ICIgKyBudHApOworICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcmZsb3csIHNpbmNlIGl0J3MgZ29pbmcgdG8gYmUgY29udmVydGVkIHRvIGFuIGludAorICAgICAgICAgICAgICAgICAgICBpZiAobnRwIC8gMTAwMCA8IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1DbG9jay5zZXRDdXJyZW50VGltZU1pbGxpcyhudHApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiTnRwIHRpbWUgaXMgY2xvc2UgZW5vdWdoID0gIiArIG50cCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUcnkgYWdhaW4gc2hvcnRseQorICAgICAgICAgICAgICAgIG1UcnlBZ2FpbkNvdW50ZXIrKzsKKyAgICAgICAgICAgICAgICBpZiAobVRyeUFnYWluQ291bnRlciA8PSBUUllfQUdBSU5fVElNRVNfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc2V0QWxhcm0oUE9MTElOR19JTlRFUlZBTF9TSE9SVEVSX01TKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBUcnkgbXVjaCBsYXRlcgorICAgICAgICAgICAgICAgICAgICBtVHJ5QWdhaW5Db3VudGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcmVzZXRBbGFybShQT0xMSU5HX0lOVEVSVkFMX01TKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlc2V0QWxhcm0oUE9MTElOR19JTlRFUlZBTF9NUyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuY2VsIG9sZCBhbGFybSBhbmQgc3RhcnRzIGEgbmV3IG9uZSBmb3IgdGhlIHNwZWNpZmllZCBpbnRlcnZhbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlcnZhbCB3aGVuIHRvIHRyaWdnZXIgdGhlIGFsYXJtLCBzdGFydGluZyBmcm9tIG5vdy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVzZXRBbGFybShsb25nIGludGVydmFsKSB7CisgICAgICAgIG1BbGFybU1hbmFnZXIuY2FuY2VsKG1QZW5kaW5nUG9sbEludGVudCk7CisgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CisgICAgICAgIGxvbmcgbmV4dCA9IG5vdyArIGludGVydmFsOworICAgICAgICBtQWxhcm1NYW5hZ2VyLnNldChBbGFybU1hbmFnZXIuRUxBUFNFRF9SRUFMVElNRSwgbmV4dCwgbVBlbmRpbmdQb2xsSW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgZ2V0TnRwVGltZSgpIHsKKyAgICAgICAgU250cENsaWVudCBjbGllbnQgPSBuZXcgU250cENsaWVudCgpOworICAgICAgICBpZiAoY2xpZW50LnJlcXVlc3RUaW1lKG1OdHBTZXJ2ZXIsIE1BWF9OVFBfRkVUQ0hfV0FJVF9NUykpIHsKKyAgICAgICAgICAgIHJldHVybiBjbGllbnQuZ2V0TnRwVGltZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlIHVzZXIgcHJlZmVycyB0byBhdXRvbWF0aWNhbGx5IHNldCB0aGUgdGltZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNBdXRvbWF0aWNUaW1lUmVxdWVzdGVkKCkgeworICAgICAgICByZXR1cm4gU2V0dGluZ3MuU3lzdGVtLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgU2V0dGluZ3MuU3lzdGVtLkFVVE9fVElNRSwgMCkKKyAgICAgICAgICAgICAgICAhPSAwOworICAgIH0KKworICAgIC8qKiBSZWNlaXZlciBmb3IgTml0eiB0aW1lIGV2ZW50cyAqLworICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbU5pdHpSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgIGlmIChUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9ORVRXT1JLX1NFVF9USU1FLmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgbU5pdHpUaW1lU2V0VGltZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9ORVRXT1JLX1NFVF9USU1FWk9ORS5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIG1OaXR6Wm9uZVNldFRpbWUgPSBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKiogSGFuZGxlciB0byBkbyB0aGUgbmV0d29yayBhY2Nlc3NlcyBvbiAqLworICAgIHByaXZhdGUgY2xhc3MgTXlIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CisKKyAgICAgICAgcHVibGljIE15SGFuZGxlcihMb29wZXIgbCkgeworICAgICAgICAgICAgc3VwZXIobCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgRVZFTlRfQVVUT19USU1FX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9QT0xMX05FVFdPUktfVElNRToKKyAgICAgICAgICAgICAgICAgICAgb25Qb2xsTmV0d29ya1RpbWUobXNnLndoYXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBPYnNlcnZlciB0byB3YXRjaCBmb3IgY2hhbmdlcyB0byB0aGUgQVVUT19USU1FIHNldHRpbmcgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXR0aW5nc09ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKworICAgICAgICBwcml2YXRlIGludCBtTXNnOworICAgICAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisKKyAgICAgICAgU2V0dGluZ3NPYnNlcnZlcihIYW5kbGVyIGhhbmRsZXIsIGludCBtc2cpIHsKKyAgICAgICAgICAgIHN1cGVyKGhhbmRsZXIpOworICAgICAgICAgICAgbUhhbmRsZXIgPSBoYW5kbGVyOworICAgICAgICAgICAgbU1zZyA9IG1zZzsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgb2JzZXJ2ZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciByZXNvbHZlciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgICAgICByZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKFNldHRpbmdzLlN5c3RlbS5BVVRPX1RJTUUpLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKG1Nc2cpLnNlbmRUb1RhcmdldCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggNTE4Y2ZkOS4uNWFmYWJiZCAxMDA3NTUKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Ob3RpZmljYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhCkBAIC02MSw2ICs2MSw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwpAQCAtMjg1LDYgKzI4NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uRkxBR19GT1JFR1JPVU5EX1NFUlZJQ0UpOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgb25Ob3RpZmljYXRpb25DbGVhcihTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpIHsKKyAgICAgICAgICAgIGNhbmNlbE5vdGlmaWNhdGlvbihwa2csIHRhZywgaWQsIDAsIDApOyAvLyBtYXliZSBhZGQgc29tZSBmbGFncz8KKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUGFuZWxSZXZlYWxlZCgpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobU5vdGlmaWNhdGlvbkxpc3QpIHsKICAgICAgICAgICAgICAgICAvLyBzb3VuZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUGFja2FnZU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9QYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCBkYmY5MmJhLi5jNGQyZDRkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9QYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9QYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtOTQ4OSw3ICs5NDg5LDggQEAKICAgICAqIFVwZGF0ZSBtZWRpYSBzdGF0dXMgb24gUGFja2FnZU1hbmFnZXIuCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUV4dGVybmFsTWVkaWFTdGF0dXMoZmluYWwgYm9vbGVhbiBtZWRpYVN0YXR1cywgZmluYWwgYm9vbGVhbiByZXBvcnRTdGF0dXMpIHsKLSAgICAgICBpZiAoQmluZGVyLmdldENhbGxpbmdVaWQoKSAhPSBQcm9jZXNzLlNZU1RFTV9VSUQpIHsKKyAgICAgICBpbnQgY2FsbGluZ1VpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7CisgICAgICAgaWYgKGNhbGxpbmdVaWQgIT0gMCAmJiBjYWxsaW5nVWlkICE9IFByb2Nlc3MuU1lTVEVNX1VJRCkgewogICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIk1lZGlhIHN0YXR1cyBjYW4gb25seSBiZSB1cGRhdGVkIGJ5IHRoZSBzeXN0ZW0iKTsKICAgICAgICB9CiAgICAgICAgc3luY2hyb25pemVkIChtUGFja2FnZXMpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Bvd2VyTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Bvd2VyTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCBlNzdlZDY5Li4yOWE5YTdlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Qb3dlck1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUG93ZXJNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yNTM2LDcgKzI1MzYsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUtleWxpZ2h0RGVsYXkgPSBMT05HX0tFWUxJR0hUX0RFTEFZOwogICAgICAgICAgICAgaWYgKHRvdGFsRGVsYXkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbVNjcmVlbk9mZkRlbGF5ID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgbnVtYmVyIG1lYW5zIHN0YXkgb24gYXMgbG9uZyBhcyBwb3NzaWJsZS4KKyAgICAgICAgICAgICAgICBtU2NyZWVuT2ZmRGVsYXkgPSBtTWF4aW11bVNjcmVlbk9mZlRpbWVvdXQ7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1LZXlsaWdodERlbGF5IDwgdG90YWxEZWxheSkgewogICAgICAgICAgICAgICAgIC8vIHN1YnRyYWN0IHRoZSB0aW1lIHRoYXQgdGhlIGtleWxpZ2h0IGRlbGF5LiBUaGlzIHdpbGwgZ2l2ZSB1cyB0aGUKICAgICAgICAgICAgICAgICAvLyByZW1haW5kZXIgb2YgdGhlIHRpbWUgdGhhdCB3ZSBuZWVkIHRvIHNsZWVwIHRvIGdldCB0aGUgYWNjdXJhdGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1NhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TYW1wbGluZ1Byb2ZpbGVyU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YWY3ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TYW1wbGluZ1Byb2ZpbGVyU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQub3MuRHJvcEJveE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5GaWxlT2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb247CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK3B1YmxpYyBjbGFzcyBTYW1wbGluZ1Byb2ZpbGVyU2VydmljZSBleHRlbmRzIEJpbmRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0FMX0xPR1YgPSBmYWxzZTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTTkFQU0hPVF9ESVIgPSBTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uU05BUFNIT1RfRElSOworCisgICAgcHJpdmF0ZSBGaWxlT2JzZXJ2ZXIgc25hcHNob3RPYnNlcnZlcjsKKworICAgIHB1YmxpYyBTYW1wbGluZ1Byb2ZpbGVyU2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmVnaXN0ZXJTZXR0aW5nT2JzZXJ2ZXIoY29udGV4dCk7CisgICAgICAgIHN0YXJ0V29ya2luZyhjb250ZXh0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRXb3JraW5nKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAoTE9DQUxfTE9HVikgU2xvZy52KFRBRywgInN0YXJ0aW5nIFNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlISIpOworCisgICAgICAgIGZpbmFsIERyb3BCb3hNYW5hZ2VyIGRyb3Bib3ggPQorICAgICAgICAgICAgICAgIChEcm9wQm94TWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuRFJPUEJPWF9TRVJWSUNFKTsKKworICAgICAgICAvLyBiZWZvcmUgRmlsZU9ic2VydmVyIGlzIHJlYWR5LCB0aGVyZSBjb3VsZCBoYXZlIGFscmVhZHkgYmVlbiBzb21lIHNuYXBzaG90cworICAgICAgICAvLyBpbiB0aGUgZGlyZWN0b3J5LCB3ZSBkb24ndCB3YW50IHRvIG1pc3MgdGhlbQorICAgICAgICBGaWxlW10gc25hcHNob3RGaWxlcyA9IG5ldyBGaWxlKFNOQVBTSE9UX0RJUikubGlzdEZpbGVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBzbmFwc2hvdEZpbGVzICE9IG51bGwgJiYgaSA8IHNuYXBzaG90RmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGhhbmRsZVNuYXBzaG90RmlsZShzbmFwc2hvdEZpbGVzW2ldLCBkcm9wYm94KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRldGVjdCBuZXcgc25hcHNob3QgYW5kIHB1dCBpdCBpbiBkcm9wYm94CisgICAgICAgIC8vIGRlbGV0ZSBpdCBhZnRlcndhcmRzIG5vIG1hdHRlciB3aGF0IGhhcHBlbmVkIGJlZm9yZQorICAgICAgICAvLyBOb3RlOiBuZWVkcyBsaXN0ZW5pbmcgYXQgZXZlbnQgQVRUUklCIHJhdGhlciB0aGFuIENMT1NFX1dSSVRFLCBiZWNhdXNlIHdlIHNldCB0aGUKKyAgICAgICAgLy8gcmVhZGFiaWxpdHkgb2Ygc25hcHNob3QgZmlsZXMgYWZ0ZXIgd3JpdGluZyB0aGVtIQorICAgICAgICBzbmFwc2hvdE9ic2VydmVyID0gbmV3IEZpbGVPYnNlcnZlcihTTkFQU0hPVF9ESVIsIEZpbGVPYnNlcnZlci5BVFRSSUIpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25FdmVudChpbnQgZXZlbnQsIFN0cmluZyBwYXRoKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlU25hcHNob3RGaWxlKG5ldyBGaWxlKFNOQVBTSE9UX0RJUiwgcGF0aCksIGRyb3Bib3gpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBzbmFwc2hvdE9ic2VydmVyLnN0YXJ0V2F0Y2hpbmcoKTsKKworICAgICAgICBpZiAoTE9DQUxfTE9HVikgU2xvZy52KFRBRywgIlNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlIGFjdGl2YXRlZCIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTbmFwc2hvdEZpbGUoRmlsZSBmaWxlLCBEcm9wQm94TWFuYWdlciBkcm9wYm94KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkcm9wYm94LmFkZEZpbGUoVEFHLCBmaWxlLCAwKTsKKyAgICAgICAgICAgIGlmIChMT0NBTF9MT0dWKSBTbG9nLnYoVEFHLCBmaWxlLmdldFBhdGgoKSArICIgYWRkZWQgdG8gZHJvcGJveCIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiQ2FuJ3QgYWRkICIgKyBmaWxlLmdldFBhdGgoKSArICIgdG8gZHJvcGJveCIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlclNldHRpbmdPYnNlcnZlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgIGNvbnRlbnRSZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcigKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0VXJpRm9yKFNldHRpbmdzLlNlY3VyZS5TQU1QTElOR19QUk9GSUxFUl9IWiksCisgICAgICAgICAgICAgICAgZmFsc2UsIG5ldyBTYW1wbGluZ1Byb2ZpbGVyU2V0dGluZ3NPYnNlcnZlcihjb250ZW50UmVzb2x2ZXIpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdywgU3RyaW5nW10gYXJncykgeworICAgICAgICBwdy5wcmludGxuKCJTYW1wbGluZ1Byb2ZpbGVyU2VydmljZToiKTsKKyAgICAgICAgcHcucHJpbnRsbigiV2F0Y2hpbmcgZGlyZWN0b3J5OiAiICsgU05BUFNIT1RfRElSKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFNhbXBsaW5nUHJvZmlsZXJTZXR0aW5nc09ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICAgICAgcHJpdmF0ZSBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKKyAgICAgICAgcHVibGljIFNhbXBsaW5nUHJvZmlsZXJTZXR0aW5nc09ic2VydmVyKENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKG51bGwpOworICAgICAgICAgICAgbUNvbnRlbnRSZXNvbHZlciA9IGNvbnRlbnRSZXNvbHZlcjsKKyAgICAgICAgICAgIG9uQ2hhbmdlKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICBJbnRlZ2VyIHNhbXBsaW5nUHJvZmlsZXJIeiA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQoCisgICAgICAgICAgICAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIsIFNldHRpbmdzLlNlY3VyZS5TQU1QTElOR19QUk9GSUxFUl9IWiwgMCk7CisgICAgICAgICAgICAvLyBzZXR0aW5nIHRoaXMgc2VjdXJlIHByb3BlcnR5IHdpbGwgc3RhcnQgb3Igc3RvcCBzYW1wbGluZyBwcm9maWxlciwKKyAgICAgICAgICAgIC8vIGFzIHdlbGwgYXMgYWRqdXN0IHRoZSBmcmVxdWVuY3kgb2YgdGFraW5nIHNuYXBzaG90cy4KKyAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJwZXJzaXN0LnN5cy5wcm9maWxlcl9oeiIsIHNhbXBsaW5nUHJvZmlsZXJIei50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU2h1dGRvd25BY3Rpdml0eS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU2h1dGRvd25BY3Rpdml0eS5qYXZhCmluZGV4IDY0YjljNWQuLmM5ZDRkMDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1NodXRkb3duQWN0aXZpdHkuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TaHV0ZG93bkFjdGl2aXR5LmphdmEKQEAgLTI3LDE5ICsyNywyNiBAQAogcHVibGljIGNsYXNzIFNodXRkb3duQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNodXRkb3duQWN0aXZpdHkiOworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVib290OwogICAgIHByaXZhdGUgYm9vbGVhbiBtQ29uZmlybTsKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKIAotICAgICAgICBtQ29uZmlybSA9IGdldEludGVudCgpLmdldEJvb2xlYW5FeHRyYShJbnRlbnQuRVhUUkFfS0VZX0NPTkZJUk0sIGZhbHNlKTsKKyAgICAgICAgSW50ZW50IGludGVudCA9IGdldEludGVudCgpOworICAgICAgICBtUmVib290ID0gSW50ZW50LkFDVElPTl9SRUJPT1QuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSk7CisgICAgICAgIG1Db25maXJtID0gaW50ZW50LmdldEJvb2xlYW5FeHRyYShJbnRlbnQuRVhUUkFfS0VZX0NPTkZJUk0sIGZhbHNlKTsKICAgICAgICAgU2xvZy5pKFRBRywgIm9uQ3JlYXRlKCk6IGNvbmZpcm09IiArIG1Db25maXJtKTsKIAogICAgICAgICBIYW5kbGVyIGggPSBuZXcgSGFuZGxlcigpOwogICAgICAgICBoLnBvc3QobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIFNodXRkb3duVGhyZWFkLnNodXRkb3duKFNodXRkb3duQWN0aXZpdHkudGhpcywgbUNvbmZpcm0pOworICAgICAgICAgICAgICAgIGlmIChtUmVib290KSB7CisgICAgICAgICAgICAgICAgICAgIFNodXRkb3duVGhyZWFkLnJlYm9vdChTaHV0ZG93bkFjdGl2aXR5LnRoaXMsIG51bGwsIG1Db25maXJtKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTaHV0ZG93blRocmVhZC5zaHV0ZG93bihTaHV0ZG93bkFjdGl2aXR5LnRoaXMsIG1Db25maXJtKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N0YXR1c0Jhck1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TdGF0dXNCYXJNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDQxNzc0MzIuLmIxYmFlYzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N0YXR1c0Jhck1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU3RhdHVzQmFyTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtNjgsNiArNjgsMTAgQEAKICAgICBBcnJheUxpc3Q8RGlzYWJsZVJlY29yZD4gbURpc2FibGVSZWNvcmRzID0gbmV3IEFycmF5TGlzdDxEaXNhYmxlUmVjb3JkPigpOwogICAgIGludCBtRGlzYWJsZWQgPSAwOwogCisgICAgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworICAgIC8vIFdlIHVzdWFsbHkgY2FsbCBpdCBsaWdodHMgb3V0IG1vZGUsIGJ1dCBkb3VibGUgbmVnYXRpdmVzIGFyZSBhbm5veWluZworICAgIGJvb2xlYW4gbUxpZ2h0c09uID0gdHJ1ZTsKKwogICAgIHByaXZhdGUgY2xhc3MgRGlzYWJsZVJlY29yZCBpbXBsZW1lbnRzIElCaW5kZXIuRGVhdGhSZWNpcGllbnQgewogICAgICAgICBTdHJpbmcgcGtnOwogICAgICAgICBpbnQgd2hhdDsKQEAgLTg0LDYgKzg4LDcgQEAKICAgICAgICAgdm9pZCBvblNldERpc2FibGVkKGludCBzdGF0dXMpOwogICAgICAgICB2b2lkIG9uQ2xlYXJBbGwoKTsKICAgICAgICAgdm9pZCBvbk5vdGlmaWNhdGlvbkNsaWNrKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCk7CisgICAgICAgIHZvaWQgb25Ob3RpZmljYXRpb25DbGVhcihTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpOwogICAgICAgICB2b2lkIG9uUGFuZWxSZXZlYWxlZCgpOwogICAgICAgICB2b2lkIG9uTm90aWZpY2F0aW9uRXJyb3IoU3RyaW5nIHBrZywgU3RyaW5nIHRhZywgaW50IGlkLAogICAgICAgICAgICAgICAgIGludCB1aWQsIGludCBpbml0aWFsUGlkLCBTdHJpbmcgbWVzc2FnZSk7CkBAIC0yNDEsNiArMjQ2LDU2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSBhdXRvbWF0aWMgdmVyc2lvbiBvZiBsaWdodHMtb3V0IG1vZGUuICBPbmx5IGNhbGwgdGhpcyBmcm9tCisgICAgICogdGhlIHdpbmRvdyBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHNlZSBzZXRMaWdodHNPbihib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVdpbmRvd0lzRnVsbHNjcmVlbihib29sZWFuIGZ1bGxzY3JlZW4pIHsKKyAgICAgICAgLy8gV2UgY291bGQgZ2V0IGF3YXkgd2l0aCBhIHNlcGFyYXRlIHBlcm1pc3Npb24gaGVyZSwgYnV0IFNUQVRVU19CQVIgaXMKKyAgICAgICAgLy8gc2lnbmF0dXJlT3JTeXN0ZW0gd2hpY2ggaXMgcHJvYmFibHkgZ29vZCBlbm91Z2guICBUaGVyZSBpcyBubyBwdWJsaWMgQVBJCisgICAgICAgIC8vIGZvciB0aGlzLCBzbyB0aGUgcXVlc3Rpb24gaXMgYSBzZWN1cml0eSBpc3N1ZSwgbm90IGFuIEFQSSBjb21wYXRpYmlsaXR5IGlzc3VlLgorICAgICAgICBlbmZvcmNlU3RhdHVzQmFyKCk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgdXBkYXRlTGlnaHRzT25Mb2NrZWQoIWZ1bGxzY3JlZW4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyB1c2VkIGZvciB0aGUgdXNlci1jb250cm9sbGVkIHZlcnNpb24gb2YgbGlnaHRzLW91dCBtb2RlLiAgT25seSBjYWxsIHRoaXMgZnJvbQorICAgICAqIHRoZSBzdGF0dXMgYmFyIGl0c2VsZi4KKyAgICAgKgorICAgICAqIFdlIGhhdmUgdHdvIGRpZmZlcmVudCBmdW5jdGlvbnMgaGVyZSwgYmVjYXVzZSBJIHRoaW5rIHdlJ3JlIGdvaW5nIHRvIHdhbnQgdG8KKyAgICAgKiB0d2VhayB0aGUgYmVoYXZpb3Igd2hlbiB0aGUgdXNlciBrZWVwcyB0dXJuaW5nIGxpZ2h0cy1vdXQgbW9kZSBvZmYgYW5kIHRoZQorICAgICAqIGFwcCBrZWVwcyB0cnlpbmcgdG8gdHVybiBpdCBvbi4gIEZvciBub3cgdGhleSBjYW4ganVzdCBmaWdodCBpdCBvdXQuICBIYXZpbmcKKyAgICAgKiB0aGVzZSB0d28gc2VwYXJ0ZSBpbnB1dHMgd2lsbCBhbGxvdyB1cyB0byBrZWVwIHRoYXQgY2hhbmdlIGxvY2FsIHRvIGhlcmUuICAtLWpvZW8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaWdodHNPbihib29sZWFuIGxpZ2h0c09uKSB7CisgICAgICAgIGVuZm9yY2VTdGF0dXNCYXJTZXJ2aWNlKCk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgdXBkYXRlTGlnaHRzT25Mb2NrZWQobGlnaHRzT24pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxpZ2h0c09uTG9ja2VkKGZpbmFsIGJvb2xlYW4gbGlnaHRzT24pIHsKKyAgICAgICAgaWYgKG1MaWdodHNPbiAhPSBsaWdodHNPbikgeworICAgICAgICAgICAgbUxpZ2h0c09uID0gbGlnaHRzT247CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CYXIuc2V0TGlnaHRzT24obGlnaHRzT24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGVuZm9yY2VTdGF0dXNCYXIoKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uU1RBVFVTX0JBUiwKICAgICAgICAgICAgICAgICAiU3RhdHVzQmFyTWFuYWdlclNlcnZpY2UiKTsKQEAgLTI2MSw3ICszMTYsOCBAQAogICAgIC8vIENhbGxiYWNrcyBmcm9tIHRoZSBzdGF0dXMgYmFyIHNlcnZpY2UuCiAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBwdWJsaWMgdm9pZCByZWdpc3RlclN0YXR1c0JhcihJU3RhdHVzQmFyIGJhciwgU3RhdHVzQmFySWNvbkxpc3QgaWNvbkxpc3QsCi0gICAgICAgICAgICBMaXN0PElCaW5kZXI+IG5vdGlmaWNhdGlvbktleXMsIExpc3Q8U3RhdHVzQmFyTm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25zKSB7CisgICAgICAgICAgICBMaXN0PElCaW5kZXI+IG5vdGlmaWNhdGlvbktleXMsIExpc3Q8U3RhdHVzQmFyTm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25zLAorICAgICAgICAgICAgYm9vbGVhbiBsaWdodHNPbltdKSB7CiAgICAgICAgIGVuZm9yY2VTdGF0dXNCYXJTZXJ2aWNlKCk7CiAKICAgICAgICAgU2xvZy5pKFRBRywgInJlZ2lzdGVyU3RhdHVzQmFyIGJhcj0iICsgYmFyKTsKQEAgLTI3NSw2ICszMzEsOSBAQAogICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbnMuYWRkKGUuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbGlnaHRzT25bMF0gPSBtTGlnaHRzT247CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTMwMiw2ICszNjEsMTIgQEAKICAgICAgICAgbU5vdGlmaWNhdGlvbkNhbGxiYWNrcy5vbk5vdGlmaWNhdGlvbkVycm9yKHBrZywgdGFnLCBpZCwgdWlkLCBpbml0aWFsUGlkLCBtZXNzYWdlKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBvbk5vdGlmaWNhdGlvbkNsZWFyKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCkgeworICAgICAgICBlbmZvcmNlU3RhdHVzQmFyU2VydmljZSgpOworCisgICAgICAgIG1Ob3RpZmljYXRpb25DYWxsYmFja3Mub25Ob3RpZmljYXRpb25DbGVhcihwa2csIHRhZywgaWQpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIG9uQ2xlYXJBbGxOb3RpZmljYXRpb25zKCkgewogICAgICAgICBlbmZvcmNlU3RhdHVzQmFyU2VydmljZSgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TeXN0ZW1TZXJ2ZXIuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCmluZGV4IDdmNDI0MjkuLjgwZGNjOTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCkBAIC0yNCwyNyArMjQsMzMgQEAKIGltcG9ydCBkYWx2aWsuc3lzdGVtLlZNUnVudGltZTsKIGltcG9ydCBkYWx2aWsuc3lzdGVtLlp5Z290ZTsKIAoraW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudE1hbmFnZXJTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1NlcnZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy4qOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHMuUGVvcGxlOworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN0cmljdE1vZGU7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnNlcnZlci5CbHVldG9vdGhBMmRwU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLnNlcnZlci5CbHVldG9vdGhTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hNYW5hZ2VyU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7Ci1pbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50TWFuYWdlclNlcnZpY2U7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVyOwpAQCAtNTIsMTEgKzU4LDggQEAKIAogY2xhc3MgU2VydmVyVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN5c3RlbVNlcnZlciI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBJTkNMVURFX0RFTU8gPSBmYWxzZTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0dfQk9PVF9QUk9HUkVTU19TWVNURU1fUlVOID0gMzAxMDsKLQotICAgIHByaXZhdGUgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7CisgICAgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7CiAKICAgICBwcml2YXRlIGNsYXNzIEFkYlNldHRpbmdzT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgewogICAgICAgICBwdWJsaWMgQWRiU2V0dGluZ3NPYnNlcnZlcigpIHsKQEAgLTEwMyw2ICsxMDYsNyBAQAogICAgICAgICBVaU1vZGVNYW5hZ2VyU2VydmljZSB1aU1vZGUgPSBudWxsOwogICAgICAgICBSZWNvZ25pdGlvbk1hbmFnZXJTZXJ2aWNlIHJlY29nbml0aW9uID0gbnVsbDsKICAgICAgICAgVGhyb3R0bGVTZXJ2aWNlIHRocm90dGxlID0gbnVsbDsKKyAgICAgICAgTmV0d29ya1RpbWVVcGRhdGVTZXJ2aWNlIG5ldHdvcmtUaW1lVXBkYXRlciA9IG51bGw7CiAKICAgICAgICAgLy8gQ3JpdGljYWwgc2VydmljZXMuLi4KICAgICAgICAgdHJ5IHsKQEAgLTIxMSw2ICsyMTUsNyBAQAogICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyU2VydmljZSBub3RpZmljYXRpb24gPSBudWxsOwogICAgICAgICBXYWxscGFwZXJNYW5hZ2VyU2VydmljZSB3YWxscGFwZXIgPSBudWxsOwogICAgICAgICBMb2NhdGlvbk1hbmFnZXJTZXJ2aWNlIGxvY2F0aW9uID0gbnVsbDsKKyAgICAgICAgQ291bnRyeURldGVjdG9yU2VydmljZSBjb3VudHJ5RGV0ZWN0b3IgPSBudWxsOwogCiAgICAgICAgIGlmIChmYWN0b3J5VGVzdCAhPSBTeXN0ZW1TZXJ2ZXIuRkFDVE9SWV9URVNUX0xPV19MRVZFTCkgewogICAgICAgICAgICAgdHJ5IHsKQEAgLTMyMiw2ICszMjcsMTQgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiQ291bnRyeSBEZXRlY3RvciIpOworICAgICAgICAgICAgICAgIGNvdW50cnlEZXRlY3RvciA9IG5ldyBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlKGNvbnRleHQpOworICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoQ29udGV4dC5DT1VOVFJZX0RFVEVDVE9SLCBjb3VudHJ5RGV0ZWN0b3IpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbHVyZSBzdGFydGluZyBDb3VudHJ5IERldGVjdG9yIiwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIlNlYXJjaCBTZXJ2aWNlIik7CiAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuYWRkU2VydmljZShDb250ZXh0LlNFQVJDSF9TRVJWSUNFLAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlYXJjaE1hbmFnZXJTZXJ2aWNlKGNvbnRleHQpKTsKQEAgLTMyOSwxMSArMzQyLDYgQEAKICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbHVyZSBzdGFydGluZyBTZWFyY2ggU2VydmljZSIsIGUpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoSU5DTFVERV9ERU1PKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIkluc3RhbGxpbmcgZGVtbyBkYXRhLi4uIik7Ci0gICAgICAgICAgICAgICAgKG5ldyBEZW1vVGhyZWFkKGNvbnRleHQpKS5zdGFydCgpOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJEcm9wQm94IFNlcnZpY2UiKTsKICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKENvbnRleHQuRFJPUEJPWF9TRVJWSUNFLApAQCAtNDMyLDYgKzQ0MCwyNSBAQAogICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbHVyZSBzdGFydGluZyBEaXNrU3RhdHMgU2VydmljZSIsIGUpOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gYWRkIHRoaXMgc2VydmljZSBldmVuIGlmIFNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5pc0VuYWJsZWQoKQorICAgICAgICAgICAgICAgIC8vIGlzIGZhbHNlLCBiZWNhdXNlIGl0IGlzIHRoaXMgc2VydmljZSB0aGF0IGRldGVjdHMgc3lzdGVtIHByb3BlcnR5IGNoYW5nZSBhbmQKKyAgICAgICAgICAgICAgICAvLyB0dXJucyBvbiBTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uIFBsdXMsIHdoZW4gc2FtcGxpbmcgcHJvZmlsZXIgZG9lc24ndCB3b3JrLAorICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGxpdHRsZSBvdmVyaGVhZCBmb3IgcnVubmluZyB0aGlzIHNlcnZpY2UuCisgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIlNhbXBsaW5nUHJvZmlsZXIgU2VydmljZSIpOworICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoInNhbXBsaW5ncHJvZmlsZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTYW1wbGluZ1Byb2ZpbGVyU2VydmljZShjb250ZXh0KSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsdXJlIHN0YXJ0aW5nIFNhbXBsaW5nUHJvZmlsZXIgU2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJOZXR3b3JrVGltZVVwZGF0ZVNlcnZpY2UiKTsKKyAgICAgICAgICAgICAgICBuZXR3b3JrVGltZVVwZGF0ZXIgPSBuZXcgTmV0d29ya1RpbWVVcGRhdGVTZXJ2aWNlKGNvbnRleHQpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbHVyZSBzdGFydGluZyBOZXR3b3JrVGltZVVwZGF0ZSBzZXJ2aWNlIik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIEFEQl9FTkFCTEVEIHNldHRpbmcgdmFsdWUgbWF0Y2hlcyB0aGUgc2VjdXJlIHByb3BlcnR5IHZhbHVlCkBAIC00NzMsNiArNTAwLDE2IEBACiAgICAgICAgICAgICBzdGF0dXNCYXIuc3lzdGVtUmVhZHkoKTsKICAgICAgICAgfQogICAgICAgICB3bS5zeXN0ZW1SZWFkeSgpOworCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBjb250ZXh0IGJ5IGhhbmQsIGJlY2F1c2Ugd2UncmUgZ29pbmcKKyAgICAgICAgLy8gdG8gc3RhcnQgdXNpbmcgaXQgYmVmb3JlIHRoZSBjb25maWcgY2hhbmdlIGRvbmUgaW4gd20uc3lzdGVtUmVhZHkoKSB3aWxsCisgICAgICAgIC8vIHByb3BhZ2F0ZSB0byBpdC4KKyAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcgPSB3bS5jb21wdXRlTmV3Q29uZmlndXJhdGlvbigpOworICAgICAgICBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gbmV3IERpc3BsYXlNZXRyaWNzKCk7CisgICAgICAgIFdpbmRvd01hbmFnZXIgdyA9IChXaW5kb3dNYW5hZ2VyKWNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKTsKKyAgICAgICAgdy5nZXREZWZhdWx0RGlzcGxheSgpLmdldE1ldHJpY3MobWV0cmljcyk7CisgICAgICAgIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkudXBkYXRlQ29uZmlndXJhdGlvbihjb25maWcsIG1ldHJpY3MpOworCiAgICAgICAgIHBvd2VyLnN5c3RlbVJlYWR5KCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBwbS5zeXN0ZW1SZWFkeSgpOwpAQCAtNDkyLDYgKzUyOSw4IEBACiAgICAgICAgIGZpbmFsIElucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UgaW1tRiA9IGltbTsKICAgICAgICAgZmluYWwgUmVjb2duaXRpb25NYW5hZ2VyU2VydmljZSByZWNvZ25pdGlvbkYgPSByZWNvZ25pdGlvbjsKICAgICAgICAgZmluYWwgTG9jYXRpb25NYW5hZ2VyU2VydmljZSBsb2NhdGlvbkYgPSBsb2NhdGlvbjsKKyAgICAgICAgZmluYWwgQ291bnRyeURldGVjdG9yU2VydmljZSBjb3VudHJ5RGV0ZWN0b3JGID0gY291bnRyeURldGVjdG9yOworICAgICAgICBmaW5hbCBOZXR3b3JrVGltZVVwZGF0ZVNlcnZpY2UgbmV0d29ya1RpbWVVcGRhdGVyRiA9IG5ldHdvcmtUaW1lVXBkYXRlcjsKIAogICAgICAgICAvLyBXZSBub3cgdGVsbCB0aGUgYWN0aXZpdHkgbWFuYWdlciBpdCBpcyBva2F5IHRvIHJ1biB0aGlyZCBwYXJ0eQogICAgICAgICAvLyBjb2RlLiAgSXQgd2lsbCBjYWxsIGJhY2sgaW50byB1cyBvbmNlIGl0IGhhcyBnb3R0ZW4gdG8gdGhlIHN0YXRlCkBAIC01MTksNyArNTU4LDkgQEAKICAgICAgICAgICAgICAgICBpZiAod2FsbHBhcGVyRiAhPSBudWxsKSB3YWxscGFwZXJGLnN5c3RlbVJlYWR5KCk7CiAgICAgICAgICAgICAgICAgaWYgKGltbUYgIT0gbnVsbCkgaW1tRi5zeXN0ZW1SZWFkeSgpOwogICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbkYgIT0gbnVsbCkgbG9jYXRpb25GLnN5c3RlbVJlYWR5KCk7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50cnlEZXRlY3RvckYgIT0gbnVsbCkgY291bnRyeURldGVjdG9yRi5zeXN0ZW1SZWFkeSgpOwogICAgICAgICAgICAgICAgIGlmICh0aHJvdHRsZUYgIT0gbnVsbCkgdGhyb3R0bGVGLnN5c3RlbVJlYWR5KCk7CisgICAgICAgICAgICAgICAgaWYgKG5ldHdvcmtUaW1lVXBkYXRlckYgIT0gbnVsbCkgbmV0d29ya1RpbWVVcGRhdGVyRi5zeXN0ZW1SZWFkeSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9KTsKIApAQCAtNTMzLDM3ICs1NzQsNyBAQAogICAgIH0KIH0KIAotY2xhc3MgRGVtb1RocmVhZCBleHRlbmRzIFRocmVhZAotewotICAgIERlbW9UaHJlYWQoQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ3Vyc29yIGMgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeShQZW9wbGUuQ09OVEVOVF9VUkksIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgYm9vbGVhbiBoYXNEYXRhID0gYyAhPSBudWxsICYmIGMubW92ZVRvRmlyc3QoKTsKLSAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaGFzRGF0YSkgewotICAgICAgICAgICAgICAgIERlbW9EYXRhU2V0IGRhdGFzZXQgPSBuZXcgRGVtb0RhdGFTZXQoKTsKLSAgICAgICAgICAgICAgICBkYXRhc2V0LmFkZChtQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICBTbG9nLmUoIlN5c3RlbVNlcnZlciIsICJGYWlsdXJlIGluc3RhbGxpbmcgZGVtbyBkYXRhIiwgZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIENvbnRleHQgbUNvbnRleHQ7Ci19Ci0KLXB1YmxpYyBjbGFzcyBTeXN0ZW1TZXJ2ZXIKLXsKK3B1YmxpYyBjbGFzcyBTeXN0ZW1TZXJ2ZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3lzdGVtU2VydmVyIjsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ1RPUllfVEVTVF9PRkYgPSAwOwpAQCAtNTg3LDcgKzU5OCw3IEBACiAgICAgICAgICAgICB0aW1lci5zY2hlZHVsZShuZXcgVGltZXJUYXNrKCkgewogICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLndyaXRlU25hcHNob3QoInN5c3RlbV9zZXJ2ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLndyaXRlU25hcHNob3QoInN5c3RlbV9zZXJ2ZXIiLCBudWxsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9LCBTTkFQU0hPVF9JTlRFUlZBTCwgU05BUFNIT1RfSU5URVJWQUwpOwogICAgICAgICB9CkBAIC01OTUsNyArNjA2LDcgQEAKICAgICAgICAgLy8gVGhlIHN5c3RlbSBzZXJ2ZXIgaGFzIHRvIHJ1biBhbGwgb2YgdGhlIHRpbWUsIHNvIGl0IG5lZWRzIHRvIGJlCiAgICAgICAgIC8vIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZSB3aXRoIGl0cyBtZW1vcnkgdXNhZ2UuCiAgICAgICAgIFZNUnVudGltZS5nZXRSdW50aW1lKCkuc2V0VGFyZ2V0SGVhcFV0aWxpemF0aW9uKDAuOGYpOwotICAgICAgICAKKwogICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoImFuZHJvaWRfc2VydmVycyIpOwogICAgICAgICBpbml0MShhcmdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UZWxlcGhvbnlSZWdpc3RyeS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVGVsZXBob255UmVnaXN0cnkuamF2YQppbmRleCA3ZTIzNDIyLi4yYjQ4NDViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UZWxlcGhvbnlSZWdpc3RyeS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1RlbGVwaG9ueVJlZ2lzdHJ5LmphdmEKQEAgLTE5LDcgKzE5LDggQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua0NhcGFiaWxpdGllczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CkBAIC0zNSw2ICszNiw3IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZTsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5JQmF0dGVyeVN0YXRzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JVGVsZXBob255UmVnaXN0cnk7CkBAIC04OSw5ICs5MSwxMSBAQAogCiAgICAgcHJpdmF0ZSBTdHJpbmcgbURhdGFDb25uZWN0aW9uQXBuID0gIiI7CiAKLSAgICBwcml2YXRlIFN0cmluZ1tdIG1EYXRhQ29ubmVjdGlvbkFwblR5cGVzID0gbnVsbDsKKyAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1Db25uZWN0ZWRBcG5zOwogCi0gICAgcHJpdmF0ZSBTdHJpbmcgbURhdGFDb25uZWN0aW9uSW50ZXJmYWNlTmFtZSA9ICIiOworICAgIHByaXZhdGUgTGlua1Byb3BlcnRpZXMgbURhdGFDb25uZWN0aW9uTGlua1Byb3BlcnRpZXM7CisKKyAgICBwcml2YXRlIExpbmtDYXBhYmlsaXRpZXMgbURhdGFDb25uZWN0aW9uTGlua0NhcGFiaWxpdGllczsKIAogICAgIHByaXZhdGUgQnVuZGxlIG1DZWxsTG9jYXRpb24gPSBuZXcgQnVuZGxlKCk7CiAKQEAgLTEyMSw2ICsxMjUsNyBAQAogICAgICAgICB9CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbUJhdHRlcnlTdGF0cyA9IEJhdHRlcnlTdGF0c1NlcnZpY2UuZ2V0U2VydmljZSgpOworICAgICAgICBtQ29ubmVjdGVkQXBucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGxpc3RlbihTdHJpbmcgcGtnRm9yRGVidWcsIElQaG9uZVN0YXRlTGlzdGVuZXIgY2FsbGJhY2ssIGludCBldmVudHMsCkBAIC0yMzMsMTkgKzIzOCwyMCBAQAogICAgICAgICBpZiAoIWNoZWNrTm90aWZ5UGVybWlzc2lvbigibm90aWZ5Q2FsbFN0YXRlKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtQ2FsbFN0YXRlID0gc3RhdGU7CiAgICAgICAgICAgICBtQ2FsbEluY29taW5nTnVtYmVyID0gaW5jb21pbmdOdW1iZXI7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0NBTExfU1RBVEUpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25DYWxsU3RhdGVDaGFuZ2VkKHN0YXRlLCBpbmNvbWluZ051bWJlcik7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHIuYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3QuYWRkKHIuYmluZGVyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSUJpbmRlciBiIDogcmVtb3ZlTGlzdCkgcmVtb3ZlKGIpOwogICAgICAgICB9CiAgICAgICAgIGJyb2FkY2FzdENhbGxTdGF0ZUNoYW5nZWQoc3RhdGUsIGluY29taW5nTnVtYmVyKTsKICAgICB9CkBAIC0yNTYsOCArMjYyLDcgQEAKICAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtU2VydmljZVN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX1NFUlZJQ0VfU1RBVEUpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgc2VuZFNlcnZpY2VTdGF0ZShyLCBzdGF0ZSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjcwLDEwICsyNzUsMTAgQEAKICAgICAgICAgaWYgKCFjaGVja05vdGlmeVBlcm1pc3Npb24oIm5vdGlmeVNpZ25hbFN0cmVuZ3RoKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtU2lnbmFsU3RyZW5ndGggPSBzaWduYWxTdHJlbmd0aDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fU0lHTkFMX1NUUkVOR1RIUykgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzZW5kU2lnbmFsU3RyZW5ndGgociwgc2lnbmFsU3RyZW5ndGgpOwogICAgICAgICAgICAgICAgIH0KQEAgLTI4MywxMCArMjg4LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICByLmNhbGxiYWNrLm9uU2lnbmFsU3RyZW5ndGhDaGFuZ2VkKChnc21TaWduYWxTdHJlbmd0aCA9PSA5OSA/IC0xCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ3NtU2lnbmFsU3RyZW5ndGgpKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoci5iaW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdC5hZGQoci5iaW5kZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJQmluZGVyIGIgOiByZW1vdmVMaXN0KSByZW1vdmUoYik7CiAgICAgICAgIH0KICAgICAgICAgYnJvYWRjYXN0U2lnbmFsU3RyZW5ndGhDaGFuZ2VkKHNpZ25hbFN0cmVuZ3RoKTsKICAgICB9CkBAIC0yOTUsMTggKzMwMSwxOSBAQAogICAgICAgICBpZiAoIWNoZWNrTm90aWZ5UGVybWlzc2lvbigibm90aWZ5TWVzc2FnZVdhaXRpbmdDaGFuZ2VkKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtTWVzc2FnZVdhaXRpbmcgPSBtd2k7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX01FU1NBR0VfV0FJVElOR19JTkRJQ0FUT1IpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25NZXNzYWdlV2FpdGluZ0luZGljYXRvckNoYW5nZWQobXdpKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoci5iaW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdC5hZGQoci5iaW5kZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJQmluZGVyIGIgOiByZW1vdmVMaXN0KSByZW1vdmUoYik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMxNCwxOCArMzIxLDE5IEBACiAgICAgICAgIGlmICghY2hlY2tOb3RpZnlQZXJtaXNzaW9uKCJub3RpZnlDYWxsRm9yd2FyZGluZ0NoYW5nZWQoKSIpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1DYWxsRm9yd2FyZGluZyA9IGNmaTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fQ0FMTF9GT1JXQVJESU5HX0lORElDQVRPUikgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbkNhbGxGb3J3YXJkaW5nSW5kaWNhdG9yQ2hhbmdlZChjZmkpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZShyLmJpbmRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXN0LmFkZChyLmJpbmRlcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKElCaW5kZXIgYiA6IHJlbW92ZUxpc3QpIHJlbW92ZShiKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzMzLDU3ICszNDEsODEgQEAKICAgICAgICAgaWYgKCFjaGVja05vdGlmeVBlcm1pc3Npb24oIm5vdGlmeURhdGFBY3Rpdml0eSgpIiApKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1EYXRhQWN0aXZpdHkgPSBzdGF0ZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fREFUQV9BQ1RJVklUWSkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbkRhdGFBY3Rpdml0eShzdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHIuYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3QuYWRkKHIuYmluZGVyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSUJpbmRlciBiIDogcmVtb3ZlTGlzdCkgcmVtb3ZlKGIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oaW50IHN0YXRlLCBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlLAotICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwbiwgU3RyaW5nW10gYXBuVHlwZXMsIFN0cmluZyBpbnRlcmZhY2VOYW1lLCBpbnQgbmV0d29ya1R5cGUsCi0gICAgICAgICAgICBTdHJpbmcgZ2F0ZXdheSkgeworICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwbiwgU3RyaW5nIGFwblR5cGUsIExpbmtQcm9wZXJ0aWVzIGxpbmtQcm9wZXJ0aWVzLAorICAgICAgICAgICAgTGlua0NhcGFiaWxpdGllcyBsaW5rQ2FwYWJpbGl0aWVzLCBpbnQgbmV0d29ya1R5cGUpIHsKICAgICAgICAgaWYgKCFjaGVja05vdGlmeVBlcm1pc3Npb24oIm5vdGlmeURhdGFDb25uZWN0aW9uKCkiICkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7Ci0gICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25TdGF0ZSA9IHN0YXRlOwotICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uUG9zc2libGUgPSBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZTsKLSAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvblJlYXNvbiA9IHJlYXNvbjsKLSAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbkFwbiA9IGFwbjsKLSAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbkFwblR5cGVzID0gYXBuVHlwZXM7Ci0gICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25JbnRlcmZhY2VOYW1lID0gaW50ZXJmYWNlTmFtZTsKLSAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbk5ldHdvcmtUeXBlID0gbmV0d29ya1R5cGU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoKHIuZXZlbnRzICYgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9EQVRBX0NPTk5FQ1RJT05fU1RBVEUpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChzdGF0ZSwgbmV0d29ya1R5cGUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZShyLmJpbmRlcik7CisgICAgICAgICAgICBib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gVGVsZXBob255TWFuYWdlci5EQVRBX0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgIGlmICghbUNvbm5lY3RlZEFwbnMuY29udGFpbnMoYXBuVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RlZEFwbnMuYWRkKGFwblR5cGUpOworICAgICAgICAgICAgICAgICAgICBpZiAobURhdGFDb25uZWN0aW9uU3RhdGUgIT0gc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvblN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Db25uZWN0ZWRBcG5zLnJlbW92ZShhcG5UeXBlKTsKKyAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3RlZEFwbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvblN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBsZWF2ZSBtRGF0YUNvbm5lY3Rpb25TdGF0ZSBhcyBpcyBhbmQKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCBvdXQgdGhlIG5ldyBzdGF0dXMgZm9yIHRoZSBBUE4gaW4gcXVlc3Rpb24uCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uUG9zc2libGUgPSBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZTsKKyAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvblJlYXNvbiA9IHJlYXNvbjsKKyAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbkxpbmtQcm9wZXJ0aWVzID0gbGlua1Byb3BlcnRpZXM7CisgICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25MaW5rQ2FwYWJpbGl0aWVzID0gbGlua0NhcGFiaWxpdGllczsKKyAgICAgICAgICAgIGlmIChtRGF0YUNvbm5lY3Rpb25OZXR3b3JrVHlwZSAhPSBuZXR3b3JrVHlwZSkgeworICAgICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbk5ldHdvcmtUeXBlID0gbmV0d29ya1R5cGU7CisgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1vZGlmaWVkKSB7CisgICAgICAgICAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CisgICAgICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0RBVEFfQ09OTkVDVElPTl9TVEFURSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmNhbGxiYWNrLm9uRGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoc3RhdGUsIG5ldHdvcmtUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3QuYWRkKHIuYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKElCaW5kZXIgYiA6IHJlbW92ZUxpc3QpIHJlbW92ZShiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBicm9hZGNhc3REYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChzdGF0ZSwgaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUsIHJlYXNvbiwgYXBuLAotICAgICAgICAgICAgICAgIGFwblR5cGVzLCBpbnRlcmZhY2VOYW1lLCBnYXRld2F5KTsKKyAgICAgICAgICAgICAgICBhcG5UeXBlLCBsaW5rUHJvcGVydGllcywgbGlua0NhcGFiaWxpdGllcyk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbikgeworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CiAgICAgICAgIGlmICghY2hlY2tOb3RpZnlQZXJtaXNzaW9uKCJub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZCgpIikpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICAvKgotICAgICAgICAgKiBUaGlzIGlzIGNvbW1lbnRlZCBvdXQgYmVjYXVzZSB0aGVyZSBpcyBvbiBvbkRhdGFDb25uZWN0aW9uRmFpbGVkIGNhbGxiYWNrCi0gICAgICAgICAqIG9uIFBob25lU3RhdGVMaXN0ZW5lci4gVGhlcmUgc2hvdWxkIGJlCisgICAgICAgICAqIFRoaXMgaXMgY29tbWVudGVkIG91dCBiZWNhdXNlIHRoZXJlIGlzIG5vIG9uRGF0YUNvbm5lY3Rpb25GYWlsZWQgY2FsbGJhY2sKKyAgICAgICAgICogaW4gUGhvbmVTdGF0ZUxpc3RlbmVyLiBUaGVyZSBzaG91bGQgYmUuCiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbkZhaWxlZFJlYXNvbiA9IHJlYXNvbjsKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbVJlY29yZHMuc2l6ZSgpOwpAQCAtMzk1LDcgKzQyNyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgKi8KLSAgICAgICAgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uKTsKKyAgICAgICAgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uLCBhcG5UeXBlKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBub3RpZnlDZWxsTG9jYXRpb24oQnVuZGxlIGNlbGxMb2NhdGlvbikgewpAQCAtNDA0LDggKzQzNiw3IEBACiAgICAgICAgIH0KICAgICAgICAgc3luY2hyb25pemVkIChtUmVjb3JkcykgewogICAgICAgICAgICAgbUNlbGxMb2NhdGlvbiA9IGNlbGxMb2NhdGlvbjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fQ0VMTF9MT0NBVElPTikgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzZW5kQ2VsbExvY2F0aW9uKHIsIGNlbGxMb2NhdGlvbik7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDE2LDcgKzQ0Nyw3IEBACiAgICAgLyoqCiAgICAgICogQ29weSB0aGUgc2VydmljZSBzdGF0ZSBvYmplY3Qgc28gdGhleSBjYW4ndCBtZXNzIGl0IHVwIGluIHRoZSBsb2NhbCBjYWxscwogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbmRTZXJ2aWNlU3RhdGUoUmVjb3JkIHIsIFNlcnZpY2VTdGF0ZSBzdGF0ZSkgeworICAgIHByaXZhdGUgdm9pZCBzZW5kU2VydmljZVN0YXRlKFJlY29yZCByLCBTZXJ2aWNlU3RhdGUgc3RhdGUpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHIuY2FsbGJhY2sub25TZXJ2aWNlU3RhdGVDaGFuZ2VkKG5ldyBTZXJ2aWNlU3RhdGUoc3RhdGUpKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CkBAIC00NjIsMTEgKzQ5MywxMSBAQAogICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGF0YUNvbm5lY3Rpb25Qb3NzaWJsZT0iICsgbURhdGFDb25uZWN0aW9uUG9zc2libGUpOwogICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGF0YUNvbm5lY3Rpb25SZWFzb249IiArIG1EYXRhQ29ubmVjdGlvblJlYXNvbik7CiAgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EYXRhQ29ubmVjdGlvbkFwbj0iICsgbURhdGFDb25uZWN0aW9uQXBuKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbURhdGFDb25uZWN0aW9uSW50ZXJmYWNlTmFtZT0iICsgbURhdGFDb25uZWN0aW9uSW50ZXJmYWNlTmFtZSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EYXRhQ29ubmVjdGlvbkxpbmtQcm9wZXJ0aWVzPSIgKyBtRGF0YUNvbm5lY3Rpb25MaW5rUHJvcGVydGllcyk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EYXRhQ29ubmVjdGlvbkxpbmtDYXBhYmlsaXRpZXM9IiArIG1EYXRhQ29ubmVjdGlvbkxpbmtDYXBhYmlsaXRpZXMpOwogICAgICAgICAgICAgcHcucHJpbnRsbigiICBtQ2VsbExvY2F0aW9uPSIgKyBtQ2VsbExvY2F0aW9uKTsKICAgICAgICAgICAgIHB3LnByaW50bG4oInJlZ2lzdHJhdGlvbnM6IGNvdW50PSIgKyByZWNvcmRDb3VudCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY29yZENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgIiArIHIucGtnRm9yRGVidWcgKyAiIDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoci5ldmVudHMpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTM3LDcgKzU2OCw4IEBACiAKICAgICBwcml2YXRlIHZvaWQgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoaW50IHN0YXRlLAogICAgICAgICAgICAgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSwKLSAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIFN0cmluZ1tdIGFwblR5cGVzLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgU3RyaW5nIGdhdGV3YXkpIHsKKyAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIFN0cmluZyBhcG5UeXBlLCBMaW5rUHJvcGVydGllcyBsaW5rUHJvcGVydGllcywKKyAgICAgICAgICAgIExpbmtDYXBhYmlsaXRpZXMgbGlua0NhcGFiaWxpdGllcykgewogICAgICAgICAvLyBOb3RlOiBub3QgcmVwb3J0aW5nIHRvIHRoZSBiYXR0ZXJ5IHN0YXRzIHNlcnZpY2UgaGVyZSwgYmVjYXVzZSB0aGUKICAgICAgICAgLy8gc3RhdHVzIGJhciB0YWtlcyBjYXJlIG9mIHRoYXQgYWZ0ZXIgdGFraW5nIGludG8gYWNjb3VudCBhbGwgb2YgdGhlCiAgICAgICAgIC8vIHJlcXVpcmVkIGluZm8uCkBAIC01NTAsMjkgKzU4MiwyNiBAQAogICAgICAgICBpZiAocmVhc29uICE9IG51bGwpIHsKICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5TVEFURV9DSEFOR0VfUkVBU09OX0tFWSwgcmVhc29uKTsKICAgICAgICAgfQotICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZLCBhcG4pOwotICAgICAgICBTdHJpbmcgdHlwZXMgPSBuZXcgU3RyaW5nKCIiKTsKLSAgICAgICAgaWYgKGFwblR5cGVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIHR5cGVzID0gYXBuVHlwZXNbMF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGFwblR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdHlwZXMgPSB0eXBlcysiLCIrYXBuVHlwZXNbaV07CisgICAgICAgIGlmIChsaW5rUHJvcGVydGllcyAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9MSU5LX1BST1BFUlRJRVNfS0VZLCBsaW5rUHJvcGVydGllcyk7CisgICAgICAgICAgICBTdHJpbmcgaWZhY2UgPSBsaW5rUHJvcGVydGllcy5nZXRJbnRlcmZhY2VOYW1lKCk7CisgICAgICAgICAgICBpZiAoaWZhY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0lGQUNFX05BTUVfS0VZLCBpZmFjZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVTX0tFWSwgdHlwZXMpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9JRkFDRV9OQU1FX0tFWSwgaW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgIGludCBnYXRld2F5QWRkciA9IDA7Ci0gICAgICAgIGlmIChnYXRld2F5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdhdGV3YXlBZGRyID0gTmV0d29ya1V0aWxzLnY0U3RyaW5nVG9JbnQoZ2F0ZXdheSk7CisgICAgICAgIGlmIChsaW5rQ2FwYWJpbGl0aWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0xJTktfQ0FQQUJJTElUSUVTX0tFWSwgbGlua0NhcGFiaWxpdGllcyk7CiAgICAgICAgIH0KLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfR0FURVdBWV9LRVksIGdhdGV3YXlBZGRyKTsKLQorICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZLCBhcG4pOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRV9LRVksIGFwblR5cGUpOwogICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGJyb2FkY2FzdERhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24pIHsKKyAgICBwcml2YXRlIHZvaWQgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVGVsZXBob255SW50ZW50cy5BQ1RJT05fREFUQV9DT05ORUNUSU9OX0ZBSUxFRCk7CiAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRVBMQUNFX1BFTkRJTkcpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuRkFJTFVSRV9SRUFTT05fS0VZLCByZWFzb24pOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRV9LRVksIGFwblR5cGUpOwogICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UaHJvdHRsZVNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Rocm90dGxlU2VydmljZS5qYXZhCmluZGV4IGE5M2E2ZWUuLmQ4NDFjYjMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Rocm90dGxlU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Rocm90dGxlU2VydmljZS5qYXZhCkBAIC02MCw2ICs2MCw4IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKIGltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKQEAgLTgzLDggKzg1LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRFU1RJTkdfVEhSRVNIT0xEID0gMSAqIDEwMjQgKiAxMDI0OwogCiAgICAgcHJpdmF0ZSBpbnQgbVBvbGljeVBvbGxQZXJpb2RTZWM7Ci0gICAgcHJpdmF0ZSBsb25nIG1Qb2xpY3lUaHJlc2hvbGQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVBvbGljeVRocm90dGxlVmFsdWU7CisgICAgcHJpdmF0ZSBBdG9taWNMb25nIG1Qb2xpY3lUaHJlc2hvbGQ7CisgICAgcHJpdmF0ZSBBdG9taWNJbnRlZ2VyIG1Qb2xpY3lUaHJvdHRsZVZhbHVlOwogICAgIHByaXZhdGUgaW50IG1Qb2xpY3lSZXNldERheTsgLy8gMS0yOAogICAgIHByaXZhdGUgaW50IG1Qb2xpY3lOb3RpZmljYXRpb25zQWxsb3dlZE1hc2s7CiAKQEAgLTExNCw3ICsxMTYsNyBAQAogICAgIHByaXZhdGUgSW50ZXJmYWNlT2JzZXJ2ZXIgbUludGVyZmFjZU9ic2VydmVyOwogICAgIHByaXZhdGUgU2V0dGluZ3NPYnNlcnZlciBtU2V0dGluZ3NPYnNlcnZlcjsKIAotICAgIHByaXZhdGUgaW50IG1UaHJvdHRsZUluZGV4OyAvLyAwIGZvciBub25lLCAxIGZvciBmaXJzdCB0aHJvdHRsZSB2YWwsIDIgZm9yIG5leHQsIGV0YworICAgIHByaXZhdGUgQXRvbWljSW50ZWdlciBtVGhyb3R0bGVJbmRleDsgLy8gMCBmb3Igbm9uZSwgMSBmb3IgZmlyc3QgdGhyb3R0bGUgdmFsLCAyIGZvciBuZXh0LCBldGMKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEhST1RUTEVfSU5ERVhfVU5JTklUSUFMSVpFRCA9IC0xOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRCAgID0gIDA7CiAKQEAgLTEyNiw2ICsxMjgsMTAgQEAKICAgICAgICAgaWYgKFZEQkcpIFNsb2cudihUQUcsICJTdGFydGluZyBUaHJvdHRsZVNlcnZpY2UiKTsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogCisgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQgPSBuZXcgQXRvbWljTG9uZygpOworICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZSA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKwogICAgICAgICBtTnRwQWN0aXZlID0gZmFsc2U7CiAKICAgICAgICAgbUlmYWNlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmNvbmZpZ19kYXRhdXNlX2lmYWNlKTsKQEAgLTIxNCw3ICsyMjAsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgbG9uZyBudHBUb1dhbGxUaW1lKGxvbmcgbnRwVGltZSkgewotICAgICAgICBsb25nIGJlc3ROb3cgPSBnZXRCZXN0VGltZSgpOworICAgICAgICBsb25nIGJlc3ROb3cgPSBnZXRCZXN0VGltZSh0cnVlKTsgLy8gZG8gaXQgcXVpY2tseQogICAgICAgICBsb25nIGxvY2FsTm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgIHJldHVybiBsb2NhbE5vdyArIChudHBUaW1lIC0gYmVzdE5vdyk7CiAgICAgfQpAQCAtMjIyLDQwICsyMjgsNDIgQEAKICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQogICAgIC8vIHJldHVybiB0aW1lIGluIHRoZSBsb2NhbCwgc3lzdGVtIHdhbGwgdGltZSwgY29ycmVjdGluZyBmb3IgdGhlIHVzZSBvZiBudHAKIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRSZXNldFRpbWUoU3RyaW5nIGlmYWNlKSB7CisgICAgcHVibGljIGxvbmcgZ2V0UmVzZXRUaW1lKFN0cmluZyBpZmFjZSkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwogICAgICAgICBsb25nIHJlc2V0VGltZSA9IDA7CiAgICAgICAgIGlmIChtUmVjb3JkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzZXRUaW1lID0gbnRwVG9XYWxsVGltZShtUmVjb3JkZXIuZ2V0UGVyaW9kRW5kKCkpOworICAgICAgICAgICAgcmVzZXRUaW1lID0gbVJlY29yZGVyLmdldFBlcmlvZEVuZCgpOwogICAgICAgICB9CisgICAgICAgIHJlc2V0VGltZSA9IG50cFRvV2FsbFRpbWUocmVzZXRUaW1lKTsKICAgICAgICAgcmV0dXJuIHJlc2V0VGltZTsKICAgICB9CiAKICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQogICAgIC8vIHJldHVybiB0aW1lIGluIHRoZSBsb2NhbCwgc3lzdGVtIHdhbGwgdGltZSwgY29ycmVjdGluZyBmb3IgdGhlIHVzZSBvZiBudHAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0UGVyaW9kU3RhcnRUaW1lKFN0cmluZyBpZmFjZSkgewotICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOworICAgIHB1YmxpYyBsb25nIGdldFBlcmlvZFN0YXJ0VGltZShTdHJpbmcgaWZhY2UpIHsKICAgICAgICAgbG9uZyBzdGFydFRpbWUgPSAwOworICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwogICAgICAgICBpZiAobVJlY29yZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0YXJ0VGltZSA9IG50cFRvV2FsbFRpbWUobVJlY29yZGVyLmdldFBlcmlvZFN0YXJ0KCkpOworICAgICAgICAgICAgc3RhcnRUaW1lID0gbVJlY29yZGVyLmdldFBlcmlvZFN0YXJ0KCk7CiAgICAgICAgIH0KKyAgICAgICAgc3RhcnRUaW1lID0gbnRwVG9XYWxsVGltZShzdGFydFRpbWUpOwogICAgICAgICByZXR1cm4gc3RhcnRUaW1lOwogICAgIH0KICAgICAvL1RPRE8gLSBhIGJldHRlciBuYW1lPyAgZ2V0Q2xpZmZCeXRlQ291bnRUaHJlc2hvbGQ/CiAgICAgLy8gVE9ETyAtIGZldGNoIGZvciB0aGUgaWZhY2UKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0Q2xpZmZUaHJlc2hvbGQoU3RyaW5nIGlmYWNlLCBpbnQgY2xpZmYpIHsKKyAgICBwdWJsaWMgbG9uZyBnZXRDbGlmZlRocmVzaG9sZChTdHJpbmcgaWZhY2UsIGludCBjbGlmZikgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwogICAgICAgICBpZiAoY2xpZmYgPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJlc2hvbGQ7CisgICAgICAgICAgIHJldHVybiBtUG9saWN5VGhyZXNob2xkLmdldCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICAvLyBUT0RPIC0gYSBiZXR0ZXIgbmFtZT8gZ2V0VGhyb3R0bGVSYXRlPwogICAgIC8vIFRPRE8gLSBmZXRjaCBmb3IgdGhlIGlmYWNlCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0Q2xpZmZMZXZlbChTdHJpbmcgaWZhY2UsIGludCBjbGlmZikgeworICAgIHB1YmxpYyBpbnQgZ2V0Q2xpZmZMZXZlbChTdHJpbmcgaWZhY2UsIGludCBjbGlmZikgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwogICAgICAgICBpZiAoY2xpZmYgPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJvdHRsZVZhbHVlOworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTI2NywxMCArMjc1LDkgQEAKICAgICB9CiAKICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRCeXRlQ291bnQoU3RyaW5nIGlmYWNlLCBpbnQgZGlyLCBpbnQgcGVyaW9kLCBpbnQgYWdvKSB7CisgICAgcHVibGljIGxvbmcgZ2V0Qnl0ZUNvdW50KFN0cmluZyBpZmFjZSwgaW50IGRpciwgaW50IHBlcmlvZCwgaW50IGFnbykgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwotICAgICAgICBpZiAoKHBlcmlvZCA9PSBUaHJvdHRsZU1hbmFnZXIuUEVSSU9EX0NZQ0xFKSAmJgotICAgICAgICAgICAgICAgIChtUmVjb3JkZXIgIT0gbnVsbCkpIHsKKyAgICAgICAgaWYgKChwZXJpb2QgPT0gVGhyb3R0bGVNYW5hZ2VyLlBFUklPRF9DWUNMRSkgJiYgKG1SZWNvcmRlciAhPSBudWxsKSkgewogICAgICAgICAgICAgaWYgKGRpciA9PSBUaHJvdHRsZU1hbmFnZXIuRElSRUNUSU9OX1RYKSByZXR1cm4gbVJlY29yZGVyLmdldFBlcmlvZFR4KGFnbyk7CiAgICAgICAgICAgICBpZiAoZGlyID09IFRocm90dGxlTWFuYWdlci5ESVJFQ1RJT05fUlgpIHJldHVybiBtUmVjb3JkZXIuZ2V0UGVyaW9kUngoYWdvKTsKICAgICAgICAgfQpAQCAtMjc5LDEwICsyODYsMTAgQEAKIAogICAgIC8vIFRPRE8gLSBhIGJldHRlciBuYW1lIC0gZ2V0Q3VycmVudFRocm90dGxlUmF0ZT8KICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFRocm90dGxlKFN0cmluZyBpZmFjZSkgeworICAgIHB1YmxpYyBpbnQgZ2V0VGhyb3R0bGUoU3RyaW5nIGlmYWNlKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIGlmIChtVGhyb3R0bGVJbmRleCA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeVRocm90dGxlVmFsdWU7CisgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleC5nZXQoKSA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMzA1LDIyICszMTIsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0sIG5ldyBJbnRlbnRGaWx0ZXIoQUNUSU9OX1JFU0VUKSk7CiAKLSAgICAgICAgLy8gdXNlIGEgbmV3IHRocmVhZCBhcyB3ZSBkb24ndCB3YW50IHRvIHN0YWxsIHRoZSBzeXN0ZW0gZm9yIGZpbGUgd3JpdGVzCi0gICAgICAgIG1UaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZChUQUcpOwotICAgICAgICBtVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcihtVGhyZWFkLmdldExvb3BlcigpKTsKLSAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9SRUJPT1RfUkVDT1ZFUlkpLnNlbmRUb1RhcmdldCgpOwotCi0gICAgICAgIG1JbnRlcmZhY2VPYnNlcnZlciA9IG5ldyBJbnRlcmZhY2VPYnNlcnZlcihtSGFuZGxlciwgRVZFTlRfSUZBQ0VfVVAsIG1JZmFjZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtTk1TZXJ2aWNlLnJlZ2lzdGVyT2JzZXJ2ZXIobUludGVyZmFjZU9ic2VydmVyKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFNsb2cuZShUQUcsICJDb3VsZCBub3QgcmVnaXN0ZXIgSW50ZXJmYWNlT2JzZXJ2ZXIgIiArIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNldHRpbmdzT2JzZXJ2ZXIgPSBuZXcgU2V0dGluZ3NPYnNlcnZlcihtSGFuZGxlciwgRVZFTlRfUE9MSUNZX0NIQU5HRUQpOwotICAgICAgICBtU2V0dGluZ3NPYnNlcnZlci5vYnNlcnZlKG1Db250ZXh0KTsKLQogICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CkBAIC0zMzcsNiArMzI4LDIyIEBACiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICAvLyB1c2UgYSBuZXcgdGhyZWFkIGFzIHdlIGRvbid0IHdhbnQgdG8gc3RhbGwgdGhlIHN5c3RlbSBmb3IgZmlsZSB3cml0ZXMKKyAgICAgICAgbVRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKFRBRyk7CisgICAgICAgIG1UaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbUhhbmRsZXIgPSBuZXcgTXlIYW5kbGVyKG1UaHJlYWQuZ2V0TG9vcGVyKCkpOworICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKEVWRU5UX1JFQk9PVF9SRUNPVkVSWSkuc2VuZFRvVGFyZ2V0KCk7CisKKyAgICAgICAgbUludGVyZmFjZU9ic2VydmVyID0gbmV3IEludGVyZmFjZU9ic2VydmVyKG1IYW5kbGVyLCBFVkVOVF9JRkFDRV9VUCwgbUlmYWNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1OTVNlcnZpY2UucmVnaXN0ZXJPYnNlcnZlcihtSW50ZXJmYWNlT2JzZXJ2ZXIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNvdWxkIG5vdCByZWdpc3RlciBJbnRlcmZhY2VPYnNlcnZlciAiICsgZSk7CisgICAgICAgIH0KKworICAgICAgICBtU2V0dGluZ3NPYnNlcnZlciA9IG5ldyBTZXR0aW5nc09ic2VydmVyKG1IYW5kbGVyLCBFVkVOVF9QT0xJQ1lfQ0hBTkdFRCk7CisgICAgICAgIG1TZXR0aW5nc09ic2VydmVyLm9ic2VydmUobUNvbnRleHQpOwogICAgIH0KIAogCkBAIC0zNzUsNyArMzgyLDcgQEAKICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBzaW0gY2hhbmdlIFRPRE8KICAgICAgICAgICAgIC8vIHJlcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbiBvZiBwb2xpY3kgY2hhbmdlCiAKLSAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gVEhST1RUTEVfSU5ERVhfVU5JTklUSUFMSVpFRDsKKyAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4LnNldChUSFJPVFRMRV9JTkRFWF9VTklOSVRJQUxJWkVEKTsKIAogICAgICAgICAgICAgbVJlY29yZGVyID0gbmV3IERhdGFSZWNvcmRlcihtQ29udGV4dCwgVGhyb3R0bGVTZXJ2aWNlLnRoaXMpOwogCkBAIC00MDMsMTUgKzQxMCwxNiBAQAogICAgICAgICAgICAgICAgICAgICBSLmludGVnZXIuY29uZmlnX2RhdGF1c2VfdGhyZXNob2xkX2J5dGVzKTsKICAgICAgICAgICAgIGludCBkZWZhdWx0VmFsdWUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRJbnRlZ2VyKAogICAgICAgICAgICAgICAgICAgICBSLmludGVnZXIuY29uZmlnX2RhdGF1c2VfdGhyb3R0bGVfa2JpdHNwcyk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFRocm90dGxlU2VydmljZS50aGlzKSB7Ci0gICAgICAgICAgICAgICAgbVBvbGljeVRocmVzaG9sZCA9IFNldHRpbmdzLlNlY3VyZS5nZXRMb25nKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlRIUk9UVExFX1RIUkVTSE9MRF9CWVRFUywgZGVmYXVsdFRocmVzaG9sZCk7Ci0gICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlRIUk9UVExFX1ZBTFVFX0tCSVRTUFMsIGRlZmF1bHRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRlc3RpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvbGljeVBvbGxQZXJpb2RTZWMgPSBURVNUSU5HX1BPTExJTkdfUEVSSU9EX1NFQzsKLSAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocmVzaG9sZCA9IFRFU1RJTkdfVEhSRVNIT0xEOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvbmcgdGhyZXNob2xkID0gU2V0dGluZ3MuU2VjdXJlLmdldExvbmcobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9USFJFU0hPTERfQllURVMsIGRlZmF1bHRUaHJlc2hvbGQpOworICAgICAgICAgICAgaW50IHZhbHVlID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlRIUk9UVExFX1ZBTFVFX0tCSVRTUFMsIGRlZmF1bHRWYWx1ZSk7CisKKyAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQuc2V0KHRocmVzaG9sZCk7CisgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZS5zZXQodmFsdWUpOworICAgICAgICAgICAgaWYgKHRlc3RpbmcpIHsKKyAgICAgICAgICAgICAgICBtUG9saWN5UG9sbFBlcmlvZFNlYyA9IFRFU1RJTkdfUE9MTElOR19QRVJJT0RfU0VDOworICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQuc2V0KFRFU1RJTkdfVEhSRVNIT0xEKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbVBvbGljeVJlc2V0RGF5ID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKQEAgLTQyMywxMCArNDMxLDggQEAKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9SRVNFVF9EQVksIG1Qb2xpY3lSZXNldERheSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFRocm90dGxlU2VydmljZS50aGlzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1JZmFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQgPSAwOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSWZhY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQuc2V0KDApOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQgZGVmYXVsdE5vdGlmaWNhdGlvblR5cGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRJbnRlZ2VyKApAQCAtNDM3LDE1ICs0NDMsMTYgQEAKICAgICAgICAgICAgIG1NYXhOdHBDYWNoZUFnZVNlYyA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCiAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9NQVhfTlRQX0NBQ0hFX0FHRV9TRUMsIE1BWF9OVFBfQ0FDSEVfQUdFX1NFQyk7CiAKLSAgICAgICAgICAgIGlmIChWREJHIHx8IChtUG9saWN5VGhyZXNob2xkICE9IDApKSB7CisgICAgICAgICAgICBpZiAoVkRCRyB8fCAobVBvbGljeVRocmVzaG9sZC5nZXQoKSAhPSAwKSkgewogICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJvblBvbGljeUNoYW5nZWQgdGVzdGluZz0iICsgdGVzdGluZyArIiwgcGVyaW9kPSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVBvbGxQZXJpb2RTZWMgKyAiLCB0aHJlc2hvbGQ9IiArIG1Qb2xpY3lUaHJlc2hvbGQgKyAiLCB2YWx1ZT0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlICsgIiwgcmVzZXREYXk9IiArIG1Qb2xpY3lSZXNldERheSArICIsIG5vdGVUeXBlPSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeU5vdGlmaWNhdGlvbnNBbGxvd2VkTWFzayArICIsIG1heE50cENhY2hlQWdlPSIgKyBtTWF4TnRwQ2FjaGVBZ2VTZWMpOworICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVBvbGxQZXJpb2RTZWMgKyAiLCB0aHJlc2hvbGQ9IiArIG1Qb2xpY3lUaHJlc2hvbGQuZ2V0KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiwgdmFsdWU9IiArIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpICsgIiwgcmVzZXREYXk9IiArIG1Qb2xpY3lSZXNldERheSArCisgICAgICAgICAgICAgICAgICAgICAgICAiLCBub3RlVHlwZT0iICsgbVBvbGljeU5vdGlmaWNhdGlvbnNBbGxvd2VkTWFzayArICIsIG1heE50cENhY2hlQWdlPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgbU1heE50cENhY2hlQWdlU2VjKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gZm9yY2UgdXBkYXRlcwotICAgICAgICAgICAgbVRocm90dGxlSW5kZXggPSBUSFJPVFRMRV9JTkRFWF9VTklOSVRJQUxJWkVEOworICAgICAgICAgICAgbVRocm90dGxlSW5kZXguc2V0KFRIUk9UVExFX0lOREVYX1VOSU5JVElBTElaRUQpOwogCiAgICAgICAgICAgICBvblJlc2V0QWxhcm0oKTsKIApAQCAtNDg3LDcgKzQ5NCw3IEBACiAgICAgICAgICAgICBsb25nIHBlcmlvZFJ4ID0gbVJlY29yZGVyLmdldFBlcmlvZFJ4KDApOwogICAgICAgICAgICAgbG9uZyBwZXJpb2RUeCA9IG1SZWNvcmRlci5nZXRQZXJpb2RUeCgwKTsKICAgICAgICAgICAgIGxvbmcgdG90YWwgPSBwZXJpb2RSeCArIHBlcmlvZFR4OwotICAgICAgICAgICAgaWYgKFZEQkcgfHwgKG1Qb2xpY3lUaHJlc2hvbGQgIT0gMCkpIHsKKyAgICAgICAgICAgIGlmIChWREJHIHx8IChtUG9saWN5VGhyZXNob2xkLmdldCgpICE9IDApKSB7CiAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9uUG9sbEFsYXJtIC0gcm9hbWluZyA9IiArIHJvYW1pbmcgKwogICAgICAgICAgICAgICAgICAgICAgICAgIiwgcmVhZCA9IiArIGluY1JlYWQgKyAiLCB3cml0dGVuID0iICsgaW5jV3JpdGUgKyAiLCBuZXcgdG90YWwgPSIgKyB0b3RhbCk7CiAgICAgICAgICAgICB9CkBAIC01MTAsMTEgKzUxNywxMSBAQAogICAgICAgICBwcml2YXRlIHZvaWQgb25JZmFjZVVwKCkgewogICAgICAgICAgICAgLy8gaWYgd2Ugd2VyZSB0aHJvdHRsZWQgYmVmb3JlLCBiZSBzdXJlIGFuZCBzZXQgaXQgYWdhaW4gLSB0aGUgaWZhY2Ugd2VudCBkb3duCiAgICAgICAgICAgICAvLyAoYW5kIG1heSBoYXZlIGRpc2FwcGVhcmVkIGFsbCB0b2dldGhlcikgYW5kIHRoZXNlIHNldHRpbmdzIHdlcmUgbG9zdAotICAgICAgICAgICAgaWYgKG1UaHJvdHRsZUluZGV4ID09IDEpIHsKKyAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleC5nZXQoKSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgbU5NU2VydmljZS5zZXRJbnRlcmZhY2VUaHJvdHRsZShtSWZhY2UsIC0xLCAtMSk7CiAgICAgICAgICAgICAgICAgICAgIG1OTVNlcnZpY2Uuc2V0SW50ZXJmYWNlVGhyb3R0bGUobUlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLCBtUG9saWN5VGhyb3R0bGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCksIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiZXJyb3Igc2V0dGluZyBUaHJvdHRsZTogIiArIGUpOwogICAgICAgICAgICAgICAgIH0KQEAgLTUyMyw3ICs1MzAsOCBAQAogCiAgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja1Rocm90dGxlQW5kUG9zdE5vdGlmaWNhdGlvbihsb25nIGN1cnJlbnRUb3RhbCkgewogICAgICAgICAgICAgLy8gaXMgdGhyb3R0bGluZyBlbmFibGVkPwotICAgICAgICAgICAgaWYgKG1Qb2xpY3lUaHJlc2hvbGQgPT0gMCkgeworICAgICAgICAgICAgbG9uZyB0aHJlc2hvbGQgPSBtUG9saWN5VGhyZXNob2xkLmdldCgpOworICAgICAgICAgICAgaWYgKHRocmVzaG9sZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgY2xlYXJUaHJvdHRsZUFuZE5vdGlmaWNhdGlvbigpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTUzNSwxNSArNTQzLDEzIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gdGhyb3R0bGUKLSAgICAgICAgICAgIGlmIChjdXJyZW50VG90YWwgPiBtUG9saWN5VGhyZXNob2xkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1UaHJvdHRsZUluZGV4ICE9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChUaHJvdHRsZVNlcnZpY2UudGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgbVRocm90dGxlSW5kZXggPSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJUaHJlc2hvbGQgIiArIG1Qb2xpY3lUaHJlc2hvbGQgKyAiIGV4Y2VlZGVkISIpOworICAgICAgICAgICAgaWYgKGN1cnJlbnRUb3RhbCA+IHRocmVzaG9sZCkgeworICAgICAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleC5nZXQoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4LnNldCgxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgU2xvZy5kKFRBRywgIlRocmVzaG9sZCAiICsgdGhyZXNob2xkICsgIiBleGNlZWRlZCEiKTsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1OTVNlcnZpY2Uuc2V0SW50ZXJmYWNlVGhyb3R0bGUobUlmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZSwgbVBvbGljeVRocm90dGxlVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSwgbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCkpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgImVycm9yIHNldHRpbmcgVGhyb3R0bGU6ICIgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTU2LDcgKzU2Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uLkZMQUdfT05HT0lOR19FVkVOVCk7CiAKICAgICAgICAgICAgICAgICAgICAgSW50ZW50IGJyb2FkY2FzdCA9IG5ldyBJbnRlbnQoVGhyb3R0bGVNYW5hZ2VyLlRIUk9UVExFX0FDVElPTik7Ci0gICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdC5wdXRFeHRyYShUaHJvdHRsZU1hbmFnZXIuRVhUUkFfVEhST1RUTEVfTEVWRUwsIG1Qb2xpY3lUaHJvdHRsZVZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0LnB1dEV4dHJhKFRocm90dGxlTWFuYWdlci5FWFRSQV9USFJPVFRMRV9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSk7CiAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoYnJvYWRjYXN0KTsKIAogICAgICAgICAgICAgICAgIH0gLy8gZWxzZSBhbHJlYWR5IHVwIQpAQCAtNTc5LDggKzU4Niw4IEBACiAgICAgICAgICAgICAgICAgICAgIGxvbmcgcGVyaW9kTGVuZ3RoID0gZW5kIC0gc3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZVVzZWQgPSBub3cgLSBzdGFydDsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyB3YXJuaW5nVGhyZXNob2xkID0gMiptUG9saWN5VGhyZXNob2xkKnRpbWVVc2VkLyh0aW1lVXNlZCtwZXJpb2RMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnRUb3RhbCA+IHdhcm5pbmdUaHJlc2hvbGQpICYmIChjdXJyZW50VG90YWwgPiBtUG9saWN5VGhyZXNob2xkLzQpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgd2FybmluZ1RocmVzaG9sZCA9IDIqdGhyZXNob2xkKnRpbWVVc2VkLyh0aW1lVXNlZCtwZXJpb2RMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnRUb3RhbCA+IHdhcm5pbmdUaHJlc2hvbGQpICYmIChjdXJyZW50VG90YWwgPiB0aHJlc2hvbGQvNCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtV2FybmluZ05vdGlmaWNhdGlvblNlbnQgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2FybmluZ05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLmNhbmNlbChSLmRyYXdhYmxlLnN0YXRfc3lzX3Rocm90dGxlZCk7CkBAIC02MjUsMTEgKzYzMiw5IEBACiAgICAgICAgIH0KIAogCi0gICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2xlYXJUaHJvdHRsZUFuZE5vdGlmaWNhdGlvbigpIHsKLSAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleCAhPSBUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRCkgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoVGhyb3R0bGVTZXJ2aWNlLnRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRocm90dGxlSW5kZXggPSBUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIHByaXZhdGUgdm9pZCBjbGVhclRocm90dGxlQW5kTm90aWZpY2F0aW9uKCkgeworICAgICAgICAgICAgaWYgKG1UaHJvdHRsZUluZGV4LmdldCgpICE9IFRIUk9UVExFX0lOREVYX1VOVEhST1RUTEVEKSB7CisgICAgICAgICAgICAgICAgbVRocm90dGxlSW5kZXguc2V0KFRIUk9UVExFX0lOREVYX1VOVEhST1RUTEVEKTsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBtTk1TZXJ2aWNlLnNldEludGVyZmFjZVRocm90dGxlKG1JZmFjZSwgLTEsIC0xKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewpAQCAtNjg3LDEyICs2OTIsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCBvblJlc2V0QWxhcm0oKSB7Ci0gICAgICAgICAgICBpZiAoVkRCRyB8fCAobVBvbGljeVRocmVzaG9sZCAhPSAwKSkgeworICAgICAgICAgICAgaWYgKFZEQkcgfHwgKG1Qb2xpY3lUaHJlc2hvbGQuZ2V0KCkgIT0gMCkpIHsKICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAib25SZXNldEFsYXJtIC0gbGFzdCBwZXJpb2QgaGFkICIgKyBtUmVjb3JkZXIuZ2V0UGVyaW9kUngoMCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyByZWFkIGFuZCAiICsgbVJlY29yZGVyLmdldFBlcmlvZFR4KDApICsgIiB3cml0dGVuIik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGxvbmcgbm93ID0gZ2V0QmVzdFRpbWUoKTsKKyAgICAgICAgICAgIGxvbmcgbm93ID0gZ2V0QmVzdFRpbWUoZmFsc2UpOwogCiAgICAgICAgICAgICBpZiAobU50cEFjdGl2ZSB8fCAobU50cFNlcnZlciA9PSBudWxsKSkgewogICAgICAgICAgICAgICAgIENhbGVuZGFyIGVuZCA9IGNhbGN1bGF0ZVBlcmlvZEVuZChub3cpOwpAQCAtNzE5LDIwICs3MjQsMjMgQEAKIAogICAgICAgICAvLyB3aWxsIHRyeSB0byBnZXQgdGhlIG50cCB0aW1lIGFuZCBzd2l0Y2ggdG8gaXQgaWYgZm91bmQuCiAgICAgICAgIC8vIHdpbGwgYWxzbyBjYWNoZSB0aGUgdGltZSBzbyB3ZSBkb24ndCBmZXRjaCBpdCByZXBlYXRlZGx5LgotICAgICAgICBnZXRCZXN0VGltZSgpOworICAgICAgICBnZXRCZXN0VGltZShmYWxzZSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9OVFBfQ0FDSEVfQUdFX1NFQyA9IDYwICogNjAgKiAyNDsgLy8gMSBkYXkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05UUF9GRVRDSF9XQUlUID0gMTAgKiAxMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlRQX0ZFVENIX1dBSVQgPSAyMCAqIDEwMDA7CiAgICAgcHJpdmF0ZSBpbnQgbU1heE50cENhY2hlQWdlU2VjID0gTUFYX05UUF9DQUNIRV9BR0VfU0VDOwogICAgIHByaXZhdGUgbG9uZyBjYWNoZWROdHA7CiAgICAgcHJpdmF0ZSBsb25nIGNhY2hlZE50cFRpbWVzdGFtcDsKIAotICAgIHByaXZhdGUgbG9uZyBnZXRCZXN0VGltZSgpIHsKKyAgICAvLyBpZiB0aGUgcmVxdWVzdCBpcyB0aWVkIHRvIFVJIGFuZCBBTlIncyBhcmUgYSBkYW5nZXIsIHJlcXVlc3QgYSBmYXN0IHJlc3VsdAorICAgIC8vIHRoZSByZWd1bGFyIHBvbGxpbmcgc2hvdWxkIGhhdmUgdXBkYXRlZCB0aGUgY2FjaGVkIHRpbWUgcmVjZW50bHkgdXNpbmcgdGhlCisgICAgLy8gc2xvd2VyIG1ldGhvZCAoIWZhc3QpCisgICAgcHJpdmF0ZSBsb25nIGdldEJlc3RUaW1lKGJvb2xlYW4gZmFzdCkgewogICAgICAgICBpZiAobU50cFNlcnZlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAobU50cEFjdGl2ZSkgewogICAgICAgICAgICAgICAgIGxvbmcgbnRwQWdlID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgLSBjYWNoZWROdHBUaW1lc3RhbXA7Ci0gICAgICAgICAgICAgICAgaWYgKG50cEFnZSA8IG1NYXhOdHBDYWNoZUFnZVNlYyAqIDEwMDApIHsKKyAgICAgICAgICAgICAgICBpZiAobnRwQWdlIDwgbU1heE50cENhY2hlQWdlU2VjICogMTAwMCB8fCBmYXN0KSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChWREJHKSBTbG9nLnYoVEFHLCAidXNpbmcgY2FjaGVkIHRpbWUiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZE50cCArIG50cEFnZTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMDI1LDM5ICsxMDMzLDU3IEBACiAgICAgICAgICAgICAgICAgaWYgKERCRykgU2xvZy5kKFRBRywgImRhdGEgZmlsZSBlbXB0eSIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVBhcmVudCkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhcnNlZCA9IGRhdGEuc3BsaXQoIjoiKTsKLSAgICAgICAgICAgICAgICBpbnQgcGFyc2VkVXNlZCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5sZW5ndGggPCA2KSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJyZWFkaW5nIGRhdGEgZmlsZSB3aXRoIGluc3VmZmljaWVudCBsZW5ndGggLSBpZ25vcmluZyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nW10gcGFyc2VkID0gZGF0YS5zcGxpdCgiOiIpOworICAgICAgICAgICAgaW50IHBhcnNlZFVzZWQgPSAwOworICAgICAgICAgICAgaWYgKHBhcnNlZC5sZW5ndGggPCA2KSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgInJlYWRpbmcgZGF0YSBmaWxlIHdpdGggaW5zdWZmaWNpZW50IGxlbmd0aCAtIGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpbnQgcGVyaW9kQ291bnQ7CisgICAgICAgICAgICBsb25nW10gcGVyaW9kUnhEYXRhOworICAgICAgICAgICAgbG9uZ1tdIHBlcmlvZFR4RGF0YTsKKyAgICAgICAgICAgIGludCBjdXJyZW50UGVyaW9kOworICAgICAgICAgICAgQ2FsZW5kYXIgcGVyaW9kU3RhcnQ7CisgICAgICAgICAgICBDYWxlbmRhciBwZXJpb2RFbmQ7CisgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGlmIChJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZFtwYXJzZWRVc2VkKytdKSAhPSBEQVRBX0ZJTEVfVkVSU0lPTikgewogICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAicmVhZGluZyBkYXRhIGZpbGUgd2l0aCBiYWQgdmVyc2lvbiAtIGlnbm9yaW5nIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtUGVyaW9kQ291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKLSAgICAgICAgICAgICAgICBpZiAocGFyc2VkLmxlbmd0aCAhPSA1ICsgKDIgKiBtUGVyaW9kQ291bnQpKSB7CisgICAgICAgICAgICAgICAgcGVyaW9kQ291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyc2VkLmxlbmd0aCAhPSA1ICsgKDIgKiBwZXJpb2RDb3VudCkpIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgInJlYWRpbmcgZGF0YSBmaWxlIHdpdGggYmFkIGxlbmd0aCAoIiArIHBhcnNlZC5sZW5ndGggKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIT0gIiArICg1KygyKm1QZXJpb2RDb3VudCkpICsgIikgLSBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIT0gIiArICg1ICsgKDIgKiBwZXJpb2RDb3VudCkpICsgIikgLSBpZ25vcmluZyIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBlcmlvZFJ4RGF0YSA9IG5ldyBsb25nW3BlcmlvZENvdW50XTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBlcmlvZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcGVyaW9kUnhEYXRhW2ldID0gTG9uZy5wYXJzZUxvbmcocGFyc2VkW3BhcnNlZFVzZWQrK10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZXJpb2RUeERhdGEgPSBuZXcgbG9uZ1twZXJpb2RDb3VudF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZXJpb2RDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHBlcmlvZFR4RGF0YVtpXSA9IExvbmcucGFyc2VMb25nKHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtUGVyaW9kUnhEYXRhID0gbmV3IGxvbmdbbVBlcmlvZENvdW50XTsKLSAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbVBlcmlvZENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbVBlcmlvZFJ4RGF0YVtpXSA9IExvbmcucGFyc2VMb25nKHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBlcmlvZFR4RGF0YSA9IG5ldyBsb25nW21QZXJpb2RDb3VudF07Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG1QZXJpb2RDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QZXJpb2RUeERhdGFbaV0gPSBMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DdXJyZW50UGVyaW9kID0gSW50ZWdlci5wYXJzZUludChwYXJzZWRbcGFyc2VkVXNlZCsrXSk7Ci0gICAgICAgICAgICAgICAgbVBlcmlvZFN0YXJ0ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0gICAgICAgICAgICAgICAgbVBlcmlvZFN0YXJ0LnNldFRpbWVJbk1pbGxpcyhMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSkpOwotICAgICAgICAgICAgICAgIG1QZXJpb2RFbmQgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLSAgICAgICAgICAgICAgICBtUGVyaW9kRW5kLnNldFRpbWVJbk1pbGxpcyhMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSkpOworICAgICAgICAgICAgICAgIGN1cnJlbnRQZXJpb2QgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKKworICAgICAgICAgICAgICAgIHBlcmlvZFN0YXJ0ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgICAgICAgICAgICAgcGVyaW9kU3RhcnQuc2V0VGltZUluTWlsbGlzKExvbmcucGFyc2VMb25nKHBhcnNlZFtwYXJzZWRVc2VkKytdKSk7CisgICAgICAgICAgICAgICAgcGVyaW9kRW5kID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgICAgICAgICAgICAgcGVyaW9kRW5kLnNldFRpbWVJbk1pbGxpcyhMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3IgcGFyc2luZyBkYXRhIGZpbGUgLSBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVBhcmVudCkgeworICAgICAgICAgICAgICAgIG1QZXJpb2RDb3VudCA9IHBlcmlvZENvdW50OworICAgICAgICAgICAgICAgIG1QZXJpb2RSeERhdGEgPSBwZXJpb2RSeERhdGE7CisgICAgICAgICAgICAgICAgbVBlcmlvZFR4RGF0YSA9IHBlcmlvZFR4RGF0YTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFBlcmlvZCA9IGN1cnJlbnRQZXJpb2Q7CisgICAgICAgICAgICAgICAgbVBlcmlvZFN0YXJ0ID0gcGVyaW9kU3RhcnQ7CisgICAgICAgICAgICAgICAgbVBlcmlvZEVuZCA9IHBlcmlvZEVuZDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xMDkxLDE1ICsxMTE3LDE1IEBACiAgICAgICAgIH0KICAgICAgICAgcHcucHJpbnRsbigpOwogCi0gICAgICAgIHB3LnByaW50bG4oIlRoZSB0aHJlc2hvbGQgaXMgIiArIG1Qb2xpY3lUaHJlc2hvbGQgKworICAgICAgICBwdy5wcmludGxuKCJUaGUgdGhyZXNob2xkIGlzICIgKyBtUG9saWN5VGhyZXNob2xkLmdldCgpICsKICAgICAgICAgICAgICAgICAiLCBhZnRlciB3aGljaCB5b3UgZXhwZXJpbmNlIHRocm90dGxpbmcgdG8gIiArCi0gICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUgKyAia2JwcyIpOworICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpICsgImticHMiKTsKICAgICAgICAgcHcucHJpbnRsbigiQ3VycmVudCBwZXJpb2QgaXMgIiArCiAgICAgICAgICAgICAgICAgKG1SZWNvcmRlci5nZXRQZXJpb2RFbmQoKSAtIG1SZWNvcmRlci5nZXRQZXJpb2RTdGFydCgpKS8xMDAwICsgIiBzZWNvbmRzIGxvbmcgIiArCiAgICAgICAgICAgICAgICAgImFuZCBlbmRzIGluICIgKyAoZ2V0UmVzZXRUaW1lKG1JZmFjZSkgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkgLyAxMDAwICsKICAgICAgICAgICAgICAgICAiIHNlY29uZHMuIik7CiAgICAgICAgIHB3LnByaW50bG4oIlBvbGxpbmcgZXZlcnkgIiArIG1Qb2xpY3lQb2xsUGVyaW9kU2VjICsgIiBzZWNvbmRzIik7Ci0gICAgICAgIHB3LnByaW50bG4oIkN1cnJlbnQgVGhyb3R0bGUgSW5kZXggaXMgIiArIG1UaHJvdHRsZUluZGV4KTsKKyAgICAgICAgcHcucHJpbnRsbigiQ3VycmVudCBUaHJvdHRsZSBJbmRleCBpcyAiICsgbVRocm90dGxlSW5kZXguZ2V0KCkpOwogICAgICAgICBwdy5wcmludGxuKCJNYXggTlRQIENhY2hlIEFnZSBpcyAiICsgbU1heE50cENhY2hlQWdlU2VjKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1SZWNvcmRlci5nZXRQZXJpb2RDb3VudCgpOyBpKyspIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1VzYk9ic2VydmVyLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Vc2JPYnNlcnZlci5qYXZhCmluZGV4IGQwOGZlOWIuLjU0NmU1ZjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1VzYk9ic2VydmVyLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVXNiT2JzZXJ2ZXIuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5VRXZlbnRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk10cDsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CkBAIC0xNDcsOCArMTQ4LDQzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG1vbml0b3JVc2JIb3N0QnVzKCk7CisKKyAgICAvLyBjYWxsZWQgZnJvbSBKTkkgaW4gbW9uaXRvclVzYkhvc3RCdXMoKQorICAgIHByaXZhdGUgdm9pZCB1c2JDYW1lcmFBZGRlZChpbnQgZGV2aWNlSUQpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVXNiLkFDVElPTl9VU0JfQ0FNRVJBX0FUVEFDSEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHAuRGV2aWNlLmdldENvbnRlbnRVcmkoZGV2aWNlSUQpKTsKKyAgICAgICAgTG9nLmQoVEFHLCAidXNiQ2FtZXJhQWRkZWQsIHNlbmRpbmcgIiArIGludGVudCk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICAvLyBjYWxsZWQgZnJvbSBKTkkgaW4gbW9uaXRvclVzYkhvc3RCdXMoKQorICAgIHByaXZhdGUgdm9pZCB1c2JDYW1lcmFSZW1vdmVkKGludCBkZXZpY2VJRCkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChVc2IuQUNUSU9OX1VTQl9DQU1FUkFfREVUQUNIRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cC5EZXZpY2UuZ2V0Q29udGVudFVyaShkZXZpY2VJRCkpOworICAgICAgICBMb2cuZChUQUcsICJ1c2JDYW1lcmFSZW1vdmVkLCBzZW5kaW5nICIgKyBpbnRlbnQpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRIb3N0U3VwcG9ydCgpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGEgdGhyZWFkIHRvIGNhbGwgaW50byBuYXRpdmUgY29kZSB0byB3YWl0IGZvciBVU0IgaG9zdCBldmVudHMuCisgICAgICAgIC8vIFRoaXMgdGhyZWFkIHdpbGwgY2FsbCB1cyBiYWNrIG9uIHVzYkNhbWVyYUFkZGVkIGFuZCB1c2JDYW1lcmFSZW1vdmVkLgorICAgICAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtb25pdG9yVXNiSG9zdEJ1cygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBuZXcgVGhyZWFkKG51bGwsIHJ1bm5hYmxlLCAiVXNiT2JzZXJ2ZXIgaG9zdCB0aHJlYWQiKS5zdGFydCgpOworICAgIH0KKwogICAgIHZvaWQgc3lzdGVtUmVhZHkoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfaGFzVXNiSG9zdFN1cHBvcnQpKSB7CisgICAgICAgICAgICAgICAgLy8gc3RhcnQgbW9uaXRvcmluZyBmb3IgY29ubmVjdGVkIFVTQiBkZXZpY2VzCisgICAgICAgICAgICAgICAgaW5pdEhvc3RTdXBwb3J0KCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHVwZGF0ZSgpOwogICAgICAgICAgICAgbVN5c3RlbVJlYWR5ID0gdHJ1ZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlTZXJ2aWNlLmphdmEKaW5kZXggM2Q5NWJmMC4uNTQwYzdmZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpU2VydmljZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTYsMTA5ICsxNiw4OSBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKIAotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRElTQUJMRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9ESVNBQkxJTkc7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9FTkFCTEVEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRU5BQkxJTkc7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9VTktOT1dOOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9BUF9TVEFURV9ESVNBQkxFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0RJU0FCTElORzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0VOQUJMRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9BUF9TVEFURV9FTkFCTElORzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0ZBSUxFRDsKLQogaW1wb3J0IGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEEyZHA7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuSVdpZmlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaUluZm87CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlOYXRpdmU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpU3RhdGVUcmFja2VyOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlTWFjaGluZTsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLlNjYW5SZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlDb25maWd1cmF0aW9uLktleU1nbXQ7CiBpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5JbnRlcmZhY2VDb25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0ZVRyYWNrZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuRGhjcEluZm87Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1V0aWxzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLlN0YXRlOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Xb3JrU291cmNlOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkJpdFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLklCYXR0ZXJ5U3RhdHM7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuYmFja3VwLklCYWNrdXBNYW5hZ2VyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5hbS5CYXR0ZXJ5U3RhdHNTZXJ2aWNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiAKIC8qKgogICogV2lmaVNlcnZpY2UgaGFuZGxlcyByZW1vdGUgV2lGaSBvcGVyYXRpb24gcmVxdWVzdHMgYnkgaW1wbGVtZW50aW5nCi0gKiB0aGUgSVdpZmlNYW5hZ2VyIGludGVyZmFjZS4gSXQgYWxzbyBjcmVhdGVzIGEgV2lmaU1vbml0b3IgdG8gbGlzdGVuCi0gKiBmb3IgV2lmaS1yZWxhdGVkIGV2ZW50cy4KKyAqIHRoZSBJV2lmaU1hbmFnZXIgaW50ZXJmYWNlLgogICoKICAqIEBoaWRlCiAgKi8KKy8vVE9ETzogQ2xlYW4gdXAgbXVsdGlwbGUgbG9ja3MgYW5kIGltcGxlbWVudCBXaWZpU2VydmljZQorLy8gYXMgYSBTTSB0byB0cmFjayBzb2Z0IEFQL2NsaWVudC9hZGhvYyBicmluZyB1cCBiYXNlZAorLy8gb24gZGV2aWNlIGlkbGUgc3RhdGUsIGFpcnBsYW5lIG1vZGUgYW5kIGJvb3QuCisKIHB1YmxpYyBjbGFzcyBXaWZpU2VydmljZSBleHRlbmRzIElXaWZpTWFuYWdlci5TdHViIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIldpZmlTZXJ2aWNlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gc2NhblJlc3VsdFBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIlx0KyIpOwotICAgIHByaXZhdGUgZmluYWwgV2lmaVN0YXRlVHJhY2tlciBtV2lmaVN0YXRlVHJhY2tlcjsKLSAgICAvKiBUT0RPOiBmZXRjaCBhIGNvbmZpZ3VyYWJsZSBpbnRlcmZhY2UgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09GVEFQX0lGQUNFID0gIndsMC4xIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7CisKKyAgICBwcml2YXRlIGZpbmFsIFdpZmlTdGF0ZU1hY2hpbmUgbVdpZmlTdGF0ZU1hY2hpbmU7CiAKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVdpZmlBcFN0YXRlOwogCiAgICAgcHJpdmF0ZSBBbGFybU1hbmFnZXIgbUFsYXJtTWFuYWdlcjsKICAgICBwcml2YXRlIFBlbmRpbmdJbnRlbnQgbUlkbGVJbnRlbnQ7CisgICAgcHJpdmF0ZSBCbHVldG9vdGhBMmRwIG1CbHVldG9vdGhBMmRwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRExFX1JFUVVFU1QgPSAwOwogICAgIHByaXZhdGUgYm9vbGVhbiBtU2NyZWVuT2ZmOwogICAgIHByaXZhdGUgYm9vbGVhbiBtRGV2aWNlSWRsZTsKICAgICBwcml2YXRlIGludCBtUGx1Z2dlZFR5cGU7CiAKLSAgICBwcml2YXRlIGVudW0gRHJpdmVyQWN0aW9uIHtEUklWRVJfVU5MT0FELCBOT19EUklWRVJfVU5MT0FEfTsKLQogICAgIC8vIHRydWUgaWYgdGhlIHVzZXIgZW5hYmxlZCBXaWZpIHdoaWxlIGluIGFpcnBsYW5lIG1vZGUKLSAgICBwcml2YXRlIGJvb2xlYW4gbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuOworICAgIHByaXZhdGUgQXRvbWljQm9vbGVhbiBtQWlycGxhbmVNb2RlT3ZlcndyaWRkZW4gPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CiAKICAgICBwcml2YXRlIGZpbmFsIExvY2tMaXN0IG1Mb2NrcyA9IG5ldyBMb2NrTGlzdCgpOwogICAgIC8vIHNvbWUgd2lmaSBsb2NrIHN0YXRpc3RpY3MKLSAgICBwcml2YXRlIGludCBtRnVsbEhpZ2hQZXJmTG9ja3NBY3F1aXJlZDsKLSAgICBwcml2YXRlIGludCBtRnVsbEhpZ2hQZXJmTG9ja3NSZWxlYXNlZDsKICAgICBwcml2YXRlIGludCBtRnVsbExvY2tzQWNxdWlyZWQ7CiAgICAgcHJpdmF0ZSBpbnQgbUZ1bGxMb2Nrc1JlbGVhc2VkOwogICAgIHByaXZhdGUgaW50IG1TY2FuTG9ja3NBY3F1aXJlZDsKQEAgLTEzMSw5ICsxMTEsNyBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBJQmF0dGVyeVN0YXRzIG1CYXR0ZXJ5U3RhdHM7CiAKLSAgICBwcml2YXRlIElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UgbndTZXJ2aWNlOwogICAgIENvbm5lY3Rpdml0eU1hbmFnZXIgbUNtOwotICAgIHByaXZhdGUgV2lmaVdhdGNoZG9nU2VydmljZSBtV2lmaVdhdGNoZG9nU2VydmljZSA9IG51bGw7CiAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtV2lmaVJlZ2V4czsKIAogICAgIC8qKgpAQCAtMTQ1LDY4ICsxMjMsNiBAQAogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9JRExFX01JTExJUyA9IDE1ICogNjAgKiAxMDAwOyAvKiAxNSBtaW51dGVzICovCiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FLRUxPQ0tfVEFHID0gIip3aWZpKiI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byBob2xkIHRoZSB3YWtlIGxvY2sgYWZ0ZXIgYSBkaXNjb25uZWN0Ci0gICAgICogY2F1c2VkIGJ5IHN0b3BwaW5nIHRoZSBkcml2ZXIuIEVzdGFibGlzaGluZyBhbiBFREdFIGNvbm5lY3Rpb24gaGFzIGJlZW4KLSAgICAgKiBvYnNlcnZlZCB0byB0YWtlIGFib3V0IDUgc2Vjb25kcyB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcy4gVGhpcwotICAgICAqIHByb3ZpZGVzIGEgYml0IG9mIGV4dHJhIG1hcmdpbi4KLSAgICAgKiA8cD4KLSAgICAgKiBTZWUge0BsaW5rIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlI1dJRklfTU9CSUxFX0RBVEFfVFJBTlNJVElPTl9XQUtFTE9DS19USU1FT1VUX01TfS4KLSAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGlmIGEgU2V0dGluZ3MuU2VjdXJlIHZhbHVlIGlzIG5vdCBwcmVzZW50LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dBS0VMT0NLX1RJTUVPVVQgPSA4MDAwOwotCi0gICAgLy8gV2FrZSBsb2NrIHVzZWQgYnkgZHJpdmVyLXN0b3Agb3BlcmF0aW9uCi0gICAgcHJpdmF0ZSBzdGF0aWMgUG93ZXJNYW5hZ2VyLldha2VMb2NrIHNEcml2ZXJTdG9wV2FrZUxvY2s7Ci0gICAgLy8gV2FrZSBsb2NrIHVzZWQgYnkgb3RoZXIgb3BlcmF0aW9ucwotICAgIHByaXZhdGUgc3RhdGljIFBvd2VyTWFuYWdlci5XYWtlTG9jayBzV2FrZUxvY2s7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9FTkFCTEVfV0lGSSAgICAgICAgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0RJU0FCTEVfV0lGSSAgICAgICA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfU1RPUF9XSUZJICAgICAgICAgID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TVEFSVF9XSUZJICAgICAgICAgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1JFTEVBU0VfV0FLRUxPQ0sgICA9IDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVVBEQVRFX1NUQVRFICAgICAgID0gNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TVEFSVF9BQ0NFU1NfUE9JTlQgPSA2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NUT1BfQUNDRVNTX1BPSU5UICA9IDc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfU0VUX0NIQU5ORUxTICAgICAgID0gODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9FTkFCTEVfTkVUV09SS1MgICAgPSA5OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NUQVJUX1NDQU4gICAgICAgICA9IDEwOwotCi0KLSAgICBwcml2YXRlIGZpbmFsICBXaWZpSGFuZGxlciBtV2lmaUhhbmRsZXI7Ci0KLSAgICAvKgotICAgICAqIENhY2hlIG9mIHNjYW4gcmVzdWx0cyBvYmplY3RzIChzaXplIGlzIHNvbWV3aGF0IGFyYml0cmFyeSkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9SRVNVTFRfQ0FDSEVfU0laRSA9IDgwOwotICAgIHByaXZhdGUgZmluYWwgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFNjYW5SZXN1bHQ+IG1TY2FuUmVzdWx0Q2FjaGU7Ci0KLSAgICAvKgotICAgICAqIENoYXJhY3RlciBidWZmZXIgdXNlZCB0byBwYXJzZSBzY2FuIHJlc3VsdHMgKG9wdGltaXphdGlvbikKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9SRVNVTFRfQlVGRkVSX1NJWkUgPSA1MTI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkUmVjb25maWc7Ci0KLSAgICAvKioKLSAgICAgKiBUZW1wb3JhcnkgZm9yIGNvbXB1dGluZyBVSURTIHRoYXQgYXJlIHJlc3BvbnNpYmxlIGZvciBzdGFydGluZyBXSUZJLgotICAgICAqIFByb3RlY3RlZCBieSBtV2lmaVN0YXRlVHJhY2tlciBsb2NrLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgV29ya1NvdXJjZSBtVG1wV29ya1NvdXJjZSA9IG5ldyBXb3JrU291cmNlKCk7Ci0KLSAgICAvKgotICAgICAqIExhc3QgVUlEIHRoYXQgYXNrZWQgdG8gZW5hYmxlIFdJRkkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbUxhc3RFbmFibGVVaWQgPSBQcm9jZXNzLm15VWlkKCk7Ci0KLSAgICAvKgotICAgICAqIExhc3QgVUlEIHRoYXQgYXNrZWQgdG8gZW5hYmxlIFdJRkkgQVAuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbUxhc3RBcEVuYWJsZVVpZCA9IFByb2Nlc3MubXlVaWQoKTsKLQotCiAgICAgLyoqCiAgICAgICogTnVtYmVyIG9mIGFsbG93ZWQgcmFkaW8gZnJlcXVlbmN5IGNoYW5uZWxzIGluIHZhcmlvdXMgcmVndWxhdG9yeSBkb21haW5zLgogICAgICAqIFRoaXMgbGlzdCBpcyBzdWZmaWNpZW50IGZvciA4MDIuMTFiL2cgbmV0d29ya3MgKDIuNEdIeiByYW5nZSkuCkBAIC0yMTYsNDcgKzEzMiw4NSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fREVWSUNFX0lETEUgPQogICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5XaWZpTWFuYWdlci5hY3Rpb24uREVWSUNFX0lETEUiOwogCi0gICAgV2lmaVNlcnZpY2UoQ29udGV4dCBjb250ZXh0LCBXaWZpU3RhdGVUcmFja2VyIHRyYWNrZXIpIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzUmVjZWl2ZXJSZWdpc3RlcmVkID0gZmFsc2U7CisKKworICAgIE5ldHdvcmtJbmZvIG1OZXR3b3JrSW5mbyA9IG5ldyBOZXR3b3JrSW5mbyhDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSSwgMCwgIldJRkkiLCAiIik7CisKKyAgICAvLyBWYXJpYWJsZXMgcmVsYXRpbmcgdG8gdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbgorICAgIC8qKgorICAgICAqIFRoZSBpY29uIHRvIHNob3cgaW4gdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbi4gVGhpcyB3aWxsIGFsc28KKyAgICAgKiBiZSB0aGUgSUQgb2YgdGhlIE5vdGlmaWNhdGlvbiBnaXZlbiB0byB0aGUgTm90aWZpY2F0aW9uTWFuYWdlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSUNPTl9ORVRXT1JLU19BVkFJTEFCTEUgPQorICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X25vdGlmeV93aWZpX2luX3JhbmdlOworICAgIC8qKgorICAgICAqIFdoZW4gYSBub3RpZmljYXRpb24gaXMgc2hvd24sIHdlIHdhaXQgdGhpcyBhbW91bnQgYmVmb3JlIHBvc3NpYmx5IHNob3dpbmcgaXQgYWdhaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIE5PVElGSUNBVElPTl9SRVBFQVRfREVMQVlfTVM7CisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgdXNlciBoYXMgc2V0IHRoZSBzZXR0aW5nIHRvIHNob3cgdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWNhdGlvbkVuYWJsZWQ7CisgICAgLyoqCisgICAgICogT2JzZXJ2ZXMgdGhlIHVzZXIgc2V0dGluZyB0byBrZWVwIHtAbGluayAjbU5vdGlmaWNhdGlvbkVuYWJsZWR9IGluIHN5bmMuCisgICAgICovCisgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyOworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgU3lzdGVtI2N1cnJlbnRUaW1lTWlsbGlzKCl9IG11c3QgYmUgYXQgbGVhc3QgdGhpcyB2YWx1ZSBmb3IgdXMKKyAgICAgKiB0byBzaG93IHRoZSBub3RpZmljYXRpb24gYWdhaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lOworICAgIC8qKgorICAgICAqIFRoZSBOb3RpZmljYXRpb24gb2JqZWN0IGdpdmVuIHRvIHRoZSBOb3RpZmljYXRpb25NYW5hZ2VyLgorICAgICAqLworICAgIHByaXZhdGUgTm90aWZpY2F0aW9uIG1Ob3RpZmljYXRpb247CisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgbm90aWZpY2F0aW9uIGlzIGJlaW5nIHNob3duLCBhcyBzZXQgYnkgdXMuIFRoYXQgaXMsIGlmIHRoZQorICAgICAqIHVzZXIgY2FuY2VscyB0aGUgbm90aWZpY2F0aW9uLCB3ZSB3aWxsIG5vdCByZWNlaXZlIHRoZSBjYWxsYmFjayBzbyB0aGlzCisgICAgICogd2lsbCBzdGlsbCBiZSB0cnVlLiBXZSBvbmx5IGd1YXJhbnRlZSBpZiB0aGlzIGlzIGZhbHNlLCB0aGVuIHRoZQorICAgICAqIG5vdGlmaWNhdGlvbiBpcyBub3Qgc2hvd2luZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWNhdGlvblNob3duOworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgY29udGludW91cyBzY2FucyB0aGF0IG11c3Qgb2NjdXIgYmVmb3JlIGNvbnNpZGVyIHRoZQorICAgICAqIHN1cHBsaWNhbnQgaW4gYSBzY2FubmluZyBzdGF0ZS4gVGhpcyBhbGxvd3Mgc3VwcGxpY2FudCB0byBhc3NvY2lhdGUgd2l0aAorICAgICAqIHJlbWVtYmVyZWQgbmV0d29ya3MgdGhhdCBhcmUgaW4gdGhlIHNjYW4gcmVzdWx0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1NDQU5TX0JFRk9SRV9BQ1RVQUxMWV9TQ0FOTklORyA9IDM7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBzY2FucyBzaW5jZSB0aGUgbGFzdCBuZXR3b3JrIHN0YXRlIGNoYW5nZS4gV2hlbiB0aGlzCisgICAgICogZXhjZWVkcyB7QGxpbmsgI05VTV9TQ0FOU19CRUZPUkVfQUNUVUFMTFlfU0NBTk5JTkd9LCB3ZSBjb25zaWRlciB0aGUKKyAgICAgKiBzdXBwbGljYW50IHRvIGFjdHVhbGx5IGJlIHNjYW5uaW5nLiBXaGVuIHRoZSBuZXR3b3JrIHN0YXRlIGNoYW5nZXMgdG8KKyAgICAgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiBzY2FubmluZywgd2UgcmVzZXQgdGhpcyB0byAwLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlOworCisgICAgLyoqCisgICAgICogVGVtcG9yYXJ5IGZvciBjb21wdXRpbmcgVUlEUyB0aGF0IGFyZSByZXNwb25zaWJsZSBmb3Igc3RhcnRpbmcgV0lGSS4KKyAgICAgKiBQcm90ZWN0ZWQgYnkgbVdpZmlTdGF0ZVRyYWNrZXIgbG9jay4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFdvcmtTb3VyY2UgbVRtcFdvcmtTb3VyY2UgPSBuZXcgV29ya1NvdXJjZSgpOworCisgICAgV2lmaVNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIgPSB0cmFja2VyOwotICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5lbmFibGVSc3NpUG9sbGluZyh0cnVlKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUgPSBuZXcgV2lmaVN0YXRlTWFjaGluZShtQ29udGV4dCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmVuYWJsZVJzc2lQb2xsaW5nKHRydWUpOwogICAgICAgICBtQmF0dGVyeVN0YXRzID0gQmF0dGVyeVN0YXRzU2VydmljZS5nZXRTZXJ2aWNlKCk7CiAKLSAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UpOwotICAgICAgICBud1NlcnZpY2UgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7Ci0KLSAgICAgICAgbVNjYW5SZXN1bHRDYWNoZSA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgU2NhblJlc3VsdD4oCi0gICAgICAgICAgICBTQ0FOX1JFU1VMVF9DQUNIRV9TSVpFLCAwLjc1ZiwgdHJ1ZSkgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogTGltaXQgdGhlIGNhY2hlIHNpemUgYnkgU0NBTl9SRVNVTFRfQ0FDSEVfU0laRQotICAgICAgICAgICAgICAgICAqIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRWxkZXN0RW50cnkoTWFwLkVudHJ5IGVsZGVzdCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0NBTl9SRVNVTFRfQ0FDSEVfU0laRSA8IHRoaXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgSGFuZGxlclRocmVhZCB3aWZpVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIldpZmlTZXJ2aWNlIik7Ci0gICAgICAgIHdpZmlUaHJlYWQuc3RhcnQoKTsKLSAgICAgICAgbVdpZmlIYW5kbGVyID0gbmV3IFdpZmlIYW5kbGVyKHdpZmlUaHJlYWQuZ2V0TG9vcGVyKCkpOwotCi0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldFdpZmlTdGF0ZShXSUZJX1NUQVRFX0RJU0FCTEVEKTsKLSAgICAgICAgbVdpZmlBcFN0YXRlID0gV0lGSV9BUF9TVEFURV9ESVNBQkxFRDsKLQogICAgICAgICBtQWxhcm1NYW5hZ2VyID0gKEFsYXJtTWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUxBUk1fU0VSVklDRSk7CiAgICAgICAgIEludGVudCBpZGxlSW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fREVWSUNFX0lETEUsIG51bGwpOwogICAgICAgICBtSWRsZUludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KG1Db250ZXh0LCBJRExFX1JFUVVFU1QsIGlkbGVJbnRlbnQsIDApOwogCi0gICAgICAgIFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIgPSAoUG93ZXJNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKLSAgICAgICAgc1dha2VMb2NrID0gcG93ZXJNYW5hZ2VyLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgV0FLRUxPQ0tfVEFHKTsKLSAgICAgICAgc0RyaXZlclN0b3BXYWtlTG9jayA9IHBvd2VyTWFuYWdlci5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIFdBS0VMT0NLX1RBRyk7CisgICAgICAgIEhhbmRsZXJUaHJlYWQgd2lmaVRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJXaWZpU2VydmljZSIpOworICAgICAgICB3aWZpVGhyZWFkLnN0YXJ0KCk7CiAKICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcigKICAgICAgICAgICAgICAgICBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciBvdXIgZmxhZyBpbmRpY2F0aW5nIHRoZSB1c2VyIGhhcyBvdmVyd3JpZGRlbiBhaXJwbGFuZSBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICBtQWlycGxhbmVNb2RlT3ZlcndyaWRkZW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BaXJwbGFuZU1vZGVPdmVyd3JpZGRlbi5zZXQoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gYWlycGxhbmUgZGlzYWJsZSwgcmVzdG9yZSBXaWZpIGlmIHRoZSBzYXZlZCBzdGF0ZSBpbmRpY2F0ZXMgc28KICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNBaXJwbGFuZU1vZGVPbigpICYmIHRlc3RBbmRDbGVhcldpZmlTYXZlZFN0YXRlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzaXN0V2lmaUVuYWJsZWQodHJ1ZSk7CkBAIC0yNzEsMTQgKzIyNSw1MCBAQAogICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKIAotICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gYXZhaWxhYmxlID0gaW50ZW50LmdldFN0cmluZ0FycmF5TGlzdEV4dHJhKAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLkVYVFJBX0FWQUlMQUJMRV9URVRIRVIpOwotICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gYWN0aXZlID0gaW50ZW50LmdldFN0cmluZ0FycmF5TGlzdEV4dHJhKAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLkVYVFJBX0FDVElWRV9URVRIRVIpOwotICAgICAgICAgICAgICAgICAgdXBkYXRlVGV0aGVyU3RhdGUoYXZhaWxhYmxlLCBhY3RpdmUpOworICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhdmFpbGFibGUgPSBpbnRlbnQuZ2V0U3RyaW5nQXJyYXlMaXN0RXh0cmEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5FWFRSQV9BVkFJTEFCTEVfVEVUSEVSKTsKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gYWN0aXZlID0gaW50ZW50LmdldFN0cmluZ0FycmF5TGlzdEV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuRVhUUkFfQUNUSVZFX1RFVEhFUik7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVRldGhlclN0YXRlKGF2YWlsYWJsZSwgYWN0aXZlKTsKIAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0sbmV3IEludGVudEZpbHRlcihDb25uZWN0aXZpdHlNYW5hZ2VyLkFDVElPTl9URVRIRVJfU1RBVEVfQ0hBTkdFRCkpOworCisgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuU0NBTl9SRVNVTFRTX0FWQUlMQUJMRV9BQ1RJT04pOworCisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIoCisgICAgICAgICAgICAgICAgbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCAmIGNsZWFyIG5vdGlmaWNhdGlvbiBvbiBhbnkgd2lmaSBzdGF0ZSBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldE5vdGlmaWNhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mbyA9IChOZXR3b3JrSW5mbykgaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLkVYVFJBX05FVFdPUktfSU5GTyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgJiBjbGVhciBub3RpZmljYXRpb24gb24gYSBuZXR3b3JrIGNvbm5lY3QgJiBkaXNjb25uZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1OZXR3b3JrSW5mby5nZXREZXRhaWxlZFN0YXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXROb3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuU0NBTl9SRVNVTFRTX0FWQUlMQUJMRV9BQ1RJT04pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tBbmRTZXROb3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIGZpbHRlcik7CisKKyAgICAgICAgLy8gU2V0dGluZyBpcyBpbiBzZWNvbmRzCisgICAgICAgIE5PVElGSUNBVElPTl9SRVBFQVRfREVMQVlfTVMgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTkVUV09SS1NfQVZBSUxBQkxFX1JFUEVBVF9ERUxBWSwgOTAwKSAqIDEwMDBsOworICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlciA9IG5ldyBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyKG5ldyBIYW5kbGVyKCkpOworICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlci5yZWdpc3RlcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjg3LDcgKzI3Nyw3IEBACiAgICAgICoKICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgb25seSBhdCBib290IHRpbWUKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFdpZmkoKSB7CisgICAgcHVibGljIHZvaWQgY2hlY2tBbmRTdGFydFdpZmkoKSB7CiAgICAgICAgIC8qIFN0YXJ0IGlmIFdpLUZpIGlzIGVuYWJsZWQgb3IgdGhlIHNhdmVkIHN0YXRlIGluZGljYXRlcyBXaS1GaSB3YXMgb24gKi8KICAgICAgICAgYm9vbGVhbiB3aWZpRW5hYmxlZCA9ICFpc0FpcnBsYW5lTW9kZU9uKCkKICAgICAgICAgICAgICAgICAmJiAoZ2V0UGVyc2lzdGVkV2lmaUVuYWJsZWQoKSB8fCB0ZXN0QW5kQ2xlYXJXaWZpU2F2ZWRTdGF0ZSgpKTsKQEAgLTMwNCw3ICsyOTQsMTAgQEAKICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UpOwogICAgICAgICBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIHNlcnZpY2UgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7CiAKLSAgICAgICAgbUNtID0gKENvbm5lY3Rpdml0eU1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKKyAgICAgICAgaWYgKG1DbSA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ20gPSAoQ29ubmVjdGl2aXR5TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICB9CisKICAgICAgICAgbVdpZmlSZWdleHMgPSBtQ20uZ2V0VGV0aGVyYWJsZVdpZmlSZWdleHMoKTsKIAogICAgICAgICBmb3IgKFN0cmluZyBpbnRmIDogYXZhaWxhYmxlKSB7CkBAIC0zMjQsMTcgKzMxNywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkVycm9yIGNvbmZpZ3VyaW5nIGludGVyZmFjZSAiICsgaW50ZiArICIsIDoiICsgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG53U2VydmljZS5zdG9wQWNjZXNzUG9pbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJDb3VsZCBub3Qgc3RvcCBBUCwgOiIgKyBlZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQsIDAsIERyaXZlckFjdGlvbi5EUklWRVJfVU5MT0FEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWQobnVsbCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaWYobUNtLnRldGhlcihpbnRmKSAhPSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRFVEhFUl9FUlJPUl9OT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkVycm9yIHRldGhlcmluZyAiK2ludGYpOworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkVycm9yIHRldGhlcmluZyBvbiAiICsgaW50Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkKG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC0zNzAsMTggKzM2MCwxMyBAQAogICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KGNyLCBTZXR0aW5ncy5TZWN1cmUuV0lGSV9PTiwgZW5hYmxlZCA/IDEgOiAwKTsKICAgICB9CiAKLSAgICBOZXR3b3JrU3RhdGVUcmFja2VyIGdldE5ldHdvcmtTdGF0ZVRyYWNrZXIoKSB7Ci0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlcjsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjcGluZ1N1cHBsaWNhbnQoKX0KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBwaW5nU3VwcGxpY2FudCgpIHsKLSAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLQotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIucGluZygpOworICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY1BpbmdTdXBwbGljYW50KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zODksMTYwICszNzQsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2Nhbihib29sZWFuIGZvcmNlQWN0aXZlKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0gICAgICAgIGlmIChtV2lmaUhhbmRsZXIgPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XaWZpSGFuZGxlciwgTUVTU0FHRV9TVEFSVF9TQ0FOLCBmb3JjZUFjdGl2ZSA/IDEgOiAwLCAwKS5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjc2V0V2lmaUVuYWJsZWQoYm9vbGVhbil9Ci0gICAgICogQHBhcmFtIGVuYWJsZSB7QGNvZGUgdHJ1ZX0gdG8gZW5hYmxlLCB7QGNvZGUgZmFsc2V9IHRvIGRpc2FibGUuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGVuYWJsZS9kaXNhYmxlIG9wZXJhdGlvbiB3YXMKLSAgICAgKiAgICAgICAgIHN0YXJ0ZWQgb3IgaXMgYWxyZWFkeSBpbiB0aGUgcXVldWUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2V0V2lmaUVuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLSAgICAgICAgaWYgKG1XaWZpSGFuZGxlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtV2lmaUhhbmRsZXIpIHsKLSAgICAgICAgICAgIC8vIGNhbGxlciBtYXkgbm90IGhhdmUgV0FLRV9MT0NLIHBlcm1pc3Npb24gLSBpdCdzIG5vdCByZXF1aXJlZCBoZXJlCi0gICAgICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOwotCi0gICAgICAgICAgICBtTGFzdEVuYWJsZVVpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgICAgICAgICAvLyBzZXQgYSBmbGFnIGlmIHRoZSB1c2VyIGlzIGVuYWJsaW5nIFdpZmkgd2hpbGUgaW4gYWlycGxhbmUgbW9kZQotICAgICAgICAgICAgbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuID0gKGVuYWJsZSAmJiBpc0FpcnBsYW5lTW9kZU9uKCkgJiYgaXNBaXJwbGFuZVRvZ2dsZWFibGUoKSk7Ci0gICAgICAgICAgICBzZW5kRW5hYmxlTWVzc2FnZShlbmFibGUsIHRydWUsIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5hYmxlcy9kaXNhYmxlcyBXaS1GaSBzeW5jaHJvbm91c2x5LgotICAgICAqIEBwYXJhbSBlbmFibGUge0Bjb2RlIHRydWV9IHRvIHR1cm4gV2ktRmkgb24sIHtAY29kZSBmYWxzZX0gdG8gdHVybiBpdCBvZmYuCi0gICAgICogQHBhcmFtIHBlcnNpc3Qge0Bjb2RlIHRydWV9IGlmIHRoZSBzZXR0aW5nIHNob3VsZCBiZSBwZXJzaXN0ZWQuCi0gICAgICogQHBhcmFtIHVpZCBUaGUgVUlEIG9mIHRoZSBwcm9jZXNzIG1ha2luZyB0aGUgcmVxdWVzdC4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIChvciBpZiB0aGUgZXhpc3Rpbmcgc3RhdGUKLSAgICAgKiAgICAgICAgIGlzIHRoZSBzYW1lIGFzIHRoZSByZXF1ZXN0ZWQgc3RhdGUpCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldFdpZmlFbmFibGVkQmxvY2tpbmcoYm9vbGVhbiBlbmFibGUsIGJvb2xlYW4gcGVyc2lzdCwgaW50IHVpZCkgewotICAgICAgICBmaW5hbCBpbnQgZXZlbnR1YWxXaWZpU3RhdGUgPSBlbmFibGUgPyBXSUZJX1NUQVRFX0VOQUJMRUQgOiBXSUZJX1NUQVRFX0RJU0FCTEVEOwotICAgICAgICBmaW5hbCBpbnQgd2lmaVN0YXRlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0V2lmaVN0YXRlKCk7Ci0KLSAgICAgICAgaWYgKHdpZmlTdGF0ZSA9PSBldmVudHVhbFdpZmlTdGF0ZSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVuYWJsZSAmJiBpc0FpcnBsYW5lTW9kZU9uKCkgJiYgIW1BaXJwbGFuZU1vZGVPdmVyd3JpZGRlbikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE11bHRpcGxlIGNhbGxzIHRvIHVucmVnaXN0ZXJSZWNlaXZlcigpIGNhdXNlIGV4Y2VwdGlvbiBhbmQgYSBzeXN0ZW0gY3Jhc2guCi0gICAgICAgICAqIFRoaXMgY2FuIGhhcHBlbiBpZiBhIHN1cHBsaWNhbnQgaXMgbG9zdCAob3IgZmlybXdhcmUgY3Jhc2ggb2NjdXJzKSBhbmQgdXNlciBpbmRpY2F0ZXMKLSAgICAgICAgICogZGlzYWJsZSB3aWZpIGF0IHRoZSBzYW1lIHRpbWUuCi0gICAgICAgICAqIEF2b2lkIGRvaW5nIGEgZGlzYWJsZSB3aGVuIHRoZSBjdXJyZW50IFdpZmkgc3RhdGUgaXMgVU5LTk9XTgotICAgICAgICAgKiBUT0RPOiBIYW5kbGUgZHJpdmVyIGxvYWQgZmFpbCBhbmQgc3VwcGxpY2FudCBsb3N0IGFzIHNlcGVyYXRlIHN0YXRlcwotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCh3aWZpU3RhdGUgPT0gV0lGSV9TVEFURV9VTktOT1dOKSAmJiAhZW5hYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRmFpbCBXaWZpIGlmIEFQIGlzIGVuYWJsZWQKLSAgICAgICAgICogVE9ETzogRGVwcmVjYXRlIFdJRklfU1RBVEVfVU5LTk9XTiBhbmQgcmVuYW1lIGl0Ci0gICAgICAgICAqIFdJRklfU1RBVEVfRkFJTEVECi0gICAgICAgICAqLwotICAgICAgICBpZiAoKG1XaWZpQXBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0VOQUJMRUQpICYmIGVuYWJsZSkgewotICAgICAgICAgICAgc2V0V2lmaUVuYWJsZWRTdGF0ZShXSUZJX1NUQVRFX1VOS05PV04sIHVpZCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRXaWZpRW5hYmxlZFN0YXRlKGVuYWJsZSA/IFdJRklfU1RBVEVfRU5BQkxJTkcgOiBXSUZJX1NUQVRFX0RJU0FCTElORywgdWlkKTsKLQotICAgICAgICBpZiAoZW5hYmxlKSB7Ci0gICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLmxvYWREcml2ZXIoKSkgewotICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsZWQgdG8gbG9hZCBXaS1GaSBkcml2ZXIuIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUVuYWJsZWRTdGF0ZShXSUZJX1NUQVRFX1VOS05PV04sIHVpZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5zdGFydFN1cHBsaWNhbnQoKSkgewotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnVubG9hZERyaXZlcigpOwotICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsZWQgdG8gc3RhcnQgc3VwcGxpY2FudCBkYWVtb24uIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUVuYWJsZWRTdGF0ZShXSUZJX1NUQVRFX1VOS05PV04sIHVpZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZWdpc3RlckZvckJyb2FkY2FzdHMoKTsKLSAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnN0YXJ0RXZlbnRMb29wKCk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlcik7Ci0gICAgICAgICAgIC8vIFJlbW92ZSBub3RpZmljYXRpb24gKGl0IHdpbGwgbm8tb3AgaWYgaXQgaXNuJ3QgdmlzaWJsZSkKLSAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldE5vdGlmaWNhdGlvblZpc2libGUoZmFsc2UsIDAsIGZhbHNlLCAwKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBmYWlsZWRUb1N0b3BTdXBwbGljYW50T3JVbmxvYWREcml2ZXIgPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5zdG9wU3VwcGxpY2FudCgpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byBzdG9wIHN1cHBsaWNhbnQgZGFlbW9uLiIpOwotICAgICAgICAgICAgICAgIHNldFdpZmlFbmFibGVkU3RhdGUoV0lGSV9TVEFURV9VTktOT1dOLCB1aWQpOwotICAgICAgICAgICAgICAgIGZhaWxlZFRvU3RvcFN1cHBsaWNhbnRPclVubG9hZERyaXZlciA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogUmVzZXQgY29ubmVjdGlvbnMgYW5kIGRpc2FibGUgaW50ZXJmYWNlCi0gICAgICAgICAgICAgKiBiZWZvcmUgd2UgdW5sb2FkIHRoZSBkcml2ZXIKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIucmVzZXRDb25uZWN0aW9ucyh0cnVlKTsKLQotICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci51bmxvYWREcml2ZXIoKSkgewotICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsZWQgdG8gdW5sb2FkIFdpLUZpIGRyaXZlci4iKTsKLSAgICAgICAgICAgICAgICBpZiAoIWZhaWxlZFRvU3RvcFN1cHBsaWNhbnRPclVubG9hZERyaXZlcikgewotICAgICAgICAgICAgICAgICAgICBzZXRXaWZpRW5hYmxlZFN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTiwgdWlkKTsKLSAgICAgICAgICAgICAgICAgICAgZmFpbGVkVG9TdG9wU3VwcGxpY2FudE9yVW5sb2FkRHJpdmVyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmYWlsZWRUb1N0b3BTdXBwbGljYW50T3JVbmxvYWREcml2ZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdWNjZXNzIQotCi0gICAgICAgIGlmIChwZXJzaXN0KSB7Ci0gICAgICAgICAgICBwZXJzaXN0V2lmaUVuYWJsZWQoZW5hYmxlKTsKLSAgICAgICAgfQotICAgICAgICBzZXRXaWZpRW5hYmxlZFN0YXRlKGV2ZW50dWFsV2lmaVN0YXRlLCB1aWQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0V2lmaUVuYWJsZWRTdGF0ZShpbnQgd2lmaVN0YXRlLCBpbnQgdWlkKSB7Ci0gICAgICAgIGZpbmFsIGludCBwcmV2aW91c1dpZmlTdGF0ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldFdpZmlTdGF0ZSgpOwotCi0gICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh3aWZpU3RhdGUgPT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaU9uKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdpZmlTdGF0ZSA9PSBXSUZJX1NUQVRFX0RJU0FCTEVEKSB7Ci0gICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaU9mZigpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVXBkYXRlIHN0YXRlCi0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldFdpZmlTdGF0ZSh3aWZpU3RhdGUpOwotCi0gICAgICAgIC8vIEJyb2FkY2FzdAotICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKLSAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVCk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9XSUZJX1NUQVRFLCB3aWZpU3RhdGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfUFJFVklPVVNfV0lGSV9TVEFURSwgcHJldmlvdXNXaWZpU3RhdGUpOwotICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnN0YXJ0U2Nhbihmb3JjZUFjdGl2ZSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCkgewpAQCAtNTYzLDYgKzM5NSw1MCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNzZXRXaWZpRW5hYmxlZChib29sZWFuKX0KKyAgICAgKiBAcGFyYW0gZW5hYmxlIHtAY29kZSB0cnVlfSB0byBlbmFibGUsIHtAY29kZSBmYWxzZX0gdG8gZGlzYWJsZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZW5hYmxlL2Rpc2FibGUgb3BlcmF0aW9uIHdhcworICAgICAqICAgICAgICAgc3RhcnRlZCBvciBpcyBhbHJlYWR5IGluIHRoZSBxdWV1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0V2lmaUVuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiSW52b2tpbmcgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0V2lmaUVuYWJsZWRcbiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2V0IGEgZmxhZyBpZiB0aGUgdXNlciBpcyBlbmFibGluZyBXaWZpIHdoaWxlIGluIGFpcnBsYW5lIG1vZGUKKyAgICAgICAgaWYgKGVuYWJsZSAmJiBpc0FpcnBsYW5lTW9kZU9uKCkgJiYgaXNBaXJwbGFuZVRvZ2dsZWFibGUoKSkgeworICAgICAgICAgICAgbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuLnNldCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgICAgIHJlcG9ydFN0YXJ0V29ya1NvdXJjZSgpOworICAgICAgICB9CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldFdpZmlFbmFibGVkKGVuYWJsZSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2FsbGVyIG1pZ2h0IG5vdCBoYXZlIFdSSVRFX1NFQ1VSRV9TRVRUSU5HUywKKyAgICAgICAgICogb25seSBDSEFOR0VfV0lGSV9TVEFURSBpcyBlbmZvcmNlZAorICAgICAgICAgKi8KKyAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICBwZXJzaXN0V2lmaUVuYWJsZWQoZW5hYmxlKTsKKyAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOworCisgICAgICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgICAgIGlmICghbUlzUmVjZWl2ZXJSZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJGb3JCcm9hZGNhc3RzKCk7CisgICAgICAgICAgICAgICAgbUlzUmVjZWl2ZXJSZWdpc3RlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtSXNSZWNlaXZlclJlZ2lzdGVyZWQpeworICAgICAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlcik7CisgICAgICAgICAgICBtSXNSZWNlaXZlclJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgogICAgICAqIHNlZSB7QGxpbmsgV2lmaU1hbmFnZXIjZ2V0V2lmaVN0YXRlKCl9CiAgICAgICogQHJldHVybiBPbmUgb2Yge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRElTQUJMRUR9LAogICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRElTQUJMSU5HfSwKQEAgLTU3Miw2NiArNDQ4LDU5IEBACiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRXaWZpRW5hYmxlZFN0YXRlKCkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0V2lmaVN0YXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI2Rpc2Nvbm5lY3QoKX0KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdCgpIHsKLSAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLQotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIuZGlzY29ubmVjdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNyZWNvbm5lY3QoKX0KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVjb25uZWN0KCkgewotICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotCi0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5yZWNvbm5lY3RDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3JlYXNzb2NpYXRlKCl9Ci0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcwotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlYXNzb2NpYXRlKCkgewotICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotCi0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5yZWFzc29jaWF0ZSgpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0dldFdpZmlTdGF0ZSgpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNzZXRXaWZpQXBFbmFibGVkKFdpZmlDb25maWd1cmF0aW9uLCBib29sZWFuKX0KICAgICAgKiBAcGFyYW0gd2lmaUNvbmZpZyBTU0lELCBzZWN1cml0eSBhbmQgY2hhbm5lbCBkZXRhaWxzIGFzCiAgICAgICogICAgICAgIHBhcnQgb2YgV2lmaUNvbmZpZ3VyYXRpb24KLSAgICAgKiBAcGFyYW0gZW5hYmxlZCwgdHJ1ZSB0byBlbmFibGUgYW5kIGZhbHNlIHRvIGRpc2FibGUKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCB0cnVlIHRvIGVuYWJsZSBhbmQgZmFsc2UgdG8gZGlzYWJsZQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzdGFydCBvcGVyYXRpb24gd2FzCiAgICAgICogICAgICAgICBzdGFydGVkIG9yIGlzIGFscmVhZHkgaW4gdGhlIHF1ZXVlLgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNldFdpZmlBcEVuYWJsZWQoV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZywgYm9vbGVhbiBlbmFibGVkKSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldFdpZmlBcEVuYWJsZWQoV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZywgYm9vbGVhbiBlbmFibGVkKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0gICAgICAgIGlmIChtV2lmaUhhbmRsZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIHN5bmNocm9uaXplZCAobVdpZmlIYW5kbGVyKSB7Ci0KKyAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgIC8qIFVzZSBkZWZhdWx0IGNvbmZpZyBpZiB0aGVyZSBpcyBubyBleGlzdGluZyBjb25maWcgKi8KKyAgICAgICAgICAgIGlmICh3aWZpQ29uZmlnID09IG51bGwgJiYgKCh3aWZpQ29uZmlnID0gZ2V0V2lmaUFwQ29uZmlndXJhdGlvbigpKSA9PSBudWxsKSkgeworICAgICAgICAgICAgICAgIHdpZmlDb25maWcgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgICAgICB3aWZpQ29uZmlnLlNTSUQgPSBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcud2lmaV90ZXRoZXJfY29uZmlndXJlX3NzaWRfZGVmYXVsdCk7CisgICAgICAgICAgICAgICAgd2lmaUNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudC5zZXQoS2V5TWdtdC5OT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDYWxsZXIgbWlnaHQgbm90IGhhdmUgV1JJVEVfU0VDVVJFX1NFVFRJTkdTLAorICAgICAgICAgICAgICogb25seSBDSEFOR0VfV0lGSV9TVEFURSBpcyBlbmZvcmNlZAorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgc2V0V2lmaUFwQ29uZmlndXJhdGlvbih3aWZpQ29uZmlnKTsKICAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKLQotICAgICAgICAgICAgbUxhc3RBcEVuYWJsZVVpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgICAgICAgICBzZW5kQWNjZXNzUG9pbnRNZXNzYWdlKGVuYWJsZWQsIHdpZmlDb25maWcsIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwogICAgICAgICB9CiAKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0V2lmaUFwRW5hYmxlZCh3aWZpQ29uZmlnLCBlbmFibGVkKTsKKwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBwdWJsaWMgV2lmaUNvbmZpZ3VyYXRpb24gZ2V0V2lmaUFwQ29uZmlndXJhdGlvbigpIHsKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIFdpZmlNYW5hZ2VyI2dldFdpZmlBcFN0YXRlKCl9CisgICAgICogQHJldHVybiBPbmUgb2Yge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMRUR9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMSU5HfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0VOQUJMRUR9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRU5BQkxJTkd9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRkFJTEVEfQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0V2lmaUFwRW5hYmxlZFN0YXRlKCkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0dldFdpZmlBcFN0YXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2VlIHtAbGluayBXaWZpTWFuYWdlciNnZXRXaWZpQXBDb25maWd1cmF0aW9uKCl9CisgICAgICogQHJldHVybiBzb2Z0IGFjY2VzcyBwb2ludCBjb25maWd1cmF0aW9uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBXaWZpQ29uZmlndXJhdGlvbiBnZXRXaWZpQXBDb25maWd1cmF0aW9uKCkgewogICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZyA9IG5ldyBXaWZpQ29uZmlndXJhdGlvbigpOwogICAgICAgICBpbnQgYXV0aFR5cGU7CkBAIC02NDksNyArNTE4LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRXaWZpQXBDb25maWd1cmF0aW9uKFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25maWcpIHsKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIFdpZmlNYW5hZ2VyI3NldFdpZmlBcENvbmZpZ3VyYXRpb24oV2lmaUNvbmZpZ3VyYXRpb24pfQorICAgICAqIEBwYXJhbSB3aWZpQ29uZmlnIFdpZmlDb25maWd1cmF0aW9uIGRldGFpbHMgZm9yIHNvZnQgYWNjZXNzIHBvaW50CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFdpZmlBcENvbmZpZ3VyYXRpb24oV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZykgewogICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwogICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKICAgICAgICAgYm9vbGVhbiBpc1dwYTsKQEAgLTY2NSwxNDMgKzUzOCwyNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEVuYWJsZXMvZGlzYWJsZXMgV2ktRmkgQVAgc3luY2hyb25vdXNseS4gVGhlIGRyaXZlciBpcyBsb2FkZWQKLSAgICAgKiBhbmQgc29mdCBhY2Nlc3MgcG9pbnQgY29uZmlndXJlZCBhcyBhIHNpbmdsZSBvcGVyYXRpb24uCi0gICAgICogQHBhcmFtIGVuYWJsZSB7QGNvZGUgdHJ1ZX0gdG8gdHVybiBXaS1GaSBvbiwge0Bjb2RlIGZhbHNlfSB0byB0dXJuIGl0IG9mZi4KLSAgICAgKiBAcGFyYW0gdWlkIFRoZSBVSUQgb2YgdGhlIHByb2Nlc3MgbWFraW5nIHRoZSByZXF1ZXN0LgotICAgICAqIEBwYXJhbSB3aWZpQ29uZmlnIFRoZSBXaWZpQ29uZmlndXJhdGlvbiBmb3IgQVAKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIChvciBpZiB0aGUgZXhpc3Rpbmcgc3RhdGUKLSAgICAgKiAgICAgICAgIGlzIHRoZSBzYW1lIGFzIHRoZSByZXF1ZXN0ZWQgc3RhdGUpCisgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI2Rpc2Nvbm5lY3QoKX0KICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0V2lmaUFwRW5hYmxlZEJsb2NraW5nKGJvb2xlYW4gZW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWlkLCBXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnKSB7Ci0gICAgICAgIGZpbmFsIGludCBldmVudHVhbFdpZmlBcFN0YXRlID0gZW5hYmxlID8gV0lGSV9BUF9TVEFURV9FTkFCTEVEIDogV0lGSV9BUF9TVEFURV9ESVNBQkxFRDsKLQotICAgICAgICBpZiAobVdpZmlBcFN0YXRlID09IGV2ZW50dWFsV2lmaUFwU3RhdGUpIHsKLSAgICAgICAgICAgIC8qIENvbmZpZ3VyYXRpb24gY2hhbmdlZCBvbiBhIHJ1bm5pbmcgYWNjZXNzIHBvaW50ICovCi0gICAgICAgICAgICBpZihlbmFibGUgJiYgKHdpZmlDb25maWcgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc2V0QWNjZXNzUG9pbnQod2lmaUNvbmZpZywgbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0SW50ZXJmYWNlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09GVEFQX0lGQUNFKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwQ29uZmlndXJhdGlvbih3aWZpQ29uZmlnKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXhjZXB0aW9uIGluIG53U2VydmljZSBkdXJpbmcgQVAgcmVzdGFydCIpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbndTZXJ2aWNlLnN0b3BBY2Nlc3NQb2ludCgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJDb3VsZCBub3Qgc3RvcCBBUCwgOiIgKyBlZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVELCB1aWQsIERyaXZlckFjdGlvbi5EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRmFpbCBBUCBpZiBXaWZpIGlzIGVuYWJsZWQKLSAgICAgICAgICovCi0gICAgICAgIGlmICgobVdpZmlTdGF0ZVRyYWNrZXIuZ2V0V2lmaVN0YXRlKCkgPT0gV0lGSV9TVEFURV9FTkFCTEVEKSAmJiBlbmFibGUpIHsKLSAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCwgdWlkLCBEcml2ZXJBY3Rpb24uTk9fRFJJVkVSX1VOTE9BRCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRXaWZpQXBFbmFibGVkU3RhdGUoZW5hYmxlID8gV0lGSV9BUF9TVEFURV9FTkFCTElORyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSUZJX0FQX1NUQVRFX0RJU0FCTElORywgdWlkLCBEcml2ZXJBY3Rpb24uTk9fRFJJVkVSX1VOTE9BRCk7Ci0KLSAgICAgICAgaWYgKGVuYWJsZSkgewotCi0gICAgICAgICAgICAvKiBVc2UgZGVmYXVsdCBjb25maWcgaWYgdGhlcmUgaXMgbm8gZXhpc3RpbmcgY29uZmlnICovCi0gICAgICAgICAgICBpZiAod2lmaUNvbmZpZyA9PSBudWxsICYmICgod2lmaUNvbmZpZyA9IGdldFdpZmlBcENvbmZpZ3VyYXRpb24oKSkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICB3aWZpQ29uZmlnID0gbmV3IFdpZmlDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgd2lmaUNvbmZpZy5TU0lEID0gbUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLndpZmlfdGV0aGVyX2NvbmZpZ3VyZV9zc2lkX2RlZmF1bHQpOwotICAgICAgICAgICAgICAgIHdpZmlDb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuc2V0KEtleU1nbXQuTk9ORSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIubG9hZERyaXZlcigpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byBsb2FkIFdpLUZpIGRyaXZlciBmb3IgQVAgbW9kZSIpOwotICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCwgdWlkLCBEcml2ZXJBY3Rpb24uTk9fRFJJVkVSX1VOTE9BRCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG53U2VydmljZS5zdGFydEFjY2Vzc1BvaW50KHdpZmlDb25maWcsIG1XaWZpU3RhdGVUcmFja2VyLmdldEludGVyZmFjZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0ZUQVBfSUZBQ0UpOwotICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJFeGNlcHRpb24gaW4gc3RhcnRBY2Nlc3NQb2ludCgpIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVELCB1aWQsIERyaXZlckFjdGlvbi5EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldFdpZmlBcENvbmZpZ3VyYXRpb24od2lmaUNvbmZpZyk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc3RvcEFjY2Vzc1BvaW50KCk7Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkV4Y2VwdGlvbiBpbiBzdG9wQWNjZXNzUG9pbnQoKSIpOwotICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCwgdWlkLCBEcml2ZXJBY3Rpb24uRFJJVkVSX1VOTE9BRCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnVubG9hZERyaXZlcigpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byB1bmxvYWQgV2ktRmkgZHJpdmVyIGZvciBBUCBtb2RlIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVELCB1aWQsIERyaXZlckFjdGlvbi5OT19EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRXaWZpQXBFbmFibGVkU3RhdGUoZXZlbnR1YWxXaWZpQXBTdGF0ZSwgdWlkLCBEcml2ZXJBY3Rpb24uTk9fRFJJVkVSX1VOTE9BRCk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmRpc2Nvbm5lY3RDb21tYW5kKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogc2VlIHtAbGluayBXaWZpTWFuYWdlciNnZXRXaWZpQXBTdGF0ZSgpfQotICAgICAqIEByZXR1cm4gT25lIG9mIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0RJU0FCTEVEfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0RJU0FCTElOR30sCi0gICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9FTkFCTEVEfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0VOQUJMSU5HfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0ZBSUxFRH0KKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjcmVjb25uZWN0KCl9CiAgICAgICovCi0gICAgcHVibGljIGludCBnZXRXaWZpQXBFbmFibGVkU3RhdGUoKSB7Ci0gICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIHJldHVybiBtV2lmaUFwU3RhdGU7CisgICAgcHVibGljIHZvaWQgcmVjb25uZWN0KCkgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5yZWNvbm5lY3RDb21tYW5kKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShpbnQgd2lmaUFQU3RhdGUsIGludCB1aWQsIERyaXZlckFjdGlvbiBmbGFnKSB7Ci0gICAgICAgIGZpbmFsIGludCBwcmV2aW91c1dpZmlBcFN0YXRlID0gbVdpZmlBcFN0YXRlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVbmxvYWQgdGhlIGRyaXZlciBpZiBnb2luZyB0byBhIGZhaWxlZCBzdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYgKChtV2lmaUFwU3RhdGUgPT0gV0lGSV9BUF9TVEFURV9GQUlMRUQpICYmIChmbGFnID09IERyaXZlckFjdGlvbi5EUklWRVJfVU5MT0FEKSkgewotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIudW5sb2FkRHJpdmVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAod2lmaUFQU3RhdGUgPT0gV0lGSV9BUF9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaU9uKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdpZmlBUFN0YXRlID09IFdJRklfQVBfU1RBVEVfRElTQUJMRUQpIHsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT2ZmKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVcGRhdGUgc3RhdGUKLSAgICAgICAgbVdpZmlBcFN0YXRlID0gd2lmaUFQU3RhdGU7Ci0KLSAgICAgICAgLy8gQnJvYWRjYXN0Ci0gICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1dJRklfQVBfU1RBVEUsIHdpZmlBUFN0YXRlKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1BSRVZJT1VTX1dJRklfQVBfU1RBVEUsIHByZXZpb3VzV2lmaUFwU3RhdGUpOwotICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CisgICAgLyoqCisgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3JlYXNzb2NpYXRlKCl9CisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVhc3NvY2lhdGUoKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnJlYXNzb2NpYXRlQ29tbWFuZCgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtODEwLDIxNyArNTY3LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgTGlzdDxXaWZpQ29uZmlndXJhdGlvbj4gZ2V0Q29uZmlndXJlZE5ldHdvcmtzKCkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwotICAgICAgICBTdHJpbmcgbGlzdFN0cjsKLQotICAgICAgICAvKgotICAgICAgICAgKiBXZSBkb24ndCBjYWNoZSB0aGUgbGlzdCwgYmVjYXVzZSB3ZSB3YW50IHRvIGFsbG93Ci0gICAgICAgICAqIGZvciB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBmaWxlCi0gICAgICAgICAqIGhhcyBiZWVuIG1vZGlmaWVkIHRocm91Z2ggc29tZSBleHRlcm5hbCBtZWFucywKLSAgICAgICAgICogc3VjaCBhcyB0aGUgd3BhX2NsaSBjb21tYW5kIGxpbmUgcHJvZ3JhbS4KLSAgICAgICAgICovCi0gICAgICAgIGxpc3RTdHIgPSBtV2lmaVN0YXRlVHJhY2tlci5saXN0TmV0d29ya3MoKTsKLQotICAgICAgICBMaXN0PFdpZmlDb25maWd1cmF0aW9uPiBuZXR3b3JrcyA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFdpZmlDb25maWd1cmF0aW9uPigpOwotICAgICAgICBpZiAobGlzdFN0ciA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG5ldHdvcmtzOwotCi0gICAgICAgIFN0cmluZ1tdIGxpbmVzID0gbGlzdFN0ci5zcGxpdCgiXG4iKTsKLSAgICAgICAgLy8gU2tpcCB0aGUgZmlyc3QgbGluZSwgd2hpY2ggaXMgYSBoZWFkZXIKLSAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IGxpbmVzW2ldLnNwbGl0KCJcdCIpOwotICAgICAgICAgICAvLyBuZXR3b3JrLWlkIHwgc3NpZCB8IGJzc2lkIHwgZmxhZ3MKLSAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFdpZmlDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICBjb25maWcubmV0d29ya0lkID0gSW50ZWdlci5wYXJzZUludChyZXN1bHRbMF0pOwotICAgICAgICAgICB9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDMpIHsKLSAgICAgICAgICAgICAgIGlmIChyZXN1bHRbM10uaW5kZXhPZigiW0NVUlJFTlRdIikgIT0gLTEpCi0gICAgICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyA9IFdpZmlDb25maWd1cmF0aW9uLlN0YXR1cy5DVVJSRU5UOwotICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0WzNdLmluZGV4T2YoIltESVNBQkxFRF0iKSAhPSAtMSkKLSAgICAgICAgICAgICAgICAgICBjb25maWcuc3RhdHVzID0gV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzLkRJU0FCTEVEOwotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuRU5BQkxFRDsKLSAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuRU5BQkxFRDsKLSAgICAgICAgICAgfQotICAgICAgICAgICByZWFkTmV0d29ya1ZhcmlhYmxlcyhjb25maWcpOwotICAgICAgICAgICBuZXR3b3Jrcy5hZGQoY29uZmlnKTsKLSAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldHdvcmtzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgdGhlIHZhcmlhYmxlcyBmcm9tIHRoZSBzdXBwbGljYW50IGRhZW1vbiB0aGF0IGFyZSBuZWVkZWQgdG8KLSAgICAgKiBmaWxsIGluIHRoZSBXaWZpQ29uZmlndXJhdGlvbiBvYmplY3QuCi0gICAgICogPHAvPgotICAgICAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBzeW5jaHJvbml6YXRpb24gbW9uaXRvci4KLSAgICAgKiBAcGFyYW0gY29uZmlnIHRoZSB7QGxpbmsgV2lmaUNvbmZpZ3VyYXRpb259IG9iamVjdCB0byBiZSBmaWxsZWQgaW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWROZXR3b3JrVmFyaWFibGVzKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgewotCi0gICAgICAgIGludCBuZXRJZCA9IGNvbmZpZy5uZXR3b3JrSWQ7Ci0gICAgICAgIGlmIChuZXRJZCA8IDApCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVE9ETzogbWF5YmUgc2hvdWxkIGhhdmUgYSBuYXRpdmUgbWV0aG9kIHRoYXQgdGFrZXMgYW4gYXJyYXkgb2YKLSAgICAgICAgICogdmFyaWFibGUgbmFtZXMgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdmFsdWVzLiBCdXQgd2UnZCBzdGlsbAotICAgICAgICAgKiBiZSBkb2luZyBhIHJvdW5kIHRyaXAgdG8gdGhlIHN1cHBsaWNhbnQgZGFlbW9uIGZvciBlYWNoIHZhcmlhYmxlLgotICAgICAgICAgKi8KLSAgICAgICAgU3RyaW5nIHZhbHVlOwotCi0gICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5zc2lkVmFyTmFtZSk7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICBjb25maWcuU1NJRCA9IHZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uZmlnLlNTSUQgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLmJzc2lkVmFyTmFtZSk7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICBjb25maWcuQlNTSUQgPSB2YWx1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbmZpZy5CU1NJRCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24ucHJpb3JpdHlWYXJOYW1lKTsKLSAgICAgICAgY29uZmlnLnByaW9yaXR5ID0gLTE7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvbmZpZy5wcmlvcml0eSA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLmhpZGRlblNTSURWYXJOYW1lKTsKLSAgICAgICAgY29uZmlnLmhpZGRlblNTSUQgPSBmYWxzZTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLmhpZGRlblNTSUQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSAhPSAwOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLndlcFR4S2V5SWR4VmFyTmFtZSk7Ci0gICAgICAgIGNvbmZpZy53ZXBUeEtleUluZGV4ID0gLTE7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBUeEtleUluZGV4ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdXAgdG8gNCBXRVAga2V5cy4gTm90ZSB0aGF0IHRoZSBhY3R1YWwga2V5cyBhcmUgbm90IHBhc3NlZCBiYWNrLAotICAgICAgICAgKiBqdXN0IGEgIioiIGlmIHRoZSBrZXkgaXMgc2V0LCBvciB0aGUgbnVsbCBzdHJpbmcgb3RoZXJ3aXNlLgotICAgICAgICAgKi8KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi53ZXBLZXlWYXJOYW1lc1tpXSk7Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldID0gdmFsdWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0aGUgcHJpdmF0ZSBzaGFyZWQga2V5LiBOb3RlIHRoYXQgdGhlIGFjdHVhbCBrZXlzIGFyZSBub3QgcGFzc2VkIGJhY2ssCi0gICAgICAgICAqIGp1c3QgYSAiKiIgaWYgdGhlIGtleSBpcyBzZXQsIG9yIHRoZSBudWxsIHN0cmluZyBvdGhlcndpc2UuCi0gICAgICAgICAqLwotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24ucHNrVmFyTmFtZSk7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICBjb25maWcucHJlU2hhcmVkS2V5ID0gdmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25maWcucHJlU2hhcmVkS2V5ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKGNvbmZpZy5uZXR3b3JrSWQsCi0gICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uUHJvdG9jb2wudmFyTmFtZSk7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsc1tdID0gdmFsdWUuc3BsaXQoIiAiKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbCA6IHZhbHMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPQotICAgICAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmcodmFsLCBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC5zdHJpbmdzKTsKLSAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZFByb3RvY29scy5zZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKGNvbmZpZy5uZXR3b3JrSWQsCi0gICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC52YXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9Ci0gICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQuc3RyaW5ncyk7Ci0gICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LnNldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUoY29uZmlnLm5ldHdvcmtJZCwKLSAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5BdXRoQWxnb3JpdGhtLnZhck5hbWUpOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0KLSAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS5zdHJpbmdzKTsKLSAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZEF1dGhBbGdvcml0aG1zLnNldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUoY29uZmlnLm5ldHdvcmtJZCwKLSAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5QYWlyd2lzZUNpcGhlci52YXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9Ci0gICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLlBhaXJ3aXNlQ2lwaGVyLnN0cmluZ3MpOwotICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkUGFpcndpc2VDaXBoZXJzLnNldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUoY29uZmlnLm5ldHdvcmtJZCwKLSAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Hcm91cENpcGhlci52YXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9Ci0gICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnN0cmluZ3MpOwotICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkR3JvdXBDaXBoZXJzLnNldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChXaWZpQ29uZmlndXJhdGlvbi5FbnRlcnByaXNlRmllbGQgZmllbGQgOgotICAgICAgICAgICAgICAgIGNvbmZpZy5lbnRlcnByaXNlRmllbGRzKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgZmllbGQudmFyTmFtZSgpKTsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpZWxkICE9IGNvbmZpZy5lYXApIHZhbHVlID0gcmVtb3ZlRG91YmxlUXVvdGVzKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVtb3ZlRG91YmxlUXVvdGVzKFN0cmluZyBzdHJpbmcpIHsKLSAgICAgICAgaWYgKHN0cmluZy5sZW5ndGgoKSA8PSAyKSByZXR1cm4gIiI7Ci0gICAgICAgIHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDEsIHN0cmluZy5sZW5ndGgoKSAtIDEpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9RdW90ZWRTdHJpbmcoU3RyaW5nIHN0cmluZykgewotICAgICAgICByZXR1cm4gIlwiIiArIHN0cmluZyArICJcIiI7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jR2V0Q29uZmlndXJlZE5ldHdvcmtzKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDMwLDI4MCArNTc3LDEwIEBACiAgICAgICovCiAgICAgcHVibGljIGludCBhZGRPclVwZGF0ZU5ldHdvcmsoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogSWYgdGhlIHN1cHBsaWVkIG5ldHdvcmtJZCBpcyAtMSwgd2UgY3JlYXRlIGEgbmV3IGVtcHR5Ci0gICAgICAgICAqIG5ldHdvcmsgY29uZmlndXJhdGlvbi4gT3RoZXJ3aXNlLCB0aGUgbmV0d29ya0lkIHNob3VsZAotICAgICAgICAgKiByZWZlciB0byBhbiBleGlzdGluZyBjb25maWd1cmF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgaW50IG5ldElkID0gY29uZmlnLm5ldHdvcmtJZDsKLSAgICAgICAgYm9vbGVhbiBuZXdOZXR3b3JrID0gbmV0SWQgPT0gLTE7Ci0gICAgICAgIGJvb2xlYW4gZG9SZWNvbmZpZyA9IGZhbHNlOwotICAgICAgICAvLyBuZXR3b3JrSWQgb2YgLTEgbWVhbnMgd2Ugd2FudCB0byBjcmVhdGUgYSBuZXcgbmV0d29yawotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaWZpU3RhdGVUcmFja2VyKSB7Ci0gICAgICAgICAgICBpZiAobmV3TmV0d29yaykgewotICAgICAgICAgICAgICAgIG5ldElkID0gbVdpZmlTdGF0ZVRyYWNrZXIuYWRkTmV0d29yaygpOwotICAgICAgICAgICAgICAgIGlmIChuZXRJZCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkZhaWxlZCB0byBhZGQgYSBuZXR3b3JrISIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZG9SZWNvbmZpZyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTmVlZFJlY29uZmlnID0gbU5lZWRSZWNvbmZpZyB8fCBkb1JlY29uZmlnOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0VmFyaWFibGVzOiB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogTm90ZSB0aGF0IGlmIGEgbmV0d29ya0lkIGZvciBhIG5vbi1leGlzdGVudCBuZXR3b3JrCi0gICAgICAgICAgICAgKiB3YXMgc3VwcGxpZWQsIHRoZW4gdGhlIGZpcnN0IHNldE5ldHdvcmtWYXJpYWJsZSgpCi0gICAgICAgICAgICAgKiB3aWxsIGZhaWwsIHNvIHdlIGRvbid0IGJvdGhlciB0byBtYWtlIGEgc2VwYXJhdGUgY2hlY2sKLSAgICAgICAgICAgICAqIGZvciB0aGUgdmFsaWRpdHkgb2YgdGhlIElEIHVwIGZyb250LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoY29uZmlnLlNTSUQgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAhbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5zc2lkVmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5TU0lEKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgU1NJRDogIitjb25maWcuU1NJRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNvbmZpZy5CU1NJRCAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLmJzc2lkVmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5CU1NJRCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IEJTU0lEOiAiK2NvbmZpZy5CU1NJRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRLZXlNYW5hZ2VtZW50U3RyaW5nID0KLSAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudCwgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC5zdHJpbmdzKTsKLSAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuY2FyZGluYWxpdHkoKSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQudmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRLZXlNYW5hZ2VtZW50U3RyaW5nKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQga2V5X21nbXQ6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEtleU1hbmFnZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBhbGxvd2VkUHJvdG9jb2xzU3RyaW5nID0KLSAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkUHJvdG9jb2xzLCBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC5zdHJpbmdzKTsKLSAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZFByb3RvY29scy5jYXJkaW5hbGl0eSgpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uUHJvdG9jb2wudmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRQcm90b2NvbHNTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBwcm90bzogIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkUHJvdG9jb2xzU3RyaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgYWxsb3dlZEF1dGhBbGdvcml0aG1zU3RyaW5nID0KLSAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkQXV0aEFsZ29yaXRobXMsIFdpZmlDb25maWd1cmF0aW9uLkF1dGhBbGdvcml0aG0uc3RyaW5ncyk7Ci0gICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRBdXRoQWxnb3JpdGhtcy5jYXJkaW5hbGl0eSgpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS52YXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF1dGhBbGdvcml0aG1zU3RyaW5nKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgYXV0aF9hbGc6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF1dGhBbGdvcml0aG1zU3RyaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgYWxsb3dlZFBhaXJ3aXNlQ2lwaGVyc1N0cmluZyA9Ci0gICAgICAgICAgICAgICAgbWFrZVN0cmluZyhjb25maWcuYWxsb3dlZFBhaXJ3aXNlQ2lwaGVycywgV2lmaUNvbmZpZ3VyYXRpb24uUGFpcndpc2VDaXBoZXIuc3RyaW5ncyk7Ci0gICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRQYWlyd2lzZUNpcGhlcnMuY2FyZGluYWxpdHkoKSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLlBhaXJ3aXNlQ2lwaGVyLnZhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkUGFpcndpc2VDaXBoZXJzU3RyaW5nKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgcGFpcndpc2U6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFBhaXJ3aXNlQ2lwaGVyc1N0cmluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRHcm91cENpcGhlcnNTdHJpbmcgPQotICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRHcm91cENpcGhlcnMsIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnN0cmluZ3MpOwotICAgICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkR3JvdXBDaXBoZXJzLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAhbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Hcm91cENpcGhlci52YXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEdyb3VwQ2lwaGVyc1N0cmluZykpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IGdyb3VwOiAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRHcm91cENpcGhlcnNTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFByZXZlbnQgY2xpZW50IHNjcmV3LXVwIGJ5IHBhc3NpbmcgaW4gYSBXaWZpQ29uZmlndXJhdGlvbiB3ZSBnYXZlIGl0Ci0gICAgICAgICAgICAvLyBieSBwcmV2ZW50aW5nICIqIiBhcyBhIGtleS4KLSAgICAgICAgICAgIGlmIChjb25maWcucHJlU2hhcmVkS2V5ICE9IG51bGwgJiYgIWNvbmZpZy5wcmVTaGFyZWRLZXkuZXF1YWxzKCIqIikgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ucHNrVmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wcmVTaGFyZWRLZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBwc2s6ICIrY29uZmlnLnByZVNoYXJlZEtleSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbGVhbiBoYXNTZXRLZXkgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChjb25maWcud2VwS2V5cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWcud2VwS2V5cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IGNsaWVudCBzY3Jldy11cCBieSBwYXNzaW5nIGluIGEgV2lmaUNvbmZpZ3VyYXRpb24gd2UgZ2F2ZSBpdAotICAgICAgICAgICAgICAgICAgICAvLyBieSBwcmV2ZW50aW5nICIqIiBhcyBhIGtleS4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy53ZXBLZXlzW2ldICE9IG51bGwgJiYgIWNvbmZpZy53ZXBLZXlzW2ldLmVxdWFscygiKiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ud2VwS2V5VmFyTmFtZXNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBzZXQgd2VwX2tleSIraSsiOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGhhc1NldEtleSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChoYXNTZXRLZXkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi53ZXBUeEtleUlkeFZhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhjb25maWcud2VwVHhLZXlJbmRleCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc2V0IHdlcF90eF9rZXlpZHg6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBUeEtleUluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ucHJpb3JpdHlWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhjb25maWcucHJpb3JpdHkpKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgY29uZmlnLlNTSUQgKyAiOiBmYWlsZWQgdG8gc2V0IHByaW9yaXR5OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgK2NvbmZpZy5wcmlvcml0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNvbmZpZy5oaWRkZW5TU0lEICYmICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLmhpZGRlblNTSURWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhjb25maWcuaGlkZGVuU1NJRCA/IDEgOiAwKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsIGNvbmZpZy5TU0lEICsgIjogZmFpbGVkIHRvIHNldCBoaWRkZW5TU0lEOiAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5oaWRkZW5TU0lEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uLkVudGVycHJpc2VGaWVsZCBmaWVsZAotICAgICAgICAgICAgICAgICAgICA6IGNvbmZpZy5lbnRlcnByaXNlRmllbGRzKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhck5hbWUgPSBmaWVsZC52YXJOYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZmllbGQudmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQgIT0gY29uZmlnLmVhcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUubGVuZ3RoKCkgPT0gMCkgPyAiTlVMTCIgOiBjb252ZXJ0VG9RdW90ZWRTdHJpbmcodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgY29uZmlnLlNTSUQgKyAiOiBmYWlsZWQgdG8gc2V0ICIgKyB2YXJOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ICIgKyB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV0SWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBGb3IgYW4gdXBkYXRlLCBpZiBvbmUgb2YgdGhlIHNldE5ldHdvcmtWYXJpYWJsZSBvcGVyYXRpb25zIGZhaWxzLAotICAgICAgICAgKiB3ZSBtaWdodCB3YW50IHRvIHJvbGwgYmFjayBhbGwgdGhlIGNoYW5nZXMgYWxyZWFkeSBtYWRlLiBCdXQgdGhlCi0gICAgICAgICAqIGNoYW5jZXMgYXJlIHRoYXQgaWYgYW55dGhpbmcgaXMgZ29pbmcgdG8gZ28gd3JvbmcsIGl0J2xsIGhhcHBlbgotICAgICAgICAgKiB0aGUgZmlyc3QgdGltZSB3ZSB0cnkgdG8gc2V0IG9uZSBvZiB0aGUgdmFyaWFibGVzLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKG5ld05ldHdvcmspIHsKLSAgICAgICAgICAgIHJlbW92ZU5ldHdvcmsobmV0SWQpOwotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBhIG5ldHdvcmsgdmFyaWFibGUsIHJlbW92ZWQgbmV0d29yazogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXRJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0FkZE9yVXBkYXRlTmV0d29yayhjb25maWcpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtYWtlU3RyaW5nKEJpdFNldCBzZXQsIFN0cmluZ1tdIHN0cmluZ3MpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgaW50IG5leHRTZXRCaXQgPSAtMTsKLQotICAgICAgICAvKiBNYWtlIHN1cmUgYWxsIHNldCBiaXRzIGFyZSBpbiBbMCwgc3RyaW5ncy5sZW5ndGgpIHRvIGF2b2lkCi0gICAgICAgICAqIGdvaW5nIG91dCBvZiBib3VuZHMgb24gc3RyaW5ncy4gIChTaG91bGRuJ3QgaGFwcGVuLCBidXQuLi4pICovCi0gICAgICAgIHNldCA9IHNldC5nZXQoMCwgc3RyaW5ncy5sZW5ndGgpOwotCi0gICAgICAgIHdoaWxlICgobmV4dFNldEJpdCA9IHNldC5uZXh0U2V0Qml0KG5leHRTZXRCaXQgKyAxKSkgIT0gLTEpIHsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoc3RyaW5nc1tuZXh0U2V0Qml0XS5yZXBsYWNlKCdfJywgJy0nKSkuYXBwZW5kKCcgJyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZW1vdmUgdHJhaWxpbmcgc3BhY2UKLSAgICAgICAgaWYgKHNldC5jYXJkaW5hbGl0eSgpID4gMCkgewotICAgICAgICAgICAgYnVmLnNldExlbmd0aChidWYubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbG9va3VwU3RyaW5nKFN0cmluZyBzdHJpbmcsIFN0cmluZ1tdIHN0cmluZ3MpIHsKLSAgICAgICAgaW50IHNpemUgPSBzdHJpbmdzLmxlbmd0aDsKLQotICAgICAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSgnLScsICdfJyk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICAgICAgICBpZiAoc3RyaW5nLmVxdWFscyhzdHJpbmdzW2ldKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLQotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAvLyBpZiB3ZSBldmVyIGdldCBoZXJlLCB3ZSBzaG91bGQgcHJvYmFibHkgYWRkIHRoZQotICAgICAgICAgICAgLy8gdmFsdWUgdG8gV2lmaUNvbmZpZ3VyYXRpb24gdG8gcmVmbGVjdCB0aGF0IGl0J3MKLSAgICAgICAgICAgIC8vIHN1cHBvcnRlZCBieSB0aGUgV1BBIHN1cHBsaWNhbnQKLSAgICAgICAgICAgIFNsb2cudyhUQUcsICJGYWlsZWQgdG8gbG9vay11cCBhIHN0cmluZzogIiArIHN0cmluZyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyoqCisgICAgIC8qKgogICAgICAqIFNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNyZW1vdmVOZXR3b3JrKGludCl9CiAgICAgICogQHBhcmFtIG5ldElkIHRoZSBpbnRlZ2VyIHRoYXQgaWRlbnRpZmllcyB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uCiAgICAgICogdG8gdGhlIHN1cHBsaWNhbnQKQEAgLTEzMTEsOCArNTg4LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVOZXR3b3JrKGludCBuZXRJZCkgewogICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotCi0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5yZW1vdmVOZXR3b3JrKG5ldElkKTsKKyAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVNYWNoaW5lLnN5bmNSZW1vdmVOZXR3b3JrKG5ldElkKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzMjQsMTQgKzYwMCw3IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlTmV0d29yayhpbnQgbmV0SWQsIGJvb2xlYW4gZGlzYWJsZU90aGVycykgewogICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotCi0gICAgICAgIFN0cmluZyBpZm5hbWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXRJbnRlcmZhY2VOYW1lKCk7Ci0gICAgICAgIE5ldHdvcmtVdGlscy5lbmFibGVJbnRlcmZhY2UoaWZuYW1lKTsKLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBtV2lmaVN0YXRlVHJhY2tlci5lbmFibGVOZXR3b3JrKG5ldElkLCBkaXNhYmxlT3RoZXJzKTsKLSAgICAgICAgaWYgKCFyZXN1bHQpIHsKLSAgICAgICAgICAgIE5ldHdvcmtVdGlscy5kaXNhYmxlSW50ZXJmYWNlKGlmbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVNYWNoaW5lLnN5bmNFbmFibGVOZXR3b3JrKG5ldElkLCBkaXNhYmxlT3RoZXJzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzNDIsOCArNjExLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlTmV0d29yayhpbnQgbmV0SWQpIHsKICAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLQotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIuZGlzYWJsZU5ldHdvcmsobmV0SWQpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0Rpc2FibGVOZXR3b3JrKG5ldElkKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzNTYsNyArNjI0LDcgQEAKICAgICAgICAgICogTWFrZSBzdXJlIHdlIGhhdmUgdGhlIGxhdGVzdCBpbmZvcm1hdGlvbiwgYnkgc2VuZGluZwogICAgICAgICAgKiBhIHN0YXR1cyByZXF1ZXN0IHRvIHRoZSBzdXBwbGljYW50LgogICAgICAgICAgKi8KLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLnJlcXVlc3RDb25uZWN0aW9uSW5mbygpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY1JlcXVlc3RDb25uZWN0aW9uSW5mbygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM2NiwxODAgKzYzNCwxOSBAQAogICAgICAqLwogICAgIHB1YmxpYyBMaXN0PFNjYW5SZXN1bHQ+IGdldFNjYW5SZXN1bHRzKCkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwotICAgICAgICBTdHJpbmcgcmVwbHk7Ci0KLSAgICAgICAgcmVwbHkgPSBtV2lmaVN0YXRlVHJhY2tlci5zY2FuUmVzdWx0cygpOwotICAgICAgICBpZiAocmVwbHkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFNjYW5SZXN1bHQ+IHNjYW5MaXN0ID0gbmV3IEFycmF5TGlzdDxTY2FuUmVzdWx0PigpOwotCi0gICAgICAgIGludCBsaW5lQ291bnQgPSAwOwotCi0gICAgICAgIGludCByZXBseUxlbiA9IHJlcGx5Lmxlbmd0aCgpOwotICAgICAgICAvLyBQYXJzZSB0aGUgcmVzdWx0IHN0cmluZywga2VlcGluZyBpbiBtaW5kIHRoYXQgdGhlIGxhc3QgbGluZSBkb2VzCi0gICAgICAgIC8vIG5vdCBlbmQgd2l0aCBhIG5ld2xpbmUuCi0gICAgICAgIGZvciAoaW50IGxpbmVCZWcgPSAwLCBsaW5lRW5kID0gMDsgbGluZUVuZCA8PSByZXBseUxlbjsgKytsaW5lRW5kKSB7Ci0gICAgICAgICAgICBpZiAobGluZUVuZCA9PSByZXBseUxlbiB8fCByZXBseS5jaGFyQXQobGluZUVuZCkgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICsrbGluZUNvdW50OwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogU2tpcCB0aGUgZmlyc3QgbGluZSwgd2hpY2ggaXMgYSBoZWFkZXIKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAobGluZUNvdW50ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZUJlZyA9IGxpbmVFbmQgKyAxOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmVFbmQgPiBsaW5lQmVnKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gcmVwbHkuc3Vic3RyaW5nKGxpbmVCZWcsIGxpbmVFbmQpOwotICAgICAgICAgICAgICAgICAgICBTY2FuUmVzdWx0IHNjYW5SZXN1bHQgPSBwYXJzZVNjYW5SZXN1bHQobGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2FuUmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5MaXN0LmFkZChzY2FuUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJtaXNmb3JtYXR0ZWQgc2NhbiByZXN1bHQgZm9yOiAiICsgbGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZUJlZyA9IGxpbmVFbmQgKyAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldFNjYW5SZXN1bHRzTGlzdChzY2FuTGlzdCk7Ci0gICAgICAgIHJldHVybiBzY2FuTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSB0aGUgc2NhbiByZXN1bHQgbGluZSBwYXNzZWQgdG8gdXMgYnkgd3BhX3N1cHBsaWNhbnQgKGhlbHBlcikuCi0gICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgdG8gcGFyc2UKLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgU2NhblJlc3VsdH0gb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTY2FuUmVzdWx0IHBhcnNlU2NhblJlc3VsdChTdHJpbmcgbGluZSkgewotICAgICAgICBTY2FuUmVzdWx0IHNjYW5SZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQ2FjaGUgaW1wbGVtZW50YXRpb24gKExpbmtlZEhhc2hNYXApIGlzIG5vdCBzeW5jaHJvbml6ZWQsIHRodXMsCi0gICAgICAgICAgICAgKiBtdXN0IHN5bmNocm9uaXplZCBoZXJlIQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TY2FuUmVzdWx0Q2FjaGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBzY2FuUmVzdWx0UGF0dGVybi5zcGxpdChsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAoMyA8PSByZXN1bHQubGVuZ3RoICYmIHJlc3VsdC5sZW5ndGggPD0gNSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnNzaWQgPSByZXN1bHRbMF07Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJzc2lkIHwgZnJlcXVlbmN5IHwgbGV2ZWwgfCBmbGFncyB8IHNzaWQKLSAgICAgICAgICAgICAgICAgICAgaW50IGZyZXF1ZW5jeTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gSW50ZWdlci5wYXJzZUludChyZXN1bHRbMV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3VsdFsyXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBzb21lIGltcGxlbWVudGF0aW9ucyBhdm9pZCBuZWdhdGl2ZSB2YWx1ZXMgYnkgYWRkaW5nIDI1NgotICAgICAgICAgICAgICAgICAgICAgICAgICogc28gd2UgbmVlZCB0byBhZGp1c3QgZm9yIHRoYXQgaGVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID4gMCkgbGV2ZWwgLT0gMjU2OwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIFRoZSBmb3JtYXR0aW5nIG9mIHRoZSByZXN1bHRzIHJldHVybmVkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAqIHdwYV9zdXBwbGljYW50IGlzIGludGVuZGVkIHRvIG1ha2UgdGhlIGZpZWxkcwotICAgICAgICAgICAgICAgICAgICAgKiBsaW5lIHVwIG5pY2VseSB3aGVuIHByaW50ZWQsCi0gICAgICAgICAgICAgICAgICAgICAqIG5vdCB0byBtYWtlIHRoZW0gZWFzeSB0byBwYXJzZS4gU28gd2UgaGF2ZSB0bwotICAgICAgICAgICAgICAgICAgICAgKiBhcHBseSBzb21lIGhldXJpc3RpY3MgdG8gZmlndXJlIG91dCB3aGljaCBmaWVsZAotICAgICAgICAgICAgICAgICAgICAgKiBpcyB0aGUgU1NJRCBhbmQgd2hpY2ggZmllbGQgaXMgdGhlIGZsYWdzLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNzaWQ7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmbGFnczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdFszXS5jaGFyQXQoMCkgPT0gJ1snKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZXN1bHRbM107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaWQgPSByZXN1bHRbM107Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0Lmxlbmd0aCA9PSA1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlc3VsdFszXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNzaWQgPSByZXN1bHRbNF07Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBIZXJlLCB3ZSBtdXN0IGhhdmUgMyBmaWVsZHM6IG5vIGZsYWdzIGFuZCBzc2lkCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzc2lkID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBic3NpZCArIHNzaWQgaXMgdGhlIGhhc2gga2V5Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBic3NpZCArIHNzaWQ7Ci0gICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQgPSBtU2NhblJlc3VsdENhY2hlLmdldChrZXkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2NhblJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0LmxldmVsID0gbGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0LlNTSUQgPSBzc2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdC5jYXBhYmlsaXRpZXMgPSBmbGFnczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQuZnJlcXVlbmN5ID0gZnJlcXVlbmN5OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGFkZCBzY2FuIHJlc3VsdHMgdGhhdCBoYXZlIG5vIFNTSUQgc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA8IHNzaWQudHJpbSgpLmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTY2FuUmVzdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCwgYnNzaWQsIGZsYWdzLCBsZXZlbCwgZnJlcXVlbmN5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2NhblJlc3VsdENhY2hlLnB1dChrZXksIHNjYW5SZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIk1pc2Zvcm1hdHRlZCBzY2FuIHJlc3VsdCB0ZXh0IHdpdGggIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5sZW5ndGggKyAiIGZpZWxkczogIiArIGxpbmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzY2FuUmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSAiZmxhZ3MiIGZpZWxkIHBhc3NlZCBiYWNrIGluIGEgc2NhbiByZXN1bHQgYnkgd3BhX3N1cHBsaWNhbnQsCi0gICAgICogYW5kIGNvbnN0cnVjdCBhIHtAY29kZSBXaWZpQ29uZmlndXJhdGlvbn0gdGhhdCBkZXNjcmliZXMgdGhlIGVuY3J5cHRpb24sCi0gICAgICoga2V5IG1hbmFnZW1lbnQsIGFuZCBhdXRoZW50aWNhaW9uIGNhcGFiaWxpdGllcyBvZiB0aGUgYWNjZXNzIHBvaW50LgotICAgICAqIEBwYXJhbSBmbGFncyB0aGUgc3RyaW5nIHJldHVybmVkIGJ5IHdwYV9zdXBwbGljYW50Ci0gICAgICogQHJldHVybiB0aGUge0BsaW5rIFdpZmlDb25maWd1cmF0aW9ufSBvYmplY3QsIGZpbGxlZCBpbgotICAgICAqLwotICAgIFdpZmlDb25maWd1cmF0aW9uIHBhcnNlU2NhbkZsYWdzKFN0cmluZyBmbGFncykgewotICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICBpZiAoZmxhZ3MubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LnNldChXaWZpQ29uZmlndXJhdGlvbi5LZXlNZ210Lk5PTkUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIC4uLiB0byBiZSBpbXBsZW1lbnRlZAotICAgICAgICByZXR1cm4gY29uZmlnOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0dldFNjYW5SZXN1bHRzTGlzdCgpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFRlbGwgdGhlIHN1cHBsaWNhbnQgdG8gcGVyc2lzdCB0aGUgY3VycmVudCBsaXN0IG9mIGNvbmZpZ3VyZWQgbmV0d29ya3MuCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQKKyAgICAgKgorICAgICAqIFRPRE86IGRlcHJlY2F0ZSB0aGlzCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc2F2ZUNvbmZpZ3VyYXRpb24oKSB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0OworICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtV2lmaVN0YXRlVHJhY2tlcikgewotICAgICAgICAgICAgcmVzdWx0ID0gbVdpZmlTdGF0ZVRyYWNrZXIuc2F2ZUNvbmZpZygpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiBtTmVlZFJlY29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgbU5lZWRSZWNvbmZpZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1XaWZpU3RhdGVUcmFja2VyLnJlbG9hZENvbmZpZygpOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5ORVRXT1JLX0lEU19DSEFOR0VEX0FDVElPTik7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSW5mb3JtIHRoZSBiYWNrdXAgbWFuYWdlciBhYm91dCBhIGRhdGEgY2hhbmdlCi0gICAgICAgIElCYWNrdXBNYW5hZ2VyIGlibSA9IElCYWNrdXBNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoCi0gICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LkJBQ0tVUF9TRVJWSUNFKSk7Ci0gICAgICAgIGlmIChpYm0gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpYm0uZGF0YUNoYW5nZWQoImNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncyIpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUcnkgYWdhaW4gbGF0ZXIKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY1NhdmVDb25maWcoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE1NTQsNyArNjYxLDcgQEAKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZSwgZS5nLiwKICAgICAgKiB7QGNvZGUgbnVtQ2hhbm5lbHN9IGlzIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlLgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNldE51bUFsbG93ZWRDaGFubmVscyhpbnQgbnVtQ2hhbm5lbHMsIGJvb2xlYW4gcGVyc2lzdCkgeworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXROdW1BbGxvd2VkQ2hhbm5lbHMoaW50IG51bUNoYW5uZWxzLCBib29sZWFuIHBlcnNpc3QpIHsKICAgICAgICAgU2xvZy5pKFRBRywgIldpZmlTZXJ2aWNlIHRyeWluZyB0byBzZXROdW1BbGxvd2VkIHRvICIrbnVtQ2hhbm5lbHMrCiAgICAgICAgICAgICAgICAgIiB3aXRoIHBlcnNpc3Qgc2V0IHRvICIrcGVyc2lzdCk7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CkBAIC0xNTc2LDI4ICs2ODMsMTUgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtV2lmaUhhbmRsZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XaWZpSGFuZGxlciwKLSAgICAgICAgICAgICAgICBNRVNTQUdFX1NFVF9DSEFOTkVMUywgbnVtQ2hhbm5lbHMsIChwZXJzaXN0ID8gMSA6IDApKS5zZW5kVG9UYXJnZXQoKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXRzIHRoZSBudW1iZXIgb2YgYWxsb3dlZCByYWRpbyBmcmVxdWVuY3kgY2hhbm5lbHMgc3luY2hyb25vdXNseQotICAgICAqIEBwYXJhbSBudW1DaGFubmVscyB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgY2hhbm5lbHMuIE11c3QgYmUgZ3JlYXRlciB0aGFuIDAKLSAgICAgKiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE2LgotICAgICAqIEBwYXJhbSBwZXJzaXN0IHtAY29kZSB0cnVlfSBpZiB0aGUgc2V0dGluZyBzaG91bGQgYmUgcmVtZW1iZXJlZC4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXROdW1BbGxvd2VkQ2hhbm5lbHNCbG9ja2luZyhpbnQgbnVtQ2hhbm5lbHMsIGJvb2xlYW4gcGVyc2lzdCkgewogICAgICAgICBpZiAocGVyc2lzdCkgewogICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTlVNX0FMTE9XRURfQ0hBTk5FTFMsCiAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TnVtQWxsb3dlZENoYW5uZWxzKG51bUNoYW5uZWxzKTsKKworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXROdW1BbGxvd2VkQ2hhbm5lbHMobnVtQ2hhbm5lbHMpOworCisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTYxNSw3ICs3MDksNyBAQAogICAgICAgICAgKiBXaS1GaSBpcyBub3QgY3VycmVudGx5IGVuYWJsZWQpLCBnZXQgdGhlIHZhbHVlIGZyb20KICAgICAgICAgICogU2V0dGluZ3MuCiAgICAgICAgICAqLwotICAgICAgICBudW1DaGFubmVscyA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE51bUFsbG93ZWRDaGFubmVscygpOworICAgICAgICBudW1DaGFubmVscyA9IG1XaWZpU3RhdGVNYWNoaW5lLmdldE51bUFsbG93ZWRDaGFubmVscygpOwogICAgICAgICBpZiAobnVtQ2hhbm5lbHMgPCAwKSB7CiAgICAgICAgICAgICBudW1DaGFubmVscyA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCiAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX05VTV9BTExPV0VEX0NIQU5ORUxTLApAQCAtMTY0MSw3ICs3MzUsODYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgRGhjcEluZm8gZ2V0RGhjcEluZm8oKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5nZXREaGNwSW5mbygpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0dldERoY3BJbmZvKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3N0YXJ0V2lmaX0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0V2lmaSgpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgLyogVE9ETzogbWF5IGJlIGFkZCBwZXJtaXNzaW9ucyBmb3IgYWNjZXNzIG9ubHkgdG8gY29ubmVjdGl2aXR5IHNlcnZpY2UKKyAgICAgICAgICogVE9ETzogaWYgYSBzdGFydCBpc3N1ZWQsIGtlZXAgd2lmaSBhbGl2ZSB1bnRpbCBhIHN0b3AgaXNzdWVkIGlycmVzcGVjdGl2ZQorICAgICAgICAgKiBvZiBXaWZpTG9jayAmIGRldmljZSBpZGxlIHN0YXR1cyB1bmxlc3Mgd2lmaSBlbmFibGVkIHN0YXR1cyBpcyB0b2dnbGVkCisgICAgICAgICAqLworCisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldERyaXZlclN0YXJ0KHRydWUpOworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5yZWNvbm5lY3RDb21tYW5kKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3N0b3BXaWZpfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcFdpZmkoKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIC8qIFRPRE86IG1heSBiZSBhZGQgcGVybWlzc2lvbnMgZm9yIGFjY2VzcyBvbmx5IHRvIGNvbm5lY3Rpdml0eSBzZXJ2aWNlCisgICAgICAgICAqIFRPRE86IGlmIGEgc3RvcCBpcyBpc3N1ZWQsIHdpZmkgaXMgYnJvdWdodCB1cCBvbmx5IGJ5IHN0YXJ0V2lmaQorICAgICAgICAgKiB1bmxlc3Mgd2lmaSBlbmFibGVkIHN0YXR1cyBpcyB0b2dnbGVkCisgICAgICAgICAqLworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXREcml2ZXJTdGFydChmYWxzZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjYWRkVG9CbGFja2xpc3R9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUb0JsYWNrbGlzdChTdHJpbmcgYnNzaWQpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5hZGRUb0JsYWNrbGlzdChic3NpZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI2NsZWFyQmxhY2tsaXN0fQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJCbGFja2xpc3QoKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuY2xlYXJCbGFja2xpc3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0TmV0d29ya1dpdGhJZChpbnQgbmV0d29ya0lkKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmNvbm5lY3ROZXR3b3JrKG5ldHdvcmtJZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29ubmVjdE5ldHdvcmtXaXRoQ29uZmlnKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5jb25uZWN0TmV0d29yayhjb25maWcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNhdmVOZXR3b3JrKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zYXZlTmV0d29yayhjb25maWcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZvcmdldE5ldHdvcmsoaW50IG5ldElkKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmZvcmdldE5ldHdvcmsobmV0SWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0V3BzUGJjKFN0cmluZyBic3NpZCkgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zdGFydFdwc1BiYyhic3NpZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnRXcHNQaW4oU3RyaW5nIGJzc2lkLCBpbnQgYXBQaW4pIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc3RhcnRXcHNQaW4oYnNzaWQsIGFwUGluKTsKICAgICB9CiAKICAgICBwcml2YXRlIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG1SZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKQEAgLTE2NjMsMTcgKzgzNiwxMSBAQAogICAgICAgICAgICAgICAgIC8vIE9uY2UgdGhlIHNjcmVlbiBpcyBvbiwgd2UgYXJlIG5vdCBrZWVwaW5nIFdJRkkgcnVubmluZwogICAgICAgICAgICAgICAgIC8vIGJlY2F1c2Ugb2YgYW55IGxvY2tzIHNvIGNsZWFyIHRoYXQgdHJhY2tpbmcgaW1tZWRpYXRlbHkuCiAgICAgICAgICAgICAgICAgcmVwb3J0U3RhcnRXb3JrU291cmNlKCk7Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuZW5hYmxlUnNzaVBvbGxpbmcodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgLyogREhDUCBvciBvdGhlciB0ZW1wb3JhcnkgZmFpbHVyZXMgaW4gdGhlIHBhc3QgY2FuIHByZXZlbnQKLSAgICAgICAgICAgICAgICAgKiBhIGRpc2FibGVkIG5ldHdvcmsgZnJvbSBiZWluZyBjb25uZWN0ZWQgdG8sIGVuYWJsZSBvbiBzY3JlZW4gb24KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAobVdpZmlTdGF0ZVRyYWNrZXIuaXNBbnlOZXR3b3JrRGlzYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBzZW5kRW5hYmxlTmV0d29ya3NNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmVuYWJsZVJzc2lQb2xsaW5nKHRydWUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEludGVudC5BQ1RJT05fU0NSRUVOX09GRikpIHsKICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiQUNUSU9OX1NDUkVFTl9PRkYiKTsKICAgICAgICAgICAgICAgICBtU2NyZWVuT2ZmID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5lbmFibGVSc3NpUG9sbGluZyhmYWxzZSk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuZW5hYmxlUnNzaVBvbGxpbmcoZmFsc2UpOwogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogU2V0IGEgdGltZXIgdG8gcHV0IFdpLUZpIHRvIHNsZWVwLCBidXQgb25seSBpZiB0aGUgc2NyZWVuIGlzIG9mZgogICAgICAgICAgICAgICAgICAqIEFORCB0aGUgInN0YXkgb24gd2hpbGUgcGx1Z2dlZCBpbiIgc2V0dGluZyBkb2Vzbid0IG1hdGNoIHRoZQpAQCAtMTY4MSwxMSArODQ4LDExIEBACiAgICAgICAgICAgICAgICAgICogb3IgcGx1Z2dlZCBpbiB0byBBQykuCiAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgaWYgKCFzaG91bGRXaWZpU3RheUF3YWtlKHN0YXlBd2FrZUNvbmRpdGlvbnMsIG1QbHVnZ2VkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgV2lmaUluZm8gaW5mbyA9IG1XaWZpU3RhdGVUcmFja2VyLnJlcXVlc3RDb25uZWN0aW9uSW5mbygpOworICAgICAgICAgICAgICAgICAgICBXaWZpSW5mbyBpbmZvID0gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY1JlcXVlc3RDb25uZWN0aW9uSW5mbygpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSAhPSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2VkIHRvIGdvIHRvIHNsZWVwIGltbWVkaWF0ZWx5LCBidXQgdGhpcyBjYXVzZWQgc29tZSByYWNlIGNvbmRpdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgdGltZSB0byB0cmFjayBkb3duIGZvciB0aGlzIHJlbGVhc2UuICBEZWxheSBpbnN0ZWFkLCBidXQgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBsb25nIGFzIHdlIHdvdWxkIGlmIGNvbm5lY3RlZCAoYmVsb3cpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIHRpbWUgdG8gdHJhY2sgZG93biBmb3IgdGhpcyByZWxlYXNlLiAgRGVsYXkgaW5zdGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBub3QgYXMgbG9uZyBhcyB3ZSB3b3VsZCBpZiBjb25uZWN0ZWQgKGJlbG93KQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIGZpeCB0aGUgcmFjZSBjb25kaXRpb25zIGFuZCBzd2l0Y2ggYmFjayB0byB0aGUgaW1tZWRpYXRlIHR1cm4tb2ZmCiAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHRyaWdnZXJUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAoMio2MCoxMDAwKTsgLy8gMiBtaW4KICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJzZXR0aW5nIEFDVElPTl9ERVZJQ0VfSURMRSB0aW1lciBmb3IgMTIwLDAwMCBtcyIpOwpAQCAtMTcxNCw3ICs4ODEsNiBAQAogICAgICAgICAgICAgICAgICAqIHRoZSBhbHJlYWR5LXNldCB0aW1lci4KICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBpbnQgcGx1Z2dlZFR5cGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoInBsdWdnZWQiLCAwKTsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiQUNUSU9OX0JBVFRFUllfQ0hBTkdFRCBwbHVnZ2VkVHlwZTogIiArIHBsdWdnZWRUeXBlKTsKICAgICAgICAgICAgICAgICBpZiAobVNjcmVlbk9mZiAmJiBzaG91bGRXaWZpU3RheUF3YWtlKHN0YXlBd2FrZUNvbmRpdGlvbnMsIG1QbHVnZ2VkVHlwZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICFzaG91bGRXaWZpU3RheUF3YWtlKHN0YXlBd2FrZUNvbmRpdGlvbnMsIHBsdWdnZWRUeXBlKSkgewogICAgICAgICAgICAgICAgICAgICBsb25nIHRyaWdnZXJUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBpZGxlTWlsbGlzOwpAQCAtMTcyNCwxNyArODkwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVBsdWdnZWRUeXBlID0gcGx1Z2dlZFR5cGU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoQTJkcC5BQ1RJT05fU0lOS19TVEFURV9DSEFOR0VEKSkgewotICAgICAgICAgICAgICAgIEJsdWV0b290aEEyZHAgYTJkcCA9IG5ldyBCbHVldG9vdGhBMmRwKG1Db250ZXh0KTsKLSAgICAgICAgICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBzaW5rcyA9IGEyZHAuZ2V0Q29ubmVjdGVkU2lua3MoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzQmx1ZXRvb3RoUGxheWluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIHNpbmsgOiBzaW5rcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoYTJkcC5nZXRTaW5rU3RhdGUoc2luaykgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc0JsdWV0b290aFBsYXlpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldEJsdWV0b290aFNjYW5Nb2RlKGlzQmx1ZXRvb3RoUGxheWluZyk7Ci0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhCbHVldG9vdGhBMmRwLkFDVElPTl9QTEFZSU5HX1NUQVRFX0NIQU5HRUQpKSB7CisgICAgICAgICAgICAgICAgaW50IHN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aFByb2ZpbGUuRVhUUkFfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aEEyZHAuU1RBVEVfTk9UX1BMQVlJTkcpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldEJsdWV0b290aFNjYW5Nb2RlKHN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORyk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTE3NzIsNyArOTMxLDcgQEAKICAgICAgICAgICogb2Yge0Bjb2RlIDB9IGlzbid0IHJlYWxseSBhIHBsdWdnZWQgdHlwZSwgYnV0IHJhdGhlciBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlCiAgICAgICAgICAqIGRldmljZSBpc24ndCBwbHVnZ2VkIGluIGF0IGFsbCwgdGhlcmUgaXMgbm8gYml0IHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYQogICAgICAgICAgKiB7QGNvZGUgcGx1Z2dlZFR5cGV9IHZhbHVlIG9mIHtAY29kZSAwfS4gVGhhdCBpcyB3aHkgd2Ugc2hpZnQgYnkKLSAgICAgICAgICoge0Bjb2RlIHBsdWdnZWRUeXBlJm5ic3A7JiM4MjEyOyZuYnNwOzF9IGluc3RlYWQgb2YgYnkge0Bjb2RlIHBsdWdnZWRUeXBlfS4KKyAgICAgICAgICoge0Bjb2RlIHBsdWdnZWRUeXBlIC0gMX0gaW5zdGVhZCBvZiBieSB7QGNvZGUgcGx1Z2dlZFR5cGV9LgogICAgICAgICAgKiBAcGFyYW0gc3RheUF3YWtlQ29uZGl0aW9ucyBhIGJpdCBzdHJpbmcgc3BlY2lmeWluZyB3aGljaCAicGx1Z2dlZCB0eXBlcyIgc2hvdWxkCiAgICAgICAgICAqIGtlZXAgdGhlIGRldmljZSAoYW5kIGhlbmNlIFdpLUZpKSBhd2FrZS4KICAgICAgICAgICogQHBhcmFtIHBsdWdnZWRUeXBlIHRoZSB0eXBlIG9mIHBsdWcgKFVTQiwgQUMsIG9yIG5vbmUpIGZvciB3aGljaCB0aGUgY2hlY2sgaXMKQEAgLTE3ODUsMTAzICs5NDQsNDcgQEAKICAgICAgICAgfQogICAgIH07CiAKLSAgICBwcml2YXRlIHZvaWQgc2VuZEVuYWJsZU1lc3NhZ2UoYm9vbGVhbiBlbmFibGUsIGJvb2xlYW4gcGVyc2lzdCwgaW50IHVpZCkgewotICAgICAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKG1XaWZpSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW5hYmxlID8gTUVTU0FHRV9FTkFCTEVfV0lGSSA6IE1FU1NBR0VfRElTQUJMRV9XSUZJKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGVyc2lzdCA/IDEgOiAwKSwgdWlkKTsKLSAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kU3RhcnRNZXNzYWdlKGludCBsb2NrTW9kZSkgewotICAgICAgICBNZXNzYWdlLm9idGFpbihtV2lmaUhhbmRsZXIsIE1FU1NBR0VfU1RBUlRfV0lGSSwgbG9ja01vZGUsIDApLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kQWNjZXNzUG9pbnRNZXNzYWdlKGJvb2xlYW4gZW5hYmxlLCBXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnLCBpbnQgdWlkKSB7Ci0gICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XaWZpSGFuZGxlciwKLSAgICAgICAgICAgICAgICAoZW5hYmxlID8gTUVTU0FHRV9TVEFSVF9BQ0NFU1NfUE9JTlQgOiBNRVNTQUdFX1NUT1BfQUNDRVNTX1BPSU5UKSwKLSAgICAgICAgICAgICAgICB1aWQsIDAsIHdpZmlDb25maWcpLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kRW5hYmxlTmV0d29ya3NNZXNzYWdlKCkgewotICAgICAgICBNZXNzYWdlLm9idGFpbihtV2lmaUhhbmRsZXIsIE1FU1NBR0VfRU5BQkxFX05FVFdPUktTKS5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVwb3J0U3RhcnRXb3JrU291cmNlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaWZpU3RhdGVUcmFja2VyKSB7Ci0gICAgICAgICAgICBtVG1wV29ya1NvdXJjZS5jbGVhcigpOwotICAgICAgICAgICAgaWYgKG1EZXZpY2VJZGxlKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1Mb2Nrcy5tTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtVG1wV29ya1NvdXJjZS5hZGQobUxvY2tzLm1MaXN0LmdldChpKS5tV29ya1NvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVwb3J0U3RhcnRXb3JrU291cmNlKCkgeworICAgICAgICBtVG1wV29ya1NvdXJjZS5jbGVhcigpOworICAgICAgICBpZiAobURldmljZUlkbGUpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtTG9ja3MubUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtVG1wV29ya1NvdXJjZS5hZGQobUxvY2tzLm1MaXN0LmdldChpKS5tV29ya1NvdXJjZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci51cGRhdGVCYXR0ZXJ5V29ya1NvdXJjZUxvY2tlZChtVG1wV29ya1NvdXJjZSk7Ci0gICAgICAgICAgICBzV2FrZUxvY2suc2V0V29ya1NvdXJjZShtVG1wV29ya1NvdXJjZSk7CiAgICAgICAgIH0KKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUudXBkYXRlQmF0dGVyeVdvcmtTb3VyY2UobVRtcFdvcmtTb3VyY2UpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVXaWZpU3RhdGUoKSB7Ci0gICAgICAgIC8vIHNlbmQgYSBtZXNzYWdlIHNvIGl0J3MgYWxsIHNlcmlhbGl6ZWQKLSAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdpZmlIYW5kbGVyLCBNRVNTQUdFX1VQREFURV9TVEFURSwgMCwgMCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvVXBkYXRlV2lmaVN0YXRlKCkgewogICAgICAgICBib29sZWFuIHdpZmlFbmFibGVkID0gZ2V0UGVyc2lzdGVkV2lmaUVuYWJsZWQoKTsKLSAgICAgICAgYm9vbGVhbiBhaXJwbGFuZU1vZGUgPSBpc0FpcnBsYW5lTW9kZU9uKCkgJiYgIW1BaXJwbGFuZU1vZGVPdmVyd3JpZGRlbjsKLQotICAgICAgICBib29sZWFuIGxvY2tIZWxkOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrcykgewotICAgICAgICAgICAgbG9ja0hlbGQgPSBtTG9ja3MuaGFzTG9ja3MoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzdHJvbmdlc3RMb2NrTW9kZSA9IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMOworICAgICAgICBib29sZWFuIGFpcnBsYW5lTW9kZSA9IGlzQWlycGxhbmVNb2RlT24oKSAmJiAhbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuLmdldCgpOworICAgICAgICBib29sZWFuIGxvY2tIZWxkID0gbUxvY2tzLmhhc0xvY2tzKCk7CisgICAgICAgIGludCBzdHJvbmdlc3RMb2NrTW9kZTsKICAgICAgICAgYm9vbGVhbiB3aWZpU2hvdWxkQmVFbmFibGVkID0gd2lmaUVuYWJsZWQgJiYgIWFpcnBsYW5lTW9kZTsKICAgICAgICAgYm9vbGVhbiB3aWZpU2hvdWxkQmVTdGFydGVkID0gIW1EZXZpY2VJZGxlIHx8IGxvY2tIZWxkOwotCi0gICAgICAgIGlmIChsb2NrSGVsZCkgeworICAgICAgICBpZiAobURldmljZUlkbGUgJiYgbG9ja0hlbGQpIHsKICAgICAgICAgICAgIHN0cm9uZ2VzdExvY2tNb2RlID0gbUxvY2tzLmdldFN0cm9uZ2VzdExvY2tNb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogSWYgZGV2aWNlIGlzIG5vdCBpZGxlLCBsb2NrbW9kZSBjYW5ub3QgYmUgc2NhbiBvbmx5ICovCi0gICAgICAgIGlmICghbURldmljZUlkbGUgJiYgc3Ryb25nZXN0TG9ja01vZGUgPT0gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX1NDQU5fT05MWSkgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3Ryb25nZXN0TG9ja01vZGUgPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTDsKICAgICAgICAgfQogCi0gICAgICAgIHN5bmNocm9uaXplZCAobVdpZmlIYW5kbGVyKSB7Ci0gICAgICAgICAgICBpZiAoKG1XaWZpU3RhdGVUcmFja2VyLmdldFdpZmlTdGF0ZSgpID09IFdJRklfU1RBVEVfRU5BQkxJTkcpICYmICFhaXJwbGFuZU1vZGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9CisgICAgICAgIC8qIERpc2FibGUgdGV0aGVyaW5nIHdoZW4gYWlycGxhbmUgbW9kZSBpcyBlbmFibGVkICovCisgICAgICAgIGlmIChhaXJwbGFuZU1vZGUpIHsKKyAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldFdpZmlBcEVuYWJsZWQobnVsbCwgZmFsc2UpOworICAgICAgICB9CiAKLSAgICAgICAgICAgIC8qIERpc2FibGUgdGV0aGVyaW5nIHdoZW4gYWlycGxhbmUgbW9kZSBpcyBlbmFibGVkICovCi0gICAgICAgICAgICBpZiAoYWlycGxhbmVNb2RlICYmCi0gICAgICAgICAgICAgICAgKG1XaWZpQXBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0VOQUJMSU5HIHx8IG1XaWZpQXBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0VOQUJMRUQpKSB7Ci0gICAgICAgICAgICAgICAgc1dha2VMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICBzZW5kQWNjZXNzUG9pbnRNZXNzYWdlKGZhbHNlLCBudWxsLCBtTGFzdEFwRW5hYmxlVWlkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHdpZmlTaG91bGRCZUVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAod2lmaVNob3VsZEJlU3RhcnRlZCkgewotICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgICAgICBzZW5kRW5hYmxlTWVzc2FnZSh0cnVlLCBmYWxzZSwgbUxhc3RFbmFibGVVaWQpOwotICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgICAgICBzZW5kU3RhcnRNZXNzYWdlKHN0cm9uZ2VzdExvY2tNb2RlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5pc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgd2FrZUxvY2tUaW1lb3V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9NT0JJTEVfREFUQV9UUkFOU0lUSU9OX1dBS0VMT0NLX1RJTUVPVVRfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1dBS0VMT0NLX1RJTUVPVVQpOwotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBXZSBhcmUgYXNzdW1pbmcgdGhhdCBDb25uZWN0aXZpdHlTZXJ2aWNlIGNhbiBtYWtlCi0gICAgICAgICAgICAgICAgICAgICAqIGEgdHJhbnNpdGlvbiB0byBjZWxsdWxhciBkYXRhIHdpdGhpbiB3YWtlTG9ja1RpbWVvdXQgdGltZS4KLSAgICAgICAgICAgICAgICAgICAgICogVGhlIHdha2Vsb2NrIGlzIHJlbGVhc2VkIGJ5IHRoZSBkZWxheWVkIG1lc3NhZ2UuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBzRHJpdmVyU3RvcFdha2VMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTUVTU0FHRV9TVE9QX1dJRkkpOwotICAgICAgICAgICAgICAgICAgICBtV2lmaUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoTUVTU0FHRV9SRUxFQVNFX1dBS0VMT0NLLCB3YWtlTG9ja1RpbWVvdXQpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHdpZmlTaG91bGRCZUVuYWJsZWQpIHsKKyAgICAgICAgICAgIGlmICh3aWZpU2hvdWxkQmVTdGFydGVkKSB7CisgICAgICAgICAgICAgICAgcmVwb3J0U3RhcnRXb3JrU291cmNlKCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0V2lmaUVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0U2Nhbk9ubHlNb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb25nZXN0TG9ja01vZGUgPT0gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX1NDQU5fT05MWSk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0RHJpdmVyU3RhcnQodHJ1ZSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNXYWtlTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgc2VuZEVuYWJsZU1lc3NhZ2UoZmFsc2UsIGZhbHNlLCBtTGFzdEVuYWJsZVVpZCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUucmVxdWVzdENtV2FrZUxvY2soKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXREcml2ZXJTdGFydChmYWxzZSk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXRXaWZpRW5hYmxlZChmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE4OTEsNyArOTk0LDcgQEAKICAgICAgICAgaW50ZW50RmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1NDUkVFTl9PRkYpOwogICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fQkFUVEVSWV9DSEFOR0VEKTsKICAgICAgICAgaW50ZW50RmlsdGVyLmFkZEFjdGlvbihBQ1RJT05fREVWSUNFX0lETEUpOwotICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEEyZHAuQUNUSU9OX1NJTktfU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgIGludGVudEZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoQTJkcC5BQ1RJT05fUExBWUlOR19TVEFURV9DSEFOR0VEKTsKICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGludGVudEZpbHRlcik7CiAgICAgfQogCkBAIC0xOTE5LDk3ICsxMDIyLDYgQEAKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uQUlSUExBTkVfTU9ERV9PTiwgMCkgPT0gMTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBIYW5kbGVyIHRoYXQgYWxsb3dzIHBvc3RpbmcgdG8gdGhlIFdpZmlUaHJlYWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBXaWZpSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBwdWJsaWMgV2lmaUhhbmRsZXIoTG9vcGVyIGxvb3BlcikgewotICAgICAgICAgICAgc3VwZXIobG9vcGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfRU5BQkxFX1dJRkk6Ci0gICAgICAgICAgICAgICAgICAgIHNldFdpZmlFbmFibGVkQmxvY2tpbmcodHJ1ZSwgbXNnLmFyZzEgPT0gMSwgbXNnLmFyZzIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobVdpZmlXYXRjaGRvZ1NlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVdpZmlXYXRjaGRvZ1NlcnZpY2UgPSBuZXcgV2lmaVdhdGNoZG9nU2VydmljZShtQ29udGV4dCwgbVdpZmlTdGF0ZVRyYWNrZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1NUQVJUX1dJRkk6Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydFN0YXJ0V29ya1NvdXJjZSgpOwotICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5zZXRTY2FuT25seU1vZGUobXNnLmFyZzEgPT0gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX1NDQU5fT05MWSk7Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnJlc3RhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0SGlnaFBlcmZNb2RlKG1zZy5hcmcxID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTExfSElHSF9QRVJGKTsKLSAgICAgICAgICAgICAgICAgICAgc1dha2VMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfVVBEQVRFX1NUQVRFOgotICAgICAgICAgICAgICAgICAgICBkb1VwZGF0ZVdpZmlTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9ESVNBQkxFX1dJRkk6Ci0gICAgICAgICAgICAgICAgICAgIC8vIGEgbm9uLXplcm8gbXNnLmFyZzEgdmFsdWUgbWVhbnMgdGhlICJlbmFibGVkIiBzZXR0aW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBwZXJzaXN0ZWQKLSAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUVuYWJsZWRCbG9ja2luZyhmYWxzZSwgbXNnLmFyZzEgPT0gMSwgbXNnLmFyZzIpOwotICAgICAgICAgICAgICAgICAgICBtV2lmaVdhdGNoZG9nU2VydmljZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1NUT1BfV0lGSToKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuZGlzY29ubmVjdEFuZFN0b3AoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgcmVsZWFzZSB3YWtlbG9jawotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9SRUxFQVNFX1dBS0VMT0NLOgotICAgICAgICAgICAgICAgICAgICBzRHJpdmVyU3RvcFdha2VMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfU1RBUlRfQUNDRVNTX1BPSU5UOgotICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkQmxvY2tpbmcodHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5hcmcxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdpZmlDb25maWd1cmF0aW9uKSBtc2cub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgc1dha2VMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfU1RPUF9BQ0NFU1NfUE9JTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWRCbG9ja2luZyhmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5hcmcxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdpZmlDb25maWd1cmF0aW9uKSBtc2cub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgc1dha2VMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfU0VUX0NIQU5ORUxTOgotICAgICAgICAgICAgICAgICAgICBzZXROdW1BbGxvd2VkQ2hhbm5lbHNCbG9ja2luZyhtc2cuYXJnMSwgbXNnLmFyZzIgPT0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX0VOQUJMRV9ORVRXT1JLUzoKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuZW5hYmxlQWxsTmV0d29ya3MoZ2V0Q29uZmlndXJlZE5ldHdvcmtzKCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9TVEFSVF9TQ0FOOgotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZvcmNlQWN0aXZlID0gKG1zZy5hcmcxID09IDEpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1XaWZpU3RhdGVUcmFja2VyLmdldFN1cHBsaWNhbnRTdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSU5BQ1RJVkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNDQU5OSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBET1JNQU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5zZXRTY2FuUmVzdWx0SGFuZGxpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpU3RhdGVUcmFja2VyLlNVUFBMX1NDQU5fSEFORExJTkdfTElTVF9PTkxZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5zY2FuKGZvcmNlQWN0aXZlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdywgU3RyaW5nW10gYXJncykgewogICAgICAgICBpZiAobUNvbnRleHQuY2hlY2tDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uRFVNUCkKQEAgLTIwMTksMTcgKzEwMzEsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHB3LnByaW50bG4oIldpLUZpIGlzICIgKyBzdGF0ZU5hbWUobVdpZmlTdGF0ZVRyYWNrZXIuZ2V0V2lmaVN0YXRlKCkpKTsKKyAgICAgICAgcHcucHJpbnRsbigiV2ktRmkgaXMgIiArIG1XaWZpU3RhdGVNYWNoaW5lLnN5bmNHZXRXaWZpU3RhdGVCeU5hbWUoKSk7CiAgICAgICAgIHB3LnByaW50bG4oIlN0YXktYXdha2UgY29uZGl0aW9uczogIiArCiAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5TVEFZX09OX1dISUxFX1BMVUdHRURfSU4sIDApKTsKICAgICAgICAgcHcucHJpbnRsbigpOwogCiAgICAgICAgIHB3LnByaW50bG4oIkludGVybmFsIHN0YXRlOiIpOwotICAgICAgICBwdy5wcmludGxuKG1XaWZpU3RhdGVUcmFja2VyKTsKKyAgICAgICAgcHcucHJpbnRsbihtV2lmaVN0YXRlTWFjaGluZSk7CiAgICAgICAgIHB3LnByaW50bG4oKTsKICAgICAgICAgcHcucHJpbnRsbigiTGF0ZXN0IHNjYW4gcmVzdWx0czoiKTsKLSAgICAgICAgTGlzdDxTY2FuUmVzdWx0PiBzY2FuUmVzdWx0cyA9IG1XaWZpU3RhdGVUcmFja2VyLmdldFNjYW5SZXN1bHRzTGlzdCgpOworICAgICAgICBMaXN0PFNjYW5SZXN1bHQ+IHNjYW5SZXN1bHRzID0gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0dldFNjYW5SZXN1bHRzTGlzdCgpOwogICAgICAgICBpZiAoc2NhblJlc3VsdHMgIT0gbnVsbCAmJiBzY2FuUmVzdWx0cy5zaXplKCkgIT0gMCkgewogICAgICAgICAgICAgcHcucHJpbnRsbigiICBCU1NJRCAgICAgICAgICAgICAgRnJlcXVlbmN5ICAgUlNTSSAgRmxhZ3MgICAgICAgICAgICAgU1NJRCIpOwogICAgICAgICAgICAgZm9yIChTY2FuUmVzdWx0IHIgOiBzY2FuUmVzdWx0cykgewpAQCAtMjA0MywzMyArMTA1NSwxNCBAQAogICAgICAgICB9CiAgICAgICAgIHB3LnByaW50bG4oKTsKICAgICAgICAgcHcucHJpbnRsbigiTG9ja3MgYWNxdWlyZWQ6ICIgKyBtRnVsbExvY2tzQWNxdWlyZWQgKyAiIGZ1bGwsICIgKwotICAgICAgICAgICAgICAgIG1GdWxsSGlnaFBlcmZMb2Nrc0FjcXVpcmVkICsgIiBmdWxsIGhpZ2ggcGVyZiwgIiArCiAgICAgICAgICAgICAgICAgbVNjYW5Mb2Nrc0FjcXVpcmVkICsgIiBzY2FuIik7CiAgICAgICAgIHB3LnByaW50bG4oIkxvY2tzIHJlbGVhc2VkOiAiICsgbUZ1bGxMb2Nrc1JlbGVhc2VkICsgIiBmdWxsLCAiICsKLSAgICAgICAgICAgICAgICBtRnVsbEhpZ2hQZXJmTG9ja3NSZWxlYXNlZCArICIgZnVsbCBoaWdoIHBlcmYsICIgKwogICAgICAgICAgICAgICAgIG1TY2FuTG9ja3NSZWxlYXNlZCArICIgc2NhbiIpOwogICAgICAgICBwdy5wcmludGxuKCk7CiAgICAgICAgIHB3LnByaW50bG4oIkxvY2tzIGhlbGQ6Iik7CiAgICAgICAgIG1Mb2Nrcy5kdW1wKHB3KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3RhdGVOYW1lKGludCB3aWZpU3RhdGUpIHsKLSAgICAgICAgc3dpdGNoICh3aWZpU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9ESVNBQkxJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJkaXNhYmxpbmciOwotICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0RJU0FCTEVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiZGlzYWJsZWQiOwotICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0VOQUJMSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAiZW5hYmxpbmciOwotICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0VOQUJMRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJlbmFibGVkIjsKLSAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9VTktOT1dOOgotICAgICAgICAgICAgICAgIHJldHVybiAidW5rbm93biBzdGF0ZSI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAiW2ludmFsaWQgc3RhdGVdIjsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHByaXZhdGUgY2xhc3MgV2lmaUxvY2sgZXh0ZW5kcyBEZWF0aFJlY2lwaWVudCB7CiAgICAgICAgIFdpZmlMb2NrKGludCBsb2NrTW9kZSwgU3RyaW5nIHRhZywgSUJpbmRlciBiaW5kZXIsIFdvcmtTb3VyY2Ugd3MpIHsKICAgICAgICAgICAgIHN1cGVyKGxvY2tNb2RlLCB0YWcsIGJpbmRlciwgd3MpOwpAQCAtMjEwMSwxNSArMTA5NCwxMSBAQAogICAgICAgICAgICAgaWYgKG1MaXN0LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTDsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1GdWxsSGlnaFBlcmZMb2Nrc0FjcXVpcmVkID4gbUZ1bGxIaWdoUGVyZkxvY2tzUmVsZWFzZWQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTExfSElHSF9QRVJGOworICAgICAgICAgICAgZm9yIChXaWZpTG9jayBsIDogbUxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAobC5tTW9kZSA9PSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTEw7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUZ1bGxMb2Nrc0FjcXVpcmVkID4gbUZ1bGxMb2Nrc1JlbGVhc2VkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICByZXR1cm4gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX1NDQU5fT05MWTsKICAgICAgICAgfQogCkBAIC0yMTQ3LDcgKzExMzYsNyBAQAogICAgIH0KIAogICAgIHZvaWQgZW5mb3JjZVdha2VTb3VyY2VQZXJtaXNzaW9uKGludCB1aWQsIGludCBwaWQpIHsKLSAgICAgICAgaWYgKHVpZCA9PSBQcm9jZXNzLm15VWlkKCkpIHsKKyAgICAgICAgaWYgKHVpZCA9PSBhbmRyb2lkLm9zLlByb2Nlc3MubXlVaWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5VUERBVEVfREVWSUNFX1NUQVRTLApAQCAtMjE1NiwxMSArMTE0NSw3IEBACiAKICAgICBwdWJsaWMgYm9vbGVhbiBhY3F1aXJlV2lmaUxvY2soSUJpbmRlciBiaW5kZXIsIGludCBsb2NrTW9kZSwgU3RyaW5nIHRhZywgV29ya1NvdXJjZSB3cykgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLldBS0VfTE9DSywgbnVsbCk7Ci0gICAgICAgIGlmIChsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTCAmJgotICAgICAgICAgICAgICAgIGxvY2tNb2RlICE9IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFkgJiYKLSAgICAgICAgICAgICAgICBsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTF9ISUdIX1BFUkYpIHsKLSAgICAgICAgICAgIFNsb2cuZShUQUcsICJJbGxlZ2FsIGFyZ3VtZW50LCBsb2NrTW9kZT0gIiArIGxvY2tNb2RlKTsKLSAgICAgICAgICAgIGlmIChEQkcpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxvY2tNb2RlPSIgKyBsb2NrTW9kZSk7CisgICAgICAgIGlmIChsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTCAmJiBsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfU0NBTl9PTkxZKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHdzICE9IG51bGwpIHsKQEAgLTIxODMsMTAgKzExNjgsNiBAQAogICAgICAgICAgICAgY2FzZSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTDoKICAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVGdWxsV2lmaUxvY2tBY3F1aXJlZEZyb21Tb3VyY2Uod2lmaUxvY2subVdvcmtTb3VyY2UpOwogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTF9ISUdIX1BFUkY6Ci0gICAgICAgICAgICAgICAgLyogVHJlYXQgaGlnaCBwb3dlciBhcyBhIGZ1bGwgbG9jayBmb3IgYmF0dGVyeSBzdGF0cyAqLwotICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZUZ1bGxXaWZpTG9ja0FjcXVpcmVkRnJvbVNvdXJjZSh3aWZpTG9jay5tV29ya1NvdXJjZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFk6CiAgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlU2NhbldpZmlMb2NrQWNxdWlyZWRGcm9tU291cmNlKHdpZmlMb2NrLm1Xb3JrU291cmNlKTsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTIxOTgsMTAgKzExNzksNiBAQAogICAgICAgICAgICAgY2FzZSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTDoKICAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVGdWxsV2lmaUxvY2tSZWxlYXNlZEZyb21Tb3VyY2Uod2lmaUxvY2subVdvcmtTb3VyY2UpOwogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTF9ISUdIX1BFUkY6Ci0gICAgICAgICAgICAgICAgLyogVHJlYXQgaGlnaCBwb3dlciBhcyBhIGZ1bGwgbG9jayBmb3IgYmF0dGVyeSBzdGF0cyAqLwotICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZUZ1bGxXaWZpTG9ja1JlbGVhc2VkRnJvbVNvdXJjZSh3aWZpTG9jay5tV29ya1NvdXJjZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFk6CiAgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlU2NhbldpZmlMb2NrUmVsZWFzZWRGcm9tU291cmNlKHdpZmlMb2NrLm1Xb3JrU291cmNlKTsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTIyMjAsOSArMTE5Nyw2IEBACiAgICAgICAgICAgICBjYXNlIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMOgogICAgICAgICAgICAgICAgICsrbUZ1bGxMb2Nrc0FjcXVpcmVkOwogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTF9ISUdIX1BFUkY6Ci0gICAgICAgICAgICAgICAgKyttRnVsbEhpZ2hQZXJmTG9ja3NBY3F1aXJlZDsKLSAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgV2lmaU1hbmFnZXIuV0lGSV9NT0RFX1NDQU5fT05MWToKICAgICAgICAgICAgICAgICArK21TY2FuTG9ja3NBY3F1aXJlZDsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTIyOTEsOSArMTI2NSw2IEBACiAgICAgICAgICAgICAgICAgICAgIGNhc2UgV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTEw6CiAgICAgICAgICAgICAgICAgICAgICAgICArK21GdWxsTG9ja3NSZWxlYXNlZDsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMX0hJR0hfUEVSRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICsrbUZ1bGxIaWdoUGVyZkxvY2tzUmVsZWFzZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXaWZpTWFuYWdlci5XSUZJX01PREVfU0NBTl9PTkxZOgogICAgICAgICAgICAgICAgICAgICAgICAgKyttU2NhbkxvY2tzUmVsZWFzZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTIzNjUsNyArMTMzNiw3IEBACiAgICAgICAgICAgICBpZiAobU11bHRpY2FzdGVycy5zaXplKCkgIT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc3RhcnRQYWNrZXRGaWx0ZXJpbmcoKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zdGFydFBhY2tldEZpbHRlcmluZygpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjM4MCw3ICsxMzUxLDcgQEAKICAgICAgICAgICAgIC8vIG91ciBuZXcgc2l6ZSA9PSAxIChmaXJzdCBjYWxsKSwgYnV0IHRoaXMgZnVuY3Rpb24gd29uJ3QKICAgICAgICAgICAgIC8vIGJlIGNhbGxlZCBvZnRlbiBhbmQgYnkgbWFraW5nIHRoZSBzdG9wUGFja2V0IGNhbGwgZWFjaAogICAgICAgICAgICAgLy8gdGltZSB3ZSdyZSBsZXNzIGZyYWdpbGUgYW5kIHNlbGYtaGVhbGluZy4KLSAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnN0b3BQYWNrZXRGaWx0ZXJpbmcoKTsKKyAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnN0b3BQYWNrZXRGaWx0ZXJpbmcoKTsKICAgICAgICAgfQogCiAgICAgICAgIGludCB1aWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOwpAQCAtMjQxNyw3ICsxMzg4LDcgQEAKICAgICAgICAgICAgIHJlbW92ZWQudW5saW5rRGVhdGhSZWNpcGllbnQoKTsKICAgICAgICAgfQogICAgICAgICBpZiAobU11bHRpY2FzdGVycy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc3RhcnRQYWNrZXRGaWx0ZXJpbmcoKTsKKyAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnN0YXJ0UGFja2V0RmlsdGVyaW5nKCk7CiAgICAgICAgIH0KIAogICAgICAgICBMb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CkBAIC0yNDM2LDQgKzE0MDcsMTQ0IEBACiAgICAgICAgICAgICByZXR1cm4gKG1NdWx0aWNhc3RlcnMuc2l6ZSgpID4gMCk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tBbmRTZXROb3RpZmljYXRpb24oKSB7CisgICAgICAgIC8vIElmIHdlIHNob3VsZG4ndCBwbGFjZSBhIG5vdGlmaWNhdGlvbiBvbiBhdmFpbGFibGUgbmV0d29ya3MsIHRoZW4KKyAgICAgICAgLy8gZG9uJ3QgYm90aGVyIGRvaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nCisgICAgICAgIGlmICghbU5vdGlmaWNhdGlvbkVuYWJsZWQpIHJldHVybjsKKworICAgICAgICBTdGF0ZSBzdGF0ZSA9IG1OZXR3b3JrSW5mby5nZXRTdGF0ZSgpOworICAgICAgICBpZiAoKHN0YXRlID09IE5ldHdvcmtJbmZvLlN0YXRlLkRJU0NPTk5FQ1RFRCkKKyAgICAgICAgICAgICAgICB8fCAoc3RhdGUgPT0gTmV0d29ya0luZm8uU3RhdGUuVU5LTk9XTikpIHsKKyAgICAgICAgICAgIC8vIExvb2sgZm9yIGFuIG9wZW4gbmV0d29yaworICAgICAgICAgICAgTGlzdDxTY2FuUmVzdWx0PiBzY2FuUmVzdWx0cyA9IG1XaWZpU3RhdGVNYWNoaW5lLnN5bmNHZXRTY2FuUmVzdWx0c0xpc3QoKTsKKyAgICAgICAgICAgIGlmIChzY2FuUmVzdWx0cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50IG51bU9wZW5OZXR3b3JrcyA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHNjYW5SZXN1bHRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIFNjYW5SZXN1bHQgc2NhblJlc3VsdCA9IHNjYW5SZXN1bHRzLmdldChpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc2NhblJlc3VsdC5jYXBhYmlsaXRpZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1PcGVuTmV0d29ya3MrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChudW1PcGVuTmV0d29ya3MgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgrK21OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlID49IE5VTV9TQ0FOU19CRUZPUkVfQUNUVUFMTFlfU0NBTk5JTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBXZSd2ZSBzY2FubmVkIGNvbnRpbnVvdXNseSBhdCBsZWFzdAorICAgICAgICAgICAgICAgICAgICAgICAgICogTlVNX1NDQU5TX0JFRk9SRV9OT1RJRklDQVRJT04gdGltZXMuIFRoZSB1c2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBwcm9iYWJseSBkb2VzIG5vdCBoYXZlIGEgcmVtZW1iZXJlZCBuZXR3b3JrIGluIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICogc2luY2Ugb3RoZXJ3aXNlIHN1cHBsaWNhbnQgd291bGQgaGF2ZSB0cmllZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICogYXNzb2NpYXRlIGFuZCB0aHVzIHJlc2V0dGluZyB0aGlzIGNvdW50ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvblZpc2libGUodHJ1ZSwgbnVtT3Blbk5ldHdvcmtzLCBmYWxzZSwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vIG9wZW4gbmV0d29ya3MgaW4gcmFuZ2UsIHJlbW92ZSB0aGUgbm90aWZpY2F0aW9uCisgICAgICAgIHNldE5vdGlmaWNhdGlvblZpc2libGUoZmFsc2UsIDAsIGZhbHNlLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdmFyaWFibGVzIHJlbGF0ZWQgdG8gdHJhY2tpbmcgd2hldGhlciBhIG5vdGlmaWNhdGlvbiBoYXMgYmVlbgorICAgICAqIHNob3duIHJlY2VudGx5IGFuZCBjbGVhcnMgdGhlIGN1cnJlbnQgbm90aWZpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXNldE5vdGlmaWNhdGlvbigpIHsKKyAgICAgICAgbU5vdGlmaWNhdGlvblJlcGVhdFRpbWUgPSAwOworICAgICAgICBtTnVtU2NhbnNTaW5jZU5ldHdvcmtTdGF0ZUNoYW5nZSA9IDA7CisgICAgICAgIHNldE5vdGlmaWNhdGlvblZpc2libGUoZmFsc2UsIDAsIGZhbHNlLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IG9yIGRvbid0IGRpc3BsYXkgYSBub3RpZmljYXRpb24gdGhhdCB0aGVyZSBhcmUgb3BlbiBXaS1GaSBuZXR3b3Jrcy4KKyAgICAgKiBAcGFyYW0gdmlzaWJsZSB7QGNvZGUgdHJ1ZX0gaWYgbm90aWZpY2F0aW9uIHNob3VsZCBiZSB2aXNpYmxlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqIEBwYXJhbSBudW1OZXR3b3JrcyB0aGUgbnVtYmVyIG5ldHdvcmtzIHNlZW4KKyAgICAgKiBAcGFyYW0gZm9yY2Uge0Bjb2RlIHRydWV9IHRvIGZvcmNlIG5vdGlmaWNhdGlvbiB0byBiZSBzaG93bi9ub3Qtc2hvd24sCisgICAgICogZXZlbiBpZiBpdCBpcyBhbHJlYWR5IHNob3duL25vdC1zaG93bi4KKyAgICAgKiBAcGFyYW0gZGVsYXkgdGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIG5vdGlmaWNhdGlvbiBzaG91bGQgYmUgbWFkZQorICAgICAqIHZpc2libGUgb3IgaW52aXNpYmxlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXROb3RpZmljYXRpb25WaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSwgaW50IG51bU5ldHdvcmtzLCBib29sZWFuIGZvcmNlLAorICAgICAgICAgICAgaW50IGRlbGF5KSB7CisKKyAgICAgICAgLy8gU2luY2Ugd2UgdXNlIGF1dG8gY2FuY2VsIG9uIHRoZSBub3RpZmljYXRpb24sIHdoZW4gdGhlCisgICAgICAgIC8vIG1OZXR3b3Jrc0F2YWlsYWJsZU5vdGlmaWNhdGlvblNob3duIGlzIHRydWUsIHRoZSBub3RpZmljYXRpb24gbWF5CisgICAgICAgIC8vIGhhdmUgYWN0dWFsbHkgYmVlbiBjYW5jZWxlZC4gIEhvd2V2ZXIsIHdoZW4gaXQgaXMgZmFsc2Ugd2Uga25vdworICAgICAgICAvLyBmb3Igc3VyZSB0aGF0IGl0IGlzIG5vdCBiZWluZyBzaG93biAoaXQgd2lsbCBub3QgYmUgc2hvd24gYW55IG90aGVyCisgICAgICAgIC8vIHBsYWNlIHRoYW4gaGVyZSkKKworICAgICAgICAvLyBJZiBpdCBzaG91bGQgYmUgaGlkZGVuIGFuZCBpdCBpcyBhbHJlYWR5IGhpZGRlbiwgdGhlbiBub29wCisgICAgICAgIGlmICghdmlzaWJsZSAmJiAhbU5vdGlmaWNhdGlvblNob3duICYmICFmb3JjZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlciBub3RpZmljYXRpb25NYW5hZ2VyID0gKE5vdGlmaWNhdGlvbk1hbmFnZXIpIG1Db250ZXh0CisgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5OT1RJRklDQVRJT05fU0VSVklDRSk7CisKKyAgICAgICAgTWVzc2FnZSBtZXNzYWdlOworICAgICAgICBpZiAodmlzaWJsZSkgeworCisgICAgICAgICAgICAvLyBOb3QgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCB0byBzaG93IHRoZSBub3RpZmljYXRpb24gYWdhaW4KKyAgICAgICAgICAgIGlmIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA8IG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobU5vdGlmaWNhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIE5vdGlmaWNhdGlvbiBvYmplY3QuCisgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uLndoZW4gPSAwOworICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24uaWNvbiA9IElDT05fTkVUV09SS1NfQVZBSUxBQkxFOworICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24uZmxhZ3MgPSBOb3RpZmljYXRpb24uRkxBR19BVVRPX0NBTkNFTDsKKyAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KG1Db250ZXh0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudChXaWZpTWFuYWdlci5BQ1RJT05fUElDS19XSUZJX05FVFdPUkspLCAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UXVhbnRpdHlUZXh0KAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnBsdXJhbHMud2lmaV9hdmFpbGFibGUsIG51bU5ldHdvcmtzKTsKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBkZXRhaWxzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UXVhbnRpdHlUZXh0KAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnBsdXJhbHMud2lmaV9hdmFpbGFibGVfZGV0YWlsZWQsIG51bU5ldHdvcmtzKTsKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb24udGlja2VyVGV4dCA9IHRpdGxlOworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5zZXRMYXRlc3RFdmVudEluZm8obUNvbnRleHQsIHRpdGxlLCBkZXRhaWxzLCBtTm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQpOworCisgICAgICAgICAgICBtTm90aWZpY2F0aW9uUmVwZWF0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgTk9USUZJQ0FUSU9OX1JFUEVBVF9ERUxBWV9NUzsKKworICAgICAgICAgICAgbm90aWZpY2F0aW9uTWFuYWdlci5ub3RpZnkoSUNPTl9ORVRXT1JLU19BVkFJTEFCTEUsIG1Ob3RpZmljYXRpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbm90aWZpY2F0aW9uTWFuYWdlci5jYW5jZWwoSUNPTl9ORVRXT1JLU19BVkFJTEFCTEUpOworICAgICAgICB9CisKKyAgICAgICAgbU5vdGlmaWNhdGlvblNob3duID0gdmlzaWJsZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIE5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgeworCisgICAgICAgIHB1YmxpYyBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyKEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICAgICAgc3VwZXIoaGFuZGxlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZWdpc3RlcigpIHsKKyAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU2VjdXJlLmdldFVyaUZvcigKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9ORVRXT1JLU19BVkFJTEFCTEVfTk9USUZJQ0FUSU9OX09OKSwgdHJ1ZSwgdGhpcyk7CisgICAgICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZCA9IGdldFZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNoYW5nZShzZWxmQ2hhbmdlKTsKKworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkVuYWJsZWQgPSBnZXRWYWx1ZSgpOworICAgICAgICAgICAgcmVzZXROb3RpZmljYXRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9ORVRXT1JLU19BVkFJTEFCTEVfTk9USUZJQ0FUSU9OX09OLCAxKSA9PSAxOworICAgICAgICB9CisgICAgfQorCisKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlTdGF0ZVRyYWNrZXIuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlTdGF0ZVRyYWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVN0YXRlVHJhY2tlci5qYXZhCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpV2F0Y2hkb2dTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpV2F0Y2hkb2dTZXJ2aWNlLmphdmEKaW5kZXggNDQ1ZGQwMy4uNDZkNmJlZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVdhdGNoZG9nU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlXYXRjaGRvZ1NlcnZpY2UuamF2YQpAQCAtMjcsNyArMjcsNiBAQAogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuU2NhblJlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlJbmZvOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpU3RhdGVUcmFja2VyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CkBAIC03Nyw3ICs3Niw2IEBACiAgICAgCiAgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwogICAgIHByaXZhdGUgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBXaWZpU3RhdGVUcmFja2VyIG1XaWZpU3RhdGVUcmFja2VyOwogICAgIHByaXZhdGUgV2lmaU1hbmFnZXIgbVdpZmlNYW5hZ2VyOwogICAgIAogICAgIC8qKgpAQCAtMTA4LDEwICsxMDYsOSBAQAogICAgIC8qKiBXaGV0aGVyIHRoZSBjdXJyZW50IEFQIGNoZWNrIHNob3VsZCBiZSBjYW5jZWxlZC4gKi8KICAgICBwcml2YXRlIGJvb2xlYW4gbVNob3VsZENhbmNlbDsKICAgICAKLSAgICBXaWZpV2F0Y2hkb2dTZXJ2aWNlKENvbnRleHQgY29udGV4dCwgV2lmaVN0YXRlVHJhY2tlciB3aWZpU3RhdGVUcmFja2VyKSB7CisgICAgV2lmaVdhdGNoZG9nU2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtQ29udGVudFJlc29sdmVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIgPSB3aWZpU3RhdGVUcmFja2VyOwogICAgICAgICBtV2lmaU1hbmFnZXIgPSAoV2lmaU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJRklfU0VSVklDRSk7CiAgICAgICAgIAogICAgICAgICBjcmVhdGVUaHJlYWQoKTsKQEAgLTI3NSwxMiArMjcyLDEzIEBACiAgICAgLyoqCiAgICAgICogVW5yZWdpc3RlciBicm9hZGNhc3RzIGFuZCBxdWl0IHRoZSB3YXRjaGRvZyB0aHJlYWQKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcXVpdCgpIHsKLSAgICAgICAgdW5yZWdpc3RlckZvcldpZmlCcm9hZGNhc3RzKCk7Ci0gICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobUNvbnRlbnRPYnNlcnZlcik7Ci0gICAgICAgIG1IYW5kbGVyLnJlbW92ZUFsbEFjdGlvbnMoKTsKLSAgICAgICAgbUhhbmRsZXIuZ2V0TG9vcGVyKCkucXVpdCgpOwotICAgIH0KKyAgICAvL1RPRE86IENoYW5nZSBiYWNrIHRvIHJ1bm5pbmcgV1dTIHdoZW4gbmVlZGVkCisvLyAgICBwcml2YXRlIHZvaWQgcXVpdCgpIHsKKy8vICAgICAgICB1bnJlZ2lzdGVyRm9yV2lmaUJyb2FkY2FzdHMoKTsKKy8vICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1Db250ZW50T2JzZXJ2ZXIpOworLy8gICAgICAgIG1IYW5kbGVyLnJlbW92ZUFsbEFjdGlvbnMoKTsKKy8vICAgICAgICBtSGFuZGxlci5nZXRMb29wZXIoKS5xdWl0KCk7CisvLyAgICB9CiAKICAgICAvKioKICAgICAgKiBXYWl0cyBmb3IgdGhlIG1haW4gd2F0Y2hkb2cgdGhyZWFkIHRvIGNyZWF0ZSB0aGUgaGFuZGxlci4KQEAgLTc1MSw3ICs3NDksNyBAQAogICAgICAgICAvLyBCbGFjayBsaXN0IHRoaXMgImJhZCIgQVAsIHRoaXMgd2lsbCBjYXVzZSBhbiBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gYW5vdGhlcgogICAgICAgICBibGFja2xpc3RBcChhcC5ic3NpZCk7CiAgICAgICAgIC8vIEluaXRpYXRlIGFuIGFzc29jaWF0aW9uIHRvIGFuIGFsdGVybmF0ZSBBUAotICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5yZWFzc29jaWF0ZSgpOworICAgICAgICBtV2lmaU1hbmFnZXIucmVhc3NvY2lhdGUoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgYmxhY2tsaXN0QXAoU3RyaW5nIGJzc2lkKSB7CkBAIC03NjIsMTAgKzc2MCw3IEBACiAgICAgICAgIC8vIEJlZm9yZSB0YWtpbmcgYWN0aW9uLCBtYWtlIHN1cmUgd2Ugc2hvdWxkIG5vdCBjYW5jZWwgb3VyIHByb2Nlc3NpbmcKICAgICAgICAgaWYgKHNob3VsZENhbmNlbCgpKSByZXR1cm47CiAgICAgICAgIAotICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLmFkZFRvQmxhY2tsaXN0KGJzc2lkKSkgewotICAgICAgICAgICAgLy8gVGhlcmUncyBhIGtub3duIGJ1ZyB3aGVyZSB0aGlzIG1ldGhvZCByZXR1cm5zIGZhaWx1cmUgb24gc3VjY2VzcwotICAgICAgICAgICAgLy9TbG9nLmUoVEFHLCAiQmxhY2tsaXN0aW5nICIgKyBic3NpZCArICIgZmFpbGVkIik7Ci0gICAgICAgIH0KKyAgICAgICAgbVdpZmlNYW5hZ2VyLmFkZFRvQmxhY2tsaXN0KGJzc2lkKTsKIAogICAgICAgICBpZiAoRCkgewogICAgICAgICAgICAgbXlMb2dEKCJCbGFja2xpc3RpbmcgIiArIGJzc2lkKTsKQEAgLTg2MCwxMCArODU1LDcgQEAKICAgICAgICAgICAgICAqIChhbmQgYmxhY2tsaXN0ZWQgdGhlbSkuIENsZWFyIHRoZSBibGFja2xpc3Qgc28gdGhlIEFQIHdpdGggYmVzdAogICAgICAgICAgICAgICogc2lnbmFsIGlzIGNob3Nlbi4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5jbGVhckJsYWNrbGlzdCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUncyBhIGtub3duIGJ1ZyB3aGVyZSB0aGlzIG1ldGhvZCByZXR1cm5zIGZhaWx1cmUgb24gc3VjY2VzcwotICAgICAgICAgICAgICAgIC8vU2xvZy5lKFRBRywgIkNsZWFyaW5nIGJsYWNrbGlzdCBmYWlsZWQiKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1XaWZpTWFuYWdlci5jbGVhckJsYWNrbGlzdCgpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBpZiAoVikgewogICAgICAgICAgICAgICAgIG15TG9nVigiaGFuZGxlU2xlZXA6IFNldCBzdGF0ZSB0byBTTEVFUCBhbmQgY2xlYXJlZCBibGFja2xpc3QiKTsKQEAgLTkzNCw3ICs5MjYsNyBAQAogICAgICAqIHNob3VsZCByZXZlcnQgYW55dGhpbmcgZG9uZSBieSB0aGUgd2F0Y2hkb2cgbW9uaXRvcmluZy4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgaGFuZGxlUmVzZXQoKSB7Ci0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLmNsZWFyQmxhY2tsaXN0KCk7CisgICAgICAgIG1XaWZpTWFuYWdlci5jbGVhckJsYWNrbGlzdCgpOwogICAgICAgICBzZXRJZGxlU3RhdGUodHJ1ZSk7CiAgICAgfQogICAgIApAQCAtMTE1MSw3ICsxMTQzLDcgQEAKIAogICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlV2lmaVN0YXRlQ2hhbmdlZChpbnQgd2lmaVN0YXRlKSB7CiAgICAgICAgICAgICBpZiAod2lmaVN0YXRlID09IFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfRElTQUJMRUQpIHsKLSAgICAgICAgICAgICAgICBxdWl0KCk7CisgICAgICAgICAgICAgICAgb25EaXNjb25uZWN0ZWQoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAod2lmaVN0YXRlID09IFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfRU5BQkxFRCkgewogICAgICAgICAgICAgICAgIG9uRW5hYmxlZCgpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2luZG93TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggZmE4NTUxNS4uMzBhZWQ2OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2luZG93TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0RJTV9CRUhJTkQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0tFRVBfU0NSRUVOX09OOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfTk9fTElNSVRTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19GVUxMU0NSRUVOOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19TWVNURU1fRVJST1I7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEU7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU07CkBAIC0zOSw2ICs0MCw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLklCYXR0ZXJ5U3RhdHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LlBvbGljeU1hbmFnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LmltcGwuUGhvbmVXaW5kb3dNYW5hZ2VyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuQmFzZUlucHV0SGFuZGxlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LklJbnB1dENvbnRleHQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5JSW5wdXRNZXRob2RDbGllbnQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5JSW5wdXRNZXRob2RNYW5hZ2VyOwpAQCAtNTAsNiArNTIsOCBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLklBY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlUG9saWN5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwpAQCAtOTIsNiArOTYsNyBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VJbnRBcnJheTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRHJhZ0V2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwogaW1wb3J0IGFuZHJvaWQudmlldy5IYXB0aWNGZWVkYmFja0NvbnN0YW50czsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSUFwcGxpY2F0aW9uVG9rZW47CkBAIC0xMDMsNiArMTA4LDggQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRDaGFubmVsOwogaW1wb3J0IGFuZHJvaWQudmlldy5JbnB1dERldmljZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRIYW5kbGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5JbnB1dFF1ZXVlOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CkBAIC0xNTgsNyArMTY1LDcgQEAKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19TVEFSVElOR19XSU5ET1cgPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19SRU9SREVSID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfV0FMTFBBUEVSID0gZmFsc2U7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfRlJFRVpFID0gZmFsc2U7CisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfRFJBRyA9IHRydWU7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0hPV19UUkFOU0FDVElPTlMgPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBISURFX1NUQUNLX0NSQVdMUyA9IHRydWU7CiAKQEAgLTQ4Niw2ICs0OTMsMzMwIEBACiAgICAgYm9vbGVhbiBtVHVybk9uU2NyZWVuOwogCiAgICAgLyoqCisgICAgICogRHJhZy9kcm9wIHN0YXRlCisgICAgICovCisgICAgY2xhc3MgRHJhZ1N0YXRlIHsKKyAgICAgICAgSUJpbmRlciBtVG9rZW47CisgICAgICAgIFN1cmZhY2UgbVN1cmZhY2U7CisgICAgICAgIGJvb2xlYW4gbUxvY2FsT25seTsKKyAgICAgICAgQ2xpcERhdGEgbURhdGE7CisgICAgICAgIENsaXBEZXNjcmlwdGlvbiBtRGF0YURlc2NyaXB0aW9uOworICAgICAgICBmbG9hdCBtVGh1bWJPZmZzZXRYLCBtVGh1bWJPZmZzZXRZOworICAgICAgICBJbnB1dENoYW5uZWwgbVNlcnZlckNoYW5uZWwsIG1DbGllbnRDaGFubmVsOworICAgICAgICBXaW5kb3dTdGF0ZSBtVGFyZ2V0V2luZG93OworICAgICAgICBBcnJheUxpc3Q8V2luZG93U3RhdGU+IG1Ob3RpZmllZFdpbmRvd3M7CisgICAgICAgIGJvb2xlYW4gbURyYWdFbmRlZDsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFJlY3QgdG1wUmVjdCA9IG5ldyBSZWN0KCk7CisKKyAgICAgICAgRHJhZ1N0YXRlKElCaW5kZXIgdG9rZW4sIFN1cmZhY2Ugc3VyZmFjZSwgYm9vbGVhbiBsb2NhbE9ubHkpIHsKKyAgICAgICAgICAgIG1Ub2tlbiA9IHRva2VuOworICAgICAgICAgICAgbVN1cmZhY2UgPSBzdXJmYWNlOworICAgICAgICAgICAgbUxvY2FsT25seSA9IGxvY2FsT25seTsKKyAgICAgICAgICAgIG1Ob3RpZmllZFdpbmRvd3MgPSBuZXcgQXJyYXlMaXN0PFdpbmRvd1N0YXRlPigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIGlmIChtU3VyZmFjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVN1cmZhY2UuZGVzdHJveSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN1cmZhY2UgPSBudWxsOworICAgICAgICAgICAgbUxvY2FsT25seSA9IGZhbHNlOworICAgICAgICAgICAgbVRva2VuID0gbnVsbDsKKyAgICAgICAgICAgIG1EYXRhID0gbnVsbDsKKyAgICAgICAgICAgIG1UaHVtYk9mZnNldFggPSBtVGh1bWJPZmZzZXRZID0gMDsKKyAgICAgICAgICAgIG1Ob3RpZmllZFdpbmRvd3MgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZWdpc3RlcigpIHsKKyAgICAgICAgICAgIGlmIChERUJVR19EUkFHKSBTbG9nLmQoVEFHLCAicmVnaXN0ZXJpbmcgZHJhZyBpbnB1dCBjaGFubmVsIik7CisgICAgICAgICAgICBpZiAobUNsaWVudENoYW5uZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJEdXBsaWNhdGUgcmVnaXN0ZXIgb2YgZHJhZyBpbnB1dCBjaGFubmVsIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIElucHV0Q2hhbm5lbFtdIGNoYW5uZWxzID0gSW5wdXRDaGFubmVsLm9wZW5JbnB1dENoYW5uZWxQYWlyKCJkcmFnIik7CisgICAgICAgICAgICAgICAgbVNlcnZlckNoYW5uZWwgPSBjaGFubmVsc1swXTsKKyAgICAgICAgICAgICAgICBtQ2xpZW50Q2hhbm5lbCA9IGNoYW5uZWxzWzFdOworICAgICAgICAgICAgICAgIG1JbnB1dE1hbmFnZXIucmVnaXN0ZXJJbnB1dENoYW5uZWwobVNlcnZlckNoYW5uZWwpOworICAgICAgICAgICAgICAgIElucHV0UXVldWUucmVnaXN0ZXJJbnB1dENoYW5uZWwobUNsaWVudENoYW5uZWwsIG1EcmFnSW5wdXRIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgbUguZ2V0TG9vcGVyKCkuZ2V0UXVldWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHVucmVnaXN0ZXIoKSB7CisgICAgICAgICAgICBpZiAoREVCVUdfRFJBRykgU2xvZy5kKFRBRywgInVucmVnaXN0ZXJpbmcgZHJhZyBpbnB1dCBjaGFubmVsIik7CisgICAgICAgICAgICBpZiAobUNsaWVudENoYW5uZWwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJVbnJlZ2lzdGVyIG9mIG5vbmV4aXN0ZW50IGRyYWcgaW5wdXQgY2hhbm5lbCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSW5wdXRNYW5hZ2VyLnVucmVnaXN0ZXJJbnB1dENoYW5uZWwobVNlcnZlckNoYW5uZWwpOworICAgICAgICAgICAgICAgIElucHV0UXVldWUudW5yZWdpc3RlcklucHV0Q2hhbm5lbChtQ2xpZW50Q2hhbm5lbCk7CisgICAgICAgICAgICAgICAgbUNsaWVudENoYW5uZWwuZGlzcG9zZSgpOworICAgICAgICAgICAgICAgIG1DbGllbnRDaGFubmVsID0gbnVsbDsKKyAgICAgICAgICAgICAgICBtU2VydmVyQ2hhbm5lbCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBjYWxsIG91dCB0byBlYWNoIHZpc2libGUgd2luZG93L3Nlc3Npb24gaW5mb3JtaW5nIGl0IGFib3V0IHRoZSBkcmFnCisgICAgICAgICAqLworICAgICAgICB2b2lkIGJyb2FkY2FzdERyYWdTdGFydGVkTHcoKSB7CisgICAgICAgICAgICAvLyBDYWNoZSBhIGJhc2UtY2xhc3MgaW5zdGFuY2Ugb2YgdGhlIGNsaXAgbWV0YWRhdGEgc28gdGhhdCBwYXJjZWxpbmcKKyAgICAgICAgICAgIC8vIHdvcmtzIGNvcnJlY3RseSBpbiBjYWxsaW5nIG91dCB0byB0aGUgYXBwcy4KKyAgICAgICAgICAgIG1EYXRhRGVzY3JpcHRpb24gPSBuZXcgQ2xpcERlc2NyaXB0aW9uKG1EYXRhKTsKKyAgICAgICAgICAgIG1Ob3RpZmllZFdpbmRvd3MuY2xlYXIoKTsKKworICAgICAgICAgICAgaWYgKERFQlVHX0RSQUcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYnJvYWRjYXN0aW5nIERSQUdfU1RBUlRFRCBvZiAiICsgbURhdGFEZXNjcmlwdGlvbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIERyYWdFdmVudCBldnQgPSBEcmFnRXZlbnQub2J0YWluKERyYWdFdmVudC5BQ1RJT05fRFJBR19TVEFSVEVELCAwLCAwLAorICAgICAgICAgICAgICAgICAgICBtRGF0YURlc2NyaXB0aW9uLCBudWxsKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbVdpbmRvd3Muc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvLyBzZW5kRHJhZ1N0YXJ0ZWRMdygpIGNsb25lcyBldnQgZm9yIGxvY2FsLXByb2Nlc3MgZGlzcGF0Y2gKKyAgICAgICAgICAgICAgICBzZW5kRHJhZ1N0YXJ0ZWRMdyhtV2luZG93cy5nZXQoaSksIGV2dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBldnQucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyogaGVscGVyIC0gc2VuZCBhIGNhbGxlci1wcm92aWRlZCBldmVudCwgcHJlc3VtZWQgdG8gYmUgRFJBR19TVEFSVEVELCBpZiB0aGUKKyAgICAgICAgICogZGVzaWduYXRlZCB3aW5kb3cgaXMgcG90ZW50aWFsbHkgYSBkcm9wIHJlY2lwaWVudC4gIFRoZXJlIGFyZSByYWNlIHNpdHVhdGlvbnMKKyAgICAgICAgICogYXJvdW5kIERSQUdfRU5ERUQgYnJvYWRjYXN0LCBzbyB3ZSBtYWtlIHN1cmUgdGhhdCBvbmNlIHdlJ3ZlIGRlY2xhcmVkIHRoYXQKKyAgICAgICAgICogdGhlIGRyYWcgaGFzIGVuZGVkLCB3ZSBuZXZlciBzZW5kIG91dCBhbm90aGVyIERSQUdfU1RBUlRFRCBmb3IgdGhpcyBkcmFnIGFjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBtZXRob2QgY2xvbmVzIHRoZSAnZXZlbnQnIHBhcmFtZXRlciBpZiBpdCdzIGJlaW5nIGRlbGl2ZXJlZCB0byB0aGUgc2FtZQorICAgICAgICAgKiBwcm9jZXNzLCBzbyBpdCdzIHNhZmUgZm9yIHRoZSBjYWxsZXIgdG8gY2FsbCByZWN5Y2xlKCkgb24gdGhlIGV2ZW50IGFmdGVyd2FyZHMuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgc2VuZERyYWdTdGFydGVkTHcoV2luZG93U3RhdGUgbmV3V2luLCBEcmFnRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIGlmICghbURyYWdFbmRlZCAmJiBuZXdXaW4uaXNQb3RlbnRpYWxEcmFnVGFyZ2V0KCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBjbG9uZSBmb3IgbG9jYWwgY2FsbGVlcyBzaW5jZSBkaXNwYXRjaCB3aWxsIHJlY3ljbGUgdGhlIGV2ZW50CisgICAgICAgICAgICAgICAgICAgIGlmIChQcm9jZXNzLm15UGlkKCkgPT0gbmV3V2luLm1TZXNzaW9uLm1QaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gRHJhZ0V2ZW50Lm9idGFpbihldmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmV3V2luLm1DbGllbnQuZGlzcGF0Y2hEcmFnRXZlbnQoZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAvLyB0cmFjayBlYWNoIHdpbmRvdyB0aGF0IHdlJ3ZlIG5vdGlmaWVkIHRoYXQgdGhlIGRyYWcgaXMgc3RhcnRpbmcKKyAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWVkV2luZG93cy5hZGQobmV3V2luKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiVW5hYmxlIHRvIGRyYWctc3RhcnQgd2luZG93ICIgKyBuZXdXaW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGhlbHBlciAtIGNvbnN0cnVjdCBhbmQgc2VuZCBhIERSQUdfU1RBUlRFRCBldmVudCBvbmx5IGlmIHRoZSB3aW5kb3cgaGFzIG5vdAorICAgICAgICAgKiBwcmV2aW91c2x5IGJlZW4gbm90aWZpZWQsIGkuZS4gaXQgYmVjYW1lIHZpc2libGUgYWZ0ZXIgdGhlIGRyYWcgb3BlcmF0aW9uCisgICAgICAgICAqIHdhcyBiZWd1bi4gIFRoaXMgaXMgYSByYXJlIGNhc2UuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgc2VuZERyYWdTdGFydGVkSWZOZWVkZWRMdyhXaW5kb3dTdGF0ZSBuZXdXaW4pIHsKKyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgc2VudCB0aGUgZHJhZy1zdGFydGVkLCB3ZSBuZWVkbid0IGRvIHNvIGFnYWluCisgICAgICAgICAgICBmb3IgKFdpbmRvd1N0YXRlIHdzIDogbU5vdGlmaWVkV2luZG93cykgeworICAgICAgICAgICAgICAgIGlmICh3cyA9PSBuZXdXaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChERUJVR19EUkFHKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgInNlbmRpbmcgRFJBR19TVEFSVEVEIHRvIG5ldyB3aW5kb3cgIiArIG5ld1dpbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEcmFnRXZlbnQgZXZlbnQgPSBEcmFnRXZlbnQub2J0YWluKERyYWdFdmVudC5BQ1RJT05fRFJBR19TVEFSVEVELCAwLCAwLAorICAgICAgICAgICAgICAgICAgICBtRGF0YURlc2NyaXB0aW9uLCBudWxsKTsKKyAgICAgICAgICAgIC8vIHNlbmREcmFnU3RhcnRlZEx3KCkgY2xvbmVzICdldmVudCcgaWYgdGhlIHdpbmRvdyBpcyBwcm9jZXNzLWxvY2FsCisgICAgICAgICAgICBzZW5kRHJhZ1N0YXJ0ZWRMdyhuZXdXaW4sIGV2ZW50KTsKKyAgICAgICAgICAgIGV2ZW50LnJlY3ljbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYnJvYWRjYXN0RHJhZ0VuZGVkKCkgeworICAgICAgICAgICAgaWYgKERFQlVHX0RSQUcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYnJvYWRjYXN0aW5nIERSQUdfRU5ERUQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERyYWdFdmVudCBldnQgPSBEcmFnRXZlbnQub2J0YWluKERyYWdFdmVudC5BQ1RJT05fRFJBR19FTkRFRCwgMCwgMCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaW5kb3dNYXApIHsKKyAgICAgICAgICAgICAgICBmb3IgKFdpbmRvd1N0YXRlIHdzOiBtTm90aWZpZWRXaW5kb3dzKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cy5tQ2xpZW50LmRpc3BhdGNoRHJhZ0V2ZW50KGV2dCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiVW5hYmxlIHRvIGRyYWctZW5kIHdpbmRvdyAiICsgd3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Ob3RpZmllZFdpbmRvd3MuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtRHJhZ0VuZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV2dC5yZWN5Y2xlKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIG5vdGlmeU1vdmVMdyhmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbXlQaWQgPSBQcm9jZXNzLm15UGlkKCk7CisKKyAgICAgICAgICAgIC8vIE1vdmUgdGhlIHN1cmZhY2UgdG8gdGhlIGdpdmVuIHRvdWNoCisgICAgICAgICAgICBtU3VyZmFjZS5vcGVuVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIG1TdXJmYWNlLnNldFBvc2l0aW9uKChpbnQpKHggLSBtVGh1bWJPZmZzZXRYKSwgKGludCkoeSAtIG1UaHVtYk9mZnNldFkpKTsKKyAgICAgICAgICAgIG1TdXJmYWNlLmNsb3NlVHJhbnNhY3Rpb24oKTsKKworICAgICAgICAgICAgLy8gVGVsbCB0aGUgYWZmZWN0ZWQgd2luZG93CisgICAgICAgICAgICBXaW5kb3dTdGF0ZSB0b3VjaGVkV2luID0gZ2V0VG91Y2hlZFdpbkF0UG9pbnRMdyh4LCB5KTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gaGF2ZSB3ZSBkcmFnZ2VkIG92ZXIgYSBuZXcgd2luZG93PworICAgICAgICAgICAgICAgIGlmICgodG91Y2hlZFdpbiAhPSBtVGFyZ2V0V2luZG93KSAmJiAobVRhcmdldFdpbmRvdyAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfRFJBRykgeworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgInNlbmRpbmcgRFJBR19FWElURUQgdG8gIiArIG1UYXJnZXRXaW5kb3cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIERSQUdfRVhJVEVEX0VWRU5UIGlmIGFwcHJvcHJpYXRlCisgICAgICAgICAgICAgICAgICAgIERyYWdFdmVudCBldnQgPSBEcmFnRXZlbnQub2J0YWluKERyYWdFdmVudC5BQ1RJT05fRFJBR19FWElURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIG1UYXJnZXRXaW5kb3cubUNsaWVudC5kaXNwYXRjaERyYWdFdmVudChldnQpOworICAgICAgICAgICAgICAgICAgICBpZiAobXlQaWQgIT0gbVRhcmdldFdpbmRvdy5tU2Vzc2lvbi5tUGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldnQucmVjeWNsZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0b3VjaGVkV2luICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0RSQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJzZW5kaW5nIERSQUdfTE9DQVRJT04gdG8gIiArIHRvdWNoZWRXaW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIERyYWdFdmVudCBldnQgPSBEcmFnRXZlbnQub2J0YWluKERyYWdFdmVudC5BQ1RJT05fRFJBR19MT0NBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5LCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgdG91Y2hlZFdpbi5tQ2xpZW50LmRpc3BhdGNoRHJhZ0V2ZW50KGV2dCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChteVBpZCAhPSB0b3VjaGVkV2luLm1TZXNzaW9uLm1QaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2dC5yZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJjYW4ndCBzZW5kIGRyYWcgbm90aWZpY2F0aW9uIHRvIHdpbmRvd3MiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UYXJnZXRXaW5kb3cgPSB0b3VjaGVkV2luOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGVsbCB0aGUgZHJvcCB0YXJnZXQgYWJvdXQgdGhlIGRhdGEsIGFuZCB0aGVuIGJyb2FkY2FzdCB0aGUgZHJhZy1lbmRlZCBub3RpZmljYXRpb24KKyAgICAgICAgdm9pZCBub3RpZnlEcm9wTHcoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICAgICAgV2luZG93U3RhdGUgdG91Y2hlZFdpbiA9IGdldFRvdWNoZWRXaW5BdFBvaW50THcoeCwgeSk7CisgICAgICAgICAgICBpZiAodG91Y2hlZFdpbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHX0RSQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgInNlbmRpbmcgRFJPUCB0byAiICsgdG91Y2hlZFdpbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsIGludCBteVBpZCA9IFByb2Nlc3MubXlQaWQoKTsKKyAgICAgICAgICAgICAgICBEcmFnRXZlbnQgZXZ0ID0gRHJhZ0V2ZW50Lm9idGFpbihEcmFnRXZlbnQuQUNUSU9OX0RST1AsIHgsIHksIG51bGwsIG1EYXRhKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0b3VjaGVkV2luLm1DbGllbnQuZGlzcGF0Y2hEcmFnRXZlbnQoZXZ0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiY2FuJ3Qgc2VuZCBkcm9wIG5vdGlmaWNhdGlvbiB0byB3aW4gIiArIHRvdWNoZWRXaW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobXlQaWQgIT0gdG91Y2hlZFdpbi5tU2Vzc2lvbi5tUGlkKSB7CisgICAgICAgICAgICAgICAgICAgIGV2dC5yZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRmluZCB0aGUgdmlzaWJsZSwgdG91Y2gtZGVsaXZlcmFibGUgd2luZG93IHVuZGVyIHRoZSBnaXZlbiBwb2ludAorICAgICAgICBwcml2YXRlIFdpbmRvd1N0YXRlIGdldFRvdWNoZWRXaW5BdFBvaW50THcoZmxvYXQgeGYsIGZsb2F0IHlmKSB7CisgICAgICAgICAgICBXaW5kb3dTdGF0ZSB0b3VjaGVkV2luID0gbnVsbDsKKyAgICAgICAgICAgIGZpbmFsIGludCB4ID0gKGludCkgeGY7CisgICAgICAgICAgICBmaW5hbCBpbnQgeSA9IChpbnQpIHlmOworICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PFdpbmRvd1N0YXRlPiB3aW5kb3dzID0gbVdpbmRvd3M7CisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IHdpbmRvd3Muc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IE4gLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIFdpbmRvd1N0YXRlIGNoaWxkID0gd2luZG93cy5nZXQoaSk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGZsYWdzID0gY2hpbGQubUF0dHJzLmZsYWdzOworICAgICAgICAgICAgICAgIGlmICghY2hpbGQuaXNWaXNpYmxlTHcoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBub3QgdmlzaWJsZSA9PSBkb24ndCB0ZWxsIGFib3V0IGRyYWdzCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfVE9VQ0hBQkxFKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdCB0b3VjaGFibGUgPT0gZG9uJ3QgdGVsbCBhYm91dCBkcmFncworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gYWNjb3VudCBmb3IgdGhlIHdpbmRvdydzIGRlY29yIGV0YworICAgICAgICAgICAgICAgIHRtcFJlY3Quc2V0KGNoaWxkLm1GcmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm1Ub3VjaGFibGVJbnNldHMgPT0gVmlld1RyZWVPYnNlcnZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5JbnRlcm5hbEluc2V0c0luZm8uVE9VQ0hBQkxFX0lOU0VUU19DT05URU5UKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwb2ludCBpcyBpbnNpZGUgb2YgdGhlIHdpbmRvdyBpZiBpdCBpcworICAgICAgICAgICAgICAgICAgICAvLyBpbnNpZGUgdGhlIGZyYW1lLCBBTkQgdGhlIGNvbnRlbnQgcGFydCBvZiB0aGF0CisgICAgICAgICAgICAgICAgICAgIC8vIGZyYW1lIHRoYXQgd2FzIGdpdmVuIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgdG1wUmVjdC5sZWZ0ICs9IGNoaWxkLm1HaXZlbkNvbnRlbnRJbnNldHMubGVmdDsKKyAgICAgICAgICAgICAgICAgICAgdG1wUmVjdC50b3AgKz0gY2hpbGQubUdpdmVuQ29udGVudEluc2V0cy50b3A7CisgICAgICAgICAgICAgICAgICAgIHRtcFJlY3QucmlnaHQgLT0gY2hpbGQubUdpdmVuQ29udGVudEluc2V0cy5yaWdodDsKKyAgICAgICAgICAgICAgICAgICAgdG1wUmVjdC5ib3R0b20gLT0gY2hpbGQubUdpdmVuQ29udGVudEluc2V0cy5ib3R0b207CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5tVG91Y2hhYmxlSW5zZXRzID09IFZpZXdUcmVlT2JzZXJ2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSW50ZXJuYWxJbnNldHNJbmZvLlRPVUNIQUJMRV9JTlNFVFNfVklTSUJMRSkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcG9pbnQgaXMgaW5zaWRlIG9mIHRoZSB3aW5kb3cgaWYgaXQgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gaW5zaWRlIHRoZSBmcmFtZSwgQU5EIHRoZSB2aXNpYmxlIHBhcnQgb2YgdGhhdAorICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZSB0aGF0IHdhcyBnaXZlbiBieSB0aGUgYXBwbGljYXRpb24uCisgICAgICAgICAgICAgICAgICAgIHRtcFJlY3QubGVmdCArPSBjaGlsZC5tR2l2ZW5WaXNpYmxlSW5zZXRzLmxlZnQ7CisgICAgICAgICAgICAgICAgICAgIHRtcFJlY3QudG9wICs9IGNoaWxkLm1HaXZlblZpc2libGVJbnNldHMudG9wOworICAgICAgICAgICAgICAgICAgICB0bXBSZWN0LnJpZ2h0IC09IGNoaWxkLm1HaXZlblZpc2libGVJbnNldHMucmlnaHQ7CisgICAgICAgICAgICAgICAgICAgIHRtcFJlY3QuYm90dG9tIC09IGNoaWxkLm1HaXZlblZpc2libGVJbnNldHMuYm90dG9tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdG91Y2hGbGFncyA9IGZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRQorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIX01PREFMKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wUmVjdC5jb250YWlucyh4LCB5KSB8fCB0b3VjaEZsYWdzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRm91bmQgaXQKKyAgICAgICAgICAgICAgICAgICAgdG91Y2hlZFdpbiA9IGNoaWxkOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0b3VjaGVkV2luOworICAgICAgICB9CisgICAgfQorCisgICAgRHJhZ1N0YXRlIG1EcmFnU3RhdGUgPSBudWxsOworICAgIHByaXZhdGUgZmluYWwgSW5wdXRIYW5kbGVyIG1EcmFnSW5wdXRIYW5kbGVyID0gbmV3IEJhc2VJbnB1dEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNb3Rpb24oTW90aW9uRXZlbnQgZXZlbnQsIFJ1bm5hYmxlIGZpbmlzaGVkQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZW5kRHJhZyA9IGZhbHNlOworICAgICAgICAgICAgZmluYWwgZmxvYXQgbmV3WCA9IGV2ZW50LmdldFJhd1goKTsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IG5ld1kgPSBldmVudC5nZXRSYXdZKCk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKG1EcmFnU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldEFjdGlvbigpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19EUkFHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlVuZXhwZWN0ZWQgQUNUSU9OX0RPV04gaW4gZHJhZyBsYXllciIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdpbmRvd01hcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgdGhlIHN1cmZhY2UgYW5kIHRlbGwgdGhlIGludm9sdmVkIHdpbmRvdyhzKSB3aGVyZSB3ZSBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJhZ1N0YXRlLm5vdGlmeU1vdmVMdyhuZXdYLCBuZXdZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDogeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0RSQUcpIFNsb2cuZChUQUcsICJHb3QgVVAgb24gbW92ZSBjaGFubmVsOyBkcm9wcGluZyBhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmV3WCArICIsIiArIG5ld1kpOworICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2luZG93TWFwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyYWdTdGF0ZS5ub3RpZnlEcm9wTHcobmV3WCwgbmV3WSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbmREcmFnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19EUkFHKSBTbG9nLmQoVEFHLCAiRHJhZyBjYW5jZWxsZWQhIik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmREcmFnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChlbmREcmFnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfRFJBRykgU2xvZy5kKFRBRywgIkRyYWcgZW5kZWQ7IHRlYXJpbmcgZG93biBzdGF0ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVsbCBhbGwgdGhlIHdpbmRvd3MgdGhhdCB0aGUgZHJhZyBoYXMgZW5kZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EcmFnU3RhdGUuYnJvYWRjYXN0RHJhZ0VuZGVkKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3AgaW50ZXJjZXB0aW5nIGlucHV0CisgICAgICAgICAgICAgICAgICAgICAgICBtRHJhZ1N0YXRlLnVucmVnaXN0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dE1vbml0b3IudXBkYXRlSW5wdXRXaW5kb3dzTHcoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJlZSBvdXIgcmVzb3VyY2VzIGFuZCBkcm9wIGFsbCB0aGUgb2JqZWN0IHJlZmVyZW5jZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EcmFnU3RhdGUucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EcmFnU3RhdGUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXhjZXB0aW9uIGNhdWdodCBieSBkcmFnIGhhbmRsZU1vdGlvbiIsIGUpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBmaW5pc2hlZENhbGxiYWNrLnJ1bigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgogICAgICAqIFdoZXRoZXIgdGhlIFVJIGlzIGN1cnJlbnRseSBydW5uaW5nIGluIHRvdWNoIG1vZGUgKG5vdCBzaG93aW5nCiAgICAgICogbmF2aWdhdGlvbmFsIGZvY3VzIGJlY2F1c2UgdGhlIHVzZXIgaXMgZGlyZWN0bHkgcHJlc3NpbmcgdGhlIHNjcmVlbikuCiAgICAgICovCkBAIC0xNzg5LDE4ICsyMTIwLDExIEBACiAgICAgICAgIGJvb2xlYW4gcmVwb3J0TmV3Q29uZmlnID0gZmFsc2U7CiAgICAgICAgIFdpbmRvd1N0YXRlIGF0dGFjaGVkV2luZG93ID0gbnVsbDsKICAgICAgICAgV2luZG93U3RhdGUgd2luID0gbnVsbDsKKyAgICAgICAgbG9uZyBvcmlnSWQ7CiAKICAgICAgICAgc3luY2hyb25pemVkKG1XaW5kb3dNYXApIHsKLSAgICAgICAgICAgIC8vIEluc3RhbnRpYXRpbmcgYSBEaXNwbGF5IHJlcXVpcmVzIHRhbGtpbmcgd2l0aCB0aGUgc2ltdWxhdG9yLAotICAgICAgICAgICAgLy8gc28gZG9uJ3QgZG8gaXQgdW50aWwgd2Uga25vdyB0aGUgc3lzdGVtIGlzIG1vc3RseSB1cCBhbmQKLSAgICAgICAgICAgIC8vIHJ1bm5pbmcuCiAgICAgICAgICAgICBpZiAobURpc3BsYXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIgd20gPSAoV2luZG93TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOwotICAgICAgICAgICAgICAgIG1EaXNwbGF5ID0gd20uZ2V0RGVmYXVsdERpc3BsYXkoKTsKLSAgICAgICAgICAgICAgICBtSW5pdGlhbERpc3BsYXlXaWR0aCA9IG1EaXNwbGF5LmdldFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgbUluaXRpYWxEaXNwbGF5SGVpZ2h0ID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgbUlucHV0TWFuYWdlci5zZXREaXNwbGF5U2l6ZSgwLCBtSW5pdGlhbERpc3BsYXlXaWR0aCwgbUluaXRpYWxEaXNwbGF5SGVpZ2h0KTsKLSAgICAgICAgICAgICAgICByZXBvcnROZXdDb25maWcgPSB0cnVlOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRpc3BsYXkgaGFzIG5vdCBiZWVuIGluaXRpYWxpYWxpemVkIik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtV2luZG93TWFwLmNvbnRhaW5zS2V5KGNsaWVudC5hc0JpbmRlcigpKSkgewpAQCAtMTkwNiw3ICsyMjMwLDcgQEAKIAogICAgICAgICAgICAgcmVzID0gV2luZG93TWFuYWdlckltcGwuQUREX09LQVk7CiAKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgb3JpZ0lkID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICBvcmlnSWQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKIAogICAgICAgICAgICAgaWYgKGFkZFRva2VuKSB7CiAgICAgICAgICAgICAgICAgbVRva2VuTWFwLnB1dChhdHRycy50b2tlbiwgdG9rZW4pOwpAQCAtMTk4MywxNCArMjMwNywxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gc2VuZE5ld0NvbmZpZ3VyYXRpb24oKSBjaGVja3MgY2FsbGVyIHBlcm1pc3Npb25zIHNvIHdlIG11c3QgY2FsbCBpdCB3aXRoCi0gICAgICAgIC8vIHByaXZpbGVnZS4gIHVwZGF0ZU9yaWVudGF0aW9uRnJvbUFwcFRva2VucygpIGNsZWFycyBhbmQgcmVzZXRzIHRoZSBjYWxsZXIKLSAgICAgICAgLy8gaWRlbnRpdHkgYW55d2F5LCBzbyBpdCdzIHNhZmUgdG8ganVzdCBjbGVhciAmIHJlc3RvcmUgYXJvdW5kIHRoaXMgd2hvbGUKLSAgICAgICAgLy8gYmxvY2suCi0gICAgICAgIGZpbmFsIGxvbmcgb3JpZ0lkID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIGlmIChyZXBvcnROZXdDb25maWcpIHsKICAgICAgICAgICAgIHNlbmROZXdDb25maWd1cmF0aW9uKCk7CiAgICAgICAgIH0KKwogICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShvcmlnSWQpOwogCiAgICAgICAgIHJldHVybiByZXM7CkBAIC00NDM2LDggKzQ3NTYsNyBAQAogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtV2luZG93cy5zaXplKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgV2luZG93U3RhdGUgdyA9IG1XaW5kb3dzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAody5pc1Zpc2libGVMdygpICYmICF3Lm1PYnNjdXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHcubU9yaWVudGF0aW9uQ2hhbmdpbmcgfHwgIXcuaXNEcmF3bkx3KCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKHcuaXNWaXNpYmxlTHcoKSAmJiAhdy5tT2JzY3VyZWQgJiYgIXcuaXNEcmF3bkx3KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTUwNTUsNyArNTM3NCw2MCBAQAogICAgICAgICBtUG9saWN5LmFkanVzdENvbmZpZ3VyYXRpb25Mdyhjb25maWcpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gRHJhZyBhbmQgZHJvcAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIElCaW5kZXIgcHJlcGFyZURyYWdTdXJmYWNlKElXaW5kb3cgd2luZG93LCBTdXJmYWNlU2Vzc2lvbiBzZXNzaW9uLAorICAgICAgICAgICAgYm9vbGVhbiBsb2NhbE9ubHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgU3VyZmFjZSBvdXRTdXJmYWNlKSB7CisgICAgICAgIGlmIChERUJVR19EUkFHKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAicHJlcGFyZSBkcmFnIHN1cmZhY2U6IHc9IiArIHdpZHRoICsgIiBoPSIgKyBoZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgKyAiIGxvY2FsPSIgKyBsb2NhbE9ubHkgKyAiIHdpbj0iICsgd2luZG93CisgICAgICAgICAgICAgICAgICAgICsgIiBhc2JpbmRlcj0iICsgd2luZG93LmFzQmluZGVyKCkpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGNhbGxlclBpZCA9IEJpbmRlci5nZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIGZpbmFsIGxvbmcgb3JpZ0lkID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgIElCaW5kZXIgdG9rZW4gPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaW5kb3dNYXApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyAhISEgVE9ETzogZmFpbCBpZiB0aGUgZ2l2ZW4gd2luZG93IGRvZXMgbm90IGN1cnJlbnRseSBoYXZlIHRvdWNoIGZvY3VzPworCisgICAgICAgICAgICAgICAgICAgIGlmIChtRHJhZ1N0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN1cmZhY2Ugc3VyZmFjZSA9IG5ldyBTdXJmYWNlKHNlc3Npb24sIGNhbGxlclBpZCwgImRyYWcgc3VyZmFjZSIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5ULCBTdXJmYWNlLkhJRERFTik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRTdXJmYWNlLmNvcHlGcm9tKHN1cmZhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBuZXcgQmluZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRHJhZ1N0YXRlID0gbmV3IERyYWdTdGF0ZSh0b2tlbiwgc3VyZmFjZSwgbG9jYWxPbmx5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EcmFnU3RhdGUubVN1cmZhY2UgPSBzdXJmYWNlOworICAgICAgICAgICAgICAgICAgICAgICAgbURyYWdTdGF0ZS5tTG9jYWxPbmx5ID0gbG9jYWxPbmx5OworICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBtRHJhZ1N0YXRlLm1Ub2tlbiA9IG5ldyBCaW5kZXIoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gNSBzZWNvbmQgdGltZW91dCBmb3IgdGhpcyB3aW5kb3cgdG8gYWN0dWFsbHkgYmVnaW4gdGhlIGRyYWcKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ILnJlbW92ZU1lc3NhZ2VzKEguRFJBR19TVEFSVF9USU1FT1VULCB3aW5kb3cpOworICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSC5vYnRhaW5NZXNzYWdlKEguRFJBR19TVEFSVF9USU1FT1VULCB3aW5kb3cuYXNCaW5kZXIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtSC5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCA1MDAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJEcmFnIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFN1cmZhY2UuT3V0T2ZSZXNvdXJjZXNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiQ2FuJ3QgYWxsb2NhdGUgZHJhZyBzdXJmYWNlIHc9IiArIHdpZHRoICsgIiBoPSIgKyBoZWlnaHQsIGUpOworICAgICAgICAgICAgICAgICAgICBpZiAobURyYWdTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRHJhZ1N0YXRlLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRHJhZ1N0YXRlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KG9yaWdJZCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdG9rZW47CisgICAgfQorCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vIElucHV0IEV2ZW50cyBhbmQgRm9jdXMgTWFuYWdlbWVudAogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTUxNTQsNyArNTUyNiw0MiBAQAogICAgICAgICAgICAgCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICAKKworICAgICAgICBwcml2YXRlIHZvaWQgYWRkRHJhZ0lucHV0V2luZG93KElucHV0V2luZG93TGlzdCB3aW5kb3dMaXN0KSB7CisgICAgICAgICAgICBmaW5hbCBJbnB1dFdpbmRvdyBpbnB1dFdpbmRvdyA9IHdpbmRvd0xpc3QuYWRkKCk7CisgICAgICAgICAgICBpbnB1dFdpbmRvdy5pbnB1dENoYW5uZWwgPSBtRHJhZ1N0YXRlLm1TZXJ2ZXJDaGFubmVsOworICAgICAgICAgICAgaW5wdXRXaW5kb3cubmFtZSA9ICJkcmFnIjsKKyAgICAgICAgICAgIGlucHV0V2luZG93LmxheW91dFBhcmFtc0ZsYWdzID0gMDsKKyAgICAgICAgICAgIGlucHV0V2luZG93LmxheW91dFBhcmFtc1R5cGUgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX0RSQUc7CisgICAgICAgICAgICBpbnB1dFdpbmRvdy5kaXNwYXRjaGluZ1RpbWVvdXROYW5vcyA9IERFRkFVTFRfSU5QVVRfRElTUEFUQ0hJTkdfVElNRU9VVF9OQU5PUzsKKyAgICAgICAgICAgIGlucHV0V2luZG93LnZpc2libGUgPSB0cnVlOworICAgICAgICAgICAgaW5wdXRXaW5kb3cuY2FuUmVjZWl2ZUtleXMgPSBmYWxzZTsKKyAgICAgICAgICAgIGlucHV0V2luZG93Lmhhc0ZvY3VzID0gdHJ1ZTsKKyAgICAgICAgICAgIGlucHV0V2luZG93Lmhhc1dhbGxwYXBlciA9IGZhbHNlOworICAgICAgICAgICAgaW5wdXRXaW5kb3cucGF1c2VkID0gZmFsc2U7CisgICAgICAgICAgICBpbnB1dFdpbmRvdy5sYXllciA9IG1Qb2xpY3kud2luZG93VHlwZVRvTGF5ZXJMdyhpbnB1dFdpbmRvdy5sYXlvdXRQYXJhbXNUeXBlKQorICAgICAgICAgICAgICAgICAgICAqIFRZUEVfTEFZRVJfTVVMVElQTElFUgorICAgICAgICAgICAgICAgICAgICArIFRZUEVfTEFZRVJfT0ZGU0VUOworICAgICAgICAgICAgaW5wdXRXaW5kb3cub3duZXJQaWQgPSBQcm9jZXNzLm15UGlkKCk7CisgICAgICAgICAgICBpbnB1dFdpbmRvdy5vd25lclVpZCA9IFByb2Nlc3MubXlVaWQoKTsKKworICAgICAgICAgICAgLy8gVGhlIGRyYWcgd2luZG93IGNvdmVycyB0aGUgZW50aXJlIGRpc3BsYXkKKyAgICAgICAgICAgIGlucHV0V2luZG93LmZyYW1lTGVmdCA9IDA7CisgICAgICAgICAgICBpbnB1dFdpbmRvdy5mcmFtZVRvcCA9IDA7CisgICAgICAgICAgICBpbnB1dFdpbmRvdy5mcmFtZVJpZ2h0ID0gbURpc3BsYXkuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIGlucHV0V2luZG93LmZyYW1lQm90dG9tID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7CisKKyAgICAgICAgICAgIGlucHV0V2luZG93LnZpc2libGVGcmFtZUxlZnQgPSBpbnB1dFdpbmRvdy5mcmFtZUxlZnQ7CisgICAgICAgICAgICBpbnB1dFdpbmRvdy52aXNpYmxlRnJhbWVUb3AgPSBpbnB1dFdpbmRvdy5mcmFtZVRvcDsKKyAgICAgICAgICAgIGlucHV0V2luZG93LnZpc2libGVGcmFtZVJpZ2h0ID0gaW5wdXRXaW5kb3cuZnJhbWVSaWdodDsKKyAgICAgICAgICAgIGlucHV0V2luZG93LnZpc2libGVGcmFtZUJvdHRvbSA9IGlucHV0V2luZG93LmZyYW1lQm90dG9tOworCisgICAgICAgICAgICBpbnB1dFdpbmRvdy50b3VjaGFibGVBcmVhTGVmdCA9IGlucHV0V2luZG93LmZyYW1lTGVmdDsKKyAgICAgICAgICAgIGlucHV0V2luZG93LnRvdWNoYWJsZUFyZWFUb3AgPSBpbnB1dFdpbmRvdy5mcmFtZVRvcDsKKyAgICAgICAgICAgIGlucHV0V2luZG93LnRvdWNoYWJsZUFyZWFSaWdodCA9IGlucHV0V2luZG93LmZyYW1lUmlnaHQ7CisgICAgICAgICAgICBpbnB1dFdpbmRvdy50b3VjaGFibGVBcmVhQm90dG9tID0gaW5wdXRXaW5kb3cuZnJhbWVCb3R0b207CisgICAgICAgIH0KKwogICAgICAgICAvKiBVcGRhdGVzIHRoZSBjYWNoZWQgd2luZG93IGluZm9ybWF0aW9uIHByb3ZpZGVkIHRvIHRoZSBpbnB1dCBkaXNwYXRjaGVyLiAqLwogICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVJbnB1dFdpbmRvd3NMdygpIHsKICAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZSBpbnB1dCB3aW5kb3cgbGlzdCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGFsbCBvZiB0aGUgd2luZG93cyB0aGF0CkBAIC01MTYzLDYgKzU1NzAsMTYgQEAKICAgICAgICAgICAgIC8vIG91dCB0byBiZSBkaWZmaWN1bHQgYmVjYXVzZSBvbmx5IHRoZSBuYXRpdmUgY29kZSBrbm93cyBmb3Igc3VyZSB3aGljaCB3aW5kb3cKICAgICAgICAgICAgIC8vIGN1cnJlbnRseSBoYXMgdG91Y2ggZm9jdXMuCiAgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8V2luZG93U3RhdGU+IHdpbmRvd3MgPSBtV2luZG93czsKKworICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhIGRyYWcgaW4gZmxpZ2h0LCBwcm92aWRlIGEgcHNldWRvd2luZG93IHRvIGNhdGNoIGRyYWcgaW5wdXQKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5EcmFnID0gKG1EcmFnU3RhdGUgIT0gbnVsbCk7CisgICAgICAgICAgICBpZiAoaW5EcmFnKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHX0RSQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiSW5zZXJ0aW5nIGRyYWcgd2luZG93Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZERyYWdJbnB1dFdpbmRvdyhtVGVtcElucHV0V2luZG93cyk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gd2luZG93cy5zaXplKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gTiAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgV2luZG93U3RhdGUgY2hpbGQgPSB3aW5kb3dzLmdldChpKTsKQEAgLTUxNzgsNyArNTU5NSwxMyBAQAogICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNWaXNpYmxlID0gY2hpbGQuaXNWaXNpYmxlTHcoKTsKICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGhhc1dhbGxwYXBlciA9IChjaGlsZCA9PSBtV2FsbHBhcGVyVGFyZ2V0KQogICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHR5cGUgIT0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9LRVlHVUFSRCk7Ci0gICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGEgZHJhZyBpbiBwcm9ncmVzcyBhbmQgJ2NoaWxkJyBpcyBhIHBvdGVudGlhbCBkcm9wIHRhcmdldCwKKyAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgaXQncyBiZWVuIHRvbGQgYWJvdXQgdGhlIGRyYWcKKyAgICAgICAgICAgICAgICBpZiAoaW5EcmFnICYmIGlzVmlzaWJsZSkgeworICAgICAgICAgICAgICAgICAgICBtRHJhZ1N0YXRlLnNlbmREcmFnU3RhcnRlZElmTmVlZGVkTHcoY2hpbGQpOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIC8vIEFkZCBhIHdpbmRvdyB0byBvdXIgbGlzdCBvZiBpbnB1dCB3aW5kb3dzLgogICAgICAgICAgICAgICAgIGZpbmFsIElucHV0V2luZG93IGlucHV0V2luZG93ID0gbVRlbXBJbnB1dFdpbmRvd3MuYWRkKCk7CiAgICAgICAgICAgICAgICAgaW5wdXRXaW5kb3cuaW5wdXRDaGFubmVsID0gY2hpbGQubUlucHV0Q2hhbm5lbDsKQEAgLTU1NjksNiArNTk5MiwyMiBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN5c3RlbVJlYWR5KCkgeworICAgICAgICBzeW5jaHJvbml6ZWQobVdpbmRvd01hcCkgeworICAgICAgICAgICAgaWYgKG1EaXNwbGF5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJEaXNwbGF5IGFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFdpbmRvd01hbmFnZXIgd20gPSAoV2luZG93TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOworICAgICAgICAgICAgbURpc3BsYXkgPSB3bS5nZXREZWZhdWx0RGlzcGxheSgpOworICAgICAgICAgICAgbUluaXRpYWxEaXNwbGF5V2lkdGggPSBtRGlzcGxheS5nZXRXaWR0aCgpOworICAgICAgICAgICAgbUluaXRpYWxEaXNwbGF5SGVpZ2h0ID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBtSW5wdXRNYW5hZ2VyLnNldERpc3BsYXlTaXplKDAsIG1Jbml0aWFsRGlzcGxheVdpZHRoLCBtSW5pdGlhbERpc3BsYXlIZWlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1BY3Rpdml0eU1hbmFnZXIudXBkYXRlQ29uZmlndXJhdGlvbihudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICAKICAgICAgICAgbVBvbGljeS5zeXN0ZW1SZWFkeSgpOwogICAgIH0KIApAQCAtNTczNCw2ICs2MTczLDg2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICAvKiBEcmFnL2Ryb3AgKi8KKyAgICAgICAgcHVibGljIElCaW5kZXIgcHJlcGFyZURyYWcoSVdpbmRvdyB3aW5kb3csIGJvb2xlYW4gbG9jYWxPbmx5LAorICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgU3VyZmFjZSBvdXRTdXJmYWNlKSB7CisgICAgICAgICAgICByZXR1cm4gcHJlcGFyZURyYWdTdXJmYWNlKHdpbmRvdywgbVN1cmZhY2VTZXNzaW9uLCBsb2NhbE9ubHksCisgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIG91dFN1cmZhY2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybURyYWcoSVdpbmRvdyB3aW5kb3csIElCaW5kZXIgZHJhZ1Rva2VuLAorICAgICAgICAgICAgICAgIGZsb2F0IHRvdWNoWCwgZmxvYXQgdG91Y2hZLCBmbG9hdCB0aHVtYkNlbnRlclgsIGZsb2F0IHRodW1iQ2VudGVyWSwKKyAgICAgICAgICAgICAgICBDbGlwRGF0YSBkYXRhKSB7CisgICAgICAgICAgICBpZiAoREVCVUdfRFJBRykgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJwZXJmb3JtIGRyYWc6IHdpbj0iICsgd2luZG93ICsgIiBkYXRhPSIgKyBkYXRhKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2luZG93TWFwKSB7CisgICAgICAgICAgICAgICAgaWYgKG1EcmFnU3RhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiTm8gZHJhZyBwcmVwYXJlZCIpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwZXJmb3JtRHJhZygpIHdpdGhvdXQgcHJlcGFyZURyYWcoKSIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChkcmFnVG9rZW4gIT0gbURyYWdTdGF0ZS5tVG9rZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlBlcmZvcm1pbmcgbWlzbWF0Y2hlZCBkcmFnIik7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInBlcmZvcm1EcmFnKCkgZG9lcyBub3QgbWF0Y2ggcHJlcGFyZURyYWcoKSIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFdpbmRvd1N0YXRlIGNhbGxpbmdXaW4gPSB3aW5kb3dGb3JDbGllbnRMb2NrZWQobnVsbCwgd2luZG93LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKGNhbGxpbmdXaW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiQmFkIHJlcXVlc3Rpbmcgd2luZG93ICIgKyB3aW5kb3cpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyAhISEgVE9ETzogdGhyb3cgaGVyZT8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyAhISEgVE9ETzogaWYgaW5wdXQgaXMgbm90IHN0aWxsIGZvY3VzZWQgb24gdGhlIGluaXRpYXRpbmcgd2luZG93LCBmYWlsCisgICAgICAgICAgICAgICAgLy8gdGhlIGRyYWcgaW5pdGlhdGlvbiAoZS5nLiBhbiBhbGFybSB3aW5kb3cgcG9wcGVkIHVwIGp1c3QgYXMgdGhlIGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgLy8gY2FsbGVkIHBlcmZvcm1EcmFnKCkKKworICAgICAgICAgICAgICAgIG1ILnJlbW92ZU1lc3NhZ2VzKEguRFJBR19TVEFSVF9USU1FT1VULCB3aW5kb3cuYXNCaW5kZXIoKSk7CisKKyAgICAgICAgICAgICAgICAvLyAhISEgVE9ETzogZXh0cmFjdCB0aGUgY3VycmVudCB0b3VjaCAoeCwgeSkgaW4gc2NyZWVuIGNvb3JkaW5hdGVzLiAgVGhhdAorICAgICAgICAgICAgICAgIC8vIHdpbGwgbGV0IHVzIGVsaW1pbmF0ZSB0aGUgKHRvdWNoWCx0b3VjaFkpIHBhcmFtZXRlcnMgZnJvbSB0aGUgQVBJLgorCisgICAgICAgICAgICAgICAgbURyYWdTdGF0ZS5yZWdpc3RlcigpOworICAgICAgICAgICAgICAgIG1JbnB1dE1vbml0b3IudXBkYXRlSW5wdXRXaW5kb3dzTHcoKTsKKyAgICAgICAgICAgICAgICBtSW5wdXRNYW5hZ2VyLnRyYW5zZmVyVG91Y2hGb2N1cyhjYWxsaW5nV2luLm1JbnB1dENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBtRHJhZ1N0YXRlLm1TZXJ2ZXJDaGFubmVsKTsKKworICAgICAgICAgICAgICAgIG1EcmFnU3RhdGUubURhdGEgPSBkYXRhOworICAgICAgICAgICAgICAgIG1EcmFnU3RhdGUuYnJvYWRjYXN0RHJhZ1N0YXJ0ZWRMdygpOworCisgICAgICAgICAgICAgICAgLy8gcmVtZW1iZXIgdGhlIHRodW1iIG9mZnNldHMgZm9yIGxhdGVyCisgICAgICAgICAgICAgICAgbURyYWdTdGF0ZS5tVGh1bWJPZmZzZXRYID0gdGh1bWJDZW50ZXJYOworICAgICAgICAgICAgICAgIG1EcmFnU3RhdGUubVRodW1iT2Zmc2V0WSA9IHRodW1iQ2VudGVyWTsKKworICAgICAgICAgICAgICAgIC8vIE1ha2UgdGhlIHN1cmZhY2UgdmlzaWJsZSBhdCB0aGUgcHJvcGVyIGxvY2F0aW9uCisgICAgICAgICAgICAgICAgZmluYWwgU3VyZmFjZSBzdXJmYWNlID0gbURyYWdTdGF0ZS5tU3VyZmFjZTsKKyAgICAgICAgICAgICAgICBzdXJmYWNlLm9wZW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN1cmZhY2Uuc2V0UG9zaXRpb24oKGludCkodG91Y2hYIC0gdGh1bWJDZW50ZXJYKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSh0b3VjaFkgLSB0aHVtYkNlbnRlclkpKTsKKyAgICAgICAgICAgICAgICAgICAgc3VyZmFjZS5zZXRBbHBoYSguNWYpOworICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLnNob3coKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLmNsb3NlVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAgICAvLyBzdWNjZXNzIQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZHJhZ1JlY2lwaWVudEVudGVyZWQoSVdpbmRvdyB3aW5kb3cpIHsKKyAgICAgICAgICAgIGlmIChERUJVR19EUkFHKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRyYWcgaW50byBuZXcgY2FuZGlkYXRlIHZpZXcgQCAiICsgd2luZG93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGRyYWdSZWNpcGllbnRFeGl0ZWQoSVdpbmRvdyB3aW5kb3cpIHsKKyAgICAgICAgICAgIGlmIChERUJVR19EUkFHKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRyYWcgZnJvbSBvbGQgY2FuZGlkYXRlIHZpZXcgQCAiICsgd2luZG93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldFdhbGxwYXBlclBvc2l0aW9uKElCaW5kZXIgd2luZG93LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB4U3RlcCwgZmxvYXQgeVN0ZXApIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZChtV2luZG93TWFwKSB7CiAgICAgICAgICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwpAQCAtNjg0OSw3ICs3MzY4LDcgQEAKICAgICAgICAgICAgIGZpbmFsIEFwcFdpbmRvd1Rva2VuIGF0b2tlbiA9IG1BcHBUb2tlbjsKICAgICAgICAgICAgIHJldHVybiBtU3VyZmFjZSAhPSBudWxsICYmICFtQXR0YWNoZWRIaWRkZW4KICAgICAgICAgICAgICAgICAgICAgJiYgKGF0b2tlbiA9PSBudWxsID8gbVBvbGljeVZpc2liaWxpdHkgOiAhYXRva2VuLmhpZGRlblJlcXVlc3RlZCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKG1PcmllbnRhdGlvbkNoYW5naW5nIHx8ICghbURyYXdQZW5kaW5nICYmICFtQ29tbWl0RHJhd1BlbmRpbmcpKQorICAgICAgICAgICAgICAgICAgICAmJiAhbURyYXdQZW5kaW5nICYmICFtQ29tbWl0RHJhd1BlbmRpbmcKICAgICAgICAgICAgICAgICAgICAgJiYgIW1FeGl0aW5nICYmICFtRGVzdHJveWluZzsKICAgICAgICAgfQogCkBAIC02ODc1LDYgKzczOTQsMTUgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBDYW4gdGhpcyB3aW5kb3cgcG9zc2libHkgYmUgYSBkcmFnL2Ryb3AgdGFyZ2V0PyAgVGhlIHRlc3QgaGVyZSBpcworICAgICAgICAgKiBhIGNvbWJpbmF0aW9uIG9mIHRoZSBhYm92ZSAidmlzaWJsZSBub3ciIHdpdGggdGhlIGNoZWNrIHRoYXQgdGhlCisgICAgICAgICAqIElucHV0IE1hbmFnZXIgdXNlcyB3aGVuIGRpc2NhcmRpbmcgd2luZG93cyBmcm9tIGlucHV0IGNvbnNpZGVyYXRpb24uCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIGlzUG90ZW50aWFsRHJhZ1RhcmdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBpc1Zpc2libGVOb3coKSAmJiAobUlucHV0Q2hhbm5lbCAhPSBudWxsKSAmJiAhbVJlbW92ZWQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKICAgICAgICAgICogU2FtZSBhcyBpc1Zpc2libGUoKSwgYnV0IHdlIGFsc28gY291bnQgaXQgYXMgdmlzaWJsZSBiZXR3ZWVuIHRoZQogICAgICAgICAgKiBjYWxsIHRvIElXaW5kb3dTZXNzaW9uLmFkZCgpIGFuZCB0aGUgZmlyc3QgcmVsYXlvdXQoKS4KICAgICAgICAgICovCkBAIC02OTUzLDE0ICs3NDgxLDEyIEBACiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGhhcyBhIHN1cmZhY2UgdGhhdCBpdCBoYXMgZHJhd24gYQotICAgICAgICAgKiBjb21wbGV0ZSBVSSBpbiB0by4gIE5vdGUgdGhhdCB0aGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgb3JpZW50YXRpb24KLSAgICAgICAgICogaXMgY2hhbmdpbmcgZXZlbiBpZiB0aGUgd2luZG93IGhhc24ndCByZWRyYXduIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudAotICAgICAgICAgKiB0byBzdG9wIHRoaW5ncyBmcm9tIGV4ZWN1dGluZyBkdXJpbmcgdGhhdCB0aW1lLgorICAgICAgICAgKiBjb21wbGV0ZSBVSSBpbiB0by4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRHJhd25MdygpIHsKICAgICAgICAgICAgIGZpbmFsIEFwcFdpbmRvd1Rva2VuIGF0b2tlbiA9IG1BcHBUb2tlbjsKICAgICAgICAgICAgIHJldHVybiBtU3VyZmFjZSAhPSBudWxsICYmICFtRGVzdHJveWluZwotICAgICAgICAgICAgICAgICYmIChtT3JpZW50YXRpb25DaGFuZ2luZyB8fCAoIW1EcmF3UGVuZGluZyAmJiAhbUNvbW1pdERyYXdQZW5kaW5nKSk7CisgICAgICAgICAgICAgICAgJiYgIW1EcmF3UGVuZGluZyAmJiAhbUNvbW1pdERyYXdQZW5kaW5nOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC03Nzc3LDYgKzgzMDMsNyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBfRlJFRVpFX1RJTUVPVVQgPSAxNzsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VORF9ORVdfQ09ORklHVVJBVElPTiA9IDE4OwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBPUlRfV0lORE9XU19DSEFOR0UgPSAxOTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFJBR19TVEFSVF9USU1FT1VUID0gMjA7CiAKICAgICAgICAgcHJpdmF0ZSBTZXNzaW9uIG1MYXN0UmVwb3J0ZWRIb2xkOwogCkBAIC04MTE5LDYgKzg2NDYsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgY2FzZSBEUkFHX1NUQVJUX1RJTUVPVVQ6IHsKKyAgICAgICAgICAgICAgICAgICAgSUJpbmRlciB3aW4gPSAoSUJpbmRlciltc2cub2JqOworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfRFJBRykgeworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlRpbWVvdXQgc3RhcnRpbmcgZHJhZyBieSB3aW4gIiArIHdpbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2luZG93TWFwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAhISEgVE9ETzogQU5SIHRoZSBhcHAgdGhhdCBoYXMgZmFpbGVkIHRvIHN0YXJ0IHRoZSBkcmFnIGluIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRHJhZ1N0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJhZ1N0YXRlLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyYWdTdGF0ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTg0NjEsNiArOTAwMiwxMSBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHBlcmZvcm1MYXlvdXRBbmRQbGFjZVN1cmZhY2VzTG9ja2VkSW5uZXIoCiAgICAgICAgICAgICBib29sZWFuIHJlY292ZXJpbmdNZW1vcnkpIHsKKyAgICAgICAgaWYgKG1EaXNwbGF5ID09IG51bGwpIHsKKyAgICAgICAgICAgIFNsb2cuaShUQUcsICJza2lwcGluZyBwZXJmb3JtTGF5b3V0QW5kUGxhY2VTdXJmYWNlc0xvY2tlZElubmVyIHdpdGggbm8gbURpc3BsYXkiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIGZpbmFsIGxvbmcgY3VycmVudFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgZmluYWwgaW50IGR3ID0gbURpc3BsYXkuZ2V0V2lkdGgoKTsKICAgICAgICAgZmluYWwgaW50IGRoID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7CkBAIC05MjQ5LDEyICs5Nzk1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHcubUF0dGFjaGVkSGlkZGVuIHx8ICF3LmlzUmVhZHlGb3JEaXNwbGF5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdy5tTGFzdEhpZGRlbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19DT05GSUdVUkFUSU9OKSBTbG9nLnYoVEFHLCAiV2luZG93IGhpZGluZzogd2FpdGluZ1RvU2hvdz0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHcubVJvb3RUb2tlbi53YWl0aW5nVG9TaG93ICsgIiBwb2x2aXM9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3Lm1Qb2xpY3lWaXNpYmlsaXR5ICsgIiBhdHRoaWQ9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3Lm1BdHRhY2hlZEhpZGRlbiArICIgdG9raGlkPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdy5tUm9vdFRva2VuLmhpZGRlbiArICIgdmlzPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdy5tVmlld1Zpc2liaWxpdHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcubUxhc3RIaWRkZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTSE9XX1RSQU5TQUNUSU9OUykgbG9nU3VyZmFjZSh3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhJREUgKHBlcmZvcm1MYXlvdXQpIiwgbnVsbCk7CkBAIC05NjU1LDMwICsxMDE5NSwyNiBAQAogICAgICAgICB9IGVsc2UgaWYgKGFuaW1hdGluZykgewogICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkxvY2tlZChjdXJyZW50VGltZSsoMTAwMC82MCktU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIG1JbnB1dE1vbml0b3IudXBkYXRlSW5wdXRXaW5kb3dzTHcoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChERUJVR19GUkVFWkUpIFNsb2cudihUQUcsICJMYXlvdXQ6IG1EaXNwbGF5RnJvemVuPSIgKyBtRGlzcGxheUZyb3plbgotICAgICAgICAgICAgICAgICsgIiBob2xkU2NyZWVuPSIgKyBob2xkU2NyZWVuKTsKLSAgICAgICAgaWYgKCFtRGlzcGxheUZyb3plbikgewotICAgICAgICAgICAgc2V0SG9sZFNjcmVlbkxvY2tlZChob2xkU2NyZWVuICE9IG51bGwpOwotICAgICAgICAgICAgaWYgKHNjcmVlbkJyaWdodG5lc3MgPCAwIHx8IHNjcmVlbkJyaWdodG5lc3MgPiAxLjBmKSB7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRTY3JlZW5CcmlnaHRuZXNzT3ZlcnJpZGUoLTEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldFNjcmVlbkJyaWdodG5lc3NPdmVycmlkZSgoaW50KQotICAgICAgICAgICAgICAgICAgICAgICAgKHNjcmVlbkJyaWdodG5lc3MgKiBQb3dlci5CUklHSFRORVNTX09OKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYnV0dG9uQnJpZ2h0bmVzcyA8IDAgfHwgYnV0dG9uQnJpZ2h0bmVzcyA+IDEuMGYpIHsKLSAgICAgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldEJ1dHRvbkJyaWdodG5lc3NPdmVycmlkZSgtMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuc2V0QnV0dG9uQnJpZ2h0bmVzc092ZXJyaWRlKChpbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAoYnV0dG9uQnJpZ2h0bmVzcyAqIFBvd2VyLkJSSUdIVE5FU1NfT04pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChob2xkU2NyZWVuICE9IG1Ib2xkaW5nU2NyZWVuT24pIHsKLSAgICAgICAgICAgICAgICBtSG9sZGluZ1NjcmVlbk9uID0gaG9sZFNjcmVlbjsKLSAgICAgICAgICAgICAgICBNZXNzYWdlIG0gPSBtSC5vYnRhaW5NZXNzYWdlKEguSE9MRF9TQ1JFRU5fQ0hBTkdFRCwgaG9sZFNjcmVlbik7Ci0gICAgICAgICAgICAgICAgbUguc2VuZE1lc3NhZ2UobSk7Ci0gICAgICAgICAgICB9CisKKyAgICAgICAgc2V0SG9sZFNjcmVlbkxvY2tlZChob2xkU2NyZWVuICE9IG51bGwpOworICAgICAgICBpZiAoc2NyZWVuQnJpZ2h0bmVzcyA8IDAgfHwgc2NyZWVuQnJpZ2h0bmVzcyA+IDEuMGYpIHsKKyAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuc2V0U2NyZWVuQnJpZ2h0bmVzc092ZXJyaWRlKC0xKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuc2V0U2NyZWVuQnJpZ2h0bmVzc092ZXJyaWRlKChpbnQpCisgICAgICAgICAgICAgICAgICAgIChzY3JlZW5CcmlnaHRuZXNzICogUG93ZXIuQlJJR0hUTkVTU19PTikpOworICAgICAgICB9CisgICAgICAgIGlmIChidXR0b25CcmlnaHRuZXNzIDwgMCB8fCBidXR0b25CcmlnaHRuZXNzID4gMS4wZikgeworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRCdXR0b25CcmlnaHRuZXNzT3ZlcnJpZGUoLTEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRCdXR0b25CcmlnaHRuZXNzT3ZlcnJpZGUoKGludCkKKyAgICAgICAgICAgICAgICAgICAgKGJ1dHRvbkJyaWdodG5lc3MgKiBQb3dlci5CUklHSFRORVNTX09OKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhvbGRTY3JlZW4gIT0gbUhvbGRpbmdTY3JlZW5PbikgeworICAgICAgICAgICAgbUhvbGRpbmdTY3JlZW5PbiA9IGhvbGRTY3JlZW47CisgICAgICAgICAgICBNZXNzYWdlIG0gPSBtSC5vYnRhaW5NZXNzYWdlKEguSE9MRF9TQ1JFRU5fQ0hBTkdFRCwgaG9sZFNjcmVlbik7CisgICAgICAgICAgICBtSC5zZW5kTWVzc2FnZShtKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtVHVybk9uU2NyZWVuKSB7CkBAIC05OTY3LDggKzEwNTAzLDYgQEAKICAgICAgICAgICAgIG1GcmVlemVHY1BlbmRpbmcgPSBub3c7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoREVCVUdfRlJFRVpFKSBTbG9nLnYoVEFHLCAiKioqIEZSRUVaSU5HIERJU1BMQVkiLCBuZXcgUnVudGltZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgCiAgICAgICAgIG1EaXNwbGF5RnJvemVuID0gdHJ1ZTsKICAgICAgICAgCiAgICAgICAgIG1JbnB1dE1vbml0b3IuZnJlZXplSW5wdXREaXNwYXRjaGluZ0x3KCk7CkBAIC05OTk1LDggKzEwNTI5LDYgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICAKLSAgICAgICAgaWYgKERFQlVHX0ZSRUVaRSkgU2xvZy52KFRBRywgIioqKiBVTkZSRUVaSU5HIERJU1BMQVkiLCBuZXcgUnVudGltZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgCiAgICAgICAgIG1EaXNwbGF5RnJvemVuID0gZmFsc2U7CiAgICAgICAgIG1ILnJlbW92ZU1lc3NhZ2VzKEguQVBQX0ZSRUVaRV9USU1FT1VUKTsKICAgICAgICAgaWYgKFBST0ZJTEVfT1JJRU5UQVRJT04pIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCBiMmNiYmI2Li5kMDA4YzkwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yNDUxLDYgKzI0NTEsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAogICAgICAgICAgICAgaWYgKHByb2MudGhyZWFkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvYy5waWQgPT0gUHJvY2Vzcy5teVBpZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgImNyYXNoQXBwbGljYXRpb246IHRyeWluZyB0byBjcmFzaCBzZWxmISIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBwcm9jLnRocmVhZC5zY2hlZHVsZUNyYXNoKG1lc3NhZ2UpOwpAQCAtNDM0Niw4ICs0MzUwLDEwIEBACiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoREVCVUdfVVJJX1BFUk1JU1NJT04pIFNsb2cudihUQUcsIAotICAgICAgICAgICAgICAgICJDaGVja2luZyBncmFudCAiICsgdGFyZ2V0UGtnICsgIiBwZXJtaXNzaW9uIHRvICIgKyB1cmkpOworICAgICAgICBpZiAodGFyZ2V0UGtnICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChERUJVR19VUklfUEVSTUlTU0lPTikgU2xvZy52KFRBRywKKyAgICAgICAgICAgICAgICAgICAgIkNoZWNraW5nIGdyYW50ICIgKyB0YXJnZXRQa2cgKyAiIHBlcm1pc3Npb24gdG8gIiArIHVyaSk7CisgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIGZpbmFsIElQYWNrYWdlTWFuYWdlciBwbSA9IEFwcEdsb2JhbHMuZ2V0UGFja2FnZU1hbmFnZXIoKTsKIApAQCAtNDM3NiwyMyArNDM4Miw0NSBAQAogICAgICAgICB9CiAKICAgICAgICAgaW50IHRhcmdldFVpZDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRhcmdldFVpZCA9IHBtLmdldFBhY2thZ2VVaWQodGFyZ2V0UGtnKTsKLSAgICAgICAgICAgIGlmICh0YXJnZXRVaWQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHX1VSSV9QRVJNSVNTSU9OKSBTbG9nLnYoVEFHLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBncmFudCBVUkkgcGVybWlzc2lvbiBubyB1aWQgZm9yOiAiICsgdGFyZ2V0UGtnKTsKKyAgICAgICAgaWYgKHRhcmdldFBrZyAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRhcmdldFVpZCA9IHBtLmdldFBhY2thZ2VVaWQodGFyZ2V0UGtnKTsKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0VWlkIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfVVJJX1BFUk1JU1NJT04pIFNsb2cudihUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGdyYW50IFVSSSBwZXJtaXNzaW9uIG5vIHVpZCBmb3I6ICIgKyB0YXJnZXRQa2cpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRhcmdldFVpZCA9IC0xOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gRmlyc3QuLi4gIGRvZXMgdGhlIHRhcmdldCBhY3R1YWxseSBuZWVkIHRoaXMgcGVybWlzc2lvbj8KLSAgICAgICAgaWYgKGNoZWNrSG9sZGluZ1Blcm1pc3Npb25zTG9ja2VkKHBtLCBwaSwgdXJpLCB0YXJnZXRVaWQsIG1vZGVGbGFncykpIHsKLSAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gZ3JhbnQgdGhlIHRhcmdldCB0aGlzIHBlcm1pc3Npb24uCi0gICAgICAgICAgICBpZiAoREVCVUdfVVJJX1BFUk1JU1NJT04pIFNsb2cudihUQUcsIAotICAgICAgICAgICAgICAgICAgICAiVGFyZ2V0ICIgKyB0YXJnZXRQa2cgKyAiIGFscmVhZHkgaGFzIGZ1bGwgcGVybWlzc2lvbiB0byAiICsgdXJpKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHRhcmdldFVpZCA+PSAwKSB7CisgICAgICAgICAgICAvLyBGaXJzdC4uLiAgZG9lcyB0aGUgdGFyZ2V0IGFjdHVhbGx5IG5lZWQgdGhpcyBwZXJtaXNzaW9uPworICAgICAgICAgICAgaWYgKGNoZWNrSG9sZGluZ1Blcm1pc3Npb25zTG9ja2VkKHBtLCBwaSwgdXJpLCB0YXJnZXRVaWQsIG1vZGVGbGFncykpIHsKKyAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGdyYW50IHRoZSB0YXJnZXQgdGhpcyBwZXJtaXNzaW9uLgorICAgICAgICAgICAgICAgIGlmIChERUJVR19VUklfUEVSTUlTU0lPTikgU2xvZy52KFRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICJUYXJnZXQgIiArIHRhcmdldFBrZyArICIgYWxyZWFkeSBoYXMgZnVsbCBwZXJtaXNzaW9uIHRvICIgKyB1cmkpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEZpcnN0Li4uICB0aGVyZSBpcyBubyB0YXJnZXQgcGFja2FnZSwgc28gY2FuIGFueW9uZSBhY2Nlc3MgaXQ/CisgICAgICAgICAgICBib29sZWFuIGFsbG93ZWQgPSBwaS5leHBvcnRlZDsKKyAgICAgICAgICAgIGlmICgobW9kZUZsYWdzJkludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04pICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocGkucmVhZFBlcm1pc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhbGxvd2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChtb2RlRmxhZ3MmSW50ZW50LkZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04pICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocGkud3JpdGVQZXJtaXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhbGxvd2VkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gU2Vjb25kLi4uICBpcyB0aGUgcHJvdmlkZXIgYWxsb3dpbmcgZ3JhbnRpbmcgb2YgVVJJIHBlcm1pc3Npb25zPwpAQCAtNDQyMiwxNiArNDQ1MCwyNSBAQAogCiAgICAgICAgIC8vIFRoaXJkLi4uICBkb2VzIHRoZSBjYWxsZXIgaXRzZWxmIGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MKICAgICAgICAgLy8gdGhpcyB1cmk/Ci0gICAgICAgIGlmICghY2hlY2tIb2xkaW5nUGVybWlzc2lvbnNMb2NrZWQocG0sIHBpLCB1cmksIGNhbGxpbmdVaWQsIG1vZGVGbGFncykpIHsKLSAgICAgICAgICAgIGlmICghY2hlY2tVcmlQZXJtaXNzaW9uTG9ja2VkKHVyaSwgY2FsbGluZ1VpZCwgbW9kZUZsYWdzKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiVWlkICIgKyBjYWxsaW5nVWlkCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHVyaSAiICsgdXJpKTsKKyAgICAgICAgaWYgKGNhbGxpbmdVaWQgIT0gUHJvY2Vzcy5teVVpZCgpKSB7CisgICAgICAgICAgICBpZiAoIWNoZWNrSG9sZGluZ1Blcm1pc3Npb25zTG9ja2VkKHBtLCBwaSwgdXJpLCBjYWxsaW5nVWlkLCBtb2RlRmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjaGVja1VyaVBlcm1pc3Npb25Mb2NrZWQodXJpLCBjYWxsaW5nVWlkLCBtb2RlRmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiVWlkICIgKyBjYWxsaW5nVWlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byB1cmkgIiArIHVyaSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHRhcmdldFVpZDsKICAgICB9CiAKKyAgICBwdWJsaWMgaW50IGNoZWNrR3JhbnRVcmlQZXJtaXNzaW9uKGludCBjYWxsaW5nVWlkLCBTdHJpbmcgdGFyZ2V0UGtnLAorICAgICAgICAgICAgVXJpIHVyaSwgaW50IG1vZGVGbGFncykgeworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIGNoZWNrR3JhbnRVcmlQZXJtaXNzaW9uTG9ja2VkKGNhbGxpbmdVaWQsIHRhcmdldFBrZywgdXJpLCBtb2RlRmxhZ3MpOworICAgICAgICB9CisgICAgfQorCiAgICAgdm9pZCBncmFudFVyaVBlcm1pc3Npb25VbmNoZWNrZWRMb2NrZWQoaW50IHRhcmdldFVpZCwgU3RyaW5nIHRhcmdldFBrZywKICAgICAgICAgICAgIFVyaSB1cmksIGludCBtb2RlRmxhZ3MsIFVyaVBlcm1pc3Npb25Pd25lciBvd25lcikgewogICAgICAgICBtb2RlRmxhZ3MgJj0gKEludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04KQEAgLTQ0NzQsNiArNDUxMSwxMCBAQAogCiAgICAgdm9pZCBncmFudFVyaVBlcm1pc3Npb25Mb2NrZWQoaW50IGNhbGxpbmdVaWQsCiAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UGtnLCBVcmkgdXJpLCBpbnQgbW9kZUZsYWdzLCBVcmlQZXJtaXNzaW9uT3duZXIgb3duZXIpIHsKKyAgICAgICAgaWYgKHRhcmdldFBrZyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInRhcmdldFBrZyIpOworICAgICAgICB9CisKICAgICAgICAgaW50IHRhcmdldFVpZCA9IGNoZWNrR3JhbnRVcmlQZXJtaXNzaW9uTG9ja2VkKGNhbGxpbmdVaWQsIHRhcmdldFBrZywgdXJpLCBtb2RlRmxhZ3MpOwogICAgICAgICBpZiAodGFyZ2V0VWlkIDwgMCkgewogICAgICAgICAgICAgcmV0dXJuOwpAQCAtNDQ5Miw2ICs0NTMzLDEwIEBACiAgICAgICAgICAgICAgICAgKyAiIGZyb20gIiArIGludGVudCArICI7IGZsYWdzPTB4IgogICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhpbnRlbnQgIT0gbnVsbCA/IGludGVudC5nZXRGbGFncygpIDogMCkpOwogCisgICAgICAgIGlmICh0YXJnZXRQa2cgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0YXJnZXRQa2ciKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChpbnRlbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CkBAIC01OTU2LDYgKzYwMDEsMzUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNldEltbWVyc2l2ZShJQmluZGVyIHRva2VuLCBib29sZWFuIGltbWVyc2l2ZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgaW50IGluZGV4ID0gKHRva2VuICE9IG51bGwpID8gbU1haW5TdGFjay5pbmRleE9mVG9rZW5Mb2NrZWQodG9rZW4pIDogLTE7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZpdHlSZWNvcmQgciA9IChBY3Rpdml0eVJlY29yZCltTWFpblN0YWNrLm1IaXN0b3J5LmdldChpbmRleCk7CisgICAgICAgICAgICByLmltbWVyc2l2ZSA9IGltbWVyc2l2ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW1tZXJzaXZlKElCaW5kZXIgdG9rZW4pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSAodG9rZW4gIT0gbnVsbCkgPyBtTWFpblN0YWNrLmluZGV4T2ZUb2tlbkxvY2tlZCh0b2tlbikgOiAtMTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3Rpdml0eVJlY29yZCByID0gKEFjdGl2aXR5UmVjb3JkKW1NYWluU3RhY2subUhpc3RvcnkuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiByLmltbWVyc2l2ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVG9wQWN0aXZpdHlJbW1lcnNpdmUoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgQWN0aXZpdHlSZWNvcmQgciA9IG1NYWluU3RhY2sudG9wUnVubmluZ0FjdGl2aXR5TG9ja2VkKG51bGwpOworICAgICAgICAgICAgcmV0dXJuIChyICE9IG51bGwpID8gci5pbW1lcnNpdmUgOiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudGVyU2FmZU1vZGUoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CiAgICAgICAgICAgICAvLyBJdCBvbmx5IG1ha2VzIHNlbnNlIHRvIGRvIHRoaXMgYmVmb3JlIHRoZSBzeXN0ZW0gaXMgcmVhZHkKQEAgLTcyODgsNiArNzM2MiwxMiBAQAogICAgICAgICAgICAgICAgICAgICBkdW1wU2VydmljZXNMb2NrZWQoZmQsIHB3LCBhcmdzLCBvcHRpLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBEdW1waW5nIGEgc2luZ2xlIGFjdGl2aXR5PworICAgICAgICAgICAgICAgIGlmIChkdW1wQWN0aXZpdHkoZmQsIHB3LCBjbWQsIGFyZ3MsIG9wdGksIGR1bXBBbGwpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiQmFkIGFjdGl2aXR5IGNvbW1hbmQ6ICIgKyBjbWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIApAQCAtNzcwMCw2ICs3NzgwLDgyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGVyZSBhcmUgdGhyZWUgdGhpbmdzIHRoYXQgY21kIGNhbiBiZToKKyAgICAgKiAgLSBhIGZsYXR0ZW5lZCBjb21wb25lbnQgbmFtZSB0aGF0IG1hdGNoZWQgYW4gZXhpc3RpbmcgYWN0aXZpdHkKKyAgICAgKiAgLSB0aGUgY21kIGFyZyBpc24ndCB0aGUgZmxhdHRlbmVkIGNvbXBvbmVudCBuYW1lIG9mIGFuIGV4aXN0aW5nIGFjdGl2aXR5OgorICAgICAqICAgIGR1bXAgYWxsIGFjdGl2aXR5IHdob3NlIGNvbXBvbmVudCBjb250YWlucyB0aGUgY21kIGFzIGEgc3Vic3RyaW5nCisgICAgICogIC0gQSBoZXggbnVtYmVyIG9mIHRoZSBBY3Rpdml0eVJlY29yZCBvYmplY3QgaW5zdGFuY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZHVtcEFjdGl2aXR5KEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdywgU3RyaW5nIG5hbWUsIFN0cmluZ1tdIGFyZ3MsCisgICAgICAgICAgICBpbnQgb3B0aSwgYm9vbGVhbiBkdW1wQWxsKSB7CisgICAgICAgIFN0cmluZ1tdIG5ld0FyZ3M7CisgICAgICAgIENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSA9IENvbXBvbmVudE5hbWUudW5mbGF0dGVuRnJvbVN0cmluZyhuYW1lKTsKKyAgICAgICAgaW50IG9iamVjdElkID0gMDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9iamVjdElkID0gSW50ZWdlci5wYXJzZUludChuYW1lLCAxNik7CisgICAgICAgICAgICBuYW1lID0gbnVsbDsKKyAgICAgICAgICAgIGNvbXBvbmVudE5hbWUgPSBudWxsOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBuZXdBcmdzID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCAtIG9wdGldOworICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAyKSBTeXN0ZW0uYXJyYXljb3B5KGFyZ3MsIG9wdGksIG5ld0FyZ3MsIDAsIGFyZ3MubGVuZ3RoIC0gb3B0aSk7CisKKyAgICAgICAgQXJyYXlMaXN0PEFjdGl2aXR5UmVjb3JkPiBhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdDxBY3Rpdml0eVJlY29yZD4oKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBmb3IgKEFjdGl2aXR5UmVjb3JkIHIxIDogKEFycmF5TGlzdDxBY3Rpdml0eVJlY29yZD4pbU1haW5TdGFjay5tSGlzdG9yeSkgeworICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnROYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHIxLmludGVudC5nZXRDb21wb25lbnQoKS5lcXVhbHMoY29tcG9uZW50TmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXRpZXMuYWRkKHIxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyMS5pbnRlbnQuZ2V0Q29tcG9uZW50KCkuZmxhdHRlblRvU3RyaW5nKCkuY29udGFpbnMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXRpZXMuYWRkKHIxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcykgPT0gb2JqZWN0SWQpIHsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZpdGllcy5hZGQocjEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChhY3Rpdml0aWVzLnNpemUoKSA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpPTA7IGk8YWN0aXZpdGllcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZHVtcEFjdGl2aXR5KGZkLCBwdywgYWN0aXZpdGllcy5nZXQoaSksIG5ld0FyZ3MsIGR1bXBBbGwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZXMgSUFwcGxpY2F0aW9uVGhyZWFkLmR1bXBBY3Rpdml0eSgpIG9uIHRoZSB0aHJlYWQgb2YgdGhlIHNwZWNpZmllZCBhY3Rpdml0eSBpZgorICAgICAqIHRoZXJlIGlzIGEgdGhyZWFkIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWN0aXZpdHkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGR1bXBBY3Rpdml0eShGaWxlRGVzY3JpcHRvciBmZCwgUHJpbnRXcml0ZXIgcHcsIEFjdGl2aXR5UmVjb3JkIHIsIFN0cmluZ1tdIGFyZ3MsCisgICAgICAgICAgICBib29sZWFuIGR1bXBBbGwpIHsKKyAgICAgICAgcHcucHJpbnRsbigiICBBY3Rpdml0eSAiICsgci5pbnRlbnQuZ2V0Q29tcG9uZW50KCkuZmxhdHRlblRvU3RyaW5nKCkpOworICAgICAgICBpZiAoZHVtcEFsbCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgcHcucHJpbnQoIiAgKiAiKTsgcHcucHJpbnRsbihyKTsKKyAgICAgICAgICAgICAgICByLmR1bXAocHcsICIgICAgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdy5wcmludGxuKCIiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoci5hcHAgIT0gbnVsbCAmJiByLmFwcC50aHJlYWQgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBmbHVzaCBhbnl0aGluZyB0aGF0IGlzIGFscmVhZHkgaW4gdGhlIFByaW50V3JpdGVyIHNpbmNlIHRoZSB0aHJlYWQgaXMgZ29pbmcKKyAgICAgICAgICAgICAgICAvLyB0byB3cml0ZSB0byB0aGUgZmlsZSBkZXNjcmlwdG9yIGRpcmVjdGx5CisgICAgICAgICAgICAgICAgcHcuZmx1c2goKTsKKyAgICAgICAgICAgICAgICByLmFwcC50aHJlYWQuZHVtcEFjdGl2aXR5KGZkLCByLCBhcmdzKTsKKyAgICAgICAgICAgICAgICBwdy5wcmludCgiXG4iKTsKKyAgICAgICAgICAgICAgICBwdy5mbHVzaCgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKCJnb3QgYSBSZW1vdGVFeGNlcHRpb24gd2hpbGUgZHVtcGluZyB0aGUgYWN0aXZpdHkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIGJvb2xlYW4gZHVtcEJyb2FkY2FzdHNMb2NrZWQoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3LCBTdHJpbmdbXSBhcmdzLAogICAgICAgICAgICAgaW50IG9wdGksIGJvb2xlYW4gZHVtcEFsbCkgewogICAgICAgICBib29sZWFuIG5lZWRTZXAgPSBmYWxzZTsKQEAgLTEyNTY4LDcgKzEyNzI0LDY5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKKyAgICBwdWJsaWMgYm9vbGVhbiBkdW1wSGVhcChTdHJpbmcgcHJvY2VzcywgYm9vbGVhbiBtYW5hZ2VkLAorICAgICAgICAgICAgU3RyaW5nIHBhdGgsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgLy8gbm90ZTogaGlqYWNraW5nIFNFVF9BQ1RJVklUWV9XQVRDSEVSLCBidXQgc2hvdWxkIGJlIGNoYW5nZWQgdG8KKyAgICAgICAgICAgICAgICAvLyBpdHMgb3duIHBlcm1pc3Npb24gKHNhbWUgYXMgcHJvZmlsZUNvbnRyb2wpLgorICAgICAgICAgICAgICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5TRVRfQUNUSVZJVFlfV0FUQ0hFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIlJlcXVpcmVzIHBlcm1pc3Npb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlNFVF9BQ1RJVklUWV9XQVRDSEVSKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJudWxsIGZkIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgUHJvY2Vzc1JlY29yZCBwcm9jID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpbnQgcGlkID0gSW50ZWdlci5wYXJzZUludChwcm9jZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtUGlkc1NlbGZMb2NrZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2MgPSBtUGlkc1NlbGZMb2NrZWQuZ2V0KHBpZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwcm9jID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFNwYXJzZUFycmF5PFByb2Nlc3NSZWNvcmQ+PiBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG1Qcm9jZXNzTmFtZXMuZ2V0TWFwKCk7CisgICAgICAgICAgICAgICAgICAgIFNwYXJzZUFycmF5PFByb2Nlc3NSZWNvcmQ+IHByb2NzID0gYWxsLmdldChwcm9jZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2NzICE9IG51bGwgJiYgcHJvY3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvYyA9IHByb2NzLnZhbHVlQXQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocHJvYyA9PSBudWxsIHx8IHByb2MudGhyZWFkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBwcm9jZXNzOiAiICsgcHJvY2Vzcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1NlY3VyZSA9ICIxIi5lcXVhbHMoU3lzdGVtUHJvcGVydGllcy5nZXQoU1lTVEVNX1NFQ1VSRSwgIjAiKSk7CisgICAgICAgICAgICAgICAgaWYgKGlzU2VjdXJlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgocHJvYy5pbmZvLmZsYWdzJkFwcGxpY2F0aW9uSW5mby5GTEFHX0RFQlVHR0FCTEUpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiUHJvY2VzcyBub3QgZGVidWdnYWJsZTogIiArIHByb2MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJvYy50aHJlYWQuZHVtcEhlYXAobWFuYWdlZCwgcGF0aCwgZmQpOworICAgICAgICAgICAgICAgIGZkID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByb2Nlc3MgZGlzYXBwZWFyZWQiKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChmZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqIEluIHRoaXMgbWV0aG9kIHdlIHRyeSB0byBhY3F1aXJlIG91ciBsb2NrIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgbm90IGRlYWRsb2NrZWQgKi8KICAgICBwdWJsaWMgdm9pZCBtb25pdG9yKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlSZWNvcmQuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5UmVjb3JkLmphdmEKaW5kZXggNTNiMDhkMC4uNmJkODljYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlSZWNvcmQuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVJlY29yZC5qYXZhCkBAIC0xMDUsNiArMTA1LDcgQEAKICAgICBib29sZWFuIGlkbGU7ICAgICAgICAgICAvLyBoYXMgdGhlIGFjdGl2aXR5IGdvbmUgaWRsZT8KICAgICBib29sZWFuIGhhc0JlZW5MYXVuY2hlZDsvLyBoYXMgdGhpcyBhY3Rpdml0eSBldmVyIGJlZW4gbGF1bmNoZWQ/CiAgICAgYm9vbGVhbiBmcm96ZW5CZWZvcmVEZXN0cm95Oy8vIGhhcyBiZWVuIGZyb3plbiBidXQgbm90IHlldCBkZXN0cm95ZWQuCisgICAgYm9vbGVhbiBpbW1lcnNpdmU7ICAgICAgLy8gaW1tZXJzaXZlIG1vZGUgKGRvbid0IGludGVycnVwdCBpZiBwb3NzaWJsZSkKIAogICAgIFN0cmluZyBzdHJpbmdOYW1lOyAgICAgIC8vIGZvciBjYWNoaW5nIG9mIHRvU3RyaW5nKCkuCiAgICAgCkBAIC0xNjEsNiArMTYyLDcgQEAKICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoImtleXNQYXVzZWQ9Iik7IHB3LnByaW50KGtleXNQYXVzZWQpOwogICAgICAgICAgICAgICAgIHB3LnByaW50KCIgaW5IaXN0b3J5PSIpOyBwdy5wcmludChpbkhpc3RvcnkpOwogICAgICAgICAgICAgICAgIHB3LnByaW50KCIgcGVyc2lzdGVudD0iKTsgcHcucHJpbnQocGVyc2lzdGVudCk7CisgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBpbW1lcnNpdmU9Iik7IHB3LnByaW50KGltbWVyc2l2ZSk7CiAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBsYXVuY2hNb2RlPSIpOyBwdy5wcmludGxuKGxhdW5jaE1vZGUpOwogICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiZnVsbHNjcmVlbj0iKTsgcHcucHJpbnQoZnVsbHNjcmVlbik7CiAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiB2aXNpYmxlPSIpOyBwdy5wcmludCh2aXNpYmxlKTsKQEAgLTI5Miw2ICsyOTQsOCBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpc0hvbWVBY3Rpdml0eSA9IGZhbHNlOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbW1lcnNpdmUgPSAoYUluZm8uZmxhZ3MgJiBBY3Rpdml0eUluZm8uRkxBR19JTU1FUlNJVkUpICE9IDA7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZWFsQWN0aXZpdHkgPSBudWxsOwogICAgICAgICAgICAgdGFza0FmZmluaXR5ID0gbnVsbDsKQEAgLTMwMyw2ICszMDcsNyBAQAogICAgICAgICAgICAgcGFja2FnZU5hbWUgPSBudWxsOwogICAgICAgICAgICAgZnVsbHNjcmVlbiA9IHRydWU7CiAgICAgICAgICAgICBpc0hvbWVBY3Rpdml0eSA9IGZhbHNlOworICAgICAgICAgICAgaW1tZXJzaXZlID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0JhdHRlcnlTdGF0c1NlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0JhdHRlcnlTdGF0c1NlcnZpY2UuamF2YQppbmRleCA3M2E1NDM1Li4wYTk4ZWJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9CYXR0ZXJ5U3RhdHNTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQmF0dGVyeVN0YXRzU2VydmljZS5qYXZhCkBAIC0xNiw3ICsxNiw5IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmFtOwogCitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIZWFkc2V0OworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFByb2ZpbGU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwpAQCAtNDMsNiArNDUsOCBAQAogICAgIAogICAgIGZpbmFsIEJhdHRlcnlTdGF0c0ltcGwgbVN0YXRzOwogICAgIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1CbHVldG9vdGhQZW5kaW5nU3RhdHM7CisgICAgcHJpdmF0ZSBCbHVldG9vdGhIZWFkc2V0IG1CbHVldG9vdGhIZWFkc2V0OwogCiAgICAgQmF0dGVyeVN0YXRzU2VydmljZShTdHJpbmcgZmlsZW5hbWUpIHsKICAgICAgICAgbVN0YXRzID0gbmV3IEJhdHRlcnlTdGF0c0ltcGwoZmlsZW5hbWUpOwpAQCAtMjgzLDE2ICsyODcsNDMgQEAKIAogICAgIHB1YmxpYyB2b2lkIG5vdGVCbHVldG9vdGhPbigpIHsKICAgICAgICAgZW5mb3JjZUNhbGxpbmdQZXJtaXNzaW9uKCk7Ci0gICAgICAgIEJsdWV0b290aEhlYWRzZXQgaGVhZHNldCA9IG5ldyBCbHVldG9vdGhIZWFkc2V0KG1Db250ZXh0LCBudWxsKTsKKyAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOworICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGFwdGVyLmdldFByb2ZpbGVQcm94eShtQ29udGV4dCwgbUJsdWV0b290aFByb2ZpbGVTZXJ2aWNlTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQpOworICAgICAgICB9CiAgICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRzKSB7Ci0gICAgICAgICAgICBtU3RhdHMubm90ZUJsdWV0b290aE9uTG9ja2VkKCk7Ci0gICAgICAgICAgICBtU3RhdHMuc2V0QnRIZWFkc2V0KGhlYWRzZXQpOworICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhIZWFkc2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMubm90ZUJsdWV0b290aE9uTG9ja2VkKCk7CisgICAgICAgICAgICAgICAgbVN0YXRzLnNldEJ0SGVhZHNldChtQmx1ZXRvb3RoSGVhZHNldCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1CbHVldG9vdGhQZW5kaW5nU3RhdHMgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCisgICAgcHJpdmF0ZSBCbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lciBtQmx1ZXRvb3RoUHJvZmlsZVNlcnZpY2VMaXN0ZW5lciA9CisgICAgICAgIG5ldyBCbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKGludCBwcm9maWxlLCBCbHVldG9vdGhQcm9maWxlIHByb3h5KSB7CisgICAgICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldCA9IChCbHVldG9vdGhIZWFkc2V0KSBwcm94eTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRzKSB7CisgICAgICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhQZW5kaW5nU3RhdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm5vdGVCbHVldG9vdGhPbkxvY2tlZCgpOworICAgICAgICAgICAgICAgICAgICBtU3RhdHMuc2V0QnRIZWFkc2V0KG1CbHVldG9vdGhIZWFkc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aFBlbmRpbmdTdGF0cyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChpbnQgcHJvZmlsZSkgeworICAgICAgICAgICAgbUJsdWV0b290aEhlYWRzZXQgPSBudWxsOworICAgICAgICB9CisgICAgfTsKKwogICAgIHB1YmxpYyB2b2lkIG5vdGVCbHVldG9vdGhPZmYoKSB7CiAgICAgICAgIGVuZm9yY2VDYWxsaW5nUGVybWlzc2lvbigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0cykgeworICAgICAgICAgICAgbUJsdWV0b290aFBlbmRpbmdTdGF0cyA9IGZhbHNlOwogICAgICAgICAgICAgbVN0YXRzLm5vdGVCbHVldG9vdGhPZmZMb2NrZWQoKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL1VyaVBlcm1pc3Npb25Pd25lci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vVXJpUGVybWlzc2lvbk93bmVyLmphdmEKaW5kZXggOTljODJlNi4uNjhhMmUwZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vVXJpUGVybWlzc2lvbk93bmVyLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vVXJpUGVybWlzc2lvbk93bmVyLmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICB9CiAKICAgICBCaW5kZXIgZ2V0RXh0ZXJuYWxUb2tlbkxvY2tlZCgpIHsKLSAgICAgICAgaWYgKGV4dGVybmFsVG9rZW4gIT0gbnVsbCkgeworICAgICAgICBpZiAoZXh0ZXJuYWxUb2tlbiA9PSBudWxsKSB7CiAgICAgICAgICAgICBleHRlcm5hbFRva2VuID0gbmV3IEV4dGVybmFsVG9rZW4oKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZXh0ZXJuYWxUb2tlbjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2Nvbm5lY3Rpdml0eS9UZXRoZXJpbmcuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2Nvbm5lY3Rpdml0eS9UZXRoZXJpbmcuamF2YQppbmRleCAxYmM1ZTRiLi5iZmFjMzQ2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jb25uZWN0aXZpdHkvVGV0aGVyaW5nLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY29ubmVjdGl2aXR5L1RldGhlcmluZy5qYXZhCkBAIC0xOSw4ICsxOSw4IEBACiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwogaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQYW47CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwpAQCAtMzIsNyArMzIsNiBAQAogaW1wb3J0IGFuZHJvaWQubmV0LklDb25uZWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LklOZXR3b3JrTWFuYWdlbWVudEV2ZW50T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1V0aWxzOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwpAQCAtNTQsNiArNTMsNyBAQAogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogLyoqCiAgKiBAaGlkZQpAQCAtNjYsNyArNjYsOCBAQAogcHVibGljIGNsYXNzIFRldGhlcmluZyBleHRlbmRzIElOZXR3b3JrTWFuYWdlbWVudEV2ZW50T2JzZXJ2ZXIuU3R1YiB7CiAKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFHID0gIlRldGhlcmluZyI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJUZXRoZXJpbmciOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtQm9vdGVkID0gZmFsc2U7CiAgICAgLy91c2VkIHRvIHJlbWVtYmVyIGlmIHdlIGdvdCBjb25uZWN0ZWQgYmVmb3JlIGJvb3QgZmluaXNoZWQKQEAgLTc1LDYgKzc2LDcgQEAKICAgICAvLyBUT0RPIC0gcmVtb3ZlIGJvdGggb2YgdGhlc2UgLSBzaG91bGQgYmUgcGFydCBvZiBpbnRlcmZhY2UgaW5zcGVjdGlvbi9zZWxlY3Rpb24gc3R1ZmYKICAgICBwcml2YXRlIFN0cmluZ1tdIG1UZXRoZXJhYmxlVXNiUmVnZXhzOwogICAgIHByaXZhdGUgU3RyaW5nW10gbVRldGhlcmFibGVXaWZpUmVnZXhzOworICAgIHByaXZhdGUgU3RyaW5nW10gbVRldGhlcmFibGVCbHVldG9vdGhSZWdleHM7CiAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtVXBzdHJlYW1JZmFjZVJlZ2V4czsKIAogICAgIHByaXZhdGUgTG9vcGVyIG1Mb29wZXI7CkBAIC04NywxMyArODksMjcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNCX05FQVJfSUZBQ0VfQUREUiAgICAgID0gIjE5Mi4xNjguNDIuMTI5IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNCX05FVE1BU0sgICAgICAgICAgICAgID0gIjI1NS4yNTUuMjU1LjAiOwogCi0gICAgLy8gRllJIC0gdGhlIGRlZmF1bHQgd2lmaSBpcyAxOTIuMTY4LjQzLjEgYW5kIDI1NS4yNTUuMjU1LjAKKyAgICAvLyBVU0IgaXMgIDE5Mi4xNjguNDIuMSBhbmQgMjU1LjI1NS4yNTUuMAorICAgIC8vIFdpZmkgaXMgMTkyLjE2OC40My4xIGFuZCAyNTUuMjU1LjI1NS4wCisgICAgLy8gQlQgaXMgbGltaXRlZCB0byBtYXggZGVmYXVsdCBvZiA1IGNvbm5lY3Rpb25zLiAxOTIuMTY4LjQ0LjEgdG8gMTkyLjE2OC40OC4xCisgICAgLy8gd2l0aCAyNTUuMjU1LjI1NS4wCiAKICAgICBwcml2YXRlIFN0cmluZ1tdIG1EaGNwUmFuZ2U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTFfU1RBUlQgPSAiMTkyLjE2OC40Mi4yIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFMV9TVE9QICA9ICIxOTIuMTY4LjQyLjI1NCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTJfU1RBUlQgPSAiMTkyLjE2OC40My4yIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFMl9TVE9QICA9ICIxOTIuMTY4LjQzLjI1NCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTNfU1RBUlQgPSAiMTkyLjE2OC40NC4yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFM19TVE9QICA9ICIxOTIuMTY4LjQ0LjI1NCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTRfU1RBUlQgPSAiMTkyLjE2OC40NS4yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFNF9TVE9QICA9ICIxOTIuMTY4LjQ1LjI1NCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTVfU1RBUlQgPSAiMTkyLjE2OC40Ni4yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFNV9TVE9QICA9ICIxOTIuMTY4LjQ2LjI1NCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTZfU1RBUlQgPSAiMTkyLjE2OC40Ny4yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFNl9TVE9QICA9ICIxOTIuMTY4LjQ3LjI1NCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTdfU1RBUlQgPSAiMTkyLjE2OC40OC4yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFN19TVE9QICA9ICIxOTIuMTY4LjQ4LjI1NCI7CisKIAogICAgIHByaXZhdGUgU3RyaW5nW10gbURuc1NlcnZlcnM7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEROU19ERUZBVUxUX1NFUlZFUjEgPSAiOC44LjguOCI7CkBAIC0xNjEsMTEgKzE3NywyMSBAQAogICAgICAgICBtRGhjcFJhbmdlID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmdBcnJheSgKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFycmF5LmNvbmZpZ190ZXRoZXJfZGhjcF9yYW5nZSk7CiAgICAgICAgIGlmICgobURoY3BSYW5nZS5sZW5ndGggPT0gMCkgfHwgKG1EaGNwUmFuZ2UubGVuZ3RoICUgMiA9PTEpKSB7Ci0gICAgICAgICAgICBtRGhjcFJhbmdlID0gbmV3IFN0cmluZ1s0XTsKKyAgICAgICAgICAgIG1EaGNwUmFuZ2UgPSBuZXcgU3RyaW5nWzE0XTsKICAgICAgICAgICAgIG1EaGNwUmFuZ2VbMF0gPSBESENQX0RFRkFVTFRfUkFOR0UxX1NUQVJUOwogICAgICAgICAgICAgbURoY3BSYW5nZVsxXSA9IERIQ1BfREVGQVVMVF9SQU5HRTFfU1RPUDsKICAgICAgICAgICAgIG1EaGNwUmFuZ2VbMl0gPSBESENQX0RFRkFVTFRfUkFOR0UyX1NUQVJUOwogICAgICAgICAgICAgbURoY3BSYW5nZVszXSA9IERIQ1BfREVGQVVMVF9SQU5HRTJfU1RPUDsKKyAgICAgICAgICAgIG1EaGNwUmFuZ2VbNF0gPSBESENQX0RFRkFVTFRfUkFOR0UzX1NUQVJUOworICAgICAgICAgICAgbURoY3BSYW5nZVs1XSA9IERIQ1BfREVGQVVMVF9SQU5HRTNfU1RPUDsKKyAgICAgICAgICAgIG1EaGNwUmFuZ2VbNl0gPSBESENQX0RFRkFVTFRfUkFOR0U0X1NUQVJUOworICAgICAgICAgICAgbURoY3BSYW5nZVs3XSA9IERIQ1BfREVGQVVMVF9SQU5HRTRfU1RPUDsKKyAgICAgICAgICAgIG1EaGNwUmFuZ2VbOF0gPSBESENQX0RFRkFVTFRfUkFOR0U1X1NUQVJUOworICAgICAgICAgICAgbURoY3BSYW5nZVs5XSA9IERIQ1BfREVGQVVMVF9SQU5HRTVfU1RPUDsKKyAgICAgICAgICAgIG1EaGNwUmFuZ2VbMTBdID0gREhDUF9ERUZBVUxUX1JBTkdFNl9TVEFSVDsKKyAgICAgICAgICAgIG1EaGNwUmFuZ2VbMTFdID0gREhDUF9ERUZBVUxUX1JBTkdFNl9TVE9QOworICAgICAgICAgICAgbURoY3BSYW5nZVsxMl0gPSBESENQX0RFRkFVTFRfUkFOR0U3X1NUQVJUOworICAgICAgICAgICAgbURoY3BSYW5nZVsxM10gPSBESENQX0RFRkFVTFRfUkFOR0U3X1NUT1A7CiAgICAgICAgIH0KICAgICAgICAgbUR1blJlcXVpcmVkID0gZmFsc2U7IC8vIHJlc2FtcGxlIHdoZW4gd2UgdHVybiBvbgogCkBAIC0xNzMsNiArMTk5LDggQEAKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFycmF5LmNvbmZpZ190ZXRoZXJfdXNiX3JlZ2V4cyk7CiAgICAgICAgIG1UZXRoZXJhYmxlV2lmaVJlZ2V4cyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nQXJyYXkoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfdGV0aGVyX3dpZmlfcmVnZXhzKTsKKyAgICAgICAgbVRldGhlcmFibGVCbHVldG9vdGhSZWdleHMgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZ0FycmF5KAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXJyYXkuY29uZmlnX3RldGhlcl9ibHVldG9vdGhfcmVnZXhzKTsKICAgICAgICAgbVVwc3RyZWFtSWZhY2VSZWdleHMgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZ0FycmF5KAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXJyYXkuY29uZmlnX3RldGhlcl91cHN0cmVhbV9yZWdleHMpOwogCkBAIC0xODMsNyArMjExLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBpbnRlcmZhY2VMaW5rU3RhdHVzQ2hhbmdlZChTdHJpbmcgaWZhY2UsIGJvb2xlYW4gbGluaykgewotICAgICAgICBMb2cuZChUQUcsICJpbnRlcmZhY2VMaW5rU3RhdHVzQ2hhbmdlZCAiICsgaWZhY2UgKyAiLCAiICsgbGluayk7CisgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiaW50ZXJmYWNlTGlua1N0YXR1c0NoYW5nZWQgIiArIGlmYWNlICsgIiwgIiArIGxpbmspOwogICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CiAgICAgICAgIGJvb2xlYW4gdXNiID0gZmFsc2U7CiAgICAgICAgIGlmIChpc1dpZmkoaWZhY2UpKSB7CkBAIC0xOTEsNiArMjE5LDggQEAKICAgICAgICAgfSBlbHNlIGlmIChpc1VzYihpZmFjZSkpIHsKICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgIHVzYiA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoaXNCbHVldG9vdGgoaWZhY2UpKSB7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZvdW5kID09IGZhbHNlKSByZXR1cm47CiAKQEAgLTIyNSw2ICsyNTUsMTIgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIGlzQmx1ZXRvb3RoKFN0cmluZyBpZmFjZSkgeworICAgICAgICBmb3IgKFN0cmluZyByZWdleCA6IG1UZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKSB7CisgICAgICAgICAgICBpZiAoaWZhY2UubWF0Y2hlcyhyZWdleCkpIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgcHVibGljIHZvaWQgaW50ZXJmYWNlQWRkZWQoU3RyaW5nIGlmYWNlKSB7CiAgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFKTsKICAgICAgICAgSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSBzZXJ2aWNlID0gSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGIpOwpAQCAtMjM3LDI5ICsyNzMsMzQgQEAKICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgIHVzYiA9IHRydWU7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGlzQmx1ZXRvb3RoKGlmYWNlKSkgeworICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICB9CiAgICAgICAgIGlmIChmb3VuZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCBpZmFjZSArICIgaXMgbm90IGEgdGV0aGVyYWJsZSBpZmFjZSwgaWdub3JpbmciKTsKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCBpZmFjZSArICIgaXMgbm90IGEgdGV0aGVyYWJsZSBpZmFjZSwgaWdub3JpbmciKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIHN5bmNocm9uaXplZCAobUlmYWNlcykgewogICAgICAgICAgICAgVGV0aGVySW50ZXJmYWNlU00gc20gPSBtSWZhY2VzLmdldChpZmFjZSk7CiAgICAgICAgICAgICBpZiAoc20gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImFjdGl2ZSBpZmFjZSAoIiArIGlmYWNlICsgIikgcmVwb3J0ZWQgYXMgYWRkZWQsIGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJhY3RpdmUgaWZhY2UgKCIgKyBpZmFjZSArICIpIHJlcG9ydGVkIGFzIGFkZGVkLCBpZ25vcmluZyIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNtID0gbmV3IFRldGhlckludGVyZmFjZVNNKGlmYWNlLCBtTG9vcGVyLCB1c2IpOwogICAgICAgICAgICAgbUlmYWNlcy5wdXQoaWZhY2UsIHNtKTsKICAgICAgICAgICAgIHNtLnN0YXJ0KCk7CiAgICAgICAgIH0KLSAgICAgICAgTG9nLmQoVEFHLCAiaW50ZXJmYWNlQWRkZWQgOiIgKyBpZmFjZSk7CisgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiaW50ZXJmYWNlQWRkZWQgOiIgKyBpZmFjZSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgaW50ZXJmYWNlUmVtb3ZlZChTdHJpbmcgaWZhY2UpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtSWZhY2VzKSB7CiAgICAgICAgICAgICBUZXRoZXJJbnRlcmZhY2VTTSBzbSA9IG1JZmFjZXMuZ2V0KGlmYWNlKTsKICAgICAgICAgICAgIGlmIChzbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiYXR0ZW1wdGluZyB0byByZW1vdmUgdW5rbm93biBpZmFjZSAoIiArIGlmYWNlICsgIiksIGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImF0dGVtcHRpbmcgdG8gcmVtb3ZlIHVua25vd24gaWZhY2UgKCIgKyBpZmFjZSArICIpLCBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzbS5zZW5kTWVzc2FnZShUZXRoZXJJbnRlcmZhY2VTTS5DTURfSU5URVJGQUNFX0RPV04pOwpAQCAtMzMwLDEzICszNzEsMTQgQEAKIAogICAgICAgICBib29sZWFuIHdpZmlUZXRoZXJlZCA9IGZhbHNlOwogICAgICAgICBib29sZWFuIHVzYlRldGhlcmVkID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gYmx1ZXRvb3RoVGV0aGVyZWQgPSBmYWxzZTsKIAogICAgICAgICBzeW5jaHJvbml6ZWQgKG1JZmFjZXMpIHsKICAgICAgICAgICAgIFNldCBpZmFjZXMgPSBtSWZhY2VzLmtleVNldCgpOwogICAgICAgICAgICAgZm9yIChPYmplY3QgaWZhY2UgOiBpZmFjZXMpIHsKICAgICAgICAgICAgICAgICBUZXRoZXJJbnRlcmZhY2VTTSBzbSA9IG1JZmFjZXMuZ2V0KGlmYWNlKTsKICAgICAgICAgICAgICAgICBpZiAoc20gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZihzbS5pc0Vycm9yZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc20uaXNFcnJvcmVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yZWRMaXN0LmFkZCgoU3RyaW5nKWlmYWNlKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzbS5pc0F2YWlsYWJsZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVMaXN0LmFkZCgoU3RyaW5nKWlmYWNlKTsKQEAgLTM0NSw2ICszODcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYlRldGhlcmVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNXaWZpKChTdHJpbmcpaWZhY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lmaVRldGhlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzQmx1ZXRvb3RoKChTdHJpbmcpaWZhY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXRvb3RoVGV0aGVyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlTGlzdC5hZGQoKFN0cmluZylpZmFjZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTM1OSwxNyArNDAzLDI1IEBACiAgICAgICAgIGJyb2FkY2FzdC5wdXRTdHJpbmdBcnJheUxpc3RFeHRyYShDb25uZWN0aXZpdHlNYW5hZ2VyLkVYVFJBX0VSUk9SRURfVEVUSEVSLAogICAgICAgICAgICAgICAgIGVycm9yZWRMaXN0KTsKICAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChicm9hZGNhc3QpOwotICAgICAgICBMb2cuZChUQUcsICJzZW5kVGV0aGVyU3RhdGVDaGFuZ2VkQnJvYWRjYXN0ICIgKyBhdmFpbGFibGVMaXN0LnNpemUoKSArICIsICIgKwotICAgICAgICAgICAgICAgIGFjdGl2ZUxpc3Quc2l6ZSgpICsgIiwgIiArIGVycm9yZWRMaXN0LnNpemUoKSk7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAic2VuZFRldGhlclN0YXRlQ2hhbmdlZEJyb2FkY2FzdCAiICsgYXZhaWxhYmxlTGlzdC5zaXplKCkgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlTGlzdC5zaXplKCkgKyAiLCAiICsgZXJyb3JlZExpc3Quc2l6ZSgpKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmICh1c2JUZXRoZXJlZCkgewotICAgICAgICAgICAgaWYgKHdpZmlUZXRoZXJlZCkgeworICAgICAgICAgICAgaWYgKHdpZmlUZXRoZXJlZCB8fCBibHVldG9vdGhUZXRoZXJlZCkgewogICAgICAgICAgICAgICAgIHNob3dUZXRoZXJlZE5vdGlmaWNhdGlvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLnN0YXRfc3lzX3RldGhlcl9nZW5lcmFsKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc2hvd1RldGhlcmVkTm90aWZpY2F0aW9uKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuc3RhdF9zeXNfdGV0aGVyX3VzYik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAod2lmaVRldGhlcmVkKSB7Ci0gICAgICAgICAgICBzaG93VGV0aGVyZWROb3RpZmljYXRpb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X3N5c190ZXRoZXJfd2lmaSk7CisgICAgICAgICAgICBpZiAoYmx1ZXRvb3RoVGV0aGVyZWQpIHsKKyAgICAgICAgICAgICAgICBzaG93VGV0aGVyZWROb3RpZmljYXRpb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X3N5c190ZXRoZXJfZ2VuZXJhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNob3dUZXRoZXJlZE5vdGlmaWNhdGlvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLnN0YXRfc3lzX3RldGhlcl93aWZpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChibHVldG9vdGhUZXRoZXJlZCkgeworICAgICAgICAgICAgc2hvd1RldGhlcmVkTm90aWZpY2F0aW9uKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuc3RhdF9zeXNfdGV0aGVyX2JsdWV0b290aCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjbGVhclRldGhlcmVkTm90aWZpY2F0aW9uKCk7CiAgICAgICAgIH0KQEAgLTQwMCw3ICs0NTIsNyBAQAogICAgICAgICBDaGFyU2VxdWVuY2UgbWVzc2FnZSA9IHIuZ2V0VGV4dChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy4KICAgICAgICAgICAgICAgICB0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSk7CiAKLSAgICAgICAgaWYobVRldGhlcmVkTm90aWZpY2F0aW9uID09IG51bGwpIHsKKyAgICAgICAgaWYgKG1UZXRoZXJlZE5vdGlmaWNhdGlvbiA9PSBudWxsKSB7CiAgICAgICAgICAgICBtVGV0aGVyZWROb3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uKCk7CiAgICAgICAgICAgICBtVGV0aGVyZWROb3RpZmljYXRpb24ud2hlbiA9IDA7CiAgICAgICAgIH0KQEAgLTQ1Nyw3ICs1MDksNyBAQAogICAgICAgICAgICAgICAgIG1Vc2JNYXNzU3RvcmFnZU9mZiA9IHRydWU7CiAgICAgICAgICAgICAgICAgdXBkYXRlVXNiU3RhdHVzKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQ29ubmVjdGl2aXR5TWFuYWdlci5DT05ORUNUSVZJVFlfQUNUSU9OKSkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlRldGhlcmluZyBnb3QgQ09OTkVDVElWSVRZX0FDVElPTiIpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVGV0aGVyaW5nIGdvdCBDT05ORUNUSVZJVFlfQUNUSU9OIik7CiAgICAgICAgICAgICAgICAgbVRldGhlck1hc3RlclNNLnNlbmRNZXNzYWdlKFRldGhlck1hc3RlclNNLkNNRF9VUFNUUkVBTV9DSEFOR0VEKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhJbnRlbnQuQUNUSU9OX0JPT1RfQ09NUExFVEVEKSkgewogICAgICAgICAgICAgICAgIG1Cb290ZWQgPSB0cnVlOwpAQCAtNDg4LDkgKzU0MCw5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyB0b2dnbGVkIHdoZW4gd2UgZW50ZXIvbGVhdmUgdGhlIGZ1bGx5IHRlYXRoZXJlZCBzdGF0ZQorICAgIC8vIHRvZ2dsZWQgd2hlbiB3ZSBlbnRlci9sZWF2ZSB0aGUgZnVsbHkgdGV0aGVyZWQgc3RhdGUKICAgICBwcml2YXRlIGJvb2xlYW4gZW5hYmxlVXNiUm5kaXMoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImVuYWJsZVVzYlJuZGlzKCIgKyBlbmFibGVkICsgIikiKTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJlbmFibGVVc2JSbmRpcygiICsgZW5hYmxlZCArICIpIik7CiAgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFKTsKICAgICAgICAgICAgICAgICBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIHNlcnZpY2UgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7CiAKQEAgLTUxNSw3ICs1NjcsNyBAQAogCiAgICAgLy8gY29uZmlndXJlZCB3aGVuIHdlIHN0YXJ0IHRldGhlcmluZyBhbmQgdW5jb25maWcnZCBvbiBlcnJvciBvciBjb25jbHVzaW9uCiAgICAgcHJpdmF0ZSBib29sZWFuIGNvbmZpZ3VyZVVzYklmYWNlKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBMb2cuZChUQUcsICJjb25maWd1cmVVc2JJZmFjZSgiICsgZW5hYmxlZCArICIpIik7CisgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiY29uZmlndXJlVXNiSWZhY2UoIiArIGVuYWJsZWQgKyAiKSIpOwogCiAgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFKTsKICAgICAgICAgSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSBzZXJ2aWNlID0gSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGIpOwpAQCAtNTcxLDYgKzYyMywxMCBAQAogICAgICAgICByZXR1cm4gbVRldGhlcmFibGVXaWZpUmVnZXhzOwogICAgIH0KIAorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRUZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKCkgeworICAgICAgICByZXR1cm4gbVRldGhlcmFibGVCbHVldG9vdGhSZWdleHM7CisgICAgfQorCiAgICAgcHVibGljIFN0cmluZ1tdIGdldFVwc3RyZWFtSWZhY2VSZWdleHMoKSB7CiAgICAgICAgIHJldHVybiBtVXBzdHJlYW1JZmFjZVJlZ2V4czsKICAgICB9CkBAIC03NjIsNyArODE4LDcgQEAKIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJbml0aWFsU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIkluaXRpYWxTdGF0ZS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ01EX1RFVEhFUl9SRVFVRVNURUQ6CkBAIC04MDMsNyArODU5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3RhcnRpbmdTdGF0ZS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiU3RhcnRpbmdTdGF0ZS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIG1heWJlIGEgcGFyZW50IGNsYXNzPwpAQCAtODU1LDcgKzkxMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1Vc2IpIFRldGhlcmluZy50aGlzLmVuYWJsZVVzYlJuZGlzKHRydWUpOwotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlRldGhlcmVkICIgKyBtSWZhY2VOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIlRldGhlcmVkICIgKyBtSWZhY2VOYW1lKTsKICAgICAgICAgICAgICAgICBzZXRBdmFpbGFibGUoZmFsc2UpOwogICAgICAgICAgICAgICAgIHNldFRldGhlcmVkKHRydWUpOwogICAgICAgICAgICAgICAgIHNlbmRUZXRoZXJTdGF0ZUNoYW5nZWRCcm9hZGNhc3QoKTsKQEAgLTg2Niw3ICs5MjIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUZXRoZXJlZFN0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJUZXRoZXJlZFN0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiBlcnJvciA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CkBAIC05MDksNyArOTY1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS53aGF0ID09IENNRF9JTlRFUkZBQ0VfRE9XTikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtVW5hdmFpbGFibGVTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJVbnRldGhlcmVkICIgKyBtSWZhY2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVW50ZXRoZXJlZCAiICsgbUlmYWNlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfVEVUSEVSX0NPTk5FQ1RJT05fQ0hBTkdFRDoKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXdVcHN0cmVhbUlmYWNlTmFtZSA9IChTdHJpbmcpKG1lc3NhZ2Uub2JqKTsKQEAgLTk4Miw3ICsxMDM4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuVEVUSEVSX0VSUk9SX01BU1RFUl9FUlJPUik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUZXRoZXIgbG9zdCB1cHN0cmVhbSBjb25uZWN0aW9uICIgKyBtSWZhY2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVGV0aGVyIGxvc3QgdXBzdHJlYW0gY29ubmVjdGlvbiAiICsgbUlmYWNlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kVGV0aGVyU3RhdGVDaGFuZ2VkQnJvYWRjYXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVVzYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghVGV0aGVyaW5nLnRoaXMuY29uZmlndXJlVXNiSWZhY2UoZmFsc2UpKSB7CkBAIC0xMjIwLDggKzEyNzYsMTAgQEAKICAgICAgICAgICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOwogICAgICAgICAgICAgICAgIElDb25uZWN0aXZpdHlNYW5hZ2VyIGNtID0gSUNvbm5lY3Rpdml0eU1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZShiKTsKICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvblJlcXVlc3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImNob29zZVVwc3RyZWFtVHlwZSgiICsgdHJ5Q2VsbCArICIpLCAgZHVuUmVxdWlyZWQgPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbUR1blJlcXVpcmVkICsgIiwgaWZhY2U9IiArIGlmYWNlKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY2hvb3NlVXBzdHJlYW1UeXBlKCIgKyB0cnlDZWxsICsgIiksICBkdW5SZXF1aXJlZCA9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUR1blJlcXVpcmVkICsgIiwgaWZhY2U9IiArIGlmYWNlKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGlmYWNlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRHVuUmVxdWlyZWQpIHsKQEAgLTEyMjksNyArMTI4Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya0luZm8gaW5mbyA9IGNtLmdldE5ldHdvcmtJbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRV9EVU4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic2V0dGluZyBkdW4gaWZhY2VuYW1lID0iICsgaWZhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgInNldHRpbmcgZHVuIGlmYWNlbmFtZSA9IiArIGlmYWNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpZiB3ZSdyZSBhbHJlYWR5IGNvbm5lY3RlZCAtIGl0IG1heSBiZSBzb21lYm9keSBlbHNlJ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmY291bnQsIHNvIGFkZCBvdXIgb3duCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cm5Pbk1vYmlsZUNvbm5lY3Rpb24oKTsKQEAgLTEyNDEsMTEgKzEyOTksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY2hlY2tpbmcgaWYgaGlwcmkgYnJvdWdodCB1cyB0aGlzIGNvbm5lY3Rpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgImNoZWNraW5nIGlmIGhpcHJpIGJyb3VnaHQgdXMgdGhpcyBjb25uZWN0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya0luZm8gaW5mbyA9IGNtLmdldE5ldHdvcmtJbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRV9ISVBSSSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJ5ZXMgLSBoaXByaSBpbiB1c2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJ5ZXMgLSBoaXByaSBpbiB1c2UiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpZiB3ZSdyZSBhbHJlYWR5IGNvbm5lY3RlZCAtIGl0IG1heSBiZSBzb21ib2R5IGVsc2UncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZjb3VudCwgc28gYWRkIG91ciBvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybk9uTW9iaWxlQ29ubmVjdGlvbigpOwpAQCAtMTI2Nyw3ICsxMzI1LDcgQEAKICAgICAgICAgICAgICAgICBub3RpZnlUZXRoZXJlZE9mTmV3VXBzdHJlYW1JZmFjZShpZmFjZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlUZXRoZXJlZE9mTmV3VXBzdHJlYW1JZmFjZShTdHJpbmcgaWZhY2VOYW1lKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibm90aWZ5aW5nIHRldGhlcmVkIHdpdGggaWZhY2UgPSIgKyBpZmFjZU5hbWUpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAibm90aWZ5aW5nIHRldGhlcmVkIHdpdGggaWZhY2UgPSIgKyBpZmFjZU5hbWUpOwogICAgICAgICAgICAgICAgIG1VcHN0cmVhbUlmYWNlTmFtZSA9IGlmYWNlTmFtZTsKICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvIDogbU5vdGlmeUxpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgVGV0aGVySW50ZXJmYWNlU00gc20gPSAoVGV0aGVySW50ZXJmYWNlU00pbzsKQEAgLTEyODQsMTkgKzEzNDIsMTkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTWFzdGVySW5pdGlhbFN0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJNYXN0ZXJJbml0aWFsU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKICAgICAgICAgICAgICAgICBib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9URVRIRVJfTU9ERV9SRVFVRVNURUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICBtRHVuUmVxdWlyZWQgPSBpc0R1blJlcXVpcmVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBUZXRoZXJJbnRlcmZhY2VTTSB3aG8gPSAoVGV0aGVySW50ZXJmYWNlU00pbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUZXRoZXIgTW9kZSByZXF1ZXN0ZWQgYnkgIiArIHdoby50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVGV0aGVyIE1vZGUgcmVxdWVzdGVkIGJ5ICIgKyB3aG8udG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZ5TGlzdC5hZGQod2hvKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtVGV0aGVyTW9kZUFsaXZlU3RhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ01EX1RFVEhFUl9NT0RFX1VOUkVRVUVTVEVEOgogICAgICAgICAgICAgICAgICAgICAgICAgd2hvID0gKFRldGhlckludGVyZmFjZVNNKW1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGV0aGVyIE1vZGUgdW5yZXF1ZXN0ZWQgYnkgIiArIHdoby50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVGV0aGVyIE1vZGUgdW5yZXF1ZXN0ZWQgYnkgIiArIHdoby50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1Ob3RpZnlMaXN0LmluZGV4T2Yod2hvKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3RpZnlMaXN0LnJlbW92ZSh3aG8pOwpAQCAtMTMyNiw3ICsxMzg0LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGV0aGVyTW9kZUFsaXZlU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIlRldGhlck1vZGVBbGl2ZVN0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfVEVUSEVSX01PREVfUkVRVUVTVEVEOgpAQCAtMTM1NCw4ICsxNDEyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UncmUgc3RpbGwgdXNpbmcgYSByZXF1ZXN0ZWQgY29ubmVjdGlvbiAtIG1heSBoYXZlIGZvdW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWZpIG9yIHNvbWV0aGluZyBzaW5jZSB0aGVuLgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uUmVxdWVzdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVuZXdpbmcgbW9iaWxlIGNvbm5lY3Rpb24gLSByZXF1ZXVpbmcgZm9yIGFub3RoZXIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRUxMX0NPTk5FQ1RJT05fUkVORVdfTVMgKyAibXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVuZXdpbmcgbW9iaWxlIGNvbm5lY3Rpb24gLSByZXF1ZXVpbmcgZm9yIGFub3RoZXIgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VMTF9DT05ORUNUSU9OX1JFTkVXX01TICsgIm1zIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cm5Pbk1vYmlsZUNvbm5lY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3Rvci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU5Y2UzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yLmphdmEKQEAgLTAsMCArMSwzNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmxvY2F0aW9uOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uR2VvY29kZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZVN0YXRlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyOworaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGRldGVjdCB0aGUgY291bnRyeSB3aGVyZSB0aGUgdXNlciBpcy4gVGhlIHNvdXJjZXMgb2YKKyAqIGNvdW50cnkgYXJlIHF1ZXJpZWQgaW4gb3JkZXIgb2YgcmVsaWFiaWxpdHksIGxpa2UKKyAqIDx1bD4KKyAqIDxsaT5Nb2JpbGUgbmV0d29yazwvbGk+CisgKiA8bGk+TG9jYXRpb248L2xpPgorICogPGxpPlNJTSdzIGNvdW50cnk8L2xpPgorICogPGxpPlBob25lJ3MgbG9jYWxlPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIENhbGwgdGhlIHtAbGluayAjZGV0ZWN0Q291bnRyeSgpfSB0byBnZXQgdGhlIGF2YWlsYWJsZSBjb3VudHJ5IGltbWVkaWF0ZWx5LgorICogPHA+CisgKiBUbyBiZSBub3RpZmllZCBvZiB0aGUgZnV0dXJlIGNvdW50cnkgY2hhbmdlLCB1c2luZyB0aGUKKyAqIHtAbGluayAjc2V0Q291bnRyeUxpc3RlbmVyKENvdW50cnlMaXN0ZW5lcil9CisgKiA8cD4KKyAqIFVzaW5nIHRoZSB7QGxpbmsgI3N0b3AoKX0gdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGNvdW50cnkgY2hhbmdlLgorICogPHA+CisgKiBUaGUgY291bnRyeSBpbmZvcm1hdGlvbiB3aWxsIGJlIHJlZnJlc2hlZCBldmVyeQorICoge0BsaW5rICNMT0NBVElPTl9SRUZSRVNIX0lOVEVSVkFMfSBvbmNlIHRoZSBsb2NhdGlvbiBiYXNlZCBjb3VudHJ5IGlzIHVzZWQuCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIENvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3IgZXh0ZW5kcyBDb3VudHJ5RGV0ZWN0b3JCYXNlIHsKKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvciI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVmcmVzaCBpbnRlcnZhbCB3aGVuIHRoZSBsb2NhdGlvbiBiYXNlZCBjb3VudHJ5IHdhcyB1c2VkCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBMT0NBVElPTl9SRUZSRVNIX0lOVEVSVkFMID0gMTAwMCAqIDYwICogNjAgKiAyNDsgLy8gMSBkYXkKKworICAgIHByb3RlY3RlZCBDb3VudHJ5RGV0ZWN0b3JCYXNlIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yOworICAgIHByb3RlY3RlZCBUaW1lciBtTG9jYXRpb25SZWZyZXNoVGltZXI7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBtUGhvbmVUeXBlOworICAgIHByaXZhdGUgQ291bnRyeSBtQ291bnRyeTsKKyAgICBwcml2YXRlIFRlbGVwaG9ueU1hbmFnZXIgbVRlbGVwaG9ueU1hbmFnZXI7CisgICAgcHJpdmF0ZSBDb3VudHJ5IG1Db3VudHJ5RnJvbUxvY2F0aW9uOworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RvcHBlZCA9IGZhbHNlOworICAgIHByaXZhdGUgU2VydmljZVN0YXRlIG1MYXN0U3RhdGU7CisKKyAgICBwcml2YXRlIFBob25lU3RhdGVMaXN0ZW5lciBtUGhvbmVTdGF0ZUxpc3RlbmVyID0gbmV3IFBob25lU3RhdGVMaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZVN0YXRlQ2hhbmdlZChTZXJ2aWNlU3RhdGUgc2VydmljZVN0YXRlKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBGaW5kIG91dCBob3cgb2Z0ZW4gd2Ugd2lsbCBiZSBub3RpZmllZCwgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvbworICAgICAgICAgICAgLy8gbWFueSB0aW1lcywgbGV0J3MgY29uc2lkZXIgcXVlcnlpbmcgdGhlIG5ldHdvcmsuCisgICAgICAgICAgICBTbG9nLmQoVEFHLCAib25TZXJ2aWNlU3RhdGVDaGFuZ2VkIik7CisgICAgICAgICAgICAvLyBXZSBvbmx5IGNhcmUgdGhlIHN0YXRlIGNoYW5nZQorICAgICAgICAgICAgaWYgKG1MYXN0U3RhdGUgPT0gbnVsbCB8fCBtTGFzdFN0YXRlLmdldFN0YXRlKCkgIT0gc2VydmljZVN0YXRlLmdldFN0YXRlKCkpIHsKKyAgICAgICAgICAgICAgICBkZXRlY3RDb3VudHJ5KHRydWUsIHRydWUpOworICAgICAgICAgICAgICAgIG1MYXN0U3RhdGUgPSBuZXcgU2VydmljZVN0YXRlKHNlcnZpY2VTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogVGhlIGxpc3RlbmVyIGZvciByZWNlaXZpbmcgdGhlIG5vdGlmaWNhdGlvbiBmcm9tIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBDb3VudHJ5TGlzdGVuZXIgbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0aW9uTGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNvdW50cnlEZXRlY3RlZChDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgICAgIG1Db3VudHJ5RnJvbUxvY2F0aW9uID0gY291bnRyeTsKKyAgICAgICAgICAgIC8vIERvbid0IHN0YXJ0IHRoZSBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLgorICAgICAgICAgICAgZGV0ZWN0Q291bnRyeSh0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICBzdG9wTG9jYXRpb25CYXNlZERldGVjdG9yKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIENvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3IoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBtVGVsZXBob255TWFuYWdlciA9IChUZWxlcGhvbnlNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5URUxFUEhPTllfU0VSVklDRSk7CisgICAgICAgIG1QaG9uZVR5cGUgPSBtVGVsZXBob255TWFuYWdlci5nZXRQaG9uZVR5cGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ291bnRyeSBkZXRlY3RDb3VudHJ5KCkgeworICAgICAgICAvLyBEb24ndCBzdGFydCB0aGUgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciBpZiB3ZSBoYXZlIGJlZW4gc3RvcHBlZC4KKyAgICAgICAgcmV0dXJuIGRldGVjdENvdW50cnkoZmFsc2UsICFtU3RvcHBlZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgU2xvZy5pKFRBRywgIlN0b3AgdGhlIGRldGVjdG9yLiIpOworICAgICAgICBjYW5jZWxMb2NhdGlvblJlZnJlc2goKTsKKyAgICAgICAgcmVtb3ZlUGhvbmVTdGF0ZUxpc3RlbmVyKCk7CisgICAgICAgIHN0b3BMb2NhdGlvbkJhc2VkRGV0ZWN0b3IoKTsKKyAgICAgICAgbUxpc3RlbmVyID0gbnVsbDsKKyAgICAgICAgbVN0b3BwZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY291bnRyeSBmcm9tIGRpZmZlcmVudCBzb3VyY2VzIGluIG9yZGVyIG9mIHRoZSByZWxpYWJpbGl0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvdW50cnkgZ2V0Q291bnRyeSgpIHsKKyAgICAgICAgQ291bnRyeSByZXN1bHQgPSBudWxsOworICAgICAgICByZXN1bHQgPSBnZXROZXR3b3JrQmFzZWRDb3VudHJ5KCk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0ID0gZ2V0TGFzdEtub3duTG9jYXRpb25CYXNlZENvdW50cnkoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGdldFNpbUJhc2VkQ291bnRyeSgpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0ID0gZ2V0TG9jYWxlQ291bnRyeSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY291bnRyeSBmcm9tIHRoZSBtb2JpbGUgbmV0d29yay4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXROZXR3b3JrQmFzZWRDb3VudHJ5KCkgeworICAgICAgICBTdHJpbmcgY291bnRyeUlzbyA9IG51bGw7CisgICAgICAgIC8vIFRPRE86IFRoZSBkb2N1bWVudCBzYXlzIHRoZSByZXN1bHQgbWF5IGJlIHVucmVsaWFibGUgb24gQ0RNQSBuZXR3b3Jrcy4gU2hhbGwgd2UgdXNlCisgICAgICAgIC8vIGl0IG9uIENETUEgcGhvbmU/IFdlIG1heSB0ZXN0IHRoZSBBbmRyb2lkIHByaW1hcmlseSB1c2VkIGNvdW50cmllcy4KKyAgICAgICAgaWYgKG1QaG9uZVR5cGUgPT0gVGVsZXBob255TWFuYWdlci5QSE9ORV9UWVBFX0dTTSkgeworICAgICAgICAgICAgY291bnRyeUlzbyA9IG1UZWxlcGhvbnlNYW5hZ2VyLmdldE5ldHdvcmtDb3VudHJ5SXNvKCk7CisgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGNvdW50cnlJc28pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb3VudHJ5KGNvdW50cnlJc28sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTkVUV09SSyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY2FjaGVkIGxvY2F0aW9uIGJhc2VkIGNvdW50cnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0TGFzdEtub3duTG9jYXRpb25CYXNlZENvdW50cnkoKSB7CisgICAgICAgIHJldHVybiBtQ291bnRyeUZyb21Mb2NhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjb3VudHJ5IGZyb20gU0lNIGNhcmQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRTaW1CYXNlZENvdW50cnkoKSB7CisgICAgICAgIFN0cmluZyBjb3VudHJ5SXNvID0gbnVsbDsKKyAgICAgICAgY291bnRyeUlzbyA9IG1UZWxlcGhvbnlNYW5hZ2VyLmdldFNpbUNvdW50cnlJc28oKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjb3VudHJ5SXNvKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb3VudHJ5KGNvdW50cnlJc28sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfU0lNKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjb3VudHJ5IGZyb20gdGhlIHN5c3RlbSdzIGxvY2FsZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRMb2NhbGVDb3VudHJ5KCkgeworICAgICAgICBMb2NhbGUgZGVmYXVsdExvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7CisgICAgICAgIGlmIChkZWZhdWx0TG9jYWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ291bnRyeShkZWZhdWx0TG9jYWxlLmdldENvdW50cnkoKSwgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9MT0NBTEUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbm90aWZ5Q2hhbmdlIGluZGljYXRlcyB3aGV0aGVyIHRoZSBsaXN0ZW5lciBzaG91bGQgYmUgbm90aWZpZWQgdGhlIGNoYW5nZSBvZiB0aGUKKyAgICAgKiBjb3VudHJ5CisgICAgICogQHBhcmFtIHN0YXJ0TG9jYXRpb25CYXNlZERldGVjdGlvbiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciBjb3VsZAorICAgICAqIGJlIHN0YXJ0ZWQgaWYgdGhlIGN1cnJlbnQgY291bnRyeSBzb3VyY2UgaXMgbGVzcyByZWxpYWJsZSB0aGFuIHRoZSBsb2NhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGF2YWlsYWJsZSBVc2VyQ291bnRyeQorICAgICAqLworICAgIHByaXZhdGUgQ291bnRyeSBkZXRlY3RDb3VudHJ5KGJvb2xlYW4gbm90aWZ5Q2hhbmdlLCBib29sZWFuIHN0YXJ0TG9jYXRpb25CYXNlZERldGVjdGlvbikgeworICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBnZXRDb3VudHJ5KCk7CisgICAgICAgIHJ1bkFmdGVyRGV0ZWN0aW9uQXN5bmMobUNvdW50cnkgIT0gbnVsbCA/IG5ldyBDb3VudHJ5KG1Db3VudHJ5KSA6IG1Db3VudHJ5LCBjb3VudHJ5LAorICAgICAgICAgICAgICAgIG5vdGlmeUNoYW5nZSwgc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0aW9uKTsKKyAgICAgICAgbUNvdW50cnkgPSBjb3VudHJ5OworICAgICAgICByZXR1cm4gbUNvdW50cnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIHRoZSB0YXNrcyBpbiB0aGUgc2VydmljZSdzIHRocmVhZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBydW5BZnRlckRldGVjdGlvbkFzeW5jKGZpbmFsIENvdW50cnkgY291bnRyeSwgZmluYWwgQ291bnRyeSBkZXRlY3RlZENvdW50cnksCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIG5vdGlmeUNoYW5nZSwgZmluYWwgYm9vbGVhbiBzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24pIHsKKyAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgcnVuQWZ0ZXJEZXRlY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5LCBkZXRlY3RlZENvdW50cnksIG5vdGlmeUNoYW5nZSwgc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q291bnRyeUxpc3RlbmVyKENvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBDb3VudHJ5TGlzdGVuZXIgcHJldkxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgaWYgKG1MaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBTdG9wIGxpc3RlbmluZyBhbGwgc2VydmljZXMKKyAgICAgICAgICAgIHJlbW92ZVBob25lU3RhdGVMaXN0ZW5lcigpOworICAgICAgICAgICAgc3RvcExvY2F0aW9uQmFzZWREZXRlY3RvcigpOworICAgICAgICAgICAgY2FuY2VsTG9jYXRpb25SZWZyZXNoKCk7CisgICAgICAgIH0gZWxzZSBpZiAocHJldkxpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGFkZFBob25lU3RhdGVMaXN0ZW5lcigpOworICAgICAgICAgICAgZGV0ZWN0Q291bnRyeShmYWxzZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJ1bkFmdGVyRGV0ZWN0aW9uKGZpbmFsIENvdW50cnkgY291bnRyeSwgZmluYWwgQ291bnRyeSBkZXRlY3RlZENvdW50cnksCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIG5vdGlmeUNoYW5nZSwgZmluYWwgYm9vbGVhbiBzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24pIHsKKyAgICAgICAgaWYgKG5vdGlmeUNoYW5nZSkgeworICAgICAgICAgICAgbm90aWZ5SWZDb3VudHJ5Q2hhbmdlZChjb3VudHJ5LCBkZXRlY3RlZENvdW50cnkpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24gJiYgKGRldGVjdGVkQ291bnRyeSA9PSBudWxsCisgICAgICAgICAgICAgICAgfHwgZGV0ZWN0ZWRDb3VudHJ5LmdldFNvdXJjZSgpID4gQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9MT0NBVElPTikKKyAgICAgICAgICAgICAgICAmJiBpc0FpcnBsYW5lTW9kZU9mZigpICYmIG1MaXN0ZW5lciAhPSBudWxsICYmIGlzR2VvQ29kZXJJbXBsZW1lbnRlZCgpKSB7CisgICAgICAgICAgICAvLyBTdGFydCBmaW5kaW5nIGxvY2F0aW9uIHdoZW4gdGhlIHNvdXJjZSBpcyBsZXNzIHJlbGlhYmxlIHRoYW4gdGhlCisgICAgICAgICAgICAvLyBsb2NhdGlvbiBhbmQgdGhlIGFpcnBsYW5lIG1vZGUgaXMgb2ZmIChhcyBnZW9jb2RlciB3aWxsIG5vdAorICAgICAgICAgICAgLy8gd29yaykuCisgICAgICAgICAgICAvLyBUT0RPIDogU2hhbGwgd2UgZ2l2ZSB1cCBzdGFydGluZyB0aGUgZGV0ZWN0b3Igd2l0aGluIGEKKyAgICAgICAgICAgIC8vIHBlcmlvZCBvZiB0aW1lPworICAgICAgICAgICAgc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0b3IobUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0aW9uTGlzdGVuZXIpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXRlY3RlZENvdW50cnkgPT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IGRldGVjdGVkQ291bnRyeS5nZXRTb3VyY2UoKSA+PSBDb3VudHJ5LkNPVU5UUllfU09VUkNFX0xPQ0FUSU9OKSB7CisgICAgICAgICAgICAvLyBTY2hlZHVsZSB0aGUgbG9jYXRpb24gcmVmcmVzaCBpZiB0aGUgY291bnRyeSBzb3VyY2UgaXMKKyAgICAgICAgICAgIC8vIG5vdCBtb3JlIHJlbGlhYmxlIHRoYW4gdGhlIGxvY2F0aW9uIG9yIG5vIGNvdW50cnkgaXMKKyAgICAgICAgICAgIC8vIGZvdW5kLgorICAgICAgICAgICAgLy8gVE9ETzogTGlzdGVuIHRvIHRoZSBwcmVmZXJlbmNlIGNoYW5nZSBvZiBHUFMsIFdpZmkgZXRjLAorICAgICAgICAgICAgLy8gYW5kIHN0YXJ0IGRldGVjdGluZyB0aGUgY291bnRyeS4KKyAgICAgICAgICAgIHNjaGVkdWxlTG9jYXRpb25SZWZyZXNoKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBDYW5jZWwgdGhlIGxvY2F0aW9uIHJlZnJlc2ggb25jZSB0aGUgY3VycmVudCBzb3VyY2UgaXMKKyAgICAgICAgICAgIC8vIG1vcmUgcmVsaWFibGUgdGhhbiB0aGUgbG9jYXRpb24uCisgICAgICAgICAgICBjYW5jZWxMb2NhdGlvblJlZnJlc2goKTsKKyAgICAgICAgICAgIHN0b3BMb2NhdGlvbkJhc2VkRGV0ZWN0b3IoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIGNvdW50cnkgZnJvbSBMb2NhdGlvblByb3ZpZGVyLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0b3IoQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IgPSBjcmVhdGVMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yKCk7CisgICAgICAgIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHN0b3BMb2NhdGlvbkJhc2VkRGV0ZWN0b3IoKSB7CisgICAgICAgIGlmIChtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rvci5zdG9wKCk7CisgICAgICAgICAgICBtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ291bnRyeURldGVjdG9yQmFzZSBjcmVhdGVMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yKCkgeworICAgICAgICByZXR1cm4gbmV3IExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IobUNvbnRleHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzQWlycGxhbmVNb2RlT2ZmKCkgeworICAgICAgICByZXR1cm4gU2V0dGluZ3MuU3lzdGVtLmdldEludCgKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgU2V0dGluZ3MuU3lzdGVtLkFJUlBMQU5FX01PREVfT04sIDApID09IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSBjb3VudHJ5IGNoYW5nZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5SWZDb3VudHJ5Q2hhbmdlZChmaW5hbCBDb3VudHJ5IGNvdW50cnksIGZpbmFsIENvdW50cnkgZGV0ZWN0ZWRDb3VudHJ5KSB7CisgICAgICAgIGlmIChkZXRlY3RlZENvdW50cnkgIT0gbnVsbCAmJiBtTGlzdGVuZXIgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIChjb3VudHJ5ID09IG51bGwgfHwgIWNvdW50cnkuZXF1YWxzKGRldGVjdGVkQ291bnRyeSkpKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLAorICAgICAgICAgICAgICAgICAgICAiVGhlIGNvdW50cnkgd2FzIGNoYW5nZWQgZnJvbSAiICsgY291bnRyeSAhPSBudWxsID8gY291bnRyeS5nZXRDb3VudHJ5SXNvKCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeSArICIgdG8gIiArIGRldGVjdGVkQ291bnRyeS5nZXRDb3VudHJ5SXNvKCkpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoZGV0ZWN0ZWRDb3VudHJ5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNjaGVkdWxlIHRoZSBuZXh0IGxvY2F0aW9uIHJlZnJlc2guIFdlIHdpbGwgZG8gbm90aGluZyBpZiB0aGUgc2NoZWR1bGVkIHRhc2sgZXhpc3RzLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2NoZWR1bGVMb2NhdGlvblJlZnJlc2goKSB7CisgICAgICAgIGlmIChtTG9jYXRpb25SZWZyZXNoVGltZXIgIT0gbnVsbCkgcmV0dXJuOworICAgICAgICBtTG9jYXRpb25SZWZyZXNoVGltZXIgPSBuZXcgVGltZXIoKTsKKyAgICAgICAgbUxvY2F0aW9uUmVmcmVzaFRpbWVyLnNjaGVkdWxlKG5ldyBUaW1lclRhc2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtTG9jYXRpb25SZWZyZXNoVGltZXIgPSBudWxsOworICAgICAgICAgICAgICAgIGRldGVjdENvdW50cnkoZmFsc2UsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9LCBMT0NBVElPTl9SRUZSRVNIX0lOVEVSVkFMKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgdGhlIHNjaGVkdWxlZCByZWZyZXNoIHRhc2sgaWYgaXQgZXhpc3RzCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBjYW5jZWxMb2NhdGlvblJlZnJlc2goKSB7CisgICAgICAgIGlmIChtTG9jYXRpb25SZWZyZXNoVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvY2F0aW9uUmVmcmVzaFRpbWVyLmNhbmNlbCgpOworICAgICAgICAgICAgbUxvY2F0aW9uUmVmcmVzaFRpbWVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBhZGRQaG9uZVN0YXRlTGlzdGVuZXIoKSB7CisgICAgICAgIGlmIChtUGhvbmVTdGF0ZUxpc3RlbmVyID09IG51bGwgJiYgbVBob25lVHlwZSA9PSBUZWxlcGhvbnlNYW5hZ2VyLlBIT05FX1RZUEVfR1NNKSB7CisgICAgICAgICAgICBtTGFzdFN0YXRlID0gbnVsbDsKKyAgICAgICAgICAgIG1QaG9uZVN0YXRlTGlzdGVuZXIgPSBuZXcgUGhvbmVTdGF0ZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZVN0YXRlQ2hhbmdlZChTZXJ2aWNlU3RhdGUgc2VydmljZVN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEZpbmQgb3V0IGhvdyBvZnRlbiB3ZSB3aWxsIGJlIG5vdGlmaWVkLCBpZiB0aGlzCisgICAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBpcyBjYWxsZWQgdG9vCisgICAgICAgICAgICAgICAgICAgIC8vIG1hbnkgdGltZXMsIGxldCdzIGNvbnNpZGVyIHF1ZXJ5aW5nIHRoZSBuZXR3b3JrLgorICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAib25TZXJ2aWNlU3RhdGVDaGFuZ2VkIik7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgY2FyZSB0aGUgc3RhdGUgY2hhbmdlCisgICAgICAgICAgICAgICAgICAgIGlmIChtTGFzdFN0YXRlID09IG51bGwgfHwgbUxhc3RTdGF0ZS5nZXRTdGF0ZSgpICE9IHNlcnZpY2VTdGF0ZS5nZXRTdGF0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3RDb3VudHJ5KHRydWUsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RTdGF0ZSA9IG5ldyBTZXJ2aWNlU3RhdGUoc2VydmljZVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBtVGVsZXBob255TWFuYWdlci5saXN0ZW4obVBob25lU3RhdGVMaXN0ZW5lciwgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9TRVJWSUNFX1NUQVRFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVQaG9uZVN0YXRlTGlzdGVuZXIoKSB7CisgICAgICAgIGlmIChtUGhvbmVTdGF0ZUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyLmxpc3RlbihtUGhvbmVTdGF0ZUxpc3RlbmVyLCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX05PTkUpOworICAgICAgICAgICAgbVBob25lU3RhdGVMaXN0ZW5lciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0dlb0NvZGVySW1wbGVtZW50ZWQoKSB7CisgICAgICAgIHJldHVybiBHZW9jb2Rlci5pc1ByZXNlbnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db3VudHJ5RGV0ZWN0b3JCYXNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db3VudHJ5RGV0ZWN0b3JCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMyNmVmOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0NvdW50cnlEZXRlY3RvckJhc2UuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5sb2NhdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeTsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBtZXRob2RzIG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGNvdW50cnkKKyAqIGRldGVjdG9yLgorICogPHA+CisgKiBDYWxsaW5nIHtAbGluayAjZGV0ZWN0Q291bnRyeX0gdG8gc3RhcnQgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5LiBUaGUgY291bnRyeQorICogY291bGQgYmUgcmV0dXJuZWQgaW1tZWRpYXRlbHkgaWYgaXQgaXMgYXZhaWxhYmxlLgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb3VudHJ5RGV0ZWN0b3JCYXNlIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKKyAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcm90ZWN0ZWQgQ291bnRyeUxpc3RlbmVyIG1MaXN0ZW5lcjsKKyAgICBwcm90ZWN0ZWQgQ291bnRyeSBtRGV0ZWN0ZWRDb3VudHJ5OworCisgICAgcHVibGljIENvdW50cnlEZXRlY3RvckJhc2UoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjdHg7CisgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBkZXRlY3RpbmcgdGhlIGNvdW50cnkgdGhhdCB0aGUgdXNlciBpcyBpbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvdW50cnkgaWYgaXQgaXMgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LCBvdGhlcndpc2UgbnVsbCBzaG91bGQKKyAgICAgKiAgICAgICAgIGJlIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBDb3VudHJ5IGRldGVjdENvdW50cnkoKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSB0aGUgbm90aWZpY2F0aW9uIHdoZW4gdGhlIGNvdW50cnkgaXMgZGV0ZWN0ZWQgb3IgY2hhbmdlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcHJldmlvdXMgbGlzdGVuZXIgd2lsbCBiZSByZXBsYWNlZCBpZiBpdCBleGlzdHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q291bnRyeUxpc3RlbmVyKENvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wIGRldGVjdGluZyB0aGUgY291bnRyeS4gVGhlIGRldGVjdG9yIHNob3VsZCByZWxlYXNlIGFsbCBzeXN0ZW0gc2VydmljZXMgYW5kIGJlIHJlYWR5IHRvCisgICAgICogYmUgZnJlZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdG9wKCk7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcihDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdGVuZXIub25Db3VudHJ5RGV0ZWN0ZWQoY291bnRyeSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTM5ZjA1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0xvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IuamF2YQpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIubG9jYXRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyOworaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkFkZHJlc3M7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uR2VvY29kZXI7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CisKKy8qKgorICogVGhpcyBjbGFzcyBkZXRlY3RzIHdoaWNoIGNvdW50cnkgdGhlIHVzZXIgY3VycmVudGx5IGlzIGluIHRocm91Z2ggdGhlIGVuYWJsZWQKKyAqIGxvY2F0aW9uIHByb3ZpZGVycyBhbmQgdGhlIEdlb0NvZGVyCisgKiA8cD4KKyAqIFVzZSB7QGxpbmsgI2RldGVjdENvdW50cnl9IHRvIHN0YXJ0IHF1ZXJ5aW5nLiBJZiB0aGUgbG9jYXRpb24gY2FuIG5vdCBiZQorICogcmVzb2x2ZWQgd2l0aGluIHRoZSBnaXZlbiB0aW1lLCB0aGUgbGFzdCBrbm93biBsb2NhdGlvbiB3aWxsIGJlIHVzZWQgdG8gZ2V0CisgKiB0aGUgdXNlciBjb3VudHJ5IHRocm91Z2ggdGhlIEdlb0NvZGVyLiBUaGUgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdpbGwgYmUKKyAqIHRocm93biBpZiB0aGVyZSBpcyBhIG9uZ29pbmcgcXVlcnkuCisgKiA8cD4KKyAqIFRoZSBjdXJyZW50IHF1ZXJ5IGNhbiBiZSBzdG9wcGVkIGJ5IHtAbGluayAjc3RvcCgpfQorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIGV4dGVuZHMgQ291bnRyeURldGVjdG9yQmFzZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIFFVRVJZX0xPQ0FUSU9OX1RJTUVPVVQgPSAxMDAwICogNjAgKiA1OyAvLyA1IG1pbnMKKworICAgIC8qKgorICAgICAqIFVzZWQgZm9yIGNhbmNlbGluZyBsb2NhdGlvbiBxdWVyeQorICAgICAqLworICAgIHByb3RlY3RlZCBUaW1lciBtVGltZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGhyZWFkIHRvIHF1ZXJ5IHRoZSBjb3VudHJ5IGZyb20gdGhlIEdlb0NvZGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBUaHJlYWQgbVF1ZXJ5VGhyZWFkOworICAgIHByb3RlY3RlZCBMaXN0PExvY2F0aW9uTGlzdGVuZXI+IG1Mb2NhdGlvbkxpc3RlbmVyczsKKworICAgIHByaXZhdGUgTG9jYXRpb25NYW5hZ2VyIG1Mb2NhdGlvbk1hbmFnZXI7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbUVuYWJsZWRQcm92aWRlcnM7CisKKyAgICBwdWJsaWMgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvcihDb250ZXh0IGN0eCkgeworICAgICAgICBzdXBlcihjdHgpOworICAgICAgICBtTG9jYXRpb25NYW5hZ2VyID0gKExvY2F0aW9uTWFuYWdlcikgY3R4LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MT0NBVElPTl9TRVJWSUNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZSBmcm9tIHRoZSBsb2NhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q291bnRyeUZyb21Mb2NhdGlvbihMb2NhdGlvbiBsb2NhdGlvbikgeworICAgICAgICBTdHJpbmcgY291bnRyeSA9IG51bGw7CisgICAgICAgIEdlb2NvZGVyIGdlb0NvZGVyID0gbmV3IEdlb2NvZGVyKG1Db250ZXh0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpc3Q8QWRkcmVzcz4gYWRkcmVzc2VzID0gZ2VvQ29kZXIuZ2V0RnJvbUxvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5nZXRMYXRpdHVkZSgpLCBsb2NhdGlvbi5nZXRMb25naXR1ZGUoKSwgMSk7CisgICAgICAgICAgICBpZiAoYWRkcmVzc2VzICE9IG51bGwgJiYgYWRkcmVzc2VzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBjb3VudHJ5ID0gYWRkcmVzc2VzLmdldCgwKS5nZXRDb3VudHJ5Q29kZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLncoVEFHLCAiRXhjZXB0aW9uIG9jY3VycyB3aGVuIGdldHRpbmcgY291bnRyeSBmcm9tIGxvY2F0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50cnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgdGhlIGxpc3RlbmVycyB3aXRoIHRoZSBsb2NhdGlvbiBwcm92aWRlcnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckVuYWJsZWRQcm92aWRlcnMoTGlzdDxMb2NhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgaW50IHRvdGFsID0gbGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8IHRvdGFsOyBpKyspIHsKKyAgICAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcygKKyAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWRQcm92aWRlcnMuZ2V0KGkpLCAwLCAwLCBsaXN0ZW5lcnMuZ2V0KGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXIgdGhlIGxpc3RlbmVycyB3aXRoIHRoZSBsb2NhdGlvbiBwcm92aWRlcnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB1bnJlZ2lzdGVyUHJvdmlkZXJzKExpc3Q8TG9jYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXJzKSB7CisgICAgICAgIGZvciAoTG9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgeworICAgICAgICAgICAgbUxvY2F0aW9uTWFuYWdlci5yZW1vdmVVcGRhdGVzKGxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGxhc3Qga25vd24gbG9jYXRpb24gZnJvbSBhbGwgcHJvdmlkZXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIExvY2F0aW9uIGdldExhc3RLbm93bkxvY2F0aW9uKCkgeworICAgICAgICBMaXN0PFN0cmluZz4gcHJvdmlkZXJzID0gbUxvY2F0aW9uTWFuYWdlci5nZXRBbGxQcm92aWRlcnMoKTsKKyAgICAgICAgTG9jYXRpb24gYmVzdExvY2F0aW9uID0gbnVsbDsKKyAgICAgICAgZm9yIChTdHJpbmcgcHJvdmlkZXIgOiBwcm92aWRlcnMpIHsKKyAgICAgICAgICAgIExvY2F0aW9uIGxhc3RLbm93bkxvY2F0aW9uID0gbUxvY2F0aW9uTWFuYWdlci5nZXRMYXN0S25vd25Mb2NhdGlvbihwcm92aWRlcik7CisgICAgICAgICAgICBpZiAobGFzdEtub3duTG9jYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChiZXN0TG9jYXRpb24gPT0gbnVsbCB8fCBiZXN0TG9jYXRpb24uZ2V0VGltZSgpIDwgbGFzdEtub3duTG9jYXRpb24uZ2V0VGltZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGJlc3RMb2NhdGlvbiA9IGxhc3RLbm93bkxvY2F0aW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYmVzdExvY2F0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHRpbWVvdXQgZm9yIHF1ZXJ5aW5nIHRoZSBsb2NhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBnZXRRdWVyeUxvY2F0aW9uVGltZW91dCgpIHsKKyAgICAgICAgcmV0dXJuIFFVRVJZX0xPQ0FUSU9OX1RJTUVPVVQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGVuYWJsZWQgbG9jYXRpb24gcHJvdmlkZXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBnZXRUb3RhbEVuYWJsZWRQcm92aWRlcnMoKSB7CisgICAgICAgIGlmIChtRW5hYmxlZFByb3ZpZGVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtRW5hYmxlZFByb3ZpZGVycyA9IG1Mb2NhdGlvbk1hbmFnZXIuZ2V0UHJvdmlkZXJzKHRydWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRW5hYmxlZFByb3ZpZGVycy5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5LgorICAgICAqIDxwPgorICAgICAqIFF1ZXJpZXMgdGhlIGxvY2F0aW9uIGZyb20gYWxsIGxvY2F0aW9uIHByb3ZpZGVycywgdGhlbiBzdGFydHMgYSB0aHJlYWQgdG8gcXVlcnkgdGhlCisgICAgICogY291bnRyeSBmcm9tIEdlb0NvZGVyLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ291bnRyeSBkZXRlY3RDb3VudHJ5KCkgeworICAgICAgICBpZiAobUxvY2F0aW9uTGlzdGVuZXJzICAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVxdWVzdCB0aGUgbG9jYXRpb24gZnJvbSBhbGwgZW5hYmxlZCBwcm92aWRlcnMuCisgICAgICAgIGludCB0b3RhbFByb3ZpZGVycyA9IGdldFRvdGFsRW5hYmxlZFByb3ZpZGVycygpOworICAgICAgICBpZiAodG90YWxQcm92aWRlcnMgPiAwKSB7CisgICAgICAgICAgICBtTG9jYXRpb25MaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PExvY2F0aW9uTGlzdGVuZXI+KHRvdGFsUHJvdmlkZXJzKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxQcm92aWRlcnM7IGkrKykgeworICAgICAgICAgICAgICAgIExvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYXRpb25MaXN0ZW5lciAoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9jYXRpb25DaGFuZ2VkKExvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IudGhpcy5zdG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudHJ5Q29kZShsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckRpc2FibGVkKFN0cmluZyBwcm92aWRlcikgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJFbmFibGVkKFN0cmluZyBwcm92aWRlcikgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhdHVzQ2hhbmdlZChTdHJpbmcgcHJvdmlkZXIsIGludCBzdGF0dXMsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgbUxvY2F0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWdpc3RlckVuYWJsZWRQcm92aWRlcnMobUxvY2F0aW9uTGlzdGVuZXJzKTsKKyAgICAgICAgICAgIG1UaW1lciA9IG5ldyBUaW1lcigpOworICAgICAgICAgICAgbVRpbWVyLnNjaGVkdWxlKG5ldyBUaW1lclRhc2soKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBtVGltZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLnRoaXMuc3RvcCgpOworICAgICAgICAgICAgICAgICAgICAvLyBMb29rcyBsaWtlIG5vIHByb3ZpZGVyIGNvdWxkIHByb3ZpZGUgdGhlIGxvY2F0aW9uLCBsZXQncyB0cnkgdGhlIGxhc3QKKyAgICAgICAgICAgICAgICAgICAgLy8ga25vd24gbG9jYXRpb24uCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnRyeUNvZGUoZ2V0TGFzdEtub3duTG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgZ2V0UXVlcnlMb2NhdGlvblRpbWVvdXQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBwcm92aWRlciBlbmFibGVkLgorICAgICAgICAgICAgcXVlcnlDb3VudHJ5Q29kZShnZXRMYXN0S25vd25Mb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURldGVjdGVkQ291bnRyeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wIHRoZSBjdXJyZW50IHF1ZXJ5IHdpdGhvdXQgbm90aWZ5aW5nIHRoZSBsaXN0ZW5lci4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgaWYgKG1Mb2NhdGlvbkxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICB1bnJlZ2lzdGVyUHJvdmlkZXJzKG1Mb2NhdGlvbkxpc3RlbmVycyk7CisgICAgICAgICAgICBtTG9jYXRpb25MaXN0ZW5lcnMgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChtVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpbWVyLmNhbmNlbCgpOworICAgICAgICAgICAgbVRpbWVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgbmV3IHRocmVhZCB0byBxdWVyeSB0aGUgY291bnRyeSBmcm9tIEdlb2NvZGVyLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcXVlcnlDb3VudHJ5Q29kZShmaW5hbCBMb2NhdGlvbiBsb2NhdGlvbikgeworICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobnVsbCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1RdWVyeVRocmVhZCAhPSBudWxsKSByZXR1cm47CisgICAgICAgIG1RdWVyeVRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBjb3VudHJ5SXNvID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb3VudHJ5SXNvID0gZ2V0Q291bnRyeUZyb21Mb2NhdGlvbihsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb3VudHJ5SXNvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbURldGVjdGVkQ291bnRyeSA9IG5ldyBDb3VudHJ5KGNvdW50cnlJc28sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTE9DQVRJT04pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1EZXRlY3RlZENvdW50cnkgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtRGV0ZWN0ZWRDb3VudHJ5KTsKKyAgICAgICAgICAgICAgICBtUXVlcnlUaHJlYWQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgbVF1ZXJ5VGhyZWFkLnN0YXJ0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9qbmkvQW5kcm9pZC5tawppbmRleCBjZGMwYTZmLi40NTk1NTFkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qbmkvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9qbmkvQW5kcm9pZC5tawpAQCAtOCw2ICs4LDcgQEAKICAgICBjb21fYW5kcm9pZF9zZXJ2ZXJfTGlnaHRzU2VydmljZS5jcHAgXAogICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9Qb3dlck1hbmFnZXJTZXJ2aWNlLmNwcCBcCiAgICAgY29tX2FuZHJvaWRfc2VydmVyX1N5c3RlbVNlcnZlci5jcHAgXAorICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlci5jcHAgXAogICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9WaWJyYXRvclNlcnZpY2UuY3BwIFwKIAljb21fYW5kcm9pZF9zZXJ2ZXJfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlci5jcHAgXAogICAgIG9ubG9hZC5jcHAKQEAgLTI1LDYgKzI2LDggQEAKIAlsaWJ1dGlscyBcCiAJbGlidWkKIAorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJ1c2Job3N0CisKIGlmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKIGlmZXEgKCQoVEFSR0VUX09TKSxsaW51eCkKIGlmZXEgKCQoVEFSR0VUX0FSQ0gpLHg4NikKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyLmNwcAppbmRleCA4ZTdiZTQ0Li40ZjFmYWI3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX0lucHV0TWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9JbnB1dE1hbmFnZXIuY3BwCkBAIC0xMjc4LDYgKzEyNzgsMjcgQEAKICAgICBlbnYtPlNldEludEZpZWxkKGNvbmZpZ09iaiwgZ0NvbmZpZ3VyYXRpb25DbGFzc0luZm8ubmF2aWdhdGlvbiwgY29uZmlnLm5hdmlnYXRpb24pOwogfQogCitzdGF0aWMgamJvb2xlYW4gYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyX25hdGl2ZVRyYW5zZmVyVG91Y2hGb2N1cyhKTklFbnYqIGVudiwKKyAgICAgICAgamNsYXNzIGNsYXp6LCBqb2JqZWN0IGZyb21DaGFubmVsT2JqLCBqb2JqZWN0IHRvQ2hhbm5lbE9iaikgeworICAgIGlmIChjaGVja0lucHV0TWFuYWdlclVuaXRpYWxpemVkKGVudikpIHsKKyAgICAgICAgTE9HRCgiaW5wdXQgbWFuYWdlciB1bmluaXRpYWxpemVkOyBiYWlsaW5nIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzcDxJbnB1dENoYW5uZWw+IGZyb21DaGFubmVsID0KKyAgICAgICAgICAgIGFuZHJvaWRfdmlld19JbnB1dENoYW5uZWxfZ2V0SW5wdXRDaGFubmVsKGVudiwgZnJvbUNoYW5uZWxPYmopOworICAgIHNwPElucHV0Q2hhbm5lbD4gdG9DaGFubmVsID0KKyAgICAgICAgICAgIGFuZHJvaWRfdmlld19JbnB1dENoYW5uZWxfZ2V0SW5wdXRDaGFubmVsKGVudiwgdG9DaGFubmVsT2JqKTsKKworICAgIGlmIChmcm9tQ2hhbm5lbCA9PSBOVUxMIHx8IHRvQ2hhbm5lbCA9PSBOVUxMKSB7CisgICAgICAgIExPR0QoImJhaWxpbmcgYmVjYXVzZSBmcm9tPSVwIHRvPSVwIiwgZnJvbUNoYW5uZWwsIHRvQ2hhbm5lbCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gZ05hdGl2ZUlucHV0TWFuYWdlci0+Z2V0SW5wdXRNYW5hZ2VyKCktPmdldERpc3BhdGNoZXIoKS0+CisgICAgICAgICAgICB0cmFuc2ZlclRvdWNoRm9jdXMoZnJvbUNoYW5uZWwsIHRvQ2hhbm5lbCk7Cit9CisKIHN0YXRpYyBqc3RyaW5nIGFuZHJvaWRfc2VydmVyX0lucHV0TWFuYWdlcl9uYXRpdmVEdW1wKEpOSUVudiogZW52LCBqY2xhc3MgY2xhenopIHsKICAgICBpZiAoY2hlY2tJbnB1dE1hbmFnZXJVbml0aWFsaXplZChlbnYpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTMyNiw2ICsxMzQ3LDggQEAKICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyX25hdGl2ZUdldElucHV0RGV2aWNlSWRzIH0sCiAgICAgeyAibmF0aXZlR2V0SW5wdXRDb25maWd1cmF0aW9uIiwgIihMYW5kcm9pZC9jb250ZW50L3Jlcy9Db25maWd1cmF0aW9uOylWIiwKICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyX25hdGl2ZUdldElucHV0Q29uZmlndXJhdGlvbiB9LAorICAgIHsgIm5hdGl2ZVRyYW5zZmVyVG91Y2hGb2N1cyIsICIoTGFuZHJvaWQvdmlldy9JbnB1dENoYW5uZWw7TGFuZHJvaWQvdmlldy9JbnB1dENoYW5uZWw7KVoiLAorICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3NlcnZlcl9JbnB1dE1hbmFnZXJfbmF0aXZlVHJhbnNmZXJUb3VjaEZvY3VzIH0sCiAgICAgeyAibmF0aXZlRHVtcCIsICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIsCiAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfc2VydmVyX0lucHV0TWFuYWdlcl9uYXRpdmVEdW1wIH0sCiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlci5jcHAgYi9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX1VzYk9ic2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzQ3OGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlci5jcHAKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlVzYk9ic2VydmVyIgorI2luY2x1ZGUgInV0aWxzL0xvZy5oIgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAiSk5JSGVscC5oIgorI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgorI2luY2x1ZGUgInV0aWxzL1ZlY3Rvci5oIgorCisjaW5jbHVkZSA8dXNiaG9zdC91c2Job3N0Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDIwKQorI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KKyNlbHNlCisjaW5jbHVkZSA8bGludXgvdXNiX2NoOS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZAoreworCitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF91c2JDYW1lcmFBZGRlZDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX3VzYkNhbWVyYVJlbW92ZWQ7CisKK1ZlY3RvcjxpbnQ+IG1EZXZpY2VMaXN0OworCitzdGF0aWMgdm9pZCBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKEpOSUVudiogZW52LCBjb25zdCBjaGFyKiBtZXRob2ROYW1lKSB7CisgICAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgeworICAgICAgICBMT0dFKCJBbiBleGNlcHRpb24gd2FzIHRocm93biBieSBjYWxsYmFjayAnJXMnLiIsIG1ldGhvZE5hbWUpOworICAgICAgICBMT0dFX0VYKGVudik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgdXNiX2RldmljZV9hZGRlZChjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkKiBjbGllbnRfZGF0YSkgeworICAgIC8vIGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBhIGNhbWVyYQorICAgIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIqIGRlc2M7CisgICAgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2l0ZXIgaXRlcjsKKworICAgIHN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UgPSB1c2JfZGV2aWNlX29wZW4oZGV2bmFtZSk7CisgICAgaWYgKCFkZXZpY2UpIHsKKyAgICAgICAgTE9HRSgidXNiX2RldmljZV9vcGVuIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVzYl9kZXNjcmlwdG9yX2l0ZXJfaW5pdChkZXZpY2UsICZpdGVyKTsKKworICAgIHdoaWxlICgoZGVzYyA9IHVzYl9kZXNjcmlwdG9yX2l0ZXJfbmV4dCgmaXRlcikpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9PSBVU0JfRFRfSU5URVJGQUNFKSB7CisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICppbnRlcmZhY2UgPSAoc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqKWRlc2M7CisKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2UtPmJJbnRlcmZhY2VDbGFzcyA9PSBVU0JfQ0xBU1NfU1RJTExfSU1BR0UgJiYKKyAgICAgICAgICAgICAgICBpbnRlcmZhY2UtPmJJbnRlcmZhY2VTdWJDbGFzcyA9PSAxICYmIC8vIFN0aWxsIEltYWdlIENhcHR1cmUKKyAgICAgICAgICAgICAgICBpbnRlcmZhY2UtPmJJbnRlcmZhY2VQcm90b2NvbCA9PSAxKSAgICAgLy8gUGljdHVyZSBUcmFuc2ZlciBQcm90b2NvbCAoUElNQSAxNTQ3MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMT0dEKCJGb3VuZCBjYW1lcmE6IFwiJXNcIiBcIiVzXCJcbiIsIHVzYl9kZXZpY2VfZ2V0X21hbnVmYWN0dXJlcl9uYW1lKGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICB1c2JfZGV2aWNlX2dldF9wcm9kdWN0X25hbWUoZGV2aWNlKSk7CisKKyAgICAgICAgICAgICAgICAvLyBpbnRlcmZhY2Ugc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IHRocmVlIGVuZHBvaW50cworICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXA7CisgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcF9pbl9kZXNjID0gTlVMTDsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX291dF9kZXNjID0gTlVMTDsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX2ludHJfZGVzYyA9IE5VTEw7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZXAgPSAoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICopdXNiX2Rlc2NyaXB0b3JfaXRlcl9uZXh0KCZpdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFlcCB8fCBlcC0+YkRlc2NyaXB0b3JUeXBlICE9IFVTQl9EVF9FTkRQT0lOVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiZW5kcG9pbnRzIG5vdCBmb3VuZFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVwLT5ibUF0dHJpYnV0ZXMgPT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwX2luX2Rlc2MgPSBlcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcF9vdXRfZGVzYyA9IGVwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVwLT5ibUF0dHJpYnV0ZXMgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UICYmCisgICAgICAgICAgICAgICAgICAgICAgICBlcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgeworICAgICAgICAgICAgICAgICAgICAgICAgZXBfaW50cl9kZXNjID0gZXA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFlcF9pbl9kZXNjIHx8ICFlcF9vdXRfZGVzYyB8fCAhZXBfaW50cl9kZXNjKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoImVuZHBvaW50cyBub3QgZm91bmRcbiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaWYgd2UgZ290IGhlcmUsIHdlIGZvdW5kIGEgY2FtZXJhCisgICAgICAgICAgICAgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgICAgICAgICAgICAgam9iamVjdCB0aGl6ID0gKGpvYmplY3QpY2xpZW50X2RhdGE7CisKKyAgICAgICAgICAgICAgICBpbnQgaWQgPSB1c2JfZGV2aWNlX2dldF91bmlxdWVfaWRfZnJvbV9uYW1lKGRldm5hbWUpOworICAgICAgICAgICAgICAgIG1EZXZpY2VMaXN0LmFkZChpZCk7CisKKyAgICAgICAgICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKHRoaXosIG1ldGhvZF91c2JDYW1lcmFBZGRlZCwgaWQpOworICAgICAgICAgICAgICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorZG9uZToKKyAgICB1c2JfZGV2aWNlX2Nsb3NlKGRldmljZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiX2RldmljZV9yZW1vdmVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKSB7CisgICAgaW50IGlkID0gdXNiX2RldmljZV9nZXRfdW5pcXVlX2lkX2Zyb21fbmFtZShkZXZuYW1lKTsKKworICAgIC8vIHNlZSBpZiBpdCBpcyBhIGRldmljZSB3ZSBrbm93IGFib3V0CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRGV2aWNlTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaWQgID09IG1EZXZpY2VMaXN0W2ldKSB7CisgICAgICAgICAgICBtRGV2aWNlTGlzdC5yZW1vdmVBdChpKTsKKworICAgICAgICAgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgICAgICAgICBqb2JqZWN0IHRoaXogPSAoam9iamVjdCljbGllbnRfZGF0YTsKKworICAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZCh0aGl6LCBtZXRob2RfdXNiQ2FtZXJhUmVtb3ZlZCwgaWQpOworICAgICAgICAgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF9zZXJ2ZXJfVXNiT2JzZXJ2ZXJfbW9uaXRvclVzYkhvc3RCdXMoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyAgICBzdHJ1Y3QgdXNiX2hvc3RfY29udGV4dCogY29udGV4dCA9IHVzYl9ob3N0X2luaXQoKTsKKyAgICBpZiAoIWNvbnRleHQpIHsKKyAgICAgICAgTE9HRSgidXNiX2hvc3RfaW5pdCBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyB0aGlzIHdpbGwgbmV2ZXIgcmV0dXJuIHNvIGl0IGlzIHNhZmUgdG8gcGFzcyB0aGl6IGRpcmVjdGx5CisgICAgdXNiX2hvc3RfcnVuKGNvbnRleHQsIHVzYl9kZXZpY2VfYWRkZWQsIHVzYl9kZXZpY2VfcmVtb3ZlZCwgTlVMTCwgKHZvaWQgKil0aGl6KTsKK30KKworc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBtZXRob2RfdGFibGVbXSA9IHsKKyAgICB7ICJtb25pdG9yVXNiSG9zdEJ1cyIsICIoKVYiLCAodm9pZCopYW5kcm9pZF9zZXJ2ZXJfVXNiT2JzZXJ2ZXJfbW9uaXRvclVzYkhvc3RCdXMgfQorfTsKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1VzYk9ic2VydmVyKEpOSUVudiAqZW52KQoreworICAgIGpjbGFzcyBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJjb20vYW5kcm9pZC9zZXJ2ZXIvVXNiT2JzZXJ2ZXIiKTsKKyAgICBpZiAoY2xhenogPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGNvbS9hbmRyb2lkL3NlcnZlci9Vc2JPYnNlcnZlciIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF91c2JDYW1lcmFBZGRlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJ1c2JDYW1lcmFBZGRlZCIsICIoSSlWIik7CisgICAgaWYgKG1ldGhvZF91c2JDYW1lcmFBZGRlZCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgdXNiQ2FtZXJhQWRkZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfdXNiQ2FtZXJhUmVtb3ZlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJ1c2JDYW1lcmFSZW1vdmVkIiwgIihJKVYiKTsKKyAgICBpZiAobWV0aG9kX3VzYkNhbWVyYVJlbW92ZWQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIHVzYkNhbWVyYVJlbW92ZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBqbmlSZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LCAiY29tL2FuZHJvaWQvc2VydmVyL1VzYk9ic2VydmVyIiwKKyAgICAgICAgICAgIG1ldGhvZF90YWJsZSwgTkVMRU0obWV0aG9kX3RhYmxlKSk7Cit9CisKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXIuY3BwIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyLmNwcAppbmRleCA1OWQ3Y2RlLi45MzA2OGU2IDEwMDc1NQotLS0gYS9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXIuY3BwCisrKyBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlci5jcHAKQEAgLTI0NSw5ICsyNDUsOSBAQAogICAgICAgICBzQUdwc0ludGVyZmFjZS0+aW5pdCgmc0FHcHNDYWxsYmFja3MpOwogCiAgICAgaWYgKCFzR3BzTmlJbnRlcmZhY2UpCi0gICAgICAgc0dwc05pSW50ZXJmYWNlID0gKGNvbnN0IEdwc05pSW50ZXJmYWNlKilzR3BzSW50ZXJmYWNlLT5nZXRfZXh0ZW5zaW9uKEdQU19OSV9JTlRFUkZBQ0UpOworICAgICAgICBzR3BzTmlJbnRlcmZhY2UgPSAoY29uc3QgR3BzTmlJbnRlcmZhY2UqKXNHcHNJbnRlcmZhY2UtPmdldF9leHRlbnNpb24oR1BTX05JX0lOVEVSRkFDRSk7CiAgICAgaWYgKHNHcHNOaUludGVyZmFjZSkKLSAgICAgICBzR3BzTmlJbnRlcmZhY2UtPmluaXQoJnNHcHNOaUNhbGxiYWNrcyk7CisgICAgICAgIHNHcHNOaUludGVyZmFjZS0+aW5pdCgmc0dwc05pQ2FsbGJhY2tzKTsKIAogICAgIGlmICghc0dwc0RlYnVnSW50ZXJmYWNlKQogICAgICAgIHNHcHNEZWJ1Z0ludGVyZmFjZSA9IChjb25zdCBHcHNEZWJ1Z0ludGVyZmFjZSopc0dwc0ludGVyZmFjZS0+Z2V0X2V4dGVuc2lvbihHUFNfREVCVUdfSU5URVJGQUNFKTsKQEAgLTQxMywxMiArNDEzLDEwIEBACiBzdGF0aWMgdm9pZCBhbmRyb2lkX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXJfc2VuZF9uaV9yZXNwb25zZShKTklFbnYqIGVudiwgam9iamVjdCBvYmosCiAgICAgICBqaW50IG5vdGlmSWQsIGppbnQgcmVzcG9uc2UpCiB7Ci0gICAgaWYgKCFzR3BzTmlJbnRlcmZhY2UpIHsKKyAgICBpZiAoIXNHcHNOaUludGVyZmFjZSkKICAgICAgICAgc0dwc05pSW50ZXJmYWNlID0gKGNvbnN0IEdwc05pSW50ZXJmYWNlKilzR3BzSW50ZXJmYWNlLT5nZXRfZXh0ZW5zaW9uKEdQU19OSV9JTlRFUkZBQ0UpOwotICAgIH0KLSAgICBpZiAoc0dwc05pSW50ZXJmYWNlKSB7CisgICAgaWYgKHNHcHNOaUludGVyZmFjZSkKICAgICAgICAgc0dwc05pSW50ZXJmYWNlLT5yZXNwb25kKG5vdGlmSWQsIHJlc3BvbnNlKTsKLSAgICB9CiB9CiAKIHN0YXRpYyBqc3RyaW5nIGFuZHJvaWRfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcl9nZXRfaW50ZXJuYWxfc3RhdGUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL29ubG9hZC5jcHAgYi9zZXJ2aWNlcy9qbmkvb25sb2FkLmNwcAppbmRleCBjZDRmMGE0Li4zNTAyYWNhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qbmkvb25sb2FkLmNwcAorKysgYi9zZXJ2aWNlcy9qbmkvb25sb2FkLmNwcApAQCAtOSw2ICs5LDcgQEAKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9JbnB1dE1hbmFnZXIoSk5JRW52KiBlbnYpOwogaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0xpZ2h0c1NlcnZpY2UoSk5JRW52KiBlbnYpOwogaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1Bvd2VyTWFuYWdlclNlcnZpY2UoSk5JRW52KiBlbnYpOworaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1VzYk9ic2VydmVyKEpOSUVudiogZW52KTsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9WaWJyYXRvclNlcnZpY2UoSk5JRW52KiBlbnYpOwogaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1N5c3RlbVNlcnZlcihKTklFbnYqIGVudik7CiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcihKTklFbnYqIGVudik7CkBAIC0zMiw2ICszMyw3IEBACiAgICAgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfTGlnaHRzU2VydmljZShlbnYpOwogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0FsYXJtTWFuYWdlclNlcnZpY2UoZW52KTsKICAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9CYXR0ZXJ5U2VydmljZShlbnYpOworICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1VzYk9ic2VydmVyKGVudik7CiAgICAgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfVmlicmF0b3JTZXJ2aWNlKGVudik7CiAgICAgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfU3lzdGVtU2VydmVyKGVudik7CiAgICAgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlcihlbnYpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0FuZHJvaWQubWsKaW5kZXggYTE0YmZiNS4uZTQ4MjVkMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9BbmRyb2lkLm1rCkBAIC01LDYgKzUsNyBAQAogICAgIGNsei5jcHAuYXJtIFwKICAgICBEaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmNwcCBcCiAgICAgRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZUJhc2UuY3BwIFwKKyAgICBEaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5jcHAgXAogICAgIEJsdXJGaWx0ZXIuY3BwLmFybSBcCiAgICAgR0xFeHRlbnNpb25zLmNwcCBcCiAgICAgTGF5ZXIuY3BwIFwKQEAgLTIxLDcgKzIyLDcgQEAKIExPQ0FMX0NGTEFHUyArPSAtREdMX0dMRVhUX1BST1RPVFlQRVMgLURFR0xfRUdMRVhUX1BST1RPVFlQRVMKIAogaWZlcSAoJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pLCBvbWFwMykKLQlMT0NBTF9DRkxBR1MgKz0gLUROT19SR0JYXzg4ODgKKwlMT0NBTF9DRkxBR1MgKz0gLUROT19SR0JYXzg4ODggLURIQVNfUFVTSF9CVUZGRVJTCiBlbmRpZgogCiAjIG5lZWQgIi1scnQiIG9uIExpbnV4IHNpbXVsYXRvciB0byBwaWNrIHVwIGNsb2NrX2dldHRpbWUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5jcHAKaW5kZXggMDUxNTExMC4uYmQzNDhiZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5jcHAKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5jcHAKQEAgLTM2LDExICszNiwxMSBAQAogCiAjaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5oIgogCi0jaW5jbHVkZSA8aGFyZHdhcmUvY29weWJpdC5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL292ZXJsYXkuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+CiAKICNpbmNsdWRlICJHTEV4dGVuc2lvbnMuaCIKKyNpbmNsdWRlICJIV0NvbXBvc2VyLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCkBAIC03Niw3ICs3Niw3IEBACiAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2VGbGluZ2VyPiYgZmxpbmdlciwKICAgICAgICAgdWludDMyX3QgZHB5KQogICAgIDogRGlzcGxheUhhcmR3YXJlQmFzZShmbGluZ2VyLCBkcHkpLAotICAgICAgbUZsYWdzKDApCisgICAgICBtRmxhZ3MoMCksIG1Id2MoMCkKIHsKICAgICBpbml0KGRweSk7CiB9CkBAIC0yNjIsNiArMjYyLDE3IEBACiAKICAgICAvLyBVbmJpbmQgdGhlIGNvbnRleHQgZnJvbSB0aGlzIHRocmVhZAogICAgIGVnbE1ha2VDdXJyZW50KGRpc3BsYXksIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX0NPTlRFWFQpOworCisKKyAgICAvLyBpbml0aWFsaXplIHRoZSBIL1cgY29tcG9zZXIKKyAgICBtSHdjID0gbmV3IEhXQ29tcG9zZXIoKTsKKyAgICBpZiAobUh3Yy0+aW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbUh3Yy0+c2V0RnJhbWVCdWZmZXIobURpc3BsYXksIG1TdXJmYWNlKTsKKyAgICB9Cit9CisKK0hXQ29tcG9zZXImIERpc3BsYXlIYXJkd2FyZTo6Z2V0SHdDb21wb3NlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gKm1Id2M7CiB9CiAKIC8qCkBAIC0yODEsNiArMjkyLDkgQEAKIHZvaWQgRGlzcGxheUhhcmR3YXJlOjpyZWxlYXNlU2NyZWVuKCkgY29uc3QKIHsKICAgICBEaXNwbGF5SGFyZHdhcmVCYXNlOjpyZWxlYXNlU2NyZWVuKCk7CisgICAgaWYgKG1Id2MtPmluaXRDaGVjaygpID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1Id2MtPnJlbGVhc2UoKTsKKyAgICB9CiB9CiAKIHZvaWQgRGlzcGxheUhhcmR3YXJlOjphY3F1aXJlU2NyZWVuKCkgY29uc3QKQEAgLTMyMSw3ICszMzUsMTIgQEAKICAgICB9CiAgICAgCiAgICAgbVBhZ2VGbGlwQ291bnQrKzsKLSAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworCisgICAgaWYgKG1Id2MtPmluaXRDaGVjaygpID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1Id2MtPmNvbW1pdCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgfQogICAgIGNoZWNrRUdMRXJyb3JzKCJlZ2xTd2FwQnVmZmVycyIpOwogCiAgICAgLy8gZm9yIGRlYnVnZ2luZwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5oCmluZGV4IDJkNzkwMGMuLjc1YjU1ZGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgKQEAgLTM0LDEyICszNCwxMSBAQAogI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmVCYXNlLmgiCiAKIHN0cnVjdCBvdmVybGF5X2NvbnRyb2xfZGV2aWNlX3Q7Ci1zdHJ1Y3QgZnJhbWVidWZmZXJfZGV2aWNlX3Q7Ci1zdHJ1Y3QgY29weWJpdF9pbWFnZV90OwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIEZyYW1lYnVmZmVyTmF0aXZlV2luZG93OworY2xhc3MgSFdDb21wb3NlcjsKIAogY2xhc3MgRGlzcGxheUhhcmR3YXJlIDogcHVibGljIERpc3BsYXlIYXJkd2FyZUJhc2UKIHsKQEAgLTgwLDYgKzc5LDkgQEAKICAgICB1aW50MzJfdCBnZXRQYWdlRmxpcENvdW50KCkgY29uc3Q7CiAgICAgRUdMRGlzcGxheSBnZXRFR0xEaXNwbGF5KCkgY29uc3QgeyByZXR1cm4gbURpc3BsYXk7IH0KICAgICBvdmVybGF5X2NvbnRyb2xfZGV2aWNlX3QqIGdldE92ZXJsYXlFbmdpbmUoKSBjb25zdCB7IHJldHVybiBtT3ZlcmxheUVuZ2luZTsgfQorCisgICAgLy8gSGFyZHdhcmUgQ29tcG9zZXIKKyAgICBIV0NvbXBvc2VyJiBnZXRId0NvbXBvc2VyKCkgY29uc3Q7CiAgICAgCiAgICAgc3RhdHVzX3QgY29tcG9zaXRpb25Db21wbGV0ZSgpIGNvbnN0OwogICAgIApAQCAtMTEwLDYgKzExMiw4IEBACiAgICAgR0xpbnQgICAgICAgICAgIG1NYXhWaWV3cG9ydERpbXM7CiAgICAgR0xpbnQgICAgICAgICAgIG1NYXhUZXh0dXJlU2l6ZTsKICAgICAKKyAgICBIV0NvbXBvc2VyKiAgICAgbUh3YzsKKwogICAgIHNwPEZyYW1lYnVmZmVyTmF0aXZlV2luZG93PiBtTmF0aXZlV2luZG93OwogICAgIG92ZXJsYXlfY29udHJvbF9kZXZpY2VfdCogbU92ZXJsYXlFbmdpbmU7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmODg3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5jcHAKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisKKyNpbmNsdWRlICJIV0NvbXBvc2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitIV0NvbXBvc2VyOjpIV0NvbXBvc2VyKCkKKyAgICA6IG1Nb2R1bGUoMCksIG1Id2MoMCksIG1MaXN0KDApLCBtQ2FwYWNpdHkoMCksCisgICAgICBtRHB5KEVHTF9OT19ESVNQTEFZKSwgbVN1cihFR0xfTk9fU1VSRkFDRSkKK3sKKyAgICBpbnQgZXJyID0gaHdfZ2V0X21vZHVsZShIV0NfSEFSRFdBUkVfTU9EVUxFX0lELCAmbU1vZHVsZSk7CisgICAgTE9HV19JRihlcnIsICIlcyBtb2R1bGUgbm90IGZvdW5kIiwgSFdDX0hBUkRXQVJFX01PRFVMRV9JRCk7CisgICAgaWYgKGVyciA9PSAwKSB7CisgICAgICAgIGVyciA9IGh3Y19vcGVuKG1Nb2R1bGUsICZtSHdjKTsKKyAgICAgICAgTE9HRV9JRihlcnIsICIlcyBkZXZpY2UgZmFpbGVkIHRvIGluaXRpYWxpemUgKCVzKSIsCisgICAgICAgICAgICAgICAgSFdDX0hBUkRXQVJFX0NPTVBPU0VSLCBzdHJlcnJvcigtZXJyKSk7CisgICAgfQorfQorCitIV0NvbXBvc2VyOjp+SFdDb21wb3NlcigpIHsKKyAgICBmcmVlKG1MaXN0KTsKKyAgICBpZiAobUh3YykgeworICAgICAgICBod2NfY2xvc2UobUh3Yyk7CisgICAgfQorfQorCitzdGF0dXNfdCBIV0NvbXBvc2VyOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Id2MgPyBOT19FUlJPUiA6IE5PX0lOSVQ7Cit9CisKK3ZvaWQgSFdDb21wb3Nlcjo6c2V0RnJhbWVCdWZmZXIoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyKSB7CisgICAgbURweSA9IChod2NfZGlzcGxheV90KWRweTsKKyAgICBtU3VyID0gKGh3Y19zdXJmYWNlX3Qpc3VyOworfQorCitzdGF0dXNfdCBIV0NvbXBvc2VyOjpjcmVhdGVXb3JrTGlzdChzaXplX3QgbnVtTGF5ZXJzKSB7CisgICAgaWYgKG1Id2MpIHsKKyAgICAgICAgaWYgKCFtTGlzdCB8fCBtQ2FwYWNpdHkgPCBudW1MYXllcnMpIHsKKyAgICAgICAgICAgIGZyZWUobUxpc3QpOworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBzaXplb2YoaHdjX2xheWVyX2xpc3QpICsgbnVtTGF5ZXJzKnNpemVvZihod2NfbGF5ZXJfdCk7CisgICAgICAgICAgICBtTGlzdCA9IChod2NfbGF5ZXJfbGlzdF90KiltYWxsb2Moc2l6ZSk7CisgICAgICAgICAgICBtQ2FwYWNpdHkgPSBudW1MYXllcnM7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3QtPmZsYWdzID0gSFdDX0dFT01FVFJZX0NIQU5HRUQ7CisgICAgICAgIG1MaXN0LT5udW1Id0xheWVycyA9IG51bUxheWVyczsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBIV0NvbXBvc2VyOjpwcmVwYXJlKCkgY29uc3QgeworICAgIGludCBlcnIgPSBtSHdjLT5wcmVwYXJlKG1Id2MsIG1MaXN0KTsKKyAgICByZXR1cm4gKHN0YXR1c190KWVycjsKK30KKworc3RhdHVzX3QgSFdDb21wb3Nlcjo6Y29tbWl0KCkgY29uc3QgeworICAgIGludCBlcnIgPSBtSHdjLT5zZXQobUh3YywgbURweSwgbVN1ciwgbUxpc3QpOworICAgIG1MaXN0LT5mbGFncyAmPSB+SFdDX0dFT01FVFJZX0NIQU5HRUQ7CisgICAgcmV0dXJuIChzdGF0dXNfdCllcnI7Cit9CisKK3N0YXR1c190IEhXQ29tcG9zZXI6OnJlbGVhc2UoKSBjb25zdCB7CisgICAgaW50IGVyciA9IG1Id2MtPnNldChtSHdjLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICByZXR1cm4gKHN0YXR1c190KWVycjsKK30KKworc2l6ZV90IEhXQ29tcG9zZXI6OmdldE51bUxheWVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUxpc3QgPyBtTGlzdC0+bnVtSHdMYXllcnMgOiAwOworfQorCitod2NfbGF5ZXJfdCogSFdDb21wb3Nlcjo6Z2V0TGF5ZXJzKCkgY29uc3QgeworICAgIHJldHVybiBtTGlzdCA/IG1MaXN0LT5od0xheWVycyA6IDA7Cit9CisKK3ZvaWQgSFdDb21wb3Nlcjo6ZHVtcChTdHJpbmc4JiByZXN1bHQsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IFNJWkUpIGNvbnN0IHsKKyAgICBpZiAobUh3YyAmJiBtTGlzdCkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCJIYXJkd2FyZSBDb21wb3NlciBzdGF0ZTpcbiIpOworCisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgbnVtSHdMYXllcnM9JXUsIGZsYWdzPSUwOHhcbiIsCisgICAgICAgICAgICAgICAgbUxpc3QtPm51bUh3TGF5ZXJzLCBtTGlzdC0+ZmxhZ3MpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxtTGlzdC0+bnVtSHdMYXllcnMgOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGh3Y19sYXllcl90JiBsKG1MaXN0LT5od0xheWVyc1tpXSk7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICU4cyB8ICUwOHggfCAlMDh4IHwgJTAyeCB8ICUwNHggfCBbJTVkLCU1ZCwlNWQsJTVkXSB8ICBbJTVkLCU1ZCwlNWQsJTVkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgbC5jb21wb3NpdGlvblR5cGUgPyAiT1ZFUkxBWSIgOiAiRkIiLAorICAgICAgICAgICAgICAgICAgICBsLmhpbnRzLCBsLmZsYWdzLCBsLnRyYW5zZm9ybSwgbC5ibGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgbC5zb3VyY2VDcm9wLmxlZnQsIGwuc291cmNlQ3JvcC50b3AsIGwuc291cmNlQ3JvcC5yaWdodCwgbC5zb3VyY2VDcm9wLmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgbC5kaXNwbGF5RnJhbWUubGVmdCwgbC5kaXNwbGF5RnJhbWUudG9wLCBsLmRpc3BsYXlGcmFtZS5yaWdodCwgbC5kaXNwbGF5RnJhbWUuYm90dG9tKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9IV0NvbXBvc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE5ZTllYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9IV0NvbXBvc2VyLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRl9IV0NPTVBPU0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9TRl9IV0NPTVBPU0VSX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorCisjaW5jbHVkZSA8aGFyZHdhcmUvaHdjb21wb3Nlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgU3RyaW5nODsKKworY2xhc3MgSFdDb21wb3NlcgoreworcHVibGljOgorCisgICAgSFdDb21wb3NlcigpOworICAgIH5IV0NvbXBvc2VyKCk7CisKKyAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKworICAgIC8vIHRlbGxzIHRoZSBIQUwgd2hhdCB0aGUgZnJhbWVidWZmZXIgaXMKKyAgICB2b2lkIHNldEZyYW1lQnVmZmVyKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cik7CisKKyAgICAvLyBjcmVhdGUgYSB3b3JrIGxpc3QgZm9yIG51bUxheWVycyBsYXllcgorICAgIHN0YXR1c190IGNyZWF0ZVdvcmtMaXN0KHNpemVfdCBudW1MYXllcnMpOworCisgICAgLy8gQXNrcyB0aGUgSEFMIHdoYXQgaXQgY2FuIGRvCisgICAgc3RhdHVzX3QgcHJlcGFyZSgpIGNvbnN0OworCisgICAgLy8gY29tbWl0cyB0aGUgbGlzdAorICAgIHN0YXR1c190IGNvbW1pdCgpIGNvbnN0OworCisgICAgLy8gcmVsZWFzZSBoYXJkd2FyZSByZXNvdXJjZXMKKyAgICBzdGF0dXNfdCByZWxlYXNlKCkgY29uc3Q7CisKKyAgICBzaXplX3QgZ2V0TnVtTGF5ZXJzKCkgY29uc3Q7CisgICAgaHdjX2xheWVyX3QqIGdldExheWVycygpIGNvbnN0OworCisgICAgLy8gZm9yIGRlYnVnZ2luZworICAgIHZvaWQgZHVtcChTdHJpbmc4JiBvdXQsIGNoYXIqIHNjcmF0Y2gsIHNpemVfdCBTSVpFKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBod19tb2R1bGVfdCBjb25zdCogICAgICBtTW9kdWxlOworICAgIGh3Y19jb21wb3Nlcl9kZXZpY2VfdCogIG1Id2M7CisgICAgaHdjX2xheWVyX2xpc3RfdCogICAgICAgbUxpc3Q7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUNhcGFjaXR5OworICAgIGh3Y19kaXNwbGF5X3QgICAgICAgICAgIG1EcHk7CisgICAgaHdjX3N1cmZhY2VfdCAgICAgICAgICAgbVN1cjsKK307CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TRl9IV0NPTVBPU0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmNwcAppbmRleCBhMDYwZDMxLi5mYjc2NzIwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5jcHAKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuY3BwCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSAiTGF5ZXIuaCIKICNpbmNsdWRlICJTdXJmYWNlRmxpbmdlci5oIgogI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaCIKKyNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5oIgogCiAKICNkZWZpbmUgREVCVUdfUkVTSVpFICAgIDAKQEAgLTE4MSw2ICsxODIsNjIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3ZvaWQgTGF5ZXI6OnNldEdlb21ldHJ5KGh3Y19sYXllcl90KiBod2NsKQoreworICAgIGh3Y2wtPmNvbXBvc2l0aW9uVHlwZSA9IEhXQ19GUkFNRUJVRkZFUjsKKyAgICBod2NsLT5oaW50cyA9IDA7CisgICAgaHdjbC0+ZmxhZ3MgPSAwOworICAgIGh3Y2wtPnRyYW5zZm9ybSA9IDA7CisgICAgaHdjbC0+YmxlbmRpbmcgPSBIV0NfQkxFTkRJTkdfTk9ORTsKKworICAgIC8vIHdlIGNhbid0IGRvIGFscGhhLWZhZGUgd2l0aCB0aGUgaHdjIEhBTAorICAgIGNvbnN0IFN0YXRlJiBzKGRyYXdpbmdTdGF0ZSgpKTsKKyAgICBpZiAocy5hbHBoYSA8IDB4RkYpIHsKKyAgICAgICAgaHdjbC0+ZmxhZ3MgPSBIV0NfU0tJUF9MQVlFUjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHdlIGNhbiBvbmx5IGhhbmRsZSBzaW1wbGUgdHJhbnNmb3JtYXRpb24KKyAgICBpZiAobU9yaWVudGF0aW9uICYgVHJhbnNmb3JtOjpST1RfSU5WQUxJRCkgeworICAgICAgICBod2NsLT5mbGFncyA9IEhXQ19TS0lQX0xBWUVSOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaHdjbC0+dHJhbnNmb3JtID0gbU9yaWVudGF0aW9uOworCisgICAgaWYgKG5lZWRzQmxlbmRpbmcoKSkgeworICAgICAgICBod2NsLT5ibGVuZGluZyA9IG1QcmVtdWx0aXBsaWVkQWxwaGEgPworICAgICAgICAgICAgICAgIEhXQ19CTEVORElOR19QUkVNVUxUIDogSFdDX0JMRU5ESU5HX0NPVkVSQUdFOworICAgIH0KKworICAgIGh3Y2wtPmRpc3BsYXlGcmFtZS5sZWZ0ICAgPSBtVHJhbnNmb3JtZWRCb3VuZHMubGVmdDsKKyAgICBod2NsLT5kaXNwbGF5RnJhbWUudG9wICAgID0gbVRyYW5zZm9ybWVkQm91bmRzLnRvcDsKKyAgICBod2NsLT5kaXNwbGF5RnJhbWUucmlnaHQgID0gbVRyYW5zZm9ybWVkQm91bmRzLnJpZ2h0OworICAgIGh3Y2wtPmRpc3BsYXlGcmFtZS5ib3R0b20gPSBtVHJhbnNmb3JtZWRCb3VuZHMuYm90dG9tOworCisgICAgaHdjbC0+dmlzaWJsZVJlZ2lvblNjcmVlbi5yZWN0cyA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGh3Y19yZWN0X3QgY29uc3QgKj4oCisgICAgICAgICAgICAgICAgICAgIHZpc2libGVSZWdpb25TY3JlZW4uZ2V0QXJyYXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmh3Y2wtPnZpc2libGVSZWdpb25TY3JlZW4ubnVtUmVjdHMpKTsKK30KKwordm9pZCBMYXllcjo6c2V0UGVyRnJhbWVEYXRhKGh3Y19sYXllcl90KiBod2NsKSB7CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyKG1CdWZmZXJNYW5hZ2VyLmdldEFjdGl2ZUJ1ZmZlcigpKTsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgLy8gdGhpcyBzaXR1YXRpb24gY2FuIGhhcHBlbiBpZiB3ZSByYW4gb3V0IG9mIG1lbW9yeSBmb3IgaW5zdGFuY2UuCisgICAgICAgIC8vIG5vdCBtdWNoIHdlIGNhbiBkby4gY29udGludWUgdG8gdXNlIHdoYXRldmVyIHRleHR1cmUgd2FzIGJvdW5kCisgICAgICAgIC8vIHRvIHRoaXMgY29udGV4dC4KKyAgICAgICAgaHdjbC0+aGFuZGxlID0gTlVMTDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBod2NsLT5oYW5kbGUgPSBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KGJ1ZmZlci0+aGFuZGxlKTsKKyAgICAvLyBUT0RPOiBzZXQgdGhlIGNyb3AgdmFsdWUgcHJvcGVybHkKKyAgICBod2NsLT5zb3VyY2VDcm9wLmxlZnQgICA9IDA7CisgICAgaHdjbC0+c291cmNlQ3JvcC50b3AgICAgPSAwOworICAgIGh3Y2wtPnNvdXJjZUNyb3AucmlnaHQgID0gYnVmZmVyLT53aWR0aDsKKyAgICBod2NsLT5zb3VyY2VDcm9wLmJvdHRvbSA9IGJ1ZmZlci0+aGVpZ2h0OworfQorCiB2b2lkIExheWVyOjpyZWxvYWRUZXh0dXJlKGNvbnN0IFJlZ2lvbiYgZGlydHkpCiB7CiAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyKG1CdWZmZXJNYW5hZ2VyLmdldEFjdGl2ZUJ1ZmZlcigpKTsKQEAgLTMyMSw2ICszNzgsNyBAQAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCiAgICAgICAgIC8vIHplcm8gbWVhbnMgZGVmYXVsdAorICAgICAgICBjb25zdCBib29sIGZpeGVkU2l6ZSA9IHJlcVdpZHRoICYmIHJlcUhlaWdodDsKICAgICAgICAgaWYgKCFyZXFGb3JtYXQpIHJlcUZvcm1hdCA9IG1Gb3JtYXQ7CiAgICAgICAgIGlmICghcmVxV2lkdGgpICByZXFXaWR0aCA9IG1XaWR0aDsKICAgICAgICAgaWYgKCFyZXFIZWlnaHQpIHJlcUhlaWdodCA9IG1IZWlnaHQ7CkBAIC0zMzQsNiArMzkyLDcgQEAKICAgICAgICAgICAgIG1SZXFXaWR0aCAgPSByZXFXaWR0aDsKICAgICAgICAgICAgIG1SZXFIZWlnaHQgPSByZXFIZWlnaHQ7CiAgICAgICAgICAgICBtUmVxRm9ybWF0ID0gcmVxRm9ybWF0OworICAgICAgICAgICAgbUZpeGVkU2l6ZSA9IGZpeGVkU2l6ZTsKIAogICAgICAgICAgICAgbGNibGstPnJlYWxsb2NhdGVBbGxFeGNlcHQoaW5kZXgpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuaAppbmRleCAyNjNjMzcyLi5jYWE2ZDE3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5oCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmgKQEAgLTY4LDYgKzY4LDggQEAKICAgICBib29sIGlzRml4ZWRTaXplKCkgY29uc3Q7CiAKICAgICAvLyBMYXllckJhc2UgaW50ZXJmYWNlCisgICAgdmlydHVhbCB2b2lkIHNldEdlb21ldHJ5KGh3Y19sYXllcl90KiBod2NsKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGVyRnJhbWVEYXRhKGh3Y19sYXllcl90KiBod2NsKTsKICAgICB2aXJ0dWFsIHZvaWQgZHJhd0ZvclNyZWVuU2hvdCgpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCBvbkRyYXcoY29uc3QgUmVnaW9uJiBjbGlwKSBjb25zdDsKICAgICB2aXJ0dWFsIHVpbnQzMl90IGRvVHJhbnNhY3Rpb24odWludDMyX3QgdHJhbnNhY3Rpb25GbGFncyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmNwcAppbmRleCA3NThiNDA4Li4xNDE5MWNiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmFzZS5jcHAKQEAgLTMwOSw2ICszMDksMTUgQEAKICAgICB9CiB9CiAKK3ZvaWQgTGF5ZXJCYXNlOjpzZXRHZW9tZXRyeShod2NfbGF5ZXJfdCogaHdjbCkgeworICAgIGh3Y2wtPmZsYWdzIHw9IEhXQ19TS0lQX0xBWUVSOworfQorCit2b2lkIExheWVyQmFzZTo6c2V0UGVyRnJhbWVEYXRhKGh3Y19sYXllcl90KiBod2NsKSB7CisgICAgaHdjbC0+Y29tcG9zaXRpb25UeXBlID0gSFdDX0ZSQU1FQlVGRkVSOworICAgIGh3Y2wtPmhhbmRsZSA9IE5VTEw7Cit9CisKIHZvaWQgTGF5ZXJCYXNlOjpkcmF3KGNvbnN0IFJlZ2lvbiYgY2xpcCkgY29uc3QKIHsKICAgICAvLyByZXNldCBHTCBzdGF0ZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuaAppbmRleCBkNjg4ZjY1Li5iZGVlMDViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuaAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuaApAQCAtMzUsNiArMzUsOCBAQAogCiAjaW5jbHVkZSA8cGl4ZWxmbGluZ2VyL3BpeGVsZmxpbmdlci5oPgogCisjaW5jbHVkZSA8aGFyZHdhcmUvaHdjb21wb3Nlci5oPgorCiAjaW5jbHVkZSAiVHJhbnNmb3JtLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTEwOCw2ICsxMTAsMTAgQEAKIAogICAgIHZpcnR1YWwgY29uc3QgY2hhciogZ2V0VHlwZUlkKCkgY29uc3QgeyByZXR1cm4gIkxheWVyQmFzZSI7IH0KIAorICAgIHZpcnR1YWwgdm9pZCBzZXRHZW9tZXRyeShod2NfbGF5ZXJfdCogaHdjbCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGVyRnJhbWVEYXRhKGh3Y19sYXllcl90KiBod2NsKTsKKwogICAgIC8qKgogICAgICAqIGRyYXcgLSBwZXJmb3JtcyBzb21lIGdsb2JhbCBjbGlwcGluZyBvcHRpbWl6YXRpb25zCiAgICAgICogYW5kIGNhbGxzIG9uRHJhdygpLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuY3BwCmluZGV4IGU1ZTg3YzYuLmU2YmRmZDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5jcHAKQEAgLTUzLDYgKzUzLDcgQEAKICNpbmNsdWRlICJTdXJmYWNlRmxpbmdlci5oIgogCiAjaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5oIgorI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9IV0NvbXBvc2VyLmgiCiAKIC8qIGlkZWFsbHkgQUlEX0dSQVBISUNTIHdvdWxkIGJlIGluIGEgc2VtaS1wdWJsaWMgaGVhZGVyCiAgKiBvciB0aGVyZSB3b3VsZCBiZSBhIHdheSB0byBtYXAgYSB1c2VyL2dyb3VwIG5hbWUgdG8gaXRzIGlkCkBAIC03OCwxMiArNzksMTQgQEAKICAgICAgICAgbVJlYWRGcmFtZWJ1ZmZlcigiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfRlJBTUVfQlVGRkVSIiksCiAgICAgICAgIG1EdW1wKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpLAogICAgICAgICBtVmlzaWJsZVJlZ2lvbnNEaXJ0eShmYWxzZSksCisgICAgICAgIG1Id1dvcmtMaXN0RGlydHkoZmFsc2UpLAogICAgICAgICBtRGVmZXJSZWxlYXNlQ29uc29sZShmYWxzZSksCiAgICAgICAgIG1GcmVlemVEaXNwbGF5KGZhbHNlKSwKICAgICAgICAgbUZyZWV6ZUNvdW50KDApLAogICAgICAgICBtRnJlZXplRGlzcGxheVRpbWUoMCksCiAgICAgICAgIG1EZWJ1Z1JlZ2lvbigwKSwKICAgICAgICAgbURlYnVnQmFja2dyb3VuZCgwKSwKKyAgICAgICAgbURlYnVnRGlzYWJsZUhXQygwKSwKICAgICAgICAgbURlYnVnSW5Td2FwQnVmZmVycygwKSwKICAgICAgICAgbUxhc3RTd2FwQnVmZmVyVGltZSgwKSwKICAgICAgICAgbURlYnVnSW5UcmFuc2FjdGlvbigwKSwKQEAgLTE2NSw3ICsxNjgsNyBAQAogewogICAgIGNvbnN0IG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOwogICAgIGNvbnN0IG5zZWNzX3QgZHVyYXRpb24gPSBub3cgLSBtQm9vdFRpbWU7Ci0gICAgTE9HSSgiQm9vdCBpcyBmaW5pc2hlZCAoJWxkIG1zKSIsIGxvbmcobnMybXMoZHVyYXRpb24pKSApOyAgCisgICAgTE9HSSgiQm9vdCBpcyBmaW5pc2hlZCAoJWxkIG1zKSIsIGxvbmcobnMybXMoZHVyYXRpb24pKSApOwogICAgIG1Cb290RmluaXNoZWQgPSB0cnVlOwogICAgIHByb3BlcnR5X3NldCgiY3RsLnN0b3AiLCAiYm9vdGFuaW0iKTsKIH0KQEAgLTIwMSwxMCArMjA0LDEwIEBACiAgICAgbVNlcnZlckhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2UoNDA5NiwKICAgICAgICAgICAgIE1lbW9yeUhlYXBCYXNlOjpSRUFEX09OTFksICJTdXJmYWNlRmxpbmdlciByZWFkLW9ubHkgaGVhcCIpOwogICAgIExPR0VfSUYobVNlcnZlckhlYXA9PTAsICJjYW4ndCBjcmVhdGUgc2hhcmVkIG1lbW9yeSBkZWFsZXIiKTsKLSAgICAKKwogICAgIG1TZXJ2ZXJDYmxrID0gc3RhdGljX2Nhc3Q8c3VyZmFjZV9mbGluZ2VyX2NibGtfdCo+KG1TZXJ2ZXJIZWFwLT5nZXRCYXNlKCkpOwogICAgIExPR0VfSUYobVNlcnZlckNibGs9PTAsICJjYW4ndCBnZXQgdG8gc2hhcmVkIGNvbnRyb2wgYmxvY2sncyBhZGRyZXNzIik7Ci0gICAgCisKICAgICBuZXcobVNlcnZlckNibGspIHN1cmZhY2VfZmxpbmdlcl9jYmxrX3Q7CiAKICAgICAvLyBpbml0aWFsaXplIHByaW1hcnkgc2NyZWVuCkBAIC0yMzMsNyArMjM2LDcgQEAKIAogICAgIC8vIEluaXRpYWxpemUgT3BlbkdMfEVTCiAgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCA0KTsKLSAgICBnbFBpeGVsU3RvcmVpKEdMX1BBQ0tfQUxJR05NRU5ULCA0KTsgCisgICAgZ2xQaXhlbFN0b3JlaShHTF9QQUNLX0FMSUdOTUVOVCwgNCk7CiAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOwogICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CiAgICAgZ2xTaGFkZU1vZGVsKEdMX0ZMQVQpOwpAQCAtMjY3LDcgKzI3MCw3IEBACiAKICAgICAvLyBzdGFydCBib290IGFuaW1hdGlvbgogICAgIHByb3BlcnR5X3NldCgiY3RsLnN0YXJ0IiwgImJvb3RhbmltIik7Ci0gICAgCisKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTM3MCw2ICszNzMsMTEgQEAKICAgICAvLyBwb3N0IHN1cmZhY2VzIChpZiBuZWVkZWQpCiAgICAgaGFuZGxlUGFnZUZsaXAoKTsKIAorICAgIGlmIChVTkxJS0VMWShtSHdXb3JrTGlzdERpcnR5KSkgeworICAgICAgICAvLyBidWlsZCB0aGUgaC93IHdvcmsgbGlzdAorICAgICAgICBoYW5kbGVXb3JrTGlzdCgpOworICAgIH0KKwogICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpKTsKICAgICBpZiAoTElLRUxZKGh3LmNhbkRyYXcoKSAmJiAhaXNGcm96ZW4oKSkpIHsKICAgICAgICAgLy8gcmVwYWludCB0aGUgZnJhbWVidWZmZXIgKGlmIG5lZWRlZCkKQEAgLTM4NCwxMyArMzkyLDEyIEBACiAgICAgICAgIGxvZ2dlci5sb2coR3JhcGhpY0xvZzo6U0ZfQ09NUE9TSVRJT05fQ09NUExFVEUsIGluZGV4KTsKICAgICAgICAgaHcuY29tcG9zaXRpb25Db21wbGV0ZSgpOwogCi0gICAgICAgIC8vIHJlbGVhc2UgdGhlIGNsaWVudHMgYmVmb3JlIHdlIGZsaXAgKCdjYXVzZSBmbGlwIG1pZ2h0IGJsb2NrKQotICAgICAgICBsb2dnZXIubG9nKEdyYXBoaWNMb2c6OlNGX1VOTE9DS19DTElFTlRTLCBpbmRleCk7Ci0gICAgICAgIHVubG9ja0NsaWVudHMoKTsKLQogICAgICAgICBsb2dnZXIubG9nKEdyYXBoaWNMb2c6OlNGX1NXQVBfQlVGRkVSUywgaW5kZXgpOwogICAgICAgICBwb3N0RnJhbWVidWZmZXIoKTsKIAorICAgICAgICBsb2dnZXIubG9nKEdyYXBoaWNMb2c6OlNGX1VOTE9DS19DTElFTlRTLCBpbmRleCk7CisgICAgICAgIHVubG9ja0NsaWVudHMoKTsKKwogICAgICAgICBsb2dnZXIubG9nKEdyYXBoaWNMb2c6OlNGX1JFUEFJTlRfRE9ORSwgaW5kZXgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIHByZXRlbmQgd2UgZGlkIHRoZSBwb3N0CkBAIC00NTUsNiArNDYyLDcgQEAKICAgICAgICAgaGFuZGxlVHJhbnNhY3Rpb25Mb2NrZWQodHJhbnNhY3Rpb25GbGFncywgZGl0Y2hlZExheWVycyk7CiAgICAgICAgIG1MYXN0VHJhbnNhY3Rpb25UaW1lID0gc3lzdGVtVGltZSgpIC0gbm93OwogICAgICAgICBtRGVidWdJblRyYW5zYWN0aW9uID0gMDsKKyAgICAgICAgbUh3V29ya0xpc3REaXJ0eSA9IHRydWU7CiAgICAgICAgIC8vIGhlcmUgdGhlIHRyYW5zYWN0aW9uIGhhcyBiZWVuIGNvbW1pdHRlZAogICAgIH0KIApAQCAtNDYyLDYgKzQ3MCw3IEBACiAgICAgICogQ2xlYW4tdXAgYWxsIGxheWVycyB0aGF0IHdlbnQgYXdheQogICAgICAqIChkbyB0aGlzIHdpdGhvdXQgdGhlIGxvY2sgaGVsZCkKICAgICAgKi8KKwogICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IGRpdGNoZWRMYXllcnMuc2l6ZSgpOwogICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKICAgICAgICAgaWYgKGRpdGNoZWRMYXllcnNbaV0gIT0gMCkgewpAQCAtNjY1LDcgKzY3NCw3IEBACiAKICAgICAgICAgLy8gVXBkYXRlIGFib3ZlT3BhcXVlTGF5ZXJzIGZvciBuZXh0IChsb3dlcikgbGF5ZXIKICAgICAgICAgYWJvdmVPcGFxdWVMYXllcnMub3JTZWxmKG9wYXF1ZVJlZ2lvbik7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIFN0b3JlIHRoZSB2aXNpYmxlIHJlZ2lvbiBpcyBzY3JlZW4gc3BhY2UKICAgICAgICAgbGF5ZXItPnNldFZpc2libGVSZWdpb24odmlzaWJsZVJlZ2lvbik7CiAgICAgICAgIGxheWVyLT5zZXRDb3ZlcmVkUmVnaW9uKGNvdmVyZWRSZWdpb24pOwpAQCAtNjk1LDggKzcwNCw4IEBACiB2b2lkIFN1cmZhY2VGbGluZ2VyOjpoYW5kbGVQYWdlRmxpcCgpCiB7CiAgICAgYm9vbCB2aXNpYmxlUmVnaW9ucyA9IG1WaXNpYmxlUmVnaW9uc0RpcnR5OwotICAgIExheWVyVmVjdG9yJiBjdXJyZW50TGF5ZXJzID0gY29uc3RfY2FzdDxMYXllclZlY3RvciY+KAotICAgICAgICAgICAgbURyYXdpbmdTdGF0ZS5sYXllcnNTb3J0ZWRCeVopOworICAgIExheWVyVmVjdG9yJiBjdXJyZW50TGF5ZXJzKAorICAgICAgICAgICAgY29uc3RfY2FzdDxMYXllclZlY3RvciY+KG1EcmF3aW5nU3RhdGUubGF5ZXJzU29ydGVkQnlaKSk7CiAgICAgdmlzaWJsZVJlZ2lvbnMgfD0gbG9ja1BhZ2VGbGlwKGN1cnJlbnRMYXllcnMpOwogCiAgICAgICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcgPSBncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCk7CkBAIC03MTksNiArNzI4LDcgQEAKIAogICAgICAgICAgICAgbVdvcm1ob2xlUmVnaW9uID0gc2NyZWVuUmVnaW9uLnN1YnRyYWN0KG9wYXF1ZVJlZ2lvbik7CiAgICAgICAgICAgICBtVmlzaWJsZVJlZ2lvbnNEaXJ0eSA9IGZhbHNlOworICAgICAgICAgICAgbUh3V29ya0xpc3REaXJ0eSA9IHRydWU7CiAgICAgICAgIH0KIAogICAgIHVubG9ja1BhZ2VGbGlwKGN1cnJlbnRMYXllcnMpOwpAQCAtNzQ5LDYgKzc1OSwyNCBAQAogICAgIH0KIH0KIAordm9pZCBTdXJmYWNlRmxpbmdlcjo6aGFuZGxlV29ya0xpc3QoKQoreworICAgIG1Id1dvcmtMaXN0RGlydHkgPSBmYWxzZTsKKyAgICBIV0NvbXBvc2VyJiBod2MoZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpLmdldEh3Q29tcG9zZXIoKSk7CisgICAgaWYgKGh3Yy5pbml0Q2hlY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICBjb25zdCBWZWN0b3I8IHNwPExheWVyQmFzZT4gPiYgY3VycmVudExheWVycyhtVmlzaWJsZUxheWVyc1NvcnRlZEJ5Wik7CisgICAgICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IGN1cnJlbnRMYXllcnMuc2l6ZSgpOworICAgICAgICBod2MuY3JlYXRlV29ya0xpc3QoY291bnQpOworICAgICAgICBod2NfbGF5ZXJfdCogY29uc3QgY3VyKGh3Yy5nZXRMYXllcnMoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGN1ciAmJiBpPGNvdW50IDsgaSsrKSB7CisgICAgICAgICAgICBjdXJyZW50TGF5ZXJzW2ldLT5zZXRHZW9tZXRyeSgmY3VyW2ldKTsKKyAgICAgICAgICAgIGlmIChtRGVidWdEaXNhYmxlSFdDKSB7CisgICAgICAgICAgICAgICAgY3VyW2ldLmNvbXBvc2l0aW9uVHlwZSA9IEhXQ19GUkFNRUJVRkZFUjsKKyAgICAgICAgICAgICAgICBjdXJbaV0uZmxhZ3MgfD0gSFdDX1NLSVBfTEFZRVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CiAKIHZvaWQgU3VyZmFjZUZsaW5nZXI6OmhhbmRsZVJlcGFpbnQoKQogewpAQCAtNzY5LDggKzc5Nyw4IEBACiAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKIAogICAgIHVpbnQzMl90IGZsYWdzID0gaHcuZ2V0RmxhZ3MoKTsKLSAgICBpZiAoKGZsYWdzICYgRGlzcGxheUhhcmR3YXJlOjpTV0FQX1JFQ1RBTkdMRSkgfHwgCi0gICAgICAgIChmbGFncyAmIERpc3BsYXlIYXJkd2FyZTo6QlVGRkVSX1BSRVNFUlZFRCkpIAorICAgIGlmICgoZmxhZ3MgJiBEaXNwbGF5SGFyZHdhcmU6OlNXQVBfUkVDVEFOR0xFKSB8fAorICAgICAgICAoZmxhZ3MgJiBEaXNwbGF5SGFyZHdhcmU6OkJVRkZFUl9QUkVTRVJWRUQpKQogICAgIHsKICAgICAgICAgLy8gd2UgY2FuIHJlZHJhdyBvbmx5IHdoYXQncyBkaXJ0eSwgYnV0IHNpbmNlIFNXQVBfUkVDVEFOR0xFIG9ubHkKICAgICAgICAgLy8gdGFrZXMgYSByZWN0YW5nbGUsIHdlIG11c3QgbWFrZSBzdXJlIHRvIHVwZGF0ZSB0aGF0IHdob2xlCkBAIC04MTMsOSArODQxLDczIEBACiAgICAgICAgIC8vIGRyYXcgc29tZXRoaW5nLi4uCiAgICAgICAgIGRyYXdXb3JtaG9sZSgpOwogICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IE5PX0VSUk9SOwogICAgIGNvbnN0IFZlY3Rvcjwgc3A8TGF5ZXJCYXNlPiA+JiBsYXllcnMobVZpc2libGVMYXllcnNTb3J0ZWRCeVopOwotICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IGxheWVycy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7ICsraSkgeworICAgIHNpemVfdCBjb3VudCA9IGxheWVycy5zaXplKCk7CisKKyAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7CisgICAgSFdDb21wb3NlciYgaHdjKGh3LmdldEh3Q29tcG9zZXIoKSk7CisgICAgaHdjX2xheWVyX3QqIGNvbnN0IGN1cihod2MuZ2V0TGF5ZXJzKCkpOworCisgICAgTE9HRV9JRihjdXIgJiYgaHdjLmdldE51bUxheWVycygpICE9IGNvdW50LAorICAgICAgICAgICAgIkhBTCBudW1iZXIgb2YgbGF5ZXJzICglZCkgZG9lc24ndCBtYXRjaCBzdXJmYWNlZmxpbmdlciAoJWQpIiwKKyAgICAgICAgICAgIGh3Yy5nZXROdW1MYXllcnMoKSwgY291bnQpOworCisgICAgLy8ganVzdCB0byBiZSBleHRyYS1zYWZlLCB1c2UgdGhlIHNtYWxsZXN0IGNvdW50CisgICAgaWYgKGh3Yy5pbml0Q2hlY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICBjb3VudCA9IGNvdW50IDwgaHdjLmdldE51bUxheWVycygpID8gY291bnQgOiBod2MuZ2V0TnVtTGF5ZXJzKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgdXBkYXRlIHRoZSBwZXItZnJhbWUgaC93IGNvbXBvc2VyIGRhdGEgZm9yIGVhY2ggbGF5ZXIKKyAgICAgKiAgYW5kIGJ1aWxkIHRoZSB0cmFuc3BhcmVudCByZWdpb24gb2YgdGhlIEZCCisgICAgICovCisgICAgUmVnaW9uIHRyYW5zcGFyZW50OworICAgIGlmIChjdXIpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgeworICAgICAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIobGF5ZXJzW2ldKTsKKyAgICAgICAgICAgIGxheWVyLT5zZXRQZXJGcmFtZURhdGEoJmN1cltpXSk7CisgICAgICAgICAgICBpZiAoY3VyW2ldLmhpbnRzICYgSFdDX0hJTlRfQ0xFQVJfRkIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIShsYXllci0+bmVlZHNCbGVuZGluZygpKSkgeworICAgICAgICAgICAgICAgICAgICB0cmFuc3BhcmVudC5vclNlbGYobGF5ZXItPnZpc2libGVSZWdpb25TY3JlZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlcnIgPSBod2MucHJlcGFyZSgpOworICAgICAgICBMT0dFX0lGKGVyciwgIkhXQ29tcG9zZXI6OnByZXBhcmUgZmFpbGVkICglcykiLCBzdHJlcnJvcigtZXJyKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgY2xlYXIgdGhlIGFyZWEgb2YgdGhlIEZCIHRoYXQgbmVlZCB0byBiZSB0cmFuc3BhcmVudAorICAgICAqLworICAgIHRyYW5zcGFyZW50LmFuZFNlbGYoZGlydHkpOworICAgIGlmICghdHJhbnNwYXJlbnQuaXNFbXB0eSgpKSB7CisgICAgICAgIGdsQ2xlYXJDb2xvcigwLDAsMCwwKTsKKyAgICAgICAgUmVnaW9uOjpjb25zdF9pdGVyYXRvciBpdCA9IHRyYW5zcGFyZW50LmJlZ2luKCk7CisgICAgICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgY29uc3QgZW5kID0gdHJhbnNwYXJlbnQuZW5kKCk7CisgICAgICAgIGNvbnN0IGludDMyX3QgaGVpZ2h0ID0gaHcuZ2V0SGVpZ2h0KCk7CisgICAgICAgIHdoaWxlIChpdCAhPSBlbmQpIHsKKyAgICAgICAgICAgIGNvbnN0IFJlY3QmIHIoKml0KyspOworICAgICAgICAgICAgY29uc3QgR0xpbnQgc3kgPSBoZWlnaHQgLSAoci50b3AgKyByLmhlaWdodCgpKTsKKyAgICAgICAgICAgIGdsU2Npc3NvcihyLmxlZnQsIHN5LCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOworICAgICAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBhbmQgdGhlbiwgcmVuZGVyIHRoZSBsYXllcnMgdGFyZ2V0ZWQgYXQgdGhlIGZyYW1lYnVmZmVyCisgICAgICovCisgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgeworICAgICAgICBpZiAoY3VyKSB7CisgICAgICAgICAgICBpZiAoKGN1cltpXS5jb21wb3NpdGlvblR5cGUgIT0gSFdDX0ZSQU1FQlVGRkVSKSAmJgorICAgICAgICAgICAgICAgICEoY3VyW2ldLmZsYWdzICYgSFdDX1NLSVBfTEFZRVIpKSB7CisgICAgICAgICAgICAgICAgLy8gc2tpcCBsYXllcnMgaGFuZGxlZCBieSB0aGUgSEFMCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBjb25zdCBzcDxMYXllckJhc2U+JiBsYXllcihsYXllcnNbaV0pOwogICAgICAgICBjb25zdCBSZWdpb24gY2xpcChkaXJ0eS5pbnRlcnNlY3QobGF5ZXItPnZpc2libGVSZWdpb25TY3JlZW4pKTsKICAgICAgICAgaWYgKCFjbGlwLmlzRW1wdHkoKSkgewpAQCAtMTA1NCw3ICsxMTQ2LDcgQEAKICAgICBpZiAoYW5kcm9pZF9hdG9taWNfZGVjKCZtVHJhbnNhY3Rpb25Db3VudCkgPT0gMSkgewogICAgICAgICBzaWduYWxFdmVudCgpOwogCi0gICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgdHJhbnNhY3Rpb24gd2l0aCBhIHJlc2l6ZSwgd2FpdCBmb3IgaXQgdG8gCisgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgdHJhbnNhY3Rpb24gd2l0aCBhIHJlc2l6ZSwgd2FpdCBmb3IgaXQgdG8KICAgICAgICAgLy8gdGFrZSBlZmZlY3QgYmVmb3JlIHJldHVybmluZy4KICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TdGF0ZUxvY2spOwogICAgICAgICB3aGlsZSAobVJlc2l6ZVRyYW5zYXRpb25QZW5kaW5nKSB7CkBAIC0xMDk4LDcgKzExOTAsNyBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotaW50IFN1cmZhY2VGbGluZ2VyOjpzZXRPcmllbnRhdGlvbihEaXNwbGF5SUQgZHB5LCAKK2ludCBTdXJmYWNlRmxpbmdlcjo6c2V0T3JpZW50YXRpb24oRGlzcGxheUlEIGRweSwKICAgICAgICAgaW50IG9yaWVudGF0aW9uLCB1aW50MzJfdCBmbGFncykKIHsKICAgICBpZiAoVU5MSUtFTFkodWludDMyX3QoZHB5KSA+PSBESVNQTEFZX0NPVU5UKSkKQEAgLTExMzEsMTQgKzEyMjMsMTcgQEAKICAgICAgICAgICAgICAgICBpbnQodyksIGludChoKSk7CiAgICAgICAgIHJldHVybiBzdXJmYWNlSGFuZGxlOwogICAgIH0KLSAgICAKKwogICAgIC8vTE9HRCgiY3JlYXRlU3VyZmFjZSBmb3IgcGlkICVkICglZCB4ICVkKSIsIHBpZCwgdywgaCk7CiAgICAgc3A8TGF5ZXI+IG5vcm1hbExheWVyOwogICAgIHN3aXRjaCAoZmxhZ3MgJiBlRlhTdXJmYWNlTWFzaykgewogICAgICAgICBjYXNlIGVGWFN1cmZhY2VOb3JtYWw6CisjaWYgSEFTX1BVU0hfQlVGRkVSUwogICAgICAgICAgICAgaWYgKFVOTElLRUxZKGZsYWdzICYgZVB1c2hCdWZmZXJzKSkgewogICAgICAgICAgICAgICAgIGxheWVyID0gY3JlYXRlUHVzaEJ1ZmZlcnNTdXJmYWNlKGNsaWVudCwgZCwgdywgaCwgZmxhZ3MpOwotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbm9ybWFsTGF5ZXIgPSBjcmVhdGVOb3JtYWxTdXJmYWNlKGNsaWVudCwgZCwgdywgaCwgZmxhZ3MsIGZvcm1hdCk7CiAgICAgICAgICAgICAgICAgbGF5ZXIgPSBub3JtYWxMYXllcjsKICAgICAgICAgICAgIH0KQEAgLTExNTcsNyArMTI1Miw3IEBACiAgICAgICAgIHNzaXplX3QgdG9rZW4gPSBhZGRDbGllbnRMYXllcihjbGllbnQsIGxheWVyKTsKIAogICAgICAgICBzdXJmYWNlSGFuZGxlID0gbGF5ZXItPmdldFN1cmZhY2UoKTsKLSAgICAgICAgaWYgKHN1cmZhY2VIYW5kbGUgIT0gMCkgeyAKKyAgICAgICAgaWYgKHN1cmZhY2VIYW5kbGUgIT0gMCkgewogICAgICAgICAgICAgcGFyYW1zLT50b2tlbiA9IHRva2VuOwogICAgICAgICAgICAgcGFyYW1zLT5pZGVudGl0eSA9IHN1cmZhY2VIYW5kbGUtPmdldElkZW50aXR5KCk7CiAgICAgICAgICAgICBwYXJhbXMtPndpZHRoID0gdzsKQEAgLTEyNDEsNyArMTMzNiw3IEBACiAgICAgLyoKICAgICAgKiBjYWxsZWQgYnkgdGhlIHdpbmRvdyBtYW5hZ2VyLCB3aGVuIGEgc3VyZmFjZSBzaG91bGQgYmUgbWFya2VkIGZvcgogICAgICAqIGRlc3RydWN0aW9uLgotICAgICAqIAorICAgICAqCiAgICAgICogVGhlIHN1cmZhY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjdXJyZW50IGFuZCBkcmF3aW5nIGxpc3RzLCBidXQgcGxhY2VkCiAgICAgICogaW4gdGhlIHB1cmdhdG9yeSBxdWV1ZSwgc28gaXQncyBub3QgZGVzdHJveWVkIHJpZ2h0LWF3YXkgKHdlIG5lZWQKICAgICAgKiB0byB3YWl0IGZvciBhbGwgY2xpZW50J3MgcmVmZXJlbmNlcyB0byBnbyBhd2F5IGZpcnN0KS4KQEAgLTEyNjIsNyArMTM1Nyw3IEBACiBzdGF0dXNfdCBTdXJmYWNlRmxpbmdlcjo6ZGVzdHJveVN1cmZhY2UoY29uc3Qgc3A8TGF5ZXJCYXNlQ2xpZW50PiYgbGF5ZXIpCiB7CiAgICAgLy8gY2FsbGVkIGJ5IH5JU3VyZmFjZSgpIHdoZW4gYWxsIHJlZmVyZW5jZXMgYXJlIGdvbmUKLSAgICAKKwogICAgIGNsYXNzIE1lc3NhZ2VEZXN0cm95U3VyZmFjZSA6IHB1YmxpYyBNZXNzYWdlQmFzZSB7CiAgICAgICAgIFN1cmZhY2VGbGluZ2VyKiBmbGluZ2VyOwogICAgICAgICBzcDxMYXllckJhc2VDbGllbnQ+IGxheWVyOwpAQCAtMTI3NSw5ICsxMzcwLDkgQEAKICAgICAgICAgICAgIGxheWVyLmNsZWFyKCk7IC8vIGNsZWFyIGl0IG91dHNpZGUgb2YgdGhlIGxvY2s7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZmxpbmdlci0+bVN0YXRlTG9jayk7CiAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICogcmVtb3ZlIHRoZSBsYXllciBmcm9tIHRoZSBjdXJyZW50IGxpc3QgLS0gY2hhbmNlcyBhcmUgdGhhdCBpdCdzIAotICAgICAgICAgICAgICogbm90IGluIHRoZSBsaXN0IGFueXdheSwgYmVjYXVzZSBpdCBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWQgCi0gICAgICAgICAgICAgKiBhbHJlYWR5IHVwb24gcmVxdWVzdCBvZiB0aGUgY2xpZW50IChlZzogd2luZG93IG1hbmFnZXIpLiAKKyAgICAgICAgICAgICAqIHJlbW92ZSB0aGUgbGF5ZXIgZnJvbSB0aGUgY3VycmVudCBsaXN0IC0tIGNoYW5jZXMgYXJlIHRoYXQgaXQncworICAgICAgICAgICAgICogbm90IGluIHRoZSBsaXN0IGFueXdheSwgYmVjYXVzZSBpdCBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWQKKyAgICAgICAgICAgICAqIGFscmVhZHkgdXBvbiByZXF1ZXN0IG9mIHRoZSBjbGllbnQgKGVnOiB3aW5kb3cgbWFuYWdlcikuCiAgICAgICAgICAgICAgKiBIb3dldmVyLCBhIGJ1Z2d5IGNsaWVudCBjb3VsZCBoYXZlIG5vdCBkb25lIHRoYXQuCiAgICAgICAgICAgICAgKiBTaW5jZSB3ZSBrbm93IHdlIGRvbid0IGhhdmUgYW55IG1vcmUgY2xpZW50cywgd2UgZG9uJ3QgbmVlZAogICAgICAgICAgICAgICogdG8gdXNlIHRoZSBwdXJnYXRvcnkuCkBAIC0xMzkyLDcgKzE0ODcsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNvbnN0IGJvb2wgbG9ja2VkKHJldHJ5ID49IDApOwogICAgICAgICBpZiAoIWxvY2tlZCkgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKICAgICAgICAgICAgICAgICAgICAgIlN1cmZhY2VGbGluZ2VyIGFwcGVhcnMgdG8gYmUgdW5yZXNwb25zaXZlLCAiCiAgICAgICAgICAgICAgICAgICAgICJkdW1waW5nIGFueXdheXMgKG5vIGxvY2tzIGhlbGQpXG4iKTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKQEAgLTE0MzQsNiArMTUyOSwxMyBAQAogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgICAgICB9CiAKKyAgICAgICAgSFdDb21wb3NlciYgaHdjKGh3LmdldEh3Q29tcG9zZXIoKSk7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgaC93IGNvbXBvc2VyICVzIGFuZCAlc1xuIiwKKyAgICAgICAgICAgICAgICBod2MuaW5pdENoZWNrKCk9PU5PX0VSUk9SID8gInByZXNlbnQiIDogIm5vdCBwcmVzZW50IiwKKyAgICAgICAgICAgICAgICBtRGVidWdEaXNhYmxlSFdDID8gImRpc2FibGVkIiA6ICJlbmFibGVkIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgaHdjLmR1bXAocmVzdWx0LCBidWZmZXIsIFNJWkUpOworCiAgICAgICAgIGNvbnN0IEdyYXBoaWNCdWZmZXJBbGxvY2F0b3ImIGFsbG9jKEdyYXBoaWNCdWZmZXJBbGxvY2F0b3I6OmdldCgpKTsKICAgICAgICAgYWxsb2MuZHVtcChyZXN1bHQpOwogCkBAIC0xNTA3LDYgKzE2MDksMTEgQEAKICAgICAgICAgICAgICAgICBuID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgICAgICBtRGVidWdCYWNrZ3JvdW5kID0gbiA/IDEgOiAwOwogICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIGNhc2UgMTAwODogIC8vIHRvZ2dsZSB1c2Ugb2YgaHcgY29tcG9zZXIKKyAgICAgICAgICAgICAgICBuID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgICAgICBtRGVidWdEaXNhYmxlSFdDID0gbiA/IDEgOiAwOworICAgICAgICAgICAgICAgIG1Id1dvcmtMaXN0RGlydHkgPSB0cnVlOworICAgICAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaC4uLgogICAgICAgICAgICAgY2FzZSAxMDA0OnsgLy8gcmVwYWludCBldmVyeXRoaW5nCiAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TdGF0ZUxvY2spOwogICAgICAgICAgICAgICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpKTsKQEAgLTE4NTEsMTIgKzE5NTgsMTUgQEAKIHsKICAgICBpbnQzMl90IG5hbWUgPSBOQU1FX05PVF9GT1VORDsKICAgICBzcDxMYXllcj4gbGF5ZXIobUZsaW5nZXItPmdldExheWVyKHN1cikpOwotICAgIGlmIChsYXllciA9PSAwKSByZXR1cm4gbmFtZTsKKyAgICBpZiAobGF5ZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CiAKICAgICAvLyBpZiB0aGlzIGxheWVyIGFscmVhZHkgaGFzIGEgdG9rZW4sIGp1c3QgcmV0dXJuIGl0CiAgICAgbmFtZSA9IGxheWVyLT5nZXRUb2tlbigpOwotICAgIGlmICgobmFtZSA+PSAwKSAmJiAobGF5ZXItPmdldENsaWVudCgpID09IHRoaXMpKQorICAgIGlmICgobmFtZSA+PSAwKSAmJiAobGF5ZXItPmdldENsaWVudCgpID09IHRoaXMpKSB7CiAgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KIAogICAgIG5hbWUgPSAwOwogICAgIGRvIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5oCmluZGV4IGYwYTE2N2IuLjczMmU1N2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmgKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuaApAQCAtMzAzLDYgKzMwMyw3IEBACiAgICAgICAgICAgICB2b2lkICAgICAgICBoYW5kbGVQYWdlRmxpcCgpOwogICAgICAgICAgICAgYm9vbCAgICAgICAgbG9ja1BhZ2VGbGlwKGNvbnN0IExheWVyVmVjdG9yJiBjdXJyZW50TGF5ZXJzKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIHVubG9ja1BhZ2VGbGlwKGNvbnN0IExheWVyVmVjdG9yJiBjdXJyZW50TGF5ZXJzKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVdvcmtMaXN0KCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBoYW5kbGVSZXBhaW50KCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBwb3N0RnJhbWVidWZmZXIoKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGNvbXBvc2VTdXJmYWNlcyhjb25zdCBSZWdpb24mIGRpcnR5KTsKQEAgLTM4Myw2ICszODQsNyBAQAogICAgICAgICAgICAgICAgIFJlZ2lvbiAgICAgICAgICAgICAgICAgICAgICBtSW52YWxpZFJlZ2lvbjsKICAgICAgICAgICAgICAgICBSZWdpb24gICAgICAgICAgICAgICAgICAgICAgbVdvcm1ob2xlUmVnaW9uOwogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtVmlzaWJsZVJlZ2lvbnNEaXJ0eTsKKyAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUh3V29ya0xpc3REaXJ0eTsKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVyUmVsZWFzZUNvbnNvbGU7CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1GcmVlemVEaXNwbGF5OwogICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtRnJlZXplQ291bnQ7CkBAIC0zOTMsNiArMzk1LDcgQEAKICAgICAgICAgICAgICAgICAvLyBkb24ndCB1c2UgYSBsb2NrIGZvciB0aGVzZSwgd2UgZG9uJ3QgY2FyZQogICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtRGVidWdSZWdpb247CiAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWJ1Z0JhY2tncm91bmQ7CisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWJ1Z0Rpc2FibGVIV0M7CiAgICAgICAgICAgICAgICAgdm9sYXRpbGUgbnNlY3NfdCAgICAgICAgICAgIG1EZWJ1Z0luU3dhcEJ1ZmZlcnM7CiAgICAgICAgICAgICAgICAgbnNlY3NfdCAgICAgICAgICAgICAgICAgICAgIG1MYXN0U3dhcEJ1ZmZlclRpbWU7CiAgICAgICAgICAgICAgICAgdm9sYXRpbGUgbnNlY3NfdCAgICAgICAgICAgIG1EZWJ1Z0luVHJhbnNhY3Rpb247CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggYjA3YTEwYi4uMTg2YjM0OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZC5tawpAQCAtNyw4ICs3LDEwIEBACiAjIEluY2x1ZGUgYWxsIHRlc3QgamF2YSBmaWxlcy4KIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKIAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGVhc3ltb2NrbGliCiAKIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIgc2VydmljZXMKKwogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEZyYW1ld29ya3NTZXJ2aWNlc1Rlc3RzCiAKIExPQ0FMX0NFUlRJRklDQVRFIDo9IHBsYXRmb3JtCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggNWNlMTA5Zi4uZjExNWY0MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjMsNiArMjMsMTkgQEAKICAgICAKICAgICA8YXBwbGljYXRpb24+CiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuc2VydmVyLkFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QkTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSI+CisgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZSIvPgorICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9zZXJ2aWNlPgorCisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuc2VydmVyLkFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QkTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UiPgorICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2UiLz4KKyAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvc2VydmljZT4KKwogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmUzYTgyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QuamF2YQpAQCAtMCwwICsxLDcyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOworCitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LklBY2Nlc3NpYmlsaXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5JQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQ7CisKKy8qKgorICogVGhpcyB0ZXN0IGV4ZXJjaXNlcyB0aGUKKyAqIHtAbGluayBjb20uYW5kcm9pZC5zZXJ2ZXIuQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlfSBieSBtb2NraW5nIHRoZQorICoge0BsaW5rIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyfSB3aGljaCB0YWxrcyB0byB0byB0aGUKKyAqIHNlcnZpY2UuIFRoZSBzZXJ2aWNlIGl0c2VsZiBpcyBpbnRlcmFjdGluZyB3aXRoIHRoZSBwbGF0Zm9ybS4gTm90ZTogVGVzdGluZworICogdGhlIHNlcnZpY2UgaW4gZnVsbCBpc29sYXRpb24gd291bGQgcmVxdWlyZSBzaWduaWZpY2FudCBhbW91bnQgb2Ygd29yayBmb3IKKyAqIG1vY2tpbmcgYWxsIHN5c3RlbSBpbnRlcmFjdGlvbnMuIEl0IHdvdWxkIGFsc28gcmVxdWlyZSBhIGxvdCBvZiBtb2NraW5nIGNvZGUuCisgKi8KK3B1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIFRpbWVvdXQgcmVxdWlyZWQgZm9yIHBlbmRpbmcgQmluZGVyIGNhbGxzIG9yIGV2ZW50IHByb2Nlc3NpbmcgdG8KKyAgICAgKiBjb21wbGV0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfQklOREVSX0NBTEwgPSAxMDA7CisKKyAgICAvKioKKyAgICAgKiBUaW1lb3V0IGluIHdoaWNoIHdlIGFyZSB3YWl0aW5nIGZvciB0aGUgc3lzdGVtIHRvIHN0YXJ0IHRoZSBtb2NrCisgICAgICogYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfU1RBUlRfTU9DS19BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTID0gMzAwOworCisgICAgLyoqCisgICAgICogVGltZW91dCB1c2VkIGZvciB0ZXN0aW5nIHRoYXQgYSBzZXJ2aWNlIGlzIG5vdGlmaWVkIG9ubHkgdXBvbiBhCisgICAgICogbm90aWZpY2F0aW9uIHRpbWVvdXQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FT1VUX1RFU1RfTk9USUZJQ0FUSU9OX1RJTUVPVVQgPSAzMDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFja2FnZSBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzUGFja2FnZU5hbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW50ZXJmYWNlIHVzZWQgdG8gdGFsayB0byB0aGUgdGVzdGVkIHNlcnZpY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbU1hbmFnZXJTZXJ2aWNlOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIuc2V0Q29udGV4dChjb250ZXh0KTsKKyAgICAgICAgaWYgKHNQYWNrYWdlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBzUGFja2FnZU5hbWUgPSBjb250ZXh0LmdldFBhY2thZ2VOYW1lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0KCkgeworICAgICAgICBJQmluZGVyIGlCaW5kZXIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuQUNDRVNTSUJJTElUWV9TRVJWSUNFKTsKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlID0gSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoaUJpbmRlcik7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRDbGllbnRfQWNjZXNzaWJpbGl0eURpc2FibGVkVGhlbkVuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIGFjY2Vzc2liaWxpdHkgaXMgZGlzYWJsZWQKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIGZhbHNlKTsKKworICAgICAgICAvLyBjcmVhdGUgYSBjbGllbnQgbW9jayBpbnN0YW5jZQorICAgICAgICBNeU1vY2tBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBtb2NrQ2xpZW50ID0gbmV3IE15TW9ja0FjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBib29sZWFuIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RGlzYWJsZWQgPSBtTWFuYWdlclNlcnZpY2UuYWRkQ2xpZW50KG1vY2tDbGllbnQpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNsaWVudCBtdXN0IGJlIGRpc2FibGVkIHNpbmNlIGFjY2Vzc2liaWxpdHkgaXMgZGlzYWJsZWQuIiwKKyAgICAgICAgICAgICAgICBlbmFibGVkQWNjZXNzaWJpbGl0eURpc2FibGVkKTsKKworICAgICAgICAvLyBlbmFibGUgYWNjZXNzaWJpbGl0eQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBib29sZWFuIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RW5hYmxlZCA9IG1NYW5hZ2VyU2VydmljZS5hZGRDbGllbnQobW9ja0NsaWVudCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjbGllbnQgbXVzdCBiZSBlbmFibGVkIHNpbmNlIGFjY2Vzc2liaWxpdHkgaXMgZW5hYmxlZC4iLAorICAgICAgICAgICAgICAgIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RW5hYmxlZCk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRDbGllbnRfQWNjZXNzaWJpbGl0eUVuYWJsZWRUaGVuRGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZW5hYmxlIGFjY2Vzc2liaWxpdHkgYmVmb3JlIHJlZ2lzdGVyaW5nIHRoZSBjbGllbnQKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGNyZWF0ZSBhIGNsaWVudCBtb2NrIGluc3RhbmNlCisgICAgICAgIE15TW9ja0FjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IG1vY2tDbGllbnQgPSBuZXcgTXlNb2NrQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIGJvb2xlYW4gZW5hYmxlZEFjY2Vzc2liaWxpdHlFbmFibGVkID0gbU1hbmFnZXJTZXJ2aWNlLmFkZENsaWVudChtb2NrQ2xpZW50KTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNsaWVudCBtdXN0IGJlIGVuYWJsZWQgc2luY2UgYWNjZXNzaWJpbGl0eSBpcyBlbmFibGVkLiIsCisgICAgICAgICAgICAgICAgZW5hYmxlZEFjY2Vzc2liaWxpdHlFbmFibGVkKTsKKworICAgICAgICAvLyBkaXNhYmxlIGFjY2Vzc2liaWxpdHkKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIGZhbHNlKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIGJvb2xlYW4gZW5hYmxlZEFjY2Vzc2liaWxpdHlEaXNhYmxlZCA9IG1NYW5hZ2VyU2VydmljZS5hZGRDbGllbnQobW9ja0NsaWVudCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY2xpZW50IG11c3QgYmUgZGlzYWJsZWQgc2luY2UgYWNjZXNzaWJpbGl0eSBpcyBkaXNhYmxlZC4iLAorICAgICAgICAgICAgICAgIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RGlzYWJsZWQpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VzTGlzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBib29sZWFuIGZpcnN0TW9ja1NlcnZpY2VJbnN0YWxsZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBzZWNvbmRNb2NrU2VydmljZUluc3RhbGxlZCA9IGZhbHNlOworCisgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICBTdHJpbmcgZmlyc3RNb2NrU2VydmljZUNsYXNzTmFtZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpOworICAgICAgICBTdHJpbmcgc2Vjb25kTW9ja1NlcnZpY2VDbGFzc05hbWUgPSBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jbGFzcy5nZXROYW1lKCk7CisKKyAgICAgICAgLy8gbG9vayBmb3IgdGhlIHR3byBtb2NrIHNlcnZpY2VzCisgICAgICAgIGZvciAoU2VydmljZUluZm8gc2VydmljZUluZm8gOiBtTWFuYWdlclNlcnZpY2UuZ2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCkpIHsKKyAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS5lcXVhbHMoc2VydmljZUluZm8ucGFja2FnZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0TW9ja1NlcnZpY2VDbGFzc05hbWUuZXF1YWxzKHNlcnZpY2VJbmZvLm5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0TW9ja1NlcnZpY2VJbnN0YWxsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2Vjb25kTW9ja1NlcnZpY2VDbGFzc05hbWUuZXF1YWxzKHNlcnZpY2VJbmZvLm5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHNlY29uZE1vY2tTZXJ2aWNlSW5zdGFsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlyc3QgbW9jayBzZXJ2aWNlIG11c3QgYmUgaW5zdGFsbGVkIiwgZmlyc3RNb2NrU2VydmljZUluc3RhbGxlZCk7CisgICAgICAgIGFzc2VydFRydWUoIlNlY29uZCBtb2NrIHNlcnZpY2UgbXVzdCBiZSBpbnN0YWxsZWQiLCBzZWNvbmRNb2NrU2VydmljZUluc3RhbGxlZCk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X09uZVNlcnZpY2VfTWF0Y2hpbmdQYWNrYWdlQW5kRXZlbnRUeXBlKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZQorICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgZmFsc2UpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIHNlcnZpY2Uuc2V0U2VydmljZUluZm8oTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbCB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSBhbiBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucworICAgICAgICBzZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIHNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfT25lU2VydmljZV9Ob3RNYXRjaGluZ1BhY2thZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIGZhbHNlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBzZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGwgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworICAgICAgICBzZW50RXZlbnQuc2V0UGFja2FnZU5hbWUoIm5vLnNlcnZpY2UucmVnaXN0ZXJlZC5mb3IudGhpcy5wYWNrYWdlIik7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucworICAgICAgICBzZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X09uZVNlcnZpY2VfTm90TWF0Y2hpbmdFdmVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIGZhbHNlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBzZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGwgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworICAgICAgICBzZW50RXZlbnQuc2V0RXZlbnRUeXBlKEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX05PVElGSUNBVElPTl9TVEFURV9DSEFOR0VEKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zCisgICAgICAgIHNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfT25lU2VydmljZV9Ob3RpZml2YXRpb25BZnRlclRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIGZhbHNlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gaW5mbyA9IE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpOworICAgICAgICBpbmZvLm5vdGlmaWNhdGlvblRpbWVvdXQgPSBUSU1FT1VUX1RFU1RfTk9USUZJQ0FUSU9OX1RJTUVPVVQ7CisgICAgICAgIHNlcnZpY2Uuc2V0U2VydmljZUluZm8oaW5mbyk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxsIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIHRoZSBmaXJzdCBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBmaXJzdEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChmaXJzdEV2ZW50KTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIHRoZSBzZWNvbmQgZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2Vjb25kRXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlY29uZEV2ZW50KTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zCisgICAgICAgIHNlcnZpY2UuZXhwZWN0RXZlbnQoc2Vjb25kRXZlbnQpOworICAgICAgICBzZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50cworICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChmaXJzdEV2ZW50KTsKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2Vjb25kRXZlbnQpOworCisgICAgICAgIC8vIHdhaXQgZm9yICNzZW5kQWNjZXNzaWJpbGl0eUV2ZW50IHRvIHJlYWNoIHRoZSBiYWNraW5nIHNlcnZpY2UKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXJ2aWNlLnZlcmlmeSgpOworICAgICAgICAgICAgZmFpbCgiTm8gZXZlbnRzIG11c3QgYmUgZGlzcGF0Y2hlZCBiZWZvcmUgdGhlIGV4cGlyYXRpb24gb2YgdGhlIG5vdGlmaWNhdGlvbiB0aW1lb3V0LiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKSB7CisgICAgICAgICAgICAvKiBleHBlY3RlZCAqLworICAgICAgICB9CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGNvbmZpZ3VyZWQgbm90aWZpY2F0aW9uIHRpbWVvdXQgdG8gZXhwaXJlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX1RFU1RfTk9USUZJQ0FUSU9OX1RJTUVPVVQpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlcnZpY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9Ud29TZXJ2aWNlc19NYXRjaGluZ1BhY2thZ2VBbmRFdmVudFR5cGVfRGlmZkZlZWRiYWNrKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIHRydWUpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBmaXJzdFNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGZpcnN0SW5mbyA9IE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpOworICAgICAgICBmaXJzdEluZm8uZmVlZGJhY2tUeXBlID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkZFRURCQUNLX0FVRElCTEU7CisgICAgICAgIGZpcnN0U2VydmljZS5zZXRTZXJ2aWNlSW5mbyhmaXJzdEluZm8pOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2Vjb25kU2VydmljZSA9IE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIHNlY29uZEluZm8gPSBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKTsKKyAgICAgICAgc2Vjb25kSW5mby5mZWVkYmFja1R5cGUgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uRkVFREJBQ0tfSEFQVElDOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKHNlY29uZEluZm8pOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbHMgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgZmlyc3RTZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIGZpcnN0U2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBzZWNvbmRTZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIHNlY29uZFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChmaXJzdFNlcnZpY2UpOworICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZWNvbmRTZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfVHdvU2VydmljZXNfTWF0Y2hpbmdQYWNrYWdlQW5kRXZlbnRUeXBlKCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIHRydWUpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBmaXJzdFNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlY29uZFNlcnZpY2UgPSBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIHNlY29uZFNlcnZpY2Uuc2V0U2VydmljZUluZm8oTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbHMgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgZmlyc3RTZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIGZpcnN0U2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBzZWNvbmRTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoZmlyc3RTZXJ2aWNlKTsKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2Vjb25kU2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X1R3b1NlcnZpY2VzX01hdGNoaW5nUGFja2FnZUFuZEV2ZW50VHlwZV9PbmVEZWZhdWx0KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIHRydWUpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBmaXJzdFNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGZpcnN0SW5mbyA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKTsKKyAgICAgICAgZmlyc3RJbmZvLmZsYWdzID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkRFRkFVTFQ7CisgICAgICAgIGZpcnN0U2VydmljZS5zZXRTZXJ2aWNlSW5mbyhmaXJzdEluZm8pOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2Vjb25kU2VydmljZSA9IE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgc2Vjb25kU2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGxzIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIGFuIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIGZpcnN0U2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBzZWNvbmRTZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIHNlY29uZFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChmaXJzdFNlcnZpY2UpOworICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZWNvbmRTZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfVHdvU2VydmljZXNfTWF0Y2hpbmdQYWNrYWdlQW5kRXZlbnRUeXBlX1R3b0RlZmF1bHQoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcworICAgICAgICBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChtQ29udGV4dCwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGZpcnN0U2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gZmlyc3RJbmZvID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpOworICAgICAgICBmaXJzdEluZm8uZmxhZ3MgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uREVGQVVMVDsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKGZpcnN0SW5mbyk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZWNvbmRTZXJ2aWNlID0gTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gc2Vjb25kSW5mbyA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKTsKKyAgICAgICAgc2Vjb25kSW5mby5mbGFncyA9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5ERUZBVUxUOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKGZpcnN0SW5mbyk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxscyB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSBhbiBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBmaXJzdFNlcnZpY2UuZXhwZWN0RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIHNlY29uZFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2VuZCB0aGUgZXZlbnQKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChmaXJzdFNlcnZpY2UpOworICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZWNvbmRTZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludGVycnVwdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIHRydWUpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBmaXJzdFNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlY29uZFNlcnZpY2UgPSBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIHNlY29uZFNlcnZpY2Uuc2V0U2VydmljZUluZm8oTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCkpOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbHMgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgZmlyc3RTZXJ2aWNlLmV4cGVjdEludGVycnVwdCgpOworICAgICAgICBmaXJzdFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgc2Vjb25kU2VydmljZS5leHBlY3RJbnRlcnJ1cHQoKTsKKyAgICAgICAgc2Vjb25kU2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBjYWxsIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBtTWFuYWdlclNlcnZpY2UuaW50ZXJydXB0KCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoZmlyc3RTZXJ2aWNlKTsKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2Vjb25kU2VydmljZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRnVsbHkgcG9wdWxhdGVzIHRoZSB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50fSB0byBtYXJzaGFsLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbnRFdmVudCBUaGUgZXZlbnQgdG8gcG9wdWxhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQpIHsKKyAgICAgICAgc2VudEV2ZW50LnNldEFkZGVkQ291bnQoMSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRCZWZvcmVUZXh0KCJCZWZvcmVUZXh0Iik7CisgICAgICAgIHNlbnRFdmVudC5zZXRDaGVja2VkKHRydWUpOworICAgICAgICBzZW50RXZlbnQuc2V0Q2xhc3NOYW1lKCJmb28uYmFyLmJhei5DbGFzcyIpOworICAgICAgICBzZW50RXZlbnQuc2V0Q29udGVudERlc2NyaXB0aW9uKCJDb250ZW50RGVzY3JpcHRpb24iKTsKKyAgICAgICAgc2VudEV2ZW50LnNldEN1cnJlbnRJdGVtSW5kZXgoMSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRFbmFibGVkKHRydWUpOworICAgICAgICBzZW50RXZlbnQuc2V0RXZlbnRUeXBlKEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfQ0xJQ0tFRCk7CisgICAgICAgIHNlbnRFdmVudC5zZXRFdmVudFRpbWUoMTAwMCk7CisgICAgICAgIHNlbnRFdmVudC5zZXRGcm9tSW5kZXgoMSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRGdWxsU2NyZWVuKHRydWUpOworICAgICAgICBzZW50RXZlbnQuc2V0SXRlbUNvdW50KDEpOworICAgICAgICBzZW50RXZlbnQuc2V0UGFja2FnZU5hbWUoImZvby5iYXIuYmF6Iik7CisgICAgICAgIHNlbnRFdmVudC5zZXRQYXJjZWxhYmxlRGF0YShNZXNzYWdlLm9idGFpbihudWxsLCAxLCBudWxsKSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRQYXNzd29yZCh0cnVlKTsKKyAgICAgICAgc2VudEV2ZW50LnNldFJlbW92ZWRDb3VudCgxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGlzIGEgbW9jayB7QGxpbmsgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgTXlNb2NrQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgZXh0ZW5kcyBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQuU3R1YiB7CisgICAgICAgIGJvb2xlYW4gbUlzRW5hYmxlZDsKKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICAgICAgbUlzRW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIGFjY2Vzc2liaWxpdHkgaXMgaW4gYSBnaXZlbiBzdGF0ZSBieSB3cml0aW5nIHRoZSBzdGF0ZSB0byB0aGUKKyAgICAgKiBzZXR0aW5ncyBhbmQgd2FpdGluZyB1bnRpbCB0aGUgYWNjZXNzaWJpbGl0eSBtYW5hZ2VyIHNlcnZpY2UgcGljayBpdCB1cC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dCBoYW5kbGUgdG8gYWNjZXNzIHRoZSBzZXR0aW5ncy4KKyAgICAgKiBAcGFyYW0gZW5hYmxlZCBUaGUgYWNjZXNzaWJpbGl0eSBzdGF0ZSB0byB3cml0ZSB0byB0aGUgc2V0dGluZ3MuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQoQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGVuYWJsZWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBib29sZWFuIGlzRW5hYmxlZCA9IChTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkFDQ0VTU0lCSUxJVFlfRU5BQkxFRCwgMCkgPT0gMSA/IHRydWUgOiBmYWxzZSk7CisKKyAgICAgICAgaWYgKGlzRW5hYmxlZCA9PSBlbmFibGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX0VOQUJMRUQsCisgICAgICAgICAgICAgICAgZW5hYmxlZCA/IDEgOiAwKTsKKworICAgICAgICAvLyB3YWl0IHRoZSBhY2Nlc3NpYmlsaXR5IG1hbmFnZXIgc2VydmljZSB0byBwaWNrIHRoZSBjaGFuZ2UgdXAKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZXMgdGhlIG9ubHkge0BsaW5rIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZX1zIHdpdGggZ2l2ZW4gY29tcG9uZW50CisgICAgICogbmFtZXMgYXJlIGVuYWJsZWQgYnkgd3JpdGluZyB0byB0aGUgc3lzdGVtIHNldHRpbmdzIGFuZCB3YWl0aW5nIHVudGlsIHRoZQorICAgICAqIGFjY2Vzc2liaWxpdHkgbWFuYWdlciBzZXJ2aWNlIHBpY2tzIHRoYXQgdXAgb3IgdGhlCisgICAgICoge0BsaW5rICNUSU1FT1VUX1NUQVJUX01PQ0tfQUNDRVNTSUJJTElUWV9TRVJWSUNFU30gaXMgZXhjZWVkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQgaGFuZGxlIHRvIGFjY2VzcyB0aGUgc2V0dGluZ3MuCisgICAgICogQHBhcmFtIGZpcnN0TW9ja1NlcnZpY2VFbmFibGVkIElmIHRoZSBmaXJzdCBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZSBpcyBlbmFibGVkLgorICAgICAqIEBwYXJhbSBzZWNvbmRNb2NrU2VydmljZUVuYWJsZWQgSWYgdGhlIHNlY29uZCBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZSBpcyBlbmFibGVkLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIHNvbWUgb2YgdGhlIHJlcXVlc3RlZCBmb3IgZW5hYmxpbmcgbW9jayBzZXJ2aWNlcworICAgICAqICAgICAgICAgaXMgbm90IHByb3Blcmx5IHN0YXJ0ZWQuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gRXhjZXB0aW9uIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKENvbnRleHQgY29udGV4dCwgYm9vbGVhbiBmaXJzdE1vY2tTZXJ2aWNlRW5hYmxlZCwKKyAgICAgICAgICAgIGJvb2xlYW4gc2Vjb25kTW9ja1NlcnZpY2VFbmFibGVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGVuYWJsZWRTZXJ2aWNlcyA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuRU5BQkxFRF9BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTKTsKKworICAgICAgICBTdHJpbmdCdWlsZGVyIHNlcnZpY2VzVG9FbmFibGUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBpZiAoZmlyc3RNb2NrU2VydmljZUVuYWJsZWQpIHsKKyAgICAgICAgICAgIHNlcnZpY2VzVG9FbmFibGUuYXBwZW5kKE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0NvbXBvbmVudE5hbWUpLmFwcGVuZCgiOiIpOworICAgICAgICB9CisgICAgICAgIGlmIChzZWNvbmRNb2NrU2VydmljZUVuYWJsZWQpIHsKKyAgICAgICAgICAgIHNlcnZpY2VzVG9FbmFibGUuYXBwZW5kKE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNDb21wb25lbnROYW1lKS5hcHBlbmQoIjoiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXJ2aWNlc1RvRW5hYmxlLmVxdWFscyhlbmFibGVkU2VydmljZXMpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfQUNDRVNTSUJJTElUWV9TRVJWSUNFUywgc2VydmljZXNUb0VuYWJsZS50b1N0cmluZygpKTsKKworICAgICAgICAvLyB3ZSBoYXZlIGVuYWJsZWQgdGhlIHNlcnZpY2VzIG9mIGludGVyZXN0IGFuZCBuZWVkIHRvIHdhaXQgdW50aWwgdGhleQorICAgICAgICAvLyBhcmUgaW5zdGFudGlhdGVkIGFuZCBzdGFydGVkIChpZiBuZWVkZWQpIGFuZCB0aGUgc3lzdGVtIGJpbmRzIHRvIHRoZW0KKyAgICAgICAgYm9vbGVhbiBmaXJzdE1vY2tTZXJ2aWNlT0sgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBzZWNvbmRNb2NrU2VydmljZU9LID0gZmFsc2U7CisgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgbG9uZyBwb2xsaW5nSW50ZXJ2YWwgPSBUSU1FT1VUX1NUQVJUX01PQ0tfQUNDRVNTSUJJTElUWV9TRVJWSUNFUyAvIDY7CisKKyAgICAgICAgd2hpbGUgKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gc3RhcnQgPCBUSU1FT1VUX1NUQVJUX01PQ0tfQUNDRVNTSUJJTElUWV9TRVJWSUNFUykgIHsKKyAgICAgICAgICAgIGZpcnN0TW9ja1NlcnZpY2VPSyA9ICFmaXJzdE1vY2tTZXJ2aWNlRW5hYmxlZAorICAgICAgICAgICAgICAgICAgICB8fCAoTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2UgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZS5pc1N5c3RlbUJvdW5kQXNDbGllbnQoKSk7CisKKyAgICAgICAgICAgIHNlY29uZE1vY2tTZXJ2aWNlT0sgPSAhc2Vjb25kTW9ja1NlcnZpY2VFbmFibGVkCisgICAgICAgICAgICAgICAgICAgIHx8IChNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2UgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2UuaXNTeXN0ZW1Cb3VuZEFzQ2xpZW50KCkpOworCisgICAgICAgICAgICBpZiAoZmlyc3RNb2NrU2VydmljZU9LICYmIHNlY29uZE1vY2tTZXJ2aWNlT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChwb2xsaW5nSW50ZXJ2YWwpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgbWVzc2FnZS5hcHBlbmQoIk1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcyBub3Qgc3RhcnRlZCBvciBzeXN0ZW0gbm90IGJvdW5kIGFzIGEgY2xpZW50OiAiKTsKKyAgICAgICAgaWYgKCFmaXJzdE1vY2tTZXJ2aWNlT0spIHsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0NvbXBvbmVudE5hbWUpOworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoIiAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNlY29uZE1vY2tTZXJ2aWNlT0spIHsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNDb21wb25lbnROYW1lKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG1lc3NhZ2UudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0cyB0aGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB2ZXJpZmllZAorICAgICAqICh3aGljaCBpcyBpdCBoYXMgcmVjZWl2ZWQgdGhlIGV4cGVjdGVkIG1ldGhvZCBjYWxscyB3aXRoIGV4cGVjdGVkCisgICAgICogYXJndW1lbnRzKSB3aXRoaW4gdGhlIHtAbGluayAjVElNRU9VVF9CSU5ERVJfQ0FMTH0uIFRoZSB2ZXJpZmllZCBzdGF0ZSBpcworICAgICAqIGNoZWNrZWQgYnkgcG9sbGluZyB1cG9uIHNtYWxsIGludGVydmFscy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIHZlcmlmeS4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBJZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBmYWlsZWQgd2l0aCBleGNlcHRpb24gYWZ0ZXIgdGhlCisgICAgICogICAgICAgICAgICAge0BsaW5rICNUSU1FT1VUX0JJTkRFUl9DQUxMfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlcnZpY2UpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRXhjZXB0aW9uIGxhc3RWZXJpZnlFeGNlcHRpb24gPSBudWxsOworICAgICAgICBsb25nIGJlZ2luVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBsb25nIHBvbGxUbWVvdXQgPSBUSU1FT1VUX0JJTkRFUl9DQUxMIC8gNTsKKworICAgICAgICAvLyBwb2xsIHVudGlsIHRoZSB0aW1lb3V0IGhhcyBlbGFwc2VkCisgICAgICAgIHdoaWxlIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIGJlZ2luVGltZSA8IFRJTUVPVVRfQklOREVSX0NBTEwpIHsKKyAgICAgICAgICAgIC8vIHNsZWVwIGZpcnN0IHNpbmNlIGltbWVkaWF0ZSBjYWxsIHdpbGwgYWx3YXlzIGZhaWwKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHBvbGxUbWVvdXQpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHBvbGwgZm9yIHZlcmlmaWNhdGlvbiBhbmQgaWYgdGhpcyBmYWlscyBzYXZlIHRoZSBleGNlcHRpb24gYW5kCisgICAgICAgICAgICAvLyBrZWVwIHBvbGxpbmcKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2VydmljZS52ZXJpZnkoKTsKKyAgICAgICAgICAgICAgICAvLyByZXNldCBzbyBpdCBkb2VzIG5vdCBhY2NlcHQgbW9yZSBldmVudHMKKyAgICAgICAgICAgICAgICBzZXJ2aWNlLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsYXN0VmVyaWZ5RXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlc2V0LCB3ZSBoYXZlIGFscmVhZHkgZmFpbGVkCisgICAgICAgIHNlcnZpY2UucmVzZXQoKTsKKworICAgICAgICAvLyBhbHdheXMgbm90IG51bGwKKyAgICAgICAgdGhyb3cgbGFzdFZlcmlmeUV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGlzIHRoZSBmaXJzdCBtb2NrIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGV4dGVuZHMgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHNlcnZpY2Uge0BsaW5rIENvbXBvbmVudE5hbWV9IGZsYXR0ZW5lZCBhcyBhIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgc0NvbXBvbmVudE5hbWUgPSBuZXcgQ29tcG9uZW50TmFtZSgKKyAgICAgICAgICAgICAgICBzUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jbGFzcy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICApLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZSB0byB0aGUgc2VydmljZSBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNJbnN0YW5jZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlKCkgeworICAgICAgICAgICAgc0luc3RhbmNlID0gdGhpczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgaXMgdGhlIGZpcnN0IG1vY2sge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIGV4dGVuZHMgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHNlcnZpY2Uge0BsaW5rIENvbXBvbmVudE5hbWV9IGZsYXR0ZW5lZCBhcyBhIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgc0NvbXBvbmVudE5hbWUgPSBuZXcgQ29tcG9uZW50TmFtZSgKKyAgICAgICAgICAgICAgICBzUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgKS5mbGF0dGVuVG9TaG9ydFN0cmluZygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGUgdG8gdGhlIHNlcnZpY2UgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc0luc3RhbmNlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlKCkgeworICAgICAgICAgICAgc0luc3RhbmNlID0gdGhpczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGZlZDIyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmNyZWF0ZVN0cmljdE1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBsYXk7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBvcnRNYXRjaGVyOworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVzZXQ7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay52ZXJpZnk7CisKK2ltcG9ydCBvcmcuZWFzeW1vY2suSUFyZ3VtZW50TWF0Y2hlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LklBY2Nlc3NpYmlsaXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5JQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRlc3RzIGZvciB0aGUgQWNjZXNzaWJpbGl0eU1hbmFnZXIgd2hpY2ggbW9ja2luZyB0aGUgYmFja2luZyBzZXJ2aWNlLgorICovCitwdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eU1hbmFnZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIFRpbWVvdXQgcmVxdWlyZWQgZm9yIHBlbmRpbmcgQmluZGVyIGNhbGxzIG9yIGV2ZW50IHByb2Nlc3NpbmcgdG8KKyAgICAgKiBjb21wbGV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVF9CSU5ERVJfQ0FMTCA9IDUwOworCisgICAgLyoqCisgICAgICogVGhlIHJldXNhYmxlIG1vY2sge0BsaW5rIElBY2Nlc3NpYmlsaXR5TWFuYWdlcn0uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbU1vY2tTZXJ2aWNlSW50ZXJmYWNlID0KKyAgICAgICAgY3JlYXRlU3RyaWN0TW9jayhJQWNjZXNzaWJpbGl0eU1hbmFnZXIuY2xhc3MpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmVzZXQobU1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY3JlYXRlIGEgbGlzdCBvZiBpbnN0YWxsZWQgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcyB0aGUgbW9jayBzZXJ2aWNlIHJldHVybnMKKyAgICAgICAgTGlzdDxTZXJ2aWNlSW5mbz4gZXhwZWN0ZWRTZXJ2aWNlcyA9IG5ldyBBcnJheUxpc3Q8U2VydmljZUluZm8+KCk7CisgICAgICAgIFNlcnZpY2VJbmZvIHNlcnZpY2VJbmZvID0gbmV3IFNlcnZpY2VJbmZvKCk7CisgICAgICAgIHNlcnZpY2VJbmZvLm5hbWUgPSAiVGVzdFNlcnZpY2VJbmZvTmFtZSI7CisgICAgICAgIGV4cGVjdGVkU2VydmljZXMuYWRkKHNlcnZpY2VJbmZvKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZSBiZWhhdmlvcgorICAgICAgICBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbW9ja1NlcnZpY2VJbnRlcmZhY2UgPSBtTW9ja1NlcnZpY2VJbnRlcmZhY2U7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5hZGRDbGllbnQoYW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCkpKS5hbmRSZXR1cm4odHJ1ZSk7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5nZXRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoKSkuYW5kUmV0dXJuKGV4cGVjdGVkU2VydmljZXMpOworICAgICAgICByZXBsYXkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbWFuYWdlciA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihtQ29udGV4dCwgbW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgICAgICBMaXN0PFNlcnZpY2VJbmZvPiByZWNlaXZlZFNlcnZpY2VzID0gbWFuYWdlci5nZXRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoKTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQgKGxpc3QgZXF1YWxzKCkgY29tcGFyZXMgaXQgY29udGVudHMgYXMgd2VsbCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBbGwgZXhwZWN0ZWQgc2VydmljZXMgbXVzdCBiZSByZXR1cm5lZCIsIHJlY2VpdmVkU2VydmljZXMsIGV4cGVjdGVkU2VydmljZXMpOworCisgICAgICAgIC8vIHZlcmlmeSB0aGUgbW9jayBzZXJ2aWNlIHdhcyBwcm9wZXJseSBjYWxsZWQKKyAgICAgICAgdmVyaWZ5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcnJ1cHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UgYmVoYXZpb3IKKyAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1vY2tTZXJ2aWNlSW50ZXJmYWNlID0gbU1vY2tTZXJ2aWNlSW50ZXJmYWNlOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuYWRkQ2xpZW50KGFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpKSkuYW5kUmV0dXJuKHRydWUpOworICAgICAgICBtb2NrU2VydmljZUludGVyZmFjZS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgcmVwbGF5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIobUNvbnRleHQsIG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICAgICAgbWFuYWdlci5pbnRlcnJ1cHQoKTsKKworICAgICAgICAvLyB2ZXJpZnkgdGhlIG1vY2sgc2VydmljZSB3YXMgcHJvcGVybHkgY2FsbGVkCisgICAgICAgIHZlcmlmeShtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc0VuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UgYmVoYXZpb3IKKyAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1vY2tTZXJ2aWNlSW50ZXJmYWNlID0gbU1vY2tTZXJ2aWNlSW50ZXJmYWNlOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuYWRkQ2xpZW50KGFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpKSkuYW5kUmV0dXJuKHRydWUpOworICAgICAgICByZXBsYXkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbWFuYWdlciA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihtQ29udGV4dCwgbW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgICAgICBib29sZWFuIGlzRW5hYmxlZFNlcnZpY2VFbmFibGVkID0gbWFuYWdlci5pc0VuYWJsZWQoKTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTXVzdCBiZSBlbmFibGVkIHNpbmNlIHRoZSBtb2NrIHNlcnZpY2UgaXMgZW5hYmxlZCIsIGlzRW5hYmxlZFNlcnZpY2VFbmFibGVkKTsKKworICAgICAgICAvLyBkaXNhYmxlIGFjY2Vzc2liaWxpdHkKKyAgICAgICAgbWFuYWdlci5nZXRDbGllbnQoKS5zZXRFbmFibGVkKGZhbHNlKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYXN5bmNocm9ub3VzIElCaW5kZXIgY2FsbCB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBib29sZWFuIGlzRW5hYmxlZFNlcnZjaWVEaXNhYmxlZCA9IG1hbmFnZXIuaXNFbmFibGVkKCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydEZhbHNlKCJNdXN0IGJlIGRpc2FibGVkIHNpbmNlIHRoZSBtb2NrIHNlcnZpY2UgaXMgZGlzYWJsZWQiLAorICAgICAgICAgICAgICAgIGlzRW5hYmxlZFNlcnZjaWVEaXNhYmxlZCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoZSBtb2NrIHNlcnZpY2Ugd2FzIHByb3Blcmx5IGNhbGxlZAorICAgICAgICB2ZXJpZnkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfQWNjZXNzaWJpbGl0eUVuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY3JlYXRlIGFuIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZSBiZWhhdmlvcgorICAgICAgICBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbW9ja1NlcnZpY2VJbnRlcmZhY2UgPSBtTW9ja1NlcnZpY2VJbnRlcmZhY2U7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5hZGRDbGllbnQoYW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCkpKS5hbmRSZXR1cm4odHJ1ZSk7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGVxQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCkpKQorICAgICAgICAgICAgICAgIC5hbmRSZXR1cm4odHJ1ZSk7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGVxQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCkpKQorICAgICAgICAgICAgICAgIC5hbmRSZXR1cm4oZmFsc2UpOworICAgICAgICByZXBsYXkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QgKG1hbmFnZXIgYW5kIHNlcnZpY2UgaW4gZGlmZmVyZW50IHByb2Nlc3NlcykKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbWFuYWdlciA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihtQ29udGV4dCwgbW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgICAgICBtYW5hZ2VyLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IG5leHRFdmVudERpZmZlcmVudFByb2Nlc3NlcyA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgYXNzZXJ0U2FtZSgiVGhlIG1hbmFnZXIgYW5kIHRoZSBzZXJ2aWNlIGFyZSBpbiBkaWZmZXJlbnQgcHJvY2Vzc2VzLCBzbyB0aGUgZXZlbnQgbXVzdCBiZSAiICsKKyAgICAgICAgICAgICAgICAicmVjeWNsZWQiLCBzZW50RXZlbnQsIG5leHRFdmVudERpZmZlcmVudFByb2Nlc3Nlcyk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdCAobWFuYWdlciBhbmQgc2VydmljZSBpbiB0aGUgc2FtZSBwcm9jZXNzKQorICAgICAgICBtYW5hZ2VyLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IG5leHRFdmVudFNhbWVQcm9jZXNzID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBhc3NlcnROb3RTYW1lKCJUaGUgbWFuYWdlciBhbmQgdGhlIHNlcnZpY2UgYXJlIGluIHRoZSBzYW1lIHByb2Nlc3MsIHNvIHRoZSBldmVudCBtdXN0IG5vdCIgKworICAgICAgICAgICAgICAgICJiZSByZWN5Y2xlZCIsIHNlbnRFdmVudCwgbmV4dEV2ZW50U2FtZVByb2Nlc3MpOworCisgICAgICAgIC8vIHZlcmlmeSB0aGUgbW9jayBzZXJ2aWNlIHdhcyBwcm9wZXJseSBjYWxsZWQKKyAgICAgICAgdmVyaWZ5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X0FjY2Vzc2liaWxpdHlEaXNhYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBjcmVhdGUgYW4gZXZlbnQgdG8gYmUgZGlzcGF0Y2hlZAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlIGJlaGF2aW9yCisgICAgICAgIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBtb2NrU2VydmljZUludGVyZmFjZSA9IG1Nb2NrU2VydmljZUludGVyZmFjZTsKKyAgICAgICAgZXhwZWN0KG1vY2tTZXJ2aWNlSW50ZXJmYWNlLmFkZENsaWVudChhbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKSkpLmFuZFJldHVybihmYWxzZSk7CisgICAgICAgIHJlcGxheShtb2NrU2VydmljZUludGVyZmFjZSk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdCAoYWNjZXNzaWJpbGl0eSBkaXNhYmxlZCkKKyAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbWFuYWdlciA9IG5ldyBBY2Nlc3NpYmlsaXR5TWFuYWdlcihtQ29udGV4dCwgbW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWFuYWdlci5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgICAgICBmYWlsKCJObyBhY2Nlc3NpYmlsaXR5IGV2ZW50cyBhcmUgc2VudCBpZiBhY2Nlc3NpYmlsaXR5IGlzIGRpc2FibGVkIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UpIHsKKyAgICAgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBY2Nlc3NpYmlsaXR5IG9mZi4gRGlkIHlvdSBmb3JnZXQgdG8gY2hlY2sgdGhhdD8iLCBpc2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZlcmlmeSB0aGUgbW9jayBzZXJ2aWNlIHdhcyBwcm9wZXJseSBjYWxsZWQKKyAgICAgICAgdmVyaWZ5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIGFuIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnR9IHBhc3NlZCBhcyBhIG1ldGhvZCBhcmd1bWVudAorICAgICAqIG1hdGNoZXMgZXhwZWN0YXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIG1hdGNoZWQgVGhlIGV2ZW50IHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBleHBlY3RhdGlvbnMgYXJlIG1hdGNoZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQWNjZXNzaWJpbGl0eUV2ZW50IGVxQWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCBtYXRjaGVkKSB7CisgICAgICAgIHJlcG9ydE1hdGNoZXIobmV3IEFjY2Vzc2liaWxpdHlFdmVudE1hdGhlcihtYXRjaGVkKSk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgYW4ge0BsaW5rIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudH0gcGFzc2VkIGFzIGEgbWV0aG9kIGFyZ3VtZW50CisgICAgICogbWF0Y2hlcyBleHBlY3RhdGlvbnMgd2hpY2ggaW4gdGhpcyBjYXNlIGFyZSB0aGF0IGFueSBpbnN0YW5jZSBpcyBhY2NlcHRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpIHsKKyAgICAgICAgcmVwb3J0TWF0Y2hlcihuZXcgQW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50TWF0aGVyKCkpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXRjaGVyIGZvciB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50fXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQWNjZXNzaWJpbGl0eUV2ZW50TWF0aGVyIGltcGxlbWVudHMgSUFyZ3VtZW50TWF0Y2hlciB7CisgICAgICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eUV2ZW50IG1FeHBlY3RlZEV2ZW50OworCisgICAgICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5RXZlbnRNYXRoZXIoQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQpIHsKKyAgICAgICAgICAgIG1FeHBlY3RlZEV2ZW50ID0gZXhwZWN0ZWRFdmVudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoT2JqZWN0IG1hdGNoZWQpIHsKKyAgICAgICAgICAgIGlmICghKG1hdGNoZWQgaW5zdGFuY2VvZiBBY2Nlc3NpYmlsaXR5RXZlbnQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHJlY2VpdmVkRXZlbnQgPSAoQWNjZXNzaWJpbGl0eUV2ZW50KSBtYXRjaGVkOworICAgICAgICAgICAgcmV0dXJuIG1FeHBlY3RlZEV2ZW50LmdldEV2ZW50VHlwZSgpID09IHJlY2VpdmVkRXZlbnQuZ2V0RXZlbnRUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJzZW5kQWNjZXNzaWJpbGl0eUV2ZW50KCkiKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiB3aXRoIGV2ZW50IHR5cGUgXCIiKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQobUV4cGVjdGVkRXZlbnQuZ2V0RXZlbnRUeXBlKCkpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1hdGNoZXIgZm9yIHtAbGluayBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnR9cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnRNYXRoZXIgaW1wbGVtZW50cyBJQXJndW1lbnRNYXRjaGVyIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhPYmplY3QgbWF0Y2hlZCkgeworICAgICAgICAgICAgaWYgKCEobWF0Y2hlZCBpbnN0YW5jZW9mIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRvKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoImFkZENsaWVudCgpIHdpdGggYW55IElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0NvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQ291bnRyeURldGVjdG9yU2VydmljZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2ExNTg1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0NvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0LmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uSUNvdW50cnlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgQ291bnRyeURldGVjdG9yU2VydmljZVRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgY2xhc3MgQ291bnRyeUxpc3RlbmVyVGVzdGVyIGV4dGVuZHMgSUNvdW50cnlMaXN0ZW5lci5TdHViIHsKKyAgICAgICAgcHJpdmF0ZSBDb3VudHJ5IG1Db3VudHJ5OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNvdW50cnlEZXRlY3RlZChDb3VudHJ5IGNvdW50cnkpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgbUNvdW50cnkgPSBjb3VudHJ5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvdW50cnkgZ2V0Q291bnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ291bnRyeTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTm90aWZpZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvdW50cnkgIT0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQ291bnRyeURldGVjdG9yU2VydmljZVRlc3RlciBleHRlbmRzIENvdW50cnlEZXRlY3RvclNlcnZpY2UgeworCisgICAgICAgIHByaXZhdGUgQ291bnRyeUxpc3RlbmVyIG1MaXN0ZW5lcjsKKworICAgICAgICBwdWJsaWMgQ291bnRyeURldGVjdG9yU2VydmljZVRlc3RlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeVJlY2VpdmVycyhDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgICAgIHN1cGVyLm5vdGlmeVJlY2VpdmVycyhjb3VudHJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDb3VudHJ5TGlzdGVuZXIoZmluYWwgQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTGlzdGVuZXJTZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxpc3RlbmVyICE9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTGlzdGVuZXIoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgQ291bnRyeURldGVjdG9yU2VydmljZVRlc3RlciBzZXJ2aWNlVGVzdGVyID0gbmV3IENvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0ZXIoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5zeXN0ZW1SZWFkeSgpOworICAgICAgICB3YWl0Rm9yU3lzdGVtUmVhZHkoc2VydmljZVRlc3Rlcik7CisgICAgICAgIENvdW50cnlMaXN0ZW5lclRlc3RlciBsaXN0ZW5lclRlc3RlciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJUZXN0ZXIoKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5hZGRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXJUZXN0ZXIpOworICAgICAgICBhc3NlcnRUcnVlKHNlcnZpY2VUZXN0ZXIuaXNMaXN0ZW5lclNldCgpKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5yZW1vdmVDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXJUZXN0ZXIpOworICAgICAgICBhc3NlcnRGYWxzZShzZXJ2aWNlVGVzdGVyLmlzTGlzdGVuZXJTZXQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vdGlmeUxpc3RlbmVycygpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlVGVzdGVyIHNlcnZpY2VUZXN0ZXIgPSBuZXcgQ291bnRyeURldGVjdG9yU2VydmljZVRlc3RlcihnZXRDb250ZXh0KCkpOworICAgICAgICBDb3VudHJ5TGlzdGVuZXJUZXN0ZXIgbGlzdGVuZXJUZXN0ZXJBID0gbmV3IENvdW50cnlMaXN0ZW5lclRlc3RlcigpOworICAgICAgICBDb3VudHJ5TGlzdGVuZXJUZXN0ZXIgbGlzdGVuZXJUZXN0ZXJCID0gbmV3IENvdW50cnlMaXN0ZW5lclRlc3RlcigpOworICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBuZXcgQ291bnRyeSgiVVMiLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX05FVFdPUkspOworICAgICAgICBzZXJ2aWNlVGVzdGVyLnN5c3RlbVJlYWR5KCk7CisgICAgICAgIHdhaXRGb3JTeXN0ZW1SZWFkeShzZXJ2aWNlVGVzdGVyKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5hZGRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXJUZXN0ZXJBKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5hZGRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXJUZXN0ZXJCKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5ub3RpZnlSZWNlaXZlcnMoY291bnRyeSk7CisgICAgICAgIGFzc2VydFRydWUoc2VydmljZVRlc3Rlci5pc0xpc3RlbmVyU2V0KCkpOworICAgICAgICBhc3NlcnRUcnVlKGxpc3RlbmVyVGVzdGVyQS5pc05vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGxpc3RlbmVyVGVzdGVyQi5pc05vdGlmaWVkKCkpOworICAgICAgICBzZXJ2aWNlVGVzdGVyLnJlbW92ZUNvdW50cnlMaXN0ZW5lcihsaXN0ZW5lclRlc3RlckEpOworICAgICAgICBzZXJ2aWNlVGVzdGVyLnJlbW92ZUNvdW50cnlMaXN0ZW5lcihsaXN0ZW5lclRlc3RlckIpOworICAgICAgICBhc3NlcnRGYWxzZShzZXJ2aWNlVGVzdGVyLmlzTGlzdGVuZXJTZXQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JTeXN0ZW1SZWFkeShDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIHNlcnZpY2UpIHsKKyAgICAgICAgaW50IGNvdW50ID0gNTsKKyAgICAgICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZXJ2aWNlLmlzU3lzdGVtUmVhZHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiV2FpdCBTeXN0ZW0gUmVhZHkgdGltZW91dCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9Nb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9Nb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmM5Yjg2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL01vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUXVldWU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgbW9jayB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2V9cy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBleHRlbmRzIEFjY2Vzc2liaWxpdHlTZXJ2aWNlIHsKKworICAgIC8qKgorICAgICAqIFRoZSBldmVudCB0aGlzIHNlcnZpY2UgZXhwZWN0cyB0byByZWNlaXZlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgUXVldWU8QWNjZXNzaWJpbGl0eUV2ZW50PiBtRXhwZWN0ZWRFdmVudHMgPSBuZXcgTGlua2VkTGlzdDxBY2Nlc3NpYmlsaXR5RXZlbnQ+KCk7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcnJ1cHRpb24gY2FsbCB0aGlzIHNlcnZpY2UgZXhwZWN0cyB0byByZWNlaXZlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtRXhwZWN0ZWRJbnRlcnJ1cHQ7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGlmIHRoZSBtb2NrIGlzIGN1cnJlbnRseSByZXBsYXlpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1SZXBsYXlpbmc7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGlmIHRoZSBzeXN0ZW0gaXMgYm91bmQgYXMgYSBjbGllbnQgdG8gdGhpcyBzZXJ2aWNlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNTeXN0ZW1Cb3VuZEFzQ2xpZW50OworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvfSBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0CisgICAgICogdmFsdWVzLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgZGVmYXVsdCBpbmZvLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGNyZWF0ZURlZmF1bHRJbmZvKCkgeworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gZGVmYXVsdEluZm8gPSBuZXcgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvKCk7CisgICAgICAgIGRlZmF1bHRJbmZvLmV2ZW50VHlwZXMgPSBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX0NMSUNLRUQ7CisgICAgICAgIGRlZmF1bHRJbmZvLmZlZWRiYWNrVHlwZSA9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5GRUVEQkFDS19BVURJQkxFOworICAgICAgICBkZWZhdWx0SW5mby5mbGFncyA9IDA7CisgICAgICAgIGRlZmF1bHRJbmZvLm5vdGlmaWNhdGlvblRpbWVvdXQgPSAwOworICAgICAgICBkZWZhdWx0SW5mby5wYWNrYWdlTmFtZXMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgImZvby5iYXIuYmF6IgorICAgICAgICB9OworCisgICAgICAgIHJldHVybiBkZWZhdWx0SW5mbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydHMgcmVwbGF5aW5nIHRoZSBtb2NrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlcGxheSgpIHsKKyAgICAgICAgbVJlcGxheWluZyA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZpZXMgaWYgYWxsIGV4cGVjdGVkIHNlcnZpY2UgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKKyAgICAgICAgaWYgKCFtUmVwbGF5aW5nKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJEaWQgeW91IGZvcmdldCB0byBjYWxsIHJlcGxheSgpIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUV4cGVjdGVkSW50ZXJydXB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBjYWxsIHRvICNpbnRlcnJ1cHQoKSBub3QgcmVjZWl2ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1FeHBlY3RlZEV2ZW50cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIGEgY2FsbCB0byBvbkFjY2Vzc2liaWxpdHlFdmVudCgpIGZvciAiCisgICAgICAgICAgICAgICAgICAgICsgImV2ZW50cyBcIiIgKyBtRXhwZWN0ZWRFdmVudHMgKyAiXCIgbm90IHJlY2VpdmVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhpcyBpbnN0YW5jZSBzbyBpdCBjYW4gYmUgcmV1c2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICBtRXhwZWN0ZWRFdmVudHMuY2xlYXIoKTsKKyAgICAgICAgbUV4cGVjdGVkSW50ZXJydXB0ID0gZmFsc2U7CisgICAgICAgIG1SZXBsYXlpbmcgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGFuIGV4cGVjdGVkIGNhbGwgdG8KKyAgICAgKiB7QGxpbmsgI29uQWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCl9IHdpdGggZ2l2ZW4gZXZlbnQgYXMKKyAgICAgKiBhcmd1bWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHBlY3RlZEV2ZW50IFRoZSBleHBlY3RlZCBldmVudCBhcmd1bWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleHBlY3RFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgZXhwZWN0ZWRFdmVudCkgeworICAgICAgICBtRXhwZWN0ZWRFdmVudHMuYWRkKGV4cGVjdGVkRXZlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYW4gZXhwZWN0ZWQgY2FsbCBvZiB7QGxpbmsgI29uSW50ZXJydXB0KCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4cGVjdEludGVycnVwdCgpIHsKKyAgICAgICAgbUV4cGVjdGVkSW50ZXJydXB0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgcmVjZWl2ZWRFdmVudCkgeworICAgICAgICBpZiAoIW1SZXBsYXlpbmcpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRXhwZWN0ZWRFdmVudHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGV2ZW50OiAiICsgcmVjZWl2ZWRFdmVudCk7CisgICAgICAgIH0KKworICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXhwZWN0ZWRFdmVudCA9IG1FeHBlY3RlZEV2ZW50cy5wb2xsKCk7CisgICAgICAgIGFzc2VydEVxdWFsc0FjY2Vzc2libGl0eUV2ZW50KGV4cGVjdGVkRXZlbnQsIHJlY2VpdmVkRXZlbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uSW50ZXJydXB0KCkgeworICAgICAgICBpZiAoIW1SZXBsYXlpbmcpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUV4cGVjdGVkSW50ZXJydXB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGNhbGwgdG8gb25JbnRlcnJ1cHQoKSIpOworICAgICAgICB9CisKKyAgICAgICAgbUV4cGVjdGVkSW50ZXJydXB0ID0gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKCkgeworICAgICAgICBtSXNTeXN0ZW1Cb3VuZEFzQ2xpZW50ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblVuYmluZChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIG1Jc1N5c3RlbUJvdW5kQXNDbGllbnQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgaWYgdGhlIHN5c3RlbSBpcyBib3VuZCBhcyBjbGllbnQgdG8gdGhpcyBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzeXN0ZW0gaXMgYm91bmQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N5c3RlbUJvdW5kQXNDbGllbnQoKSB7CisgICAgICAgIHJldHVybiBtSXNTeXN0ZW1Cb3VuZEFzQ2xpZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmVzIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSA8Y29kZT5leHBlY3RlZEV2ZW50PC9jb2RlPiBhbmQgdGhlCisgICAgICogPGNvZGU+cmVjZXZpZWRFdmVudDwvY29kZT4gdG8gdmVyaWZ5IHRoYXQgdGhlIHJlY2VpdmVkIGV2ZW50IGlzIHRoZSBvbmUKKyAgICAgKiB0aGF0IGlzIGV4cGVjdGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFcXVhbHNBY2Nlc3NpYmxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgZXhwZWN0ZWRFdmVudCwKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCByZWNlaXZlZEV2ZW50KSB7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiYWRkZWRDb3VudCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRBZGRlZENvdW50KCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5nZXRBZGRlZENvdW50KCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImJlZm9yZVRleHQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuZ2V0QmVmb3JlVGV4dCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0QmVmb3JlVGV4dCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJjaGVja2VkIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmlzQ2hlY2tlZCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuaXNDaGVja2VkKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImNsYXNzTmFtZSBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRDbGFzc05hbWUoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldENsYXNzTmFtZSgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJjb250ZW50RGVzY3JpcHRpb24gaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQKKyAgICAgICAgICAgICAgICAuZ2V0Q29udGVudERlc2NyaXB0aW9uKCksIHJlY2VpdmVkRXZlbnQuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImN1cnJlbnRJdGVtSW5kZXggaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQKKyAgICAgICAgICAgICAgICAuZ2V0Q3VycmVudEl0ZW1JbmRleCgpLCByZWNlaXZlZEV2ZW50LmdldEN1cnJlbnRJdGVtSW5kZXgoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiZW5hYmxlZCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5pc0VuYWJsZWQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmlzRW5hYmxlZCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJldmVudFR5cGUgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuZ2V0RXZlbnRUeXBlKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5nZXRFdmVudFR5cGUoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiZnJvbUluZGV4IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldEZyb21JbmRleCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0RnJvbUluZGV4KCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImZ1bGxTY3JlZW4gaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuaXNGdWxsU2NyZWVuKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5pc0Z1bGxTY3JlZW4oKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiaXRlbUNvdW50IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldEl0ZW1Db3VudCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0SXRlbUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHNOb3RpZmljYXRpb25Bc1BhcmNlbGFibGVEYXRhKGV4cGVjdGVkRXZlbnQsIHJlY2VpdmVkRXZlbnQpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoInBhc3N3b3JkIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmlzUGFzc3dvcmQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmlzUGFzc3dvcmQoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygicmVtb3ZlZENvdW50IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldFJlbW92ZWRDb3VudCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0UmVtb3ZlZENvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHNUZXh0KGV4cGVjdGVkRXZlbnQsIHJlY2VpdmVkRXZlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmVzIHRoZSB7QGxpbmsgYW5kcm9pZC5vcy5QYXJjZWxhYmxlfSBkYXRhIG9mIHRoZQorICAgICAqIDxjb2RlPmV4cGVjdGVkRXZlbnQ8L2NvZGU+IGFuZCA8Y29kZT5yZWNlaXZlZEV2ZW50PC9jb2RlPiB0byB2ZXJpZnkgdGhhdAorICAgICAqIHRoZSByZWNlaXZlZCBldmVudCBpcyB0aGUgb25lIHRoYXQgaXMgZXhwZWN0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEVxdWFsc05vdGlmaWNhdGlvbkFzUGFyY2VsYWJsZURhdGEoQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQsCisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgcmVjZWl2ZWRFdmVudCkgeworICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJwYXJjZWxhYmxlRGF0YSBoYXMgaW5jb3JyZWN0IHZhbHVlIjsKKyAgICAgICAgTWVzc2FnZSBleHBlY3RlZE1lc3NhZ2UgPSAoTWVzc2FnZSkgZXhwZWN0ZWRFdmVudC5nZXRQYXJjZWxhYmxlRGF0YSgpOworICAgICAgICBNZXNzYWdlIHJlY2VpdmVkTWVzc2FnZSA9IChNZXNzYWdlKSByZWNlaXZlZEV2ZW50LmdldFBhcmNlbGFibGVEYXRhKCk7CisKKyAgICAgICAgaWYgKGV4cGVjdGVkTWVzc2FnZSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAocmVjZWl2ZWRNZXNzYWdlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKG1lc3NhZ2UsIHJlY2VpdmVkTWVzc2FnZSk7CisKKyAgICAgICAgLy8gd2UgZG8gYSB2ZXJ5IHNpbXBsZSBzYW5pdHkgY2hlY2sgc2luY2Ugd2UgZG8gbm90IHRlc3QgTWVzc2FnZQorICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWRNZXNzYWdlLndoYXQsIHJlY2VpdmVkTWVzc2FnZS53aGF0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0aGUgdGV4dCBvZiB0aGUgPGNvZGU+ZXhwZWN0ZWRFdmVudDwvY29kZT4gYW5kCisgICAgICogPGNvZGU+cmVjZWl2ZWRFdmVudDwvY29kZT4gYnkgY29tcGFyaW5nIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlCisgICAgICogY29ycmVzcG9uZGluZyB7QGxpbmsgQ2hhclNlcXVlbmNlfXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEVxdWFsc1RleHQoQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQsCisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgcmVjZWl2ZWRFdmVudCkgeworICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJ0ZXh0IGhhcyBpbmNvcnJlY3QgdmFsdWUiOworICAgICAgICBMaXN0PENoYXJTZXF1ZW5jZT4gZXhwZWN0ZWRUZXh0ID0gZXhwZWN0ZWRFdmVudC5nZXRUZXh0KCk7CisgICAgICAgIExpc3Q8Q2hhclNlcXVlbmNlPiByZWNlaXZlZFRleHQgPSByZWNlaXZlZEV2ZW50LmdldFRleHQoKTsKKworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWRUZXh0LnNpemUoKSwgcmVjZWl2ZWRUZXh0LnNpemUoKSk7CisKKyAgICAgICAgSXRlcmF0b3I8Q2hhclNlcXVlbmNlPiBleHBlY3RlZFRleHRJdGVyYXRvciA9IGV4cGVjdGVkVGV4dC5pdGVyYXRvcigpOworICAgICAgICBJdGVyYXRvcjxDaGFyU2VxdWVuY2U+IHJlY2VpdmVkVGV4dEl0ZXJhdG9yID0gcmVjZWl2ZWRUZXh0Lml0ZXJhdG9yKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFRleHQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIC8vIGNvbXBhcmUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbgorICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkVGV4dEl0ZXJhdG9yLm5leHQoKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICByZWNlaXZlZFRleHRJdGVyYXRvci5uZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvclRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OTY2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIubG9jYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnk7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIENvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3JUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIGNsYXNzIFRlc3RDb3VudHJ5RGV0ZWN0b3IgZXh0ZW5kcyBDb21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yIHsKKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09VTlRSWV9JU08gPSAidXMiOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtTG9jYXRpb25CYXNlZERldGVjdG9yU3RvcHBlZDsKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbU5vdGlmaWVkOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbGlzdGVuZXJBZGRlZCA9IGZhbHNlOworCisgICAgICAgIHByaXZhdGUgQ291bnRyeSBtTm90aWZpZWRDb3VudHJ5OworICAgICAgICBwdWJsaWMgVGVzdENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIHN1cGVyKGdldENvbnRleHQoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlMb2NhdGlvbkJhc2VkTGlzdGVuZXIoQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgICAgICBtTm90aWZpZWQgPSB0cnVlOworICAgICAgICAgICAgbU5vdGlmaWVkQ291bnRyeSA9IGNvdW50cnk7CisgICAgICAgICAgICBtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rvci5ub3RpZnlMaXN0ZW5lcihjb3VudHJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IgIT0gbnVsbCAmJiBtTG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IgPT0gbnVsbCAmJiBtTG9jYXRpb25CYXNlZERldGVjdG9yU3RvcHBlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGxvY2F0aW9uUmVmcmVzaFN0YXJ0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvY2F0aW9uUmVmcmVzaFRpbWVyICE9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBsb2NhdGlvblJlZnJlc2hDYW5jZWxsZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvY2F0aW9uUmVmcmVzaFRpbWVyID09IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIENvdW50cnlEZXRlY3RvckJhc2UgY3JlYXRlTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ291bnRyeURldGVjdG9yQmFzZShtQ29udGV4dCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBDb3VudHJ5IGRldGVjdENvdW50cnkoKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0TmV0d29ya0Jhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldExhc3RLbm93bkxvY2F0aW9uQmFzZWRDb3VudHJ5KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Ob3RpZmllZENvdW50cnk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0U2ltQmFzZWRDb3VudHJ5KCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0TG9jYWxlQ291bnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1bkFmdGVyRGV0ZWN0aW9uQXN5bmMoZmluYWwgQ291bnRyeSBjb3VudHJ5LCBmaW5hbCBDb3VudHJ5IGRldGVjdGVkQ291bnRyeSwKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIG5vdGlmeUNoYW5nZSwgZmluYWwgYm9vbGVhbiBzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24pIHsKKyAgICAgICAgICAgIHJ1bkFmdGVyRGV0ZWN0aW9uKGNvdW50cnksIGRldGVjdGVkQ291bnRyeSwgbm90aWZ5Q2hhbmdlLCBzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24pOworICAgICAgICB9OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FpcnBsYW5lTW9kZU9mZigpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBhZGRQaG9uZVN0YXRlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBsaXN0ZW5lckFkZGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUGhvbmVTdGF0ZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgbGlzdGVuZXJBZGRlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzR2VvQ29kZXJJbXBsZW1lbnRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQaG9uZVN0YXRlTGlzdGVuZXJBZGRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lckFkZGVkOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBDb3VudHJ5TGlzdGVuZXJJbXBsIGltcGxlbWVudHMgQ291bnRyeUxpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Ob3RpZmllZDsKKyAgICAgICAgcHJpdmF0ZSBDb3VudHJ5IG1Db3VudHJ5OworCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ291bnRyeURldGVjdGVkKENvdW50cnkgY291bnRyeSkgeworICAgICAgICAgICAgbU5vdGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Db3VudHJ5ID0gY291bnRyeTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG5vdGlmaWVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Ob3RpZmllZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb3VudHJ5IGdldENvdW50cnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvdW50cnk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0ZWN0TmV0d29ya0Jhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgZmluYWwgQ291bnRyeSByZXN1bHRDb3VudHJ5ID0gbmV3IENvdW50cnkoCisgICAgICAgICAgICAgICAgVGVzdENvdW50cnlEZXRlY3Rvci5DT1VOVFJZX0lTTywgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9ORVRXT1JLKTsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBjb3VudHJ5RGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0TmV0d29ya0Jhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Q291bnRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBjb3VudHJ5RGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGNvdW50cnksIHJlc3VsdENvdW50cnkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25SZWZyZXNoU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnN0b3AoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0ZWN0TG9jYXRpb25CYXNlZENvdW50cnkoKSB7CisgICAgICAgIGZpbmFsIENvdW50cnkgcmVzdWx0Q291bnRyeSA9IG5ldyBDb3VudHJ5KAorICAgICAgICAgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IuQ09VTlRSWV9JU08sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfU0lNKTsKKyAgICAgICAgZmluYWwgQ291bnRyeSBsb2NhdGlvbkJhc2VkQ291bnRyeSA9IG5ldyBDb3VudHJ5KAorICAgICAgICAgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IuQ09VTlRSWV9JU08sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTE9DQVRJT04pOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGNvdW50cnlEZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRTaW1CYXNlZENvdW50cnkoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENvdW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gY291bnRyeURldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShjb3VudHJ5LCByZXN1bHRDb3VudHJ5KSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5ub3RpZnlMb2NhdGlvbkJhc2VkTGlzdGVuZXIobG9jYXRpb25CYXNlZENvdW50cnkpOworICAgICAgICBhc3NlcnRUcnVlKGxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGxpc3RlbmVyLmdldENvdW50cnkoKSwgbG9jYXRpb25CYXNlZENvdW50cnkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RvcHBlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25SZWZyZXNoU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnN0b3AoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25SZWZyZXNoQ2FuY2VsbGVkKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbGVCYXNlZENvdW50cnkoKSB7CisgICAgICAgIGZpbmFsIENvdW50cnkgcmVzdWx0Q291bnRyeSA9IG5ldyBDb3VudHJ5KAorICAgICAgICAgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IuQ09VTlRSWV9JU08sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTE9DQUxFKTsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBjb3VudHJ5RGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0TG9jYWxlQ291bnRyeSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Q291bnRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBjb3VudHJ5RGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGNvdW50cnksIHJlc3VsdENvdW50cnkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaFN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zdG9wKCk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaENhbmNlbGxlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcHBpbmdEZXRlY3RvcigpIHsKKyAgICAgICAgLy8gVGVzdCBzdG9wcGluZyBkZXRlY3RvciB3aGVuIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3Igd2FzIHN0YXJ0ZWQKKyAgICAgICAgZmluYWwgQ291bnRyeSByZXN1bHRDb3VudHJ5ID0gbmV3IENvdW50cnkoCisgICAgICAgICAgICAgICAgVGVzdENvdW50cnlEZXRlY3Rvci5DT1VOVFJZX0lTTywgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9TSU0pOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGNvdW50cnlEZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRTaW1CYXNlZENvdW50cnkoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENvdW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gY291bnRyeURldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShjb3VudHJ5LCByZXN1bHRDb3VudHJ5KSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zdG9wKCk7CisgICAgICAgIC8vIFRoZSBMb2NhdGlvbkJhc2VkRGV0ZWN0b3Igc2hvdWxkIGJlIHN0b3BwZWQuCisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQoKSk7CisgICAgICAgIC8vIFRoZSBsb2NhdGlvbiByZWZyZXNoIHNob3VsZCBub3QgcnVubmluZy4KKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25SZWZyZXNoQ2FuY2VsbGVkKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhdGlvbkJhc2VkQ291bnRyeU5vdEZvdW5kKCkgeworICAgICAgICBmaW5hbCBDb3VudHJ5IHJlc3VsdENvdW50cnkgPSBuZXcgQ291bnRyeSgKKyAgICAgICAgICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yLkNPVU5UUllfSVNPLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX1NJTSk7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgY291bnRyeURldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldFNpbUJhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Q291bnRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBjb3VudHJ5RGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGNvdW50cnksIHJlc3VsdENvdW50cnkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLm5vdGlmeUxvY2F0aW9uQmFzZWRMaXN0ZW5lcihudWxsKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoc2FtZUNvdW50cnkobGlzdGVuZXIuZ2V0Q291bnRyeSgpLCBudWxsKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaFN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zdG9wKCk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaENhbmNlbGxlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Db3VudHJ5Rm91bmQoKSB7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgY291bnRyeURldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoKTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBDb3VudHJ5IGNvdW50cnkgPSBjb3VudHJ5RGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGNvdW50cnksIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLm5vdGlmeUxvY2F0aW9uQmFzZWRMaXN0ZW5lcihudWxsKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoc2FtZUNvdW50cnkobGlzdGVuZXIuZ2V0Q291bnRyeSgpLCBudWxsKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaFN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zdG9wKCk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaENhbmNlbGxlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTGlzdGVuZXIoKSB7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgY291bnRyeURldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoKTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5pc1Bob25lU3RhdGVMaXN0ZW5lckFkZGVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKG51bGwpOworICAgICAgICBhc3NlcnRGYWxzZShjb3VudHJ5RGV0ZWN0b3IuaXNQaG9uZVN0YXRlTGlzdGVuZXJBZGRlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RvcHBlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2VvY29kZXJOb3RJbXBsZW1lbnRlZCgpIHsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBjb3VudHJ5RGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNHZW9Db2RlckltcGxlbWVudGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5pc1Bob25lU3RhdGVMaXN0ZW5lckFkZGVkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihudWxsKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY291bnRyeURldGVjdG9yLmlzUGhvbmVTdGF0ZUxpc3RlbmVyQWRkZWQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNhbWVDb3VudHJ5KENvdW50cnkgY291bnRyeTEsIENvdW50cnkgY291bnRyeTIpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50cnkxID09IG51bGwgJiYgY291bnRyeTIgPT0gbnVsbCB8fCBjb3VudHJ5MSAhPSBudWxsICYmIGNvdW50cnkyICE9IG51bGwgJiYKKyAgICAgICAgY291bnRyeTEuZ2V0Q291bnRyeUlzbygpLmVxdWFsc0lnbm9yZUNhc2UoY291bnRyeTIuZ2V0Q291bnRyeUlzbygpKSAmJgorICAgICAgICBjb3VudHJ5MS5nZXRTb3VyY2UoKSA9PSBjb3VudHJ5Mi5nZXRTb3VyY2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvclRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcxZThlMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDMyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmxvY2F0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXI7CisKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnk7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3JUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIGNsYXNzIFRlc3RDb3VudHJ5RGV0ZWN0b3IgZXh0ZW5kcyBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9UQUxfUFJPVklERVJTID0gMjsKKyAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBjb3VudHJ5Rm91bmRMb2NrZXIgPSBuZXcgT2JqZWN0KCk7CisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIG5vdGlmeUNvdW50cnkgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMb2NhdGlvbiBtTG9jYXRpb247CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Db3VudHJ5OworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgbVF1ZXJ5TG9jYXRpb25UaW1lb3V0OworICAgICAgICBwcml2YXRlIExpc3Q8TG9jYXRpb25MaXN0ZW5lcj4gbUxpc3RlbmVyczsKKworICAgICAgICBwdWJsaWMgVGVzdENvdW50cnlEZXRlY3RvcihTdHJpbmcgY291bnRyeSwgU3RyaW5nIHByb3ZpZGVyKSB7CisgICAgICAgICAgICB0aGlzKGNvdW50cnksIHByb3ZpZGVyLCAxMDAwICogNjAgKiA1KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUZXN0Q291bnRyeURldGVjdG9yKFN0cmluZyBjb3VudHJ5LCBTdHJpbmcgcHJvdmlkZXIsIGxvbmcgcXVlcnlMb2NhdGlvblRpbWVvdXQpIHsKKyAgICAgICAgICAgIHN1cGVyKGdldENvbnRleHQoKSk7CisgICAgICAgICAgICBtQ291bnRyeSA9IGNvdW50cnk7CisgICAgICAgICAgICBtTG9jYXRpb24gPSBuZXcgTG9jYXRpb24ocHJvdmlkZXIpOworICAgICAgICAgICAgbVF1ZXJ5TG9jYXRpb25UaW1lb3V0ID0gcXVlcnlMb2NhdGlvblRpbWVvdXQ7CisgICAgICAgICAgICBtTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxMb2NhdGlvbkxpc3RlbmVyPigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q291bnRyeUZyb21Mb2NhdGlvbihMb2NhdGlvbiBsb2NhdGlvbikgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChjb3VudHJ5Rm91bmRMb2NrZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW5vdGlmeUNvdW50cnkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlGb3VuZExvY2tlci53YWl0KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtTG9jYXRpb24uZ2V0UHJvdmlkZXIoKS5lbmRzV2l0aChsb2NhdGlvbi5nZXRQcm92aWRlcigpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtQ291bnRyeTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIExvY2F0aW9uIGdldExhc3RLbm93bkxvY2F0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2NhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckVuYWJsZWRQcm92aWRlcnMoTGlzdDxMb2NhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lcnMuYWRkQWxsKGxpc3RlbmVycyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgdW5yZWdpc3RlclByb3ZpZGVycyhMaXN0PExvY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVycykgeworICAgICAgICAgICAgZm9yIChMb2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogbUxvY2F0aW9uTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBsb25nIGdldFF1ZXJ5TG9jYXRpb25UaW1lb3V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1RdWVyeUxvY2F0aW9uVGltZW91dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgaW50IGdldFRvdGFsRW5hYmxlZFByb3ZpZGVycygpIHsKKyAgICAgICAgICAgIHJldHVybiBUT1RBTF9QUk9WSURFUlM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlMb2NhdGlvbkZvdW5kKCkgeworICAgICAgICAgICAgLy8gTGlzdGVuZXIgY291bGQgYmUgcmVtb3ZlZCBpbiB0aGUgbm90aWZpY2F0aW9uLgorICAgICAgICAgICAgTG9jYXRpb25MaXN0ZW5lcltdIGxpc3RlbmVycyA9IG5ldyBMb2NhdGlvbkxpc3RlbmVyW21MaXN0ZW5lcnMuc2l6ZSgpXTsKKyAgICAgICAgICAgIG1Mb2NhdGlvbkxpc3RlbmVycy50b0FycmF5KGxpc3RlbmVycyk7CisgICAgICAgICAgICBmb3IgKExvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOmxpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uTG9jYXRpb25DaGFuZ2VkKG1Mb2NhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldExpc3RlbmVyc0NvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1MaXN0ZW5lcnMuc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5Q291bnRyeUZvdW5kKCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChjb3VudHJ5Rm91bmRMb2NrZXIpIHsKKyAgICAgICAgICAgICAgICBub3RpZnlDb3VudHJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb3VudHJ5Rm91bmRMb2NrZXIubm90aWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGltZXIgZ2V0VGltZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbVRpbWVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRocmVhZCBnZXRRdWVyeVRocmVhZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUXVlcnlUaHJlYWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIENvdW50cnlMaXN0ZW5lckltcGwgaW1wbGVtZW50cyBDb3VudHJ5TGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWVkOworICAgICAgICBwcml2YXRlIFN0cmluZyBtQ291bnRyeUNvZGU7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ291bnRyeURldGVjdGVkKENvdW50cnkgY291bnRyeSkgeworICAgICAgICAgICAgbU5vdGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChjb3VudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ291bnRyeUNvZGUgPSBjb3VudHJ5LmdldENvdW50cnlJc28oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG5vdGlmaWVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Ob3RpZmllZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q291bnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ291bnRyeUNvZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZGluZ0NvdW50cnkoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb3VudHJ5ID0gInVzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3ZpZGVyID0gIkdvb2QiOworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGNvdW50cnlMaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgZGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3Rvcihjb3VudHJ5LCBwcm92aWRlcik7CisgICAgICAgIGRldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihjb3VudHJ5TGlzdGVuZXIpOworICAgICAgICBkZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhkZXRlY3Rvci5nZXRMaXN0ZW5lcnNDb3VudCgpLCBUZXN0Q291bnRyeURldGVjdG9yLlRPVEFMX1BST1ZJREVSUyk7CisgICAgICAgIGRldGVjdG9yLm5vdGlmeUxvY2F0aW9uRm91bmQoKTsKKyAgICAgICAgLy8gQWxsIGxpc3RlbmVycyBzaG91bGQgYmUgdW5yZWdpc3RlcmVkCisgICAgICAgIGFzc2VydEVxdWFscyhkZXRlY3Rvci5nZXRMaXN0ZW5lcnNDb3VudCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0TnVsbChkZXRlY3Rvci5nZXRUaW1lcigpKTsKKyAgICAgICAgVGhyZWFkIHF1ZXJ5VGhyZWFkID0gd2FpdEZvclF1ZXJ5VGhyZWFkTGF1bmNoZWQoZGV0ZWN0b3IpOworICAgICAgICBkZXRlY3Rvci5ub3RpZnlDb3VudHJ5Rm91bmQoKTsKKyAgICAgICAgLy8gV2FpdCBmb3IgcXVlcnkgdGhyZWFkIGVuZGluZworICAgICAgICB3YWl0Rm9yVGhyZWFkRW5kaW5nKHF1ZXJ5VGhyZWFkKTsKKyAgICAgICAgLy8gUXVlcnlUaHJlYWQgc2hvdWxkIGJlIHNldCB0byBOVUxMCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0UXVlcnlUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeUxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoY291bnRyeUxpc3RlbmVyLmdldENvdW50cnkoKSwgY291bnRyeSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRpbmdDb3VudHJ5Q2FuY2VsbGVkKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9ICJ1cyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlciA9ICJHb29kIjsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBjb3VudHJ5TGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoY291bnRyeSwgcHJvdmlkZXIpOworICAgICAgICBkZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIoY291bnRyeUxpc3RlbmVyKTsKKyAgICAgICAgZGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgVGVzdENvdW50cnlEZXRlY3Rvci5UT1RBTF9QUk9WSURFUlMpOworICAgICAgICBkZXRlY3Rvci5ub3RpZnlMb2NhdGlvbkZvdW5kKCk7CisgICAgICAgIC8vIEFsbCBsaXN0ZW5lcnMgc2hvdWxkIGJlIHVucmVnaXN0ZXJlZAorICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgMCk7CisgICAgICAgIC8vIFRoZSB0aW1lIHNob3VsZCBiZSBzdG9wcGVkCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0VGltZXIoKSk7CisgICAgICAgIFRocmVhZCBxdWVyeVRocmVhZCA9IHdhaXRGb3JRdWVyeVRocmVhZExhdW5jaGVkKGRldGVjdG9yKTsKKyAgICAgICAgZGV0ZWN0b3Iuc3RvcCgpOworICAgICAgICAvLyBUaGVyZSBpcyBubyB3YXkgdG8gc3RvcCB0aGUgdGhyZWFkLCBsZXQncyB0ZXN0IGl0IGNvdWxkIGJlIHN0b3BwZWQsIGFmdGVyIGdldCBjb3VudHJ5CisgICAgICAgIGRldGVjdG9yLm5vdGlmeUNvdW50cnlGb3VuZCgpOworICAgICAgICAvLyBXYWl0IGZvciBxdWVyeSB0aHJlYWQgZW5kaW5nCisgICAgICAgIHdhaXRGb3JUaHJlYWRFbmRpbmcocXVlcnlUaHJlYWQpOworICAgICAgICAvLyBRdWVyeVRocmVhZCBzaG91bGQgYmUgc2V0IHRvIE5VTEwKKyAgICAgICAgYXNzZXJ0TnVsbChkZXRlY3Rvci5nZXRRdWVyeVRocmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5TGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhjb3VudHJ5TGlzdGVuZXIuZ2V0Q291bnRyeSgpLCBjb3VudHJ5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZGluZ0xvY2F0aW9uQ2FuY2VsbGVkKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9ICJ1cyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlciA9ICJHb29kIjsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBjb3VudHJ5TGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoY291bnRyeSwgcHJvdmlkZXIpOworICAgICAgICBkZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIoY291bnRyeUxpc3RlbmVyKTsKKyAgICAgICAgZGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgVGVzdENvdW50cnlEZXRlY3Rvci5UT1RBTF9QUk9WSURFUlMpOworICAgICAgICBkZXRlY3Rvci5zdG9wKCk7CisgICAgICAgIC8vIEFsbCBsaXN0ZW5lcnMgc2hvdWxkIGJlIHVucmVnaXN0ZXJlZAorICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgMCk7CisgICAgICAgIC8vIFRoZSB0aW1lIHNob3VsZCBiZSBzdG9wcGVkCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0VGltZXIoKSk7CisgICAgICAgIC8vIFF1ZXJ5VGhyZWFkIHNob3VsZCBzdGlsbCBiZSBOVUxMCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0UXVlcnlUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvdW50cnlMaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZGluZ0xvY2F0aW9uRmFpbGVkKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9ICJ1cyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlciA9ICJHb29kIjsKKyAgICAgICAgbG9uZyB0aW1lb3V0ID0gMTAwMDsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBkZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKGNvdW50cnksIHByb3ZpZGVyLCB0aW1lb3V0KSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBMb2NhdGlvbiBnZXRMYXN0S25vd25Mb2NhdGlvbigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBjb3VudHJ5TGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBkZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIoY291bnRyeUxpc3RlbmVyKTsKKyAgICAgICAgZGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgVGVzdENvdW50cnlEZXRlY3Rvci5UT1RBTF9QUk9WSURFUlMpOworICAgICAgICB3YWl0Rm9yVGltZXJSZXNldChkZXRlY3Rvcik7CisgICAgICAgIC8vIEFsbCBsaXN0ZW5lcnMgc2hvdWxkIGJlIHVucmVnaXN0ZXJlZAorICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgMCk7CisgICAgICAgIC8vIFF1ZXJ5VGhyZWFkIHNob3VsZCBzdGlsbCBiZSBOVUxMCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0UXVlcnlUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeUxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnROdWxsKGNvdW50cnlMaXN0ZW5lci5nZXRDb3VudHJ5KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kaW5nQ291bnRyeUZhaWxlZCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSAidXMiOworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdmlkZXIgPSAiR29vZCI7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgZGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3Rvcihjb3VudHJ5LCBwcm92aWRlcikgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvdW50cnlGcm9tTG9jYXRpb24oTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNvdW50cnlGb3VuZExvY2tlcikgeworICAgICAgICAgICAgICAgICAgICBpZiAoISBub3RpZnlDb3VudHJ5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlGb3VuZExvY2tlci53YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gV2UgZGlkbid0IGZpbmQgY291bnRyeS4KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBjb3VudHJ5TGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBkZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIoY291bnRyeUxpc3RlbmVyKTsKKyAgICAgICAgZGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgVGVzdENvdW50cnlEZXRlY3Rvci5UT1RBTF9QUk9WSURFUlMpOworICAgICAgICBkZXRlY3Rvci5ub3RpZnlMb2NhdGlvbkZvdW5kKCk7CisgICAgICAgIC8vIEFsbCBsaXN0ZW5lcnMgc2hvdWxkIGJlIHVucmVnaXN0ZXJlZAorICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgMCk7CisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0VGltZXIoKSk7CisgICAgICAgIFRocmVhZCBxdWVyeVRocmVhZCA9IHdhaXRGb3JRdWVyeVRocmVhZExhdW5jaGVkKGRldGVjdG9yKTsKKyAgICAgICAgZGV0ZWN0b3Iubm90aWZ5Q291bnRyeUZvdW5kKCk7CisgICAgICAgIC8vIFdhaXQgZm9yIHF1ZXJ5IHRocmVhZCBlbmRpbmcKKyAgICAgICAgd2FpdEZvclRocmVhZEVuZGluZyhxdWVyeVRocmVhZCk7CisgICAgICAgIC8vIFF1ZXJ5VGhyZWFkIHNob3VsZCBiZSBzZXQgdG8gTlVMTAorICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFF1ZXJ5VGhyZWFkKCkpOworICAgICAgICAvLyBDb3VudHJ5TGlzdGVuZXIgc2hvdWxkIGJlIG5vdGlmaWVkCisgICAgICAgIGFzc2VydFRydWUoY291bnRyeUxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnROdWxsKGNvdW50cnlMaXN0ZW5lci5nZXRDb3VudHJ5KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kaW5nQ291bnRyeVdpdGhMYXN0S25vd25Mb2NhdGlvbigpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSAidXMiOworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdmlkZXIgPSAiR29vZCI7CisgICAgICAgIGxvbmcgdGltZW91dCA9IDEwMDA7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgZGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3Rvcihjb3VudHJ5LCBwcm92aWRlciwgdGltZW91dCk7CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgY291bnRyeUxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgZGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGNvdW50cnlMaXN0ZW5lcik7CisgICAgICAgIGRldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIFRlc3RDb3VudHJ5RGV0ZWN0b3IuVE9UQUxfUFJPVklERVJTKTsKKyAgICAgICAgd2FpdEZvclRpbWVyUmVzZXQoZGV0ZWN0b3IpOworICAgICAgICAvLyBBbGwgbGlzdGVuZXJzIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIDApOworICAgICAgICBUaHJlYWQgcXVlcnlUaHJlYWQgPSB3YWl0Rm9yUXVlcnlUaHJlYWRMYXVuY2hlZChkZXRlY3Rvcik7CisgICAgICAgIGRldGVjdG9yLm5vdGlmeUNvdW50cnlGb3VuZCgpOworICAgICAgICAvLyBXYWl0IGZvciBxdWVyeSB0aHJlYWQgZW5kaW5nCisgICAgICAgIHdhaXRGb3JUaHJlYWRFbmRpbmcocXVlcnlUaHJlYWQpOworICAgICAgICAvLyBRdWVyeVRocmVhZCBzaG91bGQgYmUgc2V0IHRvIE5VTEwKKyAgICAgICAgYXNzZXJ0TnVsbChkZXRlY3Rvci5nZXRRdWVyeVRocmVhZCgpKTsKKyAgICAgICAgLy8gQ291bnRyeUxpc3RlbmVyIHNob3VsZCBiZSBub3RpZmllZAorICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlMaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50cnlMaXN0ZW5lci5nZXRDb3VudHJ5KCksIGNvdW50cnkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yVGltZXJSZXNldChUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgIGludCBjb3VudCA9IDU7CisgICAgICAgIGxvbmcgaW50ZXJ2YWwgPSAxMDAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKGNvdW50LS0gPiAwICYmIGRldGVjdG9yLmdldFRpbWVyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChpbnRlcnZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBUaW1lciB0aW1lciA9IGRldGVjdG9yLmdldFRpbWVyKCk7CisgICAgICAgIGFzc2VydFRydWUodGltZXIgPT0gbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JUaHJlYWRFbmRpbmcoVGhyZWFkIHRocmVhZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhyZWFkLmpvaW4oNTAwMCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFRocmVhZCB3YWl0Rm9yUXVlcnlUaHJlYWRMYXVuY2hlZChUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgIGludCBjb3VudCA9IDU7CisgICAgICAgIGxvbmcgaW50ZXJ2YWwgPSAxMDAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKGNvdW50LS0gPiAwICYmIGRldGVjdG9yLmdldFF1ZXJ5VGhyZWFkKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChpbnRlcnZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBUaHJlYWQgdGhyZWFkID0gZGV0ZWN0b3IuZ2V0UXVlcnlUaHJlYWQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0aHJlYWQgIT0gbnVsbCk7CisgICAgICAgIHJldHVybiB0aHJlYWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyLmphdmEKaW5kZXggOGE0NzMzOS4uZmZhYmI3YiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlci5qYXZhCkBAIC0xNiw4MyArMTYsMjAwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZWxlcGhvbnk7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmkxOG4ucGhvbmVudW1iZXJzLkFzWW91VHlwZUZvcm1hdHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmkxOG4ucGhvbmVudW1iZXJzLlBob25lTnVtYmVyVXRpbDsKKworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LkVkaXRhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRXYXRjaGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAogLyoqCi0gKiBXYXRjaGVzIGEge0BsaW5rIFRleHRWaWV3fSBhbmQgaWYgYSBwaG9uZSBudW1iZXIgaXMgZW50ZXJlZCB3aWxsIGZvcm1hdCBpdCB1c2luZwotICoge0BsaW5rIFBob25lTnVtYmVyVXRpbHMjZm9ybWF0TnVtYmVyKEVkaXRhYmxlLCBpbnQpfS4gVGhlIGZvcm1hdHRpbmcgaXMgYmFzZWQgb24KLSAqIHRoZSBjdXJyZW50IHN5c3RlbSBsb2NhbGUgd2hlbiB0aGlzIG9iamVjdCBpcyBjcmVhdGVkIGFuZCBmdXR1cmUgbG9jYWxlIGNoYW5nZXMKLSAqIG1heSBub3QgdGFrZSBlZmZlY3Qgb24gdGhpcyBpbnN0YW5jZS4KKyAqIFdhdGNoZXMgYSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXd9IGFuZCBpZiBhIHBob25lIG51bWJlciBpcyBlbnRlcmVkCisgKiB3aWxsIGZvcm1hdCBpdC4KKyAqIDxwPgorICogU3RvcCBmb3JtYXR0aW5nIHdoZW4gdGhlIHVzZXIKKyAqIDx1bD4KKyAqIDxsaT5JbnB1dHMgbm9uLWRpYWxhYmxlIGNoYXJhY3RlcnM8L2xpPgorICogPGxpPlJlbW92ZXMgdGhlIHNlcGFyYXRvciBpbiB0aGUgbWlkZGxlIG9mIHN0cmluZy48L2xpPgorICogPC91bD4KKyAqIDxwPgorICogVGhlIGZvcm1hdHRpbmcgd2lsbCBiZSByZXN0YXJ0ZWQgb25jZSB0aGUgdGV4dCBpcyBjbGVhcmVkLgogICovCiBwdWJsaWMgY2xhc3MgUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIgaW1wbGVtZW50cyBUZXh0V2F0Y2hlciB7CisgICAgLyoqCisgICAgICogT25lIG9yIG1vcmUgY2hhcmFjdGVycyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgZW5kLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTVEFURV9SRU1PVkVfTEFTVCA9IDA7CiAKLSAgICBzdGF0aWMgcHJpdmF0ZSBpbnQgc0Zvcm1hdFR5cGU7Ci0gICAgc3RhdGljIHByaXZhdGUgTG9jYWxlIHNDYWNoZWRMb2NhbGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Gb3JtYXR0aW5nOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRGVsZXRpbmdIeXBoZW47Ci0gICAgcHJpdmF0ZSBpbnQgbUh5cGhlblN0YXJ0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtRGVsZXRpbmdCYWNrd2FyZDsKKyAgICAvKioKKyAgICAgKiBPbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIHdlcmUgYXBwZW5kZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNUQVRFX0FQUEVORCA9IDE7CiAKKyAgICAvKioKKyAgICAgKiBPbmUgb3IgbW9yZSBkaWdpdHMgd2VyZSBjaGFuZ2VkIGluIHRoZSBiZWdpbm5pbmcgb3IgdGhlIG1pZGRsZSBvZiB0ZXh0LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTVEFURV9NT0RJRllfRElHSVRTID0gMjsKKworICAgIC8qKgorICAgICAqIFRoZSBjaGFuZ2VzIG90aGVyIHRoYW4gdGhlIGFib3ZlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTVEFURV9PVEhFUiA9IDM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RhdGUgb2YgdGhpcyBjaGFuZ2UgY291bGQgYmUgb25lIHZhbHVlIG9mIHRoZSBhYm92ZQorICAgICAqLworICAgIHByaXZhdGUgaW50IG1TdGF0ZTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGUgY2hhbmdlIHdhcyBjYXVzZWQgYnkgb3Vyc2VsdmVzLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtU2VsZkNoYW5nZSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoZSBmb3JtYXR0aW5nIGhhcyBiZWVuIHN0b3BwZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1TdG9wRm9ybWF0dGluZzsKKworICAgIHByaXZhdGUgQXNZb3VUeXBlRm9ybWF0dGVyIG1Gb3JtYXR0ZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZm9ybWF0dGluZyBpcyBiYXNlZCBvbiB0aGUgY3VycmVudCBzeXN0ZW0gbG9jYWxlIGFuZCBmdXR1cmUgbG9jYWxlIGNoYW5nZXMKKyAgICAgKiBtYXkgbm90IHRha2UgZWZmZWN0IG9uIHRoaXMgaW5zdGFuY2UuCisgICAgICovCiAgICAgcHVibGljIFBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyKCkgewotICAgICAgICBpZiAoc0NhY2hlZExvY2FsZSA9PSBudWxsIHx8IHNDYWNoZWRMb2NhbGUgIT0gTG9jYWxlLmdldERlZmF1bHQoKSkgewotICAgICAgICAgICAgc0NhY2hlZExvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0gICAgICAgICAgICBzRm9ybWF0VHlwZSA9IFBob25lTnVtYmVyVXRpbHMuZ2V0Rm9ybWF0VHlwZUZvckxvY2FsZShzQ2FjaGVkTG9jYWxlKTsKLSAgICAgICAgfQorICAgICAgICB0aGlzKExvY2FsZS5nZXREZWZhdWx0KCkuZ2V0Q291bnRyeSgpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZChFZGl0YWJsZSB0ZXh0KSB7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0byBpZ25vcmUgY2FsbHMgdG8gYWZ0ZXJUZXh0Q2hhbmdlZCBjYXVzZWQgYnkgdGhlIHdvcmsgZG9uZSBiZWxvdwotICAgICAgICBpZiAoIW1Gb3JtYXR0aW5nKSB7Ci0gICAgICAgICAgICBtRm9ybWF0dGluZyA9IHRydWU7Ci0KLSAgICAgICAgICAgIC8vIElmIGRlbGV0aW5nIHRoZSBoeXBoZW4sIGFsc28gZGVsZXRlIHRoZSBjaGFyIGJlZm9yZSBvciBhZnRlciB0aGF0Ci0gICAgICAgICAgICBpZiAobURlbGV0aW5nSHlwaGVuICYmIG1IeXBoZW5TdGFydCA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobURlbGV0aW5nQmFja3dhcmQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1IeXBoZW5TdGFydCAtIDEgPCB0ZXh0Lmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LmRlbGV0ZShtSHlwaGVuU3RhcnQgLSAxLCBtSHlwaGVuU3RhcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtSHlwaGVuU3RhcnQgPCB0ZXh0Lmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRleHQuZGVsZXRlKG1IeXBoZW5TdGFydCwgbUh5cGhlblN0YXJ0ICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcih0ZXh0LCBzRm9ybWF0VHlwZSk7Ci0KLSAgICAgICAgICAgIG1Gb3JtYXR0aW5nID0gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBUaGUgZm9ybWF0dGluZyBpcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gPGNvZGU+Y291bnRyeUNvZGU8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGNvdW50cnlDb2RlIHRoZSBJU08gMzE2Ni0xIHR3by1sZXR0ZXIgY291bnRyeSBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBjb3VudHJ5L3JlZ2lvbgorICAgICAqIHdoZXJlIHRoZSBwaG9uZSBudW1iZXIgaXMgYmVpbmcgZW50ZXJlZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIFBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyKFN0cmluZyBjb3VudHJ5Q29kZSkgeworICAgICAgICBpZiAoY291bnRyeUNvZGUgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICBtRm9ybWF0dGVyID0gUGhvbmVOdW1iZXJVdGlsLmdldEluc3RhbmNlKCkuZ2V0QXNZb3VUeXBlRm9ybWF0dGVyKGNvdW50cnlDb2RlKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgY291bnQsIGludCBhZnRlcikgewotICAgICAgICAvLyBDaGVjayBpZiB0aGUgdXNlciBpcyBkZWxldGluZyBhIGh5cGhlbgotICAgICAgICBpZiAoIW1Gb3JtYXR0aW5nKSB7Ci0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdXNlciBpcyBkZWxldGluZyBvbmUgY2hhciwgd2l0aG91dCBhIHNlbGVjdGlvbgotICAgICAgICAgICAgZmluYWwgaW50IHNlbFN0YXJ0ID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KHMpOwotICAgICAgICAgICAgZmluYWwgaW50IHNlbEVuZCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQocyk7Ci0gICAgICAgICAgICBpZiAocy5sZW5ndGgoKSA+IDEgLy8gQ2FuIGRlbGV0ZSBhbm90aGVyIGNoYXJhY3RlcgotICAgICAgICAgICAgICAgICAgICAmJiBjb3VudCA9PSAxIC8vIERlbGV0aW5nIG9ubHkgb25lIGNoYXJhY3RlcgotICAgICAgICAgICAgICAgICAgICAmJiBhZnRlciA9PSAwIC8vIERlbGV0aW5nCi0gICAgICAgICAgICAgICAgICAgICYmIHMuY2hhckF0KHN0YXJ0KSA9PSAnLScgLy8gYSBoeXBoZW4KLSAgICAgICAgICAgICAgICAgICAgJiYgc2VsU3RhcnQgPT0gc2VsRW5kKSB7IC8vIG5vIHNlbGVjdGlvbgotICAgICAgICAgICAgICAgIG1EZWxldGluZ0h5cGhlbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUh5cGhlblN0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHVzZXIgaXMgZGVsZXRpbmcgZm9yd2FyZCBvciBiYWNrd2FyZAotICAgICAgICAgICAgICAgIGlmIChzZWxTdGFydCA9PSBzdGFydCArIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgbURlbGV0aW5nQmFja3dhcmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZWxldGluZ0JhY2t3YXJkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtRGVsZXRpbmdIeXBoZW4gPSBmYWxzZTsKLSAgICAgICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgY291bnQsCisgICAgICAgICAgICBpbnQgYWZ0ZXIpIHsKKyAgICAgICAgaWYgKG1TZWxmQ2hhbmdlIHx8IG1TdG9wRm9ybWF0dGluZykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChjb3VudCA9PSAwICYmIHMubGVuZ3RoKCkgPT0gc3RhcnQpIHsKKyAgICAgICAgICAgIC8vIEFwcGVuZCBvbmUgb3IgbW9yZSBuZXcgY2hhcnMKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0FQUEVORDsKKyAgICAgICAgfSBlbHNlIGlmIChhZnRlciA9PSAwICYmIHN0YXJ0ICsgY291bnQgPT0gcy5sZW5ndGgoKSAmJiBjb3VudCA+IDApIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSBvbmUgb3IgbW9yZSBjaGFycyBmcm9tIHRoZSBlbmQgb2Ygc3RyaW5nLgorICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUkVNT1ZFX0xBU1Q7CisgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPiAwICYmICFoYXNTZXBhcmF0b3Iocywgc3RhcnQsIGNvdW50KSkgeworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBkaWFsYWJsZSBjaGFycyBpbiB0aGUgYmVnaW4gb3IgbWlkZGxlIG9mIHRleHQuCisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9NT0RJRllfRElHSVRTOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfT1RIRVI7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBiZWZvcmUsIGludCBjb3VudCkgewotICAgICAgICAvLyBEb2VzIG5vdGhpbmcKKyAgICAgICAgaWYgKG1TZWxmQ2hhbmdlIHx8IG1TdG9wRm9ybWF0dGluZykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfT1RIRVIpIHsKKyAgICAgICAgICAgIGlmIChjb3VudCA+IDAgJiYgIWhhc1NlcGFyYXRvcihzLCBzdGFydCwgY291bnQpKSB7CisgICAgICAgICAgICAgICAgLy8gVXNlciBpbnNlcnRlZCB0aGUgZGlhbGFibGUgY2hhcmFjdGVycyBpbiB0aGUgbWlkZGxlIG9mIHRleHQuCisgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfTU9ESUZZX0RJR0lUUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHdlIHNob3VsZCBzdG9wIGZvcm1hdHRpbmcuCisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQVBQRU5EICYmIGNvdW50ID4gMCAmJiBoYXNTZXBhcmF0b3Iocywgc3RhcnQsIGNvdW50KSkgeworICAgICAgICAgICAgLy8gVXNlciBhcHBlbmRlZCB0aGUgbm9uLWRpYWxhYmxlIGNoYXJhY3Rlciwgc3RvcCBmb3JtYXR0aW5nLgorICAgICAgICAgICAgc3RvcEZvcm1hdHRpbmcoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfT1RIRVIpIHsKKyAgICAgICAgICAgIC8vIFVzZXIgbXVzdCBpbnNlcnQgb3IgcmVtb3ZlIHRoZSBub24tZGlhbGFibGUgY2hhcmFjdGVycyBpbiB0aGUgYmVnaW4gb3IgbWlkZGxlIG9mCisgICAgICAgICAgICAvLyBudW1iZXIsIHN0b3AgZm9ybWF0dGluZy4KKyAgICAgICAgICAgIHN0b3BGb3JtYXR0aW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZChFZGl0YWJsZSBzKSB7CisgICAgICAgIGlmIChtU3RvcEZvcm1hdHRpbmcpIHsKKyAgICAgICAgICAgIC8vIFJlc3RhcnQgdGhlIGZvcm1hdHRpbmcgd2hlbiBhbGwgdGV4dHMgd2VyZSBjbGVhci4KKyAgICAgICAgICAgIG1TdG9wRm9ybWF0dGluZyA9ICEocy5sZW5ndGgoKSA9PSAwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAobVNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZSB0aGUgY2hhbmdlIGNhdXNlZCBieSBzLnJlcGxhY2UoKS4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZm9ybWF0dGVkID0gcmVmb3JtYXQocywgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChzKSk7CisgICAgICAgIGlmIChmb3JtYXR0ZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IHJlbWVtYmVyZWRQb3MgPSBtRm9ybWF0dGVyLmdldFJlbWVtYmVyZWRQb3NpdGlvbigpOworICAgICAgICAgICAgbVNlbGZDaGFuZ2UgPSB0cnVlOworICAgICAgICAgICAgcy5yZXBsYWNlKDAsIHMubGVuZ3RoKCksIGZvcm1hdHRlZCwgMCwgZm9ybWF0dGVkLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIC8vIFRoZSB0ZXh0IGNvdWxkIGJlIGNoYW5nZWQgYnkgb3RoZXIgVGV4dFdhdGNoZXIgYWZ0ZXIgd2UgY2hhbmdlZCBpdC4gSWYgd2UgZm91bmQgdGhlCisgICAgICAgICAgICAvLyB0ZXh0IGlzIG5vdCB0aGUgb25lIHdlIHdlcmUgZXhwZWN0aW5nLCBqdXN0IGdpdmUgdXAgY2FsbGluZyBzZXRTZWxlY3Rpb24oKS4KKyAgICAgICAgICAgIGlmIChmb3JtYXR0ZWQuZXF1YWxzKHMudG9TdHJpbmcoKSkpIHsKKyAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKHMsIHJlbWVtYmVyZWRQb3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNlbGZDaGFuZ2UgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIHRoZSBmb3JtYXR0ZWQgbnVtYmVyIGJ5IGlnbm9yaW5nIGFsbCBub24tZGlhbGFibGUgY2hhcnMgYW5kIHN0aWNrIHRoZSBjdXJzb3IgdG8gdGhlCisgICAgICogbmVhcmVzdCBkaWFsYWJsZSBjaGFyIHRvIHRoZSBsZWZ0LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBudW1iZXIgaXMgICg2NTApIDEyMy00NTY3OCBhbmQgJzQnIGlzCisgICAgICogcmVtb3ZlZCB0aGVuIHRoZSBjdXJzb3Igc2hvdWxkIGJlIGJlaGluZCAnMycgaW5zdGVhZCBvZiAnLScuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVmb3JtYXQoQ2hhclNlcXVlbmNlIHMsIGludCBjdXJzb3IpIHsKKyAgICAgICAgLy8gVGhlIGluZGV4IG9mIGNoYXIgdG8gdGhlIGxlZnR3YXJkIG9mIHRoZSBjdXJzb3IuCisgICAgICAgIGludCBjdXJJbmRleCA9IGN1cnNvciAtIDE7CisgICAgICAgIFN0cmluZyBmb3JtYXR0ZWQgPSBudWxsOworICAgICAgICBtRm9ybWF0dGVyLmNsZWFyKCk7CisgICAgICAgIGNoYXIgbGFzdE5vblNlcGFyYXRvciA9IDA7CisgICAgICAgIGJvb2xlYW4gaGFzQ3Vyc29yID0gZmFsc2U7CisgICAgICAgIGludCBsZW4gPSBzLmxlbmd0aCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChQaG9uZU51bWJlclV0aWxzLmlzTm9uU2VwYXJhdG9yKGMpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxhc3ROb25TZXBhcmF0b3IgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQgPSBnZXRGb3JtYXR0ZWROdW1iZXIobGFzdE5vblNlcGFyYXRvciwgaGFzQ3Vyc29yKTsKKyAgICAgICAgICAgICAgICAgICAgaGFzQ3Vyc29yID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhc3ROb25TZXBhcmF0b3IgPSBjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPT0gY3VySW5kZXgpIHsKKyAgICAgICAgICAgICAgICBoYXNDdXJzb3IgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChsYXN0Tm9uU2VwYXJhdG9yICE9IDApIHsKKyAgICAgICAgICAgIGZvcm1hdHRlZCA9IGdldEZvcm1hdHRlZE51bWJlcihsYXN0Tm9uU2VwYXJhdG9yLCBoYXNDdXJzb3IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmb3JtYXR0ZWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Rm9ybWF0dGVkTnVtYmVyKGNoYXIgbGFzdE5vblNlcGFyYXRvciwgYm9vbGVhbiBoYXNDdXJzb3IpIHsKKyAgICAgICAgcmV0dXJuIGhhc0N1cnNvciA/IG1Gb3JtYXR0ZXIuaW5wdXREaWdpdEFuZFJlbWVtYmVyUG9zaXRpb24obGFzdE5vblNlcGFyYXRvcikKKyAgICAgICAgICAgICAgICA6IG1Gb3JtYXR0ZXIuaW5wdXREaWdpdChsYXN0Tm9uU2VwYXJhdG9yKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RvcEZvcm1hdHRpbmcoKSB7CisgICAgICAgIG1TdG9wRm9ybWF0dGluZyA9IHRydWU7CisgICAgICAgIG1Gb3JtYXR0ZXIuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzU2VwYXJhdG9yKGZpbmFsIENoYXJTZXF1ZW5jZSBzLCBmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCBjb3VudCkgeworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBzdGFydCArIGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKCFQaG9uZU51bWJlclV0aWxzLmlzTm9uU2VwYXJhdG9yKGMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHMuamF2YQppbmRleCBkZGZjNTIwLi5lMzc3MzNjIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlscy5qYXZhCkBAIC0xNiw2ICsxNiwxMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGVsZXBob255OwogCitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5OdW1iZXJQYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmkxOG4ucGhvbmVudW1iZXJzLlBob25lTnVtYmVyVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmkxOG4ucGhvbmVudW1iZXJzLlBob25lTnVtYmVyVXRpbC5QaG9uZU51bWJlckZvcm1hdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmkxOG4ucGhvbmVudW1iZXJzLlBob25lbnVtYmVyLlBob25lTnVtYmVyOworCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKQEAgLTYxNyw3ICs2MjIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gSW4gdGhlIFVTLCAxLTY1MC01NTUtMTIzNCBtdXN0IGJlIGVxdWFsIHRvIDY1MC01NTUtMTIzNCwKLSAgICAgICAgICAgIC8vIHdoaWxlIDA5MC0xMjM0LTEyMzQgbXVzdCBub3QgYmUgZXF1YWx0IHRvIDkwLTEyMzQtMTIzNCBpbiBKYXBhbi4KKyAgICAgICAgICAgIC8vIHdoaWxlIDA5MC0xMjM0LTEyMzQgbXVzdCBub3QgYmUgZXF1YWwgdG8gOTAtMTIzNC0xMjM0IGluIEphcGFuLgogICAgICAgICAgICAgLy8gVGhpcyByZXF1ZXN0IGV4aXN0cyBqdXN0IGluIFVTICh3aXRoIDEgdHJ1bmsgKE5ERCkgcHJlZml4KS4KICAgICAgICAgICAgIC8vIEluIGFkZGl0aW9uLCAiMDExIDExIDcwMDU1NTQxNDEiIG11c3Qgbm90IGVxdWFsIHRvICIrMTcwMDU1NTQxNDEiLAogICAgICAgICAgICAgLy8gd2hpbGUgIjAxMSAxIDcwMDU1NTQxNDEiIG11c3QgZXF1YWwgdG8gIisxNzAwNTU1NDE0MSIKQEAgLTc3OSwxMCArNzg0LDEwIEBACiAgICAgICAgIGlmIChwcmVwZW5kUGx1cykgewogICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiAiaW50ZXJuYXRpb25hbCBudW1iZXIiIGFuZCBzaG91bGQgaGF2ZQogICAgICAgICAgICAgLy8gYSBwbHVzIHByZXBlbmRlZCB0byB0aGUgZGlhbGluZyBudW1iZXIuIEJ1dCB0aGVyZQotICAgICAgICAgICAgLy8gY2FuIGFsc28gYmUgR3NtIE1NSSBjb2RlcyBhcyBkZWZpbmVkIGluIFRTIDIyLjAzMCA2LjUuMgorICAgICAgICAgICAgLy8gY2FuIGFsc28gYmUgR1NNIE1NSSBjb2RlcyBhcyBkZWZpbmVkIGluIFRTIDIyLjAzMCA2LjUuMgogICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBoYW5kbGUgdGhvc2UgYWxzby4KICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBodHRwOi8vd2ViLnRlbGlhLmNvbS9+dTQ3OTA0Nzc2L2dzbWtvZGUuaHRtIGlzIGEKKyAgICAgICAgICAgIC8vIGh0dHA6Ly93ZWIudGVsaWEuY29tL351NDc5MDQ3NzYvZ3Nta29kZS5odG0KICAgICAgICAgICAgIC8vIGhhcyBhIG5pY2UgbGlzdCBvZiBzb21lIG9mIHRoZXNlIEdTTSBjb2Rlcy4KICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAvLyBFeGFtcGxlcyBhcmU6CkBAIC04NzAsMTAgKzg3NSwxMCBAQAogCiAgICAgICAgICAgICAvLyBGSVhNRShta2YpIFRTIDIzLjA0MCA5LjEuMi4zIHNheXMKICAgICAgICAgICAgIC8vICJpZiBhIG1vYmlsZSByZWNlaXZlcyAxMTExIGluIGEgcG9zaXRpb24gcHJpb3IgdG8KLSAgICAgICAgICAgIC8vIHRoZSBsYXN0IHNlbWktb2N0ZXQgdGhlbiBwcm9jZXNzaW5nIHNoYWxsIGNvbW1lbnNlIHdpdGgKKyAgICAgICAgICAgIC8vIHRoZSBsYXN0IHNlbWktb2N0ZXQgdGhlbiBwcm9jZXNzaW5nIHNoYWxsIGNvbW1lbmNlIHdpdGgKICAgICAgICAgICAgIC8vIHRoZSBuZXh0IHNlbWktb2N0ZXQgYW5kIHRoZSBpbnRlcnZlbmluZwogICAgICAgICAgICAgLy8gc2VtaS1vY3RldCBzaGFsbCBiZSBpZ25vcmVkIgotICAgICAgICAgICAgLy8gSG93IGRvZXMgdGhpcyBqaXZlIHdpdGggMjQsMDA4IDEwLjUuNC43CisgICAgICAgICAgICAvLyBIb3cgZG9lcyB0aGlzIGppdmUgd2l0aCAyNC4wMDggMTAuNS40LjcKIAogICAgICAgICAgICAgYiA9IChieXRlKSgoYnl0ZXNbaV0gPj4gNCkgJiAweGYpOwogCkBAIC0xMDA0LDcgKzEwMDksNyBAQAogICAgICAqIENvbnZlcnQgYSBkaWFsaW5nIG51bWJlciB0byBCQ0QgYnl0ZSBhcnJheQogICAgICAqCiAgICAgICogQHBhcmFtIG51bWJlciBkaWFsaW5nIG51bWJlciBzdHJpbmcKLSAgICAgKiAgICAgICAgaWYgdGhlIGRpYWxpbmcgbnVtYmVyIHN0YXJ0cyB3aXRoICcrJywgc2V0IHRvIGludGVybmF0aW9ubCBUT0EKKyAgICAgKiAgICAgICAgaWYgdGhlIGRpYWxpbmcgbnVtYmVyIHN0YXJ0cyB3aXRoICcrJywgc2V0IHRvIGludGVybmF0aW9uYWwgVE9BCiAgICAgICogQHJldHVybiBCQ0QgYnl0ZSBhcnJheQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdCkBAIC0xMTA4LDEwICsxMTEzLDEwIEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBwaG9uZSBudW1iZXIgdG8gZm9ybWF0CiAgICAgICogQHBhcmFtIGRlZmF1bHRGb3JtYXR0aW5nVHlwZSBUaGUgZGVmYXVsdCBmb3JtYXR0aW5nIHJ1bGVzIHRvIGFwcGx5IGlmIHRoZSBudW1iZXIgZG9lcwotICAgICAqIG5vdCBiZWdpbiB3aXRoICs8Y291bnRyeV9jb2RlPgorICAgICAqIG5vdCBiZWdpbiB3aXRoICtbY291bnRyeV9jb2RlXQogICAgICAqIEByZXR1cm4gVGhlIHBob25lIG51bWJlciBmb3JtYXR0ZWQgd2l0aCB0aGUgZ2l2ZW4gZm9ybWF0dGluZyB0eXBlLgogICAgICAqCi0gICAgICogQGhpZGUgVE9ETzpTaHVvbGQgYmUgdW5oaWRkZW4uCisgICAgICogQGhpZGUgVE9ETzogU2hvdWxkIGJlIHVuaGlkZGVuLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdE51bWJlcihTdHJpbmcgc291cmNlLCBpbnQgZGVmYXVsdEZvcm1hdHRpbmdUeXBlKSB7CiAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgdGV4dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKHNvdXJjZSk7CkBAIC0xMTM4LDcgKzExNDMsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHRleHQgVGhlIG51bWJlciB0byBiZSBmb3JtYXR0ZWQsIHdpbGwgYmUgbW9kaWZpZWQgd2l0aCB0aGUgZm9ybWF0dGluZwogICAgICAqIEBwYXJhbSBkZWZhdWx0Rm9ybWF0dGluZ1R5cGUgVGhlIGRlZmF1bHQgZm9ybWF0dGluZyBydWxlcyB0byBhcHBseSBpZiB0aGUgbnVtYmVyIGRvZXMKLSAgICAgKiBub3QgYmVnaW4gd2l0aCArPGNvdW50cnlfY29kZT4KKyAgICAgKiBub3QgYmVnaW4gd2l0aCArW2NvdW50cnlfY29kZV0KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZm9ybWF0TnVtYmVyKEVkaXRhYmxlIHRleHQsIGludCBkZWZhdWx0Rm9ybWF0dGluZ1R5cGUpIHsKICAgICAgICAgaW50IGZvcm1hdFR5cGUgPSBkZWZhdWx0Rm9ybWF0dGluZ1R5cGU7CkBAIC0xMzE5LDYgKzEzMjQsMTMyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBGb3JtYXQgdGhlIGdpdmVuIHBob25lTnVtYmVyIHRvIHRoZSBFLjE2NCByZXByZXNlbnRhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZ2l2ZW4gcGhvbmUgbnVtYmVyIG11c3QgaGF2ZSBhbiBhcmVhIGNvZGUgYW5kIGNvdWxkIGhhdmUgYSBjb3VudHJ5CisgICAgICogY29kZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdENvdW50cnlJc28gaXMgdXNlZCB0byB2YWxpZGF0ZSB0aGUgZ2l2ZW4gbnVtYmVyIGFuZCBnZW5lcmF0ZQorICAgICAqIHRoZSBFLjE2NCBwaG9uZSBudW1iZXIgaWYgdGhlIGdpdmVuIG51bWJlciBkb2Vzbid0IGhhdmUgYSBjb3VudHJ5IGNvZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGhvbmVOdW1iZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBwaG9uZSBudW1iZXIgdG8gZm9ybWF0CisgICAgICogQHBhcmFtIGRlZmF1bHRDb3VudHJ5SXNvCisgICAgICogICAgICAgICAgICB0aGUgSVNPIDMxNjYtMSB0d28gbGV0dGVycyBjb3VudHJ5IGNvZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBFLjE2NCByZXByZXNlbnRhdGlvbiwgb3IgbnVsbCBpZiB0aGUgZ2l2ZW4gcGhvbmUgbnVtYmVyIGlzCisgICAgICogICAgICAgICBub3QgdmFsaWQuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdE51bWJlclRvRTE2NChTdHJpbmcgcGhvbmVOdW1iZXIsIFN0cmluZyBkZWZhdWx0Q291bnRyeUlzbykgeworICAgICAgICBQaG9uZU51bWJlclV0aWwgdXRpbCA9IFBob25lTnVtYmVyVXRpbC5nZXRJbnN0YW5jZSgpOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFBob25lTnVtYmVyIHBuID0gdXRpbC5wYXJzZShwaG9uZU51bWJlciwgZGVmYXVsdENvdW50cnlJc28pOworICAgICAgICAgICAgaWYgKHV0aWwuaXNWYWxpZE51bWJlcihwbikpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB1dGlsLmZvcm1hdChwbiwgUGhvbmVOdW1iZXJGb3JtYXQuRTE2NCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE51bWJlclBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcm1hdCBhIHBob25lIG51bWJlci4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgZ2l2ZW4gbnVtYmVyIGRvZXNuJ3QgaGF2ZSB0aGUgY291bnRyeSBjb2RlLCB0aGUgcGhvbmUgd2lsbCBiZQorICAgICAqIGZvcm1hdHRlZCB0byB0aGUgZGVmYXVsdCBjb3VudHJ5J3MgY29udmVudGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwaG9uZU51bWJlcgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciB0byBiZSBmb3JtYXR0ZWQuCisgICAgICogQHBhcmFtIGRlZmF1bHRDb3VudHJ5SXNvCisgICAgICogICAgICAgICAgICB0aGUgSVNPIDMxNjYtMSB0d28gbGV0dGVycyBjb3VudHJ5IGNvZGUgd2hvc2UgY29udmVudGlvbiB3aWxsCisgICAgICogICAgICAgICAgICBiZSB1c2VkIGlmIHRoZSBnaXZlbiBudW1iZXIgZG9lc24ndCBoYXZlIHRoZSBjb3VudHJ5IGNvZGUuCisgICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIG51bWJlciwgb3IgbnVsbCBpZiB0aGUgZ2l2ZW4gbnVtYmVyIGlzIG5vdCB2YWxpZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0TnVtYmVyKFN0cmluZyBwaG9uZU51bWJlciwgU3RyaW5nIGRlZmF1bHRDb3VudHJ5SXNvKSB7CisgICAgICAgIFBob25lTnVtYmVyVXRpbCB1dGlsID0gUGhvbmVOdW1iZXJVdGlsLmdldEluc3RhbmNlKCk7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgUGhvbmVOdW1iZXIgcG4gPSB1dGlsLnBhcnNlQW5kS2VlcFJhd0lucHV0KHBob25lTnVtYmVyLCBkZWZhdWx0Q291bnRyeUlzbyk7CisgICAgICAgICAgICByZXN1bHQgPSB1dGlsLmZvcm1hdEluT3JpZ2luYWxGb3JtYXQocG4sIGRlZmF1bHRDb3VudHJ5SXNvKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9ybWF0IHRoZSBwaG9uZSBudW1iZXIgb25seSBpZiB0aGUgZ2l2ZW4gbnVtYmVyIGhhc24ndCBiZWVuIGZvcm1hdHRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbnVtYmVyIHdoaWNoIGhhcyBvbmx5IGRhaWxhYmxlIGNoYXJhY3RlciBpcyB0cmVhdGVkIGFzIG5vdCBiZWluZworICAgICAqIGZvcm1hdHRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwaG9uZU51bWJlcgorICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciB0byBiZSBmb3JtYXR0ZWQuCisgICAgICogQHBhcmFtIHBob25lTnVtYmVyRTE2NAorICAgICAqICAgICAgICAgICAgdGhlIEUxNjQgZm9ybWF0IG51bWJlciB3aG9zZSBjb3VudHJ5IGNvZGUgaXMgdXNlZCBpZiB0aGUgZ2l2ZW4KKyAgICAgKiAgICAgICAgICAgIHBob25lTnVtYmVyIGRvZXNuJ3QgaGF2ZSB0aGUgY291bnRyeSBjb2RlLgorICAgICAqIEBwYXJhbSBkZWZhdWx0Q291bnRyeUlzbworICAgICAqICAgICAgICAgICAgdGhlIElTTyAzMTY2LTEgdHdvIGxldHRlcnMgY291bnRyeSBjb2RlIHdob3NlIGNvbnZlbnRpb24gd2lsbAorICAgICAqICAgICAgICAgICAgYmUgdXNlZCBpZiB0aGUgcGhvbmVOdW1iZXJFMTY0IGlzIG51bGwgb3IgaW52YWxpZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZWQgbnVtYmVyIGlmIHRoZSBnaXZlbiBudW1iZXIgaGFzIGJlZW4gZm9ybWF0dGVkLAorICAgICAqICAgICAgICAgICAgb3RoZXJ3aXNlLCByZXR1cm4gdGhlIGdpdmVuIG51bWJlci4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0TnVtYmVyKAorICAgICAgICAgICAgU3RyaW5nIHBob25lTnVtYmVyLCBTdHJpbmcgcGhvbmVOdW1iZXJFMTY0LCBTdHJpbmcgZGVmYXVsdENvdW50cnlJc28pIHsKKyAgICAgICAgaW50IGxlbiA9IHBob25lTnVtYmVyLmxlbmd0aCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWlzRGlhbGFibGUocGhvbmVOdW1iZXIuY2hhckF0KGkpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBwaG9uZU51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQaG9uZU51bWJlclV0aWwgdXRpbCA9IFBob25lTnVtYmVyVXRpbC5nZXRJbnN0YW5jZSgpOworICAgICAgICAvLyBHZXQgdGhlIGNvdW50cnkgY29kZSBmcm9tIHBob25lTnVtYmVyRTE2NAorICAgICAgICBpZiAocGhvbmVOdW1iZXJFMTY0ICE9IG51bGwgJiYgcGhvbmVOdW1iZXJFMTY0Lmxlbmd0aCgpID49IDIKKyAgICAgICAgICAgICAgICAmJiBwaG9uZU51bWJlckUxNjQuY2hhckF0KDApID09ICcrJykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlciBwbiA9IHV0aWwucGFyc2UocGhvbmVOdW1iZXJFMTY0LCBkZWZhdWx0Q291bnRyeUlzbyk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJlZ2lvbkNvZGUgPSB1dGlsLmdldFJlZ2lvbkNvZGVGb3JOdW1iZXIocG4pOworICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocmVnaW9uQ29kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENvdW50cnlJc28gPSByZWdpb25Db2RlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlclBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZm9ybWF0TnVtYmVyKHBob25lTnVtYmVyLCBkZWZhdWx0Q291bnRyeUlzbyk7CisgICAgICAgIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6IHBob25lTnVtYmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vcm1hbGl6ZSBhIHBob25lIG51bWJlciBieSByZW1vdmluZyB0aGUgY2hhcmFjdGVycyBvdGhlciB0aGFuIGRpZ2l0cy4gSWYKKyAgICAgKiB0aGUgZ2l2ZW4gbnVtYmVyIGhhcyBrZXlwYWQgbGV0dGVycywgdGhlIGxldHRlcnMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8KKyAgICAgKiBkaWdpdHMgZmlyc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGhvbmVOdW1iZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgdG8gYmUgbm9ybWFsaXplZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBub3JtYWxpemVkIG51bWJlci4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplTnVtYmVyKFN0cmluZyBwaG9uZU51bWJlcikgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaW50IGxlbiA9IHBob25lTnVtYmVyLmxlbmd0aCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBwaG9uZU51bWJlci5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoKGkgPT0gMCAmJiBjID09ICcrJykgfHwgUGhvbmVOdW1iZXJVdGlscy5pc0lTT0RpZ2l0KGMpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOworICAgICAgICAgICAgfSBlbHNlIGlmICgoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICdBJyAmJiBjIDw9ICdaJykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplTnVtYmVyKFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cyhwaG9uZU51bWJlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKwogICAgIC8vIFRocmVlIGFuZCBmb3VyIGRpZ2l0IHBob25lIG51bWJlcnMgZm9yIGVpdGhlciBzcGVjaWFsIHNlcnZpY2VzLAogICAgIC8vIG9yIDMtNiBkaWdpdCBhZGRyZXNzZXMgZnJvbSB0aGUgbmV0d29yayAoZWcgY2Fycmllci1vcmlnaW5hdGVkIFNNUyBtZXNzYWdlcykgc2hvdWxkCiAgICAgLy8gbm90IG1hdGNoLgpAQCAtMTU0Niw3ICsxNjc3LDcgQEAKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nCi0gICAgY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoU3RyaW5nIGRpYWxTdHIsaW50IGN1cnJGb3JtYXQsaW50IGRlZmF1bHRGb3JtdCkgeworICAgIGNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KFN0cmluZyBkaWFsU3RyLGludCBjdXJyRm9ybWF0LGludCBkZWZhdWx0Rm9ybWF0KSB7CiAgICAgICAgIFN0cmluZyByZXRTdHIgPSBkaWFsU3RyOwogCiAgICAgICAgIC8vIENoZWNrcyBpZiB0aGUgcGx1cyBzaWduIGNoYXJhY3RlciBpcyBpbiB0aGUgcGFzc2VkLWluIGRpYWwgc3RyaW5nCkBAIC0xNTU0LDcgKzE2ODUsNyBAQAogICAgICAgICAgICAgZGlhbFN0ci5sYXN0SW5kZXhPZihQTFVTX1NJR05fU1RSSU5HKSAhPSAtMSkgewogICAgICAgICAgICAgLy8gRm9ybWF0IHRoZSBzdHJpbmcgYmFzZWQgb24gdGhlIHJ1bGVzIGZvciB0aGUgY291bnRyeSB0aGUgbnVtYmVyIGlzIGZyb20sCiAgICAgICAgICAgICAvLyBhbmQgdGhlIGN1cnJlbnQgY291bnRyeSB0aGUgcGhvbmUgaXMgY2FtcGVkIG9uLgotICAgICAgICAgICAgaWYgKChjdXJyRm9ybWF0ID09IGRlZmF1bHRGb3JtdCkgJiYgKGN1cnJGb3JtYXQgPT0gRk9STUFUX05BTlApKSB7CisgICAgICAgICAgICBpZiAoKGN1cnJGb3JtYXQgPT0gZGVmYXVsdEZvcm1hdCkgJiYgKGN1cnJGb3JtYXQgPT0gRk9STUFUX05BTlApKSB7CiAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGNhc2Ugd2hlcmUgZGVmYXVsdCBhbmQgY3VycmVudCB0ZWxlcGhvbmUgbnVtYmVyaW5nIHBsYW5zIGFyZSBOQU5QLgogICAgICAgICAgICAgICAgIFN0cmluZyBwb3N0RGlhbFN0ciA9IG51bGw7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHRlbXBEaWFsU3RyID0gZGlhbFN0cjsKQEAgLTE3NDEsNyArMTg3Miw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIGFwcGVuZHMgdGhlIG5vbi1kaWFibGFibGUgUC9XIGNoYXJhY3RlciB0byB0aGUgb3JpZ2luYWwKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGFwcGVuZHMgdGhlIG5vbi1kaWFsYWJsZSBQL1cgY2hhcmFjdGVyIHRvIHRoZSBvcmlnaW5hbAogICAgIC8vIGRpYWwgc3RyaW5nIGJhc2VkIG9uIHRoZSBkaWFsYWJsZSBpbmRleCBwYXNzZWQgaW4KICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcKICAgICBhcHBlbmRQd0NoYXJCYWNrVG9PcmlnRGlhbFN0cihpbnQgZGlhbGFibGVJbmRleCxTdHJpbmcgb3JpZ1N0ciwgU3RyaW5nIGRpYWxTdHIpIHsKQEAgLTE3NjEsNyArMTg5Miw3IEBACiAgICAgICAgIHJldHVybiByZXRTdHI7CiAgICAgfQogCi0gICAgLy89PT09PSBCZWdpbmluZyBvZiB1dGlsaXR5IG1ldGhvZHMgdXNlZCBpbiBjb21wYXJlTG9vc2VseSgpID09PT09CisgICAgLy89PT09PSBCZWdpbm5pbmcgb2YgdXRpbGl0eSBtZXRob2RzIHVzZWQgaW4gY29tcGFyZUxvb3NlbHkoKSA9PT09PQogCiAgICAgLyoqCiAgICAgICogUGhvbmUgbnVtYmVycyBhcmUgc3RvcmVkIGluICJsb29rdXAiIGZvcm0gaW4gdGhlIGRhdGFiYXNlCkBAIC0xODgzLDEyICsyMDE0LDEyIEBACiAKICAgICAvLz09PT09IEVuZCBvZiB1dGlsaXR5IG1ldGhvZHMgdXNlZCBvbmx5IGluIGNvbXBhcmVMb29zZWx5KCkgPT09PT0KIAotICAgIC8vPT09PT0gQmVnZ2luaW5nIG9mIHV0aWxpdHkgbWV0aG9kcyB1c2VkIG9ubHkgaW4gY29tcGFyZVN0cmljdGx5KCkgPT09PQorICAgIC8vPT09PT0gQmVnaW5uaW5nIG9mIHV0aWxpdHkgbWV0aG9kcyB1c2VkIG9ubHkgaW4gY29tcGFyZVN0cmljdGx5KCkgPT09PQogCiAgICAgLyoKICAgICAgKiBJZiB0cnVlLCB0aGUgbnVtYmVyIGlzIGNvdW50cnkgY2FsbGluZyBjb2RlLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ09VTlRMWV9DQUxMSU5HX0NBTExbXSA9IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIENPVU5UUllfQ0FMTElOR19DQUxMW10gPSB7CiAgICAgICAgIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLAogICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwKICAgICAgICAgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsCkBAIC0xOTAwLDE4ICsyMDMxLDE4IEBACiAgICAgICAgIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlLAogICAgICAgICB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLAogICAgIH07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENDQ19MRU5HVEggPSBDT1VOVExZX0NBTExJTkdfQ0FMTC5sZW5ndGg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENDQ19MRU5HVEggPSBDT1VOVFJZX0NBTExJTkdfQ0FMTC5sZW5ndGg7CiAKICAgICAvKioKICAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiBpbnB1dCBpcyB2YWxpZCBDb3VudHJ5IENhbGxpbmcgQ29kZS4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ291bnRyeUNhbGxpbmdDb2RlKGludCBjb3VudHJ5Q2FsbGluZ0NvZGVDYW5kaWRhdGUpIHsKICAgICAgICAgcmV0dXJuIGNvdW50cnlDYWxsaW5nQ29kZUNhbmRpZGF0ZSA+IDAgJiYgY291bnRyeUNhbGxpbmdDb2RlQ2FuZGlkYXRlIDwgQ0NDX0xFTkdUSCAmJgotICAgICAgICAgICAgICAgIENPVU5UTFlfQ0FMTElOR19DQUxMW2NvdW50cnlDYWxsaW5nQ29kZUNhbmRpZGF0ZV07CisgICAgICAgICAgICAgICAgQ09VTlRSWV9DQUxMSU5HX0NBTExbY291bnRyeUNhbGxpbmdDb2RlQ2FuZGlkYXRlXTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIGludGVyZ2VyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IGlmIGlucHV0ICJjaCIgaXMKKyAgICAgKiBSZXR1cm5zIGludGVnZXIgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgaWYgaW5wdXQgImNoIiBpcwogICAgICAqIElTTy1MQVRJTiBjaGFyYWN0ZXJzIDAtOS4KICAgICAgKiBSZXR1cm5zIC0xIG90aGVyd2lzZQogICAgICAqLwpAQCAtMjA0Niw3ICsyMTc3LDcgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBwcmVmaXggb2YgInN0ciIgaXMgImlnbm9yYWJsZSIuIEhlcmUsICJpZ25vcmFibGUiIG1lYW5zCi0gICAgICogdGhhdCAic3RyIiBoYXMgb25seSBvbmUgZGlnaXQgYW5kIHNlcGFyYXRlciBjaGFyYWN0ZXJzLiBUaGUgb25lIGRpZ2l0IGlzCisgICAgICogdGhhdCAic3RyIiBoYXMgb25seSBvbmUgZGlnaXQgYW5kIHNlcGFyYXRvciBjaGFyYWN0ZXJzLiBUaGUgb25lIGRpZ2l0IGlzCiAgICAgICogYXNzdW1lZCB0byBiZSB0cnVuayBwcmVmaXguCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVja1ByZWZpeElzSWdub3JhYmxlKGZpbmFsIFN0cmluZyBzdHIsCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZVN0YXRlTGlzdGVuZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lU3RhdGVMaXN0ZW5lci5qYXZhCmluZGV4IDgzMGFmNDcuLjM4ZjQ0ZDggMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lU3RhdGVMaXN0ZW5lci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lU3RhdGVMaXN0ZW5lci5qYXZhCkBAIC0yNSw2ICsyNSw3IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JUGhvbmVTdGF0ZUxpc3RlbmVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZTsKIAogLyoqCiAgKiBBIGxpc3RlbmVyIGNsYXNzIGZvciBtb25pdG9yaW5nIGNoYW5nZXMgaW4gc3BlY2lmaWMgdGVsZXBob255IHN0YXRlcwpAQCAtMjg0LDcgKzI4NSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBvbkRhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSwgaW50IG5ldHdvcmtUeXBlKSB7Ci0gICAgICAgICAgICBNZXNzYWdlLm9idGFpbihtSGFuZGxlciwgTElTVEVOX0RBVEFfQ09OTkVDVElPTl9TVEFURSwgc3RhdGUsIG5ldHdvcmtUeXBlLCBudWxsKS4KKyAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1IYW5kbGVyLCBMSVNURU5fREFUQV9DT05ORUNUSU9OX1NUQVRFLCBzdGF0ZSwgbmV0d29ya1R5cGUpLgogICAgICAgICAgICAgICAgICAgICBzZW5kVG9UYXJnZXQoKTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNYW5hZ2VyLmphdmEKaW5kZXggZjVlOTc1MS4uOTUzNjk2YiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01hbmFnZXIuamF2YQpAQCAtMjEsNyArMjEsNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5FbmNvZGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklTbXM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0NvbnN0YW50czsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zUmF3RGF0YTsKQEAgLTMzLDcgKzMyLDcgQEAKIC8qCiAgKiBUT0RPKGNvZGUgcmV2aWV3KTogQ3VyaW91cyBxdWVzdGlvbi4uLiBXaHkgYXJlIGEgbG90IG9mIHRoZXNlCiAgKiBtZXRob2RzIG5vdCBkZWNsYXJlZCBhcyBzdGF0aWMsIHNpbmNlIHRoZXkgZG8gbm90IHNlZW0gdG8gcmVxdWlyZQotICogYW55IGxvY2FsIG9iamVjdCBzdGF0ZT8gIEFzc3VtZWRseSB0aGlzIGNhbm5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQKKyAqIGFueSBsb2NhbCBvYmplY3Qgc3RhdGU/ICBQcmVzdW1hYmx5IHRoaXMgY2Fubm90IGJlIGNoYW5nZWQgd2l0aG91dAogICogaW50ZXJmZXJpbmcgd2l0aCB0aGUgQVBJLi4uCiAgKi8KIApAQCAtNDIsNyArNDEsOCBAQAogICogR2V0IHRoaXMgb2JqZWN0IGJ5IGNhbGxpbmcgdGhlIHN0YXRpYyBtZXRob2QgU21zTWFuYWdlci5nZXREZWZhdWx0KCkuCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBTbXNNYW5hZ2VyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBTbXNNYW5hZ2VyIHNJbnN0YW5jZTsKKyAgICAvKiogU2luZ2xldG9uIG9iamVjdCBjb25zdHJ1Y3RlZCBkdXJpbmcgY2xhc3MgaW5pdGlhbGl6YXRpb24uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU21zTWFuYWdlciBzSW5zdGFuY2UgPSBuZXcgU21zTWFuYWdlcigpOwogCiAgICAgLyoqCiAgICAgICogU2VuZCBhIHRleHQgYmFzZWQgU01TLgpAQCAtNTIsOCArNTIsOCBAQAogICAgICAqICB0aGUgY3VycmVudCBkZWZhdWx0IFNNU0MKICAgICAgKiBAcGFyYW0gdGV4dCB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZSB0byBzZW5kCiAgICAgICogQHBhcmFtIHNlbnRJbnRlbnQgaWYgbm90IE5VTEwgdGhpcyA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPiBpcwotICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCi0gICAgICogIFRoZSByZXN1bHQgY29kZSB3aWxsIGJlIDxjb2RlPkFjdGl2aXR5LlJFU1VMVF9PSzxjb2RlPiBmb3Igc3VjY2VzcywKKyAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjY2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KKyAgICAgKiAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPC9jb2RlPiBmb3Igc3VjY2VzcywKICAgICAgKiAgb3Igb25lIG9mIHRoZXNlIGVycm9yczo8YnI+CiAgICAgICogIDxjb2RlPlJFU1VMVF9FUlJPUl9HRU5FUklDX0ZBSUxVUkU8L2NvZGU+PGJyPgogICAgICAqICA8Y29kZT5SRVNVTFRfRVJST1JfUkFESU9fT0ZGPC9jb2RlPjxicj4KQEAgLTExNiw3ICsxMTYsNyBAQAogICAgICAqIEBwYXJhbSBzZW50SW50ZW50cyBpZiBub3QgbnVsbCwgYW4gPGNvZGU+QXJyYXlMaXN0PC9jb2RlPiBvZgogICAgICAqICAgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT5zIChvbmUgZm9yIGVhY2ggbWVzc2FnZSBwYXJ0KSB0aGF0IGlzCiAgICAgICogICBicm9hZGNhc3Qgd2hlbiB0aGUgY29ycmVzcG9uZGluZyBtZXNzYWdlIHBhcnQgaGFzIGJlZW4gc2VudC4KLSAgICAgKiAgIFRoZSByZXN1bHQgY29kZSB3aWxsIGJlIDxjb2RlPkFjdGl2aXR5LlJFU1VMVF9PSzxjb2RlPiBmb3Igc3VjY2VzcywKKyAgICAgKiAgIFRoZSByZXN1bHQgY29kZSB3aWxsIGJlIDxjb2RlPkFjdGl2aXR5LlJFU1VMVF9PSzwvY29kZT4gZm9yIHN1Y2Nlc3MsCiAgICAgICogICBvciBvbmUgb2YgdGhlc2UgZXJyb3JzOjxicj4KICAgICAgKiAgIDxjb2RlPlJFU1VMVF9FUlJPUl9HRU5FUklDX0ZBSUxVUkU8L2NvZGU+PGJyPgogICAgICAqICAgPGNvZGU+UkVTVUxUX0VSUk9SX1JBRElPX09GRjwvY29kZT48YnI+CkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICAgKiAgIHRoZSBleHRyYSAiZXJyb3JDb2RlIiBjb250YWluaW5nIGEgcmFkaW8gdGVjaG5vbG9neSBzcGVjaWZpYyB2YWx1ZSwKICAgICAgKiAgIGdlbmVyYWxseSBvbmx5IHVzZWZ1bCBmb3IgdHJvdWJsZXNob290aW5nLjxicj4KICAgICAgKiAgIFRoZSBwZXItYXBwbGljYXRpb24gYmFzZWQgU01TIGNvbnRyb2wgY2hlY2tzIHNlbnRJbnRlbnQuIElmIHNlbnRJbnRlbnQKLSAgICAgKiAgIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhaXRvbnMsCisgICAgICogICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYXRpb25zLAogICAgICAqICAgd2hpY2ggY2F1c2Ugc21hbGxlciBudW1iZXIgb2YgU01TIHRvIGJlIHNlbnQgaW4gY2hlY2tpbmcgcGVyaW9kLgogICAgICAqIEBwYXJhbSBkZWxpdmVyeUludGVudHMgaWYgbm90IG51bGwsIGFuIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gb2YKICAgICAgKiAgIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+cyAob25lIGZvciBlYWNoIG1lc3NhZ2UgcGFydCkgdGhhdCBpcwpAQCAtMTc4LDggKzE3OCw4IEBACiAgICAgICogQHBhcmFtIGRlc3RpbmF0aW9uUG9ydCB0aGUgcG9ydCB0byBkZWxpdmVyIHRoZSBtZXNzYWdlIHRvCiAgICAgICogQHBhcmFtIGRhdGEgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UgdG8gc2VuZAogICAgICAqIEBwYXJhbSBzZW50SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT4gaXMKLSAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgotICAgICAqICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8Y29kZT4gZm9yIHN1Y2Nlc3MsCisgICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Nlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCisgICAgICogIFRoZSByZXN1bHQgY29kZSB3aWxsIGJlIDxjb2RlPkFjdGl2aXR5LlJFU1VMVF9PSzwvY29kZT4gZm9yIHN1Y2Nlc3MsCiAgICAgICogIG9yIG9uZSBvZiB0aGVzZSBlcnJvcnM6PGJyPgogICAgICAqICA8Y29kZT5SRVNVTFRfRVJST1JfR0VORVJJQ19GQUlMVVJFPC9jb2RlPjxicj4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX1JBRElPX09GRjwvY29kZT48YnI+CkBAIC0xODgsNyArMTg4LDcgQEAKICAgICAgKiAgdGhlIGV4dHJhICJlcnJvckNvZGUiIGNvbnRhaW5pbmcgYSByYWRpbyB0ZWNobm9sb2d5IHNwZWNpZmljIHZhbHVlLAogICAgICAqICBnZW5lcmFsbHkgb25seSB1c2VmdWwgZm9yIHRyb3VibGVzaG9vdGluZy48YnI+CiAgICAgICogIFRoZSBwZXItYXBwbGljYXRpb24gYmFzZWQgU01TIGNvbnRyb2wgY2hlY2tzIHNlbnRJbnRlbnQuIElmIHNlbnRJbnRlbnQKLSAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2FpdG9ucywKKyAgICAgKiAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2F0aW9ucywKICAgICAgKiAgd2hpY2ggY2F1c2Ugc21hbGxlciBudW1iZXIgb2YgU01TIHRvIGJlIHNlbnQgaW4gY2hlY2tpbmcgcGVyaW9kLgogICAgICAqIEBwYXJhbSBkZWxpdmVyeUludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+IGlzCiAgICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIGRlbGl2ZXJlZCB0byB0aGUgcmVjaXBpZW50LiAgVGhlCkBAIC0yMjQsOSArMjI0LDYgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGluc3RhbmNlIG9mIHRoZSBTbXNNYW5hZ2VyCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTbXNNYW5hZ2VyIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIGlmIChzSW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgc0luc3RhbmNlID0gbmV3IFNtc01hbmFnZXIoKTsKLSAgICAgICAgfQogICAgICAgICByZXR1cm4gc0luc3RhbmNlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWVzc2FnZS5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWVzc2FnZS5qYXZhCmluZGV4IGEyODRlYTUuLjA3NDY1NjIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01lc3NhZ2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNZXNzYWdlLmphdmEKQEAgLTIwLDcgKzIwLDYgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkdzbUFscGhhYmV0OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5FbmNvZGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc0hlYWRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zTWVzc2FnZUJhc2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc01lc3NhZ2VCYXNlLlN1Ym1pdFBkdUJhc2U7CkBAIC01NCw2ICs1MywxMCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQ09ESU5HXzdCSVQgPSAxOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQ09ESU5HXzhCSVQgPSAyOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQ09ESU5HXzE2QklUID0gMzsKKyAgICAvKioKKyAgICAgKiBAaGlkZSBUaGlzIHZhbHVlIGlzIG5vdCBkZWZpbmVkIGluIGdsb2JhbCBzdGFuZGFyZC4gT25seSBpbiBLb3JlYSwgdGhpcyBpcyB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQ09ESU5HX0tTQzU2MDEgPSA0OwogCiAgICAgLyoqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwYXlsb2FkIGJ5dGVzIHBlciBtZXNzYWdlICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1VTRVJfREFUQV9CWVRFUyA9IDE0MDsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1RlbGVwaG9ueU1hbmFnZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1RlbGVwaG9ueU1hbmFnZXIuamF2YQppbmRleCAyN2UwOGQ0Li4yMzcwYWRkIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9UZWxlcGhvbnlNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvVGVsZXBob255TWFuYWdlci5qYXZhCkBAIC05MTIsNCArOTEyLDI1IEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY3VycmVudCBkZXZpY2UgaXMgInZvaWNlIGNhcGFibGUiLgorICAgICAqIDxwPgorICAgICAqICJWb2ljZSBjYXBhYmxlIiBtZWFucyB0aGF0IHRoaXMgZGV2aWNlIHN1cHBvcnRzIGNpcmN1aXQtc3dpdGNoZWQKKyAgICAgKiAoaS5lLiB2b2ljZSkgcGhvbmUgY2FsbHMgb3ZlciB0aGUgdGVsZXBob255IG5ldHdvcmssIGFuZCBpcyBhbGxvd2VkCisgICAgICogdG8gZGlzcGxheSB0aGUgaW4tY2FsbCBVSSB3aGlsZSBhIGNlbGx1bGFyIHZvaWNlIGNhbGwgaXMgYWN0aXZlLgorICAgICAqIFRoaXMgd2lsbCBiZSBmYWxzZSBvbiAiZGF0YSBvbmx5IiBkZXZpY2VzIHdoaWNoIGNhbid0IG1ha2Ugdm9pY2UKKyAgICAgKiBjYWxscyBhbmQgZG9uJ3Qgc3VwcG9ydCBhbnkgaW4tY2FsbCBVSS4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlOiB0aGUgbWVhbmluZyBvZiB0aGlzIGZsYWcgaXMgc3VidGx5IGRpZmZlcmVudCBmcm9tIHRoZQorICAgICAqIFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVEVMRVBIT05ZIHN5c3RlbSBmZWF0dXJlLCB3aGljaCBpcyBhdmFpbGFibGUKKyAgICAgKiBvbiBhbnkgZGV2aWNlIHdpdGggYSB0ZWxlcGhvbnkgcmFkaW8sIGV2ZW4gaWYgdGhlIGRldmljZSBpcworICAgICAqIGRhdGEtb25seS4KKyAgICAgKgorICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIHJldmlldworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVm9pY2VDYXBhYmxlKCkgeworICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmJvb2wuY29uZmlnX3ZvaWNlX2NhcGFibGUpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsZXJJbmZvLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbGVySW5mby5qYXZhCmluZGV4IGNmODk4NDguLjZlMTM2OTAgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsZXJJbmZvLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxlckluZm8uamF2YQpAQCAtNzAsNiArNzAsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKICAgICBwdWJsaWMgU3RyaW5nIHBob25lTnVtYmVyOworICAgIHB1YmxpYyBTdHJpbmcgbm9tYWxpemVkTnVtYmVyOwogCiAgICAgcHVibGljIFN0cmluZyBjbmFwTmFtZTsKICAgICBwdWJsaWMgaW50IG51bWJlclByZXNlbnRhdGlvbjsKQEAgLTE1MCw2ICsxNTEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgaW5mby5waG9uZU51bWJlciA9IGN1cnNvci5nZXRTdHJpbmcoY29sdW1uSW5kZXgpOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIC8vIExvb2sgZm9yIHRoZSBub3JtYWxpemVkIG51bWJlcgorICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KFBob25lTG9va3VwLk5PUk1BTElaRURfTlVNQkVSKTsKKyAgICAgICAgICAgICAgICBpZiAoY29sdW1uSW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5ub21hbGl6ZWROdW1iZXIgPSBjdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAvLyBMb29rIGZvciB0aGUgbGFiZWwvdHlwZSBjb21ibwogICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KFBob25lTG9va3VwLkxBQkVMKTsKICAgICAgICAgICAgICAgICBpZiAoY29sdW1uSW5kZXggIT0gLTEpIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsZXJJbmZvQXN5bmNRdWVyeS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxlckluZm9Bc3luY1F1ZXJ5LmphdmEKaW5kZXggMjVjYTU1OS4uYTk2Nzg1MCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxlckluZm9Bc3luY1F1ZXJ5LmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxlckluZm9Bc3luY1F1ZXJ5LmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnlEZXRlY3RvcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwpAQCAtMjMyLDcgKzIzMywxMSBAQAogCiAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgbnVtYmVyIGVudGVyZWQgYnkgdGhlIHVzZXIgZm9yIGRpc3BsYXkuCiAgICAgICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoY3cubnVtYmVyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxlckluZm8ucGhvbmVOdW1iZXIgPSBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcihjdy5udW1iZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRyeURldGVjdG9yIGRldGVjdG9yID0gKENvdW50cnlEZXRlY3RvcikgbVF1ZXJ5Q29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkNPVU5UUllfREVURUNUT1IpOworICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxlckluZm8ucGhvbmVOdW1iZXIgPSBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcihjdy5udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsZXJJbmZvLm5vbWFsaXplZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpLmdldENvdW50cnlJc28oKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Db21tYW5kc0ludGVyZmFjZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NvbW1hbmRzSW50ZXJmYWNlLmphdmEKaW5kZXggNWRlMDQyNi4uMjdhNGRjYSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NvbW1hbmRzSW50ZXJmYWNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NvbW1hbmRzSW50ZXJmYWNlLmphdmEKQEAgLTI3LDggKzI3LDggQEAKICAqLwogcHVibGljIGludGVyZmFjZSBDb21tYW5kc0ludGVyZmFjZSB7CiAgICAgZW51bSBSYWRpb1N0YXRlIHsKLSAgICAgICAgUkFESU9fT0ZGLCAgICAgICAgIC8qIFJhZGlvIGV4cGxpY3RseSBwb3dlcmVkIG9mZiAoZWcgQ0ZVTj0wKSAqLwotICAgICAgICBSQURJT19VTkFWQUlMQUJMRSwgLyogUmFkaW8gdW5hdmFpbGFibGUgKGVnLCByZXNldHRpbmcgb3Igbm90IGJvb3RlZCkgKi8KKyAgICAgICAgUkFESU9fT0ZGLCAgICAgICAgIC8qIFJhZGlvIGV4cGxpY2l0bHkgcG93ZXJlZCBvZmYgKGUuZy4gQ0ZVTj0wKSAqLworICAgICAgICBSQURJT19VTkFWQUlMQUJMRSwgLyogUmFkaW8gdW5hdmFpbGFibGUgKGUuZy4gcmVzZXR0aW5nIG9yIG5vdCBib290ZWQpICovCiAgICAgICAgIFNJTV9OT1RfUkVBRFksICAgICAvKiBSYWRpbyBpcyBvbiwgYnV0IHRoZSBTSU0gaW50ZXJmYWNlIGlzIG5vdCByZWFkeSAqLwogICAgICAgICBTSU1fTE9DS0VEX09SX0FCU0VOVCwgIC8qIFNJTSBQSU4gbG9ja2VkLCBQVUsgcmVxdWlyZWQsIG5ldHdvcmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzb25hbGl6YXRpb24sIG9yIFNJTSBhYnNlbnQgKi8KQEAgLTEyMSw3ICsxMjEsNyBAQAogICAgIC8vIFNlZSAyNy4wMDcgK0NDRkMgb3IgK0NMQ0sKICAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfTk9ORSAgICAgPSAwOyAvLyBubyB1c2VyIGlucHV0CiAgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX1ZPSUNFICAgID0gKDEgPDwgMCk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX0RBVEEgICAgID0gKDEgPDwgMSk7IC8vc3lub3ltIGZvciAxNiszMis2NCsxMjgKKyAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfREFUQSAgICAgPSAoMSA8PCAxKTsgLy9zeW5vbnltIGZvciAxNiszMis2NCsxMjgKICAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfRkFYICAgICAgPSAoMSA8PCAyKTsKICAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfU01TICAgICAgPSAoMSA8PCAzKTsKICAgICBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfQ0xBU1NfREFUQV9TWU5DID0gKDEgPDwgNCk7CkBAIC05NTIsMTkgKzk1MiwxOSBAQAogICAgIHZvaWQgd3JpdGVTbXNUb1J1aW0oaW50IHN0YXR1cywgU3RyaW5nIHBkdSwgTWVzc2FnZSByZXNwb25zZSk7CiAKICAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZAogICAgICAqIEBwYXJhbSBhcG4KICAgICAgKiBAcGFyYW0gdXNlcgogICAgICAqIEBwYXJhbSBwYXNzd29yZAogICAgICAqIEBwYXJhbSByZXNwb25zZQogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgdm9pZCBzZXR1cERlZmF1bHRQRFAoU3RyaW5nIGFwbiwgU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCwgTWVzc2FnZSByZXNwb25zZSk7CiAKICAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZAogICAgICAqIEBwYXJhbSBjaWQKICAgICAgKiBAcGFyYW0gcmVzcG9uc2UKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHZvaWQgZGVhY3RpdmF0ZURlZmF1bHRQRFAoaW50IGNpZCwgTWVzc2FnZSByZXNwb25zZSk7CiAKICAgICB2b2lkIHNldFJhZGlvUG93ZXIoYm9vbGVhbiBvbiwgTWVzc2FnZSByZXNwb25zZSk7CkBAIC05NzQsNyArOTc0LDcgQEAKICAgICB2b2lkIGFja25vd2xlZGdlTGFzdEluY29taW5nQ2RtYVNtcyhib29sZWFuIHN1Y2Nlc3MsIGludCBjYXVzZSwgTWVzc2FnZSByZXNwb25zZSk7CiAKICAgICAvKioKLSAgICAgKiBwYXJhbWV0ZXJzIGVxdWl2aWxpZW50IHRvIDI3LjAwNyBBVCtDUlNNIGNvbW1hbmQKKyAgICAgKiBwYXJhbWV0ZXJzIGVxdWl2YWxlbnQgdG8gMjcuMDA3IEFUK0NSU00gY29tbWFuZAogICAgICAqIHJlc3BvbnNlLm9iaiB3aWxsIGJlIGFuIEFzeW5jUmVzdWx0CiAgICAgICogcmVzcG9uc2Uub2JqLnVzZXJPYmogd2lsbCBiZSBhIEljY0lvUmVzdWx0IG9uIHN1Y2Nlc3MKICAgICAgKi8KQEAgLTEwNzksNyArMTA3OSw3IEBACiAKICAgICAvKioKICAgICAgKiAoQXN5bmNSZXN1bHQpcmVzcG9uc2Uub2JqKS5yZXN1bHQgd2lsbCBiZSBhbiBJbnRlZ2VyIHJlcHJlc2VudGluZwotICAgICAqIHRoZSBzdW0gb2YgZW5hYmxlZCBzZXJpdmljZSBjbGFzc2VzIChzdW0gb2YgU0VSVklDRV9DTEFTU18qKQorICAgICAqIHRoZSBzdW0gb2YgZW5hYmxlZCBzZXJ2aWNlIGNsYXNzZXMgKHN1bSBvZiBTRVJWSUNFX0NMQVNTXyopCiAgICAgICoKICAgICAgKiBAcGFyYW0gZmFjaWxpdHkgb25lIG9mIENCX0ZBQ0lMVFlfKgogICAgICAqIEBwYXJhbSBwYXNzd29yZCBwYXNzd29yZCBvciAiIiBpZiBub3QgcmVxdWlyZWQKQEAgLTExNTIsNyArMTE1Miw3IEBACiAKICAgICAvKioKICAgICAgKiBSZXF1ZXN0IHRvIGVuYWJsZS9kaXNhYmxlIG5ldHdvcmsgc3RhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbnMgd2hlbgotICAgICAqIGxvY2F0aW9uIGluZm9ybWF0ZWlvbiAobGFjIGFuZC9vciBjaWQpIGhhcyBjaGFuZ2VkLgorICAgICAqIGxvY2F0aW9uIGluZm9ybWF0aW9uIChsYWMgYW5kL29yIGNpZCkgaGFzIGNoYW5nZWQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZW5hYmxlIHRydWUgdG8gZW5hYmxlLCBmYWxzZSB0byBkaXNhYmxlCiAgICAgICogQHBhcmFtIHJlc3BvbnNlIGNhbGxiYWNrIG1lc3NhZ2UKQEAgLTExODMsNyArMTE4Myw3IEBACiAKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgdG8gdGhlIHZlbmRvciByaWwgdGhhdCBTdGtTZXJ2aWNlIGlzIHJ1bm5pbmcKLSAgICAgKiByYW5kIGlzIGVhZHkgdG8gcmVjZWl2ZSBSSUxfVU5TT0xfU1RLX1hYWFggY29tbWFuZHMuCisgICAgICogYW5kIGlzIHJlYWR5IHRvIHJlY2VpdmUgUklMX1VOU09MX1NUS19YWFhYIGNvbW1hbmRzLgogICAgICAqCiAgICAgICogQHBhcmFtIHJlc3VsdCBjYWxsYmFjayBtZXNzYWdlCiAgICAgICovCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb24uamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvbi5qYXZhCmluZGV4IDY2MzQwMTcuLjE4NWQ0MTMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvbi5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvbi5qYXZhCkBAIC0yMSwxMSArMjEsMjAgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhpZXJhcmNoaWNhbFN0YXRlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOwogCitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua0FkZHJlc3M7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua0NhcGFiaWxpdGllczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW50ZXJmYWNlQWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlOworaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKKwogLyoqCiAgKiB7QGhpZGV9CiAgKgpAQCAtNjAsNyArNjksNyBAQAogICogICAgICAgIEVWRU5UX0dFVF9MQVNUX0ZBSUxfRE9ORSwKICAqICAgICAgICBFVkVOVF9ERUFDVElWQVRFX0RPTkUuCiAgKiAgICAgfQotICogICArKyAjIG1JbmFjdGl2ZVN0YXRlIAorICogICArKyAjIG1JbmFjdGl2ZVN0YXRlCiAgKiAgICAgICAgZShkb05vdGlmaWNhdGlvbnMpCiAgKiAgICAgICAgeChjbGVhck5vdGlmaWNhdGlvbnMpIHsKICAqICAgICAgICAgICAgRVZFTlRfUkVTRVQgeyBub3RpZml5RGlzY29ubmVjdENvbXBsZXRlZCB9LgpAQCAtMjU1LDEwICsyNjQsOCBAQAogICAgIHByb3RlY3RlZCBpbnQgbVRhZzsKICAgICBwcm90ZWN0ZWQgUGhvbmVCYXNlIHBob25lOwogICAgIHByb3RlY3RlZCBpbnQgY2lkOwotICAgIHByb3RlY3RlZCBTdHJpbmcgaW50ZXJmYWNlTmFtZTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGlwQWRkcmVzczsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdhdGV3YXlBZGRyZXNzOwotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBkbnNTZXJ2ZXJzOworICAgIHByb3RlY3RlZCBMaW5rUHJvcGVydGllcyBtTGlua1Byb3BlcnRpZXMgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKKyAgICBwcm90ZWN0ZWQgTGlua0NhcGFiaWxpdGllcyBtQ2FwYWJpbGl0aWVzID0gbmV3IExpbmtDYXBhYmlsaXRpZXMoKTsKICAgICBwcm90ZWN0ZWQgbG9uZyBjcmVhdGVUaW1lOwogICAgIHByb3RlY3RlZCBsb25nIGxhc3RGYWlsVGltZTsKICAgICBwcm90ZWN0ZWQgRmFpbENhdXNlIGxhc3RGYWlsQ2F1c2U7CkBAIC0yODMsOCArMjkwLDYgQEAKICAgICAgICAgaWYgKERCRykgbG9nKCJEYXRhQ29ubmVjdGlvbiBjb25zdHJ1Y3RvciBFIik7CiAgICAgICAgIHRoaXMucGhvbmUgPSBwaG9uZTsKICAgICAgICAgdGhpcy5jaWQgPSAtMTsKLSAgICAgICAgdGhpcy5kbnNTZXJ2ZXJzID0gbmV3IFN0cmluZ1syXTsKLQogICAgICAgICBjbGVhclNldHRpbmdzKCk7CiAKICAgICAgICAgc2V0RGJnKGZhbHNlKTsKQEAgLTM3NywxMSArMzgyLDcgQEAKICAgICAgICAgdGhpcy5sYXN0RmFpbFRpbWUgPSAtMTsKICAgICAgICAgdGhpcy5sYXN0RmFpbENhdXNlID0gRmFpbENhdXNlLk5PTkU7CiAKLSAgICAgICAgaW50ZXJmYWNlTmFtZSA9IG51bGw7Ci0gICAgICAgIGlwQWRkcmVzcyA9IG51bGw7Ci0gICAgICAgIGdhdGV3YXlBZGRyZXNzID0gbnVsbDsKLSAgICAgICAgZG5zU2VydmVyc1swXSA9IG51bGw7Ci0gICAgICAgIGRuc1NlcnZlcnNbMV0gPSBudWxsOworICAgICAgICBtTGlua1Byb3BlcnRpZXMgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQxNiwzNSArNDE3LDY3IEBACiAvLyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzcG9uc2UubGVuZ3RoOyBpKyspIHsKIC8vICAgICAgICAgICAgICAgIGxvZygiICByZXNwb25zZVsiICsgaSArICJdPSciICsgcmVzcG9uc2VbaV0gKyAiJyIpOwogLy8gICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFN0YXJ0IHdpdGggY2xlYW4gbmV0d29yayBwcm9wZXJ0aWVzIGFuZCBpZiB3ZSBoYXZlCisgICAgICAgICAgICAvLyBhIGZhaWx1cmUgd2UnbGwgY2xlYXIgYWdhaW4gYXQgdGhlIGJvdHRvbSBvZiB0aGlzIGNvZGUuCisgICAgICAgICAgICBMaW5rUHJvcGVydGllcyBsaW5rUHJvcGVydGllcyA9IG5ldyBMaW5rUHJvcGVydGllcygpOwogICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmxlbmd0aCA+PSAyKSB7CiAgICAgICAgICAgICAgICAgY2lkID0gSW50ZWdlci5wYXJzZUludChyZXNwb25zZVswXSk7Ci0gICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZSA9IHJlc3BvbnNlWzFdOwotICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5sZW5ndGggPiAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlwQWRkcmVzcyA9IHJlc3BvbnNlWzJdOworICAgICAgICAgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lID0gcmVzcG9uc2VbMV07CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gU2V0dXBSZXN1bHQuU1VDQ0VTUzsKKworICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAibmV0LiIgKyBpbnRlcmZhY2VOYW1lICsgIi4iOwotICAgICAgICAgICAgICAgICAgICBnYXRld2F5QWRkcmVzcyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KHByZWZpeCArICJndyIpOworCisgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtJbnRlcmZhY2UgbmV0d29ya0ludGVyZmFjZSA9IE5ldHdvcmtJbnRlcmZhY2UuZ2V0QnlOYW1lKGludGVyZmFjZU5hbWUpOworICAgICAgICAgICAgICAgICAgICBsaW5rUHJvcGVydGllcy5zZXRJbnRlcmZhY2VOYW1lKGludGVyZmFjZU5hbWUpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEdldCBnYXRld2F5IGFuZCBkbnMgdmlhIFJJTCBpbnRlcmZhY2Ugbm90IHByb3BlcnR5PworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZ2F0ZXdheUFkZHJlc3MgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChwcmVmaXggKyAiZ3ciKTsKKyAgICAgICAgICAgICAgICAgICAgbGlua1Byb3BlcnRpZXMuc2V0R2F0ZXdheShJbmV0QWRkcmVzcy5nZXRCeU5hbWUoZ2F0ZXdheUFkZHJlc3MpKTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKEludGVyZmFjZUFkZHJlc3MgYWRkciA6IG5ldHdvcmtJbnRlcmZhY2UuZ2V0SW50ZXJmYWNlQWRkcmVzc2VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtQcm9wZXJ0aWVzLmFkZExpbmtBZGRyZXNzKG5ldyBMaW5rQWRkcmVzcyhhZGRyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogR2V0IGdhdGV3YXkgYW5kIGRucyB2aWEgUklMIGludGVyZmFjZSBub3QgcHJvcGVydHk/CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkbnNTZXJ2ZXJzW10gPSBuZXcgU3RyaW5nWzJdOwogICAgICAgICAgICAgICAgICAgICBkbnNTZXJ2ZXJzWzBdID0gU3lzdGVtUHJvcGVydGllcy5nZXQocHJlZml4ICsgImRuczEiKTsKICAgICAgICAgICAgICAgICAgICAgZG5zU2VydmVyc1sxXSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KHByZWZpeCArICJkbnMyIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiaW50ZXJmYWNlPSIgKyBpbnRlcmZhY2VOYW1lICsgIiBpcEFkZHJlc3M9IiArIGlwQWRkcmVzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBnYXRld2F5PSIgKyBnYXRld2F5QWRkcmVzcyArICIgRE5TMT0iICsgZG5zU2VydmVyc1swXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBETlMyPSIgKyBkbnNTZXJ2ZXJzWzFdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Ruc09rKGRuc1NlcnZlcnMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBTZXR1cFJlc3VsdC5TVUNDRVNTOworICAgICAgICAgICAgICAgICAgICAgICAgbGlua1Byb3BlcnRpZXMuYWRkRG5zKEluZXRBZGRyZXNzLmdldEJ5TmFtZShkbnNTZXJ2ZXJzWzBdKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5rUHJvcGVydGllcy5hZGREbnMoSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGRuc1NlcnZlcnNbMV0pKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNldHVwUmVzdWx0LkVSUl9CYWREbnM7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBTZXR1cFJlc3VsdC5TVUNDRVNTOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygib25TZXR1cENvbXBsZXRlZDogVW5rbm93SG9zdEV4Y2VwdGlvbiAiICsgZTEpOworICAgICAgICAgICAgICAgICAgICBlMS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gU2V0dXBSZXN1bHQuRVJSX090aGVyOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgICAgICAgICBsb2coIm9uU2V0dXBDb21wbGV0ZWQ6IFNvY2tldEV4Y2VwdGlvbiAiICsgZTIpOworICAgICAgICAgICAgICAgICAgICBlMi5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gU2V0dXBSZXN1bHQuRVJSX090aGVyOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKCJvblNldHVwQ29tcGxldGVkOiBlcnJvcjsgZXhwZWN0ZWQgbnVtYmVyIG9mIHJlc3BvbnNlcyA+PSAyIHdhcyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gU2V0dXBSZXN1bHQuRVJSX090aGVyOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBbiBlcnJvciBvY2N1cnJlZCBzbyBjbGVhciBwcm9wZXJ0aWVzCisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IFNldHVwUmVzdWx0LlNVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBsb2coIm9uU2V0dXBDb21wbGV0ZWQgd2l0aCBhbiBlcnJvciBjbGVhcmluZyBMaW5rUHJvcGVydGllcyIpOworICAgICAgICAgICAgICAgIGxpbmtQcm9wZXJ0aWVzLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTGlua1Byb3BlcnRpZXMgPSBsaW5rUHJvcGVydGllczsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChEQkcpIGxvZygiRGF0YUNvbm5lY3Rpb24gc2V0dXAgcmVzdWx0PSciICsgcmVzdWx0ICsgIicgb24gY2lkPSIgKyBjaWQpOworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBsb2coIkRhdGFDb25uZWN0aW9uIHNldHVwIHJlc3VsdD0nIiArIHJlc3VsdCArICInIG9uIGNpZD0iICsgY2lkKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gU2V0dXBSZXN1bHQuU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGxvZygiTGlua1Byb3BlcnRpZXM6ICIgKyBtTGlua1Byb3BlcnRpZXMudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKQEAgLTYwNiw3ICs2MzksMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRVJSX0JhZERuczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25uZWN0aW9uIHN1Y2NlZWRlZCBidXQgRE5TIGluZm8gaXMgYmFkIHNvIGRpc2Nvbm5lY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEV2ZW50TG9nVGFncy5QRFBfQkFEX0ROU19BRERSRVNTLCBkbnNTZXJ2ZXJzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGRuc0FkZHJlc3Nlc1NiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEluZXRBZGRyZXNzIGFkZHIgOiBtTGlua1Byb3BlcnRpZXMuZ2V0RG5zZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG5zQWRkcmVzc2VzU2IubGVuZ3RoKCkgIT0gMCkgZG5zQWRkcmVzc2VzU2IuYXBwZW5kKCIgIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRuc0FkZHJlc3Nlc1NiLmFwcGVuZChhZGRyLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG5zQWRkcmVzc2VzU2IubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbnNBZGRyZXNzZXNTYi5hcHBlbmQoIm5vLWRucy1hZGRyZXNzZXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFdmVudExvZ1RhZ3MuUERQX0JBRF9ETlNfQUREUkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRuc0FkZHJlc3Nlc1NiLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYXJEb3duRGF0YShjcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0aW5nQmFkRG5zU3RhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtODczLDMxICs5MTUsMjIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnRlcmZhY2UgbmFtZSBhcyBhIHN0cmluZy4KKyAgICAgKiBSZXR1cm4gdGhlIExpbmtQcm9wZXJ0aWVzIGZvciB0aGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoZSBMaW5rUHJvcGVydGllcywgaXMgbmV2ZXIgbnVsbC4KICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGludGVyZmFjZU5hbWU7CisgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gbmV3IExpbmtQcm9wZXJ0aWVzKG1MaW5rUHJvcGVydGllcyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgaXAgYWRkcmVzcyBhcyBhIHN0cmluZy4KKyAgICAgKiBBIGNhcGFiaWxpdHkgaXMgYW4gSW50ZWdlci9TdHJpbmcgcGFpciwgdGhlIGNhcGFiaWxpdGllcworICAgICAqIGFyZSBkZWZpbmVkIGluIHRoZSBjbGFzcyBMaW5rU29ja2V0I0tleS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoaXMgY29ubmVjdGlvbnMgY2FwYWJpbGl0aWVzLCBtYXkgYmUgZW1wdHkgYnV0IG5ldmVyIG51bGwuCiAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJcEFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiBpcEFkZHJlc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgZ2F0ZXdheSBhZGRyZXNzIGFzIGEgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0R2F0ZXdheUFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiBnYXRld2F5QWRkcmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGFzc29jaWF0ZWQgRE5TIGFkZHJlc3Nlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RG5zU2VydmVycygpIHsKLSAgICAgICAgcmV0dXJuIGRuc1NlcnZlcnM7CisgICAgcHVibGljIExpbmtDYXBhYmlsaXRpZXMgZ2V0TGlua0NhcGFiaWxpdGllcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMaW5rQ2FwYWJpbGl0aWVzKG1DYXBhYmlsaXRpZXMpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCmluZGV4IDI2NWJmN2UuLjUyODM5YmUgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKQEAgLTE3LDEwICsxNywxMSBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtDYXBhYmlsaXRpZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKQEAgLTI4LDYgKzI5LDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKKwogLyoqCiAgKiB7QGhpZGV9CiAgKgpAQCAtMTg4LDcgKzE5MCwxNiBAQAogICAgIC8qKiBDSUQgb2YgYWN0aXZlIGRhdGEgY29ubmVjdGlvbiAqLwogICAgIHByb3RlY3RlZCBpbnQgY2lkQWN0aXZlOwogCi0gICAvKioKKyAgICAvKiogaW5kaWNhdGlvbiBvZiBvdXIgYXZhaWxhYmlsaXR5IChwcmVjb25kaXRpb25zIHRvIHRyeXNldHVwRGF0YSBhcmUgbWV0KSAqKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQXZhaWxhYmlsaXR5ID0gZmFsc2U7CisKKyAgICAvKiogVGhlIGxpbmsgcHJvcGVydGllcyAoZG5zLCBnYXRld2F5LCBpcCwgZXRjKSAqLworICAgIHByb3RlY3RlZCBMaW5rUHJvcGVydGllcyBtTGlua1Byb3BlcnRpZXMgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKKworICAgIC8qKiBUaGUgbGluayBjYXBhYmlsaXRpZXMgKi8KKyAgICBwcm90ZWN0ZWQgTGlua0NhcGFiaWxpdGllcyBtTGlua0NhcGFiaWxpdGllcyA9IG5ldyBMaW5rQ2FwYWJpbGl0aWVzKCk7CisKKyAgICAvKioKICAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgICovCiAgICAgcHJvdGVjdGVkIERhdGFDb25uZWN0aW9uVHJhY2tlcihQaG9uZUJhc2UgcGhvbmUpIHsKQEAgLTQxMSwxNyArNDIyLDEyNSBAQAogCiAgICAgcHVibGljIGFic3RyYWN0IEFycmF5TGlzdDxEYXRhQ29ubmVjdGlvbj4gZ2V0QWxsRGF0YUNvbm5lY3Rpb25zKCk7CiAKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoU3RyaW5nIGFwblR5cGUpOwotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRJcEFkZHJlc3MoU3RyaW5nIGFwblR5cGUpOwotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRHYXRld2F5KFN0cmluZyBhcG5UeXBlKTsKLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmdbXSBnZXREbnNTZXJ2ZXJzKFN0cmluZyBhcG5UeXBlKTsKLQogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNldFN0YXRlKFN0YXRlIHMpOwogCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBib29sZWFuIGlzRW5hYmxlZChpbnQgaWQpIHsKKyAgICBwcm90ZWN0ZWQgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgaW50IGlkID0gYXBuVHlwZVRvSWQoYXBuVHlwZSk7CisgICAgICAgIGlmIChpc0FwbklkRW5hYmxlZChpZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTGlua1Byb3BlcnRpZXMobUxpbmtQcm9wZXJ0aWVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBMaW5rQ2FwYWJpbGl0aWVzIGdldExpbmtDYXBhYmlsaXRpZXMoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgaW50IGlkID0gYXBuVHlwZVRvSWQoYXBuVHlwZSk7CisgICAgICAgIGlmIChpc0FwbklkRW5hYmxlZChpZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTGlua0NhcGFiaWxpdGllcyhtTGlua0NhcGFiaWxpdGllcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IExpbmtDYXBhYmlsaXRpZXMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTGlua1Byb3BlcnRpZXMgZm9yIHRoZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb24KKyAgICAgKiBAcmV0dXJuIGEgY29weSBvZiB0aGUgTGlua1Byb3BlcnRpZXMsIGlzIG5ldmVyIG51bGwuCisgICAgICovCisgICAgcHJvdGVjdGVkIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKERhdGFDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uZ2V0TGlua1Byb3BlcnRpZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNhcGFiaWxpdHkgaXMgYW4gSW50ZWdlci9TdHJpbmcgcGFpciwgdGhlIGNhcGFiaWxpdGllcworICAgICAqIGFyZSBkZWZpbmVkIGluIHRoZSBjbGFzcyBMaW5rU29ja2V0I0tleS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uCisgICAgICogQHJldHVybiBhIGNvcHkgb2YgdGhpcyBjb25uZWN0aW9ucyBjYXBhYmlsaXRpZXMsIG1heSBiZSBlbXB0eSBidXQgbmV2ZXIgbnVsbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlua0NhcGFiaWxpdGllcyBnZXRMaW5rQ2FwYWJpbGl0aWVzKERhdGFDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uZ2V0TGlua0NhcGFiaWxpdGllcygpOworICAgIH0KKworICAgIC8vIHRlbGwgYWxsIGFjdGl2ZSBhcG5zIG9mIHRoZSBjdXJyZW50IGNvbmRpdGlvbgorICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFN0cmluZyByZWFzb24pIHsKKyAgICAgICAgZm9yIChpbnQgaWQgPSAwOyBpZCA8IEFQTl9OVU1fVFlQRVM7IGlkKyspIHsKKyAgICAgICAgICAgIGlmIChkYXRhRW5hYmxlZFtpZF0pIHsKKyAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24sIGFwbklkVG9UeXBlKGlkKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5RGF0YUF2YWlsYWJpbGl0eShyZWFzb24pOworICAgIH0KKworICAgIC8vIGEgbmV3IEFQTiBoYXMgZ29uZSBhY3RpdmUgYW5kIG5lZWRzIHRvIHNlbmQgZXZlbnRzIHRvIGNhdGNoIHVwIHdpdGggdGhlIGN1cnJlbnQgY29uZGl0aW9uCisgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeUFwbklkVXBUb0N1cnJlbnQoU3RyaW5nIHJlYXNvbiwgaW50IGFwbklkKSB7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgSURMRToKKyAgICAgICAgICAgIGNhc2UgSU5JVElORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ09OTkVDVElORzoKKyAgICAgICAgICAgIGNhc2UgU0NBTk5JTkc6CisgICAgICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uLCBhcG5JZFRvVHlwZShhcG5JZCksIFBob25lLkRhdGFTdGF0ZS5DT05ORUNUSU5HKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ09OTkVDVEVEOgorICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUSU5HOgorICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbiwgYXBuSWRUb1R5cGUoYXBuSWQpLCBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVElORyk7CisgICAgICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uLCBhcG5JZFRvVHlwZShhcG5JZCksIFBob25lLkRhdGFTdGF0ZS5DT05ORUNURUQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gc2luY2Ugd2Ugbm9ybWFsbHkgZG9uJ3Qgc2VuZCBpbmZvIHRvIGEgZGlzY29ubmVjdGVkIEFQTiwgd2UgbmVlZCB0byBkbyB0aGlzIHNwZWNpYWxseQorICAgIHByaXZhdGUgdm9pZCBub3RpZnlBcG5JZERpc2Nvbm5lY3RlZChTdHJpbmcgcmVhc29uLCBpbnQgYXBuSWQpIHsKKyAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uLCBhcG5JZFRvVHlwZShhcG5JZCksIFBob25lLkRhdGFTdGF0ZS5ESVNDT05ORUNURUQpOworICAgIH0KKworICAgIC8vIGRpc2FibGVkIGFwbidzIHN0aWxsIG5lZWQgYXZhaWwvdW5hdmFpbCBub3RpZmljaWF0aW9ucyAtIHNlbmQgdGhlbSBvdXQKKyAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlPZmZBcG5zT2ZBdmFpbGFiaWxpdHkoU3RyaW5nIHJlYXNvbiwgYm9vbGVhbiBhdmFpbGFiaWxpdHkpIHsKKyAgICAgICAgaWYgKG1BdmFpbGFiaWxpdHkgPT0gYXZhaWxhYmlsaXR5KSByZXR1cm47CisgICAgICAgIG1BdmFpbGFiaWxpdHkgPSBhdmFpbGFiaWxpdHk7CisgICAgICAgIGZvciAoaW50IGlkID0gMDsgaWQgPCBBUE5fTlVNX1RZUEVTOyBpZCsrKSB7CisgICAgICAgICAgICBpZiAoIWlzQXBuSWRFbmFibGVkKGlkKSkgeworICAgICAgICAgICAgICAgIG5vdGlmeUFwbklkRGlzY29ubmVjdGVkKHJlYXNvbiwgaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gd2UgaGFkIGFuIGF2YWlsYWJpbGl0eSBjaGFuZ2UgLSB0ZWxsIHRoZSBsaXN0ZW5lcnMKKyAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KFN0cmluZyByZWFzb24pIHsKKyAgICAgICAgLy8gbm90ZSB0aGF0IHdlIGVpdGhlciBqdXN0IHR1cm5lZCBhbGwgb2ZmIGJlY2F1c2Ugd2UgbG9zdCBhdmFpbGFiaWxpdHkKKyAgICAgICAgLy8gb3IgYWxsIHdlcmUgb2ZmIGFuZCBjb3VsZCBub3cgZ28gb24sIHNvIG9ubHkgaGF2ZSBvZmYgYXBucyB0byB3b3JyeSBhYm91dAorICAgICAgICBub3RpZnlPZmZBcG5zT2ZBdmFpbGFiaWxpdHkocmVhc29uLCBpc0RhdGFQb3NzaWJsZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgb25seSBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoIHdlIHJlcG9ydCB0aGF0IGRhdGEgY29ubmVjdGl2aXR5IGlzIG5vdAorICAgICAqIHBvc3NpYmxlIGFyZQorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+RGF0YSBpcyBkaXNhbGxvd2VkIChyb2FtaW5nLCBwb3dlciBzdGF0ZSwgdm9pY2UgY2FsbCwgZXRjKS48L2xpPgorICAgICAqIDxsaT5UaGUgY3VycmVudCBkYXRhIHN0YXRlIGlzIHtAY29kZSBESVNDT05ORUNURUR9IGZvciBhIHJlYXNvbiBvdGhlciB0aGFuCisgICAgICogaGF2aW5nIGV4cGxpY2l0bHkgZGlzYWJsZWQgY29ubmVjdGl2aXR5LiBJbiBvdGhlciB3b3JkcywgZGF0YSBpcyBub3QgYXZhaWxhYmxlCisgICAgICogYmVjYXVzZSB0aGUgcGhvbmUgaXMgb3V0IG9mIGNvdmVyYWdlIG9yIHNvbWUgbGlrZSByZWFzb24uPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGRhdGEgY29ubmVjdGl2aXR5IGlzIHBvc3NpYmxlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RhdGFQb3NzaWJsZSgpIHsKKyAgICAgICAgYm9vbGVhbiBwb3NzaWJsZSA9IChpc0RhdGFBbGxvd2VkKCkgJiYKKyAgICAgICAgICAgICEoZ2V0RGF0YUVuYWJsZWQoKSAmJiAoc3RhdGUgPT0gU3RhdGUuRkFJTEVEIHx8IHN0YXRlID09IFN0YXRlLklETEUpKSk7CisgICAgICAgIGlmICghcG9zc2libGUgJiYgREJHICYmIGlzRGF0YUFsbG93ZWQoKSkgeworICAgICAgICAgICAgbG9nKCJEYXRhIG5vdCBwb3NzaWJsZS4gIE5vIGNvdmVyYWdlOiBkYXRhU3RhdGUgPSAiICsgc3RhdGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwb3NzaWJsZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc0RhdGFBbGxvd2VkKCk7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FwblR5cGVFbmFibGVkKFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIHJldHVybiBpc0FwbklkRW5hYmxlZChhcG5UeXBlVG9JZChhcG5UeXBlKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBib29sZWFuIGlzQXBuSWRFbmFibGVkKGludCBpZCkgewogICAgICAgICBpZiAoaWQgIT0gQVBOX0lOVkFMSURfSUQpIHsKICAgICAgICAgICAgIHJldHVybiBkYXRhRW5hYmxlZFtpZF07CiAgICAgICAgIH0KQEAgLTQ0NCwyMiArNTYzLDIxIEBACiAgICAgICAgICAgICByZXR1cm4gUGhvbmUuQVBOX1JFUVVFU1RfRkFJTEVEOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgImVuYWJsZUFwblR5cGUoIit0eXBlKyIpLCBpc0FwblR5cGVBY3RpdmUgPSAiCi0gICAgICAgICAgICAgICAgKyBpc0FwblR5cGVBY3RpdmUodHlwZSkgKyAiIGFuZCBzdGF0ZSA9ICIgKyBzdGF0ZSk7CisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJlbmFibGVBcG5UeXBlKCIgKyB0eXBlICsgIiksIGlzQXBuVHlwZUFjdGl2ZSA9ICIKKyAgICAgICAgICAgICAgICAgICAgKyBpc0FwblR5cGVBY3RpdmUodHlwZSkgKyAiLCBpc0FwbklkRW5hYmxlZCA9IiArIGlzQXBuSWRFbmFibGVkKGlkKSArCisgICAgICAgICAgICAgICAgICAgICIgYW5kIHN0YXRlID0gIiArIHN0YXRlKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmICghaXNBcG5UeXBlQXZhaWxhYmxlKHR5cGUpKSB7CiAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAidHlwZSBub3QgYXZhaWxhYmxlIik7CiAgICAgICAgICAgICByZXR1cm4gUGhvbmUuQVBOX1RZUEVfTk9UX0FWQUlMQUJMRTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIGp1c3QgYmVjYXVzZSBpdCdzIGFjdGl2ZSBkb2Vzbid0IG1lYW4gd2UgaGFkIGl0IGV4cGxpY2l0bHkgcmVxdWVzdGVkIGJlZm9yZQotICAgICAgICAvLyAoYSBicm9hZCBkZWZhdWx0IG1heSBoYW5kbGUgbWFueSB0eXBlcykuICBtYWtlIHN1cmUgd2UgbWFyayBpdCBlbmFibGVkCi0gICAgICAgIC8vIHNvIGlmIHRoZSBkZWZhdWx0IGlzIGRpc2FibGVkIHdlIGtlZXAgdGhlIGNvbm5lY3Rpb24gZm9yIG90aGVycwotICAgICAgICBzZXRFbmFibGVkKGlkLCB0cnVlKTsKLQotICAgICAgICBpZiAoaXNBcG5UeXBlQWN0aXZlKHR5cGUpKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuSU5JVElORykgcmV0dXJuIFBob25lLkFQTl9SRVFVRVNUX1NUQVJURUQ7Ci0gICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQpIHJldHVybiBQaG9uZS5BUE5fQUxSRUFEWV9BQ1RJVkU7CisgICAgICAgIGlmIChpc0FwbklkRW5hYmxlZChpZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBQaG9uZS5BUE5fQUxSRUFEWV9BQ1RJVkU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRFbmFibGVkKGlkLCB0cnVlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gUGhvbmUuQVBOX1JFUVVFU1RfU1RBUlRFRDsKICAgICB9CkBAIC00NzgsNyArNTk2LDcgQEAKICAgICAgICAgaWYgKGlkID09IEFQTl9JTlZBTElEX0lEKSB7CiAgICAgICAgICAgICByZXR1cm4gUGhvbmUuQVBOX1JFUVVFU1RfRkFJTEVEOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpc0VuYWJsZWQoaWQpKSB7CisgICAgICAgIGlmIChpc0FwbklkRW5hYmxlZChpZCkpIHsKICAgICAgICAgICAgIHNldEVuYWJsZWQoaWQsIGZhbHNlKTsKICAgICAgICAgICAgIGlmIChpc0FwblR5cGVBY3RpdmUoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkpIHsKICAgICAgICAgICAgICAgICBpZiAoZGF0YUVuYWJsZWRbQVBOX0RFRkFVTFRfSURdKSB7CkBAIC00OTUsOSArNjEzLDEwIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHNldEVuYWJsZWQoaW50IGlkLCBib29sZWFuIGVuYWJsZSkgewotICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAic2V0RW5hYmxlZCgiICsgaWQgKyAiLCAiICsgZW5hYmxlICsgIikgd2l0aCBvbGQgc3RhdGUgPSAiICsKLSAgICAgICAgICAgICAgICBkYXRhRW5hYmxlZFtpZF0gKyAiIGFuZCBlbmFibGVkQ291bnQgPSAiICsgZW5hYmxlZENvdW50KTsKLQorICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAic2V0RW5hYmxlZCgiICsgaWQgKyAiLCAiICsgZW5hYmxlICsgIikgd2l0aCBvbGQgc3RhdGUgPSAiCisgICAgICAgICAgICAgICAgICAgICsgZGF0YUVuYWJsZWRbaWRdICsgIiBhbmQgZW5hYmxlZENvdW50ID0gIiArIGVuYWJsZWRDb3VudCk7CisgICAgICAgIH0KICAgICAgICAgTWVzc2FnZSBtc2cgPSBvYnRhaW5NZXNzYWdlKEVWRU5UX0VOQUJMRV9ORVdfQVBOKTsKICAgICAgICAgbXNnLmFyZzEgPSBpZDsKICAgICAgICAgbXNnLmFyZzIgPSAoZW5hYmxlID8gRU5BQkxFRCA6IERJU0FCTEVEKTsKQEAgLTUwNyw5ICs2MjYsOCBAQAogICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBvbkVuYWJsZUFwbihpbnQgYXBuSWQsIGludCBlbmFibGVkKSB7CiAgICAgICAgIGlmIChEQkcpIHsKICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJFVkVOVF9BUE5fRU5BQkxFX1JFUVVFU1QgIiArIGFwbklkICsgIiwgIiArIGVuYWJsZWQpOwotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIiBkYXRhRW5hYmxlZCA9ICIgKyBkYXRhRW5hYmxlZFthcG5JZF0gKwotICAgICAgICAgICAgICAgICAgICAiLCBlbmFibGVkQ291bnQgPSAiICsgZW5hYmxlZENvdW50ICsKLSAgICAgICAgICAgICAgICAgICAgIiwgaXNBcG5UeXBlQWN0aXZlID0gIiArIGlzQXBuVHlwZUFjdGl2ZShhcG5JZFRvVHlwZShhcG5JZCkpKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICIgZGF0YUVuYWJsZWQgPSAiICsgZGF0YUVuYWJsZWRbYXBuSWRdICsgIiwgZW5hYmxlZENvdW50ID0gIgorICAgICAgICAgICAgICAgICAgICArIGVuYWJsZWRDb3VudCArICIsIGlzQXBuVHlwZUFjdGl2ZSA9ICIgKyBpc0FwblR5cGVBY3RpdmUoYXBuSWRUb1R5cGUoYXBuSWQpKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGVuYWJsZWQgPT0gRU5BQkxFRCkgewogICAgICAgICAgICAgaWYgKCFkYXRhRW5hYmxlZFthcG5JZF0pIHsKQEAgLTUyMCw2ICs2MzgsOCBAQAogICAgICAgICAgICAgaWYgKCFpc0FwblR5cGVBY3RpdmUodHlwZSkpIHsKICAgICAgICAgICAgICAgICBtUmVxdWVzdGVkQXBuVHlwZSA9IHR5cGU7CiAgICAgICAgICAgICAgICAgb25FbmFibGVOZXdBcG4oKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbm90aWZ5QXBuSWRVcFRvQ3VycmVudChQaG9uZS5SRUFTT05fQVBOX1NXSVRDSEVELCBhcG5JZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBkaXNhYmxlCkBAIC01MjgsOCArNjQ4LDE3IEBACiAgICAgICAgICAgICAgICAgZW5hYmxlZENvdW50LS07CiAgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWRDb3VudCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG9uQ2xlYW5VcENvbm5lY3Rpb24odHJ1ZSwgUGhvbmUuUkVBU09OX0RBVEFfRElTQUJMRUQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YUVuYWJsZWRbQVBOX0RFRkFVTFRfSURdID09IHRydWUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFpc0FwblR5cGVBY3RpdmUoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBzZW5kIHRoZSBkaXNjb25uZWN0IG1zZyBtYW51YWxseSwgc2luY2UgdGhlIG5vcm1hbCByb3V0ZSB3b250IHNlbmQKKyAgICAgICAgICAgICAgICAvLyBpdCAoaXQncyBub3QgZW5hYmxlZCkKKyAgICAgICAgICAgICAgICBub3RpZnlBcG5JZERpc2Nvbm5lY3RlZChQaG9uZS5SRUFTT05fREFUQV9ESVNBQkxFRCwgYXBuSWQpOworICAgICAgICAgICAgICAgIGlmIChkYXRhRW5hYmxlZFtBUE5fREVGQVVMVF9JRF0gPT0gdHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWlzQXBuVHlwZUFjdGl2ZShQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIC0gdGhpcyBpcyBhbiB1Z2x5IHdheSB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGNvbm4gLSBzaG91bGQgYmUgZG9uZQorICAgICAgICAgICAgICAgICAgICAvLyBieSBhIHJlYWwgY29udGVudGlvbiBtYW5hZ2VyIGFuZCBwb2xpY3kgdGhhdCBkaXNjb25uZWN0cyB0aGUgbG93ZXIgcHJpCisgICAgICAgICAgICAgICAgICAgIC8vIHN0dWZmIGFzIGVuYWJsZSByZXF1ZXN0cyBjb21lIGluIGFuZCBwb3BzIHRoZW0gYmFjayBvbiBhcyB3ZSBkaXNhYmxlIGJhY2sKKyAgICAgICAgICAgICAgICAgICAgLy8gZG93biB0byB0aGUgbG93ZXIgcHJpIHN0dWZmCiAgICAgICAgICAgICAgICAgICAgIG1SZXF1ZXN0ZWRBcG5UeXBlID0gUGhvbmUuQVBOX1RZUEVfREVGQVVMVDsKICAgICAgICAgICAgICAgICAgICAgb25FbmFibGVOZXdBcG4oKTsKICAgICAgICAgICAgICAgICB9CkBAIC01NzQsOSArNzAzLDcgQEAKICAgICAgICAgICAgICAgICBvblRyeVNldHVwRGF0YShQaG9uZS5SRUFTT05fREFUQV9FTkFCTEVEKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgb25DbGVhblVwQ29ubmVjdGlvbih0cnVlLCBQaG9uZS5SRUFTT05fREFUQV9ESVNBQkxFRCk7Ci0gICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQotCiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGVmYXVsdFBob25lTm90aWZpZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EZWZhdWx0UGhvbmVOb3RpZmllci5qYXZhCmluZGV4IDA1N2JhMGEuLjZhMTYzZGQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EZWZhdWx0UGhvbmVOb3RpZmllci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EZWZhdWx0UGhvbmVOb3RpZmllci5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua0NhcGFiaWxpdGllczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwpAQCAtOTIsMjYgKzk0LDQ1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24pIHsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIGRvTm90aWZ5RGF0YUNvbm5lY3Rpb24oc2VuZGVyLCByZWFzb24sIGFwblR5cGUsIHNlbmRlci5nZXREYXRhQ29ubmVjdGlvblN0YXRlKGFwblR5cGUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlLAorICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlKSB7CisgICAgICAgIGRvTm90aWZ5RGF0YUNvbm5lY3Rpb24oc2VuZGVyLCByZWFzb24sIGFwblR5cGUsIHN0YXRlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9Ob3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlLAorICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlKSB7CisgICAgICAgIC8vIFRPRE8KKyAgICAgICAgLy8gdXNlIGFwblR5cGUgYXMgdGhlIGtleSB0byB3aGljaCBjb25uZWN0aW9uIHdlJ3JlIHRhbGtpbmcgYWJvdXQuCisgICAgICAgIC8vIHBhc3MgYXBuVHlwZSBiYWNrIHVwIHRvIGZldGNoIHBhcnRpY3VsYXIgZm9yIHRoaXMgb25lLgogICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyIHRlbGVwaG9ueSA9IFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpOworICAgICAgICBMaW5rUHJvcGVydGllcyBsaW5rUHJvcGVydGllcyA9IG51bGw7CisgICAgICAgIExpbmtDYXBhYmlsaXRpZXMgbGlua0NhcGFiaWxpdGllcyA9IG51bGw7CisgICAgICAgIGlmIChzdGF0ZSA9PSBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVEVEKSB7CisgICAgICAgICAgICBsaW5rUHJvcGVydGllcyA9IHNlbmRlci5nZXRMaW5rUHJvcGVydGllcyhhcG5UeXBlKTsKKyAgICAgICAgICAgIGxpbmtDYXBhYmlsaXRpZXMgPSBzZW5kZXIuZ2V0TGlua0NhcGFiaWxpdGllcyhhcG5UeXBlKTsKKyAgICAgICAgfQogICAgICAgICB0cnkgewogICAgICAgICAgICAgbVJlZ2lzdHJ5Lm5vdGlmeURhdGFDb25uZWN0aW9uKAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0RGF0YVN0YXRlKHNlbmRlci5nZXREYXRhQ29ubmVjdGlvblN0YXRlKCkpLAorICAgICAgICAgICAgICAgICAgICBjb252ZXJ0RGF0YVN0YXRlKHN0YXRlKSwKICAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlKCksIHJlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmdldEFjdGl2ZUFwbigpLAotICAgICAgICAgICAgICAgICAgICBzZW5kZXIuZ2V0QWN0aXZlQXBuVHlwZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmdldEludGVyZmFjZU5hbWUobnVsbCksCisgICAgICAgICAgICAgICAgICAgIGFwblR5cGUsCisgICAgICAgICAgICAgICAgICAgIGxpbmtQcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICBsaW5rQ2FwYWJpbGl0aWVzLAogICAgICAgICAgICAgICAgICAgICAoKHRlbGVwaG9ueSE9bnVsbCkgPyB0ZWxlcGhvbnkuZ2V0TmV0d29ya1R5cGUoKSA6Ci0gICAgICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuTkVUV09SS19UWVBFX1VOS05PV04pLAotICAgICAgICAgICAgICAgICAgICBzZW5kZXIuZ2V0R2F0ZXdheShudWxsKSk7CisgICAgICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuTkVUV09SS19UWVBFX1VOS05PV04pKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkCiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24pIHsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtUmVnaXN0cnkubm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uKTsKKyAgICAgICAgICAgIG1SZWdpc3RyeS5ub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChyZWFzb24sIGFwblR5cGUpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0LmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXQuamF2YQppbmRleCAzMGVlNzdjLi5lNDI4MjdmIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXQuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXQuamF2YQpAQCAtMTYsMTEgKzE2LDE0IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCi1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VJbnRBcnJheTsKIAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKKwogLyoqCiAgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGNoYXJhY3RlciBzZXQgbWFwcGluZyBiZXR3ZWVuCiAgKiB0aGUgR1NNIFNNUyA3LWJpdCBhbHBoYWJldCBzcGVjaWZpZWQgaW4gVFMgMjMuMDM4IDYuMi4xCkBAIC0zMjAsNyArMzIzLDcgQEAKIAogICAgICAgICAgICAgICAgIGdzbVZhbCA9ICgweDdmICYgKHBkdVtvZmZzZXQgKyBieXRlT2Zmc2V0XSA+PiBzaGlmdCkpOwogCi0gICAgICAgICAgICAgICAgLy8gaWYgaXQgY3Jvc3NlcyBhIGJ5dGUgYm91bmRyeQorICAgICAgICAgICAgICAgIC8vIGlmIGl0IGNyb3NzZXMgYSBieXRlIGJvdW5kYXJ5CiAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID4gMSkgewogICAgICAgICAgICAgICAgICAgICAvLyBzZXQgbXNiIGJpdHMgdG8gMAogICAgICAgICAgICAgICAgICAgICBnc21WYWwgJj0gMHg3ZiA+PiAoc2hpZnQgLSAxKTsKQEAgLTM1NSw2ICszNTgsMzIgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZwogICAgIGdzbThCaXRVbnBhY2tlZFRvU3RyaW5nKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHJldHVybiBnc204Qml0VW5wYWNrZWRUb1N0cmluZyhkYXRhLCBvZmZzZXQsIGxlbmd0aCwgIiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSBHU00gYWxwaGFiZXQgc3RyaW5nIHRoYXQncyBzdG9yZWQgaW4gOC1iaXQgdW5wYWNrZWQKKyAgICAgKiBmb3JtYXQgKGFzIGl0IG9mdGVuIGFwcGVhcnMgaW4gU0lNIHJlY29yZHMpIGludG8gYSBTdHJpbmcKKyAgICAgKgorICAgICAqIEZpZWxkIG1heSBiZSBwYWRkZWQgd2l0aCB0cmFpbGluZyAweGZmJ3MuIFRoZSBkZWNvZGUgc3RvcHMKKyAgICAgKiBhdCB0aGUgZmlyc3QgMHhmZiBlbmNvdW50ZXJlZC4KKyAgICAgKgorICAgICAqIEFkZGl0aW9uYWxseSwgaW4gc29tZSBjb3VudHJ5KGV4LiBLb3JlYSksIHRoZXJlIGFyZSBub24tQVNDSUkgb3IgTUJDUyBjaGFyYWN0ZXJzLgorICAgICAqIElmIGEgY2hhcmFjdGVyIHNldCBpcyBnaXZlbiwgY2hhcmFjdGVycyBpbiBkYXRhIGFyZSB0cmVhdCBhcyBNQkNTLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nCisgICAgZ3NtOEJpdFVucGFja2VkVG9TdHJpbmcoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBjaGFyYWN0ZXJzZXQpIHsKKyAgICAgICAgYm9vbGVhbiBpc01iY3MgPSBmYWxzZTsKKyAgICAgICAgQ2hhcnNldCBjaGFyc2V0ID0gbnVsbDsKKyAgICAgICAgQnl0ZUJ1ZmZlciBtYmNzQnVmZmVyID0gbnVsbDsKKworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGNoYXJhY3RlcnNldCkKKyAgICAgICAgICAgICAgICAmJiAhY2hhcmFjdGVyc2V0LmVxdWFsc0lnbm9yZUNhc2UoInVzLWFzY2lpIikKKyAgICAgICAgICAgICAgICAmJiBDaGFyc2V0LmlzU3VwcG9ydGVkKGNoYXJhY3RlcnNldCkpIHsKKyAgICAgICAgICAgIGlzTWJjcyA9IHRydWU7CisgICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGNoYXJhY3RlcnNldCk7CisgICAgICAgICAgICBtYmNzQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgyKTsKKyAgICAgICAgfQogICAgICAgICBib29sZWFuIHByZXZXYXNFc2NhcGU7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgcmV0ID0gbmV3IFN0cmluZ0J1aWxkZXIobGVuZ3RoKTsKIApAQCAtMzgwLDcgKzQwOSwxNSBAQAogICAgICAgICAgICAgICAgIGlmIChwcmV2V2FzRXNjYXBlKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldC5hcHBlbmQoKGNoYXIpZ3NtRXh0ZW5kZWRUb0NoYXIuZ2V0KGMsICcgJykpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldC5hcHBlbmQoKGNoYXIpZ3NtVG9DaGFyLmdldChjLCAnICcpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc01iY3MgfHwgYyA8IDB4ODAgfHwgaSArIDEgPj0gb2Zmc2V0ICsgbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwZW5kKChjaGFyKWdzbVRvQ2hhci5nZXQoYywgJyAnKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpc01iY3MgbXVzdCBiZSB0cnVlLiBTbyBib3RoIG1iY3NCdWZmZXIgYW5kIGNoYXJzZXQgYXJlIGluaXRpYWxpemVkLgorICAgICAgICAgICAgICAgICAgICAgICAgbWJjc0J1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgbWJjc0J1ZmZlci5wdXQoZGF0YSwgaSsrLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1iY3NCdWZmZXIuZmxpcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFwcGVuZChjaGFyc2V0LmRlY29kZShtYmNzQnVmZmVyKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwcmV2V2FzRXNjYXBlID0gZmFsc2U7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueS5haWRsIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnkuYWlkbAppbmRleCAyMzI4NzE3Li43YTE1ODdiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueS5haWRsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255LmFpZGwKQEAgLTIzOSw5ICsyMzksMTEgQEAKICAgICBTdHJpbmcgZ2V0Q2RtYUVyaVRleHQoKTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBDRE1BIHByb3Zpc2lvbmluZyBuZWVkcyB0byBydW4uCisgICAgICogUmV0dXJucyB0cnVlIGlmIE9UQSBzZXJ2aWNlIHByb3Zpc2lvbmluZyBuZWVkcyB0byBydW4uCisgICAgICogT25seSByZWxldmFudCBvbiBzb21lIHRlY2hub2xvZ2llcywgb3RoZXJzIHdpbGwgYWx3YXlzCisgICAgICogcmV0dXJuIGZhbHNlLgogICAgICAqLwotICAgIGJvb2xlYW4gZ2V0Q2RtYU5lZWRzUHJvdmlzaW9uaW5nKCk7CisgICAgYm9vbGVhbiBuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKTsKIAogICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSB1bnJlYWQgY291bnQgb2Ygdm9pY2VtYWlscwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnlSZWdpc3RyeS5haWRsIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnlSZWdpc3RyeS5haWRsCmluZGV4IDg3ZTRiNTIuLjY0MDdhNGUgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255UmVnaXN0cnkuYWlkbAorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueVJlZ2lzdHJ5LmFpZGwKQEAgLTE3LDYgKzE3LDggQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rQ2FwYWJpbGl0aWVzOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TaWduYWxTdHJlbmd0aDsKQEAgLTMyLDggKzM0LDggQEAKICAgICB2b2lkIG5vdGlmeUNhbGxGb3J3YXJkaW5nQ2hhbmdlZChib29sZWFuIGNmaSk7CiAgICAgdm9pZCBub3RpZnlEYXRhQWN0aXZpdHkoaW50IHN0YXRlKTsKICAgICB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKGludCBzdGF0ZSwgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSwKLSAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIGluIFN0cmluZ1tdIGFwblR5cGVzLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgaW50IG5ldHdvcmtUeXBlLAotICAgICAgICAgICAgU3RyaW5nIGdhdGV3YXkpOwotICAgIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbik7CisgICAgICAgICAgICBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuLCBTdHJpbmcgYXBuVHlwZSwgaW4gTGlua1Byb3BlcnRpZXMgbGlua1Byb3BlcnRpZXMsCisgICAgICAgICAgICBpbiBMaW5rQ2FwYWJpbGl0aWVzIGxpbmtDYXBhYmlsaXRpZXMsIGludCBuZXR3b3JrVHlwZSk7CisgICAgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSk7CiAgICAgdm9pZCBub3RpZnlDZWxsTG9jYXRpb24oaW4gQnVuZGxlIGNlbGxMb2NhdGlvbik7CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjVXRpbHMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NVdGlscy5qYXZhCmluZGV4IDk1N2VkZGQuLmRmNTc5YjAgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NVdGlscy5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NVdGlscy5qYXZhCkBAIC0xNiwxMyArMTYsMTYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7Ci0KIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiAKIC8qKgogICogVmFyaW91cyBtZXRob2RzLCB1c2VmdWwgZm9yIGRlYWxpbmcgd2l0aCBTSU0gZGF0YS4KQEAgLTE1MCw2ICsxNTMsOSBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nCiAgICAgYWRuU3RyaW5nRmllbGRUb1N0cmluZyhieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQogICAgICAgICBpZiAobGVuZ3RoID49IDEpIHsKICAgICAgICAgICAgIGlmIChkYXRhW29mZnNldF0gPT0gKGJ5dGUpIDB4ODApIHsKICAgICAgICAgICAgICAgICBpbnQgdWNzbGVuID0gKGxlbmd0aCAtIDEpIC8gMjsKQEAgLTIyNSw3ICsyMzEsMTUgQEAKICAgICAgICAgICAgIHJldHVybiByZXQudG9TdHJpbmcoKTsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBHc21BbHBoYWJldC5nc204Qml0VW5wYWNrZWRUb1N0cmluZyhkYXRhLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIFJlc291cmNlcyByZXNvdXJjZSA9IFJlc291cmNlcy5nZXRTeXN0ZW0oKTsKKyAgICAgICAgU3RyaW5nIGRlZmF1bHRDaGFyc2V0ID0gIiI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkZWZhdWx0Q2hhcnNldCA9CisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5nc21fYWxwaGFiZXRfZGVmYXVsdF9jaGFyc2V0KTsKKyAgICAgICAgfSBjYXRjaCAoTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSWdub3JlIEV4Y2VwdGlvbiBhbmQgZGVmYXVsdENoYXJzZXQgaXMgc2V0IHRvIGEgZW1wdHkgc3RyaW5nLgorICAgICAgICB9CisgICAgICAgIHJldHVybiBHc21BbHBoYWJldC5nc204Qml0VW5wYWNrZWRUb1N0cmluZyhkYXRhLCBvZmZzZXQsIGxlbmd0aCwgZGVmYXVsdENoYXJzZXQudHJpbSgpKTsKICAgICB9CiAKICAgICBzdGF0aWMgaW50CkBAIC0yNjcsOSArMjgxLDExIEBACiAKIAogICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgYnl0ZSBhcnJheSBpbnRvIGEgU3RyaW5nIGhleGlkZWNpbWFsIGNoYXJhY3RlcnMKKyAgICAgKiBDb252ZXJ0cyBhIGJ5dGUgYXJyYXkgaW50byBhIFN0cmluZyBvZiBoZXhhZGVjaW1hbCBjaGFyYWN0ZXJzLgogICAgICAqCi0gICAgICogbnVsbCByZXR1cm5zIG51bGwKKyAgICAgKiBAcGFyYW0gYnl0ZXMgYW4gYXJyYXkgb2YgYnl0ZXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gaGV4IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBieXRlcyBhcnJheQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nCiAgICAgYnl0ZXNUb0hleFN0cmluZyhieXRlW10gYnl0ZXMpIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01jY1RhYmxlLmphdmEKaW5kZXggYjczYzJmNy4uOWIwYWEzYyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01jY1RhYmxlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01jY1RhYmxlLmphdmEKQEAgLTIzLDM0NiArMjMsMTMgQEAKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogVGhlIHRhYmxlIGJlbG93IGlzIGJ1aWx0IGZyb20gdHdvIHJlc291cmNlczoKLSAqCi0gKiAxKSBJVFUgIk1vYmlsZSBOZXR3b3JrIENvZGUgKE1OQykgZm9yIHRoZSBpbnRlcm5hdGlvbmFsCi0gKiAgIGlkZW50aWZpY2F0aW9uIHBsYW4gZm9yIG1vYmlsZSB0ZXJtaW5hbHMgYW5kIG1vYmlsZSB1c2VycyIKLSAqICAgd2hpY2ggaXMgYXZhaWxhYmxlIGFzIGFuIGFubmV4IHRvIHRoZSBJVFUgb3BlcmF0aW9uYWwgYnVsbGV0aW4KLSAqICAgYXZhaWxhYmxlIGhlcmU6IGh0dHA6Ly93d3cuaXR1LmludC9pdHUtdC9idWxsZXRpbi9hbm5leC5odG1sCi0gKgotICogMikgVGhlIElTTyAzMTY2IGNvdW50cnkgY29kZXMgbGlzdCwgYXZhaWxhYmxlIGhlcmU6Ci0gKiAgICBodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2VuL3Byb2RzLXNlcnZpY2VzL2lzbzMxNjZtYS8wMmlzby0zMTY2LWNvZGUtbGlzdHMvaW5kZXguaHRtbAotICoKLSAqIFRoaXMgdGFibGUgd2FzIHZlcmlmaWVkICgyOCBBdWcgMjAwOSkgYWdhaW5zdAotICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX21vYmlsZV9jb3VudHJ5X2NvZGVzIHdpdGggdGhlCi0gKiBvbmx5IHVucmVzb2x2ZWQgZGlzY3JlcGFuY3kgYmVpbmcgdGhhdCB0aGlzIGxpc3QgaGFzIGFuIGV4dHJhIGVudHJ5Ci0gKiAoNDYxKSBmb3IgQ2hpbmEuCi0gKgotICogVE9ETzogQ29tcGxldGUgdGhlIG1hcHBpbmdzIGZvciB0aW1lem9uZXMgYW5kIGxhbmd1YWdlL2xvY2FsZSBjb2Rlcy4KLSAqCi0gKiBUaGUgYWN0dWFsIHRhYmxlIGRhdGEgdXNlZCBpbiB0aGUgSmF2YSBjb2RlIGlzIGdlbmVyYXRlZCBmcm9tIHRoZQotICogYmVsb3cgUHl0aG9uIGNvZGUgZm9yIGVmZmljaWVuY3kuICBUaGUgaW5mb3JtYXRpb24gaXMgZXhwZWN0ZWQgdG8KLSAqIGJlIHN0YXRpYywgYnV0IGlmIGNoYW5nZXMgYXJlIHJlcXVpcmVkLCB0aGUgdGFibGUgaW4gdGhlIHB5dGhvbgotICogY29kZSBjYW4gYmUgbW9kaWZpZWQgYW5kIHRoZSB0cmFpbGluZyBjb2RlIHJ1biB0byByZS1nZW5lcmF0ZSB0aGUKLSAqIHRhYmxlcyB0aGF0IGFyZSB0byBiZSB1c2VkIGJ5IEphdmEuCi0KLW1jY190YWJsZSA9IFsKLSAgKDIwMiwgJ2dyJywgMiwgJ0dyZWVjZScpLAotICAoMjA0LCAnbmwnLCAyLCAnRXVyb3BlL0Ftc3RlcmRhbScsICdubCcsIDEzLCAnTmV0aGVybGFuZHMgKEtpbmdkb20gb2YgdGhlKScpLAotICAoMjA2LCAnYmUnLCAyLCAnQmVsZ2l1bScpLAotICAoMjA4LCAnZnInLCAyLCAnRXVyb3BlL1BhcmlzJywgJ2ZyJywgJ0ZyYW5jZScpLAotICAoMjEyLCAnbWMnLCAyLCAnTW9uYWNvIChQcmluY2lwYWxpdHkgb2YpJyksCi0gICgyMTMsICdhZCcsIDIsICdBbmRvcnJhIChQcmluY2lwYWxpdHkgb2YpJyksCi0gICgyMTQsICdlcycsIDIsICdFdXJvcGUvTWFkcmlkJywgJ2VzJywgJ1NwYWluJyksCi0gICgyMTYsICdodScsIDIsICdIdW5nYXJ5IChSZXB1YmxpYyBvZiknKSwKLSAgKDIxOCwgJ2JhJywgMiwgJ0Jvc25pYSBhbmQgSGVyemVnb3ZpbmEnKSwKLSAgKDIxOSwgJ2hyJywgMiwgJ0Nyb2F0aWEgKFJlcHVibGljIG9mKScpLAotICAoMjIwLCAncnMnLCAyLCAnU2VyYmlhIGFuZCBNb250ZW5lZ3JvJyksCi0gICgyMjIsICdpdCcsIDIsICdFdXJvcGUvUm9tZScsICdpdCcsICdJdGFseScpLAotICAoMjI1LCAndmEnLCAyLCAnRXVyb3BlL1JvbWUnLCAnaXQnLCAnVmF0aWNhbiBDaXR5IFN0YXRlJyksCi0gICgyMjYsICdybycsIDIsICdSb21hbmlhJyksCi0gICgyMjgsICdjaCcsIDIsICdFdXJvcGUvWnVyaWNoJywgJ2RlJywgJ1N3aXR6ZXJsYW5kIChDb25mZWRlcmF0aW9uIG9mKScpLAotICAoMjMwLCAnY3onLCAyLCAnRXVyb3BlL1ByYWd1ZScsICdjcycsIDEzLCAnQ3plY2ggUmVwdWJsaWMnKSwKLSAgKDIzMSwgJ3NrJywgMiwgJ1Nsb3ZhayBSZXB1YmxpYycpLAotICAoMjMyLCAnYXQnLCAyLCAnRXVyb3BlL1ZpZW5uYScsICdkZScsIDEzLCAnQXVzdHJpYScpLAotICAoMjM0LCAnZ2InLCAyLCAnRXVyb3BlL0xvbmRvbicsICdlbicsIDEzLCAnVW5pdGVkIEtpbmdkb20gb2YgR3JlYXQgQnJpdGFpbiBhbmQgTm9ydGhlcm4gSXJlbGFuZCcpLAotICAoMjM1LCAnZ2InLCAyLCAnRXVyb3BlL0xvbmRvbicsICdlbicsIDEzLCAnVW5pdGVkIEtpbmdkb20gb2YgR3JlYXQgQnJpdGFpbiBhbmQgTm9ydGhlcm4gSXJlbGFuZCcpLAotICAoMjM4LCAnZGsnLCAyLCAnRGVubWFyaycpLAotICAoMjQwLCAnc2UnLCAyLCAnU3dlZGVuJyksCi0gICgyNDIsICdubycsIDIsICdOb3J3YXknKSwKLSAgKDI0NCwgJ2ZpJywgMiwgJ0ZpbmxhbmQnKSwKLSAgKDI0NiwgJ2x0JywgMiwgJ0xpdGh1YW5pYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyNDcsICdsdicsIDIsICdMYXR2aWEgKFJlcHVibGljIG9mKScpLAotICAoMjQ4LCAnZWUnLCAyLCAnRXN0b25pYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyNTAsICdydScsIDIsICdSdXNzaWFuIEZlZGVyYXRpb24nKSwKLSAgKDI1NSwgJ3VhJywgMiwgJ1VrcmFpbmUnKSwKLSAgKDI1NywgJ2J5JywgMiwgJ0JlbGFydXMgKFJlcHVibGljIG9mKScpLAotICAoMjU5LCAnbWQnLCAyLCAnTW9sZG92YSAoUmVwdWJsaWMgb2YpJyksCi0gICgyNjAsICdwbCcsIDIsICdFdXJvcGUvV2Fyc2F3JywgJ1BvbGFuZCAoUmVwdWJsaWMgb2YpJyksCi0gICgyNjIsICdkZScsIDIsICdFdXJvcGUvQmVybGluJywgJ2RlJywgMTMsICdHZXJtYW55IChGZWRlcmFsIFJlcHVibGljIG9mKScpLAotICAoMjY2LCAnZ2knLCAyLCAnR2licmFsdGFyJyksCi0gICgyNjgsICdwdCcsIDIsICdQb3J0dWdhbCcpLAotICAoMjcwLCAnbHUnLCAyLCAnTHV4ZW1ib3VyZycpLAotICAoMjcyLCAnaWUnLCAyLCAnRXVyb3BlL0R1YmxpbicsICdlbicsICdJcmVsYW5kJyksCi0gICgyNzQsICdpcycsIDIsICdJY2VsYW5kJyksCi0gICgyNzYsICdhbCcsIDIsICdBbGJhbmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDI3OCwgJ210JywgMiwgJ01hbHRhJyksCi0gICgyODAsICdjeScsIDIsICdDeXBydXMgKFJlcHVibGljIG9mKScpLAotICAoMjgyLCAnZ2UnLCAyLCAnR2VvcmdpYScpLAotICAoMjgzLCAnYW0nLCAyLCAnQXJtZW5pYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyODQsICdiZycsIDIsICdCdWxnYXJpYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyODYsICd0cicsIDIsICdUdXJrZXknKSwKLSAgKDI4OCwgJ2ZvJywgMiwgJ0Zhcm9lIElzbGFuZHMnKSwKLSAgKDI4OSwgJ2dlJywgMiwgJ0Fia2hhemlhIChHZW9yZ2lhKScpLAotICAoMjkwLCAnZ2wnLCAyLCAnR3JlZW5sYW5kIChEZW5tYXJrKScpLAotICAoMjkyLCAnc20nLCAyLCAnU2FuIE1hcmlubyAoUmVwdWJsaWMgb2YpJyksCi0gICgyOTMsICdzbCcsIDIsICdTbG92ZW5pYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyOTQsICdtaycsIDIsICdUaGUgRm9ybWVyIFl1Z29zbGF2IFJlcHVibGljIG9mIE1hY2Vkb25pYScpLAotICAoMjk1LCAnbGknLCAyLCAnTGllY2h0ZW5zdGVpbiAoUHJpbmNpcGFsaXR5IG9mKScpLAotICAoMjk3LCAnbWUnLCAyLCAnTW9udGVuZWdybyAoUmVwdWJsaWMgb2YpJyksCi0gICgzMDIsICdjYScsIDMsICcnLCAnJywgMTEsICdDYW5hZGEnKSwKLSAgKDMwOCwgJ3BtJywgMiwgJ1NhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24gKENvbGxlY3Rpdml0IHRlcnJpdG9yaWFsZSBkZSBsYSBScHVibGlxdWUgZnJhbmFpc2UpJyksCi0gICgzMTAsICd1cycsIDMsICcnLCAnZW4nLCAxMSwgJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScpLAotICAoMzExLCAndXMnLCAzLCAnJywgJ2VuJywgMTEsICdVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EnKSwKLSAgKDMxMiwgJ3VzJywgMywgJycsICdlbicsIDExLCAnVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJyksCi0gICgzMTMsICd1cycsIDMsICcnLCAnZW4nLCAxMSwgJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScpLAotICAoMzE0LCAndXMnLCAzLCAnJywgJ2VuJywgMTEsICdVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EnKSwKLSAgKDMxNSwgJ3VzJywgMywgJycsICdlbicsIDExLCAnVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJyksCi0gICgzMTYsICd1cycsIDMsICcnLCAnZW4nLCAxMSwgJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScpLAotICAoMzMwLCAncHInLCAyLCAnUHVlcnRvIFJpY28nKSwKLSAgKDMzMiwgJ3ZpJywgMiwgJ1VuaXRlZCBTdGF0ZXMgVmlyZ2luIElzbGFuZHMnKSwKLSAgKDMzNCwgJ214JywgMywgJ01leGljbycpLAotICAoMzM4LCAnam0nLCAzLCAnSmFtYWljYScpLAotICAoMzQwLCAnZ3AnLCAyLCAnR3VhZGVsb3VwZSAoRnJlbmNoIERlcGFydG1lbnQgb2YpJyksCi0gICgzNDIsICdiYicsIDMsICdCYXJiYWRvcycpLAotICAoMzQ0LCAnYWcnLCAzLCAnQW50aWd1YSBhbmQgQmFyYnVkYScpLAotICAoMzQ2LCAna3knLCAzLCAnQ2F5bWFuIElzbGFuZHMnKSwKLSAgKDM0OCwgJ3ZnJywgMywgJ0JyaXRpc2ggVmlyZ2luIElzbGFuZHMnKSwKLSAgKDM1MCwgJ2JtJywgMiwgJ0Jlcm11ZGEnKSwKLSAgKDM1MiwgJ2dkJywgMiwgJ0dyZW5hZGEnKSwKLSAgKDM1NCwgJ21zJywgMiwgJ01vbnRzZXJyYXQnKSwKLSAgKDM1NiwgJ2tuJywgMiwgJ1NhaW50IEtpdHRzIGFuZCBOZXZpcycpLAotICAoMzU4LCAnbGMnLCAyLCAnU2FpbnQgTHVjaWEnKSwKLSAgKDM2MCwgJ3ZjJywgMiwgJ1NhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzJyksCi0gICgzNjIsICdubCcsIDIsICdOZXRoZXJsYW5kcyBBbnRpbGxlcycpLAotICAoMzYzLCAnYXcnLCAyLCAnQXJ1YmEnKSwKLSAgKDM2NCwgJ2JzJywgMiwgJ0JhaGFtYXMgKENvbW1vbndlYWx0aCBvZiB0aGUpJyksCi0gICgzNjUsICdhaScsIDMsICdBbmd1aWxsYScpLAotICAoMzY2LCAnZG0nLCAyLCAnRG9taW5pY2EgKENvbW1vbndlYWx0aCBvZiknKSwKLSAgKDM2OCwgJ2N1JywgMiwgJ0N1YmEnKSwKLSAgKDM3MCwgJ2RvJywgMiwgJ0RvbWluaWNhbiBSZXB1YmxpYycpLAotICAoMzcyLCAnaHQnLCAyLCAnSGFpdGkgKFJlcHVibGljIG9mKScpLAotICAoMzc0LCAndHQnLCAyLCAnVHJpbmlkYWQgYW5kIFRvYmFnbycpLAotICAoMzc2LCAndGMnLCAyLCAnVHVya3MgYW5kIENhaWNvcyBJc2xhbmRzJyksCi0gICg0MDAsICdheicsIDIsICdBemVyYmFpamFuaSBSZXB1YmxpYycpLAotICAoNDAxLCAna3onLCAyLCAnS2F6YWtoc3RhbiAoUmVwdWJsaWMgb2YpJyksCi0gICg0MDIsICdidCcsIDIsICdCaHV0YW4gKEtpbmdkb20gb2YpJyksCi0gICg0MDQsICdpbicsIDIsICdJbmRpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg0MDUsICdpbicsIDIsICdJbmRpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg0MTAsICdwaycsIDIsICdQYWtpc3RhbiAoSXNsYW1pYyBSZXB1YmxpYyBvZiknKSwKLSAgKDQxMiwgJ2FmJywgMiwgJ0FmZ2hhbmlzdGFuJyksCi0gICg0MTMsICdsaycsIDIsICdTcmkgTGFua2EgKERlbW9jcmF0aWMgU29jaWFsaXN0IFJlcHVibGljIG9mKScpLAotICAoNDE0LCAnbW0nLCAyLCAnTXlhbm1hciAoVW5pb24gb2YpJyksCi0gICg0MTUsICdsYicsIDIsICdMZWJhbm9uJyksCi0gICg0MTYsICdqbycsIDIsICdKb3JkYW4gKEhhc2hlbWl0ZSBLaW5nZG9tIG9mKScpLAotICAoNDE3LCAnc3knLCAyLCAnU3lyaWFuIEFyYWIgUmVwdWJsaWMnKSwKLSAgKDQxOCwgJ2lxJywgMiwgJ0lyYXEgKFJlcHVibGljIG9mKScpLAotICAoNDE5LCAna3cnLCAyLCAnS3V3YWl0IChTdGF0ZSBvZiknKSwKLSAgKDQyMCwgJ3NhJywgMiwgJ1NhdWRpIEFyYWJpYSAoS2luZ2RvbSBvZiknKSwKLSAgKDQyMSwgJ3llJywgMiwgJ1llbWVuIChSZXB1YmxpYyBvZiknKSwKLSAgKDQyMiwgJ29tJywgMiwgJ09tYW4gKFN1bHRhbmF0ZSBvZiknKSwKLSAgKDQyMywgJ3BzJywgMiwgJ1BhbGVzdGluZScpLAotICAoNDI0LCAnYWUnLCAyLCAnVW5pdGVkIEFyYWIgRW1pcmF0ZXMnKSwKLSAgKDQyNSwgJ2lsJywgMiwgJ0lzcmFlbCAoU3RhdGUgb2YpJyksCi0gICg0MjYsICdiaCcsIDIsICdCYWhyYWluIChLaW5nZG9tIG9mKScpLAotICAoNDI3LCAncWEnLCAyLCAnUWF0YXIgKFN0YXRlIG9mKScpLAotICAoNDI4LCAnbW4nLCAyLCAnTW9uZ29saWEnKSwKLSAgKDQyOSwgJ25wJywgMiwgJ05lcGFsJyksCi0gICg0MzAsICdhZScsIDIsICdVbml0ZWQgQXJhYiBFbWlyYXRlcycpLAotICAoNDMxLCAnYWUnLCAyLCAnVW5pdGVkIEFyYWIgRW1pcmF0ZXMnKSwKLSAgKDQzMiwgJ2lyJywgMiwgJ0lyYW4gKElzbGFtaWMgUmVwdWJsaWMgb2YpJyksCi0gICg0MzQsICd1eicsIDIsICdVemJla2lzdGFuIChSZXB1YmxpYyBvZiknKSwKLSAgKDQzNiwgJ3RqJywgMiwgJ1RhamlraXN0YW4gKFJlcHVibGljIG9mKScpLAotICAoNDM3LCAna2cnLCAyLCAnS3lyZ3l6IFJlcHVibGljJyksCi0gICg0MzgsICd0bScsIDIsICdUdXJrbWVuaXN0YW4nKSwKLSAgKDQ0MCwgJ2pwJywgMiwgJ0FzaWEvVG9reW8nLCAnamEnLCAxNCwgJ0phcGFuJyksCi0gICg0NDEsICdqcCcsIDIsICdBc2lhL1Rva3lvJywgJ2phJywgMTQsICdKYXBhbicpLAotICAoNDUwLCAna3InLCAyLCAnS29yZWEgKFJlcHVibGljIG9mKScpLAotICAoNDUyLCAndm4nLCAyLCAnVmlldCBOYW0gKFNvY2lhbGlzdCBSZXB1YmxpYyBvZiknKSwKLSAgKDQ1NCwgJ2hrJywgMiwgJyJIb25nIEtvbmcsIENoaW5hIicpLAotICAoNDU1LCAnbW8nLCAyLCAnIk1hY2FvLCBDaGluYSInKSwKLSAgKDQ1NiwgJ2toJywgMiwgJ0NhbWJvZGlhIChLaW5nZG9tIG9mKScpLAotICAoNDU3LCAnbGEnLCAyLCAiTGFvIFBlb3BsZSdzIERlbW9jcmF0aWMgUmVwdWJsaWMiKSwKLSAgKDQ2MCwgJ2NuJywgMiwgIkFzaWEvQmVpamluZyIsICd6aCcsIDEzLCAiQ2hpbmEgKFBlb3BsZSdzIFJlcHVibGljIG9mKSIpLAotICAoNDYxLCAnY24nLCAyLCAiQXNpYS9CZWlqaW5nIiwgJ3poJywgMTMsICJDaGluYSAoUGVvcGxlJ3MgUmVwdWJsaWMgb2YpIiksCi0gICg0NjYsICd0dycsIDIsICJUYWl3YW4gKFJlcHVibGljIG9mIENoaW5hKSIpLAotICAoNDY3LCAna3AnLCAyLCAiRGVtb2NyYXRpYyBQZW9wbGUncyBSZXB1YmxpYyBvZiBLb3JlYSIpLAotICAoNDcwLCAnYmQnLCAyLCAiQmFuZ2xhZGVzaCAoUGVvcGxlJ3MgUmVwdWJsaWMgb2YpIiksCi0gICg0NzIsICdtdicsIDIsICdNYWxkaXZlcyAoUmVwdWJsaWMgb2YpJyksCi0gICg1MDIsICdteScsIDIsICdNYWxheXNpYScpLAotICAoNTA1LCAnYXUnLCAyLCAnQXVzdHJhbGlhL1N5ZG5leScsICdlbicsIDExLCAnQXVzdHJhbGlhJyksCi0gICg1MTAsICdpZCcsIDIsICdJbmRvbmVzaWEgKFJlcHVibGljIG9mKScpLAotICAoNTE0LCAndGwnLCAyLCAnRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiBUaW1vci1MZXN0ZScpLAotICAoNTE1LCAncGgnLCAyLCAnUGhpbGlwcGluZXMgKFJlcHVibGljIG9mIHRoZSknKSwKLSAgKDUyMCwgJ3RoJywgMiwgJ1RoYWlsYW5kJyksCi0gICg1MjUsICdzZycsIDIsICdBc2lhL1NpbmdhcG9yZScsICdlbicsIDExLCAnU2luZ2Fwb3JlIChSZXB1YmxpYyBvZiknKSwKLSAgKDUyOCwgJ2JuJywgMiwgJ0JydW5laSBEYXJ1c3NhbGFtJyksCi0gICg1MzAsICdueicsIDIsICdQYWNpZmljL0F1Y2tsYW5kJywgJ2VuJywgJ05ldyBaZWFsYW5kJyksCi0gICg1MzQsICdtcCcsIDIsICdOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMgKENvbW1vbndlYWx0aCBvZiB0aGUpJyksCi0gICg1MzUsICdndScsIDIsICdHdWFtJyksCi0gICg1MzYsICducicsIDIsICdOYXVydSAoUmVwdWJsaWMgb2YpJyksCi0gICg1MzcsICdwZycsIDIsICdQYXB1YSBOZXcgR3VpbmVhJyksCi0gICg1MzksICd0bycsIDIsICdUb25nYSAoS2luZ2RvbSBvZiknKSwKLSAgKDU0MCwgJ3NiJywgMiwgJ1NvbG9tb24gSXNsYW5kcycpLAotICAoNTQxLCAndnUnLCAyLCAnVmFudWF0dSAoUmVwdWJsaWMgb2YpJyksCi0gICg1NDIsICdmaicsIDIsICdGaWppIChSZXB1YmxpYyBvZiknKSwKLSAgKDU0MywgJ3dmJywgMiwgIldhbGxpcyBhbmQgRnV0dW5hIChUZXJyaXRvaXJlIGZyYW5haXMgZCdvdXRyZS1tZXIpIiksCi0gICg1NDQsICdhcycsIDIsICdBbWVyaWNhbiBTYW1vYScpLAotICAoNTQ1LCAna2knLCAyLCAnS2lyaWJhdGkgKFJlcHVibGljIG9mKScpLAotICAoNTQ2LCAnbmMnLCAyLCAiTmV3IENhbGVkb25pYSAoVGVycml0b2lyZSBmcmFuYWlzIGQnb3V0cmUtbWVyKSIpLAotICAoNTQ3LCAncGYnLCAyLCAiRnJlbmNoIFBvbHluZXNpYSAoVGVycml0b2lyZSBmcmFuYWlzIGQnb3V0cmUtbWVyKSIpLAotICAoNTQ4LCAnY2snLCAyLCAnQ29vayBJc2xhbmRzJyksCi0gICg1NDksICd3cycsIDIsICdTYW1vYSAoSW5kZXBlbmRlbnQgU3RhdGUgb2YpJyksCi0gICg1NTAsICdmbScsIDIsICdNaWNyb25lc2lhIChGZWRlcmF0ZWQgU3RhdGVzIG9mKScpLAotICAoNTUxLCAnbWgnLCAyLCAnTWFyc2hhbGwgSXNsYW5kcyAoUmVwdWJsaWMgb2YgdGhlKScpLAotICAoNTUyLCAncHcnLCAyLCAnUGFsYXUgKFJlcHVibGljIG9mKScpLAotICAoNjAyLCAnZWcnLCAyLCAnRWd5cHQgKEFyYWIgUmVwdWJsaWMgb2YpJyksCi0gICg2MDMsICdkeicsIDIsICJBbGdlcmlhIChQZW9wbGUncyBEZW1vY3JhdGljIFJlcHVibGljIG9mKSIpLAotICAoNjA0LCAnbWEnLCAyLCAnTW9yb2NjbyAoS2luZ2RvbSBvZiknKSwKLSAgKDYwNSwgJ3RuJywgMiwgJ1R1bmlzaWEnKSwKLSAgKDYwNiwgJ2x5JywgMiwgIkxpYnlhIChTb2NpYWxpc3QgUGVvcGxlJ3MgTGlieWFuIEFyYWIgSmFtYWhpcml5YSkiKSwKLSAgKDYwNywgJ2dtJywgMiwgJ0dhbWJpYSAoUmVwdWJsaWMgb2YgdGhlKScpLAotICAoNjA4LCAnc24nLCAyLCAnU2VuZWdhbCAoUmVwdWJsaWMgb2YpJyksCi0gICg2MDksICdtcicsIDIsICdNYXVyaXRhbmlhIChJc2xhbWljIFJlcHVibGljIG9mKScpLAotICAoNjEwLCAnbWwnLCAyLCAnTWFsaSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MTEsICdnbicsIDIsICdHdWluZWEgKFJlcHVibGljIG9mKScpLAotICAoNjEyLCAnY2knLCAyLCAiQ3RlIGQnSXZvaXJlIChSZXB1YmxpYyBvZikiKSwKLSAgKDYxMywgJ2JmJywgMiwgJ0J1cmtpbmEgRmFzbycpLAotICAoNjE0LCAnbmUnLCAyLCAnTmlnZXIgKFJlcHVibGljIG9mIHRoZSknKSwKLSAgKDYxNSwgJ3RnJywgMiwgJ1RvZ29sZXNlIFJlcHVibGljJyksCi0gICg2MTYsICdiaicsIDIsICdCZW5pbiAoUmVwdWJsaWMgb2YpJyksCi0gICg2MTcsICdtdScsIDIsICdNYXVyaXRpdXMgKFJlcHVibGljIG9mKScpLAotICAoNjE4LCAnbHInLCAyLCAnTGliZXJpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MTksICdzbCcsIDIsICdTaWVycmEgTGVvbmUnKSwKLSAgKDYyMCwgJ2doJywgMiwgJ0doYW5hJyksCi0gICg2MjEsICduZycsIDIsICdOaWdlcmlhIChGZWRlcmFsIFJlcHVibGljIG9mKScpLAotICAoNjIyLCAndGQnLCAyLCAnQ2hhZCAoUmVwdWJsaWMgb2YpJyksCi0gICg2MjMsICdjZicsIDIsICdDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMnKSwKLSAgKDYyNCwgJ2NtJywgMiwgJ0NhbWVyb29uIChSZXB1YmxpYyBvZiknKSwKLSAgKDYyNSwgJ2N2JywgMiwgJ0NhcGUgVmVyZGUgKFJlcHVibGljIG9mKScpLAotICAoNjI2LCAnc3QnLCAyLCAnU2FvIFRvbWUgYW5kIFByaW5jaXBlIChEZW1vY3JhdGljIFJlcHVibGljIG9mKScpLAotICAoNjI3LCAnZ3EnLCAyLCAnRXF1YXRvcmlhbCBHdWluZWEgKFJlcHVibGljIG9mKScpLAotICAoNjI4LCAnZ2EnLCAyLCAnR2Fib25lc2UgUmVwdWJsaWMnKSwKLSAgKDYyOSwgJ2NnJywgMiwgJ0NvbmdvIChSZXB1YmxpYyBvZiB0aGUpJyksCi0gICg2MzAsICdjZycsIDIsICdEZW1vY3JhdGljIFJlcHVibGljIG9mIHRoZSBDb25nbycpLAotICAoNjMxLCAnYW8nLCAyLCAnQW5nb2xhIChSZXB1YmxpYyBvZiknKSwKLSAgKDYzMiwgJ2d3JywgMiwgJ0d1aW5lYS1CaXNzYXUgKFJlcHVibGljIG9mKScpLAotICAoNjMzLCAnc2MnLCAyLCAnU2V5Y2hlbGxlcyAoUmVwdWJsaWMgb2YpJyksCi0gICg2MzQsICdzZCcsIDIsICdTdWRhbiAoUmVwdWJsaWMgb2YgdGhlKScpLAotICAoNjM1LCAncncnLCAyLCAnUndhbmRhIChSZXB1YmxpYyBvZiknKSwKLSAgKDYzNiwgJ2V0JywgMiwgJ0V0aGlvcGlhIChGZWRlcmFsIERlbW9jcmF0aWMgUmVwdWJsaWMgb2YpJyksCi0gICg2MzcsICdzbycsIDIsICdTb21hbGkgRGVtb2NyYXRpYyBSZXB1YmxpYycpLAotICAoNjM4LCAnZGonLCAyLCAnRGppYm91dGkgKFJlcHVibGljIG9mKScpLAotICAoNjM5LCAna2UnLCAyLCAnS2VueWEgKFJlcHVibGljIG9mKScpLAotICAoNjQwLCAndHonLCAyLCAnVGFuemFuaWEgKFVuaXRlZCBSZXB1YmxpYyBvZiknKSwKLSAgKDY0MSwgJ3VnJywgMiwgJ1VnYW5kYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NDIsICdiaScsIDIsICdCdXJ1bmRpIChSZXB1YmxpYyBvZiknKSwKLSAgKDY0MywgJ216JywgMiwgJ01vemFtYmlxdWUgKFJlcHVibGljIG9mKScpLAotICAoNjQ1LCAnem0nLCAyLCAnWmFtYmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDY0NiwgJ21nJywgMiwgJ01hZGFnYXNjYXIgKFJlcHVibGljIG9mKScpLAotICAoNjQ3LCAncmUnLCAyLCAnUmV1bmlvbiAoRnJlbmNoIERlcGFydG1lbnQgb2YpJyksCi0gICg2NDgsICd6dycsIDIsICdaaW1iYWJ3ZSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NDksICduYScsIDIsICdOYW1pYmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDY1MCwgJ213JywgMiwgJ01hbGF3aScpLAotICAoNjUxLCAnbHMnLCAyLCAnTGVzb3RobyAoS2luZ2RvbSBvZiknKSwKLSAgKDY1MiwgJ2J3JywgMiwgJ0JvdHN3YW5hIChSZXB1YmxpYyBvZiknKSwKLSAgKDY1MywgJ3N6JywgMiwgJ1N3YXppbGFuZCAoS2luZ2RvbSBvZiknKSwKLSAgKDY1NCwgJ2ttJywgMiwgJ0NvbW9yb3MgKFVuaW9uIG9mIHRoZSknKSwKLSAgKDY1NSwgJ3phJywgMiwgJ0FmcmljYS9Kb2hhbm5lc2J1cmcnLCAnZW4nLCAnU291dGggQWZyaWNhIChSZXB1YmxpYyBvZiknKSwKLSAgKDY1NywgJ2VyJywgMiwgJ0VyaXRyZWEnKSwKLSAgKDcwMiwgJ2J6JywgMiwgJ0JlbGl6ZScpLAotICAoNzA0LCAnZ3QnLCAyLCAnR3VhdGVtYWxhIChSZXB1YmxpYyBvZiknKSwKLSAgKDcwNiwgJ3N2JywgMiwgJ0VsIFNhbHZhZG9yIChSZXB1YmxpYyBvZiknKSwKLSAgKDcwOCwgJ2huJywgMywgJ0hvbmR1cmFzIChSZXB1YmxpYyBvZiknKSwKLSAgKDcxMCwgJ25pJywgMiwgJ05pY2FyYWd1YScpLAotICAoNzEyLCAnY3InLCAyLCAnQ29zdGEgUmljYScpLAotICAoNzE0LCAncGEnLCAyLCAnUGFuYW1hIChSZXB1YmxpYyBvZiknKSwKLSAgKDcxNiwgJ3BlJywgMiwgJ1BlcnUnKSwKLSAgKDcyMiwgJ2FyJywgMywgJ0FyZ2VudGluZSBSZXB1YmxpYycpLAotICAoNzI0LCAnYnInLCAyLCAnQnJhemlsIChGZWRlcmF0aXZlIFJlcHVibGljIG9mKScpLAotICAoNzMwLCAnY2wnLCAyLCAnQ2hpbGUnKSwKLSAgKDczMiwgJ2NvJywgMywgJ0NvbG9tYmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDczNCwgJ3ZlJywgMiwgJ1ZlbmV6dWVsYSAoQm9saXZhcmlhbiBSZXB1YmxpYyBvZiknKSwKLSAgKDczNiwgJ2JvJywgMiwgJ0JvbGl2aWEgKFJlcHVibGljIG9mKScpLAotICAoNzM4LCAnZ3knLCAyLCAnR3V5YW5hJyksCi0gICg3NDAsICdlYycsIDIsICdFY3VhZG9yJyksCi0gICg3NDIsICdnZicsIDIsICdGcmVuY2ggR3VpYW5hIChGcmVuY2ggRGVwYXJ0bWVudCBvZiknKSwKLSAgKDc0NCwgJ3B5JywgMiwgJ1BhcmFndWF5IChSZXB1YmxpYyBvZiknKSwKLSAgKDc0NiwgJ3NyJywgMiwgJ1N1cmluYW1lIChSZXB1YmxpYyBvZiknKSwKLSAgKDc0OCwgJ3V5JywgMiwgJ1VydWd1YXkgKEVhc3Rlcm4gUmVwdWJsaWMgb2YpJyksCi0gICg3NTAsICdmaycsIDIsICdGYWxrbGFuZCBJc2xhbmRzIChNYWx2aW5hcyknKV0KLQotZ2V0X21jYyA9IGxhbWJkYSBlbHQ6IGVsdFswXQotZ2V0X2lzbyA9IGxhbWJkYSBlbHQ6IGVsdFsxXQotZ2V0X3NkID0gbGFtYmRhIGVsdDogZWx0WzJdCi1nZXRfdHogPSBsYW1iZGEgZWx0OiBsZW4oZWx0KSA+IDQgYW5kIGVsdFszXSBvciAnJwotZ2V0X2xhbmcgPSBsYW1iZGEgZWx0OiBsZW4oZWx0KSA+IDUgYW5kIGVsdFs0XSBvciAnJwotZ2V0X3dpZmkgPSBsYW1iZGEgZWx0OiBsZW4oZWx0KSA+IDYgYW5kIGVsdFs1XSBvciAwCi0KLW1jY19jb2RlcyA9IFsnMHglMDR4JyAlIGdldF9tY2MoZWx0KSBmb3IgZWx0IGluIG1jY190YWJsZV0KLXR6X3NldCA9IHNvcnRlZCh4IGZvciB4IGluIHNldChnZXRfdHooZWx0KSBmb3IgZWx0IGluIG1jY190YWJsZSkpCi1sYW5nX3NldCA9IHNvcnRlZCh4IGZvciB4IGluIHNldChnZXRfbGFuZyhlbHQpIGZvciBlbHQgaW4gbWNjX3RhYmxlKSkKLQotZGVmIG1rX2luZF9jb2RlKGVsdCk6Ci0gIGlzbyA9IGdldF9pc28oZWx0KQotICBpc29fY29kZSA9ICgob3JkKGlzb1swXSkgPDwgOCkgfCBvcmQoaXNvWzFdKSkgJiAweEZGRkYgIyAxNiBiaXRzCi0gIHdpZmkgPSBnZXRfd2lmaShlbHQpICYgMHgwMDBGICAgICAgICAgICAgICAgICAgICAgICAgICAjICA0IGJpdHMKLSAgc2QgPSBnZXRfc2QoZWx0KSAmIDB4MDAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIDIgYml0cwotICB0el9pbmQgPSB0el9zZXQuaW5kZXgoZ2V0X3R6KGVsdCkpICYgMHgwMDFGICAgICAgICAgICAgIyAgNSBiaXRzCi0gIGxhbmdfaW5kID0gbGFuZ19zZXQuaW5kZXgoZ2V0X2xhbmcoZWx0KSkgJiAweDAwMEYgICAgICAjICA0IGJpdHMKLSAgcmV0dXJuIChpc29fY29kZSA8PCAxNikgfCAod2lmaSA8PCAxMSkgfCAoc2QgPDwgOSkgfCAodHpfaW5kIDw8IDQpIHwgbGFuZ19pbmQKLQotaW5kX2NvZGVzID0gWycweCUwOHgnICUgbWtfaW5kX2NvZGUoZWx0KSBmb3IgZWx0IGluIG1jY190YWJsZV0KLQotZGVmIGZtdF9saXN0KHRpdGxlLCBsLCBiYXRjaF9zeik6Ci0gIHNsID0gW10KLSAgZm9yIGkgaW4gcmFuZ2UobGVuKGwpIC8gYmF0Y2hfc3ogKyAobGVuKGwpICUgYmF0Y2hfc3ogYW5kIDEgb3IgMCkpOgotICAgIGogPSBpICogYmF0Y2hfc3oKLSAgICBzbC5hcHBlbmQoKCcgJyAqIDgpICsgJywgJy5qb2luKGxbajpqICsgYmF0Y2hfc3pdKSkKLSAgcmV0dXJuICcgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgJXMgPSB7XG4nICUgdGl0bGUgKyAnLFxuJy5qb2luKHNsKSArICdcbiAgICB9O1xuJwotCi1kZWYgZG9fYXV0b2dlbl9jb21tZW50KGV4dHJhX2Rlc2M9W10pOgotICBwcmludCAnICAgIC8nICsgJyoqXG4gICAgKiBBVVRPIEdFTkVSQVRFRCAoYnkgdGhlIFB5dGhvbiBjb2RlIGFib3ZlKScKLSAgZm9yIGxpbmUgaW4gZXh0cmFfZGVzYzoKLSAgICBwcmludCAnICAgICogJXMnICUgbGluZQotICBwcmludCAnICAgIConICsgJy8nCi0KLWRvX2F1dG9nZW5fY29tbWVudCgpCi1wcmludCBmbXRfbGlzdCgnU3RyaW5nW10gVFpfU1RSSU5HUycsIFsnIiVzIicgJSB4IGZvciB4IGluIHR6X3NldF0sIDEpCi1kb19hdXRvZ2VuX2NvbW1lbnQoKQotcHJpbnQgZm10X2xpc3QoJ1N0cmluZ1tdIExBTkdfU1RSSU5HUycsIFsnIiVzIicgJSB4IGZvciB4IGluIGxhbmdfc2V0XSwgMTApCi1kb19hdXRvZ2VuX2NvbW1lbnQoWydUaGlzIHRhYmxlIGlzIGEgbGlzdCBvZiBNQ0MgY29kZXMuICBUaGUgaW5kZXggaW4gdGhpcyB0YWJsZScsCi0gICAgICAgICAgICAgICAgICAgICdvZiBhIGdpdmVuIE1DQyBjb2RlIGlzIHRoZSBpbmRleCBvZiBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCcsCi0gICAgICAgICAgICAgICAgICAgICd0aGF0IE1DQyBpbiB0aGUgSU5EX0NPREVTIHRhYmxlLiddKQotcHJpbnQgZm10X2xpc3QoJ3Nob3J0W10gTUNDX0NPREVTJywgbWNjX2NvZGVzLCAxMCkKLWRvX2F1dG9nZW5fY29tbWVudChbJ1RoZSB2YWx1ZXMgaW4gdGhpcyB0YWJsZSBhcmUgYnJva2VuIGRvd24gYXMgZm9sbG93cyAobXNiIHRvIGxzYik6JywKLSAgICAgICAgICAgICAgICAgICAgJyAgICBpc28gY291bnRyeSBjb2RlIDE2IGJpdHMnLAotICAgICAgICAgICAgICAgICAgICAnICAgICh1bnVzZWQpICAgICAgICAgIDEgYml0JywKLSAgICAgICAgICAgICAgICAgICAgJyAgICB3aWZpIGNoYW5uZWwgICAgICA0IGJpdHMnLAotICAgICAgICAgICAgICAgICAgICAnICAgIHNtYWxsZWQgZGlnaXQgICAgIDIgYml0cycsCi0gICAgICAgICAgICAgICAgICAgICcgICAgZGVmYXVsdCB0aW1lem9uZSAgNSBiaXRzJywKLSAgICAgICAgICAgICAgICAgICAgJyAgICBkZWZhdWx0IGxhbmd1YWdlICA0IGJpdHMnXSkKLXByaW50IGZtdF9saXN0KCdpbnRbXSBJTkRfQ09ERVMnLCBpbmRfY29kZXMsIDYpCi0KLWRlZiBwYXJzZV9pbmRfY29kZShpbmQpOgotICBtY2MgPSBldmFsKG1jY19jb2Rlc1tpbmRdKQotICBjb2RlID0gZXZhbChpbmRfY29kZXNbaW5kXSkKLSAgaXNvX2xzYiA9IGludCgoY29kZSA+PiAxNikgJiAweDAwRkYpCi0gIGlzb19tc2IgPSBpbnQoKGNvZGUgPj4gMjQpICYgMHgwMEZGKQotICBpc28gPSAnJXMlcycgJSAoY2hyKGlzb19tc2IpLCBjaHIoaXNvX2xzYikpCi0gIHdpZmkgPSBpbnQoKGNvZGUgPj4gMTEpICYgMHgwMDBGKQotICBzZCA9IGludCgoY29kZSA+PiA5KSAmIDB4MDAwMykKLSAgdHpfaW5kID0gKGNvZGUgPj4gNCkgJiAweDAwMUYKLSAgbGFuZ19pbmQgPSAoY29kZSA+PiAwKSAmIDB4MDAwRgotICByZXR1cm4gKG1jYywgaXNvLCBzZCwgdHpfc2V0W3R6X2luZF0sIGxhbmdfc2V0W2xhbmdfaW5kXSwgd2lmaSkKLQotZm10X3N0ciA9ICdtY2MgPSAlcywgaXNvID0gJXMsIHNkID0gJXMsIHR6ID0gJXMsIGxhbmcgPSAlcywgd2lmaSA9ICVzJwotb3JpZ190YWJsZSA9IFtmbXRfc3RyICUgKGdldF9tY2MoZWx0KSwgZ2V0X2lzbyhlbHQpLCBnZXRfc2QoZWx0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdHooZWx0KSwgZ2V0X2xhbmcoZWx0KSwgZ2V0X3dpZmkoZWx0KSkKLSAgICAgICAgICAgICAgZm9yIGVsdCBpbiBtY2NfdGFibGVdCi1kZXJpdmVkX3RhYmxlID0gW2ZtdF9zdHIgJSBwYXJzZV9pbmRfY29kZShpKSBmb3IgaSBpbiByYW5nZShsZW4oaW5kX2NvZGVzKSldCi1mb3IgaSBpbiByYW5nZShsZW4ob3JpZ190YWJsZSkpOgotICBpZiBvcmlnX3RhYmxlW2ldID09IGRlcml2ZWRfdGFibGVbaV06IGNvbnRpbnVlCi0gIHByaW50ICdNSVNNQVRDSCBFUlJPUiA6ICcsIG9yaWdfdGFibGVbaV0sICIgIT0gIiwgZGVyaXZlZF90YWJsZVtpXQotCi0qLworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgbGliY29yZS5pY3UuVGltZVpvbmVzOwogCiAvKioKICAqIE1vYmlsZSBDb3VudHJ5IENvZGUKQEAgLTM3MSwyMDAgKzM4LDE1MyBAQAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgTWNjVGFibGUKIHsKLSAgICAvKioKLSAgICAgKiBBVVRPIEdFTkVSQVRFRCAoYnkgdGhlIFB5dGhvbiBjb2RlIGFib3ZlKQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRaX1NUUklOR1MgPSB7Ci0gICAgICAgICIiLAotICAgICAgICAiQWZyaWNhL0pvaGFubmVzYnVyZyIsCi0gICAgICAgICJBc2lhL0JlaWppbmciLAotICAgICAgICAiQXNpYS9TaW5nYXBvcmUiLAotICAgICAgICAiQXNpYS9Ub2t5byIsCi0gICAgICAgICJBdXN0cmFsaWEvU3lkbmV5IiwKLSAgICAgICAgIkV1cm9wZS9BbXN0ZXJkYW0iLAotICAgICAgICAiRXVyb3BlL0JlcmxpbiIsCi0gICAgICAgICJFdXJvcGUvRHVibGluIiwKLSAgICAgICAgIkV1cm9wZS9Mb25kb24iLAotICAgICAgICAiRXVyb3BlL01hZHJpZCIsCi0gICAgICAgICJFdXJvcGUvUGFyaXMiLAotICAgICAgICAiRXVyb3BlL1ByYWd1ZSIsCi0gICAgICAgICJFdXJvcGUvUm9tZSIsCi0gICAgICAgICJFdXJvcGUvVmllbm5hIiwKLSAgICAgICAgIkV1cm9wZS9XYXJzYXciLAotICAgICAgICAiRXVyb3BlL1p1cmljaCIsCi0gICAgICAgICJQYWNpZmljL0F1Y2tsYW5kIgotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBBVVRPIEdFTkVSQVRFRCAoYnkgdGhlIFB5dGhvbiBjb2RlIGFib3ZlKQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExBTkdfU1RSSU5HUyA9IHsKLSAgICAgICAgIiIsICJjcyIsICJkZSIsICJlbiIsICJlcyIsICJmciIsICJpdCIsICJqYSIsICJubCIsICJ6aCIKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogQVVUTyBHRU5FUkFURUQgKGJ5IHRoZSBQeXRob24gY29kZSBhYm92ZSkKLSAgICAgKiBUaGlzIHRhYmxlIGlzIGEgbGlzdCBvZiBNQ0MgY29kZXMuICBUaGUgaW5kZXggaW4gdGhpcyB0YWJsZQotICAgICAqIG9mIGEgZ2l2ZW4gTUNDIGNvZGUgaXMgdGhlIGluZGV4IG9mIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0Ci0gICAgICogdGhhdCBNQ0MgaW4gdGhlIElORF9DT0RFUyB0YWJsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBzaG9ydFtdIE1DQ19DT0RFUyA9IHsKLSAgICAgICAgMHgwMGNhLCAweDAwY2MsIDB4MDBjZSwgMHgwMGQwLCAweDAwZDQsIDB4MDBkNSwgMHgwMGQ2LCAweDAwZDgsIDB4MDBkYSwgMHgwMGRiLAotICAgICAgICAweDAwZGMsIDB4MDBkZSwgMHgwMGUxLCAweDAwZTIsIDB4MDBlNCwgMHgwMGU2LCAweDAwZTcsIDB4MDBlOCwgMHgwMGVhLCAweDAwZWIsCi0gICAgICAgIDB4MDBlZSwgMHgwMGYwLCAweDAwZjIsIDB4MDBmNCwgMHgwMGY2LCAweDAwZjcsIDB4MDBmOCwgMHgwMGZhLCAweDAwZmYsIDB4MDEwMSwKLSAgICAgICAgMHgwMTAzLCAweDAxMDQsIDB4MDEwNiwgMHgwMTBhLCAweDAxMGMsIDB4MDEwZSwgMHgwMTEwLCAweDAxMTIsIDB4MDExNCwgMHgwMTE2LAotICAgICAgICAweDAxMTgsIDB4MDExYSwgMHgwMTFiLCAweDAxMWMsIDB4MDExZSwgMHgwMTIwLCAweDAxMjEsIDB4MDEyMiwgMHgwMTI0LCAweDAxMjUsCi0gICAgICAgIDB4MDEyNiwgMHgwMTI3LCAweDAxMjksIDB4MDEyZSwgMHgwMTM0LCAweDAxMzYsIDB4MDEzNywgMHgwMTM4LCAweDAxMzksIDB4MDEzYSwKLSAgICAgICAgMHgwMTNiLCAweDAxM2MsIDB4MDE0YSwgMHgwMTRjLCAweDAxNGUsIDB4MDE1MiwgMHgwMTU0LCAweDAxNTYsIDB4MDE1OCwgMHgwMTVhLAotICAgICAgICAweDAxNWMsIDB4MDE1ZSwgMHgwMTYwLCAweDAxNjIsIDB4MDE2NCwgMHgwMTY2LCAweDAxNjgsIDB4MDE2YSwgMHgwMTZiLCAweDAxNmMsCi0gICAgICAgIDB4MDE2ZCwgMHgwMTZlLCAweDAxNzAsIDB4MDE3MiwgMHgwMTc0LCAweDAxNzYsIDB4MDE3OCwgMHgwMTkwLCAweDAxOTEsIDB4MDE5MiwKLSAgICAgICAgMHgwMTk0LCAweDAxOTUsIDB4MDE5YSwgMHgwMTljLCAweDAxOWQsIDB4MDE5ZSwgMHgwMTlmLCAweDAxYTAsIDB4MDFhMSwgMHgwMWEyLAotICAgICAgICAweDAxYTMsIDB4MDFhNCwgMHgwMWE1LCAweDAxYTYsIDB4MDFhNywgMHgwMWE4LCAweDAxYTksIDB4MDFhYSwgMHgwMWFiLCAweDAxYWMsCi0gICAgICAgIDB4MDFhZCwgMHgwMWFlLCAweDAxYWYsIDB4MDFiMCwgMHgwMWIyLCAweDAxYjQsIDB4MDFiNSwgMHgwMWI2LCAweDAxYjgsIDB4MDFiOSwKLSAgICAgICAgMHgwMWMyLCAweDAxYzQsIDB4MDFjNiwgMHgwMWM3LCAweDAxYzgsIDB4MDFjOSwgMHgwMWNjLCAweDAxY2QsIDB4MDFkMiwgMHgwMWQzLAotICAgICAgICAweDAxZDYsIDB4MDFkOCwgMHgwMWY2LCAweDAxZjksIDB4MDFmZSwgMHgwMjAyLCAweDAyMDMsIDB4MDIwOCwgMHgwMjBkLCAweDAyMTAsCi0gICAgICAgIDB4MDIxMiwgMHgwMjE2LCAweDAyMTcsIDB4MDIxOCwgMHgwMjE5LCAweDAyMWIsIDB4MDIxYywgMHgwMjFkLCAweDAyMWUsIDB4MDIxZiwKLSAgICAgICAgMHgwMjIwLCAweDAyMjEsIDB4MDIyMiwgMHgwMjIzLCAweDAyMjQsIDB4MDIyNSwgMHgwMjI2LCAweDAyMjcsIDB4MDIyOCwgMHgwMjVhLAotICAgICAgICAweDAyNWIsIDB4MDI1YywgMHgwMjVkLCAweDAyNWUsIDB4MDI1ZiwgMHgwMjYwLCAweDAyNjEsIDB4MDI2MiwgMHgwMjYzLCAweDAyNjQsCi0gICAgICAgIDB4MDI2NSwgMHgwMjY2LCAweDAyNjcsIDB4MDI2OCwgMHgwMjY5LCAweDAyNmEsIDB4MDI2YiwgMHgwMjZjLCAweDAyNmQsIDB4MDI2ZSwKLSAgICAgICAgMHgwMjZmLCAweDAyNzAsIDB4MDI3MSwgMHgwMjcyLCAweDAyNzMsIDB4MDI3NCwgMHgwMjc1LCAweDAyNzYsIDB4MDI3NywgMHgwMjc4LAotICAgICAgICAweDAyNzksIDB4MDI3YSwgMHgwMjdiLCAweDAyN2MsIDB4MDI3ZCwgMHgwMjdlLCAweDAyN2YsIDB4MDI4MCwgMHgwMjgxLCAweDAyODIsCi0gICAgICAgIDB4MDI4MywgMHgwMjg1LCAweDAyODYsIDB4MDI4NywgMHgwMjg4LCAweDAyODksIDB4MDI4YSwgMHgwMjhiLCAweDAyOGMsIDB4MDI4ZCwKLSAgICAgICAgMHgwMjhlLCAweDAyOGYsIDB4MDI5MSwgMHgwMmJlLCAweDAyYzAsIDB4MDJjMiwgMHgwMmM0LCAweDAyYzYsIDB4MDJjOCwgMHgwMmNhLAotICAgICAgICAweDAyY2MsIDB4MDJkMiwgMHgwMmQ0LCAweDAyZGEsIDB4MDJkYywgMHgwMmRlLCAweDAyZTAsIDB4MDJlMiwgMHgwMmU0LCAweDAyZTYsCi0gICAgICAgIDB4MDJlOCwgMHgwMmVhLCAweDAyZWMsIDB4MDJlZQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBBVVRPIEdFTkVSQVRFRCAoYnkgdGhlIFB5dGhvbiBjb2RlIGFib3ZlKQotICAgICAqIFRoZSB2YWx1ZXMgaW4gdGhpcyB0YWJsZSBhcmUgYnJva2VuIGRvd24gYXMgZm9sbG93cyAobXNiIHRvIGxzYik6Ci0gICAgICogICAgIGlzbyBjb3VudHJ5IGNvZGUgMTYgYml0cwotICAgICAqICAgICAodW51c2VkKSAgICAgICAgICAxIGJpdAotICAgICAqICAgICB3aWZpIGNoYW5uZWwgICAgICA0IGJpdHMKLSAgICAgKiAgICAgc21hbGxlZCBkaWdpdCAgICAgMiBiaXRzCi0gICAgICogICAgIGRlZmF1bHQgdGltZXpvbmUgIDUgYml0cwotICAgICAqICAgICBkZWZhdWx0IGxhbmd1YWdlICA0IGJpdHMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBJTkRfQ09ERVMgPSB7Ci0gICAgICAgIDB4Njc3MjA0MDAsIDB4NmU2YzZjNjgsIDB4NjI2NTA0MDAsIDB4NjY3MjA0YjUsIDB4NmQ2MzA0MDAsIDB4NjE2NDA0MDAsCi0gICAgICAgIDB4NjU3MzA0YTQsIDB4Njg3NTA0MDAsIDB4NjI2MTA0MDAsIDB4Njg3MjA0MDAsIDB4NzI3MzA0MDAsIDB4Njk3NDA0ZDYsCi0gICAgICAgIDB4NzY2MTA0ZDYsIDB4NzI2ZjA0MDAsIDB4NjM2ODA1MDIsIDB4NjM3YTZjYzEsIDB4NzM2YjA0MDAsIDB4NjE3NDZjZTIsCi0gICAgICAgIDB4Njc2MjZjOTMsIDB4Njc2MjZjOTMsIDB4NjQ2YjA0MDAsIDB4NzM2NTA0MDAsIDB4NmU2ZjA0MDAsIDB4NjY2OTA0MDAsCi0gICAgICAgIDB4NmM3NDA0MDAsIDB4NmM3NjA0MDAsIDB4NjU2NTA0MDAsIDB4NzI3NTA0MDAsIDB4NzU2MTA0MDAsIDB4NjI3OTA0MDAsCi0gICAgICAgIDB4NmQ2NDA0MDAsIDB4NzA2YzA0ZjAsIDB4NjQ2NTZjNzIsIDB4Njc2OTA0MDAsIDB4NzA3NDA0MDAsIDB4NmM3NTA0MDAsCi0gICAgICAgIDB4Njk2NTA0ODMsIDB4Njk3MzA0MDAsIDB4NjE2YzA0MDAsIDB4NmQ3NDA0MDAsIDB4NjM3OTA0MDAsIDB4Njc2NTA0MDAsCi0gICAgICAgIDB4NjE2ZDA0MDAsIDB4NjI2NzA0MDAsIDB4NzQ3MjA0MDAsIDB4NjY2ZjA0MDAsIDB4Njc2NTA0MDAsIDB4Njc2YzA0MDAsCi0gICAgICAgIDB4NzM2ZDA0MDAsIDB4NzM2YzA0MDAsIDB4NmQ2YjA0MDAsIDB4NmM2OTA0MDAsIDB4NmQ2NTA0MDAsIDB4NjM2MTVlMDAsCi0gICAgICAgIDB4NzA2ZDA0MDAsIDB4NzU3MzVlMDMsIDB4NzU3MzVlMDMsIDB4NzU3MzVlMDMsIDB4NzU3MzVlMDMsIDB4NzU3MzVlMDMsCi0gICAgICAgIDB4NzU3MzVlMDMsIDB4NzU3MzVlMDMsIDB4NzA3MjA0MDAsIDB4NzY2OTA0MDAsIDB4NmQ3ODA2MDAsIDB4NmE2ZDA2MDAsCi0gICAgICAgIDB4Njc3MDA0MDAsIDB4NjI2MjA2MDAsIDB4NjE2NzA2MDAsIDB4NmI3OTA2MDAsIDB4NzY2NzA2MDAsIDB4NjI2ZDA0MDAsCi0gICAgICAgIDB4Njc2NDA0MDAsIDB4NmQ3MzA0MDAsIDB4NmI2ZTA0MDAsIDB4NmM2MzA0MDAsIDB4NzY2MzA0MDAsIDB4NmU2YzA0MDAsCi0gICAgICAgIDB4NjE3NzA0MDAsIDB4NjI3MzA0MDAsIDB4NjE2OTA2MDAsIDB4NjQ2ZDA0MDAsIDB4NjM3NTA0MDAsIDB4NjQ2ZjA0MDAsCi0gICAgICAgIDB4Njg3NDA0MDAsIDB4NzQ3NDA0MDAsIDB4NzQ2MzA0MDAsIDB4NjE3YTA0MDAsIDB4NmI3YTA0MDAsIDB4NjI3NDA0MDAsCi0gICAgICAgIDB4Njk2ZTA0MDAsIDB4Njk2ZTA0MDAsIDB4NzA2YjA0MDAsIDB4NjE2NjA0MDAsIDB4NmM2YjA0MDAsIDB4NmQ2ZDA0MDAsCi0gICAgICAgIDB4NmM2MjA0MDAsIDB4NmE2ZjA0MDAsIDB4NzM3OTA0MDAsIDB4Njk3MTA0MDAsIDB4NmI3NzA0MDAsIDB4NzM2MTA0MDAsCi0gICAgICAgIDB4Nzk2NTA0MDAsIDB4NmY2ZDA0MDAsIDB4NzA3MzA0MDAsIDB4NjE2NTA0MDAsIDB4Njk2YzA0MDAsIDB4NjI2ODA0MDAsCi0gICAgICAgIDB4NzE2MTA0MDAsIDB4NmQ2ZTA0MDAsIDB4NmU3MDA0MDAsIDB4NjE2NTA0MDAsIDB4NjE2NTA0MDAsIDB4Njk3MjA0MDAsCi0gICAgICAgIDB4NzU3YTA0MDAsIDB4NzQ2YTA0MDAsIDB4NmI2NzA0MDAsIDB4NzQ2ZDA0MDAsIDB4NmE3MDc0NDcsIDB4NmE3MDc0NDcsCi0gICAgICAgIDB4NmI3MjA0MDAsIDB4NzY2ZTA0MDAsIDB4Njg2YjA0MDAsIDB4NmQ2ZjA0MDAsIDB4NmI2ODA0MDAsIDB4NmM2MTA0MDAsCi0gICAgICAgIDB4NjM2ZTZjMjksIDB4NjM2ZTZjMjksIDB4NzQ3NzA0MDAsIDB4NmI3MDA0MDAsIDB4NjI2NDA0MDAsIDB4NmQ3NjA0MDAsCi0gICAgICAgIDB4NmQ3OTA0MDAsIDB4NjE3NTVjNTMsIDB4Njk2NDA0MDAsIDB4NzQ2YzA0MDAsIDB4NzA2ODA0MDAsIDB4NzQ2ODA0MDAsCi0gICAgICAgIDB4NzM2NzVjMzMsIDB4NjI2ZTA0MDAsIDB4NmU3YTA1MTMsIDB4NmQ3MDA0MDAsIDB4Njc3NTA0MDAsIDB4NmU3MjA0MDAsCi0gICAgICAgIDB4NzA2NzA0MDAsIDB4NzQ2ZjA0MDAsIDB4NzM2MjA0MDAsIDB4NzY3NTA0MDAsIDB4NjY2YTA0MDAsIDB4Nzc2NjA0MDAsCi0gICAgICAgIDB4NjE3MzA0MDAsIDB4NmI2OTA0MDAsIDB4NmU2MzA0MDAsIDB4NzA2NjA0MDAsIDB4NjM2YjA0MDAsIDB4Nzc3MzA0MDAsCi0gICAgICAgIDB4NjY2ZDA0MDAsIDB4NmQ2ODA0MDAsIDB4NzA3NzA0MDAsIDB4NjU2NzA0MDAsIDB4NjQ3YTA0MDAsIDB4NmQ2MTA0MDAsCi0gICAgICAgIDB4NzQ2ZTA0MDAsIDB4NmM3OTA0MDAsIDB4Njc2ZDA0MDAsIDB4NzM2ZTA0MDAsIDB4NmQ3MjA0MDAsIDB4NmQ2YzA0MDAsCi0gICAgICAgIDB4Njc2ZTA0MDAsIDB4NjM2OTA0MDAsIDB4NjI2NjA0MDAsIDB4NmU2NTA0MDAsIDB4NzQ2NzA0MDAsIDB4NjI2YTA0MDAsCi0gICAgICAgIDB4NmQ3NTA0MDAsIDB4NmM3MjA0MDAsIDB4NzM2YzA0MDAsIDB4Njc2ODA0MDAsIDB4NmU2NzA0MDAsIDB4NzQ2NDA0MDAsCi0gICAgICAgIDB4NjM2NjA0MDAsIDB4NjM2ZDA0MDAsIDB4NjM3NjA0MDAsIDB4NzM3NDA0MDAsIDB4Njc3MTA0MDAsIDB4Njc2MTA0MDAsCi0gICAgICAgIDB4NjM2NzA0MDAsIDB4NjM2NzA0MDAsIDB4NjE2ZjA0MDAsIDB4Njc3NzA0MDAsIDB4NzM2MzA0MDAsIDB4NzM2NDA0MDAsCi0gICAgICAgIDB4NzI3NzA0MDAsIDB4NjU3NDA0MDAsIDB4NzM2ZjA0MDAsIDB4NjQ2YTA0MDAsIDB4NmI2NTA0MDAsIDB4NzQ3YTA0MDAsCi0gICAgICAgIDB4NzU2NzA0MDAsIDB4NjI2OTA0MDAsIDB4NmQ3YTA0MDAsIDB4N2E2ZDA0MDAsIDB4NmQ2NzA0MDAsIDB4NzI2NTA0MDAsCi0gICAgICAgIDB4N2E3NzA0MDAsIDB4NmU2MTA0MDAsIDB4NmQ3NzA0MDAsIDB4NmM3MzA0MDAsIDB4NjI3NzA0MDAsIDB4NzM3YTA0MDAsCi0gICAgICAgIDB4NmI2ZDA0MDAsIDB4N2E2MTA0MTMsIDB4NjU3MjA0MDAsIDB4NjI3YTA0MDAsIDB4Njc3NDA0MDAsIDB4NzM3NjA0MDAsCi0gICAgICAgIDB4Njg2ZTA2MDAsIDB4NmU2OTA0MDAsIDB4NjM3MjA0MDAsIDB4NzA2MTA0MDAsIDB4NzA2NTA0MDAsIDB4NjE3MjA2MDAsCi0gICAgICAgIDB4NjI3MjA0MDAsIDB4NjM2YzA0MDAsIDB4NjM2ZjA2MDAsIDB4NzY2NTA0MDAsIDB4NjI2ZjA0MDAsIDB4Njc3OTA0MDAsCi0gICAgICAgIDB4NjU2MzA0MDAsIDB4Njc2NjA0MDAsIDB4NzA3OTA0MDAsIDB4NzM3MjA0MDAsIDB4NzU3OTA0MDAsIDB4NjY2YjA0MDAKLSAgICB9OwotCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIk1jY1RhYmxlIjsKIAorICAgIHN0YXRpYyBBcnJheUxpc3Q8TWNjRW50cnk+IHRhYmxlOworCisgICAgc3RhdGljIGNsYXNzIE1jY0VudHJ5IGltcGxlbWVudHMgQ29tcGFyYWJsZTxNY2NFbnRyeT4KKyAgICB7CisgICAgICAgIGludCBtY2M7CisgICAgICAgIFN0cmluZyBpc287CisgICAgICAgIGludCBzbWFsbGVzdERpZ2l0c01uYzsKKyAgICAgICAgU3RyaW5nIGxhbmd1YWdlOworICAgICAgICBpbnQgd2lmaUNoYW5uZWxzOworCisgICAgICAgIE1jY0VudHJ5KGludCBtbmMsIFN0cmluZyBpc28sIGludCBzbWFsbGVzdERpZ2l0c01DQykgeworICAgICAgICAgICAgdGhpcyhtbmMsIGlzbywgc21hbGxlc3REaWdpdHNNQ0MsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgTWNjRW50cnkoaW50IG1uYywgU3RyaW5nIGlzbywgaW50IHNtYWxsZXN0RGlnaXRzTUNDLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKKyAgICAgICAgICAgIHRoaXMobW5jLCBpc28sIHNtYWxsZXN0RGlnaXRzTUNDLCBsYW5ndWFnZSwgMCk7CisgICAgICAgIH0KKworICAgICAgICBNY2NFbnRyeShpbnQgbW5jLCBTdHJpbmcgaXNvLCBpbnQgc21hbGxlc3REaWdpdHNNQ0MsIFN0cmluZyBsYW5ndWFnZSwgaW50IHdpZmlDaGFubmVscykgeworICAgICAgICAgICAgdGhpcy5tY2MgPSBtbmM7CisgICAgICAgICAgICB0aGlzLmlzbyA9IGlzbzsKKyAgICAgICAgICAgIHRoaXMuc21hbGxlc3REaWdpdHNNbmMgPSBzbWFsbGVzdERpZ2l0c01DQzsKKyAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKKyAgICAgICAgICAgIHRoaXMud2lmaUNoYW5uZWxzID0gd2lmaUNoYW5uZWxzOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhNY2NFbnRyeSBvKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbWNjIC0gby5tY2M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNY2NFbnRyeQorICAgIGVudHJ5Rm9yTWNjKGludCBtY2MpCisgICAgeworICAgICAgICBpbnQgaW5kZXg7CisKKyAgICAgICAgTWNjRW50cnkgbTsKKworICAgICAgICBtID0gbmV3IE1jY0VudHJ5KG1jYywgbnVsbCwgMCk7CisKKyAgICAgICAgaW5kZXggPSBDb2xsZWN0aW9ucy5iaW5hcnlTZWFyY2godGFibGUsIG0pOworCisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHRhYmxlLmdldChpbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKLSAgICAgKiBHaXZlbiBhIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMgYSBkZWZhdWx0IHRpbWUgem9uZSBJRAotICAgICAqIGlmIGF2YWlsYWJsZS4gIFJldHVybnMgbnVsbCBpZiB1bmF2YWlsYWJsZS4KKyAgICAgKiBSZXR1cm5zIGEgZGVmYXVsdCB0aW1lIHpvbmUgSUQgZm9yIHRoZSBnaXZlbiBNQ0MuCisgICAgICogQHBhcmFtIG1jYyBNb2JpbGUgQ291bnRyeSBDb2RlCisgICAgICogQHJldHVybiBkZWZhdWx0IFRpbWVab25lIElELCBvciBudWxsIGlmIG5vdCBzcGVjaWZpZWQKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0VGltZVpvbmVGb3JNY2MoaW50IG1jYykgewotICAgICAgICBpbnQgaW5kZXggPSBBcnJheXMuYmluYXJ5U2VhcmNoKE1DQ19DT0RFUywgKHNob3J0KW1jYyk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgTWNjRW50cnkgZW50cnk7CisKKyAgICAgICAgZW50cnkgPSBlbnRyeUZvck1jYyhtY2MpOworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCB8fCBlbnRyeS5pc28gPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2NhbGUgbG9jYWxlOworICAgICAgICAgICAgaWYgKGVudHJ5Lmxhbmd1YWdlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKGVudHJ5Lmlzbyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoZW50cnkubGFuZ3VhZ2UsIGVudHJ5Lmlzbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmdbXSB0eiA9IFRpbWVab25lcy5mb3JMb2NhbGUobG9jYWxlKTsKKyAgICAgICAgICAgIGlmICh0ei5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gdHpbMF07CiAgICAgICAgIH0KLSAgICAgICAgaW50IGluZENvZGUgPSBJTkRfQ09ERVNbaW5kZXhdOwotICAgICAgICBpbnQgdHpJbmQgPSAoaW5kQ29kZSA+Pj4gNCkgJiAweDAwMUY7Ci0gICAgICAgIFN0cmluZyB0eiA9IFRaX1NUUklOR1NbdHpJbmRdOwotICAgICAgICBpZiAodHogPT0gIiIpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ejsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHaXZlbiBhIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMgYW4gSVNPIHR3by1jaGFyYWN0ZXIKLSAgICAgKiBjb3VudHJ5IGNvZGUgaWYgYXZhaWxhYmxlLiAgUmV0dXJucyAiIiBpZiB1bmF2YWlsYWJsZS4KKyAgICAgKiBHaXZlbiBhIEdTTSBNb2JpbGUgQ291bnRyeSBDb2RlLCByZXR1cm5zCisgICAgICogYW4gSVNPIHR3by1jaGFyYWN0ZXIgY291bnRyeSBjb2RlIGlmIGF2YWlsYWJsZS4KKyAgICAgKiBSZXR1cm5zICIiIGlmIHVuYXZhaWxhYmxlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvdW50cnlDb2RlRm9yTWNjKGludCBtY2MpIHsKLSAgICAgICAgaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChNQ0NfQ09ERVMsIChzaG9ydCltY2MpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcKKyAgICBjb3VudHJ5Q29kZUZvck1jYyhpbnQgbWNjKQorICAgIHsKKyAgICAgICAgTWNjRW50cnkgZW50cnk7CisKKyAgICAgICAgZW50cnkgPSBlbnRyeUZvck1jYyhtY2MpOworCisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZW50cnkuaXNvOwogICAgICAgICB9Ci0gICAgICAgIGludCBpbmRDb2RlID0gSU5EX0NPREVTW2luZGV4XTsKLSAgICAgICAgYnl0ZVtdIGlzbyA9IHsoYnl0ZSkoKGluZENvZGUgPj4+IDI0KSAmIDB4MDBGRiksIChieXRlKSgoaW5kQ29kZSA+Pj4gMTYpICYgMHgwMEZGKX07Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGlzbyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2l2ZW4gYSBHU00gTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucyBhbiBJU08gMi0zIGNoYXJhY3RlcgotICAgICAqIGxhbmd1YWdlIGNvZGUgaWYgYXZhaWxhYmxlLiAgUmV0dXJucyBudWxsIGlmIHVuYXZhaWxhYmxlLgorICAgICAqIEdpdmVuIGEgR1NNIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMKKyAgICAgKiBhbiBJU08gMi0zIGNoYXJhY3RlciBsYW5ndWFnZSBjb2RlIGlmIGF2YWlsYWJsZS4KKyAgICAgKiBSZXR1cm5zIG51bGwgaWYgdW5hdmFpbGFibGUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdExhbmd1YWdlRm9yTWNjKGludCBtY2MpIHsKLSAgICAgICAgaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChNQ0NfQ09ERVMsIChzaG9ydCltY2MpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIE1jY0VudHJ5IGVudHJ5OworCisgICAgICAgIGVudHJ5ID0gZW50cnlGb3JNY2MobWNjKTsKKworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZW50cnkubGFuZ3VhZ2U7CiAgICAgICAgIH0KLSAgICAgICAgaW50IGluZENvZGUgPSBJTkRfQ09ERVNbaW5kZXhdOwotICAgICAgICBpbnQgbGFuZ0luZCA9IGluZENvZGUgJiAweDAwMEY7Ci0gICAgICAgIFN0cmluZyBsYW5nID0gTEFOR19TVFJJTkdTW2xhbmdJbmRdOwotICAgICAgICBpZiAobGFuZyA9PSAiIikgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxhbmc7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2l2ZW4gYSBHU00gTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZwotICAgICAqIHNtYWxsZXN0IG51bWJlciBvZiBkaWdpdHMgZmllbGQuICBSZXR1cm5zIDIgaWYgdW5hdmFpbGFibGUuCisgICAgICogR2l2ZW4gYSBHU00gTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucworICAgICAqIHRoZSBzbWFsbGVzdCBudW1iZXIgb2YgZGlnaXRzIHRoYXQgTSBpZiBhdmFpbGFibGUuCisgICAgICogUmV0dXJucyAyIGlmIHVuYXZhaWxhYmxlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IHNtYWxsZXN0RGlnaXRzTWNjRm9yTW5jKGludCBtY2MpIHsKLSAgICAgICAgaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChNQ0NfQ09ERVMsIChzaG9ydCltY2MpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgcHVibGljIHN0YXRpYyBpbnQKKyAgICBzbWFsbGVzdERpZ2l0c01jY0Zvck1uYyhpbnQgbWNjKQorICAgIHsKKyAgICAgICAgTWNjRW50cnkgZW50cnk7CisKKyAgICAgICAgZW50cnkgPSBlbnRyeUZvck1jYyhtY2MpOworCisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRyeS5zbWFsbGVzdERpZ2l0c01uYzsKICAgICAgICAgfQotICAgICAgICBpbnQgaW5kQ29kZSA9IElORF9DT0RFU1tpbmRleF07Ci0gICAgICAgIGludCBzbURpZyA9IChpbmRDb2RlID4+PiA5KSAmIDB4MDAwMzsKLSAgICAgICAgcmV0dXJuIHNtRGlnOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdpdmVuIGEgR1NNIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMgdGhlIG51bWJlciBvZiB3aWZpCiAgICAgICogY2hhbm5lbHMgYWxsb3dlZCBpbiB0aGF0IGNvdW50cnkuICBSZXR1cm5zIDAgaWYgdW5hdmFpbGFibGUuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgd2lmaUNoYW5uZWxzRm9yTWNjKGludCBtY2MpIHsKLSAgICAgICAgaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChNQ0NfQ09ERVMsIChzaG9ydCltY2MpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgcHVibGljIHN0YXRpYyBpbnQKKyAgICB3aWZpQ2hhbm5lbHNGb3JNY2MoaW50IG1jYykgeworICAgICAgICBNY2NFbnRyeSBlbnRyeTsKKworICAgICAgICBlbnRyeSA9IGVudHJ5Rm9yTWNjKG1jYyk7CisKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGVudHJ5LndpZmlDaGFubmVsczsKICAgICAgICAgfQotICAgICAgICBpbnQgaW5kQ29kZSA9IElORF9DT0RFU1tpbmRleF07Ci0gICAgICAgIGludCB3aWZpID0gKGluZENvZGUgPj4+IDExKSAmIDB4MDAwRjsKLSAgICAgICAgcmV0dXJuIHdpZmk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02NTYsNCArMjc2LDI2MiBAQAogICAgICAgICAgICAgd00uc2V0TnVtQWxsb3dlZENoYW5uZWxzKHdpZmlDaGFubmVscywgdHJ1ZSk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBzdGF0aWMgeworICAgICAgICB0YWJsZSA9IG5ldyBBcnJheUxpc3Q8TWNjRW50cnk+KDI0MCk7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgdGFibGUgYmVsb3cgaXMgYnVpbHQgZnJvbSB0d28gcmVzb3VyY2VzOgorICAgICAgICAgKgorICAgICAgICAgKiAxKSBJVFUgIk1vYmlsZSBOZXR3b3JrIENvZGUgKE1OQykgZm9yIHRoZSBpbnRlcm5hdGlvbmFsCisgICAgICAgICAqICAgaWRlbnRpZmljYXRpb24gcGxhbiBmb3IgbW9iaWxlIHRlcm1pbmFscyBhbmQgbW9iaWxlIHVzZXJzIgorICAgICAgICAgKiAgIHdoaWNoIGlzIGF2YWlsYWJsZSBhcyBhbiBhbm5leCB0byB0aGUgSVRVIG9wZXJhdGlvbmFsIGJ1bGxldGluCisgICAgICAgICAqICAgYXZhaWxhYmxlIGhlcmU6IGh0dHA6Ly93d3cuaXR1LmludC9pdHUtdC9idWxsZXRpbi9hbm5leC5odG1sCisgICAgICAgICAqCisgICAgICAgICAqIDIpIFRoZSBJU08gMzE2NiBjb3VudHJ5IGNvZGVzIGxpc3QsIGF2YWlsYWJsZSBoZXJlOgorICAgICAgICAgKiAgICBodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2VuL3Byb2RzLXNlcnZpY2VzL2lzbzMxNjZtYS8wMmlzby0zMTY2LWNvZGUtbGlzdHMvaW5kZXguaHRtbAorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIHRhYmxlIGhhcyBub3QgYmVlbiB2ZXJpZmllZC4KKyAgICAgICAgICoKKyAgICAgICAgICovCisKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMDIsImdyIiwyKSk7CS8vR3JlZWNlCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjA0LCJubCIsMiwibmwiLDEzKSk7CS8vTmV0aGVybGFuZHMgKEtpbmdkb20gb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIwNiwiYmUiLDIpKTsJLy9CZWxnaXVtCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjA4LCJmciIsMiwiZnIiKSk7CS8vRnJhbmNlCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjEyLCJtYyIsMikpOwkvL01vbmFjbyAoUHJpbmNpcGFsaXR5IG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIxMywiYWQiLDIpKTsJLy9BbmRvcnJhIChQcmluY2lwYWxpdHkgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjE0LCJlcyIsMiwiZXMiKSk7CS8vU3BhaW4KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMTYsImh1IiwyKSk7CS8vSHVuZ2FyeSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjE4LCJiYSIsMikpOwkvL0Jvc25pYSBhbmQgSGVyemVnb3ZpbmEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMTksImhyIiwyKSk7CS8vQ3JvYXRpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjIwLCJycyIsMikpOwkvL1NlcmJpYSBhbmQgTW9udGVuZWdybworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIyMiwiaXQiLDIsIml0IikpOwkvL0l0YWx5CisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjI1LCJ2YSIsMiwiaXQiKSk7CS8vVmF0aWNhbiBDaXR5IFN0YXRlCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjI2LCJybyIsMikpOwkvL1JvbWFuaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMjgsImNoIiwyLCJkZSIpKTsJLy9Td2l0emVybGFuZCAoQ29uZmVkZXJhdGlvbiBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMzAsImN6IiwyLCJjcyIsMTMpKTsJLy9DemVjaCBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIzMSwic2siLDIpKTsJLy9TbG92YWsgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMzIsImF0IiwyLCJkZSIsMTMpKTsJLy9BdXN0cmlhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjM0LCJnYiIsMiwiZW4iLDEzKSk7CS8vVW5pdGVkIEtpbmdkb20gb2YgR3JlYXQgQnJpdGFpbiBhbmQgTm9ydGhlcm4gSXJlbGFuZAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIzNSwiZ2IiLDIsImVuIiwxMykpOwkvL1VuaXRlZCBLaW5nZG9tIG9mIEdyZWF0IEJyaXRhaW4gYW5kIE5vcnRoZXJuIElyZWxhbmQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMzgsImRrIiwyKSk7CS8vRGVubWFyaworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI0MCwic2UiLDIpKTsJLy9Td2VkZW4KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNDIsIm5vIiwyKSk7CS8vTm9yd2F5CisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjQ0LCJmaSIsMikpOwkvL0ZpbmxhbmQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNDYsImx0IiwyKSk7CS8vTGl0aHVhbmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNDcsImx2IiwyKSk7CS8vTGF0dmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNDgsImVlIiwyKSk7CS8vRXN0b25pYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjUwLCJydSIsMikpOwkvL1J1c3NpYW4gRmVkZXJhdGlvbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI1NSwidWEiLDIpKTsJLy9Va3JhaW5lCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjU3LCJieSIsMikpOwkvL0JlbGFydXMgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI1OSwibWQiLDIpKTsJLy9Nb2xkb3ZhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNjAsInBsIiwyKSk7CS8vUG9sYW5kIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNjIsImRlIiwyLCJkZSIsMTMpKTsJLy9HZXJtYW55IChGZWRlcmFsIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI2NiwiZ2kiLDIpKTsJLy9HaWJyYWx0YXIKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNjgsInB0IiwyKSk7CS8vUG9ydHVnYWwKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNzAsImx1IiwyKSk7CS8vTHV4ZW1ib3VyZworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI3MiwiaWUiLDIsImVuIikpOwkvL0lyZWxhbmQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNzQsImlzIiwyKSk7CS8vSWNlbGFuZAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI3NiwiYWwiLDIpKTsJLy9BbGJhbmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNzgsIm10IiwyKSk7CS8vTWFsdGEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODAsImN5IiwyKSk7CS8vQ3lwcnVzIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODIsImdlIiwyKSk7CS8vR2VvcmdpYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI4MywiYW0iLDIpKTsJLy9Bcm1lbmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODQsImJnIiwyKSk7CS8vQnVsZ2FyaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI4NiwidHIiLDIpKTsJLy9UdXJrZXkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODgsImZvIiwyKSk7CS8vRmFyb2UgSXNsYW5kcworICAgICAgICAgICAgICAgIHRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjg5LCJnZSIsMikpOyAgICAvL0Fia2hhemlhIChHZW9yZ2lhKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI5MCwiZ2wiLDIpKTsJLy9HcmVlbmxhbmQgKERlbm1hcmspCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjkyLCJzbSIsMikpOwkvL1NhbiBNYXJpbm8gKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI5Mywic2wiLDIpKTsJLy9TbG92ZW5pYSAoUmVwdWJsaWMgb2YpCisgICAgICAgICAgICAgICAgdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyOTQsIm1rIiwyKSk7ICAgLy9UaGUgRm9ybWVyIFl1Z29zbGF2IFJlcHVibGljIG9mIE1hY2Vkb25pYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI5NSwibGkiLDIpKTsJLy9MaWVjaHRlbnN0ZWluIChQcmluY2lwYWxpdHkgb2YpCisgICAgICAgICAgICAgICAgdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyOTcsIm1lIiwyKSk7ICAgIC8vTW9udGVuZWdybyAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzAyLCJjYSIsMywiIiwxMSkpOwkvL0NhbmFkYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMwOCwicG0iLDIpKTsJLy9TYWludCBQaWVycmUgYW5kIE1pcXVlbG9uIChDb2xsZWN0aXZpdCB0ZXJyaXRvcmlhbGUgZGUgbGEgUnB1YmxpcXVlIGZyYW5haXNlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxMCwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxMSwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxMiwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxMywidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxNCwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxNSwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxNiwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMzMCwicHIiLDIpKTsJLy9QdWVydG8gUmljbworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMzMiwidmkiLDIpKTsJLy9Vbml0ZWQgU3RhdGVzIFZpcmdpbiBJc2xhbmRzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzM0LCJteCIsMykpOwkvL01leGljbworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMzOCwiam0iLDMpKTsJLy9KYW1haWNhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzQwLCJncCIsMikpOwkvL0d1YWRlbG91cGUgKEZyZW5jaCBEZXBhcnRtZW50IG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM0MiwiYmIiLDMpKTsJLy9CYXJiYWRvcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM0NCwiYWciLDMpKTsJLy9BbnRpZ3VhIGFuZCBCYXJidWRhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzQ2LCJreSIsMykpOwkvL0NheW1hbiBJc2xhbmRzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzQ4LCJ2ZyIsMykpOwkvL0JyaXRpc2ggVmlyZ2luIElzbGFuZHMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNTAsImJtIiwyKSk7CS8vQmVybXVkYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM1MiwiZ2QiLDIpKTsJLy9HcmVuYWRhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzU0LCJtcyIsMikpOwkvL01vbnRzZXJyYXQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNTYsImtuIiwyKSk7CS8vU2FpbnQgS2l0dHMgYW5kIE5ldmlzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzU4LCJsYyIsMikpOwkvL1NhaW50IEx1Y2lhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzYwLCJ2YyIsMikpOwkvL1NhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzYyLCJubCIsMikpOwkvL05ldGhlcmxhbmRzIEFudGlsbGVzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzYzLCJhdyIsMikpOwkvL0FydWJhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzY0LCJicyIsMikpOwkvL0JhaGFtYXMgKENvbW1vbndlYWx0aCBvZiB0aGUpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzY1LCJhaSIsMykpOwkvL0FuZ3VpbGxhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzY2LCJkbSIsMikpOwkvL0RvbWluaWNhIChDb21tb253ZWFsdGggb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzY4LCJjdSIsMikpOwkvL0N1YmEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNzAsImRvIiwyKSk7CS8vRG9taW5pY2FuIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzcyLCJodCIsMikpOwkvL0hhaXRpIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNzQsInR0IiwyKSk7CS8vVHJpbmlkYWQgYW5kIFRvYmFnbworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM3NiwidGMiLDIpKTsJLy9UdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MDAsImF6IiwyKSk7CS8vQXplcmJhaWphbmkgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MDEsImt6IiwyKSk7CS8vS2F6YWtoc3RhbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDAyLCJidCIsMikpOwkvL0JodXRhbiAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MDQsImluIiwyKSk7CS8vSW5kaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQwNSwiaW4iLDIpKTsJLy9JbmRpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDEwLCJwayIsMikpOwkvL1Bha2lzdGFuIChJc2xhbWljIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxMiwiYWYiLDIpKTsJLy9BZmdoYW5pc3RhbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxMywibGsiLDIpKTsJLy9TcmkgTGFua2EgKERlbW9jcmF0aWMgU29jaWFsaXN0IFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxNCwibW0iLDIpKTsJLy9NeWFubWFyIChVbmlvbiBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTUsImxiIiwyKSk7CS8vTGViYW5vbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxNiwiam8iLDIpKTsJLy9Kb3JkYW4gKEhhc2hlbWl0ZSBLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxNywic3kiLDIpKTsJLy9TeXJpYW4gQXJhYiBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxOCwiaXEiLDIpKTsJLy9JcmFxIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTksImt3IiwyKSk7CS8vS3V3YWl0IChTdGF0ZSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjAsInNhIiwyKSk7CS8vU2F1ZGkgQXJhYmlhIChLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyMSwieWUiLDIpKTsJLy9ZZW1lbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDIyLCJvbSIsMikpOwkvL09tYW4gKFN1bHRhbmF0ZSBvZikKKyAgICAgICAgICAgICAgICB0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyMywicHMiLDIpKTsgICAgLy9QYWxlc3RpbmUKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjQsImFlIiwyKSk7CS8vVW5pdGVkIEFyYWIgRW1pcmF0ZXMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjUsImlsIiwyKSk7CS8vSXNyYWVsIChTdGF0ZSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjYsImJoIiwyKSk7CS8vQmFocmFpbiAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjcsInFhIiwyKSk7CS8vUWF0YXIgKFN0YXRlIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyOCwibW4iLDIpKTsJLy9Nb25nb2xpYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyOSwibnAiLDIpKTsJLy9OZXBhbAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzMCwiYWUiLDIpKTsJLy9Vbml0ZWQgQXJhYiBFbWlyYXRlcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzMSwiYWUiLDIpKTsJLy9Vbml0ZWQgQXJhYiBFbWlyYXRlcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzMiwiaXIiLDIpKTsJLy9JcmFuIChJc2xhbWljIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzNCwidXoiLDIpKTsJLy9VemJla2lzdGFuIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MzYsInRqIiwyKSk7CS8vVGFqaWtpc3RhbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDM3LCJrZyIsMikpOwkvL0t5cmd5eiBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzOCwidG0iLDIpKTsJLy9UdXJrbWVuaXN0YW4KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NDAsImpwIiwyLCJqYSIsMTQpKTsJLy9KYXBhbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ0MSwianAiLDIsImphIiwxNCkpOwkvL0phcGFuCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDUwLCJrciIsMiwia28iLDEzKSk7CS8vS29yZWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ1Miwidm4iLDIpKTsJLy9WaWV0IE5hbSAoU29jaWFsaXN0IFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ1NCwiaGsiLDIpKTsJLy8iSG9uZyBLb25nLCBDaGluYSIKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NTUsIm1vIiwyKSk7CS8vIk1hY2FvLCBDaGluYSIKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NTYsImtoIiwyKSk7CS8vQ2FtYm9kaWEgKEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDU3LCJsYSIsMikpOwkvL0xhbyBQZW9wbGUncyBEZW1vY3JhdGljIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDYwLCJjbiIsMiwiemgiLDEzKSk7CS8vQ2hpbmEgKFBlb3BsZSdzIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ2MSwiY24iLDIsInpoIiwxMykpOwkvL0NoaW5hIChQZW9wbGUncyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NjYsInR3IiwyKSk7CS8vIlRhaXdhbiwgQ2hpbmEiCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDY3LCJrcCIsMikpOwkvL0RlbW9jcmF0aWMgUGVvcGxlJ3MgUmVwdWJsaWMgb2YgS29yZWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NzAsImJkIiwyKSk7CS8vQmFuZ2xhZGVzaCAoUGVvcGxlJ3MgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDcyLCJtdiIsMikpOwkvL01hbGRpdmVzIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MDIsIm15IiwyKSk7CS8vTWFsYXlzaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MDUsImF1IiwyLCJlbiIsMTEpKTsJLy9BdXN0cmFsaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MTAsImlkIiwyKSk7CS8vSW5kb25lc2lhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MTQsInRsIiwyKSk7CS8vRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiBUaW1vci1MZXN0ZQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUxNSwicGgiLDIpKTsJLy9QaGlsaXBwaW5lcyAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUyMCwidGgiLDIpKTsJLy9UaGFpbGFuZAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUyNSwic2ciLDIsImVuIiwxMSkpOwkvL1NpbmdhcG9yZSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTI4LCJibiIsMikpOwkvL0JydW5laSBEYXJ1c3NhbGFtCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTMwLCJueiIsMiwgImVuIikpOwkvL05ldyBaZWFsYW5kCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTM0LCJtcCIsMikpOwkvL05vcnRoZXJuIE1hcmlhbmEgSXNsYW5kcyAoQ29tbW9ud2VhbHRoIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MzUsImd1IiwyKSk7CS8vR3VhbQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUzNiwibnIiLDIpKTsJLy9OYXVydSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTM3LCJwZyIsMikpOwkvL1BhcHVhIE5ldyBHdWluZWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MzksInRvIiwyKSk7CS8vVG9uZ2EgKEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQwLCJzYiIsMikpOwkvL1NvbG9tb24gSXNsYW5kcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0MSwidnUiLDIpKTsJLy9WYW51YXR1IChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NDIsImZqIiwyKSk7CS8vRmlqaSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQzLCJ3ZiIsMikpOwkvL1dhbGxpcyBhbmQgRnV0dW5hIChUZXJyaXRvaXJlIGZyYW5haXMgZCdvdXRyZS1tZXIpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQ0LCJhcyIsMikpOwkvL0FtZXJpY2FuIFNhbW9hCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQ1LCJraSIsMikpOwkvL0tpcmliYXRpIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NDYsIm5jIiwyKSk7CS8vTmV3IENhbGVkb25pYSAoVGVycml0b2lyZSBmcmFuYWlzIGQnb3V0cmUtbWVyKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0NywicGYiLDIpKTsJLy9GcmVuY2ggUG9seW5lc2lhIChUZXJyaXRvaXJlIGZyYW5haXMgZCdvdXRyZS1tZXIpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQ4LCJjayIsMikpOwkvL0Nvb2sgSXNsYW5kcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0OSwid3MiLDIpKTsJLy9TYW1vYSAoSW5kZXBlbmRlbnQgU3RhdGUgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTUwLCJmbSIsMikpOwkvL01pY3JvbmVzaWEgKEZlZGVyYXRlZCBTdGF0ZXMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTUxLCJtaCIsMikpOwkvL01hcnNoYWxsIElzbGFuZHMgKFJlcHVibGljIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NTIsInB3IiwyKSk7CS8vUGFsYXUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYwMiwiZWciLDIpKTsJLy9FZ3lwdCAoQXJhYiBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDMsImR6IiwyKSk7CS8vQWxnZXJpYSAoUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDQsIm1hIiwyKSk7CS8vTW9yb2NjbyAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDUsInRuIiwyKSk7CS8vVHVuaXNpYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYwNiwibHkiLDIpKTsJLy9MaWJ5YSAoU29jaWFsaXN0IFBlb3BsZSdzIExpYnlhbiBBcmFiIEphbWFoaXJpeWEpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjA3LCJnbSIsMikpOwkvL0dhbWJpYSAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYwOCwic24iLDIpKTsJLy9TZW5lZ2FsIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDksIm1yIiwyKSk7CS8vTWF1cml0YW5pYSAoSXNsYW1pYyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MTAsIm1sIiwyKSk7CS8vTWFsaSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjExLCJnbiIsMikpOwkvL0d1aW5lYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjEyLCJjaSIsMikpOwkvL0N0ZSBkJ0l2b2lyZSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjEzLCJiZiIsMikpOwkvL0J1cmtpbmEgRmFzbworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxNCwibmUiLDIpKTsJLy9OaWdlciAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxNSwidGciLDIpKTsJLy9Ub2dvbGVzZSBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxNiwiYmoiLDIpKTsJLy9CZW5pbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjE3LCJtdSIsMikpOwkvL01hdXJpdGl1cyAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjE4LCJsciIsMikpOwkvL0xpYmVyaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxOSwic2wiLDIpKTsJLy9TaWVycmEgTGVvbmUKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjAsImdoIiwyKSk7CS8vR2hhbmEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjEsIm5nIiwyKSk7CS8vTmlnZXJpYSAoRmVkZXJhbCBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjIsInRkIiwyKSk7CS8vQ2hhZCAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjIzLCJjZiIsMikpOwkvL0NlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYyNCwiY20iLDIpKTsJLy9DYW1lcm9vbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjI1LCJjdiIsMikpOwkvL0NhcGUgVmVyZGUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYyNiwic3QiLDIpKTsJLy9TYW8gVG9tZSBhbmQgUHJpbmNpcGUgKERlbW9jcmF0aWMgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjI3LCJncSIsMikpOwkvL0VxdWF0b3JpYWwgR3VpbmVhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjgsImdhIiwyKSk7CS8vR2Fib25lc2UgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjksImNnIiwyKSk7CS8vQ29uZ28gKFJlcHVibGljIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzAsImNnIiwyKSk7CS8vRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUgQ29uZ28KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzEsImFvIiwyKSk7CS8vQW5nb2xhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzIsImd3IiwyKSk7CS8vR3VpbmVhLUJpc3NhdSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjMzLCJzYyIsMikpOwkvL1NleWNoZWxsZXMgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzNCwic2QiLDIpKTsJLy9TdWRhbiAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzNSwicnciLDIpKTsJLy9Sd2FuZGEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzNiwiZXQiLDIpKTsJLy9FdGhpb3BpYSAoRmVkZXJhbCBEZW1vY3JhdGljIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzNywic28iLDIpKTsJLy9Tb21hbGkgRGVtb2NyYXRpYyBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzOCwiZGoiLDIpKTsJLy9Eamlib3V0aSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjM5LCJrZSIsMikpOwkvL0tlbnlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDAsInR6IiwyKSk7CS8vVGFuemFuaWEgKFVuaXRlZCBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDEsInVnIiwyKSk7CS8vVWdhbmRhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDIsImJpIiwyKSk7CS8vQnVydW5kaSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQzLCJteiIsMikpOwkvL01vemFtYmlxdWUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY0NSwiem0iLDIpKTsJLy9aYW1iaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY0NiwibWciLDIpKTsJLy9NYWRhZ2FzY2FyIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDcsInJlIiwyKSk7CS8vUmV1bmlvbiAoRnJlbmNoIERlcGFydG1lbnQgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQ4LCJ6dyIsMikpOwkvL1ppbWJhYndlIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDksIm5hIiwyKSk7CS8vTmFtaWJpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjUwLCJtdyIsMikpOwkvL01hbGF3aQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1MSwibHMiLDIpKTsJLy9MZXNvdGhvIChLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1MiwiYnciLDIpKTsJLy9Cb3Rzd2FuYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjUzLCJzeiIsMikpOwkvL1N3YXppbGFuZCAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NTQsImttIiwyKSk7CS8vQ29tb3JvcyAoVW5pb24gb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1NSwiemEiLDIsImVuIikpOwkvL1NvdXRoIEFmcmljYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjU3LCJlciIsMikpOwkvL0VyaXRyZWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MDIsImJ6IiwyKSk7CS8vQmVsaXplCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzA0LCJndCIsMikpOwkvL0d1YXRlbWFsYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzA2LCJzdiIsMikpOwkvL0VsIFNhbHZhZG9yIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MDgsImhuIiwzKSk7CS8vSG9uZHVyYXMgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcxMCwibmkiLDIpKTsJLy9OaWNhcmFndWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MTIsImNyIiwyKSk7CS8vQ29zdGEgUmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcxNCwicGEiLDIpKTsJLy9QYW5hbWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcxNiwicGUiLDIpKTsJLy9QZXJ1CisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzIyLCJhciIsMykpOwkvL0FyZ2VudGluZSBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcyNCwiYnIiLDIpKTsJLy9CcmF6aWwgKEZlZGVyYXRpdmUgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzMwLCJjbCIsMikpOwkvL0NoaWxlCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzMyLCJjbyIsMykpOwkvL0NvbG9tYmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MzQsInZlIiwyKSk7CS8vVmVuZXp1ZWxhIChCb2xpdmFyaWFuIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDczNiwiYm8iLDIpKTsJLy9Cb2xpdmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MzgsImd5IiwyKSk7CS8vR3V5YW5hCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzQwLCJlYyIsMikpOwkvL0VjdWFkb3IKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3NDIsImdmIiwyKSk7CS8vRnJlbmNoIEd1aWFuYSAoRnJlbmNoIERlcGFydG1lbnQgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzQ0LCJweSIsMikpOwkvL1BhcmFndWF5IChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3NDYsInNyIiwyKSk7CS8vU3VyaW5hbWUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDc0OCwidXkiLDIpKTsJLy9VcnVndWF5IChFYXN0ZXJuIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDc1MCwiZmsiLDIpKTsJLy9GYWxrbGFuZCBJc2xhbmRzIChNYWx2aW5hcykKKyAgICAgICAgLy90YWJsZS5hZGQobmV3IE1jY0VudHJ5KDkwMSwiIiwyKSk7CS8vIkludGVybmF0aW9uYWwgTW9iaWxlLCBzaGFyZWQgY29kZSIKKworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRhYmxlKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZS5qYXZhCmluZGV4IGU0MjZlOTQuLjI5NTdjN2UgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZS5qYXZhCkBAIC0xNywxMCArMTcsMTAgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtDYXBhYmlsaXRpZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuQ2VsbExvY2F0aW9uOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lU3RhdGVMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGU7CkBAIC0yOCw3ICsyOCw2IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRGF0YUNvbm5lY3Rpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5OZXR3b3JrSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdzbURhdGFDb25uZWN0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LlNpbXVsYXRlZFJhZGlvQ29udHJvbDsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtOTksMTEgKzk4LDEyIEBACiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9ORV9OQU1FX0tFWSA9ICJwaG9uZU5hbWUiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRV9SRUFTT05fS0VZID0gInJlYXNvbiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9DSEFOR0VfUkVBU09OX0tFWSA9ICJyZWFzb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9BUE5fVFlQRVNfS0VZID0gImFwblR5cGUiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9BUE5fVFlQRV9LRVkgPSAiYXBuVHlwZSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0FQTl9LRVkgPSAiYXBuIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfTElOS19QUk9QRVJUSUVTX0tFWSA9ICJsaW5rUHJvcGVydGllcyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0xJTktfQ0FQQUJJTElUSUVTX0tFWSA9ICJsaW5rQ2FwYWJpbGl0aWVzIjsKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9JRkFDRV9OQU1FX0tFWSA9ICJpZmFjZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0dBVEVXQVlfS0VZID0gImdhdGV3YXkiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS19VTkFWQUlMQUJMRV9LRVkgPSAibmV0d29ya1VudmFpbGFibGUiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhPTkVfSU5fRUNNX1NUQVRFID0gInBob25laW5FQ01TdGF0ZSI7CiAKQEAgLTI0MywxMyArMjQzLDIxIEBACiAgICAgQ2VsbExvY2F0aW9uIGdldENlbGxMb2NhdGlvbigpOwogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSBjdXJyZW50IERhdGFTdGF0ZS4gTm8gY2hhbmdlIG5vdGlmaWNhdGlvbiBleGlzdHMgYXQgdGhpcwotICAgICAqIGludGVyZmFjZSAtLSB1c2UKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgZm9yIHRoZSBkZWZhdWx0IGFwbiBEYXRhU3RhdGUuIE5vIGNoYW5nZSBub3RpZmljYXRpb24KKyAgICAgKiBleGlzdHMgYXQgdGhpcyBpbnRlcmZhY2UgLS0gdXNlCiAgICAgICoge0BsaW5rIGFuZHJvaWQudGVsZXBob255LlBob25lU3RhdGVMaXN0ZW5lcn0gaW5zdGVhZC4KICAgICAgKi8KICAgICBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpOwogCiAgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IERhdGFTdGF0ZS4gTm8gY2hhbmdlIG5vdGlmaWNhdGlvbiBleGlzdHMgYXQgdGhpcworICAgICAqIGludGVyZmFjZSAtLSB1c2UKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVTdGF0ZUxpc3RlbmVyfSBpbnN0ZWFkLgorICAgICAqIEBwYXJhbSBhcG5UeXBlIHNwZWNpZnkgZm9yIHdoaWNoIGFwbiB0byBnZXQgY29ubmVjdGlvbiBzdGF0ZSBpbmZvLgorICAgICAqLworICAgIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKFN0cmluZyBhcG5UeXBlKTsKKworICAgIC8qKgogICAgICAqIEdldCB0aGUgY3VycmVudCBEYXRhQWN0aXZpdHlTdGF0ZS4gTm8gY2hhbmdlIG5vdGlmaWNhdGlvbiBleGlzdHMgYXQgdGhpcwogICAgICAqIGludGVyZmFjZSAtLSB1c2UKICAgICAgKiB7QGxpbmsgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcn0gaW5zdGVhZC4KQEAgLTMxMyw2ICszMjEsMTYgQEAKICAgICBTdHJpbmcgZ2V0QWN0aXZlQXBuKCk7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIExpbmtQcm9wZXJ0aWVzIGZvciB0aGUgbmFtZWQgYXBuIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZQorICAgICAqLworICAgIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKFN0cmluZyBhcG5UeXBlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTGlua0NhcGFiaWxpdGllcworICAgICAqLworICAgIExpbmtDYXBhYmlsaXRpZXMgZ2V0TGlua0NhcGFiaWxpdGllcyhTdHJpbmcgYXBuVHlwZSk7CisKKyAgICAvKioKICAgICAgKiBHZXQgY3VycmVudCBzaWduYWwgc3RyZW5ndGguIE5vIGNoYW5nZSBub3RpZmljYXRpb24gYXZhaWxhYmxlIG9uIHRoaXMKICAgICAgKiBpbnRlcmZhY2UuIFVzZSA8Y29kZT5QaG9uZVN0YXRlTm90aWZpZXI8L2NvZGU+IG9yIGFuIGVxdWl2YWxlbnQuCiAgICAgICogQW4gQVNVIGlzIDAtMzEgb3IgLTEgaWYgdW5rbm93biAoZm9yIEdTTSwgZEJtID0gLTExMyAtIDIgKiBhc3UpLgpAQCAtMTM3MywyOSArMTM5MSw2IEBACiAgICAgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbmV0d29yayBpbnRlcmZhY2UgdXNlZCBieSB0aGUgc3BlY2lmaWVkIEFQTiB0eXBlLgotICAgICAqLwotICAgIFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lKFN0cmluZyBhcG5UeXBlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHVzZWQgYnkgdGhlIHNwZWNpZmllZAotICAgICAqIEFQTiB0eXBlLgotICAgICAqLwotICAgIFN0cmluZyBnZXRJcEFkZHJlc3MoU3RyaW5nIGFwblR5cGUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZ2F0ZXdheSBmb3IgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHVzZWQgYnkgdGhlIHNwZWNpZmllZCBBUE4KLSAgICAgKiB0eXBlLgotICAgICAqLwotICAgIFN0cmluZyBnZXRHYXRld2F5KFN0cmluZyBhcG5UeXBlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEROUyBzZXJ2ZXJzIGZvciB0aGUgbmV0d29yayBpbnRlcmZhY2UgdXNlZCBieSB0aGUgc3BlY2lmaWVkCi0gICAgICogQVBOIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldERuc1NlcnZlcnMoU3RyaW5nIGFwblR5cGUpOwotCi0gICAgLyoqCiAgICAgICogUmV0cmlldmVzIHRoZSB1bmlxdWUgZGV2aWNlIElELCBlLmcuLCBJTUVJIGZvciBHU00gcGhvbmVzIGFuZCBNRUlEIGZvciBDRE1BIHBob25lcy4KICAgICAgKi8KICAgICBTdHJpbmcgZ2V0RGV2aWNlSWQoKTsKQEAgLTE1NDAsNiArMTUzNSwxMSBAQAogICAgIGJvb2xlYW4gaXNPdGFTcE51bWJlcihTdHJpbmcgZGlhbFN0cik7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgT1RBIFNlcnZpY2UgUHJvdmlzaW9uaW5nIG5lZWRzIHRvIGJlIHBlcmZvcm1lZC4KKyAgICAgKi8KKyAgICBib29sZWFuIG5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpOworCisgICAgLyoqCiAgICAgICogUmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnMgd2hlbiBDRE1BIGNhbGwgd2FpdGluZyBjb21lcwogICAgICAqCiAgICAgICogQHBhcmFtIGggSGFuZGxlciB0aGF0IHJlY2VpdmVzIHRoZSBub3RpZmljYXRpb24gbWVzc2FnZS4KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZUJhc2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZUJhc2UuamF2YQppbmRleCAxNjc0YWQ2Li43NGU4YzFiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVCYXNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lQmFzZS5qYXZhCkBAIC0yMSw2ICsyMSw4IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rQ2FwYWJpbGl0aWVzOworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CkBAIC0zNSwxMCArMzcsOCBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR3NtRGF0YUNvbm5lY3Rpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3QuU2ltdWxhdGVkUmFkaW9Db250cm9sOwogCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAogCkBAIC03NDEsOCArNzQxLDEzIEBACiAgICAgICAgIG1Ob3RpZmllci5ub3RpZnlNZXNzYWdlV2FpdGluZ0NoYW5nZWQodGhpcyk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oU3RyaW5nIHJlYXNvbikgewotICAgICAgICBtTm90aWZpZXIubm90aWZ5RGF0YUNvbm5lY3Rpb24odGhpcywgcmVhc29uKTsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSwKKyAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSkgeworICAgICAgICBtTm90aWZpZXIubm90aWZ5RGF0YUNvbm5lY3Rpb24odGhpcywgcmVhc29uLCBhcG5UeXBlLCBzdGF0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgbU5vdGlmaWVyLm5vdGlmeURhdGFDb25uZWN0aW9uKHRoaXMsIHJlYXNvbiwgYXBuVHlwZSk7CiAgICAgfQogCiAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQaG9uZU5hbWUoKTsKQEAgLTgyOCw5ICs4MzMsMTkgQEAKICAgICAgICAgbG9nVW5leHBlY3RlZENkbWFNZXRob2RDYWxsKCJ1bnJlZ2lzdGVyRm9yU3Vic2NyaXB0aW9uSW5mb1JlYWR5Iik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIE9UQSBTZXJ2aWNlIFByb3Zpc2lvbmluZyBuZWVkcyB0byBiZSBwZXJmb3JtZWQuCisgICAgICogSWYgbm90IG92ZXJyaWRkZW4gcmV0dXJuIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIG51bWJlciBpcyBhbiBPVEFTUCBudW1iZXIuCisgICAgICogSWYgbm90IG92ZXJyaWRkZW4gcmV0dXJuIGZhbHNlLgorICAgICAqLwogICAgIHB1YmxpYyAgYm9vbGVhbiBpc090YVNwTnVtYmVyKFN0cmluZyBkaWFsU3RyKSB7Ci0gICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGNsYXNzIENETUFQaG9uZS4gTm90IGltcGxlbWVudGVkIGluIEdTTVBob25lLgotICAgICAgICBsb2dVbmV4cGVjdGVkQ2RtYU1ldGhvZENhbGwoImlzT3RhU3BOdW1iZXIiKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtOTIwLDMwICs5MzUsMjIgQEAKICAgICAgICAgIGxvZ1VuZXhwZWN0ZWRDZG1hTWV0aG9kQ2FsbCgidW5zZXRPbkVjYk1vZGVFeGl0UmVzcG9uc2UiKTsKICAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lKFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZ2V0SW50ZXJmYWNlTmFtZShhcG5UeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElwQWRkcmVzcyhTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICByZXR1cm4gbURhdGFDb25uZWN0aW9uLmdldElwQWRkcmVzcyhhcG5UeXBlKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlFbmFibGVkKCkgewogICAgICAgICByZXR1cm4gbURhdGFDb25uZWN0aW9uLmdldERhdGFFbmFibGVkKCk7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyBnZXRHYXRld2F5KFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZ2V0R2F0ZXdheShhcG5UeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RG5zU2VydmVycyhTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICByZXR1cm4gbURhdGFDb25uZWN0aW9uLmdldERuc1NlcnZlcnMoYXBuVHlwZSk7Ci0gICAgfQotCiAgICAgcHVibGljIFN0cmluZ1tdIGdldEFjdGl2ZUFwblR5cGVzKCkgewogICAgICAgICByZXR1cm4gbURhdGFDb25uZWN0aW9uLmdldEFjdGl2ZUFwblR5cGVzKCk7CiAgICAgfQogCisgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZ2V0TGlua1Byb3BlcnRpZXMoYXBuVHlwZSk7CisgICAgfQorCisgICAgcHVibGljIExpbmtDYXBhYmlsaXRpZXMgZ2V0TGlua0NhcGFiaWxpdGllcyhTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICByZXR1cm4gbURhdGFDb25uZWN0aW9uLmdldExpbmtDYXBhYmlsaXRpZXMoYXBuVHlwZSk7CisgICAgfQorCiAgICAgcHVibGljIFN0cmluZyBnZXRBY3RpdmVBcG4oKSB7CiAgICAgICAgIHJldHVybiBtRGF0YUNvbm5lY3Rpb24uZ2V0QWN0aXZlQXBuU3RyaW5nKCk7CiAgICAgfQpAQCAtOTU2LDYgKzk2MywxMCBAQAogICAgICAgICByZXR1cm4gbURhdGFDb25uZWN0aW9uLmRpc2FibGVBcG5UeXBlKHR5cGUpOwogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlKCkgeworICAgICAgICByZXR1cm4gKChtRGF0YUNvbm5lY3Rpb24gIT0gbnVsbCkgJiYgKG1EYXRhQ29ubmVjdGlvbi5pc0RhdGFQb3NzaWJsZSgpKSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogc2ltdWxhdGVEYXRhQ29ubmVjdGlvbgogICAgICAqCkBAIC05ODQsNyArOTk1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIG1EYXRhQ29ubmVjdGlvbi5zZXRTdGF0ZShkY1N0YXRlKTsKLSAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCk7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwsIFBob25lLkFQTl9UWVBFX0RFRkFVTFQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTAzOCw2ICsxMDQ5LDEwIEBACiAgICAgICAgICAgICAgICAgImNhbGxlZCwgQ0RNQVBob25lIGluYWN0aXZlLiIpOwogICAgIH0KIAorICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldERhdGFDb25uZWN0aW9uU3RhdGUoQVBOX1RZUEVfREVGQVVMVCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ29tbW9uIGVycm9yIGxvZ2dlciBtZXRob2QgZm9yIHVuZXhwZWN0ZWQgY2FsbHMgdG8gR1NNL1dDRE1BLW9ubHkgbWV0aG9kcy4KICAgICAgKi8KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU5vdGlmaWVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOb3RpZmllci5qYXZhCmluZGV4IGU5NmVlYWUuLjY5MTI3MWYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU5vdGlmaWVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTm90aWZpZXIuamF2YQpAQCAtMzMsOSArMzMsMTIgQEAKIAogICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNhbGxGb3J3YXJkaW5nQ2hhbmdlZChQaG9uZSBzZW5kZXIpOwogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKTsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKTsKIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbik7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSwKKyAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSk7CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKTsKIAogICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFBY3Rpdml0eShQaG9uZSBzZW5kZXIpOwogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVQcm94eS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lUHJveHkuamF2YQppbmRleCA3N2YxZTZjLi4wMmZkZjI4IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVQcm94eS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZVByb3h5LmphdmEKQEAgLTIwLDEzICsyMCwxMiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rQ2FwYWJpbGl0aWVzOworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5DZWxsTG9jYXRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVTdGF0ZUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TaWduYWxTdHJlbmd0aDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtMzQsNyArMzMsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jZG1hLkNETUFQaG9uZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdTTVBob25lOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uTmV0d29ya0luZm87Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5Hc21EYXRhQ29ubmVjdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRSYWRpb0NvbnRyb2w7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTE3Miw3ICsxNzAsMTEgQEAKICAgICB9CiAKICAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpOworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldERhdGFDb25uZWN0aW9uU3RhdGUoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCk7CisgICAgfQorCisgICAgcHVibGljIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShhcG5UeXBlKTsKICAgICB9CiAKICAgICBwdWJsaWMgRGF0YUFjdGl2aXR5U3RhdGUgZ2V0RGF0YUFjdGl2aXR5U3RhdGUoKSB7CkBAIC0yMDcsNiArMjA5LDE0IEBACiAgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0QWN0aXZlQXBuVHlwZXMoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRMaW5rUHJvcGVydGllcyhhcG5UeXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlua0NhcGFiaWxpdGllcyBnZXRMaW5rQ2FwYWJpbGl0aWVzKFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0TGlua0NhcGFiaWxpdGllcyhhcG5UeXBlKTsKKyAgICB9CisKICAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGl2ZUFwbigpIHsKICAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRBY3RpdmVBcG4oKTsKICAgICB9CkBAIC02NjQsMjIgKzY3NCw2IEBACiAgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRJbnRlcmZhY2VOYW1lKGFwblR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXBBZGRyZXNzKFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0SXBBZGRyZXNzKGFwblR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0R2F0ZXdheShTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldEdhdGV3YXkoYXBuVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldERuc1NlcnZlcnMoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXREbnNTZXJ2ZXJzKGFwblR5cGUpOwotICAgIH0KLQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGV2aWNlSWQoKSB7CiAgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0RGV2aWNlSWQoKTsKICAgICB9CkBAIC03NjgsNiArNzYyLDEwIEBACiAgICAgICAgIG1BY3RpdmVQaG9uZS5leGl0RW1lcmdlbmN5Q2FsbGJhY2tNb2RlKCk7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCl7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUubmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCk7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaXNPdGFTcE51bWJlcihTdHJpbmcgZGlhbFN0cil7CiAgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuaXNPdGFTcE51bWJlcihkaWFsU3RyKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUklMLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUklMLmphdmEKaW5kZXggNTY5YWM1Yy4uOGMyMjgwYiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1JJTC5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9SSUwuamF2YQpAQCAtMjg1LDkgKzI4NSw4IEBACiAgICAgICAgIH0KIAogCi0gICAgICAgIC8vKioqKiogSGFuZGxlciBpbXBsZW1lbWVudGF0aW9uCi0KLSAgICAgICAgcHVibGljIHZvaWQKKyAgICAgICAgLy8qKioqKiBIYW5kbGVyIGltcGxlbWVudGF0aW9uCisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZAogICAgICAgICBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CiAgICAgICAgICAgICBSSUxSZXF1ZXN0IHJyID0gKFJJTFJlcXVlc3QpKG1zZy5vYmopOwogICAgICAgICAgICAgUklMUmVxdWVzdCByZXEgPSBudWxsOwpAQCAtNzgwLDcgKzc3OSw3IEBACiAgICAgICAgIHNlbmQocnIpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkCisgICAgQERlcHJlY2F0ZWQgcHVibGljIHZvaWQKICAgICBnZXRQRFBDb250ZXh0TGlzdChNZXNzYWdlIHJlc3VsdCkgewogICAgICAgICBnZXREYXRhQ2FsbExpc3QocmVzdWx0KTsKICAgICB9CkBAIC0xMjk5LDEwICsxMjk4LDE4IEBACiAgICAgcHVibGljIHZvaWQKICAgICBzZXR1cERhdGFDYWxsKFN0cmluZyByYWRpb1RlY2hub2xvZ3ksIFN0cmluZyBwcm9maWxlLCBTdHJpbmcgYXBuLAogICAgICAgICAgICAgU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCwgU3RyaW5nIGF1dGhUeXBlLCBNZXNzYWdlIHJlc3VsdCkgeworICAgICAgICBzZXR1cERhdGFDYWxsV2l0aFByb3RvY29sKHJhZGlvVGVjaG5vbG9neSwgcHJvZmlsZSwgYXBuLCB1c2VyLCBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhUeXBlLCAiSVAiLCByZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkCisgICAgc2V0dXBEYXRhQ2FsbFdpdGhQcm90b2NvbChTdHJpbmcgcmFkaW9UZWNobm9sb2d5LCBTdHJpbmcgcHJvZmlsZSwKKyAgICAgICAgICAgIFN0cmluZyBhcG4sIFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dvcmQsIFN0cmluZyBhdXRoVHlwZSwKKyAgICAgICAgICAgIFN0cmluZyBwcm90b2NvbFR5cGUsIE1lc3NhZ2UgcmVzdWx0KSB7CiAgICAgICAgIFJJTFJlcXVlc3QgcnIKICAgICAgICAgICAgICAgICA9IFJJTFJlcXVlc3Qub2J0YWluKFJJTF9SRVFVRVNUX1NFVFVQX0RBVEFfQ0FMTCwgcmVzdWx0KTsKIAotICAgICAgICByci5tcC53cml0ZUludCg2KTsKKyAgICAgICAgcnIubXAud3JpdGVJbnQoNyk7CiAKICAgICAgICAgcnIubXAud3JpdGVTdHJpbmcocmFkaW9UZWNobm9sb2d5KTsKICAgICAgICAgcnIubXAud3JpdGVTdHJpbmcocHJvZmlsZSk7CkBAIC0xMzEwLDExICsxMzE3LDEyIEBACiAgICAgICAgIHJyLm1wLndyaXRlU3RyaW5nKHVzZXIpOwogICAgICAgICByci5tcC53cml0ZVN0cmluZyhwYXNzd29yZCk7CiAgICAgICAgIHJyLm1wLndyaXRlU3RyaW5nKGF1dGhUeXBlKTsKKyAgICAgICAgcnIubXAud3JpdGVTdHJpbmcocHJvdG9jb2xUeXBlKTsKIAogICAgICAgICBpZiAoUklMSl9MT0dEKSByaWxqTG9nKHJyLnNlcmlhbFN0cmluZygpICsgIj4gIgogICAgICAgICAgICAgICAgICsgcmVxdWVzdFRvU3RyaW5nKHJyLm1SZXF1ZXN0KSArICIgIiArIHJhZGlvVGVjaG5vbG9neSArICIgIgogICAgICAgICAgICAgICAgICsgcHJvZmlsZSArICIgIiArIGFwbiArICIgIiArIHVzZXIgKyAiICIKLSAgICAgICAgICAgICAgICArIHBhc3N3b3JkICsgIiAiICsgYXV0aFR5cGUpOworICAgICAgICAgICAgICAgICsgcGFzc3dvcmQgKyAiICIgKyBhdXRoVHlwZSArICIgIiArIHByb3RvY29sVHlwZSk7CiAKICAgICAgICAgc2VuZChycik7CiAgICAgfQpAQCAtMjkwMiw3ICsyOTEwLDExIEBACiAgICAgICAgICAgICBkYXRhQ2FsbC5hY3RpdmUgPSBwLnJlYWRJbnQoKTsKICAgICAgICAgICAgIGRhdGFDYWxsLnR5cGUgPSBwLnJlYWRTdHJpbmcoKTsKICAgICAgICAgICAgIGRhdGFDYWxsLmFwbiA9IHAucmVhZFN0cmluZygpOwotICAgICAgICAgICAgZGF0YUNhbGwuYWRkcmVzcyA9IHAucmVhZFN0cmluZygpOworICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBwLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChhZGRyZXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gYWRkcmVzcy5zcGxpdCgiICIpWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YUNhbGwuYWRkcmVzcyA9IGFkZHJlc3M7CiAKICAgICAgICAgICAgIHJlc3BvbnNlLmFkZChkYXRhQ2FsbCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU01TRGlzcGF0Y2hlci5qYXZhCmluZGV4IDkxN2UxZDguLjNhN2NlNDcgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NNU0Rpc3BhdGNoZXIuamF2YQpAQCAtMjU1LDYgKzI1NSw3IEBACiAgICAgICAgIG1DbS51bnJlZ2lzdGVyRm9yT24odGhpcyk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7CiAgICAgICAgIExvZy5kKFRBRywgIlNNU0Rpc3BhdGNoZXIgZmluYWxpemVkIik7CiAgICAgfQpAQCAtOTI3LDE0ICs5MjgsMTQgQEAKICAgICAgKi8KICAgICBzdGF0aWMgcHJvdGVjdGVkIGNsYXNzIFNtc1RyYWNrZXIgewogICAgICAgICAvLyBmaWVsZHMgbmVlZCB0byBiZSBwdWJsaWMgZm9yIGRlcml2ZWQgU21zRGlzcGF0Y2hlcnMKLSAgICAgICAgcHVibGljIEhhc2hNYXAgbURhdGE7CisgICAgICAgIHB1YmxpYyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBtRGF0YTsKICAgICAgICAgcHVibGljIGludCBtUmV0cnlDb3VudDsKICAgICAgICAgcHVibGljIGludCBtTWVzc2FnZVJlZjsKIAogICAgICAgICBwdWJsaWMgUGVuZGluZ0ludGVudCBtU2VudEludGVudDsKICAgICAgICAgcHVibGljIFBlbmRpbmdJbnRlbnQgbURlbGl2ZXJ5SW50ZW50OwogCi0gICAgICAgIFNtc1RyYWNrZXIoSGFzaE1hcCBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsCisgICAgICAgIFNtc1RyYWNrZXIoSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSwgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LAogICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgICAgIG1EYXRhID0gZGF0YTsKICAgICAgICAgICAgIG1TZW50SW50ZW50ID0gc2VudEludGVudDsKQEAgLTk0Myw3ICs5NDQsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFNtc1RyYWNrZXIgU21zVHJhY2tlckZhY3RvcnkoSGFzaE1hcCBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsCisgICAgcHJvdGVjdGVkIFNtc1RyYWNrZXIgU21zVHJhY2tlckZhY3RvcnkoSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YSwgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LAogICAgICAgICAgICAgUGVuZGluZ0ludGVudCBkZWxpdmVyeUludGVudCkgewogICAgICAgICByZXR1cm4gbmV3IFNtc1RyYWNrZXIoZGF0YSwgc2VudEludGVudCwgZGVsaXZlcnlJbnRlbnQpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNIZWFkZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNIZWFkZXIuamF2YQppbmRleCA3ODcyZWVjLi43YTY1MTYyIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU21zSGVhZGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc0hlYWRlci5qYXZhCkBAIC0zMCw3ICszMCw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTbXNIZWFkZXIgewogCi0gICAgLy8gVE9ETyhjbGVhbnVwKTogdGhpcyBkYXRhc3RydWN0dXJlIGlzIGdlbmVyYWxseSByZWZlcnJlZCB0byBhcworICAgIC8vIFRPRE8oY2xlYW51cCk6IHRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgZ2VuZXJhbGx5IHJlZmVycmVkIHRvIGFzCiAgICAgLy8gdGhlICd1c2VyIGRhdGEgaGVhZGVyJyBvciBVREgsIGFuZCBzbyB0aGUgY2xhc3MgbmFtZSBzaG91bGQKICAgICAvLyBjaGFuZ2UgdG8gcmVmbGVjdCB0aGlzLi4uCiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNNZXNzYWdlQmFzZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc01lc3NhZ2VCYXNlLmphdmEKaW5kZXggYWY2YzVmOC4uY2JkODYwNiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc01lc3NhZ2VCYXNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc01lc3NhZ2VCYXNlLmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIApAQCAtMzY2LDEzICszNjUsMTMgQEAKICAgICAvKioKICAgICAgKiBUcnkgdG8gcGFyc2UgdGhpcyBtZXNzYWdlIGFzIGFuIGVtYWlsIGdhdGV3YXkgbWVzc2FnZQogICAgICAqIFRoZXJlIGFyZSB0d28gd2F5cyBzcGVjaWZpZWQgaW4gVFMgMjMuMDQwIFNlY3Rpb24gMy44IDoKLSAgICAgKiAgLSBTTVMgbWVzc2FnZSAibWF5IGhhdmUgaXRzIFRQLVBJRCBzZXQgZm9yIGludGVybmV0IGVsZWN0cm9uaWMgbWFpbCAtIE1UCisgICAgICogIC0gU01TIG1lc3NhZ2UgIm1heSBoYXZlIGl0cyBUUC1QSUQgc2V0IGZvciBJbnRlcm5ldCBlbGVjdHJvbmljIG1haWwgLSBNVAogICAgICAqIFNNUyBmb3JtYXQ6IFs8ZnJvbS1hZGRyZXNzPjxzcGFjZT5dPG1lc3NhZ2U+IC0gIkRlcGVuZGluZyBvbiB0aGUKICAgICAgKiBuYXR1cmUgb2YgdGhlIGdhdGV3YXksIHRoZSBkZXN0aW5hdGlvbi9vcmlnaW5hdGlvbiBhZGRyZXNzIGlzIGVpdGhlcgogICAgICAqIGRlcml2ZWQgZnJvbSB0aGUgY29udGVudCBvZiB0aGUgU01TIFRQLU9BIG9yIFRQLURBIGZpZWxkLCBvciB0aGUKICAgICAgKiBUUC1PQS9UUC1EQSBmaWVsZCBjb250YWlucyBhIGdlbmVyaWMgZ2F0ZXdheSBhZGRyZXNzIGFuZCB0aGUgdG8vZnJvbQogICAgICAqIGFkZHJlc3MgaXMgYWRkZWQgYXQgdGhlIGJlZ2lubmluZyBhcyBzaG93biBhYm92ZS4iICh3aGljaCBpcyBzdXBwb3J0ZWQgaGVyZSkKLSAgICAgKiAtIE11bHRpcGxlIGFkZHJlc2VzIHNlcGFyYXRlZCBieSBjb21tYXMsIG5vIHNwYWNlcywgU3ViamVjdCBmaWVsZCBkZWxpbWl0ZWQKKyAgICAgKiAtIE11bHRpcGxlIGFkZHJlc3NlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLCBubyBzcGFjZXMsIFN1YmplY3QgZmllbGQgZGVsaW1pdGVkCiAgICAgICogYnkgJygpJyBvciAnIyMnIGFuZCAnIycgU2VjdGlvbiA5LjIuMy4yNC4xMSAod2hpY2ggYXJlIE5PVCBzdXBwb3J0ZWQgaGVyZSkKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBleHRyYWN0RW1haWxBZGRyZXNzRnJvbU1lc3NhZ2VCb2R5KCkgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1RlbGVwaG9ueVByb3BlcnRpZXMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZWxlcGhvbnlQcm9wZXJ0aWVzLmphdmEKaW5kZXggYTExMzc4Ny4uMTM2ZDViMSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1RlbGVwaG9ueVByb3BlcnRpZXMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVsZXBob255UHJvcGVydGllcy5qYXZhCkBAIC00NSw3ICs0NSw3IEBACiAgICAgICogIENETUEgbmV0d29ya3MuCiAgICAgICovCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9PUEVSQVRPUl9BTFBIQSA9ICJnc20ub3BlcmF0b3IuYWxwaGEiOwotICAgIC8vVE9ETzogbW9zdCBvZiB0aGVzZSBwcm9wcmlldGllcyBhcmUgZ2VuZXJpYywgc3Vic3RpdHV0ZSBnc20uIHdpdGggcGhvbmUuIGJ1ZyAxODU2OTU5CisgICAgLy9UT0RPOiBtb3N0IG9mIHRoZXNlIHByb3BlcnRpZXMgYXJlIGdlbmVyaWMsIHN1YnN0aXR1dGUgZ3NtLiB3aXRoIHBob25lLiBidWcgMTg1Njk1OQogCiAgICAgLyoqIE51bWVyaWMgbmFtZSAoTUNDK01OQykgb2YgY3VycmVudCByZWdpc3RlcmVkIG9wZXJhdG9yLjxwPgogICAgICAqICBBdmFpbGFiaWxpdHk6IHdoZW4gcmVnaXN0ZXJlZCB0byBhIG5ldHdvcmsuIFJlc3VsdCBtYXkgYmUgdW5yZWxpYWJsZSBvbgpAQCAtODMsMTIgKzgzLDEyIEBACiAKICAgICAvKiogVGhlIE1DQytNTkMgKG1vYmlsZSBjb3VudHJ5IGNvZGUrbW9iaWxlIG5ldHdvcmsgY29kZSkgb2YgdGhlCiAgICAgICogIHByb3ZpZGVyIG9mIHRoZSBTSU0uIDUgb3IgNiBkZWNpbWFsIGRpZ2l0cy4KLSAgICAgKiAgQXZhaWxhYmxpdHk6IFNJTSBzdGF0ZSBtdXN0IGJlICJSRUFEWSIKKyAgICAgKiAgQXZhaWxhYmlsaXR5OiBTSU0gc3RhdGUgbXVzdCBiZSAiUkVBRFkiCiAgICAgICovCiAgICAgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9JQ0NfT1BFUkFUT1JfTlVNRVJJQyA9ICJnc20uc2ltLm9wZXJhdG9yLm51bWVyaWMiOwogCiAgICAgLyoqIFBST1BFUlRZX0lDQ19PUEVSQVRPUl9BTFBIQSBpcyBhbHNvIGtub3duIGFzIHRoZSBTUE4sIG9yIFNlcnZpY2UgUHJvdmlkZXIgTmFtZS4KLSAgICAgKiAgQXZhaWxhYmxpdHk6IFNJTSBzdGF0ZSBtdXN0IGJlICJSRUFEWSIKKyAgICAgKiAgQXZhaWxhYmlsaXR5OiBTSU0gc3RhdGUgbXVzdCBiZSAiUkVBRFkiCiAgICAgICovCiAgICAgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9JQ0NfT1BFUkFUT1JfQUxQSEEgPSAiZ3NtLnNpbS5vcGVyYXRvci5hbHBoYSI7CiAKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgICAgICAicm8udGVsZXBob255LmNhbGxfcmluZy5tdWx0aXBsZSI7CiAKICAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpLXNlY29uZHMgYmV0d2VlbiBDQUxMX1JJTkcgbm90aWZpY2F0aW9ucy4KKyAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIENBTExfUklORyBub3RpZmljYXRpb25zLgogICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQ0FMTF9SSU5HX0RFTEFZID0gInJvLnRlbGVwaG9ueS5jYWxsX3JpbmcuZGVsYXkiOwogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BUGhvbmUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhCmluZGV4IGYzMWJmMjQuLjZlNTNlYzUgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhCkBAIC01MTUsMTQgKzUxNSw2IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpIHsKLSAgICAgICAgYm9vbGVhbiBub0RhdGEgPSBtRGF0YUNvbm5lY3Rpb24uZ2V0RGF0YUVuYWJsZWQoKSAmJgotICAgICAgICAgICAgICAgIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSA9PSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwotICAgICAgICByZXR1cm4gIW5vRGF0YSAmJiBnZXRJY2NDYXJkKCkuZ2V0U3RhdGUoKSA9PSBJY2NDYXJkLlN0YXRlLlJFQURZICYmCi0gICAgICAgICAgICAgICAgZ2V0U2VydmljZVN0YXRlKCkuZ2V0U3RhdGUoKSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSAmJgotICAgICAgICAgICAgICAgIChtRGF0YUNvbm5lY3Rpb24uZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSB8fCAhZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBNTUkgZnJvbSB0aGUgcGVuZGluZyBsaXN0IGFuZCBub3RpZmllcyByZWdpc3RyYW50cyB0aGF0CiAgICAgICogaXQgaXMgY29tcGxldGUuCkBAIC02MTMsNyArNjA1LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpIHsKKyAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoU3RyaW5nIGFwblR5cGUpIHsKICAgICAgICAgRGF0YVN0YXRlIHJldCA9IERhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CiAKICAgICAgICAgaWYgKG1TU1QgPT0gbnVsbCkgewpAQCAtNjI1LDYgKzYxNyw4IEBACiAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBvdXQgb2Ygc2VydmljZSwgb3BlbiBUQ1Agc29ja2V0cyBtYXkgc3RpbGwgd29yawogICAgICAgICAgICAgLy8gYnV0IG5vIGRhdGEgd2lsbCBmbG93CiAgICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOworICAgICAgICB9IGVsc2UgaWYgKG1EYXRhQ29ubmVjdGlvbi5pc0FwblR5cGVFbmFibGVkKGFwblR5cGUpID09IGZhbHNlKSB7CisgICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3dpdGNoIChtRGF0YUNvbm5lY3Rpb24uZ2V0U3RhdGUoKSkgewogICAgICAgICAgICAgICAgIGNhc2UgRkFJTEVEOgpAQCAtODc4LDI2ICs4NzIsNiBAQAogICAgICAgICBtUnVpbVJlY29yZHMuc2V0Vm9pY2VNZXNzYWdlV2FpdGluZygxLCBtd2kpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBDRE1BIE9UQSBTZXJ2aWNlIFByb3Zpc2lvbmluZyBuZWVkcyB0byBiZSBwZXJmb3JtZWQuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBib29sZWFuCi0gICAgbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkgewotICAgICAgICBTdHJpbmcgY2RtYU1pbiA9IGdldENkbWFNaW4oKTsKLSAgICAgICAgYm9vbGVhbiBuZWVkc1Byb3Zpc2lvbmluZzsKLSAgICAgICAgaWYgKGNkbWFNaW4gPT0gbnVsbCB8fCAoY2RtYU1pbi5sZW5ndGgoKSA8IDYpKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAibmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nOiBpbGxlZ2FsIGNkbWFNaW49JyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2RtYU1pbiArICInIGFzc3VtZSBwcm92aXNpb25pbmcgbmVlZGVkLiIpOwotICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSAoY2RtYU1pbi5lcXVhbHMoVU5BQ1RJVkFURURfTUlOX1ZBTFVFKQotICAgICAgICAgICAgICAgICAgICB8fCBjZG1hTWluLnN1YnN0cmluZygwLDYpLmVxdWFscyhVTkFDVElWQVRFRF9NSU4yX1ZBTFVFKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJ0ZXN0X2NkbWFfc2V0dXAiLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZzogcmV0PSIgKyBuZWVkc1Byb3Zpc2lvbmluZyk7Ci0gICAgICAgIHJldHVybiBuZWVkc1Byb3Zpc2lvbmluZzsKLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGl0RW1lcmdlbmN5Q2FsbGJhY2tNb2RlKCkgewogICAgICAgICBpZiAobVdha2VMb2NrLmlzSGVsZCgpKSB7CkBAIC0xMTkxLDYgKzExNjUsMjYgQEAKICAgICAgICAgbVNNUy5zZXRDZWxsQnJvYWRjYXN0Q29uZmlnKGNvbmZpZ1ZhbHVlc0FycmF5LCByZXNwb25zZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIE9UQSBTZXJ2aWNlIFByb3Zpc2lvbmluZyBuZWVkcyB0byBiZSBwZXJmb3JtZWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkgeworICAgICAgICBTdHJpbmcgY2RtYU1pbiA9IGdldENkbWFNaW4oKTsKKyAgICAgICAgYm9vbGVhbiBuZWVkc1Byb3Zpc2lvbmluZzsKKyAgICAgICAgaWYgKGNkbWFNaW4gPT0gbnVsbCB8fCAoY2RtYU1pbi5sZW5ndGgoKSA8IDYpKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAibmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nOiBpbGxlZ2FsIGNkbWFNaW49JyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2RtYU1pbiArICInIGFzc3VtZSBwcm92aXNpb25pbmcgbmVlZGVkLiIpOworICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSAoY2RtYU1pbi5lcXVhbHMoVU5BQ1RJVkFURURfTUlOX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICB8fCBjZG1hTWluLnN1YnN0cmluZygwLDYpLmVxdWFscyhVTkFDVElWQVRFRF9NSU4yX1ZBTFVFKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJ0ZXN0X2NkbWFfc2V0dXAiLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZzogcmV0PSIgKyBuZWVkc1Byb3Zpc2lvbmluZyk7CisgICAgICAgIHJldHVybiBuZWVkc1Byb3Zpc2lvbmluZzsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVM2ODNBX0ZFQVRVUkVfQ09ERSA9ICIqMjI4IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVM2ODNBX0ZFQVRVUkVfQ09ERV9OVU1fRElHSVRTID0gNDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVM2ODNBX1NZU19TRUxfQ09ERV9OVU1fRElHSVRTID0gMjsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQppbmRleCA5ZjJhNDRiLi5lNDk5ZTk1IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCkBAIC0yMywxNCArMjMsMTIgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOwotaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuSUNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CiBpbXBvcnQgYW5kcm9pZC5uZXQuVHJhZmZpY1N0YXRzOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKQEAgLTUwLDggKzQ4LDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRXZlbnRMb2dUYWdzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQXBuU2V0dGluZzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlJldHJ5TWFuYWdlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU2VydmljZVN0YXRlVHJhY2tlcjsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKQEAgLTMwNSw5ICszMDEsNDAgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRGF0YUFsbG93ZWQoKSB7Ci0gICAgICAgIGJvb2xlYW4gcm9hbWluZyA9IHBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKTsKLSAgICAgICAgcmV0dXJuIGdldEFueURhdGFFbmFibGVkKCkgJiYgKCFyb2FtaW5nIHx8IGdldERhdGFPblJvYW1pbmdFbmFibGVkKCkpICYmIG1NYXN0ZXJEYXRhRW5hYmxlZDsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RhdGFBbGxvd2VkKCkgeworICAgICAgICBpbnQgcHNTdGF0ZSA9IG1DZG1hUGhvbmUubVNTVC5nZXRDdXJyZW50Q2RtYURhdGFDb25uZWN0aW9uU3RhdGUoKTsKKyAgICAgICAgYm9vbGVhbiByb2FtaW5nID0gKHBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKSAmJiAhZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSk7CisgICAgICAgIGJvb2xlYW4gZGVzaXJlZFBvd2VyU3RhdGUgPSBtQ2RtYVBob25lLm1TU1QuZ2V0RGVzaXJlZFBvd2VyU3RhdGUoKTsKKworICAgICAgICBib29sZWFuIGFsbG93ZWQgPSAocHNTdGF0ZSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSAmJgorICAgICAgICAgICAgICAgIChwaG9uZS5tQ00uZ2V0UmFkaW9TdGF0ZSgpID09IENvbW1hbmRzSW50ZXJmYWNlLlJhZGlvU3RhdGUuTlZfUkVBRFkgfHwKKyAgICAgICAgICAgICAgICAgbUNkbWFQaG9uZS5tUnVpbVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpKSAmJgorICAgICAgICAgICAgICAgIChtQ2RtYVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkgfHwKKyAgICAgICAgICAgICAgICAgcGhvbmUuZ2V0U3RhdGUoKSA9PSBQaG9uZS5TdGF0ZS5JRExFKSAmJgorICAgICAgICAgICAgICAgICFyb2FtaW5nICYmCisgICAgICAgICAgICAgICAgbU1hc3RlckRhdGFFbmFibGVkICYmCisgICAgICAgICAgICAgICAgZGVzaXJlZFBvd2VyU3RhdGUgJiYKKyAgICAgICAgICAgICAgICAhbVBlbmRpbmdSZXN0YXJ0UmFkaW8gJiYKKyAgICAgICAgICAgICAgICAhbUNkbWFQaG9uZS5uZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKSk7CisgICAgICAgIGlmICghYWxsb3dlZCAmJiBEQkcpIHsKKyAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSAiIjsKKyAgICAgICAgICAgIGlmIChwc1N0YXRlICE9IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFKSByZWFzb24gKz0gIiAtIHBzU3RhdGU9ICIgKyBwc1N0YXRlOworICAgICAgICAgICAgaWYgKHBob25lLm1DTS5nZXRSYWRpb1N0YXRlKCkgIT0gQ29tbWFuZHNJbnRlcmZhY2UuUmFkaW9TdGF0ZS5OVl9SRUFEWSAmJgorICAgICAgICAgICAgICAgICAgICAhbUNkbWFQaG9uZS5tUnVpbVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpKSB7CisgICAgICAgICAgICAgICAgcmVhc29uICs9ICIgLSByYWRpb1N0YXRlPSAiICsgcGhvbmUubUNNLmdldFJhZGlvU3RhdGUoKSArICIgLSBSVUlNIG5vdCBsb2FkZWQiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBob25lLmdldFN0YXRlKCkgIT0gUGhvbmUuU3RhdGUuSURMRSAmJgorICAgICAgICAgICAgICAgICAgICBtQ2RtYVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkpIHsKKyAgICAgICAgICAgICAgICByZWFzb24gKz0gIiAtIGNvbmN1cnJlbnRWb2ljZUFuZERhdGEgbm90IGFsbG93ZWQgYW5kIHN0YXRlPSAiICsgcGhvbmUuZ2V0U3RhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyb2FtaW5nKSByZWFzb24gKz0gIiAtIFJvYW1pbmciOworICAgICAgICAgICAgaWYgKCFtTWFzdGVyRGF0YUVuYWJsZWQpIHJlYXNvbiArPSAiIC0gbU1hc3RlckRhdGFFbmFibGVkPSBmYWxzZSI7CisgICAgICAgICAgICBpZiAoIWRlc2lyZWRQb3dlclN0YXRlKSByZWFzb24gKz0gIiAtIGRlc2lyZWRQb3dlclN0YXRlPSBmYWxzZSI7CisgICAgICAgICAgICBpZiAobVBlbmRpbmdSZXN0YXJ0UmFkaW8pIHJlYXNvbiArPSAiIC0gbVBlbmRpbmdSZXN0YXJ0UmFkaW89IHRydWUiOworICAgICAgICAgICAgaWYgKG1DZG1hUGhvbmUubmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkpIHJlYXNvbiArPSAiIC0gbmVlZHMgUHJvdmlzaW9uaW5nIjsKKyAgICAgICAgICAgIGxvZygiRGF0YSBub3QgYWxsb3dlZCBkdWUgdG8iICsgcmVhc29uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWxsb3dlZDsKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gdHJ5U2V0dXBEYXRhKFN0cmluZyByZWFzb24pIHsKQEAgLTMxNyw3ICszNDQsOCBAQAogICAgICAgICAgICAgLy8gQXNzdW1lIGRhdGEgaXMgY29ubmVjdGVkIG9uIHRoZSBzaW11bGF0b3IKICAgICAgICAgICAgIC8vIEZJWE1FICB0aGlzIGNhbiBiZSBpbXByb3ZlZAogICAgICAgICAgICAgc2V0U3RhdGUoU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgdHJ1ZSk7CiAKICAgICAgICAgICAgIExvZy5pKExPR19UQUcsICIoZml4PykgV2UncmUgb24gdGhlIHNpbXVsYXRvcjsgYXNzdW1pbmcgZGF0YSBpcyBjb25uZWN0ZWQiKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMzI3LDM2ICszNTUsMTMgQEAKICAgICAgICAgYm9vbGVhbiByb2FtaW5nID0gcGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpOwogICAgICAgICBib29sZWFuIGRlc2lyZWRQb3dlclN0YXRlID0gbUNkbWFQaG9uZS5tU1NULmdldERlc2lyZWRQb3dlclN0YXRlKCk7CiAKLSAgICAgICAgaWYgKChzdGF0ZSA9PSBTdGF0ZS5JRExFIHx8IHN0YXRlID09IFN0YXRlLlNDQU5OSU5HKQotICAgICAgICAgICAgICAgICYmIChwc1N0YXRlID09IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFKQotICAgICAgICAgICAgICAgICYmICgocGhvbmUubUNNLmdldFJhZGlvU3RhdGUoKSA9PSBDb21tYW5kc0ludGVyZmFjZS5SYWRpb1N0YXRlLk5WX1JFQURZKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgbUNkbWFQaG9uZS5tUnVpbVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpKQotICAgICAgICAgICAgICAgICYmIChtQ2RtYVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBob25lLmdldFN0YXRlKCkgPT0gUGhvbmUuU3RhdGUuSURMRSApCi0gICAgICAgICAgICAgICAgJiYgaXNEYXRhQWxsb3dlZCgpCi0gICAgICAgICAgICAgICAgJiYgZGVzaXJlZFBvd2VyU3RhdGUKLSAgICAgICAgICAgICAgICAmJiAhbVBlbmRpbmdSZXN0YXJ0UmFkaW8KLSAgICAgICAgICAgICAgICAmJiAhbUNkbWFQaG9uZS5uZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKSkgewotCi0gICAgICAgICAgICByZXR1cm4gc2V0dXBEYXRhKHJlYXNvbik7Ci0KKyAgICAgICAgaWYgKChzdGF0ZSA9PSBTdGF0ZS5JRExFIHx8IHN0YXRlID09IFN0YXRlLlNDQU5OSU5HKSAmJgorICAgICAgICAgICAgICAgIGlzRGF0YUFsbG93ZWQoKSAmJiBnZXRBbnlEYXRhRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBib29sZWFuIHJldFZhbHVlID0gc2V0dXBEYXRhKHJlYXNvbik7CisgICAgICAgICAgICBub3RpZnlPZmZBcG5zT2ZBdmFpbGFiaWxpdHkocmVhc29uLCByZXRWYWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygidHJ5U2V0dXBEYXRhOiBOb3QgcmVhZHkgZm9yIGRhdGE6ICIgKwotICAgICAgICAgICAgICAgICAgICAiIGRhdGFTdGF0ZT0iICsgc3RhdGUgKwotICAgICAgICAgICAgICAgICAgICAiIFBTIHN0YXRlPSIgKyBwc1N0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgIiByYWRpbyBzdGF0ZT0iICsgcGhvbmUubUNNLmdldFJhZGlvU3RhdGUoKSArCi0gICAgICAgICAgICAgICAgICAgICIgcnVpbT0iICsgbUNkbWFQaG9uZS5tUnVpbVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBjb25jdXJyZW50Vm9pY2UmRGF0YT0iICsgbUNkbWFQaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBwaG9uZVN0YXRlPSIgKyBwaG9uZS5nZXRTdGF0ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBkYXRhRW5hYmxlZD0iICsgZ2V0QW55RGF0YUVuYWJsZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgcm9hbWluZz0iICsgcm9hbWluZyArCi0gICAgICAgICAgICAgICAgICAgICIgZGF0YU9uUm9hbWluZ0VuYWJsZT0iICsgZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgZGVzaXJlZFBvd2VyU3RhdGU9IiArIGRlc2lyZWRQb3dlclN0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgIiBQZW5kaW5nUmVzdGFydFJhZGlvPSIgKyBtUGVuZGluZ1Jlc3RhcnRSYWRpbyArCi0gICAgICAgICAgICAgICAgICAgICIgTWFzdGVyRGF0YUVuYWJsZWQ9IiArIG1NYXN0ZXJEYXRhRW5hYmxlZCArCi0gICAgICAgICAgICAgICAgICAgICIgbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nPSIgKyBtQ2RtYVBob25lLm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIGZhbHNlKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KQEAgLTM4Miw2ICszODcsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgc2V0U3RhdGUoU3RhdGUuRElTQ09OTkVDVElORyk7CisgICAgICAgIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkocmVhc29uKTsKIAogICAgICAgICBib29sZWFuIG5vdGlmaWNhdGlvbkRlZmVycmVkID0gZmFsc2U7CiAgICAgICAgIGZvciAoRGF0YUNvbm5lY3Rpb24gY29ubiA6IGRhdGFDb25uZWN0aW9uTGlzdCkgewpAQCAtNDQwLDEzICs0NDYsMTMgQEAKICAgICAgICAgY29ubi5jb25uZWN0KG1zZywgbUFjdGl2ZUFwbik7CiAKICAgICAgICAgc2V0U3RhdGUoU3RhdGUuSU5JVElORyk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBub3RpZnlEZWZhdWx0RGF0YShTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIHNldFN0YXRlKFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIHN0YXJ0TmV0U3RhdFBvbGwoKTsKICAgICAgICAgbVJldHJ5TWdyLnJlc2V0UmV0cnlDb3VudCgpOwogICAgIH0KQEAgLTYyMiwxMiArNjI4LDEzIEBACiAKICAgICBwcml2YXRlIHZvaWQgbm90aWZ5Tm9EYXRhKEZhaWxDYXVzZSBsYXN0RmFpbENhdXNlQ29kZSkgewogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5GQUlMRUQpOworICAgICAgICBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KG51bGwpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBnb3RvSWRsZUFuZE5vdGlmeURhdGFDb25uZWN0aW9uKFN0cmluZyByZWFzb24pIHsKICAgICAgICAgaWYgKERCRykgbG9nKCJnb3RvSWRsZUFuZE5vdGlmeURhdGFDb25uZWN0aW9uOiByZWFzb249IiArIHJlYXNvbik7CiAgICAgICAgIHNldFN0YXRlKFN0YXRlLklETEUpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICBtQWN0aXZlQXBuID0gbnVsbDsKICAgICB9CiAKQEAgLTY4NywxMSArNjk0LDEzIEBACiAgICAgICAgICAgICAvLyBBc3N1bWUgZGF0YSBpcyBjb25uZWN0ZWQgb24gdGhlIHNpbXVsYXRvcgogICAgICAgICAgICAgLy8gRklYTUUgIHRoaXMgY2FuIGJlIGltcHJvdmVkCiAgICAgICAgICAgICBzZXRTdGF0ZShTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCk7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsKTsKIAogICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgIldlJ3JlIG9uIHRoZSBzaW11bGF0b3I7IGFzc3VtaW5nIGRhdGEgaXMgY29ubmVjdGVkIik7CiAgICAgICAgIH0KIAorICAgICAgICBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KG51bGwpOworCiAgICAgICAgIGlmIChzdGF0ZSAhPSBTdGF0ZS5JRExFKSB7CiAgICAgICAgICAgICBjbGVhblVwQ29ubmVjdGlvbih0cnVlLCBudWxsKTsKICAgICAgICAgfQpAQCAtNzIzLDYgKzczMiwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGFyLmV4Y2VwdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBXZSBzaG91bGQgY2xlYXIgTGlua1Byb3BlcnRpZXMvQ2FwYWJpbGl0aWVzIHdoZW4gdG9ybiBkb3duIG9yIGRpc2Nvbm5lY3RlZAorICAgICAgICAgICAgbUxpbmtQcm9wZXJ0aWVzID0gZ2V0TGlua1Byb3BlcnRpZXMobUFjdGl2ZURhdGFDb25uZWN0aW9uKTsKKyAgICAgICAgICAgIG1MaW5rQ2FwYWJpbGl0aWVzID0gZ2V0TGlua0NhcGFiaWxpdGllcyhtQWN0aXZlRGF0YUNvbm5lY3Rpb24pOworCiAgICAgICAgICAgICAvLyBldmVyeXRoaW5nIGlzIHNldHVwCiAgICAgICAgICAgICBub3RpZnlEZWZhdWx0RGF0YShyZWFzb24pOwogICAgICAgICB9IGVsc2UgewpAQCAtNzYyLDcgKzc3NSw3IEBACiAgICAgICAgICAgICBvblJlc3RhcnRSYWRpbygpOwogICAgICAgICB9CiAKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgbUFjdGl2ZUFwbiA9IG51bGw7CiAgICAgICAgIGlmIChyZXRyeUFmdGVyRGlzY29ubmVjdGVkKHJlYXNvbikpIHsKICAgICAgICAgICB0cnlTZXR1cERhdGEocmVhc29uKTsKQEAgLTc4OSw3ICs4MDIsOCBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uVm9pY2VDYWxsU3RhcnRlZCgpIHsKICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCAmJiAhbUNkbWFQaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpKSB7CiAgICAgICAgICAgICBzdG9wTmV0U3RhdFBvbGwoKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX1NUQVJURUQpOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfU1RBUlRFRCk7CisgICAgICAgICAgICBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX1NUQVJURUQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC04MDAsMTEgKzgxNCwxMiBAQAogICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICBpZiAoIW1DZG1hUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSkgewogICAgICAgICAgICAgICAgIHN0YXJ0TmV0U3RhdFBvbGwoKTsKLSAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9FTkRFRCk7CisgICAgICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfRU5ERUQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBjbGVhbiBzbGF0ZSBhZnRlciBjYWxsIGVuZC4KICAgICAgICAgICAgICAgICByZXNldFBvbGxTdGF0cygpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbm90aWZ5RGF0YUF2YWlsYWJpbGl0eShQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9FTkRFRCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtUmV0cnlNZ3IucmVzZXRSZXRyeUNvdW50KCk7CiAgICAgICAgICAgICAvLyBpbiBjYXNlIGRhdGEgc2V0dXAgd2FzIGF0dGVtcHRlZCB3aGVuIHdlIHdlcmUgb24gYSB2b2ljZSBjYWxsCkBAIC04MzgsNyArODUzLDcgQEAKICAgICBwcml2YXRlIHZvaWQgb25DZG1hRGF0YURldGFjaGVkKCkgewogICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICBzdGFydE5ldFN0YXRQb2xsKCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQ0RNQV9EQVRBX0RFVEFDSEVEKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9DRE1BX0RBVEFfREVUQUNIRUQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkZBSUxFRCkgewogICAgICAgICAgICAgICAgIGNsZWFuVXBDb25uZWN0aW9uKGZhbHNlLCBQaG9uZS5SRUFTT05fQ0RNQV9EQVRBX0RFVEFDSEVEKTsKQEAgLTk0OSwzNCArOTY0LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SW50ZXJmYWNlTmFtZShTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICBpZiAobUFjdGl2ZURhdGFDb25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtQWN0aXZlRGF0YUNvbm5lY3Rpb24uZ2V0SW50ZXJmYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRJcEFkZHJlc3MoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVEYXRhQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFjdGl2ZURhdGFDb25uZWN0aW9uLmdldElwQWRkcmVzcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0R2F0ZXdheShTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICBpZiAobUFjdGl2ZURhdGFDb25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtQWN0aXZlRGF0YUNvbm5lY3Rpb24uZ2V0R2F0ZXdheUFkZHJlc3MoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RG5zU2VydmVycyhTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICBpZiAobUFjdGl2ZURhdGFDb25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtQWN0aXZlRGF0YUNvbm5lY3Rpb24uZ2V0RG5zU2VydmVycygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQogICAgIHB1YmxpYyBBcnJheUxpc3Q8RGF0YUNvbm5lY3Rpb24+IGdldEFsbERhdGFDb25uZWN0aW9ucygpIHsKICAgICAgICAgcmV0dXJuIGRhdGFDb25uZWN0aW9uTGlzdDsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU01TRGlzcGF0Y2hlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNNU0Rpc3BhdGNoZXIuamF2YQppbmRleCBkY2VmZjJhLi4zN2EzM2JjIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU01TRGlzcGF0Y2hlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTTVNEaXNwYXRjaGVyLmphdmEKQEAgLTcwLDYgKzcwLDcgQEAKICAgICAgKiBAcGFyYW0gYXIgQXN5bmNSZXN1bHQgcGFzc2VkIGludG8gdGhlIG1lc3NhZ2UgaGFuZGxlci4gIGFyLnJlc3VsdCBzaG91bGQKICAgICAgKiAgICAgICAgICAgYmUgYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzdGF0dXMgcmVwb3J0IFBEVSwgYXMgQVNDSUkgaGV4LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVN0YXR1c1JlcG9ydChBc3luY1Jlc3VsdCBhcikgewogICAgICAgICBMb2cuZChUQUcsICJoYW5kbGVTdGF0dXNSZXBvcnQgaXMgYSBzcGVjaWFsIEdTTSBmdW5jdGlvbiwgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBpbiBDRE1BISIpOwogICAgIH0KQEAgLTkyLDYgKzkzLDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBpbnQgZGlzcGF0Y2hNZXNzYWdlKFNtc01lc3NhZ2VCYXNlIHNtc2IpIHsKIAogICAgICAgICAvLyBJZiBzbXMgaXMgbnVsbCwgbWVhbnMgdGhlcmUgd2FzIGEgcGFyc2luZyBlcnJvci4KQEAgLTMzNSw2ICszMzcsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZERhdGEoU3RyaW5nIGRlc3RBZGRyLCBTdHJpbmcgc2NBZGRyLCBpbnQgZGVzdFBvcnQsCiAgICAgICAgICAgICBieXRlW10gZGF0YSwgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LCBQZW5kaW5nSW50ZW50IGRlbGl2ZXJ5SW50ZW50KSB7CiAgICAgICAgIFNtc01lc3NhZ2UuU3VibWl0UGR1IHBkdSA9IFNtc01lc3NhZ2UuZ2V0U3VibWl0UGR1KApAQCAtMzQzLDYgKzM0Niw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kVGV4dChTdHJpbmcgZGVzdEFkZHIsIFN0cmluZyBzY0FkZHIsIFN0cmluZyB0ZXh0LAogICAgICAgICAgICAgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LCBQZW5kaW5nSW50ZW50IGRlbGl2ZXJ5SW50ZW50KSB7CiAgICAgICAgIFNtc01lc3NhZ2UuU3VibWl0UGR1IHBkdSA9IFNtc01lc3NhZ2UuZ2V0U3VibWl0UGR1KApAQCAtMzUxLDYgKzM1NSw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kTXVsdGlwYXJ0VGV4dChTdHJpbmcgZGVzdEFkZHIsIFN0cmluZyBzY0FkZHIsCiAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBwYXJ0cywgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IHNlbnRJbnRlbnRzLAogICAgICAgICAgICAgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IGRlbGl2ZXJ5SW50ZW50cykgewpAQCAtMzU5LDcgKzM2NCw3IEBACiAgICAgICAgICAqIFRPRE8oY2xlYW51cCk6IFRoZXJlIGlzIG5vIHJlYWwgY29kZSBkaWZmZXJlbmNlIGJldHdlZW4KICAgICAgICAgICogdGhpcyBhbmQgdGhlIEdTTSB2ZXJzaW9uLCBhbmQgaGVuY2UgaXQgc2hvdWxkIGJlIG1vdmVkIHRvCiAgICAgICAgICAqIHRoZSBiYXNlIGNsYXNzIG9yIGNvbnNvbGlkYXRlZCBzb21laG93LCBwcm92aWRlZCBjYWxsaW5nCi0gICAgICAgICAqIHRoZSBwcm9wZXIgc3VibWl0cGR1IHN0dWZmIGNhbiBiZSBhcnJhbmdlZC4KKyAgICAgICAgICogdGhlIHByb3BlciBzdWJtaXQgcGR1IHN0dWZmIGNhbiBiZSBhcnJhbmdlZC4KICAgICAgICAgICovCiAKICAgICAgICAgaW50IHJlZk51bWJlciA9IGdldE5leHRDb25jYXRlbmF0ZWRSZWYoKSAmIDB4MDBGRjsKQEAgLTQzMiw4ICs0MzcsOSBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZFNtcyhTbXNUcmFja2VyIHRyYWNrZXIpIHsKLSAgICAgICAgSGFzaE1hcCBtYXAgPSB0cmFja2VyLm1EYXRhOworICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSB0cmFja2VyLm1EYXRhOwogCiAgICAgICAgIC8vIGJ5dGUgc21zY1tdID0gKGJ5dGVbXSkgbWFwLmdldCgic21zYyIpOyAgLy8gdW51c2VkIGZvciBDRE1BCiAgICAgICAgIGJ5dGUgcGR1W10gPSAoYnl0ZVtdKSBtYXAuZ2V0KCJwZHUiKTsKQEAgLTQ0NCwxMSArNDUwLDEzIEBACiAgICAgfQogCiAgICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZE11bHRpcGFydFNtcyAoU21zVHJhY2tlciB0cmFja2VyKSB7CiAgICAgICAgIExvZy5kKFRBRywgIlRPRE86IENkbWFTTVNEaXNwYXRjaGVyLnNlbmRNdWx0aXBhcnRTbXMgbm90IGltcGxlbWVudGVkIik7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBhY2tub3dsZWRnZUxhc3RJbmNvbWluZ1Ntcyhib29sZWFuIHN1Y2Nlc3MsIGludCByZXN1bHQsIE1lc3NhZ2UgcmVzcG9uc2UpewogICAgICAgICAvLyBGSVhNRSB1bml0IHRlc3QgbGVhdmVzIGNtID09IG51bGwuIHRoaXMgc2hvdWxkIGNoYW5nZQogCkBAIC00NjksMTYgKzQ3NywxOSBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVDZWxsQnJvYWRjYXN0U21zKGludCBhY3RpdmF0ZSwgTWVzc2FnZSByZXNwb25zZSkgewogICAgICAgICBtQ20uc2V0Q2RtYUJyb2FkY2FzdEFjdGl2YXRpb24oKGFjdGl2YXRlID09IDApLCByZXNwb25zZSk7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBnZXRDZWxsQnJvYWRjYXN0U21zQ29uZmlnKE1lc3NhZ2UgcmVzcG9uc2UpIHsKICAgICAgICAgbUNtLmdldENkbWFCcm9hZGNhc3RDb25maWcocmVzcG9uc2UpOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q2VsbEJyb2FkY2FzdENvbmZpZyhpbnRbXSBjb25maWdWYWx1ZXNBcnJheSwgTWVzc2FnZSByZXNwb25zZSkgewogICAgICAgICBtQ20uc2V0Q2RtYUJyb2FkY2FzdENvbmZpZyhjb25maWdWYWx1ZXNBcnJheSwgcmVzcG9uc2UpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCmluZGV4IGQyYTRiZDguLjdkMjAxM2IgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQpAQCAtMTYsNiArMTYsMTYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYTsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db21tYW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db21tYW5kc0ludGVyZmFjZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRGF0YUNvbm5lY3Rpb25UcmFja2VyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5FdmVudExvZ1RhZ3M7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0NhcmQ7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255Lk1jY1RhYmxlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGVUcmFja2VyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlJbnRlbnRzOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlQcm9wZXJ0aWVzOworCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CkBAIC0zOCwxOSArNDgsOCBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVGltZVV0aWxzOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRzSW50ZXJmYWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5EYXRhQ29ubmVjdGlvblRyYWNrZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkV2ZW50TG9nVGFnczsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ2FyZDsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuTWNjVGFibGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNlcnZpY2VTdGF0ZVRyYWNrZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlbGVwaG9ueUludGVudHM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlbGVwaG9ueVByb3BlcnRpZXM7Ci0KIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKQEAgLTEwMDgsNyArMTAwNyw3IEBACiAgICAgICAgIG1OZWVkRml4Wm9uZSA9IGZhbHNlOwogCiAgICAgICAgIGlmICh6b25lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRBdXRvVGltZSgpKSB7CisgICAgICAgICAgICBpZiAoZ2V0QXV0b1RpbWVab25lKCkpIHsKICAgICAgICAgICAgICAgICBzZXRBbmRCcm9hZGNhc3ROZXR3b3JrU2V0VGltZVpvbmUoem9uZS5nZXRJRCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNhdmVOaXR6VGltZVpvbmUoem9uZS5nZXRJRCgpKTsKQEAgLTExNDAsNyArMTEzOSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaGFzQ2RtYURhdGFDb25uZWN0aW9uQ2hhbmdlZCB8fCBoYXNOZXR3b3JrVHlwZUNoYW5nZWQpIHsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOworICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCwgbnVsbCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaGFzUm9hbWluZ09uKSB7CkBAIC0xNDYwLDcgKzE0NTksNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoem9uZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldEF1dG9UaW1lKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0QXV0b1RpbWVab25lKCkpIHsKICAgICAgICAgICAgICAgICAgICAgc2V0QW5kQnJvYWRjYXN0TmV0d29ya1NldFRpbWVab25lKHpvbmUuZ2V0SUQoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHNhdmVOaXR6VGltZVpvbmUoem9uZS5nZXRJRCgpKTsKQEAgLTE1NTAsNiArMTU0OSwxNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBib29sZWFuIGdldEF1dG9UaW1lWm9uZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KGNyLCBTZXR0aW5ncy5TeXN0ZW0uQVVUT19USU1FX1pPTkUpID4gMDsKKyAgICAgICAgfSBjYXRjaCAoU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uIHNuZmUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHNhdmVOaXR6VGltZVpvbmUoU3RyaW5nIHpvbmVJZCkgewogICAgICAgICBtU2F2ZWRUaW1lWm9uZSA9IHpvbmVJZDsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvUnVpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQppbmRleCBlOTc1NDlkLi5kODRiNmFiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKQEAgLTY4LDggKzY4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYXIgPSAoQXN5bmNSZXN1bHQpbXNnLm9iajsKICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyLmV4Y2VwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNtcyAgPSAoTGlzdDxTbXNSYXdEYXRhPikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkVmFsaWRSYXdEYXRhKChBcnJheUxpc3Q8Ynl0ZVtdPikgYXIucmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU21zID0gYnVpbGRWYWxpZFJhd0RhdGEoKEFycmF5TGlzdDxieXRlW10+KSBhci5yZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihEQkcpIGxvZygiQ2Fubm90IGxvYWQgU21zIHJlY29yZHMiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNtcyAhPSBudWxsKQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvU21zTWVzc2FnZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvU21zTWVzc2FnZS5qYXZhCmluZGV4IGQ1NjNkYzguLjhhY2NmZDEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1Ntc01lc3NhZ2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9TbXNNZXNzYWdlLmphdmEKQEAgLTE4LDExICsxOCw4IEBACiAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5UaW1lOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRW5jb2RlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc0hlYWRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zTWVzc2FnZUJhc2U7CkBAIC0zNCw3ICszMSw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zLlVzZXJEYXRhOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSGV4RHVtcDsKIAotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvQmVhcmVyRGF0YS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL0JlYXJlckRhdGEuamF2YQppbmRleCBhYjc5ZmU5Li5jZjA2ZGFiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvQmVhcmVyRGF0YS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9CZWFyZXJEYXRhLmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NQVhfVVNFUl9EQVRBX0JZVEVTX1dJVEhfSEVBREVSOwogCiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlSW50QXJyYXk7CiAKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlOwogCkBAIC0zMCwxMCArMjksOCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NVdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc0hlYWRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYS5zbXMuVXNlckRhdGE7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc01lc3NhZ2VCYXNlLlRleHRFbmNvZGluZ0RldGFpbHM7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhleER1bXA7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5CaXR3aXNlSW5wdXRTdHJlYW07CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5CaXR3aXNlT3V0cHV0U3RyZWFtOwogCkBAIC00NSwxMyArNDIsMTMgQEAKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9HX1RBRyA9ICJTTVMiOwogCiAgICAgLyoqCi0gICAgICogQmVhcmVyIERhdGEgU3VicGFyYW1ldGVyIEluZGVudGlmaWVycworICAgICAqIEJlYXJlciBEYXRhIFN1YnBhcmFtZXRlciBJZGVudGlmaWVycwogICAgICAqIChTZWUgM0dQUDIgQy5TMDAxNS1CLCB2Mi4wLCB0YWJsZSA0LjUtMSkKICAgICAgKiBOT1RFOiBDb21tZW50ZWQgc3VicGFyYW1ldGVyIHR5cGVzIGFyZSBub3QgaW1wbGVtZW50ZWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9NRVNTQUdFX0lERU5USUZJRVIgICAgICAgICAgICAgICA9IDB4MDA7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9VU0VSX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDE7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9VU0VSX1JFUE9OU0VfQ09ERSAgICAgICAgICAgICAgICA9IDB4MDI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9VU0VSX1JFU1BPTlNFX0NPREUgICAgICAgICAgICAgICA9IDB4MDI7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9NRVNTQUdFX0NFTlRFUl9USU1FX1NUQU1QICAgICAgICA9IDB4MDM7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9WQUxJRElUWV9QRVJJT0RfQUJTT0xVVEUgICAgICAgICA9IDB4MDQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBTVUJQQVJBTV9WQUxJRElUWV9QRVJJT0RfUkVMQVRJVkUgICAgICAgICA9IDB4MDU7CkBAIC02OTcsNyArNjk0LDcgQEAKICAgICAvKgogICAgICAqIFRPRE8oY2xlYW51cCk6IENkbWFTbXNBZGRyZXNzIGVuY29kaW5nIHNob3VsZCBtYWtlIHVzZSBvZgogICAgICAqIENkbWFTbXNBZGRyZXNzLnBhcnNlIHByb3ZpZGVkIHRoYXQgRFRNRiBlbmNvZGluZyBpcyB1bmlmaWVkLAotICAgICAqIGFuZCB0aGUgZGlmZmVyZW5jZSBpbiA0Yml0IHZzIDhiaXQgaXMgcmVzb2x2ZWQuCisgICAgICogYW5kIHRoZSBkaWZmZXJlbmNlIGluIDQtYml0IHZzLiA4LWJpdCBpcyByZXNvbHZlZC4KICAgICAgKi8KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZW5jb2RlQ2RtYVNtc0FkZHJlc3MoQ2RtYVNtc0FkZHJlc3MgYWRkcikgdGhyb3dzIENvZGluZ0V4Y2VwdGlvbiB7CkBAIC04MDUsNiArODAyLDcgQEAKICAgICAgKiAoU2VlIDNHUFAyIEMuUjEwMDEtRiwgdjEuMCwgc2VjdGlvbiA0LjUgZm9yIGxheW91dCBkZXRhaWxzKQogICAgICAqCiAgICAgICogQHBhcmFtIGJEYXRhIGFuIGluc3RhbmNlIG9mIEJlYXJlckRhdGEuCisgICAgICoKICAgICAgKiBAcmV0dXJuIGJ5dGUgYXJyYXkgb2YgcmF3IGVuY29kZWQgU01TIGJlYXJlciBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZShCZWFyZXJEYXRhIGJEYXRhKSB7CkBAIC05MTUsNyArOTEzLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVjb2RlVXRmMTYoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBudW1GaWVsZHMpCiAgICAgICAgIHRocm93cyBDb2RpbmdFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIC8vIFN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgbmV4dCAxNi1iaXQgYWxpZ25lZCBib3VuZHJ5IGFmdGVyIG9mZnNldC4KKyAgICAgICAgLy8gU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBuZXh0IDE2LWJpdCBhbGlnbmVkIGJvdW5kYXJ5IGFmdGVyIG9mZnNldC4KICAgICAgICAgaW50IHBhZGRpbmcgPSBvZmZzZXQgJSAyOwogICAgICAgICBudW1GaWVsZHMgLT0gKG9mZnNldCArIHBhZGRpbmcpIC8gMjsKICAgICAgICAgdHJ5IHsKQEAgLTk2MSw3ICs5NTksNyBAQAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWNvZGU3Yml0R3NtKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbnVtRmllbGRzKQogICAgICAgICB0aHJvd3MgQ29kaW5nRXhjZXB0aW9uCiAgICAgewotICAgICAgICAvLyBTdGFydCByZWFkaW5nIGZyb20gdGhlIG5leHQgNy1iaXQgYWxpZ25lZCBib3VuZHJ5IGFmdGVyIG9mZnNldC4KKyAgICAgICAgLy8gU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBuZXh0IDctYml0IGFsaWduZWQgYm91bmRhcnkgYWZ0ZXIgb2Zmc2V0LgogICAgICAgICBpbnQgb2Zmc2V0Qml0cyA9IG9mZnNldCAqIDg7CiAgICAgICAgIGludCBvZmZzZXRTZXB0ZXRzID0gKG9mZnNldEJpdHMgKyA2KSAvIDc7CiAgICAgICAgIG51bUZpZWxkcyAtPSBvZmZzZXRTZXB0ZXRzOwpAQCAtMTU1NCw3ICsxNTUyLDcgQEAKICAgICAgICAgICAgICAgICBjYXNlIFNVQlBBUkFNX1VTRVJfREFUQToKICAgICAgICAgICAgICAgICAgICAgZGVjb2RlU3VjY2VzcyA9IGRlY29kZVVzZXJEYXRhKGJEYXRhLCBpblN0cmVhbSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1VCUEFSQU1fVVNFUl9SRVBPTlNFX0NPREU6CisgICAgICAgICAgICAgICAgY2FzZSBTVUJQQVJBTV9VU0VSX1JFU1BPTlNFX0NPREU6CiAgICAgICAgICAgICAgICAgICAgIGRlY29kZVN1Y2Nlc3MgPSBkZWNvZGVVc2VyUmVzcG9uc2VDb2RlKGJEYXRhLCBpblN0cmVhbSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU1VCUEFSQU1fUkVQTFlfT1BUSU9OOgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL1Ntc0VudmVsb3BlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvU21zRW52ZWxvcGUuamF2YQppbmRleCA0ZjAwMTYzLi40YTYwMjMxIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvU21zRW52ZWxvcGUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvU21zRW52ZWxvcGUuamF2YQpAQCAtMTksNyArMTksNyBAQAogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zLkNkbWFTbXNTdWJhZGRyZXNzOwogCi1wdWJsaWMgZmluYWwgY2xhc3MgU21zRW52ZWxvcGV7CitwdWJsaWMgZmluYWwgY2xhc3MgU21zRW52ZWxvcGUgewogICAgIC8qKgogICAgICAqIE1lc3NhZ2UgVHlwZXMKICAgICAgKiAoU2VlIDNHUFAyIEMuUzAwMTUtQiAzLjQuMSkKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmUuamF2YQppbmRleCA0Mzk3MWZmLi4zMGE2MzI0IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZS5qYXZhCkBAIC0yODcsNyArMjg3LDcgQEAKICAgICAgICAgcmV0dXJuIG1QZW5kaW5nTU1JczsKICAgICB9CiAKLSAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSB7CisgICAgcHVibGljIERhdGFTdGF0ZSBnZXREYXRhQ29ubmVjdGlvblN0YXRlKFN0cmluZyBhcG5UeXBlKSB7CiAgICAgICAgIERhdGFTdGF0ZSByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwogCiAgICAgICAgIGlmIChtU1NUID09IG51bGwpIHsKQEAgLTMwMCw2ICszMDAsOCBAQAogICAgICAgICAgICAgLy8gSWYgd2UncmUgb3V0IG9mIHNlcnZpY2UsIG9wZW4gVENQIHNvY2tldHMgbWF5IHN0aWxsIHdvcmsKICAgICAgICAgICAgIC8vIGJ1dCBubyBkYXRhIHdpbGwgZmxvdwogICAgICAgICAgICAgcmV0ID0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKKyAgICAgICAgfSBlbHNlIGlmIChtRGF0YUNvbm5lY3Rpb24uaXNBcG5UeXBlRW5hYmxlZChhcG5UeXBlKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgcmV0ID0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKICAgICAgICAgfSBlbHNlIHsgLyogbVNTVC5ncHJzU3RhdGUgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UgKi8KICAgICAgICAgICAgIHN3aXRjaCAobURhdGFDb25uZWN0aW9uLmdldFN0YXRlKCkpIHsKICAgICAgICAgICAgICAgICBjYXNlIEZBSUxFRDoKQEAgLTQwMSw4ICs0MDMsOCBAQAogICAgIH0KIAogICAgIC8qcGFja2FnZSovIHZvaWQKLSAgICBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChTdHJpbmcgcmVhc29uKSB7Ci0gICAgICAgIG1Ob3RpZmllci5ub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZCh0aGlzLCByZWFzb24pOworICAgIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIG1Ob3RpZmllci5ub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZCh0aGlzLCByZWFzb24sIGFwblR5cGUpOwogICAgIH0KIAogICAgIC8qcGFja2FnZSovIHZvaWQKQEAgLTEwOTEsMjcgKzEwOTMsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoZSBvbmx5IGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2ggd2UgcmVwb3J0IHRoYXQgZGF0YSBjb25uZWN0aXZpdHkgaXMgbm90Ci0gICAgICogcG9zc2libGUgYXJlCi0gICAgICogPHVsPgotICAgICAqIDxsaT5EYXRhIHJvYW1pbmcgaXMgZGlzYWxsb3dlZCBhbmQgd2UgYXJlIHJvYW1pbmcuPC9saT4KLSAgICAgKiA8bGk+VGhlIGN1cnJlbnQgZGF0YSBzdGF0ZSBpcyB7QGNvZGUgRElTQ09OTkVDVEVEfSBmb3IgYSByZWFzb24gb3RoZXIgdGhhbgotICAgICAqIGhhdmluZyBleHBsaWNpdGx5IGRpc2FibGVkIGNvbm5lY3Rpdml0eS4gSW4gb3RoZXIgd29yZHMsIGRhdGEgaXMgbm90IGF2YWlsYWJsZQotICAgICAqIGJlY2F1c2UgdGhlIHBob25lIGlzIG91dCBvZiBjb3ZlcmFnZSBvciBzb21lIGxpa2UgcmVhc29uLjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBkYXRhIGNvbm5lY3Rpdml0eSBpcyBwb3NzaWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKSB7Ci0gICAgICAgIC8vIFRPRE86IEN1cnJlbnRseSBjaGVja3MgaWYgYW55IEdQUlMgY29ubmVjdGlvbiBpcyBhY3RpdmUuIFNob3VsZCBpdCBvbmx5Ci0gICAgICAgIC8vIGNoZWNrIGZvciAiZGVmYXVsdCI/Ci0gICAgICAgIGJvb2xlYW4gbm9EYXRhID0gbURhdGFDb25uZWN0aW9uLmdldERhdGFFbmFibGVkKCkgJiYKLSAgICAgICAgICAgIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSA9PSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwotICAgICAgICByZXR1cm4gIW5vRGF0YSAmJiBnZXRJY2NDYXJkKCkuZ2V0U3RhdGUoKSA9PSBTaW1DYXJkLlN0YXRlLlJFQURZICYmCi0gICAgICAgICAgICAgICAgZ2V0U2VydmljZVN0YXRlKCkuZ2V0U3RhdGUoKSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSAmJgotICAgICAgICAgICAgKG1EYXRhQ29ubmVjdGlvbi5nZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpIHx8ICFnZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFJlbW92ZXMgdGhlIGdpdmVuIE1NSSBmcm9tIHRoZSBwZW5kaW5nIGxpc3QgYW5kIG5vdGlmaWVzCiAgICAgICogcmVnaXN0cmFudHMgdGhhdCBpdCBpcyBjb21wbGV0ZS4KICAgICAgKiBAcGFyYW0gbW1pIE1NSSB0aGF0IGlzIGRvbmUKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb24uamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb24uamF2YQppbmRleCAwOWQ0NmRkLi4xNTcyZjA5IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbURhdGFDb25uZWN0aW9uLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21EYXRhQ29ubmVjdGlvbi5qYXZhCkBAIC0xODAsOCArMTgwLDggQEAKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBib29sZWFuIGlzRG5zT2soU3RyaW5nW10gZG9tYWluTmFtZVNlcnZlcnMpIHsKLSAgICAgICAgaWYgKE5VTExfSVAuZXF1YWxzKGRuc1NlcnZlcnNbMF0pICYmIE5VTExfSVAuZXF1YWxzKGRuc1NlcnZlcnNbMV0pCi0gICAgICAgICAgICAgICAgICAgICYmICEoKEdTTVBob25lKSBwaG9uZSkuaXNEbnNDaGVja0Rpc2FibGVkKCkpIHsKKyAgICAgICAgaWYgKE5VTExfSVAuZXF1YWxzKGRvbWFpbk5hbWVTZXJ2ZXJzWzBdKSAmJiBOVUxMX0lQLmVxdWFscyhkb21haW5OYW1lU2VydmVyc1sxXSkKKyAgICAgICAgICAgICAgICAmJiAhKChHU01QaG9uZSkgcGhvbmUpLmlzRG5zQ2hlY2tEaXNhYmxlZCgpKSB7CiAgICAgICAgICAgICAvLyBXb3JrIGFyb3VuZCBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIFFNSSBkb2VzIG5vdCBmaWxsIGluIEROUzoKICAgICAgICAgICAgIC8vIERlYWN0aXZhdGUgUERQIGFuZCBsZXQgRGF0YUNvbm5lY3Rpb25UcmFja2VyIHJldHJ5LgogICAgICAgICAgICAgLy8gRG8gbm90IGFwcGx5IHRoZSByYWNlIGNvbmRpdGlvbiB3b3JrYXJvdW5kIGZvciBNTVMgQVBOCkBAIC0xODksNiArMTg5LDkgQEAKICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIGRlZmF1bHQgQVBOIHdpbGwgbm90IGJlIHJlc3RvcmVkIGFueW1vcmUuCiAgICAgICAgICAgICBpZiAoIWFwbi50eXBlc1swXS5lcXVhbHMoUGhvbmUuQVBOX1RZUEVfTU1TKQogICAgICAgICAgICAgICAgIHx8ICFpc0lwQWRkcmVzcyhhcG4ubW1zUHJveHkpKSB7CisgICAgICAgICAgICAgICAgbG9nKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAiaXNEbnNPazogcmV0dXJuIGZhbHNlIGFwbi50eXBlc1swXT0lcyBBUE5fVFlQRV9NTVM9JXMgaXNJcEFkZHJlc3MoJXMpPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwbi50eXBlc1swXSwgUGhvbmUuQVBOX1RZUEVfTU1TLCBhcG4ubW1zUHJveHksIGlzSXBBZGRyZXNzKGFwbi5tbXNQcm94eSkpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCmluZGV4IGU3ZDU3YmMuLjY2ZGE2ZTggMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQpAQCAtMjcsMTUgKzI3LDE0IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwotaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuSUNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CitpbXBvcnQgYW5kcm9pZC5uZXQuUHJveHlQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQubmV0LlRyYWZmaWNTdGF0czsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwpAQCAtNTgsNiArNTcsOSBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5EYXRhQ29ubmVjdGlvbi5GYWlsQ2F1c2U7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKIC8qKgpAQCAtMzg4LDEyICszOTAsNiBAQAogICAgICAgICByZXR1cm4gcGRwczsKICAgICB9CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEYXRhQWxsb3dlZCgpIHsKLSAgICAgICAgYm9vbGVhbiByb2FtaW5nID0gcGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpOwotICAgICAgICByZXR1cm4gZ2V0QW55RGF0YUVuYWJsZWQoKSAmJiAoIXJvYW1pbmcgfHwgZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSkgJiYKLSAgICAgICAgICAgICAgICBtTWFzdGVyRGF0YUVuYWJsZWQ7Ci0gICAgfQotCiAgICAgLy8qKioqKiogQ2FsbGVkIGZyb20gU2VydmljZVN0YXRlVHJhY2tlcgogICAgIC8qKgogICAgICAqIEludm9rZWQgd2hlbiBTZXJ2aWNlU3RhdGVUcmFja2VyIG9ic2VydmVzIGEgdHJhbnNpdGlvbiBmcm9tIEdQUlMKQEAgLTQwNSwxMyArNDAxLDEzIEBACiAgICAgICAgICAqIHdoZW4gR1BSUyBkZXRhY2hlcywgYnV0IHdlIHNob3VsZCBzdG9wIHRoZSBuZXR3b3JrIHBvbGxpbmcuCiAgICAgICAgICAqLwogICAgICAgICBzdG9wTmV0U3RhdFBvbGwoKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0dQUlNfREVUQUNIRUQpOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fR1BSU19ERVRBQ0hFRCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIG9uR3Byc0F0dGFjaGVkKCkgewogICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICBzdGFydE5ldFN0YXRQb2xsKCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fR1BSU19BVFRBQ0hFRCk7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fR1BSU19BVFRBQ0hFRCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuRkFJTEVEKSB7CiAgICAgICAgICAgICAgICAgY2xlYW5VcENvbm5lY3Rpb24oZmFsc2UsIFBob25lLlJFQVNPTl9HUFJTX0FUVEFDSEVEKTsKQEAgLTQyMSw2ICs0MTcsMzUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGF0YUFsbG93ZWQoKSB7CisgICAgICAgIGludCBncHJzU3RhdGUgPSBtR3NtUGhvbmUubVNTVC5nZXRDdXJyZW50R3Byc1N0YXRlKCk7CisgICAgICAgIGJvb2xlYW4gZGVzaXJlZFBvd2VyU3RhdGUgPSBtR3NtUGhvbmUubVNTVC5nZXREZXNpcmVkUG93ZXJTdGF0ZSgpOworCisgICAgICAgIGJvb2xlYW4gYWxsb3dlZCA9ICgoZ3Byc1N0YXRlID09IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFIHx8IG5vQXV0b0F0dGFjaCkgJiYKKyAgICAgICAgICAgICAgICBtR3NtUGhvbmUubVNJTVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpICYmCisgICAgICAgICAgICAgICAgcGhvbmUuZ2V0U3RhdGUoKSA9PSBQaG9uZS5TdGF0ZS5JRExFICYmCisgICAgICAgICAgICAgICAgbU1hc3RlckRhdGFFbmFibGVkICYmCisgICAgICAgICAgICAgICAgKCFwaG9uZS5nZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCkgfHwgZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSkgJiYKKyAgICAgICAgICAgICAgICAhbUlzUHNSZXN0cmljdGVkICYmCisgICAgICAgICAgICAgICAgZGVzaXJlZFBvd2VyU3RhdGUpOworICAgICAgICBpZiAoIWFsbG93ZWQgJiYgREJHKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gIiI7CisgICAgICAgICAgICBpZiAoZ3Byc1N0YXRlICE9IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFKSByZWFzb24gKz0gIiAtIGdwcnM9ICIgKyBncHJzU3RhdGU7CisgICAgICAgICAgICBpZiAoIW1Hc21QaG9uZS5tU0lNUmVjb3Jkcy5nZXRSZWNvcmRzTG9hZGVkKCkpIHJlYXNvbiArPSAiIC0gU0lNIG5vdCBsb2FkZWQiOworICAgICAgICAgICAgaWYgKHBob25lLmdldFN0YXRlKCkgIT0gUGhvbmUuU3RhdGUuSURMRSkgeworICAgICAgICAgICAgICAgIHJlYXNvbiArPSAiIC0gUGhvbmVTdGF0ZT0gIiArIHBob25lLmdldFN0YXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1NYXN0ZXJEYXRhRW5hYmxlZCkgcmVhc29uICs9ICIgLSBtTWFzdGVyRGF0YUVuYWJsZWQ9IGZhbHNlIjsKKyAgICAgICAgICAgIGlmIChwaG9uZS5nZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCkgJiYgZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIHJlYXNvbiArPSAiIC0gUm9hbWluZyI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUlzUHNSZXN0cmljdGVkKSByZWFzb24gKz0gIiAtIG1Jc1BzUmVzdHJpY3RlZD0gdHJ1ZSI7CisgICAgICAgICAgICBpZiAoIWRlc2lyZWRQb3dlclN0YXRlKSByZWFzb24gKz0gIiAtIGRlc2lyZWRQb3dlclN0YXRlPSBmYWxzZSI7CisgICAgICAgICAgICBsb2coIkRhdGEgbm90IGFsbG93ZWQgZHVlIHRvIiArIHJlYXNvbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFsbG93ZWQ7CisgICAgfQorCiAgICAgcHJpdmF0ZSBib29sZWFuIHRyeVNldHVwRGF0YShTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIGlmIChEQkcpIGxvZygiKioqdHJ5U2V0dXBEYXRhIGR1ZSB0byAiICsgKHJlYXNvbiA9PSBudWxsID8gIih1bnNwZWNpZmllZCkiIDogcmVhc29uKSk7CiAKQEAgLTQzMCw3ICs0NTUsNyBAQAogICAgICAgICAgICAgLy8gQXNzdW1lIGRhdGEgaXMgY29ubmVjdGVkIG9uIHRoZSBzaW11bGF0b3IKICAgICAgICAgICAgIC8vIEZJWE1FICB0aGlzIGNhbiBiZSBpbXByb3ZlZAogICAgICAgICAgICAgc2V0U3RhdGUoU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogCiAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAiKGZpeD8pIFdlJ3JlIG9uIHRoZSBzaW11bGF0b3I7IGFzc3VtaW5nIGRhdGEgaXMgY29ubmVjdGVkIik7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTQzOSwxOSArNDY0LDE1IEBACiAgICAgICAgIGludCBncHJzU3RhdGUgPSBtR3NtUGhvbmUubVNTVC5nZXRDdXJyZW50R3Byc1N0YXRlKCk7CiAgICAgICAgIGJvb2xlYW4gZGVzaXJlZFBvd2VyU3RhdGUgPSBtR3NtUGhvbmUubVNTVC5nZXREZXNpcmVkUG93ZXJTdGF0ZSgpOwogCi0gICAgICAgIGlmICgoc3RhdGUgPT0gU3RhdGUuSURMRSB8fCBzdGF0ZSA9PSBTdGF0ZS5TQ0FOTklORykKLSAgICAgICAgICAgICAgICAmJiAoZ3Byc1N0YXRlID09IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFIHx8IG5vQXV0b0F0dGFjaCkKLSAgICAgICAgICAgICAgICAmJiBtR3NtUGhvbmUubVNJTVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpCi0gICAgICAgICAgICAgICAgJiYgcGhvbmUuZ2V0U3RhdGUoKSA9PSBQaG9uZS5TdGF0ZS5JRExFCi0gICAgICAgICAgICAgICAgJiYgaXNEYXRhQWxsb3dlZCgpCi0gICAgICAgICAgICAgICAgJiYgIW1Jc1BzUmVzdHJpY3RlZAotICAgICAgICAgICAgICAgICYmIGRlc2lyZWRQb3dlclN0YXRlICkgeworICAgICAgICBpZiAoKChzdGF0ZSA9PSBTdGF0ZS5JRExFKSB8fCAoc3RhdGUgPT0gU3RhdGUuU0NBTk5JTkcpKSAmJgorICAgICAgICAgICAgICAgIGlzRGF0YUFsbG93ZWQoKSAmJiBnZXRBbnlEYXRhRW5hYmxlZCgpKSB7CiAKICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5JRExFKSB7CiAgICAgICAgICAgICAgICAgd2FpdGluZ0FwbnMgPSBidWlsZFdhaXRpbmdBcG5zKCk7CiAgICAgICAgICAgICAgICAgaWYgKHdhaXRpbmdBcG5zLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBsb2coIk5vIEFQTiBmb3VuZCIpOwogICAgICAgICAgICAgICAgICAgICBub3RpZnlOb0RhdGEoR3NtRGF0YUNvbm5lY3Rpb24uRmFpbENhdXNlLk1JU1NJTkdfVU5LTk9XTl9BUE4pOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPZmZBcG5zT2ZBdmFpbGFiaWxpdHkocmVhc29uLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBsb2cgKCJDcmVhdGUgZnJvbSBhbGxBcG5zIDogIiArIGFwbkxpc3RUb1N0cmluZyhhbGxBcG5zKSk7CkBAIC00NjEsMjIgKzQ4MiwxMSBAQAogICAgICAgICAgICAgaWYgKERCRykgewogICAgICAgICAgICAgICAgIGxvZyAoIlNldHVwIHdhaXRuZ0FwbnMgOiAiICsgYXBuTGlzdFRvU3RyaW5nKHdhaXRpbmdBcG5zKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2V0dXBEYXRhKHJlYXNvbik7CisgICAgICAgICAgICBib29sZWFuIHJldFZhbHVlID0gc2V0dXBEYXRhKHJlYXNvbik7CisgICAgICAgICAgICBub3RpZnlPZmZBcG5zT2ZBdmFpbGFiaWxpdHkocmVhc29uLCByZXRWYWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoREJHKQotICAgICAgICAgICAgICAgIGxvZygidHJ5U2V0dXBEYXRhOiBOb3QgcmVhZHkgZm9yIGRhdGE6ICIgKwotICAgICAgICAgICAgICAgICAgICAiIGRhdGFTdGF0ZT0iICsgc3RhdGUgKwotICAgICAgICAgICAgICAgICAgICAiIGdwcnNTdGF0ZT0iICsgZ3Byc1N0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgIiBzaW09IiArIG1Hc21QaG9uZS5tU0lNUmVjb3Jkcy5nZXRSZWNvcmRzTG9hZGVkKCkgKwotICAgICAgICAgICAgICAgICAgICAiIFVNVFM9IiArIG1Hc21QaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBwaG9uZVN0YXRlPSIgKyBwaG9uZS5nZXRTdGF0ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBpc0RhdGFBbGxvd2VkPSIgKyBpc0RhdGFBbGxvd2VkKCkgKwotICAgICAgICAgICAgICAgICAgICAiIGRhdGFFbmFibGVkPSIgKyBnZXRBbnlEYXRhRW5hYmxlZCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiByb2FtaW5nPSIgKyBwaG9uZS5nZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAiIGRhdGFPblJvYW1pbmdFbmFibGU9IiArIGdldERhdGFPblJvYW1pbmdFbmFibGVkKCkgKwotICAgICAgICAgICAgICAgICAgICAiIHBzIHJlc3RyaWN0ZWQ9IiArIG1Jc1BzUmVzdHJpY3RlZCArCi0gICAgICAgICAgICAgICAgICAgICIgZGVzaXJlZFBvd2VyU3RhdGU9IiArIGRlc2lyZWRQb3dlclN0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgIiBNYXN0ZXJEYXRhRW5hYmxlZD0iICsgbU1hc3RlckRhdGFFbmFibGVkKTsKKyAgICAgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIGZhbHNlKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KQEAgLTU5NSw0NiArNjA1LDEwIEBACiAgICAgICAgIHBkcC5jb25uZWN0KG1zZywgYXBuKTsKIAogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5JTklUSU5HKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lKFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlUGRwICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoYXBuVHlwZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgKG1BY3RpdmVBcG4gIT0gbnVsbCAmJiBtQWN0aXZlQXBuLmNhbkhhbmRsZVR5cGUoYXBuVHlwZSkpKSkgewotICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVQZHAuZ2V0SW50ZXJmYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRJcEFkZHJlc3MoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVQZHAgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChhcG5UeXBlID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAobUFjdGl2ZUFwbiAhPSBudWxsICYmIG1BY3RpdmVBcG4uY2FuSGFuZGxlVHlwZShhcG5UeXBlKSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVBkcC5nZXRJcEFkZHJlc3MoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEdhdGV3YXkoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVQZHAgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChhcG5UeXBlID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAobUFjdGl2ZUFwbiAhPSBudWxsICYmIG1BY3RpdmVBcG4uY2FuSGFuZGxlVHlwZShhcG5UeXBlKSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVBkcC5nZXRHYXRld2F5QWRkcmVzcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXREbnNTZXJ2ZXJzKFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlUGRwICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAoYXBuVHlwZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgKG1BY3RpdmVBcG4gIT0gbnVsbCAmJiBtQWN0aXZlQXBuLmNhbkhhbmRsZVR5cGUoYXBuVHlwZSkpKSkgewotICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVQZHAuZ2V0RG5zU2VydmVycygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQogICAgIHByaXZhdGUgYm9vbGVhbgogICAgIHBkcFN0YXRlc0hhc0NJRCAoQXJyYXlMaXN0PERhdGFDYWxsU3RhdGU+IHN0YXRlcywgaW50IGNpZCkgewogICAgICAgICBmb3IgKGludCBpID0gMCwgcyA9IHN0YXRlcy5zaXplKCkgOyBpIDwgcyA7IGkrKykgewpAQCAtNzQ2LDcgKzcyMCw3IEBACiAKICAgICBwcml2YXRlIHZvaWQgbm90aWZ5RGVmYXVsdERhdGEoU3RyaW5nIHJlYXNvbikgewogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICBzdGFydE5ldFN0YXRQb2xsKCk7CiAgICAgICAgIC8vIHJlc2V0IHJlY29ubmVjdCB0aW1lcgogICAgICAgICBtUmV0cnlNZ3IucmVzZXRSZXRyeUNvdW50KCk7CkBAIC03NTYsNyArNzMwLDcgQEAKICAgICBwcml2YXRlIHZvaWQgZ290b0lkbGVBbmROb3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIGlmIChEQkcpIGxvZygiZ290b0lkbGVBbmROb3RpZnlEYXRhQ29ubmVjdGlvbjogcmVhc29uPSIgKyByZWFzb24pOwogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5JRExFKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgbUFjdGl2ZUFwbiA9IG51bGw7CiAgICAgfQogCkBAIC05OTgsNyArOTcyLDcgQEAKICAgICAgICAgICAgIGlmICghbVJldHJ5TWdyLmlzUmV0cnlOZWVkZWQoKSkgewogICAgICAgICAgICAgICAgIGlmICghbVJlcXVlc3RlZEFwblR5cGUuZXF1YWxzKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIG1vcmUgcmV0cmllcyBvbiBhIHNlY29uZGFyeSBBUE4gYXR0ZW1wdCwgdGVsbCB0aGUgd29ybGQgYW5kIHJldmVydC4KLSAgICAgICAgICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0FQTl9GQUlMRUQpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQVBOX0ZBSUxFRCk7CiAgICAgICAgICAgICAgICAgICAgIG9uRW5hYmxlQXBuKGFwblR5cGVUb0lkKG1SZXF1ZXN0ZWRBcG5UeXBlKSwgRElTQUJMRUQpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQpAQCAtMTA5MSw3ICsxMDY1LDcgQEAKICAgICAgICAgICAgIC8vIEFzc3VtZSBkYXRhIGlzIGNvbm5lY3RlZCBvbiB0aGUgc2ltdWxhdG9yCiAgICAgICAgICAgICAvLyBGSVhNRSAgdGhpcyBjYW4gYmUgaW1wcm92ZWQKICAgICAgICAgICAgIHNldFN0YXRlKFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOwogCiAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAiV2UncmUgb24gdGhlIHNpbXVsYXRvcjsgYXNzdW1pbmcgZGF0YSBpcyBjb25uZWN0ZWQiKTsKICAgICAgICAgfQpAQCAtMTEyNSw2ICsxMDk5LDI3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoYXIuZXhjZXB0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IFdlIHNob3VsZCBjbGVhciBMaW5rUHJvcGVydGllcy9DYXBhYmlsaXRpZXMgd2hlbiB0b3JuIGRvd24gb3IgZGlzY29ubmVjdGVkCisgICAgICAgICAgICBtTGlua1Byb3BlcnRpZXMgPSBnZXRMaW5rUHJvcGVydGllcyhtQWN0aXZlUGRwKTsKKyAgICAgICAgICAgIG1MaW5rQ2FwYWJpbGl0aWVzID0gZ2V0TGlua0NhcGFiaWxpdGllcyhtQWN0aXZlUGRwKTsKKworICAgICAgICAgICAgQXBuU2V0dGluZyBhcG4gPSBtQWN0aXZlUGRwLmdldEFwbigpOworICAgICAgICAgICAgaWYgKGFwbi5wcm94eSAhPSBudWxsICYmIGFwbi5wcm94eS5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgUHJveHlQcm9wZXJ0aWVzIHByb3h5ID0gbmV3IFByb3h5UHJvcGVydGllcygpOworICAgICAgICAgICAgICAgICAgICBwcm94eS5zZXRTb2NrZXRBZGRyZXNzKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRCeU5hbWUoYXBuLnByb3h5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KGFwbi5wb3J0KSkpOworICAgICAgICAgICAgICAgICAgICBtTGlua1Byb3BlcnRpZXMuc2V0SHR0cFByb3h5KHByb3h5KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmtub3duSG9zdEV4Y2VwdGlvbiBtYWtpbmcgUHJveHlQcm9wZXJ0aWVzOiAiICsgZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiU2VjdXJpdHlFeGNlcHRpb24gbWFraW5nIFByb3h5UHJvcGVydGllczogIiArIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJOdW1iZXJGb3JtYXRFeGNlcHRpb24gbWFraW5nIFByb3h5UHJvcGVydGllcyAoIiArIGFwbi5wb3J0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTogIiArIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gZXZlcnl0aGluZyBpcyBzZXR1cAogICAgICAgICAgICAgaWYgKGlzQXBuVHlwZUFjdGl2ZShQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKSkgewogICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJnc20uZGVmYXVsdHBkcGNvbnRleHQuYWN0aXZlIiwgInRydWUiKTsKQEAgLTExNTcsNyArMTE1Miw3IEBACiAgICAgICAgICAgICAvLyBObyB0cnkgZm9yIHBlcm1hbmVudCBmYWlsdXJlCiAgICAgICAgICAgICBpZiAoY2F1c2UuaXNQZXJtYW5lbnRGYWlsKCkpIHsKICAgICAgICAgICAgICAgICBub3RpZnlOb0RhdGEoY2F1c2UpOwotICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9BUE5fRkFJTEVEKTsKKyAgICAgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQVBOX0ZBSUxFRCk7CiAgICAgICAgICAgICAgICAgb25FbmFibGVBcG4oYXBuVHlwZVRvSWQobVJlcXVlc3RlZEFwblR5cGUpLCBESVNBQkxFRCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQpAQCAtMTE4Niw3ICsxMTgxLDcgQEAKICAgICAgICAgICAgcmVhc29uID0gKFN0cmluZykgYXIudXNlck9iajsKICAgICAgICAgfQogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5JRExFKTsKLSAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKICAgICAgICAgbUFjdGl2ZUFwbiA9IG51bGw7CiAgICAgICAgIGlmIChyZXRyeUFmdGVyRGlzY29ubmVjdGVkKHJlYXNvbikpIHsKICAgICAgICAgICAgIHRyeVNldHVwRGF0YShyZWFzb24pOwpAQCAtMTIxNyw3ICsxMjEyLDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBvblZvaWNlQ2FsbFN0YXJ0ZWQoKSB7CiAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQgJiYgISBtR3NtUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSkgewogICAgICAgICAgICAgc3RvcE5ldFN0YXRQb2xsKCk7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9TVEFSVEVEKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX1NUQVJURUQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjI1LDcgKzEyMjAsNyBAQAogICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICBpZiAoIW1Hc21QaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpKSB7CiAgICAgICAgICAgICAgICAgc3RhcnROZXRTdGF0UG9sbCgpOwotICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX0VOREVEKTsKKyAgICAgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9FTkRFRCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIGNsZWFuIHNsYXRlIGFmdGVyIGNhbGwgZW5kLgogICAgICAgICAgICAgICAgIHJlc2V0UG9sbFN0YXRzKCk7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNNU0Rpc3BhdGNoZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU01TRGlzcGF0Y2hlci5qYXZhCmluZGV4IDMwNzlhNjQuLmVkNzA2NmIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU01TRGlzcGF0Y2hlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU01TRGlzcGF0Y2hlci5qYXZhCkBAIC01Niw2ICs1Niw3IEBACiAgICAgICogQHBhcmFtIGFyIEFzeW5jUmVzdWx0IHBhc3NlZCBpbnRvIHRoZSBtZXNzYWdlIGhhbmRsZXIuICBhci5yZXN1bHQgc2hvdWxkCiAgICAgICogICAgICAgICAgIGJlIGEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc3RhdHVzIHJlcG9ydCBQRFUsIGFzIEFTQ0lJIGhleC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTdGF0dXNSZXBvcnQoQXN5bmNSZXN1bHQgYXIpIHsKICAgICAgICAgU3RyaW5nIHBkdVN0cmluZyA9IChTdHJpbmcpIGFyLnJlc3VsdDsKICAgICAgICAgU21zTWVzc2FnZSBzbXMgPSBTbXNNZXNzYWdlLm5ld0Zyb21DRFMocGR1U3RyaW5nKTsKQEAgLTg0LDYgKzg1LDcgQEAKIAogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgaW50IGRpc3BhdGNoTWVzc2FnZShTbXNNZXNzYWdlQmFzZSBzbXNiKSB7CiAKICAgICAgICAgLy8gSWYgc21zIGlzIG51bGwsIG1lYW5zIHRoZXJlIHdhcyBhIHBhcnNpbmcgZXJyb3IuCkBAIC0xNTEsNiArMTUzLDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmREYXRhKFN0cmluZyBkZXN0QWRkciwgU3RyaW5nIHNjQWRkciwgaW50IGRlc3RQb3J0LAogICAgICAgICAgICAgYnl0ZVtdIGRhdGEsIFBlbmRpbmdJbnRlbnQgc2VudEludGVudCwgUGVuZGluZ0ludGVudCBkZWxpdmVyeUludGVudCkgewogICAgICAgICBTbXNNZXNzYWdlLlN1Ym1pdFBkdSBwZHUgPSBTbXNNZXNzYWdlLmdldFN1Ym1pdFBkdSgKQEAgLTE1OSw2ICsxNjIsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZFRleHQoU3RyaW5nIGRlc3RBZGRyLCBTdHJpbmcgc2NBZGRyLCBTdHJpbmcgdGV4dCwKICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgc2VudEludGVudCwgUGVuZGluZ0ludGVudCBkZWxpdmVyeUludGVudCkgewogICAgICAgICBTbXNNZXNzYWdlLlN1Ym1pdFBkdSBwZHUgPSBTbXNNZXNzYWdlLmdldFN1Ym1pdFBkdSgKQEAgLTE2Nyw2ICsxNzEsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2VuZE11bHRpcGFydFRleHQoU3RyaW5nIGRlc3RpbmF0aW9uQWRkcmVzcywgU3RyaW5nIHNjQWRkcmVzcywKICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHBhcnRzLCBBcnJheUxpc3Q8UGVuZGluZ0ludGVudD4gc2VudEludGVudHMsCiAgICAgICAgICAgICBBcnJheUxpc3Q8UGVuZGluZ0ludGVudD4gZGVsaXZlcnlJbnRlbnRzKSB7CkBAIC0zMDYsOCArMzExLDkgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRTbXMoU21zVHJhY2tlciB0cmFja2VyKSB7Ci0gICAgICAgIEhhc2hNYXAgbWFwID0gdHJhY2tlci5tRGF0YTsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gdHJhY2tlci5tRGF0YTsKIAogICAgICAgICBieXRlIHNtc2NbXSA9IChieXRlW10pIG1hcC5nZXQoInNtc2MiKTsKICAgICAgICAgYnl0ZSBwZHVbXSA9IChieXRlW10pIG1hcC5nZXQoInBkdSIpOwpAQCAtMzIyLDEyICszMjgsMTMgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSB0cmFja2VyIGhvbGRzIHRoZSBtdWx0aXBhcnQgU21zIHRyYWNrZXIgcmVhZHkgdG8gYmUgc2VudAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRNdWx0aXBhcnRTbXMgKFNtc1RyYWNrZXIgdHJhY2tlcikgewogICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBwYXJ0czsKICAgICAgICAgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IHNlbnRJbnRlbnRzOwogICAgICAgICBBcnJheUxpc3Q8UGVuZGluZ0ludGVudD4gZGVsaXZlcnlJbnRlbnRzOwogCi0gICAgICAgIEhhc2hNYXAgbWFwID0gdHJhY2tlci5tRGF0YTsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gdHJhY2tlci5tRGF0YTsKIAogICAgICAgICBTdHJpbmcgZGVzdGluYXRpb25BZGRyZXNzID0gKFN0cmluZykgbWFwLmdldCgiZGVzdGluYXRpb24iKTsKICAgICAgICAgU3RyaW5nIHNjQWRkcmVzcyA9IChTdHJpbmcpIG1hcC5nZXQoInNjYWRkcmVzcyIpOwpAQCAtMzQyLDYgKzM0OSw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBhY2tub3dsZWRnZUxhc3RJbmNvbWluZ1Ntcyhib29sZWFuIHN1Y2Nlc3MsIGludCByZXN1bHQsIE1lc3NhZ2UgcmVzcG9uc2UpewogICAgICAgICAvLyBGSVhNRSB1bml0IHRlc3QgbGVhdmVzIGNtID09IG51bGwuIHRoaXMgc2hvdWxkIGNoYW5nZQogICAgICAgICBpZiAobUNtICE9IG51bGwpIHsKQEAgLTM1MCw2ICszNTgsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVDZWxsQnJvYWRjYXN0U21zKGludCBhY3RpdmF0ZSwgTWVzc2FnZSByZXNwb25zZSkgewogICAgICAgICAvLyBVbmxlc3MgQ0JTIGlzIGltcGxlbWVudGVkIGZvciBHU00sIHRoaXMgcG9pbnQgc2hvdWxkIGJlIHVucmVhY2hhYmxlLgogICAgICAgICBMb2cuZShUQUcsICJFcnJvciEgVGhlIGZ1bmN0aW9uYWxpdHkgY2VsbCBicm9hZGNhc3Qgc21zIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgR1NNLiIpOwpAQCAtMzU3LDYgKzM2Niw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBnZXRDZWxsQnJvYWRjYXN0U21zQ29uZmlnKE1lc3NhZ2UgcmVzcG9uc2UpewogICAgICAgICAvLyBVbmxlc3MgQ0JTIGlzIGltcGxlbWVudGVkIGZvciBHU00sIHRoaXMgcG9pbnQgc2hvdWxkIGJlIHVucmVhY2hhYmxlLgogICAgICAgICBMb2cuZShUQUcsICJFcnJvciEgVGhlIGZ1bmN0aW9uYWxpdHkgY2VsbCBicm9hZGNhc3Qgc21zIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgR1NNLiIpOwpAQCAtMzY0LDYgKzM3NCw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgIHZvaWQgc2V0Q2VsbEJyb2FkY2FzdENvbmZpZyhpbnRbXSBjb25maWdWYWx1ZXNBcnJheSwgTWVzc2FnZSByZXNwb25zZSkgewogICAgICAgICAvLyBVbmxlc3MgQ0JTIGlzIGltcGxlbWVudGVkIGZvciBHU00sIHRoaXMgcG9pbnQgc2hvdWxkIGJlIHVucmVhY2hhYmxlLgogICAgICAgICBMb2cuZShUQUcsICJFcnJvciEgVGhlIGZ1bmN0aW9uYWxpdHkgY2VsbCBicm9hZGNhc3Qgc21zIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgR1NNLiIpOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQppbmRleCA5MGVjYmQ3Li44M2FkNTUyIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQpAQCAtMTYsNiArMTYsMTcgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtOwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRFeGNlcHRpb247CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRzSW50ZXJmYWNlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5EYXRhQ29ubmVjdGlvblRyYWNrZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkV2ZW50TG9nVGFnczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ2FyZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuTWNjVGFibGU7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlJJTENvbnN0YW50czsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU2VydmljZVN0YXRlVHJhY2tlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255SW50ZW50czsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255UHJvcGVydGllczsKKwogaW1wb3J0IGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247CiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKQEAgLTQ3LDE3ICs1OCw2IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVGltZVV0aWxzOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRFeGNlcHRpb247Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRzSW50ZXJmYWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5EYXRhQ29ubmVjdGlvblRyYWNrZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkV2ZW50TG9nVGFnczsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ2FyZDsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuTWNjVGFibGU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlJJTENvbnN0YW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU2VydmljZVN0YXRlVHJhY2tlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255SW50ZW50czsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255UHJvcGVydGllczsKLQogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwogaW1wb3J0IGphdmEudXRpbC5EYXRlOwpAQCAtOTk1LDcgKzk5NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1OZWVkRml4Wm9uZSA9IGZhbHNlOwogCiAgICAgICAgICAgICAgICAgICAgIGlmICh6b25lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRBdXRvVGltZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0QXV0b1RpbWVab25lKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBbmRCcm9hZGNhc3ROZXR3b3JrU2V0VGltZVpvbmUoem9uZS5nZXRJRCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVOaXR6VGltZVpvbmUoem9uZS5nZXRJRCgpKTsKQEAgLTEwMTgsNyArMTAxOCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaGFzTmV0d29ya1R5cGVDaGFuZ2VkKSB7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsKTsKKyAgICAgICAgICAgIC8vIFRPRE8gLSBkbyB3ZSByZWFsbHkgd2FudCB0aGlzPworICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCwgbnVsbCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaGFzUm9hbWluZ09uKSB7CkBAIC0xNDc1LDcgKzE0NzYsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoem9uZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldEF1dG9UaW1lKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0QXV0b1RpbWVab25lKCkpIHsKICAgICAgICAgICAgICAgICAgICAgc2V0QW5kQnJvYWRjYXN0TmV0d29ya1NldFRpbWVab25lKHpvbmUuZ2V0SUQoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHNhdmVOaXR6VGltZVpvbmUoem9uZS5nZXRJRCgpKTsKQEAgLTE1NDUsNiArMTU0NiwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBib29sZWFuIGdldEF1dG9UaW1lWm9uZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KHBob25lLmdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLkFVVE9fVElNRV9aT05FKSA+IDA7CisgICAgICAgIH0gY2F0Y2ggKFNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbiBzbmZlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBzYXZlTml0elRpbWVab25lKFN0cmluZyB6b25lSWQpIHsKICAgICAgICAgbVNhdmVkVGltZVpvbmUgPSB6b25lSWQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TaW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQppbmRleCA2N2VjYzc3Li5hYWIzNTlmIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQpAQCAtODcsNiArODcsNyBAQAogICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwpAQCAtMTkyLDYgKzE5Myw3IEBACiAgICAgICAgIHJldHVybiBtU21zOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7CiAgICAgICAgIExvZy5kKExPR19UQUcsICJbU2ltU21zSW50ZXJmYWNlTWFuYWdlcl0gIiArIG1zZyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNNZXNzYWdlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc01lc3NhZ2UuamF2YQppbmRleCA5YTNjNDc2Li5lMjQ2MTNmIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc01lc3NhZ2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc01lc3NhZ2UuamF2YQpAQCAtMjYsNyArMjYsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zSGVhZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zTWVzc2FnZUJhc2UuVGV4dEVuY29kaW5nRGV0YWlsczsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKQEAgLTM0LDYgKzMzLDcgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5FTkNPRElOR183QklUOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlLkVOQ09ESU5HXzhCSVQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuRU5DT0RJTkdfMTZCSVQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuRU5DT0RJTkdfS1NDNTYwMTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5FTkNPRElOR19VTktOT1dOOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlLk1BWF9VU0VSX0RBVEFfQllURVM7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTUFYX1VTRVJfREFUQV9CWVRFU19XSVRIX0hFQURFUjsKQEAgLTQ1LDcgKzQ1LDcgQEAKICAqIEEgU2hvcnQgTWVzc2FnZSBTZXJ2aWNlIG1lc3NhZ2UuCiAgKgogICovCi1wdWJsaWMgY2xhc3MgU21zTWVzc2FnZSBleHRlbmRzIFNtc01lc3NhZ2VCYXNleworcHVibGljIGNsYXNzIFNtc01lc3NhZ2UgZXh0ZW5kcyBTbXNNZXNzYWdlQmFzZSB7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkdTTSI7CiAKICAgICBwcml2YXRlIE1lc3NhZ2VDbGFzcyBtZXNzYWdlQ2xhc3M7CkBAIC0zMTEsNyArMzExLDcgQEAKICAgICAgICAgICAgIC8vIHRoZSByZWNlaXZlcidzIFNJTSBjYXJkLiBZb3UgY2FuIHRoZW4gc2VuZCBtZXNzYWdlcyB0byB5b3Vyc2VsZgogICAgICAgICAgICAgLy8gKG9uIGEgcGhvbmUgd2l0aCB0aGlzIGNoYW5nZSkgYW5kIHRoZXknbGwgZW5kIHVwIG9uIHRoZSBTSU0gY2FyZC4KICAgICAgICAgICAgIGJvLndyaXRlKDB4MDApOwotICAgICAgICB9IGVsc2UgeyAvL2Fzc3VtZSBVQ1MtMgorICAgICAgICB9IGVsc2UgeyAvLyBhc3N1bWUgVUNTLTIKICAgICAgICAgICAgIGlmICgoMHhmZiAmIHVzZXJEYXRhWzBdKSA+IE1BWF9VU0VSX0RBVEFfQllURVMpIHsKICAgICAgICAgICAgICAgICAvLyBNZXNzYWdlIHRvbyBsb25nCiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0zNzcsNyArMzc3LDcgQEAKICAgICAgKiBAcGFyYW0gZGVzdGluYXRpb25BZGRyZXNzIHRoZSBhZGRyZXNzIG9mIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIG1lc3NhZ2UKICAgICAgKiBAcGFyYW0gZGVzdGluYXRpb25Qb3J0IHRoZSBwb3J0IHRvIGRlbGl2ZXIgdGhlIG1lc3NhZ2UgdG8gYXQgdGhlCiAgICAgICogICAgICAgIGRlc3RpbmF0aW9uCi0gICAgICogQHBhcmFtIGRhdGEgdGhlIGRhdCBmb3IgdGhlIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBmb3IgdGhlIG1lc3NhZ2UKICAgICAgKiBAcmV0dXJuIGEgPGNvZGU+U3VibWl0UGR1PC9jb2RlPiBjb250YWluaW5nIHRoZSBlbmNvZGVkIFNDCiAgICAgICogICAgICAgICBhZGRyZXNzLCBpZiBhcHBsaWNhYmxlLCBhbmQgdGhlIGVuY29kZWQgbWVzc2FnZS4KICAgICAgKiAgICAgICAgIFJldHVybnMgbnVsbCBvbiBlbmNvZGUgZXJyb3IuCkBAIC00ODIsNyArNDgyLDcgQEAKICAgICAgICAgcmV0dXJuIGJvOwogICAgIH0KIAotICAgIHN0YXRpYyBjbGFzcyBQZHVQYXJzZXIgeworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBkdVBhcnNlciB7CiAgICAgICAgIGJ5dGUgcGR1W107CiAgICAgICAgIGludCBjdXI7CiAgICAgICAgIFNtc0hlYWRlciB1c2VyRGF0YUhlYWRlcjsKQEAgLTQ5MCwxMCArNDkwLDYgQEAKICAgICAgICAgaW50IG1Vc2VyRGF0YVNlcHRldFBhZGRpbmc7CiAgICAgICAgIGludCBtVXNlckRhdGFTaXplOwogCi0gICAgICAgIFBkdVBhcnNlcihTdHJpbmcgcykgewotICAgICAgICAgICAgdGhpcyhJY2NVdGlscy5oZXhTdHJpbmdUb0J5dGVzKHMpKTsKLSAgICAgICAgfQotCiAgICAgICAgIFBkdVBhcnNlcihieXRlW10gcGR1KSB7CiAgICAgICAgICAgICB0aGlzLnBkdSA9IHBkdTsKICAgICAgICAgICAgIGN1ciA9IDA7CkBAIC01NDUsNyArNTQxLDcgQEAKICAgICAgICAgICAgIEdzbVNtc0FkZHJlc3MgcmV0OwogCiAgICAgICAgICAgICAvLyAiVGhlIEFkZHJlc3MtTGVuZ3RoIGZpZWxkIGlzIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YKLSAgICAgICAgICAgIC8vIHRoZSBudW1iZXIgZmllbGQsIGkuZS4gZXhjbHVkZXMgYW55IHNlbWkgb2N0ZXQgY29udGFpbmluZyBvbmx5CisgICAgICAgICAgICAvLyB0aGUgbnVtYmVyIGZpZWxkLCBpLmUuIGV4Y2x1ZGVzIGFueSBzZW1pLW9jdGV0IGNvbnRhaW5pbmcgb25seQogICAgICAgICAgICAgLy8gZmlsbCBiaXRzLiIKICAgICAgICAgICAgIC8vIFRoZSBUT0EgZmllbGQgaXMgbm90IGluY2x1ZGVkIGFzIHBhcnQgb2YgdGhpcwogICAgICAgICAgICAgaW50IGFkZHJlc3NMZW5ndGggPSBwZHVbY3VyXSAmIDB4ZmY7CkBAIC01NzMsNyArNTY5LDcgQEAKICAgICAgICAgICAgIGludCBzZWNvbmQgPSBJY2NVdGlscy5nc21CY2RCeXRlVG9JbnQocGR1W2N1cisrXSk7CiAKICAgICAgICAgICAgIC8vIEZvciB0aGUgdGltZXpvbmUsIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUKLSAgICAgICAgICAgIC8vIGxlYXN0IHNpZ25maWNhbnQgbmliYmxlIGlzIHRoZSBzaWduIGJ5dGUKKyAgICAgICAgICAgIC8vIGxlYXN0IHNpZ25pZmljYW50IG5pYmJsZSBpcyB0aGUgc2lnbiBieXRlCiAgICAgICAgICAgICAvLyAobWVhbmluZyB0aGUgbWF4IHJhbmdlIG9mIHRoaXMgZmllbGQgaXMgNzkgcXVhcnRlci1ob3VycywKICAgICAgICAgICAgIC8vIHdoaWNoIGlzIG1vcmUgdGhhbiBlbm91Z2gpCiAKQEAgLTYzMiw3ICs2MjgsNyBAQAogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogSGVyZSB3ZSBqdXN0IGNyZWF0ZSB0aGUgdXNlciBkYXRhIGxlbmd0aCB0byBiZSB0aGUgcmVtYWluZGVyIG9mCiAgICAgICAgICAgICAgICAgICogdGhlIHBkdSBtaW51cyB0aGUgdXNlciBkYXRhIGhlYWRlciwgc2luY2UgdXNlckRhdGFMZW5ndGggbWVhbnMKLSAgICAgICAgICAgICAgICAgKiB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBzZXBldHMuCisgICAgICAgICAgICAgICAgICogdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgc2VwdGV0cy4KICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBidWZmZXJMZW4gPSBwZHUubGVuZ3RoIC0gb2Zmc2V0OwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTY3MSwxMCArNjY3LDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYml0cyBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIHVzZXIgZGF0YQorICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFkZGluZyBiaXRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVzZXIgZGF0YQogICAgICAgICAgKiBhcnJheSBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBzZXB0ZXRzLgogICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFkZGluZyBiaXRzIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgdXNlciBkYXRhCisgICAgICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYWRkaW5nIGJpdHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdXNlciBkYXRhCiAgICAgICAgICAqIGFycmF5IGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIHNlcHRldHMKICAgICAgICAgICovCiAgICAgICAgIGludCBnZXRVc2VyRGF0YVNlcHRldFBhZGRpbmcoKSB7CkBAIC02OTQsNyArNjkwLDcgQEAKICAgICAgICAgWFhYIE5vdCBzdXJlIHdoYXQgdGhpcyBvbmUgaXMgc3VwcG9zZWQgdG8gYmUgZG9pbmcsIGFuZCBubyBvbmUgaXMgdXNpbmcKICAgICAgICAgaXQuCiAgICAgICAgIFN0cmluZyBnZXRVc2VyRGF0YUdTTThiaXQoKSB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInJlbWFpbmRlciBvZiBwdWQ6IiArCisgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInJlbWFpbmRlciBvZiBwZHU6IiArCiAgICAgICAgICAgICAvLyBIZXhEdW1wLmR1bXBIZXhTdHJpbmcocGR1LCBjdXIsIHBkdS5sZW5ndGggLSBjdXIpKTsKICAgICAgICAgICAgIGludCBjb3VudCA9IHBkdVtjdXIrK10gJiAweGZmOwogICAgICAgICAgICAgaW50IHNpemUgPSBwZHVbY3VyKytdOwpAQCAtNzgxLDYgKzc3NywyNyBAQAogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnRlcnByZXRzIHRoZSB1c2VyIGRhdGEgcGF5bG9hZCBhcyBLU0MtNTYwMSBjaGFyYWN0ZXJzLCBhbmQKKyAgICAgICAgICogZGVjb2RlcyB0aGVtIGludG8gYSBTdHJpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBieXRlQ291bnQgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgdXNlciBkYXRhIHBheWxvYWQKKyAgICAgICAgICogQHJldHVybiBhIFN0cmluZyB3aXRoIHRoZSBkZWNvZGVkIGNoYXJhY3RlcnMKKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyBnZXRVc2VyRGF0YUtTQzU2MDEoaW50IGJ5dGVDb3VudCkgeworICAgICAgICAgICAgU3RyaW5nIHJldDsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXQgPSBuZXcgU3RyaW5nKHBkdSwgY3VyLCBieXRlQ291bnQsICJLU0M1NjAxIik7CisgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgcmV0ID0gIiI7CisgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgImltcGxhdXNpYmxlIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24iLCBleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN1ciArPSBieXRlQ291bnQ7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKICAgICAgICAgYm9vbGVhbiBtb3JlRGF0YVByZXNlbnQoKSB7CiAgICAgICAgICAgICByZXR1cm4gKHBkdS5sZW5ndGggPiBjdXIpOwogICAgICAgICB9CkBAIC04MjcsMTEgKzg0NCwxMyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRQcm90b2NvbElkZW50aWZpZXIoKSB7CiAgICAgICAgIHJldHVybiBwcm90b2NvbElkZW50aWZpZXI7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcGxhY2UoKSB7CiAgICAgICAgIHJldHVybiAocHJvdG9jb2xJZGVudGlmaWVyICYgMHhjMCkgPT0gMHg0MAogICAgICAgICAgICAgICAgICYmIChwcm90b2NvbElkZW50aWZpZXIgJiAweDNmKSA+IDAKQEAgLTgzOSwxMiArODU4LDE0IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc0NwaHNNd2lNZXNzYWdlKCkgewogICAgICAgICByZXR1cm4gKChHc21TbXNBZGRyZXNzKSBvcmlnaW5hdGluZ0FkZHJlc3MpLmlzQ3Boc1ZvaWNlTWVzc2FnZUNsZWFyKCkKICAgICAgICAgICAgICAgICB8fCAoKEdzbVNtc0FkZHJlc3MpIG9yaWdpbmF0aW5nQWRkcmVzcykuaXNDcGhzVm9pY2VNZXNzYWdlU2V0KCk7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc01XSUNsZWFyTWVzc2FnZSgpIHsKICAgICAgICAgaWYgKGlzTXdpICYmIChtd2lTZW5zZSA9PSBmYWxzZSkpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtODU1LDYgKzg3Niw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc01XSVNldE1lc3NhZ2UoKSB7CiAgICAgICAgIGlmIChpc013aSAmJiAobXdpU2Vuc2UgPT0gdHJ1ZSkpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtODY1LDYgKzg4Nyw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc013aURvbnRTdG9yZSgpIHsKICAgICAgICAgaWYgKGlzTXdpICYmIG13aURvbnRTdG9yZSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC04ODQsMzEgKzkwNywzNCBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRTdGF0dXMoKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXR1c1JlcG9ydE1lc3NhZ2UoKSB7CiAgICAgICAgIHJldHVybiBpc1N0YXR1c1JlcG9ydE1lc3NhZ2U7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcGx5UGF0aFByZXNlbnQoKSB7CiAgICAgICAgIHJldHVybiByZXBseVBhdGhQcmVzZW50OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRTIDI3LjAwNSAzLjEsIDxwZHU+IGRlZmluaXRpb24gIkluIHRoZSBjYXNlIG9mIFNNUzogM0dQUCBUUyAyNC4wMTEgWzZdCisgICAgICogVFMgMjcuMDA1IDMuMSwgJmx0O3BkdSZndDsgZGVmaW5pdGlvbiAiSW4gdGhlIGNhc2Ugb2YgU01TOiAzR1BQIFRTIDI0LjAxMSBbNl0KICAgICAgKiBTQyBhZGRyZXNzIGZvbGxvd2VkIGJ5IDNHUFAgVFMgMjMuMDQwIFszXSBUUERVIGluIGhleGFkZWNpbWFsIGZvcm1hdDoKICAgICAgKiBNRS9UQSBjb252ZXJ0cyBlYWNoIG9jdGV0IG9mIFRQIGRhdGEgdW5pdCBpbnRvIHR3byBJUkEgY2hhcmFjdGVyIGxvbmcKLSAgICAgKiBoZXhhZCBudW1iZXIgKGUuZy4gb2N0ZXQgd2l0aCBpbnRlZ2VyIHZhbHVlIDQyIGlzIHByZXNlbnRlZCB0byBURSBhcyB0d28KKyAgICAgKiBoZXggbnVtYmVyIChlLmcuIG9jdGV0IHdpdGggaW50ZWdlciB2YWx1ZSA0MiBpcyBwcmVzZW50ZWQgdG8gVEUgYXMgdHdvCiAgICAgICogY2hhcmFjdGVycyAyQSAoSVJBIDUwIGFuZCA2NSkpIiAuLi5pbiB0aGUgY2FzZSBvZiBjZWxsIGJyb2FkY2FzdCwKICAgICAgKiBzb21ldGhpbmcgZWxzZS4uLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBwYXJzZVBkdShieXRlW10gcGR1KSB7CiAgICAgICAgIG1QZHUgPSBwZHU7Ci0gICAgICAgIC8vIExvZy5kKExPR19UQUcsICJyYXcgc21zIG1lc2FnZToiKTsKKyAgICAgICAgLy8gTG9nLmQoTE9HX1RBRywgInJhdyBzbXMgbWVzc2FnZToiKTsKICAgICAgICAgLy8gTG9nLmQoTE9HX1RBRywgcyk7CiAKICAgICAgICAgUGR1UGFyc2VyIHAgPSBuZXcgUGR1UGFyc2VyKHBkdSk7CkBAIC0xMTA3LDYgKzExMzMsMTYgQEAKICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiTVdJIGZvciBmYXgsIGVtYWlsLCBvciBvdGhlciAiCiAgICAgICAgICAgICAgICAgICAgICAgICArIChkYXRhQ29kaW5nU2NoZW1lICYgMHhmZikpOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKChkYXRhQ29kaW5nU2NoZW1lICYgMHhDMCkgPT0gMHg4MCkgeworICAgICAgICAgICAgLy8gM0dQUCBUUyAyMy4wMzggVjcuMC4wICgyMDA2LTAzKSBzZWN0aW9uIDQKKyAgICAgICAgICAgIC8vIDB4ODAuLjB4QkYgPT0gUmVzZXJ2ZWQgY29kaW5nIGdyb3VwcworICAgICAgICAgICAgaWYgKGRhdGFDb2RpbmdTY2hlbWUgPT0gMHg4NCkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgdmFsdWUgdXNlZCBmb3IgS1NDNTYwMSBieSBjYXJyaWVycyBpbiBLb3JlYS4KKyAgICAgICAgICAgICAgICBlbmNvZGluZ1R5cGUgPSBFTkNPRElOR19LU0M1NjAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiNSAtIFVuc3VwcG9ydGVkIFNNUyBkYXRhIGNvZGluZyBzY2hlbWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAoZGF0YUNvZGluZ1NjaGVtZSAmIDB4ZmYpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIExvZy53KExPR19UQUcsICIzIC0gVW5zdXBwb3J0ZWQgU01TIGRhdGEgY29kaW5nIHNjaGVtZSAiCiAgICAgICAgICAgICAgICAgICAgICsgKGRhdGFDb2RpbmdTY2hlbWUgJiAweGZmKSk7CkBAIC0xMTMxLDYgKzExNjcsMTAgQEAKICAgICAgICAgY2FzZSBFTkNPRElOR18xNkJJVDoKICAgICAgICAgICAgIG1lc3NhZ2VCb2R5ID0gcC5nZXRVc2VyRGF0YVVDUzIoY291bnQpOwogICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFTkNPRElOR19LU0M1NjAxOgorICAgICAgICAgICAgbWVzc2FnZUJvZHkgPSBwLmdldFVzZXJEYXRhS1NDNTYwMShjb3VudCk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChDb25maWcuTE9HVikgTG9nLnYoTE9HX1RBRywgIlNNUyBtZXNzYWdlIGJvZHkgKHJhdyk6ICciICsgbWVzc2FnZUJvZHkgKyAiJyIpOwpAQCAtMTE2Miw2ICsxMjAyLDcgQEAKICAgICAvKioKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE1lc3NhZ2VDbGFzcyBnZXRNZXNzYWdlQ2xhc3MoKSB7CiAgICAgICAgIHJldHVybiBtZXNzYWdlQ2xhc3M7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Vc2ltUGhvbmVCb29rTWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Vc2ltUGhvbmVCb29rTWFuYWdlci5qYXZhCmluZGV4IGI2NDI1NDEuLjQxZjNiMjMgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vVXNpbVBob25lQm9va01hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1VzaW1QaG9uZUJvb2tNYW5hZ2VyLmphdmEKQEAgLTI3LDggKzI3LDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lQmFzZTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuaGFybW9ueS5sdW5pLmxhbmcucmVmbGVjdC5MaXN0T2ZUeXBlczsKLQogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwQ29ubmVjdGlvbkJhc2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwQ29ubmVjdGlvbkJhc2UuamF2YQppbmRleCBkYzRiMjdiLi5jMTM5YTY0IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcENvbm5lY3Rpb25CYXNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBDb25uZWN0aW9uQmFzZS5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNhbGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbm5lY3Rpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5VVVNJbmZvOwogCiBpbXBvcnQgYW5kcm9pZC5uZXQuc2lwLlNpcEF1ZGlvQ2FsbDsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwpAQCAtMTcxLDQgKzE3MiwxMCBAQAogICAgICAgICAvLyBUT0RPOiBhZGQgUFJFU0VOVEFUSU9OX1VSTAogICAgICAgICByZXR1cm4gQ29ubmVjdGlvbi5QUkVTRU5UQVRJT05fQUxMT1dFRDsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVVVTSW5mbyBnZXRVVVNJbmZvKCkgeworICAgICAgICAvLyBGSVhNRTogd2hhdCdzIHRoaXMgZm9yIFNJUD8KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZS5qYXZhCmluZGV4IDRmZDRjZGQuLjZlZDkyOTUgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwUGhvbmUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lLmphdmEKQEAgLTM4LDcgKzM4LDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29ubmVjdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lTm90aWZpZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlVVU0luZm87CiAKIGltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC03Miw2ICs3MSwxNCBAQAogICAgICAgICBtU2lwTWFuYWdlciA9IFNpcE1hbmFnZXIubmV3SW5zdGFuY2UoY29udGV4dCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmIChvID09IHRoaXMpIHJldHVybiB0cnVlOworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgU2lwUGhvbmUpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIFNpcFBob25lIHRoYXQgPSAoU2lwUGhvbmUpIG87CisgICAgICAgIHJldHVybiBtUHJvZmlsZS5nZXRVcmlTdHJpbmcoKS5lcXVhbHModGhhdC5tUHJvZmlsZS5nZXRVcmlTdHJpbmcoKSk7CisgICAgfQorCiAgICAgcHVibGljIFN0cmluZyBnZXRQaG9uZU5hbWUoKSB7CiAgICAgICAgIHJldHVybiAiU0lQOiIgKyBnZXRVcmlTdHJpbmcobVByb2ZpbGUpOwogICAgIH0KQEAgLTE0NywxMCArMTU0LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBDb25uZWN0aW9uIGRpYWwoU3RyaW5nIGRpYWxTdHJpbmcsIFVVU0luZm8gdXVzaW5mbykgdGhyb3dzIENhbGxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkaWFsKGRpYWxTdHJpbmcpOwotICAgIH0KLQogICAgIHB1YmxpYyBDb25uZWN0aW9uIGRpYWwoU3RyaW5nIGRpYWxTdHJpbmcpIHRocm93cyBDYWxsU3RhdGVFeGNlcHRpb24gewogICAgICAgICBzeW5jaHJvbml6ZWQgKFNpcFBob25lLmNsYXNzKSB7CiAgICAgICAgICAgICByZXR1cm4gZGlhbEludGVybmFsKGRpYWxTdHJpbmcpOwpAQCAtODMyLDEwICs4MzUsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBVVVNJbmZvIGdldFVVU0luZm8oKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIENhbGwuU3RhdGUgZ2V0Q2FsbFN0YXRlRnJvbShTaXBBdWRpb0NhbGwgc2lwQXVkaW9DYWxsKSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lQmFzZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZUJhc2UuamF2YQppbmRleCA1NDk5OTY2Li5hZmQ0ZDBjIDEwMDc1NQotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lQmFzZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwUGhvbmVCYXNlLmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnNpcDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKQEAgLTQyLDYgKzQzLDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmVOb3RpZmllcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmVTdWJJbmZvOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlQcm9wZXJ0aWVzOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5VVVNJbmZvOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTYyLDYgKzY0LDEyIEBACiAKICAgICBwdWJsaWMgYWJzdHJhY3QgQ2FsbCBnZXRSaW5naW5nQ2FsbCgpOwogCisgICAgcHVibGljIENvbm5lY3Rpb24gZGlhbChTdHJpbmcgZGlhbFN0cmluZywgVVVTSW5mbyB1dXNJbmZvKQorICAgICAgICAgICAgdGhyb3dzIENhbGxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGlnbm9yZSBVVVNJbmZvCisgICAgICAgIHJldHVybiBkaWFsKGRpYWxTdHJpbmcpOworICAgIH0KKwogICAgIHZvaWQgbWlncmF0ZUZyb20oU2lwUGhvbmVCYXNlIGZyb20pIHsKICAgICAgICAgbWlncmF0ZShtUmluZ2JhY2tSZWdpc3RyYW50cywgZnJvbS5tUmluZ2JhY2tSZWdpc3RyYW50cyk7CiAgICAgICAgIG1pZ3JhdGUobVByZWNpc2VDYWxsU3RhdGVSZWdpc3RyYW50cywgZnJvbS5tUHJlY2lzZUNhbGxTdGF0ZVJlZ2lzdHJhbnRzKTsKQEAgLTQxOSw2ICs0MjcsMTggQEAKICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkVycm9yISBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGltcGxlbWVudGVkIGZvciBTSVAuIik7CiAgICAgfQogCisgICAgLy9AT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKSB7CisgICAgICAgIC8vIEZJWE1FOiB3aGF0J3MgdGhpcyBmb3IgU0lQPworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy9AT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgLy8gRklYTUU6IHdoYXQncyB0aGlzIGZvciBTSVA/CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKwogICAgIHZvaWQgdXBkYXRlUGhvbmVTdGF0ZSgpIHsKICAgICAgICAgU3RhdGUgb2xkU3RhdGUgPSBzdGF0ZTsKIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvU2ltdWxhdGVkQ29tbWFuZHMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS90ZXN0L1NpbXVsYXRlZENvbW1hbmRzLmphdmEKaW5kZXggOWM3MmU1YS4uZmRjZjc4ZCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvU2ltdWxhdGVkQ29tbWFuZHMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9TaW11bGF0ZWRDb21tYW5kcy5qYXZhCkBAIC0xNiw3ICsxNiw2IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3Q7CiAKLQogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwpAQCAtMjcsNyArMjYsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db21tYW5kRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db21tYW5kc0ludGVyZmFjZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRGF0YUNhbGxTdGF0ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ2FyZDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlVVU0luZm87CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5DYWxsRmFpbENhdXNlOwpAQCAtMzM1LDcgKzMzMyw3IEBACiAKICAgICAvKioKICAgICAgKiAoQXN5bmNSZXN1bHQpcmVzcG9uc2Uub2JqKS5yZXN1bHQgd2lsbCBiZSBhbiBJbnRlZ2VyIHJlcHJlc2VudGluZwotICAgICAqIHRoZSBzdW0gb2YgZW5hYmxlZCBzZXJpdmljZSBjbGFzc2VzIChzdW0gb2YgU0VSVklDRV9DTEFTU18qKQorICAgICAqIHRoZSBzdW0gb2YgZW5hYmxlZCBzZXJ2aWNlIGNsYXNzZXMgKHN1bSBvZiBTRVJWSUNFX0NMQVNTXyopCiAgICAgICoKICAgICAgKiBAcGFyYW0gZmFjaWxpdHkgb25lIG9mIENCX0ZBQ0lMVFlfKgogICAgICAqIEBwYXJhbSBwaW4gcGFzc3dvcmQgb3IgIiIgaWYgbm90IHJlcXVpcmVkCkBAIC00NDEsNyArNDM5LDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGNvbnRhaW5zIGEgTGlzdCBvZiBEcml2ZXJDYWxsCiAgICAgICogICAgICBUaGUgYXIucmVzdWx0IExpc3QgaXMgc29ydGVkIGJ5IERyaXZlckNhbGwuaW5kZXgKICAgICAgKi8KQEAgLTQ2OCw3ICs0NjYsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgY29udGFpbnMgYSBMaXN0IG9mIERhdGFDYWxsU3RhdGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBnZXREYXRhQ2FsbExpc3QoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTQ3OSw3ICs0NzcsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICoKICAgICAgKiBDTElSX0RFRkFVTFQgICAgID09IG9uICJ1c2Ugc3Vic2NyaXB0aW9uIGRlZmF1bHQgdmFsdWUiCkBAIC00OTYsNyArNDk0LDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqCiAgICAgICogQ0xJUl9ERUZBVUxUICAgICA9PSBvbiAidXNlIHN1YnNjcmlwdGlvbiBkZWZhdWx0IHZhbHVlIgpAQCAtNTEzLDcgKzUxMSw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBTdHJpbmcgY29udGFpbmluZyBJTVNJIG9uIHN1Y2Nlc3MKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBnZXRJTVNJKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC01MjQsNyArNTIyLDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIFN0cmluZyBjb250YWluaW5nIElNRUkgb24gc3VjY2VzcwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldElNRUkoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTUzNSw3ICs1MzMsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgU3RyaW5nIGNvbnRhaW5pbmcgSU1FSVNWIG9uIHN1Y2Nlc3MKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBnZXRJTUVJU1YoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTU0Nyw3ICs1NDUsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICoKICAgICAgKiAgM0dQUCAyMi4wMzAgNi41LjUKQEAgLTU3Miw3ICs1NzAsNyBAQAogICAgICAqICAiUmVsZWFzZXMgYWxsIGhlbGQgY2FsbHMgb3Igc2V0cyBVc2VyIERldGVybWluZWQgVXNlciBCdXN5IChVRFVCKQogICAgICAqICAgZm9yIGEgd2FpdGluZyBjYWxsLiIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGhhbmd1cFdhaXRpbmdPckJhY2tncm91bmQgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC01OTMsNyArNTkxLDcgQEAKICAgICAgKiAgdGhlIG90aGVyIChoZWxkIG9yIHdhaXRpbmcpIGNhbGwuIgogICAgICAqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBoYW5ndXBGb3JlZ3JvdW5kUmVzdW1lQmFja2dyb3VuZCAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTYxNCw3ICs2MTIsNyBAQAogICAgICAqICB0aGUgb3RoZXIgKGhlbGQgb3Igd2FpdGluZykgY2FsbC4iCiAgICAgICoKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN3aXRjaFdhaXRpbmdPckhvbGRpbmdBbmRBY3RpdmUgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC02MzQsNyArNjMyLDcgQEAKICAgICAgKiAiQWRkcyBhIGhlbGQgY2FsbCB0byB0aGUgY29udmVyc2F0aW9uIgogICAgICAqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjb25mZXJlbmNlIChNZXNzYWdlIHJlc3VsdCkgewpAQCAtNjU0LDcgKzY1Miw3IEBACiAgICAgICogIkNvbm5lY3RzIHRoZSB0d28gY2FsbHMgYW5kIGRpc2Nvbm5lY3RzIHRoZSBzdWJzY3JpYmVyIGZyb20gYm90aCBjYWxscyIKICAgICAgKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZXhwbGljaXRDYWxsVHJhbnNmZXIgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC02OTAsNyArNjg4LDcgQEAKICAgICAvKioKICAgICAgKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWNjZXB0Q2FsbCAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTcwOCw3ICs3MDYsNyBAQAogICAgIC8qKgogICAgICAqICBhbHNvIGtub3duIGFzIFVEVUIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlamVjdENhbGwgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC03ODUsNyArNzgzLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSByZXN1bHQgaXMgY2FsbGJhY2sgbWVzc2FnZQogICAgICAqICAgICAgICAoKEFzeW5jUmVzdWx0KXJlc3BvbnNlLm9iaikucmVzdWx0ICBpcyBhbiBpbnRbXSB3aXRoIGV2ZXJ5Ci0gICAgICogICAgICAgIGVsZW1lbnQgcmVwcmVzZW50aW5nIG9uZSBhdmlhbGFibGUgQk1fKl9CQU5ECisgICAgICogICAgICAgIGVsZW1lbnQgcmVwcmVzZW50aW5nIG9uZSBhdmFpbGFibGUgQk1fKl9CQU5ECiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcXVlcnlBdmFpbGFibGVCYW5kTW9kZSAoTWVzc2FnZSByZXN1bHQpIHsKICAgICAgICAgaW50IHJldFtdID0gbmV3IGludCBbNF07CkBAIC04OTQsNyArODkyLDcgQEAKIAogICAgIC8qKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2VuZER0bWYoY2hhciBjLCBNZXNzYWdlIHJlc3VsdCkgewpAQCAtOTAzLDcgKzkwMSw3IEBACiAKICAgICAvKioKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN0YXJ0RHRtZihjaGFyIGMsIE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC05MTIsNyArOTEwLDcgQEAKIAogICAgIC8qKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc3RvcER0bWYoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTkyMSw3ICs5MTksNyBAQAogCiAgICAgLyoqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZW5kQnVyc3REdG1mKFN0cmluZyBkdG1mU3RyaW5nLCBpbnQgb24sIGludCBvZmYsIE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC05NTYsNiArOTU0LDcgQEAKICAgICAgICAgdW5pbXBsZW1lbnRlZChyZXNwb25zZSk7CiAgICAgfQogCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBzZXR1cERlZmF1bHRQRFAoU3RyaW5nIGFwbiwgU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCwgTWVzc2FnZSByZXN1bHQpIHsKICAgICAgICAgdW5pbXBsZW1lbnRlZChyZXN1bHQpOwogICAgIH0KQEAgLTk2Nyw5ICs5NjYsNyBAQAogCiAgICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZURhdGFDYWxsKGludCBjaWQsIE1lc3NhZ2UgcmVzdWx0KSB7dW5pbXBsZW1lbnRlZChyZXN1bHQpO30KIAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlRGVmYXVsdFBEUChpbnQgY2lkLCBNZXNzYWdlIHJlc3VsdCkge3VuaW1wbGVtZW50ZWQocmVzdWx0KTt9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRQcmVmZXJyZWROZXR3b3JrVHlwZShpbnQgbmV0d29ya1R5cGUgLCBNZXNzYWdlIHJlc3VsdCkgewpAQCAtMTA0Niw3ICsxMDQzLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBwYXJhbWV0ZXJzIGVxdWl2aWxpZW50IHRvIDI3LjAwNyBBVCtDUlNNIGNvbW1hbmQKKyAgICAgKiBwYXJhbWV0ZXJzIGVxdWl2YWxlbnQgdG8gMjcuMDA3IEFUK0NSU00gY29tbWFuZAogICAgICAqIHJlc3BvbnNlLm9iaiB3aWxsIGJlIGFuIEFzeW5jUmVzdWx0CiAgICAgICogcmVzcG9uc2Uub2JqLnVzZXJPYmogd2lsbCBiZSBhIFNpbUlvUmVzdWx0IG9uIHN1Y2Nlc3MKICAgICAgKi8KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9tb2NrcmlsL0FuZHJvaWQubWsgYi90ZWxlcGhvbnkvbW9ja3JpbC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YWU4NGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvbW9ja3JpbC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMKKworTE9DQUxfUEFUSDo9JChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY29yZSBmcmFtZXdvcmsKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGxpYnJpbHByb3RvLWphdmEKKworTE9DQUxfTU9EVUxFIDo9IG1vY2tyaWxjb250cm9sbGVyCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfSkFWQV9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L21vY2tyaWwvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9tb2NrcmlsL01vY2tSaWxDb250cm9sbGVyLmphdmEgYi90ZWxlcGhvbnkvbW9ja3JpbC9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L21vY2tyaWwvTW9ja1JpbENvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTEzOWJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L21vY2tyaWwvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9tb2NrcmlsL01vY2tSaWxDb250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkubW9ja3JpbDsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5jb21tdW5pY2F0aW9uLk1zZ0hlYWRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5jb21tdW5pY2F0aW9uLk1zZzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUmlsQ2hhbm5lbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbEN0cmxDbWRzOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kczsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLk1lc3NhZ2VNaWNybzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogQ29udGFpbiBhIGxpc3Qgb2YgY29tbWFuZHMgdG8gY29udHJvbCBNb2NrIFJJTC4gQmVmb3JlIHVzaW5nIHRoZXNlIGNvbW1hbmRzIHRoZSBkZXZpY2VzCisgKiBuZWVkcyB0byBiZSBzZXQgd2l0aCBNb2NrIFJJTC4gUmVmZXIgdG8gaGFyZHdhcmUvcmlsL21vY2tyaWwvUkVBRE1FLnR4dCBmb3IgZGV0YWlscy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBNb2NrUmlsQ29udHJvbGxlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNb2NrUklMQ29udHJvbGxlciI7CisgICAgcHJpdmF0ZSBSaWxDaGFubmVsIG1SaWxDaGFubmVsID0gbnVsbDsKKyAgICBwcml2YXRlIE1zZyBtTWVzc2FnZSA9IG51bGw7CisKKyAgICBwdWJsaWMgTW9ja1JpbENvbnRyb2xsZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBtUmlsQ2hhbm5lbCA9IFJpbENoYW5uZWwubWFrZVJpbENoYW5uZWwoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgY2hhbm5lbCBhZnRlciB0aGUgY29tbXVuaWNhdGlvbiBpcyBkb25lLgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyB0byBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHRlc3QgaXMgZmluaXNoZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2VDaGFubmVsKCkgeworICAgICAgICBtUmlsQ2hhbm5lbC5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgY29tbWFuZHMgYW5kIHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MKKyAgICAgKiBAcGFyYW0gY21kIGZvciBNc2dIZWFkZXIKKyAgICAgKiBAcGFyYW0gdG9rZW4gZm9yIE1zZ0hlYWRlcgorICAgICAqIEBwYXJhbSBzdGF0dXMgZm9yIE1zZ0hlYWRlcgorICAgICAqIEBwYXJhbSBwYkRhdGEgZm9yIE1zZyBkYXRhCisgICAgICogQHJldHVybiB0cnVlIGlmIGNvbW1hbmQgaXMgc2VudCBzdWNjZXNzZnVsbHksIGZhbHNlIGlmIGl0IGZhaWxzCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNlbmRDdHJsQ29tbWFuZChpbnQgY21kLCBsb25nIHRva2VuLCBpbnQgc3RhdHVzLCBNZXNzYWdlTWljcm8gcGJEYXRhKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNc2cuc2VuZChtUmlsQ2hhbm5lbCwgY21kLCB0b2tlbiwgc3RhdHVzLCBwYkRhdGEpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJzZW5kIGNvbW1hbmQgOiAlZCBmYWlsZWQ6ICIgKyBlLmdldFN0YWNrVHJhY2UoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGNvbnRyb2wgcmVzcG9uc2UKKyAgICAgKiBAcmV0dXJuIE1zZyBpZiByZXNwb25zZSBpcyByZWNlaXZlZCwgZWxzZSByZXR1cm4gbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1zZyBnZXRDdHJsUmVzcG9uc2UoKSB7CisgICAgICAgIE1zZyByZXNwb25zZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZSA9IE1zZy5yZWN2KG1SaWxDaGFubmVsKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAicmVjZWl2ZSByZXNwb25zZSBmb3IgZ2V0UmFkaW9TdGF0ZSgpIGVycm9yOiAiICsgZS5nZXRTdGFja1RyYWNlKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHJhZGlvIHN0YXRlIGlmIGl0IGlzIHZhbGlkLCBvdGhlcndpc2UgcmV0dXJuIC0xCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSYWRpb1N0YXRlKCkgeworICAgICAgICBpZiAoIXNlbmRDdHJsQ29tbWFuZChSaWxDdHJsQ21kcy5DVFJMX0NNRF9HRVRfUkFESU9fU1RBVEUsIDAsIDAsIG51bGwpKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgTXNnIHJlc3BvbnNlID0gZ2V0Q3RybFJlc3BvbnNlKCk7CisgICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJmYWlsZWQgdG8gZ2V0IHJlc3BvbnNlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmVzcG9uc2UucHJpbnRIZWFkZXIoVEFHKTsKKyAgICAgICAgUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUgcmVzcCA9CisgICAgICAgICAgICByZXNwb25zZS5nZXREYXRhQXMoUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUuY2xhc3MpOworICAgICAgICBpbnQgc3RhdGUgPSByZXNwLmdldFN0YXRlKCk7CisgICAgICAgIGlmICgoc3RhdGUgPj0gUmlsQ21kcy5SQURJT1NUQVRFX09GRikgJiYgKHN0YXRlIDw9IFJpbENtZHMuUkFESU9TVEFURV9OVl9SRUFEWSkpCisgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJhZGlvIHN0YXRlIG9mIG1vY2sgcmlsIHRvIHRoZSBnaXZlbiBzdGF0ZQorICAgICAqIEBwYXJhbSBzdGF0ZSBmb3IgZ2l2ZW4gcmFkaW8gc3RhdGUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0YXRlIGlzIHNldCBzdWNjZXNzZnVsLCBmYWxzZSBpZiBpdCBmYWlscworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNldFJhZGlvU3RhdGUoaW50IHN0YXRlKSB7CisgICAgICAgIFJpbEN0cmxDbWRzLkN0cmxSZXFSYWRpb1N0YXRlIHJlcSA9IG5ldyBSaWxDdHJsQ21kcy5DdHJsUmVxUmFkaW9TdGF0ZSgpOworICAgICAgICBpZiAoc3RhdGUgPCAwIHx8IHN0YXRlID4gUmlsQ21kcy5SQURJT1NUQVRFX05WX1JFQURZKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJ0aGUgZ2l2ZSByYWRpbyBzdGF0ZSBpcyBub3QgdmFsaWQuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmVxLnNldFN0YXRlKHN0YXRlKTsKKyAgICAgICAgaWYgKCFzZW5kQ3RybENvbW1hbmQoUmlsQ3RybENtZHMuQ1RSTF9DTURfU0VUX1JBRElPX1NUQVRFLCAwLCAwLCByZXEpKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJzZW5kIHNldCByYWRpbyBzdGF0ZSByZXF1ZXN0IGZhaWxlZC4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBNc2cgcmVzcG9uc2UgPSBnZXRDdHJsUmVzcG9uc2UoKTsKKyAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgImZhaWxlZCB0byBnZXQgcmVzcG9uc2UgZm9yIHNldFJhZGlvU3RhdGUiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXNwb25zZS5wcmludEhlYWRlcihUQUcpOworICAgICAgICBSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZSByZXNwID0KKyAgICAgICAgICAgIHJlc3BvbnNlLmdldERhdGFBcyhSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZS5jbGFzcyk7CisgICAgICAgIGludCBjdXJzdGF0ZSA9IHJlc3AuZ2V0U3RhdGUoKTsKKyAgICAgICAgcmV0dXJuIGN1cnN0YXRlID09IHN0YXRlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvQW5kcm9pZC5tayBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzMxZDBkCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTQgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gbW9ja3JpbGNvbnRyb2xsZXIKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gVGVsZXBob255TW9ja1JpbFRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZjQ0YTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKworPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlbGVwaG9ueW1vY2tyaWx0ZXN0cyI+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpsYWJlbD0iVGVsZXBob255TW9ja1JpbFRlc3QiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJUZWxlcGhvbnlNb2NrUmlsVGVzdCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9Ii5UZWxlcGhvbnlNb2NrVGVzdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC50ZWxlcGhvbnltb2NrcmlsdGVzdHMiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlRlc3QgcnVubmVyIGZvciBUZWxlcGhvbnkgVGVzdHMgVXNpbmcgTW9jayBSSUwiCisgICAgLz4KKworICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9QSE9ORV9TVEFURSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9zcmMvY29tL2FuZHJvaWQvdGVsZXBob255bW9ja3JpbHRlc3RzL1RlbGVwaG9ueU1vY2tUZXN0UnVubmVyLmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL3NyYy9jb20vYW5kcm9pZC90ZWxlcGhvbnltb2NrcmlsdGVzdHMvVGVsZXBob255TW9ja1Rlc3RSdW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGVlNzM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9zcmMvY29tL2FuZHJvaWQvdGVsZXBob255bW9ja3JpbHRlc3RzL1RlbGVwaG9ueU1vY2tUZXN0UnVubmVyLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlbGVwaG9ueW1vY2tyaWx0ZXN0czsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyOworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0U3VpdGU7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255Lm1vY2tyaWwuTW9ja1JpbENvbnRyb2xsZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnRlbGVwaG9ueW1vY2tyaWx0ZXN0cy5mdW5jdGlvbmFsLlNpbXBsZVRlc3RVc2luZ01vY2tSaWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgcnVubmVyIGZvciB0ZWxlcGhvbnkgdGVzdHMgdGhhdCB1c2luZyBNb2NrIFJJTAorICoKKyAqLworcHVibGljIGNsYXNzIFRlbGVwaG9ueU1vY2tUZXN0UnVubmVyIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRz0iVGVsZXBob255TW9ja1Rlc3RSdW5uZXIiOworICAgIHB1YmxpYyBNb2NrUmlsQ29udHJvbGxlciBtQ29udHJvbGxlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUZXN0U3VpdGUgZ2V0QWxsVGVzdHMoKSB7CisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBJbnN0cnVtZW50YXRpb25UZXN0U3VpdGUodGhpcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVUZXN0VXNpbmdNb2NrUmlsLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHN1aXRlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1Db250cm9sbGVyID0gbmV3IE1vY2tSaWxDb250cm9sbGVyKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKCJDcmVhdGUgTW9jayBSSWwgQ29udHJvbGxlciBmYWlsZWQiLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0Tm90TnVsbChtQ29udHJvbGxlcik7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmluaXNoKGludCByZXN1bHRDb2RlLCBCdW5kbGUgcmVzdWx0cykgeworICAgICAgICBpZiAobUNvbnRyb2xsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIG1Db250cm9sbGVyLmNsb3NlQ2hhbm5lbCgpOworICAgICAgICBzdXBlci5maW5pc2gocmVzdWx0Q29kZSwgcmVzdWx0cyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9zcmMvY29tL2FuZHJvaWQvdGVsZXBob255bW9ja3JpbHRlc3RzL2Z1bmN0aW9uYWwvU2ltcGxlVGVzdFVzaW5nTW9ja1JpbC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9zcmMvY29tL2FuZHJvaWQvdGVsZXBob255bW9ja3JpbHRlc3RzL2Z1bmN0aW9uYWwvU2ltcGxlVGVzdFVzaW5nTW9ja1JpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYTFjZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL3NyYy9jb20vYW5kcm9pZC90ZWxlcGhvbnltb2NrcmlsdGVzdHMvZnVuY3Rpb25hbC9TaW1wbGVUZXN0VXNpbmdNb2NrUmlsLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVsZXBob255bW9ja3JpbHRlc3RzLmZ1bmN0aW9uYWw7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkubW9ja3JpbC5Nb2NrUmlsQ29udHJvbGxlcjsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnRlbGVwaG9ueW1vY2tyaWx0ZXN0cy5UZWxlcGhvbnlNb2NrVGVzdFJ1bm5lcjsKKworLyoqCisgKiBBIHNpbXBsZSB0ZXN0IHRoYXQgdXNpbmcgTW9jayBSSUwgQ29udHJvbGxlcgorICovCitwdWJsaWMgY2xhc3MgU2ltcGxlVGVzdFVzaW5nTW9ja1JpbCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNpbXBsZVRlc3RVc2luZ01vY2tSaWwiOworICAgIHByaXZhdGUgTW9ja1JpbENvbnRyb2xsZXIgbU1vY2tSaWxDdHJsID0gbnVsbDsKKyAgICBwcml2YXRlIFRlbGVwaG9ueU1vY2tUZXN0UnVubmVyIG1SdW5uZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBtUnVubmVyID0gKFRlbGVwaG9ueU1vY2tUZXN0UnVubmVyKWdldEluc3RydW1lbnRhdGlvbigpOworICAgICAgICBtTW9ja1JpbEN0cmwgPSBtUnVubmVyLm1Db250cm9sbGVyOworICAgICAgICBhc3NlcnROb3ROdWxsKG1Nb2NrUmlsQ3RybCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IHJhZGlvIHN0YXRlIG9mIFJJTAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSYWRpb1N0YXRlKCkgeworICAgICAgICBpbnQgc3RhdGUgPSBtTW9ja1JpbEN0cmwuZ2V0UmFkaW9TdGF0ZSgpOworICAgICAgICBMb2cudihUQUcsICJ0ZXN0R2V0UmFkaW9TdGF0ZTogIiArIHN0YXRlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdGF0ZSA+PSAwICYmIHN0YXRlIDw9IDkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY3VycmVudCByYWRpbyBzdGF0ZSBvZiBSSUwKKyAgICAgKiBhbmQgdmVyaWZ5IHRoZSByYWRpbyBzdGF0ZSBpcyBzZXQgY29ycmVjdGx5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNldFJhZGlvU3RhdGUoKSB7CisgICAgICAgIGZvciAoaW50IHN0YXRlID0gMDsgc3RhdGUgPD0gOTsgc3RhdGUrKykgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAic2V0IHJhZGlvIHN0YXRlIHRvIGJlICIgKyBzdGF0ZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJzZXQgcmFkaW8gc3RhdGU6ICIgKyBzdGF0ZSArICIgZmFpbGVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgIG1Nb2NrUmlsQ3RybC5zZXRSYWRpb1N0YXRlKHN0YXRlKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RmFsc2UoInVzZSBhbiBpbnZhbGlkIHJhZGlvIHN0YXRlIiwgbU1vY2tSaWxDdHJsLnNldFJhZGlvU3RhdGUoLTEpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoInRoZSByYWRpbyBzdGF0ZSBkb2Vzbid0IGV4aXN0IiwgbU1vY2tSaWxDdHJsLnNldFJhZGlvU3RhdGUoMTApKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvQW5kcm9pZC5tayBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDQ1ZTI2NWEuLjk4ZTQ0MDMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkLm1rCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkLm1rCkBAIC01LDYgKzUsOCBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKIAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGxpYnJpbHByb3RvLWphdmEKKwogTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gRnJhbWV3b3Jrc1RlbGVwaG9ueVRlc3RzCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDZhOTc0MjMuLmJhMWQ5NTcgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zMiw2ICszMiwxMyBAQAogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmZyYW1ld29ya3MudGVsZXBob255dGVzdHMiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkZyYW1ld29ya3MgVGVsZXBob255IFRlc3RzIj4KICAgICA8L2luc3RydW1lbnRhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSIuVGVsZXBob255TW9ja1JpbFRlc3RSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuZnJhbWV3b3Jrcy50ZWxlcGhvbnl0ZXN0cyIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iVGVzdCBSdW5uZXIgZm9yIE1vY2sgUmlsIFRlc3RzIgorICAgIC8+CisKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUEhPTkVfU1RBVEUiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KIAogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1OWI4MS4uMDAwMDAwMAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwotCi1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFBob25lTnVtYmVyVXRpbHNUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdE5ldHdvcmtQb3J0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiKzE3MDA1NTU0MTQxIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiKzE3MDA1NTU0MTQxIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIisxNzAwNTU1NDE0MSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIisxICg3MDApLjU1NS00MTQxIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIjE3MDA1NTU0MTQxIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDE0MSIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgLy8gVGhpcyBtYXkgc2VlbSB3cm9uZywgYnV0IGl0J3MgcHJvYmFibHkgb2sKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDE0MSojIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDE0MSojIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDFOTiIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIjEgKDcwMCkuNTU1LTQxTk4sMTIzNCIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIjEgKDcwMCkuNTU1LTQxTk47MTIzNCIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgLy8gQW4gTU1JIHN0cmluZyBpcyB1bnBlcnRlcmJlZCwgZXZlbiB0aG91Z2ggaXQgY29udGFpbnMgYQotICAgICAgICAvLyAodmFsaWQgaW4gdGhpcyBjYXNlKSBlbWJlZGRlZCArCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiKioyMSoqMTcwMDU1NTQxNDEjIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiKioyMSoqKzE3MDA1NTU0MTQxIyIpCi0gICAgICAgICAgICAgICAgLy9UT0RPIHRoaXMgaXMgdGhlIGNvcnJlY3QgcmVzdWx0LCBhbHRob3VnaCB0aGUgYWJvdmUKLSAgICAgICAgICAgICAgICAvL3Jlc3VsdCBoYXMgYmVlbiByZXR1cm5lZCBzaW5jZSBjaGFuZ2UgMzE3NzYKLSAgICAgICAgICAgICAgICAvLyIqKjIxKiorMTcwMDU1NTQxNDEjIgotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIiIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIsMTIzNCIpKTsKLQotICAgICAgICBieXRlIFtdIGIgPSBuZXcgYnl0ZVsyMF07Ci0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNzAwNTU1MDAyMCIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MDsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNzAwNTU1MDAyMCIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MDsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTcwMDU1NTAwMjAiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4RjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKzE3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJ5dGVbXSBiUmV0ID0gUGhvbmVOdW1iZXJVdGlscy5uZXR3b3JrUG9ydGlvblRvQ2FsbGVkUGFydHlCQ0QoIisxNzAwNTU1MDAyMCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNywgYlJldC5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDc7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJbaV0sIGJSZXRbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgYlJldCA9IFBob25lTnVtYmVyVXRpbHMubmV0d29ya1BvcnRpb25Ub0NhbGxlZFBhcnR5QkNEV2l0aExlbmd0aCgiKzE3MDA1NTUwMDIwIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyg4LCBiUmV0Lmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhiUmV0WzBdLCA3KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA4OyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhiW2kgLSAxXSwgYlJldFtpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBiUmV0ID0gUGhvbmVOdW1iZXJVdGlscy5uZXR3b3JrUG9ydGlvblRvQ2FsbGVkUGFydHlCQ0QoIjcwMDU1NTAwMjAiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiUmV0LCAwLCBiUmV0Lmxlbmd0aCkpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhCMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNzAwNTU1MDAyMCMiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4QjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKzE3MDA1NTUwMDIwIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDJBOyBiWzJdID0gKGJ5dGUpIDB4QjE7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKjIxIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDJCOyBiWzJdID0gKGJ5dGUpIDB4QjE7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIzIxIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDJBOyBiWzJdID0gKGJ5dGUpIDB4QjE7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKjIxIysiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDMpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHhBQTsgYlsyXSA9IChieXRlKSAweDEyOyBiWzNdID0gKGJ5dGUpIDB4RkI7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKioyMSMiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDQpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHhBQTsgYlsyXSA9IChieXRlKSAweDEyOyBiWzNdID0gKGJ5dGUpIDB4RkI7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKioyMSMrIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA0KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4OUE7IGJbMl0gPSAoYnl0ZSkgMHhBOTsgYlszXSA9IChieXRlKSAweDcxOwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDA7IGJbNV0gPSAoYnl0ZSkgMHg1NTsgYls2XSA9IChieXRlKSAweDA1OyBiWzddID0gKGJ5dGUpIDB4MjA7Ci0gICAgICAgIGJbOF0gPSAoYnl0ZSkgMHhCMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqOTkqMTcwMDU1NTAwMjAjIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA5KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4OUE7IGJbMl0gPSAoYnl0ZSkgMHhBOTsgYlszXSA9IChieXRlKSAweDcxOwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDA7IGJbNV0gPSAoYnl0ZSkgMHg1NTsgYls2XSA9IChieXRlKSAweDA1OyBiWzddID0gKGJ5dGUpIDB4MjA7Ci0gICAgICAgIGJbOF0gPSAoYnl0ZSkgMHhCMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqOTkqKzE3MDA1NTUwMDIwIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgOSkpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHgxQTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA3OyBiWzVdID0gKGJ5dGUpIDB4NTA7IGJbNl0gPSAoYnl0ZSkgMHg1NTsgYls3XSA9IChieXRlKSAweDAwOwotICAgICAgICBiWzhdID0gKGJ5dGUpIDB4MDI7IGJbOV0gPSAoYnl0ZSkgMHhGQjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxKjE3MDA1NTUwMDIwIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMTApKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHhBQTsgYlsyXSA9IChieXRlKSAweDEyOyBiWzNdID0gKGJ5dGUpIDB4MUE7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNzsgYls1XSA9IChieXRlKSAweDUwOyBiWzZdID0gKGJ5dGUpIDB4NTU7IGJbN10gPSAoYnl0ZSkgMHgwMDsKLSAgICAgICAgYls4XSA9IChieXRlKSAweDAyOyBiWzldID0gKGJ5dGUpIDB4RkI7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKioyMSorMTcwMDU1NTAwMjAjIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAxMCkpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDJBOyBiWzJdID0gKGJ5dGUpIDB4QTE7IGJbM10gPSAoYnl0ZSkgMHg3MTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDAwOyBiWzVdID0gKGJ5dGUpIDB4NTU7IGJbNl0gPSAoYnl0ZSkgMHgwNTsgYls3XSA9IChieXRlKSAweDIwOwotICAgICAgICBiWzhdID0gKGJ5dGUpIDB4RjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKjIxKjE3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA5KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhCMTsgYlszXSA9IChieXRlKSAweDcxOwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDA7IGJbNV0gPSAoYnl0ZSkgMHg1NTsgYls2XSA9IChieXRlKSAweDA1OyBiWzddID0gKGJ5dGUpIDB4MjA7Ci0gICAgICAgIGJbOF0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEjKzE3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA5KSk7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbihudWxsKSk7Ci0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKG51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUobnVsbCwgbnVsbCkpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUobnVsbCwgIjEyMyIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIxMjMiLCBudWxsKSk7Ci0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2gobnVsbCkpOwotICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZChudWxsKSk7Ci0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5zdHJpbmdGcm9tU3RyaW5nQW5kVE9BKG51bGwsIDEpKTsKLSAgICB9Ci0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIisxNzAwNTU1NDE0MSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIisxNzAwNTU1NDE0MSIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIrMTcwMDU1NTQxNDEiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIrMSAoNzAwKS41NTUtNDE0MSIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDE0MSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxNDEiKQotICAgICAgICApOwotCi0gICAgICAgIC8vIFRoaXMgbWF5IHNlZW0gd3JvbmcsIGJ1dCBpdCdzIHByb2JhYmx5IG9rCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxNDEqIyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxNDEqIyIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxTk4iKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIxICg3MDApLjU1NS00MU5OLDEyMzQiKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIxICg3MDApLjU1NS00MU5OOzEyMzQiKQotICAgICAgICApOwotCi0gICAgICAgIC8vIEFuIE1NSSBzdHJpbmcgaXMgdW5wZXJ0ZXJiZWQsIGV2ZW4gdGhvdWdoIGl0IGNvbnRhaW5zIGEKLSAgICAgICAgLy8gKHZhbGlkIGluIHRoaXMgY2FzZSkgZW1iZWRkZWQgKwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIioqMjEqKisxNzAwNTU1NDE0MSMiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIqKjIxKiorMTcwMDU1NTQxNDEjIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIiozMSMrNDQ3OTY2MTY0MjA4IiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiKjMxIys0NDc5NjYxNjQyMDgiKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiKjMxIys0NDc5NjYxNjQyMDgiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIqMzEjICgrNDQpIDc5IDY2MTYgNDIwOCIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiIikpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIiwxMjM0IikpOwotCi0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQobnVsbCkpOwotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzE3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIsMTIzNCIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxTk4sMTIzNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI7MTIzNCIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxTk47MTIzNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI7MTIzNCw7TiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTjsxLTIuMzQgLDtOIikpOwotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyB0aGlzIGlzIG9kZAotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIiIsICIiKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjkxMSIsICI5MTEiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiOTExIiwgIjE4MDA1NTUwOTExIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiNTU1NSIsICI1NTU1IikpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjU1NTUiLCAiMTgwMDU1NTU1NTU1IikpOwotCi0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKzE3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIisxICg3MDApLjU1NS00MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIisxICg3MDApLjU1NS00MTQxLDEyMzQiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiMTcwMDU1NTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiNzAwNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICI1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMTcwMDU1NTQxNDEiLCAiNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIwMTExNzAwNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIwMDE3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMTcwMDU1NTQxNDEiLCAiMDAxNzAwNTU1NDE0MSIpKTsKLQotCi0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKiozMSMrMTcwMDU1NTQxNDEiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMSA5OTkgNzAwNTU1NDE0MSIsICIrMSA3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMDExIDEgNzAwNTU1NDE0MSIsICI3MDA1NTU0MTQxIikpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMDExIDExIDcwMDU1NTQxNDEiLCAiKzE3MDA1NTU0MTQxIikpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjcwODU4ODIzMDAiKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMCAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAwIDIwNyA3OTIgMzQ5MCIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAxMSAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgLyoqKioqIEZJWE1FJ3MgKioqKioqLwotICAgICAgICAvLwotICAgICAgICAvLyBNTUkgaGVhZGVyIHNob3VsZCBiZSBpZ25vcmVkCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIioqMzEjMTcwMDU1NTQxNDEiKSk7Ci0KLSAgICAgICAgLy8gSXQncyB0b28gYmFkIHRoaXMgaXMgZmFsc2UKLSAgICAgICAgLy8gKzQ0ICgwKSAyMDcgNzkyIDM0OTAgaXMgbm90IGEgZGlhbGFibGUgbnVtYmVyCi0gICAgICAgIC8vIGJ1dCBpdCBpcyBjb21tb25seSBob3cgRXVyb3BlYW4gcGhvbmUgbnVtYmVycyBhcmUgd3JpdHRlbgotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiKzQ0ICgwKSAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgLy8gVGhlIGphcGFuZXNlIGludGVybmF0aW9uYWwgcHJlZml4LCBmb3IgZXhhbXBsZSwgbWVzc2VzIHVzIHVwCi0gICAgICAgIC8vIEJ1dCB3aG8gdXNlcyBhIEdTTSBwaG9uZSBpbiBKYXBhbj8KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAxMCA0NCAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgLy8gVGhlIEF1c3RyYWxpYW4gb25lIG1lc3NlcyB1cyB1cCB0b28KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAwMTEgNDQgMjA3IDc5MiAzNDkwIikpOwotCi0gICAgICAgIC8vIFRoZSBSdXNzaWFuIHRydW5rIHByZWZpeCBtZXNzZXMgdXMgdXAsIGFzIGRvZXMgY3VycmVudAotICAgICAgICAvLyBSdXNzaWFuIGFyZWEgY29kZXMgKHdoaWNoIGJlaW4gd2l0aCAwKQotCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzcoMDk1KTkxMDA3NjYiLCAiOCgwOTUpOTEwMDc2NiIpKTsKLQotICAgICAgICAvLyA0NDQgaXMgbm90IGEgdmFsaWQgY291bnRyeSBjb2RlLCBidXQKLSAgICAgICAgLy8gbWF0Y2hJbnRsUHJlZml4QW5kQ0MgZG9lc250IGtub3cgdGhpcwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0NCAyMDcgNzkyIDM0OTAiLCAiMCAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgLy8gY29tcGFyZSBTTVMgc2hvcnQgY29kZQotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiNDA0LTA0IiwgIjQwNDA0IikpOwotICAgIH0KLQotCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUb0NhbGxlcklESW5kZXhhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxNzAwNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjEtNzAwLTU1NS00MTQxIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMS03MDAtNTU1LTQxNDEsMTIzNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjEtNzAwLTU1NS00MTQxOzEyMzQiKSk7Ci0KLSAgICAgICAgLy90aGlzIHNlZW1zIHdyb25nLCBvciBhdCBsZWFzdCB1c2VsZXNzCi0gICAgICAgIGFzc2VydEVxdWFscygiTk4xNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxLTcwMC01NTUtNDFOTiIpKTsKLQotICAgICAgICAvLzxzaHJ1Zz4gLS0gdGhlc2UgYXJlIGFsbCBub3QgdXNlZnVsLCBidXQgbm90IHRlcnJpYmx5IHdyb25nCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMDMyIiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjIzMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDAzMisiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiKzIzMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIzEzMCMqIiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIiojMDMxIyIpKTsKLSAgICB9Ci0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldEluZGV4YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1MDA3MSIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMS03MDAtNTU1LTQxNDEsMTIzNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1MDA3MSIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMS03MDAtNTU1LTQxNDE7MTIzNCIpKTsKLQotICAgICAgICAvL3RoaXMgc2VlbXMgd3JvbmcsIG9yIGF0IGxlYXN0IHVzZWxlc3MKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJOTjE0NTU1MDA3MSIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMS03MDAtNTU1LTQxTk4iKSk7Ci0KLSAgICAgICAgLy88c2hydWc+IC0tIHRoZXNlIGFyZSBhbGwgbm90IHVzZWZ1bCwgYnV0IG5vdCB0ZXJyaWJseSB3cm9uZwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAwMzIiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIjIzMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDAzMisiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIisyMzAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiMxMzAjKiIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiKiMwMzEjIikpOwotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFucEZvcm1hdHRpbmcoKSB7Ci0gICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgbnVtYmVyLmFwcGVuZCgiODAwNTU1MTIxMiIpOwotICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4MDAtNTU1LTEyMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgbnVtYmVyLmNsZWFyKCk7Ci0gICAgICAgIG51bWJlci5hcHBlbmQoIjgwMDU1NTEyMSIpOwotICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4MDAtNTU1LTEyMSIsIG51bWJlci50b1N0cmluZygpKTsKLQotICAgICAgICBudW1iZXIuY2xlYXIoKTsKLSAgICAgICAgbnVtYmVyLmFwcGVuZCgiNTU1LTEyMTIiKTsKLSAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROYW5wTnVtYmVyKG51bWJlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiNTU1LTEyMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgbnVtYmVyLmNsZWFyKCk7Ci0gICAgICAgIG51bWJlci5hcHBlbmQoIjgwMC01NTUxMiIpOwotICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4MDAtNTU1LTEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIG51bWJlci5jbGVhcigpOwotICAgICAgICBudW1iZXIuYXBwZW5kKCI0NjY0NSIpOwotICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI0NjY0NSIsIG51bWJlci50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMS04MDAtNDY2NC00MTEiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIxLTgwMC1HT09HLTQxMSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxODAwNDY2NDQxMSIsCi0gICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIjE4MDBHT09HNDExIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjEtODAwLTQ2Ni00NDExIiwKLSAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygiMS04MDAtNDY2LTQ0MTEiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTgwMDQ2NjQ0MTEiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIxODAwNDY2NDQxMSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIyMjItMzMzLTQ0NC01NTUtNjY2LTc3NzctODg4LTk5OTkiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUJDLURFRi1HSEktSktMLU1OTy1QUVJTLVRVVi1XWFlaIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjIyMi0zMzMtNDQ0LTU1NS02NjYtNzc3Ny04ODgtOTk5OSIsCi0gICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYmMtZGVmLWdoaS1qa2wtbW5vLXBxcnMtdHV2LXd4eXoiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKDgwMCkgMjIyLTMzMzQiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIoODAwKSBBQkMtREVGRyIpKTsKLSAgICB9Ci0KLSAgICAvLyBUbyBydW4gdGhpcyB0ZXN0LCB0aGUgZGV2aWNlIGhhcyB0byBiZSByZWdpc3RlcmVkIHdpdGggbmV0d29yawotICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzg0NzU3OTcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrMTg0NzU3OTcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDExMTIzNDU2NyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIisxMjM0NTY3IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTIzNDU2NzAwMDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzIzNDU2NzAwMDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTExODc1NzY3ODAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzExODc1NzY3ODAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsMTg0NzUyMzE3NTMiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCsxODQ3NTIzMTc1MyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTE4NDc1Nzk3MDAwLDE4NDc1MjMxNzUzIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzg0NzU3OTcwMDAsKzE4NDc1MjMxNzUzIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDA7MDExODQ2OTMxMjM0NSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDA7Kzg0NjkzMTIzNDUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwwMTExMjM0NTY3IiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCwrMTIzNDU2NyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1OTcwMDA7MDExMTE4NzU3NjcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1OTcwMDA7KzExODc1NzY3MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsLDAxMTg0NjkzMTIzNDUiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCwrODQ2OTMxMjM0NSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwOywwMTE4NDY5MzEyMzQ1IiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMDssKzg0NjkzMTIzNDUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCw7MTg0NzUyMzE3NTMiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLDsrMTg0NzUyMzE3NTMiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMDssMDExMTE4NzU3NjcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwOywrMTE4NzU3NjcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCw7MDExMTE4NzU3NjcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLDsrMTE4NzU3NjcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwsLDAxMTExODc1NzY3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCwsLCsxMTg3NTc2NzAwMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwOywsMDExMTE4NzU3NjcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwOywsKzExODc1NzY3MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIis7LDg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrOyw4NDc1Nzk3MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCwiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3KzU3OS03MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3KzU3OS03MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiw4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiLDg0NzU3OTcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiOzs4NDc1Nzk3MDAwLCwiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI7Ozg0NzU3OTcwMDAsLCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIrdGhpcytpcyR3ZWlyZDssKyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIit0aGlzK2lzJHdlaXJkOywrIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIiIpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZShudWxsKSk7Ci0gICAgfQotCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoIjE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlAsUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIisxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9OQU5QLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX0pBUEFOKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlAsUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfVU5LTk9XTikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIisxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9KQVBBTixQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9KQVBBTikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIisxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9VTktOT1dOLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX1VOS05PV04pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCYXNpYyBjaGVja3MgZm9yIHRoZSBWb2ljZU1haWwgbnVtYmVyLgotICAgICAqLwotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aE51bWJlck5vdEVxdWFsVG9Wb2ljZU1haWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcigiOTExIikpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKCJ0ZWw6OTExIikpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKCIrMTgwMDEyMzQ1NjciKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIoIiIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcihudWxsKSk7Ci0gICAgICAgIC8vIFRoaXMgdGVzdCBmYWlscyBvbiBhIGRldmljZSB3aXRob3V0IGEgc2ltIGNhcmQKLSAgICAgICAgLypUZWxlcGhvbnlNYW5hZ2VyIG1UZWxlcGhvbnlNYW5hZ2VyID0KLSAgICAgICAgICAgIChUZWxlcGhvbnlNYW5hZ2VyKWdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVEVMRVBIT05ZX1NFUlZJQ0UpOwotICAgICAgICBTdHJpbmcgbVZvaWNlTWFpbE51bWJlciA9IG1UZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRWb2ljZU1haWxOdW1iZXIoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKG1Wb2ljZU1haWxOdW1iZXIpKTsKLSAgICAgICAgKi8KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGVhZWNkLi4wMDAwMDAwCi0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwotCi1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFBob25lTnVtYmVyV2F0Y2hlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIeXBoZW5hdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIFRleHRXYXRjaGVyIHR3ID0gbmV3IFBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyKCk7Ci0gICAgICAgIG51bWJlci5hcHBlbmQoIjU1NS0xMjEyIik7Ci0gICAgICAgIC8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgbGVmdCBlZGdlCi0gICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCAwKTsKLSAgICAgICAgdHcuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCAwLCAwLCAxKTsKLSAgICAgICAgLy8gSW5zZXJ0IGFuIDggYXQgdGhlIGJlZ2lubmluZwotICAgICAgICBudW1iZXIuaW5zZXJ0KDAsICI4Iik7Ci0gICAgICAgIHR3LmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NTUtNTEyLTEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEh5cGhlbkRlbGV0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgVGV4dFdhdGNoZXIgdHcgPSBuZXcgUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIoKTsKLSAgICAgICAgbnVtYmVyLmFwcGVuZCgiNTU1LTEyMTIiKTsKLSAgICAgICAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIGFmdGVyIHRoZSBoeXBoZW4KLSAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDQpOwotICAgICAgICAvLyBEZWxldGUgdGhlIGh5cGhlbgotICAgICAgICB0dy5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDMsIDEsIDApOwotICAgICAgICBudW1iZXIuZGVsZXRlKDMsIDQpOwotICAgICAgICB0dy5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGl0IGRlbGV0ZWQgdGhlIGNoYXJhY3RlciBiZWZvcmUgdGhlIGh5cGhlbiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI1NTEtMjEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gTWFrZSBzdXJlIGl0IGRlYWxzIHdpdGggbGVmdCBlZGdlIGJvdW5kYXJ5IGNhc2UKLSAgICAgICAgbnVtYmVyLmluc2VydCgwLCAiLSIpOwotICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgMSk7Ci0gICAgICAgIHR3LmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgMCwgMSwgMCk7Ci0gICAgICAgIG51bWJlci5kZWxldGUoMCwgMSk7Ci0gICAgICAgIHR3LmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgaXQgZGVsZXRlZCB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgaHlwaGVuIAotICAgICAgICBhc3NlcnRFcXVhbHMoIjU1MS0yMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9mcmFtZXdvcmtzL3RlbGVwaG9ueXRlc3RzL1RlbGVwaG9ueU1vY2tSaWxUZXN0UnVubmVyLmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ZyYW1ld29ya3MvdGVsZXBob255dGVzdHMvVGVsZXBob255TW9ja1JpbFRlc3RSdW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTkyZjU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9mcmFtZXdvcmtzL3RlbGVwaG9ueXRlc3RzL1RlbGVwaG9ueU1vY2tSaWxUZXN0UnVubmVyLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmZyYW1ld29ya3MudGVsZXBob255dGVzdHM7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyOworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0U3VpdGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUmlsQ2hhbm5lbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkubW9ja3JpbC5Nb2NrUmlsVGVzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK3B1YmxpYyBjbGFzcyBUZWxlcGhvbnlNb2NrUmlsVGVzdFJ1bm5lciBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgeworCisgICAgcHVibGljIFJpbENoYW5uZWwgbU1vY2tSaWxDaGFubmVsOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRlc3RTdWl0ZSBnZXRBbGxUZXN0cygpIHsKKyAgICAgICAgbG9nKCJnZXRBbGxUZXN0cyBFIik7CisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBJbnN0cnVtZW50YXRpb25UZXN0U3VpdGUodGhpcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShNb2NrUmlsVGVzdC5jbGFzcyk7CisgICAgICAgIGxvZygiZ2V0QWxsVGVzdHMgWCIpOworICAgICAgICByZXR1cm4gc3VpdGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzTG9hZGVyIGdldExvYWRlcigpIHsKKyAgICAgICAgbG9nKCJnZXRMb2FkZXIgRVgiKTsKKyAgICAgICAgcmV0dXJuIFRlbGVwaG9ueU1vY2tSaWxUZXN0UnVubmVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBsb2coIm9uQ3JlYXRlIEUiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1Nb2NrUmlsQ2hhbm5lbCA9IFJpbENoYW5uZWwubWFrZVJpbENoYW5uZWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgICBsb2coIm9uQ3JlYXRlIFgiKTsKKworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgLy8gSSd2ZSBub3Qgc2VlbiB0aGlzIGNhbGxlZAorICAgICAgICBsb2coIm9uRGVzdHJveSBFWCIpOworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgeworICAgICAgICAvLyBDYWxsZWQgd2hlbiB0aGUgaW5zdHJ1bWVudGF0aW9uIHRocmVhZCBpcyBzdGFydGVkLgorICAgICAgICAvLyBBdCB0aGUgbW9tZW50IHdlIGRvbid0IG5lZWQgdGhlIHRocmVhZCBzbyByZXR1cm4KKyAgICAgICAgLy8gd2hpY2ggd2lsbCBzaHV0IGRvd24gdGhpcyB1bnVzZWQgdGhyZWFkLgorICAgICAgICBsb2coIm9uU3RhcnQgRVgiKTsKKyAgICAgICAgc3VwZXIub25TdGFydCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbmlzaChpbnQgcmVzdWx0Q29kZSwgQnVuZGxlIHJlc3VsdHMpIHsKKyAgICAgICAgLy8gQ2FsbGVkIHdoZW4gY29tcGxldGUgc28gSSBhc2sgdGhlIG1Nb2NrUmlsQ2hhbm5lbCB0byBxdWl0LgorICAgICAgICBsb2coImZpbmlzaCBFIik7CisgICAgICAgIG1Nb2NrUmlsQ2hhbm5lbC5jbG9zZSgpOworICAgICAgICBsb2coImZpbmlzaCBYIik7CisgICAgICAgIHN1cGVyLmZpbmlzaChyZXN1bHRDb2RlLCByZXN1bHRzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBzKSB7CisgICAgICAgIExvZy5lKCJUZWxlcGhvbnlNb2NrUmlsVGVzdFJ1bm5lciIsIHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0VGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXRUZXN0LmphdmEKaW5kZXggM2E5YzUxMS4uNzAxMWFlYiAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXRUZXN0LmphdmEKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXRUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OwpAQCAtNTEsNyArNTMsNyBAQAogICAgICAgICAvLyAnQCcgbWFwcyB0byBjaGFyIDAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIEdzbUFscGhhYmV0LmNoYXJUb0dzbSgnQCcpKTsKIAotICAgICAgICAvLyBgYSAoYSB3aXRoIGdyYXZlIGFjY2VudCkgbWFwcyB0byBsYXN0IEdTTSBjaGFyYXRlcgorICAgICAgICAvLyBgYSAoYSB3aXRoIGdyYXZlIGFjY2VudCkgbWFwcyB0byBsYXN0IEdTTSBjaGFyYWN0ZXIKICAgICAgICAgYXNzZXJ0RXF1YWxzKDB4N2YsIEdzbUFscGhhYmV0LmNoYXJUb0dzbSgnXHUwMGUwJykpOwogCiAgICAgICAgIC8vCkBAIC0zMDcsNCArMzA5LDI2IEBACiAgICAgICAgIGFzc2VydEVxdWFscygiYSIsCiAgICAgICAgICAgICAgICAgR3NtQWxwaGFiZXQuZ3NtOEJpdFVucGFja2VkVG9TdHJpbmcodW5wYWNrZWQsIDEsIHVucGFja2VkLmxlbmd0aCAtIDEpKTsKICAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdzbThCaXRVcGFja2VkV2l0aEV1Y2tyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNvbWUgZmVhdHVyZSBwaG9uZXMgaW4gS29yZWEgc3RvcmUgY29udGFjdHMgYXMgZXVjLWtyLgorICAgICAgICAvLyBUZXN0IHRoaXMgc2l0dWF0aW9ucy4KKyAgICAgICAgYnl0ZSB1bnBhY2tlZFtdOworCisgICAgICAgIC8vIFRlc3QgZ2VuZXJhbCBhbHBoYWJldCBzdHJpbmdzLgorICAgICAgICB1bnBhY2tlZCA9IEljY1V0aWxzLmhleFN0cmluZ1RvQnl0ZXMoIjYxNjI2MzIwNjQ2NTY2RkYiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMgZGVmIiwKKyAgICAgICAgICAgICAgICBHc21BbHBoYWJldC5nc204Qml0VW5wYWNrZWRUb1N0cmluZyh1bnBhY2tlZCwgMCwgdW5wYWNrZWQubGVuZ3RoLCAiZXVjLWtyIikpOworCisgICAgICAgIC8vIFRlc3Qga29yZWFuIHN0cmluZ3MuCisgICAgICAgIHVucGFja2VkID0gSWNjVXRpbHMuaGV4U3RyaW5nVG9CeXRlcygiQzVEN0JEQkFDNkFFRkYiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcdUQxNENcdUMyQTRcdUQyQjgiLAorICAgICAgICAgICAgICAgIEdzbUFscGhhYmV0LmdzbThCaXRVbnBhY2tlZFRvU3RyaW5nKHVucGFja2VkLCAwLCB1bnBhY2tlZC5sZW5ndGgsICJldWMta3IiKSk7CisKKyAgICAgICAgLy8gVGVzdCBnc20gRXh0ZW50ZWQgQ2hhcmFjdGVycy4KKyAgICAgICAgdW5wYWNrZWQgPSBHc21BbHBoYWJldC5zdHJpbmdUb0dzbThCaXRQYWNrZWQoc0dzbUV4dGVuZGVkQ2hhcnMpOworICAgICAgICBhc3NlcnRFcXVhbHMoc0dzbUV4dGVuZGVkQ2hhcnMsCisgICAgICAgICAgICAgICAgR3NtQWxwaGFiZXQuZ3NtOEJpdFVucGFja2VkVG9TdHJpbmcodW5wYWNrZWQsIDAsIHVucGFja2VkLmxlbmd0aCwgImV1Yy1rciIpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21TbXNUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21TbXNUZXN0LmphdmEKaW5kZXggMzEwM2ZjMS4uMjE1YzZjZSAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtU21zVGVzdC5qYXZhCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbVNtc1Rlc3QuamF2YQpAQCAtMjQsOCArMjQsNiBAQAogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKIAotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KIHB1YmxpYyBjbGFzcyBHc21TbXNUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKIAogICAgIEBTbWFsbFRlc3QKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01jY1RhYmxlVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGVUZXN0LmphdmEKaW5kZXggMmQ2OTc3Yy4uN2ViM2RmOCAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGVUZXN0LmphdmEKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGVUZXN0LmphdmEKQEAgLTI4LDcgKzI4LDcgQEAKIAogICAgIEBTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZVpvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1jY1RhYmxlLmRlZmF1bHRUaW1lWm9uZUZvck1jYygyMDgpLCAiRXVyb3BlL1BhcmlzIik7CisgICAgICAgIGFzc2VydEVxdWFscyhNY2NUYWJsZS5kZWZhdWx0VGltZVpvbmVGb3JNY2MoMjA4KSwgIkVDVCIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoTWNjVGFibGUuZGVmYXVsdFRpbWVab25lRm9yTWNjKDIzMiksICJFdXJvcGUvVmllbm5hIik7CiAgICAgICAgIGFzc2VydEVxdWFscyhNY2NUYWJsZS5kZWZhdWx0VGltZVpvbmVGb3JNY2MoNjU1KSwgIkFmcmljYS9Kb2hhbm5lc2J1cmciKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKE1jY1RhYmxlLmRlZmF1bHRUaW1lWm9uZUZvck1jYyg0NDApLCAiQXNpYS9Ub2t5byIpOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhNmY1MwotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEKQEAgLTAsMCArMSw1MzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKKworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlclV0aWxzOworCitwdWJsaWMgY2xhc3MgUGhvbmVOdW1iZXJVdGlsc1Rlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRyYWN0TmV0d29ya1BvcnRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIrMTcwMDU1NTQxNDEiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIrMTcwMDU1NTQxNDEiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKzE3MDA1NTU0MTQxIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxNDEiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiMTcwMDU1NTQxNDEiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MTQxIikKKyAgICAgICAgKTsKKworICAgICAgICAvLyBUaGlzIG1heSBzZWVtIHdyb25nLCBidXQgaXQncyBwcm9iYWJseSBvaworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MTQxKiMiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MTQxKiMiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MU5OIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDFOTiwxMjM0IikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDFOTjsxMjM0IikKKyAgICAgICAgKTsKKworICAgICAgICAvLyBBbiBNTUkgc3RyaW5nIGlzIHVucGVydGVyYmVkLCBldmVuIHRob3VnaCBpdCBjb250YWlucyBhCisgICAgICAgIC8vICh2YWxpZCBpbiB0aGlzIGNhc2UpIGVtYmVkZGVkICsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIqKjIxKioxNzAwNTU1NDE0MSMiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIqKjIxKiorMTcwMDU1NTQxNDEjIikKKyAgICAgICAgICAgICAgICAvL1RPRE8gdGhpcyBpcyB0aGUgY29ycmVjdCByZXN1bHQsIGFsdGhvdWdoIHRoZSBhYm92ZQorICAgICAgICAgICAgICAgIC8vcmVzdWx0IGhhcyBiZWVuIHJldHVybmVkIHNpbmNlIGNoYW5nZSAzMTc3NgorICAgICAgICAgICAgICAgIC8vIioqMjEqKisxNzAwNTU1NDE0MSMiCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiIikpOworCisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIiwxMjM0IikpOworCisgICAgICAgIGJ5dGUgW10gYiA9IG5ldyBieXRlWzIwXTsKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE3MDA1NTUwMDIwIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgwOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE3MDA1NTUwMDIwIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDkwOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIisxNzAwNTU1MDAyMCIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKKyAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhGMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTcwMDU1NTAwMjAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYnl0ZVtdIGJSZXQgPSBQaG9uZU51bWJlclV0aWxzLm5ldHdvcmtQb3J0aW9uVG9DYWxsZWRQYXJ0eUJDRCgiKzE3MDA1NTUwMDIwIik7CisgICAgICAgIGFzc2VydEVxdWFscyg3LCBiUmV0Lmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNzsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYltpXSwgYlJldFtpXSk7CisgICAgICAgIH0KKworICAgICAgICBiUmV0ID0gUGhvbmVOdW1iZXJVdGlscy5uZXR3b3JrUG9ydGlvblRvQ2FsbGVkUGFydHlCQ0RXaXRoTGVuZ3RoKCIrMTcwMDU1NTAwMjAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDgsIGJSZXQubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGJSZXRbMF0sIDcpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJbaSAtIDFdLCBiUmV0W2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGJSZXQgPSBQaG9uZU51bWJlclV0aWxzLm5ldHdvcmtQb3J0aW9uVG9DYWxsZWRQYXJ0eUJDRCgiNzAwNTU1MDAyMCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjcwMDU1NTAwMjAiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGJSZXQsIDAsIGJSZXQubGVuZ3RoKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEIwOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE3MDA1NTUwMDIwIyIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKKyAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhCMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTcwMDU1NTAwMjAjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhCMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAzKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4MkI7IGJbMl0gPSAoYnl0ZSkgMHhCMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIjMjEjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAzKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhCMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEjKyIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMykpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHhGQjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxIyIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNCkpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHhGQjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxIysiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDQpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHg5QTsgYlsyXSA9IChieXRlKSAweEE5OyBiWzNdID0gKGJ5dGUpIDB4NzE7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwMDsgYls1XSA9IChieXRlKSAweDU1OyBiWzZdID0gKGJ5dGUpIDB4MDU7IGJbN10gPSAoYnl0ZSkgMHgyMDsKKyAgICAgICAgYls4XSA9IChieXRlKSAweEIwOworICAgICAgICBhc3NlcnRFcXVhbHMoIio5OSoxNzAwNTU1MDAyMCMiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDkpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHg5QTsgYlsyXSA9IChieXRlKSAweEE5OyBiWzNdID0gKGJ5dGUpIDB4NzE7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwMDsgYls1XSA9IChieXRlKSAweDU1OyBiWzZdID0gKGJ5dGUpIDB4MDU7IGJbN10gPSAoYnl0ZSkgMHgyMDsKKyAgICAgICAgYls4XSA9IChieXRlKSAweEIwOworICAgICAgICBhc3NlcnRFcXVhbHMoIio5OSorMTcwMDU1NTAwMjAjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA5KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4QUE7IGJbMl0gPSAoYnl0ZSkgMHgxMjsgYlszXSA9IChieXRlKSAweDFBOworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDc7IGJbNV0gPSAoYnl0ZSkgMHg1MDsgYls2XSA9IChieXRlKSAweDU1OyBiWzddID0gKGJ5dGUpIDB4MDA7CisgICAgICAgIGJbOF0gPSAoYnl0ZSkgMHgwMjsgYls5XSA9IChieXRlKSAweEZCOworICAgICAgICBhc3NlcnRFcXVhbHMoIioqMjEqMTcwMDU1NTAwMjAjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAxMCkpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHgxQTsKKyAgICAgICAgYls0XSA9IChieXRlKSAweDA3OyBiWzVdID0gKGJ5dGUpIDB4NTA7IGJbNl0gPSAoYnl0ZSkgMHg1NTsgYls3XSA9IChieXRlKSAweDAwOworICAgICAgICBiWzhdID0gKGJ5dGUpIDB4MDI7IGJbOV0gPSAoYnl0ZSkgMHhGQjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxKisxNzAwNTU1MDAyMCMiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDEwKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhBMTsgYlszXSA9IChieXRlKSAweDcxOworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDA7IGJbNV0gPSAoYnl0ZSkgMHg1NTsgYls2XSA9IChieXRlKSAweDA1OyBiWzddID0gKGJ5dGUpIDB4MjA7CisgICAgICAgIGJbOF0gPSAoYnl0ZSkgMHhGMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEqMTcwMDU1NTAwMjAiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDkpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHgyQTsgYlsyXSA9IChieXRlKSAweEIxOyBiWzNdID0gKGJ5dGUpIDB4NzE7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwMDsgYls1XSA9IChieXRlKSAweDU1OyBiWzZdID0gKGJ5dGUpIDB4MDU7IGJbN10gPSAoYnl0ZSkgMHgyMDsKKyAgICAgICAgYls4XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIioyMSMrMTcwMDU1NTAwMjAiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDkpKTsKKworICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKG51bGwpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24obnVsbCkpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZShudWxsLCBudWxsKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZShudWxsLCAiMTIzIikpOworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjEyMyIsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaChudWxsKSk7CisgICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKG51bGwpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLnN0cmluZ0Zyb21TdHJpbmdBbmRUT0EobnVsbCwgMSkpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKzE3MDA1NTU0MTQxIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiKzE3MDA1NTU0MTQxIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIisxNzAwNTU1NDE0MSIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIisxICg3MDApLjU1NS00MTQxIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MTQxIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDE0MSIpCisgICAgICAgICk7CisKKyAgICAgICAgLy8gVGhpcyBtYXkgc2VlbSB3cm9uZywgYnV0IGl0J3MgcHJvYmFibHkgb2sKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIxNzAwNTU1NDE0MSojIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDE0MSojIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDFOTiIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxTk4sMTIzNCIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxTk47MTIzNCIpCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQW4gTU1JIHN0cmluZyBpcyB1bnBlcnRlcmJlZCwgZXZlbiB0aG91Z2ggaXQgY29udGFpbnMgYQorICAgICAgICAvLyAodmFsaWQgaW4gdGhpcyBjYXNlKSBlbWJlZGRlZCArCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKioyMSoqKzE3MDA1NTU0MTQxIyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIioqMjEqKisxNzAwNTU1NDE0MSMiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKjMxIys0NDc5NjYxNjQyMDgiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIqMzEjKzQ0Nzk2NjE2NDIwOCIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIqMzEjKzQ0Nzk2NjE2NDIwOCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIiozMSMgKCs0NCkgNzkgNjYxNiA0MjA4IikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiLDEyMzQiKSk7CisKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdChudWxsKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMTcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxICg3MDApLjU1NS00MU5OIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiwxMjM0IiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTiwxMjM0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjsxMjM0IiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTjsxMjM0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjsxMjM0LDtOIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxICg3MDApLjU1NS00MU5OOzEtMi4zNCAsO04iKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRoaXMgaXMgb2RkCisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiIiwgIiIpKTsKKworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiOTExIiwgIjkxMSIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI5MTEiLCAiMTgwMDU1NTA5MTEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI1NTU1IiwgIjU1NTUiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiNTU1NSIsICIxODAwNTU1NTU1NTUiKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIrMTcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKzEgKDcwMCkuNTU1LTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKzEgKDcwMCkuNTU1LTQxNDEsMTIzNCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIxNzAwNTU1NDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICI3MDA1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIxNzAwNTU1NDE0MSIsICI1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjAxMTE3MDA1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjAwMTcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIxNzAwNTU1NDE0MSIsICIwMDE3MDA1NTU0MTQxIikpOworCisKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIqKjMxIysxNzAwNTU1NDE0MSIpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxIDk5OSA3MDA1NTU0MTQxIiwgIisxIDcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIwMTEgMSA3MDA1NTU0MTQxIiwgIjcwMDU1NTQxNDEiKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIwMTEgMTEgNzAwNTU1NDE0MSIsICIrMTcwMDU1NTQxNDEiKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiNzA4NTg4MjMwMCIpKTsKKworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIwIDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDAgMjA3IDc5MiAzNDkwIikpOworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDExIDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvKioqKiogRklYTUUncyAqKioqKiovCisgICAgICAgIC8vCisgICAgICAgIC8vIE1NSSBoZWFkZXIgc2hvdWxkIGJlIGlnbm9yZWQKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKiozMSMxNzAwNTU1NDE0MSIpKTsKKworICAgICAgICAvLyBJdCdzIHRvbyBiYWQgdGhpcyBpcyBmYWxzZQorICAgICAgICAvLyArNDQgKDApIDIwNyA3OTIgMzQ5MCBpcyBub3QgYSBkaWFsYWJsZSBudW1iZXIKKyAgICAgICAgLy8gYnV0IGl0IGlzIGNvbW1vbmx5IGhvdyBFdXJvcGVhbiBwaG9uZSBudW1iZXJzIGFyZSB3cml0dGVuCisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIrNDQgKDApIDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvLyBUaGUgamFwYW5lc2UgaW50ZXJuYXRpb25hbCBwcmVmaXgsIGZvciBleGFtcGxlLCBtZXNzZXMgdXMgdXAKKyAgICAgICAgLy8gQnV0IHdobyB1c2VzIGEgR1NNIHBob25lIGluIEphcGFuPworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDEwIDQ0IDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvLyBUaGUgQXVzdHJhbGlhbiBvbmUgbWVzc2VzIHVzIHVwIHRvbworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDAxMSA0NCAyMDcgNzkyIDM0OTAiKSk7CisKKyAgICAgICAgLy8gVGhlIFJ1c3NpYW4gdHJ1bmsgcHJlZml4IG1lc3NlcyB1cyB1cCwgYXMgZG9lcyBjdXJyZW50CisgICAgICAgIC8vIFJ1c3NpYW4gYXJlYSBjb2RlcyAod2hpY2ggYmVpbiB3aXRoIDApCisKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNygwOTUpOTEwMDc2NiIsICI4KDA5NSk5MTAwNzY2IikpOworCisgICAgICAgIC8vIDQ0NCBpcyBub3QgYSB2YWxpZCBjb3VudHJ5IGNvZGUsIGJ1dAorICAgICAgICAvLyBtYXRjaEludGxQcmVmaXhBbmRDQyBkb2VzbnQga25vdyB0aGlzCisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQ0IDIwNyA3OTIgMzQ5MCIsICIwIDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvLyBjb21wYXJlIFNNUyBzaG9ydCBjb2RlCisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI0MDQtMDQiLCAiNDA0MDQiKSk7CisgICAgfQorCisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRvQ2FsbGVySURJbmRleGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjE3MDA1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMS03MDAtNTU1LTQxNDEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxLTcwMC01NTUtNDE0MSwxMjM0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMS03MDAtNTU1LTQxNDE7MTIzNCIpKTsKKworICAgICAgICAvL3RoaXMgc2VlbXMgd3JvbmcsIG9yIGF0IGxlYXN0IHVzZWxlc3MKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOTjE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjEtNzAwLTU1NS00MU5OIikpOworCisgICAgICAgIC8vPHNocnVnPiAtLSB0aGVzZSBhcmUgYWxsIG5vdCB1c2VmdWwsIGJ1dCBub3QgdGVycmlibHkgd3JvbmcKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAwMzIiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMjMwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMDMyKyIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIrMjMwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIjMTMwIyoiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiKiMwMzEjIikpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5kZXhhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NTAwNzEiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIjEtNzAwLTU1NS00MTQxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDE0MSwxMjM0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDE0MTsxMjM0IikpOworCisgICAgICAgIC8vdGhpcyBzZWVtcyB3cm9uZywgb3IgYXQgbGVhc3QgdXNlbGVzcworICAgICAgICBhc3NlcnRFcXVhbHMoIk5OMTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDFOTiIpKTsKKworICAgICAgICAvLzxzaHJ1Zz4gLS0gdGhlc2UgYXJlIGFsbCBub3QgdXNlZnVsLCBidXQgbm90IHRlcnJpYmx5IHdyb25nCisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDAzMiIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMjMwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMDMyKyIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiKzIzMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIzEzMCMqIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIqIzAzMSMiKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYW5wRm9ybWF0dGluZygpIHsKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcigpOworICAgICAgICBudW1iZXIuYXBwZW5kKCI4MDA1NTUxMjEyIik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjgwMC01NTUtMTIxMiIsIG51bWJlci50b1N0cmluZygpKTsKKworICAgICAgICBudW1iZXIuY2xlYXIoKTsKKyAgICAgICAgbnVtYmVyLmFwcGVuZCgiODAwNTU1MTIxIik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjgwMC01NTUtMTIxIiwgbnVtYmVyLnRvU3RyaW5nKCkpOworCisgICAgICAgIG51bWJlci5jbGVhcigpOworICAgICAgICBudW1iZXIuYXBwZW5kKCI1NTUtMTIxMiIpOworICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI1NTUtMTIxMiIsIG51bWJlci50b1N0cmluZygpKTsKKworICAgICAgICBudW1iZXIuY2xlYXIoKTsKKyAgICAgICAgbnVtYmVyLmFwcGVuZCgiODAwLTU1NTEyIik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjgwMC01NTUtMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7CisKKyAgICAgICAgbnVtYmVyLmNsZWFyKCk7CisgICAgICAgIG51bWJlci5hcHBlbmQoIjQ2NjQ1Iik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjQ2NjQ1IiwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLTgwMC00NjY0LTQxMSIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIjEtODAwLUdPT0ctNDExIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE4MDA0NjY0NDExIiwKKyAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygiMTgwMEdPT0c0MTEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMS04MDAtNDY2LTQ0MTEiLAorICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIxLTgwMC00NjYtNDQxMSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxODAwNDY2NDQxMSIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIjE4MDA0NjY0NDExIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIyMi0zMzMtNDQ0LTU1NS02NjYtNzc3Ny04ODgtOTk5OSIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBQkMtREVGLUdISS1KS0wtTU5PLVBRUlMtVFVWLVdYWVoiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMjIyLTMzMy00NDQtNTU1LTY2Ni03Nzc3LTg4OC05OTk5IiwKKyAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFiYy1kZWYtZ2hpLWprbC1tbm8tcHFycy10dXYtd3h5eiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIoODAwKSAyMjItMzMzNCIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIig4MDApIEFCQy1ERUZHIikpOworICAgIH0KKworICAgIC8vIFRvIHJ1biB0aGlzIHRlc3QsIHRoZSBkZXZpY2UgaGFzIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBuZXR3b3JrCisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrODQ3NTc5NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIisxODQ3NTc5NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTExMjM0NTY3IiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzEyMzQ1NjciKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDExMjM0NTY3MDAwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrMjM0NTY3MDAwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDExMTE4NzU3Njc4MDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrMTE4NzU3Njc4MDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwxODQ3NTIzMTc1MyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsKzE4NDc1MjMxNzUzIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTg0NzU3OTcwMDAsMTg0NzUyMzE3NTMiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrODQ3NTc5NzAwMCwrMTg0NzUyMzE3NTMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMDswMTE4NDY5MzEyMzQ1IiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMDsrODQ2OTMxMjM0NSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLDAxMTEyMzQ1NjciLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCsxMjM0NTY3IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU5NzAwMDswMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU5NzAwMDsrMTE4NzU3NjcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwsMDExODQ2OTMxMjM0NSIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsLCs4NDY5MzEyMzQ1IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDA7LDAxMTg0NjkzMTIzNDUiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwOywrODQ2OTMxMjM0NSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLDsxODQ3NTIzMTc1MyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsOysxODQ3NTIzMTc1MyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwOywwMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDA7LCsxMTg3NTc2NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLDswMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsOysxMTg3NTc2NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLCwsMDExMTE4NzU3NjcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCwsKzExODc1NzY3MDAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDA7LCwwMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDA7LCwrMTE4NzU3NjcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzssODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIis7LDg0NzU3OTcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDcrNTc5LTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDcrNTc5LTcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiLDg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIsODQ3NTc5NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI7Ozg0NzU3OTcwMDAsLCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjs7ODQ3NTc5NzAwMCwsIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIit0aGlzK2lzJHdlaXJkOywrIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiK3RoaXMraXMkd2VpcmQ7LCsiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiIikpOworICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKG51bGwpKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoIisxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUCxQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9OQU5QKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlAsUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfSkFQQU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoIisxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUCxQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9VTktOT1dOKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX0pBUEFOLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX0pBUEFOKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX1VOS05PV04sUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfVU5LTk9XTikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJhc2ljIGNoZWNrcyBmb3IgdGhlIFZvaWNlTWFpbCBudW1iZXIuCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoTnVtYmVyTm90RXF1YWxUb1ZvaWNlTWFpbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKCI5MTEiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIoInRlbDo5MTEiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIoIisxODAwMTIzNDU2NyIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcigiIikpOworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKG51bGwpKTsKKyAgICAgICAgLy8gVGhpcyB0ZXN0IGZhaWxzIG9uIGEgZGV2aWNlIHdpdGhvdXQgYSBzaW0gY2FyZAorICAgICAgICAvKlRlbGVwaG9ueU1hbmFnZXIgbVRlbGVwaG9ueU1hbmFnZXIgPQorICAgICAgICAgICAgKFRlbGVwaG9ueU1hbmFnZXIpZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5URUxFUEhPTllfU0VSVklDRSk7CisgICAgICAgIFN0cmluZyBtVm9pY2VNYWlsTnVtYmVyID0gbVRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldFZvaWNlTWFpbE51bWJlcigpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIobVZvaWNlTWFpbE51bWJlcikpOworICAgICAgICAqLworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0TnVtYmVyVG9FMTY0KCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIisxNjUwMjkxMDAwMCIsIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyVG9FMTY0KCI2NTAgMjkxMDAwMCIsICJ1cyIpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlclRvRTE2NCgiMTIzNDU2NyIsICJ1cyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTgwMDQ2NjQxMTQiLCBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlclRvRTE2NCgiODAwLUdPT0ctMTE0IiwgInVzIikpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0TnVtYmVyKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIig2NTApIDI5MS0wMDAwIiwgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoIjY1MCAyOTEwMDAwIiwgInVzIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEyMy00NTY3IiwgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoIjEyMzQ1NjciLCAidXMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKDgwMCkgNDY2LTQxMTQiLCBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcigiODAwLUdPT0ctMTE0IiwgInVzIikpOworCisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVOdW1iZXIoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiNjUwMjkxMDAwMCIsIFBob25lTnVtYmVyVXRpbHMubm9ybWFsaXplTnVtYmVyKCI2NTAgMjkxMDAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMjM0NTY3IiwgUGhvbmVOdW1iZXJVdGlscy5ub3JtYWxpemVOdW1iZXIoIjEyLDMjNCo1NjciKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODAwNDY2NDExNCIsIFBob25lTnVtYmVyVXRpbHMubm9ybWFsaXplTnVtYmVyKCI4MDAtR09PRy0xMTQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE2NTAyOTEwMDAwIiwgUGhvbmVOdW1iZXJVdGlscy5ub3JtYWxpemVOdW1iZXIoIisxIDY1MCAyOTEwMDAwIikpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0RGFpbGFiZU51bWJlcigpIHsKKyAgICAgICAgLy8gVXNpbmcgdGhlIHBob25lTnVtYmVyRTE2NCdzIGNvdW50cnkgY29kZQorICAgICAgICBhc3NlcnRFcXVhbHMoIig2NTApIDI5MS0wMDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcigiNjUwMjkxMDAwMCIsICIrMTY1MDI5MTAwMDAiLCAiQ04iKSk7CisgICAgICAgIC8vIFRoZSBwaG9uZU51bWJlckUxNjQgaXMgbnVsbAorICAgICAgICBhc3NlcnRFcXVhbHMoIig2NTApIDI5MS0wMDAwIiwgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoIjY1MDI5MTAwMDAiLCBudWxsLCAiVVMiKSk7CisgICAgICAgIC8vIFRoZSBnaXZlbiBudW1iZXIgaGFzIGEgY291bnRyeSBjb2RlLgorICAgICAgICBhc3NlcnRFcXVhbHMoIisxIDY1MC0yOTEtMDAwMCIsIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyKCIrMTY1MDI5MTAwMDAiLCBudWxsLCAiQ04iKSk7CisgICAgICAgIC8vIFRoZSBnaXZlbiBudW1iZXIgd2FzIGZvcm1hdHRlZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI2NTAtMjkxLTAwMDAiLCBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcigiNjUwLTI5MS0wMDAwIiwgbnVsbCwgIlVTIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmU1NzNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OworCitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXI7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFdhdGNoZXI7CisKK3B1YmxpYyBjbGFzcyBQaG9uZU51bWJlcldhdGNoZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kQ2hhcnMoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBtdWx0aUNoYXJzID0gIjY1MDEyMzQ1IjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1hdHRlZDEgPSAiKDY1MCkgMTIzLTQ1IjsKKyAgICAgICAgVGV4dFdhdGNoZXIgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIC8vIEFwcGVuZCBtb3JlIHRoYW4gb25lIGNoYXJzCisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgMCwgMCwgbXVsdGlDaGFycy5sZW5ndGgoKSk7CisgICAgICAgIG51bWJlci5hcHBlbmQobXVsdGlDaGFycyk7CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIubGVuZ3RoKCkpOworICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgMCwgMCwgbnVtYmVyLmxlbmd0aCgpKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0dGVkMSwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0dGVkMS5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKyAgICAgICAgLy8gQXBwZW5kIG9uZSBjaGFycworICAgICAgICBmaW5hbCBjaGFyIGFwcGVuZENoYXIgPSAnNic7CisgICAgICAgIGZpbmFsIFN0cmluZyBmb3JtYXR0ZWQyID0gIig2NTApIDEyMy00NTYiOworICAgICAgICBpbnQgbGVuID0gbnVtYmVyLmxlbmd0aCgpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIG51bWJlci5sZW5ndGgoKSwgMCwgMSk7CisgICAgICAgIG51bWJlci5hcHBlbmQoYXBwZW5kQ2hhcik7CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIubGVuZ3RoKCkpOworICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgbGVuLCAwLCAxKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0dGVkMiwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0dGVkMi5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTGFzdENoYXJzKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgaW5pdCA9ICI2NTAxMjM0NTY3OCI7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQxID0gIig2NTApIDEyMy00NTY3IjsKKyAgICAgICAgVGV4dFdhdGNoZXIgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworICAgICAgICAvLyBSZW1vdmUgdGhlIGxhc3QgY2hhci4KKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgaW50IGxlbiA9IG51bWJlci5sZW5ndGgoKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCBsZW4gLSAxLCAxLCAwKTsKKyAgICAgICAgbnVtYmVyLmRlbGV0ZShsZW4gLSAxLCBsZW4pOworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpKTsKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIG51bWJlci5sZW5ndGgoKSAtIDEsIDEsIDApOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQxLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgICAgICAvLyBSZW1vdmUgbGFzdCA1IGNoYXJzCisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQyID0gIig2NTApIDEyMyI7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpIC0gNCwgNCwgMCk7CisgICAgICAgIG51bWJlci5kZWxldGUobnVtYmVyLmxlbmd0aCgpIC0gNSwgbnVtYmVyLmxlbmd0aCgpKTsKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCBudW1iZXIubGVuZ3RoKCksIDQsIDApOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQyLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQyLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnNlcnRDaGFycygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGluaXQgPSAiKDY1MCkgMjMiOworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQxID0gIig2NTApIDEyMyI7CisgICAgICAgIFRleHRXYXRjaGVyIHRleHRXYXRjaGVyID0gZ2V0VGV4dFdhdGNoZXIoKTsKKworICAgICAgICAvLyBJbnNlcnQgb25lIGNoYXIKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA0LCAwLCAxKTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg0LCAiMSIpOyAvLyAoNjUwMSkgMjMKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDUpOyAvLyBtYWtlIHRoZSBjdXJzb3IgYXQgcmlnaHQgb2YgMQorICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgNCwgMCwgMSk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMSwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICAvLyB0aGUgY3Vyc29yIHNob3VsZCBzdGlsbCBhdCB0aGUgcmlnaHQgb2YgJzEnCisgICAgICAgIGFzc2VydEVxdWFscyg3LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworCisgICAgICAgIC8vIEluc2VydCBtdWx0aXBsZSBjaGFycworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQyID0gIig2NTApIDE0NS02NzIzIjsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA3LCAwLCA0KTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg3LCAiNDU2NyIpOyAvLyBjaGFuZ2UgdG8gKDY1MCkgMTQ1NjcyMworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgMTEpOyAvLyB0aGUgY3Vyc29yIGlzIGF0IHRoZSByaWdodCBvZiAnNycuCisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA3LCAwLCA0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQyLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIGJlIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnNycKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEyLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9wRm9ybWF0dGluZygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGluaXQgPSAiKDY1MCkgMTIzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMSA9ICIoNjUwKSAxMjMgNCI7CisgICAgICAgIFRleHRXYXRjaGVyIHRleHRXYXRjaGVyID0gZ2V0VGV4dFdhdGNoZXIoKTsKKworICAgICAgICAvLyBBcHBlbmQgc3BhY2UKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA5LCAwLCAyKTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg5LCAiIDQiKTsgLy8gKDY1MDEpIDIzIDQKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiA0CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA5LCAwLCAyKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnMScKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMS5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKworICAgICAgICAvLyBEZWxldGUgYSAnKScKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMiA9Iig2NTAgMTIzIjsKKyAgICAgICAgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworICAgICAgICBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA0LCAxLCAwKTsKKyAgICAgICAgbnVtYmVyLmRlbGV0ZSg0LCA1KTsgLy8gKDY1MDEgMjMgNAorICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgNSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiAxCisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA0LCAxLCAwKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQyLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnMScKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisKKyAgICAgICAgLy8gSW5zZXJ0IGEgaHlwaGVuCisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZDMgPSIoNjUwKSAxMi0zIjsKKyAgICAgICAgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworICAgICAgICBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA4LCAwLCAxKTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg4LCAiLSIpOyAvLyAoNjUwKSAxMi0zCisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCA5KTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIC0KKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDgsIDAsIDEpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDMsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICctJworICAgICAgICBhc3NlcnRFcXVhbHMoOSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdGFydEZvcm1hdHRpbmcoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBpbml0ID0gIig2NTApIDEyMyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZDEgPSAiKDY1MCkgMTIzIDQiOworICAgICAgICBUZXh0V2F0Y2hlciB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisKKyAgICAgICAgLy8gQXBwZW5kIHNwYWNlCisgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoaW5pdCk7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgOSwgMCwgMik7CisgICAgICAgIG51bWJlci5pbnNlcnQoOSwgIiA0Iik7IC8vICg2NTApIDEyMyA0CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIubGVuZ3RoKCkpOyAvLyBtYWtlIHRoZSBjdXJzb3IgYXQgcmlnaHQgb2YgNAorICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgOSwgMCwgMik7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMSwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICAvLyB0aGUgY3Vyc29yIHNob3VsZCBzdGlsbCBhdCB0aGUgcmlnaHQgb2YgJzQnCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDEubGVuZ3RoKCksIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisKKyAgICAgICAgLy8gQ2xlYXIgdGhlIGN1cnJlbnQgc3RyaW5nLCBhbmQgc3RhcnQgZm9ybWF0dGluZyBhZ2Fpbi4KKyAgICAgICAgaW50IGxlbiA9IG51bWJlci5sZW5ndGgoKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCAwLCBsZW4sIDApOworICAgICAgICBudW1iZXIuZGVsZXRlKDAsIGxlbik7CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCAwLCBsZW4sIDApOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMiA9ICIoNjUwKSAxMjMtNCI7CisgICAgICAgIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDksIDAsIDEpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDksICI0Iik7IC8vICg2NTApIDEyMzQKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiA0CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA5LCAwLCAxKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQyLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnNCcKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMi5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dENoYW5nZWRCeU90aGVyVGV4dFdhdGNoZXIoKSB7CisgICAgICAgIGZpbmFsIFRleHRXYXRjaGVyIGNsZWFudXBUZXh0V2F0Y2hlciA9IG5ldyBUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgICAgICAgICAgICAgIHMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICBpbnQgYWZ0ZXIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgYmVmb3JlLAorICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGluaXQgPSAiKDY1MCkgMTIzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMSA9ICIiOworICAgICAgICBUZXh0V2F0Y2hlciB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA1LCAwLCAxKTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg1LCAiNCIpOyAvLyAoNjUwNCkgMTIzCisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCA1KTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIDQKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDUsIDAsIDEpOworICAgICAgICBudW1iZXIuc2V0U3BhbihjbGVhbnVwVGV4dFdhdGNoZXIsIDAsIG51bWJlci5sZW5ndGgoKSwgMCk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMSwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHByaXZhdGUgVGV4dFdhdGNoZXIgZ2V0VGV4dFdhdGNoZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIoIlVTIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU2ltVXRpbHNUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1VdGlsc1Rlc3QuamF2YQppbmRleCBkYjM4ZWRlLi5lZjYyZDg1IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1VdGlsc1Rlc3QuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1VdGlsc1Rlc3QuamF2YQpAQCAtMjgsNyArMjgsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpYygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBieXRlW10gZGF0YSwgZGF0YTI7CiAKLSAgICAgICAgLyogCisgICAgICAgIC8qCiAgICAgICAgICAqIGJjZFRvU3RyaW5nKCkKICAgICAgICAgICovCiAKQEAgLTQwLDkgKzQwLDEzIEBACiAgICAgICAgIGFzc2VydEVxdWFscygiMDEyNjA0NTAwMTQ0ODQ4NiIsIEljY1V0aWxzLmJjZFRvU3RyaW5nKGRhdGEsIDEsIGRhdGEubGVuZ3RoIC0gMikpOwogCiAgICAgICAgIC8vIFN0b3BzIG9uIGludmFsaWQgQkNEIHZhbHVlCi0gICAgICAgIGRhdGEgPSBJY2NVdGlscy5oZXhTdHJpbmdUb0J5dGVzKCI5OEYwNjI0MDA1MTA0NDQ4NjhmMiIpOworICAgICAgICBkYXRhID0gSWNjVXRpbHMuaGV4U3RyaW5nVG9CeXRlcygiOThFMDYyNDAwNTEwNDQ0ODY4ZjIiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCI4OTAiLCBJY2NVdGlscy5iY2RUb1N0cmluZyhkYXRhLCAwLCBkYXRhLmxlbmd0aCkpOwogCisgICAgICAgIC8vIHNraXAgdGhlIGhpZ2ggbmliYmxlICdGJyBzaW5jZSBzb21lIFBMTU5zIGhhdmUgaXQKKyAgICAgICAgZGF0YSA9IEljY1V0aWxzLmhleFN0cmluZ1RvQnl0ZXMoIjk4RjA2MjQwMDUxMDQ0NDg2OGYyIik7CisgICAgICAgIGFzc2VydEVxdWFscygiODkwMjYwNDUwMDE0NDg0ODYyIiwgSWNjVXRpbHMuYmNkVG9TdHJpbmcoZGF0YSwgMCwgZGF0YS5sZW5ndGgpKTsKKwogICAgICAgICAvKgogICAgICAgICAgKiBnc21CY2RCeXRlVG9JbnQoKQogICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Rlc3RQaG9uZU5vdGlmaWVyLmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZXN0UGhvbmVOb3RpZmllci5qYXZhCmluZGV4IDQyNzc5NWIuLjhjYjA1Y2MgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Rlc3RQaG9uZU5vdGlmaWVyLmphdmEKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVzdFBob25lTm90aWZpZXIuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZTsKKwogLyoqCiAgKiBTdHViIGNsYXNzIHVzZWQgZm9yIHVuaXQgdGVzdHMKICAqLwpAQCAtMzIsNyArMzQsNyBAQAogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2VsbExvY2F0aW9uKFBob25lIHNlbmRlcikgewogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIG5vdGlmeVNpZ25hbFN0cmVuZ3RoKFBob25lIHNlbmRlcikgewogICAgIH0KIApAQCAtNDIsMTAgKzQ0LDE0IEBACiAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2FsbEZvcndhcmRpbmdDaGFuZ2VkKFBob25lIHNlbmRlcikgewogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbikgeworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24pIHsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlLAorICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgewogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFBY3Rpdml0eShQaG9uZSBzZW5kZXIpIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZVRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZVRlc3QuamF2YQppbmRleCBiOTY3NDNhLi40ODU1NDJiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmVUZXN0LmphdmEKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lVGVzdC5qYXZhCkBAIC0xOCwyNyArMTgsMjEgQEAKIAogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5QZXJmb3JtYW5jZVRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbFN0YXRlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5NbWlDb2RlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVzdFBob25lTm90aWZpZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5DYWxsRmFpbENhdXNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01UZXN0SGFuZGxlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdzbU1taUNvZGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TdXBwU2VydmljZU5vdGlmaWNhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRDb21tYW5kczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRSYWRpb0NvbnRyb2w7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L21vY2tyaWwvTW9ja1JpbFRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L21vY2tyaWwvTW9ja1JpbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGQ1YjMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvbW9ja3JpbC9Nb2NrUmlsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkubW9ja3JpbDsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuY29tbXVuaWNhdGlvbi5Nc2dIZWFkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuY29tbXVuaWNhdGlvbi5Nc2c7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlJpbENoYW5uZWw7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDdHJsQ21kczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHM7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5mcmFtZXdvcmtzLnRlbGVwaG9ueXRlc3RzLlRlbGVwaG9ueU1vY2tSaWxUZXN0UnVubmVyOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uSW52YWxpZFByb3RvY29sQnVmZmVyTWljcm9FeGNlcHRpb247CisKKy8vIFRlc3Qgc3VpdGUgZm9yIHRlc3QgcmlsCitwdWJsaWMgY2xhc3MgTW9ja1JpbFRlc3QgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNb2NrUmlsVGVzdCI7CisKKyAgICBSaWxDaGFubmVsIG1Nb2NrUmlsQ2hhbm5lbDsKKyAgICBUZWxlcGhvbnlNb2NrUmlsVGVzdFJ1bm5lciBtUnVubmVyOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbVJ1bm5lciA9IChUZWxlcGhvbnlNb2NrUmlsVGVzdFJ1bm5lcilnZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgbU1vY2tSaWxDaGFubmVsID0gbVJ1bm5lci5tTW9ja1JpbENoYW5uZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIHMpIHsKKyAgICAgICAgTG9nLnYoVEFHLCBzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHByb3RvYnVmIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbgorICAgICAqIEB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyTWljcm9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdG9idWZTZXJEZXMoKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyTWljcm9FeGNlcHRpb24geworICAgICAgICBsb2coInRlc3RQcm90b2J1ZlNlcmRlcyBFIik7CisKKyAgICAgICAgUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUgcnMgPSBuZXcgUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBycy5zdGF0ZSA9PSAwIHdhcyAlZCIsIHJzLmdldFN0YXRlKCkpLAorICAgICAgICAgICAgICAgIHJzLmdldFN0YXRlKCkgPT0gMCk7CisgICAgICAgIHJzLnNldFN0YXRlKDEpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIHJzLnN0YXRlID09IDEgd2FzICVkIiwgcnMuZ2V0U3RhdGUoKSksCisgICAgICAgICAgICAgICAgcnMuZ2V0U3RhdGUoKSA9PSAxKTsKKworICAgICAgICBieXRlW10gcnNfc2VyID0gcnMudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUgcnNOZXcgPSBSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZS5wYXJzZUZyb20ocnNfc2VyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCByc05ldy5zdGF0ZSA9PSAxIHdhcyAlZCIsIHJzLmdldFN0YXRlKCkpLAorICAgICAgICAgICAgICAgIHJzLmdldFN0YXRlKCkgPT0gMSk7CisKKyAgICAgICAgbG9nKCJ0ZXN0UHJvdG9idWZTZXJkZXMgWCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZWNobyBjb21tYW5kIHdvcmtzIHVzaW5nIHdyaXRlTXNnICYgcmVhZE1zZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvTXNnKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbG9nKCJ0ZXN0RWNob01zZyBFIik7CisKKyAgICAgICAgTXNnSGVhZGVyIG1oID0gbmV3IE1zZ0hlYWRlcigpOworICAgICAgICBtaC5zZXRDbWQoMCk7CisgICAgICAgIG1oLnNldFRva2VuKDEpOworICAgICAgICBtaC5zZXRTdGF0dXMoMik7CisgICAgICAgIEJ5dGVCdWZmZXIgZGF0YSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMyk7CisgICAgICAgIGRhdGEucHV0KChieXRlKTMpOworICAgICAgICBkYXRhLnB1dCgoYnl0ZSk0KTsKKyAgICAgICAgZGF0YS5wdXQoKGJ5dGUpNSk7CisgICAgICAgIE1zZy5zZW5kKG1Nb2NrUmlsQ2hhbm5lbCwgbWgsIGRhdGEpOworCisgICAgICAgIE1zZyByZXNwTXNnID0gTXNnLnJlY3YobU1vY2tSaWxDaGFubmVsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBtaGQuaGVhZGVyLmNtZCA9PSAwIHdhcyAlZCIscmVzcE1zZy5nZXRDbWQoKSksCisgICAgICAgICAgICAgICAgcmVzcE1zZy5nZXRDbWQoKSA9PSAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBtaGQuaGVhZGVyLnRva2VuID09IDEgd2FzICVkIixyZXNwTXNnLmdldFRva2VuKCkpLAorICAgICAgICAgICAgICAgIHJlc3BNc2cuZ2V0VG9rZW4oKSA9PSAxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBtaGQuaGVhZGVyLnN0YXR1cyA9PSAyIHdhcyAlZCIsIHJlc3BNc2cuZ2V0U3RhdHVzKCkpLAorICAgICAgICAgICAgICAgIHJlc3BNc2cuZ2V0U3RhdHVzKCkgPT0gMik7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgbWhkLmRhdGFbMF0gPT0gMyB3YXMgJWQiLCByZXNwTXNnLmdldERhdGEoMCkpLAorICAgICAgICAgICAgICAgIHJlc3BNc2cuZ2V0RGF0YSgwKSA9PSAzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBtaGQuZGF0YVsxXSA9PSA0IHdhcyAlZCIsIHJlc3BNc2cuZ2V0RGF0YSgxKSksCisgICAgICAgICAgICAgICAgcmVzcE1zZy5nZXREYXRhKDEpID09IDQpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIG1oZC5kYXRhWzJdID09IDUgd2FzICVkIiwgcmVzcE1zZy5nZXREYXRhKDIpKSwKKyAgICAgICAgICAgICAgICByZXNwTXNnLmdldERhdGEoMikgPT0gNSk7CisKKyAgICAgICAgbG9nKCJ0ZXN0RWNob01zZyBYIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBnZXQgYXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXMoKSB7CisgICAgICAgIGxvZygidGVzdEdldEFzIEUiKTsKKworICAgICAgICAvLyBVc2UgYSBtZXNzYWdlIGhlYWRlciBhcyB0aGUgcHJvdG9idWYgZGF0YSBjb250ZW50CisgICAgICAgIE1zZ0hlYWRlciBtaCA9IG5ldyBNc2dIZWFkZXIoKTsKKyAgICAgICAgbWguc2V0Q21kKDEyMzQ1KTsKKyAgICAgICAgbWguc2V0VG9rZW4oOTg3Nik7CisgICAgICAgIG1oLnNldFN0YXR1cyg3NjU0KTsKKyAgICAgICAgbWguc2V0TGVuZ3RoRGF0YSg0MzIxKTsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBtaC50b0J5dGVBcnJheSgpOworICAgICAgICBNc2dIZWFkZXIgbWhSZXN1bHQgPSBNc2cuZ2V0QXMoTXNnSGVhZGVyLmNsYXNzLCBkYXRhKTsKKworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIGNtZCA9PSAxMjM0NSB3YXMgJWQiLCBtaFJlc3VsdC5nZXRDbWQoKSksCisgICAgICAgICAgICAgICAgbWhSZXN1bHQuZ2V0Q21kKCkgPT0gMTIzNDUpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIHRva2VuID09IDk4NzYgd2FzICVkIiwgbWhSZXN1bHQuZ2V0VG9rZW4oKSksCisgICAgICAgICAgICAgICAgbWhSZXN1bHQuZ2V0VG9rZW4oKSA9PSA5ODc2KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBzdGF0dXMgPT0gNzY1NCB3YXMgJWQiLCBtaFJlc3VsdC5nZXRTdGF0dXMoKSksCisgICAgICAgICAgICAgICAgbWhSZXN1bHQuZ2V0U3RhdHVzKCkgPT0gNzY1NCk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgbGVuZ3RoRGF0YSA9PSA0MzIxIHdhcyAlZCIsIG1oUmVzdWx0LmdldExlbmd0aERhdGEoKSksCisgICAgICAgICAgICAgICAgbWhSZXN1bHQuZ2V0TGVuZ3RoRGF0YSgpID09IDQzMjEpOworCisgICAgICAgIE1zZyBtc2cgPSBNc2cub2J0YWluKCk7CisgICAgICAgIG1zZy5zZXREYXRhKEJ5dGVCdWZmZXIud3JhcChkYXRhKSk7CisKKyAgICAgICAgbWhSZXN1bHQgPSBtc2cuZ2V0RGF0YUFzKE1zZ0hlYWRlci5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBjbWQgPT0gMTIzNDUgd2FzICVkIiwgbWhSZXN1bHQuZ2V0Q21kKCkpLAorICAgICAgICAgICAgICAgIG1oUmVzdWx0LmdldENtZCgpID09IDEyMzQ1KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCB0b2tlbiA9PSA5ODc2IHdhcyAlZCIsIG1oUmVzdWx0LmdldFRva2VuKCkpLAorICAgICAgICAgICAgICAgIG1oUmVzdWx0LmdldFRva2VuKCkgPT0gOTg3Nik7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgc3RhdHVzID09IDc2NTQgd2FzICVkIiwgbWhSZXN1bHQuZ2V0U3RhdHVzKCkpLAorICAgICAgICAgICAgICAgIG1oUmVzdWx0LmdldFN0YXR1cygpID09IDc2NTQpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIGxlbmd0aERhdGEgPT0gNDMyMSB3YXMgJWQiLCBtaFJlc3VsdC5nZXRMZW5ndGhEYXRhKCkpLAorICAgICAgICAgICAgICAgIG1oUmVzdWx0LmdldExlbmd0aERhdGEoKSA9PSA0MzIxKTsKKworICAgICAgICBsb2coInRlc3RHZXRBcyBYIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFJhZGlvU3RhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBsb2coInRlc3RHZXRSYWRpb1N0YXRlIEUiKTsKKworICAgICAgICBNc2cuc2VuZChtTW9ja1JpbENoYW5uZWwsIDEsIDk4NzYsIDAsIG51bGwpOworCisgICAgICAgIE1zZyByZXNwID0gTXNnLnJlY3YobU1vY2tSaWxDaGFubmVsKTsKKyAgICAgICAgLy9yZXNwLnByaW50SGVhZGVyKCJ0ZXN0R2V0UmFkaW9TdGF0ZSIpOworCisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgY21kID09IDEgd2FzICVkIiwgcmVzcC5nZXRDbWQoKSksCisgICAgICAgICAgICAgICAgcmVzcC5nZXRDbWQoKSA9PSAxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCB0b2tlbiA9PSA5ODc2IHdhcyAlZCIsIHJlc3AuZ2V0VG9rZW4oKSksCisgICAgICAgICAgICAgICAgcmVzcC5nZXRUb2tlbigpID09IDk4NzYpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIHN0YXR1cyA9PSAwIHdhcyAlZCIsIHJlc3AuZ2V0U3RhdHVzKCkpLAorICAgICAgICAgICAgICAgIHJlc3AuZ2V0U3RhdHVzKCkgPT0gMCk7CisKKyAgICAgICAgUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUgcnNwID0gcmVzcC5nZXREYXRhQXMoUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUuY2xhc3MpOworCisgICAgICAgIGludCBzdGF0ZSA9IHJzcC5nZXRTdGF0ZSgpOworICAgICAgICBsb2coInRlc3RHZXRSYWRpb1N0YXRlIHN0YXRlPSIgKyBzdGF0ZSk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgUmFkaW9TdGF0ZSA+PSAwICYmIFJhZGlvU3RhdGUgPD0gOSB3YXMgJWQiLCBzdGF0ZSksCisgICAgICAgICAgICAgICAgKChzdGF0ZSA+PSAwKSAmJiAoc3RhdGUgPD0gOSkpKTsKKworICAgICAgICBsb2coInRlc3RHZXRSYWRpb1N0YXRlIFgiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UmFkaW9TdGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGxvZygidGVzdFNldFJhZGlvU3RhdGUgRSIpOworCisgICAgICAgIFJpbEN0cmxDbWRzLkN0cmxSZXFSYWRpb1N0YXRlIGNtZHJzID0gbmV3IFJpbEN0cmxDbWRzLkN0cmxSZXFSYWRpb1N0YXRlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBjbWRycy5nZXRTdGF0ZSgpKTsKKworICAgICAgICBjbWRycy5zZXRTdGF0ZShSaWxDbWRzLlJBRElPU1RBVEVfU0lNX05PVF9SRUFEWSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBjbWRycy5nZXRTdGF0ZSgpKTsKKworICAgICAgICBNc2cuc2VuZChtTW9ja1JpbENoYW5uZWwsIFJpbEN0cmxDbWRzLkNUUkxfQ01EX1NFVF9SQURJT19TVEFURSwgMCwgMCwgY21kcnMpOworCisgICAgICAgIE1zZyByZXNwID0gTXNnLnJlY3YobU1vY2tSaWxDaGFubmVsKTsKKworICAgICAgICBSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZSByc3AgPSByZXNwLmdldERhdGFBcyhSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZS5jbGFzcyk7CisKKyAgICAgICAgaW50IHN0YXRlID0gcnNwLmdldFN0YXRlKCk7CisgICAgICAgIGxvZygiZ2V0IHJlc3BvbnNlIGZvciB0ZXN0U2V0UmFkaW9TdGF0ZTogIiArIHN0YXRlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShSaWxDbWRzLlJBRElPU1RBVEVfU0lNX05PVF9SRUFEWSA9PSBzdGF0ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Mb2FkZXJUZXN0Q2FzZS5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Mb2FkZXJUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZTY1OTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L0xvYWRlclRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXN0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkxvYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuTG9hZGVyLk9uTG9hZENvbXBsZXRlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKKworLyoqCisgKiBBIGNvbnZlbmllbmNlIGNsYXNzIGZvciB0ZXN0aW5nIHtAbGluayBMb2FkZXJ9cy4gVGhpcyB0ZXN0IGNhc2UKKyAqIHByb3ZpZGVzIGEgc2ltcGxlIHdheSB0byBzeW5jaHJvbm91c2x5IGdldCB0aGUgcmVzdWx0IGZyb20gYSBMb2FkZXIgbWFraW5nCisgKiBpdCBlYXN5IHRvIGFzc2VydCB0aGF0IHRoZSBMb2FkZXIgcmV0dXJucyB0aGUgZXhwZWN0ZWQgcmVzdWx0LgorICovCitwdWJsaWMgY2xhc3MgTG9hZGVyVGVzdENhc2UgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHN0YXRpYyB7CisgICAgICAgIC8vIEZvcmNlIGNsYXNzIGxvYWRpbmcgb2YgQXN5bmNUYXNrIG9uIHRoZSBtYWluIHRocmVhZCBzbyB0aGF0IGl0J3MgaGFuZGxlcnMgYXJlIHRpZWQgdG8KKyAgICAgICAgLy8gdGhlIG1haW4gdGhyZWFkIGFuZCByZXNwb25zZXMgZnJvbSB0aGUgd29ya2VyIHRocmVhZCBnZXQgZGVsaXZlcmVkIG9uIHRoZSBtYWluIHRocmVhZC4KKyAgICAgICAgLy8gVGhlIHRlc3RzIGFyZSBydW4gb24gYW5vdGhlciB0aHJlYWQsIGFsbG93aW5nIHRoZW0gdG8gYmxvY2sgd2FpdGluZyBvbiBhIHJlc3BvbnNlIGZyb20KKyAgICAgICAgLy8gdGhlIGNvZGUgcnVubmluZyBvbiB0aGUgbWFpbiB0aHJlYWQuIFRoZSBtYWluIHRocmVhZCBjYW4ndCBibG9jayBzaW5jZSB0aGUgQXlzbmNUYXNrCisgICAgICAgIC8vIHJlc3VsdHMgY29tZSBpbiB2aWEgdGhlIGV2ZW50IGxvb3AuCisgICAgICAgIG5ldyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgVm9pZD4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBWb2lkIGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gYXJncykge3JldHVybiBudWxsO30KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShWb2lkIHJlc3VsdCkge30KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW5zIGEgTG9hZGVyIHN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgbG9hZC4gVGhlIGxvYWRlciB3aWxsCisgICAgICogYmUgc3RhcnRlZCwgc3RvcHBlZCwgYW5kIGRlc3Ryb3llZCBieSB0aGlzIG1ldGhvZCBzbyBpdCBjYW5ub3QgYmUgcmV1c2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGxvYWRlciBUaGUgbG9hZGVyIHRvIHJ1biBzeW5jaHJvbm91c2x5CisgICAgICogQHJldHVybiBUaGUgcmVzdWx0IGZyb20gdGhlIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyA8VD4gVCBnZXRMb2FkZXJSZXN1bHRTeW5jaHJvbm91c2x5KGZpbmFsIExvYWRlcjxUPiBsb2FkZXIpIHsKKyAgICAgICAgLy8gVGhlIHRlc3QgdGhyZWFkIGJsb2NrcyBvbiB0aGlzIHF1ZXVlIHVudGlsIHRoZSBsb2FkZXIgcHV0cyBpdCdzIHJlc3VsdCBpbgorICAgICAgICBmaW5hbCBBcnJheUJsb2NraW5nUXVldWU8VD4gcXVldWUgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFQ+KDEpOworCisgICAgICAgIC8vIFRoaXMgY2FsbGJhY2sgcnVucyBvbiB0aGUgIm1haW4iIHRocmVhZCBhbmQgdW5ibG9ja3MgdGhlIHRlc3QgdGhyZWFkCisgICAgICAgIC8vIHdoZW4gaXQgcHV0cyB0aGUgcmVzdWx0IGludG8gdGhlIGJsb2NraW5nIHF1ZXVlCisgICAgICAgIGZpbmFsIE9uTG9hZENvbXBsZXRlTGlzdGVuZXI8VD4gbGlzdGVuZXIgPSBuZXcgT25Mb2FkQ29tcGxldGVMaXN0ZW5lcjxUPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25Mb2FkQ29tcGxldGUoTG9hZGVyPFQ+IGNvbXBsZXRlZExvYWRlciwgVCBkYXRhKSB7CisgICAgICAgICAgICAgICAgLy8gU2h1dCB0aGUgbG9hZGVyIGRvd24KKyAgICAgICAgICAgICAgICBjb21wbGV0ZWRMb2FkZXIudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIGNvbXBsZXRlZExvYWRlci5zdG9wTG9hZGluZygpOworICAgICAgICAgICAgICAgIGNvbXBsZXRlZExvYWRlci5kZXN0cm95KCk7CisKKyAgICAgICAgICAgICAgICAvLyBTdG9yZSB0aGUgcmVzdWx0LCB1bmJsb2NraW5nIHRoZSB0ZXN0IHRocmVhZAorICAgICAgICAgICAgICAgIHF1ZXVlLmFkZChkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvLyBUaGlzIGhhbmRsZXIgcnVucyBvbiB0aGUgIm1haW4iIHRocmVhZCBvZiB0aGUgcHJvY2VzcyBzaW5jZSBBc3luY1Rhc2sKKyAgICAgICAgLy8gaXMgZG9jdW1lbnRlZCBhcyBuZWVkaW5nIHRvIHJ1biBvbiB0aGUgbWFpbiB0aHJlYWQgYW5kIG1hbnkgTG9hZGVycyB1c2UKKyAgICAgICAgLy8gQXN5bmNUYXNrCisgICAgICAgIGZpbmFsIEhhbmRsZXIgbWFpblRocmVhZEhhbmRsZXIgPSBuZXcgSGFuZGxlcihMb29wZXIuZ2V0TWFpbkxvb3BlcigpKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXIucmVnaXN0ZXJMaXN0ZW5lcigwLCBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgbG9hZGVyLnN0YXJ0TG9hZGluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8vIEFzayB0aGUgbWFpbiB0aHJlYWQgdG8gc3RhcnQgdGhlIGxvYWRpbmcgcHJvY2VzcworICAgICAgICBtYWluVGhyZWFkSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKDApOworCisgICAgICAgIC8vIEJsb2NrIG9uIHRoZSBxdWV1ZSB3YWl0aW5nIGZvciB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkIHRvIGJlIGluc2VydGVkCisgICAgICAgIFQgcmVzdWx0OworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBxdWV1ZS50YWtlKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIndhaXRpbmcgdGhyZWFkIGludGVycnVwdGVkIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZS5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlLmphdmEKaW5kZXggZTExNzJjZi4uNzRjZWJlZSAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlLmphdmEKQEAgLTczLDYgKzczLDE4IEBACiAgICAgICAgIG1SZXNvbHZlci5hZGRQcm92aWRlcihtUHJvdmlkZXJBdXRob3JpdHksIGdldFByb3ZpZGVyKCkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGVudmlyb25tZW50IGZvciB0aGUgdGVzdCBmaXh0dXJlLgorICAgICAqIDxwPgorICAgICAqIENhbGxzIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyI3NodXRkb3duKCl9IG9uIHRoZQorICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyfSByZXByZXNlbnRlZCBieSBtUHJvdmlkZXIuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVByb3ZpZGVyLnNodXRkb3duKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCiAgICAgcHVibGljIE1vY2tDb250ZW50UmVzb2x2ZXIgZ2V0TW9ja0NvbnRlbnRSZXNvbHZlcigpIHsKICAgICAgICAgcmV0dXJuIG1SZXNvbHZlcjsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Byb3ZpZGVyVGVzdENhc2UyLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Byb3ZpZGVyVGVzdENhc2UyLmphdmEKaW5kZXggMWZiNTUzOC4uMjgxMWIwZCAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlMi5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZTIuamF2YQpAQCAtNzQsNyArNzQsNyBAQAogICAgIHByaXZhdGUgSXNvbGF0ZWRDb250ZXh0IG1Qcm92aWRlckNvbnRleHQ7CiAgICAgcHJpdmF0ZSBNb2NrQ29udGVudFJlc29sdmVyIG1SZXNvbHZlcjsKIAotICAgICAgIHByaXZhdGUgY2xhc3MgTW9ja0NvbnRleHQyIGV4dGVuZHMgTW9ja0NvbnRleHQgeworICAgIHByaXZhdGUgY2xhc3MgTW9ja0NvbnRleHQyIGV4dGVuZHMgTW9ja0NvbnRleHQgewogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgUmVzb3VyY2VzIGdldFJlc291cmNlcygpIHsKQEAgLTg3LDYgKzg3LDExIEBACiAgICAgICAgICAgICAvLyBvbmUgY3JlYXRlZCB0aHJvdWdoIHRoZSByZWd1bGFyIENvbnRleHQKICAgICAgICAgICAgIHJldHVybiBnZXRDb250ZXh0KCkuZ2V0RGlyKCJtb2NrY29udGV4dDJfIiArIG5hbWUsIG1vZGUpOwogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb250ZXh0IGdldEFwcGxpY2F0aW9uQ29udGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CiAgICAgfQogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yLgpAQCAtMTQxLDYgKzE0NiwxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGVudmlyb25tZW50IGZvciB0aGUgdGVzdCBmaXh0dXJlLgorICAgICAqIDxwPgorICAgICAqIENhbGxzIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyI3NodXRkb3duKCl9IG9uIHRoZQorICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyfSByZXByZXNlbnRlZCBieSBtUHJvdmlkZXIuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVByb3ZpZGVyLnNodXRkb3duKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogR2V0cyB0aGUge0BsaW5rIE1vY2tDb250ZW50UmVzb2x2ZXJ9IGNyZWF0ZWQgYnkgdGhpcyBjbGFzcyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIFlvdQogICAgICAqIG11c3QgdXNlIHRoZSBtZXRob2RzIG9mIHRoaXMgcmVzb2x2ZXIgdG8gYWNjZXNzIHRoZSBwcm92aWRlciB1bmRlciB0ZXN0LgogICAgICAqCmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1JlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHQuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dC5qYXZhCmluZGV4IDk3M2I5ZjIuLmVlZTNhZDcgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dC5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dC5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLm9zLkZpbGVVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtMTQ4LDYgKzE0OSwxNyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZShTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgIGludCBtb2RlLCBTUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5IGZhY3RvcnksIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgeworICAgICAgICBmaW5hbCBTdHJpbmcgaW50ZXJuYWxOYW1lID0gcmVuYW1lZEZpbGVOYW1lKG5hbWUpOworICAgICAgICBpZiAoIW1EYXRhYmFzZU5hbWVzLmNvbnRhaW5zKG5hbWUpKSB7CisgICAgICAgICAgICBtRGF0YWJhc2VOYW1lcy5hZGQobmFtZSk7CisgICAgICAgICAgICBtRmlsZUNvbnRleHQuZGVsZXRlRGF0YWJhc2UoaW50ZXJuYWxOYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUZpbGVDb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKGludGVybmFsTmFtZSwgbW9kZSwgZmFjdG9yeSwgZXJyb3JIYW5kbGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVEYXRhYmFzZShTdHJpbmcgbmFtZSkgewogICAgICAgICBpZiAobURhdGFiYXNlTmFtZXMuY29udGFpbnMobmFtZSkpIHsKICAgICAgICAgICAgIG1EYXRhYmFzZU5hbWVzLnJlbW92ZShuYW1lKTsKZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGVudFByb3ZpZGVyLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IDNmZDcxYzguLmI2M2ZmM2QgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMTI3LDYgKzEyNywxNiBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KIAorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gTW9ja0NvbnRlbnRQcm92aWRlci50aGlzLmdldFN0cmVhbVR5cGVzKHVybCwgbWltZVR5cGVGaWx0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKQorICAgICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gTW9ja0NvbnRlbnRQcm92aWRlci50aGlzLm9wZW5UeXBlZEFzc2V0RmlsZSh1cmwsIG1pbWVUeXBlLCBvcHRzKTsKKyAgICAgICAgfQogICAgIH0KICAgICBwcml2YXRlIGZpbmFsIEludmVyc2lvbklDb250ZW50UHJvdmlkZXIgbUlDb250ZW50UHJvdmlkZXIgPSBuZXcgSW52ZXJzaW9uSUNvbnRlbnRQcm92aWRlcigpOwogCkBAIC0yMjIsNiArMjMyLDE0IEBACiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCBjYWxsIik7CiAgICAgfQogCisgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QgY2FsbCIpOworICAgIH0KKworICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCBjYWxsIik7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBJQ29udGVudFByb3ZpZGVyIHdoaWNoIGNhbGxzIGJhY2sgc2FtZSBtZXRob2RzIGluIHRoaXMgY2xhc3MuCiAgICAgICogQnkgb3ZlcnJpZGluZyB0aGlzIGNsYXNzLCB3ZSBhdm9pZCB0aGUgbWVjaGFuaXNtIGhpZGRlbiBiZWhpbmQgQ29udGVudFByb3ZpZGVyCmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRleHQuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGV4dC5qYXZhCmluZGV4IGZmZDc1N2MuLmMzMWM5Y2MgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGV4dC5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGV4dC5qYXZhCkBAIC0yOSw2ICsyOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKQEAgLTE4NCw2ICsxODUsMTIgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIGZpbGUsIGludCBtb2RlLAorICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEZpbGUgZ2V0RGF0YWJhc2VQYXRoKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ3Vyc29yLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0N1cnNvci5qYXZhCmluZGV4IDliMWMwZWYuLmJhYTE1MGEgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ3Vyc29yLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDdXJzb3IuamF2YQpAQCAtMTc4LDM2ICsxNzgsMTEgQEAKICAgICB9CiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcyhNYXA8PyBleHRlbmRzIExvbmcsID8gZXh0ZW5kcyBNYXA8U3RyaW5nLCBPYmplY3Q+PiB2YWx1ZXMpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNVcGRhdGVzKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHNldE5vdGlmaWNhdGlvblVyaShDb250ZW50UmVzb2x2ZXIgY3IsIFVyaSB1cmkpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7CiAgICAgfQogCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1VwZGF0ZXMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoQ29udGVudE9ic2VydmVyIG9ic2VydmVyKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwogICAgIH0KQEAgLTIxNyw0OCArMTkyLDcgQEAKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7CiAgICAgfQogCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVCbG9iKGludCBjb2x1bW5JbmRleCwgYnl0ZVtdIHZhbHVlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlRG91YmxlKGludCBjb2x1bW5JbmRleCwgZG91YmxlIHZhbHVlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlRmxvYXQoaW50IGNvbHVtbkluZGV4LCBmbG9hdCB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUludChpbnQgY29sdW1uSW5kZXgsIGludCB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUxvbmcoaW50IGNvbHVtbkluZGV4LCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlU2hvcnQoaW50IGNvbHVtbkluZGV4LCBzaG9ydCB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVN0cmluZyhpbnQgY29sdW1uSW5kZXgsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVRvTnVsbChpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgdm9pZCBhYm9ydFVwZGF0ZXMoKSB7CisgICAgcHVibGljIGludCBnZXRUeXBlKGludCBjb2x1bW5JbmRleCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKICAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tJQ29udGVudFByb3ZpZGVyLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0lDb250ZW50UHJvdmlkZXIuamF2YQppbmRleCAwYmU1YmVhLi4xODNiZTQxIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0lDb250ZW50UHJvdmlkZXIuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0lDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMzIsNiArMzIsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKQEAgLTEwMiw0ICsxMDMsMTMgQEAKICAgICBwdWJsaWMgSUJpbmRlciBhc0JpbmRlcigpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7CiAgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOworICAgIH0KKworICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9UZXN0R3JvdXBpbmcuamF2YQppbmRleCBkZjZkYTcwLi5hMmI5NGZmIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9UZXN0R3JvdXBpbmcuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9UZXN0R3JvdXBpbmcuamF2YQpAQCAtNDYsNiArNDYsOCBAQAogICovCiBwdWJsaWMgY2xhc3MgVGVzdEdyb3VwaW5nIHsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlRlc3RHcm91cGluZyI7CisKICAgICBTb3J0ZWRTZXQ8Q2xhc3M8PyBleHRlbmRzIFRlc3RDYXNlPj4gdGVzdENhc2VDbGFzc2VzOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPENsYXNzPD8gZXh0ZW5kcyBUZXN0Q2FzZT4+IFNPUlRfQllfU0lNUExFX05BTUUKQEAgLTExNCw3ICsxMTYsNyBAQAogICAgICAgICBmb3IgKFN0cmluZyBwYWNrYWdlTmFtZSA6IHBhY2thZ2VOYW1lcykgewogICAgICAgICAgICAgTGlzdDxDbGFzczw/IGV4dGVuZHMgVGVzdENhc2U+PiBhZGRlZENsYXNzZXMgPSB0ZXN0Q2FzZUNsYXNzZXNJblBhY2thZ2UocGFja2FnZU5hbWUpOwogICAgICAgICAgICAgaWYgKGFkZGVkQ2xhc3Nlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudygiVGVzdEdyb3VwaW5nIiwgIkludmFsaWQgUGFja2FnZTogJyIgKyBwYWNrYWdlTmFtZQorICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJJbnZhbGlkIFBhY2thZ2U6ICciICsgcGFja2FnZU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgY291bGQgbm90IGJlIGZvdW5kIG9yIGhhcyBubyB0ZXN0cyIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdGVzdENhc2VDbGFzc2VzLmFkZEFsbChhZGRlZENsYXNzZXMpOwpAQCAtMjM0LDYgKzIzNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIlRlc3RDYXNlIGNsYXNzICVzIGlzIG1pc3NpbmcgYSBwdWJsaWMgY29uc3RydWN0b3Igd2l0aCBubyBwYXJhbWV0ZXJzICIgKworICAgICAgICAgICAgICAgICAgICAib3IgYSBzaW5nbGUgU3RyaW5nIHBhcmFtZXRlciAtIHNraXBwaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgYUNsYXNzLmdldE5hbWUoKSkpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nVGVzdC5qYXZhIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NDc3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9UZXN0R3JvdXBpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFVuaXQgdGVzdHMgZm9yIHtAbGluayBUZXN0R3JvdXBpbmd9CisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0R3JvdXBpbmdUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBUZXN0R3JvdXBpbmcgbUdyb3VwaW5nOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbUdyb3VwaW5nID0gbmV3IFRlc3RHcm91cGluZyhUZXN0R3JvdXBpbmcuU09SVF9CWV9TSU1QTEVfTkFNRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZpZXMgdGhhdCBUZXN0Q2FzZXMgd2l0aCBubyBwdWJsaWMgY29uc3RydWN0b3IgYXJlIG5vdCBsb2FkZWQuCisgICAgICogUmVsaWVzIG9uIGZpeHR1cmUgY2xhc3NlcyBpbiBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmV4YW1wbGVzLmNvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFRlc3RzX25vUHVibGljQ29uc3RydWN0b3IoKSB7CisgICAgICAgIG1Hcm91cGluZy5hZGRQYWNrYWdlc1JlY3Vyc2l2ZSgiYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5leGFtcGxlcy5jb25zdHJ1Y3RvciIpOworICAgICAgICBMaXN0PFRlc3RNZXRob2Q+IHRlc3RzID0gbUdyb3VwaW5nLmdldFRlc3RzKCk7CisgICAgICAgIC8vIG9ubHkgdGhlIFB1YmxpY0NvbnN0cnVjdG9yVGVzdCdzIHRlc3QgbWV0aG9kIHNob3VsZCBiZSBwcmVzZW50CisgICAgICAgIGFzc2VydEVxdWFscygxLCB0ZXN0cy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3RQdWJsaWNDb25zdHJ1Y3RvciIsIHRlc3RzLmdldCgwKS5nZXROYW1lKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL2V4YW1wbGVzL2NvbnN0cnVjdG9yL05vUHVibGljQ29uc3RydWN0b3JUZXN0LmphdmEgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9Ob1B1YmxpY0NvbnN0cnVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OTA5YTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9Ob1B1YmxpY0NvbnN0cnVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuZXhhbXBsZXMuY29uc3RydWN0b3I7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQSB7QGxpbmsgVGVzdENhc2V9IHdoaWNoIHNob3VsZCBub3QgYmUgbG9hZGVkIHNpbmNlIGl0IGhhcyBub24tcHVibGljIGNvbnN0cnVjdG9ycyB3aXRoIG5vIGFyZ3MuCisgKi8KK3B1YmxpYyBjbGFzcyBOb1B1YmxpY0NvbnN0cnVjdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIE5vUHVibGljQ29uc3RydWN0b3JUZXN0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBOb1B1YmxpY0NvbnN0cnVjdG9yVGVzdChTdHJpbmcgZm9vLCBTdHJpbmcgZm9vMikgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RSdW4oKSB7CisgICAgICAgIGZhaWwoIm1ldGhvZCBpbiBOb1B1YmxpY0NvbnN0cnVjdG9yVGVzdCBydW4gdW5leHBlY3RlZGx5Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvUHJvdGVjdGVkQ29uc3RydWN0b3JUZXN0LmphdmEgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9Qcm90ZWN0ZWRDb25zdHJ1Y3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjg2MmZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvUHJvdGVjdGVkQ29uc3RydWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5leGFtcGxlcy5jb25zdHJ1Y3RvcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBBIHByb3RlY3RlZCBjb25zdHJ1Y3RvciB0ZXN0IGNhc2UgdGhhdCBzaG91bGQgbm90IGJlIGxvYWRlZC4KKyAqLworcHVibGljIGNsYXNzIFByb3RlY3RlZENvbnN0cnVjdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByb3RlY3RlZCBQcm90ZWN0ZWRDb25zdHJ1Y3RvclRlc3QoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vdFJ1bigpIHsKKyAgICAgICAgZmFpbCgibWV0aG9kIGluIFByb3RlY3RlZENvbnN0cnVjdG9yVGVzdCBydW4gdW5leHBlY3RlZGx5Iik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YSBiL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL2V4YW1wbGVzL2NvbnN0cnVjdG9yL1B1YmxpY0NvbnN0cnVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMWUyNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmV4YW1wbGVzLmNvbnN0cnVjdG9yOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEEgcHVibGljIGNvbnN0cnVjdG9yIHRlc3QgY2FzZSB0aGF0IHNob3VsZCBiZSBsb2FkZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBQdWJsaWNDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHVibGljQ29uc3RydWN0b3IoKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oCmluZGV4IGEwNThkNGEuLjAzNzM2N2UgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9QbHVnaW5PYmplY3QuaAorKysgYi90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvUGx1Z2luT2JqZWN0LmgKQEAgLTY1LDcgKzY1LDcgQEAKIHB1YmxpYzoKICAgICBTdWJQbHVnaW4oTlBQIGluc3QpIDogbV9pbnN0KGluc3QpIHt9CiAgICAgdmlydHVhbCB+U3ViUGx1Z2luKCkge30KLSAgICB2aXJ0dWFsIGludDE2IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpID0gMDsKKyAgICB2aXJ0dWFsIGludDE2X3QgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCkgPSAwOwogCiAgICAgTlBQIGluc3QoKSBjb25zdCB7IHJldHVybiBtX2luc3Q7IH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmNwcCBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5jcHAKaW5kZXggMmVmZjM5NC4uOTFmMWIzZCAxMDA2NDQKLS0tIGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmNwcAorKysgYi90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvZXZlbnQvRXZlbnRQbHVnaW4uY3BwCkBAIC0xMzgsNyArMTM4LDcgQEAKICAgICBicm93c2VyLT5tZW1mcmVlKGJlZ2luTWVtKTsKIH0KIAotaW50MTYgRXZlbnRQbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKK2ludDE2X3QgRXZlbnRQbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKICAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CiAKICAgICAgICAgY2FzZSBrRHJhd19BTlBFdmVudFR5cGU6IHsKZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5oIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmgKaW5kZXggODhiN2M5ZC4uMDQzYmU4NSAxMDA2NDQKLS0tIGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmgKKysrIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmgKQEAgLTMyLDcgKzMyLDcgQEAKIHB1YmxpYzoKICAgICBFdmVudFBsdWdpbihOUFAgaW5zdCk7CiAgICAgdmlydHVhbCB+RXZlbnRQbHVnaW4oKTsKLSAgICB2aXJ0dWFsIGludDE2IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpOworICAgIHZpcnR1YWwgaW50MTZfdCBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKIAogcHJpdmF0ZToKICAgICB2b2lkIGRyYXdQbHVnaW4oY29uc3QgQU5QQml0bWFwJiBiaXRtYXAsIGNvbnN0IEFOUFJlY3RJJiBjbGlwKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9tYWluLmNwcCBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9tYWluLmNwcAppbmRleCA0MDJhN2UyLi41MTExODBjIDEwMDY0NAotLS0gYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvbWFpbi5jcHAKKysrIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL21haW4uY3BwCkBAIC0zNCwxOSArMzQsMTkgQEAKIE5QTmV0c2NhcGVGdW5jcyogYnJvd3NlcjsKICNkZWZpbmUgRVhQT1JUIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCiAKLU5QRXJyb3IgTlBQX05ldyhOUE1JTUVUeXBlIHBsdWdpblR5cGUsIE5QUCBpbnN0YW5jZSwgdWludDE2IG1vZGUsIGludDE2IGFyZ2MsCitOUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNl90IG1vZGUsIGludDE2X3QgYXJnYywKICAgICAgICAgY2hhciogYXJnbltdLCBjaGFyKiBhcmd2W10sIE5QU2F2ZWREYXRhKiBzYXZlZCk7CiBOUEVycm9yIE5QUF9EZXN0cm95KE5QUCBpbnN0YW5jZSwgTlBTYXZlZERhdGEqKiBzYXZlKTsKIE5QRXJyb3IgTlBQX1NldFdpbmRvdyhOUFAgaW5zdGFuY2UsIE5QV2luZG93KiB3aW5kb3cpOwogTlBFcnJvciBOUFBfTmV3U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBNSU1FVHlwZSB0eXBlLCBOUFN0cmVhbSogc3RyZWFtLAotICAgICAgICBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNiogc3R5cGUpOworICAgICAgICBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNl90KiBzdHlwZSk7CiBOUEVycm9yIE5QUF9EZXN0cm95U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBSZWFzb24gcmVhc29uKTsKLWludDMyICAgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKTsKLWludDMyICAgTlBQX1dyaXRlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgaW50MzIgb2Zmc2V0LCBpbnQzMiBsZW4sCitpbnQzMl90ICAgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKTsKK2ludDMyX3QgICBOUFBfV3JpdGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBpbnQzMl90IG9mZnNldCwgaW50MzJfdCBsZW4sCiAgICAgICAgIHZvaWQqIGJ1ZmZlcik7CiB2b2lkICAgIE5QUF9TdHJlYW1Bc0ZpbGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBjb25zdCBjaGFyKiBmbmFtZSk7CiB2b2lkICAgIE5QUF9QcmludChOUFAgaW5zdGFuY2UsIE5QUHJpbnQqIHBsYXRmb3JtUHJpbnQpOwotaW50MTYgICBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCk7CitpbnQxNl90ICAgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpOwogdm9pZCAgICBOUFBfVVJMTm90aWZ5KE5QUCBpbnN0YW5jZSwgY29uc3QgY2hhciogVVJMLCBOUFJlYXNvbiByZWFzb24sCiAgICAgICAgIHZvaWQqIG5vdGlmeURhdGEpOwogTlBFcnJvciBOUFBfR2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUFBWYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpOwpAQCAtMTI5LDcgKzEyOSw3IEBACiAgICAgcmV0dXJuICJhcHBsaWNhdGlvbi94LWJyb3dzZXJ0ZXN0cGx1Z2luOmJ0cDpBbmRyb2lkIEJyb3dzZXIgVGVzdCBQbHVnaW4iOwogfQogCi1OUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNiBtb2RlLCBpbnQxNiBhcmdjLAorTlBFcnJvciBOUFBfTmV3KE5QTUlNRVR5cGUgcGx1Z2luVHlwZSwgTlBQIGluc3RhbmNlLCB1aW50MTZfdCBtb2RlLCBpbnQxNl90IGFyZ2MsCiAgICAgICAgICAgICAgICAgY2hhciogYXJnbltdLCBjaGFyKiBhcmd2W10sIE5QU2F2ZWREYXRhKiBzYXZlZCkKIHsKIApAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwogfQogCi1OUEVycm9yIE5QUF9OZXdTdHJlYW0oTlBQIGluc3RhbmNlLCBOUE1JTUVUeXBlIHR5cGUsIE5QU3RyZWFtKiBzdHJlYW0sIE5QQm9vbCBzZWVrYWJsZSwgdWludDE2KiBzdHlwZSkKK05QRXJyb3IgTlBQX05ld1N0cmVhbShOUFAgaW5zdGFuY2UsIE5QTUlNRVR5cGUgdHlwZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBCb29sIHNlZWthYmxlLCB1aW50MTZfdCogc3R5cGUpCiB7CiAgICAgKnN0eXBlID0gTlBfQVNGSUxFT05MWTsKICAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7CkBAIC0xOTksMTIgKzE5OSwxMiBAQAogICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKIH0KIAotaW50MzIgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKQoraW50MzJfdCBOUFBfV3JpdGVSZWFkeShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgcmV0dXJuIDA7CiB9CiAKLWludDMyIE5QUF9Xcml0ZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGludDMyIG9mZnNldCwgaW50MzIgbGVuLCB2b2lkKiBidWZmZXIpCitpbnQzMl90IE5QUF9Xcml0ZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGludDMyX3Qgb2Zmc2V0LCBpbnQzMl90IGxlbiwgdm9pZCogYnVmZmVyKQogewogICAgIHJldHVybiAwOwogfQpAQCAtMjE3LDcgKzIxNyw3IEBACiB7CiB9CiAKLWludDE2IE5QUF9IYW5kbGVFdmVudChOUFAgaW5zdGFuY2UsIHZvaWQqIGV2ZW50KQoraW50MTZfdCBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCkKIHsKICAgICBQbHVnaW5PYmplY3QgKm9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGx1Z2luT2JqZWN0Kj4oaW5zdGFuY2UtPnBkYXRhKTsKICAgICBjb25zdCBBTlBFdmVudCogZXZ0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBBTlBFdmVudCo+KGV2ZW50KTsKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDAzYjdlMjYuLmMxNTEyNTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTgsMTUgKzE4LDE4IEBACiAgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bmFtZT0iSFRNTEhvc3RBcHAiPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iTWVudSIgYW5kcm9pZDpsYWJlbD0iRHVtcCBSZW5kZXIgVHJlZSIKLSAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCI+CisgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiCisgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTGlnaHQiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlRFU1QiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlRlc3RTaGVsbEFjdGl2aXR5IiBhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZVRvcCIKLSAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCIvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJSZWxpYWJpbGl0eVRlc3RBY3Rpdml0eSIgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiLz4KKyAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCIKKyAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5MaWdodCIvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJSZWxpYWJpbGl0eVRlc3RBY3Rpdml0eSIgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiCisgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTGlnaHQiLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9Ii5MYXlvdXRUZXN0c0F1dG9SdW5uZXIiCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5CmluZGV4IGI2ZTdiZjMuLmNlYWM1ZDIgMTAwNzU1Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5CisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5CkBAIC0xNzYsNyArMTc2LDcgQEAKICAgIyBDb3VudCBjcmFzaGVkIHRlc3RzLgogICBjcmFzaGVkX3Rlc3RzID0gW10KIAotICB0aW1lb3V0X21zID0gJzMwMDAwJworICB0aW1lb3V0X21zID0gJzE1MDAwJwogICBpZiBvcHRpb25zLnRpbWVfb3V0X21zOgogICAgIHRpbWVvdXRfbXMgPSBvcHRpb25zLnRpbWVfb3V0X21zCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9DYWxsYmFja1Byb3h5LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvQ2FsbGJhY2tQcm94eS5qYXZhCmluZGV4IDU3ODBjNDMuLjc0MGY1NDQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9DYWxsYmFja1Byb3h5LmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0NhbGxiYWNrUHJveHkuamF2YQpAQCAtNzQsNiArNzQsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVlPVVRfU0VUX0NBTl9PUEVOX1dJTkRPV1MgPSA0MjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUX0dFT0xPQ0FUSU9OX1BFUk1JU1NJT04gPSA0MzsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1ZFUlJJREVfUFJFRkVSRU5DRSA9IDQ0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVlPVVRfRFVNUF9DSElMRF9GUkFNRVNfVEVYVCA9IDQ1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRfWFNTX0FVRElUT1JfRU5BQkxFRCA9IDQ2OwogICAgIAogICAgIENhbGxiYWNrUHJveHkoRXZlbnRTZW5kZXIgZXZlbnRTZW5kZXIsIAogICAgICAgICAgICAgTGF5b3V0VGVzdENvbnRyb2xsZXIgbGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKQEAgLTE3NSw3ICsxNzcsMTEgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgTEFZT1VUX0RVTVBfVEVYVDoKLSAgICAgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEFzVGV4dChtc2cuYXJnMSA9PSAxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTEFZT1VUX0RVTVBfQ0hJTERfRlJBTUVTX1RFWFQ6CisgICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcENoaWxkRnJhbWVzQXNUZXh0KCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIExBWU9VVF9EVU1QX0hJU1RPUlk6CkBAIC0yNzMsNiArMjc5LDEwIEBACiAgICAgICAgICAgICBib29sZWFuIHZhbHVlID0gbXNnLmdldERhdGEoKS5nZXRCb29sZWFuKCJ2YWx1ZSIpOwogICAgICAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVyLm92ZXJyaWRlUHJlZmVyZW5jZShrZXksIHZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0VUX1hTU19BVURJVE9SX0VOQUJMRUQ6CisgICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuc2V0WFNTQXVkaXRvckVuYWJsZWQobXNnLmFyZzEgPT0gMSk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzc3LDcgKzM4NywxNSBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoKSB7Ci0gICAgICAgIG9idGFpbk1lc3NhZ2UoTEFZT1VUX0RVTVBfVEVYVCkuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIG9idGFpbk1lc3NhZ2UoTEFZT1VUX0RVTVBfVEVYVCwgMCkuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dChib29sZWFuIGVuYWJsZVBpeGVsVGVzdHMpIHsKKyAgICAgICAgb2J0YWluTWVzc2FnZShMQVlPVVRfRFVNUF9URVhULCBlbmFibGVQaXhlbFRlc3RzID8gMSA6IDApLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpIHsKKyAgICAgICAgb2J0YWluTWVzc2FnZShMQVlPVVRfRFVNUF9DSElMRF9GUkFNRVNfVEVYVCkuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZHVtcEJhY2tGb3J3YXJkTGlzdCgpIHsKQEAgLTQ5MiwxMCArNTEwLDIyIEBACiAgICAgICAgIG9idGFpbk1lc3NhZ2UoU0VUX0dFT0xPQ0FUSU9OX1BFUk1JU1NJT04sIGFsbG93ID8gMSA6IDAsIDApLnNlbmRUb1RhcmdldCgpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgLy8gQ29uZmlndXJhdGlvbiBpcyBpbiBXZWJLaXQsIHNvIHN0YXkgb24gV2ViQ29yZSB0aHJlYWQsIGJ1dCBnbyB2aWEgdGhlIFRlc3RTaGVsbEFjdGl2aXR5CisgICAgICAgIC8vIGFzIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBXZWJ2aWV3LgorICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKGNhblByb3ZpZGVBbHBoYSwgYWxwaGEsIGNhblByb3ZpZGVCZXRhLCBiZXRhLAorICAgICAgICAgICAgICAgIGNhblByb3ZpZGVHYW1tYSwgZ2FtbWEpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIG92ZXJyaWRlUHJlZmVyZW5jZShTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKSB7CiAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG9idGFpbk1lc3NhZ2UoT1ZFUlJJREVfUFJFRkVSRU5DRSk7CiAgICAgICAgIG1lc3NhZ2UuZ2V0RGF0YSgpLnB1dFN0cmluZygia2V5Iiwga2V5KTsKICAgICAgICAgbWVzc2FnZS5nZXREYXRhKCkucHV0Qm9vbGVhbigidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgIG1lc3NhZ2Uuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0WFNTQXVkaXRvckVuYWJsZWQoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIG9idGFpbk1lc3NhZ2UoU0VUX1hTU19BVURJVE9SX0VOQUJMRUQsIGZsYWcgPyAxIDogMCwgMCkuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZpbGVGaWx0ZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9GaWxlRmlsdGVyLmphdmEKaW5kZXggNzdmZDNlZC4uZGVhNTQ5YSAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZpbGVGaWx0ZXIuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRmlsZUZpbHRlci5qYXZhCkBAIC03Myw0MyArNzMsODYgQEAKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpZ25vcmVUZXN0TGlzdCA9IHsKICAgICAgICAgImVkaXRpbmcvc2VsZWN0aW9uL21vdmUtbGVmdC1yaWdodC5odG1sIiwgLy8gQ2F1c2VzIER1bXBSZW5kZXJUcmVlIHRvIGhhbmcKKyAgICAgICAgImZhc3QvanMvZXhjZXNzaXZlLWNvbW1hLXVzYWdlLmh0bWwiLCAvLyBUZXN0cyBodWdlIGluaXRpYWxpemVyIGxpc3QsIGNhdXNlcyBPT00uCiAgICAgICAgICJmYXN0L2pzL3JlZ2V4cC1jaGFyY2xhc3MtY3Jhc2guaHRtbCIsIC8vIFJlZ0V4cCBpcyB0b28gbGFyZ2UsIGNhdXNpbmcgT09NCiAgICAgICAgICJmYXN0L3JlZ2V4L3Rlc3QxLmh0bWwiLCAvLyBDYXVzZXMgRHVtcFJlbmRlclRyZWUgdG8gaGFuZyB3aXRoIFY4Ci0gICAgICAgICJmYXN0L3JlZ2V4L3Nsb3cuaHRtbCIgLy8gQ2F1c2VzIER1bXBSZW5kZXJUcmVlIHRvIGhhbmcgd2l0aCBWOAorICAgICAgICAiZmFzdC9yZWdleC9zbG93Lmh0bWwiLCAvLyBDYXVzZXMgRHVtcFJlbmRlclRyZWUgdG8gaGFuZyB3aXRoIFY4CisgICAgICAgICJpZXRlc3RjZW50ZXIvSmF2YXNjcmlwdC8xNS40LjQuMTUtMy0xNC5odG1sIiwgLy8gaGFuZ3MgdGhlIGxheW91dCB0ZXN0cworICAgICAgICAvLyBodHRwOi8vYi9pc3N1ZT9pZD0yODg5NTk1CisgICAgICAgICJpZXRlc3RjZW50ZXIvSmF2YXNjcmlwdC8xNS40LjQuMTUtMy0yOS5odG1sIiwgLy8gaGFuZ3MgdGhlIGxheW91dCB0ZXN0cworICAgICAgICAvLyBodHRwOi8vYi9pc3N1ZT9pZD0yODg5NTk2CisgICAgICAgICJpZXRlc3RjZW50ZXIvSmF2YXNjcmlwdC8xNS40LjQuMTUtMy04Lmh0bWwiLCAvLyBoYW5ncyB0aGUgbGF5b3V0IHRlc3RzCisgICAgICAgIC8vIGh0dHA6Ly9iL2lzc3VlP2lkPTI4ODk1OTgKKyAgICAgICAgImh0dHAvdGVzdHMveG1saHR0cHJlcXVlc3Qvc2ltcGxlLWNyb3NzLW9yaWdpbi1wcm9ncmVzcy1ldmVudHMuaHRtbCIsIC8vIHJ1bnMgd2ViY29yZSBpbnRvIGJhZCBzdGF0ZQorICAgICAgICAvLyBodHRwOi8vYi8yOTgyNTAwCisgICAgICAgICJjYW52YXMvcGhpbGlwL3Rlc3RzLzJkLmRyYXdJbWFnZS5icm9rZW4uaHRtbCIsIC8vIGJsb2NrcyB0ZXN0CisgICAgICAgIC8vIGh0dHA6Ly9iLzI5ODI1MDAKICAgICB9OwogCiAgICAgc3RhdGljIHZvaWQgZmlsbElnbm9yZVJlc3VsdExpc3QoKSB7Ci0gICAgICAgIC8vIFRoaXMgZmlyc3QgYmxvY2sgb2YgdGVzdHMgYXJlIGZvciBIVE1MNSBmZWF0dXJlcywgZm9yIHdoaWNoIEFuZHJvaWQKKyAgICAgICAgLy8gVGhpcyBmaXJzdCBibG9jayBvZiB0ZXN0cyBhcmUgZm9yIGZlYXR1cmVzIGZvciB3aGljaCBBbmRyb2lkCiAgICAgICAgIC8vIHNob3VsZCBwYXNzIGFsbCB0ZXN0cy4gVGhleSBhcmUgc2tpcHBlZCBvbmx5IHRlbXBvcmFyaWx5LgogICAgICAgICAvLyBUT0RPOiBGaXggdGhlc2UgZmFpbGluZyB0ZXN0cyBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGlzIGxpc3QuCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2VuY29kaW5nL2NoYXItZW5jb2RpbmcuaHRtbCIpOyAvLyBmYWlscyBpbiBKYXZhIEhUVFAgc3RhY2ssIHNlZSBodHRwOi8vYi9pc3N1ZT9pZD0zMDQ3MTU2CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2VuY29kaW5nL2NoYXItZGVjb2RpbmcuaHRtbCIpOyAvLyBmYWlscyBpbiBKYXZhIEhUVFAgc3RhY2ssIHNlZSBodHRwOi8vYi9pc3N1ZT9pZD0zMDQ3MTU2CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2VuY29kaW5nL2hhbmFyZWktYmxvZzMyLWZjMi1jb20uaHRtbCIpOyAvLyBmYWlscyBpbiBKYXZhIEhUVFAgc3RhY2ssIHNlZSBodHRwOi8vYi9pc3N1ZT9pZD0zMDQ2OTg2CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2VuY29kaW5nL21haWx0by1hbHdheXMtdXRmLTguaHRtbCIpOyAvLyBSZXF1aXJlcyB3YWl0Rm9yUG9saWN5RGVsZWdhdGUoKSwgc2VlIGh0dHA6Ly9iL2lzc3VlP2lkPTMwNDM0NjgKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZW5jb2RpbmcvcGVyY2VudC1lc2NhcGluZy5odG1sIik7IC8vIGZhaWxzIGluIEphdmEgSFRUUCBzdGFjaywgc2VlIGh0dHA6Ly9iL2lzc3VlP2lkPTMwNDY5ODQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImh0dHAvdGVzdHMvYXBwY2FjaGUvZW1wdHktbWFuaWZlc3QuaHRtbCIpOyAvLyBmbGFreQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy9hcHBjYWNoZS9mYWxsYmFjay5odG1sIik7IC8vIGh0dHA6Ly9iL2lzc3VlP2lkPTI3MTMwMDQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImh0dHAvdGVzdHMvYXBwY2FjaGUvZm9yZWlnbi1pZnJhbWUtbWFpbi5odG1sIik7IC8vIGZsYWt5IC0gc2tpcHMgc3RhdGVzCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL2FwcGNhY2hlL21hbmlmZXN0LXdpdGgtZW1wdHktZmlsZS5odG1sIik7IC8vIGZsYWt5CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL2FwcGNhY2hlL29yaWdpbi1xdW90YS5odG1sIik7IC8vIG5lZWRzIGNsZWFyQWxsQXBwbGljYXRpb25DYWNoZXMoKSwgc2VlIGh0dHA6Ly9iL2lzc3VlP2lkPTI5NDQxOTYKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvZGF0YWJhc2UtbG9jay1hZnRlci1yZWxvYWQuaHRtbCIpOyAvLyBTdWNjZWVkcyBidXQgRHVtcFJlbmRlclRyZWUgZG9lcyBub3QgcmVhZCByZXN1bHQgY29ycmVjdGx5CiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL2hhc2gtY2hhbmdlLXdpdGgteGhyLmh0bWwiKTsgLy8gU3VjY2VlZHMgYnV0IER1bXBSZW5kZXJUcmVlIGRvZXMgbm90IHJlYWQgcmVzdWx0IGNvcnJlY3RseQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9vcGVuLWRhdGFiYXNlLWNyZWF0aW9uLWNhbGxiYWNrLWlzb2xhdGVkLXdvcmxkLmh0bWwiKTsgLy8gUmVxdWlyZXMgbGF5b3V0VGVzdENvbnRyb2xsZXIuZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQoKQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9zdGF0ZW1lbnQtZXJyb3ItY2FsbGJhY2staXNvbGF0ZWQtd29ybGQuaHRtbCIpOyAvLyBSZXF1aXJlcyBsYXlvdXRUZXN0Q29udHJvbGxlci5ldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCgpCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL3N0YXRlbWVudC1zdWNjZXNzLWNhbGxiYWNrLWlzb2xhdGVkLXdvcmxkLmh0bWwiKTsgLy8gUmVxdWlyZXMgbGF5b3V0VGVzdENvbnRyb2xsZXIuZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQoKQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS90cmFuc2FjdGlvbi1jYWxsYmFjay1pc29sYXRlZC13b3JsZC5odG1sIik7IC8vIFJlcXVpcmVzIGxheW91dFRlc3RDb250cm9sbGVyLmV2YWx1YXRlU2NyaXB0SW5Jc29sYXRlZFdvcmxkKCkKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvdHJhbnNhY3Rpb24tZXJyb3ItY2FsbGJhY2staXNvbGF0ZWQtd29ybGQuaHRtbCIpOyAvLyBSZXF1aXJlcyBsYXlvdXRUZXN0Q29udHJvbGxlci5ldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCgpCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL3RyYW5zYWN0aW9uLXN1Y2Nlc3MtY2FsbGJhY2staXNvbGF0ZWQtd29ybGQuaHRtbCIpOyAvLyBSZXF1aXJlcyBsYXlvdXRUZXN0Q29udHJvbGxlci5ldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCgpCiAKLSAgICAgICAgLy8gV2lsbCBhbHdheXMgZmFpbAotICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3N2Zy9sZXZlbDMveHBhdGgiKTsgLy8gWFBhdGggbm90IHN1cHBvcnRlZAorICAgICAgICAvLyBFeHBlY3RlZCBmYWlsdXJlcyBkdWUgdG8gdW5zdXBwb3J0ZWQgZmVhdHVyZXMgb3IgdGVzdHMgdW5zdWl0YWJsZSBmb3IgQW5kcm9pZC4KKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZW5jb2RpbmcvY2hhci1kZWNvZGluZy1tYWMuaHRtbCIpOyAvLyBNYWMtc3BlY2lmaWMgZW5jb2RpbmdzIChhbHNvIG1hcmtlZCBXb24ndCBGaXggaW4gQ2hyb21pdW0sIGJ1ZyA3Mzg4KQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9lbmNvZGluZy9jaGFyLWVuY29kaW5nLW1hYy5odG1sIik7IC8vIE1hYy1zcGVjaWZpYyBlbmNvZGluZ3MgKGFsc28gbWFya2VkIFdvbid0IEZpeCBpbiBDaHJvbWl1bSwgYnVnIDczODgpCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2VuY29kaW5nL2lkbi1zZWN1cml0eS5odG1sIik7IC8vIE1hYy1zcGVjaWZpYyBJRE4gY2hlY2tzIChhbHNvIG1hcmtlZCBXb24ndCBGaXggaW4gQ2hyb21pdW0sIGJ1ZyAyMTgxNCkKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZXZlbnRzL3RvdWNoL2Jhc2ljLW11bHRpLXRvdWNoLWV2ZW50cy5odG1sIik7IC8vIFJlcXVpcmVzIG11bHRpLXRvdWNoIGdlc3R1cmVzIG5vdCBzdXBwb3J0ZWQgYnkgQW5kcm9pZCBzeXN0ZW0KKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZXZlbnRzL3RvdWNoL3RvdWNoLWNvb3Jkcy1pbi16b29tLWFuZC1zY3JvbGwuaHRtbCIpOyAvLyBSZXF1aXJlcyBldmVudFNlbmRlci56b29tUGFnZUluKCksem9vbVBhZ2VPdXQoKQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9ldmVudHMvdG91Y2gvdG91Y2gtdGFyZ2V0Lmh0bWwiKTsgLy8gUmVxdWlyZXMgbXVsdGktdG91Y2ggZ2VzdHVyZXMgbm90IHN1cHBvcnRlZCBieSBBbmRyb2lkIHN5c3RlbQogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC93b3JrZXJzIik7IC8vIHdvcmtlcnMgbm90IHN1cHBvcnRlZAotICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC94cGF0aCIpOyAvLyBYUGF0aCBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL2V2ZW50c291cmNlL3dvcmtlcnMiKTsgLy8gd29ya2VycyBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL3dvcmtlcnMiKTsgLy8gd29ya2VycyBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL3htbGh0dHByZXF1ZXN0L3dvcmtlcnMiKTsgLy8gd29ya2VycyBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL2RvbXN0b3JhZ2UvbG9jYWxzdG9yYWdlL3ByaXZhdGUtYnJvd3NpbmctYWZmZWN0cy1zdG9yYWdlLmh0bWwiKTsgLy8gcHJpdmF0ZSBicm93c2luZyBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL2RvbXN0b3JhZ2Uvc2Vzc2lvbnN0b3JhZ2UvcHJpdmF0ZS1icm93c2luZy1hZmZlY3RzLXN0b3JhZ2UuaHRtbCIpOyAvLyBwcml2YXRlIGJyb3dzaW5nIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvaW5kZXhlZGRiIik7IC8vIGluZGV4ZWRkYiBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL3ByaXZhdGUtYnJvd3NpbmctcmVhZG9ubHkuaHRtbCIpOyAvLyBwcml2YXRlIGJyb3dzaW5nIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoIndlYnNvY2tldC90ZXN0cy93b3JrZXJzIik7IC8vIHdvcmtlcnMgbm90IHN1cHBvcnRlZAogCisgICAgICAgIC8vIEV4cGVjdGVkIGZhaWx1cmVzIGR1ZSB0byBtaXNzaW5nIGV4cGVjdGVkIHJlc3VsdHMKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9jYW5vbmljYWxmb3JtMDgueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9jYW5vbmljYWxmb3JtMDkueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9kb2N1bWVudGdldGlucHV0ZW5jb2RpbmcwMy54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL2VudGl0eWdldGlucHV0ZW5jb2RpbmcwMi54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL2VudGl0eWdldHhtbHZlcnNpb24wMi54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVnZXRiYXNldXJpMDUueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlZ2V0YmFzZXVyaTA3LnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWdldGJhc2V1cmkwOS54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVnZXRiYXNldXJpMTAueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlZ2V0YmFzZXVyaTExLnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWdldGJhc2V1cmkxNS54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVnZXRiYXNldXJpMTcueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlZ2V0YmFzZXVyaTE4LnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWxvb2t1cG5hbWVzcGFjZXVyaTAxLnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWxvb2t1cHByZWZpeDE5LnhodG1sIik7CisKICAgICAgICAgLy8gVE9ETzogVGhlc2UgbmVlZCB0byBiZSB0cmlhZ2VkCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2Nzcy9jYXNlLXRyYW5zZm9ybS5odG1sIik7IC8vIHdpbGwgbm90IGZpeCAjNjE5NzA3CiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9FbGVtZW50L29mZnNldExlZnQtb2Zmc2V0VG9wLWJvZHktcXVpcmsuaHRtbCIpOyAvLyBkaWZmZXJlbnQgc2NyZWVuIHNpemUgcmVzdWx0IGluIGV4dHJhIHNwYWNlcyBpbiBBcHBsZSBjb21wYXJlZCB0byB1cwogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vV2luZG93L1BsdWctaW5zLmh0bWwiKTsgLy8gbmVlZCB0ZXN0IHBsdWdpbgotICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vV2luZG93L3dpbmRvdy1wcm9wZXJ0aWVzLmh0bWwiKTsgLy8geHNsdCBhbmQgeHBhdGggZWxlbWVudHMgbWlzc2luZyBmcm9tIHByb3BlcnR5IGxpc3QKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL1dpbmRvdy93aW5kb3ctc2NyZWVuLXByb3BlcnRpZXMuaHRtbCIpOyAvLyBwaXhlbCBkZXB0aAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vV2luZG93L3dpbmRvdy14eS1wcm9wZXJ0aWVzLmh0bWwiKTsgLy8gcmVxdWlyZXMgZXZlbnRTZW5kZXIubW91c2VEb3duKCksbW91c2VVcCgpCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9hdHRyaWJ1dGUtbmFtZXNwYWNlcy1nZXQtc2V0Lmh0bWwiKTsgLy8gaHR0cDovL2IvNzMzMjI5Ci0gICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9nYy05Lmh0bWwiKTsgLy8gcmVxdWlyZXMgeHBhdGggc3VwcG9ydAotICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vZ2xvYmFsLWNvbnN0cnVjdG9ycy5odG1sIik7IC8vIHJlcXVpcmVzIHhzbHQgYW5kIHhwYXRoIHN1cHBvcnQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL29iamVjdC1lbWJlZC1wbHVnaW4tc2NyaXB0aW5nLmh0bWwiKTsgLy8gZHluYW1pYyBwbHVnaW5zIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL3RhYmluZGV4LWNsYW1wLmh0bWwiKTsgLy8gdGhlcmUgaXMgZXh0cmEgc3BhY2luZyBpbiB0aGUgZmlsZSBkdWUgdG8gbXVsdGlwbGUgaW5wdXQgYm94ZXMgZml0dGluZyBvbiBvbmUgbGluZSBvbiBBcHBsZSwgb3VycyBhcmUgd3JhcHBlZC4gU3BhY2UgYXQgbGluZSBlbmRzIGFyZSBzdHJpcHBlZC4KICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZXZlbnRzL2FuY2hvci1pbWFnZS1zY3JvbGxlZC14LXkuaHRtbCIpOyAvLyByZXF1aXJlcyBldmVudFNlbmRlci5tb3VzZURvd24oKSxtb3VzZVVwKCkKQEAgLTE3Miw4ICsyMTUsNiBAQAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9yZXBsYWNlZC9pbWFnZS1tYXAuaHRtbCIpOyAvLyByZXF1aXJlcyBldmVudFNlbmRlci5tb3VzZURvd24oKSxtb3VzZVVwKCkKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvdGV4dC9wbGFpbi10ZXh0LWxpbmUtYnJlYWtzLmh0bWwiKTsgLy8gZXh0cmEgc3BhY2luZyBiZWNhdXNlIGlGcmFtZXMgcmVuZGVyZWQgbmV4dCB0byBlYWNoIG90aGVyIG9uIEFwcGxlCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJwcm9maWxlciIpOyAvLyBwcm9maWxlciBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdmciKTsgLy8gc3ZnIGlzIG5vdCBzdXBwb3J0ZWQKLQogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZzVXRpbHMuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9Gc1V0aWxzLmphdmEKaW5kZXggNmNmY2U0MS4uNWQzNGUyNSAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZzVXRpbHMuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRnNVdGlscy5qYXZhCkBAIC00OSw4ICs0OSwxMyBAQAogICAgICAgICAvL25vIGNyZWF0aW9uIG9mIGluc3RhbmNlcwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaW5kTGF5b3V0VGVzdHNSZWN1cnNpdmVseShCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MsCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHRlc3RzIGluIHRoZSBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IHdyaXRlTGF5b3V0VGVzdExpc3RSZWN1cnNpdmVseShCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MsCiAgICAgICAgICAgICBTdHJpbmcgZGlyLCBib29sZWFuIGlnbm9yZVJlc3VsdHNJbkRpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpbnQgdGVzdENvdW50ID0gMDsKICAgICAgICAgTG9nLnYoTE9HVEFHLCAiU2VhcmNoaW5nIHRlc3RzIHVuZGVyICIgKyBkaXIpOwogCiAgICAgICAgIEZpbGUgZCA9IG5ldyBGaWxlKGRpcik7CkBAIC02OCw3ICs3Myw3IEBACiAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSB0ZXN0IGRpcmVjdG9yeSwgd2UgZG9uJ3QgcmVjdXJzZSBpbnRvIGl0LgogICAgICAgICAgICAgICAgIGlmICghRmlsZUZpbHRlci5pc05vblRlc3REaXIocykpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiUmVjdXJzaW5nIG9uICIgKyBzKTsKLSAgICAgICAgICAgICAgICAgICAgZmluZExheW91dFRlc3RzUmVjdXJzaXZlbHkoYm9zLCBzLCBpZ25vcmVSZXN1bHRzSW5EaXIpOworICAgICAgICAgICAgICAgICAgICB0ZXN0Q291bnQgKz0gd3JpdGVMYXlvdXRUZXN0TGlzdFJlY3Vyc2l2ZWx5KGJvcywgcywgaWdub3JlUmVzdWx0c0luRGlyKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CkBAIC03OSw3ICs4NCw5IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICgocy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuaHRtbCIpIHx8IHMudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnhtbCIpKQorICAgICAgICAgICAgaWYgKChzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5odG1sIikKKyAgICAgICAgICAgICAgICAgICAgfHwgcy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIueG1sIikKKyAgICAgICAgICAgICAgICAgICAgfHwgcy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIueGh0bWwiKSkKICAgICAgICAgICAgICAgICAgICAgJiYgIXMuZW5kc1dpdGgoIlRFTVBMQVRFLmh0bWwiKSkgewogICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIlJlY29yZGluZyAiICsgcyk7CiAgICAgICAgICAgICAgICAgYm9zLndyaXRlKHMuZ2V0Qnl0ZXMoKSk7CkBAIC04OCw4ICs5NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICBib3Mud3JpdGUoKCIgSUdOT1JFX1JFU1VMVCIpLmdldEJ5dGVzKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBib3Mud3JpdGUoJ1xuJyk7CisgICAgICAgICAgICAgICAgdGVzdENvdW50Kys7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRlc3RDb3VudDsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlVGVzdFN0YXR1cyhTdHJpbmcgc3RhdHVzRmlsZSwgU3RyaW5nIHMpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0Q29udHJvbGxlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RDb250cm9sbGVyLmphdmEKaW5kZXggOTIzNjM0NS4uOWJlMmYxYyAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RDb250cm9sbGVyLmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RDb250cm9sbGVyLmphdmEKQEAgLTE4LDI5ICsxOCwzMCBAQAogCiBwdWJsaWMgaW50ZXJmYWNlIExheW91dFRlc3RDb250cm9sbGVyIHsKIAotCXB1YmxpYyB2b2lkIGR1bXBBc1RleHQoKTsKLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxEb25lKCk7Ci0JcHVibGljIHZvaWQgbm90aWZ5RG9uZSgpOwotCQotCS8vIEZvcmNlIGEgcmVkcmF3IG9mIHRoZSBwYWdlCi0JcHVibGljIHZvaWQgZGlzcGxheSgpOwotCS8vIFVzZWQgd2l0aCBwaXhlbCBkdW1wcyBvZiBjb250ZW50Ci0JcHVibGljIHZvaWQgdGVzdFJlcGFpbnQoKTsKLQkKLQkvLyBJZiB0aGUgcGFnZSB0aXRsZSBjaGFuZ2VzLCBhZGQgdGhlIGluZm9ybWF0aW9uIHRvIHRoZSBvdXRwdXQuCi0JcHVibGljIHZvaWQgZHVtcFRpdGxlQ2hhbmdlcygpOwotCXB1YmxpYyB2b2lkIGR1bXBCYWNrRm9yd2FyZExpc3QoKTsKLQlwdWJsaWMgdm9pZCBkdW1wQ2hpbGRGcmFtZVNjcm9sbFBvc2l0aW9ucygpOwotCXB1YmxpYyB2b2lkIGR1bXBFZGl0aW5nQ2FsbGJhY2tzKCk7Ci0JCi0JLy8gU2hvdy9IaWRlIHdpbmRvdyBmb3Igd2luZG93Lm9uQmx1cigpIHRlc3RpbmcKLQlwdWJsaWMgdm9pZCBzZXRXaW5kb3dJc0tleShib29sZWFuIGIpOwotCS8vIE1hYyBmdW5jdGlvbiwgdXNlZCB0byBkaXNhYmxlIGV2ZW50cyBnb2luZyB0byB0aGUgd2luZG93Ci0JcHVibGljIHZvaWQgc2V0TWFpbkZyYW1lSXNGaXJzdFJlc3BvbmRlcihib29sZWFuIGIpOwotCQotCXB1YmxpYyB2b2lkIGR1bXBTZWxlY3Rpb25SZWN0KCk7Ci0JCi0JLy8gaW52YWxpZGF0ZSBhbmQgZHJhdyBvbmUgbGluZSBhdCBhIHRpbWUgb2YgdGhlIHdlYiB2aWV3LgorICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoYm9vbGVhbiBlbmFibGVQaXhlbFRlc3RzKTsKKyAgICBwdWJsaWMgdm9pZCBkdW1wQ2hpbGRGcmFtZXNBc1RleHQoKTsKKyAgICBwdWJsaWMgdm9pZCB3YWl0VW50aWxEb25lKCk7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RG9uZSgpOworCisgICAgLy8gRm9yY2UgYSByZWRyYXcgb2YgdGhlIHBhZ2UKKyAgICBwdWJsaWMgdm9pZCBkaXNwbGF5KCk7CisgICAgLy8gVXNlZCB3aXRoIHBpeGVsIGR1bXBzIG9mIGNvbnRlbnQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwYWludCgpOworCisgICAgLy8gSWYgdGhlIHBhZ2UgdGl0bGUgY2hhbmdlcywgYWRkIHRoZSBpbmZvcm1hdGlvbiB0byB0aGUgb3V0cHV0LgorICAgIHB1YmxpYyB2b2lkIGR1bXBUaXRsZUNoYW5nZXMoKTsKKyAgICBwdWJsaWMgdm9pZCBkdW1wQmFja0ZvcndhcmRMaXN0KCk7CisgICAgcHVibGljIHZvaWQgZHVtcENoaWxkRnJhbWVTY3JvbGxQb3NpdGlvbnMoKTsKKyAgICBwdWJsaWMgdm9pZCBkdW1wRWRpdGluZ0NhbGxiYWNrcygpOworCisgICAgLy8gU2hvdy9IaWRlIHdpbmRvdyBmb3Igd2luZG93Lm9uQmx1cigpIHRlc3RpbmcKKyAgICBwdWJsaWMgdm9pZCBzZXRXaW5kb3dJc0tleShib29sZWFuIGIpOworICAgIC8vIE1hYyBmdW5jdGlvbiwgdXNlZCB0byBkaXNhYmxlIGV2ZW50cyBnb2luZyB0byB0aGUgd2luZG93CisgICAgcHVibGljIHZvaWQgc2V0TWFpbkZyYW1lSXNGaXJzdFJlc3BvbmRlcihib29sZWFuIGIpOworCisgICAgcHVibGljIHZvaWQgZHVtcFNlbGVjdGlvblJlY3QoKTsKKworICAgIC8vIGludmFsaWRhdGUgYW5kIGRyYXcgb25lIGxpbmUgYXQgYSB0aW1lIG9mIHRoZSB3ZWIgdmlldy4KICAgICBwdWJsaWMgdm9pZCByZXBhaW50U3dlZXBIb3Jpem9udGFsbHkoKTsKICAgICAKICAgICAvLyBIaXN0b3J5IHRlc3RpbmcgZnVuY3Rpb25zCkBAIC02Nyw0ICs2OCwxMSBAQAogICAgIHB1YmxpYyB2b2lkIHNldEdlb2xvY2F0aW9uUGVybWlzc2lvbihib29sZWFuIGFsbG93KTsKIAogICAgIHB1YmxpYyB2b2lkIG92ZXJyaWRlUHJlZmVyZW5jZShTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKTsKKworICAgIC8vIEZvciBYU1NBdWRpdG9yIHRlc3RzCisgICAgcHVibGljIHZvaWQgc2V0WFNTQXVkaXRvckVuYWJsZWQoYm9vbGVhbiBmbGFnKTsKKworICAgIC8vIEZvciBEZXZpY2VPcmllbnRhdGlvbiB0ZXN0cworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RzQXV0b1Rlc3QuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0c0F1dG9UZXN0LmphdmEKaW5kZXggOWNjZjU0OS4uMTMyZjE3YSAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RzQXV0b1Rlc3QuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdHNBdXRvVGVzdC5qYXZhCkBAIC0yMCw5ICsyMCw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUuZm9yd2FyZGVyLkFkYlV0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlLmZvcndhcmRlci5Gb3J3YXJkU2VydmljZTsKIAotaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CkBAIC0xNTgsMTggKzE1NiwxMSBAQAogICAgIHByaXZhdGUgU3RyaW5nIG1Kc0VuZ2luZTsKICAgICBwcml2YXRlIFN0cmluZyBtVGVzdFBhdGhQcmVmaXg7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1GaW5pc2hlZDsKKyAgICBwcml2YXRlIGludCBtVGVzdENvdW50OworICAgIHByaXZhdGUgaW50IG1SZXN1bWVJbmRleDsKIAogICAgIHB1YmxpYyBMYXlvdXRUZXN0c0F1dG9UZXN0KCkgewotICAgICAgc3VwZXIoImNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlIiwgVGVzdFNoZWxsQWN0aXZpdHkuY2xhc3MpOwotICAgIH0KLQotICAgIC8vIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSByZXN1bHQgb2YgdGhlIGxheW91dCB0ZXN0IHRvCi0gICAgLy8gQW0gc3RhdHVzIHNvIHRoYXQgaXQgY2FuIGJlIHBpY2tlZCB1cCBmcm9tIGEgc2NyaXB0LgotICAgIHByaXZhdGUgdm9pZCBwYXNzT3JGYWlsQ2FsbGJhY2soU3RyaW5nIGZpbGUsIGJvb2xlYW4gcmVzdWx0KSB7Ci0gICAgICBJbnN0cnVtZW50YXRpb24gaW5zdCA9IGdldEluc3RydW1lbnRhdGlvbigpOwotICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgIGJ1bmRsZS5wdXRCb29sZWFuKGZpbGUsIHJlc3VsdCk7Ci0gICAgICBpbnN0LnNlbmRTdGF0dXMoMCwgYnVuZGxlKTsKKyAgICAgIHN1cGVyKFRlc3RTaGVsbEFjdGl2aXR5LmNsYXNzKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZ2V0VGVzdExpc3QoKSB7CkBAIC0xOTAsNiArMTgxLDcgQEAKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKExPR1RBRywgIkVycm9yIHdoaWxlIHJlYWRpbmcgdGVzdCBsaXN0IDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgfQorICAgICAgICBtVGVzdENvdW50ID0gbVRlc3RMaXN0LnNpemUoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVzdW1lVGVzdExpc3QoKSB7CkBAIC0yMDAsNiArMTkyLDcgQEAKICAgICAgICAgICAgICAgICBpZiAobVRlc3RMaXN0LmVsZW1lbnRBdChpKS5lcXVhbHMobGluZSkpIHsKICAgICAgICAgICAgICAgICAgICAgbVRlc3RMaXN0ID0gbmV3IFZlY3RvcjxTdHJpbmc+KG1UZXN0TGlzdC5zdWJMaXN0KGkrMSwgbVRlc3RMaXN0LnNpemUoKSkpOwogICAgICAgICAgICAgICAgICAgICBtVGVzdExpc3RJZ25vcmVSZXN1bHQgPSBuZXcgVmVjdG9yPEJvb2xlYW4+KG1UZXN0TGlzdElnbm9yZVJlc3VsdC5zdWJMaXN0KGkrMSwgbVRlc3RMaXN0SWdub3JlUmVzdWx0LnNpemUoKSkpOworICAgICAgICAgICAgICAgICAgICBtUmVzdW1lSW5kZXggPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjMyLDE0ICsyMjUsMjIgQEAKICAgICAgICAgLy8gVGhlIGdlbmVyaWMgcmVzdWx0IGlzIGF0IDxwYXRoPi88bmFtZT4tZXhwZWN0ZWQudHh0CiAgICAgICAgIC8vIEZpcnN0IHRyeSB0aGUgQW5kcm9pZC1zcGVjaWZpYyByZXN1bHQgYXQKICAgICAgICAgLy8gcGxhdGZvcm0vYW5kcm9pZC08anMtZW5naW5lPi88cGF0aD4vPG5hbWU+LWV4cGVjdGVkLnR4dAorICAgICAgICAvLyB0aGVuCisgICAgICAgIC8vIHBsYXRmb3JtL2FuZHJvaWQvPHBhdGg+LzxuYW1lPi1leHBlY3RlZC50eHQKICAgICAgICAgaW50IHBvcyA9IHRlc3QubGFzdEluZGV4T2YoJy4nKTsKICAgICAgICAgaWYgKHBvcyA9PSAtMSkKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICBTdHJpbmcgZ2VuZXJpY0V4cGVjdGVkUmVzdWx0ID0gdGVzdC5zdWJzdHJpbmcoMCwgcG9zKSArICItZXhwZWN0ZWQudHh0IjsKICAgICAgICAgU3RyaW5nIGFuZHJvaWRFeHBlY3RlZFJlc3VsdHNEaXIgPSAicGxhdGZvcm0vYW5kcm9pZC0iICsgbUpzRW5naW5lICsgIi8iOwotICAgICAgICBTdHJpbmcgYW5kcm9pZEV4cGVjdGVkUmVzdWx0ID0KLSAgICAgICAgICAgIGdlbmVyaWNFeHBlY3RlZFJlc3VsdC5yZXBsYWNlRmlyc3QoTEFZT1VUX1RFU1RTX1JPT1QsIExBWU9VVF9URVNUU19ST09UICsgYW5kcm9pZEV4cGVjdGVkUmVzdWx0c0Rpcik7CisgICAgICAgIFN0cmluZyBhbmRyb2lkRXhwZWN0ZWRSZXN1bHQgPSBnZW5lcmljRXhwZWN0ZWRSZXN1bHQucmVwbGFjZUZpcnN0KExBWU9VVF9URVNUU19ST09ULAorICAgICAgICAgICAgICAgIExBWU9VVF9URVNUU19ST09UICsgYW5kcm9pZEV4cGVjdGVkUmVzdWx0c0Rpcik7CiAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGFuZHJvaWRFeHBlY3RlZFJlc3VsdCk7CisgICAgICAgIGlmIChmLmV4aXN0cygpKQorICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWRFeHBlY3RlZFJlc3VsdDsKKyAgICAgICAgYW5kcm9pZEV4cGVjdGVkUmVzdWx0c0RpciA9ICJwbGF0Zm9ybS9hbmRyb2lkLyI7CisgICAgICAgIGFuZHJvaWRFeHBlY3RlZFJlc3VsdCA9IGdlbmVyaWNFeHBlY3RlZFJlc3VsdC5yZXBsYWNlRmlyc3QoTEFZT1VUX1RFU1RTX1JPT1QsCisgICAgICAgICAgICAgICAgTEFZT1VUX1RFU1RTX1JPT1QgKyBhbmRyb2lkRXhwZWN0ZWRSZXN1bHRzRGlyKTsKKyAgICAgICAgZiA9IG5ldyBGaWxlKGFuZHJvaWRFeHBlY3RlZFJlc3VsdCk7CiAgICAgICAgIHJldHVybiBmLmV4aXN0cygpID8gYW5kcm9pZEV4cGVjdGVkUmVzdWx0IDogZ2VuZXJpY0V4cGVjdGVkUmVzdWx0OwogICAgIH0KIApAQCAtMzAwLDcgKzMwMSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgcnVuVGVzdEFuZFdhaXRVbnRpbERvbmUoVGVzdFNoZWxsQWN0aXZpdHkgYWN0aXZpdHksIFN0cmluZyB0ZXN0LCBpbnQgdGltZW91dCwgYm9vbGVhbiBpZ25vcmVSZXN1bHQpIHsKKyAgICBwcml2YXRlIHZvaWQgcnVuVGVzdEFuZFdhaXRVbnRpbERvbmUoVGVzdFNoZWxsQWN0aXZpdHkgYWN0aXZpdHksIFN0cmluZyB0ZXN0LCBpbnQgdGltZW91dCwgYm9vbGVhbiBpZ25vcmVSZXN1bHQsIGludCB0ZXN0TnVtYmVyKSB7CiAgICAgICAgIGFjdGl2aXR5LnNldENhbGxiYWNrKG5ldyBUZXN0U2hlbGxDYWxsYmFjaygpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZpbmlzaGVkKCkgewogICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoTGF5b3V0VGVzdHNBdXRvVGVzdC50aGlzKSB7CkBAIC0zMzYsNiArMzM3LDkgQEAKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRFU1RfVVJMLCBGc1V0aWxzLmdldFRlc3RVcmwodGVzdCkpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuUkVTVUxUX0ZJTEUsIHJlc3VsdEZpbGUpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVElNRU9VVF9JTl9NSUxMSVMsIHRpbWVvdXQpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVE9UQUxfVEVTVF9DT1VOVCwgbVRlc3RDb3VudCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5DVVJSRU5UX1RFU1RfTlVNQkVSLCB0ZXN0TnVtYmVyKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlNUT1BfT05fUkVGX0VSUk9SLCB0cnVlKTsKICAgICAgICAgYWN0aXZpdHkuc3RhcnRBY3Rpdml0eShpbnRlbnQpOwogCiAgICAgICAgIC8vIFdhaXQgdW50aWwgZG9uZS4KQEAgLTM3NSw4ICszNzksOCBAQAogICAgICAgICAvLyBSZWFkIHNldHRpbmdzCiAgICAgICAgIG1UZXN0UGF0aFByZWZpeCA9IChuZXcgRmlsZShMQVlPVVRfVEVTVFNfUk9PVCArIHJ1bm5lci5tVGVzdFBhdGgpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKICAgICAgICAgbVJlYmFzZWxpbmVSZXN1bHRzID0gcnVubmVyLm1SZWJhc2VsaW5lOwotICAgICAgICAvLyBKU0MgaXMgdGhlIGRlZmF1bHQgSmF2YVNjcmlwdCBlbmdpbmUuCi0gICAgICAgIG1Kc0VuZ2luZSA9IHJ1bm5lci5tSnNFbmdpbmUgPT0gbnVsbCA/ICJqc2MiIDogcnVubmVyLm1Kc0VuZ2luZTsKKyAgICAgICAgLy8gVjggaXMgdGhlIGRlZmF1bHQgSmF2YVNjcmlwdCBlbmdpbmUuCisgICAgICAgIG1Kc0VuZ2luZSA9IHJ1bm5lci5tSnNFbmdpbmUgPT0gbnVsbCA/ICJ2OCIgOiBydW5uZXIubUpzRW5naW5lOwogCiAgICAgICAgIGludCB0aW1lb3V0ID0gcnVubmVyLm1UaW1lb3V0SW5NaWxsaXM7CiAgICAgICAgIGlmICh0aW1lb3V0IDw9IDApIHsKQEAgLTM5Myw3ICszOTcsNyBAQAogICAgICAgICAgICAgcmVzdW1lVGVzdExpc3QoKTsKIAogICAgICAgICBUZXN0U2hlbGxBY3Rpdml0eSBhY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7Ci0gICAgICAgIGFjdGl2aXR5LnNldERlZmF1bHREdW1wRGF0YVR5cGUoRHVtcERhdGFUeXBlLkRVTVBfQVNfVEVYVCk7CisgICAgICAgIGFjdGl2aXR5LnNldERlZmF1bHREdW1wRGF0YVR5cGUoRHVtcERhdGFUeXBlLkVYVF9SRVBSKTsKIAogICAgICAgICAvLyBSdW4gdGVzdHMuCiAgICAgICAgIGludCBhZGRyID0gLTE7CkBAIC00MTAsNyArNDE0LDkgQEAKICAgICAgICAgICAgIGJvb2xlYW4gaWdub3JlUmVzdWx0ID0gbVRlc3RMaXN0SWdub3JlUmVzdWx0LmVsZW1lbnRBdChpKTsKICAgICAgICAgICAgIEZzVXRpbHMudXBkYXRlVGVzdFN0YXR1cyhURVNUX1NUQVRVU19GSUxFLCBzKTsKICAgICAgICAgICAgIC8vIFJ1biB0ZXN0cwotICAgICAgICAgICAgcnVuVGVzdEFuZFdhaXRVbnRpbERvbmUoYWN0aXZpdHksIHMsIHJ1bm5lci5tVGltZW91dEluTWlsbGlzLCBpZ25vcmVSZXN1bHQpOworICAgICAgICAgICAgLy8gaSBpcyAwIGJhc2VkLCBidXQgdGVzdCBjb3VudCBpcyAxIGJhc2VkIHNvIGFkZCAxIHRvIGkgaGVyZS4KKyAgICAgICAgICAgIHJ1blRlc3RBbmRXYWl0VW50aWxEb25lKGFjdGl2aXR5LCBzLCBydW5uZXIubVRpbWVvdXRJbk1pbGxpcywgaWdub3JlUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICBpICsgMSArIG1SZXN1bWVJbmRleCk7CiAgICAgICAgIH0KIAogICAgICAgICBGc1V0aWxzLnVwZGF0ZVRlc3RTdGF0dXMoVEVTVF9TVEFUVVNfRklMRSwgIiNET05FIik7CkBAIC00MzUsNyArNDQxLDcgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEZpbGUgdGVzdHNfbGlzdCA9IG5ldyBGaWxlKExBWU9VVF9URVNUU19MSVNUX0ZJTEUpOwogICAgICAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlc3RzX2xpc3QsIGZhbHNlKSk7Ci0gICAgICAgICAgICBGc1V0aWxzLmZpbmRMYXlvdXRUZXN0c1JlY3Vyc2l2ZWx5KGJvcywgZ2V0VGVzdFBhdGgoKSwgZmFsc2UpOyAvLyBEb24ndCBpZ25vcmUgcmVzdWx0cworICAgICAgICAgICAgRnNVdGlscy53cml0ZUxheW91dFRlc3RMaXN0UmVjdXJzaXZlbHkoYm9zLCBnZXRUZXN0UGF0aCgpLCBmYWxzZSk7IC8vIERvbid0IGlnbm9yZSByZXN1bHRzCiAgICAgICAgICAgICBib3MuZmx1c2goKTsKICAgICAgICAgICAgIGJvcy5jbG9zZSgpOwogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTWVudS5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL01lbnUuamF2YQppbmRleCA5YzRiNTcyNTYuLjBiMDBkNjUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9NZW51LmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL01lbnUuamF2YQpAQCAtNTMsMjkgKzUzLDM4IEBACiAgICAgICAgIGludGVudC5zZXRDbGFzcyh0aGlzLCBUZXN0U2hlbGxBY3Rpdml0eS5jbGFzcyk7CiAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9TSU5HTEVfVE9QKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRFU1RfVVJMLCAiZmlsZTovLyIgKyBmaWxlbmFtZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5UT1RBTF9URVNUX0NPVU5ULCAxKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LkNVUlJFTlRfVEVTVF9OVU1CRVIsIDEpOwogICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgdm9pZCBwcm9jZXNzRGlyZWN0b3J5KFN0cmluZyBwYXRoLCBib29sZWFuIHNlbGVjdGlvbikgewotICAgICAgICBnZW5lcmF0ZVRlc3RMaXN0KHBhdGgpOworICAgICAgICBpbnQgdGVzdENvdW50ID0gZ2VuZXJhdGVUZXN0TGlzdChwYXRoKTsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9WSUVXKTsKICAgICAgICAgaW50ZW50LnNldENsYXNzKHRoaXMsIFRlc3RTaGVsbEFjdGl2aXR5LmNsYXNzKTsKICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX1NJTkdMRV9UT1ApOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVUlfQVVUT19URVNULCBMQVlPVVRfVEVTVFNfTElTVF9GSUxFKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRPVEFMX1RFU1RfQ09VTlQsIHRlc3RDb3VudCk7CisgICAgICAgIC8vIFRlc3RTaGVsbEFjdGl2aXR5IHdpbGwgcHJvY2VzcyB0aGlzIGludGVudCBvbmNlIGFuZCBpbmNyZW1lbnQgdGhlIHRlc3QgaW5kZXgKKyAgICAgICAgLy8gYmVmb3JlIHJ1bm5pbmcgdGhlIGZpcnN0IHRlc3QsIHNvIHBhc3MgMCBoZXJlIHRvIGFsbG93IGZvciB0aGF0LgorICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuQ1VSUkVOVF9URVNUX05VTUJFUiwgMCk7CiAgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVUZXN0TGlzdChTdHJpbmcgcGF0aCkgeworICAgIHByaXZhdGUgaW50IGdlbmVyYXRlVGVzdExpc3QoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgaW50IHRlc3RDb3VudCA9IDA7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBGaWxlIHRlc3RzX2xpc3QgPSBuZXcgRmlsZShMQVlPVVRfVEVTVFNfTElTVF9GSUxFKTsKICAgICAgICAgICAgIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZXN0c19saXN0LCBmYWxzZSkpOwotICAgICAgICAgICAgRnNVdGlscy5maW5kTGF5b3V0VGVzdHNSZWN1cnNpdmVseShib3MsIHBhdGgsIGZhbHNlKTsgLy8gRG9uJ3QgaWdub3JlIHJlc3VsdHMKKyAgICAgICAgICAgIHRlc3RDb3VudCA9IEZzVXRpbHMud3JpdGVMYXlvdXRUZXN0TGlzdFJlY3Vyc2l2ZWx5KAorICAgICAgICAgICAgICAgICAgICBib3MsIHBhdGgsIGZhbHNlKTsgLy8gRG9uJ3QgaWdub3JlIHJlc3VsdHMKICAgICAgICAgICAgIGJvcy5mbHVzaCgpOwogICAgICAgICAgICAgYm9zLmNsb3NlKCk7CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiRXJyb3Igd2hlbiBjcmVhdGluZyB0ZXN0IGxpc3Q6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgfQorICAgICAgIHJldHVybiB0ZXN0Q291bnQ7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvVGVzdFNoZWxsQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9UZXN0U2hlbGxBY3Rpdml0eS5qYXZhCmluZGV4IDc0NzU3MTkuLjE5ODE1ZmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9UZXN0U2hlbGxBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9UZXN0U2hlbGxBY3Rpdml0eS5qYXZhCkBAIC0zNSw2ICszNSw4IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2Via2l0LkNvbnNvbGVNZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQud2Via2l0Lkdlb2xvY2F0aW9uUGVybWlzc2lvbnM7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuSHR0cEF1dGhIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LkpzUHJvbXB0UmVzdWx0OwpAQCAtNTUsNiArNTcsNyBAQAogaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIApAQCAtOTksNiArMTAyLDggQEAKICAgICAgICAgTG9nLnYoTE9HVEFHLCAibWVzc2FnZSBzZW50IHRvIFdlYlZpZXcgdG8gZHVtcCB0ZXh0LiIpOwogICAgICAgICBzd2l0Y2ggKG1EdW1wRGF0YVR5cGUpIHsKICAgICAgICAgICAgIGNhc2UgRFVNUF9BU19URVhUOgorICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFyZzEgPSBtRHVtcFRvcEZyYW1lQXNUZXh0ID8gMSA6IDA7CisgICAgICAgICAgICAgICAgY2FsbGJhY2suYXJnMiA9IG1EdW1wQ2hpbGRGcmFtZXNBc1RleHQgPyAxIDogMDsKICAgICAgICAgICAgICAgICBtV2ViVmlldy5kb2N1bWVudEFzVGV4dChjYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEVYVF9SRVBSOgpAQCAtMTE3LDYgKzEyMiw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworICAgICAgICByZXF1ZXN0V2luZG93RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9QUk9HUkVTUyk7CiAKICAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRlbnRWaWV3ID0gbmV3IExpbmVhckxheW91dCh0aGlzKTsKICAgICAgICAgY29udGVudFZpZXcuc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKQEAgLTEzOSwxMiArMTQ1LDE5IEBACiAgICAgICAgIC8vIFdlYlZpZXc6OnNldEpzRmxhZ3MgaXMgbm9vcCBpbiBKU0MgYnVpbGQuCiAgICAgICAgIG1XZWJWaWV3LnNldEpzRmxhZ3MoIi0tZXhwb3NlX2djIik7CiAKKyAgICAgICAgLy8gQWx3YXlzIHNlbmQgbXVsdGl0b3VjaCBldmVudHMgdG8gV2Via2l0IHNpbmNlIHRoZSBsYXlvdXQgdGVzdAorICAgICAgICAvLyBpcyBvbmx5IGZvciB0aGUgV2Via2l0IG5vdCB0aGUgYnJvd3NlcidzIFVJLgorICAgICAgICBtV2ViVmlldy5zZXREZWZlck11bHRpVG91Y2godHJ1ZSk7CisKICAgICAgICAgbUhhbmRsZXIgPSBuZXcgQXN5bmNIYW5kbGVyKCk7CiAKICAgICAgICAgSW50ZW50IGludGVudCA9IGdldEludGVudCgpOwogICAgICAgICBpZiAoaW50ZW50ICE9IG51bGwpIHsKICAgICAgICAgICAgIGV4ZWN1dGVJbnRlbnQoaW50ZW50KTsKICAgICAgICAgfQorCisgICAgICAgIC8vIFRoaXMgaXMgYXN5bmNocm9ub3VzLCBidXQgaXQgZ2V0cyBwcm9jZXNzZWQgYnkgV2ViQ29yZSBiZWZvcmUgaXQgc3RhcnRzIGxvYWRpbmcgcGFnZXMuCisgICAgICAgIG1XZWJWaWV3LnVzZU1vY2tEZXZpY2VPcmllbnRhdGlvbigpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTU5LDYgKzE3Miw5IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAorICAgICAgICBtVG90YWxUZXN0Q291bnQgPSBpbnRlbnQuZ2V0SW50RXh0cmEoVE9UQUxfVEVTVF9DT1VOVCwgbVRvdGFsVGVzdENvdW50KTsKKyAgICAgICAgbUN1cnJlbnRUZXN0TnVtYmVyID0gaW50ZW50LmdldEludEV4dHJhKENVUlJFTlRfVEVTVF9OVU1CRVIsIG1DdXJyZW50VGVzdE51bWJlcik7CisKICAgICAgICAgbVRlc3RVcmwgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoVEVTVF9VUkwpOwogICAgICAgICBpZiAobVRlc3RVcmwgPT0gbnVsbCkgewogICAgICAgICAgICAgbVVpQXV0b1Rlc3RQYXRoID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFVJX0FVVE9fVEVTVCk7CkBAIC0xNzIsNiArMTg4LDExIEBACiAgICAgICAgIG1UaW1lb3V0SW5NaWxsaXMgPSBpbnRlbnQuZ2V0SW50RXh0cmEoVElNRU9VVF9JTl9NSUxMSVMsIDApOwogICAgICAgICBtR2V0RHJhd3RpbWUgPSBpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKEdFVF9EUkFXX1RJTUUsIGZhbHNlKTsKICAgICAgICAgbVNhdmVJbWFnZVBhdGggPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoU0FWRV9JTUFHRSk7CisgICAgICAgIG1TdG9wT25SZWZFcnJvciA9IGludGVudC5nZXRCb29sZWFuRXh0cmEoU1RPUF9PTl9SRUZfRVJST1IsIGZhbHNlKTsKKyAgICAgICAgc2V0VGl0bGUoIlRlc3QgIiArIG1DdXJyZW50VGVzdE51bWJlciArICIgb2YgIiArIG1Ub3RhbFRlc3RDb3VudCk7CisgICAgICAgIGZsb2F0IHJhdGlvID0gKGZsb2F0KW1DdXJyZW50VGVzdE51bWJlciAvIG1Ub3RhbFRlc3RDb3VudDsKKyAgICAgICAgaW50IHByb2dyZXNzID0gKGludCkocmF0aW8gKiBXaW5kb3cuUFJPR1JFU1NfRU5EKTsKKyAgICAgICAgZ2V0V2luZG93KCkuc2V0RmVhdHVyZUludChXaW5kb3cuRkVBVFVSRV9QUk9HUkVTUywgcHJvZ3Jlc3MpOwogCiAgICAgICAgIExvZy52KExPR1RBRywgIiAgTG9hZGluZyAiICsgbVRlc3RVcmwpOwogICAgICAgICBtV2ViVmlldy5sb2FkVXJsKG1UZXN0VXJsKTsKQEAgLTIzNyw2ICsyNTgsNyBAQAogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZJRVcpOwogICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfU0lOR0xFX1RPUCk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5URVNUX1VSTCwgRnNVdGlscy5nZXRUZXN0VXJsKHVybCkpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuQ1VSUkVOVF9URVNUX05VTUJFUiwgKyttQ3VycmVudFRlc3ROdW1iZXIpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoVElNRU9VVF9JTl9NSUxMSVMsIDEwMDAwKTsKICAgICAgICAgZXhlY3V0ZUludGVudChpbnRlbnQpOwogICAgIH0KQEAgLTMyOSwxNCArMzUxLDI5IEBACiAKICAgICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KICAgICAvLyBMYXlvdXRUZXN0Q29udHJvbGxlciBGdW5jdGlvbnMKLSAgICBwdWJsaWMgdm9pZCBkdW1wQXNUZXh0KCkgeworICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoYm9vbGVhbiBlbmFibGVQaXhlbFRlc3RzKSB7CisgICAgICAgIC8vIEFkZGVkIGFmdGVyIHdlYmtpdCB1cGRhdGUgdG8gcjYzODU5LiBTZWUgdHJhYy53ZWJraXQub3JnL2NoYW5nZXNldC82MzczMC4KKyAgICAgICAgaWYgKGVuYWJsZVBpeGVsVGVzdHMpIHsKKyAgICAgICAgICAgIExvZy52KExPR1RBRywgImR1bXBBc1RleHQoZW5hYmxlUGl4ZWxUZXN0cyA9PSB0cnVlKSBub3QgaW1wbGVtZW50ZWQgb24gQW5kcm9pZCEiKTsKKyAgICAgICAgfQorCiAgICAgICAgIG1EdW1wRGF0YVR5cGUgPSBEdW1wRGF0YVR5cGUuRFVNUF9BU19URVhUOworICAgICAgICBtRHVtcFRvcEZyYW1lQXNUZXh0ID0gdHJ1ZTsKICAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwpIHsKICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtV2ViVmlldy5nZXRVcmwoKTsKICAgICAgICAgICAgIExvZy52KExPR1RBRywgImR1bXBBc1RleHQgY2FsbGVkOiAiK3VybCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBkdW1wQ2hpbGRGcmFtZXNBc1RleHQoKSB7CisgICAgICAgIG1EdW1wRGF0YVR5cGUgPSBEdW1wRGF0YVR5cGUuRFVNUF9BU19URVhUOworICAgICAgICBtRHVtcENoaWxkRnJhbWVzQXNUZXh0ID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1XZWJWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtV2ViVmlldy5nZXRVcmwoKTsKKyAgICAgICAgICAgIExvZy52KExPR1RBRywgImR1bXBDaGlsZEZyYW1lc0FzVGV4dCBjYWxsZWQ6ICIrdXJsKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHdhaXRVbnRpbERvbmUoKSB7CiAgICAgICAgIG1XYWl0VW50aWxEb25lID0gdHJ1ZTsKICAgICAgICAgU3RyaW5nIHVybCA9IG1XZWJWaWV3LmdldFVybCgpOwpAQCAtMzQ4LDcgKzM4NSw5IEBACiAgICAgICAgIExvZy52KExPR1RBRywgIm5vdGlmeURvbmUgY2FsbGVkOiAiICsgdXJsKTsKICAgICAgICAgaWYgKG1XYWl0VW50aWxEb25lKSB7CiAgICAgICAgICAgICBtV2FpdFVudGlsRG9uZSA9IGZhbHNlOwotICAgICAgICAgICAgbUNocm9tZUNsaWVudC5vblByb2dyZXNzQ2hhbmdlZChtV2ViVmlldywgMTAxKTsKKyAgICAgICAgICAgIGlmICghbVJlcXVlc3RlZFdlYktpdERhdGEgJiYgIW1UaW1lZE91dCAmJiAhZmluaXNoZWQoKSkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RXZWJLaXREYXRhKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ1OSw4ICs0OTgsMjUgQEAKICAgICAgKiBTZXRzIHRoZSBHZW9sb2NhdGlvbiBwZXJtaXNzaW9uIHN0YXRlIHRvIGJlIHVzZWQgZm9yIGFsbCBmdXR1cmUgcmVxdWVzdHMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0R2VvbG9jYXRpb25QZXJtaXNzaW9uKGJvb2xlYW4gYWxsb3cpIHsKLSAgICAgICAgbUdlb2xvY2F0aW9uUGVybWlzc2lvblNldCA9IHRydWU7CisgICAgICAgIG1Jc0dlb2xvY2F0aW9uUGVybWlzc2lvblNldCA9IHRydWU7CiAgICAgICAgIG1HZW9sb2NhdGlvblBlcm1pc3Npb24gPSBhbGxvdzsKKworICAgICAgICBpZiAobVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrIGNhbGxiYWNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgb3JpZ2luID0gKFN0cmluZykgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MuZ2V0KGNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5pbnZva2Uob3JpZ2luLCBtR2VvbG9jYXRpb25QZXJtaXNzaW9uLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrRGV2aWNlT3JpZW50YXRpb24oYm9vbGVhbiBjYW5Qcm92aWRlQWxwaGEsIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsIGRvdWJsZSBiZXRhLCBib29sZWFuIGNhblByb3ZpZGVHYW1tYSwgZG91YmxlIGdhbW1hKSB7CisgICAgICAgIG1XZWJWaWV3LnNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihjYW5Qcm92aWRlQWxwaGEsIGFscGhhLCBjYW5Qcm92aWRlQmV0YSwgYmV0YSwKKyAgICAgICAgICAgICAgICBjYW5Qcm92aWRlR2FtbWEsIGdhbW1hKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvdmVycmlkZVByZWZlcmVuY2UoU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSkgewpAQCAtNDczLDYgKzUyOSwxMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgc2V0WFNTQXVkaXRvckVuYWJsZWQgKGJvb2xlYW4gZmxhZykgeworICAgICAgICBtV2ViVmlldy5nZXRTZXR0aW5ncygpLnNldFhTU0F1ZGl0b3JFbmFibGVkKGZsYWcpOworICAgIH0KKwogICAgIHByaXZhdGUgZmluYWwgV2ViVmlld0NsaWVudCBtVmlld0NsaWVudCA9IG5ldyBXZWJWaWV3Q2xpZW50KCl7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblBhZ2VGaW5pc2hlZChXZWJWaWV3IHZpZXcsIFN0cmluZyB1cmwpIHsKQEAgLTQ5MCwxMSArNTUwLDMwIEBACiAgICAgICAgICAgICAgICAgICAgIGRyYXdQYWdlVG9GaWxlKG1TYXZlSW1hZ2VQYXRoICsgIi8iICsgbmFtZSArICIucG5nIiwgbVdlYlZpZXcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gQ2FsbGluZyBmaW5pc2hlZCgpIHdpbGwgY2hlY2sgaWYgd2UndmUgbWV0IGFsbCB0aGUgY29uZGl0aW9ucyBmb3IgY29tcGxldGluZwotICAgICAgICAgICAgLy8gdGhpcyB0ZXN0IGFuZCBtb3ZlIHRvIHRoZSBuZXh0IG9uZSBpZiB3ZSBhcmUgcmVhZHkuCisgICAgICAgICAgICAvLyB0aGlzIHRlc3QgYW5kIG1vdmUgdG8gdGhlIG5leHQgb25lIGlmIHdlIGFyZSByZWFkeS4gT3RoZXJ3aXNlIHdlIGFzayBXZWJDb3JlIHRvCisgICAgICAgICAgICAvLyBkdW1wIHRoZSBwYWdlLgogICAgICAgICAgICAgaWYgKGZpbmlzaGVkKCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbVdhaXRVbnRpbERvbmUgJiYgIW1SZXF1ZXN0ZWRXZWJLaXREYXRhICYmICFtVGltZWRPdXQpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0V2ViS2l0RGF0YSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobVdhaXRVbnRpbERvbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAicGFnZSBmaW5pc2hlZCBsb2FkaW5nIGJ1dCB3YWl0aW5nIGZvciBub3RpZnlEb25lIHRvIGJlIGNhbGxlZDogIiArIHVybCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1SZXF1ZXN0ZWRXZWJLaXREYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgInBhZ2UgZmluaXNoZWQgbG9hZGluZyBidXQgd2Via2l0IGRhdGEgaGFzIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWQ6ICIgKyB1cmwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtVGltZWRPdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAicGFnZSBmaW5pc2hlZCBsb2FkaW5nIGJ1dCBhbHJlYWR5IHRpbWVkIG91dDogIiArIHVybCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBzdXBlci5vblBhZ2VGaW5pc2hlZCh2aWV3LCB1cmwpOwogICAgICAgICB9CiAKQEAgLTUzNiw0NCArNjE1LDggQEAKIAogICAgIHByaXZhdGUgZmluYWwgV2ViQ2hyb21lQ2xpZW50IG1DaHJvbWVDbGllbnQgPSBuZXcgV2ViQ2hyb21lQ2xpZW50KCkgewogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoV2ViVmlldyB2aWV3LCBpbnQgbmV3UHJvZ3Jlc3MpIHsKLQotICAgICAgICAgICAgLy8gbm90aWZ5RG9uZSBjYWxscyB0aGlzIHdpdGggMTAxJS4gV2Ugb25seSB3YW50IHRvIHVwZGF0ZSB0aGlzIGZsYWcgaWYgdGhpcwotICAgICAgICAgICAgLy8gaXMgdGhlIHJlYWwgY2FsbCBmcm9tIFdlYkNvcmUuCi0gICAgICAgICAgICBpZiAobmV3UHJvZ3Jlc3MgPT0gMTAwKSB7Ci0gICAgICAgICAgICAgICAgbU9uZUh1bmRyZWRQZXJjZW50Q29tcGxldGUgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBXaXRoIHRoZSBmbGFnIHVwZGF0ZWQsIHdlIGNhbiBub3cgcHJvY2VlZCBhcyBub3JtYWwgd2hldGhlciB0aGUgcHJvZ3Jlc3MgdXBkYXRlIGNhbWUgZnJvbQotICAgICAgICAgICAgLy8gV2ViQ29yZSBvciBub3RpZnlEb25lLgotICAgICAgICAgICAgaWYgKG5ld1Byb2dyZXNzID49IDEwMCkgewotICAgICAgICAgICAgICAgIC8vIGZpbmlzaGVkKCkgd2lsbCBjaGVjayBpZiB3ZSBhcmUgcmVhZHkgdG8gbW92ZSB0byB0aGUgbmV4dCB0ZXN0IGFuZCBkbyBzbyBpZiB3ZSBhcmUuCi0gICAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghbVRpbWVkT3V0ICYmICFtV2FpdFVudGlsRG9uZSAmJiAhbVJlcXVlc3RlZFdlYktpdERhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1XZWJWaWV3LmdldFVybCgpOwotICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJGaW5pc2hlZDogIisgdXJsKTsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFdlYktpdERhdGEoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbVdlYlZpZXcuZ2V0VXJsKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtVGltZWRPdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIlRpbWVkIG91dCBiZWZvcmUgZmluaXNoaW5nOiAiICsgdXJsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtV2FpdFVudGlsRG9uZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiV2FpdGluZyBmb3Igbm90aWZ5RG9uZTogIiArIHVybCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVJlcXVlc3RlZFdlYktpdERhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIlJlcXVlc3RlZCB3ZWJraXQgZGF0YSByZWFkeTogIiArIHVybCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlZFRpdGxlKFdlYlZpZXcgdmlldywgU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgICAgICBpZiAodGl0bGUubGVuZ3RoKCkgPiAzMCkKLSAgICAgICAgICAgICAgICB0aXRsZSA9ICIuLi4iK3RpdGxlLnN1YnN0cmluZyh0aXRsZS5sZW5ndGgoKS0zMCk7Ci0gICAgICAgICAgICBzZXRUaXRsZSh0aXRsZSk7CisgICAgICAgICAgICBzZXRUaXRsZSgiVGVzdCAiICsgbUN1cnJlbnRUZXN0TnVtYmVyICsgIiBvZiAiICsgbVRvdGFsVGVzdENvdW50ICsgIjogIisgdGl0bGUpOwogICAgICAgICAgICAgaWYgKG1EdW1wVGl0bGVDaGFuZ2VzKSB7CiAgICAgICAgICAgICAgICAgbVRpdGxlQ2hhbmdlcy5hcHBlbmQoIlRJVExFIENIQU5HRUQ6ICIpOwogICAgICAgICAgICAgICAgIG1UaXRsZUNoYW5nZXMuYXBwZW5kKHRpdGxlKTsKQEAgLTY3MCwyMSArNzEzLDQwIEBACiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvbkdlb2xvY2F0aW9uUGVybWlzc2lvbnNTaG93UHJvbXB0KFN0cmluZyBvcmlnaW4sCiAgICAgICAgICAgICAgICAgR2VvbG9jYXRpb25QZXJtaXNzaW9ucy5DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgaWYgKG1HZW9sb2NhdGlvblBlcm1pc3Npb25TZXQpIHsKKyAgICAgICAgICAgIGlmIChtSXNHZW9sb2NhdGlvblBlcm1pc3Npb25TZXQpIHsKICAgICAgICAgICAgICAgICBjYWxsYmFjay5pbnZva2Uob3JpZ2luLCBtR2VvbG9jYXRpb25QZXJtaXNzaW9uLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcyA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrLCBTdHJpbmc+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcy5wdXQoY2FsbGJhY2ssIG9yaWdpbik7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Db25zb2xlTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmVOdW1iZXIsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHNvdXJjZUlEKSB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ29uc29sZU1lc3NhZ2UoQ29uc29sZU1lc3NhZ2UgY29uc29sZU1lc3NhZ2UpIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiQ09OU09MRSBNRVNTQUdFOiBsaW5lICIgKyBjb25zb2xlTWVzc2FnZS5saW5lTnVtYmVyKCkgKyAiOiAiCisgICAgICAgICAgICAgICAgICAgICsgY29uc29sZU1lc3NhZ2UubWVzc2FnZSgpICsgIlxuIjsKICAgICAgICAgICAgIGlmIChtQ29uc29sZU1lc3NhZ2VzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBtQ29uc29sZU1lc3NhZ2VzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIGNvbnNvbGVNZXNzYWdlID0gIkNPTlNPTEUgTUVTU0FHRTogbGluZSAiCi0gICAgICAgICAgICAgICAgICAgICsgbGluZU51bWJlciArIjogIisgbWVzc2FnZSArIlxuIjsKLSAgICAgICAgICAgIG1Db25zb2xlTWVzc2FnZXMuYXBwZW5kKGNvbnNvbGVNZXNzYWdlKTsKLSAgICAgICAgICAgIExvZy52KExPR1RBRywgIkxPRzogIitjb25zb2xlTWVzc2FnZSk7CisgICAgICAgICAgICBtQ29uc29sZU1lc3NhZ2VzLmFwcGVuZChtc2cpOworICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiTE9HOiAiICsgbXNnKTsKKyAgICAgICAgICAgIC8vIHRoZSByYXRpb25hbGUgaGVyZSBpcyB0aGF0IGlmIHRoZXJlJ3MgYW4gZXJyb3Igb2YgZWl0aGVyIHR5cGUsIGFuZCB0aGUgdGVzdCB3YXMKKyAgICAgICAgICAgIC8vIHdhaXRpbmcgZm9yICJub3RpZnlEb25lIiBzaWduYWwgdG8gZmluaXNoLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gd2FpdGluZworICAgICAgICAgICAgLy8gYW55bW9yZSBiZWNhdXNlIHRoZSBKUyBleGVjdXRpb24gaXMgYWxyZWFkeSB0ZXJtaW5hdGVkIGF0IHRoaXMgcG9pbnQgYW5kIGEKKyAgICAgICAgICAgIC8vICJub3RpZnlEb25lIiB3aWxsIG5ldmVyIGNvbWUgb3V0IHNvIGl0J3MganVzdCB3YXN0aW5nIHRpbWUgdGlsbCB0aW1lb3V0IGtpY2tzIGluCisgICAgICAgICAgICBpZiAoKG1zZy5jb250YWlucygiVW5jYXVnaHQgUmVmZXJlbmNlRXJyb3I6IikgfHwgbXNnLmNvbnRhaW5zKCJVbmNhdWdodCBUeXBlRXJyb3I6IikpCisgICAgICAgICAgICAgICAgICAgICYmIG1XYWl0VW50aWxEb25lICYmIG1TdG9wT25SZWZFcnJvcikgeworICAgICAgICAgICAgICAgIExvZy53KExPR1RBRywgIlRlcm1pbmF0aW5nIHRlc3QgY2FzZSBvbiB1bmNhdWdodCBSZWZlcmVuY2VFcnJvciBvciBUeXBlRXJyb3IuIik7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlEb25lKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LCA1MDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTcyMywxMyArNzg1LDE1IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOZXdXaW5kb3dXZWJWaWV3IGV4dGVuZHMgV2ViVmlldyB7CiAgICAgICAgIHB1YmxpYyBOZXdXaW5kb3dXZWJWaWV3KENvbnRleHQgY29udGV4dCwgTWFwPFN0cmluZywgT2JqZWN0PiBqc0lmYWNlcykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCwgMCwganNJZmFjZXMpOworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCwgMCwganNJZmFjZXMsIGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCByZXNldFRlc3RTdGF0dXMoKSB7CiAgICAgICAgIG1XYWl0VW50aWxEb25lID0gZmFsc2U7CiAgICAgICAgIG1EdW1wRGF0YVR5cGUgPSBtRGVmYXVsdER1bXBEYXRhVHlwZTsKKyAgICAgICAgbUR1bXBUb3BGcmFtZUFzVGV4dCA9IGZhbHNlOworICAgICAgICBtRHVtcENoaWxkRnJhbWVzQXNUZXh0ID0gZmFsc2U7CiAgICAgICAgIG1UaW1lZE91dCA9IGZhbHNlOwogICAgICAgICBtRHVtcFRpdGxlQ2hhbmdlcyA9IGZhbHNlOwogICAgICAgICBtUmVxdWVzdGVkV2ViS2l0RGF0YSA9IGZhbHNlOwpAQCAtNzM5LDEwICs4MDMsMTIgQEAKICAgICAgICAgbUV2ZW50U2VuZGVyLmNsZWFyVG91Y2hQb2ludHMoKTsKICAgICAgICAgbUV2ZW50U2VuZGVyLmNsZWFyVG91Y2hNZXRhU3RhdGUoKTsKICAgICAgICAgbVBhZ2VGaW5pc2hlZCA9IGZhbHNlOwotICAgICAgICBtT25lSHVuZHJlZFBlcmNlbnRDb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICBtRHVtcFdlYktpdERhdGEgPSBmYWxzZTsKICAgICAgICAgbUdldERyYXd0aW1lID0gZmFsc2U7CiAgICAgICAgIG1TYXZlSW1hZ2VQYXRoID0gbnVsbDsKKyAgICAgICAgc2V0RGVmYXVsdFdlYlNldHRpbmdzKG1XZWJWaWV3KTsKKyAgICAgICAgbUlzR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0ID0gZmFsc2U7CisgICAgICAgIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzID0gbnVsbDsKICAgICB9CiAKICAgICBwcml2YXRlIGxvbmdbXSBnZXREcmF3V2ViVmlld1RpbWUoV2ViVmlldyB2aWV3LCBpbnQgY291bnQpIHsKQEAgLTc3OSw3ICs4NDUsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBjYW5Nb3ZlVG9OZXh0VGVzdCgpIHsKLSAgICAgICAgcmV0dXJuIChtRHVtcFdlYktpdERhdGEgJiYgbU9uZUh1bmRyZWRQZXJjZW50Q29tcGxldGUgJiYgbVBhZ2VGaW5pc2hlZCAmJiAhbVdhaXRVbnRpbERvbmUpIHx8IG1UaW1lZE91dDsKKyAgICAgICAgcmV0dXJuIChtRHVtcFdlYktpdERhdGEgJiYgbVBhZ2VGaW5pc2hlZCAmJiAhbVdhaXRVbnRpbERvbmUpIHx8IG1UaW1lZE91dDsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc2V0dXBXZWJWaWV3Rm9yTGF5b3V0VGVzdHMoV2ViVmlldyB3ZWJ2aWV3LCBDYWxsYmFja1Byb3h5IGNhbGxiYWNrUHJveHkpIHsKQEAgLTc4Nyw2ICs4NTMsMTkgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCisgICAgICAgIHNldERlZmF1bHRXZWJTZXR0aW5ncyh3ZWJ2aWV3KTsKKworICAgICAgICB3ZWJ2aWV3LnNldFdlYkNocm9tZUNsaWVudChtQ2hyb21lQ2xpZW50KTsKKyAgICAgICAgd2Vidmlldy5zZXRXZWJWaWV3Q2xpZW50KG1WaWV3Q2xpZW50KTsKKyAgICAgICAgLy8gU2V0dGluZyBhIHRvdWNoIGludGVydmFsIG9mIC0xIGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoZSBvcHRpbWlzYXRpb24gaW4gV2ViVmlldworICAgICAgICAvLyB0aGF0IHN0b3BzIHJlcGVhdGVkIHRvdWNoIGV2ZW50cyBmbG9vZGluZyBXZWJDb3JlLiBUaGUgRXZlbnQgU2VuZGVyIG9ubHkgc2VuZHMgYQorICAgICAgICAvLyBzaW5nbGUgZXZlbnQgcmF0aGVyIHRoYW4gYSBzdHJlYW0gb2YgZXZlbnRzIChsaWtlIHdoYXQgd291bGQgZ2VuZXJhbGx5IGhhcHBlbiBpbgorICAgICAgICAvLyBhIHJlYWwgdXNlIG9mIHRvdWNoIGV2ZW50cyBpbiBhIFdlYlZpZXcpICBhbmQgc28gaWYgdGhlIFdlYlZpZXcgZHJvcHMgdGhlIGV2ZW50LAorICAgICAgICAvLyB0aGUgdGVzdCB3aWxsIGZhaWwgYXMgdGhlIHRlc3QgZXhwZWN0cyBvbmUgY2FsbGJhY2sgZm9yIGV2ZXJ5IHRvdWNoIGl0IHN5bnRoZXNpemVzLgorICAgICAgICB3ZWJ2aWV3LnNldFRvdWNoSW50ZXJ2YWwoLTEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRXZWJTZXR0aW5ncyhXZWJWaWV3IHdlYnZpZXcpIHsKICAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSB3ZWJ2aWV3LmdldFNldHRpbmdzKCk7CiAgICAgICAgIHNldHRpbmdzLnNldEFwcENhY2hlRW5hYmxlZCh0cnVlKTsKICAgICAgICAgc2V0dGluZ3Muc2V0QXBwQ2FjaGVQYXRoKGdldEFwcGxpY2F0aW9uQ29udGV4dCgpLmdldENhY2hlRGlyKCkuZ2V0UGF0aCgpKTsKQEAgLTc5OSwxNSArODc4LDcgQEAKICAgICAgICAgc2V0dGluZ3Muc2V0RGF0YWJhc2VQYXRoKGdldERpcigiZGF0YWJhc2VzIiwwKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgIHNldHRpbmdzLnNldERvbVN0b3JhZ2VFbmFibGVkKHRydWUpOwogICAgICAgICBzZXR0aW5ncy5zZXRXb3JrZXJzRW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgd2Vidmlldy5zZXRXZWJDaHJvbWVDbGllbnQobUNocm9tZUNsaWVudCk7Ci0gICAgICAgIHdlYnZpZXcuc2V0V2ViVmlld0NsaWVudChtVmlld0NsaWVudCk7Ci0gICAgICAgIC8vIFNldHRpbmcgYSB0b3VjaCBpbnRlcnZhbCBvZiAtMSBlZmZlY3RpdmVseSBkaXNhYmxlcyB0aGUgb3B0aW1pc2F0aW9uIGluIFdlYlZpZXcKLSAgICAgICAgLy8gdGhhdCBzdG9wcyByZXBlYXRlZCB0b3VjaCBldmVudHMgZmxvb2RpbmcgV2ViQ29yZS4gVGhlIEV2ZW50IFNlbmRlciBvbmx5IHNlbmRzIGEKLSAgICAgICAgLy8gc2luZ2xlIGV2ZW50IHJhdGhlciB0aGFuIGEgc3RyZWFtIG9mIGV2ZW50cyAobGlrZSB3aGF0IHdvdWxkIGdlbmVyYWxseSBoYXBwZW4gaW4KLSAgICAgICAgLy8gYSByZWFsIHVzZSBvZiB0b3VjaCBldmVudHMgaW4gYSBXZWJWaWV3KSAgYW5kIHNvIGlmIHRoZSBXZWJWaWV3IGRyb3BzIHRoZSBldmVudCwKLSAgICAgICAgLy8gdGhlIHRlc3Qgd2lsbCBmYWlsIGFzIHRoZSB0ZXN0IGV4cGVjdHMgb25lIGNhbGxiYWNrIGZvciBldmVyeSB0b3VjaCBpdCBzeW50aGVzaXplcy4KLSAgICAgICAgd2Vidmlldy5zZXRUb3VjaEludGVydmFsKC0xKTsKKyAgICAgICAgc2V0dGluZ3Muc2V0WFNTQXVkaXRvckVuYWJsZWQoZmFsc2UpOwogICAgIH0KIAogICAgIHByaXZhdGUgV2ViVmlldyBtV2ViVmlldzsKQEAgLTgyNCw2ICs4OTUsOSBAQAogICAgIHByaXZhdGUgU3RyaW5nIG1TYXZlSW1hZ2VQYXRoOwogICAgIHByaXZhdGUgQnVmZmVyZWRSZWFkZXIgbVRlc3RMaXN0UmVhZGVyOwogICAgIHByaXZhdGUgYm9vbGVhbiBtR2V0RHJhd3RpbWU7CisgICAgcHJpdmF0ZSBpbnQgbVRvdGFsVGVzdENvdW50OworICAgIHByaXZhdGUgaW50IG1DdXJyZW50VGVzdE51bWJlcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVN0b3BPblJlZkVycm9yOwogCiAgICAgLy8gU3RhdGVzCiAgICAgcHJpdmF0ZSBib29sZWFuIG1UaW1lZE91dDsKQEAgLTgzMyw2ICs5MDcsOCBAQAogICAgIC8vIExheW91dCB0ZXN0IGNvbnRyb2xsZXIgdmFyaWFibGVzLgogICAgIHByaXZhdGUgRHVtcERhdGFUeXBlIG1EdW1wRGF0YVR5cGU7CiAgICAgcHJpdmF0ZSBEdW1wRGF0YVR5cGUgbURlZmF1bHREdW1wRGF0YVR5cGUgPSBEdW1wRGF0YVR5cGUuRVhUX1JFUFI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EdW1wVG9wRnJhbWVBc1RleHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EdW1wQ2hpbGRGcmFtZXNBc1RleHQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1XYWl0VW50aWxEb25lOwogICAgIHByaXZhdGUgYm9vbGVhbiBtRHVtcFRpdGxlQ2hhbmdlczsKICAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBtVGl0bGVDaGFuZ2VzOwpAQCAtODQ2LDcgKzkyMiw2IEBACiAKICAgICBwcml2YXRlIGJvb2xlYW4gbVBhZ2VGaW5pc2hlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiBtRHVtcFdlYktpdERhdGEgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU9uZUh1bmRyZWRQZXJjZW50Q29tcGxldGUgPSBmYWxzZTsKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRU9VVF9TVFIgPSAiKipUZXN0IHRpbWVvdXQiOwogCkBAIC04NjEsMTEgKzkzNiwxNSBAQAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfQVVUT19URVNUID0gIlVpQXV0b1Rlc3QiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX0RSQVdfVElNRSA9ICJHZXREcmF3VGltZSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0lNQUdFID0gIlNhdmVJbWFnZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUT1RBTF9URVNUX0NPVU5UID0gIlRlc3RDb3VudCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBDVVJSRU5UX1RFU1RfTlVNQkVSID0gIlRlc3ROdW1iZXIiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUF9PTl9SRUZfRVJST1IgPSAiU3RvcE9uUmVmZXJlbmNlRXJyb3IiOwogCiAgICAgc3RhdGljIGZpbmFsIGludCBEUkFXX1JVTlMgPSA1OwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJBV19USU1FX0xPRyA9IEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpICsKICAgICAgICAgIi9hbmRyb2lkL3BhZ2VfZHJhd190aW1lLnR4dCI7CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gbUdlb2xvY2F0aW9uUGVybWlzc2lvblNldDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0OwogICAgIHByaXZhdGUgYm9vbGVhbiBtR2VvbG9jYXRpb25QZXJtaXNzaW9uOworICAgIHByaXZhdGUgTWFwIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1dlYlZpZXdFdmVudFNlbmRlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1dlYlZpZXdFdmVudFNlbmRlci5qYXZhCmluZGV4IDcxNjA4NmIuLjM4M2Q3ODIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9XZWJWaWV3RXZlbnRTZW5kZXIuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvV2ViVmlld0V2ZW50U2VuZGVyLmphdmEKQEAgLTMxLDYgKzMxLDcgQEAKIAkKICAgICBXZWJWaWV3RXZlbnRTZW5kZXIoV2ViVmlldyB3ZWJWaWV3KSB7CiAgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKKyAgICAgICAgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5zZXRCdWlsdEluWm9vbUNvbnRyb2xzKHRydWUpOwogICAgICAgICBtVG91Y2hQb2ludHMgPSBuZXcgVmVjdG9yPFRvdWNoUG9pbnQ+KCk7CiAgICAgfQogCQpAQCAtMTcwLDcwICsxNzEsMTI4IEBACiAJfQogCiAgICAgcHVibGljIHZvaWQgdG91Y2hTdGFydCgpIHsKLSAgICAgICAgLy8gV2Ugb25seSBzdXBwb3J0IHNpbmdsZSB0b3VjaCBzbyBleGFtaW5lIHRoZSBmaXJzdCB0b3VjaCBwb2ludCBvbmx5LgotICAgICAgICAvLyBJZiBtdWx0aSB0b3VjaCBpcyBlbmFibGVkIGluIHRoZSBmdXR1cmUsIHdlIG5lZWQgdG8gcmUtZXhhbWluZSB0aGlzIHRvIHNlbmQKLSAgICAgICAgLy8gYWxsIHRoZSB0b3VjaCBwb2ludHMgd2l0aCB0aGUgZXZlbnQuCi0gICAgICAgIFRvdWNoUG9pbnQgdHAgPSBtVG91Y2hQb2ludHMuZ2V0KDApOwotCi0gICAgICAgIGlmICh0cCA9PSBudWxsKSB7CisgICAgICAgIGZpbmFsIGludCBudW1Qb2ludHMgPSBtVG91Y2hQb2ludHMuc2l6ZSgpOworICAgICAgICBpZiAobnVtUG9pbnRzID09IDApIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIHRwLnNldERvd25UaW1lKFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpKTsKLSAgICAgICAgTW90aW9uRXZlbnQgZXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4odHAuZG93blRpbWUoKSwgdHAuZG93blRpbWUoKSwKLSAgICAgICAgICAgICAgICBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTiwgdHAuZ2V0WCgpLCB0cC5nZXRZKCksIG1Ub3VjaE1ldGFTdGF0ZSk7CisgICAgICAgIGludFtdIHBvaW50ZXJJZHMgPSBuZXcgaW50W251bVBvaW50c107CisgICAgICAgIE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHNbXSBwb2ludGVyQ29vcmRzID0gbmV3IE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHNbbnVtUG9pbnRzXTsKKyAgICAgICAgbG9uZyBkb3duVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUG9pbnRzOyArK2kpIHsKKyAgICAgICAgICAgIHBvaW50ZXJJZHNbaV0gPSBtVG91Y2hQb2ludHMuZ2V0KGkpLmdldElkKCk7CisgICAgICAgICAgICBwb2ludGVyQ29vcmRzW2ldID0gbmV3IE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHMoKTsKKyAgICAgICAgICAgIHBvaW50ZXJDb29yZHNbaV0ueCA9IG1Ub3VjaFBvaW50cy5nZXQoaSkuZ2V0WCgpOworICAgICAgICAgICAgcG9pbnRlckNvb3Jkc1tpXS55ID0gbVRvdWNoUG9pbnRzLmdldChpKS5nZXRZKCk7CisgICAgICAgICAgICBtVG91Y2hQb2ludHMuZ2V0KGkpLnNldERvd25UaW1lKGRvd25UaW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIE1vdGlvbkV2ZW50IGV2ZW50ID0gTW90aW9uRXZlbnQub2J0YWluKGRvd25UaW1lLCBkb3duVGltZSwKKyAgICAgICAgICAgIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOLCBudW1Qb2ludHMsIHBvaW50ZXJJZHMsIHBvaW50ZXJDb29yZHMsCisgICAgICAgICAgICBtVG91Y2hNZXRhU3RhdGUsIDEuMGYsIDEuMGYsIDAsIDAsIDAsIDApOworCiAgICAgICAgIG1XZWJWaWV3Lm9uVG91Y2hFdmVudChldmVudCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdG91Y2hNb3ZlKCkgewotICAgICAgICBUb3VjaFBvaW50IHRwID0gbVRvdWNoUG9pbnRzLmdldCgwKTsKLQotICAgICAgICBpZiAodHAgPT0gbnVsbCkgeworICAgICAgICBmaW5hbCBpbnQgbnVtUG9pbnRzID0gbVRvdWNoUG9pbnRzLnNpemUoKTsKKyAgICAgICAgaWYgKG51bVBvaW50cyA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIXRwLmhhc01vdmVkKCkpIHsKKyAgICAgICAgaW50W10gcG9pbnRlcklkcyA9IG5ldyBpbnRbbnVtUG9pbnRzXTsKKyAgICAgICAgTW90aW9uRXZlbnQuUG9pbnRlckNvb3Jkc1tdIHBvaW50ZXJDb29yZHMgPSBuZXcgTW90aW9uRXZlbnQuUG9pbnRlckNvb3Jkc1tudW1Qb2ludHNdOworICAgICAgICBpbnQgbnVtTW92ZWRQb2ludHMgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVBvaW50czsgKytpKSB7CisgICAgICAgICAgICBUb3VjaFBvaW50IHRwID0gbVRvdWNoUG9pbnRzLmdldChpKTsKKyAgICAgICAgICAgIGlmICh0cC5oYXNNb3ZlZCgpKSB7CisgICAgICAgICAgICAgICAgcG9pbnRlcklkc1tudW1Nb3ZlZFBvaW50c10gPSBtVG91Y2hQb2ludHMuZ2V0KGkpLmdldElkKCk7CisgICAgICAgICAgICAgICAgcG9pbnRlckNvb3Jkc1tpXSA9IG5ldyBNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzKCk7CisgICAgICAgICAgICAgICAgcG9pbnRlckNvb3Jkc1tudW1Nb3ZlZFBvaW50c10ueCA9IG1Ub3VjaFBvaW50cy5nZXQoaSkuZ2V0WCgpOworICAgICAgICAgICAgICAgIHBvaW50ZXJDb29yZHNbbnVtTW92ZWRQb2ludHNdLnkgPSBtVG91Y2hQb2ludHMuZ2V0KGkpLmdldFkoKTsKKyAgICAgICAgICAgICAgICArK251bU1vdmVkUG9pbnRzOworICAgICAgICAgICAgICAgIHRwLnNldE1vdmVkKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChudW1Nb3ZlZFBvaW50cyA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBNb3Rpb25FdmVudCBldmVudCA9IE1vdGlvbkV2ZW50Lm9idGFpbih0cC5kb3duVGltZSgpLCBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSwKLSAgICAgICAgICAgICAgICBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRSwgdHAuZ2V0WCgpLCB0cC5nZXRZKCksIG1Ub3VjaE1ldGFTdGF0ZSk7CisgICAgICAgIE1vdGlvbkV2ZW50IGV2ZW50ID0gTW90aW9uRXZlbnQub2J0YWluKG1Ub3VjaFBvaW50cy5nZXQoMCkuZG93blRpbWUoKSwKKyAgICAgICAgICAgICAgICBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSwgTW90aW9uRXZlbnQuQUNUSU9OX01PVkUsCisgICAgICAgICAgICAgICAgbnVtTW92ZWRQb2ludHMsIHBvaW50ZXJJZHMsIHBvaW50ZXJDb29yZHMsCisgICAgICAgICAgICAgICAgbVRvdWNoTWV0YVN0YXRlLCAxLjBmLCAxLjBmLCAwLCAwLCAwLCAwKTsKICAgICAgICAgbVdlYlZpZXcub25Ub3VjaEV2ZW50KGV2ZW50KTsKLQotICAgICAgICB0cC5zZXRNb3ZlZChmYWxzZSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdG91Y2hFbmQoKSB7Ci0gICAgICAgIFRvdWNoUG9pbnQgdHAgPSBtVG91Y2hQb2ludHMuZ2V0KDApOwotCi0gICAgICAgIGlmICh0cCA9PSBudWxsKSB7CisgICAgICAgIGZpbmFsIGludCBudW1Qb2ludHMgPSBtVG91Y2hQb2ludHMuc2l6ZSgpOworICAgICAgICBpZiAobnVtUG9pbnRzID09IDApIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIE1vdGlvbkV2ZW50IGV2ZW50ID0gTW90aW9uRXZlbnQub2J0YWluKHRwLmRvd25UaW1lKCksIFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpLAotICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50LkFDVElPTl9VUCwgdHAuZ2V0WCgpLCB0cC5nZXRZKCksIG1Ub3VjaE1ldGFTdGF0ZSk7CisgICAgICAgIGludFtdIHBvaW50ZXJJZHMgPSBuZXcgaW50W251bVBvaW50c107CisgICAgICAgIE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHNbXSBwb2ludGVyQ29vcmRzID0gbmV3IE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHNbbnVtUG9pbnRzXTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVBvaW50czsgKytpKSB7CisgICAgICAgICAgICBwb2ludGVySWRzW2ldID0gbVRvdWNoUG9pbnRzLmdldChpKS5nZXRJZCgpOworICAgICAgICAgICAgcG9pbnRlckNvb3Jkc1tpXSA9IG5ldyBNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzKCk7CisgICAgICAgICAgICBwb2ludGVyQ29vcmRzW2ldLnggPSBtVG91Y2hQb2ludHMuZ2V0KGkpLmdldFgoKTsKKyAgICAgICAgICAgIHBvaW50ZXJDb29yZHNbaV0ueSA9IG1Ub3VjaFBvaW50cy5nZXQoaSkuZ2V0WSgpOworICAgICAgICB9CisKKyAgICAgICAgTW90aW9uRXZlbnQgZXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4obVRvdWNoUG9pbnRzLmdldCgwKS5kb3duVGltZSgpLAorICAgICAgICAgICAgICAgIFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpLCBNb3Rpb25FdmVudC5BQ1RJT05fVVAsCisgICAgICAgICAgICAgICAgbnVtUG9pbnRzLCBwb2ludGVySWRzLCBwb2ludGVyQ29vcmRzLAorICAgICAgICAgICAgICAgIG1Ub3VjaE1ldGFTdGF0ZSwgMS4wZiwgMS4wZiwgMCwgMCwgMCwgMCk7CiAgICAgICAgIG1XZWJWaWV3Lm9uVG91Y2hFdmVudChldmVudCk7CiAKLSAgICAgICAgaWYgKHRwLmlzUmVsZWFzZWQoKSkgewotICAgICAgICAgICAgbVRvdWNoUG9pbnRzLnJlbW92ZSgwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IG51bVBvaW50cyAtIDE7IGkgPj0gMDsgLS1pKSB7ICAvLyByZW1vdmUgcmVsZWFzZWQgcG9pbnRzLgorICAgICAgICAgICAgVG91Y2hQb2ludCB0cCA9IG1Ub3VjaFBvaW50cy5nZXQoaSk7CisgICAgICAgICAgICBpZiAodHAuaXNSZWxlYXNlZCgpKSB7CisgICAgICAgICAgICAgIG1Ub3VjaFBvaW50cy5yZW1vdmUoaSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0b3VjaENhbmNlbCgpIHsKLSAgICAgICAgVG91Y2hQb2ludCB0cCA9IG1Ub3VjaFBvaW50cy5nZXQoMCk7Ci0gICAgICAgIGlmICh0cCA9PSBudWxsKSB7CisgICAgICAgIGZpbmFsIGludCBudW1Qb2ludHMgPSBtVG91Y2hQb2ludHMuc2l6ZSgpOworICAgICAgICBpZiAobnVtUG9pbnRzID09IDApIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh0cC5jYW5jZWxsZWQoKSkgewotICAgICAgICAgICAgTW90aW9uRXZlbnQgZXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4odHAuZG93blRpbWUoKSwgU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCksCi0gICAgICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwsIHRwLmdldFgoKSwgdHAuZ2V0WSgpLCBtVG91Y2hNZXRhU3RhdGUpOwotICAgICAgICAgICAgbVdlYlZpZXcub25Ub3VjaEV2ZW50KGV2ZW50KTsKKyAgICAgICAgaW50W10gcG9pbnRlcklkcyA9IG5ldyBpbnRbbnVtUG9pbnRzXTsKKyAgICAgICAgTW90aW9uRXZlbnQuUG9pbnRlckNvb3Jkc1tdIHBvaW50ZXJDb29yZHMgPSBuZXcgTW90aW9uRXZlbnQuUG9pbnRlckNvb3Jkc1tudW1Qb2ludHNdOworICAgICAgICBsb25nIGNhbmNlbFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgaW50IG51bUNhbmNlbGVkUG9pbnRzID0gMDsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVBvaW50czsgKytpKSB7CisgICAgICAgICAgICBUb3VjaFBvaW50IHRwID0gbVRvdWNoUG9pbnRzLmdldChpKTsKKyAgICAgICAgICAgIGlmICh0cC5jYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgICAgIHBvaW50ZXJJZHNbbnVtQ2FuY2VsZWRQb2ludHNdID0gbVRvdWNoUG9pbnRzLmdldChpKS5nZXRJZCgpOworICAgICAgICAgICAgICAgIHBvaW50ZXJDb29yZHNbbnVtQ2FuY2VsZWRQb2ludHNdID0gbmV3IE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHMoKTsKKyAgICAgICAgICAgICAgICBwb2ludGVyQ29vcmRzW251bUNhbmNlbGVkUG9pbnRzXS54ID0gbVRvdWNoUG9pbnRzLmdldChpKS5nZXRYKCk7CisgICAgICAgICAgICAgICAgcG9pbnRlckNvb3Jkc1tudW1DYW5jZWxlZFBvaW50c10ueSA9IG1Ub3VjaFBvaW50cy5nZXQoaSkuZ2V0WSgpOworICAgICAgICAgICAgICAgICsrbnVtQ2FuY2VsZWRQb2ludHM7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBpZiAobnVtQ2FuY2VsZWRQb2ludHMgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTW90aW9uRXZlbnQgZXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4obVRvdWNoUG9pbnRzLmdldCgwKS5kb3duVGltZSgpLAorICAgICAgICAgICAgU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCksIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwsCisgICAgICAgICAgICBudW1DYW5jZWxlZFBvaW50cywgcG9pbnRlcklkcywgcG9pbnRlckNvb3JkcywKKyAgICAgICAgICAgIG1Ub3VjaE1ldGFTdGF0ZSwgMS4wZiwgMS4wZiwgMCwgMCwgMCwgMCk7CisKKyAgICAgICAgbVdlYlZpZXcub25Ub3VjaEV2ZW50KGV2ZW50KTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBjYW5jZWxUb3VjaFBvaW50KGludCBpZCkgewotICAgICAgICBUb3VjaFBvaW50IHRwID0gbVRvdWNoUG9pbnRzLmdldCgwKTsKKyAgICAgICAgVG91Y2hQb2ludCB0cCA9IG1Ub3VjaFBvaW50cy5nZXQoaWQpOwogICAgICAgICBpZiAodHAgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0yNDIsMTQgKzMwMSwxOSBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGFkZFRvdWNoUG9pbnQoaW50IHgsIGludCB5KSB7Ci0gICAgICAgIG1Ub3VjaFBvaW50cy5hZGQobmV3IFRvdWNoUG9pbnQoY29udGVudHNUb1dpbmRvd1goeCksIGNvbnRlbnRzVG9XaW5kb3dZKHkpKSk7Ci0gICAgICAgIGlmIChtVG91Y2hQb2ludHMuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiQWRkaW5nIG1vcmUgdGhhbiBvbmUgdG91Y2ggcG9pbnQsIGJ1dCBtdWx0aSB0b3VjaCBpcyBub3Qgc3VwcG9ydGVkISIpOworICAgICAgICBmaW5hbCBpbnQgbnVtUG9pbnRzID0gbVRvdWNoUG9pbnRzLnNpemUoKTsKKyAgICAgICAgaW50IGlkOworICAgICAgICBpZiAobnVtUG9pbnRzID09IDApIHsKKyAgICAgICAgICBpZCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWQgPSBtVG91Y2hQb2ludHMuZ2V0KG51bVBvaW50cyAtIDEpLmdldElkKCkgKyAxOwogICAgICAgICB9CisKKyAgICAgICAgbVRvdWNoUG9pbnRzLmFkZChuZXcgVG91Y2hQb2ludChpZCwgY29udGVudHNUb1dpbmRvd1goeCksIGNvbnRlbnRzVG9XaW5kb3dZKHkpKSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdXBkYXRlVG91Y2hQb2ludChpbnQgaWQsIGludCB4LCBpbnQgeSkgewotICAgICAgICBUb3VjaFBvaW50IHRwID0gbVRvdWNoUG9pbnRzLmdldCgwKTsKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVUb3VjaFBvaW50KGludCBpLCBpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgVG91Y2hQb2ludCB0cCA9IG1Ub3VjaFBvaW50cy5nZXQoaSk7CiAgICAgICAgIGlmICh0cCA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTI3Niw3ICszNDAsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VUb3VjaFBvaW50KGludCBpZCkgewotICAgICAgICBUb3VjaFBvaW50IHRwID0gbVRvdWNoUG9pbnRzLmdldCgwKTsKKyAgICAgICAgVG91Y2hQb2ludCB0cCA9IG1Ub3VjaFBvaW50cy5nZXQoaWQpOwogICAgICAgICBpZiAodHAgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0zMDUsNiArMzY5LDcgQEAKICAgICBwcml2YXRlIGludCBtb3VzZVk7CiAKICAgICBwcml2YXRlIGNsYXNzIFRvdWNoUG9pbnQgeworICAgICAgICBwcml2YXRlIGludCBtSWQ7CiAgICAgICAgIHByaXZhdGUgaW50IG1YOwogICAgICAgICBwcml2YXRlIGludCBtWTsKICAgICAgICAgcHJpdmF0ZSBsb25nIG1Eb3duVGltZTsKQEAgLTMxMiw3ICszNzcsOCBAQAogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU1vdmVkOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNhbmNlbGxlZDsKIAotICAgICAgICBwdWJsaWMgVG91Y2hQb2ludChpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgcHVibGljIFRvdWNoUG9pbnQoaW50IGlkLCBpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgICAgIG1JZCA9IGlkOwogICAgICAgICAgICAgbVggPSB4OwogICAgICAgICAgICAgbVkgPSB5OwogICAgICAgICAgICAgbVJlbGVhc2VkID0gZmFsc2U7CkBAIC0zMzIsNiArMzk4LDcgQEAKICAgICAgICAgcHVibGljIHZvaWQgc2V0TW92ZWQoYm9vbGVhbiBtb3ZlZCkgeyBtTW92ZWQgPSBtb3ZlZDsgfQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3ZlZCgpIHsgcmV0dXJuIG1Nb3ZlZDsgfQogCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0SWQoKSB7IHJldHVybiBtSWQ7IH0KICAgICAgICAgcHVibGljIGludCBnZXRYKCkgeyByZXR1cm4gbVg7IH0KICAgICAgICAgcHVibGljIGludCBnZXRZKCkgeyByZXR1cm4gbVk7IH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL0FuZHJvaWQubWsgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWZjNjMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyOSBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyCisKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBkaWZmX21hdGNoX3BhdGNoCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBEdW1wUmVuZGVyVHJlZTIKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTY1NzFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw2MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgcGFja2FnZT0iY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyIj4KKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii51aS5EaXJMaXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJEdW1wIFJlbmRlciBUcmVlIDIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9uIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5URVNUIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDwhLS0gYW5kcm9pZDpsYXVuY2hNb2RlPSJzaW5nbGVUYXNrIiBpcyB0aGVyZSBzbyB3ZSBvbmx5IGhhdmUgYSBvbmUgaW5zdGFuY2UKKyAgICAgICAgICAgICBvZiB0aGlzIGFjdGl2aXR5LiBIb3dldmVyLCBpdCBkb2Vzbid0IHNlZW0gdG8gd29yayBleGFjdGx5IGxpa2UgZGVzY3JpYmVkIGluIHRoZQorICAgICAgICAgICAgIGRvY3VtZW50YXRpb24sIGJlY2F1c2UgdGhlIGJlaGF2aW91ciBvZiB0aGUgYXBwbGljYXRpb24gc3VnZ2VzdAorICAgICAgICAgICAgIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgdGFzayBmb3IgYWxsIDMgYWN0aXZpdGllcy4gV2UgZG9uJ3QgdW5kZXJzdGFuZAorICAgICAgICAgICAgIGhvdyBleGFjdGx5IGl0IGFsbCB3b3JrcywgYnV0IGF0IHRoZSBtb21lbnQgaXQgd29ya3MganVzdCBmaW5lLgorICAgICAgICAgICAgIEl0IGNhbiBsZWFkIHRvIHNvbWUgd2VpcmQgYmVoYXZpb3VyIGluIHRoZSBmdXR1cmUuIC0tPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuVGVzdHNMaXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJUZXN0cycgbGlzdCBhY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVGFzayIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb24iPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5MYXlvdXRUZXN0c0V4ZWN1dG9yIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL1doaXRlQmFja2dyb3VuZCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkxheW91dCB0ZXN0cycgZXhlY3V0b3IiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnByb2Nlc3M9IjpleGVjdXRvciI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJNYW5hZ2VyU2VydmljZSI+CisgICAgICAgIDwvc2VydmljZT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5zY3JpcHRzdXBwb3J0LlNjcmlwdFRlc3RSdW5uZXIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMiIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkxheW91dCB0ZXN0cyBzY3JpcHQgcnVubmVyIiAvPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1NEQ0FSRCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XQUtFX0xPQ0siIC8+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL2Fzc2V0cy9ydW5fYXBhY2hlMi5weSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2FwYWNoZTIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWVkZWFkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2FwYWNoZTIucHkKQEAgLTAsMCArMSwxNTAgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIiIiU3RhcnQsIHN0b3AsIG9yIHJlc3RhcnQgYXBhY2hlMiBzZXJ2ZXIuCisKKyAgQXBhY2hlMiBtdXN0IGJlIGluc3RhbGxlZCB3aXRoIG1vZF9waHAhCisKKyAgVXNhZ2U6CisgICAgcnVuX2FwYWNoZTIucHkgc3RhcnR8c3RvcHxyZXN0YXJ0CisiIiIKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcHRwYXJzZQoraW1wb3J0IHRpbWUKKworZGVmIG1haW4ob3B0aW9ucywgYXJncyk6CisgIGlmIGxlbihhcmdzKSA8IDE6CisgICAgcnVuX2NtZCA9ICIiCisgIGVsc2U6CisgICAgcnVuX2NtZCA9IGFyZ3NbMF0KKworICAjIFNldHVwIGxvZ2dpbmcgY2xhc3MKKyAgbG9nZ2luZy5iYXNpY0NvbmZpZyhsZXZlbD1sb2dnaW5nLklORk8sIGZvcm1hdD0nJShtZXNzYWdlKXMnKQorCisgIGlmIG5vdCBydW5fY21kIGluICgic3RhcnQiLCAic3RvcCIsICJyZXN0YXJ0Iik6CisgICAgbG9nZ2luZy5pbmZvKCJpbGxlZ2FsIGFyZ3VtZW50OiAiICsgcnVuX2NtZCkKKyAgICBsb2dnaW5nLmluZm8oIlVzYWdlOiBweXRob24gcnVuX2FwYWNoZTIucHkgc3RhcnR8c3RvcHxyZXN0YXJ0IikKKyAgICByZXR1cm4KKworICAjIENyZWF0ZSAvdG1wL1dlYktpdCBpZiBpdCBkb2Vzbid0IGV4aXN0LiBUaGlzIGlzIG5lZWRlZCBmb3IgdmFyaW91cyBmaWxlcyB1c2VkIGJ5IGFwYWNoZTIKKyAgdG1wX1dlYktpdCA9IG9zLnBhdGguam9pbigiL3RtcCIsICJXZWJLaXQiKQorICBpZiBub3Qgb3MucGF0aC5leGlzdHModG1wX1dlYktpdCk6CisgICAgb3MubWtkaXIodG1wX1dlYktpdCkKKworICAjIEdldCB0aGUgcGF0aCB0byBhbmRyb2lkIHRyZWUgcm9vdCBiYXNlZCBvbiB0aGUgc2NyaXB0IGxvY2F0aW9uLgorICAjIEJhc2ljYWxseSB3ZSBnbyA1IGxldmVscyB1cAorICBwYXJlbnQgPSBvcy5wYXJkaXIKKyAgc2NyaXB0X2xvY2F0aW9uID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSkpCisgIGFuZHJvaWRfdHJlZV9yb290ID0gb3MucGF0aC5qb2luKHNjcmlwdF9sb2NhdGlvbiwgcGFyZW50LCBwYXJlbnQsIHBhcmVudCwgcGFyZW50LCBwYXJlbnQpCisgIGFuZHJvaWRfdHJlZV9yb290ID0gb3MucGF0aC5ub3JtcGF0aChhbmRyb2lkX3RyZWVfcm9vdCkKKworICAjIElmIGFueSBvZiB0aGVzZSBpcyByZWxhdGl2ZSwgdGhlbiBpdCdzIHJlbGF0aXZlIHRvIFNlcnZlclJvb3QgKGluIG91ciBjYXNlIGFuZHJvaWRfdHJlZV9yb290KQorICB3ZWJraXRfcGF0aCA9IG9zLnBhdGguam9pbigiZXh0ZXJuYWwiLCAid2Via2l0IikKKyAgaWYgKG9wdGlvbnMudGVzdHNfcm9vdF9kaXJlY3RvcnkgIT0gTm9uZSk6CisgICAgIyBpZiBvcHRpb25zLnRlc3RzX3Jvb3RfZGlyZWN0b3J5IGlzIGFic29sdXRlLCBvcy5nZXRjd2QoKSBpcyBkaXNjYXJkZWQhCisgICAgbGF5b3V0X3Rlc3RzX3BhdGggPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgb3B0aW9ucy50ZXN0c19yb290X2RpcmVjdG9yeSkpCisgIGVsc2U6CisgICAgbGF5b3V0X3Rlc3RzX3BhdGggPSBvcy5wYXRoLmpvaW4od2Via2l0X3BhdGgsICJMYXlvdXRUZXN0cyIpCisgIGh0dHBfY29uZl9wYXRoID0gb3MucGF0aC5qb2luKGxheW91dF90ZXN0c19wYXRoLCAiaHR0cCIsICJjb25mIikKKworICAjIFByZXBhcmUgdGhlIGNvbW1hbmQgdG8gc2V0ICR7QVBBQ0hFX1JVTl9VU0VSfSBhbmQgJHtBUEFDSEVfUlVOX0dST1VQfQorICBlbnZ2YXJzX3BhdGggPSBvcy5wYXRoLmpvaW4oIi9ldGMiLCAiYXBhY2hlMiIsICJlbnZ2YXJzIikKKyAgZXhwb3J0X2VudnZhcnNfY21kID0gInNvdXJjZSAiICsgZW52dmFyc19wYXRoCisKKyAgZXJyb3JfbG9nX3BhdGggPSBvcy5wYXRoLmpvaW4odG1wX1dlYktpdCwgImFwYWNoZTItZXJyb3IubG9nIikKKyAgY3VzdG9tX2xvZ19wYXRoID0gb3MucGF0aC5qb2luKHRtcF9XZWJLaXQsICJhcGFjaGUyLWFjY2Vzcy5sb2ciKQorCisgICMgUHJlcGFyZSB0aGUgY29tbWFuZCB0byAocmUpc3RhcnQvc3RvcCB0aGUgc2VydmVyIHdpdGggc3BlY2lmaWVkIHNldHRpbmdzCisgIGFwYWNoZTJfcmVzdGFydF90ZW1wbGF0ZSA9ICJhcGFjaGUyIC1rICVzIgorICBkaXJlY3RpdmVzICA9ICIgLWMgXCJTZXJ2ZXJSb290ICIgKyBhbmRyb2lkX3RyZWVfcm9vdCArICJcIiIKKworICAjIFRoZSBkZWZhdWx0IGNvbmZpZyBpbiBhcGFjaGUyLWRlYmlhbi1odHRwZC5jb25mIGxpc3RlbnMgb24gcG9ydHMgODA4MCBhbmQKKyAgIyA4NDQzLiBXZSBhbHNvIG5lZWQgdG8gbGlzdGVuIG9uIHBvcnQgODAwMCBmb3IgSFRUUCB0ZXN0cy4KKyAgZGlyZWN0aXZlcyArPSAiIC1jIFwiTGlzdGVuIDgwMDBcIiIKKworICAjIFdlIHVzZSBodHRwL3Rlc3RzIGFzIHRoZSBkb2N1bWVudCByb290IGFzIHRoZSBIVFRQIHRlc3RzIHVzZSBoYXJkY29kZWQKKyAgIyByZXNvdXJjZXMgYXQgdGhlIHNlcnZlciByb290LiBXZSB0aGVuIHVzZSBhbGlhc2VzIHRvIG1ha2UgYXZhaWxhYmxlIHRoZQorICAjIGNvbXBsZXRlIHNldCBvZiB0ZXN0cyBhbmQgdGhlIHJlcXVpcmVkIHNjcmlwdHMuCisgIGRpcmVjdGl2ZXMgKz0gIiAtYyBcIkRvY3VtZW50Um9vdCAiICsgb3MucGF0aC5qb2luKGxheW91dF90ZXN0c19wYXRoLCAiaHR0cCIsICJ0ZXN0cy8iKSArICJcIiIKKyAgZGlyZWN0aXZlcyArPSAiIC1jIFwiQWxpYXMgL0xheW91dFRlc3RzICIgKyBsYXlvdXRfdGVzdHNfcGF0aCArICJcIiIKKyAgZGlyZWN0aXZlcyArPSAiIC1jIFwiQWxpYXMgL1dlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL2FuZHJvaWQgIiArIFwKKyAgICBvcy5wYXRoLmpvaW4od2Via2l0X3BhdGgsICJXZWJLaXRUb29scyIsICJEdW1wUmVuZGVyVHJlZSIsICJhbmRyb2lkIikgKyAiXCIiCisgIGRpcmVjdGl2ZXMgKz0gIiAtYyBcIkFsaWFzIC9UaGlyZFBhcnR5UHJvamVjdC5wcm9wICIgKyBcCisgICAgb3MucGF0aC5qb2luKHdlYmtpdF9wYXRoLCAiVGhpcmRQYXJ0eVByb2plY3QucHJvcCIpICsgIlwiIgorCisgICMgVGhpcyBkaXJlY3RpdmUgaXMgY29tbWVudGVkIG91dCBpbiBhcGFjaGUyLWRlYmlhbi1odHRwZC5jb25mIGZvciBzb21lIHJlYXNvbgorICAjIEhvd2V2ZXIsIGl0IGlzIHVzZWZ1bCB0byBicm93c2UgdGhyb3VnaCB0ZXN0cyBpbiB0aGUgYnJvd3Nlciwgc28gaXQncyBhZGRlZCBoZXJlLgorICAjIE9uZSB0aGluZyB0byBub3RlIGlzIHRoYXQgYmVjYXVzZSBvZiBwcm9ibGVtcyB3aXRoIG1vZF9kaXIgYW5kIHBvcnQgbnVtYmVycywgbW9kX2RpcgorICAjIGlzIHR1cm5lZCBvZmYuIFRoYXQgbWVhbnMgdGhhdCB0aGVyZSBfbXVzdF8gYmUgYSB0cmFpbGluZyBzbGFzaCBhdCB0aGUgZW5kIG9mIFVSTAorICAjIGZvciBhdXRvIGluZGV4ZXMgdG8gd29yayBjb3JyZWN0bHkuCisgIGRpcmVjdGl2ZXMgKz0gIiAtYyBcIkxvYWRNb2R1bGUgYXV0b2luZGV4X21vZHVsZSAvdXNyL2xpYi9hcGFjaGUyL21vZHVsZXMvbW9kX2F1dG9pbmRleC5zb1wiIgorCisgIGRpcmVjdGl2ZXMgKz0gIiAtYyBcIkVycm9yTG9nICIgKyBlcnJvcl9sb2dfcGF0aCArIlwiIgorICBkaXJlY3RpdmVzICs9ICIgLWMgXCJDdXN0b21Mb2cgIiArIGN1c3RvbV9sb2dfcGF0aCArICIgY29tYmluZWRcIiIKKyAgZGlyZWN0aXZlcyArPSAiIC1jIFwiU1NMQ2VydGlmaWNhdGVGaWxlICIgKyBvcy5wYXRoLmpvaW4oaHR0cF9jb25mX3BhdGgsICJ3ZWJraXQtaHR0cGQucGVtIikgKyBcCisgICAgIlwiIgorICBkaXJlY3RpdmVzICs9ICIgLWMgXCJVc2VyICR7QVBBQ0hFX1JVTl9VU0VSfVwiIgorICBkaXJlY3RpdmVzICs9ICIgLWMgXCJHcm91cCAke0FQQUNIRV9SVU5fR1JPVVB9XCIiCisgIGRpcmVjdGl2ZXMgKz0gIiAtQyBcIlR5cGVzQ29uZmlnICIgKyBcCisgICAgb3MucGF0aC5qb2luKGFuZHJvaWRfdHJlZV9yb290LCBodHRwX2NvbmZfcGF0aCwgIm1pbWUudHlwZXMiKSArICJcIiIKKyAgY29uZl9maWxlX2NtZCA9ICIgLWYgIiArIFwKKyAgICBvcy5wYXRoLmpvaW4oYW5kcm9pZF90cmVlX3Jvb3QsIGh0dHBfY29uZl9wYXRoLCAiYXBhY2hlMi1kZWJpYW4taHR0cGQuY29uZiIpCisKKyAgIyBUcnkgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZHMKKyAgbG9nZ2luZy5pbmZvKCJXaWxsICIgKyBydW5fY21kICsgIiBhcGFjaGUyIHNlcnZlci4iKQorCisgICMgSXQgaXMgd29ydGggbm90aW5nIGhlcmUgdGhhdCBpZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHdpdGggd2hpY2ggd2UgcmVzdGFydCB0aGUgc2VydmVyIHBvaW50cworICAjIHRvIGEgZGlmZmVyZW50IFBpZEZpbGUgaXQgd2lsbCBub3Qgd29yayBhbmQgd2lsbCByZXN1bHQgaW4gYSBzZWNvbmQgYXBhY2hlMiBpbnN0YW5jZS4KKyAgaWYgKHJ1bl9jbWQgPT0gJ3Jlc3RhcnQnKToKKyAgICBsb2dnaW5nLmluZm8oIkZpcnN0IHdpbGwgc3RvcC4uLiIpCisgICAgZXhlY3V0ZV9jbWQoZXhwb3J0X2VudnZhcnNfY21kICsgIiAmJiAiICsgKGFwYWNoZTJfcmVzdGFydF90ZW1wbGF0ZSAlICgnc3RvcCcpKSArIGRpcmVjdGl2ZXMgKyBjb25mX2ZpbGVfY21kKQorICAgIGxvZ2dpbmcuaW5mbygiU3RvcHBlZC4gV2lsbCBzdGFydCBub3cuLi4iKQorICAgICMgV2UgbmVlZCB0byBzbGVlcCBicmVpZmx5IHRvIGF2b2lkIGVycm9ycyB3aXRoIGFwYWNoZSBiZWluZyBzdG9wcGVkIGFuZCBzdGFydGVkIHRvbyBxdWlja2x5CisgICAgdGltZS5zbGVlcCgwLjUpCisKKyAgZXhlY3V0ZV9jbWQoZXhwb3J0X2VudnZhcnNfY21kICsgIiAmJiAiICsgKGFwYWNoZTJfcmVzdGFydF90ZW1wbGF0ZSAlIChydW5fY21kKSkgKyBkaXJlY3RpdmVzICsgY29uZl9maWxlX2NtZCkKKworZGVmIGV4ZWN1dGVfY21kKGNtZCk6CisgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc2hlbGw9VHJ1ZSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgKG91dCwgZXJyKSA9IHAuY29tbXVuaWNhdGUoKQorCisgICMgT3V0cHV0IHRoZSBzdGRvdXQgZnJvbSB0aGUgY29tbWFuZCB0byBjb25zb2xlCisgIGxvZ2dpbmcuaW5mbyhvdXQpCisKKyAgIyBSZXBvcnQgYW55IGVycm9ycworICBpZiBwLnJldHVybmNvZGUgIT0gMDoKKyAgICBsb2dnaW5nLmluZm8oIiEhIEVSUk9SUzoiKQorCisgICAgaWYgZXJyLmZpbmQoZW52dmFyc19wYXRoKSAhPSAtMToKKyAgICAgIGxvZ2dpbmcuaW5mbyhlcnIpCisgICAgZWxpZiBlcnIuZmluZCgnY29tbWFuZCBub3QgZm91bmQnKSAhPSAtMToKKyAgICAgIGxvZ2dpbmcuaW5mbygiYXBhY2hlMiBpcyBwcm9iYWJseSBub3QgaW5zdGFsbGVkIikKKyAgICBlbHNlOgorICAgICAgbG9nZ2luZy5pbmZvKGVycikKKyAgICAgIGxvZ2dpbmcuaW5mbygiVHJ5IGxvb2tpbmcgaW4gIiArIGVycm9yX2xvZ19wYXRoICsgIiBmb3IgZGV0YWlscyIpCisgIGVsc2U6CisgICAgbG9nZ2luZy5pbmZvKCJPSyIpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgIG9wdGlvbl9wYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIodXNhZ2U9IlVzYWdlOiAlcHJvZyBbb3B0aW9uc10gc3RhcnR8c3RvcHxyZXN0YXJ0IikKKyAgb3B0aW9uX3BhcnNlci5hZGRfb3B0aW9uKCIiLCAiLS10ZXN0cy1yb290LWRpcmVjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJUaGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggdG8gdGFrZSB0aGUgdGVzdHMsIGRlZmF1bHQgaXMgZXh0ZXJuYWwvd2Via2l0L0xheW91dFRlc3RzIGluIHRoaXMgY2hlY2tvdXQgb2YgdGhlIEFuZHJvaWQgdHJlZSIpCisgIG9wdGlvbnMsIGFyZ3MgPSBvcHRpb25fcGFyc2VyLnBhcnNlX2FyZ3MoKTsKKyAgbWFpbihvcHRpb25zLCBhcmdzKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMDNhMDU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5CkBAIC0wLDAgKzEsOTQgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKKyIiIlJ1biBsYXlvdXQgdGVzdHMgb24gdGhlIGRldmljZS4KKworICBJdCBydW5zIHRoZSBzcGVjaWZpZWQgdGVzdHMgb24gdGhlIGRldmljZSwgZG93bmxvYWRzIHRoZSBzdW1tYXJpZXMgdG8gdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkKKyAgYW5kIG9wdGlvbmFsbHkgc2hvd3MgdGhlIGRldGFpbGVkIHJlc3VsdHMgdGhlIGhvc3QncyBkZWZhdWx0IGJyb3dzZXIuCisKKyAgVXNhZ2U6CisgICAgcnVuX2xheW91dF90ZXN0cy5weSAtLXNob3ctcmVzdWx0cy1pbi1icm93c2VyIHRlc3QtcmVsYXRpdmUtcGF0aAorIiIiCisKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3B0cGFyc2UKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgd2ViYnJvd3NlcgorCisjVE9ETzogVGhlc2Ugc2hvdWxkIG5vdCBiZSBoYXJkY29kZWQKK1JFU1VMVFNfQUJTT0xVVEVfUEFUSCA9ICIvc2RjYXJkL2xheW91dC10ZXN0LXJlc3VsdHMvIgorREVUQUlMU19IVE1MID0gImRldGFpbHMuaHRtbCIKK1NVTU1BUllfVFhUID0gInN1bW1hcnkudHh0IgorCitkZWYgbWFpbihvcHRpb25zLCBhcmdzKToKKyAgaWYgYXJnczoKKyAgICBwYXRoID0gIiAiLmpvaW4oYXJncyk7CisgIGVsc2U6CisgICAgcGF0aCA9ICIiOworCisgIGxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9bG9nZ2luZy5JTkZPLCBmb3JtYXQ9JyUobWVzc2FnZSlzJykKKworICB0bXBkaXIgPSB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkKKworICBpZiBvcHRpb25zLnRlc3RzX3Jvb3RfZGlyZWN0b3J5ICE9IE5vbmU6CisgICAgIyBpZiBvcHRpb25zLnRlc3RzX3Jvb3RfZGlyZWN0b3J5IGlzIGFic29sdXRlLCBvcy5nZXRjd2QoKSBpcyBkaXNjYXJkZWQhCisgICAgdGVzdHNfcm9vdF9kaXJlY3RvcnkgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgb3B0aW9ucy50ZXN0c19yb290X2RpcmVjdG9yeSkpCisgICAgc2VydmVyX29wdGlvbnMgPSAiIC0tdGVzdHMtcm9vdC1kaXJlY3Rvcnk9IiArIHRlc3RzX3Jvb3RfZGlyZWN0b3J5CisgIGVsc2U6CisgICAgc2VydmVyX29wdGlvbnMgPSAiIjsKKworICAjIFJlc3RhcnQgdGhlIHNlcnZlcgorICBjbWQgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSkpLCAicnVuX2FwYWNoZTIucHkiKSArIHNlcnZlcl9vcHRpb25zICsgIiByZXN0YXJ0IgorICBvcy5zeXN0ZW0oY21kKTsKKworICAjIFJ1biB0aGUgdGVzdHMgaW4gcGF0aAorICBhZGJfY21kID0gImFkYiIKKyAgaWYgb3B0aW9ucy5zZXJpYWw6CisgICAgYWRiX2NtZCArPSAiIC1zICIgKyBvcHRpb25zLnNlcmlhbAorICBjbWQgPSBhZGJfY21kICsgIiBzaGVsbCBhbSBpbnN0cnVtZW50ICIKKyAgY21kICs9ICItZSBjbGFzcyBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuc2NyaXB0c3VwcG9ydC5TdGFydGVyI3N0YXJ0TGF5b3V0VGVzdHMgIgorICBjbWQgKz0gIi1lIHBhdGggXCIiICsgcGF0aCArICJcIiAiCisgIGNtZCArPSAiLXcgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyL2NvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5zY3JpcHRzdXBwb3J0LlNjcmlwdFRlc3RSdW5uZXIiCisKKyAgbG9nZ2luZy5pbmZvKCJSdW5uaW5nIHRoZSB0ZXN0cy4uLiIpCisgIChzdGRvdXRkYXRhLCBzdGRlcnJkYXRhKSA9IHN1YnByb2Nlc3MuUG9wZW4oY21kLCBzaGVsbD1UcnVlLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKS5jb21tdW5pY2F0ZSgpCisgIGlmIHJlLnNlYXJjaCgiXklOU1RSVU1FTlRBVElPTl9TVEFUVVNfQ09ERTogLTEiLCBzdGRvdXRkYXRhLCByZS5NVUxUSUxJTkUpICE9IE5vbmU6CisgICAgbG9nZ2luZy5pbmZvKCJGYWlsZWQgdG8gcnVuIHRoZSB0ZXN0cy4gSXMgRHVtcFJlbmRlclRyZWUyIGluc3RhbGxlZCBvbiB0aGUgZGV2aWNlPyIpCisgICAgcmV0dXJuCisKKyAgbG9nZ2luZy5pbmZvKCJEb3dubG9hZGluZyB0aGUgc3VtbWFyaWVzLi4uIikKKworICAjIERvd25sb2FkIHRoZSB0eHQgc3VtbWFyeSB0byB0bXAgZm9sZGVyCisgIHN1bW1hcnlfdHh0X3RtcF9wYXRoID0gb3MucGF0aC5qb2luKHRtcGRpciwgU1VNTUFSWV9UWFQpCisgIGNtZCA9ICJybSAtZiAiICsgc3VtbWFyeV90eHRfdG1wX3BhdGggKyAiOyIKKyAgY21kICs9IGFkYl9jbWQgKyAiIHB1bGwgIiArIFJFU1VMVFNfQUJTT0xVVEVfUEFUSCArIFNVTU1BUllfVFhUICsgIiAiICsgc3VtbWFyeV90eHRfdG1wX3BhdGgKKyAgc3VicHJvY2Vzcy5Qb3BlbihjbWQsIHNoZWxsPVRydWUpLndhaXQoKQorCisgICMgRG93bmxvYWQgdGhlIGh0bWwgc3VtbWFyeSB0byB0bXAgZm9sZGVyCisgIGRldGFpbHNfaHRtbF90bXBfcGF0aCA9IG9zLnBhdGguam9pbih0bXBkaXIsIERFVEFJTFNfSFRNTCkKKyAgY21kID0gInJtIC1mICIgKyBkZXRhaWxzX2h0bWxfdG1wX3BhdGggKyAiOyIKKyAgY21kICs9IGFkYl9jbWQgKyAiIHB1bGwgIiArIFJFU1VMVFNfQUJTT0xVVEVfUEFUSCArIERFVEFJTFNfSFRNTCArICIgIiArIGRldGFpbHNfaHRtbF90bXBfcGF0aAorICBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc2hlbGw9VHJ1ZSkud2FpdCgpCisKKyAgIyBQcmludCBzdW1tYXJ5IHRvIGNvbnNvbGUKKyAgbG9nZ2luZy5pbmZvKCJBbGwgZG9uZS5cbiIpCisgIGNtZCA9ICJjYXQgIiArIHN1bW1hcnlfdHh0X3RtcF9wYXRoCisgIG9zLnN5c3RlbShjbWQpCisgIGxvZ2dpbmcuaW5mbygiIikKKworICAjIE9wZW4gdGhlIGJyb3dzZXIgd2l0aCBzdW1tYXJ5CisgIGlmIG9wdGlvbnMuc2hvd19yZXN1bHRzX2luX2Jyb3dzZXIgIT0gImZhbHNlIjoKKyAgICB3ZWJicm93c2VyLm9wZW4oZGV0YWlsc19odG1sX3RtcF9wYXRoKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICBvcHRpb25fcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKHVzYWdlPSJVc2FnZTogJXByb2cgW29wdGlvbnNdIHRlc3QtcmVsYXRpdmUtcGF0aCIpCisgIG9wdGlvbl9wYXJzZXIuYWRkX29wdGlvbigiIiwgIi0tc2hvdy1yZXN1bHRzLWluLWJyb3dzZXIiLCBkZWZhdWx0PSJ0cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlNob3cgdGhlIHJlc3VsdHMgdGhlIGhvc3QncyBkZWZhdWx0IHdlYiBicm93c2VyLCBkZWZhdWx0PXRydWUiKQorICBvcHRpb25fcGFyc2VyLmFkZF9vcHRpb24oIiIsICItLXRlc3RzLXJvb3QtZGlyZWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0byB0YWtlIHRoZSB0ZXN0cywgZGVmYXVsdCBpcyBleHRlcm5hbC93ZWJraXQvTGF5b3V0VGVzdHMgaW4gdGhpcyBjaGVja291dCBvZiB0aGUgQW5kcm9pZCB0cmVlIikKKyAgb3B0aW9uX3BhcnNlci5hZGRfb3B0aW9uKCItcyIsICItLXNlcmlhbCIsIGRlZmF1bHQ9Tm9uZSwgaGVscD0iU3BlY2lmeSB0aGUgc2VyaWFsIG51bWJlciBvZiBkZXZpY2UgdG8gcnVuIHRlc3Qgb24iKQorICBvcHRpb25zLCBhcmdzID0gb3B0aW9uX3BhcnNlci5wYXJzZV9hcmdzKCk7CisgIG1haW4ob3B0aW9ucywgYXJncyk7CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2RyYXdhYmxlL2ZvbGRlci5wbmcgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2RyYXdhYmxlL2ZvbGRlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIzZmNlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9yZXMvZHJhd2FibGUvZm9sZGVyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2RyYXdhYmxlL3J1bnRlc3QucG5nIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9kcmF3YWJsZS9ydW50ZXN0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTBjNjU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9kcmF3YWJsZS9ydW50ZXN0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2xheW91dC9kaXJsaXN0X3Jvdy54bWwgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2xheW91dC9kaXJsaXN0X3Jvdy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1NzhhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9yZXMvbGF5b3V0L2Rpcmxpc3Rfcm93LnhtbApAQCAtMCwwICsxLDQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjgwcHgiCisgICAgICAgIGFuZHJvaWQ6YWRqdXN0Vmlld0JvdW5kcz0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTVweCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjE1cHgiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMTVweCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIxNXB4IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGFiZWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI2MHB4IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTRzcCIKKyAgICAvPgorCis8L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL21lbnUvZ3VpX21lbnUueG1sIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9tZW51L2d1aV9tZW51LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWIyYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9tZW51L2d1aV9tZW51LnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvcnVuX2FsbCIKKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3J1bl9hbGxfdGVzdHMiIC8+Cis8L21lbnU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDk2NDA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19ydW5fYWJvcnRfZGlyX3RpdGxlX3ByZWZpeCI+RGlyZWN0b3J5Ojwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX3J1bl9hYm9ydF9kaXJfbXNnIj5UaGlzIHdpbGwgcnVuIGFsbCB0aGUgdGVzdHMgaW4gdGhpcyBkaXJlY3RvcnkgYW5kIGFsbAorICAgICAgICAgICAgdGhlIHN1YmRpcmVjdG9yaWVzLiBJdCBtYXkgdGFrZSBhIGZldyBob3VycyE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19ydW5fYWJvcnRfZGlyX29rX2J1dHRvbiI+UnVuIHRlc3RzITwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX3J1bl9hYm9ydF9kaXJfYWJvcnRfYnV0dG9uIj5BYm9ydDwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfcHJvZ3Jlc3NfdGl0bGUiPkxvYWRpbmcgaXRlbXMuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfcHJvZ3Jlc3NfbXNnIj5QbGVhc2Ugd2FpdC4uLjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJydW5uZXJfcHJlbG9hZGluZ190aXRsZSI+UHJlbG9hZGluZyB0ZXN0cy4uLjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJydW5fYWxsX3Rlc3RzIj5SdW4gYWxsIHRlc3RzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeTwvc3RyaW5nPgorPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3R5bGUueG1sIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3R5bGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZjM0MTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL3ZhbHVlcy9zdHlsZS54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHJlc291cmNlcz4KKyAgICA8c3R5bGUgbmFtZT0iV2hpdGVCYWNrZ3JvdW5kIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci93aGl0ZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvQWJzdHJhY3RSZXN1bHQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0Fic3RyYWN0UmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0YjAzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0Fic3RyYWN0UmVzdWx0LmphdmEKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworLyoqCisgKiBBIGNsYXNzIHRoYXQgcmVwcmVzZW50IGEgcmVzdWx0IG9mIHRoZSB0ZXN0LiBJdCBpcyByZXNwb25zaWJsZSBmb3IgcmV0dXJuaW5nIHRoZSByZXN1bHQncworICogcmF3IGRhdGEgYW5kIGdlbmVyYXRpbmcgaXRzIG93biBkaWZmIGluIEhUTUwgZm9ybWF0LgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXN1bHQgaW1wbGVtZW50cyBDb21wYXJhYmxlPEFic3RyYWN0UmVzdWx0PiwgU2VyaWFsaXphYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkFic3RyYWN0UmVzdWx0IjsKKworICAgIHB1YmxpYyBlbnVtIFRlc3RUeXBlIHsKKyAgICAgICAgVEVYVCB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFJlc3VsdCBjcmVhdGVSZXN1bHQoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dFJlc3VsdChidW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBSRU5ERVJfVFJFRSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFJlc3VsdCBjcmVhdGVSZXN1bHQoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBSZW5kZXJUcmVlIHRlc3RzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCAqLworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBBYnN0cmFjdFJlc3VsdCBjcmVhdGVSZXN1bHQoQnVuZGxlIGJ1bmRsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjb2RlIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0IG9mIGNvbXBhcmluZyBhY3R1YWwgYW5kIGV4cGVjdGVkIHJlc3VsdHMuCisgICAgICovCisgICAgcHVibGljIGVudW0gUmVzdWx0Q29kZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgICAgIFJFU1VMVFNfTUFUQ0goIlJlc3VsdHMgbWF0Y2giKSwKKyAgICAgICAgUkVTVUxUU19ESUZGRVIoIlJlc3VsdHMgZGlmZmVyIiksCisgICAgICAgIE5PX0VYUEVDVEVEX1JFU1VMVCgiTm8gZXhwZWN0ZWQgcmVzdWx0IiksCisgICAgICAgIE5PX0FDVFVBTF9SRVNVTFQoIk5vIGFjdHVhbCByZXN1bHQiKTsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBtVGl0bGU7CisKKyAgICAgICAgcHJpdmF0ZSBSZXN1bHRDb2RlKFN0cmluZyB0aXRsZSkgeworICAgICAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGl0bGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTdHJpbmcgbUFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nOworCisgICAgcHVibGljIGludCBjb21wYXJlVG8oQWJzdHJhY3RSZXN1bHQgYW5vdGhlcikgeworICAgICAgICByZXR1cm4gZ2V0UmVsYXRpdmVQYXRoKCkuY29tcGFyZVRvKGFub3RoZXIuZ2V0UmVsYXRpdmVQYXRoKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nKFN0cmluZyBhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZykgeworICAgICAgICBtQWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcgPSBhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbUFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nOworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoKSB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbnVsbDsKKyAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYW9zKTsKKyAgICAgICAgICAgICAgICBvb3Mud3JpdGVPYmplY3QodGhpcyk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChiYW9zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYmFvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob29zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb29zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5hYmxlIHRvIHNlcmlhbGl6ZSByZXN1bHQ6ICIgKyBnZXRSZWxhdGl2ZVBhdGgoKSwgZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYmFvcyA9PSBudWxsID8gbnVsbCA6IGJhb3MudG9CeXRlQXJyYXkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEFic3RyYWN0UmVzdWx0IGNyZWF0ZShieXRlW10gYnl0ZXMpIHsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG51bGw7CisgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG51bGw7CisgICAgICAgIEFic3RyYWN0UmVzdWx0IHJlc3VsdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOworICAgICAgICAgICAgICAgIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShiYWlzKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAoQWJzdHJhY3RSZXN1bHQpb2lzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKGJhaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBiYWlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmFibGUgdG8gZGVzZXJpYWxpemUgcmVzdWx0ISIsIGUpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJVbmFibGUgdG8gZGVzZXJpYWxpemUgcmVzdWx0ISIsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXJSZXN1bHRzKCkgeworICAgICAgICBtQWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2VzIHRoZSByZXN1bHQgb2JqZWN0IG9idGFpbiB0aGUgcmVzdWx0cyBvZiB0aGUgdGVzdCBmcm9tIHRoZSB3ZWJ2aWV3CisgICAgICogYW5kIHN0b3JlIHRoZW0gaW4gdGhlIGZvcm1hdCB0aGF0IHN1aXRzIGl0c2VsZiBiZXN0cy4gVGhpcyBtZXRob2QgaXMgYXN5bmNocm9ub3VzLgorICAgICAqIFRoZSBtZXNzYWdlIHBhc3NlZCBhcyBhIHBhcmFtZXRlciBpcyBhIG1lc3NhZ2UgdGhhdCBzaG91bGQgYmUgc2VudCB0byBpdHMgdGFyZ2V0CisgICAgICogd2hlbiB0aGUgcmVzdWx0IGZpbmlzaGVzIG9idGFpbmluZyB0aGUgcmVzdWx0LgorICAgICAqCisgICAgICogQHBhcmFtIHdlYnZpZXcKKyAgICAgKiBAcGFyYW0gcmVzdWx0T2J0YWluZWRNc2cKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvYnRhaW5BY3R1YWxSZXN1bHRzKFdlYlZpZXcgd2VidmlldywgTWVzc2FnZSByZXN1bHRPYnRhaW5lZE1zZyk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRFeHBlY3RlZEltYWdlUmVzdWx0KGJ5dGVbXSBleHBlY3RlZFJlc3VsdCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRFeHBlY3RlZEltYWdlUmVzdWx0UGF0aChTdHJpbmcgcmVsYXRpdmVQYXRoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RXhwZWN0ZWRJbWFnZVJlc3VsdFBhdGgoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEV4cGVjdGVkVGV4dFJlc3VsdChTdHJpbmcgZXhwZWN0ZWRSZXN1bHQpOworCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RXhwZWN0ZWRUZXh0UmVzdWx0UGF0aChTdHJpbmcgcmVsYXRpdmVQYXRoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RXhwZWN0ZWRUZXh0UmVzdWx0UGF0aCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyByZXN1bHQncyBpbWFnZSBkYXRhIHRoYXQgY2FuIGJlIHdyaXR0ZW4gdG8gdGhlIGRpc2suIEl0IGNhbiBiZSBudWxsCisgICAgICogaWYgdGhlcmUgaXMgYW4gZXJyb3Igb2Ygc29tZSBzb3J0IG9yIGZvciBleGFtcGxlIHRoZSB0ZXN0IHRpbWVzIG91dC4KKyAgICAgKgorICAgICAqIDxwPiBTb21lIHRlc3RzIHdpbGwgbm90IHByb3ZpZGUgZGF0YSAobGlrZSB0ZXh0IHRlc3RzKQorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgcmVzdWx0cyBpbWFnZSBkYXRhCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXRBY3R1YWxJbWFnZVJlc3VsdCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyByZXN1bHQncyB0ZXh0IGRhdGEuIEl0IGNhbiBiZSBudWxsCisgICAgICogaWYgdGhlcmUgaXMgYW4gZXJyb3Igb2Ygc29tZSBzb3J0IG9yIGZvciBleGFtcGxlIHRoZSB0ZXN0IHRpbWVzIG91dC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHJlc3VsdHMgdGV4dCBkYXRhCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRBY3R1YWxUZXh0UmVzdWx0KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdGF0dXMgY29kZSByZXByZXNlbnRpbmcgdGhlIHJlc3VsdCBvZiBjb21wYXJpbmcgYWN0dWFsIGFuZCBleHBlY3RlZCByZXN1bHRzLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgdGhlIHN0YXR1cyBjb2RlIGZyb20gY29tcGFyaW5nIGFjdHVhbCBhbmQgZXhwZWN0ZWQgcmVzdWx0cworICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBSZXN1bHRDb2RlIGdldFJlc3VsdENvZGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHRlc3QgY3Jhc2hlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHdoZXRoZXIgdGhpcyB0ZXN0IGNyYXNoZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBkaWRDcmFzaCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdGVzdCB0aW1lZCBvdXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB3aGV0aGVyIHRoaXMgdGVzdCB0aW1lZCBvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBkaWRUaW1lT3V0KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoYXQgdGhpcyB0ZXN0IHRpbWVkIG91dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREaWRUaW1lT3V0KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHRlc3QgcGFzc2VkLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgd2hldGhlciB0aGUgdGVzdCBwYXNzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBkaWRQYXNzKCkgeworICAgICAgICAvLyBUZXN0cyB0aGF0IGNyYXNoIGNhbid0IGhhdmUgdGltZWQgb3V0IG9yIGhhdmUgYW4gYWN0dWFsIHJlc3VsdC4KKyAgICAgICAgYXNzZXJ0ICEoZGlkQ3Jhc2goKSAmJiBkaWRUaW1lT3V0KCkpOworICAgICAgICBhc3NlcnQgIShkaWRDcmFzaCgpICYmIGdldFJlc3VsdENvZGUoKSAhPSBSZXN1bHRDb2RlLk5PX0FDVFVBTF9SRVNVTFQpOworICAgICAgICByZXR1cm4gIWRpZENyYXNoKCkgJiYgIWRpZFRpbWVPdXQoKSAmJiBnZXRSZXN1bHRDb2RlKCkgPT0gUmVzdWx0Q29kZS5SRVNVTFRTX01BVENIOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0IGRhdGEuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0IGRhdGEuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFRlc3RUeXBlIGdldFR5cGUoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcGllY2Ugb2YgSFRNTCBjb2RlIHRoYXQgcHJlc2VudHMgYSB2aXN1YWwgZGlmZiBiZXR3ZWVuIGEgcmVzdWx0IGFuZAorICAgICAqIHRoZSBleHBlY3RlZCByZXN1bHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBhIHBpZWNlIG9mIEhUTUwgY29kZSB3aXRoIGEgdmlzdWFsIGRpZmYgYmV0d2VlbiB0aGUgcmVzdWx0IGFuZCB0aGUgZXhwZWN0ZWQgcmVzdWx0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREaWZmQXNIdG1sKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgQnVuZGxlIGdldEJ1bmRsZSgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvQWRkaXRpb25hbFRleHRPdXRwdXQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0FkZGl0aW9uYWxUZXh0T3V0cHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI5YTkxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0FkZGl0aW9uYWxUZXh0T3V0cHV0LmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvKioKKyAqIEEgY2xhc3MgdGhhdCBzdG9yZXMgY29uc29sZXMgbWVzc2FnZXMsIGRhdGFiYXNlIGNhbGxiYWNrcywgYWxlcnQgbWVzc2FnZXMsIGV0Yy4KKyAqLworcHVibGljIGNsYXNzIEFkZGl0aW9uYWxUZXh0T3V0cHV0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJBZGRpdGlvbmFsVGV4dE91dHB1dCI7CisKKyAgICAvKioKKyAgICAgKiBPcmRlcmluZyBvZiBlbnVtcyBpcyBpbXBvcnRhbnQgYXMgaXQgZGV0ZXJtaW5lcyBvcmRlcmluZyBvZiB0aGUgdG9TdHJpbmcgbWV0aG9kIQorICAgICAqIFN0cmluZ0J1aWxkZXJzIHdpbGwgYmUgcHJpbnRlZCBpbiB0aGUgb3JkZXIgdGhlIGNvcnJlc3BvbmRpbmcgdHlwZXMgYXBwZWFyIGhlcmUuCisgICAgICovCisgICAgcHJpdmF0ZSBlbnVtIE91dHB1dFR5cGUgeworICAgICAgICBKU19ESUFMT0csCisgICAgICAgIEVYQ0VFREVEX0RCX1FVT1RBX01FU1NBR0UsCisgICAgICAgIENPTlNPTEVfTUVTU0FHRTsKKyAgICB9CisKKyAgICBTdHJpbmdCdWlsZGVyW10gbU91dHB1dHMgPSBuZXcgU3RyaW5nQnVpbGRlcltPdXRwdXRUeXBlLnZhbHVlcygpLmxlbmd0aF07CisKKyAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgZ2V0U3RyaW5nQnVpbGRlckZvclR5cGUoT3V0cHV0VHlwZSBvdXRwdXRUeXBlKSB7CisgICAgICAgIGludCBpbmRleCA9IG91dHB1dFR5cGUub3JkaW5hbCgpOworICAgICAgICBpZiAobU91dHB1dHNbaW5kZXhdID09IG51bGwpIHsKKyAgICAgICAgICAgIG1PdXRwdXRzW2luZGV4XSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1PdXRwdXRzW2luZGV4XTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRFeGNlZWRlZERiUXVvdGFNZXNzYWdlKFN0cmluZyB1cmxTdHJpbmcsIFN0cmluZyBkYXRhYmFzZUlkZW50aWZpZXIpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXQgPSBnZXRTdHJpbmdCdWlsZGVyRm9yVHlwZShPdXRwdXRUeXBlLkVYQ0VFREVEX0RCX1FVT1RBX01FU1NBR0UpOworCisgICAgICAgIFN0cmluZyBwcm90b2NvbCA9ICIiOworICAgICAgICBTdHJpbmcgaG9zdCA9ICIiOworICAgICAgICBpbnQgcG9ydCA9IDA7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7CisgICAgICAgICAgICBwcm90b2NvbCA9IHVybC5nZXRQcm90b2NvbCgpOworICAgICAgICAgICAgaG9zdCA9IHVybC5nZXRIb3N0KCk7CisgICAgICAgICAgICBpZiAodXJsLmdldFBvcnQoKSA+IC0xKSB7CisgICAgICAgICAgICAgICAgcG9ydCA9IHVybC5nZXRQb3J0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAidXJsU3RyaW5nPSIgKyB1cmxTdHJpbmcgKyAiIGRhdGFiYXNlSWRlbnRpZmllcj0iICsgZGF0YWJhc2VJZGVudGlmaWVyLAorICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dHB1dC5hcHBlbmQoIlVJIERFTEVHQVRFIERBVEFCQVNFIENBTExCQUNLOiAiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiZXhjZWVkZWREYXRhYmFzZVF1b3RhRm9yU2VjdXJpdHlPcmlnaW46eyIpOworICAgICAgICBvdXRwdXQuYXBwZW5kKHByb3RvY29sICsgIiwgIiArIGhvc3QgKyAiLCAiICsgcG9ydCArICJ9ICIpOworICAgICAgICBvdXRwdXQuYXBwZW5kKCJkYXRhYmFzZToiICsgZGF0YWJhc2VJZGVudGlmaWVyICsgIlxuIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kQ29uc29sZU1lc3NhZ2UoQ29uc29sZU1lc3NhZ2UgY29uc29sZU1lc3NhZ2UpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXQgPSBnZXRTdHJpbmdCdWlsZGVyRm9yVHlwZShPdXRwdXRUeXBlLkNPTlNPTEVfTUVTU0FHRSk7CisKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiQ09OU09MRSBNRVNTQUdFOiBsaW5lICIgKyBjb25zb2xlTWVzc2FnZS5saW5lTnVtYmVyKCkpOworICAgICAgICBvdXRwdXQuYXBwZW5kKCI6ICIgKyBjb25zb2xlTWVzc2FnZS5tZXNzYWdlKCkgKyAiXG4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRKc0FsZXJ0KFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gZ2V0U3RyaW5nQnVpbGRlckZvclR5cGUoT3V0cHV0VHlwZS5KU19ESUFMT0cpOworCisgICAgICAgIG91dHB1dC5hcHBlbmQoIkFMRVJUOiAiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZChtZXNzYWdlKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgnXG4nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRKc0NvbmZpcm0oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXQgPSBnZXRTdHJpbmdCdWlsZGVyRm9yVHlwZShPdXRwdXRUeXBlLkpTX0RJQUxPRyk7CisKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiQ09ORklSTTogIik7CisgICAgICAgIG91dHB1dC5hcHBlbmQobWVzc2FnZSk7CisgICAgICAgIG91dHB1dC5hcHBlbmQoJ1xuJyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSnNQcm9tcHQoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXQgPSBnZXRTdHJpbmdCdWlsZGVyRm9yVHlwZShPdXRwdXRUeXBlLkpTX0RJQUxPRyk7CisKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiUFJPTVBUOiAiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZChtZXNzYWdlKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiLCBkZWZhdWx0IHRleHQ6ICIpOworICAgICAgICBvdXRwdXQuYXBwZW5kKGRlZmF1bHRWYWx1ZSk7CisgICAgICAgIG91dHB1dC5hcHBlbmQoJ1xuJyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1PdXRwdXRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobU91dHB1dHNbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobU91dHB1dHNbaV0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9DcmFzaGVkRHVtbXlSZXN1bHQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0NyYXNoZWREdW1teVJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MzExNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9DcmFzaGVkRHVtbXlSZXN1bHQuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CisKKy8qKgorICogQSBkdW1teSBjbGFzcyByZXByZXNlbnRpbmcgdGVzdCB0aGF0IGNyYXNoZWQuCisgKgorICogVE9ETzogQWxsIHRoZSBtZXRob2RzIHJlZ2FyZGluZyBleHBlY3RlZCByZXN1bHRzIG5lZWQgaW1wbGVtZW50aW5nLgorICovCitwdWJsaWMgY2xhc3MgQ3Jhc2hlZER1bW15UmVzdWx0IGV4dGVuZHMgQWJzdHJhY3RSZXN1bHQgeworICAgIFN0cmluZyBtUmVsYXRpdmVQYXRoOworCisgICAgcHVibGljIENyYXNoZWREdW1teVJlc3VsdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIG1SZWxhdGl2ZVBhdGggPSByZWxhdGl2ZVBhdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJ5dGVbXSBnZXRBY3R1YWxJbWFnZVJlc3VsdCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRBY3R1YWxUZXh0UmVzdWx0KCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVuZGxlIGdldEJ1bmRsZSgpIHsKKyAgICAgICAgLyoqIFRPRE86ICAqLworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldERpZmZBc0h0bWwoKSB7CisgICAgICAgIC8qKiBUT0RPOiBQcm9iYWJseSBzaG93IGF0IGxlYXN0IGV4cGVjdGVkIHJlc3VsdHMgKi8KKyAgICAgICAgcmV0dXJuICJPb29wcywgSSBjcmFzaGVkLi4uIjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1SZWxhdGl2ZVBhdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc3VsdENvZGUgZ2V0UmVzdWx0Q29kZSgpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdENvZGUuTk9fQUNUVUFMX1JFU1VMVDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBkaWRDcmFzaCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZGlkVGltZU91dCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldERpZFRpbWVPdXQoKSB7CisgICAgICAgIC8qKiBUaGlzIG1ldGhvZCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhpcyB0eXBlIG9mIHJlc3VsdCAqLworICAgICAgICBhc3NlcnQgZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRlc3RUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9idGFpbkFjdHVhbFJlc3VsdHMoV2ViVmlldyB3ZWJ2aWV3LCBNZXNzYWdlIHJlc3VsdE9idGFpbmVkTXNnKSB7CisgICAgICAgIC8qKiBUaGlzIG1ldGhvZCBpcyBub3QgYXBwbGljYWJsZSBmb3IgdGhpcyB0eXBlIG9mIHJlc3VsdCAqLworICAgICAgICBhc3NlcnQgZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRJbWFnZVJlc3VsdChieXRlW10gZXhwZWN0ZWRSZXN1bHQpIHsKKyAgICAgICAgLyoqIFRPRE8gKi8KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZFRleHRSZXN1bHQoU3RyaW5nIGV4cGVjdGVkUmVzdWx0KSB7CisgICAgICAgIC8qKiBUT0RPICovCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRFeHBlY3RlZEltYWdlUmVzdWx0UGF0aCgpIHsKKyAgICAgICAgLyoqIFRPRE8gKi8KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRFeHBlY3RlZFRleHRSZXN1bHRQYXRoKCkgeworICAgICAgICAvKiogVE9ETyAqLworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZEltYWdlUmVzdWx0UGF0aChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIC8qKiBUT0RPICovCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRUZXh0UmVzdWx0UGF0aChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIC8qKiBUT0RPICovCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRXZlbnRTZW5kZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0V2ZW50U2VuZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI3Y2JjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0V2ZW50U2VuZGVyLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CisKKy8qKgorICogQSBjbGFzcyB0aGF0IGFjdHMgYXMgYSBKUyBpbnRlcmZhY2UgZm9yIHdlYnZpZXcgdG8gbW9jayB2YXJpb3VzIHRvdWNoIGV2ZW50cywKKyAqIG1vdXNlIGFjdGlvbnMgYW5kIGtleSBwcmVzc2VzLgorICoKKyAqIFRoZSBtZXRob2RzIGhlcmUganVzdCBjYWxsIGNvcnJlc3BvbmRpbmcgbWV0aG9kcyBvbiBFdmVudFNlbmRlckltcGwKKyAqIHRoYXQgY29udGFpbnMgdGhlIGxvZ2ljIG9mIGhvdyB0byBleGVjdXRlIHRoZSBtZXRob2RzLgorICovCitwdWJsaWMgY2xhc3MgRXZlbnRTZW5kZXIgeworICAgIEV2ZW50U2VuZGVySW1wbCBtRXZlbnRTZW5kZXJJbXBsID0gbmV3IEV2ZW50U2VuZGVySW1wbCgpOworCisgICAgcHVibGljIHZvaWQgcmVzZXQoV2ViVmlldyB3ZWJWaWV3KSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwucmVzZXQod2ViVmlldyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5hYmxlRE9NVUlFdmVudExvZ2dpbmcoaW50IGRvbU5vZGUpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5lbmFibGVET01VSUV2ZW50TG9nZ2luZyhkb21Ob2RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmaXJlS2V5Ym9hcmRFdmVudHNUb0VsZW1lbnQoaW50IGRvbU5vZGUpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5maXJlS2V5Ym9hcmRFdmVudHNUb0VsZW1lbnQoZG9tTm9kZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQga2V5RG93bihTdHJpbmcgY2hhcmFjdGVyLCBTdHJpbmdbXSB3aXRoTW9kaWZpZXJzKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwua2V5RG93bihjaGFyYWN0ZXIsIHdpdGhNb2RpZmllcnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGtleURvd24oU3RyaW5nIGNoYXJhY3RlcikgeworICAgICAgICBrZXlEb3duKGNoYXJhY3RlciwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbGVhcEZvcndhcmQoaW50IG1pbGxpc2Vjb25kcykgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLmxlYXBGb3J3YXJkKG1pbGxpc2Vjb25kcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbW91c2VDbGljaygpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5tb3VzZUNsaWNrKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbW91c2VEb3duKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLm1vdXNlRG93bigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlTW92ZVRvKGludCB4LCBpbnQgeSkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLm1vdXNlTW92ZVRvKHgsIHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlVXAoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwubW91c2VVcCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRvdWNoU3RhcnQoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwudG91Y2hTdGFydCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFRvdWNoUG9pbnQoaW50IHgsIGludCB5KSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwuYWRkVG91Y2hQb2ludCh4LCB5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVUb3VjaFBvaW50KGludCBpZCwgaW50IHgsIGludCB5KSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwudXBkYXRlVG91Y2hQb2ludChpZCwgeCwgeSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VG91Y2hNb2RpZmllcihTdHJpbmcgbW9kaWZpZXIsIGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLnNldFRvdWNoTW9kaWZpZXIobW9kaWZpZXIsIGVuYWJsZWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRvdWNoTW92ZSgpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC50b3VjaE1vdmUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlVG91Y2hQb2ludChpbnQgaWQpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5yZWxlYXNlVG91Y2hQb2ludChpZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG91Y2hFbmQoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwudG91Y2hFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaENhbmNlbCgpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC50b3VjaENhbmNlbCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyVG91Y2hQb2ludHMoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwuY2xlYXJUb3VjaFBvaW50cygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNhbmNlbFRvdWNoUG9pbnQoaW50IGlkKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwuY2FuY2VsVG91Y2hQb2ludChpZCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0V2ZW50U2VuZGVySW1wbC5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRXZlbnRTZW5kZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhiY2YxMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0V2ZW50U2VuZGVySW1wbC5qYXZhCkBAIC0wLDAgKzEsNTgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBFdmVudFNlbmRlcgorICovCitwdWJsaWMgY2xhc3MgRXZlbnRTZW5kZXJJbXBsIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJFdmVudFNlbmRlckltcGwiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19FTkFCTEVfRE9NX1VJX0VWRU5UX0xPR0dJTkcgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRklSRV9LRVlCT0FSRF9FVkVOVFNfVE9fRUxFTUVOVCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19MRUFQX0ZPUldBUkQgPSAyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19LRVlfRE9XTiA9IDM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX01PVVNFX0RPV04gPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfTU9VU0VfVVAgPSA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfTU9VU0VfQ0xJQ0sgPSA2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfTU9VU0VfTU9WRV9UTyA9IDc7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FERF9UT1VDSF9QT0lOVCA9IDg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UT1VDSF9TVEFSVCA9IDk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19VUERBVEVfVE9VQ0hfUE9JTlQgPSAxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RPVUNIX01PVkUgPSAxMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NMRUFSX1RPVUNIX1BPSU5UUyA9IDEyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVE9VQ0hfQ0FOQ0VMID0gMTM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19SRUxFQVNFX1RPVUNIX1BPSU5UID0gMTQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UT1VDSF9FTkQgPSAxNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NFVF9UT1VDSF9NT0RJRklFUiA9IDE2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQ0FOQ0VMX1RPVUNIX1BPSU5UID0gMTc7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRvdWNoUG9pbnQgeworICAgICAgICBXZWJWaWV3IG1XZWJWaWV3OworICAgICAgICBwcml2YXRlIGludCBtSWQ7CisgICAgICAgIHByaXZhdGUgaW50IG1YOworICAgICAgICBwcml2YXRlIGludCBtWTsKKyAgICAgICAgcHJpdmF0ZSBsb25nIG1Eb3duVGltZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1SZWxlYXNlZCA9IGZhbHNlOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU1vdmVkID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ2FuY2VsbGVkID0gZmFsc2U7CisKKyAgICAgICAgcHVibGljIFRvdWNoUG9pbnQoV2ViVmlldyB3ZWJWaWV3LCBpbnQgaWQsIGludCB4LCBpbnQgeSkgeworICAgICAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgICAgICAgICAgbUlkID0gaWQ7CisgICAgICAgICAgICBtWCA9IHNjYWxlWCh4KTsKKyAgICAgICAgICAgIG1ZID0gc2NhbGVZKHkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRJZCgpIHsKKyAgICAgICAgICByZXR1cm4gbUlkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRYKCkgeworICAgICAgICAgICAgcmV0dXJuIG1YOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRZKCkgeworICAgICAgICAgICAgcmV0dXJuIG1ZOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTW92ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbU1vdmVkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbW92ZShpbnQgbmV3WCwgaW50IG5ld1kpIHsKKyAgICAgICAgICAgIG1YID0gc2NhbGVYKG5ld1gpOworICAgICAgICAgICAgbVkgPSBzY2FsZVkobmV3WSk7CisgICAgICAgICAgICBtTW92ZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXRIYXNNb3ZlZCgpIHsKKyAgICAgICAgICAgIG1Nb3ZlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0RG93blRpbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbURvd25UaW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RG93blRpbWUobG9uZyBkb3duVGltZSkgeworICAgICAgICAgICAgbURvd25UaW1lID0gZG93blRpbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlbGVhc2VkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1SZWxlYXNlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7CisgICAgICAgICAgICBtUmVsZWFzZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNhbmNlbGxlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKKyAgICAgICAgICAgIG1DYW5jZWxsZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgc2NhbGVYKGludCB4KSB7CisgICAgICAgICAgICByZXR1cm4gKGludCkoeCAqIG1XZWJWaWV3LmdldFNjYWxlKCkpIC0gbVdlYlZpZXcuZ2V0U2Nyb2xsWCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgc2NhbGVZKGludCB5KSB7CisgICAgICAgICAgICByZXR1cm4gKGludCkoeSAqIG1XZWJWaWV3LmdldFNjYWxlKCkpIC0gbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFRvdWNoUG9pbnQ+IG1Ub3VjaFBvaW50czsKKyAgICBwcml2YXRlIGludCBtVG91Y2hNZXRhU3RhdGU7CisgICAgcHJpdmF0ZSBpbnQgbU1vdXNlWDsKKyAgICBwcml2YXRlIGludCBtTW91c2VZOworCisgICAgcHJpdmF0ZSBXZWJWaWV3IG1XZWJWaWV3OworCisgICAgcHJpdmF0ZSBIYW5kbGVyIG1FdmVudFNlbmRlckhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBidW5kbGU7CisgICAgICAgICAgICBNb3Rpb25FdmVudCBldmVudDsKKyAgICAgICAgICAgIGxvbmcgdHM7CisKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19FTkFCTEVfRE9NX1VJX0VWRU5UX0xPR0dJTkc6CisgICAgICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBpbXBsZW1lbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19GSVJFX0tFWUJPQVJEX0VWRU5UU19UT19FTEVNRU5UOgorICAgICAgICAgICAgICAgICAgICAvKiogVE9ETzogaW1wbGVtZW50ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfTEVBUF9GT1JXQVJEOgorICAgICAgICAgICAgICAgICAgICAvKiogVE9ETzogaW1wbGVtZW50ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfS0VZX0RPV046CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZSA9IChCdW5kbGUpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNoYXJhY3RlciA9IGJ1bmRsZS5nZXRTdHJpbmcoImNoYXJhY3RlciIpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB3aXRoTW9kaWZpZXJzID0gYnVuZGxlLmdldFN0cmluZ0FycmF5KCJ3aXRoTW9kaWZpZXJzIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdpdGhNb2RpZmllcnMgIT0gbnVsbCAmJiB3aXRoTW9kaWZpZXJzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2l0aE1vZGlmaWVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyVG9LZXlDb2RlKHdpdGhNb2RpZmllcnNbaV0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBleGVjdXRlS2V5RXZlbnQoS2V5RXZlbnQuQUNUSU9OX0RPV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhclRvS2V5Q29kZShjaGFyYWN0ZXIudG9Mb3dlckNhc2UoKS50b0NoYXJBcnJheSgpWzBdKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLyoqIE1PVVNFICovCisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19NT1VTRV9ET1dOOgorICAgICAgICAgICAgICAgICAgICB0cyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgICAgICBldmVudCA9IE1vdGlvbkV2ZW50Lm9idGFpbih0cywgdHMsIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOLCBtTW91c2VYLCBtTW91c2VZLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcub25Ub3VjaEV2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19NT1VTRV9VUDoKKyAgICAgICAgICAgICAgICAgICAgdHMgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4odHMsIHRzLCBNb3Rpb25FdmVudC5BQ1RJT05fVVAsIG1Nb3VzZVgsIG1Nb3VzZVksIDApOworICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5vblRvdWNoRXZlbnQoZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX01PVVNFX0NMSUNLOgorICAgICAgICAgICAgICAgICAgICBtb3VzZURvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgbW91c2VVcCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX01PVVNFX01PVkVfVE86CisgICAgICAgICAgICAgICAgICAgIG1Nb3VzZVggPSBtc2cuYXJnMTsKKyAgICAgICAgICAgICAgICAgICAgbU1vdXNlWSA9IG1zZy5hcmcyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8qKiBUT1VDSCAqLworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQUREX1RPVUNIX1BPSU5UOgorICAgICAgICAgICAgICAgICAgICBpbnQgbnVtUG9pbnRzID0gZ2V0VG91Y2hQb2ludHMoKS5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGludCBpZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bVBvaW50cyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IGdldFRvdWNoUG9pbnRzKCkuZ2V0KG51bVBvaW50cyAtIDEpLmdldElkKCkgKyAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGdldFRvdWNoUG9pbnRzKCkuYWRkKG5ldyBUb3VjaFBvaW50KG1XZWJWaWV3LCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMSwgbXNnLmFyZzIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19UT1VDSF9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFRvdWNoUG9pbnRzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRUb3VjaFBvaW50cygpLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRUb3VjaFBvaW50cygpLmdldChpKS5zZXREb3duVGltZShTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVRvdWNoRXZlbnQoTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1VQREFURV9UT1VDSF9QT0lOVDoKKyAgICAgICAgICAgICAgICAgICAgYnVuZGxlID0gKEJ1bmRsZSltc2cub2JqOworCisgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGJ1bmRsZS5nZXRJbnQoImlkIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSBnZXRUb3VjaFBvaW50cygpLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRyArICI6Ok1TR19VUERBVEVfVE9VQ0hfUE9JTlQiLCAiVG91Y2hQb2ludCBvdXQgb2YgYm91bmRzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBnZXRUb3VjaFBvaW50cygpLmdldChpbmRleCkubW92ZShidW5kbGUuZ2V0SW50KCJ4IiksIGJ1bmRsZS5nZXRJbnQoInkiKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfVE9VQ0hfTU9WRToKKyAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAqIEZJWE1FOiBBdCB0aGUgbW9tZW50IHdlIGRvbid0IHN1cHBvcnQgbXVsdGktdG91Y2guIEhlbmNlLCB3ZSBvbmx5IGV4YW1pbmUKKyAgICAgICAgICAgICAgICAgICAgICogdGhlIGZpcnN0IHRvdWNoIHBvaW50LiBJbiBmdXR1cmUgdGhpcyBtZXRob2Qgd2lsbCBuZWVkIHJld3JpdGluZy4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRUb3VjaFBvaW50cygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVUb3VjaEV2ZW50KE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRUb3VjaFBvaW50cygpLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRUb3VjaFBvaW50cygpLmdldChpKS5yZXNldEhhc01vdmVkKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19DQU5DRUxfVE9VQ0hfUE9JTlQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuYXJnMSA+PSBnZXRUb3VjaFBvaW50cygpLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRyArICI6Ok1TR19SRUxFQVNFX1RPVUNIX1BPSU5UIiwgIlRvdWNoUG9pbnQgb3V0IG9mIGJvdW5kczogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZy5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZ2V0VG91Y2hQb2ludHMoKS5nZXQobXNnLmFyZzEpLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RPVUNIX0NBTkNFTDoKKyAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAqIEZJWE1FOiBBdCB0aGUgbW9tZW50IHdlIGRvbid0IHN1cHBvcnQgbXVsdGktdG91Y2guIEhlbmNlLCB3ZSBvbmx5IGV4YW1pbmUKKyAgICAgICAgICAgICAgICAgICAgICogdGhlIGZpcnN0IHRvdWNoIHBvaW50LiBJbiBmdXR1cmUgdGhpcyBtZXRob2Qgd2lsbCBuZWVkIHJld3JpdGluZy4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRUb3VjaFBvaW50cygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVUb3VjaEV2ZW50KE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JFTEVBU0VfVE9VQ0hfUE9JTlQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuYXJnMSA+PSBnZXRUb3VjaFBvaW50cygpLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRyArICI6Ok1TR19SRUxFQVNFX1RPVUNIX1BPSU5UIiwgIlRvdWNoUG9pbnQgb3V0IG9mIGJvdW5kczogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZy5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZ2V0VG91Y2hQb2ludHMoKS5nZXQobXNnLmFyZzEpLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19UT1VDSF9FTkQ6CisgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgKiBGSVhNRTogQXQgdGhlIG1vbWVudCB3ZSBkb24ndCBzdXBwb3J0IG11bHRpLXRvdWNoLiBIZW5jZSwgd2Ugb25seSBleGFtaW5lCisgICAgICAgICAgICAgICAgICAgICAqIHRoZSBmaXJzdCB0b3VjaCBwb2ludC4gSW4gZnV0dXJlIHRoaXMgbWV0aG9kIHdpbGwgbmVlZCByZXdyaXRpbmcuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0VG91Y2hQb2ludHMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBleGVjdXRlVG91Y2hFdmVudChNb3Rpb25FdmVudC5BQ1RJT05fVVApOworICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgcmVsZWFzZWQgcG9pbnRzLgorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gZ2V0VG91Y2hQb2ludHMoKS5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldFRvdWNoUG9pbnRzKCkuZ2V0KGkpLmlzUmVsZWFzZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRvdWNoUG9pbnRzKCkucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfU0VUX1RPVUNIX01PRElGSUVSOgorICAgICAgICAgICAgICAgICAgICBidW5kbGUgPSAoQnVuZGxlKW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtb2RpZmllciA9IGJ1bmRsZS5nZXRTdHJpbmcoIm1vZGlmaWVyIik7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlZCA9IGJ1bmRsZS5nZXRCb29sZWFuKCJlbmFibGVkIik7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IG1hc2sgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoImFsdCIuZXF1YWxzKG1vZGlmaWVyLnRvTG93ZXJDYXNlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXNrID0gS2V5RXZlbnQuTUVUQV9BTFRfT047CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInNoaWZ0Ii5lcXVhbHMobW9kaWZpZXIudG9Mb3dlckNhc2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBLZXlFdmVudC5NRVRBX1NISUZUX09OOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJjdHJsIi5lcXVhbHMobW9kaWZpZXIudG9Mb3dlckNhc2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBLZXlFdmVudC5NRVRBX1NZTV9PTjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNZXRhU3RhdGUgfD0gbWFzazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1ldGFTdGF0ZSAmPSB+bWFzazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQ0xFQVJfVE9VQ0hfUE9JTlRTOgorICAgICAgICAgICAgICAgICAgICBnZXRUb3VjaFBvaW50cygpLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHZvaWQgcmVzZXQoV2ViVmlldyB3ZWJWaWV3KSB7CisgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKKyAgICAgICAgbVRvdWNoUG9pbnRzID0gbnVsbDsKKyAgICAgICAgbVRvdWNoTWV0YVN0YXRlID0gMDsKKyAgICAgICAgbU1vdXNlWCA9IDA7CisgICAgICAgIG1Nb3VzZVkgPSAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuYWJsZURPTVVJRXZlbnRMb2dnaW5nKGludCBkb21Ob2RlKSB7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19FTkFCTEVfRE9NX1VJX0VWRU5UX0xPR0dJTkcpOworICAgICAgICBtc2cuYXJnMSA9IGRvbU5vZGU7CisgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmaXJlS2V5Ym9hcmRFdmVudHNUb0VsZW1lbnQoaW50IGRvbU5vZGUpIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0ZJUkVfS0VZQk9BUkRfRVZFTlRTX1RPX0VMRU1FTlQpOworICAgICAgICBtc2cuYXJnMSA9IGRvbU5vZGU7CisgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsZWFwRm9yd2FyZChpbnQgbWlsbGlzZWNvbmRzKSB7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19MRUFQX0ZPUldBUkQpOworICAgICAgICBtc2cuYXJnMSA9IG1pbGxpc2Vjb25kczsKKyAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGtleURvd24oU3RyaW5nIGNoYXJhY3RlciwgU3RyaW5nW10gd2l0aE1vZGlmaWVycykgeworICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBidW5kbGUucHV0U3RyaW5nKCJjaGFyYWN0ZXIiLCBjaGFyYWN0ZXIpOworICAgICAgICBidW5kbGUucHV0U3RyaW5nQXJyYXkoIndpdGhNb2RpZmllcnMiLCB3aXRoTW9kaWZpZXJzKTsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19LRVlfRE9XTiwgYnVuZGxlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICAvKiogTU9VU0UgKi8KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bigpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19NT1VTRV9ET1dOKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZVVwKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX01PVVNFX1VQKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX01PVVNFX0NMSUNLKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZU1vdmVUbyhpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19NT1VTRV9NT1ZFX1RPLCB4LCB5KS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICAvKiogVE9VQ0ggKi8KKworICAgIHB1YmxpYyB2b2lkIGFkZFRvdWNoUG9pbnQoaW50IHgsIGludCB5KSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQUREX1RPVUNIX1BPSU5ULCB4LCB5KS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaFN0YXJ0KCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1RPVUNIX1NUQVJUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVUb3VjaFBvaW50KGludCBpZCwgaW50IHgsIGludCB5KSB7CisgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJ1bmRsZS5wdXRJbnQoImlkIiwgaWQpOworICAgICAgICBidW5kbGUucHV0SW50KCJ4IiwgeCk7CisgICAgICAgIGJ1bmRsZS5wdXRJbnQoInkiLCB5KTsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19VUERBVEVfVE9VQ0hfUE9JTlQsIGJ1bmRsZSkuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG91Y2hNb3ZlKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1RPVUNIX01PVkUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNhbmNlbFRvdWNoUG9pbnQoaW50IGlkKSB7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19DQU5DRUxfVE9VQ0hfUE9JTlQpOworICAgICAgICBtc2cuYXJnMSA9IGlkOworICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG91Y2hDYW5jZWwoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfVE9VQ0hfQ0FOQ0VMKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlVG91Y2hQb2ludChpbnQgaWQpIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1JFTEVBU0VfVE9VQ0hfUE9JTlQpOworICAgICAgICBtc2cuYXJnMSA9IGlkOworICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG91Y2hFbmQoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfVE9VQ0hfRU5EKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUb3VjaE1vZGlmaWVyKFN0cmluZyBtb2RpZmllciwgYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoIm1vZGlmaWVyIiwgbW9kaWZpZXIpOworICAgICAgICBidW5kbGUucHV0Qm9vbGVhbigiZW5hYmxlZCIsIGVuYWJsZWQpOworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1NFVF9UT1VDSF9NT0RJRklFUiwgYnVuZGxlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhclRvdWNoUG9pbnRzKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0NMRUFSX1RPVUNIX1BPSU5UUyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFRvdWNoUG9pbnQ+IGdldFRvdWNoUG9pbnRzKCkgeworICAgICAgICBpZiAobVRvdWNoUG9pbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Ub3VjaFBvaW50cyA9IG5ldyBMaW5rZWRMaXN0PFRvdWNoUG9pbnQ+KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbVRvdWNoUG9pbnRzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleGVjdXRlVG91Y2hFdmVudChpbnQgYWN0aW9uKSB7CisgICAgICAgIGludCBudW1Qb2ludHMgPSBnZXRUb3VjaFBvaW50cygpLnNpemUoKTsKKyAgICAgICAgaW50W10gcG9pbnRlcklkcyA9IG5ldyBpbnRbbnVtUG9pbnRzXTsKKyAgICAgICAgTW90aW9uRXZlbnQuUG9pbnRlckNvb3Jkc1tdIHBvaW50ZXJDb29yZHMgPSBuZXcgTW90aW9uRXZlbnQuUG9pbnRlckNvb3Jkc1tudW1Qb2ludHNdOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUG9pbnRzOyArK2kpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNOZWVkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHN3aXRjaChhY3Rpb24pIHsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDoKKyAgICAgICAgICAgICAgICBpc05lZWRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOgorICAgICAgICAgICAgICAgIGlzTmVlZGVkID0gZ2V0VG91Y2hQb2ludHMoKS5nZXQoaSkuaGFzTW92ZWQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDoKKyAgICAgICAgICAgICAgICBpc05lZWRlZCA9IGdldFRvdWNoUG9pbnRzKCkuZ2V0KGkpLmlzQ2FuY2VsbGVkKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcgKyAiOjpleGVjdXRlVG91Y2hFdmVudCgpLCIsICJhY3Rpb24gbm90IHN1cHBvcnRlZDoiICsgYWN0aW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtUG9pbnRzID0gMDsKKyAgICAgICAgICAgIGlmIChpc05lZWRlZCkgeworICAgICAgICAgICAgICAgIHBvaW50ZXJJZHNbbnVtUG9pbnRzXSA9IGdldFRvdWNoUG9pbnRzKCkuZ2V0KGkpLmdldElkKCk7CisgICAgICAgICAgICAgICAgcG9pbnRlckNvb3Jkc1tudW1Qb2ludHNdID0gbmV3IE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHMoKTsKKyAgICAgICAgICAgICAgICBwb2ludGVyQ29vcmRzW251bVBvaW50c10ueCA9IGdldFRvdWNoUG9pbnRzKCkuZ2V0KGkpLmdldFgoKTsKKyAgICAgICAgICAgICAgICBwb2ludGVyQ29vcmRzW251bVBvaW50c10ueSA9IGdldFRvdWNoUG9pbnRzKCkuZ2V0KGkpLmdldFkoKTsKKyAgICAgICAgICAgICAgICArK251bVBvaW50czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChudW1Qb2ludHMgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTW90aW9uRXZlbnQgZXZlbnQgPSBNb3Rpb25FdmVudC5vYnRhaW4obVRvdWNoUG9pbnRzLmdldCgwKS5nZXREb3duVGltZSgpLAorICAgICAgICAgICAgICAgIFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpLCBhY3Rpb24sCisgICAgICAgICAgICAgICAgbnVtUG9pbnRzLCBwb2ludGVySWRzLCBwb2ludGVyQ29vcmRzLAorICAgICAgICAgICAgICAgIG1Ub3VjaE1ldGFTdGF0ZSwgMS4wZiwgMS4wZiwgMCwgMCwgMCwgMCk7CisKKyAgICAgICAgbVdlYlZpZXcub25Ub3VjaEV2ZW50KGV2ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUtleUV2ZW50KGludCBhY3Rpb24sIGludCBrZXlDb2RlKSB7CisgICAgICAgIEtleUV2ZW50IGV2ZW50ID0gbmV3IEtleUV2ZW50KGFjdGlvbiwga2V5Q29kZSk7CisgICAgICAgIG1XZWJWaWV3Lm9uS2V5RG93bihldmVudC5nZXRLZXlDb2RlKCksIGV2ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3N1bWVzIGxvd2VyY2FzZSBjaGFycywgY2FzZSBuZWVkcyB0byBiZSBoYW5kbGVkIGJ5IGNhbGxpbmcgZnVuY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNoYXJUb0tleUNvZGUoY2hhciBjKSB7CisgICAgICAgIC8vIGhhbmRsZSBudW1iZXJzCisgICAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgeworICAgICAgICAgICAgaW50IG9mZnNldCA9IGMgLSAnMCc7CisgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV8wICsgb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgLy8gaGFuZGxlIGNoYXJhY3RlcnMKKyAgICAgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gYyAtICdhJzsKKyAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0EgKyBvZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBoYW5kbGUgYWxsIG90aGVycworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJyonOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1NUQVI7CisKKyAgICAgICAgICAgIGNhc2UgJyMnOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1BPVU5EOworCisgICAgICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9DT01NQTsKKworICAgICAgICAgICAgY2FzZSAnLic6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfUEVSSU9EOworCisgICAgICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfVEFCOworCisgICAgICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9TUEFDRTsKKworICAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0VOVEVSOworCisgICAgICAgICAgICBjYXNlICdcYic6CisgICAgICAgICAgICBjYXNlIDB4N0Y6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfREVMOworCisgICAgICAgICAgICBjYXNlICd+JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9HUkFWRTsKKworICAgICAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfTUlOVVM7CisKKyAgICAgICAgICAgIGNhc2UgJz0nOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0VRVUFMUzsKKworICAgICAgICAgICAgY2FzZSAnKCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfTEVGVF9CUkFDS0VUOworCisgICAgICAgICAgICBjYXNlICcpJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9SSUdIVF9CUkFDS0VUOworCisgICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfQkFDS1NMQVNIOworCisgICAgICAgICAgICBjYXNlICc7JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9TRU1JQ09MT047CisKKyAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9BUE9TVFJPUEhFOworCisgICAgICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9TTEFTSDsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBtb2RpZmllclRvS2V5Q29kZShTdHJpbmcgbW9kaWZpZXIpIHsKKyAgICAgICAgaWYgKG1vZGlmaWVyLmVxdWFscygiY3RybEtleSIpKSB7CisgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9BTFRfTEVGVDsKKyAgICAgICAgfSBlbHNlIGlmIChtb2RpZmllci5lcXVhbHMoInNoaWZ0S2V5IikpIHsKKyAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1NISUZUX0xFRlQ7CisgICAgICAgIH0gZWxzZSBpZiAobW9kaWZpZXIuZXF1YWxzKCJhbHRLZXkiKSkgeworICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfU1lNOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfVU5LTk9XTjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9GaWxlRmlsdGVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9GaWxlRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiZjY0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0ZpbGVGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuZm9yd2FyZGVyLkZvcndhcmRlck1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSB1dGlsaXR5IHRvIGZpbHRlciBvdXQgc29tZSBmaWxlcy9kaXJlY3RvcmllcyBmcm9tIHRoZSB2aWV3cyBhbmQgdGVzdHMgdGhhdCBydW4uCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlRmlsdGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJGaWxlRmlsdGVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0VYUEVDVEFUSU9OU19UWFRfUEFUSCA9CisgICAgICAgICAgICAicGxhdGZvcm0vYW5kcm9pZC90ZXN0X2V4cGVjdGF0aW9ucy50eHQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfVEVTVFNfUEFUSCA9ICJodHRwL3Rlc3RzLyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNTTF9QQVRIID0gInNzbC8iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPS0VOX0NSQVNIID0gIkNSQVNIIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9LRU5fRkFJTCA9ICJGQUlMIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9LRU5fU0xPVyA9ICJTTE9XIjsKKworICAgIHByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gbUNyYXNoTGlzdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IG1GYWlsTGlzdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IG1TbG93TGlzdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworICAgIHB1YmxpYyBGaWxlRmlsdGVyKCkgeworICAgICAgICBsb2FkVGVzdEV4cGVjdGF0aW9ucygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0cmltVHJhaWxpbmdTbGFzaElmUHJlc2VudChTdHJpbmcgcGF0aCkgeworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKyAgICAgICAgcmV0dXJuIGZpbGUuZ2V0UGF0aCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRUZXN0RXhwZWN0YXRpb25zKCkgeworICAgICAgICBVUkwgdXJsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoRm9yd2FyZGVyTWFuYWdlci5nZXRIb3N0U2NoZW1lUG9ydChmYWxzZSkgKyAiTGF5b3V0VGVzdHMvIiArCisgICAgICAgICAgICAgICAgICAgIFRFU1RfRVhQRUNUQVRJT05TX1RYVF9QQVRIKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBidWZmZXJlZFJlYWRlciA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJ1ZmZlcmVkUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIobmV3IFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIEZzVXRpbHMucmVhZERhdGFGcm9tVXJsKHVybCkpKSk7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnk7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gcGFydHM7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGg7CisgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gdG9rZW5zOworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBidWZmZXJlZFJlYWRlci5yZWFkTGluZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qKiBSZW1vdmUgdGhlIGNvbW1lbnQgYW5kIHRyaW0gKi8KKyAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBsaW5lLnNwbGl0KCIvLyIsIDIpWzBdLnRyaW0oKTsKKworICAgICAgICAgICAgICAgICAgICAvKiogT21pdCBlbXB0eSBsaW5lcywgYWR2YW5jZSB0byBuZXh0IGxpbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiogU3BsaXQgb24gd2hpdGVzcGFjZSBpbnRvIHBhdGggcGFydCBhbmQgdGhlIHJlc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBlbnRyeS5zcGxpdCgiXFxzIiwgMik7CisKKyAgICAgICAgICAgICAgICAgICAgLyoqIEF0IHRoaXMgcG9pbnQgcGFydHMubGVuZ3RoID49IDEgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHICsgIjo6cmVsb2FkQ29uZmlndXJhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGVyZSBhcmUgbm8gb3B0aW9ucyBzcGVjaWZpZWQgZm9yIHRoZSB0ZXN0ISIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwYXRoID0gdHJpbVRyYWlsaW5nU2xhc2hJZlByZXNlbnQocGFydHNbMF0pOworCisgICAgICAgICAgICAgICAgICAgIC8qKiBTcGxpdCBvbiB3aGl0ZXNwYWNlICovCisgICAgICAgICAgICAgICAgICAgIHRva2VucyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChwYXJ0c1sxXS5zcGxpdCgiXFxzIiwgMCkpKTsKKworICAgICAgICAgICAgICAgICAgICAvKiogQ2hvc2UgdGhlIHJpZ2h0IGNvbGxlY3Rpb25zIHRvIGFkZCB0byAqLworICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmNvbnRhaW5zKFRPS0VOX0NSQVNIKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNyYXNoTGlzdC5hZGQocGF0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBJZiB0ZXN0IGlzIG9uIHNraXAgbGlzdCB3ZSBpZ25vcmUgYW55IGZ1cnRoZXIgb3B0aW9ucyAqLworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmNvbnRhaW5zKFRPS0VOX0ZBSUwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRmFpbExpc3QuYWRkKHBhdGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnMuY29udGFpbnMoVE9LRU5fU0xPVykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TbG93TGlzdC5hZGQocGF0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChidWZmZXJlZFJlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcmVkUmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgInJlbG9hZENvbmZpZ3VyYXRpb24oKTogRmlsZSBub3QgZm91bmQ6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJ1cmw9IiArIHVybCwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGVzdCBpcyBleHBlY3RlZCB0byBjcmFzaC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFBhdGggZ2l2ZW4gc2hvdWxkIHJlbGF0aXZlIHdpdGhpbiBMYXlvdXRUZXN0cyBmb2xkZXIsIGUuZy4gZmFzdC9kb20vZm9vLmh0bWwKKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXN0UGF0aAorICAgICAqICAgICAgICAgICAgLSBhIHJlbGF0aXZlIHBhdGggd2l0aGluIExheW91dFRlc3RzIGZvbGRlcgorICAgICAqIEByZXR1cm4gaWYgdGhlIHRlc3QgaXMgc3VwcG9zZWQgdG8gYmUgc2tpcHBlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ3Jhc2goU3RyaW5nIHRlc3RQYXRoKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHByZWZpeCA6IGdldFByZWZpeGVzKHRlc3RQYXRoKSkgeworICAgICAgICAgICAgaWYgKG1DcmFzaExpc3QuY29udGFpbnMocHJlZml4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0ZXN0IHJlc3VsdCBpcyBzdXBwb3NlZCB0byBiZSAiZmFpbGVkIi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFBhdGggZ2l2ZW4gc2hvdWxkIHJlbGF0aXZlIHdpdGhpbiBMYXlvdXRUZXN0cyBmb2xkZXIsIGUuZy4gZmFzdC9kb20vZm9vLmh0bWwKKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXN0UGF0aAorICAgICAqICAgICAgICAgICAgLSBhIHJlbGF0aXZlIHBhdGggd2l0aGluIExheW91dFRlc3RzIGZvbGRlcgorICAgICAqIEByZXR1cm4gaWYgdGhlIHRlc3QgcmVzdWx0IGlzIHN1cHBvc2VkIHRvIGJlICJmYWlsZWQiCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGYWlsKFN0cmluZyB0ZXN0UGF0aCkgeworICAgICAgICBmb3IgKFN0cmluZyBwcmVmaXggOiBnZXRQcmVmaXhlcyh0ZXN0UGF0aCkpIHsKKyAgICAgICAgICAgIGlmIChtRmFpbExpc3QuY29udGFpbnMocHJlZml4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0ZXN0IGlzIHNsb3cgYW5kIHNob3VsZCBoYXZlIHRpbWVvdXQgaW5jcmVhc2VkLgorICAgICAqCisgICAgICogPHA+CisgICAgICogUGF0aCBnaXZlbiBzaG91bGQgcmVsYXRpdmUgd2l0aGluIExheW91dFRlc3RzIGZvbGRlciwgZS5nLiBmYXN0L2RvbS9mb28uaHRtbAorICAgICAqCisgICAgICogQHBhcmFtIHRlc3RQYXRoCisgICAgICogICAgICAgICAgICAtIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gTGF5b3V0VGVzdHMgZm9sZGVyCisgICAgICogQHJldHVybiBpZiB0aGUgdGVzdCBpcyBzbG93IGFuZCBzaG91bGQgaGF2ZSB0aW1lb3V0IGluY3JlYXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Nsb3coU3RyaW5nIHRlc3RQYXRoKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHByZWZpeCA6IGdldFByZWZpeGVzKHRlc3RQYXRoKSkgeworICAgICAgICAgICAgaWYgKG1TbG93TGlzdC5jb250YWlucyhwcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgcGF0aCBwcmVmaXhlcyBvZiB0aGUgZ2l2ZW4gcGF0aC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIGUuZy4gdGhpcy9pcy9hL3BhdGggcmV0dXJucyB0aGUgbGlzdDogdGhpcyB0aGlzL2lzIHRoaXMvaXMvYSB0aGlzL2lzL2EvcGF0aAorICAgICAqCisgICAgICogQHBhcmFtIHBhdGgKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBwYXRoIHByZWZpeGVzIG9mIHRoZSBnaXZlbiBwYXRoLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRQcmVmaXhlcyhTdHJpbmcgcGF0aCkgeworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHByZWZpeGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDgpOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHByZWZpeGVzLmFkZChmaWxlLmdldFBhdGgoKSk7CisgICAgICAgICAgICBmaWxlID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgIH0gd2hpbGUgKGZpbGUgIT0gbnVsbCk7CisKKyAgICAgICAgcmV0dXJuIHByZWZpeGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGUgZGlyZWN0b3J5IG1heSBjb250YWluIHRlc3RzIG9yIGNvbnRhaW5zIGp1c3QgaGVscGVyIGZpbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGRpck5hbWUKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBpZiB0aGUgZGlyZWN0b3J5IG1heSBjb250YWluIHRlc3RzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVGVzdERpcihTdHJpbmcgZGlyTmFtZSkgeworICAgICAgICByZXR1cm4gKCFkaXJOYW1lLmVxdWFscygic2NyaXB0LXRlc3RzIikKKyAgICAgICAgICAgICAgICAmJiAhZGlyTmFtZS5lcXVhbHMoInJlc291cmNlcyIpICYmICFkaXJOYW1lLnN0YXJ0c1dpdGgoIi4iKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBmaWxlIGlzIGEgdGVzdC4KKyAgICAgKiBDdXJyZW50bHkgd2UgcnVuIC5odG1sIGFuZCAueGh0bWwgdGVzdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVzdE5hbWUKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBpZiB0aGUgZmlsZSBpcyBhIHRlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUZXN0RmlsZShTdHJpbmcgdGVzdE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHRlc3ROYW1lLmVuZHNXaXRoKCIuaHRtbCIpIHx8IHRlc3ROYW1lLmVuZHNXaXRoKCIueGh0bWwiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBVUkwgb2YgdGhlIHRlc3Qgb24gdGhlIHNlcnZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKKyAgICAgKiBAcmV0dXJuIGEgVVJMIG9mIHRoZSB0ZXN0IG9uIHRoZSBzZXJ2ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFVSTCBnZXRVcmwoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICBTdHJpbmcgdXJsQmFzZSA9IEZvcndhcmRlck1hbmFnZXIuZ2V0SG9zdFNjaGVtZVBvcnQoZmFsc2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVUkwgaXMgZm9ybWVkIGRpZmZlcmVudGx5IGZvciBIVFRQIHZzIG5vbi1IVFRQIHRlc3RzLCBiZWNhdXNlIEhUVFAgdGVzdHMKKyAgICAgICAgICogZXhwZWN0IGRpZmZlcmVudCBkb2N1bWVudCByb290LiBTZWUgcnVuX2FwYWNoZTIucHkgYW5kIC5jb25mIGZpbGUgZm9yIGRldGFpbHMKKyAgICAgICAgICovCisgICAgICAgIGlmIChyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChIVFRQX1RFU1RTX1BBVEgpKSB7CisgICAgICAgICAgICByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZVBhdGguc3Vic3RyaW5nKEhUVFBfVEVTVFNfUEFUSC5sZW5ndGgoKSk7CisgICAgICAgICAgICBpZiAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoU1NMX1BBVEgpKSB7CisgICAgICAgICAgICAgICAgdXJsQmFzZSA9IEZvcndhcmRlck1hbmFnZXIuZ2V0SG9zdFNjaGVtZVBvcnQodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWxhdGl2ZVBhdGggPSAiTGF5b3V0VGVzdHMvIiArIHJlbGF0aXZlUGF0aDsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFVSTCh1cmxCYXNlICsgcmVsYXRpdmVQYXRoKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJNYWxmb3JtZWQgVVJMISIsIGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIHBhdGggY29udGFpbnMgZXh0ZW5zaW9uIChlLmcgLmZvbyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlKSB0aGVuIGl0IGNoYW5nZXMKKyAgICAgKiB0aGlzICguZm9vKSBpbnRvIG5ld0VuZGluZyAoc28gaXQgaGFzIHRvIGNvbnRhaW4gdGhlIGRvdCBpZiB3ZSB3YW50IHRvIHByZXNlcnZlIGl0KS4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZSBwYXRoIGRvZXNuJ3QgY29udGFpbiBhbiBleHRlbnNpb24sIGl0IGFkZHMgdGhlIGVuZGluZyB0byB0aGUgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKKyAgICAgKiBAcGFyYW0gbmV3RW5kaW5nCisgICAgICogQHJldHVybgorICAgICAqICAgICAgYSBuZXcgcGF0aCwgY29udGFpbmluZyB0aGUgbmV3RXh0ZW5zaW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2V0UGF0aEVuZGluZyhTdHJpbmcgcmVsYXRpdmVQYXRoLCBTdHJpbmcgbmV3RW5kaW5nKSB7CisgICAgICAgIGludCBkb3RQb3MgPSByZWxhdGl2ZVBhdGgubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKGRvdFBvcyA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aCArIG5ld0VuZGluZzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZWxhdGl2ZVBhdGguc3Vic3RyaW5nKDAsIGRvdFBvcykgKyBuZXdFbmRpbmc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRnNVdGlscy5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRnNVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOWE3MzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9Gc1V0aWxzLmphdmEKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuZm9yd2FyZGVyLkZvcndhcmRlck1hbmFnZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuSHR0cENsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LlJlc3BvbnNlSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cEdldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY29ubi5DbGllbnRDb25uZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuUGxhaW5Tb2NrZXRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5TY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4uc2NoZW1lLlNjaGVtZVJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnNzbC5TU0xTb2NrZXRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5EZWZhdWx0SHR0cENsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLnRzY2NtLlRocmVhZFNhZmVDbGllbnRDb25uTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkJhc2ljSHR0cFBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBDb25uZWN0aW9uUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAudXRpbC5FbnRpdHlVdGlsczsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuU29ja2V0VGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICoKKyAqLworcHVibGljIGNsYXNzIEZzVXRpbHMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiRnNVdGlscyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUX1VSTCA9IEZvcndhcmRlck1hbmFnZXIuZ2V0SG9zdFNjaGVtZVBvcnQoZmFsc2UpICsKKyAgICAgICAgICAgICJXZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9hbmRyb2lkL2dldF9sYXlvdXRfdGVzdHNfZGlyX2NvbnRlbnRzLnBocCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9USU1FT1VUX01TID0gNTAwMDsKKworICAgIHByaXZhdGUgc3RhdGljIEh0dHBDbGllbnQgc0h0dHBDbGllbnQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBIdHRwQ2xpZW50IGdldEh0dHBDbGllbnQoKSB7CisgICAgICAgIGlmIChzSHR0cENsaWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICBIdHRwUGFyYW1zIHBhcmFtcyA9IG5ldyBCYXNpY0h0dHBQYXJhbXMoKTsKKworICAgICAgICAgICAgU2NoZW1lUmVnaXN0cnkgc2NoZW1lUmVnaXN0cnkgPSBuZXcgU2NoZW1lUmVnaXN0cnkoKTsKKyAgICAgICAgICAgIHNjaGVtZVJlZ2lzdHJ5LnJlZ2lzdGVyKG5ldyBTY2hlbWUoImh0dHAiLCBQbGFpblNvY2tldEZhY3RvcnkuZ2V0U29ja2V0RmFjdG9yeSgpLAorICAgICAgICAgICAgICAgICAgICBGb3J3YXJkZXJNYW5hZ2VyLkhUVFBfUE9SVCkpOworICAgICAgICAgICAgc2NoZW1lUmVnaXN0cnkucmVnaXN0ZXIobmV3IFNjaGVtZSgiaHR0cHMiLCBTU0xTb2NrZXRGYWN0b3J5LmdldFNvY2tldEZhY3RvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgRm9yd2FyZGVyTWFuYWdlci5IVFRQU19QT1JUKSk7CisKKyAgICAgICAgICAgIENsaWVudENvbm5lY3Rpb25NYW5hZ2VyIGNvbm5lY3Rpb25NYW5hZ2VyID0gbmV3IFRocmVhZFNhZmVDbGllbnRDb25uTWFuYWdlcihwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIHNjaGVtZVJlZ2lzdHJ5KTsKKyAgICAgICAgICAgIHNIdHRwQ2xpZW50ID0gbmV3IERlZmF1bHRIdHRwQ2xpZW50KGNvbm5lY3Rpb25NYW5hZ2VyLCBwYXJhbXMpOworICAgICAgICAgICAgSHR0cENvbm5lY3Rpb25QYXJhbXMuc2V0U29UaW1lb3V0KHNIdHRwQ2xpZW50LmdldFBhcmFtcygpLCBIVFRQX1RJTUVPVVRfTVMpOworICAgICAgICAgICAgSHR0cENvbm5lY3Rpb25QYXJhbXMuc2V0Q29ubmVjdGlvblRpbWVvdXQoc0h0dHBDbGllbnQuZ2V0UGFyYW1zKCksIEhUVFBfVElNRU9VVF9NUyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNIdHRwQ2xpZW50OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZURhdGFUb1N0b3JhZ2UoRmlsZSBmaWxlLCBieXRlW10gYnl0ZXMsIGJvb2xlYW4gYXBwZW5kKSB7CisgICAgICAgIExvZy5kKExPR19UQUcsICJ3cml0ZURhdGFUb1N0b3JhZ2UoKTogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOworICAgICAgICAgICAgICAgIGZpbGUuY3JlYXRlTmV3RmlsZSgpOworICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJ3cml0ZURhdGFUb1N0b3JhZ2UoKTogRmlsZSBjcmVhdGVkOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSwgYXBwZW5kKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoYnl0ZXMpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiZmlsZS5nZXRBYnNvbHV0ZVBhdGg9IiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGFwcGVuZD0iICsgYXBwZW5kLAorICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHJlYWREYXRhRnJvbVN0b3JhZ2UoRmlsZSBmaWxlKSB7CisgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInJlYWREYXRhRnJvbVN0b3JhZ2UoKTogRmlsZSBkb2VzIG5vdCBleGlzdDogIgorICAgICAgICAgICAgICAgICAgICArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBieXRlW10gYnl0ZXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICAgICAgYnl0ZXMgPSBuZXcgYnl0ZVsoaW50KWZpbGUubGVuZ3RoKCldOworICAgICAgICAgICAgICAgIGZpcy5yZWFkKGJ5dGVzKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKGZpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgImZpbGUuZ2V0QWJzb2x1dGVQYXRoPSIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBieXRlczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSByZWFkRGF0YUZyb21VcmwoVVJMIHVybCkgeworICAgICAgICBpZiAodXJsID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJyZWFkRGF0YUZyb21VcmwoKTogdXJsIGlzIG51bGwhIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEh0dHBHZXQgaHR0cFJlcXVlc3QgPSBuZXcgSHR0cEdldCh1cmwudG9TdHJpbmcoKSk7CisgICAgICAgIFJlc3BvbnNlSGFuZGxlcjxieXRlW10+IGhhbmRsZXIgPSBuZXcgUmVzcG9uc2VIYW5kbGVyPGJ5dGVbXT4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBieXRlW10gaGFuZGxlUmVzcG9uc2UoSHR0cFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpICE9IEh0dHBTdGF0dXMuU0NfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEh0dHBFbnRpdHkgZW50aXR5ID0gcmVzcG9uc2UuZ2V0RW50aXR5KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChlbnRpdHkgPT0gbnVsbCA/IG51bGwgOiBFbnRpdHlVdGlscy50b0J5dGVBcnJheShlbnRpdHkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBieXRlW10gYnl0ZXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUT0RPOiBOb3QgZXhhY3RseSBzdXJlIHdoeSBzb21lIHJlcXVlc3RzIGhhbmcgaW5kZWZpbml0ZWx5LCBidXQgYWRkaW5nIHRoaXMKKyAgICAgICAgICAgICAqIHRpbWVvdXQgKGluIHN0YXRpYyBnZXR0ZXIgZm9yIGh0dHAgY2xpZW50KSBpbiBsb29wIGhlbHBzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBib29sZWFuIHRpbWVkT3V0OworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHRpbWVkT3V0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBnZXRIdHRwQ2xpZW50KCkuZXhlY3V0ZShodHRwUmVxdWVzdCwgaGFuZGxlcik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU29ja2V0VGltZW91dEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVkT3V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkV4cGVjdGVkIFNvY2tldFRpbWVvdXRFeGNlcHRpb246ICIgKyB1cmwsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRpbWVkT3V0KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgInVybD0iICsgdXJsLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBieXRlczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRMYXlvdXRUZXN0c0RpckNvbnRlbnRzKFN0cmluZyBkaXJSZWxhdGl2ZVBhdGgsIGJvb2xlYW4gcmVjdXJzZSwKKyAgICAgICAgICAgIGJvb2xlYW4gbW9kZSkgeworICAgICAgICBTdHJpbmcgbW9kZVN0cmluZyA9IChtb2RlID8gImZvbGRlcnMiIDogImZpbGVzIik7CisKKyAgICAgICAgVVJMIHVybCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKFNDUklQVF9VUkwgKworICAgICAgICAgICAgICAgICAgICAiP3BhdGg9IiArIGRpclJlbGF0aXZlUGF0aCArCisgICAgICAgICAgICAgICAgICAgICImcmVjdXJzZT0iICsgcmVjdXJzZSArCisgICAgICAgICAgICAgICAgICAgICImbW9kZT0iICsgbW9kZVN0cmluZyk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAicGF0aD0iICsgZGlyUmVsYXRpdmVQYXRoICsgIiByZWN1cnNlPSIgKyByZWN1cnNlICsgIiBtb2RlPSIgKworICAgICAgICAgICAgICAgICAgICBtb2RlU3RyaW5nLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisgICAgICAgIH0KKworICAgICAgICBIdHRwR2V0IGh0dHBSZXF1ZXN0ID0gbmV3IEh0dHBHZXQodXJsLnRvU3RyaW5nKCkpOworICAgICAgICBSZXNwb25zZUhhbmRsZXI8TGlua2VkTGlzdDxTdHJpbmc+PiBoYW5kbGVyID0gbmV3IFJlc3BvbnNlSGFuZGxlcjxMaW5rZWRMaXN0PFN0cmluZz4+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTGlua2VkTGlzdDxTdHJpbmc+IGhhbmRsZVJlc3BvbnNlKEh0dHBSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBMaW5rZWRMaXN0PFN0cmluZz4gbGluZXMgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKSAhPSBIdHRwU3RhdHVzLlNDX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5lczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSHR0cEVudGl0eSBlbnRpdHkgPSByZXNwb25zZS5nZXRFbnRpdHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGVudGl0eS5nZXRDb250ZW50KCkpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYWRkKGxpbmUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBsaW5lczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBDbGllbnQoKS5leGVjdXRlKGh0dHBSZXF1ZXN0LCBoYW5kbGVyKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgImdldExheW91dFRlc3RzRGlyQ29udGVudHMoKTogSFRUUCBHRVQgZmFpbGVkIGZvciBVUkwgIiArIHVybCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZUlucHV0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJDb3VsZG4ndCBjbG9zZSBzdHJlYW0hIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJDb3VsZG4ndCBjbG9zZSBzdHJlYW0hIiwgZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9MYXlvdXRUZXN0Q29udHJvbGxlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjA4ZTJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuTW9ja0dlb2xvY2F0aW9uOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlN0b3JhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogQSBjbGFzcyB0aGF0IGlzIHJlZ2lzdGVyZWQgYXMgSlMgaW50ZXJmYWNlIGZvciB3ZWJ2aWV3IGluIExheW91dFRlc3RFeGVjdXRvcgorICovCitwdWJsaWMgY2xhc3MgTGF5b3V0VGVzdENvbnRyb2xsZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkxheW91dFRlc3RDb250cm9sbGVyIjsKKworICAgIExheW91dFRlc3RzRXhlY3V0b3IgbUxheW91dFRlc3RzRXhlY3V0b3I7CisKKyAgICBwdWJsaWMgTGF5b3V0VGVzdENvbnRyb2xsZXIoTGF5b3V0VGVzdHNFeGVjdXRvciBsYXlvdXRUZXN0c0V4ZWN1dG9yKSB7CisgICAgICAgIG1MYXlvdXRUZXN0c0V4ZWN1dG9yID0gbGF5b3V0VGVzdHNFeGVjdXRvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhckFsbERhdGFiYXNlcygpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgImNsZWFyQWxsRGF0YWJhc2VzKCkgY2FsbGVkIik7CisgICAgICAgIFdlYlN0b3JhZ2UuZ2V0SW5zdGFuY2UoKS5kZWxldGVBbGxEYXRhKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dCgpIHsKKyAgICAgICAgZHVtcEFzVGV4dChmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dChib29sZWFuIGVuYWJsZVBpeGVsVGVzdCkgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci5kdW1wQXNUZXh0KGVuYWJsZVBpeGVsVGVzdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcENoaWxkRnJhbWVzQXNUZXh0KCkgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci5kdW1wQ2hpbGRGcmFtZXNBc1RleHQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wRGF0YWJhc2VDYWxsYmFja3MoKSB7CisgICAgICAgIG1MYXlvdXRUZXN0c0V4ZWN1dG9yLmR1bXBEYXRhYmFzZUNhbGxiYWNrcygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURvbmUoKSB7CisgICAgICAgIG1MYXlvdXRUZXN0c0V4ZWN1dG9yLm5vdGlmeURvbmUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvdmVycmlkZVByZWZlcmVuY2UoU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci5vdmVycmlkZVByZWZlcmVuY2Uoa2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXBwQ2FjaGVNYXhpbXVtU2l6ZShsb25nIHNpemUpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgInNldEFwcENhY2hlTWF4aW11bVNpemUoKSBjYWxsZWQgd2l0aDogIiArIHNpemUpOworICAgICAgICBXZWJTdG9yYWdlLmdldEluc3RhbmNlKCkuc2V0QXBwQ2FjaGVNYXhpbXVtU2l6ZShzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDYW5PcGVuV2luZG93cygpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3Iuc2V0Q2FuT3BlbldpbmRvd3MoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREYXRhYmFzZVF1b3RhKGxvbmcgcXVvdGEpIHsKKyAgICAgICAgLyoqIFRPRE86IFJlc2V0IHRoaXMgYmVmb3JlIGV2ZXJ5IHRlc3QhICovCisgICAgICAgIExvZy5pKExPR19UQUcsICJzZXREYXRhYmFzZVF1b3RhKCkgY2FsbGVkIHdpdGg6ICIgKyBxdW90YSk7CisgICAgICAgIFdlYlN0b3JhZ2UuZ2V0SW5zdGFuY2UoKS5zZXRRdW90YUZvck9yaWdpbihVcmkuZnJvbUZpbGUobmV3IEZpbGUoIiIpKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgIHF1b3RhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oYm9vbGVhbiBhbGxvdykgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci5zZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oYWxsb3cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgLy8gQ29uZmlndXJhdGlvbiBpcyBpbiBXZWJLaXQsIHNvIHN0YXkgb24gV2ViQ29yZSB0aHJlYWQsIGJ1dCBnbyB2aWEgTGF5b3V0VGVzdHNFeGVjdXRvcgorICAgICAgICAvLyBhcyB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgV2Vidmlldy4KKyAgICAgICAgTG9nLmkoTE9HX1RBRywgInNldE1vY2tEZXZpY2VPcmllbnRhdGlvbigiICsgY2FuUHJvdmlkZUFscGhhICsKKyAgICAgICAgICAgICAgICAiLCAiICsgYWxwaGEgKyAiLCAiICsgY2FuUHJvdmlkZUJldGEgKyAiLCAiICsgYmV0YSArICIsICIgKyBjYW5Qcm92aWRlR2FtbWEgKworICAgICAgICAgICAgICAgICIsICIgKyBnYW1tYSArICIpIik7CisgICAgICAgIG1MYXlvdXRUZXN0c0V4ZWN1dG9yLnNldE1vY2tEZXZpY2VPcmllbnRhdGlvbigKKyAgICAgICAgICAgICAgICBjYW5Qcm92aWRlQWxwaGEsIGFscGhhLCBjYW5Qcm92aWRlQmV0YSwgYmV0YSwgY2FuUHJvdmlkZUdhbW1hLCBnYW1tYSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TW9ja0dlb2xvY2F0aW9uRXJyb3IoaW50IGNvZGUsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIExvZy5pKExPR19UQUcsICJzZXRNb2NrR2VvbG9jYXRpb25FcnJvcigpOiAiICsgImNvZGU9IiArIGNvZGUgKyAiIG1lc3NhZ2U9IiArIG1lc3NhZ2UpOworICAgICAgICBNb2NrR2VvbG9jYXRpb24uZ2V0SW5zdGFuY2UoKS5zZXRFcnJvcihjb2RlLCBtZXNzYWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrR2VvbG9jYXRpb25Qb3NpdGlvbihkb3VibGUgbGF0aXR1ZGUsIGRvdWJsZSBsb25naXR1ZGUsIGRvdWJsZSBhY2N1cmFjeSkgeworICAgICAgICBMb2cuaShMT0dfVEFHLCAic2V0TW9ja0dlb2xvY2F0aW9uUG9zaXRpb24oKTogIiArICJsYXRpdHVkZT0iICsgbGF0aXR1ZGUgKworICAgICAgICAgICAgICAgICIgbG9uZ2l0dWRlPSIgKyBsb25naXR1ZGUgKyAiIGFjY3VyYWN5PSIgKyBhY2N1cmFjeSk7CisgICAgICAgIE1vY2tHZW9sb2NhdGlvbi5nZXRJbnN0YW5jZSgpLnNldFBvc2l0aW9uKGxhdGl0dWRlLCBsb25naXR1ZGUsIGFjY3VyYWN5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRYU1NBdWRpdG9yRW5hYmxlZChib29sZWFuIGZsYWcpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3Iuc2V0WFNTQXVkaXRvckVuYWJsZWQoZmxhZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd2FpdFVudGlsRG9uZSgpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3Iud2FpdFVudGlsRG9uZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0xheW91dFRlc3RzRXhlY3V0b3IuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0xheW91dFRlc3RzRXhlY3V0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2Q3Y2NhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTGF5b3V0VGVzdHNFeGVjdXRvci5qYXZhCkBAIC0wLDAgKzEsNzI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5uZXQuaHR0cC5Tc2xFcnJvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2VuZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlci5XYWtlTG9jazsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuR2VvbG9jYXRpb25QZXJtaXNzaW9uczsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5IdHRwQXV0aEhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuSnNQcm9tcHRSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuSnNSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuU3NsRXJyb3JIYW5kbGVyOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYkNocm9tZUNsaWVudDsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJTdG9yYWdlOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlN0b3JhZ2UuUXVvdGFVcGRhdGVyOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NsaWVudDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmxhbmcuVGhyZWFkLlVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFRoaXMgYWN0aXZpdHkgZXhlY3V0ZXMgdGhlIHRlc3QuIEl0IGNvbnRhaW5zIFdlYlZpZXcgYW5kIGxvZ2ljIG9mIExheW91dFRlc3RDb250cm9sbGVyCisgKiBmdW5jdGlvbnMuIEl0IHJ1bnMgaW4gYSBzZXBhcmF0ZSBwcm9jZXNzIGFuZCBzZW5kcyB0aGUgcmVzdWx0cyBvZiBydW5uaW5nIHRoZSB0ZXN0CisgKiB0byBNYW5hZ2VyU2VydmljZS4gVGhlIHJlYXNvbiB3aHkgaXMgdG8gaGFuZGxlIGNyYXNoaW5nICh0ZXN0IHRoYXQgY3Jhc2hlcyBicmluZ3MgZG93bgorICogd2hvbGUgcHJvY2VzcyB3aXRoIGl0KS4KKyAqLworcHVibGljIGNsYXNzIExheW91dFRlc3RzRXhlY3V0b3IgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIGVudW0gQ3VycmVudFN0YXRlIHsKKyAgICAgICAgSURMRSwKKyAgICAgICAgUkVOREVSSU5HX1BBR0UsCisgICAgICAgIFdBSVRJTkdfRk9SX0FTWU5DSFJPTk9VU19URVNULAorICAgICAgICBPQlRBSU5JTkdfUkVTVUxUOworCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUnVubmluZ1N0YXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMgPT0gQ3VycmVudFN0YXRlLlJFTkRFUklOR19QQUdFIHx8CisgICAgICAgICAgICAgICAgICAgIHRoaXMgPT0gQ3VycmVudFN0YXRlLldBSVRJTkdfRk9SX0FTWU5DSFJPTk9VU19URVNUOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiTGF5b3V0VGVzdHNFeGVjdXRvciI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9URVNUU19MSVNUID0gIlRlc3RzTGlzdCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVEVTVF9JTkRFWCA9ICJUZXN0SW5kZXgiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19BQ1RVQUxfUkVTVUxUX09CVEFJTkVEID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RFU1RfVElNRURfT1VUID0gMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1RJTUVfT1VUX01TID0gMTUgKiAxMDAwOworCisgICAgLyoqIEEgbGlzdCBvZiB0ZXN0cyB0aGF0IHJlbWFpbiB0byBydW4gc2luY2UgbGFzdCBjcmFzaCAqLworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1UZXN0c0xpc3Q7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGEgbnVtYmVyIG9mIGN1cnJlbnRseSBydW5uaW5nIHRlc3QuIEl0IGlzIDAtYmFzZWQgYW5kIGRvZXNuJ3QgcmVzZXQgYWZ0ZXIKKyAgICAgKiB0aGUgY3Jhc2guIEluaXRpYWwgaW5kZXggaXMgcGFzc2VkIHRvIExheW91dFRlc3RzRXhlY3V0ZXIgaW4gdGhlIGludGVudCB0aGF0IHN0YXJ0cworICAgICAqIGl0LgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1DdXJyZW50VGVzdEluZGV4OworCisgICAgLyoqIFRoZSB0b3RhbCBudW1iZXIgb2YgdGVzdHMgdG8gcnVuLCBkb2Vzbid0IHJlc2V0IGFmdGVyIGNyYXNoICovCisgICAgcHJpdmF0ZSBpbnQgbVRvdGFsVGVzdENvdW50OworCisgICAgcHJpdmF0ZSBXZWJWaWV3IG1DdXJyZW50V2ViVmlldzsKKyAgICBwcml2YXRlIFN0cmluZyBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGg7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUN1cnJlbnRUZXN0VXJpOworICAgIHByaXZhdGUgQ3VycmVudFN0YXRlIG1DdXJyZW50U3RhdGUgPSBDdXJyZW50U3RhdGUuSURMRTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtQ3VycmVudFRlc3RUaW1lZE91dDsKKyAgICBwcml2YXRlIEFic3RyYWN0UmVzdWx0IG1DdXJyZW50UmVzdWx0OworICAgIHByaXZhdGUgQWRkaXRpb25hbFRleHRPdXRwdXQgbUN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dDsKKworICAgIHByaXZhdGUgTGF5b3V0VGVzdENvbnRyb2xsZXIgbUxheW91dFRlc3RDb250cm9sbGVyID0gbmV3IExheW91dFRlc3RDb250cm9sbGVyKHRoaXMpOworICAgIHByaXZhdGUgYm9vbGVhbiBtQ2FuT3BlbldpbmRvd3M7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EdW1wRGF0YWJhc2VDYWxsYmFja3M7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0dlb2xvY2F0aW9uUGVybWlzc2lvblNldDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUdlb2xvY2F0aW9uUGVybWlzc2lvbjsKKyAgICBwcml2YXRlIE1hcDxHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrLCBTdHJpbmc+IG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzOworCisgICAgcHJpdmF0ZSBFdmVudFNlbmRlciBtRXZlbnRTZW5kZXIgPSBuZXcgRXZlbnRTZW5kZXIoKTsKKworICAgIHByaXZhdGUgV2FrZUxvY2sgbVNjcmVlbkRpbUxvY2s7CisKKyAgICAvKiogQ09NTVVOSUNBVElPTiBXSVRIIE1hbmFnZXJTZXJ2aWNlICovCisKKyAgICBwcml2YXRlIE1lc3NlbmdlciBtTWFuYWdlclNlcnZpY2VNZXNzZW5nZXI7CisKKyAgICBwcml2YXRlIFNlcnZpY2VDb25uZWN0aW9uIG1TZXJ2aWNlQ29ubmVjdGlvbiA9IG5ldyBTZXJ2aWNlQ29ubmVjdGlvbigpIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7CisgICAgICAgICAgICBtTWFuYWdlclNlcnZpY2VNZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKHNlcnZpY2UpOworICAgICAgICAgICAgc3RhcnRUZXN0cygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKKyAgICAgICAgICAgIC8qKiBUT0RPICovCisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1SZXN1bHRIYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQUNUVUFMX1JFU1VMVF9PQlRBSU5FRDoKKyAgICAgICAgICAgICAgICAgICAgb25BY3R1YWxSZXN1bHRzT2J0YWluZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19URVNUX1RJTUVEX09VVDoKKyAgICAgICAgICAgICAgICAgICAgb25UZXN0VGltZWRPdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKiogV0VCVklFVyBDT05GSUdVUkFUSU9OICovCisKKyAgICBwcml2YXRlIFdlYlZpZXdDbGllbnQgbVdlYlZpZXdDbGllbnQgPSBuZXcgV2ViVmlld0NsaWVudCgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGFnZUZpbmlzaGVkKFdlYlZpZXcgdmlldywgU3RyaW5nIHVybCkgeworICAgICAgICAgICAgLyoqIFNvbWUgdGVzdHMgZmlyZSB1cCBtYW55IHBhZ2UgbG9hZHMsIHdlIGRvbid0IHdhbnQgdG8gZGV0ZWN0IHRoZW0gKi8KKyAgICAgICAgICAgIGlmICghdXJsLmVxdWFscyhtQ3VycmVudFRlc3RVcmkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBDdXJyZW50U3RhdGUuUkVOREVSSU5HX1BBR0UpIHsKKyAgICAgICAgICAgICAgICBvblRlc3RGaW5pc2hlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlZEh0dHBBdXRoUmVxdWVzdChXZWJWaWV3IHZpZXcsIEh0dHBBdXRoSGFuZGxlciBoYW5kbGVyLAorICAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdCwgU3RyaW5nIHJlYWxtKSB7CisgICAgICAgICAgICAgaWYgKGhhbmRsZXIudXNlSHR0cEF1dGhVc2VybmFtZVBhc3N3b3JkKCkgJiYgdmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNyZWRlbnRpYWxzID0gdmlldy5nZXRIdHRwQXV0aFVzZXJuYW1lUGFzc3dvcmQoaG9zdCwgcmVhbG0pOworICAgICAgICAgICAgICAgICBpZiAoY3JlZGVudGlhbHMgIT0gbnVsbCAmJiBjcmVkZW50aWFscy5sZW5ndGggPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5wcm9jZWVkKGNyZWRlbnRpYWxzWzBdLCBjcmVkZW50aWFsc1sxXSk7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgaGFuZGxlci5jYW5jZWwoKTsKKyAgICAgICAgIH0KKworICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmVkU3NsRXJyb3IoV2ViVmlldyB2aWV3LCBTc2xFcnJvckhhbmRsZXIgaGFuZGxlciwgU3NsRXJyb3IgZXJyb3IpIHsKKyAgICAgICAgICAgICAvLyBXZSBpZ25vcmUgU1NMIGVycm9ycy4gSW4gcGFydGljdWxhciwgdGhlIGNlcnRpZmljYXRlIHVzZWQgYnkgdGhlIExheW91dFRlc3RzIHNlcnZlcgorICAgICAgICAgICAgIC8vIHByb2R1Y2VzIGFuIGVycm9yIGFzIGl0IGxhY2tzIGEgQ04gZmllbGQuCisgICAgICAgICAgICAgaGFuZGxlci5wcm9jZWVkKCk7CisgICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgV2ViQ2hyb21lQ2xpZW50IG1XZWJDaHJvbWVDbGllbnQgPSBuZXcgV2ViQ2hyb21lQ2xpZW50KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25FeGNlZWRlZERhdGFiYXNlUXVvdGEoU3RyaW5nIHVybCwgU3RyaW5nIGRhdGFiYXNlSWRlbnRpZmllciwKKyAgICAgICAgICAgICAgICBsb25nIGN1cnJlbnRRdW90YSwgbG9uZyBlc3RpbWF0ZWRTaXplLCBsb25nIHRvdGFsVXNlZFF1b3RhLAorICAgICAgICAgICAgICAgIFF1b3RhVXBkYXRlciBxdW90YVVwZGF0ZXIpIHsKKyAgICAgICAgICAgIC8qKiBUT0RPOiBUaGlzIHNob3VsZCBiZSByZWNvcmRlZCBhcyBwYXJ0IG9mIHRoZSB0ZXh0IHJlc3VsdCAqLworICAgICAgICAgICAgLyoqIFRPRE86IFRoZSBxdW90YSBzaG91bGQgYWxzbyBwcm9iYWJseSBiZSByZXNldCBzb21laG93IGZvciBldmVyeSB0ZXN0PyAqLworICAgICAgICAgICAgaWYgKG1EdW1wRGF0YWJhc2VDYWxsYmFja3MpIHsKKyAgICAgICAgICAgICAgICBnZXRDdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQoKS5hcHBlbmRFeGNlZWRlZERiUXVvdGFNZXNzYWdlKHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlSWRlbnRpZmllcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBxdW90YVVwZGF0ZXIudXBkYXRlUXVvdGEoY3VycmVudFF1b3RhICsgNSAqIDEwMjQgKiAxMDI0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkpzQWxlcnQoV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsLCBTdHJpbmcgbWVzc2FnZSwgSnNSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgICAgICBnZXRDdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQoKS5hcHBlbmRKc0FsZXJ0KG1lc3NhZ2UpOworICAgICAgICAgICAgcmVzdWx0LmNvbmZpcm0oKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uSnNDb25maXJtKFdlYlZpZXcgdmlldywgU3RyaW5nIHVybCwgU3RyaW5nIG1lc3NhZ2UsIEpzUmVzdWx0IHJlc3VsdCkgeworICAgICAgICAgICAgZ2V0Q3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0KCkuYXBwZW5kSnNDb25maXJtKG1lc3NhZ2UpOworICAgICAgICAgICAgcmVzdWx0LmNvbmZpcm0oKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uSnNQcm9tcHQoV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSwKKyAgICAgICAgICAgICAgICBKc1Byb21wdFJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgICAgIGdldEN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCgpLmFwcGVuZEpzUHJvbXB0KG1lc3NhZ2UsIGRlZmF1bHRWYWx1ZSk7CisgICAgICAgICAgICByZXN1bHQuY29uZmlybSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db25zb2xlTWVzc2FnZShDb25zb2xlTWVzc2FnZSBjb25zb2xlTWVzc2FnZSkgeworICAgICAgICAgICAgZ2V0Q3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0KCkuYXBwZW5kQ29uc29sZU1lc3NhZ2UoY29uc29sZU1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVXaW5kb3coV2ViVmlldyB2aWV3LCBib29sZWFuIGRpYWxvZywgYm9vbGVhbiB1c2VyR2VzdHVyZSwKKyAgICAgICAgICAgICAgICBNZXNzYWdlIHJlc3VsdE1zZykgeworICAgICAgICAgICAgV2ViVmlldy5XZWJWaWV3VHJhbnNwb3J0IHRyYW5zcG9ydCA9IChXZWJWaWV3LldlYlZpZXdUcmFuc3BvcnQpcmVzdWx0TXNnLm9iajsKKyAgICAgICAgICAgIC8qKiBCeSBkZWZhdWx0IHdpbmRvd3MgY2Fubm90IGJlIG9wZW5lZCwgc28ganVzdCBzZW5kIG51bGwgYmFjay4gKi8KKyAgICAgICAgICAgIFdlYlZpZXcgbmV3V2luZG93V2ViVmlldyA9IG51bGw7CisKKyAgICAgICAgICAgIGlmIChtQ2FuT3BlbldpbmRvd3MpIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBXZSBuZXZlciBkaXNwbGF5IHRoZSBuZXcgd2luZG93LCBqdXN0IGNyZWF0ZSB0aGUgdmlldyBhbmQgYWxsb3cgaXQncyBjb250ZW50IHRvCisgICAgICAgICAgICAgICAgICogZXhlY3V0ZSBhbmQgYmUgcmVjb3JkZWQgYnkgdGhlIGV4ZWN1dG9yLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIG5ld1dpbmRvd1dlYlZpZXcgPSBjcmVhdGVXZWJWaWV3V2l0aEphdmFzY3JpcHRJbnRlcmZhY2VzKCk7CisgICAgICAgICAgICAgICAgc2V0dXBXZWJWaWV3KG5ld1dpbmRvd1dlYlZpZXcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFuc3BvcnQuc2V0V2ViVmlldyhuZXdXaW5kb3dXZWJWaWV3KTsKKyAgICAgICAgICAgIHJlc3VsdE1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uR2VvbG9jYXRpb25QZXJtaXNzaW9uc1Nob3dQcm9tcHQoU3RyaW5nIG9yaWdpbiwKKyAgICAgICAgICAgICAgICBHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBpZiAobUlzR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0KSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2suaW52b2tlKG9yaWdpbiwgbUdlb2xvY2F0aW9uUGVybWlzc2lvbiwgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8R2VvbG9jYXRpb25QZXJtaXNzaW9ucy5DYWxsYmFjaywgU3RyaW5nPigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MucHV0KGNhbGxiYWNrLCBvcmlnaW4pOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKiBJTVBMRU1FTlRBVElPTiAqLworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJdCBkZXRlY3RzIHRoZSBjcmFzaCBieSBjYXRjaGluZyBhbGwgdGhlIHVuY2F1Z2h0IGV4Y2VwdGlvbnMuIEhvd2V2ZXIsIHdlCisgICAgICAgICAqIHN0aWxsIGhhdmUgdG8ga2lsbCB0aGUgcHJvY2VzcywgYmVjYXVzZSBhZnRlciBjYXRjaGluZyB0aGUgZXhjZXB0aW9uIHRoZQorICAgICAgICAgKiBhY3Rpdml0eSByZW1haW5zIGluIGEgc3RyYW5nZSBzdGF0ZSwgd2hlcmUgaW50ZW50cyBkb24ndCByZXZpdmUgaXQuCisgICAgICAgICAqIEhvd2V2ZXIsIHdlIHNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIHNlcnZpY2UgdG8gc3BlZWQgdXAgdGhlIHJlYm9vdGluZworICAgICAgICAgKiAod2UgZG9uJ3QgaGF2ZSB0byB3YWl0IGZvciB0aW1lLW91dCB0byBraWNrIGluKS4KKyAgICAgICAgICovCisgICAgICAgIFRocmVhZC5zZXREZWZhdWx0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKG5ldyBVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHVuY2F1Z2h0RXhjZXB0aW9uKFRocmVhZCB0aHJlYWQsIFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICJvblRlc3RDcmFzaGVkKCk6ICIgKyBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKyAiIHRocmVhZD0iICsgdGhyZWFkLCBlKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2Ugc2VydmljZU1zZyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obnVsbCwgTWFuYWdlclNlcnZpY2UuTVNHX0NVUlJFTlRfVEVTVF9DUkFTSEVEKTsKKworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlclNlcnZpY2VNZXNzZW5nZXIuc2VuZChzZXJ2aWNlTXNnKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIm1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aD0iICsgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoLCBlMik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgUHJvY2Vzcy5raWxsUHJvY2VzcyhQcm9jZXNzLm15UGlkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICByZXF1ZXN0V2luZG93RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9QUk9HUkVTUyk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IGdldEludGVudCgpOworICAgICAgICBtVGVzdHNMaXN0ID0gaW50ZW50LmdldFN0cmluZ0FycmF5TGlzdEV4dHJhKEVYVFJBX1RFU1RTX0xJU1QpOworICAgICAgICBtQ3VycmVudFRlc3RJbmRleCA9IGludGVudC5nZXRJbnRFeHRyYShFWFRSQV9URVNUX0lOREVYLCAtMSk7CisgICAgICAgIG1Ub3RhbFRlc3RDb3VudCA9IG1DdXJyZW50VGVzdEluZGV4ICsgbVRlc3RzTGlzdC5zaXplKCk7CisKKyAgICAgICAgUG93ZXJNYW5hZ2VyIHBtID0gKFBvd2VyTWFuYWdlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuUE9XRVJfU0VSVklDRSk7CisgICAgICAgIG1TY3JlZW5EaW1Mb2NrID0gcG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlNDUkVFTl9ESU1fV0FLRV9MT0NLCisgICAgICAgICAgICAgICAgfCBQb3dlck1hbmFnZXIuT05fQUZURVJfUkVMRUFTRSwgIldha2VMb2NrIGluIExheW91dFRlc3RlciIpOworICAgICAgICBtU2NyZWVuRGltTG9jay5hY3F1aXJlKCk7CisKKyAgICAgICAgYmluZFNlcnZpY2UobmV3IEludGVudCh0aGlzLCBNYW5hZ2VyU2VydmljZS5jbGFzcyksIG1TZXJ2aWNlQ29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNldCgpIHsKKyAgICAgICAgV2ViVmlldyBwcmV2aW91c1dlYlZpZXcgPSBtQ3VycmVudFdlYlZpZXc7CisKKyAgICAgICAgcmVzZXRMYXlvdXRUZXN0Q29udHJvbGxlcigpOworCisgICAgICAgIG1DdXJyZW50VGVzdFRpbWVkT3V0ID0gZmFsc2U7CisgICAgICAgIG1DdXJyZW50UmVzdWx0ID0gbnVsbDsKKyAgICAgICAgbUN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCA9IG51bGw7CisKKyAgICAgICAgbUN1cnJlbnRXZWJWaWV3ID0gY3JlYXRlV2ViVmlld1dpdGhKYXZhc2NyaXB0SW50ZXJmYWNlcygpOworICAgICAgICAvLyBXaGVuIHdlIGNyZWF0ZSB0aGUgZmlyc3QgV2ViVmlldywgd2UgbmVlZCB0byBwYXVzZSB0byB3YWl0IGZvciB0aGUgV2ViVmlldyB0aHJlYWQgdG8gc3BpbgorICAgICAgICAvLyBhbmQgdXAgYW5kIGZvciBpdCB0byByZWdpc3RlciBpdHMgbWVzc2FnZSBoYW5kbGVycy4KKyAgICAgICAgaWYgKHByZXZpb3VzV2ViVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2xlZXAoMTAwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KKyAgICAgICAgfQorICAgICAgICBzZXR1cFdlYlZpZXcobUN1cnJlbnRXZWJWaWV3KTsKKworICAgICAgICBtRXZlbnRTZW5kZXIucmVzZXQobUN1cnJlbnRXZWJWaWV3KTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhtQ3VycmVudFdlYlZpZXcpOworICAgICAgICBpZiAocHJldmlvdXNXZWJWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcgKyAiOjpyZXNldCIsICJwcmV2aW91c1dlYlZpZXcgIT0gbnVsbCIpOworICAgICAgICAgICAgcHJldmlvdXNXZWJWaWV3LmRlc3Ryb3koKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFdlYlZpZXdXaXRoSmF2YXNjcmlwdEludGVyZmFjZXMgZXh0ZW5kcyBXZWJWaWV3IHsKKyAgICAgICAgcHVibGljIFdlYlZpZXdXaXRoSmF2YXNjcmlwdEludGVyZmFjZXMoCisgICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IGphdmFzY3JpcHRJbnRlcmZhY2VzKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LAorICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gYXR0cmlidXRlIHNldAorICAgICAgICAgICAgICAgICAgMCwgLy8gZGVmYXVsdCBzdHlsZSByZXNvdXJjZSBJRAorICAgICAgICAgICAgICAgICAgamF2YXNjcmlwdEludGVyZmFjZXMsCisgICAgICAgICAgICAgICAgICBmYWxzZSk7IC8vIGlzIHByaXZhdGUgYnJvd3NpbmcKKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIFdlYlZpZXcgY3JlYXRlV2ViVmlld1dpdGhKYXZhc2NyaXB0SW50ZXJmYWNlcygpIHsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqYXZhc2NyaXB0SW50ZXJmYWNlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBqYXZhc2NyaXB0SW50ZXJmYWNlcy5wdXQoImxheW91dFRlc3RDb250cm9sbGVyIiwgbUxheW91dFRlc3RDb250cm9sbGVyKTsKKyAgICAgICAgamF2YXNjcmlwdEludGVyZmFjZXMucHV0KCJldmVudFNlbmRlciIsIG1FdmVudFNlbmRlcik7CisgICAgICAgIHJldHVybiBuZXcgV2ViVmlld1dpdGhKYXZhc2NyaXB0SW50ZXJmYWNlcyh0aGlzLCBqYXZhc2NyaXB0SW50ZXJmYWNlcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwV2ViVmlldyhXZWJWaWV3IHdlYlZpZXcpIHsKKyAgICAgICAgd2ViVmlldy5zZXRXZWJWaWV3Q2xpZW50KG1XZWJWaWV3Q2xpZW50KTsKKyAgICAgICAgd2ViVmlldy5zZXRXZWJDaHJvbWVDbGllbnQobVdlYkNocm9tZUNsaWVudCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHRpbmcgYSB0b3VjaCBpbnRlcnZhbCBvZiAtMSBlZmZlY3RpdmVseSBkaXNhYmxlcyB0aGUgb3B0aW1pc2F0aW9uIGluIFdlYlZpZXcKKyAgICAgICAgICogdGhhdCBzdG9wcyByZXBlYXRlZCB0b3VjaCBldmVudHMgZmxvb2RpbmcgV2ViQ29yZS4gVGhlIEV2ZW50IFNlbmRlciBvbmx5IHNlbmRzIGEKKyAgICAgICAgICogc2luZ2xlIGV2ZW50IHJhdGhlciB0aGFuIGEgc3RyZWFtIG9mIGV2ZW50cyAobGlrZSB3aGF0IHdvdWxkIGdlbmVyYWxseSBoYXBwZW4gaW4KKyAgICAgICAgICogYSByZWFsIHVzZSBvZiB0b3VjaCBldmVudHMgaW4gYSBXZWJWaWV3KSAgYW5kIHNvIGlmIHRoZSBXZWJWaWV3IGRyb3BzIHRoZSBldmVudCwKKyAgICAgICAgICogdGhlIHRlc3Qgd2lsbCBmYWlsIGFzIHRoZSB0ZXN0IGV4cGVjdHMgb25lIGNhbGxiYWNrIGZvciBldmVyeSB0b3VjaCBpdCBzeW50aGVzaXplcy4KKyAgICAgICAgICovCisgICAgICAgIHdlYlZpZXcuc2V0VG91Y2hJbnRlcnZhbCgtMSk7CisKKyAgICAgICAgd2ViVmlldy5jbGVhckNhY2hlKHRydWUpOworICAgICAgICB3ZWJWaWV3LnNldERlZmVyTXVsdGlUb3VjaCh0cnVlKTsKKworICAgICAgICBXZWJTZXR0aW5ncyB3ZWJWaWV3U2V0dGluZ3MgPSB3ZWJWaWV3LmdldFNldHRpbmdzKCk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRBcHBDYWNoZUVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRBcHBDYWNoZVBhdGgoZ2V0QXBwbGljYXRpb25Db250ZXh0KCkuZ2V0Q2FjaGVEaXIoKS5nZXRQYXRoKCkpOworICAgICAgICAvLyBVc2Ugb2YgbGFyZ2VyIHZhbHVlcyBjYXVzZXMgdW5leHBsYWluZWQgQXBwQ2FjaGUgZGF0YWJhc2UgY29ycnVwdGlvbi4KKyAgICAgICAgLy8gVE9ETzogSW52ZXN0aWdhdGUgd2hhdCdzIHJlYWxseSBnb2luZyBvbiBoZXJlLgorICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0QXBwQ2FjaGVNYXhTaXplKDEwMCAqIDEwMjQgKiAxMDI0KTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldEphdmFTY3JpcHRFbmFibGVkKHRydWUpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0SmF2YVNjcmlwdENhbk9wZW5XaW5kb3dzQXV0b21hdGljYWxseSh0cnVlKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldFN1cHBvcnRNdWx0aXBsZVdpbmRvd3ModHJ1ZSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRMYXlvdXRBbGdvcml0aG0oV2ViU2V0dGluZ3MuTGF5b3V0QWxnb3JpdGhtLk5PUk1BTCk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXREYXRhYmFzZUVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXREYXRhYmFzZVBhdGgoZ2V0RGlyKCJkYXRhYmFzZXMiLCAwKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXREb21TdG9yYWdlRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldFdvcmtlcnNFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldFhTU0F1ZGl0b3JFbmFibGVkKGZhbHNlKTsKKworICAgICAgICAvLyBUaGlzIGlzIGFzeW5jaHJvbm91cywgYnV0IGl0IGdldHMgcHJvY2Vzc2VkIGJ5IFdlYkNvcmUgYmVmb3JlIGl0IHN0YXJ0cyBsb2FkaW5nIHBhZ2VzLgorICAgICAgICBtQ3VycmVudFdlYlZpZXcudXNlTW9ja0RldmljZU9yaWVudGF0aW9uKCk7CisKKyAgICAgICAgLy8gTXVzdCBkbyB0aGlzIGFmdGVyIHNldHRpbmcgdGhlIEFwcENhY2hlIHBhdGguCisgICAgICAgIFdlYlN0b3JhZ2UuZ2V0SW5zdGFuY2UoKS5kZWxldGVBbGxEYXRhKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0VGVzdHMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXNzYWdlIHNlcnZpY2VNc2cgPQorICAgICAgICAgICAgICAgICAgICBNZXNzYWdlLm9idGFpbihudWxsLCBNYW5hZ2VyU2VydmljZS5NU0dfRklSU1RfVEVTVCk7CisKKyAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBpZiAoIW1UZXN0c0xpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZygiZmlyc3RUZXN0IiwgbVRlc3RzTGlzdC5nZXQoMCkpOworICAgICAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoImluZGV4IiwgbUN1cnJlbnRUZXN0SW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXJ2aWNlTXNnLnNldERhdGEoYnVuZGxlKTsKKyAgICAgICAgICAgIG1NYW5hZ2VyU2VydmljZU1lc3Nlbmdlci5zZW5kKHNlcnZpY2VNc2cpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIm1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aD0iICsgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJ1bk5leHRUZXN0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1bk5leHRUZXN0KCkgeworICAgICAgICBhc3NlcnQgbUN1cnJlbnRTdGF0ZSA9PSBDdXJyZW50U3RhdGUuSURMRSA6ICJtQ3VycmVudFN0YXRlID0gIiArIG1DdXJyZW50U3RhdGUubmFtZSgpOworCisgICAgICAgIGlmIChtVGVzdHNMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgb25BbGxUZXN0c0ZpbmlzaGVkKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggPSBtVGVzdHNMaXN0LnJlbW92ZSgwKTsKKworICAgICAgICBMb2cuaShMT0dfVEFHLCAicnVuTmV4dFRlc3QoKTogU3RhcnQ6ICIgKyBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKworICAgICAgICAgICAgICAgICIgKCIgKyBtQ3VycmVudFRlc3RJbmRleCArICIpIik7CisKKyAgICAgICAgbUN1cnJlbnRUZXN0VXJpID0gRmlsZUZpbHRlci5nZXRVcmwobUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoKS50b1N0cmluZygpOworCisgICAgICAgIHJlc2V0KCk7CisKKyAgICAgICAgLyoqIFN0YXJ0IHRpbWUtb3V0IGNvdW50ZG93biBhbmQgdGhlIHRlc3QgKi8KKyAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IEN1cnJlbnRTdGF0ZS5SRU5ERVJJTkdfUEFHRTsKKyAgICAgICAgbVJlc3VsdEhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoTVNHX1RFU1RfVElNRURfT1VULCBERUZBVUxUX1RJTUVfT1VUX01TKTsKKyAgICAgICAgbUN1cnJlbnRXZWJWaWV3LmxvYWRVcmwobUN1cnJlbnRUZXN0VXJpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25UZXN0VGltZWRPdXQoKSB7CisgICAgICAgIGFzc2VydCBtQ3VycmVudFN0YXRlLmlzUnVubmluZ1N0YXRlKCkgOiAibUN1cnJlbnRTdGF0ZSA9ICIgKyBtQ3VycmVudFN0YXRlLm5hbWUoKTsKKworICAgICAgICBMb2cudyhMT0dfVEFHLCAib25UZXN0VGltZWRPdXQoKTogIiArIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCk7CisgICAgICAgIG1DdXJyZW50VGVzdFRpbWVkT3V0ID0gdHJ1ZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogV2hpbGUgaXQgaXMgdGhlb3JldGljYWxseSBwb3NzaWJsZSB0aGF0IHRoZSB0ZXN0IHRpbWVzIG91dCBiZWNhdXNlCisgICAgICAgICAqIG9mIHdlYnZpZXcgYmVjb21pbmcgdW5yZXNwb25zaXZlLCBpdCBpcyB2ZXJ5IHVubGlrZWx5LiBUaGVyZWZvcmUgaXQncworICAgICAgICAgKiBhc3N1bWVkIHRoYXQgb2J0YWluaW5nIHJlc3VsdHMgKHRoYXQgY2FsbHMgdmFyaW91cyB3ZWJ2aWV3IG1ldGhvZHMpCisgICAgICAgICAqIHdpbGwgbm90IGl0c2VsZiBoYW5nLgorICAgICAgICAgKi8KKyAgICAgICAgb2J0YWluQWN0dWFsUmVzdWx0c0Zyb21XZWJWaWV3KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uVGVzdEZpbmlzaGVkKCkgeworICAgICAgICBhc3NlcnQgbUN1cnJlbnRTdGF0ZS5pc1J1bm5pbmdTdGF0ZSgpIDogIm1DdXJyZW50U3RhdGUgPSAiICsgbUN1cnJlbnRTdGF0ZS5uYW1lKCk7CisKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgIm9uVGVzdEZpbmlzaGVkKCk6ICIgKyBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGgpOworICAgICAgICBtUmVzdWx0SGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfVEVTVF9USU1FRF9PVVQpOworICAgICAgICBvYnRhaW5BY3R1YWxSZXN1bHRzRnJvbVdlYlZpZXcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb2J0YWluQWN0dWFsUmVzdWx0c0Zyb21XZWJWaWV3KCkgeworICAgICAgICAvKioKKyAgICAgICAgICogSWYgdGhlIHJlc3VsdCBoYXMgbm90IGJlZW4gc2V0IGJ5IHRoZSB0aW1lIHRoZSB0ZXN0IGZpbmlzaGVzIHdlIGNyZWF0ZQorICAgICAgICAgKiBhIGRlZmF1bHQgdHlwZSBvZiByZXN1bHQuCisgICAgICAgICAqLworICAgICAgICBpZiAobUN1cnJlbnRSZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgLyoqIFRPRE86IERlZmF1bHQgdHlwZSBzaG91bGQgYmUgUmVuZGVyVHJlZVJlc3VsdC4gV2UgZG9uJ3Qgc3VwcG9ydCBpdCBub3cuICovCisgICAgICAgICAgICBtQ3VycmVudFJlc3VsdCA9IG5ldyBUZXh0UmVzdWx0KG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBtQ3VycmVudFN0YXRlID0gQ3VycmVudFN0YXRlLk9CVEFJTklOR19SRVNVTFQ7CisKKyAgICAgICAgaWYgKG1DdXJyZW50VGVzdFRpbWVkT3V0KSB7CisgICAgICAgICAgICBtQ3VycmVudFJlc3VsdC5zZXREaWRUaW1lT3V0KCk7CisgICAgICAgIH0KKyAgICAgICAgbUN1cnJlbnRSZXN1bHQub2J0YWluQWN0dWFsUmVzdWx0cyhtQ3VycmVudFdlYlZpZXcsCisgICAgICAgICAgICAgICAgbVJlc3VsdEhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQUNUVUFMX1JFU1VMVF9PQlRBSU5FRCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkFjdHVhbFJlc3VsdHNPYnRhaW5lZCgpIHsKKyAgICAgICAgYXNzZXJ0IG1DdXJyZW50U3RhdGUgPT0gQ3VycmVudFN0YXRlLk9CVEFJTklOR19SRVNVTFQKKyAgICAgICAgICAgICAgICA6ICJtQ3VycmVudFN0YXRlID0gIiArIG1DdXJyZW50U3RhdGUubmFtZSgpOworCisgICAgICAgIExvZy5pKExPR19UQUcsICJvbkFjdHVhbFJlc3VsdHNPYnRhaW5lZCgpOiAiICsgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoKTsKKyAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IEN1cnJlbnRTdGF0ZS5JRExFOworCisgICAgICAgIHJlcG9ydFJlc3VsdFRvU2VydmljZSgpOworICAgICAgICBtQ3VycmVudFRlc3RJbmRleCsrOworICAgICAgICB1cGRhdGVQcm9ncmVzc0JhcigpOworICAgICAgICBydW5OZXh0VGVzdCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXBvcnRSZXN1bHRUb1NlcnZpY2UoKSB7CisgICAgICAgIGlmIChtQ3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DdXJyZW50UmVzdWx0LnNldEFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nKG1DdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWVzc2FnZSBzZXJ2aWNlTXNnID0KKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obnVsbCwgTWFuYWdlclNlcnZpY2UuTVNHX1BST0NFU1NfQUNUVUFMX1JFU1VMVFMpOworCisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbUN1cnJlbnRSZXN1bHQuZ2V0QnVuZGxlKCk7CisgICAgICAgICAgICBidW5kbGUucHV0SW50KCJ0ZXN0SW5kZXgiLCBtQ3VycmVudFRlc3RJbmRleCk7CisgICAgICAgICAgICBpZiAoIW1UZXN0c0xpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZygibmV4dFRlc3QiLCBtVGVzdHNMaXN0LmdldCgwKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlcnZpY2VNc2cuc2V0RGF0YShidW5kbGUpOworICAgICAgICAgICAgbU1hbmFnZXJTZXJ2aWNlTWVzc2VuZ2VyLnNlbmQoc2VydmljZU1zZyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAibUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoPSIgKyBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGgsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVByb2dyZXNzQmFyKCkgeworICAgICAgICBnZXRXaW5kb3coKS5zZXRGZWF0dXJlSW50KFdpbmRvdy5GRUFUVVJFX1BST0dSRVNTLAorICAgICAgICAgICAgICAgIG1DdXJyZW50VGVzdEluZGV4ICogV2luZG93LlBST0dSRVNTX0VORCAvIG1Ub3RhbFRlc3RDb3VudCk7CisgICAgICAgIHNldFRpdGxlKG1DdXJyZW50VGVzdEluZGV4ICogMTAwIC8gbVRvdGFsVGVzdENvdW50ICsgIiUgIiArCisgICAgICAgICAgICAgICAgIigiICsgbUN1cnJlbnRUZXN0SW5kZXggKyAiLyIgKyBtVG90YWxUZXN0Q291bnQgKyAiKSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkFsbFRlc3RzRmluaXNoZWQoKSB7CisgICAgICAgIG1TY3JlZW5EaW1Mb2NrLnJlbGVhc2UoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWVzc2FnZSBzZXJ2aWNlTXNnID0KKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obnVsbCwgTWFuYWdlclNlcnZpY2UuTVNHX0FMTF9URVNUU19GSU5JU0hFRCk7CisgICAgICAgICAgICBtTWFuYWdlclNlcnZpY2VNZXNzZW5nZXIuc2VuZChzZXJ2aWNlTXNnKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGg9IiArIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCwgZSk7CisgICAgICAgIH0KKworICAgICAgICB1bmJpbmRTZXJ2aWNlKG1TZXJ2aWNlQ29ubmVjdGlvbik7CisgICAgfQorCisgICAgcHJpdmF0ZSBBZGRpdGlvbmFsVGV4dE91dHB1dCBnZXRDdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQoKSB7CisgICAgICAgIGlmIChtQ3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0ID09IG51bGwpIHsKKyAgICAgICAgICAgIG1DdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQgPSBuZXcgQWRkaXRpb25hbFRleHRPdXRwdXQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dDsKKyAgICB9CisKKyAgICAvKiogTEFZT1VUIFRFU1QgQ09OVFJPTExFUiAqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19XQUlUX1VOVElMX0RPTkUgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfTk9USUZZX0RPTkUgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRFVNUF9BU19URVhUID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RVTVBfQ0hJTERfRlJBTUVTX0FTX1RFWFQgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0VUX0NBTl9PUEVOX1dJTkRPV1MgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRFVNUF9EQVRBQkFTRV9DQUxMQkFDS1MgPSA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0VUX0dFT0xPQ0FUSU9OX1BFUk1JU1NJT04gPSA2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfT1ZFUlJJREVfUFJFRkVSRU5DRSA9IDc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TRVRfWFNTX0FVRElUT1JfRU5BQkxFRCA9IDg7CisKKyAgICAvKiogU3RyaW5nIGNvbnN0YW50cyBmb3IgdXNlIHdpdGggbGF5b3V0VGVzdENvbnRyb2xsZXIub3ZlcnJpZGVQcmVmZXJlbmNlKCkgKi8KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBXRUJLSVRfT0ZGTElORV9XRUJfQVBQTElDQVRJT05fQ0FDSEVfRU5BQkxFRCA9CisgICAgICAgICAgICAiV2ViS2l0T2ZmbGluZVdlYkFwcGxpY2F0aW9uQ2FjaGVFbmFibGVkIjsKKworICAgIEhhbmRsZXIgbUxheW91dFRlc3RDb250cm9sbGVySGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgYXNzZXJ0IG1DdXJyZW50U3RhdGUuaXNSdW5uaW5nU3RhdGUoKSA6ICJtQ3VycmVudFN0YXRlID0gIiArIG1DdXJyZW50U3RhdGUubmFtZSgpOworCisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfRFVNUF9BU19URVhUOgorICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRSZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRSZXN1bHQgPSBuZXcgVGV4dFJlc3VsdChtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBtQ3VycmVudFJlc3VsdCBpbnN0YW5jZW9mIFRleHRSZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJtQ3VycmVudFJlc3VsdCBpbnN0YW5jZW9mIiArIG1DdXJyZW50UmVzdWx0LmdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RVTVBfQ0hJTERfRlJBTUVTX0FTX1RFWFQ6CisgICAgICAgICAgICAgICAgICAgIC8qKiBJZiBkdW1wQXNUZXh0IHdhcyBub3QgY2FsbGVkIHdlIGFzc3VtZSB0aGF0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRleHQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50UmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UmVzdWx0ID0gbmV3IFRleHRSZXN1bHQobUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBtQ3VycmVudFJlc3VsdCBpbnN0YW5jZW9mIFRleHRSZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJtQ3VycmVudFJlc3VsdCBpbnN0YW5jZW9mIiArIG1DdXJyZW50UmVzdWx0LmdldENsYXNzKCkuZ2V0TmFtZSgpOworCisgICAgICAgICAgICAgICAgICAgICgoVGV4dFJlc3VsdCltQ3VycmVudFJlc3VsdCkuc2V0RHVtcENoaWxkRnJhbWVzQXNUZXh0KHRydWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RVTVBfREFUQUJBU0VfQ0FMTEJBQ0tTOgorICAgICAgICAgICAgICAgICAgICBtRHVtcERhdGFiYXNlQ2FsbGJhY2tzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19OT1RJRllfRE9ORToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgPT0gQ3VycmVudFN0YXRlLldBSVRJTkdfRk9SX0FTWU5DSFJPTk9VU19URVNUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvblRlc3RGaW5pc2hlZCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfT1ZFUlJJREVfUFJFRkVSRU5DRToKKyAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAqIFRPRE86IFdlIHNob3VsZCBsb29rIHVwIHRoZSBjb3JyZWN0IFdlYlZpZXcgZm9yIHRoZSBmcmFtZSB3aGljaAorICAgICAgICAgICAgICAgICAgICAgKiBjYWxsZWQgdGhlIGxheW91dFRlc3RDb250cm9sbGVyIG1ldGhvZC4gQ3VycmVudGx5LCB3ZSBqdXN0IHVzZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICogV2ViVmlldyBmb3IgdGhlIG1haW4gZnJhbWUuIEV2ZW50U2VuZGVyIHN1ZmZlcnMgZnJvbSB0aGUgc2FtZQorICAgICAgICAgICAgICAgICAgICAgKiBwcm9ibGVtLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJrZXkiKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCS0lUX09GRkxJTkVfV0VCX0FQUExJQ0FUSU9OX0NBQ0hFX0VOQUJMRUQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5zZXRBcHBDYWNoZUVuYWJsZWQobXNnLmdldERhdGEoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiTVNHX09WRVJSSURFX1BSRUZFUkVOQ0U6IHVuc3VwcG9ydGVkIHByZWZlcmVuY2UhIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TRVRfQ0FOX09QRU5fV0lORE9XUzoKKyAgICAgICAgICAgICAgICAgICAgbUNhbk9wZW5XaW5kb3dzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TRVRfR0VPTE9DQVRJT05fUEVSTUlTU0lPTjoKKyAgICAgICAgICAgICAgICAgICAgbUlzR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbUdlb2xvY2F0aW9uUGVybWlzc2lvbiA9IG1zZy5hcmcxID09IDE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPEdlb2xvY2F0aW9uUGVybWlzc2lvbnMuQ2FsbGJhY2s+IGl0ZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VvbG9jYXRpb25QZXJtaXNzaW9ucy5DYWxsYmFjayBjYWxsYmFjayA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcmlnaW4gPSBtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcy5nZXQoY2FsbGJhY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmludm9rZShvcmlnaW4sIG1HZW9sb2NhdGlvblBlcm1pc3Npb24sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1NFVF9YU1NfQVVESVRPUl9FTkFCTEVEOgorICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5zZXRYU1NBdWRpdG9yRW5hYmxlZChtc2cuYXJnMSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19XQUlUX1VOVElMX0RPTkU6CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBDdXJyZW50U3RhdGUuV0FJVElOR19GT1JfQVNZTkNIUk9OT1VTX1RFU1Q7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogIm1zZy53aGF0PSIgKyBtc2cud2hhdDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0TGF5b3V0VGVzdENvbnRyb2xsZXIoKSB7CisgICAgICAgIG1DYW5PcGVuV2luZG93cyA9IGZhbHNlOworICAgICAgICBtRHVtcERhdGFiYXNlQ2FsbGJhY2tzID0gZmFsc2U7CisgICAgICAgIG1Jc0dlb2xvY2F0aW9uUGVybWlzc2lvblNldCA9IGZhbHNlOworICAgICAgICBtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcyA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dChib29sZWFuIGVuYWJsZVBpeGVsVGVzdCkgeworICAgICAgICBMb2cuaShMT0dfVEFHLCBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKyAiOiBkdW1wQXNUZXh0KCIgKyBlbmFibGVQaXhlbFRlc3QgKyAiKSBjYWxsZWQiKTsKKyAgICAgICAgLyoqIFRPRE86IEltcGxlbWVudCAqLworICAgICAgICBpZiAoZW5hYmxlUGl4ZWxUZXN0KSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiZW5hYmxlUGl4ZWxUZXN0IG5vdCBpbXBsZW1lbnRlZCwgc3dpdGNoaW5nIHRvIGZhbHNlIik7CisgICAgICAgIH0KKyAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19EVU1QX0FTX1RFWFQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoICsgIjogZHVtcENoaWxkRnJhbWVzQXNUZXh0KCkgY2FsbGVkIik7CisgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfRFVNUF9DSElMRF9GUkFNRVNfQVNfVEVYVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcERhdGFiYXNlQ2FsbGJhY2tzKCkgeworICAgICAgICBMb2cuaShMT0dfVEFHLCBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKyAiOiBkdW1wRGF0YWJhc2VDYWxsYmFja3MoKSBjYWxsZWQiKTsKKyAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19EVU1QX0RBVEFCQVNFX0NBTExCQUNLUyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RG9uZSgpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoICsgIjogbm90aWZ5RG9uZSgpIGNhbGxlZCIpOworICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX05PVElGWV9ET05FKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvdmVycmlkZVByZWZlcmVuY2UoU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICBMb2cuaShMT0dfVEFHLCBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKyAiOiBvdmVycmlkZVByZWZlcmVuY2UoIiArIGtleSArICIsICIgKyB2YWx1ZSArCisgICAgICAgICIpIGNhbGxlZCIpOworICAgICAgICBNZXNzYWdlIG1zZyA9IG1MYXlvdXRUZXN0Q29udHJvbGxlckhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfT1ZFUlJJREVfUFJFRkVSRU5DRSk7CisgICAgICAgIG1zZy5nZXREYXRhKCkucHV0U3RyaW5nKCJrZXkiLCBrZXkpOworICAgICAgICBtc2cuZ2V0RGF0YSgpLnB1dEJvb2xlYW4oInZhbHVlIiwgdmFsdWUpOworICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2FuT3BlbldpbmRvd3MoKSB7CisgICAgICAgIExvZy5pKExPR19UQUcsIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCArICI6IHNldENhbk9wZW5XaW5kb3dzKCkgY2FsbGVkIik7CisgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfU0VUX0NBTl9PUEVOX1dJTkRPV1MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdlb2xvY2F0aW9uUGVybWlzc2lvbihib29sZWFuIGFsbG93KSB7CisgICAgICAgIExvZy5pKExPR19UQUcsIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCArICI6IHNldEdlb2xvY2F0aW9uUGVybWlzc2lvbigiICsgYWxsb3cgKworICAgICAgICAgICAgICAgICIpIGNhbGxlZCIpOworICAgICAgICBNZXNzYWdlIG1zZyA9IG1MYXlvdXRUZXN0Q29udHJvbGxlckhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfU0VUX0dFT0xPQ0FUSU9OX1BFUk1JU1NJT04pOworICAgICAgICBtc2cuYXJnMSA9IGFsbG93ID8gMSA6IDA7CisgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrRGV2aWNlT3JpZW50YXRpb24oYm9vbGVhbiBjYW5Qcm92aWRlQWxwaGEsIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsIGRvdWJsZSBiZXRhLCBib29sZWFuIGNhblByb3ZpZGVHYW1tYSwgZG91YmxlIGdhbW1hKSB7CisgICAgICAgIExvZy5pKExPR19UQUcsIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCArICI6IHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbigiICsgY2FuUHJvdmlkZUFscGhhICsKKyAgICAgICAgICAgICAgICAiLCAiICsgYWxwaGEgKyAiLCAiICsgY2FuUHJvdmlkZUJldGEgKyAiLCAiICsgYmV0YSArICIsICIgKyBjYW5Qcm92aWRlR2FtbWEgKworICAgICAgICAgICAgICAgICIsICIgKyBnYW1tYSArICIpIik7CisgICAgICAgIG1DdXJyZW50V2ViVmlldy5zZXRNb2NrRGV2aWNlT3JpZW50YXRpb24oY2FuUHJvdmlkZUFscGhhLCBhbHBoYSwgY2FuUHJvdmlkZUJldGEsIGJldGEsCisgICAgICAgICAgICAgICAgY2FuUHJvdmlkZUdhbW1hLCBnYW1tYSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0WFNTQXVkaXRvckVuYWJsZWQoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIExvZy5pKExPR19UQUcsIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCArICI6IHNldFhTU0F1ZGl0b3JFbmFibGVkKCIgKyBmbGFnICsgIikgY2FsbGVkIik7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gbUxheW91dFRlc3RDb250cm9sbGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19TRVRfWFNTX0FVRElUT1JfRU5BQkxFRCk7CisgICAgICAgIG1zZy5hcmcxID0gZmxhZyA/IDEgOiAwOworICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd2FpdFVudGlsRG9uZSgpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoICsgIjogd2FpdFVudGlsRG9uZSgpIGNhbGxlZCIpOworICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1dBSVRfVU5USUxfRE9ORSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTWFuYWdlclNlcnZpY2UuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL01hbmFnZXJTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQyZGM4NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL01hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2VuZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBIHNlcnZpY2UgdGhhdCBoYW5kbGVzIG1hbmFnaW5nIHRoZSByZXN1bHRzIG9mIHRlc3RzLCBpbmZvcm1pbmcgb2YgY3Jhc2hlcywgZ2VuZXJhdGluZworICogc3VtbWFyaWVzLCBldGMuCisgKi8KK3B1YmxpYyBjbGFzcyBNYW5hZ2VyU2VydmljZSBleHRlbmRzIFNlcnZpY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiTWFuYWdlclNlcnZpY2UiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19DUkFTSF9USU1FT1VUX0VYUElSRUQgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU1VNTUFSSVpFUl9ET05FID0gMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDUkFTSF9USU1FT1VUX01TID0gMjAgKiAxMDAwOworCisgICAgLyoqIFRPRE86IG1ha2UgaXQgYSBzZXR0aW5nICovCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRTX1JPT1RfRElSX1BBVEggPQorICAgICAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkgKyBGaWxlLnNlcGFyYXRvciArICJsYXlvdXQtdGVzdC1yZXN1bHRzIjsKKworICAgIC8qKiBUT0RPOiBNYWtlIGl0IGEgc2V0dGluZyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBFWFBFQ1RFRF9SRVNVTFRfTE9DQVRJT05fUkVMQVRJVkVfRElSX1BSRUZJWEVTID0KKyAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigzKTsKKyAgICB7CisgICAgICAgIEVYUEVDVEVEX1JFU1VMVF9MT0NBVElPTl9SRUxBVElWRV9ESVJfUFJFRklYRVMuYWRkKCJwbGF0Zm9ybSIgKyBGaWxlLnNlcGFyYXRvciArCisgICAgICAgICAgICAgICAgImFuZHJvaWQtdjgiICsgRmlsZS5zZXBhcmF0b3IpOworICAgICAgICBFWFBFQ1RFRF9SRVNVTFRfTE9DQVRJT05fUkVMQVRJVkVfRElSX1BSRUZJWEVTLmFkZCgicGxhdGZvcm0iICsgRmlsZS5zZXBhcmF0b3IgKworICAgICAgICAgICAgICAgICJhbmRyb2lkIiArIEZpbGUuc2VwYXJhdG9yKTsKKyAgICAgICAgRVhQRUNURURfUkVTVUxUX0xPQ0FUSU9OX1JFTEFUSVZFX0RJUl9QUkVGSVhFUy5hZGQoIiIpOworICAgIH0KKworICAgIC8qKiBUT0RPOiBNYWtlIHRoZXNlIHNldHRpbmdzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUkVTVUxUX0VYVEVOU0lPTiA9ICJ0eHQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9SRVNVTFRfRVhURU5TSU9OID0gInBuZyI7CisKKyAgICBzdGF0aWMgZmluYWwgaW50IE1TR19QUk9DRVNTX0FDVFVBTF9SRVNVTFRTID0gMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IE1TR19BTExfVEVTVFNfRklOSVNIRUQgPSAxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0ZJUlNUX1RFU1QgPSAyOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NVUlJFTlRfVEVTVF9DUkFTSEVEID0gMzsKKworICAgIC8qKgorICAgICAqIFRoaXMgaGFuZGxlciBpcyBwdXJlbHkgZm9yIElQQy4gSXQgaXMgdXNlZCB0byBjcmVhdGUgbU1lc3NlbmdlcgorICAgICAqIHRoYXQgZ2VuZXJhdGVzIGEgYmluZGVyIHJldHVybmVkIGluIG9uQmluZCBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSBIYW5kbGVyIG1JbmNvbWluZ0hhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19GSVJTVF9URVNUOgorICAgICAgICAgICAgICAgICAgICBtU3VtbWFyaXplci5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbXNnLmdldERhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgZW5zdXJlTmV4dFRlc3RTZXR1cChidW5kbGUuZ2V0U3RyaW5nKCJmaXJzdFRlc3QiKSwgYnVuZGxlLmdldEludCgiaW5kZXgiKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUFJPQ0VTU19BQ1RVQUxfUkVTVUxUUzoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywibUluY29taW5nSGFuZGxlcjogIiArIG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJyZWxhdGl2ZVBhdGgiKSk7CisgICAgICAgICAgICAgICAgICAgIG9uQWN0dWFsUmVzdWx0c09idGFpbmVkKG1zZy5nZXREYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0NVUlJFTlRfVEVTVF9DUkFTSEVEOgorICAgICAgICAgICAgICAgICAgICBtSW50ZXJuYWxNZXNzYWdlc0hhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0NSQVNIX1RJTUVPVVRfRVhQSVJFRCk7CisgICAgICAgICAgICAgICAgICAgIG9uVGVzdENyYXNoZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19BTExfVEVTVFNfRklOSVNIRUQ6CisgICAgICAgICAgICAgICAgICAgIC8qKiBXZSBydW4gaXQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQgdG8gYXZvaWQgQU5SICovCisgICAgICAgICAgICAgICAgICAgIG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VtbWFyaXplci5zZXRUZXN0c1JlbGF0aXZlUGF0aChtQWxsVGVzdHNSZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4obUludGVybmFsTWVzc2FnZXNIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNHX1NVTU1BUklaRVJfRE9ORSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1bW1hcml6ZXIuc3VtbWFyaXplKG1zZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0uc3RhcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIE1lc3NlbmdlciBtTWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihtSW5jb21pbmdIYW5kbGVyKTsKKworICAgIHByaXZhdGUgSGFuZGxlciBtSW50ZXJuYWxNZXNzYWdlc0hhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19DUkFTSF9USU1FT1VUX0VYUElSRUQ6CisgICAgICAgICAgICAgICAgICAgIG9uVGVzdENyYXNoZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TVU1NQVJJWkVSX0RPTkU6CisgICAgICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1hbmFnZXJTZXJ2aWNlLnRoaXMsIFRlc3RzTGlzdEFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LnNldEFjdGlvbihJbnRlbnQuQUNUSU9OX1NIVVRET1dOKTsKKyAgICAgICAgICAgICAgICAgICAgLyoqIFRoaXMgZmxhZyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBzZW5kIHRoZSBpbnRlbnQgZnJvbSB0aGUgc2VydmljZSAqLworICAgICAgICAgICAgICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgRmlsZUZpbHRlciBtRmlsZUZpbHRlcjsKKyAgICBwcml2YXRlIFN1bW1hcml6ZXIgbVN1bW1hcml6ZXI7CisKKyAgICBwcml2YXRlIFN0cmluZyBtQ3VycmVudGx5UnVubmluZ1Rlc3Q7CisgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRseVJ1bm5pbmdUZXN0SW5kZXg7CisKKyAgICAvKioKKyAgICAgKiBUaGVzZSBhcmUgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBnZXRFeHBlY3RlZFJlc3VsdFBhdGgoKSB1c2VkIHRvIHJlZHVjZSB0aGUgbnVtYmVyCisgICAgICogb2YgcmVxdWVzdHMgcmVxdWlyZWQgdG8gdGhlIGhvc3Qgc2VydmVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1MYXN0RXhwZWN0ZWRSZXN1bHRQYXRoUmVxdWVzdGVkOworICAgIHByaXZhdGUgU3RyaW5nIG1MYXN0RXhwZWN0ZWRSZXN1bHRQYXRoRmV0Y2hlZDsKKworICAgIHByaXZhdGUgU3RyaW5nIG1BbGxUZXN0c1JlbGF0aXZlUGF0aDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZSgpOworCisgICAgICAgIG1GaWxlRmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIoKTsKKyAgICAgICAgbVN1bW1hcml6ZXIgPSBuZXcgU3VtbWFyaXplcihtRmlsZUZpbHRlciwgUkVTVUxUU19ST09UX0RJUl9QQVRILCBnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBvblN0YXJ0Q29tbWFuZChJbnRlbnQgaW50ZW50LCBpbnQgZmxhZ3MsIGludCBzdGFydElkKSB7CisgICAgICAgIG1BbGxUZXN0c1JlbGF0aXZlUGF0aCA9IGludGVudC5nZXRTdHJpbmdFeHRyYSgicGF0aCIpOworICAgICAgICBhc3NlcnQgbUFsbFRlc3RzUmVsYXRpdmVQYXRoICE9IG51bGw7CisgICAgICAgIHJldHVybiBTVEFSVF9TVElDS1k7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgcmV0dXJuIG1NZXNzZW5nZXIuZ2V0QmluZGVyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uQWN0dWFsUmVzdWx0c09idGFpbmVkKEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgbUludGVybmFsTWVzc2FnZXNIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19DUkFTSF9USU1FT1VUX0VYUElSRUQpOworICAgICAgICBlbnN1cmVOZXh0VGVzdFNldHVwKGJ1bmRsZS5nZXRTdHJpbmcoIm5leHRUZXN0IiksIGJ1bmRsZS5nZXRJbnQoInRlc3RJbmRleCIpICsgMSk7CisKKyAgICAgICAgQWJzdHJhY3RSZXN1bHQgcmVzdWx0cyA9CisgICAgICAgICAgICAgICAgQWJzdHJhY3RSZXN1bHQuVGVzdFR5cGUudmFsdWVPZihidW5kbGUuZ2V0U3RyaW5nKCJ0eXBlIikpLmNyZWF0ZVJlc3VsdChidW5kbGUpOworCisgICAgICAgIExvZy5pKExPR19UQUcsICJvbkFjdHVhbFJlc3VsdE9idGFpbmVkOiAiICsgcmVzdWx0cy5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgIGhhbmRsZVJlc3VsdHMocmVzdWx0cyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZU5leHRUZXN0U2V0dXAoU3RyaW5nIG5leHRUZXN0LCBpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKG5leHRUZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJlbnN1cmVOZXh0VGVzdFNldHVwKCk6IG5leHRUZXN0PW51bGwiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1DdXJyZW50bHlSdW5uaW5nVGVzdCA9IG5leHRUZXN0OworICAgICAgICBtQ3VycmVudGx5UnVubmluZ1Rlc3RJbmRleCA9IGluZGV4OworICAgICAgICBtSW50ZXJuYWxNZXNzYWdlc0hhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoTVNHX0NSQVNIX1RJTUVPVVRfRVhQSVJFRCwgQ1JBU0hfVElNRU9VVF9NUyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBzZW5kcyBhbiBpbnRlbnQgdG8gVGVzdHNMaXN0QWN0aXZpdHkgdG8gcmVzdGFydCBMYXlvdXRUZXN0c0V4ZWN1dG9yLgorICAgICAqIFRoZSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBmbG93IGlzIGluIHRoZSBjb21tZW50IG9mIG9uTmV3SW50ZW50CisgICAgICogbWV0aG9kIGluIFRlc3RzTGlzdEFjdGl2aXR5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBvblRlc3RDcmFzaGVkKCkgeworICAgICAgICBoYW5kbGVSZXN1bHRzKG5ldyBDcmFzaGVkRHVtbXlSZXN1bHQobUN1cnJlbnRseVJ1bm5pbmdUZXN0KSk7CisKKyAgICAgICAgTG9nLncoTE9HX1RBRywgIm9uVGVzdENyYXNoZWQoKTogIiArIG1DdXJyZW50bHlSdW5uaW5nVGVzdCArCisgICAgICAgICAgICAgICAgIiAoIiArIG1DdXJyZW50bHlSdW5uaW5nVGVzdEluZGV4ICsgIikiKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBUZXN0c0xpc3RBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgIGludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9SRUJPT1QpOworICAgICAgICAvKiogVGhpcyBmbGFnIGlzIG5lZWRlZCBiZWNhdXNlIHdlIHNlbmQgdGhlIGludGVudCBmcm9tIHRoZSBzZXJ2aWNlICovCisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYSgiY3Jhc2hlZFRlc3RJbmRleCIsIG1DdXJyZW50bHlSdW5uaW5nVGVzdEluZGV4KTsKKyAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVSZXN1bHRzKEFic3RyYWN0UmVzdWx0IHJlc3VsdHMpIHsKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9IHJlc3VsdHMuZ2V0UmVsYXRpdmVQYXRoKCk7CisgICAgICAgIHJlc3VsdHMuc2V0RXhwZWN0ZWRUZXh0UmVzdWx0KGdldEV4cGVjdGVkVGV4dFJlc3VsdChyZWxhdGl2ZVBhdGgpKTsKKyAgICAgICAgcmVzdWx0cy5zZXRFeHBlY3RlZFRleHRSZXN1bHRQYXRoKGdldEV4cGVjdGVkVGV4dFJlc3VsdFBhdGgocmVsYXRpdmVQYXRoKSk7CisgICAgICAgIHJlc3VsdHMuc2V0RXhwZWN0ZWRJbWFnZVJlc3VsdChnZXRFeHBlY3RlZEltYWdlUmVzdWx0KHJlbGF0aXZlUGF0aCkpOworICAgICAgICByZXN1bHRzLnNldEV4cGVjdGVkSW1hZ2VSZXN1bHRQYXRoKGdldEV4cGVjdGVkSW1hZ2VSZXN1bHRQYXRoKHJlbGF0aXZlUGF0aCkpOworCisgICAgICAgIGR1bXBBY3R1YWxUZXh0UmVzdWx0KHJlc3VsdHMpOworICAgICAgICBkdW1wQWN0dWFsSW1hZ2VSZXN1bHQocmVzdWx0cyk7CisKKyAgICAgICAgbVN1bW1hcml6ZXIuYXBwZW5kVGVzdChyZXN1bHRzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZHVtcEFjdHVhbFRleHRSZXN1bHQoQWJzdHJhY3RSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgIFN0cmluZyB0ZXN0UGF0aCA9IHJlc3VsdC5nZXRSZWxhdGl2ZVBhdGgoKTsKKyAgICAgICAgU3RyaW5nIGFjdHVhbFRleHRSZXN1bHQgPSByZXN1bHQuZ2V0QWN0dWFsVGV4dFJlc3VsdCgpOworICAgICAgICBpZiAoYWN0dWFsVGV4dFJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmVzdWx0UGF0aCA9IEZpbGVGaWx0ZXIuc2V0UGF0aEVuZGluZyh0ZXN0UGF0aCwgIi1hY3R1YWwuIiArIFRFWFRfUkVTVUxUX0VYVEVOU0lPTik7CisgICAgICAgIEZzVXRpbHMud3JpdGVEYXRhVG9TdG9yYWdlKG5ldyBGaWxlKFJFU1VMVFNfUk9PVF9ESVJfUEFUSCwgcmVzdWx0UGF0aCksCisgICAgICAgICAgICAgICAgYWN0dWFsVGV4dFJlc3VsdC5nZXRCeXRlcygpLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGR1bXBBY3R1YWxJbWFnZVJlc3VsdChBYnN0cmFjdFJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgU3RyaW5nIHRlc3RQYXRoID0gcmVzdWx0LmdldFJlbGF0aXZlUGF0aCgpOworICAgICAgICBieXRlW10gYWN0dWFsSW1hZ2VSZXN1bHQgPSByZXN1bHQuZ2V0QWN0dWFsSW1hZ2VSZXN1bHQoKTsKKyAgICAgICAgaWYgKGFjdHVhbEltYWdlUmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyByZXN1bHRQYXRoID0gRmlsZUZpbHRlci5zZXRQYXRoRW5kaW5nKHRlc3RQYXRoLAorICAgICAgICAgICAgICAgICItYWN0dWFsLiIgKyBJTUFHRV9SRVNVTFRfRVhURU5TSU9OKTsKKyAgICAgICAgRnNVdGlscy53cml0ZURhdGFUb1N0b3JhZ2UobmV3IEZpbGUoUkVTVUxUU19ST09UX0RJUl9QQVRILCByZXN1bHRQYXRoKSwKKyAgICAgICAgICAgICAgICBhY3R1YWxJbWFnZVJlc3VsdCwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwZWN0ZWRUZXh0UmVzdWx0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IGdldEV4cGVjdGVkUmVzdWx0KHJlbGF0aXZlUGF0aCwgVEVYVF9SRVNVTFRfRVhURU5TSU9OKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gZ2V0RXhwZWN0ZWRJbWFnZVJlc3VsdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIHJldHVybiBnZXRFeHBlY3RlZFJlc3VsdChyZWxhdGl2ZVBhdGgsIElNQUdFX1JFU1VMVF9FWFRFTlNJT04pOworICAgIH0KKworICAgIHByaXZhdGUgYnl0ZVtdIGdldEV4cGVjdGVkUmVzdWx0KFN0cmluZyByZWxhdGl2ZVBhdGgsIFN0cmluZyBleHRlbnNpb24pIHsKKyAgICAgICAgU3RyaW5nIG9yaWdpbmFsUmVsYXRpdmVQYXRoID0KKyAgICAgICAgICAgICAgICBGaWxlRmlsdGVyLnNldFBhdGhFbmRpbmcocmVsYXRpdmVQYXRoLCAiLWV4cGVjdGVkLiIgKyBleHRlbnNpb24pOworICAgICAgICBtTGFzdEV4cGVjdGVkUmVzdWx0UGF0aFJlcXVlc3RlZCA9IG9yaWdpbmFsUmVsYXRpdmVQYXRoOworCisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG51bGw7CisgICAgICAgIExpc3Q8U3RyaW5nPiBsb2NhdGlvbnMgPSBFWFBFQ1RFRF9SRVNVTFRfTE9DQVRJT05fUkVMQVRJVkVfRElSX1BSRUZJWEVTOworCisgICAgICAgIGludCBzaXplID0gRVhQRUNURURfUkVTVUxUX0xPQ0FUSU9OX1JFTEFUSVZFX0RJUl9QUkVGSVhFUy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBieXRlcyA9PSBudWxsICYmIGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIHJlbGF0aXZlUGF0aCA9IGxvY2F0aW9ucy5nZXQoaSkgKyBvcmlnaW5hbFJlbGF0aXZlUGF0aDsKKyAgICAgICAgICAgIGJ5dGVzID0gRnNVdGlscy5yZWFkRGF0YUZyb21VcmwoRmlsZUZpbHRlci5nZXRVcmwocmVsYXRpdmVQYXRoKSk7CisgICAgICAgIH0KKworICAgICAgICBtTGFzdEV4cGVjdGVkUmVzdWx0UGF0aEZldGNoZWQgPSBieXRlcyA9PSBudWxsID8gbnVsbCA6IHJlbGF0aXZlUGF0aDsKKyAgICAgICAgcmV0dXJuIGJ5dGVzOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEV4cGVjdGVkVGV4dFJlc3VsdFBhdGgoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICByZXR1cm4gZ2V0RXhwZWN0ZWRSZXN1bHRQYXRoKHJlbGF0aXZlUGF0aCwgVEVYVF9SRVNVTFRfRVhURU5TSU9OKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRFeHBlY3RlZEltYWdlUmVzdWx0UGF0aChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIHJldHVybiBnZXRFeHBlY3RlZFJlc3VsdFBhdGgocmVsYXRpdmVQYXRoLCBJTUFHRV9SRVNVTFRfRVhURU5TSU9OKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRFeHBlY3RlZFJlc3VsdFBhdGgoU3RyaW5nIHJlbGF0aXZlUGF0aCwgU3RyaW5nIGV4dGVuc2lvbikgeworICAgICAgICBTdHJpbmcgb3JpZ2luYWxSZWxhdGl2ZVBhdGggPQorICAgICAgICAgICAgRmlsZUZpbHRlci5zZXRQYXRoRW5kaW5nKHJlbGF0aXZlUGF0aCwgIi1leHBlY3RlZC4iICsgZXh0ZW5zaW9uKTsKKyAgICAgICAgaWYgKCFvcmlnaW5hbFJlbGF0aXZlUGF0aC5lcXVhbHMobUxhc3RFeHBlY3RlZFJlc3VsdFBhdGhSZXF1ZXN0ZWQpKSB7CisgICAgICAgICAgICBnZXRFeHBlY3RlZFJlc3VsdChyZWxhdGl2ZVBhdGgsIGV4dGVuc2lvbik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbUxhc3RFeHBlY3RlZFJlc3VsdFBhdGhGZXRjaGVkOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1N1bW1hcml6ZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1N1bW1hcml6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDAxYTUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvU3VtbWFyaXplci5qYXZhCkBAIC0wLDAgKzEsNTczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuZm9yd2FyZGVyLkZvcndhcmRlck1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworLyoqCisgKiBBIGNsYXNzIHRoYXQgY29sbGVjdHMgaW5mb3JtYXRpb24gYWJvdXQgdGVzdHMgdGhhdCByYW4gYW5kIGNhbiBjcmVhdGUgSFRNTAorICogZmlsZXMgd2l0aCBzdW1tYXJpZXMgYW5kIGVhc3kgbmF2aWdhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIFN1bW1hcml6ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiU3VtbWFyaXplciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTID0KKyAgICAgICAgICAgICI8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+IiArCisgICAgICAgICAgICAiKiB7IiArCisgICAgICAgICAgICAiICAgICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hOyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXI6IDA7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbjogMDsiICsKKyAgICAgICAgICAgICIgICAgICAgcGFkZGluZzogMDt9IiArCisgICAgICAgICAgICAiYm9keSB7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbjogMTBweDt9IiArCisgICAgICAgICAgICAiaDEgeyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LXNpemU6IDI0cHg7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbjogNHB4IDAgNHB4IDA7fSIgKworICAgICAgICAgICAgImgyIHsiICsKKyAgICAgICAgICAgICIgICAgICAgZm9udC1zaXplOjE4cHg7IiArCisgICAgICAgICAgICAiICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbjogMjBweCAwIDNweCAwO30iICsKKyAgICAgICAgICAgICJoMywgaDMgYSB7IiArCisgICAgICAgICAgICAiICAgICAgIGZvbnQtc2l6ZTogMTRweDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6IGJsYWNrOyIgKworICAgICAgICAgICAgIiAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi10b3A6IDRweDsiICsKKyAgICAgICAgICAgICIgICAgICAgbWFyZ2luLWJvdHRvbTogMnB4O30iICsKKyAgICAgICAgICAgICJoMyBhIHNwYW4ucGF0aCB7IiArCisgICAgICAgICAgICAiICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO30iICsKKyAgICAgICAgICAgICJoMyBzcGFuLnRyaSB7IiArCisgICAgICAgICAgICAiICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsiICsKKyAgICAgICAgICAgICIgICAgICAgZmxvYXQ6IGxlZnQ7IiArCisgICAgICAgICAgICAiICAgICAgIHdpZHRoOiAyMHB4O30iICsKKyAgICAgICAgICAgICJoMyBzcGFuLnNxciB7IiArCisgICAgICAgICAgICAiICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsiICsKKyAgICAgICAgICAgICIgICAgICAgZmxvYXQ6IGxlZnQ7IiArCisgICAgICAgICAgICAiICAgICAgIHdpZHRoOiAyMHB4O30iICsKKyAgICAgICAgICAgICJoMyBzcGFuLnNxcl9wYXNzIHsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6ICM4ZWUxMDA7fSIgKworICAgICAgICAgICAgImgzIHNwYW4uc3FyX2ZhaWwgeyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogI2MzMDAwMDt9IiArCisgICAgICAgICAgICAic3Bhbi5zb3VyY2UgeyIgKworICAgICAgICAgICAgIiAgICAgICBkaXNwbGF5OiBibG9jazsiICsKKyAgICAgICAgICAgICIgICAgICAgZm9udC1zaXplOiAxMHB4OyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogIzg4ODsiICsKKyAgICAgICAgICAgICIgICAgICAgbWFyZ2luLWxlZnQ6IDIwcHg7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi1ib3R0b206IDFweDt9IiArCisgICAgICAgICAgICAic3Bhbi5zb3VyY2UgYSB7IiArCisgICAgICAgICAgICAiICAgICAgIGZvbnQtc2l6ZTogMTBweDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6ICM4ODg7fSIgKworICAgICAgICAgICAgImgzIGltZyB7IiArCisgICAgICAgICAgICAiICAgICAgIHdpZHRoOiA4cHg7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi1yaWdodDogNHB4O30iICsKKyAgICAgICAgICAgICJkaXYuZGlmZiB7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi1ib3R0b206IDI1cHg7fSIgKworICAgICAgICAgICAgImRpdi5kaWZmIGEgeyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LXNpemU6IDEycHg7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiAjODg4O30iICsKKyAgICAgICAgICAgICJ0YWJsZS52aXN1YWxfZGlmZiB7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1ib3R0b206IDBweCBzb2xpZDsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsiICsKKyAgICAgICAgICAgICIgICAgICAgd2lkdGg6IDEwMCU7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi1ib3R0b206IDJweDt9IiArCisgICAgICAgICAgICAidGFibGUudmlzdWFsX2RpZmYgdHIuaGVhZGVycyB0ZCB7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZDsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyLXRvcDogMDsiICsKKyAgICAgICAgICAgICIgICAgICAgcGFkZGluZy1ib3R0b206IDNweDt9IiArCisgICAgICAgICAgICAidGFibGUudmlzdWFsX2RpZmYgdHIucmVzdWx0cyB0ZCB7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci10b3A6IDFweCBkYXNoZWQ7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkOyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LXNpemU6IDE1cHg7IiArCisgICAgICAgICAgICAiICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7fSIgKworICAgICAgICAgICAgInRhYmxlLnZpc3VhbF9kaWZmIHRyLnJlc3VsdHMgdGQubGluZV9jb3VudCB7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6I2FhYTsiICsKKyAgICAgICAgICAgICIgICAgICAgbWluLXdpZHRoOjIwcHg7IiArCisgICAgICAgICAgICAiICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZDsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZDsiICsKKyAgICAgICAgICAgICIgICAgICAgcGFkZGluZzogMnB4IDFweCAycHggMHB4O30iICsKKyAgICAgICAgICAgICJ0YWJsZS52aXN1YWxfZGlmZiB0ci5yZXN1bHRzIHRkLmxpbmUgeyIgKworICAgICAgICAgICAgIiAgICAgICBwYWRkaW5nOiAycHggMHB4IDJweCA0cHg7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkOyIgKworICAgICAgICAgICAgIiAgICAgICB3aWR0aDogNDkuOCU7fSIgKworICAgICAgICAgICAgInRhYmxlLnZpc3VhbF9kaWZmIHRyLmZvb3RlcnMgdGQgeyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQ7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1ib3R0b206IDA7fSIgKworICAgICAgICAgICAgInRhYmxlLnZpc3VhbF9kaWZmIHRyIHRkLnNwYWNlIHsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyOiAwOyIgKworICAgICAgICAgICAgIiAgICAgICB3aWR0aDogMC40JX0iICsKKyAgICAgICAgICAgICJkaXYuc3BhY2UgeyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW4tdG9wOjRweDt9IiArCisgICAgICAgICAgICAic3Bhbi5lcWwgeyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmM2YzO30iICsKKyAgICAgICAgICAgICJzcGFuLmRlbCB7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZjg4ODg7IH0iICsKKyAgICAgICAgICAgICJzcGFuLmlucyB7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM4OGZmODg7IH0iICsKKyAgICAgICAgICAgICJ0YWJsZS5zdW1tYXJ5IHsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi10b3A6IDIwcHg7fSIgKworICAgICAgICAgICAgInRhYmxlLnN1bW1hcnkgdGQgeyIgKworICAgICAgICAgICAgIiAgICAgICBwYWRkaW5nOiAzcHg7fSIgKworICAgICAgICAgICAgInNwYW4ubGlzdEl0ZW0geyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LXNpemU6IDExcHg7IiArCisgICAgICAgICAgICAiICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7IiArCisgICAgICAgICAgICAiICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IiArCisgICAgICAgICAgICAiICAgICAgIHBhZGRpbmc6IDNweDsiICsKKyAgICAgICAgICAgICIgICAgICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHg7fSIgKworICAgICAgICAgICAgInNwYW4uIiArIEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuUkVTVUxUU19ESUZGRVIubmFtZSgpICsgInsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6IGJsYWNrO30iICsKKyAgICAgICAgICAgICJzcGFuLiIgKyBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLk5PX0VYUEVDVEVEX1JFU1VMVC5uYW1lKCkgKyAieyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYTcwMGU0OyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogI2ZmZjt9IiArCisgICAgICAgICAgICAic3Bhbi50aW1lZF9vdXQgeyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNjYjAwOyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogYmxhY2s7fSIgKworICAgICAgICAgICAgInNwYW4uY3Jhc2hlZCB7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNjMzAwMDA7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiAjZmZmO30iICsKKyAgICAgICAgICAgICJzcGFuLm5vTHRjIHsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzk0NDAwMDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6ICNmZmY7fSIgKworICAgICAgICAgICAgInNwYW4ubm9FdmVudFNlbmRlciB7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM4MTU2MDA7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiAjZmZmO30iICsKKyAgICAgICAgICAgICI8L3N0eWxlPiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUID0KKyAgICAgICAgICAgICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj4iICsKKyAgICAgICAgICAgICIgICAgZnVuY3Rpb24gdG9nZ2xlRGlzcGxheShpZCkgeyIgKworICAgICAgICAgICAgIiAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsiICsKKyAgICAgICAgICAgICIgICAgICAgIHRyaWFuZ2xlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RyaS4nICsgaWQpOyIgKworICAgICAgICAgICAgIiAgICAgICAgaWYgKGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9PSAnbm9uZScpIHsiICsKKyAgICAgICAgICAgICIgICAgICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJzsiICsKKyAgICAgICAgICAgICIgICAgICAgICAgICB0cmlhbmdsZS5pbm5lckhUTUwgPSAnJiN4MjViYzsgJzsiICsKKyAgICAgICAgICAgICIgICAgICAgIH0gZWxzZSB7IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOyIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIHRyaWFuZ2xlLmlubmVySFRNTCA9ICcmI3gyNWI2OyAnOyIgKworICAgICAgICAgICAgIiAgICAgICAgfSIgKworICAgICAgICAgICAgIiAgICB9IiArCisgICAgICAgICAgICAiPC9zY3JpcHQ+IjsKKworICAgIC8qKiBUT0RPOiBNYWtlIGl0IGEgc2V0dGluZyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0RFVEFJTFNfUkVMQVRJVkVfUEFUSCA9ICJkZXRhaWxzLmh0bWwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWFRfU1VNTUFSWV9SRUxBVElWRV9QQVRIID0gInN1bW1hcnkudHh0IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNVTFRTX1BFUl9EVU1QID0gNTAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNVTFRTX1BFUl9EQl9BQ0NFU1MgPSA1MDsKKworICAgIHByaXZhdGUgaW50IG1DcmFzaGVkVGVzdHNDb3VudCA9IDA7CisgICAgcHJpdmF0ZSBMaXN0PEFic3RyYWN0UmVzdWx0PiBtVW5leHBlY3RlZEZhaWx1cmVzID0gbmV3IEFycmF5TGlzdDxBYnN0cmFjdFJlc3VsdD4oKTsKKyAgICBwcml2YXRlIExpc3Q8QWJzdHJhY3RSZXN1bHQ+IG1FeHBlY3RlZEZhaWx1cmVzID0gbmV3IEFycmF5TGlzdDxBYnN0cmFjdFJlc3VsdD4oKTsKKyAgICBwcml2YXRlIExpc3Q8QWJzdHJhY3RSZXN1bHQ+IG1FeHBlY3RlZFBhc3NlcyA9IG5ldyBBcnJheUxpc3Q8QWJzdHJhY3RSZXN1bHQ+KCk7CisgICAgcHJpdmF0ZSBMaXN0PEFic3RyYWN0UmVzdWx0PiBtVW5leHBlY3RlZFBhc3NlcyA9IG5ldyBBcnJheUxpc3Q8QWJzdHJhY3RSZXN1bHQ+KCk7CisKKyAgICBwcml2YXRlIEN1cnNvciBtVW5leHBlY3RlZEZhaWx1cmVzQ3Vyc29yOworICAgIHByaXZhdGUgQ3Vyc29yIG1FeHBlY3RlZEZhaWx1cmVzQ3Vyc29yOworICAgIHByaXZhdGUgQ3Vyc29yIG1VbmV4cGVjdGVkUGFzc2VzQ3Vyc29yOworICAgIHByaXZhdGUgQ3Vyc29yIG1FeHBlY3RlZFBhc3Nlc0N1cnNvcjsKKworICAgIHByaXZhdGUgRmlsZUZpbHRlciBtRmlsZUZpbHRlcjsKKyAgICBwcml2YXRlIFN0cmluZyBtUmVzdWx0c1Jvb3REaXJQYXRoOworICAgIHByaXZhdGUgU3RyaW5nIG1UZXN0c1JlbGF0aXZlUGF0aDsKKyAgICBwcml2YXRlIERhdGUgbURhdGU7CisKKyAgICBwcml2YXRlIGludCBtUmVzdWx0c1NpbmNlTGFzdEh0bWxEdW1wID0gMDsKKyAgICBwcml2YXRlIGludCBtUmVzdWx0c1NpbmNlTGFzdERiQWNjZXNzID0gMDsKKworICAgIHByaXZhdGUgU3VtbWFyaXplckRCSGVscGVyIG1EYkhlbHBlcjsKKworICAgIHB1YmxpYyBTdW1tYXJpemVyKEZpbGVGaWx0ZXIgZmlsZUZpbHRlciwgU3RyaW5nIHJlc3VsdHNSb290RGlyUGF0aCwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1GaWxlRmlsdGVyID0gZmlsZUZpbHRlcjsKKyAgICAgICAgbVJlc3VsdHNSb290RGlyUGF0aCA9IHJlc3VsdHNSb290RGlyUGF0aDsKKworICAgICAgICAvKioKKyAgICAgICAgICogV2UgZG9uJ3QgcnVuIHRoZSBkYXRhYmFzZSBJL08gaW4gYSBzZXBhcmF0ZSB0aHJlYWQgdG8gYXZvaWQgY29uc3VtZXIvcHJvZHVjZXIgcHJvYmxlbQorICAgICAgICAgKiBhbmQgdG8gc2ltcGxpZnkgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIG1EYkhlbHBlciA9IG5ldyBTdW1tYXJpemVyREJIZWxwZXIoY29udGV4dCk7CisgICAgICAgIG1EYkhlbHBlci5vcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBVUkkgZ2V0RGV0YWlsc1VyaSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKE1hbmFnZXJTZXJ2aWNlLlJFU1VMVFNfUk9PVF9ESVJfUEFUSCArIEZpbGUuc2VwYXJhdG9yICsKKyAgICAgICAgICAgICAgICBIVE1MX0RFVEFJTFNfUkVMQVRJVkVfUEFUSCkudG9VUkkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRUZXN0KEFic3RyYWN0UmVzdWx0IHJlc3VsdCkgeworICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoID0gcmVzdWx0LmdldFJlbGF0aXZlUGF0aCgpOworCisgICAgICAgIGlmIChyZXN1bHQuZGlkQ3Jhc2goKSkgeworICAgICAgICAgICAgbUNyYXNoZWRUZXN0c0NvdW50Kys7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzdWx0LmRpZFBhc3MoKSkgeworICAgICAgICAgICAgcmVzdWx0LmNsZWFyUmVzdWx0cygpOworICAgICAgICAgICAgaWYgKG1GaWxlRmlsdGVyLmlzRmFpbChyZWxhdGl2ZVBhdGgpKSB7CisgICAgICAgICAgICAgICAgbVVuZXhwZWN0ZWRQYXNzZXMuYWRkKHJlc3VsdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1FeHBlY3RlZFBhc3Nlcy5hZGQocmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtRmlsZUZpbHRlci5pc0ZhaWwocmVsYXRpdmVQYXRoKSkgeworICAgICAgICAgICAgICAgIG1FeHBlY3RlZEZhaWx1cmVzLmFkZChyZXN1bHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVW5leHBlY3RlZEZhaWx1cmVzLmFkZChyZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCsrbVJlc3VsdHNTaW5jZUxhc3REYkFjY2VzcyA9PSBSRVNVTFRTX1BFUl9EQl9BQ0NFU1MpIHsKKyAgICAgICAgICAgIHBlcnNpc3RMaXN0cygpOworICAgICAgICAgICAgY2xlYXJMaXN0cygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNsZWFyTGlzdHMoKSB7CisgICAgICAgIG1VbmV4cGVjdGVkRmFpbHVyZXMuY2xlYXIoKTsKKyAgICAgICAgbUV4cGVjdGVkRmFpbHVyZXMuY2xlYXIoKTsKKyAgICAgICAgbVVuZXhwZWN0ZWRQYXNzZXMuY2xlYXIoKTsKKyAgICAgICAgbUV4cGVjdGVkUGFzc2VzLmNsZWFyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBlcnNpc3RMaXN0cygpIHsKKyAgICAgICAgcGVyc2lzdExpc3RUb1RhYmxlKG1VbmV4cGVjdGVkRmFpbHVyZXMsIFN1bW1hcml6ZXJEQkhlbHBlci5VTkVYUEVDVEVEX0ZBSUxVUkVTX1RBQkxFKTsKKyAgICAgICAgcGVyc2lzdExpc3RUb1RhYmxlKG1FeHBlY3RlZEZhaWx1cmVzLCBTdW1tYXJpemVyREJIZWxwZXIuRVhQRUNURURfRkFJTFVSRVNfVEFCTEUpOworICAgICAgICBwZXJzaXN0TGlzdFRvVGFibGUobVVuZXhwZWN0ZWRQYXNzZXMsIFN1bW1hcml6ZXJEQkhlbHBlci5VTkVYUEVDVEVEX1BBU1NFU19UQUJMRSk7CisgICAgICAgIHBlcnNpc3RMaXN0VG9UYWJsZShtRXhwZWN0ZWRQYXNzZXMsIFN1bW1hcml6ZXJEQkhlbHBlci5FWFBFQ1RFRF9QQVNTRVNfVEFCTEUpOworICAgICAgICBtUmVzdWx0c1NpbmNlTGFzdERiQWNjZXNzID0gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGVyc2lzdExpc3RUb1RhYmxlKExpc3Q8QWJzdHJhY3RSZXN1bHQ+IHJlc3VsdHMsIFN0cmluZyB0YWJsZSkgeworICAgICAgICBmb3IgKEFic3RyYWN0UmVzdWx0IGFic3RyYWN0UmVzdWx0IDogcmVzdWx0cykgeworICAgICAgICAgICAgbURiSGVscGVyLmluc2VydEFic3RyYWN0UmVzdWx0KGFic3RyYWN0UmVzdWx0LCB0YWJsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUZXN0c1JlbGF0aXZlUGF0aChTdHJpbmcgdGVzdHNSZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgbVRlc3RzUmVsYXRpdmVQYXRoID0gdGVzdHNSZWxhdGl2ZVBhdGg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3VtbWFyaXplKE1lc3NhZ2Ugb25GaW5pc2hNZXNzYWdlKSB7CisgICAgICAgIHBlcnNpc3RMaXN0cygpOworICAgICAgICBjbGVhckxpc3RzKCk7CisKKyAgICAgICAgbVVuZXhwZWN0ZWRGYWlsdXJlc0N1cnNvciA9CisgICAgICAgICAgICBtRGJIZWxwZXIuZ2V0QWJzdHJhY3RSZXN1bHRzKFN1bW1hcml6ZXJEQkhlbHBlci5VTkVYUEVDVEVEX0ZBSUxVUkVTX1RBQkxFKTsKKyAgICAgICAgbVVuZXhwZWN0ZWRQYXNzZXNDdXJzb3IgPQorICAgICAgICAgICAgbURiSGVscGVyLmdldEFic3RyYWN0UmVzdWx0cyhTdW1tYXJpemVyREJIZWxwZXIuVU5FWFBFQ1RFRF9QQVNTRVNfVEFCTEUpOworICAgICAgICBtRXhwZWN0ZWRGYWlsdXJlc0N1cnNvciA9CisgICAgICAgICAgICBtRGJIZWxwZXIuZ2V0QWJzdHJhY3RSZXN1bHRzKFN1bW1hcml6ZXJEQkhlbHBlci5FWFBFQ1RFRF9GQUlMVVJFU19UQUJMRSk7CisgICAgICAgIG1FeHBlY3RlZFBhc3Nlc0N1cnNvciA9CisgICAgICAgICAgICBtRGJIZWxwZXIuZ2V0QWJzdHJhY3RSZXN1bHRzKFN1bW1hcml6ZXJEQkhlbHBlci5FWFBFQ1RFRF9QQVNTRVNfVEFCTEUpOworCisgICAgICAgIFN0cmluZyB3ZWJLaXRSZXZpc2lvbiA9IGdldFdlYktpdFJldmlzaW9uKCk7CisgICAgICAgIGNyZWF0ZUh0bWxEZXRhaWxzKHdlYktpdFJldmlzaW9uKTsKKyAgICAgICAgY3JlYXRlVHh0U3VtbWFyeSh3ZWJLaXRSZXZpc2lvbik7CisKKyAgICAgICAgY2xlYXJMaXN0cygpOworICAgICAgICBtVW5leHBlY3RlZEZhaWx1cmVzQ3Vyc29yLmNsb3NlKCk7CisgICAgICAgIG1VbmV4cGVjdGVkUGFzc2VzQ3Vyc29yLmNsb3NlKCk7CisgICAgICAgIG1FeHBlY3RlZEZhaWx1cmVzQ3Vyc29yLmNsb3NlKCk7CisgICAgICAgIG1FeHBlY3RlZFBhc3Nlc0N1cnNvci5jbG9zZSgpOworCisgICAgICAgIG9uRmluaXNoTWVzc2FnZS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgbUNyYXNoZWRUZXN0c0NvdW50ID0gMDsKKyAgICAgICAgY2xlYXJMaXN0cygpOworICAgICAgICBtRGJIZWxwZXIucmVzZXQoKTsKKyAgICAgICAgbURhdGUgPSBuZXcgRGF0ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkdW1wSHRtbFRvRmlsZShTdHJpbmdCdWlsZGVyIGh0bWwsIGJvb2xlYW4gYXBwZW5kKSB7CisgICAgICAgIEZzVXRpbHMud3JpdGVEYXRhVG9TdG9yYWdlKG5ldyBGaWxlKG1SZXN1bHRzUm9vdERpclBhdGgsIEhUTUxfREVUQUlMU19SRUxBVElWRV9QQVRIKSwKKyAgICAgICAgICAgICAgICBodG1sLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSwgYXBwZW5kKTsKKyAgICAgICAgaHRtbC5zZXRMZW5ndGgoMCk7CisgICAgICAgIG1SZXN1bHRzU2luY2VMYXN0SHRtbER1bXAgPSAwOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUeHRTdW1tYXJ5KFN0cmluZyB3ZWJLaXRSZXZpc2lvbikgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHR4dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXkvTU0vZGQgSEg6bW06c3MiKTsKKyAgICAgICAgdHh0LmFwcGVuZCgiUGF0aDogIiArIG1UZXN0c1JlbGF0aXZlUGF0aCArICJcbiIpOworICAgICAgICB0eHQuYXBwZW5kKCJEYXRlOiAiICsgZGF0ZUZvcm1hdC5mb3JtYXQobURhdGUpICsgIlxuIik7CisgICAgICAgIHR4dC5hcHBlbmQoIkJ1aWxkIGZpbmdlcnByaW50OiAiICsgQnVpbGQuRklOR0VSUFJJTlQgKyAiXG4iKTsKKyAgICAgICAgdHh0LmFwcGVuZCgiV2ViS2l0IHZlcnNpb246ICIgKyBnZXRXZWJLaXRWZXJzaW9uRnJvbVVzZXJBZ2VudFN0cmluZygpICsgIlxuIik7CisgICAgICAgIHR4dC5hcHBlbmQoIldlYktpdCByZXZpc2lvbjogIiArIHdlYktpdFJldmlzaW9uICsgIlxuIik7CisKKyAgICAgICAgdHh0LmFwcGVuZCgiVE9UQUw6ICAgICAgICAgICAgICAgICAgICAgIiArIGdldFRvdGFsVGVzdENvdW50KCkgKyAiXG4iKTsKKyAgICAgICAgdHh0LmFwcGVuZCgiQ1JBU0hFRCAoYW1vbmcgYWxsIHRlc3RzKTogIiArIG1DcmFzaGVkVGVzdHNDb3VudCArICJcbiIpOworICAgICAgICB0eHQuYXBwZW5kKCJVTkVYUEVDVEVEIEZBSUxVUkVTOiAgICAgICAiICsgbVVuZXhwZWN0ZWRGYWlsdXJlc0N1cnNvci5nZXRDb3VudCgpICsgIlxuIik7CisgICAgICAgIHR4dC5hcHBlbmQoIlVORVhQRUNURUQgUEFTU0VTOiAgICAgICAgICIgKyBtVW5leHBlY3RlZFBhc3Nlc0N1cnNvci5nZXRDb3VudCgpICsgIlxuIik7CisgICAgICAgIHR4dC5hcHBlbmQoIkVYUEVDVEVEIEZBSUxVUkVTOiAgICAgICAgICIgKyBtRXhwZWN0ZWRGYWlsdXJlc0N1cnNvci5nZXRDb3VudCgpICsgIlxuIik7CisgICAgICAgIHR4dC5hcHBlbmQoIkVYUEVDVEVEIFBBU1NFUzogICAgICAgICAgICIgKyBtRXhwZWN0ZWRQYXNzZXNDdXJzb3IuZ2V0Q291bnQoKSArICJcbiIpOworCisgICAgICAgIEZzVXRpbHMud3JpdGVEYXRhVG9TdG9yYWdlKG5ldyBGaWxlKG1SZXN1bHRzUm9vdERpclBhdGgsIFRYVF9TVU1NQVJZX1JFTEFUSVZFX1BBVEgpLAorICAgICAgICAgICAgICAgIHR4dC50b1N0cmluZygpLmdldEJ5dGVzKCksIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlSHRtbERldGFpbHMoU3RyaW5nIHdlYktpdFJldmlzaW9uKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgaHRtbCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgaHRtbC5hcHBlbmQoIjxodG1sPjxoZWFkPiIpOworICAgICAgICBodG1sLmFwcGVuZChDU1MpOworICAgICAgICBodG1sLmFwcGVuZChTQ1JJUFQpOworICAgICAgICBodG1sLmFwcGVuZCgiPC9oZWFkPjxib2R5PiIpOworCisgICAgICAgIGNyZWF0ZVRvcFN1bW1hcnlUYWJsZSh3ZWJLaXRSZXZpc2lvbiwgaHRtbCk7CisgICAgICAgIGR1bXBIdG1sVG9GaWxlKGh0bWwsIGZhbHNlKTsKKworICAgICAgICBjcmVhdGVSZXN1bHRzTGlzdChodG1sLCAiVW5leHBlY3RlZCBmYWlsdXJlcyIsIG1VbmV4cGVjdGVkRmFpbHVyZXNDdXJzb3IpOworICAgICAgICBjcmVhdGVSZXN1bHRzTGlzdChodG1sLCAiVW5leHBlY3RlZCBwYXNzZXMiLCBtVW5leHBlY3RlZFBhc3Nlc0N1cnNvcik7CisgICAgICAgIGNyZWF0ZVJlc3VsdHNMaXN0KGh0bWwsICJFeHBlY3RlZCBmYWlsdXJlcyIsIG1FeHBlY3RlZEZhaWx1cmVzQ3Vyc29yKTsKKyAgICAgICAgY3JlYXRlUmVzdWx0c0xpc3QoaHRtbCwgIkV4cGVjdGVkIHBhc3NlcyIsIG1FeHBlY3RlZFBhc3Nlc0N1cnNvcik7CisKKyAgICAgICAgaHRtbC5hcHBlbmQoIjwvYm9keT48L2h0bWw+Iik7CisgICAgICAgIGR1bXBIdG1sVG9GaWxlKGh0bWwsIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldFRvdGFsVGVzdENvdW50KCkgeworICAgICAgICByZXR1cm4gbVVuZXhwZWN0ZWRGYWlsdXJlc0N1cnNvci5nZXRDb3VudCgpICsKKyAgICAgICAgICAgICAgICBtVW5leHBlY3RlZFBhc3Nlc0N1cnNvci5nZXRDb3VudCgpICsKKyAgICAgICAgICAgICAgICBtRXhwZWN0ZWRQYXNzZXNDdXJzb3IuZ2V0Q291bnQoKSArCisgICAgICAgICAgICAgICAgbUV4cGVjdGVkRmFpbHVyZXNDdXJzb3IuZ2V0Q291bnQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRXZWJLaXRWZXJzaW9uRnJvbVVzZXJBZ2VudFN0cmluZygpIHsKKyAgICAgICAgUmVzb3VyY2VzIHJlc291cmNlcyA9IG5ldyBSZXNvdXJjZXMobmV3IEFzc2V0TWFuYWdlcigpLCBuZXcgRGlzcGxheU1ldHJpY3MoKSwKKyAgICAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpKTsKKyAgICAgICAgU3RyaW5nIHVzZXJBZ2VudCA9CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy53ZWJfdXNlcl9hZ2VudCk7CisKKyAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gUGF0dGVybi5jb21waWxlKCJBcHBsZVdlYktpdC8oWzAtOV0rP1xcLlswLTldKSIpLm1hdGNoZXIodXNlckFnZW50KTsKKyAgICAgICAgaWYgKG1hdGNoZXIuZmluZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hlci5ncm91cCgxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gInVua25vd24iOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldFdlYktpdFJldmlzaW9uKCkgeworICAgICAgICBVUkwgdXJsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoRm9yd2FyZGVyTWFuYWdlci5nZXRIb3N0U2NoZW1lUG9ydChmYWxzZSkgKyAiVGhpcmRQYXJ0eVByb2plY3QucHJvcCIpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHRoaXJkUGFydHlQcm9qZWN0Q29udGVudHMgPSBuZXcgU3RyaW5nKEZzVXRpbHMucmVhZERhdGFGcm9tVXJsKHVybCkpOworICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBQYXR0ZXJuLmNvbXBpbGUoIl52ZXJzaW9uPShbMC05XSspIiwgUGF0dGVybi5NVUxUSUxJTkUpLm1hdGNoZXIoCisgICAgICAgICAgICAgICAgdGhpcmRQYXJ0eVByb2plY3RDb250ZW50cyk7CisgICAgICAgIGlmIChtYXRjaGVyLmZpbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXIuZ3JvdXAoMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICJ1bmtub3duIjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlVG9wU3VtbWFyeVRhYmxlKFN0cmluZyB3ZWJLaXRSZXZpc2lvbiwgU3RyaW5nQnVpbGRlciBodG1sKSB7CisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5L01NL2RkIEhIOm1tOnNzIik7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8aDE+IiArICJMYXlvdXQgdGVzdHMnIHJlc3VsdHMgZm9yOiAiICsKKyAgICAgICAgICAgICAgICAobVRlc3RzUmVsYXRpdmVQYXRoLmVxdWFscygiIikgPyAiYWxsIHRlc3RzIiA6IG1UZXN0c1JlbGF0aXZlUGF0aCkgKyAiPC9oMT4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjxoMz4iICsgIkRhdGU6ICIgKyBkYXRlRm9ybWF0LmZvcm1hdChuZXcgRGF0ZSgpKSArICI8L2gzPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiPGgzPiIgKyAiQnVpbGQgZmluZ2VycHJpbnQ6ICIgKyBCdWlsZC5GSU5HRVJQUklOVCArICI8L2gzPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiPGgzPiIgKyAiV2ViS2l0IHZlcnNpb246ICIgKyBnZXRXZWJLaXRWZXJzaW9uRnJvbVVzZXJBZ2VudFN0cmluZygpICsgIjwvaDM+Iik7CisKKyAgICAgICAgaHRtbC5hcHBlbmQoIjxoMz4iICsgIldlYktpdCByZXZpc2lvbjogIik7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8YSBocmVmPVwiaHR0cDovL3RyYWMud2Via2l0Lm9yZy9icm93c2VyL3RydW5rP3Jldj0iICsgd2ViS2l0UmV2aXNpb24gKworICAgICAgICAgICAgICAgICJcIiB0YXJnZXQ9XCJfYmxhbmtcIj48c3BhbiBjbGFzcz1cInBhdGhcIj4iICsgd2ViS2l0UmV2aXNpb24gKyAiPC9zcGFuPjwvYT4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjwvaDM+Iik7CisKKyAgICAgICAgaHRtbC5hcHBlbmQoIjx0YWJsZSBjbGFzcz1cInN1bW1hcnlcIj4iKTsKKyAgICAgICAgY3JlYXRlU3VtbWFyeVRhYmxlUm93KGh0bWwsICJUT1RBTCIsIGdldFRvdGFsVGVzdENvdW50KCkpOworICAgICAgICBjcmVhdGVTdW1tYXJ5VGFibGVSb3coaHRtbCwgIkNSQVNIRUQgKGFtb25nIGFsbCB0ZXN0cykiLCBtQ3Jhc2hlZFRlc3RzQ291bnQpOworICAgICAgICBjcmVhdGVTdW1tYXJ5VGFibGVSb3coaHRtbCwgIlVORVhQRUNURUQgRkFJTFVSRVMiLCBtVW5leHBlY3RlZEZhaWx1cmVzQ3Vyc29yLmdldENvdW50KCkpOworICAgICAgICBjcmVhdGVTdW1tYXJ5VGFibGVSb3coaHRtbCwgIlVORVhQRUNURUQgUEFTU0VTIiwgbVVuZXhwZWN0ZWRQYXNzZXNDdXJzb3IuZ2V0Q291bnQoKSk7CisgICAgICAgIGNyZWF0ZVN1bW1hcnlUYWJsZVJvdyhodG1sLCAiRVhQRUNURUQgRkFJTFVSRVMiLCBtRXhwZWN0ZWRGYWlsdXJlc0N1cnNvci5nZXRDb3VudCgpKTsKKyAgICAgICAgY3JlYXRlU3VtbWFyeVRhYmxlUm93KGh0bWwsICJFWFBFQ1RFRCBQQVNTRVMiLCBtRXhwZWN0ZWRQYXNzZXNDdXJzb3IuZ2V0Q291bnQoKSk7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8L3RhYmxlPiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTdW1tYXJ5VGFibGVSb3coU3RyaW5nQnVpbGRlciBodG1sLCBTdHJpbmcgY2FwdGlvbiwgaW50IHNpemUpIHsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjx0cj4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQ+IiArIGNhcHRpb24gKyAiPC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQ+IiArIHNpemUgKyAiPC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjwvdHI+Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlc3VsdHNMaXN0KAorICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBodG1sLCBTdHJpbmcgdGl0bGUsIEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aDsKKyAgICAgICAgU3RyaW5nIGlkID0gIiI7CisgICAgICAgIEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUgcmVzdWx0Q29kZTsKKworICAgICAgICBodG1sLmFwcGVuZCgiPGgyPiIgKyB0aXRsZSArICIgWyIgKyBjdXJzb3IuZ2V0Q291bnQoKSArICJdPC9oMj4iKTsKKworICAgICAgICBpZiAoIWN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBBYnN0cmFjdFJlc3VsdCByZXN1bHQ7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFN1bW1hcml6ZXJEQkhlbHBlci5nZXRBYnN0cmFjdFJlc3VsdChjdXJzb3IpOworCisgICAgICAgICAgICByZWxhdGl2ZVBhdGggPSByZXN1bHQuZ2V0UmVsYXRpdmVQYXRoKCk7CisgICAgICAgICAgICByZXN1bHRDb2RlID0gcmVzdWx0LmdldFJlc3VsdENvZGUoKTsKKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxoMz4iKTsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUZWNobmljYWxseSwgdHdvIGRpZmZlcmVudCBwYXRocyBjb3VsZCBlbmQgdXAgYmVpbmcgdGhlIHNhbWUsIGJlY2F1c2UKKyAgICAgICAgICAgICAqICc6JyBpcyBhIHZhbGlkICBjaGFyYWN0ZXIgaW4gYSBwYXRoLiBIb3dldmVyLCBpdCBpcyBwcm9iYWJseSBub3QgZ29pbmcKKyAgICAgICAgICAgICAqIHRvIGNhdXNlIGFueSBwcm9ibGVtcyBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWQgPSByZWxhdGl2ZVBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvciwgIjoiKTsKKworICAgICAgICAgICAgLyoqIFdyaXRlIHRoZSB0ZXN0IG5hbWUgKi8KKyAgICAgICAgICAgIGlmIChyZXN1bHRDb2RlID09IEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuUkVTVUxUU19ESUZGRVIpIHsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiPGEgaHJlZj1cIiNcIiBvbkNsaWNrPVwidG9nZ2xlRGlzcGxheSgnIiArIGlkICsgIicpOyIpOworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCJyZXR1cm4gZmFsc2U7XCI+Iik7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxzcGFuIGNsYXNzPVwidHJpXCIgaWQ9XCJ0cmkuIiArIGlkICsgIlwiPiYjeDI1YjY7IDwvc3Bhbj4iKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiPHNwYW4gY2xhc3M9XCJwYXRoXCI+IiArIHJlbGF0aXZlUGF0aCArICI8L3NwYW4+Iik7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjwvYT4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxhIGhyZWY9XCIiICsgZ2V0Vmlld1NvdXJjZVVybChyZXN1bHQuZ2V0UmVsYXRpdmVQYXRoKCkpLnRvU3RyaW5nKCkgKyAiXCIiKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiIHRhcmdldD1cIl9ibGFua1wiPiIpOworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8c3BhbiBjbGFzcz1cInNxciBzcXJfIiArIChyZXN1bHQuZGlkUGFzcygpID8gInBhc3MiIDogImZhaWwiKSk7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIlwiPiYjeDI1YTA7IDwvc3Bhbj4iKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiPHNwYW4gY2xhc3M9XCJwYXRoXCI+IiArIHJlc3VsdC5nZXRSZWxhdGl2ZVBhdGgoKSArICI8L3NwYW4+Iik7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjwvYT4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFyZXN1bHQuZGlkUGFzcygpKSB7CisgICAgICAgICAgICAgICAgYXBwZW5kVGFncyhodG1sLCByZXN1bHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPC9oMz4iKTsKKyAgICAgICAgICAgIGFwcGVuZEV4cGVjdGVkUmVzdWx0c1NvdXJjZXMocmVzdWx0LCBodG1sKTsKKworICAgICAgICAgICAgaWYgKHJlc3VsdENvZGUgPT0gQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZS5SRVNVTFRTX0RJRkZFUikgeworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8ZGl2IGNsYXNzPVwiZGlmZlwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiBpZD1cIiIgKyBpZCArICJcIj4iKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZChyZXN1bHQuZ2V0RGlmZkFzSHRtbCgpKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiPGEgaHJlZj1cIiNcIiBvbkNsaWNrPVwidG9nZ2xlRGlzcGxheSgnIiArIGlkICsgIicpOyIpOworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCJyZXR1cm4gZmFsc2U7XCI+SGlkZTwvYT4iKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiIHwgIik7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxhIGhyZWY9XCIiICsgZ2V0Vmlld1NvdXJjZVVybChyZWxhdGl2ZVBhdGgpLnRvU3RyaW5nKCkgKyAiXCIiKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiIHRhcmdldD1cIl9ibGFua1wiPlNob3cgc291cmNlPC9hPiIpOworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8L2Rpdj4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxkaXYgY2xhc3M9XCJzcGFjZVwiPjwvZGl2PiIpOworCisgICAgICAgICAgICBpZiAoKyttUmVzdWx0c1NpbmNlTGFzdEh0bWxEdW1wID09IFJFU1VMVFNfUEVSX0RVTVApIHsKKyAgICAgICAgICAgICAgICBkdW1wSHRtbFRvRmlsZShodG1sLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3Vyc29yLm1vdmVUb05leHQoKTsKKyAgICAgICAgfSB3aGlsZSAoIWN1cnNvci5pc0FmdGVyTGFzdCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXBwZW5kVGFncyhTdHJpbmdCdWlsZGVyIGh0bWwsIEFic3RyYWN0UmVzdWx0IHJlc3VsdCkgeworICAgICAgICAvKiogVGFnIHRlc3RzIHdoaWNoIGNyYXNoLCB0aW1lIG91dCBvciB3aGVyZSByZXN1bHRzIGRvbid0IG1hdGNoICovCisgICAgICAgIGlmIChyZXN1bHQuZGlkQ3Jhc2goKSkgeworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiA8c3BhbiBjbGFzcz1cImxpc3RJdGVtIGNyYXNoZWRcIj5DcmFzaGVkPC9zcGFuPiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHJlc3VsdC5kaWRUaW1lT3V0KCkpIHsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiIDxzcGFuIGNsYXNzPVwibGlzdEl0ZW0gdGltZWRfb3V0XCI+VGltZWQgb3V0PC9zcGFuPiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZSByZXN1bHRDb2RlID0gcmVzdWx0LmdldFJlc3VsdENvZGUoKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHRDb2RlICE9IEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuUkVTVUxUU19NQVRDSCkgeworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgPHNwYW4gY2xhc3M9XCJsaXN0SXRlbSAiICsgcmVzdWx0Q29kZS5uYW1lKCkgKyAiXCI+Iik7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQocmVzdWx0Q29kZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiPC9zcGFuPiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIERldGVjdCBtaXNzaW5nIExUQyBmdW5jdGlvbiAqLworICAgICAgICBTdHJpbmcgYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcgPSByZXN1bHQuZ2V0QWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcoKTsKKyAgICAgICAgaWYgKGFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZy5jb250YWlucygiY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUiKSAmJgorICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nLmNvbnRhaW5zKCJoYXMgbm8gbWV0aG9kIikpIHsKKyAgICAgICAgICAgIGlmIChhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZy5jb250YWlucygiTGF5b3V0VGVzdENvbnRyb2xsZXIiKSkgeworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgPHNwYW4gY2xhc3M9XCJsaXN0SXRlbSBub0x0Y1wiPkxUQyBmdW5jdGlvbiBtaXNzaW5nPC9zcGFuPiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nLmNvbnRhaW5zKCJFdmVudFNlbmRlciIpKSB7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiA8c3BhbiBjbGFzcz1cImxpc3RJdGVtIG5vRXZlbnRTZW5kZXJcIj4iKTsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiRVMgZnVuY3Rpb24gbWlzc2luZzwvc3Bhbj4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgYXBwZW5kRXhwZWN0ZWRSZXN1bHRzU291cmNlcyhBYnN0cmFjdFJlc3VsdCByZXN1bHQsCisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGh0bWwpIHsKKyAgICAgICAgU3RyaW5nIHRleHRTb3VyY2UgPSByZXN1bHQuZ2V0RXhwZWN0ZWRUZXh0UmVzdWx0UGF0aCgpOworICAgICAgICBTdHJpbmcgaW1hZ2VTb3VyY2UgPSByZXN1bHQuZ2V0RXhwZWN0ZWRJbWFnZVJlc3VsdFBhdGgoKTsKKworICAgICAgICBpZiAodGV4dFNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBTaG93IGlmIGEgdGV4dCByZXN1bHQgaXMgbWlzc2luZy4gV2UgbWF5IHdhbnQgdG8gcmV2aXNpdCB0aGlzIGRlY2lzaW9uIHdoZW4gd2UgYWRkCisgICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBpbWFnZSByZXN1bHRzLgorICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxzcGFuIGNsYXNzPVwic291cmNlXCI+RXhwZWN0ZWQgdGV4dHVhbCByZXN1bHQgbWlzc2luZzwvc3Bhbj4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8c3BhbiBjbGFzcz1cInNvdXJjZVwiPkV4cGVjdGVkIHRleHR1YWwgcmVzdWx0IGZyb206ICIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxhIGhyZWY9XCIiICsgRm9yd2FyZGVyTWFuYWdlci5nZXRIb3N0U2NoZW1lUG9ydChmYWxzZSkgKyAiTGF5b3V0VGVzdHMvIiArCisgICAgICAgICAgICAgICAgICAgIHRleHRTb3VyY2UgKyAiXCIiKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgdGFyZ2V0PVwiX2JsYW5rXCI+Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZCh0ZXh0U291cmNlICsgIjwvYT48L3NwYW4+Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGltYWdlU291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8c3BhbiBjbGFzcz1cInNvdXJjZVwiPkV4cGVjdGVkIGltYWdlIHJlc3VsdCBmcm9tOiAiKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8YSBocmVmPVwiIiArIEZvcndhcmRlck1hbmFnZXIuZ2V0SG9zdFNjaGVtZVBvcnQoZmFsc2UpICsgIkxheW91dFRlc3RzLyIgKworICAgICAgICAgICAgICAgICAgICBpbWFnZVNvdXJjZSArICJcIiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiB0YXJnZXQ9XCJfYmxhbmtcIj4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKGltYWdlU291cmNlICsgIjwvYT48L3NwYW4+Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkwgZ2V0Vmlld1NvdXJjZVVybChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIFVSTCB1cmwgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdXJsID0gbmV3IFVSTCgiaHR0cCIsICJsb2NhbGhvc3QiLCBGb3J3YXJkZXJNYW5hZ2VyLkhUVFBfUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgIi9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9hbmRyb2lkL3ZpZXdfc291cmNlLnBocD9zcmM9IiArCisgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlUGF0aCk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiAicmVsYXRpdmVQYXRoPSIgKyByZWxhdGl2ZVBhdGg7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHVybDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9TdW1tYXJpemVyREJIZWxwZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1N1bW1hcml6ZXJEQkhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZTEzZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9TdW1tYXJpemVyREJIZWxwZXIuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5TUUxFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlT3BlbkhlbHBlcjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSBiYXNpYyBjbGFzcyB0aGF0IHdyYXBzIGRhdGFiYXNlIGFjY2Vzc2VzIGluc2lkZSBpdHNlbGYgYW5kIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgdG8KKyAqIHN0b3JlIGFuZCByZXRyaWV2ZSBBYnN0cmFjdFJlc3VsdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBTdW1tYXJpemVyREJIZWxwZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSUQgPSAiaWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUEFUSCA9ICJwYXRoIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0JZVEVTID0gImJ5dGVzIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBQkFTRV9OQU1FID0gIlN1bW1hcml6ZXJEQiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERBVEFCQVNFX1ZFUlNJT04gPSAxOworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBFQ1RFRF9GQUlMVVJFU19UQUJMRSA9ICJleHBlY3RlZEZhaWx1cmVzIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFVORVhQRUNURURfRkFJTFVSRVNfVEFCTEUgPSAidW5leHBlY3RlZEZhaWx1cmVzIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUEVDVEVEX1BBU1NFU19UQUJMRSA9ICJleHBleHRlZFBhc3NlcyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBVTkVYUEVDVEVEX1BBU1NFU19UQUJMRSA9ICJ1bmV4cGV4dGVkUGFzc2VzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBUQUJMRVNfTkFNRVMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgeworICAgICAgICBUQUJMRVNfTkFNRVMuYWRkKEVYUEVDVEVEX0ZBSUxVUkVTX1RBQkxFKTsKKyAgICAgICAgVEFCTEVTX05BTUVTLmFkZChFWFBFQ1RFRF9QQVNTRVNfVEFCTEUpOworICAgICAgICBUQUJMRVNfTkFNRVMuYWRkKFVORVhQRUNURURfRkFJTFVSRVNfVEFCTEUpOworICAgICAgICBUQUJMRVNfTkFNRVMuYWRkKFVORVhQRUNURURfUEFTU0VTX1RBQkxFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGNyZWF0ZVRhYmxlcyhTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICBTdHJpbmcgY21kOworICAgICAgICBmb3IgKFN0cmluZyB0YWJsZU5hbWUgOiBUQUJMRVNfTkFNRVMpIHsKKyAgICAgICAgICAgIGNtZCA9ICJjcmVhdGUgdGFibGUgIiArIHRhYmxlTmFtZSArICIgKCIKKyAgICAgICAgICAgICAgICAgICAgKyBLRVlfSUQgKyAiIGludGVnZXIgcHJpbWFyeSBrZXkgYXV0b2luY3JlbWVudCwgIgorICAgICAgICAgICAgICAgICAgICArIEtFWV9QQVRIICsgIiB0ZXh0IG5vdCBudWxsLCAiCisgICAgICAgICAgICAgICAgICAgICsgS0VZX0JZVEVTICsgIiBibG9iIG5vdCBudWxsKTsiOworICAgICAgICAgICAgZGIuZXhlY1NRTChjbWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBkcm9wVGFibGVzKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHRhYmxlTmFtZSA6IFRBQkxFU19OQU1FUykgeworICAgICAgICAgICAgZGIuZXhlY1NRTCgiRFJPUCBUQUJMRSBJRiBFWElTVFMgIiArIHRhYmxlTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEYXRhYmFzZUhlbHBlciBleHRlbmRzIFNRTGl0ZU9wZW5IZWxwZXIgeworICAgICAgICBEYXRhYmFzZUhlbHBlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIERBVEFCQVNFX05BTUUsIG51bGwsIERBVEFCQVNFX1ZFUlNJT04pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgICAgICBkcm9wVGFibGVzKGRiKTsKKyAgICAgICAgICAgIGNyZWF0ZVRhYmxlcyhkYik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25VcGdyYWRlKFNRTGl0ZURhdGFiYXNlIGRiLCBpbnQgb2xkVmVyc2lvbiwgaW50IG5ld1ZlcnNpb24pIHsKKyAgICAgICAgICAgIC8qKiBOT09QIGZvciBub3csIGJlY2F1c2Ugd2Ugd2lsbCBuZXZlciB1cGdyYWRlIHRoZSBkYiAqLworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgICAgIGRyb3BUYWJsZXMoZGIpOworICAgICAgICAgICAgY3JlYXRlVGFibGVzKGRiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgRGF0YWJhc2VIZWxwZXIgbURiSGVscGVyOworICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgbURiOworCisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworCisgICAgcHVibGljIFN1bW1hcml6ZXJEQkhlbHBlcihDb250ZXh0IGN0eCkgeworICAgICAgICBtQ29udGV4dCA9IGN0eDsKKyAgICAgICAgbURiSGVscGVyID0gbmV3IERhdGFiYXNlSGVscGVyKG1Db250ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgbURiSGVscGVyLnJlc2V0KHRoaXMubURiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYiA9IG1EYkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIG1EYkhlbHBlci5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluc2VydEFic3RyYWN0UmVzdWx0KEFic3RyYWN0UmVzdWx0IHJlc3VsdCwgU3RyaW5nIHRhYmxlKSB7CisgICAgICAgIENvbnRlbnRWYWx1ZXMgY3YgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICBjdi5wdXQoS0VZX1BBVEgsIHJlc3VsdC5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgIGN2LnB1dChLRVlfQllURVMsIHJlc3VsdC5nZXRCeXRlcygpKTsKKyAgICAgICAgbURiLmluc2VydCh0YWJsZSwgbnVsbCwgY3YpOworICAgIH0KKworICAgIHB1YmxpYyBDdXJzb3IgZ2V0QWJzdHJhY3RSZXN1bHRzKFN0cmluZyB0YWJsZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBtRGIucXVlcnkoZmFsc2UsIHRhYmxlLCBuZXcgU3RyaW5nW10ge0tFWV9CWVRFU30sIG51bGwsIG51bGwsIG51bGwsIG51bGwsCisgICAgICAgICAgICAgICAgS0VZX1BBVEggKyAiIEFTQyIsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQWJzdHJhY3RSZXN1bHQgZ2V0QWJzdHJhY3RSZXN1bHQoQ3Vyc29yIGN1cnNvcikgeworICAgICAgICByZXR1cm4gQWJzdHJhY3RSZXN1bHQuY3JlYXRlKGN1cnNvci5nZXRCbG9iKGN1cnNvci5nZXRDb2x1bW5JbmRleChLRVlfQllURVMpKSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1Rlc3RzTGlzdEFjdGl2aXR5LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9UZXN0c0xpc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYjRkMmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9UZXN0c0xpc3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Qcm9ncmVzc0RpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5zY3JpcHRzdXBwb3J0Lk9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2s7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIEFuIEFjdGl2aXR5IHRoYXQgZ2VuZXJhdGVzIGEgbGlzdCBvZiB0ZXN0cyBhbmQgc2VuZHMgdGhlIGludGVudCB0bworICogTGF5b3V0VGVzdHNFeGVjdXRlciB0byBydW4gdGhlbS4gSXQgYWxzbyByZXN0YXJ0cyB0aGUgTGF5b3V0VGVzdHNFeGVjdXRlcgorICogYWZ0ZXIgaXQgY3Jhc2hlcy4KKyAqLworcHVibGljIGNsYXNzIFRlc3RzTGlzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19URVNUX0xJU1RfUFJFTE9BREVSX0RPTkUgPSAwOworCisgICAgLyoqIENvbnN0YW50cyBmb3IgYWRkaW5nIGV4dHJhcyB0byBhbiBpbnRlbnQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9URVNUX1BBVEggPSAiVGVzdFBhdGgiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJvZ3Jlc3NEaWFsb2cgc1Byb2dyZXNzRGlhbG9nOworCisgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfVEVTVF9MSVNUX1BSRUxPQURFUl9ET05FOgorICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuZGlzbWlzcygpOworICAgICAgICAgICAgICAgICAgICBtVGVzdHNMaXN0ID0gKEFycmF5TGlzdDxTdHJpbmc+KW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIG1Ub3RhbFRlc3RDb3VudCA9IG1UZXN0c0xpc3Quc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICByZXN0YXJ0RXhlY3V0b3IoMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbVRlc3RzTGlzdDsKKyAgICBwcml2YXRlIGludCBtVG90YWxUZXN0Q291bnQ7CisKKyAgICBwcml2YXRlIE9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2sgbU9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2s7CisgICAgcHJpdmF0ZSBib29sZWFuIG1FdmVyeXRoaW5nRmluaXNoZWQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgLyoqIFByZXBhcmUgdGhlIHByb2dyZXNzIGRpYWxvZyAqLworICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cgPSBuZXcgUHJvZ3Jlc3NEaWFsb2coVGVzdHNMaXN0QWN0aXZpdHkudGhpcyk7CisgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zZXRDYW5jZWxhYmxlKGZhbHNlKTsKKyAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNldFByb2dyZXNzU3R5bGUoUHJvZ3Jlc3NEaWFsb2cuU1RZTEVfU1BJTk5FUik7CisgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zZXRUaXRsZShSLnN0cmluZy5kaWFsb2dfcHJvZ3Jlc3NfdGl0bGUpOworICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2V0TWVzc2FnZShnZXRUZXh0KFIuc3RyaW5nLmRpYWxvZ19wcm9ncmVzc19tc2cpKTsKKworICAgICAgICByZXF1ZXN0V2luZG93RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9QUk9HUkVTUyk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IGdldEludGVudCgpOworICAgICAgICBpZiAoIWludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoSW50ZW50LkFDVElPTl9SVU4pKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHBhdGggPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfVEVTVF9QQVRIKTsKKworICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2hvdygpOworICAgICAgICBNZXNzYWdlIGRvbmVNc2cgPSBNZXNzYWdlLm9idGFpbihtSGFuZGxlciwgTVNHX1RFU1RfTElTVF9QUkVMT0FERVJfRE9ORSk7CisKKyAgICAgICAgSW50ZW50IHNlcnZpY2VJbnRlbnQgPSBuZXcgSW50ZW50KHRoaXMsIE1hbmFnZXJTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgc2VydmljZUludGVudC5wdXRFeHRyYSgicGF0aCIsIHBhdGgpOworICAgICAgICBzdGFydFNlcnZpY2Uoc2VydmljZUludGVudCk7CisKKyAgICAgICAgbmV3IFRlc3RzTGlzdFByZWxvYWRlclRocmVhZChwYXRoLCBkb25lTXNnKS5zdGFydCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTmV3SW50ZW50KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoSW50ZW50LkFDVElPTl9SRUJPT1QpKSB7CisgICAgICAgICAgICBvbkNyYXNoSW50ZW50KGludGVudCk7CisgICAgICAgIH0gZWxzZSBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhJbnRlbnQuQUNUSU9OX1NIVVRET1dOKSkgeworICAgICAgICAgICAgb25FdmVyeXRoaW5nRmluaXNoZWRJbnRlbnQoaW50ZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgYW4gaW50ZW50IHRoYXQgY29tZXMgZnJvbSBNYW5hZ2VTZXJ2aWNlIHdoZW4gY3Jhc2ggaXMgZGV0ZWN0ZWQuCisgICAgICogVGhlIGludGVudCBjb250YWlucyBhbiBpbmRleCBpbiBtVGVzdHNMaXN0IG9mIHRoZSB0ZXN0IHRoYXQgY3Jhc2hlZC4gVGVzdHNMaXN0QWN0aXZpdHkKKyAgICAgKiByZXN0YXJ0cyB0aGUgTGF5b3V0VGVzdHNFeGVjdXRvciBmcm9tIHRoZSBmb2xsb3dpbmcgdGVzdCBpbiBtVGVzdHNMaXN0LCBieSBzZW5kaW5nCisgICAgICogYW4gaW50ZW50IHRvIGl0LiBUaGlzIG5ldyBpbnRlbnQgY29udGFpbnMgYSBsaXN0IG9mIHJlbWFpbmluZyB0ZXN0cyB0byBydW4sCisgICAgICogdG90YWwgY291bnQgb2YgYWxsIHRlc3RzLCBhbmQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCB0ZXN0IHRvIHJ1biBhZnRlciByZXN0YXJ0aW5nLgorICAgICAqIExheW91dFRlc3RFeGVjdXRvciBydW5zIHRoZW4gYXMgdXN1YWwsIHNlbmRpbmcgcmVwb3J0cyB0byBNYW5hZ2VyU2VydmljZS4gSWYgaXQKKyAgICAgKiBkZXRlY3RzIHRoZSBjcmFzaCBpdCBzZW5kcyBhIG5ldyBpbnRlbnQgYW5kIHRoZSBmbG93IHJlcGVhdHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG9uQ3Jhc2hJbnRlbnQoSW50ZW50IGludGVudCkgeworICAgICAgICBpbnQgbmV4dFRlc3RUb1J1biA9IGludGVudC5nZXRJbnRFeHRyYSgiY3Jhc2hlZFRlc3RJbmRleCIsIC0xKSArIDE7CisgICAgICAgIGlmIChuZXh0VGVzdFRvUnVuID4gMCAmJiBuZXh0VGVzdFRvUnVuIDw9IG1Ub3RhbFRlc3RDb3VudCkgeworICAgICAgICAgICAgcmVzdGFydEV4ZWN1dG9yKG5leHRUZXN0VG9SdW4pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJPbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrKE9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgbU9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgaWYgKG1FdmVyeXRoaW5nRmluaXNoZWQpIHsKKyAgICAgICAgICAgIG1PbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrLm9uRmluaXNoZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkV2ZXJ5dGhpbmdGaW5pc2hlZEludGVudChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIFRvYXN0IHRvYXN0ID0gVG9hc3QubWFrZVRleHQodGhpcywKKyAgICAgICAgICAgICAgICAiQWxsIHRlc3RzIGZpbmlzaGVkLlxuUHJlc3MgYmFjayBrZXkgdG8gcmV0dXJuIHRvIHRoZSB0ZXN0cycgbGlzdC4iLAorICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9MT05HKTsKKyAgICAgICAgdG9hc3Quc2V0R3Jhdml0eShHcmF2aXR5LkNFTlRFUiwgLTQwLCAwKTsKKyAgICAgICAgdG9hc3Quc2hvdygpOworCisgICAgICAgIC8qKiBTaG93IHRoZSBkZXRhaWxzIHRvIHRoZSB1c2VyICovCisgICAgICAgIFdlYlZpZXcgd2ViVmlldyA9IG5ldyBXZWJWaWV3KHRoaXMpOworICAgICAgICB3ZWJWaWV3LmdldFNldHRpbmdzKCkuc2V0SmF2YVNjcmlwdEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5zZXRCdWlsdEluWm9vbUNvbnRyb2xzKHRydWUpOworICAgICAgICB3ZWJWaWV3LmdldFNldHRpbmdzKCkuc2V0RW5hYmxlU21vb3RoVHJhbnNpdGlvbih0cnVlKTsKKyAgICAgICAgLyoqIFRoaXMgZW5hYmxlcyBkb3VibGUtdGFwIHRvIHpvb20gKi8KKyAgICAgICAgd2ViVmlldy5nZXRTZXR0aW5ncygpLnNldFVzZVdpZGVWaWV3UG9ydCh0cnVlKTsKKworICAgICAgICBzZXRDb250ZW50Vmlldyh3ZWJWaWV3KTsKKyAgICAgICAgd2ViVmlldy5sb2FkVXJsKFN1bW1hcml6ZXIuZ2V0RGV0YWlsc1VyaSgpLnRvU3RyaW5nKCkpOworCisgICAgICAgIG1FdmVyeXRoaW5nRmluaXNoZWQgPSB0cnVlOworICAgICAgICBpZiAobU9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbU9uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2sub25GaW5pc2hlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcywgdG9nZXRoZXIgd2l0aCBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9uIiBpbiBtYW5pZmVzdCBmaWxlLCBwcmV2ZW50cworICAgICAqIHRoZSBhY3Rpdml0eSBmcm9tIHJlc3RhcnRpbmcgb24gb3JpZW50YXRpb24gY2hhbmdlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CisgICAgICAgIG91dFN0YXRlLnB1dFN0cmluZ0FycmF5TGlzdCgidGVzdHNMaXN0IiwgbVRlc3RzTGlzdCk7CisgICAgICAgIG91dFN0YXRlLnB1dEludCgidG90YWxDb3VudCIsIG1Ub3RhbFRlc3RDb3VudCk7CisKKyAgICAgICAgc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZShvdXRTdGF0ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN0b3JlSW5zdGFuY2VTdGF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdG9yZUluc3RhbmNlU3RhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBtVGVzdHNMaXN0ID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldFN0cmluZ0FycmF5TGlzdCgidGVzdHNMaXN0Iik7CisgICAgICAgIG1Ub3RhbFRlc3RDb3VudCA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRJbnQoInRvdGFsQ291bnQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAoUmUpc3RhcnRzIHRoZSBleGVjdXRlciBhY3Rpdml0eSBmcm9tIHRoZSBnaXZlbiB0ZXN0IG51bWJlciAoaW5jbHVzaXZlLCAwLWJhc2VkKS4KKyAgICAgKiBUaGlzIG51bWJlciBpcyBhbiBpbmRleCBpbiBtVGVzdHNMaXN0LCBub3QgdGhlIHN1Ymxpc3QgcGFzc2VkIGluIHRoZSBpbnRlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhcnRGcm9tCisgICAgICogICAgICB0ZXN0IGluZGV4IGluIG1UZXN0c0xpc3QgdG8gc3RhcnQgdGhlIHRlc3RzIGZyb20gKGluY2x1c2l2ZSwgMC1iYXNlZCkKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVzdGFydEV4ZWN1dG9yKGludCBzdGFydEZyb20pIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgaW50ZW50LnNldENsYXNzKHRoaXMsIExheW91dFRlc3RzRXhlY3V0b3IuY2xhc3MpOworICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKEludGVudC5BQ1RJT05fUlVOKTsKKworICAgICAgICBpZiAoc3RhcnRGcm9tIDwgbVRvdGFsVGVzdENvdW50KSB7CisgICAgICAgICAgICBpbnRlbnQucHV0U3RyaW5nQXJyYXlMaXN0RXh0cmEoTGF5b3V0VGVzdHNFeGVjdXRvci5FWFRSQV9URVNUU19MSVNULAorICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFN0cmluZz4obVRlc3RzTGlzdC5zdWJMaXN0KHN0YXJ0RnJvbSwgbVRvdGFsVGVzdENvdW50KSkpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKExheW91dFRlc3RzRXhlY3V0b3IuRVhUUkFfVEVTVF9JTkRFWCwgc3RhcnRGcm9tKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludGVudC5wdXRTdHJpbmdBcnJheUxpc3RFeHRyYShMYXlvdXRUZXN0c0V4ZWN1dG9yLkVYVFJBX1RFU1RTX0xJU1QsCisgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVGVzdHNMaXN0UHJlbG9hZGVyVGhyZWFkLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9UZXN0c0xpc3RQcmVsb2FkZXJUaHJlYWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTdkNDdhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVGVzdHNMaXN0UHJlbG9hZGVyVGhyZWFkLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEEgVGhyZWFkIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgYSBsaXN0cyBvZiB0ZXN0cyB0byBydW4uCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0c0xpc3RQcmVsb2FkZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVGVzdHNMaXN0UHJlbG9hZGVyVGhyZWFkIjsKKworICAgIC8qKiBBIGxpc3QgY29udGFpbmluZyByZWxhdGl2ZSBwYXRocyBvZiB0ZXN0cyB0byBydW4gKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1UZXN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworICAgIHByaXZhdGUgRmlsZUZpbHRlciBtRmlsZUZpbHRlcjsKKworICAgIC8qKgorICAgICAqIEEgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHdpdGggdGhlIHRlc3RzIHdlIHdhbnQgdG8gcnVuIG9yIHBhcnRpY3VsYXIgdGVzdC4KKyAgICAgKiBVc2VkIHVwIHRvIGFuZCBpbmNsdWRpbmcgcHJlbG9hZFRlc3RzKCkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbVJlbGF0aXZlUGF0aDsKKworICAgIHByaXZhdGUgTWVzc2FnZSBtRG9uZU1zZzsKKworICAgIC8qKgorICAgICAqIFRoZSBnaXZlbiBwYXRoIG11c3QgYmUgcmVsYXRpdmUgdG8gdGhlIHJvb3QgZGlyLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGgKKyAgICAgKiBAcGFyYW0gZG9uZU1zZworICAgICAqLworICAgIHB1YmxpYyBUZXN0c0xpc3RQcmVsb2FkZXJUaHJlYWQoU3RyaW5nIHBhdGgsIE1lc3NhZ2UgZG9uZU1zZykgeworICAgICAgICBtRmlsZUZpbHRlciA9IG5ldyBGaWxlRmlsdGVyKCk7CisgICAgICAgIG1SZWxhdGl2ZVBhdGggPSBwYXRoOworICAgICAgICBtRG9uZU1zZyA9IGRvbmVNc2c7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBpZiAoRmlsZUZpbHRlci5pc1Rlc3RGaWxlKG1SZWxhdGl2ZVBhdGgpKSB7CisgICAgICAgICAgICBtVGVzdHNMaXN0LmFkZChtUmVsYXRpdmVQYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvYWRUZXN0c0Zyb21VcmwobVJlbGF0aXZlUGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBtRG9uZU1zZy5vYmogPSBtVGVzdHNMaXN0OworICAgICAgICBtRG9uZU1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhbGwgdGhlIHRlc3RzIGZyb20gdGhlIGdpdmVuIGRpcmVjdG9yaWVzIGFuZCBhbGwgdGhlIHN1YmRpcmVjdG9yaWVzCisgICAgICogaW50byBtVGVzdHNMaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGRpclJlbGF0aXZlUGF0aAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2FkVGVzdHNGcm9tVXJsKFN0cmluZyByb290UmVsYXRpdmVQYXRoKSB7CisgICAgICAgIExpbmtlZExpc3Q8U3RyaW5nPiBkaXJlY3Rvcmllc0xpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGRpcmVjdG9yaWVzTGlzdC5hZGQocm9vdFJlbGF0aXZlUGF0aCk7CisKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aDsKKyAgICAgICAgU3RyaW5nIGl0ZW1OYW1lOworICAgICAgICB3aGlsZSAoIWRpcmVjdG9yaWVzTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJlbGF0aXZlUGF0aCA9IGRpcmVjdG9yaWVzTGlzdC5yZW1vdmVGaXJzdCgpOworCisgICAgICAgICAgICBMaXN0PFN0cmluZz4gZGlyUmVsYXRpdmVQYXRocyA9IEZzVXRpbHMuZ2V0TGF5b3V0VGVzdHNEaXJDb250ZW50cyhyZWxhdGl2ZVBhdGgsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgIGlmIChkaXJSZWxhdGl2ZVBhdGhzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBkaXJSZWxhdGl2ZVBhdGggOiBkaXJSZWxhdGl2ZVBhdGhzKSB7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1OYW1lID0gbmV3IEZpbGUoZGlyUmVsYXRpdmVQYXRoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChGaWxlRmlsdGVyLmlzVGVzdERpcihpdGVtTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzTGlzdC5hZGQoZGlyUmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHRlc3RSZWxhdGl2ZVBhdGhzID0gRnNVdGlscy5nZXRMYXlvdXRUZXN0c0RpckNvbnRlbnRzKHJlbGF0aXZlUGF0aCwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmICh0ZXN0UmVsYXRpdmVQYXRocyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdGVzdFJlbGF0aXZlUGF0aCA6IHRlc3RSZWxhdGl2ZVBhdGhzKSB7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1OYW1lID0gbmV3IEZpbGUodGVzdFJlbGF0aXZlUGF0aCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoRmlsZUZpbHRlci5pc1Rlc3RGaWxlKGl0ZW1OYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGNob29zZSB0byBza2lwIGFsbCB0aGUgdGVzdHMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8gY3Jhc2guICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1GaWxlRmlsdGVyLmlzQ3Jhc2godGVzdFJlbGF0aXZlUGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGVzdHNMaXN0LmFkZCh0ZXN0UmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVE9ETzogU3VtbWFyaXplciBpcyBub3cgaW4gc2VydmljZSAtIGZpZ3VyZSBvdXQgaG93IHRvIHNlbmQgdGhlIGluZm8uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUHJldmlvdXNseTogbVN1bW1hcml6ZXIuYWRkU2tpcHBlZFRlc3QocmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1RleHRSZXN1bHQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1RleHRSZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDJiOThiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVGV4dFJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CisKK2ltcG9ydCBuYW1lLmZyYXNlci5uZWlsLnBsYWludGV4dC5kaWZmX21hdGNoX3BhdGNoOworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CisKKy8qKgorICogQSByZXN1bHQgb2JqZWN0IGZvciB3aGljaCB0aGUgZXhwZWN0ZWQgb3V0cHV0IGlzIHRleHQuIEl0IGRvZXMgbm90IGhhdmUgYW4gaW1hZ2UKKyAqIGV4cGVjdGVkIHJlc3VsdC4KKyAqCisgKiA8cD5DcmVhdGVkIGlmIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKSB3YXMgY2FsbGVkLgorICovCitwdWJsaWMgY2xhc3MgVGV4dFJlc3VsdCBleHRlbmRzIEFic3RyYWN0UmVzdWx0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRE9DVU1FTlRfQVNfVEVYVCA9IDA7CisKKyAgICBwcml2YXRlIFN0cmluZyBtRXhwZWN0ZWRSZXN1bHQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUV4cGVjdGVkUmVzdWx0UGF0aDsKKyAgICBwcml2YXRlIFN0cmluZyBtQWN0dWFsUmVzdWx0OworICAgIHByaXZhdGUgU3RyaW5nIG1SZWxhdGl2ZVBhdGg7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EaWRUaW1lT3V0OworICAgIHByaXZhdGUgUmVzdWx0Q29kZSBtUmVzdWx0Q29kZTsKKyAgICB0cmFuc2llbnQgcHJpdmF0ZSBNZXNzYWdlIG1SZXN1bHRPYnRhaW5lZE1zZzsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtRHVtcENoaWxkRnJhbWVzQXNUZXh0OworCisgICAgdHJhbnNpZW50IHByaXZhdGUgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKG1zZy53aGF0ID09IE1TR19ET0NVTUVOVF9BU19URVhUKSB7CisgICAgICAgICAgICAgICAgbUFjdHVhbFJlc3VsdCA9IChTdHJpbmcpbXNnLm9iajsKKyAgICAgICAgICAgICAgICBtUmVzdWx0T2J0YWluZWRNc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIFRleHRSZXN1bHQoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICBtUmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldER1bXBDaGlsZEZyYW1lc0FzVGV4dChib29sZWFuIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCkgeworICAgICAgICBtRHVtcENoaWxkRnJhbWVzQXNUZXh0ID0gZHVtcENoaWxkRnJhbWVzQXNUZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gcmVjcmVhdGUgdGhlIFJlc3VsdCB3aGVuIHJlY2VpdmVkIGJ5IHRoZSBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1bmRsZQorICAgICAqICAgICAgYnVuZGxlIHdpdGggZGF0YSB1c2VkIHRvIHJlY3JlYXRlIHRoZSByZXN1bHQKKyAgICAgKi8KKyAgICBwdWJsaWMgVGV4dFJlc3VsdChCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIG1FeHBlY3RlZFJlc3VsdCA9IGJ1bmRsZS5nZXRTdHJpbmcoImV4cGVjdGVkVGV4dHVhbFJlc3VsdCIpOworICAgICAgICBtRXhwZWN0ZWRSZXN1bHRQYXRoID0gYnVuZGxlLmdldFN0cmluZygiZXhwZWN0ZWRUZXh0dWFsUmVzdWx0UGF0aCIpOworICAgICAgICBtQWN0dWFsUmVzdWx0ID0gYnVuZGxlLmdldFN0cmluZygiYWN0dWFsVGV4dHVhbFJlc3VsdCIpOworICAgICAgICBzZXRBZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZyhidW5kbGUuZ2V0U3RyaW5nKCJhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZyIpKTsKKyAgICAgICAgbVJlbGF0aXZlUGF0aCA9IGJ1bmRsZS5nZXRTdHJpbmcoInJlbGF0aXZlUGF0aCIpOworICAgICAgICBtRGlkVGltZU91dCA9IGJ1bmRsZS5nZXRCb29sZWFuKCJkaWRUaW1lT3V0Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xlYXJSZXN1bHRzKCkgeworICAgICAgICBzdXBlci5jbGVhclJlc3VsdHMoKTsKKyAgICAgICAgbUV4cGVjdGVkUmVzdWx0ID0gbnVsbDsKKyAgICAgICAgbUFjdHVhbFJlc3VsdCA9IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc3VsdENvZGUgZ2V0UmVzdWx0Q29kZSgpIHsKKyAgICAgICAgaWYgKG1SZXN1bHRDb2RlID09IG51bGwpIHsKKyAgICAgICAgICAgIG1SZXN1bHRDb2RlID0gcmVzdWx0c01hdGNoKCkgPyBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLlJFU1VMVFNfTUFUQ0gKKyAgICAgICAgICAgICAgICAgICAgOiBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLlJFU1VMVFNfRElGRkVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtUmVzdWx0Q29kZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVzdWx0c01hdGNoKCkgeworICAgICAgICBhc3NlcnQgbUV4cGVjdGVkUmVzdWx0ICE9IG51bGw7CisgICAgICAgIGFzc2VydCBtQWN0dWFsUmVzdWx0ICE9IG51bGw7CisgICAgICAgIC8vIFRyaW0gbGVhZGluZyBhbmQgdHJhaWxpbmcgZW1wdHkgbGluZXMsIGFzIG90aGVyIFdlYktpdCBwbGF0Zm9ybXMgZG8uCisgICAgICAgIFN0cmluZyBsZWFkaW5nRW1wdHlMaW5lcyA9ICJeXFxuKyI7CisgICAgICAgIFN0cmluZyB0cmFpbGluZ0VtcHR5TGluZXMgPSAiXFxuKyQiOworICAgICAgICBTdHJpbmcgdHJpbW1lZEV4cGVjdGVkUmVzdWx0ID0gbUV4cGVjdGVkUmVzdWx0LnJlcGxhY2VGaXJzdChsZWFkaW5nRW1wdHlMaW5lcywgIiIpCisgICAgICAgICAgICAgICAgLnJlcGxhY2VGaXJzdCh0cmFpbGluZ0VtcHR5TGluZXMsICIiKTsKKyAgICAgICAgU3RyaW5nIHRyaW1tZWRBY3R1YWxSZXN1bHQgPSBtQWN0dWFsUmVzdWx0LnJlcGxhY2VGaXJzdChsZWFkaW5nRW1wdHlMaW5lcywgIiIpCisgICAgICAgICAgICAgICAgLnJlcGxhY2VGaXJzdCh0cmFpbGluZ0VtcHR5TGluZXMsICIiKTsKKyAgICAgICAgcmV0dXJuIHRyaW1tZWRFeHBlY3RlZFJlc3VsdC5lcXVhbHModHJpbW1lZEFjdHVhbFJlc3VsdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZGlkQ3Jhc2goKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBkaWRUaW1lT3V0KCkgeworICAgICAgICByZXR1cm4gbURpZFRpbWVPdXQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RGlkVGltZU91dCgpIHsKKyAgICAgICAgbURpZFRpbWVPdXQgPSB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBieXRlW10gZ2V0QWN0dWFsSW1hZ2VSZXN1bHQoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0dWFsVGV4dFJlc3VsdCgpIHsKKyAgICAgICAgU3RyaW5nIGFkZGl0aW9uYWxUZXh0UmVzdWx0U3RyaW5nID0gZ2V0QWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcoKTsKKyAgICAgICAgaWYgKGFkZGl0aW9uYWxUZXh0UmVzdWx0U3RyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBhZGRpdGlvbmFsVGV4dFJlc3VsdFN0cmluZyArIG1BY3R1YWxSZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbUFjdHVhbFJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZEltYWdlUmVzdWx0KGJ5dGVbXSBleHBlY3RlZFJlc3VsdCkgeworICAgICAgICAvKiogVGhpcyBtZXRob2QgaXMgbm90IGFwcGxpY2FibGUgdG8gdGhpcyB0eXBlIG9mIHJlc3VsdCAqLworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEV4cGVjdGVkSW1hZ2VSZXN1bHRQYXRoKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgLyoqIFRoaXMgbWV0aG9kIGlzIG5vdCBhcHBsaWNhYmxlIHRvIHRoaXMgdHlwZSBvZiByZXN1bHQgKi8KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4cGVjdGVkSW1hZ2VSZXN1bHRQYXRoKCkgeworICAgICAgICAvKiogVGhpcyBtZXRob2QgaXMgbm90IGFwcGxpY2FibGUgdG8gdGhpcyB0eXBlIG9mIHJlc3VsdCAqLworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZFRleHRSZXN1bHRQYXRoKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgbUV4cGVjdGVkUmVzdWx0UGF0aCA9IHJlbGF0aXZlUGF0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4cGVjdGVkVGV4dFJlc3VsdFBhdGgoKSB7CisgICAgICAgIHJldHVybiBtRXhwZWN0ZWRSZXN1bHRQYXRoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEV4cGVjdGVkVGV4dFJlc3VsdChTdHJpbmcgZXhwZWN0ZWRSZXN1bHQpIHsKKyAgICAgICAgLy8gRm9yIHRleHQgcmVzdWx0cywgd2UgdXNlIGFuIGVtcHR5IHN0cmluZyBmb3IgdGhlIGV4cGVjdGVkIHJlc3VsdCB3aGVuIG5vbmUgaXMKKyAgICAgICAgLy8gcHJlc2VudCwgYXMgb3RoZXIgV2ViS2l0IHBsYXRmb3JtcyBkby4KKyAgICAgICAgbUV4cGVjdGVkUmVzdWx0ID0gZXhwZWN0ZWRSZXN1bHQgPT0gbnVsbCA/ICIiIDogZXhwZWN0ZWRSZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXREaWZmQXNIdG1sKCkgeworICAgICAgICBhc3NlcnQgbUV4cGVjdGVkUmVzdWx0ICE9IG51bGw7CisgICAgICAgIGFzc2VydCBtQWN0dWFsUmVzdWx0ICE9IG51bGw7CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBodG1sID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjx0YWJsZSBjbGFzcz1cInZpc3VhbF9kaWZmXCI+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRyIGNsYXNzPVwiaGVhZGVyc1wiPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj5FeHBlY3RlZCByZXN1bHQ6PC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICAgICAgPHRkIGNsYXNzPVwic3BhY2VcIj48L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj5BY3R1YWwgcmVzdWx0OjwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPC90cj4iKTsKKworICAgICAgICBhcHBlbmREaWZmSHRtbChodG1sKTsKKworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ciBjbGFzcz1cImZvb3RlcnNcIj4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCI+PC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICAgICAgPHRkIGNsYXNzPVwic3BhY2VcIj48L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDwvdHI+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8L3RhYmxlPiIpOworCisgICAgICAgIHJldHVybiBodG1sLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZERpZmZIdG1sKFN0cmluZ0J1aWxkZXIgaHRtbCkgeworICAgICAgICBMaW5rZWRMaXN0PGRpZmZfbWF0Y2hfcGF0Y2guRGlmZj4gZGlmZnMgPQorICAgICAgICAgICAgICAgIG5ldyBkaWZmX21hdGNoX3BhdGNoKCkuZGlmZl9tYWluKG1FeHBlY3RlZFJlc3VsdCwgbUFjdHVhbFJlc3VsdCk7CisKKyAgICAgICAgZGlmZnMgPSBWaXN1YWxEaWZmVXRpbHMuc3BsaXREaWZmc09uTmV3bGluZShkaWZmcyk7CisKKyAgICAgICAgTGlua2VkTGlzdDxTdHJpbmc+IGV4cGVjdGVkTGluZXMgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisgICAgICAgIExpbmtlZExpc3Q8SW50ZWdlcj4gZXhwZWN0ZWRMaW5lTnVtcyA9IG5ldyBMaW5rZWRMaXN0PEludGVnZXI+KCk7CisgICAgICAgIExpbmtlZExpc3Q8U3RyaW5nPiBhY3R1YWxMaW5lcyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgTGlua2VkTGlzdDxJbnRlZ2VyPiBhY3R1YWxMaW5lTnVtcyA9IG5ldyBMaW5rZWRMaXN0PEludGVnZXI+KCk7CisKKyAgICAgICAgVmlzdWFsRGlmZlV0aWxzLmdlbmVyYXRlRXhwZWN0ZWRSZXN1bHRMaW5lcyhkaWZmcywgZXhwZWN0ZWRMaW5lTnVtcywgZXhwZWN0ZWRMaW5lcyk7CisgICAgICAgIFZpc3VhbERpZmZVdGlscy5nZW5lcmF0ZUFjdHVhbFJlc3VsdExpbmVzKGRpZmZzLCBhY3R1YWxMaW5lTnVtcywgYWN0dWFsTGluZXMpOworICAgICAgICAvLyBUT0RPOiBXZSBzaG91bGQgdXNlIGEgbWFwIGZvciBlYWNoIGxpbmUgbnVtYmVyIGFuZCBsaW5lcyBwYWlyLgorICAgICAgICBhc3NlcnQgZXhwZWN0ZWRMaW5lcy5zaXplKCkgPT0gZXhwZWN0ZWRMaW5lTnVtcy5zaXplKCk7CisgICAgICAgIGFzc2VydCBhY3R1YWxMaW5lcy5zaXplKCkgPT0gYWN0dWFsTGluZU51bXMuc2l6ZSgpOworICAgICAgICBhc3NlcnQgZXhwZWN0ZWRMaW5lcy5zaXplKCkgPT0gYWN0dWFsTGluZXMuc2l6ZSgpOworCisgICAgICAgIGh0bWwuYXBwZW5kKFZpc3VhbERpZmZVdGlscy5nZXRIdG1sKGV4cGVjdGVkTGluZU51bXMsIGV4cGVjdGVkTGluZXMsCisgICAgICAgICAgICAgICAgYWN0dWFsTGluZU51bXMsIGFjdHVhbExpbmVzKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRlc3RUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBUZXN0VHlwZS5URVhUOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9idGFpbkFjdHVhbFJlc3VsdHMoV2ViVmlldyB3ZWJ2aWV3LCBNZXNzYWdlIHJlc3VsdE9idGFpbmVkTXNnKSB7CisgICAgICAgIG1SZXN1bHRPYnRhaW5lZE1zZyA9IHJlc3VsdE9idGFpbmVkTXNnOworICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0RPQ1VNRU5UX0FTX1RFWFQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBhcmcxIC0gc2hvdWxkIGR1bXAgdG9wIGZyYW1lIGFzIHRleHQKKyAgICAgICAgICogYXJnMiAtIHNob3VsZCBkdW1wIGNoaWxkIGZyYW1lcyBhcyB0ZXh0CisgICAgICAgICAqLworICAgICAgICBtc2cuYXJnMSA9IDE7CisgICAgICAgIG1zZy5hcmcyID0gbUR1bXBDaGlsZEZyYW1lc0FzVGV4dCA/IDEgOiAwOworICAgICAgICB3ZWJ2aWV3LmRvY3VtZW50QXNUZXh0KG1zZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1bmRsZSBnZXRCdW5kbGUoKSB7CisgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoImV4cGVjdGVkVGV4dHVhbFJlc3VsdCIsIG1FeHBlY3RlZFJlc3VsdCk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoImV4cGVjdGVkVGV4dHVhbFJlc3VsdFBhdGgiLCBtRXhwZWN0ZWRSZXN1bHRQYXRoKTsKKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZygiYWN0dWFsVGV4dHVhbFJlc3VsdCIsIGdldEFjdHVhbFRleHRSZXN1bHQoKSk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoImFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nIiwgZ2V0QWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcoKSk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoInJlbGF0aXZlUGF0aCIsIG1SZWxhdGl2ZVBhdGgpOworICAgICAgICBidW5kbGUucHV0Qm9vbGVhbigiZGlkVGltZU91dCIsIG1EaWRUaW1lT3V0KTsKKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZygidHlwZSIsIGdldFR5cGUoKS5uYW1lKCkpOworICAgICAgICByZXR1cm4gYnVuZGxlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKCkgeworICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9WaXN1YWxEaWZmVXRpbHMuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1Zpc3VhbERpZmZVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZjczMTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9WaXN1YWxEaWZmVXRpbHMuamF2YQpAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgbmFtZS5mcmFzZXIubmVpbC5wbGFpbnRleHQuZGlmZl9tYXRjaF9wYXRjaDsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworCisvKioKKyAqIEhlbHBlciBtZXRob2RzIGZvIFRleHRSZXN1bHQuZ2V0RGlmZkFzSHRtbCgpCisgKi8KK3B1YmxpYyBjbGFzcyBWaXN1YWxEaWZmVXRpbHMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERPTlRfUFJJTlRfTElORV9OVU1CRVIgPSAtMTsKKworICAgIC8qKgorICAgICAqIFByZXByb2Nlc3NlcyB0aGUgbGlzdCBvZiBkaWZmcyBzbyB0aGF0IG5ldyBsaW5lIGNoYXJhY3RlcnMgYXBwZWFyIG9ubHkgYXQgdGhlIGVuZCBvZgorICAgICAqIGRpZmYudGV4dAorICAgICAqCisgICAgICogQHBhcmFtIGRpZmZzCisgICAgICogQHJldHVybgorICAgICAqICAgICAgTGlua2VkTGlzdCBvZiBkaWZmcyB3aGVyZSBuZXcgbGluZSBjaGFyYWN0ZXIgYXBwZWFycyBvbmx5IG9uIHRoZSBlbmQgb2YKKyAgICAgKiAgICAgIGRpZmYudGV4dAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlua2VkTGlzdDxkaWZmX21hdGNoX3BhdGNoLkRpZmY+IHNwbGl0RGlmZnNPbk5ld2xpbmUoCisgICAgICAgICAgICBMaW5rZWRMaXN0PGRpZmZfbWF0Y2hfcGF0Y2guRGlmZj4gZGlmZnMpIHsKKyAgICAgICAgTGlua2VkTGlzdDxkaWZmX21hdGNoX3BhdGNoLkRpZmY+IG5ld0RpZmZzID0gbmV3IExpbmtlZExpc3Q8ZGlmZl9tYXRjaF9wYXRjaC5EaWZmPigpOworCisgICAgICAgIFN0cmluZ1tdIHBhcnRzOworICAgICAgICBpbnQgbGVuZ3RoTWludXNPbmU7CisgICAgICAgIGZvciAoZGlmZl9tYXRjaF9wYXRjaC5EaWZmIGRpZmYgOiBkaWZmcykgeworICAgICAgICAgICAgcGFydHMgPSBkaWZmLnRleHQuc3BsaXQoIlxuIiwgLTEpOworICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgbmV3RGlmZnMuYWRkKGRpZmYpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZW5ndGhNaW51c09uZSA9IHBhcnRzLmxlbmd0aCAtIDE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aE1pbnVzT25lOyBpKyspIHsKKyAgICAgICAgICAgICAgICBuZXdEaWZmcy5hZGQobmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihkaWZmLm9wZXJhdGlvbiwgcGFydHNbaV0gKyAiXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXBhcnRzW2xlbmd0aE1pbnVzT25lXS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBuZXdEaWZmcy5hZGQobmV3IGRpZmZfbWF0Y2hfcGF0Y2guRGlmZihkaWZmLm9wZXJhdGlvbiwgcGFydHNbbGVuZ3RoTWludXNPbmVdKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3RGlmZnM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlRXhwZWN0ZWRSZXN1bHRMaW5lcyhMaW5rZWRMaXN0PGRpZmZfbWF0Y2hfcGF0Y2guRGlmZj4gZGlmZnMsCisgICAgICAgICAgICBMaW5rZWRMaXN0PEludGVnZXI+IGxpbmVOdW1zLCBMaW5rZWRMaXN0PFN0cmluZz4gbGluZXMpIHsKKyAgICAgICAgU3RyaW5nIGRlbFNwYW4gPSAiPHNwYW4gY2xhc3M9XCJkZWxcIj4iOworICAgICAgICBTdHJpbmcgZXFsU3BhbiA9ICI8c3BhbiBjbGFzcz1cImVxbFwiPiI7CisKKyAgICAgICAgU3RyaW5nIGxpbmUgPSAiIjsKKyAgICAgICAgaW50IGkgPSAxOworICAgICAgICBkaWZmX21hdGNoX3BhdGNoLkRpZmYgZGlmZjsKKyAgICAgICAgaW50IHNpemUgPSBkaWZmcy5zaXplKCk7CisgICAgICAgIGJvb2xlYW4gaXNMYXN0RGlmZjsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKKyAgICAgICAgICAgIGRpZmYgPSBkaWZmcy5nZXQoaik7CisgICAgICAgICAgICBpc0xhc3REaWZmID0gaiA9PSBzaXplIC0gMTsKKyAgICAgICAgICAgIHN3aXRjaCAoZGlmZi5vcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBjYXNlIERFTEVURToKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHByb2Nlc3NEaWZmKGRpZmYsIGxpbmVOdW1zLCBsaW5lcywgbGluZSwgaSwgZGVsU3BhbiwgaXNMYXN0RGlmZik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgSU5TRVJUOgorICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGluZSBpcyBjdXJyZW50bHkgZW1wdHkgYW5kIHRoaXMgaW5zZXJ0aW9uIGlzIHRoZSBlbnRpcmUgbGluZSwgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkIGxpbmUgaXMgYWJzZW50LCBzbyBpdCBoYXMgbm8gbGluZSBudW1iZXIuCisgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmLnRleHQuZW5kc1dpdGgoIlxuIikgfHwgaXNMYXN0RGlmZikgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bXMuYWRkKGxpbmUuZXF1YWxzKCIiKSA/IERPTlRfUFJJTlRfTElORV9OVU1CRVIgOiBpKyspOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYWRkKGxpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9ICIiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBFUVVBTDoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHByb2Nlc3NEaWZmKGRpZmYsIGxpbmVOdW1zLCBsaW5lcywgbGluZSwgaSwgZXFsU3BhbiwgaXNMYXN0RGlmZik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZUFjdHVhbFJlc3VsdExpbmVzKExpbmtlZExpc3Q8ZGlmZl9tYXRjaF9wYXRjaC5EaWZmPiBkaWZmcywKKyAgICAgICAgICAgIExpbmtlZExpc3Q8SW50ZWdlcj4gbGluZU51bXMsIExpbmtlZExpc3Q8U3RyaW5nPiBsaW5lcykgeworICAgICAgICBTdHJpbmcgaW5zU3BhbiA9ICI8c3BhbiBjbGFzcz1cImluc1wiPiI7CisgICAgICAgIFN0cmluZyBlcWxTcGFuID0gIjxzcGFuIGNsYXNzPVwiZXFsXCI+IjsKKworICAgICAgICBTdHJpbmcgbGluZSA9ICIiOworICAgICAgICBpbnQgaSA9IDE7CisgICAgICAgIGRpZmZfbWF0Y2hfcGF0Y2guRGlmZiBkaWZmOworICAgICAgICBpbnQgc2l6ZSA9IGRpZmZzLnNpemUoKTsKKyAgICAgICAgYm9vbGVhbiBpc0xhc3REaWZmOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykgeworICAgICAgICAgICAgZGlmZiA9IGRpZmZzLmdldChqKTsKKyAgICAgICAgICAgIGlzTGFzdERpZmYgPSBqID09IHNpemUgLSAxOworICAgICAgICAgICAgc3dpdGNoIChkaWZmLm9wZXJhdGlvbikgeworICAgICAgICAgICAgICAgIGNhc2UgSU5TRVJUOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gcHJvY2Vzc0RpZmYoZGlmZiwgbGluZU51bXMsIGxpbmVzLCBsaW5lLCBpLCBpbnNTcGFuLCBpc0xhc3REaWZmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBERUxFVEU6CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBsaW5lIGlzIGN1cnJlbnRseSBlbXB0eSBhbmQgZGVsZXRpb24gaXMgdGhlIGVudGlyZSBsaW5lLCB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gYWN0dWFsIGxpbmUgaXMgYWJzZW50LCBzbyBpdCBoYXMgbm8gbGluZSBudW1iZXIuCisgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmLnRleHQuZW5kc1dpdGgoIlxuIikgfHwgaXNMYXN0RGlmZikgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bXMuYWRkKGxpbmUuZXF1YWxzKCIiKSA/IERPTlRfUFJJTlRfTElORV9OVU1CRVIgOiBpKyspOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYWRkKGxpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9ICIiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBFUVVBTDoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHByb2Nlc3NEaWZmKGRpZmYsIGxpbmVOdW1zLCBsaW5lcywgbGluZSwgaSwgZXFsU3BhbiwgaXNMYXN0RGlmZik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIG9yIGFwcGVuZCBhIGxpbmUgZm9yIGEgZ2l2ZW4gZGlmZiBhbmQgYWRkIGl0IHRvIGdpdmVuIGNvbGxlY3Rpb25zIGlmIG5lY2Vzc2FyeS4KKyAgICAgKiBJdCBwdXRzIGRpZmZzIGluIEhUTUwgc3BhbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlmZgorICAgICAqIEBwYXJhbSBsaW5lTnVtcworICAgICAqIEBwYXJhbSBsaW5lcworICAgICAqIEBwYXJhbSBsaW5lCisgICAgICogQHBhcmFtIGkKKyAgICAgKiBAcGFyYW0gYmVnU3BhbgorICAgICAqIEBwYXJhbSBmb3JjZU91dHB1dExpbmUgRm9yY2UgdGhlIGN1cnJlbnQgbGluZSB0byBiZSBvdXRwdXQKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0RpZmYoZGlmZl9tYXRjaF9wYXRjaC5EaWZmIGRpZmYsIExpbmtlZExpc3Q8SW50ZWdlcj4gbGluZU51bXMsCisgICAgICAgICAgICBMaW5rZWRMaXN0PFN0cmluZz4gbGluZXMsIFN0cmluZyBsaW5lLCBpbnQgaSwgU3RyaW5nIGJlZ1NwYW4sIGJvb2xlYW4gZm9yY2VPdXRwdXRMaW5lKSB7CisgICAgICAgIFN0cmluZyBlbmRTcGFuID0gIjwvc3Bhbj4iOworICAgICAgICBTdHJpbmcgYnIgPSAiJm5ic3A7IjsKKworICAgICAgICBpZiAoZGlmZi50ZXh0LmVuZHNXaXRoKCJcbiIpIHx8IGZvcmNlT3V0cHV0TGluZSkgeworICAgICAgICAgICAgbGluZU51bXMuYWRkKGkpOworICAgICAgICAgICAgLyoqIFRPRE86IFRoaW5rIG9mIGJldHRlciB3YXkgdG8gcmVwbGFjZSBzdHVmZiAqLworICAgICAgICAgICAgbGluZSArPSBiZWdTcGFuICsgZGlmZi50ZXh0LnJlcGxhY2UoIiAgIiwgIiZuYnNwOyZuYnNwOyIpCisgICAgICAgICAgICAgICAgICAgICsgZW5kU3BhbiArIGJyOworICAgICAgICAgICAgbGluZXMuYWRkKGxpbmUpOworICAgICAgICAgICAgbGluZSA9ICIiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGluZSArPSBiZWdTcGFuICsgZGlmZi50ZXh0LnJlcGxhY2UoIiAgIiwgIiZuYnNwOyZuYnNwOyIpICsgZW5kU3BhbjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsaW5lOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEh0bWwoTGlua2VkTGlzdDxJbnRlZ2VyPiBsaW5lTnVtczEsIExpbmtlZExpc3Q8U3RyaW5nPiBsaW5lczEsCisgICAgICAgICAgICBMaW5rZWRMaXN0PEludGVnZXI+IGxpbmVOdW1zMiwgTGlua2VkTGlzdDxTdHJpbmc+IGxpbmVzMikgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGh0bWwgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBpbnQgbGluZU51bTsKKyAgICAgICAgaW50IHNpemUgPSBsaW5lczEuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjx0ciBjbGFzcz1cInJlc3VsdHNcIj4iKTsKKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQgY2xhc3M9XCJsaW5lX2NvdW50XCI+Iik7CisgICAgICAgICAgICBsaW5lTnVtID0gbGluZU51bXMxLnJlbW92ZUZpcnN0KCk7CisgICAgICAgICAgICBpZiAobGluZU51bSA+IDApIHsKKyAgICAgICAgICAgICAgICBodG1sLmFwcGVuZChsaW5lTnVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPC90ZD4iKTsKKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQgY2xhc3M9XCJsaW5lXCI+Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZChsaW5lczEucmVtb3ZlRmlyc3QoKSk7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiICAgIDwvdGQ+Iik7CisKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkIGNsYXNzPVwic3BhY2VcIj48L3RkPiIpOworCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZCBjbGFzcz1cImxpbmVfY291bnRcIj4iKTsKKyAgICAgICAgICAgIGxpbmVOdW0gPSBsaW5lTnVtczIucmVtb3ZlRmlyc3QoKTsKKyAgICAgICAgICAgIGlmIChsaW5lTnVtID4gMCkgeworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKGxpbmVOdW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8L3RkPiIpOworCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZCBjbGFzcz1cImxpbmVcIj4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKGxpbmVzMi5yZW1vdmVGaXJzdCgpKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPC90ZD4iKTsKKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjwvdHI+Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGh0bWwudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvQWRiVXRpbHMuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL2ZvcndhcmRlci9BZGJVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNDUwOWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvQWRiVXRpbHMuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuZm9yd2FyZGVyOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CisKKy8qKgorICogVGhlIHV0aWxpdHkgY2xhc3MgdGhhdCBjYW4gc2V0dXAgYSBzb2NrZXQgYWxsb3dpbmcgdGhlIGRldmljZSB0byBjb21tdW5pY2F0ZSB3aXRoIHJlbW90ZQorICogbWFjaGluZXMgdGhyb3VnaCB0aGUgbWFjaGluZSB0aGF0IHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIHZpYSBhZGIuCisgKi8KK3B1YmxpYyBjbGFzcyBBZGJVdGlscyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiQWRiVXRpbHMiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQl9PSyA9ICJPS0FZIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQURCX1BPUlQgPSA1MDM3OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREJfSE9TVCA9ICIxMjcuMC4wLjEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBREJfUkVTUE9OU0VfU0laRSA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHNvY2tldCB0aGF0IGNhbiBiZSBjb25maWd1cmVkIHRvIHNlcnZlIGFzIGEgdHJhbnNwYXJlbnQgcHJveHkgdG8gYQorICAgICAqIHJlbW90ZSBtYWNoaW5lLiBUaGlzIGNhbiBiZSBhY2hpZXZlZCBieSBjYWxsaW5nIGNvbmZpZ3VyZVNvY2tldCgpCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgc29ja2V0IHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gbGluayB0byByZW1vdGUgbWFjaGluZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNvY2tldCBjcmVhdGVTb2NrZXQoKSB0aHJvd3MgSU9FeGNlcHRpb257CisgICAgICAgIHJldHVybiBuZXcgU29ja2V0KEFEQl9IT1NULCBBREJfUE9SVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyB0aGUgY29ubmVjdGlvbiB0byBzZXJ2ZSBhcyBhIHRyYW5zcGFyZW50IHByb3h5IHRvIGEgcmVtb3RlIG1hY2hpbmUuCisgICAgICogVGhlIGdpdmVuIHN0cmVhbXMgbXVzdCBiZWxvbmcgdG8gYSBzb2NrZXQgY3JlYXRlZCBieSBjcmVhdGVTb2NrZXQoKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSBvZiB0aGUgc29ja2V0IHdlIHdhbnQgdG8gY29uZmlndXJlCisgICAgICogQHBhcmFtIG91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gb2YgdGhlIHNvY2tldCB3ZSB3YW50IHRvIGNvbmZpZ3VyZQorICAgICAqIEBwYXJhbSByZW1vdGVBZGRyZXNzIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBtYWNoaW5lIChhcyB5b3Ugd291bGQgdHlwZSBpbiBhIGJyb3dzZXIKKyAgICAgKiAgICAgIGluIGEgbWFjaGluZSB0aGF0IHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIHZpYSBhZGIpCisgICAgICogQHBhcmFtIHJlbW90ZVBvcnQgcG9ydCBvbiB3aGljaCB0byBjb25uZWN0CisgICAgICogQHJldHVybiBpZiB0aGUgY29uZmlndXJhdGlvbiBzdWNlZWRlZAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29uZmlndXJlQ29ubmVjdGlvbihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwKKyAgICAgICAgICAgIFN0cmluZyByZW1vdGVBZGRyZXNzLCBpbnQgcmVtb3RlUG9ydCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGNtZCA9ICJ0Y3A6IiArIHJlbW90ZVBvcnQgKyAiOiIgKyByZW1vdGVBZGRyZXNzOworICAgICAgICBjbWQgPSBTdHJpbmcuZm9ybWF0KCIlMDRYIiwgY21kLmxlbmd0aCgpKSArIGNtZDsKKworICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbQURCX1JFU1BPTlNFX1NJWkVdOworICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoY21kLmdldEJ5dGVzKCkpOworICAgICAgICBpbnQgcmVhZCA9IGlucHV0U3RyZWFtLnJlYWQoYnVmKTsKKyAgICAgICAgaWYgKHJlYWQgIT0gQURCX1JFU1BPTlNFX1NJWkUgfHwgIUFEQl9PSy5lcXVhbHMobmV3IFN0cmluZyhidWYpKSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgImFkYiBjbWQgZmFpbGVkLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL2ZvcndhcmRlci9Db25uZWN0aW9uSGFuZGxlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvZm9yd2FyZGVyL0Nvbm5lY3Rpb25IYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5Y2Q0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL2ZvcndhcmRlci9Db25uZWN0aW9uSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuZm9yd2FyZGVyOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5Gc1V0aWxzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKKworLyoqCisgKiBXb3JrZXIgY2xhc3MgZm9yIHtAbGluayBGb3J3YXJkZXJ9LiBBIENvbm5lY3Rpb25IYW5kbGVyIHdpbGwgYmUgY3JlYXRlZCBvbmNlIHRoZSBGb3J3YXJkZXIKKyAqIGFjY2VwdHMgYW4gaW5jb21pbmcgY29ubmVjdGlvbiwgYW5kIGl0IHdpbGwgdGhlbiBmb3J3YXJkIHRoZSBpbmNvbWluZy9vdXRnb2luZyBzdHJlYW1zIHRvIGEKKyAqIGNvbm5lY3Rpb24gYWxyZWFkeSBwcm94aWVkIGJ5IGFkYiBuZXR3b3JraW5nIChzZWUgYWxzbyB7QGxpbmsgQWRiVXRpbHN9KS4KKyAqLworcHVibGljIGNsYXNzIENvbm5lY3Rpb25IYW5kbGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkNvbm5lY3Rpb25IYW5kbGVyIjsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE9uRmluaXNoZWRDYWxsYmFjayB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoZWQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFNvY2tldFBpcGVUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworCisgICAgICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gbUlucHV0U3RyZWFtOworICAgICAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBtT3V0cHV0U3RyZWFtOworCisgICAgICAgIHB1YmxpYyBTb2NrZXRQaXBlVGhyZWFkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7CisgICAgICAgICAgICBtSW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKKyAgICAgICAgICAgIG1PdXRwdXRTdHJlYW0gPSBvdXRwdXRTdHJlYW07CisgICAgICAgICAgICBzZXROYW1lKCJTb2NrZXRQaXBlVGhyZWFkOiAiICsgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNDA5Nl07CisgICAgICAgICAgICBpbnQgbGVuZ3RoOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGxlbmd0aCA9IG1JbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlcikpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbS53cml0ZShidWZmZXIsIDAsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvKiogVGhpcyBleGNlcHRpb24gbWVhbnMgb25lIG9mIHRoZSBzdHJlYW1zIGlzIGNsb3NlZCAqLworICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dfVEFHLCB0aGlzLnRvU3RyaW5nKCksIGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVRocmVhZHNSdW5uaW5nKSB7CisgICAgICAgICAgICAgICAgbVRocmVhZHNSdW5uaW5nLS07CisgICAgICAgICAgICAgICAgaWYgKG1UaHJlYWRzUnVubmluZyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25IYW5kbGVyLnRoaXMuc3RvcCgpOworICAgICAgICAgICAgICAgICAgICBtT25GaW5pc2hlZENhbGxiYWNrLm9uRmluaXNoZWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXROYW1lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEludGVnZXIgbVRocmVhZHNSdW5uaW5nOworCisgICAgcHJpdmF0ZSBTb2NrZXQgbUZyb21Tb2NrZXQsIG1Ub1NvY2tldDsKKyAgICBwcml2YXRlIFNvY2tldFBpcGVUaHJlYWQgbUZyb21Ub1BpcGUsIG1Ub0Zyb21QaXBlOworICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gbUZyb21Tb2NrZXRJbnB1dFN0cmVhbSwgbVRvU29ja2V0SW5wdXRTdHJlYW07CisgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gbUZyb21Tb2NrZXRPdXRwdXRTdHJlYW0sIG1Ub1NvY2tldE91dHB1dFN0cmVhbTsKKworICAgIHByaXZhdGUgaW50IG1Qb3J0OworICAgIHByaXZhdGUgU3RyaW5nIG1SZW1vdGVNYWNoaW5lSXBBZGRyZXNzOworCisgICAgcHJpdmF0ZSBPbkZpbmlzaGVkQ2FsbGJhY2sgbU9uRmluaXNoZWRDYWxsYmFjazsKKworICAgIHB1YmxpYyBDb25uZWN0aW9uSGFuZGxlcihTdHJpbmcgcmVtb3RlTWFjaGluZUlwLCBpbnQgcG9ydCwgU29ja2V0IGZyb21Tb2NrZXQsIFNvY2tldCB0b1NvY2tldCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG1SZW1vdGVNYWNoaW5lSXBBZGRyZXNzID0gcmVtb3RlTWFjaGluZUlwOworICAgICAgICBtUG9ydCA9IHBvcnQ7CisKKyAgICAgICAgbUZyb21Tb2NrZXQgPSBmcm9tU29ja2V0OworICAgICAgICBtVG9Tb2NrZXQgPSB0b1NvY2tldDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUZyb21Tb2NrZXRJbnB1dFN0cmVhbSA9IG1Gcm9tU29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBtVG9Tb2NrZXRJbnB1dFN0cmVhbSA9IG1Ub1NvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgbUZyb21Tb2NrZXRPdXRwdXRTdHJlYW0gPSBtRnJvbVNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIG1Ub1NvY2tldE91dHB1dFN0cmVhbSA9IG1Ub1NvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIEFkYlV0aWxzLmNvbmZpZ3VyZUNvbm5lY3Rpb24obVRvU29ja2V0SW5wdXRTdHJlYW0sIG1Ub1NvY2tldE91dHB1dFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgbVJlbW90ZU1hY2hpbmVJcEFkZHJlc3MsIG1Qb3J0KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVuYWJsZSB0byBzdGFydCBDb25uZWN0aW9uSGFuZGxlciIsIGUpOworICAgICAgICAgICAgY2xvc2VTdHJlYW1zKCk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisKKyAgICAgICAgbUZyb21Ub1BpcGUgPSBuZXcgU29ja2V0UGlwZVRocmVhZChtRnJvbVNvY2tldElucHV0U3RyZWFtLCBtVG9Tb2NrZXRPdXRwdXRTdHJlYW0pOworICAgICAgICBtVG9Gcm9tUGlwZSA9IG5ldyBTb2NrZXRQaXBlVGhyZWFkKG1Ub1NvY2tldElucHV0U3RyZWFtLCBtRnJvbVNvY2tldE91dHB1dFN0cmVhbSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJPbkNvbm5lY3Rpb25IYW5kbGVyRmluaXNoZWRDYWxsYmFjayhPbkZpbmlzaGVkQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgbU9uRmluaXNoZWRDYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjbG9zZVN0cmVhbXMoKSB7CisgICAgICAgIEZzVXRpbHMuY2xvc2VJbnB1dFN0cmVhbShtRnJvbVNvY2tldElucHV0U3RyZWFtKTsKKyAgICAgICAgRnNVdGlscy5jbG9zZUlucHV0U3RyZWFtKG1Ub1NvY2tldElucHV0U3RyZWFtKTsKKyAgICAgICAgRnNVdGlscy5jbG9zZU91dHB1dFN0cmVhbShtRnJvbVNvY2tldE91dHB1dFN0cmVhbSk7CisgICAgICAgIEZzVXRpbHMuY2xvc2VPdXRwdXRTdHJlYW0obVRvU29ja2V0T3V0cHV0U3RyZWFtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgLyoqIFdlIGhhdmUgMiB0aHJlYWRzIHJ1bm5pbmcsIG9uZSBmb3IgZWFjaCBwaXBlLCB0aGF0IHdlIHN0YXJ0IGhlcmUuICovCisgICAgICAgIG1UaHJlYWRzUnVubmluZyA9IDI7CisgICAgICAgIG1Gcm9tVG9QaXBlLnN0YXJ0KCk7CisgICAgICAgIG1Ub0Zyb21QaXBlLnN0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgc2h1dGRvd24obUZyb21Tb2NrZXQpOworICAgICAgICBzaHV0ZG93bihtVG9Tb2NrZXQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzaHV0ZG93bihTb2NrZXQgc29ja2V0KSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUZyb21Ub1BpcGUpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVRvRnJvbVBpcGUpIHsKKyAgICAgICAgICAgICAgICAvKiogVGhpcyB3aWxsIHN0b3AgdGhlIHdoaWxlIGxvb3AgaW4gdGhlIHJ1biBtZXRob2QgKi8KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXNvY2tldC5pc0lucHV0U2h1dGRvd24oKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LnNodXRkb3duSW5wdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIm1Gcm9tVG9QaXBlPSIgKyBtRnJvbVRvUGlwZSArICIgbVRvRnJvbVBpcGU9IiArIG1Ub0Zyb21QaXBlLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzb2NrZXQuaXNPdXRwdXRTaHV0ZG93bigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuc2h1dGRvd25PdXRwdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIm1Gcm9tVG9QaXBlPSIgKyBtRnJvbVRvUGlwZSArICIgbVRvRnJvbVBpcGU9IiArIG1Ub0Zyb21QaXBlLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzb2NrZXQuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJtRnJvbVRvUGlwZT0iICsgbUZyb21Ub1BpcGUgKyAiIG1Ub0Zyb21QaXBlPSIgKyBtVG9Gcm9tUGlwZSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvZm9yd2FyZGVyL0ZvcndhcmRlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvZm9yd2FyZGVyL0ZvcndhcmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMjJmYTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvRm9yd2FyZGVyLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5mb3J3YXJkZXI7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSBwb3J0IGZvcndhcmRpbmcgc2VydmVyLiBMaXN0ZW5zIG9uIGxvY2FsaG9zdCBvbiBzcGVjaWZpZWQgcG9ydCBhbmQgZm9yd2FyZHMgdGhlIHRjcAorICogY29tbXVuaWNhdGlvbnMgdG8gZXh0ZXJuYWwgc29ja2V0IHZpYSBhZGIgbmV0d29ya2luZyBwcm94eS4KKyAqLworcHVibGljIGNsYXNzIEZvcndhcmRlciBleHRlbmRzIFRocmVhZCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiRm9yd2FyZGVyIjsKKworICAgIHByaXZhdGUgaW50IG1Qb3J0OworICAgIHByaXZhdGUgU3RyaW5nIG1SZW1vdGVNYWNoaW5lSXBBZGRyZXNzOworCisgICAgcHJpdmF0ZSBTZXJ2ZXJTb2NrZXQgbVNlcnZlclNvY2tldDsKKworICAgIHByaXZhdGUgU2V0PENvbm5lY3Rpb25IYW5kbGVyPiBtQ29ubmVjdGlvbkhhbmRsZXJzID0gbmV3IEhhc2hTZXQ8Q29ubmVjdGlvbkhhbmRsZXI+KCk7CisKKyAgICBwdWJsaWMgRm9yd2FyZGVyKGludCBwb3J0LCBTdHJpbmcgcmVtb3RlTWFjaGluZUlwQWRkcmVzcykgeworICAgICAgICBtUG9ydCA9IHBvcnQ7CisgICAgICAgIG1SZW1vdGVNYWNoaW5lSXBBZGRyZXNzID0gcmVtb3RlTWFjaGluZUlwQWRkcmVzczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgInN0YXJ0KCk6IFN0YXJ0aW5nIGZvd2FyZGVyIG9uIHBvcnQ6ICIgKyBtUG9ydCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KG1Qb3J0KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIm1Qb3J0PSIgKyBtUG9ydCwgZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzdXBlci5zdGFydCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFNvY2tldCBsb2NhbFNvY2tldDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbG9jYWxTb2NrZXQgPSBtU2VydmVyU29ja2V0LmFjY2VwdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8qKiBUaGlzIG1vc3QgbGlrZWx5IG1lYW5zIHRoYXQgbVNlcnZlclNvY2tldCBpcyBhbHJlYWR5IGNsb3NlZCAqLworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJtUG9ydD0iICsgbVBvcnQsIGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTb2NrZXQgcmVtb3RlU29ja2V0ID0gbnVsbDsKKyAgICAgICAgICAgIGZpbmFsIENvbm5lY3Rpb25IYW5kbGVyIGNvbm5lY3Rpb25IYW5kbGVyOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZW1vdGVTb2NrZXQgPSBBZGJVdGlscy5jcmVhdGVTb2NrZXQoKTsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uSGFuZGxlciA9IG5ldyBDb25uZWN0aW9uSGFuZGxlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZW1vdGVNYWNoaW5lSXBBZGRyZXNzLCBtUG9ydCwgbG9jYWxTb2NrZXQsIHJlbW90ZVNvY2tldCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBsb2NhbFNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIm1Qb3J0PSIgKyBtUG9ydCwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZW1vdGVTb2NrZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJtUG9ydD0iICsgbVBvcnQsIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFdlIGhhdmUgdG8gY2xvc2UgdGhlIHNvY2tldHMgYWZ0ZXIgdGhlIENvbm5lY3Rpb25IYW5kbGVyIGZpbmlzaGVzLCBzbyB3ZQorICAgICAgICAgICAgICogZG9uJ3QgZ2V0ICJUb28gbWF5IG9wZW4gZmlsZXMiIGV4Y2VwdGlvbi4gV2UgYWxzbyByZW1vdmUgdGhlIENvbm5lY3Rpb25IYW5kbGVyCisgICAgICAgICAgICAgKiBmcm9tIHRoZSBjb2xsZWN0aW9uIHRvIGF2b2lkIG1lbW9yeSBpc3N1ZXMuCisgICAgICAgICAgICAgKiAqLworICAgICAgICAgICAgQ29ubmVjdGlvbkhhbmRsZXIuT25GaW5pc2hlZENhbGxiYWNrIGNhbGxiYWNrID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IENvbm5lY3Rpb25IYW5kbGVyLk9uRmluaXNoZWRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaGVkKCkgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUNvbm5lY3Rpb25IYW5kbGVycy5yZW1vdmUoY29ubmVjdGlvbkhhbmRsZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogInJlbW92ZUNvbm5lY3Rpb25IYW5kbGVyKCk6IG5vdCBpbiB0aGUgY29sbGVjdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgY29ubmVjdGlvbkhhbmRsZXIucmVnaXN0ZXJPbkNvbm5lY3Rpb25IYW5kbGVyRmluaXNoZWRDYWxsYmFjayhjYWxsYmFjayk7CisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSGFuZGxlcnMuYWRkKGNvbm5lY3Rpb25IYW5kbGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbm5lY3Rpb25IYW5kbGVyLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGZvciAoQ29ubmVjdGlvbkhhbmRsZXIgY29ubmVjdGlvbkhhbmRsZXIgOiBtQ29ubmVjdGlvbkhhbmRsZXJzKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbkhhbmRsZXIuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZlclNvY2tldC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAibVBvcnQ9IiArIG1Qb3J0LCBlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL2ZvcndhcmRlci9Gb3J3YXJkZXJNYW5hZ2VyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvRm9yd2FyZGVyTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZjQzNmZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvZm9yd2FyZGVyL0ZvcndhcmRlck1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLmZvcndhcmRlcjsKKworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSBzaW1wbGUgY2xhc3MgdG8gc3RhcnQgYW5kIHN0b3AgRm9yd2FyZGVycyBydW5uaW5nIG9uIHNvbWUgcG9ydHMuCisgKgorICogSXQgdXNlcyBhIHNpbmdsZXRvbiBwYXR0ZXJuIGFuZCBpcyB0aHJlYWQgc2FmZS4KKyAqLworcHVibGljIGNsYXNzIEZvcndhcmRlck1hbmFnZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkZvcndhcmRlck1hbmFnZXIiOworCisgICAgLyoqCisgICAgICogVGhlIElQIGFkZHJlc3Mgb2YgdGhlIHNlcnZlciBzZXJ2aW5nIHRoZSB0ZXN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVF9JUCA9ICIxMjcuMC4wLjEiOworCisgICAgLyoqCisgICAgICogV2UgdXNlIHRoZXNlIHBvcnRzIGJlY2F1c2Ugb3RoZXIgd2Via2l0IHBsYXRmb3JtcyBkby4gVGhleSBhcmUgc2V0IHVwIGluCisgICAgICogZXh0ZXJuYWwvd2Via2l0L0xheW91dFRlc3RzL2h0dHAvY29uZi9hcGFjaGUyLWRlYmlhbi1odHRwZC5jb25mCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9QT1JUID0gODAwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQU19QT1JUID0gODQ0MzsKKworICAgIHByaXZhdGUgc3RhdGljIEZvcndhcmRlck1hbmFnZXIgZm9yd2FyZGVyTWFuYWdlcjsKKworICAgIHByaXZhdGUgU2V0PEZvcndhcmRlcj4gbUZvcndhcmRlcnM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1N0YXJ0ZWQ7CisKKyAgICBwcml2YXRlIEZvcndhcmRlck1hbmFnZXIoKSB7CisgICAgICAgIG1Gb3J3YXJkZXJzID0gbmV3IEhhc2hTZXQ8Rm9yd2FyZGVyPigyKTsKKyAgICAgICAgbUZvcndhcmRlcnMuYWRkKG5ldyBGb3J3YXJkZXIoSFRUUF9QT1JULCBIT1NUX0lQKSk7CisgICAgICAgIG1Gb3J3YXJkZXJzLmFkZChuZXcgRm9yd2FyZGVyKEhUVFBTX1BPUlQsIEhPU1RfSVApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYWluIHBhcnQgb2YgdGhlIFVSTCB3aXRoIHRoZSB0cmFpbGluZyBzbGFzaAorICAgICAqCisgICAgICogQHBhcmFtIGlzSHR0cHMKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0SG9zdFNjaGVtZVBvcnQoYm9vbGVhbiBpc0h0dHBzKSB7CisgICAgICAgIGludCBwb3J0OworICAgICAgICBTdHJpbmcgcHJvdG9jb2w7CisgICAgICAgIGlmIChpc0h0dHBzKSB7CisgICAgICAgICAgICBwcm90b2NvbCA9ICJodHRwcyI7CisgICAgICAgICAgICBwb3J0ID0gSFRUUFNfUE9SVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByb3RvY29sID0gImh0dHAiOworICAgICAgICAgICAgcG9ydCA9IEhUVFBfUE9SVDsKKyAgICAgICAgfQorCisgICAgICAgIFVSTCB1cmwgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdXJsID0gbmV3IFVSTChwcm90b2NvbCwgSE9TVF9JUCwgcG9ydCwgIi8iKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6ICJpc0h0dHBzPSIgKyBpc0h0dHBzOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHVybC50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEZvcndhcmRlck1hbmFnZXIgZ2V0Rm9yd2FyZGVyTWFuYWdlcigpIHsKKyAgICAgICAgaWYgKGZvcndhcmRlck1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgZm9yd2FyZGVyTWFuYWdlciA9IG5ldyBGb3J3YXJkZXJNYW5hZ2VyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZvcndhcmRlck1hbmFnZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgaWYgKG1Jc1N0YXJ0ZWQpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJzdGFydCgpOiBGb3J3YXJkZXJNYW5hZ2VyIGFscmVhZHkgcnVubmluZyEgTk9PUC4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoRm9yd2FyZGVyIGZvcndhcmRlciA6IG1Gb3J3YXJkZXJzKSB7CisgICAgICAgICAgICBmb3J3YXJkZXIuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1Jc1N0YXJ0ZWQgPSB0cnVlOworICAgICAgICBMb2cuaShMT0dfVEFHLCAiRm9yd2FyZGVyTWFuYWdlciBzdGFydGVkLiIpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgeworICAgICAgICBpZiAoIW1Jc1N0YXJ0ZWQpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJzdG9wKCk6IEZvcndhcmRlck1hbmFnZXIgYWxyZWFkeSBzdG9wcGVkISBOT09QLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChGb3J3YXJkZXIgZm9yd2FyZGVyIDogbUZvcndhcmRlcnMpIHsKKyAgICAgICAgICAgIGZvcndhcmRlci5maW5pc2goKTsKKyAgICAgICAgfQorCisgICAgICAgIG1Jc1N0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgIkZvcndhcmRlck1hbmFnZXIgc3RvcHBlZC4iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9zY3JpcHRzdXBwb3J0L09uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2suamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3NjcmlwdHN1cHBvcnQvT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZDQzNjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9zY3JpcHRzdXBwb3J0L09uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2suamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuc2NyaXB0c3VwcG9ydDsKKworLyoqCisgKiBDYWxsYmFjayB1c2VkIHRvIGluZm9ybSBzY3JpcHRzdXBwb3J0LlN0YXJ0ZXIgdGhhdCBldmVyeXRoaW5nIGlzIGZpbmlzaGVkIGFuZAorICogd2UgY2FuIGV4aXQKKyAqLworcHVibGljIGludGVyZmFjZSBPbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrIHsKKyAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaGVkKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9TY3JpcHRUZXN0UnVubmVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9zY3JpcHRzdXBwb3J0L1NjcmlwdFRlc3RSdW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGY1OGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9TY3JpcHRUZXN0UnVubmVyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnNjcmlwdHN1cHBvcnQ7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjsKKworLyoqCisgKiBFeHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgdG8gYWxsb3cgdGhlIHNjcmlwdCB0byBwYXNzIGFyZ3VtZW50cyB0byB0aGUgYXBwbGljYXRpb24KKyAqLworcHVibGljIGNsYXNzIFNjcmlwdFRlc3RSdW5uZXIgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIHsKKyAgICBTdHJpbmcgbVRlc3RzUmVsYXRpdmVQYXRoOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGFyZ3VtZW50cykgeworICAgICAgICBtVGVzdHNSZWxhdGl2ZVBhdGggPSBhcmd1bWVudHMuZ2V0U3RyaW5nKCJwYXRoIik7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGFyZ3VtZW50cyk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZXN0c1JlbGF0aXZlUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1UZXN0c1JlbGF0aXZlUGF0aDsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9TdGFydGVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9zY3JpcHRzdXBwb3J0L1N0YXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjQxYTBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9TdGFydGVyLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnNjcmlwdHN1cHBvcnQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLlRlc3RzTGlzdEFjdGl2aXR5OworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5mb3J3YXJkZXIuRm9yd2FyZGVyTWFuYWdlcjsKKworLyoqCisgKiBBIGNsYXNzIHdoaWNoIHByb3ZpZGVzIG1ldGhvZHMgdGhhdCBjYW4gYmUgaW52b2tlZCBieSBhIHNjcmlwdCBydW5uaW5nIG9uIHRoZSBob3N0IG1hY2hpbmUgdG8KKyAqIHJ1biB0aGUgdGVzdHMuCisgKgorICogSXQgc3RhcnRzIGEgVGVzdHNMaXN0QWN0aXZpdHkgYW5kIGRvZXMgbm90IHJldHVybiB1bnRpbCBhbGwgdGhlIHRlc3RzIGZpbmlzaCBleGVjdXRpbmcuCisgKi8KK3B1YmxpYyBjbGFzcyBTdGFydGVyIGV4dGVuZHMgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8VGVzdHNMaXN0QWN0aXZpdHk+IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJTdGFydGVyIjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUV2ZXJ5dGhpbmdGaW5pc2hlZDsKKworICAgIHB1YmxpYyBTdGFydGVyKCkgeworICAgICAgICBzdXBlcihUZXN0c0xpc3RBY3Rpdml0eS5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyb20gYWRiIHRvIHN0YXJ0IGV4ZWN1dGluZyB0aGUgdGVzdHMuIEl0IGRvZXNuJ3QgcmV0dXJuCisgICAgICogdW50aWwgZXZlcnl0aGluZyBpcyBmaW5pc2hlZCBzbyB0aGF0IHRoZSBzY3JpcHQgY2FuIHdhaXQgZm9yIHRoZSBlbmQgaWYgaXQgbmVlZHMKKyAgICAgKiB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydExheW91dFRlc3RzKCkgeworICAgICAgICBTY3JpcHRUZXN0UnVubmVyIHJ1bm5lciA9IChTY3JpcHRUZXN0UnVubmVyKWdldEluc3RydW1lbnRhdGlvbigpOworICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoID0gcnVubmVyLmdldFRlc3RzUmVsYXRpdmVQYXRoKCk7CisKKyAgICAgICAgRm9yd2FyZGVyTWFuYWdlci5nZXRGb3J3YXJkZXJNYW5hZ2VyKCkuc3RhcnQoKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKCJjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIiLCAiVGVzdHNMaXN0QWN0aXZpdHkiKTsKKyAgICAgICAgaW50ZW50LnNldEFjdGlvbihJbnRlbnQuQUNUSU9OX1JVTik7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0c0xpc3RBY3Rpdml0eS5FWFRSQV9URVNUX1BBVEgsIHJlbGF0aXZlUGF0aCk7CisgICAgICAgIHNldEFjdGl2aXR5SW50ZW50KGludGVudCk7CisgICAgICAgIGdldEFjdGl2aXR5KCkucmVnaXN0ZXJPbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrKG5ldyBPbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrKCkgeworICAgICAgICAgICAgLyoqIFRoaXMgbWV0aG9kIGlzIHNhZmUgdG8gY2FsbCBvbiBhbnkgdGhyZWFkICovCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoZWQoKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChTdGFydGVyLnRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbUV2ZXJ5dGhpbmdGaW5pc2hlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIFN0YXJ0ZXIudGhpcy5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgd2hpbGUgKCFtRXZlcnl0aGluZ0ZpbmlzaGVkKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy53YWl0KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAic3RhcnRMYXlvdXRUZXN0cygpIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRm9yd2FyZGVyTWFuYWdlci5nZXRGb3J3YXJkZXJNYW5hZ2VyKCkuc3RvcCgpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi91aS9EaXJMaXN0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3VpL0Rpckxpc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZTY5YTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi91aS9EaXJMaXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnVpOworCitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLkZpbGVGaWx0ZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLkZzVXRpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLlRlc3RzTGlzdEFjdGl2aXR5OworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5SOworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5mb3J3YXJkZXIuRm9yd2FyZGVyTWFuYWdlcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOworaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuUHJvZ3Jlc3NEaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEFuIEFjdGl2aXR5IHRoYXQgYWxsb3dzIG5hdmlnYXRpbmcgdGhyb3VnaCB0ZXN0cyBmb2xkZXJzIGFuZCBjaG9vc2luZyBmb2xkZXJzIG9yIHRlc3RzIHRvIHJ1bi4KKyAqLworcHVibGljIGNsYXNzIERpckxpc3RBY3Rpdml0eSBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJEaXJMaXN0QWN0aXZpdHkiOworCisgICAgLyoqIFRPRE86IFRoaXMgaXMganVzdCBhIGd1ZXNzIC0gdGhpbmsgb2YgYSBiZXR0ZXIgd2F5IHRvIGFjaGlldmUgaXQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVBTl9USVRMRV9DSEFSX1NJWkUgPSAxMzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9HUkVTU19ESUFMT0dfREVMQVlfTVMgPSAyMDA7CisKKyAgICAvKiogQ29kZSBmb3IgdGhlIGRpYWxvZywgdXNlZCBpbiBzaG93RGlhbG9nIGFuZCBvbkNyZWF0ZURpYWxvZyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESUFMT0dfUlVOX0FCT1JUX0RJUiA9IDA7CisKKyAgICAvKiogTWVzc2FnZXMgY29kZXMgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0xPQURFRF9JVEVNUyA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TSE9XX1BST0dSRVNTX0RJQUxPRyA9IDE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDaGFyU2VxdWVuY2UgTk9fUkVTUE9OU0VfTUVTU0FHRSA9CisgICAgICAgICAgICAiTm8gcmVzcG9uc2UgZnJvbSBob3N0IHdoZW4gZ2V0dGluZyBkaXJlY3RvcnkgY29udGVudHMuIElzIHRoZSBob3N0IHNlcnZlciBydW5uaW5nPyI7CisKKyAgICAvKiogSW5pdGlhbGl6ZWQgbGF6aWx5IGJlZm9yZSBmaXJzdCBzUHJvZ3Jlc3NEaWFsb2cuc2hvdygpICovCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJvZ3Jlc3NEaWFsb2cgc1Byb2dyZXNzRGlhbG9nOworCisgICAgcHJpdmF0ZSBMaXN0VmlldyBtTGlzdFZpZXc7CisKKyAgICAvKiogVGhpcyBpcyBhIHJlbGF0aXZlIHBhdGghICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbUN1cnJlbnREaXJQYXRoOworCisgICAgLyoqCisgICAgICogQSB0aHJlYWQgcmVzcG9uc2libGUgZm9yIGxvYWRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgZnJvbSBzZCBjYXJkCisgICAgICogYW5kIHNlbmRpbmcgdGhlbSB2aWEgTWVzc2FnZSB0byBtYWluIHRocmVhZCB0aGF0IHRoZW4gbG9hZHMgdGhlbSBpbnRvCisgICAgICogTGlzdFZpZXcKKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIExvYWRMaXN0SXRlbXNUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1SZWxhdGl2ZVBhdGg7CisKKyAgICAgICAgcHVibGljIExvYWRMaXN0SXRlbXNUaHJlYWQoU3RyaW5nIHJlbGF0aXZlUGF0aCwgSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICBtUmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOworICAgICAgICAgICAgbUhhbmRsZXIgPSBoYW5kbGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfTE9BREVEX0lURU1TKTsKKyAgICAgICAgICAgIG1zZy5vYmogPSBnZXREaXJMaXN0KG1SZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcnkgc2ltcGxlIG9iamVjdCB0byB1c2UgaW5zaWRlIExpc3RWaWV3IGFzIGFuIGl0ZW0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlzdEl0ZW0gaW1wbGVtZW50cyBDb21wYXJhYmxlPExpc3RJdGVtPiB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1SZWxhdGl2ZVBhdGg7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1OYW1lOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzRGlyZWN0b3J5OworCisgICAgICAgIHB1YmxpYyBMaXN0SXRlbShTdHJpbmcgcmVsYXRpdmVQYXRoLCBib29sZWFuIGlzRGlyZWN0b3J5KSB7CisgICAgICAgICAgICBtUmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOworICAgICAgICAgICAgbU5hbWUgPSBuZXcgRmlsZShyZWxhdGl2ZVBhdGgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgIG1Jc0RpcmVjdG9yeSA9IGlzRGlyZWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbUlzRGlyZWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhMaXN0SXRlbSBhbm90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aC5jb21wYXJlVG8oYW5vdGhlci5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTGlzdEl0ZW0pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aC5lcXVhbHMoKChMaXN0SXRlbSlvKS5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUmVsYXRpdmVQYXRoLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY3VzdG9tIGFkYXB0ZXIgdGhhdCBzZXRzIHRoZSBwcm9wZXIgaWNvbiBhbmQgbGFiZWwgaW4gdGhlIGxpc3Qgdmlldy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEaXJMaXN0QWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxMaXN0SXRlbT4geworICAgICAgICBwcml2YXRlIEFjdGl2aXR5IG1Db250ZXh0OworICAgICAgICBwcml2YXRlIExpc3RJdGVtW10gbUl0ZW1zOworCisgICAgICAgIHB1YmxpYyBEaXJMaXN0QWRhcHRlcihBY3Rpdml0eSBjb250ZXh0LCBMaXN0SXRlbVtdIGl0ZW1zKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBSLmxheW91dC5kaXJsaXN0X3JvdywgaXRlbXMpOworCisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgICAgICBtSXRlbXMgPSBpdGVtczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSBtQ29udGV4dC5nZXRMYXlvdXRJbmZsYXRlcigpOworICAgICAgICAgICAgVmlldyByb3cgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmRpcmxpc3Rfcm93LCBudWxsKTsKKworICAgICAgICAgICAgVGV4dFZpZXcgbGFiZWwgPSAoVGV4dFZpZXcpcm93LmZpbmRWaWV3QnlJZChSLmlkLmxhYmVsKTsKKyAgICAgICAgICAgIGxhYmVsLnNldFRleHQobUl0ZW1zW3Bvc2l0aW9uXS5nZXROYW1lKCkpOworCisgICAgICAgICAgICBJbWFnZVZpZXcgaWNvbiA9IChJbWFnZVZpZXcpcm93LmZpbmRWaWV3QnlJZChSLmlkLmljb24pOworICAgICAgICAgICAgaWYgKG1JdGVtc1twb3NpdGlvbl0uaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIGljb24uc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLmZvbGRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGljb24uc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLnJ1bnRlc3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcm93OworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIEZvcndhcmRlck1hbmFnZXIuZ2V0Rm9yd2FyZGVyTWFuYWdlcigpLnN0YXJ0KCk7CisKKyAgICAgICAgbUxpc3RWaWV3ID0gZ2V0TGlzdFZpZXcoKTsKKworICAgICAgICBtTGlzdFZpZXcuc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihuZXcgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgICAgIExpc3RJdGVtIGl0ZW0gPSAoTGlzdEl0ZW0pcGFyZW50LmdldEl0ZW1BdFBvc2l0aW9uKHBvc2l0aW9uKTsKKworICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2hvd0RpcihpdGVtLmdldFJlbGF0aXZlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiogUnVuIHRoZSB0ZXN0ICovCisgICAgICAgICAgICAgICAgICAgIHJ1bkFsbFRlc3RzVW5kZXIoaXRlbS5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBtTGlzdFZpZXcuc2V0T25JdGVtTG9uZ0NsaWNrTGlzdGVuZXIobmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbUxvbmdDbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkl0ZW1Mb25nQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgICAgIExpc3RJdGVtIGl0ZW0gPSAoTGlzdEl0ZW0pcGFyZW50LmdldEl0ZW1BdFBvc2l0aW9uKHBvc2l0aW9uKTsKKworICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGFyZ3VtZW50cyA9IG5ldyBCdW5kbGUoMSk7CisgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5wdXRTdHJpbmcoIm5hbWUiLCBpdGVtLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5wdXRTdHJpbmcoInJlbGF0aXZlUGF0aCIsIGl0ZW0uZ2V0UmVsYXRpdmVQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICBzaG93RGlhbG9nKERJQUxPR19SVU5fQUJPUlRfRElSLCBhcmd1bWVudHMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBNYXliZSBzaG93IHNvbWUgaW5mbyBhYm91dCBhIHRlc3Q/ICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8qKiBBbGwgdGhlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0ZXN0IHJvb3QgZGlyIHdoZXJlIHBvc3NpYmxlICovCisgICAgICAgIHNob3dEaXIoIiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW5BbGxUZXN0c1VuZGVyKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgaW50ZW50LnNldENsYXNzKERpckxpc3RBY3Rpdml0eS50aGlzLCBUZXN0c0xpc3RBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgIGludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9SVU4pOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdHNMaXN0QWN0aXZpdHkuRVhUUkFfVEVTVF9QQVRILCByZWxhdGl2ZVBhdGgpOworICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAgICAgICAgTWVudUluZmxhdGVyIGluZmxhdGVyID0gZ2V0TWVudUluZmxhdGVyKCk7CisgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5tZW51Lmd1aV9tZW51LCBtZW51KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25PcHRpb25zSXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgc3dpdGNoIChpdGVtLmdldEl0ZW1JZCgpKSB7CisgICAgICAgICAgICBjYXNlIFIuaWQucnVuX2FsbDoKKyAgICAgICAgICAgICAgICBydW5BbGxUZXN0c1VuZGVyKG1DdXJyZW50RGlyUGF0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5vbk9wdGlvbnNJdGVtU2VsZWN0ZWQoaXRlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICAvKioKKyAgICAgKiBNb3ZlcyB0byB0aGUgcGFyZW50IGRpcmVjdG9yeSBpZiBvbmUgZXhpc3RzLiBEb2VzIG5vdCBhbGxvdyB0byBtb3ZlIGFib3ZlCisgICAgICogdGhlIHRlc3QgJ3Jvb3QnIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkJhY2tQcmVzc2VkKCkgeworICAgICAgICBGaWxlIGN1cnJlbnREaXJQYXJlbnQgPSBuZXcgRmlsZShtQ3VycmVudERpclBhdGgpLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgaWYgKGN1cnJlbnREaXJQYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgc2hvd0RpcihjdXJyZW50RGlyUGFyZW50LmdldFBhdGgoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaG93RGlyKCIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXZlbnRzIHRoZSBhY3Rpdml0eSBmcm9tIHJlY3JlYXRpbmcgb24gY2hhbmdlIG9mIG9yaWVudGF0aW9uLiBUaGUgdGl0bGUgbmVlZHMgdG8KKyAgICAgKiBiZSByZWNhbGN1bGF0ZWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgeworICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7CisKKyAgICAgICAgc2V0VGl0bGUoc2hvcnRlblRpdGxlKG1DdXJyZW50RGlyUGF0aCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBEaWFsb2cgb25DcmVhdGVEaWFsb2coaW50IGlkLCBmaW5hbCBCdW5kbGUgYXJncykgeworICAgICAgICBEaWFsb2cgZGlhbG9nID0gbnVsbDsKKyAgICAgICAgQWxlcnREaWFsb2cuQnVpbGRlciBidWlsZGVyID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIodGhpcyk7CisKKyAgICAgICAgc3dpdGNoIChpZCkgeworICAgICAgICAgICAgY2FzZSBESUFMT0dfUlVOX0FCT1JUX0RJUjoKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldFRpdGxlKGdldFRleHQoUi5zdHJpbmcuZGlhbG9nX3J1bl9hYm9ydF9kaXJfdGl0bGVfcHJlZml4KSArICIgIiArCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmdldFN0cmluZygibmFtZSIpKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldE1lc3NhZ2UoUi5zdHJpbmcuZGlhbG9nX3J1bl9hYm9ydF9kaXJfbXNnKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldENhbmNlbGFibGUodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldFBvc2l0aXZlQnV0dG9uKFIuc3RyaW5nLmRpYWxvZ19ydW5fYWJvcnRfZGlyX29rX2J1dHRvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZURpYWxvZyhESUFMT0dfUlVOX0FCT1JUX0RJUik7CisgICAgICAgICAgICAgICAgICAgICAgICBydW5BbGxUZXN0c1VuZGVyKGFyZ3MuZ2V0U3RyaW5nKCJyZWxhdGl2ZVBhdGgiKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0TmVnYXRpdmVCdXR0b24oUi5zdHJpbmcuZGlhbG9nX3J1bl9hYm9ydF9kaXJfYWJvcnRfYnV0dG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRGlhbG9nKERJQUxPR19SVU5fQUJPUlRfRElSKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgZGlhbG9nID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgICAgICAgICBkaWFsb2cuc2V0T25DYW5jZWxMaXN0ZW5lcihuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2FuY2VsTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbmNlbChEaWFsb2dJbnRlcmZhY2UgZGlhbG9nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVEaWFsb2coRElBTE9HX1JVTl9BQk9SVF9ESVIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGlhbG9nOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWRzIHRoZSBjb250ZW50cyBvZiBkaXIgaW50byB0aGUgbGlzdCB2aWV3LgorICAgICAqCisgICAgICogQHBhcmFtIGRpclBhdGgKKyAgICAgKiAgICAgIGRpcmVjdG9yeSB0byBsb2FkIGludG8gbGlzdCB2aWV3CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNob3dEaXIoU3RyaW5nIGRpclBhdGgpIHsKKyAgICAgICAgbUN1cnJlbnREaXJQYXRoID0gZGlyUGF0aDsKKworICAgICAgICAvKiogU2hvdyBwcm9ncmVzcyBkaWFsb2cgd2l0aCBhIGRlbGF5ICovCisgICAgICAgIGZpbmFsIEhhbmRsZXIgZGVsYXllZERpYWxvZ0hhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgICAgIGlmIChtc2cud2hhdCA9PSBNU0dfU0hPV19QUk9HUkVTU19ESUFMT0cpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNQcm9ncmVzc0RpYWxvZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cgPSBuZXcgUHJvZ3Jlc3NEaWFsb2coRGlyTGlzdEFjdGl2aXR5LnRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNldENhbmNlbGFibGUoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNldFByb2dyZXNzU3R5bGUoUHJvZ3Jlc3NEaWFsb2cuU1RZTEVfU1BJTk5FUik7CisgICAgICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2V0VGl0bGUoUi5zdHJpbmcuZGlhbG9nX3Byb2dyZXNzX3RpdGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zZXRNZXNzYWdlKGdldFRleHQoUi5zdHJpbmcuZGlhbG9nX3Byb2dyZXNzX21zZykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zaG93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBNZXNzYWdlIG1zZ1Nob3dEaWFsb2cgPSBkZWxheWVkRGlhbG9nSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19TSE9XX1BST0dSRVNTX0RJQUxPRyk7CisgICAgICAgIGRlbGF5ZWREaWFsb2dIYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtc2dTaG93RGlhbG9nLCBQUk9HUkVTU19ESUFMT0dfREVMQVlfTVMpOworCisgICAgICAgIC8qKiBEZWxlZ2F0ZSBsb2FkaW5nIGNvbnRlbnRzIGZyb20gU0QgY2FyZCB0byBhIG5ldyB0aHJlYWQgKi8KKyAgICAgICAgbmV3IExvYWRMaXN0SXRlbXNUaHJlYWQobUN1cnJlbnREaXJQYXRoLCBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgICAgIGlmIChtc2cud2hhdCA9PSBNU0dfTE9BREVEX0lURU1TKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFRpdGxlKHNob3J0ZW5UaXRsZShtQ3VycmVudERpclBhdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsYXllZERpYWxvZ0hhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX1NIT1dfUFJPR1JFU1NfRElBTE9HKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNQcm9ncmVzc0RpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuZGlzbWlzcygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cub2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KERpckxpc3RBY3Rpdml0eS50aGlzLCBOT19SRVNQT05TRV9NRVNTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfTE9ORykuc2hvdygpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0TGlzdEFkYXB0ZXIobmV3IERpckxpc3RBZGFwdGVyKERpckxpc3RBY3Rpdml0eS50aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTGlzdEl0ZW1bXSltc2cub2JqKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZmluZCBhIG5lYXQgd2F5IHRvIGRldGVybWluZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IGZpdCBpbiB0aGUgdGl0bGUKKyAgICAgKiBiYXIuCisgICAgICogKi8KKyAgICBwcml2YXRlIFN0cmluZyBzaG9ydGVuVGl0bGUoU3RyaW5nIHRpdGxlKSB7CisgICAgICAgIGlmICh0aXRsZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICByZXR1cm4gIlRlc3RzJyByb290IGRpcjoiOworICAgICAgICB9CisgICAgICAgIGludCBjaGFyQ291bnQgPSBtTGlzdFZpZXcuZ2V0V2lkdGgoKSAvIE1FQU5fVElUTEVfQ0hBUl9TSVpFOworCisgICAgICAgIGlmICh0aXRsZS5sZW5ndGgoKSA+IGNoYXJDb3VudCkgeworICAgICAgICAgICAgcmV0dXJuICIuLi4iICsgdGl0bGUuc3Vic3RyaW5nKHRpdGxlLmxlbmd0aCgpIC0gY2hhckNvdW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0aXRsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXJyYXkgd2l0aCBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgorICAgICAqIEZpcnN0IGl0IGNvbnRhaW5zIHRoZSBzdWJmb2xkZXJzLCB0aGVuIHRoZSBmaWxlcy4gQm90aCBzb3J0ZWQKKyAgICAgKiBhbHBoYWJldGljYWxseS4KKyAgICAgKgorICAgICAqIFRoZSBkaXJQYXRoIGlzIHJlbGF0aXZlLgorICAgICAqLworICAgIHByaXZhdGUgTGlzdEl0ZW1bXSBnZXREaXJMaXN0KFN0cmluZyBkaXJQYXRoKSB7CisgICAgICAgIExpc3Q8TGlzdEl0ZW0+IHN1YkRpcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RJdGVtPigpOworICAgICAgICBMaXN0PExpc3RJdGVtPiBzdWJGaWxlcyA9IG5ldyBBcnJheUxpc3Q8TGlzdEl0ZW0+KCk7CisKKyAgICAgICAgTGlzdDxTdHJpbmc+IGRpclJlbGF0aXZlUGF0aHMgPSBGc1V0aWxzLmdldExheW91dFRlc3RzRGlyQ29udGVudHMoZGlyUGF0aCwgZmFsc2UsIHRydWUpOworICAgICAgICBpZiAoZGlyUmVsYXRpdmVQYXRocyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFN0cmluZyBkaXJSZWxhdGl2ZVBhdGggOiBkaXJSZWxhdGl2ZVBhdGhzKSB7CisgICAgICAgICAgICBpZiAoRmlsZUZpbHRlci5pc1Rlc3REaXIobmV3IEZpbGUoZGlyUmVsYXRpdmVQYXRoKS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgc3ViRGlycy5hZGQobmV3IExpc3RJdGVtKGRpclJlbGF0aXZlUGF0aCwgdHJ1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTGlzdDxTdHJpbmc+IHRlc3RSZWxhdGl2ZVBhdGhzID0gRnNVdGlscy5nZXRMYXlvdXRUZXN0c0RpckNvbnRlbnRzKGRpclBhdGgsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGlmICh0ZXN0UmVsYXRpdmVQYXRocyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFN0cmluZyB0ZXN0UmVsYXRpdmVQYXRoIDogdGVzdFJlbGF0aXZlUGF0aHMpIHsKKyAgICAgICAgICAgIGlmIChGaWxlRmlsdGVyLmlzVGVzdEZpbGUobmV3IEZpbGUodGVzdFJlbGF0aXZlUGF0aCkuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHN1YkZpbGVzLmFkZChuZXcgTGlzdEl0ZW0odGVzdFJlbGF0aXZlUGF0aCwgZmFsc2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiBDb25jYXRlbmF0ZSB0aGUgdHdvIGxpc3RzICovCisgICAgICAgIHN1YkRpcnMuYWRkQWxsKHN1YkZpbGVzKTsKKworICAgICAgICByZXR1cm4gc3ViRGlycy50b0FycmF5KG5ldyBMaXN0SXRlbVtzdWJEaXJzLnNpemUoKV0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9BbmRyb2lkLm1rIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ3NDNmOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gSHdBY2NlbGVyYXRpb25UZXN0CisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjNjM2VkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlc3QuaHd1aSI+CisKKyAgICA8YXBwbGljYXRpb24KKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iSHdVaSIKKyAgICAgICAgYW5kcm9pZDpoYXJkd2FyZUFjY2VsZXJhdGVkPSJ0cnVlIj4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IkFscGhhTGF5ZXJzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX86xTGF5ZXJzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQWR2YW5jZWRHcmFkaWVudHNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfQWR2YW5jZWQgR3JhZGllbnRzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iTGFiZWxzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0xhYmVscyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJSZXNpemVBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfUmVzaXplIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6d2luZG93U29mdElucHV0TW9kZT0iYWRqdXN0UmVzaXplIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iVGV4dEdhbW1hQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0dhbW1hIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlRleHRHYW1tYUFjdGl2aXR5JFN1YkdhbW1hQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1N1YiBHYW1tYSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudC5Ob1RpdGxlQmFyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGFyZHdhcmVBY2NlbGVyYXRlZD0iZmFsc2UiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJMYXllcnNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfTGF5ZXJzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iTmV3TGF5ZXJzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX05ld0xheWVycyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlhmZXJtb2RlQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1hmZXJtb2RlcyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudC5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQml0bWFwc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9CaXRtYXBzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQml0bWFwc0FscGhhQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0JpdG1hcHNBbHBoYSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudC5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQml0bWFwc1JlY3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfQml0bWFwc1JlY3QiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuVHJhbnNsdWNlbnQuTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJUaGluUGF0Y2hlc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il85cGF0Y2hUaGluIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJOaW5lUGF0Y2hlc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il85cGF0Y2giPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJRdWlja1JlamVjdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9RdWlja1JlamVjdCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlJvdGF0aW9uQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1JvdGF0aW9uIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iR3JhZGllbnRzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0dyYWRpZW50cyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJTaGFkZXJzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1NoYWRlcnMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJUZXh0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1RleHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJMaXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0xpc3QiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iVHJhbnNwYXJlbnRMaXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1RyYW5zcGFyZW50TGlzdCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ik1vcmVTaGFkZXJzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1NoYWRlcnMyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IkNvbG9yRmlsdGVyc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9Db2xvckZpbHRlcnMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iTGluZXNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfTGluZXMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoYXJkd2FyZUFjY2VsZXJhdGVkPSJ0cnVlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlBhdGhzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1BhdGhzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlRyYW5zZm9ybTNkQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iXzNkIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlNpbXBsZVBhdGhzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1NpbXBsZVBhdGhzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IkFkdmFuY2VkQmxlbmRBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfQWR2YW5jZWQgQmxlbmQiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iRnJhbWVidWZmZXJCbGVuZEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9GcmFtZWJ1ZmZlckJsZW5kIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJTdGFja0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9TdGFja3MiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbi5wbmcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBmYmRmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0MS5qcGcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0MS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4NTFmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0Mi5wbmcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0Mi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1OGVlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0My5wbmcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0My5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwOGIyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUtaGRwaS9zdW5zZXQzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL2J0bl90b2dnbGVfb2ZmLjkucG5nIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9idG5fdG9nZ2xlX29mZi45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmVlMWMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9idG5fdG9nZ2xlX29mZi45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL2J0bl90b2dnbGVfb24uOS5wbmcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL2J0bl90b2dnbGVfb24uOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNlOTVhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvYnRuX3RvZ2dsZV9vbi45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL2RlZmF1bHRfd2FsbHBhcGVyLmpwZyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvZGVmYXVsdF93YWxscGFwZXIuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhY2FkOTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL2RlZmF1bHRfd2FsbHBhcGVyLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL2ljb24ucG5nIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9pY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjQwYTE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3BhdGNoLjkucG5nIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9wYXRjaC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2IzNjM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9wYXRjaC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDEuanBnIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQxLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mjg1MWYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQxLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDIucG5nIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjU4ZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL3N1bnNldDMucG5nIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTA4YjI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9mb3JtLnhtbCBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L2Zvcm0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMTdkYjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9mb3JtLnhtbApAQCAtMCwwICsxLDY2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorICAgICAgICAKKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkZpcnN0IG5hbWUiIC8+CisgICAgICAgIAorICAgICAgICA8RWRpdFRleHQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjNkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkVudGVyIHlvdXIgZmlyc3QgbmFtZSIgLz4KKyAgICAgICAgCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKyAgICAgICAgCisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJMYXN0IG5hbWUiIC8+CisgICAgICAgIAorICAgICAgICA8RWRpdFRleHQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjNkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkVudGVyIHlvdXIgbGFzdCBuYW1lIiAvPgorICAgICAgICAKKyAgICA8L0xpbmVhckxheW91dD4KKyAgICAKKyAgICA8RWRpdFRleHQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjZmY3ZjAwMDAiIC8+CisgICAgCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L2xhYmVscy54bWwgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9sYWJlbHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NWEyY2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9sYWJlbHMueG1sCkBAIC0wLDAgKzEsNDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyMDBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgICAgICBhbmRyb2lkOnRleHQ9IlRoaXMgaXMgYSBsb25nIHRleHQgdmlldyBmb3IgZWxsaXBzaXppbmciIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjIwMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iVGhpcyBpcyBhIHZlcnkgbG9uZyB0ZXh0IHZpZXcgZm9yIGVsbGlwc2l6aW5nIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyMDBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0IgorICAgICAgICBhbmRyb2lkOnRleHQ9IlRoaXMgaXMgYSB2ZXJ5IGxvbmcgdGV4dCB2aWV3IGZvciBlbGxpcHNpemluZyIgLz4KKyAgIAorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9saXN0X2FjdGl2aXR5LnhtbCBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L2xpc3RfYWN0aXZpdHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYmEzNzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9saXN0X2FjdGl2aXR5LnhtbApAQCAtMCwwICsxLDc4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorICAgICAgICAKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iM2RpcCIKKworICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJBZGQiIC8+CisgICAgICAgIAorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIzZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlJlbW92ZSIgLz4KKyAgICAgICAgCisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgCisgICAgPExpc3RWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGlzdCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIgLz4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorICAgICAgICAKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iM2RpcCIKKworICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJBZGQiIC8+CisgICAgICAgIAorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIzZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlJlbW92ZSIgLz4KKyAgICAgICAgCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvc3RhY2sueG1sIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvc3RhY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZDJkNzNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvc3RhY2sueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIwZHAiCisgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIwZHAiCisgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTJkcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkcCIKKyAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSI+CisgICAgPFN0YWNrVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YWNrX3ZpZXciIAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzQ4cHgiIAorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjM3NHB4IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOmNhY2hlQ29sb3JIaW50PSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6YXV0b1N0YXJ0PSJ0cnVlIiAvPgorPC9GcmFtZUxheW91dD4KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3N0YWNrX2l0ZW0ueG1sIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvc3RhY2tfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwNDAxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3N0YWNrX2l0ZW0ueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9zdGFja19pdGVtIiAgCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPiAKKyAgICA8RnJhbWVMYXlvdXQgIAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPiAKKyAgICAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL3RleHR2aWV3X2ljb24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiIC8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21pbmlfdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIiAvPgorICAgIDwvRnJhbWVMYXlvdXQ+CisgICAgPFRleHRWaWV3IAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiAKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIiAvPgorPC9GcmFtZUxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC90ZXh0X2xhcmdlLnhtbCBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3RleHRfbGFyZ2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YjM3NGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC90ZXh0X2xhcmdlLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8VGV4dFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI2ZGlwIgorICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjZkaXAiCisgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlSW52ZXJzZSIKKyAgICBhbmRyb2lkOnRleHQ9IldpZGdldCAiLz4gCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC90ZXh0X21lZGl1bS54bWwgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC90ZXh0X21lZGl1bS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUxOTVlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3RleHRfbWVkaXVtLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8VGV4dFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI2ZGlwIgorICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjZkaXAiCisgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bUludmVyc2UiCisgICAgYW5kcm9pZDp0ZXh0PSJXaWRnZXQgIi8+IApkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvdGV4dF9zbWFsbC54bWwgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC90ZXh0X3NtYWxsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWVlZTYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvdGV4dF9zbWFsbC54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPFRleHRWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNmRpcCIKKyAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI2ZGlwIgorICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbEludmVyc2UiCisgICAgYW5kcm9pZDp0ZXh0PSJXaWRnZXQgIi8+IApkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQWR2YW5jZWRCbGVuZEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9BZHZhbmNlZEJsZW5kQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmFhMjBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQWR2YW5jZWRCbGVuZEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29tcG9zZVNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQWR2YW5jZWRCbGVuZEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhuZXcgU2hhZGVyc1ZpZXcodGhpcykpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBTaGFkZXJzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIEJpdG1hcFNoYWRlciBtU2NhbGVkU2hhZGVyOworICAgICAgICBwcml2YXRlIGludCBtVGV4V2lkdGg7CisgICAgICAgIHByaXZhdGUgaW50IG1UZXhIZWlnaHQ7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbVBhaW50OworICAgICAgICBwcml2YXRlIGZsb2F0IG1EcmF3V2lkdGg7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbURyYXdIZWlnaHQ7CisgICAgICAgIHByaXZhdGUgTGluZWFyR3JhZGllbnQgbUhvckdyYWRpZW50OworICAgICAgICBwcml2YXRlIENvbXBvc2VTaGFkZXIgbUNvbXBvc2VTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTJTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTNTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTRTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTVTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTZTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQml0bWFwU2hhZGVyIG1TY2FsZWQyU2hhZGVyOworCisgICAgICAgIFNoYWRlcnNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIEJpdG1hcCB0ZXh0dXJlID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbVRleFdpZHRoID0gdGV4dHVyZS5nZXRXaWR0aCgpOworICAgICAgICAgICAgbVRleEhlaWdodCA9IHRleHR1cmUuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBtRHJhd1dpZHRoID0gbVRleFdpZHRoICogMi4yZjsKKyAgICAgICAgICAgIG1EcmF3SGVpZ2h0ID0gbVRleEhlaWdodCAqIDEuMmY7CisKKyAgICAgICAgICAgIG1TY2FsZWRTaGFkZXIgPSBuZXcgQml0bWFwU2hhZGVyKHRleHR1cmUsIFNoYWRlci5UaWxlTW9kZS5NSVJST1IsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworICAgICAgICAgICAgTWF0cml4IG0yID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbTIuc2V0U2NhbGUoMC41ZiwgMC41Zik7CisgICAgICAgICAgICBtU2NhbGVkU2hhZGVyLnNldExvY2FsTWF0cml4KG0yKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVNjYWxlZDJTaGFkZXIgPSBuZXcgQml0bWFwU2hhZGVyKHRleHR1cmUsIFNoYWRlci5UaWxlTW9kZS5NSVJST1IsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworICAgICAgICAgICAgTWF0cml4IG0zID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbTMuc2V0U2NhbGUoMC4xZiwgMC4xZik7CisgICAgICAgICAgICBtU2NhbGVkMlNoYWRlci5zZXRMb2NhbE1hdHJpeChtMyk7CisKKyAgICAgICAgICAgIG1Ib3JHcmFkaWVudCA9IG5ldyBMaW5lYXJHcmFkaWVudCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCAwLjBmLAorICAgICAgICAgICAgICAgICAgICBDb2xvci5CTEFDSywgQ29sb3IuV0hJVEUsIFNoYWRlci5UaWxlTW9kZS5DTEFNUCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1Db21wb3NlU2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobVNjYWxlZFNoYWRlciwgbUhvckdyYWRpZW50LAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuREFSS0VOKTsKKyAgICAgICAgICAgIG1Db21wb3NlMlNoYWRlciA9IG5ldyBDb21wb3NlU2hhZGVyKG1TY2FsZWRTaGFkZXIsIG1Ib3JHcmFkaWVudCwKKyAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLkxJR0hURU4pOworICAgICAgICAgICAgbUNvbXBvc2UzU2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobVNjYWxlZFNoYWRlciwgbUhvckdyYWRpZW50LAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuTVVMVElQTFkpOworICAgICAgICAgICAgbUNvbXBvc2U0U2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobVNjYWxlZFNoYWRlciwgbUhvckdyYWRpZW50LAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU0NSRUVOKTsKKyAgICAgICAgICAgIG1Db21wb3NlNVNoYWRlciA9IG5ldyBDb21wb3NlU2hhZGVyKG1TY2FsZWRTaGFkZXIsIG1Ib3JHcmFkaWVudCwKKyAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLkFERCk7CisgICAgICAgICAgICBtQ29tcG9zZTZTaGFkZXIgPSBuZXcgQ29tcG9zZVNoYWRlcihtSG9yR3JhZGllbnQsIG1TY2FsZWRTaGFkZXIsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5PVkVSTEFZKTsKKworICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwLjBmLCA0MC4wZik7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUNvbXBvc2VTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtQ29tcG9zZTJTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtQ29tcG9zZTNTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSg0MC4wZiArIG1EcmF3V2lkdGggKyA0MC4wZiwgNDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlNFNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlNVNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlNlNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9BZHZhbmNlZEdyYWRpZW50c0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9BZHZhbmNlZEdyYWRpZW50c0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc5NzRlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0FkdmFuY2VkR3JhZGllbnRzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJhZGlhbEdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU3dlZXBHcmFkaWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIEFkdmFuY2VkR3JhZGllbnRzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBHcmFkaWVudHNWaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgR3JhZGllbnRzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1QYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTd2VlcEdyYWRpZW50IG1Td2VlcEdyYWRpZW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFJhZGlhbEdyYWRpZW50IG1SYWRpYWxHcmFkaWVudDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXRyaXggbU1hdHJpeDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXRyaXggbU1hdHJpeDI7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWF0cml4IG1NYXRyaXgzOworCisgICAgICAgIEdyYWRpZW50c1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbVN3ZWVwR3JhZGllbnQgPSBuZXcgU3dlZXBHcmFkaWVudCgwLjBmLCAwLjBmLCAweGZmMDAwMDAwLCAweGZmZmZmZmZmKTsKKyAgICAgICAgICAgIG1SYWRpYWxHcmFkaWVudCA9IG5ldyBSYWRpYWxHcmFkaWVudCgwLjBmLCAwLjBmLCAxMDAuMGYsIDB4ZmYwMDAwMDAsIDB4ZmZmZmZmZmYsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtTWF0cml4ID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbU1hdHJpeC5zZXRSb3RhdGUoLTQ1LCAwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIG1NYXRyaXgucG9zdFRyYW5zbGF0ZSgxMDAuMGYsIDEwMC4wZik7CisKKyAgICAgICAgICAgIG1NYXRyaXgyID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbU1hdHJpeDIuc2V0U2NhbGUoMS4wZiwgMi4wZik7CisgICAgICAgICAgICBtTWF0cml4Mi5wb3N0Um90YXRlKC00NSwgMC4wZiwgMC4wZik7CisKKyAgICAgICAgICAgIG1NYXRyaXgzID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbU1hdHJpeDMuc2V0VHJhbnNsYXRlKDEwMC4wZiwgMTAwLjBmKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEzMC4wZiwgMTAwLjBmKTsKKworICAgICAgICAgICAgbVN3ZWVwR3JhZGllbnQuc2V0TG9jYWxNYXRyaXgobU1hdHJpeDMpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtU3dlZXBHcmFkaWVudCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgMjAwLjBmLCAyMDAuMGYsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoNDAwLjBmLCAwMDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtU3dlZXBHcmFkaWVudC5zZXRMb2NhbE1hdHJpeChtTWF0cml4KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobVN3ZWVwR3JhZGllbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDIwMC4wZiwgMjAwLjBmLCBtUGFpbnQpOyAgICAgICAgICAgIAorCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwMC4wZiwgMDAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVN3ZWVwR3JhZGllbnQuc2V0TG9jYWxNYXRyaXgobU1hdHJpeDIpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtU3dlZXBHcmFkaWVudCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgMjAwLjBmLCAyMDAuMGYsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLTgwMC4wZiwgMzAwLjBmKTsKKworICAgICAgICAgICAgbVJhZGlhbEdyYWRpZW50LnNldExvY2FsTWF0cml4KG51bGwpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtUmFkaWFsR3JhZGllbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDIwMC4wZiwgMjAwLjBmLCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwMC4wZiwgMDAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVJhZGlhbEdyYWRpZW50LnNldExvY2FsTWF0cml4KG1NYXRyaXgpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtUmFkaWFsR3JhZGllbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDIwMC4wZiwgMjAwLjBmLCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwMC4wZiwgMDAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVJhZGlhbEdyYWRpZW50LnNldExvY2FsTWF0cml4KG1NYXRyaXgyKTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobVJhZGlhbEdyYWRpZW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCAyMDAuMGYsIDIwMC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQWxwaGFMYXllcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQWxwaGFMYXllcnNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjhhOTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9BbHBoYUxheWVyc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFscGhhQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQWxwaGFMYXllcnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJId1VpIjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBEaXJ0eUJpdG1hcFZpZXcgY29udGFpbmVyID0gbmV3IERpcnR5Qml0bWFwVmlldyh0aGlzKTsKKworICAgICAgICBDb2xvclZpZXcgY29sb3IgPSBuZXcgQ29sb3JWaWV3KHRoaXMpOworICAgICAgICBjb250YWluZXIuYWRkVmlldyhjb2xvciwgbmV3IERpcnR5Qml0bWFwVmlldy5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgZGlwVG9QeCh0aGlzLCAxMDApLCBkaXBUb1B4KHRoaXMsIDEwMCksIEdyYXZpdHkuQ0VOVEVSKSk7CisKKyAgICAgICAgQWxwaGFBbmltYXRpb24gYSA9IG5ldyBBbHBoYUFuaW1hdGlvbigxLjBmLCAwLjBmKTsKKyAgICAgICAgYS5zZXREdXJhdGlvbigyMDAwKTsKKyAgICAgICAgYS5zZXRSZXBlYXRDb3VudChBbmltYXRpb24uSU5GSU5JVEUpOworICAgICAgICBhLnNldFJlcGVhdE1vZGUoQW5pbWF0aW9uLlJFVkVSU0UpOworICAgICAgICBjb2xvci5zdGFydEFuaW1hdGlvbihhKTsKKworICAgICAgICBzZXRDb250ZW50Vmlldyhjb250YWluZXIpOworICAgIH0KKyAgICAKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCisgICAgc3RhdGljIGludCBkaXBUb1B4KENvbnRleHQgYywgaW50IGRpcCkgeworICAgICAgICByZXR1cm4gKGludCkgKGMuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5ICogZGlwICsgMC41Zik7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIENvbG9yVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBDb2xvclZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JHQigwLCAyNTUsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIERpcnR5Qml0bWFwVmlldyBleHRlbmRzIEZyYW1lTGF5b3V0IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUGFpbnQ7CisKKyAgICAgICAgRGlydHlCaXRtYXBWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisgICAgICAgICAgICBtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaERyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgyMDAuMGYsIDAuMGYsIDIyMC4wZiwgMjAuMGYsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoMjAuMGYsIDAuMGYsIDQwLjBmLCAyMC4wZik7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiY2xpcFJlY3QgPSAiICsgY2FudmFzLmdldENsaXBCb3VuZHMoKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAicmVqZWN0ZWQgPSAiICsgY2FudmFzLnF1aWNrUmVqZWN0KDEwMC4wZiwgMTAwLjBmLCAxMTAuMGYsIDExMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkJXKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAicmVqZWN0ZWQgPSAiICsgY2FudmFzLnF1aWNrUmVqZWN0KDI1LjBmLCA1LjBmLCAzMC4wZiwgMTAuMGYsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5FZGdlVHlwZS5CVykpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy5zY2FsZSgyLjBmLCAyLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgyMC4wZiwgMC4wZiwgNDAuMGYsIDIwLjBmKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJjbGlwUmVjdCA9ICIgKyBjYW52YXMuZ2V0Q2xpcEJvdW5kcygpKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWplY3RlZCA9ICIgKyBjYW52YXMucXVpY2tSZWplY3QoNTAuMGYsIDUwLjBmLCA2MC4wZiwgNjAuMGYsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5FZGdlVHlwZS5CVykpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInJlamVjdGVkID0gIiArIGNhbnZhcy5xdWlja1JlamVjdCgyNS4wZiwgNS4wZiwgMzAuMGYsIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuRWRnZVR5cGUuQlcpKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDIwLjBmLCAyMC4wZik7CisgICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoMjAuMGYsIDAuMGYsIDQwLjBmLCAyMC4wZik7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiY2xpcFJlY3QgPSAiICsgY2FudmFzLmdldENsaXBCb3VuZHMoKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAicmVqZWN0ZWQgPSAiICsgY2FudmFzLnF1aWNrUmVqZWN0KDgwLjBmLCA4MC4wZiwgOTAuMGYsIDkwLjBmLAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuRWRnZVR5cGUuQlcpKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWplY3RlZCA9ICIgKyBjYW52YXMucXVpY2tSZWplY3QoMjUuMGYsIDUuMGYsIDMwLjBmLCAxMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkJXKSk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnNjYWxlKDIuMGYsIDIuMGYpOyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLmNsaXBSZWN0KDIwLjBmLCAwLjBmLCA0MC4wZiwgMjAuMGYpOworCisgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhmZjAwZmYwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgMjAuMGYsIDIwLjBmLCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMjAuMGYsIDAuMGYsIDQwLjBmLCAyMC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVUbyA9IGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMuc2F2ZUxheWVyQWxwaGEoMC4wZiwgMTAwLjBmLCBnZXRXaWR0aCgpLCAxNTAuMGYsIDEyNywKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkhBU19BTFBIQV9MQVlFUl9TQVZFX0ZMQUcgfCBDYW52YXMuQ0xJUF9UT19MQVlFUl9TQVZFX0ZMQUcpOworICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKDB4ZmYwMDAwZmYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDEwMC4wZiwgNDAuMGYsIDE1MC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmMDBmZmZmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCg0MC4wZiwgMTAwLjBmLCAxNDAuMGYsIDE1MC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmZmYwMGZmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgxNDAuMGYsIDEwMC4wZiwgMjQwLjBmLCAxNTAuMGYsIG1QYWludCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQocmVzdG9yZVRvKTsKKworICAgICAgICAgICAgc3VwZXIuZGlzcGF0Y2hEcmF3KGNhbnZhcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNTQzNTMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQml0bWFwc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZlhmZXJtb2RlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uU2NhbGVBbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBCaXRtYXBzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBCaXRtYXBzVmlldyB2aWV3ID0gbmV3IEJpdG1hcHNWaWV3KHRoaXMpOworICAgICAgICBmaW5hbCBGcmFtZUxheW91dCBsYXlvdXQgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisgICAgICAgIGxheW91dC5hZGRWaWV3KHZpZXcsIG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoNDgwLCA4MDAsIEdyYXZpdHkuQ0VOVEVSKSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgICAgIAorICAgICAgICBTY2FsZUFuaW1hdGlvbiBhID0gbmV3IFNjYWxlQW5pbWF0aW9uKDEuMGYsIDIuMGYsIDEuMGYsIDIuMGYsCisgICAgICAgICAgICAgICAgU2NhbGVBbmltYXRpb24uUkVMQVRJVkVfVE9fU0VMRiwgMC41ZiwKKyAgICAgICAgICAgICAgICBTY2FsZUFuaW1hdGlvbi5SRUxBVElWRV9UT19TRUxGLDAuNWYpOworICAgICAgICBhLnNldER1cmF0aW9uKDIwMDApOworICAgICAgICBhLnNldFJlcGVhdENvdW50KEFuaW1hdGlvbi5JTkZJTklURSk7CisgICAgICAgIGEuc2V0UmVwZWF0TW9kZShBbmltYXRpb24uUkVWRVJTRSk7CisgICAgICAgIHZpZXcuc3RhcnRBbmltYXRpb24oYSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJpdG1hcHNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbUJpdG1hcFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDI7CisgICAgICAgIHByaXZhdGUgZmluYWwgUG9ydGVyRHVmZlhmZXJtb2RlIG1Ec3RJbjsKKworICAgICAgICBCaXRtYXBzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtQml0bWFwMSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIG1CaXRtYXAyID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDIpOworCisgICAgICAgICAgICBtQml0bWFwUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1Ec3RJbiA9IG5ldyBQb3J0ZXJEdWZmWGZlcm1vZGUoUG9ydGVyRHVmZi5Nb2RlLkRTVF9JTik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEyMC4wZiwgNTAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDAuMGYsIDAuMGYsIG1CaXRtYXBQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgbUJpdG1hcDEuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAyNS4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMiwgMC4wZiwgMC4wZiwgbnVsbCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1CaXRtYXBQYWludC5zZXRBbHBoYSgxMjcpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCBtQml0bWFwMi5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCAwLjBmLCAwLjBmLCBtQml0bWFwUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtQml0bWFwUGFpbnQuc2V0QWxwaGEoMjU1KTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgbUJpdG1hcDEuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAyNS4wZik7CisgICAgICAgICAgICBtQml0bWFwUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbUJpdG1hcDIuZ2V0V2lkdGgoKSwgbUJpdG1hcDIuZ2V0SGVpZ2h0KCksIG1CaXRtYXBQYWludCk7CisgICAgICAgICAgICBtQml0bWFwUGFpbnQuc2V0WGZlcm1vZGUobURzdEluKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAyLCAwLjBmLCAwLjBmLCBtQml0bWFwUGFpbnQpOworCisgICAgICAgICAgICBtQml0bWFwUGFpbnQucmVzZXQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNBbHBoYUFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzQWxwaGFBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNDljN2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzQWxwaGFBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBCaXRtYXBzQWxwaGFBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGZpbmFsIEJpdG1hcHNWaWV3IHZpZXcgPSBuZXcgQml0bWFwc1ZpZXcodGhpcyk7CisgICAgICAgIGZpbmFsIEZyYW1lTGF5b3V0IGxheW91dCA9IG5ldyBGcmFtZUxheW91dCh0aGlzKTsKKyAgICAgICAgbGF5b3V0LmFkZFZpZXcodmlldywgbmV3IEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcyg0ODAsIDgwMCwgR3Jhdml0eS5DRU5URVIpKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobGF5b3V0KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQml0bWFwc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtQml0bWFwUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAxOworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMjsKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcDM7CisKKyAgICAgICAgQml0bWFwc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgIkxvYWRpbmcgc3Vuc2V0MSwgZGVmYXVsdCBvcHRpb25zIik7CisgICAgICAgICAgICBtQml0bWFwMSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJMb2FkaW5nIHN1bnNldDIsIGRlZmF1bHQgb3B0aW9ucyIpOworICAgICAgICAgICAgbUJpdG1hcDIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0Mik7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiTG9hZGluZyBzdW5zZXQzLCBmb3JjaW5nIEFSR0ItODg4OCIpOworICAgICAgICAgICAgQml0bWFwRmFjdG9yeS5PcHRpb25zIG9wdHMgPSBuZXcgQml0bWFwRmFjdG9yeS5PcHRpb25zKCk7CisgICAgICAgICAgICBvcHRzLmluUHJlZmVycmVkQ29uZmlnID0gQml0bWFwLkNvbmZpZy5BUkdCXzg4ODg7CisgICAgICAgICAgICBtQml0bWFwMyA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQzLCBvcHRzKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICIgICAgaGFzIGJpdG1hcCBhbHBoYT8gIiArIG1CaXRtYXAzLmhhc0FscGhhKCkpOworCisgICAgICAgICAgICBtQml0bWFwUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICI9PT09PT09PT09PT09PT09PSBEcmF3Iik7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTIwLjBmLCA1MC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgMC4wZiwgMC4wZiwgbUJpdG1hcFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCBtQml0bWFwMS5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAyLCAwLjBmLCAwLjBmLCBudWxsKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCBtQml0bWFwMi5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAzLCAwLjBmLCAwLjBmLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNSZWN0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNSZWN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTkyMjA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQml0bWFwc1JlY3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQml0bWFwc1JlY3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGZpbmFsIEJpdG1hcHNWaWV3IHZpZXcgPSBuZXcgQml0bWFwc1ZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBCaXRtYXBzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIFBhaW50IG1CaXRtYXBQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAyOworICAgICAgICBwcml2YXRlIGZpbmFsIFJlY3QgbVNyY1JlY3Q7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVjdEYgbURzdFJlY3Q7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVjdEYgbURzdFJlY3QyOworCisgICAgICAgIEJpdG1hcHNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1CaXRtYXAxID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbUJpdG1hcDIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0Mik7CisKKyAgICAgICAgICAgIG1CaXRtYXBQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUJpdG1hcFBhaW50LnNldEZpbHRlckJpdG1hcCh0cnVlKTsKKworICAgICAgICAgICAgZmluYWwgZmxvYXQgZm91cnRoID0gbUJpdG1hcDEuZ2V0V2lkdGgoKSAvIDQuMGY7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBoYWxmID0gbUJpdG1hcDEuZ2V0SGVpZ2h0KCkgLyAyLjBmOworICAgICAgICAgICAgbVNyY1JlY3QgPSBuZXcgUmVjdCgoaW50KSBmb3VydGgsIChpbnQpIChoYWxmIC0gaGFsZiAvIDIuMGYpLAorICAgICAgICAgICAgICAgICAgICAoaW50KSAoZm91cnRoICsgZm91cnRoKSwgKGludCkgKGhhbGYgKyBoYWxmIC8gMi4wZikpOworICAgICAgICAgICAgbURzdFJlY3QgPSBuZXcgUmVjdEYoZm91cnRoLCBoYWxmIC0gaGFsZiAvIDIuMGYsIGZvdXJ0aCArIGZvdXJ0aCwgaGFsZiArIGhhbGYgLyAyLjBmKTsKKyAgICAgICAgICAgIG1Ec3RSZWN0MiA9IG5ldyBSZWN0Rihmb3VydGgsIGhhbGYgLSBoYWxmIC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgKGZvdXJ0aCArIGZvdXJ0aCkgKiAzLjBmLCAoaGFsZiArIGhhbGYgLyAyLjBmKSAqIDMuMGYpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMjAuMGYsIDUwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCBtU3JjUmVjdCwgbURzdFJlY3QsIG1CaXRtYXBQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgbUJpdG1hcDEuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtMTAwLjBmLCAyNS4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgbVNyY1JlY3QsIG1Ec3RSZWN0MiwgbUJpdG1hcFBhaW50KTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9Db2xvckZpbHRlcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQ29sb3JGaWx0ZXJzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQ2M2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQ29sb3JGaWx0ZXJzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvck1hdHJpeDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yTWF0cml4Q29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5MaWdodGluZ0NvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQ29sb3JGaWx0ZXJzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBCaXRtYXBzVmlldyB2aWV3ID0gbmV3IEJpdG1hcHNWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50Vmlldyh2aWV3KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQml0bWFwc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAyOworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1Db2xvck1hdHJpeFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1MaWdodGluZ1BhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1CbGVuZFBhaW50OworCisgICAgICAgIEJpdG1hcHNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1CaXRtYXAxID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbUJpdG1hcDIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0Mik7CisKKyAgICAgICAgICAgIG1Db2xvck1hdHJpeFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBmaW5hbCBDb2xvck1hdHJpeCBjb2xvck1hdHJpeCA9IG5ldyBDb2xvck1hdHJpeCgpOworICAgICAgICAgICAgY29sb3JNYXRyaXguc2V0U2F0dXJhdGlvbigwKTsKKyAgICAgICAgICAgIG1Db2xvck1hdHJpeFBhaW50LnNldENvbG9yRmlsdGVyKG5ldyBDb2xvck1hdHJpeENvbG9yRmlsdGVyKGNvbG9yTWF0cml4KSk7CisKKyAgICAgICAgICAgIG1MaWdodGluZ1BhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTGlnaHRpbmdQYWludC5zZXRDb2xvckZpbHRlcihuZXcgTGlnaHRpbmdDb2xvckZpbHRlcigweDAwNjBmZmZmLCAweDAwMTAxMDMwKSk7CisKKyAgICAgICAgICAgIG1CbGVuZFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtQmxlbmRQYWludC5zZXRDb2xvckZpbHRlcihuZXcgUG9ydGVyRHVmZkNvbG9yRmlsdGVyKDB4N2Y5OTAwNDAsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfT1ZFUikpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgY2FudmFzLmRyYXdBUkdCKDI1NSwgMjU1LCAyNTUsIDI1NSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEyMC4wZiwgNTAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDAuMGYsIDAuMGYsIG1Db2xvck1hdHJpeFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA1MC4wZiArIG1CaXRtYXAxLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCAwLjBmLCAwLjBmLCBtTGlnaHRpbmdQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNTAuMGYgKyBtQml0bWFwMS5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgMC4wZiwgMC4wZiwgbUJsZW5kUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTIwLjBmICsgbUJpdG1hcDEuZ2V0V2lkdGgoKSArIDEyMC4wZiwgNTAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDIsIDAuMGYsIDAuMGYsIG1Db2xvck1hdHJpeFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA1MC4wZiArIG1CaXRtYXAyLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAyLCAwLjBmLCAwLjBmLCBtTGlnaHRpbmdQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNTAuMGYgKyBtQml0bWFwMi5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMiwgMC4wZiwgMC4wZiwgbUJsZW5kUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0ZyYW1lYnVmZmVyQmxlbmRBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvRnJhbWVidWZmZXJCbGVuZEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1NmJhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0ZyYW1lYnVmZmVyQmxlbmRBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTGluZWFyR3JhZGllbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBGcmFtZWJ1ZmZlckJsZW5kQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBCbGVuZFZpZXcodGhpcykpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBCbGVuZFZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVRleFdpZHRoOworICAgICAgICBwcml2YXRlIGludCBtVGV4SGVpZ2h0OworICAgICAgICBwcml2YXRlIFBhaW50IG1QYWludDsKKyAgICAgICAgcHJpdmF0ZSBMaW5lYXJHcmFkaWVudCBtSG9yR3JhZGllbnQ7CisgICAgICAgIHByaXZhdGUgQml0bWFwIG1UZXh0dXJlOworCisgICAgICAgIEJsZW5kVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtVGV4dHVyZSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIG1UZXhXaWR0aCA9IG1UZXh0dXJlLmdldFdpZHRoKCk7CisgICAgICAgICAgICBtVGV4SGVpZ2h0ID0gbVRleHR1cmUuZ2V0SGVpZ2h0KCk7CisKKyAgICAgICAgICAgIG1Ib3JHcmFkaWVudCA9IG5ldyBMaW5lYXJHcmFkaWVudCgwLjBmLCAwLjBmLCBtVGV4V2lkdGgsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgIENvbG9yLkJMQUNLLCBDb2xvci5XSElURSwgU2hhZGVyLlRpbGVNb2RlLkNMQU1QKTsKKworICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwLjBmLCA0MC4wZik7CisKKyAgICAgICAgICAgIGRyYXdCbGVuZGVkQml0bWFwKGNhbnZhcywgUG9ydGVyRHVmZi5Nb2RlLkRBUktFTik7CisgICAgICAgICAgICBkcmF3QmxlbmRlZEJpdG1hcChjYW52YXMsIFBvcnRlckR1ZmYuTW9kZS5MSUdIVEVOKTsKKyAgICAgICAgICAgIGRyYXdCbGVuZGVkQml0bWFwKGNhbnZhcywgUG9ydGVyRHVmZi5Nb2RlLk1VTFRJUExZKTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoNDAuMGYgKyBtVGV4V2lkdGggKyA0MC4wZiwgNDAuMGYpOworCisgICAgICAgICAgICBkcmF3QmxlbmRlZEJpdG1hcChjYW52YXMsIFBvcnRlckR1ZmYuTW9kZS5TQ1JFRU4pOworICAgICAgICAgICAgZHJhd0JsZW5kZWRCaXRtYXAoY2FudmFzLCBQb3J0ZXJEdWZmLk1vZGUuQUREKTsKKyAgICAgICAgICAgIGRyYXdCbGVuZGVkQml0bWFwSW52ZXJzZShjYW52YXMsIFBvcnRlckR1ZmYuTW9kZS5PVkVSTEFZKTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBkcmF3QmxlbmRlZEJpdG1hcChDYW52YXMgY2FudmFzLCBQb3J0ZXJEdWZmLk1vZGUgbW9kZSkgeworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihudWxsKTsKKyAgICAgICAgICAgIG1QYWludC5zZXRYZmVybW9kZShudWxsKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1UZXh0dXJlLCAwLjBmLCAwLjBmLCBtUGFpbnQpOworCisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Ib3JHcmFkaWVudCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0WGZlcm1vZGUobmV3IFBvcnRlckR1ZmZYZmVybW9kZShtb2RlKSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbVRleFdpZHRoLCBtVGV4SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbVRleEhlaWdodCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZHJhd0JsZW5kZWRCaXRtYXBJbnZlcnNlKENhbnZhcyBjYW52YXMsIFBvcnRlckR1ZmYuTW9kZSBtb2RlKSB7CisgICAgICAgICAgICBtUGFpbnQuc2V0WGZlcm1vZGUobnVsbCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Ib3JHcmFkaWVudCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbVRleFdpZHRoLCBtVGV4SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBtUGFpbnQuc2V0WGZlcm1vZGUobmV3IFBvcnRlckR1ZmZYZmVybW9kZShtb2RlKSk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG51bGwpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobVRleHR1cmUsIDAuMGYsIDAuMGYsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtVGV4SGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0dyYWRpZW50c0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9HcmFkaWVudHNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OWJmZGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9HcmFkaWVudHNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIEdyYWRpZW50c0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBmaW5hbCBGcmFtZUxheW91dCBsYXlvdXQgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisgICAgICAgIGZpbmFsIFNoYWRlcnNWaWV3IHNoYWRlcnNWaWV3ID0gbmV3IFNoYWRlcnNWaWV3KHRoaXMpOworICAgICAgICBmaW5hbCBHcmFkaWVudFZpZXcgZ3JhZGllbnRWaWV3ID0gbmV3IEdyYWRpZW50Vmlldyh0aGlzKTsKKyAgICAgICAgZmluYWwgU2Vla0JhciByb3RhdGVWaWV3ID0gbmV3IFNlZWtCYXIodGhpcyk7CisgICAgICAgIHJvdGF0ZVZpZXcuc2V0TWF4KDM2MCk7CisgICAgICAgIHJvdGF0ZVZpZXcuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIobmV3IFNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBzZWVrQmFyLCBpbnQgcHJvZ3Jlc3MsIGJvb2xlYW4gZnJvbVVzZXIpIHsKKyAgICAgICAgICAgICAgICBncmFkaWVudFZpZXcuc2V0Um90YXRpb25ZKChmbG9hdClwcm9ncmVzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICAKKyAgICAgICAgbGF5b3V0LmFkZFZpZXcoc2hhZGVyc1ZpZXcpOworICAgICAgICBsYXlvdXQuYWRkVmlldyhncmFkaWVudFZpZXcsIG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgMjAwLCAyMDAsIEdyYXZpdHkuQ0VOVEVSKSk7CisgICAgICAgIGxheW91dC5hZGRWaWV3KHJvdGF0ZVZpZXcsIG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgMzAwLCBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIEdyYXZpdHkuQ0VOVEVSX0hPUklaT05UQUwgfCBHcmF2aXR5LkJPVFRPTSkpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBjbGFzcyBHcmFkaWVudFZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUGFpbnQ7CisKKyAgICAgICAgR3JhZGllbnRWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIExpbmVhckdyYWRpZW50IGdyYWRpZW50ID0gbmV3IExpbmVhckdyYWRpZW50KDAsIDAsIDIwMCwgMCwgMHhGRjAwMDAwMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgU2hhZGVyLlRpbGVNb2RlLkNMQU1QKTsKKyAgICAgICAgICAgIG1QYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihncmFkaWVudCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uTWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbigyMDAsIDIwMCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIGdldFdpZHRoKCksIGdldEhlaWdodCgpLCBtUGFpbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFNoYWRlcnNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1EcmF3V2lkdGg7CisgICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbURyYXdIZWlnaHQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgTGluZWFyR3JhZGllbnQgbUdyYWRpZW50OworICAgICAgICBwcml2YXRlIGZpbmFsIE1hdHJpeCBtTWF0cml4OworCisgICAgICAgIFNoYWRlcnNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1EcmF3V2lkdGggPSAyMDA7CisgICAgICAgICAgICBtRHJhd0hlaWdodCA9IDIwMDsKKworICAgICAgICAgICAgbUdyYWRpZW50ID0gbmV3IExpbmVhckdyYWRpZW50KDAsIDAsIDAsIDEsIDB4RkYwMDAwMDAsIDAsIFNoYWRlci5UaWxlTW9kZS5DTEFNUCk7CisgICAgICAgICAgICBtTWF0cml4ID0gbmV3IE1hdHJpeCgpOworCisgICAgICAgICAgICBtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgLy8gR3JhZGllbnRzCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgZmxvYXQgdG9wID0gNDAuMGY7CisgICAgICAgICAgICBmbG9hdCByaWdodCA9IDQwLjBmICsgbURyYXdXaWR0aDsKKyAgICAgICAgICAgIGZsb2F0IGxlZnQgPSA0MC4wZjsKKyAgICAgICAgICAgIGZsb2F0IGJvdHRvbSA9IDQwLjBmICsgbURyYXdIZWlnaHQ7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUdyYWRpZW50KTsKKworICAgICAgICAgICAgbU1hdHJpeC5zZXRTY2FsZSgxLCBtRHJhd1dpZHRoKTsKKyAgICAgICAgICAgIG1NYXRyaXgucG9zdFJvdGF0ZSg5MCk7CisgICAgICAgICAgICBtTWF0cml4LnBvc3RUcmFuc2xhdGUocmlnaHQsIHRvcCk7CisgICAgICAgICAgICBtR3JhZGllbnQuc2V0TG9jYWxNYXRyaXgobU1hdHJpeCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QocmlnaHQgLSBtRHJhd1dpZHRoLCB0b3AsIHJpZ2h0LCB0b3AgKyBtRHJhd0hlaWdodCwgbVBhaW50KTsKKworICAgICAgICAgICAgdG9wICs9IDQwLjBmICsgbURyYXdIZWlnaHQ7CisgICAgICAgICAgICBib3R0b20gKz0gNDAuMGYgKyBtRHJhd0hlaWdodDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbU1hdHJpeC5zZXRTY2FsZSgxLCBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtTWF0cml4LnBvc3RUcmFuc2xhdGUobGVmdCwgdG9wKTsKKyAgICAgICAgICAgIG1HcmFkaWVudC5zZXRMb2NhbE1hdHJpeChtTWF0cml4KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCB0b3AgKyBtRHJhd0hlaWdodCwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbGVmdCArPSA0MC4wZiArIG1EcmF3V2lkdGg7CisgICAgICAgICAgICByaWdodCArPSA0MC4wZiArIG1EcmF3V2lkdGg7CisgICAgICAgICAgICB0b3AgLT0gNDAuMGYgKyBtRHJhd0hlaWdodDsKKyAgICAgICAgICAgIGJvdHRvbSAtPSA0MC4wZiArIG1EcmF3SGVpZ2h0OworCisgICAgICAgICAgICBtTWF0cml4LnNldFNjYWxlKDEsIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1NYXRyaXgucG9zdFJvdGF0ZSgxODApOworICAgICAgICAgICAgbU1hdHJpeC5wb3N0VHJhbnNsYXRlKGxlZnQsIGJvdHRvbSk7CisgICAgICAgICAgICBtR3JhZGllbnQuc2V0TG9jYWxNYXRyaXgobU1hdHJpeCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QobGVmdCwgYm90dG9tIC0gbURyYXdIZWlnaHQsIHJpZ2h0LCBib3R0b20sIG1QYWludCk7CisKKyAgICAgICAgICAgIHRvcCArPSA0MC4wZiArIG1EcmF3SGVpZ2h0OworICAgICAgICAgICAgYm90dG9tICs9IDQwLjBmICsgbURyYXdIZWlnaHQ7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1NYXRyaXguc2V0U2NhbGUoMSwgbURyYXdXaWR0aCk7CisgICAgICAgICAgICBtTWF0cml4LnBvc3RSb3RhdGUoLTkwKTsKKyAgICAgICAgICAgIG1NYXRyaXgucG9zdFRyYW5zbGF0ZShsZWZ0LCB0b3ApOworICAgICAgICAgICAgbUdyYWRpZW50LnNldExvY2FsTWF0cml4KG1NYXRyaXgpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KGxlZnQsIHRvcCwgbGVmdCArIG1EcmF3V2lkdGgsIGJvdHRvbSwgbVBhaW50KTsKKyAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTGFiZWxzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0xhYmVsc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlMDUwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0xhYmVsc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBMYWJlbHNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmxhYmVscyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTGF5ZXJzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0xheWVyc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcwNTExNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0xheWVyc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZlhmZXJtb2RlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgTGF5ZXJzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhuZXcgTGF5ZXJzVmlldyh0aGlzKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIExheWVyc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtTGF5ZXJQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUmVjdFBhaW50OworCisgICAgICAgIExheWVyc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUxheWVyUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1SZWN0UGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTQwLjBmLCAxMDAuMGYpOworCisgICAgICAgICAgICAvL2NhbnZhcy5kcmF3UkdCKDI1NSwgMjU1LCAyNTUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpbnQgY291bnQgPSBjYW52YXMuc2F2ZUxheWVyKDAuMGYsIDAuMGYsIDIwMC4wZiwgMTAwLjBmLCBtTGF5ZXJQYWludCwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkFMTF9TQVZFX0ZMQUcpOworCisgICAgICAgICAgICBtUmVjdFBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDIwMC4wZiwgMTAwLjBmLCBtUmVjdFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KGNvdW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMjUuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5zYXZlTGF5ZXIoMC4wZiwgMC4wZiwgMjAwLjBmLCAxMDAuMGYsIG1MYXllclBhaW50LAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuQUxMX1NBVkVfRkxBRyk7CisKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0Q29sb3IoMHhmZjAwZmYwMCk7CisgICAgICAgICAgICBtUmVjdFBhaW50LnNldEFscGhhKDUwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCAyMDAuMGYsIDEwMC4wZiwgbVJlY3RQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChjb3VudCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMjUuMGYsIDEyNS4wZik7CisKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBtUmVjdFBhaW50LnNldEFscGhhKDI1NSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgMTAwLjBmLCA1MC4wZiwgbVJlY3RQYWludCk7ICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1MYXllclBhaW50LnNldEFscGhhKDEyNyk7CisgICAgICAgICAgICBtTGF5ZXJQYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKFBvcnRlckR1ZmYuTW9kZS5TUkNfT1VUKSk7CisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5zYXZlTGF5ZXIoNTAuMGYsIDI1LjBmLCAxNTAuMGYsIDc1LjBmLCBtTGF5ZXJQYWludCwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkFMTF9TQVZFX0ZMQUcpOworCisgICAgICAgICAgICBtUmVjdFBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDUwLjBmLCAyNS4wZiwgMTUwLjBmLCA3NS4wZiwgbVJlY3RQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChjb3VudCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTI1LjBmKTsKKworICAgICAgICAgICAgbVJlY3RQYWludC5zZXRDb2xvcigweGZmMDAwMGZmKTsKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0QWxwaGEoMjU1KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCAxMDAuMGYsIDUwLjBmLCBtUmVjdFBhaW50KTsgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxheWVyUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBtTGF5ZXJQYWludC5zZXRBbHBoYSgxMjcpOworICAgICAgICAgICAgbUxheWVyUGFpbnQuc2V0WGZlcm1vZGUobmV3IFBvcnRlckR1ZmZYZmVybW9kZShQb3J0ZXJEdWZmLk1vZGUuRFNUX0FUT1ApKTsKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLnNhdmVMYXllcig1MC4wZiwgMjUuMGYsIDE1MC4wZiwgNzUuMGYsIG1MYXllclBhaW50LAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuQUxMX1NBVkVfRkxBRyk7CisKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoNTAuMGYsIDI1LjBmLCAxNTAuMGYsIDc1LjBmLCBtUmVjdFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KGNvdW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxheWVyUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0xpbmVzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0xpbmVzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGM4MzZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTGluZXNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBTaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIExpbmVzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBMaW5lc1ZpZXcgdmlldyA9IG5ldyBMaW5lc1ZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBMaW5lc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVNtYWxsUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbU1lZGl1bVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1MYXJnZVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcFNoYWRlciBtU2hhZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0W10gbVBvaW50czsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtQWxwaGFQYWludDsKKworICAgICAgICBMaW5lc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJpdG1hcDEgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisKKyAgICAgICAgICAgIG1TbWFsbFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIG1TbWFsbFBhaW50LnNldFN0cm9rZVdpZHRoKDEuMGYpOworCisgICAgICAgICAgICBtTWVkaXVtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0U3Ryb2tlV2lkdGgoNC4wZik7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRDb2xvcigweGZmMDBmZjAwKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFN0cm9rZVdpZHRoKDE1LjBmKTsKKworICAgICAgICAgICAgbUFscGhhUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1BbHBoYVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1BbHBoYVBhaW50LnNldENvbG9yKDB4N2ZmZjAwNTApOworICAgICAgICAgICAgbUFscGhhUGFpbnQuc2V0U3Ryb2tlV2lkdGgoMTAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcihtQml0bWFwMSwgQml0bWFwU2hhZGVyLlRpbGVNb2RlLk1JUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgQml0bWFwU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisKKyAgICAgICAgICAgIG1Qb2ludHMgPSBuZXcgZmxvYXRbXSB7CisgICAgICAgICAgICAgICAgICAgIDYyLjBmLCAwLjBmLCAzMDIuMGYsIDQwMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgMzAyLjBmLCA0MDAuMGYsIDM1Mi4wZiwgNDAwLjBmLAorICAgICAgICAgICAgICAgICAgICAzNTIuMGYsIDQwMC4wZiwgMzUyLjBmLCA1MDAuMGYKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgICAgICBjYW52YXMuZHJhd0FSR0IoMjU1LCAyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTAwLjBmLCAyMC4wZik7CisKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgwLjBmLCAwLjBmLCA0MC4wZiwgNDAwLjBmLCBtU21hbGxQYWludCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmUoNS4wZiwgMC4wZiwgOTUuMGYsIDQwMC4wZiwgbU1lZGl1bVBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgyMi4wZiwgMC4wZiwgMTYyLjBmLCA0MDAuMGYsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG1TaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKDQyLjBmLCAwLjBmLCAyMjIuMGYsIDQwMC4wZiwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG51bGwpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmVzKG1Qb2ludHMsIG1BbHBoYVBhaW50KTsKKworICAgICAgICAgICAgbVNtYWxsUGFpbnQuc2V0QW50aUFsaWFzKGZhbHNlKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgwLjBmLCAwLjBmLCA0MDAuMGYsIDAuMGYsIG1TbWFsbFBhaW50KTsKKyAgICAgICAgICAgIG1TbWFsbFBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgwLjBmLCAwLjBmLCAwLjBmLCA0MDAuMGYsIG1TbWFsbFBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgwLjBmLCA0MDAuMGYsIDQwMC4wZiwgNDAwLjBmLCBtU21hbGxQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTIwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIG1BbHBoYVBhaW50LnNldFNoYWRlcihtU2hhZGVyKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZXMobVBvaW50cywgbUFscGhhUGFpbnQpOworICAgICAgICAgICAgbUFscGhhUGFpbnQuc2V0U2hhZGVyKG51bGwpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTGlzdEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9MaXN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmQ0ZjZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTGlzdEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBMaXN0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREFUQV9MSVNUID0geworICAgICAgICAgICAgIkFmZ2hhbmlzdGFuIiwgIkFsYmFuaWEiLCAiQWxnZXJpYSIsICJBbWVyaWNhbiBTYW1vYSIsICJBbmRvcnJhIiwKKyAgICAgICAgICAgICJBbmdvbGEiLCAiQW5ndWlsbGEiLCAiQW50YXJjdGljYSIsICJBbnRpZ3VhIGFuZCBCYXJidWRhIiwgIkFyZ2VudGluYSIsCisgICAgICAgICAgICAiQXJtZW5pYSIsICJBcnViYSIsICJBdXN0cmFsaWEiLCAiQXVzdHJpYSIsICJBemVyYmFpamFuIiwKKyAgICAgICAgICAgICJCYWhyYWluIiwgIkJhbmdsYWRlc2giLCAiQmFyYmFkb3MiLCAiQmVsYXJ1cyIsICJCZWxnaXVtIiwKKyAgICAgICAgICAgICJCZWxpemUiLCAiQmVuaW4iLCAiQmVybXVkYSIsICJCaHV0YW4iLCAiQm9saXZpYSIsCisgICAgICAgICAgICAiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSIsICJCb3Rzd2FuYSIsICJCb3V2ZXQgSXNsYW5kIiwgIkJyYXppbCIsCisgICAgICAgICAgICAiQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5IiwgIkJyaXRpc2ggVmlyZ2luIElzbGFuZHMiLCAiQnJ1bmVpIiwgIkJ1bGdhcmlhIiwKKyAgICAgICAgICAgICJCdXJraW5hIEZhc28iLCAiQnVydW5kaSIsICJDb3RlIGQnSXZvaXJlIiwgIkNhbWJvZGlhIiwgIkNhbWVyb29uIiwgIkNhbmFkYSIsICJDYXBlIFZlcmRlIiwKKyAgICAgICAgICAgICJDYXltYW4gSXNsYW5kcyIsICJDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMiLCAiQ2hhZCIsICJDaGlsZSIsICJDaGluYSIsCisgICAgICAgICAgICAiQ2hyaXN0bWFzIElzbGFuZCIsICJDb2NvcyAoS2VlbGluZykgSXNsYW5kcyIsICJDb2xvbWJpYSIsICJDb21vcm9zIiwgIkNvbmdvIiwKKyAgICAgICAgICAgICJDb29rIElzbGFuZHMiLCAiQ29zdGEgUmljYSIsICJDcm9hdGlhIiwgIkN1YmEiLCAiQ3lwcnVzIiwgIkN6ZWNoIFJlcHVibGljIiwKKyAgICAgICAgICAgICJEZW1vY3JhdGljIFJlcHVibGljIG9mIHRoZSBDb25nbyIsICJEZW5tYXJrIiwgIkRqaWJvdXRpIiwgIkRvbWluaWNhIiwgIkRvbWluaWNhbiBSZXB1YmxpYyIsCisgICAgICAgICAgICAiRWFzdCBUaW1vciIsICJFY3VhZG9yIiwgIkVneXB0IiwgIkVsIFNhbHZhZG9yIiwgIkVxdWF0b3JpYWwgR3VpbmVhIiwgIkVyaXRyZWEiLAorICAgICAgICAgICAgIkVzdG9uaWEiLCAiRXRoaW9waWEiLCAiRmFlcm9lIElzbGFuZHMiLCAiRmFsa2xhbmQgSXNsYW5kcyIsICJGaWppIiwgIkZpbmxhbmQiLAorICAgICAgICAgICAgIkZvcm1lciBZdWdvc2xhdiBSZXB1YmxpYyBvZiBNYWNlZG9uaWEiLCAiRnJhbmNlIiwgIkZyZW5jaCBHdWlhbmEiLCAiRnJlbmNoIFBvbHluZXNpYSIsCisgICAgICAgICAgICAiRnJlbmNoIFNvdXRoZXJuIFRlcnJpdG9yaWVzIiwgIkdhYm9uIiwgIkdlb3JnaWEiLCAiR2VybWFueSIsICJHaGFuYSIsICJHaWJyYWx0YXIiLAorICAgICAgICAgICAgIkdyZWVjZSIsICJHcmVlbmxhbmQiLCAiR3JlbmFkYSIsICJHdWFkZWxvdXBlIiwgIkd1YW0iLCAiR3VhdGVtYWxhIiwgIkd1aW5lYSIsICJHdWluZWEtQmlzc2F1IiwKKyAgICAgICAgICAgICJHdXlhbmEiLCAiSGFpdGkiLCAiSGVhcmQgSXNsYW5kIGFuZCBNY0RvbmFsZCBJc2xhbmRzIiwgIkhvbmR1cmFzIiwgIkhvbmcgS29uZyIsICJIdW5nYXJ5IiwKKyAgICAgICAgICAgICJJY2VsYW5kIiwgIkluZGlhIiwgIkluZG9uZXNpYSIsICJJcmFuIiwgIklyYXEiLCAiSXJlbGFuZCIsICJJc3JhZWwiLCAiSXRhbHkiLCAiSmFtYWljYSIsCisgICAgICAgICAgICAiSmFwYW4iLCAiSm9yZGFuIiwgIkthemFraHN0YW4iLCAiS2VueWEiLCAiS2lyaWJhdGkiLCAiS3V3YWl0IiwgIkt5cmd5enN0YW4iLCAiTGFvcyIsCisgICAgICAgICAgICAiTGF0dmlhIiwgIkxlYmFub24iLCAiTGVzb3RobyIsICJMaWJlcmlhIiwgIkxpYnlhIiwgIkxpZWNodGVuc3RlaW4iLCAiTGl0aHVhbmlhIiwgIkx1eGVtYm91cmciLAorICAgICAgICAgICAgIk1hY2F1IiwgIk1hZGFnYXNjYXIiLCAiTWFsYXdpIiwgIk1hbGF5c2lhIiwgIk1hbGRpdmVzIiwgIk1hbGkiLCAiTWFsdGEiLCAiTWFyc2hhbGwgSXNsYW5kcyIsCisgICAgICAgICAgICAiTWFydGluaXF1ZSIsICJNYXVyaXRhbmlhIiwgIk1hdXJpdGl1cyIsICJNYXlvdHRlIiwgIk1leGljbyIsICJNaWNyb25lc2lhIiwgIk1vbGRvdmEiLAorICAgICAgICAgICAgIk1vbmFjbyIsICJNb25nb2xpYSIsICJNb250c2VycmF0IiwgIk1vcm9jY28iLCAiTW96YW1iaXF1ZSIsICJNeWFubWFyIiwgIk5hbWliaWEiLAorICAgICAgICAgICAgIk5hdXJ1IiwgIk5lcGFsIiwgIk5ldGhlcmxhbmRzIiwgIk5ldGhlcmxhbmRzIEFudGlsbGVzIiwgIk5ldyBDYWxlZG9uaWEiLCAiTmV3IFplYWxhbmQiLAorICAgICAgICAgICAgIk5pY2FyYWd1YSIsICJOaWdlciIsICJOaWdlcmlhIiwgIk5pdWUiLCAiTm9yZm9sayBJc2xhbmQiLCAiTm9ydGggS29yZWEiLCAiTm9ydGhlcm4gTWFyaWFuYXMiLAorICAgICAgICAgICAgIk5vcndheSIsICJPbWFuIiwgIlBha2lzdGFuIiwgIlBhbGF1IiwgIlBhbmFtYSIsICJQYXB1YSBOZXcgR3VpbmVhIiwgIlBhcmFndWF5IiwgIlBlcnUiLAorICAgICAgICAgICAgIlBoaWxpcHBpbmVzIiwgIlBpdGNhaXJuIElzbGFuZHMiLCAiUG9sYW5kIiwgIlBvcnR1Z2FsIiwgIlB1ZXJ0byBSaWNvIiwgIlFhdGFyIiwKKyAgICAgICAgICAgICJSZXVuaW9uIiwgIlJvbWFuaWEiLCAiUnVzc2lhIiwgIlJ3YW5kYSIsICJTcW8gVG9tZSBhbmQgUHJpbmNpcGUiLCAiU2FpbnQgSGVsZW5hIiwKKyAgICAgICAgICAgICJTYWludCBLaXR0cyBhbmQgTmV2aXMiLCAiU2FpbnQgTHVjaWEiLCAiU2FpbnQgUGllcnJlIGFuZCBNaXF1ZWxvbiIsCisgICAgICAgICAgICAiU2FpbnQgVmluY2VudCBhbmQgdGhlIEdyZW5hZGluZXMiLCAiU2Ftb2EiLCAiU2FuIE1hcmlubyIsICJTYXVkaSBBcmFiaWEiLCAiU2VuZWdhbCIsCisgICAgICAgICAgICAiU2V5Y2hlbGxlcyIsICJTaWVycmEgTGVvbmUiLCAiU2luZ2Fwb3JlIiwgIlNsb3Zha2lhIiwgIlNsb3ZlbmlhIiwgIlNvbG9tb24gSXNsYW5kcyIsCisgICAgICAgICAgICAiU29tYWxpYSIsICJTb3V0aCBBZnJpY2EiLCAiU291dGggR2VvcmdpYSBhbmQgdGhlIFNvdXRoIFNhbmR3aWNoIElzbGFuZHMiLCAiU291dGggS29yZWEiLAorICAgICAgICAgICAgIlNwYWluIiwgIlNyaSBMYW5rYSIsICJTdWRhbiIsICJTdXJpbmFtZSIsICJTdmFsYmFyZCBhbmQgSmFuIE1heWVuIiwgIlN3YXppbGFuZCIsICJTd2VkZW4iLAorICAgICAgICAgICAgIlN3aXR6ZXJsYW5kIiwgIlN5cmlhIiwgIlRhaXdhbiIsICJUYWppa2lzdGFuIiwgIlRhbnphbmlhIiwgIlRoYWlsYW5kIiwgIlRoZSBCYWhhbWFzIiwKKyAgICAgICAgICAgICJUaGUgR2FtYmlhIiwgIlRvZ28iLCAiVG9rZWxhdSIsICJUb25nYSIsICJUcmluaWRhZCBhbmQgVG9iYWdvIiwgIlR1bmlzaWEiLCAiVHVya2V5IiwKKyAgICAgICAgICAgICJUdXJrbWVuaXN0YW4iLCAiVHVya3MgYW5kIENhaWNvcyBJc2xhbmRzIiwgIlR1dmFsdSIsICJWaXJnaW4gSXNsYW5kcyIsICJVZ2FuZGEiLAorICAgICAgICAgICAgIlVrcmFpbmUiLCAiVW5pdGVkIEFyYWIgRW1pcmF0ZXMiLCAiVW5pdGVkIEtpbmdkb20iLAorICAgICAgICAgICAgIlVuaXRlZCBTdGF0ZXMiLCAiVW5pdGVkIFN0YXRlcyBNaW5vciBPdXRseWluZyBJc2xhbmRzIiwgIlVydWd1YXkiLCAiVXpiZWtpc3RhbiIsCisgICAgICAgICAgICAiVmFudWF0dSIsICJWYXRpY2FuIENpdHkiLCAiVmVuZXp1ZWxhIiwgIlZpZXRuYW0iLCAiV2FsbGlzIGFuZCBGdXR1bmEiLCAiV2VzdGVybiBTYWhhcmEiLAorICAgICAgICAgICAgIlllbWVuIiwgIll1Z29zbGF2aWEiLCAiWmFtYmlhIiwgIlppbWJhYndlIgorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lmxpc3RfYWN0aXZpdHkpOworCisgICAgICAgIExpc3RBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgU2ltcGxlTGlzdEFkYXB0ZXIodGhpcyk7CisKKyAgICAgICAgTGlzdFZpZXcgbGlzdCA9IChMaXN0VmlldykgZmluZFZpZXdCeUlkKFIuaWQubGlzdCk7CisgICAgICAgIGxpc3Quc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICAgICAgCisgICAgICAgIHJlZ2lzdGVyRm9yQ29udGV4dE1lbnUobGlzdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51LCBWaWV3IHYsIENvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbyBtZW51SW5mbykgeworICAgICAgICBzdXBlci5vbkNyZWF0ZUNvbnRleHRNZW51KG1lbnUsIHYsIG1lbnVJbmZvKTsKKyAgICAgICAgbWVudS5zZXRIZWFkZXJUaXRsZSgiQ29udGV4dCBtZW51Iik7CisgICAgICAgIG1lbnUuYWRkKCJMaXN0IGl0ZW0gMSIpOworICAgICAgICBtZW51LmFkZCgiTGlzdCBpdGVtIDIiKTsKKyAgICAgICAgbWVudS5hZGQoIkxpc3QgaXRlbSAzIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2ltcGxlTGlzdEFkYXB0ZXIgZXh0ZW5kcyBBcnJheUFkYXB0ZXI8U3RyaW5nPiB7CisgICAgICAgIHB1YmxpYyBTaW1wbGVMaXN0QWRhcHRlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV8xLCBEQVRBX0xJU1QpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgICAgICBUZXh0VmlldyB2ID0gKFRleHRWaWV3KSBzdXBlci5nZXRWaWV3KHBvc2l0aW9uLCBjb252ZXJ0VmlldywgcGFyZW50KTsKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOworICAgICAgICAgICAgZmluYWwgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IHIuZ2V0RGlzcGxheU1ldHJpY3MoKTsKKyAgICAgICAgICAgIHYuc2V0Q29tcG91bmREcmF3YWJsZVBhZGRpbmcoKGludCkgKDYgKiBtZXRyaWNzLmRlbnNpdHkgKyAwLjVmKSk7CisgICAgICAgICAgICB2LnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhyLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNvbiksCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTW9yZVNoYWRlcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTW9yZVNoYWRlcnNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MmE0NzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9Nb3JlU2hhZGVyc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db21wb3NlU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTGlnaHRpbmdDb2xvckZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgTW9yZVNoYWRlcnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcobmV3IFNoYWRlcnNWaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgU2hhZGVyc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXBTaGFkZXIgbVNjYWxlZFNoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVRleFdpZHRoOworICAgICAgICBwcml2YXRlIGludCBtVGV4SGVpZ2h0OworICAgICAgICBwcml2YXRlIFBhaW50IG1QYWludDsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtRHJhd1dpZHRoOworICAgICAgICBwcml2YXRlIGZsb2F0IG1EcmF3SGVpZ2h0OworICAgICAgICBwcml2YXRlIExpbmVhckdyYWRpZW50IG1Ib3JHcmFkaWVudDsKKyAgICAgICAgcHJpdmF0ZSBMaW5lYXJHcmFkaWVudCBtVmVydEdyYWRpZW50OworICAgICAgICBwcml2YXRlIENvbXBvc2VTaGFkZXIgbUNvbXBvc2VTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTJTaGFkZXI7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbUxhcmdlUGFpbnQ7CisgICAgICAgIHByaXZhdGUgQml0bWFwU2hhZGVyIG1TY2FsZWQyU2hhZGVyOworICAgICAgICBwcml2YXRlIENvbG9yRmlsdGVyIG1Db2xvckZpbHRlcjsKKworICAgICAgICBTaGFkZXJzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBCaXRtYXAgdGV4dHVyZSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIG1UZXhXaWR0aCA9IHRleHR1cmUuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIG1UZXhIZWlnaHQgPSB0ZXh0dXJlLmdldEhlaWdodCgpOworICAgICAgICAgICAgbURyYXdXaWR0aCA9IG1UZXhXaWR0aCAqIDIuMmY7CisgICAgICAgICAgICBtRHJhd0hlaWdodCA9IG1UZXhIZWlnaHQgKiAxLjJmOworCisgICAgICAgICAgICBtU2NhbGVkU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcih0ZXh0dXJlLCBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SLAorICAgICAgICAgICAgICAgICAgICBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SKTsKKyAgICAgICAgICAgIE1hdHJpeCBtMiA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgICAgIG0yLnNldFNjYWxlKDAuNWYsIDAuNWYpOworICAgICAgICAgICAgbVNjYWxlZFNoYWRlci5zZXRMb2NhbE1hdHJpeChtMik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1TY2FsZWQyU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcih0ZXh0dXJlLCBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SLAorICAgICAgICAgICAgICAgICAgICBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SKTsKKyAgICAgICAgICAgIE1hdHJpeCBtMyA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgICAgIG0zLnNldFNjYWxlKDAuMWYsIDAuMWYpOworICAgICAgICAgICAgbVNjYWxlZDJTaGFkZXIuc2V0TG9jYWxNYXRyaXgobTMpOworCisgICAgICAgICAgICBtSG9yR3JhZGllbnQgPSBuZXcgTGluZWFyR3JhZGllbnQoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IuUkVELCAweDdmMDBmZjAwLCBTaGFkZXIuVGlsZU1vZGUuQ0xBTVApOworICAgICAgICAgICAgCisgICAgICAgICAgICBtVmVydEdyYWRpZW50ID0gbmV3IExpbmVhckdyYWRpZW50KDAuMGYsIDAuMGYsIDAuMGYsIG1EcmF3SGVpZ2h0IC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IuWUVMTE9XLCBDb2xvci5NQUdFTlRBLCBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SKTsKKworICAgICAgICAgICAgbUNvbXBvc2VTaGFkZXIgPSBuZXcgQ29tcG9zZVNoYWRlcihtU2NhbGVkU2hhZGVyLCBtSG9yR3JhZGllbnQsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfT1ZFUik7CisgICAgICAgICAgICBtQ29tcG9zZTJTaGFkZXIgPSBuZXcgQ29tcG9zZVNoYWRlcihtSG9yR3JhZGllbnQsIG1TY2FsZWRTaGFkZXIsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfT1VUKTsKKworICAgICAgICAgICAgbUNvbG9yRmlsdGVyID0gbmV3IExpZ2h0aW5nQ29sb3JGaWx0ZXIoMHgwMDYwZmZmZiwgMHgwMDEwMTAzMCk7CisgCisgICAgICAgICAgICBtTGFyZ2VQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0VGV4dFNpemUoMzYuMGYpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDAwMCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1QYWludCA9IG5ldyBQYWludCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UkdCKDI1NSwgMjU1LCAyNTUpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSg0MC4wZiwgNDAuMGYpOworCisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUNvbXBvc2UyU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoNDAuMGYgKyBtRHJhd1dpZHRoICsgNDAuMGYsIDQwLjBmKTsKKworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG1Ib3JHcmFkaWVudCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIk9wZW5HTCByZW5kZXJpbmciLCAwLjBmLCAyMC4wZiwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTaGFkZXIobVNjYWxlZDJTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJPcGVuR0wgcmVuZGVyaW5nIiwgMC4wZiwgNjAuMGYsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlMlNoYWRlcik7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRDb2xvckZpbHRlcihtQ29sb3JGaWx0ZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJPcGVuR0wgcmVuZGVyaW5nIiwgMC4wZiwgMTAwLjBmLCBtTGFyZ2VQYWludCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRDb2xvckZpbHRlcihudWxsKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihtVmVydEdyYWRpZW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiT3BlbkdMIHJlbmRlcmluZyIsIDAuMGYsIDIwLjBmLCBtTGFyZ2VQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9OZXdMYXllcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTmV3TGF5ZXJzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWEyODkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTmV3TGF5ZXJzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgTmV3TGF5ZXJzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhuZXcgTGF5ZXJzVmlldyh0aGlzKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIExheWVyc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtTGF5ZXJQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUmVjdFBhaW50OworCisgICAgICAgIExheWVyc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUxheWVyUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1MYXllclBhaW50LnNldEFscGhhKDEyNyk7CisgICAgICAgICAgICBtUmVjdFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtUmVjdFBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0VGV4dFNpemUoMjQuMGYpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UkdCKDEyOCwgMjU1LCAxMjgpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDE0MC4wZiwgMTAwLjBmKTsKKyAgICAgICAgICAgIGRyYXdTdHVmZihjYW52YXMsIENhbnZhcy5BTExfU0FWRV9GTEFHKTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAyMDAuMGYpOworICAgICAgICAgICAgZHJhd1N0dWZmKGNhbnZhcywgQ2FudmFzLkhBU19BTFBIQV9MQVlFUl9TQVZFX0ZMQUcpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRyYXdTdHVmZihDYW52YXMgY2FudmFzLCBpbnQgc2F2ZUZsYWdzKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSBjYW52YXMuc2F2ZUxheWVyKDAuMGYsIDAuMGYsIDIwMC4wZiwgMTAwLjBmLCBtTGF5ZXJQYWludCwgc2F2ZUZsYWdzKTsKKworICAgICAgICAgICAgbVJlY3RQYWludC5zZXRDb2xvcigweDdmZmYwMDAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgtMjAuMGYsIC0yMC4wZiwgMjIwLjBmLCAxMjAuMGYsIG1SZWN0UGFpbnQpOworCisgICAgICAgICAgICBtUmVjdFBhaW50LnNldENvbG9yKDB4ZmYwMDAwMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJUaGlzIGlzIGEgdmVyeSBsb25nIHN0cmluZyB0byBvdmVybGFwIGJldHdlZW4gbGF5ZXJzIGFuZCBmcmFtZWJ1ZmZlciIsCisgICAgICAgICAgICAgICAgICAgIC0xMDAuMGYsIDUwLjBmLCBtUmVjdFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KGNvdW50KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL05pbmVQYXRjaGVzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL05pbmVQYXRjaGVzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDEwZjc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTmluZVBhdGNoZXNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIE5pbmVQYXRjaGVzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAKKyAgICAgICAgRnJhbWVMYXlvdXQgbGF5b3V0ID0gbmV3IEZyYW1lTGF5b3V0KHRoaXMpOworICAgICAgICBCdXR0b24gYiA9IG5ldyBCdXR0b24odGhpcyk7CisgICAgICAgIGIuc2V0TGF5b3V0UGFyYW1zKG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULCBHcmF2aXR5LkNFTlRFUikpOworICAgICAgICBiLnNldFRleHQoIjkgcGF0Y2hlcyIpOworICAgICAgICBsYXlvdXQuYWRkVmlldyhiKTsKKyAgICAgICAgbGF5b3V0LnNldEJhY2tncm91bmRDb2xvcigweGZmZmZmZmZmKTsKKyAgICAgICAgCisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvUGF0aHNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvUGF0aHNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkOWJmMzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9QYXRoc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgUGF0aHNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGZpbmFsIFBhdGhzVmlldyB2aWV3ID0gbmV3IFBhdGhzVmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcodmlldyk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFBhdGhzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtU21hbGxQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtTWVkaXVtUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUxhcmdlUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwU2hhZGVyIG1TaGFkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGF0aCBtUGF0aDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWN0RiBtUGF0aEJvdW5kczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtQm91bmRzUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXA7CisgICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbU9mZnNldDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtTGluZVBhaW50OworCisgICAgICAgIFBhdGhzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtQml0bWFwMSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKworICAgICAgICAgICAgbVNtYWxsUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1TbWFsbFBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1TbWFsbFBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOworICAgICAgICAgICAgbVNtYWxsUGFpbnQuc2V0U3Ryb2tlV2lkdGgoMS4wZik7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5TVFJPS0UpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtTGluZVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTGluZVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1MaW5lUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDBmZik7CisgICAgICAgICAgICBtTGluZVBhaW50LnNldFN0cm9rZVdpZHRoKDEuMGYpOworICAgICAgICAgICAgbUxpbmVQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5TVFJPS0UpOworCisgICAgICAgICAgICBtTWVkaXVtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0U3Ryb2tlV2lkdGgoMTAuMGYpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldFN0eWxlKFBhaW50LlN0eWxlLlNUUk9LRSk7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRDb2xvcigweGZmMDBmZjAwKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFN0cm9rZVdpZHRoKDE1LjBmKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFN0eWxlKFBhaW50LlN0eWxlLkZJTEwpOworCisgICAgICAgICAgICBtU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcihtQml0bWFwMSwgQml0bWFwU2hhZGVyLlRpbGVNb2RlLk1JUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgQml0bWFwU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisKKyAgICAgICAgICAgIG1QYXRoID0gbmV3IFBhdGgoKTsKKyAgICAgICAgICAgIG1QYXRoLm1vdmVUbygwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIG1QYXRoLmN1YmljVG8oMC4wZiwgMC4wZiwgMTAwLjBmLCAxNTAuMGYsIDEwMC4wZiwgMjAwLjBmKTsKKyAgICAgICAgICAgIG1QYXRoLmN1YmljVG8oMTAwLjBmLCAyMDAuMGYsIDUwLjBmLCAzMDAuMGYsIC04MC4wZiwgMjAwLjBmKTsKKyAgICAgICAgICAgIG1QYXRoLmN1YmljVG8oLTgwLjBmLCAyMDAuMGYsIDEwMC4wZiwgMjAwLjBmLCAyMDAuMGYsIDAuMGYpOworCisgICAgICAgICAgICBtUGF0aEJvdW5kcyA9IG5ldyBSZWN0RigpOworICAgICAgICAgICAgbVBhdGguY29tcHV0ZUJvdW5kcyhtUGF0aEJvdW5kcywgdHJ1ZSk7CisKKyAgICAgICAgICAgIG1Cb3VuZHNQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUJvdW5kc1BhaW50LnNldENvbG9yKDB4NDAwMGZmMDApOworCisgICAgICAgICAgICBtT2Zmc2V0ID0gbU1lZGl1bVBhaW50LmdldFN0cm9rZVdpZHRoKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSAoaW50KSAobVBhdGhCb3VuZHMud2lkdGgoKSArIG1PZmZzZXQgKiAzLjBmICsgMC41Zik7CisgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gKGludCkgKG1QYXRoQm91bmRzLmhlaWdodCgpICsgbU9mZnNldCAqIDMuMGYgKyAwLjVmKTsKKyAgICAgICAgICAgIG1CaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHdpZHRoLCBoZWlnaHQsIEJpdG1hcC5Db25maWcuQUxQSEFfOCk7CisgICAgICAgICAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhtQml0bWFwKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLW1QYXRoQm91bmRzLmxlZnQgKyBtT2Zmc2V0ICogMS41ZiwgLW1QYXRoQm91bmRzLnRvcCArIG1PZmZzZXQgKiAxLjVmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbU1lZGl1bVBhaW50KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3QVJHQigyNTUsIDI1NSwgMjU1LCAyNTUpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgyMDAuMGYsIDYwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbVNtYWxsUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDM1MC4wZiwgMC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVBhdGgsIG1NZWRpdW1QYWludCk7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihtU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMzUwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG51bGwpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMjAwLjBmLCAzNjAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRoKG1QYXRoLCBtU21hbGxQYWludCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QobVBhdGhCb3VuZHMsIG1Cb3VuZHNQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMzUwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAsIG1QYXRoQm91bmRzLmxlZnQgLSBtT2Zmc2V0ICogMS41ZiwKKyAgICAgICAgICAgICAgICAgICAgbVBhdGhCb3VuZHMudG9wIC0gbU9mZnNldCAqIDEuNWYsIG51bGwpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KG1QYXRoQm91bmRzLCBtQm91bmRzUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKDAuMGYsIC0zNjAuMGYsIDAuMGYsIDUwMC4wZiwgbUxpbmVQYWludCk7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihtU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMzUwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KG1QYXRoQm91bmRzLCBtQm91bmRzUGFpbnQpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG51bGwpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1F1aWNrUmVqZWN0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1F1aWNrUmVqZWN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTkyYmZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvUXVpY2tSZWplY3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBRdWlja1JlamVjdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZmluYWwgUXVpY2tSZWplY3RWaWV3IHZpZXcgPSBuZXcgUXVpY2tSZWplY3RWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50Vmlldyh2aWV3KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgUXVpY2tSZWplY3RWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbUJpdG1hcFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMTsKKworICAgICAgICBRdWlja1JlamVjdFZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJpdG1hcDEgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisKKyAgICAgICAgICAgIG1CaXRtYXBQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUJpdG1hcFBhaW50LnNldEZpbHRlckJpdG1hcCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisKKyAgICAgICAgICAgIGludCBjb3VudCA9IGNhbnZhcy5nZXRTYXZlQ291bnQoKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudD0iICsgY291bnQpOworICAgICAgICAgICAgY291bnQgPSBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImNvdW50IGFmdGVyIHNhdmU9IiArIGNvdW50KTsKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLmdldFNhdmVDb3VudCgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImdldFNhdmVDb3VudCBhZnRlciBzYXZlPSIgKyBjb3VudCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICAgICAgY291bnQgPSBjYW52YXMuZ2V0U2F2ZUNvdW50KCk7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiY291bnQgYWZ0ZXIgcmVzdG9yZT0iICsgY291bnQpOworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudCBhZnRlciBzYXZlPSIgKyBjYW52YXMuZ2V0U2F2ZUNvdW50KCkpOworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudCBhZnRlciBzYXZlPSIgKyBjYW52YXMuZ2V0U2F2ZUNvdW50KCkpOworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudCBhZnRlciBzYXZlPSIgKyBjYW52YXMuZ2V0U2F2ZUNvdW50KCkpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KGNvdW50KTsKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLmdldFNhdmVDb3VudCgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImNvdW50IGFmdGVyIHJlc3RvcmVUb0NvdW50PSIgKyBjb3VudCk7CisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5zYXZlTGF5ZXIoMCwgMCwgMTAsIDEwLCBtQml0bWFwUGFpbnQsIENhbnZhcy5BTExfU0FWRV9GTEFHKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudCBhZnRlciBzYXZlTGF5ZXI9IiArIGNvdW50KTsKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLmdldFNhdmVDb3VudCgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImdldFNhdmVDb3VudCBhZnRlciBzYXZlTGF5ZXI9IiArIGNvdW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5nZXRTYXZlQ291bnQoKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudCBhZnRlciByZXN0b3JlPSIgKyBjb3VudCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoMC4wZiwgMC4wZiwgNDAuMGYsIDQwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCAwLjBmLCAwLjBmLCBtQml0bWFwUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIC1tQml0bWFwMS5nZXRXaWR0aCgpLCAwLjBmLCBtQml0bWFwUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDUwLjBmLCAwLjBmLCBtQml0bWFwUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9SZXNpemVBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvUmVzaXplQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGY5ZGUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvUmVzaXplQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFJlc2l6ZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmZvcm0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1JvdGF0aW9uQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1JvdGF0aW9uQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzMwOWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvUm90YXRpb25BY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBSb3RhdGlvbkFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBEcmF3aW5nVmlldyBjb250YWluZXIgPSBuZXcgRHJhd2luZ1ZpZXcodGhpcyk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcoY29udGFpbmVyKTsKKyAgICB9CisgICAgCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorICAgIHN0YXRpYyBpbnQgZGlwVG9QeChDb250ZXh0IGMsIGludCBkaXApIHsKKyAgICAgICAgcmV0dXJuIChpbnQpIChjLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eSAqIGRpcCArIDAuNWYpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBEcmF3aW5nVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1QYWludDsKKworICAgICAgICBEcmF3aW5nVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZShkaXBUb1B4KGdldENvbnRleHQoKSwgNDAwKSwgZGlwVG9QeChnZXRDb250ZXh0KCksIDIwMCkpOworICAgICAgICAgICAgY2FudmFzLnJvdGF0ZSg0NS4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgtODAuMGYsIC04MC4wZiwgODAuMGYsIDgwLjBmLCBtUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDIyMC4wZiwgMjIwLjBmLCBtUGFpbnQpOyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1NoYWRlcnNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvU2hhZGVyc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRiMTA3MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1NoYWRlcnNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBTaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBTaGFkZXJzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBTaGFkZXJzVmlldyh0aGlzKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFNoYWRlcnNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgQml0bWFwU2hhZGVyIG1SZXBlYXRTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQml0bWFwU2hhZGVyIG1UcmFuc2xhdGVkU2hhZGVyOworICAgICAgICBwcml2YXRlIEJpdG1hcFNoYWRlciBtU2NhbGVkU2hhZGVyOworICAgICAgICBwcml2YXRlIGludCBtVGV4V2lkdGg7CisgICAgICAgIHByaXZhdGUgaW50IG1UZXhIZWlnaHQ7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbVBhaW50OworICAgICAgICBwcml2YXRlIGZsb2F0IG1EcmF3V2lkdGg7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbURyYXdIZWlnaHQ7CisgICAgICAgIHByaXZhdGUgTGluZWFyR3JhZGllbnQgbUhvckdyYWRpZW50OworICAgICAgICBwcml2YXRlIExpbmVhckdyYWRpZW50IG1EaWFnR3JhZGllbnQ7CisgICAgICAgIHByaXZhdGUgTGluZWFyR3JhZGllbnQgbVZlcnRHcmFkaWVudDsKKworICAgICAgICBTaGFkZXJzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBCaXRtYXAgdGV4dHVyZSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIG1UZXhXaWR0aCA9IHRleHR1cmUuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIG1UZXhIZWlnaHQgPSB0ZXh0dXJlLmdldEhlaWdodCgpOworICAgICAgICAgICAgbURyYXdXaWR0aCA9IG1UZXhXaWR0aCAqIDIuMmY7CisgICAgICAgICAgICBtRHJhd0hlaWdodCA9IG1UZXhIZWlnaHQgKiAxLjJmOworCisgICAgICAgICAgICBtUmVwZWF0U2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcih0ZXh0dXJlLCBTaGFkZXIuVGlsZU1vZGUuUkVQRUFULAorICAgICAgICAgICAgICAgICAgICBTaGFkZXIuVGlsZU1vZGUuUkVQRUFUKTsKKworICAgICAgICAgICAgbVRyYW5zbGF0ZWRTaGFkZXIgPSBuZXcgQml0bWFwU2hhZGVyKHRleHR1cmUsIFNoYWRlci5UaWxlTW9kZS5SRVBFQVQsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5SRVBFQVQpOworICAgICAgICAgICAgTWF0cml4IG0xID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbTEuc2V0VHJhbnNsYXRlKG1UZXhXaWR0aCAvIDIuMGYsIG1UZXhIZWlnaHQgLyAyLjBmKTsKKyAgICAgICAgICAgIG0xLnBvc3RSb3RhdGUoNDUsIDAsIDApOworICAgICAgICAgICAgbVRyYW5zbGF0ZWRTaGFkZXIuc2V0TG9jYWxNYXRyaXgobTEpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtU2NhbGVkU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcih0ZXh0dXJlLCBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SLAorICAgICAgICAgICAgICAgICAgICBTaGFkZXIuVGlsZU1vZGUuTUlSUk9SKTsKKyAgICAgICAgICAgIE1hdHJpeCBtMiA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgICAgIG0yLnNldFNjYWxlKDAuNWYsIDAuNWYpOworICAgICAgICAgICAgbVNjYWxlZFNoYWRlci5zZXRMb2NhbE1hdHJpeChtMik7CisKKyAgICAgICAgICAgIG1Ib3JHcmFkaWVudCA9IG5ldyBMaW5lYXJHcmFkaWVudCgwLjBmLCAwLjBmLCAxLjBmLCAwLjBmLAorICAgICAgICAgICAgICAgICAgICBDb2xvci5SRUQsIENvbG9yLkdSRUVOLCBTaGFkZXIuVGlsZU1vZGUuQ0xBTVApOworICAgICAgICAgICAgTWF0cml4IG0zID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbTMuc2V0U2NhbGUobURyYXdIZWlnaHQsIDEuMGYpOworICAgICAgICAgICAgbTMucG9zdFJvdGF0ZSgtOTAuMGYpOworICAgICAgICAgICAgbTMucG9zdFRyYW5zbGF0ZSgwLjBmLCBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtSG9yR3JhZGllbnQuc2V0TG9jYWxNYXRyaXgobTMpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtRGlhZ0dyYWRpZW50ID0gbmV3IExpbmVhckdyYWRpZW50KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGggLyAxLjVmLCBtRHJhd0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IuQkxVRSwgQ29sb3IuTUFHRU5UQSwgU2hhZGVyLlRpbGVNb2RlLkNMQU1QKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVZlcnRHcmFkaWVudCA9IG5ldyBMaW5lYXJHcmFkaWVudCgwLjBmLCAwLjBmLCAwLjBmLCBtRHJhd0hlaWdodCAvIDIuMGYsCisgICAgICAgICAgICAgICAgICAgIENvbG9yLllFTExPVywgQ29sb3IuTUFHRU5UQSwgU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisKKyAgICAgICAgICAgIG1QYWludCA9IG5ldyBQYWludCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIC8vY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIC8vIEJpdG1hcCBzaGFkZXJzCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSg0MC4wZiwgNDAuMGYpOworCisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1SZXBlYXRTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtVHJhbnNsYXRlZFNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1TY2FsZWRTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworCisgICAgICAgICAgICAvLyBHcmFkaWVudHMKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwLjBmICsgbURyYXdXaWR0aCArIDQwLjBmLCA0MC4wZik7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUhvckdyYWRpZW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobURpYWdHcmFkaWVudCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1WZXJ0R3JhZGllbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvU2ltcGxlUGF0aHNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvU2ltcGxlUGF0aHNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZTE4YTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9TaW1wbGVQYXRoc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBTaW1wbGVQYXRoc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBGcmFtZUxheW91dCBsYXlvdXQgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisgICAgICAgIEVkaXRUZXh0IHRleHQgPSBuZXcgRWRpdFRleHQodGhpcyk7CisgICAgICAgIGxheW91dC5hZGRWaWV3KHRleHQsIG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoNjAwLCAzNTAsIEdyYXZpdHkuQ0VOVEVSKSk7CisgICAgICAgIHRleHQuc2V0VGV4dCgiVGhpcyBpcyBhbiBleGFtcGxlIG9mIGFuIEVkaXRUZXh0IHdpZGdldCBcbiIgKworICAgICAgICAgICAgICAgICJ1c2luZyBzaW1wbGUgcGF0aHMgdG8gY3JlYXRlIHRoZSBzZWxlY3Rpb24uIik7CisgICAgICAgIC8vdGV4dC5zZXRTZWxlY3Rpb24oMCwgdGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1N0YWNrQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1N0YWNrQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjU1YWRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvU3RhY2tBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TdGFja1ZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBTdGFja0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5zdGFjayk7CisKKyAgICAgICAgU3RhY2tWaWV3IHN0YWNrID0gKFN0YWNrVmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3RhY2tfdmlldyk7CisgICAgICAgIHN0YWNrLnNldEFkYXB0ZXIobmV3IEFycmF5QWRhcHRlcjxEcmF3YWJsZT4odGhpcywgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmlkLnRleHQxLCBuZXcgRHJhd2FibGVbXSB7CisgICAgICAgICAgICBnZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLnN1bnNldDEpLAorICAgICAgICAgICAgZ2V0UmVzb3VyY2VzKCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5zdW5zZXQyKSwKKyAgICAgICAgfSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICAgICAgICAgIFZpZXcgaXRlbSA9IGNvbnZlcnRWaWV3OworICAgICAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaXRlbSA9IExheW91dEluZmxhdGVyLmZyb20oZ2V0Q29udGV4dCgpKS5pbmZsYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LnN0YWNrX2l0ZW0sIG51bGwsIGZhbHNlKTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAoKEltYWdlVmlldykgaXRlbS5maW5kVmlld0J5SWQoUi5pZC50ZXh0dmlld19pY29uKSkuc2V0SW1hZ2VEcmF3YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEl0ZW0ocG9zaXRpb24gJSBnZXRDb3VudCgpKSk7CisgICAgICAgICAgICAgICAgKChUZXh0VmlldykgaXRlbS5maW5kVmlld0J5SWQoUi5pZC5taW5pX3RleHQpKS5zZXRUZXh0KCIiICsgcG9zaXRpb24pOworICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgc3RhY2suc2V0RGlzcGxheWVkQ2hpbGQoMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVGV4dEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9UZXh0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjBkZjUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVGV4dEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBUZXh0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBDdXN0b21UZXh0Vmlldyh0aGlzKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEN1c3RvbVRleHRWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbU1lZGl1bVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1MYXJnZVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1TdHJpa2VQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtU2NhbGVkUGFpbnQ7CisKKyAgICAgICAgQ3VzdG9tVGV4dFZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbU1lZGl1bVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOworCisgICAgICAgICAgICBtTGFyZ2VQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0VGV4dFNpemUoMzYuMGYpOworCisgICAgICAgICAgICBtU3RyaWtlUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1TdHJpa2VQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtU3RyaWtlUGFpbnQuc2V0VGV4dFNpemUoMTYuMGYpOworICAgICAgICAgICAgbVN0cmlrZVBhaW50LnNldFVuZGVybGluZVRleHQodHJ1ZSk7CisKKyAgICAgICAgICAgIG1TY2FsZWRQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbVNjYWxlZFBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1TY2FsZWRQYWludC5zZXRUZXh0U2l6ZSgxNi4wZik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDEwMCwgMjAsIG1NZWRpdW1QYWludCk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0VGV4dEFsaWduKFBhaW50LkFsaWduLkNFTlRFUik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCAxMDAsIDQwLCBtTWVkaXVtUGFpbnQpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldFRleHRBbGlnbihQYWludC5BbGlnbi5SSUdIVCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCAxMDAsIDYwLCBtTWVkaXVtUGFpbnQpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldFRleHRBbGlnbihQYWludC5BbGlnbi5MRUZUKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDEwMCwgMTAwLCBtTWVkaXVtUGFpbnQpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldFNoYWRvd0xheWVyKDIuNWYsIDAuMGYsIDAuMGYsIDB4ZmYwMDAwMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCAxNTAsIG1NZWRpdW1QYWludCk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuY2xlYXJTaGFkb3dMYXllcigpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCAyMDAsIG1MYXJnZVBhaW50KTsKKworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZG93TGF5ZXIoMi41ZiwgMy4wZiwgMy4wZiwgMHhmZjAwMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCAxMDAsIDQwMCwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZG93TGF5ZXIoMy4wZiwgMy4wZiwgMy4wZiwgMHhmZjAwZmYwMCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRBbHBoYSgxMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCA1MDAsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldEFscGhhKDI1NSk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5jbGVhclNoYWRvd0xheWVyKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDUwMCwgNDAsIG1TdHJpa2VQYWludCk7CisgICAgICAgICAgICBtU3RyaWtlUGFpbnQuc2V0U3RyaWtlVGhydVRleHQodHJ1ZSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCA1MDAsIDcwLCBtU3RyaWtlUGFpbnQpOworICAgICAgICAgICAgbVN0cmlrZVBhaW50LnNldFVuZGVybGluZVRleHQoZmFsc2UpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgNTAwLCAxMDAsIG1TdHJpa2VQYWludCk7CisgICAgICAgICAgICBtU3RyaWtlUGFpbnQuc2V0U3RyaWtlVGhydVRleHQoZmFsc2UpOworICAgICAgICAgICAgbVN0cmlrZVBhaW50LnNldFVuZGVybGluZVRleHQodHJ1ZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1TY2FsZWRQYWludC5zZXRUZXh0U2NhbGVYKDAuNWYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgNTAwLCAyMDAsIG1TY2FsZWRQYWludCk7CisgICAgICAgICAgICBtU2NhbGVkUGFpbnQuc2V0VGV4dFNjYWxlWCgyLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDUwMCwgMjMwLCBtU2NhbGVkUGFpbnQpOworICAgICAgICAgICAgbVNjYWxlZFBhaW50LnNldFRleHRTY2FsZVgoMS4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCA1MDAsIDI2MCwgbVNjYWxlZFBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgxNTAuMGYsIDIyMC4wZiwgNDUwLjBmLCAzMjAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCAzMDAsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVGV4dEdhbW1hQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1RleHRHYW1tYUFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzczZDM5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1RleHRHYW1tYUFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ29sb3JEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFRleHRHYW1tYUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBmaW5hbCBMaW5lYXJMYXlvdXQgbGF5b3V0ID0gbmV3IExpbmVhckxheW91dCh0aGlzKTsKKyAgICAgICAgbGF5b3V0LnNldE9yaWVudGF0aW9uKExpbmVhckxheW91dC5WRVJUSUNBTCk7CisKKyAgICAgICAgZmluYWwgR2FtbWFUZXh0VmlldyBnYW1tYSA9IG5ldyBHYW1tYVRleHRWaWV3KHRoaXMpOworICAgICAgICBsYXlvdXQuYWRkVmlldyhnYW1tYSwgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UCisgICAgICAgICkpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgICAgIAorICAgICAgICBsYXlvdXQucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBCaXRtYXAgYiA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoZ2FtbWEuZ2V0V2lkdGgoKSwgZ2FtbWEuZ2V0SGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7CisgICAgICAgICAgICAgICAgQ2FudmFzIGMgPSBuZXcgQ2FudmFzKGIpOworICAgICAgICAgICAgICAgIGMuZHJhd0NvbG9yKDAsIFBvcnRlckR1ZmYuTW9kZS5DTEVBUik7CisgICAgICAgICAgICAgICAgZ2FtbWEuZHJhdyhjKTsKKworICAgICAgICAgICAgICAgIEltYWdlVmlldyBpbWFnZSA9IG5ldyBJbWFnZVZpZXcoVGV4dEdhbW1hQWN0aXZpdHkudGhpcyk7CisgICAgICAgICAgICAgICAgaW1hZ2Uuc2V0SW1hZ2VCaXRtYXAoYik7CisKKyAgICAgICAgICAgICAgICBsYXlvdXQuYWRkVmlldyhpbWFnZSwgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgICAgICAgICBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UCisgICAgICAgICAgICAgICAgKSk7CisKKyAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQoVGV4dEdhbW1hQWN0aXZpdHkudGhpcywgU3ViR2FtbWFBY3Rpdml0eS5jbGFzcykpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBnZXRXaW5kb3coKS5zZXRCYWNrZ3JvdW5kRHJhd2FibGUobmV3IENvbG9yRHJhd2FibGUoMHhmZmZmZmZmZikpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBHYW1tYVRleHRWaWV3IGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKKyAgICAgICAgR2FtbWFUZXh0VmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBzZXRCYWNrZ3JvdW5kQ29sb3IoMHhmZmZmZmZmZik7CisKKyAgICAgICAgICAgIGZpbmFsIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShjKTsKKyAgICAgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQudGV4dF9sYXJnZSwgdGhpcywgdHJ1ZSk7CisgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnRleHRfbWVkaXVtLCB0aGlzLCB0cnVlKTsKKyAgICAgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQudGV4dF9zbWFsbCwgdGhpcywgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YkdhbW1hQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgICAgICBmaW5hbCBMaW5lYXJMYXlvdXQgbGF5b3V0ID0gbmV3IExpbmVhckxheW91dCh0aGlzKTsKKyAgICAgICAgICAgIGxheW91dC5zZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOworICAgICAgICAKKyAgICAgICAgICAgIGZpbmFsIEdhbW1hVGV4dFZpZXcgZ2FtbWEgPSBuZXcgR2FtbWFUZXh0Vmlldyh0aGlzKTsKKyAgICAgICAgICAgIGZpbmFsIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UCisgICAgICAgICAgICApOworICAgICAgICAgICAgbHAuc2V0TWFyZ2lucygwLCA3NCwgMCwgMCk7CisgICAgICAgICAgICBsYXlvdXQuYWRkVmlldyhnYW1tYSwgbHApOworCisgICAgICAgICAgICBzZXRDb250ZW50VmlldyhsYXlvdXQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVGhpblBhdGNoZXNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVGhpblBhdGNoZXNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNjA1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9UaGluUGF0Y2hlc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFRoaW5QYXRjaGVzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAKKyAgICAgICAgRnJhbWVMYXlvdXQgbGF5b3V0ID0gbmV3IEZyYW1lTGF5b3V0KHRoaXMpOworICAgICAgICBQYXRjaFZpZXcgYiA9IG5ldyBQYXRjaFZpZXcodGhpcyk7CisgICAgICAgIGIuc2V0TGF5b3V0UGFyYW1zKG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKKyAgICAgICAgICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSk7CisgICAgICAgIGxheW91dC5hZGRWaWV3KGIpOworICAgICAgICBsYXlvdXQuc2V0QmFja2dyb3VuZENvbG9yKDB4ZmZmZmZmZmYpOworICAgICAgICAKKyAgICAgICAgc2V0Q29udGVudFZpZXcobGF5b3V0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFBhdGNoVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIERyYXdhYmxlIG1QYXRjaDEsIG1QYXRjaDI7CisKKyAgICAgICAgcHVibGljIFBhdGNoVmlldyhBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICAgICAgc3VwZXIoYWN0aXZpdHkpOworCisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzb3VyY2VzID0gYWN0aXZpdHkuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBtUGF0Y2gxID0gcmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUucGF0Y2gpOworICAgICAgICAgICAgbVBhdGNoMiA9IHJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmJ0bl90b2dnbGVfb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSAxMDA7CisgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gNjA7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBsZWZ0ID0gKGdldFdpZHRoKCkgLSB3aWR0aCkgLyAyOworICAgICAgICAgICAgZmluYWwgaW50IHRvcCAgPSAoZ2V0SGVpZ2h0KCkgLSBoZWlnaHQpIC8gMjsKKworICAgICAgICAgICAgbVBhdGNoMS5zZXRCb3VuZHMobGVmdCwgdG9wLCBsZWZ0ICsgd2lkdGgsIHRvcCArIGhlaWdodCk7CisgICAgICAgICAgICBtUGF0Y2gxLmRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCBoZWlnaHQgKyAyMC4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1QYXRjaDIuc2V0Qm91bmRzKGxlZnQsIHRvcCwgbGVmdCArIHdpZHRoLCB0b3AgKyBoZWlnaHQpOworICAgICAgICAgICAgbVBhdGNoMi5kcmF3KGNhbnZhcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9UcmFuc2Zvcm0zZEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9UcmFuc2Zvcm0zZEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRmNjZlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1RyYW5zZm9ybTNkQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW1lcmE7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBUcmFuc2Zvcm0zZEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZmluYWwgVHJhbnNmb3JtM2RWaWV3IHZpZXcgPSBuZXcgVHJhbnNmb3JtM2RWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50Vmlldyh2aWV3KTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgVHJhbnNmb3JtM2RWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAxOworICAgICAgICBwcml2YXRlIENhbWVyYSBtQ2FtZXJhOworICAgICAgICBwcml2YXRlIE1hdHJpeCBtTWF0cml4OworCisgICAgICAgIFRyYW5zZm9ybTNkVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtQml0bWFwMSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQxKTsKKyAgICAgICAgICAgIG1DYW1lcmEgPSBuZXcgQ2FtZXJhKCk7CisgICAgICAgICAgICBtTWF0cml4ID0gbmV3IE1hdHJpeCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgY2FudmFzLmRyYXdBUkdCKDI1NSwgMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IGNlbnRlclggPSBnZXRXaWR0aCgpIC8gMi4wZiAtIG1CaXRtYXAxLmdldFdpZHRoKCkgLyAyLjBmOworICAgICAgICAgICAgZmluYWwgZmxvYXQgY2VudGVyWSA9IGdldEhlaWdodCgpIC8gMi4wZiAtIG1CaXRtYXAxLmdldEhlaWdodCgpIC8gMi4wZjsKKyAgICAgICAgICAgIGZpbmFsIENhbWVyYSBjYW1lcmEgPSBtQ2FtZXJhOworICAgICAgICAgICAgCisgICAgICAgICAgICBmaW5hbCBNYXRyaXggbWF0cml4ID0gbU1hdHJpeDsKKworICAgICAgICAgICAgcm90YXRlKGNlbnRlclgsIGNlbnRlclksIGNhbWVyYSwgbWF0cml4LCAzMi4wZik7CisgICAgICAgICAgICBkcmF3Qml0bWFwKGNhbnZhcywgY2VudGVyWCwgY2VudGVyWSwgMC4wZiwgbWF0cml4KTsKKworICAgICAgICAgICAgcm90YXRlKGNlbnRlclgsIGNlbnRlclksIGNhbWVyYSwgbWF0cml4LCAxMi4wZik7CisgICAgICAgICAgICBkcmF3Qml0bWFwKGNhbnZhcywgY2VudGVyWCwgY2VudGVyWSwgLW1CaXRtYXAxLmdldFdpZHRoKCksIG1hdHJpeCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJvdGF0ZShjZW50ZXJYLCBjZW50ZXJZLCBjYW1lcmEsIG1hdHJpeCwgNTIuMGYpOworICAgICAgICAgICAgZHJhd0JpdG1hcChjYW52YXMsIGNlbnRlclgsIGNlbnRlclksIG1CaXRtYXAxLmdldFdpZHRoKCksIG1hdHJpeCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJvdGF0ZShjZW50ZXJYLCBjZW50ZXJZLCBjYW1lcmEsIG1hdHJpeCwgMTIyLjBmKTsKKyAgICAgICAgICAgIGRyYXdCaXRtYXAoY2FudmFzLCBjZW50ZXJYLCBjZW50ZXJZLCBtQml0bWFwMS5nZXRXaWR0aCgpICogMi4wZiwgbWF0cml4KTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRyYXdCaXRtYXAoQ2FudmFzIGNhbnZhcywgZmxvYXQgY2VudGVyWCwgZmxvYXQgY2VudGVyWSwgZmxvYXQgb2Zmc2V0LAorICAgICAgICAgICAgICAgIE1hdHJpeCBtYXRyaXgpIHsKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKG9mZnNldCwgMC4wZik7CisgICAgICAgICAgICBjYW52YXMuY29uY2F0KG1hdHJpeCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgY2VudGVyWCwgY2VudGVyWSwgbnVsbCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJvdGF0ZShmbG9hdCBjZW50ZXJYLCBmbG9hdCBjZW50ZXJZLCBDYW1lcmEgY2FtZXJhLAorICAgICAgICAgICAgICAgIE1hdHJpeCBtYXRyaXgsIGZsb2F0IGFuZ2xlKSB7CisgICAgICAgICAgICBjYW1lcmEuc2F2ZSgpOworICAgICAgICAgICAgY2FtZXJhLnJvdGF0ZVkoYW5nbGUpOworICAgICAgICAgICAgY2FtZXJhLmdldE1hdHJpeChtYXRyaXgpOworICAgICAgICAgICAgY2FtZXJhLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgbWF0cml4LnByZVRyYW5zbGF0ZSgtY2VudGVyWCwgLWNlbnRlclkpOworICAgICAgICAgICAgbWF0cml4LnBvc3RUcmFuc2xhdGUoY2VudGVyWCwgY2VudGVyWSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9UcmFuc3BhcmVudExpc3RBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVHJhbnNwYXJlbnRMaXN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjMxNjlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVHJhbnNwYXJlbnRMaXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFRyYW5zcGFyZW50TGlzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERBVEFfTElTVCA9IHsKKyAgICAgICAgICAgICJBZmdoYW5pc3RhbiIsICJBbGJhbmlhIiwgIkFsZ2VyaWEiLCAiQW1lcmljYW4gU2Ftb2EiLCAiQW5kb3JyYSIsCisgICAgICAgICAgICAiQW5nb2xhIiwgIkFuZ3VpbGxhIiwgIkFudGFyY3RpY2EiLCAiQW50aWd1YSBhbmQgQmFyYnVkYSIsICJBcmdlbnRpbmEiLAorICAgICAgICAgICAgIkFybWVuaWEiLCAiQXJ1YmEiLCAiQXVzdHJhbGlhIiwgIkF1c3RyaWEiLCAiQXplcmJhaWphbiIsCisgICAgICAgICAgICAiQmFocmFpbiIsICJCYW5nbGFkZXNoIiwgIkJhcmJhZG9zIiwgIkJlbGFydXMiLCAiQmVsZ2l1bSIsCisgICAgICAgICAgICAiQmVsaXplIiwgIkJlbmluIiwgIkJlcm11ZGEiLCAiQmh1dGFuIiwgIkJvbGl2aWEiLAorICAgICAgICAgICAgIkJvc25pYSBhbmQgSGVyemVnb3ZpbmEiLCAiQm90c3dhbmEiLCAiQm91dmV0IElzbGFuZCIsICJCcmF6aWwiLAorICAgICAgICAgICAgIkJyaXRpc2ggSW5kaWFuIE9jZWFuIFRlcnJpdG9yeSIsICJCcml0aXNoIFZpcmdpbiBJc2xhbmRzIiwgIkJydW5laSIsICJCdWxnYXJpYSIsCisgICAgICAgICAgICAiQnVya2luYSBGYXNvIiwgIkJ1cnVuZGkiLCAiQ290ZSBkJ0l2b2lyZSIsICJDYW1ib2RpYSIsICJDYW1lcm9vbiIsICJDYW5hZGEiLCAiQ2FwZSBWZXJkZSIsCisgICAgICAgICAgICAiQ2F5bWFuIElzbGFuZHMiLCAiQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljIiwgIkNoYWQiLCAiQ2hpbGUiLCAiQ2hpbmEiLAorICAgICAgICAgICAgIkNocmlzdG1hcyBJc2xhbmQiLCAiQ29jb3MgKEtlZWxpbmcpIElzbGFuZHMiLCAiQ29sb21iaWEiLCAiQ29tb3JvcyIsICJDb25nbyIsCisgICAgICAgICAgICAiQ29vayBJc2xhbmRzIiwgIkNvc3RhIFJpY2EiLCAiQ3JvYXRpYSIsICJDdWJhIiwgIkN5cHJ1cyIsICJDemVjaCBSZXB1YmxpYyIsCisgICAgICAgICAgICAiRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUgQ29uZ28iLCAiRGVubWFyayIsICJEamlib3V0aSIsICJEb21pbmljYSIsICJEb21pbmljYW4gUmVwdWJsaWMiLAorICAgICAgICAgICAgIkVhc3QgVGltb3IiLCAiRWN1YWRvciIsICJFZ3lwdCIsICJFbCBTYWx2YWRvciIsICJFcXVhdG9yaWFsIEd1aW5lYSIsICJFcml0cmVhIiwKKyAgICAgICAgICAgICJFc3RvbmlhIiwgIkV0aGlvcGlhIiwgIkZhZXJvZSBJc2xhbmRzIiwgIkZhbGtsYW5kIElzbGFuZHMiLCAiRmlqaSIsICJGaW5sYW5kIiwKKyAgICAgICAgICAgICJGb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YgTWFjZWRvbmlhIiwgIkZyYW5jZSIsICJGcmVuY2ggR3VpYW5hIiwgIkZyZW5jaCBQb2x5bmVzaWEiLAorICAgICAgICAgICAgIkZyZW5jaCBTb3V0aGVybiBUZXJyaXRvcmllcyIsICJHYWJvbiIsICJHZW9yZ2lhIiwgIkdlcm1hbnkiLCAiR2hhbmEiLCAiR2licmFsdGFyIiwKKyAgICAgICAgICAgICJHcmVlY2UiLCAiR3JlZW5sYW5kIiwgIkdyZW5hZGEiLCAiR3VhZGVsb3VwZSIsICJHdWFtIiwgIkd1YXRlbWFsYSIsICJHdWluZWEiLCAiR3VpbmVhLUJpc3NhdSIsCisgICAgICAgICAgICAiR3V5YW5hIiwgIkhhaXRpIiwgIkhlYXJkIElzbGFuZCBhbmQgTWNEb25hbGQgSXNsYW5kcyIsICJIb25kdXJhcyIsICJIb25nIEtvbmciLCAiSHVuZ2FyeSIsCisgICAgICAgICAgICAiSWNlbGFuZCIsICJJbmRpYSIsICJJbmRvbmVzaWEiLCAiSXJhbiIsICJJcmFxIiwgIklyZWxhbmQiLCAiSXNyYWVsIiwgIkl0YWx5IiwgIkphbWFpY2EiLAorICAgICAgICAgICAgIkphcGFuIiwgIkpvcmRhbiIsICJLYXpha2hzdGFuIiwgIktlbnlhIiwgIktpcmliYXRpIiwgIkt1d2FpdCIsICJLeXJneXpzdGFuIiwgIkxhb3MiLAorICAgICAgICAgICAgIkxhdHZpYSIsICJMZWJhbm9uIiwgIkxlc290aG8iLCAiTGliZXJpYSIsICJMaWJ5YSIsICJMaWVjaHRlbnN0ZWluIiwgIkxpdGh1YW5pYSIsICJMdXhlbWJvdXJnIiwKKyAgICAgICAgICAgICJNYWNhdSIsICJNYWRhZ2FzY2FyIiwgIk1hbGF3aSIsICJNYWxheXNpYSIsICJNYWxkaXZlcyIsICJNYWxpIiwgIk1hbHRhIiwgIk1hcnNoYWxsIElzbGFuZHMiLAorICAgICAgICAgICAgIk1hcnRpbmlxdWUiLCAiTWF1cml0YW5pYSIsICJNYXVyaXRpdXMiLCAiTWF5b3R0ZSIsICJNZXhpY28iLCAiTWljcm9uZXNpYSIsICJNb2xkb3ZhIiwKKyAgICAgICAgICAgICJNb25hY28iLCAiTW9uZ29saWEiLCAiTW9udHNlcnJhdCIsICJNb3JvY2NvIiwgIk1vemFtYmlxdWUiLCAiTXlhbm1hciIsICJOYW1pYmlhIiwKKyAgICAgICAgICAgICJOYXVydSIsICJOZXBhbCIsICJOZXRoZXJsYW5kcyIsICJOZXRoZXJsYW5kcyBBbnRpbGxlcyIsICJOZXcgQ2FsZWRvbmlhIiwgIk5ldyBaZWFsYW5kIiwKKyAgICAgICAgICAgICJOaWNhcmFndWEiLCAiTmlnZXIiLCAiTmlnZXJpYSIsICJOaXVlIiwgIk5vcmZvbGsgSXNsYW5kIiwgIk5vcnRoIEtvcmVhIiwgIk5vcnRoZXJuIE1hcmlhbmFzIiwKKyAgICAgICAgICAgICJOb3J3YXkiLCAiT21hbiIsICJQYWtpc3RhbiIsICJQYWxhdSIsICJQYW5hbWEiLCAiUGFwdWEgTmV3IEd1aW5lYSIsICJQYXJhZ3VheSIsICJQZXJ1IiwKKyAgICAgICAgICAgICJQaGlsaXBwaW5lcyIsICJQaXRjYWlybiBJc2xhbmRzIiwgIlBvbGFuZCIsICJQb3J0dWdhbCIsICJQdWVydG8gUmljbyIsICJRYXRhciIsCisgICAgICAgICAgICAiUmV1bmlvbiIsICJSb21hbmlhIiwgIlJ1c3NpYSIsICJSd2FuZGEiLCAiU3FvIFRvbWUgYW5kIFByaW5jaXBlIiwgIlNhaW50IEhlbGVuYSIsCisgICAgICAgICAgICAiU2FpbnQgS2l0dHMgYW5kIE5ldmlzIiwgIlNhaW50IEx1Y2lhIiwgIlNhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24iLAorICAgICAgICAgICAgIlNhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzIiwgIlNhbW9hIiwgIlNhbiBNYXJpbm8iLCAiU2F1ZGkgQXJhYmlhIiwgIlNlbmVnYWwiLAorICAgICAgICAgICAgIlNleWNoZWxsZXMiLCAiU2llcnJhIExlb25lIiwgIlNpbmdhcG9yZSIsICJTbG92YWtpYSIsICJTbG92ZW5pYSIsICJTb2xvbW9uIElzbGFuZHMiLAorICAgICAgICAgICAgIlNvbWFsaWEiLCAiU291dGggQWZyaWNhIiwgIlNvdXRoIEdlb3JnaWEgYW5kIHRoZSBTb3V0aCBTYW5kd2ljaCBJc2xhbmRzIiwgIlNvdXRoIEtvcmVhIiwKKyAgICAgICAgICAgICJTcGFpbiIsICJTcmkgTGFua2EiLCAiU3VkYW4iLCAiU3VyaW5hbWUiLCAiU3ZhbGJhcmQgYW5kIEphbiBNYXllbiIsICJTd2F6aWxhbmQiLCAiU3dlZGVuIiwKKyAgICAgICAgICAgICJTd2l0emVybGFuZCIsICJTeXJpYSIsICJUYWl3YW4iLCAiVGFqaWtpc3RhbiIsICJUYW56YW5pYSIsICJUaGFpbGFuZCIsICJUaGUgQmFoYW1hcyIsCisgICAgICAgICAgICAiVGhlIEdhbWJpYSIsICJUb2dvIiwgIlRva2VsYXUiLCAiVG9uZ2EiLCAiVHJpbmlkYWQgYW5kIFRvYmFnbyIsICJUdW5pc2lhIiwgIlR1cmtleSIsCisgICAgICAgICAgICAiVHVya21lbmlzdGFuIiwgIlR1cmtzIGFuZCBDYWljb3MgSXNsYW5kcyIsICJUdXZhbHUiLCAiVmlyZ2luIElzbGFuZHMiLCAiVWdhbmRhIiwKKyAgICAgICAgICAgICJVa3JhaW5lIiwgIlVuaXRlZCBBcmFiIEVtaXJhdGVzIiwgIlVuaXRlZCBLaW5nZG9tIiwKKyAgICAgICAgICAgICJVbml0ZWQgU3RhdGVzIiwgIlVuaXRlZCBTdGF0ZXMgTWlub3IgT3V0bHlpbmcgSXNsYW5kcyIsICJVcnVndWF5IiwgIlV6YmVraXN0YW4iLAorICAgICAgICAgICAgIlZhbnVhdHUiLCAiVmF0aWNhbiBDaXR5IiwgIlZlbmV6dWVsYSIsICJWaWV0bmFtIiwgIldhbGxpcyBhbmQgRnV0dW5hIiwgIldlc3Rlcm4gU2FoYXJhIiwKKyAgICAgICAgICAgICJZZW1lbiIsICJZdWdvc2xhdmlhIiwgIlphbWJpYSIsICJaaW1iYWJ3ZSIKKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAKKyAgICAgICAgZ2V0V2luZG93KCkuc2V0QmFja2dyb3VuZERyYXdhYmxlKGdldFJlc291cmNlcygpLmdldERyYXdhYmxlKFIuZHJhd2FibGUuZGVmYXVsdF93YWxscGFwZXIpKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubGlzdF9hY3Rpdml0eSk7CisKKyAgICAgICAgTGlzdEFkYXB0ZXIgYWRhcHRlciA9IG5ldyBTaW1wbGVMaXN0QWRhcHRlcih0aGlzKTsKKworICAgICAgICBMaXN0VmlldyBsaXN0ID0gKExpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5saXN0KTsKKyAgICAgICAgbGlzdC5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICBsaXN0LnNldENhY2hlQ29sb3JIaW50KDApOworICAgICAgICBsaXN0LnNldFZlcnRpY2FsRmFkaW5nRWRnZUVuYWJsZWQodHJ1ZSk7CisKKyAgICAgICAgcmVnaXN0ZXJGb3JDb250ZXh0TWVudShsaXN0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51IG1lbnUsIFZpZXcgdiwgQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvIG1lbnVJbmZvKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlQ29udGV4dE1lbnUobWVudSwgdiwgbWVudUluZm8pOworICAgICAgICBtZW51LnNldEhlYWRlclRpdGxlKCJDb250ZXh0IG1lbnUiKTsKKyAgICAgICAgbWVudS5hZGQoIkxpc3QgaXRlbSAxIik7CisgICAgICAgIG1lbnUuYWRkKCJMaXN0IGl0ZW0gMiIpOworICAgICAgICBtZW51LmFkZCgiTGlzdCBpdGVtIDMiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTaW1wbGVMaXN0QWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxTdHJpbmc+IHsKKyAgICAgICAgcHVibGljIFNpbXBsZUxpc3RBZGFwdGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsIERBVEFfTElTVCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIFRleHRWaWV3IHYgPSAoVGV4dFZpZXcpIHN1cGVyLmdldFZpZXcocG9zaXRpb24sIGNvbnZlcnRWaWV3LCBwYXJlbnQpOworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHIgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBmaW5hbCBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gci5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICAgICAgdi5zZXRDb21wb3VuZERyYXdhYmxlUGFkZGluZygoaW50KSAoNiAqIG1ldHJpY3MuZGVuc2l0eSArIDAuNWYpKTsKKyAgICAgICAgICAgIHYuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKHIuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY29uKSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9YZmVybW9kZUFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9YZmVybW9kZUFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExMDc3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1hmZXJtb2RlQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGU7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBYZmVybW9kZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgCisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBYZmVybW9kZXNWaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgWGZlcm1vZGVzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1CbHVlUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVJlZFBhaW50OworCisgICAgICAgIFhmZXJtb2Rlc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJsdWVQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUJsdWVQYWludC5zZXRDb2xvcigweGZmMDAwMGZmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVJlZFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtUmVkUGFpbnQuc2V0Q29sb3IoMHg3ZmZmMDAwMCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgLy9jYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMDAuMGYsIDEwMC4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFNSQyBtb2RlcworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5TUkNfT1ZFUik7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuU1JDX0lOKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsgICAgICAgICAgICAKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5TUkNfT1VUKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5TUkNfQVRPUCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuU1JDKTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMDAuMGYsIDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBEU1QgbW9kZXMKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuRFNUX09WRVIpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOworCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLkRTVF9JTik7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7ICAgICAgICAgICAgCisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuRFNUX09VVCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuRFNUX0FUT1ApOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLkRTVCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTAwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gT3RoZXIgbW9kZXMKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuQ0xFQVIpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOworCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLlhPUik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUJsdWVQYWludC5zZXRBbHBoYSgxMjcpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDUwLjBmLCA1MC4wZiwgbUJsdWVQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUJsdWVQYWludC5zZXRBbHBoYSgxMCk7CisgICAgICAgICAgICBtQmx1ZVBhaW50LnNldENvbG9yKDB4N2YwMDAwZmYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDUwLjBmLCA1MC4wZiwgbUJsdWVQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1CbHVlUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBtQmx1ZVBhaW50LnNldEFscGhhKDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZHJhd1JlY3RzKENhbnZhcyBjYW52YXMsIFBvcnRlckR1ZmYuTW9kZSBtb2RlKSB7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgNTAuMGYsIDUwLjBmLCBtQmx1ZVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMjUuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIG1SZWRQYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKG1vZGUpKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCA1MC4wZiwgNTAuMGYsIG1SZWRQYWludCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9nbWFpbC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvYXBwX2dtYWlsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2QzM2U1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9nbWFpbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9waG9uZS5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvYXBwX3Bob25lLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzJlN2QzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9waG9uZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9jaGF0LnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfY2hhdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiNGUyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfY2hhdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9lbWFpbC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNfc3RhdHVzYmFyX2VtYWlsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2VmZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9lbWFpbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9taXNzZWRjYWxsLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfbWlzc2VkY2FsbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlZWMyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfbWlzc2VkY2FsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24xLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4NTI1NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24yLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYzMDk4NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24zLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3MmI2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb240LnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uNC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRhNDBmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9hcHBfZ21haWwucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF9nbWFpbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvYXBwX2dtYWlsLnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF9nbWFpbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9hcHBfcGhvbmUucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF9waG9uZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvYXBwX3Bob25lLnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF9waG9uZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY19zdGF0dXNiYXJfY2hhdC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX2NoYXQucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljX3N0YXR1c2Jhcl9jaGF0LnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N0YXR1c2Jhcl9jaGF0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljX3N0YXR1c2Jhcl9lbWFpbC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX2VtYWlsLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY19zdGF0dXNiYXJfZW1haWwucG5nCnJlbmFtZSB0byB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX2VtYWlsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljX3N0YXR1c2Jhcl9taXNzZWRjYWxsLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY19zdGF0dXNiYXJfbWlzc2VkY2FsbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNfc3RhdHVzYmFyX21pc3NlZGNhbGwucG5nCnJlbmFtZSB0byB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX21pc3NlZGNhbGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNvbjEucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb24xLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY29uMS5wbmcKcmVuYW1lIHRvIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY29uMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY29uMi5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbjIucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljb24yLnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb24yLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljb24zLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY29uMy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNvbjMucG5nCnJlbmFtZSB0byB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbjMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNvbjQucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb240LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY29uNC5wbmcKcmVuYW1lIHRvIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY29uNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3NyYy9jb20vYW5kcm9pZC9zdGF0dXNiYXJ0ZXN0L05vdGlmaWNhdGlvblRlc3RMaXN0LmphdmEgYi90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvTm90aWZpY2F0aW9uVGVzdExpc3QuamF2YQppbmRleCBiNzkzZDYyLi5lMzBjZjRhIDEwMDY0NAotLS0gYS90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvTm90aWZpY2F0aW9uVGVzdExpc3QuamF2YQorKysgYi90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvTm90aWZpY2F0aW9uVGVzdExpc3QuamF2YQpAQCAtMTYsMTIgKzE2LDE0IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc3RhdHVzYmFydGVzdDsKIAoraW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKIGltcG9ydCBhbmRyb2lkLm9zLlZpYnJhdG9yOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKQEAgLTc3LDYgKzc5LDExMiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9LAogCisgICAgICAgIG5ldyBUZXN0KCJDYW5jZWwgIzEiKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1OTS5jYW5jZWwoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgbmV3IFRlc3QoIlRpY2tlciAxIGxpbmUiKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG4gPSBuZXcgTm90aWZpY2F0aW9uKFIuZHJhd2FibGUuaWNvbjEsICJ0aWNrIHRpY2sgdGljayIsCisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlDcmVhdGVUaW1lKTsKKyAgICAgICAgICAgICAgICBuLnNldExhdGVzdEV2ZW50SW5mbyhOb3RpZmljYXRpb25UZXN0TGlzdC50aGlzLCAiUGVyc2lzdGVudCAjMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgYSBub3RpZmljYXRpb24hISEiLCBtYWtlSW50ZW50KCkpOworICAgICAgICAgICAgICAgIG1OTS5ub3RpZnkoMSwgbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgbmV3IFRlc3QoIlRpY2tlciAxIGxpbmUgJiBpY29uIikgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbmV3IE5vdGlmaWNhdGlvbihSLmRyYXdhYmxlLmljb24xLCAidGljayB0aWNrIHRpY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Q3JlYXRlVGltZSk7CisgICAgICAgICAgICAgICAgbi5zZXRMYXRlc3RFdmVudEluZm8oTm90aWZpY2F0aW9uVGVzdExpc3QudGhpcywgIlBlcnNpc3RlbnQgIzEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGEgbm90aWZpY2F0aW9uISEhIiwgbWFrZUludGVudCgpKTsKKyAgICAgICAgICAgICAgICBuLnRpY2tlckljb25zID0gbmV3IEJpdG1hcFsxXTsKKyAgICAgICAgICAgICAgICBuLnRpY2tlckljb25zWzBdID0gbG9hZEJpdG1hcChSLmRyYXdhYmxlLmljb24zKTsKKyAgICAgICAgICAgICAgICBtTk0ubm90aWZ5KDEsIG4pOworICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIG5ldyBUZXN0KCJUaWNrZXIgMiBsaW5lcyIpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gbiA9IG5ldyBOb3RpZmljYXRpb24oUi5kcmF3YWJsZS5pY29uMSwgInRpY2sgdGljayB0aWNrXG50b2NrIHRvY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Q3JlYXRlVGltZSk7CisgICAgICAgICAgICAgICAgbi5zZXRMYXRlc3RFdmVudEluZm8oTm90aWZpY2F0aW9uVGVzdExpc3QudGhpcywgIlBlcnNpc3RlbnQgIzEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGEgbm90aWZpY2F0aW9uISEhIiwgbWFrZUludGVudCgpKTsKKyAgICAgICAgICAgICAgICBtTk0ubm90aWZ5KDEsIG4pOworICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIG5ldyBUZXN0KCJUaWNrZXIgdGl0bGUiKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG4gPSBuZXcgTm90aWZpY2F0aW9uKFIuZHJhd2FibGUuaWNvbjEsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlDcmVhdGVUaW1lKTsKKyAgICAgICAgICAgICAgICBuLnNldExhdGVzdEV2ZW50SW5mbyhOb3RpZmljYXRpb25UZXN0TGlzdC50aGlzLCAiUGVyc2lzdGVudCAjMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgYSBub3RpZmljYXRpb24hISEiLCBtYWtlSW50ZW50KCkpOworICAgICAgICAgICAgICAgIG4udGlja2VyVGl0bGUgPSAiVGhpcyBpcyBhIHRpdGxlIjsKKyAgICAgICAgICAgICAgICBtTk0ubm90aWZ5KDEsIG4pOworICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIG5ldyBUZXN0KCJUaWNrZXIgc3VidGl0bGUiKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG4gPSBuZXcgTm90aWZpY2F0aW9uKFIuZHJhd2FibGUuaWNvbjEsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlDcmVhdGVUaW1lKTsKKyAgICAgICAgICAgICAgICBuLnNldExhdGVzdEV2ZW50SW5mbyhOb3RpZmljYXRpb25UZXN0TGlzdC50aGlzLCAiUGVyc2lzdGVudCAjMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgYSBub3RpZmljYXRpb24hISEiLCBtYWtlSW50ZW50KCkpOworICAgICAgICAgICAgICAgIG4udGlja2VyU3VidGl0bGUgPSAiYW5kIGEgc3VidGl0bGUiOworICAgICAgICAgICAgICAgIG1OTS5ub3RpZnkoMSwgbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgbmV3IFRlc3QoIlRpY2tlciB0aXRsZSAmIHN1YnRpdGxlIikgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbmV3IE5vdGlmaWNhdGlvbihSLmRyYXdhYmxlLmljb24xLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Q3JlYXRlVGltZSk7CisgICAgICAgICAgICAgICAgbi5zZXRMYXRlc3RFdmVudEluZm8oTm90aWZpY2F0aW9uVGVzdExpc3QudGhpcywgIlBlcnNpc3RlbnQgIzEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGEgbm90aWZpY2F0aW9uISEhIiwgbWFrZUludGVudCgpKTsKKyAgICAgICAgICAgICAgICBuLnRpY2tlclRpdGxlID0gIlRoaXMgaXMgYSB0aXRsZSBpdCBpcyByZWFsbHkgcmVhbGx5IGxvbmdnZ2dnZyBsb25nIGxvbmcgbG9uZyBsb25nIjsKKyAgICAgICAgICAgICAgICBuLnRpY2tlclN1YnRpdGxlID0gImFuZCBhIHN1YnRpdGxlIGl0IGlzIHJlYWxseSByZWFsbHkgbG9uZ2dnZ2dnIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmciOworICAgICAgICAgICAgICAgIG1OTS5ub3RpZnkoMSwgbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgbmV3IFRlc3QoIlRpY2tlciB0ZXh0LCB0aXRsZSAmIHN1YnRpdGxlIikgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbmV3IE5vdGlmaWNhdGlvbihSLmRyYXdhYmxlLmljb24xLCAibm90IHZpc2libGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2aXR5Q3JlYXRlVGltZSk7CisgICAgICAgICAgICAgICAgbi5zZXRMYXRlc3RFdmVudEluZm8oTm90aWZpY2F0aW9uVGVzdExpc3QudGhpcywgIlBlcnNpc3RlbnQgIzEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGEgbm90aWZpY2F0aW9uISEhIiwgbWFrZUludGVudCgpKTsKKyAgICAgICAgICAgICAgICBuLnRpY2tlclRpdGxlID0gIlRoaXMgaXMgYSB0aXRsZSI7CisgICAgICAgICAgICAgICAgbi50aWNrZXJTdWJ0aXRsZSA9ICJhbmQgYSBzdWJ0aXRsZSI7CisgICAgICAgICAgICAgICAgbU5NLm5vdGlmeSgxLCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICBuZXcgVGVzdCgiVGlja2VyIHRpdGxlLCBzdWJ0aXRsZSAmIDIgaWNvbnMiKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG4gPSBuZXcgTm90aWZpY2F0aW9uKFIuZHJhd2FibGUuaWNvbjEsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlDcmVhdGVUaW1lKTsKKyAgICAgICAgICAgICAgICBuLnNldExhdGVzdEV2ZW50SW5mbyhOb3RpZmljYXRpb25UZXN0TGlzdC50aGlzLCAiUGVyc2lzdGVudCAjMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgYSBub3RpZmljYXRpb24hISEiLCBtYWtlSW50ZW50KCkpOworICAgICAgICAgICAgICAgIG4udGlja2VyVGl0bGUgPSAiVGhpcyBpcyBhIHRpdGxlIjsKKyAgICAgICAgICAgICAgICBuLnRpY2tlclN1YnRpdGxlID0gImFuZCBhIHN1YnRpdGxlIjsKKworICAgICAgICAgICAgICAgIG4udGlja2VySWNvbnMgPSBuZXcgQml0bWFwWzJdOworICAgICAgICAgICAgICAgIG4udGlja2VySWNvbnNbMF0gPSBsb2FkQml0bWFwKFIuZHJhd2FibGUuaWNvbjMpOworICAgICAgICAgICAgICAgIG4udGlja2VySWNvbnNbMV0gPSBsb2FkQml0bWFwKFIuZHJhd2FibGUuYXBwX2dtYWlsKTsKKworICAgICAgICAgICAgICAgIG1OTS5ub3RpZnkoMSwgbik7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICBuLnRpY2tlckljb25zWzBdLnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICBuLnRpY2tlckljb25zWzFdLnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfQorICAgICAgICB9LAorCiAgICAgICAgIG5ldyBUZXN0KCJObyB2aWV3IikgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbmV3IE5vdGlmaWNhdGlvbihSLmRyYXdhYmxlLmljb24xLCAiTm8gdmlldyIsCkBAIC05OCwxMiArMjA2LDE2IEBACiAgICAgICAgIG5ldyBUZXN0KCJMYXlvdXQiKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQogICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBuOwogCi0gICAgICAgICAgICAgICAgbU5NLm5vdGlmeSgxLCBuZXcgTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvblRlc3RMaXN0LnRoaXMsCisgICAgICAgICAgICAgICAgbiA9IG5ldyBOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uVGVzdExpc3QudGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLmljX3N0YXR1c2Jhcl9taXNzZWRjYWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLSgxMDAwKjYwKjYwKjI0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDQ1MykgMTIzLTIzMjgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBudWxsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIG51bGwpOworICAgICAgICAgICAgICAgIG4uZmxhZ3MgfD0gTm90aWZpY2F0aW9uLkZMQUdfT05HT0lOR19FVkVOVDsKKworICAgICAgICAgICAgICAgIG1OTS5ub3RpZnkoMSwgbik7CiAKICAgICAgICAgICAgICAgICBtTk0ubm90aWZ5KDIsIG5ldyBOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uVGVzdExpc3QudGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLmljX3N0YXR1c2Jhcl9lbWFpbCwKQEAgLTQ3OSw3ICs1OTEsNyBAQAogCiAgICAgICAgIG5ldyBUZXN0KCJQZXJzaXN0ZW50ICMzIikgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbmV3IE5vdGlmaWNhdGlvbihSLmRyYXdhYmxlLmljb24yLCAidG9jayB0b2NrIHRvY2siLAorICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBuID0gbmV3IE5vdGlmaWNhdGlvbihSLmRyYXdhYmxlLmljb24yLCAidG9jayB0b2NrIHRvY2tcbm1vb29vbyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CiAgICAgICAgICAgICAgICAgbi5zZXRMYXRlc3RFdmVudEluZm8oTm90aWZpY2F0aW9uVGVzdExpc3QudGhpcywgIlBlcnNpc3RlbnQgIzMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3RpZnkgbWUhISEiLCBtYWtlSW50ZW50KCkpOwpAQCAtNjMzLDIwICs3NDUsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9LAogCi0gICAgICAgIG5ldyBUZXN0KCJUaWNrZXIiKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdCA9IG5ldyBOb3RpZmljYXRpb24oCi0gICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuYXBwX2dtYWlsLCAKLSAgICAgICAgICAgICAgICAgICAgIk5ldyBtYWlsIGZyb20gam9lb0BleGFtcGxlLmNvbSwgb24gdGhlIHRvcGljIG9mIHZlcnkgbG9uZyB0aWNrZXIgdGV4dHMiLAotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0gICAgICAgICAgICAgICAgbm90LnNldExhdGVzdEV2ZW50SW5mbyhOb3RpZmljYXRpb25UZXN0TGlzdC50aGlzLAotICAgICAgICAgICAgICAgICAgICAiQSBuZXcgbWVzc2FnZSBhd2FpdHMiLAotICAgICAgICAgICAgICAgICAgICAiVGhlIGNvbnRlbnRzIGFyZSB2ZXJ5IGludGVyZXN0aW5nIGFuZCBpbXBvcnRhbnQiLAotICAgICAgICAgICAgICAgICAgICBtYWtlSW50ZW50KCkpOwotICAgICAgICAgICAgICAgIG1OTS5ub3RpZnkoMSwgbm90KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwKLQogICAgICAgICBuZXcgVGVzdCgiQ3Jhc2giKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQogICAgICAgICAgICAgewpAQCAtNzE1LDUgKzgxMywxMCBAQAogICAgICAgICAgICAgICAgICAgICB0aW1lLCBsYWJlbCwgIiIgKyBuZXcgamF2YS51dGlsLkRhdGUodGltZSksIG51bGwpKTsKIAogICAgIH0KKworICAgIEJpdG1hcCBsb2FkQml0bWFwKGludCByZXNJZCkgeworICAgICAgICBCaXRtYXBEcmF3YWJsZSBiZCA9IChCaXRtYXBEcmF3YWJsZSlnZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShyZXNJZCk7CisgICAgICAgIHJldHVybiBCaXRtYXAuY3JlYXRlQml0bWFwKGJkLmdldEJpdG1hcCgpKTsKKyAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9zcmMvY29tL2FuZHJvaWQvc3RhdHVzYmFydGVzdC9TdGF0dXNCYXJUZXN0LmphdmEgYi90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvU3RhdHVzQmFyVGVzdC5qYXZhCmluZGV4IDQzOGEwNjAuLjdlNjllZTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL1N0YXR1c0Jhci9zcmMvY29tL2FuZHJvaWQvc3RhdHVzYmFydGVzdC9TdGF0dXNCYXJUZXN0LmphdmEKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3NyYy9jb20vYW5kcm9pZC9zdGF0dXNiYXJ0ZXN0L1N0YXR1c0JhclRlc3QuamF2YQpAQCAtODEsMjMgKzgxLDMyIEBACiAgICAgICAgICAgICAgICAgbVN0YXR1c0Jhck1hbmFnZXIuc2V0SWNvbigic3BlYWtlcnBob25lIiwgUi5kcmF3YWJsZS5zdGF0X3N5c19waG9uZSwgMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0sCi0gICAgICAgIG5ldyBUZXN0KCJIaWRlIikgeworICAgICAgICBuZXcgVGVzdCgiSGlkZSAoRkxBR19GVUxMU0NSRUVOKSIpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICBXaW5kb3cgd2luID0gZ2V0V2luZG93KCk7Ci0gICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgd2luUGFyYW1zID0gd2luLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICB3aW5QYXJhbXMuZmxhZ3MgfD0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19GVUxMU0NSRUVOOwotICAgICAgICAgICAgICAgIHdpbi5zZXRBdHRyaWJ1dGVzKHdpblBhcmFtcyk7CisgICAgICAgICAgICAgICAgd2luLnNldEZsYWdzKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfRlVMTFNDUkVFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfRlVMTFNDUkVFTik7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmxhZ3M9IiArIEludGVnZXIudG9IZXhTdHJpbmcod2luLmdldEF0dHJpYnV0ZXMoKS5mbGFncykpOwogICAgICAgICAgICAgfQogICAgICAgICB9LAotICAgICAgICBuZXcgVGVzdCgiU2hvdyIpIHsKKyAgICAgICAgbmV3IFRlc3QoIlNob3cgKH5GTEFHX0ZVTExTQ1JFRU4pIikgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIFdpbmRvdyB3aW4gPSBnZXRXaW5kb3coKTsKLSAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyB3aW5QYXJhbXMgPSB3aW4uZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgIHdpblBhcmFtcy5mbGFncyAmPSB+V2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19GVUxMU0NSRUVOOwotICAgICAgICAgICAgICAgIHdpbi5zZXRBdHRyaWJ1dGVzKHdpblBhcmFtcyk7CisgICAgICAgICAgICAgICAgd2luLnNldEZsYWdzKDAsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfRlVMTFNDUkVFTik7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmxhZ3M9IiArIEludGVnZXIudG9IZXhTdHJpbmcod2luLmdldEF0dHJpYnV0ZXMoKS5mbGFncykpOwogICAgICAgICAgICAgfQogICAgICAgICB9LAotICAgICAgICBuZXcgVGVzdCgiZnVsbFNjcmVlbkludGVudCIpIHsKKyAgICAgICAgbmV3IFRlc3QoIkltbWVyc2l2ZTogRW50ZXIiKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgc2V0SW1tZXJzaXZlKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBuZXcgVGVzdCgiSW1tZXJzaXZlOiBFeGl0IikgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHNldEltbWVyc2l2ZShmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIG5ldyBUZXN0KCJQcmlvcml0eSBub3RpZmljYXRpb24iKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdCA9IG5ldyBOb3RpZmljYXRpb24oU3RhdHVzQmFyVGVzdC50aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLnN0YXRfc3lzX3Bob25lLApAQCAtMTA3LDggKzExNiw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoODg4KSA1NTUtNTAzOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBub3QuZmxhZ3MgfD0gTm90aWZpY2F0aW9uLkZMQUdfSElHSF9QUklPUklUWTsKICAgICAgICAgICAgICAgICBJbnRlbnQgZnVsbFNjcmVlbkludGVudCA9IG5ldyBJbnRlbnQoU3RhdHVzQmFyVGVzdC50aGlzLCBUZXN0QWxlcnRBY3Rpdml0eS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaW50IGlkID0gKGludClTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBpbnQgaWQgPSAoaW50KVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOyAvLyBYWFggSEFYCiAgICAgICAgICAgICAgICAgZnVsbFNjcmVlbkludGVudC5wdXRFeHRyYSgiaWQiLCBpZCk7CiAgICAgICAgICAgICAgICAgbm90LmZ1bGxTY3JlZW5JbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KAogICAgICAgICAgICAgICAgICAgICBTdGF0dXNCYXJUZXN0LnRoaXMsCkBAIC0xNTgsNiArMTY4LDI0IEBACiAgICAgICAgICAgICAgICAgICAgIH0sIDMwMDApOwogICAgICAgICAgICAgfQogICAgICAgICB9LAorICAgICAgICBuZXcgVGVzdCgiRGlzYWJsZSBOYXZpZ2F0aW9uIikgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJNYW5hZ2VyLmRpc2FibGUoU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05BVklHQVRJT04pOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBuZXcgVGVzdCgiRGlzYWJsZSBldmVyeXRoaW5nIGluIDMgc2VjIikgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzQmFyTWFuYWdlci5kaXNhYmxlKFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0FMRVJUUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfU1lTVEVNX0lORk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05BVklHQVRJT04pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9LCAzMDAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKICAgICAgICAgbmV3IFRlc3QoIkVuYWJsZSBldmVyeXRoaW5nIikgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJNYW5hZ2VyLmRpc2FibGUoMCk7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L0NvbW1hbmQuY3BwIGIvdG9vbHMvYWFwdC9Db21tYW5kLmNwcAppbmRleCBmNzFlYmI5Li5lYWZmMGY0IDEwMDY0NAotLS0gYS90b29scy9hYXB0L0NvbW1hbmQuY3BwCisrKyBiL3Rvb2xzL2FhcHQvQ29tbWFuZC5jcHAKQEAgLTE5OCw4ICsxOTgsMTAgQEAKICAgICAgICAgaWYgKCZyZXMgPT0gTlVMTCkgewogICAgICAgICAgICAgcHJpbnRmKCJcbk5vIHJlc291cmNlIHRhYmxlIGZvdW5kLlxuIik7CiAgICAgICAgIH0gZWxzZSB7CisjaWZuZGVmIEhBVkVfQU5EUk9JRF9PUwogICAgICAgICAgICAgcHJpbnRmKCJcblJlc291cmNlIHRhYmxlOlxuIik7CiAgICAgICAgICAgICByZXMucHJpbnQoZmFsc2UpOworI2VuZGlmCiAgICAgICAgIH0KIAogICAgICAgICBBc3NldCogbWFuaWZlc3RBc3NldCA9IGFzc2V0cy5vcGVuTm9uQXNzZXQoIkFuZHJvaWRNYW5pZmVzdC54bWwiLApAQCAtMzkwLDggKzM5Miw5IEBACiAgICAgfQogCiAgICAgaWYgKHN0cmNtcCgicmVzb3VyY2VzIiwgb3B0aW9uKSA9PSAwKSB7CisjaWZuZGVmIEhBVkVfQU5EUk9JRF9PUwogICAgICAgICByZXMucHJpbnQoYnVuZGxlLT5nZXRWYWx1ZXMoKSk7Ci0KKyNlbmRpZgogICAgIH0gZWxzZSBpZiAoc3RyY21wKCJ4bWx0cmVlIiwgb3B0aW9uKSA9PSAwKSB7CiAgICAgICAgIGlmIChidW5kbGUtPmdldEZpbGVTcGVjQ291bnQoKSA8IDMpIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IG5vIGR1bXAgeG1sdHJlZSByZXNvdXJjZSBmaWxlIHNwZWNpZmllZFxuIik7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L1BhY2thZ2UuY3BwIGIvdG9vbHMvYWFwdC9QYWNrYWdlLmNwcAppbmRleCA5OTlhNWNmLi4zY2I2MTRmIDEwMDY0NAotLS0gYS90b29scy9hYXB0L1BhY2thZ2UuY3BwCisrKyBiL3Rvb2xzL2FhcHQvUGFja2FnZS5jcHAKQEAgLTQ0MSw3ICs0NDEsNyBAQAogCiBzc2l6ZV90IHByb2Nlc3NKYXJGaWxlcyhCdW5kbGUqIGJ1bmRsZSwgWmlwRmlsZSogemlwKQogewotICAgIHNzaXplX3QgZXJyOworICAgIHN0YXR1c190IGVycjsKICAgICBzc2l6ZV90IGNvdW50ID0gMDsKICAgICBjb25zdCBhbmRyb2lkOjpWZWN0b3I8Y29uc3QgY2hhcio+JiBqYXJzID0gYnVuZGxlLT5nZXRKYXJGaWxlcygpOwogCmRpZmYgLS1naXQgYS90b29scy9hYXB0L1Jlc291cmNlLmNwcCBiL3Rvb2xzL2FhcHQvUmVzb3VyY2UuY3BwCmluZGV4IGM4YmE5MDQuLjgyMjI2MmUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvUmVzb3VyY2UuY3BwCisrKyBiL3Rvb2xzL2FhcHQvUmVzb3VyY2UuY3BwCkBAIC01NDIsMTEgKzU0MiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPEFhcHRHcm91cEVudHJ5LCBzcDxBYXB0RmlsZT4gPiBiYXNlRmlsZXMgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXAtPmdldEZpbGVzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBiYXNlRmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImJhc2VGaWxlICVsZCBoYXMgZmxhdm9yICVzXG4iLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiYmFzZUZpbGUgJWQgaGFzIGZsYXZvciAlc1xuIiwgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VGaWxlcy5rZXlBdChpKS50b1N0cmluZygpLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IG92ZXJsYXlGaWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Zigib3ZlcmxheUZpbGUgJWxkIGhhcyBmbGF2b3IgJXNcbiIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJvdmVybGF5RmlsZSAlZCBoYXMgZmxhdm9yICVzXG4iLCBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheUZpbGVzLmtleUF0KGkpLnRvU3RyaW5nKCkuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC01NjAsNyArNTYwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5QXQob3ZlcmxheUdyb3VwSW5kZXgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJhc2VGaWxlSW5kZXggPCBVTktOT1dOX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZS0+Z2V0VmVyYm9zZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZm91bmQgYSBtYXRjaCAoJWxkKSBmb3Igb3ZlcmxheSBmaWxlICVzLCBmb3IgZmxhdm9yICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImZvdW5kIGEgbWF0Y2ggKCVkKSBmb3Igb3ZlcmxheSBmaWxlICVzLCBmb3IgZmxhdm9yICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VGaWxlSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheUdyb3VwLT5nZXRMZWFmKCkuc3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheUZpbGVzLmtleUF0KG92ZXJsYXlHcm91cEluZGV4KS50b1N0cmluZygpLnN0cmluZygpKTsKQEAgLTIwODMsMTIgKzIwODMsMTMgQEAKICAgICAvLyB0YWc6YXR0cmlidXRlIHBhaXJzIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgaW4gbGF5b3V0IGZpbGVzLgogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIE5hbWVzcGFjZUF0dHJpYnV0ZVBhaXI+IGtMYXlvdXRUYWdBdHRyUGFpcnM7CiAgICAgYWRkVGFnQXR0clBhaXIoJmtMYXlvdXRUYWdBdHRyUGFpcnMsICJ2aWV3IiwgTlVMTCwgImNsYXNzIik7CisgICAgYWRkVGFnQXR0clBhaXIoJmtMYXlvdXRUYWdBdHRyUGFpcnMsICJmcmFnbWVudCIsIE5VTEwsICJjbGFzcyIpOwogICAgIGFkZFRhZ0F0dHJQYWlyKCZrTGF5b3V0VGFnQXR0clBhaXJzLCAiZnJhZ21lbnQiLCBSRVNPVVJDRVNfQU5EUk9JRF9OQU1FU1BBQ0UsICJuYW1lIik7CiAKICAgICAvLyB0YWc6YXR0cmlidXRlIHBhaXJzIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgaW4geG1sIGZpbGVzLgogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIE5hbWVzcGFjZUF0dHJpYnV0ZVBhaXI+IGtYbWxUYWdBdHRyUGFpcnM7CiAgICAgYWRkVGFnQXR0clBhaXIoJmtYbWxUYWdBdHRyUGFpcnMsICJQcmVmZXJlbmNlU2NyZWVuIiwgUkVTT1VSQ0VTX0FORFJPSURfTkFNRVNQQUNFLCAiZnJhZ21lbnQiKTsKLSAgICBhZGRUYWdBdHRyUGFpcigma1htbFRhZ0F0dHJQYWlycywgIkhlYWRlciIsIFJFU09VUkNFU19BTkRST0lEX05BTUVTUEFDRSwgImZyYWdtZW50Iik7CisgICAgYWRkVGFnQXR0clBhaXIoJmtYbWxUYWdBdHRyUGFpcnMsICJoZWFkZXIiLCBSRVNPVVJDRVNfQU5EUk9JRF9OQU1FU1BBQ0UsICJmcmFnbWVudCIpOwogCiAgICAgY29uc3QgVmVjdG9yPHNwPEFhcHREaXI+ID4mIGRpcnMgPSBhc3NldHMtPnJlc0RpcnMoKTsKICAgICBjb25zdCBzaXplX3QgSyA9IGRpcnMuc2l6ZSgpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmNwcCBiL3Rvb2xzL2FhcHQvUmVzb3VyY2VUYWJsZS5jcHAKaW5kZXggMjk2NDRhNi4uMWQ2YjE4ZCAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmNwcAorKysgYi90b29scy9hYXB0L1Jlc291cmNlVGFibGUuY3BwCkBAIC0yNDQyLDcgKzI0NDIsNyBAQAogICAgICAgICBpZiAoY29uZmlnU2V0LmNvdW50KGRlZmF1bHRMb2NhbGUpID09IDApIHsKICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiYWFwdDogd2FybmluZzogc3RyaW5nICclcycgaGFzIG5vIGRlZmF1bHQgdHJhbnNsYXRpb24gaW4gJXM7IGZvdW5kOiIsCiAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgobmFtZUl0ZXItPmZpcnN0KS5zdHJpbmcoKSwgbUJ1bmRsZS0+Z2V0UmVzb3VyY2VTb3VyY2VEaXJzKClbMF0pOwotICAgICAgICAgICAgZm9yIChzZXQ8U3RyaW5nOD46Oml0ZXJhdG9yIGxvY2FsZXMgPSBjb25maWdTZXQuYmVnaW4oKTsKKyAgICAgICAgICAgIGZvciAoc2V0PFN0cmluZzg+Ojpjb25zdF9pdGVyYXRvciBsb2NhbGVzID0gY29uZmlnU2V0LmJlZ2luKCk7CiAgICAgICAgICAgICAgICAgIGxvY2FsZXMgIT0gY29uZmlnU2V0LmVuZCgpOwogICAgICAgICAgICAgICAgICBsb2NhbGVzKyspIHsKICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIiAlcyIsICgqbG9jYWxlcykuc3RyaW5nKCkpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9TdHJpbmdQb29sLmNwcCBiL3Rvb2xzL2FhcHQvU3RyaW5nUG9vbC5jcHAKaW5kZXggYTA5Y2VjMC4uZTI4YmRmZiAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9TdHJpbmdQb29sLmNwcAorKysgYi90b29scy9hYXB0L1N0cmluZ1Bvb2wuY3BwCkBAIC0zMCw3ICszMCw3IEBACiAgICAgICAgICAgICBzdHIgPSBTdHJpbmc4KHBvb2wtPnN0cmluZ0F0KHMsICZsZW4pKS5zdHJpbmcoKTsKICAgICAgICAgfQogCi0gICAgICAgIHByaW50ZigiU3RyaW5nICMlbGQ6ICVzXG4iLCBzLCBzdHIpOworICAgICAgICBwcmludGYoIlN0cmluZyAjJWQ6ICVzXG4iLCBzLCBzdHIpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9YTUxOb2RlLmNwcCBiL3Rvb2xzL2FhcHQvWE1MTm9kZS5jcHAKaW5kZXggODU1MWIwZi4uY2VlODU0NiAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9YTUxOb2RlLmNwcAorKysgYi90b29scy9hYXB0L1hNTE5vZGUuY3BwCkBAIC0yMDMsOSArMjAzLDEzIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHhsaWZmRGVwdGggPT0gMCAmJiBwc2V1ZG9sb2NhbGl6ZSkgeworI2lmZGVmIEVOQUJMRV9QU0VVRE9MT0NBTElaRQogICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9yaWcoU3RyaW5nOCh0ZXh0KS5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHNldWRvID0gcHNldWRvbG9jYWxpemVfc3RyaW5nKG9yaWcpOwogICAgICAgICAgICAgICAgIGN1clN0cmluZy5hcHBlbmQoU3RyaW5nMTYoU3RyaW5nOChwc2V1ZG8uY19zdHIoKSkpKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyNlbmRpZgogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoaXNGb3JtYXR0ZWQgJiYgaGFzU3Vic3RpdHV0aW9uRXJyb3JzKGZpbGVOYW1lLCBpblhtbCwgdGV4dCkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L1ppcEZpbGUuaCBiL3Rvb2xzL2FhcHQvWmlwRmlsZS5oCmluZGV4IGRiYmQwNzIuLjc4Nzc1NTAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvWmlwRmlsZS5oCisrKyBiL3Rvb2xzL2FhcHQvWmlwRmlsZS5oCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgLyoKICAgICAgKiBPcGVuIGEgbmV3IG9yIGV4aXN0aW5nIGFyY2hpdmUuCiAgICAgICovCi0gICAgdHlwZWRlZiBlbnVtIHsKKyAgICBlbnVtIHsKICAgICAgICAga09wZW5SZWFkT25seSAgID0gMHgwMSwKICAgICAgICAga09wZW5SZWFkV3JpdGUgID0gMHgwMiwKICAgICAgICAga09wZW5DcmVhdGUgICAgID0gMHgwNCwgICAgIC8vIGNyZWF0ZSBpZiBpdCBkb2Vzbid0IGV4aXN0CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvUkVBRE1FIGIvdG9vbHMvbGF5b3V0bGliL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmVhOWJkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbGF5b3V0bGliL1JFQURNRQpAQCAtMCwwICsxLDQgQEAKK0xheW91dGxpYiBpcyBhIGN1c3RvbSB2ZXJzaW9uIG9mIHRoZSBhbmRyb2lkIFZpZXcgZnJhbWV3b3JrIGRlc2lnbmVkIHRvIHJ1biBpbnNpZGUgRWNsaXBzZS4KK1RoZSBnb2FsIG9mIHRoZSBsaWJyYXJ5IGlzIHRvIHByb3ZpZGUgbGF5b3V0IHJlbmRlcmluZyBpbiBFY2xpcHNlIHRoYXQgYXJlIHZlcnkgdmVyeSBjbG9zZSB0byB0aGVpciByZW5kZXJpbmcgb24gZGV2aWNlcy4KKworTm9uZSBvZiB0aGUgY29tLmFuZHJvaWQuKiBvciBhbmRyb2lkLiogY2xhc3NlcyBpbiBsYXlvdXRsaWIgcnVuIG9uIGRldmljZXMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKaW5kZXggZDVkMzE1ZS4uMWUxYWJhOSAxMDA2NDQKLS0tIGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YQorKysgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCkBAIC02OSwxMSArNjksNiBAQAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbid0IGNyZWF0ZSBDYW52YXMoaW50KSIpOwogICAgIH0KIAotICAgIHB1YmxpYyBDYW52YXMoamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wgZ2wpIHsKLSAgICAgICAgbUxvZ2dlciA9IG51bGw7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuJ3QgY3JlYXRlIENhbnZhcyhqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTCkiKTsKLSAgICB9Ci0KICAgICAvLyBjdXN0b20gY29uc3RydWN0b3JzIGZvciBvdXIgdXNlLgogICAgIHB1YmxpYyBDYW52YXMoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBJTGF5b3V0TG9nIGxvZ2dlcikgewogICAgICAgICBtTG9nZ2VyID0gbG9nZ2VyOwpAQCAtMTE3NCwxNSArMTE2OSw2IEBACiAgICAgfQogCiAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjZ2V0R0woKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBHTCBnZXRHTCgpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0R0woKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCiAgICAgICogQHNlZSBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyNnZXRNYXRyaXgoKQogICAgICAqLwogICAgIEBPdmVycmlkZQpAQCAtMTI1NywxNSArMTI0Myw2IEBACiAgICAgfQogCiAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjc2V0Vmlld3BvcnQoaW50LCBpbnQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Vmlld3BvcnQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgc3VwZXIuc2V0Vmlld3BvcnQod2lkdGgsIGhlaWdodCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQogICAgICAqIEBzZWUgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjc2tldyhmbG9hdCwgZmxvYXQpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9hbmRyb2lkL3ZpZXcvQnJpZGdlSW5mbGF0ZXIuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvdmlldy9CcmlkZ2VJbmZsYXRlci5qYXZhCmluZGV4IDA5MTBkNzkuLjRiYzg4NTUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvdmlldy9CcmlkZ2VJbmZsYXRlci5qYXZhCisrKyBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvdmlldy9CcmlkZ2VJbmZsYXRlci5qYXZhCkBAIC0xMTYsMTAgKzExNiwxMCBAQAogICAgIH0KICAgICAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmlldyBjcmVhdGVWaWV3RnJvbVRhZyhTdHJpbmcgbmFtZSwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgcHVibGljIFZpZXcgY3JlYXRlVmlld0Zyb21UYWcoVmlldyBwYXJlbnQsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKICAgICAgICAgVmlldyB2aWV3ID0gbnVsbDsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZpZXcgPSBzdXBlci5jcmVhdGVWaWV3RnJvbVRhZyhuYW1lLCBhdHRycyk7CisgICAgICAgICAgICB2aWV3ID0gc3VwZXIuY3JlYXRlVmlld0Zyb21UYWcocGFyZW50LCBuYW1lLCBhdHRycyk7CiAgICAgICAgIH0gY2F0Y2ggKEluZmxhdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gdHJ5IHRvIGxvYWQgdGhlIGNsYXNzIGZyb20gdXNpbmcgdGhlIGN1c3RvbSB2aWV3IGxvYWRlcgogICAgICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvQnJpZGdlLmphdmEgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL0JyaWRnZS5qYXZhCmluZGV4IGY5MWY2MDEuLjA1NTNmNWUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvQnJpZGdlLmphdmEKKysrIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9CcmlkZ2UuamF2YQpAQCAtMzAsNiArMzAsOCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLmxheW91dGxpYi5jcmVhdGUuTWV0aG9kQWRhcHRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC50b29scy5sYXlvdXRsaWIuY3JlYXRlLk92ZXJyaWRlTWV0aG9kOwogCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwpAQCAtNDYsNiArNDgsNyBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQnJpZGdlSW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LkRyYWdFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRDaGFubmVsOwogaW1wb3J0IGFuZHJvaWQudmlldy5JV2luZG93OwogaW1wb3J0IGFuZHJvaWQudmlldy5JV2luZG93U2Vzc2lvbjsKQEAgLTEwNzMsNiArMTA3NiwzMyBAQAogICAgICAgICB9CiAKICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgICAgIHB1YmxpYyBJQmluZGVyIHByZXBhcmVEcmFnKElXaW5kb3cgd2luZG93LCBib29sZWFuIGxvY2FsT25seSwKKyAgICAgICAgICAgICAgICBpbnQgdGh1bWJuYWlsV2lkdGgsIGludCB0aHVtYm5haWxIZWlnaHQsIFN1cmZhY2Ugb3V0U3VyZmFjZSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIHBhc3MgZm9yIG5vdworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybURyYWcoSVdpbmRvdyB3aW5kb3csIElCaW5kZXIgZHJhZ1Rva2VuLAorICAgICAgICAgICAgICAgIGZsb2F0IHRvdWNoWCwgZmxvYXQgdG91Y2hZLCBmbG9hdCB0aHVtYkNlbnRlclgsIGZsb2F0IHRodW1iQ2VudGVyWSwKKyAgICAgICAgICAgICAgICBDbGlwRGF0YSBkYXRhKQorICAgICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgLy8gcGFzcyBmb3Igbm93CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgcHVibGljIHZvaWQgZHJhZ1JlY2lwaWVudEVudGVyZWQoSVdpbmRvdyB3aW5kb3cpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgLy8gcGFzcyBmb3Igbm93CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgcHVibGljIHZvaWQgZHJhZ1JlY2lwaWVudEV4aXRlZChJV2luZG93IHdpbmRvdykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBwYXNzIGZvciBub3cKKyAgICAgICAgfQorCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgICAgICBwdWJsaWMgdm9pZCBzZXRXYWxscGFwZXJQb3NpdGlvbihJQmluZGVyIHdpbmRvdywgZmxvYXQgeCwgZmxvYXQgeSwKICAgICAgICAgICAgIGZsb2F0IHhTdGVwLCBmbG9hdCB5U3RlcCkgewogICAgICAgICAgICAgLy8gcGFzcyBmb3Igbm93LgpAQCAtMTE3MCw2ICsxMjAwLDExIEBACiAgICAgICAgICAgICAvLyBwYXNzIGZvciBub3cuCiAgICAgICAgIH0KIAorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hEcmFnRXZlbnQoRHJhZ0V2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAvLyBwYXNzIGZvciBub3cuCisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgSUJpbmRlciBhc0JpbmRlcigpIHsKICAgICAgICAgICAgIC8vIHBhc3MgZm9yIG5vdy4KICAgICAgICAgICAgIHJldHVybiBudWxsOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9CcmlkZ2VDb250ZXh0LmphdmEgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL0JyaWRnZUNvbnRleHQuamF2YQppbmRleCA3NDRiZmJlLi41OGIxYjZjIDEwMDY0NAotLS0gYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL0JyaWRnZUNvbnRleHQuamF2YQorKysgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL0JyaWRnZUNvbnRleHQuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5UaGVtZTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CkBAIC0xMDU5LDYgKzEwNjAsMTMgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIGFyZzAsIGludCBhcmcxLAorICAgICAgICAgICAgQ3Vyc29yRmFjdG9yeSBhcmcyLCBEYXRhYmFzZUVycm9ySGFuZGxlciBhcmczKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIERyYXdhYmxlIHBlZWtXYWxscGFwZXIoKSB7CiAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKICAgICAgICAgcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3Rlc3RzL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvVGVzdENsYXNzUmVwbGFjZW1lbnQuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2UvdGVzdHMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9UZXN0Q2xhc3NSZXBsYWNlbWVudC5qYXZhCmluZGV4IGUwZGM1NWYuLmFkYjY5M2QgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2UvdGVzdHMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9UZXN0Q2xhc3NSZXBsYWNlbWVudC5qYXZhCisrKyBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2UvdGVzdHMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9UZXN0Q2xhc3NSZXBsYWNlbWVudC5qYXZhCkBAIC0xNyw2ICsxNyw4IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmxheW91dGxpYi5icmlkZ2U7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIApAQCAtMjYsNyArMjgsOCBAQAogICAgICAgICAvLyBUT0RPOiB3ZSB3YW50IHRvIHRlc3QgYWxsIHRoZSBjbGFzc2VzLiBGb3Igbm93IG9ubHkgUGFpbnQgcGFzc2VzIHRoZSB0ZXN0cy4KIC8vICAgICAgICBmaW5hbCBTdHJpbmdbXSBjbGFzc2VzID0gQ3JlYXRlSW5mby5SRU5BTUVEX0NMQVNTRVM7CiAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGNsYXNzZXMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICJhbmRyb2lkLmdyYXBoaWNzLlBhaW50IiwgICAgICAgICAgICAgICAiYW5kcm9pZC5ncmFwaGljcy5fT3JpZ2luYWxfUGFpbnQiCisgICAgICAgICAgICAgICAgImFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQiLCAgICAgICAgICAgICAgICJhbmRyb2lkLmdyYXBoaWNzLl9PcmlnaW5hbF9QYWludCIsCisgICAgICAgICAgICAgICAgImFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzIiwgICAgICAgICAgICAgICAiYW5kcm9pZC5ncmFwaGljcy5fT3JpZ2luYWxfQ2FudmFzIiwKICAgICAgICAgfTsKICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gY2xhc3Nlcy5sZW5ndGg7CiAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGNvdW50IDsgaSArPSAyKSB7CkBAIC01MiwxMiArNTUsMjEgQEAKICAgICAgICAgTWV0aG9kW10gb2xkQ2xhc3NNZXRob2RzID0gb2xkQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCk7CiAKICAgICAgICAgZm9yIChNZXRob2Qgb2xkTWV0aG9kIDogb2xkQ2xhc3NNZXRob2RzKSB7Ci0gICAgICAgICAgICAvLyB3ZSBpZ25vcmUgYW55dGhpbmcgdGhhdCBzdGFydHMgd2l0aCBuYXRpdmUKKyAgICAgICAgICAgIC8vIHdlIGlnbm9yZSBhbnl0aGluZyB0aGF0IHN0YXJ0cyB3aXRoIG5hdGl2ZS4gVGhpcyBpcyBiZWNhdXNlIHRoZSBjbGFzcyB3ZSBhcmUgbG9va2luZworICAgICAgICAgICAgLy8gYXQgaGFzIGFscmVhZHkgYmVlbiBtb2RpZmllZCB0byByZW1vdmUgdGhlIG5hdGl2ZSBtb2RpZmllcnMuCiAgICAgICAgICAgICBpZiAob2xkTWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKCJuYXRpdmUiKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBvciBzdGF0aWMgYW5kIHByaXZhdGUKKyAgICAgICAgICAgIGludCBwcml2YXRlU3RhdGljID0gTW9kaWZpZXIuU1RBVElDIHwgTW9kaWZpZXIuUFJJVkFURTsKKyAgICAgICAgICAgIGlmICgob2xkTWV0aG9kLmdldE1vZGlmaWVycygpICYgcHJpdmF0ZVN0YXRpYykgPT0gcHJpdmF0ZVN0YXRpYykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgICBmb3IgKE1ldGhvZCBuZXdNZXRob2QgOiBuZXdDbGFzc01ldGhvZHMpIHsKKwogICAgICAgICAgICAgICAgIGlmIChjb21wYXJlTWV0aG9kcyhuZXdDbGFzcywgbmV3TWV0aG9kLCBvbGRDbGFzcywgb2xkTWV0aG9kKSkgewogICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjUsNyArNzcsMzEgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGZvdW5kID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJVbmFibGUgdG8gZmluZCAlMSRzIiwgb2xkTWV0aG9kLnRvR2VuZXJpY1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBhIGZ1bGwgY2xhc3MgbmFtZSB0aGF0J3MgbG9uZyBidXQgbm90IHRvbyBsb25nLgorICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihvbGRNZXRob2QuZ2V0TmFtZSgpICsgIigiKTsKKyAgICAgICAgICAgICAgICBUeXBlW10gcGFyYW1zID0gb2xkTWV0aG9kLmdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGFyYW1zLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXNbal0gaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSAoQ2xhc3MpcGFyYW1zW2pdOworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHRoZUNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGltZW5zaW9ucyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGhlQ2xhc3MuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9ucysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUNsYXNzID0gdGhlQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1lbnNpb25zOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIltdIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChwYXJhbXNbal0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaiA8IChwYXJhbXMubGVuZ3RoIC0gMSkpCisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIikiKTsKKworICAgICAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiTWlzc2luZyAlMSRzLiUyJHMiLCBuZXdDbGFzcy5nZXROYW1lKCksIHNiLnRvU3RyaW5nKCkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL1JFQURNRS50eHQgYi90b29scy9sYXlvdXRsaWIvY3JlYXRlL1JFQURNRS50eHQKaW5kZXggYzU5ZTIwZC4uNjVhNjRjZCAxMDA2NDQKLS0tIGEvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9SRUFETUUudHh0CisrKyBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvUkVBRE1FLnR4dApAQCAtMTk1LDUgKzE5NSwyMiBAQAogYnJpZGdlIHdpbGwgcHJvdmlkZSBpdHMgb3duIGltcGxlbWVudGF0aW9uLgogCiAKKy0gUmVmZXJlbmNlcyAtCistLS0tLS0tLS0tLS0tLQorCisKK1RoZSBKVk0gU3BlY2lmaWNhdGlvbiAybmQgZWRpdGlvbjoKKyAgaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2p2bXMvc2Vjb25kX2VkaXRpb24vaHRtbC9WTVNwZWNUT0MuZG9jLmh0bWwKKworVW5kZXJzdGFuZGluZyBieXRlY29kZToKKyAgaHR0cDovL3d3dy5pYm0uY29tL2RldmVsb3BlcndvcmtzL2libS9saWJyYXJ5L2l0LWhhZ2dhcl9ieXRlY29kZS8KKworQnl0ZWNvZGUgb3Bjb2RlIGxpc3Q6CisgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSmF2YV9ieXRlY29kZV9pbnN0cnVjdGlvbl9saXN0aW5ncworCitBU00gdXNlciBndWlkZToKKyAgaHR0cDovL2Rvd25sb2FkLmZvcmdlLm9iamVjdHdlYi5vcmcvYXNtL2FzbS1ndWlkZS5wZGYKKworCiAtLQogZW5kCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL3NyYy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvYW5ub3RhdGlvbnMvTGF5b3V0bGliRGVsZWdhdGUuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9hbm5vdGF0aW9ucy9MYXlvdXRsaWJEZWxlZ2F0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNDhlYTYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sYXlvdXRsaWIvY3JlYXRlL3NyYy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvYW5ub3RhdGlvbnMvTGF5b3V0bGliRGVsZWdhdGUuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50b29scy5sYXlvdXRsaWIuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworCisvKioKKyAqIERlbm90ZXMgYSBtZXRob2QgdGhhdCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gYSBkZWxlZ2F0ZSBieSBsYXlvdXRsaWJfY3JlYXRlLgorICovCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgTGF5b3V0bGliRGVsZWdhdGUgeworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9zcmMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9Bc21HZW5lcmF0b3IuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvQXNtR2VuZXJhdG9yLmphdmEKaW5kZXggN2I1NWVkM2UuLjU5MDkyM2YgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvQXNtR2VuZXJhdG9yLmphdmEKKysrIGIvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9zcmMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9Bc21HZW5lcmF0b3IuamF2YQpAQCAtMjgsOSArMjgsOSBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CiBpbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuamFyLkphck91dHB1dFN0cmVhbTsKIApAQCAtNjAsMzggKzYwLDU1IEBACiAgICAgICogIG9sZC1GUUNOIHRvIHJlbmFtZSBhbmQgdGhleSBnZXQgZXJhc2VkIGFzIHRoZXkgZ2V0IHJlbmFtZWQuIEF0IHRoZSBlbmQsIGNsYXNzZXMgc3RpbGwKICAgICAgKiAgbGVmdCBoZXJlIGFyZSBub3QgaW4gdGhlIGNvZGUgYmFzZSBhbnltb3JlIGFuZCB0aHVzIHdlcmUgbm90IHJlbmFtZWQuICovCiAgICAgcHJpdmF0ZSBIYXNoU2V0PFN0cmluZz4gbUNsYXNzZXNOb3RSZW5hbWVkOwotICAgIC8qKiBBIG1hcCB7IEZRQ04gPT4gbWFwIHsgbGlzdCBvZiByZXR1cm4gdHlwZXMgdG8gZGVsZXRlIGZyb20gdGhlIEZRQ04gfSB9LiAqLworICAgIC8qKiBBIG1hcCB7IEZRQ04gPT4gc2V0IHsgbGlzdCBvZiByZXR1cm4gdHlwZXMgdG8gZGVsZXRlIGZyb20gdGhlIEZRQ04gfSB9LiAqLwogICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PiBtRGVsZXRlUmV0dXJuczsKKyAgICAvKiogQSBtYXAgeyBGUUNOID0+IHNldCB7IG1ldGhvZCBuYW1lcyB9IH0gb2YgbWV0aG9kcyB0byByZXdyaXRlIGFzIGRlbGVnYXRlcy4KKyAgICAgKiAgVGhlIHNwZWNpYWwgbmFtZSB7QGxpbmsgRGVsZWdhdGVDbGFzc0FkYXB0ZXIjQUxMX05BVElWRVN9IGNhbiBiZSB1c2VkIGFzIGluIGludGVybmFsIHNldC4gKi8KKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gbURlbGVnYXRlTWV0aG9kczsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBuZXcgZ2VuZXJhdG9yIHRoYXQgY2FuIGdlbmVyYXRlIHRoZSBvdXRwdXQgSkFSIHdpdGggdGhlIHN0dWJiZWQgY2xhc3Nlcy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBsb2cgT3V0cHV0IGxvZ2dlci4KICAgICAgKiBAcGFyYW0gb3NEZXN0SmFyIFRoZSBwYXRoIG9mIHRoZSBkZXN0aW5hdGlvbiBKQVIgdG8gY3JlYXRlLgotICAgICAqIEBwYXJhbSBpbmplY3RDbGFzc2VzIFRoZSBsaXN0IG9mIGNsYXNzIGZyb20gbGF5b3V0bGliX2NyZWF0ZSB0byBpbmplY3QgaW4gbGF5b3V0bGliLgotICAgICAqIEBwYXJhbSBzdHViTWV0aG9kcyBUaGUgbGlzdCBvZiBtZXRob2RzIHRvIHN0dWIgb3V0LiBFYWNoIGVudHJ5IG11c3QgYmUgaW4gdGhlIGZvcm0KLSAgICAgKiAgICAgICAgICAicGFja2FnZS5wYWNrYWdlLk91dGVyQ2xhc3MkSW5uZXJDbGFzcyNNZXRob2ROYW1lIi4KLSAgICAgKiBAcGFyYW0gcmVuYW1lQ2xhc3NlcyBUaGUgbGlzdCBvZiBjbGFzc2VzIHRvIHJlbmFtZSwgbXVzdCBiZSBhbiBldmVuIGxpc3Q6IHRoZSBiaW5hcnkgRlFDTgotICAgICAqICAgICAgICAgIG9mIGNsYXNzIHRvIHJlcGxhY2UgZm9sbG93ZWQgYnkgdGhlIG5ldyBGUUNOLgotICAgICAqIEBwYXJhbSBkZWxldGVSZXR1cm5zIExpc3Qgb2YgY2xhc3NlcyBmb3Igd2hpY2ggdGhlIG1ldGhvZHMgcmV0dXJuaW5nIHRoZW0gc2hvdWxkIGJlIGRlbGV0ZWQuCi0gICAgICogVGhlIGFycmF5IGNvbnRhaW5zIGEgbGlzdCBvZiBudWxsIHRlcm1pbmF0ZWQgc2VjdGlvbiBzdGFydGluZyB3aXRoIHRoZSBuYW1lIG9mIHRoZSBjbGFzcwotICAgICAqIHRvIHJlbmFtZSBpbiB3aGljaCB0aGUgbWV0aG9kcyBhcmUgZGVsZXRlZCwgZm9sbG93ZWQgYnkgYSBsaXN0IG9mIHJldHVybiB0eXBlcyBpZGVudGlmeWluZwotICAgICAqIHRoZSBtZXRob2RzIHRvIGRlbGV0ZS4KKyAgICAgKiBAcGFyYW0gY3JlYXRlSW5mbyBDcmVhdGlvbiBwYXJhbWV0ZXJzLiBNdXN0IG5vdCBiZSBudWxsLgogICAgICAqLwotICAgIHB1YmxpYyBBc21HZW5lcmF0b3IoTG9nIGxvZywgU3RyaW5nIG9zRGVzdEphciwKLSAgICAgICAgICAgIENsYXNzPD8+W10gaW5qZWN0Q2xhc3NlcywKLSAgICAgICAgICAgIFN0cmluZ1tdIHN0dWJNZXRob2RzLAotICAgICAgICAgICAgU3RyaW5nW10gcmVuYW1lQ2xhc3NlcywgU3RyaW5nW10gZGVsZXRlUmV0dXJucykgeworICAgIHB1YmxpYyBBc21HZW5lcmF0b3IoTG9nIGxvZywgU3RyaW5nIG9zRGVzdEphciwgSUNyZWF0ZUluZm8gY3JlYXRlSW5mbykgewogICAgICAgICBtTG9nID0gbG9nOwogICAgICAgICBtT3NEZXN0SmFyID0gb3NEZXN0SmFyOwotICAgICAgICBtSW5qZWN0Q2xhc3NlcyA9IGluamVjdENsYXNzZXMgIT0gbnVsbCA/IGluamVjdENsYXNzZXMgOiBuZXcgQ2xhc3M8Pz5bMF07Ci0gICAgICAgIG1TdHViTWV0aG9kcyA9IHN0dWJNZXRob2RzICE9IG51bGwgPyBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3Qoc3R1Yk1ldGhvZHMpKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIG1JbmplY3RDbGFzc2VzID0gY3JlYXRlSW5mby5nZXRJbmplY3RlZENsYXNzZXMoKTsKKyAgICAgICAgbVN0dWJNZXRob2RzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KGNyZWF0ZUluZm8uZ2V0T3ZlcnJpZGRlbk1ldGhvZHMoKSkpOworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgbWFwL3NldCBvZiBtZXRob2RzIHRvIGNoYW5nZSB0byBkZWxlZ2F0ZXMKKyAgICAgICAgbURlbGVnYXRlTWV0aG9kcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2V0PFN0cmluZz4+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIHNpZ25hdHVyZSA6IGNyZWF0ZUluZm8uZ2V0RGVsZWdhdGVNZXRob2RzKCkpIHsKKyAgICAgICAgICAgIGludCBwb3MgPSBzaWduYXR1cmUuaW5kZXhPZignIycpOworICAgICAgICAgICAgaWYgKHBvcyA8PSAwIHx8IHBvcyA+PSBzaWduYXR1cmUubGVuZ3RoKCkgLSAxKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gYmluYXJ5VG9JbnRlcm5hbENsYXNzTmFtZShzaWduYXR1cmUuc3Vic3RyaW5nKDAsIHBvcykpOworICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBzaWduYXR1cmUuc3Vic3RyaW5nKHBvcyArIDEpOworICAgICAgICAgICAgU2V0PFN0cmluZz4gbWV0aG9kcyA9IG1EZWxlZ2F0ZU1ldGhvZHMuZ2V0KGNsYXNzTmFtZSk7CisgICAgICAgICAgICBpZiAobWV0aG9kcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbWV0aG9kcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICBtRGVsZWdhdGVNZXRob2RzLnB1dChjbGFzc05hbWUsIG1ldGhvZHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWV0aG9kcy5hZGQobWV0aG9kTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogY3JlYXRlSW5mby5nZXREZWxlZ2F0ZUNsYXNzTmF0aXZlcygpKSB7CisgICAgICAgICAgICBTZXQ8U3RyaW5nPiBtZXRob2RzID0gbURlbGVnYXRlTWV0aG9kcy5nZXQoY2xhc3NOYW1lKTsKKyAgICAgICAgICAgIGlmIChtZXRob2RzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtZXRob2RzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgICAgIG1EZWxlZ2F0ZU1ldGhvZHMucHV0KGNsYXNzTmFtZSwgbWV0aG9kcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXRob2RzLmFkZChEZWxlZ2F0ZUNsYXNzQWRhcHRlci5BTExfTkFUSVZFUyk7CisgICAgICAgIH0KIAogICAgICAgICAvLyBDcmVhdGUgdGhlIG1hcCBvZiBjbGFzc2VzIHRvIHJlbmFtZS4KICAgICAgICAgbVJlbmFtZUNsYXNzZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKICAgICAgICAgbUNsYXNzZXNOb3RSZW5hbWVkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBpbnQgbiA9IHJlbmFtZUNsYXNzZXMgPT0gbnVsbCA/IDAgOiByZW5hbWVDbGFzc2VzLmxlbmd0aDsKKyAgICAgICAgU3RyaW5nW10gcmVuYW1lQ2xhc3NlcyA9IGNyZWF0ZUluZm8uZ2V0UmVuYW1lZENsYXNzZXMoKTsKKyAgICAgICAgaW50IG4gPSByZW5hbWVDbGFzc2VzLmxlbmd0aDsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpICs9IDIpIHsKICAgICAgICAgICAgIGFzc2VydCBpICsgMSA8IG47CiAgICAgICAgICAgICAvLyBUaGUgQVNNIGNsYXNzIG5hbWVzIHVzZXMgIi8iIHNlcGFyYXRvcnMsIHdoZXJlYXMgcmVndWxhciBGUUNOIHVzZSAiLiIKQEAgLTEwMCwzOCArMTE3LDM3IEBACiAgICAgICAgICAgICBtUmVuYW1lQ2xhc3Nlcy5wdXQob2xkRnFjbiwgbmV3RnFjbik7CiAgICAgICAgICAgICBtQ2xhc3Nlc05vdFJlbmFtZWQuYWRkKG9sZEZxY24pOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIC8vIGNyZWF0ZSB0aGUgbWFwIG9mIHJlbmFtZWQgY2xhc3MgLT4gcmV0dXJuIHR5cGUgb2YgbWV0aG9kIHRvIGRlbGV0ZS4KICAgICAgICAgbURlbGV0ZVJldHVybnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PigpOwotICAgICAgICBpZiAoZGVsZXRlUmV0dXJucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTZXQ8U3RyaW5nPiByZXR1cm5UeXBlcyA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgcmVuYW1lZENsYXNzID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IGRlbGV0ZVJldHVybnMpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB3ZSByZWFjaCB0aGUgZW5kIG9mIGEgc2VjdGlvbiwgYWRkIGl0IHRvIHRoZSBtYWluIG1hcAotICAgICAgICAgICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbURlbGV0ZVJldHVybnMucHV0KHJlbmFtZWRDbGFzcywgcmV0dXJuVHlwZXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICByZW5hbWVkQ2xhc3MgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgU3RyaW5nW10gZGVsZXRlUmV0dXJucyA9IGNyZWF0ZUluZm8uZ2V0RGVsZXRlUmV0dXJucygpOworICAgICAgICBTZXQ8U3RyaW5nPiByZXR1cm5UeXBlcyA9IG51bGw7CisgICAgICAgIFN0cmluZyByZW5hbWVkQ2xhc3MgPSBudWxsOworICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBkZWxldGVSZXR1cm5zKSB7CisgICAgICAgICAgICAvLyBpZiB3ZSByZWFjaCB0aGUgZW5kIG9mIGEgc2VjdGlvbiwgYWRkIGl0IHRvIHRoZSBtYWluIG1hcAorICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbURlbGV0ZVJldHVybnMucHV0KHJlbmFtZWRDbGFzcywgcmV0dXJuVHlwZXMpOwogICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcmVuYW1lZCBjbGFzcyBpcyBudWxsLCB0aGlzIGlzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZWN0aW9uCi0gICAgICAgICAgICAgICAgaWYgKHJlbmFtZWRDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmFtZWRDbGFzcyA9IGJpbmFyeVRvSW50ZXJuYWxDbGFzc05hbWUoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgIC8vIGp1c3QgYSBzdGFuZGFyZCByZXR1cm4gdHlwZSwgd2UgYWRkIGl0IHRvIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm5UeXBlcy5hZGQoYmluYXJ5VG9JbnRlcm5hbENsYXNzTmFtZShjbGFzc05hbWUpKTsKKworICAgICAgICAgICAgICAgIHJlbmFtZWRDbGFzcyA9IG51bGw7CisgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSByZW5hbWVkIGNsYXNzIGlzIG51bGwsIHRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiBhIHNlY3Rpb24KKyAgICAgICAgICAgIGlmIChyZW5hbWVkQ2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlbmFtZWRDbGFzcyA9IGJpbmFyeVRvSW50ZXJuYWxDbGFzc05hbWUoY2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8ganVzdCBhIHN0YW5kYXJkIHJldHVybiB0eXBlLCB3ZSBhZGQgaXQgdG8gdGhlIGxpc3QuCisgICAgICAgICAgICBpZiAocmV0dXJuVHlwZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVyblR5cGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuVHlwZXMuYWRkKGJpbmFyeVRvSW50ZXJuYWxDbGFzc05hbWUoY2xhc3NOYW1lKSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNsYXNzZXMgdGhhdCBoYXZlIG5vdCBiZWVuIHJlbmFtZWQgeWV0LgogICAgICAqIDxwLz4KQEAgLTE2MywxMiArMTc5LDEyIEBACiAgICAgcHVibGljIHZvaWQgc2V0RGVwcyhNYXA8U3RyaW5nLCBDbGFzc1JlYWRlcj4gZGVwcykgewogICAgICAgICBtRGVwcyA9IGRlcHM7CiAgICAgfQotICAgIAorCiAgICAgLyoqIEdldHMgdGhlIG1hcCBvZiBjbGFzc2VzIHRvIG91dHB1dCBhcy1pcywgZXhjZXB0IGlmIHRoZXkgaGF2ZSBuYXRpdmUgbWV0aG9kcyAqLwogICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBDbGFzc1JlYWRlcj4gZ2V0S2VlcCgpIHsKICAgICAgICAgcmV0dXJuIG1LZWVwOwogICAgIH0KLSAgICAKKwogICAgIC8qKiBHZXRzIHRoZSBtYXAgb2YgZGVwZW5kZW5jaWVzIHRoYXQgbXVzdCBiZSBjb21wbGV0ZWx5IHN0dWJiZWQgKi8KICAgICBwdWJsaWMgTWFwPFN0cmluZywgQ2xhc3NSZWFkZXI+IGdldERlcHMoKSB7CiAgICAgICAgIHJldHVybiBtRGVwczsKQEAgLTE3Nyw3ICsxOTMsNyBAQAogICAgIC8qKiBHZW5lcmF0ZXMgdGhlIGZpbmFsIEpBUiAqLwogICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgICBUcmVlTWFwPFN0cmluZywgYnl0ZVtdPiBhbGwgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIGJ5dGVbXT4oKTsKLSAgICAgICAgCisKICAgICAgICAgZm9yIChDbGFzczw/PiBjbGF6eiA6IG1JbmplY3RDbGFzc2VzKSB7CiAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGNsYXNzVG9FbnRyeVBhdGgoY2xhenopOwogICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZUFzU3RyZWFtKG5hbWUpOwpAQCAtMTg2LDcgKzIwMiw3IEBACiAgICAgICAgICAgICBuYW1lID0gY2xhc3NOYW1lVG9FbnRyeVBhdGgodHJhbnNmb3JtTmFtZShjci5nZXRDbGFzc05hbWUoKSkpOwogICAgICAgICAgICAgYWxsLnB1dChuYW1lLCBiKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgQ2xhc3NSZWFkZXI+IGVudHJ5IDogbURlcHMuZW50cnlTZXQoKSkgewogICAgICAgICAgICAgQ2xhc3NSZWFkZXIgY3IgPSBlbnRyeS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgYnl0ZVtdIGIgPSB0cmFuc2Zvcm0oY3IsIHRydWUgLyogc3R1Yk5hdGl2ZXNPbmx5ICovKTsKQEAgLTIxMSw4ICsyMjcsOCBAQAogCiAgICAgLyoqCiAgICAgICogV3JpdGVzIHRoZSBKQVIgZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3V0U3RyZWFtIFRoZSBmaWxlIG91dHB1dCBzdHJlYW0gd2VyZSB0byB3cml0ZSB0aGUgSkFSLiAKKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRTdHJlYW0gVGhlIGZpbGUgb3V0cHV0IHN0cmVhbSB3ZXJlIHRvIHdyaXRlIHRoZSBKQVIuCiAgICAgICogQHBhcmFtIGFsbCBUaGUgbWFwIG9mIGFsbCBjbGFzc2VzIHRvIG91dHB1dC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBoYXMgb2NjdXJyZWQKICAgICAgKi8KQEAgLTIzNiw3ICsyNTIsNyBAQAogICAgIFN0cmluZyBjbGFzc05hbWVUb0VudHJ5UGF0aChTdHJpbmcgY2xhc3NOYW1lKSB7CiAgICAgICAgIHJldHVybiBjbGFzc05hbWUucmVwbGFjZUFsbCgiXFwuIiwgIi8iKS5jb25jYXQoIi5jbGFzcyIpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGdldCB0aGUgSkFSIGVudHJ5IHBhdGggZnJvbSBhIENsYXNzIG5hbWUuCiAgICAgICogZS5nLiBpdCByZXR1cm5zIHNvbWV0aW5nIGxpa2UgImNvbS9mb28vT3V0ZXJDbGFzcyRJbm5lckNsYXNzMSRJbm5lckNsYXNzMi5jbGFzcyIKQEAgLTI0OCwzMCArMjY0LDMyIEBACiAgICAgICAgICAgICBuYW1lID0gIiQiICsgY2xhenouZ2V0U2ltcGxlTmFtZSgpICsgbmFtZTsKICAgICAgICAgICAgIGNsYXp6ID0gcGFyZW50OwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbGFzc05hbWVUb0VudHJ5UGF0aChjbGF6ei5nZXRDYW5vbmljYWxOYW1lKCkgKyBuYW1lKTsgICAgICAgIAorICAgICAgICByZXR1cm4gY2xhc3NOYW1lVG9FbnRyeVBhdGgoY2xhenouZ2V0Q2Fub25pY2FsTmFtZSgpICsgbmFtZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVHJhbnNmb3JtcyBhIGNsYXNzLgogICAgICAqIDxwLz4KICAgICAgKiBUaGVyZSBhcmUgMyBraW5kIG9mIHRyYW5zZm9ybWF0aW9uczoKLSAgICAgKiAKKyAgICAgKgogICAgICAqIDEtIEZvciAibW9jayIgZGVwZW5kZW5jaWVzIGNsYXNzZXMsIHdlIHdhbnQgdG8gcmVtb3ZlIGFsbCBjb2RlIGZyb20gbWV0aG9kcyBhbmQgcmVwbGFjZQogICAgICAqIGJ5IGEgc3R1Yi4gTmF0aXZlIG1ldGhvZHMgbXVzdCBiZSBpbXBsZW1lbnRlZCB3aXRoIHRoaXMgc3R1YiB0b28uIEFic3RyYWN0IG1ldGhvZHMgYXJlCiAgICAgICogbGVmdCBpbnRhY3QuIE1vZGlmaWVkIGNsYXNzZXMgbXVzdCBiZSBvdmVycmlkYWJsZSAobm9uLXByaXZhdGUsIG5vbi1maW5hbCkuCiAgICAgICogTmF0aXZlIG1ldGhvZHMgbXVzdCBiZSBtYWRlIG5vbi1maW5hbCwgbm9uLXByaXZhdGUuCi0gICAgICogCisgICAgICoKICAgICAgKiAyLSBGb3IgImtlZXAiIGNsYXNzZXMsIHdlIHdhbnQgdG8gcmV3cml0ZSBhbGwgbmF0aXZlIG1ldGhvZHMgYXMgaW5kaWNhdGVkIGFib3ZlLgogICAgICAqIElmIGEgY2xhc3MgaGFzIG5hdGl2ZSBtZXRob2RzLCBpdCBtdXN0IGFsc28gYmUgbWFkZSBub24tcHJpdmF0ZSwgbm9uLWZpbmFsLgotICAgICAqIAorICAgICAqCiAgICAgICogTm90ZSB0aGF0IHVuZm9ydHVuYXRlbHkgc3RhdGljIG1ldGhvZHMgY2Fubm90IGJlIGNoYW5nZWQgdG8gbm9uLXN0YXRpYyAoc2luY2Ugc3RhdGljIGFuZAogICAgICAqIG5vbi1zdGF0aWMgYXJlIGludm9rZWQgZGlmZmVyZW50bHkuKQogICAgICAqLwogICAgIGJ5dGVbXSB0cmFuc2Zvcm0oQ2xhc3NSZWFkZXIgY3IsIGJvb2xlYW4gc3R1Yk5hdGl2ZXNPbmx5KSB7CiAKICAgICAgICAgYm9vbGVhbiBoYXNOYXRpdmVNZXRob2RzID0gaGFzTmF0aXZlTWV0aG9kcyhjcik7CisKKyAgICAgICAgLy8gR2V0IHRoZSBjbGFzcyBuYW1lLCBhcyBhbiBpbnRlcm5hbCBuYW1lIChlLmcuIGNvbS9hbmRyb2lkL1NvbWVDbGFzcyRJbm5lckNsYXNzKQogICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gY3IuZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgICAgIAorCiAgICAgICAgIFN0cmluZyBuZXdOYW1lID0gdHJhbnNmb3JtTmFtZShjbGFzc05hbWUpOwogICAgICAgICAvLyB0cmFuc2Zvcm1OYW1lIHJldHVybnMgaXRzIGlucHV0IGFyZ3VtZW50IGlmIHRoZXJlJ3Mgbm8gbmVlZCB0byByZW5hbWUgdGhlIGNsYXNzCiAgICAgICAgIGlmIChuZXdOYW1lICE9IGNsYXNzTmFtZSkgewpAQCAtMjg4LDEzICszMDYsMjQgQEAKICAgICAgICAgLy8gUmV3cml0ZSB0aGUgbmV3IGNsYXNzIGZyb20gc2NyYXRjaCwgd2l0aG91dCByZXVzaW5nIHRoZSBjb25zdGFudCBwb29sIGZyb20gdGhlCiAgICAgICAgIC8vIG9yaWdpbmFsIGNsYXNzIHJlYWRlci4KICAgICAgICAgQ2xhc3NXcml0ZXIgY3cgPSBuZXcgQ2xhc3NXcml0ZXIoQ2xhc3NXcml0ZXIuQ09NUFVURV9NQVhTKTsKLSAgICAgICAgCisKICAgICAgICAgQ2xhc3NWaXNpdG9yIHJ2ID0gY3c7CiAgICAgICAgIGlmIChuZXdOYW1lICE9IGNsYXNzTmFtZSkgewogICAgICAgICAgICAgcnYgPSBuZXcgUmVuYW1lQ2xhc3NBZGFwdGVyKGN3LCBjbGFzc05hbWUsIG5ld05hbWUpOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBUcmFuc2Zvcm1DbGFzc0FkYXB0ZXIgY3YgPSBuZXcgVHJhbnNmb3JtQ2xhc3NBZGFwdGVyKG1Mb2csIG1TdHViTWV0aG9kcywgCisKKyAgICAgICAgU2V0PFN0cmluZz4gZGVsZWdhdGVNZXRob2RzID0gbURlbGVnYXRlTWV0aG9kcy5nZXQoY2xhc3NOYW1lKTsKKyAgICAgICAgaWYgKGRlbGVnYXRlTWV0aG9kcyAhPSBudWxsICYmICFkZWxlZ2F0ZU1ldGhvZHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBJZiBkZWxlZ2F0ZU1ldGhvZHMgb25seSBjb250YWlucyBvbmUgZW50cnkgQUxMX05BVElWRVMgYW5kIHRoZSBjbGFzcyBpcworICAgICAgICAgICAgLy8ga25vd24gdG8gaGF2ZSBubyBuYXRpdmUgbWV0aG9kcywganVzdCBza2lwIHRoaXMgc3RlcC4KKyAgICAgICAgICAgIGlmIChoYXNOYXRpdmVNZXRob2RzIHx8CisgICAgICAgICAgICAgICAgICAgICEoZGVsZWdhdGVNZXRob2RzLnNpemUoKSA9PSAxICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVNZXRob2RzLmNvbnRhaW5zKERlbGVnYXRlQ2xhc3NBZGFwdGVyLkFMTF9OQVRJVkVTKSkpIHsKKyAgICAgICAgICAgICAgICBydiA9IG5ldyBEZWxlZ2F0ZUNsYXNzQWRhcHRlcihtTG9nLCBydiwgY2xhc3NOYW1lLCBkZWxlZ2F0ZU1ldGhvZHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgVHJhbnNmb3JtQ2xhc3NBZGFwdGVyIGN2ID0gbmV3IFRyYW5zZm9ybUNsYXNzQWRhcHRlcihtTG9nLCBtU3R1Yk1ldGhvZHMsCiAgICAgICAgICAgICAgICAgbURlbGV0ZVJldHVybnMuZ2V0KGNsYXNzTmFtZSksCiAgICAgICAgICAgICAgICAgbmV3TmFtZSwgcnYsCiAgICAgICAgICAgICAgICAgc3R1Yk5hdGl2ZXNPbmx5LCBzdHViTmF0aXZlc09ubHkgfHwgaGFzTmF0aXZlTWV0aG9kcyk7CkBAIC0zMjMsNyArMzUyLDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gbmV3TmFtZSArIGNsYXNzTmFtZS5zdWJzdHJpbmcocG9zKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9zcmMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9DcmVhdGVJbmZvLmphdmEgYi90b29scy9sYXlvdXRsaWIvY3JlYXRlL3NyYy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL0NyZWF0ZUluZm8uamF2YQppbmRleCAyZWQ4NjQxLi45Mjg5Mjc4NCAxMDA2NDQKLS0tIGEvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9zcmMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9DcmVhdGVJbmZvLmphdmEKKysrIGIvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9zcmMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9DcmVhdGVJbmZvLmphdmEKQEAgLTE2LDExICsxNiw3MCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnRvb2xzLmxheW91dGxpYi5jcmVhdGU7CiAKLXB1YmxpYyBjbGFzcyBDcmVhdGVJbmZvIHsKKy8qKgorICogRGVzY3JpYmVzIHRoZSB3b3JrIHRvIGJlIGRvbmUgYnkge0BsaW5rIEFzbUdlbmVyYXRvcn0uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDcmVhdGVJbmZvIGltcGxlbWVudHMgSUNyZWF0ZUluZm8geworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjbGFzcyBmcm9tIGxheW91dGxpYl9jcmVhdGUgdG8gaW5qZWN0IGluIGxheW91dGxpYi4KKyAgICAgKiBUaGUgbGlzdCBjYW4gYmUgZW1wdHkgYnV0IG11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIENsYXNzPD8+W10gZ2V0SW5qZWN0ZWRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gSU5KRUNURURfQ0xBU1NFUzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIG1ldGhvZHMgdG8gcmV3cml0ZSBhcyBkZWxlZ2F0ZXMuCisgICAgICogVGhlIGxpc3QgY2FuIGJlIGVtcHR5IGJ1dCBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREZWxlZ2F0ZU1ldGhvZHMoKSB7CisgICAgICAgIHJldHVybiBERUxFR0FURV9NRVRIT0RTOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY2xhc3NlcyBvbiB3aGljaCB0byBkZWxlZ2F0ZSBhbGwgbmF0aXZlIG1ldGhvZHMuCisgICAgICogVGhlIGxpc3QgY2FuIGJlIGVtcHR5IGJ1dCBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREZWxlZ2F0ZUNsYXNzTmF0aXZlcygpIHsKKyAgICAgICAgcmV0dXJuIERFTEVHQVRFX0NMQVNTX05BVElWRVM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBUaGUgbGlzdCBvZiBtZXRob2RzIHRvIHN0dWIgb3V0LiBFYWNoIGVudHJ5IG11c3QgYmUgaW4gdGhlIGZvcm0KKyAgICAgKiAicGFja2FnZS5wYWNrYWdlLk91dGVyQ2xhc3MkSW5uZXJDbGFzcyNNZXRob2ROYW1lIi4KKyAgICAgKiBUaGUgbGlzdCBjYW4gYmUgZW1wdHkgYnV0IG11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldE92ZXJyaWRkZW5NZXRob2RzKCkgeworICAgICAgICByZXR1cm4gT1ZFUlJJRERFTl9NRVRIT0RTOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY2xhc3NlcyB0byByZW5hbWUsIG11c3QgYmUgYW4gZXZlbiBsaXN0OiB0aGUgYmluYXJ5IEZRQ04KKyAgICAgKiBvZiBjbGFzcyB0byByZXBsYWNlIGZvbGxvd2VkIGJ5IHRoZSBuZXcgRlFDTi4KKyAgICAgKiBUaGUgbGlzdCBjYW4gYmUgZW1wdHkgYnV0IG11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFJlbmFtZWRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gUkVOQU1FRF9DTEFTU0VTOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY2xhc3NlcyBmb3Igd2hpY2ggdGhlIG1ldGhvZHMgcmV0dXJuaW5nIHRoZW0gc2hvdWxkIGJlIGRlbGV0ZWQuCisgICAgICogVGhlIGFycmF5IGNvbnRhaW5zIGEgbGlzdCBvZiBudWxsIHRlcm1pbmF0ZWQgc2VjdGlvbiBzdGFydGluZyB3aXRoIHRoZSBuYW1lIG9mIHRoZSBjbGFzcworICAgICAqIHRvIHJlbmFtZSBpbiB3aGljaCB0aGUgbWV0aG9kcyBhcmUgZGVsZXRlZCwgZm9sbG93ZWQgYnkgYSBsaXN0IG9mIHJldHVybiB0eXBlcyBpZGVudGlmeWluZworICAgICAqIHRoZSBtZXRob2RzIHRvIGRlbGV0ZS4KKyAgICAgKiBUaGUgbGlzdCBjYW4gYmUgZW1wdHkgYnV0IG11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldERlbGV0ZVJldHVybnMoKSB7CisgICAgICAgIHJldHVybiBERUxFVEVfUkVUVVJOUzsKKyAgICB9CisKKyAgICAvLy0tLS0tCisKICAgICAvKioKICAgICAgKiBUaGUgbGlzdCBvZiBjbGFzcyBmcm9tIGxheW91dGxpYl9jcmVhdGUgdG8gaW5qZWN0IGluIGxheW91dGxpYi4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIENsYXNzPD8+W10gSU5KRUNURURfQ0xBU1NFUyA9IG5ldyBDbGFzczw/PltdIHsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczw/PltdIElOSkVDVEVEX0NMQVNTRVMgPSBuZXcgQ2xhc3M8Pz5bXSB7CiAgICAgICAgICAgICBPdmVycmlkZU1ldGhvZC5jbGFzcywKICAgICAgICAgICAgIE1ldGhvZExpc3RlbmVyLmNsYXNzLAogICAgICAgICAgICAgTWV0aG9kQWRhcHRlci5jbGFzcywKQEAgLTI4LDE5ICs4NywzNyBAQAogICAgICAgICB9OwogCiAgICAgLyoqCisgICAgICogVGhlIGxpc3Qgb2YgbWV0aG9kcyB0byByZXdyaXRlIGFzIGRlbGVnYXRlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBERUxFR0FURV9NRVRIT0RTID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgLy8gVE9ETzogY29tbWVudCBvdXQgb25jZSBEZWxlZ2F0ZUNsYXNzIGlzIHdvcmtpbmcKKyAgICAgICAgLy8gImFuZHJvaWQudmlldy5WaWV3I2lzSW5FZGl0TW9kZSIsCisgICAgICAgIC8vICJhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyRUaGVtZSNvYnRhaW5TdHlsZWRBdHRyaWJ1dGVzIiwKKyAgICB9OworCisgICAgLyoqCisgICAgICogVGhlIGxpc3Qgb2YgY2xhc3NlcyBvbiB3aGljaCB0byBkZWxlZ2F0ZSBhbGwgbmF0aXZlIG1ldGhvZHMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gREVMRUdBVEVfQ0xBU1NfTkFUSVZFUyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgIC8vIFRPRE86IGNvbW1lbnQgb3V0IG9uY2UgRGVsZWdhdGVDbGFzcyBpcyB3b3JraW5nCisgICAgICAgIC8vICJhbmRyb2lkLmdyYXBoaWNzLlBhaW50IgorICAgIH07CisKKyAgICAvKioKICAgICAgKiBUaGUgbGlzdCBvZiBtZXRob2RzIHRvIHN0dWIgb3V0LiBFYWNoIGVudHJ5IG11c3QgYmUgaW4gdGhlIGZvcm0KICAgICAgKiAgInBhY2thZ2UucGFja2FnZS5PdXRlckNsYXNzJElubmVyQ2xhc3MjTWV0aG9kTmFtZSIuCiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBPVkVSUklEREVOX01FVEhPRFMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgImFuZHJvaWQudmlldy5WaWV3I2lzSW5FZGl0TW9kZSIsCi0gICAgICAgICAgICAiYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMkVGhlbWUjb2J0YWluU3R5bGVkQXR0cmlidXRlcyIsCi0gICAgICAgIH07CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gT1ZFUlJJRERFTl9NRVRIT0RTID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgLy8gVE9ETzogcmVtb3ZlIG9uY2UgRGVsZWdhdGVDbGFzcyBpcyB3b3JraW5nCisgICAgICAgICJhbmRyb2lkLnZpZXcuVmlldyNpc0luRWRpdE1vZGUiLAorICAgICAgICAiYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMkVGhlbWUjb2J0YWluU3R5bGVkQXR0cmlidXRlcyIsCisgICAgfTsKIAogICAgIC8qKgogICAgICAqICBUaGUgbGlzdCBvZiBjbGFzc2VzIHRvIHJlbmFtZSwgbXVzdCBiZSBhbiBldmVuIGxpc3Q6IHRoZSBiaW5hcnkgRlFDTgogICAgICAqICBvZiBjbGFzcyB0byByZXBsYWNlIGZvbGxvd2VkIGJ5IHRoZSBuZXcgRlFDTi4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZ1tdIFJFTkFNRURfQ0xBU1NFUyA9CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gUkVOQU1FRF9DTEFTU0VTID0KICAgICAgICAgbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCIsICAgICAgICAgICAgICAiYW5kcm9pZC5ncmFwaGljcy5fT3JpZ2luYWxfQml0bWFwIiwKICAgICAgICAgICAgICJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3RvcnkiLCAgICAgICAiYW5kcm9pZC5ncmFwaGljcy5fT3JpZ2luYWxfQml0bWFwRmFjdG9yeSIsCkBAIC02OSw3ICsxNDYsNyBAQAogICAgICAqIHRvIHJlbmFtZSBpbiB3aGljaCB0aGUgbWV0aG9kcyBhcmUgZGVsZXRlZCwgZm9sbG93ZWQgYnkgYSBsaXN0IG9mIHJldHVybiB0eXBlcyBpZGVudGlmeWluZwogICAgICAqIHRoZSBtZXRob2RzIHRvIGRlbGV0ZS4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZ1tdIFJFTU9WRURfTUVUSE9EUyA9CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gREVMRVRFX1JFVFVSTlMgPQogICAgICAgICBuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgImFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQiLCAgICAgICAvLyBjbGFzcyB0byBkZWxldGUgbWV0aG9kcyBmcm9tCiAgICAgICAgICAgICAiYW5kcm9pZC5ncmFwaGljcy5QYWludCRBbGlnbiIsIC8vIGxpc3Qgb2YgdHlwZSBpZGVudGlmeWluZyBtZXRob2RzIHRvIGRlbGV0ZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9zcmMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9EZWxlZ2F0ZUNsYXNzQWRhcHRlci5qYXZhIGIvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9zcmMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9EZWxlZ2F0ZUNsYXNzQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYmE4YTAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sYXlvdXRsaWIvY3JlYXRlL3NyYy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL0RlbGVnYXRlQ2xhc3NBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudG9vbHMubGF5b3V0bGliLmNyZWF0ZTsKKworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzQWRhcHRlcjsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5DbGFzc1Zpc2l0b3I7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvcjsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBBIHtAbGluayBEZWxlZ2F0ZUNsYXNzQWRhcHRlcn0gY2FuIHRyYW5zZm9ybSBzb21lIG1ldGhvZHMgZnJvbSBhIGNsYXNzIGludG8KKyAqIGRlbGVnYXRlcyB0aGF0IGRlZmVyIHRoZSBjYWxsIHRvIGFuIGFzc29jaWF0ZWQgZGVsZWdhdGUgY2xhc3MuCisgKiA8cC8+CisgKiBUaGlzIGlzIHVzZWQgdG8gb3ZlcnJpZGUgc3BlY2lmaWMgbWV0aG9kcyBhbmQgb3IgYWxsIG5hdGl2ZSBtZXRob2RzIGluIGNsYXNzZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBEZWxlZ2F0ZUNsYXNzQWRhcHRlciBleHRlbmRzIENsYXNzQWRhcHRlciB7CisKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBTExfTkFUSVZFUyA9ICI8PGFsbF9uYXRpdmVzPj4iOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNsYXNzTmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IG1EZWxlZ2F0ZU1ldGhvZHM7CisgICAgcHJpdmF0ZSBmaW5hbCBMb2cgbUxvZzsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIERlbGVnYXRlQ2xhc3NBZGFwdGVyfSB0aGF0IGNhbiB0cmFuc2Zvcm0gc29tZSBtZXRob2RzCisgICAgICogZnJvbSBhIGNsYXNzIGludG8gZGVsZWdhdGVzIHRoYXQgZGVmZXIgdGhlIGNhbGwgdG8gYW4gYXNzb2NpYXRlZCBkZWxlZ2F0ZSBjbGFzcy4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBpcyB1c2VkIHRvIG92ZXJyaWRlIHNwZWNpZmljIG1ldGhvZHMgYW5kIG9yIGFsbCBuYXRpdmUgbWV0aG9kcyBpbiBjbGFzc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGxvZyBUaGUgbG9nZ2VyIG9iamVjdC4gTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gY3YgdGhlIGNsYXNzIHZpc2l0b3IgdG8gd2hpY2ggdGhpcyBhZGFwdGVyIG11c3QgZGVsZWdhdGUgY2FsbHMuCisgICAgICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgaW50ZXJuYWwgY2xhc3MgbmFtZSBvZiB0aGUgY2xhc3MgdG8gdmlzaXQsCisgICAgICogICAgICAgICAgZS5nLiA8Y29kZT5jb20vYW5kcm9pZC9Tb21lQ2xhc3MkSW5uZXJDbGFzczwvY29kZT4uCisgICAgICogQHBhcmFtIGRlbGVnYXRlTWV0aG9kcyBUaGUgc2V0IG9mIG1ldGhvZCBuYW1lcyB0byBtb2RpZnkgYW5kL29yIHRoZQorICAgICAqICAgICAgICAgIHNwZWNpYWwgY29uc3RhbnQge0BsaW5rICNBTExfTkFUSVZFU30gdG8gY29udmVydCBhbGwgbmF0aXZlIG1ldGhvZHMuCisgICAgICovCisgICAgcHVibGljIERlbGVnYXRlQ2xhc3NBZGFwdGVyKExvZyBsb2csCisgICAgICAgICAgICBDbGFzc1Zpc2l0b3IgY3YsCisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lLAorICAgICAgICAgICAgU2V0PFN0cmluZz4gZGVsZWdhdGVNZXRob2RzKSB7CisgICAgICAgIHN1cGVyKGN2KTsKKyAgICAgICAgbUxvZyA9IGxvZzsKKyAgICAgICAgbUNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgICAgICAgbURlbGVnYXRlTWV0aG9kcyA9IGRlbGVnYXRlTWV0aG9kczsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBNZXRob2RzIGZyb20gdGhlIENsYXNzQWRhcHRlcgorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1ldGhvZFZpc2l0b3IgdmlzaXRNZXRob2QoaW50IGFjY2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjLAorICAgICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSwgU3RyaW5nW10gZXhjZXB0aW9ucykgeworCisgICAgICAgIGJvb2xlYW4gaXNTdGF0aWMgPSAoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfU1RBVElDKSAhPSAwOworICAgICAgICBib29sZWFuIGlzTmF0aXZlID0gKGFjY2VzcyAmIE9wY29kZXMuQUNDX05BVElWRSkgIT0gMDsKKworICAgICAgICBib29sZWFuIHVzZURlbGVnYXRlID0gKGlzTmF0aXZlICYmIG1EZWxlZ2F0ZU1ldGhvZHMuY29udGFpbnMoQUxMX05BVElWRVMpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlbGVnYXRlTWV0aG9kcy5jb250YWlucyhuYW1lKTsKKworICAgICAgICBpZiAodXNlRGVsZWdhdGUpIHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSBuYXRpdmUKKyAgICAgICAgICAgIGFjY2VzcyA9IGFjY2VzcyAmIH5PcGNvZGVzLkFDQ19OQVRJVkU7CisgICAgICAgIH0KKworICAgICAgICBNZXRob2RWaXNpdG9yIG13ID0gc3VwZXIudmlzaXRNZXRob2QoYWNjZXNzLCBuYW1lLCBkZXNjLCBzaWduYXR1cmUsIGV4Y2VwdGlvbnMpOworICAgICAgICBpZiAodXNlRGVsZWdhdGUpIHsKKyAgICAgICAgICAgIERlbGVnYXRlTWV0aG9kQWRhcHRlciBhID0gbmV3IERlbGVnYXRlTWV0aG9kQWRhcHRlcihtTG9nLCBtdywgbUNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBkZXNjLCBpc1N0YXRpYyk7CisgICAgICAgICAgICBpZiAoaXNOYXRpdmUpIHsKKyAgICAgICAgICAgICAgICAvLyBBIG5hdGl2ZSBoYXMgbm8gY29kZSB0byB2aXNpdCwgc28gd2UgbmVlZCB0byBnZW5lcmF0ZSBpdCBkaXJlY3RseS4KKyAgICAgICAgICAgICAgICBhLmdlbmVyYXRlQ29kZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbXc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9zcmMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9EZWxlZ2F0ZU1ldGhvZEFkYXB0ZXIuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvRGVsZWdhdGVNZXRob2RBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkNjY4MgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvRGVsZWdhdGVNZXRob2RBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwzMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRvb2xzLmxheW91dGxpYi5jcmVhdGU7CisKK2ltcG9ydCBjb20uYW5kcm9pZC50b29scy5sYXlvdXRsaWIuYW5ub3RhdGlvbnMuTGF5b3V0bGliRGVsZWdhdGU7CisKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5Bbm5vdGF0aW9uVmlzaXRvcjsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uQ2xhc3NSZWFkZXI7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uQ2xhc3NWaXNpdG9yOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLkxhYmVsOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3I7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5UeXBlOworCisvKioKKyAqIFRoaXMgbWV0aG9kIGFkYXB0ZXIgcmV3cml0ZXMgYSBtZXRob2QgYnkgZGlzY2FyZGluZyB0aGUgb3JpZ2luYWwgY29kZSBhbmQgZ2VuZXJhdGluZworICogYSBjYWxsIHRvIGEgZGVsZWdhdGUuIE9yaWdpbmFsIGFubm90YXRpb25zIGFyZSBwYXNzZWQgYWxvbmcgdW5jaGFuZ2VkLgorICogPHAvPgorICogQ2FsbHMgYXJlIGRlbGVnYXRlZCB0byBhIGNsYXNzIG5hbWVkIDxjb2RlPiZsdDtjbGFzc05hbWUmZ3Q7X0RlbGVnYXRlPC9jb2RlPiB3aXRoCisgKiBzdGF0aWMgbWV0aG9kcyBtYXRjaGluZyB0aGUgbWV0aG9kcyB0byBiZSBvdmVycmlkZGVuIGhlcmUuIFRoZSBtZXRob2RzIGhhdmUgdGhlCisgKiBzYW1lIHJldHVybiB0eXBlLiBUaGUgYXJndW1lbnQgdHlwZSBsaXN0IGlzIHRoZSBzYW1lIGV4Y2VwdCB0aGUgInRoaXMiIHJlZmVyZW5jZSBpcworICogcGFzc2VkIGZpcnN0IGZvciBub24tc3RhdGljIG1ldGhvZHMuCisgKiA8cC8+CisgKiBBIG5ldyBhbm5vdGF0aW9uIGlzIGFkZGVkLgorICogPHAvPgorICogTm90ZSB0aGF0IG5hdGl2ZSBtZXRob2RzIGhhdmUsIGJ5IGRlZmluaXRpb24sIG5vIGNvZGUgc28gdGhlcmUncyBub3RoaW5nIGEgdmlzaXRvcgorICogY2FuIHZpc2l0LiBUaGF0IG1lYW5zIHRoZSBjYWxsZXIgbXVzdCBjYWxsIHtAbGluayAjZ2VuZXJhdGVDb2RlKCl9IGRpcmVjdGx5IGZvcgorICogYSBuYXRpdmUgYW5kIHVzZSB0aGUgdmlzaXRvciBwYXR0ZXJuIGZvciBub24tbmF0aXZlcy4KKyAqIDxwLz4KKyAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSBub3QgcmUtdXNhYmxlLiBZb3UgbmVlZCBhIG5ldyBpbnN0YW5jZSBmb3IgZWFjaCBtZXRob2QuCisgKi8KK2NsYXNzIERlbGVnYXRlTWV0aG9kQWRhcHRlciBpbXBsZW1lbnRzIE1ldGhvZFZpc2l0b3IgeworCisgICAgLyoqCisgICAgICogU3VmZml4IGFkZGVkIHRvIGRlbGVnYXRlIGNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRUdBVEVfU1VGRklYID0gIl9EZWxlZ2F0ZSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ09OU1RSVUNUT1IgPSAiPGluaXQ+IjsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ0xBU1NfSU5JVCA9ICI8Y2xpbml0PiI7CisKKyAgICAvKiogVGhlIHBhcmVudCBtZXRob2Qgd3JpdGVyICovCisgICAgcHJpdmF0ZSBNZXRob2RWaXNpdG9yIG1QYXJlbnRWaXNpdG9yOworICAgIC8qKiBGbGFnIHRvIG91dHB1dCB0aGUgZmlyc3QgbGluZSBudW1iZXIuICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1PdXRwdXRGaXJzdExpbmVOdW1iZXIgPSB0cnVlOworICAgIC8qKiBUaGUgb3JpZ2luYWwgbWV0aG9kIGRlc2NyaXB0b3IgKHJldHVybiB0eXBlICsgYXJndW1lbnQgdHlwZXMuKSAqLworICAgIHByaXZhdGUgU3RyaW5nIG1EZXNjOworICAgIC8qKiBUcnVlIGlmIHRoZSBvcmlnaW5hbCBtZXRob2QgaXMgc3RhdGljLiAqLworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNTdGF0aWM7CisgICAgLyoqIFRoZSBpbnRlcm5hbCBjbGFzcyBuYW1lIChlLmcuIDxjb2RlPmNvbS9hbmRyb2lkL1NvbWVDbGFzcyRJbm5lckNsYXNzPC9jb2RlPi4pICovCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNsYXNzTmFtZTsKKyAgICAvKiogVGhlIG1ldGhvZCBuYW1lLiAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1NZXRob2ROYW1lOworICAgIC8qKiBMb2dnZXIgb2JqZWN0LiAqLworICAgIHByaXZhdGUgZmluYWwgTG9nIG1Mb2c7CisgICAgLyoqIFRydWUgaWYge0BsaW5rICN2aXNpdENvZGUoKX0gaGFzIGJlZW4gaW52b2tlZC4gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbVZpc2l0Q29kZUNhbGxlZDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIERlbGVnYXRlTWV0aG9kQWRhcHRlcn0gdGhhdCB3aWxsIHRyYW5zZm9ybSB0aGlzIG1ldGhvZAorICAgICAqIGludG8gYSBkZWxlZ2F0ZSBjYWxsLgorICAgICAqIDxwLz4KKyAgICAgKiBTZWUge0BsaW5rIERlbGVnYXRlTWV0aG9kQWRhcHRlcn0gZm9yIG1vcmUgZGV0YWlscy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2cgVGhlIGxvZ2dlciBvYmplY3QuIE11c3Qgbm90IGJlIG51bGwuCisgICAgICogQHBhcmFtIG12IHRoZSBtZXRob2QgdmlzaXRvciB0byB3aGljaCB0aGlzIGFkYXB0ZXIgbXVzdCBkZWxlZ2F0ZSBjYWxscy4KKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBpbnRlcm5hbCBjbGFzcyBuYW1lIG9mIHRoZSBjbGFzcyB0byB2aXNpdCwKKyAgICAgKiAgICAgICAgICBlLmcuIDxjb2RlPmNvbS9hbmRyb2lkL1NvbWVDbGFzcyRJbm5lckNsYXNzPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSBUaGUgc2ltcGxlIG5hbWUgb2YgdGhlIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gZGVzYyBBIG1ldGhvZCBkZXNjcmlwdG9yIChjLmYuIHtAbGluayBUeXBlI2dldFJldHVyblR5cGUoU3RyaW5nKX0gKworICAgICAqICAgICAgICAgIHtAbGluayBUeXBlI2dldEFyZ3VtZW50VHlwZXMoU3RyaW5nKX0pCisgICAgICogQHBhcmFtIGlzU3RhdGljIFRydWUgaWYgdGhlIG1ldGhvZCBpcyBkZWNsYXJlZCBzdGF0aWMuCisgICAgICovCisgICAgcHVibGljIERlbGVnYXRlTWV0aG9kQWRhcHRlcihMb2cgbG9nLAorICAgICAgICAgICAgTWV0aG9kVmlzaXRvciBtdiwKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUsCisgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSwKKyAgICAgICAgICAgIFN0cmluZyBkZXNjLAorICAgICAgICAgICAgYm9vbGVhbiBpc1N0YXRpYykgeworICAgICAgICBtTG9nID0gbG9nOworICAgICAgICBtUGFyZW50VmlzaXRvciA9IG12OworICAgICAgICBtQ2xhc3NOYW1lID0gY2xhc3NOYW1lOworICAgICAgICBtTWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7CisgICAgICAgIG1EZXNjID0gZGVzYzsKKyAgICAgICAgbUlzU3RhdGljID0gaXNTdGF0aWM7CisKKyAgICAgICAgaWYgKENPTlNUUlVDVE9SLmVxdWFscyhtZXRob2ROYW1lKSB8fCBDTEFTU19JTklULmVxdWFscyhtZXRob2ROYW1lKSkgeworICAgICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gc2ltcGxpZnkgYnkgbm90IHN1cHBvcnRpbmcgY29uc3RydWN0b3JzLgorICAgICAgICAgICAgLy8gVGhlIG9ubHkgdHJpY2sgd2l0aCBhIGNvbnN0cnVjdG9yIGlzIHRvIGZpbmQgdGhlIHByb3BlciBzdXBlciBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgLy8gYW5kIGNhbGwgaXQgKGFuZCBkZWNpZGluZyBpZiB3ZSBzaG91bGQgbWlycm9yIHRoZSBvcmlnaW5hbCBtZXRob2QgY2FsbCB0bworICAgICAgICAgICAgLy8gYSBjdXN0b20gY29uc3RydWN0b3Igb3IgY2FsbCBhIGRlZmF1bHQgb25lLikKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiRGVsZWdhdGUgZG9lc24ndCBzdXBwb3J0IG92ZXJyaWRpbmcgY29uc3RydWN0b3IgJTEkczolMiRzKCUzJHMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsIG1ldGhvZE5hbWUsIGRlc2MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgbmV3IGNvZGUgZm9yIHRoZSBtZXRob2QuCisgICAgICogPHAvPgorICAgICAqIEZvciBuYXRpdmUgbWV0aG9kcywgdGhpcyBtdXN0IGJlIGludm9rZWQgZGlyZWN0bHkgYnkge0BsaW5rIERlbGVnYXRlQ2xhc3NBZGFwdGVyfQorICAgICAqIChzaW5jZSB0aGV5IGhhdmUgbm8gY29kZSB0byB2aXNpdCkuCisgICAgICogPHAvPgorICAgICAqIE90aGVyd2lzZSBmb3Igbm9uLW5hdGl2ZSBtZXRob2RzIHRoZSB7QGxpbmsgRGVsZWdhdGVDbGFzc0FkYXB0ZXJ9IHNpbXBseSBuZWVkcyB0bworICAgICAqIHJldHVybiB0aGlzIGluc3RhbmNlIG9mIHtAbGluayBEZWxlZ2F0ZU1ldGhvZEFkYXB0ZXJ9IGFuZCBsZXQgdGhlIG5vcm1hbCB2aXNpdG9yIHBhdHRlcm4KKyAgICAgKiBpbnZva2UgaXQgYXMgcGFydCBvZiB0aGUge0BsaW5rIENsYXNzUmVhZGVyI2FjY2VwdChDbGFzc1Zpc2l0b3IsIGludCl9IHdvcmtmbG93IGFuZCB0aGVuCisgICAgICogdGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGZyb20ge0BsaW5rIE1ldGhvZFZpc2l0b3IjdmlzaXRFbmQoKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZ2VuZXJhdGVDb2RlKCkgeworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgZ29hbCBpcyB0byBnZW5lcmF0ZSBhIGNhbGwgdG8gYSBzdGF0aWMgZGVsZWdhdGUgbWV0aG9kLgorICAgICAgICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBub3Qtc3RhdGljLCB0aGUgZmlyc3QgcGFyYW1ldGVyIHdpbGwgYmUgdGhpcy4KKyAgICAgICAgICogQWxsIHRoZSBwYXJhbWV0ZXJzIG11c3QgYmUgcGFzc2VkIGFuZCB0aGVuIHRoZSBldmVudHVhbCByZXR1cm4gdHlwZSByZXR1cm5lZC4KKyAgICAgICAgICoKKyAgICAgICAgICogRXhhbXBsZSwgbGV0J3Mgc2F5IHdlIGhhdmUgYSBtZXRob2Qgc3VjaCBhcworICAgICAgICAgKiAgIHB1YmxpYyB2b2lkIG1ldGhvZF8xKGludCBhLCBPYmplY3QgYiwgQXJyYXlMaXN0PFN0cmluZz4gYykgeyAuLi4gfQorICAgICAgICAgKgorICAgICAgICAgKiBXZSdsbCB3YW50IHRvIGNyZWF0ZSBhIGJvZHkgdGhhdCBjYWxscyBhIGRlbGVnYXRlIG1ldGhvZCBsaWtlIHRoaXM6CisgICAgICAgICAqICAgVGhlQ2xhc3NfRGVsZWdhdGUubWV0aG9kXzEodGhpcywgYSwgYiwgYyk7CisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBnZW5lcmF0ZWQgY2xhc3MgbmFtZSBpcyB0aGUgY3VycmVudCBjbGFzcyBuYW1lIHdpdGggIl9EZWxlZ2F0ZSIgYXBwZW5kZWQgdG8gaXQuCisgICAgICAgICAqIE9uZSB0aGluZyB0byByZWFsaXplIGlzIHRoYXQgd2UgZG9uJ3QgY2FyZSBhYm91dCBnZW5lcmljcyAtLSBzaW5jZSBnZW5lcmljIHR5cGVzCisgICAgICAgICAqIGFyZSBlcmFzZWQgYXQgcnVudGltZSwgdGhleSBoYXZlIG5vIGluZmx1ZW5jZSBvbiB0aGUgbWV0aG9kIGJlaW5nIGNhbGxlZC4KKyAgICAgICAgICovCisKKyAgICAgICAgLy8gQWRkIG91ciBhbm5vdGF0aW9uCisgICAgICAgIEFubm90YXRpb25WaXNpdG9yIGF3ID0gbVBhcmVudFZpc2l0b3IudmlzaXRBbm5vdGF0aW9uKAorICAgICAgICAgICAgICAgIFR5cGUuZ2V0T2JqZWN0VHlwZShUeXBlLmdldEludGVybmFsTmFtZShMYXlvdXRsaWJEZWxlZ2F0ZS5jbGFzcykpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgdHJ1ZSk7IC8vIHZpc2libGUgYXQgcnVudGltZQorICAgICAgICBhdy52aXNpdEVuZCgpOworCisgICAgICAgIGlmICghbVZpc2l0Q29kZUNhbGxlZCkgeworICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGRpcmVjdCBjYWxsIHRvIGdlbmVyYXRlQ29kZSgpIGFzIGRvbmUgYnkgRGVsZWdhdGVDbGFzc0FkYXB0ZXIKKyAgICAgICAgICAgIC8vIGZvciBuYXRpdmVzLCB2aXNpdENvZGUoKSBoYXNuJ3QgYmVlbiBjYWxsZWQgeWV0LgorICAgICAgICAgICAgbVBhcmVudFZpc2l0b3IudmlzaXRDb2RlKCk7CisgICAgICAgICAgICBtVmlzaXRDb2RlQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBudW1WYXJzID0gMDsKKworICAgICAgICAvLyBQdXNoICJ0aGlzIiBmb3IgYW4gaW5zdGFuY2UgbWV0aG9kLCB3aGljaCBpcyBhbHdheXMgQUxPQUQgMAorICAgICAgICBpZiAoIW1Jc1N0YXRpYykgeworICAgICAgICAgICAgbVBhcmVudFZpc2l0b3IudmlzaXRWYXJJbnNuKE9wY29kZXMuQUxPQUQsIG51bVZhcnMrKyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQdXNoIGFsbCBvdGhlciBhcmd1bWVudHMKKyAgICAgICAgVHlwZVtdIGFyZ1R5cGVzID0gVHlwZS5nZXRBcmd1bWVudFR5cGVzKG1EZXNjKTsKKyAgICAgICAgZm9yIChUeXBlIHQgOiBhcmdUeXBlcykgeworICAgICAgICAgICAgaW50IHNpemUgPSB0LmdldFNpemUoKTsKKyAgICAgICAgICAgIG1QYXJlbnRWaXNpdG9yLnZpc2l0VmFySW5zbih0LmdldE9wY29kZShPcGNvZGVzLklMT0FEKSwgbnVtVmFycyk7CisgICAgICAgICAgICBudW1WYXJzICs9IHNpemU7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIGRlbGVnYXRlLiBGb3IgYSBzdGF0aWMgbWV0aG9kLCBpdCdzIHRoZSBzYW1lCisgICAgICAgIC8vIGhvd2V2ZXIgZm9yIGFuIGluc3RhbmNlIG1ldGhvZCB3ZSBuZWVkIHRvIHBhc3MgdGhlICd0aGlzJyByZWZlcmVuY2UgZmlyc3QKKyAgICAgICAgU3RyaW5nIGRlc2MgPSBtRGVzYzsKKyAgICAgICAgaWYgKCFtSXNTdGF0aWMgJiYgYXJnVHlwZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgVHlwZVtdIGFyZ1R5cGVzMiA9IG5ldyBUeXBlW2FyZ1R5cGVzLmxlbmd0aCArIDFdOworCisgICAgICAgICAgICBhcmdUeXBlczJbMF0gPSBUeXBlLmdldE9iamVjdFR5cGUobUNsYXNzTmFtZSk7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFyZ1R5cGVzLCAwLCBhcmdUeXBlczIsIDEsIGFyZ1R5cGVzLmxlbmd0aCk7CisKKyAgICAgICAgICAgIGRlc2MgPSBUeXBlLmdldE1ldGhvZERlc2NyaXB0b3IoVHlwZS5nZXRSZXR1cm5UeXBlKG1EZXNjKSwgYXJnVHlwZXMyKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBkZWxlZ2F0ZUNsYXNzTmFtZSA9IG1DbGFzc05hbWUgKyBERUxFR0FURV9TVUZGSVg7CisKKyAgICAgICAgLy8gSW52b2tlIHRoZSBzdGF0aWMgZGVsZWdhdGUKKyAgICAgICAgbVBhcmVudFZpc2l0b3IudmlzaXRNZXRob2RJbnNuKE9wY29kZXMuSU5WT0tFU1RBVElDLAorICAgICAgICAgICAgICAgIGRlbGVnYXRlQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgIG1NZXRob2ROYW1lLAorICAgICAgICAgICAgICAgIGRlc2MpOworCisgICAgICAgIFR5cGUgcmV0dXJuVHlwZSA9IFR5cGUuZ2V0UmV0dXJuVHlwZShtRGVzYyk7CisgICAgICAgIG1QYXJlbnRWaXNpdG9yLnZpc2l0SW5zbihyZXR1cm5UeXBlLmdldE9wY29kZShPcGNvZGVzLklSRVRVUk4pKTsKKworICAgICAgICBtUGFyZW50VmlzaXRvci52aXNpdE1heHMobnVtVmFycywgbnVtVmFycyk7CisgICAgICAgIG1QYXJlbnRWaXNpdG9yLnZpc2l0RW5kKCk7CisKKyAgICAgICAgLy8gRm9yIGRlYnVnZ2luZyBub3cuIE1heWJlIHdlIHNob3VsZCBjb2xsZWN0IHRoZXNlIGFuZCBzdG9yZSB0aGVtIGluCisgICAgICAgIC8vIGEgdGV4dCBmaWxlIGZvciBoZWxwaW5nIGNyZWF0ZSB0aGUgZGVsZWdhdGVzLiBXZSBjb3VsZCBhbHNvIGNvbXBhcmUKKyAgICAgICAgLy8gdGhlIHRleHQgZmlsZSB0byBhIGdvbGRlbiBhbmQgYnJlYWsgdGhlIGJ1aWxkIG9uIHVuc3VwcG9ydGVkIGNoYW5nZXMKKyAgICAgICAgLy8gb3IgcmVncmVzc2lvbnMuIEV2ZW4gYmV0dGVyIHdlIGNvdWxkIGZhbmN5LXByaW50IHNvbWV0aGluZyB0aGF0IGxvb2tzCisgICAgICAgIC8vIGxpa2UgdGhlIGV4cGVjdGVkIEphdmEgbWV0aG9kIGRlY2xhcmF0aW9uLgorICAgICAgICBtTG9nLmRlYnVnKCJEZWxlZ2F0ZTogJTEkcyAjICUyJHMgJTMkcyIsIGRlbGVnYXRlQ2xhc3NOYW1lLCBtTWV0aG9kTmFtZSwgZGVzYyk7CisgICAgfQorCisgICAgLyogUGFzcyBkb3duIHRvIHZpc2l0b3Igd3JpdGVyLiBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCBlaXRoZXIgZG8gbm90aGluZy4gKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdENvZGUoKSB7CisgICAgICAgIG1WaXNpdENvZGVDYWxsZWQgPSB0cnVlOworICAgICAgICBtUGFyZW50VmlzaXRvci52aXNpdENvZGUoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHZpc2l0TWF4cyBpcyBjYWxsZWQganVzdCBiZWZvcmUgdmlzaXRFbmQgaWYgdGhlcmUgd2FzIGFueSBjb2RlIHRvIHJld3JpdGUuCisgICAgICogU2tpcCB0aGUgb3JpZ2luYWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRNYXhzKGludCBtYXhTdGFjaywgaW50IG1heExvY2FscykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZCBvZiB2aXNpdGluZy4gR2VuZXJhdGUgdGhlIG1lc3NhZ2luZyBjb2RlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0RW5kKCkgeworICAgICAgICBnZW5lcmF0ZUNvZGUoKTsKKyAgICB9CisKKyAgICAvKiBXcml0ZXMgYWxsIGFubm90YXRpb24gZnJvbSB0aGUgb3JpZ2luYWwgbWV0aG9kLiAqLworICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdEFubm90YXRpb24oU3RyaW5nIGRlc2MsIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICByZXR1cm4gbVBhcmVudFZpc2l0b3IudmlzaXRBbm5vdGF0aW9uKGRlc2MsIHZpc2libGUpOworICAgIH0KKworICAgIC8qIFdyaXRlcyBhbGwgYW5ub3RhdGlvbiBkZWZhdWx0IHZhbHVlcyBmcm9tIHRoZSBvcmlnaW5hbCBtZXRob2QuICovCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbkRlZmF1bHQoKSB7CisgICAgICAgIHJldHVybiBtUGFyZW50VmlzaXRvci52aXNpdEFubm90YXRpb25EZWZhdWx0KCk7CisgICAgfQorCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0UGFyYW1ldGVyQW5ub3RhdGlvbihpbnQgcGFyYW1ldGVyLCBTdHJpbmcgZGVzYywKKyAgICAgICAgICAgIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICByZXR1cm4gbVBhcmVudFZpc2l0b3IudmlzaXRQYXJhbWV0ZXJBbm5vdGF0aW9uKHBhcmFtZXRlciwgZGVzYywgdmlzaWJsZSk7CisgICAgfQorCisgICAgLyogV3JpdGVzIGFsbCBhdHRyaWJ1dGVzIGZyb20gdGhlIG9yaWdpbmFsIG1ldGhvZC4gKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZShBdHRyaWJ1dGUgYXR0cikgeworICAgICAgICBtUGFyZW50VmlzaXRvci52aXNpdEF0dHJpYnV0ZShhdHRyKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE9ubHkgd3JpdGVzIHRoZSBmaXJzdCBsaW5lIG51bWJlciBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCBjb2RlIHNvIHRoYXQgc291cmNlCisgICAgICogdmlld2VycyBjYW4gZGlyZWN0IHRvIHRoZSBjb3JyZWN0IG1ldGhvZCwgZXZlbiBpZiB0aGUgY29udGVudCBkb2Vzbid0IG1hdGNoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGluZU51bWJlcihpbnQgbGluZSwgTGFiZWwgc3RhcnQpIHsKKyAgICAgICAgaWYgKG1PdXRwdXRGaXJzdExpbmVOdW1iZXIpIHsKKyAgICAgICAgICAgIG1QYXJlbnRWaXNpdG9yLnZpc2l0TGluZU51bWJlcihsaW5lLCBzdGFydCk7CisgICAgICAgICAgICBtT3V0cHV0Rmlyc3RMaW5lTnVtYmVyID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEluc24oaW50IG9wY29kZSkgeworICAgICAgICAvLyBTa2lwIG9yaWdpbmFsIGNvZGUuCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMYWJlbChMYWJlbCBsYWJlbCkgeworICAgICAgICAvLyBTa2lwIG9yaWdpbmFsIGNvZGUuCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRUcnlDYXRjaEJsb2NrKExhYmVsIHN0YXJ0LCBMYWJlbCBlbmQsIExhYmVsIGhhbmRsZXIsIFN0cmluZyB0eXBlKSB7CisgICAgICAgIC8vIFNraXAgb3JpZ2luYWwgY29kZS4KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZEluc24oaW50IG9wY29kZSwgU3RyaW5nIG93bmVyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MpIHsKKyAgICAgICAgLy8gU2tpcCBvcmlnaW5hbCBjb2RlLgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0RmllbGRJbnNuKGludCBvcGNvZGUsIFN0cmluZyBvd25lciwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjKSB7CisgICAgICAgIC8vIFNraXAgb3JpZ2luYWwgY29kZS4KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZyYW1lKGludCB0eXBlLCBpbnQgbkxvY2FsLCBPYmplY3RbXSBsb2NhbCwgaW50IG5TdGFjaywgT2JqZWN0W10gc3RhY2spIHsKKyAgICAgICAgLy8gU2tpcCBvcmlnaW5hbCBjb2RlLgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0SWluY0luc24oaW50IHZhciwgaW50IGluY3JlbWVudCkgeworICAgICAgICAvLyBTa2lwIG9yaWdpbmFsIGNvZGUuCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnRJbnNuKGludCBvcGNvZGUsIGludCBvcGVyYW5kKSB7CisgICAgICAgIC8vIFNraXAgb3JpZ2luYWwgY29kZS4KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEp1bXBJbnNuKGludCBvcGNvZGUsIExhYmVsIGxhYmVsKSB7CisgICAgICAgIC8vIFNraXAgb3JpZ2luYWwgY29kZS4KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExkY0luc24oT2JqZWN0IGNzdCkgeworICAgICAgICAvLyBTa2lwIG9yaWdpbmFsIGNvZGUuCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMb2NhbFZhcmlhYmxlKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzYywgU3RyaW5nIHNpZ25hdHVyZSwKKyAgICAgICAgICAgIExhYmVsIHN0YXJ0LCBMYWJlbCBlbmQsIGludCBpbmRleCkgeworICAgICAgICAvLyBTa2lwIG9yaWdpbmFsIGNvZGUuCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMb29rdXBTd2l0Y2hJbnNuKExhYmVsIGRmbHQsIGludFtdIGtleXMsIExhYmVsW10gbGFiZWxzKSB7CisgICAgICAgIC8vIFNraXAgb3JpZ2luYWwgY29kZS4KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE11bHRpQU5ld0FycmF5SW5zbihTdHJpbmcgZGVzYywgaW50IGRpbXMpIHsKKyAgICAgICAgLy8gU2tpcCBvcmlnaW5hbCBjb2RlLgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0VGFibGVTd2l0Y2hJbnNuKGludCBtaW4sIGludCBtYXgsIExhYmVsIGRmbHQsIExhYmVsW10gbGFiZWxzKSB7CisgICAgICAgIC8vIFNraXAgb3JpZ2luYWwgY29kZS4KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFR5cGVJbnNuKGludCBvcGNvZGUsIFN0cmluZyB0eXBlKSB7CisgICAgICAgIC8vIFNraXAgb3JpZ2luYWwgY29kZS4KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFZhckluc24oaW50IG9wY29kZSwgaW50IHZhcikgeworICAgICAgICAvLyBTa2lwIG9yaWdpbmFsIGNvZGUuCisgICAgfQorCit9CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL3NyYy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL0lDcmVhdGVJbmZvLmphdmEgYi90b29scy9sYXlvdXRsaWIvY3JlYXRlL3NyYy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL0lDcmVhdGVJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBjMTcwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvSUNyZWF0ZUluZm8uamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50b29scy5sYXlvdXRsaWIuY3JlYXRlOworCisvKioKKyAqIEludGVyZmFjZSBkZXNjcmliaW5nIHRoZSB3b3JrIHRvIGJlIGRvbmUgYnkge0BsaW5rIEFzbUdlbmVyYXRvcn0uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUNyZWF0ZUluZm8geworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjbGFzcyBmcm9tIGxheW91dGxpYl9jcmVhdGUgdG8gaW5qZWN0IGluIGxheW91dGxpYi4KKyAgICAgKiBUaGUgbGlzdCBjYW4gYmUgZW1wdHkgYnV0IG11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IENsYXNzPD8+W10gZ2V0SW5qZWN0ZWRDbGFzc2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIG1ldGhvZHMgdG8gcmV3cml0ZSBhcyBkZWxlZ2F0ZXMuCisgICAgICogVGhlIGxpc3QgY2FuIGJlIGVtcHR5IGJ1dCBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXREZWxlZ2F0ZU1ldGhvZHMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY2xhc3NlcyBvbiB3aGljaCB0byBkZWxlZ2F0ZSBhbGwgbmF0aXZlIG1ldGhvZHMuCisgICAgICogVGhlIGxpc3QgY2FuIGJlIGVtcHR5IGJ1dCBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXREZWxlZ2F0ZUNsYXNzTmF0aXZlcygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBUaGUgbGlzdCBvZiBtZXRob2RzIHRvIHN0dWIgb3V0LiBFYWNoIGVudHJ5IG11c3QgYmUgaW4gdGhlIGZvcm0KKyAgICAgKiAicGFja2FnZS5wYWNrYWdlLk91dGVyQ2xhc3MkSW5uZXJDbGFzcyNNZXRob2ROYW1lIi4KKyAgICAgKiBUaGUgbGlzdCBjYW4gYmUgZW1wdHkgYnV0IG11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldE92ZXJyaWRkZW5NZXRob2RzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNsYXNzZXMgdG8gcmVuYW1lLCBtdXN0IGJlIGFuIGV2ZW4gbGlzdDogdGhlIGJpbmFyeSBGUUNOCisgICAgICogb2YgY2xhc3MgdG8gcmVwbGFjZSBmb2xsb3dlZCBieSB0aGUgbmV3IEZRQ04uCisgICAgICogVGhlIGxpc3QgY2FuIGJlIGVtcHR5IGJ1dCBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRSZW5hbWVkQ2xhc3NlcygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBjbGFzc2VzIGZvciB3aGljaCB0aGUgbWV0aG9kcyByZXR1cm5pbmcgdGhlbSBzaG91bGQgYmUgZGVsZXRlZC4KKyAgICAgKiBUaGUgYXJyYXkgY29udGFpbnMgYSBsaXN0IG9mIG51bGwgdGVybWluYXRlZCBzZWN0aW9uIHN0YXJ0aW5nIHdpdGggdGhlIG5hbWUgb2YgdGhlIGNsYXNzCisgICAgICogdG8gcmVuYW1lIGluIHdoaWNoIHRoZSBtZXRob2RzIGFyZSBkZWxldGVkLCBmb2xsb3dlZCBieSBhIGxpc3Qgb2YgcmV0dXJuIHR5cGVzIGlkZW50aWZ5aW5nCisgICAgICogdGhlIG1ldGhvZHMgdG8gZGVsZXRlLgorICAgICAqIFRoZSBsaXN0IGNhbiBiZSBlbXB0eSBidXQgbXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0RGVsZXRlUmV0dXJucygpOworCit9CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL3NyYy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL01haW4uamF2YSBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvTWFpbi5qYXZhCmluZGV4IDMwM2YwOTcuLjRhZGFmZjkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvTWFpbi5qYXZhCisrKyBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvTWFpbi5qYXZhCkBAIC0yMSw3ICsyMSwyOCBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIAotCisvKioKKyAqIEVudHJ5IHBvaW50IGZvciB0aGUgbGF5b3V0bGliX2NyZWF0ZSB0b29sLgorICogPHAvPgorICogVGhlIHRvb2wgZG9lcyBub3QgY3VycmVudGx5IHJlbHkgb24gYW55IGV4dGVybmFsIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAqIEluc3RlYWQgdGhlIGNvbmZpZ3VyYXRpb24gaXMgbW9zdGx5IGRvbmUgdmlhIHRoZSB7QGxpbmsgQ3JlYXRlSW5mb30gY2xhc3MuCisgKiA8cC8+CisgKiBGb3IgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUgdG9vbCBhbmQgaXRzIGltcGxlbWVudGF0aW9uLCBwbGVhc2UgcmVmZXIgdG8KKyAqIHRoZSAiUkVBRE1FLnR4dCIgZmlsZSBhdCB0aGUgcm9vdCBvZiB0aGlzIHByb2plY3QuCisgKiA8cC8+CisgKiBGb3IgYSBxdWljayB0ZXN0LCBpbnZva2UgdGhpcyBhcyBmb2xsb3dzOgorICogPHByZT4KKyAqICQgbWFrZSBsYXlvdXRsaWIKKyAqIDwvcHJlPgorICogd2hpY2ggZG9lczoKKyAqIDxwcmU+CisgKiAkIG1ha2UgbGF5b3V0bGliX2NyZWF0ZSAmbHQ7YnVuY2ggb2YgZnJhbWV3b3JrIGphcnMmZ3Q7CisgKiAkIG91dC9ob3N0L2xpbnV4LXg4Ni9mcmFtZXdvcmsvYmluL2xheW91dGxpYl9jcmVhdGUgXAorICogICAgICAgIG91dC9ob3N0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvdGVtcF9sYXlvdXRsaWJfaW50ZXJtZWRpYXRlcy9qYXZhbGliLmphciBcCisgKiAgICAgICAgb3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2NvcmVfaW50ZXJtZWRpYXRlcy9jbGFzc2VzLmphciBcCisgKiAgICAgICAgb3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2ZyYW1ld29ya19pbnRlcm1lZGlhdGVzL2NsYXNzZXMuamFyCisgKiA8L3ByZT4KKyAqLwogcHVibGljIGNsYXNzIE1haW4gewogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewpAQCAtNDIsMTIgKzYzLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBc21HZW5lcmF0b3IgYWdlbiA9IG5ldyBBc21HZW5lcmF0b3IobG9nLCBvc0Rlc3RKYXJbMF0sCi0gICAgICAgICAgICAgICAgICAgIENyZWF0ZUluZm8uSU5KRUNURURfQ0xBU1NFUywKLSAgICAgICAgICAgICAgICAgICAgQ3JlYXRlSW5mby5PVkVSUklEREVOX01FVEhPRFMsCi0gICAgICAgICAgICAgICAgICAgIENyZWF0ZUluZm8uUkVOQU1FRF9DTEFTU0VTLAotICAgICAgICAgICAgICAgICAgICBDcmVhdGVJbmZvLlJFTU9WRURfTUVUSE9EUwotICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIEFzbUdlbmVyYXRvciBhZ2VuID0gbmV3IEFzbUdlbmVyYXRvcihsb2csIG9zRGVzdEphclswXSwgbmV3IENyZWF0ZUluZm8oKSk7CiAKICAgICAgICAgICAgIEFzbUFuYWx5emVyIGFhID0gbmV3IEFzbUFuYWx5emVyKGxvZywgb3NKYXJQYXRoLCBhZ2VuLAogICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyAiYW5kcm9pZC52aWV3LlZpZXciIH0sICAgLy8gZGVyaXZlZCBmcm9tCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL3NyYy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL1RyYW5zZm9ybUNsYXNzQWRhcHRlci5qYXZhIGIvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9zcmMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9UcmFuc2Zvcm1DbGFzc0FkYXB0ZXIuamF2YQppbmRleCBlMjk0ZDU2Li5mMmQ5NzU1IDEwMDY0NAotLS0gYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL3NyYy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL1RyYW5zZm9ybUNsYXNzQWRhcHRlci5qYXZhCisrKyBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvVHJhbnNmb3JtQ2xhc3NBZGFwdGVyLmphdmEKQEAgLTI2LDcgKzI2LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiAvKioKLSAqIENsYXNzIGFkYXB0ZXIgdGhhdCBjYW4gc3R1YiBzb21lIG9yIGFsbCBvZiB0aGUgbWV0aG9kcyBvZiB0aGUgY2xhc3MuIAorICogQ2xhc3MgYWRhcHRlciB0aGF0IGNhbiBzdHViIHNvbWUgb3IgYWxsIG9mIHRoZSBtZXRob2RzIG9mIHRoZSBjbGFzcy4KICAqLwogY2xhc3MgVHJhbnNmb3JtQ2xhc3NBZGFwdGVyIGV4dGVuZHMgQ2xhc3NBZGFwdGVyIHsKIApAQCAtNDEsMTIgKzQxLDEyIEBACiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgbmV3IGNsYXNzIGFkYXB0ZXIgdGhhdCB3aWxsIHN0dWIgc29tZSBvciBhbGwgbWV0aG9kcy4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyIAotICAgICAqIEBwYXJhbSBzdHViTWV0aG9kcyAKKyAgICAgKiBAcGFyYW0gbG9nZ2VyCisgICAgICogQHBhcmFtIHN0dWJNZXRob2RzICBsaXN0IG9mIG1ldGhvZCBzaWduYXR1cmVzIHRvIGFsd2F5cyBzdHViIG91dAogICAgICAqIEBwYXJhbSBkZWxldGVSZXR1cm5zIGxpc3Qgb2YgdHlwZXMgdGhhdCB0cmlnZ2VyIHRoZSBkZWxldGlvbiBvZiBtZXRob2RzIHJldHVybmluZyB0aGVtLgogICAgICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIG5hbWUgb2YgdGhlIGNsYXNzIGJlaW5nIG1vZGlmaWVkCiAgICAgICogQHBhcmFtIGN2IFRoZSBwYXJlbnQgY2xhc3Mgd3JpdGVyIHZpc2l0b3IKLSAgICAgKiBAcGFyYW0gc3R1Yk5hdGl2ZXNPbmx5IFRydWUgaWYgb25seSBuYXRpdmUgbWV0aG9kcyBzaG91bGQgYmUgc3R1YmJlZC4gRmFsc2UgaWYgYWxsIAorICAgICAqIEBwYXJhbSBzdHViTmF0aXZlc09ubHkgVHJ1ZSBpZiBvbmx5IG5hdGl2ZSBtZXRob2RzIHNob3VsZCBiZSBzdHViYmVkLiBGYWxzZSBpZiBhbGwKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMgc2hvdWxkIGJlIHN0dWJiZWQuCiAgICAgICogQHBhcmFtIGhhc05hdGl2ZSBUcnVlIGlmIHRoZSBtZXRob2QgaGFzIG5hdGl2ZXMsIGluIHdoaWNoIGNhc2UgaXRzIGFjY2VzcyBzaG91bGQgYmUKICAgICAgKiAgICAgICAgICAgICAgICAgIGNoYW5nZWQuCkBAIC02NywxMCArNjcsMTAgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB2aXNpdChpbnQgdmVyc2lvbiwgaW50IGFjY2VzcywgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlLCBTdHJpbmcgc3VwZXJOYW1lLCBTdHJpbmdbXSBpbnRlcmZhY2VzKSB7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIFRoaXMgY2xhc3MgbWlnaHQgYmUgYmVpbmcgcmVuYW1lZC4KICAgICAgICAgbmFtZSA9IG1DbGFzc05hbWU7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIHJlbW92ZSBwcm90ZWN0ZWQgb3IgcHJpdmF0ZSBhbmQgc2V0IGFzIHB1YmxpYwogICAgICAgICBhY2Nlc3MgPSBhY2Nlc3MgJiB+KE9wY29kZXMuQUNDX1BSSVZBVEUgfCBPcGNvZGVzLkFDQ19QUk9URUNURUQpOwogICAgICAgICBhY2Nlc3MgfD0gT3Bjb2Rlcy5BQ0NfUFVCTElDOwpAQCAtODIsNyArODIsNyBAQAogICAgICAgICBtSXNJbnRlcmZhY2UgPSAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX0lOVEVSRkFDRSkgIT0gMCk7CiAgICAgICAgIHN1cGVyLnZpc2l0KHZlcnNpb24sIGFjY2VzcywgbmFtZSwgc2lnbmF0dXJlLCBzdXBlck5hbWUsIGludGVyZmFjZXMpOwogICAgIH0KLSAgICAKKwogICAgIC8qIFZpc2l0cyB0aGUgaGVhZGVyIG9mIGFuIGlubmVyIGNsYXNzLiAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHZpc2l0SW5uZXJDbGFzcyhTdHJpbmcgbmFtZSwgU3RyaW5nIG91dGVyTmFtZSwgU3RyaW5nIGlubmVyTmFtZSwgaW50IGFjY2VzcykgewpAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE1ldGhvZFZpc2l0b3IgdmlzaXRNZXRob2QoaW50IGFjY2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjLAogICAgICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSwgU3RyaW5nW10gZXhjZXB0aW9ucykgewotICAgICAgICAKKwogICAgICAgICBpZiAobURlbGV0ZVJldHVybnMgIT0gbnVsbCkgewogICAgICAgICAgICAgVHlwZSB0ID0gVHlwZS5nZXRSZXR1cm5UeXBlKGRlc2MpOwogICAgICAgICAgICAgaWYgKHQuZ2V0U29ydCgpID09IFR5cGUuT0JKRUNUKSB7CkBAIC0xMzAsMTYgKzEzMCwxNiBAQAogICAgICAgICAgICAgKG1TdHViQWxsIHx8CiAgICAgICAgICAgICAgKGFjY2VzcyAmIE9wY29kZXMuQUNDX05BVElWRSkgIT0gMCkgfHwKICAgICAgICAgICAgICBtU3R1Yk1ldGhvZHMuY29udGFpbnMobWV0aG9kU2lnbmF0dXJlKSkgewotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGJvb2xlYW4gaXNTdGF0aWMgPSAoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfU1RBVElDKSAhPSAwOwogICAgICAgICAgICAgYm9vbGVhbiBpc05hdGl2ZSA9IChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19OQVRJVkUpICE9IDA7CiAKICAgICAgICAgICAgIC8vIHJlbW92ZSBhYnN0cmFjdCwgZmluYWwgYW5kIG5hdGl2ZQogICAgICAgICAgICAgYWNjZXNzID0gYWNjZXNzICYgfihPcGNvZGVzLkFDQ19BQlNUUkFDVCB8IE9wY29kZXMuQUNDX0ZJTkFMIHwgT3Bjb2Rlcy5BQ0NfTkFUSVZFKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBTdHJpbmcgaW52b2tlU2lnbmF0dXJlID0gbWV0aG9kU2lnbmF0dXJlICsgZGVzYzsKICAgICAgICAgICAgIG1Mb2cuZGVidWcoIiAgU3R1YjogJXMgKCVzKSIsIGludm9rZVNpZ25hdHVyZSwgaXNOYXRpdmUgPyAibmF0aXZlIiA6ICIiKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBNZXRob2RWaXNpdG9yIG13ID0gc3VwZXIudmlzaXRNZXRob2QoYWNjZXNzLCBuYW1lLCBkZXNjLCBzaWduYXR1cmUsIGV4Y2VwdGlvbnMpOwogICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHViTWV0aG9kQWRhcHRlcihtdywgbmFtZSwgcmV0dXJuVHlwZShkZXNjKSwgaW52b2tlU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgICAgICBpc1N0YXRpYywgaXNOYXRpdmUpOwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAgICAgICAgICAgICByZXR1cm4gc3VwZXIudmlzaXRNZXRob2QoYWNjZXNzLCBuYW1lLCBkZXNjLCBzaWduYXR1cmUsIGV4Y2VwdGlvbnMpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyogVmlzaXRzIGEgZmllbGQuIE1ha2VzIGl0IHB1YmxpYy4gKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRmllbGRWaXNpdG9yIHZpc2l0RmllbGQoaW50IGFjY2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjLCBTdHJpbmcgc2lnbmF0dXJlLApAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgICAgIC8vIGNoYW5nZSBhY2Nlc3MgdG8gcHVibGljCiAgICAgICAgIGFjY2VzcyAmPSB+KE9wY29kZXMuQUNDX1BST1RFQ1RFRCB8IE9wY29kZXMuQUNDX1BSSVZBVEUpOwogICAgICAgICBhY2Nlc3MgfD0gT3Bjb2Rlcy5BQ0NfUFVCTElDOwotICAgICAgICAKKwogICAgICAgICByZXR1cm4gc3VwZXIudmlzaXRGaWVsZChhY2Nlc3MsIG5hbWUsIGRlc2MsIHNpZ25hdHVyZSwgdmFsdWUpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS90ZXN0cy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL0FzbUFuYWx5emVyVGVzdC5qYXZhIGIvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS90ZXN0cy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL0FzbUFuYWx5emVyVGVzdC5qYXZhCmluZGV4IDYwMzI4NGUuLmQ2ZGJhNmEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvdGVzdHMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9Bc21BbmFseXplclRlc3QuamF2YQorKysgYi90b29scy9sYXlvdXRsaWIvY3JlYXRlL3Rlc3RzL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvQXNtQW5hbHl6ZXJUZXN0LmphdmEKQEAgLTIyLDcgKzIyLDYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogCiBpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubGF5b3V0bGliLmNyZWF0ZS5Bc21BbmFseXplci5EZXBlbmRlbmN5VmlzaXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC50b29scy5sYXlvdXRsaWIuY3JlYXRlLkxvZ1Rlc3QuTW9ja0xvZzsKIAogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpAQCAtNDYsOSArNDUsOSBAQAogCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1Mb2cgPSBuZXcgTG9nVGVzdC5Nb2NrTG9nKCk7CisgICAgICAgIG1Mb2cgPSBuZXcgTW9ja0xvZygpOwogICAgICAgICBVUkwgdXJsID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoImRhdGEvbW9ja19hbmRyb2lkLmphciIpOwotICAgICAgICAKKwogICAgICAgICBtT3NKYXJQYXRoID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CiAgICAgICAgIG1Pc0phclBhdGguYWRkKHVybC5nZXRGaWxlKCkpOwogCkBAIC02OSw5ICs2OCw5IEBACiAgICAgICAgICAgICAgICAgIm1vY2tfYW5kcm9pZC5kdW1teS5Jbm5lclRlc3QkRGVyaXZpbmdDbGFzcyIsCiAgICAgICAgICAgICAgICAgIm1vY2tfYW5kcm9pZC5kdW1teS5Jbm5lclRlc3QkTXlHZW5lcmljczEiLAogICAgICAgICAgICAgICAgICJtb2NrX2FuZHJvaWQuZHVtbXkuSW5uZXJUZXN0JE15SW50RW51bSIsCi0gICAgICAgICAgICAgICAgIm1vY2tfYW5kcm9pZC5kdW1teS5Jbm5lclRlc3QkTXlTdGF0aWNJbm5lckNsYXNzIiwgICAKLSAgICAgICAgICAgICAgICAibW9ja19hbmRyb2lkLmR1bW15LklubmVyVGVzdCROb3RTdGF0aWNJbm5lcjEiLCAKLSAgICAgICAgICAgICAgICAibW9ja19hbmRyb2lkLmR1bW15LklubmVyVGVzdCROb3RTdGF0aWNJbm5lcjIiLCAgCisgICAgICAgICAgICAgICAgIm1vY2tfYW5kcm9pZC5kdW1teS5Jbm5lclRlc3QkTXlTdGF0aWNJbm5lckNsYXNzIiwKKyAgICAgICAgICAgICAgICAibW9ja19hbmRyb2lkLmR1bW15LklubmVyVGVzdCROb3RTdGF0aWNJbm5lcjEiLAorICAgICAgICAgICAgICAgICJtb2NrX2FuZHJvaWQuZHVtbXkuSW5uZXJUZXN0JE5vdFN0YXRpY0lubmVyMiIsCiAgICAgICAgICAgICAgICAgIm1vY2tfYW5kcm9pZC52aWV3LlZpZXciLAogICAgICAgICAgICAgICAgICJtb2NrX2FuZHJvaWQudmlldy5WaWV3R3JvdXAiLAogICAgICAgICAgICAgICAgICJtb2NrX2FuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zIiwKQEAgLTgzLDcgKzgyLDcgQEAKICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICBtYXAua2V5U2V0KCkudG9BcnJheSgpKTsKICAgICB9Ci0gICAgCisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kQ2xhc3MoKSB0aHJvd3MgSU9FeGNlcHRpb24sIExvZ0Fib3J0RXhjZXB0aW9uIHsKICAgICAgICAgTWFwPFN0cmluZywgQ2xhc3NSZWFkZXI+IHppcENsYXNzZXMgPSBtQWEucGFyc2VaaXAobU9zSmFyUGF0aCk7CkBAIC05MSw3ICs5MCw3IEBACiAKICAgICAgICAgQ2xhc3NSZWFkZXIgY3IgPSBtQWEuZmluZENsYXNzKCJtb2NrX2FuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zIiwKICAgICAgICAgICAgICAgICB6aXBDbGFzc2VzLCBmb3VuZCk7Ci0gICAgICAgIAorCiAgICAgICAgIGFzc2VydE5vdE51bGwoY3IpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIm1vY2tfYW5kcm9pZC92aWV3L1ZpZXdHcm91cCRMYXlvdXRQYXJhbXMiLCBjci5nZXRDbGFzc05hbWUoKSk7CiAgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJtb2NrX2FuZHJvaWQudmlldy5WaWV3R3JvdXAkTGF5b3V0UGFyYW1zIiB9LApAQCAtMTcyLDE0ICsxNzEsMTQgQEAKICAgICAgICAgICAgICAgICAibW9ja19hbmRyb2lkLndpZGdldC5UYWJsZUxheW91dCIsCiAgICAgICAgICAgICB9LAogICAgICAgICAgICAgZm91bmQua2V5U2V0KCkudG9BcnJheSgpKTsKLSAgICAgICAgCisKICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogZm91bmQua2V5U2V0KCkpIHsKICAgICAgICAgICAgIENsYXNzUmVhZGVyIHZhbHVlID0gZm91bmQuZ2V0KGtleSk7CiAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJObyB2YWx1ZSBmb3IgIiArIGtleSwgdmFsdWUpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGtleSwgQXNtQW5hbHl6ZXIuY2xhc3NSZWFkZXJUb0NsYXNzTmFtZSh2YWx1ZSkpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVwZW5kZW5jeVZpc2l0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24sIExvZ0Fib3J0RXhjZXB0aW9uIHsKICAgICAgICAgTWFwPFN0cmluZywgQ2xhc3NSZWFkZXI+IHppcENsYXNzZXMgPSBtQWEucGFyc2VaaXAobU9zSmFyUGF0aCk7CkBAIC0xOTAsNyArMTg5LDcgQEAKIAogICAgICAgICBDbGFzc1JlYWRlciBjciA9IG1BYS5maW5kQ2xhc3MoIm1vY2tfYW5kcm9pZC53aWRnZXQuVGFibGVMYXlvdXQiLCB6aXBDbGFzc2VzLCBrZWVwKTsKICAgICAgICAgRGVwZW5kZW5jeVZpc2l0b3IgdmlzaXRvciA9IG1BYS5nZXRWaXNpdG9yKHppcENsYXNzZXMsIGtlZXAsIG5ld19rZWVwLCBpbl9kZXBzLCBvdXRfZGVwcyk7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIGdldCBmaXJzdCBsZXZlbCBkZXBlbmRlbmNpZXMKICAgICAgICAgY3IuYWNjZXB0KHZpc2l0b3IsIDAgLyogZmxhZ3MgKi8pOwogCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL3Rlc3RzL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvQXNtR2VuZXJhdG9yVGVzdC5qYXZhIGIvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS90ZXN0cy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL0FzbUdlbmVyYXRvclRlc3QuamF2YQppbmRleCA3Y2RmNzlhLi5mNGZmMzg5IDEwMDY0NAotLS0gYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL3Rlc3RzL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvQXNtR2VuZXJhdG9yVGVzdC5qYXZhCisrKyBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvdGVzdHMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9Bc21HZW5lcmF0b3JUZXN0LmphdmEKQEAgLTIwLDggKzIwLDYgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwogCi1pbXBvcnQgY29tLmFuZHJvaWQudG9vbHMubGF5b3V0bGliLmNyZWF0ZS5Mb2dUZXN0Lk1vY2tMb2c7Ci0KIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTQ0LDkgKzQyLDkgQEAKIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtTG9nID0gbmV3IExvZ1Rlc3QuTW9ja0xvZygpOworICAgICAgICBtTG9nID0gbmV3IE1vY2tMb2coKTsKICAgICAgICAgVVJMIHVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJkYXRhL21vY2tfYW5kcm9pZC5qYXIiKTsKLSAgICAgICAgCisKICAgICAgICAgbU9zSmFyUGF0aCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwogICAgICAgICBtT3NKYXJQYXRoLmFkZCh1cmwuZ2V0RmlsZSgpKTsKIApAQCAtNjUsMTYgKzYzLDQxIEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc1JlbmFtaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBMb2dBYm9ydEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBBc21HZW5lcmF0b3IgYWdlbiA9IG5ldyBBc21HZW5lcmF0b3IobUxvZywgbU9zRGVzdEphciwKLSAgICAgICAgICAgIG51bGwsIC8vIGNsYXNzZXMgdG8gaW5qZWN0IGluIHRoZSBmaW5hbCBKQVIKLSAgICAgICAgICAgIG51bGwsICAvLyBtZXRob2RzIHRvIGZvcmNlIG92ZXJyaWRlCi0gICAgICAgICAgICBuZXcgU3RyaW5nW10geyAgLy8gY2xhc3NlcyB0byByZW5hbWUgKHNvIHRoYXQgd2UgY2FuIHJlcGxhY2UgdGhlbSkKLSAgICAgICAgICAgICAgICAibW9ja19hbmRyb2lkLnZpZXcuVmlldyIsICJtb2NrX2FuZHJvaWQudmlldy5fT3JpZ2luYWxfVmlldyIsCi0gICAgICAgICAgICAgICAgIm5vdC5hbi5hY3R1YWwuQ2xhc3NOYW1lIiwgImFub3Rlci5mYWtlLk5ld0NsYXNzTmFtZSIsCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgbnVsbCAvLyBtZXRob2RzIGRlbGV0ZWQgZnJvbSB0aGVpciByZXR1cm4gdHlwZS4KLSAgICAgICAgICAgICk7CisKKyAgICAgICAgSUNyZWF0ZUluZm8gY2kgPSBuZXcgSUNyZWF0ZUluZm8oKSB7CisgICAgICAgICAgICBwdWJsaWMgQ2xhc3M8Pz5bXSBnZXRJbmplY3RlZENsYXNzZXMoKSB7CisgICAgICAgICAgICAgICAgLy8gY2xhc3NlcyB0byBpbmplY3QgaW4gdGhlIGZpbmFsIEpBUgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3M8Pz5bMF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREZWxlZ2F0ZU1ldGhvZHMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREZWxlZ2F0ZUNsYXNzTmF0aXZlcygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldE92ZXJyaWRkZW5NZXRob2RzKCkgeworICAgICAgICAgICAgICAgIC8vIG1ldGhvZHMgdG8gZm9yY2Ugb3ZlcnJpZGUKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFJlbmFtZWRDbGFzc2VzKCkgeworICAgICAgICAgICAgICAgIC8vIGNsYXNzZXMgdG8gcmVuYW1lIChzbyB0aGF0IHdlIGNhbiByZXBsYWNlIHRoZW0pCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAibW9ja19hbmRyb2lkLnZpZXcuVmlldyIsICJtb2NrX2FuZHJvaWQudmlldy5fT3JpZ2luYWxfVmlldyIsCisgICAgICAgICAgICAgICAgICAgICAgICAibm90LmFuLmFjdHVhbC5DbGFzc05hbWUiLCAiYW5vdGVyLmZha2UuTmV3Q2xhc3NOYW1lIiwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RGVsZXRlUmV0dXJucygpIHsKKyAgICAgICAgICAgICAgICAgLy8gbWV0aG9kcyBkZWxldGVkIGZyb20gdGhlaXIgcmV0dXJuIHR5cGUuCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgQXNtR2VuZXJhdG9yIGFnZW4gPSBuZXcgQXNtR2VuZXJhdG9yKG1Mb2csIG1Pc0Rlc3RKYXIsIGNpKTsKIAogICAgICAgICBBc21BbmFseXplciBhYSA9IG5ldyBBc21BbmFseXplcihtTG9nLCBtT3NKYXJQYXRoLCBhZ2VuLAogICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAvLyBkZXJpdmVkIGZyb20KQEAgLTgzLDcgKzEwNiw3IEBACiAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgIGFhLmFuYWx5emUoKTsKICAgICAgICAgYWdlbi5nZW5lcmF0ZSgpOwotICAgICAgICAKKwogICAgICAgICBTZXQ8U3RyaW5nPiBub3RSZW5hbWVkID0gYWdlbi5nZXRDbGFzc2VzTm90UmVuYW1lZCgpOwogICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgU3RyaW5nW10geyAibm90L2FuL2FjdHVhbC9DbGFzc05hbWUiIH0sIG5vdFJlbmFtZWQudG9BcnJheSgpKTsKICAgICB9CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL3Rlc3RzL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvQ2xhc3NIYXNOYXRpdmVWaXNpdG9yVGVzdC5qYXZhIGIvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS90ZXN0cy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL0NsYXNzSGFzTmF0aXZlVmlzaXRvclRlc3QuamF2YQppbmRleCBkNjkxNmFlLi4wMTM1YzQwIDEwMDY0NAotLS0gYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL3Rlc3RzL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvQ2xhc3NIYXNOYXRpdmVWaXNpdG9yVGVzdC5qYXZhCisrKyBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvdGVzdHMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9DbGFzc0hhc05hdGl2ZVZpc2l0b3JUZXN0LmphdmEKQEAgLTMzLDggKzMzLDkgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNOYXRpdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBNb2NrQ2xhc3NIYXNOYXRpdmVWaXNpdG9yIGN2ID0gbmV3IE1vY2tDbGFzc0hhc05hdGl2ZVZpc2l0b3IoKTsKLSAgICAgICAgQ2xhc3NSZWFkZXIgY3IgPSBuZXcgQ2xhc3NSZWFkZXIoCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnRvb2xzLmxheW91dGxpYi5jcmVhdGUuQ2xhc3NIYXNOYXRpdmVWaXNpdG9yVGVzdCRDbGFzc1dpdGhOYXRpdmUiKTsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9CisgICAgICAgICAgICAgICAgdGhpcy5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSArICIkIiArIENsYXNzV2l0aE5hdGl2ZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgIENsYXNzUmVhZGVyIGNyID0gbmV3IENsYXNzUmVhZGVyKGNsYXNzTmFtZSk7CiAKICAgICAgICAgY3IuYWNjZXB0KGN2LCAwIC8qIGZsYWdzICovKTsKICAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsgIm5hdGl2ZV9tZXRob2QiIH0sIGN2LmdldE1ldGhvZHNGb3VuZCgpKTsKQEAgLTQ0LDE0ICs0NSwxNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEhhc05vTmF0aXZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgTW9ja0NsYXNzSGFzTmF0aXZlVmlzaXRvciBjdiA9IG5ldyBNb2NrQ2xhc3NIYXNOYXRpdmVWaXNpdG9yKCk7Ci0gICAgICAgIENsYXNzUmVhZGVyIGNyID0gbmV3IENsYXNzUmVhZGVyKAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC50b29scy5sYXlvdXRsaWIuY3JlYXRlLkNsYXNzSGFzTmF0aXZlVmlzaXRvclRlc3QkQ2xhc3NXaXRob3V0TmF0aXZlIik7CisgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPQorICAgICAgICAgICAgdGhpcy5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSArICIkIiArIENsYXNzV2l0aG91dE5hdGl2ZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgIENsYXNzUmVhZGVyIGNyID0gbmV3IENsYXNzUmVhZGVyKGNsYXNzTmFtZSk7CiAKICAgICAgICAgY3IuYWNjZXB0KGN2LCAwIC8qIGZsYWdzICovKTsKICAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1swXSwgY3YuZ2V0TWV0aG9kc0ZvdW5kKCkpOwogICAgICAgICBhc3NlcnRGYWxzZShjdi5oYXNOYXRpdmVNZXRob2RzKCkpOwogICAgIH0KIAorICAgIC8vLS0tLS0tLQorCiAgICAgLyoqCiAgICAgICogT3ZlcnJpZGVzIHtAbGluayBDbGFzc0hhc05hdGl2ZVZpc2l0b3J9IHRvIGNvbGxlYyB0aGUgbmFtZSBvZiB0aGUgbmF0aXZlIG1ldGhvZHMgZm91bmQuCiAgICAgICovCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL3Rlc3RzL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvRGVsZWdhdGVDbGFzc0FkYXB0ZXJUZXN0LmphdmEgYi90b29scy9sYXlvdXRsaWIvY3JlYXRlL3Rlc3RzL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvRGVsZWdhdGVDbGFzc0FkYXB0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFkMmU2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvdGVzdHMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9EZWxlZ2F0ZUNsYXNzQWRhcHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudG9vbHMubGF5b3V0bGliLmNyZWF0ZTsKKworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzUmVhZGVyOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzV3JpdGVyOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLnV0aWwuVHJhY2VDbGFzc1Zpc2l0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKworcHVibGljIGNsYXNzIERlbGVnYXRlQ2xhc3NBZGFwdGVyVGVzdCB7CisKKyAgICBwcml2YXRlIE1vY2tMb2cgbUxvZzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FID0KKyAgICAgICAgRGVsZWdhdGVDbGFzc0FkYXB0ZXJUZXN0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSArICIkIiArCisgICAgICAgIENsYXNzV2l0aE5hdGl2ZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbUxvZyA9IG5ldyBNb2NrTG9nKCk7CisgICAgICAgIG1Mb2cuc2V0VmVyYm9zZSh0cnVlKTsgLy8gY2FwdHVyZSBkZWJ1ZyBlcnJvciB0b28KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IGEgY2xhc3Mgbm90IGJlaW5nIG1vZGlmaWVkIHN0aWxsIHdvcmtzLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vT3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyB0aGF0IHdpbGwgYmUgbW9kaWZpZWQKKyAgICAgICAgLy8gKGxvYWQgdGhlIGNsYXNzIGluIGEgZGlzdGluY3QgY2xhc3MgbG9hZGVyIHNvIHRoYXQgd2UgY2FuIHRyYXNoIGl0cyBkZWZpbml0aW9uIGxhdGVyKQorICAgICAgICBDbGFzc0xvYWRlciBjbDEgPSBuZXcgQ2xhc3NMb2FkZXIodGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpIHsgfTsKKyAgICAgICAgQ2xhc3M8Q2xhc3NXaXRoTmF0aXZlPiBjbGF6ejEgPSAoQ2xhc3M8Q2xhc3NXaXRoTmF0aXZlPikgY2wxLmxvYWRDbGFzcyhDTEFTU19OQU1FKTsKKyAgICAgICAgQ2xhc3NXaXRoTmF0aXZlIGluc3RhbmNlMSA9IGNsYXp6MS5uZXdJbnN0YW5jZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDIsIGluc3RhbmNlMS5hZGQoMjAsIDIyKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnN0YW5jZTEuY2FsbE5hdGl2ZUluc3RhbmNlKDEwLCAzLjE0MTUsIG5ldyBPYmplY3RbMF0gKTsKKyAgICAgICAgICAgIGZhaWwoIlRlc3Qgc2hvdWxkIGhhdmUgZmFpbGVkIHRvIGludm9rZSBjYWxsVGhlTmF0aXZlTWV0aG9kIFsxXSIpOworICAgICAgICB9IGNhdGNoIChVbnNhdGlzZmllZExpbmtFcnJvciBlKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGV4cGVjdGVkIHRvIGZhaWwgc2luY2UgdGhlIG5hdGl2ZSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLgorICAgICAgICB9CisKKyAgICAgICAgLy8gTm93IHByb2Nlc3MgaXQgYnV0IHRlbGwgdGhlIGRlbGVnYXRlIHRvIG5vdCBtb2RpZnkgYW55IG1ldGhvZAorICAgICAgICBDbGFzc1dyaXRlciBjdyA9IG5ldyBDbGFzc1dyaXRlcigwIC8qZmxhZ3MqLyk7CisKKyAgICAgICAgSGFzaFNldDxTdHJpbmc+IGRlbGVnYXRlTWV0aG9kcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgU3RyaW5nIGludGVybmFsQ2xhc3NOYW1lID0gQ0xBU1NfTkFNRS5yZXBsYWNlKCcuJywgJy8nKTsKKyAgICAgICAgRGVsZWdhdGVDbGFzc0FkYXB0ZXIgY3YgPSBuZXcgRGVsZWdhdGVDbGFzc0FkYXB0ZXIoCisgICAgICAgICAgICAgICAgbUxvZywgY3csIGludGVybmFsQ2xhc3NOYW1lLCBkZWxlZ2F0ZU1ldGhvZHMpOworCisgICAgICAgIENsYXNzUmVhZGVyIGNyID0gbmV3IENsYXNzUmVhZGVyKENMQVNTX05BTUUpOworICAgICAgICBjci5hY2NlcHQoY3YsIDAgLyogZmxhZ3MgKi8pOworCisgICAgICAgIC8vIExvYWQgdGhlIGdlbmVyYXRlZCBjbGFzcyBpbiBhIGRpZmZlcmVudCBjbGFzcyBsb2FkZXIgYW5kIHRyeSBpdCBhZ2FpbgorICAgICAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSBjdy50b0J5dGVBcnJheSgpOworCisgICAgICAgIENsYXNzTG9hZGVyMiBjbDIgPSBuZXcgQ2xhc3NMb2FkZXIyKGJ5dGVzKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RpZmllZEluc3RhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gY2xhenoyID0gbG9hZENsYXNzKENMQVNTX05BTUUpOworICAgICAgICAgICAgICAgIE9iamVjdCBpMiA9IGNsYXp6Mi5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaTIpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyg0MiwgY2FsbEFkZChpMiwgMjAsIDIyKSk7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjYWxsQ2FsbE5hdGl2ZUluc3RhbmNlKGkyLCAxMCwgMy4xNDE1LCBuZXcgT2JqZWN0WzBdKTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiVGVzdCBzaG91bGQgaGF2ZSBmYWlsZWQgdG8gaW52b2tlIGNhbGxUaGVOYXRpdmVNZXRob2QgWzJdIik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgZXhwZWN0ZWQgdG8gZmFpbCBzaW5jZSB0aGUgbmF0aXZlIG1ldGhvZCBoYXMgTk9UIGJlZW4KKyAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGRlbiBoZXJlLgorICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVW5zYXRpc2ZpZWRMaW5rRXJyb3IuY2xhc3MsIGUuZ2V0Q2F1c2UoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBuYXRpdmUgbWV0aG9kIGRvZXMgTk9UIGhhdmUgdGhlIG5ldyBhbm5vdGF0aW9uCisgICAgICAgICAgICAgICAgTWV0aG9kW10gbSA9IGNsYXp6Mi5nZXREZWNsYXJlZE1ldGhvZHMoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm5hdGl2ZV9pbnN0YW5jZSIsIG1bMl0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKE1vZGlmaWVyLmlzTmF0aXZlKG1bMl0uZ2V0TW9kaWZpZXJzKCkpKTsKKyAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYSA9IG1bMl0uZ2V0QW5ub3RhdGlvbnMoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBjbDIudGVzdE1vZGlmaWVkSW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgRGVsZWdhdGVNZXRob2RBZGFwdGVyfSBkb2VzIG5vdCBzdXBwb3J0IG92ZXJyaWRpbmcgY29uc3RydWN0b3JzIHlldCwKKyAgICAgKiBzbyB0aGlzIHNob3VsZCBmYWlsIHdpdGggYW4ge0BsaW5rIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4KKyAgICAgKgorICAgICAqIEFsdGhvdWdoIG5vdCB0ZXN0ZWQgaGVyZSwgdGhlIG1lc3NhZ2Ugb2YgdGhlIGV4Y2VwdGlvbiBzaG91bGQgY29udGFpbiB0aGUKKyAgICAgKiBjb25zdHJ1Y3RvciBzaWduYXR1cmUuCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQ9VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yc05vdFN1cHBvcnRlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzV3JpdGVyIGN3ID0gbmV3IENsYXNzV3JpdGVyKDAgLypmbGFncyovKTsKKworICAgICAgICBTdHJpbmcgaW50ZXJuYWxDbGFzc05hbWUgPSBDTEFTU19OQU1FLnJlcGxhY2UoJy4nLCAnLycpOworCisgICAgICAgIEhhc2hTZXQ8U3RyaW5nPiBkZWxlZ2F0ZU1ldGhvZHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIGRlbGVnYXRlTWV0aG9kcy5hZGQoIjxpbml0PiIpOworICAgICAgICBEZWxlZ2F0ZUNsYXNzQWRhcHRlciBjdiA9IG5ldyBEZWxlZ2F0ZUNsYXNzQWRhcHRlcigKKyAgICAgICAgICAgICAgICBtTG9nLCBjdywgaW50ZXJuYWxDbGFzc05hbWUsIGRlbGVnYXRlTWV0aG9kcyk7CisKKyAgICAgICAgQ2xhc3NSZWFkZXIgY3IgPSBuZXcgQ2xhc3NSZWFkZXIoQ0xBU1NfTkFNRSk7CisgICAgICAgIGNyLmFjY2VwdChjdiwgMCAvKiBmbGFncyAqLyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZWdhdGVOYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NXcml0ZXIgY3cgPSBuZXcgQ2xhc3NXcml0ZXIoMCAvKmZsYWdzKi8pOworICAgICAgICBTdHJpbmcgaW50ZXJuYWxDbGFzc05hbWUgPSBDTEFTU19OQU1FLnJlcGxhY2UoJy4nLCAnLycpOworCisgICAgICAgIEhhc2hTZXQ8U3RyaW5nPiBkZWxlZ2F0ZU1ldGhvZHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIGRlbGVnYXRlTWV0aG9kcy5hZGQoRGVsZWdhdGVDbGFzc0FkYXB0ZXIuQUxMX05BVElWRVMpOworICAgICAgICBEZWxlZ2F0ZUNsYXNzQWRhcHRlciBjdiA9IG5ldyBEZWxlZ2F0ZUNsYXNzQWRhcHRlcigKKyAgICAgICAgICAgICAgICBtTG9nLCBjdywgaW50ZXJuYWxDbGFzc05hbWUsIGRlbGVnYXRlTWV0aG9kcyk7CisKKyAgICAgICAgQ2xhc3NSZWFkZXIgY3IgPSBuZXcgQ2xhc3NSZWFkZXIoQ0xBU1NfTkFNRSk7CisgICAgICAgIGNyLmFjY2VwdChjdiwgMCAvKiBmbGFncyAqLyk7CisKKyAgICAgICAgLy8gTG9hZCB0aGUgZ2VuZXJhdGVkIGNsYXNzIGluIGEgZGlmZmVyZW50IGNsYXNzIGxvYWRlciBhbmQgdHJ5IGl0CisgICAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IGN3LnRvQnl0ZUFycmF5KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzTG9hZGVyMiBjbDIgPSBuZXcgQ2xhc3NMb2FkZXIyKGJ5dGVzKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdE1vZGlmaWVkSW5zdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gY2xhenoyID0gbG9hZENsYXNzKENMQVNTX05BTUUpOworICAgICAgICAgICAgICAgICAgICBPYmplY3QgaTIgPSBjbGF6ejIubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChpMik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHJlZmxlY3Rpb24gdG8gYWNjZXNzIGlubmVyIG1ldGhvZHMKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQyLCBjYWxsQWRkKGkyLCAyMCwgMjIpKTsKKworICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gb2JqUmVzdWx0ID0gbmV3IE9iamVjdFtdIHsgbnVsbCB9OworICAgICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IGNhbGxDYWxsTmF0aXZlSW5zdGFuY2UoaTIsIDEwLCAzLjE0MTUsIG9ialJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoKGludCkoMTAgKyAzLjE0MTUpLCByZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0U2FtZShpMiwgb2JqUmVzdWx0WzBdKTsKKworICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgbmF0aXZlIG1ldGhvZCBub3cgaGFzIHRoZSBuZXcgYW5ub3RhdGlvbiBhbmQgaXMgbm90IG5hdGl2ZQorICAgICAgICAgICAgICAgICAgICAgTWV0aG9kW10gbSA9IGNsYXp6Mi5nZXREZWNsYXJlZE1ldGhvZHMoKTsKKyAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygibmF0aXZlX2luc3RhbmNlIiwgbVsyXS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoTW9kaWZpZXIuaXNOYXRpdmUobVsyXS5nZXRNb2RpZmllcnMoKSkpOworICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGEgPSBtWzJdLmdldEFubm90YXRpb25zKCk7CisgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkxheW91dGxpYkRlbGVnYXRlIiwgYVswXS5hbm5vdGF0aW9uVHlwZSgpLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNsMi50ZXN0TW9kaWZpZWRJbnN0YW5jZSgpOworCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAvLyBGb3IgZGVidWdnaW5nLCBkdW1wIHRoZSBieXRlY29kZSBvZiB0aGUgY2xhc3MgaW4gY2FzZSBvZiB1bmV4cGVjdGVkIGVycm9yLgorICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOworICAgICAgICAgICAgVHJhY2VDbGFzc1Zpc2l0b3IgdGN2ID0gbmV3IFRyYWNlQ2xhc3NWaXNpdG9yKHB3KTsKKworICAgICAgICAgICAgQ2xhc3NSZWFkZXIgY3IyID0gbmV3IENsYXNzUmVhZGVyKGJ5dGVzKTsKKyAgICAgICAgICAgIGNyMi5hY2NlcHQodGN2LCAwIC8qIGZsYWdzICovKTsKKworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJcbiIgKyB0LmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpOworICAgICAgICAgICAgaWYgKHQuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtc2cgKz0gIjogIiArIHQuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNnID0gbXNnICsgIlxuQnl0ZWNvZGUgZHVtcDpcbiIgKyBzdy50b1N0cmluZygpOworCisgICAgICAgICAgICAvLyBSZS10aHJvdyBleGNlcHRpb24gd2l0aCBuZXcgbWVzc2FnZQorICAgICAgICAgICAgUnVudGltZUV4Y2VwdGlvbiBleCA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1zZywgdCk7CisgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLS0tLS0tLQorCisgICAgLyoqCisgICAgICogQSBjbGFzcyBsb2FkZXIgdGhhbiBjYW4gZGVmaW5lIGFuZCBpbnN0YW50aWF0ZSBvdXIgZHVtbXkge0BsaW5rIENsYXNzV2l0aE5hdGl2ZX0uCisgICAgICogPHAvPgorICAgICAqIFRoZSB0cmljayBoZXJlIGlzIHRoYXQgdGhpcyBjbGFzcyBsb2FkZXIgd2lsbCB0ZXN0IG91ciBtb2RpZmllZCB2ZXJzaW9uIG9mIENsYXNzV2l0aE5hdGl2ZS4KKyAgICAgKiBUcnlpbmcgdG8gZG8gc28gaW4gdGhlIG9yaWdpbmFsIGNsYXNzIGxvYWRlciBnZW5lcmF0ZXMgYWxsIHNvcnQgb2YgbGluayBpc3N1ZXMgYmVjYXVzZQorICAgICAqIHRoZXJlIGFyZSAyIGRpZmZlcmVudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBjbGFzcyBuYW1lLiBUaGlzIGNsYXNzIGxvYWRlciB3aWxsCisgICAgICogZGVmaW5lIGFuZCBsb2FkIHRoZSBjbGFzcyB3aGVuIHJlcXVlc3RlZCBieSBuYW1lIGFuZCBwcm92aWRlIGhlbHBlcnMgdG8gYWNjZXNzIHRoZQorICAgICAqIGluc3RhbmNlIG1ldGhvZHMgdmlhIHJlZmxlY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBDbGFzc0xvYWRlcjIgZXh0ZW5kcyBDbGFzc0xvYWRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIG1DbGFzc1dpdGhOYXRpdmU7CisKKyAgICAgICAgcHVibGljIENsYXNzTG9hZGVyMihieXRlW10gY2xhc3NXaXRoTmF0aXZlKSB7CisgICAgICAgICAgICBzdXBlcihudWxsKTsKKyAgICAgICAgICAgIG1DbGFzc1dpdGhOYXRpdmUgPSBjbGFzc1dpdGhOYXRpdmU7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDbGFzczw/PiBmaW5kQ2xhc3MoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmZpbmRDbGFzcyhuYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAgICAgaWYgKENMQVNTX05BTUUuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIExvYWQgdGhlIG1vZGlmaWVkIENsYXNzV2l0aE5hdGl2ZSBmcm9tIGl0cyBieXRlcyByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZUNsYXNzKENMQVNTX05BTUUsIG1DbGFzc1dpdGhOYXRpdmUsIDAsIG1DbGFzc1dpdGhOYXRpdmUubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBMb2FkIGV2ZXJ5dGhpbmcgZWxzZSBmcm9tIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uIGludG8gdGhlIG5ldyBjbGFzcyBsb2FkZXIuCisgICAgICAgICAgICAgICAgICAgIENsYXNzUmVhZGVyIGNyID0gbmV3IENsYXNzUmVhZGVyKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBDbGFzc1dyaXRlciBjdyA9IG5ldyBDbGFzc1dyaXRlcigwKTsKKyAgICAgICAgICAgICAgICAgICAgY3IuYWNjZXB0KGN3LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gY3cudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZUNsYXNzKG5hbWUsIGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOworCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlvZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFjY2Vzc2VzIHtAbGluayBDbGFzc1dpdGhOYXRpdmUjYWRkKGludCwgaW50KX0gdmlhIHJlZmxlY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGNhbGxBZGQoT2JqZWN0IGluc3RhbmNlLCBpbnQgYSwgaW50IGIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgTWV0aG9kIG0gPSBpbnN0YW5jZS5nZXRDbGFzcygpLmdldE1ldGhvZCgiYWRkIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzPD8+W10geyBpbnQuY2xhc3MsIGludC5jbGFzcyB9KTsKKworICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG0uaW52b2tlKGluc3RhbmNlLCBuZXcgT2JqZWN0W10geyBhLCBiIH0pOworICAgICAgICAgICAgcmV0dXJuICgoSW50ZWdlcikgcmVzdWx0KS5pbnRWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFjY2Vzc2VzIHtAbGluayBDbGFzc1dpdGhOYXRpdmUjY2FsbE5hdGl2ZUluc3RhbmNlKGludCwgZG91YmxlLCBPYmplY3RbXSl9CisgICAgICAgICAqIHZpYSByZWZsZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBjYWxsQ2FsbE5hdGl2ZUluc3RhbmNlKE9iamVjdCBpbnN0YW5jZSwgaW50IGEsIGRvdWJsZSBkLCBPYmplY3RbXSBvKQorICAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgTWV0aG9kIG0gPSBpbnN0YW5jZS5nZXRDbGFzcygpLmdldE1ldGhvZCgiY2FsbE5hdGl2ZUluc3RhbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzPD8+W10geyBpbnQuY2xhc3MsIGRvdWJsZS5jbGFzcywgT2JqZWN0W10uY2xhc3MgfSk7CisKKyAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBtLmludm9rZShpbnN0YW5jZSwgbmV3IE9iamVjdFtdIHsgYSwgZCwgbyB9KTsKKyAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIpIHJlc3VsdCkuaW50VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRlc3RNb2RpZmllZEluc3RhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEdW1teSB0ZXN0IGNsYXNzIHdpdGggYSBuYXRpdmUgbWV0aG9kLgorICAgICAqIFRoZSBuYXRpdmUgbWV0aG9kIGlzIG5vdCBkZWZpbmVkIGFuZCBhbnkgYXR0ZW1wdCB0byBpbnZva2UgaXQgd2lsbAorICAgICAqIHRocm93IGFuIHtAbGluayBVbnNhdGlzZmllZExpbmtFcnJvcn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbGFzc1dpdGhOYXRpdmUgeworICAgICAgICBwdWJsaWMgQ2xhc3NXaXRoTmF0aXZlKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGQoaW50IGEsIGludCBiKSB7CisgICAgICAgICAgICByZXR1cm4gYSArIGI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGNhbGxOYXRpdmVJbnN0YW5jZShpbnQgYSwgZG91YmxlIGQsIE9iamVjdFtdIG8pIHsKKyAgICAgICAgICAgIHJldHVybiBuYXRpdmVfaW5zdGFuY2UoYSwgZCwgbyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX2luc3RhbmNlKGludCBhLCBkb3VibGUgZCwgT2JqZWN0W10gbyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlbGVnYXRlIHRoYXQgcmVjZWl2ZXMgdGhlIGNhbGwgdG8ge0BsaW5rIENsYXNzV2l0aE5hdGl2ZX0ncyBvdmVycmlkZGVuIG1ldGhvZHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbGFzc1dpdGhOYXRpdmVfRGVsZWdhdGUgeworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBuYXRpdmVfaW5zdGFuY2UoQ2xhc3NXaXRoTmF0aXZlIGluc3RhbmNlLCBpbnQgYSwgZG91YmxlIGQsIE9iamVjdFtdIG8pIHsKKyAgICAgICAgICAgIGlmIChvICE9IG51bGwgJiYgby5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgb1swXSA9IGluc3RhbmNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChpbnQpKGEgKyBkKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvdGVzdHMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9Mb2dUZXN0LmphdmEgYi90b29scy9sYXlvdXRsaWIvY3JlYXRlL3Rlc3RzL2NvbS9hbmRyb2lkL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvTG9nVGVzdC5qYXZhCmluZGV4IDNmMTMxNTguLjFhNWY2NTMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvdGVzdHMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9Mb2dUZXN0LmphdmEKKysrIGIvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS90ZXN0cy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL0xvZ1Rlc3QuamF2YQpAQCAtMjQsMzMgKzI0LDggQEAKIAogcHVibGljIGNsYXNzIExvZ1Rlc3QgewogCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNb2NrTG9nIGV4dGVuZHMgTG9nIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBtT3V0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBtRXJyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1PdXQudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRFcnIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUVyci50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb3V0UHJpbnRsbihTdHJpbmcgbXNnKSB7Ci0gICAgICAgICAgICBtT3V0LmFwcGVuZChtc2cpOwotICAgICAgICAgICAgbU91dC5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBlcnJQcmludGxuKFN0cmluZyBtc2cpIHsKLSAgICAgICAgICAgIG1FcnIuYXBwZW5kKG1zZyk7Ci0gICAgICAgICAgICBtRXJyLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHByaXZhdGUgTW9ja0xvZyBtTG9nOwotICAgIAorCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIG1Mb2cgPSBuZXcgTW9ja0xvZygpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS90ZXN0cy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL01vY2tMb2cuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvdGVzdHMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9Nb2NrTG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU3NTBhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xheW91dGxpYi9jcmVhdGUvdGVzdHMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9Nb2NrTG9nLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudG9vbHMubGF5b3V0bGliLmNyZWF0ZTsKKworCitwdWJsaWMgY2xhc3MgTW9ja0xvZyBleHRlbmRzIExvZyB7CisgICAgU3RyaW5nQnVpbGRlciBtT3V0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBTdHJpbmdCdWlsZGVyIG1FcnIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgcHVibGljIFN0cmluZyBnZXRPdXQoKSB7CisgICAgICAgIHJldHVybiBtT3V0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRFcnIoKSB7CisgICAgICAgIHJldHVybiBtRXJyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb3V0UHJpbnRsbihTdHJpbmcgbXNnKSB7CisgICAgICAgIG1PdXQuYXBwZW5kKG1zZyk7CisgICAgICAgIG1PdXQuYXBwZW5kKCdcbicpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVyclByaW50bG4oU3RyaW5nIG1zZykgeworICAgICAgICBtRXJyLmFwcGVuZChtc2cpOworICAgICAgICBtRXJyLmFwcGVuZCgnXG4nKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS92b2lwL2phdmEvYW5kcm9pZC9uZXQvc2lwL1NpcEF1ZGlvQ2FsbC5qYXZhIGIvdm9pcC9qYXZhL2FuZHJvaWQvbmV0L3NpcC9TaXBBdWRpb0NhbGwuamF2YQppbmRleCBjMjNkYTIwLi43YzEyMzRhIDEwMDY0NAotLS0gYS92b2lwL2phdmEvYW5kcm9pZC9uZXQvc2lwL1NpcEF1ZGlvQ2FsbC5qYXZhCisrKyBiL3ZvaXAvamF2YS9hbmRyb2lkL25ldC9zaXAvU2lwQXVkaW9DYWxsLmphdmEKQEAgLTcxNyw2ICs3MTcsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBncmFiV2lmaUhpZ2hQZXJmTG9jaygpIHsKKyAgICAgICAgLyogbm90IGF2YWlsYWJsZSBpbiBtYXN0ZXIgeWV0CiAgICAgICAgIGlmIChtV2lmaUhpZ2hQZXJmTG9jayA9PSBudWxsKSB7CiAgICAgICAgICAgICBMb2cudihUQUcsICJhY3F1aXJlIHdpZmkgaGlnaCBwZXJmIGxvY2siKTsKICAgICAgICAgICAgIG1XaWZpSGlnaFBlcmZMb2NrID0gKChXaWZpTWFuYWdlcikKQEAgLTcyNCw2ICs3MjUsNyBAQAogICAgICAgICAgICAgICAgICAgICAuY3JlYXRlV2lmaUxvY2soV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTExfSElHSF9QRVJGLCBUQUcpOwogICAgICAgICAgICAgbVdpZmlIaWdoUGVyZkxvY2suYWNxdWlyZSgpOwogICAgICAgICB9CisgICAgICAgICovCiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VXaWZpSGlnaFBlcmZMb2NrKCkgewpkaWZmIC0tZ2l0IGEvdm9pcC9qbmkvcnRwL0FtckNvZGVjLmNwcCBiL3ZvaXAvam5pL3J0cC9BbXJDb2RlYy5jcHAKaW5kZXggZjNlY2FjMi4uODRjNzE2NiAxMDA2NDQKLS0tIGEvdm9pcC9qbmkvcnRwL0FtckNvZGVjLmNwcAorKysgYi92b2lwL2puaS9ydHAvQW1yQ29kZWMuY3BwCkBAIC03Myw3ICs3Myw3IEBACiAgICAgfQogCiAgICAgLy8gSGFuZGxlIG1vZGUtc2V0IGFuZCBvY3RldC1hbGlnbi4KLSAgICBjaGFyICptb2RlcyA9IHN0cmNhc2VzdHIoZm10cCwgIm1vZGUtc2V0PSIpOworICAgIGNvbnN0IGNoYXIgKm1vZGVzID0gc3RyY2FzZXN0cihmbXRwLCAibW9kZS1zZXQ9Iik7CiAgICAgaWYgKG1vZGVzKSB7CiAgICAgICAgIG1Nb2RlID0gMDsKICAgICAgICAgbU1vZGVTZXQgPSAwOwpkaWZmIC0tZ2l0IGEvdm9pcC9qbmkvcnRwL0VjaG9TdXBwcmVzc29yLmNwcCBiL3ZvaXAvam5pL3J0cC9FY2hvU3VwcHJlc3Nvci5jcHAKaW5kZXggOTIwMTVhOS4uMmNlZWJkYyAxMDA2NDQKLS0tIGEvdm9pcC9qbmkvcnRwL0VjaG9TdXBwcmVzc29yLmNwcAorKysgYi92b2lwL2puaS9ydHAvRWNob1N1cHByZXNzb3IuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPG1hdGguaD4KIAogI2RlZmluZSBMT0dfVEFHICJFY2hvIgpkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvSVdpZmlNYW5hZ2VyLmFpZGwgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9JV2lmaU1hbmFnZXIuYWlkbAppbmRleCAxOThiMWU2Li5mNzYwZDI3IDEwMDY0NAotLS0gYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9JV2lmaU1hbmFnZXIuYWlkbAorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9JV2lmaU1hbmFnZXIuYWlkbApAQCAtNDYsMTEgKzQ2LDExIEBACiAKICAgICBMaXN0PFNjYW5SZXN1bHQ+IGdldFNjYW5SZXN1bHRzKCk7CiAKLSAgICBib29sZWFuIGRpc2Nvbm5lY3QoKTsKKyAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKIAotICAgIGJvb2xlYW4gcmVjb25uZWN0KCk7CisgICAgdm9pZCByZWNvbm5lY3QoKTsKIAotICAgIGJvb2xlYW4gcmVhc3NvY2lhdGUoKTsKKyAgICB2b2lkIHJlYXNzb2NpYXRlKCk7CiAKICAgICBXaWZpSW5mbyBnZXRDb25uZWN0aW9uSW5mbygpOwogCkBAIC04OSw1ICs4OSwyNSBAQAogICAgIFdpZmlDb25maWd1cmF0aW9uIGdldFdpZmlBcENvbmZpZ3VyYXRpb24oKTsKIAogICAgIHZvaWQgc2V0V2lmaUFwQ29uZmlndXJhdGlvbihpbiBXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnKTsKKworICAgIHZvaWQgc3RhcnRXaWZpKCk7CisKKyAgICB2b2lkIHN0b3BXaWZpKCk7CisKKyAgICB2b2lkIGFkZFRvQmxhY2tsaXN0KFN0cmluZyBic3NpZCk7CisKKyAgICB2b2lkIGNsZWFyQmxhY2tsaXN0KCk7CisKKyAgICB2b2lkIGNvbm5lY3ROZXR3b3JrV2l0aENvbmZpZyhpbiBXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnKTsKKworICAgIHZvaWQgY29ubmVjdE5ldHdvcmtXaXRoSWQoaW50IG5ldHdvcmtJZCk7CisKKyAgICB2b2lkIHNhdmVOZXR3b3JrKGluIFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25maWcpOworCisgICAgdm9pZCBmb3JnZXROZXR3b3JrKGludCBuZXR3b3JrSWQpOworCisgICAgdm9pZCBzdGFydFdwc1BiYyhTdHJpbmcgYnNzaWQpOworCisgICAgdm9pZCBzdGFydFdwc1BpbihTdHJpbmcgYnNzaWQsIGludCBhcFBpbik7CiB9CiAKZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWdTdG9yZS5qYXZhIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaUNvbmZpZ1N0b3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYzNDE1NwotLS0gL2Rldi9udWxsCisrKyBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWdTdG9yZS5qYXZhCkBAIC0wLDAgKzEsMTE4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5uZXQud2lmaTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQubmV0LkRoY3BJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0LlByb3h5UHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlDb25maWd1cmF0aW9uLklwQXNzaWdubWVudDsKK2ltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlDb25maWd1cmF0aW9uLktleU1nbXQ7CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbi5Qcm94eVNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlDb25maWd1cmF0aW9uLklOVkFMSURfTkVUV09SS19JRDsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgQVBJIHRvIG1hbmFnZSBjb25maWd1cmVkCisgKiB3aWZpIG5ldHdvcmtzLiBUaGUgQVBJIGlzIG5vdCB0aHJlYWQgc2FmZSBpcyBiZWluZworICogdXNlZCBvbmx5IGZyb20gV2lmaVN0YXRlTWFjaGluZS4KKyAqCisgKiBJdCBkZWFscyB3aXRoIHRoZSBmb2xsb3dpbmcKKyAqIC0gQWRkL3VwZGF0ZS9yZW1vdmUgYSBXaWZpQ29uZmlndXJhdGlvbgorICogICBUaGUgY29uZmlndXJhdGlvbiBjb250YWlucyB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24uCisgKiAgICAgPSBJUCBhbmQgcHJveHkgY29uZmlndXJhdGlvbiB0aGF0IGlzIGhhbmRsZWQgYnkgV2lmaUNvbmZpZ1N0b3JlIGFuZAorICogICAgICAgaXMgc2F2ZWQgdG8gZGlzayBvbiBhbnkgY2hhbmdlLgorICoKKyAqICAgICAgIFRoZSBmb3JtYXQgb2YgY29uZmlndXJhdGlvbiBmaWxlIGlzIGFzIGZvbGxvd3M6CisgKiAgICAgICA8dmVyc2lvbj4KKyAqICAgICAgIDxuZXRBX2tleTE+PG5ldEFfdmFsdWUxPjxuZXRBX2tleTI+PG5ldEFfdmFsdWUyPi4uLjxFT1M+CisgKiAgICAgICA8bmV0Ql9rZXkxPjxuZXRCX3ZhbHVlMT48bmV0Ql9rZXkyPjxuZXRCX3ZhbHVlMj4uLi48RU9TPgorICogICAgICAgLi4KKyAqCisgKiAgICAgICAoa2V5LCB2YWx1ZSkgcGFpcnMgZm9yIGEgZ2l2ZW4gbmV0d29yayBhcmUgZ3JvdXBlZCB0b2dldGhlciBhbmQgY2FuCisgKiAgICAgICBiZSBpbiBhbnkgb3JkZXIuIEEgIkVPUyIgYXQgdGhlIGVuZCBvZiBhIHNldCBvZiAoa2V5LCB2YWx1ZSkgcGFpcnMKKyAqICAgICAgIGluZGljYXRlcyB0aGF0IHRoZSBuZXh0IHNldCBvZiAoa2V5LCB2YWx1ZSkgcGFpcnMgYXJlIGZvciBhIG5ldworICogICAgICAgbmV0d29yay4gQSBuZXR3b3JrIGlzIGlkZW50aWZpZWQgYnkgYSB1bmlxdWUgImlkIi4gSWYgdGhlcmUgaXMgbm8KKyAqICAgICAgICJpZCIga2V5IGluIHRoZSAoa2V5LCB2YWx1ZSkgcGFpcnMsIHRoZSBkYXRhIGlzIGRpc2NhcmRlZC4gQW4gSVAKKyAqICAgICAgIGNvbmZpZ3VyYXRpb24gaW5jbHVkZXMgdGhlIGtleXMgLSAiaXBBc3NpZ25tZW50IiwgImlwQWRkcmVzcyIsICJnYXRld2F5IiwKKyAqICAgICAgICJuZXRtYXNrIiwgImRuczEiIGFuZCAiZG5zMiIuIEEgcHJveHkgY29uZmlndXJhdGlvbiBpbmNsdWRlcyAicHJveHlTZXR0aW5ncyIsCisgKiAgICAgICAicHJveHlIb3N0IiwgInByb3h5UG9ydCIgYW5kICJleGNsdXNpb25MaXN0IgorICoKKyAqICAgICAgIEFuIGludmFsaWQgdmVyc2lvbiBvbiByZWFkIHdvdWxkIHJlc3VsdCBpbiBkaXNjYXJkaW5nIHRoZSBjb250ZW50cyBvZgorICogICAgICAgdGhlIGZpbGUuIE9uIHRoZSBuZXh0IHdyaXRlLCB0aGUgbGF0ZXN0IHZlcnNpb24gaXMgd3JpdHRlbiB0byBmaWxlLgorICoKKyAqICAgICAgIEFueSBmYWlsdXJlcyBkdXJpbmcgcmVhZCBvciB3cml0ZSB0byB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGFyZSBpZ25vcmVkCisgKiAgICAgICB3aXRob3V0IHJlcG9ydGluZyB0byB0aGUgdXNlciBzaW5jZSB0aGUgbGlrZWxpaG9vZCBvZiB0aGVzZSBlcnJvcnMgYXJlCisgKiAgICAgICBsb3cgYW5kIHRoZSBpbXBhY3Qgb24gY29ubmVjdGl2aXR5IGlzIGxvdy4KKyAqCisgKiAgICAgPSBTU0lEICYgc2VjdXJpdHkgZGV0YWlscyB0aGF0IGlzIHB1c2hlZCB0byB0aGUgc3VwcGxpY2FudC4KKyAqICAgICAgIHN1cHBsaWNhbnQgc2F2ZXMgdGhlc2UgZGV0YWlscyB0byB0aGUgZGlzayBvbiBjYWxsaW5nCisgKiAgICAgICBzYXZlQ29uZmlnQ29tbWFuZCgpLgorICoKKyAqICAgICAgIFdlIGhhdmUgdHdvIGtpbmRzIG9mIEFQSXMgZXhwb3NlZDoKKyAqICAgICAgICA+IHB1YmxpYyBBUEkgY2FsbHMgdGhhdCBwcm92aWRlIGZpbmUgZ3JhaW5lZCBjb250cm9sCisgKiAgICAgICAgICAtIGVuYWJsZU5ldHdvcmssIGRpc2FibGVOZXR3b3JrLCBhZGRPclVwZGF0ZU5ldHdvcmsoKSwKKyAqICAgICAgICAgIHJlbW92ZU5ldHdvcmsoKS4gRm9yIHRoZXNlIGNhbGxzLCB0aGUgY29uZmlnIGlzIG5vdCBwZXJzaXN0ZWQKKyAqICAgICAgICAgIHRvIHRoZSBkaXNrLiAoVE9ETzogZGVwcmVjYXRlIHRoZXNlIGNhbGxzIGluIFdpZmlNYW5hZ2VyKQorICogICAgICAgID4gVGhlIG5ldyBBUEkgY2FsbHMgLSBzZWxlY3ROZXR3b3JrKCksIHNhdmVOZXR3b3JrKCkgJiBmb3JnZXROZXR3b3JrKCkuCisgKiAgICAgICAgICBUaGVzZSBjYWxscyBwZXJzaXN0IHRoZSBzdXBwbGljYW50IGNvbmZpZyB0byBkaXNrLgorICoKKyAqIC0gTWFpbnRhaW4gYSBsaXN0IG9mIGNvbmZpZ3VyZWQgbmV0d29ya3MgZm9yIHF1aWNrIGFjY2VzcworICoKKyAqLworY2xhc3MgV2lmaUNvbmZpZ1N0b3JlIHsKKworICAgIHByaXZhdGUgc3RhdGljIENvbnRleHQgc0NvbnRleHQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJXaWZpQ29uZmlnU3RvcmUiOworCisgICAgLyogY29uZmlndXJlZCBuZXR3b3JrcyB3aXRoIG5ldHdvcmsgaWQgYXMgdGhlIGtleSAqLworICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8SW50ZWdlciwgV2lmaUNvbmZpZ3VyYXRpb24+IHNDb25maWd1cmVkTmV0d29ya3MgPQorICAgICAgICAgICAgbmV3IEhhc2hNYXA8SW50ZWdlciwgV2lmaUNvbmZpZ3VyYXRpb24+KCk7CisKKyAgICAvKiBBIG5ldHdvcmsgaWQgaXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBuZXR3b3JrIGNvbmZpZ3VyZWQgaW4gdGhlCisgICAgICogc3VwcGxpY2FudC4gTmV0d29yayBpZHMgYXJlIGdlbmVyYXRlZCB3aGVuIHRoZSBzdXBwbGljYW50IHJlYWRzCisgICAgICogdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBhdCBzdGFydCBhbmQgY2FuIHRodXMgY2hhbmdlIGZvciBuZXR3b3Jrcy4KKyAgICAgKiBXZSBzdG9yZSB0aGUgSVAgY29uZmlndXJhdGlvbiBmb3IgbmV0d29ya3MgYWxvbmcgd2l0aCBhIHVuaXF1ZSBpZAorICAgICAqIHRoYXQgaXMgZ2VuZXJhdGVkIGZyb20gU1NJRCBhbmQgc2VjdXJpdHkgdHlwZSBvZiB0aGUgbmV0d29yay4gQSBtYXBwaW5nCisgICAgICogZnJvbSB0aGUgZ2VuZXJhdGVkIHVuaXF1ZSBpZCB0byBuZXR3b3JrIGlkIG9mIHRoZSBuZXR3b3JrIGlzIG5lZWRlZCB0bworICAgICAqIG1hcCBzdXBwbGljYW50IGNvbmZpZyB0byBJUCBjb25maWd1cmF0aW9uLiAqLworICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4gc05ldHdvcmtJZHMgPQorICAgICAgICAgICAgbmV3IEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4oKTsKKworICAgIC8qIFRyYWNrcyB0aGUgaGlnaGVzdCBwcmlvcml0eSBvZiBjb25maWd1cmVkIG5ldHdvcmtzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNMYXN0UHJpb3JpdHkgPSAtMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpcENvbmZpZ0ZpbGUgPSBFbnZpcm9ubWVudC5nZXREYXRhRGlyZWN0b3J5KCkgKworICAgICAgICAgICAgIi9taXNjL3dpZmkvaXBjb25maWcudHh0IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJUENPTkZJR19GSUxFX1ZFUlNJT04gPSAxOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBjb250ZXh0LCBmZXRjaCB0aGUgbGlzdCBvZiBjb25maWd1cmVkIG5ldHdvcmtzCisgICAgICogYW5kIGVuYWJsZSBhbGwgc3RvcmVkIG5ldHdvcmtzIGluIHN1cHBsaWNhbnQuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiTG9hZGluZyBjb25maWcgYW5kIGVuYWJsaW5nIGFsbCBuZXR3b3JrcyIpOworICAgICAgICBzQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIGxvYWRDb25maWd1cmVkTmV0d29ya3MoKTsKKyAgICAgICAgZW5hYmxlQWxsTmV0d29ya3MoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGZXRjaCB0aGUgbGlzdCBvZiBjdXJyZW50bHkgY29uZmlndXJlZCBuZXR3b3JrcworICAgICAqIEByZXR1cm4gTGlzdCBvZiBuZXR3b3JrcworICAgICAqLworICAgIHN0YXRpYyBMaXN0PFdpZmlDb25maWd1cmF0aW9uPiBnZXRDb25maWd1cmVkTmV0d29ya3MoKSB7CisgICAgICAgIExpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+IG5ldHdvcmtzID0gbmV3IEFycmF5TGlzdDxXaWZpQ29uZmlndXJhdGlvbj4oKTsKKyAgICAgICAgc3luY2hyb25pemVkIChzQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICBmb3IoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnIDogc0NvbmZpZ3VyZWROZXR3b3Jrcy52YWx1ZXMoKSkgeworICAgICAgICAgICAgICAgIG5ldHdvcmtzLmFkZChuZXcgV2lmaUNvbmZpZ3VyYXRpb24oY29uZmlnKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldHdvcmtzOworICAgIH0KKworICAgIC8qKgorICAgICAqIGVuYWJsZSBhbGwgbmV0d29ya3MgYW5kIHNhdmUgY29uZmlnLiBUaGlzIHdpbGwgYmUgYSBuby1vcCBpZiB0aGUgbGlzdAorICAgICAqIG9mIGNvbmZpZ3VyZWQgbmV0d29ya3MgaW5kaWNhdGVzIGFsbCBuZXR3b3JrcyBhcyBiZWluZyBlbmFibGVkCisgICAgICovCisgICAgc3RhdGljIHZvaWQgZW5hYmxlQWxsTmV0d29ya3MoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc0NvbmZpZ3VyZWROZXR3b3JrcykgeworICAgICAgICAgICAgZm9yKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA6IHNDb25maWd1cmVkTmV0d29ya3MudmFsdWVzKCkpIHsKKyAgICAgICAgICAgICAgICBpZihjb25maWcgIT0gbnVsbCAmJiBjb25maWcuc3RhdHVzID09IFN0YXR1cy5ESVNBQkxFRCkgeworICAgICAgICAgICAgICAgICAgICBpZihXaWZpTmF0aXZlLmVuYWJsZU5ldHdvcmtDb21tYW5kKGNvbmZpZy5uZXR3b3JrSWQsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyA9IFN0YXR1cy5FTkFCTEVEOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRW5hYmxlIG5ldHdvcmsgZmFpbGVkIG9uICIgKyBjb25maWcubmV0d29ya0lkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFdpZmlOYXRpdmUuc2F2ZUNvbmZpZ0NvbW1hbmQoKTsKKyAgICAgICAgc2VuZENvbmZpZ0NoYW5nZUJyb2FkY2FzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbGVjdHMgdGhlIHNwZWNpZmllZCBuZXR3b3JrIGNvbmZpZyBmb3IgY29ubmVjdGlvbi4gVGhpcyBpbnZvbHZlcworICAgICAqIGFkZGl0aW9uL3VwZGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbmZpZywgdXBkYXRpbmcgdGhlIHByaW9yaXR5IG9mCisgICAgICogYWxsIHRoZSBuZXR3b3JrcyBhbmQgZW5hYmxpbmcgdGhlIGdpdmVuIG5ldHdvcmsgd2hpbGUgZGlzYWJsaW5nIG90aGVycy4KKyAgICAgKgorICAgICAqIFNlbGVjdGluZyBhIG5ldHdvcmsgd2lsbCBsZWF2ZSB0aGUgb3RoZXIgbmV0d29ya3MgZGlzYWJsZWQgYW5kCisgICAgICogYSBjYWxsIHRvIGVuYWJsZUFsbE5ldHdvcmtzKCkgbmVlZHMgdG8gYmUgaXNzdWVkIHVwb24gYSBjb25uZWN0aW9uCisgICAgICogb3IgYSBmYWlsdXJlIGV2ZW50IGZyb20gc3VwcGxpY2FudAorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyBUaGUgY29uZmlndXJhdGlvbiBkZXRhaWxzIGluIFdpZmlDb25maWd1cmF0aW9uCisgICAgICovCisgICAgc3RhdGljIHZvaWQgc2VsZWN0TmV0d29yayhXaWZpQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgbmV0SWQgPSBhZGRPclVwZGF0ZU5ldHdvcmtOYXRpdmUoY29uZmlnKTsKKyAgICAgICAgICAgIGlmIChuZXRJZCAhPSBJTlZBTElEX05FVFdPUktfSUQpIHsKKyAgICAgICAgICAgICAgICBzZWxlY3ROZXR3b3JrKG5ldElkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIHVwZGF0ZSBuZXR3b3JrICIgKyBjb25maWcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VsZWN0cyB0aGUgc3BlY2lmaWVkIG5ldHdvcmsgZm9yIGNvbm5lY3Rpb24uIFRoaXMgaW52b2x2ZXMKKyAgICAgKiB1cGRhdGluZyB0aGUgcHJpb3JpdHkgb2YgYWxsIHRoZSBuZXR3b3JrcyBhbmQgZW5hYmxpbmcgdGhlIGdpdmVuCisgICAgICogbmV0d29yayB3aGlsZSBkaXNhYmxpbmcgb3RoZXJzLgorICAgICAqCisgICAgICogU2VsZWN0aW5nIGEgbmV0d29yayB3aWxsIGxlYXZlIHRoZSBvdGhlciBuZXR3b3JrcyBkaXNhYmxlZCBhbmQKKyAgICAgKiBhIGNhbGwgdG8gZW5hYmxlQWxsTmV0d29ya3MoKSBuZWVkcyB0byBiZSBpc3N1ZWQgdXBvbiBhIGNvbm5lY3Rpb24KKyAgICAgKiBvciBhIGZhaWx1cmUgZXZlbnQgZnJvbSBzdXBwbGljYW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayB0byBzZWxlY3QgZm9yIGNvbm5lY3Rpb24KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBzZWxlY3ROZXR3b3JrKGludCBuZXRJZCkgeworICAgICAgICAvLyBSZXNldCB0aGUgcHJpb3JpdHkgb2YgZWFjaCBuZXR3b3JrIGF0IHN0YXJ0IG9yIGlmIGl0IGdvZXMgdG9vIGhpZ2guCisgICAgICAgIGlmIChzTGFzdFByaW9yaXR5ID09IC0xIHx8IHNMYXN0UHJpb3JpdHkgPiAxMDAwMDAwKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgICAgICBmb3IoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnIDogc0NvbmZpZ3VyZWROZXR3b3Jrcy52YWx1ZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm5ldHdvcmtJZCAhPSBJTlZBTElEX05FVFdPUktfSUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wcmlvcml0eSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRPclVwZGF0ZU5ldHdvcmtOYXRpdmUoY29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNMYXN0UHJpb3JpdHkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IHRvIHRoZSBoaWdoZXN0IHByaW9yaXR5IGFuZCBzYXZlIHRoZSBjb25maWd1cmF0aW9uLgorICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgY29uZmlnLm5ldHdvcmtJZCA9IG5ldElkOworICAgICAgICBjb25maWcucHJpb3JpdHkgPSArK3NMYXN0UHJpb3JpdHk7CisKKyAgICAgICAgYWRkT3JVcGRhdGVOZXR3b3JrTmF0aXZlKGNvbmZpZyk7CisgICAgICAgIFdpZmlOYXRpdmUuc2F2ZUNvbmZpZ0NvbW1hbmQoKTsKKworICAgICAgICAvKiBFbmFibGUgdGhlIGdpdmVuIG5ldHdvcmsgd2hpbGUgZGlzYWJsaW5nIGFsbCBvdGhlciBuZXR3b3JrcyAqLworICAgICAgICBlbmFibGVOZXR3b3JrV2l0aG91dEJyb2FkY2FzdChuZXRJZCwgdHJ1ZSk7CisKKyAgICAgICAvKiBBdm9pZCBzYXZpbmcgdGhlIGNvbmZpZyAmIHNlbmRpbmcgYSBicm9hZGNhc3QgdG8gcHJldmVudCBzZXR0aW5ncworICAgICAgICAqIGZyb20gZGlzcGxheWluZyBhIGRpc2FibGVkIGxpc3Qgb2YgbmV0d29ya3MgKi8KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQvdXBkYXRlIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiBhbmQgc2F2ZSBjb25maWcKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgV2lmaUNvbmZpZ3VyYXRpb24gdG8gYmUgc2F2ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBzYXZlTmV0d29yayhXaWZpQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgYm9vbGVhbiBuZXdOZXR3b3JrID0gKGNvbmZpZy5uZXR3b3JrSWQgPT0gSU5WQUxJRF9ORVRXT1JLX0lEKTsKKyAgICAgICAgaW50IG5ldElkID0gYWRkT3JVcGRhdGVOZXR3b3JrTmF0aXZlKGNvbmZpZyk7CisgICAgICAgIC8qIGVuYWJsZSBhIG5ldyBuZXR3b3JrICovCisgICAgICAgIGlmIChuZXdOZXR3b3JrICYmIG5ldElkICE9IElOVkFMSURfTkVUV09SS19JRCkgeworICAgICAgICAgICAgV2lmaU5hdGl2ZS5lbmFibGVOZXR3b3JrQ29tbWFuZChuZXRJZCwgZmFsc2UpOworICAgICAgICAgICAgc3luY2hyb25pemVkIChzQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICAgICAgc0NvbmZpZ3VyZWROZXR3b3Jrcy5nZXQobmV0SWQpLnN0YXR1cyA9IFN0YXR1cy5FTkFCTEVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFdpZmlOYXRpdmUuc2F2ZUNvbmZpZ0NvbW1hbmQoKTsKKyAgICAgICAgc2VuZENvbmZpZ0NoYW5nZUJyb2FkY2FzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcmdldCB0aGUgc3BlY2lmaWVkIG5ldHdvcmsgYW5kIHNhdmUgY29uZmlnCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayB0byBmb3JnZXQKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBmb3JnZXROZXR3b3JrKGludCBuZXRJZCkgeworICAgICAgICBpZiAoV2lmaU5hdGl2ZS5yZW1vdmVOZXR3b3JrQ29tbWFuZChuZXRJZCkpIHsKKyAgICAgICAgICAgIFdpZmlOYXRpdmUuc2F2ZUNvbmZpZ0NvbW1hbmQoKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc0NvbmZpZ3VyZWROZXR3b3JrcykgeworICAgICAgICAgICAgICAgIHNDb25maWd1cmVkTmV0d29ya3MucmVtb3ZlKG5ldElkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlSXBBbmRQcm94eUNvbmZpZ3VyYXRpb25zKCk7CisgICAgICAgICAgICBzZW5kQ29uZmlnQ2hhbmdlQnJvYWRjYXN0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gcmVtb3ZlIG5ldHdvcmsgIiArIG5ldElkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZC91cGRhdGUgYSBuZXR3b3JrLiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gc2F2ZUNvbmZpZyBvcGVyYXRpb24uCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBwdWJsaWMKKyAgICAgKiBBUEkuIFRoZSBtb3JlIHBvd2VyZnVsIHNhdmVOZXR3b3JrKCkgaXMgdXNlZCBieSB0aGUKKyAgICAgKiBzdGF0ZSBtYWNoaW5lCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIHdpZmkgY29uZmlndXJhdGlvbiB0byBhZGQvdXBkYXRlCisgICAgICovCisgICAgc3RhdGljIGludCBhZGRPclVwZGF0ZU5ldHdvcmsoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIGludCByZXQgPSBhZGRPclVwZGF0ZU5ldHdvcmtOYXRpdmUoY29uZmlnKTsKKyAgICAgICAgc2VuZENvbmZpZ0NoYW5nZUJyb2FkY2FzdCgpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIG5ldHdvcmsuIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBzYXZlQ29uZmlnIG9wZXJhdGlvbi4KKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHB1YmxpYworICAgICAqIEFQSS4gVGhlIG1vcmUgcG93ZXJmdWwgZm9yZ2V0TmV0d29yaygpIGlzIHVzZWQgYnkgdGhlCisgICAgICogc3RhdGUgbWFjaGluZSBmb3IgbmV0d29yayByZW1vdmFsCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gcmVtb3ZlTmV0d29yayhpbnQgbmV0SWQpIHsKKyAgICAgICAgYm9vbGVhbiByZXQgPSBXaWZpTmF0aXZlLnJlbW92ZU5ldHdvcmtDb21tYW5kKG5ldElkKTsKKyAgICAgICAgc3luY2hyb25pemVkIChzQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICBpZiAocmV0KSBzQ29uZmlndXJlZE5ldHdvcmtzLnJlbW92ZShuZXRJZCk7CisgICAgICAgIH0KKyAgICAgICAgc2VuZENvbmZpZ0NoYW5nZUJyb2FkY2FzdCgpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuYWJsZSBhIG5ldHdvcmsuIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBzYXZlQ29uZmlnIG9wZXJhdGlvbi4KKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHB1YmxpYworICAgICAqIEFQSS4gVGhlIG1vcmUgcG93ZXJmdWwgc2VsZWN0TmV0d29yaygpL3NhdmVOZXR3b3JrKCkgaXMgdXNlZCBieSB0aGUKKyAgICAgKiBzdGF0ZSBtYWNoaW5lIGZvciBjb25uZWN0aW5nIHRvIGEgbmV0d29yaworICAgICAqCisgICAgICogQHBhcmFtIG5ldElkIG5ldHdvcmsgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIGVuYWJsZU5ldHdvcmsoaW50IG5ldElkLCBib29sZWFuIGRpc2FibGVPdGhlcnMpIHsKKyAgICAgICAgYm9vbGVhbiByZXQgPSBlbmFibGVOZXR3b3JrV2l0aG91dEJyb2FkY2FzdChuZXRJZCwgZGlzYWJsZU90aGVycyk7CisgICAgICAgIHNlbmRDb25maWdDaGFuZ2VCcm9hZGNhc3QoKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbGVhbiBlbmFibGVOZXR3b3JrV2l0aG91dEJyb2FkY2FzdChpbnQgbmV0SWQsIGJvb2xlYW4gZGlzYWJsZU90aGVycykgeworICAgICAgICBib29sZWFuIHJldCA9IFdpZmlOYXRpdmUuZW5hYmxlTmV0d29ya0NvbW1hbmQobmV0SWQsIGRpc2FibGVPdGhlcnMpOworCisgICAgICAgIHN5bmNocm9uaXplZCAoc0NvbmZpZ3VyZWROZXR3b3JrcykgeworICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnID0gc0NvbmZpZ3VyZWROZXR3b3Jrcy5nZXQobmV0SWQpOworICAgICAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSBjb25maWcuc3RhdHVzID0gU3RhdHVzLkVOQUJMRUQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGlzYWJsZU90aGVycykgeworICAgICAgICAgICAgbWFya0FsbE5ldHdvcmtzRGlzYWJsZWRFeGNlcHQobmV0SWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzYWJsZSBhIG5ldHdvcmsuIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBzYXZlQ29uZmlnIG9wZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayB0byBiZSBkaXNhYmxlZAorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIGRpc2FibGVOZXR3b3JrKGludCBuZXRJZCkgeworICAgICAgICBib29sZWFuIHJldCA9IFdpZmlOYXRpdmUuZGlzYWJsZU5ldHdvcmtDb21tYW5kKG5ldElkKTsKKyAgICAgICAgc3luY2hyb25pemVkIChzQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgPSBzQ29uZmlndXJlZE5ldHdvcmtzLmdldChuZXRJZCk7CisgICAgICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIGNvbmZpZy5zdGF0dXMgPSBTdGF0dXMuRElTQUJMRUQ7CisgICAgICAgIH0KKyAgICAgICAgc2VuZENvbmZpZ0NoYW5nZUJyb2FkY2FzdCgpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhdmUgdGhlIGNvbmZpZ3VyZWQgbmV0d29ya3MgaW4gc3VwcGxpY2FudCB0byBkaXNrCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gc2F2ZUNvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc2F2ZUNvbmZpZ0NvbW1hbmQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBXUFMgcGluIG1ldGhvZCBjb25maWd1cmF0aW9uCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gc3RhcnRXcHNQaW4oU3RyaW5nIGJzc2lkLCBpbnQgYXBQaW4pIHsKKyAgICAgICAgaWYgKFdpZmlOYXRpdmUuc3RhcnRXcHNQaW5Db21tYW5kKGJzc2lkLCBhcFBpbikpIHsKKyAgICAgICAgICAgIC8qIFdQUyBsZWF2ZXMgYWxsIG5ldHdvcmtzIGRpc2FibGVkICovCisgICAgICAgICAgICBtYXJrQWxsTmV0d29ya3NEaXNhYmxlZCgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIHN0YXJ0IFdQUyBwaW4gbWV0aG9kIGNvbmZpZ3VyYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IFdQUyBwdXNoIGJ1dHRvbiBjb25maWd1cmF0aW9uCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gc3RhcnRXcHNQYmMoU3RyaW5nIGJzc2lkKSB7CisgICAgICAgIGlmIChXaWZpTmF0aXZlLnN0YXJ0V3BzUGJjQ29tbWFuZChic3NpZCkpIHsKKyAgICAgICAgICAgIC8qIFdQUyBsZWF2ZXMgYWxsIG5ldHdvcmtzIGRpc2FibGVkICovCisgICAgICAgICAgICBtYXJrQWxsTmV0d29ya3NEaXNhYmxlZCgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIHN0YXJ0IFdQUyBwdXNoIGJ1dHRvbiBjb25maWd1cmF0aW9uIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGZXRjaCB0aGUgSVAgY29uZmlndXJhdGlvbiBmb3IgYSBnaXZlbiBuZXR3b3JrIGlkCisgICAgICovCisgICAgc3RhdGljIERoY3BJbmZvIGdldElwQ29uZmlndXJhdGlvbihpbnQgbmV0SWQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgPSBzQ29uZmlndXJlZE5ldHdvcmtzLmdldChuZXRJZCk7CisgICAgICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHJldHVybiBuZXcgRGhjcEluZm8oY29uZmlnLmlwQ29uZmlnKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGZXRjaCB0aGUgcHJveHkgcHJvcGVydGllcyBmb3IgYSBnaXZlbiBuZXR3b3JrIGlkCisgICAgICovCisgICAgc3RhdGljIFByb3h5UHJvcGVydGllcyBnZXRQcm94eVByb3BlcnRpZXMoaW50IG5ldElkKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc0NvbmZpZ3VyZWROZXR3b3JrcykgeworICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnID0gc0NvbmZpZ3VyZWROZXR3b3Jrcy5nZXQobmV0SWQpOworICAgICAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsICYmIGNvbmZpZy5wcm94eVNldHRpbmdzID09IFByb3h5U2V0dGluZ3MuU1RBVElDKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm94eVByb3BlcnRpZXMoY29uZmlnLnByb3h5UHJvcGVydGllcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGlmIHRoZSBzcGVjaWZpZWQgbmV0d29yayBpcyB1c2luZyBzdGF0aWMgSVAKKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBpc1VzaW5nU3RhdGljSXAoaW50IG5ldElkKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc0NvbmZpZ3VyZWROZXR3b3JrcykgeworICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnID0gc0NvbmZpZ3VyZWROZXR3b3Jrcy5nZXQobmV0SWQpOworICAgICAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsICYmIGNvbmZpZy5pcEFzc2lnbm1lbnQgPT0gSXBBc3NpZ25tZW50LlNUQVRJQykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNlbmRDb25maWdDaGFuZ2VCcm9hZGNhc3QoKSB7CisgICAgICAgIGlmICghQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmlzU3lzdGVtUmVhZHkoKSkgcmV0dXJuOworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5TVVBQTElDQU5UX0NPTkZJR19DSEFOR0VEX0FDVElPTik7CisgICAgICAgIHNDb250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBsb2FkQ29uZmlndXJlZE5ldHdvcmtzKCkgeworICAgICAgICBTdHJpbmcgbGlzdFN0ciA9IFdpZmlOYXRpdmUubGlzdE5ldHdvcmtzQ29tbWFuZCgpOworICAgICAgICBzTGFzdFByaW9yaXR5ID0gMDsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgIHNDb25maWd1cmVkTmV0d29ya3MuY2xlYXIoKTsKKyAgICAgICAgICAgIHNOZXR3b3JrSWRzLmNsZWFyKCk7CisKKyAgICAgICAgICAgIGlmIChsaXN0U3RyID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBTdHJpbmdbXSBsaW5lcyA9IGxpc3RTdHIuc3BsaXQoIlxuIik7CisgICAgICAgICAgICAvLyBTa2lwIHRoZSBmaXJzdCBsaW5lLCB3aGljaCBpcyBhIGhlYWRlcgorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IGxpbmVzW2ldLnNwbGl0KCJcdCIpOworICAgICAgICAgICAgICAgIC8vIG5ldHdvcmstaWQgfCBzc2lkIHwgYnNzaWQgfCBmbGFncworICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBXaWZpQ29uZmlndXJhdGlvbigpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5uZXR3b3JrSWQgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3VsdFswXSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRbM10uaW5kZXhPZigiW0NVUlJFTlRdIikgIT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc3RhdHVzID0gV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzLkNVUlJFTlQ7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdFszXS5pbmRleE9mKCJbRElTQUJMRURdIikgIT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc3RhdHVzID0gV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzLkRJU0FCTEVEOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc3RhdHVzID0gV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzLkVOQUJMRUQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyA9IFdpZmlDb25maWd1cmF0aW9uLlN0YXR1cy5FTkFCTEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZWFkTmV0d29ya1ZhcmlhYmxlcyhjb25maWcpOworICAgICAgICAgICAgICAgIGlmIChjb25maWcucHJpb3JpdHkgPiBzTGFzdFByaW9yaXR5KSB7CisgICAgICAgICAgICAgICAgICAgIHNMYXN0UHJpb3JpdHkgPSBjb25maWcucHJpb3JpdHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNDb25maWd1cmVkTmV0d29ya3MucHV0KGNvbmZpZy5uZXR3b3JrSWQsIGNvbmZpZyk7CisgICAgICAgICAgICAgICAgc05ldHdvcmtJZHMucHV0KGNvbmZpZ0tleShjb25maWcpLCBjb25maWcubmV0d29ya0lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZWFkSXBBbmRQcm94eUNvbmZpZ3VyYXRpb25zKCk7CisgICAgICAgIHNlbmRDb25maWdDaGFuZ2VCcm9hZGNhc3QoKTsKKyAgICB9CisKKyAgICAvKiBNYXJrIGFsbCBuZXR3b3JrcyBleGNlcHQgc3BlY2lmaWVkIG5ldElkIGFzIGRpc2FibGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBtYXJrQWxsTmV0d29ya3NEaXNhYmxlZEV4Y2VwdChpbnQgbmV0SWQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICBmb3IoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnIDogc0NvbmZpZ3VyZWROZXR3b3Jrcy52YWx1ZXMoKSkgeworICAgICAgICAgICAgICAgIGlmKGNvbmZpZyAhPSBudWxsICYmIGNvbmZpZy5uZXR3b3JrSWQgIT0gbmV0SWQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyA9IFN0YXR1cy5ESVNBQkxFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIG1hcmtBbGxOZXR3b3Jrc0Rpc2FibGVkKCkgeworICAgICAgICBtYXJrQWxsTmV0d29ya3NEaXNhYmxlZEV4Y2VwdChJTlZBTElEX05FVFdPUktfSUQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVJcEFuZFByb3h5Q29uZmlndXJhdGlvbnMoKSB7CisKKyAgICAgICAgRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShpcENvbmZpZ0ZpbGUpKSk7CisKKyAgICAgICAgICAgIG91dC53cml0ZUludChJUENPTkZJR19GSUxFX1ZFUlNJT04pOworCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgICAgICBmb3IoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnIDogc0NvbmZpZ3VyZWROZXR3b3Jrcy52YWx1ZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIHdyaXRlVG9GaWxlID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb25maWcuaXBBc3NpZ25tZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNUQVRJQzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVVEYoImlwQXNzaWdubWVudCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVURihjb25maWcuaXBBc3NpZ25tZW50LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVURigiaXBBZGRyZXNzIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlSW50KGNvbmZpZy5pcENvbmZpZy5pcEFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVURigiZ2F0ZXdheSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUludChjb25maWcuaXBDb25maWcuZ2F0ZXdheSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVVRGKCJuZXRtYXNrIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlSW50KGNvbmZpZy5pcENvbmZpZy5uZXRtYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVVEYoImRuczEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVJbnQoY29uZmlnLmlwQ29uZmlnLmRuczEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVURigiZG5zMiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUludChjb25maWcuaXBDb25maWcuZG5zMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVUb0ZpbGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBESENQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVURigiaXBBc3NpZ25tZW50Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVVRGKGNvbmZpZy5pcEFzc2lnbm1lbnQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVUb0ZpbGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBVTkFTU0lHTkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJJZ25vcmUgaW52YWxpZCBpcCBhc3NpZ25tZW50IHdoaWxlIHdyaXRpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29uZmlnLnByb3h5U2V0dGluZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1RBVElDOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVURigicHJveHlTZXR0aW5ncyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVURihjb25maWcucHJveHlTZXR0aW5ncy50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBwcm94eSA9IGNvbmZpZy5wcm94eVByb3BlcnRpZXMuZ2V0U29ja2V0QWRkcmVzcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVURigicHJveHlIb3N0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVURihwcm94eS5nZXRIb3N0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVVRGKCJwcm94eVBvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlSW50KHByb3h5LmdldFBvcnQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleGNsdXNpb25MaXN0ID0gY29uZmlnLnByb3h5UHJvcGVydGllcy5nZXRFeGNsdXNpb25MaXN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGNsdXNpb25MaXN0ICE9IG51bGwgJiYgZXhjbHVzaW9uTGlzdC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVURigiZXhjbHVzaW9uTGlzdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVVRGKGV4Y2x1c2lvbkxpc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlVG9GaWxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTk9ORToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVVEYoInByb3h5U2V0dGluZ3MiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVVEYoY29uZmlnLnByb3h5U2V0dGluZ3MudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVUb0ZpbGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBVTkFTU0lHTkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJJZ25vcmUgaW52YWxpZCBwcm94eSBzZXR0aW5ncyB3aGlsZSB3cml0aW5nIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVUb0ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVURigiaWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUludChjb25maWdLZXkoY29uZmlnKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVVEYoIkVPUyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIHdyaXRpbmcgZGF0YSBmaWxlIik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZElwQW5kUHJveHlDb25maWd1cmF0aW9ucygpIHsKKworICAgICAgICBEYXRhSW5wdXRTdHJlYW0gaW4gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIGlwQ29uZmlnRmlsZSkpKTsKKworICAgICAgICAgICAgaWYgKGluLnJlYWRJbnQoKSAhPSBJUENPTkZJR19GSUxFX1ZFUlNJT04pIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJCYWQgdmVyc2lvbiBvbiBJUCBjb25maWd1cmF0aW9uIGZpbGUsIGlnbm9yZSByZWFkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGludCBpZCA9IC0xOworICAgICAgICAgICAgICAgIElwQXNzaWdubWVudCBpcEFzc2lnbm1lbnQgPSBJcEFzc2lnbm1lbnQuVU5BU1NJR05FRDsKKyAgICAgICAgICAgICAgICBEaGNwSW5mbyBpcENvbmZpZyA9IG5ldyBEaGNwSW5mbygpOworICAgICAgICAgICAgICAgIFByb3h5U2V0dGluZ3MgcHJveHlTZXR0aW5ncyA9IFByb3h5U2V0dGluZ3MuVU5BU1NJR05FRDsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJveHlIb3N0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpbnQgcHJveHlQb3J0ID0gLTE7CisgICAgICAgICAgICAgICAgU3RyaW5nIGV4Y2x1c2lvbkxpc3QgPSBudWxsOworICAgICAgICAgICAgICAgIFN0cmluZyBrZXk7CisKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGtleSA9IGluLnJlYWRVVEYoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5lcXVhbHMoImlkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoImlwQXNzaWdubWVudCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpcEFzc2lnbm1lbnQgPSBJcEFzc2lnbm1lbnQudmFsdWVPZihpbi5yZWFkVVRGKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoImlwQWRkcmVzcyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpcENvbmZpZy5pcEFkZHJlc3MgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscygiZ2F0ZXdheSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpcENvbmZpZy5nYXRld2F5ID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoIm5ldG1hc2siKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXBDb25maWcubmV0bWFzayA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKCJkbnMxIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlwQ29uZmlnLmRuczEgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscygiZG5zMiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpcENvbmZpZy5kbnMyID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoInByb3h5U2V0dGluZ3MiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlTZXR0aW5ncyA9IFByb3h5U2V0dGluZ3MudmFsdWVPZihpbi5yZWFkVVRGKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoInByb3h5SG9zdCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm94eUhvc3QgPSBpbi5yZWFkVVRGKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscygicHJveHlQb3J0IikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5UG9ydCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKCJleGNsdXNpb25MaXN0IikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1c2lvbkxpc3QgPSBpbi5yZWFkVVRGKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscygiRU9TIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSWdub3JlIHVua25vd24ga2V5ICIgKyBrZXkgKyAid2hpbGUgcmVhZGluZyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaWQgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgPSBzQ29uZmlndXJlZE5ldHdvcmtzLmdldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc05ldHdvcmtJZHMuZ2V0KGlkKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImNvbmZpZ3VyYXRpb24gZm91bmQgZm9yIG1pc3NpbmcgbmV0d29yaywgaWdub3JlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGlwQXNzaWdubWVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNUQVRJQzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5pcEFzc2lnbm1lbnQgPSBpcEFzc2lnbm1lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuaXBDb25maWcgPSBpcENvbmZpZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERIQ1A6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuaXBBc3NpZ25tZW50ID0gaXBBc3NpZ25tZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVU5BU1NJR05FRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSWdub3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIklnbm9yZSBpbnZhbGlkIGlwIGFzc2lnbm1lbnQgd2hpbGUgcmVhZGluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwcm94eVNldHRpbmdzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1RBVElDOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnByb3h5U2V0dGluZ3MgPSBwcm94eVNldHRpbmdzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJveHlQcm9wZXJ0aWVzIHByb3h5UHJvcGVydGllcyA9IG5ldyBQcm94eVByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5UHJvcGVydGllcy5zZXRTb2NrZXRBZGRyZXNzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5ldFNvY2tldEFkZHJlc3MocHJveHlIb3N0LCBwcm94eVBvcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5UHJvcGVydGllcy5zZXRFeGNsdXNpb25MaXN0KGV4Y2x1c2lvbkxpc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnByb3h5UHJvcGVydGllcyA9IHByb3h5UHJvcGVydGllczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5PTkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcucHJveHlTZXR0aW5ncyA9IHByb3h5U2V0dGluZ3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBVTkFTU0lHTkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSWdub3JlIGludmFsaWQgcHJveHkgc2V0dGluZ3Mgd2hpbGUgcmVhZGluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCJNaXNzaW5nIGlkIHdoaWxlIHBhcnNpbmcgY29uZmlndXJhdGlvbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgcGFyc2luZyBjb25maWd1cmF0aW9uIik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgYWRkT3JVcGRhdGVOZXR3b3JrTmF0aXZlKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGUgc3VwcGxpZWQgbmV0d29ya0lkIGlzIElOVkFMSURfTkVUV09SS19JRCwgd2UgY3JlYXRlIGEgbmV3IGVtcHR5CisgICAgICAgICAqIG5ldHdvcmsgY29uZmlndXJhdGlvbi4gT3RoZXJ3aXNlLCB0aGUgbmV0d29ya0lkIHNob3VsZAorICAgICAgICAgKiByZWZlciB0byBhbiBleGlzdGluZyBjb25maWd1cmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IG5ldElkID0gY29uZmlnLm5ldHdvcmtJZDsKKyAgICAgICAgYm9vbGVhbiB1cGRhdGVGYWlsZWQgPSB0cnVlOworICAgICAgICBib29sZWFuIG5ld05ldHdvcmsgPSAobmV0SWQgPT0gSU5WQUxJRF9ORVRXT1JLX0lEKTsKKyAgICAgICAgLy8gbmV0d29ya0lkIG9mIElOVkFMSURfTkVUV09SS19JRCBtZWFucyB3ZSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBuZXR3b3JrCisKKyAgICAgICAgaWYgKG5ld05ldHdvcmspIHsKKyAgICAgICAgICAgIG5ldElkID0gV2lmaU5hdGl2ZS5hZGROZXR3b3JrQ29tbWFuZCgpOworICAgICAgICAgICAgaWYgKG5ldElkIDwgMCkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBhZGQgYSBuZXR3b3JrISIpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX05FVFdPUktfSUQ7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2V0VmFyaWFibGVzOiB7CisKKyAgICAgICAgICAgIGlmIChjb25maWcuU1NJRCAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgICFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLnNzaWRWYXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLlNTSUQpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBTU0lEOiAiK2NvbmZpZy5TU0lEKTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25maWcuQlNTSUQgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5ic3NpZFZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuQlNTSUQpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBCU1NJRDogIitjb25maWcuQlNTSUQpOworICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRLZXlNYW5hZ2VtZW50U3RyaW5nID0KKyAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudCwgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC5zdHJpbmdzKTsKKyAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuY2FyZGluYWxpdHkoKSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQudmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRLZXlNYW5hZ2VtZW50U3RyaW5nKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQga2V5X21nbXQ6ICIrCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkS2V5TWFuYWdlbWVudFN0cmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYWxsb3dlZFByb3RvY29sc1N0cmluZyA9CisgICAgICAgICAgICAgICAgbWFrZVN0cmluZyhjb25maWcuYWxsb3dlZFByb3RvY29scywgV2lmaUNvbmZpZ3VyYXRpb24uUHJvdG9jb2wuc3RyaW5ncyk7CisgICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRQcm90b2NvbHMuY2FyZGluYWxpdHkoKSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLlByb3RvY29sLnZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkUHJvdG9jb2xzU3RyaW5nKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgcHJvdG86ICIrCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkUHJvdG9jb2xzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBhbGxvd2VkQXV0aEFsZ29yaXRobXNTdHJpbmcgPQorICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRBdXRoQWxnb3JpdGhtcywgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS5zdHJpbmdzKTsKKyAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZEF1dGhBbGdvcml0aG1zLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5BdXRoQWxnb3JpdGhtLnZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQXV0aEFsZ29yaXRobXNTdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBhdXRoX2FsZzogIisKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRBdXRoQWxnb3JpdGhtc1N0cmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYWxsb3dlZFBhaXJ3aXNlQ2lwaGVyc1N0cmluZyA9CisgICAgICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRQYWlyd2lzZUNpcGhlcnMsCisgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLlBhaXJ3aXNlQ2lwaGVyLnN0cmluZ3MpOworICAgICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkUGFpcndpc2VDaXBoZXJzLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5QYWlyd2lzZUNpcGhlci52YXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFBhaXJ3aXNlQ2lwaGVyc1N0cmluZykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IHBhaXJ3aXNlOiAiKworICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFBhaXJ3aXNlQ2lwaGVyc1N0cmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYWxsb3dlZEdyb3VwQ2lwaGVyc1N0cmluZyA9CisgICAgICAgICAgICAgICAgbWFrZVN0cmluZyhjb25maWcuYWxsb3dlZEdyb3VwQ2lwaGVycywgV2lmaUNvbmZpZ3VyYXRpb24uR3JvdXBDaXBoZXIuc3RyaW5ncyk7CisgICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRHcm91cENpcGhlcnMuY2FyZGluYWxpdHkoKSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkR3JvdXBDaXBoZXJzU3RyaW5nKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgZ3JvdXA6ICIrCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkR3JvdXBDaXBoZXJzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFByZXZlbnQgY2xpZW50IHNjcmV3LXVwIGJ5IHBhc3NpbmcgaW4gYSBXaWZpQ29uZmlndXJhdGlvbiB3ZSBnYXZlIGl0CisgICAgICAgICAgICAvLyBieSBwcmV2ZW50aW5nICIqIiBhcyBhIGtleS4KKyAgICAgICAgICAgIGlmIChjb25maWcucHJlU2hhcmVkS2V5ICE9IG51bGwgJiYgIWNvbmZpZy5wcmVTaGFyZWRLZXkuZXF1YWxzKCIqIikgJiYKKyAgICAgICAgICAgICAgICAgICAgIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ucHNrVmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wcmVTaGFyZWRLZXkpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBwc2s6ICIrY29uZmlnLnByZVNoYXJlZEtleSk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sZWFuIGhhc1NldEtleSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGNvbmZpZy53ZXBLZXlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZy53ZXBLZXlzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgY2xpZW50IHNjcmV3LXVwIGJ5IHBhc3NpbmcgaW4gYSBXaWZpQ29uZmlndXJhdGlvbiB3ZSBnYXZlIGl0CisgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHByZXZlbnRpbmcgIioiIGFzIGEga2V5LgorICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLndlcEtleXNbaV0gIT0gbnVsbCAmJiAhY29uZmlnLndlcEtleXNbaV0uZXF1YWxzKCIqIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi53ZXBLZXlWYXJOYW1lc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc2V0IHdlcF9rZXkiK2krIjogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaGFzU2V0S2V5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGhhc1NldEtleSkgeworICAgICAgICAgICAgICAgIGlmICghV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLndlcFR4S2V5SWR4VmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGNvbmZpZy53ZXBUeEtleUluZGV4KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc2V0IHdlcF90eF9rZXlpZHg6ICIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLndlcFR4S2V5SW5kZXgpOworICAgICAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ucHJpb3JpdHlWYXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhjb25maWcucHJpb3JpdHkpKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY29uZmlnLlNTSUQgKyAiOiBmYWlsZWQgdG8gc2V0IHByaW9yaXR5OiAiCisgICAgICAgICAgICAgICAgICAgICAgICArY29uZmlnLnByaW9yaXR5KTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25maWcuaGlkZGVuU1NJRCAmJiAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5oaWRkZW5TU0lEVmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoY29uZmlnLmhpZGRlblNTSUQgPyAxIDogMCkpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjb25maWcuU1NJRCArICI6IGZhaWxlZCB0byBzZXQgaGlkZGVuU1NJRDogIisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5oaWRkZW5TU0lEKTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoV2lmaUNvbmZpZ3VyYXRpb24uRW50ZXJwcmlzZUZpZWxkIGZpZWxkCisgICAgICAgICAgICAgICAgICAgIDogY29uZmlnLmVudGVycHJpc2VGaWVsZHMpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFyTmFtZSA9IGZpZWxkLnZhck5hbWUoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBmaWVsZC52YWx1ZSgpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZCAhPSBjb25maWcuZWFwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSA/ICJOVUxMIiA6IGNvbnZlcnRUb1F1b3RlZFN0cmluZyh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY29uZmlnLlNTSUQgKyAiOiBmYWlsZWQgdG8gc2V0ICIgKyB2YXJOYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogIiArIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZUZhaWxlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHVwZGF0ZUZhaWxlZCkgeworICAgICAgICAgICAgaWYgKG5ld05ldHdvcmspIHsKKyAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnJlbW92ZU5ldHdvcmtDb21tYW5kKG5ldElkKTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBhIG5ldHdvcmsgdmFyaWFibGUsIHJlbW92ZWQgbmV0d29yazogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXRJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9ORVRXT1JLX0lEOworICAgICAgICB9CisKKyAgICAgICAgLyogQW4gdXBkYXRlIG9mIHRoZSBuZXR3b3JrIHZhcmlhYmxlcyByZXF1aXJlcyByZWFkaW5nIHRoZW0KKyAgICAgICAgICogYmFjayBmcm9tIHRoZSBzdXBwbGljYW50IHRvIHVwZGF0ZSBzQ29uZmlndXJlZE5ldHdvcmtzLgorICAgICAgICAgKiBUaGlzIGlzIGJlY2F1c2Ugc29tZSBvZiB0aGUgdmFyaWFibGVzIChTU0lELCB3ZXAga2V5cyAmCisgICAgICAgICAqIHBhc3NwaHJhc2VzKSByZWZsZWN0IGRpZmZlcmVudCB2YWx1ZXMgd2hlbiByZWFkIGJhY2sgdGhhbgorICAgICAgICAgKiB3aGVuIHdyaXR0ZW4uIEZvciBleGFtcGxlLCB3ZXAga2V5IGlzIHN0b3JlZCBhcyAqIGlycmVzcGVjdGl2ZQorICAgICAgICAgKiBvZiB0aGUgdmFsdWUgc2VudCB0byB0aGUgc3VwcGxpY2FudAorICAgICAgICAgKi8KKyAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gc0NvbmZpZzsKKyAgICAgICAgc3luY2hyb25pemVkIChzQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICBzQ29uZmlnID0gc0NvbmZpZ3VyZWROZXR3b3Jrcy5nZXQobmV0SWQpOworICAgICAgICB9CisgICAgICAgIGlmIChzQ29uZmlnID09IG51bGwpIHsKKyAgICAgICAgICAgIHNDb25maWcgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgIHNDb25maWcubmV0d29ya0lkID0gbmV0SWQ7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgICAgICBzQ29uZmlndXJlZE5ldHdvcmtzLnB1dChuZXRJZCwgc0NvbmZpZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVhZE5ldHdvcmtWYXJpYWJsZXMoc0NvbmZpZyk7CisgICAgICAgIHdyaXRlSXBBbmRQcm94eUNvbmZpZ3VyYXRpb25zT25DaGFuZ2Uoc0NvbmZpZywgY29uZmlnKTsKKyAgICAgICAgcmV0dXJuIG5ldElkOworICAgIH0KKworICAgIC8qIENvbXBhcmUgY3VycmVudCBhbmQgbmV3IGNvbmZpZ3VyYXRpb24gYW5kIHdyaXRlIHRvIGZpbGUgb24gY2hhbmdlICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZUlwQW5kUHJveHlDb25maWd1cmF0aW9uc09uQ2hhbmdlKFdpZmlDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcsCisgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgYm9vbGVhbiBuZXdOZXR3b3JrID0gKG5ld0NvbmZpZy5uZXR3b3JrSWQgPT0gSU5WQUxJRF9ORVRXT1JLX0lEKTsKKyAgICAgICAgYm9vbGVhbiB3cml0ZUNvbmZpZ1RvRmlsZSA9IGZhbHNlOworCisgICAgICAgIGlmIChuZXdDb25maWcuaXBBc3NpZ25tZW50ICE9IElwQXNzaWdubWVudC5VTkFTU0lHTkVEKSB7CisgICAgICAgICAgICBpZiAobmV3TmV0d29yayB8fAorICAgICAgICAgICAgICAgICAgICAoY3VycmVudENvbmZpZy5pcEFzc2lnbm1lbnQgIT0gbmV3Q29uZmlnLmlwQXNzaWdubWVudCkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRDb25maWcuaXBDb25maWcuaXBBZGRyZXNzICE9IG5ld0NvbmZpZy5pcENvbmZpZy5pcEFkZHJlc3MpIHx8CisgICAgICAgICAgICAgICAgICAgIChjdXJyZW50Q29uZmlnLmlwQ29uZmlnLmdhdGV3YXkgIT0gbmV3Q29uZmlnLmlwQ29uZmlnLmdhdGV3YXkpIHx8CisgICAgICAgICAgICAgICAgICAgIChjdXJyZW50Q29uZmlnLmlwQ29uZmlnLm5ldG1hc2sgIT0gbmV3Q29uZmlnLmlwQ29uZmlnLm5ldG1hc2spIHx8CisgICAgICAgICAgICAgICAgICAgIChjdXJyZW50Q29uZmlnLmlwQ29uZmlnLmRuczEgIT0gbmV3Q29uZmlnLmlwQ29uZmlnLmRuczEpIHx8CisgICAgICAgICAgICAgICAgICAgIChjdXJyZW50Q29uZmlnLmlwQ29uZmlnLmRuczIgIT0gbmV3Q29uZmlnLmlwQ29uZmlnLmRuczIpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudENvbmZpZy5pcEFzc2lnbm1lbnQgPSBuZXdDb25maWcuaXBBc3NpZ25tZW50OworICAgICAgICAgICAgICAgIGN1cnJlbnRDb25maWcuaXBDb25maWcgPSBuZXdDb25maWcuaXBDb25maWc7CisgICAgICAgICAgICAgICAgd3JpdGVDb25maWdUb0ZpbGUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld0NvbmZpZy5wcm94eVNldHRpbmdzICE9IFByb3h5U2V0dGluZ3MuVU5BU1NJR05FRCkgeworICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgbmV3U29ja0FkZHIgPSBuZXdDb25maWcucHJveHlQcm9wZXJ0aWVzLmdldFNvY2tldEFkZHJlc3MoKTsKKyAgICAgICAgICAgIFN0cmluZyBuZXdFeGNsdXNpb25MaXN0ID0gbmV3Q29uZmlnLnByb3h5UHJvcGVydGllcy5nZXRFeGNsdXNpb25MaXN0KCk7CisKKyAgICAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIGN1cnJlbnRTb2NrQWRkciA9IGN1cnJlbnRDb25maWcucHJveHlQcm9wZXJ0aWVzLmdldFNvY2tldEFkZHJlc3MoKTsKKyAgICAgICAgICAgIFN0cmluZyBjdXJyZW50RXhjbHVzaW9uTGlzdCA9IGN1cnJlbnRDb25maWcucHJveHlQcm9wZXJ0aWVzLmdldEV4Y2x1c2lvbkxpc3QoKTsKKworICAgICAgICAgICAgYm9vbGVhbiBzb2NrZXRBZGRyZXNzRGlmZmVycyA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBleGNsdXNpb25MaXN0RGlmZmVycyA9IGZhbHNlOworCisgICAgICAgICAgICBpZiAobmV3U29ja0FkZHIgIT0gbnVsbCAmJiBjdXJyZW50U29ja0FkZHIgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICBzb2NrZXRBZGRyZXNzRGlmZmVycyA9ICFjdXJyZW50U29ja0FkZHIuZXF1YWxzKG5ld1NvY2tBZGRyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U29ja0FkZHIgIT0gbnVsbCB8fCBjdXJyZW50U29ja0FkZHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNvY2tldEFkZHJlc3NEaWZmZXJzID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5ld0V4Y2x1c2lvbkxpc3QgIT0gbnVsbCAmJiBjdXJyZW50RXhjbHVzaW9uTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXhjbHVzaW9uTGlzdERpZmZlcnMgPSBjdXJyZW50RXhjbHVzaW9uTGlzdC5lcXVhbHMobmV3RXhjbHVzaW9uTGlzdCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld0V4Y2x1c2lvbkxpc3QgIT0gbnVsbCB8fCBjdXJyZW50RXhjbHVzaW9uTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXhjbHVzaW9uTGlzdERpZmZlcnMgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmV3TmV0d29yayB8fAorICAgICAgICAgICAgICAgICAgICAoY3VycmVudENvbmZpZy5wcm94eVNldHRpbmdzICE9IG5ld0NvbmZpZy5wcm94eVNldHRpbmdzKSB8fAorICAgICAgICAgICAgICAgICAgICBzb2NrZXRBZGRyZXNzRGlmZmVycyB8fAorICAgICAgICAgICAgICAgICAgICBleGNsdXNpb25MaXN0RGlmZmVycykgeworICAgICAgICAgICAgICAgIGN1cnJlbnRDb25maWcucHJveHlTZXR0aW5ncyA9IG5ld0NvbmZpZy5wcm94eVNldHRpbmdzOworICAgICAgICAgICAgICAgIGN1cnJlbnRDb25maWcucHJveHlQcm9wZXJ0aWVzID0gbmV3Q29uZmlnLnByb3h5UHJvcGVydGllczsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJwcm94eSBjaGFuZ2UgU1NJRCA9ICIgKyBjdXJyZW50Q29uZmlnLlNTSUQgKyAiIHByb3h5UHJvcGVydGllczogIiArCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29uZmlnLnByb3h5UHJvcGVydGllcy50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB3cml0ZUNvbmZpZ1RvRmlsZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAod3JpdGVDb25maWdUb0ZpbGUpIHsKKyAgICAgICAgICAgIHdyaXRlSXBBbmRQcm94eUNvbmZpZ3VyYXRpb25zKCk7CisgICAgICAgICAgICBzZW5kQ29uZmlnQ2hhbmdlQnJvYWRjYXN0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSB2YXJpYWJsZXMgZnJvbSB0aGUgc3VwcGxpY2FudCBkYWVtb24gdGhhdCBhcmUgbmVlZGVkIHRvCisgICAgICogZmlsbCBpbiB0aGUgV2lmaUNvbmZpZ3VyYXRpb24gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyB0aGUge0BsaW5rIFdpZmlDb25maWd1cmF0aW9ufSBvYmplY3QgdG8gYmUgZmlsbGVkIGluLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZE5ldHdvcmtWYXJpYWJsZXMoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisKKyAgICAgICAgaW50IG5ldElkID0gY29uZmlnLm5ldHdvcmtJZDsKKyAgICAgICAgaWYgKG5ldElkIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvKgorICAgICAgICAgKiBUT0RPOiBtYXliZSBzaG91bGQgaGF2ZSBhIG5hdGl2ZSBtZXRob2QgdGhhdCB0YWtlcyBhbiBhcnJheSBvZgorICAgICAgICAgKiB2YXJpYWJsZSBuYW1lcyBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB2YWx1ZXMuIEJ1dCB3ZSdkIHN0aWxsCisgICAgICAgICAqIGJlIGRvaW5nIGEgcm91bmQgdHJpcCB0byB0aGUgc3VwcGxpY2FudCBkYWVtb24gZm9yIGVhY2ggdmFyaWFibGUuCisgICAgICAgICAqLworICAgICAgICBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLnNzaWRWYXJOYW1lKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIGNvbmZpZy5TU0lEID0gcmVtb3ZlRG91YmxlUXVvdGVzKHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbmZpZy5TU0lEID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5ic3NpZFZhck5hbWUpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgY29uZmlnLkJTU0lEID0gdmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25maWcuQlNTSUQgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLnByaW9yaXR5VmFyTmFtZSk7CisgICAgICAgIGNvbmZpZy5wcmlvcml0eSA9IC0xOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25maWcucHJpb3JpdHkgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5oaWRkZW5TU0lEVmFyTmFtZSk7CisgICAgICAgIGNvbmZpZy5oaWRkZW5TU0lEID0gZmFsc2U7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbmZpZy5oaWRkZW5TU0lEID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSkgIT0gMDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi53ZXBUeEtleUlkeFZhck5hbWUpOworICAgICAgICBjb25maWcud2VwVHhLZXlJbmRleCA9IC0xOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25maWcud2VwVHhLZXlJbmRleCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLAorICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi53ZXBLZXlWYXJOYW1lc1tpXSk7CisgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldID0gdmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5wc2tWYXJOYW1lKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIGNvbmZpZy5wcmVTaGFyZWRLZXkgPSB2YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbmZpZy5wcmVTaGFyZWRLZXkgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoY29uZmlnLm5ldHdvcmtJZCwKKyAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC52YXJOYW1lKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9CisgICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLlByb3RvY29sLnN0cmluZ3MpOworICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkUHJvdG9jb2xzLnNldChpbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoY29uZmlnLm5ldHdvcmtJZCwKKyAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5LZXlNZ210LnZhck5hbWUpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC5zdHJpbmdzKTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuc2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChjb25maWcubmV0d29ya0lkLAorICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLkF1dGhBbGdvcml0aG0udmFyTmFtZSk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsc1tdID0gdmFsdWUuc3BsaXQoIiAiKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbCA6IHZhbHMpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPQorICAgICAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmcodmFsLCBXaWZpQ29uZmlndXJhdGlvbi5BdXRoQWxnb3JpdGhtLnN0cmluZ3MpOworICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkQXV0aEFsZ29yaXRobXMuc2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChjb25maWcubmV0d29ya0lkLAorICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLlBhaXJ3aXNlQ2lwaGVyLnZhck5hbWUpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uUGFpcndpc2VDaXBoZXIuc3RyaW5ncyk7CisgICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRQYWlyd2lzZUNpcGhlcnMuc2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChjb25maWcubmV0d29ya0lkLAorICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnZhck5hbWUpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uR3JvdXBDaXBoZXIuc3RyaW5ncyk7CisgICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRHcm91cENpcGhlcnMuc2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uLkVudGVycHJpc2VGaWVsZCBmaWVsZCA6CisgICAgICAgICAgICAgICAgY29uZmlnLmVudGVycHJpc2VGaWVsZHMpIHsKKyAgICAgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLAorICAgICAgICAgICAgICAgICAgICBmaWVsZC52YXJOYW1lKCkpOworICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmllbGQgIT0gY29uZmlnLmVhcCkgdmFsdWUgPSByZW1vdmVEb3VibGVRdW90ZXModmFsdWUpOworICAgICAgICAgICAgICAgIGZpZWxkLnNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZW1vdmVEb3VibGVRdW90ZXMoU3RyaW5nIHN0cmluZykgeworICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aCgpIDw9IDIpIHJldHVybiAiIjsKKyAgICAgICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMSwgc3RyaW5nLmxlbmd0aCgpIC0gMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1F1b3RlZFN0cmluZyhTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIHJldHVybiAiXCIiICsgc3RyaW5nICsgIlwiIjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWFrZVN0cmluZyhCaXRTZXQgc2V0LCBTdHJpbmdbXSBzdHJpbmdzKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGludCBuZXh0U2V0Qml0ID0gLTE7CisKKyAgICAgICAgLyogTWFrZSBzdXJlIGFsbCBzZXQgYml0cyBhcmUgaW4gWzAsIHN0cmluZ3MubGVuZ3RoKSB0byBhdm9pZAorICAgICAgICAgKiBnb2luZyBvdXQgb2YgYm91bmRzIG9uIHN0cmluZ3MuICAoU2hvdWxkbid0IGhhcHBlbiwgYnV0Li4uKSAqLworICAgICAgICBzZXQgPSBzZXQuZ2V0KDAsIHN0cmluZ3MubGVuZ3RoKTsKKworICAgICAgICB3aGlsZSAoKG5leHRTZXRCaXQgPSBzZXQubmV4dFNldEJpdChuZXh0U2V0Qml0ICsgMSkpICE9IC0xKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKHN0cmluZ3NbbmV4dFNldEJpdF0ucmVwbGFjZSgnXycsICctJykpLmFwcGVuZCgnICcpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHNwYWNlCisgICAgICAgIGlmIChzZXQuY2FyZGluYWxpdHkoKSA+IDApIHsKKyAgICAgICAgICAgIGJ1Zi5zZXRMZW5ndGgoYnVmLmxlbmd0aCgpIC0gMSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGxvb2t1cFN0cmluZyhTdHJpbmcgc3RyaW5nLCBTdHJpbmdbXSBzdHJpbmdzKSB7CisgICAgICAgIGludCBzaXplID0gc3RyaW5ncy5sZW5ndGg7CisKKyAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoJy0nLCAnXycpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICAgICAgaWYgKHN0cmluZy5lcXVhbHMoc3RyaW5nc1tpXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisKKyAgICAgICAgLy8gaWYgd2UgZXZlciBnZXQgaGVyZSwgd2Ugc2hvdWxkIHByb2JhYmx5IGFkZCB0aGUKKyAgICAgICAgLy8gdmFsdWUgdG8gV2lmaUNvbmZpZ3VyYXRpb24gdG8gcmVmbGVjdCB0aGF0IGl0J3MKKyAgICAgICAgLy8gc3VwcG9ydGVkIGJ5IHRoZSBXUEEgc3VwcGxpY2FudAorICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gbG9vay11cCBhIHN0cmluZzogIiArIHN0cmluZyk7CisKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIFJldHVybnMgYSB1bmlxdWUgZm9yIGEgZ2l2ZW4gY29uZmlndXJhdGlvbiAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBjb25maWdLZXkoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIFN0cmluZyBrZXk7CisKKyAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudC5nZXQoS2V5TWdtdC5XUEFfUFNLKSkgeworICAgICAgICAgICAga2V5ID0gY29uZmlnLlNTSUQgKyBLZXlNZ210LnN0cmluZ3NbS2V5TWdtdC5XUEFfUFNLXTsKKyAgICAgICAgfSBlbHNlIGlmIChjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuZ2V0KEtleU1nbXQuV1BBX0VBUCkgfHwKKyAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuZ2V0KEtleU1nbXQuSUVFRTgwMjFYKSkgeworICAgICAgICAgICAga2V5ID0gY29uZmlnLlNTSUQgKyBLZXlNZ210LnN0cmluZ3NbS2V5TWdtdC5XUEFfRUFQXTsKKyAgICAgICAgfSBlbHNlIGlmIChjb25maWcud2VwS2V5c1swXSAhPSBudWxsKSB7CisgICAgICAgICAgICBrZXkgPSBjb25maWcuU1NJRCArICJXRVAiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAga2V5ID0gY29uZmlnLlNTSUQgKyBLZXlNZ210LnN0cmluZ3NbS2V5TWdtdC5OT05FXTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBrZXkuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIGR1bXAoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgU3RyaW5nIExTID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworICAgICAgICBzYi5hcHBlbmQoInNMYXN0UHJpb3JpdHkgIikuYXBwZW5kKHNMYXN0UHJpb3JpdHkpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgiQ29uZmlndXJlZCBuZXR3b3JrcyAiKS5hcHBlbmQoTFMpOworICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uIGNvbmYgOiBnZXRDb25maWd1cmVkTmV0d29ya3MoKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKGNvbmYpLmFwcGVuZChMUyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaUNvbmZpZ3VyYXRpb24uamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWd1cmF0aW9uLmphdmEKaW5kZXggMDFiYzkxOS4uYzRhMTMxMCAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaUNvbmZpZ3VyYXRpb24uamF2YQorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5uZXQud2lmaTsKIAoraW1wb3J0IGFuZHJvaWQubmV0LkRoY3BJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0LlByb3h5UHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiAKQEAgLTQyLDYgKzQ0LDggQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBwcmlvcml0eVZhck5hbWUgPSAicHJpb3JpdHkiOwogICAgIC8qKiB7QGhpZGV9ICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgaGlkZGVuU1NJRFZhck5hbWUgPSAic2Nhbl9zc2lkIjsKKyAgICAvKioge0BoaWRlfSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfTkVUV09SS19JRCA9IC0xOwogCiAgICAgLyoqIHtAaGlkZX0gKi8KICAgICBwdWJsaWMgY2xhc3MgRW50ZXJwcmlzZUZpZWxkIHsKQEAgLTIxNiw3ICsyMjAsNyBAQAogICAgIC8qKgogICAgICAqIFRoZSBuZXR3b3JrJ3MgU1NJRC4gQ2FuIGVpdGhlciBiZSBhbiBBU0NJSSBzdHJpbmcsCiAgICAgICogd2hpY2ggbXVzdCBiZSBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGF0aW9uIG1hcmtzCi0gICAgICogKGUuZy4sIHtAY29kZSAmcXVvdDtNeU5ldHdvcmsmcXVvdDt9LCBvciBhIHN0cmluZyBvZgorICAgICAqIChlLmcuLCB7QGNvZGUgIk15TmV0d29yayJ9LCBvciBhIHN0cmluZyBvZgogICAgICAqIGhleCBkaWdpdHMsd2hpY2ggYXJlIG5vdCBlbmNsb3NlZCBpbiBxdW90ZXMKICAgICAgKiAoZS5nLiwge0Bjb2RlIDAxYTI0M2Y0MDV9KS4KICAgICAgKi8KQEAgLTIzOSw3ICsyNDMsNyBAQAogICAgIHB1YmxpYyBTdHJpbmcgcHJlU2hhcmVkS2V5OwogICAgIC8qKgogICAgICAqIFVwIHRvIGZvdXIgV0VQIGtleXMuIEVpdGhlciBhbiBBU0NJSSBzdHJpbmcgZW5jbG9zZWQgaW4gZG91YmxlCi0gICAgICogcXVvdGF0aW9uIG1hcmtzIChlLmcuLCB7QGNvZGUgJnF1b3Q7YWJjZGVmJnF1b3Q7fSBvciBhIHN0cmluZworICAgICAqIHF1b3RhdGlvbiBtYXJrcyAoZS5nLiwge0Bjb2RlICJhYmNkZWYifSBvciBhIHN0cmluZwogICAgICAqIG9mIGhleCBkaWdpdHMgKGUuZy4sIHtAY29kZSAwMTAyMDMwNDA1fSkuCiAgICAgICogPHAvPgogICAgICAqIFdoZW4gdGhlIHZhbHVlIG9mIG9uZSBvZiB0aGVzZSBrZXlzIGlzIHJlYWQsIHRoZSBhY3R1YWwga2V5IGlzCkBAIC0yOTQsOSArMjk4LDUzIEBACiAgICAgICovCiAgICAgcHVibGljIEJpdFNldCBhbGxvd2VkR3JvdXBDaXBoZXJzOwogCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZW51bSBJcEFzc2lnbm1lbnQgeworICAgICAgICAvKiBVc2Ugc3RhdGljYWxseSBjb25maWd1cmVkIElQIHNldHRpbmdzLiBDb25maWd1cmF0aW9uIGNhbiBiZSBhY2Nlc3NlZAorICAgICAgICAgKiB3aXRoIGlwQ29uZmlnICovCisgICAgICAgIFNUQVRJQywKKyAgICAgICAgLyogVXNlIGR5bmFtaWNhbGx5IGNvbmZpZ3VyZWQgSVAgc2V0dGlnbnMgKi8KKyAgICAgICAgREhDUCwKKyAgICAgICAgLyogbm8gSVAgZGV0YWlscyBhcmUgYXNzaWduZWQsIHRoaXMgaXMgdXNlZCB0byBpbmRpY2F0ZQorICAgICAgICAgKiB0aGF0IGFueSBleGlzdGluZyBJUCBzZXR0aW5ncyBzaG91bGQgYmUgcmV0YWluZWQgKi8KKyAgICAgICAgVU5BU1NJR05FRAorICAgIH0KKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBJcEFzc2lnbm1lbnQgaXBBc3NpZ25tZW50OworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIERoY3BJbmZvIGlwQ29uZmlnOworCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZW51bSBQcm94eVNldHRpbmdzIHsKKyAgICAgICAgLyogTm8gcHJveHkgaXMgdG8gYmUgdXNlZC4gQW55IGV4aXN0aW5nIHByb3h5IHNldHRpbmdzCisgICAgICAgICAqIHNob3VsZCBiZSBjbGVhcmVkLiAqLworICAgICAgICBOT05FLAorICAgICAgICAvKiBVc2Ugc3RhdGljYWxseSBjb25maWd1cmVkIHByb3h5LiBDb25maWd1cmF0aW9uIGNhbiBiZSBhY2Nlc3NlZAorICAgICAgICAgKiB3aXRoIHByb3h5UHJvcGVydGllcyAqLworICAgICAgICBTVEFUSUMsCisgICAgICAgIC8qIG5vIHByb3h5IGRldGFpbHMgYXJlIGFzc2lnbmVkLCB0aGlzIGlzIHVzZWQgdG8gaW5kaWNhdGUKKyAgICAgICAgICogdGhhdCBhbnkgZXhpc3RpbmcgcHJveHkgc2V0dGluZ3Mgc2hvdWxkIGJlIHJldGFpbmVkICovCisgICAgICAgIFVOQVNTSUdORUQKKyAgICB9CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJveHlTZXR0aW5ncyBwcm94eVNldHRpbmdzOworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIFByb3h5UHJvcGVydGllcyBwcm94eVByb3BlcnRpZXM7CiAKICAgICBwdWJsaWMgV2lmaUNvbmZpZ3VyYXRpb24oKSB7Ci0gICAgICAgIG5ldHdvcmtJZCA9IC0xOworICAgICAgICBuZXR3b3JrSWQgPSBJTlZBTElEX05FVFdPUktfSUQ7CiAgICAgICAgIFNTSUQgPSBudWxsOwogICAgICAgICBCU1NJRCA9IG51bGw7CiAgICAgICAgIHByaW9yaXR5ID0gMDsKQEAgLTMxMiw2ICszNjAsMTAgQEAKICAgICAgICAgZm9yIChFbnRlcnByaXNlRmllbGQgZmllbGQgOiBlbnRlcnByaXNlRmllbGRzKSB7CiAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShudWxsKTsKICAgICAgICAgfQorICAgICAgICBpcEFzc2lnbm1lbnQgPSBJcEFzc2lnbm1lbnQuVU5BU1NJR05FRDsKKyAgICAgICAgaXBDb25maWcgPSBuZXcgRGhjcEluZm8oKTsKKyAgICAgICAgcHJveHlTZXR0aW5ncyA9IFByb3h5U2V0dGluZ3MuVU5BU1NJR05FRDsKKyAgICAgICAgcHJveHlQcm9wZXJ0aWVzID0gbmV3IFByb3h5UHJvcGVydGllcygpOwogICAgIH0KIAogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC0zOTMsNiArNDQ1LDE3IEBACiAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgc2J1Zi5hcHBlbmQodmFsdWUpOwogICAgICAgICB9CiAgICAgICAgIHNidWYuYXBwZW5kKCdcbicpOworICAgICAgICBpZiAoaXBBc3NpZ25tZW50ID09IElwQXNzaWdubWVudC5TVEFUSUMpIHsKKyAgICAgICAgICAgIHNidWYuYXBwZW5kKCIgIikuYXBwZW5kKCJTdGF0aWMgSVAgY29uZmlndXJhdGlvbjoiKS5hcHBlbmQoJ1xuJyk7CisgICAgICAgICAgICBzYnVmLmFwcGVuZCgiICIpLmFwcGVuZChpcENvbmZpZyk7CisgICAgICAgIH0KKyAgICAgICAgc2J1Zi5hcHBlbmQoJ1xuJyk7CisKKyAgICAgICAgaWYgKHByb3h5U2V0dGluZ3MgPT0gUHJveHlTZXR0aW5ncy5TVEFUSUMpIHsKKyAgICAgICAgICAgIHNidWYuYXBwZW5kKCIgIikuYXBwZW5kKCJQcm94eSBjb25maWd1cmF0aW9uOiIpLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgICAgIHNidWYuYXBwZW5kKCIgIikuYXBwZW5kKHByb3h5UHJvcGVydGllcyk7CisgICAgICAgIH0KKyAgICAgICAgc2J1Zi5hcHBlbmQoJ1xuJyk7CiAgICAgICAgIHJldHVybiBzYnVmLnRvU3RyaW5nKCk7CiAgICAgfQogCkBAIC00MzIsNiArNDk1LDM4IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAorICAgIC8qKiBjb3B5IGNvbnN0cnVjdG9yIHtAaGlkZX0gKi8KKyAgICBwdWJsaWMgV2lmaUNvbmZpZ3VyYXRpb24oV2lmaUNvbmZpZ3VyYXRpb24gc291cmNlKSB7CisgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgbmV0d29ya0lkID0gc291cmNlLm5ldHdvcmtJZDsKKyAgICAgICAgICAgIHN0YXR1cyA9IHNvdXJjZS5zdGF0dXM7CisgICAgICAgICAgICBTU0lEID0gc291cmNlLlNTSUQ7CisgICAgICAgICAgICBCU1NJRCA9IHNvdXJjZS5CU1NJRDsKKyAgICAgICAgICAgIHByZVNoYXJlZEtleSA9IHNvdXJjZS5wcmVTaGFyZWRLZXk7CisKKyAgICAgICAgICAgIHdlcEtleXMgPSBuZXcgU3RyaW5nWzRdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3ZXBLZXlzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHdlcEtleXNbaV0gPSBzb3VyY2Uud2VwS2V5c1tpXTsKKworICAgICAgICAgICAgd2VwVHhLZXlJbmRleCA9IHNvdXJjZS53ZXBUeEtleUluZGV4OworICAgICAgICAgICAgcHJpb3JpdHkgPSBzb3VyY2UucHJpb3JpdHk7CisgICAgICAgICAgICBoaWRkZW5TU0lEID0gc291cmNlLmhpZGRlblNTSUQ7CisgICAgICAgICAgICBhbGxvd2VkS2V5TWFuYWdlbWVudCAgID0gKEJpdFNldCkgc291cmNlLmFsbG93ZWRLZXlNYW5hZ2VtZW50LmNsb25lKCk7CisgICAgICAgICAgICBhbGxvd2VkUHJvdG9jb2xzICAgICAgID0gKEJpdFNldCkgc291cmNlLmFsbG93ZWRQcm90b2NvbHMuY2xvbmUoKTsKKyAgICAgICAgICAgIGFsbG93ZWRBdXRoQWxnb3JpdGhtcyAgPSAoQml0U2V0KSBzb3VyY2UuYWxsb3dlZEF1dGhBbGdvcml0aG1zLmNsb25lKCk7CisgICAgICAgICAgICBhbGxvd2VkUGFpcndpc2VDaXBoZXJzID0gKEJpdFNldCkgc291cmNlLmFsbG93ZWRQYWlyd2lzZUNpcGhlcnMuY2xvbmUoKTsKKyAgICAgICAgICAgIGFsbG93ZWRHcm91cENpcGhlcnMgICAgPSAoQml0U2V0KSBzb3VyY2UuYWxsb3dlZEdyb3VwQ2lwaGVycy5jbG9uZSgpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZS5lbnRlcnByaXNlRmllbGRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZW50ZXJwcmlzZUZpZWxkc1tpXS5zZXRWYWx1ZShzb3VyY2UuZW50ZXJwcmlzZUZpZWxkc1tpXS52YWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlwQXNzaWdubWVudCA9IHNvdXJjZS5pcEFzc2lnbm1lbnQ7CisgICAgICAgICAgICBpcENvbmZpZyA9IG5ldyBEaGNwSW5mbyhzb3VyY2UuaXBDb25maWcpOworICAgICAgICAgICAgcHJveHlTZXR0aW5ncyA9IHNvdXJjZS5wcm94eVNldHRpbmdzOworICAgICAgICAgICAgcHJveHlQcm9wZXJ0aWVzID0gbmV3IFByb3h5UHJvcGVydGllcyhzb3VyY2UucHJveHlQcm9wZXJ0aWVzKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKiBJbXBsZW1lbnQgdGhlIFBhcmNlbGFibGUgaW50ZXJmYWNlIHtAaGlkZX0gKi8KICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKICAgICAgICAgZGVzdC53cml0ZUludChuZXR3b3JrSWQpOwpAQCAtNDU0LDYgKzU0OSwxNiBAQAogICAgICAgICBmb3IgKEVudGVycHJpc2VGaWVsZCBmaWVsZCA6IGVudGVycHJpc2VGaWVsZHMpIHsKICAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcoZmllbGQudmFsdWUoKSk7CiAgICAgICAgIH0KKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhpcEFzc2lnbm1lbnQubmFtZSgpKTsKKyAgICAgICAgZGVzdC53cml0ZUludChpcENvbmZpZy5pcEFkZHJlc3MpOworICAgICAgICBkZXN0LndyaXRlSW50KGlwQ29uZmlnLm5ldG1hc2spOworICAgICAgICBkZXN0LndyaXRlSW50KGlwQ29uZmlnLmdhdGV3YXkpOworICAgICAgICBkZXN0LndyaXRlSW50KGlwQ29uZmlnLmRuczEpOworICAgICAgICBkZXN0LndyaXRlSW50KGlwQ29uZmlnLmRuczIpOworICAgICAgICBkZXN0LndyaXRlSW50KGlwQ29uZmlnLnNlcnZlckFkZHJlc3MpOworICAgICAgICBkZXN0LndyaXRlSW50KGlwQ29uZmlnLmxlYXNlRHVyYXRpb24pOworICAgICAgICBkZXN0LndyaXRlU3RyaW5nKHByb3h5U2V0dGluZ3MubmFtZSgpKTsKKyAgICAgICAgZGVzdC53cml0ZVBhcmNlbGFibGUocHJveHlQcm9wZXJ0aWVzLCBmbGFncyk7CiAgICAgfQogCiAgICAgLyoqIEltcGxlbWVudCB0aGUgUGFyY2VsYWJsZSBpbnRlcmZhY2Uge0BoaWRlfSAqLwpAQCAtNDgwLDYgKzU4NSwxNyBAQAogICAgICAgICAgICAgICAgIGZvciAoRW50ZXJwcmlzZUZpZWxkIGZpZWxkIDogY29uZmlnLmVudGVycHJpc2VGaWVsZHMpIHsKICAgICAgICAgICAgICAgICAgICAgZmllbGQuc2V0VmFsdWUoaW4ucmVhZFN0cmluZygpKTsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25maWcuaXBBc3NpZ25tZW50ID0gSXBBc3NpZ25tZW50LnZhbHVlT2YoaW4ucmVhZFN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBjb25maWcuaXBDb25maWcuaXBBZGRyZXNzID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgIGNvbmZpZy5pcENvbmZpZy5uZXRtYXNrID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgIGNvbmZpZy5pcENvbmZpZy5nYXRld2F5ID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgIGNvbmZpZy5pcENvbmZpZy5kbnMxID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgIGNvbmZpZy5pcENvbmZpZy5kbnMyID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgIGNvbmZpZy5pcENvbmZpZy5zZXJ2ZXJBZGRyZXNzID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgIGNvbmZpZy5pcENvbmZpZy5sZWFzZUR1cmF0aW9uID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgIGNvbmZpZy5wcm94eVNldHRpbmdzID0gUHJveHlTZXR0aW5ncy52YWx1ZU9mKGluLnJlYWRTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgY29uZmlnLnByb3h5UHJvcGVydGllcyA9IGluLnJlYWRQYXJjZWxhYmxlKG51bGwpOwogICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7CiAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlNYW5hZ2VyLmphdmEgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTWFuYWdlci5qYXZhCmluZGV4IGY4ODM1ODguLjBiM2E3ODIgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlNYW5hZ2VyLmphdmEKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU1hbmFnZXIuamF2YQpAQCAtMTY2LDcgKzE2Niw3IEBACiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRElTQUJMSU5HID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0RJU0FCTElORyA9IDEwOwogICAgIC8qKgogICAgICAqIFdpLUZpIEFQIGlzIGRpc2FibGVkLgogICAgICAqCkBAIC0xNzUsNyArMTc1LDcgQEAKICAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9ESVNBQkxFRCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9ESVNBQkxFRCA9IDExOwogICAgIC8qKgogICAgICAqIFdpLUZpIEFQIGlzIGN1cnJlbnRseSBiZWluZyBlbmFibGVkLiBUaGUgc3RhdGUgd2lsbCBjaGFuZ2UgdG8KICAgICAgKiB7QGxpbmsgI1dJRklfQVBfU1RBVEVfRU5BQkxFRH0gaWYgaXQgZmluaXNoZXMgc3VjY2Vzc2Z1bGx5LgpAQCAtMTg1LDcgKzE4NSw3IEBACiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRU5BQkxJTkcgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRU5BQkxJTkcgPSAxMjsKICAgICAvKioKICAgICAgKiBXaS1GaSBBUCBpcyBlbmFibGVkLgogICAgICAqCkBAIC0xOTQsNyArMTk0LDcgQEAKICAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9FTkFCTEVEID0gMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0VOQUJMRUQgPSAxMzsKICAgICAvKioKICAgICAgKiBXaS1GaSBBUCBpcyBpbiBhIGZhaWxlZCBzdGF0ZS4gVGhpcyBzdGF0ZSB3aWxsIG9jY3VyIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGR1cmluZwogICAgICAqIGVuYWJsaW5nIG9yIGRpc2FibGluZwpAQCAtMjA0LDcgKzIwNCw3IEBACiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRkFJTEVEID0gNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0ZBSUxFRCA9IDE0OwogCiAgICAgLyoqCiAgICAgICogQnJvYWRjYXN0IGludGVudCBhY3Rpb24gaW5kaWNhdGluZyB0aGF0IGEgY29ubmVjdGlvbiB0byB0aGUgc3VwcGxpY2FudCBoYXMKQEAgLTI3NSw3ICsyNzUsMTQgQEAKICAgICAgKiBAc2VlICNFUlJPUl9BVVRIRU5USUNBVElORwogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NVUFBMSUNBTlRfRVJST1IgPSAic3VwcGxpY2FudEVycm9yIjsKLQorICAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBpbnRlbnQgYWN0aW9uIGluZGljYXRpbmcgdGhhdCB0aGUgc3VwcGxpY2FudCBjb25maWd1cmF0aW9uIGNoYW5nZWQuCisgICAgICogVGhpcyBjYW4gYmUgYXMgYSByZXN1bHQgb2YgYWRkaW5nL3VwZGF0aW5nL2RlbGV0aW5nIGEgbmV0d29yaworICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBQTElDQU5UX0NPTkZJR19DSEFOR0VEX0FDVElPTiA9CisgICAgICAgICJhbmRyb2lkLm5ldC53aWZpLnN1cHBsaWNhbnQuQ09ORklHX0NIQU5HRSI7CiAgICAgLyoqCiAgICAgICogQW4gYWNjZXNzIHBvaW50IHNjYW4gaGFzIGNvbXBsZXRlZCwgYW5kIHJlc3VsdHMgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBzdXBwbGljYW50LgogICAgICAqIENhbGwge0BsaW5rICNnZXRTY2FuUmVzdWx0cygpfSB0byBvYnRhaW4gdGhlIHJlc3VsdHMuCkBAIC0yOTQsMTEgKzMwMSwzNSBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX05FV19SU1NJID0gIm5ld1Jzc2kiOwogCiAgICAgLyoqCisgICAgICogQnJvYWRjYXN0IGludGVudCBhY3Rpb24gaW5kaWNhdGluZyB0aGF0IHRoZSBJUCBjb25maWd1cmF0aW9uCisgICAgICogY2hhbmdlZCBvbiB3aWZpLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfQ0hBTkdFRF9BQ1RJT04gPSAiYW5kcm9pZC5uZXQud2lmaS5DT05GSUdfQ0hBTkdFRCI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9va3VwIGtleSBmb3IgYSB7QGxpbmsgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXN9IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICogV2ktRmkgbmV0d29yay4gUmV0cmlldmUgd2l0aAorICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50I2dldFBhcmNlbGFibGVFeHRyYShTdHJpbmcpfS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0xJTktfUFJPUEVSVElFUyA9ICJsaW5rUHJvcGVydGllcyI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9va3VwIGtleSBmb3IgYSB7QGxpbmsgYW5kcm9pZC5uZXQuTGlua0NhcGFiaWxpdGllc30gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiBXaS1GaSBuZXR3b3JrLiBSZXRyaWV2ZSB3aXRoCisgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5JbnRlbnQjZ2V0UGFyY2VsYWJsZUV4dHJhKFN0cmluZyl9LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTElOS19DQVBBQklMSVRJRVMgPSAibGlua0NhcGFiaWxpdGllcyI7CisKKyAgICAvKioKICAgICAgKiBUaGUgbmV0d29yayBJRHMgb2YgdGhlIGNvbmZpZ3VyZWQgbmV0d29ya3MgY291bGQgaGF2ZSBjaGFuZ2VkLgogICAgICAqLwogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04pCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS19JRFNfQ0hBTkdFRF9BQ1RJT04gPSAiYW5kcm9pZC5uZXQud2lmaS5ORVRXT1JLX0lEU19DSEFOR0VEIjsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEFjdGl2aXR5IEFjdGlvbjogUGljayBhIFdpLUZpIG5ldHdvcmsgdG8gY29ubmVjdCB0by4KICAgICAgKiA8cD5JbnB1dDogTm90aGluZy4KQEAgLTMwOCwxNiArMzM5LDYgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUElDS19XSUZJX05FVFdPUksgPSAiYW5kcm9pZC5uZXQud2lmaS5QSUNLX1dJRklfTkVUV09SSyI7CiAKICAgICAvKioKLSAgICAgKiBJbiB0aGlzIFdpLUZpIGxvY2sgbW9kZSwgV2ktRmkgd2lsbCBiZWhhdmUgYXMgaW4gdGhlIG1vZGUKLSAgICAgKiB7QGxpbmsgI1dJRklfTU9ERV9GVUxMfSBidXQgaXQgb3BlcmF0ZXMgYXQgaGlnaCBwZXJmb3JtYW5jZQotICAgICAqIGF0IHRoZSBleHBlbnNlIG9mIHBvd2VyLiBUaGlzIG1vZGUgc2hvdWxkIGJlIHVzZWQKLSAgICAgKiBvbmx5IHdoZW4gdGhlIHdpZmkgY29ubmVjdGlvbiBuZWVkcyB0byBoYXZlIG1pbmltdW0gbG9zcyBhbmQgbG93Ci0gICAgICogbGF0ZW5jeSBhcyBpdCBjYW4gaW1wYWN0IHRoZSBiYXR0ZXJ5IGxpZmUuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX01PREVfRlVMTF9ISUdIX1BFUkYgPSAzOwotCi0gICAgLyoqCiAgICAgICogSW4gdGhpcyBXaS1GaSBsb2NrIG1vZGUsIFdpLUZpIHdpbGwgYmUga2VwdCBhY3RpdmUsCiAgICAgICogYW5kIHdpbGwgYmVoYXZlIG5vcm1hbGx5LCBpLmUuLCBpdCB3aWxsIGF0dGVtcHQgdG8gYXV0b21hdGljYWxseQogICAgICAqIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gYSByZW1lbWJlcmVkIGFjY2VzcyBwb2ludCB0aGF0IGlzCkBAIC01MTMsNyArNTM0LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0KCkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC01MjcsNyArNTQ5LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZWNvbm5lY3QoKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UucmVjb25uZWN0KCk7CisgICAgICAgICAgICBtU2VydmljZS5yZWNvbm5lY3QoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC01NDEsNyArNTY0LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZWFzc29jaWF0ZSgpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5yZWFzc29jaWF0ZSgpOworICAgICAgICAgICAgbVNlcnZpY2UucmVhc3NvY2lhdGUoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC03NTYsOCArNzgwLDkgQEAKICAgICAgICAgfSBlbHNlIGlmIChyc3NpID49IE1BWF9SU1NJKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVtTGV2ZWxzIC0gMTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBwYXJ0aXRpb25TaXplID0gKE1BWF9SU1NJIC0gTUlOX1JTU0kpIC8gKG51bUxldmVscyAtIDEpOwotICAgICAgICAgICAgcmV0dXJuIChyc3NpIC0gTUlOX1JTU0kpIC8gcGFydGl0aW9uU2l6ZTsKKyAgICAgICAgICAgIGZsb2F0IGlucHV0UmFuZ2UgPSAoTUFYX1JTU0kgLSBNSU5fUlNTSSk7CisgICAgICAgICAgICBmbG9hdCBvdXRwdXRSYW5nZSA9IChudW1MZXZlbHMgLSAxKTsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSgoZmxvYXQpKHJzc2kgLSBNSU5fUlNTSSkgKiBvdXRwdXRSYW5nZSAvIGlucHV0UmFuZ2UpOwogICAgICAgICB9CiAgICAgfQogICAgIApAQCAtODUxLDYgKzg3NiwxOTIgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgLyoqCisgICAgICogU3RhcnQgdGhlIGRyaXZlciBhbmQgY29ubmVjdCB0byBuZXR3b3JrLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIG92ZXItcmlkZSBXaWZpTG9jayBhbmQgZGV2aWNlIGlkbGUgc3RhdHVzLiBGb3IgZXhhbXBsZSwKKyAgICAgKiBldmVuIGlmIHRoZSBkZXZpY2UgaXMgaWRsZSBvciB0aGVyZSBpcyBvbmx5IGEgc2Nhbi1vbmx5IGxvY2sgaGVsZCwKKyAgICAgKiBhIHN0YXJ0IHdpZmkgd291bGQgbWVhbiB0aGF0IHdpZmkgY29ubmVjdGlvbiBpcyBrZXB0IGFjdGl2ZSB1bnRpbAorICAgICAqIGEgc3RvcFdpZmkoKSBpcyBzZW50LgorICAgICAqCisgICAgICogVGhpcyBBUEkgaXMgdXNlZCBieSBXaWZpU3RhdGVUcmFja2VyCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIGVsc2Uge0Bjb2RlIGZhbHNlfQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3RhcnRXaWZpKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2Uuc3RhcnRXaWZpKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2Nvbm5lY3QgZnJvbSBhIG5ldHdvcmsgKGlmIGFueSkgYW5kIHN0b3AgdGhlIGRyaXZlci4KKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBvdmVyLXJpZGUgV2lmaUxvY2sgYW5kIGRldmljZSBpZGxlIHN0YXR1cy4gV2ktRmkKKyAgICAgKiBzdGF5cyBpbmFjdGl2ZSB1bnRpbCBhIHN0YXJ0V2lmaSgpIGlzIGlzc3VlZC4KKyAgICAgKgorICAgICAqIFRoaXMgQVBJIGlzIHVzZWQgYnkgV2lmaVN0YXRlVHJhY2tlcgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcyBlbHNlIHtAY29kZSBmYWxzZX0KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN0b3BXaWZpKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2Uuc3RvcFdpZmkoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgYnNzaWQgdG8gdGhlIHN1cHBsaWNhbnQgYmxhY2tsaXN0CisgICAgICoKKyAgICAgKiBUaGlzIEFQSSBpcyB1c2VkIGJ5IFdpZmlXYXRjaGRvZ1NlcnZpY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgZWxzZSB7QGNvZGUgZmFsc2V9CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRUb0JsYWNrbGlzdChTdHJpbmcgYnNzaWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLmFkZFRvQmxhY2tsaXN0KGJzc2lkKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIHN1cHBsaWNhbnQgYmxhY2tsaXN0CisgICAgICoKKyAgICAgKiBUaGlzIEFQSSBpcyB1c2VkIGJ5IFdpZmlXYXRjaGRvZ1NlcnZpY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgZWxzZSB7QGNvZGUgZmFsc2V9CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjbGVhckJsYWNrbGlzdCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLmNsZWFyQmxhY2tsaXN0KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFRPRE86IGRlcHJlY2F0ZSBzeW5jaHJvbm91cyBBUEkgYW5kIG9wZW4gdXAgdGhlIGZvbGxvd2luZyBBUEkgKi8KKyAgICAvKioKKyAgICAgKiBDb25uZWN0IHRvIGEgbmV0d29yayB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLiBUaGUgbmV0d29yayBhbHNvCisgICAgICogZ2V0cyBhZGRlZCB0byB0aGUgc3VwcGxpY2FudCBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogRm9yIGEgbmV3IG5ldHdvcmssIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnN0ZWFkIG9mIGEKKyAgICAgKiBzZXF1ZW5jZSBvZiBhZGROZXR3b3JrKCksIGVuYWJsZU5ldHdvcmsoKSwgc2F2ZUNvbmZpZ3VyYXRpb24oKSBhbmQKKyAgICAgKiByZWNvbm5lY3QoKQorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyB0aGUgc2V0IG9mIHZhcmlhYmxlcyB0aGF0IGRlc2NyaWJlIHRoZSBjb25maWd1cmF0aW9uLAorICAgICAqICAgICAgICAgICAgY29udGFpbmVkIGluIGEge0BsaW5rIFdpZmlDb25maWd1cmF0aW9ufSBvYmplY3QuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0TmV0d29yayhXaWZpQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLmNvbm5lY3ROZXR3b3JrV2l0aENvbmZpZyhjb25maWcpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeyB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0byBhIG5ldHdvcmsgd2l0aCB0aGUgZ2l2ZW4gbmV0d29ya0lkLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluc3RlYWQgb2YgYSBlbmFibGVOZXR3b3JrKCksIHNhdmVDb25maWd1cmF0aW9uKCkgYW5kCisgICAgICogcmVjb25uZWN0KCkKKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXR3b3JrSWQgdGhlIG5ldHdvcmsgaWQgaWRlbnRpZml5aW5nIHRoZSBuZXR3b3JrIGluIHRoZQorICAgICAqICAgICAgICAgICAgICAgIHN1cHBsaWNhbnQgY29uZmlndXJhdGlvbiBsaXN0CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0TmV0d29yayhpbnQgbmV0d29ya0lkKSB7CisgICAgICAgIGlmIChuZXR3b3JrSWQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLmNvbm5lY3ROZXR3b3JrV2l0aElkKG5ldHdvcmtJZCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7IH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlIHRoZSBnaXZlbiBuZXR3b3JrIGluIHRoZSBzdXBwbGljYW50IGNvbmZpZy4gSWYgdGhlIG5ldHdvcmsgYWxyZWFkeQorICAgICAqIGV4aXN0cywgdGhlIGNvbmZpZ3VyYXRpb24gaXMgdXBkYXRlZC4gQSBuZXcgbmV0d29yayBpcyBlbmFibGVkCisgICAgICogYnkgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIEZvciBhIG5ldyBuZXR3b3JrLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW5zdGVhZCBvZiBhCisgICAgICogc2VxdWVuY2Ugb2YgYWRkTmV0d29yaygpLCBlbmFibGVOZXR3b3JrKCkgYW5kIHNhdmVDb25maWd1cmF0aW9uKCkuCisgICAgICoKKyAgICAgKiBGb3IgYW4gZXhpc3RpbmcgbmV0d29yaywgaXQgYWNjb21wbGlzaGVzIHRoZSB0YXNrIG9mIHVwZGF0ZU5ldHdvcmsoKQorICAgICAqIGFuZCBzYXZlQ29uZmlndXJhdGlvbigpCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIHRoZSBzZXQgb2YgdmFyaWFibGVzIHRoYXQgZGVzY3JpYmUgdGhlIGNvbmZpZ3VyYXRpb24sCisgICAgICogICAgICAgICAgICBjb250YWluZWQgaW4gYSB7QGxpbmsgV2lmaUNvbmZpZ3VyYXRpb259IG9iamVjdC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNhdmVOZXR3b3JrKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2Uuc2F2ZU5ldHdvcmsoY29uZmlnKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZSB0aGUgbmV0d29yayBpbiB0aGUgc3VwcGxpY2FudCBjb25maWcuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW5zdGVhZCBvZiBhIHNlcXVlbmNlIG9mIHJlbW92ZU5ldHdvcmsoKQorICAgICAqIGFuZCBzYXZlQ29uZmlndXJhdGlvbigpLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyB0aGUgc2V0IG9mIHZhcmlhYmxlcyB0aGF0IGRlc2NyaWJlIHRoZSBjb25maWd1cmF0aW9uLAorICAgICAqICAgICAgICAgICAgY29udGFpbmVkIGluIGEge0BsaW5rIFdpZmlDb25maWd1cmF0aW9ufSBvYmplY3QuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmb3JnZXROZXR3b3JrKGludCBuZXRJZCkgeworICAgICAgICBpZiAobmV0SWQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLmZvcmdldE5ldHdvcmsobmV0SWQpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeyB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgV2ktZmkgcHJvdGVjdGVkIHNldHVwIHB1c2ggYnV0dG9uIENvbmZpZ3VyYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBic3NpZCBCU1NJRCBvZiB0aGUgYWNjZXNzIHBvaW50CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFdwc1BiYyhTdHJpbmcgYnNzaWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnN0YXJ0V3BzUGJjKGJzc2lkKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IFdpLWZpIFByb3RlY3RlZCBTZXR1cCBwaW4gbWV0aG9kIGNvbmZpZ3VyYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBic3NpZCBCU1NJRCBvZiB0aGUgYWNjZXNzIHBvaW50CisgICAgICogQHBhcmFtIGFwUGluIFBJTiBpc3N1ZWQgYnkgdGhlIGFjY2VzcyBwb2ludAorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFdwc1BpbihTdHJpbmcgYnNzaWQsIGludCBhcFBpbikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2Uuc3RhcnRXcHNQaW4oYnNzaWQsIGFwUGluKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBrZWVwIHRoZSBXaS1GaSByYWRpbyBhd2FrZS4KICAgICAgKiBOb3JtYWxseSB0aGUgV2ktRmkgcmFkaW8gbWF5IHR1cm4gb2ZmIHdoZW4gdGhlIHVzZXIgaGFzIG5vdCB1c2VkIHRoZSBkZXZpY2UgaW4gYSB3aGlsZS4KQEAgLTEwMzMsOSArMTI0NCw4IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIG5ldyBXaWZpTG9jay4KICAgICAgKgotICAgICAqIEBwYXJhbSBsb2NrVHlwZSB0aGUgdHlwZSBvZiBsb2NrIHRvIGNyZWF0ZS4gU2VlIHtAbGluayAjV0lGSV9NT0RFX0ZVTEx9LAotICAgICAqIGFuZCB7QGxpbmsgI1dJRklfTU9ERV9TQ0FOX09OTFl9IGZvciBkZXNjcmlwdGlvbnMgb2YgdGhlIHR5cGVzIG9mIFdpLUZpIGxvY2tzLgotICAgICAqCisgICAgICogQHBhcmFtIGxvY2tUeXBlIHRoZSB0eXBlIG9mIGxvY2sgdG8gY3JlYXRlLiBTZWUge0BsaW5rICNXSUZJX01PREVfRlVMTH0gYW5kCisgICAgICoge0BsaW5rICNXSUZJX01PREVfU0NBTl9PTkxZfSBmb3IgZGVzY3JpcHRpb25zIG9mIHRoZSB0eXBlcyBvZiBXaS1GaSBsb2Nrcy4KICAgICAgKiBAcGFyYW0gdGFnIGEgdGFnIGZvciB0aGUgV2lmaUxvY2sgdG8gaWRlbnRpZnkgaXQgaW4gZGVidWdnaW5nIG1lc3NhZ2VzLiAgVGhpcyBzdHJpbmcgaXMgCiAgICAgICogICAgICAgICAgICBuZXZlciBzaG93biB0byB0aGUgdXNlciB1bmRlciBub3JtYWwgY29uZGl0aW9ucywgYnV0IHNob3VsZCBiZSBkZXNjcmlwdGl2ZSAKICAgICAgKiAgICAgICAgICAgIGVub3VnaCB0byBpZGVudGlmeSB5b3VyIGFwcGxpY2F0aW9uIGFuZCB0aGUgc3BlY2lmaWMgV2lmaUxvY2sgd2l0aGluIGl0LCBpZiBpdApkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU1vbml0b3IuamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlNb25pdG9yLmphdmEKaW5kZXggMjY2ZDgwMS4uYWYzMTMyZiAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU1vbml0b3IuamF2YQorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTW9uaXRvci5qYXZhCkBAIC0xOSwxNCArMTksMTMgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRlVHJhY2tlcjsKIAogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwogCiAvKioKICAqIExpc3RlbnMgZm9yIGV2ZW50cyBmcm9tIHRoZSB3cGFfc3VwcGxpY2FudCBzZXJ2ZXIsIGFuZCBwYXNzZXMgdGhlbSBvbgotICogdG8gdGhlIHtAbGluayBXaWZpU3RhdGVUcmFja2VyfSBmb3IgaGFuZGxpbmcuIFJ1bnMgaW4gaXRzIG93biB0aHJlYWQuCisgKiB0byB0aGUge0BsaW5rIFdpZmlTdGF0ZU1hY2hpbmV9IGZvciBoYW5kbGluZy4gUnVucyBpbiBpdHMgb3duIHRocmVhZC4KICAqCiAgKiBAaGlkZQogICovCkBAIC0xMTcsNyArMTE2LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBQYXR0ZXJuIG1Db25uZWN0ZWRFdmVudFBhdHRlcm4gPQogICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIigoPzpbMC05YS1mXXsyfTopezV9WzAtOWEtZl17Mn0pIC4qIFxcW2lkPShbMC05XSspICIpOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBXaWZpU3RhdGVUcmFja2VyIG1XaWZpU3RhdGVUcmFja2VyOworICAgIHByaXZhdGUgZmluYWwgV2lmaVN0YXRlTWFjaGluZSBtV2lmaVN0YXRlTWFjaGluZTsKIAogICAgIC8qKgogICAgICAqIFRoaXMgaW5kaWNhdGVzIHRoZSBzdXBwbGljYW50IGNvbm5lY3Rpb24gZm9yIHRoZSBtb25pdG9yIGlzIGNsb3NlZApAQCAtMTM5LDMxICsxMzgsMjcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JFQ1ZfRVJST1JTICAgID0gMTA7CiAKLSAgICBwdWJsaWMgV2lmaU1vbml0b3IoV2lmaVN0YXRlVHJhY2tlciB0cmFja2VyKSB7Ci0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyID0gdHJhY2tlcjsKKyAgICBwdWJsaWMgV2lmaU1vbml0b3IoV2lmaVN0YXRlTWFjaGluZSB3aWZpU3RhdGVNYWNoaW5lKSB7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lID0gd2lmaVN0YXRlTWFjaGluZTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzdGFydE1vbml0b3JpbmcoKSB7CiAgICAgICAgIG5ldyBNb25pdG9yVGhyZWFkKCkuc3RhcnQoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgTmV0d29ya1N0YXRlVHJhY2tlciBnZXROZXR3b3JrU3RhdGVUcmFja2VyKCkgewotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXI7Ci0gICAgfQotCiAgICAgY2xhc3MgTW9uaXRvclRocmVhZCBleHRlbmRzIFRocmVhZCB7CiAgICAgICAgIHB1YmxpYyBNb25pdG9yVGhyZWFkKCkgewogICAgICAgICAgICAgc3VwZXIoIldpZmlNb25pdG9yIik7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogCiAgICAgICAgICAgICBpZiAoY29ubmVjdFRvU3VwcGxpY2FudCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gU2VuZCBhIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IGl0IGlzIG5vdyBwb3NzaWJsZSB0byBzZW5kIGNvbW1hbmRzCiAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIHN1cHBsaWNhbnQKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlTdXBwbGljYW50Q29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLm5vdGlmeVN1cHBsaWNhbnRDb25uZWN0aW9uKCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeVN1cHBsaWNhbnRMb3N0KCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5U3VwcGxpY2FudExvc3QoKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKQEAgLTI1OSw3ICsyNTQsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5IGFuZCBleGl0Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeVN1cHBsaWNhbnRMb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLm5vdGlmeVN1cHBsaWNhbnRMb3N0KCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUV2ZW50KGV2ZW50LCBldmVudERhdGEpOwpAQCAtMjcyLDcgKzI2Nyw3IEBACiAgICAgICAgICAgICBpbnQgY29ubmVjdFRyaWVzID0gMDsKIAogICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBpZiAobVdpZmlTdGF0ZVRyYWNrZXIuY29ubmVjdFRvU3VwcGxpY2FudCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKFdpZmlOYXRpdmUuY29ubmVjdFRvU3VwcGxpY2FudCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdFRyaWVzKysgPCAzKSB7CkBAIC0yODUsNyArMjgwLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVQYXNzd29yZEtleU1heUJlSW5jb3JyZWN0KCkgewotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIubm90aWZ5UGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCgpOworICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5UGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCgpOwogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURyaXZlckV2ZW50KFN0cmluZyBzdGF0ZSkgewpAQCAtMjkzLDExICsyODgsMTEgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdGUuZXF1YWxzKCJTVE9QUEVEIikpIHsKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlEcml2ZXJTdG9wcGVkKCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5RHJpdmVyU3RvcHBlZCgpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lcXVhbHMoIlNUQVJURUQiKSkgewotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeURyaXZlclN0YXJ0ZWQoKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlEcml2ZXJTdGFydGVkKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmVxdWFscygiSEFOR0VEIikpIHsKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlEcml2ZXJIdW5nKCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5RHJpdmVySHVuZygpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTMxOCw3ICszMTMsNyBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIGNhc2UgU0NBTl9SRVNVTFRTOgotICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlTY2FuUmVzdWx0c0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlTY2FuUmVzdWx0c0F2YWlsYWJsZSgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIGNhc2UgVU5LTk9XTjoKQEAgLTM3NSw3ICszNzAsNyBAQAogICAgICAgICAgICAgaWYgKG5ld1N1cHBsaWNhbnRTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuSU5WQUxJRCkgewogICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkludmFsaWQgc3VwcGxpY2FudCBzdGF0ZTogIiArIG5ld1N0YXRlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeVN0YXRlQ2hhbmdlKG5ldHdvcmtJZCwgQlNTSUQsIG5ld1N1cHBsaWNhbnRTdGF0ZSk7CisgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlTdXBwbGljYW50U3RhdGVDaGFuZ2UobmV0d29ya0lkLCBCU1NJRCwgbmV3U3VwcGxpY2FudFN0YXRlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzk1LDcgKzM5MCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeVN0YXRlQ2hhbmdlKG5ld1N0YXRlLCBCU1NJRCwgbmV0d29ya0lkKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5TmV0d29ya1N0YXRlQ2hhbmdlKG5ld1N0YXRlLCBCU1NJRCwgbmV0d29ya0lkKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlOYXRpdmUuamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlOYXRpdmUuamF2YQppbmRleCAyNWYwNWMwLi4xMjUxYTI1IDEwMDY0NAotLS0gYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTmF0aXZlLmphdmEKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU5hdGl2ZS5qYXZhCkBAIC00MSw2ICs0MSw4IEBACiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgU3RyaW5nIGdldEVycm9yU3RyaW5nKGludCBlcnJvckNvZGUpOwogCiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiBsb2FkRHJpdmVyKCk7CisKKyAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIGlzRHJpdmVyTG9hZGVkKCk7CiAgICAgCiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiB1bmxvYWREcml2ZXIoKTsKIApAQCAtMTA5LDYgKzExMSwxMCBAQAogCiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiBzZXRQb3dlck1vZGVDb21tYW5kKGludCBtb2RlKTsKIAorICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGludCBnZXRCYW5kQ29tbWFuZCgpOworCisgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiBzZXRCYW5kQ29tbWFuZChpbnQgYmFuZCk7CisKICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBpbnQgZ2V0UG93ZXJNb2RlQ29tbWFuZCgpOwogCiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiBzZXROdW1BbGxvd2VkQ2hhbm5lbHNDb21tYW5kKGludCBudW1DaGFubmVscyk7CkBAIC0xNDUsMTIgKzE1MSwxNCBAQAogCiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiBjbGVhckJsYWNrbGlzdENvbW1hbmQoKTsKIAorICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGJvb2xlYW4gc3RhcnRXcHNQYmNDb21tYW5kKFN0cmluZyBic3NpZCk7CisKKyAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIHN0YXJ0V3BzUGluQ29tbWFuZChTdHJpbmcgYnNzaWQsIGludCBhcFBpbik7CisKICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIGRvRGhjcFJlcXVlc3QoRGhjcEluZm8gcmVzdWx0cyk7CiAKICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBTdHJpbmcgZ2V0RGhjcEVycm9yKCk7CiAKLSAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIHNldFN1c3BlbmRPcHRpbWl6YXRpb25zQ29tbWFuZChib29sZWFuIGVuYWJsZWQpOwotCiAgICAgLyoqCiAgICAgICogV2FpdCBmb3IgdGhlIHN1cHBsaWNhbnQgdG8gc2VuZCBhbiBldmVudCwgcmV0dXJuaW5nIHRoZSBldmVudCBzdHJpbmcuCiAgICAgICogQHJldHVybiB0aGUgZXZlbnQgc3RyaW5nIHNlbnQgYnkgdGhlIHN1cHBsaWNhbnQuCmRpZmYgLS1naXQgYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVNYWNoaW5lLmphdmEgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVNYWNoaW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcyYWJjMAotLS0gL2Rldi9udWxsCisrKyBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZU1hY2hpbmUuamF2YQpAQCAtMCwwICsxLDMxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0LndpZmk7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0RJU0FCTEVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRElTQUJMSU5HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfRU5BQkxFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMSU5HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfU1RBVEVfVU5LTk9XTjsKKworLyoqCisgKiBUT0RPOiBBZGQgc29mdCBBUCBzdGF0ZXMgYXMgcGFydCBvZiBXSUZJX1NUQVRFX1hYWAorICogUmV0YWluIFdJRklfU1RBVEVfRU5BQkxJTkcgdGhhdCBpbmRpY2F0ZXMgZHJpdmVyIGlzIGxvYWRpbmcKKyAqIEFkZCBXSUZJX1NUQVRFX0FQX0VOQUJMRUQgdG8gaW5kaWNhdGUgc29mdCBBUCBoYXMgc3RhcnRlZAorICogYW5kIFdJRklfU1RBVEVfRkFJTEVEIGZvciBmYWlsdXJlCisgKiBEZXByZWNhdGUgV0lGSV9TVEFURV9VTktOT1dOCisgKgorICogRG9pbmcgdGhpcyB3aWxsIHNpbXBsaWZ5IHRoZSBsb2dpYyBmb3Igc2VuZGluZyBicm9hZGNhc3RzCisgKi8KK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0RJU0FCTEVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRElTQUJMSU5HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRU5BQkxFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0VOQUJMSU5HOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRkFJTEVEOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtBZGRyZXNzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0LkRoY3BJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtVdGlsczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuUHJveHlQcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzOworaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQub3MuV29ya1NvdXJjZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuYmFja3VwLklCYWNrdXBNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEEyZHA7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSGVhZHNldDsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQcm9maWxlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSUJhdHRlcnlTdGF0czsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhpZXJhcmNoaWNhbFN0YXRlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOworCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZTsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogVHJhY2sgdGhlIHN0YXRlIG9mIFdpZmkgY29ubmVjdGl2aXR5LiBBbGwgZXZlbnQgaGFuZGxpbmcgaXMgZG9uZSBoZXJlLAorICogYW5kIGFsbCBjaGFuZ2VzIGluIGNvbm5lY3Rpdml0eSBzdGF0ZSBhcmUgaW5pdGlhdGVkIGhlcmUuCisgKgorICogQGhpZGUKKyAqLworLy9UT0RPOiB3ZSBzdGlsbCBuZWVkIGZyZXF1ZW50IHNjYW5uaW5nIGZvciB0aGUgY2FzZSB3aGVuCisvLyB3ZSBpc3N1ZSBkaXNjb25uZWN0IGJ1dCBuZWVkIHNjYW4gcmVzdWx0cyBmb3Igb3BlbiBuZXR3b3JrIG5vdGlmaWNhdGlvbgorcHVibGljIGNsYXNzIFdpZmlTdGF0ZU1hY2hpbmUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJXaWZpU3RhdGVNYWNoaW5lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS1RZUEUgPSAiV0lGSSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKworICAgIC8qIFRPRE86IGZldGNoIGEgY29uZmlndXJhYmxlIGludGVyZmFjZSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0ZUQVBfSUZBQ0UgPSAid2wwLjEiOworCisgICAgcHJpdmF0ZSBXaWZpTW9uaXRvciBtV2lmaU1vbml0b3I7CisgICAgcHJpdmF0ZSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIG53U2VydmljZTsKKyAgICBwcml2YXRlIENvbm5lY3Rpdml0eU1hbmFnZXIgbUNtOworCisgICAgLyogU2NhbiByZXN1bHRzIGhhbmRsaW5nICovCisgICAgcHJpdmF0ZSBMaXN0PFNjYW5SZXN1bHQ+IG1TY2FuUmVzdWx0czsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHNjYW5SZXN1bHRQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJcdCsiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9SRVNVTFRfQ0FDSEVfU0laRSA9IDgwOworICAgIHByaXZhdGUgZmluYWwgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFNjYW5SZXN1bHQ+IG1TY2FuUmVzdWx0Q2FjaGU7CisKKyAgICBwcml2YXRlIFN0cmluZyBtSW50ZXJmYWNlTmFtZTsKKworICAgIHByaXZhdGUgaW50IG1OdW1BbGxvd2VkQ2hhbm5lbHMgPSAwOworICAgIHByaXZhdGUgaW50IG1MYXN0U2lnbmFsTGV2ZWwgPSAtMTsKKyAgICBwcml2YXRlIFN0cmluZyBtTGFzdEJzc2lkOworICAgIHByaXZhdGUgaW50IG1MYXN0TmV0d29ya0lkOworICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlUnNzaVBvbGxpbmcgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCBtUmVjb25uZWN0Q291bnQgPSAwOworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNTY2FuTW9kZSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogSW5zdGFuY2Ugb2YgdGhlIGJsdWV0b290aCBoZWFkc2V0IGhlbHBlci4gVGhpcyBuZWVkcyB0byBiZSBjcmVhdGVkCisgICAgICogZWFybHkgYmVjYXVzZSB0aGVyZSBpcyBhIGRlbGF5IGJlZm9yZSBpdCBhY3R1YWxseSAnY29ubmVjdHMnLCBhcworICAgICAqIG5vdGVkIGJ5IGl0cyBqYXZhZG9jLiBJZiB3ZSBjaGVjayBiZWZvcmUgaXQgaXMgY29ubmVjdGVkLCBpdCB3aWxsIGJlCisgICAgICogaW4gYW4gZXJyb3Igc3RhdGUgYW5kIHdlIHdpbGwgbm90IGRpc2FibGUgY29leGlzdGVuY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBCbHVldG9vdGhIZWFkc2V0IG1CbHVldG9vdGhIZWFkc2V0OworCisgICAgcHJpdmF0ZSBCbHVldG9vdGhBMmRwIG1CbHVldG9vdGhBMmRwOworCisgICAgcHJpdmF0ZSBMaW5rUHJvcGVydGllcyBtTGlua1Byb3BlcnRpZXM7CisKKyAgICAvLyBIZWxkIGR1cmluZyBkcml2ZXIgbG9hZCBhbmQgdW5sb2FkCisgICAgcHJpdmF0ZSBzdGF0aWMgUG93ZXJNYW5hZ2VyLldha2VMb2NrIHNXYWtlTG9jazsKKworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKworICAgIHByaXZhdGUgRGhjcEluZm8gbURoY3BJbmZvOworICAgIHByaXZhdGUgV2lmaUluZm8gbVdpZmlJbmZvOworICAgIHByaXZhdGUgTmV0d29ya0luZm8gbU5ldHdvcmtJbmZvOworICAgIHByaXZhdGUgU3VwcGxpY2FudFN0YXRlVHJhY2tlciBtU3VwcGxpY2FudFN0YXRlVHJhY2tlcjsKKyAgICAvKiBDb25uZWN0aW9uIHRvIGEgc3BlY2lmaWMgbmV0d29yayBpbnZvbHZlcyBkaXNhYmxpbmcgYWxsIG5ldHdvcmtzLAorICAgICAqIHRoaXMgZmxhZyB0cmFja3MgaWYgbmV0d29ya3MgbmVlZCB0byBiZSByZS1lbmFibGVkICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVBbGxOZXR3b3JrcyA9IGZhbHNlOworICAgIC8qIFRyYWNrIGlmIFdQUyB3YXMgc3RhcnRlZCBzaW5jZSB3ZSBuZWVkIHRvIHJlLWVuYWJsZSBuZXR3b3JrcworICAgICAqIGFuZCBsb2FkIGNvbmZpZ3VyYXRpb24gYWZ0ZXJ3YXJkcyAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtV3BzU3RhcnRlZCA9IGZhbHNlOworCisgICAgLy8gRXZlbnQgbG9nIHRhZ3MgKG11c3QgYmUgaW4gc3luYyB3aXRoIGV2ZW50LWxvZy10YWdzKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQgICAgICAgID0gNTAwMjE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCAgICAgICAgPSA1MDAyMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRMT0dfU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEICA9IDUwMDIzOworCisgICAgLyogTG9hZCB0aGUgZHJpdmVyICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9MT0FEX0RSSVZFUiAgICAgICAgICAgICAgICAgICAgICA9IDE7CisgICAgLyogVW5sb2FkIHRoZSBkcml2ZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1VOTE9BRF9EUklWRVIgICAgICAgICAgICAgICAgICAgID0gMjsKKyAgICAvKiBJbmRpY2F0ZXMgZHJpdmVyIGxvYWQgc3VjY2VlZGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9MT0FEX0RSSVZFUl9TVUNDRVNTICAgICAgICAgICAgICA9IDM7CisgICAgLyogSW5kaWNhdGVzIGRyaXZlciBsb2FkIGZhaWxlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfTE9BRF9EUklWRVJfRkFJTFVSRSAgICAgICAgICAgICAgPSA0OworICAgIC8qIEluZGljYXRlcyBkcml2ZXIgdW5sb2FkIHN1Y2NlZWRlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfVU5MT0FEX0RSSVZFUl9TVUNDRVNTICAgICAgICAgICAgPSA1OworICAgIC8qIEluZGljYXRlcyBkcml2ZXIgdW5sb2FkIGZhaWxlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfVU5MT0FEX0RSSVZFUl9GQUlMVVJFICAgICAgICAgICAgPSA2OworCisgICAgLyogU3RhcnQgdGhlIHN1cHBsaWNhbnQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NUQVJUX1NVUFBMSUNBTlQgICAgICAgICAgICAgICAgID0gMTE7CisgICAgLyogU3RvcCB0aGUgc3VwcGxpY2FudCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RPUF9TVVBQTElDQU5UICAgICAgICAgICAgICAgICAgPSAxMjsKKyAgICAvKiBTdGFydCB0aGUgZHJpdmVyICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVEFSVF9EUklWRVIgICAgICAgICAgICAgICAgICAgICA9IDEzOworICAgIC8qIFN0YXJ0IHRoZSBkcml2ZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NUT1BfRFJJVkVSICAgICAgICAgICAgICAgICAgICAgID0gMTQ7CisgICAgLyogSW5kaWNhdGVzIERIQ1Agc3VjY2VkZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0lQX0NPTkZJR19TVUNDRVNTICAgICAgICAgICAgICAgID0gMTU7CisgICAgLyogSW5kaWNhdGVzIERIQ1AgZmFpbGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9JUF9DT05GSUdfRkFJTFVSRSAgICAgICAgICAgICAgICA9IDE2OworICAgIC8qIFJlLWNvbmZpZ3VyZSBpbnRlcmZhY2UgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1JFQ09ORklHVVJFX0lQICAgICAgICAgICAgICAgICAgID0gMTc7CisKKworICAgIC8qIFN0YXJ0IHRoZSBzb2Z0IGFjY2VzcyBwb2ludCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RBUlRfQVAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTsKKyAgICAvKiBTdG9wIHRoZSBzb2Z0IGFjY2VzcyBwb2ludCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RPUF9BUCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjsKKworCisgICAgLyogU3VwcGxpY2FudCBldmVudHMgKi8KKyAgICAvKiBDb25uZWN0aW9uIHRvIHN1cHBsaWNhbnQgZXN0YWJsaXNoZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1VQX0NPTk5FQ1RJT05fRVZFTlQgICAgICAgICAgICAgICAgID0gMzE7CisgICAgLyogQ29ubmVjdGlvbiB0byBzdXBwbGljYW50IGxvc3QgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1VQX0RJU0NPTk5FQ1RJT05fRVZFTlQgICAgICAgICAgICAgID0gMzI7CisgICAgLyogRHJpdmVyIHN0YXJ0IGNvbXBsZXRlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfU1RBUlRfRVZFTlQgICAgICAgICAgICAgICAgICAgPSAzMzsKKyAgICAvKiBEcml2ZXIgc3RvcCBjb21wbGV0ZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1NUT1BfRVZFTlQgICAgICAgICAgICAgICAgICAgID0gMzQ7CisgICAgLyogTmV0d29yayBjb25uZWN0aW9uIGNvbXBsZXRlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBORVRXT1JLX0NPTk5FQ1RJT05fRVZFTlQgICAgICAgICAgICAgPSAzNjsKKyAgICAvKiBOZXR3b3JrIGRpc2Nvbm5lY3Rpb24gY29tcGxldGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5FVFdPUktfRElTQ09OTkVDVElPTl9FVkVOVCAgICAgICAgICA9IDM3OworICAgIC8qIFNjYW4gcmVzdWx0cyBhcmUgYXZhaWxhYmxlICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fUkVTVUxUU19FVkVOVCAgICAgICAgICAgICAgICAgICA9IDM4OworICAgIC8qIFN1cHBsaWNhdGUgc3RhdGUgY2hhbmdlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVVBQTElDQU5UX1NUQVRFX0NIQU5HRV9FVkVOVCAgICAgICAgPSAzOTsKKyAgICAvKiBQYXNzd29yZCBtYXkgYmUgaW5jb3JyZWN0ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX01BWV9CRV9JTkNPUlJFQ1RfRVZFTlQgICAgICA9IDQwOworCisgICAgLyogU3VwcGxpY2FudCBjb21tYW5kcyAqLworICAgIC8qIElzIHN1cHBsaWNhbnQgYWxpdmUgPyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUElOR19TVVBQTElDQU5UICAgICAgICAgICAgICAgICAgPSA1MTsKKyAgICAvKiBBZGQvdXBkYXRlIGEgbmV0d29yayBjb25maWd1cmF0aW9uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9BRERfT1JfVVBEQVRFX05FVFdPUksgICAgICAgICAgICA9IDUyOworICAgIC8qIERlbGV0ZSBhIG5ldHdvcmsgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1JFTU9WRV9ORVRXT1JLICAgICAgICAgICAgICAgICAgID0gNTM7CisgICAgLyogRW5hYmxlIGEgbmV0d29yay4gVGhlIGRldmljZSB3aWxsIGF0dGVtcHQgYSBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbiBuZXR3b3JrLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfRU5BQkxFX05FVFdPUksgICAgICAgICAgICAgICAgICAgPSA1NDsKKyAgICAvKiBEaXNhYmxlIGEgbmV0d29yay4gVGhlIGRldmljZSBkb2VzIG5vdCBhdHRlbXB0IGEgY29ubmVjdGlvbiB0byB0aGUgZ2l2ZW4gbmV0d29yay4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0RJU0FCTEVfTkVUV09SSyAgICAgICAgICAgICAgICAgID0gNTU7CisgICAgLyogQmxhY2tsaXN0IG5ldHdvcmsuIERlLXByaW9yaXRpemVzIHRoZSBnaXZlbiBCU1NJRCBmb3IgY29ubmVjdGlvbi4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0JMQUNLTElTVF9ORVRXT1JLICAgICAgICAgICAgICAgID0gNTY7CisgICAgLyogQ2xlYXIgdGhlIGJsYWNrbGlzdCBuZXR3b3JrIGxpc3QgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0NMRUFSX0JMQUNLTElTVCAgICAgICAgICAgICAgICAgID0gNTc7CisgICAgLyogU2F2ZSBjb25maWd1cmF0aW9uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TQVZFX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICA9IDU4OworCisgICAgLyogU3VwcGxpY2FudCBjb21tYW5kcyBhZnRlciBkcml2ZXIgc3RhcnQqLworICAgIC8qIEluaXRpYXRlIGEgc2NhbiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RBUlRfU0NBTiAgICAgICAgICAgICAgICAgICAgICAgPSA3MTsKKyAgICAvKiBTZXQgc2NhbiBtb2RlLiBDT05ORUNUX01PREUgb3IgU0NBTl9PTkxZX01PREUgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NFVF9TQ0FOX01PREUgICAgICAgICAgICAgICAgICAgID0gNzI7CisgICAgLyogU2V0IHNjYW4gdHlwZS4gU0NBTl9BQ1RJVkUgb3IgU0NBTl9QQVNTSVZFICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TRVRfU0NBTl9UWVBFICAgICAgICAgICAgICAgICAgICA9IDczOworICAgIC8qIERpc2Nvbm5lY3QgZnJvbSBhIG5ldHdvcmsgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0RJU0NPTk5FQ1QgICAgICAgICAgICAgICAgICAgICAgID0gNzQ7CisgICAgLyogUmVjb25uZWN0IHRvIGEgbmV0d29yayAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUkVDT05ORUNUICAgICAgICAgICAgICAgICAgICAgICAgPSA3NTsKKyAgICAvKiBSZWFzc29jaWF0ZSB0byBhIG5ldHdvcmsgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1JFQVNTT0NJQVRFICAgICAgICAgICAgICAgICAgICAgID0gNzY7CisgICAgLyogU2V0IHBvd2VyIG1vZGUKKyAgICAgKiBQT1dFUl9NT0RFX0FDVElWRQorICAgICAqIFBPV0VSX01PREVfQVVUTworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU0VUX1BPV0VSX01PREUgICAgICAgICAgICAgICAgICAgPSA3NzsKKyAgICAvKiBTZXQgYmx1ZXRvb3RoIGNvLWV4aXN0ZW5jZQorICAgICAqIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX0VOQUJMRUQKKyAgICAgKiBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9ESVNBQkxFRAorICAgICAqIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX1NFTlNFCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TRVRfQkxVRVRPT1RIX0NPRVhJU1RFTkNFICAgICAgICA9IDc4OworICAgIC8qIEVuYWJsZS9kaXNhYmxlIGJsdWV0b290aCBzY2FuIG1vZGUKKyAgICAgKiB0cnVlKDEpCisgICAgICogZmFsc2UoMCkKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NFVF9CTFVFVE9PVEhfU0NBTl9NT0RFICAgICAgICAgID0gNzk7CisgICAgLyogU2V0IG51bWJlciBvZiBhbGxvd2VkIGNoYW5uZWxzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFMgICAgICAgICA9IDgwOworICAgIC8qIFJlcXVlc3QgY29ubmVjdGl2aXR5IG1hbmFnZXIgd2FrZSBsb2NrIGJlZm9yZSBkcml2ZXIgc3RvcCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUkVRVUVTVF9DTV9XQUtFTE9DSyAgICAgICAgICAgICAgPSA4MTsKKyAgICAvKiBFbmFibGVzIFJTU0kgcG9sbCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfRU5BQkxFX1JTU0lfUE9MTCAgICAgICAgICAgICAgICAgPSA4MjsKKyAgICAvKiBSU1NJIHBvbGwgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1JTU0lfUE9MTCAgICAgICAgICAgICAgICAgICAgICAgID0gODM7CisgICAgLyogR2V0IGN1cnJlbnQgUlNTSSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfR0VUX1JTU0kgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NDsKKyAgICAvKiBHZXQgYXBwcm94IGN1cnJlbnQgUlNTSSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfR0VUX1JTU0lfQVBQUk9YICAgICAgICAgICAgICAgICAgPSA4NTsKKyAgICAvKiBHZXQgbGluayBzcGVlZCBvbiBjb25uZWN0aW9uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9HRVRfTElOS19TUEVFRCAgICAgICAgICAgICAgICAgICA9IDg2OworICAgIC8qIFJhZGlvIG1hYyBhZGRyZXNzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9HRVRfTUFDX0FERFIgICAgICAgICAgICAgICAgICAgICA9IDg3OworICAgIC8qIFNldCB1cCBwYWNrZXQgZmlsdGVyaW5nICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVEFSVF9QQUNLRVRfRklMVEVSSU5HICAgICAgICAgICA9IDg4OworICAgIC8qIENsZWFyIHBhY2tldCBmaWx0ZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NUT1BfUEFDS0VUX0ZJTFRFUklORyAgICAgICAgICAgID0gODk7CisgICAgLyogQ29ubmVjdCB0byBhIHNwZWNpZmllZCBuZXR3b3JrIChuZXR3b3JrIGlkCisgICAgICogb3IgV2lmaUNvbmZpZ3VyYXRpb24pIFRoaXMgaW52b2x2ZXMgaW5jcmVhc2luZworICAgICAqIHRoZSBwcmlvcml0eSBvZiB0aGUgbmV0d29yaywgZW5hYmxpbmcgdGhlIG5ldHdvcmsKKyAgICAgKiAod2hpbGUgZGlzYWJsaW5nIG90aGVycykgYW5kIGlzc3VpbmcgYSByZWNvbm5lY3QuCisgICAgICogTm90ZSB0aGF0IENNRF9SRUNPTk5FQ1QganVzdCBkb2VzIGEgcmVjb25uZWN0IHRvCisgICAgICogYW4gZXhpc3RpbmcgbmV0d29yay4gQWxsIHRoZSBuZXR3b3JrcyBnZXQgZW5hYmxlZAorICAgICAqIHVwb24gYSBzdWNjZXNzZnVsIGNvbm5lY3Rpb24gb3IgYSBmYWlsdXJlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfQ09OTkVDVF9ORVRXT1JLICAgICAgICAgICAgICAgICAgPSA5MDsKKyAgICAvKiBTYXZlIHRoZSBzcGVjaWZpZWQgbmV0d29yay4gVGhpcyBpbnZvbHZlcyBhZGRpbmcKKyAgICAgKiBhbiBlbmFibGVkIG5ldHdvcmsgKGlmIG5ldykgYW5kIHVwZGF0aW5nIHRoZQorICAgICAqIGNvbmZpZyBhbmQgaXNzdWluZyBhIHNhdmUgb24gc3VwcGxpY2FudCBjb25maWcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TQVZFX05FVFdPUksgICAgICAgICAgICAgICAgICAgICA9IDkxOworICAgIC8qIERlbGV0ZSB0aGUgc3BlY2lmaWVkIG5ldHdvcmsuIFRoaXMgaW52b2x2ZXMKKyAgICAgKiByZW1vdmluZyB0aGUgbmV0d29yayBhbmQgaXNzdWluZyBhIHNhdmUgb24KKyAgICAgKiBzdXBwbGljYW50IGNvbmZpZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0ZPUkdFVF9ORVRXT1JLICAgICAgICAgICAgICAgICAgID0gOTI7CisgICAgLyogU3RhcnQgV2ktRmkgcHJvdGVjdGVkIHNldHVwICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVEFSVF9XUFMgICAgICAgICAgICAgICAgICAgICAgICA9IDkzOworCisKKyAgICAvKioKKyAgICAgKiBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBwb2xsaW5nIGZvciBjb25uZWN0aW9uCisgICAgICogc3RhdHVzIGl0ZW1zIHRoYXQgYXJlIG5vdCBzZW50IHZpYSBhc3luY2hyb25vdXMgZXZlbnRzLgorICAgICAqIEFuIGV4YW1wbGUgaXMgUlNTSSAoc2lnbmFsIHN0cmVuZ3RoKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9MTF9SU1NJX0lOVEVSVkFMX01TRUNTID0gMzAwMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX01PREUgICA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fT05MWV9NT0RFID0gMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ0FOX0FDVElWRSA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fUEFTU0lWRSA9IDI7CisKKyAgICAvKiBBdXRvIGFsbG93cyA4MDIuMTFBL0IvRyBvcGVyYXRpb24gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFORF9BVVRPID0gMDsKKyAgICAvKiA1R0h6IGFsbG93cyA4MDIuMTFBIG9wZXJhdGlvbiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQU5EXzVHID0gMTsKKyAgICAvKiAyLjRHSHogYWxsb3dzIDgwMi4xMUIvRyBvcGVyYXRpb24gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFORF8yRyA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgd2Ugd2lsbCByZXRyeSBhIGNvbm5lY3Rpb24gdG8gYW4gYWNjZXNzIHBvaW50CisgICAgICogZm9yIHdoaWNoIHdlIGhhdmUgZmFpbGVkIGluIGFjcXVpcmluZyBhbiBJUCBhZGRyZXNzIGZyb20gREhDUC4gQSB2YWx1ZSBvZgorICAgICAqIE4gbWVhbnMgdGhhdCB3ZSB3aWxsIG1ha2UgTisxIGNvbm5lY3Rpb24gYXR0ZW1wdHMgaW4gYWxsLgorICAgICAqIDxwPgorICAgICAqIFNlZSB7QGxpbmsgU2V0dGluZ3MuU2VjdXJlI1dJRklfTUFYX0RIQ1BfUkVUUllfQ09VTlR9LiBUaGlzIGlzIHRoZSBkZWZhdWx0CisgICAgICogdmFsdWUgaWYgYSBTZXR0aW5ncyB2YWx1ZSBpcyBub3QgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfREhDUF9SRVRSSUVTID0gOTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfUE9XRVJfTU9ERV9BVVRPID0gMDsKKworICAgIC8qIERlZmF1bHQgcGFyZW50IHN0YXRlICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRGVmYXVsdFN0YXRlID0gbmV3IERlZmF1bHRTdGF0ZSgpOworICAgIC8qIFRlbXBvcmFyeSBpbml0aWFsIHN0YXRlICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtSW5pdGlhbFN0YXRlID0gbmV3IEluaXRpYWxTdGF0ZSgpOworICAgIC8qIFVubG9hZGluZyB0aGUgZHJpdmVyICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyVW5sb2FkaW5nU3RhdGUgPSBuZXcgRHJpdmVyVW5sb2FkaW5nU3RhdGUoKTsKKyAgICAvKiBMb2FkaW5nIHRoZSBkcml2ZXIgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Ecml2ZXJVbmxvYWRlZFN0YXRlID0gbmV3IERyaXZlclVubG9hZGVkU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgbG9hZC91bmxvYWQgZmFpbGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyRmFpbGVkU3RhdGUgPSBuZXcgRHJpdmVyRmFpbGVkU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgbG9hZGluZyAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlckxvYWRpbmdTdGF0ZSA9IG5ldyBEcml2ZXJMb2FkaW5nU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgbG9hZGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyTG9hZGVkU3RhdGUgPSBuZXcgRHJpdmVyTG9hZGVkU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgbG9hZGVkLCB3YWl0aW5nIGZvciBzdXBwbGljYW50IHRvIHN0YXJ0ICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtV2FpdEZvclN1cFN0YXRlID0gbmV3IFdhaXRGb3JTdXBTdGF0ZSgpOworCisgICAgLyogRHJpdmVyIGxvYWRlZCBhbmQgc3VwcGxpY2FudCByZWFkeSAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlclN1cFJlYWR5U3RhdGUgPSBuZXcgRHJpdmVyU3VwUmVhZHlTdGF0ZSgpOworICAgIC8qIERyaXZlciBzdGFydCBpc3N1ZWQsIHdhaXRpbmcgZm9yIGNvbXBsZXRlZCBldmVudCAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlclN0YXJ0aW5nU3RhdGUgPSBuZXcgRHJpdmVyU3RhcnRpbmdTdGF0ZSgpOworICAgIC8qIERyaXZlciBzdGFydGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyU3RhcnRlZFN0YXRlID0gbmV3IERyaXZlclN0YXJ0ZWRTdGF0ZSgpOworICAgIC8qIERyaXZlciBzdG9wcGluZyAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlclN0b3BwaW5nU3RhdGUgPSBuZXcgRHJpdmVyU3RvcHBpbmdTdGF0ZSgpOworICAgIC8qIERyaXZlciBzdG9wcGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyU3RvcHBlZFN0YXRlID0gbmV3IERyaXZlclN0b3BwZWRTdGF0ZSgpOworICAgIC8qIFNjYW4gZm9yIG5ldHdvcmtzLCBubyBjb25uZWN0aW9uIHdpbGwgYmUgZXN0YWJsaXNoZWQgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1TY2FuTW9kZVN0YXRlID0gbmV3IFNjYW5Nb2RlU3RhdGUoKTsKKyAgICAvKiBDb25uZWN0aW5nIHRvIGFuIGFjY2VzcyBwb2ludCAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUNvbm5lY3RNb2RlU3RhdGUgPSBuZXcgQ29ubmVjdE1vZGVTdGF0ZSgpOworICAgIC8qIEZldGNoaW5nIElQIGFmdGVyIG5ldHdvcmsgY29ubmVjdGlvbiAoYXNzb2MrYXV0aCBjb21wbGV0ZSkgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Db25uZWN0aW5nU3RhdGUgPSBuZXcgQ29ubmVjdGluZ1N0YXRlKCk7CisgICAgLyogQ29ubmVjdGVkIHdpdGggSVAgYWRkciAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUNvbm5lY3RlZFN0YXRlID0gbmV3IENvbm5lY3RlZFN0YXRlKCk7CisgICAgLyogZGlzY29ubmVjdCBpc3N1ZWQsIHdhaXRpbmcgZm9yIG5ldHdvcmsgZGlzY29ubmVjdCBjb25maXJtYXRpb24gKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1EaXNjb25uZWN0aW5nU3RhdGUgPSBuZXcgRGlzY29ubmVjdGluZ1N0YXRlKCk7CisgICAgLyogTmV0d29yayBpcyBub3QgY29ubmVjdGVkLCBzdXBwbGljYW50IGFzc29jK2F1dGggaXMgbm90IGNvbXBsZXRlICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRGlzY29ubmVjdGVkU3RhdGUgPSBuZXcgRGlzY29ubmVjdGVkU3RhdGUoKTsKKworICAgIC8qIFNvZnQgQXAgaXMgcnVubmluZyAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbVNvZnRBcFN0YXJ0ZWRTdGF0ZSA9IG5ldyBTb2Z0QXBTdGFydGVkU3RhdGUoKTsKKworCisgICAgLyoqCisgICAgICogT25lIG9mICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9ESVNBQkxFRH0sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9ESVNBQkxJTkd9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRU5BQkxFRH0sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9FTkFCTElOR30sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9VTktOT1dOfQorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1XaWZpU3RhdGUgPSBuZXcgQXRvbWljSW50ZWdlcihXSUZJX1NUQVRFX0RJU0FCTEVEKTsKKworICAgIC8qKgorICAgICAqIE9uZSBvZiAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMRUR9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMSU5HfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0VOQUJMRUR9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRU5BQkxJTkd9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRkFJTEVEfQorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1XaWZpQXBTdGF0ZSA9IG5ldyBBdG9taWNJbnRlZ2VyKFdJRklfQVBfU1RBVEVfRElTQUJMRUQpOworCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1MYXN0RW5hYmxlVWlkID0gbmV3IEF0b21pY0ludGVnZXIoUHJvY2Vzcy5teVVpZCgpKTsKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgbUxhc3RBcEVuYWJsZVVpZCA9IG5ldyBBdG9taWNJbnRlZ2VyKFByb2Nlc3MubXlVaWQoKSk7CisKKyAgICAvKioKKyAgICAgKiBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgV0lGSSBpcyBydW5uaW5nLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNSdW5uaW5nID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UgbGFzdCB0b2xkIHRoZSBiYXR0ZXJ5IHN0YXRzIHdlIGhhZCBzdGFydGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVwb3J0ZWRSdW5uaW5nID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBNb3N0IHJlY2VudGx5IHNldCBzb3VyY2Ugb2Ygc3RhcnRpbmcgV0lGSS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFdvcmtTb3VyY2UgbVJ1bm5pbmdXaWZpVWlkcyA9IG5ldyBXb3JrU291cmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGFzdCByZXBvcnRlZCBVSURzIHRoYXQgd2VyZSByZXNwb25zaWJsZSBmb3Igc3RhcnRpbmcgV0lGSS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFdvcmtTb3VyY2UgbUxhc3RSdW5uaW5nV2lmaVVpZHMgPSBuZXcgV29ya1NvdXJjZSgpOworCisgICAgcHJpdmF0ZSBmaW5hbCBJQmF0dGVyeVN0YXRzIG1CYXR0ZXJ5U3RhdHM7CisKKyAgICBwdWJsaWMgV2lmaVN0YXRlTWFjaGluZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoVEFHKTsKKworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisKKyAgICAgICAgbU5ldHdvcmtJbmZvID0gbmV3IE5ldHdvcmtJbmZvKENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJLCAwLCBORVRXT1JLVFlQRSwgIiIpOworICAgICAgICBtQmF0dGVyeVN0YXRzID0gSUJhdHRlcnlTdGF0cy5TdHViLmFzSW50ZXJmYWNlKFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoImJhdHRlcnlpbmZvIikpOworCisgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFKTsKKyAgICAgICAgbndTZXJ2aWNlID0gSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGIpOworCisgICAgICAgIG1XaWZpTW9uaXRvciA9IG5ldyBXaWZpTW9uaXRvcih0aGlzKTsKKyAgICAgICAgbURoY3BJbmZvID0gbmV3IERoY3BJbmZvKCk7CisgICAgICAgIG1XaWZpSW5mbyA9IG5ldyBXaWZpSW5mbygpOworICAgICAgICBtSW50ZXJmYWNlTmFtZSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJ3aWZpLmludGVyZmFjZSIsICJ0aXdsYW4wIik7CisgICAgICAgIG1TdXBwbGljYW50U3RhdGVUcmFja2VyID0gbmV3IFN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIoY29udGV4dCwgZ2V0SGFuZGxlcigpKTsKKworICAgICAgICBtTGlua1Byb3BlcnRpZXMgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOworICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGFwdGVyLmdldFByb2ZpbGVQcm94eShtQ29udGV4dCwgbUJsdWV0b290aFByb2ZpbGVTZXJ2aWNlTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhQcm9maWxlLkEyRFApOworICAgICAgICAgICAgYWRhcHRlci5nZXRQcm9maWxlUHJveHkobUNvbnRleHQsIG1CbHVldG9vdGhQcm9maWxlU2VydmljZUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VUKTsKKyAgICAgICAgfQorCisgICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZShmYWxzZSk7CisgICAgICAgIG1MaW5rUHJvcGVydGllcy5jbGVhcigpOworICAgICAgICBtTGFzdEJzc2lkID0gbnVsbDsKKyAgICAgICAgbUxhc3ROZXR3b3JrSWQgPSAtMTsKKyAgICAgICAgbUxhc3RTaWduYWxMZXZlbCA9IC0xOworCisgICAgICAgIG1TY2FuUmVzdWx0Q2FjaGUgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFNjYW5SZXN1bHQ+KAorICAgICAgICAgICAgU0NBTl9SRVNVTFRfQ0FDSEVfU0laRSwgMC43NWYsIHRydWUpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIExpbWl0IHRoZSBjYWNoZSBzaXplIGJ5IFNDQU5fUkVTVUxUX0NBQ0hFX1NJWkUKKyAgICAgICAgICAgICAgICAgKiBlbGVtZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUVsZGVzdEVudHJ5KE1hcC5FbnRyeSBlbGRlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNDQU5fUkVTVUxUX0NBQ0hFX1NJWkUgPCB0aGlzLnNpemUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgUG93ZXJNYW5hZ2VyIHBvd2VyTWFuYWdlciA9IChQb3dlck1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOworICAgICAgICBzV2FrZUxvY2sgPSBwb3dlck1hbmFnZXIubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLCBUQUcpOworCisgICAgICAgIGFkZFN0YXRlKG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobUluaXRpYWxTdGF0ZSwgbURlZmF1bHRTdGF0ZSk7CisgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyVW5sb2FkaW5nU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlclVubG9hZGVkU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Ecml2ZXJGYWlsZWRTdGF0ZSwgbURyaXZlclVubG9hZGVkU3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlckxvYWRpbmdTdGF0ZSwgbURlZmF1bHRTdGF0ZSk7CisgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyTG9hZGVkU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1XYWl0Rm9yU3VwU3RhdGUsIG1Ecml2ZXJMb2FkZWRTdGF0ZSk7CisgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyU3VwUmVhZHlTdGF0ZSwgbURlZmF1bHRTdGF0ZSk7CisgICAgICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlclN0YXJ0aW5nU3RhdGUsIG1Ecml2ZXJTdXBSZWFkeVN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyU3RhcnRlZFN0YXRlLCBtRHJpdmVyU3VwUmVhZHlTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1TY2FuTW9kZVN0YXRlLCBtRHJpdmVyU3RhcnRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobUNvbm5lY3RNb2RlU3RhdGUsIG1Ecml2ZXJTdGFydGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobUNvbm5lY3RpbmdTdGF0ZSwgbUNvbm5lY3RNb2RlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobUNvbm5lY3RlZFN0YXRlLCBtQ29ubmVjdE1vZGVTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRGlzY29ubmVjdGluZ1N0YXRlLCBtQ29ubmVjdE1vZGVTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRGlzY29ubmVjdGVkU3RhdGUsIG1Db25uZWN0TW9kZVN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyU3RvcHBpbmdTdGF0ZSwgbURyaXZlclN1cFJlYWR5U3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Ecml2ZXJTdG9wcGVkU3RhdGUsIG1Ecml2ZXJTdXBSZWFkeVN0YXRlKTsKKyAgICAgICAgICAgIGFkZFN0YXRlKG1Tb2Z0QXBTdGFydGVkU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworCisgICAgICAgIHNldEluaXRpYWxTdGF0ZShtSW5pdGlhbFN0YXRlKTsKKworICAgICAgICBpZiAoREJHKSBzZXREYmcodHJ1ZSk7CisKKyAgICAgICAgLy9zdGFydCB0aGUgc3RhdGUgbWFjaGluZQorICAgICAgICBzdGFydCgpOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBNZXRob2RzIGV4cG9zZWQgZm9yIHB1YmxpYyB1c2UKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzeW5jUGluZ1N1cHBsaWNhbnQoKSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2UoQ01EX1BJTkdfU1VQUExJQ0FOVCkuYm9vbFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2Nhbihib29sZWFuIGZvcmNlQWN0aXZlKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NUQVJUX1NDQU4sIGZvcmNlQWN0aXZlID8KKyAgICAgICAgICAgICAgICBTQ0FOX0FDVElWRSA6IFNDQU5fUEFTU0lWRSwgMCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdpZmlFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIG1MYXN0RW5hYmxlVWlkLnNldChCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgaWYgKGVuYWJsZSkgeworICAgICAgICAgICAgLyogQXJndW1lbnQgaXMgdGhlIHN0YXRlIHRoYXQgaXMgZW50ZXJlZCBwcmlvciB0byBsb2FkICovCisgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9MT0FEX0RSSVZFUiwgV0lGSV9TVEFURV9FTkFCTElORywgMCkpOworICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1NUQVJUX1NVUFBMSUNBTlQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1NUT1BfU1VQUExJQ0FOVCk7CisgICAgICAgICAgICAvKiBBcmd1bWVudCBpcyB0aGUgc3RhdGUgdGhhdCBpcyBlbnRlcmVkIHVwb24gc3VjY2VzcyAqLworICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUiwgV0lGSV9TVEFURV9ESVNBQkxFRCwgMCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2lmaUFwRW5hYmxlZChXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnLCBib29sZWFuIGVuYWJsZSkgeworICAgICAgICBtTGFzdEFwRW5hYmxlVWlkLnNldChCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgaWYgKGVuYWJsZSkgeworICAgICAgICAgICAgLyogQXJndW1lbnQgaXMgdGhlIHN0YXRlIHRoYXQgaXMgZW50ZXJlZCBwcmlvciB0byBsb2FkICovCisgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9MT0FEX0RSSVZFUiwgV0lGSV9BUF9TVEFURV9FTkFCTElORywgMCkpOworICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU1RBUlRfQVAsIHdpZmlDb25maWcpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9TVE9QX0FQKTsKKyAgICAgICAgICAgIC8qIEFyZ3VtZW50IGlzIHRoZSBzdGF0ZSB0aGF0IGlzIGVudGVyZWQgdXBvbiBzdWNjZXNzICovCisgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9VTkxPQURfRFJJVkVSLCBXSUZJX0FQX1NUQVRFX0RJU0FCTEVELCAwKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHN5bmNHZXRXaWZpU3RhdGUoKSB7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlLmdldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgc3luY0dldFdpZmlTdGF0ZUJ5TmFtZSgpIHsKKyAgICAgICAgc3dpdGNoIChtV2lmaVN0YXRlLmdldCgpKSB7CisgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRElTQUJMSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAiZGlzYWJsaW5nIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImRpc2FibGVkIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9FTkFCTElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gImVuYWJsaW5nIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9FTkFCTEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiZW5hYmxlZCI7CisgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gInVua25vd24gc3RhdGUiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIltpbnZhbGlkIHN0YXRlXSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHN5bmNHZXRXaWZpQXBTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1XaWZpQXBTdGF0ZS5nZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHN5bmNHZXRXaWZpQXBTdGF0ZUJ5TmFtZSgpIHsKKyAgICAgICAgc3dpdGNoIChtV2lmaUFwU3RhdGUuZ2V0KCkpIHsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9ESVNBQkxJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuICJkaXNhYmxpbmciOworICAgICAgICAgICAgY2FzZSBXSUZJX0FQX1NUQVRFX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiZGlzYWJsZWQiOworICAgICAgICAgICAgY2FzZSBXSUZJX0FQX1NUQVRFX0VOQUJMSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAiZW5hYmxpbmciOworICAgICAgICAgICAgY2FzZSBXSUZJX0FQX1NUQVRFX0VOQUJMRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJlbmFibGVkIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9GQUlMRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJmYWlsZWQiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIltpbnZhbGlkIHN0YXRlXSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgc3RhdHVzIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBjb25uZWN0aW9uLCBpZiBhbnkuCisgICAgICogQHJldHVybiBhIHtAbGluayBXaWZpSW5mb30gb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgY29ubmVjdGlvbgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFdpZmlJbmZvIHN5bmNSZXF1ZXN0Q29ubmVjdGlvbkluZm8oKSB7CisgICAgICAgIHJldHVybiBtV2lmaUluZm87CisgICAgfQorCisgICAgcHVibGljIERoY3BJbmZvIHN5bmNHZXREaGNwSW5mbygpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtRGhjcEluZm8pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRGhjcEluZm8obURoY3BJbmZvKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERyaXZlclN0YXJ0KGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICBpZiAoZW5hYmxlKSB7CisgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1NUQVJUX0RSSVZFUik7CisgICAgICB9IGVsc2UgeworICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9TVE9QX0RSSVZFUik7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Nhbk9ubHlNb2RlKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICBpZiAoZW5hYmxlKSB7CisgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX1NDQU5fTU9ERSwgU0NBTl9PTkxZX01PREUsIDApKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX1NDQU5fTU9ERSwgQ09OTkVDVF9NT0RFLCAwKSk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2NhblR5cGUoYm9vbGVhbiBhY3RpdmUpIHsKKyAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TRVRfU0NBTl9UWVBFLCBTQ0FOX0FDVElWRSwgMCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TRVRfU0NBTl9UWVBFLCBTQ0FOX1BBU1NJVkUsIDApKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTY2FuUmVzdWx0PiBzeW5jR2V0U2NhblJlc3VsdHNMaXN0KCkgeworICAgICAgICByZXR1cm4gbVNjYW5SZXN1bHRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2Nvbm5lY3QgZnJvbSBBY2Nlc3MgUG9pbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0Q29tbWFuZCgpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0RJU0NPTk5FQ1QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYXRlIGEgcmVjb25uZWN0aW9uIHRvIEFQCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjb25uZWN0Q29tbWFuZCgpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1JFQ09OTkVDVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhdGUgYSByZS1hc3NvY2lhdGlvbiB0byBBUAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlYXNzb2NpYXRlQ29tbWFuZCgpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1JFQVNTT0NJQVRFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXR3b3JrIHN5bmNocm9ub3VzbHkKKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV0d29yayBpZCBvZiB0aGUgbmV3IG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHN5bmNBZGRPclVwZGF0ZU5ldHdvcmsoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2UoQ01EX0FERF9PUl9VUERBVEVfTkVUV09SSywgY29uZmlnKS5pbnRWYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxXaWZpQ29uZmlndXJhdGlvbj4gc3luY0dldENvbmZpZ3VyZWROZXR3b3JrcygpIHsKKyAgICAgICAgcmV0dXJuIFdpZmlDb25maWdTdG9yZS5nZXRDb25maWd1cmVkTmV0d29ya3MoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxldGUgYSBuZXR3b3JrCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV0d29ya0lkIGlkIG9mIHRoZSBuZXR3b3JrIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzeW5jUmVtb3ZlTmV0d29yayhpbnQgbmV0d29ya0lkKSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfUkVNT1ZFX05FVFdPUkssIG5ldHdvcmtJZCwgMCkpLmJvb2xWYWx1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEVuYWJsZU5ldFBhcmFtcyB7CisgICAgICAgIHByaXZhdGUgaW50IG5ldElkOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gZGlzYWJsZU90aGVyczsKKyAgICAgICAgRW5hYmxlTmV0UGFyYW1zKGludCBuLCBib29sZWFuIGIpIHsKKyAgICAgICAgICAgIG5ldElkID0gbjsKKyAgICAgICAgICAgIGRpc2FibGVPdGhlcnMgPSBiOworICAgICAgICB9CisgICAgfQorICAgIC8qKgorICAgICAqIEVuYWJsZSBhIG5ldHdvcmsKKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIGlkIG9mIHRoZSBuZXR3b3JrCisgICAgICogQHBhcmFtIGRpc2FibGVPdGhlcnMgdHJ1ZSwgaWYgYWxsIG90aGVyIG5ldHdvcmtzIGhhdmUgdG8gYmUgZGlzYWJsZWQKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN5bmNFbmFibGVOZXR3b3JrKGludCBuZXRJZCwgYm9vbGVhbiBkaXNhYmxlT3RoZXJzKSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2UoQ01EX0VOQUJMRV9ORVRXT1JLLAorICAgICAgICAgICAgICAgIG5ldyBFbmFibGVOZXRQYXJhbXMobmV0SWQsIGRpc2FibGVPdGhlcnMpKS5ib29sVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzYWJsZSBhIG5ldHdvcmsKKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIGlkIG9mIHRoZSBuZXR3b3JrCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzeW5jRGlzYWJsZU5ldHdvcmsoaW50IG5ldElkKSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfRElTQUJMRV9ORVRXT1JLLCBuZXRJZCwgMCkpLmJvb2xWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCbGFja2xpc3QgYSBCU1NJRC4gVGhpcyB3aWxsIGF2b2lkIHRoZSBBUCBpZiB0aGVyZSBhcmUKKyAgICAgKiBhbHRlcm5hdGUgQVBzIHRvIGNvbm5lY3QKKyAgICAgKgorICAgICAqIEBwYXJhbSBic3NpZCBCU1NJRCBvZiB0aGUgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRvQmxhY2tsaXN0KFN0cmluZyBic3NpZCkgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9CTEFDS0xJU1RfTkVUV09SSywgYnNzaWQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciB0aGUgYmxhY2tsaXN0IGxpc3QKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyQmxhY2tsaXN0KCkgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9DTEVBUl9CTEFDS0xJU1QpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0TmV0d29yayhpbnQgbmV0SWQpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfQ09OTkVDVF9ORVRXT1JLLCBuZXRJZCwgMCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvbm5lY3ROZXR3b3JrKFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25maWcpIHsKKyAgICAgICAgLyogYXJnMSBpcyB1c2VkIHRvIGluZGljYXRlIG5ldElkLCBmb3JjZSBhIG5ldElkIHZhbHVlIG9mIC0xIHdoZW4KKyAgICAgICAgICogd2UgYXJlIHBhc3NpbmcgYSBjb25maWd1cmF0aW9uIHNpbmNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mCisgICAgICAgICAqIDAgaXMgYSB2YWxpZCBuZXRJZAorICAgICAgICAgKi8KKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfQ09OTkVDVF9ORVRXT1JLLCAtMSwgMCwgd2lmaUNvbmZpZykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNhdmVOZXR3b3JrKFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25maWcpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0FWRV9ORVRXT1JLLCB3aWZpQ29uZmlnKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZm9yZ2V0TmV0d29yayhpbnQgbmV0SWQpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfRk9SR0VUX05FVFdPUkssIG5ldElkLCAwKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnRXcHNQYmMoU3RyaW5nIGJzc2lkKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NUQVJUX1dQUywgYnNzaWQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydFdwc1BpbihTdHJpbmcgYnNzaWQsIGludCBhcFBpbikgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TVEFSVF9XUFMsIGFwUGluLCAwLCBic3NpZCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuYWJsZVJzc2lQb2xsaW5nKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0VOQUJMRV9SU1NJX1BPTEwsIGVuYWJsZWQgPyAxIDogMCwgMCkpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBHZXQgUlNTSSB0byBjdXJyZW50bHkgY29ubmVjdGVkIG5ldHdvcmsKKyAgICAgKgorICAgICAqIEByZXR1cm4gUlNTSSB2YWx1ZSwgLTEgb24gZmFpbHVyZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgc3luY0dldFJzc2koKSB7CisgICAgICAgIHJldHVybiBzZW5kU3luY01lc3NhZ2UoQ01EX0dFVF9SU1NJKS5pbnRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYXBwcm94IFJTU0kgdG8gY3VycmVudGx5IGNvbm5lY3RlZCBuZXR3b3JrCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJTU0kgdmFsdWUsIC0xIG9uIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHN5bmNHZXRSc3NpQXBwcm94KCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9HRVRfUlNTSV9BUFBST1gpLmludFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBsaW5rIHNwZWVkIHRvIGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yaworICAgICAqCisgICAgICogQHJldHVybiBsaW5rIHNwZWVkLCAtMSBvbiBmYWlsdXJlCisgICAgICovCisgICAgcHVibGljIGludCBzeW5jR2V0TGlua1NwZWVkKCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9HRVRfTElOS19TUEVFRCkuaW50VmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IE1BQyBhZGRyZXNzIG9mIHJhZGlvCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1BQyBhZGRyZXNzLCBudWxsIG9uIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHN5bmNHZXRNYWNBZGRyZXNzKCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9HRVRfTUFDX0FERFIpLnN0cmluZ1ZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IHBhY2tldCBmaWx0ZXJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFBhY2tldEZpbHRlcmluZygpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1NUQVJUX1BBQ0tFVF9GSUxURVJJTkcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3AgcGFja2V0IGZpbHRlcmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3BQYWNrZXRGaWx0ZXJpbmcoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBwb3dlciBtb2RlCisgICAgICogQHBhcmFtIG1vZGUKKyAgICAgKiAgICAgRFJJVkVSX1BPV0VSX01PREVfQVVUTworICAgICAqICAgICBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQb3dlck1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX1BPV0VSX01PREUsIG1vZGUsIDApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG51bWJlciBvZiBhbGxvd2VkIHJhZGlvIGZyZXF1ZW5jeSBjaGFubmVscyBmcm9tIHRoZSBzeXN0ZW0KKyAgICAgKiBzZXR0aW5nIHZhbHVlLCBpZiBhbnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TnVtQWxsb3dlZENoYW5uZWxzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2V0TnVtQWxsb3dlZENoYW5uZWxzKAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9OVU1fQUxMT1dFRF9DSEFOTkVMUykpOworICAgICAgICB9IGNhdGNoIChTZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKG1OdW1BbGxvd2VkQ2hhbm5lbHMgIT0gMCkgeworICAgICAgICAgICAgICAgIHNldE51bUFsbG93ZWRDaGFubmVscyhtTnVtQWxsb3dlZENoYW5uZWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgdXNlIHRoZSBkcml2ZXIgZGVmYXVsdAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBudW1iZXIgb2YgcmFkaW8gZnJlcXVlbmN5IGNoYW5uZWxzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgdXNlZAorICAgICAqIGluIHRoZSBjdXJyZW50IHJlZ3VsYXRvcnkgZG9tYWluLgorICAgICAqIEBwYXJhbSBudW1DaGFubmVscyB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgY2hhbm5lbHMuIE11c3QgYmUgZ3JlYXRlciB0aGFuIDAKKyAgICAgKiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE2LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE51bUFsbG93ZWRDaGFubmVscyhpbnQgbnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTLCBudW1DaGFubmVscywgMCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBudW1iZXIgb2YgYWxsb3dlZCBjaGFubmVscworICAgICAqCisgICAgICogQHJldHVybiBjaGFubmVsIGNvdW50LCAtMSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBUT0RPOiB0aGlzIGlzIG5vdCBhIHB1YmxpYyBBUEkgYW5kIG5lZWRzIHRvIGJlIHJlbW92ZWQgaW4gZmF2b3IKKyAgICAgKiBvZiBhc3luY2hyb25vdXMgcmVwb3J0aW5nLiB1bnVzZWQgZm9yIG5vdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE51bUFsbG93ZWRDaGFubmVscygpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBibHVldG9vdGggY29leCBtb2RlOgorICAgICAqCisgICAgICogQHBhcmFtIG1vZGUKKyAgICAgKiAgQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfRU5BQkxFRAorICAgICAqICBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9ESVNBQkxFRAorICAgICAqICBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9TRU5TRQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZShpbnQgbW9kZSkgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TRVRfQkxVRVRPT1RIX0NPRVhJU1RFTkNFLCBtb2RlLCAwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlIG9yIGRpc2FibGUgQmx1ZXRvb3RoIGNvZXhpc3RlbmNlIHNjYW4gbW9kZS4gV2hlbiB0aGlzIG1vZGUgaXMgb24sCisgICAgICogc29tZSBvZiB0aGUgbG93LWxldmVsIHNjYW4gcGFyYW1ldGVycyB1c2VkIGJ5IHRoZSBkcml2ZXIgYXJlIGNoYW5nZWQgdG8KKyAgICAgKiByZWR1Y2UgaW50ZXJmZXJlbmNlIHdpdGggQTJEUCBzdHJlYW1pbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXNCbHVldG9vdGhQbGF5aW5nIHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhpcyBtb2RlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Qmx1ZXRvb3RoU2Nhbk1vZGUoYm9vbGVhbiBpc0JsdWV0b290aFBsYXlpbmcpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREUsIGlzQmx1ZXRvb3RoUGxheWluZyA/IDEgOiAwLCAwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZSBjb25maWd1cmF0aW9uIG9uIHN1cHBsaWNhbnQKKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICoKKyAgICAgKiBUT0RPOiBkZXByZWNhdGUgdGhpcworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN5bmNTYXZlQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9TQVZFX0NPTkZJRykuYm9vbFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RDbVdha2VMb2NrKCkgeworICAgICAgICBzZW5kTWVzc2FnZShDTURfUkVRVUVTVF9DTV9XQUtFTE9DSyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlQmF0dGVyeVdvcmtTb3VyY2UoV29ya1NvdXJjZSBuZXdTb3VyY2UpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtUnVubmluZ1dpZmlVaWRzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChuZXdTb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtUnVubmluZ1dpZmlVaWRzLnNldChuZXdTb3VyY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobUlzUnVubmluZykgeworICAgICAgICAgICAgICAgICAgICBpZiAobVJlcG9ydGVkUnVubmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHdvcmsgc291cmNlIGhhcyBjaGFuZ2VkIHNpbmNlIGxhc3QgdGltZSwgbmVlZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gcmVtb3ZlIG9sZCB3b3JrIGZyb20gYmF0dGVyeSBzdGF0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTGFzdFJ1bm5pbmdXaWZpVWlkcy5kaWZmKG1SdW5uaW5nV2lmaVVpZHMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaVJ1bm5pbmdDaGFuZ2VkKG1MYXN0UnVubmluZ1dpZmlVaWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJ1bm5pbmdXaWZpVWlkcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RSdW5uaW5nV2lmaVVpZHMuc2V0KG1SdW5uaW5nV2lmaVVpZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm93IGJlaW5nIHN0YXJ0ZWQsIHJlcG9ydCBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlSdW5uaW5nKG1SdW5uaW5nV2lmaVVpZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RSdW5uaW5nV2lmaVVpZHMuc2V0KG1SdW5uaW5nV2lmaVVpZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgbVJlcG9ydGVkUnVubmluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAobVJlcG9ydGVkUnVubmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGFzdCByZXBvcnRlZCB3ZSB3ZXJlIHJ1bm5pbmcsIHRpbWUgdG8gc3RvcC4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlTdG9wcGVkKG1MYXN0UnVubmluZ1dpZmlVaWRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0UnVubmluZ1dpZmlVaWRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUmVwb3J0ZWRSdW5uaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZyBMUyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgc2IuYXBwZW5kKCJjdXJyZW50IEhTTSBzdGF0ZTogIikuYXBwZW5kKGdldEN1cnJlbnRTdGF0ZSgpLmdldE5hbWUoKSkuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtTGlua1Byb3BlcnRpZXMgIikuYXBwZW5kKG1MaW5rUHJvcGVydGllcykuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtV2lmaUluZm8gIikuYXBwZW5kKG1XaWZpSW5mbykuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtRGhjcEluZm8gIikuYXBwZW5kKG1EaGNwSW5mbykuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtTmV0d29ya0luZm8gIikuYXBwZW5kKG1OZXR3b3JrSW5mbykuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtTnVtQWxsb3dlZENoYW5uZWxzICIpLmFwcGVuZChtTnVtQWxsb3dlZENoYW5uZWxzKS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIm1MYXN0U2lnbmFsTGV2ZWwgIikuYXBwZW5kKG1MYXN0U2lnbmFsTGV2ZWwpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibUxhc3RCc3NpZCAiKS5hcHBlbmQobUxhc3RCc3NpZCkuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtTGFzdE5ldHdvcmtJZCAiKS5hcHBlbmQobUxhc3ROZXR3b3JrSWQpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibUVuYWJsZUFsbE5ldHdvcmtzICIpLmFwcGVuZChtRW5hYmxlQWxsTmV0d29ya3MpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibUVuYWJsZVJzc2lQb2xsaW5nICIpLmFwcGVuZChtRW5hYmxlUnNzaVBvbGxpbmcpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgIikuYXBwZW5kKG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0KS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIm1SZWNvbm5lY3RDb3VudCAiKS5hcHBlbmQobVJlY29ubmVjdENvdW50KS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIm1Jc1NjYW5Nb2RlICIpLmFwcGVuZChtSXNTY2FuTW9kZSkuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJTdXBwbGljYW50IHN0YXR1cyIpLmFwcGVuZChMUykKKyAgICAgICAgICAgICAgICAuYXBwZW5kKFdpZmlOYXRpdmUuc3RhdHVzQ29tbWFuZCgpKS5hcHBlbmQoTFMpLmFwcGVuZChMUyk7CisKKyAgICAgICAgc2IuYXBwZW5kKFdpZmlDb25maWdTdG9yZS5kdW1wKCkpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogSW50ZXJuYWwgcHJpdmF0ZSBmdW5jdGlvbnMKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBjbGFzcyBTeW5jUmV0dXJuIHsKKyAgICAgICAgYm9vbGVhbiBib29sVmFsdWU7CisgICAgICAgIGludCBpbnRWYWx1ZTsKKyAgICAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlOworICAgICAgICBPYmplY3Qgb2JqVmFsdWU7CisgICAgfQorCisgICAgY2xhc3MgU3luY1BhcmFtcyB7CisgICAgICAgIE9iamVjdCBtUGFyYW1ldGVyOworICAgICAgICBTeW5jUmV0dXJuIG1TeW5jUmV0dXJuOworICAgICAgICBTeW5jUGFyYW1zKCkgeworICAgICAgICAgICAgbVN5bmNSZXR1cm4gPSBuZXcgU3luY1JldHVybigpOworICAgICAgICB9CisgICAgICAgIFN5bmNQYXJhbXMoT2JqZWN0IHApIHsKKyAgICAgICAgICAgIG1QYXJhbWV0ZXIgPSBwOworICAgICAgICAgICAgbVN5bmNSZXR1cm4gPSBuZXcgU3luY1JldHVybigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogbWVzc2FnZS5vYmogaXMgdXNlZCB0byBzdG9yZSBTeW5jUGFyYW1zCisgICAgICovCisgICAgcHJpdmF0ZSBTeW5jUmV0dXJuIHN5bmNlZFNlbmQoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1zZy5vYmo7CisgICAgICAgIHN5bmNocm9uaXplZChzeW5jUGFyYW1zKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJzeW5jZWRTZW5kICIgKyBtc2cpOworICAgICAgICAgICAgc2VuZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3luY1BhcmFtcy53YWl0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAic2VuZFN5bmNNZXNzYWdlOiB1bmV4cGVjdGVkIGludGVycnVwdGlvbiBvZiB3YWl0KCkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3luY1BhcmFtcy5tU3luY1JldHVybjsKKyAgICB9CisKKyAgICBwcml2YXRlIFN5bmNSZXR1cm4gc2VuZFN5bmNNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIFN5bmNQYXJhbXMgc3luY1BhcmFtcyA9IG5ldyBTeW5jUGFyYW1zKCk7CisgICAgICAgIG1zZy5vYmogPSBzeW5jUGFyYW1zOworICAgICAgICByZXR1cm4gc3luY2VkU2VuZChtc2cpOworICAgIH0KKworICAgIHByaXZhdGUgU3luY1JldHVybiBzZW5kU3luY01lc3NhZ2UoaW50IHdoYXQsIE9iamVjdCBwYXJhbSkgeworICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXMgPSBuZXcgU3luY1BhcmFtcyhwYXJhbSk7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gb2J0YWluTWVzc2FnZSh3aGF0LCBzeW5jUGFyYW1zKTsKKyAgICAgICAgcmV0dXJuIHN5bmNlZFNlbmQobXNnKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgU3luY1JldHVybiBzZW5kU3luY01lc3NhZ2UoaW50IHdoYXQpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRTeW5jTWVzc2FnZShvYnRhaW5NZXNzYWdlKHdoYXQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5T25Nc2dPYmplY3QoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1zZy5vYmo7CisgICAgICAgIGlmIChzeW5jUGFyYW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZChzeW5jUGFyYW1zKSB7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAibm90aWZ5T25Nc2dPYmplY3QgIiArIG1zZyk7CisgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5ub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yISBzeW5jUGFyYW1zIGluIG5vdGlmeU9uTXNnT2JqZWN0IGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRXaWZpU3RhdGUoaW50IHdpZmlTdGF0ZSkgeworICAgICAgICBmaW5hbCBpbnQgcHJldmlvdXNXaWZpU3RhdGUgPSBtV2lmaVN0YXRlLmdldCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAod2lmaVN0YXRlID09IFdJRklfU1RBVEVfRU5BQkxFRCkgeworICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlPbigpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aWZpU3RhdGUgPT0gV0lGSV9TVEFURV9ESVNBQkxFRCkgeworICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlPZmYoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBub3RlIGJhdHRlcnkgc3RhdHMgaW4gd2lmaSIpOworICAgICAgICB9CisKKyAgICAgICAgbVdpZmlTdGF0ZS5zZXQod2lmaVN0YXRlKTsKKworICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJzZXRXaWZpU3RhdGU6ICIgKyBzeW5jR2V0V2lmaVN0YXRlQnlOYW1lKCkpOworCisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1dJRklfU1RBVEUsIHdpZmlTdGF0ZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9QUkVWSU9VU19XSUZJX1NUQVRFLCBwcmV2aW91c1dpZmlTdGF0ZSk7CisgICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0V2lmaUFwU3RhdGUoaW50IHdpZmlBcFN0YXRlKSB7CisgICAgICAgIGZpbmFsIGludCBwcmV2aW91c1dpZmlBcFN0YXRlID0gbVdpZmlBcFN0YXRlLmdldCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAod2lmaUFwU3RhdGUgPT0gV0lGSV9BUF9TVEFURV9FTkFCTEVEKSB7CisgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaU9uKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdpZmlBcFN0YXRlID09IFdJRklfQVBfU1RBVEVfRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT2ZmKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJGYWlsZWQgdG8gbm90ZSBiYXR0ZXJ5IHN0YXRzIGluIHdpZmkiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVwZGF0ZSBzdGF0ZQorICAgICAgICBtV2lmaUFwU3RhdGUuc2V0KHdpZmlBcFN0YXRlKTsKKworICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJzZXRXaWZpQXBTdGF0ZTogIiArIHN5bmNHZXRXaWZpQXBTdGF0ZUJ5TmFtZSgpKTsKKworICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9XSUZJX0FQX1NUQVRFLCB3aWZpQXBTdGF0ZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9QUkVWSU9VU19XSUZJX0FQX1NUQVRFLCBwcmV2aW91c1dpZmlBcFN0YXRlKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBzY2FuIHJlc3VsdCBsaW5lIHBhc3NlZCB0byB1cyBieSB3cGFfc3VwcGxpY2FudCAoaGVscGVyKS4KKyAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSB0byBwYXJzZQorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBTY2FuUmVzdWx0fSBvYmplY3QKKyAgICAgKi8KKyAgICBwcml2YXRlIFNjYW5SZXN1bHQgcGFyc2VTY2FuUmVzdWx0KFN0cmluZyBsaW5lKSB7CisgICAgICAgIFNjYW5SZXN1bHQgc2NhblJlc3VsdCA9IG51bGw7CisgICAgICAgIGlmIChsaW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDYWNoZSBpbXBsZW1lbnRhdGlvbiAoTGlua2VkSGFzaE1hcCkgaXMgbm90IHN5bmNocm9uaXplZCwgdGh1cywKKyAgICAgICAgICAgICAqIG11c3Qgc3luY2hyb25pemVkIGhlcmUhCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVNjYW5SZXN1bHRDYWNoZSkgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IHNjYW5SZXN1bHRQYXR0ZXJuLnNwbGl0KGxpbmUpOworICAgICAgICAgICAgICAgIGlmICgzIDw9IHJlc3VsdC5sZW5ndGggJiYgcmVzdWx0Lmxlbmd0aCA8PSA1KSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBic3NpZCA9IHJlc3VsdFswXTsKKyAgICAgICAgICAgICAgICAgICAgLy8gYnNzaWQgfCBmcmVxdWVuY3kgfCBsZXZlbCB8IGZsYWdzIHwgc3NpZAorICAgICAgICAgICAgICAgICAgICBpbnQgZnJlcXVlbmN5OworICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3VsdFsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IEludGVnZXIucGFyc2VJbnQocmVzdWx0WzJdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbWUgaW1wbGVtZW50YXRpb25zIGF2b2lkIG5lZ2F0aXZlIHZhbHVlcyBieSBhZGRpbmcgMjU2CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzbyB3ZSBuZWVkIHRvIGFkanVzdCBmb3IgdGhhdCBoZXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPiAwKSBsZXZlbCAtPSAyNTY7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogVGhlIGZvcm1hdHRpbmcgb2YgdGhlIHJlc3VsdHMgcmV0dXJuZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICogd3BhX3N1cHBsaWNhbnQgaXMgaW50ZW5kZWQgdG8gbWFrZSB0aGUgZmllbGRzCisgICAgICAgICAgICAgICAgICAgICAqIGxpbmUgdXAgbmljZWx5IHdoZW4gcHJpbnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICogbm90IHRvIG1ha2UgdGhlbSBlYXN5IHRvIHBhcnNlLiBTbyB3ZSBoYXZlIHRvCisgICAgICAgICAgICAgICAgICAgICAqIGFwcGx5IHNvbWUgaGV1cmlzdGljcyB0byBmaWd1cmUgb3V0IHdoaWNoIGZpZWxkCisgICAgICAgICAgICAgICAgICAgICAqIGlzIHRoZSBTU0lEIGFuZCB3aGljaCBmaWVsZCBpcyB0aGUgZmxhZ3MuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3NpZDsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZsYWdzOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PSA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0WzNdLmNoYXJBdCgwKSA9PSAnWycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlc3VsdFszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2lkID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCA9IHJlc3VsdFszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQubGVuZ3RoID09IDUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmVzdWx0WzNdOworICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCA9IHJlc3VsdFs0XTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUsIHdlIG11c3QgaGF2ZSAzIGZpZWxkczogbm8gZmxhZ3MgYW5kIHNzaWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzaWQgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGJzc2lkICsgc3NpZCBpcyB0aGUgaGFzaCBrZXkKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGJzc2lkICsgc3NpZDsKKyAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdCA9IG1TY2FuUmVzdWx0Q2FjaGUuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzY2FuUmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQubGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQuU1NJRCA9IHNzaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0LmNhcGFiaWxpdGllcyA9IGZsYWdzOworICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdC5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgYWRkIHNjYW4gcmVzdWx0cyB0aGF0IGhhdmUgbm8gU1NJRCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwIDwgc3NpZC50cmltKCkubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNjYW5SZXN1bHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2lkLCBic3NpZCwgZmxhZ3MsIGxldmVsLCBmcmVxdWVuY3kpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TY2FuUmVzdWx0Q2FjaGUucHV0KGtleSwgc2NhblJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJNaXNmb3JtYXR0ZWQgc2NhbiByZXN1bHQgdGV4dCB3aXRoICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQubGVuZ3RoICsgIiBmaWVsZHM6ICIgKyBsaW5lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2NhblJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzY2FuUmVzdWx0cyBpbnB1dCBmb3JtYXQKKyAgICAgKiAwMDpiYjpjYzpkZDpjYzplZSAgICAgICAyNDI3ICAgIDE2NiAgICAgW1dQQS1FQVAtVEtJUF1bV1BBMi1FQVAtQ0NNUF0gICBOZXQxCisgICAgICogMDA6YmI6Y2M6ZGQ6Y2M6ZmYgICAgICAgMjQxMiAgICAxNjUgICAgIFtXUEEtRUFQLVRLSVBdW1dQQTItRUFQLUNDTVBdICAgTmV0MgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRTY2FuUmVzdWx0cyhTdHJpbmcgc2NhblJlc3VsdHMpIHsKKyAgICAgICAgaWYgKHNjYW5SZXN1bHRzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8U2NhblJlc3VsdD4gc2Nhbkxpc3QgPSBuZXcgQXJyYXlMaXN0PFNjYW5SZXN1bHQ+KCk7CisKKyAgICAgICAgaW50IGxpbmVDb3VudCA9IDA7CisKKyAgICAgICAgaW50IHNjYW5SZXN1bHRzTGVuID0gc2NhblJlc3VsdHMubGVuZ3RoKCk7CisgICAgICAgIC8vIFBhcnNlIHRoZSByZXN1bHQgc3RyaW5nLCBrZWVwaW5nIGluIG1pbmQgdGhhdCB0aGUgbGFzdCBsaW5lIGRvZXMKKyAgICAgICAgLy8gbm90IGVuZCB3aXRoIGEgbmV3bGluZS4KKyAgICAgICAgZm9yIChpbnQgbGluZUJlZyA9IDAsIGxpbmVFbmQgPSAwOyBsaW5lRW5kIDw9IHNjYW5SZXN1bHRzTGVuOyArK2xpbmVFbmQpIHsKKyAgICAgICAgICAgIGlmIChsaW5lRW5kID09IHNjYW5SZXN1bHRzTGVuIHx8IHNjYW5SZXN1bHRzLmNoYXJBdChsaW5lRW5kKSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgKytsaW5lQ291bnQ7CisKKyAgICAgICAgICAgICAgICBpZiAobGluZUNvdW50ID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZUJlZyA9IGxpbmVFbmQgKyAxOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxpbmVFbmQgPiBsaW5lQmVnKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gc2NhblJlc3VsdHMuc3Vic3RyaW5nKGxpbmVCZWcsIGxpbmVFbmQpOworICAgICAgICAgICAgICAgICAgICBTY2FuUmVzdWx0IHNjYW5SZXN1bHQgPSBwYXJzZVNjYW5SZXN1bHQobGluZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzY2FuUmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5MaXN0LmFkZChzY2FuUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIm1pc2Zvcm1hdHRlZCBzY2FuIHJlc3VsdCBmb3I6ICIgKyBsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaW5lQmVnID0gbGluZUVuZCArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtU2NhblJlc3VsdHMgPSBzY2FuTGlzdDsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBmZXRjaFNTSUQoKSB7CisgICAgICAgIFN0cmluZyBzdGF0dXMgPSBXaWZpTmF0aXZlLnN0YXR1c0NvbW1hbmQoKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvLyBleHRyYWN0IHNzaWQgZnJvbSBhIHNlcmllcyBvZiAibmFtZT12YWx1ZSIKKyAgICAgICAgU3RyaW5nW10gbGluZXMgPSBzdGF0dXMuc3BsaXQoIlxuIik7CisgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBsaW5lcykgeworICAgICAgICAgICAgU3RyaW5nW10gcHJvcCA9IGxpbmUuc3BsaXQoIiAqPSAqIik7CisgICAgICAgICAgICBpZiAocHJvcC5sZW5ndGggPCAyKSBjb250aW51ZTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcHJvcFswXTsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHByb3BbMV07CisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJzc2lkIikpIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlTGlua1Byb3BlcnRpZXMoKSB7CisKKyAgICAgICAgbUxpbmtQcm9wZXJ0aWVzLnNldEludGVyZmFjZU5hbWUobUludGVyZmFjZU5hbWUpOworCisgICAgICAgIC8vIFRPRE8gLSBmaXggdGhpcyBmb3IgdjYKKyAgICAgICAgc3luY2hyb25pemVkIChtRGhjcEluZm8pIHsKKyAgICAgICAgICAgIG1MaW5rUHJvcGVydGllcy5hZGRMaW5rQWRkcmVzcyhuZXcgTGlua0FkZHJlc3MoCisgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlscy5pbnRUb0luZXRBZGRyZXNzKG1EaGNwSW5mby5pcEFkZHJlc3MpLAorICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMuaW50VG9JbmV0QWRkcmVzcyhtRGhjcEluZm8ubmV0bWFzaykpKTsKKyAgICAgICAgICAgIG1MaW5rUHJvcGVydGllcy5zZXRHYXRld2F5KE5ldHdvcmtVdGlscy5pbnRUb0luZXRBZGRyZXNzKG1EaGNwSW5mby5nYXRld2F5KSk7CisgICAgICAgICAgICBtTGlua1Byb3BlcnRpZXMuYWRkRG5zKE5ldHdvcmtVdGlscy5pbnRUb0luZXRBZGRyZXNzKG1EaGNwSW5mby5kbnMxKSk7CisgICAgICAgICAgICBtTGlua1Byb3BlcnRpZXMuYWRkRG5zKE5ldHdvcmtVdGlscy5pbnRUb0luZXRBZGRyZXNzKG1EaGNwSW5mby5kbnMyKSk7CisgICAgICAgIH0KKworICAgICAgICBQcm94eVByb3BlcnRpZXMgcHJveHlQcm9wZXJ0aWVzID0gV2lmaUNvbmZpZ1N0b3JlLmdldFByb3h5UHJvcGVydGllcyhtTGFzdE5ldHdvcmtJZCk7CisgICAgICAgIGlmIChwcm94eVByb3BlcnRpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxpbmtQcm9wZXJ0aWVzLnNldEh0dHBQcm94eShwcm94eVByb3BlcnRpZXMpOworICAgICAgICAgICAgTG9nLmQoVEFHLCAibmV0SWQ9IiArIG1MYXN0TmV0d29ya0lkICArICIgcHJveHkgY29uZmlndXJlZDogIgorICAgICAgICAgICAgICAgICAgICArIHByb3h5UHJvcGVydGllcy50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldE1heERoY3BSZXRyaWVzKCkgeworICAgICAgICByZXR1cm4gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTUFYX0RIQ1BfUkVUUllfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfTUFYX0RIQ1BfUkVUUklFUyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBkaXNhYmxlIGNvZXhpc3RlbmNlIG1vZGUgd2hpbGUgb2J0YWluaW5nIElQIGFkZHJlc3MuIFRoaXMKKyAgICAgKiBsb2dpYyB3aWxsIHJldHVybiB0cnVlIG9ubHkgaWYgdGhlIGN1cnJlbnQgYmx1ZXRvb3RoCisgICAgICogaGVhZHNldC9oYW5kc2ZyZWUgc3RhdGUgaXMgZGlzY29ubmVjdGVkLiBUaGlzIG1lYW5zIGlmIGl0IGlzIGluIGFuCisgICAgICogZXJyb3Igc3RhdGUsIHdlIHdpbGwgTk9UIGRpc2FibGUgY29leGlzdGVuY2UgbW9kZSB0byBlcnIgb24gdGhlIHNpZGUKKyAgICAgKiBvZiBzYWZldHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdG8gZGlzYWJsZSBjb2V4aXN0ZW5jZSBtb2RlLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gc2hvdWxkRGlzYWJsZUNvZXhpc3RlbmNlTW9kZSgpIHsKKyAgICAgICAgU2V0PEJsdWV0b290aERldmljZT4gZGV2aWNlcyA9IG1CbHVldG9vdGhIZWFkc2V0LmdldENvbm5lY3RlZERldmljZXMoKTsKKworICAgICAgICByZXR1cm4gKGRldmljZXMuc2l6ZSgpICE9IDAgPyB0cnVlIDogZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2hlY2tJc0JsdWV0b290aFBsYXlpbmcoKSB7CisgICAgICAgIGJvb2xlYW4gaXNCbHVldG9vdGhQbGF5aW5nID0gZmFsc2U7CisgICAgICAgIGlmIChtQmx1ZXRvb3RoQTJkcCAhPSBudWxsKSB7CisgICAgICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBjb25uZWN0ZWQgPSBtQmx1ZXRvb3RoQTJkcC5nZXRDb25uZWN0ZWREZXZpY2VzKCk7CisKKyAgICAgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA6IGNvbm5lY3RlZCkgeworICAgICAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoQTJkcC5pc0EyZHBQbGF5aW5nKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNCbHVldG9vdGhQbGF5aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNldEJsdWV0b290aFNjYW5Nb2RlKGlzQmx1ZXRvb3RoUGxheWluZyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBCbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lciBtQmx1ZXRvb3RoUHJvZmlsZVNlcnZpY2VMaXN0ZW5lciA9CisgICAgICAgIG5ldyBCbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKGludCBwcm9maWxlLCBCbHVldG9vdGhQcm9maWxlIHByb3h5KSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFdpZmlTdGF0ZU1hY2hpbmUudGhpcykgeworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlID09IEJsdWV0b290aFByb2ZpbGUuSEVBRFNFVCkgeworICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldCA9IChCbHVldG9vdGhIZWFkc2V0KSBwcm94eTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5BMkRQKSB7CisgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhBMmRwID0gKEJsdWV0b290aEEyZHApcHJveHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKGludCBwcm9maWxlKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFdpZmlTdGF0ZU1hY2hpbmUudGhpcykgeworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlID09IEJsdWV0b290aFByb2ZpbGUuSEVBRFNFVCkgeworICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldCA9IG51bGw7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlID09IEJsdWV0b290aFByb2ZpbGUuQTJEUCkgeworICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoQTJkcCA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgdm9pZCBzZW5kU2NhblJlc3VsdHNBdmFpbGFibGVCcm9hZGNhc3QoKSB7CisgICAgICAgIGlmICghQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmlzU3lzdGVtUmVhZHkoKSkgcmV0dXJuOworCisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QobmV3IEludGVudChXaWZpTWFuYWdlci5TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFX0FDVElPTikpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kUnNzaUNoYW5nZUJyb2FkY2FzdChmaW5hbCBpbnQgbmV3UnNzaSkgeworICAgICAgICBpZiAoIUFjdGl2aXR5TWFuYWdlck5hdGl2ZS5pc1N5c3RlbVJlYWR5KCkpIHJldHVybjsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5SU1NJX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX05FV19SU1NJLCBuZXdSc3NpKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kTmV0d29ya1N0YXRlQ2hhbmdlQnJvYWRjYXN0KFN0cmluZyBic3NpZCkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVAorICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVQTEFDRV9QRU5ESU5HKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX05FVFdPUktfSU5GTywgbU5ldHdvcmtJbmZvKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX0xJTktfUFJPUEVSVElFUywgbUxpbmtQcm9wZXJ0aWVzKTsKKyAgICAgICAgaWYgKGJzc2lkICE9IG51bGwpCisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfQlNTSUQsIGJzc2lkKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIC8qIFRPRE86IFVudXNlZCBmb3Igbm93LCB3aWxsIGJlIHVzZWQgd2hlbiBpcCBjaGFuZ2Ugb24gY29ubmVjdGVkIG5ldHdvcmsgaXMgaGFuZGxlZCAqLworICAgIHByaXZhdGUgdm9pZCBzZW5kQ29uZmlnQ2hhbmdlQnJvYWRjYXN0KCkgeworICAgICAgICBpZiAoIUFjdGl2aXR5TWFuYWdlck5hdGl2ZS5pc1N5c3RlbVJlYWR5KCkpIHJldHVybjsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuQ09ORklHX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX0xJTktfUFJPUEVSVElFUywgbUxpbmtQcm9wZXJ0aWVzKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kU3VwcGxpY2FudFN0YXRlQ2hhbmdlZEJyb2FkY2FzdChTdGF0ZUNoYW5nZVJlc3VsdCBzYywgYm9vbGVhbiBmYWlsZWRBdXRoKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UCisgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19SRUNFSVZFUl9SRVBMQUNFX1BFTkRJTkcpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfTkVXX1NUQVRFLCAoUGFyY2VsYWJsZSlzYy5zdGF0ZSk7CisgICAgICAgIGlmIChmYWlsZWRBdXRoKSB7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoCisgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVhUUkFfU1VQUExJQ0FOVF9FUlJPUiwKKyAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5FUlJPUl9BVVRIRU5USUNBVElORyk7CisgICAgICAgIH0KKyAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kU3VwcGxpY2FudENvbm5lY3Rpb25DaGFuZ2VkQnJvYWRjYXN0KGJvb2xlYW4gY29ubmVjdGVkKSB7CisgICAgICAgIGlmICghQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmlzU3lzdGVtUmVhZHkoKSkgcmV0dXJuOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfQ09OTkVDVElPTl9DSEFOR0VfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1NVUFBMSUNBTlRfQ09OTkVDVEVELCBjb25uZWN0ZWQpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBkZXRhaWxlZCBzdGF0ZSBvZiBhIG5ldHdvcmsuCisgICAgICogQHBhcmFtIHN0YXRlIHRoZSBuZXcgQHtjb2RlIERldGFpbGVkU3RhdGV9CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldERldGFpbGVkU3RhdGUoTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBzdGF0ZSkgeworICAgICAgICBMb2cuZChUQUcsICJzZXREZXRhaWxlZCBzdGF0ZSwgb2xkID0iCisgICAgICAgICAgICAgICAgKyBtTmV0d29ya0luZm8uZ2V0RGV0YWlsZWRTdGF0ZSgpICsgIiBhbmQgbmV3IHN0YXRlPSIgKyBzdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZSAhPSBtTmV0d29ya0luZm8uZ2V0RGV0YWlsZWRTdGF0ZSgpKSB7CisgICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb2xsIGZvciBpbmZvIG5vdCByZXBvcnRlZCB2aWEgZXZlbnRzCisgICAgICogUlNTSSAmIExpbmtzcGVlZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXF1ZXN0UG9sbGVkSW5mbygpIHsKKyAgICAgICAgaW50IG5ld1Jzc2kgPSBXaWZpTmF0aXZlLmdldFJzc2lDb21tYW5kKCk7CisgICAgICAgIGlmIChuZXdSc3NpICE9IC0xICYmIC0yMDAgPCBuZXdSc3NpICYmIG5ld1Jzc2kgPCAyNTYpIHsgLy8gc2NyZWVuIG91dCBpbnZhbGlkIHZhbHVlcworICAgICAgICAgICAgLyogc29tZSBpbXBsZW1lbnRhdGlvbnMgYXZvaWQgbmVnYXRpdmUgdmFsdWVzIGJ5IGFkZGluZyAyNTYKKyAgICAgICAgICAgICAqIHNvIHdlIG5lZWQgdG8gYWRqdXN0IGZvciB0aGF0IGhlcmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChuZXdSc3NpID4gMCkgbmV3UnNzaSAtPSAyNTY7CisgICAgICAgICAgICBtV2lmaUluZm8uc2V0UnNzaShuZXdSc3NpKTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSYXRoZXIgdGhlbiBzZW5kaW5nIHRoZSByYXcgUlNTSSBvdXQgZXZlcnkgdGltZSBpdAorICAgICAgICAgICAgICogY2hhbmdlcywgd2UgcHJlY2FsY3VsYXRlIHRoZSBzaWduYWwgbGV2ZWwgdGhhdCB3b3VsZAorICAgICAgICAgICAgICogYmUgZGlzcGxheWVkIGluIHRoZSBzdGF0dXMgYmFyLCBhbmQgb25seSBzZW5kIHRoZQorICAgICAgICAgICAgICogYnJvYWRjYXN0IGlmIHRoYXQgbXVjaCBtb3JlIGNvYXJzZS1ncmFpbmVkIG51bWJlcgorICAgICAgICAgICAgICogY2hhbmdlcy4gVGhpcyBjdXRzIGRvd24gZ3JlYXRseSBvbiB0aGUgbnVtYmVyIG9mCisgICAgICAgICAgICAgKiBicm9hZGNhc3RzLCBhdCB0aGUgY29zdCBvZiBub3QgbVdpZmlJbmZvcm1pbmcgb3RoZXJzCisgICAgICAgICAgICAgKiBpbnRlcmVzdGVkIGluIFJTU0kgb2YgYWxsIHRoZSBjaGFuZ2VzIGluIHNpZ25hbAorICAgICAgICAgICAgICogbGV2ZWwuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8vIFRPRE86IFRoZSBzZWNvbmQgYXJnIHRvIHRoZSBjYWxsIGJlbG93IG5lZWRzIHRvIGJlIGEgc3ltYm9sIHNvbWV3aGVyZSwgYnV0CisgICAgICAgICAgICAvLyBpdCdzIGFjdHVhbGx5IHRoZSBzaXplIG9mIGFuIGFycmF5IG9mIGljb25zIHRoYXQncyBwcml2YXRlCisgICAgICAgICAgICAvLyB0byBTdGF0dXNCYXIgUG9saWN5LgorICAgICAgICAgICAgaW50IG5ld1NpZ25hbExldmVsID0gV2lmaU1hbmFnZXIuY2FsY3VsYXRlU2lnbmFsTGV2ZWwobmV3UnNzaSwgNCk7CisgICAgICAgICAgICBpZiAobmV3U2lnbmFsTGV2ZWwgIT0gbUxhc3RTaWduYWxMZXZlbCkgeworICAgICAgICAgICAgICAgIHNlbmRSc3NpQ2hhbmdlQnJvYWRjYXN0KG5ld1Jzc2kpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUxhc3RTaWduYWxMZXZlbCA9IG5ld1NpZ25hbExldmVsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVdpZmlJbmZvLnNldFJzc2koLTIwMCk7CisgICAgICAgIH0KKyAgICAgICAgaW50IG5ld0xpbmtTcGVlZCA9IFdpZmlOYXRpdmUuZ2V0TGlua1NwZWVkQ29tbWFuZCgpOworICAgICAgICBpZiAobmV3TGlua1NwZWVkICE9IC0xKSB7CisgICAgICAgICAgICBtV2lmaUluZm8uc2V0TGlua1NwZWVkKG5ld0xpbmtTcGVlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIFdpLUZpIENvbm5lY3Rpb25zIGJ5IGNsZWFyaW5nIGFueSBzdGF0ZSwgcmVzZXR0aW5nIGFueSBzb2NrZXRzCisgICAgICogdXNpbmcgdGhlIGludGVyZmFjZSwgc3RvcHBpbmcgREhDUCAmIGRpc2FibGluZyBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlTmV0d29ya0Rpc2Nvbm5lY3QoKSB7CisgICAgICAgIExvZy5kKFRBRywgIlJlc2V0IGNvbm5lY3Rpb25zIGFuZCBzdG9wcGluZyBESENQIik7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVzZXQgY29ubmVjdGlvbnMgJiBzdG9wIERIQ1AKKyAgICAgICAgICovCisgICAgICAgIE5ldHdvcmtVdGlscy5yZXNldENvbm5lY3Rpb25zKG1JbnRlcmZhY2VOYW1lKTsKKworICAgICAgICBpZiAoIU5ldHdvcmtVdGlscy5zdG9wRGhjcChtSW50ZXJmYWNlTmFtZSkpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBzdG9wIERIQ1AiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIERpc2FibGUgaW50ZXJmYWNlICovCisgICAgICAgIE5ldHdvcmtVdGlscy5kaXNhYmxlSW50ZXJmYWNlKG1JbnRlcmZhY2VOYW1lKTsKKworICAgICAgICAvKiBzZW5kIGV2ZW50IHRvIENNICYgbmV0d29yayBjaGFuZ2UgYnJvYWRjYXN0ICovCisgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQpOworICAgICAgICBzZW5kTmV0d29ya1N0YXRlQ2hhbmdlQnJvYWRjYXN0KG1MYXN0QnNzaWQpOworCisgICAgICAgIC8qIFJlc2V0IGRhdGEgc3RydWN0dXJlcyAqLworICAgICAgICBtV2lmaUluZm8uc2V0SXBBZGRyZXNzKDApOworICAgICAgICBtV2lmaUluZm8uc2V0QlNTSUQobnVsbCk7CisgICAgICAgIG1XaWZpSW5mby5zZXRTU0lEKG51bGwpOworICAgICAgICBtV2lmaUluZm8uc2V0TmV0d29ya0lkKC0xKTsKKworICAgICAgICAvKiBDbGVhciBuZXR3b3JrIHByb3BlcnRpZXMgKi8KKyAgICAgICAgbUxpbmtQcm9wZXJ0aWVzLmNsZWFyKCk7CisKKyAgICAgICAgbUxhc3RCc3NpZD0gbnVsbDsKKyAgICAgICAgbUxhc3ROZXR3b3JrSWQgPSAtMTsKKworICAgIH0KKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIE5vdGlmaWNhdGlvbnMgZnJvbSBXaWZpTW9uaXRvcgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qKgorICAgICAqIEEgc3RydWN0dXJlIGZvciBzdXBwbHlpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBzdXBwbGljYW50IHN0YXRlCisgICAgICogY2hhbmdlIGluIHRoZSBTVEFURV9DSEFOR0UgZXZlbnQgbWVzc2FnZSB0aGF0IGNvbWVzIGZyb20gdGhlCisgICAgICogV2lmaU1vbml0b3IKKyAgICAgKiB0aHJlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RhdGVDaGFuZ2VSZXN1bHQgeworICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdChpbnQgbmV0d29ya0lkLCBTdHJpbmcgQlNTSUQsIE9iamVjdCBzdGF0ZSkgeworICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgdGhpcy5CU1NJRCA9IEJTU0lEOworICAgICAgICAgICAgdGhpcy5uZXR3b3JrSWQgPSBuZXR3b3JrSWQ7CisgICAgICAgIH0KKyAgICAgICAgaW50IG5ldHdvcmtJZDsKKyAgICAgICAgU3RyaW5nIEJTU0lEOworICAgICAgICBPYmplY3Qgc3RhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IGEgdXNlci1lbnRlcmVkIHBhc3N3b3JkIGtleQorICAgICAqIG1heSBiZSBpbmNvcnJlY3QgKGkuZS4sIGNhdXNlZCBhdXRoZW50aWNhdGlvbiB0byBmYWlsKS4KKyAgICAgKi8KKyAgICB2b2lkIG5vdGlmeVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKFBBU1NXT1JEX01BWV9CRV9JTkNPUlJFQ1RfRVZFTlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCBhIGNvbm5lY3Rpb24gdG8gdGhlIHN1cHBsaWNhbnQKKyAgICAgKiBkYWVtb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQuCisgICAgICovCisgICAgdm9pZCBub3RpZnlTdXBwbGljYW50Q29ubmVjdGlvbigpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoU1VQX0NPTk5FQ1RJT05fRVZFTlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCBhIGNvbm5lY3Rpb24gdG8gdGhlIHN1cHBsaWNhbnQKKyAgICAgKiBkYWVtb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQuCisgICAgICovCisgICAgdm9pZCBub3RpZnlTdXBwbGljYW50TG9zdCgpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoU1VQX0RJU0NPTk5FQ1RJT05fRVZFTlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgc3RhdGUgb2YgV2lmaSBjb25uZWN0aXZpdHkKKyAgICAgKiBoYXMgY2hhbmdlZC4KKyAgICAgKiBAcGFyYW0gbmV0d29ya0lkIHRoZSBjb25maWd1cmVkIG5ldHdvcmsgb24gd2hpY2ggdGhlIHN0YXRlIGNoYW5nZSBvY2N1cnJlZAorICAgICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IG5ldHdvcmsgc3RhdGUKKyAgICAgKiBAcGFyYW0gQlNTSUQgd2hlbiB0aGUgbmV3IHN0YXRlIGlzIHtAbGluayBEZXRhaWxlZFN0YXRlI0NPTk5FQ1RFRAorICAgICAqIE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUuQ09OTkVDVEVEfSwKKyAgICAgKiB0aGlzIGlzIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgYWNjZXNzIHBvaW50LiBPdGhlcndpc2UsIGl0CisgICAgICogaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHZvaWQgbm90aWZ5TmV0d29ya1N0YXRlQ2hhbmdlKERldGFpbGVkU3RhdGUgbmV3U3RhdGUsIFN0cmluZyBCU1NJRCwgaW50IG5ldHdvcmtJZCkgeworICAgICAgICBpZiAobmV3U3RhdGUgPT0gTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQpIHsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoTkVUV09SS19DT05ORUNUSU9OX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RhdGVDaGFuZ2VSZXN1bHQobmV0d29ya0lkLCBCU1NJRCwgbmV3U3RhdGUpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKE5FVFdPUktfRElTQ09OTkVDVElPTl9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0YXRlQ2hhbmdlUmVzdWx0KG5ldHdvcmtJZCwgQlNTSUQsIG5ld1N0YXRlKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzdGF0ZSBvZiB0aGUgc3VwcGxpY2FudAorICAgICAqIGhhcyBjaGFuZ2VkLgorICAgICAqIEBwYXJhbSBuZXR3b3JrSWQgdGhlIGNvbmZpZ3VyZWQgbmV0d29yayBvbiB3aGljaCB0aGUgc3RhdGUgY2hhbmdlIG9jY3VycmVkCisgICAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcge0Bjb2RlIFN1cHBsaWNhbnRTdGF0ZX0KKyAgICAgKi8KKyAgICB2b2lkIG5vdGlmeVN1cHBsaWNhbnRTdGF0ZUNoYW5nZShpbnQgbmV0d29ya0lkLCBTdHJpbmcgQlNTSUQsIFN1cHBsaWNhbnRTdGF0ZSBuZXdTdGF0ZSkgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKFNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFX0VWRU5ULAorICAgICAgICAgICAgICAgIG5ldyBTdGF0ZUNoYW5nZVJlc3VsdChuZXR3b3JrSWQsIEJTU0lELCBuZXdTdGF0ZSkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgYSBzY2FuIGhhcyBjb21wbGV0ZWQsIGFuZCByZXN1bHRzCisgICAgICogYXJlIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICB2b2lkIG5vdGlmeVNjYW5SZXN1bHRzQXZhaWxhYmxlKCkgeworICAgICAgICAvKioKKyAgICAgICAgICogU3dpdGNoIHNjYW4gbW9kZSBvdmVyIHRvIHBhc3NpdmUuCisgICAgICAgICAqIFR1cm5pbmcgb2ZmIHNjYW4tb25seSBtb2RlIGhhcHBlbnMgb25seSBpbiAiQ29ubmVjdCIgbW9kZQorICAgICAgICAgKi8KKyAgICAgICAgc2V0U2NhblR5cGUoZmFsc2UpOworICAgICAgICBzZW5kTWVzc2FnZShTQ0FOX1JFU1VMVFNfRVZFTlQpOworICAgIH0KKworICAgIHZvaWQgbm90aWZ5RHJpdmVyU3RhcnRlZCgpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoRFJJVkVSX1NUQVJUX0VWRU5UKTsKKyAgICB9CisKKyAgICB2b2lkIG5vdGlmeURyaXZlclN0b3BwZWQoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKERSSVZFUl9TVE9QX0VWRU5UKTsKKyAgICB9CisKKyAgICB2b2lkIG5vdGlmeURyaXZlckh1bmcoKSB7CisgICAgICAgIHNldFdpZmlFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgc2V0V2lmaUVuYWJsZWQodHJ1ZSk7CisgICAgfQorCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBIU00gc3RhdGVzCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBjbGFzcyBEZWZhdWx0U3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXM7CisgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgICAgICAvKiBTeW5jaHJvbm91cyBjYWxsIHJldHVybnMgKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9QSU5HX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVNT1ZFX05FVFdPUks6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRU5BQkxFX05FVFdPUks6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQUJMRV9ORVRXT1JLOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0FERF9PUl9VUERBVEVfTkVUV09SSzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9HRVRfUlNTSToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9HRVRfUlNTSV9BUFBST1g6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX0xJTktfU1BFRUQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX01BQ19BRERSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NBVkVfQ09ORklHOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmJvb2xWYWx1ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmludFZhbHVlID0gLTE7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uc3RyaW5nVmFsdWUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPbk1zZ09iamVjdChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRU5BQkxFX1JTU0lfUE9MTDoKKyAgICAgICAgICAgICAgICAgICAgbUVuYWJsZVJzc2lQb2xsaW5nID0gKG1lc3NhZ2UuYXJnMSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgbVN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIuc2VuZE1lc3NhZ2UoQ01EX0VOQUJMRV9SU1NJX1BPTEwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogRGlzY2FyZCAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0xPQURfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1VOTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0FQOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfQVA6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU0NBTjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09OTkVDVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUFTU09DSUFURToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUNPTkZJR1VSRV9JUDoKKyAgICAgICAgICAgICAgICBjYXNlIFNVUF9DT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgU1VQX0RJU0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBEUklWRVJfU1RBUlRfRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBEUklWRVJfU1RPUF9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfRElTQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIFNDQU5fUkVTVUxUU19FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIFNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgUEFTU1dPUkRfTUFZX0JFX0lOQ09SUkVDVF9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9CTEFDS0xJU1RfTkVUV09SSzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9DTEVBUl9CTEFDS0xJU1Q6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9UWVBFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9QT1dFUl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfQ09FWElTVEVOQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFUVVFU1RfQ01fV0FLRUxPQ0s6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfQ09OTkVDVF9ORVRXT1JLOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NBVkVfTkVUV09SSzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9GT1JHRVRfTkVUV09SSzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9XUFM6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yISB1bmhhbmRsZWQgbWVzc2FnZSIgKyBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIEluaXRpYWxTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIC8vVE9ETzogY291bGQgbW92ZSBsb2dnaW5nIGludG8gYSBjb21tb24gY2xhc3MKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgLy8gWzMxLThdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCisgICAgICAgICAgICAvLyBbNyAtIDBdIEhTTSBzdGF0ZSBjaGFuZ2UKKyAgICAgICAgICAgIC8vIDUwMDIxIHdpZmlfc3RhdGVfY2hhbmdlZCAoY3VzdG9tfDF8NSkKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworCisgICAgICAgICAgICBpZiAoV2lmaU5hdGl2ZS5pc0RyaXZlckxvYWRlZCgpKSB7CisgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJMb2FkZWRTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlclVubG9hZGVkU3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyTG9hZGluZ1N0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgICAgICBtZXNzYWdlLmNvcHlGcm9tKGdldEN1cnJlbnRNZXNzYWdlKCkpOworICAgICAgICAgICAgLyogVE9ETzogYWRkIGEgdGltZW91dCB0byBmYWlsIHdoZW4gZHJpdmVyIGxvYWQgaXMgaHVuZy4KKyAgICAgICAgICAgICAqIFNpbWlsYXJseSBmb3IgZHJpdmVyIHVubG9hZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgICAgICAgICAvL2VuYWJsaW5nIHN0YXRlCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLmFyZzEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9FTkFCTElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpU3RhdGUoV0lGSV9TVEFURV9FTkFCTElORyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfQVBfU1RBVEVfRU5BQkxJTkc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwU3RhdGUoV0lGSV9BUF9TVEFURV9FTkFCTElORyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZihXaWZpTmF0aXZlLmxvYWREcml2ZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRHJpdmVyIGxvYWQgc3VjY2Vzc2Z1bCIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0xPQURfRFJJVkVSX1NVQ0NFU1MpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGxvYWQgZHJpdmVyISIpOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2UuYXJnMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9FTkFCTElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaVN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9FTkFCTElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9MT0FEX0RSSVZFUl9GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9MT0FEX0RSSVZFUl9TVUNDRVNTOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckxvYWRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfTE9BRF9EUklWRVJfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJGYWlsZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0xPQURfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1VOTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfQVA6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9BUDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9UWVBFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9QT1dFUl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfQ09FWElTVEVOQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9QQUNLRVRfRklMVEVSSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJMb2FkZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfVU5MT0FEX0RSSVZFUjoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJVbmxvYWRpbmdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgICAgIGlmKFdpZmlOYXRpdmUuc3RhcnRTdXBwbGljYW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlN1cHBsaWNhbnQgc3RhcnQgc3VjY2Vzc2Z1bCIpOworICAgICAgICAgICAgICAgICAgICAgICAgbVdpZmlNb25pdG9yLnN0YXJ0TW9uaXRvcmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaVN0YXRlKFdJRklfU1RBVEVfRU5BQkxFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVdhaXRGb3JTdXBTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gc3RhcnQgc3VwcGxpY2FudCEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1VOTE9BRF9EUklWRVIsIFdJRklfU1RBVEVfVU5LTk9XTiwgMCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0FQOgorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbndTZXJ2aWNlLnN0YXJ0QWNjZXNzUG9pbnQoKFdpZmlDb25maWd1cmF0aW9uKSBtZXNzYWdlLm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09GVEFQX0lGQUNFKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIGluIHN0YXJ0QWNjZXNzUG9pbnQoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUiwgV0lGSV9BUF9TVEFURV9GQUlMRUQsIDApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNvZnQgQVAgc3RhcnQgc3VjY2Vzc2Z1bCIpOworICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0VOQUJMRUQpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVNvZnRBcFN0YXJ0ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJVbmxvYWRpbmdTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworCisgICAgICAgICAgICBmaW5hbCBNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICAgICAgbWVzc2FnZS5jb3B5RnJvbShnZXRDdXJyZW50TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgc1dha2VMb2NrLmFjcXVpcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoV2lmaU5hdGl2ZS51bmxvYWREcml2ZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRHJpdmVyIHVubG9hZCBzdWNjZXNzZnVsIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUl9TVUNDRVNTKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2UuYXJnMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaVN0YXRlKG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfQVBfU1RBVEVfRkFJTEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShtZXNzYWdlLmFyZzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byB1bmxvYWQgZHJpdmVyISIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1VOTE9BRF9EUklWRVJfRkFJTFVSRSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLmFyZzEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX1VOS05PV046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlTdGF0ZShXSUZJX1NUQVRFX1VOS05PV04pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfQVBfU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX0FQX1NUQVRFX0ZBSUxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9VTkxPQURfRFJJVkVSX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyVW5sb2FkZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1VOTE9BRF9EUklWRVJfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJGYWlsZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0xPQURfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1VOTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfQVA6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9BUDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9UWVBFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9QT1dFUl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfQ09FWElTVEVOQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9QQUNLRVRfRklMVEVSSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJVbmxvYWRlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyTG9hZGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlckZhaWxlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgY2xhc3MgV2FpdEZvclN1cFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNVUF9DT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTdXBwbGljYW50IGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIucmVzZXRTdXBwbGljYW50U3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBkYXRhIHN0cnVjdHVyZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgbUxhc3RCc3NpZCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0TmV0d29ya0lkID0gLTE7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0U2lnbmFsTGV2ZWwgPSAtMTsKKworICAgICAgICAgICAgICAgICAgICBtV2lmaUluZm8uc2V0TWFjQWRkcmVzcyhXaWZpTmF0aXZlLmdldE1hY0FkZHJlc3NDb21tYW5kKCkpOworCisgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWdTdG9yZS5pbml0aWFsaXplKG1Db250ZXh0KTsKKworICAgICAgICAgICAgICAgICAgICAvL1RPRE86IGluaXRpYWxpemUgYW5kIGZpeCBtdWx0aWNhc3QgZmlsdGVyaW5nCisgICAgICAgICAgICAgICAgICAgIC8vbVdNLmluaXRpYWxpemVNdWx0aWNhc3RGaWx0ZXJpbmcoKTsKKworICAgICAgICAgICAgICAgICAgICBjaGVja0lzQmx1ZXRvb3RoUGxheWluZygpOworCisgICAgICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50Q29ubmVjdGlvbkNoYW5nZWRCcm9hZGNhc3QodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyU3VwUmVhZHlTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3RvcCBzdXBwbGljYW50IHJlY2VpdmVkIik7CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc3RvcFN1cHBsaWNhbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJMb2FkZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvKiBGYWlsIHNvZnQgYXAgd2hlbiB3YWl0aW5nIGZvciBzdXBwbGljYW50IHN0YXJ0ICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfQVA6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZhaWxlZCB0byBzdGFydCBzb2Z0IEFQIHdpdGggYSBydW5uaW5nIHN1cHBsaWNhbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9UWVBFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9QT1dFUl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfQ09FWElTVEVOQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9QQUNLRVRfRklMVEVSSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfQVA6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9VTkxPQURfRFJJVkVSOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyU3VwUmVhZHlTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBmb3IgY29ubmVjdCBtb2RlIG9wZXJhdGlvbiBhdCBzdGFydCAqLworICAgICAgICAgICAgbUlzU2Nhbk1vZGUgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zOworICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnOworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfU1VQUExJQ0FOVDogICAvKiBTdXBwbGljYW50IHN0b3BwZWQgYnkgdXNlciAqLworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTdG9wIHN1cHBsaWNhbnQgcmVjZWl2ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zdG9wU3VwcGxpY2FudCgpOworICAgICAgICAgICAgICAgICAgICAvLyRGQUxMLVRIUk9VR0gkCisgICAgICAgICAgICAgICAgY2FzZSBTVVBfRElTQ09OTkVDVElPTl9FVkVOVDogIC8qIFN1cHBsaWNhbnQgZGllZCAqLworICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5jbG9zZVN1cHBsaWNhbnRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZU5ldHdvcmtEaXNjb25uZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50Q29ubmVjdGlvbkNoYW5nZWRCcm9hZGNhc3QoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBtU3VwcGxpY2FudFN0YXRlVHJhY2tlci5yZXNldFN1cHBsaWNhbnRTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckxvYWRlZFN0YXRlKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBXaGVuIHN1cHBsaWNhbnQgZGllcywgdW5sb2FkIGRyaXZlciBhbmQgZW50ZXIgZmFpbGVkIHN0YXRlICovCisgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogY29uc2lkZXIgYnJpbmdpbmcgdXAgc3VwcGxpY2FudCBhZ2FpbgorICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS53aGF0ID09IFNVUF9ESVNDT05ORUNUSU9OX0VWRU5UKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTdXBwbGljYW50IGRpZWQsIHVubG9hZGluZyBkcml2ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1VOTE9BRF9EUklWRVIsIFdJRklfU1RBVEVfVU5LTk9XTiwgMCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc3RhcnREcml2ZXJDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyU3RhcnRpbmdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0NBTl9SRVNVTFRTX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBzZXRTY2FuUmVzdWx0cyhXaWZpTmF0aXZlLnNjYW5SZXN1bHRzQ29tbWFuZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZFNjYW5SZXN1bHRzQXZhaWxhYmxlQnJvYWRjYXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1BJTkdfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5ib29sVmFsdWUgPSBXaWZpTmF0aXZlLnBpbmdDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9BRERfT1JfVVBEQVRFX05FVFdPUks6CisgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBjb25maWcgPSAoV2lmaUNvbmZpZ3VyYXRpb24pIHN5bmNQYXJhbXMubVBhcmFtZXRlcjsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5pbnRWYWx1ZSA9IFdpZmlDb25maWdTdG9yZS5hZGRPclVwZGF0ZU5ldHdvcmsoY29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFTU9WRV9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5ib29sVmFsdWUgPSBXaWZpQ29uZmlnU3RvcmUucmVtb3ZlTmV0d29yaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0VOQUJMRV9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgRW5hYmxlTmV0UGFyYW1zIGVuYWJsZU5ldFBhcmFtcyA9IChFbmFibGVOZXRQYXJhbXMpIHN5bmNQYXJhbXMubVBhcmFtZXRlcjsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5ib29sVmFsdWUgPSBXaWZpQ29uZmlnU3RvcmUuZW5hYmxlTmV0d29yaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVOZXRQYXJhbXMubmV0SWQsIGVuYWJsZU5ldFBhcmFtcy5kaXNhYmxlT3RoZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0RJU0FCTEVfTkVUV09SSzoKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uYm9vbFZhbHVlID0gV2lmaUNvbmZpZ1N0b3JlLmRpc2FibGVOZXR3b3JrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9CTEFDS0xJU1RfTkVUV09SSzoKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuYWRkVG9CbGFja2xpc3RDb21tYW5kKChTdHJpbmcpbWVzc2FnZS5vYmopOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9DTEVBUl9CTEFDS0xJU1Q6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuY2xlYXJCbGFja2xpc3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NBVkVfQ09ORklHOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmJvb2xWYWx1ZSA9IFdpZmlDb25maWdTdG9yZS5zYXZlQ29uZmlnKCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAvLyBJbmZvcm0gdGhlIGJhY2t1cCBtYW5hZ2VyIGFib3V0IGEgZGF0YSBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgSUJhY2t1cE1hbmFnZXIgaWJtID0gSUJhY2t1cE1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuQkFDS1VQX1NFUlZJQ0UpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlibSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlibS5kYXRhQ2hhbmdlZCgiY29tLmFuZHJvaWQucHJvdmlkZXJzLnNldHRpbmdzIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyeSBhZ2FpbiBsYXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0dFVF9NQUNfQUREUjoKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5zdHJpbmdWYWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TWFjQWRkcmVzc0NvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvKiBDYW5ub3Qgc3RhcnQgc29mdCBBUCB3aGlsZSBpbiBjbGllbnQgbW9kZSAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0FQOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGYWlsZWQgdG8gc3RhcnQgc29mdCBBUCB3aXRoIGEgcnVubmluZyBzdXBwbGljYW50Iik7CisgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgICAgIG1Jc1NjYW5Nb2RlID0gKG1lc3NhZ2UuYXJnMSA9PSBTQ0FOX09OTFlfTU9ERSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NBVkVfTkVUV09SSzoKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gKFdpZmlDb25maWd1cmF0aW9uKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ1N0b3JlLnNhdmVOZXR3b3JrKGNvbmZpZyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0ZPUkdFVF9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlnU3RvcmUuZm9yZ2V0TmV0d29yayhtZXNzYWdlLmFyZzEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlclN0YXJ0aW5nU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgRFJJVkVSX1NUQVJUX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlclN0YXJ0ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvKiBRdWV1ZSBkcml2ZXIgY29tbWFuZHMgJiBjb25uZWN0aW9uIGV2ZW50cyAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIFNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19DT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19ESVNDT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgUEFTU1dPUkRfTUFZX0JFX0lOQ09SUkVDVF9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9UWVBFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9QT1dFUl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfQ09FWElTVEVOQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9QQUNLRVRfRklMVEVSSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NDQU46CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUFTU09DSUFURToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUNPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlclN0YXJ0ZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworCisgICAgICAgICAgICBtSXNSdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIHVwZGF0ZUJhdHRlcnlXb3JrU291cmNlKG51bGwpOworCisgICAgICAgICAgICAvKiBJbml0aWFsaXplIGNoYW5uZWwgY291bnQgKi8KKyAgICAgICAgICAgIHNldE51bUFsbG93ZWRDaGFubmVscygpOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFNUT1BTSElQCisgICAgICAgICAgICAgKiBUT0RPOiBXZSBhcmUgaGF2aW5nIDExQSBpc3N1ZXMgdGhhdCBCcm9hZGNvbSBpcyBsb29raW5nCisgICAgICAgICAgICAgKiB0byByZXNvbHZlLCB0aGlzIGlzIGEgdGVtcG9yYXJ5IGZpeCB0byBhbGxvdyBvbmx5IDExQi9HCisgICAgICAgICAgICAgKiBhbmQgaGVscCBpbXByb3ZlIEdvb2dsZUd1ZXN0IGNvbm5lY3Rpdml0eQorICAgICAgICAgICAgICogV2UgYWxzbyBuZWVkIHRvIGFkZCB0aGUgVUkgZm9yIGJhbmQgY29udHJvbAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBXaWZpTmF0aXZlLnNldEJhbmRDb21tYW5kKEJBTkRfMkcpOworCisgICAgICAgICAgICBpZiAobUlzU2Nhbk1vZGUpIHsKKyAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFNjYW5SZXN1bHRIYW5kbGluZ0NvbW1hbmQoU0NBTl9PTkxZX01PREUpOworICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVNjYW5Nb2RlU3RhdGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFNjYW5SZXN1bHRIYW5kbGluZ0NvbW1hbmQoQ09OTkVDVF9NT0RFKTsKKyAgICAgICAgICAgICAgICAvKiBJZiBzdXBwbGljYW50IGhhcyBhbHJlYWR5IGNvbm5lY3RlZCwgYmVmb3JlIHdlIGNvdWxkIGZpbmlzaCBlc3RhYmxpc2hpbmcKKyAgICAgICAgICAgICAgICAgKiB0aGUgY29udHJvbCBjaGFubmVsIGNvbm5lY3Rpb24sIHdlIG1pc3MgYWxsIHRoZSBzdXBwbGljYW50IGV2ZW50cy4KKyAgICAgICAgICAgICAgICAgKiBEaXNjb25uZWN0IGFuZCByZWNvbm5lY3Qgd2hlbiBkcml2ZXIgaGFzIHN0YXJ0ZWQgdG8gZW5zdXJlIHdlIHJlY2VpdmUKKyAgICAgICAgICAgICAgICAgKiBhbGwgc3VwcGxpY2FudCBldmVudHMuCisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBUT0RPOiBUaGlzIGlzIGEgYml0IHVuY2xlYW4sIGlkZWFsbHkgdGhlIHN1cHBsaWNhbnQgc2hvdWxkIG5ldmVyCisgICAgICAgICAgICAgICAgICogY29ubmVjdCB1bnRpbCB0b2xkIHRvIGRvIHNvIGJ5IHRoZSBmcmFtZXdvcmsKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2Nvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5yZWNvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0TW9kZVN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zOworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzEgPT0gU0NBTl9BQ1RJVkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0U2Nhbk1vZGVDb21tYW5kKHRydWUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRTY2FuTW9kZUNvbW1hbmQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9QT1dFUl9NT0RFOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFBvd2VyTW9kZUNvbW1hbmQobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGVDb21tYW5kKG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldEJsdWV0b290aENvZXhpc3RlbmNlU2Nhbk1vZGVDb21tYW5kKG1lc3NhZ2UuYXJnMSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgICAgICBtTnVtQWxsb3dlZENoYW5uZWxzID0gbWVzc2FnZS5hcmcxOworICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldE51bUFsbG93ZWRDaGFubmVsc0NvbW1hbmQobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfRFJJVkVSOgorICAgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgYW5vdGhlciBkcml2ZXIgc3RhcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc3RvcERyaXZlckNvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJTdG9wcGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVRVUVTVF9DTV9XQUtFTE9DSzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1DbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ20gPSAoQ29ubmVjdGl2aXR5TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQ20ucmVxdWVzdE5ldHdvcmtUcmFuc2l0aW9uV2FrZWxvY2soVEFHKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zdGFydFBhY2tldEZpbHRlcmluZygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc3RvcFBhY2tldEZpbHRlcmluZygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBleGl0KCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIG1Jc1J1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIHVwZGF0ZUJhdHRlcnlXb3JrU291cmNlKG51bGwpOworICAgICAgICAgICAgbVNjYW5SZXN1bHRzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlclN0b3BwaW5nU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgRFJJVkVSX1NUT1BfRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyU3RvcHBlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIFF1ZXVlIGRyaXZlciBjb21tYW5kcyAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9UWVBFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9QT1dFUl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfQ09FWElTVEVOQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9QQUNLRVRfRklMVEVSSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NDQU46CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUFTU09DSUFURToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUNPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlclN0b3BwZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBTY2FuTW9kZVN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIFN5bmNQYXJhbXMgc3luY1BhcmFtczsKKyAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hcmcxID09IFNDQU5fT05MWV9NT0RFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kKG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnJlY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1NjYW5Nb2RlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TQ0FOOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNjYW5Db21tYW5kKG1lc3NhZ2UuYXJnMSA9PSBTQ0FOX0FDVElWRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09OTkVDVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUFTU09DSUFURToKKyAgICAgICAgICAgICAgICBjYXNlIFNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19DT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19ESVNDT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgQ29ubmVjdE1vZGVTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXM7CisgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdDsKKyAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFBBU1NXT1JEX01BWV9CRV9JTkNPUlJFQ1RfRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVVBQTElDQU5UX1NUQVRFX0NIQU5HRV9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBtU3VwcGxpY2FudFN0YXRlVHJhY2tlci5oYW5kbGVFdmVudChzdGF0ZUNoYW5nZVJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NDQU46CisgICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gc2V0IHNjYW4gdHlwZSBpbiBjb21wbGV0ZWQgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBuZXdNc2cgPSBvYnRhaW5NZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIG5ld01zZy5jb3B5RnJvbShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgbVN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIuc2VuZE1lc3NhZ2UobmV3TXNnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIERvIGEgcmVkdW5kYW50IGRpc2Nvbm5lY3Qgd2l0aG91dCB0cmFuc2l0aW9uICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5kaXNjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUNPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUucmVjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUFTU09DSUFURToKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5yZWFzc29jaWF0ZUNvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfQ09OTkVDVF9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBpbnQgbmV0SWQgPSBtZXNzYWdlLmFyZzE7CisgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA9IChXaWZpQ29uZmlndXJhdGlvbikgbWVzc2FnZS5vYmo7CisKKyAgICAgICAgICAgICAgICAgICAgLyogV2UgY29ubmVjdCB0byBhIHNwZWNpZmljIG5ldHdvcmsgYnkgaXNzdWluZyBhIHNlbGVjdAorICAgICAgICAgICAgICAgICAgICAgKiB0byB0aGUgV2lmaUNvbmZpZ1N0b3JlLiBUaGlzIGVuYWJsZXMgdGhlIG5ldHdvcmssCisgICAgICAgICAgICAgICAgICAgICAqIHdoaWxlIGRpc2FibGluZyBhbGwgb3RoZXIgbmV0d29ya3MgaW4gdGhlIHN1cHBsaWNhbnQuCisgICAgICAgICAgICAgICAgICAgICAqIERpc2FibGluZyBhIGNvbm5lY3RlZCBuZXR3b3JrIHdpbGwgY2F1c2UgYSBkaXNjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAqIGZyb20gdGhlIG5ldHdvcmsuIEEgcmVjb25uZWN0Q29tbWFuZCgpIHdpbGwgdGhlbiBpbml0aWF0ZQorICAgICAgICAgICAgICAgICAgICAgKiBhIGNvbm5lY3Rpb24gdG8gdGhlIGVuYWJsZWQgbmV0d29yay4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ1N0b3JlLnNlbGVjdE5ldHdvcmsoY29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWdTdG9yZS5zZWxlY3ROZXR3b3JrKG5ldElkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgYSBmbGFnIHRvIGluZGljYXRlIHRoYXQgd2UgbmVlZCB0byBlbmFibGUgYWxsCisgICAgICAgICAgICAgICAgICAgICAqIG5ldHdvcmtzIGFmdGVyIHN1cHBsaWNhbnQgaW5kaWNhdGVzIGEgbmV0d29yaworICAgICAgICAgICAgICAgICAgICAgKiBzdGF0ZSBjaGFuZ2UgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIG1FbmFibGVBbGxOZXR3b3JrcyA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5yZWNvbm5lY3RDb21tYW5kKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogRXhwZWN0IGEgZGlzY29ubmVjdGlvbiBmcm9tIHRoZSBvbGQgY29ubmVjdGlvbiAqLworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RpbmdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1dQUzoKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJzc2lkID0gKFN0cmluZykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIGludCBhcFBpbiA9IG1lc3NhZ2UuYXJnMTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzdWNjZXNzOworICAgICAgICAgICAgICAgICAgICBpZiAoYXBQaW4gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogV1BTIHBpbiBtZXRob2QgY29uZmlndXJhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IFdpZmlDb25maWdTdG9yZS5zdGFydFdwc1Bpbihic3NpZCwgYXBQaW4pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogV1BTIHB1c2ggYnV0dG9uIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBXaWZpQ29uZmlnU3RvcmUuc3RhcnRXcHNQYmMoYnNzaWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIER1cmluZyBXUFMgc2V0dXAsIGFsbCBvdGhlciBuZXR3b3JrcyBhcmUgZGlzYWJsZWQuIEFmdGVyCisgICAgICAgICAgICAgICAgICAgICAqIGEgc3VjY2Vzc2Z1bCBjb25uZWN0IGEgbmV3IGNvbmZpZyBpcyBjcmVhdGVkIGluIHRoZSBzdXBwbGljYW50LgorICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAgICAgKiBXZSBuZWVkIHRvIGVuYWJsZSBhbGwgbmV0d29ya3MgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICogb3Igd2hlbiBzdXBwbGljYW50IGdvZXMgaW5hY3RpdmUgZHVlIHRvIGZhaWx1cmUuIEVuYWJsaW5nIGFsbAorICAgICAgICAgICAgICAgICAgICAgKiBuZXR3b3JrcyBhZnRlciBhIGRpc2Nvbm5lY3QgaXMgb2JzZXJ2ZWQgYXMgZG9uZSB3aXRoIGNvbm5lY3ROZXR3b3JrCisgICAgICAgICAgICAgICAgICAgICAqIGRvZXMgbm90IGxlYWQgdG8gYSBzdWNjZXNzZnVsIFdQUyBzZXR1cC4KKyAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICogVXBvbiBzdWNjZXNzLCB0aGUgY29uZmlndXJhdGlvbiBsaXN0IG5lZWRzIHRvIGJlIHJlbG9hZGVkCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgbVdwc1N0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgLyogRXhwZWN0IGEgZGlzY29ubmVjdGlvbiBmcm9tIHRoZSBvbGQgY29ubmVjdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0aW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0NBTl9SRVNVTFRTX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIHNjYW4gc2V0dGluZyBiYWNrIHRvICJjb25uZWN0IiBtb2RlICovCisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZChDT05ORUNUX01PREUpOworICAgICAgICAgICAgICAgICAgICAvKiBIYW5kbGUgc2NhbiByZXN1bHRzICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCJOZXR3b3JrIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOworCisgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogbWFrZSBzdXBwbGljYW50IG1vZGlmaWNhdGlvbiB0byBwdXNoIHRoaXMgaW4gZXZlbnRzCisgICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRTU0lEKGZldGNoU1NJRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldEJTU0lEKG1MYXN0QnNzaWQgPSBzdGF0ZUNoYW5nZVJlc3VsdC5CU1NJRCk7CisgICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXROZXR3b3JrSWQoc3RhdGVDaGFuZ2VSZXN1bHQubmV0d29ya0lkKTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3ROZXR3b3JrSWQgPSBzdGF0ZUNoYW5nZVJlc3VsdC5uZXR3b3JrSWQ7CisgICAgICAgICAgICAgICAgICAgIC8qIHNlbmQgZXZlbnQgdG8gQ00gJiBuZXR3b3JrIGNoYW5nZSBicm9hZGNhc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLk9CVEFJTklOR19JUEFERFIpOworICAgICAgICAgICAgICAgICAgICBzZW5kTmV0d29ya1N0YXRlQ2hhbmdlQnJvYWRjYXN0KG1MYXN0QnNzaWQpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUNvbm5lY3RpbmdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19ESVNDT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIk5ldHdvcmsgY29ubmVjdGlvbiBsb3N0Iik7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZU5ldHdvcmtEaXNjb25uZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9HRVRfUlNTSToKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5pbnRWYWx1ZSA9IFdpZmlOYXRpdmUuZ2V0UnNzaUNvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0dFVF9SU1NJX0FQUFJPWDoKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5pbnRWYWx1ZSA9IFdpZmlOYXRpdmUuZ2V0UnNzaUFwcHJveENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0dFVF9MSU5LX1NQRUVEOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmludFZhbHVlID0gV2lmaU5hdGl2ZS5nZXRMaW5rU3BlZWRDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgQ29ubmVjdGluZ1N0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBib29sZWFuIG1Nb2RpZmllZEJsdWV0b290aENvZXhpc3RlbmNlTW9kZTsKKyAgICAgICAgaW50IG1Qb3dlck1vZGU7CisgICAgICAgIGJvb2xlYW4gbVVzZVN0YXRpY0lwOworICAgICAgICBUaHJlYWQgbURoY3BUaHJlYWQ7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworCisgICAgICAgICAgICBtVXNlU3RhdGljSXAgPSBXaWZpQ29uZmlnU3RvcmUuaXNVc2luZ1N0YXRpY0lwKG1MYXN0TmV0d29ya0lkKTsKKyAgICAgICAgICAgIGlmICghbVVzZVN0YXRpY0lwKSB7CisgICAgICAgICAgICAgICAgbURoY3BUaHJlYWQgPSBudWxsOworICAgICAgICAgICAgICAgIG1Nb2RpZmllZEJsdWV0b290aENvZXhpc3RlbmNlTW9kZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1Qb3dlck1vZGUgPSBEUklWRVJfUE9XRVJfTU9ERV9BVVRPOworCisgICAgICAgICAgICAgICAgLy8gVE9ETygpOiBJbmNvcnBvcmF0ZSB0aGUgZWxzZSBwYXJ0IGluIHRoZSBzdGF0ZSBtYWNoaW5lCisgICAgICAgICAgICAgICAgLy8gSWYgbUJsdWV0b290aEhlYWRzZXQgPT0gbnVsbCwgbWVhbnMgaXQgbm90IGNvbmVuY3RlZCB0byB0aGUKKyAgICAgICAgICAgICAgICAvLyBzZXJ2aWNlIHlldC4KKyAgICAgICAgICAgICAgICBpZiAobUJsdWV0b290aEhlYWRzZXQgIT0gbnVsbCAmJiBzaG91bGREaXNhYmxlQ29leGlzdGVuY2VNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogVGhlcmUgYXJlIHByb2JsZW1zIHNldHRpbmcgdGhlIFdpLUZpIGRyaXZlcidzIHBvd2VyCisgICAgICAgICAgICAgICAgICAgICAqIG1vZGUgdG8gYWN0aXZlIHdoZW4gYmx1ZXRvb3RoIGNvZXhpc3RlbmNlIG1vZGUgaXMKKyAgICAgICAgICAgICAgICAgICAgICogZW5hYmxlZCBvciBzZW5zZS4KKyAgICAgICAgICAgICAgICAgICAgICogPHA+CisgICAgICAgICAgICAgICAgICAgICAqIFdlIHNldCBXaS1GaSB0byBhY3RpdmUgbW9kZSB3aGVuCisgICAgICAgICAgICAgICAgICAgICAqIG9idGFpbmluZyBhbiBJUCBhZGRyZXNzIGJlY2F1c2Ugd2UndmUgZm91bmQKKyAgICAgICAgICAgICAgICAgICAgICogY29tcGF0aWJpbGl0eSBpc3N1ZXMgd2l0aCBzb21lIHJvdXRlcnMgd2l0aCBsb3cgcG93ZXIKKyAgICAgICAgICAgICAgICAgICAgICogbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICogPHA+CisgICAgICAgICAgICAgICAgICAgICAqIEluIG9yZGVyIGZvciB0aGlzIGFjdGl2ZSBwb3dlciBtb2RlIHRvIHByb3Blcmx5IGJlIHNldCwKKyAgICAgICAgICAgICAgICAgICAgICogd2UgZGlzYWJsZSBjb2V4aXN0ZW5jZSBtb2RlIHVudGlsIHdlJ3JlIGRvbmUgd2l0aAorICAgICAgICAgICAgICAgICAgICAgKiBvYnRhaW5pbmcgYW4gSVAgYWRkcmVzcy4gIE9uZSBleGNlcHRpb24gaXMgaWYgd2UKKyAgICAgICAgICAgICAgICAgICAgICogYXJlIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gYSBoZWFkc2V0LCBzaW5jZSBkaXNhYmxpbmcKKyAgICAgICAgICAgICAgICAgICAgICogY29leGlzdGVuY2Ugd291bGQgaW50ZXJydXB0IHRoYXQgY29ubmVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIG1Nb2RpZmllZEJsdWV0b290aENvZXhpc3RlbmNlTW9kZSA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSB0aGUgY29leGlzdGVuY2UgbW9kZQorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5CTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9ESVNBQkxFRCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbVBvd2VyTW9kZSA9ICBXaWZpTmF0aXZlLmdldFBvd2VyTW9kZUNvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICBpZiAobVBvd2VyTW9kZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBzdXBwbGljYW50IGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAvLyBnZXRQb3dlck1vZGVDb21tYW5kLgorICAgICAgICAgICAgICAgICAgICBtUG93ZXJNb2RlID0gRFJJVkVSX1BPV0VSX01PREVfQVVUTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1Qb3dlck1vZGUgIT0gRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFKSB7CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0UG93ZXJNb2RlQ29tbWFuZChEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkRIQ1AgcmVxdWVzdCBzdGFydGVkIik7CisgICAgICAgICAgICAgICAgbURoY3BUaHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgRGhjcEluZm8gZGhjcEluZm8gPSBuZXcgRGhjcEluZm8oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOZXR3b3JrVXRpbHMucnVuRGhjcChtSW50ZXJmYWNlTmFtZSwgZGhjcEluZm8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiREhDUCByZXF1ZXN0IHN1Y2NlZWRlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobURoY3BJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EaGNwSW5mbyA9IGRoY3BJbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfSVBfQ09ORklHX1NVQ0NFU1MpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJESENQIHJlcXVlc3QgZmFpbGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlscy5nZXREaGNwRXJyb3IoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0lQX0NPTkZJR19GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIG1EaGNwVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIERoY3BJbmZvIGRoY3BJbmZvID0gV2lmaUNvbmZpZ1N0b3JlLmdldElwQ29uZmlndXJhdGlvbihtTGFzdE5ldHdvcmtJZCk7CisgICAgICAgICAgICAgICAgaWYgKE5ldHdvcmtVdGlscy5jb25maWd1cmVJbnRlcmZhY2UobUludGVyZmFjZU5hbWUsIGRoY3BJbmZvKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJTdGF0aWMgSVAgY29uZmlndXJhdGlvbiBzdWNjZWVkZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtRGhjcEluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EaGNwSW5mbyA9IGRoY3BJbmZvOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9JUF9DT05GSUdfU1VDQ0VTUyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiU3RhdGljIElQIGNvbmZpZ3VyYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9JUF9DT05GSUdfRkFJTFVSRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworCisgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICBjYXNlIENNRF9JUF9DT05GSUdfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICAgIG1SZWNvbm5lY3RDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICBtTGFzdFNpZ25hbExldmVsID0gLTE7IC8vIGZvcmNlIHVwZGF0ZSBvZiBzaWduYWwgc3RyZW5ndGgKKyAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobURoY3BJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldElwQWRkcmVzcyhtRGhjcEluZm8uaXBBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJUCBjb25maWd1cmF0aW9uOiAiICsgbURoY3BJbmZvKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZUxpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICAgIHNlbmROZXR3b3JrU3RhdGVDaGFuZ2VCcm9hZGNhc3QobUxhc3RCc3NpZCk7CisgICAgICAgICAgICAgICAgICAvL1RPRE86IFRoZSBmcmFtZXdvcmsgaXMgbm90IGRldGVjdGluZyBhIERIQ1AgcmVuZXdhbCBhbmQgYSBwb3NzaWJsZQorICAgICAgICAgICAgICAgICAgLy9JUCBjaGFuZ2UuIHdlIHNob3VsZCBkZXRlY3QgdGhpcyBhbmQgc2VuZCBvdXQgYSBjb25maWcgY2hhbmdlIGJyb2FkY2FzdAorICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBDTURfSVBfQ09ORklHX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICBtV2lmaUluZm8uc2V0SXBBZGRyZXNzKDApOworCisgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJJUCBjb25maWd1cmF0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgKiBJZiB3ZSd2ZSBleGNlZWRlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBmb3IgREhDUAorICAgICAgICAgICAgICAgICAgICogdG8gYSBnaXZlbiBuZXR3b3JrLCBkaXNhYmxlIHRoZSBuZXR3b3JrCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIGlmICgrK21SZWNvbm5lY3RDb3VudCA+IGdldE1heERoY3BSZXRyaWVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWNvbm5lY3RDb3VudCArICIgdGltZXMsIERpc2FibGluZyAiICsgbUxhc3ROZXR3b3JrSWQpOworICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWdTdG9yZS5kaXNhYmxlTmV0d29yayhtTGFzdE5ldHdvcmtJZCk7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIC8qIERIQ1AgdGltZXMgb3V0IGFmdGVyIGFib3V0IDMwIHNlY29uZHMsIHdlIGRvIGEKKyAgICAgICAgICAgICAgICAgICAqIGRpc2Nvbm5lY3QgYW5kIGFuIGltbWVkaWF0ZSByZWNvbm5lY3QgdG8gdHJ5IGFnYWluCisgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUucmVjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0aW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgQ01EX0RJU0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2Nvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RpbmdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSBjb25uZWN0aW9uIHRvIHNhbWUgbmV0d29yayAqLworICAgICAgICAgICAgICBjYXNlIENNRF9DT05ORUNUX05FVFdPUks6CisgICAgICAgICAgICAgICAgICBpbnQgbmV0SWQgPSBtZXNzYWdlLmFyZzE7CisgICAgICAgICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldE5ldHdvcmtJZCgpID09IG5ldElkKSB7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgKi8KKyAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6CisgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfRElTQ09OTkVDVCk7CisgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzEgPT0gU0NBTl9PTkxZX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfRElTQ09OTkVDVCk7CisgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09ORklHVVJFX0lQOgorICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgIH0KKyAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBleGl0KCkgeworICAgICAgICAgIC8qIHJlc2V0IHBvd2VyIHN0YXRlICYgYmx1ZXRvb3RoIGNvZXhpc3RlbmNlIGlmIG9uIERIQ1AgKi8KKyAgICAgICAgICBpZiAoIW1Vc2VTdGF0aWNJcCkgeworICAgICAgICAgICAgICBpZiAobVBvd2VyTW9kZSAhPSBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUpIHsKKyAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0UG93ZXJNb2RlQ29tbWFuZChtUG93ZXJNb2RlKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChtTW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUpIHsKKyAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgY29leGlzdGVuY2UgbW9kZSBiYWNrIHRvIGl0cyBkZWZhdWx0IHZhbHVlCisgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfU0VOU0UpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgQ29ubmVjdGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAvKiBBIHN1Y2Nlc3NmdWwgV1BTIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgICAgIGlmIChtV3BzU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIFdpZmlDb25maWdTdG9yZS5lbmFibGVBbGxOZXR3b3JrcygpOworICAgICAgICAgICAgICAgIFdpZmlDb25maWdTdG9yZS5sb2FkQ29uZmlndXJlZE5ldHdvcmtzKCk7CisgICAgICAgICAgICAgICAgbVdwc1N0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0RJU0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0aW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUNPTkZJR1VSRV9JUDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCJSZWNvbmZpZ3VyaW5nIElQIG9uIGNvbm5lY3Rpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzLnJlc2V0Q29ubmVjdGlvbnMobUludGVyZmFjZU5hbWUpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUNvbm5lY3RpbmdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfRFJJVkVSOgorICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfRElTQ09OTkVDVCk7CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMSA9PSBTQ0FOX09OTFlfTU9ERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0RJU0NPTk5FQ1QpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgY29ubmVjdGlvbiB0byBzYW1lIG5ldHdvcmsgKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9DT05ORUNUX05FVFdPUks6CisgICAgICAgICAgICAgICAgICAgIGludCBuZXRJZCA9IG1lc3NhZ2UuYXJnMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1XaWZpSW5mby5nZXROZXR3b3JrSWQoKSA9PSBuZXRJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgKi8KKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERpc2Nvbm5lY3RpbmdTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfRFJJVkVSOiAvKiBTdG9wIGRyaXZlciBvbmx5IGFmdGVyIGRpc2Nvbm5lY3QgaGFuZGxlZCAqLworICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzEgPT0gU0NBTl9PTkxZX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBleGl0KCkgeworICAgICAgICAgICAgaWYgKG1FbmFibGVBbGxOZXR3b3JrcykgeworICAgICAgICAgICAgICAgIG1FbmFibGVBbGxOZXR3b3JrcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIFdpZmlDb25maWdTdG9yZS5lbmFibGVBbGxOZXR3b3JrcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRGlzY29ubmVjdGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hcmcxID09IFNDQU5fT05MWV9NT0RFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFNjYW5SZXN1bHRIYW5kbGluZ0NvbW1hbmQobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vU3VwcGxpY2FudCBkaXNjb25uZWN0IHRvIHByZXZlbnQgZnVydGhlciBjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5kaXNjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbUlzU2Nhbk1vZGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1TY2FuTW9kZVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogSWdub3JlIG5ldHdvcmsgZGlzY29ubmVjdCAqLworICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19ESVNDT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgU29mdEFwU3RhcnRlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0FQOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIlN0b3BwaW5nIFNvZnQgQVAiKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwU3RhdGUoV0lGSV9BUF9TVEFURV9ESVNBQkxJTkcpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbndTZXJ2aWNlLnN0b3BBY2Nlc3NQb2ludCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gaW4gc3RvcEFjY2Vzc1BvaW50KCkiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckxvYWRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfQVA6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywiU29mdEFQIHNldCBvbiBhIHJ1bm5pbmcgYWNjZXNzIHBvaW50Iik7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc2V0QWNjZXNzUG9pbnQoKFdpZmlDb25maWd1cmF0aW9uKSBtZXNzYWdlLm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09GVEFQX0lGQUNFKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIGluIG53U2VydmljZSBkdXJpbmcgc29mdCBBUCBzZXQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbndTZXJ2aWNlLnN0b3BBY2Nlc3NQb2ludCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNvdWxkIG5vdCBzdG9wIEFQLCA6IiArIGVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1VOTE9BRF9EUklWRVIsIFdJRklfQVBfU1RBVEVfRkFJTEVELCAwKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogRmFpbCBjbGllbnQgbW9kZSBvcGVyYXRpb24gd2hlbiBzb2Z0IEFQIGlzIGVuYWJsZWQgKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIkNhbm5vdCBzdGFydCBzdXBwbGljYW50IHdpdGggYSBydW5uaW5nIHNvZnQgQVAiKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0V2lmaVN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIGNsYXNzIFN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUgeworCisgICAgICAgIHByaXZhdGUgaW50IG1Sc3NpUG9sbFRva2VuID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1heCBudW1iZXIgb2YgdGhlIFdQQSBzdXBwbGljYW50IGxvb3AgaXRlcmF0aW9ucyBiZWZvcmUgd2UKKyAgICAgICAgICogZGVjaWRlIHRoYXQgdGhlIGxvb3Agc2hvdWxkIGJlIHRlcm1pbmF0ZWQ6CisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NVUFBMSUNBTlRfTE9PUF9JVEVSQVRJT05TID0gNDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUxvb3BEZXRlY3RJbmRleCA9IDA7CisgICAgICAgIHByaXZhdGUgaW50IG1Mb29wRGV0ZWN0Q291bnQgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiAgU3VwcGxpY2FudCBzdGF0ZSBjaGFuZ2UgY29tbWFuZHMgZm9sbG93CisgICAgICAgICAqICB0aGUgb3JkaW5hbCB2YWx1ZXMgZGVmaW5lZCBpbiBTdXBwbGljYW50U3RhdGUuamF2YQorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RFRCAgICAgICAgICAgPSAwOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5BQ1RJVkUgICAgICAgICAgICAgICA9IDE7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ0FOTklORyAgICAgICAgICAgICAgID0gMjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFTU09DSUFUSU5HICAgICAgICAgICAgPSAzOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVNTT0NJQVRFRCAgICAgICAgICAgICA9IDQ7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGT1VSX1dBWV9IQU5EU0hBS0UgICAgID0gNTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdST1VQX0hBTkRTSEFLRSAgICAgICAgPSA2OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFVEVEICAgICAgICAgICAgICA9IDc7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBET1JNQU5UICAgICAgICAgICAgICAgID0gODsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOSU5JVElBTElaRUQgICAgICAgICAgPSA5OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRCAgICAgICAgICAgICAgICA9IDEwOworCisgICAgICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbVVuaW5pdGlhbGl6ZWRTdGF0ZSA9IG5ldyBVbmluaXRpYWxpemVkU3RhdGUoKTsKKyAgICAgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtSW5pdGlhbGl6ZWRTdGF0ZSA9IG5ldyBJbml0aWFsaXplZFN0YXRlKCk7OworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1JbmFjdGl2ZVN0YXRlID0gbmV3IEluYWN0aXZlU3RhdGUoKTsKKyAgICAgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRGlzY29ubmVjdFN0YXRlID0gbmV3IERpc2Nvbm5lY3RlZFN0YXRlKCk7CisgICAgICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbVNjYW5TdGF0ZSA9IG5ldyBTY2FuU3RhdGUoKTsKKyAgICAgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtQ29ubmVjdFN0YXRlID0gbmV3IENvbm5lY3RTdGF0ZSgpOworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1IYW5kc2hha2VTdGF0ZSA9IG5ldyBIYW5kc2hha2VTdGF0ZSgpOworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Db21wbGV0ZWRTdGF0ZSA9IG5ldyBDb21wbGV0ZWRTdGF0ZSgpOworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Eb3JtYW50U3RhdGUgPSBuZXcgRG9ybWFudFN0YXRlKCk7CisKKyAgICAgICAgcHVibGljIFN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIHRhcmdldCkgeworICAgICAgICAgICAgc3VwZXIoVEFHLCB0YXJnZXQuZ2V0TG9vcGVyKCkpOworCisgICAgICAgICAgICBhZGRTdGF0ZShtVW5pbml0aWFsaXplZFN0YXRlKTsKKyAgICAgICAgICAgIGFkZFN0YXRlKG1Jbml0aWFsaXplZFN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtSW5hY3RpdmVTdGF0ZSwgbUluaXRpYWxpemVkU3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1EaXNjb25uZWN0U3RhdGUsIG1Jbml0aWFsaXplZFN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtU2NhblN0YXRlLCBtSW5pdGlhbGl6ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgYWRkU3RhdGUobUNvbm5lY3RTdGF0ZSwgbUluaXRpYWxpemVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBhZGRTdGF0ZShtSGFuZHNoYWtlU3RhdGUsIG1Db25uZWN0U3RhdGUpOworICAgICAgICAgICAgICAgICAgICBhZGRTdGF0ZShtQ29tcGxldGVkU3RhdGUsIG1Db25uZWN0U3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Eb3JtYW50U3RhdGUsIG1Jbml0aWFsaXplZFN0YXRlKTsKKworICAgICAgICAgICAgc2V0SW5pdGlhbFN0YXRlKG1VbmluaXRpYWxpemVkU3RhdGUpOworCisgICAgICAgICAgICAvL3N0YXJ0IHRoZSBzdGF0ZSBtYWNoaW5lCisgICAgICAgICAgICBzdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQpIHsKKyAgICAgICAgICAgIFN1cHBsaWNhbnRTdGF0ZSBuZXdTdGF0ZSA9IChTdXBwbGljYW50U3RhdGUpIHN0YXRlQ2hhbmdlUmVzdWx0LnN0YXRlOworCisgICAgICAgICAgICAvLyBTdXBwbGljYW50IHN0YXRlIGNoYW5nZQorICAgICAgICAgICAgLy8gWzMxLTEzXSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQorICAgICAgICAgICAgLy8gWzggLSAwXSBTdXBwbGljYW50IHN0YXRlIChhcyBkZWZpbmVkIGluIFN1cHBsaWNhbnRTdGF0ZS5qYXZhKQorICAgICAgICAgICAgLy8gNTAwMjMgc3VwcGxpY2FudF9zdGF0ZV9jaGFuZ2VkIChjdXN0b218MXw1KQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19TVVBQTElDQU5UX1NUQVRFX0NIQU5HRUQsIG5ld1N0YXRlLm9yZGluYWwoKSk7CisKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UobmV3U3RhdGUub3JkaW5hbCgpLCBzdGF0ZUNoYW5nZVJlc3VsdCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXRTdXBwbGljYW50U3RhdGUoKSB7CisgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVVuaW5pdGlhbGl6ZWRTdGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcmVzZXRMb29wRGV0ZWN0aW9uKCkgeworICAgICAgICAgICAgbUxvb3BEZXRlY3RDb3VudCA9IDA7CisgICAgICAgICAgICBtTG9vcERldGVjdEluZGV4ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVUcmFuc2l0aW9uKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1zZy50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTQ0FOTklORzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1TY2FuU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFTU09DSUFUSU5HOgorICAgICAgICAgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgLyogQlNTSUQgaXMgdmFsaWQgb25seSBpbiBBU1NPQ0lBVElORyBzdGF0ZSAqLworICAgICAgICAgICAgICAgICAgICBtV2lmaUluZm8uc2V0QlNTSUQoc3RhdGVDaGFuZ2VSZXN1bHQuQlNTSUQpOworICAgICAgICAgICAgICAgICAgICAvLyRGQUxMLVRIUk9VR0gkCisgICAgICAgICAgICAgICAgY2FzZSBBU1NPQ0lBVEVEOgorICAgICAgICAgICAgICAgIGNhc2UgRk9VUl9XQVlfSEFORFNIQUtFOgorICAgICAgICAgICAgICAgIGNhc2UgR1JPVVBfSEFORFNIQUtFOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUhhbmRzaGFrZVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29tcGxldGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERPUk1BTlQ6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRG9ybWFudFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJTkFDVElWRToKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmFjdGl2ZVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBVTklOSVRJQUxJWkVEOgorICAgICAgICAgICAgICAgIGNhc2UgSU5WQUxJRDoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1VbmluaXRpYWxpemVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbXNnLm9iajsKKyAgICAgICAgICAgIFN1cHBsaWNhbnRTdGF0ZSBzdXBTdGF0ZSA9IChTdXBwbGljYW50U3RhdGUpIHN0YXRlQ2hhbmdlUmVzdWx0LnN0YXRlOworICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShXaWZpSW5mby5nZXREZXRhaWxlZFN0YXRlT2Yoc3VwU3RhdGUpKTsKKyAgICAgICAgICAgIG1XaWZpSW5mby5zZXRTdXBwbGljYW50U3RhdGUoc3VwU3RhdGUpOworICAgICAgICAgICAgbVdpZmlJbmZvLnNldE5ldHdvcmtJZChzdGF0ZUNoYW5nZVJlc3VsdC5uZXR3b3JrSWQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICogSFNNIHN0YXRlcworICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICBjbGFzcyBJbml0aWFsaXplZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NDQU46CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNjYW5Db21tYW5kKG1lc3NhZ2UuYXJnMSA9PSBTQ0FOX0FDVElWRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy53KFRBRywgIklnbm9yaW5nICIgKyBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIFVuaW5pdGlhbGl6ZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0SXNBdmFpbGFibGUoZmFsc2UpOworICAgICAgICAgICAgICAgICByZXNldExvb3BEZXRlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFuZGxlVHJhbnNpdGlvbihtZXNzYWdlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy53KFRBRywgIklnbm9yaW5nICIgKyBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZXhpdCgpIHsKKyAgICAgICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0SXNBdmFpbGFibGUodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBJbmFjdGl2ZVN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisKKyAgICAgICAgICAgICAgICAgLyogQSBmYWlsZWQgV1BTIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgaWYgKG1XcHNTdGFydGVkKSB7CisgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJXUFMgc2V0IHVwIGZhaWxlZCwgZW5hYmxpbmcgb3RoZXIgbmV0d29ya3MiKTsKKyAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWdTdG9yZS5lbmFibGVBbGxOZXR3b3JrcygpOworICAgICAgICAgICAgICAgICAgICAgbVdwc1N0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtZXNzYWdlLm9iajsKKworICAgICAgICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0SXNBdmFpbGFibGUoZmFsc2UpOworICAgICAgICAgICAgICAgICByZXNldExvb3BEZXRlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgICBzZW5kU3VwcGxpY2FudFN0YXRlQ2hhbmdlZEJyb2FkY2FzdChzdGF0ZUNoYW5nZVJlc3VsdCwgZmFsc2UpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVRyYW5zaXRpb24obWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7CisgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBjbGFzcyBEaXNjb25uZWN0ZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBnZXRDdXJyZW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbWVzc2FnZS5vYmo7CisKKyAgICAgICAgICAgICAgICAgcmVzZXRMb29wRGV0ZWN0aW9uKCk7CisKKyAgICAgICAgICAgICAgICAgLyogSWYgYSBkaXNjb25uZWN0IGV2ZW50IGhhcHBlbnMgYWZ0ZXIgYSBwYXNzd29yZCBrZXkgZmFpbHVyZQorICAgICAgICAgICAgICAgICAgKiBldmVudCwgZGlzYWJsZSB0aGUgbmV0d29yaworICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgaWYgKG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0KSB7CisgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGYWlsZWQgdG8gYXV0aGVudGljYXRlLCBkaXNhYmxpbmcgbmV0d29yayAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLmdldE5ldHdvcmtJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWdTdG9yZS5kaXNhYmxlTmV0d29yayhtV2lmaUluZm8uZ2V0TmV0d29ya0lkKCkpOworICAgICAgICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50U3RhdGVDaGFuZ2VkQnJvYWRjYXN0KHN0YXRlQ2hhbmdlUmVzdWx0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50U3RhdGVDaGFuZ2VkQnJvYWRjYXN0KHN0YXRlQ2hhbmdlUmVzdWx0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVUcmFuc2l0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgU2NhblN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtZXNzYWdlLm9iajsKKworICAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICByZXNldExvb3BEZXRlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRTdGF0ZUNoYW5nZWRCcm9hZGNhc3Qoc3RhdGVDaGFuZ2VSZXN1bHQsIGZhbHNlKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVUcmFuc2l0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgQ29ubmVjdFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TQ0FOOgorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kKFNDQU5fT05MWV9NT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2NhbkNvbW1hbmQobWVzc2FnZS5hcmcxID09IFNDQU5fQUNUSVZFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIEhhbmRzaGFrZVN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtZXNzYWdlLm9iajsKKworICAgICAgICAgICAgICAgICBpZiAobUxvb3BEZXRlY3RJbmRleCA+IG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgICAgICAgbUxvb3BEZXRlY3RDb3VudCsrOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGlmIChtTG9vcERldGVjdENvdW50ID4gTUFYX1NVUFBMSUNBTlRfTE9PUF9JVEVSQVRJT05TKSB7CisgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlnU3RvcmUuZGlzYWJsZU5ldHdvcmsoc3RhdGVDaGFuZ2VSZXN1bHQubmV0d29ya0lkKTsKKyAgICAgICAgICAgICAgICAgICAgIG1Mb29wRGV0ZWN0Q291bnQgPSAwOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgbUxvb3BEZXRlY3RJbmRleCA9IG1lc3NhZ2Uud2hhdDsKKworICAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICBzZW5kU3VwcGxpY2FudFN0YXRlQ2hhbmdlZEJyb2FkY2FzdChzdGF0ZUNoYW5nZVJlc3VsdCwgZmFsc2UpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVRyYW5zaXRpb24obWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBDb21wbGV0ZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBnZXRDdXJyZW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbWVzc2FnZS5vYmo7CisKKyAgICAgICAgICAgICAgICAgbVJzc2lQb2xsVG9rZW4rKzsKKyAgICAgICAgICAgICAgICAgaWYgKG1FbmFibGVSc3NpUG9sbGluZykgeworICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKG9idGFpbk1lc3NhZ2UoQ01EX1JTU0lfUE9MTCwgbVJzc2lQb2xsVG9rZW4sIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT0xMX1JTU0lfSU5URVJWQUxfTVNFQ1MpOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgcmVzZXRMb29wRGV0ZWN0aW9uKCk7CisKKyAgICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRTdGF0ZUNoYW5nZWRCcm9hZGNhc3Qoc3RhdGVDaGFuZ2VSZXN1bHQsIGZhbHNlKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBU1NPQ0lBVElORzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBU1NPQ0lBVEVEOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEZPVVJfV0FZX0hBTkRTSEFLRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBHUk9VUF9IQU5EU0hBS0U6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JTU0lfUE9MTDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzEgPT0gbVJzc2lQb2xsVG9rZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgSW5mbyBhbmQgY29udGludWUgcG9sbGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQb2xsZWRJbmZvKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKG9idGFpbk1lc3NhZ2UoQ01EX1JTU0lfUE9MTCwgbVJzc2lQb2xsVG9rZW4sIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9MTF9SU1NJX0lOVEVSVkFMX01TRUNTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUG9sbGluZyBoYXMgY29tcGxldGVkCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfRU5BQkxFX1JTU0lfUE9MTDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Sc3NpUG9sbFRva2VuKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUVuYWJsZVJzc2lQb2xsaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgcG9sbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQb2xsZWRJbmZvKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKG9idGFpbk1lc3NhZ2UoQ01EX1JTU0lfUE9MTCwgbVJzc2lQb2xsVG9rZW4sIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9MTF9SU1NJX0lOVEVSVkFMX01TRUNTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVRyYW5zaXRpb24obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgRG9ybWFudFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOworCisgICAgICAgICAgICAgICAgcmVzZXRMb29wRGV0ZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50U3RhdGVDaGFuZ2VkQnJvYWRjYXN0KHN0YXRlQ2hhbmdlUmVzdWx0LCBmYWxzZSk7CisKKyAgICAgICAgICAgICAgICAvKiBUT0RPOiByZWNvbm5lY3QgaXMgbm93IGJlaW5nIGhhbmRsZWQgYXQgREhDUCBmYWlsdXJlIGhhbmRsaW5nCisgICAgICAgICAgICAgICAgICogSWYgd2UgcnVuIGludG8gaXNzdWVzIHdpdGggc3RheWluZyBpbiBEb3JtYW50IHN0YXRlLCBtaWdodAorICAgICAgICAgICAgICAgICAqIG5lZWQgYSByZWNvbm5lY3QgaGVyZQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlVHJhbnNpdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZVRyYWNrZXIuamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZVRyYWNrZXIuamF2YQppbmRleCA1MjIwNzEzLi5mOGM5YmQ2IDEwMDY0NAotLS0gYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVUcmFja2VyLmphdmEKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlVHJhY2tlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTYsNDY2ICsxNiwxMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLm5ldC53aWZpOwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9ESVNBQkxFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0RJU0FCTElORzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9FTkFCTElORzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX1VOS05PV047CiAKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJOYXRpdmU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRlVHJhY2tlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5EaGNwSW5mbzsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlOwotaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLlN0YXRlOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLldvcmtTb3VyY2U7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOwotaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEhlYWRzZXQ7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQTJkcDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLklCYXR0ZXJ5U3RhdHM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua0NhcGFiaWxpdGllczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdGVUcmFja2VyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiAKLWltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiAKIC8qKgotICogVHJhY2sgdGhlIHN0YXRlIG9mIFdpZmkgY29ubmVjdGl2aXR5LiBBbGwgZXZlbnQgaGFuZGxpbmcgaXMgZG9uZSBoZXJlLAotICogYW5kIGFsbCBjaGFuZ2VzIGluIGNvbm5lY3Rpdml0eSBzdGF0ZSBhcmUgaW5pdGlhdGVkIGhlcmUuCisgKiBUcmFjayB0aGUgc3RhdGUgb2Ygd2lmaSBmb3IgY29ubmVjdGl2aXR5IHNlcnZpY2UuCiAgKgogICogQGhpZGUKICAqLwotcHVibGljIGNsYXNzIFdpZmlTdGF0ZVRyYWNrZXIgZXh0ZW5kcyBOZXR3b3JrU3RhdGVUcmFja2VyIHsKK3B1YmxpYyBjbGFzcyBXaWZpU3RhdGVUcmFja2VyIGltcGxlbWVudHMgTmV0d29ya1N0YXRlVHJhY2tlciB7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0FMX0xPR0QgPSBDb25maWcuTE9HRCB8fCBmYWxzZTsKLSAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS1RZUEUgPSAiV0lGSSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJXaWZpU3RhdGVUcmFja2VyIjsKIAotICAgIC8vIEV2ZW50IGxvZyB0YWdzIChtdXN0IGJlIGluIHN5bmMgd2l0aCBldmVudC1sb2ctdGFncykKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRMT0dfTkVUV09SS19TVEFURV9DSEFOR0VEID0gNTAwMjE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX1NVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRCA9IDUwMDIyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVExPR19EUklWRVJfU1RBVEVfQ0hBTkdFRCA9IDUwMDIzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVExPR19JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVEFURV9DSEFOR0VEID0gNTAwMjQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX1NVUFBMSUNBTlRfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEID0gNTAwMjU7CisgICAgcHJpdmF0ZSBBdG9taWNCb29sZWFuIG1UZWFyZG93blJlcXVlc3RlZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICBwcml2YXRlIEF0b21pY0Jvb2xlYW4gbVByaXZhdGVEbnNSb3V0ZVNldCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICBwcml2YXRlIEF0b21pY0ludGVnZXIgbURlZmF1bHRHYXRld2F5QWRkciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgIHByaXZhdGUgQXRvbWljQm9vbGVhbiBtRGVmYXVsdFJvdXRlU2V0ID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwogCi0gICAgLy8gRXZlbnQgY29kZXMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU1VQUExJQ0FOVF9DT05ORUNUSU9OICAgICAgICAgICAgID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU1VQUExJQ0FOVF9ESVNDT05ORUNUICAgICAgICAgICAgID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEICAgICAgICAgID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTkVUV09SS19TVEFURV9DSEFOR0VEICAgICAgICAgICAgID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU0NBTl9SRVNVTFRTX0FWQUlMQUJMRSAgICAgICAgICAgID0gNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fU1VDQ0VFREVEID0gNjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fRkFJTEVEICAgID0gNzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUE9MTF9JTlRFUlZBTCAgICAgICAgICAgICAgICAgICAgID0gODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfREhDUF9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgID0gOTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfREVGRVJSRURfRElTQ09OTkVDVCAgICAgICAgICAgICAgID0gMTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0RFRkVSUkVEX1JFQ09OTkVDVCAgICAgICAgICAgICAgICA9IDExOwotICAgIC8qKgotICAgICAqIFRoZSBkcml2ZXIgaXMgc3RhcnRlZCBvciBzdG9wcGVkLiBUaGUgb2JqZWN0IHdpbGwgYmUgdGhlIHN0YXRlOiB0cnVlIGZvcgotICAgICAqIHN0YXJ0ZWQsIGZhbHNlIGZvciBzdG9wcGVkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9EUklWRVJfU1RBVEVfQ0hBTkdFRCAgICAgICAgICAgICAgPSAxMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUEFTU1dPUkRfS0VZX01BWV9CRV9JTkNPUlJFQ1QgICAgID0gMTM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX01BWUJFX1NUQVJUX1NDQU5fUE9TVF9ESVNDT05ORUNUICA9IDE0OworICAgIHByaXZhdGUgTGlua1Byb3BlcnRpZXMgbUxpbmtQcm9wZXJ0aWVzOworICAgIHByaXZhdGUgTGlua0NhcGFiaWxpdGllcyBtTGlua0NhcGFiaWxpdGllczsKKyAgICBwcml2YXRlIE5ldHdvcmtJbmZvIG1OZXR3b3JrSW5mbzsKIAotICAgIC8qKgotICAgICAqIFRoZSBkcml2ZXIgc3RhdGUgaW5kaWNhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1NUQVJURUQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1NUT1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX0hVTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjsKKyAgICAvKiBGb3Igc2VuZGluZyBldmVudHMgdG8gY29ubmVjdGl2aXR5IHNlcnZpY2UgaGFuZGxlciAqLworICAgIHByaXZhdGUgSGFuZGxlciBtQ3NIYW5kbGVyOworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1XaWZpU3RhdGVSZWNlaXZlcjsKKyAgICBwcml2YXRlIFdpZmlNYW5hZ2VyIG1XaWZpTWFuYWdlcjsKIAotICAgIC8qKgotICAgICAqIEludGVydmFsIGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHBvbGxpbmcgZm9yIGNvbm5lY3Rpb24KLSAgICAgKiBzdGF0dXMgaXRlbXMgdGhhdCBhcmUgbm90IHNlbnQgdmlhIGFzeW5jaHJvbm91cyBldmVudHMuCi0gICAgICogQW4gZXhhbXBsZSBpcyBSU1NJIChzaWduYWwgc3RyZW5ndGgpLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT0xMX1NUQVRVU19JTlRFUlZBTF9NU0VDUyA9IDMwMDA7CisgICAgcHVibGljIFdpZmlTdGF0ZVRyYWNrZXIoKSB7CisgICAgICAgIG1OZXR3b3JrSW5mbyA9IG5ldyBOZXR3b3JrSW5mbyhDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSSwgMCwgTkVUV09SS1RZUEUsICIiKTsKKyAgICAgICAgbUxpbmtQcm9wZXJ0aWVzID0gbmV3IExpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgIG1MaW5rQ2FwYWJpbGl0aWVzID0gbmV3IExpbmtDYXBhYmlsaXRpZXMoKTsKIAotICAgIC8qKgotICAgICAqIFRoZSBtYXggbnVtYmVyIG9mIHRoZSBXUEEgc3VwcGxpY2FudCBsb29wIGl0ZXJhdGlvbnMgYmVmb3JlIHdlCi0gICAgICogZGVjaWRlIHRoYXQgdGhlIGxvb3Agc2hvdWxkIGJlIHRlcm1pbmF0ZWQ6Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9TVVBQTElDQU5UX0xPT1BfSVRFUkFUSU9OUyA9IDQ7CisgICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZShmYWxzZSk7CisgICAgICAgIHNldFRlYXJkb3duUmVxdWVzdGVkKGZhbHNlKTsKKyAgICB9CiAKLSAgICAvKioKLSAgICAgKiBXaGVuIGEgRElTQ09OTkVDVCBldmVudCBpcyByZWNlaXZlZCwgd2UgZGVmZXIgaGFuZGxpbmcgaXQgdG8KLSAgICAgKiBhbGxvdyBmb3IgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhlIERJU0NPTk5FQ1QgaXMgYWJvdXQgdG8KLSAgICAgKiBiZSBmb2xsb3dlZCBzaG9ydGx5IGJ5IGEgQ09OTkVDVCB0byB0aGUgc2FtZSBuZXR3b3JrIHdlIHdlcmUKLSAgICAgKiBqdXN0IGNvbm5lY3RlZCB0by4gSW4gc3VjaCBhIGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gcmVwb3J0Ci0gICAgICogdGhlIG5ldHdvcmsgYXMgZG93biwgbm9yIGRvIHdlIHdhbnQgdG8gcmVjb25maWd1cmUgdGhlIG5ldHdvcmsKLSAgICAgKiBpbnRlcmZhY2UsIGV0Yy4gSWYgd2UgZ2V0IGEgQ09OTkVDVCBldmVudCBmb3IgYW5vdGhlciBuZXR3b3JrCi0gICAgICogd2l0aGluIHRoZSBkZWxheSB3aW5kb3csIHdlIGltbWVkaWF0ZWx5IGhhbmRsZSB0aGUgcGVuZGluZwotICAgICAqIGRpc2Nvbm5lY3QgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIENPTk5FQ1QuPHAvPgotICAgICAqIFRoZSBmaXZlIHNlY29uZCBkZWxheSBpcyBjaG9zZW4gc29tZXdoYXQgYXJiaXRyYXJpbHksIGJ1dCBpcwotICAgICAqIG1lYW50IHRvIGNvdmVyIG1vc3Qgb2YgdGhlIGNhc2VzIHdoZXJlIGEgRElTQ09OTkVDVC9DT05ORUNUCi0gICAgICogaGFwcGVucyB0byBhIG5ldHdvcmsuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfREVMQVlfTVNFQ1MgPSA1MDAwOwotICAgIC8qKgotICAgICAqIFdoZW4gdGhlIHN1cHBsaWNhbnQgZ29lcyBpZGxlIGFmdGVyIHdlIGRvIGFuIGV4cGxpY2l0IGRpc2Nvbm5lY3QKLSAgICAgKiBmb2xsb3dpbmcgYSBESENQIGZhaWx1cmUsIHdlIG5lZWQgdG8ga2ljayB0aGUgc3VwcGxpY2FudCBpbnRvCi0gICAgICogdHJ5aW5nIHRvIGFzc29jaWF0ZSB3aXRoIGFjY2VzcyBwb2ludHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQ09OTkVDVF9ERUxBWV9NU0VDUyA9IDIwMDA7CiAKLSAgICAvKioKLSAgICAgKiBXaGVuIHRoZSBzdXBwbGljYW50IGRpc2Nvbm5lY3RzIGZyb20gYW4gQVAgaXQgc29tZXRpbWVzIGZvcmdldHMKLSAgICAgKiB0byByZXN0YXJ0IHNjYW5uaW5nLiAgV2FpdCB0aGlzIGRlbGF5IGJlZm9yZSBhc2tpbmcgaXQgdG8gc3RhcnQKLSAgICAgKiBzY2FubmluZyAoaW4gY2FzZSBpdCBmb3Jnb3QpLiAgMTUgc2VjIGlzIHRoZSBzdGFuZGFyZCBkZWxheSBiZXR3ZWVuCi0gICAgICogc2NhbnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtJQ0tTVEFSVF9TQ0FOTklOR19ERUxBWV9NU0VDUyA9IDE1MDAwOworICAgIHB1YmxpYyB2b2lkIHNldFRlYXJkb3duUmVxdWVzdGVkKGJvb2xlYW4gaXNSZXF1ZXN0ZWQpIHsKKyAgICAgICAgbVRlYXJkb3duUmVxdWVzdGVkLnNldChpc1JlcXVlc3RlZCk7CisgICAgfQogCi0gICAgLyoqCi0gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHdlIHdpbGwgcmV0cnkgYSBjb25uZWN0aW9uIHRvIGFuIGFjY2VzcyBwb2ludAotICAgICAqIGZvciB3aGljaCB3ZSBoYXZlIGZhaWxlZCBpbiBhY3F1aXJpbmcgYW4gSVAgYWRkcmVzcyBmcm9tIERIQ1AuIEEgdmFsdWUgb2YKLSAgICAgKiBOIG1lYW5zIHRoYXQgd2Ugd2lsbCBtYWtlIE4rMSBjb25uZWN0aW9uIGF0dGVtcHRzIGluIGFsbC4KLSAgICAgKiA8cD4KLSAgICAgKiBTZWUge0BsaW5rIFNldHRpbmdzLlNlY3VyZSNXSUZJX01BWF9ESENQX1JFVFJZX0NPVU5UfS4gVGhpcyBpcyB0aGUgZGVmYXVsdAotICAgICAqIHZhbHVlIGlmIGEgU2V0dGluZ3MgdmFsdWUgaXMgbm90IHByZXNlbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX0RIQ1BfUkVUUklFUyA9IDk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1BPV0VSX01PREVfQVVUTyA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRSA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3VycmVudCBXUEEgc3VwcGxpY2FudCBsb29wIHN0YXRlICh1c2VkIHRvIGRldGVjdCBsb29waW5nIGJlaGF2aW9yKToKLSAgICAgKi8KLSAgICBwcml2YXRlIFN1cHBsaWNhbnRTdGF0ZSBtU3VwcGxpY2FudExvb3BTdGF0ZSA9IFN1cHBsaWNhbnRTdGF0ZS5ESVNDT05ORUNURUQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3VycmVudCBudW1iZXIgb2YgV1BBIHN1cHBsaWNhbnQgbG9vcCBpdGVyYXRpb25zOgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1OdW1TdXBwbGljYW50TG9vcEl0ZXJhdGlvbnMgPSAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgbnVtYmVyIG9mIHN1cHBsaWNhbnQgc3RhdGUgY2hhbmdlcy4gIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUKLSAgICAgKiBpZiB3ZSd2ZSByZWNlaXZlZCBhbnkgbmV3IGluZm8gc2luY2Ugd2UgZm91bmQgb3V0IGl0IHdhcyBESVNDT05ORUNURUQgb3IKLSAgICAgKiBJTkFDVElWRS4gIElmIHdlIGhhdmVuJ3QgZm9yIFggbXMsIHdlIHRoZW4gcmVxdWVzdCBhIHNjYW4gLSBpdCBzaG91bGQgaGF2ZQotICAgICAqIGRvbmUgdGhhdCBhdXRvbWF0aWNhbGx5LCBidXQgc29tZXRpbWVzIHNvbWUgZmlybXdhcmUgZG9lcyBub3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbU51bVN1cHBsaWNhbnRTdGF0ZUNoYW5nZXMgPSAwOwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB3ZSByZWNlaXZlZCBhbiBldmVudCB0aGF0IHRoYXQgYSBwYXNzd29yZC1rZXkgbWF5IGJlIGluY29ycmVjdC4KLSAgICAgKiBJZiB0aGUgbmV4dCBpbmNvbWluZyBzdXBwbGljYW50IHN0YXRlIGNoYW5nZSBldmVudCBpcyBESVNDT05ORUNULAotICAgICAqIGJyb2FkY2FzdCBhIG1lc3NhZ2UgdGhhdCB3ZSBoYXZlIGEgcG9zc2libGUgcGFzc3dvcmQgZXJyb3IgYW5kIGRpc2FibGUKLSAgICAgKiB0aGUgbmV0d29yay4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVUFBMX1NDQU5fSEFORExJTkdfTk9STUFMID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVVBQTF9TQ0FOX0hBTkRMSU5HX0xJU1RfT05MWSA9IDI7Ci0KLSAgICBwcml2YXRlIFdpZmlNb25pdG9yIG1XaWZpTW9uaXRvcjsKLSAgICBwcml2YXRlIFdpZmlJbmZvIG1XaWZpSW5mbzsKLSAgICBwcml2YXRlIExpc3Q8U2NhblJlc3VsdD4gbVNjYW5SZXN1bHRzOwotICAgIHByaXZhdGUgV2lmaU1hbmFnZXIgbVdNOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSGF2ZUlwQWRkcmVzczsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU9idGFpbmluZ0lwQWRkcmVzczsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVRvcm5Eb3duQnlDb25uTWdyOwotICAgIC8qKgotICAgICAqIEEgRElTQ09OTkVDVCBldmVudCBoYXMgYmVlbiByZWNlaXZlZCwgYnV0IHByb2Nlc3NpbmcgaXQKLSAgICAgKiBpcyBiZWluZyBkZWZlcnJlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbURpc2Nvbm5lY3RQZW5kaW5nOwotICAgIC8qKgotICAgICAqIEFuIG9wZXJhdGlvbiBoYXMgYmVlbiBwZXJmb3JtZWQgYXMgYSByZXN1bHQgb2Ygd2hpY2ggd2UgZXhwZWN0IHRoZSBuZXh0IGV2ZW50Ci0gICAgICogd2lsbCBiZSBhIERJU0NPTk5FQ1QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1EaXNjb25uZWN0RXhwZWN0ZWQ7Ci0gICAgcHJpdmF0ZSBEaGNwSGFuZGxlciBtRGhjcFRhcmdldDsKLSAgICBwcml2YXRlIERoY3BJbmZvIG1EaGNwSW5mbzsKLSAgICBwcml2YXRlIGludCBtTGFzdFNpZ25hbExldmVsID0gLTE7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUxhc3RCc3NpZDsKLSAgICBwcml2YXRlIFN0cmluZyBtTGFzdFNzaWQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUxhc3ROZXR3b3JrSWQgPSAtMTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVVzZVN0YXRpY0lwID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBpbnQgbVJlY29ubmVjdENvdW50OwotCi0gICAgLyogVHJhY2tzIGlmIGFueSBuZXR3b3JrIGluIHRoZSBjb25maWd1cmF0aW9uIGlzIGRpc2FibGVkICovCi0gICAgcHJpdmF0ZSBBdG9taWNCb29sZWFuIG1Jc0FueU5ldHdvcmtEaXNhYmxlZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKLQotICAgIC8vIHVzZWQgdG8gc3RvcmUgdGhlIChub24tcGVyc2lzdGVkKSBudW0gZGV0ZXJtaW5lZCBkdXJpbmcgZGV2aWNlIGJvb3QgCi0gICAgLy8gKGZyb20gbWNjIG9yIG90aGVyIHBob25lIGluZm8pIGJlZm9yZSB0aGUgZHJpdmVyIGlzIHN0YXJ0ZWQuCi0gICAgcHJpdmF0ZSBpbnQgbU51bUFsbG93ZWRDaGFubmVscyA9IDA7Ci0KLSAgICAvLyBWYXJpYWJsZXMgcmVsYXRpbmcgdG8gdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbgotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBpY29uIHRvIHNob3cgaW4gdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbi4gVGhpcyB3aWxsIGFsc28KLSAgICAgKiBiZSB0aGUgSUQgb2YgdGhlIE5vdGlmaWNhdGlvbiBnaXZlbiB0byB0aGUgTm90aWZpY2F0aW9uTWFuYWdlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSUNPTl9ORVRXT1JLU19BVkFJTEFCTEUgPQotICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X25vdGlmeV93aWZpX2luX3JhbmdlOwotICAgIC8qKgotICAgICAqIFdoZW4gYSBub3RpZmljYXRpb24gaXMgc2hvd24sIHdlIHdhaXQgdGhpcyBhbW91bnQgYmVmb3JlIHBvc3NpYmx5IHNob3dpbmcgaXQgYWdhaW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBsb25nIE5PVElGSUNBVElPTl9SRVBFQVRfREVMQVlfTVM7Ci0gICAgLyoqCi0gICAgICogV2hldGhlciB0aGUgdXNlciBoYXMgc2V0IHRoZSBzZXR0aW5nIHRvIHNob3cgdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0gICAgLyoqCi0gICAgICogT2JzZXJ2ZXMgdGhlIHVzZXIgc2V0dGluZyB0byBrZWVwIHtAbGluayAjbU5vdGlmaWNhdGlvbkVuYWJsZWR9IGluIHN5bmMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyOwotICAgIC8qKgotICAgICAqIFRoZSB7QGxpbmsgU3lzdGVtI2N1cnJlbnRUaW1lTWlsbGlzKCl9IG11c3QgYmUgYXQgbGVhc3QgdGhpcyB2YWx1ZSBmb3IgdXMKLSAgICAgKiB0byBzaG93IHRoZSBub3RpZmljYXRpb24gYWdhaW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBsb25nIG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lOwotICAgIC8qKgotICAgICAqIFRoZSBOb3RpZmljYXRpb24gb2JqZWN0IGdpdmVuIHRvIHRoZSBOb3RpZmljYXRpb25NYW5hZ2VyLgotICAgICAqLwotICAgIHByaXZhdGUgTm90aWZpY2F0aW9uIG1Ob3RpZmljYXRpb247Ci0gICAgLyoqCi0gICAgICogV2hldGhlciB0aGUgbm90aWZpY2F0aW9uIGlzIGJlaW5nIHNob3duLCBhcyBzZXQgYnkgdXMuIFRoYXQgaXMsIGlmIHRoZQotICAgICAqIHVzZXIgY2FuY2VscyB0aGUgbm90aWZpY2F0aW9uLCB3ZSB3aWxsIG5vdCByZWNlaXZlIHRoZSBjYWxsYmFjayBzbyB0aGlzCi0gICAgICogd2lsbCBzdGlsbCBiZSB0cnVlLiBXZSBvbmx5IGd1YXJhbnRlZSBpZiB0aGlzIGlzIGZhbHNlLCB0aGVuIHRoZQotICAgICAqIG5vdGlmaWNhdGlvbiBpcyBub3Qgc2hvd2luZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWNhdGlvblNob3duOwotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2YgY29udGludW91cyBzY2FucyB0aGF0IG11c3Qgb2NjdXIgYmVmb3JlIGNvbnNpZGVyIHRoZQotICAgICAqIHN1cHBsaWNhbnQgaW4gYSBzY2FubmluZyBzdGF0ZS4gVGhpcyBhbGxvd3Mgc3VwcGxpY2FudCB0byBhc3NvY2lhdGUgd2l0aAotICAgICAqIHJlbWVtYmVyZWQgbmV0d29ya3MgdGhhdCBhcmUgaW4gdGhlIHNjYW4gcmVzdWx0cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1NDQU5TX0JFRk9SRV9BQ1RVQUxMWV9TQ0FOTklORyA9IDM7Ci0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBzY2FucyBzaW5jZSB0aGUgbGFzdCBuZXR3b3JrIHN0YXRlIGNoYW5nZS4gV2hlbiB0aGlzCi0gICAgICogZXhjZWVkcyB7QGxpbmsgI05VTV9TQ0FOU19CRUZPUkVfQUNUVUFMTFlfU0NBTk5JTkd9LCB3ZSBjb25zaWRlciB0aGUKLSAgICAgKiBzdXBwbGljYW50IHRvIGFjdHVhbGx5IGJlIHNjYW5uaW5nLiBXaGVuIHRoZSBuZXR3b3JrIHN0YXRlIGNoYW5nZXMgdG8KLSAgICAgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiBzY2FubmluZywgd2UgcmVzZXQgdGhpcyB0byAwLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlOwotICAgIC8qKgotICAgICAqIE9ic2VydmVzIHRoZSBzdGF0aWMgSVAgYWRkcmVzcyBzZXR0aW5ncy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNldHRpbmdzT2JzZXJ2ZXIgbVNldHRpbmdzT2JzZXJ2ZXI7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1NjYW5Nb2RlQWN0aXZlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlUnNzaVBvbGxpbmc7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0hpZ2hQZXJmRW5hYmxlZDsKLSAgICBwcml2YXRlIGludCBtUG93ZXJNb2RlUmVmQ291bnQgPSAwOwotICAgIHByaXZhdGUgaW50IG1PcHRpbWl6YXRpb25zRGlzYWJsZWRSZWZDb3VudCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBPbmUgb2YgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX1NUQVRFX0RJU0FCTEVEfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX1NUQVRFX0RJU0FCTElOR30sCi0gICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9FTkFCTEVEfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX1NUQVRFX0VOQUJMSU5HfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX1NUQVRFX1VOS05PV059Ci0gICAgICoKLSAgICAgKiBnZXRXaWZpU3RhdGUoKSBpcyBub3Qgc3luY2hyb25pemVkIHRvIG1ha2Ugc3VyZSBpdCdzIGFsd2F5cyBmYXN0LAotICAgICAqIGV2ZW4gd2hlbiB0aGUgaW5zdGFuY2UgbG9jayBpcyBoZWxkIG9uIG90aGVyIHNsb3cgb3BlcmF0aW9ucy4KLSAgICAgKiBVc2UgYSBhdG9taWMgdmFyaWFibGUgZm9yIHN0YXRlLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBtV2lmaVN0YXRlID0gbmV3IEF0b21pY0ludGVnZXIoV0lGSV9TVEFURV9VTktOT1dOKTsKLQotICAgIC8vIFdpLUZpIHJ1biBzdGF0ZXM6Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9TVEFURV9TVEFSVElORyA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9TVEFURV9SVU5OSU5HICA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9TVEFURV9TVE9QUElORyA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9TVEFURV9TVE9QUEVEICA9IDQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbVJ1blN0YXRlTmFtZXNbXSA9IHsKLSAgICAgICAgICAgICJTdGFydGluZyIsCi0gICAgICAgICAgICAiUnVubmluZyIsCi0gICAgICAgICAgICAiU3RvcHBpbmciLAotICAgICAgICAgICAgIlN0b3BwZWQiCi0gICAgfTsKLSAgICBwcml2YXRlIGludCBtUnVuU3RhdGU7Ci0KLSAgICBwcml2YXRlIGZpbmFsIElCYXR0ZXJ5U3RhdHMgbUJhdHRlcnlTdGF0czsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNTY2FuT25seTsKLQotICAgIHByaXZhdGUgQmx1ZXRvb3RoQTJkcCBtQmx1ZXRvb3RoQTJkcDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1JbnRlcmZhY2VOYW1lOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBMUyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHNEbnNQcm9wTmFtZXM7Ci0gICAgcHJpdmF0ZSBSdW5uYWJsZSBtUmVsZWFzZVdha2VMb2NrQ2FsbGJhY2s7Ci0KLSAgICAvKioKLSAgICAgKiBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UgbGFzdCB0b2xkIHRoZSBiYXR0ZXJ5IHN0YXRzIHdlIGhhZCBzdGFydGVkLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtUmVwb3J0ZWRSdW5uaW5nID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBNb3N0IHJlY2VudGx5IHNldCBzb3VyY2Ugb2Ygc3RhcnRpbmcgV0lGSS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFdvcmtTb3VyY2UgbVJ1bm5pbmdXaWZpVWlkcyA9IG5ldyBXb3JrU291cmNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbGFzdCByZXBvcnRlZCBVSURzIHRoYXQgd2VyZSByZXNwb25zaWJsZSBmb3Igc3RhcnRpbmcgV0lGSS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFdvcmtTb3VyY2UgbUxhc3RSdW5uaW5nV2lmaVVpZHMgPSBuZXcgV29ya1NvdXJjZSgpOwotCi0gICAgLyoqCi0gICAgICogQSBzdHJ1Y3R1cmUgZm9yIHN1cHBseWluZyBpbmZvcm1hdGlvbiBhYm91dCBhIHN1cHBsaWNhbnQgc3RhdGUKLSAgICAgKiBjaGFuZ2UgaW4gdGhlIFNUQVRFX0NIQU5HRSBldmVudCBtZXNzYWdlIHRoYXQgY29tZXMgZnJvbSB0aGUKLSAgICAgKiBXaWZpTW9uaXRvcgotICAgICAqIHRocmVhZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdXBwbGljYW50U3RhdGVDaGFuZ2VSZXN1bHQgewotICAgICAgICBTdXBwbGljYW50U3RhdGVDaGFuZ2VSZXN1bHQoaW50IG5ldHdvcmtJZCwgU3RyaW5nIEJTU0lELCBTdXBwbGljYW50U3RhdGUgc3RhdGUpIHsKLSAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgICAgIHRoaXMuQlNTSUQgPSBCU1NJRDsKLSAgICAgICAgICAgIHRoaXMubmV0d29ya0lkID0gbmV0d29ya0lkOwotICAgICAgICB9Ci0gICAgICAgIGludCBuZXR3b3JrSWQ7Ci0gICAgICAgIFN0cmluZyBCU1NJRDsKLSAgICAgICAgU3VwcGxpY2FudFN0YXRlIHN0YXRlOworICAgIHB1YmxpYyBib29sZWFuIGlzVGVhcmRvd25SZXF1ZXN0ZWQoKSB7CisgICAgICAgIHJldHVybiBtVGVhcmRvd25SZXF1ZXN0ZWQuZ2V0KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQSBzdHJ1Y3R1cmUgZm9yIHN1cHBseWluZyBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbm5lY3Rpb24gaW4KLSAgICAgKiB0aGUgQ09OTkVDVEVEIGV2ZW50IG1lc3NhZ2UgdGhhdCBjb21lcyBmcm9tIHRoZSBXaWZpTW9uaXRvcgotICAgICAqIHRocmVhZC4KKyAgICAgKiBCZWdpbiBtb25pdG9yaW5nIHdpZmkgY29ubmVjdGl2aXR5CiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTmV0d29ya1N0YXRlQ2hhbmdlUmVzdWx0IHsKLSAgICAgICAgTmV0d29ya1N0YXRlQ2hhbmdlUmVzdWx0KERldGFpbGVkU3RhdGUgc3RhdGUsIFN0cmluZyBCU1NJRCwgaW50IG5ldHdvcmtJZCkgewotICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwotICAgICAgICAgICAgdGhpcy5CU1NJRCA9IEJTU0lEOwotICAgICAgICAgICAgdGhpcy5uZXR3b3JrSWQgPSBuZXR3b3JrSWQ7Ci0gICAgICAgIH0KLSAgICAgICAgRGV0YWlsZWRTdGF0ZSBzdGF0ZTsKLSAgICAgICAgU3RyaW5nIEJTU0lEOwotICAgICAgICBpbnQgbmV0d29ya0lkOwotICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzdGFydE1vbml0b3JpbmcoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIHRhcmdldCkgeworICAgICAgICBtQ3NIYW5kbGVyID0gdGFyZ2V0OworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAKLSAgICBwdWJsaWMgV2lmaVN0YXRlVHJhY2tlcihDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgdGFyZ2V0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIHRhcmdldCwgQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkksIDAsICJXSUZJIiwgIiIpOwotICAgICAgICAKLSAgICAgICAgbVdpZmlJbmZvID0gbmV3IFdpZmlJbmZvKCk7Ci0gICAgICAgIG1XaWZpTW9uaXRvciA9IG5ldyBXaWZpTW9uaXRvcih0aGlzKTsKLSAgICAgICAgbUhhdmVJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgbU9idGFpbmluZ0lwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICBzZXRUb3JuRG93bkJ5Q29ubk1ncihmYWxzZSk7Ci0gICAgICAgIG1EaXNjb25uZWN0UGVuZGluZyA9IGZhbHNlOwotICAgICAgICBtU2NhblJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PFNjYW5SZXN1bHQ+KCk7Ci0gICAgICAgIC8vIEFsbG9jYXRlIERIQ1AgaW5mbyBvYmplY3Qgb25jZSwgYW5kIGZpbGwgaXQgaW4gb24gZWFjaCByZXF1ZXN0Ci0gICAgICAgIG1EaGNwSW5mbyA9IG5ldyBEaGNwSW5mbygpOwotICAgICAgICBtUnVuU3RhdGUgPSBSVU5fU1RBVEVfU1RBUlRJTkc7CisgICAgICAgIG1XaWZpTWFuYWdlciA9IChXaWZpTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJRklfU0VSVklDRSk7CisgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuQ09ORklHX0NIQU5HRURfQUNUSU9OKTsKIAotICAgICAgICAvLyBTZXR0aW5nIGlzIGluIHNlY29uZHMKLSAgICAgICAgTk9USUZJQ0FUSU9OX1JFUEVBVF9ERUxBWV9NUyA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTkVUV09SS1NfQVZBSUxBQkxFX1JFUEVBVF9ERUxBWSwgOTAwKSAqIDEwMDBsOwotICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlciA9IG5ldyBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyKG5ldyBIYW5kbGVyKCkpOwotICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlci5yZWdpc3RlcigpOwotCi0gICAgICAgIG1TZXR0aW5nc09ic2VydmVyID0gbmV3IFNldHRpbmdzT2JzZXJ2ZXIobmV3IEhhbmRsZXIoKSk7Ci0KLSAgICAgICAgbUludGVyZmFjZU5hbWUgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgid2lmaS5pbnRlcmZhY2UiLCAidGl3bGFuMCIpOwotICAgICAgICBzRG5zUHJvcE5hbWVzID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICJkaGNwLiIgKyBtSW50ZXJmYWNlTmFtZSArICIuZG5zMSIsCi0gICAgICAgICAgICAiZGhjcC4iICsgbUludGVyZmFjZU5hbWUgKyAiLmRuczIiCi0gICAgICAgIH07Ci0gICAgICAgIG1CYXR0ZXJ5U3RhdHMgPSBJQmF0dGVyeVN0YXRzLlN0dWIuYXNJbnRlcmZhY2UoU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgiYmF0dGVyeWluZm8iKSk7Ci0KKyAgICAgICAgbVdpZmlTdGF0ZVJlY2VpdmVyID0gbmV3IFdpZmlTdGF0ZVJlY2VpdmVyKCk7CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVdpZmlTdGF0ZVJlY2VpdmVyLCBmaWx0ZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2Q6IHNldHMgdGhlIHN1cHBsaWNhbnQgc3RhdGUgYW5kIGtlZXBzIHRoZSBuZXR3b3JrCi0gICAgICogaW5mbyB1cGRhdGVkLgotICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IHN0YXRlCisgICAgICogRGlzYWJsZSBjb25uZWN0aXZpdHkgdG8gYSBuZXR3b3JrCisgICAgICogVE9ETzogZG8gYXdheSB3aXRoIHJldHVybiB2YWx1ZSBhZnRlciBtYWtpbmcgTW9iaWxlRGF0YVN0YXRlVHJhY2tlciBhc3luYwogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRTdXBwbGljYW50U3RhdGUoU3VwcGxpY2FudFN0YXRlIHN0YXRlKSB7Ci0gICAgICAgIG1XaWZpSW5mby5zZXRTdXBwbGljYW50U3RhdGUoc3RhdGUpOwotICAgICAgICB1cGRhdGVOZXR3b3JrSW5mbygpOwotICAgICAgICBjaGVja1BvbGxUaW1lcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdXBwbGljYW50U3RhdGUgZ2V0U3VwcGxpY2FudFN0YXRlKCkgewotICAgICAgICByZXR1cm4gbVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpOworICAgIHB1YmxpYyBib29sZWFuIHRlYXJkb3duKCkgeworICAgICAgICBtVGVhcmRvd25SZXF1ZXN0ZWQuc2V0KHRydWUpOworICAgICAgICBtV2lmaU1hbmFnZXIuc3RvcFdpZmkoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZDogc2V0cyB0aGUgc3VwcGxpY2FudCBzdGF0ZSBhbmQga2VlcHMgdGhlIG5ldHdvcmsKLSAgICAgKiBpbmZvIHVwZGF0ZWQgKHN0cmluZyB2ZXJzaW9uKS4KLSAgICAgKiBAcGFyYW0gc3RhdGVOYW1lIHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgbmV3IHN0YXRlCisgICAgICogUmUtZW5hYmxlIGNvbm5lY3Rpdml0eSB0byBhIG5ldHdvcmsgYWZ0ZXIgYSB7QGxpbmsgI3RlYXJkb3duKCl9LgorICAgICAqIFRPRE86IGRvIGF3YXkgd2l0aCByZXR1cm4gdmFsdWUgYWZ0ZXIgbWFraW5nIE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIgYXN5bmMKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0U3VwcGxpY2FudFN0YXRlKFN0cmluZyBzdGF0ZU5hbWUpIHsKLSAgICAgICAgbVdpZmlJbmZvLnNldFN1cHBsaWNhbnRTdGF0ZShzdGF0ZU5hbWUpOwotICAgICAgICB1cGRhdGVOZXR3b3JrSW5mbygpOwotICAgICAgICBjaGVja1BvbGxUaW1lcigpOworICAgIHB1YmxpYyBib29sZWFuIHJlY29ubmVjdCgpIHsKKyAgICAgICAgbVRlYXJkb3duUmVxdWVzdGVkLnNldChmYWxzZSk7CisgICAgICAgIG1XaWZpTWFuYWdlci5zdGFydFdpZmkoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZDogc2V0cyB0aGUgYm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgdGhlIGNvbm5lY3Rpb24KLSAgICAgKiBtYW5hZ2VyIGFza2VkIHRoZSBuZXR3b3JrIHRvIGJlIHRvcm4gZG93biAoYW5kIHNvIG9ubHkgdGhlIGNvbm5lY3Rpb24KLSAgICAgKiBtYW5hZ2VyIGNhbiBzZXQgaXQgdXAgYWdhaW4pLgotICAgICAqIG5ldHdvcmsgaW5mbyB1cGRhdGVkLgotICAgICAqIEBwYXJhbSBmbGFnIHtAY29kZSB0cnVlfSBpZiBleHBsaWNpdGx5IGRpc2FibGVkLgorICAgICAqIFR1cm4gdGhlIHdpcmVsZXNzIHJhZGlvIG9mZiBmb3IgYSBuZXR3b3JrLgorICAgICAqIEBwYXJhbSB0dXJuT24ge0Bjb2RlIHRydWV9IHRvIHR1cm4gdGhlIHJhZGlvIG9uLCB7QGNvZGUgZmFsc2V9CisgICAgICogVE9ETzogZG8gYXdheSB3aXRoIHJldHVybiB2YWx1ZSBhZnRlciBtYWtpbmcgTW9iaWxlRGF0YVN0YXRlVHJhY2tlciBhc3luYwogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRUb3JuRG93bkJ5Q29ubk1ncihib29sZWFuIGZsYWcpIHsKLSAgICAgICAgbVRvcm5Eb3duQnlDb25uTWdyID0gZmxhZzsKLSAgICAgICAgdXBkYXRlTmV0d29ya0luZm8oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIElQIGFkZHJlc3NlcyBvZiB0aGUgRE5TIHNlcnZlcnMgYXZhaWxhYmxlIGZvciB0aGUgV0xBTgotICAgICAqIG5ldHdvcmsgaW50ZXJmYWNlLgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIEROUyBhZGRyZXNzZXMsIHdpdGggbm8gaG9sZXMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldE5hbWVTZXJ2ZXJzKCkgewotICAgICAgICByZXR1cm4gZ2V0TmFtZVNlcnZlckxpc3Qoc0Ruc1Byb3BOYW1lcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIG91ciBXTEFOIG5ldHdvcmsgaW50ZXJmYWNlLgotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2Ygb3VyIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtSW50ZXJmYWNlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0Y3AgYnVmZmVyIHNpemVzCi0gICAgICogZm9yIHRoaXMgbmV0d29yay4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRjcEJ1ZmZlclNpemVzUHJvcE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAibmV0LnRjcC5idWZmZXJzaXplLndpZmkiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZygpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IGEgaGFuZGxlIG9uIHRoZSBXaWZpTWFuYWdlci4gVGhpcyBjYW5ub3QgYmUgZG9uZSBpbiBvdXIKLSAgICAgICAgICogY29uc3RydWN0b3IsIGJlY2F1c2UgdGhlIFdpZmkgc2VydmljZSBpcyBub3QgeWV0IHJlZ2lzdGVyZWQuCi0gICAgICAgICAqLwotICAgICAgICBtV00gPSAoV2lmaU1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJRklfU0VSVklDRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFdmVudExvb3AoKSB7Ci0gICAgICAgIG1XaWZpTW9uaXRvci5zdGFydE1vbml0b3JpbmcoKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRSYWRpbyhib29sZWFuIHR1cm5PbikgeworICAgICAgICBtV2lmaU1hbmFnZXIuc2V0V2lmaUVuYWJsZWQodHVybk9uKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC00ODcsMjIwMSArMTMxLDEzNiBAQAogICAgICAqIHVuYXZhaWxhYmxlLgogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIFdpLUZpIGNvbm5lY3Rpb25zIGFyZSBwb3NzaWJsZQogICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogVE9ETzogTmVlZCB0byBhbHNvIGxvb2sgYXQgc2NhbiByZXN1bHRzIHRvIHNlZSB3aGV0aGVyIHdlJ3JlCi0gICAgICAgICAqIGluIHJhbmdlIG9mIGFueSBhY2Nlc3MgcG9pbnRzLiBJZiB3ZSBoYXZlIHNjYW4gcmVzdWx0cyB0aGF0Ci0gICAgICAgICAqIGFyZSBubyBtb3JlIHRoYW4gTiBzZWNvbmRzIG9sZCwgdXNlIHRob3NlLCBvdGhlcndpc2UsIGluaXRpYXRlCi0gICAgICAgICAqIGEgc2NhbiBhbmQgd2FpdCBmb3IgdGhlIHJlc3VsdHMuIFRoaXMgb25seSBtYXR0ZXJzIGlmIHdlCi0gICAgICAgICAqIGFsbG93IG1vYmlsZSB0byBiZSB0aGUgcHJlZmVycmVkIG5ldHdvcmsuCi0gICAgICAgICAqLwotICAgICAgICBTdXBwbGljYW50U3RhdGUgc3VwcFN0YXRlID0gbVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpOwotICAgICAgICByZXR1cm4gc3VwcFN0YXRlICE9IFN1cHBsaWNhbnRTdGF0ZS5VTklOSVRJQUxJWkVEICYmCi0gICAgICAgICAgICAgICAgc3VwcFN0YXRlICE9IFN1cHBsaWNhbnRTdGF0ZS5JTkFDVElWRSAmJgotICAgICAgICAgICAgICAgIChtVG9ybkRvd25CeUNvbm5NZ3IgfHwgIWlzRHJpdmVyU3RvcHBlZCgpKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1OZXR3b3JrSW5mby5pc0F2YWlsYWJsZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiBUaGVyZSBhcmUgY3VycmVudGx5IG5vIGRlZmluZWQgV2ktRmkgc3VidHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROZXR3b3JrU3VidHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZDogdXBkYXRlcyB0aGUgbmV0d29yayBpbmZvIG9iamVjdCB0byBrZWVwIGl0IGluIHN5bmMgd2l0aAotICAgICAqIHRoZSBXaS1GaSBzdGF0ZSB0cmFja2VyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVOZXR3b3JrSW5mbygpIHsKLSAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKGlzQXZhaWxhYmxlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcG9ydCB3aGV0aGVyIHRoZSBXaS1GaSBjb25uZWN0aW9uIGlzIGZ1bGx5IGNvbmZpZ3VyZWQgZm9yIGRhdGEuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAbGluayBTdXBwbGljYW50U3RhdGV9IGlzCi0gICAgICoge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlI0NPTVBMRVRFRCBDT01QTEVURUR9LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGlvbkNvbXBsZXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSA9PSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcG9ydCB3aGV0aGVyIHRoZSBXaS1GaSBjb25uZWN0aW9uIGhhcyBzdWNjZXNzZnVsbHkgYWNxdWlyZWQgYW4gSVAgYWRkcmVzcy4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgV2ktRmkgY29ubmVjdGlvbiBoYXMgYmVlbiBhc3NpZ25lZCBhbiBJUCBhZGRyZXNzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0lwQWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIG1IYXZlSXBBZGRyZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCBhIHVzZXItZW50ZXJlZCBwYXNzd29yZCBrZXkKLSAgICAgKiBtYXkgYmUgaW5jb3JyZWN0IChpLmUuLCBjYXVzZWQgYXV0aGVudGljYXRpb24gdG8gZmFpbCkuCi0gICAgICovCi0gICAgdm9pZCBub3RpZnlQYXNzd29yZEtleU1heUJlSW5jb3JyZWN0KCkgewotICAgICAgICBzZW5kRW1wdHlNZXNzYWdlKEVWRU5UX1BBU1NXT1JEX0tFWV9NQVlfQkVfSU5DT1JSRUNUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgYSBjb25uZWN0aW9uIHRvIHRoZSBzdXBwbGljYW50Ci0gICAgICogZGFlbW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLgotICAgICAqLwotICAgIHZvaWQgbm90aWZ5U3VwcGxpY2FudENvbm5lY3Rpb24oKSB7Ci0gICAgICAgIHNlbmRFbXB0eU1lc3NhZ2UoRVZFTlRfU1VQUExJQ0FOVF9DT05ORUNUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHN0YXRlIG9mIHRoZSBzdXBwbGljYW50Ci0gICAgICogaGFzIGNoYW5nZWQuCi0gICAgICogQHBhcmFtIG5ldHdvcmtJZCB0aGUgY29uZmlndXJlZCBuZXR3b3JrIG9uIHdoaWNoIHRoZSBzdGF0ZSBjaGFuZ2Ugb2NjdXJyZWQKLSAgICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyB7QGNvZGUgU3VwcGxpY2FudFN0YXRlfQotICAgICAqLwotICAgIHZvaWQgbm90aWZ5U3RhdGVDaGFuZ2UoaW50IG5ldHdvcmtJZCwgU3RyaW5nIEJTU0lELCBTdXBwbGljYW50U3RhdGUgbmV3U3RhdGUpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBNZXNzYWdlLm9idGFpbigKLSAgICAgICAgICAgIHRoaXMsIEVWRU5UX1NVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRCwKLSAgICAgICAgICAgIG5ldyBTdXBwbGljYW50U3RhdGVDaGFuZ2VSZXN1bHQobmV0d29ya0lkLCBCU1NJRCwgbmV3U3RhdGUpKTsKLSAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgc3RhdGUgb2YgV2lmaSBjb25uZWN0aXZpdHkKLSAgICAgKiBoYXMgY2hhbmdlZC4KLSAgICAgKiBAcGFyYW0gbmV0d29ya0lkIHRoZSBjb25maWd1cmVkIG5ldHdvcmsgb24gd2hpY2ggdGhlIHN0YXRlIGNoYW5nZSBvY2N1cnJlZAotICAgICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IG5ldHdvcmsgc3RhdGUKLSAgICAgKiBAcGFyYW0gQlNTSUQgd2hlbiB0aGUgbmV3IHN0YXRlIGlzIHtAbGluayBEZXRhaWxlZFN0YXRlI0NPTk5FQ1RFRAotICAgICAqIE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUuQ09OTkVDVEVEfSwKLSAgICAgKiB0aGlzIGlzIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgYWNjZXNzIHBvaW50LiBPdGhlcndpc2UsIGl0Ci0gICAgICogaXMge0Bjb2RlIG51bGx9LgotICAgICAqLwotICAgIHZvaWQgbm90aWZ5U3RhdGVDaGFuZ2UoRGV0YWlsZWRTdGF0ZSBuZXdTdGF0ZSwgU3RyaW5nIEJTU0lELCBpbnQgbmV0d29ya0lkKSB7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oCi0gICAgICAgICAgICB0aGlzLCBFVkVOVF9ORVRXT1JLX1NUQVRFX0NIQU5HRUQsCi0gICAgICAgICAgICBuZXcgTmV0d29ya1N0YXRlQ2hhbmdlUmVzdWx0KG5ld1N0YXRlLCBCU1NJRCwgbmV0d29ya0lkKSk7Ci0gICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgYSBzY2FuIGhhcyBjb21wbGV0ZWQsIGFuZCByZXN1bHRzCi0gICAgICogYXJlIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeVNjYW5SZXN1bHRzQXZhaWxhYmxlKCkgewotICAgICAgICAvLyByZXNldCB0aGUgc3VwcGxpY2FudCdzIGhhbmRsaW5nIG9mIHNjYW4gcmVzdWx0cyB0byAibm9ybWFsIiBtb2RlCi0gICAgICAgIHNldFNjYW5SZXN1bHRIYW5kbGluZyhTVVBQTF9TQ0FOX0hBTkRMSU5HX05PUk1BTCk7Ci0gICAgICAgIHNlbmRFbXB0eU1lc3NhZ2UoRVZFTlRfU0NBTl9SRVNVTFRTX0FWQUlMQUJMRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHdlIGNhbiBubyBsb25nZXIgY29tbXVuaWNhdGUgd2l0aAotICAgICAqIHRoZSBzdXBwbGljYW50IGRhZW1vbi4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeVN1cHBsaWNhbnRMb3N0KCkgewotICAgICAgICBzZW5kRW1wdHlNZXNzYWdlKEVWRU5UX1NVUFBMSUNBTlRfRElTQ09OTkVDVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBXaS1GaSBkcml2ZXIgaGFzIGJlZW4gc3RvcHBlZC4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeURyaXZlclN0b3BwZWQoKSB7Ci0gICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9TVE9QUEVEOwotCi0gICAgICAgIC8vIFNlbmQgYSBkcml2ZXIgc3RvcHBlZCBtZXNzYWdlIHRvIG91ciBoYW5kbGVyCi0gICAgICAgIE1lc3NhZ2Uub2J0YWluKHRoaXMsIEVWRU5UX0RSSVZFUl9TVEFURV9DSEFOR0VELCBEUklWRVJfU1RPUFBFRCwgMCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBXaS1GaSBkcml2ZXIgaGFzIGJlZW4gcmVzdGFydGVkIGFmdGVyCi0gICAgICogaGF2aW5nIGJlZW4gc3RvcHBlZC4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeURyaXZlclN0YXJ0ZWQoKSB7Ci0gICAgICAgIC8vIFNlbmQgYSBkcml2ZXIgc3RhcnRlZCBtZXNzYWdlIHRvIG91ciBoYW5kbGVyCi0gICAgICAgIE1lc3NhZ2Uub2J0YWluKHRoaXMsIEVWRU5UX0RSSVZFUl9TVEFURV9DSEFOR0VELCBEUklWRVJfU1RBUlRFRCwgMCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBXaS1GaSBkcml2ZXIgaGFzIGh1bmcgYW5kIG5lZWRzIHJlc3RhcnRpbmcuCi0gICAgICovCi0gICAgdm9pZCBub3RpZnlEcml2ZXJIdW5nKCkgewotICAgICAgICAvLyBTZW5kIGEgZHJpdmVyIGhhbmdlZCBtZXNzYWdlIHRvIG91ciBoYW5kbGVyCi0gICAgICAgIE1lc3NhZ2Uub2J0YWluKHRoaXMsIEVWRU5UX0RSSVZFUl9TVEFURV9DSEFOR0VELCBEUklWRVJfSFVORywgMCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpbnRlcnZhbCB0aW1lciBmb3IgcG9sbGluZyBjb25uZWN0aW9uIGluZm9ybWF0aW9uCi0gICAgICogdGhhdCBpcyBub3QgZGVsaXZlcmVkIGFzeW5jaHJvbm91c2x5LgotICAgICAqLwotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2hlY2tQb2xsVGltZXIoKSB7Ci0gICAgICAgIGlmIChtRW5hYmxlUnNzaVBvbGxpbmcgJiYKLSAgICAgICAgICAgICAgICBtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgPT0gU3VwcGxpY2FudFN0YXRlLkNPTVBMRVRFRCAmJgotICAgICAgICAgICAgICAgICFoYXNNZXNzYWdlcyhFVkVOVF9QT0xMX0lOVEVSVkFMKSkgewotICAgICAgICAgICAgc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoRVZFTlRfUE9MTF9JTlRFUlZBTCwgUE9MTF9TVEFUVVNfSU5URVJWQUxfTVNFQ1MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVE9ETzogbVJ1blN0YXRlIGlzIG5vdCBzeW5jaHJvbml6ZWQgaW4gc29tZSBwbGFjZXMKLSAgICAgKiBhZGRyZXNzIHRoaXMgYXMgcGFydCBvZiByZS1hcmNoaXRlY3QuCi0gICAgICoKLSAgICAgKiBUT0RPOiBXZSBhcmUgZXhwb3NpbmcgYW4gYWRkaXRpb25hbCBwdWJsaWMgc3luY2hyb25pemVkIGNhbGwKLSAgICAgKiBmb3IgYSB3YWtlbG9jayBvcHRpbWl6YXRpb24gaW4gV2lmaVNlcnZpY2UuIFJlbW92ZSBpdAotICAgICAqIHdoZW4gd2UgaGFuZGxlIHRoZSB3YWtlbG9jayBpbiBDb25uZWN0aXZpdHlTZXJ2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0RyaXZlclN0b3BwZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1NUT1BQRUQgfHwgbVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUElORzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVCYXR0ZXJ5V29ya1NvdXJjZUxvY2tlZChXb3JrU291cmNlIG5ld1NvdXJjZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG5ld1NvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVJ1bm5pbmdXaWZpVWlkcy5zZXQobmV3U291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1JVTk5JTkcpIHsKLSAgICAgICAgICAgICAgICBpZiAobVJlcG9ydGVkUnVubmluZykgewotICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgd29yayBzb3VyY2UgaGFzIGNoYW5nZWQgc2luY2UgbGFzdCB0aW1lLCBuZWVkCi0gICAgICAgICAgICAgICAgICAgIC8vIHRvIHJlbW92ZSBvbGQgd29yayBmcm9tIGJhdHRlcnkgc3RhdHMuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTGFzdFJ1bm5pbmdXaWZpVWlkcy5kaWZmKG1SdW5uaW5nV2lmaVVpZHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpUnVubmluZ0NoYW5nZWQobUxhc3RSdW5uaW5nV2lmaVVpZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SdW5uaW5nV2lmaVVpZHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RSdW5uaW5nV2lmaVVpZHMuc2V0KG1SdW5uaW5nV2lmaVVpZHMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTm93IGJlaW5nIHN0YXJ0ZWQsIHJlcG9ydCBpdC4KLSAgICAgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaVJ1bm5pbmcobVJ1bm5pbmdXaWZpVWlkcyk7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0UnVubmluZ1dpZmlVaWRzLnNldChtUnVubmluZ1dpZmlVaWRzKTsKLSAgICAgICAgICAgICAgICAgICAgbVJlcG9ydGVkUnVubmluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1NUT1BQRUQpIHsKLSAgICAgICAgICAgICAgICBpZiAobVJlcG9ydGVkUnVubmluZykgewotICAgICAgICAgICAgICAgICAgICAvLyBMYXN0IHJlcG9ydGVkIHdlIHdlcmUgcnVubmluZywgdGltZSB0byBzdG9wLgotICAgICAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpU3RvcHBlZChtTGFzdFJ1bm5pbmdXaWZpVWlkcyk7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0UnVubmluZ1dpZmlVaWRzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1SZXBvcnRlZFJ1bm5pbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFN0YXRlIGluIHRyYW5zaXRpb24gLS0gbm90aGluZyB0byB1cGRhdGUgeWV0LgotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHJ1biBzdGF0ZSB0byBlaXRoZXIgIm5vcm1hbCIgb3IgInNjYW4tb25seSIuCi0gICAgICogQHBhcmFtIHNjYW5Pbmx5TW9kZSB0cnVlIGlmIHRoZSBuZXcgbW9kZSBzaG91bGQgYmUgc2Nhbi1vbmx5LgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTY2FuT25seU1vZGUoYm9vbGVhbiBzY2FuT25seU1vZGUpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZyB1bmxlc3Mgc2Nhbi1vbmx5IG1vZGUgaXMgY2hhbmdpbmcKLSAgICAgICAgaWYgKG1Jc1NjYW5Pbmx5ICE9IHNjYW5Pbmx5TW9kZSkgewotICAgICAgICAgICAgaW50IHNjYW5UeXBlID0gKHNjYW5Pbmx5TW9kZSA/Ci0gICAgICAgICAgICAgICAgICAgIFNVUFBMX1NDQU5fSEFORExJTkdfTElTVF9PTkxZIDogU1VQUExfU0NBTl9IQU5ETElOR19OT1JNQUwpOwotICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIlNjYW4tb25seSBtb2RlIGNoYW5naW5nIHRvICIgKyBzY2FuT25seU1vZGUgKyAiIHNjYW5UeXBlPSIgKyBzY2FuVHlwZSk7Ci0gICAgICAgICAgICBpZiAoc2V0U2NhblJlc3VsdEhhbmRsaW5nKHNjYW5UeXBlKSkgewotICAgICAgICAgICAgICAgIG1Jc1NjYW5Pbmx5ID0gc2Nhbk9ubHlNb2RlOwotICAgICAgICAgICAgICAgIGlmICghaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjYW5Pbmx5TW9kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25uZWN0Q29tbWFuZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHN1c3BlbmQgbW9kZSBvcHRpbWl6YXRpb25zLiBUaGVzZSBpbmNsdWRlOgotICAgICAqIC0gcGFja2V0IGZpbHRlcmluZwotICAgICAqIC0gdHVybiBvZmYgcm9hbWluZwotICAgICAqIC0gRFRJTSBzZXR0aW5ncwotICAgICAqCi0gICAgICogVXNlcyByZWZlcmVuY2UgY291bnRpbmcgdG8ga2VlcCB0aGUgc3VzcGVuZCBvcHRpbWl6YXRpb25zIGRpc2FibGVkCi0gICAgICogYXMgbG9uZyBhcyBvbmUgZW50aXR5IHdhbnRzIG9wdGltaXphdGlvbnMgZGlzYWJsZWQuCi0gICAgICoKLSAgICAgKiBGb3IgZXhhbXBsZSwgV2lmaUxvY2sgY2FuIGtlZXAgc3VzcGVuZCBvcHRpbWl6YXRpb25zIGRpc2FibGVkCi0gICAgICogb3IgdGhlIHVzZXIgc2V0dGluZyAod2lmaSBuZXZlciBzbGVlcHMpIGNhbiBrZWVwIHN1c3BlbmQgb3B0aW1pemF0aW9ucwotICAgICAqIGRpc2FibGVkLiBBcyBsb25nIGFzIG9uZSBlbnRpdHkgd2FudHMgaXQgZGlzYWJsZWQsIGl0IHNob3VsZCBzdGF5Ci0gICAgICogdGhhdCB3YXkKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbmFibGVkIHRydWUgaWYgb3B0aW1pemF0aW9ucyBuZWVkIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTdXNwZW5kTW9kZU9wdGltaXphdGlvbnMoYm9vbGVhbiBlbmFibGVkKSB7Ci0KLSAgICAgICAgLyogSXQgaXMgZ29vZCB0byBwbHVtYiBzdXNwZW5kIG9wdGltaXphdGlvbiBlbmFibGUKLSAgICAgICAgICogb3IgZGlzYWJsZSBldmVuIGlmIHJlZiBjb3VudCBpbmRpY2F0ZXMgYWxyZWFkeSBkb25lCi0gICAgICAgICAqIHNpbmNlIHdlIGNvdWxkIGhhdmUgYSBjYXNlIG9mIHByZXZpb3VzIGZhaWx1cmUuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoIWVuYWJsZWQpIHsKLSAgICAgICAgICAgIG1PcHRpbWl6YXRpb25zRGlzYWJsZWRSZWZDb3VudCsrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU9wdGltaXphdGlvbnNEaXNhYmxlZFJlZkNvdW50LS07Ci0gICAgICAgICAgICBpZiAobU9wdGltaXphdGlvbnNEaXNhYmxlZFJlZkNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogS2VlcCByZWZjb3VudCBmcm9tIGJlY29taW5nIG5lZ2F0aXZlICovCi0gICAgICAgICAgICAgICAgbU9wdGltaXphdGlvbnNEaXNhYmxlZFJlZkNvdW50ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgV2lmaU5hdGl2ZS5zZXRTdXNwZW5kT3B0aW1pemF0aW9uc0NvbW1hbmQoZW5hYmxlZCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXQgaGlnaCBwZXJmb3JtYW5jZSBtb2RlIG9mIG9wZXJhdGlvbi4gVGhpcyB3b3VsZCBtZWFuCi0gICAgICogdXNlIGFjdGl2ZSBwb3dlciBtb2RlIGFuZCBkaXNhYmxlIHN1c3BlbmQgb3B0aW1pemF0aW9ucwotICAgICAqIEBwYXJhbSBlbmFibGVkIHRydWUgaWYgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEhpZ2hQZXJmTW9kZShib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgaWYgKG1Jc0hpZ2hQZXJmRW5hYmxlZCAhPSBlbmFibGVkKSB7Ci0gICAgICAgICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICAgICAgICAgIHNldFBvd2VyTW9kZShEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUpOwotICAgICAgICAgICAgICAgIHNldFN1c3BlbmRNb2RlT3B0aW1pemF0aW9ucyhmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldFBvd2VyTW9kZShEUklWRVJfUE9XRVJfTU9ERV9BVVRPKTsKLSAgICAgICAgICAgICAgICBzZXRTdXNwZW5kTW9kZU9wdGltaXphdGlvbnModHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSXNIaWdoUGVyZkVuYWJsZWQgPSBlbmFibGVkOwotICAgICAgICAgICAgTG9nLmQoVEFHLCJoaWdoIHBlcmZvcm1hbmNlIG1vZGU6ICIgKyBlbmFibGVkKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrSXNCbHVldG9vdGhQbGF5aW5nKCkgewotICAgICAgICBib29sZWFuIGlzQmx1ZXRvb3RoUGxheWluZyA9IGZhbHNlOwotICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBjb25uZWN0ZWQgPSBtQmx1ZXRvb3RoQTJkcC5nZXRDb25uZWN0ZWRTaW5rcygpOwotCi0gICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA6IGNvbm5lY3RlZCkgewotICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhBMmRwLmdldFNpbmtTdGF0ZShkZXZpY2UpID09IEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORykgewotICAgICAgICAgICAgICAgIGlzQmx1ZXRvb3RoUGxheWluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2V0Qmx1ZXRvb3RoU2Nhbk1vZGUoaXNCbHVldG9vdGhQbGF5aW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmFibGVSc3NpUG9sbGluZyhib29sZWFuIGVuYWJsZSkgewotICAgICAgICBpZiAobUVuYWJsZVJzc2lQb2xsaW5nICE9IGVuYWJsZSkgewotICAgICAgICAgICAgbUVuYWJsZVJzc2lQb2xsaW5nID0gZW5hYmxlOwotICAgICAgICAgICAgY2hlY2tQb2xsVGltZXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdlIHJlbGVhc2UgdGhlIHdha2Vsb2NrIGluIFdpZmlTZXJ2aWNlCi0gICAgICogdXNpbmcgYSB0aW1lci4KLSAgICAgKgotICAgICAqIFRPRE86Ci0gICAgICogUmVsZWFzaW5nIHdha2Vsb2NrIHVzaW5nIGJvdGggdGltZXIgYW5kCi0gICAgICogYSBjYWxsIGZyb20gQ29ubmVjdGl2aXR5U2VydmljZSByZXF1aXJlcwotICAgICAqIGEgcmV0aGluay4gV2UgaGFkIHByb2JsZW1zIHdoZXJlIFdpZmlTZXJ2aWNlCi0gICAgICogY291bGQga2VlcCBhIHdha2Vsb2NrIGZvcmV2ZXIgaWYgd2UgZGVsZXRlCi0gICAgICogbWVzc2FnZXMgaW4gdGhlIGFzeW5jaHJvbm91cyBjYWxsCi0gICAgICogZnJvbSBDb25uZWN0aXZpdHlTZXJ2aWNlCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZVdha2VMb2NrKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyYWNrcyB0aGUgV1BBIHN1cHBsaWNhbnQgc3RhdGVzIHRvIGRldGVjdCAibG9vcCIgc2l0dWF0aW9ucy4KLSAgICAgKiBAcGFyYW0gbmV3U3VwcGxpY2FudFN0YXRlIFRoZSBuZXcgV1BBIHN1cHBsaWNhbnQgc3RhdGUuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHN1cHBsaWNhbnQgbG9vcCBzaG91bGQgYmUgc3RvcHBlZAotICAgICAqIGFuZCB7QGNvZGUgZmFsc2V9IGlmIGl0IHNob3VsZCBjb250aW51ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTdXBwbGljYW50TG9vcGluZyhTdXBwbGljYW50U3RhdGUgbmV3U3VwcGxpY2FudFN0YXRlKSB7Ci0gICAgICAgIGlmIChTdXBwbGljYW50U3RhdGUuQVNTT0NJQVRJTkcub3JkaW5hbCgpIDw9IG5ld1N1cHBsaWNhbnRTdGF0ZS5vcmRpbmFsKCkKLSAgICAgICAgICAgICYmIG5ld1N1cHBsaWNhbnRTdGF0ZS5vcmRpbmFsKCkgPCBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVELm9yZGluYWwoKSkgewotICAgICAgICAgICAgaWYgKG1TdXBwbGljYW50TG9vcFN0YXRlICE9IG5ld1N1cHBsaWNhbnRTdGF0ZSkgewotICAgICAgICAgICAgICAgIGlmIChuZXdTdXBwbGljYW50U3RhdGUub3JkaW5hbCgpIDwgbVN1cHBsaWNhbnRMb29wU3RhdGUub3JkaW5hbCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICsrbU51bVN1cHBsaWNhbnRMb29wSXRlcmF0aW9uczsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtU3VwcGxpY2FudExvb3BTdGF0ZSA9IG5ld1N1cHBsaWNhbnRTdGF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChuZXdTdXBwbGljYW50U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkNPTVBMRVRFRCkgewotICAgICAgICAgICAgcmVzZXRTdXBwbGljYW50TG9vcFN0YXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbU51bVN1cHBsaWNhbnRMb29wSXRlcmF0aW9ucyA+PSBNQVhfU1VQUExJQ0FOVF9MT09QX0lURVJBVElPTlM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoZSBXUEEgc3VwcGxpY2FudCBsb29wIHN0YXRlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXNldFN1cHBsaWNhbnRMb29wU3RhdGUoKSB7Ci0gICAgICAgIG1OdW1TdXBwbGljYW50TG9vcEl0ZXJhdGlvbnMgPSAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgSW50ZW50IGludGVudDsKLQotICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICBjYXNlIEVWRU5UX1NVUFBMSUNBTlRfQ09OTkVDVElPTjoKLSAgICAgICAgICAgICAgICBtUnVuU3RhdGUgPSBSVU5fU1RBVEVfUlVOTklORzsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlQmF0dGVyeVdvcmtTb3VyY2VMb2NrZWQobnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNoZWNrVXNlU3RhdGljSXAoKTsKLSAgICAgICAgICAgICAgICAvKiBSZXNldCBub3RpZmljYXRpb24gc3RhdGUgb24gbmV3IGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgICAgICByZXNldE5vdGlmaWNhdGlvblRpbWVyKCk7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBESENQIHJlcXVlc3RzIGFyZSBibG9ja2luZywgc28gcnVuIHRoZW0gaW4gYSBzZXBhcmF0ZSB0aHJlYWQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgSGFuZGxlclRocmVhZCBkaGNwVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIkRIQ1AgSGFuZGxlciBUaHJlYWQiKTsKLSAgICAgICAgICAgICAgICBkaGNwVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgbURoY3BUYXJnZXQgPSBuZXcgRGhjcEhhbmRsZXIoZGhjcFRocmVhZC5nZXRMb29wZXIoKSwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgbUlzU2Nhbk1vZGVBY3RpdmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1Jc0hpZ2hQZXJmRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1PcHRpbWl6YXRpb25zRGlzYWJsZWRSZWZDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTW9kZVJlZkNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICBtVG9ybkRvd25CeUNvbm5NZ3IgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtTGFzdEJzc2lkID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtTGFzdFNzaWQgPSBudWxsOwotICAgICAgICAgICAgICAgIG1Jc0FueU5ldHdvcmtEaXNhYmxlZC5zZXQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHJlcXVlc3RDb25uZWN0aW9uSW5mbygpOwotICAgICAgICAgICAgICAgIFN1cHBsaWNhbnRTdGF0ZSBzdXBwbFN0YXRlID0gbVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoZSBNQUMgYWRkcmVzcyBpc24ndCBnb2luZyB0byBjaGFuZ2UsIHNvIGp1c3QgcmVxdWVzdCBpdAotICAgICAgICAgICAgICAgICAqIG9uY2UgaGVyZS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBTdHJpbmcgbWFjYWRkciA9IGdldE1hY0FkZHJlc3MoKTsKLQotICAgICAgICAgICAgICAgIGlmIChtYWNhZGRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldE1hY0FkZHJlc3MobWFjYWRkcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cudihUQUcsICJDb25uZWN0aW9uIHRvIHN1cHBsaWNhbnQgZXN0YWJsaXNoZWQsIHN0YXRlPSIgKwotICAgICAgICAgICAgICAgICAgICBzdXBwbFN0YXRlKTsKLSAgICAgICAgICAgICAgICAvLyBXaS1GaSBzdXBwbGljYW50IGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlZDoKLSAgICAgICAgICAgICAgICAvLyBbMzEtIDJdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCi0gICAgICAgICAgICAgICAgLy8gWyAxLSAwXSBDb25uZWN0ZWQgdG8gc3VwcGxpY2FudCAoMSksIGRpc2Nvbm5lY3RlZCBmcm9tIHN1cHBsaWNhbnQgKDApICwKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgIG9yIHN1cHBsaWNhbnQgZGllZCAoMikKLSAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1NVUFBMSUNBTlRfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VELCAxKTsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIFRoZSBDT01QTEVURUQgc3RhdGUgY2hhbmdlIGZyb20gdGhlIHN1cHBsaWNhbnQgbWF5IGhhdmUgb2NjdXJyZWQKLSAgICAgICAgICAgICAgICAgKiBpbiBiZXR3ZWVuIHBvbGxpbmcgZm9yIHN1cHBsaWNhbnQgYXZhaWxhYmlsaXR5LCBpbiB3aGljaCBjYXNlCi0gICAgICAgICAgICAgICAgICogd2UgZGlkbid0IHBlcmZvcm0gYSBESENQIHJlcXVlc3QgdG8gZ2V0IGFuIElQIGFkZHJlc3MuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKHN1cHBsU3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkNPTVBMRVRFRCkgewotICAgICAgICAgICAgICAgICAgICBtTGFzdEJzc2lkID0gbVdpZmlJbmZvLmdldEJTU0lEKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0U3NpZCA9IG1XaWZpSW5mby5nZXRTU0lEKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZUludGVyZmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmlzU3lzdGVtUmVhZHkoKSkgewotICAgICAgICAgICAgICAgICAgICBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfQ09OTkVDVElPTl9DSEFOR0VfQUNUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1NVUFBMSUNBTlRfQ09OTkVDVEVELCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3VwcGxTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEICYmIG1IYXZlSXBBZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoV2lmaUluZm8uZ2V0RGV0YWlsZWRTdGF0ZU9mKHN1cHBsU3RhdGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBGaWx0ZXIgb3V0IG11bHRpY2FzdCBwYWNrZXRzLiBUaGlzIHNhdmVzIGJhdHRlcnkgcG93ZXIsIHNpbmNlCi0gICAgICAgICAgICAgICAgICogdGhlIENQVSBkb2Vzbid0IGhhdmUgdG8gc3BlbmQgdGltZSBwcm9jZXNzaW5nIHBhY2tldHMgdGhhdAotICAgICAgICAgICAgICAgICAqIGFyZSBnb2luZyB0byBlbmQgdXAgYmVpbmcgdGhyb3duIGF3YXkuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgbVdNLmluaXRpYWxpemVNdWx0aWNhc3RGaWx0ZXJpbmcoKTsKLQotICAgICAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoQTJkcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhBMmRwID0gbmV3IEJsdWV0b290aEEyZHAobUNvbnRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjaGVja0lzQmx1ZXRvb3RoUGxheWluZygpOwotCi0gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGlzIGFmdGVyIHRoZSBzdXBwbGljYW50IGlzIGFsaXZlCi0gICAgICAgICAgICAgICAgc2V0TnVtQWxsb3dlZENoYW5uZWxzKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfU1VQUExJQ0FOVF9ESVNDT05ORUNUOgotICAgICAgICAgICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9TVE9QUEVEOwotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGVCYXR0ZXJ5V29ya1NvdXJjZUxvY2tlZChudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBkaWVkID0gbVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0RJU0FCTEVEICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0RJU0FCTElORzsKLSAgICAgICAgICAgICAgICBpZiAoZGllZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiU3VwcGxpY2FudCBkaWVkIHVuZXhwZWN0ZWRseSIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cudihUQUcsICJDb25uZWN0aW9uIHRvIHN1cHBsaWNhbnQgbG9zdCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBXaS1GaSBzdXBwbGljYW50IGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlZDoKLSAgICAgICAgICAgICAgICAvLyBbMzEtIDJdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCi0gICAgICAgICAgICAgICAgLy8gWyAxLSAwXSBDb25uZWN0ZWQgdG8gc3VwcGxpY2FudCAoMSksIGRpc2Nvbm5lY3RlZCBmcm9tIHN1cHBsaWNhbnQgKDApICwKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgIG9yIHN1cHBsaWNhbnQgZGllZCAoMikKLSAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1NVUFBMSUNBTlRfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VELCBkaWVkID8gMiA6IDApOwotICAgICAgICAgICAgICAgIGNsb3NlU3VwcGxpY2FudENvbm5lY3Rpb24oKTsKLQotICAgICAgICAgICAgICAgIGlmIChkaWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc2V0Q29ubmVjdGlvbnModHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFdoZW4gc3VwcGxpY2FudCBkaWVzLCBraWxsIHRoZSBESENQIHRocmVhZAotICAgICAgICAgICAgICAgIGlmIChtRGhjcFRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EaGNwVGFyZ2V0LmdldExvb3BlcigpLnF1aXQoKTsKLSAgICAgICAgICAgICAgICAgICAgbURoY3BUYXJnZXQgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ29udGV4dC5yZW1vdmVTdGlja3lCcm9hZGNhc3QobmV3IEludGVudChXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKSk7Ci0gICAgICAgICAgICAgICAgaWYgKEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5pc1N5c3RlbVJlYWR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5TVVBQTElDQU5UX0NPTk5FQ1RJT05fQ0hBTkdFX0FDVElPTik7Ci0gICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9TVVBQTElDQU5UX0NPTk5FQ1RFRCwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQpOwotICAgICAgICAgICAgICAgIHNldFN1cHBsaWNhbnRTdGF0ZShTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCk7Ci0gICAgICAgICAgICAgICAgbUhhdmVJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtT2J0YWluaW5nSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKGRpZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVdNLnNldFdpZmlFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfTUFZQkVfU1RBUlRfU0NBTl9QT1NUX0RJU0NPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgLy8gT25seSBkbyB0aGlzIGlmIHdlIGhhdmVuJ3QgZ290dGVuIGEgbmV3IHN1cHBsaWNhbnQgc3RhdHVzIHNpbmNlIHRoZSB0aW1lcgotICAgICAgICAgICAgICAgIC8vIHN0YXJ0ZWQKLSAgICAgICAgICAgICAgICBpZiAobU51bVN1cHBsaWNhbnRTdGF0ZUNoYW5nZXMgPT0gbXNnLmFyZzEpIHsKLSAgICAgICAgICAgICAgICAgICAgc2NhbihmYWxzZSk7IC8vIGRvIGEgcGFzc2l2ZSBzY2FuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX1NVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICBtTnVtU3VwcGxpY2FudFN0YXRlQ2hhbmdlcysrOwotICAgICAgICAgICAgICAgIFN1cHBsaWNhbnRTdGF0ZUNoYW5nZVJlc3VsdCBzdXBwbGljYW50U3RhdGVSZXN1bHQgPQotICAgICAgICAgICAgICAgICAgICAoU3VwcGxpY2FudFN0YXRlQ2hhbmdlUmVzdWx0KSBtc2cub2JqOwotICAgICAgICAgICAgICAgIFN1cHBsaWNhbnRTdGF0ZSBuZXdTdGF0ZSA9IHN1cHBsaWNhbnRTdGF0ZVJlc3VsdC5zdGF0ZTsKLSAgICAgICAgICAgICAgICBTdXBwbGljYW50U3RhdGUgY3VycmVudFN0YXRlID0gbVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpOwotCi0gICAgICAgICAgICAgICAgLy8gV2ktRmkgc3VwcGxpY2FudCBzdGF0ZSBjaGFuZ2VkOgotICAgICAgICAgICAgICAgIC8vIFszMS0gNl0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKLSAgICAgICAgICAgICAgICAvLyBbIDUtIDBdIFN1cHBsaWNhbnQgc3RhdGUgb3JkaW5hbCAoYXMgZGVmaW5lZCBieSBTdXBwbGljYW50U3RhdGUpCi0gICAgICAgICAgICAgICAgaW50IGV2ZW50TG9nUGFyYW0gPSAobmV3U3RhdGUub3JkaW5hbCgpICYgMHgzZik7Ci0gICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19TVVBQTElDQU5UX1NUQVRFX0NIQU5HRUQsIGV2ZW50TG9nUGFyYW0pOwotCi0gICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIkNoYW5naW5nIHN1cHBsaWNhbnQgc3RhdGU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjdXJyZW50U3RhdGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiID09PiAiICsgbmV3U3RhdGUpOwotCi0gICAgICAgICAgICAgICAgaW50IG5ldHdvcmtJZCA9IHN1cHBsaWNhbnRTdGF0ZVJlc3VsdC5uZXR3b3JrSWQ7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBUaGUgU3VwcGxpY2FudFN0YXRlIEJTU0lEIHZhbHVlIGlzIHZhbGlkIGluIEFTU09DSUFUSU5HIHN0YXRlIG9ubHkuCi0gICAgICAgICAgICAgICAgICogVGhlIE5ldHdvcmtTdGF0ZSBCU1NJRCB2YWx1ZSBjb21lcyB1cG9uIGEgc3VjY2Vzc2Z1bCBjb25uZWN0aW9uLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChzdXBwbGljYW50U3RhdGVSZXN1bHQuc3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkFTU09DSUFUSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0QnNzaWQgPSBzdXBwbGljYW50U3RhdGVSZXN1bHQuQlNTSUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogSWYgd2UgZ2V0IGRpc2Nvbm5lY3Qgb3IgaW5hY3RpdmUgd2UgbmVlZCB0byBzdGFydCBvdXIKLSAgICAgICAgICAgICAgICAgKiB3YXRjaGRvZyB0aW1lciB0byBzdGFydCBhIHNjYW4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkRJU0NPTk5FQ1RFRCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLklOQUNUSVZFKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChvYnRhaW5NZXNzYWdlKEVWRU5UX01BWUJFX1NUQVJUX1NDQU5fUE9TVF9ESVNDT05ORUNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1TdXBwbGljYW50U3RhdGVDaGFuZ2VzLCAwKSwgS0lDS1NUQVJUX1NDQU5OSU5HX0RFTEFZX01TRUNTKTsKLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogRGlkIHdlIGdldCB0byBESVNDT05ORUNURUQgc3RhdGUgZHVlIHRvIGFuCi0gICAgICAgICAgICAgICAgICogYXV0aGVudGljYXRpb24gKHBhc3N3b3JkKSBmYWlsdXJlPwotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZmFpbGVkVG9BdXRoZW50aWNhdGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkRJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBmYWlsZWRUb0F1dGhlbnRpY2F0ZSA9IG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBLZWVwIHRyYWNrIG9mIHRoZSBzdXBwbGljYW50IHN0YXRlIGFuZCBjaGVjayBpZiB3ZSBzaG91bGQKLSAgICAgICAgICAgICAgICAgKiBkaXNhYmxlIHRoZSBuZXR3b3JrCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBkaXNhYmxlZE5ldHdvcmsgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAoaXNTdXBwbGljYW50TG9vcGluZyhuZXdTdGF0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdG9wIFdQQSBzdXBwbGljYW50IGxvb3AgYW5kIGRpc2FibGUgbmV0d29yayIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkTmV0d29yayA9IHdpZmlNYW5hZ2VyRGlzYWJsZU5ldHdvcmsobmV0d29ya0lkKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZWROZXR3b3JrKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIFJlc2V0IHRoZSBsb29wIHN0YXRlIGlmIHdlIGRpc2FibGVkIHRoZSBuZXR3b3JrCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICByZXNldFN1cHBsaWNhbnRMb29wU3RhdGUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXRlICE9IGN1cnJlbnRTdGF0ZSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5ESVNDT05ORUNURUQgJiYgaXNEcml2ZXJTdG9wcGVkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFN1cHBsaWNhbnRTdGF0ZShuZXdTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuRE9STUFOVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgRGV0YWlsZWRTdGF0ZSBuZXdEZXRhaWxlZFN0YXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSByZWNvbm5lY3RNc2cgPSBvYnRhaW5NZXNzYWdlKEVWRU5UX0RFRkVSUkVEX1JFQ09OTkVDVCwgbUxhc3RCc3NpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUlzU2Nhbk9ubHkgfHwgbVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUElORykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RldGFpbGVkU3RhdGUgPSBEZXRhaWxlZFN0YXRlLklETEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RldGFpbGVkU3RhdGUgPSBEZXRhaWxlZFN0YXRlLkZBSUxFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURpc2Nvbm5lY3RlZFN0YXRlKG5ld0RldGFpbGVkU3RhdGUsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiB3ZSB3ZXJlIGFzc29jaWF0ZWQgd2l0aCBhIG5ldHdvcmsgKG5ldHdvcmtJZCAhPSAtMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBhc3N1bWUgd2UgcmVhY2hlZCB0aGlzIHN0YXRlIGJlY2F1c2Ugb2YgYSBmYWlsZWQgYXR0ZW1wdAotICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gYWNxdWlyZSBhbiBJUCBhZGRyZXNzLCBhbmQgYXR0ZW1wdCBhbm90aGVyIGNvbm5lY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBJUCBhZGRyZXNzIGFjcXVpc2l0aW9uIGluIFJFQ09OTkVDVF9ERUxBWV9NU0VDUwotICAgICAgICAgICAgICAgICAgICAgICAgICogbWlsbGlzZWNvbmRzLgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJ1blN0YXRlID09IFJVTl9TVEFURV9SVU5OSU5HICYmICFtSXNTY2FuT25seSAmJiBuZXR3b3JrSWQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQocmVjb25uZWN0TXNnLCBSRUNPTk5FQ1RfREVMQVlfTVNFQ1MpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1NUT1BQSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcERyaXZlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1NUQVJUSU5HICYmICFtSXNTY2FuT25seSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29ubmVjdENvbW1hbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSGF2ZUlwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRHJpdmVyU3RvcHBlZCgpIHx8IG1EaXNjb25uZWN0RXhwZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEaXNjb25uZWN0ZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkRJU0NPTk5FQ1RFRCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlRGlzY29ubmVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXRlICE9IFN1cHBsaWNhbnRTdGF0ZS5DT01QTEVURUQgJiYgIW1EaXNjb25uZWN0UGVuZGluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBJZ25vcmUgZXZlbnRzIHRoYXQgZG9uJ3QgY2hhbmdlIHRoZSBjb25uZWN0aXZpdHkgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBzdWNoIGFzIFdQQSByZWtleWluZyBvcGVyYXRpb25zLgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShjdXJyZW50U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkNPTVBMRVRFRCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXdTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuQVNTT0NJQVRJTkcgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkFTU09DSUFURUQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkZPVVJfV0FZX0hBTkRTSEFLRSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuR1JPVVBfSEFORFNIQUtFKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKFdpZmlJbmZvLmdldERldGFpbGVkU3RhdGVPZihuZXdTdGF0ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbURpc2Nvbm5lY3RFeHBlY3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOwotICAgICAgICAgICAgICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19SRUNFSVZFUl9SRVBMQUNFX1BFTkRJTkcpOwotICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfTkVXX1NUQVRFLCAoUGFyY2VsYWJsZSluZXdTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmYWlsZWRUb0F1dGhlbnRpY2F0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy5kKFRBRywgIkZhaWxlZCB0byBhdXRoZW50aWNhdGUsIGRpc2FibGluZyBuZXR3b3JrICIgKyBuZXR3b3JrSWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgd2lmaU1hbmFnZXJEaXNhYmxlTmV0d29yayhuZXR3b3JrSWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLkVYVFJBX1NVUFBMSUNBTlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVJST1JfQVVUSEVOVElDQVRJTkcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfTkVUV09SS19TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogRWFjaCBDT05ORUNUIG9yIERJU0NPTk5FQ1QgZ2VuZXJhdGVzIGEgcGFpciBvZiBldmVudHMuCi0gICAgICAgICAgICAgICAgICogT25lIGlzIGEgc3VwcGxpY2FudCBzdGF0ZSBjaGFuZ2UgZXZlbnQsIGFuZCB0aGUgb3RoZXIKLSAgICAgICAgICAgICAgICAgKiBpcyBhIG5ldHdvcmsgc3RhdGUgY2hhbmdlIGV2ZW50LiBGb3IgY29ubmVjdHMsIHRoZQotICAgICAgICAgICAgICAgICAqIHN1cHBsaWNhbnQgZXZlbnQgYWx3YXlzIGFycml2ZXMgZmlyc3QsIGZvbGxvd2VkIGJ5Ci0gICAgICAgICAgICAgICAgICogdGhlIG5ldHdvcmsgc3RhdGUgY2hhbmdlIGV2ZW50LiBPbmx5IHRoZSBsYXR0ZXIgZXZlbnQKLSAgICAgICAgICAgICAgICAgKiBoYXMgdGhlIEJTU0lELCB3aGljaCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBjYXB0dXJpbmcuCi0gICAgICAgICAgICAgICAgICogRm9yIGRpc2Nvbm5lY3RzLCB0aGUgb3JkZXIgaXMgdGhlIG9wcG9zaXRlIC0tIHRoZQotICAgICAgICAgICAgICAgICAqIG5ldHdvcmsgc3RhdGUgY2hhbmdlIGV2ZW50IGNvbWVzIGZpcnN0LCBmb2xsb3dlZCBieQotICAgICAgICAgICAgICAgICAqIHRoZSBzdXBwbGljYW50IHN0YXRlIGNoYW5nZSBldmVudC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBOZXR3b3JrU3RhdGVDaGFuZ2VSZXN1bHQgcmVzdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgKE5ldHdvcmtTdGF0ZUNoYW5nZVJlc3VsdCkgbXNnLm9iajsKLQotICAgICAgICAgICAgICAgIC8vIFdpLUZpIG5ldHdvcmsgc3RhdGUgY2hhbmdlZDoKLSAgICAgICAgICAgICAgICAvLyBbMzEtIDZdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCi0gICAgICAgICAgICAgICAgLy8gWyA1LSAwXSBEZXRhaWxlZCBzdGF0ZSBvcmRpbmFsIChhcyBkZWZpbmVkIGJ5IE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUpICAgCi0gICAgICAgICAgICAgICAgZXZlbnRMb2dQYXJhbSA9IChyZXN1bHQuc3RhdGUub3JkaW5hbCgpICYgMHgzZik7Ci0gICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19ORVRXT1JLX1NUQVRFX0NIQU5HRUQsIGV2ZW50TG9nUGFyYW0pOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cudihUQUcsICJOZXcgbmV0d29yayBzdGF0ZSBpcyAiICsgcmVzdWx0LnN0YXRlKTsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIElmIHdlJ3JlIGluIHNjYW4tb25seSBtb2RlLCBkb24ndCBhZHZhbmNlIHRoZSBzdGF0ZSBtYWNoaW5lLCBhbmQKLSAgICAgICAgICAgICAgICAgKiBkb24ndCByZXBvcnQgdGhlIHN0YXRlIGNoYW5nZSB0byBjbGllbnRzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChtSXNTY2FuT25seSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiRHJvcHBpbmcgZXZlbnQgaW4gc2Nhbi1vbmx5IG1vZGUiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdGUgIT0gRGV0YWlsZWRTdGF0ZS5TQ0FOTklORykgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBSZXNldCB0aGUgc2NhbiBjb3VudCBzaW5jZSB0aGVyZSB3YXMgYSBuZXR3b3JrIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAqIGNoYW5nZS4gVGhpcyBjb3VsZCBiZSBmcm9tIHN1cHBsaWNhbnQgdHJ5aW5nIHRvIGFzc29jaWF0ZQotICAgICAgICAgICAgICAgICAgICAgKiB3aXRoIGEgbmV0d29yay4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIG1OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBJZiB0aGUgc3VwcGxpY2FudCBzZW50IHVzIGEgQ09OTkVDVEVEIGV2ZW50LCB3ZSBkb24ndAotICAgICAgICAgICAgICAgICAqIHdhbnQgdG8gc2VuZCBvdXQgYW4gaW5kaWNhdGlvbiBvZiBvdmVyYWxsIG5ldHdvcmsKLSAgICAgICAgICAgICAgICAgKiBjb25uZWN0aXZpdHkgdW50aWwgd2UgaGF2ZSBvdXIgSVAgYWRkcmVzcy4gSWYgdGhlCi0gICAgICAgICAgICAgICAgICogc3VwcGxpY2FudCBzZW50IHVzIGEgRElTQ09OTkVDVEVEIGV2ZW50LCB3ZSBkZWxheQotICAgICAgICAgICAgICAgICAqIHNlbmRpbmcgYSBub3RpZmljYXRpb24gaW4gY2FzZSBhIHJlY29ubmVjdGlvbiB0bwotICAgICAgICAgICAgICAgICAqIHRoZSBzYW1lIGFjY2VzcyBwb2ludCBvY2N1cnMgd2l0aGluIGEgc2hvcnQgdGltZS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXRlID09IERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgIT0gU3VwcGxpY2FudFN0YXRlLkRPUk1BTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlRGlzY29ubmVjdCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXF1ZXN0Q29ubmVjdGlvblN0YXR1cyhtV2lmaUluZm8pOwotICAgICAgICAgICAgICAgIGlmICghKHJlc3VsdC5zdGF0ZSA9PSBEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKCFtSGF2ZUlwQWRkcmVzcyB8fCBtRGlzY29ubmVjdFBlbmRpbmcpKSkgewotICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKHJlc3VsdC5zdGF0ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0ZSA9PSBEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBSZW1vdmUgdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbiB3aGVuIHdlCi0gICAgICAgICAgICAgICAgICAgICAqIHN1Y2Nlc3NmdWxseSBjb25uZWN0IHRvIGEgbmV0d29yay4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvblZpc2libGUoZmFsc2UsIDAsIGZhbHNlLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB3YXNEaXNjb25uZWN0UGVuZGluZyA9IG1EaXNjb25uZWN0UGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgY2FuY2VsRGlzY29ubmVjdCgpOwotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBUaGUgY29ubmVjdGlvbiBpcyBmdWxseSBjb25maWd1cmVkIGFzIGZhciBhcyBsaW5rLWxldmVsCi0gICAgICAgICAgICAgICAgICAgICAqIGNvbm5lY3Rpdml0eSBpcyBjb25jZXJuZWQsIGJ1dCB3ZSBtYXkgc3RpbGwgbmVlZCB0byBvYnRhaW4KLSAgICAgICAgICAgICAgICAgICAgICogYW4gSVAgYWRkcmVzcy4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGlmICh3YXNEaXNjb25uZWN0UGVuZGluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgRGV0YWlsZWRTdGF0ZSBzYXZlU3RhdGUgPSBnZXROZXR3b3JrSW5mbygpLmdldERldGFpbGVkU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURpc2Nvbm5lY3RlZFN0YXRlKERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVELCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlSW50ZXJuYWwoc2F2ZVN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZUludGVyZmFjZSgpOwotICAgICAgICAgICAgICAgICAgICBtTGFzdEJzc2lkID0gcmVzdWx0LkJTU0lEOwotICAgICAgICAgICAgICAgICAgICBtTGFzdFNzaWQgPSBtV2lmaUluZm8uZ2V0U1NJRCgpOwotICAgICAgICAgICAgICAgICAgICBtTGFzdE5ldHdvcmtJZCA9IHJlc3VsdC5uZXR3b3JrSWQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtSGF2ZUlwQWRkcmVzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuT0JUQUlOSU5HX0lQQUREUik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChtV2lmaUluZm8uZ2V0QlNTSUQoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfU0NBTl9SRVNVTFRTX0FWQUlMQUJMRToKLSAgICAgICAgICAgICAgICBpZiAoQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmlzU3lzdGVtUmVhZHkoKSkgewotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuU0NBTl9SRVNVTFRTX0FWQUlMQUJMRV9BQ1RJT04pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZFNjYW5SZXN1bHRzQXZhaWxhYmxlKCk7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogT24gcmVjZWl2aW5nIHRoZSBmaXJzdCBzY2FuIHJlc3VsdHMgYWZ0ZXIgY29ubmVjdGluZyB0bwotICAgICAgICAgICAgICAgICAqIHRoZSBzdXBwbGljYW50LCBzd2l0Y2ggc2NhbiBtb2RlIG92ZXIgdG8gcGFzc2l2ZS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBzZXRTY2FuTW9kZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfUE9MTF9JTlRFUlZBTDoKLSAgICAgICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpICE9IFN1cHBsaWNhbnRTdGF0ZS5VTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQb2xsZWRJbmZvKG1XaWZpSW5mbywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrUG9sbFRpbWVyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIEVWRU5UX0RFRkVSUkVEX0RJU0NPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgaWYgKG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSAhPSBTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVEaXNjb25uZWN0ZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkRJU0NPTk5FQ1RFRCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX0RFRkVSUkVEX1JFQ09OTkVDVDoKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBtTGFzdEJzc2lkIGNhbiBiZSBudWxsIHdoZW4gdGhlcmUgaXMgYSByZWNvbm5lY3QKLSAgICAgICAgICAgICAgICAgKiByZXF1ZXN0IG9uIHRoZSBmaXJzdCBCU1NJRCB3ZSBjb25uZWN0IHRvCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgU3RyaW5nIEJTU0lEID0gKG1zZy5vYmogIT0gbnVsbCkgPyBtc2cub2JqLnRvU3RyaW5nKCkgOiBudWxsOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIElmIHdlJ3ZlIGV4Y2VlZGVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGZvciByZWNvbm5lY3RpbmcKLSAgICAgICAgICAgICAgICAgKiB0byBhIGdpdmVuIG5ldHdvcmssIGRpc2FibGUgdGhlIG5ldHdvcmsKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpICE9IFN1cHBsaWNhbnRTdGF0ZS5VTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgrK21SZWNvbm5lY3RDb3VudCA+IGdldE1heERoY3BSZXRyaWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmFpbGVkIHJlY29ubmVjdCBjb3VudDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVjb25uZWN0Q291bnQgKyAiIERpc2FibGluZyAiICsgQlNTSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVdNLmRpc2FibGVOZXR3b3JrKG1MYXN0TmV0d29ya0lkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZWNvbm5lY3RDb21tYW5kKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX1NVQ0NFRURFRDoKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBTaW5jZSB0aGlzIGV2ZW50IGlzIHNlbnQgZnJvbSBhbm90aGVyIHRocmVhZCwgaXQgbWlnaHQgaGF2ZSBiZWVuCi0gICAgICAgICAgICAgICAgICogc2VudCBhZnRlciB3ZSBjbG9zZWQgb3VyIGNvbm5lY3Rpb24gdG8gdGhlIHN1cHBsaWNhbnQgaW4gdGhlIGNvdXJzZQotICAgICAgICAgICAgICAgICAqIG9mIGRpc2FibGluZyBXaS1GaS4gSW4gdGhhdCBjYXNlLCB3ZSBzaG91bGQganVzdCBpZ25vcmUgdGhlIGV2ZW50LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgPT0gU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1SZWNvbm5lY3RDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgbUhhdmVJcEFkZHJlc3MgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1PYnRhaW5pbmdJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtV2lmaUluZm8uc2V0SXBBZGRyZXNzKG1EaGNwSW5mby5pcEFkZHJlc3MpOwotICAgICAgICAgICAgICAgIG1MYXN0U2lnbmFsTGV2ZWwgPSAtMTsgLy8gZm9yY2UgdXBkYXRlIG9mIHNpZ25hbCBzdHJlbmd0aAotICAgICAgICAgICAgICAgIGlmIChtTmV0d29ya0luZm8uZ2V0RGV0YWlsZWRTdGF0ZSgpICE9IERldGFpbGVkU3RhdGUuQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICAgICAgICAgICAgICBzZW5kTmV0d29ya1N0YXRlQ2hhbmdlQnJvYWRjYXN0KG1XaWZpSW5mby5nZXRCU1NJRCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtc2cgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoRVZFTlRfQ09ORklHVVJBVElPTl9DSEFOR0VELCBtTmV0d29ya0luZm8pOwotICAgICAgICAgICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cudihUQUcsICJJUCBjb25maWd1cmF0aW9uOiAiICsgbURoY3BJbmZvKTsKLSAgICAgICAgICAgICAgICAvLyBXaS1GaSBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBzdGF0ZSBjaGFuZ2VkOgotICAgICAgICAgICAgICAgIC8vIFszMS0gMV0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKLSAgICAgICAgICAgICAgICAvLyBbIDAtIDBdIEludGVyZmFjZSBjb25maWd1cmF0aW9uIHN1Y2NlZWRlZCAoMSkgb3IgZmFpbGVkICgwKSAgIAotICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fU1RBVEVfQ0hBTkdFRCwgMSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBXZSd2ZSBjb25uZWN0ZWQgc3VjY2Vzc2Z1bGx5LCBzbyBhbGxvdyB0aGUgbm90aWZpY2F0aW9uIGFnYWluIGluIHRoZSBmdXR1cmUKLSAgICAgICAgICAgICAgICByZXNldE5vdGlmaWNhdGlvblRpbWVyKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fRkFJTEVEOgotICAgICAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgIT0gU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2ktRmkgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gc3RhdGUgY2hhbmdlZDoKLSAgICAgICAgICAgICAgICAgICAgLy8gWzMxLSAxXSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQotICAgICAgICAgICAgICAgICAgICAvLyBbIDAtIDBdIEludGVyZmFjZSBjb25maWd1cmF0aW9uIHN1Y2NlZWRlZCAoMSkgb3IgZmFpbGVkICgwKQotICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX1NUQVRFX0NIQU5HRUQsIDApOwotICAgICAgICAgICAgICAgICAgICBtSGF2ZUlwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtV2lmaUluZm8uc2V0SXBBZGRyZXNzKDApOwotICAgICAgICAgICAgICAgICAgICBtT2J0YWluaW5nSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfRFJJVkVSX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgLy8gV2ktRmkgZHJpdmVyIHN0YXRlIGNoYW5nZWQ6Ci0gICAgICAgICAgICAgICAgLy8gMCBTVEFSVEVECi0gICAgICAgICAgICAgICAgLy8gMSBTVE9QUEVECi0gICAgICAgICAgICAgICAgLy8gMiBIVU5HCi0gICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19EUklWRVJfU1RBVEVfQ0hBTkdFRCwgbXNnLmFyZzEpOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChtc2cuYXJnMSkgewotICAgICAgICAgICAgICAgIGNhc2UgRFJJVkVSX1NUQVJURUQ6Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIG51bWJlciBvZiBhbGxvd2VkIHJhZGlvIGNoYW5uZWxzIGFjY29yZGluZwotICAgICAgICAgICAgICAgICAgICAgKiB0byB0aGUgc3lzdGVtIHNldHRpbmcsIHNpbmNlIGl0IGdldHMgcmVzZXQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAqIGRyaXZlciB1cG9uIGNoYW5naW5nIHRvIHRoZSBTVEFSVEVEIHN0YXRlLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgc2V0TnVtQWxsb3dlZENoYW5uZWxzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RBUlRJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnVuU3RhdGUgPSBSVU5fU1RBVEVfUlVOTklORzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1Jc1NjYW5Pbmx5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29ubmVjdENvbW1hbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBzb21lIHNpdHVhdGlvbnMsIHN1cHBsaWNhbnQgbmVlZHMgdG8gYmUga2lja3N0YXJ0ZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnQgdGhlIGJhY2tncm91bmQgc2Nhbm5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbih0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBEUklWRVJfSFVORzoKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiV2lmaSBEcml2ZXIgcmVwb3J0cyBIVU5HIC0gcmVsb2FkaW5nLiIpOwotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogcmVzdGFydCB0aGUgZHJpdmVyIC0gdG9nZ2xlIG9mZiBhbmQgb24KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIG1XTS5zZXRXaWZpRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1XTS5zZXRXaWZpRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGVCYXR0ZXJ5V29ya1NvdXJjZUxvY2tlZChudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfUEFTU1dPUkRfS0VZX01BWV9CRV9JTkNPUlJFQ1Q6Ci0gICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHdpZmlNYW5hZ2VyRGlzYWJsZU5ldHdvcmsoaW50IG5ldHdvcmtJZCkgewotICAgICAgICBib29sZWFuIGRpc2FibGVkTmV0d29yayA9IGZhbHNlOwotICAgICAgICBpZiAoMCA8PSBuZXR3b3JrSWQpIHsKLSAgICAgICAgICAgIGRpc2FibGVkTmV0d29yayA9IG1XTS5kaXNhYmxlTmV0d29yayhuZXR3b3JrSWQpOwotICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZWROZXR3b3JrKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkRpc2FibGVkIG5ldHdvcms6ICIgKyBuZXR3b3JrSWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoTE9DQUxfTE9HRCkgewotICAgICAgICAgICAgaWYgKCFkaXNhYmxlZE5ldHdvcmspIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gZGlzYWJsZSBuZXR3b3JrOiIgKwotICAgICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBuZXR3b3JrIGlkOiAiICsgbmV0d29ya0lkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGlzYWJsZWROZXR3b3JrOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb25maWd1cmVJbnRlcmZhY2UoKSB7Ci0gICAgICAgIGNoZWNrUG9sbFRpbWVyKCk7Ci0gICAgICAgIG1MYXN0U2lnbmFsTGV2ZWwgPSAtMTsKLSAgICAgICAgaWYgKCFtVXNlU3RhdGljSXApIHsKLSAgICAgICAgICAgIGlmICghbUhhdmVJcEFkZHJlc3MgJiYgIW1PYnRhaW5pbmdJcEFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICBtT2J0YWluaW5nSXBBZGRyZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtRGhjcFRhcmdldC5zZW5kRW1wdHlNZXNzYWdlKEVWRU5UX0RIQ1BfU1RBUlQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgaWYgKE5ldHdvcmtVdGlscy5jb25maWd1cmVJbnRlcmZhY2UobUludGVyZmFjZU5hbWUsIG1EaGNwSW5mbykpIHsKLSAgICAgICAgICAgICAgICBtSGF2ZUlwQWRkcmVzcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZXZlbnQgPSBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVUNDRUVERUQ7Ci0gICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIlN0YXRpYyBJUCBjb25maWd1cmF0aW9uIHN1Y2NlZWRlZCIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtSGF2ZUlwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGV2ZW50ID0gRVZFTlRfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fRkFJTEVEOwotICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cudihUQUcsICJTdGF0aWMgSVAgY29uZmlndXJhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlbmRFbXB0eU1lc3NhZ2UoZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXQgb3VyIElQIHN0YXRlIGFuZCBzZW5kIG91dCBicm9hZGNhc3RzIGZvbGxvd2luZyBhIGRpc2Nvbm5lY3QuCi0gICAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSB7QGNvZGUgRGV0YWlsZWRTdGF0ZX0gdG8gc2V0LiBTaG91bGQgYmUgZWl0aGVyCi0gICAgICoge0Bjb2RlIERJU0NPTk5FQ1RFRH0gb3Ige0Bjb2RlIEZBSUxFRH0uCi0gICAgICogQHBhcmFtIGRpc2FibGVJbnRlcmZhY2UgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGludGVyZmFjZSBzaG91bGQKLSAgICAgKiBiZSBkaXNhYmxlZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVEaXNjb25uZWN0ZWRTdGF0ZShEZXRhaWxlZFN0YXRlIG5ld1N0YXRlLCBib29sZWFuIGRpc2FibGVJbnRlcmZhY2UpIHsKLSAgICAgICAgaWYgKG1EaXNjb25uZWN0UGVuZGluZykgewotICAgICAgICAgICAgY2FuY2VsRGlzY29ubmVjdCgpOwotICAgICAgICB9Ci0gICAgICAgIG1EaXNjb25uZWN0RXhwZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgcmVzZXRDb25uZWN0aW9ucyhkaXNhYmxlSW50ZXJmYWNlKTsKLSAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShuZXdTdGF0ZSk7Ci0gICAgICAgIHNlbmROZXR3b3JrU3RhdGVDaGFuZ2VCcm9hZGNhc3QobUxhc3RCc3NpZCk7Ci0gICAgICAgIG1XaWZpSW5mby5zZXRCU1NJRChudWxsKTsKLSAgICAgICAgbUxhc3RCc3NpZCA9IG51bGw7Ci0gICAgICAgIG1MYXN0U3NpZCA9IG51bGw7Ci0gICAgICAgIG1EaXNjb25uZWN0UGVuZGluZyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc2V0cyB0aGUgV2ktRmkgQ29ubmVjdGlvbnMgYnkgY2xlYXJpbmcgYW55IHN0YXRlLCByZXNldHRpbmcgYW55IHNvY2tldHMKLSAgICAgKiB1c2luZyB0aGUgaW50ZXJmYWNlLCBzdG9wcGluZyBESENQLCBhbmQgZGlzYWJsaW5nIHRoZSBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXRDb25uZWN0aW9ucyhib29sZWFuIGRpc2FibGVJbnRlcmZhY2UpIHsKLSAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy5kKFRBRywgIlJlc2V0IGNvbm5lY3Rpb25zIGFuZCBzdG9wcGluZyBESENQIik7Ci0gICAgICAgIG1IYXZlSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgIG1PYnRhaW5pbmdJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgbVdpZmlJbmZvLnNldElwQWRkcmVzcygwKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBSZXNldCBjb25uZWN0aW9uIGRlcGVuZHMgb24gYm90aCB0aGUgaW50ZXJmYWNlIGFuZCB0aGUgSVAgYXNzaWduZWQsCi0gICAgICAgICAqIHNvIGl0IHNob3VsZCBiZSBkb25lIGJlZm9yZSBhbnkgY2hhbmNlIG9mIHRoZSBJUCBiZWluZyBsb3N0LgotICAgICAgICAgKi8KLSAgICAgICAgTmV0d29ya1V0aWxzLnJlc2V0Q29ubmVjdGlvbnMobUludGVyZmFjZU5hbWUpOwotCi0gICAgICAgIC8vIFN0b3AgREhDUAotICAgICAgICBpZiAobURoY3BUYXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgbURoY3BUYXJnZXQuc2V0Q2FuY2VsQ2FsbGJhY2sodHJ1ZSk7Ci0gICAgICAgICAgICBtRGhjcFRhcmdldC5yZW1vdmVNZXNzYWdlcyhFVkVOVF9ESENQX1NUQVJUKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIU5ldHdvcmtVdGlscy5zdG9wRGhjcChtSW50ZXJmYWNlTmFtZSkpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBzdG9wIERIQ1AiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJbnRlcmZhY2UgaXMgcmUtZW5hYmxlZCBpbiB0aGUgc3VwcGxpY2FudAotICAgICAgICAgKiB3aGVuIG1vdmluZyBvdXQgb2YgQVNTT0NJQVRJTkcgc3RhdGUKLSAgICAgICAgICovCi0gICAgICAgIGlmKGRpc2FibGVJbnRlcmZhY2UpIHsKLSAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cuZChUQUcsICJEaXNhYmxpbmcgaW50ZXJmYWNlIik7Ci0gICAgICAgICAgICBOZXR3b3JrVXRpbHMuZGlzYWJsZUludGVyZmFjZShtSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc3VwcGxpY2FudCBpcyByZXBvcnRpbmcgdGhhdCB3ZSBhcmUgZGlzY29ubmVjdGVkIGZyb20gdGhlIGN1cnJlbnQKLSAgICAgKiBhY2Nlc3MgcG9pbnQuIE9mdGVuLCBob3dldmVyLCBhIGRpc2Nvbm5lY3Qgd2lsbCBiZSBmb2xsb3dlZCB2ZXJ5IHNob3J0bHkKLSAgICAgKiBieSBhIHJlY29ubmVjdCB0byB0aGUgc2FtZSBhY2Nlc3MgcG9pbnQuIFRoZXJlZm9yZSwgd2UgZGVsYXkgcmVzZXR0aW5nCi0gICAgICogdGhlIGNvbm5lY3Rpb24ncyBJUCBzdGF0ZSBmb3IgYSBiaXQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNjaGVkdWxlRGlzY29ubmVjdCgpIHsKLSAgICAgICAgbURpc2Nvbm5lY3RQZW5kaW5nID0gdHJ1ZTsKLSAgICAgICAgaWYgKCFoYXNNZXNzYWdlcyhFVkVOVF9ERUZFUlJFRF9ESVNDT05ORUNUKSkgewotICAgICAgICAgICAgc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoRVZFTlRfREVGRVJSRURfRElTQ09OTkVDVCwgRElTQ09OTkVDVF9ERUxBWV9NU0VDUyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2FuY2VsRGlzY29ubmVjdCgpIHsKLSAgICAgICAgbURpc2Nvbm5lY3RQZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgIHJlbW92ZU1lc3NhZ2VzKEVWRU5UX0RFRkVSUkVEX0RJU0NPTk5FQ1QpOwotICAgIH0KLQotICAgIHB1YmxpYyBEaGNwSW5mbyBnZXREaGNwSW5mbygpIHsKLSAgICAgICAgcmV0dXJuIG1EaGNwSW5mbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8U2NhblJlc3VsdD4gZ2V0U2NhblJlc3VsdHNMaXN0KCkgewotICAgICAgICByZXR1cm4gbVNjYW5SZXN1bHRzOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTY2FuUmVzdWx0c0xpc3QoTGlzdDxTY2FuUmVzdWx0PiBzY2FuTGlzdCkgewotICAgICAgICBtU2NhblJlc3VsdHMgPSBzY2FuTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgc3RhdHVzIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBjb25uZWN0aW9uLCBpZiBhbnkuCi0gICAgICogQHJldHVybiBhIHtAbGluayBXaWZpSW5mb30gb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgY29ubmVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBXaWZpSW5mbyByZXF1ZXN0Q29ubmVjdGlvbkluZm8oKSB7Ci0gICAgICAgIHJlcXVlc3RDb25uZWN0aW9uU3RhdHVzKG1XaWZpSW5mbyk7Ci0gICAgICAgIHJlcXVlc3RQb2xsZWRJbmZvKG1XaWZpSW5mbywgZmFsc2UpOwotICAgICAgICByZXR1cm4gbVdpZmlJbmZvOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZXF1ZXN0Q29ubmVjdGlvblN0YXR1cyhXaWZpSW5mbyBpbmZvKSB7Ci0gICAgICAgIFN0cmluZyByZXBseSA9IHN0YXR1cygpOwotICAgICAgICBpZiAocmVwbHkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFBhcnNlIHRoZSByZXBseSBmcm9tIHRoZSBzdXBwbGljYW50IHRvIHRoZSBzdGF0dXMgY29tbWFuZCwgYW5kIHVwZGF0ZQotICAgICAgICAgKiBsb2NhbCBzdGF0ZSBhY2NvcmRpbmdseS4gVGhlIHJlcGx5IGlzIGEgc2VyaWVzIG9mIGxpbmVzIG9mIHRoZSBmb3JtCi0gICAgICAgICAqICJuYW1lPXZhbHVlIi4KLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZyBTU0lEID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIEJTU0lEID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHN1cHBTdGF0ZSA9IG51bGw7Ci0gICAgICAgIGludCBuZXRJZCA9IC0xOwotICAgICAgICBTdHJpbmdbXSBsaW5lcyA9IHJlcGx5LnNwbGl0KCJcbiIpOwotICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogbGluZXMpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHByb3AgPSBsaW5lLnNwbGl0KCIgKj0gKiIsIDIpOwotICAgICAgICAgICAgaWYgKHByb3AubGVuZ3RoIDwgMikKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcHJvcFswXTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHByb3BbMV07Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJpZCIpKQotICAgICAgICAgICAgICAgIG5ldElkID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInNzaWQiKSkKLSAgICAgICAgICAgICAgICBTU0lEID0gdmFsdWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImJzc2lkIikpCi0gICAgICAgICAgICAgICAgQlNTSUQgPSB2YWx1ZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgid3BhX3N0YXRlIikpCi0gICAgICAgICAgICAgICAgc3VwcFN0YXRlID0gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW5mby5zZXROZXR3b3JrSWQobmV0SWQpOwotICAgICAgICBpbmZvLnNldFNTSUQoU1NJRCk7Ci0gICAgICAgIGluZm8uc2V0QlNTSUQoQlNTSUQpOwotICAgICAgICAvKgotICAgICAgICAgKiBXZSBvbmx5IHNldCB0aGUgc3VwcGxpY2FudCBzdGF0ZSBpZiB0aGUgcHJldmlvdXMgc3RhdGUgd2FzCi0gICAgICAgICAqIFVOSU5JVElBTElaRUQuIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIHdoZW4gd2UgZmlyc3QgY29ubmVjdCB0bwotICAgICAgICAgKiB0aGUgc3VwcGxpY2FudC4gT25jZSB3ZSdyZSBjb25uZWN0ZWQsIHdlIHNob3VsZCBhbHdheXMgcmVjZWl2ZQotICAgICAgICAgKiBhbiBldmVudCB1cG9uIGFueSBzdGF0ZSBjaGFuZ2UsIGJ1dCBpbiB0aGlzIGNhc2UsIHdlIHdhbnQgdG8KLSAgICAgICAgICogbWFrZSBzdXJlIGFueSBsaXN0ZW5lcnMgYXJlIG1hZGUgYXdhcmUgb2YgdGhlIHN0YXRlIGNoYW5nZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgPT0gU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQgJiYgc3VwcFN0YXRlICE9IG51bGwpCi0gICAgICAgICAgICBzZXRTdXBwbGljYW50U3RhdGUoc3VwcFN0YXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGR5bmFtaWMgaW5mb3JtYXRpb24gdGhhdCBpcyBub3QgcmVwb3J0ZWQgdmlhIGV2ZW50cy4KLSAgICAgKiBAcGFyYW0gaW5mbyB0aGUgb2JqZWN0IGludG8gd2hpY2ggdGhlIGluZm9ybWF0aW9uIHNob3VsZCBiZSBjYXB0dXJlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJlcXVlc3RQb2xsZWRJbmZvKFdpZmlJbmZvIGluZm8sIGJvb2xlYW4gcG9sbGluZykKLSAgICB7Ci0gICAgICAgIGludCBuZXdSc3NpID0gKHBvbGxpbmcgPyBnZXRSc3NpQXBwcm94KCkgOiBnZXRSc3NpKCkpOwotICAgICAgICBpZiAobmV3UnNzaSAhPSAtMSAmJiAtMjAwIDwgbmV3UnNzaSAmJiBuZXdSc3NpIDwgMjU2KSB7IC8vIHNjcmVlbiBvdXQgaW52YWxpZCB2YWx1ZXMKLSAgICAgICAgICAgIC8qIHNvbWUgaW1wbGVtZW50YXRpb25zIGF2b2lkIG5lZ2F0aXZlIHZhbHVlcyBieSBhZGRpbmcgMjU2Ci0gICAgICAgICAgICAgKiBzbyB3ZSBuZWVkIHRvIGFkanVzdCBmb3IgdGhhdCBoZXJlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAobmV3UnNzaSA+IDApIG5ld1Jzc2kgLT0gMjU2OwotICAgICAgICAgICAgaW5mby5zZXRSc3NpKG5ld1Jzc2kpOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFJhdGhlciB0aGVuIHNlbmRpbmcgdGhlIHJhdyBSU1NJIG91dCBldmVyeSB0aW1lIGl0Ci0gICAgICAgICAgICAgKiBjaGFuZ2VzLCB3ZSBwcmVjYWxjdWxhdGUgdGhlIHNpZ25hbCBsZXZlbCB0aGF0IHdvdWxkCi0gICAgICAgICAgICAgKiBiZSBkaXNwbGF5ZWQgaW4gdGhlIHN0YXR1cyBiYXIsIGFuZCBvbmx5IHNlbmQgdGhlCi0gICAgICAgICAgICAgKiBicm9hZGNhc3QgaWYgdGhhdCBtdWNoIG1vcmUgY29hcnNlLWdyYWluZWQgbnVtYmVyCi0gICAgICAgICAgICAgKiBjaGFuZ2VzLiBUaGlzIGN1dHMgZG93biBncmVhdGx5IG9uIHRoZSBudW1iZXIgb2YKLSAgICAgICAgICAgICAqIGJyb2FkY2FzdHMsIGF0IHRoZSBjb3N0IG9mIG5vdCBpbmZvcm1pbmcgb3RoZXJzCi0gICAgICAgICAgICAgKiBpbnRlcmVzdGVkIGluIFJTU0kgb2YgYWxsIHRoZSBjaGFuZ2VzIGluIHNpZ25hbAotICAgICAgICAgICAgICogbGV2ZWwuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8vIFRPRE86IFRoZSBzZWNvbmQgYXJnIHRvIHRoZSBjYWxsIGJlbG93IG5lZWRzIHRvIGJlIGEgc3ltYm9sIHNvbWV3aGVyZSwgYnV0Ci0gICAgICAgICAgICAvLyBpdCdzIGFjdHVhbGx5IHRoZSBzaXplIG9mIGFuIGFycmF5IG9mIGljb25zIHRoYXQncyBwcml2YXRlCi0gICAgICAgICAgICAvLyB0byBTdGF0dXNCYXIgUG9saWN5LgotICAgICAgICAgICAgaW50IG5ld1NpZ25hbExldmVsID0gV2lmaU1hbmFnZXIuY2FsY3VsYXRlU2lnbmFsTGV2ZWwobmV3UnNzaSwgNCk7Ci0gICAgICAgICAgICBpZiAobmV3U2lnbmFsTGV2ZWwgIT0gbUxhc3RTaWduYWxMZXZlbCkgewotICAgICAgICAgICAgICAgIHNlbmRSc3NpQ2hhbmdlQnJvYWRjYXN0KG5ld1Jzc2kpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUxhc3RTaWduYWxMZXZlbCA9IG5ld1NpZ25hbExldmVsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5mby5zZXRSc3NpKC0yMDApOwotICAgICAgICB9Ci0gICAgICAgIGludCBuZXdMaW5rU3BlZWQgPSBnZXRMaW5rU3BlZWQoKTsKLSAgICAgICAgaWYgKG5ld0xpbmtTcGVlZCAhPSAtMSkgewotICAgICAgICAgICAgaW5mby5zZXRMaW5rU3BlZWQobmV3TGlua1NwZWVkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kUnNzaUNoYW5nZUJyb2FkY2FzdChmaW5hbCBpbnQgbmV3UnNzaSkgewotICAgICAgICBpZiAoQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmlzU3lzdGVtUmVhZHkoKSkgewotICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuUlNTSV9DSEFOR0VEX0FDVElPTik7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfTkVXX1JTU0ksIG5ld1Jzc2kpOwotICAgICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmROZXR3b3JrU3RhdGVDaGFuZ2VCcm9hZGNhc3QoU3RyaW5nIGJzc2lkKSB7Ci0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLk5FVFdPUktfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UCi0gICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19SRUNFSVZFUl9SRVBMQUNFX1BFTkRJTkcpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfTkVUV09SS19JTkZPLCBtTmV0d29ya0luZm8pOwotICAgICAgICBpZiAoYnNzaWQgIT0gbnVsbCkKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9CU1NJRCwgYnNzaWQpOwotICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzYWJsZSBXaS1GaSBjb25uZWN0aXZpdHkgYnkgc3RvcHBpbmcgdGhlIGRyaXZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB0ZWFyZG93bigpIHsKLSAgICAgICAgaWYgKCFtVG9ybkRvd25CeUNvbm5NZ3IpIHsKLSAgICAgICAgICAgIGlmIChkaXNjb25uZWN0QW5kU3RvcCgpKSB7Ci0gICAgICAgICAgICAgICAgc2V0VG9ybkRvd25CeUNvbm5NZ3IodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVlbmFibGUgV2ktRmkgY29ubmVjdGl2aXR5IGJ5IHJlc3RhcnRpbmcgdGhlIGRyaXZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZWNvbm5lY3QoKSB7Ci0gICAgICAgIGlmIChtVG9ybkRvd25CeUNvbm5NZ3IpIHsKLSAgICAgICAgICAgIGlmIChyZXN0YXJ0KCkpIHsKLSAgICAgICAgICAgICAgICBzZXRUb3JuRG93bkJ5Q29ubk1ncihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2Ugd2FudCB0byBzdG9wIHRoZSBkcml2ZXIsIGJ1dCBpZiB3ZSdyZSBjb25uZWN0ZWQgdG8gYSBuZXR3b3JrLAotICAgICAqIHdlIGZpcnN0IHdhbnQgdG8gZGlzY29ubmVjdCwgc28gdGhhdCB0aGUgc3VwcGxpY2FudCBpcyBhbHdheXMgaW4KLSAgICAgKiBhIGtub3duIHN0YXRlIChESVNDT05ORUNURUQpIHdoZW4gdGhlIGRyaXZlciBpcyBzdG9wcGVkLgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHdoaWNoIG1lYW5zIHRoYXQgdGhlCi0gICAgICogZGlzY29ubmVjdCBvciBzdG9wIGNvbW1hbmQgd2FzIGluaXRpYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGlzY29ubmVjdEFuZFN0b3AoKSB7Ci0gICAgICAgIGJvb2xlYW4gcmV0ID0gdHJ1ZTs7Ci0gICAgICAgIGlmIChtUnVuU3RhdGUgIT0gUlVOX1NUQVRFX1NUT1BQSU5HICYmIG1SdW5TdGF0ZSAhPSBSVU5fU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAgICAgLy8gVGFrZSBkb3duIGFueSBvcGVuIG5ldHdvcmsgbm90aWZpY2F0aW9ucwotICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgZmFsc2UsIDApOwotCi0gICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpID09IFN1cHBsaWNhbnRTdGF0ZS5ET1JNQU5UKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gc3RvcERyaXZlcigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXQgPSBkaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUnVuU3RhdGUgPSBSVU5fU1RBVEVfU1RPUFBJTkc7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVzdGFydCgpIHsKLSAgICAgICAgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAgICAgbVJ1blN0YXRlID0gUlVOX1NUQVRFX1NUQVJUSU5HOwotICAgICAgICAgICAgcmVzZXRDb25uZWN0aW9ucyh0cnVlKTsKLSAgICAgICAgICAgIHJldHVybiBzdGFydERyaXZlcigpOwotICAgICAgICB9IGVsc2UgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RPUFBJTkcpIHsKLSAgICAgICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9TVEFSVElORzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFdpZmlTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGUuZ2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V2lmaVN0YXRlKGludCB3aWZpU3RhdGUpIHsKLSAgICAgICAgbVdpZmlTdGF0ZS5zZXQod2lmaVN0YXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FueU5ldHdvcmtEaXNhYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Jc0FueU5ldHdvcmtEaXNhYmxlZC5nZXQoKTsKLSAgICB9Ci0KLSAgIC8qKgotICAgICAqIFRoZSBXaWZpTmF0aXZlIGludGVyZmFjZSBmdW5jdGlvbnMgYXJlIGxpc3RlZCBiZWxvdy4KLSAgICAgKiBUaGUgb25seSBuYXRpdmUgY2FsbCB0aGF0IGlzIG5vdCBzeW5jaHJvbml6ZWQgb24KLSAgICAgKiBXaWZpU3RhdGVUcmFja2VyIGlzIHdhaXRGb3JFdmVudCgpIHdoaWNoIHdhaXRzIG9uIGEKLSAgICAgKiBzZXBlcmF0ZSBtb25pdG9yIGNoYW5uZWwuCi0gICAgICoKLSAgICAgKiBBbGwgc3VwcGxpY2FudCBjb21tYW5kcyBuZWVkIHRoZSB3aWZpIHRvIGJlIGluIGFuCi0gICAgICogZW5hYmxlZCBzdGF0ZS4gVGhpcyBjYW4gYmUgZG9uZSBieSBjaGVja2luZyB0aGUKLSAgICAgKiBtV2lmaVN0YXRlIHRvIGJlIFdJRklfU1RBVEVfRU5BQkxFRC4KLSAgICAgKgotICAgICAqIEFsbCBjb21tYW5kcyB0aGF0IGNhbiBjYXVzZSBjb21tYW5kcyB0byBkcml2ZXIKLSAgICAgKiBpbml0aWF0ZWQgbmVlZCB0aGUgZHJpdmVyIHN0YXRlIHRvIGJlIHN0YXJ0ZWQuCi0gICAgICogVGhpcyBpcyBkb25lIGJ5IGNoZWNraW5nIGlzRHJpdmVyU3RvcHBlZCgpIHRvCi0gICAgICogYmUgZmFsc2UuCi0gICAgICovCi0KLSAgICAvKioKLSAgICAgKiBMb2FkIHRoZSBkcml2ZXIgYW5kIGZpcm13YXJlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBsb2FkRHJpdmVyKCkgewotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5sb2FkRHJpdmVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVW5sb2FkIHRoZSBkcml2ZXIgYW5kIGZpcm13YXJlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiB1bmxvYWREcml2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnVubG9hZERyaXZlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHRoZSBzdXBwbGljYW50IGNvbmZpZyBhbmQKLSAgICAgKiBzdGFydCB0aGUgc3VwcGxpY2FudCBkYWVtb24KLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0YXJ0U3VwcGxpY2FudCgpIHsKLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc3RhcnRTdXBwbGljYW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcCB0aGUgc3VwcGxpY2FudCBkYWVtb24KLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0b3BTdXBwbGljYW50KCkgewotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zdG9wU3VwcGxpY2FudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVzdGFibGlzaGVzIHR3byBjaGFubmVscyAtIGNvbnRyb2wgY2hhbm5lbCBmb3IgY29tbWFuZHMKLSAgICAgKiBhbmQgbW9uaXRvciBjaGFubmVsIGZvciBub3RpZnlpbmcgV2lmaU1vbml0b3IKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbm5lY3RUb1N1cHBsaWNhbnQoKSB7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmNvbm5lY3RUb1N1cHBsaWNhbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZSB0aGUgY29udHJvbC9tb25pdG9yIGNoYW5uZWxzIHRvIHN1cHBsaWNhbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2VTdXBwbGljYW50Q29ubmVjdGlvbigpIHsKLSAgICAgICAgV2lmaU5hdGl2ZS5jbG9zZVN1cHBsaWNhbnRDb25uZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaWYgdGhlIHN1cHBsaWNhbnQgaXMgYWxpdmUKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHBpbmcoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnBpbmdDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaW5pdGlhdGUgYW4gYWN0aXZlIG9yIHBhc3NpdmUgc2NhbgotICAgICAqCi0gICAgICogQHBhcmFtIGZvcmNlQWN0aXZlIHRydWUgaWYgaXQgaXMgYSBhY3RpdmUgc2NhbgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNjYW4oYm9vbGVhbiBmb3JjZUFjdGl2ZSkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zY2FuQ29tbWFuZChmb3JjZUFjdGl2ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHN1cHBsaWNhbnQgb3IgZHJpdmVyCi0gICAgICogdGFrZSBjYXJlIG9mIGluaXRpYXRpbmcgc2NhbiBhbmQgZG9pbmcgQVAgc2VsZWN0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kZQotICAgICAqICAgIFNVUFBMX1NDQU5fSEFORExJTkdfTk9STUFMCi0gICAgICogICAgU1VQUExfU0NBTl9IQU5ETElOR19MSVNUX09OTFkKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRTY2FuUmVzdWx0SGFuZGxpbmcoaW50IG1vZGUpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZChtb2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGZXRjaCB0aGUgc2NhbiByZXN1bHRzIGZyb20gdGhlIHN1cHBsaWNhbnQKLSAgICAgKgotICAgICAqIEByZXR1cm4gZXhhbXBsZSByZXN1bHQgc3RyaW5nCi0gICAgICogMDA6YmI6Y2M6ZGQ6Y2M6ZWUgICAgICAgMjQyNyAgICAxNjYgICAgIFtXUEEtRUFQLVRLSVBdW1dQQTItRUFQLUNDTVBdICAgTmV0MQotICAgICAqIDAwOmJiOmNjOmRkOmNjOmZmICAgICAgIDI0MTIgICAgMTY1ICAgICBbV1BBLUVBUC1US0lQXVtXUEEyLUVBUC1DQ01QXSAgIE5ldDIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBzY2FuUmVzdWx0cygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zY2FuUmVzdWx0c0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNjYW4gbW9kZSAtIGFjdGl2ZSBvciBwYXNzaXZlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRTY2FuTW9kZShib29sZWFuIGlzU2Nhbk1vZGVBY3RpdmUpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Jc1NjYW5Nb2RlQWN0aXZlICE9IGlzU2Nhbk1vZGVBY3RpdmUpIHsKLSAgICAgICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNldFNjYW5Nb2RlQ29tbWFuZChtSXNTY2FuTW9kZUFjdGl2ZSA9IGlzU2Nhbk1vZGVBY3RpdmUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2Nvbm5lY3QgZnJvbSBBY2Nlc3MgUG9pbnQKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGRpc2Nvbm5lY3QoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmRpc2Nvbm5lY3RDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhdGUgYSByZWNvbm5lY3Rpb24gdG8gQVAKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlY29ubmVjdENvbW1hbmQoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnJlY29ubmVjdENvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBuZXR3b3JrCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG5ldHdvcmsgaWQgb2YgdGhlIG5ldyBuZXR3b3JrCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgYWRkTmV0d29yaygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuYWRkTmV0d29ya0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGUgYSBuZXR3b3JrCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV0d29ya0lkIGlkIG9mIHRoZSBuZXR3b3JrIHRvIGJlIHJlbW92ZWQKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZW1vdmVOZXR3b3JrKGludCBuZXR3b3JrSWQpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1EaXNjb25uZWN0RXhwZWN0ZWQgPSBXaWZpTmF0aXZlLnJlbW92ZU5ldHdvcmtDb21tYW5kKG5ldHdvcmtJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5hYmxlIGEgbmV0d29yawotICAgICAqCi0gICAgICogQHBhcmFtIG5ldElkIG5ldHdvcmsgaWQgb2YgdGhlIG5ldHdvcmsKLSAgICAgKiBAcGFyYW0gZGlzYWJsZU90aGVycyB0cnVlLCBpZiBhbGwgb3RoZXIgbmV0d29ya3MgaGF2ZSB0byBiZSBkaXNhYmxlZAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGVuYWJsZU5ldHdvcmsoaW50IG5ldElkLCBib29sZWFuIGRpc2FibGVPdGhlcnMpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRpc2FibGVPdGhlcnMpIG1Jc0FueU5ldHdvcmtEaXNhYmxlZC5zZXQodHJ1ZSk7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmVuYWJsZU5ldHdvcmtDb21tYW5kKG5ldElkLCBkaXNhYmxlT3RoZXJzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmFibGUgYWxsIG5ldHdvcmtzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV0d29ya3MgbGlzdCBvZiBjb25maWd1cmVkIG5ldHdvcmtzCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGVuYWJsZUFsbE5ldHdvcmtzKExpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+IG5ldHdvcmtzKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1Jc0FueU5ldHdvcmtEaXNhYmxlZC5zZXQoZmFsc2UpOwotICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA6IG5ldHdvcmtzKSB7Ci0gICAgICAgICAgICBpZiAoY29uZmlnLnN0YXR1cyA9PSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuRElTQUJMRUQpIHsKLSAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmVuYWJsZU5ldHdvcmtDb21tYW5kKGNvbmZpZy5uZXR3b3JrSWQsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2FibGUgYSBuZXR3b3JrCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayBpZCBvZiB0aGUgbmV0d29yawotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGRpc2FibGVOZXR3b3JrKGludCBuZXRJZCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtSXNBbnlOZXR3b3JrRGlzYWJsZWQuc2V0KHRydWUpOwotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5kaXNhYmxlTmV0d29ya0NvbW1hbmQobmV0SWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYXRlIGEgcmUtYXNzb2NpYXRpb24gaW4gc3VwcGxpY2FudAotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVhc3NvY2lhdGUoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnJlYXNzb2NpYXRlQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJsYWNrbGlzdCBhIEJTU0lELiBUaGlzIHdpbGwgYXZvaWQgdGhlIEFQIGlmIHRoZXJlIGFyZQotICAgICAqIGFsdGVybmF0ZSBBUHMgdG8gY29ubmVjdAotICAgICAqCi0gICAgICogQHBhcmFtIGJzc2lkIEJTU0lEIG9mIHRoZSBuZXR3b3JrCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gYWRkVG9CbGFja2xpc3QoU3RyaW5nIGJzc2lkKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmFkZFRvQmxhY2tsaXN0Q29tbWFuZChic3NpZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXIgdGhlIGJsYWNrbGlzdCBsaXN0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjbGVhckJsYWNrbGlzdCgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuY2xlYXJCbGFja2xpc3RDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGlzdCBhbGwgY29uZmlndXJlZCBuZXR3b3JrcwotICAgICAqCi0gICAgICogQHJldHVybiBsaXN0IG9mIG5ldHdvcmtzIG9yIG51bGwgb24gZmFpbHVyZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGxpc3ROZXR3b3JrcygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5saXN0TmV0d29ya3NDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IG5ldHdvcmsgc2V0dGluZyBieSBuYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayBpZCBvZiB0aGUgbmV0d29yawotICAgICAqIEBwYXJhbSBuYW1lIG5ldHdvcmsgdmFyaWFibGUga2V5Ci0gICAgICogQHJldHVybiB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGtleQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldE5ldHdvcmtWYXJpYWJsZShpbnQgbmV0SWQsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgbmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IG5ldHdvcmsgc2V0dGluZyBieSBuYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayBpZCBvZiB0aGUgbmV0d29yawotICAgICAqIEBwYXJhbSBuYW1lIG5ldHdvcmsgdmFyaWFibGUga2V5Ci0gICAgICogQHBhcmFtIHZhbHVlIG5ldHdvcmsgdmFyaWFibGUgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXROZXR3b3JrVmFyaWFibGUoaW50IG5ldElkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQobmV0SWQsIG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgZGV0YWlsZWQgc3RhdHVzIG9mIHRoZSBjb25uZWN0aW9uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEV4YW1wbGUgc3RhdHVzIHJlc3VsdAotICAgICAqICBic3NpZD1hYTpiYjpjYzpkZDplZTpmZgotICAgICAqICBzc2lkPVRlc3ROZXQKLSAgICAgKiAgaWQ9MwotICAgICAqICBwYWlyd2lzZV9jaXBoZXI9Tk9ORQotICAgICAqICBncm91cF9jaXBoZXI9Tk9ORQotICAgICAqICBrZXlfbWdtdD1OT05FCi0gICAgICogIHdwYV9zdGF0ZT1DT01QTEVURUQKLSAgICAgKiAgaXBfYWRkcmVzcz1YLlguWC5YCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgc3RhdHVzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnN0YXR1c0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgUlNTSSB0byBjdXJyZW50bHkgY29ubmVjdGVkIG5ldHdvcmsKLSAgICAgKgotICAgICAqIEByZXR1cm4gUlNTSSB2YWx1ZSwgLTEgb24gZmFpbHVyZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFJzc2koKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmdldFJzc2lBcHByb3hDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFwcHJveCBSU1NJIHRvIGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yawotICAgICAqCi0gICAgICogQHJldHVybiBSU1NJIHZhbHVlLCAtMSBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0UnNzaUFwcHJveCgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZ2V0UnNzaUFwcHJveENvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbGluayBzcGVlZCB0byBjdXJyZW50bHkgY29ubmVjdGVkIG5ldHdvcmsKLSAgICAgKgotICAgICAqIEByZXR1cm4gbGluayBzcGVlZCwgLTEgb24gZmFpbHVyZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldExpbmtTcGVlZCgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZ2V0TGlua1NwZWVkQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBNQUMgYWRkcmVzcyBvZiByYWRpbwotICAgICAqCi0gICAgICogQHJldHVybiBNQUMgYWRkcmVzcywgbnVsbCBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0TWFjQWRkcmVzcygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXRNYWNBZGRyZXNzQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0IGRyaXZlcgotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RhcnREcml2ZXIoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnN0YXJ0RHJpdmVyQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3AgZHJpdmVyCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdG9wRHJpdmVyKCkgewotICAgICAgICAvKiBEcml2ZXIgc3RvcCBzaG91bGQgbm90IGhhcHBlbiBvbmx5IHdoZW4gc3VwcGxpY2FudCBldmVudAotICAgICAgICAgKiBEUklWRVJfU1RPUFBFRCBoYXMgYWxyZWFkeSBiZWVuIGhhbmRsZWQgKi8KLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnN0b3BEcml2ZXJDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgcGFja2V0IGZpbHRlcmluZwotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RhcnRQYWNrZXRGaWx0ZXJpbmcoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnN0YXJ0UGFja2V0RmlsdGVyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcCBwYWNrZXQgZmlsdGVyaW5nCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdG9wUGFja2V0RmlsdGVyaW5nKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zdG9wUGFja2V0RmlsdGVyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHBvd2VyIG1vZGUKLSAgICAgKiBAcmV0dXJuIHBvd2VyIG1vZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRQb3dlck1vZGUoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCAmJiAhaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXRQb3dlck1vZGVDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHBvd2VyIG1vZGUKLSAgICAgKiBAcGFyYW0gbW9kZQotICAgICAqICAgICBEUklWRVJfUE9XRVJfTU9ERV9BVVRPCi0gICAgICogICAgIERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRQotICAgICAqCi0gICAgICogVXNlcyByZWZlcmVuY2UgY291bnRpbmcgdG8ga2VlcCBwb3dlciBtb2RlIGFjdGl2ZQotICAgICAqIGFzIGxvbmcgYXMgb25lIGVudGl0eSB3YW50cyBwb3dlciBtb2RlIHRvIGJlIGFjdGl2ZS4KLSAgICAgKgotICAgICAqIEZvciBleGFtcGxlLCBXaWZpTG9jayBoaWdoIHBlcmYgbW9kZSBjYW4ga2VlcCBwb3dlciBtb2RlIGFjdGl2ZQotICAgICAqIG9yIGEgREhDUCBzZXNzaW9uIGNhbiBrZWVwIGl0IGFjdGl2ZS4gQXMgbG9uZyBhcyBvbmUgZW50aXR5IHdhbnRzCi0gICAgICogaXQgZW5hYmxlZCwgaXQgc2hvdWxkIHN0YXkgdGhhdCB3YXkKLSAgICAgKgotICAgICAqLwotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0UG93ZXJNb2RlKGludCBtb2RlKSB7Ci0KLSAgICAgICAgLyogSXQgaXMgZ29vZCB0byBwbHVtYiBwb3dlciBtb2RlIGNoYW5nZQotICAgICAgICAgKiBldmVuIGlmIHJlZiBjb3VudCBpbmRpY2F0ZXMgYWxyZWFkeSBkb25lCi0gICAgICAgICAqIHNpbmNlIHdlIGNvdWxkIGhhdmUgYSBjYXNlIG9mIHByZXZpb3VzIGZhaWx1cmUuCi0gICAgICAgICAqLwotICAgICAgICBzd2l0Y2gobW9kZSkgewotICAgICAgICAgICAgY2FzZSBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkU6Ci0gICAgICAgICAgICAgICAgbVBvd2VyTW9kZVJlZkNvdW50Kys7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIERSSVZFUl9QT1dFUl9NT0RFX0FVVE86Ci0gICAgICAgICAgICAgICAgbVBvd2VyTW9kZVJlZkNvdW50LS07Ci0gICAgICAgICAgICAgICAgaWYgKG1Qb3dlck1vZGVSZWZDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEtlZXAgcmVmY291bnQgZnJvbSBiZWNvbWluZyBuZWdhdGl2ZSAqLwotICAgICAgICAgICAgICAgICAgICBtUG93ZXJNb2RlUmVmQ291bnQgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgV2lmaU5hdGl2ZS5zZXRQb3dlck1vZGVDb21tYW5kKG1vZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgcmFkaW8gZnJlcXVlbmN5IGNoYW5uZWxzIGZyb20gdGhlIHN5c3RlbQotICAgICAqIHNldHRpbmcgdmFsdWUsIGlmIGFueS4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZSwgZS5nLiwKLSAgICAgKiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGlzIGludmFsaWQuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldE51bUFsbG93ZWRDaGFubmVscygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBzZXROdW1BbGxvd2VkQ2hhbm5lbHMoCi0gICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX05VTV9BTExPV0VEX0NIQU5ORUxTKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNldHRpbmdzLlNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobU51bUFsbG93ZWRDaGFubmVscyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXROdW1BbGxvd2VkQ2hhbm5lbHNDb21tYW5kKG1OdW1BbGxvd2VkQ2hhbm5lbHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCB1c2UgdGhlIGRyaXZlciBkZWZhdWx0Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBudW1iZXIgb2YgcmFkaW8gZnJlcXVlbmN5IGNoYW5uZWxzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgdXNlZAotICAgICAqIGluIHRoZSBjdXJyZW50IHJlZ3VsYXRvcnkgZG9tYWluLgotICAgICAqIEBwYXJhbSBudW1DaGFubmVscyB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgY2hhbm5lbHMuIE11c3QgYmUgZ3JlYXRlciB0aGFuIDAKLSAgICAgKiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE2LgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLCBlLmcuLAotICAgICAqIHtAY29kZSBudW1DaGFubmVsc30gaXMgb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldE51bUFsbG93ZWRDaGFubmVscyhpbnQgbnVtQ2hhbm5lbHMpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbU51bUFsbG93ZWRDaGFubmVscyA9IG51bUNoYW5uZWxzOwotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zZXROdW1BbGxvd2VkQ2hhbm5lbHNDb21tYW5kKG51bUNoYW5uZWxzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbnVtYmVyIG9mIGFsbG93ZWQgY2hhbm5lbHMKLSAgICAgKgotICAgICAqIEByZXR1cm4gY2hhbm5lbCBjb3VudCwgLTEgb24gZmFpbHVyZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldE51bUFsbG93ZWRDaGFubmVscygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZ2V0TnVtQWxsb3dlZENoYW5uZWxzQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBibHVldG9vdGggY29leCBtb2RlOgotICAgICAqCi0gICAgICogQHBhcmFtIG1vZGUKLSAgICAgKiAgQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfRU5BQkxFRAotICAgICAqICBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9ESVNBQkxFRAotICAgICAqICBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9TRU5TRQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZShpbnQgbW9kZSkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zZXRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGVDb21tYW5kKG1vZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIEJsdWV0b290aCBjb2V4aXN0ZW5jZSBzY2FuIG1vZGUuIFdoZW4gdGhpcyBtb2RlIGlzIG9uLAotICAgICAqIHNvbWUgb2YgdGhlIGxvdy1sZXZlbCBzY2FuIHBhcmFtZXRlcnMgdXNlZCBieSB0aGUgZHJpdmVyIGFyZSBjaGFuZ2VkIHRvCi0gICAgICogcmVkdWNlIGludGVyZmVyZW5jZSB3aXRoIEEyRFAgc3RyZWFtaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIGlzQmx1ZXRvb3RoUGxheWluZyB3aGV0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoaXMgbW9kZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRCbHVldG9vdGhTY2FuTW9kZShib29sZWFuIGlzQmx1ZXRvb3RoUGxheWluZykgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBXaWZpTmF0aXZlLnNldEJsdWV0b290aENvZXhpc3RlbmNlU2Nhbk1vZGVDb21tYW5kKGlzQmx1ZXRvb3RoUGxheWluZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZSBjb25maWd1cmF0aW9uIG9uIHN1cHBsaWNhbnQKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNhdmVDb25maWcoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNhdmVDb25maWdDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVsb2FkIHRoZSBjb25maWd1cmF0aW9uIGZyb20gZmlsZQotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVsb2FkQ29uZmlnKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5yZWxvYWRDb25maWdDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2V0UmFkaW8oYm9vbGVhbiB0dXJuT24pIHsKLSAgICAgICAgcmV0dXJuIG1XTS5zZXRXaWZpRW5hYmxlZCh0dXJuT24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiBUaGVyZSBhcmUgY3VycmVudGx5IG5vIFdpLUZpLXNwZWNpZmljIGZlYXR1cmVzIHN1cHBvcnRlZC4KLSAgICAgKiBAcGFyYW0gZmVhdHVyZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZQotICAgICAqIEByZXR1cm4ge0Bjb2RlIC0xfSBpbmRpY2F0aW5nIGZhaWx1cmUsIGFsd2F5cworICAgICAqIFRlbGxzIHRoZSB1bmRlcmx5aW5nIG5ldHdvcmtpbmcgc3lzdGVtIHRoYXQgdGhlIGNhbGxlciB3YW50cyB0bworICAgICAqIGJlZ2luIHVzaW5nIHRoZSBuYW1lZCBmZWF0dXJlLiBUaGUgaW50ZXJwcmV0YXRpb24gb2Yge0Bjb2RlIGZlYXR1cmV9CisgICAgICogaXMgY29tcGxldGVseSB1cCB0byBlYWNoIG5ldHdvcmtpbmcgaW1wbGVtZW50YXRpb24uCisgICAgICogQHBhcmFtIGZlYXR1cmUgdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUgdG8gYmUgdXNlZAorICAgICAqIEBwYXJhbSBjYWxsaW5nUGlkIHRoZSBwcm9jZXNzIElEIG9mIHRoZSBwcm9jZXNzIHRoYXQgaXMgaXNzdWluZyB0aGlzIHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gY2FsbGluZ1VpZCB0aGUgdXNlciBJRCBvZiB0aGUgcHJvY2VzcyB0aGF0IGlzIGlzc3VpbmcgdGhpcyByZXF1ZXN0CisgICAgICogQHJldHVybiBhbiBpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgb3V0Y29tZSBvZiB0aGUgcmVxdWVzdC4KKyAgICAgKiBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhpcyB2YWx1ZSBpcyBzcGVjaWZpYyB0byBlYWNoIG5ldHdvcmtpbmcKKyAgICAgKiBpbXBsZW1lbnRhdGlvbitmZWF0dXJlIGNvbWJpbmF0aW9uLCBleGNlcHQgdGhhdCB0aGUgdmFsdWUge0Bjb2RlIC0xfQorICAgICAqIGFsd2F5cyBpbmRpY2F0ZXMgZmFpbHVyZS4KKyAgICAgKiBUT0RPOiBuZWVkcyB0byBnbyBhd2F5CiAgICAgICovCiAgICAgcHVibGljIGludCBzdGFydFVzaW5nTmV0d29ya0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCkgewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIFRoZXJlIGFyZSBjdXJyZW50bHkgbm8gV2ktRmktc3BlY2lmaWMgZmVhdHVyZXMgc3VwcG9ydGVkLgotICAgICAqIEBwYXJhbSBmZWF0dXJlIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlCi0gICAgICogQHJldHVybiB7QGNvZGUgLTF9IGluZGljYXRpbmcgZmFpbHVyZSwgYWx3YXlzCisgICAgICogVGVsbHMgdGhlIHVuZGVybHlpbmcgbmV0d29ya2luZyBzeXN0ZW0gdGhhdCB0aGUgY2FsbGVyIGlzIGZpbmlzaGVkCisgICAgICogdXNpbmcgdGhlIG5hbWVkIGZlYXR1cmUuIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB7QGNvZGUgZmVhdHVyZX0KKyAgICAgKiBpcyBjb21wbGV0ZWx5IHVwIHRvIGVhY2ggbmV0d29ya2luZyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAcGFyYW0gZmVhdHVyZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZSB0aGF0IGlzIG5vIGxvbmdlciBuZWVkZWQuCisgICAgICogQHBhcmFtIGNhbGxpbmdQaWQgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIHByb2Nlc3MgdGhhdCBpcyBpc3N1aW5nIHRoaXMgcmVxdWVzdAorICAgICAqIEBwYXJhbSBjYWxsaW5nVWlkIHRoZSB1c2VyIElEIG9mIHRoZSBwcm9jZXNzIHRoYXQgaXMgaXNzdWluZyB0aGlzIHJlcXVlc3QKKyAgICAgKiBAcmV0dXJuIGFuIGludGVnZXIgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBvdXRjb21lIG9mIHRoZSByZXF1ZXN0LgorICAgICAqIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIHZhbHVlIGlzIHNwZWNpZmljIHRvIGVhY2ggbmV0d29ya2luZworICAgICAqIGltcGxlbWVudGF0aW9uK2ZlYXR1cmUgY29tYmluYXRpb24sIGV4Y2VwdCB0aGF0IHRoZSB2YWx1ZSB7QGNvZGUgLTF9CisgICAgICogYWx3YXlzIGluZGljYXRlcyBmYWlsdXJlLgorICAgICAqIFRPRE86IG5lZWRzIHRvIGdvIGF3YXkKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHN0b3BVc2luZ05ldHdvcmtGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBpbnQgY2FsbGluZ1BpZCwgaW50IGNhbGxpbmdVaWQpIHsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGludGVycHJldFNjYW5SZXN1bHRzQXZhaWxhYmxlKCkgewotCi0gICAgICAgIC8vIElmIHdlIHNob3VsZG4ndCBwbGFjZSBhIG5vdGlmaWNhdGlvbiBvbiBhdmFpbGFibGUgbmV0d29ya3MsIHRoZW4KLSAgICAgICAgLy8gZG9uJ3QgYm90aGVyIGRvaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nCi0gICAgICAgIGlmICghbU5vdGlmaWNhdGlvbkVuYWJsZWQpIHJldHVybjsKLQotICAgICAgICBOZXR3b3JrSW5mbyBuZXR3b3JrSW5mbyA9IGdldE5ldHdvcmtJbmZvKCk7Ci0KLSAgICAgICAgU3RhdGUgc3RhdGUgPSBuZXR3b3JrSW5mby5nZXRTdGF0ZSgpOwotICAgICAgICBpZiAoKHN0YXRlID09IE5ldHdvcmtJbmZvLlN0YXRlLkRJU0NPTk5FQ1RFRCkKLSAgICAgICAgICAgICAgICB8fCAoc3RhdGUgPT0gTmV0d29ya0luZm8uU3RhdGUuVU5LTk9XTikpIHsKLQotICAgICAgICAgICAgLy8gTG9vayBmb3IgYW4gb3BlbiBuZXR3b3JrCi0gICAgICAgICAgICBMaXN0PFNjYW5SZXN1bHQ+IHNjYW5SZXN1bHRzID0gZ2V0U2NhblJlc3VsdHNMaXN0KCk7Ci0gICAgICAgICAgICBpZiAoc2NhblJlc3VsdHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBudW1PcGVuTmV0d29ya3MgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzY2FuUmVzdWx0cy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBTY2FuUmVzdWx0IHNjYW5SZXN1bHQgPSBzY2FuUmVzdWx0cy5nZXQoaSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHNjYW5SZXN1bHQuY2FwYWJpbGl0aWVzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbnVtT3Blbk5ldHdvcmtzKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobnVtT3Blbk5ldHdvcmtzID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKyttTnVtU2NhbnNTaW5jZU5ldHdvcmtTdGF0ZUNoYW5nZSA+PSBOVU1fU0NBTlNfQkVGT1JFX0FDVFVBTExZX1NDQU5OSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgICogV2UndmUgc2Nhbm5lZCBjb250aW51b3VzbHkgYXQgbGVhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIE5VTV9TQ0FOU19CRUZPUkVfTk9USUZJQ0FUSU9OIHRpbWVzLiBUaGUgdXNlcgotICAgICAgICAgICAgICAgICAgICAgICAgICogcHJvYmFibHkgZG9lcyBub3QgaGF2ZSBhIHJlbWVtYmVyZWQgbmV0d29yayBpbiByYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpbmNlIG90aGVyd2lzZSBzdXBwbGljYW50IHdvdWxkIGhhdmUgdHJpZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGFzc29jaWF0ZSBhbmQgdGh1cyByZXNldHRpbmcgdGhpcyBjb3VudGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25WaXNpYmxlKHRydWUsIG51bU9wZW5OZXR3b3JrcywgZmFsc2UsIDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIE5vIG9wZW4gbmV0d29ya3MgaW4gcmFuZ2UsIHJlbW92ZSB0aGUgbm90aWZpY2F0aW9uCi0gICAgICAgIHNldE5vdGlmaWNhdGlvblZpc2libGUoZmFsc2UsIDAsIGZhbHNlLCAwKTsKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBwcml2YXRlIEROUyByb3V0ZSBpcyBzZXQgZm9yIHRoZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQcml2YXRlRG5zUm91dGVTZXQoKSB7CisgICAgICAgIHJldHVybiBtUHJpdmF0ZURuc1JvdXRlU2V0LmdldCgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIERpc3BsYXkgb3IgZG9uJ3QgZGlzcGxheSBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZXJlIGFyZSBvcGVuIFdpLUZpIG5ldHdvcmtzLgotICAgICAqIEBwYXJhbSB2aXNpYmxlIHtAY29kZSB0cnVlfSBpZiBub3RpZmljYXRpb24gc2hvdWxkIGJlIHZpc2libGUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICogQHBhcmFtIG51bU5ldHdvcmtzIHRoZSBudW1iZXIgbmV0d29ya3Mgc2VlbgotICAgICAqIEBwYXJhbSBmb3JjZSB7QGNvZGUgdHJ1ZX0gdG8gZm9yY2Ugbm90aWZpY2F0aW9uIHRvIGJlIHNob3duL25vdC1zaG93biwKLSAgICAgKiBldmVuIGlmIGl0IGlzIGFscmVhZHkgc2hvd24vbm90LXNob3duLgotICAgICAqIEBwYXJhbSBkZWxheSB0aW1lIGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgbm90aWZpY2F0aW9uIHNob3VsZCBiZSBtYWRlCi0gICAgICogdmlzaWJsZSBvciBpbnZpc2libGUuCisgICAgICogU2V0IGEgZmxhZyBpbmRpY2F0aW5nIHByaXZhdGUgRE5TIHJvdXRlIGlzIHNldAogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5vdGlmaWNhdGlvblZpc2libGUoYm9vbGVhbiB2aXNpYmxlLCBpbnQgbnVtTmV0d29ya3MsIGJvb2xlYW4gZm9yY2UsIGludCBkZWxheSkgewotICAgICAgICAKLSAgICAgICAgLy8gU2luY2Ugd2UgdXNlIGF1dG8gY2FuY2VsIG9uIHRoZSBub3RpZmljYXRpb24sIHdoZW4gdGhlCi0gICAgICAgIC8vIG1OZXR3b3Jrc0F2YWlsYWJsZU5vdGlmaWNhdGlvblNob3duIGlzIHRydWUsIHRoZSBub3RpZmljYXRpb24gbWF5Ci0gICAgICAgIC8vIGhhdmUgYWN0dWFsbHkgYmVlbiBjYW5jZWxlZC4gIEhvd2V2ZXIsIHdoZW4gaXQgaXMgZmFsc2Ugd2Uga25vdwotICAgICAgICAvLyBmb3Igc3VyZSB0aGF0IGl0IGlzIG5vdCBiZWluZyBzaG93biAoaXQgd2lsbCBub3QgYmUgc2hvd24gYW55IG90aGVyCi0gICAgICAgIC8vIHBsYWNlIHRoYW4gaGVyZSkKLSAgICAgICAgCi0gICAgICAgIC8vIElmIGl0IHNob3VsZCBiZSBoaWRkZW4gYW5kIGl0IGlzIGFscmVhZHkgaGlkZGVuLCB0aGVuIG5vb3AKLSAgICAgICAgaWYgKCF2aXNpYmxlICYmICFtTm90aWZpY2F0aW9uU2hvd24gJiYgIWZvcmNlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBNZXNzYWdlIG1lc3NhZ2U7Ci0gICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIE5vdCBlbm91Z2ggdGltZSBoYXMgcGFzc2VkIHRvIHNob3cgdGhlIG5vdGlmaWNhdGlvbiBhZ2FpbgotICAgICAgICAgICAgaWYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDwgbU5vdGlmaWNhdGlvblJlcGVhdFRpbWUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBDYWNoZSB0aGUgTm90aWZpY2F0aW9uIG1haW5seSBzbyB3ZSBjYW4gcmVtb3ZlIHRoZQotICAgICAgICAgICAgICAgIC8vIEVWRU5UX05PVElGSUNBVElPTl9DSEFOR0VEIG1lc3NhZ2Ugd2l0aCB0aGlzIE5vdGlmaWNhdGlvbiBmcm9tCi0gICAgICAgICAgICAgICAgLy8gdGhlIHF1ZXVlIGxhdGVyCi0gICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oKTsKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uLndoZW4gPSAwOwotICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24uaWNvbiA9IElDT05fTkVUV09SS1NfQVZBSUxBQkxFOwotICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24uZmxhZ3MgPSBOb3RpZmljYXRpb24uRkxBR19BVVRPX0NBTkNFTDsKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KG1Db250ZXh0LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVudChXaWZpTWFuYWdlci5BQ1RJT05fUElDS19XSUZJX05FVFdPUkspLCAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UXVhbnRpdHlUZXh0KAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnBsdXJhbHMud2lmaV9hdmFpbGFibGUsIG51bU5ldHdvcmtzKTsKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBkZXRhaWxzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UXVhbnRpdHlUZXh0KAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnBsdXJhbHMud2lmaV9hdmFpbGFibGVfZGV0YWlsZWQsIG51bU5ldHdvcmtzKTsKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb24udGlja2VyVGV4dCA9IHRpdGxlOwotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5zZXRMYXRlc3RFdmVudEluZm8obUNvbnRleHQsIHRpdGxlLCBkZXRhaWxzLCBtTm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBtTm90aWZpY2F0aW9uUmVwZWF0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgTk9USUZJQ0FUSU9OX1JFUEVBVF9ERUxBWV9NUzsKLQotICAgICAgICAgICAgbWVzc2FnZSA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9OT1RJRklDQVRJT05fQ0hBTkdFRCwgMSwKLSAgICAgICAgICAgICAgICAgICAgSUNPTl9ORVRXT1JLU19BVkFJTEFCTEUsIG1Ob3RpZmljYXRpb24pOwotICAgICAgICAgICAgCi0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgcGVuZGluZyBtZXNzYWdlcyB0byBzaG93IHRoZSBub3RpZmljYXRpb24KLSAgICAgICAgICAgIG1UYXJnZXQucmVtb3ZlTWVzc2FnZXMoRVZFTlRfTk9USUZJQ0FUSU9OX0NIQU5HRUQsIG1Ob3RpZmljYXRpb24pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBtZXNzYWdlID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX05PVElGSUNBVElPTl9DSEFOR0VELCAwLCBJQ09OX05FVFdPUktTX0FWQUlMQUJMRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtVGFyZ2V0LnNlbmRNZXNzYWdlRGVsYXllZChtZXNzYWdlLCBkZWxheSk7Ci0gICAgICAgIAotICAgICAgICBtTm90aWZpY2F0aW9uU2hvd24gPSB2aXNpYmxlOworICAgIHB1YmxpYyB2b2lkIHByaXZhdGVEbnNSb3V0ZVNldChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbVByaXZhdGVEbnNSb3V0ZVNldC5zZXQoZW5hYmxlZCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xlYXJzIHZhcmlhYmxlcyByZWxhdGVkIHRvIHRyYWNraW5nIHdoZXRoZXIgYSBub3RpZmljYXRpb24gaGFzIGJlZW4KLSAgICAgKiBzaG93biByZWNlbnRseS4KLSAgICAgKiA8cD4KLSAgICAgKiBBZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCB0aGUgdGltZXIgdGhhdCBwcmV2ZW50cyBub3RpZmljYXRpb25zIGZyb20KLSAgICAgKiBiZWluZyBzaG93biB0b28gb2Z0ZW4gd2lsbCBiZSBjbGVhcmVkLgorICAgICAqIEZldGNoIE5ldHdvcmtJbmZvIGZvciB0aGUgbmV0d29yawogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXNldE5vdGlmaWNhdGlvblRpbWVyKCkgewotICAgICAgICBtTm90aWZpY2F0aW9uUmVwZWF0VGltZSA9IDA7Ci0gICAgICAgIG1OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlID0gMDsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQoImludGVyZmFjZSAiKS5hcHBlbmQobUludGVyZmFjZU5hbWUpOwotICAgICAgICBzYi5hcHBlbmQoIiBydW5TdGF0ZT0iKTsKLSAgICAgICAgaWYgKG1SdW5TdGF0ZSA+PSAxICYmIG1SdW5TdGF0ZSA8PSBtUnVuU3RhdGVOYW1lcy5sZW5ndGgpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChtUnVuU3RhdGVOYW1lc1ttUnVuU3RhdGUtMV0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2IuYXBwZW5kKG1SdW5TdGF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2IuYXBwZW5kKExTKS5hcHBlbmQobVdpZmlJbmZvKS5hcHBlbmQoTFMpOwotICAgICAgICBzYi5hcHBlbmQobURoY3BJbmZvKS5hcHBlbmQoTFMpOwotICAgICAgICBzYi5hcHBlbmQoImhhdmVJcEFkZHJlc3M9IikuYXBwZW5kKG1IYXZlSXBBZGRyZXNzKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgb2J0YWluaW5nSXBBZGRyZXNzPSIpLmFwcGVuZChtT2J0YWluaW5nSXBBZGRyZXNzKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgc2Nhbk1vZGVBY3RpdmU9IikuYXBwZW5kKG1Jc1NjYW5Nb2RlQWN0aXZlKS5hcHBlbmQoTFMpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgibGFzdFNpZ25hbExldmVsPSIpLmFwcGVuZChtTGFzdFNpZ25hbExldmVsKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgZXhwbGljaXRseURpc2FibGVkPSIpLmFwcGVuZChtVG9ybkRvd25CeUNvbm5NZ3IpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICBwdWJsaWMgTmV0d29ya0luZm8gZ2V0TmV0d29ya0luZm8oKSB7CisgICAgICAgIHJldHVybiBtTmV0d29ya0luZm87CiAgICAgfQogCi0gICAgcHJpdmF0ZSBjbGFzcyBEaGNwSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotCi0gICAgICAgIHByaXZhdGUgSGFuZGxlciBtVGFyZ2V0OwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdoZXRoZXIgdG8gc2tpcCB0aGUgREhDUCByZXN1bHQgY2FsbGJhY2sgdG8gdGhlIHRhcmdldC4gRm9yIGV4YW1wbGUsCi0gICAgICAgICAqIHRoaXMgY291bGQgYmUgc2V0IGlmIHRoZSBuZXR3b3JrIHdlIHdlcmUgcmVxdWVzdGluZyBhbiBJUCBmb3IgaGFzCi0gICAgICAgICAqIHNpbmNlIGJlZW4gZGlzY29ubmVjdGVkLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogTm90ZTogVGhlcmUgaXMgc3RpbGwgYSBjaGFuY2Ugd2hlcmUgdGhlIGNsaWVudCdzIGludGVuZGVkIERIQ1AKLSAgICAgICAgICogcmVxdWVzdCBub3QgYmVpbmcgY2FuY2VsZWQuIEZvciBleGFtcGxlLCB3ZSBhcmUgcmVxdWVzdCBmb3IgSVAgb24KLSAgICAgICAgICogQSwgYW5kIGhlIHF1ZXVlcyByZXF1ZXN0IGZvciBJUCBvbiBCLCBhbmQgdGhlbiBjYW5jZWxzIHRoZSByZXF1ZXN0IG9uCi0gICAgICAgICAqIEIgd2hpbGUgd2UncmUgc3RpbGwgcmVxdWVzdGluZyBmcm9tIEEuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNhbmNlbENhbGxiYWNrOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJbnN0YW5jZSBvZiB0aGUgYmx1ZXRvb3RoIGhlYWRzZXQgaGVscGVyLiBUaGlzIG5lZWRzIHRvIGJlIGNyZWF0ZWQKLSAgICAgICAgICogZWFybHkgYmVjYXVzZSB0aGVyZSBpcyBhIGRlbGF5IGJlZm9yZSBpdCBhY3R1YWxseSAnY29ubmVjdHMnLCBhcwotICAgICAgICAgKiBub3RlZCBieSBpdHMgamF2YWRvYy4gSWYgd2UgY2hlY2sgYmVmb3JlIGl0IGlzIGNvbm5lY3RlZCwgaXQgd2lsbCBiZQotICAgICAgICAgKiBpbiBhbiBlcnJvciBzdGF0ZSBhbmQgd2Ugd2lsbCBub3QgZGlzYWJsZSBjb2V4aXN0ZW5jZS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgQmx1ZXRvb3RoSGVhZHNldCBtQmx1ZXRvb3RoSGVhZHNldDsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBEaGNwSGFuZGxlcihMb29wZXIgbG9vcGVyLCBIYW5kbGVyIHRhcmdldCkgewotICAgICAgICAgICAgc3VwZXIobG9vcGVyKTsKLSAgICAgICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1CbHVldG9vdGhIZWFkc2V0ID0gbmV3IEJsdWV0b290aEhlYWRzZXQobUNvbnRleHQsIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgaW50IGV2ZW50OwotCi0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9ESENQX1NUQVJUOgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtb2RpZmllZEJsdWV0b290aENvZXhpc3RlbmNlTW9kZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpbnQgcG93ZXJNb2RlID0gRFJJVkVSX1BPV0VSX01PREVfQVVUTzsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRGlzYWJsZUNvZXhpc3RlbmNlTW9kZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgICogVGhlcmUgYXJlIHByb2JsZW1zIHNldHRpbmcgdGhlIFdpLUZpIGRyaXZlcidzIHBvd2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBtb2RlIHRvIGFjdGl2ZSB3aGVuIGJsdWV0b290aCBjb2V4aXN0ZW5jZSBtb2RlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBlbmFibGVkIG9yIHNlbnNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICogPHA+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBXZSBzZXQgV2ktRmkgdG8gYWN0aXZlIG1vZGUgd2hlbgotICAgICAgICAgICAgICAgICAgICAgICAgICogb2J0YWluaW5nIGFuIElQIGFkZHJlc3MgYmVjYXVzZSB3ZSd2ZSBmb3VuZAotICAgICAgICAgICAgICAgICAgICAgICAgICogY29tcGF0aWJpbGl0eSBpc3N1ZXMgd2l0aCBzb21lIHJvdXRlcnMgd2l0aCBsb3cgcG93ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiA8cD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIEluIG9yZGVyIGZvciB0aGlzIGFjdGl2ZSBwb3dlciBtb2RlIHRvIHByb3Blcmx5IGJlIHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHdlIGRpc2FibGUgY29leGlzdGVuY2UgbW9kZSB1bnRpbCB3ZSdyZSBkb25lIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG9idGFpbmluZyBhbiBJUCBhZGRyZXNzLiAgT25lIGV4Y2VwdGlvbiBpcyBpZiB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgICogYXJlIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gYSBoZWFkc2V0LCBzaW5jZSBkaXNhYmxpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvZXhpc3RlbmNlIHdvdWxkIGludGVycnVwdCB0aGF0IGNvbm5lY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkQmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSB0aGUgY29leGlzdGVuY2UgbW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLkJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX0RJU0FCTEVEKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcG93ZXJNb2RlID0gZ2V0UG93ZXJNb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3dlck1vZGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHN1cHBsaWNhbnQgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAvLyBnZXRQb3dlck1vZGVDb21tYW5kLgotICAgICAgICAgICAgICAgICAgICAgICAgcG93ZXJNb2RlID0gRFJJVkVSX1BPV0VSX01PREVfQVVUTzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocG93ZXJNb2RlICE9IERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0UG93ZXJNb2RlKERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbmV3IHJlcXVlc3QgaXMgYmVpbmcgbWFkZSwgc28gYXNzdW1lIHdlIHdpbGwgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DYW5jZWxDYWxsYmFjayA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkRoY3BIYW5kbGVyOiBESENQIHJlcXVlc3Qgc3RhcnRlZCIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTmV0d29ya1V0aWxzLnJ1bkRoY3AobUludGVyZmFjZU5hbWUsIG1EaGNwSW5mbykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gRVZFTlRfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fU1VDQ0VFREVEOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIkRoY3BIYW5kbGVyOiBESENQIHJlcXVlc3Qgc3VjY2VlZGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IEVWRU5UX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX0ZBSUxFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkRoY3BIYW5kbGVyOiBESENQIHJlcXVlc3QgZmFpbGVkOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMuZ2V0RGhjcEVycm9yKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvd2VyTW9kZSAhPSBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFBvd2VyTW9kZShwb3dlck1vZGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGlmaWVkQmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGNvZXhpc3RlbmNlIG1vZGUgYmFjayB0byBpdHMgZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLkJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX1NFTlNFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtQ2FuY2VsQ2FsbGJhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGFyZ2V0LnNlbmRFbXB0eU1lc3NhZ2UoZXZlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldENhbmNlbENhbGxiYWNrKGJvb2xlYW4gY2FuY2VsQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIG1DYW5jZWxDYWxsYmFjayA9IGNhbmNlbENhbGxiYWNrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdoZXRoZXIgdG8gZGlzYWJsZSBjb2V4aXN0ZW5jZSBtb2RlIHdoaWxlIG9idGFpbmluZyBJUCBhZGRyZXNzLiBUaGlzCi0gICAgICAgICAqIGxvZ2ljIHdpbGwgcmV0dXJuIHRydWUgb25seSBpZiB0aGUgY3VycmVudCBibHVldG9vdGgKLSAgICAgICAgICogaGVhZHNldC9oYW5kc2ZyZWUgc3RhdGUgaXMgZGlzY29ubmVjdGVkLiBUaGlzIG1lYW5zIGlmIGl0IGlzIGluIGFuCi0gICAgICAgICAqIGVycm9yIHN0YXRlLCB3ZSB3aWxsIE5PVCBkaXNhYmxlIGNvZXhpc3RlbmNlIG1vZGUgdG8gZXJyIG9uIHRoZSBzaWRlCi0gICAgICAgICAqIG9mIHNhZmV0eS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gV2hldGhlciB0byBkaXNhYmxlIGNvZXhpc3RlbmNlIG1vZGUuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkRGlzYWJsZUNvZXhpc3RlbmNlTW9kZSgpIHsKLSAgICAgICAgICAgIGludCBzdGF0ZSA9IG1CbHVldG9vdGhIZWFkc2V0LmdldFN0YXRlKG1CbHVldG9vdGhIZWFkc2V0LmdldEN1cnJlbnRIZWFkc2V0KCkpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXRlID09IEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjaGVja1VzZVN0YXRpY0lwKCkgewotICAgICAgICBtVXNlU3RhdGljSXAgPSBmYWxzZTsKLSAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIGNyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoU2V0dGluZ3MuU3lzdGVtLmdldEludChjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfVVNFX1NUQVRJQ19JUCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU2V0dGluZ3MuU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgYWRkciA9IFNldHRpbmdzLlN5c3RlbS5nZXRTdHJpbmcoY3IsIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19JUCk7Ci0gICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbURoY3BJbmZvLmlwQWRkcmVzcyA9IHN0cmluZ1RvSXBBZGRyKGFkZHIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRyID0gU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZyhjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0dBVEVXQVkpOwotICAgICAgICAgICAgaWYgKGFkZHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1EaGNwSW5mby5nYXRld2F5ID0gc3RyaW5nVG9JcEFkZHIoYWRkcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZHIgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0U3RyaW5nKGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfTkVUTUFTSyk7Ci0gICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbURoY3BJbmZvLm5ldG1hc2sgPSBzdHJpbmdUb0lwQWRkcihhZGRyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkciA9IFNldHRpbmdzLlN5c3RlbS5nZXRTdHJpbmcoY3IsIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ETlMxKTsKLSAgICAgICAgICAgIGlmIChhZGRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRGhjcEluZm8uZG5zMSA9IHN0cmluZ1RvSXBBZGRyKGFkZHIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRyID0gU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZyhjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0ROUzIpOwotICAgICAgICAgICAgaWYgKGFkZHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1EaGNwSW5mby5kbnMyID0gc3RyaW5nVG9JcEFkZHIoYWRkcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1EaGNwSW5mby5kbnMyID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1Vc2VTdGF0aWNJcCA9IHRydWU7CisgICAgLyoqCisgICAgICogRmV0Y2ggTGlua1Byb3BlcnRpZXMgZm9yIHRoZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gbmV3IExpbmtQcm9wZXJ0aWVzKG1MaW5rUHJvcGVydGllcyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHN0cmluZ1RvSXBBZGRyKFN0cmluZyBhZGRyU3RyaW5nKSB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nW10gcGFydHMgPSBhZGRyU3RyaW5nLnNwbGl0KCJcXC4iKTsKLSAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggIT0gNCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmtub3duSG9zdEV4Y2VwdGlvbihhZGRyU3RyaW5nKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGEgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzBdKSAgICAgIDsKLSAgICAgICAgICAgIGludCBiID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1sxXSkgPDwgIDg7Ci0gICAgICAgICAgICBpbnQgYyA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMl0pIDw8IDE2OwotICAgICAgICAgICAgaW50IGQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzNdKSA8PCAyNDsKLQotICAgICAgICAgICAgcmV0dXJuIGEgfCBiIHwgYyB8IGQ7Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVua25vd25Ib3N0RXhjZXB0aW9uKGFkZHJTdHJpbmcpOwotICAgICAgICB9CisgICAgLyoqCisgICAgICogQSBjYXBhYmlsaXR5IGlzIGFuIEludGVnZXIvU3RyaW5nIHBhaXIsIHRoZSBjYXBhYmlsaXRpZXMKKyAgICAgKiBhcmUgZGVmaW5lZCBpbiB0aGUgY2xhc3MgTGlua1NvY2tldCNLZXkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgY29weSBvZiB0aGlzIGNvbm5lY3Rpb25zIGNhcGFiaWxpdGllcywgbWF5IGJlIGVtcHR5IGJ1dCBuZXZlciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBMaW5rQ2FwYWJpbGl0aWVzIGdldExpbmtDYXBhYmlsaXRpZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgTGlua0NhcGFiaWxpdGllcyhtTGlua0NhcGFiaWxpdGllcyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBpbnQgZ2V0TWF4RGhjcFJldHJpZXMoKSB7Ci0gICAgICAgIHJldHVybiBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9NQVhfREhDUF9SRVRSWV9DT1VOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9NQVhfREhDUF9SRVRSSUVTKTsKKyAgICAvKioKKyAgICAgKiBGZXRjaCBkZWZhdWx0IGdhdGV3YXkgYWRkcmVzcyBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldERlZmF1bHRHYXRld2F5QWRkcigpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0R2F0ZXdheUFkZHIuZ2V0KCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBjbGFzcyBTZXR0aW5nc09ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKLSAgICAgICAgcHVibGljIFNldHRpbmdzT2JzZXJ2ZXIoSGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgICAgICBzdXBlcihoYW5kbGVyKTsKLSAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9VU0VfU1RBVElDX0lQKSwgZmFsc2UsIHRoaXMpOwotICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfSVApLCBmYWxzZSwgdGhpcyk7Ci0gICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19HQVRFV0FZKSwgZmFsc2UsIHRoaXMpOwotICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfTkVUTUFTSyksIGZhbHNlLCB0aGlzKTsKLSAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0ROUzEpLCBmYWxzZSwgdGhpcyk7Ci0gICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ETlMyKSwgZmFsc2UsIHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7Ci0gICAgICAgICAgICBzdXBlci5vbkNoYW5nZShzZWxmQ2hhbmdlKTsKLQotICAgICAgICAgICAgYm9vbGVhbiB3YXNTdGF0aWNJcCA9IG1Vc2VTdGF0aWNJcDsKLSAgICAgICAgICAgIGludCBvSXAsIG9Hdywgb01zaywgb0RuczEsIG9EbnMyOwotICAgICAgICAgICAgb0lwID0gb0d3ID0gb01zayA9IG9EbnMxID0gb0RuczIgPSAwOwotICAgICAgICAgICAgaWYgKHdhc1N0YXRpY0lwKSB7Ci0gICAgICAgICAgICAgICAgb0lwID0gbURoY3BJbmZvLmlwQWRkcmVzczsKLSAgICAgICAgICAgICAgICBvR3cgPSBtRGhjcEluZm8uZ2F0ZXdheTsKLSAgICAgICAgICAgICAgICBvTXNrID0gbURoY3BJbmZvLm5ldG1hc2s7Ci0gICAgICAgICAgICAgICAgb0RuczEgPSBtRGhjcEluZm8uZG5zMTsKLSAgICAgICAgICAgICAgICBvRG5zMiA9IG1EaGNwSW5mby5kbnMyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tVc2VTdGF0aWNJcCgpOwotCi0gICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpID09IFN1cHBsaWNhbnRTdGF0ZS5VTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29sZWFuIGNoYW5nZWQgPQotICAgICAgICAgICAgICAgICh3YXNTdGF0aWNJcCAhPSBtVXNlU3RhdGljSXApIHx8Ci0gICAgICAgICAgICAgICAgICAgICh3YXNTdGF0aWNJcCAmJiAoCi0gICAgICAgICAgICAgICAgICAgICAgICBvSXAgICAhPSBtRGhjcEluZm8uaXBBZGRyZXNzIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBvR3cgICAhPSBtRGhjcEluZm8uZ2F0ZXdheSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgb01zayAgIT0gbURoY3BJbmZvLm5ldG1hc2sgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9EbnMxICE9IG1EaGNwSW5mby5kbnMxIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBvRG5zMiAhPSBtRGhjcEluZm8uZG5zMikpOwotCi0gICAgICAgICAgICBpZiAoY2hhbmdlZCkgewotICAgICAgICAgICAgICAgIHJlc2V0Q29ubmVjdGlvbnModHJ1ZSk7Ci0gICAgICAgICAgICAgICAgY29uZmlndXJlSW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1Vc2VTdGF0aWNJcCkgewotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9DT05GSUdVUkFUSU9OX0NIQU5HRUQsIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBkZWZhdWx0IHJvdXRlIGlzIHNldAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJvdXRlU2V0KCkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRSb3V0ZVNldC5nZXQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGNsYXNzIE5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgeworICAgIC8qKgorICAgICAqIFNldCBhIGZsYWcgaW5kaWNhdGluZyBkZWZhdWx0IHJvdXRlIGlzIHNldCBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWZhdWx0Um91dGVTZXQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1EZWZhdWx0Um91dGVTZXQuc2V0KGVuYWJsZWQpOworICAgIH0KIAotICAgICAgICBwdWJsaWMgTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlcihIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgICAgIHN1cGVyKGhhbmRsZXIpOwotICAgICAgICB9CisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzeXN0ZW0gcHJvcGVydGllcyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGNwIGJ1ZmZlciBzaXplcworICAgICAqIGZvciB0aGlzIG5ldHdvcmsuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUY3BCdWZmZXJTaXplc1Byb3BOYW1lKCkgeworICAgICAgICByZXR1cm4gIm5ldC50Y3AuYnVmZmVyc2l6ZS53aWZpIjsKKyAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoKSB7Ci0gICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlNlY3VyZS5nZXRVcmlGb3IoCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTkVUV09SS1NfQVZBSUxBQkxFX05PVElGSUNBVElPTl9PTiksIHRydWUsIHRoaXMpOwotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkVuYWJsZWQgPSBnZXRWYWx1ZSgpOwotICAgICAgICB9Ci0KKyAgICBwcml2YXRlIGNsYXNzIFdpZmlTdGF0ZVJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7Ci0gICAgICAgICAgICBzdXBlci5vbkNoYW5nZShzZWxmQ2hhbmdlKTsKLQotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkVuYWJsZWQgPSBnZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKCFtTm90aWZpY2F0aW9uRW5hYmxlZCkgewotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgbm90aWZpY2F0aW9uIHRoYXQgbWF5IGJlIHNob3dpbmcKLSAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25WaXNpYmxlKGZhbHNlLCAwLCB0cnVlLCAwKTsKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mbyA9IChOZXR3b3JrSW5mbykgaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLkVYVFJBX05FVFdPUktfSU5GTyk7CisgICAgICAgICAgICAgICAgbUxpbmtQcm9wZXJ0aWVzID0gaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLkVYVFJBX0xJTktfUFJPUEVSVElFUyk7CisgICAgICAgICAgICAgICAgaWYgKG1MaW5rUHJvcGVydGllcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1MaW5rUHJvcGVydGllcyA9IG5ldyBMaW5rUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTGlua0NhcGFiaWxpdGllcyA9IGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5FWFRSQV9MSU5LX0NBUEFCSUxJVElFUyk7CisgICAgICAgICAgICAgICAgaWYgKG1MaW5rQ2FwYWJpbGl0aWVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxpbmtDYXBhYmlsaXRpZXMgPSBuZXcgTGlua0NhcGFiaWxpdGllcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1Dc0hhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9TVEFURV9DSEFOR0VELCBtTmV0d29ya0luZm8pOworICAgICAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhXaWZpTWFuYWdlci5DT05GSUdfQ0hBTkdFRF9BQ1RJT04pKSB7CisgICAgICAgICAgICAgICAgbUxpbmtQcm9wZXJ0aWVzID0gKExpbmtQcm9wZXJ0aWVzKSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVhUUkFfTElOS19QUk9QRVJUSUVTKTsKKyAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1Dc0hhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9DT05GSUdVUkFUSU9OX0NIQU5HRUQsIG1OZXR3b3JrSW5mbyk7CisgICAgICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXNldE5vdGlmaWNhdGlvblRpbWVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTkVUV09SS1NfQVZBSUxBQkxFX05PVElGSUNBVElPTl9PTiwgMSkgPT0gMTsKICAgICAgICAgfQogICAgIH0KKwogfQo=